ZGlmZiAtLWdpdCBhL0NPREVfT0ZfQ09ORFVDVC5tZCBiL0NPREVfT0ZfQ09ORFVDVC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThiYWEzCi0tLSAvZGV2L251bGwKKysrIGIvQ09ERV9PRl9DT05EVUNULm1kCkBAIC0wLDAgKzEsMTUgQEAKKyMgQ29tbXVuaXR5IFBhcnRpY2lwYXRpb24gR3VpZGVsaW5lcworCitUaGlzIHJlcG9zaXRvcnkgaXMgZ292ZXJuZWQgYnkgTW96aWxsYSdzIGNvZGUgb2YgY29uZHVjdCBhbmQgZXRpcXVldHRlIGd1aWRlbGluZXMuIAorRm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHJlYWQgdGhlCitbTW96aWxsYSBDb21tdW5pdHkgUGFydGljaXBhdGlvbiBHdWlkZWxpbmVzXShodHRwczovL3d3dy5tb3ppbGxhLm9yZy9hYm91dC9nb3Zlcm5hbmNlL3BvbGljaWVzL3BhcnRpY2lwYXRpb24vKS4gCisKKyMjIEhvdyB0byBSZXBvcnQKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byByZXBvcnQgdmlvbGF0aW9ucyBvZiB0aGUgQ29tbXVuaXR5IFBhcnRpY2lwYXRpb24gR3VpZGVsaW5lcywgcGxlYXNlIHJlYWQgb3VyICdbSG93IHRvIFJlcG9ydF0oaHR0cHM6Ly93d3cubW96aWxsYS5vcmcvYWJvdXQvZ292ZXJuYW5jZS9wb2xpY2llcy9wYXJ0aWNpcGF0aW9uL3JlcG9ydGluZy8pJyBwYWdlLgorCis8IS0tCisjIyBQcm9qZWN0IFNwZWNpZmljIEV0aXF1ZXR0ZQorCitJbiBzb21lIGNhc2VzLCB0aGVyZSB3aWxsIGJlIGFkZGl0aW9uYWwgcHJvamVjdCBldGlxdWV0dGUgaS5lLjogKGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvcGFnZS5jZ2k/aWQ9ZXRpcXVldHRlLmh0bWwpLgorUGxlYXNlIHVwZGF0ZSBmb3IgeW91ciBwcm9qZWN0LgorLS0+CmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDMzYjFhCi0tLSAvZGV2L251bGwKKysrIGIvTElDRU5TRQpAQCAtMCwwICsxLDE3NyBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjNjNmYwotLS0gL2Rldi9udWxsCisrKyBiL01FVEFEQVRBCkBAIC0wLDAgKzEsMTQgQEAKK25hbWU6ICJwZGZqcy1kaXN0IgorZGVzY3JpcHRpb246CisgICAgIlBERi5qcyBpcyBhIFBvcnRhYmxlIERvY3VtZW50IEZvcm1hdCAoUERGKSBsaWJyYXJ5IHRoYXQgaXMgYnVpbHQgd2l0aCBIVE1MNS4iCisKK3RoaXJkX3BhcnR5IHsKKyAgaWRlbnRpZmllciB7CisgICAgdHlwZTogIkdpdCIKKyAgICB2YWx1ZTogImh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3BkZmpzLWRpc3QiCisgICAgdmVyc2lvbjogIjIuNi4zNDciCisgIH0KKyAgbGFzdF91cGdyYWRlX2RhdGUgeyB5ZWFyOiAyMDIzIG1vbnRoOiAwOCBkYXk6IDI4IH0KKyAgbGljZW5zZV90eXBlOiBOT1RJQ0UKK30KKwpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzFlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubWQKQEAgLTAsMCArMSwxNCBAQAorIyBQREYuanMKKworUERGLmpzIGlzIGEgUG9ydGFibGUgRG9jdW1lbnQgRm9ybWF0IChQREYpIGxpYnJhcnkgdGhhdCBpcyBidWlsdCB3aXRoIEhUTUw1LgorT3VyIGdvYWwgaXMgdG8gY3JlYXRlIGEgZ2VuZXJhbC1wdXJwb3NlLCB3ZWIgc3RhbmRhcmRzLWJhc2VkIHBsYXRmb3JtIGZvcgorcGFyc2luZyBhbmQgcmVuZGVyaW5nIFBERnMuCisKK1RoaXMgaXMgYSBwcmUtYnVpbHQgdmVyc2lvbiBvZiB0aGUgUERGLmpzIHNvdXJjZSBjb2RlLiBJdCBpcyBhdXRvbWF0aWNhbGx5CitnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkIHNjcmlwdHMuCisKK0ZvciB1c2FnZSB3aXRoIG9sZGVyIGJyb3dzZXJzL2Vudmlyb25tZW50cywgd2l0aG91dCBzdXBwb3J0IGZvciBtb2Rlcm4gZmVhdHVyZXMKK3N1Y2ggYXMgZS5nLiBgYXN5bmNgL2Bhd2FpdGAsIGBQcm9taXNlYCwgYW5kIGBSZWFkYWJsZVN0cmVhbWAsCitwbGVhc2UgcmVmZXIgdG8gdGhlIGBlczVgIGZvbGRlci4KKworU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3BkZi5qcyBmb3IgbGVhcm5pbmcgYW5kIGNvbnRyaWJ1dGluZy4KZGlmZiAtLWdpdCBhL2Jvd2VyLmpzb24gYi9ib3dlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDUyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9ib3dlci5qc29uCkBAIC0wLDAgKzEsMTQgQEAKK3sKKyAgIm5hbWUiOiAicGRmanMtZGlzdCIsCisgICJ2ZXJzaW9uIjogIjIuNi4zNDciLAorICAibWFpbiI6IFsKKyAgICAiYnVpbGQvcGRmLmpzIiwKKyAgICAiYnVpbGQvcGRmLndvcmtlci5qcyIKKyAgXSwKKyAgImlnbm9yZSI6IFtdLAorICAia2V5d29yZHMiOiBbCisgICAgIk1vemlsbGEiLAorICAgICJwZGYiLAorICAgICJwZGYuanMiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9wZGYuanMgYi9idWlsZC9wZGYuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1OWU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3BkZi5qcwpAQCAtMCwwICsxLDE0MTQwIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisKKyhmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7CisJaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKQorCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKKwllbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkKKwkJZGVmaW5lKCJwZGZqcy1kaXN0L2J1aWxkL3BkZiIsIFtdLCBmYWN0b3J5KTsKKwllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKKwkJZXhwb3J0c1sicGRmanMtZGlzdC9idWlsZC9wZGYiXSA9IGZhY3RvcnkoKTsKKwllbHNlCisJCXJvb3RbInBkZmpzLWRpc3QvYnVpbGQvcGRmIl0gPSByb290LnBkZmpzTGliID0gZmFjdG9yeSgpOworfSkodGhpcywgZnVuY3Rpb24oKSB7CityZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcAorLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKKy8qKioqKiovIAl2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBUaGUgcmVxdWlyZSBmdW5jdGlvbgorLyoqKioqKi8gCWZ1bmN0aW9uIF9fd19wZGZqc19yZXF1aXJlX18obW9kdWxlSWQpIHsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQorLyoqKioqKi8gCQlpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkgeworLyoqKioqKi8gCQkJcmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7CisvKioqKioqLyAJCX0KKy8qKioqKiovIAkJLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSkKKy8qKioqKiovIAkJdmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0geworLyoqKioqKi8gCQkJaTogbW9kdWxlSWQsCisvKioqKioqLyAJCQlsOiBmYWxzZSwKKy8qKioqKiovIAkJCWV4cG9ydHM6IHt9CisvKioqKioqLyAJCX07CisvKioqKioqLworLyoqKioqKi8gCQkvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb24KKy8qKioqKiovIAkJbW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXyk7CisvKioqKioqLworLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCisvKioqKioqLyAJCW1vZHVsZS5sID0gdHJ1ZTsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCisvKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsKKy8qKioqKiovIAl9CisvKioqKioqLworLyoqKioqKi8KKy8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ubSA9IG1vZHVsZXM7CisvKioqKioqLworLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7CisvKioqKioqLyAJCWlmKCFfX3dfcGRmanNfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHsKKy8qKioqKiovIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pOworLyoqKioqKi8gCQl9CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0cworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHsKKy8qKioqKiovIAkJaWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7CisvKioqKioqLyAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTsKKy8qKioqKiovIAkJfQorLyoqKioqKi8gCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOworLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdAorLyoqKioqKi8gCS8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdAorLyoqKioqKi8gCS8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBucworLyoqKioqKi8gCS8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdAorLyoqKioqKi8gCS8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmUKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkgeworLyoqKioqKi8gCQlpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKHZhbHVlKTsKKy8qKioqKiovIAkJaWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTsKKy8qKioqKiovIAkJaWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTsKKy8qKioqKiovIAkJdmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKy8qKioqKiovIAkJX193X3BkZmpzX3JlcXVpcmVfXy5yKG5zKTsKKy8qKioqKiovIAkJT2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pOworLyoqKioqKi8gCQlpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dfcGRmanNfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7CisvKioqKioqLyAJCXJldHVybiBuczsKKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlcworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkgeworLyoqKioqKi8gCQl2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8KKy8qKioqKiovIAkJCWZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6CisvKioqKioqLyAJCQlmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9OworLyoqKioqKi8gCQlfX3dfcGRmanNfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7CisvKioqKioqLyAJCXJldHVybiBnZXR0ZXI7CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ucCA9ICIiOworLyoqKioqKi8KKy8qKioqKiovCisvKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCisvKioqKioqLyAJcmV0dXJuIF9fd19wZGZqc19yZXF1aXJlX18oX193X3BkZmpzX3JlcXVpcmVfXy5zID0gMCk7CisvKioqKioqLyB9KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiovIChbCisvKiAwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiYWRkTGlua0F0dHJpYnV0ZXMiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfZGlzcGxheV91dGlscy5hZGRMaW5rQXR0cmlidXRlczsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImdldEZpbGVuYW1lRnJvbVVybCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLmdldEZpbGVuYW1lRnJvbVVybDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkxpbmtUYXJnZXQiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfZGlzcGxheV91dGlscy5MaW5rVGFyZ2V0OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAibG9hZFNjcmlwdCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLmxvYWRTY3JpcHQ7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZEYXRlU3RyaW5nIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuUERGRGF0ZVN0cmluZzsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImJ1aWxkIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2FwaS5idWlsZDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImdldERvY3VtZW50IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2FwaS5nZXREb2N1bWVudDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkxvb3BiYWNrUG9ydCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9hcGkuTG9vcGJhY2tQb3J0OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGRGF0YVJhbmdlVHJhbnNwb3J0IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2FwaS5QREZEYXRhUmFuZ2VUcmFuc3BvcnQ7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZXb3JrZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfYXBpLlBERldvcmtlcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgInZlcnNpb24iLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfYXBpLnZlcnNpb247CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJDTWFwQ29tcHJlc3Npb25UeXBlIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuQ01hcENvbXByZXNzaW9uVHlwZTsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImNyZWF0ZU9iamVjdFVSTCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLmNyZWF0ZU9iamVjdFVSTDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImNyZWF0ZVByb21pc2VDYXBhYmlsaXR5IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHk7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJjcmVhdGVWYWxpZEFic29sdXRlVXJsIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkludmFsaWRQREZFeGNlcHRpb24iLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiTWlzc2luZ1BERkV4Y2VwdGlvbiIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb247CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJPUFMiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5PUFM7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQYXNzd29yZFJlc3BvbnNlcyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUGVybWlzc2lvbkZsYWciLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5QZXJtaXNzaW9uRmxhZzsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgInJlbW92ZU51bGxDaGFyYWN0ZXJzIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwucmVtb3ZlTnVsbENoYXJhY3RlcnM7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJzaGFkb3ciLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5zaGFkb3c7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb247CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJVTlNVUFBPUlRFRF9GRUFUVVJFUyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiVXRpbCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLlV0aWw7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJWZXJib3NpdHlMZXZlbCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLlZlcmJvc2l0eUxldmVsOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiQW5ub3RhdGlvbkxheWVyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2Fubm90YXRpb25fbGF5ZXIuQW5ub3RhdGlvbkxheWVyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiYXBpQ29tcGF0aWJpbGl0eVBhcmFtcyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9hcGlfY29tcGF0aWJpbGl0eS5hcGlDb21wYXRpYmlsaXR5UGFyYW1zOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiR2xvYmFsV29ya2VyT3B0aW9ucyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAicmVuZGVyVGV4dExheWVyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3RleHRfbGF5ZXIucmVuZGVyVGV4dExheWVyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiU1ZHR3JhcGhpY3MiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfc3ZnLlNWR0dyYXBoaWNzOworICB9Cit9KTsKKwordmFyIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTsKKwordmFyIF9hcGkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX2Fubm90YXRpb25fbGF5ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKKwordmFyIF9hcGlfY29tcGF0aWJpbGl0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oOSk7CisKK3ZhciBfd29ya2VyX29wdGlvbnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKKwordmFyIF90ZXh0X2xheWVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7CisKK3ZhciBfc3ZnID0gX193X3BkZmpzX3JlcXVpcmVfXygyMSk7CisKK2NvbnN0IHBkZmpzVmVyc2lvbiA9ICcyLjYuMzQ3JzsKK2NvbnN0IHBkZmpzQnVpbGQgPSAnM2JlOWM2NWYnOworeworICBjb25zdCB7CisgICAgaXNOb2RlSlMKKyAgfSA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CisKKyAgaWYgKGlzTm9kZUpTKSB7CisgICAgY29uc3QgUERGTm9kZVN0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpLlBERk5vZGVTdHJlYW07CisKKyAgICAoMCwgX2FwaS5zZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeSkocGFyYW1zID0+IHsKKyAgICAgIHJldHVybiBuZXcgUERGTm9kZVN0cmVhbShwYXJhbXMpOworICAgIH0pOworICB9IGVsc2UgeworICAgIGNvbnN0IFBERk5ldHdvcmtTdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI1KS5QREZOZXR3b3JrU3RyZWFtOworCisgICAgbGV0IFBERkZldGNoU3RyZWFtOworCisgICAgaWYgKCgwLCBfZGlzcGxheV91dGlscy5pc0ZldGNoU3VwcG9ydGVkKSgpKSB7CisgICAgICBQREZGZXRjaFN0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpLlBERkZldGNoU3RyZWFtOworICAgIH0KKworICAgICgwLCBfYXBpLnNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KShwYXJhbXMgPT4geworICAgICAgaWYgKFBERkZldGNoU3RyZWFtICYmICgwLCBfZGlzcGxheV91dGlscy5pc1ZhbGlkRmV0Y2hVcmwpKHBhcmFtcy51cmwpKSB7CisgICAgICAgIHJldHVybiBuZXcgUERGRmV0Y2hTdHJlYW0ocGFyYW1zKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBQREZOZXR3b3JrU3RyZWFtKHBhcmFtcyk7CisgICAgfSk7CisgIH0KK30KKworLyoqKi8gfSksCisvKiAxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuYWRkTGlua0F0dHJpYnV0ZXMgPSBhZGRMaW5rQXR0cmlidXRlczsKK2V4cG9ydHMuZ2V0RmlsZW5hbWVGcm9tVXJsID0gZ2V0RmlsZW5hbWVGcm9tVXJsOworZXhwb3J0cy5pc0ZldGNoU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZDsKK2V4cG9ydHMuaXNWYWxpZEZldGNoVXJsID0gaXNWYWxpZEZldGNoVXJsOworZXhwb3J0cy5sb2FkU2NyaXB0ID0gbG9hZFNjcmlwdDsKK2V4cG9ydHMuZGVwcmVjYXRlZCA9IGRlcHJlY2F0ZWQ7CitleHBvcnRzLlBERkRhdGVTdHJpbmcgPSBleHBvcnRzLlN0YXRUaW1lciA9IGV4cG9ydHMuRE9NU1ZHRmFjdG9yeSA9IGV4cG9ydHMuRE9NQ01hcFJlYWRlckZhY3RvcnkgPSBleHBvcnRzLkJhc2VDTWFwUmVhZGVyRmFjdG9yeSA9IGV4cG9ydHMuRE9NQ2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuQmFzZUNhbnZhc0ZhY3RvcnkgPSBleHBvcnRzLkRFRkFVTFRfTElOS19SRUwgPSBleHBvcnRzLkxpbmtUYXJnZXQgPSBleHBvcnRzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiA9IGV4cG9ydHMuUGFnZVZpZXdwb3J0ID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCitjb25zdCBERUZBVUxUX0xJTktfUkVMID0gIm5vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3ciOworZXhwb3J0cy5ERUZBVUxUX0xJTktfUkVMID0gREVGQVVMVF9MSU5LX1JFTDsKK2NvbnN0IFNWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CisKK2NsYXNzIEJhc2VDYW52YXNGYWN0b3J5IHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDYW52YXNGYWN0b3J5KSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ2FudmFzRmFjdG9yeS4iKTsKKyAgICB9CisgIH0KKworICBjcmVhdGUod2lkdGgsIGhlaWdodCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlYCBjYWxsZWQuIik7CisgIH0KKworICByZXNldChjYW52YXNBbmRDb250ZXh0LCB3aWR0aCwgaGVpZ2h0KSB7CisgICAgaWYgKCFjYW52YXNBbmRDb250ZXh0LmNhbnZhcykgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW52YXMgaXMgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FudmFzIHNpemUiKTsKKyAgICB9CisKKyAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoOworICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IGhlaWdodDsKKyAgfQorCisgIGRlc3Ryb3koY2FudmFzQW5kQ29udGV4dCkgeworICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy53aWR0aCA9IDA7CisgICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gMDsKKyAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcyA9IG51bGw7CisgICAgY2FudmFzQW5kQ29udGV4dC5jb250ZXh0ID0gbnVsbDsKKyAgfQorCit9CisKK2V4cG9ydHMuQmFzZUNhbnZhc0ZhY3RvcnkgPSBCYXNlQ2FudmFzRmFjdG9yeTsKKworY2xhc3MgRE9NQ2FudmFzRmFjdG9yeSBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHsKKyAgY29uc3RydWN0b3IoeworICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50CisgIH0gPSB7fSkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50OworICB9CisKKyAgY3JlYXRlKHdpZHRoLCBoZWlnaHQpIHsKKyAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIik7CisgICAgfQorCisgICAgY29uc3QgY2FudmFzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CisKKyAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CisgICAgY2FudmFzLndpZHRoID0gd2lkdGg7CisgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4geworICAgICAgY2FudmFzLAorICAgICAgY29udGV4dAorICAgIH07CisgIH0KKworfQorCitleHBvcnRzLkRPTUNhbnZhc0ZhY3RvcnkgPSBET01DYW52YXNGYWN0b3J5OworCitjbGFzcyBCYXNlQ01hcFJlYWRlckZhY3RvcnkgeworICBjb25zdHJ1Y3Rvcih7CisgICAgYmFzZVVybCA9IG51bGwsCisgICAgaXNDb21wcmVzc2VkID0gZmFsc2UKKyAgfSkgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ01hcFJlYWRlckZhY3RvcnkpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS4iKTsKKyAgICB9CisKKyAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsOworICAgIHRoaXMuaXNDb21wcmVzc2VkID0gaXNDb21wcmVzc2VkOworICB9CisKKyAgYXN5bmMgZmV0Y2goeworICAgIG5hbWUKKyAgfSkgeworICAgIGlmICghdGhpcy5iYXNlVXJsKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwICJiYXNlVXJsIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgKyAndGhlICJjTWFwVXJsIiBhbmQgImNNYXBQYWNrZWQiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nKTsKKyAgICB9CisKKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQ01hcCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLiIpOworICAgIH0KKworICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybCArIG5hbWUgKyAodGhpcy5pc0NvbXByZXNzZWQgPyAiLmJjbWFwIiA6ICIiKTsKKyAgICBjb25zdCBjb21wcmVzc2lvblR5cGUgPSB0aGlzLmlzQ29tcHJlc3NlZCA/IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZIDogX3V0aWwuQ01hcENvbXByZXNzaW9uVHlwZS5OT05FOworICAgIHJldHVybiB0aGlzLl9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkICR7dGhpcy5pc0NvbXByZXNzZWQgPyAiYmluYXJ5ICIgOiAiIn1DTWFwIGF0OiAke3VybH1gKTsKKyAgICB9KTsKKyAgfQorCisgIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC4iKTsKKyAgfQorCit9CisKK2V4cG9ydHMuQmFzZUNNYXBSZWFkZXJGYWN0b3J5ID0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5OworCitjbGFzcyBET01DTWFwUmVhZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7CisgIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHsKKyAgICBpZiAoaXNGZXRjaFN1cHBvcnRlZCgpICYmIGlzVmFsaWRGZXRjaFVybCh1cmwsIGRvY3VtZW50LmJhc2VVUkkpKSB7CisgICAgICByZXR1cm4gZmV0Y2godXJsKS50aGVuKGFzeW5jIHJlc3BvbnNlID0+IHsKKyAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBjTWFwRGF0YTsKKworICAgICAgICBpZiAodGhpcy5pc0NvbXByZXNzZWQpIHsKKyAgICAgICAgICBjTWFwRGF0YSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNNYXBEYXRhID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgIGNNYXBEYXRhLAorICAgICAgICAgIGNvbXByZXNzaW9uVHlwZQorICAgICAgICB9OworICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKKyAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgICAgIHJlcXVlc3Qub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKKworICAgICAgaWYgKHRoaXMuaXNDb21wcmVzc2VkKSB7CisgICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gImFycmF5YnVmZmVyIjsKKyAgICAgIH0KKworICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7CisgICAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCB8fCByZXF1ZXN0LnN0YXR1cyA9PT0gMCkgeworICAgICAgICAgIGxldCBjTWFwRGF0YTsKKworICAgICAgICAgIGlmICh0aGlzLmlzQ29tcHJlc3NlZCAmJiByZXF1ZXN0LnJlc3BvbnNlKSB7CisgICAgICAgICAgICBjTWFwRGF0YSA9IG5ldyBVaW50OEFycmF5KHJlcXVlc3QucmVzcG9uc2UpOworICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNDb21wcmVzc2VkICYmIHJlcXVlc3QucmVzcG9uc2VUZXh0KSB7CisgICAgICAgICAgICBjTWFwRGF0YSA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGNNYXBEYXRhKSB7CisgICAgICAgICAgICByZXNvbHZlKHsKKyAgICAgICAgICAgICAgY01hcERhdGEsCisgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXF1ZXN0LnN0YXR1c1RleHQpKTsKKyAgICAgIH07CisKKyAgICAgIHJlcXVlc3Quc2VuZChudWxsKTsKKyAgICB9KTsKKyAgfQorCit9CisKK2V4cG9ydHMuRE9NQ01hcFJlYWRlckZhY3RvcnkgPSBET01DTWFwUmVhZGVyRmFjdG9yeTsKKworY2xhc3MgRE9NU1ZHRmFjdG9yeSB7CisgIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7CisgICAgKDAsIF91dGlsLmFzc2VydCkod2lkdGggPiAwICYmIGhlaWdodCA+IDAsICJJbnZhbGlkIFNWRyBkaW1lbnNpb25zIik7CisgICAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgInN2ZzpzdmciKTsKKyAgICBzdmcuc2V0QXR0cmlidXRlKCJ2ZXJzaW9uIiwgIjEuMSIpOworICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGggKyAicHgiKTsKKyAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoZWlnaHQgKyAicHgiKTsKKyAgICBzdmcuc2V0QXR0cmlidXRlKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwgIm5vbmUiKTsKKyAgICBzdmcuc2V0QXR0cmlidXRlKCJ2aWV3Qm94IiwgIjAgMCAiICsgd2lkdGggKyAiICIgKyBoZWlnaHQpOworICAgIHJldHVybiBzdmc7CisgIH0KKworICBjcmVhdGVFbGVtZW50KHR5cGUpIHsKKyAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0eXBlb2YgdHlwZSA9PT0gInN0cmluZyIsICJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGUiKTsKKyAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgdHlwZSk7CisgIH0KKworfQorCitleHBvcnRzLkRPTVNWR0ZhY3RvcnkgPSBET01TVkdGYWN0b3J5OworCitjbGFzcyBQYWdlVmlld3BvcnQgeworICBjb25zdHJ1Y3Rvcih7CisgICAgdmlld0JveCwKKyAgICBzY2FsZSwKKyAgICByb3RhdGlvbiwKKyAgICBvZmZzZXRYID0gMCwKKyAgICBvZmZzZXRZID0gMCwKKyAgICBkb250RmxpcCA9IGZhbHNlCisgIH0pIHsKKyAgICB0aGlzLnZpZXdCb3ggPSB2aWV3Qm94OworICAgIHRoaXMuc2NhbGUgPSBzY2FsZTsKKyAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247CisgICAgdGhpcy5vZmZzZXRYID0gb2Zmc2V0WDsKKyAgICB0aGlzLm9mZnNldFkgPSBvZmZzZXRZOworICAgIGNvbnN0IGNlbnRlclggPSAodmlld0JveFsyXSArIHZpZXdCb3hbMF0pIC8gMjsKKyAgICBjb25zdCBjZW50ZXJZID0gKHZpZXdCb3hbM10gKyB2aWV3Qm94WzFdKSAvIDI7CisgICAgbGV0IHJvdGF0ZUEsIHJvdGF0ZUIsIHJvdGF0ZUMsIHJvdGF0ZUQ7CisgICAgcm90YXRpb24gPSByb3RhdGlvbiAlIDM2MDsKKyAgICByb3RhdGlvbiA9IHJvdGF0aW9uIDwgMCA/IHJvdGF0aW9uICsgMzYwIDogcm90YXRpb247CisKKyAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CisgICAgICBjYXNlIDE4MDoKKyAgICAgICAgcm90YXRlQSA9IC0xOworICAgICAgICByb3RhdGVCID0gMDsKKyAgICAgICAgcm90YXRlQyA9IDA7CisgICAgICAgIHJvdGF0ZUQgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA5MDoKKyAgICAgICAgcm90YXRlQSA9IDA7CisgICAgICAgIHJvdGF0ZUIgPSAxOworICAgICAgICByb3RhdGVDID0gMTsKKyAgICAgICAgcm90YXRlRCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI3MDoKKyAgICAgICAgcm90YXRlQSA9IDA7CisgICAgICAgIHJvdGF0ZUIgPSAtMTsKKyAgICAgICAgcm90YXRlQyA9IC0xOworICAgICAgICByb3RhdGVEID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcm90YXRlQSA9IDE7CisgICAgICAgIHJvdGF0ZUIgPSAwOworICAgICAgICByb3RhdGVDID0gMDsKKyAgICAgICAgcm90YXRlRCA9IC0xOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLiIpOworICAgIH0KKworICAgIGlmIChkb250RmxpcCkgeworICAgICAgcm90YXRlQyA9IC1yb3RhdGVDOworICAgICAgcm90YXRlRCA9IC1yb3RhdGVEOworICAgIH0KKworICAgIGxldCBvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZOworICAgIGxldCB3aWR0aCwgaGVpZ2h0OworCisgICAgaWYgKHJvdGF0ZUEgPT09IDApIHsKKyAgICAgIG9mZnNldENhbnZhc1ggPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFg7CisgICAgICBvZmZzZXRDYW52YXNZID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRZOworICAgICAgd2lkdGggPSBNYXRoLmFicyh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTsKKyAgICAgIGhlaWdodCA9IE1hdGguYWJzKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlOworICAgIH0gZWxzZSB7CisgICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRYOworICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclkgLSB2aWV3Qm94WzFdKSAqIHNjYWxlICsgb2Zmc2V0WTsKKyAgICAgIHdpZHRoID0gTWF0aC5hYnModmlld0JveFsyXSAtIHZpZXdCb3hbMF0pICogc2NhbGU7CisgICAgICBoZWlnaHQgPSBNYXRoLmFicyh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTsKKyAgICB9CisKKyAgICB0aGlzLnRyYW5zZm9ybSA9IFtyb3RhdGVBICogc2NhbGUsIHJvdGF0ZUIgKiBzY2FsZSwgcm90YXRlQyAqIHNjYWxlLCByb3RhdGVEICogc2NhbGUsIG9mZnNldENhbnZhc1ggLSByb3RhdGVBICogc2NhbGUgKiBjZW50ZXJYIC0gcm90YXRlQyAqIHNjYWxlICogY2VudGVyWSwgb2Zmc2V0Q2FudmFzWSAtIHJvdGF0ZUIgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVEICogc2NhbGUgKiBjZW50ZXJZXTsKKyAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgIH0KKworICBjbG9uZSh7CisgICAgc2NhbGUgPSB0aGlzLnNjYWxlLAorICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbiwKKyAgICBvZmZzZXRYID0gdGhpcy5vZmZzZXRYLAorICAgIG9mZnNldFkgPSB0aGlzLm9mZnNldFksCisgICAgZG9udEZsaXAgPSBmYWxzZQorICB9ID0ge30pIHsKKyAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7CisgICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSwKKyAgICAgIHNjYWxlLAorICAgICAgcm90YXRpb24sCisgICAgICBvZmZzZXRYLAorICAgICAgb2Zmc2V0WSwKKyAgICAgIGRvbnRGbGlwCisgICAgfSk7CisgIH0KKworICBjb252ZXJ0VG9WaWV3cG9ydFBvaW50KHgsIHkpIHsKKyAgICByZXR1cm4gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTsKKyAgfQorCisgIGNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlKHJlY3QpIHsKKyAgICBjb25zdCB0b3BMZWZ0ID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFswXSwgcmVjdFsxXV0sIHRoaXMudHJhbnNmb3JtKTsKKworICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFsyXSwgcmVjdFszXV0sIHRoaXMudHJhbnNmb3JtKTsKKworICAgIHJldHVybiBbdG9wTGVmdFswXSwgdG9wTGVmdFsxXSwgYm90dG9tUmlnaHRbMF0sIGJvdHRvbVJpZ2h0WzFdXTsKKyAgfQorCisgIGNvbnZlcnRUb1BkZlBvaW50KHgsIHkpIHsKKyAgICByZXR1cm4gX3V0aWwuVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7CisgIH0KKworfQorCitleHBvcnRzLlBhZ2VWaWV3cG9ydCA9IFBhZ2VWaWV3cG9ydDsKKworY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7CisgIGNvbnN0cnVjdG9yKG1zZywgdHlwZSkgeworICAgIHN1cGVyKG1zZyk7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCit9CisKK2V4cG9ydHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uOworY29uc3QgTGlua1RhcmdldCA9IHsKKyAgTk9ORTogMCwKKyAgU0VMRjogMSwKKyAgQkxBTks6IDIsCisgIFBBUkVOVDogMywKKyAgVE9QOiA0Cit9OworZXhwb3J0cy5MaW5rVGFyZ2V0ID0gTGlua1RhcmdldDsKKworZnVuY3Rpb24gYWRkTGlua0F0dHJpYnV0ZXMobGluaywgeworICB1cmwsCisgIHRhcmdldCwKKyAgcmVsLAorICBlbmFibGVkID0gdHJ1ZQorfSA9IHt9KSB7CisgICgwLCBfdXRpbC5hc3NlcnQpKHVybCAmJiB0eXBlb2YgdXJsID09PSAic3RyaW5nIiwgJ2FkZExpbmtBdHRyaWJ1dGVzOiBBIHZhbGlkICJ1cmwiIHBhcmFtZXRlciBtdXN0IHByb3ZpZGVkLicpOworICBjb25zdCB1cmxOdWxsUmVtb3ZlZCA9ICgwLCBfdXRpbC5yZW1vdmVOdWxsQ2hhcmFjdGVycykodXJsKTsKKworICBpZiAoZW5hYmxlZCkgeworICAgIGxpbmsuaHJlZiA9IGxpbmsudGl0bGUgPSB1cmxOdWxsUmVtb3ZlZDsKKyAgfSBlbHNlIHsKKyAgICBsaW5rLmhyZWYgPSAiIjsKKyAgICBsaW5rLnRpdGxlID0gYERpc2FibGVkOiAke3VybE51bGxSZW1vdmVkfWA7CisKKyAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyAgfQorCisgIGxldCB0YXJnZXRTdHIgPSAiIjsKKworICBzd2l0Y2ggKHRhcmdldCkgeworICAgIGNhc2UgTGlua1RhcmdldC5OT05FOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExpbmtUYXJnZXQuU0VMRjoKKyAgICAgIHRhcmdldFN0ciA9ICJfc2VsZiI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTGlua1RhcmdldC5CTEFOSzoKKyAgICAgIHRhcmdldFN0ciA9ICJfYmxhbmsiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExpbmtUYXJnZXQuUEFSRU5UOgorICAgICAgdGFyZ2V0U3RyID0gIl9wYXJlbnQiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExpbmtUYXJnZXQuVE9QOgorICAgICAgdGFyZ2V0U3RyID0gIl90b3AiOworICAgICAgYnJlYWs7CisgIH0KKworICBsaW5rLnRhcmdldCA9IHRhcmdldFN0cjsKKyAgbGluay5yZWwgPSB0eXBlb2YgcmVsID09PSAic3RyaW5nIiA/IHJlbCA6IERFRkFVTFRfTElOS19SRUw7Cit9CisKK2Z1bmN0aW9uIGdldEZpbGVuYW1lRnJvbVVybCh1cmwpIHsKKyAgY29uc3QgYW5jaG9yID0gdXJsLmluZGV4T2YoIiMiKTsKKyAgY29uc3QgcXVlcnkgPSB1cmwuaW5kZXhPZigiPyIpOworICBjb25zdCBlbmQgPSBNYXRoLm1pbihhbmNob3IgPiAwID8gYW5jaG9yIDogdXJsLmxlbmd0aCwgcXVlcnkgPiAwID8gcXVlcnkgOiB1cmwubGVuZ3RoKTsKKyAgcmV0dXJuIHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCIvIiwgZW5kKSArIDEsIGVuZCk7Cit9CisKK2NsYXNzIFN0YXRUaW1lciB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuc3RhcnRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy50aW1lcyA9IFtdOworICB9CisKKyAgdGltZShuYW1lKSB7CisgICAgaWYgKG5hbWUgaW4gdGhpcy5zdGFydGVkKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoYFRpbWVyIGlzIGFscmVhZHkgcnVubmluZyBmb3IgJHtuYW1lfWApOworICAgIH0KKworICAgIHRoaXMuc3RhcnRlZFtuYW1lXSA9IERhdGUubm93KCk7CisgIH0KKworICB0aW1lRW5kKG5hbWUpIHsKKyAgICBpZiAoIShuYW1lIGluIHRoaXMuc3RhcnRlZCkpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKShgVGltZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZm9yICR7bmFtZX1gKTsKKyAgICB9CisKKyAgICB0aGlzLnRpbWVzLnB1c2goeworICAgICAgbmFtZSwKKyAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbbmFtZV0sCisgICAgICBlbmQ6IERhdGUubm93KCkKKyAgICB9KTsKKyAgICBkZWxldGUgdGhpcy5zdGFydGVkW25hbWVdOworICB9CisKKyAgdG9TdHJpbmcoKSB7CisgICAgY29uc3Qgb3V0QnVmID0gW107CisgICAgbGV0IGxvbmdlc3QgPSAwOworCisgICAgZm9yIChjb25zdCB0aW1lIG9mIHRoaXMudGltZXMpIHsKKyAgICAgIGNvbnN0IG5hbWUgPSB0aW1lLm5hbWU7CisKKyAgICAgIGlmIChuYW1lLmxlbmd0aCA+IGxvbmdlc3QpIHsKKyAgICAgICAgbG9uZ2VzdCA9IG5hbWUubGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgdGltZSBvZiB0aGlzLnRpbWVzKSB7CisgICAgICBjb25zdCBkdXJhdGlvbiA9IHRpbWUuZW5kIC0gdGltZS5zdGFydDsKKyAgICAgIG91dEJ1Zi5wdXNoKGAke3RpbWUubmFtZS5wYWRFbmQobG9uZ2VzdCl9ICR7ZHVyYXRpb259bXNcbmApOworICAgIH0KKworICAgIHJldHVybiBvdXRCdWYuam9pbigiIik7CisgIH0KKworfQorCitleHBvcnRzLlN0YXRUaW1lciA9IFN0YXRUaW1lcjsKKworZnVuY3Rpb24gaXNGZXRjaFN1cHBvcnRlZCgpIHsKKyAgcmV0dXJuIHR5cGVvZiBmZXRjaCAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIFJlc3BvbnNlICE9PSAidW5kZWZpbmVkIiAmJiAiYm9keSIgaW4gUmVzcG9uc2UucHJvdG90eXBlICYmIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPT0gInVuZGVmaW5lZCI7Cit9CisKK2Z1bmN0aW9uIGlzVmFsaWRGZXRjaFVybCh1cmwsIGJhc2VVcmwpIHsKKyAgdHJ5IHsKKyAgICBjb25zdCB7CisgICAgICBwcm90b2NvbAorICAgIH0gPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpOworICAgIHJldHVybiBwcm90b2NvbCA9PT0gImh0dHA6IiB8fCBwcm90b2NvbCA9PT0gImh0dHBzOiI7CisgIH0gY2F0Y2ggKGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Z1bmN0aW9uIGxvYWRTY3JpcHQoc3JjKSB7CisgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CisgICAgc2NyaXB0LnNyYyA9IHNyYzsKKyAgICBzY3JpcHQub25sb2FkID0gcmVzb2x2ZTsKKworICAgIHNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkgeworICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGxvYWQgc2NyaXB0IGF0OiAke3NjcmlwdC5zcmN9YCkpOworICAgIH07CisKKyAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHNjcmlwdCk7CisgIH0pOworfQorCitmdW5jdGlvbiBkZXByZWNhdGVkKGRldGFpbHMpIHsKKyAgY29uc29sZS5sb2coIkRlcHJlY2F0ZWQgQVBJIHVzYWdlOiAiICsgZGV0YWlscyk7Cit9CisKK2xldCBwZGZEYXRlU3RyaW5nUmVnZXg7CisKK2NsYXNzIFBERkRhdGVTdHJpbmcgeworICBzdGF0aWMgdG9EYXRlT2JqZWN0KGlucHV0KSB7CisgICAgaWYgKCFpbnB1dCB8fCAhKDAsIF91dGlsLmlzU3RyaW5nKShpbnB1dCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGlmICghcGRmRGF0ZVN0cmluZ1JlZ2V4KSB7CisgICAgICBwZGZEYXRlU3RyaW5nUmVnZXggPSBuZXcgUmVnRXhwKCJeRDoiICsgIihcXGR7NH0pIiArICIoXFxkezJ9KT8iICsgIihcXGR7Mn0pPyIgKyAiKFxcZHsyfSk/IiArICIoXFxkezJ9KT8iICsgIihcXGR7Mn0pPyIgKyAiKFtafCt8LV0pPyIgKyAiKFxcZHsyfSk/IiArICInPyIgKyAiKFxcZHsyfSk/IiArICInPyIpOworICAgIH0KKworICAgIGNvbnN0IG1hdGNoZXMgPSBwZGZEYXRlU3RyaW5nUmVnZXguZXhlYyhpbnB1dCk7CisKKyAgICBpZiAoIW1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7CisgICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApOworICAgIG1vbnRoID0gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiA/IG1vbnRoIC0gMSA6IDA7CisgICAgbGV0IGRheSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDEwKTsKKyAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxOworICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApOworICAgIGhvdXIgPSBob3VyID49IDAgJiYgaG91ciA8PSAyMyA/IGhvdXIgOiAwOworICAgIGxldCBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7CisgICAgbWludXRlID0gbWludXRlID49IDAgJiYgbWludXRlIDw9IDU5ID8gbWludXRlIDogMDsKKyAgICBsZXQgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hlc1s2XSwgMTApOworICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7CisgICAgY29uc3QgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCAiWiI7CisgICAgbGV0IG9mZnNldEhvdXIgPSBwYXJzZUludChtYXRjaGVzWzhdLCAxMCk7CisgICAgb2Zmc2V0SG91ciA9IG9mZnNldEhvdXIgPj0gMCAmJiBvZmZzZXRIb3VyIDw9IDIzID8gb2Zmc2V0SG91ciA6IDA7CisgICAgbGV0IG9mZnNldE1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbOV0sIDEwKSB8fCAwOworICAgIG9mZnNldE1pbnV0ZSA9IG9mZnNldE1pbnV0ZSA+PSAwICYmIG9mZnNldE1pbnV0ZSA8PSA1OSA/IG9mZnNldE1pbnV0ZSA6IDA7CisKKyAgICBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSAiLSIpIHsKKyAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjsKKyAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7CisgICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09ICIrIikgeworICAgICAgaG91ciAtPSBvZmZzZXRIb3VyOworICAgICAgbWludXRlIC09IG9mZnNldE1pbnV0ZTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGRGF0ZVN0cmluZyA9IFBERkRhdGVTdHJpbmc7CisKKy8qKiovIH0pLAorLyogMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmFycmF5Qnl0ZUxlbmd0aCA9IGFycmF5Qnl0ZUxlbmd0aDsKK2V4cG9ydHMuYXJyYXlzVG9CeXRlcyA9IGFycmF5c1RvQnl0ZXM7CitleHBvcnRzLmFzc2VydCA9IGFzc2VydDsKK2V4cG9ydHMuYnl0ZXNUb1N0cmluZyA9IGJ5dGVzVG9TdHJpbmc7CitleHBvcnRzLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHk7CitleHBvcnRzLmVzY2FwZVN0cmluZyA9IGVzY2FwZVN0cmluZzsKK2V4cG9ydHMuZ2V0TW9kaWZpY2F0aW9uRGF0ZSA9IGdldE1vZGlmaWNhdGlvbkRhdGU7CitleHBvcnRzLmdldFZlcmJvc2l0eUxldmVsID0gZ2V0VmVyYm9zaXR5TGV2ZWw7CitleHBvcnRzLmluZm8gPSBpbmZvOworZXhwb3J0cy5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjsKK2V4cG9ydHMuaXNBcnJheUVxdWFsID0gaXNBcnJheUVxdWFsOworZXhwb3J0cy5pc0Jvb2wgPSBpc0Jvb2w7CitleHBvcnRzLmlzTnVtID0gaXNOdW07CitleHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7CitleHBvcnRzLmlzU2FtZU9yaWdpbiA9IGlzU2FtZU9yaWdpbjsKK2V4cG9ydHMuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCA9IGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw7CitleHBvcnRzLnJlbW92ZU51bGxDaGFyYWN0ZXJzID0gcmVtb3ZlTnVsbENoYXJhY3RlcnM7CitleHBvcnRzLnNldFZlcmJvc2l0eUxldmVsID0gc2V0VmVyYm9zaXR5TGV2ZWw7CitleHBvcnRzLnNoYWRvdyA9IHNoYWRvdzsKK2V4cG9ydHMuc3RyaW5nMzIgPSBzdHJpbmczMjsKK2V4cG9ydHMuc3RyaW5nVG9CeXRlcyA9IHN0cmluZ1RvQnl0ZXM7CitleHBvcnRzLnN0cmluZ1RvUERGU3RyaW5nID0gc3RyaW5nVG9QREZTdHJpbmc7CitleHBvcnRzLnN0cmluZ1RvVVRGOFN0cmluZyA9IHN0cmluZ1RvVVRGOFN0cmluZzsKK2V4cG9ydHMudXRmOFN0cmluZ1RvU3RyaW5nID0gdXRmOFN0cmluZ1RvU3RyaW5nOworZXhwb3J0cy53YXJuID0gd2FybjsKK2V4cG9ydHMudW5yZWFjaGFibGUgPSB1bnJlYWNoYWJsZTsKK2V4cG9ydHMuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkID0gZXhwb3J0cy5Jc0xpdHRsZUVuZGlhbkNhY2hlZCA9IGV4cG9ydHMuY3JlYXRlT2JqZWN0VVJMID0gZXhwb3J0cy5Gb3JtYXRFcnJvciA9IGV4cG9ydHMuVXRpbCA9IGV4cG9ydHMuVW5rbm93bkVycm9yRXhjZXB0aW9uID0gZXhwb3J0cy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gZXhwb3J0cy5TdHJlYW1UeXBlID0gZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IGV4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBleHBvcnRzLlBhc3N3b3JkRXhjZXB0aW9uID0gZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gZXhwb3J0cy5JbnZhbGlkUERGRXhjZXB0aW9uID0gZXhwb3J0cy5BYm9ydEV4Y2VwdGlvbiA9IGV4cG9ydHMuQ01hcENvbXByZXNzaW9uVHlwZSA9IGV4cG9ydHMuSW1hZ2VLaW5kID0gZXhwb3J0cy5Gb250VHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblR5cGUgPSBleHBvcnRzLkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblJldmlld1N0YXRlID0gZXhwb3J0cy5Bbm5vdGF0aW9uUmVwbHlUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBleHBvcnRzLkFubm90YXRpb25GbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmllbGRGbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gZXhwb3J0cy5VTlNVUFBPUlRFRF9GRUFUVVJFUyA9IGV4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBleHBvcnRzLk9QUyA9IGV4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gZXhwb3J0cy5GT05UX0lERU5USVRZX01BVFJJWCA9IGV4cG9ydHMuQmFzZUV4Y2VwdGlvbiA9IHZvaWQgMDsKKworX193X3BkZmpzX3JlcXVpcmVfXygzKTsKKworY29uc3QgSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdOworZXhwb3J0cy5JREVOVElUWV9NQVRSSVggPSBJREVOVElUWV9NQVRSSVg7Citjb25zdCBGT05UX0lERU5USVRZX01BVFJJWCA9IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdOworZXhwb3J0cy5GT05UX0lERU5USVRZX01BVFJJWCA9IEZPTlRfSURFTlRJVFlfTUFUUklYOworY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7CisgIFBSSU5UOiAweDA0LAorICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsCisgIENPUFk6IDB4MTAsCisgIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCwKKyAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsCisgIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLAorICBBU1NFTUJMRTogMHg0MDAsCisgIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAKK307CitleHBvcnRzLlBlcm1pc3Npb25GbGFnID0gUGVybWlzc2lvbkZsYWc7Citjb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHsKKyAgRklMTDogMCwKKyAgU1RST0tFOiAxLAorICBGSUxMX1NUUk9LRTogMiwKKyAgSU5WSVNJQkxFOiAzLAorICBGSUxMX0FERF9UT19QQVRIOiA0LAorICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsCisgIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LAorICBBRERfVE9fUEFUSDogNywKKyAgRklMTF9TVFJPS0VfTUFTSzogMywKKyAgQUREX1RPX1BBVEhfRkxBRzogNAorfTsKK2V4cG9ydHMuVGV4dFJlbmRlcmluZ01vZGUgPSBUZXh0UmVuZGVyaW5nTW9kZTsKK2NvbnN0IEltYWdlS2luZCA9IHsKKyAgR1JBWVNDQUxFXzFCUFA6IDEsCisgIFJHQl8yNEJQUDogMiwKKyAgUkdCQV8zMkJQUDogMworfTsKK2V4cG9ydHMuSW1hZ2VLaW5kID0gSW1hZ2VLaW5kOworY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7CisgIFRFWFQ6IDEsCisgIExJTks6IDIsCisgIEZSRUVURVhUOiAzLAorICBMSU5FOiA0LAorICBTUVVBUkU6IDUsCisgIENJUkNMRTogNiwKKyAgUE9MWUdPTjogNywKKyAgUE9MWUxJTkU6IDgsCisgIEhJR0hMSUdIVDogOSwKKyAgVU5ERVJMSU5FOiAxMCwKKyAgU1FVSUdHTFk6IDExLAorICBTVFJJS0VPVVQ6IDEyLAorICBTVEFNUDogMTMsCisgIENBUkVUOiAxNCwKKyAgSU5LOiAxNSwKKyAgUE9QVVA6IDE2LAorICBGSUxFQVRUQUNITUVOVDogMTcsCisgIFNPVU5EOiAxOCwKKyAgTU9WSUU6IDE5LAorICBXSURHRVQ6IDIwLAorICBTQ1JFRU46IDIxLAorICBQUklOVEVSTUFSSzogMjIsCisgIFRSQVBORVQ6IDIzLAorICBXQVRFUk1BUks6IDI0LAorICBUSFJFRUQ6IDI1LAorICBSRURBQ1Q6IDI2Cit9OworZXhwb3J0cy5Bbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlOworY29uc3QgQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0geworICBNQVJLRUQ6ICJNYXJrZWQiLAorICBSRVZJRVc6ICJSZXZpZXciCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGU7Citjb25zdCBBbm5vdGF0aW9uTWFya2VkU3RhdGUgPSB7CisgIE1BUktFRDogIk1hcmtlZCIsCisgIFVOTUFSS0VEOiAiVW5tYXJrZWQiCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBBbm5vdGF0aW9uTWFya2VkU3RhdGU7Citjb25zdCBBbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSB7CisgIEFDQ0VQVEVEOiAiQWNjZXB0ZWQiLAorICBSRUpFQ1RFRDogIlJlamVjdGVkIiwKKyAgQ0FOQ0VMTEVEOiAiQ2FuY2VsbGVkIiwKKyAgQ09NUExFVEVEOiAiQ29tcGxldGVkIiwKKyAgTk9ORTogIk5vbmUiCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSBBbm5vdGF0aW9uUmV2aWV3U3RhdGU7Citjb25zdCBBbm5vdGF0aW9uUmVwbHlUeXBlID0geworICBHUk9VUDogIkdyb3VwIiwKKyAgUkVQTFk6ICJSIgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblJlcGx5VHlwZSA9IEFubm90YXRpb25SZXBseVR5cGU7Citjb25zdCBBbm5vdGF0aW9uRmxhZyA9IHsKKyAgSU5WSVNJQkxFOiAweDAxLAorICBISURERU46IDB4MDIsCisgIFBSSU5UOiAweDA0LAorICBOT1pPT006IDB4MDgsCisgIE5PUk9UQVRFOiAweDEwLAorICBOT1ZJRVc6IDB4MjAsCisgIFJFQURPTkxZOiAweDQwLAorICBMT0NLRUQ6IDB4ODAsCisgIFRPR0dMRU5PVklFVzogMHgxMDAsCisgIExPQ0tFRENPTlRFTlRTOiAweDIwMAorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkZsYWcgPSBBbm5vdGF0aW9uRmxhZzsKK2NvbnN0IEFubm90YXRpb25GaWVsZEZsYWcgPSB7CisgIFJFQURPTkxZOiAweDAwMDAwMDEsCisgIFJFUVVJUkVEOiAweDAwMDAwMDIsCisgIE5PRVhQT1JUOiAweDAwMDAwMDQsCisgIE1VTFRJTElORTogMHgwMDAxMDAwLAorICBQQVNTV09SRDogMHgwMDAyMDAwLAorICBOT1RPR0dMRVRPT0ZGOiAweDAwMDQwMDAsCisgIFJBRElPOiAweDAwMDgwMDAsCisgIFBVU0hCVVRUT046IDB4MDAxMDAwMCwKKyAgQ09NQk86IDB4MDAyMDAwMCwKKyAgRURJVDogMHgwMDQwMDAwLAorICBTT1JUOiAweDAwODAwMDAsCisgIEZJTEVTRUxFQ1Q6IDB4MDEwMDAwMCwKKyAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKKyAgRE9OT1RTUEVMTENIRUNLOiAweDA0MDAwMDAsCisgIERPTk9UU0NST0xMOiAweDA4MDAwMDAsCisgIENPTUI6IDB4MTAwMDAwMCwKKyAgUklDSFRFWFQ6IDB4MjAwMDAwMCwKKyAgUkFESU9TSU5VTklTT046IDB4MjAwMDAwMCwKKyAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IEFubm90YXRpb25GaWVsZEZsYWc7Citjb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0geworICBTT0xJRDogMSwKKyAgREFTSEVEOiAyLAorICBCRVZFTEVEOiAzLAorICBJTlNFVDogNCwKKyAgVU5ERVJMSU5FOiA1Cit9OworZXhwb3J0cy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZTsKK2NvbnN0IFN0cmVhbVR5cGUgPSB7CisgIFVOS05PV046ICJVTktOT1dOIiwKKyAgRkxBVEU6ICJGTEFURSIsCisgIExaVzogIkxaVyIsCisgIERDVDogIkRDVCIsCisgIEpQWDogIkpQWCIsCisgIEpCSUc6ICJKQklHIiwKKyAgQTg1OiAiQTg1IiwKKyAgQUhYOiAiQUhYIiwKKyAgQ0NGOiAiQ0NGIiwKKyAgUkxYOiAiUkxYIgorfTsKK2V4cG9ydHMuU3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU7Citjb25zdCBGb250VHlwZSA9IHsKKyAgVU5LTk9XTjogIlVOS05PV04iLAorICBUWVBFMTogIlRZUEUxIiwKKyAgVFlQRTFDOiAiVFlQRTFDIiwKKyAgQ0lERk9OVFRZUEUwOiAiQ0lERk9OVFRZUEUwIiwKKyAgQ0lERk9OVFRZUEUwQzogIkNJREZPTlRUWVBFMEMiLAorICBUUlVFVFlQRTogIlRSVUVUWVBFIiwKKyAgQ0lERk9OVFRZUEUyOiAiQ0lERk9OVFRZUEUyIiwKKyAgVFlQRTM6ICJUWVBFMyIsCisgIE9QRU5UWVBFOiAiT1BFTlRZUEUiLAorICBUWVBFMDogIlRZUEUwIiwKKyAgTU1UWVBFMTogIk1NVFlQRTEiCit9OworZXhwb3J0cy5Gb250VHlwZSA9IEZvbnRUeXBlOworY29uc3QgVmVyYm9zaXR5TGV2ZWwgPSB7CisgIEVSUk9SUzogMCwKKyAgV0FSTklOR1M6IDEsCisgIElORk9TOiA1Cit9OworZXhwb3J0cy5WZXJib3NpdHlMZXZlbCA9IFZlcmJvc2l0eUxldmVsOworY29uc3QgQ01hcENvbXByZXNzaW9uVHlwZSA9IHsKKyAgTk9ORTogMCwKKyAgQklOQVJZOiAxLAorICBTVFJFQU06IDIKK307CitleHBvcnRzLkNNYXBDb21wcmVzc2lvblR5cGUgPSBDTWFwQ29tcHJlc3Npb25UeXBlOworY29uc3QgT1BTID0geworICBkZXBlbmRlbmN5OiAxLAorICBzZXRMaW5lV2lkdGg6IDIsCisgIHNldExpbmVDYXA6IDMsCisgIHNldExpbmVKb2luOiA0LAorICBzZXRNaXRlckxpbWl0OiA1LAorICBzZXREYXNoOiA2LAorICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsCisgIHNldEZsYXRuZXNzOiA4LAorICBzZXRHU3RhdGU6IDksCisgIHNhdmU6IDEwLAorICByZXN0b3JlOiAxMSwKKyAgdHJhbnNmb3JtOiAxMiwKKyAgbW92ZVRvOiAxMywKKyAgbGluZVRvOiAxNCwKKyAgY3VydmVUbzogMTUsCisgIGN1cnZlVG8yOiAxNiwKKyAgY3VydmVUbzM6IDE3LAorICBjbG9zZVBhdGg6IDE4LAorICByZWN0YW5nbGU6IDE5LAorICBzdHJva2U6IDIwLAorICBjbG9zZVN0cm9rZTogMjEsCisgIGZpbGw6IDIyLAorICBlb0ZpbGw6IDIzLAorICBmaWxsU3Ryb2tlOiAyNCwKKyAgZW9GaWxsU3Ryb2tlOiAyNSwKKyAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKKyAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LAorICBlbmRQYXRoOiAyOCwKKyAgY2xpcDogMjksCisgIGVvQ2xpcDogMzAsCisgIGJlZ2luVGV4dDogMzEsCisgIGVuZFRleHQ6IDMyLAorICBzZXRDaGFyU3BhY2luZzogMzMsCisgIHNldFdvcmRTcGFjaW5nOiAzNCwKKyAgc2V0SFNjYWxlOiAzNSwKKyAgc2V0TGVhZGluZzogMzYsCisgIHNldEZvbnQ6IDM3LAorICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsCisgIHNldFRleHRSaXNlOiAzOSwKKyAgbW92ZVRleHQ6IDQwLAorICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAorICBzZXRUZXh0TWF0cml4OiA0MiwKKyAgbmV4dExpbmU6IDQzLAorICBzaG93VGV4dDogNDQsCisgIHNob3dTcGFjZWRUZXh0OiA0NSwKKyAgbmV4dExpbmVTaG93VGV4dDogNDYsCisgIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKKyAgc2V0Q2hhcldpZHRoOiA0OCwKKyAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSwKKyAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCisgIHNldEZpbGxDb2xvclNwYWNlOiA1MSwKKyAgc2V0U3Ryb2tlQ29sb3I6IDUyLAorICBzZXRTdHJva2VDb2xvck46IDUzLAorICBzZXRGaWxsQ29sb3I6IDU0LAorICBzZXRGaWxsQ29sb3JOOiA1NSwKKyAgc2V0U3Ryb2tlR3JheTogNTYsCisgIHNldEZpbGxHcmF5OiA1NywKKyAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LAorICBzZXRGaWxsUkdCQ29sb3I6IDU5LAorICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLAorICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSwKKyAgc2hhZGluZ0ZpbGw6IDYyLAorICBiZWdpbklubGluZUltYWdlOiA2MywKKyAgYmVnaW5JbWFnZURhdGE6IDY0LAorICBlbmRJbmxpbmVJbWFnZTogNjUsCisgIHBhaW50WE9iamVjdDogNjYsCisgIG1hcmtQb2ludDogNjcsCisgIG1hcmtQb2ludFByb3BzOiA2OCwKKyAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSwKKyAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLAorICBlbmRNYXJrZWRDb250ZW50OiA3MSwKKyAgYmVnaW5Db21wYXQ6IDcyLAorICBlbmRDb21wYXQ6IDczLAorICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAorICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSwKKyAgYmVnaW5Hcm91cDogNzYsCisgIGVuZEdyb3VwOiA3NywKKyAgYmVnaW5Bbm5vdGF0aW9uczogNzgsCisgIGVuZEFubm90YXRpb25zOiA3OSwKKyAgYmVnaW5Bbm5vdGF0aW9uOiA4MCwKKyAgZW5kQW5ub3RhdGlvbjogODEsCisgIHBhaW50SnBlZ1hPYmplY3Q6IDgyLAorICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLAorICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsCisgIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKKyAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LAorICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NywKKyAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAorICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LAorICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLAorICBjb25zdHJ1Y3RQYXRoOiA5MQorfTsKK2V4cG9ydHMuT1BTID0gT1BTOworY29uc3QgVU5TVVBQT1JURURfRkVBVFVSRVMgPSB7CisgIHVua25vd246ICJ1bmtub3duIiwKKyAgZm9ybXM6ICJmb3JtcyIsCisgIGphdmFTY3JpcHQ6ICJqYXZhU2NyaXB0IiwKKyAgc21hc2s6ICJzbWFzayIsCisgIHNoYWRpbmdQYXR0ZXJuOiAic2hhZGluZ1BhdHRlcm4iLAorICBmb250OiAiZm9udCIsCisgIGVycm9yVGlsaW5nUGF0dGVybjogImVycm9yVGlsaW5nUGF0dGVybiIsCisgIGVycm9yRXh0R1N0YXRlOiAiZXJyb3JFeHRHU3RhdGUiLAorICBlcnJvclhPYmplY3Q6ICJlcnJvclhPYmplY3QiLAorICBlcnJvckZvbnRMb2FkVHlwZTM6ICJlcnJvckZvbnRMb2FkVHlwZTMiLAorICBlcnJvckZvbnRTdGF0ZTogImVycm9yRm9udFN0YXRlIiwKKyAgZXJyb3JGb250TWlzc2luZzogImVycm9yRm9udE1pc3NpbmciLAorICBlcnJvckZvbnRUcmFuc2xhdGU6ICJlcnJvckZvbnRUcmFuc2xhdGUiLAorICBlcnJvckNvbG9yU3BhY2U6ICJlcnJvckNvbG9yU3BhY2UiLAorICBlcnJvck9wZXJhdG9yTGlzdDogImVycm9yT3BlcmF0b3JMaXN0IiwKKyAgZXJyb3JGb250VG9Vbmljb2RlOiAiZXJyb3JGb250VG9Vbmljb2RlIiwKKyAgZXJyb3JGb250TG9hZE5hdGl2ZTogImVycm9yRm9udExvYWROYXRpdmUiLAorICBlcnJvckZvbnRHZXRQYXRoOiAiZXJyb3JGb250R2V0UGF0aCIsCisgIGVycm9yTWFya2VkQ29udGVudDogImVycm9yTWFya2VkQ29udGVudCIKK307CitleHBvcnRzLlVOU1VQUE9SVEVEX0ZFQVRVUkVTID0gVU5TVVBQT1JURURfRkVBVFVSRVM7Citjb25zdCBQYXNzd29yZFJlc3BvbnNlcyA9IHsKKyAgTkVFRF9QQVNTV09SRDogMSwKKyAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyCit9OworZXhwb3J0cy5QYXNzd29yZFJlc3BvbnNlcyA9IFBhc3N3b3JkUmVzcG9uc2VzOworbGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTOworCitmdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkgeworICBpZiAoTnVtYmVyLmlzSW50ZWdlcihsZXZlbCkpIHsKKyAgICB2ZXJib3NpdHkgPSBsZXZlbDsKKyAgfQorfQorCitmdW5jdGlvbiBnZXRWZXJib3NpdHlMZXZlbCgpIHsKKyAgcmV0dXJuIHZlcmJvc2l0eTsKK30KKworZnVuY3Rpb24gaW5mbyhtc2cpIHsKKyAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykgeworICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTsKKyAgfQorfQorCitmdW5jdGlvbiB3YXJuKG1zZykgeworICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7CisgICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApOworICB9Cit9CisKK2Z1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykgeworICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKK30KKworZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykgeworICBpZiAoIWNvbmQpIHsKKyAgICB1bnJlYWNoYWJsZShtc2cpOworICB9Cit9CisKK2Z1bmN0aW9uIGlzU2FtZU9yaWdpbihiYXNlVXJsLCBvdGhlclVybCkgeworICBsZXQgYmFzZTsKKworICB0cnkgeworICAgIGJhc2UgPSBuZXcgVVJMKGJhc2VVcmwpOworCisgICAgaWYgKCFiYXNlLm9yaWdpbiB8fCBiYXNlLm9yaWdpbiA9PT0gIm51bGwiKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3Qgb3RoZXIgPSBuZXcgVVJMKG90aGVyVXJsLCBiYXNlKTsKKyAgcmV0dXJuIGJhc2Uub3JpZ2luID09PSBvdGhlci5vcmlnaW47Cit9CisKK2Z1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2wodXJsKSB7CisgIGlmICghdXJsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHsKKyAgICBjYXNlICJodHRwOiI6CisgICAgY2FzZSAiaHR0cHM6IjoKKyAgICBjYXNlICJmdHA6IjoKKyAgICBjYXNlICJtYWlsdG86IjoKKyAgICBjYXNlICJ0ZWw6IjoKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitmdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgYmFzZVVybCkgeworICBpZiAoIXVybCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgdHJ5IHsKKyAgICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCk7CisKKyAgICBpZiAoX2lzVmFsaWRQcm90b2NvbChhYnNvbHV0ZVVybCkpIHsKKyAgICAgIHJldHVybiBhYnNvbHV0ZVVybDsKKyAgICB9CisgIH0gY2F0Y2ggKGV4KSB7fQorCisgIHJldHVybiBudWxsOworfQorCitmdW5jdGlvbiBzaGFkb3cob2JqLCBwcm9wLCB2YWx1ZSkgeworICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7CisgICAgdmFsdWUsCisgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgd3JpdGFibGU6IGZhbHNlCisgIH0pOworICByZXR1cm4gdmFsdWU7Cit9CisKK2NvbnN0IEJhc2VFeGNlcHRpb24gPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VFeGNlcHRpb24pIHsKKyAgICAgIHVucmVhY2hhYmxlKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLiIpOworICAgIH0KKworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB9CisKKyAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKKyAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247CisgIHJldHVybiBCYXNlRXhjZXB0aW9uOworfSgpOworCitleHBvcnRzLkJhc2VFeGNlcHRpb24gPSBCYXNlRXhjZXB0aW9uOworCitjbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHsKKyAgICBzdXBlcihtc2cpOworICAgIHRoaXMuY29kZSA9IGNvZGU7CisgIH0KKworfQorCitleHBvcnRzLlBhc3N3b3JkRXhjZXB0aW9uID0gUGFzc3dvcmRFeGNlcHRpb247CisKK2NsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHsKKyAgICBzdXBlcihtc2cpOworICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7CisgIH0KKworfQorCitleHBvcnRzLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IFVua25vd25FcnJvckV4Y2VwdGlvbjsKKworY2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5JbnZhbGlkUERGRXhjZXB0aW9uID0gSW52YWxpZFBERkV4Y2VwdGlvbjsKKworY2xhc3MgTWlzc2luZ1BERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gTWlzc2luZ1BERkV4Y2VwdGlvbjsKKworY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CisgIGNvbnN0cnVjdG9yKG1zZywgc3RhdHVzKSB7CisgICAgc3VwZXIobXNnKTsKKyAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgfQorCit9CisKK2V4cG9ydHMuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uOworCitjbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5Gb3JtYXRFcnJvciA9IEZvcm1hdEVycm9yOworCitjbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5BYm9ydEV4Y2VwdGlvbiA9IEFib3J0RXhjZXB0aW9uOworY29uc3QgTnVsbENoYXJhY3RlcnNSZWdFeHAgPSAvXHgwMC9nOworCitmdW5jdGlvbiByZW1vdmVOdWxsQ2hhcmFjdGVycyhzdHIpIHsKKyAgaWYgKHR5cGVvZiBzdHIgIT09ICJzdHJpbmciKSB7CisgICAgd2FybigiVGhlIGFyZ3VtZW50IGZvciByZW1vdmVOdWxsQ2hhcmFjdGVycyBtdXN0IGJlIGEgc3RyaW5nLiIpOworICAgIHJldHVybiBzdHI7CisgIH0KKworICByZXR1cm4gc3RyLnJlcGxhY2UoTnVsbENoYXJhY3RlcnNSZWdFeHAsICIiKTsKK30KKworZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyhieXRlcykgeworICBhc3NlcnQoYnl0ZXMgIT09IG51bGwgJiYgdHlwZW9mIGJ5dGVzID09PSAib2JqZWN0IiAmJiBieXRlcy5sZW5ndGggIT09IHVuZGVmaW5lZCwgIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmciKTsKKyAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyOworCisgIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKKyAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7CisgIH0KKworICBjb25zdCBzdHJCdWYgPSBbXTsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKKyAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7CisgICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7CisgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpOworICB9CisKKyAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHsKKyAgYXNzZXJ0KHR5cGVvZiBzdHIgPT09ICJzdHJpbmciLCAiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpOworICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoOworICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmOworICB9CisKKyAgcmV0dXJuIGJ5dGVzOworfQorCitmdW5jdGlvbiBhcnJheUJ5dGVMZW5ndGgoYXJyKSB7CisgIGlmIChhcnIubGVuZ3RoICE9PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gYXJyLmxlbmd0aDsKKyAgfQorCisgIGFzc2VydChhcnIuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkLCAiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC4iKTsKKyAgcmV0dXJuIGFyci5ieXRlTGVuZ3RoOworfQorCitmdW5jdGlvbiBhcnJheXNUb0J5dGVzKGFycikgeworICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoOworCisgIGlmIChsZW5ndGggPT09IDEgJiYgYXJyWzBdIGluc3RhbmNlb2YgVWludDhBcnJheSkgeworICAgIHJldHVybiBhcnJbMF07CisgIH0KKworICBsZXQgcmVzdWx0TGVuZ3RoID0gMDsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgcmVzdWx0TGVuZ3RoICs9IGFycmF5Qnl0ZUxlbmd0aChhcnJbaV0pOworICB9CisKKyAgbGV0IHBvcyA9IDA7CisgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShyZXN1bHRMZW5ndGgpOworCisgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICBsZXQgaXRlbSA9IGFycltpXTsKKworICAgIGlmICghKGl0ZW0gaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgeworICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAic3RyaW5nIikgeworICAgICAgICBpdGVtID0gc3RyaW5nVG9CeXRlcyhpdGVtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGl0ZW0gPSBuZXcgVWludDhBcnJheShpdGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBpdGVtTGVuZ3RoID0gaXRlbS5ieXRlTGVuZ3RoOworICAgIGRhdGEuc2V0KGl0ZW0sIHBvcyk7CisgICAgcG9zICs9IGl0ZW1MZW5ndGg7CisgIH0KKworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHsKKyAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOworfQorCitmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHsKKyAgY29uc3QgYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KDQpOworICBidWZmZXI4WzBdID0gMTsKKyAgY29uc3QgdmlldzMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcjguYnVmZmVyLCAwLCAxKTsKKyAgcmV0dXJuIHZpZXczMlswXSA9PT0gMTsKK30KKworY29uc3QgSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSB7CisgIGdldCB2YWx1ZSgpIHsKKyAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2YWx1ZSIsIGlzTGl0dGxlRW5kaWFuKCkpOworICB9CisKK307CitleHBvcnRzLklzTGl0dGxlRW5kaWFuQ2FjaGVkID0gSXNMaXR0bGVFbmRpYW5DYWNoZWQ7CisKK2Z1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHsKKyAgdHJ5IHsKKyAgICBuZXcgRnVuY3Rpb24oIiIpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2NvbnN0IElzRXZhbFN1cHBvcnRlZENhY2hlZCA9IHsKKyAgZ2V0IHZhbHVlKCkgeworICAgIHJldHVybiBzaGFkb3codGhpcywgInZhbHVlIiwgaXNFdmFsU3VwcG9ydGVkKCkpOworICB9CisKK307CitleHBvcnRzLklzRXZhbFN1cHBvcnRlZENhY2hlZCA9IElzRXZhbFN1cHBvcnRlZENhY2hlZDsKK2NvbnN0IHJnYkJ1ZiA9IFsicmdiKCIsIDAsICIsIiwgMCwgIiwiLCAwLCAiKSJdOworCitjbGFzcyBVdGlsIHsKKyAgc3RhdGljIG1ha2VDc3NSZ2IociwgZywgYikgeworICAgIHJnYkJ1ZlsxXSA9IHI7CisgICAgcmdiQnVmWzNdID0gZzsKKyAgICByZ2JCdWZbNV0gPSBiOworICAgIHJldHVybiByZ2JCdWYuam9pbigiIik7CisgIH0KKworICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikgeworICAgIHJldHVybiBbbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLCBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSwgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV1dOworICB9CisKKyAgc3RhdGljIGFwcGx5VHJhbnNmb3JtKHAsIG0pIHsKKyAgICBjb25zdCB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdOworICAgIGNvbnN0IHl0ID0gcFswXSAqIG1bMV0gKyBwWzFdICogbVszXSArIG1bNV07CisgICAgcmV0dXJuIFt4dCwgeXRdOworICB9CisKKyAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7CisgICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07CisgICAgY29uc3QgeHQgPSAocFswXSAqIG1bM10gLSBwWzFdICogbVsyXSArIG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZDsKKyAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDsKKyAgICByZXR1cm4gW3h0LCB5dF07CisgIH0KKworICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkgeworICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLCBtKTsKKyAgICBjb25zdCBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7CisgICAgY29uc3QgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7CisgICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7CisgICAgcmV0dXJuIFtNYXRoLm1pbihwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSwgTWF0aC5tYXgocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1heChwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSldOworICB9CisKKyAgc3RhdGljIGludmVyc2VUcmFuc2Zvcm0obSkgeworICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOworICAgIHJldHVybiBbbVszXSAvIGQsIC1tWzFdIC8gZCwgLW1bMl0gLyBkLCBtWzBdIC8gZCwgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCwgKG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZF07CisgIH0KKworICBzdGF0aWMgYXBwbHkzZFRyYW5zZm9ybShtLCB2KSB7CisgICAgcmV0dXJuIFttWzBdICogdlswXSArIG1bMV0gKiB2WzFdICsgbVsyXSAqIHZbMl0sIG1bM10gKiB2WzBdICsgbVs0XSAqIHZbMV0gKyBtWzVdICogdlsyXSwgbVs2XSAqIHZbMF0gKyBtWzddICogdlsxXSArIG1bOF0gKiB2WzJdXTsKKyAgfQorCisgIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7CisgICAgY29uc3QgdHJhbnNwb3NlID0gW21bMF0sIG1bMl0sIG1bMV0sIG1bM11dOworICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTsKKyAgICBjb25zdCBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107CisgICAgY29uc3QgYyA9IG1bMl0gKiB0cmFuc3Bvc2VbMF0gKyBtWzNdICogdHJhbnNwb3NlWzJdOworICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTsKKyAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyOworICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICogKGEgKyBkKSAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjsKKyAgICBjb25zdCBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7CisgICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxOworICAgIHJldHVybiBbTWF0aC5zcXJ0KHN4KSwgTWF0aC5zcXJ0KHN5KV07CisgIH0KKworICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7CisgICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7CisKKyAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHsKKyAgICAgIHJbMF0gPSByZWN0WzJdOworICAgICAgclsyXSA9IHJlY3RbMF07CisgICAgfQorCisgICAgaWYgKHJlY3RbMV0gPiByZWN0WzNdKSB7CisgICAgICByWzFdID0gcmVjdFszXTsKKyAgICAgIHJbM10gPSByZWN0WzFdOworICAgIH0KKworICAgIHJldHVybiByOworICB9CisKKyAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHsKKyAgICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHsKKyAgICAgIHJldHVybiBhIC0gYjsKKyAgICB9CisKKyAgICBjb25zdCBvcmRlcmVkWCA9IFtyZWN0MVswXSwgcmVjdDFbMl0sIHJlY3QyWzBdLCByZWN0MlsyXV0uc29ydChjb21wYXJlKTsKKyAgICBjb25zdCBvcmRlcmVkWSA9IFtyZWN0MVsxXSwgcmVjdDFbM10sIHJlY3QyWzFdLCByZWN0MlszXV0uc29ydChjb21wYXJlKTsKKyAgICBjb25zdCByZXN1bHQgPSBbXTsKKyAgICByZWN0MSA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0MSk7CisgICAgcmVjdDIgPSBVdGlsLm5vcm1hbGl6ZVJlY3QocmVjdDIpOworCisgICAgaWYgKG9yZGVyZWRYWzBdID09PSByZWN0MVswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDJbMF0gfHwgb3JkZXJlZFhbMF0gPT09IHJlY3QyWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MVswXSkgeworICAgICAgcmVzdWx0WzBdID0gb3JkZXJlZFhbMV07CisgICAgICByZXN1bHRbMl0gPSBvcmRlcmVkWFsyXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaWYgKG9yZGVyZWRZWzBdID09PSByZWN0MVsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDJbMV0gfHwgb3JkZXJlZFlbMF0gPT09IHJlY3QyWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MVsxXSkgeworICAgICAgcmVzdWx0WzFdID0gb3JkZXJlZFlbMV07CisgICAgICByZXN1bHRbM10gPSBvcmRlcmVkWVsyXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCit9CisKK2V4cG9ydHMuVXRpbCA9IFV0aWw7Citjb25zdCBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJEOCwgMHgyQzcsIDB4MkM2LCAweDJEOSwgMHgyREQsIDB4MkRCLCAweDJEQSwgMHgyREMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNBLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFFLCAweDIwMUMsIDB4MjAxRCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQSwgMHgyMTIyLCAweEZCMDEsIDB4RkIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdELCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN0UsIDAsIDB4MjBBQ107CisKK2Z1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikgeworICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoLAorICAgICAgICBzdHJCdWYgPSBbXTsKKworICBpZiAoc3RyWzBdID09PSAiXHhGRSIgJiYgc3RyWzFdID09PSAiXHhGRiIpIHsKKyAgICBmb3IgKGxldCBpID0gMjsgaSA8IGxlbmd0aDsgaSArPSAyKSB7CisgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ci5jaGFyQ29kZUF0KGkpIDw8IDggfCBzdHIuY2hhckNvZGVBdChpICsgMSkpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyWzBdID09PSAiXHhGRiIgJiYgc3RyWzFdID09PSAiXHhGRSIpIHsKKyAgICBmb3IgKGxldCBpID0gMjsgaSA8IGxlbmd0aDsgaSArPSAyKSB7CisgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSA8PCA4IHwgc3RyLmNoYXJDb2RlQXQoaSkpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgY29uc3QgY29kZSA9IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlW3N0ci5jaGFyQ29kZUF0KGkpXTsKKyAgICAgIHN0ckJ1Zi5wdXNoKGNvZGUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpIDogc3RyLmNoYXJBdChpKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cikgeworICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXChcKVxcXSkvZywgIlxcJDEiKTsKK30KKworZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cikgeworICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTsKK30KKworZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikgeworICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOworfQorCitmdW5jdGlvbiBpc0Jvb2wodikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJib29sZWFuIjsKK30KKworZnVuY3Rpb24gaXNOdW0odikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJudW1iZXIiOworfQorCitmdW5jdGlvbiBpc1N0cmluZyh2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gInN0cmluZyI7Cit9CisKK2Z1bmN0aW9uIGlzQXJyYXlCdWZmZXIodikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJvYmplY3QiICYmIHYgIT09IG51bGwgJiYgdi5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQ7Cit9CisKK2Z1bmN0aW9uIGlzQXJyYXlFcXVhbChhcnIxLCBhcnIyKSB7CisgIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gYXJyMS5ldmVyeShmdW5jdGlvbiAoZWxlbWVudCwgaW5kZXgpIHsKKyAgICByZXR1cm4gZWxlbWVudCA9PT0gYXJyMltpbmRleF07CisgIH0pOworfQorCitmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpKSkgeworICBjb25zdCBidWZmZXIgPSBbZGF0ZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksIChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIChkYXRlLmdldFVUQ0RhdGUoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIildOworICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOworfQorCitmdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpIHsKKyAgY29uc3QgY2FwYWJpbGl0eSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIGxldCBpc1NldHRsZWQgPSBmYWxzZTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhcGFiaWxpdHksICJzZXR0bGVkIiwgeworICAgIGdldCgpIHsKKyAgICAgIHJldHVybiBpc1NldHRsZWQ7CisgICAgfQorCisgIH0pOworICBjYXBhYmlsaXR5LnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgY2FwYWJpbGl0eS5yZXNvbHZlID0gZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgIGlzU2V0dGxlZCA9IHRydWU7CisgICAgICByZXNvbHZlKGRhdGEpOworICAgIH07CisKKyAgICBjYXBhYmlsaXR5LnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGlzU2V0dGxlZCA9IHRydWU7CisgICAgICByZWplY3QocmVhc29uKTsKKyAgICB9OworICB9KTsKKyAgcmV0dXJuIGNhcGFiaWxpdHk7Cit9CisKK2NvbnN0IGNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTENsb3N1cmUoKSB7CisgIGNvbnN0IGRpZ2l0cyA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7CisgIHJldHVybiBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwoZGF0YSwgY29udGVudFR5cGUsIGZvcmNlRGF0YVNjaGVtYSA9IGZhbHNlKSB7CisgICAgaWYgKCFmb3JjZURhdGFTY2hlbWEgJiYgVVJMLmNyZWF0ZU9iamVjdFVSTCkgeworICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgICB0eXBlOiBjb250ZW50VHlwZQorICAgICAgfSk7CisgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKKyAgICB9CisKKyAgICBsZXQgYnVmZmVyID0gYGRhdGE6JHtjb250ZW50VHlwZX07YmFzZTY0LGA7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHsKKyAgICAgIGNvbnN0IGIxID0gZGF0YVtpXSAmIDB4ZmY7CisgICAgICBjb25zdCBiMiA9IGRhdGFbaSArIDFdICYgMHhmZjsKKyAgICAgIGNvbnN0IGIzID0gZGF0YVtpICsgMl0gJiAweGZmOworICAgICAgY29uc3QgZDEgPSBiMSA+PiAyLAorICAgICAgICAgICAgZDIgPSAoYjEgJiAzKSA8PCA0IHwgYjIgPj4gNDsKKyAgICAgIGNvbnN0IGQzID0gaSArIDEgPCBpaSA/IChiMiAmIDB4ZikgPDwgMiB8IGIzID4+IDYgOiA2NDsKKyAgICAgIGNvbnN0IGQ0ID0gaSArIDIgPCBpaSA/IGIzICYgMHgzZiA6IDY0OworICAgICAgYnVmZmVyICs9IGRpZ2l0c1tkMV0gKyBkaWdpdHNbZDJdICsgZGlnaXRzW2QzXSArIGRpZ2l0c1tkNF07CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfTsKK30oKTsKKworZXhwb3J0cy5jcmVhdGVPYmplY3RVUkwgPSBjcmVhdGVPYmplY3RVUkw7CisKKy8qKiovIH0pLAorLyogMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKwordmFyIF9pc19ub2RlID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKKworOworCisvKioqLyB9KSwKKy8qIDQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5pc05vZGVKUyA9IHZvaWQgMDsKK2NvbnN0IGlzTm9kZUpTID0gdHlwZW9mIHByb2Nlc3MgPT09ICJvYmplY3QiICYmIHByb2Nlc3MgKyAiIiA9PT0gIltvYmplY3QgcHJvY2Vzc10iICYmICFwcm9jZXNzLnZlcnNpb25zLm53ICYmICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSAiYnJvd3NlciIpOworZXhwb3J0cy5pc05vZGVKUyA9IGlzTm9kZUpTOworCisvKioqLyB9KSwKKy8qIDUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXREb2N1bWVudCA9IGdldERvY3VtZW50OworZXhwb3J0cy5zZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeSA9IHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5OworZXhwb3J0cy5idWlsZCA9IGV4cG9ydHMudmVyc2lvbiA9IGV4cG9ydHMuUERGUGFnZVByb3h5ID0gZXhwb3J0cy5QREZEb2N1bWVudFByb3h5ID0gZXhwb3J0cy5QREZXb3JrZXIgPSBleHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydCA9IGV4cG9ydHMuTG9vcGJhY2tQb3J0ID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCit2YXIgX2ZvbnRfbG9hZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKKwordmFyIF9ub2RlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKKwordmFyIF9hbm5vdGF0aW9uX3N0b3JhZ2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworCit2YXIgX2FwaV9jb21wYXRpYmlsaXR5ID0gX193X3BkZmpzX3JlcXVpcmVfXyg5KTsKKwordmFyIF9jYW52YXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKKwordmFyIF93b3JrZXJfb3B0aW9ucyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOworCit2YXIgX2lzX25vZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOworCit2YXIgX21lc3NhZ2VfaGFuZGxlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOworCit2YXIgX21ldGFkYXRhID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7CisKK3ZhciBfb3B0aW9uYWxfY29udGVudF9jb25maWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTsKKwordmFyIF90cmFuc3BvcnRfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxNyk7CisKK3ZhciBfd2ViZ2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKKworY29uc3QgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFID0gNjU1MzY7Citjb25zdCBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQgPSAxMDA7Citjb25zdCBEZWZhdWx0Q2FudmFzRmFjdG9yeSA9IF9pc19ub2RlLmlzTm9kZUpTID8gX25vZGVfdXRpbHMuTm9kZUNhbnZhc0ZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01DYW52YXNGYWN0b3J5OworY29uc3QgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gX2lzX25vZGUuaXNOb2RlSlMgPyBfbm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeTsKK2xldCBjcmVhdGVQREZOZXR3b3JrU3RyZWFtOworCitmdW5jdGlvbiBzZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeShwZGZOZXR3b3JrU3RyZWFtRmFjdG9yeSkgeworICBjcmVhdGVQREZOZXR3b3JrU3RyZWFtID0gcGRmTmV0d29ya1N0cmVhbUZhY3Rvcnk7Cit9CisKK2Z1bmN0aW9uIGdldERvY3VtZW50KHNyYykgeworICBjb25zdCB0YXNrID0gbmV3IFBERkRvY3VtZW50TG9hZGluZ1Rhc2soKTsKKyAgbGV0IHNvdXJjZTsKKworICBpZiAodHlwZW9mIHNyYyA9PT0gInN0cmluZyIpIHsKKyAgICBzb3VyY2UgPSB7CisgICAgICB1cmw6IHNyYworICAgIH07CisgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKHNyYykpIHsKKyAgICBzb3VyY2UgPSB7CisgICAgICBkYXRhOiBzcmMKKyAgICB9OworICB9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIFBERkRhdGFSYW5nZVRyYW5zcG9ydCkgeworICAgIHNvdXJjZSA9IHsKKyAgICAgIHJhbmdlOiBzcmMKKyAgICB9OworICB9IGVsc2UgeworICAgIGlmICh0eXBlb2Ygc3JjICE9PSAib2JqZWN0IikgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciBpbiBnZXREb2N1bWVudCwgIiArICJuZWVkIGVpdGhlciBVaW50OEFycmF5LCBzdHJpbmcgb3IgYSBwYXJhbWV0ZXIgb2JqZWN0Iik7CisgICAgfQorCisgICAgaWYgKCFzcmMudXJsICYmICFzcmMuZGF0YSAmJiAhc3JjLnJhbmdlKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcGFyYW1ldGVyIG9iamVjdDogbmVlZCBlaXRoZXIgLmRhdGEsIC5yYW5nZSBvciAudXJsIik7CisgICAgfQorCisgICAgc291cmNlID0gc3JjOworICB9CisKKyAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgbGV0IHJhbmdlVHJhbnNwb3J0ID0gbnVsbCwKKyAgICAgIHdvcmtlciA9IG51bGw7CisKKyAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7CisgICAgaWYgKGtleSA9PT0gInVybCIgJiYgdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIHBhcmFtc1trZXldID0gbmV3IFVSTChzb3VyY2Vba2V5XSwgd2luZG93LmxvY2F0aW9uKS5ocmVmOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChrZXkgPT09ICJyYW5nZSIpIHsKKyAgICAgIHJhbmdlVHJhbnNwb3J0ID0gc291cmNlW2tleV07CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PT0gIndvcmtlciIpIHsKKyAgICAgIHdvcmtlciA9IHNvdXJjZVtrZXldOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChrZXkgPT09ICJkYXRhIiAmJiAhKHNvdXJjZVtrZXldIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHsKKyAgICAgIGNvbnN0IHBkZkJ5dGVzID0gc291cmNlW2tleV07CisKKyAgICAgIGlmICh0eXBlb2YgcGRmQnl0ZXMgPT09ICJzdHJpbmciKSB7CisgICAgICAgIHBhcmFtc1trZXldID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHBkZkJ5dGVzKTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBkZkJ5dGVzID09PSAib2JqZWN0IiAmJiBwZGZCeXRlcyAhPT0gbnVsbCAmJiAhaXNOYU4ocGRmQnl0ZXMubGVuZ3RoKSkgeworICAgICAgICBwYXJhbXNba2V5XSA9IG5ldyBVaW50OEFycmF5KHBkZkJ5dGVzKTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKHBkZkJ5dGVzKSkgeworICAgICAgICBwYXJhbXNba2V5XSA9IG5ldyBVaW50OEFycmF5KHBkZkJ5dGVzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBQREYgYmluYXJ5IGRhdGE6IGVpdGhlciB0eXBlZCBhcnJheSwgIiArICJzdHJpbmcgb3IgYXJyYXktbGlrZSBvYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlICIgKyAiZGF0YSBwcm9wZXJ0eS4iKTsKKyAgICAgIH0KKworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgcGFyYW1zW2tleV0gPSBzb3VyY2Vba2V5XTsKKyAgfQorCisgIHBhcmFtcy5yYW5nZUNodW5rU2l6ZSA9IHBhcmFtcy5yYW5nZUNodW5rU2l6ZSB8fCBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU7CisgIHBhcmFtcy5DTWFwUmVhZGVyRmFjdG9yeSA9IHBhcmFtcy5DTWFwUmVhZGVyRmFjdG9yeSB8fCBEZWZhdWx0Q01hcFJlYWRlckZhY3Rvcnk7CisgIHBhcmFtcy5pZ25vcmVFcnJvcnMgPSBwYXJhbXMuc3RvcEF0RXJyb3JzICE9PSB0cnVlOworICBwYXJhbXMuZm9udEV4dHJhUHJvcGVydGllcyA9IHBhcmFtcy5mb250RXh0cmFQcm9wZXJ0aWVzID09PSB0cnVlOworICBwYXJhbXMucGRmQnVnID0gcGFyYW1zLnBkZkJ1ZyA9PT0gdHJ1ZTsKKworICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyYW1zLm1heEltYWdlU2l6ZSkpIHsKKyAgICBwYXJhbXMubWF4SW1hZ2VTaXplID0gLTE7CisgIH0KKworICBpZiAodHlwZW9mIHBhcmFtcy5pc0V2YWxTdXBwb3J0ZWQgIT09ICJib29sZWFuIikgeworICAgIHBhcmFtcy5pc0V2YWxTdXBwb3J0ZWQgPSB0cnVlOworICB9CisKKyAgaWYgKHR5cGVvZiBwYXJhbXMuZGlzYWJsZUZvbnRGYWNlICE9PSAiYm9vbGVhbiIpIHsKKyAgICBwYXJhbXMuZGlzYWJsZUZvbnRGYWNlID0gX2FwaV9jb21wYXRpYmlsaXR5LmFwaUNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUZvbnRGYWNlIHx8IGZhbHNlOworICB9CisKKyAgaWYgKHR5cGVvZiBwYXJhbXMub3duZXJEb2N1bWVudCA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICBwYXJhbXMub3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQ7CisgIH0KKworICBpZiAodHlwZW9mIHBhcmFtcy5kaXNhYmxlUmFuZ2UgIT09ICJib29sZWFuIikgeworICAgIHBhcmFtcy5kaXNhYmxlUmFuZ2UgPSBmYWxzZTsKKyAgfQorCisgIGlmICh0eXBlb2YgcGFyYW1zLmRpc2FibGVTdHJlYW0gIT09ICJib29sZWFuIikgeworICAgIHBhcmFtcy5kaXNhYmxlU3RyZWFtID0gZmFsc2U7CisgIH0KKworICBpZiAodHlwZW9mIHBhcmFtcy5kaXNhYmxlQXV0b0ZldGNoICE9PSAiYm9vbGVhbiIpIHsKKyAgICBwYXJhbXMuZGlzYWJsZUF1dG9GZXRjaCA9IGZhbHNlOworICB9CisKKyAgKDAsIF91dGlsLnNldFZlcmJvc2l0eUxldmVsKShwYXJhbXMudmVyYm9zaXR5KTsKKworICBpZiAoIXdvcmtlcikgeworICAgIGNvbnN0IHdvcmtlclBhcmFtcyA9IHsKKyAgICAgIHZlcmJvc2l0eTogcGFyYW1zLnZlcmJvc2l0eSwKKyAgICAgIHBvcnQ6IF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnQKKyAgICB9OworICAgIHdvcmtlciA9IHdvcmtlclBhcmFtcy5wb3J0ID8gUERGV29ya2VyLmZyb21Qb3J0KHdvcmtlclBhcmFtcykgOiBuZXcgUERGV29ya2VyKHdvcmtlclBhcmFtcyk7CisgICAgdGFzay5fd29ya2VyID0gd29ya2VyOworICB9CisKKyAgY29uc3QgZG9jSWQgPSB0YXNrLmRvY0lkOworICB3b3JrZXIucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICBpZiAodGFzay5kZXN0cm95ZWQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiTG9hZGluZyBhYm9ydGVkIik7CisgICAgfQorCisgICAgY29uc3Qgd29ya2VySWRQcm9taXNlID0gX2ZldGNoRG9jdW1lbnQod29ya2VyLCBwYXJhbXMsIHJhbmdlVHJhbnNwb3J0LCBkb2NJZCk7CisKKyAgICBjb25zdCBuZXR3b3JrU3RyZWFtUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICBsZXQgbmV0d29ya1N0cmVhbTsKKworICAgICAgaWYgKHJhbmdlVHJhbnNwb3J0KSB7CisgICAgICAgIG5ldHdvcmtTdHJlYW0gPSBuZXcgX3RyYW5zcG9ydF9zdHJlYW0uUERGRGF0YVRyYW5zcG9ydFN0cmVhbSh7CisgICAgICAgICAgbGVuZ3RoOiBwYXJhbXMubGVuZ3RoLAorICAgICAgICAgIGluaXRpYWxEYXRhOiBwYXJhbXMuaW5pdGlhbERhdGEsCisgICAgICAgICAgcHJvZ3Jlc3NpdmVEb25lOiBwYXJhbXMucHJvZ3Jlc3NpdmVEb25lLAorICAgICAgICAgIGRpc2FibGVSYW5nZTogcGFyYW1zLmRpc2FibGVSYW5nZSwKKyAgICAgICAgICBkaXNhYmxlU3RyZWFtOiBwYXJhbXMuZGlzYWJsZVN0cmVhbQorICAgICAgICB9LCByYW5nZVRyYW5zcG9ydCk7CisgICAgICB9IGVsc2UgaWYgKCFwYXJhbXMuZGF0YSkgeworICAgICAgICBuZXR3b3JrU3RyZWFtID0gY3JlYXRlUERGTmV0d29ya1N0cmVhbSh7CisgICAgICAgICAgdXJsOiBwYXJhbXMudXJsLAorICAgICAgICAgIGxlbmd0aDogcGFyYW1zLmxlbmd0aCwKKyAgICAgICAgICBodHRwSGVhZGVyczogcGFyYW1zLmh0dHBIZWFkZXJzLAorICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogcGFyYW1zLndpdGhDcmVkZW50aWFscywKKyAgICAgICAgICByYW5nZUNodW5rU2l6ZTogcGFyYW1zLnJhbmdlQ2h1bmtTaXplLAorICAgICAgICAgIGRpc2FibGVSYW5nZTogcGFyYW1zLmRpc2FibGVSYW5nZSwKKyAgICAgICAgICBkaXNhYmxlU3RyZWFtOiBwYXJhbXMuZGlzYWJsZVN0cmVhbQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmVzb2x2ZShuZXR3b3JrU3RyZWFtKTsKKyAgICB9KTsKKyAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3dvcmtlcklkUHJvbWlzZSwgbmV0d29ya1N0cmVhbVByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChbd29ya2VySWQsIG5ldHdvcmtTdHJlYW1dKSB7CisgICAgICBpZiAodGFzay5kZXN0cm95ZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJMb2FkaW5nIGFib3J0ZWQiKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihkb2NJZCwgd29ya2VySWQsIHdvcmtlci5wb3J0KTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gd29ya2VyLnBvc3RNZXNzYWdlVHJhbnNmZXJzOworICAgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFdvcmtlclRyYW5zcG9ydChtZXNzYWdlSGFuZGxlciwgdGFzaywgbmV0d29ya1N0cmVhbSwgcGFyYW1zKTsKKyAgICAgIHRhc2suX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoIlJlYWR5IiwgbnVsbCk7CisgICAgfSk7CisgIH0pLmNhdGNoKHRhc2suX2NhcGFiaWxpdHkucmVqZWN0KTsKKyAgcmV0dXJuIHRhc2s7Cit9CisKK2Z1bmN0aW9uIF9mZXRjaERvY3VtZW50KHdvcmtlciwgc291cmNlLCBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQsIGRvY0lkKSB7CisgIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7CisgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKSk7CisgIH0KKworICBpZiAocGRmRGF0YVJhbmdlVHJhbnNwb3J0KSB7CisgICAgc291cmNlLmxlbmd0aCA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5sZW5ndGg7CisgICAgc291cmNlLmluaXRpYWxEYXRhID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmluaXRpYWxEYXRhOworICAgIHNvdXJjZS5wcm9ncmVzc2l2ZURvbmUgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQucHJvZ3Jlc3NpdmVEb25lOworICB9CisKKyAgcmV0dXJuIHdvcmtlci5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERvY1JlcXVlc3QiLCB7CisgICAgZG9jSWQsCisgICAgYXBpVmVyc2lvbjogJzIuNi4zNDcnLAorICAgIHNvdXJjZTogeworICAgICAgZGF0YTogc291cmNlLmRhdGEsCisgICAgICB1cmw6IHNvdXJjZS51cmwsCisgICAgICBwYXNzd29yZDogc291cmNlLnBhc3N3b3JkLAorICAgICAgZGlzYWJsZUF1dG9GZXRjaDogc291cmNlLmRpc2FibGVBdXRvRmV0Y2gsCisgICAgICByYW5nZUNodW5rU2l6ZTogc291cmNlLnJhbmdlQ2h1bmtTaXplLAorICAgICAgbGVuZ3RoOiBzb3VyY2UubGVuZ3RoCisgICAgfSwKKyAgICBtYXhJbWFnZVNpemU6IHNvdXJjZS5tYXhJbWFnZVNpemUsCisgICAgZGlzYWJsZUZvbnRGYWNlOiBzb3VyY2UuZGlzYWJsZUZvbnRGYWNlLAorICAgIHBvc3RNZXNzYWdlVHJhbnNmZXJzOiB3b3JrZXIucG9zdE1lc3NhZ2VUcmFuc2ZlcnMsCisgICAgZG9jQmFzZVVybDogc291cmNlLmRvY0Jhc2VVcmwsCisgICAgaWdub3JlRXJyb3JzOiBzb3VyY2UuaWdub3JlRXJyb3JzLAorICAgIGlzRXZhbFN1cHBvcnRlZDogc291cmNlLmlzRXZhbFN1cHBvcnRlZCwKKyAgICBmb250RXh0cmFQcm9wZXJ0aWVzOiBzb3VyY2UuZm9udEV4dHJhUHJvcGVydGllcworICB9KS50aGVuKGZ1bmN0aW9uICh3b3JrZXJJZCkgeworICAgIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIik7CisgICAgfQorCisgICAgcmV0dXJuIHdvcmtlcklkOworICB9KTsKK30KKworY29uc3QgUERGRG9jdW1lbnRMb2FkaW5nVGFzayA9IGZ1bmN0aW9uIFBERkRvY3VtZW50TG9hZGluZ1Rhc2tDbG9zdXJlKCkgeworICBsZXQgbmV4dERvY3VtZW50SWQgPSAwOworCisgIGNsYXNzIFBERkRvY3VtZW50TG9hZGluZ1Rhc2sgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgdGhpcy5fY2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7CisgICAgICB0aGlzLl93b3JrZXIgPSBudWxsOworICAgICAgdGhpcy5kb2NJZCA9ICJkIiArIG5leHREb2N1bWVudElkKys7CisgICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOworICAgICAgdGhpcy5vblBhc3N3b3JkID0gbnVsbDsKKyAgICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgICAgICB0aGlzLm9uVW5zdXBwb3J0ZWRGZWF0dXJlID0gbnVsbDsKKyAgICB9CisKKyAgICBnZXQgcHJvbWlzZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorCisgICAgZGVzdHJveSgpIHsKKyAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKKyAgICAgIGNvbnN0IHRyYW5zcG9ydERlc3Ryb3llZCA9ICF0aGlzLl90cmFuc3BvcnQgPyBQcm9taXNlLnJlc29sdmUoKSA6IHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95KCk7CisgICAgICByZXR1cm4gdHJhbnNwb3J0RGVzdHJveWVkLnRoZW4oKCkgPT4geworICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsOworCisgICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHsKKyAgICAgICAgICB0aGlzLl93b3JrZXIuZGVzdHJveSgpOworCisgICAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorCisgIH0KKworICByZXR1cm4gUERGRG9jdW1lbnRMb2FkaW5nVGFzazsKK30oKTsKKworY2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHsKKyAgY29uc3RydWN0b3IobGVuZ3RoLCBpbml0aWFsRGF0YSwgcHJvZ3Jlc3NpdmVEb25lID0gZmFsc2UpIHsKKyAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICB0aGlzLmluaXRpYWxEYXRhID0gaW5pdGlhbERhdGE7CisgICAgdGhpcy5wcm9ncmVzc2l2ZURvbmUgPSBwcm9ncmVzc2l2ZURvbmU7CisgICAgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMgPSBbXTsKKyAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycyA9IFtdOworICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycyA9IFtdOworICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycyA9IFtdOworICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgfQorCisgIGFkZFJhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHsKKyAgICB0aGlzLl9yYW5nZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgfQorCisgIGFkZFByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXIpIHsKKyAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgfQorCisgIGFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGxpc3RlbmVyKSB7CisgICAgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOworICB9CisKKyAgYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIobGlzdGVuZXIpIHsKKyAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7CisgIH0KKworICBvbkRhdGFSYW5nZShiZWdpbiwgY2h1bmspIHsKKyAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3JhbmdlTGlzdGVuZXJzKSB7CisgICAgICBsaXN0ZW5lcihiZWdpbiwgY2h1bmspOworICAgIH0KKyAgfQorCisgIG9uRGF0YVByb2dyZXNzKGxvYWRlZCwgdG90YWwpIHsKKyAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMpIHsKKyAgICAgICAgbGlzdGVuZXIobG9hZGVkLCB0b3RhbCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBvbkRhdGFQcm9ncmVzc2l2ZVJlYWQoY2h1bmspIHsKKyAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzKSB7CisgICAgICAgIGxpc3RlbmVyKGNodW5rKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIG9uRGF0YVByb2dyZXNzaXZlRG9uZSgpIHsKKyAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzKSB7CisgICAgICAgIGxpc3RlbmVyKCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICB0cmFuc3BvcnRSZWFkeSgpIHsKKyAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpOworICB9CisKKyAgcmVxdWVzdERhdGFSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIFBERkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlIik7CisgIH0KKworICBhYm9ydCgpIHt9CisKK30KKworZXhwb3J0cy5QREZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBQREZEYXRhUmFuZ2VUcmFuc3BvcnQ7CisKK2NsYXNzIFBERkRvY3VtZW50UHJveHkgeworICBjb25zdHJ1Y3RvcihwZGZJbmZvLCB0cmFuc3BvcnQpIHsKKyAgICB0aGlzLl9wZGZJbmZvID0gcGRmSW5mbzsKKyAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgIH0KKworICBnZXQgYW5ub3RhdGlvblN0b3JhZ2UoKSB7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJhbm5vdGF0aW9uU3RvcmFnZSIsIG5ldyBfYW5ub3RhdGlvbl9zdG9yYWdlLkFubm90YXRpb25TdG9yYWdlKCkpOworICB9CisKKyAgZ2V0IG51bVBhZ2VzKCkgeworICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLm51bVBhZ2VzOworICB9CisKKyAgZ2V0IGZpbmdlcnByaW50KCkgeworICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLmZpbmdlcnByaW50OworICB9CisKKyAgZ2V0UGFnZShwYWdlTnVtYmVyKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlKHBhZ2VOdW1iZXIpOworICB9CisKKyAgZ2V0UGFnZUluZGV4KHJlZikgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUluZGV4KHJlZik7CisgIH0KKworICBnZXREZXN0aW5hdGlvbnMoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbnMoKTsKKyAgfQorCisgIGdldERlc3RpbmF0aW9uKGlkKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbihpZCk7CisgIH0KKworICBnZXRQYWdlTGFiZWxzKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxhYmVscygpOworICB9CisKKyAgZ2V0UGFnZUxheW91dCgpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYXlvdXQoKTsKKyAgfQorCisgIGdldFBhZ2VNb2RlKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZU1vZGUoKTsKKyAgfQorCisgIGdldFZpZXdlclByZWZlcmVuY2VzKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKTsKKyAgfQorCisgIGdldE9wZW5BY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPcGVuQWN0aW9uKCk7CisgIH0KKworICBnZXRBdHRhY2htZW50cygpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEF0dGFjaG1lbnRzKCk7CisgIH0KKworICBnZXRKYXZhU2NyaXB0KCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0SmF2YVNjcmlwdCgpOworICB9CisKKyAgZ2V0T3V0bGluZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE91dGxpbmUoKTsKKyAgfQorCisgIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpOworICB9CisKKyAgZ2V0UGVybWlzc2lvbnMoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQZXJtaXNzaW9ucygpOworICB9CisKKyAgZ2V0TWV0YWRhdGEoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNZXRhZGF0YSgpOworICB9CisKKyAgZ2V0RGF0YSgpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERhdGEoKTsKKyAgfQorCisgIGdldERvd25sb2FkSW5mbygpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIGdldFN0YXRzKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0U3RhdHMoKTsKKyAgfQorCisgIGNsZWFudXAoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAoKTsKKyAgfQorCisgIGRlc3Ryb3koKSB7CisgICAgcmV0dXJuIHRoaXMubG9hZGluZ1Rhc2suZGVzdHJveSgpOworICB9CisKKyAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zOworICB9CisKKyAgZ2V0IGxvYWRpbmdUYXNrKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1Rhc2s7CisgIH0KKworICBzYXZlRG9jdW1lbnQoYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnNhdmVEb2N1bWVudChhbm5vdGF0aW9uU3RvcmFnZSk7CisgIH0KKworfQorCitleHBvcnRzLlBERkRvY3VtZW50UHJveHkgPSBQREZEb2N1bWVudFByb3h5OworCitjbGFzcyBQREZQYWdlUHJveHkgeworICBjb25zdHJ1Y3RvcihwYWdlSW5kZXgsIHBhZ2VJbmZvLCB0cmFuc3BvcnQsIG93bmVyRG9jdW1lbnQsIHBkZkJ1ZyA9IGZhbHNlKSB7CisgICAgdGhpcy5fcGFnZUluZGV4ID0gcGFnZUluZGV4OworICAgIHRoaXMuX3BhZ2VJbmZvID0gcGFnZUluZm87CisgICAgdGhpcy5fb3duZXJEb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7CisgICAgdGhpcy5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIHRoaXMuX3N0YXRzID0gcGRmQnVnID8gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpIDogbnVsbDsKKyAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7CisgICAgdGhpcy5jb21tb25PYmpzID0gdHJhbnNwb3J0LmNvbW1vbk9ianM7CisgICAgdGhpcy5vYmpzID0gbmV3IFBERk9iamVjdHMoKTsKKyAgICB0aGlzLmNsZWFudXBBZnRlclJlbmRlciA9IGZhbHNlOworICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTsKKyAgICB0aGlzLl9pbnRlbnRTdGF0ZXMgPSBuZXcgTWFwKCk7CisgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTsKKyAgfQorCisgIGdldCBwYWdlTnVtYmVyKCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlSW5kZXggKyAxOworICB9CisKKyAgZ2V0IHJvdGF0ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlOworICB9CisKKyAgZ2V0IHJlZigpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucmVmOworICB9CisKKyAgZ2V0IHVzZXJVbml0KCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby51c2VyVW5pdDsKKyAgfQorCisgIGdldCB2aWV3KCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3OworICB9CisKKyAgZ2V0Vmlld3BvcnQoeworICAgIHNjYWxlLAorICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGUsCisgICAgb2Zmc2V0WCA9IDAsCisgICAgb2Zmc2V0WSA9IDAsCisgICAgZG9udEZsaXAgPSBmYWxzZQorICB9ID0ge30pIHsKKyAgICByZXR1cm4gbmV3IF9kaXNwbGF5X3V0aWxzLlBhZ2VWaWV3cG9ydCh7CisgICAgICB2aWV3Qm94OiB0aGlzLnZpZXcsCisgICAgICBzY2FsZSwKKyAgICAgIHJvdGF0aW9uLAorICAgICAgb2Zmc2V0WCwKKyAgICAgIG9mZnNldFksCisgICAgICBkb250RmxpcAorICAgIH0pOworICB9CisKKyAgZ2V0QW5ub3RhdGlvbnMoeworICAgIGludGVudCA9IG51bGwKKyAgfSA9IHt9KSB7CisgICAgaWYgKCF0aGlzLmFubm90YXRpb25zUHJvbWlzZSB8fCB0aGlzLmFubm90YXRpb25zSW50ZW50ICE9PSBpbnRlbnQpIHsKKyAgICAgIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlID0gdGhpcy5fdHJhbnNwb3J0LmdldEFubm90YXRpb25zKHRoaXMuX3BhZ2VJbmRleCwgaW50ZW50KTsKKyAgICAgIHRoaXMuYW5ub3RhdGlvbnNJbnRlbnQgPSBpbnRlbnQ7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlOworICB9CisKKyAgcmVuZGVyKHsKKyAgICBjYW52YXNDb250ZXh0LAorICAgIHZpZXdwb3J0LAorICAgIGludGVudCA9ICJkaXNwbGF5IiwKKyAgICBlbmFibGVXZWJHTCA9IGZhbHNlLAorICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSBmYWxzZSwKKyAgICB0cmFuc2Zvcm0gPSBudWxsLAorICAgIGltYWdlTGF5ZXIgPSBudWxsLAorICAgIGNhbnZhc0ZhY3RvcnkgPSBudWxsLAorICAgIGJhY2tncm91bmQgPSBudWxsLAorICAgIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCwKKyAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gbnVsbAorICB9KSB7CisgICAgaWYgKHRoaXMuX3N0YXRzKSB7CisgICAgICB0aGlzLl9zdGF0cy50aW1lKCJPdmVyYWxsIik7CisgICAgfQorCisgICAgY29uc3QgcmVuZGVyaW5nSW50ZW50ID0gaW50ZW50ID09PSAicHJpbnQiID8gInByaW50IiA6ICJkaXNwbGF5IjsKKyAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gZmFsc2U7CisKKyAgICBpZiAoIW9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UpIHsKKyAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7CisgICAgfQorCisgICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChyZW5kZXJpbmdJbnRlbnQpOworCisgICAgaWYgKCFpbnRlbnRTdGF0ZSkgeworICAgICAgaW50ZW50U3RhdGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KHJlbmRlcmluZ0ludGVudCwgaW50ZW50U3RhdGUpOworICAgIH0KKworICAgIGlmIChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KSB7CisgICAgICBjbGVhclRpbWVvdXQoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCk7CisgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCBjYW52YXNGYWN0b3J5SW5zdGFuY2UgPSBjYW52YXNGYWN0b3J5IHx8IG5ldyBEZWZhdWx0Q2FudmFzRmFjdG9yeSh7CisgICAgICBvd25lckRvY3VtZW50OiB0aGlzLl9vd25lckRvY3VtZW50CisgICAgfSk7CisgICAgY29uc3Qgd2ViR0xDb250ZXh0ID0gbmV3IF93ZWJnbC5XZWJHTENvbnRleHQoeworICAgICAgZW5hYmxlOiBlbmFibGVXZWJHTAorICAgIH0pOworCisgICAgaWYgKCFpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7CisgICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0ID0geworICAgICAgICBmbkFycmF5OiBbXSwKKyAgICAgICAgYXJnc0FycmF5OiBbXSwKKyAgICAgICAgbGFzdENodW5rOiBmYWxzZQorICAgICAgfTsKKworICAgICAgaWYgKHRoaXMuX3N0YXRzKSB7CisgICAgICAgIHRoaXMuX3N0YXRzLnRpbWUoIlBhZ2UgUmVxdWVzdCIpOworICAgICAgfQorCisgICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KHsKKyAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsCisgICAgICAgIGludGVudDogcmVuZGVyaW5nSW50ZW50LAorICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID09PSB0cnVlLAorICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogYW5ub3RhdGlvblN0b3JhZ2UgJiYgYW5ub3RhdGlvblN0b3JhZ2UuZ2V0QWxsKCkgfHwgbnVsbAorICAgICAgfSk7CisgICAgfQorCisgICAgY29uc3QgY29tcGxldGUgPSBlcnJvciA9PiB7CisgICAgICBjb25zdCBpID0gaW50ZW50U3RhdGUucmVuZGVyVGFza3MuaW5kZXhPZihpbnRlcm5hbFJlbmRlclRhc2spOworCisgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLnNwbGljZShpLCAxKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuY2xlYW51cEFmdGVyUmVuZGVyIHx8IHJlbmRlcmluZ0ludGVudCA9PT0gInByaW50IikgeworICAgICAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fdHJ5Q2xlYW51cCgpOworCisgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucmVqZWN0KGVycm9yKTsKKworICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7CisgICAgICAgICAgaW50ZW50U3RhdGUsCisgICAgICAgICAgcmVhc29uOiBlcnJvcgorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3N0YXRzKSB7CisgICAgICAgIHRoaXMuX3N0YXRzLnRpbWVFbmQoIlJlbmRlcmluZyIpOworCisgICAgICAgIHRoaXMuX3N0YXRzLnRpbWVFbmQoIk92ZXJhbGwiKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7CisgICAgICBjYWxsYmFjazogY29tcGxldGUsCisgICAgICBwYXJhbXM6IHsKKyAgICAgICAgY2FudmFzQ29udGV4dCwKKyAgICAgICAgdmlld3BvcnQsCisgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgaW1hZ2VMYXllciwKKyAgICAgICAgYmFja2dyb3VuZAorICAgICAgfSwKKyAgICAgIG9ianM6IHRoaXMub2JqcywKKyAgICAgIGNvbW1vbk9ianM6IHRoaXMuY29tbW9uT2JqcywKKyAgICAgIG9wZXJhdG9yTGlzdDogaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LAorICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsCisgICAgICBjYW52YXNGYWN0b3J5OiBjYW52YXNGYWN0b3J5SW5zdGFuY2UsCisgICAgICB3ZWJHTENvbnRleHQsCisgICAgICB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IHJlbmRlcmluZ0ludGVudCAhPT0gInByaW50IiwKKyAgICAgIHBkZkJ1ZzogdGhpcy5fcGRmQnVnCisgICAgfSk7CisKKyAgICBpZiAoIWludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7CisgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcyA9IFtdOworICAgIH0KKworICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLnB1c2goaW50ZXJuYWxSZW5kZXJUYXNrKTsKKyAgICBjb25zdCByZW5kZXJUYXNrID0gaW50ZXJuYWxSZW5kZXJUYXNrLnRhc2s7CisgICAgUHJvbWlzZS5hbGwoW2ludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucHJvbWlzZSwgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZV0pLnRoZW4oKFt0cmFuc3BhcmVuY3ksIG9wdGlvbmFsQ29udGVudENvbmZpZ10pID0+IHsKKyAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGVhbnVwKSB7CisgICAgICAgIGNvbXBsZXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3N0YXRzKSB7CisgICAgICAgIHRoaXMuX3N0YXRzLnRpbWUoIlJlbmRlcmluZyIpOworICAgICAgfQorCisgICAgICBpbnRlcm5hbFJlbmRlclRhc2suaW5pdGlhbGl6ZUdyYXBoaWNzKHsKKyAgICAgICAgdHJhbnNwYXJlbmN5LAorICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWcKKyAgICAgIH0pOworICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTsKKyAgICB9KS5jYXRjaChjb21wbGV0ZSk7CisgICAgcmV0dXJuIHJlbmRlclRhc2s7CisgIH0KKworICBnZXRPcGVyYXRvckxpc3QoKSB7CisgICAgZnVuY3Rpb24gb3BlcmF0b3JMaXN0Q2hhbmdlZCgpIHsKKyAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7CisgICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlc29sdmUoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KTsKKyAgICAgICAgY29uc3QgaSA9IGludGVudFN0YXRlLnJlbmRlclRhc2tzLmluZGV4T2Yob3BMaXN0VGFzayk7CisKKyAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLnNwbGljZShpLCAxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHJlbmRlcmluZ0ludGVudCA9ICJvcGxpc3QiOworCisgICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChyZW5kZXJpbmdJbnRlbnQpOworCisgICAgaWYgKCFpbnRlbnRTdGF0ZSkgeworICAgICAgaW50ZW50U3RhdGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KHJlbmRlcmluZ0ludGVudCwgaW50ZW50U3RhdGUpOworICAgIH0KKworICAgIGxldCBvcExpc3RUYXNrOworCisgICAgaWYgKCFpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSkgeworICAgICAgb3BMaXN0VGFzayA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICBvcExpc3RUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQgPSBvcGVyYXRvckxpc3RDaGFuZ2VkOworICAgICAgaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcyA9IFtdOworICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MucHVzaChvcExpc3RUYXNrKTsKKyAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHsKKyAgICAgICAgZm5BcnJheTogW10sCisgICAgICAgIGFyZ3NBcnJheTogW10sCisgICAgICAgIGxhc3RDaHVuazogZmFsc2UKKyAgICAgIH07CisKKyAgICAgIGlmICh0aGlzLl9zdGF0cykgeworICAgICAgICB0aGlzLl9zdGF0cy50aW1lKCJQYWdlIFJlcXVlc3QiKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdCh7CisgICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LAorICAgICAgICBpbnRlbnQ6IHJlbmRlcmluZ0ludGVudAorICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBzdHJlYW1UZXh0Q29udGVudCh7CisgICAgbm9ybWFsaXplV2hpdGVzcGFjZSA9IGZhbHNlLAorICAgIGRpc2FibGVDb21iaW5lVGV4dEl0ZW1zID0gZmFsc2UKKyAgfSA9IHt9KSB7CisgICAgY29uc3QgVEVYVF9DT05URU5UX0NIVU5LX1NJWkUgPSAxMDA7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0VGV4dENvbnRlbnQiLCB7CisgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCwKKyAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2U6IG5vcm1hbGl6ZVdoaXRlc3BhY2UgPT09IHRydWUsCisgICAgICBjb21iaW5lVGV4dEl0ZW1zOiBkaXNhYmxlQ29tYmluZVRleHRJdGVtcyAhPT0gdHJ1ZQorICAgIH0sIHsKKyAgICAgIGhpZ2hXYXRlck1hcms6IFRFWFRfQ09OVEVOVF9DSFVOS19TSVpFLAorCisgICAgICBzaXplKHRleHRDb250ZW50KSB7CisgICAgICAgIHJldHVybiB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7CisgICAgICB9CisKKyAgICB9KTsKKyAgfQorCisgIGdldFRleHRDb250ZW50KHBhcmFtcyA9IHt9KSB7CisgICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLnN0cmVhbVRleHRDb250ZW50KHBhcmFtcyk7CisgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIGZ1bmN0aW9uIHB1bXAoKSB7CisgICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoeworICAgICAgICAgIHZhbHVlLAorICAgICAgICAgIGRvbmUKKyAgICAgICAgfSkgeworICAgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICByZXNvbHZlKHRleHRDb250ZW50KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBPYmplY3QuYXNzaWduKHRleHRDb250ZW50LnN0eWxlcywgdmFsdWUuc3R5bGVzKTsKKyAgICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKC4uLnZhbHVlLml0ZW1zKTsKKyAgICAgICAgICBwdW1wKCk7CisgICAgICAgIH0sIHJlamVjdCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOworICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSB7CisgICAgICAgIGl0ZW1zOiBbXSwKKyAgICAgICAgc3R5bGVzOiBPYmplY3QuY3JlYXRlKG51bGwpCisgICAgICB9OworICAgICAgcHVtcCgpOworICAgIH0pOworICB9CisKKyAgX2Rlc3Ryb3koKSB7CisgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlOworICAgIHRoaXMuX3RyYW5zcG9ydC5wYWdlQ2FjaGVbdGhpcy5fcGFnZUluZGV4XSA9IG51bGw7CisgICAgY29uc3Qgd2FpdE9uID0gW107CisKKyAgICBmb3IgKGNvbnN0IFtpbnRlbnQsIGludGVudFN0YXRlXSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMpIHsKKyAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgaW50ZW50U3RhdGUsCisgICAgICAgIHJlYXNvbjogbmV3IEVycm9yKCJQYWdlIHdhcyBkZXN0cm95ZWQuIiksCisgICAgICAgIGZvcmNlOiB0cnVlCisgICAgICB9KTsKKworICAgICAgaWYgKGludGVudCA9PT0gIm9wbGlzdCIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZvciAoY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrIG9mIGludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7CisgICAgICAgIHdhaXRPbi5wdXNoKGludGVybmFsUmVuZGVyVGFzay5jb21wbGV0ZWQpOworICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKCk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5vYmpzLmNsZWFyKCk7CisgICAgdGhpcy5hbm5vdGF0aW9uc1Byb21pc2UgPSBudWxsOworICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTsKKyAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKTsKKyAgfQorCisgIGNsZWFudXAocmVzZXRTdGF0cyA9IGZhbHNlKSB7CisgICAgdGhpcy5wZW5kaW5nQ2xlYW51cCA9IHRydWU7CisgICAgcmV0dXJuIHRoaXMuX3RyeUNsZWFudXAocmVzZXRTdGF0cyk7CisgIH0KKworICBfdHJ5Q2xlYW51cChyZXNldFN0YXRzID0gZmFsc2UpIHsKKyAgICBpZiAoIXRoaXMucGVuZGluZ0NsZWFudXApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IHsKKyAgICAgIHJlbmRlclRhc2tzLAorICAgICAgb3BlcmF0b3JMaXN0CisgICAgfSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpIHsKKyAgICAgIGlmIChyZW5kZXJUYXNrcy5sZW5ndGggIT09IDAgfHwgIW9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpOworCisgICAgdGhpcy5vYmpzLmNsZWFyKCk7CisgICAgdGhpcy5hbm5vdGF0aW9uc1Byb21pc2UgPSBudWxsOworCisgICAgaWYgKHJlc2V0U3RhdHMgJiYgdGhpcy5fc3RhdHMpIHsKKyAgICAgIHRoaXMuX3N0YXRzID0gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpOworICAgIH0KKworICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIF9zdGFydFJlbmRlclBhZ2UodHJhbnNwYXJlbmN5LCBpbnRlbnQpIHsKKyAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoaW50ZW50KTsKKworICAgIGlmICghaW50ZW50U3RhdGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fc3RhdHMpIHsKKyAgICAgIHRoaXMuX3N0YXRzLnRpbWVFbmQoIlBhZ2UgUmVxdWVzdCIpOworICAgIH0KKworICAgIGlmIChpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7CisgICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnJlc29sdmUodHJhbnNwYXJlbmN5KTsKKyAgICB9CisgIH0KKworICBfcmVuZGVyUGFnZUNodW5rKG9wZXJhdG9yTGlzdENodW5rLCBpbnRlbnRTdGF0ZSkgeworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wZXJhdG9yTGlzdENodW5rLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5mbkFycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuZm5BcnJheVtpXSk7CisgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuYXJnc0FycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuYXJnc0FycmF5W2ldKTsKKyAgICB9CisKKyAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gb3BlcmF0b3JMaXN0Q2h1bmsubGFzdENodW5rOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5sZW5ndGg7IGkrKykgeworICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3NbaV0ub3BlcmF0b3JMaXN0Q2hhbmdlZCgpOworICAgIH0KKworICAgIGlmIChvcGVyYXRvckxpc3RDaHVuay5sYXN0Q2h1bmspIHsKKyAgICAgIHRoaXMuX3RyeUNsZWFudXAoKTsKKyAgICB9CisgIH0KKworICBfcHVtcE9wZXJhdG9yTGlzdChhcmdzKSB7CisgICAgKDAsIF91dGlsLmFzc2VydCkoYXJncy5pbnRlbnQsICdQREZQYWdlUHJveHkuX3B1bXBPcGVyYXRvckxpc3Q6IEV4cGVjdGVkICJpbnRlbnQiIGFyZ3VtZW50LicpOworCisgICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldE9wZXJhdG9yTGlzdCIsIGFyZ3MpOworCisgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CisKKyAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoYXJncy5pbnRlbnQpOworCisgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gcmVhZGVyOworCisgICAgY29uc3QgcHVtcCA9ICgpID0+IHsKKyAgICAgIHJlYWRlci5yZWFkKCkudGhlbigoeworICAgICAgICB2YWx1ZSwKKyAgICAgICAgZG9uZQorICAgICAgfSkgPT4geworICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IG51bGw7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9yZW5kZXJQYWdlQ2h1bmsodmFsdWUsIGludGVudFN0YXRlKTsKKworICAgICAgICBwdW1wKCk7CisgICAgICB9LCByZWFzb24gPT4geworICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsOworCisgICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCkgeworICAgICAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSB0cnVlOworCisgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3NbaV0ub3BlcmF0b3JMaXN0Q2hhbmdlZCgpOworICAgICAgICAgIH0KKworICAgICAgICAgIHRoaXMuX3RyeUNsZWFudXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7CisgICAgICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSkgeworICAgICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfTsKKworICAgIHB1bXAoKTsKKyAgfQorCisgIF9hYm9ydE9wZXJhdG9yTGlzdCh7CisgICAgaW50ZW50U3RhdGUsCisgICAgcmVhc29uLAorICAgIGZvcmNlID0gZmFsc2UKKyAgfSkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiByZWFzb24gPT09ICJvYmplY3QiICYmIHJlYXNvbiAhPT0gbnVsbCwgJ1BERlBhZ2VQcm94eS5fYWJvcnRPcGVyYXRvckxpc3Q6IEV4cGVjdGVkICJyZWFzb24iIGFyZ3VtZW50LicpOworCisgICAgaWYgKCFpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWZvcmNlKSB7CisgICAgICBpZiAoaW50ZW50U3RhdGUucmVuZGVyVGFza3MubGVuZ3RoICE9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikgeworICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CisgICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3QoeworICAgICAgICAgICAgaW50ZW50U3RhdGUsCisgICAgICAgICAgICByZWFzb24sCisgICAgICAgICAgICBmb3JjZTogdHJ1ZQorICAgICAgICAgIH0pOworCisgICAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7CisgICAgICAgIH0sIFJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihyZWFzb24gJiYgcmVhc29uLm1lc3NhZ2UpKTsKKyAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsOworCisgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IFtpbnRlbnQsIGN1ckludGVudFN0YXRlXSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMpIHsKKyAgICAgIGlmIChjdXJJbnRlbnRTdGF0ZSA9PT0gaW50ZW50U3RhdGUpIHsKKyAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzLmRlbGV0ZShpbnRlbnQpOworCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuY2xlYW51cCgpOworICB9CisKKyAgZ2V0IHN0YXRzKCkgeworICAgIHJldHVybiB0aGlzLl9zdGF0czsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGUGFnZVByb3h5ID0gUERGUGFnZVByb3h5OworCitjbGFzcyBMb29wYmFja1BvcnQgeworICBjb25zdHJ1Y3RvcihkZWZlciA9IHRydWUpIHsKKyAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKKyAgICB0aGlzLl9kZWZlciA9IGRlZmVyOworICAgIHRoaXMuX2RlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7CisgIH0KKworICBwb3N0TWVzc2FnZShvYmosIHRyYW5zZmVycykgeworICAgIGZ1bmN0aW9uIGNsb25lVmFsdWUodmFsdWUpIHsKKyAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJvYmplY3QiIHx8IHZhbHVlID09PSBudWxsKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNsb25lZC5oYXModmFsdWUpKSB7CisgICAgICAgIHJldHVybiBjbG9uZWQuZ2V0KHZhbHVlKTsKKyAgICAgIH0KKworICAgICAgbGV0IGJ1ZmZlciwgcmVzdWx0OworCisgICAgICBpZiAoKGJ1ZmZlciA9IHZhbHVlLmJ1ZmZlcikgJiYgKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKGJ1ZmZlcikpIHsKKyAgICAgICAgY29uc3QgdHJhbnNmZXJhYmxlID0gdHJhbnNmZXJzICYmIHRyYW5zZmVycy5pbmNsdWRlcyhidWZmZXIpOworCisgICAgICAgIGlmICh0cmFuc2ZlcmFibGUpIHsKKyAgICAgICAgICByZXN1bHQgPSBuZXcgdmFsdWUuY29uc3RydWN0b3IoYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQgPSBuZXcgdmFsdWUuY29uc3RydWN0b3IodmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgY2xvbmVkLnNldCh2YWx1ZSwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKworICAgICAgcmVzdWx0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbXSA6IHt9OworICAgICAgY2xvbmVkLnNldCh2YWx1ZSwgcmVzdWx0KTsKKworICAgICAgZm9yIChjb25zdCBpIGluIHZhbHVlKSB7CisgICAgICAgIGxldCBkZXNjLAorICAgICAgICAgICAgcCA9IHZhbHVlOworCisgICAgICAgIHdoaWxlICghKGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHAsIGkpKSkgeworICAgICAgICAgIHAgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoaSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTG9vcGJhY2tQb3J0LnBvc3RNZXNzYWdlIC0gY2Fubm90IGNsb25lOiAke3ZhbHVlW2ldfWApOworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0W2ldID0gY2xvbmVWYWx1ZShkZXNjLnZhbHVlKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2RlZmVyKSB7CisgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7CisgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgeworICAgICAgICAgIGRhdGE6IG9iagorICAgICAgICB9KTsKKyAgICAgIH0pOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2xvbmVkID0gbmV3IFdlYWtNYXAoKTsKKyAgICBjb25zdCBlID0geworICAgICAgZGF0YTogY2xvbmVWYWx1ZShvYmopCisgICAgfTsKKworICAgIHRoaXMuX2RlZmVycmVkLnRoZW4oKCkgPT4geworICAgICAgdGhpcy5fbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4geworICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGUpOworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworICBhZGRFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7CisgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOworICB9CisKKyAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikgeworICAgIGNvbnN0IGkgPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7CisKKyAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpOworICB9CisKKyAgdGVybWluYXRlKCkgeworICAgIHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPSAwOworICB9CisKK30KKworZXhwb3J0cy5Mb29wYmFja1BvcnQgPSBMb29wYmFja1BvcnQ7CisKK2NvbnN0IFBERldvcmtlciA9IGZ1bmN0aW9uIFBERldvcmtlckNsb3N1cmUoKSB7CisgIGNvbnN0IHBkZldvcmtlclBvcnRzID0gbmV3IFdlYWtNYXAoKTsKKyAgbGV0IGlzV29ya2VyRGlzYWJsZWQgPSBmYWxzZTsKKyAgbGV0IGZhbGxiYWNrV29ya2VyU3JjOworICBsZXQgbmV4dEZha2VXb3JrZXJJZCA9IDA7CisgIGxldCBmYWtlV29ya2VyQ2FwYWJpbGl0eTsKKworICBpZiAoX2lzX25vZGUuaXNOb2RlSlMgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICJmdW5jdGlvbiIpIHsKKyAgICBpc1dvcmtlckRpc2FibGVkID0gdHJ1ZTsKKyAgICBmYWxsYmFja1dvcmtlclNyYyA9ICIuL3BkZi53b3JrZXIuanMiOworICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gIm9iamVjdCIgJiYgImN1cnJlbnRTY3JpcHQiIGluIGRvY3VtZW50KSB7CisgICAgY29uc3QgcGRmanNGaWxlUGF0aCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CisKKyAgICBpZiAocGRmanNGaWxlUGF0aCkgeworICAgICAgZmFsbGJhY2tXb3JrZXJTcmMgPSBwZGZqc0ZpbGVQYXRoLnJlcGxhY2UoLyhcLig/Om1pblwuKT9qcykoXD8uKik/JC9pLCAiLndvcmtlciQxJDIiKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZXRXb3JrZXJTcmMoKSB7CisgICAgaWYgKF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYykgeworICAgICAgcmV0dXJuIF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYzsKKyAgICB9CisKKyAgICBpZiAodHlwZW9mIGZhbGxiYWNrV29ya2VyU3JjICE9PSAidW5kZWZpbmVkIikgeworICAgICAgaWYgKCFfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuZGVwcmVjYXRlZCkoJ05vICJHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyIgc3BlY2lmaWVkLicpOworICAgICAgfQorCisgICAgICByZXR1cm4gZmFsbGJhY2tXb3JrZXJTcmM7CisgICAgfQorCisgICAgdGhyb3cgbmV3IEVycm9yKCdObyAiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMiIHNwZWNpZmllZC4nKTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldE1haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpIHsKKyAgICBsZXQgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyOworCisgICAgdHJ5IHsKKyAgICAgIG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IGdsb2JhbFRoaXMucGRmanNXb3JrZXIgJiYgZ2xvYmFsVGhpcy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjsKKyAgICB9IGNhdGNoIChleCkge30KKworICAgIHJldHVybiBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIgfHwgbnVsbDsKKyAgfQorCisgIGZ1bmN0aW9uIHNldHVwRmFrZVdvcmtlckdsb2JhbCgpIHsKKyAgICBpZiAoZmFrZVdvcmtlckNhcGFiaWxpdHkpIHsKKyAgICAgIHJldHVybiBmYWtlV29ya2VyQ2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0KKworICAgIGZha2VXb3JrZXJDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgY29uc3QgbG9hZGVyID0gYXN5bmMgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyID0gZ2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCk7CisKKyAgICAgIGlmIChtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcjsKKyAgICAgIH0KKworICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiByZXF1aXJlID09PSAiZnVuY3Rpb24iKSB7CisgICAgICAgIGNvbnN0IHdvcmtlciA9IGV2YWwoInJlcXVpcmUiKShnZXRXb3JrZXJTcmMoKSk7CisgICAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7CisgICAgICB9CisKKyAgICAgIGF3YWl0ICgwLCBfZGlzcGxheV91dGlscy5sb2FkU2NyaXB0KShnZXRXb3JrZXJTcmMoKSk7CisgICAgICByZXR1cm4gd2luZG93LnBkZmpzV29ya2VyLldvcmtlck1lc3NhZ2VIYW5kbGVyOworICAgIH07CisKKyAgICBsb2FkZXIoKS50aGVuKGZha2VXb3JrZXJDYXBhYmlsaXR5LnJlc29sdmUsIGZha2VXb3JrZXJDYXBhYmlsaXR5LnJlamVjdCk7CisgICAgcmV0dXJuIGZha2VXb3JrZXJDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVDRE5XcmFwcGVyKHVybCkgeworICAgIGNvbnN0IHdyYXBwZXIgPSAiaW1wb3J0U2NyaXB0cygnIiArIHVybCArICInKTsiOworICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt3cmFwcGVyXSkpOworICB9CisKKyAgY2xhc3MgUERGV29ya2VyIHsKKyAgICBjb25zdHJ1Y3Rvcih7CisgICAgICBuYW1lID0gbnVsbCwKKyAgICAgIHBvcnQgPSBudWxsLAorICAgICAgdmVyYm9zaXR5ID0gKDAsIF91dGlsLmdldFZlcmJvc2l0eUxldmVsKSgpCisgICAgfSA9IHt9KSB7CisgICAgICBpZiAocG9ydCAmJiBwZGZXb3JrZXJQb3J0cy5oYXMocG9ydCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXNlIG1vcmUgdGhhbiBvbmUgUERGV29ya2VyIHBlciBwb3J0Iik7CisgICAgICB9CisKKyAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOworICAgICAgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHRydWU7CisgICAgICB0aGlzLnZlcmJvc2l0eSA9IHZlcmJvc2l0eTsKKyAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHRoaXMuX3BvcnQgPSBudWxsOworICAgICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDsKKyAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbnVsbDsKKworICAgICAgaWYgKHBvcnQpIHsKKyAgICAgICAgcGRmV29ya2VyUG9ydHMuc2V0KHBvcnQsIHRoaXMpOworCisgICAgICAgIHRoaXMuX2luaXRpYWxpemVGcm9tUG9ydChwb3J0KTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2luaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBnZXQgcHJvbWlzZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9CisKKyAgICBnZXQgcG9ydCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wb3J0OworICAgIH0KKworICAgIGdldCBtZXNzYWdlSGFuZGxlcigpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGFuZGxlcjsKKyAgICB9CisKKyAgICBfaW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpIHsKKyAgICAgIHRoaXMuX3BvcnQgPSBwb3J0OworICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcigibWFpbiIsICJ3b3JrZXIiLCBwb3J0KTsKKworICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIub24oInJlYWR5IiwgZnVuY3Rpb24gKCkge30pOworCisgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIH0KKworICAgIF9pbml0aWFsaXplKCkgeworICAgICAgaWYgKHR5cGVvZiBXb3JrZXIgIT09ICJ1bmRlZmluZWQiICYmICFpc1dvcmtlckRpc2FibGVkICYmICFnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKSkgeworICAgICAgICBsZXQgd29ya2VyU3JjID0gZ2V0V29ya2VyU3JjKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoISgwLCBfdXRpbC5pc1NhbWVPcmlnaW4pKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCB3b3JrZXJTcmMpKSB7CisgICAgICAgICAgICB3b3JrZXJTcmMgPSBjcmVhdGVDRE5XcmFwcGVyKG5ldyBVUkwod29ya2VyU3JjLCB3aW5kb3cubG9jYXRpb24pLmhyZWYpOworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyU3JjKTsKKyAgICAgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJtYWluIiwgIndvcmtlciIsIHdvcmtlcik7CisKKyAgICAgICAgICBjb25zdCB0ZXJtaW5hdGVFYXJseSA9ICgpID0+IHsKKyAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsIG9uV29ya2VyRXJyb3IpOworICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpOworICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpOworCisgICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKworICAgICAgICAgIGNvbnN0IG9uV29ya2VyRXJyb3IgPSAoKSA9PiB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX3dlYldvcmtlcikgeworICAgICAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisKKyAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBvbldvcmtlckVycm9yKTsKKyAgICAgICAgICBtZXNzYWdlSGFuZGxlci5vbigidGVzdCIsIGRhdGEgPT4geworICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIiwgb25Xb3JrZXJFcnJvcik7CisKKyAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7CisgICAgICAgICAgICAgIHRoaXMuX3BvcnQgPSB3b3JrZXI7CisgICAgICAgICAgICAgIHRoaXMuX3dlYldvcmtlciA9IHdvcmtlcjsKKworICAgICAgICAgICAgICBpZiAoIWRhdGEuc3VwcG9ydFRyYW5zZmVycykgeworICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZCgiY29uZmlndXJlIiwgeworICAgICAgICAgICAgICAgIHZlcmJvc2l0eTogdGhpcy52ZXJib3NpdHkKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTsKKworICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7CisgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgICBtZXNzYWdlSGFuZGxlci5vbigicmVhZHkiLCBkYXRhID0+IHsKKyAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsIG9uV29ya2VyRXJyb3IpOworCisgICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgdGVybWluYXRlRWFybHkoKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBzZW5kVGVzdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKworICAgICAgICAgIGNvbnN0IHNlbmRUZXN0ID0gKCkgPT4geworICAgICAgICAgICAgY29uc3QgdGVzdE9iaiA9IG5ldyBVaW50OEFycmF5KFt0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzID8gMjU1IDogMF0pOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKCJ0ZXN0IiwgdGVzdE9iaiwgW3Rlc3RPYmouYnVmZmVyXSk7CisgICAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkNhbm5vdCB1c2UgcG9zdE1lc3NhZ2UgdHJhbnNmZXJzLiIpOworICAgICAgICAgICAgICB0ZXN0T2JqWzBdID0gMDsKKyAgICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZCgidGVzdCIsIHRlc3RPYmopOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisKKyAgICAgICAgICBzZW5kVGVzdCgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVGhlIHdvcmtlciBoYXMgYmVlbiBkaXNhYmxlZC4iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTsKKyAgICB9CisKKyAgICBfc2V0dXBGYWtlV29ya2VyKCkgeworICAgICAgaWYgKCFpc1dvcmtlckRpc2FibGVkKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiU2V0dGluZyB1cCBmYWtlIHdvcmtlci4iKTsKKyAgICAgICAgaXNXb3JrZXJEaXNhYmxlZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHNldHVwRmFrZVdvcmtlckdsb2JhbCgpLnRoZW4oV29ya2VyTWVzc2FnZUhhbmRsZXIgPT4geworICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKSk7CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBwb3J0ID0gbmV3IExvb3BiYWNrUG9ydCgpOworICAgICAgICB0aGlzLl9wb3J0ID0gcG9ydDsKKyAgICAgICAgY29uc3QgaWQgPSAiZmFrZSIgKyBuZXh0RmFrZVdvcmtlcklkKys7CisgICAgICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihpZCArICJfd29ya2VyIiwgaWQsIHBvcnQpOworICAgICAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cCh3b3JrZXJIYW5kbGVyLCBwb3J0KTsKKyAgICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihpZCwgaWQgKyAiX3dvcmtlciIsIHBvcnQpOworICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyOworCisgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZCgiY29uZmlndXJlIiwgeworICAgICAgICAgIHZlcmJvc2l0eTogdGhpcy52ZXJib3NpdHkKKyAgICAgICAgfSk7CisgICAgICB9KS5jYXRjaChyZWFzb24gPT4geworICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihgU2V0dGluZyB1cCBmYWtlIHdvcmtlciBmYWlsZWQ6ICIke3JlYXNvbi5tZXNzYWdlfSIuYCkpOworICAgICAgfSk7CisgICAgfQorCisgICAgZGVzdHJveSgpIHsKKyAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKKworICAgICAgaWYgKHRoaXMuX3dlYldvcmtlcikgeworICAgICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7CisKKyAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgcGRmV29ya2VyUG9ydHMuZGVsZXRlKHRoaXMuX3BvcnQpOworICAgICAgdGhpcy5fcG9ydCA9IG51bGw7CisKKyAgICAgIGlmICh0aGlzLl9tZXNzYWdlSGFuZGxlcikgeworICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7CisKKyAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmcm9tUG9ydChwYXJhbXMpIHsKKyAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMucG9ydCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBkZldvcmtlclBvcnRzLmhhcyhwYXJhbXMucG9ydCkpIHsKKyAgICAgICAgcmV0dXJuIHBkZldvcmtlclBvcnRzLmdldChwYXJhbXMucG9ydCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgUERGV29ya2VyKHBhcmFtcyk7CisgICAgfQorCisgICAgc3RhdGljIGdldFdvcmtlclNyYygpIHsKKyAgICAgIHJldHVybiBnZXRXb3JrZXJTcmMoKTsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiBQREZXb3JrZXI7Cit9KCk7CisKK2V4cG9ydHMuUERGV29ya2VyID0gUERGV29ya2VyOworCitjbGFzcyBXb3JrZXJUcmFuc3BvcnQgeworICBjb25zdHJ1Y3RvcihtZXNzYWdlSGFuZGxlciwgbG9hZGluZ1Rhc2ssIG5ldHdvcmtTdHJlYW0sIHBhcmFtcykgeworICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjsKKyAgICB0aGlzLmxvYWRpbmdUYXNrID0gbG9hZGluZ1Rhc2s7CisgICAgdGhpcy5jb21tb25PYmpzID0gbmV3IFBERk9iamVjdHMoKTsKKyAgICB0aGlzLmZvbnRMb2FkZXIgPSBuZXcgX2ZvbnRfbG9hZGVyLkZvbnRMb2FkZXIoeworICAgICAgZG9jSWQ6IGxvYWRpbmdUYXNrLmRvY0lkLAorICAgICAgb25VbnN1cHBvcnRlZEZlYXR1cmU6IHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlLmJpbmQodGhpcyksCisgICAgICBvd25lckRvY3VtZW50OiBwYXJhbXMub3duZXJEb2N1bWVudAorICAgIH0pOworICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtczsKKyAgICB0aGlzLkNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IHBhcmFtcy5DTWFwUmVhZGVyRmFjdG9yeSh7CisgICAgICBiYXNlVXJsOiBwYXJhbXMuY01hcFVybCwKKyAgICAgIGlzQ29tcHJlc3NlZDogcGFyYW1zLmNNYXBQYWNrZWQKKyAgICB9KTsKKyAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOworICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBudWxsOworICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSA9IG51bGw7CisgICAgdGhpcy5fbmV0d29ya1N0cmVhbSA9IG5ldHdvcmtTdHJlYW07CisgICAgdGhpcy5fZnVsbFJlYWRlciA9IG51bGw7CisgICAgdGhpcy5fbGFzdFByb2dyZXNzID0gbnVsbDsKKyAgICB0aGlzLnBhZ2VDYWNoZSA9IFtdOworICAgIHRoaXMucGFnZVByb21pc2VzID0gW107CisgICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpOworICB9CisKKyAgZGVzdHJveSgpIHsKKyAgICBpZiAodGhpcy5kZXN0cm95Q2FwYWJpbGl0eSkgeworICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9CisKKyAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7CisgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKworICAgIGlmICh0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkpIHsKKyAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCBkdXJpbmcgb25QYXNzd29yZCBjYWxsYmFjayIpKTsKKyAgICB9CisKKyAgICBjb25zdCB3YWl0T24gPSBbXTsKKyAgICB0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICBpZiAocGFnZSkgeworICAgICAgICB3YWl0T24ucHVzaChwYWdlLl9kZXN0cm95KCkpOworICAgICAgfQorICAgIH0pOworICAgIHRoaXMucGFnZUNhY2hlLmxlbmd0aCA9IDA7CisgICAgdGhpcy5wYWdlUHJvbWlzZXMubGVuZ3RoID0gMDsKKyAgICBjb25zdCB0ZXJtaW5hdGVkID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlRlcm1pbmF0ZSIsIG51bGwpOworICAgIHdhaXRPbi5wdXNoKHRlcm1pbmF0ZWQpOworICAgIFByb21pc2UuYWxsKHdhaXRPbikudGhlbigoKSA9PiB7CisgICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTsKKworICAgICAgaWYgKHRoaXMuX25ldHdvcmtTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5fbmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7CisgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpOworICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgfSwgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZWplY3QpOworICAgIHJldHVybiB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBzZXR1cE1lc3NhZ2VIYW5kbGVyKCkgeworICAgIGNvbnN0IHsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLAorICAgICAgbG9hZGluZ1Rhc2sKKyAgICB9ID0gdGhpczsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigiR2V0UmVhZGVyIiwgKGRhdGEsIHNpbmspID0+IHsKKyAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuX25ldHdvcmtTdHJlYW0sICJHZXRSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLiIpOworICAgICAgdGhpcy5fZnVsbFJlYWRlciA9IHRoaXMuX25ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlcigpOworCisgICAgICB0aGlzLl9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSBldnQgPT4geworICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSB7CisgICAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLAorICAgICAgICAgIHRvdGFsOiBldnQudG90YWwKKyAgICAgICAgfTsKKyAgICAgIH07CisKKyAgICAgIHNpbmsub25QdWxsID0gKCkgPT4geworICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh7CisgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgZG9uZQorICAgICAgICB9KSB7CisgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgIHNpbmsuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSgoMCwgX3V0aWwuaXNBcnJheUJ1ZmZlcikodmFsdWUpLCAiR2V0UmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuIik7CisgICAgICAgICAgc2luay5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSwgMSwgW3ZhbHVlXSk7CisgICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICAgICAgc2luay5lcnJvcihyZWFzb24pOworICAgICAgICB9KTsKKyAgICAgIH07CisKKyAgICAgIHNpbmsub25DYW5jZWwgPSByZWFzb24gPT4geworICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLmNhbmNlbChyZWFzb24pOworCisgICAgICAgIHNpbmsucmVhZHkuY2F0Y2gocmVhZHlSZWFzb24gPT4geworICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uOworICAgICAgICB9KTsKKyAgICAgIH07CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIlJlYWRlckhlYWRlcnNSZWFkeSIsIGRhdGEgPT4geworICAgICAgY29uc3QgaGVhZGVyc0NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICBjb25zdCBmdWxsUmVhZGVyID0gdGhpcy5fZnVsbFJlYWRlcjsKKyAgICAgIGZ1bGxSZWFkZXIuaGVhZGVyc1JlYWR5LnRoZW4oKCkgPT4geworICAgICAgICBpZiAoIWZ1bGxSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQgfHwgIWZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZCkgeworICAgICAgICAgIGlmICh0aGlzLl9sYXN0UHJvZ3Jlc3MgJiYgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcykgeworICAgICAgICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcyh0aGlzLl9sYXN0UHJvZ3Jlc3MpOworICAgICAgICAgIH0KKworICAgICAgICAgIGZ1bGxSZWFkZXIub25Qcm9ncmVzcyA9IGV2dCA9PiB7CisgICAgICAgICAgICBpZiAobG9hZGluZ1Rhc2sub25Qcm9ncmVzcykgeworICAgICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHsKKyAgICAgICAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsCisgICAgICAgICAgICAgICAgdG90YWw6IGV2dC50b3RhbAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgaGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgICAgaXNTdHJlYW1pbmdTdXBwb3J0ZWQ6IGZ1bGxSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQsCisgICAgICAgICAgaXNSYW5nZVN1cHBvcnRlZDogZnVsbFJlYWRlci5pc1JhbmdlU3VwcG9ydGVkLAorICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGZ1bGxSZWFkZXIuY29udGVudExlbmd0aAorICAgICAgICB9KTsKKyAgICAgIH0sIGhlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7CisgICAgICByZXR1cm4gaGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9KTsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigiR2V0UmFuZ2VSZWFkZXIiLCAoZGF0YSwgc2luaykgPT4geworICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5fbmV0d29ya1N0cmVhbSwgIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS4iKTsKKworICAgICAgY29uc3QgcmFuZ2VSZWFkZXIgPSB0aGlzLl9uZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKGRhdGEuYmVnaW4sIGRhdGEuZW5kKTsKKworICAgICAgaWYgKCFyYW5nZVJlYWRlcikgeworICAgICAgICBzaW5rLmNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7CisgICAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh7CisgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgZG9uZQorICAgICAgICB9KSB7CisgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgIHNpbmsuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSgoMCwgX3V0aWwuaXNBcnJheUJ1ZmZlcikodmFsdWUpLCAiR2V0UmFuZ2VSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci4iKTsKKyAgICAgICAgICBzaW5rLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpLCAxLCBbdmFsdWVdKTsKKyAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CisgICAgICAgIH0pOworICAgICAgfTsKKworICAgICAgc2luay5vbkNhbmNlbCA9IHJlYXNvbiA9PiB7CisgICAgICAgIHJhbmdlUmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgICAgICBzaW5rLnJlYWR5LmNhdGNoKHJlYWR5UmVhc29uID0+IHsKKyAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aHJvdyByZWFkeVJlYXNvbjsKKyAgICAgICAgfSk7CisgICAgICB9OworICAgIH0pOworICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJHZXREb2MiLCAoeworICAgICAgcGRmSW5mbworICAgIH0pID0+IHsKKyAgICAgIHRoaXMuX251bVBhZ2VzID0gcGRmSW5mby5udW1QYWdlczsKKworICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVzb2x2ZShuZXcgUERGRG9jdW1lbnRQcm94eShwZGZJbmZvLCB0aGlzKSk7CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIkRvY0V4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgeworICAgICAgbGV0IHJlYXNvbjsKKworICAgICAgc3dpdGNoIChleC5uYW1lKSB7CisgICAgICAgIGNhc2UgIlBhc3N3b3JkRXhjZXB0aW9uIjoKKyAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguY29kZSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiSW52YWxpZFBERkV4Y2VwdGlvbiI6CisgICAgICAgICAgcmVhc29uID0gbmV3IF91dGlsLkludmFsaWRQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiTWlzc2luZ1BERkV4Y2VwdGlvbiI6CisgICAgICAgICAgcmVhc29uID0gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjoKKyAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnN0YXR1cyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiVW5rbm93bkVycm9yRXhjZXB0aW9uIjoKKyAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmRldGFpbHMpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikpIHsKKyAgICAgICAgY29uc3QgbXNnID0gIkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuIjsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKG1zZyk7CisgICAgICB9CisKKyAgICAgIGxvYWRpbmdUYXNrLl9jYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOworICAgIH0pOworICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJQYXNzd29yZFJlcXVlc3QiLCBleGNlcHRpb24gPT4geworICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgICBpZiAobG9hZGluZ1Rhc2sub25QYXNzd29yZCkgeworICAgICAgICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IHBhc3N3b3JkID0+IHsKKyAgICAgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgICAgICBwYXNzd29yZAorICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgbG9hZGluZ1Rhc2sub25QYXNzd29yZCh1cGRhdGVQYXNzd29yZCwgZXhjZXB0aW9uLmNvZGUpOworICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QoZXgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSwgZXhjZXB0aW9uLmNvZGUpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0pOworICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJEYXRhTG9hZGVkIiwgZGF0YSA9PiB7CisgICAgICBpZiAobG9hZGluZ1Rhc2sub25Qcm9ncmVzcykgeworICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHsKKyAgICAgICAgICBsb2FkZWQ6IGRhdGEubGVuZ3RoLAorICAgICAgICAgIHRvdGFsOiBkYXRhLmxlbmd0aAorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnJlc29sdmUoZGF0YSk7CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIlN0YXJ0UmVuZGVyUGFnZSIsIGRhdGEgPT4geworICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgcGFnZSA9IHRoaXMucGFnZUNhY2hlW2RhdGEucGFnZUluZGV4XTsKKworICAgICAgcGFnZS5fc3RhcnRSZW5kZXJQYWdlKGRhdGEudHJhbnNwYXJlbmN5LCBkYXRhLmludGVudCk7CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oImNvbW1vbm9iaiIsIGRhdGEgPT4geworICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgW2lkLCB0eXBlLCBleHBvcnRlZERhdGFdID0gZGF0YTsKKworICAgICAgaWYgKHRoaXMuY29tbW9uT2Jqcy5oYXMoaWQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgIkZvbnQiOgorICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcmFtczsKKworICAgICAgICAgIGlmICgiZXJyb3IiIGluIGV4cG9ydGVkRGF0YSkgeworICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRFcnJvciA9IGV4cG9ydGVkRGF0YS5lcnJvcjsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgRXJyb3IgZHVyaW5nIGZvbnQgbG9hZGluZzogJHtleHBvcnRlZEVycm9yfWApOworICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGV4cG9ydGVkRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGV0IGZvbnRSZWdpc3RyeSA9IG51bGw7CisKKyAgICAgICAgICBpZiAocGFyYW1zLnBkZkJ1ZyAmJiBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IgJiYgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmVuYWJsZWQpIHsKKyAgICAgICAgICAgIGZvbnRSZWdpc3RyeSA9IHsKKyAgICAgICAgICAgICAgcmVnaXN0ZXJGb250KGZvbnQsIHVybCkgeworICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQoZm9udCwgdXJsKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IGZvbnQgPSBuZXcgX2ZvbnRfbG9hZGVyLkZvbnRGYWNlT2JqZWN0KGV4cG9ydGVkRGF0YSwgeworICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBwYXJhbXMuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBwYXJhbXMuZGlzYWJsZUZvbnRGYWNlLAorICAgICAgICAgICAgaWdub3JlRXJyb3JzOiBwYXJhbXMuaWdub3JlRXJyb3JzLAorICAgICAgICAgICAgb25VbnN1cHBvcnRlZEZlYXR1cmU6IHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlLmJpbmQodGhpcyksCisgICAgICAgICAgICBmb250UmVnaXN0cnkKKyAgICAgICAgICB9KTsKKyAgICAgICAgICB0aGlzLmZvbnRMb2FkZXIuYmluZChmb250KS5jYXRjaChyZWFzb24gPT4geworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRm9udEZhbGxiYWNrIiwgeworICAgICAgICAgICAgICBpZAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7CisgICAgICAgICAgICBpZiAoIXBhcmFtcy5mb250RXh0cmFQcm9wZXJ0aWVzICYmIGZvbnQuZGF0YSkgeworICAgICAgICAgICAgICBmb250LmRhdGEgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZm9udCk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiRm9udFBhdGgiOgorICAgICAgICBjYXNlICJJbWFnZSI6CisgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGV4cG9ydGVkRGF0YSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIGNvbW1vbiBvYmplY3QgdHlwZSAke3R5cGV9YCk7CisgICAgICB9CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIm9iaiIsIGRhdGEgPT4geworICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIGNvbnN0IFtpZCwgcGFnZUluZGV4LCB0eXBlLCBpbWFnZURhdGFdID0gZGF0YTsKKyAgICAgIGNvbnN0IHBhZ2VQcm94eSA9IHRoaXMucGFnZUNhY2hlW3BhZ2VJbmRleF07CisKKyAgICAgIGlmIChwYWdlUHJveHkub2Jqcy5oYXMoaWQpKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlICJJbWFnZSI6CisgICAgICAgICAgcGFnZVByb3h5Lm9ianMucmVzb2x2ZShpZCwgaW1hZ2VEYXRhKTsKKyAgICAgICAgICBjb25zdCBNQVhfSU1BR0VfU0laRV9UT19TVE9SRSA9IDgwMDAwMDA7CisKKyAgICAgICAgICBpZiAoaW1hZ2VEYXRhICYmICJkYXRhIiBpbiBpbWFnZURhdGEgJiYgaW1hZ2VEYXRhLmRhdGEubGVuZ3RoID4gTUFYX0lNQUdFX1NJWkVfVE9fU1RPUkUpIHsKKyAgICAgICAgICAgIHBhZ2VQcm94eS5jbGVhbnVwQWZ0ZXJSZW5kZXIgPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHb3QgdW5rbm93biBvYmplY3QgdHlwZSAke3R5cGV9YCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIkRvY1Byb2dyZXNzIiwgZGF0YSA9PiB7CisgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAobG9hZGluZ1Rhc2sub25Qcm9ncmVzcykgeworICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHsKKyAgICAgICAgICBsb2FkZWQ6IGRhdGEubG9hZGVkLAorICAgICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZS5iaW5kKHRoaXMpKTsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigiRmV0Y2hCdWlsdEluQ01hcCIsIChkYXRhLCBzaW5rKSA9PiB7CisgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgc2luay5lcnJvcihuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGxldCBmZXRjaGVkID0gZmFsc2U7CisKKyAgICAgIHNpbmsub25QdWxsID0gKCkgPT4geworICAgICAgICBpZiAoZmV0Y2hlZCkgeworICAgICAgICAgIHNpbmsuY2xvc2UoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmZXRjaGVkID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5DTWFwUmVhZGVyRmFjdG9yeS5mZXRjaChkYXRhKS50aGVuKGZ1bmN0aW9uIChidWlsdEluQ01hcCkgeworICAgICAgICAgIHNpbmsuZW5xdWV1ZShidWlsdEluQ01hcCwgMSwgW2J1aWx0SW5DTWFwLmNNYXBEYXRhLmJ1ZmZlcl0pOworICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgc2luay5lcnJvcihyZWFzb24pOworICAgICAgICB9KTsKKyAgICAgIH07CisgICAgfSk7CisgIH0KKworICBfb25VbnN1cHBvcnRlZEZlYXR1cmUoeworICAgIGZlYXR1cmVJZAorICB9KSB7CisgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMubG9hZGluZ1Rhc2sub25VbnN1cHBvcnRlZEZlYXR1cmUpIHsKKyAgICAgIHRoaXMubG9hZGluZ1Rhc2sub25VbnN1cHBvcnRlZEZlYXR1cmUoZmVhdHVyZUlkKTsKKyAgICB9CisgIH0KKworICBnZXREYXRhKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0RGF0YSIsIG51bGwpOworICB9CisKKyAgZ2V0UGFnZShwYWdlTnVtYmVyKSB7CisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpIHx8IHBhZ2VOdW1iZXIgPD0gMCB8fCBwYWdlTnVtYmVyID4gdGhpcy5fbnVtUGFnZXMpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkludmFsaWQgcGFnZSByZXF1ZXN0IikpOworICAgIH0KKworICAgIGNvbnN0IHBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxOworCisgICAgaWYgKHBhZ2VJbmRleCBpbiB0aGlzLnBhZ2VQcm9taXNlcykgeworICAgICAgcmV0dXJuIHRoaXMucGFnZVByb21pc2VzW3BhZ2VJbmRleF07CisgICAgfQorCisgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlIiwgeworICAgICAgcGFnZUluZGV4CisgICAgfSkudGhlbihwYWdlSW5mbyA9PiB7CisgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUcmFuc3BvcnQgZGVzdHJveWVkIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHBhZ2UgPSBuZXcgUERGUGFnZVByb3h5KHBhZ2VJbmRleCwgcGFnZUluZm8sIHRoaXMsIHRoaXMuX3BhcmFtcy5vd25lckRvY3VtZW50LCB0aGlzLl9wYXJhbXMucGRmQnVnKTsKKyAgICAgIHRoaXMucGFnZUNhY2hlW3BhZ2VJbmRleF0gPSBwYWdlOworICAgICAgcmV0dXJuIHBhZ2U7CisgICAgfSk7CisgICAgdGhpcy5wYWdlUHJvbWlzZXNbcGFnZUluZGV4XSA9IHByb21pc2U7CisgICAgcmV0dXJuIHByb21pc2U7CisgIH0KKworICBnZXRQYWdlSW5kZXgocmVmKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlSW5kZXgiLCB7CisgICAgICByZWYKKyAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKHJlYXNvbikpOworICAgIH0pOworICB9CisKKyAgZ2V0QW5ub3RhdGlvbnMocGFnZUluZGV4LCBpbnRlbnQpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldEFubm90YXRpb25zIiwgeworICAgICAgcGFnZUluZGV4LAorICAgICAgaW50ZW50CisgICAgfSk7CisgIH0KKworICBzYXZlRG9jdW1lbnQoYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlNhdmVEb2N1bWVudCIsIHsKKyAgICAgIG51bVBhZ2VzOiB0aGlzLl9udW1QYWdlcywKKyAgICAgIGFubm90YXRpb25TdG9yYWdlOiBhbm5vdGF0aW9uU3RvcmFnZSAmJiBhbm5vdGF0aW9uU3RvcmFnZS5nZXRBbGwoKSB8fCBudWxsLAorICAgICAgZmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXIgPyB0aGlzLl9mdWxsUmVhZGVyLmZpbGVuYW1lIDogbnVsbAorICAgIH0pLmZpbmFsbHkoKCkgPT4geworICAgICAgaWYgKGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgICAgIGFubm90YXRpb25TdG9yYWdlLnJlc2V0TW9kaWZpZWQoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIGdldERlc3RpbmF0aW9ucygpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERlc3RpbmF0aW9ucyIsIG51bGwpOworICB9CisKKyAgZ2V0RGVzdGluYXRpb24oaWQpIHsKKyAgICBpZiAodHlwZW9mIGlkICE9PSAic3RyaW5nIikgeworICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiSW52YWxpZCBkZXN0aW5hdGlvbiByZXF1ZXN0LiIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERlc3RpbmF0aW9uIiwgeworICAgICAgaWQKKyAgICB9KTsKKyAgfQorCisgIGdldFBhZ2VMYWJlbHMoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlTGFiZWxzIiwgbnVsbCk7CisgIH0KKworICBnZXRQYWdlTGF5b3V0KCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGFnZUxheW91dCIsIG51bGwpOworICB9CisKKyAgZ2V0UGFnZU1vZGUoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlTW9kZSIsIG51bGwpOworICB9CisKKyAgZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRWaWV3ZXJQcmVmZXJlbmNlcyIsIG51bGwpOworICB9CisKKyAgZ2V0T3BlbkFjdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldE9wZW5BY3Rpb24iLCBudWxsKTsKKyAgfQorCisgIGdldEF0dGFjaG1lbnRzKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0QXR0YWNobWVudHMiLCBudWxsKTsKKyAgfQorCisgIGdldEphdmFTY3JpcHQoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRKYXZhU2NyaXB0IiwgbnVsbCk7CisgIH0KKworICBnZXRPdXRsaW5lKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0T3V0bGluZSIsIG51bGwpOworICB9CisKKyAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCkudGhlbihyZXN1bHRzID0+IHsKKyAgICAgIHJldHVybiBuZXcgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLk9wdGlvbmFsQ29udGVudENvbmZpZyhyZXN1bHRzKTsKKyAgICB9KTsKKyAgfQorCisgIGdldFBlcm1pc3Npb25zKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGVybWlzc2lvbnMiLCBudWxsKTsKKyAgfQorCisgIGdldE1ldGFkYXRhKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0TWV0YWRhdGEiLCBudWxsKS50aGVuKHJlc3VsdHMgPT4geworICAgICAgcmV0dXJuIHsKKyAgICAgICAgaW5mbzogcmVzdWx0c1swXSwKKyAgICAgICAgbWV0YWRhdGE6IHJlc3VsdHNbMV0gPyBuZXcgX21ldGFkYXRhLk1ldGFkYXRhKHJlc3VsdHNbMV0pIDogbnVsbCwKKyAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXIgPyB0aGlzLl9mdWxsUmVhZGVyLmZpbGVuYW1lIDogbnVsbAorICAgICAgfTsKKyAgICB9KTsKKyAgfQorCisgIGdldFN0YXRzKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0U3RhdHMiLCBudWxsKTsKKyAgfQorCisgIHN0YXJ0Q2xlYW51cCgpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkNsZWFudXAiLCBudWxsKS50aGVuKCgpID0+IHsKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMucGFnZUNhY2hlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMucGFnZUNhY2hlW2ldOworCisgICAgICAgIGlmIChwYWdlKSB7CisgICAgICAgICAgY29uc3QgY2xlYW51cFN1Y2Nlc3NmdWwgPSBwYWdlLmNsZWFudXAoKTsKKworICAgICAgICAgIGlmICghY2xlYW51cFN1Y2Nlc3NmdWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RhcnRDbGVhbnVwOiBQYWdlICR7aSArIDF9IGlzIGN1cnJlbnRseSByZW5kZXJpbmcuYCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuY29tbW9uT2Jqcy5jbGVhcigpOworICAgICAgdGhpcy5mb250TG9hZGVyLmNsZWFyKCk7CisgICAgfSk7CisgIH0KKworICBnZXQgbG9hZGluZ1BhcmFtcygpIHsKKyAgICBjb25zdCBwYXJhbXMgPSB0aGlzLl9wYXJhbXM7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJsb2FkaW5nUGFyYW1zIiwgeworICAgICAgZGlzYWJsZUF1dG9GZXRjaDogcGFyYW1zLmRpc2FibGVBdXRvRmV0Y2gsCisgICAgICBkaXNhYmxlRm9udEZhY2U6IHBhcmFtcy5kaXNhYmxlRm9udEZhY2UKKyAgICB9KTsKKyAgfQorCit9CisKK2NsYXNzIFBERk9iamVjdHMgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLl9vYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfQorCisgIF9lbnN1cmVPYmoob2JqSWQpIHsKKyAgICBpZiAodGhpcy5fb2Jqc1tvYmpJZF0pIHsKKyAgICAgIHJldHVybiB0aGlzLl9vYmpzW29iaklkXTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fb2Jqc1tvYmpJZF0gPSB7CisgICAgICBjYXBhYmlsaXR5OiAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCksCisgICAgICBkYXRhOiBudWxsLAorICAgICAgcmVzb2x2ZWQ6IGZhbHNlCisgICAgfTsKKyAgfQorCisgIGdldChvYmpJZCwgY2FsbGJhY2sgPSBudWxsKSB7CisgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICB0aGlzLl9lbnN1cmVPYmoob2JqSWQpLmNhcGFiaWxpdHkucHJvbWlzZS50aGVuKGNhbGxiYWNrKTsKKworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3Qgb2JqID0gdGhpcy5fb2Jqc1tvYmpJZF07CisKKyAgICBpZiAoIW9iaiB8fCAhb2JqLnJlc29sdmVkKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVlc3Rpbmcgb2JqZWN0IHRoYXQgaXNuJ3QgcmVzb2x2ZWQgeWV0ICR7b2JqSWR9LmApOworICAgIH0KKworICAgIHJldHVybiBvYmouZGF0YTsKKyAgfQorCisgIGhhcyhvYmpJZCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX29ianNbb2JqSWRdOworICAgIHJldHVybiBvYmogPyBvYmoucmVzb2x2ZWQgOiBmYWxzZTsKKyAgfQorCisgIHJlc29sdmUob2JqSWQsIGRhdGEpIHsKKyAgICBjb25zdCBvYmogPSB0aGlzLl9lbnN1cmVPYmoob2JqSWQpOworCisgICAgb2JqLnJlc29sdmVkID0gdHJ1ZTsKKyAgICBvYmouZGF0YSA9IGRhdGE7CisgICAgb2JqLmNhcGFiaWxpdHkucmVzb2x2ZShkYXRhKTsKKyAgfQorCisgIGNsZWFyKCkgeworICAgIHRoaXMuX29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9CisKK30KKworY2xhc3MgUmVuZGVyVGFzayB7CisgIGNvbnN0cnVjdG9yKGludGVybmFsUmVuZGVyVGFzaykgeworICAgIHRoaXMuX2ludGVybmFsUmVuZGVyVGFzayA9IGludGVybmFsUmVuZGVyVGFzazsKKyAgICB0aGlzLm9uQ29udGludWUgPSBudWxsOworICB9CisKKyAgZ2V0IHByb21pc2UoKSB7CisgICAgcmV0dXJuIHRoaXMuX2ludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBjYW5jZWwoKSB7CisgICAgdGhpcy5faW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbCgpOworICB9CisKK30KKworY29uc3QgSW50ZXJuYWxSZW5kZXJUYXNrID0gZnVuY3Rpb24gSW50ZXJuYWxSZW5kZXJUYXNrQ2xvc3VyZSgpIHsKKyAgY29uc3QgY2FudmFzSW5SZW5kZXJpbmcgPSBuZXcgV2Vha1NldCgpOworCisgIGNsYXNzIEludGVybmFsUmVuZGVyVGFzayB7CisgICAgY29uc3RydWN0b3IoeworICAgICAgY2FsbGJhY2ssCisgICAgICBwYXJhbXMsCisgICAgICBvYmpzLAorICAgICAgY29tbW9uT2JqcywKKyAgICAgIG9wZXJhdG9yTGlzdCwKKyAgICAgIHBhZ2VJbmRleCwKKyAgICAgIGNhbnZhc0ZhY3RvcnksCisgICAgICB3ZWJHTENvbnRleHQsCisgICAgICB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmYWxzZSwKKyAgICAgIHBkZkJ1ZyA9IGZhbHNlCisgICAgfSkgeworICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisgICAgICB0aGlzLm9ianMgPSBvYmpzOworICAgICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqczsKKyAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gbnVsbDsKKyAgICAgIHRoaXMub3BlcmF0b3JMaXN0ID0gb3BlcmF0b3JMaXN0OworICAgICAgdGhpcy5fcGFnZUluZGV4ID0gcGFnZUluZGV4OworICAgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTsKKyAgICAgIHRoaXMud2ViR0xDb250ZXh0ID0gd2ViR0xDb250ZXh0OworICAgICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnOworICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7CisgICAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayA9IG51bGw7CisgICAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSBmYWxzZTsKKyAgICAgIHRoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gdHJ1ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIjsKKyAgICAgIHRoaXMuY2FuY2VsbGVkID0gZmFsc2U7CisgICAgICB0aGlzLmNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICB0aGlzLnRhc2sgPSBuZXcgUmVuZGVyVGFzayh0aGlzKTsKKyAgICAgIHRoaXMuX2NvbnRpbnVlQm91bmQgPSB0aGlzLl9jb250aW51ZS5iaW5kKHRoaXMpOworICAgICAgdGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQgPSB0aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuX25leHRCb3VuZCA9IHRoaXMuX25leHQuYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuX2NhbnZhcyA9IHBhcmFtcy5jYW52YXNDb250ZXh0LmNhbnZhczsKKyAgICB9CisKKyAgICBnZXQgY29tcGxldGVkKCkgeworICAgICAgcmV0dXJuIHRoaXMuY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKKyAgICB9CisKKyAgICBpbml0aWFsaXplR3JhcGhpY3MoeworICAgICAgdHJhbnNwYXJlbmN5ID0gZmFsc2UsCisgICAgICBvcHRpb25hbENvbnRlbnRDb25maWcKKyAgICB9KSB7CisgICAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fY2FudmFzKSB7CisgICAgICAgIGlmIChjYW52YXNJblJlbmRlcmluZy5oYXModGhpcy5fY2FudmFzKSkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuICIgKyAiVXNlIGRpZmZlcmVudCBjYW52YXMgb3IgZW5zdXJlIHByZXZpb3VzIG9wZXJhdGlvbnMgd2VyZSAiICsgImNhbmNlbGxlZCBvciBjb21wbGV0ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBjYW52YXNJblJlbmRlcmluZy5hZGQodGhpcy5fY2FudmFzKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3BkZkJ1ZyAmJiBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyICYmIGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIuZW5hYmxlZCkgeworICAgICAgICB0aGlzLnN0ZXBwZXIgPSBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmNyZWF0ZSh0aGlzLl9wYWdlSW5kZXgpOworICAgICAgICB0aGlzLnN0ZXBwZXIuaW5pdCh0aGlzLm9wZXJhdG9yTGlzdCk7CisgICAgICAgIHRoaXMuc3RlcHBlci5uZXh0QnJlYWtQb2ludCA9IHRoaXMuc3RlcHBlci5nZXROZXh0QnJlYWtQb2ludCgpOworICAgICAgfQorCisgICAgICBjb25zdCB7CisgICAgICAgIGNhbnZhc0NvbnRleHQsCisgICAgICAgIHZpZXdwb3J0LAorICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgIGltYWdlTGF5ZXIsCisgICAgICAgIGJhY2tncm91bmQKKyAgICAgIH0gPSB0aGlzLnBhcmFtczsKKyAgICAgIHRoaXMuZ2Z4ID0gbmV3IF9jYW52YXMuQ2FudmFzR3JhcGhpY3MoY2FudmFzQ29udGV4dCwgdGhpcy5jb21tb25PYmpzLCB0aGlzLm9ianMsIHRoaXMuY2FudmFzRmFjdG9yeSwgdGhpcy53ZWJHTENvbnRleHQsIGltYWdlTGF5ZXIsIG9wdGlvbmFsQ29udGVudENvbmZpZyk7CisgICAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoeworICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgIHZpZXdwb3J0LAorICAgICAgICB0cmFuc3BhcmVuY3ksCisgICAgICAgIGJhY2tncm91bmQKKyAgICAgIH0pOworICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSAwOworICAgICAgdGhpcy5ncmFwaGljc1JlYWR5ID0gdHJ1ZTsKKworICAgICAgaWYgKHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrKSB7CisgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrKCk7CisgICAgICB9CisgICAgfQorCisgICAgY2FuY2VsKGVycm9yID0gbnVsbCkgeworICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7CisgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7CisKKyAgICAgIGlmICh0aGlzLmdmeCkgeworICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKCk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9jYW52YXMpIHsKKyAgICAgICAgY2FudmFzSW5SZW5kZXJpbmcuZGVsZXRlKHRoaXMuX2NhbnZhcyk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY2FsbGJhY2soZXJyb3IgfHwgbmV3IF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbihgUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSAke3RoaXMuX3BhZ2VJbmRleCArIDF9YCwgImNhbnZhcyIpKTsKKyAgICB9CisKKyAgICBvcGVyYXRvckxpc3RDaGFuZ2VkKCkgeworICAgICAgaWYgKCF0aGlzLmdyYXBoaWNzUmVhZHkpIHsKKyAgICAgICAgaWYgKCF0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaykgeworICAgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gdGhpcy5fY29udGludWVCb3VuZDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuc3RlcHBlcikgeworICAgICAgICB0aGlzLnN0ZXBwZXIudXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMucnVubmluZykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2NvbnRpbnVlKCk7CisgICAgfQorCisgICAgX2NvbnRpbnVlKCkgeworICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTsKKworICAgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMudGFzay5vbkNvbnRpbnVlKSB7CisgICAgICAgIHRoaXMudGFzay5vbkNvbnRpbnVlKHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX3NjaGVkdWxlTmV4dCgpOworICAgICAgfQorICAgIH0KKworICAgIF9zY2hlZHVsZU5leHQoKSB7CisgICAgICBpZiAodGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7CisgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geworICAgICAgICAgIHRoaXMuX25leHRCb3VuZCgpLmNhdGNoKHRoaXMuY2FuY2VsLmJpbmQodGhpcykpOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5fbmV4dEJvdW5kKS5jYXRjaCh0aGlzLmNhbmNlbC5iaW5kKHRoaXMpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3luYyBfbmV4dCgpIHsKKyAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gdGhpcy5nZnguZXhlY3V0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCwgdGhpcy5vcGVyYXRvckxpc3RJZHgsIHRoaXMuX2NvbnRpbnVlQm91bmQsIHRoaXMuc3RlcHBlcik7CisKKyAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdElkeCA9PT0gdGhpcy5vcGVyYXRvckxpc3QuYXJnc0FycmF5Lmxlbmd0aCkgeworICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7CisgICAgICAgICAgdGhpcy5nZnguZW5kRHJhd2luZygpOworCisgICAgICAgICAgaWYgKHRoaXMuX2NhbnZhcykgeworICAgICAgICAgICAgY2FudmFzSW5SZW5kZXJpbmcuZGVsZXRlKHRoaXMuX2NhbnZhcyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5jYWxsYmFjaygpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIH0KKworICByZXR1cm4gSW50ZXJuYWxSZW5kZXJUYXNrOworfSgpOworCitjb25zdCB2ZXJzaW9uID0gJzIuNi4zNDcnOworZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjsKK2NvbnN0IGJ1aWxkID0gJzNiZTljNjVmJzsKK2V4cG9ydHMuYnVpbGQgPSBidWlsZDsKKworLyoqKi8gfSksCisvKiA2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRm9udExvYWRlciA9IGV4cG9ydHMuRm9udEZhY2VPYmplY3QgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK2NsYXNzIEJhc2VGb250TG9hZGVyIHsKKyAgY29uc3RydWN0b3IoeworICAgIGRvY0lkLAorICAgIG9uVW5zdXBwb3J0ZWRGZWF0dXJlLAorICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50CisgIH0pIHsKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUZvbnRMb2FkZXIpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGb250TG9hZGVyLiIpOworICAgIH0KKworICAgIHRoaXMuZG9jSWQgPSBkb2NJZDsKKyAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSA9IG9uVW5zdXBwb3J0ZWRGZWF0dXJlOworICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDsKKyAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcyA9IFtdOworICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDsKKyAgfQorCisgIGFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKSB7CisgICAgdGhpcy5uYXRpdmVGb250RmFjZXMucHVzaChuYXRpdmVGb250RmFjZSk7CisKKyAgICB0aGlzLl9kb2N1bWVudC5mb250cy5hZGQobmF0aXZlRm9udEZhY2UpOworICB9CisKKyAgaW5zZXJ0UnVsZShydWxlKSB7CisgICAgbGV0IHN0eWxlRWxlbWVudCA9IHRoaXMuc3R5bGVFbGVtZW50OworCisgICAgaWYgKCFzdHlsZUVsZW1lbnQpIHsKKyAgICAgIHN0eWxlRWxlbWVudCA9IHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKKyAgICAgIHN0eWxlRWxlbWVudC5pZCA9IGBQREZKU19GT05UX1NUWUxFX1RBR18ke3RoaXMuZG9jSWR9YDsKKworICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsKKyAgICB9CisKKyAgICBjb25zdCBzdHlsZVNoZWV0ID0gc3R5bGVFbGVtZW50LnNoZWV0OworICAgIHN0eWxlU2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7CisgIH0KKworICBjbGVhcigpIHsKKyAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5mb3JFYWNoKG5hdGl2ZUZvbnRGYWNlID0+IHsKKyAgICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7CisgICAgfSk7CisgICAgdGhpcy5uYXRpdmVGb250RmFjZXMubGVuZ3RoID0gMDsKKworICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkgeworICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7CisgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7CisgICAgfQorICB9CisKKyAgYXN5bmMgYmluZChmb250KSB7CisgICAgaWYgKGZvbnQuYXR0YWNoZWQgfHwgZm9udC5taXNzaW5nRmlsZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvbnQuYXR0YWNoZWQgPSB0cnVlOworCisgICAgaWYgKHRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCkgeworICAgICAgY29uc3QgbmF0aXZlRm9udEZhY2UgPSBmb250LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7CisKKyAgICAgIGlmIChuYXRpdmVGb250RmFjZSkgeworICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGF3YWl0IG5hdGl2ZUZvbnRGYWNlLmxvYWRlZDsKKyAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSh7CisgICAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udExvYWROYXRpdmUKKyAgICAgICAgICB9KTsKKworICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgRmFpbGVkIHRvIGxvYWQgZm9udCAnJHtuYXRpdmVGb250RmFjZS5mYW1pbHl9JzogJyR7ZXh9Jy5gKTsKKyAgICAgICAgICBmb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7CisgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHJ1bGUgPSBmb250LmNyZWF0ZUZvbnRGYWNlUnVsZSgpOworCisgICAgaWYgKHJ1bGUpIHsKKyAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTsKKworICAgICAgaWYgKHRoaXMuaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsKKyAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHJlc29sdmUpOworCisgICAgICAgIHRoaXMuX3ByZXBhcmVGb250TG9hZEV2ZW50KFtydWxlXSwgW2ZvbnRdLCByZXF1ZXN0KTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIF9xdWV1ZUxvYWRpbmdDYWxsYmFjayhjYWxsYmFjaykgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrYC4iKTsKKyAgfQorCisgIGdldCBpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKCkgeworICAgIGNvbnN0IHN1cHBvcnRlZCA9IHR5cGVvZiB0aGlzLl9kb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgISF0aGlzLl9kb2N1bWVudC5mb250czsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQiLCBzdXBwb3J0ZWQpOworICB9CisKKyAgZ2V0IGlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRgLiIpOworICB9CisKKyAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfbG9hZFRlc3RGb250YC4iKTsKKyAgfQorCisgIF9wcmVwYXJlRm9udExvYWRFdmVudChydWxlcywgZm9udHNUb0xvYWQsIHJlcXVlc3QpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYF9wcmVwYXJlRm9udExvYWRFdmVudGAuIik7CisgIH0KKworfQorCitsZXQgRm9udExvYWRlcjsKK2V4cG9ydHMuRm9udExvYWRlciA9IEZvbnRMb2FkZXI7Cit7CisgIGV4cG9ydHMuRm9udExvYWRlciA9IEZvbnRMb2FkZXIgPSBjbGFzcyBHZW5lcmljRm9udExvYWRlciBleHRlbmRzIEJhc2VGb250TG9hZGVyIHsKKyAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKKyAgICAgIHN1cGVyKHBhcmFtcyk7CisgICAgICB0aGlzLmxvYWRpbmdDb250ZXh0ID0geworICAgICAgICByZXF1ZXN0czogW10sCisgICAgICAgIG5leHRSZXF1ZXN0SWQ6IDAKKyAgICAgIH07CisgICAgICB0aGlzLmxvYWRUZXN0Rm9udElkID0gMDsKKyAgICB9CisKKyAgICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7CisgICAgICBsZXQgc3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAidW5kZWZpbmVkIikgeworICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgbSA9IC9Nb3ppbGxhXC81LjAuKj9ydjooXGQrKS4qPyBHZWNrby8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KTsKKworICAgICAgICBpZiAobSAmJiBtWzFdID49IDE0KSB7CisgICAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkIiwgc3VwcG9ydGVkKTsKKyAgICB9CisKKyAgICBfcXVldWVMb2FkaW5nQ2FsbGJhY2soY2FsbGJhY2spIHsKKyAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlUmVxdWVzdCgpIHsKKyAgICAgICAgKDAsIF91dGlsLmFzc2VydCkoIXJlcXVlc3QuZG9uZSwgImNvbXBsZXRlUmVxdWVzdCgpIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UuIik7CisgICAgICAgIHJlcXVlc3QuZG9uZSA9IHRydWU7CisKKyAgICAgICAgd2hpbGUgKGNvbnRleHQucmVxdWVzdHMubGVuZ3RoID4gMCAmJiBjb250ZXh0LnJlcXVlc3RzWzBdLmRvbmUpIHsKKyAgICAgICAgICBjb25zdCBvdGhlclJlcXVlc3QgPSBjb250ZXh0LnJlcXVlc3RzLnNoaWZ0KCk7CisgICAgICAgICAgc2V0VGltZW91dChvdGhlclJlcXVlc3QuY2FsbGJhY2ssIDApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmxvYWRpbmdDb250ZXh0OworICAgICAgY29uc3QgcmVxdWVzdCA9IHsKKyAgICAgICAgaWQ6IGBwZGZqcy1mb250LWxvYWRpbmctJHtjb250ZXh0Lm5leHRSZXF1ZXN0SWQrK31gLAorICAgICAgICBkb25lOiBmYWxzZSwKKyAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlUmVxdWVzdCwKKyAgICAgICAgY2FsbGJhY2sKKyAgICAgIH07CisgICAgICBjb250ZXh0LnJlcXVlc3RzLnB1c2gocmVxdWVzdCk7CisgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICB9CisKKyAgICBnZXQgX2xvYWRUZXN0Rm9udCgpIHsKKyAgICAgIGNvbnN0IGdldExvYWRUZXN0Rm9udCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGF0b2IoIlQxUlVUd0FMQUlBQUF3QXdRMFpHSURIdFpnNEFBQU9ZQUFBQWdVWkdWRTFsa3pad0FBQUVIQUFBQUJ4SFJFVkdBQlFBIiArICJGUUFBQkRnQUFBQWVUMU12TWxZTll3a0FBQUVnQUFBQVlHTnRZWEFCRFFMVUFBQUNOQUFBQVVKb1pXRmsveFZGRFFBQSIgKyAiQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0EiICsgIkFBQUdibUZ0WlZqbWRINEFBQUdBQUFBQXNYQnZjM1QvaGdBekFBQURlQUFBQUNBQUFRQUFBQUVBQUxaUkZzUmZEenoxIiArICJBQXNENkFBQUFBRE9CT1RMQUFBQUFNNEtIRHdBQUFBQUErZ0RJUUFBQUFnQUFnQUFBQUFBQUFBQkFBQURJUUFBQUZvRCIgKyAiNkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ00iICsgIkFvb0N2QUFBQWVBQU1RRUNBQUFDQUFZSkFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBRkJtUldRQXdBQXVBQzREIiArICJJUDg0QUZvRElRQUFBQUFBQVFBQUFBQUFBQUFBQUNBQUlBQUJBQUFBRGdDdUFBRUFBQUFBQUFBQUFRQUFBQUVBQUFBQSIgKyAiQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUEiICsgIkFRQUFBQUVBQUFBQUFBWUFBUUFBQUFNQUFRUUpBQUFBQWdBQkFBTUFBUVFKQUFFQUFnQUJBQU1BQVFRSkFBSUFBZ0FCIiArICJBQU1BQVFRSkFBTUFBZ0FCQUFNQUFRUUpBQVFBQWdBQkFBTUFBUVFKQUFVQUFnQUJBQU1BQVFRSkFBWUFBZ0FCV0FCWSIgKyAiQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUEiICsgIkFDNy8vLy9UQUFFQUFBQUFBQUFCQmdBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIiArICJBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIgKyAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiICsgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIiArICJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIgKyAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUEiICsgIkFBQUJBQVFFQUFFQkFRSllBQUVCQVNINER3RDRHd0hFQXZnY0EvZ1hCSXdNQVl1TCtuejV0UVhrRDVqM0NCTG5FUUFDIiArICJBUUVCSVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlBQUFCQVFBQUR3QUNBUUVFRS90MyIgKyAiRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGoiICsgIkZRQUFBQURPQk9RcEFBRUFBQUFBQUFBQURBQVVBQVFBQUFBQkFBQUFBZ0FCQUFBQUFBQUFBQUFENkFBQUFBQUFBQT09Iik7CisgICAgICB9OworCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIl9sb2FkVGVzdEZvbnQiLCBnZXRMb2FkVGVzdEZvbnQoKSk7CisgICAgfQorCisgICAgX3ByZXBhcmVGb250TG9hZEV2ZW50KHJ1bGVzLCBmb250cywgcmVxdWVzdCkgeworICAgICAgZnVuY3Rpb24gaW50MzIoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0KSA8PCAyNCB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAxKSA8PCAxNiB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAyKSA8PCA4IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDMpICYgMHhmZjsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc3BsaWNlU3RyaW5nKHMsIG9mZnNldCwgcmVtb3ZlLCBpbnNlcnQpIHsKKyAgICAgICAgY29uc3QgY2h1bmsxID0gcy5zdWJzdHJpbmcoMCwgb2Zmc2V0KTsKKyAgICAgICAgY29uc3QgY2h1bmsyID0gcy5zdWJzdHJpbmcob2Zmc2V0ICsgcmVtb3ZlKTsKKyAgICAgICAgcmV0dXJuIGNodW5rMSArIGluc2VydCArIGNodW5rMjsKKyAgICAgIH0KKworICAgICAgbGV0IGksIGlpOworCisgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKKworICAgICAgY2FudmFzLndpZHRoID0gMTsKKyAgICAgIGNhbnZhcy5oZWlnaHQgPSAxOworICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CisgICAgICBsZXQgY2FsbGVkID0gMDsKKworICAgICAgZnVuY3Rpb24gaXNGb250UmVhZHkobmFtZSwgY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGVkKys7CisKKyAgICAgICAgaWYgKGNhbGxlZCA+IDMwKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJMb2FkIHRlc3QgZm9udCBuZXZlciBsb2FkZWQuIik7CisgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjdHguZm9udCA9ICIzMHB4ICIgKyBuYW1lOworICAgICAgICBjdHguZmlsbFRleHQoIi4iLCAwLCAyMCk7CisgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7CisKKyAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhWzNdID4gMCkgeworICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2V0VGltZW91dChpc0ZvbnRSZWFkeS5iaW5kKG51bGwsIG5hbWUsIGNhbGxiYWNrKSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGxvYWRUZXN0Rm9udElkID0gYGx0JHtEYXRlLm5vdygpfSR7dGhpcy5sb2FkVGVzdEZvbnRJZCsrfWA7CisgICAgICBsZXQgZGF0YSA9IHRoaXMuX2xvYWRUZXN0Rm9udDsKKyAgICAgIGNvbnN0IENPTU1FTlRfT0ZGU0VUID0gOTc2OworICAgICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDT01NRU5UX09GRlNFVCwgbG9hZFRlc3RGb250SWQubGVuZ3RoLCBsb2FkVGVzdEZvbnRJZCk7CisgICAgICBjb25zdCBDRkZfQ0hFQ0tTVU1fT0ZGU0VUID0gMTY7CisgICAgICBjb25zdCBYWFhYX1ZBTFVFID0gMHg1ODU4NTg1ODsKKyAgICAgIGxldCBjaGVja3N1bSA9IGludDMyKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQpOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IGxvYWRUZXN0Rm9udElkLmxlbmd0aCAtIDM7IGkgPCBpaTsgaSArPSA0KSB7CisgICAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQsIGkpIHwgMDsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPCBsb2FkVGVzdEZvbnRJZC5sZW5ndGgpIHsKKyAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSAtIFhYWFhfVkFMVUUgKyBpbnQzMihsb2FkVGVzdEZvbnRJZCArICJYWFgiLCBpKSB8IDA7CisgICAgICB9CisKKyAgICAgIGRhdGEgPSBzcGxpY2VTdHJpbmcoZGF0YSwgQ0ZGX0NIRUNLU1VNX09GRlNFVCwgNCwgKDAsIF91dGlsLnN0cmluZzMyKShjaGVja3N1bSkpOworICAgICAgY29uc3QgdXJsID0gYHVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCR7YnRvYShkYXRhKX0pO2A7CisgICAgICBjb25zdCBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OiIke2xvYWRUZXN0Rm9udElkfSI7c3JjOiR7dXJsfX1gOworICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpOworICAgICAgY29uc3QgbmFtZXMgPSBbXTsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSBmb250cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIG5hbWVzLnB1c2goZm9udHNbaV0ubG9hZGVkTmFtZSk7CisgICAgICB9CisKKyAgICAgIG5hbWVzLnB1c2gobG9hZFRlc3RGb250SWQpOworCisgICAgICBjb25zdCBkaXYgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworICAgICAgZGl2LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKKyAgICAgIGRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5oZWlnaHQgPSAiMTBweCI7CisgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworICAgICAgZGl2LnN0eWxlLnRvcCA9IGRpdi5zdHlsZS5sZWZ0ID0gIjBweCI7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICBjb25zdCBzcGFuID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworCisgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSAiSGkiOworICAgICAgICBzcGFuLnN0eWxlLmZvbnRGYW1pbHkgPSBuYW1lc1tpXTsKKyAgICAgICAgZGl2LmFwcGVuZENoaWxkKHNwYW4pOworICAgICAgfQorCisgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7CisKKyAgICAgIGlzRm9udFJlYWR5KGxvYWRUZXN0Rm9udElkLCAoKSA9PiB7CisgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGl2KTsKKworICAgICAgICByZXF1ZXN0LmNvbXBsZXRlKCk7CisgICAgICB9KTsKKyAgICB9CisKKyAgfTsKK30KKworY2xhc3MgRm9udEZhY2VPYmplY3QgeworICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVkRGF0YSwgeworICAgIGlzRXZhbFN1cHBvcnRlZCA9IHRydWUsCisgICAgZGlzYWJsZUZvbnRGYWNlID0gZmFsc2UsCisgICAgaWdub3JlRXJyb3JzID0gZmFsc2UsCisgICAgb25VbnN1cHBvcnRlZEZlYXR1cmUgPSBudWxsLAorICAgIGZvbnRSZWdpc3RyeSA9IG51bGwKKyAgfSkgeworICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgZm9yIChjb25zdCBpIGluIHRyYW5zbGF0ZWREYXRhKSB7CisgICAgICB0aGlzW2ldID0gdHJhbnNsYXRlZERhdGFbaV07CisgICAgfQorCisgICAgdGhpcy5pc0V2YWxTdXBwb3J0ZWQgPSBpc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlOworICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gZGlzYWJsZUZvbnRGYWNlID09PSB0cnVlOworICAgIHRoaXMuaWdub3JlRXJyb3JzID0gaWdub3JlRXJyb3JzID09PSB0cnVlOworICAgIHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlID0gb25VbnN1cHBvcnRlZEZlYXR1cmU7CisgICAgdGhpcy5mb250UmVnaXN0cnkgPSBmb250UmVnaXN0cnk7CisgIH0KKworICBjcmVhdGVOYXRpdmVGb250RmFjZSgpIHsKKyAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgbmF0aXZlRm9udEZhY2UgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTsKKworICAgIGlmICh0aGlzLmZvbnRSZWdpc3RyeSkgeworICAgICAgdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMpOworICAgIH0KKworICAgIHJldHVybiBuYXRpdmVGb250RmFjZTsKKyAgfQorCisgIGNyZWF0ZUZvbnRGYWNlUnVsZSgpIHsKKyAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgZGF0YSA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTsKKyAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6JHt0aGlzLm1pbWV0eXBlfTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDsKKyAgICBjb25zdCBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OiIke3RoaXMubG9hZGVkTmFtZX0iO3NyYzoke3VybH19YDsKKworICAgIGlmICh0aGlzLmZvbnRSZWdpc3RyeSkgeworICAgICAgdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMsIHVybCk7CisgICAgfQorCisgICAgcmV0dXJuIHJ1bGU7CisgIH0KKworICBnZXRQYXRoR2VuZXJhdG9yKG9ianMsIGNoYXJhY3RlcikgeworICAgIGlmICh0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gIT09IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXTsKKyAgICB9CisKKyAgICBsZXQgY21kcywgY3VycmVudDsKKworICAgIHRyeSB7CisgICAgICBjbWRzID0gb2Jqcy5nZXQodGhpcy5sb2FkZWROYW1lICsgIl9wYXRoXyIgKyBjaGFyYWN0ZXIpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoIXRoaXMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUpIHsKKyAgICAgICAgdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUoeworICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250R2V0UGF0aAorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRQYXRoR2VuZXJhdG9yIC0gaWdub3JpbmcgY2hhcmFjdGVyOiAiJHtleH0iLmApOworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSA9IGZ1bmN0aW9uIChjLCBzaXplKSB7fTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5pc0V2YWxTdXBwb3J0ZWQgJiYgX3V0aWwuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkLnZhbHVlKSB7CisgICAgICBsZXQgYXJncywKKyAgICAgICAgICBqcyA9ICIiOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjbWRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY3VycmVudCA9IGNtZHNbaV07CisKKyAgICAgICAgaWYgKGN1cnJlbnQuYXJncyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgYXJncyA9IGN1cnJlbnQuYXJncy5qb2luKCIsIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXJncyA9ICIiOworICAgICAgICB9CisKKyAgICAgICAganMgKz0gImMuIiArIGN1cnJlbnQuY21kICsgIigiICsgYXJncyArICIpO1xuIjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSA9IG5ldyBGdW5jdGlvbigiYyIsICJzaXplIiwganMpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkgeworICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY21kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGN1cnJlbnQgPSBjbWRzW2ldOworCisgICAgICAgIGlmIChjdXJyZW50LmNtZCA9PT0gInNjYWxlIikgeworICAgICAgICAgIGN1cnJlbnQuYXJncyA9IFtzaXplLCAtc2l6ZV07CisgICAgICAgIH0KKworICAgICAgICBjW2N1cnJlbnQuY21kXS5hcHBseShjLCBjdXJyZW50LmFyZ3MpOworICAgICAgfQorICAgIH07CisgIH0KKworfQorCitleHBvcnRzLkZvbnRGYWNlT2JqZWN0ID0gRm9udEZhY2VPYmplY3Q7CisKKy8qKiovIH0pLAorLyogNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IGV4cG9ydHMuTm9kZUNhbnZhc0ZhY3RvcnkgPSB2b2lkIDA7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK2xldCBOb2RlQ2FudmFzRmFjdG9yeSA9IGNsYXNzIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiTm90IGltcGxlbWVudGVkOiBOb2RlQ2FudmFzRmFjdG9yeSIpOworICB9CisKK307CitleHBvcnRzLk5vZGVDYW52YXNGYWN0b3J5ID0gTm9kZUNhbnZhc0ZhY3Rvcnk7CitsZXQgTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gY2xhc3MgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJOb3QgaW1wbGVtZW50ZWQ6IE5vZGVDTWFwUmVhZGVyRmFjdG9yeSIpOworICB9CisKK307CitleHBvcnRzLk5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IE5vZGVDTWFwUmVhZGVyRmFjdG9yeTsKKworaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgIGV4cG9ydHMuTm9kZUNhbnZhc0ZhY3RvcnkgPSBOb2RlQ2FudmFzRmFjdG9yeSA9IGNsYXNzIGV4dGVuZHMgX2Rpc3BsYXlfdXRpbHMuQmFzZUNhbnZhc0ZhY3RvcnkgeworICAgIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7CisgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FudmFzIHNpemUiKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgQ2FudmFzID0gcmVxdWlyZSgiY2FudmFzIik7CisKKyAgICAgIGNvbnN0IGNhbnZhcyA9IENhbnZhcy5jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7CisgICAgICByZXR1cm4geworICAgICAgICBjYW52YXMsCisgICAgICAgIGNvbnRleHQ6IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpCisgICAgICB9OworICAgIH0KKworICB9OworICBleHBvcnRzLk5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IE5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IGNsYXNzIGV4dGVuZHMgX2Rpc3BsYXlfdXRpbHMuQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHsKKyAgICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7CisgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geworICAgICAgICBjb25zdCBmcyA9IHJlcXVpcmUoImZzIik7CisKKyAgICAgICAgZnMucmVhZEZpbGUodXJsLCAoZXJyb3IsIGRhdGEpID0+IHsKKyAgICAgICAgICBpZiAoZXJyb3IgfHwgIWRhdGEpIHsKKyAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXNvbHZlKHsKKyAgICAgICAgICAgIGNNYXBEYXRhOiBuZXcgVWludDhBcnJheShkYXRhKSwKKyAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZQorICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKworICB9OworfQorCisvKioqLyB9KSwKKy8qIDggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Bbm5vdGF0aW9uU3RvcmFnZSA9IHZvaWQgMDsKKworY2xhc3MgQW5ub3RhdGlvblN0b3JhZ2UgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLl9zdG9yYWdlID0gbmV3IE1hcCgpOworICAgIHRoaXMuX21vZGlmaWVkID0gZmFsc2U7CisgICAgdGhpcy5vblNldE1vZGlmaWVkID0gbnVsbDsKKyAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCA9IG51bGw7CisgIH0KKworICBnZXRPckNyZWF0ZVZhbHVlKGtleSwgZGVmYXVsdFZhbHVlKSB7CisgICAgaWYgKHRoaXMuX3N0b3JhZ2UuaGFzKGtleSkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldChrZXkpOworICAgIH0KKworICAgIHRoaXMuX3N0b3JhZ2Uuc2V0KGtleSwgZGVmYXVsdFZhbHVlKTsKKworICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgIH0KKworICBzZXRWYWx1ZShrZXksIHZhbHVlKSB7CisgICAgaWYgKHRoaXMuX3N0b3JhZ2UuZ2V0KGtleSkgIT09IHZhbHVlKSB7CisgICAgICB0aGlzLl9zZXRNb2RpZmllZCgpOworICAgIH0KKworICAgIHRoaXMuX3N0b3JhZ2Uuc2V0KGtleSwgdmFsdWUpOworICB9CisKKyAgZ2V0QWxsKCkgeworICAgIGlmICh0aGlzLl9zdG9yYWdlLnNpemUgPT09IDApIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fc3RvcmFnZSk7CisgIH0KKworICBnZXQgc2l6ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5zaXplOworICB9CisKKyAgX3NldE1vZGlmaWVkKCkgeworICAgIGlmICghdGhpcy5fbW9kaWZpZWQpIHsKKyAgICAgIHRoaXMuX21vZGlmaWVkID0gdHJ1ZTsKKworICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uU2V0TW9kaWZpZWQgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgdGhpcy5vblNldE1vZGlmaWVkKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmVzZXRNb2RpZmllZCgpIHsKKyAgICBpZiAodGhpcy5fbW9kaWZpZWQpIHsKKyAgICAgIHRoaXMuX21vZGlmaWVkID0gZmFsc2U7CisKKyAgICAgIGlmICh0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgdGhpcy5vblJlc2V0TW9kaWZpZWQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLkFubm90YXRpb25TdG9yYWdlID0gQW5ub3RhdGlvblN0b3JhZ2U7CisKKy8qKiovIH0pLAorLyogOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmFwaUNvbXBhdGliaWxpdHlQYXJhbXMgPSB2b2lkIDA7CisKK3ZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CisKK2NvbnN0IGNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworeworICAoZnVuY3Rpb24gY2hlY2tGb250RmFjZSgpIHsKKyAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTsKKyAgICB9CisgIH0pKCk7Cit9Citjb25zdCBhcGlDb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmZyZWV6ZShjb21wYXRpYmlsaXR5UGFyYW1zKTsKK2V4cG9ydHMuYXBpQ29tcGF0aWJpbGl0eVBhcmFtcyA9IGFwaUNvbXBhdGliaWxpdHlQYXJhbXM7CisKKy8qKiovIH0pLAorLyogMTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DYW52YXNHcmFwaGljcyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9wYXR0ZXJuX2hlbHBlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOworCit2YXIgTUlOX0ZPTlRfU0laRSA9IDE2OwordmFyIE1BWF9GT05UX1NJWkUgPSAxMDA7Cit2YXIgTUFYX0dST1VQX1NJWkUgPSA0MDk2OwordmFyIE1JTl9XSURUSF9GQUNUT1IgPSAwLjY1OwordmFyIENPTVBJTEVfVFlQRTNfR0xZUEhTID0gdHJ1ZTsKK3ZhciBNQVhfU0laRV9UT19DT01QSUxFID0gMTAwMDsKK3ZhciBGVUxMX0NIVU5LX0hFSUdIVCA9IDE2OworCitmdW5jdGlvbiBhZGRDb250ZXh0Q3VycmVudFRyYW5zZm9ybShjdHgpIHsKKyAgaWYgKCFjdHgubW96Q3VycmVudFRyYW5zZm9ybSkgeworICAgIGN0eC5fb3JpZ2luYWxTYXZlID0gY3R4LnNhdmU7CisgICAgY3R4Ll9vcmlnaW5hbFJlc3RvcmUgPSBjdHgucmVzdG9yZTsKKyAgICBjdHguX29yaWdpbmFsUm90YXRlID0gY3R4LnJvdGF0ZTsKKyAgICBjdHguX29yaWdpbmFsU2NhbGUgPSBjdHguc2NhbGU7CisgICAgY3R4Ll9vcmlnaW5hbFRyYW5zbGF0ZSA9IGN0eC50cmFuc2xhdGU7CisgICAgY3R4Ll9vcmlnaW5hbFRyYW5zZm9ybSA9IGN0eC50cmFuc2Zvcm07CisgICAgY3R4Ll9vcmlnaW5hbFNldFRyYW5zZm9ybSA9IGN0eC5zZXRUcmFuc2Zvcm07CisgICAgY3R4Ll90cmFuc2Zvcm1NYXRyaXggPSBjdHguX3RyYW5zZm9ybU1hdHJpeCB8fCBbMSwgMCwgMCwgMSwgMCwgMF07CisgICAgY3R4Ll90cmFuc2Zvcm1TdGFjayA9IFtdOworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsICJtb3pDdXJyZW50VHJhbnNmb3JtIiwgeworICAgICAgZ2V0OiBmdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtKCkgeworICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtTWF0cml4OworICAgICAgfQorICAgIH0pOworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsICJtb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSIsIHsKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoKSB7CisgICAgICAgIHZhciBtID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4OworICAgICAgICB2YXIgYSA9IG1bMF0sCisgICAgICAgICAgICBiID0gbVsxXSwKKyAgICAgICAgICAgIGMgPSBtWzJdLAorICAgICAgICAgICAgZCA9IG1bM10sCisgICAgICAgICAgICBlID0gbVs0XSwKKyAgICAgICAgICAgIGYgPSBtWzVdOworICAgICAgICB2YXIgYWRfYmMgPSBhICogZCAtIGIgKiBjOworICAgICAgICB2YXIgYmNfYWQgPSBiICogYyAtIGEgKiBkOworICAgICAgICByZXR1cm4gW2QgLyBhZF9iYywgYiAvIGJjX2FkLCBjIC8gYmNfYWQsIGEgLyBhZF9iYywgKGQgKiBlIC0gYyAqIGYpIC8gYmNfYWQsIChiICogZSAtIGEgKiBmKSAvIGFkX2JjXTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIGN0eC5zYXZlID0gZnVuY3Rpb24gY3R4U2F2ZSgpIHsKKyAgICAgIHZhciBvbGQgPSB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7CisKKyAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YWNrLnB1c2gob2xkKTsKKworICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gb2xkLnNsaWNlKDAsIDYpOworCisgICAgICB0aGlzLl9vcmlnaW5hbFNhdmUoKTsKKyAgICB9OworCisgICAgY3R4LnJlc3RvcmUgPSBmdW5jdGlvbiBjdHhSZXN0b3JlKCkgeworICAgICAgdmFyIHByZXYgPSB0aGlzLl90cmFuc2Zvcm1TdGFjay5wb3AoKTsKKworICAgICAgaWYgKHByZXYpIHsKKyAgICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gcHJldjsKKworICAgICAgICB0aGlzLl9vcmlnaW5hbFJlc3RvcmUoKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgY3R4LnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIGN0eFRyYW5zbGF0ZSh4LCB5KSB7CisgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTsKKyAgICAgIG1bNV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTsKKworICAgICAgdGhpcy5fb3JpZ2luYWxUcmFuc2xhdGUoeCwgeSk7CisgICAgfTsKKworICAgIGN0eC5zY2FsZSA9IGZ1bmN0aW9uIGN0eFNjYWxlKHgsIHkpIHsKKyAgICAgIHZhciBtID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4OworICAgICAgbVswXSA9IG1bMF0gKiB4OworICAgICAgbVsxXSA9IG1bMV0gKiB4OworICAgICAgbVsyXSA9IG1bMl0gKiB5OworICAgICAgbVszXSA9IG1bM10gKiB5OworCisgICAgICB0aGlzLl9vcmlnaW5hbFNjYWxlKHgsIHkpOworICAgIH07CisKKyAgICBjdHgudHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIHZhciBtID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4OworICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gW21bMF0gKiBhICsgbVsyXSAqIGIsIG1bMV0gKiBhICsgbVszXSAqIGIsIG1bMF0gKiBjICsgbVsyXSAqIGQsIG1bMV0gKiBjICsgbVszXSAqIGQsIG1bMF0gKiBlICsgbVsyXSAqIGYgKyBtWzRdLCBtWzFdICogZSArIG1bM10gKiBmICsgbVs1XV07CisKKyAgICAgIGN0eC5fb3JpZ2luYWxUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7CisgICAgfTsKKworICAgIGN0eC5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikgeworICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdOworCisgICAgICBjdHguX29yaWdpbmFsU2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpOworICAgIH07CisKKyAgICBjdHgucm90YXRlID0gZnVuY3Rpb24gY3R4Um90YXRlKGFuZ2xlKSB7CisgICAgICB2YXIgY29zVmFsdWUgPSBNYXRoLmNvcyhhbmdsZSk7CisgICAgICB2YXIgc2luVmFsdWUgPSBNYXRoLnNpbihhbmdsZSk7CisgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IFttWzBdICogY29zVmFsdWUgKyBtWzJdICogc2luVmFsdWUsIG1bMV0gKiBjb3NWYWx1ZSArIG1bM10gKiBzaW5WYWx1ZSwgbVswXSAqIC1zaW5WYWx1ZSArIG1bMl0gKiBjb3NWYWx1ZSwgbVsxXSAqIC1zaW5WYWx1ZSArIG1bM10gKiBjb3NWYWx1ZSwgbVs0XSwgbVs1XV07CisKKyAgICAgIHRoaXMuX29yaWdpbmFsUm90YXRlKGFuZ2xlKTsKKyAgICB9OworICB9Cit9CisKK3ZhciBDYWNoZWRDYW52YXNlcyA9IGZ1bmN0aW9uIENhY2hlZENhbnZhc2VzQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQ2FjaGVkQ2FudmFzZXMoY2FudmFzRmFjdG9yeSkgeworICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7CisgICAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBDYWNoZWRDYW52YXNlcy5wcm90b3R5cGUgPSB7CisgICAgZ2V0Q2FudmFzOiBmdW5jdGlvbiBDYWNoZWRDYW52YXNlc19nZXRDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQsIHRyYWNrVHJhbnNmb3JtKSB7CisgICAgICB2YXIgY2FudmFzRW50cnk7CisKKyAgICAgIGlmICh0aGlzLmNhY2hlW2lkXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGNhbnZhc0VudHJ5ID0gdGhpcy5jYWNoZVtpZF07CisgICAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5yZXNldChjYW52YXNFbnRyeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGNhbnZhc0VudHJ5LmNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2FudmFzRW50cnkgPSB0aGlzLmNhbnZhc0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpOworICAgICAgICB0aGlzLmNhY2hlW2lkXSA9IGNhbnZhc0VudHJ5OworICAgICAgfQorCisgICAgICBpZiAodHJhY2tUcmFuc2Zvcm0pIHsKKyAgICAgICAgYWRkQ29udGV4dEN1cnJlbnRUcmFuc2Zvcm0oY2FudmFzRW50cnkuY29udGV4dCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjYW52YXNFbnRyeTsKKyAgICB9LAorCisgICAgY2xlYXIoKSB7CisgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLmNhY2hlKSB7CisgICAgICAgIHZhciBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdOworICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkuZGVzdHJveShjYW52YXNFbnRyeSk7CisgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTsKKyAgICAgIH0KKyAgICB9CisKKyAgfTsKKyAgcmV0dXJuIENhY2hlZENhbnZhc2VzOworfSgpOworCitmdW5jdGlvbiBjb21waWxlVHlwZTNHbHlwaChpbWdEYXRhKSB7CisgIHZhciBQT0lOVF9UT19QUk9DRVNTX0xJTUlUID0gMTAwMDsKKyAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aCwKKyAgICAgIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0OworICB2YXIgaSwKKyAgICAgIGosCisgICAgICBqMCwKKyAgICAgIHdpZHRoMSA9IHdpZHRoICsgMTsKKyAgdmFyIHBvaW50cyA9IG5ldyBVaW50OEFycmF5KHdpZHRoMSAqIChoZWlnaHQgKyAxKSk7CisgIHZhciBQT0lOVF9UWVBFUyA9IG5ldyBVaW50OEFycmF5KFswLCAyLCA0LCAwLCAxLCAwLCA1LCA0LCA4LCAxMCwgMCwgOCwgMCwgMiwgMSwgMF0pOworICB2YXIgbGluZVNpemUgPSB3aWR0aCArIDcgJiB+NywKKyAgICAgIGRhdGEwID0gaW1nRGF0YS5kYXRhOworICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGxpbmVTaXplICogaGVpZ2h0KSwKKyAgICAgIHBvcyA9IDAsCisgICAgICBpaTsKKworICBmb3IgKGkgPSAwLCBpaSA9IGRhdGEwLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICB2YXIgbWFzayA9IDEyOCwKKyAgICAgICAgZWxlbSA9IGRhdGEwW2ldOworCisgICAgd2hpbGUgKG1hc2sgPiAwKSB7CisgICAgICBkYXRhW3BvcysrXSA9IGVsZW0gJiBtYXNrID8gMCA6IDI1NTsKKyAgICAgIG1hc2sgPj49IDE7CisgICAgfQorICB9CisKKyAgdmFyIGNvdW50ID0gMDsKKyAgcG9zID0gMDsKKworICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7CisgICAgcG9pbnRzWzBdID0gMTsKKyAgICArK2NvdW50OworICB9CisKKyAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICBpZiAoZGF0YVtwb3NdICE9PSBkYXRhW3BvcyArIDFdKSB7CisgICAgICBwb2ludHNbal0gPSBkYXRhW3Bvc10gPyAyIDogMTsKKyAgICAgICsrY291bnQ7CisgICAgfQorCisgICAgcG9zKys7CisgIH0KKworICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7CisgICAgcG9pbnRzW2pdID0gMjsKKyAgICArK2NvdW50OworICB9CisKKyAgZm9yIChpID0gMTsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgcG9zID0gaSAqIGxpbmVTaXplOworICAgIGowID0gaSAqIHdpZHRoMTsKKworICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7CisgICAgICBwb2ludHNbajBdID0gZGF0YVtwb3NdID8gMSA6IDg7CisgICAgICArK2NvdW50OworICAgIH0KKworICAgIHZhciBzdW0gPSAoZGF0YVtwb3NdID8gNCA6IDApICsgKGRhdGFbcG9zIC0gbGluZVNpemVdID8gOCA6IDApOworCisgICAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIHN1bSA9IChzdW0gPj4gMikgKyAoZGF0YVtwb3MgKyAxXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplICsgMV0gPyA4IDogMCk7CisKKyAgICAgIGlmIChQT0lOVF9UWVBFU1tzdW1dKSB7CisgICAgICAgIHBvaW50c1tqMCArIGpdID0gUE9JTlRfVFlQRVNbc3VtXTsKKyAgICAgICAgKytjb3VudDsKKyAgICAgIH0KKworICAgICAgcG9zKys7CisgICAgfQorCisgICAgaWYgKGRhdGFbcG9zIC0gbGluZVNpemVdICE9PSBkYXRhW3Bvc10pIHsKKyAgICAgIHBvaW50c1tqMCArIGpdID0gZGF0YVtwb3NdID8gMiA6IDQ7CisgICAgICArK2NvdW50OworICAgIH0KKworICAgIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHBvcyA9IGxpbmVTaXplICogKGhlaWdodCAtIDEpOworICBqMCA9IGkgKiB3aWR0aDE7CisKKyAgaWYgKGRhdGFbcG9zXSAhPT0gMCkgeworICAgIHBvaW50c1tqMF0gPSA4OworICAgICsrY291bnQ7CisgIH0KKworICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykgeworICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHsKKyAgICAgIHBvaW50c1tqMCArIGpdID0gZGF0YVtwb3NdID8gNCA6IDg7CisgICAgICArK2NvdW50OworICAgIH0KKworICAgIHBvcysrOworICB9CisKKyAgaWYgKGRhdGFbcG9zXSAhPT0gMCkgeworICAgIHBvaW50c1tqMCArIGpdID0gNDsKKyAgICArK2NvdW50OworICB9CisKKyAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgdmFyIHN0ZXBzID0gbmV3IEludDMyQXJyYXkoWzAsIHdpZHRoMSwgLTEsIDAsIC13aWR0aDEsIDAsIDAsIDAsIDFdKTsKKyAgdmFyIG91dGxpbmVzID0gW107CisKKyAgZm9yIChpID0gMDsgY291bnQgJiYgaSA8PSBoZWlnaHQ7IGkrKykgeworICAgIHZhciBwID0gaSAqIHdpZHRoMTsKKyAgICB2YXIgZW5kID0gcCArIHdpZHRoOworCisgICAgd2hpbGUgKHAgPCBlbmQgJiYgIXBvaW50c1twXSkgeworICAgICAgcCsrOworICAgIH0KKworICAgIGlmIChwID09PSBlbmQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHZhciBjb29yZHMgPSBbcCAlIHdpZHRoMSwgaV07CisgICAgdmFyIHR5cGUgPSBwb2ludHNbcF0sCisgICAgICAgIHAwID0gcCwKKyAgICAgICAgcHA7CisKKyAgICBkbyB7CisgICAgICB2YXIgc3RlcCA9IHN0ZXBzW3R5cGVdOworCisgICAgICBkbyB7CisgICAgICAgIHAgKz0gc3RlcDsKKyAgICAgIH0gd2hpbGUgKCFwb2ludHNbcF0pOworCisgICAgICBwcCA9IHBvaW50c1twXTsKKworICAgICAgaWYgKHBwICE9PSA1ICYmIHBwICE9PSAxMCkgeworICAgICAgICB0eXBlID0gcHA7CisgICAgICAgIHBvaW50c1twXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0gcHAgJiAweDMzICogdHlwZSA+PiA0OworICAgICAgICBwb2ludHNbcF0gJj0gdHlwZSA+PiAyIHwgdHlwZSA8PCAyOworICAgICAgfQorCisgICAgICBjb29yZHMucHVzaChwICUgd2lkdGgxKTsKKyAgICAgIGNvb3Jkcy5wdXNoKHAgLyB3aWR0aDEgfCAwKTsKKworICAgICAgaWYgKCFwb2ludHNbcF0pIHsKKyAgICAgICAgLS1jb3VudDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChwMCAhPT0gcCk7CisKKyAgICBvdXRsaW5lcy5wdXNoKGNvb3Jkcyk7CisgICAgLS1pOworICB9CisKKyAgdmFyIGRyYXdPdXRsaW5lID0gZnVuY3Rpb24gKGMpIHsKKyAgICBjLnNhdmUoKTsKKyAgICBjLnNjYWxlKDEgLyB3aWR0aCwgLTEgLyBoZWlnaHQpOworICAgIGMudHJhbnNsYXRlKDAsIC1oZWlnaHQpOworICAgIGMuYmVnaW5QYXRoKCk7CisKKyAgICBmb3IgKGxldCBrID0gMCwga2sgPSBvdXRsaW5lcy5sZW5ndGg7IGsgPCBrazsgaysrKSB7CisgICAgICB2YXIgbyA9IG91dGxpbmVzW2tdOworICAgICAgYy5tb3ZlVG8ob1swXSwgb1sxXSk7CisKKyAgICAgIGZvciAobGV0IGwgPSAyLCBsbCA9IG8ubGVuZ3RoOyBsIDwgbGw7IGwgKz0gMikgeworICAgICAgICBjLmxpbmVUbyhvW2xdLCBvW2wgKyAxXSk7CisgICAgICB9CisgICAgfQorCisgICAgYy5maWxsKCk7CisgICAgYy5iZWdpblBhdGgoKTsKKyAgICBjLnJlc3RvcmUoKTsKKyAgfTsKKworICByZXR1cm4gZHJhd091dGxpbmU7Cit9CisKK3ZhciBDYW52YXNFeHRyYVN0YXRlID0gZnVuY3Rpb24gQ2FudmFzRXh0cmFTdGF0ZUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGUoKSB7CisgICAgdGhpcy5hbHBoYUlzU2hhcGUgPSBmYWxzZTsKKyAgICB0aGlzLmZvbnRTaXplID0gMDsKKyAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxOworICAgIHRoaXMudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICB0aGlzLnRleHRNYXRyaXhTY2FsZSA9IDE7CisgICAgdGhpcy5mb250TWF0cml4ID0gX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7CisgICAgdGhpcy5sZWFkaW5nID0gMDsKKyAgICB0aGlzLnggPSAwOworICAgIHRoaXMueSA9IDA7CisgICAgdGhpcy5saW5lWCA9IDA7CisgICAgdGhpcy5saW5lWSA9IDA7CisgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7CisgICAgdGhpcy53b3JkU3BhY2luZyA9IDA7CisgICAgdGhpcy50ZXh0SFNjYWxlID0gMTsKKyAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTDsKKyAgICB0aGlzLnRleHRSaXNlID0gMDsKKyAgICB0aGlzLmZpbGxDb2xvciA9ICIjMDAwMDAwIjsKKyAgICB0aGlzLnN0cm9rZUNvbG9yID0gIiMwMDAwMDAiOworICAgIHRoaXMucGF0dGVybkZpbGwgPSBmYWxzZTsKKyAgICB0aGlzLmZpbGxBbHBoYSA9IDE7CisgICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7CisgICAgdGhpcy5saW5lV2lkdGggPSAxOworICAgIHRoaXMuYWN0aXZlU01hc2sgPSBudWxsOworICAgIHRoaXMucmVzdW1lU01hc2tDdHggPSBudWxsOworICAgIHRoaXMudHJhbnNmZXJNYXBzID0gbnVsbDsKKyAgfQorCisgIENhbnZhc0V4dHJhU3RhdGUucHJvdG90eXBlID0geworICAgIGNsb25lOiBmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlX2Nsb25lKCkgeworICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7CisgICAgfSwKKyAgICBzZXRDdXJyZW50UG9pbnQ6IGZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGVfc2V0Q3VycmVudFBvaW50KHgsIHkpIHsKKyAgICAgIHRoaXMueCA9IHg7CisgICAgICB0aGlzLnkgPSB5OworICAgIH0KKyAgfTsKKyAgcmV0dXJuIENhbnZhc0V4dHJhU3RhdGU7Cit9KCk7CisKK3ZhciBDYW52YXNHcmFwaGljcyA9IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzQ2xvc3VyZSgpIHsKKyAgdmFyIEVYRUNVVElPTl9USU1FID0gMTU7CisgIHZhciBFWEVDVVRJT05fU1RFUFMgPSAxMDsKKworICBmdW5jdGlvbiBDYW52YXNHcmFwaGljcyhjYW52YXNDdHgsIGNvbW1vbk9ianMsIG9ianMsIGNhbnZhc0ZhY3RvcnksIHdlYkdMQ29udGV4dCwgaW1hZ2VMYXllciwgb3B0aW9uYWxDb250ZW50Q29uZmlnKSB7CisgICAgdGhpcy5jdHggPSBjYW52YXNDdHg7CisgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUoKTsKKyAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTsKKyAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDsKKyAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTsKKyAgICB0aGlzLnJlcyA9IG51bGw7CisgICAgdGhpcy54b2JqcyA9IG51bGw7CisgICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqczsKKyAgICB0aGlzLm9ianMgPSBvYmpzOworICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7CisgICAgdGhpcy53ZWJHTENvbnRleHQgPSB3ZWJHTENvbnRleHQ7CisgICAgdGhpcy5pbWFnZUxheWVyID0gaW1hZ2VMYXllcjsKKyAgICB0aGlzLmdyb3VwU3RhY2sgPSBbXTsKKyAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7CisgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gbnVsbDsKKyAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjayA9IFtdOworICAgIHRoaXMuZ3JvdXBMZXZlbCA9IDA7CisgICAgdGhpcy5zbWFza1N0YWNrID0gW107CisgICAgdGhpcy5zbWFza0NvdW50ZXIgPSAwOworICAgIHRoaXMudGVtcFNNYXNrID0gbnVsbDsKKyAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdHJ1ZTsKKyAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjayA9IFtdOworICAgIHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnID0gb3B0aW9uYWxDb250ZW50Q29uZmlnOworICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMgPSBuZXcgQ2FjaGVkQ2FudmFzZXModGhpcy5jYW52YXNGYWN0b3J5KTsKKworICAgIGlmIChjYW52YXNDdHgpIHsKKyAgICAgIGFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGNhbnZhc0N0eCk7CisgICAgfQorCisgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7CisgIH0KKworICBmdW5jdGlvbiBwdXRCaW5hcnlJbWFnZURhdGEoY3R4LCBpbWdEYXRhLCB0cmFuc2Zlck1hcHMgPSBudWxsKSB7CisgICAgaWYgKHR5cGVvZiBJbWFnZURhdGEgIT09ICJ1bmRlZmluZWQiICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHsKKyAgICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwgMCwgMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LAorICAgICAgICB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgdmFyIHBhcnRpYWxDaHVua0hlaWdodCA9IGhlaWdodCAlIEZVTExfQ0hVTktfSEVJR0hUOworICAgIHZhciBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICB2YXIgdG90YWxDaHVua3MgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQgPT09IDAgPyBmdWxsQ2h1bmtzIDogZnVsbENodW5rcyArIDE7CisgICAgdmFyIGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTsKKyAgICB2YXIgc3JjUG9zID0gMCwKKyAgICAgICAgZGVzdFBvczsKKyAgICB2YXIgc3JjID0gaW1nRGF0YS5kYXRhOworICAgIHZhciBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7CisgICAgdmFyIGksIGosIHRoaXNDaHVua0hlaWdodCwgZWxlbXNJblRoaXNDaHVuazsKKyAgICBsZXQgdHJhbnNmZXJNYXBSZWQsIHRyYW5zZmVyTWFwR3JlZW4sIHRyYW5zZmVyTWFwQmx1ZSwgdHJhbnNmZXJNYXBHcmF5OworCisgICAgaWYgKHRyYW5zZmVyTWFwcykgeworICAgICAgc3dpdGNoICh0cmFuc2Zlck1hcHMubGVuZ3RoKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICB0cmFuc2Zlck1hcFJlZCA9IHRyYW5zZmVyTWFwc1swXTsKKyAgICAgICAgICB0cmFuc2Zlck1hcEdyZWVuID0gdHJhbnNmZXJNYXBzWzBdOworICAgICAgICAgIHRyYW5zZmVyTWFwQmx1ZSA9IHRyYW5zZmVyTWFwc1swXTsKKyAgICAgICAgICB0cmFuc2Zlck1hcEdyYXkgPSB0cmFuc2Zlck1hcHNbMF07CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgIHRyYW5zZmVyTWFwUmVkID0gdHJhbnNmZXJNYXBzWzBdOworICAgICAgICAgIHRyYW5zZmVyTWFwR3JlZW4gPSB0cmFuc2Zlck1hcHNbMV07CisgICAgICAgICAgdHJhbnNmZXJNYXBCbHVlID0gdHJhbnNmZXJNYXBzWzJdOworICAgICAgICAgIHRyYW5zZmVyTWFwR3JheSA9IHRyYW5zZmVyTWFwc1szXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW1nRGF0YS5raW5kID09PSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFApIHsKKyAgICAgIHZhciBzcmNMZW5ndGggPSBzcmMuYnl0ZUxlbmd0aDsKKyAgICAgIHZhciBkZXN0MzIgPSBuZXcgVWludDMyQXJyYXkoZGVzdC5idWZmZXIsIDAsIGRlc3QuYnl0ZUxlbmd0aCA+PiAyKTsKKyAgICAgIHZhciBkZXN0MzJEYXRhTGVuZ3RoID0gZGVzdDMyLmxlbmd0aDsKKyAgICAgIHZhciBmdWxsU3JjRGlmZiA9IHdpZHRoICsgNyA+PiAzOworICAgICAgdmFyIHdoaXRlID0gMHhmZmZmZmZmZjsKKyAgICAgIHZhciBibGFjayA9IF91dGlsLklzTGl0dGxlRW5kaWFuQ2FjaGVkLnZhbHVlID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmY7CisKKyAgICAgIGlmICh0cmFuc2Zlck1hcEdyYXkpIHsKKyAgICAgICAgaWYgKHRyYW5zZmVyTWFwR3JheVswXSA9PT0gMHhmZiAmJiB0cmFuc2Zlck1hcEdyYXlbMHhmZl0gPT09IDApIHsKKyAgICAgICAgICBbd2hpdGUsIGJsYWNrXSA9IFtibGFjaywgd2hpdGVdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7CisgICAgICAgIHRoaXNDaHVua0hlaWdodCA9IGkgPCBmdWxsQ2h1bmtzID8gRlVMTF9DSFVOS19IRUlHSFQgOiBwYXJ0aWFsQ2h1bmtIZWlnaHQ7CisgICAgICAgIGRlc3RQb3MgPSAwOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzQ2h1bmtIZWlnaHQ7IGorKykgeworICAgICAgICAgIHZhciBzcmNEaWZmID0gc3JjTGVuZ3RoIC0gc3JjUG9zOworICAgICAgICAgIGxldCBrID0gMDsKKyAgICAgICAgICB2YXIga0VuZCA9IHNyY0RpZmYgPiBmdWxsU3JjRGlmZiA/IHdpZHRoIDogc3JjRGlmZiAqIDggLSA3OworICAgICAgICAgIHZhciBrRW5kVW5yb2xsZWQgPSBrRW5kICYgfjc7CisgICAgICAgICAgdmFyIG1hc2sgPSAwOworICAgICAgICAgIHZhciBzcmNCeXRlID0gMDsKKworICAgICAgICAgIGZvciAoOyBrIDwga0VuZFVucm9sbGVkOyBrICs9IDgpIHsKKyAgICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdOworICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMTI4ID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDY0ID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDMyID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDE2ID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDggPyB3aGl0ZSA6IGJsYWNrOworICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgNCA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAyID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEgPyB3aGl0ZSA6IGJsYWNrOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoOyBrIDwga0VuZDsgaysrKSB7CisgICAgICAgICAgICBpZiAobWFzayA9PT0gMCkgeworICAgICAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTsKKyAgICAgICAgICAgICAgbWFzayA9IDEyODsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgbWFzayA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBtYXNrID4+PSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChkZXN0UG9zIDwgZGVzdDMyRGF0YUxlbmd0aCkgeworICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaW1nRGF0YS5raW5kID09PSBfdXRpbC5JbWFnZUtpbmQuUkdCQV8zMkJQUCkgeworICAgICAgY29uc3QgaGFzVHJhbnNmZXJNYXBzID0gISEodHJhbnNmZXJNYXBSZWQgfHwgdHJhbnNmZXJNYXBHcmVlbiB8fCB0cmFuc2Zlck1hcEJsdWUpOworICAgICAgaiA9IDA7CisgICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiBGVUxMX0NIVU5LX0hFSUdIVCAqIDQ7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmdWxsQ2h1bmtzOyBpKyspIHsKKyAgICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY1Bvcywgc3JjUG9zICsgZWxlbXNJblRoaXNDaHVuaykpOworICAgICAgICBzcmNQb3MgKz0gZWxlbXNJblRoaXNDaHVuazsKKworICAgICAgICBpZiAoaGFzVHJhbnNmZXJNYXBzKSB7CisgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBlbGVtc0luVGhpc0NodW5rOyBrICs9IDQpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcFJlZCkgeworICAgICAgICAgICAgICBkZXN0W2sgKyAwXSA9IHRyYW5zZmVyTWFwUmVkW2Rlc3RbayArIDBdXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwR3JlZW4pIHsKKyAgICAgICAgICAgICAgZGVzdFtrICsgMV0gPSB0cmFuc2Zlck1hcEdyZWVuW2Rlc3RbayArIDFdXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwQmx1ZSkgeworICAgICAgICAgICAgICBkZXN0W2sgKyAyXSA9IHRyYW5zZmVyTWFwQmx1ZVtkZXN0W2sgKyAyXV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGopOworICAgICAgICBqICs9IEZVTExfQ0hVTktfSEVJR0hUOworICAgICAgfQorCisgICAgICBpZiAoaSA8IHRvdGFsQ2h1bmtzKSB7CisgICAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHBhcnRpYWxDaHVua0hlaWdodCAqIDQ7CisgICAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNQb3MsIHNyY1BvcyArIGVsZW1zSW5UaGlzQ2h1bmspKTsKKworICAgICAgICBpZiAoaGFzVHJhbnNmZXJNYXBzKSB7CisgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBlbGVtc0luVGhpc0NodW5rOyBrICs9IDQpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcFJlZCkgeworICAgICAgICAgICAgICBkZXN0W2sgKyAwXSA9IHRyYW5zZmVyTWFwUmVkW2Rlc3RbayArIDBdXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwR3JlZW4pIHsKKyAgICAgICAgICAgICAgZGVzdFtrICsgMV0gPSB0cmFuc2Zlck1hcEdyZWVuW2Rlc3RbayArIDFdXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwQmx1ZSkgeworICAgICAgICAgICAgICBkZXN0W2sgKyAyXSA9IHRyYW5zZmVyTWFwQmx1ZVtkZXN0W2sgKyAyXV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGopOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaW1nRGF0YS5raW5kID09PSBfdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQKSB7CisgICAgICBjb25zdCBoYXNUcmFuc2Zlck1hcHMgPSAhISh0cmFuc2Zlck1hcFJlZCB8fCB0cmFuc2Zlck1hcEdyZWVuIHx8IHRyYW5zZmVyTWFwQmx1ZSk7CisgICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPj0gZnVsbENodW5rcykgeworICAgICAgICAgIHRoaXNDaHVua0hlaWdodCA9IHBhcnRpYWxDaHVua0hlaWdodDsKKyAgICAgICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiB0aGlzQ2h1bmtIZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBkZXN0UG9zID0gMDsKKworICAgICAgICBmb3IgKGogPSBlbGVtc0luVGhpc0NodW5rOyBqLS07KSB7CisgICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdOworICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107CisgICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gMjU1OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc1RyYW5zZmVyTWFwcykgeworICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZGVzdFBvczsgayArPSA0KSB7CisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBSZWQpIHsKKyAgICAgICAgICAgICAgZGVzdFtrICsgMF0gPSB0cmFuc2Zlck1hcFJlZFtkZXN0W2sgKyAwXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEdyZWVuKSB7CisgICAgICAgICAgICAgIGRlc3RbayArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W2sgKyAxXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEJsdWUpIHsKKyAgICAgICAgICAgICAgZGVzdFtrICsgMl0gPSB0cmFuc2Zlck1hcEJsdWVbZGVzdFtrICsgMl1dOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhZCBpbWFnZSBraW5kOiAke2ltZ0RhdGEua2luZH1gKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwdXRCaW5hcnlJbWFnZU1hc2soY3R4LCBpbWdEYXRhKSB7CisgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LAorICAgICAgICB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgdmFyIHBhcnRpYWxDaHVua0hlaWdodCA9IGhlaWdodCAlIEZVTExfQ0hVTktfSEVJR0hUOworICAgIHZhciBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICB2YXIgdG90YWxDaHVua3MgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQgPT09IDAgPyBmdWxsQ2h1bmtzIDogZnVsbENodW5rcyArIDE7CisgICAgdmFyIGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTsKKyAgICB2YXIgc3JjUG9zID0gMDsKKyAgICB2YXIgc3JjID0gaW1nRGF0YS5kYXRhOworICAgIHZhciBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHsKKyAgICAgIHZhciB0aGlzQ2h1bmtIZWlnaHQgPSBpIDwgZnVsbENodW5rcyA/IEZVTExfQ0hVTktfSEVJR0hUIDogcGFydGlhbENodW5rSGVpZ2h0OworICAgICAgdmFyIGRlc3RQb3MgPSAzOworCisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXNDaHVua0hlaWdodDsgaisrKSB7CisgICAgICAgIHZhciBtYXNrID0gMDsKKworICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHdpZHRoOyBrKyspIHsKKyAgICAgICAgICBpZiAoIW1hc2spIHsKKyAgICAgICAgICAgIHZhciBlbGVtID0gc3JjW3NyY1BvcysrXTsKKyAgICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGVzdFtkZXN0UG9zXSA9IGVsZW0gJiBtYXNrID8gMCA6IDI1NTsKKyAgICAgICAgICBkZXN0UG9zICs9IDQ7CisgICAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb3B5Q3R4U3RhdGUoc291cmNlQ3R4LCBkZXN0Q3R4KSB7CisgICAgdmFyIHByb3BlcnRpZXMgPSBbInN0cm9rZVN0eWxlIiwgImZpbGxTdHlsZSIsICJmaWxsUnVsZSIsICJnbG9iYWxBbHBoYSIsICJsaW5lV2lkdGgiLCAibGluZUNhcCIsICJsaW5lSm9pbiIsICJtaXRlckxpbWl0IiwgImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsICJmb250Il07CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07CisKKyAgICAgIGlmIChzb3VyY2VDdHhbcHJvcGVydHldICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgZGVzdEN0eFtwcm9wZXJ0eV0gPSBzb3VyY2VDdHhbcHJvcGVydHldOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzb3VyY2VDdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkgeworICAgICAgZGVzdEN0eC5zZXRMaW5lRGFzaChzb3VyY2VDdHguZ2V0TGluZURhc2goKSk7CisgICAgICBkZXN0Q3R4LmxpbmVEYXNoT2Zmc2V0ID0gc291cmNlQ3R4LmxpbmVEYXNoT2Zmc2V0OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KGN0eCkgeworICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjMDAwMDAwIjsKKyAgICBjdHguZmlsbFN0eWxlID0gIiMwMDAwMDAiOworICAgIGN0eC5maWxsUnVsZSA9ICJub256ZXJvIjsKKyAgICBjdHguZ2xvYmFsQWxwaGEgPSAxOworICAgIGN0eC5saW5lV2lkdGggPSAxOworICAgIGN0eC5saW5lQ2FwID0gImJ1dHQiOworICAgIGN0eC5saW5lSm9pbiA9ICJtaXRlciI7CisgICAgY3R4Lm1pdGVyTGltaXQgPSAxMDsKKyAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNvdXJjZS1vdmVyIjsKKyAgICBjdHguZm9udCA9ICIxMHB4IHNhbnMtc2VyaWYiOworCisgICAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBjdHguc2V0TGluZURhc2goW10pOworICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gMDsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21wb3NlU01hc2tCYWNrZHJvcChieXRlcywgcjAsIGcwLCBiMCkgeworICAgIHZhciBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisKKyAgICBmb3IgKHZhciBpID0gMzsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CisgICAgICB2YXIgYWxwaGEgPSBieXRlc1tpXTsKKworICAgICAgaWYgKGFscGhhID09PSAwKSB7CisgICAgICAgIGJ5dGVzW2kgLSAzXSA9IHIwOworICAgICAgICBieXRlc1tpIC0gMl0gPSBnMDsKKyAgICAgICAgYnl0ZXNbaSAtIDFdID0gYjA7CisgICAgICB9IGVsc2UgaWYgKGFscGhhIDwgMjU1KSB7CisgICAgICAgIHZhciBhbHBoYV8gPSAyNTUgLSBhbHBoYTsKKyAgICAgICAgYnl0ZXNbaSAtIDNdID0gYnl0ZXNbaSAtIDNdICogYWxwaGEgKyByMCAqIGFscGhhXyA+PiA4OworICAgICAgICBieXRlc1tpIC0gMl0gPSBieXRlc1tpIC0gMl0gKiBhbHBoYSArIGcwICogYWxwaGFfID4+IDg7CisgICAgICAgIGJ5dGVzW2kgLSAxXSA9IGJ5dGVzW2kgLSAxXSAqIGFscGhhICsgYjAgKiBhbHBoYV8gPj4gODsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYShtYXNrRGF0YSwgbGF5ZXJEYXRhLCB0cmFuc2Zlck1hcCkgeworICAgIHZhciBsZW5ndGggPSBtYXNrRGF0YS5sZW5ndGg7CisgICAgdmFyIHNjYWxlID0gMSAvIDI1NTsKKworICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgIHZhciBhbHBoYSA9IHRyYW5zZmVyTWFwID8gdHJhbnNmZXJNYXBbbWFza0RhdGFbaV1dIDogbWFza0RhdGFbaV07CisgICAgICBsYXllckRhdGFbaV0gPSBsYXllckRhdGFbaV0gKiBhbHBoYSAqIHNjYWxlIHwgMDsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21wb3NlU01hc2tMdW1pbm9zaXR5KG1hc2tEYXRhLCBsYXllckRhdGEsIHRyYW5zZmVyTWFwKSB7CisgICAgdmFyIGxlbmd0aCA9IG1hc2tEYXRhLmxlbmd0aDsKKworICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgIHZhciB5ID0gbWFza0RhdGFbaSAtIDNdICogNzcgKyBtYXNrRGF0YVtpIC0gMl0gKiAxNTIgKyBtYXNrRGF0YVtpIC0gMV0gKiAyODsKKyAgICAgIGxheWVyRGF0YVtpXSA9IHRyYW5zZmVyTWFwID8gbGF5ZXJEYXRhW2ldICogdHJhbnNmZXJNYXBbeSA+PiA4XSA+PiA4IDogbGF5ZXJEYXRhW2ldICogeSA+PiAxNjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZW5lcmljQ29tcG9zZVNNYXNrKG1hc2tDdHgsIGxheWVyQ3R4LCB3aWR0aCwgaGVpZ2h0LCBzdWJ0eXBlLCBiYWNrZHJvcCwgdHJhbnNmZXJNYXApIHsKKyAgICB2YXIgaGFzQmFja2Ryb3AgPSAhIWJhY2tkcm9wOworICAgIHZhciByMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMF0gOiAwOworICAgIHZhciBnMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMV0gOiAwOworICAgIHZhciBiMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMl0gOiAwOworICAgIHZhciBjb21wb3NlRm47CisKKyAgICBpZiAoc3VidHlwZSA9PT0gIkx1bWlub3NpdHkiKSB7CisgICAgICBjb21wb3NlRm4gPSBjb21wb3NlU01hc2tMdW1pbm9zaXR5OworICAgIH0gZWxzZSB7CisgICAgICBjb21wb3NlRm4gPSBjb21wb3NlU01hc2tBbHBoYTsKKyAgICB9CisKKyAgICB2YXIgUElYRUxTX1RPX1BST0NFU1MgPSAxMDQ4NTc2OworICAgIHZhciBjaHVua1NpemUgPSBNYXRoLm1pbihoZWlnaHQsIE1hdGguY2VpbChQSVhFTFNfVE9fUFJPQ0VTUyAvIHdpZHRoKSk7CisKKyAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArPSBjaHVua1NpemUpIHsKKyAgICAgIHZhciBjaHVua0hlaWdodCA9IE1hdGgubWluKGNodW5rU2l6ZSwgaGVpZ2h0IC0gcm93KTsKKyAgICAgIHZhciBtYXNrRGF0YSA9IG1hc2tDdHguZ2V0SW1hZ2VEYXRhKDAsIHJvdywgd2lkdGgsIGNodW5rSGVpZ2h0KTsKKyAgICAgIHZhciBsYXllckRhdGEgPSBsYXllckN0eC5nZXRJbWFnZURhdGEoMCwgcm93LCB3aWR0aCwgY2h1bmtIZWlnaHQpOworCisgICAgICBpZiAoaGFzQmFja2Ryb3ApIHsKKyAgICAgICAgY29tcG9zZVNNYXNrQmFja2Ryb3AobWFza0RhdGEuZGF0YSwgcjAsIGcwLCBiMCk7CisgICAgICB9CisKKyAgICAgIGNvbXBvc2VGbihtYXNrRGF0YS5kYXRhLCBsYXllckRhdGEuZGF0YSwgdHJhbnNmZXJNYXApOworICAgICAgbWFza0N0eC5wdXRJbWFnZURhdGEobGF5ZXJEYXRhLCAwLCByb3cpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGNvbXBvc2VTTWFzayhjdHgsIHNtYXNrLCBsYXllckN0eCwgd2ViR0xDb250ZXh0KSB7CisgICAgdmFyIG1hc2sgPSBzbWFzay5jYW52YXM7CisgICAgdmFyIG1hc2tDdHggPSBzbWFzay5jb250ZXh0OworICAgIGN0eC5zZXRUcmFuc2Zvcm0oc21hc2suc2NhbGVYLCAwLCAwLCBzbWFzay5zY2FsZVksIHNtYXNrLm9mZnNldFgsIHNtYXNrLm9mZnNldFkpOworICAgIHZhciBiYWNrZHJvcCA9IHNtYXNrLmJhY2tkcm9wIHx8IG51bGw7CisKKyAgICBpZiAoIXNtYXNrLnRyYW5zZmVyTWFwICYmIHdlYkdMQ29udGV4dC5pc0VuYWJsZWQpIHsKKyAgICAgIGNvbnN0IGNvbXBvc2VkID0gd2ViR0xDb250ZXh0LmNvbXBvc2VTTWFzayh7CisgICAgICAgIGxheWVyOiBsYXllckN0eC5jYW52YXMsCisgICAgICAgIG1hc2ssCisgICAgICAgIHByb3BlcnRpZXM6IHsKKyAgICAgICAgICBzdWJ0eXBlOiBzbWFzay5zdWJ0eXBlLAorICAgICAgICAgIGJhY2tkcm9wCisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTsKKyAgICAgIGN0eC5kcmF3SW1hZ2UoY29tcG9zZWQsIHNtYXNrLm9mZnNldFgsIHNtYXNrLm9mZnNldFkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdlbmVyaWNDb21wb3NlU01hc2sobWFza0N0eCwgbGF5ZXJDdHgsIG1hc2sud2lkdGgsIG1hc2suaGVpZ2h0LCBzbWFzay5zdWJ0eXBlLCBiYWNrZHJvcCwgc21hc2sudHJhbnNmZXJNYXApOworICAgIGN0eC5kcmF3SW1hZ2UobWFzaywgMCwgMCk7CisgIH0KKworICB2YXIgTElORV9DQVBfU1RZTEVTID0gWyJidXR0IiwgInJvdW5kIiwgInNxdWFyZSJdOworICB2YXIgTElORV9KT0lOX1NUWUxFUyA9IFsibWl0ZXIiLCAicm91bmQiLCAiYmV2ZWwiXTsKKyAgdmFyIE5PUk1BTF9DTElQID0ge307CisgIHZhciBFT19DTElQID0ge307CisgIENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZSA9IHsKKyAgICBiZWdpbkRyYXdpbmcoeworICAgICAgdHJhbnNmb3JtLAorICAgICAgdmlld3BvcnQsCisgICAgICB0cmFuc3BhcmVuY3kgPSBmYWxzZSwKKyAgICAgIGJhY2tncm91bmQgPSBudWxsCisgICAgfSkgeworICAgICAgdmFyIHdpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoOworICAgICAgdmFyIGhlaWdodCA9IHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7CisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kIHx8ICJyZ2IoMjU1LCAyNTUsIDI1NSkiOworICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisKKyAgICAgIGlmICh0cmFuc3BhcmVuY3kpIHsKKyAgICAgICAgdmFyIHRyYW5zcGFyZW50Q2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoInRyYW5zcGFyZW50Iiwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7CisgICAgICAgIHRoaXMuY29tcG9zaXRlQ3R4ID0gdGhpcy5jdHg7CisgICAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSB0cmFuc3BhcmVudENhbnZhcy5jYW52YXM7CisgICAgICAgIHRoaXMuY3R4ID0gdHJhbnNwYXJlbnRDYW52YXMuY29udGV4dDsKKyAgICAgICAgdGhpcy5jdHguc2F2ZSgpOworICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsIHRoaXMuY29tcG9zaXRlQ3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0pOworICAgICAgfQorCisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7CisKKyAgICAgIGlmICh0cmFuc2Zvcm0pIHsKKyAgICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCB0cmFuc2Zvcm0pOworICAgICAgfQorCisgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsIHZpZXdwb3J0LnRyYW5zZm9ybSk7CisgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLnNsaWNlKCk7CisKKyAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHsKKyAgICAgICAgdGhpcy5pbWFnZUxheWVyLmJlZ2luTGF5b3V0KCk7CisgICAgICB9CisgICAgfSwKKworICAgIGV4ZWN1dGVPcGVyYXRvckxpc3Q6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2V4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0LCBleGVjdXRpb25TdGFydElkeCwgY29udGludWVDYWxsYmFjaywgc3RlcHBlcikgeworICAgICAgdmFyIGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7CisgICAgICB2YXIgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5OworICAgICAgdmFyIGkgPSBleGVjdXRpb25TdGFydElkeCB8fCAwOworICAgICAgdmFyIGFyZ3NBcnJheUxlbiA9IGFyZ3NBcnJheS5sZW5ndGg7CisKKyAgICAgIGlmIChhcmdzQXJyYXlMZW4gPT09IGkpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisKKyAgICAgIHZhciBjaHVua09wZXJhdGlvbnMgPSBhcmdzQXJyYXlMZW4gLSBpID4gRVhFQ1VUSU9OX1NURVBTICYmIHR5cGVvZiBjb250aW51ZUNhbGxiYWNrID09PSAiZnVuY3Rpb24iOworICAgICAgdmFyIGVuZFRpbWUgPSBjaHVua09wZXJhdGlvbnMgPyBEYXRlLm5vdygpICsgRVhFQ1VUSU9OX1RJTUUgOiAwOworICAgICAgdmFyIHN0ZXBzID0gMDsKKyAgICAgIHZhciBjb21tb25PYmpzID0gdGhpcy5jb21tb25PYmpzOworICAgICAgdmFyIG9ianMgPSB0aGlzLm9ianM7CisgICAgICB2YXIgZm5JZDsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKHN0ZXBwZXIgIT09IHVuZGVmaW5lZCAmJiBpID09PSBzdGVwcGVyLm5leHRCcmVha1BvaW50KSB7CisgICAgICAgICAgc3RlcHBlci5icmVha0l0KGksIGNvbnRpbnVlQ2FsbGJhY2spOworICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisKKyAgICAgICAgZm5JZCA9IGZuQXJyYXlbaV07CisKKyAgICAgICAgaWYgKGZuSWQgIT09IF91dGlsLk9QUy5kZXBlbmRlbmN5KSB7CisgICAgICAgICAgdGhpc1tmbklkXS5hcHBseSh0aGlzLCBhcmdzQXJyYXlbaV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoY29uc3QgZGVwT2JqSWQgb2YgYXJnc0FycmF5W2ldKSB7CisgICAgICAgICAgICBjb25zdCBvYmpzUG9vbCA9IGRlcE9iaklkLnN0YXJ0c1dpdGgoImdfIikgPyBjb21tb25PYmpzIDogb2JqczsKKworICAgICAgICAgICAgaWYgKCFvYmpzUG9vbC5oYXMoZGVwT2JqSWQpKSB7CisgICAgICAgICAgICAgIG9ianNQb29sLmdldChkZXBPYmpJZCwgY29udGludWVDYWxsYmFjayk7CisgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkrKzsKKworICAgICAgICBpZiAoaSA9PT0gYXJnc0FycmF5TGVuKSB7CisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2h1bmtPcGVyYXRpb25zICYmICsrc3RlcHMgPiBFWEVDVVRJT05fU1RFUFMpIHsKKyAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IGVuZFRpbWUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlQ2FsbGJhY2soKTsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgIH0KKworICAgICAgICAgIHN0ZXBzID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgZW5kRHJhd2luZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kRHJhd2luZygpIHsKKyAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgIT09IG51bGwpIHsKKyAgICAgICAgdGhpcy5lbmRTTWFza0dyb3VwKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTsKKworICAgICAgaWYgKHRoaXMudHJhbnNwYXJlbnRDYW52YXMpIHsKKyAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNvbXBvc2l0ZUN0eDsKKyAgICAgICAgdGhpcy5jdHguc2F2ZSgpOworICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnRyYW5zcGFyZW50Q2FudmFzLCAwLCAwKTsKKyAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpOworICAgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdGhpcy5jYWNoZWRDYW52YXNlcy5jbGVhcigpOworICAgICAgdGhpcy53ZWJHTENvbnRleHQuY2xlYXIoKTsKKworICAgICAgaWYgKHRoaXMuaW1hZ2VMYXllcikgeworICAgICAgICB0aGlzLmltYWdlTGF5ZXIuZW5kTGF5b3V0KCk7CisgICAgICB9CisgICAgfSwKKyAgICBzZXRMaW5lV2lkdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExpbmVXaWR0aCh3aWR0aCkgeworICAgICAgdGhpcy5jdXJyZW50LmxpbmVXaWR0aCA9IHdpZHRoOworICAgICAgdGhpcy5jdHgubGluZVdpZHRoID0gd2lkdGg7CisgICAgfSwKKyAgICBzZXRMaW5lQ2FwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMaW5lQ2FwKHN0eWxlKSB7CisgICAgICB0aGlzLmN0eC5saW5lQ2FwID0gTElORV9DQVBfU1RZTEVTW3N0eWxlXTsKKyAgICB9LAorICAgIHNldExpbmVKb2luOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMaW5lSm9pbihzdHlsZSkgeworICAgICAgdGhpcy5jdHgubGluZUpvaW4gPSBMSU5FX0pPSU5fU1RZTEVTW3N0eWxlXTsKKyAgICB9LAorICAgIHNldE1pdGVyTGltaXQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldE1pdGVyTGltaXQobGltaXQpIHsKKyAgICAgIHRoaXMuY3R4Lm1pdGVyTGltaXQgPSBsaW1pdDsKKyAgICB9LAorICAgIHNldERhc2g6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKworICAgICAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoQXJyYXkpOworICAgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBkYXNoUGhhc2U7CisgICAgICB9CisgICAgfSwKKworICAgIHNldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHt9LAorCisgICAgc2V0RmxhdG5lc3MoZmxhdG5lc3MpIHt9LAorCisgICAgc2V0R1N0YXRlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRHU3RhdGUoc3RhdGVzKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdGF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgc3RhdGUgPSBzdGF0ZXNbaV07CisgICAgICAgIHZhciBrZXkgPSBzdGF0ZVswXTsKKyAgICAgICAgdmFyIHZhbHVlID0gc3RhdGVbMV07CisKKyAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICBjYXNlICJMVyI6CisgICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkxDIjoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkxKIjoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4odmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJNTCI6CisgICAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQodmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJEIjoKKyAgICAgICAgICAgIHRoaXMuc2V0RGFzaCh2YWx1ZVswXSwgdmFsdWVbMV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJSSSI6CisgICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkZMIjoKKyAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3ModmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJGb250IjoKKyAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh2YWx1ZVswXSwgdmFsdWVbMV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJDQSI6CisgICAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBzdGF0ZVsxXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiY2EiOgorICAgICAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSA9IHN0YXRlWzFdOworICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBzdGF0ZVsxXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQk0iOgorICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlNNYXNrIjoKKyAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2spIHsKKyAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggPiAwICYmIHRoaXMuc3RhdGVTdGFja1t0aGlzLnN0YXRlU3RhY2subGVuZ3RoIC0gMV0uYWN0aXZlU01hc2sgPT09IHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykgeworICAgICAgICAgICAgICAgIHRoaXMuc3VzcGVuZFNNYXNrR3JvdXAoKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmVuZFNNYXNrR3JvdXAoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSB2YWx1ZSA/IHRoaXMudGVtcFNNYXNrIDogbnVsbDsKKworICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykgeworICAgICAgICAgICAgICB0aGlzLmJlZ2luU01hc2tHcm91cCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlRSIjoKKyAgICAgICAgICAgIHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgYmVnaW5TTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpblNNYXNrR3JvdXAoKSB7CisgICAgICB2YXIgYWN0aXZlU01hc2sgPSB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s7CisgICAgICB2YXIgZHJhd25XaWR0aCA9IGFjdGl2ZVNNYXNrLmNhbnZhcy53aWR0aDsKKyAgICAgIHZhciBkcmF3bkhlaWdodCA9IGFjdGl2ZVNNYXNrLmNhbnZhcy5oZWlnaHQ7CisgICAgICB2YXIgY2FjaGVJZCA9ICJzbWFza0dyb3VwQXQiICsgdGhpcy5ncm91cExldmVsOworICAgICAgdmFyIHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhjYWNoZUlkLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCwgdHJ1ZSk7CisgICAgICB2YXIgY3VycmVudEN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBjdXJyZW50Q3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07CisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICB2YXIgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7CisgICAgICBncm91cEN0eC5zY2FsZSgxIC8gYWN0aXZlU01hc2suc2NhbGVYLCAxIC8gYWN0aXZlU01hc2suc2NhbGVZKTsKKyAgICAgIGdyb3VwQ3R4LnRyYW5zbGF0ZSgtYWN0aXZlU01hc2sub2Zmc2V0WCwgLWFjdGl2ZVNNYXNrLm9mZnNldFkpOworICAgICAgZ3JvdXBDdHgudHJhbnNmb3JtLmFwcGx5KGdyb3VwQ3R4LCBjdXJyZW50VHJhbnNmb3JtKTsKKyAgICAgIGFjdGl2ZVNNYXNrLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZSA9IGdyb3VwQ3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlOworICAgICAgY29weUN0eFN0YXRlKGN1cnJlbnRDdHgsIGdyb3VwQ3R4KTsKKyAgICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7CisgICAgICB0aGlzLnNldEdTdGF0ZShbWyJCTSIsICJzb3VyY2Utb3ZlciJdLCBbImNhIiwgMV0sIFsiQ0EiLCAxXV0pOworICAgICAgdGhpcy5ncm91cFN0YWNrLnB1c2goY3VycmVudEN0eCk7CisgICAgICB0aGlzLmdyb3VwTGV2ZWwrKzsKKyAgICB9LAorICAgIHN1c3BlbmRTTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRTTWFza0dyb3VwKCkgeworICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdHg7CisgICAgICB0aGlzLmdyb3VwTGV2ZWwtLTsKKyAgICAgIHRoaXMuY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpOworICAgICAgY29tcG9zZVNNYXNrKHRoaXMuY3R4LCB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2ssIGdyb3VwQ3R4LCB0aGlzLndlYkdMQ29udGV4dCk7CisgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICBjb3B5Q3R4U3RhdGUoZ3JvdXBDdHgsIHRoaXMuY3R4KTsKKyAgICAgIHRoaXMuY3VycmVudC5yZXN1bWVTTWFza0N0eCA9IGdyb3VwQ3R4OworCisgICAgICB2YXIgZGVsdGFUcmFuc2Zvcm0gPSBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2suc3RhcnRUcmFuc2Zvcm1JbnZlcnNlLCBncm91cEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtKTsKKworICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCBkZWx0YVRyYW5zZm9ybSk7CisgICAgICBncm91cEN0eC5zYXZlKCk7CisgICAgICBncm91cEN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgICBncm91cEN0eC5jbGVhclJlY3QoMCwgMCwgZ3JvdXBDdHguY2FudmFzLndpZHRoLCBncm91cEN0eC5jYW52YXMuaGVpZ2h0KTsKKyAgICAgIGdyb3VwQ3R4LnJlc3RvcmUoKTsKKyAgICB9LAorICAgIHJlc3VtZVNNYXNrR3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFNNYXNrR3JvdXAoKSB7CisgICAgICB2YXIgZ3JvdXBDdHggPSB0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHg7CisgICAgICB2YXIgY3VycmVudEN0eCA9IHRoaXMuY3R4OworICAgICAgdGhpcy5jdHggPSBncm91cEN0eDsKKyAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGN1cnJlbnRDdHgpOworICAgICAgdGhpcy5ncm91cExldmVsKys7CisgICAgfSwKKyAgICBlbmRTTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRTTWFza0dyb3VwKCkgeworICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdHg7CisgICAgICB0aGlzLmdyb3VwTGV2ZWwtLTsKKyAgICAgIHRoaXMuY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpOworICAgICAgY29tcG9zZVNNYXNrKHRoaXMuY3R4LCB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2ssIGdyb3VwQ3R4LCB0aGlzLndlYkdMQ29udGV4dCk7CisgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisgICAgICBjb3B5Q3R4U3RhdGUoZ3JvdXBDdHgsIHRoaXMuY3R4KTsKKworICAgICAgdmFyIGRlbHRhVHJhbnNmb3JtID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZSwgZ3JvdXBDdHgubW96Q3VycmVudFRyYW5zZm9ybSk7CisKKyAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgZGVsdGFUcmFuc2Zvcm0pOworICAgIH0sCisgICAgc2F2ZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2F2ZSgpIHsKKyAgICAgIHRoaXMuY3R4LnNhdmUoKTsKKyAgICAgIHZhciBvbGQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICB0aGlzLnN0YXRlU3RhY2sucHVzaChvbGQpOworICAgICAgdGhpcy5jdXJyZW50ID0gb2xkLmNsb25lKCk7CisgICAgICB0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHggPSBudWxsOworICAgIH0sCisgICAgcmVzdG9yZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcmVzdG9yZSgpIHsKKyAgICAgIGlmICh0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHgpIHsKKyAgICAgICAgdGhpcy5yZXN1bWVTTWFza0dyb3VwKCk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgIT09IG51bGwgJiYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggPT09IDAgfHwgdGhpcy5zdGF0ZVN0YWNrW3RoaXMuc3RhdGVTdGFjay5sZW5ndGggLSAxXS5hY3RpdmVTTWFzayAhPT0gdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSkgeworICAgICAgICB0aGlzLmVuZFNNYXNrR3JvdXAoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggIT09IDApIHsKKyAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpOworICAgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsOworICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfdHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTsKKyAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsOworICAgIH0sCisgICAgY29uc3RydWN0UGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY29uc3RydWN0UGF0aChvcHMsIGFyZ3MpIHsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgdmFyIHggPSBjdXJyZW50LngsCisgICAgICAgICAgeSA9IGN1cnJlbnQueTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwLCBpaSA9IG9wcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAob3BzW2ldIHwgMCkgeworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnJlY3RhbmdsZToKKyAgICAgICAgICAgIHggPSBhcmdzW2orK107CisgICAgICAgICAgICB5ID0gYXJnc1tqKytdOworICAgICAgICAgICAgdmFyIHdpZHRoID0gYXJnc1tqKytdOworICAgICAgICAgICAgdmFyIGhlaWdodCA9IGFyZ3NbaisrXTsKKworICAgICAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIGN0eC5saW5lV2lkdGggPCB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSkgeworICAgICAgICAgICAgICB3aWR0aCA9IHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGVpZ2h0ID09PSAwICYmIGN0eC5saW5lV2lkdGggPCB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSkgeworICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHh3ID0geCArIHdpZHRoOworICAgICAgICAgICAgdmFyIHloID0geSArIGhlaWdodDsKKyAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7CisgICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5KTsKKyAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTsKKyAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeWgpOworICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTsKKyAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRvOgorICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2orK107CisgICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5saW5lVG86CisgICAgICAgICAgICB4ID0gYXJnc1tqKytdOworICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG86CisgICAgICAgICAgICB4ID0gYXJnc1tqICsgNF07CisgICAgICAgICAgICB5ID0gYXJnc1tqICsgNV07CisgICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdLCB4LCB5KTsKKyAgICAgICAgICAgIGogKz0gNjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzI6CisgICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyh4LCB5LCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdKTsKKyAgICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTsKKyAgICAgICAgICAgIGogKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzM6CisgICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07CisgICAgICAgICAgICB5ID0gYXJnc1tqICsgM107CisgICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhhcmdzW2pdLCBhcmdzW2ogKyAxXSwgeCwgeSwgeCwgeSk7CisgICAgICAgICAgICBqICs9IDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDoKKyAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpOworICAgIH0sCisgICAgY2xvc2VQYXRoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbG9zZVBhdGgoKSB7CisgICAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTsKKyAgICB9LAorICAgIHN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc3Ryb2tlKGNvbnN1bWVQYXRoKSB7CisgICAgICBjb25zdW1lUGF0aCA9IHR5cGVvZiBjb25zdW1lUGF0aCAhPT0gInVuZGVmaW5lZCIgPyBjb25zdW1lUGF0aCA6IHRydWU7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7CisgICAgICBjdHguZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGE7CisKKyAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIGlmIChzdHJva2VDb2xvciAmJiBzdHJva2VDb2xvci5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpICYmIHN0cm9rZUNvbG9yLnR5cGUgPT09ICJQYXR0ZXJuIikgeworICAgICAgICAgIGN0eC5zYXZlKCk7CisgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07CisKKyAgICAgICAgICBjb25zdCBzY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodHJhbnNmb3JtKVswXTsKKworICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzKTsKKyAgICAgICAgICBjdHgubGluZVdpZHRoID0gTWF0aC5tYXgodGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkgKiBNSU5fV0lEVEhfRkFDVE9SLCB0aGlzLmN1cnJlbnQubGluZVdpZHRoICogc2NhbGUpOworICAgICAgICAgIGN0eC5zdHJva2UoKTsKKyAgICAgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBNYXRoLm1heCh0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSAqIE1JTl9XSURUSF9GQUNUT1IsIHRoaXMuY3VycmVudC5saW5lV2lkdGgpOworICAgICAgICAgIGN0eC5zdHJva2UoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY29uc3VtZVBhdGgpIHsKKyAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpOworICAgICAgfQorCisgICAgICBjdHguZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuZmlsbEFscGhhOworICAgIH0sCisgICAgY2xvc2VTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlU3Ryb2tlKCkgeworICAgICAgdGhpcy5jbG9zZVBhdGgoKTsKKyAgICAgIHRoaXMuc3Ryb2tlKCk7CisgICAgfSwKKyAgICBmaWxsOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19maWxsKGNvbnN1bWVQYXRoKSB7CisgICAgICBjb25zdW1lUGF0aCA9IHR5cGVvZiBjb25zdW1lUGF0aCAhPT0gInVuZGVmaW5lZCIgPyBjb25zdW1lUGF0aCA6IHRydWU7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjsKKyAgICAgIHZhciBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsOworICAgICAgdmFyIG5lZWRSZXN0b3JlID0gZmFsc2U7CisKKyAgICAgIGlmIChpc1BhdHRlcm5GaWxsKSB7CisgICAgICAgIGN0eC5zYXZlKCk7CisKKyAgICAgICAgaWYgKHRoaXMuYmFzZVRyYW5zZm9ybSkgeworICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3R4LCB0aGlzLmJhc2VUcmFuc2Zvcm0pOworICAgICAgICB9CisKKyAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcyk7CisgICAgICAgIG5lZWRSZXN0b3JlID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgaWYgKHRoaXMucGVuZGluZ0VPRmlsbCkgeworICAgICAgICAgIGN0eC5maWxsKCJldmVub2RkIik7CisgICAgICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3R4LmZpbGwoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobmVlZFJlc3RvcmUpIHsKKyAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbnN1bWVQYXRoKSB7CisgICAgICAgIHRoaXMuY29uc3VtZVBhdGgoKTsKKyAgICAgIH0KKyAgICB9LAorICAgIGVvRmlsbDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW9GaWxsKCkgeworICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTsKKyAgICAgIHRoaXMuZmlsbCgpOworICAgIH0sCisgICAgZmlsbFN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZmlsbFN0cm9rZSgpIHsKKyAgICAgIHRoaXMuZmlsbChmYWxzZSk7CisgICAgICB0aGlzLnN0cm9rZShmYWxzZSk7CisgICAgICB0aGlzLmNvbnN1bWVQYXRoKCk7CisgICAgfSwKKyAgICBlb0ZpbGxTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VvRmlsbFN0cm9rZSgpIHsKKyAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7CisgICAgICB0aGlzLmZpbGxTdHJva2UoKTsKKyAgICB9LAorICAgIGNsb3NlRmlsbFN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VGaWxsU3Ryb2tlKCkgeworICAgICAgdGhpcy5jbG9zZVBhdGgoKTsKKyAgICAgIHRoaXMuZmlsbFN0cm9rZSgpOworICAgIH0sCisgICAgY2xvc2VFT0ZpbGxTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlRU9GaWxsU3Ryb2tlKCkgeworICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTsKKyAgICAgIHRoaXMuY2xvc2VQYXRoKCk7CisgICAgICB0aGlzLmZpbGxTdHJva2UoKTsKKyAgICB9LAorICAgIGVuZFBhdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFBhdGgoKSB7CisgICAgICB0aGlzLmNvbnN1bWVQYXRoKCk7CisgICAgfSwKKyAgICBjbGlwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbGlwKCkgeworICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IE5PUk1BTF9DTElQOworICAgIH0sCisgICAgZW9DbGlwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lb0NsaXAoKSB7CisgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gRU9fQ0xJUDsKKyAgICB9LAorICAgIGJlZ2luVGV4dDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5UZXh0KCkgeworICAgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7CisgICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gMTsKKyAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDsKKyAgICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZID0gMDsKKyAgICB9LAorICAgIGVuZFRleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFRleHQoKSB7CisgICAgICB2YXIgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHM7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisKKyAgICAgIGlmIChwYXRocyA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjdHguc2F2ZSgpOworICAgICAgY3R4LmJlZ2luUGF0aCgpOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBwYXRoID0gcGF0aHNbaV07CisgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3R4LCBwYXRoLnRyYW5zZm9ybSk7CisgICAgICAgIGN0eC50cmFuc2xhdGUocGF0aC54LCBwYXRoLnkpOworICAgICAgICBwYXRoLmFkZFRvUGF0aChjdHgsIHBhdGguZm9udFNpemUpOworICAgICAgfQorCisgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgY3R4LmNsaXAoKTsKKyAgICAgIGN0eC5iZWdpblBhdGgoKTsKKyAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdUZXh0UGF0aHM7CisgICAgfSwKKyAgICBzZXRDaGFyU3BhY2luZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Q2hhclNwYWNpbmcoc3BhY2luZykgeworICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gc3BhY2luZzsKKyAgICB9LAorICAgIHNldFdvcmRTcGFjaW5nOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRXb3JkU3BhY2luZyhzcGFjaW5nKSB7CisgICAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSBzcGFjaW5nOworICAgIH0sCisgICAgc2V0SFNjYWxlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRIU2NhbGUoc2NhbGUpIHsKKyAgICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gc2NhbGUgLyAxMDA7CisgICAgfSwKKyAgICBzZXRMZWFkaW5nOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMZWFkaW5nKGxlYWRpbmcpIHsKKyAgICAgIHRoaXMuY3VycmVudC5sZWFkaW5nID0gLWxlYWRpbmc7CisgICAgfSwKKyAgICBzZXRGb250OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRGb250KGZvbnRSZWZOYW1lLCBzaXplKSB7CisgICAgICB2YXIgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZm9udFJlZk5hbWUpOworICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisKKyAgICAgIGlmICghZm9udE9iaikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGZpbmQgZm9udCBmb3IgJHtmb250UmVmTmFtZX1gKTsKKyAgICAgIH0KKworICAgICAgY3VycmVudC5mb250TWF0cml4ID0gZm9udE9iai5mb250TWF0cml4ID8gZm9udE9iai5mb250TWF0cml4IDogX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7CisKKyAgICAgIGlmIChjdXJyZW50LmZvbnRNYXRyaXhbMF0gPT09IDAgfHwgY3VycmVudC5mb250TWF0cml4WzNdID09PSAwKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBmb250IG1hdHJpeCBmb3IgZm9udCAiICsgZm9udFJlZk5hbWUpOworICAgICAgfQorCisgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgc2l6ZSA9IC1zaXplOworICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAtMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IDE7CisgICAgICB9CisKKyAgICAgIHRoaXMuY3VycmVudC5mb250ID0gZm9udE9iajsKKyAgICAgIHRoaXMuY3VycmVudC5mb250U2l6ZSA9IHNpemU7CisKKyAgICAgIGlmIChmb250T2JqLmlzVHlwZTNGb250KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIG5hbWUgPSBmb250T2JqLmxvYWRlZE5hbWUgfHwgInNhbnMtc2VyaWYiOworICAgICAgbGV0IGJvbGQgPSAibm9ybWFsIjsKKworICAgICAgaWYgKGZvbnRPYmouYmxhY2spIHsKKyAgICAgICAgYm9sZCA9ICI5MDAiOworICAgICAgfSBlbHNlIGlmIChmb250T2JqLmJvbGQpIHsKKyAgICAgICAgYm9sZCA9ICJib2xkIjsKKyAgICAgIH0KKworICAgICAgdmFyIGl0YWxpYyA9IGZvbnRPYmouaXRhbGljID8gIml0YWxpYyIgOiAibm9ybWFsIjsKKyAgICAgIHZhciB0eXBlZmFjZSA9IGAiJHtuYW1lfSIsICR7Zm9udE9iai5mYWxsYmFja05hbWV9YDsKKyAgICAgIGxldCBicm93c2VyRm9udFNpemUgPSBzaXplOworCisgICAgICBpZiAoc2l6ZSA8IE1JTl9GT05UX1NJWkUpIHsKKyAgICAgICAgYnJvd3NlckZvbnRTaXplID0gTUlOX0ZPTlRfU0laRTsKKyAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IE1BWF9GT05UX1NJWkUpIHsKKyAgICAgICAgYnJvd3NlckZvbnRTaXplID0gTUFYX0ZPTlRfU0laRTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGUgPSBzaXplIC8gYnJvd3NlckZvbnRTaXplOworICAgICAgdGhpcy5jdHguZm9udCA9IGAke2l0YWxpY30gJHtib2xkfSAke2Jyb3dzZXJGb250U2l6ZX1weCAke3R5cGVmYWNlfWA7CisgICAgfSwKKyAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0VGV4dFJlbmRlcmluZ01vZGUobW9kZSkgeworICAgICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gbW9kZTsKKyAgICB9LAorICAgIHNldFRleHRSaXNlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRUZXh0UmlzZShyaXNlKSB7CisgICAgICB0aGlzLmN1cnJlbnQudGV4dFJpc2UgPSByaXNlOworICAgIH0sCisgICAgbW92ZVRleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21vdmVUZXh0KHgsIHkpIHsKKyAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYICs9IHg7CisgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSArPSB5OworICAgIH0sCisgICAgc2V0TGVhZGluZ01vdmVUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMZWFkaW5nTW92ZVRleHQoeCwgeSkgeworICAgICAgdGhpcy5zZXRMZWFkaW5nKC15KTsKKyAgICAgIHRoaXMubW92ZVRleHQoeCwgeSk7CisgICAgfSwKKyAgICBzZXRUZXh0TWF0cml4OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdOworICAgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTsKKyAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDsKKyAgICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZID0gMDsKKyAgICB9LAorICAgIG5leHRMaW5lOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19uZXh0TGluZSgpIHsKKyAgICAgIHRoaXMubW92ZVRleHQoMCwgdGhpcy5jdXJyZW50LmxlYWRpbmcpOworICAgIH0sCisKKyAgICBwYWludENoYXIoY2hhcmFjdGVyLCB4LCB5LCBwYXR0ZXJuVHJhbnNmb3JtKSB7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgIHZhciBmb250ID0gY3VycmVudC5mb250OworICAgICAgdmFyIHRleHRSZW5kZXJpbmdNb2RlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZTsKKyAgICAgIHZhciBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemUgLyBjdXJyZW50LmZvbnRTaXplU2NhbGU7CisgICAgICB2YXIgZmlsbFN0cm9rZU1vZGUgPSB0ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7CisgICAgICB2YXIgaXNBZGRUb1BhdGhTZXQgPSAhISh0ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcpOworICAgICAgY29uc3QgcGF0dGVybkZpbGwgPSBjdXJyZW50LnBhdHRlcm5GaWxsICYmICFmb250Lm1pc3NpbmdGaWxlOworICAgICAgdmFyIGFkZFRvUGF0aDsKKworICAgICAgaWYgKGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IGlzQWRkVG9QYXRoU2V0IHx8IHBhdHRlcm5GaWxsKSB7CisgICAgICAgIGFkZFRvUGF0aCA9IGZvbnQuZ2V0UGF0aEdlbmVyYXRvcih0aGlzLmNvbW1vbk9ianMsIGNoYXJhY3Rlcik7CisgICAgICB9CisKKyAgICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBwYXR0ZXJuRmlsbCkgeworICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICBjdHgudHJhbnNsYXRlKHgsIHkpOworICAgICAgICBjdHguYmVnaW5QYXRoKCk7CisgICAgICAgIGFkZFRvUGF0aChjdHgsIGZvbnRTaXplKTsKKworICAgICAgICBpZiAocGF0dGVyblRyYW5zZm9ybSkgeworICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3R4LCBwYXR0ZXJuVHJhbnNmb3JtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHsKKyAgICAgICAgICBjdHguZmlsbCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7CisgICAgICAgICAgY3R4LnN0cm9rZSgpOworICAgICAgICB9CisKKyAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHsKKyAgICAgICAgICBjdHguZmlsbFRleHQoY2hhcmFjdGVyLCB4LCB5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkgeworICAgICAgICAgIGN0eC5zdHJva2VUZXh0KGNoYXJhY3RlciwgeCwgeSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGlzQWRkVG9QYXRoU2V0KSB7CisgICAgICAgIHZhciBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRocyB8fCAodGhpcy5wZW5kaW5nVGV4dFBhdGhzID0gW10pOworICAgICAgICBwYXRocy5wdXNoKHsKKyAgICAgICAgICB0cmFuc2Zvcm06IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLAorICAgICAgICAgIHgsCisgICAgICAgICAgeSwKKyAgICAgICAgICBmb250U2l6ZSwKKyAgICAgICAgICBhZGRUb1BhdGgKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIGdldCBpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCgpIHsKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgY29udGV4dDogY3R4CisgICAgICB9ID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoImlzRm9udFN1YnBpeGVsQUFFbmFibGVkIiwgMTAsIDEwKTsKKyAgICAgIGN0eC5zY2FsZSgxLjUsIDEpOworICAgICAgY3R4LmZpbGxUZXh0KCJJIiwgMCwgMTApOworICAgICAgdmFyIGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEwLCAxMCkuZGF0YTsKKyAgICAgIHZhciBlbmFibGVkID0gZmFsc2U7CisKKyAgICAgIGZvciAodmFyIGkgPSAzOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkgeworICAgICAgICBpZiAoZGF0YVtpXSA+IDAgJiYgZGF0YVtpXSA8IDI1NSkgeworICAgICAgICAgIGVuYWJsZWQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiaXNGb250U3VicGl4ZWxBQUVuYWJsZWQiLCBlbmFibGVkKTsKKyAgICB9LAorCisgICAgc2hvd1RleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3Nob3dUZXh0KGdseXBocykgeworICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICB2YXIgZm9udCA9IGN1cnJlbnQuZm9udDsKKworICAgICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1R5cGUzVGV4dChnbHlwaHMpOworICAgICAgfQorCisgICAgICB2YXIgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplOworCisgICAgICBpZiAoZm9udFNpemUgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIGZvbnRTaXplU2NhbGUgPSBjdXJyZW50LmZvbnRTaXplU2NhbGU7CisgICAgICB2YXIgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nOworICAgICAgdmFyIHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZzsKKyAgICAgIHZhciBmb250RGlyZWN0aW9uID0gY3VycmVudC5mb250RGlyZWN0aW9uOworICAgICAgdmFyIHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uOworICAgICAgdmFyIGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7CisgICAgICB2YXIgdmVydGljYWwgPSBmb250LnZlcnRpY2FsOworICAgICAgdmFyIHNwYWNpbmdEaXIgPSB2ZXJ0aWNhbCA/IDEgOiAtMTsKKyAgICAgIHZhciBkZWZhdWx0Vk1ldHJpY3MgPSBmb250LmRlZmF1bHRWTWV0cmljczsKKyAgICAgIHZhciB3aWR0aEFkdmFuY2VTY2FsZSA9IGZvbnRTaXplICogY3VycmVudC5mb250TWF0cml4WzBdOworICAgICAgdmFyIHNpbXBsZUZpbGxUZXh0ID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCAmJiAhZm9udC5kaXNhYmxlRm9udEZhY2UgJiYgIWN1cnJlbnQucGF0dGVybkZpbGw7CisgICAgICBjdHguc2F2ZSgpOworICAgICAgbGV0IHBhdHRlcm5UcmFuc2Zvcm07CisKKyAgICAgIGlmIChjdXJyZW50LnBhdHRlcm5GaWxsKSB7CisgICAgICAgIGN0eC5zYXZlKCk7CisgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBjdXJyZW50LmZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcyk7CisgICAgICAgIHBhdHRlcm5UcmFuc2Zvcm0gPSBjdHgubW96Q3VycmVudFRyYW5zZm9ybTsKKyAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm47CisgICAgICB9CisKKyAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCBjdXJyZW50LnRleHRNYXRyaXgpOworICAgICAgY3R4LnRyYW5zbGF0ZShjdXJyZW50LngsIGN1cnJlbnQueSArIGN1cnJlbnQudGV4dFJpc2UpOworCisgICAgICBpZiAoZm9udERpcmVjdGlvbiA+IDApIHsKKyAgICAgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIC0xKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAxKTsKKyAgICAgIH0KKworICAgICAgdmFyIGxpbmVXaWR0aCA9IGN1cnJlbnQubGluZVdpZHRoOworICAgICAgdmFyIHNjYWxlID0gY3VycmVudC50ZXh0TWF0cml4U2NhbGU7CisKKyAgICAgIGlmIChzY2FsZSA9PT0gMCB8fCBsaW5lV2lkdGggPT09IDApIHsKKyAgICAgICAgdmFyIGZpbGxTdHJva2VNb2RlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7CisKKyAgICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7CisgICAgICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7CisgICAgICAgICAgbGluZVdpZHRoID0gdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkgKiBNSU5fV0lEVEhfRkFDVE9SOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBsaW5lV2lkdGggLz0gc2NhbGU7CisgICAgICB9CisKKyAgICAgIGlmIChmb250U2l6ZVNjYWxlICE9PSAxLjApIHsKKyAgICAgICAgY3R4LnNjYWxlKGZvbnRTaXplU2NhbGUsIGZvbnRTaXplU2NhbGUpOworICAgICAgICBsaW5lV2lkdGggLz0gZm9udFNpemVTY2FsZTsKKyAgICAgIH0KKworICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKKyAgICAgIHZhciB4ID0gMCwKKyAgICAgICAgICBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2ldOworCisgICAgICAgIGlmICgoMCwgX3V0aWwuaXNOdW0pKGdseXBoKSkgeworICAgICAgICAgIHggKz0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJlc3RvcmVOZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgdmFyIHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZzsKKyAgICAgICAgdmFyIGNoYXJhY3RlciA9IGdseXBoLmZvbnRDaGFyOworICAgICAgICB2YXIgYWNjZW50ID0gZ2x5cGguYWNjZW50OworICAgICAgICB2YXIgc2NhbGVkWCwgc2NhbGVkWSwgc2NhbGVkQWNjZW50WCwgc2NhbGVkQWNjZW50WTsKKyAgICAgICAgdmFyIHdpZHRoID0gZ2x5cGgud2lkdGg7CisKKyAgICAgICAgaWYgKHZlcnRpY2FsKSB7CisgICAgICAgICAgdmFyIHZtZXRyaWMsIHZ4LCB2eTsKKyAgICAgICAgICB2bWV0cmljID0gZ2x5cGgudm1ldHJpYyB8fCBkZWZhdWx0Vk1ldHJpY3M7CisgICAgICAgICAgdnggPSBnbHlwaC52bWV0cmljID8gdm1ldHJpY1sxXSA6IHdpZHRoICogMC41OworICAgICAgICAgIHZ4ID0gLXZ4ICogd2lkdGhBZHZhbmNlU2NhbGU7CisgICAgICAgICAgdnkgPSB2bWV0cmljWzJdICogd2lkdGhBZHZhbmNlU2NhbGU7CisgICAgICAgICAgd2lkdGggPSB2bWV0cmljID8gLXZtZXRyaWNbMF0gOiB3aWR0aDsKKyAgICAgICAgICBzY2FsZWRYID0gdnggLyBmb250U2l6ZVNjYWxlOworICAgICAgICAgIHNjYWxlZFkgPSAoeCArIHZ5KSAvIGZvbnRTaXplU2NhbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2NhbGVkWCA9IHggLyBmb250U2l6ZVNjYWxlOworICAgICAgICAgIHNjYWxlZFkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvbnQucmVtZWFzdXJlICYmIHdpZHRoID4gMCkgeworICAgICAgICAgIHZhciBtZWFzdXJlZFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGNoYXJhY3Rlcikud2lkdGggKiAxMDAwIC8gZm9udFNpemUgKiBmb250U2l6ZVNjYWxlOworCisgICAgICAgICAgaWYgKHdpZHRoIDwgbWVhc3VyZWRXaWR0aCAmJiB0aGlzLmlzRm9udFN1YnBpeGVsQUFFbmFibGVkKSB7CisgICAgICAgICAgICB2YXIgY2hhcmFjdGVyU2NhbGVYID0gd2lkdGggLyBtZWFzdXJlZFdpZHRoOworICAgICAgICAgICAgcmVzdG9yZU5lZWRlZCA9IHRydWU7CisgICAgICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICAgICAgY3R4LnNjYWxlKGNoYXJhY3RlclNjYWxlWCwgMSk7CisgICAgICAgICAgICBzY2FsZWRYIC89IGNoYXJhY3RlclNjYWxlWDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoICE9PSBtZWFzdXJlZFdpZHRoKSB7CisgICAgICAgICAgICBzY2FsZWRYICs9ICh3aWR0aCAtIG1lYXN1cmVkV2lkdGgpIC8gMjAwMCAqIGZvbnRTaXplIC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZ2x5cGguaXNJbkZvbnQgfHwgZm9udC5taXNzaW5nRmlsZSkpIHsKKyAgICAgICAgICBpZiAoc2ltcGxlRmlsbFRleHQgJiYgIWFjY2VudCkgeworICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3Rlciwgc2NhbGVkWCwgc2NhbGVkWSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucGFpbnRDaGFyKGNoYXJhY3Rlciwgc2NhbGVkWCwgc2NhbGVkWSwgcGF0dGVyblRyYW5zZm9ybSk7CisKKyAgICAgICAgICAgIGlmIChhY2NlbnQpIHsKKyAgICAgICAgICAgICAgc2NhbGVkQWNjZW50WCA9IHNjYWxlZFggKyBmb250U2l6ZSAqIGFjY2VudC5vZmZzZXQueCAvIGZvbnRTaXplU2NhbGU7CisgICAgICAgICAgICAgIHNjYWxlZEFjY2VudFkgPSBzY2FsZWRZIC0gZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LnkgLyBmb250U2l6ZVNjYWxlOworICAgICAgICAgICAgICB0aGlzLnBhaW50Q2hhcihhY2NlbnQuZm9udENoYXIsIHNjYWxlZEFjY2VudFgsIHNjYWxlZEFjY2VudFksIHBhdHRlcm5UcmFuc2Zvcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciBjaGFyV2lkdGg7CisKKyAgICAgICAgaWYgKHZlcnRpY2FsKSB7CisgICAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAtIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNoYXJXaWR0aCA9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgKyBzcGFjaW5nICogZm9udERpcmVjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHggKz0gY2hhcldpZHRoOworCisgICAgICAgIGlmIChyZXN0b3JlTmVlZGVkKSB7CisgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgY3VycmVudC55IC09IHg7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50LnggKz0geCAqIHRleHRIU2NhbGU7CisgICAgICB9CisKKyAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgfSwKKyAgICBzaG93VHlwZTNUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zaG93VHlwZTNUZXh0KGdseXBocykgeworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICB2YXIgZm9udCA9IGN1cnJlbnQuZm9udDsKKyAgICAgIHZhciBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7CisgICAgICB2YXIgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjsKKyAgICAgIHZhciBzcGFjaW5nRGlyID0gZm9udC52ZXJ0aWNhbCA/IDEgOiAtMTsKKyAgICAgIHZhciBjaGFyU3BhY2luZyA9IGN1cnJlbnQuY2hhclNwYWNpbmc7CisgICAgICB2YXIgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nOworICAgICAgdmFyIHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uOworICAgICAgdmFyIGZvbnRNYXRyaXggPSBjdXJyZW50LmZvbnRNYXRyaXggfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7CisgICAgICB2YXIgZ2x5cGhzTGVuZ3RoID0gZ2x5cGhzLmxlbmd0aDsKKyAgICAgIHZhciBpc1RleHRJbnZpc2libGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5JTlZJU0lCTEU7CisgICAgICB2YXIgaSwgZ2x5cGgsIHdpZHRoLCBzcGFjaW5nTGVuZ3RoOworCisgICAgICBpZiAoaXNUZXh0SW52aXNpYmxlIHx8IGZvbnRTaXplID09PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7CisgICAgICBjdHguc2F2ZSgpOworICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIGN1cnJlbnQudGV4dE1hdHJpeCk7CisgICAgICBjdHgudHJhbnNsYXRlKGN1cnJlbnQueCwgY3VycmVudC55KTsKKyAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCBmb250RGlyZWN0aW9uKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGdseXBoc0xlbmd0aDsgKytpKSB7CisgICAgICAgIGdseXBoID0gZ2x5cGhzW2ldOworCisgICAgICAgIGlmICgoMCwgX3V0aWwuaXNOdW0pKGdseXBoKSkgeworICAgICAgICAgIHNwYWNpbmdMZW5ndGggPSBzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSAvIDEwMDA7CisgICAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHNwYWNpbmdMZW5ndGgsIDApOworICAgICAgICAgIGN1cnJlbnQueCArPSBzcGFjaW5nTGVuZ3RoICogdGV4dEhTY2FsZTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7CisgICAgICAgIHZhciBvcGVyYXRvckxpc3QgPSBmb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0W2dseXBoLm9wZXJhdG9yTGlzdElkXTsKKworICAgICAgICBpZiAoIW9wZXJhdG9yTGlzdCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgVHlwZTMgY2hhcmFjdGVyICIke2dseXBoLm9wZXJhdG9yTGlzdElkfSIgaXMgbm90IGF2YWlsYWJsZS5gKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBnbHlwaDsKKyAgICAgICAgICB0aGlzLnNhdmUoKTsKKyAgICAgICAgICBjdHguc2NhbGUoZm9udFNpemUsIGZvbnRTaXplKTsKKyAgICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgZm9udE1hdHJpeCk7CisgICAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7CisgICAgICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHJhbnNmb3JtZWQgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFtnbHlwaC53aWR0aCwgMF0sIGZvbnRNYXRyaXgpOworCisgICAgICAgIHdpZHRoID0gdHJhbnNmb3JtZWRbMF0gKiBmb250U2l6ZSArIHNwYWNpbmc7CisgICAgICAgIGN0eC50cmFuc2xhdGUod2lkdGgsIDApOworICAgICAgICBjdXJyZW50LnggKz0gd2lkdGggKiB0ZXh0SFNjYWxlOworICAgICAgfQorCisgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBudWxsOworICAgIH0sCisgICAgc2V0Q2hhcldpZHRoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRDaGFyV2lkdGgoeFdpZHRoLCB5V2lkdGgpIHt9LAorICAgIHNldENoYXJXaWR0aEFuZEJvdW5kczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Q2hhcldpZHRoQW5kQm91bmRzKHhXaWR0aCwgeVdpZHRoLCBsbHgsIGxseSwgdXJ4LCB1cnkpIHsKKyAgICAgIHRoaXMuY3R4LnJlY3QobGx4LCBsbHksIHVyeCAtIGxseCwgdXJ5IC0gbGx5KTsKKyAgICAgIHRoaXMuY2xpcCgpOworICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgfSwKKyAgICBnZXRDb2xvck5fUGF0dGVybjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZ2V0Q29sb3JOX1BhdHRlcm4oSVIpIHsKKyAgICAgIHZhciBwYXR0ZXJuOworCisgICAgICBpZiAoSVJbMF0gPT09ICJUaWxpbmdQYXR0ZXJuIikgeworICAgICAgICB2YXIgY29sb3IgPSBJUlsxXTsKKyAgICAgICAgdmFyIGJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm0gfHwgdGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybS5zbGljZSgpOworICAgICAgICB2YXIgY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0geworICAgICAgICAgIGNyZWF0ZUNhbnZhc0dyYXBoaWNzOiBjdHggPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYW52YXNHcmFwaGljcyhjdHgsIHRoaXMuY29tbW9uT2JqcywgdGhpcy5vYmpzLCB0aGlzLmNhbnZhc0ZhY3RvcnksIHRoaXMud2ViR0xDb250ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHBhdHRlcm4gPSBuZXcgX3BhdHRlcm5faGVscGVyLlRpbGluZ1BhdHRlcm4oSVIsIGNvbG9yLCB0aGlzLmN0eCwgY2FudmFzR3JhcGhpY3NGYWN0b3J5LCBiYXNlVHJhbnNmb3JtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhdHRlcm4gPSAoMCwgX3BhdHRlcm5faGVscGVyLmdldFNoYWRpbmdQYXR0ZXJuRnJvbUlSKShJUik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBwYXR0ZXJuOworICAgIH0sCisgICAgc2V0U3Ryb2tlQ29sb3JOOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRTdHJva2VDb2xvck4oKSB7CisgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7CisgICAgfSwKKyAgICBzZXRGaWxsQ29sb3JOOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRGaWxsQ29sb3JOKCkgeworICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTsKKyAgICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IHRydWU7CisgICAgfSwKKyAgICBzZXRTdHJva2VSR0JDb2xvcjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0U3Ryb2tlUkdCQ29sb3IociwgZywgYikgeworICAgICAgdmFyIGNvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKHIsIGcsIGIpOworCisgICAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IGNvbG9yOworICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY29sb3I7CisgICAgfSwKKyAgICBzZXRGaWxsUkdCQ29sb3I6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEZpbGxSR0JDb2xvcihyLCBnLCBiKSB7CisgICAgICB2YXIgY29sb3IgPSBfdXRpbC5VdGlsLm1ha2VDc3NSZ2IociwgZywgYik7CisKKyAgICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGNvbG9yOworICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGNvbG9yOworICAgICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gZmFsc2U7CisgICAgfSwKKyAgICBzaGFkaW5nRmlsbDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2hhZGluZ0ZpbGwocGF0dGVybklSKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB0aGlzLnNhdmUoKTsKKyAgICAgIHZhciBwYXR0ZXJuID0gKDAsIF9wYXR0ZXJuX2hlbHBlci5nZXRTaGFkaW5nUGF0dGVybkZyb21JUikocGF0dGVybklSKTsKKyAgICAgIGN0eC5maWxsU3R5bGUgPSBwYXR0ZXJuLmdldFBhdHRlcm4oY3R4LCB0aGlzLCB0cnVlKTsKKyAgICAgIHZhciBpbnYgPSBjdHgubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7CisKKyAgICAgIGlmIChpbnYpIHsKKyAgICAgICAgdmFyIGNhbnZhcyA9IGN0eC5jYW52YXM7CisgICAgICAgIHZhciB3aWR0aCA9IGNhbnZhcy53aWR0aDsKKyAgICAgICAgdmFyIGhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7CisKKyAgICAgICAgdmFyIGJsID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIGludik7CisKKyAgICAgICAgdmFyIGJyID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgaGVpZ2h0XSwgaW52KTsKKworICAgICAgICB2YXIgdWwgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt3aWR0aCwgMF0sIGludik7CisKKyAgICAgICAgdmFyIHVyID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIGhlaWdodF0sIGludik7CisKKyAgICAgICAgdmFyIHgwID0gTWF0aC5taW4oYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pOworICAgICAgICB2YXIgeTAgPSBNYXRoLm1pbihibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7CisgICAgICAgIHZhciB4MSA9IE1hdGgubWF4KGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTsKKyAgICAgICAgdmFyIHkxID0gTWF0aC5tYXgoYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pOworICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoLTFlMTAsIC0xZTEwLCAyZTEwLCAyZTEwKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgfSwKKyAgICBiZWdpbklubGluZUltYWdlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbklubGluZUltYWdlKCkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGJlZ2luSW5saW5lSW1hZ2UiKTsKKyAgICB9LAorICAgIGJlZ2luSW1hZ2VEYXRhOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkltYWdlRGF0YSgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YSIpOworICAgIH0sCisgICAgcGFpbnRGb3JtWE9iamVjdEJlZ2luOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEZvcm1YT2JqZWN0QmVnaW4obWF0cml4LCBiYm94KSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLnNhdmUoKTsKKyAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5iYXNlVHJhbnNmb3JtKTsKKworICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0cml4KSAmJiBtYXRyaXgubGVuZ3RoID09PSA2KSB7CisgICAgICAgIHRoaXMudHJhbnNmb3JtLmFwcGx5KHRoaXMsIG1hdHJpeCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IHRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07CisKKyAgICAgIGlmIChiYm94KSB7CisgICAgICAgIHZhciB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdOworICAgICAgICB2YXIgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07CisgICAgICAgIHRoaXMuY3R4LnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHRoaXMuY2xpcCgpOworICAgICAgICB0aGlzLmVuZFBhdGgoKTsKKyAgICAgIH0KKyAgICB9LAorICAgIHBhaW50Rm9ybVhPYmplY3RFbmQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50Rm9ybVhPYmplY3RFbmQoKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLnJlc3RvcmUoKTsKKyAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnBvcCgpOworICAgIH0sCisgICAgYmVnaW5Hcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5Hcm91cChncm91cCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5zYXZlKCk7CisgICAgICB2YXIgY3VycmVudEN0eCA9IHRoaXMuY3R4OworCisgICAgICBpZiAoIWdyb3VwLmlzb2xhdGVkKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVE9ETzogU3VwcG9ydCBub24taXNvbGF0ZWQgZ3JvdXBzLiIpOworICAgICAgfQorCisgICAgICBpZiAoZ3JvdXAua25vY2tvdXQpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBjdXJyZW50Q3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07CisKKyAgICAgIGlmIChncm91cC5tYXRyaXgpIHsKKyAgICAgICAgY3VycmVudEN0eC50cmFuc2Zvcm0uYXBwbHkoY3VycmVudEN0eCwgZ3JvdXAubWF0cml4KTsKKyAgICAgIH0KKworICAgICAgaWYgKCFncm91cC5iYm94KSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLiIpOworICAgICAgfQorCisgICAgICB2YXIgYm91bmRzID0gX3V0aWwuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChncm91cC5iYm94LCBjdXJyZW50Q3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgICB2YXIgY2FudmFzQm91bmRzID0gWzAsIDAsIGN1cnJlbnRDdHguY2FudmFzLndpZHRoLCBjdXJyZW50Q3R4LmNhbnZhcy5oZWlnaHRdOworICAgICAgYm91bmRzID0gX3V0aWwuVXRpbC5pbnRlcnNlY3QoYm91bmRzLCBjYW52YXNCb3VuZHMpIHx8IFswLCAwLCAwLCAwXTsKKyAgICAgIHZhciBvZmZzZXRYID0gTWF0aC5mbG9vcihib3VuZHNbMF0pOworICAgICAgdmFyIG9mZnNldFkgPSBNYXRoLmZsb29yKGJvdW5kc1sxXSk7CisgICAgICB2YXIgZHJhd25XaWR0aCA9IE1hdGgubWF4KE1hdGguY2VpbChib3VuZHNbMl0pIC0gb2Zmc2V0WCwgMSk7CisgICAgICB2YXIgZHJhd25IZWlnaHQgPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzNdKSAtIG9mZnNldFksIDEpOworICAgICAgdmFyIHNjYWxlWCA9IDEsCisgICAgICAgICAgc2NhbGVZID0gMTsKKworICAgICAgaWYgKGRyYXduV2lkdGggPiBNQVhfR1JPVVBfU0laRSkgeworICAgICAgICBzY2FsZVggPSBkcmF3bldpZHRoIC8gTUFYX0dST1VQX1NJWkU7CisgICAgICAgIGRyYXduV2lkdGggPSBNQVhfR1JPVVBfU0laRTsKKyAgICAgIH0KKworICAgICAgaWYgKGRyYXduSGVpZ2h0ID4gTUFYX0dST1VQX1NJWkUpIHsKKyAgICAgICAgc2NhbGVZID0gZHJhd25IZWlnaHQgLyBNQVhfR1JPVVBfU0laRTsKKyAgICAgICAgZHJhd25IZWlnaHQgPSBNQVhfR1JPVVBfU0laRTsKKyAgICAgIH0KKworICAgICAgdmFyIGNhY2hlSWQgPSAiZ3JvdXBBdCIgKyB0aGlzLmdyb3VwTGV2ZWw7CisKKyAgICAgIGlmIChncm91cC5zbWFzaykgeworICAgICAgICBjYWNoZUlkICs9ICJfc21hc2tfIiArIHRoaXMuc21hc2tDb3VudGVyKysgJSAyOworICAgICAgfQorCisgICAgICB2YXIgc2NyYXRjaENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKGNhY2hlSWQsIGRyYXduV2lkdGgsIGRyYXduSGVpZ2h0LCB0cnVlKTsKKyAgICAgIHZhciBncm91cEN0eCA9IHNjcmF0Y2hDYW52YXMuY29udGV4dDsKKyAgICAgIGdyb3VwQ3R4LnNjYWxlKDEgLyBzY2FsZVgsIDEgLyBzY2FsZVkpOworICAgICAgZ3JvdXBDdHgudHJhbnNsYXRlKC1vZmZzZXRYLCAtb2Zmc2V0WSk7CisgICAgICBncm91cEN0eC50cmFuc2Zvcm0uYXBwbHkoZ3JvdXBDdHgsIGN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgICBpZiAoZ3JvdXAuc21hc2spIHsKKyAgICAgICAgdGhpcy5zbWFza1N0YWNrLnB1c2goeworICAgICAgICAgIGNhbnZhczogc2NyYXRjaENhbnZhcy5jYW52YXMsCisgICAgICAgICAgY29udGV4dDogZ3JvdXBDdHgsCisgICAgICAgICAgb2Zmc2V0WCwKKyAgICAgICAgICBvZmZzZXRZLAorICAgICAgICAgIHNjYWxlWCwKKyAgICAgICAgICBzY2FsZVksCisgICAgICAgICAgc3VidHlwZTogZ3JvdXAuc21hc2suc3VidHlwZSwKKyAgICAgICAgICBiYWNrZHJvcDogZ3JvdXAuc21hc2suYmFja2Ryb3AsCisgICAgICAgICAgdHJhbnNmZXJNYXA6IGdyb3VwLnNtYXNrLnRyYW5zZmVyTWFwIHx8IG51bGwsCisgICAgICAgICAgc3RhcnRUcmFuc2Zvcm1JbnZlcnNlOiBudWxsCisgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3VycmVudEN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgICAgIGN1cnJlbnRDdHgudHJhbnNsYXRlKG9mZnNldFgsIG9mZnNldFkpOworICAgICAgICBjdXJyZW50Q3R4LnNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKKyAgICAgIH0KKworICAgICAgY29weUN0eFN0YXRlKGN1cnJlbnRDdHgsIGdyb3VwQ3R4KTsKKyAgICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7CisgICAgICB0aGlzLnNldEdTdGF0ZShbWyJCTSIsICJzb3VyY2Utb3ZlciJdLCBbImNhIiwgMV0sIFsiQ0EiLCAxXV0pOworICAgICAgdGhpcy5ncm91cFN0YWNrLnB1c2goY3VycmVudEN0eCk7CisgICAgICB0aGlzLmdyb3VwTGV2ZWwrKzsKKyAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayA9IG51bGw7CisgICAgfSwKKyAgICBlbmRHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kR3JvdXAoZ3JvdXApIHsKKyAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuZ3JvdXBMZXZlbC0tOworICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdHg7CisgICAgICB0aGlzLmN0eCA9IHRoaXMuZ3JvdXBTdGFjay5wb3AoKTsKKworICAgICAgaWYgKHRoaXMuY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRoaXMuY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5jdHgubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChncm91cC5zbWFzaykgeworICAgICAgICB0aGlzLnRlbXBTTWFzayA9IHRoaXMuc21hc2tTdGFjay5wb3AoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShncm91cEN0eC5jYW52YXMsIDAsIDApOworICAgICAgfQorCisgICAgICB0aGlzLnJlc3RvcmUoKTsKKyAgICB9LAorICAgIGJlZ2luQW5ub3RhdGlvbnM6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luQW5ub3RhdGlvbnMoKSB7CisgICAgICB0aGlzLnNhdmUoKTsKKworICAgICAgaWYgKHRoaXMuYmFzZVRyYW5zZm9ybSkgeworICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsIHRoaXMuYmFzZVRyYW5zZm9ybSk7CisgICAgICB9CisgICAgfSwKKyAgICBlbmRBbm5vdGF0aW9uczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kQW5ub3RhdGlvbnMoKSB7CisgICAgICB0aGlzLnJlc3RvcmUoKTsKKyAgICB9LAorICAgIGJlZ2luQW5ub3RhdGlvbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5Bbm5vdGF0aW9uKHJlY3QsIHRyYW5zZm9ybSwgbWF0cml4KSB7CisgICAgICB0aGlzLnNhdmUoKTsKKyAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTsKKyAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBDYW52YXNFeHRyYVN0YXRlKCk7CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlY3QpICYmIHJlY3QubGVuZ3RoID09PSA0KSB7CisgICAgICAgIHZhciB3aWR0aCA9IHJlY3RbMl0gLSByZWN0WzBdOworICAgICAgICB2YXIgaGVpZ2h0ID0gcmVjdFszXSAtIHJlY3RbMV07CisgICAgICAgIHRoaXMuY3R4LnJlY3QocmVjdFswXSwgcmVjdFsxXSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHRoaXMuY2xpcCgpOworICAgICAgICB0aGlzLmVuZFBhdGgoKTsKKyAgICAgIH0KKworICAgICAgdGhpcy50cmFuc2Zvcm0uYXBwbHkodGhpcywgdHJhbnNmb3JtKTsKKyAgICAgIHRoaXMudHJhbnNmb3JtLmFwcGx5KHRoaXMsIG1hdHJpeCk7CisgICAgfSwKKyAgICBlbmRBbm5vdGF0aW9uOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRBbm5vdGF0aW9uKCkgeworICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgfSwKKyAgICBwYWludEltYWdlTWFza1hPYmplY3Q6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VNYXNrWE9iamVjdChpbWcpIHsKKyAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciB3aWR0aCA9IGltZy53aWR0aCwKKyAgICAgICAgICBoZWlnaHQgPSBpbWcuaGVpZ2h0OworICAgICAgdmFyIGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7CisgICAgICB2YXIgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDsKKyAgICAgIHZhciBnbHlwaCA9IHRoaXMucHJvY2Vzc2luZ1R5cGUzOworCisgICAgICBpZiAoQ09NUElMRV9UWVBFM19HTFlQSFMgJiYgZ2x5cGggJiYgZ2x5cGguY29tcGlsZWQgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBpZiAod2lkdGggPD0gTUFYX1NJWkVfVE9fQ09NUElMRSAmJiBoZWlnaHQgPD0gTUFYX1NJWkVfVE9fQ09NUElMRSkgeworICAgICAgICAgIGdseXBoLmNvbXBpbGVkID0gY29tcGlsZVR5cGUzR2x5cGgoeworICAgICAgICAgICAgZGF0YTogaW1nLmRhdGEsCisgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdodAorICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdseXBoLmNvbXBpbGVkID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZ2x5cGggJiYgZ2x5cGguY29tcGlsZWQpIHsKKyAgICAgICAgZ2x5cGguY29tcGlsZWQoY3R4KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtYXNrQ2FudmFzIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICB2YXIgbWFza0N0eCA9IG1hc2tDYW52YXMuY29udGV4dDsKKyAgICAgIG1hc2tDdHguc2F2ZSgpOworICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDdHgsIGltZyk7CisgICAgICBtYXNrQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2UtaW4iOworICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4obWFza0N0eCwgdGhpcykgOiBmaWxsQ29sb3I7CisgICAgICBtYXNrQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgbWFza0N0eC5yZXN0b3JlKCk7CisgICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KG1hc2tDYW52YXMuY2FudmFzKTsKKyAgICB9LAorCisgICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KGltZ0RhdGEsIHNjYWxlWCwgc2tld1ggPSAwLCBza2V3WSA9IDAsIHNjYWxlWSwgcG9zaXRpb25zKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgd2lkdGggPSBpbWdEYXRhLndpZHRoOworICAgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0OworICAgICAgdmFyIGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7CisgICAgICB2YXIgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDsKKyAgICAgIHZhciBtYXNrQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoIm1hc2tDYW52YXMiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0OworICAgICAgbWFza0N0eC5zYXZlKCk7CisgICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0N0eCwgaW1nRGF0YSk7CisgICAgICBtYXNrQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2UtaW4iOworICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4obWFza0N0eCwgdGhpcykgOiBmaWxsQ29sb3I7CisgICAgICBtYXNrQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgbWFza0N0eC5yZXN0b3JlKCk7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CisgICAgICAgIGN0eC5zYXZlKCk7CisgICAgICAgIGN0eC50cmFuc2Zvcm0oc2NhbGVYLCBza2V3WCwgc2tld1ksIHNjYWxlWSwgcG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdKTsKKyAgICAgICAgY3R4LnNjYWxlKDEsIC0xKTsKKyAgICAgICAgY3R4LmRyYXdJbWFnZShtYXNrQ2FudmFzLmNhbnZhcywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEsIDEpOworICAgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgfQorICAgIH0sCisKKyAgICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXAoaW1hZ2VzKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjsKKyAgICAgIHZhciBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbWFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgaW1hZ2UgPSBpbWFnZXNbaV07CisgICAgICAgIHZhciB3aWR0aCA9IGltYWdlLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0OworICAgICAgICB2YXIgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtYXNrQ2FudmFzIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0OworICAgICAgICBtYXNrQ3R4LnNhdmUoKTsKKyAgICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDdHgsIGltYWdlKTsKKyAgICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAic291cmNlLWluIjsKKyAgICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4obWFza0N0eCwgdGhpcykgOiBmaWxsQ29sb3I7CisgICAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1hc2tDdHgucmVzdG9yZSgpOworICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgaW1hZ2UudHJhbnNmb3JtKTsKKyAgICAgICAgY3R4LnNjYWxlKDEsIC0xKTsKKyAgICAgICAgY3R4LmRyYXdJbWFnZShtYXNrQ2FudmFzLmNhbnZhcywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEsIDEpOworICAgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgfQorICAgIH0sCisgICAgcGFpbnRJbWFnZVhPYmplY3Q6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VYT2JqZWN0KG9iaklkKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBpbWdEYXRhID0gb2JqSWQuc3RhcnRzV2l0aCgiZ18iKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQob2JqSWQpIDogdGhpcy5vYmpzLmdldChvYmpJZCk7CisKKyAgICAgIGlmICghaW1nRGF0YSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpOworICAgIH0sCisgICAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KG9iaklkLCBzY2FsZVgsIHNjYWxlWSwgcG9zaXRpb25zKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBpbWdEYXRhID0gb2JqSWQuc3RhcnRzV2l0aCgiZ18iKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQob2JqSWQpIDogdGhpcy5vYmpzLmdldChvYmpJZCk7CisKKyAgICAgIGlmICghaW1nRGF0YSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgd2lkdGggPSBpbWdEYXRhLndpZHRoOworICAgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0OworICAgICAgdmFyIG1hcCA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgeworICAgICAgICBtYXAucHVzaCh7CisgICAgICAgICAgdHJhbnNmb3JtOiBbc2NhbGVYLCAwLCAwLCBzY2FsZVksIHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXV0sCisgICAgICAgICAgeDogMCwKKyAgICAgICAgICB5OiAwLAorICAgICAgICAgIHc6IHdpZHRoLAorICAgICAgICAgIGg6IGhlaWdodAorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGltZ0RhdGEsIG1hcCk7CisgICAgfSwKKyAgICBwYWludElubGluZUltYWdlWE9iamVjdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aDsKKyAgICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHRoaXMuc2F2ZSgpOworICAgICAgY3R4LnNjYWxlKDEgLyB3aWR0aCwgLTEgLyBoZWlnaHQpOworICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBjdHgubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7CisgICAgICB2YXIgYSA9IGN1cnJlbnRUcmFuc2Zvcm1bMF0sCisgICAgICAgICAgYiA9IGN1cnJlbnRUcmFuc2Zvcm1bMV07CisgICAgICB2YXIgd2lkdGhTY2FsZSA9IE1hdGgubWF4KE1hdGguc3FydChhICogYSArIGIgKiBiKSwgMSk7CisgICAgICB2YXIgYyA9IGN1cnJlbnRUcmFuc2Zvcm1bMl0sCisgICAgICAgICAgZCA9IGN1cnJlbnRUcmFuc2Zvcm1bM107CisgICAgICB2YXIgaGVpZ2h0U2NhbGUgPSBNYXRoLm1heChNYXRoLnNxcnQoYyAqIGMgKyBkICogZCksIDEpOworICAgICAgdmFyIGltZ1RvUGFpbnQsIHRtcENhbnZhczsKKworICAgICAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gImZ1bmN0aW9uIiAmJiBpbWdEYXRhIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgIWltZ0RhdGEuZGF0YSkgeworICAgICAgICBpbWdUb1BhaW50ID0gaW1nRGF0YTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJpbmxpbmVJbWFnZSIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7CisgICAgICAgIHB1dEJpbmFyeUltYWdlRGF0YSh0bXBDdHgsIGltZ0RhdGEsIHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMpOworICAgICAgICBpbWdUb1BhaW50ID0gdG1wQ2FudmFzLmNhbnZhczsKKyAgICAgIH0KKworICAgICAgdmFyIHBhaW50V2lkdGggPSB3aWR0aCwKKyAgICAgICAgICBwYWludEhlaWdodCA9IGhlaWdodDsKKyAgICAgIHZhciB0bXBDYW52YXNJZCA9ICJwcmVzY2FsZTEiOworCisgICAgICB3aGlsZSAod2lkdGhTY2FsZSA+IDIgJiYgcGFpbnRXaWR0aCA+IDEgfHwgaGVpZ2h0U2NhbGUgPiAyICYmIHBhaW50SGVpZ2h0ID4gMSkgeworICAgICAgICB2YXIgbmV3V2lkdGggPSBwYWludFdpZHRoLAorICAgICAgICAgICAgbmV3SGVpZ2h0ID0gcGFpbnRIZWlnaHQ7CisKKyAgICAgICAgaWYgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxKSB7CisgICAgICAgICAgbmV3V2lkdGggPSBNYXRoLmNlaWwocGFpbnRXaWR0aCAvIDIpOworICAgICAgICAgIHdpZHRoU2NhbGUgLz0gcGFpbnRXaWR0aCAvIG5ld1dpZHRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhlaWdodFNjYWxlID4gMiAmJiBwYWludEhlaWdodCA+IDEpIHsKKyAgICAgICAgICBuZXdIZWlnaHQgPSBNYXRoLmNlaWwocGFpbnRIZWlnaHQgLyAyKTsKKyAgICAgICAgICBoZWlnaHRTY2FsZSAvPSBwYWludEhlaWdodCAvIG5ld0hlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKHRtcENhbnZhc0lkLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKKyAgICAgICAgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7CisgICAgICAgIHRtcEN0eC5jbGVhclJlY3QoMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7CisgICAgICAgIHRtcEN0eC5kcmF3SW1hZ2UoaW1nVG9QYWludCwgMCwgMCwgcGFpbnRXaWR0aCwgcGFpbnRIZWlnaHQsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpOworICAgICAgICBpbWdUb1BhaW50ID0gdG1wQ2FudmFzLmNhbnZhczsKKyAgICAgICAgcGFpbnRXaWR0aCA9IG5ld1dpZHRoOworICAgICAgICBwYWludEhlaWdodCA9IG5ld0hlaWdodDsKKyAgICAgICAgdG1wQ2FudmFzSWQgPSB0bXBDYW52YXNJZCA9PT0gInByZXNjYWxlMSIgPyAicHJlc2NhbGUyIiA6ICJwcmVzY2FsZTEiOworICAgICAgfQorCisgICAgICBjdHguZHJhd0ltYWdlKGltZ1RvUGFpbnQsIDAsIDAsIHBhaW50V2lkdGgsIHBhaW50SGVpZ2h0LCAwLCAtaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgaWYgKHRoaXMuaW1hZ2VMYXllcikgeworICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldENhbnZhc1Bvc2l0aW9uKDAsIC1oZWlnaHQpOworICAgICAgICB0aGlzLmltYWdlTGF5ZXIuYXBwZW5kSW1hZ2UoeworICAgICAgICAgIGltZ0RhdGEsCisgICAgICAgICAgbGVmdDogcG9zaXRpb25bMF0sCisgICAgICAgICAgdG9wOiBwb3NpdGlvblsxXSwKKyAgICAgICAgICB3aWR0aDogd2lkdGggLyBjdXJyZW50VHJhbnNmb3JtWzBdLAorICAgICAgICAgIGhlaWdodDogaGVpZ2h0IC8gY3VycmVudFRyYW5zZm9ybVszXQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgfSwKKyAgICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGltZ0RhdGEsIG1hcCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIHcgPSBpbWdEYXRhLndpZHRoOworICAgICAgdmFyIGggPSBpbWdEYXRhLmhlaWdodDsKKyAgICAgIHZhciB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygiaW5saW5lSW1hZ2UiLCB3LCBoKTsKKyAgICAgIHZhciB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDsKKyAgICAgIHB1dEJpbmFyeUltYWdlRGF0YSh0bXBDdHgsIGltZ0RhdGEsIHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMpOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBtYXAubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgZW50cnkgPSBtYXBbaV07CisgICAgICAgIGN0eC5zYXZlKCk7CisgICAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCBlbnRyeS50cmFuc2Zvcm0pOworICAgICAgICBjdHguc2NhbGUoMSwgLTEpOworICAgICAgICBjdHguZHJhd0ltYWdlKHRtcENhbnZhcy5jYW52YXMsIGVudHJ5LngsIGVudHJ5LnksIGVudHJ5LncsIGVudHJ5LmgsIDAsIC0xLCAxLCAxKTsKKworICAgICAgICBpZiAodGhpcy5pbWFnZUxheWVyKSB7CisgICAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRDYW52YXNQb3NpdGlvbihlbnRyeS54LCBlbnRyeS55KTsKKyAgICAgICAgICB0aGlzLmltYWdlTGF5ZXIuYXBwZW5kSW1hZ2UoeworICAgICAgICAgICAgaW1nRGF0YSwKKyAgICAgICAgICAgIGxlZnQ6IHBvc2l0aW9uWzBdLAorICAgICAgICAgICAgdG9wOiBwb3NpdGlvblsxXSwKKyAgICAgICAgICAgIHdpZHRoOiB3LAorICAgICAgICAgICAgaGVpZ2h0OiBoCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgfQorICAgIH0sCisgICAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTsKKyAgICB9LAorICAgIG1hcmtQb2ludDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfbWFya1BvaW50KHRhZykge30sCisgICAgbWFya1BvaW50UHJvcHM6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21hcmtQb2ludFByb3BzKHRhZywgcHJvcGVydGllcykge30sCisgICAgYmVnaW5NYXJrZWRDb250ZW50OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbk1hcmtlZENvbnRlbnQodGFnKSB7CisgICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHsKKyAgICAgICAgdmlzaWJsZTogdHJ1ZQorICAgICAgfSk7CisgICAgfSwKKyAgICBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5NYXJrZWRDb250ZW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7CisgICAgICBpZiAodGFnID09PSAiT0MiKSB7CisgICAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goeworICAgICAgICAgIHZpc2libGU6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShwcm9wZXJ0aWVzKQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goeworICAgICAgICAgIHZpc2libGU6IHRydWUKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTsKKyAgICB9LAorICAgIGVuZE1hcmtlZENvbnRlbnQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZE1hcmtlZENvbnRlbnQoKSB7CisgICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wb3AoKTsKKyAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTsKKyAgICB9LAorICAgIGJlZ2luQ29tcGF0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkNvbXBhdCgpIHt9LAorICAgIGVuZENvbXBhdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kQ29tcGF0KCkge30sCisgICAgY29uc3VtZVBhdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2NvbnN1bWVQYXRoKCkgeworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworCisgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkgeworICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCA9PT0gRU9fQ0xJUCkgeworICAgICAgICAgIGN0eC5jbGlwKCJldmVub2RkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3R4LmNsaXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsOworICAgICAgfQorCisgICAgICBjdHguYmVnaW5QYXRoKCk7CisgICAgfSwKKworICAgIGdldFNpbmdsZVBpeGVsV2lkdGgoc2NhbGUpIHsKKyAgICAgIGlmICh0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID09PSBudWxsKSB7CisgICAgICAgIGNvbnN0IGludmVyc2UgPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTsKKyAgICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IE1hdGguc3FydChNYXRoLm1heChpbnZlcnNlWzBdICogaW52ZXJzZVswXSArIGludmVyc2VbMV0gKiBpbnZlcnNlWzFdLCBpbnZlcnNlWzJdICogaW52ZXJzZVsyXSArIGludmVyc2VbM10gKiBpbnZlcnNlWzNdKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoOworICAgIH0sCisKKyAgICBnZXRDYW52YXNQb3NpdGlvbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZ2V0Q2FudmFzUG9zaXRpb24oeCwgeSkgeworICAgICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07CisgICAgICByZXR1cm4gW3RyYW5zZm9ybVswXSAqIHggKyB0cmFuc2Zvcm1bMl0gKiB5ICsgdHJhbnNmb3JtWzRdLCB0cmFuc2Zvcm1bMV0gKiB4ICsgdHJhbnNmb3JtWzNdICogeSArIHRyYW5zZm9ybVs1XV07CisgICAgfSwKKyAgICBpc0NvbnRlbnRWaXNpYmxlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19pc0NvbnRlbnRWaXNpYmxlKCkgeworICAgICAgZm9yIChsZXQgaSA9IHRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGlmICghdGhpcy5tYXJrZWRDb250ZW50U3RhY2tbaV0udmlzaWJsZSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH07CisKKyAgZm9yICh2YXIgb3AgaW4gX3V0aWwuT1BTKSB7CisgICAgQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW191dGlsLk9QU1tvcF1dID0gQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW29wXTsKKyAgfQorCisgIHJldHVybiBDYW52YXNHcmFwaGljczsKK30oKTsKKworZXhwb3J0cy5DYW52YXNHcmFwaGljcyA9IENhbnZhc0dyYXBoaWNzOworCisvKioqLyB9KSwKKy8qIDExICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIgPSBnZXRTaGFkaW5nUGF0dGVybkZyb21JUjsKK2V4cG9ydHMuVGlsaW5nUGF0dGVybiA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIFNoYWRpbmdJUnMgPSB7fTsKKworZnVuY3Rpb24gYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpIHsKKyAgaWYgKCFiYm94IHx8IHR5cGVvZiBQYXRoMkQgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTsKKyAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07CisgIGNvbnN0IHJlZ2lvbiA9IG5ldyBQYXRoMkQoKTsKKyAgcmVnaW9uLnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7CisgIGN0eC5jbGlwKHJlZ2lvbik7Cit9CisKK1NoYWRpbmdJUnMuUmFkaWFsQXhpYWwgPSB7CisgIGZyb21JUjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZnJvbUlSKHJhdykgeworICAgIHZhciB0eXBlID0gcmF3WzFdOworICAgIHZhciBiYm94ID0gcmF3WzJdOworICAgIHZhciBjb2xvclN0b3BzID0gcmF3WzNdOworICAgIHZhciBwMCA9IHJhd1s0XTsKKyAgICB2YXIgcDEgPSByYXdbNV07CisgICAgdmFyIHIwID0gcmF3WzZdOworICAgIHZhciByMSA9IHJhd1s3XTsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZ2V0UGF0dGVybihjdHgpIHsKKyAgICAgICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpOworICAgICAgICB2YXIgZ3JhZDsKKworICAgICAgICBpZiAodHlwZSA9PT0gImF4aWFsIikgeworICAgICAgICAgIGdyYWQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQocDBbMF0sIHAwWzFdLCBwMVswXSwgcDFbMV0pOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJyYWRpYWwiKSB7CisgICAgICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudChwMFswXSwgcDBbMV0sIHIwLCBwMVswXSwgcDFbMV0sIHIxKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbG9yU3RvcHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIHZhciBjID0gY29sb3JTdG9wc1tpXTsKKyAgICAgICAgICBncmFkLmFkZENvbG9yU3RvcChjWzBdLCBjWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBncmFkOworICAgICAgfQorICAgIH07CisgIH0KK307CisKK3ZhciBjcmVhdGVNZXNoQ2FudmFzID0gZnVuY3Rpb24gY3JlYXRlTWVzaENhbnZhc0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwMSwgcDIsIHAzLCBjMSwgYzIsIGMzKSB7CisgICAgdmFyIGNvb3JkcyA9IGNvbnRleHQuY29vcmRzLAorICAgICAgICBjb2xvcnMgPSBjb250ZXh0LmNvbG9yczsKKyAgICB2YXIgYnl0ZXMgPSBkYXRhLmRhdGEsCisgICAgICAgIHJvd1NpemUgPSBkYXRhLndpZHRoICogNDsKKyAgICB2YXIgdG1wOworCisgICAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHsKKyAgICAgIHRtcCA9IHAxOworICAgICAgcDEgPSBwMjsKKyAgICAgIHAyID0gdG1wOworICAgICAgdG1wID0gYzE7CisgICAgICBjMSA9IGMyOworICAgICAgYzIgPSB0bXA7CisgICAgfQorCisgICAgaWYgKGNvb3Jkc1twMiArIDFdID4gY29vcmRzW3AzICsgMV0pIHsKKyAgICAgIHRtcCA9IHAyOworICAgICAgcDIgPSBwMzsKKyAgICAgIHAzID0gdG1wOworICAgICAgdG1wID0gYzI7CisgICAgICBjMiA9IGMzOworICAgICAgYzMgPSB0bXA7CisgICAgfQorCisgICAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHsKKyAgICAgIHRtcCA9IHAxOworICAgICAgcDEgPSBwMjsKKyAgICAgIHAyID0gdG1wOworICAgICAgdG1wID0gYzE7CisgICAgICBjMSA9IGMyOworICAgICAgYzIgPSB0bXA7CisgICAgfQorCisgICAgdmFyIHgxID0gKGNvb3Jkc1twMV0gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7CisgICAgdmFyIHkxID0gKGNvb3Jkc1twMSArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZOworICAgIHZhciB4MiA9IChjb29yZHNbcDJdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYOworICAgIHZhciB5MiA9IChjb29yZHNbcDIgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTsKKyAgICB2YXIgeDMgPSAoY29vcmRzW3AzXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDsKKyAgICB2YXIgeTMgPSAoY29vcmRzW3AzICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7CisKKyAgICBpZiAoeTEgPj0geTMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgYzFyID0gY29sb3JzW2MxXSwKKyAgICAgICAgYzFnID0gY29sb3JzW2MxICsgMV0sCisgICAgICAgIGMxYiA9IGNvbG9yc1tjMSArIDJdOworICAgIHZhciBjMnIgPSBjb2xvcnNbYzJdLAorICAgICAgICBjMmcgPSBjb2xvcnNbYzIgKyAxXSwKKyAgICAgICAgYzJiID0gY29sb3JzW2MyICsgMl07CisgICAgdmFyIGMzciA9IGNvbG9yc1tjM10sCisgICAgICAgIGMzZyA9IGNvbG9yc1tjMyArIDFdLAorICAgICAgICBjM2IgPSBjb2xvcnNbYzMgKyAyXTsKKyAgICB2YXIgbWluWSA9IE1hdGgucm91bmQoeTEpLAorICAgICAgICBtYXhZID0gTWF0aC5yb3VuZCh5Myk7CisgICAgdmFyIHhhLCBjYXIsIGNhZywgY2FiOworICAgIHZhciB4YiwgY2JyLCBjYmcsIGNiYjsKKworICAgIGZvciAodmFyIHkgPSBtaW5ZOyB5IDw9IG1heFk7IHkrKykgeworICAgICAgaWYgKHkgPCB5MikgeworICAgICAgICBsZXQgazsKKworICAgICAgICBpZiAoeSA8IHkxKSB7CisgICAgICAgICAgayA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoeTEgPT09IHkyKSB7CisgICAgICAgICAgayA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgayA9ICh5MSAtIHkpIC8gKHkxIC0geTIpOworICAgICAgICB9CisKKyAgICAgICAgeGEgPSB4MSAtICh4MSAtIHgyKSAqIGs7CisgICAgICAgIGNhciA9IGMxciAtIChjMXIgLSBjMnIpICogazsKKyAgICAgICAgY2FnID0gYzFnIC0gKGMxZyAtIGMyZykgKiBrOworICAgICAgICBjYWIgPSBjMWIgLSAoYzFiIC0gYzJiKSAqIGs7CisgICAgICB9IGVsc2UgeworICAgICAgICBsZXQgazsKKworICAgICAgICBpZiAoeSA+IHkzKSB7CisgICAgICAgICAgayA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoeTIgPT09IHkzKSB7CisgICAgICAgICAgayA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgayA9ICh5MiAtIHkpIC8gKHkyIC0geTMpOworICAgICAgICB9CisKKyAgICAgICAgeGEgPSB4MiAtICh4MiAtIHgzKSAqIGs7CisgICAgICAgIGNhciA9IGMyciAtIChjMnIgLSBjM3IpICogazsKKyAgICAgICAgY2FnID0gYzJnIC0gKGMyZyAtIGMzZykgKiBrOworICAgICAgICBjYWIgPSBjMmIgLSAoYzJiIC0gYzNiKSAqIGs7CisgICAgICB9CisKKyAgICAgIGxldCBrOworCisgICAgICBpZiAoeSA8IHkxKSB7CisgICAgICAgIGsgPSAwOworICAgICAgfSBlbHNlIGlmICh5ID4geTMpIHsKKyAgICAgICAgayA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBrID0gKHkxIC0geSkgLyAoeTEgLSB5Myk7CisgICAgICB9CisKKyAgICAgIHhiID0geDEgLSAoeDEgLSB4MykgKiBrOworICAgICAgY2JyID0gYzFyIC0gKGMxciAtIGMzcikgKiBrOworICAgICAgY2JnID0gYzFnIC0gKGMxZyAtIGMzZykgKiBrOworICAgICAgY2JiID0gYzFiIC0gKGMxYiAtIGMzYikgKiBrOworICAgICAgdmFyIHgxXyA9IE1hdGgucm91bmQoTWF0aC5taW4oeGEsIHhiKSk7CisgICAgICB2YXIgeDJfID0gTWF0aC5yb3VuZChNYXRoLm1heCh4YSwgeGIpKTsKKyAgICAgIHZhciBqID0gcm93U2l6ZSAqIHkgKyB4MV8gKiA0OworCisgICAgICBmb3IgKHZhciB4ID0geDFfOyB4IDw9IHgyXzsgeCsrKSB7CisgICAgICAgIGsgPSAoeGEgLSB4KSAvICh4YSAtIHhiKTsKKworICAgICAgICBpZiAoayA8IDApIHsKKyAgICAgICAgICBrID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChrID4gMSkgeworICAgICAgICAgIGsgPSAxOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZXNbaisrXSA9IGNhciAtIChjYXIgLSBjYnIpICogayB8IDA7CisgICAgICAgIGJ5dGVzW2orK10gPSBjYWcgLSAoY2FnIC0gY2JnKSAqIGsgfCAwOworICAgICAgICBieXRlc1tqKytdID0gY2FiIC0gKGNhYiAtIGNiYikgKiBrIHwgMDsKKyAgICAgICAgYnl0ZXNbaisrXSA9IDI1NTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZSwgY29udGV4dCkgeworICAgIHZhciBwcyA9IGZpZ3VyZS5jb29yZHM7CisgICAgdmFyIGNzID0gZmlndXJlLmNvbG9yczsKKyAgICB2YXIgaSwgaWk7CisKKyAgICBzd2l0Y2ggKGZpZ3VyZS50eXBlKSB7CisgICAgICBjYXNlICJsYXR0aWNlIjoKKyAgICAgICAgdmFyIHZlcnRpY2VzUGVyUm93ID0gZmlndXJlLnZlcnRpY2VzUGVyUm93OworICAgICAgICB2YXIgcm93cyA9IE1hdGguZmxvb3IocHMubGVuZ3RoIC8gdmVydGljZXNQZXJSb3cpIC0gMTsKKyAgICAgICAgdmFyIGNvbHMgPSB2ZXJ0aWNlc1BlclJvdyAtIDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykgeworICAgICAgICAgIHZhciBxID0gaSAqIHZlcnRpY2VzUGVyUm93OworCisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb2xzOyBqKyssIHErKykgeworICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3FdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3FdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pOworICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJ0cmlhbmdsZXMiOgorICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHBzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHsKKyAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbaV0sIHBzW2kgKyAxXSwgcHNbaSArIDJdLCBjc1tpXSwgY3NbaSArIDFdLCBjc1tpICsgMl0pOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBmaWd1cmUiKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVNZXNoQ2FudmFzKGJvdW5kcywgY29tYmluZXNTY2FsZSwgY29vcmRzLCBjb2xvcnMsIGZpZ3VyZXMsIGJhY2tncm91bmRDb2xvciwgY2FjaGVkQ2FudmFzZXMsIHdlYkdMQ29udGV4dCkgeworICAgIHZhciBFWFBFQ1RFRF9TQ0FMRSA9IDEuMTsKKyAgICB2YXIgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7CisgICAgdmFyIEJPUkRFUl9TSVpFID0gMjsKKyAgICB2YXIgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTsKKyAgICB2YXIgb2Zmc2V0WSA9IE1hdGguZmxvb3IoYm91bmRzWzFdKTsKKyAgICB2YXIgYm91bmRzV2lkdGggPSBNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFg7CisgICAgdmFyIGJvdW5kc0hlaWdodCA9IE1hdGguY2VpbChib3VuZHNbM10pIC0gb2Zmc2V0WTsKKyAgICB2YXIgd2lkdGggPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzV2lkdGggKiBjb21iaW5lc1NjYWxlWzBdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7CisgICAgdmFyIGhlaWdodCA9IE1hdGgubWluKE1hdGguY2VpbChNYXRoLmFicyhib3VuZHNIZWlnaHQgKiBjb21iaW5lc1NjYWxlWzFdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7CisgICAgdmFyIHNjYWxlWCA9IGJvdW5kc1dpZHRoIC8gd2lkdGg7CisgICAgdmFyIHNjYWxlWSA9IGJvdW5kc0hlaWdodCAvIGhlaWdodDsKKyAgICB2YXIgY29udGV4dCA9IHsKKyAgICAgIGNvb3JkcywKKyAgICAgIGNvbG9ycywKKyAgICAgIG9mZnNldFg6IC1vZmZzZXRYLAorICAgICAgb2Zmc2V0WTogLW9mZnNldFksCisgICAgICBzY2FsZVg6IDEgLyBzY2FsZVgsCisgICAgICBzY2FsZVk6IDEgLyBzY2FsZVkKKyAgICB9OworICAgIHZhciBwYWRkZWRXaWR0aCA9IHdpZHRoICsgQk9SREVSX1NJWkUgKiAyOworICAgIHZhciBwYWRkZWRIZWlnaHQgPSBoZWlnaHQgKyBCT1JERVJfU0laRSAqIDI7CisgICAgdmFyIGNhbnZhcywgdG1wQ2FudmFzLCBpLCBpaTsKKworICAgIGlmICh3ZWJHTENvbnRleHQuaXNFbmFibGVkKSB7CisgICAgICBjYW52YXMgPSB3ZWJHTENvbnRleHQuZHJhd0ZpZ3VyZXMoeworICAgICAgICB3aWR0aCwKKyAgICAgICAgaGVpZ2h0LAorICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsCisgICAgICAgIGZpZ3VyZXMsCisgICAgICAgIGNvbnRleHQKKyAgICAgIH0pOworICAgICAgdG1wQ2FudmFzID0gY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtZXNoIiwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgZmFsc2UpOworICAgICAgdG1wQ2FudmFzLmNvbnRleHQuZHJhd0ltYWdlKGNhbnZhcywgQk9SREVSX1NJWkUsIEJPUkRFUl9TSVpFKTsKKyAgICAgIGNhbnZhcyA9IHRtcENhbnZhcy5jYW52YXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcENhbnZhcyA9IGNhY2hlZENhbnZhc2VzLmdldENhbnZhcygibWVzaCIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQsIGZhbHNlKTsKKyAgICAgIHZhciB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDsKKyAgICAgIHZhciBkYXRhID0gdG1wQ3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikgeworICAgICAgICB2YXIgYnl0ZXMgPSBkYXRhLmRhdGE7CisKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7CisgICAgICAgICAgYnl0ZXNbaV0gPSBiYWNrZ3JvdW5kQ29sb3JbMF07CisgICAgICAgICAgYnl0ZXNbaSArIDFdID0gYmFja2dyb3VuZENvbG9yWzFdOworICAgICAgICAgIGJ5dGVzW2kgKyAyXSA9IGJhY2tncm91bmRDb2xvclsyXTsKKyAgICAgICAgICBieXRlc1tpICsgM10gPSAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IGZpZ3VyZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmVzW2ldLCBjb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgdG1wQ3R4LnB1dEltYWdlRGF0YShkYXRhLCBCT1JERVJfU0laRSwgQk9SREVSX1NJWkUpOworICAgICAgY2FudmFzID0gdG1wQ2FudmFzLmNhbnZhczsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgY2FudmFzLAorICAgICAgb2Zmc2V0WDogb2Zmc2V0WCAtIEJPUkRFUl9TSVpFICogc2NhbGVYLAorICAgICAgb2Zmc2V0WTogb2Zmc2V0WSAtIEJPUkRFUl9TSVpFICogc2NhbGVZLAorICAgICAgc2NhbGVYLAorICAgICAgc2NhbGVZCisgICAgfTsKKyAgfQorCisgIHJldHVybiBjcmVhdGVNZXNoQ2FudmFzOworfSgpOworCitTaGFkaW5nSVJzLk1lc2ggPSB7CisgIGZyb21JUjogZnVuY3Rpb24gTWVzaF9mcm9tSVIocmF3KSB7CisgICAgdmFyIGNvb3JkcyA9IHJhd1syXTsKKyAgICB2YXIgY29sb3JzID0gcmF3WzNdOworICAgIHZhciBmaWd1cmVzID0gcmF3WzRdOworICAgIHZhciBib3VuZHMgPSByYXdbNV07CisgICAgdmFyIG1hdHJpeCA9IHJhd1s2XTsKKyAgICB2YXIgYmJveCA9IHJhd1s3XTsKKyAgICB2YXIgYmFja2dyb3VuZCA9IHJhd1s4XTsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gTWVzaF9nZXRQYXR0ZXJuKGN0eCwgb3duZXIsIHNoYWRpbmdGaWxsKSB7CisgICAgICAgIGFwcGx5Qm91bmRpbmdCb3goY3R4LCBiYm94KTsKKyAgICAgICAgdmFyIHNjYWxlOworCisgICAgICAgIGlmIChzaGFkaW5nRmlsbCkgeworICAgICAgICAgIHNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShjdHgubW96Q3VycmVudFRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG93bmVyLmJhc2VUcmFuc2Zvcm0pOworCisgICAgICAgICAgaWYgKG1hdHJpeCkgeworICAgICAgICAgICAgdmFyIG1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtYXRyaXgpOworCisgICAgICAgICAgICBzY2FsZSA9IFtzY2FsZVswXSAqIG1hdHJpeFNjYWxlWzBdLCBzY2FsZVsxXSAqIG1hdHJpeFNjYWxlWzFdXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IGNyZWF0ZU1lc2hDYW52YXMoYm91bmRzLCBzY2FsZSwgY29vcmRzLCBjb2xvcnMsIGZpZ3VyZXMsIHNoYWRpbmdGaWxsID8gbnVsbCA6IGJhY2tncm91bmQsIG93bmVyLmNhY2hlZENhbnZhc2VzLCBvd25lci53ZWJHTENvbnRleHQpOworCisgICAgICAgIGlmICghc2hhZGluZ0ZpbGwpIHsKKyAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtLmFwcGx5KGN0eCwgb3duZXIuYmFzZVRyYW5zZm9ybSk7CisKKyAgICAgICAgICBpZiAobWF0cml4KSB7CisgICAgICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgbWF0cml4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjdHgudHJhbnNsYXRlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZKTsKKyAgICAgICAgY3R4LnNjYWxlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7CisgICAgICAgIHJldHVybiBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgIm5vLXJlcGVhdCIpOworICAgICAgfQorICAgIH07CisgIH0KK307CitTaGFkaW5nSVJzLkR1bW15ID0geworICBmcm9tSVI6IGZ1bmN0aW9uIER1bW15X2Zyb21JUigpIHsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gRHVtbXlfZnJvbUlSX2dldFBhdHRlcm4oKSB7CisgICAgICAgIHJldHVybiAiaG90cGluayI7CisgICAgICB9CisgICAgfTsKKyAgfQorfTsKKworZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIocmF3KSB7CisgIHZhciBzaGFkaW5nSVIgPSBTaGFkaW5nSVJzW3Jhd1swXV07CisKKyAgaWYgKCFzaGFkaW5nSVIpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSVIgdHlwZTogJHtyYXdbMF19YCk7CisgIH0KKworICByZXR1cm4gc2hhZGluZ0lSLmZyb21JUihyYXcpOworfQorCit2YXIgVGlsaW5nUGF0dGVybiA9IGZ1bmN0aW9uIFRpbGluZ1BhdHRlcm5DbG9zdXJlKCkgeworICB2YXIgUGFpbnRUeXBlID0geworICAgIENPTE9SRUQ6IDEsCisgICAgVU5DT0xPUkVEOiAyCisgIH07CisgIHZhciBNQVhfUEFUVEVSTl9TSVpFID0gMzAwMDsKKworICBmdW5jdGlvbiBUaWxpbmdQYXR0ZXJuKElSLCBjb2xvciwgY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pIHsKKyAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IElSWzJdOworICAgIHRoaXMubWF0cml4ID0gSVJbM10gfHwgWzEsIDAsIDAsIDEsIDAsIDBdOworICAgIHRoaXMuYmJveCA9IElSWzRdOworICAgIHRoaXMueHN0ZXAgPSBJUls1XTsKKyAgICB0aGlzLnlzdGVwID0gSVJbNl07CisgICAgdGhpcy5wYWludFR5cGUgPSBJUls3XTsKKyAgICB0aGlzLnRpbGluZ1R5cGUgPSBJUls4XTsKKyAgICB0aGlzLmNvbG9yID0gY29sb3I7CisgICAgdGhpcy5jYW52YXNHcmFwaGljc0ZhY3RvcnkgPSBjYW52YXNHcmFwaGljc0ZhY3Rvcnk7CisgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gYmFzZVRyYW5zZm9ybTsKKyAgICB0aGlzLnR5cGUgPSAiUGF0dGVybiI7CisgICAgdGhpcy5jdHggPSBjdHg7CisgIH0KKworICBUaWxpbmdQYXR0ZXJuLnByb3RvdHlwZSA9IHsKKyAgICBjcmVhdGVQYXR0ZXJuQ2FudmFzOiBmdW5jdGlvbiBUaWxpblBhdHRlcm5fY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcikgeworICAgICAgdmFyIG9wZXJhdG9yTGlzdCA9IHRoaXMub3BlcmF0b3JMaXN0OworICAgICAgdmFyIGJib3ggPSB0aGlzLmJib3g7CisgICAgICB2YXIgeHN0ZXAgPSB0aGlzLnhzdGVwOworICAgICAgdmFyIHlzdGVwID0gdGhpcy55c3RlcDsKKyAgICAgIHZhciBwYWludFR5cGUgPSB0aGlzLnBhaW50VHlwZTsKKyAgICAgIHZhciB0aWxpbmdUeXBlID0gdGhpcy50aWxpbmdUeXBlOworICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcjsKKyAgICAgIHZhciBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiVGlsaW5nVHlwZTogIiArIHRpbGluZ1R5cGUpOworICAgICAgdmFyIHgwID0gYmJveFswXSwKKyAgICAgICAgICB5MCA9IGJib3hbMV0sCisgICAgICAgICAgeDEgPSBiYm94WzJdLAorICAgICAgICAgIHkxID0gYmJveFszXTsKKworICAgICAgdmFyIG1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7CisKKyAgICAgIHZhciBjdXJNYXRyaXhTY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5iYXNlVHJhbnNmb3JtKTsKKworICAgICAgdmFyIGNvbWJpbmVkU2NhbGUgPSBbbWF0cml4U2NhbGVbMF0gKiBjdXJNYXRyaXhTY2FsZVswXSwgbWF0cml4U2NhbGVbMV0gKiBjdXJNYXRyaXhTY2FsZVsxXV07CisgICAgICB2YXIgZGlteCA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKHhzdGVwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIGNvbWJpbmVkU2NhbGVbMF0pOworICAgICAgdmFyIGRpbXkgPSB0aGlzLmdldFNpemVBbmRTY2FsZSh5c3RlcCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCwgY29tYmluZWRTY2FsZVsxXSk7CisgICAgICB2YXIgdG1wQ2FudmFzID0gb3duZXIuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJwYXR0ZXJuIiwgZGlteC5zaXplLCBkaW15LnNpemUsIHRydWUpOworICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0OworICAgICAgdmFyIGdyYXBoaWNzID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5LmNyZWF0ZUNhbnZhc0dyYXBoaWNzKHRtcEN0eCk7CisgICAgICBncmFwaGljcy5ncm91cExldmVsID0gb3duZXIuZ3JvdXBMZXZlbDsKKyAgICAgIHRoaXMuc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKTsKKyAgICAgIGdyYXBoaWNzLnRyYW5zZm9ybShkaW14LnNjYWxlLCAwLCAwLCBkaW15LnNjYWxlLCAwLCAwKTsKKyAgICAgIGdyYXBoaWNzLnRyYW5zZm9ybSgxLCAwLCAwLCAxLCAteDAsIC15MCk7CisgICAgICB0aGlzLmNsaXBCYm94KGdyYXBoaWNzLCBiYm94LCB4MCwgeTAsIHgxLCB5MSk7CisgICAgICBncmFwaGljcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7CisgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oMSwgMCwgMCwgMSwgeDAsIHkwKTsKKyAgICAgIHRoaXMuY3R4LnNjYWxlKDEgLyBkaW14LnNjYWxlLCAxIC8gZGlteS5zY2FsZSk7CisgICAgICByZXR1cm4gdG1wQ2FudmFzLmNhbnZhczsKKyAgICB9LAorICAgIGdldFNpemVBbmRTY2FsZTogZnVuY3Rpb24gVGlsaW5nUGF0dGVybl9nZXRTaXplQW5kU2NhbGUoc3RlcCwgcmVhbE91dHB1dFNpemUsIHNjYWxlKSB7CisgICAgICBzdGVwID0gTWF0aC5hYnMoc3RlcCk7CisgICAgICB2YXIgbWF4U2l6ZSA9IE1hdGgubWF4KE1BWF9QQVRURVJOX1NJWkUsIHJlYWxPdXRwdXRTaXplKTsKKyAgICAgIHZhciBzaXplID0gTWF0aC5jZWlsKHN0ZXAgKiBzY2FsZSk7CisKKyAgICAgIGlmIChzaXplID49IG1heFNpemUpIHsKKyAgICAgICAgc2l6ZSA9IG1heFNpemU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzY2FsZSA9IHNpemUgLyBzdGVwOworICAgICAgfQorCisgICAgICByZXR1cm4geworICAgICAgICBzY2FsZSwKKyAgICAgICAgc2l6ZQorICAgICAgfTsKKyAgICB9LAorICAgIGNsaXBCYm94OiBmdW5jdGlvbiBjbGlwQmJveChncmFwaGljcywgYmJveCwgeDAsIHkwLCB4MSwgeTEpIHsKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7CisgICAgICAgIHZhciBiYm94V2lkdGggPSB4MSAtIHgwOworICAgICAgICB2YXIgYmJveEhlaWdodCA9IHkxIC0geTA7CisgICAgICAgIGdyYXBoaWNzLmN0eC5yZWN0KHgwLCB5MCwgYmJveFdpZHRoLCBiYm94SGVpZ2h0KTsKKyAgICAgICAgZ3JhcGhpY3MuY2xpcCgpOworICAgICAgICBncmFwaGljcy5lbmRQYXRoKCk7CisgICAgICB9CisgICAgfSwKKyAgICBzZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQ6IGZ1bmN0aW9uIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChncmFwaGljcywgcGFpbnRUeXBlLCBjb2xvcikgeworICAgICAgY29uc3QgY29udGV4dCA9IGdyYXBoaWNzLmN0eCwKKyAgICAgICAgICAgIGN1cnJlbnQgPSBncmFwaGljcy5jdXJyZW50OworCisgICAgICBzd2l0Y2ggKHBhaW50VHlwZSkgeworICAgICAgICBjYXNlIFBhaW50VHlwZS5DT0xPUkVEOgorICAgICAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGN0eC5maWxsU3R5bGU7CisgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGN0eC5zdHJva2VTdHlsZTsKKyAgICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGN0eC5maWxsU3R5bGU7CisgICAgICAgICAgY3VycmVudC5zdHJva2VDb2xvciA9IGN0eC5zdHJva2VTdHlsZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBhaW50VHlwZS5VTkNPTE9SRUQ6CisgICAgICAgICAgdmFyIGNzc0NvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pOworCisgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjc3NDb2xvcjsKKyAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY3NzQ29sb3I7CisgICAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjc3NDb2xvcjsKKyAgICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHBhaW50IHR5cGU6ICR7cGFpbnRUeXBlfWApOworICAgICAgfQorICAgIH0sCisgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gVGlsaW5nUGF0dGVybl9nZXRQYXR0ZXJuKGN0eCwgb3duZXIpIHsKKyAgICAgIGN0eCA9IHRoaXMuY3R4OworICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHRoaXMuYmFzZVRyYW5zZm9ybSk7CisgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgdGhpcy5tYXRyaXgpOworICAgICAgdmFyIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMgPSB0aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMob3duZXIpOworICAgICAgcmV0dXJuIGN0eC5jcmVhdGVQYXR0ZXJuKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMsICJyZXBlYXQiKTsKKyAgICB9CisgIH07CisgIHJldHVybiBUaWxpbmdQYXR0ZXJuOworfSgpOworCitleHBvcnRzLlRpbGluZ1BhdHRlcm4gPSBUaWxpbmdQYXR0ZXJuOworCisvKioqLyB9KSwKKy8qIDEyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuR2xvYmFsV29ya2VyT3B0aW9ucyA9IHZvaWQgMDsKK2NvbnN0IEdsb2JhbFdvcmtlck9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworZXhwb3J0cy5HbG9iYWxXb3JrZXJPcHRpb25zID0gR2xvYmFsV29ya2VyT3B0aW9uczsKK0dsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydCA9IEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydDsKK0dsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgPT09IHVuZGVmaW5lZCA/ICIiIDogR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmM7CisKKy8qKiovIH0pLAorLyogMTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5NZXNzYWdlSGFuZGxlciA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworY29uc3QgQ2FsbGJhY2tLaW5kID0geworICBVTktOT1dOOiAwLAorICBEQVRBOiAxLAorICBFUlJPUjogMgorfTsKK2NvbnN0IFN0cmVhbUtpbmQgPSB7CisgIFVOS05PV046IDAsCisgIENBTkNFTDogMSwKKyAgQ0FOQ0VMX0NPTVBMRVRFOiAyLAorICBDTE9TRTogMywKKyAgRU5RVUVVRTogNCwKKyAgRVJST1I6IDUsCisgIFBVTEw6IDYsCisgIFBVTExfQ09NUExFVEU6IDcsCisgIFNUQVJUX0NPTVBMRVRFOiA4Cit9OworCitmdW5jdGlvbiB3cmFwUmVhc29uKHJlYXNvbikgeworICBpZiAodHlwZW9mIHJlYXNvbiAhPT0gIm9iamVjdCIgfHwgcmVhc29uID09PSBudWxsKSB7CisgICAgcmV0dXJuIHJlYXNvbjsKKyAgfQorCisgIHN3aXRjaCAocmVhc29uLm5hbWUpIHsKKyAgICBjYXNlICJBYm9ydEV4Y2VwdGlvbiI6CisgICAgICByZXR1cm4gbmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTsKKworICAgIGNhc2UgIk1pc3NpbmdQREZFeGNlcHRpb24iOgorICAgICAgcmV0dXJuIG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTsKKworICAgIGNhc2UgIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiI6CisgICAgICByZXR1cm4gbmV3IF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnN0YXR1cyk7CisKKyAgICBjYXNlICJVbmtub3duRXJyb3JFeGNlcHRpb24iOgorICAgICAgcmV0dXJuIG5ldyBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5kZXRhaWxzKTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gbmV3IF91dGlsLlVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnRvU3RyaW5nKCkpOworICB9Cit9CisKK2NsYXNzIE1lc3NhZ2VIYW5kbGVyIHsKKyAgY29uc3RydWN0b3Ioc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7CisgICAgdGhpcy5zb3VyY2VOYW1lID0gc291cmNlTmFtZTsKKyAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lOworICAgIHRoaXMuY29tT2JqID0gY29tT2JqOworICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7CisgICAgdGhpcy5zdHJlYW1JZCA9IDE7CisgICAgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHRydWU7CisgICAgdGhpcy5zdHJlYW1TaW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy5zdHJlYW1Db250cm9sbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlID0gZXZlbnQgPT4geworICAgICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGE7CisKKyAgICAgIGlmIChkYXRhLnRhcmdldE5hbWUgIT09IHRoaXMuc291cmNlTmFtZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChkYXRhLnN0cmVhbSkgeworICAgICAgICB0aGlzLl9wcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7CisgICAgICAgIGNvbnN0IGNhbGxiYWNrSWQgPSBkYXRhLmNhbGxiYWNrSWQ7CisgICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdOworCisgICAgICAgIGlmICghY2FwYWJpbGl0eSkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApOworICAgICAgICB9CisKKyAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07CisKKyAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5EQVRBKSB7CisgICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEuZGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkVSUk9SKSB7CisgICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBjYWxsYmFjayBjYXNlIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CisKKyAgICAgIGlmICghYWN0aW9uKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhY3Rpb24gZnJvbSB3b3JrZXI6ICR7ZGF0YS5hY3Rpb259YCk7CisgICAgICB9CisKKyAgICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHsKKyAgICAgICAgY29uc3QgY2JTb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lOworICAgICAgICBjb25zdCBjYlRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7CisgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhKSk7CisgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgeworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsCisgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkRBVEEsCisgICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsCisgICAgICAgICAgICBkYXRhOiByZXN1bHQKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsCisgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLAorICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAorICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGRhdGEuc3RyZWFtSWQpIHsKKyAgICAgICAgdGhpcy5fY3JlYXRlU3RyZWFtU2luayhkYXRhKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGFjdGlvbihkYXRhLmRhdGEpOworICAgIH07CisKKyAgICBjb21PYmouYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTsKKyAgfQorCisgIG9uKGFjdGlvbk5hbWUsIGhhbmRsZXIpIHsKKyAgICBjb25zdCBhaCA9IHRoaXMuYWN0aW9uSGFuZGxlcjsKKworICAgIGlmIChhaFthY3Rpb25OYW1lXSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkICIke2FjdGlvbk5hbWV9ImApOworICAgIH0KKworICAgIGFoW2FjdGlvbk5hbWVdID0gaGFuZGxlcjsKKyAgfQorCisgIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7CisgICAgdGhpcy5fcG9zdE1lc3NhZ2UoeworICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLAorICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAorICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAorICAgICAgZGF0YQorICAgIH0sIHRyYW5zZmVycyk7CisgIH0KKworICBzZW5kV2l0aFByb21pc2UoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7CisgICAgY29uc3QgY2FsbGJhY2tJZCA9IHRoaXMuY2FsbGJhY2tJZCsrOworICAgIGNvbnN0IGNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXSA9IGNhcGFiaWxpdHk7CisKKyAgICB0cnkgeworICAgICAgdGhpcy5fcG9zdE1lc3NhZ2UoeworICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsCisgICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSwKKyAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAorICAgICAgICBjYWxsYmFja0lkLAorICAgICAgICBkYXRhCisgICAgICB9LCB0cmFuc2ZlcnMpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBjYXBhYmlsaXR5LnJlamVjdChleCk7CisgICAgfQorCisgICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIHNlbmRXaXRoU3RyZWFtKGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXVlaW5nU3RyYXRlZ3ksIHRyYW5zZmVycykgeworICAgIGNvbnN0IHN0cmVhbUlkID0gdGhpcy5zdHJlYW1JZCsrOworICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CisgICAgY29uc3QgdGFyZ2V0TmFtZSA9IHRoaXMudGFyZ2V0TmFtZTsKKyAgICBjb25zdCBjb21PYmogPSB0aGlzLmNvbU9iajsKKyAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHsKKyAgICAgIHN0YXJ0OiBjb250cm9sbGVyID0+IHsKKyAgICAgICAgY29uc3Qgc3RhcnRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSA9IHsKKyAgICAgICAgICBjb250cm9sbGVyLAorICAgICAgICAgIHN0YXJ0Q2FsbDogc3RhcnRDYXBhYmlsaXR5LAorICAgICAgICAgIHB1bGxDYWxsOiBudWxsLAorICAgICAgICAgIGNhbmNlbENhbGw6IG51bGwsCisgICAgICAgICAgaXNDbG9zZWQ6IGZhbHNlCisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5fcG9zdE1lc3NhZ2UoeworICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCisgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgZGF0YSwKKyAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQorICAgICAgICB9LCB0cmFuc2ZlcnMpOworCisgICAgICAgIHJldHVybiBzdGFydENhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIH0sCisgICAgICBwdWxsOiBjb250cm9sbGVyID0+IHsKKyAgICAgICAgY29uc3QgcHVsbENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsID0gcHVsbENhcGFiaWxpdHk7CisgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMLAorICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplCisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHVsbENhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIH0sCisgICAgICBjYW5jZWw6IHJlYXNvbiA9PiB7CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCAiY2FuY2VsIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvbiIpOworICAgICAgICBjb25zdCBjYW5jZWxDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsID0gY2FuY2VsQ2FwYWJpbGl0eTsKKyAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlOworICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLAorICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gY2FuY2VsQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgfQorICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpOworICB9CisKKyAgX2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSkgeworICAgIGNvbnN0IHNlbGYgPSB0aGlzOworICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CisgICAgY29uc3Qgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkOworICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CisgICAgY29uc3QgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTsKKyAgICBjb25zdCBjb21PYmogPSB0aGlzLmNvbU9iajsKKyAgICBjb25zdCBzdHJlYW1TaW5rID0geworICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSA9IDEsIHRyYW5zZmVycykgeworICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGxhc3REZXNpcmVkU2l6ZSA9IHRoaXMuZGVzaXJlZFNpemU7CisgICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gc2l6ZTsKKworICAgICAgICBpZiAobGFzdERlc2lyZWRTaXplID4gMCAmJiB0aGlzLmRlc2lyZWRTaXplIDw9IDApIHsKKyAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICAgIHRoaXMucmVhZHkgPSB0aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICAgIH0KKworICAgICAgICBzZWxmLl9wb3N0TWVzc2FnZSh7CisgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FTlFVRVVFLAorICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgIGNodW5rCisgICAgICAgIH0sIHRyYW5zZmVycyk7CisgICAgICB9LAorCisgICAgICBjbG9zZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNMT1NFLAorICAgICAgICAgIHN0cmVhbUlkCisgICAgICAgIH0pOworICAgICAgICBkZWxldGUgc2VsZi5zdHJlYW1TaW5rc1tzdHJlYW1JZF07CisgICAgICB9LAorCisgICAgICBlcnJvcihyZWFzb24pIHsKKyAgICAgICAgKDAsIF91dGlsLmFzc2VydCkocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsICJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTsKKworICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlOworICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRVJST1IsCisgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKKyAgICAgICAgfSk7CisgICAgICB9LAorCisgICAgICBzaW5rQ2FwYWJpbGl0eTogKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpLAorICAgICAgb25QdWxsOiBudWxsLAorICAgICAgb25DYW5jZWw6IG51bGwsCisgICAgICBpc0NhbmNlbGxlZDogZmFsc2UsCisgICAgICBkZXNpcmVkU2l6ZTogZGF0YS5kZXNpcmVkU2l6ZSwKKyAgICAgIHJlYWR5OiBudWxsCisgICAgfTsKKyAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICBzdHJlYW1TaW5rLnJlYWR5ID0gc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOworICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdID0gc3RyZWFtU2luazsKKyAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhLCBzdHJlYW1TaW5rKSk7CisgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsCisgICAgICAgIHN0cmVhbUlkLAorICAgICAgICBzdWNjZXNzOiB0cnVlCisgICAgICB9KTsKKyAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsCisgICAgICAgIHN0cmVhbUlkLAorICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgfSk7CisgICAgfSk7CisgIH0KKworICBfcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSkgeworICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZDsKKyAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lOworICAgIGNvbnN0IHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7CisgICAgY29uc3QgY29tT2JqID0gdGhpcy5jb21PYmo7CisKKyAgICBzd2l0Y2ggKGRhdGEuc3RyZWFtKSB7CisgICAgICBjYXNlIFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEU6CisgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKKyAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5zdGFydENhbGwucmVzb2x2ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnN0YXJ0Q2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFOgorICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CisgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwucmVzb2x2ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTEw6CisgICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKKyAgICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQorICAgICAgICAgIH0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLmRlc2lyZWRTaXplIDw9IDAgJiYgZGF0YS5kZXNpcmVkU2l6ZSA+IDApIHsKKyAgICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5kZXNpcmVkU2l6ZSA9IGRhdGEuZGVzaXJlZFNpemU7CisgICAgICAgIGNvbnN0IHsKKyAgICAgICAgICBvblB1bGwKKyAgICAgICAgfSA9IHRoaXMuc3RyZWFtU2lua3NbZGF0YS5zdHJlYW1JZF07CisgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgICAgcmVzb2x2ZShvblB1bGwgJiYgb25QdWxsKCkpOworICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKKyAgICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQorICAgICAgICAgIH0pOworICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsCisgICAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTdHJlYW1LaW5kLkVOUVVFVUU6CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLCAiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOworCisgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5lbnF1ZXVlKGRhdGEuY2h1bmspOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTdHJlYW1LaW5kLkNMT1NFOgorICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSwgImNsb3NlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CisKKyAgICAgICAgaWYgKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7CisgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuY2xvc2UoKTsKKworICAgICAgICB0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKTsKKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOgorICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSwgImVycm9yIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CisgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworCisgICAgICAgIHRoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpOworCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOgorICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CisgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbC5yZXNvbHZlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUw6CisgICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHsKKyAgICAgICAgICBvbkNhbmNlbAorICAgICAgICB9ID0gdGhpcy5zdHJlYW1TaW5rc1tkYXRhLnN0cmVhbUlkXTsKKyAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgICAgICByZXNvbHZlKG9uQ2FuY2VsICYmIG9uQ2FuY2VsKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKSk7CisgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCisgICAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCisgICAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5zaW5rQ2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5pc0NhbmNlbGxlZCA9IHRydWU7CisgICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBzdHJlYW0gY2FzZSIpOworICAgIH0KKyAgfQorCisgIGFzeW5jIF9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKSB7CisgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5zdGFydENhbGwsIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsXS5tYXAoZnVuY3Rpb24gKGNhcGFiaWxpdHkpIHsKKyAgICAgIHJldHVybiBjYXBhYmlsaXR5ICYmIGNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9KSk7CisgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdOworICB9CisKKyAgX3Bvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVycykgeworICAgIGlmICh0cmFuc2ZlcnMgJiYgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycykgeworICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgZGVzdHJveSgpIHsKKyAgICB0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpOworICB9CisKK30KKworZXhwb3J0cy5NZXNzYWdlSGFuZGxlciA9IE1lc3NhZ2VIYW5kbGVyOworCisvKioqLyB9KSwKKy8qIDE0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuTWV0YWRhdGEgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfeG1sX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTUpOworCitjbGFzcyBNZXRhZGF0YSB7CisgIGNvbnN0cnVjdG9yKGRhdGEpIHsKKyAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIsICJNZXRhZGF0YTogaW5wdXQgaXMgbm90IGEgc3RyaW5nIik7CisgICAgZGF0YSA9IHRoaXMuX3JlcGFpcihkYXRhKTsKKyAgICBjb25zdCBwYXJzZXIgPSBuZXcgX3htbF9wYXJzZXIuU2ltcGxlWE1MUGFyc2VyKCk7CisgICAgY29uc3QgeG1sRG9jdW1lbnQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIHRoaXMuX21ldGFkYXRhTWFwID0gbmV3IE1hcCgpOworCisgICAgaWYgKHhtbERvY3VtZW50KSB7CisgICAgICB0aGlzLl9wYXJzZSh4bWxEb2N1bWVudCk7CisgICAgfQorICB9CisKKyAgX3JlcGFpcihkYXRhKSB7CisgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvXltePF0rLywgIiIpLnJlcGxhY2UoLz5cXDM3NlxcMzc3KFtePF0rKS9nLCBmdW5jdGlvbiAoYWxsLCBjb2RlcykgeworICAgICAgY29uc3QgYnl0ZXMgPSBjb2Rlcy5yZXBsYWNlKC9cXChbMC0zXSkoWzAtN10pKFswLTddKS9nLCBmdW5jdGlvbiAoY29kZSwgZDEsIGQyLCBkMykgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShkMSAqIDY0ICsgZDIgKiA4ICsgZDMgKiAxKTsKKyAgICAgIH0pLnJlcGxhY2UoLyYoYW1wfGFwb3N8Z3R8bHR8cXVvdCk7L2csIGZ1bmN0aW9uIChzdHIsIG5hbWUpIHsKKyAgICAgICAgc3dpdGNoIChuYW1lKSB7CisgICAgICAgICAgY2FzZSAiYW1wIjoKKyAgICAgICAgICAgIHJldHVybiAiJiI7CisKKyAgICAgICAgICBjYXNlICJhcG9zIjoKKyAgICAgICAgICAgIHJldHVybiAiJyI7CisKKyAgICAgICAgICBjYXNlICJndCI6CisgICAgICAgICAgICByZXR1cm4gIj4iOworCisgICAgICAgICAgY2FzZSAibHQiOgorICAgICAgICAgICAgcmV0dXJuICI8IjsKKworICAgICAgICAgIGNhc2UgInF1b3QiOgorICAgICAgICAgICAgcmV0dXJuICciJzsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgX3JlcGFpcjogJHtuYW1lfSBpc24ndCBkZWZpbmVkLmApOworICAgICAgfSk7CisgICAgICBsZXQgY2hhcnMgPSAiIjsKKworICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgeworICAgICAgICBjb25zdCBjb2RlID0gYnl0ZXMuY2hhckNvZGVBdChpKSAqIDI1NiArIGJ5dGVzLmNoYXJDb2RlQXQoaSArIDEpOworCisgICAgICAgIGlmIChjb2RlID49IDMyICYmIGNvZGUgPCAxMjcgJiYgY29kZSAhPT0gNjAgJiYgY29kZSAhPT0gNjIgJiYgY29kZSAhPT0gMzgpIHsKKyAgICAgICAgICBjaGFycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNoYXJzICs9ICImI3giICsgKDB4MTAwMDAgKyBjb2RlKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpICsgIjsiOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAiPiIgKyBjaGFyczsKKyAgICB9KTsKKyAgfQorCisgIF9wYXJzZSh4bWxEb2N1bWVudCkgeworICAgIGxldCByZGYgPSB4bWxEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisKKyAgICBpZiAocmRmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJyZGY6cmRmIikgeworICAgICAgcmRmID0gcmRmLmZpcnN0Q2hpbGQ7CisKKyAgICAgIHdoaWxlIChyZGYgJiYgcmRmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJyZGY6cmRmIikgeworICAgICAgICByZGYgPSByZGYubmV4dFNpYmxpbmc7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgbm9kZU5hbWUgPSByZGYgPyByZGYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7CisKKyAgICBpZiAoIXJkZiB8fCBub2RlTmFtZSAhPT0gInJkZjpyZGYiIHx8ICFyZGYuaGFzQ2hpbGROb2RlcygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hpbGRyZW4gPSByZGYuY2hpbGROb2RlczsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IGRlc2MgPSBjaGlsZHJlbltpXTsKKworICAgICAgaWYgKGRlc2Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gInJkZjpkZXNjcmlwdGlvbiIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IGRlc2MuY2hpbGROb2Rlcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGlmIChkZXNjLmNoaWxkTm9kZXNbal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIiN0ZXh0IikgeworICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZGVzYy5jaGlsZE5vZGVzW2pdOworICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgdGhpcy5fbWV0YWRhdGFNYXAuc2V0KG5hbWUsIGVudHJ5LnRleHRDb250ZW50LnRyaW0oKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBnZXQobmFtZSkgeworICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YU1hcC5oYXMobmFtZSkgPyB0aGlzLl9tZXRhZGF0YU1hcC5nZXQobmFtZSkgOiBudWxsOworICB9CisKKyAgZ2V0QWxsKCkgeworICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fbWV0YWRhdGFNYXApOworICB9CisKKyAgaGFzKG5hbWUpIHsKKyAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFNYXAuaGFzKG5hbWUpOworICB9CisKK30KKworZXhwb3J0cy5NZXRhZGF0YSA9IE1ldGFkYXRhOworCisvKioqLyB9KSwKKy8qIDE1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuU2ltcGxlWE1MUGFyc2VyID0gdm9pZCAwOworY29uc3QgWE1MUGFyc2VyRXJyb3JDb2RlID0geworICBOb0Vycm9yOiAwLAorICBFbmRPZkRvY3VtZW50OiAtMSwKKyAgVW50ZXJtaW5hdGVkQ2RhdDogLTIsCisgIFVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uOiAtMywKKyAgVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uOiAtNCwKKyAgVW50ZXJtaW5hdGVkQ29tbWVudDogLTUsCisgIE1hbGZvcm1lZEVsZW1lbnQ6IC02LAorICBPdXRPZk1lbW9yeTogLTcsCisgIFVudGVybWluYXRlZEF0dHJpYnV0ZVZhbHVlOiAtOCwKKyAgVW50ZXJtaW5hdGVkRWxlbWVudDogLTksCisgIEVsZW1lbnROZXZlckJlZ3VuOiAtMTAKK307CisKK2Z1bmN0aW9uIGlzV2hpdGVzcGFjZShzLCBpbmRleCkgeworICBjb25zdCBjaCA9IHNbaW5kZXhdOworICByZXR1cm4gY2ggPT09ICIgIiB8fCBjaCA9PT0gIlxuIiB8fCBjaCA9PT0gIlxyIiB8fCBjaCA9PT0gIlx0IjsKK30KKworZnVuY3Rpb24gaXNXaGl0ZXNwYWNlU3RyaW5nKHMpIHsKKyAgZm9yIChsZXQgaSA9IDAsIGlpID0gcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgaWYgKCFpc1doaXRlc3BhY2UocywgaSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgWE1MUGFyc2VyQmFzZSB7CisgIF9yZXNvbHZlRW50aXRpZXMocykgeworICAgIHJldHVybiBzLnJlcGxhY2UoLyYoW147XSspOy9nLCAoYWxsLCBlbnRpdHkpID0+IHsKKyAgICAgIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDIpID09PSAiI3giKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGVudGl0eS5zdWJzdHJpbmcoMiksIDE2KSk7CisgICAgICB9IGVsc2UgaWYgKGVudGl0eS5zdWJzdHJpbmcoMCwgMSkgPT09ICIjIikgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlbnRpdHkuc3Vic3RyaW5nKDEpLCAxMCkpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGVudGl0eSkgeworICAgICAgICBjYXNlICJsdCI6CisgICAgICAgICAgcmV0dXJuICI8IjsKKworICAgICAgICBjYXNlICJndCI6CisgICAgICAgICAgcmV0dXJuICI+IjsKKworICAgICAgICBjYXNlICJhbXAiOgorICAgICAgICAgIHJldHVybiAiJiI7CisKKyAgICAgICAgY2FzZSAicXVvdCI6CisgICAgICAgICAgcmV0dXJuICciJzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMub25SZXNvbHZlRW50aXR5KGVudGl0eSk7CisgICAgfSk7CisgIH0KKworICBfcGFyc2VDb250ZW50KHMsIHN0YXJ0KSB7CisgICAgY29uc3QgYXR0cmlidXRlcyA9IFtdOworICAgIGxldCBwb3MgPSBzdGFydDsKKworICAgIGZ1bmN0aW9uIHNraXBXcygpIHsKKyAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiBpc1doaXRlc3BhY2UocywgcG9zKSkgeworICAgICAgICArK3BvczsKKyAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgIWlzV2hpdGVzcGFjZShzLCBwb3MpICYmIHNbcG9zXSAhPT0gIj4iICYmIHNbcG9zXSAhPT0gIi8iKSB7CisgICAgICArK3BvczsKKyAgICB9CisKKyAgICBjb25zdCBuYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CisgICAgc2tpcFdzKCk7CisKKyAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIgJiYgc1twb3NdICE9PSAiPyIpIHsKKyAgICAgIHNraXBXcygpOworICAgICAgbGV0IGF0dHJOYW1lID0gIiIsCisgICAgICAgICAgYXR0clZhbHVlID0gIiI7CisKKyAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPSIpIHsKKyAgICAgICAgYXR0ck5hbWUgKz0gc1twb3NdOworICAgICAgICArK3BvczsKKyAgICAgIH0KKworICAgICAgc2tpcFdzKCk7CisKKyAgICAgIGlmIChzW3Bvc10gIT09ICI9IikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgKytwb3M7CisgICAgICBza2lwV3MoKTsKKyAgICAgIGNvbnN0IGF0dHJFbmRDaGFyID0gc1twb3NdOworCisgICAgICBpZiAoYXR0ckVuZENoYXIgIT09ICciJyAmJiBhdHRyRW5kQ2hhciAhPT0gIiciKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBjb25zdCBhdHRyRW5kSW5kZXggPSBzLmluZGV4T2YoYXR0ckVuZENoYXIsICsrcG9zKTsKKworICAgICAgaWYgKGF0dHJFbmRJbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGF0dHJWYWx1ZSA9IHMuc3Vic3RyaW5nKHBvcywgYXR0ckVuZEluZGV4KTsKKyAgICAgIGF0dHJpYnV0ZXMucHVzaCh7CisgICAgICAgIG5hbWU6IGF0dHJOYW1lLAorICAgICAgICB2YWx1ZTogdGhpcy5fcmVzb2x2ZUVudGl0aWVzKGF0dHJWYWx1ZSkKKyAgICAgIH0pOworICAgICAgcG9zID0gYXR0ckVuZEluZGV4ICsgMTsKKyAgICAgIHNraXBXcygpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBuYW1lLAorICAgICAgYXR0cmlidXRlcywKKyAgICAgIHBhcnNlZDogcG9zIC0gc3RhcnQKKyAgICB9OworICB9CisKKyAgX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIHN0YXJ0KSB7CisgICAgbGV0IHBvcyA9IHN0YXJ0OworCisgICAgZnVuY3Rpb24gc2tpcFdzKCkgeworICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7CisgICAgICAgICsrcG9zOworICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIpIHsKKyAgICAgICsrcG9zOworICAgIH0KKworICAgIGNvbnN0IG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKKyAgICBza2lwV3MoKTsKKyAgICBjb25zdCBhdHRyU3RhcnQgPSBwb3M7CisKKyAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgKHNbcG9zXSAhPT0gIj8iIHx8IHNbcG9zICsgMV0gIT09ICI+IikpIHsKKyAgICAgICsrcG9zOworICAgIH0KKworICAgIGNvbnN0IHZhbHVlID0gcy5zdWJzdHJpbmcoYXR0clN0YXJ0LCBwb3MpOworICAgIHJldHVybiB7CisgICAgICBuYW1lLAorICAgICAgdmFsdWUsCisgICAgICBwYXJzZWQ6IHBvcyAtIHN0YXJ0CisgICAgfTsKKyAgfQorCisgIHBhcnNlWG1sKHMpIHsKKyAgICBsZXQgaSA9IDA7CisKKyAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKSB7CisgICAgICBjb25zdCBjaCA9IHNbaV07CisgICAgICBsZXQgaiA9IGk7CisKKyAgICAgIGlmIChjaCA9PT0gIjwiKSB7CisgICAgICAgICsrajsKKyAgICAgICAgY29uc3QgY2gyID0gc1tqXTsKKyAgICAgICAgbGV0IHE7CisKKyAgICAgICAgc3dpdGNoIChjaDIpIHsKKyAgICAgICAgICBjYXNlICIvIjoKKyAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIj4iLCBqKTsKKworICAgICAgICAgICAgaWYgKHEgPCAwKSB7CisgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRWxlbWVudCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5vbkVuZEVsZW1lbnQocy5zdWJzdHJpbmcoaiwgcSkpOworICAgICAgICAgICAgaiA9IHEgKyAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICI/IjoKKyAgICAgICAgICAgICsrajsKKworICAgICAgICAgICAgY29uc3QgcGkgPSB0aGlzLl9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihzLCBqKTsKKworICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyBwaS5wYXJzZWQsIGogKyBwaS5wYXJzZWQgKyAyKSAhPT0gIj8+IikgeworICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLm9uUGkocGkubmFtZSwgcGkudmFsdWUpOworICAgICAgICAgICAgaiArPSBwaS5wYXJzZWQgKyAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICIhIjoKKyAgICAgICAgICAgIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDMpID09PSAiLS0iKSB7CisgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIi0tPiIsIGogKyAzKTsKKworICAgICAgICAgICAgICBpZiAocSA8IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENvbW1lbnQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHRoaXMub25Db21tZW50KHMuc3Vic3RyaW5nKGogKyAzLCBxKSk7CisgICAgICAgICAgICAgIGogPSBxICsgMzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gIltDREFUQVsiKSB7CisgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIl1dPiIsIGogKyA4KTsKKworICAgICAgICAgICAgICBpZiAocSA8IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENkYXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHRoaXMub25DZGF0YShzLnN1YnN0cmluZyhqICsgOCwgcSkpOworICAgICAgICAgICAgICBqID0gcSArIDM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgOCkgPT09ICJET0NUWVBFIikgeworICAgICAgICAgICAgICBjb25zdCBxMiA9IHMuaW5kZXhPZigiWyIsIGogKyA4KTsKKyAgICAgICAgICAgICAgbGV0IGNvbXBsZXhEb2N0eXBlID0gZmFsc2U7CisgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIj4iLCBqICsgOCk7CisKKyAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWREb2N0eXBlRGVjbGFyYXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChxMiA+IDAgJiYgcSA+IHEyKSB7CisgICAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiXT4iLCBqICsgOCk7CisKKyAgICAgICAgICAgICAgICBpZiAocSA8IDApIHsKKyAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb21wbGV4RG9jdHlwZSA9IHRydWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb25zdCBkb2N0eXBlQ29udGVudCA9IHMuc3Vic3RyaW5nKGogKyA4LCBxICsgKGNvbXBsZXhEb2N0eXBlID8gMSA6IDApKTsKKyAgICAgICAgICAgICAgdGhpcy5vbkRvY3R5cGUoZG9jdHlwZUNvbnRlbnQpOworICAgICAgICAgICAgICBqID0gcSArIChjb21wbGV4RG9jdHlwZSA/IDIgOiAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuX3BhcnNlQ29udGVudChzLCBqKTsKKworICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5NYWxmb3JtZWRFbGVtZW50KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgaXNDbG9zZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyBjb250ZW50LnBhcnNlZCwgaiArIGNvbnRlbnQucGFyc2VkICsgMikgPT09ICIvPiIpIHsKKyAgICAgICAgICAgICAgaXNDbG9zZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgY29udGVudC5wYXJzZWQsIGogKyBjb250ZW50LnBhcnNlZCArIDEpICE9PSAiPiIpIHsKKyAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRFbGVtZW50KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLm9uQmVnaW5FbGVtZW50KGNvbnRlbnQubmFtZSwgY29udGVudC5hdHRyaWJ1dGVzLCBpc0Nsb3NlZCk7CisgICAgICAgICAgICBqICs9IGNvbnRlbnQucGFyc2VkICsgKGlzQ2xvc2VkID8gMiA6IDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChqIDwgcy5sZW5ndGggJiYgc1tqXSAhPT0gIjwiKSB7CisgICAgICAgICAgaisrOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdGV4dCA9IHMuc3Vic3RyaW5nKGksIGopOworICAgICAgICB0aGlzLm9uVGV4dCh0aGlzLl9yZXNvbHZlRW50aXRpZXModGV4dCkpOworICAgICAgfQorCisgICAgICBpID0gajsKKyAgICB9CisgIH0KKworICBvblJlc29sdmVFbnRpdHkobmFtZSkgeworICAgIHJldHVybiBgJiR7bmFtZX07YDsKKyAgfQorCisgIG9uUGkobmFtZSwgdmFsdWUpIHt9CisKKyAgb25Db21tZW50KHRleHQpIHt9CisKKyAgb25DZGF0YSh0ZXh0KSB7fQorCisgIG9uRG9jdHlwZShkb2N0eXBlQ29udGVudCkge30KKworICBvblRleHQodGV4dCkge30KKworICBvbkJlZ2luRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCBpc0VtcHR5KSB7fQorCisgIG9uRW5kRWxlbWVudChuYW1lKSB7fQorCisgIG9uRXJyb3IoY29kZSkge30KKworfQorCitjbGFzcyBTaW1wbGVET01Ob2RlIHsKKyAgY29uc3RydWN0b3Iobm9kZU5hbWUsIG5vZGVWYWx1ZSkgeworICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKKyAgICB0aGlzLm5vZGVWYWx1ZSA9IG5vZGVWYWx1ZTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgInBhcmVudE5vZGUiLCB7CisgICAgICB2YWx1ZTogbnVsbCwKKyAgICAgIHdyaXRhYmxlOiB0cnVlCisgICAgfSk7CisgIH0KKworICBnZXQgZmlyc3RDaGlsZCgpIHsKKyAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVzICYmIHRoaXMuY2hpbGROb2Rlc1swXTsKKyAgfQorCisgIGdldCBuZXh0U2libGluZygpIHsKKyAgICBjb25zdCBjaGlsZE5vZGVzID0gdGhpcy5wYXJlbnROb2RlLmNoaWxkTm9kZXM7CisKKyAgICBpZiAoIWNoaWxkTm9kZXMpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgY29uc3QgaW5kZXggPSBjaGlsZE5vZGVzLmluZGV4T2YodGhpcyk7CisKKyAgICBpZiAoaW5kZXggPT09IC0xKSB7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIHJldHVybiBjaGlsZE5vZGVzW2luZGV4ICsgMV07CisgIH0KKworICBnZXQgdGV4dENvbnRlbnQoKSB7CisgICAgaWYgKCF0aGlzLmNoaWxkTm9kZXMpIHsKKyAgICAgIHJldHVybiB0aGlzLm5vZGVWYWx1ZSB8fCAiIjsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVzLm1hcChmdW5jdGlvbiAoY2hpbGQpIHsKKyAgICAgIHJldHVybiBjaGlsZC50ZXh0Q29udGVudDsKKyAgICB9KS5qb2luKCIiKTsKKyAgfQorCisgIGhhc0NoaWxkTm9kZXMoKSB7CisgICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyAmJiB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoID4gMDsKKyAgfQorCit9CisKK2NsYXNzIFNpbXBsZVhNTFBhcnNlciBleHRlbmRzIFhNTFBhcnNlckJhc2UgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG51bGw7CisgICAgdGhpcy5fc3RhY2sgPSBudWxsOworICAgIHRoaXMuX2Vycm9yQ29kZSA9IFhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yOworICB9CisKKyAgcGFyc2VGcm9tU3RyaW5nKGRhdGEpIHsKKyAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBbXTsKKyAgICB0aGlzLl9zdGFjayA9IFtdOworICAgIHRoaXMuX2Vycm9yQ29kZSA9IFhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yOworICAgIHRoaXMucGFyc2VYbWwoZGF0YSk7CisKKyAgICBpZiAodGhpcy5fZXJyb3JDb2RlICE9PSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcikgeworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBjb25zdCBbZG9jdW1lbnRFbGVtZW50XSA9IHRoaXMuX2N1cnJlbnRGcmFnbWVudDsKKworICAgIGlmICghZG9jdW1lbnRFbGVtZW50KSB7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBkb2N1bWVudEVsZW1lbnQKKyAgICB9OworICB9CisKKyAgb25SZXNvbHZlRW50aXR5KG5hbWUpIHsKKyAgICBzd2l0Y2ggKG5hbWUpIHsKKyAgICAgIGNhc2UgImFwb3MiOgorICAgICAgICByZXR1cm4gIiciOworICAgIH0KKworICAgIHJldHVybiBzdXBlci5vblJlc29sdmVFbnRpdHkobmFtZSk7CisgIH0KKworICBvblRleHQodGV4dCkgeworICAgIGlmIChpc1doaXRlc3BhY2VTdHJpbmcodGV4dCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUoIiN0ZXh0IiwgdGV4dCk7CisKKyAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTsKKyAgfQorCisgIG9uQ2RhdGEodGV4dCkgeworICAgIGNvbnN0IG5vZGUgPSBuZXcgU2ltcGxlRE9NTm9kZSgiI3RleHQiLCB0ZXh0KTsKKworICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG5vZGUpOworICB9CisKKyAgb25CZWdpbkVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgaXNFbXB0eSkgeworICAgIGNvbnN0IG5vZGUgPSBuZXcgU2ltcGxlRE9NTm9kZShuYW1lKTsKKyAgICBub2RlLmNoaWxkTm9kZXMgPSBbXTsKKworICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG5vZGUpOworCisgICAgaWYgKGlzRW1wdHkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnRGcmFnbWVudCk7CisKKyAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBub2RlLmNoaWxkTm9kZXM7CisgIH0KKworICBvbkVuZEVsZW1lbnQobmFtZSkgeworICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IHRoaXMuX3N0YWNrLnBvcCgpIHx8IFtdOworICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gdGhpcy5fY3VycmVudEZyYWdtZW50W3RoaXMuX2N1cnJlbnRGcmFnbWVudC5sZW5ndGggLSAxXTsKKworICAgIGlmICghbGFzdEVsZW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsYXN0RWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGxhc3RFbGVtZW50LmNoaWxkTm9kZXNbaV0ucGFyZW50Tm9kZSA9IGxhc3RFbGVtZW50OworICAgIH0KKyAgfQorCisgIG9uRXJyb3IoY29kZSkgeworICAgIHRoaXMuX2Vycm9yQ29kZSA9IGNvZGU7CisgIH0KKworfQorCitleHBvcnRzLlNpbXBsZVhNTFBhcnNlciA9IFNpbXBsZVhNTFBhcnNlcjsKKworLyoqKi8gfSksCisvKiAxNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworY2xhc3MgT3B0aW9uYWxDb250ZW50R3JvdXAgeworICBjb25zdHJ1Y3RvcihuYW1lLCBpbnRlbnQpIHsKKyAgICB0aGlzLnZpc2libGUgPSB0cnVlOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5pbnRlbnQgPSBpbnRlbnQ7CisgIH0KKworfQorCitjbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcgeworICBjb25zdHJ1Y3RvcihkYXRhKSB7CisgICAgdGhpcy5uYW1lID0gbnVsbDsKKyAgICB0aGlzLmNyZWF0b3IgPSBudWxsOworICAgIHRoaXMuX29yZGVyID0gbnVsbDsKKyAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwKCk7CisKKyAgICBpZiAoZGF0YSA9PT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTsKKyAgICB0aGlzLmNyZWF0b3IgPSBkYXRhLmNyZWF0b3I7CisgICAgdGhpcy5fb3JkZXIgPSBkYXRhLm9yZGVyOworCisgICAgZm9yIChjb25zdCBncm91cCBvZiBkYXRhLmdyb3VwcykgeworICAgICAgdGhpcy5fZ3JvdXBzLnNldChncm91cC5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwLm5hbWUsIGdyb3VwLmludGVudCkpOworICAgIH0KKworICAgIGlmIChkYXRhLmJhc2VTdGF0ZSA9PT0gIk9GRiIpIHsKKyAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fZ3JvdXBzKSB7CisgICAgICAgIGdyb3VwLnZpc2libGUgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IG9uIG9mIGRhdGEub24pIHsKKyAgICAgIHRoaXMuX2dyb3Vwcy5nZXQob24pLnZpc2libGUgPSB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3Qgb2ZmIG9mIGRhdGEub2ZmKSB7CisgICAgICB0aGlzLl9ncm91cHMuZ2V0KG9mZikudmlzaWJsZSA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIGlzVmlzaWJsZShncm91cCkgeworICAgIGlmIChncm91cC50eXBlID09PSAiT0NHIikgeworICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwLmlkKSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2dyb3VwLmlkfWApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXAuaWQpLnZpc2libGU7CisgICAgfSBlbHNlIGlmIChncm91cC50eXBlID09PSAiT0NNRCIpIHsKKyAgICAgIGlmIChncm91cC5leHByZXNzaW9uKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVmlzaWJpbGl0eSBleHByZXNzaW9uIG5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgfQorCisgICAgICBpZiAoIWdyb3VwLnBvbGljeSB8fCBncm91cC5wb2xpY3kgPT09ICJBbnlPbiIpIHsKKyAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHsKKyAgICAgICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoaWQpKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRoaXMuX2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSAiQWxsT24iKSB7CisgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7CisgICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmdldChpZCkudmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09ICJBbnlPZmYiKSB7CisgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7CisgICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmdldChpZCkudmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09ICJBbGxPZmYiKSB7CisgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7CisgICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC53YXJuKShgVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSAke2dyb3VwLnBvbGljeX0uYCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAoMCwgX3V0aWwud2FybikoYFVua25vd24gZ3JvdXAgdHlwZSAke2dyb3VwLnR5cGV9LmApOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc2V0VmlzaWJpbGl0eShpZCwgdmlzaWJsZSA9IHRydWUpIHsKKyAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoaWQpKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX2dyb3Vwcy5nZXQoaWQpLnZpc2libGUgPSAhIXZpc2libGU7CisgIH0KKworICBnZXRPcmRlcigpIHsKKyAgICBpZiAoIXRoaXMuX2dyb3Vwcy5zaXplKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fb3JkZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLl9vcmRlci5zbGljZSgpOworICAgIH0KKworICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2dyb3Vwcy5rZXlzKCkpOworICB9CisKKyAgZ2V0R3JvdXBzKCkgeworICAgIGlmICghdGhpcy5fZ3JvdXBzLnNpemUpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fZ3JvdXBzKTsKKyAgfQorCisgIGdldEdyb3VwKGlkKSB7CisgICAgcmV0dXJuIHRoaXMuX2dyb3Vwcy5nZXQoaWQpIHx8IG51bGw7CisgIH0KKworfQorCitleHBvcnRzLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IE9wdGlvbmFsQ29udGVudENvbmZpZzsKKworLyoqKi8gfSksCisvKiAxNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERkRhdGFUcmFuc3BvcnRTdHJlYW0gPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK2NsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0geworICBjb25zdHJ1Y3RvcihwYXJhbXMsIHBkZkRhdGFSYW5nZVRyYW5zcG9ydCkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKHBkZkRhdGFSYW5nZVRyYW5zcG9ydCwgJ1BERkRhdGFUcmFuc3BvcnRTdHJlYW0gLSBtaXNzaW5nIHJlcXVpcmVkICJwZGZEYXRhUmFuZ2VUcmFuc3BvcnQiIGFyZ3VtZW50LicpOworICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IFtdOworICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHBhcmFtcy5wcm9ncmVzc2l2ZURvbmUgfHwgZmFsc2U7CisgICAgY29uc3QgaW5pdGlhbERhdGEgPSBwYXJhbXMuaW5pdGlhbERhdGE7CisKKyAgICBpZiAoaW5pdGlhbERhdGEgJiYgaW5pdGlhbERhdGEubGVuZ3RoID4gMCkgeworICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoaW5pdGlhbERhdGEpLmJ1ZmZlcjsKKworICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goYnVmZmVyKTsKKyAgICB9CisKKyAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQ7CisgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhcGFyYW1zLmRpc2FibGVTdHJlYW07CisgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFwYXJhbXMuZGlzYWJsZVJhbmdlOworICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBwYXJhbXMubGVuZ3RoOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDsKKyAgICB0aGlzLl9yYW5nZVJlYWRlcnMgPSBbXTsKKworICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRSYW5nZUxpc3RlbmVyKChiZWdpbiwgY2h1bmspID0+IHsKKyAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoeworICAgICAgICBiZWdpbiwKKyAgICAgICAgY2h1bmsKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzTGlzdGVuZXIoKGxvYWRlZCwgdG90YWwpID0+IHsKKyAgICAgIHRoaXMuX29uUHJvZ3Jlc3MoeworICAgICAgICBsb2FkZWQsCisgICAgICAgIHRvdGFsCisgICAgICB9KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihjaHVuayA9PiB7CisgICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHsKKyAgICAgICAgY2h1bmsKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKCgpID0+IHsKKyAgICAgIHRoaXMuX29uUHJvZ3Jlc3NpdmVEb25lKCk7CisgICAgfSk7CisKKyAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQudHJhbnNwb3J0UmVhZHkoKTsKKyAgfQorCisgIF9vblJlY2VpdmVEYXRhKGFyZ3MpIHsKKyAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShhcmdzLmNodW5rKS5idWZmZXI7CisKKyAgICBpZiAoYXJncy5iZWdpbiA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHsKKyAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2VucXVldWUoYnVmZmVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNvbWUoZnVuY3Rpb24gKHJhbmdlUmVhZGVyKSB7CisgICAgICAgIGlmIChyYW5nZVJlYWRlci5fYmVnaW4gIT09IGFyZ3MuYmVnaW4pIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByYW5nZVJlYWRlci5fZW5xdWV1ZShidWZmZXIpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSk7CisKKyAgICAgICgwLCBfdXRpbC5hc3NlcnQpKGZvdW5kLCAiX29uUmVjZWl2ZURhdGEgLSBubyBgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyYCBpbnN0YW5jZSBmb3VuZC4iKTsKKyAgICB9CisgIH0KKworICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPyB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5fbG9hZGVkIDogMDsKKyAgfQorCisgIF9vblByb2dyZXNzKGV2dCkgeworICAgIGlmIChldnQudG90YWwgPT09IHVuZGVmaW5lZCkgeworICAgICAgY29uc3QgZmlyc3RSZWFkZXIgPSB0aGlzLl9yYW5nZVJlYWRlcnNbMF07CisKKyAgICAgIGlmIChmaXJzdFJlYWRlciAmJiBmaXJzdFJlYWRlci5vblByb2dyZXNzKSB7CisgICAgICAgIGZpcnN0UmVhZGVyLm9uUHJvZ3Jlc3MoeworICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZAorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgZnVsbFJlYWRlciA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOworCisgICAgICBpZiAoZnVsbFJlYWRlciAmJiBmdWxsUmVhZGVyLm9uUHJvZ3Jlc3MpIHsKKyAgICAgICAgZnVsbFJlYWRlci5vblByb2dyZXNzKHsKKyAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsCisgICAgICAgICAgdG90YWw6IGV2dC50b3RhbAorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfb25Qcm9ncmVzc2l2ZURvbmUoKSB7CisgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7CisgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5wcm9ncmVzc2l2ZURvbmUoKTsKKyAgICB9CisKKyAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmUgPSB0cnVlOworICB9CisKKyAgX3JlbW92ZVJhbmdlUmVhZGVyKHJlYWRlcikgeworICAgIGNvbnN0IGkgPSB0aGlzLl9yYW5nZVJlYWRlcnMuaW5kZXhPZihyZWFkZXIpOworCisgICAgaWYgKGkgPj0gMCkgeworICAgICAgdGhpcy5fcmFuZ2VSZWFkZXJzLnNwbGljZShpLCAxKTsKKyAgICB9CisgIH0KKworICBnZXRGdWxsUmVhZGVyKCkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERkRhdGFUcmFuc3BvcnRTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTsKKyAgICBjb25zdCBxdWV1ZWRDaHVua3MgPSB0aGlzLl9xdWV1ZWRDaHVua3M7CisgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gbnVsbDsKKyAgICByZXR1cm4gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIodGhpcywgcXVldWVkQ2h1bmtzLCB0aGlzLl9wcm9ncmVzc2l2ZURvbmUpOworICB9CisKKyAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkgeworICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIGJlZ2luLCBlbmQpOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2UoYmVnaW4sIGVuZCk7CisKKyAgICB0aGlzLl9yYW5nZVJlYWRlcnMucHVzaChyZWFkZXIpOworCisgICAgcmV0dXJuIHJlYWRlcjsKKyAgfQorCisgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikgeworICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgeworICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfQorCisgICAgY29uc3QgcmVhZGVycyA9IHRoaXMuX3JhbmdlUmVhZGVycy5zbGljZSgwKTsKKworICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmFuZ2VSZWFkZXIpIHsKKyAgICAgIHJhbmdlUmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgIH0pOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFib3J0KCk7CisgIH0KKworfQorCitleHBvcnRzLlBERkRhdGFUcmFuc3BvcnRTdHJlYW0gPSBQREZEYXRhVHJhbnNwb3J0U3RyZWFtOworCitjbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyIHsKKyAgY29uc3RydWN0b3Ioc3RyZWFtLCBxdWV1ZWRDaHVua3MsIHByb2dyZXNzaXZlRG9uZSA9IGZhbHNlKSB7CisgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMuX2RvbmUgPSBwcm9ncmVzc2l2ZURvbmUgfHwgZmFsc2U7CisgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsOworICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IHF1ZXVlZENodW5rcyB8fCBbXTsKKyAgICB0aGlzLl9sb2FkZWQgPSAwOworCisgICAgZm9yIChjb25zdCBjaHVuayBvZiB0aGlzLl9xdWV1ZWRDaHVua3MpIHsKKyAgICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoOworICAgIH0KKworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gUHJvbWlzZS5yZXNvbHZlKCk7CisgICAgc3RyZWFtLl9mdWxsUmVxdWVzdFJlYWRlciA9IHRoaXM7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKyAgfQorCisgIF9lbnF1ZXVlKGNodW5rKSB7CisgICAgaWYgKHRoaXMuX2RvbmUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkgeworICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpOworCisgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgdmFsdWU6IGNodW5rLAorICAgICAgICBkb25lOiBmYWxzZQorICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGNodW5rKTsKKyAgICB9CisKKyAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDsKKyAgfQorCisgIGdldCBoZWFkZXJzUmVhZHkoKSB7CisgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTsKKyAgfQorCisgIGdldCBmaWxlbmFtZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7CisgIH0KKworICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkOworICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzU3RyZWFtaW5nU3VwcG9ydGVkOworICB9CisKKyAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7CisgICAgcmV0dXJuIHRoaXMuX3N0cmVhbS5fY29udGVudExlbmd0aDsKKyAgfQorCisgIGFzeW5jIHJlYWQoKSB7CisgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rcy5zaGlmdCgpOworCisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogY2h1bmssCisgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICB9OworICAgIH0KKworICAgIGlmICh0aGlzLl9kb25lKSB7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9OworICAgIH0KKworICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7CisKKyAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIGNhbmNlbChyZWFzb24pIHsKKyAgICB0aGlzLl9kb25lID0gdHJ1ZTsKKworICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7CisgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfSk7CisgICAgfSk7CisKKyAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworICB9CisKKyAgcHJvZ3Jlc3NpdmVEb25lKCkgeworICAgIGlmICh0aGlzLl9kb25lKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fZG9uZSA9IHRydWU7CisgIH0KKworfQorCitjbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0sIGJlZ2luLCBlbmQpIHsKKyAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5fYmVnaW4gPSBiZWdpbjsKKyAgICB0aGlzLl9lbmQgPSBlbmQ7CisgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsOworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgICAgdGhpcy5fZG9uZSA9IGZhbHNlOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgIH0KKworICBfZW5xdWV1ZShjaHVuaykgeworICAgIGlmICh0aGlzLl9kb25lKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9PT0gMCkgeworICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBjaHVuazsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgcmVxdWVzdHNDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTsKKworICAgICAgcmVxdWVzdHNDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICB2YWx1ZTogY2h1bmssCisgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICB9KTsKKworICAgICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHsKKyAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgICBkb25lOiB0cnVlCisgICAgICAgIH0pOworICAgICAgfSk7CisKKyAgICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgICAgfQorCisgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpOworICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGFzeW5jIHJlYWQoKSB7CisgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rKSB7CisgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rOworICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsOworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IGNodW5rLAorICAgICAgICBkb25lOiBmYWxzZQorICAgICAgfTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fZG9uZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfTsKKyAgICB9CisKKyAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKworICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpOworCisgICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBjYW5jZWwocmVhc29uKSB7CisgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKworICAgIHRoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyk7CisgIH0KKworfQorCisvKioqLyB9KSwKKy8qIDE4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuV2ViR0xDb250ZXh0ID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCitjbGFzcyBXZWJHTENvbnRleHQgeworICBjb25zdHJ1Y3Rvcih7CisgICAgZW5hYmxlID0gZmFsc2UKKyAgfSkgeworICAgIHRoaXMuX2VuYWJsZWQgPSBlbmFibGUgPT09IHRydWU7CisgIH0KKworICBnZXQgaXNFbmFibGVkKCkgeworICAgIGxldCBlbmFibGVkID0gdGhpcy5fZW5hYmxlZDsKKworICAgIGlmIChlbmFibGVkKSB7CisgICAgICBlbmFibGVkID0gV2ViR0xVdGlscy50cnlJbml0R0woKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzRW5hYmxlZCIsIGVuYWJsZWQpOworICB9CisKKyAgY29tcG9zZVNNYXNrKHsKKyAgICBsYXllciwKKyAgICBtYXNrLAorICAgIHByb3BlcnRpZXMKKyAgfSkgeworICAgIHJldHVybiBXZWJHTFV0aWxzLmNvbXBvc2VTTWFzayhsYXllciwgbWFzaywgcHJvcGVydGllcyk7CisgIH0KKworICBkcmF3RmlndXJlcyh7CisgICAgd2lkdGgsCisgICAgaGVpZ2h0LAorICAgIGJhY2tncm91bmRDb2xvciwKKyAgICBmaWd1cmVzLAorICAgIGNvbnRleHQKKyAgfSkgeworICAgIHJldHVybiBXZWJHTFV0aWxzLmRyYXdGaWd1cmVzKHdpZHRoLCBoZWlnaHQsIGJhY2tncm91bmRDb2xvciwgZmlndXJlcywgY29udGV4dCk7CisgIH0KKworICBjbGVhcigpIHsKKyAgICBXZWJHTFV0aWxzLmNsZWFudXAoKTsKKyAgfQorCit9CisKK2V4cG9ydHMuV2ViR0xDb250ZXh0ID0gV2ViR0xDb250ZXh0OworCit2YXIgV2ViR0xVdGlscyA9IGZ1bmN0aW9uIFdlYkdMVXRpbHNDbG9zdXJlKCkgeworICBmdW5jdGlvbiBsb2FkU2hhZGVyKGdsLCBjb2RlLCBzaGFkZXJUeXBlKSB7CisgICAgdmFyIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKKyAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBjb2RlKTsKKyAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgdmFyIGNvbXBpbGVkID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpOworCisgICAgaWYgKCFjb21waWxlZCkgeworICAgICAgdmFyIGVycm9yTXNnID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpOworICAgICAgdGhyb3cgbmV3IEVycm9yKCJFcnJvciBkdXJpbmcgc2hhZGVyIGNvbXBpbGF0aW9uOiAiICsgZXJyb3JNc2cpOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhTaGFkZXIoZ2wsIGNvZGUpIHsKKyAgICByZXR1cm4gbG9hZFNoYWRlcihnbCwgY29kZSwgZ2wuVkVSVEVYX1NIQURFUik7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgY29kZSkgeworICAgIHJldHVybiBsb2FkU2hhZGVyKGdsLCBjb2RlLCBnbC5GUkFHTUVOVF9TSEFERVIpOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbShnbCwgc2hhZGVycykgeworICAgIHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc2hhZGVycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyc1tpXSk7CisgICAgfQorCisgICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgdmFyIGxpbmtlZCA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpOworCisgICAgaWYgKCFsaW5rZWQpIHsKKyAgICAgIHZhciBlcnJvck1zZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pOworICAgICAgdGhyb3cgbmV3IEVycm9yKCJFcnJvciBkdXJpbmcgcHJvZ3JhbSBsaW5raW5nOiAiICsgZXJyb3JNc2cpOworICAgIH0KKworICAgIHJldHVybiBwcm9ncmFtOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShnbCwgaW1hZ2UsIHRleHR1cmVJZCkgeworICAgIGdsLmFjdGl2ZVRleHR1cmUodGV4dHVyZUlkKTsKKyAgICB2YXIgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKKyAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKKyAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKKyAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKKyAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CisgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOworICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpOworICAgIHJldHVybiB0ZXh0dXJlOworICB9CisKKyAgdmFyIGN1cnJlbnRHTCwgY3VycmVudENhbnZhczsKKworICBmdW5jdGlvbiBnZW5lcmF0ZUdMKCkgeworICAgIGlmIChjdXJyZW50R0wpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdXJyZW50Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CisgICAgY3VycmVudEdMID0gY3VycmVudENhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbCIsIHsKKyAgICAgIHByZW11bHRpcGxpZWRhbHBoYTogZmFsc2UKKyAgICB9KTsKKyAgfQorCisgIHZhciBzbWFza1ZlcnRleFNoYWRlckNvZGUgPSAiXAorICBhdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXR0cmlidXRlIHZlYzIgYV90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlmb3JtIHZlYzIgdV9yZXNvbHV0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZhcnlpbmcgdmVjMiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjMiBjbGlwU3BhY2UgPSAoYV9wb3NpdGlvbiAvIHVfcmVzb2x1dGlvbikgKiAyLjAgLSAxLjA7ICAgXAorICAgIGdsX1Bvc2l0aW9uID0gdmVjNChjbGlwU3BhY2UgKiB2ZWMyKDEsIC0xKSwgMCwgMSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisgIHZhciBzbWFza0ZyYWdtZW50U2hhZGVyQ29kZSA9ICJcCisgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSB2ZWM0IHVfYmFja2Ryb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuaWZvcm0gaW50IHVfc3VidHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSBzYW1wbGVyMkQgdV9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlYzQgaW1hZ2VDb2xvciA9IHRleHR1cmUyRCh1X2ltYWdlLCB2X3RleENvb3JkKTsgICAgICAgICAgIFwKKyAgICB2ZWM0IG1hc2tDb2xvciA9IHRleHR1cmUyRCh1X21hc2ssIHZfdGV4Q29vcmQpOyAgICAgICAgICAgICBcCisgICAgaWYgKHVfYmFja2Ryb3AuYSA+IDAuMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFza0NvbG9yLnJnYiA9IG1hc2tDb2xvci5yZ2IgKiBtYXNrQ29sb3IuYSArICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1X2JhY2tkcm9wLnJnYiAqICgxLjAgLSBtYXNrQ29sb3IuYSk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IGx1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodV9zdWJ0eXBlID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBsdW0gPSBtYXNrQ29sb3IuYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGx1bSA9IG1hc2tDb2xvci5yICogMC4zICsgbWFza0NvbG9yLmcgKiAwLjU5ICsgICAgICAgICAgICBcCisgICAgICAgICAgICBtYXNrQ29sb3IuYiAqIDAuMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbWFnZUNvbG9yLmEgKj0gbHVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW1hZ2VDb2xvci5yZ2IgKj0gaW1hZ2VDb2xvci5hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdsX0ZyYWdDb2xvciA9IGltYWdlQ29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICB2YXIgc21hc2tDYWNoZSA9IG51bGw7CisKKyAgZnVuY3Rpb24gaW5pdFNtYXNrR0woKSB7CisgICAgdmFyIGNhbnZhcywgZ2w7CisgICAgZ2VuZXJhdGVHTCgpOworICAgIGNhbnZhcyA9IGN1cnJlbnRDYW52YXM7CisgICAgY3VycmVudENhbnZhcyA9IG51bGw7CisgICAgZ2wgPSBjdXJyZW50R0w7CisgICAgY3VycmVudEdMID0gbnVsbDsKKyAgICB2YXIgdmVydGV4U2hhZGVyID0gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCBzbWFza1ZlcnRleFNoYWRlckNvZGUpOworICAgIHZhciBmcmFnbWVudFNoYWRlciA9IGNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBzbWFza0ZyYWdtZW50U2hhZGVyQ29kZSk7CisgICAgdmFyIHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKGdsLCBbdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcl0pOworICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgdmFyIGNhY2hlID0ge307CisgICAgY2FjaGUuZ2wgPSBnbDsKKyAgICBjYWNoZS5jYW52YXMgPSBjYW52YXM7CisgICAgY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3Jlc29sdXRpb24iKTsKKyAgICBjYWNoZS5wb3NpdGlvbkxvY2F0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgImFfcG9zaXRpb24iKTsKKyAgICBjYWNoZS5iYWNrZHJvcExvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tkcm9wIik7CisgICAgY2FjaGUuc3VidHlwZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3N1YnR5cGUiKTsKKyAgICB2YXIgdGV4Q29vcmRMb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX3RleENvb3JkIik7CisgICAgdmFyIHRleExheWVyTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW1hZ2UiKTsKKyAgICB2YXIgdGV4TWFza0xvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X21hc2siKTsKKyAgICB2YXIgdGV4Q29vcmRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTsKKyAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGV4Q29vcmRCdWZmZXIpOworICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDEuMCwgMS4wLCAwLjAsIDEuMCwgMS4wXSksIGdsLlNUQVRJQ19EUkFXKTsKKyAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZExvY2F0aW9uKTsKKyAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7CisgICAgZ2wudW5pZm9ybTFpKHRleExheWVyTG9jYXRpb24sIDApOworICAgIGdsLnVuaWZvcm0xaSh0ZXhNYXNrTG9jYXRpb24sIDEpOworICAgIHNtYXNrQ2FjaGUgPSBjYWNoZTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbXBvc2VTTWFzayhsYXllciwgbWFzaywgcHJvcGVydGllcykgeworICAgIHZhciB3aWR0aCA9IGxheWVyLndpZHRoLAorICAgICAgICBoZWlnaHQgPSBsYXllci5oZWlnaHQ7CisKKyAgICBpZiAoIXNtYXNrQ2FjaGUpIHsKKyAgICAgIGluaXRTbWFza0dMKCk7CisgICAgfQorCisgICAgdmFyIGNhY2hlID0gc21hc2tDYWNoZSwKKyAgICAgICAgY2FudmFzID0gY2FjaGUuY2FudmFzLAorICAgICAgICBnbCA9IGNhY2hlLmdsOworICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoOworICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTsKKyAgICBnbC51bmlmb3JtMmYoY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGlmIChwcm9wZXJ0aWVzLmJhY2tkcm9wKSB7CisgICAgICBnbC51bmlmb3JtNGYoY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uLCBwcm9wZXJ0aWVzLmJhY2tkcm9wWzBdLCBwcm9wZXJ0aWVzLmJhY2tkcm9wWzFdLCBwcm9wZXJ0aWVzLmJhY2tkcm9wWzJdLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2wudW5pZm9ybTRmKGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiwgMCwgMCwgMCwgMCk7CisgICAgfQorCisgICAgZ2wudW5pZm9ybTFpKGNhY2hlLnN1YnR5cGVMb2NhdGlvbiwgcHJvcGVydGllcy5zdWJ0eXBlID09PSAiTHVtaW5vc2l0eSIgPyAxIDogMCk7CisgICAgdmFyIHRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBsYXllciwgZ2wuVEVYVFVSRTApOworICAgIHZhciBtYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIG1hc2ssIGdsLlRFWFRVUkUxKTsKKyAgICB2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7CisgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIHdpZHRoLCAwLCAwLCBoZWlnaHQsIDAsIGhlaWdodCwgd2lkdGgsIDAsIHdpZHRoLCBoZWlnaHRdKSwgZ2wuU1RBVElDX0RSQVcpOworICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNhY2hlLnBvc2l0aW9uTG9jYXRpb24pOworICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY2FjaGUucG9zaXRpb25Mb2NhdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTsKKyAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOworICAgIGdsLmVuYWJsZShnbC5CTEVORCk7CisgICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRVMsIDAsIDYpOworICAgIGdsLmZsdXNoKCk7CisgICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTsKKyAgICBnbC5kZWxldGVUZXh0dXJlKG1hc2tUZXh0dXJlKTsKKyAgICBnbC5kZWxldGVCdWZmZXIoYnVmZmVyKTsKKyAgICByZXR1cm4gY2FudmFzOworICB9CisKKyAgdmFyIGZpZ3VyZXNWZXJ0ZXhTaGFkZXJDb2RlID0gIlwKKyAgYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGF0dHJpYnV0ZSB2ZWMzIGFfY29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuaWZvcm0gdmVjMiB1X3NjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlmb3JtIHZlYzIgdV9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZhcnlpbmcgdmVjNCB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjMiBwb3NpdGlvbiA9IChhX3Bvc2l0aW9uICsgdV9vZmZzZXQpICogdV9zY2FsZTsgICAgICAgICAgXAorICAgIHZlYzIgY2xpcFNwYWNlID0gKHBvc2l0aW9uIC8gdV9yZXNvbHV0aW9uKSAqIDIuMCAtIDEuMDsgICAgIFwKKyAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoY2xpcFNwYWNlICogdmVjMigxLCAtMSksIDAsIDEpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZfY29sb3IgPSB2ZWM0KGFfY29sb3IgLyAyNTUuMCwgMS4wKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICB2YXIgZmlndXJlc0ZyYWdtZW50U2hhZGVyQ29kZSA9ICJcCisgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdmFyeWluZyB2ZWM0IHZfY29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnbF9GcmFnQ29sb3IgPSB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgdmFyIGZpZ3VyZXNDYWNoZSA9IG51bGw7CisKKyAgZnVuY3Rpb24gaW5pdEZpZ3VyZXNHTCgpIHsKKyAgICB2YXIgY2FudmFzLCBnbDsKKyAgICBnZW5lcmF0ZUdMKCk7CisgICAgY2FudmFzID0gY3VycmVudENhbnZhczsKKyAgICBjdXJyZW50Q2FudmFzID0gbnVsbDsKKyAgICBnbCA9IGN1cnJlbnRHTDsKKyAgICBjdXJyZW50R0wgPSBudWxsOworICAgIHZhciB2ZXJ0ZXhTaGFkZXIgPSBjcmVhdGVWZXJ0ZXhTaGFkZXIoZ2wsIGZpZ3VyZXNWZXJ0ZXhTaGFkZXJDb2RlKTsKKyAgICB2YXIgZnJhZ21lbnRTaGFkZXIgPSBjcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgZmlndXJlc0ZyYWdtZW50U2hhZGVyQ29kZSk7CisgICAgdmFyIHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKGdsLCBbdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcl0pOworICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgdmFyIGNhY2hlID0ge307CisgICAgY2FjaGUuZ2wgPSBnbDsKKyAgICBjYWNoZS5jYW52YXMgPSBjYW52YXM7CisgICAgY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3Jlc29sdXRpb24iKTsKKyAgICBjYWNoZS5zY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3NjYWxlIik7CisgICAgY2FjaGUub2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CisgICAgY2FjaGUucG9zaXRpb25Mb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX3Bvc2l0aW9uIik7CisgICAgY2FjaGUuY29sb3JMb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX2NvbG9yIik7CisgICAgZmlndXJlc0NhY2hlID0gY2FjaGU7CisgIH0KKworICBmdW5jdGlvbiBkcmF3RmlndXJlcyh3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kQ29sb3IsIGZpZ3VyZXMsIGNvbnRleHQpIHsKKyAgICBpZiAoIWZpZ3VyZXNDYWNoZSkgeworICAgICAgaW5pdEZpZ3VyZXNHTCgpOworICAgIH0KKworICAgIHZhciBjYWNoZSA9IGZpZ3VyZXNDYWNoZSwKKyAgICAgICAgY2FudmFzID0gY2FjaGUuY2FudmFzLAorICAgICAgICBnbCA9IGNhY2hlLmdsOworICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoOworICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTsKKyAgICBnbC51bmlmb3JtMmYoY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB2YXIgY291bnQgPSAwOworICAgIHZhciBpLCBpaSwgcm93czsKKworICAgIGZvciAoaSA9IDAsIGlpID0gZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBzd2l0Y2ggKGZpZ3VyZXNbaV0udHlwZSkgeworICAgICAgICBjYXNlICJsYXR0aWNlIjoKKyAgICAgICAgICByb3dzID0gZmlndXJlc1tpXS5jb29yZHMubGVuZ3RoIC8gZmlndXJlc1tpXS52ZXJ0aWNlc1BlclJvdyB8IDA7CisgICAgICAgICAgY291bnQgKz0gKHJvd3MgLSAxKSAqIChmaWd1cmVzW2ldLnZlcnRpY2VzUGVyUm93IC0gMSkgKiA2OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRyaWFuZ2xlcyI6CisgICAgICAgICAgY291bnQgKz0gZmlndXJlc1tpXS5jb29yZHMubGVuZ3RoOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHZhciBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7CisgICAgdmFyIGNvbG9ycyA9IG5ldyBVaW50OEFycmF5KGNvdW50ICogMyk7CisgICAgdmFyIGNvb3Jkc01hcCA9IGNvbnRleHQuY29vcmRzLAorICAgICAgICBjb2xvcnNNYXAgPSBjb250ZXh0LmNvbG9yczsKKyAgICB2YXIgcEluZGV4ID0gMCwKKyAgICAgICAgY0luZGV4ID0gMDsKKworICAgIGZvciAoaSA9IDAsIGlpID0gZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgZmlndXJlID0gZmlndXJlc1tpXSwKKyAgICAgICAgICBwcyA9IGZpZ3VyZS5jb29yZHMsCisgICAgICAgICAgY3MgPSBmaWd1cmUuY29sb3JzOworCisgICAgICBzd2l0Y2ggKGZpZ3VyZS50eXBlKSB7CisgICAgICAgIGNhc2UgImxhdHRpY2UiOgorICAgICAgICAgIHZhciBjb2xzID0gZmlndXJlLnZlcnRpY2VzUGVyUm93OworICAgICAgICAgIHJvd3MgPSBwcy5sZW5ndGggLyBjb2xzIHwgMDsKKworICAgICAgICAgIGZvciAodmFyIHJvdyA9IDE7IHJvdyA8IHJvd3M7IHJvdysrKSB7CisgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gcm93ICogY29scyArIDE7CisKKyAgICAgICAgICAgIGZvciAodmFyIGNvbCA9IDE7IGNvbCA8IGNvbHM7IGNvbCsrLCBvZmZzZXQrKykgeworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4XSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzIC0gMV1dOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMV0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gY29scyAtIDFdICsgMV07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAyXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzXV07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAzXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzXSArIDFdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgNF0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gMV1dOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgNV0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gMV0gKyAxXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleF0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29scyAtIDFdXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDFdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIGNvbHMgLSAxXSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMl0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29scyAtIDFdICsgMl07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAzXSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzXV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA0XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzXSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgNV0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29sc10gKyAyXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDZdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIDFdXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDddID0gY29sb3JzTWFwW2NzW29mZnNldCAtIDFdICsgMV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA4XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSAxXSArIDJdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgNl0gPSBjb29yZHNbcEluZGV4ICsgMl07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyA3XSA9IGNvb3Jkc1twSW5kZXggKyAzXTsKKyAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDhdID0gY29vcmRzW3BJbmRleCArIDRdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgOV0gPSBjb29yZHNbcEluZGV4ICsgNV07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAxMF0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0XV07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAxMV0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0XSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgOV0gPSBjb2xvcnNbY0luZGV4ICsgM107CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxMF0gPSBjb2xvcnNbY0luZGV4ICsgNF07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxMV0gPSBjb2xvcnNbY0luZGV4ICsgNV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxMl0gPSBjb2xvcnNbY0luZGV4ICsgNl07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxM10gPSBjb2xvcnNbY0luZGV4ICsgN107CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxNF0gPSBjb2xvcnNbY0luZGV4ICsgOF07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxNV0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0XV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxNl0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0XSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTddID0gY29sb3JzTWFwW2NzW29mZnNldF0gKyAyXTsKKyAgICAgICAgICAgICAgcEluZGV4ICs9IDEyOworICAgICAgICAgICAgICBjSW5kZXggKz0gMTg7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAidHJpYW5nbGVzIjoKKyAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBwcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICBjb29yZHNbcEluZGV4XSA9IGNvb3Jkc01hcFtwc1tqXV07CisgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMV0gPSBjb29yZHNNYXBbcHNbal0gKyAxXTsKKyAgICAgICAgICAgIGNvbG9yc1tjSW5kZXhdID0gY29sb3JzTWFwW2NzW2pdXTsKKyAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxXSA9IGNvbG9yc01hcFtjc1tqXSArIDFdOworICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDJdID0gY29sb3JzTWFwW2NzW2pdICsgMl07CisgICAgICAgICAgICBwSW5kZXggKz0gMjsKKyAgICAgICAgICAgIGNJbmRleCArPSAzOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHsKKyAgICAgIGdsLmNsZWFyQ29sb3IoYmFja2dyb3VuZENvbG9yWzBdIC8gMjU1LCBiYWNrZ3JvdW5kQ29sb3JbMV0gLyAyNTUsIGJhY2tncm91bmRDb2xvclsyXSAvIDI1NSwgMS4wKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTsKKyAgICB2YXIgY29vcmRzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGNvb3Jkc0J1ZmZlcik7CisgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGNvb3JkcywgZ2wuU1RBVElDX0RSQVcpOworICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNhY2hlLnBvc2l0aW9uTG9jYXRpb24pOworICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY2FjaGUucG9zaXRpb25Mb2NhdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTsKKyAgICB2YXIgY29sb3JzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGNvbG9yc0J1ZmZlcik7CisgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGNvbG9ycywgZ2wuU1RBVElDX0RSQVcpOworICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNhY2hlLmNvbG9yTG9jYXRpb24pOworICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY2FjaGUuY29sb3JMb2NhdGlvbiwgMywgZ2wuVU5TSUdORURfQllURSwgZmFsc2UsIDAsIDApOworICAgIGdsLnVuaWZvcm0yZihjYWNoZS5zY2FsZUxvY2F0aW9uLCBjb250ZXh0LnNjYWxlWCwgY29udGV4dC5zY2FsZVkpOworICAgIGdsLnVuaWZvcm0yZihjYWNoZS5vZmZzZXRMb2NhdGlvbiwgY29udGV4dC5vZmZzZXRYLCBjb250ZXh0Lm9mZnNldFkpOworICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVTLCAwLCBjb3VudCk7CisgICAgZ2wuZmx1c2goKTsKKyAgICBnbC5kZWxldGVCdWZmZXIoY29vcmRzQnVmZmVyKTsKKyAgICBnbC5kZWxldGVCdWZmZXIoY29sb3JzQnVmZmVyKTsKKyAgICByZXR1cm4gY2FudmFzOworICB9CisKKyAgcmV0dXJuIHsKKyAgICB0cnlJbml0R0woKSB7CisgICAgICB0cnkgeworICAgICAgICBnZW5lcmF0ZUdMKCk7CisgICAgICAgIHJldHVybiAhIWN1cnJlbnRHTDsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7fQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIGNvbXBvc2VTTWFzaywKKyAgICBkcmF3RmlndXJlcywKKworICAgIGNsZWFudXAoKSB7CisgICAgICBpZiAoc21hc2tDYWNoZSAmJiBzbWFza0NhY2hlLmNhbnZhcykgeworICAgICAgICBzbWFza0NhY2hlLmNhbnZhcy53aWR0aCA9IDA7CisgICAgICAgIHNtYXNrQ2FjaGUuY2FudmFzLmhlaWdodCA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChmaWd1cmVzQ2FjaGUgJiYgZmlndXJlc0NhY2hlLmNhbnZhcykgeworICAgICAgICBmaWd1cmVzQ2FjaGUuY2FudmFzLndpZHRoID0gMDsKKyAgICAgICAgZmlndXJlc0NhY2hlLmNhbnZhcy5oZWlnaHQgPSAwOworICAgICAgfQorCisgICAgICBzbWFza0NhY2hlID0gbnVsbDsKKyAgICAgIGZpZ3VyZXNDYWNoZSA9IG51bGw7CisgICAgfQorCisgIH07Cit9KCk7CisKKy8qKiovIH0pLAorLyogMTkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Bbm5vdGF0aW9uTGF5ZXIgPSB2b2lkIDA7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfYW5ub3RhdGlvbl9zdG9yYWdlID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKworY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5IHsKKyAgc3RhdGljIGNyZWF0ZShwYXJhbWV0ZXJzKSB7CisgICAgY29uc3Qgc3VidHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5hbm5vdGF0aW9uVHlwZTsKKworICAgIHN3aXRjaCAoc3VidHlwZSkgeworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LOgorICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5URVhUOgorICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQ6CisgICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5maWVsZFR5cGU7CisKKyAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICBjYXNlICJUeCI6CisgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICAgIGNhc2UgIkJ0biI6CisgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5kYXRhLnJhZGlvQnV0dG9uKSB7CisgICAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy5kYXRhLmNoZWNrQm94KSB7CisgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgICAgICBjYXNlICJDaCI6CisgICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT1BVUDoKKyAgICAgICAgcmV0dXJuIG5ldyBQb3B1cEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkZSRUVURVhUOgorICAgICAgICByZXR1cm4gbmV3IEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuTElORToKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuU1FVQVJFOgorICAgICAgICByZXR1cm4gbmV3IFNxdWFyZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkNJUkNMRToKKyAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT0xZTElORToKKyAgICAgICAgcmV0dXJuIG5ldyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkNBUkVUOgorICAgICAgICByZXR1cm4gbmV3IENhcmV0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuSU5LOgorICAgICAgICByZXR1cm4gbmV3IElua0Fubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlBPTFlHT046CisgICAgICAgIHJldHVybiBuZXcgUG9seWdvbkFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVDoKKyAgICAgICAgcmV0dXJuIG5ldyBIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU6CisgICAgICAgIHJldHVybiBuZXcgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk6CisgICAgICAgIHJldHVybiBuZXcgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ6CisgICAgICAgIHJldHVybiBuZXcgU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RBTVA6CisgICAgICAgIHJldHVybiBuZXcgU3RhbXBBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDoKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworICAgIH0KKyAgfQorCit9CisKK2NsYXNzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlID0gZmFsc2UsIGlnbm9yZUJvcmRlciA9IGZhbHNlKSB7CisgICAgdGhpcy5pc1JlbmRlcmFibGUgPSBpc1JlbmRlcmFibGU7CisgICAgdGhpcy5kYXRhID0gcGFyYW1ldGVycy5kYXRhOworICAgIHRoaXMubGF5ZXIgPSBwYXJhbWV0ZXJzLmxheWVyOworICAgIHRoaXMucGFnZSA9IHBhcmFtZXRlcnMucGFnZTsKKyAgICB0aGlzLnZpZXdwb3J0ID0gcGFyYW1ldGVycy52aWV3cG9ydDsKKyAgICB0aGlzLmxpbmtTZXJ2aWNlID0gcGFyYW1ldGVycy5saW5rU2VydmljZTsKKyAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IHBhcmFtZXRlcnMuZG93bmxvYWRNYW5hZ2VyOworICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gcGFyYW1ldGVycy5pbWFnZVJlc291cmNlc1BhdGg7CisgICAgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOworICAgIHRoaXMuc3ZnRmFjdG9yeSA9IHBhcmFtZXRlcnMuc3ZnRmFjdG9yeTsKKyAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlID0gcGFyYW1ldGVycy5hbm5vdGF0aW9uU3RvcmFnZTsKKworICAgIGlmIChpc1JlbmRlcmFibGUpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5fY3JlYXRlQ29udGFpbmVyKGlnbm9yZUJvcmRlcik7CisgICAgfQorICB9CisKKyAgX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIgPSBmYWxzZSkgeworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEsCisgICAgICAgICAgcGFnZSA9IHRoaXMucGFnZSwKKyAgICAgICAgICB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQ7CisgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIpOworICAgIGxldCB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTsKKyAgICBsZXQgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdOworICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImRhdGEtYW5ub3RhdGlvbi1pZCIsIGRhdGEuaWQpOworCisgICAgY29uc3QgcmVjdCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChbZGF0YS5yZWN0WzBdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbMV0gKyBwYWdlLnZpZXdbMV0sIGRhdGEucmVjdFsyXSwgcGFnZS52aWV3WzNdIC0gZGF0YS5yZWN0WzNdICsgcGFnZS52aWV3WzFdXSk7CisKKyAgICBjb250YWluZXIuc3R5bGUudHJhbnNmb3JtID0gYG1hdHJpeCgke3ZpZXdwb3J0LnRyYW5zZm9ybS5qb2luKCIsIil9KWA7CisgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGAtJHtyZWN0WzBdfXB4IC0ke3JlY3RbMV19cHhgOworCisgICAgaWYgKCFpZ25vcmVCb3JkZXIgJiYgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCA+IDApIHsKKyAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJXaWR0aCA9IGAke2RhdGEuYm9yZGVyU3R5bGUud2lkdGh9cHhgOworCisgICAgICBpZiAoZGF0YS5ib3JkZXJTdHlsZS5zdHlsZSAhPT0gX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkUpIHsKKyAgICAgICAgd2lkdGggPSB3aWR0aCAtIDIgKiBkYXRhLmJvcmRlclN0eWxlLndpZHRoOworICAgICAgICBoZWlnaHQgPSBoZWlnaHQgLSAyICogZGF0YS5ib3JkZXJTdHlsZS53aWR0aDsKKyAgICAgIH0KKworICAgICAgY29uc3QgaG9yaXpvbnRhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUuaG9yaXpvbnRhbENvcm5lclJhZGl1czsKKyAgICAgIGNvbnN0IHZlcnRpY2FsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS52ZXJ0aWNhbENvcm5lclJhZGl1czsKKworICAgICAgaWYgKGhvcml6b250YWxSYWRpdXMgPiAwIHx8IHZlcnRpY2FsUmFkaXVzID4gMCkgeworICAgICAgICBjb25zdCByYWRpdXMgPSBgJHtob3Jpem9udGFsUmFkaXVzfXB4IC8gJHt2ZXJ0aWNhbFJhZGl1c31weGA7CisgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJSYWRpdXMgPSByYWRpdXM7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZGF0YS5ib3JkZXJTdHlsZS5zdHlsZSkgeworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ6CisgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclN0eWxlID0gInNvbGlkIjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuREFTSEVEOgorICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJTdHlsZSA9ICJkYXNoZWQiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEOgorICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGJldmVsZWQiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ6CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogaW5zZXQiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOgorICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJCb3R0b21TdHlsZSA9ICJzb2xpZCI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGRhdGEuY29sb3IpIHsKKyAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlckNvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKGRhdGEuY29sb3JbMF0gfCAwLCBkYXRhLmNvbG9yWzFdIHwgMCwgZGF0YS5jb2xvclsyXSB8IDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlcldpZHRoID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IGAke3JlY3RbMF19cHhgOworICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHtyZWN0WzFdfXB4YDsKKyAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7CisgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7CisgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAgfQorCisgIF9jcmVhdGVQb3B1cChjb250YWluZXIsIHRyaWdnZXIsIGRhdGEpIHsKKyAgICBpZiAoIXRyaWdnZXIpIHsKKyAgICAgIHRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgIHRyaWdnZXIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyLnN0eWxlLmhlaWdodDsKKyAgICAgIHRyaWdnZXIuc3R5bGUud2lkdGggPSBjb250YWluZXIuc3R5bGUud2lkdGg7CisgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodHJpZ2dlcik7CisgICAgfQorCisgICAgY29uc3QgcG9wdXBFbGVtZW50ID0gbmV3IFBvcHVwRWxlbWVudCh7CisgICAgICBjb250YWluZXIsCisgICAgICB0cmlnZ2VyLAorICAgICAgY29sb3I6IGRhdGEuY29sb3IsCisgICAgICB0aXRsZTogZGF0YS50aXRsZSwKKyAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IGRhdGEubW9kaWZpY2F0aW9uRGF0ZSwKKyAgICAgIGNvbnRlbnRzOiBkYXRhLmNvbnRlbnRzLAorICAgICAgaGlkZVdyYXBwZXI6IHRydWUKKyAgICB9KTsKKyAgICBjb25zdCBwb3B1cCA9IHBvcHVwRWxlbWVudC5yZW5kZXIoKTsKKyAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gY29udGFpbmVyLnN0eWxlLndpZHRoOworICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwb3B1cCk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBBbm5vdGF0aW9uRWxlbWVudC5yZW5kZXJgIGNhbGxlZCIpOworICB9CisKK30KKworY2xhc3MgTGlua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLnVybCB8fCBwYXJhbWV0ZXJzLmRhdGEuZGVzdCB8fCBwYXJhbWV0ZXJzLmRhdGEuYWN0aW9uKTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJsaW5rQW5ub3RhdGlvbiI7CisgICAgY29uc3QgeworICAgICAgZGF0YSwKKyAgICAgIGxpbmtTZXJ2aWNlCisgICAgfSA9IHRoaXM7CisgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKworICAgIGlmIChkYXRhLnVybCkgeworICAgICAgKDAsIF9kaXNwbGF5X3V0aWxzLmFkZExpbmtBdHRyaWJ1dGVzKShsaW5rLCB7CisgICAgICAgIHVybDogZGF0YS51cmwsCisgICAgICAgIHRhcmdldDogZGF0YS5uZXdXaW5kb3cgPyBfZGlzcGxheV91dGlscy5MaW5rVGFyZ2V0LkJMQU5LIDogbGlua1NlcnZpY2UuZXh0ZXJuYWxMaW5rVGFyZ2V0LAorICAgICAgICByZWw6IGxpbmtTZXJ2aWNlLmV4dGVybmFsTGlua1JlbCwKKyAgICAgICAgZW5hYmxlZDogbGlua1NlcnZpY2UuZXh0ZXJuYWxMaW5rRW5hYmxlZAorICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChkYXRhLmFjdGlvbikgeworICAgICAgdGhpcy5fYmluZE5hbWVkQWN0aW9uKGxpbmssIGRhdGEuYWN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fYmluZExpbmsobGluaywgZGF0YS5kZXN0KTsKKyAgICB9CisKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rKTsKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworICBfYmluZExpbmsobGluaywgZGVzdGluYXRpb24pIHsKKyAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldERlc3RpbmF0aW9uSGFzaChkZXN0aW5hdGlvbik7CisKKyAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7CisgICAgICBpZiAoZGVzdGluYXRpb24pIHsKKyAgICAgICAgdGhpcy5saW5rU2VydmljZS5uYXZpZ2F0ZVRvKGRlc3RpbmF0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisKKyAgICBpZiAoZGVzdGluYXRpb24pIHsKKyAgICAgIGxpbmsuY2xhc3NOYW1lID0gImludGVybmFsTGluayI7CisgICAgfQorICB9CisKKyAgX2JpbmROYW1lZEFjdGlvbihsaW5rLCBhY3Rpb24pIHsKKyAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybCgiIik7CisKKyAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7CisgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisKKyAgICBsaW5rLmNsYXNzTmFtZSA9ICJpbnRlcm5hbExpbmsiOworICB9CisKK30KKworY2xhc3MgVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gInRleHRBbm5vdGF0aW9uIjsKKyAgICBjb25zdCBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOworICAgIGltYWdlLnN0eWxlLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodDsKKyAgICBpbWFnZS5zdHlsZS53aWR0aCA9IHRoaXMuY29udGFpbmVyLnN0eWxlLndpZHRoOworICAgIGltYWdlLnNyYyA9IHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoICsgImFubm90YXRpb24tIiArIHRoaXMuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgKyAiLnN2ZyI7CisgICAgaW1hZ2UuYWx0ID0gIlt7e3R5cGV9fSBBbm5vdGF0aW9uXSI7CisgICAgaW1hZ2UuZGF0YXNldC5sMTBuSWQgPSAidGV4dF9hbm5vdGF0aW9uX3R5cGUiOworICAgIGltYWdlLmRhdGFzZXQubDEwbkFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7CisgICAgICB0eXBlOiB0aGlzLmRhdGEubmFtZQorICAgIH0pOworCisgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBpbWFnZSwgdGhpcy5kYXRhKTsKKyAgICB9CisKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChpbWFnZSk7CisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIHJlbmRlcigpIHsKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgfHwgIXBhcmFtZXRlcnMuZGF0YS5oYXNBcHBlYXJhbmNlICYmICEhcGFyYW1ldGVycy5kYXRhLmZpZWxkVmFsdWU7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICBjb25zdCBURVhUX0FMSUdOTUVOVCA9IFsibGVmdCIsICJjZW50ZXIiLCAicmlnaHQiXTsKKyAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTsKKyAgICBjb25zdCBpZCA9IHRoaXMuZGF0YS5pZDsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAidGV4dFdpZGdldEFubm90YXRpb24iOworICAgIGxldCBlbGVtZW50ID0gbnVsbDsKKworICAgIGlmICh0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpIHsKKyAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gc3RvcmFnZS5nZXRPckNyZWF0ZVZhbHVlKGlkLCB0aGlzLmRhdGEuZmllbGRWYWx1ZSk7CisKKyAgICAgIGlmICh0aGlzLmRhdGEubXVsdGlMaW5lKSB7CisgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOworICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgICAgICAgZWxlbWVudC50eXBlID0gInRleHQiOworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCB0ZXh0Q29udGVudCk7CisgICAgICB9CisKKyAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwgZXZlbnQudGFyZ2V0LnZhbHVlKTsKKyAgICAgIH0pOworICAgICAgZWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGF0YS5yZWFkT25seTsKKyAgICAgIGVsZW1lbnQubmFtZSA9IHRoaXMuZGF0YS5maWVsZE5hbWU7CisKKyAgICAgIGlmICh0aGlzLmRhdGEubWF4TGVuICE9PSBudWxsKSB7CisgICAgICAgIGVsZW1lbnQubWF4TGVuZ3RoID0gdGhpcy5kYXRhLm1heExlbjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuZGF0YS5jb21iKSB7CisgICAgICAgIGNvbnN0IGZpZWxkV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdOworICAgICAgICBjb25zdCBjb21iV2lkdGggPSBmaWVsZFdpZHRoIC8gdGhpcy5kYXRhLm1heExlbjsKKyAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjb21iIik7CisgICAgICAgIGVsZW1lbnQuc3R5bGUubGV0dGVyU3BhY2luZyA9IGBjYWxjKCR7Y29tYldpZHRofXB4IC0gMWNoKWA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZTsKKyAgICAgIGVsZW1lbnQuc3R5bGUudmVydGljYWxBbGlnbiA9ICJtaWRkbGUiOworICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gInRhYmxlLWNlbGwiOworICAgICAgbGV0IGZvbnQgPSBudWxsOworCisgICAgICBpZiAodGhpcy5kYXRhLmZvbnRSZWZOYW1lICYmIHRoaXMucGFnZS5jb21tb25PYmpzLmhhcyh0aGlzLmRhdGEuZm9udFJlZk5hbWUpKSB7CisgICAgICAgIGZvbnQgPSB0aGlzLnBhZ2UuY29tbW9uT2Jqcy5nZXQodGhpcy5kYXRhLmZvbnRSZWZOYW1lKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fc2V0VGV4dFN0eWxlKGVsZW1lbnQsIGZvbnQpOworICAgIH0KKworICAgIGlmICh0aGlzLmRhdGEudGV4dEFsaWdubWVudCAhPT0gbnVsbCkgeworICAgICAgZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSBURVhUX0FMSUdOTUVOVFt0aGlzLmRhdGEudGV4dEFsaWdubWVudF07CisgICAgfQorCisgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKKyAgX3NldFRleHRTdHlsZShlbGVtZW50LCBmb250KSB7CisgICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50LnN0eWxlOworICAgIHN0eWxlLmZvbnRTaXplID0gYCR7dGhpcy5kYXRhLmZvbnRTaXplfXB4YDsKKyAgICBzdHlsZS5kaXJlY3Rpb24gPSB0aGlzLmRhdGEuZm9udERpcmVjdGlvbiA8IDAgPyAicnRsIiA6ICJsdHIiOworCisgICAgaWYgKCFmb250KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IGJvbGQgPSAibm9ybWFsIjsKKworICAgIGlmIChmb250LmJsYWNrKSB7CisgICAgICBib2xkID0gIjkwMCI7CisgICAgfSBlbHNlIGlmIChmb250LmJvbGQpIHsKKyAgICAgIGJvbGQgPSAiYm9sZCI7CisgICAgfQorCisgICAgc3R5bGUuZm9udFdlaWdodCA9IGJvbGQ7CisgICAgc3R5bGUuZm9udFN0eWxlID0gZm9udC5pdGFsaWMgPyAiaXRhbGljIiA6ICJub3JtYWwiOworICAgIGNvbnN0IGZvbnRGYW1pbHkgPSBmb250LmxvYWRlZE5hbWUgPyBgIiR7Zm9udC5sb2FkZWROYW1lfSIsIGAgOiAiIjsKKyAgICBjb25zdCBmYWxsYmFja05hbWUgPSBmb250LmZhbGxiYWNrTmFtZSB8fCAiSGVsdmV0aWNhLCBzYW5zLXNlcmlmIjsKKyAgICBzdHlsZS5mb250RmFtaWx5ID0gZm9udEZhbWlseSArIGZhbGxiYWNrTmFtZTsKKyAgfQorCit9CisKK2NsYXNzIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlOworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgY29uc3QgaWQgPSBkYXRhLmlkOworICAgIGNvbnN0IHZhbHVlID0gc3RvcmFnZS5nZXRPckNyZWF0ZVZhbHVlKGlkLCBkYXRhLmZpZWxkVmFsdWUgJiYgZGF0YS5maWVsZFZhbHVlICE9PSAiT2ZmIik7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImJ1dHRvbldpZGdldEFubm90YXRpb24gY2hlY2tCb3giOworICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOworICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5OworICAgIGVsZW1lbnQudHlwZSA9ICJjaGVja2JveCI7CisgICAgZWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTsKKworICAgIGlmICh2YWx1ZSkgeworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCB0cnVlKTsKKyAgICB9CisKKyAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwgZXZlbnQudGFyZ2V0LmNoZWNrZWQpOworICAgIH0pOworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpOworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJidXR0b25XaWRnZXRBbm5vdGF0aW9uIHJhZGlvQnV0dG9uIjsKKyAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTsKKyAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOworICAgIGNvbnN0IGlkID0gZGF0YS5pZDsKKyAgICBjb25zdCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0T3JDcmVhdGVWYWx1ZShpZCwgZGF0YS5maWVsZFZhbHVlID09PSBkYXRhLmJ1dHRvblZhbHVlKTsKKyAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgICBlbGVtZW50LmRpc2FibGVkID0gZGF0YS5yZWFkT25seTsKKyAgICBlbGVtZW50LnR5cGUgPSAicmFkaW8iOworICAgIGVsZW1lbnQubmFtZSA9IGRhdGEuZmllbGROYW1lOworCisgICAgaWYgKHZhbHVlKSB7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIHRydWUpOworICAgIH0KKworICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICBjb25zdCBuYW1lID0gZXZlbnQudGFyZ2V0Lm5hbWU7CisKKyAgICAgIGZvciAoY29uc3QgcmFkaW8gb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUobmFtZSkpIHsKKyAgICAgICAgaWYgKHJhZGlvICE9PSBldmVudC50YXJnZXQpIHsKKyAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFubm90YXRpb24taWQiKSwgZmFsc2UpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIGV2ZW50LnRhcmdldC5jaGVja2VkKTsKKyAgICB9KTsKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTsKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQgeworICByZW5kZXIoKSB7CisgICAgY29uc3QgY29udGFpbmVyID0gc3VwZXIucmVuZGVyKCk7CisgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9ICJidXR0b25XaWRnZXRBbm5vdGF0aW9uIHB1c2hCdXR0b24iOworICAgIHJldHVybiBjb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImNob2ljZVdpZGdldEFubm90YXRpb24iOworICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlOworICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhLmlkOworICAgIHN0b3JhZ2UuZ2V0T3JDcmVhdGVWYWx1ZShpZCwgdGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoID4gMCA/IHRoaXMuZGF0YS5maWVsZFZhbHVlWzBdIDogbnVsbCk7CisgICAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOworICAgIHNlbGVjdEVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7CisgICAgc2VsZWN0RWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTsKKworICAgIGlmICghdGhpcy5kYXRhLmNvbWJvKSB7CisgICAgICBzZWxlY3RFbGVtZW50LnNpemUgPSB0aGlzLmRhdGEub3B0aW9ucy5sZW5ndGg7CisKKyAgICAgIGlmICh0aGlzLmRhdGEubXVsdGlTZWxlY3QpIHsKKyAgICAgICAgc2VsZWN0RWxlbWVudC5tdWx0aXBsZSA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5kYXRhLm9wdGlvbnMpIHsKKyAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsKKyAgICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb24uZGlzcGxheVZhbHVlOworICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IG9wdGlvbi5leHBvcnRWYWx1ZTsKKworICAgICAgaWYgKHRoaXMuZGF0YS5maWVsZFZhbHVlLmluY2x1ZGVzKG9wdGlvbi5leHBvcnRWYWx1ZSkpIHsKKyAgICAgICAgb3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwgdHJ1ZSk7CisgICAgICB9CisKKyAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7CisgICAgfQorCisgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgY29uc3Qgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zOworICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdGlvbnMuc2VsZWN0ZWRJbmRleF0udmFsdWU7CisgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB2YWx1ZSk7CisgICAgfSk7CisgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoc2VsZWN0RWxlbWVudCk7CisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgY29uc3QgSUdOT1JFX1RZUEVTID0gWyJMaW5lIiwgIlNxdWFyZSIsICJDaXJjbGUiLCAiUG9seUxpbmUiLCAiUG9seWdvbiIsICJJbmsiXTsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAicG9wdXBBbm5vdGF0aW9uIjsKKworICAgIGlmIChJR05PUkVfVFlQRVMuaW5jbHVkZXModGhpcy5kYXRhLnBhcmVudFR5cGUpKSB7CisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorCisgICAgY29uc3Qgc2VsZWN0b3IgPSBgW2RhdGEtYW5ub3RhdGlvbi1pZD0iJHt0aGlzLmRhdGEucGFyZW50SWR9Il1gOworICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLmxheWVyLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOworCisgICAgaWYgKCFwYXJlbnRFbGVtZW50KSB7CisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorCisgICAgY29uc3QgcG9wdXAgPSBuZXcgUG9wdXBFbGVtZW50KHsKKyAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIsCisgICAgICB0cmlnZ2VyOiBwYXJlbnRFbGVtZW50LAorICAgICAgY29sb3I6IHRoaXMuZGF0YS5jb2xvciwKKyAgICAgIHRpdGxlOiB0aGlzLmRhdGEudGl0bGUsCisgICAgICBtb2RpZmljYXRpb25EYXRlOiB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSwKKyAgICAgIGNvbnRlbnRzOiB0aGlzLmRhdGEuY29udGVudHMKKyAgICB9KTsKKyAgICBjb25zdCBwYXJlbnRMZWZ0ID0gcGFyc2VGbG9hdChwYXJlbnRFbGVtZW50LnN0eWxlLmxlZnQpOworICAgIGNvbnN0IHBhcmVudFdpZHRoID0gcGFyc2VGbG9hdChwYXJlbnRFbGVtZW50LnN0eWxlLndpZHRoKTsKKyAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSBgLSR7cGFyZW50TGVmdCArIHBhcmVudFdpZHRofXB4IC0ke3BhcmVudEVsZW1lbnQuc3R5bGUudG9wfWA7CisgICAgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IGAke3BhcmVudExlZnQgKyBwYXJlbnRXaWR0aH1weGA7CisgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQocG9wdXAucmVuZGVyKCkpOworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIFBvcHVwRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICB0aGlzLmNvbnRhaW5lciA9IHBhcmFtZXRlcnMuY29udGFpbmVyOworICAgIHRoaXMudHJpZ2dlciA9IHBhcmFtZXRlcnMudHJpZ2dlcjsKKyAgICB0aGlzLmNvbG9yID0gcGFyYW1ldGVycy5jb2xvcjsKKyAgICB0aGlzLnRpdGxlID0gcGFyYW1ldGVycy50aXRsZTsKKyAgICB0aGlzLm1vZGlmaWNhdGlvbkRhdGUgPSBwYXJhbWV0ZXJzLm1vZGlmaWNhdGlvbkRhdGU7CisgICAgdGhpcy5jb250ZW50cyA9IHBhcmFtZXRlcnMuY29udGVudHM7CisgICAgdGhpcy5oaWRlV3JhcHBlciA9IHBhcmFtZXRlcnMuaGlkZVdyYXBwZXIgfHwgZmFsc2U7CisgICAgdGhpcy5waW5uZWQgPSBmYWxzZTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICBjb25zdCBCQUNLR1JPVU5EX0VOTElHSFQgPSAwLjc7CisgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHdyYXBwZXIuY2xhc3NOYW1lID0gInBvcHVwV3JhcHBlciI7CisgICAgdGhpcy5oaWRlRWxlbWVudCA9IHRoaXMuaGlkZVdyYXBwZXIgPyB3cmFwcGVyIDogdGhpcy5jb250YWluZXI7CisgICAgdGhpcy5oaWRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsIHRydWUpOworICAgIGNvbnN0IHBvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgcG9wdXAuY2xhc3NOYW1lID0gInBvcHVwIjsKKyAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3I7CisKKyAgICBpZiAoY29sb3IpIHsKKyAgICAgIGNvbnN0IHIgPSBCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gY29sb3JbMF0pICsgY29sb3JbMF07CisgICAgICBjb25zdCBnID0gQkFDS0dST1VORF9FTkxJR0hUICogKDI1NSAtIGNvbG9yWzFdKSArIGNvbG9yWzFdOworICAgICAgY29uc3QgYiA9IEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjb2xvclsyXSkgKyBjb2xvclsyXTsKKyAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyIHwgMCwgZyB8IDAsIGIgfCAwKTsKKyAgICB9CisKKyAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImgxIik7CisgICAgdGl0bGUudGV4dENvbnRlbnQgPSB0aGlzLnRpdGxlOworICAgIHBvcHVwLmFwcGVuZENoaWxkKHRpdGxlKTsKKworICAgIGNvbnN0IGRhdGVPYmplY3QgPSBfZGlzcGxheV91dGlscy5QREZEYXRlU3RyaW5nLnRvRGF0ZU9iamVjdCh0aGlzLm1vZGlmaWNhdGlvbkRhdGUpOworCisgICAgaWYgKGRhdGVPYmplY3QpIHsKKyAgICAgIGNvbnN0IG1vZGlmaWNhdGlvbkRhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CisgICAgICBtb2RpZmljYXRpb25EYXRlLnRleHRDb250ZW50ID0gInt7ZGF0ZX19LCB7e3RpbWV9fSI7CisgICAgICBtb2RpZmljYXRpb25EYXRlLmRhdGFzZXQubDEwbklkID0gImFubm90YXRpb25fZGF0ZV9zdHJpbmciOworICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5kYXRhc2V0LmwxMG5BcmdzID0gSlNPTi5zdHJpbmdpZnkoeworICAgICAgICBkYXRlOiBkYXRlT2JqZWN0LnRvTG9jYWxlRGF0ZVN0cmluZygpLAorICAgICAgICB0aW1lOiBkYXRlT2JqZWN0LnRvTG9jYWxlVGltZVN0cmluZygpCisgICAgICB9KTsKKyAgICAgIHBvcHVwLmFwcGVuZENoaWxkKG1vZGlmaWNhdGlvbkRhdGUpOworICAgIH0KKworICAgIGNvbnN0IGNvbnRlbnRzID0gdGhpcy5fZm9ybWF0Q29udGVudHModGhpcy5jb250ZW50cyk7CisKKyAgICBwb3B1cC5hcHBlbmRDaGlsZChjb250ZW50cyk7CisgICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5fdG9nZ2xlLmJpbmQodGhpcykpOworICAgIHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCB0aGlzLl9zaG93LmJpbmQodGhpcywgZmFsc2UpKTsKKyAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCB0aGlzLl9oaWRlLmJpbmQodGhpcywgZmFsc2UpKTsKKyAgICBwb3B1cC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuX2hpZGUuYmluZCh0aGlzLCB0cnVlKSk7CisgICAgd3JhcHBlci5hcHBlbmRDaGlsZChwb3B1cCk7CisgICAgcmV0dXJuIHdyYXBwZXI7CisgIH0KKworICBfZm9ybWF0Q29udGVudHMoY29udGVudHMpIHsKKyAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOworICAgIGNvbnN0IGxpbmVzID0gY29udGVudHMuc3BsaXQoLyg/OlxyXG4/fFxuKS8pOworCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldOworICAgICAgcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSk7CisKKyAgICAgIGlmIChpIDwgaWkgLSAxKSB7CisgICAgICAgIHAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHA7CisgIH0KKworICBfdG9nZ2xlKCkgeworICAgIGlmICh0aGlzLnBpbm5lZCkgeworICAgICAgdGhpcy5faGlkZSh0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fc2hvdyh0cnVlKTsKKyAgICB9CisgIH0KKworICBfc2hvdyhwaW4gPSBmYWxzZSkgeworICAgIGlmIChwaW4pIHsKKyAgICAgIHRoaXMucGlubmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5oaWRlRWxlbWVudC5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpKSB7CisgICAgICB0aGlzLmhpZGVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIik7CisgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggKz0gMTsKKyAgICB9CisgIH0KKworICBfaGlkZSh1bnBpbiA9IHRydWUpIHsKKyAgICBpZiAodW5waW4pIHsKKyAgICAgIHRoaXMucGlubmVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCF0aGlzLmhpZGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiaGlkZGVuIikgJiYgIXRoaXMucGlubmVkKSB7CisgICAgICB0aGlzLmhpZGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgdHJ1ZSk7CisgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggLT0gMTsKKyAgICB9CisgIH0KKworfQorCitjbGFzcyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImZyZWVUZXh0QW5ub3RhdGlvbiI7CisKKyAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgTGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImxpbmVBbm5vdGF0aW9uIjsKKyAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOworICAgIGNvbnN0IHdpZHRoID0gZGF0YS5yZWN0WzJdIC0gZGF0YS5yZWN0WzBdOworICAgIGNvbnN0IGhlaWdodCA9IGRhdGEucmVjdFszXSAtIGRhdGEucmVjdFsxXTsKKyAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpOworICAgIGNvbnN0IGxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmxpbmUiKTsKKyAgICBsaW5lLnNldEF0dHJpYnV0ZSgieDEiLCBkYXRhLnJlY3RbMl0gLSBkYXRhLmxpbmVDb29yZGluYXRlc1swXSk7CisgICAgbGluZS5zZXRBdHRyaWJ1dGUoInkxIiwgZGF0YS5yZWN0WzNdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0pOworICAgIGxpbmUuc2V0QXR0cmlidXRlKCJ4MiIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzJdKTsKKyAgICBsaW5lLnNldEF0dHJpYnV0ZSgieTIiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1szXSk7CisgICAgbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7CisgICAgbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsICJ0cmFuc3BhcmVudCIpOworICAgIHN2Zy5hcHBlbmRDaGlsZChsaW5lKTsKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTsKKworICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBsaW5lLCBkYXRhKTsKKworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIFNxdWFyZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gInNxdWFyZUFubm90YXRpb24iOworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07CisgICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdOworICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7CisgICAgY29uc3QgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoOworICAgIGNvbnN0IHNxdWFyZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoIngiLCBib3JkZXJXaWR0aCAvIDIpOworICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoInkiLCBib3JkZXJXaWR0aCAvIDIpOworICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGggLSBib3JkZXJXaWR0aCk7CisgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgaGVpZ2h0IC0gYm9yZGVyV2lkdGgpOworICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsIGJvcmRlcldpZHRoIHx8IDEpOworICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsICJ0cmFuc3BhcmVudCIpOworICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOworICAgIHN2Zy5hcHBlbmRDaGlsZChzcXVhcmUpOworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpOworCisgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIHNxdWFyZSwgZGF0YSk7CisKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJjaXJjbGVBbm5vdGF0aW9uIjsKKyAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOworICAgIGNvbnN0IHdpZHRoID0gZGF0YS5yZWN0WzJdIC0gZGF0YS5yZWN0WzBdOworICAgIGNvbnN0IGhlaWdodCA9IGRhdGEucmVjdFszXSAtIGRhdGEucmVjdFsxXTsKKyAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpOworICAgIGNvbnN0IGJvcmRlcldpZHRoID0gZGF0YS5ib3JkZXJTdHlsZS53aWR0aDsKKyAgICBjb25zdCBjaXJjbGUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmVsbGlwc2UiKTsKKyAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCJjeCIsIHdpZHRoIC8gMik7CisgICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgiY3kiLCBoZWlnaHQgLyAyKTsKKyAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCJyeCIsIHdpZHRoIC8gMiAtIGJvcmRlcldpZHRoIC8gMik7CisgICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgicnkiLCBoZWlnaHQgLyAyIC0gYm9yZGVyV2lkdGggLyAyKTsKKyAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCBib3JkZXJXaWR0aCB8fCAxKTsKKyAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCJzdHJva2UiLCAidHJhbnNwYXJlbnQiKTsKKyAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCJmaWxsIiwgIm5vbmUiKTsKKyAgICBzdmcuYXBwZW5kQ2hpbGQoY2lyY2xlKTsKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTsKKworICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBjaXJjbGUsIGRhdGEpOworCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gInBvbHlsaW5lQW5ub3RhdGlvbiI7CisgICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9ICJzdmc6cG9seWxpbmUiOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lOworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07CisgICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdOworICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7CisgICAgbGV0IHBvaW50cyA9IFtdOworCisgICAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGRhdGEudmVydGljZXMpIHsKKyAgICAgIGNvbnN0IHggPSBjb29yZGluYXRlLnggLSBkYXRhLnJlY3RbMF07CisgICAgICBjb25zdCB5ID0gZGF0YS5yZWN0WzNdIC0gY29vcmRpbmF0ZS55OworICAgICAgcG9pbnRzLnB1c2goeCArICIsIiArIHkpOworICAgIH0KKworICAgIHBvaW50cyA9IHBvaW50cy5qb2luKCIgIik7CisgICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTsKKyAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoInBvaW50cyIsIHBvaW50cyk7CisgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpOworICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgInRyYW5zcGFyZW50Iik7CisgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKCJmaWxsIiwgIm5vbmUiKTsKKyAgICBzdmcuYXBwZW5kQ2hpbGQocG9seWxpbmUpOworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpOworCisgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIHBvbHlsaW5lLCBkYXRhKTsKKworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSAicG9seWdvbkFubm90YXRpb24iOworICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSAic3ZnOnBvbHlnb24iOworICB9CisKK30KKworY2xhc3MgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJjYXJldEFubm90YXRpb24iOworCisgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIElua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSAiaW5rQW5ub3RhdGlvbiI7CisgICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9ICJzdmc6cG9seWxpbmUiOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lOworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07CisgICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdOworICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7CisKKyAgICBmb3IgKGNvbnN0IGlua0xpc3Qgb2YgZGF0YS5pbmtMaXN0cykgeworICAgICAgbGV0IHBvaW50cyA9IFtdOworCisgICAgICBmb3IgKGNvbnN0IGNvb3JkaW5hdGUgb2YgaW5rTGlzdCkgeworICAgICAgICBjb25zdCB4ID0gY29vcmRpbmF0ZS54IC0gZGF0YS5yZWN0WzBdOworICAgICAgICBjb25zdCB5ID0gZGF0YS5yZWN0WzNdIC0gY29vcmRpbmF0ZS55OworICAgICAgICBwb2ludHMucHVzaChgJHt4fSwke3l9YCk7CisgICAgICB9CisKKyAgICAgIHBvaW50cyA9IHBvaW50cy5qb2luKCIgIik7CisgICAgICBjb25zdCBwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpOworICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKCJwb2ludHMiLCBwb2ludHMpOworICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpOworICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2UiLCAidHJhbnNwYXJlbnQiKTsKKyAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJub25lIik7CisKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBwb2x5bGluZSwgZGF0YSk7CisKKyAgICAgIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZSk7CisgICAgfQorCisgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7CisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAiaGlnaGxpZ2h0QW5ub3RhdGlvbiI7CisKKyAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAidW5kZXJsaW5lQW5ub3RhdGlvbiI7CisKKyAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJzcXVpZ2dseUFubm90YXRpb24iOworCisgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gInN0cmlrZW91dEFubm90YXRpb24iOworCisgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAic3RhbXBBbm5vdGF0aW9uIjsKKworICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7CisgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycywgdHJ1ZSk7CisgICAgY29uc3QgeworICAgICAgZmlsZW5hbWUsCisgICAgICBjb250ZW50CisgICAgfSA9IHRoaXMuZGF0YS5maWxlOworICAgIHRoaXMuZmlsZW5hbWUgPSAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0RmlsZW5hbWVGcm9tVXJsKShmaWxlbmFtZSk7CisgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKKworICAgIGlmICh0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSB7CisgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzLmRpc3BhdGNoKCJmaWxlYXR0YWNobWVudGFubm90YXRpb24iLCB7CisgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgaWQ6ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZmlsZW5hbWUpLAorICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgY29udGVudAorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJmaWxlQXR0YWNobWVudEFubm90YXRpb24iOworICAgIGNvbnN0IHRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICB0cmlnZ2VyLnN0eWxlLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodDsKKyAgICB0cmlnZ2VyLnN0eWxlLndpZHRoID0gdGhpcy5jb250YWluZXIuc3R5bGUud2lkdGg7CisgICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIHRoaXMuX2Rvd25sb2FkLmJpbmQodGhpcykpOworCisgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXAgJiYgKHRoaXMuZGF0YS50aXRsZSB8fCB0aGlzLmRhdGEuY29udGVudHMpKSB7CisgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgdHJpZ2dlciwgdGhpcy5kYXRhKTsKKyAgICB9CisKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0cmlnZ2VyKTsKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworICBfZG93bmxvYWQoKSB7CisgICAgaWYgKCF0aGlzLmRvd25sb2FkTWFuYWdlcikgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJEb3dubG9hZCBjYW5ub3QgYmUgc3RhcnRlZCBkdWUgdG8gdW5hdmFpbGFibGUgZG93bmxvYWQgbWFuYWdlciIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyLmRvd25sb2FkRGF0YSh0aGlzLmNvbnRlbnQsIHRoaXMuZmlsZW5hbWUsICIiKTsKKyAgfQorCit9CisKK2NsYXNzIEFubm90YXRpb25MYXllciB7CisgIHN0YXRpYyByZW5kZXIocGFyYW1ldGVycykgeworICAgIGNvbnN0IHNvcnRlZEFubm90YXRpb25zID0gW10sCisgICAgICAgICAgcG9wdXBBbm5vdGF0aW9ucyA9IFtdOworCisgICAgZm9yIChjb25zdCBkYXRhIG9mIHBhcmFtZXRlcnMuYW5ub3RhdGlvbnMpIHsKKyAgICAgIGlmICghZGF0YSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGRhdGEuYW5ub3RhdGlvblR5cGUgPT09IF91dGlsLkFubm90YXRpb25UeXBlLlBPUFVQKSB7CisgICAgICAgIHBvcHVwQW5ub3RhdGlvbnMucHVzaChkYXRhKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goZGF0YSk7CisgICAgfQorCisgICAgaWYgKHBvcHVwQW5ub3RhdGlvbnMubGVuZ3RoKSB7CisgICAgICBzb3J0ZWRBbm5vdGF0aW9ucy5wdXNoKC4uLnBvcHVwQW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIGZvciAoY29uc3QgZGF0YSBvZiBzb3J0ZWRBbm5vdGF0aW9ucykgeworICAgICAgY29uc3QgZWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUoeworICAgICAgICBkYXRhLAorICAgICAgICBsYXllcjogcGFyYW1ldGVycy5kaXYsCisgICAgICAgIHBhZ2U6IHBhcmFtZXRlcnMucGFnZSwKKyAgICAgICAgdmlld3BvcnQ6IHBhcmFtZXRlcnMudmlld3BvcnQsCisgICAgICAgIGxpbmtTZXJ2aWNlOiBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlLAorICAgICAgICBkb3dubG9hZE1hbmFnZXI6IHBhcmFtZXRlcnMuZG93bmxvYWRNYW5hZ2VyLAorICAgICAgICBpbWFnZVJlc291cmNlc1BhdGg6IHBhcmFtZXRlcnMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8ICIiLAorICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiB0eXBlb2YgcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID09PSAiYm9vbGVhbiIgPyBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgOiB0cnVlLAorICAgICAgICBzdmdGYWN0b3J5OiBuZXcgX2Rpc3BsYXlfdXRpbHMuRE9NU1ZHRmFjdG9yeSgpLAorICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogcGFyYW1ldGVycy5hbm5vdGF0aW9uU3RvcmFnZSB8fCBuZXcgX2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSgpCisgICAgICB9KTsKKworICAgICAgaWYgKGVsZW1lbnQuaXNSZW5kZXJhYmxlKSB7CisgICAgICAgIHBhcmFtZXRlcnMuZGl2LmFwcGVuZENoaWxkKGVsZW1lbnQucmVuZGVyKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyB1cGRhdGUocGFyYW1ldGVycykgeworICAgIGZvciAoY29uc3QgZGF0YSBvZiBwYXJhbWV0ZXJzLmFubm90YXRpb25zKSB7CisgICAgICBjb25zdCBlbGVtZW50ID0gcGFyYW1ldGVycy5kaXYucXVlcnlTZWxlY3RvcihgW2RhdGEtYW5ub3RhdGlvbi1pZD0iJHtkYXRhLmlkfSJdYCk7CisKKyAgICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYG1hdHJpeCgke3BhcmFtZXRlcnMudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oIiwiKX0pYDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwYXJhbWV0ZXJzLmRpdi5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpOworICB9CisKK30KKworZXhwb3J0cy5Bbm5vdGF0aW9uTGF5ZXIgPSBBbm5vdGF0aW9uTGF5ZXI7CisKKy8qKiovIH0pLAorLyogMjAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5yZW5kZXJUZXh0TGF5ZXIgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciByZW5kZXJUZXh0TGF5ZXIgPSBmdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXJDbG9zdXJlKCkgeworICB2YXIgTUFYX1RFWFRfRElWU19UT19SRU5ERVIgPSAxMDAwMDA7CisgIHZhciBOb25XaGl0ZXNwYWNlUmVnZXhwID0gL1xTLzsKKworICBmdW5jdGlvbiBpc0FsbFdoaXRlc3BhY2Uoc3RyKSB7CisgICAgcmV0dXJuICFOb25XaGl0ZXNwYWNlUmVnZXhwLnRlc3Qoc3RyKTsKKyAgfQorCisgIGZ1bmN0aW9uIGFwcGVuZFRleHQodGFzaywgZ2VvbSwgc3R5bGVzKSB7CisgICAgdmFyIHRleHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CisgICAgdmFyIHRleHREaXZQcm9wZXJ0aWVzID0geworICAgICAgYW5nbGU6IDAsCisgICAgICBjYW52YXNXaWR0aDogMCwKKyAgICAgIGlzV2hpdGVzcGFjZTogZmFsc2UsCisgICAgICBvcmlnaW5hbFRyYW5zZm9ybTogbnVsbCwKKyAgICAgIHBhZGRpbmdCb3R0b206IDAsCisgICAgICBwYWRkaW5nTGVmdDogMCwKKyAgICAgIHBhZGRpbmdSaWdodDogMCwKKyAgICAgIHBhZGRpbmdUb3A6IDAsCisgICAgICBzY2FsZTogMQorICAgIH07CisKKyAgICB0YXNrLl90ZXh0RGl2cy5wdXNoKHRleHREaXYpOworCisgICAgaWYgKGlzQWxsV2hpdGVzcGFjZShnZW9tLnN0cikpIHsKKyAgICAgIHRleHREaXZQcm9wZXJ0aWVzLmlzV2hpdGVzcGFjZSA9IHRydWU7CisKKyAgICAgIHRhc2suX3RleHREaXZQcm9wZXJ0aWVzLnNldCh0ZXh0RGl2LCB0ZXh0RGl2UHJvcGVydGllcyk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgdHggPSBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0YXNrLl92aWV3cG9ydC50cmFuc2Zvcm0sIGdlb20udHJhbnNmb3JtKTsKKworICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIodHhbMV0sIHR4WzBdKTsKKyAgICB2YXIgc3R5bGUgPSBzdHlsZXNbZ2VvbS5mb250TmFtZV07CisKKyAgICBpZiAoc3R5bGUudmVydGljYWwpIHsKKyAgICAgIGFuZ2xlICs9IE1hdGguUEkgLyAyOworICAgIH0KKworICAgIHZhciBmb250SGVpZ2h0ID0gTWF0aC5zcXJ0KHR4WzJdICogdHhbMl0gKyB0eFszXSAqIHR4WzNdKTsKKyAgICB2YXIgZm9udEFzY2VudCA9IGZvbnRIZWlnaHQ7CisKKyAgICBpZiAoc3R5bGUuYXNjZW50KSB7CisgICAgICBmb250QXNjZW50ID0gc3R5bGUuYXNjZW50ICogZm9udEFzY2VudDsKKyAgICB9IGVsc2UgaWYgKHN0eWxlLmRlc2NlbnQpIHsKKyAgICAgIGZvbnRBc2NlbnQgPSAoMSArIHN0eWxlLmRlc2NlbnQpICogZm9udEFzY2VudDsKKyAgICB9CisKKyAgICBsZXQgbGVmdCwgdG9wOworCisgICAgaWYgKGFuZ2xlID09PSAwKSB7CisgICAgICBsZWZ0ID0gdHhbNF07CisgICAgICB0b3AgPSB0eFs1XSAtIGZvbnRBc2NlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGxlZnQgPSB0eFs0XSArIGZvbnRBc2NlbnQgKiBNYXRoLnNpbihhbmdsZSk7CisgICAgICB0b3AgPSB0eFs1XSAtIGZvbnRBc2NlbnQgKiBNYXRoLmNvcyhhbmdsZSk7CisgICAgfQorCisgICAgdGV4dERpdi5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7CisgICAgdGV4dERpdi5zdHlsZS50b3AgPSBgJHt0b3B9cHhgOworICAgIHRleHREaXYuc3R5bGUuZm9udFNpemUgPSBgJHtmb250SGVpZ2h0fXB4YDsKKyAgICB0ZXh0RGl2LnN0eWxlLmZvbnRGYW1pbHkgPSBzdHlsZS5mb250RmFtaWx5OworICAgIHRleHREaXYudGV4dENvbnRlbnQgPSBnZW9tLnN0cjsKKworICAgIGlmICh0YXNrLl9mb250SW5zcGVjdG9yRW5hYmxlZCkgeworICAgICAgdGV4dERpdi5kYXRhc2V0LmZvbnROYW1lID0gZ2VvbS5mb250TmFtZTsKKyAgICB9CisKKyAgICBpZiAoYW5nbGUgIT09IDApIHsKKyAgICAgIHRleHREaXZQcm9wZXJ0aWVzLmFuZ2xlID0gYW5nbGUgKiAoMTgwIC8gTWF0aC5QSSk7CisgICAgfQorCisgICAgbGV0IHNob3VsZFNjYWxlVGV4dCA9IGZhbHNlOworCisgICAgaWYgKGdlb20uc3RyLmxlbmd0aCA+IDEpIHsKKyAgICAgIHNob3VsZFNjYWxlVGV4dCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChnZW9tLnRyYW5zZm9ybVswXSAhPT0gZ2VvbS50cmFuc2Zvcm1bM10pIHsKKyAgICAgIGNvbnN0IGFic1NjYWxlWCA9IE1hdGguYWJzKGdlb20udHJhbnNmb3JtWzBdKSwKKyAgICAgICAgICAgIGFic1NjYWxlWSA9IE1hdGguYWJzKGdlb20udHJhbnNmb3JtWzNdKTsKKworICAgICAgaWYgKGFic1NjYWxlWCAhPT0gYWJzU2NhbGVZICYmIE1hdGgubWF4KGFic1NjYWxlWCwgYWJzU2NhbGVZKSAvIE1hdGgubWluKGFic1NjYWxlWCwgYWJzU2NhbGVZKSA+IDEuNSkgeworICAgICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzaG91bGRTY2FsZVRleHQpIHsKKyAgICAgIGlmIChzdHlsZS52ZXJ0aWNhbCkgeworICAgICAgICB0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCA9IGdlb20uaGVpZ2h0ICogdGFzay5fdmlld3BvcnQuc2NhbGU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCA9IGdlb20ud2lkdGggKiB0YXNrLl92aWV3cG9ydC5zY2FsZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpOworCisgICAgaWYgKHRhc2suX3RleHRDb250ZW50U3RyZWFtKSB7CisgICAgICB0YXNrLl9sYXlvdXRUZXh0KHRleHREaXYpOworICAgIH0KKworICAgIGlmICh0YXNrLl9lbmhhbmNlVGV4dFNlbGVjdGlvbikgeworICAgICAgdmFyIGFuZ2xlQ29zID0gMSwKKyAgICAgICAgICBhbmdsZVNpbiA9IDA7CisKKyAgICAgIGlmIChhbmdsZSAhPT0gMCkgeworICAgICAgICBhbmdsZUNvcyA9IE1hdGguY29zKGFuZ2xlKTsKKyAgICAgICAgYW5nbGVTaW4gPSBNYXRoLnNpbihhbmdsZSk7CisgICAgICB9CisKKyAgICAgIHZhciBkaXZXaWR0aCA9IChzdHlsZS52ZXJ0aWNhbCA/IGdlb20uaGVpZ2h0IDogZ2VvbS53aWR0aCkgKiB0YXNrLl92aWV3cG9ydC5zY2FsZTsKKyAgICAgIHZhciBkaXZIZWlnaHQgPSBmb250SGVpZ2h0OworICAgICAgdmFyIG0sIGI7CisKKyAgICAgIGlmIChhbmdsZSAhPT0gMCkgeworICAgICAgICBtID0gW2FuZ2xlQ29zLCBhbmdsZVNpbiwgLWFuZ2xlU2luLCBhbmdsZUNvcywgbGVmdCwgdG9wXTsKKyAgICAgICAgYiA9IF91dGlsLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHRdLCBtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGIgPSBbbGVmdCwgdG9wLCBsZWZ0ICsgZGl2V2lkdGgsIHRvcCArIGRpdkhlaWdodF07CisgICAgICB9CisKKyAgICAgIHRhc2suX2JvdW5kcy5wdXNoKHsKKyAgICAgICAgbGVmdDogYlswXSwKKyAgICAgICAgdG9wOiBiWzFdLAorICAgICAgICByaWdodDogYlsyXSwKKyAgICAgICAgYm90dG9tOiBiWzNdLAorICAgICAgICBkaXY6IHRleHREaXYsCisgICAgICAgIHNpemU6IFtkaXZXaWR0aCwgZGl2SGVpZ2h0XSwKKyAgICAgICAgbQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcmVuZGVyKHRhc2spIHsKKyAgICBpZiAodGFzay5fY2FuY2VsZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgdGV4dERpdnMgPSB0YXNrLl90ZXh0RGl2czsKKyAgICB2YXIgY2FwYWJpbGl0eSA9IHRhc2suX2NhcGFiaWxpdHk7CisgICAgdmFyIHRleHREaXZzTGVuZ3RoID0gdGV4dERpdnMubGVuZ3RoOworCisgICAgaWYgKHRleHREaXZzTGVuZ3RoID4gTUFYX1RFWFRfRElWU19UT19SRU5ERVIpIHsKKyAgICAgIHRhc2suX3JlbmRlcmluZ0RvbmUgPSB0cnVlOworICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCF0YXNrLl90ZXh0Q29udGVudFN0cmVhbSkgeworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0RGl2c0xlbmd0aDsgaSsrKSB7CisgICAgICAgIHRhc2suX2xheW91dFRleHQodGV4dERpdnNbaV0pOworICAgICAgfQorICAgIH0KKworICAgIHRhc2suX3JlbmRlcmluZ0RvbmUgPSB0cnVlOworICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpOworICB9CisKKyAgZnVuY3Rpb24gZmluZFBvc2l0aXZlTWluKHRzLCBvZmZzZXQsIGNvdW50KSB7CisgICAgbGV0IHJlc3VsdCA9IDA7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIGNvbnN0IHQgPSB0c1tvZmZzZXQrK107CisKKyAgICAgIGlmICh0ID4gMCkgeworICAgICAgICByZXN1bHQgPSByZXN1bHQgPyBNYXRoLm1pbih0LCByZXN1bHQpIDogdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgZnVuY3Rpb24gZXhwYW5kKHRhc2spIHsKKyAgICB2YXIgYm91bmRzID0gdGFzay5fYm91bmRzOworICAgIHZhciB2aWV3cG9ydCA9IHRhc2suX3ZpZXdwb3J0OworICAgIHZhciBleHBhbmRlZCA9IGV4cGFuZEJvdW5kcyh2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0LCBib3VuZHMpOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBhbmRlZC5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIGRpdiA9IGJvdW5kc1tpXS5kaXY7CisKKyAgICAgIHZhciBkaXZQcm9wZXJ0aWVzID0gdGFzay5fdGV4dERpdlByb3BlcnRpZXMuZ2V0KGRpdik7CisKKyAgICAgIGlmIChkaXZQcm9wZXJ0aWVzLmFuZ2xlID09PSAwKSB7CisgICAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ0xlZnQgPSBib3VuZHNbaV0ubGVmdCAtIGV4cGFuZGVkW2ldLmxlZnQ7CisgICAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ1RvcCA9IGJvdW5kc1tpXS50b3AgLSBleHBhbmRlZFtpXS50b3A7CisgICAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ1JpZ2h0ID0gZXhwYW5kZWRbaV0ucmlnaHQgLSBib3VuZHNbaV0ucmlnaHQ7CisgICAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ0JvdHRvbSA9IGV4cGFuZGVkW2ldLmJvdHRvbSAtIGJvdW5kc1tpXS5ib3R0b207CisKKyAgICAgICAgdGFzay5fdGV4dERpdlByb3BlcnRpZXMuc2V0KGRpdiwgZGl2UHJvcGVydGllcyk7CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHZhciBlID0gZXhwYW5kZWRbaV0sCisgICAgICAgICAgYiA9IGJvdW5kc1tpXTsKKyAgICAgIHZhciBtID0gYi5tLAorICAgICAgICAgIGMgPSBtWzBdLAorICAgICAgICAgIHMgPSBtWzFdOworICAgICAgdmFyIHBvaW50cyA9IFtbMCwgMF0sIFswLCBiLnNpemVbMV1dLCBbYi5zaXplWzBdLCAwXSwgYi5zaXplXTsKKyAgICAgIHZhciB0cyA9IG5ldyBGbG9hdDY0QXJyYXkoNjQpOworICAgICAgcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHAsIGopIHsKKyAgICAgICAgdmFyIHQgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKHAsIG0pOworCisgICAgICAgIHRzW2ogKyAwXSA9IGMgJiYgKGUubGVmdCAtIHRbMF0pIC8gYzsKKyAgICAgICAgdHNbaiArIDRdID0gcyAmJiAoZS50b3AgLSB0WzFdKSAvIHM7CisgICAgICAgIHRzW2ogKyA4XSA9IGMgJiYgKGUucmlnaHQgLSB0WzBdKSAvIGM7CisgICAgICAgIHRzW2ogKyAxMl0gPSBzICYmIChlLmJvdHRvbSAtIHRbMV0pIC8gczsKKyAgICAgICAgdHNbaiArIDE2XSA9IHMgJiYgKGUubGVmdCAtIHRbMF0pIC8gLXM7CisgICAgICAgIHRzW2ogKyAyMF0gPSBjICYmIChlLnRvcCAtIHRbMV0pIC8gYzsKKyAgICAgICAgdHNbaiArIDI0XSA9IHMgJiYgKGUucmlnaHQgLSB0WzBdKSAvIC1zOworICAgICAgICB0c1tqICsgMjhdID0gYyAmJiAoZS5ib3R0b20gLSB0WzFdKSAvIGM7CisgICAgICAgIHRzW2ogKyAzMl0gPSBjICYmIChlLmxlZnQgLSB0WzBdKSAvIC1jOworICAgICAgICB0c1tqICsgMzZdID0gcyAmJiAoZS50b3AgLSB0WzFdKSAvIC1zOworICAgICAgICB0c1tqICsgNDBdID0gYyAmJiAoZS5yaWdodCAtIHRbMF0pIC8gLWM7CisgICAgICAgIHRzW2ogKyA0NF0gPSBzICYmIChlLmJvdHRvbSAtIHRbMV0pIC8gLXM7CisgICAgICAgIHRzW2ogKyA0OF0gPSBzICYmIChlLmxlZnQgLSB0WzBdKSAvIHM7CisgICAgICAgIHRzW2ogKyA1Ml0gPSBjICYmIChlLnRvcCAtIHRbMV0pIC8gLWM7CisgICAgICAgIHRzW2ogKyA1Nl0gPSBzICYmIChlLnJpZ2h0IC0gdFswXSkgLyBzOworICAgICAgICB0c1tqICsgNjBdID0gYyAmJiAoZS5ib3R0b20gLSB0WzFdKSAvIC1jOworICAgICAgfSk7CisgICAgICB2YXIgYm94U2NhbGUgPSAxICsgTWF0aC5taW4oTWF0aC5hYnMoYyksIE1hdGguYWJzKHMpKTsKKyAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ0xlZnQgPSBmaW5kUG9zaXRpdmVNaW4odHMsIDMyLCAxNikgLyBib3hTY2FsZTsKKyAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ1RvcCA9IGZpbmRQb3NpdGl2ZU1pbih0cywgNDgsIDE2KSAvIGJveFNjYWxlOworICAgICAgZGl2UHJvcGVydGllcy5wYWRkaW5nUmlnaHQgPSBmaW5kUG9zaXRpdmVNaW4odHMsIDAsIDE2KSAvIGJveFNjYWxlOworICAgICAgZGl2UHJvcGVydGllcy5wYWRkaW5nQm90dG9tID0gZmluZFBvc2l0aXZlTWluKHRzLCAxNiwgMTYpIC8gYm94U2NhbGU7CisKKyAgICAgIHRhc2suX3RleHREaXZQcm9wZXJ0aWVzLnNldChkaXYsIGRpdlByb3BlcnRpZXMpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGV4cGFuZEJvdW5kcyh3aWR0aCwgaGVpZ2h0LCBib3hlcykgeworICAgIHZhciBib3VuZHMgPSBib3hlcy5tYXAoZnVuY3Rpb24gKGJveCwgaSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgeDE6IGJveC5sZWZ0LAorICAgICAgICB5MTogYm94LnRvcCwKKyAgICAgICAgeDI6IGJveC5yaWdodCwKKyAgICAgICAgeTI6IGJveC5ib3R0b20sCisgICAgICAgIGluZGV4OiBpLAorICAgICAgICB4MU5ldzogdW5kZWZpbmVkLAorICAgICAgICB4Mk5ldzogdW5kZWZpbmVkCisgICAgICB9OworICAgIH0pOworICAgIGV4cGFuZEJvdW5kc0xUUih3aWR0aCwgYm91bmRzKTsKKyAgICB2YXIgZXhwYW5kZWQgPSBuZXcgQXJyYXkoYm94ZXMubGVuZ3RoKTsKKyAgICBib3VuZHMuZm9yRWFjaChmdW5jdGlvbiAoYikgeworICAgICAgdmFyIGkgPSBiLmluZGV4OworICAgICAgZXhwYW5kZWRbaV0gPSB7CisgICAgICAgIGxlZnQ6IGIueDFOZXcsCisgICAgICAgIHRvcDogMCwKKyAgICAgICAgcmlnaHQ6IGIueDJOZXcsCisgICAgICAgIGJvdHRvbTogMAorICAgICAgfTsKKyAgICB9KTsKKyAgICBib3hlcy5tYXAoZnVuY3Rpb24gKGJveCwgaSkgeworICAgICAgdmFyIGUgPSBleHBhbmRlZFtpXSwKKyAgICAgICAgICBiID0gYm91bmRzW2ldOworICAgICAgYi54MSA9IGJveC50b3A7CisgICAgICBiLnkxID0gd2lkdGggLSBlLnJpZ2h0OworICAgICAgYi54MiA9IGJveC5ib3R0b207CisgICAgICBiLnkyID0gd2lkdGggLSBlLmxlZnQ7CisgICAgICBiLmluZGV4ID0gaTsKKyAgICAgIGIueDFOZXcgPSB1bmRlZmluZWQ7CisgICAgICBiLngyTmV3ID0gdW5kZWZpbmVkOworICAgIH0pOworICAgIGV4cGFuZEJvdW5kc0xUUihoZWlnaHQsIGJvdW5kcyk7CisgICAgYm91bmRzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKKyAgICAgIHZhciBpID0gYi5pbmRleDsKKyAgICAgIGV4cGFuZGVkW2ldLnRvcCA9IGIueDFOZXc7CisgICAgICBleHBhbmRlZFtpXS5ib3R0b20gPSBiLngyTmV3OworICAgIH0pOworICAgIHJldHVybiBleHBhbmRlZDsKKyAgfQorCisgIGZ1bmN0aW9uIGV4cGFuZEJvdW5kc0xUUih3aWR0aCwgYm91bmRzKSB7CisgICAgYm91bmRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKKyAgICAgIHJldHVybiBhLngxIC0gYi54MSB8fCBhLmluZGV4IC0gYi5pbmRleDsKKyAgICB9KTsKKyAgICB2YXIgZmFrZUJvdW5kYXJ5ID0geworICAgICAgeDE6IC1JbmZpbml0eSwKKyAgICAgIHkxOiAtSW5maW5pdHksCisgICAgICB4MjogMCwKKyAgICAgIHkyOiBJbmZpbml0eSwKKyAgICAgIGluZGV4OiAtMSwKKyAgICAgIHgxTmV3OiAwLAorICAgICAgeDJOZXc6IDAKKyAgICB9OworICAgIHZhciBob3Jpem9uID0gW3sKKyAgICAgIHN0YXJ0OiAtSW5maW5pdHksCisgICAgICBlbmQ6IEluZmluaXR5LAorICAgICAgYm91bmRhcnk6IGZha2VCb3VuZGFyeQorICAgIH1dOworICAgIGJvdW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChib3VuZGFyeSkgeworICAgICAgdmFyIGkgPSAwOworCisgICAgICB3aGlsZSAoaSA8IGhvcml6b24ubGVuZ3RoICYmIGhvcml6b25baV0uZW5kIDw9IGJvdW5kYXJ5LnkxKSB7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKworICAgICAgdmFyIGogPSBob3Jpem9uLmxlbmd0aCAtIDE7CisKKyAgICAgIHdoaWxlIChqID49IDAgJiYgaG9yaXpvbltqXS5zdGFydCA+PSBib3VuZGFyeS55MikgeworICAgICAgICBqLS07CisgICAgICB9CisKKyAgICAgIHZhciBob3Jpem9uUGFydCwgYWZmZWN0ZWRCb3VuZGFyeTsKKyAgICAgIHZhciBxLAorICAgICAgICAgIGssCisgICAgICAgICAgbWF4WE5ldyA9IC1JbmZpbml0eTsKKworICAgICAgZm9yIChxID0gaTsgcSA8PSBqOyBxKyspIHsKKyAgICAgICAgaG9yaXpvblBhcnQgPSBob3Jpem9uW3FdOworICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5ID0gaG9yaXpvblBhcnQuYm91bmRhcnk7CisgICAgICAgIHZhciB4TmV3OworCisgICAgICAgIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyID4gYm91bmRhcnkueDEpIHsKKyAgICAgICAgICB4TmV3ID0gYWZmZWN0ZWRCb3VuZGFyeS5pbmRleCA+IGJvdW5kYXJ5LmluZGV4ID8gYWZmZWN0ZWRCb3VuZGFyeS54MU5ldyA6IGJvdW5kYXJ5LngxOworICAgICAgICB9IGVsc2UgaWYgKGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIHhOZXcgPSAoYWZmZWN0ZWRCb3VuZGFyeS54MiArIGJvdW5kYXJ5LngxKSAvIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgeE5ldyA9IGFmZmVjdGVkQm91bmRhcnkueDJOZXc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeE5ldyA+IG1heFhOZXcpIHsKKyAgICAgICAgICBtYXhYTmV3ID0geE5ldzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBib3VuZGFyeS54MU5ldyA9IG1heFhOZXc7CisKKyAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7CisgICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTsKKyAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5OworCisgICAgICAgIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54MiA+IGJvdW5kYXJ5LngxKSB7CisgICAgICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS5pbmRleCA+IGJvdW5kYXJ5LmluZGV4KSB7CisgICAgICAgICAgICAgIGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPSBhZmZlY3RlZEJvdW5kYXJ5LngyOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gbWF4WE5ldzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA+IG1heFhOZXcpIHsKKyAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gTWF0aC5tYXgobWF4WE5ldywgYWZmZWN0ZWRCb3VuZGFyeS54Mik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGNoYW5nZWRIb3Jpem9uID0gW10sCisgICAgICAgICAgbGFzdEJvdW5kYXJ5ID0gbnVsbDsKKworICAgICAgZm9yIChxID0gaTsgcSA8PSBqOyBxKyspIHsKKyAgICAgICAgaG9yaXpvblBhcnQgPSBob3Jpem9uW3FdOworICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5ID0gaG9yaXpvblBhcnQuYm91bmRhcnk7CisgICAgICAgIHZhciB1c2VCb3VuZGFyeSA9IGFmZmVjdGVkQm91bmRhcnkueDIgPiBib3VuZGFyeS54MiA/IGFmZmVjdGVkQm91bmRhcnkgOiBib3VuZGFyeTsKKworICAgICAgICBpZiAobGFzdEJvdW5kYXJ5ID09PSB1c2VCb3VuZGFyeSkgeworICAgICAgICAgIGNoYW5nZWRIb3Jpem9uW2NoYW5nZWRIb3Jpem9uLmxlbmd0aCAtIDFdLmVuZCA9IGhvcml6b25QYXJ0LmVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjaGFuZ2VkSG9yaXpvbi5wdXNoKHsKKyAgICAgICAgICAgIHN0YXJ0OiBob3Jpem9uUGFydC5zdGFydCwKKyAgICAgICAgICAgIGVuZDogaG9yaXpvblBhcnQuZW5kLAorICAgICAgICAgICAgYm91bmRhcnk6IHVzZUJvdW5kYXJ5CisgICAgICAgICAgfSk7CisgICAgICAgICAgbGFzdEJvdW5kYXJ5ID0gdXNlQm91bmRhcnk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGhvcml6b25baV0uc3RhcnQgPCBib3VuZGFyeS55MSkgeworICAgICAgICBjaGFuZ2VkSG9yaXpvblswXS5zdGFydCA9IGJvdW5kYXJ5LnkxOworICAgICAgICBjaGFuZ2VkSG9yaXpvbi51bnNoaWZ0KHsKKyAgICAgICAgICBzdGFydDogaG9yaXpvbltpXS5zdGFydCwKKyAgICAgICAgICBlbmQ6IGJvdW5kYXJ5LnkxLAorICAgICAgICAgIGJvdW5kYXJ5OiBob3Jpem9uW2ldLmJvdW5kYXJ5CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBpZiAoYm91bmRhcnkueTIgPCBob3Jpem9uW2pdLmVuZCkgeworICAgICAgICBjaGFuZ2VkSG9yaXpvbltjaGFuZ2VkSG9yaXpvbi5sZW5ndGggLSAxXS5lbmQgPSBib3VuZGFyeS55MjsKKyAgICAgICAgY2hhbmdlZEhvcml6b24ucHVzaCh7CisgICAgICAgICAgc3RhcnQ6IGJvdW5kYXJ5LnkyLAorICAgICAgICAgIGVuZDogaG9yaXpvbltqXS5lbmQsCisgICAgICAgICAgYm91bmRhcnk6IGhvcml6b25bal0uYm91bmRhcnkKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7CisgICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTsKKyAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5OworCisgICAgICAgIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB1c2VkID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChrID0gaSAtIDE7ICF1c2VkICYmIGsgPj0gMCAmJiBob3Jpem9uW2tdLnN0YXJ0ID49IGFmZmVjdGVkQm91bmRhcnkueTE7IGstLSkgeworICAgICAgICAgIHVzZWQgPSBob3Jpem9uW2tdLmJvdW5kYXJ5ID09PSBhZmZlY3RlZEJvdW5kYXJ5OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChrID0gaiArIDE7ICF1c2VkICYmIGsgPCBob3Jpem9uLmxlbmd0aCAmJiBob3Jpem9uW2tdLmVuZCA8PSBhZmZlY3RlZEJvdW5kYXJ5LnkyOyBrKyspIHsKKyAgICAgICAgICB1c2VkID0gaG9yaXpvbltrXS5ib3VuZGFyeSA9PT0gYWZmZWN0ZWRCb3VuZGFyeTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoayA9IDA7ICF1c2VkICYmIGsgPCBjaGFuZ2VkSG9yaXpvbi5sZW5ndGg7IGsrKykgeworICAgICAgICAgIHVzZWQgPSBjaGFuZ2VkSG9yaXpvbltrXS5ib3VuZGFyeSA9PT0gYWZmZWN0ZWRCb3VuZGFyeTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdXNlZCkgeworICAgICAgICAgIGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPSBtYXhYTmV3OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoaG9yaXpvbiwgW2ksIGogLSBpICsgMV0uY29uY2F0KGNoYW5nZWRIb3Jpem9uKSk7CisgICAgfSk7CisgICAgaG9yaXpvbi5mb3JFYWNoKGZ1bmN0aW9uIChob3Jpem9uUGFydCkgeworICAgICAgdmFyIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTsKKworICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gTWF0aC5tYXgod2lkdGgsIGFmZmVjdGVkQm91bmRhcnkueDIpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gVGV4dExheWVyUmVuZGVyVGFzayh7CisgICAgdGV4dENvbnRlbnQsCisgICAgdGV4dENvbnRlbnRTdHJlYW0sCisgICAgY29udGFpbmVyLAorICAgIHZpZXdwb3J0LAorICAgIHRleHREaXZzLAorICAgIHRleHRDb250ZW50SXRlbXNTdHIsCisgICAgZW5oYW5jZVRleHRTZWxlY3Rpb24KKyAgfSkgeworICAgIHRoaXMuX3RleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7CisgICAgdGhpcy5fdGV4dENvbnRlbnRTdHJlYW0gPSB0ZXh0Q29udGVudFN0cmVhbTsKKyAgICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7CisgICAgdGhpcy5fZG9jdW1lbnQgPSBjb250YWluZXIub3duZXJEb2N1bWVudDsKKyAgICB0aGlzLl92aWV3cG9ydCA9IHZpZXdwb3J0OworICAgIHRoaXMuX3RleHREaXZzID0gdGV4dERpdnMgfHwgW107CisgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRleHRDb250ZW50SXRlbXNTdHIgfHwgW107CisgICAgdGhpcy5fZW5oYW5jZVRleHRTZWxlY3Rpb24gPSAhIWVuaGFuY2VUZXh0U2VsZWN0aW9uOworICAgIHRoaXMuX2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISEoZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yICYmIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5lbmFibGVkKTsKKyAgICB0aGlzLl9yZWFkZXIgPSBudWxsOworICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udFNpemUgPSBudWxsOworICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSA9IG51bGw7CisgICAgdGhpcy5fbGF5b3V0VGV4dEN0eCA9IG51bGw7CisgICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpOworICAgIHRoaXMuX3JlbmRlcmluZ0RvbmUgPSBmYWxzZTsKKyAgICB0aGlzLl9jYW5jZWxlZCA9IGZhbHNlOworICAgIHRoaXMuX2NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5fcmVuZGVyVGltZXIgPSBudWxsOworICAgIHRoaXMuX2JvdW5kcyA9IFtdOworCisgICAgdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlLmZpbmFsbHkoKCkgPT4geworICAgICAgaWYgKHRoaXMuX2xheW91dFRleHRDdHgpIHsKKyAgICAgICAgdGhpcy5fbGF5b3V0VGV4dEN0eC5jYW52YXMud2lkdGggPSAwOworICAgICAgICB0aGlzLl9sYXlvdXRUZXh0Q3R4LmNhbnZhcy5oZWlnaHQgPSAwOworICAgICAgICB0aGlzLl9sYXlvdXRUZXh0Q3R4ID0gbnVsbDsKKyAgICAgIH0KKyAgICB9KS5jYXRjaCgoKSA9PiB7fSk7CisgIH0KKworICBUZXh0TGF5ZXJSZW5kZXJUYXNrLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgcHJvbWlzZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7CisgICAgfSwKKworICAgIGNhbmNlbDogZnVuY3Rpb24gVGV4dExheWVyX2NhbmNlbCgpIHsKKyAgICAgIHRoaXMuX2NhbmNlbGVkID0gdHJ1ZTsKKworICAgICAgaWYgKHRoaXMuX3JlYWRlcikgeworICAgICAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiVGV4dExheWVyIHRhc2sgY2FuY2VsbGVkLiIpKTsKKworICAgICAgICB0aGlzLl9yZWFkZXIgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fcmVuZGVyVGltZXIgIT09IG51bGwpIHsKKyAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3JlbmRlclRpbWVyKTsKKyAgICAgICAgdGhpcy5fcmVuZGVyVGltZXIgPSBudWxsOworICAgICAgfQorCisgICAgICB0aGlzLl9jYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC4iKSk7CisgICAgfSwKKworICAgIF9wcm9jZXNzSXRlbXMoaXRlbXMsIHN0eWxlQ2FjaGUpIHsKKyAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworICAgICAgICB0aGlzLl90ZXh0Q29udGVudEl0ZW1zU3RyLnB1c2goaXRlbXNbaV0uc3RyKTsKKworICAgICAgICBhcHBlbmRUZXh0KHRoaXMsIGl0ZW1zW2ldLCBzdHlsZUNhY2hlKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX2xheW91dFRleHQodGV4dERpdikgeworICAgICAgY29uc3QgdGV4dERpdlByb3BlcnRpZXMgPSB0aGlzLl90ZXh0RGl2UHJvcGVydGllcy5nZXQodGV4dERpdik7CisKKyAgICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5pc1doaXRlc3BhY2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBsZXQgdHJhbnNmb3JtID0gIiI7CisKKyAgICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCAhPT0gMCkgeworICAgICAgICBjb25zdCB7CisgICAgICAgICAgZm9udFNpemUsCisgICAgICAgICAgZm9udEZhbWlseQorICAgICAgICB9ID0gdGV4dERpdi5zdHlsZTsKKworICAgICAgICBpZiAoZm9udFNpemUgIT09IHRoaXMuX2xheW91dFRleHRMYXN0Rm9udFNpemUgfHwgZm9udEZhbWlseSAhPT0gdGhpcy5fbGF5b3V0VGV4dExhc3RGb250RmFtaWx5KSB7CisgICAgICAgICAgdGhpcy5fbGF5b3V0VGV4dEN0eC5mb250ID0gYCR7Zm9udFNpemV9ICR7Zm9udEZhbWlseX1gOworICAgICAgICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udFNpemUgPSBmb250U2l6ZTsKKyAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRGYW1pbHkgPSBmb250RmFtaWx5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgeworICAgICAgICAgIHdpZHRoCisgICAgICAgIH0gPSB0aGlzLl9sYXlvdXRUZXh0Q3R4Lm1lYXN1cmVUZXh0KHRleHREaXYudGV4dENvbnRlbnQpOworCisgICAgICAgIGlmICh3aWR0aCA+IDApIHsKKyAgICAgICAgICB0ZXh0RGl2UHJvcGVydGllcy5zY2FsZSA9IHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoIC8gd2lkdGg7CisgICAgICAgICAgdHJhbnNmb3JtID0gYHNjYWxlWCgke3RleHREaXZQcm9wZXJ0aWVzLnNjYWxlfSlgOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSAhPT0gMCkgeworICAgICAgICB0cmFuc2Zvcm0gPSBgcm90YXRlKCR7dGV4dERpdlByb3BlcnRpZXMuYW5nbGV9ZGVnKSAke3RyYW5zZm9ybX1gOworICAgICAgfQorCisgICAgICBpZiAodHJhbnNmb3JtLmxlbmd0aCA+IDApIHsKKyAgICAgICAgaWYgKHRoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uKSB7CisgICAgICAgICAgdGV4dERpdlByb3BlcnRpZXMub3JpZ2luYWxUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07CisgICAgICAgIH0KKworICAgICAgICB0ZXh0RGl2LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMuc2V0KHRleHREaXYsIHRleHREaXZQcm9wZXJ0aWVzKTsKKworICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHRleHREaXYpOworICAgIH0sCisKKyAgICBfcmVuZGVyOiBmdW5jdGlvbiBUZXh0TGF5ZXJfcmVuZGVyKHRpbWVvdXQpIHsKKyAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICBsZXQgc3R5bGVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworCisgICAgICBjYW52YXMubW96T3BhcXVlID0gdHJ1ZTsKKyAgICAgIHRoaXMuX2xheW91dFRleHRDdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CisgICAgICAgIGFscGhhOiBmYWxzZQorICAgICAgfSk7CisKKyAgICAgIGlmICh0aGlzLl90ZXh0Q29udGVudCkgeworICAgICAgICBjb25zdCB0ZXh0SXRlbXMgPSB0aGlzLl90ZXh0Q29udGVudC5pdGVtczsKKyAgICAgICAgY29uc3QgdGV4dFN0eWxlcyA9IHRoaXMuX3RleHRDb250ZW50LnN0eWxlczsKKworICAgICAgICB0aGlzLl9wcm9jZXNzSXRlbXModGV4dEl0ZW1zLCB0ZXh0U3R5bGVzKTsKKworICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGV4dENvbnRlbnRTdHJlYW0pIHsKKyAgICAgICAgY29uc3QgcHVtcCA9ICgpID0+IHsKKyAgICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpLnRoZW4oKHsKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIH0pID0+IHsKKyAgICAgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGVDYWNoZSwgdmFsdWUuc3R5bGVzKTsKKworICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKHZhbHVlLml0ZW1zLCBzdHlsZUNhY2hlKTsKKworICAgICAgICAgICAgcHVtcCgpOworICAgICAgICAgIH0sIGNhcGFiaWxpdHkucmVqZWN0KTsKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLl9yZWFkZXIgPSB0aGlzLl90ZXh0Q29udGVudFN0cmVhbS5nZXRSZWFkZXIoKTsKKyAgICAgICAgcHVtcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWl0aGVyICJ0ZXh0Q29udGVudCIgbm9yICJ0ZXh0Q29udGVudFN0cmVhbSInICsgIiBwYXJhbWV0ZXJzIHNwZWNpZmllZC4iKTsKKyAgICAgIH0KKworICAgICAgY2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgICBzdHlsZUNhY2hlID0gbnVsbDsKKworICAgICAgICBpZiAoIXRpbWVvdXQpIHsKKyAgICAgICAgICByZW5kZXIodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5fcmVuZGVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKKyAgICAgICAgICAgIHJlbmRlcih0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpbWVyID0gbnVsbDsKKyAgICAgICAgICB9LCB0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgfSwgdGhpcy5fY2FwYWJpbGl0eS5yZWplY3QpOworICAgIH0sCisgICAgZXhwYW5kVGV4dERpdnM6IGZ1bmN0aW9uIFRleHRMYXllcl9leHBhbmRUZXh0RGl2cyhleHBhbmREaXZzKSB7CisgICAgICBpZiAoIXRoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uIHx8ICF0aGlzLl9yZW5kZXJpbmdEb25lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2JvdW5kcyAhPT0gbnVsbCkgeworICAgICAgICBleHBhbmQodGhpcyk7CisgICAgICAgIHRoaXMuX2JvdW5kcyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHRyYW5zZm9ybUJ1ZiA9IFtdLAorICAgICAgICAgICAgcGFkZGluZ0J1ZiA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLl90ZXh0RGl2cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGRpdiA9IHRoaXMuX3RleHREaXZzW2ldOworCisgICAgICAgIGNvbnN0IGRpdlByb3BzID0gdGhpcy5fdGV4dERpdlByb3BlcnRpZXMuZ2V0KGRpdik7CisKKyAgICAgICAgaWYgKGRpdlByb3BzLmlzV2hpdGVzcGFjZSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4cGFuZERpdnMpIHsKKyAgICAgICAgICB0cmFuc2Zvcm1CdWYubGVuZ3RoID0gMDsKKyAgICAgICAgICBwYWRkaW5nQnVmLmxlbmd0aCA9IDA7CisKKyAgICAgICAgICBpZiAoZGl2UHJvcHMub3JpZ2luYWxUcmFuc2Zvcm0pIHsKKyAgICAgICAgICAgIHRyYW5zZm9ybUJ1Zi5wdXNoKGRpdlByb3BzLm9yaWdpbmFsVHJhbnNmb3JtKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZGl2UHJvcHMucGFkZGluZ1RvcCA+IDApIHsKKyAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaChgJHtkaXZQcm9wcy5wYWRkaW5nVG9wfXB4YCk7CisgICAgICAgICAgICB0cmFuc2Zvcm1CdWYucHVzaChgdHJhbnNsYXRlWSgkey1kaXZQcm9wcy5wYWRkaW5nVG9wfXB4KWApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdSaWdodCA+IDApIHsKKyAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaChgJHtkaXZQcm9wcy5wYWRkaW5nUmlnaHQgLyBkaXZQcm9wcy5zY2FsZX1weGApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdCb3R0b20gPiAwKSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goYCR7ZGl2UHJvcHMucGFkZGluZ0JvdHRvbX1weGApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdMZWZ0ID4gMCkgeworICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKGAke2RpdlByb3BzLnBhZGRpbmdMZWZ0IC8gZGl2UHJvcHMuc2NhbGV9cHhgKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybUJ1Zi5wdXNoKGB0cmFuc2xhdGVYKCR7LWRpdlByb3BzLnBhZGRpbmdMZWZ0IC8gZGl2UHJvcHMuc2NhbGV9cHgpYCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaCgwKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBkaXYuc3R5bGUucGFkZGluZyA9IHBhZGRpbmdCdWYuam9pbigiICIpOworCisgICAgICAgICAgaWYgKHRyYW5zZm9ybUJ1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgIGRpdi5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1CdWYuam9pbigiICIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkaXYuc3R5bGUucGFkZGluZyA9IG51bGw7CisgICAgICAgICAgZGl2LnN0eWxlLnRyYW5zZm9ybSA9IGRpdlByb3BzLm9yaWdpbmFsVHJhbnNmb3JtOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIHJlbmRlclRleHRMYXllcihyZW5kZXJQYXJhbWV0ZXJzKSB7CisgICAgdmFyIHRhc2sgPSBuZXcgVGV4dExheWVyUmVuZGVyVGFzayh7CisgICAgICB0ZXh0Q29udGVudDogcmVuZGVyUGFyYW1ldGVycy50ZXh0Q29udGVudCwKKyAgICAgIHRleHRDb250ZW50U3RyZWFtOiByZW5kZXJQYXJhbWV0ZXJzLnRleHRDb250ZW50U3RyZWFtLAorICAgICAgY29udGFpbmVyOiByZW5kZXJQYXJhbWV0ZXJzLmNvbnRhaW5lciwKKyAgICAgIHZpZXdwb3J0OiByZW5kZXJQYXJhbWV0ZXJzLnZpZXdwb3J0LAorICAgICAgdGV4dERpdnM6IHJlbmRlclBhcmFtZXRlcnMudGV4dERpdnMsCisgICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyOiByZW5kZXJQYXJhbWV0ZXJzLnRleHRDb250ZW50SXRlbXNTdHIsCisgICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbjogcmVuZGVyUGFyYW1ldGVycy5lbmhhbmNlVGV4dFNlbGVjdGlvbgorICAgIH0pOworCisgICAgdGFzay5fcmVuZGVyKHJlbmRlclBhcmFtZXRlcnMudGltZW91dCk7CisKKyAgICByZXR1cm4gdGFzazsKKyAgfQorCisgIHJldHVybiByZW5kZXJUZXh0TGF5ZXI7Cit9KCk7CisKK2V4cG9ydHMucmVuZGVyVGV4dExheWVyID0gcmVuZGVyVGV4dExheWVyOworCisvKioqLyB9KSwKKy8qIDIxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuU1ZHR3JhcGhpY3MgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CisKK2xldCBTVkdHcmFwaGljcyA9IGZ1bmN0aW9uICgpIHsKKyAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IFNWR0dyYXBoaWNzIik7Cit9OworCitleHBvcnRzLlNWR0dyYXBoaWNzID0gU1ZHR3JhcGhpY3M7Cit7CisgIGNvbnN0IFNWR19ERUZBVUxUUyA9IHsKKyAgICBmb250U3R5bGU6ICJub3JtYWwiLAorICAgIGZvbnRXZWlnaHQ6ICJub3JtYWwiLAorICAgIGZpbGxDb2xvcjogIiMwMDAwMDAiCisgIH07CisgIGNvbnN0IFhNTF9OUyA9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiOworICBjb25zdCBYTElOS19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIjsKKyAgY29uc3QgTElORV9DQVBfU1RZTEVTID0gWyJidXR0IiwgInJvdW5kIiwgInNxdWFyZSJdOworICBjb25zdCBMSU5FX0pPSU5fU1RZTEVTID0gWyJtaXRlciIsICJyb3VuZCIsICJiZXZlbCJdOworCisgIGNvbnN0IGNvbnZlcnRJbWdEYXRhVG9QbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgY29uc3QgUE5HX0hFQURFUiA9IG5ldyBVaW50OEFycmF5KFsweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhXSk7CisgICAgY29uc3QgQ0hVTktfV1JBUFBFUl9TSVpFID0gMTI7CisgICAgY29uc3QgY3JjVGFibGUgPSBuZXcgSW50MzJBcnJheSgyNTYpOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgbGV0IGMgPSBpOworCisgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IDg7IGgrKykgeworICAgICAgICBpZiAoYyAmIDEpIHsKKyAgICAgICAgICBjID0gMHhlZGI4ODMyMCBeIGMgPj4gMSAmIDB4N2ZmZmZmZmY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYyA9IGMgPj4gMSAmIDB4N2ZmZmZmZmY7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY3JjVGFibGVbaV0gPSBjOworICAgIH0KKworICAgIGZ1bmN0aW9uIGNyYzMyKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIGxldCBjcmMgPSAtMTsKKworICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgY29uc3QgYSA9IChjcmMgXiBkYXRhW2ldKSAmIDB4ZmY7CisgICAgICAgIGNvbnN0IGIgPSBjcmNUYWJsZVthXTsKKyAgICAgICAgY3JjID0gY3JjID4+PiA4IF4gYjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGNyYyBeIC0xOworICAgIH0KKworICAgIGZ1bmN0aW9uIHdyaXRlUG5nQ2h1bmsodHlwZSwgYm9keSwgZGF0YSwgb2Zmc2V0KSB7CisgICAgICBsZXQgcCA9IG9mZnNldDsKKyAgICAgIGNvbnN0IGxlbiA9IGJvZHkubGVuZ3RoOworICAgICAgZGF0YVtwXSA9IGxlbiA+PiAyNCAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAxXSA9IGxlbiA+PiAxNiAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAyXSA9IGxlbiA+PiA4ICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDNdID0gbGVuICYgMHhmZjsKKyAgICAgIHAgKz0gNDsKKyAgICAgIGRhdGFbcF0gPSB0eXBlLmNoYXJDb2RlQXQoMCkgJiAweGZmOworICAgICAgZGF0YVtwICsgMV0gPSB0eXBlLmNoYXJDb2RlQXQoMSkgJiAweGZmOworICAgICAgZGF0YVtwICsgMl0gPSB0eXBlLmNoYXJDb2RlQXQoMikgJiAweGZmOworICAgICAgZGF0YVtwICsgM10gPSB0eXBlLmNoYXJDb2RlQXQoMykgJiAweGZmOworICAgICAgcCArPSA0OworICAgICAgZGF0YS5zZXQoYm9keSwgcCk7CisgICAgICBwICs9IGJvZHkubGVuZ3RoOworICAgICAgY29uc3QgY3JjID0gY3JjMzIoZGF0YSwgb2Zmc2V0ICsgNCwgcCk7CisgICAgICBkYXRhW3BdID0gY3JjID4+IDI0ICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDFdID0gY3JjID4+IDE2ICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDJdID0gY3JjID4+IDggJiAweGZmOworICAgICAgZGF0YVtwICsgM10gPSBjcmMgJiAweGZmOworICAgIH0KKworICAgIGZ1bmN0aW9uIGFkbGVyMzIoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgbGV0IGEgPSAxOworICAgICAgbGV0IGIgPSAwOworCisgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgeworICAgICAgICBhID0gKGEgKyAoZGF0YVtpXSAmIDB4ZmYpKSAlIDY1NTIxOworICAgICAgICBiID0gKGIgKyBhKSAlIDY1NTIxOworICAgICAgfQorCisgICAgICByZXR1cm4gYiA8PCAxNiB8IGE7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmMobGl0ZXJhbHMpIHsKKyAgICAgIGlmICghX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgcmV0dXJuIGRlZmxhdGVTeW5jVW5jb21wcmVzc2VkKGxpdGVyYWxzKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgbGV0IGlucHV0OworCisgICAgICAgIGlmIChwYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUpID49IDgpIHsKKyAgICAgICAgICBpbnB1dCA9IGxpdGVyYWxzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlucHV0ID0gQnVmZmVyLmZyb20obGl0ZXJhbHMpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgb3V0cHV0ID0gcmVxdWlyZSgiemxpYiIpLmRlZmxhdGVTeW5jKGlucHV0LCB7CisgICAgICAgICAgbGV2ZWw6IDkKKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBvdXRwdXQgOiBuZXcgVWludDhBcnJheShvdXRwdXQpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIk5vdCBjb21wcmVzc2luZyBQTkcgYmVjYXVzZSB6bGliLmRlZmxhdGVTeW5jIGlzIHVuYXZhaWxhYmxlOiAiICsgZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZChsaXRlcmFscyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQobGl0ZXJhbHMpIHsKKyAgICAgIGxldCBsZW4gPSBsaXRlcmFscy5sZW5ndGg7CisgICAgICBjb25zdCBtYXhCbG9ja0xlbmd0aCA9IDB4ZmZmZjsKKyAgICAgIGNvbnN0IGRlZmxhdGVCbG9ja3MgPSBNYXRoLmNlaWwobGVuIC8gbWF4QmxvY2tMZW5ndGgpOworICAgICAgY29uc3QgaWRhdCA9IG5ldyBVaW50OEFycmF5KDIgKyBsZW4gKyBkZWZsYXRlQmxvY2tzICogNSArIDQpOworICAgICAgbGV0IHBpID0gMDsKKyAgICAgIGlkYXRbcGkrK10gPSAweDc4OworICAgICAgaWRhdFtwaSsrXSA9IDB4OWM7CisgICAgICBsZXQgcG9zID0gMDsKKworICAgICAgd2hpbGUgKGxlbiA+IG1heEJsb2NrTGVuZ3RoKSB7CisgICAgICAgIGlkYXRbcGkrK10gPSAweDAwOworICAgICAgICBpZGF0W3BpKytdID0gMHhmZjsKKyAgICAgICAgaWRhdFtwaSsrXSA9IDB4ZmY7CisgICAgICAgIGlkYXRbcGkrK10gPSAweDAwOworICAgICAgICBpZGF0W3BpKytdID0gMHgwMDsKKyAgICAgICAgaWRhdC5zZXQobGl0ZXJhbHMuc3ViYXJyYXkocG9zLCBwb3MgKyBtYXhCbG9ja0xlbmd0aCksIHBpKTsKKyAgICAgICAgcGkgKz0gbWF4QmxvY2tMZW5ndGg7CisgICAgICAgIHBvcyArPSBtYXhCbG9ja0xlbmd0aDsKKyAgICAgICAgbGVuIC09IG1heEJsb2NrTGVuZ3RoOworICAgICAgfQorCisgICAgICBpZGF0W3BpKytdID0gMHgwMTsKKyAgICAgIGlkYXRbcGkrK10gPSBsZW4gJiAweGZmOworICAgICAgaWRhdFtwaSsrXSA9IGxlbiA+PiA4ICYgMHhmZjsKKyAgICAgIGlkYXRbcGkrK10gPSB+bGVuICYgMHhmZmZmICYgMHhmZjsKKyAgICAgIGlkYXRbcGkrK10gPSAofmxlbiAmIDB4ZmZmZikgPj4gOCAmIDB4ZmY7CisgICAgICBpZGF0LnNldChsaXRlcmFscy5zdWJhcnJheShwb3MpLCBwaSk7CisgICAgICBwaSArPSBsaXRlcmFscy5sZW5ndGggLSBwb3M7CisgICAgICBjb25zdCBhZGxlciA9IGFkbGVyMzIobGl0ZXJhbHMsIDAsIGxpdGVyYWxzLmxlbmd0aCk7CisgICAgICBpZGF0W3BpKytdID0gYWRsZXIgPj4gMjQgJiAweGZmOworICAgICAgaWRhdFtwaSsrXSA9IGFkbGVyID4+IDE2ICYgMHhmZjsKKyAgICAgIGlkYXRbcGkrK10gPSBhZGxlciA+PiA4ICYgMHhmZjsKKyAgICAgIGlkYXRbcGkrK10gPSBhZGxlciAmIDB4ZmY7CisgICAgICByZXR1cm4gaWRhdDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBlbmNvZGUoaW1nRGF0YSwga2luZCwgZm9yY2VEYXRhU2NoZW1hLCBpc01hc2spIHsKKyAgICAgIGNvbnN0IHdpZHRoID0gaW1nRGF0YS53aWR0aDsKKyAgICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0OworICAgICAgbGV0IGJpdERlcHRoLCBjb2xvclR5cGUsIGxpbmVTaXplOworICAgICAgY29uc3QgYnl0ZXMgPSBpbWdEYXRhLmRhdGE7CisKKyAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgICBjYXNlIF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKKyAgICAgICAgICBjb2xvclR5cGUgPSAwOworICAgICAgICAgIGJpdERlcHRoID0gMTsKKyAgICAgICAgICBsaW5lU2l6ZSA9IHdpZHRoICsgNyA+PiAzOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUDoKKyAgICAgICAgICBjb2xvclR5cGUgPSAyOworICAgICAgICAgIGJpdERlcHRoID0gODsKKyAgICAgICAgICBsaW5lU2l6ZSA9IHdpZHRoICogMzsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF91dGlsLkltYWdlS2luZC5SR0JBXzMyQlBQOgorICAgICAgICAgIGNvbG9yVHlwZSA9IDY7CisgICAgICAgICAgYml0RGVwdGggPSA4OworICAgICAgICAgIGxpbmVTaXplID0gd2lkdGggKiA0OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpOworICAgICAgfQorCisgICAgICBjb25zdCBsaXRlcmFscyA9IG5ldyBVaW50OEFycmF5KCgxICsgbGluZVNpemUpICogaGVpZ2h0KTsKKyAgICAgIGxldCBvZmZzZXRMaXRlcmFscyA9IDAsCisgICAgICAgICAgb2Zmc2V0Qnl0ZXMgPSAwOworCisgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGxpdGVyYWxzW29mZnNldExpdGVyYWxzKytdID0gMDsKKyAgICAgICAgbGl0ZXJhbHMuc2V0KGJ5dGVzLnN1YmFycmF5KG9mZnNldEJ5dGVzLCBvZmZzZXRCeXRlcyArIGxpbmVTaXplKSwgb2Zmc2V0TGl0ZXJhbHMpOworICAgICAgICBvZmZzZXRCeXRlcyArPSBsaW5lU2l6ZTsKKyAgICAgICAgb2Zmc2V0TGl0ZXJhbHMgKz0gbGluZVNpemU7CisgICAgICB9CisKKyAgICAgIGlmIChraW5kID09PSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgJiYgaXNNYXNrKSB7CisgICAgICAgIG9mZnNldExpdGVyYWxzID0gMDsKKworICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgb2Zmc2V0TGl0ZXJhbHMrKzsKKworICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVNpemU7IGkrKykgeworICAgICAgICAgICAgbGl0ZXJhbHNbb2Zmc2V0TGl0ZXJhbHMrK10gXj0gMHhmZjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29uc3QgaWhkciA9IG5ldyBVaW50OEFycmF5KFt3aWR0aCA+PiAyNCAmIDB4ZmYsIHdpZHRoID4+IDE2ICYgMHhmZiwgd2lkdGggPj4gOCAmIDB4ZmYsIHdpZHRoICYgMHhmZiwgaGVpZ2h0ID4+IDI0ICYgMHhmZiwgaGVpZ2h0ID4+IDE2ICYgMHhmZiwgaGVpZ2h0ID4+IDggJiAweGZmLCBoZWlnaHQgJiAweGZmLCBiaXREZXB0aCwgY29sb3JUeXBlLCAweDAwLCAweDAwLCAweDAwXSk7CisgICAgICBjb25zdCBpZGF0ID0gZGVmbGF0ZVN5bmMobGl0ZXJhbHMpOworICAgICAgY29uc3QgcG5nTGVuZ3RoID0gUE5HX0hFQURFUi5sZW5ndGggKyBDSFVOS19XUkFQUEVSX1NJWkUgKiAzICsgaWhkci5sZW5ndGggKyBpZGF0Lmxlbmd0aDsKKyAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShwbmdMZW5ndGgpOworICAgICAgbGV0IG9mZnNldCA9IDA7CisgICAgICBkYXRhLnNldChQTkdfSEVBREVSLCBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IFBOR19IRUFERVIubGVuZ3RoOworICAgICAgd3JpdGVQbmdDaHVuaygiSUhEUiIsIGloZHIsIGRhdGEsIG9mZnNldCk7CisgICAgICBvZmZzZXQgKz0gQ0hVTktfV1JBUFBFUl9TSVpFICsgaWhkci5sZW5ndGg7CisgICAgICB3cml0ZVBuZ0NodW5rKCJJREFUQSIsIGlkYXQsIGRhdGEsIG9mZnNldCk7CisgICAgICBvZmZzZXQgKz0gQ0hVTktfV1JBUFBFUl9TSVpFICsgaWRhdC5sZW5ndGg7CisgICAgICB3cml0ZVBuZ0NodW5rKCJJRU5EIiwgbmV3IFVpbnQ4QXJyYXkoMCksIGRhdGEsIG9mZnNldCk7CisgICAgICByZXR1cm4gKDAsIF91dGlsLmNyZWF0ZU9iamVjdFVSTCkoZGF0YSwgImltYWdlL3BuZyIsIGZvcmNlRGF0YVNjaGVtYSk7CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnZlcnRJbWdEYXRhVG9QbmcoaW1nRGF0YSwgZm9yY2VEYXRhU2NoZW1hLCBpc01hc2spIHsKKyAgICAgIGNvbnN0IGtpbmQgPSBpbWdEYXRhLmtpbmQgPT09IHVuZGVmaW5lZCA/IF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCA6IGltZ0RhdGEua2luZDsKKyAgICAgIHJldHVybiBlbmNvZGUoaW1nRGF0YSwga2luZCwgZm9yY2VEYXRhU2NoZW1hLCBpc01hc2spOworICAgIH07CisgIH0oKTsKKworICBjbGFzcyBTVkdFeHRyYVN0YXRlIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgIHRoaXMuZm9udFNpemVTY2FsZSA9IDE7CisgICAgICB0aGlzLmZvbnRXZWlnaHQgPSBTVkdfREVGQVVMVFMuZm9udFdlaWdodDsKKyAgICAgIHRoaXMuZm9udFNpemUgPSAwOworICAgICAgdGhpcy50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYOworICAgICAgdGhpcy5mb250TWF0cml4ID0gX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7CisgICAgICB0aGlzLmxlYWRpbmcgPSAwOworICAgICAgdGhpcy50ZXh0UmVuZGVyaW5nTW9kZSA9IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7CisgICAgICB0aGlzLnRleHRNYXRyaXhTY2FsZSA9IDE7CisgICAgICB0aGlzLnggPSAwOworICAgICAgdGhpcy55ID0gMDsKKyAgICAgIHRoaXMubGluZVggPSAwOworICAgICAgdGhpcy5saW5lWSA9IDA7CisgICAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDsKKyAgICAgIHRoaXMud29yZFNwYWNpbmcgPSAwOworICAgICAgdGhpcy50ZXh0SFNjYWxlID0gMTsKKyAgICAgIHRoaXMudGV4dFJpc2UgPSAwOworICAgICAgdGhpcy5maWxsQ29sb3IgPSBTVkdfREVGQVVMVFMuZmlsbENvbG9yOworICAgICAgdGhpcy5zdHJva2VDb2xvciA9ICIjMDAwMDAwIjsKKyAgICAgIHRoaXMuZmlsbEFscGhhID0gMTsKKyAgICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxOworICAgICAgdGhpcy5saW5lV2lkdGggPSAxOworICAgICAgdGhpcy5saW5lSm9pbiA9ICIiOworICAgICAgdGhpcy5saW5lQ2FwID0gIiI7CisgICAgICB0aGlzLm1pdGVyTGltaXQgPSAwOworICAgICAgdGhpcy5kYXNoQXJyYXkgPSBbXTsKKyAgICAgIHRoaXMuZGFzaFBoYXNlID0gMDsKKyAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107CisgICAgICB0aGlzLmFjdGl2ZUNsaXBVcmwgPSBudWxsOworICAgICAgdGhpcy5jbGlwR3JvdXAgPSBudWxsOworICAgICAgdGhpcy5tYXNrSWQgPSAiIjsKKyAgICB9CisKKyAgICBjbG9uZSgpIHsKKyAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpOworICAgIH0KKworICAgIHNldEN1cnJlbnRQb2ludCh4LCB5KSB7CisgICAgICB0aGlzLnggPSB4OworICAgICAgdGhpcy55ID0geTsKKyAgICB9CisKKyAgfQorCisgIGZ1bmN0aW9uIG9wTGlzdFRvVHJlZShvcExpc3QpIHsKKyAgICBsZXQgb3BUcmVlID0gW107CisgICAgY29uc3QgdG1wID0gW107CisKKyAgICBmb3IgKGNvbnN0IG9wTGlzdEVsZW1lbnQgb2Ygb3BMaXN0KSB7CisgICAgICBpZiAob3BMaXN0RWxlbWVudC5mbiA9PT0gInNhdmUiKSB7CisgICAgICAgIG9wVHJlZS5wdXNoKHsKKyAgICAgICAgICBmbklkOiA5MiwKKyAgICAgICAgICBmbjogImdyb3VwIiwKKyAgICAgICAgICBpdGVtczogW10KKyAgICAgICAgfSk7CisgICAgICAgIHRtcC5wdXNoKG9wVHJlZSk7CisgICAgICAgIG9wVHJlZSA9IG9wVHJlZVtvcFRyZWUubGVuZ3RoIC0gMV0uaXRlbXM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAob3BMaXN0RWxlbWVudC5mbiA9PT0gInJlc3RvcmUiKSB7CisgICAgICAgIG9wVHJlZSA9IHRtcC5wb3AoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9wVHJlZS5wdXNoKG9wTGlzdEVsZW1lbnQpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvcFRyZWU7CisgIH0KKworICBmdW5jdGlvbiBwZih2YWx1ZSkgeworICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkgeworICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgY29uc3QgcyA9IHZhbHVlLnRvRml4ZWQoMTApOworICAgIGxldCBpID0gcy5sZW5ndGggLSAxOworCisgICAgaWYgKHNbaV0gIT09ICIwIikgeworICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgZG8geworICAgICAgaS0tOworICAgIH0gd2hpbGUgKHNbaV0gPT09ICIwIik7CisKKyAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgc1tpXSA9PT0gIi4iID8gaSA6IGkgKyAxKTsKKyAgfQorCisgIGZ1bmN0aW9uIHBtKG0pIHsKKyAgICBpZiAobVs0XSA9PT0gMCAmJiBtWzVdID09PSAwKSB7CisgICAgICBpZiAobVsxXSA9PT0gMCAmJiBtWzJdID09PSAwKSB7CisgICAgICAgIGlmIChtWzBdID09PSAxICYmIG1bM10gPT09IDEpIHsKKyAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYHNjYWxlKCR7cGYobVswXSl9ICR7cGYobVszXSl9KWA7CisgICAgICB9CisKKyAgICAgIGlmIChtWzBdID09PSBtWzNdICYmIG1bMV0gPT09IC1tWzJdKSB7CisgICAgICAgIGNvbnN0IGEgPSBNYXRoLmFjb3MobVswXSkgKiAxODAgLyBNYXRoLlBJOworICAgICAgICByZXR1cm4gYHJvdGF0ZSgke3BmKGEpfSlgOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobVswXSA9PT0gMSAmJiBtWzFdID09PSAwICYmIG1bMl0gPT09IDAgJiYgbVszXSA9PT0gMSkgeworICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3BmKG1bNF0pfSAke3BmKG1bNV0pfSlgOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBgbWF0cml4KCR7cGYobVswXSl9ICR7cGYobVsxXSl9ICR7cGYobVsyXSl9ICR7cGYobVszXSl9ICR7cGYobVs0XSl9IGAgKyBgJHtwZihtWzVdKX0pYDsKKyAgfQorCisgIGxldCBjbGlwQ291bnQgPSAwOworICBsZXQgbWFza0NvdW50ID0gMDsKKyAgbGV0IHNoYWRpbmdDb3VudCA9IDA7CisgIGV4cG9ydHMuU1ZHR3JhcGhpY3MgPSBTVkdHcmFwaGljcyA9IGNsYXNzIFNWR0dyYXBoaWNzIHsKKyAgICBjb25zdHJ1Y3Rvcihjb21tb25PYmpzLCBvYmpzLCBmb3JjZURhdGFTY2hlbWEgPSBmYWxzZSkgeworICAgICAgdGhpcy5zdmdGYWN0b3J5ID0gbmV3IF9kaXNwbGF5X3V0aWxzLkRPTVNWR0ZhY3RvcnkoKTsKKyAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBTVkdFeHRyYVN0YXRlKCk7CisgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sgPSBbXTsKKyAgICAgIHRoaXMuZXh0cmFTdGFjayA9IFtdOworICAgICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqczsKKyAgICAgIHRoaXMub2JqcyA9IG9ianM7CisgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDsKKyAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlOworICAgICAgdGhpcy5lbWJlZEZvbnRzID0gZmFsc2U7CisgICAgICB0aGlzLmVtYmVkZGVkRm9udHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgdGhpcy5jc3NTdHlsZSA9IG51bGw7CisgICAgICB0aGlzLmZvcmNlRGF0YVNjaGVtYSA9ICEhZm9yY2VEYXRhU2NoZW1hOworICAgICAgdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmcgPSBbXTsKKworICAgICAgZm9yIChjb25zdCBvcCBpbiBfdXRpbC5PUFMpIHsKKyAgICAgICAgdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmdbX3V0aWwuT1BTW29wXV0gPSBvcDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzYXZlKCkgeworICAgICAgdGhpcy50cmFuc2Zvcm1TdGFjay5wdXNoKHRoaXMudHJhbnNmb3JtTWF0cml4KTsKKyAgICAgIGNvbnN0IG9sZCA9IHRoaXMuY3VycmVudDsKKyAgICAgIHRoaXMuZXh0cmFTdGFjay5wdXNoKG9sZCk7CisgICAgICB0aGlzLmN1cnJlbnQgPSBvbGQuY2xvbmUoKTsKKyAgICB9CisKKyAgICByZXN0b3JlKCkgeworICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSB0aGlzLnRyYW5zZm9ybVN0YWNrLnBvcCgpOworICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5leHRyYVN0YWNrLnBvcCgpOworICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7CisgICAgICB0aGlzLnRncnAgPSBudWxsOworICAgIH0KKworICAgIGdyb3VwKGl0ZW1zKSB7CisgICAgICB0aGlzLnNhdmUoKTsKKyAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZShpdGVtcyk7CisgICAgICB0aGlzLnJlc3RvcmUoKTsKKyAgICB9CisKKyAgICBsb2FkRGVwZW5kZW5jaWVzKG9wZXJhdG9yTGlzdCkgeworICAgICAgY29uc3QgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5OworICAgICAgY29uc3QgYXJnc0FycmF5ID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheTsKKworICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZm5BcnJheS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGlmIChmbkFycmF5W2ldICE9PSBfdXRpbC5PUFMuZGVwZW5kZW5jeSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChjb25zdCBvYmogb2YgYXJnc0FycmF5W2ldKSB7CisgICAgICAgICAgY29uc3Qgb2Jqc1Bvb2wgPSBvYmouc3RhcnRzV2l0aCgiZ18iKSA/IHRoaXMuY29tbW9uT2JqcyA6IHRoaXMub2JqczsKKyAgICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7CisgICAgICAgICAgICBvYmpzUG9vbC5nZXQob2JqLCByZXNvbHZlKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICB0aGlzLmN1cnJlbnQuZGVwZW5kZW5jaWVzLnB1c2gocHJvbWlzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuY3VycmVudC5kZXBlbmRlbmNpZXMpOworICAgIH0KKworICAgIHRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7CisgICAgICBjb25zdCB0cmFuc2Zvcm1NYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07CisgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IF91dGlsLlV0aWwudHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4LCB0cmFuc2Zvcm1NYXRyaXgpOworICAgICAgdGhpcy50Z3JwID0gbnVsbDsKKyAgICB9CisKKyAgICBnZXRTVkcob3BlcmF0b3JMaXN0LCB2aWV3cG9ydCkgeworICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0OworCisgICAgICBjb25zdCBzdmdFbGVtZW50ID0gdGhpcy5faW5pdGlhbGl6ZSh2aWV3cG9ydCk7CisKKyAgICAgIHJldHVybiB0aGlzLmxvYWREZXBlbmRlbmNpZXMob3BlcmF0b3JMaXN0KS50aGVuKCgpID0+IHsKKyAgICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7CisgICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSk7CisgICAgICAgIHJldHVybiBzdmdFbGVtZW50OworICAgICAgfSk7CisgICAgfQorCisgICAgY29udmVydE9wTGlzdChvcGVyYXRvckxpc3QpIHsKKyAgICAgIGNvbnN0IG9wZXJhdG9ySWRNYXBwaW5nID0gdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmc7CisgICAgICBjb25zdCBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5OworICAgICAgY29uc3QgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5OworICAgICAgY29uc3Qgb3BMaXN0ID0gW107CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb25zdCBmbklkID0gZm5BcnJheVtpXTsKKyAgICAgICAgb3BMaXN0LnB1c2goeworICAgICAgICAgIGZuSWQsCisgICAgICAgICAgZm46IG9wZXJhdG9ySWRNYXBwaW5nW2ZuSWRdLAorICAgICAgICAgIGFyZ3M6IGFyZ3NBcnJheVtpXQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG9wTGlzdFRvVHJlZShvcExpc3QpOworICAgIH0KKworICAgIGV4ZWN1dGVPcFRyZWUob3BUcmVlKSB7CisgICAgICBmb3IgKGNvbnN0IG9wVHJlZUVsZW1lbnQgb2Ygb3BUcmVlKSB7CisgICAgICAgIGNvbnN0IGZuID0gb3BUcmVlRWxlbWVudC5mbjsKKyAgICAgICAgY29uc3QgZm5JZCA9IG9wVHJlZUVsZW1lbnQuZm5JZDsKKyAgICAgICAgY29uc3QgYXJncyA9IG9wVHJlZUVsZW1lbnQuYXJnczsKKworICAgICAgICBzd2l0Y2ggKGZuSWQgfCAwKSB7CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5UZXh0OgorICAgICAgICAgICAgdGhpcy5iZWdpblRleHQoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZGVwZW5kZW5jeToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGVhZGluZzoKKyAgICAgICAgICAgIHRoaXMuc2V0TGVhZGluZyhhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGVhZGluZ01vdmVUZXh0OgorICAgICAgICAgICAgdGhpcy5zZXRMZWFkaW5nTW92ZVRleHQoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZvbnQ6CisgICAgICAgICAgICB0aGlzLnNldEZvbnQoYXJncyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNob3dUZXh0OgorICAgICAgICAgICAgdGhpcy5zaG93VGV4dChhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hvd1NwYWNlZFRleHQ6CisgICAgICAgICAgICB0aGlzLnNob3dUZXh0KGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRUZXh0OgorICAgICAgICAgICAgdGhpcy5lbmRUZXh0KCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1vdmVUZXh0OgorICAgICAgICAgICAgdGhpcy5tb3ZlVGV4dChhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0Q2hhclNwYWNpbmc6CisgICAgICAgICAgICB0aGlzLnNldENoYXJTcGFjaW5nKGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRXb3JkU3BhY2luZzoKKyAgICAgICAgICAgIHRoaXMuc2V0V29yZFNwYWNpbmcoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEhTY2FsZToKKyAgICAgICAgICAgIHRoaXMuc2V0SFNjYWxlKGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0TWF0cml4OgorICAgICAgICAgICAgdGhpcy5zZXRUZXh0TWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0UmlzZToKKyAgICAgICAgICAgIHRoaXMuc2V0VGV4dFJpc2UoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOgorICAgICAgICAgICAgdGhpcy5zZXRUZXh0UmVuZGVyaW5nTW9kZShhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGluZVdpZHRoOgorICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExpbmVKb2luOgorICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGluZUNhcDoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TWl0ZXJMaW1pdDoKKyAgICAgICAgICAgIHRoaXMuc2V0TWl0ZXJMaW1pdChhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yOgorICAgICAgICAgICAgdGhpcy5zZXRGaWxsUkdCQ29sb3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOgorICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VSR0JDb2xvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3JOOgorICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VDb2xvck4oYXJncyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDb2xvck46CisgICAgICAgICAgICB0aGlzLnNldEZpbGxDb2xvck4oYXJncyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNoYWRpbmdGaWxsOgorICAgICAgICAgICAgdGhpcy5zaGFkaW5nRmlsbChhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RGFzaDoKKyAgICAgICAgICAgIHRoaXMuc2V0RGFzaChhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0UmVuZGVyaW5nSW50ZW50OgorICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZsYXRuZXNzOgorICAgICAgICAgICAgdGhpcy5zZXRGbGF0bmVzcyhhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0R1N0YXRlOgorICAgICAgICAgICAgdGhpcy5zZXRHU3RhdGUoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmZpbGw6CisgICAgICAgICAgICB0aGlzLmZpbGwoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW9GaWxsOgorICAgICAgICAgICAgdGhpcy5lb0ZpbGwoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc3Ryb2tlOgorICAgICAgICAgICAgdGhpcy5zdHJva2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZmlsbFN0cm9rZToKKyAgICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lb0ZpbGxTdHJva2U6CisgICAgICAgICAgICB0aGlzLmVvRmlsbFN0cm9rZSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbGlwOgorICAgICAgICAgICAgdGhpcy5jbGlwKCJub256ZXJvIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVvQ2xpcDoKKyAgICAgICAgICAgIHRoaXMuY2xpcCgiZXZlbm9kZCIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6CisgICAgICAgICAgICB0aGlzLnBhaW50U29saWRDb2xvckltYWdlTWFzaygpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludEltYWdlWE9iamVjdDoKKyAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZVhPYmplY3QoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OgorICAgICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OgorICAgICAgICAgICAgdGhpcy5wYWludEltYWdlTWFza1hPYmplY3QoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50Rm9ybVhPYmplY3RCZWdpbjoKKyAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEJlZ2luKGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludEZvcm1YT2JqZWN0RW5kOgorICAgICAgICAgICAgdGhpcy5wYWludEZvcm1YT2JqZWN0RW5kKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDoKKyAgICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlU3Ryb2tlOgorICAgICAgICAgICAgdGhpcy5jbG9zZVN0cm9rZSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZUZpbGxTdHJva2U6CisgICAgICAgICAgICB0aGlzLmNsb3NlRmlsbFN0cm9rZSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZUVPRmlsbFN0cm9rZToKKyAgICAgICAgICAgIHRoaXMuY2xvc2VFT0ZpbGxTdHJva2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmU6CisgICAgICAgICAgICB0aGlzLm5leHRMaW5lKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnRyYW5zZm9ybToKKyAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jb25zdHJ1Y3RQYXRoOgorICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RQYXRoKGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRQYXRoOgorICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgOTI6CisgICAgICAgICAgICB0aGlzLmdyb3VwKG9wVHJlZUVsZW1lbnQuaXRlbXMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBVbmltcGxlbWVudGVkIG9wZXJhdG9yICR7Zm59YCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHNldFdvcmRTcGFjaW5nKHdvcmRTcGFjaW5nKSB7CisgICAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZzsKKyAgICB9CisKKyAgICBzZXRDaGFyU3BhY2luZyhjaGFyU3BhY2luZykgeworICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gY2hhclNwYWNpbmc7CisgICAgfQorCisgICAgbmV4dExpbmUoKSB7CisgICAgICB0aGlzLm1vdmVUZXh0KDAsIHRoaXMuY3VycmVudC5sZWFkaW5nKTsKKyAgICB9CisKKyAgICBzZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICBjdXJyZW50LnRleHRNYXRyaXggPSBjdXJyZW50LmxpbmVNYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07CisgICAgICBjdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTsKKyAgICAgIGN1cnJlbnQueCA9IGN1cnJlbnQubGluZVggPSAwOworICAgICAgY3VycmVudC55ID0gY3VycmVudC5saW5lWSA9IDA7CisgICAgICBjdXJyZW50Lnhjb29yZHMgPSBbXTsKKyAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdOworICAgICAgY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTsKKyAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZvbnQtZmFtaWx5IiwgY3VycmVudC5mb250RmFtaWx5KTsKKyAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZvbnQtc2l6ZSIsIGAke3BmKGN1cnJlbnQuZm9udFNpemUpfXB4YCk7CisgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgcGYoLWN1cnJlbnQueSkpOworICAgICAgY3VycmVudC50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0ZXh0Iik7CisgICAgICBjdXJyZW50LnR4dEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3VycmVudC50c3Bhbik7CisgICAgfQorCisgICAgYmVnaW5UZXh0KCkgeworICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgIGN1cnJlbnQueCA9IGN1cnJlbnQubGluZVggPSAwOworICAgICAgY3VycmVudC55ID0gY3VycmVudC5saW5lWSA9IDA7CisgICAgICBjdXJyZW50LnRleHRNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7CisgICAgICBjdXJyZW50LmxpbmVNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7CisgICAgICBjdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IDE7CisgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpOworICAgICAgY3VycmVudC50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0ZXh0Iik7CisgICAgICBjdXJyZW50LnR4dGdycCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZyIpOworICAgICAgY3VycmVudC54Y29vcmRzID0gW107CisgICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTsKKyAgICB9CisKKyAgICBtb3ZlVGV4dCh4LCB5KSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgY3VycmVudC54ID0gY3VycmVudC5saW5lWCArPSB4OworICAgICAgY3VycmVudC55ID0gY3VycmVudC5saW5lWSArPSB5OworICAgICAgY3VycmVudC54Y29vcmRzID0gW107CisgICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTsKKyAgICAgIGN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7CisgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LWZhbWlseSIsIGN1cnJlbnQuZm9udEZhbWlseSk7CisgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LXNpemUiLCBgJHtwZihjdXJyZW50LmZvbnRTaXplKX1weGApOworICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsIHBmKC1jdXJyZW50LnkpKTsKKyAgICB9CisKKyAgICBzaG93VGV4dChnbHlwaHMpIHsKKyAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250OworICAgICAgY29uc3QgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplOworCisgICAgICBpZiAoZm9udFNpemUgPT09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlOworICAgICAgY29uc3QgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nOworICAgICAgY29uc3Qgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nOworICAgICAgY29uc3QgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjsKKyAgICAgIGNvbnN0IHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uOworICAgICAgY29uc3QgdmVydGljYWwgPSBmb250LnZlcnRpY2FsOworICAgICAgY29uc3Qgc3BhY2luZ0RpciA9IHZlcnRpY2FsID8gMSA6IC0xOworICAgICAgY29uc3QgZGVmYXVsdFZNZXRyaWNzID0gZm9udC5kZWZhdWx0Vk1ldHJpY3M7CisgICAgICBjb25zdCB3aWR0aEFkdmFuY2VTY2FsZSA9IGZvbnRTaXplICogY3VycmVudC5mb250TWF0cml4WzBdOworICAgICAgbGV0IHggPSAwOworCisgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykgeworICAgICAgICBpZiAoZ2x5cGggPT09IG51bGwpIHsKKyAgICAgICAgICB4ICs9IGZvbnREaXJlY3Rpb24gKiB3b3JkU3BhY2luZzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNOdW0pKGdseXBoKSkgeworICAgICAgICAgIHggKz0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nOworICAgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbHlwaC5mb250Q2hhcjsKKyAgICAgICAgbGV0IHNjYWxlZFgsIHNjYWxlZFk7CisgICAgICAgIGxldCB3aWR0aCA9IGdseXBoLndpZHRoOworCisgICAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICAgIGxldCB2eDsKKyAgICAgICAgICBjb25zdCB2bWV0cmljID0gZ2x5cGgudm1ldHJpYyB8fCBkZWZhdWx0Vk1ldHJpY3M7CisgICAgICAgICAgdnggPSBnbHlwaC52bWV0cmljID8gdm1ldHJpY1sxXSA6IHdpZHRoICogMC41OworICAgICAgICAgIHZ4ID0gLXZ4ICogd2lkdGhBZHZhbmNlU2NhbGU7CisgICAgICAgICAgY29uc3QgdnkgPSB2bWV0cmljWzJdICogd2lkdGhBZHZhbmNlU2NhbGU7CisgICAgICAgICAgd2lkdGggPSB2bWV0cmljID8gLXZtZXRyaWNbMF0gOiB3aWR0aDsKKyAgICAgICAgICBzY2FsZWRYID0gdnggLyBmb250U2l6ZVNjYWxlOworICAgICAgICAgIHNjYWxlZFkgPSAoeCArIHZ5KSAvIGZvbnRTaXplU2NhbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2NhbGVkWCA9IHggLyBmb250U2l6ZVNjYWxlOworICAgICAgICAgIHNjYWxlZFkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdseXBoLmlzSW5Gb250IHx8IGZvbnQubWlzc2luZ0ZpbGUpIHsKKyAgICAgICAgICBjdXJyZW50Lnhjb29yZHMucHVzaChjdXJyZW50LnggKyBzY2FsZWRYKTsKKworICAgICAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICAgICAgY3VycmVudC55Y29vcmRzLnB1c2goLWN1cnJlbnQueSArIHNjYWxlZFkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnQudHNwYW4udGV4dENvbnRlbnQgKz0gY2hhcmFjdGVyOworICAgICAgICB9IGVsc2Uge30KKworICAgICAgICBsZXQgY2hhcldpZHRoOworCisgICAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICAgIGNoYXJXaWR0aCA9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgLSBzcGFjaW5nICogZm9udERpcmVjdGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICB4ICs9IGNoYXJXaWR0aDsKKyAgICAgIH0KKworICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieCIsIGN1cnJlbnQueGNvb3Jkcy5tYXAocGYpLmpvaW4oIiAiKSk7CisKKyAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgY3VycmVudC55Y29vcmRzLm1hcChwZikuam9pbigiICIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCBwZigtY3VycmVudC55KSk7CisgICAgICB9CisKKyAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICBjdXJyZW50LnkgLT0geDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnQueCArPSB4ICogdGV4dEhTY2FsZTsKKyAgICAgIH0KKworICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZm9udC1mYW1pbHkiLCBjdXJyZW50LmZvbnRGYW1pbHkpOworICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZm9udC1zaXplIiwgYCR7cGYoY3VycmVudC5mb250U2l6ZSl9cHhgKTsKKworICAgICAgaWYgKGN1cnJlbnQuZm9udFN0eWxlICE9PSBTVkdfREVGQVVMVFMuZm9udFN0eWxlKSB7CisgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZvbnQtc3R5bGUiLCBjdXJyZW50LmZvbnRTdHlsZSk7CisgICAgICB9CisKKyAgICAgIGlmIChjdXJyZW50LmZvbnRXZWlnaHQgIT09IFNWR19ERUZBVUxUUy5mb250V2VpZ2h0KSB7CisgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZvbnQtd2VpZ2h0IiwgY3VycmVudC5mb250V2VpZ2h0KTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSzsKKworICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkgeworICAgICAgICBpZiAoY3VycmVudC5maWxsQ29sb3IgIT09IFNWR19ERUZBVUxUUy5maWxsQ29sb3IpIHsKKyAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgY3VycmVudC5maWxsQ29sb3IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnQuZmlsbEFscGhhIDwgMSkgeworICAgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwtb3BhY2l0eSIsIGN1cnJlbnQuZmlsbEFscGhhKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSCkgeworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgInRyYW5zcGFyZW50Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgIm5vbmUiKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7CisgICAgICAgIGNvbnN0IGxpbmVXaWR0aFNjYWxlID0gMSAvIChjdXJyZW50LnRleHRNYXRyaXhTY2FsZSB8fCAxKTsKKworICAgICAgICB0aGlzLl9zZXRTdHJva2VBdHRyaWJ1dGVzKGN1cnJlbnQudHNwYW4sIGxpbmVXaWR0aFNjYWxlKTsKKyAgICAgIH0KKworICAgICAgbGV0IHRleHRNYXRyaXggPSBjdXJyZW50LnRleHRNYXRyaXg7CisKKyAgICAgIGlmIChjdXJyZW50LnRleHRSaXNlICE9PSAwKSB7CisgICAgICAgIHRleHRNYXRyaXggPSB0ZXh0TWF0cml4LnNsaWNlKCk7CisgICAgICAgIHRleHRNYXRyaXhbNV0gKz0gY3VycmVudC50ZXh0UmlzZTsKKyAgICAgIH0KKworICAgICAgY3VycmVudC50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ0cmFuc2Zvcm0iLCBgJHtwbSh0ZXh0TWF0cml4KX0gc2NhbGUoJHtwZih0ZXh0SFNjYWxlKX0sIC0xKWApOworICAgICAgY3VycmVudC50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhNTF9OUywgInhtbDpzcGFjZSIsICJwcmVzZXJ2ZSIpOworICAgICAgY3VycmVudC50eHRFbGVtZW50LmFwcGVuZENoaWxkKGN1cnJlbnQudHNwYW4pOworICAgICAgY3VycmVudC50eHRncnAuYXBwZW5kQ2hpbGQoY3VycmVudC50eHRFbGVtZW50KTsKKworICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChjdXJyZW50LnR4dEVsZW1lbnQpOworICAgIH0KKworICAgIHNldExlYWRpbmdNb3ZlVGV4dCh4LCB5KSB7CisgICAgICB0aGlzLnNldExlYWRpbmcoLXkpOworICAgICAgdGhpcy5tb3ZlVGV4dCh4LCB5KTsKKyAgICB9CisKKyAgICBhZGRGb250U3R5bGUoZm9udE9iaikgeworICAgICAgaWYgKCFmb250T2JqLmRhdGEpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhZGRGb250U3R5bGU6IE5vIGZvbnQgZGF0YSBhdmFpbGFibGUsICIgKyAnZW5zdXJlIHRoYXQgdGhlICJmb250RXh0cmFQcm9wZXJ0aWVzIiBBUEkgcGFyYW1ldGVyIGlzIHNldC4nKTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLmNzc1N0eWxlKSB7CisgICAgICAgIHRoaXMuY3NzU3R5bGUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnN0eWxlIik7CisgICAgICAgIHRoaXMuY3NzU3R5bGUuc2V0QXR0cmlidXRlTlMobnVsbCwgInR5cGUiLCAidGV4dC9jc3MiKTsKKyAgICAgICAgdGhpcy5kZWZzLmFwcGVuZENoaWxkKHRoaXMuY3NzU3R5bGUpOworICAgICAgfQorCisgICAgICBjb25zdCB1cmwgPSAoMCwgX3V0aWwuY3JlYXRlT2JqZWN0VVJMKShmb250T2JqLmRhdGEsIGZvbnRPYmoubWltZXR5cGUsIHRoaXMuZm9yY2VEYXRhU2NoZW1hKTsKKyAgICAgIHRoaXMuY3NzU3R5bGUudGV4dENvbnRlbnQgKz0gYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogIiR7Zm9udE9iai5sb2FkZWROYW1lfSI7YCArIGAgc3JjOiB1cmwoJHt1cmx9KTsgfVxuYDsKKyAgICB9CisKKyAgICBzZXRGb250KGRldGFpbHMpIHsKKyAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICBjb25zdCBmb250T2JqID0gdGhpcy5jb21tb25PYmpzLmdldChkZXRhaWxzWzBdKTsKKyAgICAgIGxldCBzaXplID0gZGV0YWlsc1sxXTsKKyAgICAgIGN1cnJlbnQuZm9udCA9IGZvbnRPYmo7CisKKyAgICAgIGlmICh0aGlzLmVtYmVkRm9udHMgJiYgIWZvbnRPYmoubWlzc2luZ0ZpbGUgJiYgIXRoaXMuZW1iZWRkZWRGb250c1tmb250T2JqLmxvYWRlZE5hbWVdKSB7CisgICAgICAgIHRoaXMuYWRkRm9udFN0eWxlKGZvbnRPYmopOworICAgICAgICB0aGlzLmVtYmVkZGVkRm9udHNbZm9udE9iai5sb2FkZWROYW1lXSA9IGZvbnRPYmo7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQuZm9udE1hdHJpeCA9IGZvbnRPYmouZm9udE1hdHJpeCA/IGZvbnRPYmouZm9udE1hdHJpeCA6IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgbGV0IGJvbGQgPSAibm9ybWFsIjsKKworICAgICAgaWYgKGZvbnRPYmouYmxhY2spIHsKKyAgICAgICAgYm9sZCA9ICI5MDAiOworICAgICAgfSBlbHNlIGlmIChmb250T2JqLmJvbGQpIHsKKyAgICAgICAgYm9sZCA9ICJib2xkIjsKKyAgICAgIH0KKworICAgICAgY29uc3QgaXRhbGljID0gZm9udE9iai5pdGFsaWMgPyAiaXRhbGljIiA6ICJub3JtYWwiOworCisgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgc2l6ZSA9IC1zaXplOworICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAtMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IDE7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQuZm9udFNpemUgPSBzaXplOworICAgICAgY3VycmVudC5mb250RmFtaWx5ID0gZm9udE9iai5sb2FkZWROYW1lOworICAgICAgY3VycmVudC5mb250V2VpZ2h0ID0gYm9sZDsKKyAgICAgIGN1cnJlbnQuZm9udFN0eWxlID0gaXRhbGljOworICAgICAgY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTsKKyAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCBwZigtY3VycmVudC55KSk7CisgICAgICBjdXJyZW50Lnhjb29yZHMgPSBbXTsKKyAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdOworICAgIH0KKworICAgIGVuZFRleHQoKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworCisgICAgICBpZiAoY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcgJiYgY3VycmVudC50eHRFbGVtZW50ICYmIGN1cnJlbnQudHh0RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgY3VycmVudC5lbGVtZW50ID0gY3VycmVudC50eHRFbGVtZW50OworICAgICAgICB0aGlzLmNsaXAoIm5vbnplcm8iKTsKKyAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICB9CisgICAgfQorCisgICAgc2V0TGluZVdpZHRoKHdpZHRoKSB7CisgICAgICBpZiAod2lkdGggPiAwKSB7CisgICAgICAgIHRoaXMuY3VycmVudC5saW5lV2lkdGggPSB3aWR0aDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzZXRMaW5lQ2FwKHN0eWxlKSB7CisgICAgICB0aGlzLmN1cnJlbnQubGluZUNhcCA9IExJTkVfQ0FQX1NUWUxFU1tzdHlsZV07CisgICAgfQorCisgICAgc2V0TGluZUpvaW4oc3R5bGUpIHsKKyAgICAgIHRoaXMuY3VycmVudC5saW5lSm9pbiA9IExJTkVfSk9JTl9TVFlMRVNbc3R5bGVdOworICAgIH0KKworICAgIHNldE1pdGVyTGltaXQobGltaXQpIHsKKyAgICAgIHRoaXMuY3VycmVudC5taXRlckxpbWl0ID0gbGltaXQ7CisgICAgfQorCisgICAgc2V0U3Ryb2tlQWxwaGEoc3Ryb2tlQWxwaGEpIHsKKyAgICAgIHRoaXMuY3VycmVudC5zdHJva2VBbHBoYSA9IHN0cm9rZUFscGhhOworICAgIH0KKworICAgIHNldFN0cm9rZVJHQkNvbG9yKHIsIGcsIGIpIHsKKyAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyLCBnLCBiKTsKKyAgICB9CisKKyAgICBzZXRGaWxsQWxwaGEoZmlsbEFscGhhKSB7CisgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gZmlsbEFscGhhOworICAgIH0KKworICAgIHNldEZpbGxSR0JDb2xvcihyLCBnLCBiKSB7CisgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKHIsIGcsIGIpOworICAgICAgdGhpcy5jdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpOworICAgICAgdGhpcy5jdXJyZW50Lnhjb29yZHMgPSBbXTsKKyAgICAgIHRoaXMuY3VycmVudC55Y29vcmRzID0gW107CisgICAgfQorCisgICAgc2V0U3Ryb2tlQ29sb3JOKGFyZ3MpIHsKKyAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuX21ha2VDb2xvck5fUGF0dGVybihhcmdzKTsKKyAgICB9CisKKyAgICBzZXRGaWxsQ29sb3JOKGFyZ3MpIHsKKyAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLl9tYWtlQ29sb3JOX1BhdHRlcm4oYXJncyk7CisgICAgfQorCisgICAgc2hhZGluZ0ZpbGwoYXJncykgeworICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnZpZXdwb3J0LndpZHRoOworICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy52aWV3cG9ydC5oZWlnaHQ7CisKKyAgICAgIGNvbnN0IGludiA9IF91dGlsLlV0aWwuaW52ZXJzZVRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7CisKKyAgICAgIGNvbnN0IGJsID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIGludik7CisKKyAgICAgIGNvbnN0IGJyID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgaGVpZ2h0XSwgaW52KTsKKworICAgICAgY29uc3QgdWwgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt3aWR0aCwgMF0sIGludik7CisKKyAgICAgIGNvbnN0IHVyID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIGhlaWdodF0sIGludik7CisKKyAgICAgIGNvbnN0IHgwID0gTWF0aC5taW4oYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pOworICAgICAgY29uc3QgeTAgPSBNYXRoLm1pbihibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7CisgICAgICBjb25zdCB4MSA9IE1hdGgubWF4KGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTsKKyAgICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pOworICAgICAgY29uc3QgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieCIsIHgwKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCB5MCk7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ3aWR0aCIsIHgxIC0geDApOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgeTEgLSB5MCk7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgdGhpcy5fbWFrZVNoYWRpbmdQYXR0ZXJuKGFyZ3MpKTsKKworICAgICAgaWYgKHRoaXMuY3VycmVudC5maWxsQWxwaGEgPCAxKSB7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwtb3BhY2l0eSIsIHRoaXMuY3VycmVudC5maWxsQWxwaGEpOworICAgICAgfQorCisgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKHJlY3QpOworICAgIH0KKworICAgIF9tYWtlQ29sb3JOX1BhdHRlcm4oYXJncykgeworICAgICAgaWYgKGFyZ3NbMF0gPT09ICJUaWxpbmdQYXR0ZXJuIikgeworICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVRpbGluZ1BhdHRlcm4oYXJncyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4oYXJncyk7CisgICAgfQorCisgICAgX21ha2VUaWxpbmdQYXR0ZXJuKGFyZ3MpIHsKKyAgICAgIGNvbnN0IGNvbG9yID0gYXJnc1sxXTsKKyAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IGFyZ3NbMl07CisgICAgICBjb25zdCBtYXRyaXggPSBhcmdzWzNdIHx8IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICAgIGNvbnN0IFt4MCwgeTAsIHgxLCB5MV0gPSBhcmdzWzRdOworICAgICAgY29uc3QgeHN0ZXAgPSBhcmdzWzVdOworICAgICAgY29uc3QgeXN0ZXAgPSBhcmdzWzZdOworICAgICAgY29uc3QgcGFpbnRUeXBlID0gYXJnc1s3XTsKKyAgICAgIGNvbnN0IHRpbGluZ0lkID0gYHNoYWRpbmcke3NoYWRpbmdDb3VudCsrfWA7CisKKyAgICAgIGNvbnN0IFt0eDAsIHR5MF0gPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt4MCwgeTBdLCBtYXRyaXgpOworCisgICAgICBjb25zdCBbdHgxLCB0eTFdID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbeDEsIHkxXSwgbWF0cml4KTsKKworICAgICAgY29uc3QgW3hzY2FsZSwgeXNjYWxlXSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobWF0cml4KTsKKworICAgICAgY29uc3QgdHhzdGVwID0geHN0ZXAgKiB4c2NhbGU7CisgICAgICBjb25zdCB0eXN0ZXAgPSB5c3RlcCAqIHlzY2FsZTsKKyAgICAgIGNvbnN0IHRpbGluZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cGF0dGVybiIpOworICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsICJpZCIsIHRpbGluZ0lkKTsKKyAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAicGF0dGVyblVuaXRzIiwgInVzZXJTcGFjZU9uVXNlIik7CisgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgdHhzdGVwKTsKKyAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgdHlzdGVwKTsKKyAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieCIsIGAke3R4MH1gKTsKKyAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsIGAke3R5MH1gKTsKKyAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnOworICAgICAgY29uc3QgdHJhbnNmb3JtTWF0cml4ID0gdGhpcy50cmFuc2Zvcm1NYXRyaXg7CisgICAgICBjb25zdCBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yOworICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7CisgICAgICBjb25zdCBiYm94ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh0eDEgLSB0eDAsIHR5MSAtIHR5MCk7CisgICAgICB0aGlzLnN2ZyA9IGJib3g7CisgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IG1hdHJpeDsKKworICAgICAgaWYgKHBhaW50VHlwZSA9PT0gMikgeworICAgICAgICBjb25zdCBjc3NDb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYiguLi5jb2xvcik7CisKKyAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGNzc0NvbG9yOworICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjc3NDb2xvcjsKKyAgICAgIH0KKworICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdChvcGVyYXRvckxpc3QpKTsKKyAgICAgIHRoaXMuc3ZnID0gc3ZnOworICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSB0cmFuc2Zvcm1NYXRyaXg7CisgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gZmlsbENvbG9yOworICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gc3Ryb2tlQ29sb3I7CisgICAgICB0aWxpbmcuYXBwZW5kQ2hpbGQoYmJveC5jaGlsZE5vZGVzWzBdKTsKKyAgICAgIHRoaXMuZGVmcy5hcHBlbmRDaGlsZCh0aWxpbmcpOworICAgICAgcmV0dXJuIGB1cmwoIyR7dGlsaW5nSWR9KWA7CisgICAgfQorCisgICAgX21ha2VTaGFkaW5nUGF0dGVybihhcmdzKSB7CisgICAgICBzd2l0Y2ggKGFyZ3NbMF0pIHsKKyAgICAgICAgY2FzZSAiUmFkaWFsQXhpYWwiOgorICAgICAgICAgIGNvbnN0IHNoYWRpbmdJZCA9IGBzaGFkaW5nJHtzaGFkaW5nQ291bnQrK31gOworICAgICAgICAgIGNvbnN0IGNvbG9yU3RvcHMgPSBhcmdzWzNdOworICAgICAgICAgIGxldCBncmFkaWVudDsKKworICAgICAgICAgIHN3aXRjaCAoYXJnc1sxXSkgeworICAgICAgICAgICAgY2FzZSAiYXhpYWwiOgorICAgICAgICAgICAgICBjb25zdCBwb2ludDAgPSBhcmdzWzRdOworICAgICAgICAgICAgICBjb25zdCBwb2ludDEgPSBhcmdzWzVdOworICAgICAgICAgICAgICBncmFkaWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6bGluZWFyR3JhZGllbnQiKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImlkIiwgc2hhZGluZ0lkKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImdyYWRpZW50VW5pdHMiLCAidXNlclNwYWNlT25Vc2UiKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgIngxIiwgcG9pbnQwWzBdKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInkxIiwgcG9pbnQwWzFdKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgIngyIiwgcG9pbnQxWzBdKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInkyIiwgcG9pbnQxWzFdKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgInJhZGlhbCI6CisgICAgICAgICAgICAgIGNvbnN0IGZvY2FsUG9pbnQgPSBhcmdzWzRdOworICAgICAgICAgICAgICBjb25zdCBjaXJjbGVQb2ludCA9IGFyZ3NbNV07CisgICAgICAgICAgICAgIGNvbnN0IGZvY2FsUmFkaXVzID0gYXJnc1s2XTsKKyAgICAgICAgICAgICAgY29uc3QgY2lyY2xlUmFkaXVzID0gYXJnc1s3XTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJhZGlhbEdyYWRpZW50Iik7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJpZCIsIHNoYWRpbmdJZCk7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJncmFkaWVudFVuaXRzIiwgInVzZXJTcGFjZU9uVXNlIik7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJjeCIsIGNpcmNsZVBvaW50WzBdKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImN5IiwgY2lyY2xlUG9pbnRbMV0pOworICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiciIsIGNpcmNsZVJhZGl1cyk7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmeCIsIGZvY2FsUG9pbnRbMF0pOworICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZnkiLCBmb2NhbFBvaW50WzFdKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZyIiwgZm9jYWxSYWRpdXMpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFJhZGlhbEF4aWFsIHR5cGU6ICR7YXJnc1sxXX1gKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGNvbnN0IGNvbG9yU3RvcCBvZiBjb2xvclN0b3BzKSB7CisgICAgICAgICAgICBjb25zdCBzdG9wID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpzdG9wIik7CisgICAgICAgICAgICBzdG9wLnNldEF0dHJpYnV0ZU5TKG51bGwsICJvZmZzZXQiLCBjb2xvclN0b3BbMF0pOworICAgICAgICAgICAgc3RvcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAic3RvcC1jb2xvciIsIGNvbG9yU3RvcFsxXSk7CisgICAgICAgICAgICBncmFkaWVudC5hcHBlbmRDaGlsZChzdG9wKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQoZ3JhZGllbnQpOworICAgICAgICAgIHJldHVybiBgdXJsKCMke3NoYWRpbmdJZH0pYDsKKworICAgICAgICBjYXNlICJNZXNoIjoKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuaW1wbGVtZW50ZWQgcGF0dGVybiBNZXNoIik7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgY2FzZSAiRHVtbXkiOgorICAgICAgICAgIHJldHVybiAiaG90cGluayI7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSVIgdHlwZTogJHthcmdzWzBdfWApOworICAgICAgfQorICAgIH0KKworICAgIHNldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHsKKyAgICAgIHRoaXMuY3VycmVudC5kYXNoQXJyYXkgPSBkYXNoQXJyYXk7CisgICAgICB0aGlzLmN1cnJlbnQuZGFzaFBoYXNlID0gZGFzaFBoYXNlOworICAgIH0KKworICAgIGNvbnN0cnVjdFBhdGgob3BzLCBhcmdzKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgbGV0IHggPSBjdXJyZW50LngsCisgICAgICAgICAgeSA9IGN1cnJlbnQueTsKKyAgICAgIGxldCBkID0gW107CisgICAgICBsZXQgaiA9IDA7CisKKyAgICAgIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7CisgICAgICAgIHN3aXRjaCAob3AgfCAwKSB7CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucmVjdGFuZ2xlOgorICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2orK107CisgICAgICAgICAgICBjb25zdCB3aWR0aCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIGNvbnN0IHh3ID0geCArIHdpZHRoOworICAgICAgICAgICAgY29uc3QgeWggPSB5ICsgaGVpZ2h0OworICAgICAgICAgICAgZC5wdXNoKCJNIiwgcGYoeCksIHBmKHkpLCAiTCIsIHBmKHh3KSwgcGYoeSksICJMIiwgcGYoeHcpLCBwZih5aCksICJMIiwgcGYoeCksIHBmKHloKSwgIloiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRvOgorICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2orK107CisgICAgICAgICAgICBkLnB1c2goIk0iLCBwZih4KSwgcGYoeSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5saW5lVG86CisgICAgICAgICAgICB4ID0gYXJnc1tqKytdOworICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIGQucHVzaCgiTCIsIHBmKHgpLCBwZih5KSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG86CisgICAgICAgICAgICB4ID0gYXJnc1tqICsgNF07CisgICAgICAgICAgICB5ID0gYXJnc1tqICsgNV07CisgICAgICAgICAgICBkLnB1c2goIkMiLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZihhcmdzW2ogKyAyXSksIHBmKGFyZ3NbaiArIDNdKSwgcGYoeCksIHBmKHkpKTsKKyAgICAgICAgICAgIGogKz0gNjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzI6CisgICAgICAgICAgICBkLnB1c2goIkMiLCBwZih4KSwgcGYoeSksIHBmKGFyZ3Nbal0pLCBwZihhcmdzW2ogKyAxXSksIHBmKGFyZ3NbaiArIDJdKSwgcGYoYXJnc1tqICsgM10pKTsKKyAgICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTsKKyAgICAgICAgICAgIGogKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzM6CisgICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07CisgICAgICAgICAgICB5ID0gYXJnc1tqICsgM107CisgICAgICAgICAgICBkLnB1c2goIkMiLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZih4KSwgcGYoeSksIHBmKHgpLCBwZih5KSk7CisgICAgICAgICAgICBqICs9IDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDoKKyAgICAgICAgICAgIGQucHVzaCgiWiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZCA9IGQuam9pbigiICIpOworCisgICAgICBpZiAoY3VycmVudC5wYXRoICYmIG9wcy5sZW5ndGggPiAwICYmIG9wc1swXSAhPT0gX3V0aWwuT1BTLnJlY3RhbmdsZSAmJiBvcHNbMF0gIT09IF91dGlsLk9QUy5tb3ZlVG8pIHsKKyAgICAgICAgZCA9IGN1cnJlbnQucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCAiZCIpICsgZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnQucGF0aCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cGF0aCIpOworCisgICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoY3VycmVudC5wYXRoKTsKKyAgICAgIH0KKworICAgICAgY3VycmVudC5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICJkIiwgZCk7CisgICAgICBjdXJyZW50LnBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwiLCAibm9uZSIpOworICAgICAgY3VycmVudC5lbGVtZW50ID0gY3VycmVudC5wYXRoOworICAgICAgY3VycmVudC5zZXRDdXJyZW50UG9pbnQoeCwgeSk7CisgICAgfQorCisgICAgZW5kUGF0aCgpIHsKKyAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICBjdXJyZW50LnBhdGggPSBudWxsOworCisgICAgICBpZiAoIXRoaXMucGVuZGluZ0NsaXApIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoIWN1cnJlbnQuZWxlbWVudCkgeworICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBjbGlwSWQgPSBgY2xpcHBhdGgke2NsaXBDb3VudCsrfWA7CisgICAgICBjb25zdCBjbGlwUGF0aCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6Y2xpcFBhdGgiKTsKKyAgICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICJpZCIsIGNsaXBJZCk7CisgICAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAidHJhbnNmb3JtIiwgcG0odGhpcy50cmFuc2Zvcm1NYXRyaXgpKTsKKyAgICAgIGNvbnN0IGNsaXBFbGVtZW50ID0gY3VycmVudC5lbGVtZW50LmNsb25lTm9kZSh0cnVlKTsKKworICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXAgPT09ICJldmVub2RkIikgeworICAgICAgICBjbGlwRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiY2xpcC1ydWxlIiwgImV2ZW5vZGQiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNsaXBFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJjbGlwLXJ1bGUiLCAibm9uemVybyIpOworICAgICAgfQorCisgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDsKKyAgICAgIGNsaXBQYXRoLmFwcGVuZENoaWxkKGNsaXBFbGVtZW50KTsKKyAgICAgIHRoaXMuZGVmcy5hcHBlbmRDaGlsZChjbGlwUGF0aCk7CisKKyAgICAgIGlmIChjdXJyZW50LmFjdGl2ZUNsaXBVcmwpIHsKKyAgICAgICAgY3VycmVudC5jbGlwR3JvdXAgPSBudWxsOworICAgICAgICB0aGlzLmV4dHJhU3RhY2suZm9yRWFjaChmdW5jdGlvbiAocHJldikgeworICAgICAgICAgIHByZXYuY2xpcEdyb3VwID0gbnVsbDsKKyAgICAgICAgfSk7CisgICAgICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICJjbGlwLXBhdGgiLCBjdXJyZW50LmFjdGl2ZUNsaXBVcmwpOworICAgICAgfQorCisgICAgICBjdXJyZW50LmFjdGl2ZUNsaXBVcmwgPSBgdXJsKCMke2NsaXBJZH0pYDsKKyAgICAgIHRoaXMudGdycCA9IG51bGw7CisgICAgfQorCisgICAgY2xpcCh0eXBlKSB7CisgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gdHlwZTsKKyAgICB9CisKKyAgICBjbG9zZVBhdGgoKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworCisgICAgICBpZiAoY3VycmVudC5wYXRoKSB7CisgICAgICAgIGNvbnN0IGQgPSBgJHtjdXJyZW50LnBhdGguZ2V0QXR0cmlidXRlTlMobnVsbCwgImQiKX1aYDsKKyAgICAgICAgY3VycmVudC5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICJkIiwgZCk7CisgICAgICB9CisgICAgfQorCisgICAgc2V0TGVhZGluZyhsZWFkaW5nKSB7CisgICAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC1sZWFkaW5nOworICAgIH0KKworICAgIHNldFRleHRSaXNlKHRleHRSaXNlKSB7CisgICAgICB0aGlzLmN1cnJlbnQudGV4dFJpc2UgPSB0ZXh0UmlzZTsKKyAgICB9CisKKyAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZSh0ZXh0UmVuZGVyaW5nTW9kZSkgeworICAgICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gdGV4dFJlbmRlcmluZ01vZGU7CisgICAgfQorCisgICAgc2V0SFNjYWxlKHNjYWxlKSB7CisgICAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHNjYWxlIC8gMTAwOworICAgIH0KKworICAgIHNldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHt9CisKKyAgICBzZXRGbGF0bmVzcyhmbGF0bmVzcykge30KKworICAgIHNldEdTdGF0ZShzdGF0ZXMpIHsKKyAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0YXRlcykgeworICAgICAgICBzd2l0Y2ggKGtleSkgeworICAgICAgICAgIGNhc2UgIkxXIjoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZVdpZHRoKHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiTEMiOgorICAgICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiTEoiOgorICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbih2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIk1MIjoKKyAgICAgICAgICAgIHRoaXMuc2V0TWl0ZXJMaW1pdCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkQiOgorICAgICAgICAgICAgdGhpcy5zZXREYXNoKHZhbHVlWzBdLCB2YWx1ZVsxXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlJJIjoKKyAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiRkwiOgorICAgICAgICAgICAgdGhpcy5zZXRGbGF0bmVzcyh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkZvbnQiOgorICAgICAgICAgICAgdGhpcy5zZXRGb250KHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQ0EiOgorICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VBbHBoYSh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImNhIjoKKyAgICAgICAgICAgIHRoaXMuc2V0RmlsbEFscGhhKHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgVW5pbXBsZW1lbnRlZCBncmFwaGljIHN0YXRlIG9wZXJhdG9yICR7a2V5fWApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBmaWxsKCkgeworICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKworICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudCkgeworICAgICAgICBjdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwiLCBjdXJyZW50LmZpbGxDb2xvcik7CisgICAgICAgIGN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbC1vcGFjaXR5IiwgY3VycmVudC5maWxsQWxwaGEpOworICAgICAgICB0aGlzLmVuZFBhdGgoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJva2UoKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworCisgICAgICBpZiAoY3VycmVudC5lbGVtZW50KSB7CisgICAgICAgIHRoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXMoY3VycmVudC5lbGVtZW50KTsKKworICAgICAgICBjdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwiLCAibm9uZSIpOworICAgICAgICB0aGlzLmVuZFBhdGgoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBfc2V0U3Ryb2tlQXR0cmlidXRlcyhlbGVtZW50LCBsaW5lV2lkdGhTY2FsZSA9IDEpIHsKKyAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICBsZXQgZGFzaEFycmF5ID0gY3VycmVudC5kYXNoQXJyYXk7CisKKyAgICAgIGlmIChsaW5lV2lkdGhTY2FsZSAhPT0gMSAmJiBkYXNoQXJyYXkubGVuZ3RoID4gMCkgeworICAgICAgICBkYXNoQXJyYXkgPSBkYXNoQXJyYXkubWFwKGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAgICAgIHJldHVybiBsaW5lV2lkdGhTY2FsZSAqIHZhbHVlOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAic3Ryb2tlIiwgY3VycmVudC5zdHJva2VDb2xvcik7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2Utb3BhY2l0eSIsIGN1cnJlbnQuc3Ryb2tlQWxwaGEpOworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAic3Ryb2tlLW1pdGVybGltaXQiLCBwZihjdXJyZW50Lm1pdGVyTGltaXQpKTsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZS1saW5lY2FwIiwgY3VycmVudC5saW5lQ2FwKTsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZS1saW5lam9pbiIsIGN1cnJlbnQubGluZUpvaW4pOworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAic3Ryb2tlLXdpZHRoIiwgcGYobGluZVdpZHRoU2NhbGUgKiBjdXJyZW50LmxpbmVXaWR0aCkgKyAicHgiKTsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZS1kYXNoYXJyYXkiLCBkYXNoQXJyYXkubWFwKHBmKS5qb2luKCIgIikpOworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAic3Ryb2tlLWRhc2hvZmZzZXQiLCBwZihsaW5lV2lkdGhTY2FsZSAqIGN1cnJlbnQuZGFzaFBoYXNlKSArICJweCIpOworICAgIH0KKworICAgIGVvRmlsbCgpIHsKKyAgICAgIGlmICh0aGlzLmN1cnJlbnQuZWxlbWVudCkgeworICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbC1ydWxlIiwgImV2ZW5vZGQiKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5maWxsKCk7CisgICAgfQorCisgICAgZmlsbFN0cm9rZSgpIHsKKyAgICAgIHRoaXMuc3Ryb2tlKCk7CisgICAgICB0aGlzLmZpbGwoKTsKKyAgICB9CisKKyAgICBlb0ZpbGxTdHJva2UoKSB7CisgICAgICBpZiAodGhpcy5jdXJyZW50LmVsZW1lbnQpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwtcnVsZSIsICJldmVub2RkIik7CisgICAgICB9CisKKyAgICAgIHRoaXMuZmlsbFN0cm9rZSgpOworICAgIH0KKworICAgIGNsb3NlU3Ryb2tlKCkgeworICAgICAgdGhpcy5jbG9zZVBhdGgoKTsKKyAgICAgIHRoaXMuc3Ryb2tlKCk7CisgICAgfQorCisgICAgY2xvc2VGaWxsU3Ryb2tlKCkgeworICAgICAgdGhpcy5jbG9zZVBhdGgoKTsKKyAgICAgIHRoaXMuZmlsbFN0cm9rZSgpOworICAgIH0KKworICAgIGNsb3NlRU9GaWxsU3Ryb2tlKCkgeworICAgICAgdGhpcy5jbG9zZVBhdGgoKTsKKyAgICAgIHRoaXMuZW9GaWxsU3Ryb2tlKCk7CisgICAgfQorCisgICAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCkgeworICAgICAgY29uc3QgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieCIsICIwIik7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgIjAiKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgIjFweCIpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgIjFweCIpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbCIsIHRoaXMuY3VycmVudC5maWxsQ29sb3IpOworCisgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKHJlY3QpOworICAgIH0KKworICAgIHBhaW50SW1hZ2VYT2JqZWN0KG9iaklkKSB7CisgICAgICBjb25zdCBpbWdEYXRhID0gb2JqSWQuc3RhcnRzV2l0aCgiZ18iKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQob2JqSWQpIDogdGhpcy5vYmpzLmdldChvYmpJZCk7CisKKyAgICAgIGlmICghaW1nRGF0YSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoYERlcGVuZGVudCBpbWFnZSB3aXRoIG9iamVjdCBJRCAke29iaklkfSBpcyBub3QgcmVhZHkgeWV0YCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKTsKKyAgICB9CisKKyAgICBwYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhLCBtYXNrKSB7CisgICAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgICAgIGNvbnN0IGltZ1NyYyA9IGNvbnZlcnRJbWdEYXRhVG9QbmcoaW1nRGF0YSwgdGhpcy5mb3JjZURhdGFTY2hlbWEsICEhbWFzayk7CisgICAgICBjb25zdCBjbGlwcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCAiMCIpOworICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCAiMCIpOworICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgcGYod2lkdGgpKTsKKyAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJoZWlnaHQiLCBwZihoZWlnaHQpKTsKKyAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gY2xpcHJlY3Q7CisgICAgICB0aGlzLmNsaXAoIm5vbnplcm8iKTsKKyAgICAgIGNvbnN0IGltZ0VsID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzppbWFnZSIpOworICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMoWExJTktfTlMsICJ4bGluazpocmVmIiwgaW1nU3JjKTsKKyAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4IiwgIjAiKTsKKyAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgcGYoLWhlaWdodCkpOworICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgcGYod2lkdGgpICsgInB4Iik7CisgICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgcGYoaGVpZ2h0KSArICJweCIpOworICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgInRyYW5zZm9ybSIsIGBzY2FsZSgke3BmKDEgLyB3aWR0aCl9ICR7cGYoLTEgLyBoZWlnaHQpfSlgKTsKKworICAgICAgaWYgKG1hc2spIHsKKyAgICAgICAgbWFzay5hcHBlbmRDaGlsZChpbWdFbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKGltZ0VsKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwYWludEltYWdlTWFza1hPYmplY3QoaW1nRGF0YSkgeworICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgIGNvbnN0IHdpZHRoID0gaW1nRGF0YS53aWR0aDsKKyAgICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0OworICAgICAgY29uc3QgZmlsbENvbG9yID0gY3VycmVudC5maWxsQ29sb3I7CisgICAgICBjdXJyZW50Lm1hc2tJZCA9IGBtYXNrJHttYXNrQ291bnQrK31gOworICAgICAgY29uc3QgbWFzayA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6bWFzayIpOworICAgICAgbWFzay5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaWQiLCBjdXJyZW50Lm1hc2tJZCk7CisgICAgICBjb25zdCByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4IiwgIjAiKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCAiMCIpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAid2lkdGgiLCBwZih3aWR0aCkpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgcGYoaGVpZ2h0KSk7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgZmlsbENvbG9yKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIm1hc2siLCBgdXJsKCMke2N1cnJlbnQubWFza0lkfSlgKTsKKyAgICAgIHRoaXMuZGVmcy5hcHBlbmRDaGlsZChtYXNrKTsKKworICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChyZWN0KTsKKworICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhLCBtYXNrKTsKKyAgICB9CisKKyAgICBwYWludEZvcm1YT2JqZWN0QmVnaW4obWF0cml4LCBiYm94KSB7CisgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRyaXgpICYmIG1hdHJpeC5sZW5ndGggPT09IDYpIHsKKyAgICAgICAgdGhpcy50cmFuc2Zvcm0obWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgbWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSk7CisgICAgICB9CisKKyAgICAgIGlmIChiYm94KSB7CisgICAgICAgIGNvbnN0IHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07CisgICAgICAgIGNvbnN0IGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdOworICAgICAgICBjb25zdCBjbGlwcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieCIsIGJib3hbMF0pOworICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsIGJib3hbMV0pOworICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAid2lkdGgiLCBwZih3aWR0aCkpOworICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgcGYoaGVpZ2h0KSk7CisgICAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gY2xpcHJlY3Q7CisgICAgICAgIHRoaXMuY2xpcCgibm9uemVybyIpOworICAgICAgICB0aGlzLmVuZFBhdGgoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwYWludEZvcm1YT2JqZWN0RW5kKCkge30KKworICAgIF9pbml0aWFsaXplKHZpZXdwb3J0KSB7CisgICAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOworICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmRlZnMiKTsKKyAgICAgIHN2Zy5hcHBlbmRDaGlsZChkZWZpbml0aW9ucyk7CisgICAgICB0aGlzLmRlZnMgPSBkZWZpbml0aW9uczsKKyAgICAgIGNvbnN0IHJvb3RHcm91cCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZyIpOworICAgICAgcm9vdEdyb3VwLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ0cmFuc2Zvcm0iLCBwbSh2aWV3cG9ydC50cmFuc2Zvcm0pKTsKKyAgICAgIHN2Zy5hcHBlbmRDaGlsZChyb290R3JvdXApOworICAgICAgdGhpcy5zdmcgPSByb290R3JvdXA7CisgICAgICByZXR1cm4gc3ZnOworICAgIH0KKworICAgIF9lbnN1cmVDbGlwR3JvdXAoKSB7CisgICAgICBpZiAoIXRoaXMuY3VycmVudC5jbGlwR3JvdXApIHsKKyAgICAgICAgY29uc3QgY2xpcEdyb3VwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpnIik7CisgICAgICAgIGNsaXBHcm91cC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiY2xpcC1wYXRoIiwgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpOworICAgICAgICB0aGlzLnN2Zy5hcHBlbmRDaGlsZChjbGlwR3JvdXApOworICAgICAgICB0aGlzLmN1cnJlbnQuY2xpcEdyb3VwID0gY2xpcEdyb3VwOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmNsaXBHcm91cDsKKyAgICB9CisKKyAgICBfZW5zdXJlVHJhbnNmb3JtR3JvdXAoKSB7CisgICAgICBpZiAoIXRoaXMudGdycCkgeworICAgICAgICB0aGlzLnRncnAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTsKKyAgICAgICAgdGhpcy50Z3JwLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ0cmFuc2Zvcm0iLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpOworCisgICAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlQ2xpcFVybCkgeworICAgICAgICAgIHRoaXMuX2Vuc3VyZUNsaXBHcm91cCgpLmFwcGVuZENoaWxkKHRoaXMudGdycCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5zdmcuYXBwZW5kQ2hpbGQodGhpcy50Z3JwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy50Z3JwOworICAgIH0KKworICB9OworfQorCisvKioqLyB9KSwKKy8qIDIyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGTm9kZVN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9uZXR3b3JrX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7CisKKzsKKworY29uc3QgZnMgPSByZXF1aXJlKCJmcyIpOworCitjb25zdCBodHRwID0gcmVxdWlyZSgiaHR0cCIpOworCitjb25zdCBodHRwcyA9IHJlcXVpcmUoImh0dHBzIik7CisKK2NvbnN0IHVybCA9IHJlcXVpcmUoInVybCIpOworCitjb25zdCBmaWxlVXJpUmVnZXggPSAvXmZpbGU6XC9cL1wvW2EtekEtWl06XC8vOworCitmdW5jdGlvbiBwYXJzZVVybChzb3VyY2VVcmwpIHsKKyAgY29uc3QgcGFyc2VkVXJsID0gdXJsLnBhcnNlKHNvdXJjZVVybCk7CisKKyAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gImZpbGU6IiB8fCBwYXJzZWRVcmwuaG9zdCkgeworICAgIHJldHVybiBwYXJzZWRVcmw7CisgIH0KKworICBpZiAoL15bYS16XTpbL1xcXS9pLnRlc3Qoc291cmNlVXJsKSkgeworICAgIHJldHVybiB1cmwucGFyc2UoYGZpbGU6Ly8vJHtzb3VyY2VVcmx9YCk7CisgIH0KKworICBpZiAoIXBhcnNlZFVybC5ob3N0KSB7CisgICAgcGFyc2VkVXJsLnByb3RvY29sID0gImZpbGU6IjsKKyAgfQorCisgIHJldHVybiBwYXJzZWRVcmw7Cit9CisKK2NsYXNzIFBERk5vZGVTdHJlYW0geworICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHsKKyAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICB0aGlzLnVybCA9IHBhcnNlVXJsKHNvdXJjZS51cmwpOworICAgIHRoaXMuaXNIdHRwID0gdGhpcy51cmwucHJvdG9jb2wgPT09ICJodHRwOiIgfHwgdGhpcy51cmwucHJvdG9jb2wgPT09ICJodHRwczoiOworICAgIHRoaXMuaXNGc1VybCA9IHRoaXMudXJsLnByb3RvY29sID09PSAiZmlsZToiOworICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBzb3VyY2UuaHR0cEhlYWRlcnMgfHwge307CisgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsOworICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTsKKyAgfQorCisgIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQgOiAwOworICB9CisKKyAgZ2V0RnVsbFJlYWRlcigpIHsKKyAgICAoMCwgX3V0aWwuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsICJQREZOb2RlU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcih0aGlzKSA6IG5ldyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlcih0aGlzKTsKKyAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7CisgIH0KKworICBnZXRSYW5nZVJlYWRlcihzdGFydCwgZW5kKSB7CisgICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyKHRoaXMsIHN0YXJ0LCBlbmQpIDogbmV3IFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKTsKKworICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyYW5nZVJlYWRlcik7CisKKyAgICByZXR1cm4gcmFuZ2VSZWFkZXI7CisgIH0KKworICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHsKKyAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHsKKyAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgIH0KKworICAgIGNvbnN0IHJlYWRlcnMgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApOworCisgICAgcmVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChyZWFkZXIpIHsKKyAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9KTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGTm9kZVN0cmVhbSA9IFBERk5vZGVTdHJlYW07CisKK2NsYXNzIEJhc2VGdWxsUmVhZGVyIHsKKyAgY29uc3RydWN0b3Ioc3RyZWFtKSB7CisgICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDsKKyAgICB0aGlzLl9kb25lID0gZmFsc2U7CisgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTsKKyAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKyAgICB0aGlzLl9sb2FkZWQgPSAwOworICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDsKKyAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlOworICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplOworCisgICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7CisgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlOworICAgIH0KKworICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtOworICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTsKKyAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7CisgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgIH0KKworICBnZXQgaGVhZGVyc1JlYWR5KCkgeworICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgZ2V0IGZpbGVuYW1lKCkgeworICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTsKKyAgfQorCisgIGdldCBjb250ZW50TGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoOworICB9CisKKyAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7CisgIH0KKworICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlOworCisgICAgaWYgKHRoaXMuX2RvbmUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH07CisgICAgfQorCisgICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7CisgICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjsKKyAgICB9CisKKyAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTsKKworICAgIGlmIChjaHVuayA9PT0gbnVsbCkgeworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICByZXR1cm4gdGhpcy5yZWFkKCk7CisgICAgfQorCisgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDsKKworICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHsKKyAgICAgIHRoaXMub25Qcm9ncmVzcyh7CisgICAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkLAorICAgICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aAorICAgICAgfSk7CisgICAgfQorCisgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjsKKyAgICByZXR1cm4geworICAgICAgdmFsdWU6IGJ1ZmZlciwKKyAgICAgIGRvbmU6IGZhbHNlCisgICAgfTsKKyAgfQorCisgIGNhbmNlbChyZWFzb24pIHsKKyAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RyZWFtKSB7CisgICAgICB0aGlzLl9lcnJvcihyZWFzb24pOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveShyZWFzb24pOworICB9CisKKyAgX2Vycm9yKHJlYXNvbikgeworICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uOworCisgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICB9CisKKyAgX3NldFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7CisgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTsKKyAgICByZWFkYWJsZVN0cmVhbS5vbigicmVhZGFibGUiLCAoKSA9PiB7CisgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgfSk7CisgICAgcmVhZGFibGVTdHJlYW0ub24oImVuZCIsICgpID0+IHsKKyAgICAgIHJlYWRhYmxlU3RyZWFtLmRlc3Ryb3koKTsKKyAgICAgIHRoaXMuX2RvbmUgPSB0cnVlOworCisgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgfSk7CisgICAgcmVhZGFibGVTdHJlYW0ub24oImVycm9yIiwgcmVhc29uID0+IHsKKyAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7CisgICAgfSk7CisKKyAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHsKKyAgICAgIHRoaXMuX2Vycm9yKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigic3RyZWFtaW5nIGlzIGRpc2FibGVkIikpOworICAgIH0KKworICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7CisgICAgfQorICB9CisKK30KKworY2xhc3MgQmFzZVJhbmdlUmVhZGVyIHsKKyAgY29uc3RydWN0b3Ioc3RyZWFtKSB7CisgICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDsKKyAgICB0aGlzLl9kb25lID0gZmFsc2U7CisgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgICAgdGhpcy5fbG9hZGVkID0gMDsKKyAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7CisgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTsKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTsKKyAgfQorCisgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgIH0KKworICBhc3luYyByZWFkKCkgeworICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7CisKKyAgICBpZiAodGhpcy5fZG9uZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHsKKyAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yOworICAgIH0KKworICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpOworCisgICAgaWYgKGNodW5rID09PSBudWxsKSB7CisgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHJldHVybiB0aGlzLnJlYWQoKTsKKyAgICB9CisKKyAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsubGVuZ3RoOworCisgICAgaWYgKHRoaXMub25Qcm9ncmVzcykgeworICAgICAgdGhpcy5vblByb2dyZXNzKHsKKyAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQKKyAgICAgIH0pOworICAgIH0KKworICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7CisgICAgcmV0dXJuIHsKKyAgICAgIHZhbHVlOiBidWZmZXIsCisgICAgICBkb25lOiBmYWxzZQorICAgIH07CisgIH0KKworICBjYW5jZWwocmVhc29uKSB7CisgICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0cmVhbSkgeworICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTsKKyAgfQorCisgIF9lcnJvcihyZWFzb24pIHsKKyAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjsKKworICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgfQorCisgIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkgeworICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07CisgICAgcmVhZGFibGVTdHJlYW0ub24oInJlYWRhYmxlIiwgKCkgPT4geworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIH0pOworICAgIHJlYWRhYmxlU3RyZWFtLm9uKCJlbmQiLCAoKSA9PiB7CisgICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7CisgICAgICB0aGlzLl9kb25lID0gdHJ1ZTsKKworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIH0pOworICAgIHJlYWRhYmxlU3RyZWFtLm9uKCJlcnJvciIsIHJlYXNvbiA9PiB7CisgICAgICB0aGlzLl9lcnJvcihyZWFzb24pOworICAgIH0pOworCisgICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7CisgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTsKKyAgICB9CisgIH0KKworfQorCitmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0T3B0aW9ucyhwYXJzZWRVcmwsIGhlYWRlcnMpIHsKKyAgcmV0dXJuIHsKKyAgICBwcm90b2NvbDogcGFyc2VkVXJsLnByb3RvY29sLAorICAgIGF1dGg6IHBhcnNlZFVybC5hdXRoLAorICAgIGhvc3Q6IHBhcnNlZFVybC5ob3N0bmFtZSwKKyAgICBwb3J0OiBwYXJzZWRVcmwucG9ydCwKKyAgICBwYXRoOiBwYXJzZWRVcmwucGF0aCwKKyAgICBtZXRob2Q6ICJHRVQiLAorICAgIGhlYWRlcnMKKyAgfTsKK30KKworY2xhc3MgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSkgeworICAgIHN1cGVyKHN0cmVhbSk7CisKKyAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHJlc3BvbnNlID0+IHsKKyAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHsKKyAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgIiR7dGhpcy5fdXJsfSIuYCk7CisgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7CisKKyAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTsKKworICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0ocmVzcG9uc2UpOworCisgICAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4geworICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdHJlYW0uaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldOworICAgICAgfTsKKworICAgICAgY29uc3QgeworICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsCisgICAgICAgIHN1Z2dlc3RlZExlbmd0aAorICAgICAgfSA9ICgwLCBfbmV0d29ya191dGlscy52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoeworICAgICAgICBnZXRSZXNwb25zZUhlYWRlciwKKyAgICAgICAgaXNIdHRwOiBzdHJlYW0uaXNIdHRwLAorICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsCisgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlCisgICAgICB9KTsKKyAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBhbGxvd1JhbmdlUmVxdWVzdHM7CisgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7CisgICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7CisgICAgfTsKKworICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsOworCisgICAgaWYgKHRoaXMuX3VybC5wcm90b2NvbCA9PT0gImh0dHA6IikgeworICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHN0cmVhbS5odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCBzdHJlYW0uaHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7CisgICAgfQorCisgICAgdGhpcy5fcmVxdWVzdC5vbigiZXJyb3IiLCByZWFzb24gPT4geworICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247CisKKyAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOworICAgIH0pOworCisgICAgdGhpcy5fcmVxdWVzdC5lbmQoKTsKKyAgfQorCit9CisKK2NsYXNzIFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkgeworICAgIHN1cGVyKHN0cmVhbSk7CisgICAgdGhpcy5faHR0cEhlYWRlcnMgPSB7fTsKKworICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gc3RyZWFtLmh0dHBIZWFkZXJzKSB7CisgICAgICBjb25zdCB2YWx1ZSA9IHN0cmVhbS5odHRwSGVhZGVyc1twcm9wZXJ0eV07CisKKyAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB0aGlzLl9odHRwSGVhZGVyc1twcm9wZXJ0eV0gPSB2YWx1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9odHRwSGVhZGVycy5SYW5nZSA9IGBieXRlcz0ke3N0YXJ0fS0ke2VuZCAtIDF9YDsKKworICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gcmVzcG9uc2UgPT4geworICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkgeworICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiAiJHt0aGlzLl91cmx9Ii5gKTsKKyAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShyZXNwb25zZSk7CisgICAgfTsKKworICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsOworCisgICAgaWYgKHRoaXMuX3VybC5wcm90b2NvbCA9PT0gImh0dHA6IikgeworICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpOworICAgIH0KKworICAgIHRoaXMuX3JlcXVlc3Qub24oImVycm9yIiwgcmVhc29uID0+IHsKKyAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uOworICAgIH0pOworCisgICAgdGhpcy5fcmVxdWVzdC5lbmQoKTsKKyAgfQorCit9CisKK2NsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSkgeworICAgIHN1cGVyKHN0cmVhbSk7CisgICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpOworCisgICAgaWYgKGZpbGVVcmlSZWdleC50ZXN0KHRoaXMuX3VybC5ocmVmKSkgeworICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlwvLywgIiIpOworICAgIH0KKworICAgIGZzLmxzdGF0KHBhdGgsIChlcnJvciwgc3RhdCkgPT4geworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgIGlmIChlcnJvci5jb2RlID09PSAiRU5PRU5UIikgeworICAgICAgICAgIGVycm9yID0gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGICIke3BhdGh9Ii5gKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7CisKKyAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdGF0LnNpemU7CisKKyAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aCkpOworCisgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgfSk7CisgIH0KKworfQorCitjbGFzcyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkgeworICAgIHN1cGVyKHN0cmVhbSk7CisgICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpOworCisgICAgaWYgKGZpbGVVcmlSZWdleC50ZXN0KHRoaXMuX3VybC5ocmVmKSkgeworICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlwvLywgIiIpOworICAgIH0KKworICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aCwgeworICAgICAgc3RhcnQsCisgICAgICBlbmQ6IGVuZCAtIDEKKyAgICB9KSk7CisgIH0KKworfQorCisvKioqLyB9KSwKKy8qIDIzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvciA9IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3I7CitleHBvcnRzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIgPSBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyOworZXhwb3J0cy52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyA9IHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzOworZXhwb3J0cy52YWxpZGF0ZVJlc3BvbnNlU3RhdHVzID0gdmFsaWRhdGVSZXNwb25zZVN0YXR1czsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9jb250ZW50X2Rpc3Bvc2l0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7CisKK2Z1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHsKKyAgZ2V0UmVzcG9uc2VIZWFkZXIsCisgIGlzSHR0cCwKKyAgcmFuZ2VDaHVua1NpemUsCisgIGRpc2FibGVSYW5nZQorfSkgeworICAoMCwgX3V0aWwuYXNzZXJ0KShyYW5nZUNodW5rU2l6ZSA+IDAsICJSYW5nZSBjaHVuayBzaXplIG11c3QgYmUgbGFyZ2VyIHRoYW4gemVybyIpOworICBjb25zdCByZXR1cm5WYWx1ZXMgPSB7CisgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiBmYWxzZSwKKyAgICBzdWdnZXN0ZWRMZW5ndGg6IHVuZGVmaW5lZAorICB9OworICBjb25zdCBsZW5ndGggPSBwYXJzZUludChnZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1MZW5ndGgiKSwgMTApOworCisgIGlmICghTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpKSB7CisgICAgcmV0dXJuIHJldHVyblZhbHVlczsKKyAgfQorCisgIHJldHVyblZhbHVlcy5zdWdnZXN0ZWRMZW5ndGggPSBsZW5ndGg7CisKKyAgaWYgKGxlbmd0aCA8PSAyICogcmFuZ2VDaHVua1NpemUpIHsKKyAgICByZXR1cm4gcmV0dXJuVmFsdWVzOworICB9CisKKyAgaWYgKGRpc2FibGVSYW5nZSB8fCAhaXNIdHRwKSB7CisgICAgcmV0dXJuIHJldHVyblZhbHVlczsKKyAgfQorCisgIGlmIChnZXRSZXNwb25zZUhlYWRlcigiQWNjZXB0LVJhbmdlcyIpICE9PSAiYnl0ZXMiKSB7CisgICAgcmV0dXJuIHJldHVyblZhbHVlczsKKyAgfQorCisgIGNvbnN0IGNvbnRlbnRFbmNvZGluZyA9IGdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LUVuY29kaW5nIikgfHwgImlkZW50aXR5IjsKKworICBpZiAoY29udGVudEVuY29kaW5nICE9PSAiaWRlbnRpdHkiKSB7CisgICAgcmV0dXJuIHJldHVyblZhbHVlczsKKyAgfQorCisgIHJldHVyblZhbHVlcy5hbGxvd1JhbmdlUmVxdWVzdHMgPSB0cnVlOworICByZXR1cm4gcmV0dXJuVmFsdWVzOworfQorCitmdW5jdGlvbiBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKSB7CisgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IGdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uIik7CisKKyAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbikgeworICAgIGxldCBmaWxlbmFtZSA9ICgwLCBfY29udGVudF9kaXNwb3NpdGlvbi5nZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIpKGNvbnRlbnREaXNwb3NpdGlvbik7CisKKyAgICBpZiAoZmlsZW5hbWUuaW5jbHVkZXMoIiUiKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgZmlsZW5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpOworICAgICAgfSBjYXRjaCAoZXgpIHt9CisgICAgfQorCisgICAgaWYgKC9cLnBkZiQvaS50ZXN0KGZpbGVuYW1lKSkgeworICAgICAgcmV0dXJuIGZpbGVuYW1lOworICAgIH0KKyAgfQorCisgIHJldHVybiBudWxsOworfQorCitmdW5jdGlvbiBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKHN0YXR1cywgdXJsKSB7CisgIGlmIChzdGF0dXMgPT09IDQwNCB8fCBzdGF0dXMgPT09IDAgJiYgdXJsLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKKyAgICByZXR1cm4gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGICInICsgdXJsICsgJyIuJyk7CisgIH0KKworICByZXR1cm4gbmV3IF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UgKCIgKyBzdGF0dXMgKyAnKSB3aGlsZSByZXRyaWV2aW5nIFBERiAiJyArIHVybCArICciLicsIHN0YXR1cyk7Cit9CisKK2Z1bmN0aW9uIHZhbGlkYXRlUmVzcG9uc2VTdGF0dXMoc3RhdHVzKSB7CisgIHJldHVybiBzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNjsKK30KKworLyoqKi8gfSksCisvKiAyNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciA9IGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcjsKKworZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKGNvbnRlbnREaXNwb3NpdGlvbikgeworICBsZXQgbmVlZHNFbmNvZGluZ0ZpeHVwID0gdHJ1ZTsKKyAgbGV0IHRtcCA9IHRvUGFyYW1SZWdFeHAoImZpbGVuYW1lXFwqIiwgImkiKS5leGVjKGNvbnRlbnREaXNwb3NpdGlvbik7CisKKyAgaWYgKHRtcCkgeworICAgIHRtcCA9IHRtcFsxXTsKKyAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApOworICAgIGZpbGVuYW1lID0gdW5lc2NhcGUoZmlsZW5hbWUpOworICAgIGZpbGVuYW1lID0gcmZjNTk4N2RlY29kZShmaWxlbmFtZSk7CisgICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7CisgIH0KKworICB0bXAgPSByZmMyMjMxZ2V0cGFyYW0oY29udGVudERpc3Bvc2l0aW9uKTsKKworICBpZiAodG1wKSB7CisgICAgY29uc3QgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKHRtcCk7CisgICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpOworICB9CisKKyAgdG1wID0gdG9QYXJhbVJlZ0V4cCgiZmlsZW5hbWUiLCAiaSIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTsKKworICBpZiAodG1wKSB7CisgICAgdG1wID0gdG1wWzFdOworICAgIGxldCBmaWxlbmFtZSA9IHJmYzI2MTZ1bnF1b3RlKHRtcCk7CisgICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7CisgIH0KKworICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKGF0dHJpYnV0ZVBhdHRlcm4sIGZsYWdzKSB7CisgICAgcmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58OylcXHMqIiArIGF0dHJpYnV0ZVBhdHRlcm4gKyAiXFxzKj1cXHMqIiArICIoIiArICdbXiI7XFxzXVteO1xcc10qJyArICJ8IiArICciKD86W14iXFxcXF18XFxcXCI/KSsiPycgKyAiKSIsIGZsYWdzKTsKKyAgfQorCisgIGZ1bmN0aW9uIHRleHRkZWNvZGUoZW5jb2RpbmcsIHZhbHVlKSB7CisgICAgaWYgKGVuY29kaW5nKSB7CisgICAgICBpZiAoIS9eW1x4MDAtXHhGRl0rJC8udGVzdCh2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nLCB7CisgICAgICAgICAgZmF0YWw6IHRydWUKKyAgICAgICAgfSk7CisgICAgICAgIGNvbnN0IGJ5dGVzID0gQXJyYXkuZnJvbSh2YWx1ZSwgZnVuY3Rpb24gKGNoKSB7CisgICAgICAgICAgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkgJiAweGZmOworICAgICAgICB9KTsKKyAgICAgICAgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShuZXcgVWludDhBcnJheShieXRlcykpOworICAgICAgICBuZWVkc0VuY29kaW5nRml4dXAgPSBmYWxzZTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgaWYgKC9edXRmLT84JC9pLnRlc3QoZW5jb2RpbmcpKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh2YWx1ZSkpOworICAgICAgICAgICAgbmVlZHNFbmNvZGluZ0ZpeHVwID0gZmFsc2U7CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gZml4dXBFbmNvZGluZyh2YWx1ZSkgeworICAgIGlmIChuZWVkc0VuY29kaW5nRml4dXAgJiYgL1tceDgwLVx4ZmZdLy50ZXN0KHZhbHVlKSkgeworICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKCJ1dGYtOCIsIHZhbHVlKTsKKworICAgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCkgeworICAgICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoImlzby04ODU5LTEiLCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvblN0cikgeworICAgIGNvbnN0IG1hdGNoZXMgPSBbXTsKKyAgICBsZXQgbWF0Y2g7CisgICAgY29uc3QgaXRlciA9IHRvUGFyYW1SZWdFeHAoImZpbGVuYW1lXFwqKCg/ITBcXGQpXFxkKykoXFwqPykiLCAiaWciKTsKKworICAgIHdoaWxlICgobWF0Y2ggPSBpdGVyLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uU3RyKSkgIT09IG51bGwpIHsKKyAgICAgIGxldCBbLCBuLCBxdW90LCBwYXJ0XSA9IG1hdGNoOworICAgICAgbiA9IHBhcnNlSW50KG4sIDEwKTsKKworICAgICAgaWYgKG4gaW4gbWF0Y2hlcykgeworICAgICAgICBpZiAobiA9PT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIG1hdGNoZXNbbl0gPSBbcXVvdCwgcGFydF07CisgICAgfQorCisgICAgY29uc3QgcGFydHMgPSBbXTsKKworICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbWF0Y2hlcy5sZW5ndGg7ICsrbikgeworICAgICAgaWYgKCEobiBpbiBtYXRjaGVzKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbGV0IFtxdW90LCBwYXJ0XSA9IG1hdGNoZXNbbl07CisgICAgICBwYXJ0ID0gcmZjMjYxNnVucXVvdGUocGFydCk7CisKKyAgICAgIGlmIChxdW90KSB7CisgICAgICAgIHBhcnQgPSB1bmVzY2FwZShwYXJ0KTsKKworICAgICAgICBpZiAobiA9PT0gMCkgeworICAgICAgICAgIHBhcnQgPSByZmM1OTg3ZGVjb2RlKHBhcnQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBhcnRzLnB1c2gocGFydCk7CisgICAgfQorCisgICAgcmV0dXJuIHBhcnRzLmpvaW4oIiIpOworICB9CisKKyAgZnVuY3Rpb24gcmZjMjYxNnVucXVvdGUodmFsdWUpIHsKKyAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnIicpKSB7CisgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNsaWNlKDEpLnNwbGl0KCdcXCInKTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkgeworICAgICAgICBjb25zdCBxdW90aW5kZXggPSBwYXJ0c1tpXS5pbmRleE9mKCciJyk7CisKKyAgICAgICAgaWYgKHF1b3RpbmRleCAhPT0gLTEpIHsKKyAgICAgICAgICBwYXJ0c1tpXSA9IHBhcnRzW2ldLnNsaWNlKDAsIHF1b3RpbmRleCk7CisgICAgICAgICAgcGFydHMubGVuZ3RoID0gaSArIDE7CisgICAgICAgIH0KKworICAgICAgICBwYXJ0c1tpXSA9IHBhcnRzW2ldLnJlcGxhY2UoL1xcKC4pL2csICIkMSIpOworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHBhcnRzLmpvaW4oJyInKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBmdW5jdGlvbiByZmM1OTg3ZGVjb2RlKGV4dHZhbHVlKSB7CisgICAgY29uc3QgZW5jb2RpbmdlbmQgPSBleHR2YWx1ZS5pbmRleE9mKCInIik7CisKKyAgICBpZiAoZW5jb2RpbmdlbmQgPT09IC0xKSB7CisgICAgICByZXR1cm4gZXh0dmFsdWU7CisgICAgfQorCisgICAgY29uc3QgZW5jb2RpbmcgPSBleHR2YWx1ZS5zbGljZSgwLCBlbmNvZGluZ2VuZCk7CisgICAgY29uc3QgbGFuZ3ZhbHVlID0gZXh0dmFsdWUuc2xpY2UoZW5jb2RpbmdlbmQgKyAxKTsKKyAgICBjb25zdCB2YWx1ZSA9IGxhbmd2YWx1ZS5yZXBsYWNlKC9eW14nXSonLywgIiIpOworICAgIHJldHVybiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSk7CisgIH0KKworICBmdW5jdGlvbiByZmMyMDQ3ZGVjb2RlKHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCI9PyIpIHx8IC9bXHgwMC1ceDE5XHg4MC1ceGZmXS8udGVzdCh2YWx1ZSkpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvPVw/KFtcdy1dKilcPyhbUXFCYl0pXD8oKD86W14/XXxcPyg/IT0pKSopXD89L2csIGZ1bmN0aW9uIChtYXRjaGVzLCBjaGFyc2V0LCBlbmNvZGluZywgdGV4dCkgeworICAgICAgaWYgKGVuY29kaW5nID09PSAicSIgfHwgZW5jb2RpbmcgPT09ICJRIikgeworICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9fL2csICIgIik7CisgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLz0oWzAtOWEtZkEtRl17Mn0pL2csIGZ1bmN0aW9uIChtYXRjaCwgaGV4KSB7CisgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LCAxNikpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHRleHRkZWNvZGUoY2hhcnNldCwgdGV4dCk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRleHQgPSBhdG9iKHRleHQpOworICAgICAgfSBjYXRjaCAoZSkge30KKworICAgICAgcmV0dXJuIHRleHRkZWNvZGUoY2hhcnNldCwgdGV4dCk7CisgICAgfSk7CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKKy8qKiovIH0pLAorLyogMjUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZOZXR3b3JrU3RyZWFtID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX25ldHdvcmtfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKKworOworY29uc3QgT0tfUkVTUE9OU0UgPSAyMDA7Citjb25zdCBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UgPSAyMDY7CisKK2Z1bmN0aW9uIGdldEFycmF5QnVmZmVyKHhocikgeworICBjb25zdCBkYXRhID0geGhyLnJlc3BvbnNlOworCisgIGlmICh0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIpIHsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCisgIGNvbnN0IGFycmF5ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRhdGEpOworICByZXR1cm4gYXJyYXkuYnVmZmVyOworfQorCitjbGFzcyBOZXR3b3JrTWFuYWdlciB7CisgIGNvbnN0cnVjdG9yKHVybCwgYXJncykgeworICAgIHRoaXMudXJsID0gdXJsOworICAgIGFyZ3MgPSBhcmdzIHx8IHt9OworICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh1cmwpOworICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBhcmdzLmh0dHBIZWFkZXJzIHx8IHt9OworICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gYXJncy53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7CisKKyAgICB0aGlzLmdldFhociA9IGFyZ3MuZ2V0WGhyIHx8IGZ1bmN0aW9uIE5ldHdvcmtNYW5hZ2VyX2dldFhocigpIHsKKyAgICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgICB9OworCisgICAgdGhpcy5jdXJyWGhySWQgPSAwOworICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfQorCisgIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBsaXN0ZW5lcnMpIHsKKyAgICBjb25zdCBhcmdzID0geworICAgICAgYmVnaW4sCisgICAgICBlbmQKKyAgICB9OworCisgICAgZm9yIChjb25zdCBwcm9wIGluIGxpc3RlbmVycykgeworICAgICAgYXJnc1twcm9wXSA9IGxpc3RlbmVyc1twcm9wXTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGFyZ3MpOworICB9CisKKyAgcmVxdWVzdEZ1bGwobGlzdGVuZXJzKSB7CisgICAgcmV0dXJuIHRoaXMucmVxdWVzdChsaXN0ZW5lcnMpOworICB9CisKKyAgcmVxdWVzdChhcmdzKSB7CisgICAgY29uc3QgeGhyID0gdGhpcy5nZXRYaHIoKTsKKyAgICBjb25zdCB4aHJJZCA9IHRoaXMuY3VyclhocklkKys7CisgICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0gPSB7CisgICAgICB4aHIKKyAgICB9OworICAgIHhoci5vcGVuKCJHRVQiLCB0aGlzLnVybCk7CisgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzOworCisgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmh0dHBIZWFkZXJzKSB7CisgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaHR0cEhlYWRlcnNbcHJvcGVydHldOworCisgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAidW5kZWZpbmVkIikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIocHJvcGVydHksIHZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5pc0h0dHAgJiYgImJlZ2luIiBpbiBhcmdzICYmICJlbmQiIGluIGFyZ3MpIHsKKyAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsIGBieXRlcz0ke2FyZ3MuYmVnaW59LSR7YXJncy5lbmQgLSAxfWApOworICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID0gT0tfUkVTUE9OU0U7CisgICAgfQorCisgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CisKKyAgICBpZiAoYXJncy5vbkVycm9yKSB7CisgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgYXJncy5vbkVycm9yKHhoci5zdGF0dXMpOworICAgICAgfTsKKyAgICB9CisKKyAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcywgeGhySWQpOworICAgIHhoci5vbnByb2dyZXNzID0gdGhpcy5vblByb2dyZXNzLmJpbmQodGhpcywgeGhySWQpOworICAgIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkID0gYXJncy5vbkhlYWRlcnNSZWNlaXZlZDsKKyAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUgPSBhcmdzLm9uRG9uZTsKKyAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yID0gYXJncy5vbkVycm9yOworICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3MgPSBhcmdzLm9uUHJvZ3Jlc3M7CisgICAgeGhyLnNlbmQobnVsbCk7CisgICAgcmV0dXJuIHhocklkOworICB9CisKKyAgb25Qcm9ncmVzcyh4aHJJZCwgZXZ0KSB7CisgICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07CisKKyAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3MpIHsKKyAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3MoZXZ0KTsKKyAgICB9CisgIH0KKworICBvblN0YXRlQ2hhbmdlKHhocklkLCBldnQpIHsKKyAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTsKKworICAgIGlmICghcGVuZGluZ1JlcXVlc3QpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB4aHIgPSBwZW5kaW5nUmVxdWVzdC54aHI7CisKKyAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPj0gMiAmJiBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCkgeworICAgICAgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQoKTsKKyAgICAgIGRlbGV0ZSBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZDsKKyAgICB9CisKKyAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoISh4aHJJZCBpbiB0aGlzLnBlbmRpbmdSZXF1ZXN0cykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdOworCisgICAgaWYgKHhoci5zdGF0dXMgPT09IDAgJiYgdGhpcy5pc0h0dHApIHsKKyAgICAgIGlmIChwZW5kaW5nUmVxdWVzdC5vbkVycm9yKSB7CisgICAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IoeGhyLnN0YXR1cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB4aHJTdGF0dXMgPSB4aHIuc3RhdHVzIHx8IE9LX1JFU1BPTlNFOworICAgIGNvbnN0IG9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QgPSB4aHJTdGF0dXMgPT09IE9LX1JFU1BPTlNFICYmIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID09PSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0U7CisKKyAgICBpZiAoIW9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QgJiYgeGhyU3RhdHVzICE9PSBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cykgeworICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IpIHsKKyAgICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcih4aHIuc3RhdHVzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNodW5rID0gZ2V0QXJyYXlCdWZmZXIoeGhyKTsKKworICAgIGlmICh4aHJTdGF0dXMgPT09IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRSkgeworICAgICAgY29uc3QgcmFuZ2VIZWFkZXIgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiKTsKKyAgICAgIGNvbnN0IG1hdGNoZXMgPSAvYnl0ZXMgKFxkKyktKFxkKylcLyhcZCspLy5leGVjKHJhbmdlSGVhZGVyKTsKKyAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSh7CisgICAgICAgIGJlZ2luOiBwYXJzZUludChtYXRjaGVzWzFdLCAxMCksCisgICAgICAgIGNodW5rCisgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKGNodW5rKSB7CisgICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoeworICAgICAgICBiZWdpbjogMCwKKyAgICAgICAgY2h1bmsKKyAgICAgIH0pOworICAgIH0gZWxzZSBpZiAocGVuZGluZ1JlcXVlc3Qub25FcnJvcikgeworICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcih4aHIuc3RhdHVzKTsKKyAgICB9CisgIH0KKworICBnZXRSZXF1ZXN0WGhyKHhocklkKSB7CisgICAgcmV0dXJuIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7CisgIH0KKworICBpc1BlbmRpbmdSZXF1ZXN0KHhocklkKSB7CisgICAgcmV0dXJuIHhocklkIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzOworICB9CisKKyAgYWJvcnRSZXF1ZXN0KHhocklkKSB7CisgICAgY29uc3QgeGhyID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdLnhocjsKKyAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdOworICAgIHhoci5hYm9ydCgpOworICB9CisKK30KKworY2xhc3MgUERGTmV0d29ya1N0cmVhbSB7CisgIGNvbnN0cnVjdG9yKHNvdXJjZSkgeworICAgIHRoaXMuX3NvdXJjZSA9IHNvdXJjZTsKKyAgICB0aGlzLl9tYW5hZ2VyID0gbmV3IE5ldHdvcmtNYW5hZ2VyKHNvdXJjZS51cmwsIHsKKyAgICAgIGh0dHBIZWFkZXJzOiBzb3VyY2UuaHR0cEhlYWRlcnMsCisgICAgICB3aXRoQ3JlZGVudGlhbHM6IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMKKyAgICB9KTsKKyAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTsKKyAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7CisgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOworICB9CisKKyAgX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkKHJlYWRlcikgeworICAgIGNvbnN0IGkgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLmluZGV4T2YocmVhZGVyKTsKKworICAgIGlmIChpID49IDApIHsKKyAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGksIDEpOworICAgIH0KKyAgfQorCisgIGdldEZ1bGxSZWFkZXIoKSB7CisgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCAiUERGTmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCB0aGlzLl9zb3VyY2UpOworICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjsKKyAgfQorCisgIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHsKKyAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCBiZWdpbiwgZW5kKTsKKyAgICByZWFkZXIub25DbG9zZWQgPSB0aGlzLl9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZC5iaW5kKHRoaXMpOworCisgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7CisKKyAgICByZXR1cm4gcmVhZGVyOworICB9CisKKyAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7CisgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7CisgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisKKyAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKTsKKworICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmVhZGVyKSB7CisgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLlBERk5ldHdvcmtTdHJlYW0gPSBQREZOZXR3b3JrU3RyZWFtOworCitjbGFzcyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIgeworICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBzb3VyY2UpIHsKKyAgICB0aGlzLl9tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICBjb25zdCBhcmdzID0geworICAgICAgb25IZWFkZXJzUmVjZWl2ZWQ6IHRoaXMuX29uSGVhZGVyc1JlY2VpdmVkLmJpbmQodGhpcyksCisgICAgICBvbkRvbmU6IHRoaXMuX29uRG9uZS5iaW5kKHRoaXMpLAorICAgICAgb25FcnJvcjogdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpLAorICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpCisgICAgfTsKKyAgICB0aGlzLl91cmwgPSBzb3VyY2UudXJsOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RGdWxsKGFyZ3MpOworICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTsKKyAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKyAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTsKKworICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkgeworICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlOworICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTsKKyAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworICAgIHRoaXMuX2RvbmUgPSBmYWxzZTsKKyAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKyAgfQorCisgIF9vbkhlYWRlcnNSZWNlaXZlZCgpIHsKKyAgICBjb25zdCBmdWxsUmVxdWVzdFhocklkID0gdGhpcy5fZnVsbFJlcXVlc3RJZDsKKworICAgIGNvbnN0IGZ1bGxSZXF1ZXN0WGhyID0gdGhpcy5fbWFuYWdlci5nZXRSZXF1ZXN0WGhyKGZ1bGxSZXF1ZXN0WGhySWQpOworCisgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHsKKyAgICAgIHJldHVybiBmdWxsUmVxdWVzdFhoci5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTsKKyAgICB9OworCisgICAgY29uc3QgeworICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLAorICAgICAgc3VnZ2VzdGVkTGVuZ3RoCisgICAgfSA9ICgwLCBfbmV0d29ya191dGlscy52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoeworICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsCisgICAgICBpc0h0dHA6IHRoaXMuX21hbmFnZXIuaXNIdHRwLAorICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLAorICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2UKKyAgICB9KTsKKworICAgIGlmIChhbGxvd1JhbmdlUmVxdWVzdHMpIHsKKyAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSB0cnVlOworICAgIH0KKworICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgdGhpcy5fY29udGVudExlbmd0aDsKKyAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7CisKKyAgICBpZiAodGhpcy5faXNSYW5nZVN1cHBvcnRlZCkgeworICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QoZnVsbFJlcXVlc3RYaHJJZCk7CisgICAgfQorCisgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgIH0KKworICBfb25Eb25lKGFyZ3MpIHsKKyAgICBpZiAoYXJncykgeworICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpOworCisgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICAgIHZhbHVlOiBhcmdzLmNodW5rLAorICAgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fY2FjaGVkQ2h1bmtzLnB1c2goYXJncy5jaHVuayk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICBpZiAodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aCA+IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKyAgfQorCisgIF9vbkVycm9yKHN0YXR1cykgeworICAgIGNvbnN0IHVybCA9IHRoaXMuX3VybDsKKyAgICBjb25zdCBleGNlcHRpb24gPSAoMCwgX25ldHdvcmtfdXRpbHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikoc3RhdHVzLCB1cmwpOworICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXhjZXB0aW9uOworCisgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QoZXhjZXB0aW9uKTsKKworICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7CisgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZWplY3QoZXhjZXB0aW9uKTsKKyAgICB9KTsKKworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgICAgdGhpcy5fY2FjaGVkQ2h1bmtzID0gW107CisgIH0KKworICBfb25Qcm9ncmVzcyhkYXRhKSB7CisgICAgaWYgKHRoaXMub25Qcm9ncmVzcykgeworICAgICAgdGhpcy5vblByb2dyZXNzKHsKKyAgICAgICAgbG9hZGVkOiBkYXRhLmxvYWRlZCwKKyAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoQ29tcHV0YWJsZSA/IGRhdGEudG90YWwgOiB0aGlzLl9jb250ZW50TGVuZ3RoCisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBnZXQgZmlsZW5hbWUoKSB7CisgICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lOworICB9CisKKyAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7CisgIH0KKworICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOworICB9CisKKyAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7CisgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7CisgIH0KKworICBnZXQgaGVhZGVyc1JlYWR5KCkgeworICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBhc3luYyByZWFkKCkgeworICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7CisgICAgfQorCisgICAgaWYgKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NhY2hlZENodW5rcy5zaGlmdCgpOworCisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogY2h1bmssCisgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICB9OworICAgIH0KKworICAgIGlmICh0aGlzLl9kb25lKSB7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9OworICAgIH0KKworICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7CisKKyAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIGNhbmNlbChyZWFzb24pIHsKKyAgICB0aGlzLl9kb25lID0gdHJ1ZTsKKworICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CisKKyAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKworICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCkpIHsKKyAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpOworICAgIH0KKworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDsKKyAgfQorCit9CisKK2NsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIgeworICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBiZWdpbiwgZW5kKSB7CisgICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7CisgICAgY29uc3QgYXJncyA9IHsKKyAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksCisgICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcykKKyAgICB9OworICAgIHRoaXMuX3JlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQsIGFyZ3MpOworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsOworICAgIHRoaXMuX2RvbmUgPSBmYWxzZTsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICAgIHRoaXMub25DbG9zZWQgPSBudWxsOworICB9CisKKyAgX2Nsb3NlKCkgeworICAgIGlmICh0aGlzLm9uQ2xvc2VkKSB7CisgICAgICB0aGlzLm9uQ2xvc2VkKHRoaXMpOworICAgIH0KKyAgfQorCisgIF9vbkRvbmUoZGF0YSkgeworICAgIGNvbnN0IGNodW5rID0gZGF0YS5jaHVuazsKKworICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7CisKKyAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICB2YWx1ZTogY2h1bmssCisgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBjaHVuazsKKyAgICB9CisKKyAgICB0aGlzLl9kb25lID0gdHJ1ZTsKKworICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7CisgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfSk7CisgICAgfSk7CisKKyAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworCisgICAgdGhpcy5fY2xvc2UoKTsKKyAgfQorCisgIF9vblByb2dyZXNzKGV2dCkgeworICAgIGlmICghdGhpcy5pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLm9uUHJvZ3Jlc3MpIHsKKyAgICAgIHRoaXMub25Qcm9ncmVzcyh7CisgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZAorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGFzeW5jIHJlYWQoKSB7CisgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rICE9PSBudWxsKSB7CisgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rOworICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsOworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IGNodW5rLAorICAgICAgICBkb25lOiBmYWxzZQorICAgICAgfTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fZG9uZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfTsKKyAgICB9CisKKyAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKworICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpOworCisgICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBjYW5jZWwocmVhc29uKSB7CisgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKworICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fcmVxdWVzdElkKSkgeworICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fcmVxdWVzdElkKTsKKyAgICB9CisKKyAgICB0aGlzLl9jbG9zZSgpOworICB9CisKK30KKworLyoqKi8gfSksCisvKiAyNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERkZldGNoU3RyZWFtID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX25ldHdvcmtfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKKworOworCitmdW5jdGlvbiBjcmVhdGVGZXRjaE9wdGlvbnMoaGVhZGVycywgd2l0aENyZWRlbnRpYWxzLCBhYm9ydENvbnRyb2xsZXIpIHsKKyAgcmV0dXJuIHsKKyAgICBtZXRob2Q6ICJHRVQiLAorICAgIGhlYWRlcnMsCisgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIgJiYgYWJvcnRDb250cm9sbGVyLnNpZ25hbCwKKyAgICBtb2RlOiAiY29ycyIsCisgICAgY3JlZGVudGlhbHM6IHdpdGhDcmVkZW50aWFscyA/ICJpbmNsdWRlIiA6ICJzYW1lLW9yaWdpbiIsCisgICAgcmVkaXJlY3Q6ICJmb2xsb3ciCisgIH07Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUhlYWRlcnMoaHR0cEhlYWRlcnMpIHsKKyAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7CisKKyAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBodHRwSGVhZGVycykgeworICAgIGNvbnN0IHZhbHVlID0gaHR0cEhlYWRlcnNbcHJvcGVydHldOworCisgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGhlYWRlcnMuYXBwZW5kKHByb3BlcnR5LCB2YWx1ZSk7CisgIH0KKworICByZXR1cm4gaGVhZGVyczsKK30KKworY2xhc3MgUERGRmV0Y2hTdHJlYW0geworICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHsKKyAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3Qoc291cmNlLnVybCk7CisgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTsKKyAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7CisgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOworICB9CisKKyAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7CisgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID8gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2xvYWRlZCA6IDA7CisgIH0KKworICBnZXRGdWxsUmVhZGVyKCkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERkZldGNoU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SZWFkZXIodGhpcyk7CisgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOworICB9CisKKyAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkgeworICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTsKKworICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpOworCisgICAgcmV0dXJuIHJlYWRlcjsKKyAgfQorCisgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikgeworICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgeworICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfQorCisgICAgY29uc3QgcmVhZGVycyA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCk7CisKKyAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikgeworICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5QREZGZXRjaFN0cmVhbSA9IFBERkZldGNoU3RyZWFtOworCitjbGFzcyBQREZGZXRjaFN0cmVhbVJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSkgeworICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLl9yZWFkZXIgPSBudWxsOworICAgIHRoaXMuX2xvYWRlZCA9IDA7CisgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsOworICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7CisgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTsKKyAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKyAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlOworICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplOworCisgICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7CisgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlOworICAgIH0KKworICAgIGlmICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAidW5kZWZpbmVkIikgeworICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOworICAgIH0KKworICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtOworICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTsKKyAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpOworICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7CisgICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAgIGlmICghKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHJlc3BvbnNlLnN0YXR1cykpIHsKKyAgICAgICAgdGhyb3cgKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHJlc3BvbnNlLnN0YXR1cywgdXJsKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTsKKworICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4geworICAgICAgICByZXR1cm4gcmVzcG9uc2UuaGVhZGVycy5nZXQobmFtZSk7CisgICAgICB9OworCisgICAgICBjb25zdCB7CisgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cywKKyAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoCisgICAgICB9ID0gKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7CisgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyLAorICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsCisgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSwKKyAgICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2UKKyAgICAgIH0pOworICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0czsKKyAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgdGhpcy5fY29udGVudExlbmd0aDsKKyAgICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGdldFJlc3BvbnNlSGVhZGVyKTsKKworICAgICAgaWYgKCF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7CisgICAgICAgIHRoaXMuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiU3RyZWFtaW5nIGlzIGRpc2FibGVkLiIpKTsKKyAgICAgIH0KKyAgICB9KS5jYXRjaCh0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QpOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgIH0KKworICBnZXQgaGVhZGVyc1JlYWR5KCkgeworICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgZ2V0IGZpbGVuYW1lKCkgeworICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTsKKyAgfQorCisgIGdldCBjb250ZW50TGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoOworICB9CisKKyAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7CisgIH0KKworICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBhd2FpdCB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlOworICAgIGNvbnN0IHsKKyAgICAgIHZhbHVlLAorICAgICAgZG9uZQorICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpOworCisgICAgaWYgKGRvbmUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlLAorICAgICAgICBkb25lCisgICAgICB9OworICAgIH0KKworICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoOworCisgICAgaWYgKHRoaXMub25Qcm9ncmVzcykgeworICAgICAgdGhpcy5vblByb2dyZXNzKHsKKyAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsCisgICAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoCisgICAgICB9KTsKKyAgICB9CisKKyAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh2YWx1ZSkuYnVmZmVyOworICAgIHJldHVybiB7CisgICAgICB2YWx1ZTogYnVmZmVyLAorICAgICAgZG9uZTogZmFsc2UKKyAgICB9OworICB9CisKKyAgY2FuY2VsKHJlYXNvbikgeworICAgIGlmICh0aGlzLl9yZWFkZXIpIHsKKyAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fYWJvcnRDb250cm9sbGVyKSB7CisgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTsKKyAgICB9CisgIH0KKworfQorCitjbGFzcyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyIHsKKyAgY29uc3RydWN0b3Ioc3RyZWFtLCBiZWdpbiwgZW5kKSB7CisgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMuX3JlYWRlciA9IG51bGw7CisgICAgdGhpcy5fbG9hZGVkID0gMDsKKyAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlOworICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7CisgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07CisKKyAgICBpZiAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKKyAgICB9CisKKyAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpOworCisgICAgdGhpcy5faGVhZGVycy5hcHBlbmQoIlJhbmdlIiwgYGJ5dGVzPSR7YmVnaW59LSR7ZW5kIC0gMX1gKTsKKworICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7CisgICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAgIGlmICghKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHJlc3BvbnNlLnN0YXR1cykpIHsKKyAgICAgICAgdGhyb3cgKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHJlc3BvbnNlLnN0YXR1cywgdXJsKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICB0aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpOworICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5uYW1lID09PSAiQWJvcnRFcnJvciIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aHJvdyByZWFzb247CisgICAgfSk7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKyAgfQorCisgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgIH0KKworICBhc3luYyByZWFkKCkgeworICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgY29uc3QgeworICAgICAgdmFsdWUsCisgICAgICBkb25lCisgICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7CisKKyAgICBpZiAoZG9uZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWUsCisgICAgICAgIGRvbmUKKyAgICAgIH07CisgICAgfQorCisgICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CisKKyAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7CisgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZAorICAgICAgfSk7CisgICAgfQorCisgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpLmJ1ZmZlcjsKKyAgICByZXR1cm4geworICAgICAgdmFsdWU6IGJ1ZmZlciwKKyAgICAgIGRvbmU6IGZhbHNlCisgICAgfTsKKyAgfQorCisgIGNhbmNlbChyZWFzb24pIHsKKyAgICBpZiAodGhpcy5fcmVhZGVyKSB7CisgICAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfQorCisgICAgaWYgKHRoaXMuX2Fib3J0Q29udHJvbGxlcikgeworICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7CisgICAgfQorICB9CisKK30KKworLyoqKi8gfSkKKy8qKioqKiovIF0pOworfSk7CisvLyMgc291cmNlTWFwcGluZ1VSTD1wZGYuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvcGRmLmpzLm1hcCBiL2J1aWxkL3BkZi5qcy5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwOTcxZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3BkZi5qcy5tYXAKQEAgLTAsMCArMSBAQAoreyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL3BkZi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9zaGFyZWQvdXRpbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvc2hhcmVkL2NvbXBhdGliaWxpdHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL3NoYXJlZC9pc19ub2RlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L2FwaS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9mb250X2xvYWRlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9ub2RlX3V0aWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L2Fubm90YXRpb25fc3RvcmFnZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9hcGlfY29tcGF0aWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9jYW52YXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvcGF0dGVybl9oZWxwZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvd29ya2VyX29wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL3NoYXJlZC9tZXNzYWdlX2hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkveG1sX3BhcnNlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9vcHRpb25hbF9jb250ZW50X2NvbmZpZy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS90cmFuc3BvcnRfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L3dlYmdsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L2Fubm90YXRpb25fbGF5ZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvdGV4dF9sYXllci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9zdmcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvbm9kZV9zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvbmV0d29ya191dGlscy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9jb250ZW50X2Rpc3Bvc2l0aW9uLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L25ldHdvcmsuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzIl0sIm5hbWVzIjpbInBkZmpzVmVyc2lvbiIsInBkZmpzQnVpbGQiLCJyZXF1aXJlIiwiUERGTm9kZVN0cmVhbSIsInNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5IiwicGFyYW1zIiwiUERGTmV0d29ya1N0cmVhbSIsIlBERkZldGNoU3RyZWFtIiwiaXNWYWxpZEZldGNoVXJsIiwiREVGQVVMVF9MSU5LX1JFTCIsIlNWR19OUyIsImNvbnN0cnVjdG9yIiwidW5yZWFjaGFibGUiLCJjcmVhdGUiLCJyZXNldCIsImNhbnZhc0FuZENvbnRleHQiLCJ3aWR0aCIsImhlaWdodCIsImRlc3Ryb3kiLCJvd25lckRvY3VtZW50IiwiZ2xvYmFsVGhpcyIsImNhbnZhcyIsImNvbnRleHQiLCJiYXNlVXJsIiwiaXNDb21wcmVzc2VkIiwidXJsIiwiY29tcHJlc3Npb25UeXBlIiwiQ01hcENvbXByZXNzaW9uVHlwZSIsInJlYXNvbiIsIl9mZXRjaERhdGEiLCJpc0ZldGNoU3VwcG9ydGVkIiwiZG9jdW1lbnQiLCJyZXNwb25zZSIsImNNYXBEYXRhIiwic3RyaW5nVG9CeXRlcyIsInJlcXVlc3QiLCJYTUxIdHRwUmVxdWVzdCIsInJlc29sdmUiLCJyZWplY3QiLCJhc3NlcnQiLCJzdmciLCJjcmVhdGVFbGVtZW50Iiwib2Zmc2V0WCIsIm9mZnNldFkiLCJkb250RmxpcCIsImNlbnRlclgiLCJ2aWV3Qm94IiwiY2VudGVyWSIsInJvdGF0aW9uIiwicm90YXRlQSIsInJvdGF0ZUIiLCJyb3RhdGVDIiwicm90YXRlRCIsIm9mZnNldENhbnZhc1giLCJNYXRoIiwib2Zmc2V0Q2FudmFzWSIsImNsb25lIiwic2NhbGUiLCJjb252ZXJ0VG9WaWV3cG9ydFBvaW50IiwiY29udmVydFRvVmlld3BvcnRSZWN0YW5nbGUiLCJ0b3BMZWZ0IiwicmVjdCIsImJvdHRvbVJpZ2h0IiwiY29udmVydFRvUGRmUG9pbnQiLCJMaW5rVGFyZ2V0IiwiTk9ORSIsIlNFTEYiLCJCTEFOSyIsIlBBUkVOVCIsIlRPUCIsImVuYWJsZWQiLCJ1cmxOdWxsUmVtb3ZlZCIsInJlbW92ZU51bGxDaGFyYWN0ZXJzIiwibGluayIsInRhcmdldFN0ciIsImFuY2hvciIsInF1ZXJ5IiwiZW5kIiwiT2JqZWN0IiwidGltZSIsIm5hbWUiLCJ3YXJuIiwiRGF0ZSIsInRpbWVFbmQiLCJzdGFydCIsInRvU3RyaW5nIiwib3V0QnVmIiwibG9uZ2VzdCIsImR1cmF0aW9uIiwiUmVzcG9uc2UiLCJwcm90b2NvbCIsInNjcmlwdCIsImNvbnNvbGUiLCJpc1N0cmluZyIsInBkZkRhdGVTdHJpbmdSZWdleCIsIm1hdGNoZXMiLCJ5ZWFyIiwicGFyc2VJbnQiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJ1bml2ZXJzYWxUaW1lUmVsYXRpb24iLCJvZmZzZXRIb3VyIiwib2Zmc2V0TWludXRlIiwiSURFTlRJVFlfTUFUUklYIiwiRk9OVF9JREVOVElUWV9NQVRSSVgiLCJQZXJtaXNzaW9uRmxhZyIsIlBSSU5UIiwiTU9ESUZZX0NPTlRFTlRTIiwiQ09QWSIsIk1PRElGWV9BTk5PVEFUSU9OUyIsIkZJTExfSU5URVJBQ1RJVkVfRk9STVMiLCJDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZIiwiQVNTRU1CTEUiLCJQUklOVF9ISUdIX1FVQUxJVFkiLCJUZXh0UmVuZGVyaW5nTW9kZSIsIkZJTEwiLCJTVFJPS0UiLCJGSUxMX1NUUk9LRSIsIklOVklTSUJMRSIsIkZJTExfQUREX1RPX1BBVEgiLCJTVFJPS0VfQUREX1RPX1BBVEgiLCJGSUxMX1NUUk9LRV9BRERfVE9fUEFUSCIsIkFERF9UT19QQVRIIiwiRklMTF9TVFJPS0VfTUFTSyIsIkFERF9UT19QQVRIX0ZMQUciLCJJbWFnZUtpbmQiLCJHUkFZU0NBTEVfMUJQUCIsIlJHQl8yNEJQUCIsIlJHQkFfMzJCUFAiLCJBbm5vdGF0aW9uVHlwZSIsIlRFWFQiLCJMSU5LIiwiRlJFRVRFWFQiLCJMSU5FIiwiU1FVQVJFIiwiQ0lSQ0xFIiwiUE9MWUdPTiIsIlBPTFlMSU5FIiwiSElHSExJR0hUIiwiVU5ERVJMSU5FIiwiU1FVSUdHTFkiLCJTVFJJS0VPVVQiLCJTVEFNUCIsIkNBUkVUIiwiSU5LIiwiUE9QVVAiLCJGSUxFQVRUQUNITUVOVCIsIlNPVU5EIiwiTU9WSUUiLCJXSURHRVQiLCJTQ1JFRU4iLCJQUklOVEVSTUFSSyIsIlRSQVBORVQiLCJXQVRFUk1BUksiLCJUSFJFRUQiLCJSRURBQ1QiLCJBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUiLCJNQVJLRUQiLCJSRVZJRVciLCJBbm5vdGF0aW9uTWFya2VkU3RhdGUiLCJVTk1BUktFRCIsIkFubm90YXRpb25SZXZpZXdTdGF0ZSIsIkFDQ0VQVEVEIiwiUkVKRUNURUQiLCJDQU5DRUxMRUQiLCJDT01QTEVURUQiLCJBbm5vdGF0aW9uUmVwbHlUeXBlIiwiR1JPVVAiLCJSRVBMWSIsIkFubm90YXRpb25GbGFnIiwiSElEREVOIiwiTk9aT09NIiwiTk9ST1RBVEUiLCJOT1ZJRVciLCJSRUFET05MWSIsIkxPQ0tFRCIsIlRPR0dMRU5PVklFVyIsIkxPQ0tFRENPTlRFTlRTIiwiQW5ub3RhdGlvbkZpZWxkRmxhZyIsIlJFUVVJUkVEIiwiTk9FWFBPUlQiLCJNVUxUSUxJTkUiLCJQQVNTV09SRCIsIk5PVE9HR0xFVE9PRkYiLCJSQURJTyIsIlBVU0hCVVRUT04iLCJDT01CTyIsIkVESVQiLCJTT1JUIiwiRklMRVNFTEVDVCIsIk1VTFRJU0VMRUNUIiwiRE9OT1RTUEVMTENIRUNLIiwiRE9OT1RTQ1JPTEwiLCJDT01CIiwiUklDSFRFWFQiLCJSQURJT1NJTlVOSVNPTiIsIkNPTU1JVE9OU0VMQ0hBTkdFIiwiQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSIsIlNPTElEIiwiREFTSEVEIiwiQkVWRUxFRCIsIklOU0VUIiwiU3RyZWFtVHlwZSIsIlVOS05PV04iLCJGTEFURSIsIkxaVyIsIkRDVCIsIkpQWCIsIkpCSUciLCJBODUiLCJBSFgiLCJDQ0YiLCJSTFgiLCJGb250VHlwZSIsIlRZUEUxIiwiVFlQRTFDIiwiQ0lERk9OVFRZUEUwIiwiQ0lERk9OVFRZUEUwQyIsIlRSVUVUWVBFIiwiQ0lERk9OVFRZUEUyIiwiVFlQRTMiLCJPUEVOVFlQRSIsIlRZUEUwIiwiTU1UWVBFMSIsIlZlcmJvc2l0eUxldmVsIiwiRVJST1JTIiwiV0FSTklOR1MiLCJJTkZPUyIsIkJJTkFSWSIsIlNUUkVBTSIsIk9QUyIsImRlcGVuZGVuY3kiLCJzZXRMaW5lV2lkdGgiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRNaXRlckxpbWl0Iiwic2V0RGFzaCIsInNldFJlbmRlcmluZ0ludGVudCIsInNldEZsYXRuZXNzIiwic2V0R1N0YXRlIiwic2F2ZSIsInJlc3RvcmUiLCJ0cmFuc2Zvcm0iLCJtb3ZlVG8iLCJsaW5lVG8iLCJjdXJ2ZVRvIiwiY3VydmVUbzIiLCJjdXJ2ZVRvMyIsImNsb3NlUGF0aCIsInJlY3RhbmdsZSIsInN0cm9rZSIsImNsb3NlU3Ryb2tlIiwiZmlsbCIsImVvRmlsbCIsImZpbGxTdHJva2UiLCJlb0ZpbGxTdHJva2UiLCJjbG9zZUZpbGxTdHJva2UiLCJjbG9zZUVPRmlsbFN0cm9rZSIsImVuZFBhdGgiLCJjbGlwIiwiZW9DbGlwIiwiYmVnaW5UZXh0IiwiZW5kVGV4dCIsInNldENoYXJTcGFjaW5nIiwic2V0V29yZFNwYWNpbmciLCJzZXRIU2NhbGUiLCJzZXRMZWFkaW5nIiwic2V0Rm9udCIsInNldFRleHRSZW5kZXJpbmdNb2RlIiwic2V0VGV4dFJpc2UiLCJtb3ZlVGV4dCIsInNldExlYWRpbmdNb3ZlVGV4dCIsInNldFRleHRNYXRyaXgiLCJuZXh0TGluZSIsInNob3dUZXh0Iiwic2hvd1NwYWNlZFRleHQiLCJuZXh0TGluZVNob3dUZXh0IiwibmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQiLCJzZXRDaGFyV2lkdGgiLCJzZXRDaGFyV2lkdGhBbmRCb3VuZHMiLCJzZXRTdHJva2VDb2xvclNwYWNlIiwic2V0RmlsbENvbG9yU3BhY2UiLCJzZXRTdHJva2VDb2xvciIsInNldFN0cm9rZUNvbG9yTiIsInNldEZpbGxDb2xvciIsInNldEZpbGxDb2xvck4iLCJzZXRTdHJva2VHcmF5Iiwic2V0RmlsbEdyYXkiLCJzZXRTdHJva2VSR0JDb2xvciIsInNldEZpbGxSR0JDb2xvciIsInNldFN0cm9rZUNNWUtDb2xvciIsInNldEZpbGxDTVlLQ29sb3IiLCJzaGFkaW5nRmlsbCIsImJlZ2luSW5saW5lSW1hZ2UiLCJiZWdpbkltYWdlRGF0YSIsImVuZElubGluZUltYWdlIiwicGFpbnRYT2JqZWN0IiwibWFya1BvaW50IiwibWFya1BvaW50UHJvcHMiLCJiZWdpbk1hcmtlZENvbnRlbnQiLCJiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyIsImVuZE1hcmtlZENvbnRlbnQiLCJiZWdpbkNvbXBhdCIsImVuZENvbXBhdCIsInBhaW50Rm9ybVhPYmplY3RCZWdpbiIsInBhaW50Rm9ybVhPYmplY3RFbmQiLCJiZWdpbkdyb3VwIiwiZW5kR3JvdXAiLCJiZWdpbkFubm90YXRpb25zIiwiZW5kQW5ub3RhdGlvbnMiLCJiZWdpbkFubm90YXRpb24iLCJlbmRBbm5vdGF0aW9uIiwicGFpbnRKcGVnWE9iamVjdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwIiwicGFpbnRJbWFnZVhPYmplY3QiLCJwYWludElubGluZUltYWdlWE9iamVjdCIsInBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAiLCJwYWludEltYWdlWE9iamVjdFJlcGVhdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCIsInBhaW50U29saWRDb2xvckltYWdlTWFzayIsImNvbnN0cnVjdFBhdGgiLCJVTlNVUFBPUlRFRF9GRUFUVVJFUyIsInVua25vd24iLCJmb3JtcyIsImphdmFTY3JpcHQiLCJzbWFzayIsInNoYWRpbmdQYXR0ZXJuIiwiZm9udCIsImVycm9yVGlsaW5nUGF0dGVybiIsImVycm9yRXh0R1N0YXRlIiwiZXJyb3JYT2JqZWN0IiwiZXJyb3JGb250TG9hZFR5cGUzIiwiZXJyb3JGb250U3RhdGUiLCJlcnJvckZvbnRNaXNzaW5nIiwiZXJyb3JGb250VHJhbnNsYXRlIiwiZXJyb3JDb2xvclNwYWNlIiwiZXJyb3JPcGVyYXRvckxpc3QiLCJlcnJvckZvbnRUb1VuaWNvZGUiLCJlcnJvckZvbnRMb2FkTmF0aXZlIiwiZXJyb3JGb250R2V0UGF0aCIsImVycm9yTWFya2VkQ29udGVudCIsIlBhc3N3b3JkUmVzcG9uc2VzIiwiTkVFRF9QQVNTV09SRCIsIklOQ09SUkVDVF9QQVNTV09SRCIsInZlcmJvc2l0eSIsIk51bWJlciIsImJhc2UiLCJvdGhlciIsImFic29sdXRlVXJsIiwiX2lzVmFsaWRQcm90b2NvbCIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIkJhc2VFeGNlcHRpb24iLCJOdWxsQ2hhcmFjdGVyc1JlZ0V4cCIsInN0ciIsImJ5dGVzIiwibGVuZ3RoIiwiTUFYX0FSR1VNRU5UX0NPVU5UIiwiU3RyaW5nIiwic3RyQnVmIiwiaSIsImNodW5rRW5kIiwiY2h1bmsiLCJhcnIiLCJyZXN1bHRMZW5ndGgiLCJhcnJheUJ5dGVMZW5ndGgiLCJwb3MiLCJkYXRhIiwiaXRlbSIsIml0ZW1MZW5ndGgiLCJ2YWx1ZSIsImJ1ZmZlcjgiLCJ2aWV3MzIiLCJJc0xpdHRsZUVuZGlhbkNhY2hlZCIsInNoYWRvdyIsImlzTGl0dGxlRW5kaWFuIiwiSXNFdmFsU3VwcG9ydGVkQ2FjaGVkIiwiaXNFdmFsU3VwcG9ydGVkIiwicmdiQnVmIiwibTEiLCJtMiIsInh0IiwicCIsIm0iLCJ5dCIsImQiLCJwMSIsIlV0aWwiLCJwMiIsInIiLCJwMyIsInA0IiwidiIsInRyYW5zcG9zZSIsImEiLCJiIiwiYyIsImZpcnN0Iiwic3giLCJzeSIsIm9yZGVyZWRYIiwicmVjdDEiLCJyZWN0MiIsIm9yZGVyZWRZIiwicmVzdWx0IiwiUERGU3RyaW5nVHJhbnNsYXRlVGFibGUiLCJjb2RlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhcnIxIiwiYXJyMiIsImVsZW1lbnQiLCJkYXRlIiwiYnVmZmVyIiwiY2FwYWJpbGl0eSIsImlzU2V0dGxlZCIsImdldCIsImNyZWF0ZU9iamVjdFVSTCIsImRpZ2l0cyIsImZvcmNlRGF0YVNjaGVtYSIsIlVSTCIsImJsb2IiLCJ0eXBlIiwiaWkiLCJiMSIsImIyIiwiYjMiLCJkMSIsImQyIiwiZDMiLCJkNCIsImlzTm9kZUpTIiwicHJvY2VzcyIsIkRFRkFVTFRfUkFOR0VfQ0hVTktfU0laRSIsIlJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVCIsIkRlZmF1bHRDYW52YXNGYWN0b3J5IiwiRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5IiwiY3JlYXRlUERGTmV0d29ya1N0cmVhbSIsInRhc2siLCJzb3VyY2UiLCJpc0FycmF5QnVmZmVyIiwic3JjIiwicmFuZ2UiLCJyYW5nZVRyYW5zcG9ydCIsIndvcmtlciIsImtleSIsIndpbmRvdyIsInBkZkJ5dGVzIiwiaXNOYU4iLCJhcGlDb21wYXRpYmlsaXR5UGFyYW1zIiwic2V0VmVyYm9zaXR5TGV2ZWwiLCJ3b3JrZXJQYXJhbXMiLCJwb3J0IiwiR2xvYmFsV29ya2VyT3B0aW9ucyIsIlBERldvcmtlciIsImRvY0lkIiwid29ya2VySWRQcm9taXNlIiwiX2ZldGNoRG9jdW1lbnQiLCJuZXR3b3JrU3RyZWFtUHJvbWlzZSIsIm5ldHdvcmtTdHJlYW0iLCJpbml0aWFsRGF0YSIsInByb2dyZXNzaXZlRG9uZSIsImRpc2FibGVSYW5nZSIsImRpc2FibGVTdHJlYW0iLCJodHRwSGVhZGVycyIsIndpdGhDcmVkZW50aWFscyIsInJhbmdlQ2h1bmtTaXplIiwibWVzc2FnZUhhbmRsZXIiLCJ0cmFuc3BvcnQiLCJQcm9taXNlIiwicGRmRGF0YVJhbmdlVHJhbnNwb3J0IiwiYXBpVmVyc2lvbiIsInBhc3N3b3JkIiwiZGlzYWJsZUF1dG9GZXRjaCIsIm1heEltYWdlU2l6ZSIsImRpc2FibGVGb250RmFjZSIsInBvc3RNZXNzYWdlVHJhbnNmZXJzIiwiZG9jQmFzZVVybCIsImlnbm9yZUVycm9ycyIsImZvbnRFeHRyYVByb3BlcnRpZXMiLCJQREZEb2N1bWVudExvYWRpbmdUYXNrIiwibmV4dERvY3VtZW50SWQiLCJ0cmFuc3BvcnREZXN0cm95ZWQiLCJhZGRSYW5nZUxpc3RlbmVyIiwiYWRkUHJvZ3Jlc3NMaXN0ZW5lciIsImFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyIiwiYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIiLCJvbkRhdGFSYW5nZSIsImxpc3RlbmVyIiwib25EYXRhUHJvZ3Jlc3MiLCJvbkRhdGFQcm9ncmVzc2l2ZVJlYWQiLCJvbkRhdGFQcm9ncmVzc2l2ZURvbmUiLCJ0cmFuc3BvcnRSZWFkeSIsInJlcXVlc3REYXRhUmFuZ2UiLCJhYm9ydCIsImdldFBhZ2UiLCJnZXRQYWdlSW5kZXgiLCJnZXREZXN0aW5hdGlvbnMiLCJnZXREZXN0aW5hdGlvbiIsImdldFBhZ2VMYWJlbHMiLCJnZXRQYWdlTGF5b3V0IiwiZ2V0UGFnZU1vZGUiLCJnZXRWaWV3ZXJQcmVmZXJlbmNlcyIsImdldE9wZW5BY3Rpb24iLCJnZXRBdHRhY2htZW50cyIsImdldEphdmFTY3JpcHQiLCJnZXRPdXRsaW5lIiwiZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnIiwiZ2V0UGVybWlzc2lvbnMiLCJnZXRNZXRhZGF0YSIsImdldERhdGEiLCJnZXREb3dubG9hZEluZm8iLCJnZXRTdGF0cyIsImNsZWFudXAiLCJzYXZlRG9jdW1lbnQiLCJwZGZCdWciLCJnZXRWaWV3cG9ydCIsImdldEFubm90YXRpb25zIiwiaW50ZW50IiwicmVuZGVyIiwiZW5hYmxlV2ViR0wiLCJyZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIiwiaW1hZ2VMYXllciIsImNhbnZhc0ZhY3RvcnkiLCJiYWNrZ3JvdW5kIiwiYW5ub3RhdGlvblN0b3JhZ2UiLCJvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIiwicmVuZGVyaW5nSW50ZW50IiwiaW50ZW50U3RhdGUiLCJjbGVhclRpbWVvdXQiLCJjYW52YXNGYWN0b3J5SW5zdGFuY2UiLCJ3ZWJHTENvbnRleHQiLCJlbmFibGUiLCJmbkFycmF5IiwiYXJnc0FycmF5IiwibGFzdENodW5rIiwicGFnZUluZGV4IiwiY29tcGxldGUiLCJlcnJvciIsImludGVybmFsUmVuZGVyVGFzayIsImNhbGxiYWNrIiwib2JqcyIsImNvbW1vbk9ianMiLCJvcGVyYXRvckxpc3QiLCJ1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJyZW5kZXJUYXNrIiwiZ2V0T3BlcmF0b3JMaXN0Iiwib3BMaXN0VGFzayIsInN0cmVhbVRleHRDb250ZW50Iiwibm9ybWFsaXplV2hpdGVzcGFjZSIsImRpc2FibGVDb21iaW5lVGV4dEl0ZW1zIiwiVEVYVF9DT05URU5UX0NIVU5LX1NJWkUiLCJjb21iaW5lVGV4dEl0ZW1zIiwiaGlnaFdhdGVyTWFyayIsInNpemUiLCJ0ZXh0Q29udGVudCIsImdldFRleHRDb250ZW50IiwicmVhZGFibGVTdHJlYW0iLCJyZWFkZXIiLCJwdW1wIiwiaXRlbXMiLCJzdHlsZXMiLCJfZGVzdHJveSIsIndhaXRPbiIsImZvcmNlIiwicmVzZXRTdGF0cyIsIl90cnlDbGVhbnVwIiwicmVuZGVyVGFza3MiLCJfc3RhcnRSZW5kZXJQYWdlIiwiX3JlbmRlclBhZ2VDaHVuayIsIm9wZXJhdG9yTGlzdENodW5rIiwiX3B1bXBPcGVyYXRvckxpc3QiLCJhcmdzIiwiX2Fib3J0T3BlcmF0b3JMaXN0IiwiY3VySW50ZW50U3RhdGUiLCJkZWZlciIsInBvc3RNZXNzYWdlIiwiY2xvbmVkIiwidHJhbnNmZXJhYmxlIiwidHJhbnNmZXJzIiwiQXJyYXkiLCJkZXNjIiwiY2xvbmVWYWx1ZSIsImUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRlcm1pbmF0ZSIsInBkZldvcmtlclBvcnRzIiwiaXNXb3JrZXJEaXNhYmxlZCIsIm5leHRGYWtlV29ya2VySWQiLCJmYWxsYmFja1dvcmtlclNyYyIsInBkZmpzRmlsZVBhdGgiLCJkZXByZWNhdGVkIiwibWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyIiwiZmFrZVdvcmtlckNhcGFiaWxpdHkiLCJsb2FkZXIiLCJnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIiLCJldmFsIiwiZ2V0V29ya2VyU3JjIiwibG9hZFNjcmlwdCIsIndyYXBwZXIiLCJfaW5pdGlhbGl6ZUZyb21Qb3J0IiwiX2luaXRpYWxpemUiLCJ3b3JrZXJTcmMiLCJpc1NhbWVPcmlnaW4iLCJjcmVhdGVDRE5XcmFwcGVyIiwidGVybWluYXRlRWFybHkiLCJvbldvcmtlckVycm9yIiwic2VuZFRlc3QiLCJ0ZXN0T2JqIiwiaW5mbyIsIl9zZXR1cEZha2VXb3JrZXIiLCJzZXR1cEZha2VXb3JrZXJHbG9iYWwiLCJXb3JrZXJNZXNzYWdlSGFuZGxlciIsImlkIiwid29ya2VySGFuZGxlciIsImxvYWRpbmdUYXNrIiwib25VbnN1cHBvcnRlZEZlYXR1cmUiLCJwYWdlIiwidGVybWluYXRlZCIsInNldHVwTWVzc2FnZUhhbmRsZXIiLCJldnQiLCJsb2FkZWQiLCJ0b3RhbCIsInNpbmsiLCJyZWFkeVJlYXNvbiIsImhlYWRlcnNDYXBhYmlsaXR5IiwiZnVsbFJlYWRlciIsImlzU3RyZWFtaW5nU3VwcG9ydGVkIiwiaXNSYW5nZVN1cHBvcnRlZCIsImNvbnRlbnRMZW5ndGgiLCJyYW5nZVJlYWRlciIsInBkZkluZm8iLCJleCIsIm1zZyIsImV4Y2VwdGlvbiIsInVwZGF0ZVBhc3N3b3JkIiwiZXhwb3J0ZWRFcnJvciIsImV4cG9ydGVkRGF0YSIsImZvbnRSZWdpc3RyeSIsInJlZ2lzdGVyRm9udCIsInBhZ2VQcm94eSIsIk1BWF9JTUFHRV9TSVpFX1RPX1NUT1JFIiwiaW1hZ2VEYXRhIiwiZmV0Y2hlZCIsImJ1aWx0SW5DTWFwIiwiX29uVW5zdXBwb3J0ZWRGZWF0dXJlIiwicGFnZU51bWJlciIsInByb21pc2UiLCJwYWdlSW5mbyIsIm51bVBhZ2VzIiwiZmlsZW5hbWUiLCJyZXN1bHRzIiwibWV0YWRhdGEiLCJjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSIsInN0YXJ0Q2xlYW51cCIsImNsZWFudXBTdWNjZXNzZnVsIiwiX2Vuc3VyZU9iaiIsInJlc29sdmVkIiwib2JqIiwiaGFzIiwiY2xlYXIiLCJjYW5jZWwiLCJJbnRlcm5hbFJlbmRlclRhc2siLCJjYW52YXNJblJlbmRlcmluZyIsImluaXRpYWxpemVHcmFwaGljcyIsInRyYW5zcGFyZW5jeSIsIm9wZXJhdG9yTGlzdENoYW5nZWQiLCJfY29udGludWUiLCJfc2NoZWR1bGVOZXh0IiwidmVyc2lvbiIsImJ1aWxkIiwiYWRkTmF0aXZlRm9udEZhY2UiLCJpbnNlcnRSdWxlIiwic3R5bGVFbGVtZW50Iiwic3R5bGVTaGVldCIsIm5hdGl2ZUZvbnRGYWNlIiwiZmVhdHVyZUlkIiwicnVsZSIsIl9xdWV1ZUxvYWRpbmdDYWxsYmFjayIsInN1cHBvcnRlZCIsIl9wcmVwYXJlRm9udExvYWRFdmVudCIsIkZvbnRMb2FkZXIiLCJyZXF1ZXN0cyIsIm5leHRSZXF1ZXN0SWQiLCJuYXZpZ2F0b3IiLCJvdGhlclJlcXVlc3QiLCJzZXRUaW1lb3V0IiwiZG9uZSIsImdldExvYWRUZXN0Rm9udCIsImF0b2IiLCJvZmZzZXQiLCJjaHVuazEiLCJzIiwiY2h1bmsyIiwiY3R4IiwiY2FsbGVkIiwiaXNGb250UmVhZHkiLCJsb2FkVGVzdEZvbnRJZCIsIkNPTU1FTlRfT0ZGU0VUIiwic3BsaWNlU3RyaW5nIiwiQ0ZGX0NIRUNLU1VNX09GRlNFVCIsIlhYWFhfVkFMVUUiLCJjaGVja3N1bSIsImludDMyIiwic3RyaW5nMzIiLCJidG9hIiwibmFtZXMiLCJmb250cyIsImRpdiIsInNwYW4iLCJ0cmFuc2xhdGVkRGF0YSIsImNyZWF0ZU5hdGl2ZUZvbnRGYWNlIiwiY3JlYXRlRm9udEZhY2VSdWxlIiwiYnl0ZXNUb1N0cmluZyIsImdldFBhdGhHZW5lcmF0b3IiLCJjbWRzIiwianMiLCJjdXJyZW50IiwiTm9kZUNhbnZhc0ZhY3RvcnkiLCJOb2RlQ01hcFJlYWRlckZhY3RvcnkiLCJDYW52YXMiLCJfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyIsImZzIiwiZ2V0T3JDcmVhdGVWYWx1ZSIsInNldFZhbHVlIiwiZ2V0QWxsIiwiX3NldE1vZGlmaWVkIiwicmVzZXRNb2RpZmllZCIsImNvbXBhdGliaWxpdHlQYXJhbXMiLCJNSU5fRk9OVF9TSVpFIiwiTUFYX0ZPTlRfU0laRSIsIk1BWF9HUk9VUF9TSVpFIiwiTUlOX1dJRFRIX0ZBQ1RPUiIsIkNPTVBJTEVfVFlQRTNfR0xZUEhTIiwiTUFYX1NJWkVfVE9fQ09NUElMRSIsIkZVTExfQ0hVTktfSEVJR0hUIiwiZiIsImFkX2JjIiwiYmNfYWQiLCJvbGQiLCJwcmV2IiwiY29zVmFsdWUiLCJzaW5WYWx1ZSIsIkNhY2hlZENhbnZhc2VzIiwiZ2V0Q2FudmFzIiwiY2FudmFzRW50cnkiLCJhZGRDb250ZXh0Q3VycmVudFRyYW5zZm9ybSIsIlBPSU5UX1RPX1BST0NFU1NfTElNSVQiLCJpbWdEYXRhIiwid2lkdGgxIiwicG9pbnRzIiwiUE9JTlRfVFlQRVMiLCJsaW5lU2l6ZSIsImRhdGEwIiwibWFzayIsImVsZW0iLCJjb3VudCIsImoiLCJqMCIsInN1bSIsInN0ZXBzIiwib3V0bGluZXMiLCJjb29yZHMiLCJwMCIsInN0ZXAiLCJwcCIsImRyYXdPdXRsaW5lIiwiayIsImtrIiwibyIsImwiLCJsbCIsIkNhbnZhc0V4dHJhU3RhdGUiLCJzZXRDdXJyZW50UG9pbnQiLCJDYW52YXNHcmFwaGljcyIsIkVYRUNVVElPTl9USU1FIiwiRVhFQ1VUSU9OX1NURVBTIiwidHJhbnNmZXJNYXBzIiwicGFydGlhbENodW5rSGVpZ2h0IiwiZnVsbENodW5rcyIsInRvdGFsQ2h1bmtzIiwiY2h1bmtJbWdEYXRhIiwic3JjUG9zIiwiZGVzdCIsInRyYW5zZmVyTWFwUmVkIiwidHJhbnNmZXJNYXBHcmVlbiIsInRyYW5zZmVyTWFwQmx1ZSIsInRyYW5zZmVyTWFwR3JheSIsInNyY0xlbmd0aCIsImRlc3QzMiIsImRlc3QzMkRhdGFMZW5ndGgiLCJmdWxsU3JjRGlmZiIsIndoaXRlIiwiYmxhY2siLCJ0aGlzQ2h1bmtIZWlnaHQiLCJkZXN0UG9zIiwic3JjRGlmZiIsImtFbmQiLCJrRW5kVW5yb2xsZWQiLCJzcmNCeXRlIiwiaGFzVHJhbnNmZXJNYXBzIiwiZWxlbXNJblRoaXNDaHVuayIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsInNvdXJjZUN0eCIsImRlc3RDdHgiLCJhbHBoYSIsImFscGhhXyIsInIwIiwiZzAiLCJiMCIsIm1hc2tEYXRhIiwidHJhbnNmZXJNYXAiLCJsYXllckRhdGEiLCJ5IiwiaGFzQmFja2Ryb3AiLCJiYWNrZHJvcCIsInN1YnR5cGUiLCJjb21wb3NlRm4iLCJQSVhFTFNfVE9fUFJPQ0VTUyIsImNodW5rU2l6ZSIsInJvdyIsImNodW5rSGVpZ2h0IiwibWFza0N0eCIsImxheWVyQ3R4IiwiY29tcG9zZVNNYXNrQmFja2Ryb3AiLCJjb21wb3NlZCIsImxheWVyIiwiZ2VuZXJpY0NvbXBvc2VTTWFzayIsIkxJTkVfQ0FQX1NUWUxFUyIsIkxJTkVfSk9JTl9TVFlMRVMiLCJOT1JNQUxfQ0xJUCIsIkVPX0NMSVAiLCJiZWdpbkRyYXdpbmciLCJ0cmFuc3BhcmVudENhbnZhcyIsInJlc2V0Q3R4VG9EZWZhdWx0Iiwidmlld3BvcnQiLCJleGVjdXRlT3BlcmF0b3JMaXN0IiwiZXhlY3V0aW9uU3RhcnRJZHgiLCJhcmdzQXJyYXlMZW4iLCJjaHVua09wZXJhdGlvbnMiLCJlbmRUaW1lIiwic3RlcHBlciIsImZuSWQiLCJvYmpzUG9vbCIsImRlcE9iaklkIiwiY29udGludWVDYWxsYmFjayIsImVuZERyYXdpbmciLCJzdGF0ZXMiLCJzdGF0ZSIsImJlZ2luU01hc2tHcm91cCIsImFjdGl2ZVNNYXNrIiwiZHJhd25XaWR0aCIsImRyYXduSGVpZ2h0IiwiY2FjaGVJZCIsInNjcmF0Y2hDYW52YXMiLCJjdXJyZW50Q3R4IiwiY3VycmVudFRyYW5zZm9ybSIsImdyb3VwQ3R4IiwiY29weUN0eFN0YXRlIiwic3VzcGVuZFNNYXNrR3JvdXAiLCJjb21wb3NlU01hc2siLCJkZWx0YVRyYW5zZm9ybSIsInJlc3VtZVNNYXNrR3JvdXAiLCJlbmRTTWFza0dyb3VwIiwieCIsIm9wcyIsInh3IiwieWgiLCJjb25zdW1lUGF0aCIsInN0cm9rZUNvbG9yIiwiZmlsbENvbG9yIiwiaXNQYXR0ZXJuRmlsbCIsIm5lZWRSZXN0b3JlIiwicGF0aHMiLCJwYXRoIiwiZm9udE9iaiIsImJvbGQiLCJpdGFsaWMiLCJ0eXBlZmFjZSIsImJyb3dzZXJGb250U2l6ZSIsInBhaW50Q2hhciIsInRleHRSZW5kZXJpbmdNb2RlIiwiZm9udFNpemUiLCJmaWxsU3Ryb2tlTW9kZSIsImlzQWRkVG9QYXRoU2V0IiwicGF0dGVybkZpbGwiLCJhZGRUb1BhdGgiLCJmb250U2l6ZVNjYWxlIiwiY2hhclNwYWNpbmciLCJ3b3JkU3BhY2luZyIsImZvbnREaXJlY3Rpb24iLCJ0ZXh0SFNjYWxlIiwiZ2x5cGhzTGVuZ3RoIiwiZ2x5cGhzIiwidmVydGljYWwiLCJzcGFjaW5nRGlyIiwiZGVmYXVsdFZNZXRyaWNzIiwid2lkdGhBZHZhbmNlU2NhbGUiLCJzaW1wbGVGaWxsVGV4dCIsInBhdHRlcm4iLCJwYXR0ZXJuVHJhbnNmb3JtIiwibGluZVdpZHRoIiwiZ2x5cGgiLCJpc051bSIsInJlc3RvcmVOZWVkZWQiLCJzcGFjaW5nIiwiY2hhcmFjdGVyIiwiYWNjZW50Iiwidm1ldHJpYyIsInZ4IiwidnkiLCJzY2FsZWRYIiwic2NhbGVkWSIsIm1lYXN1cmVkV2lkdGgiLCJjaGFyYWN0ZXJTY2FsZVgiLCJzY2FsZWRBY2NlbnRYIiwic2NhbGVkQWNjZW50WSIsImNoYXJXaWR0aCIsInNob3dUeXBlM1RleHQiLCJmb250TWF0cml4IiwiaXNUZXh0SW52aXNpYmxlIiwic3BhY2luZ0xlbmd0aCIsInRyYW5zZm9ybWVkIiwidXJ4IiwidXJ5IiwiZ2V0Q29sb3JOX1BhdHRlcm4iLCJJUiIsImNvbG9yIiwiYmFzZVRyYW5zZm9ybSIsImNhbnZhc0dyYXBoaWNzRmFjdG9yeSIsImNyZWF0ZUNhbnZhc0dyYXBoaWNzIiwiZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIiLCJpbnYiLCJibCIsImJyIiwidWwiLCJ1ciIsIngwIiwieTAiLCJ4MSIsInkxIiwibWF0cml4IiwiYmJveCIsImdyb3VwIiwiYm91bmRzIiwiY2FudmFzQm91bmRzIiwic2NhbGVYIiwic2NhbGVZIiwic3RhcnRUcmFuc2Zvcm1JbnZlcnNlIiwiaW1nIiwibWFza0NhbnZhcyIsInB1dEJpbmFyeUltYWdlTWFzayIsInNrZXdYIiwic2tld1kiLCJwb3NpdGlvbnMiLCJpbWFnZXMiLCJpbWFnZSIsIm9iaklkIiwibWFwIiwidyIsImgiLCJ3aWR0aFNjYWxlIiwiaGVpZ2h0U2NhbGUiLCJpbWdUb1BhaW50IiwidG1wQ2FudmFzIiwidG1wQ3R4IiwicHV0QmluYXJ5SW1hZ2VEYXRhIiwicGFpbnRXaWR0aCIsInBhaW50SGVpZ2h0IiwidG1wQ2FudmFzSWQiLCJuZXdXaWR0aCIsIm5ld0hlaWdodCIsInBvc2l0aW9uIiwibGVmdCIsInRvcCIsImVudHJ5IiwidmlzaWJsZSIsInRhZyIsImdldFNpbmdsZVBpeGVsV2lkdGgiLCJpbnZlcnNlIiwiZ2V0Q2FudmFzUG9zaXRpb24iLCJpc0NvbnRlbnRWaXNpYmxlIiwiU2hhZGluZ0lScyIsInJlZ2lvbiIsImZyb21JUiIsInJhdyIsImNvbG9yU3RvcHMiLCJyMSIsImdldFBhdHRlcm4iLCJhcHBseUJvdW5kaW5nQm94IiwiZ3JhZCIsImNyZWF0ZU1lc2hDYW52YXMiLCJjb2xvcnMiLCJyb3dTaXplIiwidG1wIiwiYzEiLCJjMiIsImMzIiwieDIiLCJ5MiIsIngzIiwieTMiLCJjMXIiLCJjMWciLCJjMWIiLCJjMnIiLCJjMmciLCJjMmIiLCJjM3IiLCJjM2ciLCJjM2IiLCJtaW5ZIiwibWF4WSIsInhhIiwiY2FyIiwiY2FnIiwiY2FiIiwieGIiLCJjYnIiLCJjYmciLCJjYmIiLCJ4MV8iLCJ4Ml8iLCJwcyIsImZpZ3VyZSIsImNzIiwidmVydGljZXNQZXJSb3ciLCJyb3dzIiwiY29scyIsInEiLCJkcmF3VHJpYW5nbGUiLCJFWFBFQ1RFRF9TQ0FMRSIsIk1BWF9QQVRURVJOX1NJWkUiLCJCT1JERVJfU0laRSIsImJvdW5kc1dpZHRoIiwiYm91bmRzSGVpZ2h0IiwiY29tYmluZXNTY2FsZSIsInBhZGRlZFdpZHRoIiwicGFkZGVkSGVpZ2h0IiwiY2FjaGVkQ2FudmFzZXMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJmaWd1cmVzIiwiZHJhd0ZpZ3VyZSIsIm93bmVyIiwibWF0cml4U2NhbGUiLCJ0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzIiwic2hhZGluZ0lSIiwiVGlsaW5nUGF0dGVybiIsIlBhaW50VHlwZSIsIkNPTE9SRUQiLCJVTkNPTE9SRUQiLCJjcmVhdGVQYXR0ZXJuQ2FudmFzIiwieHN0ZXAiLCJ5c3RlcCIsInBhaW50VHlwZSIsInRpbGluZ1R5cGUiLCJjdXJNYXRyaXhTY2FsZSIsImNvbWJpbmVkU2NhbGUiLCJkaW14IiwiZGlteSIsImdyYXBoaWNzIiwiZ2V0U2l6ZUFuZFNjYWxlIiwibWF4U2l6ZSIsImNsaXBCYm94IiwiYmJveFdpZHRoIiwiYmJveEhlaWdodCIsInNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dCIsImNzc0NvbG9yIiwiQ2FsbGJhY2tLaW5kIiwiREFUQSIsIkVSUk9SIiwiU3RyZWFtS2luZCIsIkNBTkNFTCIsIkNBTkNFTF9DT01QTEVURSIsIkNMT1NFIiwiRU5RVUVVRSIsIlBVTEwiLCJQVUxMX0NPTVBMRVRFIiwiU1RBUlRfQ09NUExFVEUiLCJldmVudCIsImNhbGxiYWNrSWQiLCJ3cmFwUmVhc29uIiwiYWN0aW9uIiwiY2JTb3VyY2VOYW1lIiwiY2JUYXJnZXROYW1lIiwiY29tT2JqIiwic291cmNlTmFtZSIsInRhcmdldE5hbWUiLCJvbiIsImFoIiwic2VuZCIsInNlbmRXaXRoUHJvbWlzZSIsInNlbmRXaXRoU3RyZWFtIiwic3RyZWFtSWQiLCJjb250cm9sbGVyIiwic3RhcnRDYXBhYmlsaXR5Iiwic3RhcnRDYWxsIiwicHVsbENhbGwiLCJjYW5jZWxDYWxsIiwiaXNDbG9zZWQiLCJkZXNpcmVkU2l6ZSIsInB1bGwiLCJwdWxsQ2FwYWJpbGl0eSIsInN0cmVhbSIsImNhbmNlbENhcGFiaWxpdHkiLCJfY3JlYXRlU3RyZWFtU2luayIsInNlbGYiLCJzdHJlYW1TaW5rIiwiZW5xdWV1ZSIsImxhc3REZXNpcmVkU2l6ZSIsImNsb3NlIiwic2lua0NhcGFiaWxpdHkiLCJvblB1bGwiLCJvbkNhbmNlbCIsImlzQ2FuY2VsbGVkIiwicmVhZHkiLCJzdWNjZXNzIiwiX3Byb2Nlc3NTdHJlYW1NZXNzYWdlIiwiX3Bvc3RNZXNzYWdlIiwicGFyc2VyIiwieG1sRG9jdW1lbnQiLCJfcmVwYWlyIiwiY2hhcnMiLCJfcGFyc2UiLCJyZGYiLCJub2RlTmFtZSIsImNoaWxkcmVuIiwiamoiLCJYTUxQYXJzZXJFcnJvckNvZGUiLCJOb0Vycm9yIiwiRW5kT2ZEb2N1bWVudCIsIlVudGVybWluYXRlZENkYXQiLCJVbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbiIsIlVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbiIsIlVudGVybWluYXRlZENvbW1lbnQiLCJNYWxmb3JtZWRFbGVtZW50IiwiT3V0T2ZNZW1vcnkiLCJVbnRlcm1pbmF0ZWRBdHRyaWJ1dGVWYWx1ZSIsIlVudGVybWluYXRlZEVsZW1lbnQiLCJFbGVtZW50TmV2ZXJCZWd1biIsImNoIiwiaXNXaGl0ZXNwYWNlIiwiX3Jlc29sdmVFbnRpdGllcyIsImVudGl0eSIsIl9wYXJzZUNvbnRlbnQiLCJhdHRyaWJ1dGVzIiwic2tpcFdzIiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJhdHRyRW5kQ2hhciIsImF0dHJFbmRJbmRleCIsInBhcnNlZCIsIl9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbiIsImF0dHJTdGFydCIsInBhcnNlWG1sIiwiY2gyIiwicGkiLCJxMiIsImNvbXBsZXhEb2N0eXBlIiwiZG9jdHlwZUNvbnRlbnQiLCJjb250ZW50IiwidGV4dCIsIm9uUmVzb2x2ZUVudGl0eSIsIm9uUGkiLCJvbkNvbW1lbnQiLCJvbkNkYXRhIiwib25Eb2N0eXBlIiwib25UZXh0Iiwib25CZWdpbkVsZW1lbnQiLCJvbkVuZEVsZW1lbnQiLCJvbkVycm9yIiwiY2hpbGROb2RlcyIsImluZGV4IiwiY2hpbGQiLCJoYXNDaGlsZE5vZGVzIiwicGFyc2VGcm9tU3RyaW5nIiwiaXNXaGl0ZXNwYWNlU3RyaW5nIiwibm9kZSIsImxhc3RFbGVtZW50IiwiaXNWaXNpYmxlIiwic2V0VmlzaWJpbGl0eSIsImdldE9yZGVyIiwiZ2V0R3JvdXBzIiwiZ2V0R3JvdXAiLCJfb25SZWNlaXZlRGF0YSIsImZvdW5kIiwiX29uUHJvZ3Jlc3MiLCJmaXJzdFJlYWRlciIsIl9vblByb2dyZXNzaXZlRG9uZSIsIl9yZW1vdmVSYW5nZVJlYWRlciIsImdldEZ1bGxSZWFkZXIiLCJxdWV1ZWRDaHVua3MiLCJnZXRSYW5nZVJlYWRlciIsImNhbmNlbEFsbFJlcXVlc3RzIiwicmVhZGVycyIsIl9lbnF1ZXVlIiwicmVxdWVzdENhcGFiaWxpdHkiLCJyZXF1ZXN0c0NhcGFiaWxpdHkiLCJXZWJHTFV0aWxzIiwiZHJhd0ZpZ3VyZXMiLCJzaGFkZXIiLCJnbCIsImNvbXBpbGVkIiwiZXJyb3JNc2ciLCJsb2FkU2hhZGVyIiwicHJvZ3JhbSIsInNoYWRlcnMiLCJsaW5rZWQiLCJ0ZXh0dXJlIiwiY3VycmVudENhbnZhcyIsImN1cnJlbnRHTCIsInByZW11bHRpcGxpZWRhbHBoYSIsInNtYXNrVmVydGV4U2hhZGVyQ29kZSIsInNtYXNrRnJhZ21lbnRTaGFkZXJDb2RlIiwic21hc2tDYWNoZSIsImdlbmVyYXRlR0wiLCJ2ZXJ0ZXhTaGFkZXIiLCJjcmVhdGVWZXJ0ZXhTaGFkZXIiLCJmcmFnbWVudFNoYWRlciIsImNyZWF0ZUZyYWdtZW50U2hhZGVyIiwiY2FjaGUiLCJ0ZXhDb29yZExvY2F0aW9uIiwidGV4TGF5ZXJMb2NhdGlvbiIsInRleE1hc2tMb2NhdGlvbiIsInRleENvb3JkQnVmZmVyIiwiaW5pdFNtYXNrR0wiLCJjcmVhdGVUZXh0dXJlIiwibWFza1RleHR1cmUiLCJmaWd1cmVzVmVydGV4U2hhZGVyQ29kZSIsImZpZ3VyZXNGcmFnbWVudFNoYWRlckNvZGUiLCJmaWd1cmVzQ2FjaGUiLCJpbml0RmlndXJlc0dMIiwiY29vcmRzTWFwIiwiY29sb3JzTWFwIiwicEluZGV4IiwiY0luZGV4IiwiY29sIiwiY29vcmRzQnVmZmVyIiwiY29sb3JzQnVmZmVyIiwidHJ5SW5pdEdMIiwicGFyYW1ldGVycyIsImZpZWxkVHlwZSIsImlzUmVuZGVyYWJsZSIsImlnbm9yZUJvcmRlciIsIl9jcmVhdGVDb250YWluZXIiLCJjb250YWluZXIiLCJob3Jpem9udGFsUmFkaXVzIiwidmVydGljYWxSYWRpdXMiLCJyYWRpdXMiLCJfY3JlYXRlUG9wdXAiLCJ0cmlnZ2VyIiwicG9wdXBFbGVtZW50IiwidGl0bGUiLCJtb2RpZmljYXRpb25EYXRlIiwiY29udGVudHMiLCJoaWRlV3JhcHBlciIsInBvcHVwIiwiYWRkTGlua0F0dHJpYnV0ZXMiLCJ0YXJnZXQiLCJsaW5rU2VydmljZSIsInJlbCIsIl9iaW5kTGluayIsIl9iaW5kTmFtZWRBY3Rpb24iLCJKU09OIiwiVEVYVF9BTElHTk1FTlQiLCJzdG9yYWdlIiwiZmllbGRXaWR0aCIsImNvbWJXaWR0aCIsIl9zZXRUZXh0U3R5bGUiLCJzdHlsZSIsImZvbnRGYW1pbHkiLCJmYWxsYmFja05hbWUiLCJyYWRpbyIsInNlbGVjdEVsZW1lbnQiLCJvcHRpb25FbGVtZW50Iiwib3B0aW9uIiwib3B0aW9ucyIsIklHTk9SRV9UWVBFUyIsInNlbGVjdG9yIiwicGFyZW50RWxlbWVudCIsInBhcmVudExlZnQiLCJwYXJzZUZsb2F0IiwicGFyZW50V2lkdGgiLCJCQUNLR1JPVU5EX0VOTElHSFQiLCJnIiwiZGF0ZU9iamVjdCIsIlBERkRhdGVTdHJpbmciLCJfZm9ybWF0Q29udGVudHMiLCJsaW5lcyIsImxpbmUiLCJfdG9nZ2xlIiwiX3Nob3ciLCJwaW4iLCJfaGlkZSIsInVucGluIiwiYm9yZGVyV2lkdGgiLCJzcXVhcmUiLCJjaXJjbGUiLCJjb29yZGluYXRlIiwicG9seWxpbmUiLCJnZXRGaWxlbmFtZUZyb21VcmwiLCJzdHJpbmdUb1BERlN0cmluZyIsIl9kb3dubG9hZCIsInNvcnRlZEFubm90YXRpb25zIiwicG9wdXBBbm5vdGF0aW9ucyIsImRvd25sb2FkTWFuYWdlciIsImltYWdlUmVzb3VyY2VzUGF0aCIsInN2Z0ZhY3RvcnkiLCJyZW5kZXJUZXh0TGF5ZXIiLCJNQVhfVEVYVF9ESVZTX1RPX1JFTkRFUiIsIk5vbldoaXRlc3BhY2VSZWdleHAiLCJ0ZXh0RGl2IiwidGV4dERpdlByb3BlcnRpZXMiLCJhbmdsZSIsImNhbnZhc1dpZHRoIiwib3JpZ2luYWxUcmFuc2Zvcm0iLCJwYWRkaW5nQm90dG9tIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nVG9wIiwiaXNBbGxXaGl0ZXNwYWNlIiwiZ2VvbSIsInR4IiwiZm9udEhlaWdodCIsImZvbnRBc2NlbnQiLCJzaG91bGRTY2FsZVRleHQiLCJhYnNTY2FsZVgiLCJhYnNTY2FsZVkiLCJhbmdsZUNvcyIsImFuZ2xlU2luIiwiZGl2V2lkdGgiLCJkaXZIZWlnaHQiLCJyaWdodCIsImJvdHRvbSIsInRleHREaXZzIiwidGV4dERpdnNMZW5ndGgiLCJ0IiwidHMiLCJleHBhbmRlZCIsImV4cGFuZEJvdW5kcyIsImRpdlByb3BlcnRpZXMiLCJib3hTY2FsZSIsImZpbmRQb3NpdGl2ZU1pbiIsImJveCIsIngxTmV3IiwieDJOZXciLCJleHBhbmRCb3VuZHNMVFIiLCJib3hlcyIsImZha2VCb3VuZGFyeSIsImhvcml6b24iLCJib3VuZGFyeSIsIm1heFhOZXciLCJob3Jpem9uUGFydCIsImFmZmVjdGVkQm91bmRhcnkiLCJ4TmV3IiwiY2hhbmdlZEhvcml6b24iLCJsYXN0Qm91bmRhcnkiLCJ1c2VCb3VuZGFyeSIsInVzZWQiLCJ0ZXh0Q29udGVudEl0ZW1zU3RyIiwiVGV4dExheWVyUmVuZGVyVGFzayIsIl9wcm9jZXNzSXRlbXMiLCJsZW4iLCJhcHBlbmRUZXh0IiwiX2xheW91dFRleHQiLCJfcmVuZGVyIiwic3R5bGVDYWNoZSIsInRleHRJdGVtcyIsInRleHRTdHlsZXMiLCJleHBhbmRUZXh0RGl2cyIsImV4cGFuZCIsInRyYW5zZm9ybUJ1ZiIsInBhZGRpbmdCdWYiLCJkaXZQcm9wcyIsInJlbmRlclBhcmFtZXRlcnMiLCJ0ZXh0Q29udGVudFN0cmVhbSIsImVuaGFuY2VUZXh0U2VsZWN0aW9uIiwiU1ZHR3JhcGhpY3MiLCJTVkdfREVGQVVMVFMiLCJmb250U3R5bGUiLCJmb250V2VpZ2h0IiwiWE1MX05TIiwiWExJTktfTlMiLCJjb252ZXJ0SW1nRGF0YVRvUG5nIiwiUE5HX0hFQURFUiIsIkNIVU5LX1dSQVBQRVJfU0laRSIsImNyY1RhYmxlIiwiY3JjIiwiYm9keSIsImNyYzMyIiwiZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQiLCJpbnB1dCIsIkJ1ZmZlciIsIm91dHB1dCIsImxldmVsIiwibGl0ZXJhbHMiLCJtYXhCbG9ja0xlbmd0aCIsImRlZmxhdGVCbG9ja3MiLCJpZGF0IiwiYWRsZXIiLCJhZGxlcjMyIiwiY29sb3JUeXBlIiwiYml0RGVwdGgiLCJvZmZzZXRMaXRlcmFscyIsIm9mZnNldEJ5dGVzIiwia2luZCIsImloZHIiLCJkZWZsYXRlU3luYyIsInBuZ0xlbmd0aCIsIndyaXRlUG5nQ2h1bmsiLCJlbmNvZGUiLCJvcFRyZWUiLCJvcExpc3RFbGVtZW50IiwiZm4iLCJwZiIsImNsaXBDb3VudCIsIm1hc2tDb3VudCIsInNoYWRpbmdDb3VudCIsImxvYWREZXBlbmRlbmNpZXMiLCJ0cmFuc2Zvcm1NYXRyaXgiLCJnZXRTVkciLCJzdmdFbGVtZW50IiwiY29udmVydE9wTGlzdCIsIm9wZXJhdG9ySWRNYXBwaW5nIiwib3BMaXN0Iiwib3BMaXN0VG9UcmVlIiwiZXhlY3V0ZU9wVHJlZSIsIm9wVHJlZUVsZW1lbnQiLCJsaW5lV2lkdGhTY2FsZSIsInRleHRNYXRyaXgiLCJwbSIsImFkZEZvbnRTdHlsZSIsImRldGFpbHMiLCJzZXRTdHJva2VBbHBoYSIsInNldEZpbGxBbHBoYSIsIl9tYWtlQ29sb3JOX1BhdHRlcm4iLCJfbWFrZVRpbGluZ1BhdHRlcm4iLCJ0aWxpbmdJZCIsInR4c3RlcCIsInR5c3RlcCIsInRpbGluZyIsInR4MSIsInR5MSIsIl9tYWtlU2hhZGluZ1BhdHRlcm4iLCJzaGFkaW5nSWQiLCJwb2ludDAiLCJwb2ludDEiLCJncmFkaWVudCIsImZvY2FsUG9pbnQiLCJjaXJjbGVQb2ludCIsImZvY2FsUmFkaXVzIiwiY2lyY2xlUmFkaXVzIiwic3RvcCIsImNvbG9yU3RvcCIsIm9wIiwiY2xpcElkIiwiY2xpcFBhdGgiLCJjbGlwRWxlbWVudCIsIl9zZXRTdHJva2VBdHRyaWJ1dGVzIiwiZGFzaEFycmF5IiwiaW1nU3JjIiwiY2xpcHJlY3QiLCJpbWdFbCIsImRlZmluaXRpb25zIiwicm9vdEdyb3VwIiwiX2Vuc3VyZUNsaXBHcm91cCIsImNsaXBHcm91cCIsIl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCIsImh0dHAiLCJodHRwcyIsImZpbGVVcmlSZWdleCIsInBhcnNlZFVybCIsInBhcnNlVXJsIiwiX2Vycm9yIiwiX3NldFJlYWRhYmxlU3RyZWFtIiwiYXV0aCIsImhvc3QiLCJtZXRob2QiLCJoYW5kbGVSZXNwb25zZSIsImdldFJlc3BvbnNlSGVhZGVyIiwiaXNIdHRwIiwic3VnZ2VzdGVkTGVuZ3RoIiwiZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlciIsImNyZWF0ZVJlcXVlc3RPcHRpb25zIiwic3RhdCIsInJldHVyblZhbHVlcyIsImFsbG93UmFuZ2VSZXF1ZXN0cyIsImNvbnRlbnRFbmNvZGluZyIsImNvbnRlbnREaXNwb3NpdGlvbiIsImdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciIsInN0YXR1cyIsIm5lZWRzRW5jb2RpbmdGaXh1cCIsInRvUGFyYW1SZWdFeHAiLCJyZmMyNjE2dW5xdW90ZSIsInJmYzU5ODdkZWNvZGUiLCJyZmMyMDQ3ZGVjb2RlIiwiZml4dXBFbmNvZGluZyIsInJmYzIyMzFnZXRwYXJhbSIsImRlY29kZXIiLCJmYXRhbCIsInRleHRkZWNvZGUiLCJpdGVyIiwibiIsInBhcnRzIiwicGFydCIsInF1b3RpbmRleCIsImVuY29kaW5nZW5kIiwiZXh0dmFsdWUiLCJlbmNvZGluZyIsImxhbmd2YWx1ZSIsIk9LX1JFU1BPTlNFIiwiUEFSVElBTF9DT05URU5UX1JFU1BPTlNFIiwieGhyIiwiYXJyYXkiLCJyZXF1ZXN0UmFuZ2UiLCJsaXN0ZW5lcnMiLCJyZXF1ZXN0RnVsbCIsInhocklkIiwicGVuZGluZ1JlcXVlc3QiLCJvblByb2dyZXNzIiwib25TdGF0ZUNoYW5nZSIsInhoclN0YXR1cyIsIm9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QiLCJnZXRBcnJheUJ1ZmZlciIsInJhbmdlSGVhZGVyIiwiYmVnaW4iLCJnZXRSZXF1ZXN0WGhyIiwiaXNQZW5kaW5nUmVxdWVzdCIsImFib3J0UmVxdWVzdCIsIl9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZCIsIm9uSGVhZGVyc1JlY2VpdmVkIiwib25Eb25lIiwibWFuYWdlciIsIl9vbkhlYWRlcnNSZWNlaXZlZCIsImZ1bGxSZXF1ZXN0WGhySWQiLCJmdWxsUmVxdWVzdFhociIsIl9vbkRvbmUiLCJfb25FcnJvciIsImNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IiLCJfY2xvc2UiLCJzaWduYWwiLCJhYm9ydENvbnRyb2xsZXIiLCJtb2RlIiwiY3JlZGVudGlhbHMiLCJyZWRpcmVjdCIsImhlYWRlcnMiLCJjcmVhdGVIZWFkZXJzIiwiZmV0Y2giLCJjcmVhdGVGZXRjaE9wdGlvbnMiLCJ2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7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QUFMLEVBQThDO0FBQzVDLGNBQU1YLDhDQUEwQjMrQyxTQUExQjIrQyxRQURzQyxHQUN0Q0EsQ0FBTjtBQUZjOztBQUloQiwyQkFKZ0IsT0FJaEI7O0FBQ0EscUJBQWUzK0MsY0FMQyxTQUtEQSxFQUFmO0FBYkpvL0MsYUFlU3gvQyxVQUFVO0FBQ2YsVUFBSUEsVUFBVUEsZ0JBQWQsY0FBNEM7QUFBQTtBQUQ3Qjs7QUFJZixZQUplLE1BSWY7QUFwQzBCLEtBaUI5QncvQztBQXNCQSxzQkF2QzhCLElBdUM5QjtBQXhDNEI7O0FBMkM5Qiw2QkFBMkI7QUFDekIsV0FBTyxLQURrQixxQkFDekI7QUE1QzRCOztBQStDOUIsZUFBYTtBQUNYLFVBQU0scUJBREssT0FDWDtBQUNBLFVBQU07QUFBQTtBQUFBO0FBQUEsUUFBa0IsTUFBTSxhQUZuQixJQUVtQixFQUE5Qjs7QUFDQSxjQUFVO0FBQ1IsYUFBTztBQUFBO0FBQUE7QUFBQSxPQUFQO0FBSlM7O0FBTVgsb0JBQWdCN3BDLE1BTkwsVUFNWDs7QUFDQSxRQUFJLEtBQUosWUFBcUI7QUFDbkIsc0JBQWdCO0FBQUU4UCxnQkFBUSxLQURQO0FBQ0gsT0FBaEI7QUFSUzs7QUFVWCxVQUFNak4sU0FBUyxzQkFWSixNQVVYO0FBQ0EsV0FBTztBQUFFN0MsYUFBRjtBQUFpQmdVLFlBQWpCO0FBQUEsS0FBUDtBQTFENEI7O0FBNkQ5QjFCLGlCQUFlO0FBQ2IsUUFBSSxLQUFKLFNBQWtCO0FBQ2hCLDBCQURnQixNQUNoQjtBQUZXOztBQUliLFFBQUksS0FBSixrQkFBMkI7QUFDekIsNEJBRHlCLEtBQ3pCO0FBTFc7QUE3RGU7O0FBQUEsQyIsImZpbGUiOiJwZGYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd19wZGZqc19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd19wZGZqc19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd19wZGZqc19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dfcGRmanNfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd19wZGZqc19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd19wZGZqc19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd19wZGZqc19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucyA9IDApO1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIGFkZExpbmtBdHRyaWJ1dGVzLFxuICBnZXRGaWxlbmFtZUZyb21VcmwsXG4gIGlzRmV0Y2hTdXBwb3J0ZWQsXG4gIGlzVmFsaWRGZXRjaFVybCxcbiAgTGlua1RhcmdldCxcbiAgbG9hZFNjcmlwdCxcbiAgUERGRGF0ZVN0cmluZyxcbiAgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLFxufSBmcm9tIFwiLi9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIGJ1aWxkLFxuICBnZXREb2N1bWVudCxcbiAgTG9vcGJhY2tQb3J0LFxuICBQREZEYXRhUmFuZ2VUcmFuc3BvcnQsXG4gIFBERldvcmtlcixcbiAgc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnksXG4gIHZlcnNpb24sXG59IGZyb20gXCIuL2Rpc3BsYXkvYXBpLmpzXCI7XG5pbXBvcnQge1xuICBDTWFwQ29tcHJlc3Npb25UeXBlLFxuICBjcmVhdGVPYmplY3RVUkwsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBjcmVhdGVWYWxpZEFic29sdXRlVXJsLFxuICBJbnZhbGlkUERGRXhjZXB0aW9uLFxuICBNaXNzaW5nUERGRXhjZXB0aW9uLFxuICBPUFMsXG4gIFBhc3N3b3JkUmVzcG9uc2VzLFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgcmVtb3ZlTnVsbENoYXJhY3RlcnMsXG4gIHNoYWRvdyxcbiAgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uLFxuICBVTlNVUFBPUlRFRF9GRUFUVVJFUyxcbiAgVXRpbCxcbiAgVmVyYm9zaXR5TGV2ZWwsXG59IGZyb20gXCIuL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uTGF5ZXIgfSBmcm9tIFwiLi9kaXNwbGF5L2Fubm90YXRpb25fbGF5ZXIuanNcIjtcbmltcG9ydCB7IGFwaUNvbXBhdGliaWxpdHlQYXJhbXMgfSBmcm9tIFwiLi9kaXNwbGF5L2FwaV9jb21wYXRpYmlsaXR5LmpzXCI7XG5pbXBvcnQgeyBHbG9iYWxXb3JrZXJPcHRpb25zIH0gZnJvbSBcIi4vZGlzcGxheS93b3JrZXJfb3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgcmVuZGVyVGV4dExheWVyIH0gZnJvbSBcIi4vZGlzcGxheS90ZXh0X2xheWVyLmpzXCI7XG5pbXBvcnQgeyBTVkdHcmFwaGljcyB9IGZyb20gXCIuL2Rpc3BsYXkvc3ZnLmpzXCI7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAqL1xuY29uc3QgcGRmanNWZXJzaW9uID1cbiAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiID8gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9WRVJTSU9OXCIpIDogdm9pZCAwO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzICovXG5jb25zdCBwZGZqc0J1aWxkID1cbiAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiID8gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9CVUlMRFwiKSA6IHZvaWQgMDtcblxuaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIlBST0RVQ1RJT05cIikpIHtcbiAgY29uc3Qgc3RyZWFtc1Byb21pc2UgPSBQcm9taXNlLmFsbChbXG4gICAgaW1wb3J0KFwicGRmanMvZGlzcGxheS9uZXR3b3JrLmpzXCIpLFxuICAgIGltcG9ydChcInBkZmpzL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzXCIpLFxuICBdKTtcbiAgc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkocGFyYW1zID0+IHtcbiAgICByZXR1cm4gc3RyZWFtc1Byb21pc2UudGhlbihzdHJlYW1zID0+IHtcbiAgICAgIGNvbnN0IFt7IFBERk5ldHdvcmtTdHJlYW0gfSwgeyBQREZGZXRjaFN0cmVhbSB9XSA9IHN0cmVhbXM7XG4gICAgICBpZiAoaXNGZXRjaFN1cHBvcnRlZCgpICYmIGlzVmFsaWRGZXRjaFVybChwYXJhbXMudXJsKSkge1xuICAgICAgICByZXR1cm4gbmV3IFBERkZldGNoU3RyZWFtKHBhcmFtcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFBERk5ldHdvcmtTdHJlYW0ocGFyYW1zKTtcbiAgICB9KTtcbiAgfSk7XG59IGVsc2UgaWYgKFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpKSB7XG4gIGNvbnN0IHsgaXNOb2RlSlMgfSA9IHJlcXVpcmUoXCIuL3NoYXJlZC9pc19ub2RlLmpzXCIpO1xuICBpZiAoaXNOb2RlSlMpIHtcbiAgICBjb25zdCBQREZOb2RlU3RyZWFtID0gcmVxdWlyZShcIi4vZGlzcGxheS9ub2RlX3N0cmVhbS5qc1wiKS5QREZOb2RlU3RyZWFtO1xuICAgIHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KHBhcmFtcyA9PiB7XG4gICAgICByZXR1cm4gbmV3IFBERk5vZGVTdHJlYW0ocGFyYW1zKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBQREZOZXR3b3JrU3RyZWFtID0gcmVxdWlyZShcIi4vZGlzcGxheS9uZXR3b3JrLmpzXCIpLlBERk5ldHdvcmtTdHJlYW07XG4gICAgbGV0IFBERkZldGNoU3RyZWFtO1xuICAgIGlmIChpc0ZldGNoU3VwcG9ydGVkKCkpIHtcbiAgICAgIFBERkZldGNoU3RyZWFtID0gcmVxdWlyZShcIi4vZGlzcGxheS9mZXRjaF9zdHJlYW0uanNcIikuUERGRmV0Y2hTdHJlYW07XG4gICAgfVxuICAgIHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KHBhcmFtcyA9PiB7XG4gICAgICBpZiAoUERGRmV0Y2hTdHJlYW0gJiYgaXNWYWxpZEZldGNoVXJsKHBhcmFtcy51cmwpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRmV0Y2hTdHJlYW0ocGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUERGTmV0d29ya1N0cmVhbShwYXJhbXMpO1xuICAgIH0pO1xuICB9XG59IGVsc2UgaWYgKFBERkpTRGV2LnRlc3QoXCJDSFJPTUVcIikpIHtcbiAgY29uc3QgUERGTmV0d29ya1N0cmVhbSA9IHJlcXVpcmUoXCIuL2Rpc3BsYXkvbmV0d29yay5qc1wiKS5QREZOZXR3b3JrU3RyZWFtO1xuICBsZXQgUERGRmV0Y2hTdHJlYW07XG4gIGNvbnN0IGlzQ2hyb21lV2l0aEZldGNoQ3JlZGVudGlhbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZmV0Y2ggZG9lcyBub3QgaW5jbHVkZSBjcmVkZW50aWFscyB1bnRpbCBDaHJvbWUgNjEuMC4zMTM4LjAgYW5kIGxhdGVyLlxuICAgIC8vIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy8yZTIzMWNmMDUyY2E1ZTY4ZTIyYmFmMDAwOGFjOWU1ZTI5MTIxNzA3XG4gICAgdHJ5IHtcbiAgICAgIC8vIEluZGV4ZWQgcHJvcGVydGllcyBvbiB3aW5kb3cgYXJlIHJlYWQtb25seSBpbiBDaHJvbWUgNjEuMC4zMTUxLjArXG4gICAgICAvLyBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLmdpdC8rLzU4YWI0YTk3MWIwNmRlYzEzZTRlZGY5ZGU4MzgyY2E2ODQ3ZjYxOTBcbiAgICAgIHdpbmRvd1s5OTldID0gMTIzOyAvLyBzaG91bGQgdGhyb3cuIE5vdGU6IEpTIHN0cmljdCBtb2RlIE1VU1QgYmUgZW5hYmxlZC5cbiAgICAgIGRlbGV0ZSB3aW5kb3dbOTk5XTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGlmIChpc0ZldGNoU3VwcG9ydGVkKCkgJiYgaXNDaHJvbWVXaXRoRmV0Y2hDcmVkZW50aWFscygpKSB7XG4gICAgUERGRmV0Y2hTdHJlYW0gPSByZXF1aXJlKFwiLi9kaXNwbGF5L2ZldGNoX3N0cmVhbS5qc1wiKS5QREZGZXRjaFN0cmVhbTtcbiAgfVxuICBzZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeShwYXJhbXMgPT4ge1xuICAgIGlmIChQREZGZXRjaFN0cmVhbSAmJiBpc1ZhbGlkRmV0Y2hVcmwocGFyYW1zLnVybCkpIHtcbiAgICAgIHJldHVybiBuZXcgUERGRmV0Y2hTdHJlYW0ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQREZOZXR3b3JrU3RyZWFtKHBhcmFtcyk7XG4gIH0pO1xufVxuXG5leHBvcnQge1xuICAvLyBGcm9tIFwiLi9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanNcIjpcbiAgYWRkTGlua0F0dHJpYnV0ZXMsXG4gIGdldEZpbGVuYW1lRnJvbVVybCxcbiAgTGlua1RhcmdldCxcbiAgbG9hZFNjcmlwdCxcbiAgUERGRGF0ZVN0cmluZyxcbiAgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLFxuICAvLyBGcm9tIFwiLi9kaXNwbGF5L2FwaS5qc1wiOlxuICBidWlsZCxcbiAgZ2V0RG9jdW1lbnQsXG4gIExvb3BiYWNrUG9ydCxcbiAgUERGRGF0YVJhbmdlVHJhbnNwb3J0LFxuICBQREZXb3JrZXIsXG4gIHZlcnNpb24sXG4gIC8vIEZyb20gXCIuL3NoYXJlZC91dGlsLmpzXCI6XG4gIENNYXBDb21wcmVzc2lvblR5cGUsXG4gIGNyZWF0ZU9iamVjdFVSTCxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG4gIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwsXG4gIEludmFsaWRQREZFeGNlcHRpb24sXG4gIE1pc3NpbmdQREZFeGNlcHRpb24sXG4gIE9QUyxcbiAgUGFzc3dvcmRSZXNwb25zZXMsXG4gIFBlcm1pc3Npb25GbGFnLFxuICByZW1vdmVOdWxsQ2hhcmFjdGVycyxcbiAgc2hhZG93LFxuICBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sXG4gIFVOU1VQUE9SVEVEX0ZFQVRVUkVTLFxuICBVdGlsLFxuICBWZXJib3NpdHlMZXZlbCxcbiAgLy8gRnJvbSBcIi4vZGlzcGxheS9hbm5vdGF0aW9uX2xheWVyLmpzXCI6XG4gIEFubm90YXRpb25MYXllcixcbiAgLy8gRnJvbSBcIi4vZGlzcGxheS9hcGlfY29tcGF0aWJpbGl0eS5qc1wiOlxuICBhcGlDb21wYXRpYmlsaXR5UGFyYW1zLFxuICAvLyBGcm9tIFwiLi9kaXNwbGF5L3dvcmtlcl9vcHRpb25zLmpzXCI6XG4gIEdsb2JhbFdvcmtlck9wdGlvbnMsXG4gIC8vIEZyb20gXCIuL2Rpc3BsYXkvdGV4dF9sYXllci5qc1wiOlxuICByZW5kZXJUZXh0TGF5ZXIsXG4gIC8vIEZyb20gXCIuL2Rpc3BsYXkvc3ZnLmpzXCI6XG4gIFNWR0dyYXBoaWNzLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE1IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBCYXNlRXhjZXB0aW9uLFxuICBDTWFwQ29tcHJlc3Npb25UeXBlLFxuICBpc1N0cmluZyxcbiAgcmVtb3ZlTnVsbENoYXJhY3RlcnMsXG4gIHN0cmluZ1RvQnl0ZXMsXG4gIHVucmVhY2hhYmxlLFxuICBVdGlsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuY29uc3QgREVGQVVMVF9MSU5LX1JFTCA9IFwibm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvd1wiO1xuY29uc3QgU1ZHX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuXG5jbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ2FudmFzRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ2FudmFzRmFjdG9yeS5cIik7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlYCBjYWxsZWQuXCIpO1xuICB9XG5cbiAgcmVzZXQoY2FudmFzQW5kQ29udGV4dCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkXCIpO1xuICAgIH1cbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjYW52YXMgc2l6ZVwiKTtcbiAgICB9XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBkZXN0cm95KGNhbnZhc0FuZENvbnRleHQpIHtcbiAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW52YXMgaXMgbm90IHNwZWNpZmllZFwiKTtcbiAgICB9XG4gICAgLy8gWmVyb2luZyB0aGUgd2lkdGggYW5kIGhlaWdodCBjYXVzZSBGaXJlZm94IHRvIHJlbGVhc2UgZ3JhcGhpY3NcbiAgICAvLyByZXNvdXJjZXMgaW1tZWRpYXRlbHksIHdoaWNoIGNhbiBncmVhdGx5IHJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24uXG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSAwO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMgPSBudWxsO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY29udGV4dCA9IG51bGw7XG4gIH1cbn1cblxuY2xhc3MgRE9NQ2FudmFzRmFjdG9yeSBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoeyBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudCB9ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcbiAgfVxuXG4gIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgfVxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzLFxuICAgICAgY29udGV4dCxcbiAgICB9O1xuICB9XG59XG5cbmNsYXNzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHsgYmFzZVVybCA9IG51bGwsIGlzQ29tcHJlc3NlZCA9IGZhbHNlIH0pIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5KSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS5cIik7XG4gICAgfVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgdGhpcy5pc0NvbXByZXNzZWQgPSBpc0NvbXByZXNzZWQ7XG4gIH1cblxuICBhc3luYyBmZXRjaCh7IG5hbWUgfSkge1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgQ01hcCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgK1xuICAgICAgICAgICd0aGUgXCJjTWFwVXJsXCIgYW5kIFwiY01hcFBhY2tlZFwiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNNYXAgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybCArIG5hbWUgKyAodGhpcy5pc0NvbXByZXNzZWQgPyBcIi5iY21hcFwiIDogXCJcIik7XG4gICAgY29uc3QgY29tcHJlc3Npb25UeXBlID0gdGhpcy5pc0NvbXByZXNzZWRcbiAgICAgID8gQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUllcbiAgICAgIDogQ01hcENvbXByZXNzaW9uVHlwZS5OT05FO1xuXG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byBsb2FkICR7dGhpcy5pc0NvbXByZXNzZWQgPyBcImJpbmFyeSBcIiA6IFwiXCJ9Q01hcCBhdDogJHt1cmx9YFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfZmV0Y2hEYXRhYCBjYWxsZWQuXCIpO1xuICB9XG59XG5cbmNsYXNzIERPTUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIGlmIChcbiAgICAgICh0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiYgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHx8XG4gICAgICAoaXNGZXRjaFN1cHBvcnRlZCgpICYmIGlzVmFsaWRGZXRjaFVybCh1cmwsIGRvY3VtZW50LmJhc2VVUkkpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZldGNoKHVybCkudGhlbihhc3luYyByZXNwb25zZSA9PiB7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNNYXBEYXRhO1xuICAgICAgICBpZiAodGhpcy5pc0NvbXByZXNzZWQpIHtcbiAgICAgICAgICBjTWFwRGF0YSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNNYXBEYXRhID0gc3RyaW5nVG9CeXRlcyhhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNNYXBEYXRhLCBjb21wcmVzc2lvblR5cGUgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSBGZXRjaCBBUEkgaXMgbm90IHN1cHBvcnRlZC5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgcmVxdWVzdC5vcGVuKFwiR0VUXCIsIHVybCwgdHJ1ZSk7XG5cbiAgICAgIGlmICh0aGlzLmlzQ29tcHJlc3NlZCkge1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwIHx8IHJlcXVlc3Quc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgbGV0IGNNYXBEYXRhO1xuICAgICAgICAgIGlmICh0aGlzLmlzQ29tcHJlc3NlZCAmJiByZXF1ZXN0LnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjTWFwRGF0YSA9IG5ldyBVaW50OEFycmF5KHJlcXVlc3QucmVzcG9uc2UpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNDb21wcmVzc2VkICYmIHJlcXVlc3QucmVzcG9uc2VUZXh0KSB7XG4gICAgICAgICAgICBjTWFwRGF0YSA9IHN0cmluZ1RvQnl0ZXMocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY01hcERhdGEpIHtcbiAgICAgICAgICAgIHJlc29sdmUoeyBjTWFwRGF0YSwgY29tcHJlc3Npb25UeXBlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZWplY3QobmV3IEVycm9yKHJlcXVlc3Quc3RhdHVzVGV4dCkpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5zZW5kKG51bGwpO1xuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIERPTVNWR0ZhY3Rvcnkge1xuICBjcmVhdGUod2lkdGgsIGhlaWdodCkge1xuICAgIGFzc2VydCh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCwgXCJJbnZhbGlkIFNWRyBkaW1lbnNpb25zXCIpO1xuXG4gICAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJzdmc6c3ZnXCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3aWR0aCArIFwicHhcIik7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoZWlnaHQgKyBcInB4XCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsIFwibm9uZVwiKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBcIjAgMCBcIiArIHdpZHRoICsgXCIgXCIgKyBoZWlnaHQpO1xuXG4gICAgcmV0dXJuIHN2ZztcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnQodHlwZSkge1xuICAgIGFzc2VydCh0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiwgXCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGVcIik7XG5cbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWdlVmlld3BvcnRQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge0FycmF5PG51bWJlcj59IHZpZXdCb3ggLSBUaGUgeE1pbiwgeU1pbiwgeE1heCBhbmRcbiAqICAgeU1heCBjb29yZGluYXRlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY2FsZSAtIFRoZSBzY2FsZSBvZiB0aGUgdmlld3BvcnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcm90YXRpb24gLSBUaGUgcm90YXRpb24sIGluIGRlZ3JlZXMsIG9mIHRoZSB2aWV3cG9ydC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0WF0gLSBUaGUgaG9yaXpvbnRhbCwgaS5lLiB4LWF4aXMsIG9mZnNldC4gVGhlXG4gKiAgIGRlZmF1bHQgdmFsdWUgaXMgYDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRZXSAtIFRoZSB2ZXJ0aWNhbCwgaS5lLiB5LWF4aXMsIG9mZnNldC4gVGhlXG4gKiAgIGRlZmF1bHQgdmFsdWUgaXMgYDBgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZG9udEZsaXBdIC0gSWYgdHJ1ZSwgdGhlIHktYXhpcyB3aWxsIG5vdCBiZSBmbGlwcGVkLlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGFnZVZpZXdwb3J0Q2xvbmVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3NjYWxlXSAtIFRoZSBzY2FsZSwgb3ZlcnJpZGluZyB0aGUgb25lIGluIHRoZSBjbG9uZWRcbiAqICAgdmlld3BvcnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0aGlzLnNjYWxlYC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcm90YXRpb25dIC0gVGhlIHJvdGF0aW9uLCBpbiBkZWdyZWVzLCBvdmVycmlkaW5nIHRoZSBvbmVcbiAqICAgaW4gdGhlIGNsb25lZCB2aWV3cG9ydC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRoaXMucm90YXRpb25gLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRYXSAtIFRoZSBob3Jpem9udGFsLCBpLmUuIHgtYXhpcywgb2Zmc2V0LlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdGhpcy5vZmZzZXRYYC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0WV0gLSBUaGUgdmVydGljYWwsIGkuZS4geS1heGlzLCBvZmZzZXQuXG4gKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0aGlzLm9mZnNldFlgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZG9udEZsaXBdIC0gSWYgdHJ1ZSwgdGhlIHgtYXhpcyB3aWxsIG5vdCBiZSBmbGlwcGVkLlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogUERGIHBhZ2Ugdmlld3BvcnQgY3JlYXRlZCBiYXNlZCBvbiBzY2FsZSwgcm90YXRpb24gYW5kIG9mZnNldC5cbiAqL1xuY2xhc3MgUGFnZVZpZXdwb3J0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFnZVZpZXdwb3J0UGFyYW1ldGVyc31cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICB2aWV3Qm94LFxuICAgIHNjYWxlLFxuICAgIHJvdGF0aW9uLFxuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGRvbnRGbGlwID0gZmFsc2UsXG4gIH0pIHtcbiAgICB0aGlzLnZpZXdCb3ggPSB2aWV3Qm94O1xuICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgdGhpcy5vZmZzZXRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLm9mZnNldFkgPSBvZmZzZXRZO1xuXG4gICAgLy8gY3JlYXRpbmcgdHJhbnNmb3JtIHRvIGNvbnZlcnQgcGRmIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBub3JtYWxcbiAgICAvLyBjYW52YXMgbGlrZSBjb29yZGluYXRlcyB0YWtpbmcgaW4gYWNjb3VudCBzY2FsZSBhbmQgcm90YXRpb25cbiAgICBjb25zdCBjZW50ZXJYID0gKHZpZXdCb3hbMl0gKyB2aWV3Qm94WzBdKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh2aWV3Qm94WzNdICsgdmlld0JveFsxXSkgLyAyO1xuICAgIGxldCByb3RhdGVBLCByb3RhdGVCLCByb3RhdGVDLCByb3RhdGVEO1xuICAgIHJvdGF0aW9uID0gcm90YXRpb24gJSAzNjA7XG4gICAgcm90YXRpb24gPSByb3RhdGlvbiA8IDAgPyByb3RhdGlvbiArIDM2MCA6IHJvdGF0aW9uO1xuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByb3RhdGVBID0gLTE7XG4gICAgICAgIHJvdGF0ZUIgPSAwO1xuICAgICAgICByb3RhdGVDID0gMDtcbiAgICAgICAgcm90YXRlRCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcm90YXRlQSA9IDA7XG4gICAgICAgIHJvdGF0ZUIgPSAxO1xuICAgICAgICByb3RhdGVDID0gMTtcbiAgICAgICAgcm90YXRlRCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJvdGF0ZUEgPSAwO1xuICAgICAgICByb3RhdGVCID0gLTE7XG4gICAgICAgIHJvdGF0ZUMgPSAtMTtcbiAgICAgICAgcm90YXRlRCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAwOlxuICAgICAgICByb3RhdGVBID0gMTtcbiAgICAgICAgcm90YXRlQiA9IDA7XG4gICAgICAgIHJvdGF0ZUMgPSAwO1xuICAgICAgICByb3RhdGVEID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiUGFnZVZpZXdwb3J0OiBJbnZhbGlkIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy5cIlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChkb250RmxpcCkge1xuICAgICAgcm90YXRlQyA9IC1yb3RhdGVDO1xuICAgICAgcm90YXRlRCA9IC1yb3RhdGVEO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZO1xuICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xuICAgIGlmIChyb3RhdGVBID09PSAwKSB7XG4gICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWSAtIHZpZXdCb3hbMV0pICogc2NhbGUgKyBvZmZzZXRYO1xuICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WTtcbiAgICAgIHdpZHRoID0gTWF0aC5hYnModmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG4gICAgICBoZWlnaHQgPSBNYXRoLmFicyh2aWV3Qm94WzJdIC0gdmlld0JveFswXSkgKiBzY2FsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0Q2FudmFzWCA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WDtcbiAgICAgIG9mZnNldENhbnZhc1kgPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFk7XG4gICAgICB3aWR0aCA9IE1hdGguYWJzKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5hYnModmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG4gICAgfVxuICAgIC8vIGNyZWF0aW5nIHRyYW5zZm9ybSBmb3IgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOlxuICAgIC8vIHRyYW5zbGF0ZSgtY2VudGVyWCwgLWNlbnRlclkpLCByb3RhdGUgYW5kIGZsaXAgdmVydGljYWxseSxcbiAgICAvLyBzY2FsZSwgYW5kIHRyYW5zbGF0ZShvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZKVxuICAgIHRoaXMudHJhbnNmb3JtID0gW1xuICAgICAgcm90YXRlQSAqIHNjYWxlLFxuICAgICAgcm90YXRlQiAqIHNjYWxlLFxuICAgICAgcm90YXRlQyAqIHNjYWxlLFxuICAgICAgcm90YXRlRCAqIHNjYWxlLFxuICAgICAgb2Zmc2V0Q2FudmFzWCAtIHJvdGF0ZUEgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVDICogc2NhbGUgKiBjZW50ZXJZLFxuICAgICAgb2Zmc2V0Q2FudmFzWSAtIHJvdGF0ZUIgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVEICogc2NhbGUgKiBjZW50ZXJZLFxuICAgIF07XG5cbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2xvbmVzIHZpZXdwb3J0LCB3aXRoIG9wdGlvbmFsIGFkZGl0aW9uYWwgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHtQYWdlVmlld3BvcnRDbG9uZVBhcmFtZXRlcnN9IFtwYXJhbXNdXG4gICAqIEByZXR1cm5zIHtQYWdlVmlld3BvcnR9IENsb25lZCB2aWV3cG9ydC5cbiAgICovXG4gIGNsb25lKHtcbiAgICBzY2FsZSA9IHRoaXMuc2NhbGUsXG4gICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uLFxuICAgIG9mZnNldFggPSB0aGlzLm9mZnNldFgsXG4gICAgb2Zmc2V0WSA9IHRoaXMub2Zmc2V0WSxcbiAgICBkb250RmxpcCA9IGZhbHNlLFxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSxcbiAgICAgIHNjYWxlLFxuICAgICAgcm90YXRpb24sXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGRvbnRGbGlwLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIFBERiBwb2ludCB0byB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuIEZvciBleGFtcGxlcywgdXNlZnVsIGZvclxuICAgKiBjb252ZXJ0aW5nIFBERiBsb2NhdGlvbiBpbnRvIGNhbnZhcyBwaXhlbCBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBjb250YWluaW5nIGB4YCBhbmQgYHlgIHByb3BlcnRpZXMgb2YgdGhlXG4gICAqICAgcG9pbnQgaW4gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3BhY2UuXG4gICAqIEBzZWUge0BsaW5rIGNvbnZlcnRUb1BkZlBvaW50fVxuICAgKiBAc2VlIHtAbGluayBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZX1cbiAgICovXG4gIGNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCwgeSkge1xuICAgIHJldHVybiBVdGlsLmFwcGx5VHJhbnNmb3JtKFt4LCB5XSwgdGhpcy50cmFuc2Zvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIFBERiByZWN0YW5nbGUgdG8gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0ge0FycmF5fSByZWN0IC0gVGhlIHhNaW4sIHlNaW4sIHhNYXggYW5kIHlNYXggY29vcmRpbmF0ZXMuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgY29udGFpbmluZyBjb3JyZXNwb25kaW5nIGNvb3JkaW5hdGVzIG9mIHRoZVxuICAgKiAgIHJlY3RhbmdsZSBpbiB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZSBzcGFjZS5cbiAgICogQHNlZSB7QGxpbmsgY29udmVydFRvVmlld3BvcnRQb2ludH1cbiAgICovXG4gIGNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlKHJlY3QpIHtcbiAgICBjb25zdCB0b3BMZWZ0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFswXSwgcmVjdFsxXV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICBjb25zdCBib3R0b21SaWdodCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMl0sIHJlY3RbM11dLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgcmV0dXJuIFt0b3BMZWZ0WzBdLCB0b3BMZWZ0WzFdLCBib3R0b21SaWdodFswXSwgYm90dG9tUmlnaHRbMV1dO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHZpZXdwb3J0IGNvb3JkaW5hdGVzIHRvIHRoZSBQREYgbG9jYXRpb24uIEZvciBleGFtcGxlcywgdXNlZnVsXG4gICAqIGZvciBjb252ZXJ0aW5nIGNhbnZhcyBwaXhlbCBsb2NhdGlvbiBpbnRvIFBERiBvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIG9mIHRoZVxuICAgKiAgIHBvaW50IGluIHRoZSBQREYgY29vcmRpbmF0ZSBzcGFjZS5cbiAgICogQHNlZSB7QGxpbmsgY29udmVydFRvVmlld3BvcnRQb2ludH1cbiAgICovXG4gIGNvbnZlcnRUb1BkZlBvaW50KHgsIHkpIHtcbiAgICByZXR1cm4gVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7XG4gIH1cbn1cblxuY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgdHlwZSkge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxufVxuXG5jb25zdCBMaW5rVGFyZ2V0ID0ge1xuICBOT05FOiAwLCAvLyBEZWZhdWx0IHZhbHVlLlxuICBTRUxGOiAxLFxuICBCTEFOSzogMixcbiAgUEFSRU5UOiAzLFxuICBUT1A6IDQsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4dGVybmFsTGlua1BhcmFtZXRlcnNcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVybmFsTGlua1BhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgLSBBbiBhYnNvbHV0ZSBVUkwuXG4gKiBAcHJvcGVydHkge0xpbmtUYXJnZXR9IFt0YXJnZXRdIC0gVGhlIGxpbmsgdGFyZ2V0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpc1xuICogICBgTGlua1RhcmdldC5OT05FYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVsXSAtIFRoZSBsaW5rIHJlbGF0aW9uc2hpcC4gVGhlIGRlZmF1bHQgdmFsdWUgaXNcbiAqICAgYERFRkFVTFRfTElOS19SRUxgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBlbmFibGVkLiBUaGVcbiAqICAgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICovXG5cbi8qKlxuICogQWRkcyB2YXJpb3VzIGF0dHJpYnV0ZXMgKGhyZWYsIHRpdGxlLCB0YXJnZXQsIHJlbCkgdG8gaHlwZXJsaW5rcy5cbiAqIEBwYXJhbSB7SFRNTExpbmtFbGVtZW50fSBsaW5rIC0gVGhlIGxpbmsgZWxlbWVudC5cbiAqIEBwYXJhbSB7RXh0ZXJuYWxMaW5rUGFyYW1ldGVyc30gcGFyYW1zXG4gKi9cbmZ1bmN0aW9uIGFkZExpbmtBdHRyaWJ1dGVzKGxpbmssIHsgdXJsLCB0YXJnZXQsIHJlbCwgZW5hYmxlZCA9IHRydWUgfSA9IHt9KSB7XG4gIGFzc2VydChcbiAgICB1cmwgJiYgdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIixcbiAgICAnYWRkTGlua0F0dHJpYnV0ZXM6IEEgdmFsaWQgXCJ1cmxcIiBwYXJhbWV0ZXIgbXVzdCBwcm92aWRlZC4nXG4gICk7XG5cbiAgY29uc3QgdXJsTnVsbFJlbW92ZWQgPSByZW1vdmVOdWxsQ2hhcmFjdGVycyh1cmwpO1xuICBpZiAoZW5hYmxlZCkge1xuICAgIGxpbmsuaHJlZiA9IGxpbmsudGl0bGUgPSB1cmxOdWxsUmVtb3ZlZDtcbiAgfSBlbHNlIHtcbiAgICBsaW5rLmhyZWYgPSBcIlwiO1xuICAgIGxpbmsudGl0bGUgPSBgRGlzYWJsZWQ6ICR7dXJsTnVsbFJlbW92ZWR9YDtcbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIGxldCB0YXJnZXRTdHIgPSBcIlwiOyAvLyBMaW5rVGFyZ2V0Lk5PTkVcbiAgc3dpdGNoICh0YXJnZXQpIHtcbiAgICBjYXNlIExpbmtUYXJnZXQuTk9ORTpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTGlua1RhcmdldC5TRUxGOlxuICAgICAgdGFyZ2V0U3RyID0gXCJfc2VsZlwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMaW5rVGFyZ2V0LkJMQU5LOlxuICAgICAgdGFyZ2V0U3RyID0gXCJfYmxhbmtcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTGlua1RhcmdldC5QQVJFTlQ6XG4gICAgICB0YXJnZXRTdHIgPSBcIl9wYXJlbnRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTGlua1RhcmdldC5UT1A6XG4gICAgICB0YXJnZXRTdHIgPSBcIl90b3BcIjtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGxpbmsudGFyZ2V0ID0gdGFyZ2V0U3RyO1xuXG4gIGxpbmsucmVsID0gdHlwZW9mIHJlbCA9PT0gXCJzdHJpbmdcIiA/IHJlbCA6IERFRkFVTFRfTElOS19SRUw7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsZSBuYW1lIGZyb20gYSBnaXZlbiBVUkwuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbVVybCh1cmwpIHtcbiAgY29uc3QgYW5jaG9yID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuICBjb25zdCBxdWVyeSA9IHVybC5pbmRleE9mKFwiP1wiKTtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4oXG4gICAgYW5jaG9yID4gMCA/IGFuY2hvciA6IHVybC5sZW5ndGgsXG4gICAgcXVlcnkgPiAwID8gcXVlcnkgOiB1cmwubGVuZ3RoXG4gICk7XG4gIHJldHVybiB1cmwuc3Vic3RyaW5nKHVybC5sYXN0SW5kZXhPZihcIi9cIiwgZW5kKSArIDEsIGVuZCk7XG59XG5cbmNsYXNzIFN0YXRUaW1lciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhcnRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy50aW1lcyA9IFtdO1xuICB9XG5cbiAgdGltZShuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5zdGFydGVkKSB7XG4gICAgICB3YXJuKGBUaW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydGVkW25hbWVdID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHRpbWVFbmQobmFtZSkge1xuICAgIGlmICghKG5hbWUgaW4gdGhpcy5zdGFydGVkKSkge1xuICAgICAgd2FybihgVGltZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy50aW1lcy5wdXNoKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydDogdGhpcy5zdGFydGVkW25hbWVdLFxuICAgICAgZW5kOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICAgIC8vIFJlbW92ZSB0aW1lciBmcm9tIHN0YXJ0ZWQgc28gaXQgY2FuIGJlIGNhbGxlZCBhZ2Fpbi5cbiAgICBkZWxldGUgdGhpcy5zdGFydGVkW25hbWVdO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgLy8gRmluZCB0aGUgbG9uZ2VzdCBuYW1lIGZvciBwYWRkaW5nIHB1cnBvc2VzLlxuICAgIGNvbnN0IG91dEJ1ZiA9IFtdO1xuICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICBmb3IgKGNvbnN0IHRpbWUgb2YgdGhpcy50aW1lcykge1xuICAgICAgY29uc3QgbmFtZSA9IHRpbWUubmFtZTtcbiAgICAgIGlmIChuYW1lLmxlbmd0aCA+IGxvbmdlc3QpIHtcbiAgICAgICAgbG9uZ2VzdCA9IG5hbWUubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRpbWUgb2YgdGhpcy50aW1lcykge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSB0aW1lLmVuZCAtIHRpbWUuc3RhcnQ7XG4gICAgICBvdXRCdWYucHVzaChgJHt0aW1lLm5hbWUucGFkRW5kKGxvbmdlc3QpfSAke2R1cmF0aW9ufW1zXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWYuam9pbihcIlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0ZldGNoU3VwcG9ydGVkKCkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBmZXRjaCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBSZXNwb25zZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIFwiYm9keVwiIGluIFJlc3BvbnNlLnByb3RvdHlwZSAmJlxuICAgIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPT0gXCJ1bmRlZmluZWRcIlxuICApO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodXJsLCBiYXNlVXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBwcm90b2NvbCB9ID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICAvLyBUaGUgRmV0Y2ggQVBJIG9ubHkgc3VwcG9ydHMgdGhlIGh0dHAvaHR0cHMgcHJvdG9jb2xzLCBhbmQgbm90IGZpbGUvZnRwLlxuICAgIHJldHVybiBwcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHByb3RvY29sID09PSBcImh0dHBzOlwiO1xuICB9IGNhdGNoIChleCkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gYG5ldyBVUkwoKWAgd2lsbCB0aHJvdyBvbiBpbmNvcnJlY3QgZGF0YS5cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5mdW5jdGlvbiBsb2FkU2NyaXB0KHNyYykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0LnNyYyA9IHNyYztcblxuICAgIHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xuICAgIHNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGxvYWQgc2NyaXB0IGF0OiAke3NjcmlwdC5zcmN9YCkpO1xuICAgIH07XG4gICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9KTtcbn1cblxuLy8gRGVwcmVjYXRlZCBBUEkgZnVuY3Rpb24gLS0gZGlzcGxheSByZWdhcmRsZXNzIG9mIHRoZSBgdmVyYm9zaXR5YCBzZXR0aW5nLlxuZnVuY3Rpb24gZGVwcmVjYXRlZChkZXRhaWxzKSB7XG4gIGNvbnNvbGUubG9nKFwiRGVwcmVjYXRlZCBBUEkgdXNhZ2U6IFwiICsgZGV0YWlscyk7XG59XG5cbmxldCBwZGZEYXRlU3RyaW5nUmVnZXg7XG5cbmNsYXNzIFBERkRhdGVTdHJpbmcge1xuICAvKipcbiAgICogQ29udmVydCBhIFBERiBkYXRlIHN0cmluZyB0byBhIEphdmFTY3JpcHQgYERhdGVgIG9iamVjdC5cbiAgICpcbiAgICogVGhlIFBERiBkYXRlIHN0cmluZyBmb3JtYXQgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNy45LjQgb2YgdGhlIG9mZmljaWFsXG4gICAqIFBERiAzMjAwMC0xOjIwMDggc3BlY2lmaWNhdGlvbi4gSG93ZXZlciwgaW4gdGhlIFBERiAxLjcgcmVmZXJlbmNlIChzaXh0aFxuICAgKiBlZGl0aW9uKSBBZG9iZSBkZXNjcmliZXMgdGhlIHNhbWUgZm9ybWF0IGluY2x1ZGluZyBhIHRyYWlsaW5nIGFwb3N0cm9waGUuXG4gICAqIFRoaXMgc3ludGF4IGluIGluY29ycmVjdCwgYnV0IEFkb2JlIEFjcm9iYXQgY3JlYXRlcyBQREYgZmlsZXMgdGhhdCBjb250YWluXG4gICAqIHRoZW0uIFdlIGlnbm9yZSBhbGwgYXBvc3Ryb3BoZXMgYXMgdGhleSBhcmUgbm90IG5lY2Vzc2FyeSBmb3IgZGF0ZSBwYXJzaW5nLlxuICAgKlxuICAgKiBNb3Jlb3ZlciwgQWRvYmUgQWNyb2JhdCBkb2Vzbid0IGhhbmRsZSBjaGFuZ2luZyB0aGUgZGF0ZSB0byB1bml2ZXJzYWwgdGltZVxuICAgKiBhbmQgZG9lc24ndCB1c2UgdGhlIHVzZXIncyB0aW1lIHpvbmUgKGVmZmVjdGl2ZWx5IGlnbm9yaW5nIHRoZSBISCcgYW5kIG1tJ1xuICAgKiBwYXJ0cyBvZiB0aGUgZGF0ZSBzdHJpbmcpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcbiAgICogQHJldHVybnMge0RhdGV8bnVsbH1cbiAgICovXG4gIHN0YXRpYyB0b0RhdGVPYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0IHx8ICFpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIExhemlseSBpbml0aWFsaXplIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgaWYgKCFwZGZEYXRlU3RyaW5nUmVnZXgpIHtcbiAgICAgIHBkZkRhdGVTdHJpbmdSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIFwiXkQ6XCIgKyAvLyBQcmVmaXggKHJlcXVpcmVkKVxuICAgICAgICBcIihcXFxcZHs0fSlcIiArIC8vIFllYXIgKHJlcXVpcmVkKVxuICAgICAgICBcIihcXFxcZHsyfSk/XCIgKyAvLyBNb250aCAob3B0aW9uYWwpXG4gICAgICAgIFwiKFxcXFxkezJ9KT9cIiArIC8vIERheSAob3B0aW9uYWwpXG4gICAgICAgIFwiKFxcXFxkezJ9KT9cIiArIC8vIEhvdXIgKG9wdGlvbmFsKVxuICAgICAgICBcIihcXFxcZHsyfSk/XCIgKyAvLyBNaW51dGUgKG9wdGlvbmFsKVxuICAgICAgICBcIihcXFxcZHsyfSk/XCIgKyAvLyBTZWNvbmQgKG9wdGlvbmFsKVxuICAgICAgICBcIihbWnwrfC1dKT9cIiArIC8vIFVuaXZlcnNhbCB0aW1lIHJlbGF0aW9uIChvcHRpb25hbClcbiAgICAgICAgXCIoXFxcXGR7Mn0pP1wiICsgLy8gT2Zmc2V0IGhvdXIgKG9wdGlvbmFsKVxuICAgICAgICBcIic/XCIgKyAvLyBTcGxpdHRpbmcgYXBvc3Ryb3BoZSAob3B0aW9uYWwpXG4gICAgICAgIFwiKFxcXFxkezJ9KT9cIiArIC8vIE9mZnNldCBtaW51dGUgKG9wdGlvbmFsKVxuICAgICAgICAgIFwiJz9cIiAvLyBUcmFpbGluZyBhcG9zdHJvcGhlIChvcHRpb25hbClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uYWwgZmllbGRzIHRoYXQgZG9uJ3Qgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIGZyb20gdGhlIHJlZ3VsYXJcbiAgICAvLyBleHByZXNzaW9uIChzdWNoIGFzIGluY29ycmVjdCBkaWdpdCBjb3VudHMgb3IgbnVtYmVycyB0aGF0IGFyZSBvdXQgb2ZcbiAgICAvLyByYW5nZSkgd2lsbCBmYWxsIGJhY2sgdGhlIGRlZmF1bHRzIGZyb20gdGhlIHNwZWNpZmljYXRpb24uXG4gICAgY29uc3QgbWF0Y2hlcyA9IHBkZkRhdGVTdHJpbmdSZWdleC5leGVjKGlucHV0KTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEphdmFTY3JpcHQncyBgRGF0ZWAgb2JqZWN0IGV4cGVjdHMgdGhlIG1vbnRoIHRvIGJlIGJldHdlZW4gMCBhbmQgMTFcbiAgICAvLyBpbnN0ZWFkIG9mIDEgYW5kIDEyLCBzbyB3ZSBoYXZlIHRvIGNvcnJlY3QgZm9yIHRoYXQuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKTtcbiAgICBsZXQgbW9udGggPSBwYXJzZUludChtYXRjaGVzWzJdLCAxMCk7XG4gICAgbW9udGggPSBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyID8gbW9udGggLSAxIDogMDtcbiAgICBsZXQgZGF5ID0gcGFyc2VJbnQobWF0Y2hlc1szXSwgMTApO1xuICAgIGRheSA9IGRheSA+PSAxICYmIGRheSA8PSAzMSA/IGRheSA6IDE7XG4gICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaGVzWzRdLCAxMCk7XG4gICAgaG91ciA9IGhvdXIgPj0gMCAmJiBob3VyIDw9IDIzID8gaG91ciA6IDA7XG4gICAgbGV0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICBtaW51dGUgPSBtaW51dGUgPj0gMCAmJiBtaW51dGUgPD0gNTkgPyBtaW51dGUgOiAwO1xuICAgIGxldCBzZWNvbmQgPSBwYXJzZUludChtYXRjaGVzWzZdLCAxMCk7XG4gICAgc2Vjb25kID0gc2Vjb25kID49IDAgJiYgc2Vjb25kIDw9IDU5ID8gc2Vjb25kIDogMDtcbiAgICBjb25zdCB1bml2ZXJzYWxUaW1lUmVsYXRpb24gPSBtYXRjaGVzWzddIHx8IFwiWlwiO1xuICAgIGxldCBvZmZzZXRIb3VyID0gcGFyc2VJbnQobWF0Y2hlc1s4XSwgMTApO1xuICAgIG9mZnNldEhvdXIgPSBvZmZzZXRIb3VyID49IDAgJiYgb2Zmc2V0SG91ciA8PSAyMyA/IG9mZnNldEhvdXIgOiAwO1xuICAgIGxldCBvZmZzZXRNaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzldLCAxMCkgfHwgMDtcbiAgICBvZmZzZXRNaW51dGUgPSBvZmZzZXRNaW51dGUgPj0gMCAmJiBvZmZzZXRNaW51dGUgPD0gNTkgPyBvZmZzZXRNaW51dGUgOiAwO1xuXG4gICAgLy8gVW5pdmVyc2FsIHRpbWUgcmVsYXRpb24gJ1onIG1lYW5zIHRoYXQgdGhlIGxvY2FsIHRpbWUgaXMgZXF1YWwgdG8gdGhlXG4gICAgLy8gdW5pdmVyc2FsIHRpbWUsIHdoZXJlYXMgdGhlIHJlbGF0aW9ucyAnKycvJy0nIGluZGljYXRlIHRoYXQgdGhlIGxvY2FsXG4gICAgLy8gdGltZSBpcyBsYXRlciByZXNwZWN0aXZlbHkgZWFybGllciB0aGFuIHRoZSB1bml2ZXJzYWwgdGltZS4gRXZlcnkgZGF0ZVxuICAgIC8vIGlzIG5vcm1hbGl6ZWQgdG8gdW5pdmVyc2FsIHRpbWUuXG4gICAgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gXCItXCIpIHtcbiAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7XG4gICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09IFwiK1wiKSB7XG4gICAgICBob3VyIC09IG9mZnNldEhvdXI7XG4gICAgICBtaW51dGUgLT0gb2Zmc2V0TWludXRlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhZ2VWaWV3cG9ydCxcbiAgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLFxuICBhZGRMaW5rQXR0cmlidXRlcyxcbiAgZ2V0RmlsZW5hbWVGcm9tVXJsLFxuICBMaW5rVGFyZ2V0LFxuICBERUZBVUxUX0xJTktfUkVMLFxuICBCYXNlQ2FudmFzRmFjdG9yeSxcbiAgRE9NQ2FudmFzRmFjdG9yeSxcbiAgQmFzZUNNYXBSZWFkZXJGYWN0b3J5LFxuICBET01DTWFwUmVhZGVyRmFjdG9yeSxcbiAgRE9NU1ZHRmFjdG9yeSxcbiAgU3RhdFRpbWVyLFxuICBpc0ZldGNoU3VwcG9ydGVkLFxuICBpc1ZhbGlkRmV0Y2hVcmwsXG4gIGxvYWRTY3JpcHQsXG4gIGRlcHJlY2F0ZWQsXG4gIFBERkRhdGVTdHJpbmcsXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgXCIuL2NvbXBhdGliaWxpdHkuanNcIjtcblxuY29uc3QgSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdO1xuY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTtcblxuLy8gUGVybWlzc2lvbiBmbGFncyBmcm9tIFRhYmxlIDIyLCBTZWN0aW9uIDcuNi4zLjIgb2YgdGhlIFBERiBzcGVjaWZpY2F0aW9uLlxuY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7XG4gIFBSSU5UOiAweDA0LFxuICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsXG4gIENPUFk6IDB4MTAsXG4gIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCxcbiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsXG4gIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLFxuICBBU1NFTUJMRTogMHg0MDAsXG4gIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAsXG59O1xuXG5jb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHtcbiAgRklMTDogMCxcbiAgU1RST0tFOiAxLFxuICBGSUxMX1NUUk9LRTogMixcbiAgSU5WSVNJQkxFOiAzLFxuICBGSUxMX0FERF9UT19QQVRIOiA0LFxuICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsXG4gIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LFxuICBBRERfVE9fUEFUSDogNyxcbiAgRklMTF9TVFJPS0VfTUFTSzogMyxcbiAgQUREX1RPX1BBVEhfRkxBRzogNCxcbn07XG5cbmNvbnN0IEltYWdlS2luZCA9IHtcbiAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gIFJHQl8yNEJQUDogMixcbiAgUkdCQV8zMkJQUDogMyxcbn07XG5cbmNvbnN0IEFubm90YXRpb25UeXBlID0ge1xuICBURVhUOiAxLFxuICBMSU5LOiAyLFxuICBGUkVFVEVYVDogMyxcbiAgTElORTogNCxcbiAgU1FVQVJFOiA1LFxuICBDSVJDTEU6IDYsXG4gIFBPTFlHT046IDcsXG4gIFBPTFlMSU5FOiA4LFxuICBISUdITElHSFQ6IDksXG4gIFVOREVSTElORTogMTAsXG4gIFNRVUlHR0xZOiAxMSxcbiAgU1RSSUtFT1VUOiAxMixcbiAgU1RBTVA6IDEzLFxuICBDQVJFVDogMTQsXG4gIElOSzogMTUsXG4gIFBPUFVQOiAxNixcbiAgRklMRUFUVEFDSE1FTlQ6IDE3LFxuICBTT1VORDogMTgsXG4gIE1PVklFOiAxOSxcbiAgV0lER0VUOiAyMCxcbiAgU0NSRUVOOiAyMSxcbiAgUFJJTlRFUk1BUks6IDIyLFxuICBUUkFQTkVUOiAyMyxcbiAgV0FURVJNQVJLOiAyNCxcbiAgVEhSRUVEOiAyNSxcbiAgUkVEQUNUOiAyNixcbn07XG5cbmNvbnN0IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHtcbiAgTUFSS0VEOiBcIk1hcmtlZFwiLFxuICBSRVZJRVc6IFwiUmV2aWV3XCIsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uTWFya2VkU3RhdGUgPSB7XG4gIE1BUktFRDogXCJNYXJrZWRcIixcbiAgVU5NQVJLRUQ6IFwiVW5tYXJrZWRcIixcbn07XG5cbmNvbnN0IEFubm90YXRpb25SZXZpZXdTdGF0ZSA9IHtcbiAgQUNDRVBURUQ6IFwiQWNjZXB0ZWRcIixcbiAgUkVKRUNURUQ6IFwiUmVqZWN0ZWRcIixcbiAgQ0FOQ0VMTEVEOiBcIkNhbmNlbGxlZFwiLFxuICBDT01QTEVURUQ6IFwiQ29tcGxldGVkXCIsXG4gIE5PTkU6IFwiTm9uZVwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHtcbiAgR1JPVVA6IFwiR3JvdXBcIixcbiAgUkVQTFk6IFwiUlwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7XG4gIElOVklTSUJMRTogMHgwMSxcbiAgSElEREVOOiAweDAyLFxuICBQUklOVDogMHgwNCxcbiAgTk9aT09NOiAweDA4LFxuICBOT1JPVEFURTogMHgxMCxcbiAgTk9WSUVXOiAweDIwLFxuICBSRUFET05MWTogMHg0MCxcbiAgTE9DS0VEOiAweDgwLFxuICBUT0dHTEVOT1ZJRVc6IDB4MTAwLFxuICBMT0NLRURDT05URU5UUzogMHgyMDAsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0ge1xuICBSRUFET05MWTogMHgwMDAwMDAxLFxuICBSRVFVSVJFRDogMHgwMDAwMDAyLFxuICBOT0VYUE9SVDogMHgwMDAwMDA0LFxuICBNVUxUSUxJTkU6IDB4MDAwMTAwMCxcbiAgUEFTU1dPUkQ6IDB4MDAwMjAwMCxcbiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLFxuICBSQURJTzogMHgwMDA4MDAwLFxuICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsXG4gIENPTUJPOiAweDAwMjAwMDAsXG4gIEVESVQ6IDB4MDA0MDAwMCxcbiAgU09SVDogMHgwMDgwMDAwLFxuICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsXG4gIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsXG4gIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLFxuICBET05PVFNDUk9MTDogMHgwODAwMDAwLFxuICBDT01COiAweDEwMDAwMDAsXG4gIFJJQ0hURVhUOiAweDIwMDAwMDAsXG4gIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsXG4gIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDAsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0ge1xuICBTT0xJRDogMSxcbiAgREFTSEVEOiAyLFxuICBCRVZFTEVEOiAzLFxuICBJTlNFVDogNCxcbiAgVU5ERVJMSU5FOiA1LFxufTtcblxuY29uc3QgU3RyZWFtVHlwZSA9IHtcbiAgVU5LTk9XTjogXCJVTktOT1dOXCIsXG4gIEZMQVRFOiBcIkZMQVRFXCIsXG4gIExaVzogXCJMWldcIixcbiAgRENUOiBcIkRDVFwiLFxuICBKUFg6IFwiSlBYXCIsXG4gIEpCSUc6IFwiSkJJR1wiLFxuICBBODU6IFwiQTg1XCIsXG4gIEFIWDogXCJBSFhcIixcbiAgQ0NGOiBcIkNDRlwiLFxuICBSTFg6IFwiUkxYXCIsIC8vIFBERiBzaG9ydCBuYW1lIGlzICdSTCcsIGJ1dCB0ZWxlbWV0cnkgcmVxdWlyZXMgdGhyZWUgY2hhcnMuXG59O1xuXG5jb25zdCBGb250VHlwZSA9IHtcbiAgVU5LTk9XTjogXCJVTktOT1dOXCIsXG4gIFRZUEUxOiBcIlRZUEUxXCIsXG4gIFRZUEUxQzogXCJUWVBFMUNcIixcbiAgQ0lERk9OVFRZUEUwOiBcIkNJREZPTlRUWVBFMFwiLFxuICBDSURGT05UVFlQRTBDOiBcIkNJREZPTlRUWVBFMENcIixcbiAgVFJVRVRZUEU6IFwiVFJVRVRZUEVcIixcbiAgQ0lERk9OVFRZUEUyOiBcIkNJREZPTlRUWVBFMlwiLFxuICBUWVBFMzogXCJUWVBFM1wiLFxuICBPUEVOVFlQRTogXCJPUEVOVFlQRVwiLFxuICBUWVBFMDogXCJUWVBFMFwiLFxuICBNTVRZUEUxOiBcIk1NVFlQRTFcIixcbn07XG5cbmNvbnN0IFZlcmJvc2l0eUxldmVsID0ge1xuICBFUlJPUlM6IDAsXG4gIFdBUk5JTkdTOiAxLFxuICBJTkZPUzogNSxcbn07XG5cbmNvbnN0IENNYXBDb21wcmVzc2lvblR5cGUgPSB7XG4gIE5PTkU6IDAsXG4gIEJJTkFSWTogMSxcbiAgU1RSRUFNOiAyLFxufTtcblxuLy8gQWxsIHRoZSBwb3NzaWJsZSBvcGVyYXRpb25zIGZvciBhbiBvcGVyYXRvciBsaXN0LlxuY29uc3QgT1BTID0ge1xuICAvLyBJbnRlbnRpb25hbGx5IHN0YXJ0IGZyb20gMSBzbyBpdCBpcyBlYXN5IHRvIHNwb3QgYmFkIG9wZXJhdG9ycyB0aGF0IHdpbGwgYmVcbiAgLy8gMCdzLlxuICBkZXBlbmRlbmN5OiAxLFxuICBzZXRMaW5lV2lkdGg6IDIsXG4gIHNldExpbmVDYXA6IDMsXG4gIHNldExpbmVKb2luOiA0LFxuICBzZXRNaXRlckxpbWl0OiA1LFxuICBzZXREYXNoOiA2LFxuICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gIHNldEZsYXRuZXNzOiA4LFxuICBzZXRHU3RhdGU6IDksXG4gIHNhdmU6IDEwLFxuICByZXN0b3JlOiAxMSxcbiAgdHJhbnNmb3JtOiAxMixcbiAgbW92ZVRvOiAxMyxcbiAgbGluZVRvOiAxNCxcbiAgY3VydmVUbzogMTUsXG4gIGN1cnZlVG8yOiAxNixcbiAgY3VydmVUbzM6IDE3LFxuICBjbG9zZVBhdGg6IDE4LFxuICByZWN0YW5nbGU6IDE5LFxuICBzdHJva2U6IDIwLFxuICBjbG9zZVN0cm9rZTogMjEsXG4gIGZpbGw6IDIyLFxuICBlb0ZpbGw6IDIzLFxuICBmaWxsU3Ryb2tlOiAyNCxcbiAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICBlbmRQYXRoOiAyOCxcbiAgY2xpcDogMjksXG4gIGVvQ2xpcDogMzAsXG4gIGJlZ2luVGV4dDogMzEsXG4gIGVuZFRleHQ6IDMyLFxuICBzZXRDaGFyU3BhY2luZzogMzMsXG4gIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgc2V0SFNjYWxlOiAzNSxcbiAgc2V0TGVhZGluZzogMzYsXG4gIHNldEZvbnQ6IDM3LFxuICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gIHNldFRleHRSaXNlOiAzOSxcbiAgbW92ZVRleHQ6IDQwLFxuICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICBzZXRUZXh0TWF0cml4OiA0MixcbiAgbmV4dExpbmU6IDQzLFxuICBzaG93VGV4dDogNDQsXG4gIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICBzZXRTdHJva2VDb2xvck46IDUzLFxuICBzZXRGaWxsQ29sb3I6IDU0LFxuICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgc2V0U3Ryb2tlR3JheTogNTYsXG4gIHNldEZpbGxHcmF5OiA1NyxcbiAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgc2hhZGluZ0ZpbGw6IDYyLFxuICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gIHBhaW50WE9iamVjdDogNjYsXG4gIG1hcmtQb2ludDogNjcsXG4gIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgYmVnaW5Db21wYXQ6IDcyLFxuICBlbmRDb21wYXQ6IDczLFxuICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgYmVnaW5Hcm91cDogNzYsXG4gIGVuZEdyb3VwOiA3NyxcbiAgYmVnaW5Bbm5vdGF0aW9uczogNzgsXG4gIGVuZEFubm90YXRpb25zOiA3OSxcbiAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgZW5kQW5ub3RhdGlvbjogODEsXG4gIHBhaW50SnBlZ1hPYmplY3Q6IDgyLFxuICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLFxuICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsXG4gIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSxcbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LFxuICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NyxcbiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LFxuICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LFxuICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLFxuICBjb25zdHJ1Y3RQYXRoOiA5MSxcbn07XG5cbmNvbnN0IFVOU1VQUE9SVEVEX0ZFQVRVUkVTID0ge1xuICAvKiogQGRlcHJlY2F0ZWQgdW51c2VkICovXG4gIHVua25vd246IFwidW5rbm93blwiLFxuICBmb3JtczogXCJmb3Jtc1wiLFxuICBqYXZhU2NyaXB0OiBcImphdmFTY3JpcHRcIixcbiAgc21hc2s6IFwic21hc2tcIixcbiAgc2hhZGluZ1BhdHRlcm46IFwic2hhZGluZ1BhdHRlcm5cIixcbiAgLyoqIEBkZXByZWNhdGVkIHVudXNlZCAqL1xuICBmb250OiBcImZvbnRcIixcbiAgZXJyb3JUaWxpbmdQYXR0ZXJuOiBcImVycm9yVGlsaW5nUGF0dGVyblwiLFxuICBlcnJvckV4dEdTdGF0ZTogXCJlcnJvckV4dEdTdGF0ZVwiLFxuICBlcnJvclhPYmplY3Q6IFwiZXJyb3JYT2JqZWN0XCIsXG4gIGVycm9yRm9udExvYWRUeXBlMzogXCJlcnJvckZvbnRMb2FkVHlwZTNcIixcbiAgZXJyb3JGb250U3RhdGU6IFwiZXJyb3JGb250U3RhdGVcIixcbiAgZXJyb3JGb250TWlzc2luZzogXCJlcnJvckZvbnRNaXNzaW5nXCIsXG4gIGVycm9yRm9udFRyYW5zbGF0ZTogXCJlcnJvckZvbnRUcmFuc2xhdGVcIixcbiAgZXJyb3JDb2xvclNwYWNlOiBcImVycm9yQ29sb3JTcGFjZVwiLFxuICBlcnJvck9wZXJhdG9yTGlzdDogXCJlcnJvck9wZXJhdG9yTGlzdFwiLFxuICBlcnJvckZvbnRUb1VuaWNvZGU6IFwiZXJyb3JGb250VG9Vbmljb2RlXCIsXG4gIGVycm9yRm9udExvYWROYXRpdmU6IFwiZXJyb3JGb250TG9hZE5hdGl2ZVwiLFxuICBlcnJvckZvbnRHZXRQYXRoOiBcImVycm9yRm9udEdldFBhdGhcIixcbiAgZXJyb3JNYXJrZWRDb250ZW50OiBcImVycm9yTWFya2VkQ29udGVudFwiLFxufTtcblxuY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7XG4gIE5FRURfUEFTU1dPUkQ6IDEsXG4gIElOQ09SUkVDVF9QQVNTV09SRDogMixcbn07XG5cbmxldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUztcblxuZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHtcbiAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7XG4gICAgdmVyYm9zaXR5ID0gbGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7XG4gIHJldHVybiB2ZXJib3NpdHk7XG59XG5cbi8vIEEgbm90aWNlIGZvciBkZXZzLiBUaGVzZSBhcmUgZ29vZCBmb3IgdGhpbmdzIHRoYXQgYXJlIGhlbHBmdWwgdG8gZGV2cywgc3VjaFxuLy8gYXMgd2FybmluZyB0aGF0IFdvcmtlcnMgd2VyZSBkaXNhYmxlZCwgd2hpY2ggaXMgaW1wb3J0YW50IHRvIGRldnMgYnV0IG5vdFxuLy8gZW5kIHVzZXJzLlxuZnVuY3Rpb24gaW5mbyhtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykge1xuICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTtcbiAgfVxufVxuXG4vLyBOb24tZmF0YWwgd2FybmluZ3MuXG5mdW5jdGlvbiB3YXJuKG1zZykge1xuICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7XG4gICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykge1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykge1xuICBpZiAoIWNvbmQpIHtcbiAgICB1bnJlYWNoYWJsZShtc2cpO1xuICB9XG59XG5cbi8vIENoZWNrcyBpZiBVUkxzIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiBGb3Igbm9uLUhUVFAgYmFzZWQgVVJMcywgcmV0dXJucyBmYWxzZS5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbihiYXNlVXJsLCBvdGhlclVybCkge1xuICBsZXQgYmFzZTtcbiAgdHJ5IHtcbiAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICBpZiAoIWJhc2Uub3JpZ2luIHx8IGJhc2Uub3JpZ2luID09PSBcIm51bGxcIikge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub24tSFRUUCB1cmxcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvdGhlciA9IG5ldyBVUkwob3RoZXJVcmwsIGJhc2UpO1xuICByZXR1cm4gYmFzZS5vcmlnaW4gPT09IG90aGVyLm9yaWdpbjtcbn1cblxuLy8gQ2hlY2tzIGlmIFVSTHMgdXNlIG9uZSBvZiB0aGUgYWxsb3dlZCBwcm90b2NvbHMsIGUuZy4gdG8gYXZvaWQgWFNTLlxuZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh1cmwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHtcbiAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICBjYXNlIFwiaHR0cHM6XCI6XG4gICAgY2FzZSBcImZ0cDpcIjpcbiAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgIGNhc2UgXCJ0ZWw6XCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgdmFsaWQgYWJzb2x1dGUgVVJMLlxuICpcbiAqIEBwYXJhbSB7VVJMfHN0cmluZ30gdXJsIC0gQW4gYWJzb2x1dGUsIG9yIHJlbGF0aXZlLCBVUkwuXG4gKiBAcGFyYW0ge1VSTHxzdHJpbmd9IGJhc2VVcmwgLSBBbiBhYnNvbHV0ZSBVUkwuXG4gKiBAcmV0dXJucyBFaXRoZXIgYSB2YWxpZCB7VVJMfSwgb3IgYG51bGxgIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGFic29sdXRlVXJsID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICBpZiAoX2lzVmFsaWRQcm90b2NvbChhYnNvbHV0ZVVybCkpIHtcbiAgICAgIHJldHVybiBhYnNvbHV0ZVVybDtcbiAgICB9XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgLyogYG5ldyBVUkwoKWAgd2lsbCB0aHJvdyBvbiBpbmNvcnJlY3QgZGF0YS4gKi9cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuICAgIHZhbHVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZSB7YW55fVxuICovXG5jb25zdCBCYXNlRXhjZXB0aW9uID0gKGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcblxuICByZXR1cm4gQmFzZUV4Y2VwdGlvbjtcbn0pKCk7XG5cbmNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgY29kZSkge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuXG5jbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICB9XG59XG5cbmNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciBjYXVzZWQgZHVyaW5nIHBhcnNpbmcgUERGIGRhdGEuXG4gKi9cbmNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG4vKipcbiAqIEVycm9yIHVzZWQgdG8gaW5kaWNhdGUgdGFzayBjYW5jZWxsYXRpb24uXG4gKi9cbmNsYXNzIEFib3J0RXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG5jb25zdCBOdWxsQ2hhcmFjdGVyc1JlZ0V4cCA9IC9cXHgwMC9nO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnMoc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgd2FybihcIlRoZSBhcmd1bWVudCBmb3IgcmVtb3ZlTnVsbENoYXJhY3RlcnMgbXVzdCBiZSBhIHN0cmluZy5cIik7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICByZXR1cm4gc3RyLnJlcGxhY2UoTnVsbENoYXJhY3RlcnNSZWdFeHAsIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7XG4gIGFzc2VydChcbiAgICBieXRlcyAhPT0gbnVsbCAmJiB0eXBlb2YgYnl0ZXMgPT09IFwib2JqZWN0XCIgJiYgYnl0ZXMubGVuZ3RoICE9PSB1bmRlZmluZWQsXG4gICAgXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nXCJcbiAgKTtcbiAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyO1xuICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICB9XG4gIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcbiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7XG4gICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7XG4gICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpO1xuICB9XG4gIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgYXNzZXJ0KHR5cGVvZiBzdHIgPT09IFwic3RyaW5nXCIsIFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKipcbiAqIEdldHMgbGVuZ3RoIG9mIHRoZSBhcnJheSAoQXJyYXksIFVpbnQ4QXJyYXksIG9yIHN0cmluZykgaW4gYnl0ZXMuXG4gKiBAcGFyYW0ge0FycmF5PGFueT58VWludDhBcnJheXxzdHJpbmd9IGFyclxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gYXJyYXlCeXRlTGVuZ3RoKGFycikge1xuICBpZiAoYXJyLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGFyci5sZW5ndGg7XG4gIH1cbiAgYXNzZXJ0KGFyci5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQsIFwiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC5cIik7XG4gIHJldHVybiBhcnIuYnl0ZUxlbmd0aDtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyBhcnJheSBpdGVtcyAoYXJyYXlzKSBpbnRvIHNpbmdsZSBVaW50OEFycmF5IG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8YW55PnxVaW50OEFycmF5fHN0cmluZz59IGFyciAtIHRoZSBhcnJheSBvZiB0aGUgYXJyYXlzXG4gKiAgIChBcnJheSwgVWludDhBcnJheSwgb3Igc3RyaW5nKS5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiBhcnJheXNUb0J5dGVzKGFycikge1xuICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICAvLyBTaG9ydGN1dDogaWYgZmlyc3QgYW5kIG9ubHkgaXRlbSBpcyBVaW50OEFycmF5LCByZXR1cm4gaXQuXG4gIGlmIChsZW5ndGggPT09IDEgJiYgYXJyWzBdIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiBhcnJbMF07XG4gIH1cbiAgbGV0IHJlc3VsdExlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRMZW5ndGggKz0gYXJyYXlCeXRlTGVuZ3RoKGFycltpXSk7XG4gIH1cbiAgbGV0IHBvcyA9IDA7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShyZXN1bHRMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGl0ZW0gPSBhcnJbaV07XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbSA9IHN0cmluZ1RvQnl0ZXMoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtID0gbmV3IFVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1MZW5ndGggPSBpdGVtLmJ5dGVMZW5ndGg7XG4gICAgZGF0YS5zZXQoaXRlbSwgcG9zKTtcbiAgICBwb3MgKz0gaXRlbUxlbmd0aDtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgKHZhbHVlID4+IDI0KSAmIDB4ZmYsXG4gICAgKHZhbHVlID4+IDE2KSAmIDB4ZmYsXG4gICAgKHZhbHVlID4+IDgpICYgMHhmZixcbiAgICB2YWx1ZSAmIDB4ZmZcbiAgKTtcbn1cblxuLy8gQ2hlY2tzIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBwbGF0Zm9ybS5cbmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkge1xuICBjb25zdCBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gIGJ1ZmZlcjhbMF0gPSAxO1xuICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpO1xuICByZXR1cm4gdmlldzMyWzBdID09PSAxO1xufVxuY29uc3QgSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSB7XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidmFsdWVcIiwgaXNMaXR0bGVFbmRpYW4oKSk7XG4gIH0sXG59O1xuXG4vLyBDaGVja3MgaWYgaXQncyBwb3NzaWJsZSB0byBldmFsIEpTIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkge1xuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbihcIlwiKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcsIG5vLW5ldy1mdW5jXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmNvbnN0IElzRXZhbFN1cHBvcnRlZENhY2hlZCA9IHtcbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2YWx1ZVwiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7XG4gIH0sXG59O1xuXG5jb25zdCByZ2JCdWYgPSBbXCJyZ2IoXCIsIDAsIFwiLFwiLCAwLCBcIixcIiwgMCwgXCIpXCJdO1xuXG5jbGFzcyBVdGlsIHtcbiAgLy8gbWFrZUNzc1JnYigpIGNhbiBiZSBjYWxsZWQgdGhvdXNhbmRzIG9mIHRpbWVzLiBVc2luZyDCtHJnYkJ1ZmAgYXZvaWRzXG4gIC8vIGNyZWF0aW5nIG1hbnkgaW50ZXJtZWRpYXRlIHN0cmluZ3MuXG4gIHN0YXRpYyBtYWtlQ3NzUmdiKHIsIGcsIGIpIHtcbiAgICByZ2JCdWZbMV0gPSByO1xuICAgIHJnYkJ1ZlszXSA9IGc7XG4gICAgcmdiQnVmWzVdID0gYjtcbiAgICByZXR1cm4gcmdiQnVmLmpvaW4oXCJcIik7XG4gIH1cblxuICAvLyBDb25jYXRlbmF0ZXMgdHdvIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIHRvZ2V0aGVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gIHN0YXRpYyB0cmFuc2Zvcm0obTEsIG0yKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG0xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLFxuICAgICAgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sXG4gICAgICBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSxcbiAgICAgIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLFxuICAgICAgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSxcbiAgICAgIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIEZvciAyZCBhZmZpbmUgdHJhbnNmb3Jtc1xuICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0ocCwgbSkge1xuICAgIGNvbnN0IHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07XG4gICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cblxuICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHAsIG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICBjb25zdCB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkO1xuICAgIGNvbnN0IHl0ID0gKC1wWzBdICogbVsxXSArIHBbMV0gKiBtWzBdICsgbVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHRyYW5zZm9ybSB0byB0aGUgcmVjdGFuZ2xlIGFuZCBmaW5kcyB0aGUgbWluaW11bSBheGlhbGx5XG4gIC8vIGFsaWduZWQgYm91bmRpbmcgYm94LlxuICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkge1xuICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLCBtKTtcbiAgICBjb25zdCBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7XG4gICAgY29uc3QgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7XG4gICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7XG4gICAgcmV0dXJuIFtcbiAgICAgIE1hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSxcbiAgICAgIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSxcbiAgICAgIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSxcbiAgICAgIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSxcbiAgICBdO1xuICB9XG5cbiAgc3RhdGljIGludmVyc2VUcmFuc2Zvcm0obSkge1xuICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuICAgIHJldHVybiBbXG4gICAgICBtWzNdIC8gZCxcbiAgICAgIC1tWzFdIC8gZCxcbiAgICAgIC1tWzJdIC8gZCxcbiAgICAgIG1bMF0gLyBkLFxuICAgICAgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCxcbiAgICAgIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQsXG4gICAgXTtcbiAgfVxuXG4gIC8vIEFwcGx5IGEgZ2VuZXJpYyAzZCBtYXRyaXggTSBvbiBhIDMtdmVjdG9yIHY6XG4gIC8vICAgfCBhIGIgYyB8ICAgfCBYIHxcbiAgLy8gICB8IGQgZSBmIHwgeCB8IFkgfFxuICAvLyAgIHwgZyBoIGkgfCAgIHwgWiB8XG4gIC8vIE0gaXMgYXNzdW1lZCB0byBiZSBzZXJpYWxpemVkIGFzIFthLGIsYyxkLGUsZixnLGgsaV0sXG4gIC8vIHdpdGggdiBhcyBbWCxZLFpdXG4gIHN0YXRpYyBhcHBseTNkVHJhbnNmb3JtKG0sIHYpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbVswXSAqIHZbMF0gKyBtWzFdICogdlsxXSArIG1bMl0gKiB2WzJdLFxuICAgICAgbVszXSAqIHZbMF0gKyBtWzRdICogdlsxXSArIG1bNV0gKiB2WzJdLFxuICAgICAgbVs2XSAqIHZbMF0gKyBtWzddICogdlsxXSArIG1bOF0gKiB2WzJdLFxuICAgIF07XG4gIH1cblxuICAvLyBUaGlzIGNhbGN1bGF0aW9uIHVzZXMgU2luZ3VsYXIgVmFsdWUgRGVjb21wb3NpdGlvbi5cbiAgLy8gVGhlIFNWRCBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aCBmb3JtdWxhIEEgPSBVU1YuIFdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZVxuICAvLyBtYXRyaXggUyBoZXJlIGJlY2F1c2UgaXQgcmVwcmVzZW50cyB0aGUgc2NhbGUgdmFsdWVzLlxuICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkge1xuICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTtcblxuICAgIC8vIE11bHRpcGx5IG1hdHJpeCBtIHdpdGggaXRzIHRyYW5zcG9zZS5cbiAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07XG4gICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdO1xuICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107XG5cbiAgICAvLyBTb2x2ZSB0aGUgc2Vjb25kIGRlZ3JlZSBwb2x5bm9taWFsIHRvIGdldCByb290cy5cbiAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyO1xuICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICogKGEgKyBkKSAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjtcbiAgICBjb25zdCBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7XG4gICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxO1xuXG4gICAgLy8gU2NhbGUgdmFsdWVzIGFyZSB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBlaWdlbnZhbHVlcy5cbiAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHJlY3RhbmdsZSByZWN0PVt4MSwgeTEsIHgyLCB5Ml0gc28gdGhhdCAoeDEseTEpIDwgKHgyLHkyKVxuICAvLyBGb3IgY29vcmRpbmF0ZSBzeXN0ZW1zIHdob3NlIG9yaWdpbiBsaWVzIGluIHRoZSBib3R0b20tbGVmdCwgdGhpc1xuICAvLyBtZWFucyBub3JtYWxpemF0aW9uIHRvIChCTCxUUikgb3JkZXJpbmcuIEZvciBzeXN0ZW1zIHdpdGggb3JpZ2luIGluIHRoZVxuICAvLyB0b3AtbGVmdCwgdGhpcyBtZWFucyAoVEwsQlIpIG9yZGVyaW5nLlxuICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7XG4gICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7IC8vIGNsb25lIHJlY3RcbiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHtcbiAgICAgIHJbMF0gPSByZWN0WzJdO1xuICAgICAgclsyXSA9IHJlY3RbMF07XG4gICAgfVxuICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkge1xuICAgICAgclsxXSA9IHJlY3RbM107XG4gICAgICByWzNdID0gcmVjdFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgcmVjdGFuZ2xlIFt4MSwgeTEsIHgyLCB5Ml0gY29ycmVzcG9uZGluZyB0byB0aGVcbiAgLy8gaW50ZXJzZWN0aW9uIG9mIHJlY3QxIGFuZCByZWN0Mi4gSWYgbm8gaW50ZXJzZWN0aW9uLCByZXR1cm5zICdmYWxzZSdcbiAgLy8gVGhlIHJlY3RhbmdsZSBjb29yZGluYXRlcyBvZiByZWN0MSwgcmVjdDIgc2hvdWxkIGJlIFt4MSwgeTEsIHgyLCB5Ml1cbiAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHtcbiAgICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9XG5cbiAgICAvLyBPcmRlciBwb2ludHMgYWxvbmcgdGhlIGF4ZXNcbiAgICBjb25zdCBvcmRlcmVkWCA9IFtyZWN0MVswXSwgcmVjdDFbMl0sIHJlY3QyWzBdLCByZWN0MlsyXV0uc29ydChjb21wYXJlKTtcbiAgICBjb25zdCBvcmRlcmVkWSA9IFtyZWN0MVsxXSwgcmVjdDFbM10sIHJlY3QyWzFdLCByZWN0MlszXV0uc29ydChjb21wYXJlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHJlY3QxID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QxKTtcbiAgICByZWN0MiA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0Mik7XG5cbiAgICAvLyBYOiBmaXJzdCBhbmQgc2Vjb25kIHBvaW50cyBiZWxvbmcgdG8gZGlmZmVyZW50IHJlY3RhbmdsZXM/XG4gICAgaWYgKFxuICAgICAgKG9yZGVyZWRYWzBdID09PSByZWN0MVswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDJbMF0pIHx8XG4gICAgICAob3JkZXJlZFhbMF0gPT09IHJlY3QyWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MVswXSlcbiAgICApIHtcbiAgICAgIC8vIEludGVyc2VjdGlvbiBtdXN0IGJlIGJldHdlZW4gc2Vjb25kIGFuZCB0aGlyZCBwb2ludHNcbiAgICAgIHJlc3VsdFswXSA9IG9yZGVyZWRYWzFdO1xuICAgICAgcmVzdWx0WzJdID0gb3JkZXJlZFhbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFk6IGZpcnN0IGFuZCBzZWNvbmQgcG9pbnRzIGJlbG9uZyB0byBkaWZmZXJlbnQgcmVjdGFuZ2xlcz9cbiAgICBpZiAoXG4gICAgICAob3JkZXJlZFlbMF0gPT09IHJlY3QxWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MlsxXSkgfHxcbiAgICAgIChvcmRlcmVkWVswXSA9PT0gcmVjdDJbMV0gJiYgb3JkZXJlZFlbMV0gPT09IHJlY3QxWzFdKVxuICAgICkge1xuICAgICAgLy8gSW50ZXJzZWN0aW9uIG11c3QgYmUgYmV0d2VlbiBzZWNvbmQgYW5kIHRoaXJkIHBvaW50c1xuICAgICAgcmVzdWx0WzFdID0gb3JkZXJlZFlbMV07XG4gICAgICByZXN1bHRbM10gPSBvcmRlcmVkWVsyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAweDJEOCwgMHgyQzcsIDB4MkM2LCAweDJEOSwgMHgyREQsIDB4MkRCLCAweDJEQSwgMHgyREMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LFxuICAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNBLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFFLCAweDIwMUMsXG4gIDB4MjAxRCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQSwgMHgyMTIyLCAweEZCMDEsIDB4RkIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCxcbiAgMHgxNzgsIDB4MTdELCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN0UsIDAsIDB4MjBBQ1xuXTtcblxuZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoc3RyKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgc3RyQnVmID0gW107XG4gIGlmIChzdHJbMF0gPT09IFwiXFx4RkVcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkZcIikge1xuICAgIC8vIFVURjE2QkUgQk9NXG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikge1xuICAgICAgc3RyQnVmLnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoKHN0ci5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEZGXCIgJiYgc3RyWzFdID09PSBcIlxceEZFXCIpIHtcbiAgICAvLyBVVEYxNkxFIEJPTVxuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHN0ckJ1Zi5wdXNoKFxuICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKChzdHIuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgfCBzdHIuY2hhckNvZGVBdChpKSlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChpKV07XG4gICAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgLy8gcmVwbGFjZSBcIihcIiwgXCIpXCIgYW5kIFwiXFxcIiBieSBcIlxcKFwiLCBcIlxcKVwiIGFuZCBcIlxcXFxcIlxuICAvLyBpbiBvcmRlciB0byB3cml0ZSBpdCBpbiBhIFBERiBmaWxlLlxuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXFwoXFwpXFxcXF0pL2csIFwiXFxcXCQxXCIpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xufVxuXG5mdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7XG4gIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbCh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJib29sZWFuXCI7XG59XG5cbmZ1bmN0aW9uIGlzTnVtKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm51bWJlclwiO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmIHYuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikge1xuICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBhcnIxLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgIHJldHVybiBlbGVtZW50ID09PSBhcnIyW2luZGV4XTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoZGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkpKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IFtcbiAgICBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSxcbiAgICAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgKGRhdGUuZ2V0VVRDRGF0ZSgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICBdO1xuXG4gIHJldHVybiBidWZmZXIuam9pbihcIlwiKTtcbn1cblxuLyoqXG4gKiBQcm9taXNlIENhcGFiaWxpdHkgb2JqZWN0LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb21pc2VDYXBhYmlsaXR5XG4gKiBAcHJvcGVydHkge1Byb21pc2U8YW55Pn0gcHJvbWlzZSAtIEEgUHJvbWlzZSBvYmplY3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNldHRsZWQgLSBJZiB0aGUgUHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQvcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZXNvbHZlIC0gRnVsZmlsbHMgdGhlIFByb21pc2UuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZWplY3QgLSBSZWplY3RzIHRoZSBQcm9taXNlLlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb21pc2UgY2FwYWJpbGl0eSBvYmplY3QuXG4gKiBAYWxpYXMgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZUNhcGFiaWxpdHl9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCkge1xuICBjb25zdCBjYXBhYmlsaXR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IGlzU2V0dGxlZCA9IGZhbHNlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYXBhYmlsaXR5LCBcInNldHRsZWRcIiwge1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBpc1NldHRsZWQ7XG4gICAgfSxcbiAgfSk7XG4gIGNhcGFiaWxpdHkucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBjYXBhYmlsaXR5LnJlc29sdmUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaXNTZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgfTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlzU2V0dGxlZCA9IHRydWU7XG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGNhcGFiaWxpdHk7XG59XG5cbmNvbnN0IGNyZWF0ZU9iamVjdFVSTCA9IChmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkxDbG9zdXJlKCkge1xuICAvLyBCbG9iL2NyZWF0ZU9iamVjdFVSTCBpcyBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gZGF0YSBzY2hlbWEuXG4gIGNvbnN0IGRpZ2l0cyA9XG4gICAgXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChkYXRhLCBjb250ZW50VHlwZSwgZm9yY2VEYXRhU2NoZW1hID0gZmFsc2UpIHtcbiAgICBpZiAoIWZvcmNlRGF0YVNjaGVtYSAmJiBVUkwuY3JlYXRlT2JqZWN0VVJMKSB7XG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2RhdGFdLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlciA9IGBkYXRhOiR7Y29udGVudFR5cGV9O2Jhc2U2NCxgO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMykge1xuICAgICAgY29uc3QgYjEgPSBkYXRhW2ldICYgMHhmZjtcbiAgICAgIGNvbnN0IGIyID0gZGF0YVtpICsgMV0gJiAweGZmO1xuICAgICAgY29uc3QgYjMgPSBkYXRhW2kgKyAyXSAmIDB4ZmY7XG4gICAgICBjb25zdCBkMSA9IGIxID4+IDIsXG4gICAgICAgIGQyID0gKChiMSAmIDMpIDw8IDQpIHwgKGIyID4+IDQpO1xuICAgICAgY29uc3QgZDMgPSBpICsgMSA8IGlpID8gKChiMiAmIDB4ZikgPDwgMikgfCAoYjMgPj4gNikgOiA2NDtcbiAgICAgIGNvbnN0IGQ0ID0gaSArIDIgPCBpaSA/IGIzICYgMHgzZiA6IDY0O1xuICAgICAgYnVmZmVyICs9IGRpZ2l0c1tkMV0gKyBkaWdpdHNbZDJdICsgZGlnaXRzW2QzXSArIGRpZ2l0c1tkNF07XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG4gIH07XG59KSgpO1xuXG5leHBvcnQge1xuICBCYXNlRXhjZXB0aW9uLFxuICBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgSURFTlRJVFlfTUFUUklYLFxuICBPUFMsXG4gIFZlcmJvc2l0eUxldmVsLFxuICBVTlNVUFBPUlRFRF9GRUFUVVJFUyxcbiAgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSxcbiAgQW5ub3RhdGlvbkZpZWxkRmxhZyxcbiAgQW5ub3RhdGlvbkZsYWcsXG4gIEFubm90YXRpb25NYXJrZWRTdGF0ZSxcbiAgQW5ub3RhdGlvblJlcGx5VHlwZSxcbiAgQW5ub3RhdGlvblJldmlld1N0YXRlLFxuICBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUsXG4gIEFubm90YXRpb25UeXBlLFxuICBGb250VHlwZSxcbiAgSW1hZ2VLaW5kLFxuICBDTWFwQ29tcHJlc3Npb25UeXBlLFxuICBBYm9ydEV4Y2VwdGlvbixcbiAgSW52YWxpZFBERkV4Y2VwdGlvbixcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbixcbiAgUGFzc3dvcmRFeGNlcHRpb24sXG4gIFBhc3N3b3JkUmVzcG9uc2VzLFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgU3RyZWFtVHlwZSxcbiAgVGV4dFJlbmRlcmluZ01vZGUsXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbiAgVW5rbm93bkVycm9yRXhjZXB0aW9uLFxuICBVdGlsLFxuICBGb3JtYXRFcnJvcixcbiAgYXJyYXlCeXRlTGVuZ3RoLFxuICBhcnJheXNUb0J5dGVzLFxuICBhc3NlcnQsXG4gIGJ5dGVzVG9TdHJpbmcsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBjcmVhdGVPYmplY3RVUkwsXG4gIGVzY2FwZVN0cmluZyxcbiAgZ2V0TW9kaWZpY2F0aW9uRGF0ZSxcbiAgZ2V0VmVyYm9zaXR5TGV2ZWwsXG4gIGluZm8sXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQXJyYXlFcXVhbCxcbiAgaXNCb29sLFxuICBpc051bSxcbiAgaXNTdHJpbmcsXG4gIGlzU2FtZU9yaWdpbixcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCxcbiAgSXNMaXR0bGVFbmRpYW5DYWNoZWQsXG4gIElzRXZhbFN1cHBvcnRlZENhY2hlZCxcbiAgcmVtb3ZlTnVsbENoYXJhY3RlcnMsXG4gIHNldFZlcmJvc2l0eUxldmVsLFxuICBzaGFkb3csXG4gIHN0cmluZzMyLFxuICBzdHJpbmdUb0J5dGVzLFxuICBzdHJpbmdUb1BERlN0cmluZyxcbiAgc3RyaW5nVG9VVEY4U3RyaW5nLFxuICB1dGY4U3RyaW5nVG9TdHJpbmcsXG4gIHdhcm4sXG4gIHVucmVhY2hhYmxlLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgaXNOb2RlSlMgfSBmcm9tIFwiLi9pc19ub2RlLmpzXCI7XG5cbi8vIFNraXAgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIG1vZGVybiBidWlsZHMgYW5kIGlmIHdlIGFscmVhZHkgcmFuIHRoZSBtb2R1bGUuXG5pZiAoXG4gICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJTS0lQX0JBQkVMXCIpKSAmJlxuICAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwidW5kZWZpbmVkXCIgfHwgIWdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQpXG4pIHtcbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgZ2xvYmFsVGhpcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEvRWRnZSwgT3BlcmFcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcInVuZGVmaW5lZFwiIHx8IGdsb2JhbFRoaXMuTWF0aCAhPT0gTWF0aCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduXG4gICAgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL2dsb2JhbC10aGlzXCIpO1xuICB9XG4gIGdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQgPSB0cnVlO1xuXG4gIGNvbnN0IGhhc0RPTSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRvY3VtZW50ID09PSBcIm9iamVjdFwiO1xuICBjb25zdCB1c2VyQWdlbnQgPVxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IFwiXCI7XG4gIGNvbnN0IGlzSUUgPSAvVHJpZGVudC8udGVzdCh1c2VyQWdlbnQpO1xuXG4gIC8vIFN1cHBvcnQ6IE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrTm9kZUJ0b2EoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuYnRvYSB8fCAhaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5idG9hID0gZnVuY3Rpb24gKGNoYXJzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShjaGFycywgXCJiaW5hcnlcIikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBOb2RlLmpzXG4gIChmdW5jdGlvbiBjaGVja05vZGVBdG9iKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLmF0b2IgfHwgIWlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuYXRvYiA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oaW5wdXQsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgQ2hpbGROb2RlLnJlbW92ZSBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLlxuICAoZnVuY3Rpb24gY2hlY2tDaGlsZE5vZGVSZW1vdmUoKSB7XG4gICAgaWYgKCFoYXNET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbW96aWxsYS9hdm9pZC1yZW1vdmVDaGlsZFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBET01Ub2tlbkxpc3QucHJvdG90eXBlLnthZGQsIHJlbW92ZX0sIHdpdGggbW9yZSB0aGFuXG4gIC8vIG9uZSBwYXJhbWV0ZXIsIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrRE9NVG9rZW5MaXN0QWRkUmVtb3ZlKCkge1xuICAgIGlmICghaGFzRE9NIHx8IGlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJ0ZXN0T25lXCIsIFwidGVzdFR3b1wiKTtcblxuICAgIGlmIChcbiAgICAgIGRpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJ0ZXN0T25lXCIpID09PSB0cnVlICYmXG4gICAgICBkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKFwidGVzdFR3b1wiKSA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBPcmlnaW5hbERPTVRva2VuTGlzdEFkZCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO1xuICAgIGNvbnN0IE9yaWdpbmFsRE9NVG9rZW5MaXN0UmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XG5cbiAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICguLi50b2tlbnMpIHtcbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIE9yaWdpbmFsRE9NVG9rZW5MaXN0QWRkLmNhbGwodGhpcywgdG9rZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoLi4udG9rZW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZS5jYWxsKHRoaXMsIHRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlLCB3aXRoIHRoZSBvcHRpb25hbFxuICAvLyBcImZvcmNlXCIgcGFyYW1ldGVyLCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpIHtcbiAgICBpZiAoIWhhc0RPTSB8fCBpc05vZGVKUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGlmIChkaXYuY2xhc3NMaXN0LnRvZ2dsZShcInRlc3RcIiwgMCkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGZvcmNlID1cbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAhIWFyZ3VtZW50c1sxXSA6ICF0aGlzLmNvbnRhaW5zKHRva2VuKTtcbiAgICAgIHJldHVybiB0aGlzW2ZvcmNlID8gXCJhZGRcIiA6IFwicmVtb3ZlXCJdKHRva2VuKSwgZm9yY2U7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciB3aW5kb3cuaGlzdG9yeS57cHVzaFN0YXRlLCByZXBsYWNlU3RhdGV9LCB3aXRoIHRoZVxuICAvLyBgdXJsYCBwYXJhbWV0ZXIgc2V0IHRvIGB1bmRlZmluZWRgLCB3aXRob3V0IGJyZWFraW5nIHRoZSBkb2N1bWVudCBVUkwuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1dpbmRvd0hpc3RvcnlQdXNoU3RhdGVSZXBsYWNlU3RhdGUoKSB7XG4gICAgaWYgKCFoYXNET00gfHwgIWlzSUUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgT3JpZ2luYWxQdXNoU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7XG4gICAgY29uc3QgT3JpZ2luYWxSZXBsYWNlU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG5cbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSB1cmwgPT09IHVuZGVmaW5lZCA/IFtzdGF0ZSwgdGl0bGVdIDogW3N0YXRlLCB0aXRsZSwgdXJsXTtcbiAgICAgIE9yaWdpbmFsUHVzaFN0YXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7XG4gICAgICBjb25zdCBhcmdzID0gdXJsID09PSB1bmRlZmluZWQgPyBbc3RhdGUsIHRpdGxlXSA6IFtzdGF0ZSwgdGl0bGUsIHVybF07XG4gICAgICBPcmlnaW5hbFJlcGxhY2VTdGF0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NDFcbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nU3RhcnRzV2l0aCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9zdGFydHMtd2l0aC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw0MVxuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdFbmRzV2l0aCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvZW5kcy13aXRoLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQxXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0luY2x1ZGVzKCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9pbmNsdWRlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQ3XG4gIChmdW5jdGlvbiBjaGVja0FycmF5SW5jbHVkZXMoKSB7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9hcnJheS9pbmNsdWRlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBBcnJheS5mcm9tIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlGcm9tKCkge1xuICAgIGlmIChBcnJheS5mcm9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL2FycmF5L2Zyb20uanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LmFzc2lnbiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja09iamVjdEFzc2lnbigpIHtcbiAgICBpZiAoT2JqZWN0LmFzc2lnbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5mcm9tRW50cmllcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NzNcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0RnJvbUVudHJpZXMoKSB7XG4gICAgaWYgKE9iamVjdC5mcm9tRW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvZnJvbS1lbnRyaWVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE1hdGgubG9nMiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8MzhcbiAgKGZ1bmN0aW9uIGNoZWNrTWF0aExvZzIoKSB7XG4gICAgaWYgKE1hdGgubG9nMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBNYXRoLmxvZzIgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9tYXRoL2xvZzIuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgTnVtYmVyLmlzTmFOIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUuXG4gIChmdW5jdGlvbiBjaGVja051bWJlcklzTmFOKCkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTnVtYmVyLmlzTmFOID0gcmVxdWlyZShcImNvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBOdW1iZXIuaXNJbnRlZ2VyIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTwzNFxuICAoZnVuY3Rpb24gY2hlY2tOdW1iZXJJc0ludGVnZXIoKSB7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTnVtYmVyLmlzSW50ZWdlciA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFR5cGVkQXJyYXkucHJvdG90eXBlLnNsaWNlIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrVHlwZWRBcnJheVNsaWNlKCkge1xuICAgIGlmIChVaW50OEFycmF5LnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy90eXBlZC1hcnJheS9zbGljZVwiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRSwgU2FmYXJpPDExLCBDaHJvbWU8NjNcbiAgKGZ1bmN0aW9uIGNoZWNrUHJvbWlzZSgpIHtcbiAgICBpZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgYXJlIHN5bmNocm9ub3VzLCBoZW5jZSBgUHJvbWlzZWAgc2hvdWxkbid0XG4gICAgICAvLyBuZWVkIHRvIGJlIHBvbHlmaWxsZWQgZm9yIHRoZSBJTUFHRV9ERUNPREVSUyBidWlsZCB0YXJnZXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChnbG9iYWxUaGlzLlByb21pc2UgJiYgZ2xvYmFsVGhpcy5Qcm9taXNlLmFsbFNldHRsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5Qcm9taXNlID0gcmVxdWlyZShcImNvcmUtanMvZXMvcHJvbWlzZS9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tVUkwoKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIlBST0RVQ1RJT05cIikpIHtcbiAgICAgIC8vIFByZXZlbnQgXCJyZXF1aXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIgZXJyb3JzIGluIGRldmVsb3BtZW50IG1vZGUsXG4gICAgICAvLyBzaW5jZSB0aGUgYFVSTGAgY29uc3RydWN0b3Igc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBtb2Rlcm4gYnJvd2Vycy5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCFQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkge1xuICAgICAgLy8gVGhlIGBVUkxgIGNvbnN0cnVjdG9yIGlzIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlIGluIHRoZSBleHRlbnNpb25cbiAgICAgIC8vIGJ1aWxkcy5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgZG9uJ3QgdXNlIHRoZSBgVVJMYCBjb25zdHJ1Y3Rvciwgc28gaXRcbiAgICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSBwb2x5ZmlsbGVkIGZvciB0aGUgSU1BR0VfREVDT0RFUlMgYnVpbGQgdGFyZ2V0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLlVSTCA9IHJlcXVpcmUoXCJjb3JlLWpzL3dlYi91cmwuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUUsIE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrUmVhZGFibGVTdHJlYW0oKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiSU1BR0VfREVDT0RFUlNcIikpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IGltYWdlIGRlY29kZXJzIGFyZSBzeW5jaHJvbm91cywgaGVuY2UgYFJlYWRhYmxlU3RyZWFtYFxuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gYmUgcG9seWZpbGxlZCBmb3IgdGhlIElNQUdFX0RFQ09ERVJTIGJ1aWxkIHRhcmdldC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIC8vIE1TIEVkZ2UgbWF5IHNheSBpdCBoYXMgUmVhZGFibGVTdHJlYW0gYnV0IHRoZXkgYXJlIG5vdCB1cCB0byBzcGVjIHlldC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICAgICAgbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUaGUgUmVhZGFibGVTdHJlYW0gY29uc3RydWN0b3IgY2Fubm90IGJlIHVzZWQuXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKFwid2ViLXN0cmVhbXMtcG9seWZpbGwvZGlzdC9wb255ZmlsbC5qc1wiKS5SZWFkYWJsZVN0cmVhbTtcbiAgfSkoKTtcblxuICAvLyBXZSB3YW50IHRvIHN1cHBvcnQgTWFwIGl0ZXJhdGlvbiwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSBwb3NzaWJsZSB0byBlYXNpbHlcbiAgLy8gdGVzdCBmb3IgdGhhdCBzcGVjaWZpY2FsbHk7IGhlbmNlIHVzaW5nIGEgc2ltaWxhcmx5IHVuc3VwcG9ydGVkIHByb3BlcnR5LlxuICAvLyBTdXBwb3J0OiBJRTExXG4gIChmdW5jdGlvbiBjaGVja01hcEVudHJpZXMoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuTWFwICYmIGdsb2JhbFRoaXMuTWFwLnByb3RvdHlwZS5lbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuTWFwID0gcmVxdWlyZShcImNvcmUtanMvZXMvbWFwL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFdlIHdhbnQgdG8gc3VwcG9ydCBTZXQgaXRlcmF0aW9uLCBidXQgaXQgZG9lc24ndCBzZWVtIHBvc3NpYmxlIHRvIGVhc2lseVxuICAvLyB0ZXN0IGZvciB0aGF0IHNwZWNpZmljYWxseTsgaGVuY2UgdXNpbmcgYSBzaW1pbGFybHkgdW5zdXBwb3J0ZWQgcHJvcGVydHkuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrU2V0RW50cmllcygpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5TZXQgJiYgZ2xvYmFsVGhpcy5TZXQucHJvdG90eXBlLmVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5TZXQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9zZXQvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUU8MTEsIFNhZmFyaTw4LCBDaHJvbWU8MzZcbiAgKGZ1bmN0aW9uIGNoZWNrV2Vha01hcCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuV2Vha01hcCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3dlYWstbWFwL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrV2Vha1NldCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrU2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuV2Vha1NldCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3dlYWstc2V0L2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5jb2RlUG9pbnRBdCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEuXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0NvZGVQb2ludEF0KCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9jb2RlLXBvaW50LWF0LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5mcm9tQ29kZVBvaW50IGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUxMS5cbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nRnJvbUNvZGVQb2ludCgpIHtcbiAgICBpZiAoU3RyaW5nLmZyb21Db2RlUG9pbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgU3RyaW5nLmZyb21Db2RlUG9pbnQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvZnJvbS1jb2RlLXBvaW50LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1N5bWJvbCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5TeW1ib2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3ltYm9sL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU3XG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1BhZFN0YXJ0KCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9wYWQtc3RhcnQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU3XG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1BhZEVuZCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL3BhZC1lbmQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LnZhbHVlcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NTRcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0VmFsdWVzKCkge1xuICAgIGlmIChPYmplY3QudmFsdWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXMgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvdmFsdWVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5lbnRyaWVzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw1NFxuICAoZnVuY3Rpb24gY2hlY2tPYmplY3RFbnRyaWVzKCkge1xuICAgIGlmIChPYmplY3QuZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzXCIpO1xuICB9KSgpO1xufVxuIiwiLyogQ29weXJpZ2h0IDIwMTggTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWxzIHByb2Nlc3MgKi9cblxuLy8gTlcuanMgLyBFbGVjdHJvbiBpcyBhIGJyb3dzZXIgY29udGV4dCwgYnV0IGNvcGllcyBzb21lIE5vZGUuanMgb2JqZWN0czsgc2VlXG4vLyBodHRwOi8vZG9jcy5ud2pzLmlvL2VuL2xhdGVzdC9Gb3IlMjBVc2Vycy9BZHZhbmNlZC9KYXZhU2NyaXB0JTIwQ29udGV4dHMlMjBpbiUyME5XLmpzLyNhY2Nlc3Mtbm9kZWpzLWFuZC1ud2pzLWFwaS1pbi1icm93c2VyLWNvbnRleHRcbi8vIGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvYXBpL3Byb2Nlc3MjcHJvY2Vzc3ZlcnNpb25zZWxlY3Ryb24tcmVhZG9ubHlcbi8vIGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvYXBpL3Byb2Nlc3MjcHJvY2Vzc3R5cGUtcmVhZG9ubHlcbmNvbnN0IGlzTm9kZUpTID1cbiAgdHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiZcbiAgcHJvY2VzcyArIFwiXCIgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiICYmXG4gICFwcm9jZXNzLnZlcnNpb25zLm53ICYmXG4gICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSBcImJyb3dzZXJcIik7XG5cbmV4cG9ydCB7IGlzTm9kZUpTIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbi8qKlxuICogQG1vZHVsZSBwZGZqc0xpYlxuICovXG5cbmltcG9ydCB7XG4gIEFib3J0RXhjZXB0aW9uLFxuICBhc3NlcnQsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBnZXRWZXJib3NpdHlMZXZlbCxcbiAgaW5mbyxcbiAgSW52YWxpZFBERkV4Y2VwdGlvbixcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNTYW1lT3JpZ2luLFxuICBNaXNzaW5nUERGRXhjZXB0aW9uLFxuICBQYXNzd29yZEV4Y2VwdGlvbixcbiAgc2V0VmVyYm9zaXR5TGV2ZWwsXG4gIHNoYWRvdyxcbiAgc3RyaW5nVG9CeXRlcyxcbiAgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uLFxuICBVbmtub3duRXJyb3JFeGNlcHRpb24sXG4gIHVucmVhY2hhYmxlLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7XG4gIGRlcHJlY2F0ZWQsXG4gIERPTUNhbnZhc0ZhY3RvcnksXG4gIERPTUNNYXBSZWFkZXJGYWN0b3J5LFxuICBsb2FkU2NyaXB0LFxuICBQYWdlVmlld3BvcnQsXG4gIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbixcbiAgU3RhdFRpbWVyLFxufSBmcm9tIFwiLi9kaXNwbGF5X3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBGb250RmFjZU9iamVjdCwgRm9udExvYWRlciB9IGZyb20gXCIuL2ZvbnRfbG9hZGVyLmpzXCI7XG5pbXBvcnQgeyBOb2RlQ2FudmFzRmFjdG9yeSwgTm9kZUNNYXBSZWFkZXJGYWN0b3J5IH0gZnJvbSBcIi4vbm9kZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgQW5ub3RhdGlvblN0b3JhZ2UgfSBmcm9tIFwiLi9hbm5vdGF0aW9uX3N0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFwaUNvbXBhdGliaWxpdHlQYXJhbXMgfSBmcm9tIFwiLi9hcGlfY29tcGF0aWJpbGl0eS5qc1wiO1xuaW1wb3J0IHsgQ2FudmFzR3JhcGhpY3MgfSBmcm9tIFwiLi9jYW52YXMuanNcIjtcbmltcG9ydCB7IEdsb2JhbFdvcmtlck9wdGlvbnMgfSBmcm9tIFwiLi93b3JrZXJfb3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgaXNOb2RlSlMgfSBmcm9tIFwiLi4vc2hhcmVkL2lzX25vZGUuanNcIjtcbmltcG9ydCB7IE1lc3NhZ2VIYW5kbGVyIH0gZnJvbSBcIi4uL3NoYXJlZC9tZXNzYWdlX2hhbmRsZXIuanNcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIi4vbWV0YWRhdGEuanNcIjtcbmltcG9ydCB7IE9wdGlvbmFsQ29udGVudENvbmZpZyB9IGZyb20gXCIuL29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLmpzXCI7XG5pbXBvcnQgeyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtIH0gZnJvbSBcIi4vdHJhbnNwb3J0X3N0cmVhbS5qc1wiO1xuaW1wb3J0IHsgV2ViR0xDb250ZXh0IH0gZnJvbSBcIi4vd2ViZ2wuanNcIjtcblxuY29uc3QgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFID0gNjU1MzY7IC8vIDJeMTYgPSA2NTUzNlxuY29uc3QgUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUID0gMTAwOyAvLyBtc1xuXG5jb25zdCBEZWZhdWx0Q2FudmFzRmFjdG9yeSA9XG4gICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpICYmIGlzTm9kZUpTXG4gICAgPyBOb2RlQ2FudmFzRmFjdG9yeVxuICAgIDogRE9NQ2FudmFzRmFjdG9yeTtcbmNvbnN0IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSA9XG4gICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpICYmIGlzTm9kZUpTXG4gICAgPyBOb2RlQ01hcFJlYWRlckZhY3RvcnlcbiAgICA6IERPTUNNYXBSZWFkZXJGYWN0b3J5O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbn0gSVBERlN0cmVhbUZhY3RvcnlcbiAqIEBwYXJhbSB7RG9jdW1lbnRJbml0UGFyYW1ldGVyc30gcGFyYW1zIC0gVGhlIGRvY3VtZW50IGluaXRpYWxpemF0aW9uXG4gKiAgIHBhcmFtZXRlcnMuIFRoZSBcInVybFwiIGtleSBpcyBhbHdheXMgcHJlc2VudC5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UsIHdoaWNoIGlzIHJlc29sdmVkIHdpdGggYW4gaW5zdGFuY2Ugb2ZcbiAqICAge0lQREZTdHJlYW19LlxuICogQGlnbm9yZVxuICovXG5cbi8qKlxuICogQHR5cGUgSVBERlN0cmVhbUZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKi9cbmxldCBjcmVhdGVQREZOZXR3b3JrU3RyZWFtO1xuXG4vKipcbiAqIFNldHMgdGhlIGZ1bmN0aW9uIHRoYXQgaW5zdGFudGlhdGVzIGFuIHtJUERGU3RyZWFtfSBhcyBhbiBhbHRlcm5hdGl2ZSBQREZcbiAqIGRhdGEgdHJhbnNwb3J0LlxuICpcbiAqIEBwYXJhbSB7SVBERlN0cmVhbUZhY3Rvcnl9IHBkZk5ldHdvcmtTdHJlYW1GYWN0b3J5IC0gVGhlIGZhY3RvcnkgZnVuY3Rpb25cbiAqICAgdGhhdCB0YWtlcyBkb2N1bWVudCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIChpbmNsdWRpbmcgYSBcInVybFwiKSBhbmRcbiAqICAgcmV0dXJucyBhIHByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgd2l0aCBhbiBpbnN0YW5jZSBvZiB7SVBERlN0cmVhbX0uXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KHBkZk5ldHdvcmtTdHJlYW1GYWN0b3J5KSB7XG4gIGNyZWF0ZVBERk5ldHdvcmtTdHJlYW0gPSBwZGZOZXR3b3JrU3RyZWFtRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7IEludDhBcnJheSB8IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSB8XG4gKiAgICAgICAgICAgIEludDE2QXJyYXkgfCBVaW50MTZBcnJheSB8XG4gKiAgICAgICAgICAgIEludDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IEZsb2F0MzJBcnJheSB8XG4gKiAgICAgICAgICAgIEZsb2F0NjRBcnJheVxuICogfSBUeXBlZEFycmF5XG4gKi9cblxuLyoqXG4gKiBEb2N1bWVudCBpbml0aWFsaXphdGlvbiAvIGxvYWRpbmcgcGFyYW1ldGVycyBvYmplY3QuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gRG9jdW1lbnRJbml0UGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCBvZiB0aGUgUERGLlxuICogQHByb3BlcnR5IHtUeXBlZEFycmF5fEFycmF5PG51bWJlcj58c3RyaW5nfSBbZGF0YV0gLSBCaW5hcnkgUERGIGRhdGEuIFVzZVxuICogICAgdHlwZWQgYXJyYXlzIChVaW50OEFycmF5KSB0byBpbXByb3ZlIHRoZSBtZW1vcnkgdXNhZ2UuIElmIFBERiBkYXRhIGlzXG4gKiAgICBCQVNFNjQtZW5jb2RlZCwgdXNlIGBhdG9iKClgIHRvIGNvbnZlcnQgaXQgdG8gYSBiaW5hcnkgc3RyaW5nIGZpcnN0LlxuICogQHByb3BlcnR5IHtPYmplY3R9IFtodHRwSGVhZGVyc10gLSBCYXNpYyBhdXRoZW50aWNhdGlvbiBoZWFkZXJzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbd2l0aENyZWRlbnRpYWxzXSAtIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdFxuICogICBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHNob3VsZCBiZSBtYWRlIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2hcbiAqICAgYXMgY29va2llcyBvciBhdXRob3JpemF0aW9uIGhlYWRlcnMuIFRoZSBkZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Bhc3N3b3JkXSAtIEZvciBkZWNyeXB0aW5nIHBhc3N3b3JkLXByb3RlY3RlZCBQREZzLlxuICogQHByb3BlcnR5IHtUeXBlZEFycmF5fSBbaW5pdGlhbERhdGFdIC0gQSB0eXBlZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBwb3J0aW9uXG4gKiAgIG9yIGFsbCBvZiB0aGUgcGRmIGRhdGEuIFVzZWQgYnkgdGhlIGV4dGVuc2lvbiBzaW5jZSBzb21lIGRhdGEgaXMgYWxyZWFkeVxuICogICBsb2FkZWQgYmVmb3JlIHRoZSBzd2l0Y2ggdG8gcmFuZ2UgcmVxdWVzdHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xlbmd0aF0gLSBUaGUgUERGIGZpbGUgbGVuZ3RoLiBJdCdzIHVzZWQgZm9yIHByb2dyZXNzXG4gKiAgIHJlcG9ydHMgYW5kIHJhbmdlIHJlcXVlc3RzIG9wZXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge1BERkRhdGFSYW5nZVRyYW5zcG9ydH0gW3JhbmdlXSAtIEFsbG93cyBmb3IgdXNpbmcgYSBjdXN0b20gcmFuZ2VcbiAqICAgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtyYW5nZUNodW5rU2l6ZV0gLSBTcGVjaWZ5IG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGZldGNoZWRcbiAqICAgcGVyIHJhbmdlIHJlcXVlc3QuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAbGluayBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkV9LlxuICogQHByb3BlcnR5IHtQREZXb3JrZXJ9IFt3b3JrZXJdIC0gVGhlIHdvcmtlciB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgbG9hZGluZyBhbmRcbiAqICAgcGFyc2luZyB0aGUgUERGIGRhdGEuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcmJvc2l0eV0gLSBDb250cm9scyB0aGUgbG9nZ2luZyBsZXZlbDsgdGhlIGNvbnN0YW50c1xuICogICBmcm9tIHtAbGluayBWZXJib3NpdHlMZXZlbH0gc2hvdWxkIGJlIHVzZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RvY0Jhc2VVcmxdIC0gVGhlIGJhc2UgVVJMIG9mIHRoZSBkb2N1bWVudCwgdXNlZCB3aGVuXG4gKiAgIGF0dGVtcHRpbmcgdG8gcmVjb3ZlciB2YWxpZCBhYnNvbHV0ZSBVUkxzIGZvciBhbm5vdGF0aW9ucywgYW5kIG91dGxpbmVcbiAqICAgaXRlbXMsIHRoYXQgKGluY29ycmVjdGx5KSBvbmx5IHNwZWNpZnkgcmVsYXRpdmUgVVJMcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY01hcFVybF0gLSBUaGUgVVJMIHdoZXJlIHRoZSBwcmVkZWZpbmVkIEFkb2JlIENNYXBzIGFyZVxuICogICBsb2NhdGVkLiBJbmNsdWRlIHRoZSB0cmFpbGluZyBzbGFzaC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NNYXBQYWNrZWRdIC0gU3BlY2lmaWVzIGlmIHRoZSBBZG9iZSBDTWFwcyBhcmUgYmluYXJ5XG4gKiAgIHBhY2tlZCBvciBub3QuXG4gKiBAcHJvcGVydHkge09iamVjdH0gW0NNYXBSZWFkZXJGYWN0b3J5XSAtIFRoZSBmYWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHdoZW5cbiAqICAgcmVhZGluZyBidWlsdC1pbiBDTWFwIGZpbGVzLiBQcm92aWRpbmcgYSBjdXN0b20gZmFjdG9yeSBpcyB1c2VmdWwgZm9yXG4gKiAgIGVudmlyb25tZW50cyB3aXRob3V0IEZldGNoIEFQSSBvciBgWE1MSHR0cFJlcXVlc3RgIHN1cHBvcnQsIHN1Y2ggYXNcbiAqICAgTm9kZS5qcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMge0RPTUNNYXBSZWFkZXJGYWN0b3J5fS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N0b3BBdEVycm9yc10gLSBSZWplY3QgY2VydGFpbiBwcm9taXNlcywgZS5nLlxuICogICBgZ2V0T3BlcmF0b3JMaXN0YCwgYGdldFRleHRDb250ZW50YCwgYW5kIGBSZW5kZXJUYXNrYCwgd2hlbiB0aGUgYXNzb2NpYXRlZFxuICogICBQREYgZGF0YSBjYW5ub3QgYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHRvIHJlY292ZXJcbiAqICAgd2hhdGV2ZXIgcG9zc2libGUgb2YgdGhlIGRhdGEuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heEltYWdlU2l6ZV0gLSBUaGUgbWF4aW11bSBhbGxvd2VkIGltYWdlIHNpemUgaW4gdG90YWxcbiAqICAgcGl4ZWxzLCBpLmUuIHdpZHRoICogaGVpZ2h0LiBJbWFnZXMgYWJvdmUgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSByZW5kZXJlZC5cbiAqICAgVXNlIC0xIGZvciBubyBsaW1pdCwgd2hpY2ggaXMgYWxzbyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lzRXZhbFN1cHBvcnRlZF0gLSBEZXRlcm1pbmVzIGlmIHdlIGNhbiBldmFsdWF0ZSBzdHJpbmdzXG4gKiAgIGFzIEphdmFTY3JpcHQuIFByaW1hcmlseSB1c2VkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgZm9udCByZW5kZXJpbmcsIGFuZFxuICogICB3aGVuIHBhcnNpbmcgUERGIGZ1bmN0aW9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZUZvbnRGYWNlXSAtIEJ5IGRlZmF1bHQgZm9udHMgYXJlIGNvbnZlcnRlZCB0b1xuICogICBPcGVuVHlwZSBmb250cyBhbmQgbG9hZGVkIHZpYSBgQGZvbnQtZmFjZWAgcnVsZXMuIElmIGRpc2FibGVkLCBmb250cyB3aWxsXG4gKiAgIGJlIHJlbmRlcmVkIHVzaW5nIGEgYnVpbHQtaW4gZm9udCByZW5kZXJlciB0aGF0IGNvbnN0cnVjdHMgdGhlIGdseXBocyB3aXRoXG4gKiAgIHByaW1pdGl2ZSBwYXRoIGNvbW1hbmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9udEV4dHJhUHJvcGVydGllc10gLSBJbmNsdWRlIGFkZGl0aW9uYWwgcHJvcGVydGllcyxcbiAqICAgd2hpY2ggYXJlIHVudXNlZCBkdXJpbmcgcmVuZGVyaW5nIG9mIFBERiBkb2N1bWVudHMsIHdoZW4gZXhwb3J0aW5nIHRoZVxuICogICBwYXJzZWQgZm9udCBkYXRhIGZyb20gdGhlIHdvcmtlci10aHJlYWQuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nXG4gKiAgIHB1cnBvc2VzIChhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLCBidXQgbm90ZSB0aGF0IGl0IHdpbGwgbGVhZCB0b1xuICogICBpbmNyZWFzZWQgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtIVE1MRG9jdW1lbnR9IFtvd25lckRvY3VtZW50XSAtIFNwZWNpZnkgYW4gZXhwbGljaXQgZG9jdW1lbnRcbiAqICAgY29udGV4dCB0byBjcmVhdGUgZWxlbWVudHMgd2l0aCBhbmQgdG8gbG9hZCByZXNvdXJjZXMsIHN1Y2ggYXMgZm9udHMsXG4gKiAgIGludG8uIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZVJhbmdlXSAtIERpc2FibGUgcmFuZ2UgcmVxdWVzdCBsb2FkaW5nIG9mIFBERlxuICogICBmaWxlcy4gV2hlbiBlbmFibGVkLCBhbmQgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBwYXJ0aWFsIGNvbnRlbnQgcmVxdWVzdHMsXG4gKiAgIHRoZW4gdGhlIFBERiB3aWxsIGJlIGZldGNoZWQgaW4gY2h1bmtzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZVN0cmVhbV0gLSBEaXNhYmxlIHN0cmVhbWluZyBvZiBQREYgZmlsZSBkYXRhLlxuICogICBCeSBkZWZhdWx0IFBERi5qcyBhdHRlbXB0cyB0byBsb2FkIFBERiBmaWxlcyBpbiBjaHVua3MuIFRoZSBkZWZhdWx0IHZhbHVlXG4gKiAgIGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNhYmxlQXV0b0ZldGNoXSAtIERpc2FibGUgcHJlLWZldGNoaW5nIG9mIFBERiBmaWxlXG4gKiAgIGRhdGEuIFdoZW4gcmFuZ2UgcmVxdWVzdHMgYXJlIGVuYWJsZWQgUERGLmpzIHdpbGwgYXV0b21hdGljYWxseSBrZWVwXG4gKiAgIGZldGNoaW5nIG1vcmUgZGF0YSBldmVuIGlmIGl0IGlzbid0IG5lZWRlZCB0byBkaXNwbGF5IHRoZSBjdXJyZW50IHBhZ2UuXG4gKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gKlxuICogICBOT1RFOiBJdCBpcyBhbHNvIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHN0cmVhbWluZywgc2VlIGFib3ZlLCBpbiBvcmRlciBmb3JcbiAqICAgZGlzYWJsaW5nIG9mIHByZS1mZXRjaGluZyB0byB3b3JrIGNvcnJlY3RseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BkZkJ1Z10gLSBFbmFibGVzIHNwZWNpYWwgaG9va3MgZm9yIGRlYnVnZ2luZyBQREYuanNcbiAqICAgKHNlZSBgd2ViL2RlYnVnZ2VyLmpzYCkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQREZEb2N1bWVudFN0YXRzXG4gKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSBzdHJlYW1UeXBlcyAtIFVzZWQgc3RyZWFtIHR5cGVzIGluIHRoZVxuICogICBkb2N1bWVudCAoYW4gaXRlbSBpcyBzZXQgdG8gdHJ1ZSBpZiBzcGVjaWZpYyBzdHJlYW0gSUQgd2FzIHVzZWQgaW4gdGhlXG4gKiAgIGRvY3VtZW50KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0PHN0cmluZywgYm9vbGVhbj59IGZvbnRUeXBlcyAtIFVzZWQgZm9udCB0eXBlcyBpbiB0aGVcbiAqICAgZG9jdW1lbnQgKGFuIGl0ZW0gaXMgc2V0IHRvIHRydWUgaWYgc3BlY2lmaWMgZm9udCBJRCB3YXMgdXNlZCBpbiB0aGVcbiAqICAgZG9jdW1lbnQpLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgbG9hZGluZyBhIFBERiBhbmQgaW50ZXJhY3Rpbmcgd2l0aCBpdC5cbiAqXG4gKiBOT1RFOiBJZiBhIFVSTCBpcyB1c2VkIHRvIGZldGNoIHRoZSBQREYgZGF0YSBhIHN0YW5kYXJkIEZldGNoIEFQSSBjYWxsIChvclxuICogWEhSIGFzIGZhbGxiYWNrKSBpcyB1c2VkLCB3aGljaCBtZWFucyBpdCBtdXN0IGZvbGxvdyBzYW1lIG9yaWdpbiBydWxlcyxcbiAqIGUuZy4gbm8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzIHdpdGhvdXQgQ09SUy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xUeXBlZEFycmF5fERvY3VtZW50SW5pdFBhcmFtZXRlcnN8UERGRGF0YVJhbmdlVHJhbnNwb3J0fSBzcmMgLVxuICogICBDYW4gYmUgYSBVUkwgdG8gd2hlcmUgYSBQREYgZmlsZSBpcyBsb2NhdGVkLCBhIHR5cGVkIGFycmF5IChVaW50OEFycmF5KVxuICogICBhbHJlYWR5IHBvcHVsYXRlZCB3aXRoIGRhdGEgb3IgcGFyYW1ldGVyIG9iamVjdC5cbiAqIEByZXR1cm5zIHtQREZEb2N1bWVudExvYWRpbmdUYXNrfVxuICovXG5mdW5jdGlvbiBnZXREb2N1bWVudChzcmMpIHtcbiAgY29uc3QgdGFzayA9IG5ldyBQREZEb2N1bWVudExvYWRpbmdUYXNrKCk7XG5cbiAgbGV0IHNvdXJjZTtcbiAgaWYgKHR5cGVvZiBzcmMgPT09IFwic3RyaW5nXCIpIHtcbiAgICBzb3VyY2UgPSB7IHVybDogc3JjIH07XG4gIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihzcmMpKSB7XG4gICAgc291cmNlID0geyBkYXRhOiBzcmMgfTtcbiAgfSBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQpIHtcbiAgICBzb3VyY2UgPSB7IHJhbmdlOiBzcmMgfTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHNyYyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkludmFsaWQgcGFyYW1ldGVyIGluIGdldERvY3VtZW50LCBcIiArXG4gICAgICAgICAgXCJuZWVkIGVpdGhlciBVaW50OEFycmF5LCBzdHJpbmcgb3IgYSBwYXJhbWV0ZXIgb2JqZWN0XCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghc3JjLnVybCAmJiAhc3JjLmRhdGEgJiYgIXNyYy5yYW5nZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkludmFsaWQgcGFyYW1ldGVyIG9iamVjdDogbmVlZCBlaXRoZXIgLmRhdGEsIC5yYW5nZSBvciAudXJsXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHNvdXJjZSA9IHNyYztcbiAgfVxuICBjb25zdCBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgcmFuZ2VUcmFuc3BvcnQgPSBudWxsLFxuICAgIHdvcmtlciA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgaWYgKGtleSA9PT0gXCJ1cmxcIiAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAvLyBUaGUgZnVsbCBwYXRoIGlzIHJlcXVpcmVkIGluIHRoZSAndXJsJyBmaWVsZC5cbiAgICAgIHBhcmFtc1trZXldID0gbmV3IFVSTChzb3VyY2Vba2V5XSwgd2luZG93LmxvY2F0aW9uKS5ocmVmO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwicmFuZ2VcIikge1xuICAgICAgcmFuZ2VUcmFuc3BvcnQgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIndvcmtlclwiKSB7XG4gICAgICB3b3JrZXIgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImRhdGFcIiAmJiAhKHNvdXJjZVtrZXldIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgIC8vIENvbnZlcnRpbmcgc3RyaW5nIG9yIGFycmF5LWxpa2UgZGF0YSB0byBVaW50OEFycmF5LlxuICAgICAgY29uc3QgcGRmQnl0ZXMgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgcGRmQnl0ZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcGFyYW1zW2tleV0gPSBzdHJpbmdUb0J5dGVzKHBkZkJ5dGVzKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiBwZGZCeXRlcyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBwZGZCeXRlcyAhPT0gbnVsbCAmJlxuICAgICAgICAhaXNOYU4ocGRmQnl0ZXMubGVuZ3RoKVxuICAgICAgKSB7XG4gICAgICAgIHBhcmFtc1trZXldID0gbmV3IFVpbnQ4QXJyYXkocGRmQnl0ZXMpO1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5QnVmZmVyKHBkZkJ5dGVzKSkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IG5ldyBVaW50OEFycmF5KHBkZkJ5dGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkludmFsaWQgUERGIGJpbmFyeSBkYXRhOiBlaXRoZXIgdHlwZWQgYXJyYXksIFwiICtcbiAgICAgICAgICAgIFwic3RyaW5nIG9yIGFycmF5LWxpa2Ugb2JqZWN0IGlzIGV4cGVjdGVkIGluIHRoZSBcIiArXG4gICAgICAgICAgICBcImRhdGEgcHJvcGVydHkuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwYXJhbXNba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcGFyYW1zLnJhbmdlQ2h1bmtTaXplID0gcGFyYW1zLnJhbmdlQ2h1bmtTaXplIHx8IERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRTtcbiAgcGFyYW1zLkNNYXBSZWFkZXJGYWN0b3J5ID1cbiAgICBwYXJhbXMuQ01hcFJlYWRlckZhY3RvcnkgfHwgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuICBwYXJhbXMuaWdub3JlRXJyb3JzID0gcGFyYW1zLnN0b3BBdEVycm9ycyAhPT0gdHJ1ZTtcbiAgcGFyYW1zLmZvbnRFeHRyYVByb3BlcnRpZXMgPSBwYXJhbXMuZm9udEV4dHJhUHJvcGVydGllcyA9PT0gdHJ1ZTtcbiAgcGFyYW1zLnBkZkJ1ZyA9IHBhcmFtcy5wZGZCdWcgPT09IHRydWU7XG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcmFtcy5tYXhJbWFnZVNpemUpKSB7XG4gICAgcGFyYW1zLm1heEltYWdlU2l6ZSA9IC0xO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmlzRXZhbFN1cHBvcnRlZCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICBwYXJhbXMuaXNFdmFsU3VwcG9ydGVkID0gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5kaXNhYmxlRm9udEZhY2UgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgcGFyYW1zLmRpc2FibGVGb250RmFjZSA9IGFwaUNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUZvbnRGYWNlIHx8IGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLm93bmVyRG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBwYXJhbXMub3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhcmFtcy5kaXNhYmxlUmFuZ2UgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgcGFyYW1zLmRpc2FibGVSYW5nZSA9IGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmRpc2FibGVTdHJlYW0gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgcGFyYW1zLmRpc2FibGVTdHJlYW0gPSBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5kaXNhYmxlQXV0b0ZldGNoICE9PSBcImJvb2xlYW5cIikge1xuICAgIHBhcmFtcy5kaXNhYmxlQXV0b0ZldGNoID0gZmFsc2U7XG4gIH1cblxuICAvLyBTZXQgdGhlIG1haW4tdGhyZWFkIHZlcmJvc2l0eSBsZXZlbC5cbiAgc2V0VmVyYm9zaXR5TGV2ZWwocGFyYW1zLnZlcmJvc2l0eSk7XG5cbiAgaWYgKCF3b3JrZXIpIHtcbiAgICBjb25zdCB3b3JrZXJQYXJhbXMgPSB7XG4gICAgICB2ZXJib3NpdHk6IHBhcmFtcy52ZXJib3NpdHksXG4gICAgICBwb3J0OiBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnQsXG4gICAgfTtcbiAgICAvLyBXb3JrZXIgd2FzIG5vdCBwcm92aWRlZCAtLSBjcmVhdGluZyBhbmQgb3duaW5nIG91ciBvd24uIElmIG1lc3NhZ2UgcG9ydFxuICAgIC8vIGlzIHNwZWNpZmllZCBpbiBnbG9iYWwgd29ya2VyIG9wdGlvbnMsIHVzaW5nIGl0LlxuICAgIHdvcmtlciA9IHdvcmtlclBhcmFtcy5wb3J0XG4gICAgICA/IFBERldvcmtlci5mcm9tUG9ydCh3b3JrZXJQYXJhbXMpXG4gICAgICA6IG5ldyBQREZXb3JrZXIod29ya2VyUGFyYW1zKTtcbiAgICB0YXNrLl93b3JrZXIgPSB3b3JrZXI7XG4gIH1cbiAgY29uc3QgZG9jSWQgPSB0YXNrLmRvY0lkO1xuICB3b3JrZXIucHJvbWlzZVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkaW5nIGFib3J0ZWRcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtlcklkUHJvbWlzZSA9IF9mZXRjaERvY3VtZW50KFxuICAgICAgICB3b3JrZXIsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgcmFuZ2VUcmFuc3BvcnQsXG4gICAgICAgIGRvY0lkXG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29ya1N0cmVhbVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBsZXQgbmV0d29ya1N0cmVhbTtcbiAgICAgICAgaWYgKHJhbmdlVHJhbnNwb3J0KSB7XG4gICAgICAgICAgbmV0d29ya1N0cmVhbSA9IG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsZW5ndGg6IHBhcmFtcy5sZW5ndGgsXG4gICAgICAgICAgICAgIGluaXRpYWxEYXRhOiBwYXJhbXMuaW5pdGlhbERhdGEsXG4gICAgICAgICAgICAgIHByb2dyZXNzaXZlRG9uZTogcGFyYW1zLnByb2dyZXNzaXZlRG9uZSxcbiAgICAgICAgICAgICAgZGlzYWJsZVJhbmdlOiBwYXJhbXMuZGlzYWJsZVJhbmdlLFxuICAgICAgICAgICAgICBkaXNhYmxlU3RyZWFtOiBwYXJhbXMuZGlzYWJsZVN0cmVhbSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByYW5nZVRyYW5zcG9ydFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhcmFtcy5kYXRhKSB7XG4gICAgICAgICAgbmV0d29ya1N0cmVhbSA9IGNyZWF0ZVBERk5ldHdvcmtTdHJlYW0oe1xuICAgICAgICAgICAgdXJsOiBwYXJhbXMudXJsLFxuICAgICAgICAgICAgbGVuZ3RoOiBwYXJhbXMubGVuZ3RoLFxuICAgICAgICAgICAgaHR0cEhlYWRlcnM6IHBhcmFtcy5odHRwSGVhZGVycyxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogcGFyYW1zLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiBwYXJhbXMucmFuZ2VDaHVua1NpemUsXG4gICAgICAgICAgICBkaXNhYmxlUmFuZ2U6IHBhcmFtcy5kaXNhYmxlUmFuZ2UsXG4gICAgICAgICAgICBkaXNhYmxlU3RyZWFtOiBwYXJhbXMuZGlzYWJsZVN0cmVhbSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKG5ldHdvcmtTdHJlYW0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbd29ya2VySWRQcm9taXNlLCBuZXR3b3JrU3RyZWFtUHJvbWlzZV0pLnRoZW4oXG4gICAgICAgIGZ1bmN0aW9uIChbd29ya2VySWQsIG5ldHdvcmtTdHJlYW1dKSB7XG4gICAgICAgICAgaWYgKHRhc2suZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkaW5nIGFib3J0ZWRcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoXG4gICAgICAgICAgICBkb2NJZCxcbiAgICAgICAgICAgIHdvcmtlcklkLFxuICAgICAgICAgICAgd29ya2VyLnBvcnRcbiAgICAgICAgICApO1xuICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gd29ya2VyLnBvc3RNZXNzYWdlVHJhbnNmZXJzO1xuICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBXb3JrZXJUcmFuc3BvcnQoXG4gICAgICAgICAgICBtZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICBuZXR3b3JrU3RyZWFtLFxuICAgICAgICAgICAgcGFyYW1zXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0YXNrLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcIlJlYWR5XCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pXG4gICAgLmNhdGNoKHRhc2suX2NhcGFiaWxpdHkucmVqZWN0KTtcblxuICByZXR1cm4gdGFzaztcbn1cblxuLyoqXG4gKiBTdGFydHMgZmV0Y2hpbmcgb2Ygc3BlY2lmaWVkIFBERiBkb2N1bWVudC9kYXRhLlxuICpcbiAqIEBwYXJhbSB7UERGV29ya2VyfSB3b3JrZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VcbiAqIEBwYXJhbSB7UERGRGF0YVJhbmdlVHJhbnNwb3J0fSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBkb2NJZCAtIFVuaXF1ZSBkb2N1bWVudCBJRCwgdXNlZCBpbiBgTWVzc2FnZUhhbmRsZXJgLlxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHdvcmtlciBJRCBvZiB0aGVcbiAqICAgYE1lc3NhZ2VIYW5kbGVyYCBpcyBrbm93bi5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9mZXRjaERvY3VtZW50KHdvcmtlciwgc291cmNlLCBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQsIGRvY0lkKSB7XG4gIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgfVxuXG4gIGlmIChwZGZEYXRhUmFuZ2VUcmFuc3BvcnQpIHtcbiAgICBzb3VyY2UubGVuZ3RoID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0Lmxlbmd0aDtcbiAgICBzb3VyY2UuaW5pdGlhbERhdGEgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQuaW5pdGlhbERhdGE7XG4gICAgc291cmNlLnByb2dyZXNzaXZlRG9uZSA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5wcm9ncmVzc2l2ZURvbmU7XG4gIH1cbiAgcmV0dXJuIHdvcmtlci5tZXNzYWdlSGFuZGxlclxuICAgIC5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NSZXF1ZXN0XCIsIHtcbiAgICAgIGRvY0lkLFxuICAgICAgYXBpVmVyc2lvbjpcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmICFQREZKU0Rldi50ZXN0KFwiVEVTVElOR1wiKVxuICAgICAgICAgID8gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9WRVJTSU9OXCIpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgLy8gT25seSBzZW5kIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzLCBhbmQgKm5vdCogdGhlIGVudGlyZSBvYmplY3QuXG4gICAgICBzb3VyY2U6IHtcbiAgICAgICAgZGF0YTogc291cmNlLmRhdGEsXG4gICAgICAgIHVybDogc291cmNlLnVybCxcbiAgICAgICAgcGFzc3dvcmQ6IHNvdXJjZS5wYXNzd29yZCxcbiAgICAgICAgZGlzYWJsZUF1dG9GZXRjaDogc291cmNlLmRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICAgIHJhbmdlQ2h1bmtTaXplOiBzb3VyY2UucmFuZ2VDaHVua1NpemUsXG4gICAgICAgIGxlbmd0aDogc291cmNlLmxlbmd0aCxcbiAgICAgIH0sXG4gICAgICBtYXhJbWFnZVNpemU6IHNvdXJjZS5tYXhJbWFnZVNpemUsXG4gICAgICBkaXNhYmxlRm9udEZhY2U6IHNvdXJjZS5kaXNhYmxlRm9udEZhY2UsXG4gICAgICBwb3N0TWVzc2FnZVRyYW5zZmVyczogd29ya2VyLnBvc3RNZXNzYWdlVHJhbnNmZXJzLFxuICAgICAgZG9jQmFzZVVybDogc291cmNlLmRvY0Jhc2VVcmwsXG4gICAgICBpZ25vcmVFcnJvcnM6IHNvdXJjZS5pZ25vcmVFcnJvcnMsXG4gICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHNvdXJjZS5pc0V2YWxTdXBwb3J0ZWQsXG4gICAgICBmb250RXh0cmFQcm9wZXJ0aWVzOiBzb3VyY2UuZm9udEV4dHJhUHJvcGVydGllcyxcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICh3b3JrZXJJZCkge1xuICAgICAgaWYgKHdvcmtlci5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29ya2VySWQ7XG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhlIGxvYWRpbmcgdGFzayBjb250cm9scyB0aGUgb3BlcmF0aW9ucyByZXF1aXJlZCB0byBsb2FkIGEgUERGIGRvY3VtZW50XG4gKiAoc3VjaCBhcyBuZXR3b3JrIHJlcXVlc3RzKSBhbmQgcHJvdmlkZXMgYSB3YXkgdG8gbGlzdGVuIGZvciBjb21wbGV0aW9uLFxuICogYWZ0ZXIgd2hpY2ggaW5kaXZpZHVhbCBwYWdlcyBjYW4gYmUgcmVuZGVyZWQuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGRG9jdW1lbnRMb2FkaW5nVGFza1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGRvY0lkIC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkb2N1bWVudCBsb2FkaW5nIHRhc2suXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRlc3Ryb3llZCAtIFdoZXRoZXIgdGhlIGxvYWRpbmcgdGFzayBpcyBkZXN0cm95ZWQgb3Igbm90LlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW29uUGFzc3dvcmRdIC0gQ2FsbGJhY2sgdG8gcmVxdWVzdCBhIHBhc3N3b3JkIGlmIGEgd3JvbmdcbiAqICAgb3Igbm8gcGFzc3dvcmQgd2FzIHByb3ZpZGVkLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgdHdvIHBhcmFtZXRlcnM6IGFcbiAqICAgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBwYXNzd29yZCwgYW5kIGEgcmVhc29uIChzZWVcbiAqICAge0BsaW5rIFBhc3N3b3JkUmVzcG9uc2VzfSkuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBbb25Qcm9ncmVzc10gLSBDYWxsYmFjayB0byBiZSBhYmxlIHRvIG1vbml0b3IgdGhlXG4gKiAgIGxvYWRpbmcgcHJvZ3Jlc3Mgb2YgdGhlIFBERiBmaWxlIChuZWNlc3NhcnkgdG8gaW1wbGVtZW50IGUuZy4gYSBsb2FkaW5nXG4gKiAgIGJhcikuIFRoZSBjYWxsYmFjayByZWNlaXZlcyBhbiB7T2JqZWN0fSB3aXRoIHRoZSBwcm9wZXJ0aWVzIGBsb2FkZWRgXG4gKiAgICh7bnVtYmVyfSkgYW5kIGB0b3RhbGAgKHtudW1iZXJ9KSB0aGF0IGluZGljYXRlIGhvdyBtYW55IGJ5dGVzIGFyZSBsb2FkZWQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBbb25VbnN1cHBvcnRlZEZlYXR1cmVdIC0gQ2FsbGJhY2sgZm9yIHdoZW4gYW5cbiAqICAgdW5zdXBwb3J0ZWQgZmVhdHVyZSBpcyB1c2VkIGluIHRoZSBQREYgZG9jdW1lbnQuIFRoZSBjYWxsYmFjayByZWNlaXZlcyBhblxuICogICB7QGxpbmsgVU5TVVBQT1JURURfRkVBVFVSRVN9IGFyZ3VtZW50LlxuICogQHByb3BlcnR5IHtQcm9taXNlPFBERkRvY3VtZW50UHJveHk+fSBwcm9taXNlIC0gUHJvbWlzZSBmb3IgZG9jdW1lbnQgbG9hZGluZ1xuICogICB0YXNrIGNvbXBsZXRpb24uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBkZXN0cm95IC0gQWJvcnQgYWxsIG5ldHdvcmsgcmVxdWVzdHMgYW5kIGRlc3Ryb3lcbiAqICAgdGhlIHdvcmtlci4gUmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGRlc3RydWN0aW9uIGlzXG4gKiAgIGNvbXBsZXRlZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHthbnl9XG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IFBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSAoZnVuY3Rpb24gUERGRG9jdW1lbnRMb2FkaW5nVGFza0Nsb3N1cmUoKSB7XG4gIGxldCBuZXh0RG9jdW1lbnRJZCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2FkaW5nIHRhc2sgY29udHJvbHMgdGhlIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gbG9hZCBhIFBERiBkb2N1bWVudFxuICAgKiAoc3VjaCBhcyBuZXR3b3JrIHJlcXVlc3RzKSBhbmQgcHJvdmlkZXMgYSB3YXkgdG8gbGlzdGVuIGZvciBjb21wbGV0aW9uLFxuICAgKiBhZnRlciB3aGljaCBpbmRpdmlkdWFsIHBhZ2VzIGNhbiBiZSByZW5kZXJlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgUERGRG9jdW1lbnRMb2FkaW5nVGFzayB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9jYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG4gICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZG9jdW1lbnQgbG9hZGluZyB0YXNrLlxuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgdGhpcy5kb2NJZCA9IFwiZFwiICsgbmV4dERvY3VtZW50SWQrKztcblxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSBsb2FkaW5nIHRhc2sgaXMgZGVzdHJveWVkIG9yIG5vdC5cbiAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICovXG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgICAvKipcbiAgICAgICAqIENhbGxiYWNrIHRvIHJlcXVlc3QgYSBwYXNzd29yZCBpZiBhIHdyb25nIG9yIG5vIHBhc3N3b3JkIHdhcyBwcm92aWRlZC5cbiAgICAgICAqIFRoZSBjYWxsYmFjayByZWNlaXZlcyB0d28gcGFyYW1ldGVyczogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWRcbiAgICAgICAqIHdpdGggdGhlIG5ldyBwYXNzd29yZCwgYW5kIGEgcmVhc29uIChzZWUge0BsaW5rIFBhc3N3b3JkUmVzcG9uc2VzfSkuXG4gICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAgICAgKi9cbiAgICAgIHRoaXMub25QYXNzd29yZCA9IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogQ2FsbGJhY2sgdG8gYmUgYWJsZSB0byBtb25pdG9yIHRoZSBsb2FkaW5nIHByb2dyZXNzIG9mIHRoZSBQREYgZmlsZVxuICAgICAgICogKG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgZS5nLiBhIGxvYWRpbmcgYmFyKS4gVGhlIGNhbGxiYWNrIHJlY2VpdmVzXG4gICAgICAgKiBhbiB7T2JqZWN0fSB3aXRoIHRoZSBwcm9wZXJ0aWVzIGBsb2FkZWRgICh7bnVtYmVyfSkgYW5kIGB0b3RhbGBcbiAgICAgICAqICh7bnVtYmVyfSkgdGhhdCBpbmRpY2F0ZSBob3cgbWFueSBieXRlcyBhcmUgbG9hZGVkLlxuICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxuICAgICAgICovXG4gICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGFuIHVuc3VwcG9ydGVkIGZlYXR1cmUgaXMgdXNlZCBpbiB0aGUgUERGIGRvY3VtZW50LlxuICAgICAgICogVGhlIGNhbGxiYWNrIHJlY2VpdmVzIGFuIHtAbGluayBVTlNVUFBPUlRFRF9GRUFUVVJFU30gYXJndW1lbnQuXG4gICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAgICAgKi9cbiAgICAgIHRoaXMub25VbnN1cHBvcnRlZEZlYXR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb21pc2UgZm9yIGRvY3VtZW50IGxvYWRpbmcgdGFzayBjb21wbGV0aW9uLlxuICAgICAqIEB0eXBlIHtQcm9taXNlPFBERkRvY3VtZW50UHJveHk+fVxuICAgICAqL1xuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkZXN0cnVjdGlvbiBpc1xuICAgICAqICAgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHRyYW5zcG9ydERlc3Ryb3llZCA9ICF0aGlzLl90cmFuc3BvcnRcbiAgICAgICAgPyBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICA6IHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95KCk7XG4gICAgICByZXR1cm4gdHJhbnNwb3J0RGVzdHJveWVkLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7XG4gICAgICAgICAgdGhpcy5fd29ya2VyLmRlc3Ryb3koKTtcbiAgICAgICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFBERkRvY3VtZW50TG9hZGluZ1Rhc2s7XG59KSgpO1xuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHRvIHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMgZmlsZSBsb2FkaW5nLlxuICovXG5jbGFzcyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQge1xuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGluaXRpYWxEYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb2dyZXNzaXZlRG9uZV1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGxlbmd0aCwgaW5pdGlhbERhdGEsIHByb2dyZXNzaXZlRG9uZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5pbml0aWFsRGF0YSA9IGluaXRpYWxEYXRhO1xuICAgIHRoaXMucHJvZ3Jlc3NpdmVEb25lID0gcHJvZ3Jlc3NpdmVEb25lO1xuXG4gICAgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gIH1cblxuICBhZGRSYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICBhZGRQcm9ncmVzc0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICBhZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuXG4gIGFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgb25EYXRhUmFuZ2UoYmVnaW4sIGNodW5rKSB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9yYW5nZUxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoYmVnaW4sIGNodW5rKTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGFQcm9ncmVzcyhsb2FkZWQsIHRvdGFsKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyKGxvYWRlZCwgdG90YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25EYXRhUHJvZ3Jlc3NpdmVSZWFkKGNodW5rKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcihjaHVuayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNwb3J0UmVhZHkoKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIHJlcXVlc3REYXRhUmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIFBERkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlXCIpO1xuICB9XG5cbiAgYWJvcnQoKSB7fVxufVxuXG4vKipcbiAqIFByb3h5IHRvIGEgYFBERkRvY3VtZW50YCBpbiB0aGUgd29ya2VyIHRocmVhZC5cbiAqL1xuY2xhc3MgUERGRG9jdW1lbnRQcm94eSB7XG4gIGNvbnN0cnVjdG9yKHBkZkluZm8sIHRyYW5zcG9ydCkge1xuICAgIHRoaXMuX3BkZkluZm8gPSBwZGZJbmZvO1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7QW5ub3RhdGlvblN0b3JhZ2V9IFN0b3JhZ2UgZm9yIGFubm90YXRpb24gZGF0YSBpbiBmb3Jtcy5cbiAgICovXG4gIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiYW5ub3RhdGlvblN0b3JhZ2VcIiwgbmV3IEFubm90YXRpb25TdG9yYWdlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9IFRvdGFsIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgUERGIGZpbGUuXG4gICAqL1xuICBnZXQgbnVtUGFnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BkZkluZm8ubnVtUGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ30gQSAobm90IGd1YXJhbnRlZWQgdG8gYmUpIHVuaXF1ZSBJRCB0byBpZGVudGlmeSBhIFBERi5cbiAgICovXG4gIGdldCBmaW5nZXJwcmludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5maW5nZXJwcmludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZU51bWJlciAtIFRoZSBwYWdlIG51bWJlciB0byBnZXQuIFRoZSBmaXJzdCBwYWdlIGlzIDEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBERlBhZ2VQcm94eT59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGhcbiAgICogICBhIHtAbGluayBQREZQYWdlUHJveHl9IG9iamVjdC5cbiAgICovXG4gIGdldFBhZ2UocGFnZU51bWJlcikge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZShwYWdlTnVtYmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3tudW06IG51bWJlciwgZ2VuOiBudW1iZXJ9fSByZWYgLSBUaGUgcGFnZSByZWZlcmVuY2UuIE11c3QgaGF2ZVxuICAgKiAgIHRoZSBgbnVtYCBhbmQgYGdlbmAgcHJvcGVydGllcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8e251bTogbnVtYmVyLCBnZW46IG51bWJlcn0+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZFxuICAgKiAgIHdpdGggdGhlIHBhZ2UgaW5kZXggKHN0YXJ0aW5nIGZyb20gemVybykgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqICAgcmVmZXJlbmNlLlxuICAgKi9cbiAgZ2V0UGFnZUluZGV4KHJlZikge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUluZGV4KHJlZik7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0PHN0cmluZywgQXJyYXk8YW55Pj4+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZFxuICAgKiAgIHdpdGggYSBtYXBwaW5nIGZyb20gbmFtZWQgZGVzdGluYXRpb25zIHRvIHJlZmVyZW5jZXMuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHNsb3cgZm9yIGxhcmdlIGRvY3VtZW50cy4gVXNlIGBnZXREZXN0aW5hdGlvbmAgaW5zdGVhZC5cbiAgICovXG4gIGdldERlc3RpbmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERlc3RpbmF0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBuYW1lZCBkZXN0aW5hdGlvbiB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGFueT4+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFsbFxuICAgKiAgIGluZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiBuYW1lZCBkZXN0aW5hdGlvbi5cbiAgICovXG4gIGdldERlc3RpbmF0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbihpZCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8c3RyaW5nPiB8IG51bGw+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoXG4gICAqICAgYW4ge0FycmF5fSBjb250YWluaW5nIHRoZSBwYWdlIGxhYmVscyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHBhZ2VcbiAgICogICBpbmRleGVzLCBvciBgbnVsbGAgd2hlbiBubyBwYWdlIGxhYmVscyBhcmUgcHJlc2VudCBpbiB0aGUgUERGIGZpbGUuXG4gICAqL1xuICBnZXRQYWdlTGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxhYmVscygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSB7c3RyaW5nfVxuICAgKiAgIGNvbnRhaW5pbmcgdGhlIHBhZ2UgbGF5b3V0IG5hbWUuXG4gICAqL1xuICBnZXRQYWdlTGF5b3V0KCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxheW91dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSB7c3RyaW5nfVxuICAgKiAgIGNvbnRhaW5pbmcgdGhlIHBhZ2UgbW9kZSBuYW1lLlxuICAgKi9cbiAgZ2V0UGFnZU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTW9kZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdCB8IG51bGw+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuXG4gICAqICAge09iamVjdH0gY29udGFpbmluZyB0aGUgdmlld2VyIHByZWZlcmVuY2VzLCBvciBgbnVsbGAgd2hlbiBubyB2aWV3ZXJcbiAgICogICBwcmVmZXJlbmNlcyBhcmUgcHJlc2VudCBpbiB0aGUgUERGIGZpbGUuXG4gICAqL1xuICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFZpZXdlclByZWZlcmVuY2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55IHwgbnVsbD59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4ge0FycmF5fVxuICAgKiAgIGNvbnRhaW5pbmcgdGhlIGRlc3RpbmF0aW9uLCBvciBgbnVsbGAgd2hlbiBubyBvcGVuIGFjdGlvbiBpcyBwcmVzZW50XG4gICAqICAgaW4gdGhlIFBERi5cbiAgICovXG4gIGdldE9wZW5BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPcGVuQWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhIGxvb2t1cCB0YWJsZVxuICAgKiAgIGZvciBtYXBwaW5nIG5hbWVkIGF0dGFjaG1lbnRzIHRvIHRoZWlyIGNvbnRlbnQuXG4gICAqL1xuICBnZXRBdHRhY2htZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEF0dGFjaG1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8c3RyaW5nPiB8IG51bGw+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoXG4gICAqICAgYW4ge0FycmF5fSBvZiBhbGwgdGhlIEphdmFTY3JpcHQgc3RyaW5ncyBpbiB0aGUgbmFtZSB0cmVlLCBvciBgbnVsbGBcbiAgICogICBpZiBubyBKYXZhU2NyaXB0IGV4aXN0cy5cbiAgICovXG4gIGdldEphdmFTY3JpcHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRKYXZhU2NyaXB0KCk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT3V0bGluZU5vZGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9sZFxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGl0YWxpY1xuICAgKiBAcHJvcGVydHkge1VpbnQ4Q2xhbXBlZEFycmF5fSBjb2xvciAtIFRoZSBjb2xvciBpbiBSR0IgZm9ybWF0IHRvIHVzZSBmb3JcbiAgICogICBkaXNwbGF5IHB1cnBvc2VzLlxuICAgKiBAcHJvcGVydHkge3N0cmluZyB8IEFycmF5PGFueT4gfCBudWxsfSBkZXN0XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB1bnNhZmVVcmxcbiAgICogQHByb3BlcnR5IHtib29sZWFuIHwgdW5kZWZpbmVkfSBuZXdXaW5kb3dcbiAgICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IGNvdW50XG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8T3V0bGluZU5vZGU+fSBpdGVtc1xuICAgKi9cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8T3V0bGluZU5vZGU+Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhblxuICAgKiAgIHtBcnJheX0gdGhhdCBpcyBhIHRyZWUgb3V0bGluZSAoaWYgaXQgaGFzIG9uZSkgb2YgdGhlIFBERiBmaWxlLlxuICAgKi9cbiAgZ2V0T3V0bGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE91dGxpbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPcHRpb25hbENvbnRlbnRDb25maWc+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoXG4gICAqICAgYW4ge0BsaW5rIE9wdGlvbmFsQ29udGVudENvbmZpZ30gdGhhdCBjb250YWlucyBhbGwgdGhlIG9wdGlvbmFsIGNvbnRlbnRcbiAgICogICBncm91cHMgKGFzc3VtaW5nIHRoYXQgdGhlIGRvY3VtZW50IGhhcyBhbnkpLlxuICAgKi9cbiAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8bnVtYmVyPiB8IG51bGw+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoXG4gICAqICAgYW4ge0FycmF5fSB0aGF0IGNvbnRhaW5zIHRoZSBwZXJtaXNzaW9uIGZsYWdzIGZvciB0aGUgUERGIGRvY3VtZW50LCBvclxuICAgKiAgIGBudWxsYCB3aGVuIG5vIHBlcm1pc3Npb25zIGFyZSBwcmVzZW50IGluIHRoZSBQREYgZmlsZS5cbiAgICovXG4gIGdldFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IGluZm86IE9iamVjdCwgbWV0YWRhdGE6IE1ldGFkYXRhIH0+fSBBIHByb21pc2UgdGhhdCBpc1xuICAgKiAgIHJlc29sdmVkIHdpdGggYW4ge09iamVjdH0gdGhhdCBoYXMgYGluZm9gIGFuZCBgbWV0YWRhdGFgIHByb3BlcnRpZXMuXG4gICAqICAgYGluZm9gIGlzIGFuIHtPYmplY3R9IGZpbGxlZCB3aXRoIGFueXRoaW5nIGF2YWlsYWJsZSBpbiB0aGUgaW5mb3JtYXRpb25cbiAgICogICBkaWN0aW9uYXJ5IGFuZCBzaW1pbGFybHkgYG1ldGFkYXRhYCBpcyBhIHtNZXRhZGF0YX0gb2JqZWN0IHdpdGhcbiAgICogICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtZXRhZGF0YSBzZWN0aW9uIG9mIHRoZSBQREYuXG4gICAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8VHlwZWRBcnJheT59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYVxuICAgKiAgIHtUeXBlZEFycmF5fSB0aGF0IGhhcyB0aGUgcmF3IGRhdGEgZnJvbSB0aGUgUERGLlxuICAgKi9cbiAgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IGxlbmd0aDogbnVtYmVyIH0+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZVxuICAgKiAgIGRvY3VtZW50J3MgZGF0YSBpcyBsb2FkZWQuIEl0IGlzIHJlc29sdmVkIHdpdGggYW4ge09iamVjdH0gdGhhdCBjb250YWluc1xuICAgKiAgIHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eSB0aGF0IGluZGljYXRlcyBzaXplIG9mIHRoZSBQREYgZGF0YSBpbiBieXRlcy5cbiAgICovXG4gIGdldERvd25sb2FkSW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQREZEb2N1bWVudFN0YXRzPn0gQSBwcm9taXNlIHRoaXMgaXMgcmVzb2x2ZWQgd2l0aFxuICAgKiAgIGN1cnJlbnQgc3RhdGlzdGljcyBhYm91dCBkb2N1bWVudCBzdHJ1Y3R1cmVzIChzZWVcbiAgICogICB7QGxpbmsgUERGRG9jdW1lbnRTdGF0c30pLlxuICAgKi9cbiAgZ2V0U3RhdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRTdGF0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoZSBkb2N1bWVudCBvbiBib3RoIHRoZSBtYWluIGFuZCB3b3JrZXJcbiAgICogdGhyZWFkcy5cbiAgICpcbiAgICogTk9URTogRG8gbm90LCB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcywgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHJlbmRlcmluZyBpc1xuICAgKiBjdXJyZW50bHkgb25nb2luZyBzaW5jZSB0aGF0IG1heSBsZWFkIHRvIHJlbmRlcmluZyBlcnJvcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGNsZWFuLXVwIGhhcyBmaW5pc2hlZC5cbiAgICovXG4gIGNsZWFudXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgY3VycmVudCBkb2N1bWVudCBpbnN0YW5jZSBhbmQgdGVybWluYXRlcyB0aGUgd29ya2VyLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nVGFzay5kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0RvY3VtZW50SW5pdFBhcmFtZXRlcnN9IEEgc3Vic2V0IG9mIHRoZSBjdXJyZW50XG4gICAqICAge0RvY3VtZW50SW5pdFBhcmFtZXRlcnN9LCB3aGljaCBhcmUgZWl0aGVyIG5lZWRlZCBpbiB0aGUgdmlld2VyIGFuZC9vclxuICAgKiAgIHdob3NlIGRlZmF1bHQgdmFsdWVzIG1heSBiZSBhZmZlY3RlZCBieSB0aGUgYGFwaUNvbXBhdGliaWxpdHlQYXJhbXNgLlxuICAgKi9cbiAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtQREZEb2N1bWVudExvYWRpbmdUYXNrfSBUaGUgbG9hZGluZ1Rhc2sgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50LlxuICAgKi9cbiAgZ2V0IGxvYWRpbmdUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1Rhc2s7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBbm5vdGF0aW9uU3RvcmFnZX0gYW5ub3RhdGlvblN0b3JhZ2UgLSBTdG9yYWdlIGZvciBhbm5vdGF0aW9uXG4gICAqICAgZGF0YSBpbiBmb3Jtcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VWludDhBcnJheT59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYVxuICAgKiAgIHtVaW50OEFycmF5fSBjb250YWluaW5nIHRoZSBmdWxsIGRhdGEgb2YgdGhlIHNhdmVkIGRvY3VtZW50LlxuICAgKi9cbiAgc2F2ZURvY3VtZW50KGFubm90YXRpb25TdG9yYWdlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zYXZlRG9jdW1lbnQoYW5ub3RhdGlvblN0b3JhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSBnZXRWaWV3cG9ydCBwYXJhbWV0ZXJzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFZpZXdwb3J0UGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHNjYWxlIC0gVGhlIGRlc2lyZWQgc2NhbGUgb2YgdGhlIHZpZXdwb3J0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtyb3RhdGlvbl0gLSBUaGUgZGVzaXJlZCByb3RhdGlvbiwgaW4gZGVncmVlcywgb2ZcbiAqICAgdGhlIHZpZXdwb3J0LiBJZiBvbWl0dGVkIGl0IGRlZmF1bHRzIHRvIHRoZSBwYWdlIHJvdGF0aW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRYXSAtIFRoZSBob3Jpem9udGFsLCBpLmUuIHgtYXhpcywgb2Zmc2V0LlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMGAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW29mZnNldFldIC0gVGhlIHZlcnRpY2FsLCBpLmUuIHktYXhpcywgb2Zmc2V0LlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMGAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkb250RmxpcF0gLSBJZiB0cnVlLCB0aGUgeS1heGlzIHdpbGwgbm90IGJlXG4gKiAgIGZsaXBwZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gKi9cblxuLyoqXG4gKiBQYWdlIGdldFRleHRDb250ZW50IHBhcmFtZXRlcnMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gZ2V0VGV4dENvbnRlbnRQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG5vcm1hbGl6ZVdoaXRlc3BhY2UgLSBSZXBsYWNlcyBhbGwgb2NjdXJyZW5jZXMgb2ZcbiAqICAgd2hpdGVzcGFjZSB3aXRoIHN0YW5kYXJkIHNwYWNlcyAoMHgyMCkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRpc2FibGVDb21iaW5lVGV4dEl0ZW1zIC0gRG8gbm90IGF0dGVtcHQgdG8gY29tYmluZVxuICogICBzYW1lIGxpbmUge0BsaW5rIFRleHRJdGVtfSdzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogUGFnZSB0ZXh0IGNvbnRlbnQuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gVGV4dENvbnRlbnRcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8VGV4dEl0ZW0+fSBpdGVtcyAtIEFycmF5IG9mIHtAbGluayBUZXh0SXRlbX0gb2JqZWN0cy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0PHN0cmluZywgVGV4dFN0eWxlPn0gc3R5bGVzIC0ge0BsaW5rIFRleHRTdHlsZX0gb2JqZWN0cyxcbiAqICAgaW5kZXhlZCBieSBmb250IG5hbWUuXG4gKi9cblxuLyoqXG4gKiBQYWdlIHRleHQgY29udGVudCBwYXJ0LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRJdGVtXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RyIC0gVGV4dCBjb250ZW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpciAtIFRleHQgZGlyZWN0aW9uOiAndHRiJywgJ2x0cicgb3IgJ3J0bCcuXG4gKiBAcHJvcGVydHkge0FycmF5PGFueT59IHRyYW5zZm9ybSAtIFRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIFdpZHRoIGluIGRldmljZSBzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBIZWlnaHQgaW4gZGV2aWNlIHNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvbnROYW1lIC0gRm9udCBuYW1lIHVzZWQgYnkgUERGLmpzIGZvciBjb252ZXJ0ZWQgZm9udC5cbiAqL1xuXG4vKipcbiAqIFRleHQgc3R5bGUuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gVGV4dFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gYXNjZW50IC0gRm9udCBhc2NlbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVzY2VudCAtIEZvbnQgZGVzY2VudC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdmVydGljYWwgLSBXaGV0aGVyIG9yIG5vdCB0aGUgdGV4dCBpcyBpbiB2ZXJ0aWNhbCBtb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvbnRGYW1pbHkgLSBUaGUgcG9zc2libGUgZm9udCBmYW1pbHkuXG4gKi9cblxuLyoqXG4gKiBQYWdlIGFubm90YXRpb24gcGFyYW1ldGVycy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRBbm5vdGF0aW9uc1BhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnRlbnQgLSBEZXRlcm1pbmVzIHRoZSBhbm5vdGF0aW9ucyB0aGF0IHdpbGwgYmUgZmV0Y2hlZCxcbiAqICAgY2FuIGJlIGVpdGhlciAnZGlzcGxheScgKHZpZXdhYmxlIGFubm90YXRpb25zKSBvciAncHJpbnQnIChwcmludGFibGVcbiAqICAgYW5ub3RhdGlvbnMpLiBJZiB0aGUgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIGFsbCBhbm5vdGF0aW9ucyBhcmUgZmV0Y2hlZC5cbiAqL1xuXG4vKipcbiAqIFBhZ2UgcmVuZGVyIHBhcmFtZXRlcnMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUmVuZGVyUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGNhbnZhc0NvbnRleHQgLSBBIDJEIGNvbnRleHQgb2YgYSBET00gQ2FudmFzIG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydCAtIFJlbmRlcmluZyB2aWV3cG9ydCBvYnRhaW5lZCBieSBjYWxsaW5nXG4gKiAgIHRoZSBgUERGUGFnZVByb3h5LmdldFZpZXdwb3J0YCBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ludGVudF0gLSBSZW5kZXJpbmcgaW50ZW50LCBjYW4gYmUgJ2Rpc3BsYXknIG9yICdwcmludCcuXG4gKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzICdkaXNwbGF5Jy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZVdlYkdMXSAtIEVuYWJsZXMgV2ViR0wgYWNjZWxlcmF0ZWQgcmVuZGVyaW5nIGZvclxuICogICBzb21lIG9wZXJhdGlvbnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZW5kZXJJbnRlcmFjdGl2ZUZvcm1zXSAtIFdoZXRoZXIgb3Igbm90IGludGVyYWN0aXZlXG4gKiAgIGZvcm0gZWxlbWVudHMgYXJlIHJlbmRlcmVkIGluIHRoZSBkaXNwbGF5IGxheWVyLiBJZiBzbywgd2UgZG8gbm90IHJlbmRlclxuICogICB0aGVtIG9uIHRoZSBjYW52YXMgYXMgd2VsbC5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8YW55Pn0gW3RyYW5zZm9ybV0gLSBBZGRpdGlvbmFsIHRyYW5zZm9ybSwgYXBwbGllZCBqdXN0XG4gKiAgIGJlZm9yZSB2aWV3cG9ydCB0cmFuc2Zvcm0uXG4gKiBAcHJvcGVydHkge09iamVjdH0gW2ltYWdlTGF5ZXJdIC0gQW4gb2JqZWN0IHRoYXQgaGFzIGBiZWdpbkxheW91dGAsXG4gKiAgIGBlbmRMYXlvdXRgIGFuZCBgYXBwZW5kSW1hZ2VgIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbY2FudmFzRmFjdG9yeV0gLSBUaGUgZmFjdG9yeSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZFxuICogICB3aGVuIGNyZWF0aW5nIGNhbnZhc2VzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7bmV3IERPTUNhbnZhc0ZhY3RvcnkoKX0uXG4gKiBAcHJvcGVydHkge09iamVjdCB8IHN0cmluZ30gW2JhY2tncm91bmRdIC0gQmFja2dyb3VuZCB0byB1c2UgZm9yIHRoZSBjYW52YXMuXG4gKiAgIEFueSB2YWxpZCBgY2FudmFzLmZpbGxTdHlsZWAgY2FuIGJlIHVzZWQ6IGEgYERPTVN0cmluZ2AgcGFyc2VkIGFzIENTU1xuICogICA8Y29sb3I+IHZhbHVlLCBhIGBDYW52YXNHcmFkaWVudGAgb2JqZWN0IChhIGxpbmVhciBvciByYWRpYWwgZ3JhZGllbnQpIG9yXG4gKiAgIGEgYENhbnZhc1BhdHRlcm5gIG9iamVjdCAoYSByZXBldGl0aXZlIGltYWdlKS4gVGhlIGRlZmF1bHQgdmFsdWUgaXNcbiAqICAgJ3JnYigyNTUsMjU1LDI1NSknLlxuICogQHByb3BlcnR5IHtBbm5vdGF0aW9uU3RvcmFnZX0gW2Fubm90YXRpb25TdG9yYWdlXSAtIFN0b3JhZ2UgZm9yIGFubm90YXRpb25cbiAqICAgZGF0YSBpbiBmb3Jtcy5cbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxPcHRpb25hbENvbnRlbnRDb25maWc+fSBbb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZV0gLVxuICogICBBIHByb21pc2UgdGhhdCBzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIHtAbGluayBPcHRpb25hbENvbnRlbnRDb25maWd9XG4gKiAgIGNyZWF0ZWQgZnJvbSBgUERGRG9jdW1lbnRQcm94eS5nZXRPcHRpb25hbENvbnRlbnRDb25maWdgLiBJZiBgbnVsbGAsXG4gKiAgIHRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZmV0Y2hlZCBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIGRlZmF1bHQgdmlzaWJpbGl0eVxuICogICBzdGF0ZXMgc2V0LlxuICovXG5cbi8qKlxuICogUERGIHBhZ2Ugb3BlcmF0b3IgbGlzdC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQREZPcGVyYXRvckxpc3RcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8bnVtYmVyPn0gZm5BcnJheSAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIG9wZXJhdG9yIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8YW55Pn0gYXJnc0FycmF5IC0gQXJyYXkgY29udGFpbmluZyB0aGUgYXJndW1lbnRzIG9mIHRoZVxuICogICBmdW5jdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBQcm94eSB0byBhIGBQREZQYWdlYCBpbiB0aGUgd29ya2VyIHRocmVhZC5cbiAqL1xuY2xhc3MgUERGUGFnZVByb3h5IHtcbiAgY29uc3RydWN0b3IocGFnZUluZGV4LCBwYWdlSW5mbywgdHJhbnNwb3J0LCBvd25lckRvY3VtZW50LCBwZGZCdWcgPSBmYWxzZSkge1xuICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLl9wYWdlSW5mbyA9IHBhZ2VJbmZvO1xuICAgIHRoaXMuX293bmVyRG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICB0aGlzLl9zdGF0cyA9IHBkZkJ1ZyA/IG5ldyBTdGF0VGltZXIoKSA6IG51bGw7XG4gICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnO1xuICAgIHRoaXMuY29tbW9uT2JqcyA9IHRyYW5zcG9ydC5jb21tb25PYmpzO1xuICAgIHRoaXMub2JqcyA9IG5ldyBQREZPYmplY3RzKCk7XG5cbiAgICB0aGlzLmNsZWFudXBBZnRlclJlbmRlciA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcbiAgICB0aGlzLl9pbnRlbnRTdGF0ZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfSBQYWdlIG51bWJlciBvZiB0aGUgcGFnZS4gRmlyc3QgcGFnZSBpcyAxLlxuICAgKi9cbiAgZ2V0IHBhZ2VOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmRleCArIDE7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn0gVGhlIG51bWJlciBvZiBkZWdyZWVzIHRoZSBwYWdlIGlzIHJvdGF0ZWQgY2xvY2t3aXNlLlxuICAgKi9cbiAgZ2V0IHJvdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtPYmplY3R9IFRoZSByZWZlcmVuY2UgdGhhdCBwb2ludHMgdG8gdGhpcyBwYWdlLiBJdCBoYXMgYG51bWAgYW5kXG4gICAqICAgYGdlbmAgcHJvcGVydGllcy5cbiAgICovXG4gIGdldCByZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfSBUaGUgZGVmYXVsdCBzaXplIG9mIHVuaXRzIGluIDEvNzJuZHMgb2YgYW4gaW5jaC5cbiAgICovXG4gIGdldCB1c2VyVW5pdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8udXNlclVuaXQ7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0FycmF5PG51bWJlcj59IEFuIGFycmF5IG9mIHRoZSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIFBERiBwYWdlIGluXG4gICAqICAgdXNlciBzcGFjZSB1bml0cyBbeDEsIHkxLCB4MiwgeTJdLlxuICAgKi9cbiAgZ2V0IHZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnZpZXc7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtHZXRWaWV3cG9ydFBhcmFtZXRlcnN9IHBhcmFtcyAtIFZpZXdwb3J0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQYWdlVmlld3BvcnR9IENvbnRhaW5zICd3aWR0aCcgYW5kICdoZWlnaHQnIHByb3BlcnRpZXNcbiAgICogICBhbG9uZyB3aXRoIHRyYW5zZm9ybXMgcmVxdWlyZWQgZm9yIHJlbmRlcmluZy5cbiAgICovXG4gIGdldFZpZXdwb3J0KHtcbiAgICBzY2FsZSxcbiAgICByb3RhdGlvbiA9IHRoaXMucm90YXRlLFxuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGRvbnRGbGlwID0gZmFsc2UsXG4gIH0gPSB7fSkge1xuICAgIHJldHVybiBuZXcgUGFnZVZpZXdwb3J0KHtcbiAgICAgIHZpZXdCb3g6IHRoaXMudmlldyxcbiAgICAgIHNjYWxlLFxuICAgICAgcm90YXRpb24sXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGRvbnRGbGlwLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7R2V0QW5ub3RhdGlvbnNQYXJhbWV0ZXJzfSBwYXJhbXMgLSBBbm5vdGF0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGFueT4+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuXG4gICAqICAge0FycmF5fSBvZiB0aGUgYW5ub3RhdGlvbiBvYmplY3RzLlxuICAgKi9cbiAgZ2V0QW5ub3RhdGlvbnMoeyBpbnRlbnQgPSBudWxsIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5hbm5vdGF0aW9uc1Byb21pc2UgfHwgdGhpcy5hbm5vdGF0aW9uc0ludGVudCAhPT0gaW50ZW50KSB7XG4gICAgICB0aGlzLmFubm90YXRpb25zUHJvbWlzZSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyhcbiAgICAgICAgdGhpcy5fcGFnZUluZGV4LFxuICAgICAgICBpbnRlbnRcbiAgICAgICk7XG4gICAgICB0aGlzLmFubm90YXRpb25zSW50ZW50ID0gaW50ZW50O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uc1Byb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQmVnaW5zIHRoZSBwcm9jZXNzIG9mIHJlbmRlcmluZyBhIHBhZ2UgdG8gdGhlIGRlc2lyZWQgY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtSZW5kZXJQYXJhbWV0ZXJzfSBwYXJhbXMgUGFnZSByZW5kZXIgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1JlbmRlclRhc2t9IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcHJvbWlzZSB0aGF0IGlzXG4gICAqICAgcmVzb2x2ZWQgd2hlbiB0aGUgcGFnZSBmaW5pc2hlcyByZW5kZXJpbmcuXG4gICAqL1xuICByZW5kZXIoe1xuICAgIGNhbnZhc0NvbnRleHQsXG4gICAgdmlld3BvcnQsXG4gICAgaW50ZW50ID0gXCJkaXNwbGF5XCIsXG4gICAgZW5hYmxlV2ViR0wgPSBmYWxzZSxcbiAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gZmFsc2UsXG4gICAgdHJhbnNmb3JtID0gbnVsbCxcbiAgICBpbWFnZUxheWVyID0gbnVsbCxcbiAgICBjYW52YXNGYWN0b3J5ID0gbnVsbCxcbiAgICBiYWNrZ3JvdW5kID0gbnVsbCxcbiAgICBhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsXG4gICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGwsXG4gIH0pIHtcbiAgICBpZiAodGhpcy5fc3RhdHMpIHtcbiAgICAgIHRoaXMuX3N0YXRzLnRpbWUoXCJPdmVyYWxsXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlcmluZ0ludGVudCA9IGludGVudCA9PT0gXCJwcmludFwiID8gXCJwcmludFwiIDogXCJkaXNwbGF5XCI7XG4gICAgLy8gSWYgdGhlcmUgd2FzIGEgcGVuZGluZyBkZXN0cm95LCBjYW5jZWwgaXQgc28gbm8gY2xlYW51cCBoYXBwZW5zIGR1cmluZ1xuICAgIC8vIHRoaXMgY2FsbCB0byByZW5kZXIuXG4gICAgdGhpcy5wZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuXG4gICAgaWYgKCFvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7XG4gICAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuICAgIH1cblxuICAgIGxldCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQocmVuZGVyaW5nSW50ZW50KTtcbiAgICBpZiAoIWludGVudFN0YXRlKSB7XG4gICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KHJlbmRlcmluZ0ludGVudCwgaW50ZW50U3RhdGUpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGF0IGEgcGVuZGluZyBgc3RyZWFtUmVhZGVyYCBjYW5jZWwgdGltZW91dCBpcyBhbHdheXMgYWJvcnRlZC5cbiAgICBpZiAoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpO1xuICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY2FudmFzRmFjdG9yeUluc3RhbmNlID1cbiAgICAgIGNhbnZhc0ZhY3RvcnkgfHxcbiAgICAgIG5ldyBEZWZhdWx0Q2FudmFzRmFjdG9yeSh7IG93bmVyRG9jdW1lbnQ6IHRoaXMuX293bmVyRG9jdW1lbnQgfSk7XG4gICAgY29uc3Qgd2ViR0xDb250ZXh0ID0gbmV3IFdlYkdMQ29udGV4dCh7XG4gICAgICBlbmFibGU6IGVuYWJsZVdlYkdMLFxuICAgIH0pO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBkaXNwbGF5UmVhZHlDYXBhYmlsaXR5IHlldCwgdGhlbiB0aGUgb3BlcmF0b3JMaXN0XG4gICAgLy8gd2FzIG5ldmVyIHJlcXVlc3RlZCBiZWZvcmUuIE1ha2UgdGhlIHJlcXVlc3QgYW5kIGNyZWF0ZSB0aGUgcHJvbWlzZS5cbiAgICBpZiAoIWludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpIHtcbiAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0ID0ge1xuICAgICAgICBmbkFycmF5OiBbXSxcbiAgICAgICAgYXJnc0FycmF5OiBbXSxcbiAgICAgICAgbGFzdENodW5rOiBmYWxzZSxcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLl9zdGF0cykge1xuICAgICAgICB0aGlzLl9zdGF0cy50aW1lKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdCh7XG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgICBpbnRlbnQ6IHJlbmRlcmluZ0ludGVudCxcbiAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9PT0gdHJ1ZSxcbiAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6XG4gICAgICAgICAgKGFubm90YXRpb25TdG9yYWdlICYmIGFubm90YXRpb25TdG9yYWdlLmdldEFsbCgpKSB8fCBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSBlcnJvciA9PiB7XG4gICAgICBjb25zdCBpID0gaW50ZW50U3RhdGUucmVuZGVyVGFza3MuaW5kZXhPZihpbnRlcm5hbFJlbmRlclRhc2spO1xuICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gcmVkdWNlIG1lbW9yeSB1c2FnZSBkdXJpbmcgKnByaW50aW5nKiwgYnkgYWx3YXlzIHJ1bm5pbmdcbiAgICAgIC8vIGNsZWFudXAgb25jZSByZW5kZXJpbmcgaGFzIGZpbmlzaGVkIChyZWdhcmRsZXNzIG9mIGNsZWFudXBBZnRlclJlbmRlcikuXG4gICAgICBpZiAodGhpcy5jbGVhbnVwQWZ0ZXJSZW5kZXIgfHwgcmVuZGVyaW5nSW50ZW50ID09PSBcInByaW50XCIpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nQ2xlYW51cCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLl90cnlDbGVhbnVwKCk7XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuXG4gICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgICAgICByZWFzb246IGVycm9yLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zdGF0cykge1xuICAgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKFwiUmVuZGVyaW5nXCIpO1xuICAgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKFwiT3ZlcmFsbFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7XG4gICAgICBjYWxsYmFjazogY29tcGxldGUsXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMsIGFuZCAqbm90KiB0aGUgZW50aXJlIG9iamVjdC5cbiAgICAgIHBhcmFtczoge1xuICAgICAgICBjYW52YXNDb250ZXh0LFxuICAgICAgICB2aWV3cG9ydCxcbiAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICBpbWFnZUxheWVyLFxuICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgfSxcbiAgICAgIG9ianM6IHRoaXMub2JqcyxcbiAgICAgIGNvbW1vbk9ianM6IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgIG9wZXJhdG9yTGlzdDogaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LFxuICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICBjYW52YXNGYWN0b3J5OiBjYW52YXNGYWN0b3J5SW5zdGFuY2UsXG4gICAgICB3ZWJHTENvbnRleHQsXG4gICAgICB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IHJlbmRlcmluZ0ludGVudCAhPT0gXCJwcmludFwiLFxuICAgICAgcGRmQnVnOiB0aGlzLl9wZGZCdWcsXG4gICAgfSk7XG5cbiAgICBpZiAoIWludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7XG4gICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcyA9IFtdO1xuICAgIH1cbiAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5wdXNoKGludGVybmFsUmVuZGVyVGFzayk7XG4gICAgY29uc3QgcmVuZGVyVGFzayA9IGludGVybmFsUmVuZGVyVGFzay50YXNrO1xuXG4gICAgUHJvbWlzZS5hbGwoW1xuICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLFxuICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSxcbiAgICBdKVxuICAgICAgLnRoZW4oKFt0cmFuc3BhcmVuY3ksIG9wdGlvbmFsQ29udGVudENvbmZpZ10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsZWFudXApIHtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc3RhdHMpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0cy50aW1lKFwiUmVuZGVyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGludGVybmFsUmVuZGVyVGFzay5pbml0aWFsaXplR3JhcGhpY3Moe1xuICAgICAgICAgIHRyYW5zcGFyZW5jeSxcbiAgICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWcsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChjb21wbGV0ZSk7XG5cbiAgICByZXR1cm4gcmVuZGVyVGFzaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQREZPcGVyYXRvckxpc3Q+fSBBIHByb21pc2UgcmVzb2x2ZWQgd2l0aCBhblxuICAgKiAgIHtAbGluayBQREZPcGVyYXRvckxpc3R9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgcGFnZSdzIG9wZXJhdG9yIGxpc3QuXG4gICAqL1xuICBnZXRPcGVyYXRvckxpc3QoKSB7XG4gICAgZnVuY3Rpb24gb3BlcmF0b3JMaXN0Q2hhbmdlZCgpIHtcbiAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlc29sdmUoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KTtcblxuICAgICAgICBjb25zdCBpID0gaW50ZW50U3RhdGUucmVuZGVyVGFza3MuaW5kZXhPZihvcExpc3RUYXNrKTtcbiAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlcmluZ0ludGVudCA9IFwib3BsaXN0XCI7XG4gICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChyZW5kZXJpbmdJbnRlbnQpO1xuICAgIGlmICghaW50ZW50U3RhdGUpIHtcbiAgICAgIGludGVudFN0YXRlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5zZXQocmVuZGVyaW5nSW50ZW50LCBpbnRlbnRTdGF0ZSk7XG4gICAgfVxuICAgIGxldCBvcExpc3RUYXNrO1xuXG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSkge1xuICAgICAgb3BMaXN0VGFzayA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBvcExpc3RUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQgPSBvcGVyYXRvckxpc3RDaGFuZ2VkO1xuICAgICAgaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MgPSBbXTtcbiAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLnB1c2gob3BMaXN0VGFzayk7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7XG4gICAgICAgIGZuQXJyYXk6IFtdLFxuICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICBsYXN0Q2h1bms6IGZhbHNlLFxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuX3N0YXRzKSB7XG4gICAgICAgIHRoaXMuX3N0YXRzLnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KHtcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICAgIGludGVudDogcmVuZGVyaW5nSW50ZW50LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Z2V0VGV4dENvbnRlbnRQYXJhbWV0ZXJzfSBwYXJhbXMgLSBnZXRUZXh0Q29udGVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UmVhZGFibGVTdHJlYW19IFN0cmVhbSBmb3IgcmVhZGluZyB0ZXh0IGNvbnRlbnQgY2h1bmtzLlxuICAgKi9cbiAgc3RyZWFtVGV4dENvbnRlbnQoe1xuICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UgPSBmYWxzZSxcbiAgICBkaXNhYmxlQ29tYmluZVRleHRJdGVtcyA9IGZhbHNlLFxuICB9ID0ge30pIHtcbiAgICBjb25zdCBURVhUX0NPTlRFTlRfQ0hVTktfU0laRSA9IDEwMDtcblxuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXG4gICAgICBcIkdldFRleHRDb250ZW50XCIsXG4gICAgICB7XG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiBub3JtYWxpemVXaGl0ZXNwYWNlID09PSB0cnVlLFxuICAgICAgICBjb21iaW5lVGV4dEl0ZW1zOiBkaXNhYmxlQ29tYmluZVRleHRJdGVtcyAhPT0gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IFRFWFRfQ09OVEVOVF9DSFVOS19TSVpFLFxuICAgICAgICBzaXplKHRleHRDb250ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aDtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Z2V0VGV4dENvbnRlbnRQYXJhbWV0ZXJzfSBwYXJhbXMgLSBnZXRUZXh0Q29udGVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUZXh0Q29udGVudD59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYVxuICAgKiAgIHtAbGluayBUZXh0Q29udGVudH0gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcGFnZSdzIHRleHQgY29udGVudC5cbiAgICovXG4gIGdldFRleHRDb250ZW50KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLnN0cmVhbVRleHRDb250ZW50KHBhcmFtcyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gcHVtcCgpIHtcbiAgICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh7IHZhbHVlLCBkb25lIH0pIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGV4dENvbnRlbnQuc3R5bGVzLCB2YWx1ZS5zdHlsZXMpO1xuICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goLi4udmFsdWUuaXRlbXMpO1xuICAgICAgICAgIHB1bXAoKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHtcbiAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICB9O1xuICAgICAgcHVtcCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBwYWdlIG9iamVjdC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc3BvcnQucGFnZUNhY2hlW3RoaXMuX3BhZ2VJbmRleF0gPSBudWxsO1xuXG4gICAgY29uc3Qgd2FpdE9uID0gW107XG4gICAgZm9yIChjb25zdCBbaW50ZW50LCBpbnRlbnRTdGF0ZV0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSB7XG4gICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgIGludGVudFN0YXRlLFxuICAgICAgICByZWFzb246IG5ldyBFcnJvcihcIlBhZ2Ugd2FzIGRlc3Ryb3llZC5cIiksXG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpbnRlbnQgPT09IFwib3BsaXN0XCIpIHtcbiAgICAgICAgLy8gQXZvaWQgZXJyb3JzIGJlbG93LCBzaW5jZSB0aGUgcmVuZGVyVGFza3MgYXJlIGp1c3Qgc3R1YnMuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgb2YgaW50ZW50U3RhdGUucmVuZGVyVGFza3MpIHtcbiAgICAgICAgd2FpdE9uLnB1c2goaW50ZXJuYWxSZW5kZXJUYXNrLmNvbXBsZXRlZCk7XG4gICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vYmpzLmNsZWFyKCk7XG4gICAgdGhpcy5hbm5vdGF0aW9uc1Byb21pc2UgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVzZXRTdGF0c10gLSBSZXNldCBwYWdlIHN0YXRzLCBpZiBlbmFibGVkLlxuICAgKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJbmRpY2F0ZXMgaWYgY2xlYW4tdXAgd2FzIHN1Y2Nlc3NmdWxseSBydW4uXG4gICAqL1xuICBjbGVhbnVwKHJlc2V0U3RhdHMgPSBmYWxzZSkge1xuICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLl90cnlDbGVhbnVwKHJlc2V0U3RhdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGNsZWFuIHVwIGlmIHJlbmRlcmluZyBpcyBpbiBhIHN0YXRlIHdoZXJlIHRoYXQncyBwb3NzaWJsZS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF90cnlDbGVhbnVwKHJlc2V0U3RhdHMgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy5wZW5kaW5nQ2xlYW51cCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcmVuZGVyVGFza3MsIG9wZXJhdG9yTGlzdCB9IG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKHJlbmRlclRhc2tzLmxlbmd0aCAhPT0gMCB8fCAhb3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faW50ZW50U3RhdGVzLmNsZWFyKCk7XG4gICAgdGhpcy5vYmpzLmNsZWFyKCk7XG4gICAgdGhpcy5hbm5vdGF0aW9uc1Byb21pc2UgPSBudWxsO1xuICAgIGlmIChyZXNldFN0YXRzICYmIHRoaXMuX3N0YXRzKSB7XG4gICAgICB0aGlzLl9zdGF0cyA9IG5ldyBTdGF0VGltZXIoKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc3RhcnRSZW5kZXJQYWdlKHRyYW5zcGFyZW5jeSwgaW50ZW50KSB7XG4gICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGludGVudCk7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuICAgICAgcmV0dXJuOyAvLyBSZW5kZXJpbmcgd2FzIGNhbmNlbGxlZC5cbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0YXRzKSB7XG4gICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgIH1cbiAgICAvLyBUT0RPIFJlZmFjdG9yIFJlbmRlclBhZ2VSZXF1ZXN0IHRvIHNlcGFyYXRlIHJlbmRlcmluZ1xuICAgIC8vIGFuZCBvcGVyYXRvciBsaXN0IGxvZ2ljXG4gICAgaWYgKGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpIHtcbiAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSh0cmFuc3BhcmVuY3kpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlbmRlclBhZ2VDaHVuayhvcGVyYXRvckxpc3RDaHVuaywgaW50ZW50U3RhdGUpIHtcbiAgICAvLyBBZGQgdGhlIG5ldyBjaHVuayB0byB0aGUgY3VycmVudCBvcGVyYXRvciBsaXN0LlxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wZXJhdG9yTGlzdENodW5rLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5mbkFycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuZm5BcnJheVtpXSk7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuYXJnc0FycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuYXJnc0FycmF5W2ldKTtcbiAgICB9XG4gICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayA9IG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuaztcblxuICAgIC8vIE5vdGlmeSBhbGwgdGhlIHJlbmRlcmluZyB0YXNrcyB0aGVyZSBhcmUgbW9yZSBvcGVyYXRvcnMgdG8gYmUgY29uc3VtZWQuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3NbaV0ub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvckxpc3RDaHVuay5sYXN0Q2h1bmspIHtcbiAgICAgIHRoaXMuX3RyeUNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wdW1wT3BlcmF0b3JMaXN0KGFyZ3MpIHtcbiAgICBhc3NlcnQoXG4gICAgICBhcmdzLmludGVudCxcbiAgICAgICdQREZQYWdlUHJveHkuX3B1bXBPcGVyYXRvckxpc3Q6IEV4cGVjdGVkIFwiaW50ZW50XCIgYXJndW1lbnQuJ1xuICAgICk7XG5cbiAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbShcbiAgICAgIFwiR2V0T3BlcmF0b3JMaXN0XCIsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcblxuICAgIGNvbnN0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChhcmdzLmludGVudCk7XG4gICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gcmVhZGVyO1xuXG4gICAgY29uc3QgcHVtcCA9ICgpID0+IHtcbiAgICAgIHJlYWRlci5yZWFkKCkudGhlbihcbiAgICAgICAgKHsgdmFsdWUsIGRvbmUgfSkgPT4ge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVuZGVyUGFnZUNodW5rKHZhbHVlLCBpbnRlbnRTdGF0ZSk7XG4gICAgICAgICAgcHVtcCgpO1xuICAgICAgICB9LFxuICAgICAgICByZWFzb24gPT4ge1xuICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IG51bGw7XG5cbiAgICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCkge1xuICAgICAgICAgICAgLy8gTWFyayBvcGVyYXRvciBsaXN0IGFzIGNvbXBsZXRlLlxuICAgICAgICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZW50U3RhdGUucmVuZGVyVGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3NbaV0ub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdHJ5Q2xlYW51cCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG4gICAgcHVtcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYWJvcnRPcGVyYXRvckxpc3QoeyBpbnRlbnRTdGF0ZSwgcmVhc29uLCBmb3JjZSA9IGZhbHNlIH0pIHtcbiAgICBhc3NlcnQoXG4gICAgICByZWFzb24gaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgICAgICAodHlwZW9mIHJlYXNvbiA9PT0gXCJvYmplY3RcIiAmJiByZWFzb24gIT09IG51bGwpLFxuICAgICAgJ1BERlBhZ2VQcm94eS5fYWJvcnRPcGVyYXRvckxpc3Q6IEV4cGVjdGVkIFwicmVhc29uXCIgYXJndW1lbnQuJ1xuICAgICk7XG5cbiAgICBpZiAoIWludGVudFN0YXRlLnN0cmVhbVJlYWRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICAvLyBFbnN1cmUgdGhhdCBhbiBFcnJvciBvY2N1cnJpbmcgaW4gKm9ubHkqIG9uZSBgSW50ZXJuYWxSZW5kZXJUYXNrYCwgZS5nLlxuICAgICAgLy8gbXVsdGlwbGUgcmVuZGVyKCkgY2FsbHMgb24gdGhlIHNhbWUgY2FudmFzLCB3b24ndCBicmVhayBhbGwgcmVuZGVyaW5nLlxuICAgICAgaWYgKGludGVudFN0YXRlLnJlbmRlclRhc2tzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBpbW1lZGlhdGVseSBhYm9ydCBwYXJzaW5nIG9uIHRoZSB3b3JrZXItdGhyZWFkIHdoZW4gcmVuZGVyaW5nIGlzXG4gICAgICAvLyBjYW5jZWxsZWQsIHNpbmNlIHRoYXQgd2lsbCB1bm5lY2Vzc2FyaWx5IGRlbGF5IHJlLXJlbmRlcmluZyB3aGVuIChmb3JcbiAgICAgIC8vIHBhcnRpYWxseSBwYXJzZWQgcGFnZXMpIGUuZy4gem9vbWluZy9yb3RhdGlvbiBvY2N1cnMgaW4gdGhlIHZpZXdlci5cbiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pIHtcbiAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHsgaW50ZW50U3RhdGUsIHJlYXNvbiwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgICAgIH0sIFJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyLmNhbmNlbChcbiAgICAgIG5ldyBBYm9ydEV4Y2VwdGlvbihyZWFzb24gJiYgcmVhc29uLm1lc3NhZ2UpXG4gICAgKTtcbiAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjsgLy8gSWdub3JlIGFueSBwZW5kaW5nIHJlcXVlc3RzIGlmIHRoZSB3b3JrZXIgd2FzIHRlcm1pbmF0ZWQuXG4gICAgfVxuICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCBgaW50ZW50U3RhdGVgLCBzaW5jZSBhIGNhbmNlbGxlZCBgZ2V0T3BlcmF0b3JMaXN0YFxuICAgIC8vIGNhbGwgb24gdGhlIHdvcmtlci10aHJlYWQgY2Fubm90IGJlIHJlLXN0YXJ0ZWQuLi5cbiAgICBmb3IgKGNvbnN0IFtpbnRlbnQsIGN1ckludGVudFN0YXRlXSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMpIHtcbiAgICAgIGlmIChjdXJJbnRlbnRTdGF0ZSA9PT0gaW50ZW50U3RhdGUpIHtcbiAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzLmRlbGV0ZShpbnRlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gLi4uIGFuZCBmb3JjZSBjbGVhbi11cCB0byBlbnN1cmUgdGhhdCBhbnkgb2xkIHN0YXRlIGlzIGFsd2F5cyByZW1vdmVkLlxuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtPYmplY3R9IFJldHVybnMgcGFnZSBzdGF0cywgaWYgZW5hYmxlZDsgcmV0dXJucyBgbnVsbGAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0IHN0YXRzKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0cztcbiAgfVxufVxuXG5jbGFzcyBMb29wYmFja1BvcnQge1xuICBjb25zdHJ1Y3RvcihkZWZlciA9IHRydWUpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9kZWZlciA9IGRlZmVyO1xuICAgIHRoaXMuX2RlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwb3N0TWVzc2FnZShvYmosIHRyYW5zZmVycykge1xuICAgIGZ1bmN0aW9uIGNsb25lVmFsdWUodmFsdWUpIHtcbiAgICAgIC8vIFRyeWluZyB0byBwZXJmb3JtIGEgc3RydWN0dXJlZCBjbG9uZSBjbG9zZSB0byB0aGUgc3BlYywgaW5jbHVkaW5nXG4gICAgICAvLyB0cmFuc2ZlcnMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWQuaGFzKHZhbHVlKSkge1xuICAgICAgICAvLyBhbHJlYWR5IGNsb25lZCB0aGUgb2JqZWN0XG4gICAgICAgIHJldHVybiBjbG9uZWQuZ2V0KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGxldCBidWZmZXIsIHJlc3VsdDtcbiAgICAgIGlmICgoYnVmZmVyID0gdmFsdWUuYnVmZmVyKSAmJiBpc0FycmF5QnVmZmVyKGJ1ZmZlcikpIHtcbiAgICAgICAgLy8gV2UgZm91bmQgb2JqZWN0IHdpdGggQXJyYXlCdWZmZXIgKHR5cGVkIGFycmF5KS5cbiAgICAgICAgY29uc3QgdHJhbnNmZXJhYmxlID0gdHJhbnNmZXJzICYmIHRyYW5zZmVycy5pbmNsdWRlcyhidWZmZXIpO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlKSB7XG4gICAgICAgICAgcmVzdWx0ID0gbmV3IHZhbHVlLmNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgICAgdmFsdWUuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgIHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IG5ldyB2YWx1ZS5jb25zdHJ1Y3Rvcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmVkLnNldCh2YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTtcbiAgICAgIGNsb25lZC5zZXQodmFsdWUsIHJlc3VsdCk7IC8vIGFkZGluZyB0byBjYWNoZSBub3cgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAvLyBDbG9uaW5nIGFsbCB2YWx1ZSBhbmQgb2JqZWN0IHByb3BlcnRpZXMsIGhvd2V2ZXIgaWdub3JpbmcgcHJvcGVydGllc1xuICAgICAgLy8gZGVmaW5lZCB2aWEgZ2V0dGVyLlxuICAgICAgZm9yIChjb25zdCBpIGluIHZhbHVlKSB7XG4gICAgICAgIGxldCBkZXNjLFxuICAgICAgICAgIHAgPSB2YWx1ZTtcbiAgICAgICAgd2hpbGUgKCEoZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocCwgaSkpKSB7XG4gICAgICAgICAgcCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgTG9vcGJhY2tQb3J0LnBvc3RNZXNzYWdlIC0gY2Fubm90IGNsb25lOiAke3ZhbHVlW2ldfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtpXSA9IGNsb25lVmFsdWUoZGVzYy52YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZGVmZXIpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCB7IGRhdGE6IG9iaiB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsb25lZCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgY29uc3QgZSA9IHsgZGF0YTogY2xvbmVWYWx1ZShvYmopIH07XG4gICAgdGhpcy5fZGVmZXJyZWQudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICByZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgY29uc3QgaSA9IHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICB9XG5cbiAgdGVybWluYXRlKCkge1xuICAgIHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPSAwO1xuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGV29ya2VyUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSB3b3JrZXIuXG4gKiBAcHJvcGVydHkge09iamVjdH0gW3BvcnRdIC0gVGhlIGB3b3JrZXJQb3J0YCBvYmplY3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcmJvc2l0eV0gLSBDb250cm9scyB0aGUgbG9nZ2luZyBsZXZlbDsgdGhlXG4gKiAgIGNvbnN0YW50cyBmcm9tIHtAbGluayBWZXJib3NpdHlMZXZlbH0gc2hvdWxkIGJlIHVzZWQuXG4gKi9cblxuLyoqIEB0eXBlIHthbnl9ICovXG5jb25zdCBQREZXb3JrZXIgPSAoZnVuY3Rpb24gUERGV29ya2VyQ2xvc3VyZSgpIHtcbiAgY29uc3QgcGRmV29ya2VyUG9ydHMgPSBuZXcgV2Vha01hcCgpO1xuICBsZXQgaXNXb3JrZXJEaXNhYmxlZCA9IGZhbHNlO1xuICBsZXQgZmFsbGJhY2tXb3JrZXJTcmM7XG4gIGxldCBuZXh0RmFrZVdvcmtlcklkID0gMDtcbiAgbGV0IGZha2VXb3JrZXJDYXBhYmlsaXR5O1xuXG4gIGlmICh0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiYgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBpZiAoaXNOb2RlSlMgJiYgdHlwZW9mIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIFdvcmtlcnMgYXJlbid0IHN1cHBvcnRlZCBpbiBOb2RlLmpzLCBmb3JjZS1kaXNhYmxpbmcgdGhlbSB0aGVyZS5cbiAgICAgIGlzV29ya2VyRGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJMSUJcIikpIHtcbiAgICAgICAgZmFsbGJhY2tXb3JrZXJTcmMgPSBcIi4uL3BkZi53b3JrZXIuanNcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhbGxiYWNrV29ya2VyU3JjID0gXCIuL3BkZi53b3JrZXIuanNcIjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJvYmplY3RcIiAmJiBcImN1cnJlbnRTY3JpcHRcIiBpbiBkb2N1bWVudCkge1xuICAgICAgY29uc3QgcGRmanNGaWxlUGF0aCA9XG4gICAgICAgIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7XG4gICAgICBpZiAocGRmanNGaWxlUGF0aCkge1xuICAgICAgICBmYWxsYmFja1dvcmtlclNyYyA9IHBkZmpzRmlsZVBhdGgucmVwbGFjZShcbiAgICAgICAgICAvKFxcLig/Om1pblxcLik/anMpKFxcPy4qKT8kL2ksXG4gICAgICAgICAgXCIud29ya2VyJDEkMlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0V29ya2VyU3JjKCkge1xuICAgIGlmIChHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYykge1xuICAgICAgcmV0dXJuIEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZhbGxiYWNrV29ya2VyU3JjICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoIWlzTm9kZUpTKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsbGJhY2tXb3JrZXJTcmM7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyY1wiIHNwZWNpZmllZC4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpIHtcbiAgICBsZXQgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyO1xuICAgIHRyeSB7XG4gICAgICBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIgPVxuICAgICAgICBnbG9iYWxUaGlzLnBkZmpzV29ya2VyICYmIGdsb2JhbFRoaXMucGRmanNXb3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8qIElnbm9yZSBlcnJvcnMuICovXG4gICAgfVxuICAgIHJldHVybiBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIExvYWRzIHdvcmtlciBjb2RlIGludG8gbWFpbiB0aHJlYWQuXG4gIGZ1bmN0aW9uIHNldHVwRmFrZVdvcmtlckdsb2JhbCgpIHtcbiAgICBpZiAoZmFrZVdvcmtlckNhcGFiaWxpdHkpIHtcbiAgICAgIHJldHVybiBmYWtlV29ya2VyQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH1cbiAgICBmYWtlV29ya2VyQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG5cbiAgICBjb25zdCBsb2FkZXIgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKTtcblxuICAgICAgaWYgKG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAvLyBUaGUgd29ya2VyIHdhcyBhbHJlYWR5IGxvYWRlZCB1c2luZyBlLmcuIGEgYDxzY3JpcHQ+YCB0YWcuXG4gICAgICAgIHJldHVybiBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8ICFQREZKU0Rldi50ZXN0KFwiUFJPRFVDVElPTlwiKSkge1xuICAgICAgICBpZiAodHlwZW9mIFN5c3RlbUpTICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gTWFudWFsbHkgbG9hZCBTeXN0ZW1KUywgc2luY2UgaXQncyBvbmx5IG5lY2Vzc2FyeSBmb3IgZmFrZSB3b3JrZXJzLlxuICAgICAgICAgIGF3YWl0IGxvYWRTY3JpcHQoXCIuLi9ub2RlX21vZHVsZXMvc3lzdGVtanMvZGlzdC9zeXN0ZW0uanNcIik7XG4gICAgICAgICAgYXdhaXQgbG9hZFNjcmlwdChcIi4uL3N5c3RlbWpzLmNvbmZpZy5qc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCBTeXN0ZW1KUy5pbXBvcnQoXCJwZGZqcy9jb3JlL3dvcmtlci5qc1wiKTtcbiAgICAgICAgcmV0dXJuIHdvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikgJiZcbiAgICAgICAgaXNOb2RlSlMgJiZcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgIHR5cGVvZiBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICApIHtcbiAgICAgICAgLy8gU2luY2UgYnVuZGxlcnMsIHN1Y2ggYXMgV2VicGFjaywgY2Fubm90IGJlIHRvbGQgdG8gbGVhdmUgYHJlcXVpcmVgXG4gICAgICAgIC8vIHN0YXRlbWVudHMgYWxvbmUgd2UgYXJlIHRodXMgZm9yY2VkIHRvIGp1bXAgdGhyb3VnaCBob29wcyBpbiBvcmRlclxuICAgICAgICAvLyB0byBwcmV2ZW50IGBDcml0aWNhbCBkZXBlbmRlbmN5OiAuLi5gIHdhcm5pbmdzIGluIHRoaXJkLXBhcnR5XG4gICAgICAgIC8vIGRlcGxveW1lbnRzIG9mIHRoZSBidWlsdCBgcGRmLmpzYC9gcGRmLndvcmtlci5qc2AgZmlsZXM7IHNlZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay93ZWJwYWNrL2lzc3Vlcy84ODI2XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGNvZGUgcnVubmluZyBpblxuICAgICAgICAvLyBOb2RlLmpzIHdvbid0IGV2ZXIgYmUgYWZmZWN0ZWQgYnkgZS5nLiBDb250ZW50IFNlY3VyaXR5IFBvbGljaWVzIHRoYXRcbiAgICAgICAgLy8gcHJldmVudCB0aGUgdXNlIG9mIGBldmFsYC4gSWYgdGhhdCBldmVyIG9jY3Vycywgd2Ugc2hvdWxkIHJldmVydCB0aGlzXG4gICAgICAgIC8vIHRvIGEgbm9ybWFsIGBfX25vbl93ZWJwYWNrX3JlcXVpcmVfX2Agc3RhdGVtZW50IGFuZCBzaW1wbHkgZG9jdW1lbnRcbiAgICAgICAgLy8gdGhlIFdlYnBhY2sgd2FybmluZ3MgaW5zdGVhZCAodGVsbGluZyB1c2VycyB0byBpZ25vcmUgdGhlbSkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1ldmFsXG4gICAgICAgIGNvbnN0IHdvcmtlciA9IGV2YWwoXCJyZXF1aXJlXCIpKGdldFdvcmtlclNyYygpKTtcbiAgICAgICAgcmV0dXJuIHdvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGxvYWRTY3JpcHQoZ2V0V29ya2VyU3JjKCkpO1xuICAgICAgcmV0dXJuIHdpbmRvdy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICB9O1xuICAgIGxvYWRlcigpLnRoZW4oZmFrZVdvcmtlckNhcGFiaWxpdHkucmVzb2x2ZSwgZmFrZVdvcmtlckNhcGFiaWxpdHkucmVqZWN0KTtcblxuICAgIHJldHVybiBmYWtlV29ya2VyQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ0ROV3JhcHBlcih1cmwpIHtcbiAgICAvLyBXZSB3aWxsIHJlbHkgb24gYmxvYiBVUkwncyBwcm9wZXJ0eSB0byBzcGVjaWZ5IG9yaWdpbi5cbiAgICAvLyBXZSB3YW50IHRoaXMgZnVuY3Rpb24gdG8gZmFpbCBpbiBjYXNlIGlmIGNyZWF0ZU9iamVjdFVSTCBvciBCbG9iIGRvIG5vdFxuICAgIC8vIGV4aXN0IG9yIGZhaWwgZm9yIHNvbWUgcmVhc29uIC0tIG91ciBXb3JrZXIgY3JlYXRpb24gd2lsbCBmYWlsIGFueXdheS5cbiAgICBjb25zdCB3cmFwcGVyID0gXCJpbXBvcnRTY3JpcHRzKCdcIiArIHVybCArIFwiJyk7XCI7XG4gICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3dyYXBwZXJdKSk7XG4gIH1cblxuICAvKipcbiAgICogUERGLmpzIHdlYiB3b3JrZXIgYWJzdHJhY3Rpb24gdGhhdCBjb250cm9scyB0aGUgaW5zdGFudGlhdGlvbiBvZiBQREZcbiAgICogZG9jdW1lbnRzLiBNZXNzYWdlIGhhbmRsZXJzIGFyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWFpblxuICAgKiB0aHJlYWQgdG8gdGhlIHdvcmtlciB0aHJlYWQgYW5kIHZpY2UgdmVyc2EuIElmIHRoZSBjcmVhdGlvbiBvZiBhIHdlYlxuICAgKiB3b3JrZXIgaXMgbm90IHBvc3NpYmxlLCBhIFwiZmFrZVwiIHdvcmtlciB3aWxsIGJlIHVzZWQgaW5zdGVhZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgUERGV29ya2VyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1BERldvcmtlclBhcmFtZXRlcnN9IHBhcmFtcyAtIFdvcmtlciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgIG5hbWUgPSBudWxsLFxuICAgICAgcG9ydCA9IG51bGwsXG4gICAgICB2ZXJib3NpdHkgPSBnZXRWZXJib3NpdHlMZXZlbCgpLFxuICAgIH0gPSB7fSkge1xuICAgICAgaWYgKHBvcnQgJiYgcGRmV29ya2VyUG9ydHMuaGFzKHBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBQREZXb3JrZXIgcGVyIHBvcnRcIik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHRydWU7XG4gICAgICB0aGlzLnZlcmJvc2l0eSA9IHZlcmJvc2l0eTtcblxuICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuICAgICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDtcbiAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbnVsbDtcblxuICAgICAgaWYgKHBvcnQpIHtcbiAgICAgICAgcGRmV29ya2VyUG9ydHMuc2V0KHBvcnQsIHRoaXMpO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplRnJvbVBvcnQocG9ydCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2luaXRpYWxpemUoKTtcbiAgICB9XG5cbiAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9XG5cbiAgICBnZXQgcG9ydCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wb3J0O1xuICAgIH1cblxuICAgIGdldCBtZXNzYWdlSGFuZGxlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGFuZGxlcjtcbiAgICB9XG5cbiAgICBfaW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpIHtcbiAgICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xuICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoXCJtYWluXCIsIFwid29ya2VyXCIsIHBvcnQpO1xuICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIub24oXCJyZWFkeVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElnbm9yaW5nICdyZWFkeScgZXZlbnQgLS0gTWVzc2FnZUhhbmRsZXIgc2hhbGwgYmUgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgICAvLyBhbmQgcmVhZHkgdG8gYWNjZXB0IHRoZSBtZXNzYWdlcy5cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBfaW5pdGlhbGl6ZSgpIHtcbiAgICAgIC8vIElmIHdvcmtlciBzdXBwb3J0IGlzbid0IGRpc2FibGVkIGV4cGxpY2l0IGFuZCB0aGUgYnJvd3NlciBoYXMgd29ya2VyXG4gICAgICAvLyBzdXBwb3J0LCBjcmVhdGUgYSBuZXcgd2ViIHdvcmtlciBhbmQgdGVzdCBpZiBpdC90aGUgYnJvd3NlciBmdWxmaWxsc1xuICAgICAgLy8gYWxsIHJlcXVpcmVtZW50cyB0byBydW4gcGFydHMgb2YgcGRmLmpzIGluIGEgd2ViIHdvcmtlci5cbiAgICAgIC8vIFJpZ2h0IG5vdywgdGhlIHJlcXVpcmVtZW50IGlzLCB0aGF0IGFuIFVpbnQ4QXJyYXkgaXMgc3RpbGwgYW5cbiAgICAgIC8vIFVpbnQ4QXJyYXkgYXMgaXQgYXJyaXZlcyBvbiB0aGUgd29ya2VyLiAoQ2hyb21lIGFkZGVkIHRoaXMgd2l0aCB2LjE1LilcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFdvcmtlciAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAhaXNXb3JrZXJEaXNhYmxlZCAmJlxuICAgICAgICAhZ2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKClcbiAgICAgICkge1xuICAgICAgICBsZXQgd29ya2VyU3JjID0gZ2V0V29ya2VyU3JjKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBXcmFwcyB3b3JrZXJTcmMgcGF0aCBpbnRvIGJsb2IgVVJMLCBpZiB0aGUgZm9ybWVyIGRvZXMgbm90IGJlbG9uZ1xuICAgICAgICAgIC8vIHRvIHRoZSBzYW1lIG9yaWdpbi5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpICYmXG4gICAgICAgICAgICAhaXNTYW1lT3JpZ2luKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCB3b3JrZXJTcmMpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB3b3JrZXJTcmMgPSBjcmVhdGVDRE5XcmFwcGVyKFxuICAgICAgICAgICAgICBuZXcgVVJMKHdvcmtlclNyYywgd2luZG93LmxvY2F0aW9uKS5ocmVmXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgRkYgY2FuJ3QgY3JlYXRlIGEgd29ya2VyIG9uIGxvY2FsaG9zdCwgc2VlOlxuICAgICAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzI4MFxuICAgICAgICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyU3JjKTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgd29ya2VyKTtcbiAgICAgICAgICBjb25zdCB0ZXJtaW5hdGVFYXJseSA9ICgpID0+IHtcbiAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG4gICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gZmFrZSB3b3JrZXIgaWYgdGhlIHRlcm1pbmF0aW9uIGlzIGNhdXNlZCBieSBhblxuICAgICAgICAgICAgICAvLyBlcnJvciAoZS5nLiBOZXR3b3JrRXJyb3IgLyBTZWN1cml0eUVycm9yKS5cbiAgICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IG9uV29ya2VyRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dlYldvcmtlcikge1xuICAgICAgICAgICAgICAvLyBXb3JrZXIgZmFpbGVkIHRvIGluaXRpYWxpemUgZHVlIHRvIGFuIGVycm9yLiBDbGVhbiB1cCBhbmQgZmFsbFxuICAgICAgICAgICAgICAvLyBiYWNrIHRvIHRoZSBmYWtlIHdvcmtlci5cbiAgICAgICAgICAgICAgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG5cbiAgICAgICAgICBtZXNzYWdlSGFuZGxlci5vbihcInRlc3RcIiwgZGF0YSA9PiB7XG4gICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgICAgIHJldHVybjsgLy8gd29ya2VyIHdhcyBkZXN0cm95ZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgIC8vIHN1cHBvcnRUeXBlZEFycmF5XG4gICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG4gICAgICAgICAgICAgIHRoaXMuX3BvcnQgPSB3b3JrZXI7XG4gICAgICAgICAgICAgIHRoaXMuX3dlYldvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgICAgICAgaWYgKCFkYXRhLnN1cHBvcnRUcmFuc2ZlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgLy8gU2VuZCBnbG9iYWwgc2V0dGluZywgZS5nLiB2ZXJib3NpdHkgbGV2ZWwuXG4gICAgICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoXCJjb25maWd1cmVcIiwge1xuICAgICAgICAgICAgICAgIHZlcmJvc2l0eTogdGhpcy52ZXJib3NpdHksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWVzc2FnZUhhbmRsZXIub24oXCJyZWFkeVwiLCBkYXRhID0+IHtcbiAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgICAgICAgcmV0dXJuOyAvLyB3b3JrZXIgd2FzIGRlc3Ryb3llZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc2VuZFRlc3QoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgbmVlZCBmYWxsYmFjayB0byBhIGZha2VkIHdvcmtlci5cbiAgICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBzZW5kVGVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RPYmogPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPyAyNTUgOiAwLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIE9wZXJhIHRocm93IGEgREFUQV9DTE9ORV9FUlIgb24gc2VyaWFsaXppbmcgdGhlXG4gICAgICAgICAgICAvLyB0eXBlZCBhcnJheS4gQWxzbywgY2hlY2tpbmcgaWYgd2UgY2FuIHVzZSB0cmFuc2ZlcnMuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwidGVzdFwiLCB0ZXN0T2JqLCBbdGVzdE9iai5idWZmZXJdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgIHdhcm4oXCJDYW5ub3QgdXNlIHBvc3RNZXNzYWdlIHRyYW5zZmVycy5cIik7XG4gICAgICAgICAgICAgIHRlc3RPYmpbMF0gPSAwO1xuICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwidGVzdFwiLCB0ZXN0T2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gSXQgbWlnaHQgdGFrZSB0aW1lIGZvciB3b3JrZXIgdG8gaW5pdGlhbGl6ZSAoZXNwZWNpYWxseSB3aGVuIEFNRFxuICAgICAgICAgIC8vIGxvYWRlciBpcyB1c2VkKS4gV2Ugd2lsbCB0cnkgdG8gc2VuZCB0ZXN0IGltbWVkaWF0ZWx5LCBhbmQgdGhlblxuICAgICAgICAgIC8vIHdoZW4gJ3JlYWR5JyBtZXNzYWdlIHdpbGwgYXJyaXZlLiBUaGUgd29ya2VyIHNoYWxsIHByb2Nlc3Mgb25seVxuICAgICAgICAgIC8vIGZpcnN0IHJlY2VpdmVkICd0ZXN0Jy5cbiAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGluZm8oXCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRWl0aGVyIHdvcmtlcnMgYXJlIGRpc2FibGVkLCBub3Qgc3VwcG9ydGVkIG9yIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi5cbiAgICAgIC8vIFRodXMsIHdlIGZhbGxiYWNrIHRvIGEgZmFrZWQgd29ya2VyLlxuICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgfVxuXG4gICAgX3NldHVwRmFrZVdvcmtlcigpIHtcbiAgICAgIGlmICghaXNXb3JrZXJEaXNhYmxlZCkge1xuICAgICAgICB3YXJuKFwiU2V0dGluZyB1cCBmYWtlIHdvcmtlci5cIik7XG4gICAgICAgIGlzV29ya2VyRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZXR1cEZha2VXb3JrZXJHbG9iYWwoKVxuICAgICAgICAudGhlbihXb3JrZXJNZXNzYWdlSGFuZGxlciA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcG9ydCA9IG5ldyBMb29wYmFja1BvcnQoKTtcbiAgICAgICAgICB0aGlzLl9wb3J0ID0gcG9ydDtcblxuICAgICAgICAgIC8vIEFsbCBmYWtlIHdvcmtlcnMgdXNlIHRoZSBzYW1lIHBvcnQsIG1ha2luZyBpZCB1bmlxdWUuXG4gICAgICAgICAgY29uc3QgaWQgPSBcImZha2VcIiArIG5leHRGYWtlV29ya2VySWQrKztcblxuICAgICAgICAgIC8vIElmIHRoZSBtYWluIHRocmVhZCBpcyBvdXIgd29ya2VyLCBzZXR1cCB0aGUgaGFuZGxpbmcgZm9yIHRoZVxuICAgICAgICAgIC8vIG1lc3NhZ2VzIC0tIHRoZSBtYWluIHRocmVhZCBzZW5kcyB0byBpdCBzZWxmLlxuICAgICAgICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoaWQgKyBcIl93b3JrZXJcIiwgaWQsIHBvcnQpO1xuICAgICAgICAgIFdvcmtlck1lc3NhZ2VIYW5kbGVyLnNldHVwKHdvcmtlckhhbmRsZXIsIHBvcnQpO1xuXG4gICAgICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoaWQsIGlkICsgXCJfd29ya2VyXCIsIHBvcnQpO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAvLyBTZW5kIGdsb2JhbCBzZXR0aW5nLCBlLmcuIHZlcmJvc2l0eSBsZXZlbC5cbiAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwiY29uZmlndXJlXCIsIHtcbiAgICAgICAgICAgIHZlcmJvc2l0eTogdGhpcy52ZXJib3NpdHksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoYFNldHRpbmcgdXAgZmFrZSB3b3JrZXIgZmFpbGVkOiBcIiR7cmVhc29uLm1lc3NhZ2V9XCIuYClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgd29ya2VyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5fd2ViV29ya2VyKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdGVybWluYXRlIG9ubHkgd2ViIHdvcmtlciBjcmVhdGVkIHJlc291cmNlLlxuICAgICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgIHRoaXMuX3dlYldvcmtlciA9IG51bGw7XG4gICAgICB9XG4gICAgICBwZGZXb3JrZXJQb3J0cy5kZWxldGUodGhpcy5fcG9ydCk7XG4gICAgICB0aGlzLl9wb3J0ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLl9tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1BERldvcmtlclBhcmFtZXRlcnN9IHBhcmFtcyAtIFRoZSB3b3JrZXIgaW5pdGlhbGl6YXRpb25cbiAgICAgKiAgIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21Qb3J0KHBhcmFtcykge1xuICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy5wb3J0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS5cIik7XG4gICAgICB9XG4gICAgICBpZiAocGRmV29ya2VyUG9ydHMuaGFzKHBhcmFtcy5wb3J0KSkge1xuICAgICAgICByZXR1cm4gcGRmV29ya2VyUG9ydHMuZ2V0KHBhcmFtcy5wb3J0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUERGV29ya2VyKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFdvcmtlclNyYygpIHtcbiAgICAgIHJldHVybiBnZXRXb3JrZXJTcmMoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFBERldvcmtlcjtcbn0pKCk7XG5cbi8qKlxuICogRm9yIGludGVybmFsIHVzZSBvbmx5LlxuICogQGlnbm9yZVxuICovXG5jbGFzcyBXb3JrZXJUcmFuc3BvcnQge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlSGFuZGxlciwgbG9hZGluZ1Rhc2ssIG5ldHdvcmtTdHJlYW0sIHBhcmFtcykge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjtcbiAgICB0aGlzLmxvYWRpbmdUYXNrID0gbG9hZGluZ1Rhc2s7XG4gICAgdGhpcy5jb21tb25PYmpzID0gbmV3IFBERk9iamVjdHMoKTtcbiAgICB0aGlzLmZvbnRMb2FkZXIgPSBuZXcgRm9udExvYWRlcih7XG4gICAgICBkb2NJZDogbG9hZGluZ1Rhc2suZG9jSWQsXG4gICAgICBvblVuc3VwcG9ydGVkRmVhdHVyZTogdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUuYmluZCh0aGlzKSxcbiAgICAgIG93bmVyRG9jdW1lbnQ6IHBhcmFtcy5vd25lckRvY3VtZW50LFxuICAgIH0pO1xuICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLkNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IHBhcmFtcy5DTWFwUmVhZGVyRmFjdG9yeSh7XG4gICAgICBiYXNlVXJsOiBwYXJhbXMuY01hcFVybCxcbiAgICAgIGlzQ29tcHJlc3NlZDogcGFyYW1zLmNNYXBQYWNrZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBudWxsO1xuICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSA9IG51bGw7XG5cbiAgICB0aGlzLl9uZXR3b3JrU3RyZWFtID0gbmV0d29ya1N0cmVhbTtcbiAgICB0aGlzLl9mdWxsUmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBudWxsO1xuXG4gICAgdGhpcy5wYWdlQ2FjaGUgPSBbXTtcbiAgICB0aGlzLnBhZ2VQcm9taXNlcyA9IFtdO1xuICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG5cbiAgICB0aGlzLnNldHVwTWVzc2FnZUhhbmRsZXIoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveUNhcGFiaWxpdHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfVxuXG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuXG4gICAgaWYgKHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSkge1xuICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChcbiAgICAgICAgbmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWQgZHVyaW5nIG9uUGFzc3dvcmQgY2FsbGJhY2tcIilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FpdE9uID0gW107XG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciBhbGwgcmVuZGVyaW5ncyB0byBiZSBjb21wbGV0ZWQsIGUuZy5cbiAgICAvLyB0aW1lb3V0L3JBRiBjYW4gdGFrZSBhIGxvbmcgdGltZS5cbiAgICB0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICBpZiAocGFnZSkge1xuICAgICAgICB3YWl0T24ucHVzaChwYWdlLl9kZXN0cm95KCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGFnZUNhY2hlLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wYWdlUHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHdvcmtlciB0byBmaW5pc2ggaXRzIGxvbmcgcnVubmluZyB0YXNrcy5cbiAgICBjb25zdCB0ZXJtaW5hdGVkID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJUZXJtaW5hdGVcIiwgbnVsbCk7XG4gICAgd2FpdE9uLnB1c2godGVybWluYXRlZCk7XG4gICAgUHJvbWlzZS5hbGwod2FpdE9uKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgICAgaWYgKHRoaXMuX25ldHdvcmtTdHJlYW0pIHtcbiAgICAgICAgdGhpcy5fbmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhcbiAgICAgICAgICBuZXcgQWJvcnRFeGNlcHRpb24oXCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuXCIpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0sIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVqZWN0KTtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgc2V0dXBNZXNzYWdlSGFuZGxlcigpIHtcbiAgICBjb25zdCB7IG1lc3NhZ2VIYW5kbGVyLCBsb2FkaW5nVGFzayB9ID0gdGhpcztcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0UmVhZGVyXCIsIChkYXRhLCBzaW5rKSA9PiB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0sXG4gICAgICAgIFwiR2V0UmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIlxuICAgICAgKTtcbiAgICAgIHRoaXMuX2Z1bGxSZWFkZXIgPSB0aGlzLl9uZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIoKTtcbiAgICAgIHRoaXMuX2Z1bGxSZWFkZXIub25Qcm9ncmVzcyA9IGV2dCA9PiB7XG4gICAgICAgIHRoaXMuX2xhc3RQcm9ncmVzcyA9IHtcbiAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICAgICAgdG90YWw6IGV2dC50b3RhbCxcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICBzaW5rLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZnVsbFJlYWRlclxuICAgICAgICAgIC5yZWFkKClcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoeyB2YWx1ZSwgZG9uZSB9KSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgaXNBcnJheUJ1ZmZlcih2YWx1ZSksXG4gICAgICAgICAgICAgIFwiR2V0UmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBFbnF1ZXVlIGRhdGEgY2h1bmsgaW50byBzaW5rLCBhbmQgdHJhbnNmZXIgaXRcbiAgICAgICAgICAgIC8vIHRvIG90aGVyIHNpZGUgYXMgYFRyYW5zZmVyYWJsZWAgb2JqZWN0LlxuICAgICAgICAgICAgc2luay5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSwgMSwgW3ZhbHVlXSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHNpbmsub25DYW5jZWwgPSByZWFzb24gPT4ge1xuICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLmNhbmNlbChyZWFzb24pO1xuXG4gICAgICAgIHNpbmsucmVhZHkuY2F0Y2gocmVhZHlSZWFzb24gPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiUmVhZGVySGVhZGVyc1JlYWR5XCIsIGRhdGEgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyc0NhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgY29uc3QgZnVsbFJlYWRlciA9IHRoaXMuX2Z1bGxSZWFkZXI7XG4gICAgICBmdWxsUmVhZGVyLmhlYWRlcnNSZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gSWYgc3RyZWFtIG9yIHJhbmdlIGFyZSBkaXNhYmxlZCwgaXQncyBvdXIgb25seSB3YXkgdG8gcmVwb3J0XG4gICAgICAgIC8vIGxvYWRpbmcgcHJvZ3Jlc3MuXG4gICAgICAgIGlmICghZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCB8fCAhZnVsbFJlYWRlci5pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xhc3RQcm9ncmVzcyAmJiBsb2FkaW5nVGFzay5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHRoaXMuX2xhc3RQcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZ1bGxSZWFkZXIub25Qcm9ncmVzcyA9IGV2dCA9PiB7XG4gICAgICAgICAgICBpZiAobG9hZGluZ1Rhc2sub25Qcm9ncmVzcykge1xuICAgICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHtcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IGV2dC50b3RhbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgIGlzU3RyZWFtaW5nU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkLFxuICAgICAgICAgIGlzUmFuZ2VTdXBwb3J0ZWQ6IGZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZCxcbiAgICAgICAgICBjb250ZW50TGVuZ3RoOiBmdWxsUmVhZGVyLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfSwgaGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTtcblxuICAgICAgcmV0dXJuIGhlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfSk7XG5cbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkdldFJhbmdlUmVhZGVyXCIsIChkYXRhLCBzaW5rKSA9PiB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0sXG4gICAgICAgIFwiR2V0UmFuZ2VSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLlwiXG4gICAgICApO1xuICAgICAgY29uc3QgcmFuZ2VSZWFkZXIgPSB0aGlzLl9uZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKFxuICAgICAgICBkYXRhLmJlZ2luLFxuICAgICAgICBkYXRhLmVuZFxuICAgICAgKTtcblxuICAgICAgLy8gV2hlbiBzdHJlYW1pbmcgaXMgZW5hYmxlZCwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBkYXRhIHJlcXVlc3RlZCBoZXJlXG4gICAgICAvLyBoYXMgYWxyZWFkeSBiZWVuIGZldGNoZWQgdmlhIHRoZSBgX2Z1bGxSZXF1ZXN0UmVhZGVyYCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIC8vIEhvd2V2ZXIsIGdpdmVuIHRoYXQgdGhlIFBERiBkYXRhIGlzIGxvYWRlZCBhc3luY2hyb25vdXNseSBvbiB0aGVcbiAgICAgIC8vIG1haW4tdGhyZWFkIGFuZCB0aGVuIHNlbnQgdmlhIGBwb3N0TWVzc2FnZWAgdG8gdGhlIHdvcmtlci10aHJlYWQsXG4gICAgICAvLyBpdCBtYXkgbm90IGhhdmUgYmVlbiBhdmFpbGFibGUgZHVyaW5nIHBhcnNpbmcgKGhlbmNlIHRoZSBhdHRlbXB0IHRvXG4gICAgICAvLyB1c2UgcmFuZ2UgcmVxdWVzdHMgaGVyZSkuXG4gICAgICAvL1xuICAgICAgLy8gVG8gYXZvaWQgd2FzdGluZyB0aW1lIGFuZCByZXNvdXJjZXMgaGVyZSwgd2UnbGwgdGh1cyAqbm90KiBkaXNwYXRjaFxuICAgICAgLy8gcmFuZ2UgcmVxdWVzdHMgaWYgdGhlIGRhdGEgd2FzIGFscmVhZHkgbG9hZGVkIGJ1dCBoYXMgbm90IGJlZW4gc2VudCB0b1xuICAgICAgLy8gdGhlIHdvcmtlci10aHJlYWQgeWV0ICh3aGljaCB3aWxsIGhhcHBlbiB2aWEgdGhlIGBfZnVsbFJlcXVlc3RSZWFkZXJgKS5cbiAgICAgIGlmICghcmFuZ2VSZWFkZXIpIHtcbiAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNpbmsub25QdWxsID0gKCkgPT4ge1xuICAgICAgICByYW5nZVJlYWRlclxuICAgICAgICAgIC5yZWFkKClcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoeyB2YWx1ZSwgZG9uZSB9KSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgaXNBcnJheUJ1ZmZlcih2YWx1ZSksXG4gICAgICAgICAgICAgIFwiR2V0UmFuZ2VSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBzaW5rLm9uQ2FuY2VsID0gcmVhc29uID0+IHtcbiAgICAgICAgcmFuZ2VSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG5cbiAgICAgICAgc2luay5yZWFkeS5jYXRjaChyZWFkeVJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIElnbm9yZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBpZiB0aGUgd29ya2VyIHdhcyB0ZXJtaW5hdGVkLlxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyByZWFkeVJlYXNvbjtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXREb2NcIiwgKHsgcGRmSW5mbyB9KSA9PiB7XG4gICAgICB0aGlzLl9udW1QYWdlcyA9IHBkZkluZm8ubnVtUGFnZXM7XG4gICAgICBsb2FkaW5nVGFzay5fY2FwYWJpbGl0eS5yZXNvbHZlKG5ldyBQREZEb2N1bWVudFByb3h5KHBkZkluZm8sIHRoaXMpKTtcbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRG9jRXhjZXB0aW9uXCIsIGZ1bmN0aW9uIChleCkge1xuICAgICAgbGV0IHJlYXNvbjtcbiAgICAgIHN3aXRjaCAoZXgubmFtZSkge1xuICAgICAgICBjYXNlIFwiUGFzc3dvcmRFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgUGFzc3dvcmRFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguY29kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IEludmFsaWRQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnN0YXR1cyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmRldGFpbHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IFwiRG9jRXhjZXB0aW9uIC0gZXhwZWN0ZWQgYSB2YWxpZCBFcnJvci5cIjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIHVucmVhY2hhYmxlKG1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2FkaW5nVGFzay5fY2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiUGFzc3dvcmRSZXF1ZXN0XCIsIGV4Y2VwdGlvbiA9PiB7XG4gICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuXG4gICAgICBpZiAobG9hZGluZ1Rhc2sub25QYXNzd29yZCkge1xuICAgICAgICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IHBhc3N3b3JkID0+IHtcbiAgICAgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2FkaW5nVGFzay5vblBhc3N3b3JkKHVwZGF0ZVBhc3N3b3JkLCBleGNlcHRpb24uY29kZSk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChleCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QoXG4gICAgICAgICAgbmV3IFBhc3N3b3JkRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlLCBleGNlcHRpb24uY29kZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRGF0YUxvYWRlZFwiLCBkYXRhID0+IHtcbiAgICAgIC8vIEZvciBjb25zaXN0ZW5jeTogRW5zdXJlIHRoYXQgcHJvZ3Jlc3MgaXMgYWx3YXlzIHJlcG9ydGVkIHdoZW4gdGhlXG4gICAgICAvLyBlbnRpcmUgUERGIGZpbGUgaGFzIGJlZW4gbG9hZGVkLCByZWdhcmRsZXNzIG9mIGhvdyBpdCB3YXMgZmV0Y2hlZC5cbiAgICAgIGlmIChsb2FkaW5nVGFzay5vblByb2dyZXNzKSB7XG4gICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3Moe1xuICAgICAgICAgIGxvYWRlZDogZGF0YS5sZW5ndGgsXG4gICAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEpO1xuICAgIH0pO1xuXG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJTdGFydFJlbmRlclBhZ2VcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFnZSA9IHRoaXMucGFnZUNhY2hlW2RhdGEucGFnZUluZGV4XTtcbiAgICAgIHBhZ2UuX3N0YXJ0UmVuZGVyUGFnZShkYXRhLnRyYW5zcGFyZW5jeSwgZGF0YS5pbnRlbnQpO1xuICAgIH0pO1xuXG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJjb21tb25vYmpcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICAgIH1cblxuICAgICAgY29uc3QgW2lkLCB0eXBlLCBleHBvcnRlZERhdGFdID0gZGF0YTtcbiAgICAgIGlmICh0aGlzLmNvbW1vbk9ianMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiRm9udFwiOlxuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcmFtcztcblxuICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gZXhwb3J0ZWREYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBleHBvcnRlZEVycm9yID0gZXhwb3J0ZWREYXRhLmVycm9yO1xuICAgICAgICAgICAgd2FybihgRXJyb3IgZHVyaW5nIGZvbnQgbG9hZGluZzogJHtleHBvcnRlZEVycm9yfWApO1xuICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGV4cG9ydGVkRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGZvbnRSZWdpc3RyeSA9IG51bGw7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1zLnBkZkJ1ZyAmJlxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yICYmXG4gICAgICAgICAgICBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IuZW5hYmxlZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZm9udFJlZ2lzdHJ5ID0ge1xuICAgICAgICAgICAgICByZWdpc3RlckZvbnQoZm9udCwgdXJsKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmZvbnRBZGRlZChmb250LCB1cmwpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZm9udCA9IG5ldyBGb250RmFjZU9iamVjdChleHBvcnRlZERhdGEsIHtcbiAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogcGFyYW1zLmlzRXZhbFN1cHBvcnRlZCxcbiAgICAgICAgICAgIGRpc2FibGVGb250RmFjZTogcGFyYW1zLmRpc2FibGVGb250RmFjZSxcbiAgICAgICAgICAgIGlnbm9yZUVycm9yczogcGFyYW1zLmlnbm9yZUVycm9ycyxcbiAgICAgICAgICAgIG9uVW5zdXBwb3J0ZWRGZWF0dXJlOiB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZm9udFJlZ2lzdHJ5LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5mb250TG9hZGVyXG4gICAgICAgICAgICAuYmluZChmb250KVxuICAgICAgICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJGb250RmFsbGJhY2tcIiwgeyBpZCB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghcGFyYW1zLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgYGZvbnQuZGF0YWAgcHJvcGVydHkgb25jZSB0aGUgZm9udFxuICAgICAgICAgICAgICAgIC8vIGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBET00sIHNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCxcbiAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBhIGBQREZEb2N1bWVudFByb3h5LmNsZWFudXBgIGNhbGwuXG4gICAgICAgICAgICAgICAgLy8gU2luY2UgYGZvbnQuZGF0YWAgY291bGQgYmUgdmVyeSBsYXJnZSwgZS5nLiBpbiBzb21lIGNhc2VzXG4gICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgbWVnYWJ5dGVzLCB0aGlzIHdpbGwgaGVscCByZWR1Y2UgbWVtb3J5IHVzYWdlLlxuICAgICAgICAgICAgICAgIGZvbnQuZGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGZvbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGb250UGF0aFwiOlxuICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWREYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIGNvbW1vbiBvYmplY3QgdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIm9ialwiLCBkYXRhID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgW2lkLCBwYWdlSW5kZXgsIHR5cGUsIGltYWdlRGF0YV0gPSBkYXRhO1xuICAgICAgY29uc3QgcGFnZVByb3h5ID0gdGhpcy5wYWdlQ2FjaGVbcGFnZUluZGV4XTtcbiAgICAgIGlmIChwYWdlUHJveHkub2Jqcy5oYXMoaWQpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgICBwYWdlUHJveHkub2Jqcy5yZXNvbHZlKGlkLCBpbWFnZURhdGEpO1xuXG4gICAgICAgICAgLy8gSGV1cmlzdGljIHRoYXQgd2lsbCBhbGxvdyB1cyBub3QgdG8gc3RvcmUgbGFyZ2UgZGF0YS5cbiAgICAgICAgICBjb25zdCBNQVhfSU1BR0VfU0laRV9UT19TVE9SRSA9IDgwMDAwMDA7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaW1hZ2VEYXRhICYmXG4gICAgICAgICAgICBcImRhdGFcIiBpbiBpbWFnZURhdGEgJiZcbiAgICAgICAgICAgIGltYWdlRGF0YS5kYXRhLmxlbmd0aCA+IE1BWF9JTUFHRV9TSVpFX1RPX1NUT1JFXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwYWdlUHJveHkuY2xlYW51cEFmdGVyUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHb3QgdW5rbm93biBvYmplY3QgdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJEb2NQcm9ncmVzc1wiLCBkYXRhID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm47IC8vIElnbm9yZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBpZiB0aGUgd29ya2VyIHdhcyB0ZXJtaW5hdGVkLlxuICAgICAgfVxuXG4gICAgICBpZiAobG9hZGluZ1Rhc2sub25Qcm9ncmVzcykge1xuICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHtcbiAgICAgICAgICBsb2FkZWQ6IGRhdGEubG9hZGVkLFxuICAgICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFxuICAgICAgXCJVbnN1cHBvcnRlZEZlYXR1cmVcIixcbiAgICAgIHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlLmJpbmQodGhpcylcbiAgICApO1xuXG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJGZXRjaEJ1aWx0SW5DTWFwXCIsIChkYXRhLCBzaW5rKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgc2luay5lcnJvcihuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBmZXRjaGVkID0gZmFsc2U7XG5cbiAgICAgIHNpbmsub25QdWxsID0gKCkgPT4ge1xuICAgICAgICBpZiAoZmV0Y2hlZCkge1xuICAgICAgICAgIHNpbmsuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmV0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5DTWFwUmVhZGVyRmFjdG9yeS5mZXRjaChkYXRhKVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChidWlsdEluQ01hcCkge1xuICAgICAgICAgICAgc2luay5lbnF1ZXVlKGJ1aWx0SW5DTWFwLCAxLCBbYnVpbHRJbkNNYXAuY01hcERhdGEuYnVmZmVyXSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgc2luay5lcnJvcihyZWFzb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIF9vblVuc3VwcG9ydGVkRmVhdHVyZSh7IGZlYXR1cmVJZCB9KSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47IC8vIElnbm9yZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBpZiB0aGUgd29ya2VyIHdhcyB0ZXJtaW5hdGVkLlxuICAgIH1cbiAgICBpZiAodGhpcy5sb2FkaW5nVGFzay5vblVuc3VwcG9ydGVkRmVhdHVyZSkge1xuICAgICAgdGhpcy5sb2FkaW5nVGFzay5vblVuc3VwcG9ydGVkRmVhdHVyZShmZWF0dXJlSWQpO1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGF0YVwiLCBudWxsKTtcbiAgfVxuXG4gIGdldFBhZ2UocGFnZU51bWJlcikge1xuICAgIGlmIChcbiAgICAgICFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpIHx8XG4gICAgICBwYWdlTnVtYmVyIDw9IDAgfHxcbiAgICAgIHBhZ2VOdW1iZXIgPiB0aGlzLl9udW1QYWdlc1xuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgcGFnZSByZXF1ZXN0XCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMTtcbiAgICBpZiAocGFnZUluZGV4IGluIHRoaXMucGFnZVByb21pc2VzKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdlUHJvbWlzZXNbcGFnZUluZGV4XTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIC5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlXCIsIHtcbiAgICAgICAgcGFnZUluZGV4LFxuICAgICAgfSlcbiAgICAgIC50aGVuKHBhZ2VJbmZvID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IGRlc3Ryb3llZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlID0gbmV3IFBERlBhZ2VQcm94eShcbiAgICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgICAgcGFnZUluZm8sXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLl9wYXJhbXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgICB0aGlzLl9wYXJhbXMucGRmQnVnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGFnZUNhY2hlW3BhZ2VJbmRleF0gPSBwYWdlO1xuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICAgIH0pO1xuICAgIHRoaXMucGFnZVByb21pc2VzW3BhZ2VJbmRleF0gPSBwcm9taXNlO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgZ2V0UGFnZUluZGV4KHJlZikge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICAuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUluZGV4XCIsIHtcbiAgICAgICAgcmVmLFxuICAgICAgfSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IocmVhc29uKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldEFubm90YXRpb25zKHBhZ2VJbmRleCwgaW50ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QW5ub3RhdGlvbnNcIiwge1xuICAgICAgcGFnZUluZGV4LFxuICAgICAgaW50ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgc2F2ZURvY3VtZW50KGFubm90YXRpb25TdG9yYWdlKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIC5zZW5kV2l0aFByb21pc2UoXCJTYXZlRG9jdW1lbnRcIiwge1xuICAgICAgICBudW1QYWdlczogdGhpcy5fbnVtUGFnZXMsXG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlOlxuICAgICAgICAgIChhbm5vdGF0aW9uU3RvcmFnZSAmJiBhbm5vdGF0aW9uU3RvcmFnZS5nZXRBbGwoKSkgfHwgbnVsbCxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXIgPyB0aGlzLl9mdWxsUmVhZGVyLmZpbGVuYW1lIDogbnVsbCxcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uU3RvcmFnZSkge1xuICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlLnJlc2V0TW9kaWZpZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBnZXREZXN0aW5hdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGVzdGluYXRpb25zXCIsIG51bGwpO1xuICB9XG5cbiAgZ2V0RGVzdGluYXRpb24oaWQpIHtcbiAgICBpZiAodHlwZW9mIGlkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBkZXN0aW5hdGlvbiByZXF1ZXN0LlwiKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uXCIsIHtcbiAgICAgIGlkLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGFiZWxzXCIsIG51bGwpO1xuICB9XG5cbiAgZ2V0UGFnZUxheW91dCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGF5b3V0XCIsIG51bGwpO1xuICB9XG5cbiAgZ2V0UGFnZU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZU1vZGVcIiwgbnVsbCk7XG4gIH1cblxuICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRWaWV3ZXJQcmVmZXJlbmNlc1wiLCBudWxsKTtcbiAgfVxuXG4gIGdldE9wZW5BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3BlbkFjdGlvblwiLCBudWxsKTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldEF0dGFjaG1lbnRzXCIsIG51bGwpO1xuICB9XG5cbiAgZ2V0SmF2YVNjcmlwdCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRKYXZhU2NyaXB0XCIsIG51bGwpO1xuICB9XG5cbiAgZ2V0T3V0bGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRPdXRsaW5lXCIsIG51bGwpO1xuICB9XG5cbiAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICAuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnXCIsIG51bGwpXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcHRpb25hbENvbnRlbnRDb25maWcocmVzdWx0cyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBlcm1pc3Npb25zXCIsIG51bGwpO1xuICB9XG5cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIC5zZW5kV2l0aFByb21pc2UoXCJHZXRNZXRhZGF0YVwiLCBudWxsKVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5mbzogcmVzdWx0c1swXSxcbiAgICAgICAgICBtZXRhZGF0YTogcmVzdWx0c1sxXSA/IG5ldyBNZXRhZGF0YShyZXN1bHRzWzFdKSA6IG51bGwsXG4gICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXJcbiAgICAgICAgICAgID8gdGhpcy5fZnVsbFJlYWRlci5maWxlbmFtZVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRTdGF0cygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRTdGF0c1wiLCBudWxsKTtcbiAgfVxuXG4gIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJDbGVhbnVwXCIsIG51bGwpLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5wYWdlQ2FjaGUubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5wYWdlQ2FjaGVbaV07XG4gICAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgICAgY29uc3QgY2xlYW51cFN1Y2Nlc3NmdWwgPSBwYWdlLmNsZWFudXAoKTtcblxuICAgICAgICAgIGlmICghY2xlYW51cFN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYHN0YXJ0Q2xlYW51cDogUGFnZSAke2kgKyAxfSBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNvbW1vbk9ianMuY2xlYXIoKTtcbiAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5fcGFyYW1zO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJsb2FkaW5nUGFyYW1zXCIsIHtcbiAgICAgIGRpc2FibGVBdXRvRmV0Y2g6IHBhcmFtcy5kaXNhYmxlQXV0b0ZldGNoLFxuICAgICAgZGlzYWJsZUZvbnRGYWNlOiBwYXJhbXMuZGlzYWJsZUZvbnRGYWNlLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBQREYgZG9jdW1lbnQgYW5kIHBhZ2UgaXMgYnVpbHQgb2YgbWFueSBvYmplY3RzLiBFLmcuIHRoZXJlIGFyZSBvYmplY3RzIGZvclxuICogZm9udHMsIGltYWdlcywgcmVuZGVyaW5nIGNvZGUsIGV0Yy4gVGhlc2Ugb2JqZWN0cyBtYXkgZ2V0IHByb2Nlc3NlZCBpbnNpZGUgb2ZcbiAqIGEgd29ya2VyLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgc29tZSBiYXNpYyBtZXRob2RzIHRvIG1hbmFnZSB0aGVzZSBvYmplY3RzLlxuICogQGlnbm9yZVxuICovXG5jbGFzcyBQREZPYmplY3RzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fb2JqcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGVyZSBpcyBhbiBvYmplY3QgZGVmaW5lZCBmb3IgYG9iaklkYC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9lbnN1cmVPYmoob2JqSWQpIHtcbiAgICBpZiAodGhpcy5fb2Jqc1tvYmpJZF0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmpzW29iaklkXTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLl9vYmpzW29iaklkXSA9IHtcbiAgICAgIGNhcGFiaWxpdHk6IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCksXG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgcmVzb2x2ZWQ6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGNhbGxlZCAqd2l0aG91dCogY2FsbGJhY2ssIHRoaXMgcmV0dXJucyB0aGUgZGF0YSBvZiBgb2JqSWRgIGJ1dCB0aGVcbiAgICogb2JqZWN0IG5lZWRzIHRvIGJlIHJlc29sdmVkLiBJZiBpdCBpc24ndCwgdGhpcyBtZXRob2QgdGhyb3dzLlxuICAgKlxuICAgKiBJZiBjYWxsZWQgKndpdGgqIGEgY2FsbGJhY2ssIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB0aGUgZGF0YSBvZiB0aGVcbiAgICogb2JqZWN0IG9uY2UgdGhlIG9iamVjdCBpcyByZXNvbHZlZC4gVGhhdCBtZWFucywgaWYgeW91IGNhbGwgdGhpcyBtZXRob2RcbiAgICogYW5kIHRoZSBvYmplY3QgaXMgYWxyZWFkeSByZXNvbHZlZCwgdGhlIGNhbGxiYWNrIGdldHMgY2FsbGVkIHJpZ2h0IGF3YXkuXG4gICAqL1xuICBnZXQob2JqSWQsIGNhbGxiYWNrID0gbnVsbCkge1xuICAgIC8vIElmIHRoZXJlIGlzIGEgY2FsbGJhY2ssIHRoZW4gdGhlIGdldCBjYW4gYmUgYXN5bmMgYW5kIHRoZSBvYmplY3QgaXNcbiAgICAvLyBub3QgcmVxdWlyZWQgdG8gYmUgcmVzb2x2ZWQgcmlnaHQgbm93LlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fZW5zdXJlT2JqKG9iaklkKS5jYXBhYmlsaXR5LnByb21pc2UudGhlbihjYWxsYmFjayk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSBjYWxsYmFjaywgdGhlIHVzZXIgZXhwZWN0cyB0byBnZXQgdGhlIHJlc29sdmVkIGRhdGFcbiAgICAvLyBkaXJlY3RseS5cbiAgICBjb25zdCBvYmogPSB0aGlzLl9vYmpzW29iaklkXTtcbiAgICAvLyBJZiB0aGVyZSBpc24ndCBhbiBvYmplY3QgeWV0IG9yIHRoZSBvYmplY3QgaXNuJ3QgcmVzb2x2ZWQsIHRoZW4gdGhlXG4gICAgLy8gZGF0YSBpc24ndCByZWFkeSB5ZXQhXG4gICAgaWYgKCFvYmogfHwgIW9iai5yZXNvbHZlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0aW5nIG9iamVjdCB0aGF0IGlzbid0IHJlc29sdmVkIHlldCAke29iaklkfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iai5kYXRhO1xuICB9XG5cbiAgaGFzKG9iaklkKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5fb2Jqc1tvYmpJZF07XG4gICAgcmV0dXJuIG9iaiA/IG9iai5yZXNvbHZlZCA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBvYmplY3QgYG9iaklkYCB3aXRoIG9wdGlvbmFsIGBkYXRhYC5cbiAgICovXG4gIHJlc29sdmUob2JqSWQsIGRhdGEpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLl9lbnN1cmVPYmoob2JqSWQpO1xuXG4gICAgb2JqLnJlc29sdmVkID0gdHJ1ZTtcbiAgICBvYmouZGF0YSA9IGRhdGE7XG4gICAgb2JqLmNhcGFiaWxpdHkucmVzb2x2ZShkYXRhKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG59XG5cbi8qKlxuICogQWxsb3dzIGNvbnRyb2xsaW5nIG9mIHRoZSByZW5kZXJpbmcgdGFza3MuXG4gKi9cbmNsYXNzIFJlbmRlclRhc2sge1xuICBjb25zdHJ1Y3RvcihpbnRlcm5hbFJlbmRlclRhc2spIHtcbiAgICB0aGlzLl9pbnRlcm5hbFJlbmRlclRhc2sgPSBpbnRlcm5hbFJlbmRlclRhc2s7XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBmb3IgaW5jcmVtZW50YWwgcmVuZGVyaW5nIC0tIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZFxuICAgICAqIGVhY2ggdGltZSB0aGUgcmVuZGVyaW5nIGlzIHBhdXNlZC4gIFRvIGNvbnRpbnVlIHJlbmRlcmluZyBjYWxsIHRoZVxuICAgICAqIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAgICovXG4gICAgdGhpcy5vbkNvbnRpbnVlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9taXNlIGZvciByZW5kZXJpbmcgdGFzayBjb21wbGV0aW9uLlxuICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIHJlbmRlcmluZyB0YXNrLiBJZiB0aGUgdGFzayBpcyBjdXJyZW50bHkgcmVuZGVyaW5nIGl0IHdpbGxcbiAgICogbm90IGJlIGNhbmNlbGxlZCB1bnRpbCBncmFwaGljcyBwYXVzZXMgd2l0aCBhIHRpbWVvdXQuIFRoZSBwcm9taXNlIHRoYXRcbiAgICogdGhpcyBvYmplY3QgZXh0ZW5kcyB3aWxsIGJlIHJlamVjdGVkIHdoZW4gY2FuY2VsbGVkLlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuX2ludGVybmFsUmVuZGVyVGFzay5jYW5jZWwoKTtcbiAgfVxufVxuXG4vKipcbiAqIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgSW50ZXJuYWxSZW5kZXJUYXNrID0gKGZ1bmN0aW9uIEludGVybmFsUmVuZGVyVGFza0Nsb3N1cmUoKSB7XG4gIGNvbnN0IGNhbnZhc0luUmVuZGVyaW5nID0gbmV3IFdlYWtTZXQoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNsYXNzIEludGVybmFsUmVuZGVyVGFzayB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgY2FsbGJhY2ssXG4gICAgICBwYXJhbXMsXG4gICAgICBvYmpzLFxuICAgICAgY29tbW9uT2JqcyxcbiAgICAgIG9wZXJhdG9yTGlzdCxcbiAgICAgIHBhZ2VJbmRleCxcbiAgICAgIGNhbnZhc0ZhY3RvcnksXG4gICAgICB3ZWJHTENvbnRleHQsXG4gICAgICB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmYWxzZSxcbiAgICAgIHBkZkJ1ZyA9IGZhbHNlLFxuICAgIH0pIHtcbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgICAgdGhpcy5vYmpzID0gb2JqcztcbiAgICAgIHRoaXMuY29tbW9uT2JqcyA9IGNvbW1vbk9ianM7XG4gICAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IG51bGw7XG4gICAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IG9wZXJhdG9yTGlzdDtcbiAgICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG4gICAgICB0aGlzLndlYkdMQ29udGV4dCA9IHdlYkdMQ29udGV4dDtcbiAgICAgIHRoaXMuX3BkZkJ1ZyA9IHBkZkJ1ZztcblxuICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayA9IG51bGw7XG4gICAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgIHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gdHJ1ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICB0aGlzLnRhc2sgPSBuZXcgUmVuZGVyVGFzayh0aGlzKTtcbiAgICAgIC8vIGNhY2hpbmcgdGhpcy1ib3VuZCBtZXRob2RzXG4gICAgICB0aGlzLl9jb250aW51ZUJvdW5kID0gdGhpcy5fY29udGludWUuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kID0gdGhpcy5fc2NoZWR1bGVOZXh0LmJpbmQodGhpcyk7XG4gICAgICB0aGlzLl9uZXh0Qm91bmQgPSB0aGlzLl9uZXh0LmJpbmQodGhpcyk7XG4gICAgICB0aGlzLl9jYW52YXMgPSBwYXJhbXMuY2FudmFzQ29udGV4dC5jYW52YXM7XG4gICAgfVxuXG4gICAgZ2V0IGNvbXBsZXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhcGFiaWxpdHkucHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElnbm9yaW5nIGVycm9ycywgc2luY2Ugd2Ugb25seSB3YW50IHRvIGtub3cgd2hlbiByZW5kZXJpbmcgaXNcbiAgICAgICAgLy8gbm8gbG9uZ2VyIHBlbmRpbmcuXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplR3JhcGhpY3MoeyB0cmFuc3BhcmVuY3kgPSBmYWxzZSwgb3B0aW9uYWxDb250ZW50Q29uZmlnIH0pIHtcbiAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY2FudmFzKSB7XG4gICAgICAgIGlmIChjYW52YXNJblJlbmRlcmluZy5oYXModGhpcy5fY2FudmFzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuIFwiICtcbiAgICAgICAgICAgICAgXCJVc2UgZGlmZmVyZW50IGNhbnZhcyBvciBlbnN1cmUgcHJldmlvdXMgb3BlcmF0aW9ucyB3ZXJlIFwiICtcbiAgICAgICAgICAgICAgXCJjYW5jZWxsZWQgb3IgY29tcGxldGVkLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjYW52YXNJblJlbmRlcmluZy5hZGQodGhpcy5fY2FudmFzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9wZGZCdWcgJiZcbiAgICAgICAgZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlciAmJlxuICAgICAgICBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmVuYWJsZWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLnN0ZXBwZXIgPSBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmNyZWF0ZSh0aGlzLl9wYWdlSW5kZXgpO1xuICAgICAgICB0aGlzLnN0ZXBwZXIuaW5pdCh0aGlzLm9wZXJhdG9yTGlzdCk7XG4gICAgICAgIHRoaXMuc3RlcHBlci5uZXh0QnJlYWtQb2ludCA9IHRoaXMuc3RlcHBlci5nZXROZXh0QnJlYWtQb2ludCgpO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBjYW52YXNDb250ZXh0LFxuICAgICAgICB2aWV3cG9ydCxcbiAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICBpbWFnZUxheWVyLFxuICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgfSA9IHRoaXMucGFyYW1zO1xuXG4gICAgICB0aGlzLmdmeCA9IG5ldyBDYW52YXNHcmFwaGljcyhcbiAgICAgICAgY2FudmFzQ29udGV4dCxcbiAgICAgICAgdGhpcy5jb21tb25PYmpzLFxuICAgICAgICB0aGlzLm9ianMsXG4gICAgICAgIHRoaXMuY2FudmFzRmFjdG9yeSxcbiAgICAgICAgdGhpcy53ZWJHTENvbnRleHQsXG4gICAgICAgIGltYWdlTGF5ZXIsXG4gICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1xuICAgICAgKTtcbiAgICAgIHRoaXMuZ2Z4LmJlZ2luRHJhd2luZyh7XG4gICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgdmlld3BvcnQsXG4gICAgICAgIHRyYW5zcGFyZW5jeSxcbiAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSAwO1xuICAgICAgdGhpcy5ncmFwaGljc1JlYWR5ID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbmNlbChlcnJvciA9IG51bGwpIHtcbiAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuZ2Z4KSB7XG4gICAgICAgIHRoaXMuZ2Z4LmVuZERyYXdpbmcoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jYW52YXMpIHtcbiAgICAgICAgY2FudmFzSW5SZW5kZXJpbmcuZGVsZXRlKHRoaXMuX2NhbnZhcyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGxiYWNrKFxuICAgICAgICBlcnJvciB8fFxuICAgICAgICAgIG5ldyBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24oXG4gICAgICAgICAgICBgUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSAke3RoaXMuX3BhZ2VJbmRleCArIDF9YCxcbiAgICAgICAgICAgIFwiY2FudmFzXCJcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7XG4gICAgICBpZiAoIXRoaXMuZ3JhcGhpY3NSZWFkeSkge1xuICAgICAgICBpZiAoIXRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrKSB7XG4gICAgICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSB0aGlzLl9jb250aW51ZUJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RlcHBlcikge1xuICAgICAgICB0aGlzLnN0ZXBwZXIudXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9jb250aW51ZSgpO1xuICAgIH1cblxuICAgIF9jb250aW51ZSgpIHtcbiAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudGFzay5vbkNvbnRpbnVlKSB7XG4gICAgICAgIHRoaXMudGFzay5vbkNvbnRpbnVlKHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlTmV4dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9zY2hlZHVsZU5leHQoKSB7XG4gICAgICBpZiAodGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX25leHRCb3VuZCgpLmNhdGNoKHRoaXMuY2FuY2VsLmJpbmQodGhpcykpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5fbmV4dEJvdW5kKS5jYXRjaCh0aGlzLmNhbmNlbC5iaW5kKHRoaXMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfbmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IHRoaXMuZ2Z4LmV4ZWN1dGVPcGVyYXRvckxpc3QoXG4gICAgICAgIHRoaXMub3BlcmF0b3JMaXN0LFxuICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCxcbiAgICAgICAgdGhpcy5fY29udGludWVCb3VuZCxcbiAgICAgICAgdGhpcy5zdGVwcGVyXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0SWR4ID09PSB0aGlzLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgICAgdGhpcy5nZnguZW5kRHJhd2luZygpO1xuICAgICAgICAgIGlmICh0aGlzLl9jYW52YXMpIHtcbiAgICAgICAgICAgIGNhbnZhc0luUmVuZGVyaW5nLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIEludGVybmFsUmVuZGVyVGFzaztcbn0pKCk7XG5cbi8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuY29uc3QgdmVyc2lvbiA9XG4gIHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiA/IFBERkpTRGV2LmV2YWwoXCJCVU5ETEVfVkVSU0lPTlwiKSA6IG51bGw7XG4vKiogQHR5cGUge3N0cmluZ30gKi9cbmNvbnN0IGJ1aWxkID1cbiAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiID8gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9CVUlMRFwiKSA6IG51bGw7XG5cbmV4cG9ydCB7XG4gIGdldERvY3VtZW50LFxuICBMb29wYmFja1BvcnQsXG4gIFBERkRhdGFSYW5nZVRyYW5zcG9ydCxcbiAgUERGV29ya2VyLFxuICBQREZEb2N1bWVudFByb3h5LFxuICBQREZQYWdlUHJveHksXG4gIHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5LFxuICB2ZXJzaW9uLFxuICBidWlsZCxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBieXRlc1RvU3RyaW5nLFxuICBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQsXG4gIHNoYWRvdyxcbiAgc3RyaW5nMzIsXG4gIHVucmVhY2hhYmxlLFxuICBVTlNVUFBPUlRFRF9GRUFUVVJFUyxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbmNsYXNzIEJhc2VGb250TG9hZGVyIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGRvY0lkLFxuICAgIG9uVW5zdXBwb3J0ZWRGZWF0dXJlLFxuICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50LFxuICB9KSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VGb250TG9hZGVyKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGb250TG9hZGVyLlwiKTtcbiAgICB9XG4gICAgdGhpcy5kb2NJZCA9IGRvY0lkO1xuICAgIHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlID0gb25VbnN1cHBvcnRlZEZlYXR1cmU7XG4gICAgdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuXG4gICAgdGhpcy5uYXRpdmVGb250RmFjZXMgPSBbXTtcbiAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7XG4gIH1cblxuICBhZGROYXRpdmVGb250RmFjZShuYXRpdmVGb250RmFjZSkge1xuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLnB1c2gobmF0aXZlRm9udEZhY2UpO1xuICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmFkZChuYXRpdmVGb250RmFjZSk7XG4gIH1cblxuICBpbnNlcnRSdWxlKHJ1bGUpIHtcbiAgICBsZXQgc3R5bGVFbGVtZW50ID0gdGhpcy5zdHlsZUVsZW1lbnQ7XG4gICAgaWYgKCFzdHlsZUVsZW1lbnQpIHtcbiAgICAgIHN0eWxlRWxlbWVudCA9IHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgICAgc3R5bGVFbGVtZW50LmlkID0gYFBERkpTX0ZPTlRfU1RZTEVfVEFHXyR7dGhpcy5kb2NJZH1gO1xuICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF1cbiAgICAgICAgLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVTaGVldCA9IHN0eWxlRWxlbWVudC5zaGVldDtcbiAgICBzdHlsZVNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVTaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5uYXRpdmVGb250RmFjZXMuZm9yRWFjaChuYXRpdmVGb250RmFjZSA9PiB7XG4gICAgICB0aGlzLl9kb2N1bWVudC5mb250cy5kZWxldGUobmF0aXZlRm9udEZhY2UpO1xuICAgIH0pO1xuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmxlbmd0aCA9IDA7XG5cbiAgICBpZiAodGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgIC8vIE5vdGU6IENoaWxkTm9kZS5yZW1vdmUgZG9lc24ndCB0aHJvdyBpZiB0aGUgcGFyZW50Tm9kZSBpcyB1bmRlZmluZWQuXG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBiaW5kKGZvbnQpIHtcbiAgICAvLyBBZGQgdGhlIGZvbnQgdG8gdGhlIERPTSBvbmx5IG9uY2U7IHNraXAgaWYgdGhlIGZvbnQgaXMgYWxyZWFkeSBsb2FkZWQuXG4gICAgaWYgKGZvbnQuYXR0YWNoZWQgfHwgZm9udC5taXNzaW5nRmlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb250LmF0dGFjaGVkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnN0IG5hdGl2ZUZvbnRGYWNlID0gZm9udC5jcmVhdGVOYXRpdmVGb250RmFjZSgpO1xuICAgICAgaWYgKG5hdGl2ZUZvbnRGYWNlKSB7XG4gICAgICAgIHRoaXMuYWRkTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG5hdGl2ZUZvbnRGYWNlLmxvYWRlZDtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSh7XG4gICAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udExvYWROYXRpdmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2FybihgRmFpbGVkIHRvIGxvYWQgZm9udCAnJHtuYXRpdmVGb250RmFjZS5mYW1pbHl9JzogJyR7ZXh9Jy5gKTtcblxuICAgICAgICAgIC8vIFdoZW4gZm9udCBsb2FkaW5nIGZhaWxlZCwgZmFsbCBiYWNrIHRvIHRoZSBidWlsdC1pbiBmb250IHJlbmRlcmVyLlxuICAgICAgICAgIGZvbnQuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTtcbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuOyAvLyBUaGUgZm9udCB3YXMsIGFzeW5jaHJvbm91c2x5LCBsb2FkZWQuXG4gICAgfVxuXG4gICAgLy8gIXRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZFxuICAgIGNvbnN0IHJ1bGUgPSBmb250LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO1xuICAgIGlmIChydWxlKSB7XG4gICAgICB0aGlzLmluc2VydFJ1bGUocnVsZSk7XG5cbiAgICAgIGlmICh0aGlzLmlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKSB7XG4gICAgICAgIHJldHVybjsgLy8gVGhlIGZvbnQgd2FzLCBzeW5jaHJvbm91c2x5LCBsb2FkZWQuXG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHJlc29sdmUpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlRm9udExvYWRFdmVudChbcnVsZV0sIFtmb250XSwgcmVxdWVzdCk7XG4gICAgICB9KTtcbiAgICAgIC8vIFRoZSBmb250IHdhcywgYXN5bmNocm9ub3VzbHksIGxvYWRlZC5cbiAgICB9XG4gIH1cblxuICBfcXVldWVMb2FkaW5nQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrYC5cIik7XG4gIH1cblxuICBnZXQgaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCgpIHtcbiAgICBjb25zdCBzdXBwb3J0ZWQgPVxuICAgICAgdHlwZW9mIHRoaXMuX2RvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmICEhdGhpcy5fZG9jdW1lbnQuZm9udHM7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWRcIiwgc3VwcG9ydGVkKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnZXR0ZXItcmV0dXJuXG4gIGdldCBpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCgpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRgLlwiKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnZXR0ZXItcmV0dXJuXG4gIGdldCBfbG9hZFRlc3RGb250KCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfbG9hZFRlc3RGb250YC5cIik7XG4gIH1cblxuICBfcHJlcGFyZUZvbnRMb2FkRXZlbnQocnVsZXMsIGZvbnRzVG9Mb2FkLCByZXF1ZXN0KSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYF9wcmVwYXJlRm9udExvYWRFdmVudGAuXCIpO1xuICB9XG59XG5cbmxldCBGb250TG9hZGVyO1xuaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTFwiKSkge1xuICBGb250TG9hZGVyID0gY2xhc3MgTW96Y2VudHJhbEZvbnRMb2FkZXIgZXh0ZW5kcyBCYXNlRm9udExvYWRlciB7XG4gICAgZ2V0IGlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKCkge1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkXCIsIHRydWUpO1xuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIFBERkpTRGV2LnRlc3QoJ0NIUk9NRSB8fCBHRU5FUklDJylcblxuICBGb250TG9hZGVyID0gY2xhc3MgR2VuZXJpY0ZvbnRMb2FkZXIgZXh0ZW5kcyBCYXNlRm9udExvYWRlciB7XG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICBzdXBlcihwYXJhbXMpO1xuICAgICAgdGhpcy5sb2FkaW5nQ29udGV4dCA9IHtcbiAgICAgICAgcmVxdWVzdHM6IFtdLFxuICAgICAgICBuZXh0UmVxdWVzdElkOiAwLFxuICAgICAgfTtcbiAgICAgIHRoaXMubG9hZFRlc3RGb250SWQgPSAwO1xuICAgIH1cblxuICAgIGdldCBpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCgpIHtcbiAgICAgIGxldCBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJDSFJPTUVcIikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAvLyBOb2RlLmpzIC0gd2UgY2FuIHByZXRlbmQgdGhhdCBzeW5jIGZvbnQgbG9hZGluZyBpcyBzdXBwb3J0ZWQuXG4gICAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBVc2VyIGFnZW50IHN0cmluZyBzbmlmZmluZyBpcyBiYWQsIGJ1dCB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG9cbiAgICAgICAgICAvLyB0ZWxsIGlmIHRoZSBmb250IGlzIGZ1bGx5IGxvYWRlZCBhbmQgcmVhZHkgdG8gYmUgdXNlZCB3aXRoIGNhbnZhcy5cbiAgICAgICAgICBjb25zdCBtID0gL01vemlsbGFcXC81LjAuKj9ydjooXFxkKykuKj8gR2Vja28vLmV4ZWMoXG4gICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobSAmJiBtWzFdID49IDE0KSB7XG4gICAgICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUT0RPIC0gb3RoZXIgYnJvd3NlcnMuLi5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkXCIsIHN1cHBvcnRlZCk7XG4gICAgfVxuXG4gICAgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKSB7XG4gICAgICAgIGFzc2VydCghcmVxdWVzdC5kb25lLCBcImNvbXBsZXRlUmVxdWVzdCgpIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UuXCIpO1xuICAgICAgICByZXF1ZXN0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgIC8vIFNlbmRpbmcgYWxsIGNvbXBsZXRlZCByZXF1ZXN0cyBpbiBvcmRlciBvZiBob3cgdGhleSB3ZXJlIHF1ZXVlZC5cbiAgICAgICAgd2hpbGUgKGNvbnRleHQucmVxdWVzdHMubGVuZ3RoID4gMCAmJiBjb250ZXh0LnJlcXVlc3RzWzBdLmRvbmUpIHtcbiAgICAgICAgICBjb25zdCBvdGhlclJlcXVlc3QgPSBjb250ZXh0LnJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgICAgc2V0VGltZW91dChvdGhlclJlcXVlc3QuY2FsbGJhY2ssIDApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmxvYWRpbmdDb250ZXh0O1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgaWQ6IGBwZGZqcy1mb250LWxvYWRpbmctJHtjb250ZXh0Lm5leHRSZXF1ZXN0SWQrK31gLFxuICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlUmVxdWVzdCxcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICB9O1xuICAgICAgY29udGV4dC5yZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO1xuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxuXG4gICAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7XG4gICAgICBjb25zdCBnZXRMb2FkVGVzdEZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBDRkYgZm9udCB3aXRoIDEgZ2x5cGggZm9yICcuJyB0aGF0IGZpbGxzIGl0cyBlbnRpcmUgd2lkdGhcbiAgICAgICAgLy8gYW5kIGhlaWdodC5cbiAgICAgICAgcmV0dXJuIGF0b2IoXG4gICAgICAgICAgXCJUMVJVVHdBTEFJQUFBd0F3UTBaR0lESHRaZzRBQUFPWUFBQUFnVVpHVkUxbGt6WndBQUFFSEFBQUFCeEhSRVZHQUJRQVwiICtcbiAgICAgICAgICAgIFwiRlFBQUJEZ0FBQUFlVDFNdk1sWU5Zd2tBQUFFZ0FBQUFZR050WVhBQkRRTFVBQUFDTkFBQUFVSm9aV0ZrL3hWRkRRQUFcIiArXG4gICAgICAgICAgICBcIkFMd0FBQUEyYUdobFlRZGtBK29BQUFEMEFBQUFKR2h0ZEhnRDZBQUFBQUFFV0FBQUFBWnRZWGh3QUFKUUFBQUFBUmdBXCIgK1xuICAgICAgICAgICAgXCJBQUFHYm1GdFpWam1kSDRBQUFHQUFBQUFzWEJ2YzNUL2hnQXpBQUFEZUFBQUFDQUFBUUFBQUFFQUFMWlJGc1JmRHp6MVwiICtcbiAgICAgICAgICAgIFwiQUFzRDZBQUFBQURPQk9UTEFBQUFBTTRLSER3QUFBQUFBK2dESVFBQUFBZ0FBZ0FBQUFBQUFBQUJBQUFESVFBQUFGb0RcIiArXG4gICAgICAgICAgICBcIjZBQUFBQUFENkFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQVVBQUFBZ0FBQUFRRDZBSDBBQVVBQUFLS0Fyd0FBQUNNXCIgK1xuICAgICAgICAgICAgXCJBb29DdkFBQUFlQUFNUUVDQUFBQ0FBWUpBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUZCbVJXUUF3QUF1QUM0RFwiICtcbiAgICAgICAgICAgIFwiSVA4NEFGb0RJUUFBQUFBQUFRQUFBQUFBQUFBQUFDQUFJQUFCQUFBQURnQ3VBQUVBQUFBQUFBQUFBUUFBQUFFQUFBQUFcIiArXG4gICAgICAgICAgICBcIkFBRUFBUUFBQUFFQUFBQUFBQUlBQVFBQUFBRUFBQUFBQUFNQUFRQUFBQUVBQUFBQUFBUUFBUUFBQUFFQUFBQUFBQVVBXCIgK1xuICAgICAgICAgICAgXCJBUUFBQUFFQUFBQUFBQVlBQVFBQUFBTUFBUVFKQUFBQUFnQUJBQU1BQVFRSkFBRUFBZ0FCQUFNQUFRUUpBQUlBQWdBQlwiICtcbiAgICAgICAgICAgIFwiQUFNQUFRUUpBQU1BQWdBQkFBTUFBUVFKQUFRQUFnQUJBQU1BQVFRSkFBVUFBZ0FCQUFNQUFRUUpBQVlBQWdBQldBQllcIiArXG4gICAgICAgICAgICBcIkFBQUFBQUFBQXdBQUFBTUFBQUFjQUFFQUFBQUFBRHdBQXdBQkFBQUFIQUFFQUNBQUFBQUVBQVFBQVFBQUFDNy8vd0FBXCIgK1xuICAgICAgICAgICAgXCJBQzcvLy8vVEFBRUFBQUFBQUFBQkJnQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICtcbiAgICAgICAgICAgIFwiQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArXG4gICAgICAgICAgICBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgK1xuICAgICAgICAgICAgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICtcbiAgICAgICAgICAgIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArXG4gICAgICAgICAgICBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1BQUFBQUFBRC9nd0F5QUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBXCIgK1xuICAgICAgICAgICAgXCJBQUFCQUFRRUFBRUJBUUpZQUFFQkFTSDREd0Q0R3dIRUF2Z2NBL2dYQkl3TUFZdUwrbno1dFFYa0Q1ajNDQkxuRVFBQ1wiICtcbiAgICAgICAgICAgIFwiQVFFQklWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZQUFBQkFRQUFEd0FDQVFFRUUvdDNcIiArXG4gICAgICAgICAgICBcIkRvdjZmQUg2ZkFUK2ZQcDgrbndIRG9zTUN2bTFDdm0xREF6NmZCUUFBQUFBQUFBQkFBQUFBTW1KYnpFQUFBQUF6Z1RqXCIgK1xuICAgICAgICAgICAgXCJGUUFBQUFET0JPUXBBQUVBQUFBQUFBQUFEQUFVQUFRQUFBQUJBQUFBQWdBQkFBQUFBQUFBQUFBRDZBQUFBQUFBQUE9PVwiXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9sb2FkVGVzdEZvbnRcIiwgZ2V0TG9hZFRlc3RGb250KCkpO1xuICAgIH1cblxuICAgIF9wcmVwYXJlRm9udExvYWRFdmVudChydWxlcywgZm9udHMsIHJlcXVlc3QpIHtcbiAgICAgIC8qKiBIYWNrIGJlZ2luICovXG4gICAgICAvLyBUaGVyZSdzIGN1cnJlbnRseSBubyBldmVudCB3aGVuIGEgZm9udCBoYXMgZmluaXNoZWQgZG93bmxvYWRpbmcgc28gdGhlXG4gICAgICAvLyBmb2xsb3dpbmcgY29kZSBpcyBhIGRpcnR5IGhhY2sgdG8gJ2d1ZXNzJyB3aGVuIGEgZm9udCBpcyByZWFkeS5cbiAgICAgIC8vIEl0J3MgYXNzdW1lZCBmb250cyBhcmUgbG9hZGVkIGluIG9yZGVyLCBzbyBhZGQgYSBrbm93biB0ZXN0IGZvbnQgYWZ0ZXJcbiAgICAgIC8vIHRoZSBkZXNpcmVkIGZvbnRzIGFuZCB0aGVuIHRlc3QgZm9yIHRoZSBsb2FkaW5nIG9mIHRoYXQgdGVzdCBmb250LlxuXG4gICAgICBmdW5jdGlvbiBpbnQzMihkYXRhLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoZGF0YS5jaGFyQ29kZUF0KG9mZnNldCkgPDwgMjQpIHxcbiAgICAgICAgICAoZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2KSB8XG4gICAgICAgICAgKGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAyKSA8PCA4KSB8XG4gICAgICAgICAgKGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAzKSAmIDB4ZmYpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzcGxpY2VTdHJpbmcocywgb2Zmc2V0LCByZW1vdmUsIGluc2VydCkge1xuICAgICAgICBjb25zdCBjaHVuazEgPSBzLnN1YnN0cmluZygwLCBvZmZzZXQpO1xuICAgICAgICBjb25zdCBjaHVuazIgPSBzLnN1YnN0cmluZyhvZmZzZXQgKyByZW1vdmUpO1xuICAgICAgICByZXR1cm4gY2h1bmsxICsgaW5zZXJ0ICsgY2h1bmsyO1xuICAgICAgfVxuICAgICAgbGV0IGksIGlpO1xuXG4gICAgICAvLyBUaGUgdGVtcG9yYXJ5IGNhbnZhcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBmb250cyBhcmUgbG9hZGVkLlxuICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgICAgIGxldCBjYWxsZWQgPSAwO1xuICAgICAgZnVuY3Rpb24gaXNGb250UmVhZHkobmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGVkKys7XG4gICAgICAgIC8vIFdpdGggc2V0VGltZW91dCBjbGFtcGluZyB0aGlzIGdpdmVzIHRoZSBmb250IH4xMDBtcyB0byBsb2FkLlxuICAgICAgICBpZiAoY2FsbGVkID4gMzApIHtcbiAgICAgICAgICB3YXJuKFwiTG9hZCB0ZXN0IGZvbnQgbmV2ZXIgbG9hZGVkLlwiKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdHguZm9udCA9IFwiMzBweCBcIiArIG5hbWU7XG4gICAgICAgIGN0eC5maWxsVGV4dChcIi5cIiwgMCwgMjApO1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbM10gPiAwKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dChpc0ZvbnRSZWFkeS5iaW5kKG51bGwsIG5hbWUsIGNhbGxiYWNrKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvYWRUZXN0Rm9udElkID0gYGx0JHtEYXRlLm5vdygpfSR7dGhpcy5sb2FkVGVzdEZvbnRJZCsrfWA7XG4gICAgICAvLyBDaHJvbWl1bSBzZWVtcyB0byBjYWNoZSBmb250cyBiYXNlZCBvbiBhIGhhc2ggb2YgdGhlIGFjdHVhbCBmb250IGRhdGEsXG4gICAgICAvLyBzbyB0aGUgZm9udCBtdXN0IGJlIG1vZGlmaWVkIGZvciBlYWNoIGxvYWQgdGVzdCBlbHNlIGl0IHdpbGwgYXBwZWFyIHRvXG4gICAgICAvLyBiZSBsb2FkZWQgYWxyZWFkeS5cbiAgICAgIC8vIFRPRE86IFRoaXMgY291bGQgbWF5YmUgYmUgbWFkZSBmYXN0ZXIgYnkgYXZvaWRpbmcgdGhlIGJ0b2Egb2YgdGhlIGZ1bGxcbiAgICAgIC8vIGZvbnQgYnkgc3BsaXR0aW5nIGl0IGluIGNodW5rcyBiZWZvcmUgaGFuZCBhbmQgcGFkZGluZyB0aGUgZm9udCBpZC5cbiAgICAgIGxldCBkYXRhID0gdGhpcy5fbG9hZFRlc3RGb250O1xuICAgICAgY29uc3QgQ09NTUVOVF9PRkZTRVQgPSA5NzY7IC8vIGhhcyB0byBiZSBvbiA0IGJ5dGUgYm91bmRhcnkgKGZvciBjaGVja3N1bSlcbiAgICAgIGRhdGEgPSBzcGxpY2VTdHJpbmcoXG4gICAgICAgIGRhdGEsXG4gICAgICAgIENPTU1FTlRfT0ZGU0VULFxuICAgICAgICBsb2FkVGVzdEZvbnRJZC5sZW5ndGgsXG4gICAgICAgIGxvYWRUZXN0Rm9udElkXG4gICAgICApO1xuICAgICAgLy8gQ0ZGIGNoZWNrc3VtIGlzIGltcG9ydGFudCBmb3IgSUUsIGFkanVzdGluZyBpdFxuICAgICAgY29uc3QgQ0ZGX0NIRUNLU1VNX09GRlNFVCA9IDE2O1xuICAgICAgY29uc3QgWFhYWF9WQUxVRSA9IDB4NTg1ODU4NTg7IC8vIHRoZSBcImNvbW1lbnRcIiBmaWxsZWQgd2l0aCAnWCdcbiAgICAgIGxldCBjaGVja3N1bSA9IGludDMyKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQpO1xuICAgICAgZm9yIChpID0gMCwgaWkgPSBsb2FkVGVzdEZvbnRJZC5sZW5ndGggLSAzOyBpIDwgaWk7IGkgKz0gNCkge1xuICAgICAgICBjaGVja3N1bSA9IChjaGVja3N1bSAtIFhYWFhfVkFMVUUgKyBpbnQzMihsb2FkVGVzdEZvbnRJZCwgaSkpIHwgMDtcbiAgICAgIH1cbiAgICAgIGlmIChpIDwgbG9hZFRlc3RGb250SWQubGVuZ3RoKSB7XG4gICAgICAgIC8vIGFsaWduIHRvIDQgYnl0ZXMgYm91bmRhcnlcbiAgICAgICAgY2hlY2tzdW0gPVxuICAgICAgICAgIChjaGVja3N1bSAtIFhYWFhfVkFMVUUgKyBpbnQzMihsb2FkVGVzdEZvbnRJZCArIFwiWFhYXCIsIGkpKSB8IDA7XG4gICAgICB9XG4gICAgICBkYXRhID0gc3BsaWNlU3RyaW5nKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQsIDQsIHN0cmluZzMyKGNoZWNrc3VtKSk7XG5cbiAgICAgIGNvbnN0IHVybCA9IGB1cmwoZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCwke2J0b2EoZGF0YSl9KTtgO1xuICAgICAgY29uc3QgcnVsZSA9IGBAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiR7bG9hZFRlc3RGb250SWR9XCI7c3JjOiR7dXJsfX1gO1xuICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuXG4gICAgICBjb25zdCBuYW1lcyA9IFtdO1xuICAgICAgZm9yIChpID0gMCwgaWkgPSBmb250cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIG5hbWVzLnB1c2goZm9udHNbaV0ubG9hZGVkTmFtZSk7XG4gICAgICB9XG4gICAgICBuYW1lcy5wdXNoKGxvYWRUZXN0Rm9udElkKTtcblxuICAgICAgY29uc3QgZGl2ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgIGRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5oZWlnaHQgPSBcIjEwcHhcIjtcbiAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgIGRpdi5zdHlsZS50b3AgPSBkaXYuc3R5bGUubGVmdCA9IFwiMHB4XCI7XG5cbiAgICAgIGZvciAoaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICBjb25zdCBzcGFuID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBcIkhpXCI7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udEZhbWlseSA9IG5hbWVzW2ldO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICB9XG4gICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG5cbiAgICAgIGlzRm9udFJlYWR5KGxvYWRUZXN0Rm9udElkLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgICAgICAgcmVxdWVzdC5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgICAvKiogSGFjayBlbmQgKi9cbiAgICB9XG4gIH07XG59IC8vIEVuZCBvZiBQREZKU0Rldi50ZXN0KCdDSFJPTUUgfHwgR0VORVJJQycpXG5cbmNsYXNzIEZvbnRGYWNlT2JqZWN0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgdHJhbnNsYXRlZERhdGEsXG4gICAge1xuICAgICAgaXNFdmFsU3VwcG9ydGVkID0gdHJ1ZSxcbiAgICAgIGRpc2FibGVGb250RmFjZSA9IGZhbHNlLFxuICAgICAgaWdub3JlRXJyb3JzID0gZmFsc2UsXG4gICAgICBvblVuc3VwcG9ydGVkRmVhdHVyZSA9IG51bGwsXG4gICAgICBmb250UmVnaXN0cnkgPSBudWxsLFxuICAgIH1cbiAgKSB7XG4gICAgdGhpcy5jb21waWxlZEdseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgLy8gaW1wb3J0aW5nIHRyYW5zbGF0ZWQgZGF0YVxuICAgIGZvciAoY29uc3QgaSBpbiB0cmFuc2xhdGVkRGF0YSkge1xuICAgICAgdGhpc1tpXSA9IHRyYW5zbGF0ZWREYXRhW2ldO1xuICAgIH1cbiAgICB0aGlzLmlzRXZhbFN1cHBvcnRlZCA9IGlzRXZhbFN1cHBvcnRlZCAhPT0gZmFsc2U7XG4gICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBkaXNhYmxlRm9udEZhY2UgPT09IHRydWU7XG4gICAgdGhpcy5pZ25vcmVFcnJvcnMgPSBpZ25vcmVFcnJvcnMgPT09IHRydWU7XG4gICAgdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUgPSBvblVuc3VwcG9ydGVkRmVhdHVyZTtcbiAgICB0aGlzLmZvbnRSZWdpc3RyeSA9IGZvbnRSZWdpc3RyeTtcbiAgfVxuXG4gIGNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCkge1xuICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbmF0aXZlRm9udEZhY2UgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTtcblxuICAgIGlmICh0aGlzLmZvbnRSZWdpc3RyeSkge1xuICAgICAgdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmF0aXZlRm9udEZhY2U7XG4gIH1cblxuICBjcmVhdGVGb250RmFjZVJ1bGUoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kaXNhYmxlRm9udEZhY2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYnl0ZXNUb1N0cmluZyhuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTtcbiAgICAvLyBBZGQgdGhlIEBmb250LWZhY2UgcnVsZSB0byB0aGUgZG9jdW1lbnQuXG4gICAgY29uc3QgdXJsID0gYHVybChkYXRhOiR7dGhpcy5taW1ldHlwZX07YmFzZTY0LCR7YnRvYShkYXRhKX0pO2A7XG4gICAgY29uc3QgcnVsZSA9IGBAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiR7dGhpcy5sb2FkZWROYW1lfVwiO3NyYzoke3VybH19YDtcblxuICAgIGlmICh0aGlzLmZvbnRSZWdpc3RyeSkge1xuICAgICAgdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMsIHVybCk7XG4gICAgfVxuICAgIHJldHVybiBydWxlO1xuICB9XG5cbiAgZ2V0UGF0aEdlbmVyYXRvcihvYmpzLCBjaGFyYWN0ZXIpIHtcbiAgICBpZiAodGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl07XG4gICAgfVxuXG4gICAgbGV0IGNtZHMsIGN1cnJlbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGNtZHMgPSBvYmpzLmdldCh0aGlzLmxvYWRlZE5hbWUgKyBcIl9wYXRoX1wiICsgY2hhcmFjdGVyKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKCF0aGlzLmlnbm9yZUVycm9ycykge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSkge1xuICAgICAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSh7XG4gICAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRHZXRQYXRoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHdhcm4oYGdldFBhdGhHZW5lcmF0b3IgLSBpZ25vcmluZyBjaGFyYWN0ZXI6IFwiJHtleH1cIi5gKTtcblxuICAgICAgcmV0dXJuICh0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkge1xuICAgICAgICAvLyBOby1vcCBmdW5jdGlvbiwgdG8gYWxsb3cgcmVuZGVyaW5nIHRvIGNvbnRpbnVlLlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgY2FuLCBjb21waWxlIGNtZHMgaW50byBKUyBmb3IgTUFYSU1VTSBTUEVFRC4uLlxuICAgIGlmICh0aGlzLmlzRXZhbFN1cHBvcnRlZCAmJiBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQudmFsdWUpIHtcbiAgICAgIGxldCBhcmdzLFxuICAgICAgICBqcyA9IFwiXCI7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjbWRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY3VycmVudCA9IGNtZHNbaV07XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuYXJncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXJncyA9IGN1cnJlbnQuYXJncy5qb2luKFwiLFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmdzID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBqcyArPSBcImMuXCIgKyBjdXJyZW50LmNtZCArIFwiKFwiICsgYXJncyArIFwiKTtcXG5cIjtcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgcmV0dXJuICh0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBuZXcgRnVuY3Rpb24oXCJjXCIsIFwic2l6ZVwiLCBqcykpO1xuICAgIH1cbiAgICAvLyAuLi4gYnV0IGZhbGwgYmFjayBvbiB1c2luZyBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkoKSBpZiB3ZSdyZVxuICAgIC8vIGJsb2NrZWQgZnJvbSB1c2luZyBldmFsKCkgZm9yIHdoYXRldmVyIHJlYXNvbiAobGlrZSBDU1AgcG9saWNpZXMpLlxuICAgIHJldHVybiAodGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gZnVuY3Rpb24gKGMsIHNpemUpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNtZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjdXJyZW50ID0gY21kc1tpXTtcblxuICAgICAgICBpZiAoY3VycmVudC5jbWQgPT09IFwic2NhbGVcIikge1xuICAgICAgICAgIGN1cnJlbnQuYXJncyA9IFtzaXplLCAtc2l6ZV07XG4gICAgICAgIH1cbiAgICAgICAgY1tjdXJyZW50LmNtZF0uYXBwbHkoYywgY3VycmVudC5hcmdzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBGb250RmFjZU9iamVjdCwgRm9udExvYWRlciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWxzIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgeyBCYXNlQ2FudmFzRmFjdG9yeSwgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IH0gZnJvbSBcIi4vZGlzcGxheV91dGlscy5qc1wiO1xuaW1wb3J0IHsgaXNOb2RlSlMgfSBmcm9tIFwiLi4vc2hhcmVkL2lzX25vZGUuanNcIjtcbmltcG9ydCB7IHVucmVhY2hhYmxlIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbmxldCBOb2RlQ2FudmFzRmFjdG9yeSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdW5yZWFjaGFibGUoXCJOb3QgaW1wbGVtZW50ZWQ6IE5vZGVDYW52YXNGYWN0b3J5XCIpO1xuICB9XG59O1xuXG5sZXQgTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB1bnJlYWNoYWJsZShcIk5vdCBpbXBsZW1lbnRlZDogTm9kZUNNYXBSZWFkZXJGYWN0b3J5XCIpO1xuICB9XG59O1xuXG5pZiAoKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkgJiYgaXNOb2RlSlMpIHtcbiAgTm9kZUNhbnZhc0ZhY3RvcnkgPSBjbGFzcyBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHtcbiAgICBjcmVhdGUod2lkdGgsIGhlaWdodCkge1xuICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjYW52YXMgc2l6ZVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IENhbnZhcyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKFwiY2FudmFzXCIpO1xuICAgICAgY29uc3QgY2FudmFzID0gQ2FudmFzLmNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgY29udGV4dDogY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIE5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IGNsYXNzIGV4dGVuZHMgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcbiAgICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBmcyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKFwiZnNcIik7XG4gICAgICAgIGZzLnJlYWRGaWxlKHVybCwgKGVycm9yLCBkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yIHx8ICFkYXRhKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoeyBjTWFwRGF0YTogbmV3IFVpbnQ4QXJyYXkoZGF0YSksIGNvbXByZXNzaW9uVHlwZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCB7IE5vZGVDYW52YXNGYWN0b3J5LCBOb2RlQ01hcFJlYWRlckZhY3RvcnkgfTtcbiIsIi8qIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEtleS92YWx1ZSBzdG9yYWdlIGZvciBhbm5vdGF0aW9uIGRhdGEgaW4gZm9ybXMuXG4gKi9cbmNsYXNzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9tb2RpZmllZCA9IGZhbHNlO1xuXG4gICAgLy8gQ2FsbGJhY2tzIHRvIHNpZ25hbCB3aGVuIHRoZSBtb2RpZmljYXRpb24gc3RhdGUgaXMgc2V0IG9yIHJlc2V0LlxuICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgdmlld2VyIHRvIG9ubHkgYmluZCBvbiBgYmVmb3JldW5sb2FkYCBpZiBmb3Jtc1xuICAgIC8vIGFyZSBhY3R1YWxseSBlZGl0ZWQgdG8gcHJldmVudCBkb2luZyBzbyB1bmNvbmRpdGlvbmFsbHkgc2luY2UgdGhhdFxuICAgIC8vIGNhbiBoYXZlIHVuZGVzaXJhYmxlIGVmZmZlY3RzLlxuICAgIHRoaXMub25TZXRNb2RpZmllZCA9IG51bGw7XG4gICAgdGhpcy5vblJlc2V0TW9kaWZpZWQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4ga2V5IGlmIGl0IGV4aXN0c1xuICAgKiBvciBzdG9yZSBhbmQgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25TdG9yYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRWYWx1ZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZ2V0T3JDcmVhdGVWYWx1ZShrZXksIGRlZmF1bHRWYWx1ZSkge1xuICAgIGlmICh0aGlzLl9zdG9yYWdlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdG9yYWdlLnNldChrZXksIGRlZmF1bHRWYWx1ZSk7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGtleVxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uU3RvcmFnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICAgKi9cbiAgc2V0VmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0aGlzLl9zdG9yYWdlLmdldChrZXkpICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fc2V0TW9kaWZpZWQoKTtcbiAgICB9XG4gICAgdGhpcy5fc3RvcmFnZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBnZXRBbGwoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3JhZ2Uuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fc3RvcmFnZSk7XG4gIH1cblxuICBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0TW9kaWZpZWQoKSB7XG4gICAgaWYgKCF0aGlzLl9tb2RpZmllZCkge1xuICAgICAgdGhpcy5fbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uU2V0TW9kaWZpZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aGlzLm9uU2V0TW9kaWZpZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXNldE1vZGlmaWVkKCkge1xuICAgIGlmICh0aGlzLl9tb2RpZmllZCkge1xuICAgICAgdGhpcy5fbW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBBbm5vdGF0aW9uU3RvcmFnZSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTggTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGlzTm9kZUpTIH0gZnJvbSBcIi4uL3NoYXJlZC9pc19ub2RlLmpzXCI7XG5cbmNvbnN0IGNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkge1xuICAvLyBTdXBwb3J0OiBOb2RlLmpzXG4gIChmdW5jdGlvbiBjaGVja0ZvbnRGYWNlKCkge1xuICAgIC8vIE5vZGUuanMgaXMgbWlzc2luZyBuYXRpdmUgc3VwcG9ydCBmb3IgYEBmb250LWZhY2VgLlxuICAgIGlmIChpc05vZGVKUykge1xuICAgICAgY29tcGF0aWJpbGl0eVBhcmFtcy5kaXNhYmxlRm9udEZhY2UgPSB0cnVlO1xuICAgIH1cbiAgfSkoKTtcbn1cbmNvbnN0IGFwaUNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuZnJlZXplKGNvbXBhdGliaWxpdHlQYXJhbXMpO1xuXG5leHBvcnQgeyBhcGlDb21wYXRpYmlsaXR5UGFyYW1zIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRk9OVF9JREVOVElUWV9NQVRSSVgsXG4gIElERU5USVRZX01BVFJJWCxcbiAgSW1hZ2VLaW5kLFxuICBpbmZvLFxuICBJc0xpdHRsZUVuZGlhbkNhY2hlZCxcbiAgaXNOdW0sXG4gIE9QUyxcbiAgc2hhZG93LFxuICBUZXh0UmVuZGVyaW5nTW9kZSxcbiAgdW5yZWFjaGFibGUsXG4gIFV0aWwsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIsIFRpbGluZ1BhdHRlcm4gfSBmcm9tIFwiLi9wYXR0ZXJuX2hlbHBlci5qc1wiO1xuXG4vLyA8Y2FudmFzPiBjb250ZXh0cyBzdG9yZSBtb3N0IG9mIHRoZSBzdGF0ZSB3ZSBuZWVkIG5hdGl2ZWx5LlxuLy8gSG93ZXZlciwgUERGIG5lZWRzIGEgYml0IG1vcmUgc3RhdGUsIHdoaWNoIHdlIHN0b3JlIGhlcmUuXG5cbi8vIE1pbmltYWwgZm9udCBzaXplIHRoYXQgd291bGQgYmUgdXNlZCBkdXJpbmcgY2FudmFzIGZpbGxUZXh0IG9wZXJhdGlvbnMuXG52YXIgTUlOX0ZPTlRfU0laRSA9IDE2O1xuLy8gTWF4aW11bSBmb250IHNpemUgdGhhdCB3b3VsZCBiZSB1c2VkIGR1cmluZyBjYW52YXMgZmlsbFRleHQgb3BlcmF0aW9ucy5cbnZhciBNQVhfRk9OVF9TSVpFID0gMTAwO1xudmFyIE1BWF9HUk9VUF9TSVpFID0gNDA5NjtcblxuLy8gSGV1cmlzdGljIHZhbHVlIHVzZWQgd2hlbiBlbmZvcmNpbmcgbWluaW11bSBsaW5lIHdpZHRocy5cbnZhciBNSU5fV0lEVEhfRkFDVE9SID0gMC42NTtcblxudmFyIENPTVBJTEVfVFlQRTNfR0xZUEhTID0gdHJ1ZTtcbnZhciBNQVhfU0laRV9UT19DT01QSUxFID0gMTAwMDtcblxudmFyIEZVTExfQ0hVTktfSEVJR0hUID0gMTY7XG5cbmZ1bmN0aW9uIGFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGN0eCkge1xuICAvLyBJZiB0aGUgY29udGV4dCBkb2Vzbid0IGV4cG9zZSBhIGBtb3pDdXJyZW50VHJhbnNmb3JtYCwgYWRkIGEgSlMgYmFzZWQgb25lLlxuICBpZiAoIWN0eC5tb3pDdXJyZW50VHJhbnNmb3JtKSB7XG4gICAgY3R4Ll9vcmlnaW5hbFNhdmUgPSBjdHguc2F2ZTtcbiAgICBjdHguX29yaWdpbmFsUmVzdG9yZSA9IGN0eC5yZXN0b3JlO1xuICAgIGN0eC5fb3JpZ2luYWxSb3RhdGUgPSBjdHgucm90YXRlO1xuICAgIGN0eC5fb3JpZ2luYWxTY2FsZSA9IGN0eC5zY2FsZTtcbiAgICBjdHguX29yaWdpbmFsVHJhbnNsYXRlID0gY3R4LnRyYW5zbGF0ZTtcbiAgICBjdHguX29yaWdpbmFsVHJhbnNmb3JtID0gY3R4LnRyYW5zZm9ybTtcbiAgICBjdHguX29yaWdpbmFsU2V0VHJhbnNmb3JtID0gY3R4LnNldFRyYW5zZm9ybTtcblxuICAgIGN0eC5fdHJhbnNmb3JtTWF0cml4ID0gY3R4Ll90cmFuc2Zvcm1NYXRyaXggfHwgWzEsIDAsIDAsIDEsIDAsIDBdO1xuICAgIGN0eC5fdHJhbnNmb3JtU3RhY2sgPSBbXTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIFwibW96Q3VycmVudFRyYW5zZm9ybVwiLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgXCJtb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZVwiLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKCkge1xuICAgICAgICAvLyBDYWxjdWxhdGlvbiBkb25lIHVzaW5nIFdvbGZyYW1BbHBoYTpcbiAgICAgICAgLy8gaHR0cDovL3d3dy53b2xmcmFtYWxwaGEuY29tL2lucHV0Lz9cbiAgICAgICAgLy8gICBpPUludmVyc2Ure3thJTJDK2MlMkMrZX0lMkMre2IlMkMrZCUyQytmfSUyQyt7MCUyQyswJTJDKzF9fVxuXG4gICAgICAgIHZhciBtID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4O1xuICAgICAgICB2YXIgYSA9IG1bMF0sXG4gICAgICAgICAgYiA9IG1bMV0sXG4gICAgICAgICAgYyA9IG1bMl0sXG4gICAgICAgICAgZCA9IG1bM10sXG4gICAgICAgICAgZSA9IG1bNF0sXG4gICAgICAgICAgZiA9IG1bNV07XG5cbiAgICAgICAgdmFyIGFkX2JjID0gYSAqIGQgLSBiICogYztcbiAgICAgICAgdmFyIGJjX2FkID0gYiAqIGMgLSBhICogZDtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGQgLyBhZF9iYyxcbiAgICAgICAgICBiIC8gYmNfYWQsXG4gICAgICAgICAgYyAvIGJjX2FkLFxuICAgICAgICAgIGEgLyBhZF9iYyxcbiAgICAgICAgICAoZCAqIGUgLSBjICogZikgLyBiY19hZCxcbiAgICAgICAgICAoYiAqIGUgLSBhICogZikgLyBhZF9iYyxcbiAgICAgICAgXTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjdHguc2F2ZSA9IGZ1bmN0aW9uIGN0eFNhdmUoKSB7XG4gICAgICB2YXIgb2xkID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4O1xuICAgICAgdGhpcy5fdHJhbnNmb3JtU3RhY2sucHVzaChvbGQpO1xuICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gb2xkLnNsaWNlKDAsIDYpO1xuXG4gICAgICB0aGlzLl9vcmlnaW5hbFNhdmUoKTtcbiAgICB9O1xuXG4gICAgY3R4LnJlc3RvcmUgPSBmdW5jdGlvbiBjdHhSZXN0b3JlKCkge1xuICAgICAgdmFyIHByZXYgPSB0aGlzLl90cmFuc2Zvcm1TdGFjay5wb3AoKTtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IHByZXY7XG4gICAgICAgIHRoaXMuX29yaWdpbmFsUmVzdG9yZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjdHgudHJhbnNsYXRlID0gZnVuY3Rpb24gY3R4VHJhbnNsYXRlKHgsIHkpIHtcbiAgICAgIHZhciBtID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4O1xuICAgICAgbVs0XSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdO1xuICAgICAgbVs1XSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuXG4gICAgICB0aGlzLl9vcmlnaW5hbFRyYW5zbGF0ZSh4LCB5KTtcbiAgICB9O1xuXG4gICAgY3R4LnNjYWxlID0gZnVuY3Rpb24gY3R4U2NhbGUoeCwgeSkge1xuICAgICAgdmFyIG0gPSB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7XG4gICAgICBtWzBdID0gbVswXSAqIHg7XG4gICAgICBtWzFdID0gbVsxXSAqIHg7XG4gICAgICBtWzJdID0gbVsyXSAqIHk7XG4gICAgICBtWzNdID0gbVszXSAqIHk7XG5cbiAgICAgIHRoaXMuX29yaWdpbmFsU2NhbGUoeCwgeSk7XG4gICAgfTtcblxuICAgIGN0eC50cmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgdmFyIG0gPSB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1NYXRyaXggPSBbXG4gICAgICAgIG1bMF0gKiBhICsgbVsyXSAqIGIsXG4gICAgICAgIG1bMV0gKiBhICsgbVszXSAqIGIsXG4gICAgICAgIG1bMF0gKiBjICsgbVsyXSAqIGQsXG4gICAgICAgIG1bMV0gKiBjICsgbVszXSAqIGQsXG4gICAgICAgIG1bMF0gKiBlICsgbVsyXSAqIGYgKyBtWzRdLFxuICAgICAgICBtWzFdICogZSArIG1bM10gKiBmICsgbVs1XSxcbiAgICAgIF07XG5cbiAgICAgIGN0eC5fb3JpZ2luYWxUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG4gICAgfTtcblxuICAgIGN0eC5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuXG4gICAgICBjdHguX29yaWdpbmFsU2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIH07XG5cbiAgICBjdHgucm90YXRlID0gZnVuY3Rpb24gY3R4Um90YXRlKGFuZ2xlKSB7XG4gICAgICB2YXIgY29zVmFsdWUgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICB2YXIgc2luVmFsdWUgPSBNYXRoLnNpbihhbmdsZSk7XG5cbiAgICAgIHZhciBtID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4O1xuICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gW1xuICAgICAgICBtWzBdICogY29zVmFsdWUgKyBtWzJdICogc2luVmFsdWUsXG4gICAgICAgIG1bMV0gKiBjb3NWYWx1ZSArIG1bM10gKiBzaW5WYWx1ZSxcbiAgICAgICAgbVswXSAqIC1zaW5WYWx1ZSArIG1bMl0gKiBjb3NWYWx1ZSxcbiAgICAgICAgbVsxXSAqIC1zaW5WYWx1ZSArIG1bM10gKiBjb3NWYWx1ZSxcbiAgICAgICAgbVs0XSxcbiAgICAgICAgbVs1XSxcbiAgICAgIF07XG5cbiAgICAgIHRoaXMuX29yaWdpbmFsUm90YXRlKGFuZ2xlKTtcbiAgICB9O1xuICB9XG59XG5cbnZhciBDYWNoZWRDYW52YXNlcyA9IChmdW5jdGlvbiBDYWNoZWRDYW52YXNlc0Nsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQ2FjaGVkQ2FudmFzZXMoY2FudmFzRmFjdG9yeSkge1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG4gICAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgQ2FjaGVkQ2FudmFzZXMucHJvdG90eXBlID0ge1xuICAgIGdldENhbnZhczogZnVuY3Rpb24gQ2FjaGVkQ2FudmFzZXNfZ2V0Q2FudmFzKFxuICAgICAgaWQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRyYWNrVHJhbnNmb3JtXG4gICAgKSB7XG4gICAgICB2YXIgY2FudmFzRW50cnk7XG4gICAgICBpZiAodGhpcy5jYWNoZVtpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdO1xuICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkucmVzZXQoY2FudmFzRW50cnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAvLyByZXNldCBjYW52YXMgdHJhbnNmb3JtIGZvciBlbXVsYXRlZCBtb3pDdXJyZW50VHJhbnNmb3JtLCBpZiBuZWVkZWRcbiAgICAgICAgY2FudmFzRW50cnkuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuY2FjaGVbaWRdID0gY2FudmFzRW50cnk7XG4gICAgICB9XG4gICAgICBpZiAodHJhY2tUcmFuc2Zvcm0pIHtcbiAgICAgICAgYWRkQ29udGV4dEN1cnJlbnRUcmFuc2Zvcm0oY2FudmFzRW50cnkuY29udGV4dCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FudmFzRW50cnk7XG4gICAgfSxcbiAgICBjbGVhcigpIHtcbiAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgdmFyIGNhbnZhc0VudHJ5ID0gdGhpcy5jYWNoZVtpZF07XG4gICAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5kZXN0cm95KGNhbnZhc0VudHJ5KTtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2FjaGVbaWRdO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG4gIHJldHVybiBDYWNoZWRDYW52YXNlcztcbn0pKCk7XG5cbmZ1bmN0aW9uIGNvbXBpbGVUeXBlM0dseXBoKGltZ0RhdGEpIHtcbiAgdmFyIFBPSU5UX1RPX1BST0NFU1NfTElNSVQgPSAxMDAwO1xuXG4gIHZhciB3aWR0aCA9IGltZ0RhdGEud2lkdGgsXG4gICAgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG4gIHZhciBpLFxuICAgIGosXG4gICAgajAsXG4gICAgd2lkdGgxID0gd2lkdGggKyAxO1xuICB2YXIgcG9pbnRzID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgxICogKGhlaWdodCArIDEpKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBQT0lOVF9UWVBFUyA9XG4gICAgICBuZXcgVWludDhBcnJheShbMCwgMiwgNCwgMCwgMSwgMCwgNSwgNCwgOCwgMTAsIDAsIDgsIDAsIDIsIDEsIDBdKTtcblxuICAvLyBkZWNvZGVzIGJpdC1wYWNrZWQgbWFzayBkYXRhXG4gIHZhciBsaW5lU2l6ZSA9ICh3aWR0aCArIDcpICYgfjcsXG4gICAgZGF0YTAgPSBpbWdEYXRhLmRhdGE7XG4gIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkobGluZVNpemUgKiBoZWlnaHQpLFxuICAgIHBvcyA9IDAsXG4gICAgaWk7XG4gIGZvciAoaSA9IDAsIGlpID0gZGF0YTAubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgIHZhciBtYXNrID0gMTI4LFxuICAgICAgZWxlbSA9IGRhdGEwW2ldO1xuICAgIHdoaWxlIChtYXNrID4gMCkge1xuICAgICAgZGF0YVtwb3MrK10gPSBlbGVtICYgbWFzayA/IDAgOiAyNTU7XG4gICAgICBtYXNrID4+PSAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmRpbmcgaW50ZXJlc3RpbmcgcG9pbnRzOiBldmVyeSBwb2ludCBpcyBsb2NhdGVkIGJldHdlZW4gbWFzayBwaXhlbHMsXG4gIC8vIHNvIHRoZXJlIHdpbGwgYmUgcG9pbnRzIG9mIHRoZSAod2lkdGggKyAxKXgoaGVpZ2h0ICsgMSkgZ3JpZC4gRXZlcnkgcG9pbnRcbiAgLy8gd2lsbCBoYXZlIGZsYWdzIGFzc2lnbmVkIGJhc2VkIG9uIG5laWdoYm9yaW5nIG1hc2sgcGl4ZWxzOlxuICAvLyAgIDQgfCA4XG4gIC8vICAgLS1QLS1cbiAgLy8gICAyIHwgMVxuICAvLyBXZSBhcmUgaW50ZXJlc3RlZCBvbmx5IGluIHBvaW50cyB3aXRoIHRoZSBmbGFnczpcbiAgLy8gICAtIG91dHNpZGUgY29ybmVyczogMSwgMiwgNCwgODtcbiAgLy8gICAtIGluc2lkZSBjb3JuZXJzOiA3LCAxMSwgMTMsIDE0O1xuICAvLyAgIC0gYW5kLCBpbnRlcnNlY3Rpb25zOiA1LCAxMC5cbiAgdmFyIGNvdW50ID0gMDtcbiAgcG9zID0gMDtcbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1swXSA9IDE7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcbiAgICAgIHBvaW50c1tqXSA9IGRhdGFbcG9zXSA/IDIgOiAxO1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgcG9zKys7XG4gIH1cbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1tqXSA9IDI7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGkgPSAxOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICBwb3MgPSBpICogbGluZVNpemU7XG4gICAgajAgPSBpICogd2lkdGgxO1xuICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7XG4gICAgICBwb2ludHNbajBdID0gZGF0YVtwb3NdID8gMSA6IDg7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICAvLyAnc3VtJyBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgcGl4ZWwgY29uZmlndXJhdGlvbiBpbiB0aGUgJ1RZUEVTJ1xuICAgIC8vIGFycmF5IChpbiBvcmRlciA4LTEtMi00LCBzbyB3ZSBjYW4gdXNlICc+PjInIHRvIHNoaWZ0IHRoZSBjb2x1bW4pLlxuICAgIHZhciBzdW0gPSAoZGF0YVtwb3NdID8gNCA6IDApICsgKGRhdGFbcG9zIC0gbGluZVNpemVdID8gOCA6IDApO1xuICAgIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICBzdW0gPVxuICAgICAgICAoc3VtID4+IDIpICtcbiAgICAgICAgKGRhdGFbcG9zICsgMV0gPyA0IDogMCkgK1xuICAgICAgICAoZGF0YVtwb3MgLSBsaW5lU2l6ZSArIDFdID8gOCA6IDApO1xuICAgICAgaWYgKFBPSU5UX1RZUEVTW3N1bV0pIHtcbiAgICAgICAgcG9pbnRzW2owICsgal0gPSBQT0lOVF9UWVBFU1tzdW1dO1xuICAgICAgICArK2NvdW50O1xuICAgICAgfVxuICAgICAgcG9zKys7XG4gICAgfVxuICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7XG4gICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDIgOiA0O1xuICAgICAgKytjb3VudDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQgPiBQT0lOVF9UT19QUk9DRVNTX0xJTUlUKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwb3MgPSBsaW5lU2l6ZSAqIChoZWlnaHQgLSAxKTtcbiAgajAgPSBpICogd2lkdGgxO1xuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2owXSA9IDg7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcbiAgICAgIHBvaW50c1tqMCArIGpdID0gZGF0YVtwb3NdID8gNCA6IDg7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBwb3MrKztcbiAgfVxuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2owICsgal0gPSA0O1xuICAgICsrY291bnQ7XG4gIH1cbiAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gYnVpbGRpbmcgb3V0bGluZXNcbiAgdmFyIHN0ZXBzID0gbmV3IEludDMyQXJyYXkoWzAsIHdpZHRoMSwgLTEsIDAsIC13aWR0aDEsIDAsIDAsIDAsIDFdKTtcbiAgdmFyIG91dGxpbmVzID0gW107XG4gIGZvciAoaSA9IDA7IGNvdW50ICYmIGkgPD0gaGVpZ2h0OyBpKyspIHtcbiAgICB2YXIgcCA9IGkgKiB3aWR0aDE7XG4gICAgdmFyIGVuZCA9IHAgKyB3aWR0aDtcbiAgICB3aGlsZSAocCA8IGVuZCAmJiAhcG9pbnRzW3BdKSB7XG4gICAgICBwKys7XG4gICAgfVxuICAgIGlmIChwID09PSBlbmQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgY29vcmRzID0gW3AgJSB3aWR0aDEsIGldO1xuXG4gICAgdmFyIHR5cGUgPSBwb2ludHNbcF0sXG4gICAgICBwMCA9IHAsXG4gICAgICBwcDtcbiAgICBkbyB7XG4gICAgICB2YXIgc3RlcCA9IHN0ZXBzW3R5cGVdO1xuICAgICAgZG8ge1xuICAgICAgICBwICs9IHN0ZXA7XG4gICAgICB9IHdoaWxlICghcG9pbnRzW3BdKTtcblxuICAgICAgcHAgPSBwb2ludHNbcF07XG4gICAgICBpZiAocHAgIT09IDUgJiYgcHAgIT09IDEwKSB7XG4gICAgICAgIC8vIHNldCBuZXcgZGlyZWN0aW9uXG4gICAgICAgIHR5cGUgPSBwcDtcbiAgICAgICAgLy8gZGVsZXRlIG1hcmtcbiAgICAgICAgcG9pbnRzW3BdID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHR5cGUgaXMgNSBvciAxMCwgaWUsIGEgY3Jvc3NpbmdcbiAgICAgICAgLy8gc2V0IG5ldyBkaXJlY3Rpb25cbiAgICAgICAgdHlwZSA9IHBwICYgKCgweDMzICogdHlwZSkgPj4gNCk7XG4gICAgICAgIC8vIHNldCBuZXcgdHlwZSBmb3IgXCJmdXR1cmUgaGl0XCJcbiAgICAgICAgcG9pbnRzW3BdICY9ICh0eXBlID4+IDIpIHwgKHR5cGUgPDwgMik7XG4gICAgICB9XG5cbiAgICAgIGNvb3Jkcy5wdXNoKHAgJSB3aWR0aDEpO1xuICAgICAgY29vcmRzLnB1c2goKHAgLyB3aWR0aDEpIHwgMCk7XG5cbiAgICAgIGlmICghcG9pbnRzW3BdKSB7XG4gICAgICAgIC0tY291bnQ7XG4gICAgICB9XG4gICAgfSB3aGlsZSAocDAgIT09IHApO1xuICAgIG91dGxpbmVzLnB1c2goY29vcmRzKTtcbiAgICAtLWk7XG4gIH1cblxuICB2YXIgZHJhd091dGxpbmUgPSBmdW5jdGlvbiAoYykge1xuICAgIGMuc2F2ZSgpO1xuICAgIC8vIHRoZSBwYXRoIHNoYWxsIGJlIHBhaW50ZWQgaW4gWzAuLjFdeFswLi4xXSBzcGFjZVxuICAgIGMuc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG4gICAgYy50cmFuc2xhdGUoMCwgLWhlaWdodCk7XG4gICAgYy5iZWdpblBhdGgoKTtcbiAgICBmb3IgKGxldCBrID0gMCwga2sgPSBvdXRsaW5lcy5sZW5ndGg7IGsgPCBrazsgaysrKSB7XG4gICAgICB2YXIgbyA9IG91dGxpbmVzW2tdO1xuICAgICAgYy5tb3ZlVG8ob1swXSwgb1sxXSk7XG4gICAgICBmb3IgKGxldCBsID0gMiwgbGwgPSBvLmxlbmd0aDsgbCA8IGxsOyBsICs9IDIpIHtcbiAgICAgICAgYy5saW5lVG8ob1tsXSwgb1tsICsgMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjLmZpbGwoKTtcbiAgICBjLmJlZ2luUGF0aCgpO1xuICAgIGMucmVzdG9yZSgpO1xuICB9O1xuXG4gIHJldHVybiBkcmF3T3V0bGluZTtcbn1cblxudmFyIENhbnZhc0V4dHJhU3RhdGUgPSAoZnVuY3Rpb24gQ2FudmFzRXh0cmFTdGF0ZUNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQ2FudmFzRXh0cmFTdGF0ZSgpIHtcbiAgICAvLyBBcmUgc29mdCBtYXNrcyBhbmQgYWxwaGEgdmFsdWVzIHNoYXBlcyBvciBvcGFjaXRpZXM/XG4gICAgdGhpcy5hbHBoYUlzU2hhcGUgPSBmYWxzZTtcbiAgICB0aGlzLmZvbnRTaXplID0gMDtcbiAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuICAgIHRoaXMudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWDtcbiAgICB0aGlzLnRleHRNYXRyaXhTY2FsZSA9IDE7XG4gICAgdGhpcy5mb250TWF0cml4ID0gRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgdGhpcy5sZWFkaW5nID0gMDtcbiAgICAvLyBDdXJyZW50IHBvaW50IChpbiB1c2VyIGNvb3JkaW5hdGVzKVxuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcbiAgICAvLyBTdGFydCBvZiB0ZXh0IGxpbmUgKGluIHRleHQgY29vcmRpbmF0ZXMpXG4gICAgdGhpcy5saW5lWCA9IDA7XG4gICAgdGhpcy5saW5lWSA9IDA7XG4gICAgLy8gQ2hhcmFjdGVyIGFuZCB3b3JkIHNwYWNpbmdcbiAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDtcbiAgICB0aGlzLndvcmRTcGFjaW5nID0gMDtcbiAgICB0aGlzLnRleHRIU2NhbGUgPSAxO1xuICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMO1xuICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuICAgIC8vIERlZmF1bHQgZm9yZSBhbmQgYmFja2dyb3VuZCBjb2xvcnNcbiAgICB0aGlzLmZpbGxDb2xvciA9IFwiIzAwMDAwMFwiO1xuICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBcIiMwMDAwMDBcIjtcbiAgICB0aGlzLnBhdHRlcm5GaWxsID0gZmFsc2U7XG4gICAgLy8gTm90ZTogZmlsbCBhbHBoYSBhcHBsaWVzIHRvIGFsbCBub24tc3Ryb2tpbmcgb3BlcmF0aW9uc1xuICAgIHRoaXMuZmlsbEFscGhhID0gMTtcbiAgICB0aGlzLnN0cm9rZUFscGhhID0gMTtcbiAgICB0aGlzLmxpbmVXaWR0aCA9IDE7XG4gICAgdGhpcy5hY3RpdmVTTWFzayA9IG51bGw7XG4gICAgdGhpcy5yZXN1bWVTTWFza0N0eCA9IG51bGw7IC8vIG5vbmNsb25hYmxlIGZpZWxkIChzZWUgdGhlIHNhdmUgbWV0aG9kIGJlbG93KVxuICAgIHRoaXMudHJhbnNmZXJNYXBzID0gbnVsbDtcbiAgfVxuXG4gIENhbnZhc0V4dHJhU3RhdGUucHJvdG90eXBlID0ge1xuICAgIGNsb25lOiBmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlX2Nsb25lKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfSxcbiAgICBzZXRDdXJyZW50UG9pbnQ6IGZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGVfc2V0Q3VycmVudFBvaW50KHgsIHkpIHtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBDYW52YXNFeHRyYVN0YXRlO1xufSkoKTtcblxuLyoqXG4gKiBAdHlwZSB7YW55fVxuICovXG52YXIgQ2FudmFzR3JhcGhpY3MgPSAoZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NDbG9zdXJlKCkge1xuICAvLyBEZWZpbmVzIHRoZSB0aW1lIHRoZSBleGVjdXRlT3BlcmF0b3JMaXN0IGlzIGdvaW5nIHRvIGJlIGV4ZWN1dGluZ1xuICAvLyBiZWZvcmUgaXQgc3RvcHMgYW5kIHNoZWR1bGVzIGEgY29udGludWUgb2YgZXhlY3V0aW9uLlxuICB2YXIgRVhFQ1VUSU9OX1RJTUUgPSAxNTtcbiAgLy8gRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHN0ZXBzIGJlZm9yZSBjaGVja2luZyB0aGUgZXhlY3V0aW9uIHRpbWVcbiAgdmFyIEVYRUNVVElPTl9TVEVQUyA9IDEwO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3MoXG4gICAgY2FudmFzQ3R4LFxuICAgIGNvbW1vbk9ianMsXG4gICAgb2JqcyxcbiAgICBjYW52YXNGYWN0b3J5LFxuICAgIHdlYkdMQ29udGV4dCxcbiAgICBpbWFnZUxheWVyLFxuICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1xuICApIHtcbiAgICB0aGlzLmN0eCA9IGNhbnZhc0N0eDtcbiAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSgpO1xuICAgIHRoaXMuc3RhdGVTdGFjayA9IFtdO1xuICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuICAgIHRoaXMucmVzID0gbnVsbDtcbiAgICB0aGlzLnhvYmpzID0gbnVsbDtcbiAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzO1xuICAgIHRoaXMub2JqcyA9IG9ianM7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLndlYkdMQ29udGV4dCA9IHdlYkdMQ29udGV4dDtcbiAgICB0aGlzLmltYWdlTGF5ZXIgPSBpbWFnZUxheWVyO1xuICAgIHRoaXMuZ3JvdXBTdGFjayA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcbiAgICAvLyBQYXR0ZXJucyBhcmUgcGFpbnRlZCByZWxhdGl2ZSB0byB0aGUgaW5pdGlhbCBwYWdlL2Zvcm0gdHJhbnNmb3JtLCBzZWUgcGRmXG4gICAgLy8gc3BlYyA4LjcuMiBOT1RFIDEuXG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gbnVsbDtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjayA9IFtdO1xuICAgIHRoaXMuZ3JvdXBMZXZlbCA9IDA7XG4gICAgdGhpcy5zbWFza1N0YWNrID0gW107XG4gICAgdGhpcy5zbWFza0NvdW50ZXIgPSAwO1xuICAgIHRoaXMudGVtcFNNYXNrID0gbnVsbDtcbiAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjayA9IFtdO1xuICAgIHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnID0gb3B0aW9uYWxDb250ZW50Q29uZmlnO1xuICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMgPSBuZXcgQ2FjaGVkQ2FudmFzZXModGhpcy5jYW52YXNGYWN0b3J5KTtcbiAgICBpZiAoY2FudmFzQ3R4KSB7XG4gICAgICAvLyBOT1RFOiBpZiBtb3pDdXJyZW50VHJhbnNmb3JtIGlzIHBvbHlmaWxsZWQsIHRoZW4gdGhlIGN1cnJlbnQgc3RhdGUgb2ZcbiAgICAgIC8vIHRoZSB0cmFuc2Zvcm1hdGlvbiBtdXN0IGFscmVhZHkgYmUgc2V0IGluIGNhbnZhc0N0eC5fdHJhbnNmb3JtTWF0cml4LlxuICAgICAgYWRkQ29udGV4dEN1cnJlbnRUcmFuc2Zvcm0oY2FudmFzQ3R4KTtcbiAgICB9XG4gICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBwdXRCaW5hcnlJbWFnZURhdGEoY3R4LCBpbWdEYXRhLCB0cmFuc2Zlck1hcHMgPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBJbWFnZURhdGEgIT09IFwidW5kZWZpbmVkXCIgJiYgaW1nRGF0YSBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQdXQgdGhlIGltYWdlIGRhdGEgdG8gdGhlIGNhbnZhcyBpbiBjaHVua3MsIHJhdGhlciB0aGFuIHB1dHRpbmcgdGhlXG4gICAgLy8gd2hvbGUgaW1hZ2UgYXQgb25jZS4gIFRoaXMgc2F2ZXMgSlMgbWVtb3J5LCBiZWNhdXNlIHRoZSBJbWFnZURhdGEgb2JqZWN0XG4gICAgLy8gaXMgc21hbGxlci4gSXQgYWxzbyBwb3NzaWJseSBzYXZlcyBDKysgbWVtb3J5IHdpdGhpbiB0aGUgaW1wbGVtZW50YXRpb25cbiAgICAvLyBvZiBwdXRJbWFnZURhdGEoKS4gKEUuZy4gaW4gRmlyZWZveCB3ZSBtYWtlIHR3byBzaG9ydC1saXZlZCBjb3BpZXMgb2ZcbiAgICAvLyB0aGUgZGF0YSBwYXNzZWQgdG8gcHV0SW1hZ2VEYXRhKCkpLiB8bnwgc2hvdWxkbid0IGJlIHRvbyBzbWFsbCwgaG93ZXZlcixcbiAgICAvLyBiZWNhdXNlIHRvbyBtYW55IHB1dEltYWdlRGF0YSgpIGNhbGxzIHdpbGwgc2xvdyB0aGluZ3MgZG93bi5cbiAgICAvL1xuICAgIC8vIE5vdGU6IGFzIHdyaXR0ZW4sIGlmIHRoZSBsYXN0IGNodW5rIGlzIHBhcnRpYWwsIHRoZSBwdXRJbWFnZURhdGEoKSBjYWxsXG4gICAgLy8gd2lsbCAoY29uY2VwdHVhbGx5KSBwdXQgcGl4ZWxzIHBhc3QgdGhlIGJvdW5kcyBvZiB0aGUgY2FudmFzLiAgQnV0XG4gICAgLy8gdGhhdCdzIG9rOyBhbnkgc3VjaCBwaXhlbHMgYXJlIGlnbm9yZWQuXG5cbiAgICB2YXIgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQsXG4gICAgICB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gICAgdmFyIHBhcnRpYWxDaHVua0hlaWdodCA9IGhlaWdodCAlIEZVTExfQ0hVTktfSEVJR0hUO1xuICAgIHZhciBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgICB2YXIgdG90YWxDaHVua3MgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQgPT09IDAgPyBmdWxsQ2h1bmtzIDogZnVsbENodW5rcyArIDE7XG5cbiAgICB2YXIgY2h1bmtJbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgRlVMTF9DSFVOS19IRUlHSFQpO1xuICAgIHZhciBzcmNQb3MgPSAwLFxuICAgICAgZGVzdFBvcztcbiAgICB2YXIgc3JjID0gaW1nRGF0YS5kYXRhO1xuICAgIHZhciBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7XG4gICAgdmFyIGksIGosIHRoaXNDaHVua0hlaWdodCwgZWxlbXNJblRoaXNDaHVuaztcblxuICAgIGxldCB0cmFuc2Zlck1hcFJlZCwgdHJhbnNmZXJNYXBHcmVlbiwgdHJhbnNmZXJNYXBCbHVlLCB0cmFuc2Zlck1hcEdyYXk7XG4gICAgaWYgKHRyYW5zZmVyTWFwcykge1xuICAgICAgc3dpdGNoICh0cmFuc2Zlck1hcHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0cmFuc2Zlck1hcFJlZCA9IHRyYW5zZmVyTWFwc1swXTtcbiAgICAgICAgICB0cmFuc2Zlck1hcEdyZWVuID0gdHJhbnNmZXJNYXBzWzBdO1xuICAgICAgICAgIHRyYW5zZmVyTWFwQmx1ZSA9IHRyYW5zZmVyTWFwc1swXTtcbiAgICAgICAgICB0cmFuc2Zlck1hcEdyYXkgPSB0cmFuc2Zlck1hcHNbMF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICB0cmFuc2Zlck1hcFJlZCA9IHRyYW5zZmVyTWFwc1swXTtcbiAgICAgICAgICB0cmFuc2Zlck1hcEdyZWVuID0gdHJhbnNmZXJNYXBzWzFdO1xuICAgICAgICAgIHRyYW5zZmVyTWFwQmx1ZSA9IHRyYW5zZmVyTWFwc1syXTtcbiAgICAgICAgICB0cmFuc2Zlck1hcEdyYXkgPSB0cmFuc2Zlck1hcHNbM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIGluIHdoaWNoIHRoZSBwaXhlbCBkYXRhIGNhbiBiZSBwYXNzZWQsIGFuZFxuICAgIC8vIGltZ0RhdGEua2luZCB0ZWxscyB1cyB3aGljaCBvbmUgdGhpcyBpcy5cbiAgICBpZiAoaW1nRGF0YS5raW5kID09PSBJbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFApIHtcbiAgICAgIC8vIEdyYXlzY2FsZSwgMSBiaXQgcGVyIHBpeGVsIChpLmUuIGJsYWNrLWFuZC13aGl0ZSkuXG4gICAgICB2YXIgc3JjTGVuZ3RoID0gc3JjLmJ5dGVMZW5ndGg7XG4gICAgICB2YXIgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyLCAwLCBkZXN0LmJ5dGVMZW5ndGggPj4gMik7XG4gICAgICB2YXIgZGVzdDMyRGF0YUxlbmd0aCA9IGRlc3QzMi5sZW5ndGg7XG4gICAgICB2YXIgZnVsbFNyY0RpZmYgPSAod2lkdGggKyA3KSA+PiAzO1xuICAgICAgdmFyIHdoaXRlID0gMHhmZmZmZmZmZjtcbiAgICAgIHZhciBibGFjayA9IElzTGl0dGxlRW5kaWFuQ2FjaGVkLnZhbHVlID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmY7XG5cbiAgICAgIGlmICh0cmFuc2Zlck1hcEdyYXkpIHtcbiAgICAgICAgaWYgKHRyYW5zZmVyTWFwR3JheVswXSA9PT0gMHhmZiAmJiB0cmFuc2Zlck1hcEdyYXlbMHhmZl0gPT09IDApIHtcbiAgICAgICAgICBbd2hpdGUsIGJsYWNrXSA9IFtibGFjaywgd2hpdGVdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG4gICAgICAgIHRoaXNDaHVua0hlaWdodCA9XG4gICAgICAgICAgaSA8IGZ1bGxDaHVua3MgPyBGVUxMX0NIVU5LX0hFSUdIVCA6IHBhcnRpYWxDaHVua0hlaWdodDtcbiAgICAgICAgZGVzdFBvcyA9IDA7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzQ2h1bmtIZWlnaHQ7IGorKykge1xuICAgICAgICAgIHZhciBzcmNEaWZmID0gc3JjTGVuZ3RoIC0gc3JjUG9zO1xuICAgICAgICAgIGxldCBrID0gMDtcbiAgICAgICAgICB2YXIga0VuZCA9IHNyY0RpZmYgPiBmdWxsU3JjRGlmZiA/IHdpZHRoIDogc3JjRGlmZiAqIDggLSA3O1xuICAgICAgICAgIHZhciBrRW5kVW5yb2xsZWQgPSBrRW5kICYgfjc7XG4gICAgICAgICAgdmFyIG1hc2sgPSAwO1xuICAgICAgICAgIHZhciBzcmNCeXRlID0gMDtcbiAgICAgICAgICBmb3IgKDsgayA8IGtFbmRVbnJvbGxlZDsgayArPSA4KSB7XG4gICAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEyOCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA2NCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAzMiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxNiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA4ID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDQgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICg7IGsgPCBrRW5kOyBrKyspIHtcbiAgICAgICAgICAgIGlmIChtYXNrID09PSAwKSB7XG4gICAgICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiBtYXNrID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHJhbiBvdXQgb2YgaW5wdXQuIE1ha2UgYWxsIHJlbWFpbmluZyBwaXhlbHMgdHJhbnNwYXJlbnQuXG4gICAgICAgIHdoaWxlIChkZXN0UG9zIDwgZGVzdDMyRGF0YUxlbmd0aCkge1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW1nRGF0YS5raW5kID09PSBJbWFnZUtpbmQuUkdCQV8zMkJQUCkge1xuICAgICAgLy8gUkdCQSwgMzItYml0cyBwZXIgcGl4ZWwuXG4gICAgICBjb25zdCBoYXNUcmFuc2Zlck1hcHMgPSAhIShcbiAgICAgICAgdHJhbnNmZXJNYXBSZWQgfHxcbiAgICAgICAgdHJhbnNmZXJNYXBHcmVlbiB8fFxuICAgICAgICB0cmFuc2Zlck1hcEJsdWVcbiAgICAgICk7XG5cbiAgICAgIGogPSAwO1xuICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogRlVMTF9DSFVOS19IRUlHSFQgKiA0O1xuICAgICAgZm9yIChpID0gMDsgaSA8IGZ1bGxDaHVua3M7IGkrKykge1xuICAgICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7XG4gICAgICAgIHNyY1BvcyArPSBlbGVtc0luVGhpc0NodW5rO1xuXG4gICAgICAgIGlmIChoYXNUcmFuc2Zlck1hcHMpIHtcbiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGVsZW1zSW5UaGlzQ2h1bms7IGsgKz0gNCkge1xuICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwUmVkKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDBdID0gdHJhbnNmZXJNYXBSZWRbZGVzdFtrICsgMF1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwR3JlZW4pIHtcbiAgICAgICAgICAgICAgZGVzdFtrICsgMV0gPSB0cmFuc2Zlck1hcEdyZWVuW2Rlc3RbayArIDFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEJsdWUpIHtcbiAgICAgICAgICAgICAgZGVzdFtrICsgMl0gPSB0cmFuc2Zlck1hcEJsdWVbZGVzdFtrICsgMl1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTtcbiAgICAgICAgaiArPSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgICAgIH1cbiAgICAgIGlmIChpIDwgdG90YWxDaHVua3MpIHtcbiAgICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogcGFydGlhbENodW5rSGVpZ2h0ICogNDtcbiAgICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY1Bvcywgc3JjUG9zICsgZWxlbXNJblRoaXNDaHVuaykpO1xuXG4gICAgICAgIGlmIChoYXNUcmFuc2Zlck1hcHMpIHtcbiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGVsZW1zSW5UaGlzQ2h1bms7IGsgKz0gNCkge1xuICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwUmVkKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDBdID0gdHJhbnNmZXJNYXBSZWRbZGVzdFtrICsgMF1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwR3JlZW4pIHtcbiAgICAgICAgICAgICAgZGVzdFtrICsgMV0gPSB0cmFuc2Zlck1hcEdyZWVuW2Rlc3RbayArIDFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEJsdWUpIHtcbiAgICAgICAgICAgICAgZGVzdFtrICsgMl0gPSB0cmFuc2Zlck1hcEJsdWVbZGVzdFtrICsgMl1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gSW1hZ2VLaW5kLlJHQl8yNEJQUCkge1xuICAgICAgLy8gUkdCLCAyNC1iaXRzIHBlciBwaXhlbC5cbiAgICAgIGNvbnN0IGhhc1RyYW5zZmVyTWFwcyA9ICEhKFxuICAgICAgICB0cmFuc2Zlck1hcFJlZCB8fFxuICAgICAgICB0cmFuc2Zlck1hcEdyZWVuIHx8XG4gICAgICAgIHRyYW5zZmVyTWFwQmx1ZVxuICAgICAgKTtcblxuICAgICAgdGhpc0NodW5rSGVpZ2h0ID0gRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiB0aGlzQ2h1bmtIZWlnaHQ7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuICAgICAgICBpZiAoaSA+PSBmdWxsQ2h1bmtzKSB7XG4gICAgICAgICAgdGhpc0NodW5rSGVpZ2h0ID0gcGFydGlhbENodW5rSGVpZ2h0O1xuICAgICAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGogPSBlbGVtc0luVGhpc0NodW5rOyBqLS07ICkge1xuICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNUcmFuc2Zlck1hcHMpIHtcbiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGRlc3RQb3M7IGsgKz0gNCkge1xuICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwUmVkKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDBdID0gdHJhbnNmZXJNYXBSZWRbZGVzdFtrICsgMF1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwR3JlZW4pIHtcbiAgICAgICAgICAgICAgZGVzdFtrICsgMV0gPSB0cmFuc2Zlck1hcEdyZWVuW2Rlc3RbayArIDFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEJsdWUpIHtcbiAgICAgICAgICAgICAgZGVzdFtrICsgMl0gPSB0cmFuc2Zlck1hcEJsdWVbZGVzdFtrICsgMl1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhZCBpbWFnZSBraW5kOiAke2ltZ0RhdGEua2luZH1gKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwdXRCaW5hcnlJbWFnZU1hc2soY3R4LCBpbWdEYXRhKSB7XG4gICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LFxuICAgICAgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgIHZhciBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgICB2YXIgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgdmFyIHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxO1xuXG4gICAgdmFyIGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgICB2YXIgc3JjUG9zID0gMDtcbiAgICB2YXIgc3JjID0gaW1nRGF0YS5kYXRhO1xuICAgIHZhciBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHtcbiAgICAgIHZhciB0aGlzQ2h1bmtIZWlnaHQgPVxuICAgICAgICBpIDwgZnVsbENodW5rcyA/IEZVTExfQ0hVTktfSEVJR0hUIDogcGFydGlhbENodW5rSGVpZ2h0O1xuXG4gICAgICAvLyBFeHBhbmQgdGhlIG1hc2sgc28gaXQgY2FuIGJlIHVzZWQgYnkgdGhlIGNhbnZhcy4gIEFueSByZXF1aXJlZFxuICAgICAgLy8gaW52ZXJzaW9uIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZC5cbiAgICAgIHZhciBkZXN0UG9zID0gMzsgLy8gYWxwaGEgY29tcG9uZW50IG9mZnNldFxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzQ2h1bmtIZWlnaHQ7IGorKykge1xuICAgICAgICB2YXIgbWFzayA9IDA7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgd2lkdGg7IGsrKykge1xuICAgICAgICAgIGlmICghbWFzaykge1xuICAgICAgICAgICAgdmFyIGVsZW0gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICAgICAgbWFzayA9IDEyODtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVzdFtkZXN0UG9zXSA9IGVsZW0gJiBtYXNrID8gMCA6IDI1NTtcbiAgICAgICAgICBkZXN0UG9zICs9IDQ7XG4gICAgICAgICAgbWFzayA+Pj0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29weUN0eFN0YXRlKHNvdXJjZUN0eCwgZGVzdEN0eCkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gW1xuICAgICAgXCJzdHJva2VTdHlsZVwiLFxuICAgICAgXCJmaWxsU3R5bGVcIixcbiAgICAgIFwiZmlsbFJ1bGVcIixcbiAgICAgIFwiZ2xvYmFsQWxwaGFcIixcbiAgICAgIFwibGluZVdpZHRoXCIsXG4gICAgICBcImxpbmVDYXBcIixcbiAgICAgIFwibGluZUpvaW5cIixcbiAgICAgIFwibWl0ZXJMaW1pdFwiLFxuICAgICAgXCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cIixcbiAgICAgIFwiZm9udFwiLFxuICAgIF07XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcHJvcGVydGllcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHNvdXJjZUN0eFtwcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXN0Q3R4W3Byb3BlcnR5XSA9IHNvdXJjZUN0eFtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzb3VyY2VDdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdEN0eC5zZXRMaW5lRGFzaChzb3VyY2VDdHguZ2V0TGluZURhc2goKSk7XG4gICAgICBkZXN0Q3R4LmxpbmVEYXNoT2Zmc2V0ID0gc291cmNlQ3R4LmxpbmVEYXNoT2Zmc2V0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KGN0eCkge1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IFwiIzAwMDAwMFwiO1xuICAgIGN0eC5maWxsU3R5bGUgPSBcIiMwMDAwMDBcIjtcbiAgICBjdHguZmlsbFJ1bGUgPSBcIm5vbnplcm9cIjtcbiAgICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xuICAgIGN0eC5saW5lV2lkdGggPSAxO1xuICAgIGN0eC5saW5lQ2FwID0gXCJidXR0XCI7XG4gICAgY3R4LmxpbmVKb2luID0gXCJtaXRlclwiO1xuICAgIGN0eC5taXRlckxpbWl0ID0gMTA7XG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICBjdHguZm9udCA9IFwiMTBweCBzYW5zLXNlcmlmXCI7XG4gICAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdHguc2V0TGluZURhc2goW10pO1xuICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gMDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb21wb3NlU01hc2tCYWNrZHJvcChieXRlcywgcjAsIGcwLCBiMCkge1xuICAgIHZhciBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDM7IGkgPCBsZW5ndGg7IGkgKz0gNCkge1xuICAgICAgdmFyIGFscGhhID0gYnl0ZXNbaV07XG4gICAgICBpZiAoYWxwaGEgPT09IDApIHtcbiAgICAgICAgYnl0ZXNbaSAtIDNdID0gcjA7XG4gICAgICAgIGJ5dGVzW2kgLSAyXSA9IGcwO1xuICAgICAgICBieXRlc1tpIC0gMV0gPSBiMDtcbiAgICAgIH0gZWxzZSBpZiAoYWxwaGEgPCAyNTUpIHtcbiAgICAgICAgdmFyIGFscGhhXyA9IDI1NSAtIGFscGhhO1xuICAgICAgICBieXRlc1tpIC0gM10gPSAoYnl0ZXNbaSAtIDNdICogYWxwaGEgKyByMCAqIGFscGhhXykgPj4gODtcbiAgICAgICAgYnl0ZXNbaSAtIDJdID0gKGJ5dGVzW2kgLSAyXSAqIGFscGhhICsgZzAgKiBhbHBoYV8pID4+IDg7XG4gICAgICAgIGJ5dGVzW2kgLSAxXSA9IChieXRlc1tpIC0gMV0gKiBhbHBoYSArIGIwICogYWxwaGFfKSA+PiA4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBvc2VTTWFza0FscGhhKG1hc2tEYXRhLCBsYXllckRhdGEsIHRyYW5zZmVyTWFwKSB7XG4gICAgdmFyIGxlbmd0aCA9IG1hc2tEYXRhLmxlbmd0aDtcbiAgICB2YXIgc2NhbGUgPSAxIC8gMjU1O1xuICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIHZhciBhbHBoYSA9IHRyYW5zZmVyTWFwID8gdHJhbnNmZXJNYXBbbWFza0RhdGFbaV1dIDogbWFza0RhdGFbaV07XG4gICAgICBsYXllckRhdGFbaV0gPSAobGF5ZXJEYXRhW2ldICogYWxwaGEgKiBzY2FsZSkgfCAwO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBvc2VTTWFza0x1bWlub3NpdHkobWFza0RhdGEsIGxheWVyRGF0YSwgdHJhbnNmZXJNYXApIHtcbiAgICB2YXIgbGVuZ3RoID0gbWFza0RhdGEubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIHZhciB5ID1cbiAgICAgICAgbWFza0RhdGFbaSAtIDNdICogNzcgKyAvLyAqIDAuMyAvIDI1NSAqIDB4MTAwMDBcbiAgICAgICAgbWFza0RhdGFbaSAtIDJdICogMTUyICsgLy8gKiAwLjU5IC4uLi5cbiAgICAgICAgbWFza0RhdGFbaSAtIDFdICogMjg7IC8vICogMC4xMSAuLi4uXG4gICAgICBsYXllckRhdGFbaV0gPSB0cmFuc2Zlck1hcFxuICAgICAgICA/IChsYXllckRhdGFbaV0gKiB0cmFuc2Zlck1hcFt5ID4+IDhdKSA+PiA4XG4gICAgICAgIDogKGxheWVyRGF0YVtpXSAqIHkpID4+IDE2O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyaWNDb21wb3NlU01hc2soXG4gICAgbWFza0N0eCxcbiAgICBsYXllckN0eCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgc3VidHlwZSxcbiAgICBiYWNrZHJvcCxcbiAgICB0cmFuc2Zlck1hcFxuICApIHtcbiAgICB2YXIgaGFzQmFja2Ryb3AgPSAhIWJhY2tkcm9wO1xuICAgIHZhciByMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMF0gOiAwO1xuICAgIHZhciBnMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMV0gOiAwO1xuICAgIHZhciBiMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMl0gOiAwO1xuXG4gICAgdmFyIGNvbXBvc2VGbjtcbiAgICBpZiAoc3VidHlwZSA9PT0gXCJMdW1pbm9zaXR5XCIpIHtcbiAgICAgIGNvbXBvc2VGbiA9IGNvbXBvc2VTTWFza0x1bWlub3NpdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvc2VGbiA9IGNvbXBvc2VTTWFza0FscGhhO1xuICAgIH1cblxuICAgIC8vIHByb2Nlc3NpbmcgaW1hZ2UgaW4gY2h1bmtzIHRvIHNhdmUgbWVtb3J5XG4gICAgdmFyIFBJWEVMU19UT19QUk9DRVNTID0gMTA0ODU3NjtcbiAgICB2YXIgY2h1bmtTaXplID0gTWF0aC5taW4oaGVpZ2h0LCBNYXRoLmNlaWwoUElYRUxTX1RPX1BST0NFU1MgLyB3aWR0aCkpO1xuICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICs9IGNodW5rU2l6ZSkge1xuICAgICAgdmFyIGNodW5rSGVpZ2h0ID0gTWF0aC5taW4oY2h1bmtTaXplLCBoZWlnaHQgLSByb3cpO1xuICAgICAgdmFyIG1hc2tEYXRhID0gbWFza0N0eC5nZXRJbWFnZURhdGEoMCwgcm93LCB3aWR0aCwgY2h1bmtIZWlnaHQpO1xuICAgICAgdmFyIGxheWVyRGF0YSA9IGxheWVyQ3R4LmdldEltYWdlRGF0YSgwLCByb3csIHdpZHRoLCBjaHVua0hlaWdodCk7XG5cbiAgICAgIGlmIChoYXNCYWNrZHJvcCkge1xuICAgICAgICBjb21wb3NlU01hc2tCYWNrZHJvcChtYXNrRGF0YS5kYXRhLCByMCwgZzAsIGIwKTtcbiAgICAgIH1cbiAgICAgIGNvbXBvc2VGbihtYXNrRGF0YS5kYXRhLCBsYXllckRhdGEuZGF0YSwgdHJhbnNmZXJNYXApO1xuXG4gICAgICBtYXNrQ3R4LnB1dEltYWdlRGF0YShsYXllckRhdGEsIDAsIHJvdyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcG9zZVNNYXNrKGN0eCwgc21hc2ssIGxheWVyQ3R4LCB3ZWJHTENvbnRleHQpIHtcbiAgICB2YXIgbWFzayA9IHNtYXNrLmNhbnZhcztcbiAgICB2YXIgbWFza0N0eCA9IHNtYXNrLmNvbnRleHQ7XG5cbiAgICBjdHguc2V0VHJhbnNmb3JtKFxuICAgICAgc21hc2suc2NhbGVYLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICBzbWFzay5zY2FsZVksXG4gICAgICBzbWFzay5vZmZzZXRYLFxuICAgICAgc21hc2sub2Zmc2V0WVxuICAgICk7XG5cbiAgICB2YXIgYmFja2Ryb3AgPSBzbWFzay5iYWNrZHJvcCB8fCBudWxsO1xuICAgIGlmICghc21hc2sudHJhbnNmZXJNYXAgJiYgd2ViR0xDb250ZXh0LmlzRW5hYmxlZCkge1xuICAgICAgY29uc3QgY29tcG9zZWQgPSB3ZWJHTENvbnRleHQuY29tcG9zZVNNYXNrKHtcbiAgICAgICAgbGF5ZXI6IGxheWVyQ3R4LmNhbnZhcyxcbiAgICAgICAgbWFzayxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHN1YnR5cGU6IHNtYXNrLnN1YnR5cGUsXG4gICAgICAgICAgYmFja2Ryb3AsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICBjdHguZHJhd0ltYWdlKGNvbXBvc2VkLCBzbWFzay5vZmZzZXRYLCBzbWFzay5vZmZzZXRZKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2VuZXJpY0NvbXBvc2VTTWFzayhcbiAgICAgIG1hc2tDdHgsXG4gICAgICBsYXllckN0eCxcbiAgICAgIG1hc2sud2lkdGgsXG4gICAgICBtYXNrLmhlaWdodCxcbiAgICAgIHNtYXNrLnN1YnR5cGUsXG4gICAgICBiYWNrZHJvcCxcbiAgICAgIHNtYXNrLnRyYW5zZmVyTWFwXG4gICAgKTtcbiAgICBjdHguZHJhd0ltYWdlKG1hc2ssIDAsIDApO1xuICB9XG5cbiAgdmFyIExJTkVfQ0FQX1NUWUxFUyA9IFtcImJ1dHRcIiwgXCJyb3VuZFwiLCBcInNxdWFyZVwiXTtcbiAgdmFyIExJTkVfSk9JTl9TVFlMRVMgPSBbXCJtaXRlclwiLCBcInJvdW5kXCIsIFwiYmV2ZWxcIl07XG4gIHZhciBOT1JNQUxfQ0xJUCA9IHt9O1xuICB2YXIgRU9fQ0xJUCA9IHt9O1xuXG4gIENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZSA9IHtcbiAgICBiZWdpbkRyYXdpbmcoe1xuICAgICAgdHJhbnNmb3JtLFxuICAgICAgdmlld3BvcnQsXG4gICAgICB0cmFuc3BhcmVuY3kgPSBmYWxzZSxcbiAgICAgIGJhY2tncm91bmQgPSBudWxsLFxuICAgIH0pIHtcbiAgICAgIC8vIEZvciBwZGZzIHRoYXQgdXNlIGJsZW5kIG1vZGVzIHdlIGhhdmUgdG8gY2xlYXIgdGhlIGNhbnZhcyBlbHNlIGNlcnRhaW5cbiAgICAgIC8vIGJsZW5kIG1vZGVzIGNhbiBsb29rIHdyb25nIHNpbmNlIHdlJ2QgYmUgYmxlbmRpbmcgd2l0aCBhIHdoaXRlXG4gICAgICAvLyBiYWNrZHJvcC4gVGhlIHByb2JsZW0gd2l0aCBhIHRyYW5zcGFyZW50IGJhY2tkcm9wIHRob3VnaCBpcyB3ZSB0aGVuXG4gICAgICAvLyBkb24ndCBnZXQgc3ViIHBpeGVsIGFudGkgYWxpYXNpbmcgb24gdGV4dCwgY3JlYXRpbmcgdGVtcG9yYXJ5XG4gICAgICAvLyB0cmFuc3BhcmVudCBjYW52YXMgd2hlbiB3ZSBoYXZlIGJsZW5kIG1vZGVzLlxuICAgICAgdmFyIHdpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoO1xuICAgICAgdmFyIGhlaWdodCA9IHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7XG5cbiAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmQgfHwgXCJyZ2IoMjU1LCAyNTUsIDI1NSlcIjtcbiAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXG4gICAgICBpZiAodHJhbnNwYXJlbmN5KSB7XG4gICAgICAgIHZhciB0cmFuc3BhcmVudENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFxuICAgICAgICAgIFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbXBvc2l0ZUN0eCA9IHRoaXMuY3R4O1xuICAgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gdHJhbnNwYXJlbnRDYW52YXMuY2FudmFzO1xuICAgICAgICB0aGlzLmN0eCA9IHRyYW5zcGFyZW50Q2FudmFzLmNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgLy8gVGhlIHRyYW5zZm9ybSBjYW4gYmUgYXBwbGllZCBiZWZvcmUgcmVuZGVyaW5nLCB0cmFuc2ZlcnJpbmcgaXQgdG9cbiAgICAgICAgLy8gdGhlIG5ldyBjYW52YXMuXG4gICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseShcbiAgICAgICAgICB0aGlzLmN0eCxcbiAgICAgICAgICB0aGlzLmNvbXBvc2l0ZUN0eC5tb3pDdXJyZW50VHJhbnNmb3JtXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCB0cmFuc2Zvcm0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCB2aWV3cG9ydC50cmFuc2Zvcm0pO1xuXG4gICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLnNsaWNlKCk7XG5cbiAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5pbWFnZUxheWVyLmJlZ2luTGF5b3V0KCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGV4ZWN1dGVPcGVyYXRvckxpc3Q6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2V4ZWN1dGVPcGVyYXRvckxpc3QoXG4gICAgICBvcGVyYXRvckxpc3QsXG4gICAgICBleGVjdXRpb25TdGFydElkeCxcbiAgICAgIGNvbnRpbnVlQ2FsbGJhY2ssXG4gICAgICBzdGVwcGVyXG4gICAgKSB7XG4gICAgICB2YXIgYXJnc0FycmF5ID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheTtcbiAgICAgIHZhciBmbkFycmF5ID0gb3BlcmF0b3JMaXN0LmZuQXJyYXk7XG4gICAgICB2YXIgaSA9IGV4ZWN1dGlvblN0YXJ0SWR4IHx8IDA7XG4gICAgICB2YXIgYXJnc0FycmF5TGVuID0gYXJnc0FycmF5Lmxlbmd0aDtcblxuICAgICAgLy8gU29tZXRpbWVzIHRoZSBPcGVyYXRvckxpc3QgdG8gZXhlY3V0ZSBpcyBlbXB0eS5cbiAgICAgIGlmIChhcmdzQXJyYXlMZW4gPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjaHVua09wZXJhdGlvbnMgPVxuICAgICAgICBhcmdzQXJyYXlMZW4gLSBpID4gRVhFQ1VUSU9OX1NURVBTICYmXG4gICAgICAgIHR5cGVvZiBjb250aW51ZUNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICB2YXIgZW5kVGltZSA9IGNodW5rT3BlcmF0aW9ucyA/IERhdGUubm93KCkgKyBFWEVDVVRJT05fVElNRSA6IDA7XG4gICAgICB2YXIgc3RlcHMgPSAwO1xuXG4gICAgICB2YXIgY29tbW9uT2JqcyA9IHRoaXMuY29tbW9uT2JqcztcbiAgICAgIHZhciBvYmpzID0gdGhpcy5vYmpzO1xuICAgICAgdmFyIGZuSWQ7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChzdGVwcGVyICE9PSB1bmRlZmluZWQgJiYgaSA9PT0gc3RlcHBlci5uZXh0QnJlYWtQb2ludCkge1xuICAgICAgICAgIHN0ZXBwZXIuYnJlYWtJdChpLCBjb250aW51ZUNhbGxiYWNrKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuSWQgPSBmbkFycmF5W2ldO1xuXG4gICAgICAgIGlmIChmbklkICE9PSBPUFMuZGVwZW5kZW5jeSkge1xuICAgICAgICAgIHRoaXNbZm5JZF0uYXBwbHkodGhpcywgYXJnc0FycmF5W2ldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGRlcE9iaklkIG9mIGFyZ3NBcnJheVtpXSkge1xuICAgICAgICAgICAgY29uc3Qgb2Jqc1Bvb2wgPSBkZXBPYmpJZC5zdGFydHNXaXRoKFwiZ19cIikgPyBjb21tb25PYmpzIDogb2JqcztcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHByb21pc2UgaXNuJ3QgcmVzb2x2ZWQgeWV0LCBhZGQgdGhlIGNvbnRpbnVlQ2FsbGJhY2tcbiAgICAgICAgICAgIC8vIHRvIHRoZSBwcm9taXNlIGFuZCBiYWlsIG91dC5cbiAgICAgICAgICAgIGlmICghb2Jqc1Bvb2wuaGFzKGRlcE9iaklkKSkge1xuICAgICAgICAgICAgICBvYmpzUG9vbC5nZXQoZGVwT2JqSWQsIGNvbnRpbnVlQ2FsbGJhY2spO1xuICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG5cbiAgICAgICAgLy8gSWYgdGhlIGVudGlyZSBvcGVyYXRvckxpc3Qgd2FzIGV4ZWN1dGVkLCBzdG9wIGFzIHdlcmUgZG9uZS5cbiAgICAgICAgaWYgKGkgPT09IGFyZ3NBcnJheUxlbikge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGV4ZWN1dGlvbiB0b29rIGxvbmdlciB0aGVuIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZSBhbmRcbiAgICAgICAgLy8gYGNvbnRpbnVlQ2FsbGJhY2tgIGlzIHNwZWNpZmllZCwgaW50ZXJydXB0IHRoZSBleGVjdXRpb24uXG4gICAgICAgIGlmIChjaHVua09wZXJhdGlvbnMgJiYgKytzdGVwcyA+IEVYRUNVVElPTl9TVEVQUykge1xuICAgICAgICAgIGlmIChEYXRlLm5vdygpID4gZW5kVGltZSkge1xuICAgICAgICAgICAgY29udGludWVDYWxsYmFjaygpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ZXBzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBvcGVyYXRvckxpc3QgaXNuJ3QgZXhlY3V0ZWQgY29tcGxldGVseSB5ZXQgT1IgdGhlIGV4ZWN1dGlvblxuICAgICAgICAvLyB0aW1lIHdhcyBzaG9ydCBlbm91Z2gsIGRvIGFub3RoZXIgZXhlY3V0aW9uIHJvdW5kLlxuICAgICAgfVxuICAgIH0sXG5cbiAgICBlbmREcmF3aW5nOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmREcmF3aW5nKCkge1xuICAgICAgLy8gRmluaXNoaW5nIGFsbCBvcGVuZWQgb3BlcmF0aW9ucyBzdWNoIGFzIFNNYXNrIGdyb3VwIHBhaW50aW5nLlxuICAgICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVuZFNNYXNrR3JvdXAoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXG4gICAgICBpZiAodGhpcy50cmFuc3BhcmVudENhbnZhcykge1xuICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY29tcG9zaXRlQ3R4O1xuICAgICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTsgLy8gQXZvaWQgYXBwbHkgdHJhbnNmb3JtIHR3aWNlXG4gICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnRyYW5zcGFyZW50Q2FudmFzLCAwLCAwKTtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWNoZWRDYW52YXNlcy5jbGVhcigpO1xuICAgICAgdGhpcy53ZWJHTENvbnRleHQuY2xlYXIoKTtcblxuICAgICAgaWYgKHRoaXMuaW1hZ2VMYXllcikge1xuICAgICAgICB0aGlzLmltYWdlTGF5ZXIuZW5kTGF5b3V0KCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIEdyYXBoaWNzIHN0YXRlXG4gICAgc2V0TGluZVdpZHRoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMaW5lV2lkdGgod2lkdGgpIHtcbiAgICAgIHRoaXMuY3VycmVudC5saW5lV2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IHdpZHRoO1xuICAgIH0sXG4gICAgc2V0TGluZUNhcDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGluZUNhcChzdHlsZSkge1xuICAgICAgdGhpcy5jdHgubGluZUNhcCA9IExJTkVfQ0FQX1NUWUxFU1tzdHlsZV07XG4gICAgfSxcbiAgICBzZXRMaW5lSm9pbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGluZUpvaW4oc3R5bGUpIHtcbiAgICAgIHRoaXMuY3R4LmxpbmVKb2luID0gTElORV9KT0lOX1NUWUxFU1tzdHlsZV07XG4gICAgfSxcbiAgICBzZXRNaXRlckxpbWl0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRNaXRlckxpbWl0KGxpbWl0KSB7XG4gICAgICB0aGlzLmN0eC5taXRlckxpbWl0ID0gbGltaXQ7XG4gICAgfSxcbiAgICBzZXREYXNoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXREYXNoKGRhc2hBcnJheSwgZGFzaFBoYXNlKSB7XG4gICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICBpZiAoY3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3R4LnNldExpbmVEYXNoKGRhc2hBcnJheSk7XG4gICAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IGRhc2hQaGFzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHtcbiAgICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIGlnbm9yZWQgc2luY2Ugd2UgaGF2ZW4ndCBmb3VuZCBhIHVzZSBjYXNlIGZvciBpdCB5ZXQuXG4gICAgfSxcbiAgICBzZXRGbGF0bmVzcyhmbGF0bmVzcykge1xuICAgICAgLy8gVGhpcyBvcGVyYXRpb24gaXMgaWdub3JlZCBzaW5jZSB3ZSBoYXZlbid0IGZvdW5kIGEgdXNlIGNhc2UgZm9yIGl0IHlldC5cbiAgICB9LFxuICAgIHNldEdTdGF0ZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0R1N0YXRlKHN0YXRlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3RhdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIHN0YXRlID0gc3RhdGVzW2ldO1xuICAgICAgICB2YXIga2V5ID0gc3RhdGVbMF07XG4gICAgICAgIHZhciB2YWx1ZSA9IHN0YXRlWzFdO1xuXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgY2FzZSBcIkxXXCI6XG4gICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiTENcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4odmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIk1MXCI6XG4gICAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkRcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0RGFzaCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIlJJXCI6XG4gICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiRkxcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3ModmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkNBXCI6XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBzdGF0ZVsxXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSA9IHN0YXRlWzFdO1xuICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBzdGF0ZVsxXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJCTVwiOlxuICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiU01hc2tcIjpcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2spIHtcbiAgICAgICAgICAgICAgLy8gSWYgU01hc2sgaXMgY3VycnJlbmx5IHVzZWQsIGl0IG5lZWRzIHRvIGJlIHN1c3BlbmRlZCBvclxuICAgICAgICAgICAgICAvLyBmaW5pc2hlZC4gU3VzcGVuZCBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gYXQgbGVhc3Qgb25lIHNhdmUoKVxuICAgICAgICAgICAgICAvLyB3YXMgcGVyZm9ybWVkIGFuZCBzdGF0ZSBuZWVkcyB0byBiZSByZXZlcnRlZCBvbiByZXN0b3JlKCkuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlU3RhY2subGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVTdGFja1t0aGlzLnN0YXRlU3RhY2subGVuZ3RoIC0gMV0uYWN0aXZlU01hc2sgPT09XG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2tcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kU01hc2tHcm91cCgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kU01hc2tHcm91cCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSB2YWx1ZSA/IHRoaXMudGVtcFNNYXNrIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2spIHtcbiAgICAgICAgICAgICAgdGhpcy5iZWdpblNNYXNrR3JvdXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGVtcFNNYXNrID0gbnVsbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJUUlwiOlxuICAgICAgICAgICAgdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBiZWdpblNNYXNrR3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luU01hc2tHcm91cCgpIHtcbiAgICAgIHZhciBhY3RpdmVTTWFzayA9IHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaztcbiAgICAgIHZhciBkcmF3bldpZHRoID0gYWN0aXZlU01hc2suY2FudmFzLndpZHRoO1xuICAgICAgdmFyIGRyYXduSGVpZ2h0ID0gYWN0aXZlU01hc2suY2FudmFzLmhlaWdodDtcbiAgICAgIHZhciBjYWNoZUlkID0gXCJzbWFza0dyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICAgIHZhciBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXG4gICAgICAgIGNhY2hlSWQsXG4gICAgICAgIGRyYXduV2lkdGgsXG4gICAgICAgIGRyYXduSGVpZ2h0LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICB2YXIgY3VycmVudEN0eCA9IHRoaXMuY3R4O1xuICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBjdXJyZW50Q3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG5cbiAgICAgIHZhciBncm91cEN0eCA9IHNjcmF0Y2hDYW52YXMuY29udGV4dDtcbiAgICAgIGdyb3VwQ3R4LnNjYWxlKDEgLyBhY3RpdmVTTWFzay5zY2FsZVgsIDEgLyBhY3RpdmVTTWFzay5zY2FsZVkpO1xuICAgICAgZ3JvdXBDdHgudHJhbnNsYXRlKC1hY3RpdmVTTWFzay5vZmZzZXRYLCAtYWN0aXZlU01hc2sub2Zmc2V0WSk7XG4gICAgICBncm91cEN0eC50cmFuc2Zvcm0uYXBwbHkoZ3JvdXBDdHgsIGN1cnJlbnRUcmFuc2Zvcm0pO1xuXG4gICAgICBhY3RpdmVTTWFzay5zdGFydFRyYW5zZm9ybUludmVyc2UgPSBncm91cEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTtcblxuICAgICAgY29weUN0eFN0YXRlKGN1cnJlbnRDdHgsIGdyb3VwQ3R4KTtcbiAgICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7XG4gICAgICB0aGlzLnNldEdTdGF0ZShbXG4gICAgICAgIFtcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sXG4gICAgICAgIFtcImNhXCIsIDFdLFxuICAgICAgICBbXCJDQVwiLCAxXSxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5ncm91cFN0YWNrLnB1c2goY3VycmVudEN0eCk7XG4gICAgICB0aGlzLmdyb3VwTGV2ZWwrKztcbiAgICB9LFxuICAgIHN1c3BlbmRTTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRTTWFza0dyb3VwKCkge1xuICAgICAgLy8gU2ltaWxhciB0byBlbmRTTWFza0dyb3VwLCB0aGUgaW50ZXJtZWRpYXRlIGNhbnZhcyBoYXMgdG8gYmUgY29tcG9zZWRcbiAgICAgIC8vIGFuZCBmdXR1cmUgY3R4IHN0YXRlIHJlc3RvcmVkLlxuICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdHg7XG4gICAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpO1xuXG4gICAgICBjb21wb3NlU01hc2soXG4gICAgICAgIHRoaXMuY3R4LFxuICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2ssXG4gICAgICAgIGdyb3VwQ3R4LFxuICAgICAgICB0aGlzLndlYkdMQ29udGV4dFxuICAgICAgKTtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuY3R4LnNhdmUoKTsgLy8gc2F2ZSBpcyBuZWVkZWQgc2luY2UgU01hc2sgd2lsbCBiZSByZXN1bWVkLlxuICAgICAgY29weUN0eFN0YXRlKGdyb3VwQ3R4LCB0aGlzLmN0eCk7XG5cbiAgICAgIC8vIFNhdmluZyBzdGF0ZSBmb3IgcmVzdW1pbmcuXG4gICAgICB0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHggPSBncm91cEN0eDtcbiAgICAgIC8vIFRyYW5zZm9ybSB3YXMgY2hhbmdlZCBpbiB0aGUgU01hc2sgY2FudmFzLCByZWZsZWN0aW5nIHRoaXMgY2hhbmdlIG9uXG4gICAgICAvLyB0aGlzLmN0eC5cbiAgICAgIHZhciBkZWx0YVRyYW5zZm9ybSA9IFV0aWwudHJhbnNmb3JtKFxuICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2suc3RhcnRUcmFuc2Zvcm1JbnZlcnNlLFxuICAgICAgICBncm91cEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtXG4gICAgICApO1xuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCBkZWx0YVRyYW5zZm9ybSk7XG5cbiAgICAgIC8vIFNNYXNrIHdhcyBjb21wb3NlZCwgdGhlIHJlc3VsdHMgYXQgdGhlIGdyb3VwQ3R4IGNhbiBiZSBjbGVhcmVkLlxuICAgICAgZ3JvdXBDdHguc2F2ZSgpO1xuICAgICAgZ3JvdXBDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgZ3JvdXBDdHguY2xlYXJSZWN0KDAsIDAsIGdyb3VwQ3R4LmNhbnZhcy53aWR0aCwgZ3JvdXBDdHguY2FudmFzLmhlaWdodCk7XG4gICAgICBncm91cEN0eC5yZXN0b3JlKCk7XG4gICAgfSxcbiAgICByZXN1bWVTTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRTTWFza0dyb3VwKCkge1xuICAgICAgLy8gUmVzdW1pbmcgc3RhdGUgc2F2ZWQgYnkgc3VzcGVuZFNNYXNrR3JvdXAuIFdlIGRvbid0IG5lZWQgdG8gcmVzdG9yZVxuICAgICAgLy8gYW55IGdyb3VwQ3R4IHN0YXRlIHNpbmNlIHJlc3RvcmUoKSBjb21tYW5kICh0aGUgb25seSBjYWxsZXIpIHdpbGwgZG9cbiAgICAgIC8vIHRoYXQgZm9yIHVzLiBTZWUgYWxzbyBiZWdpblNNYXNrR3JvdXAuXG4gICAgICB2YXIgZ3JvdXBDdHggPSB0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHg7XG4gICAgICB2YXIgY3VycmVudEN0eCA9IHRoaXMuY3R4O1xuICAgICAgdGhpcy5jdHggPSBncm91cEN0eDtcbiAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGN1cnJlbnRDdHgpO1xuICAgICAgdGhpcy5ncm91cExldmVsKys7XG4gICAgfSxcbiAgICBlbmRTTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRTTWFza0dyb3VwKCkge1xuICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdHg7XG4gICAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpO1xuXG4gICAgICBjb21wb3NlU01hc2soXG4gICAgICAgIHRoaXMuY3R4LFxuICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2ssXG4gICAgICAgIGdyb3VwQ3R4LFxuICAgICAgICB0aGlzLndlYkdMQ29udGV4dFxuICAgICAgKTtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIGNvcHlDdHhTdGF0ZShncm91cEN0eCwgdGhpcy5jdHgpO1xuICAgICAgLy8gVHJhbnNmb3JtIHdhcyBjaGFuZ2VkIGluIHRoZSBTTWFzayBjYW52YXMsIHJlZmxlY3RpbmcgdGhpcyBjaGFuZ2Ugb25cbiAgICAgIC8vIHRoaXMuY3R4LlxuICAgICAgdmFyIGRlbHRhVHJhbnNmb3JtID0gVXRpbC50cmFuc2Zvcm0oXG4gICAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzay5zdGFydFRyYW5zZm9ybUludmVyc2UsXG4gICAgICAgIGdyb3VwQ3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1cbiAgICAgICk7XG4gICAgICB0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsIGRlbHRhVHJhbnNmb3JtKTtcbiAgICB9LFxuICAgIHNhdmU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NhdmUoKSB7XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB2YXIgb2xkID0gdGhpcy5jdXJyZW50O1xuICAgICAgdGhpcy5zdGF0ZVN0YWNrLnB1c2gob2xkKTtcbiAgICAgIHRoaXMuY3VycmVudCA9IG9sZC5jbG9uZSgpO1xuICAgICAgdGhpcy5jdXJyZW50LnJlc3VtZVNNYXNrQ3R4ID0gbnVsbDtcbiAgICB9LFxuICAgIHJlc3RvcmU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3Jlc3RvcmUoKSB7XG4gICAgICAvLyBTTWFzayB3YXMgc3VzcGVuZGVkLCB3ZSBqdXN0IG5lZWQgdG8gcmVzdW1lIGl0LlxuICAgICAgaWYgKHRoaXMuY3VycmVudC5yZXN1bWVTTWFza0N0eCkge1xuICAgICAgICB0aGlzLnJlc3VtZVNNYXNrR3JvdXAoKTtcbiAgICAgIH1cbiAgICAgIC8vIFNNYXNrIGhhcyB0byBiZSBmaW5pc2hlZCBvbmNlIHRoZXJlIGlzIG5vIHN0YXRlcyB0aGF0IGFyZSB1c2luZyB0aGVcbiAgICAgIC8vIHNhbWUgU01hc2suXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAhPT0gbnVsbCAmJlxuICAgICAgICAodGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgIHRoaXMuc3RhdGVTdGFja1t0aGlzLnN0YXRlU3RhY2subGVuZ3RoIC0gMV0uYWN0aXZlU01hc2sgIT09XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2spXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lbmRTTWFza0dyb3VwKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuc3RhdGVTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjbGlwcGluZyBwYXRoIGlzIHJlc2V0IChmaXhlcyBpc3N1ZTY0MTMucGRmKS5cbiAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3RyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG5cbiAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyBQYXRoXG4gICAgY29uc3RydWN0UGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY29uc3RydWN0UGF0aChvcHMsIGFyZ3MpIHtcbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgdmFyIHggPSBjdXJyZW50LngsXG4gICAgICAgIHkgPSBjdXJyZW50Lnk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDAsIGlpID0gb3BzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgc3dpdGNoIChvcHNbaV0gfCAwKSB7XG4gICAgICAgICAgY2FzZSBPUFMucmVjdGFuZ2xlOlxuICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgICB2YXIgd2lkdGggPSBhcmdzW2orK107XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIGN0eC5saW5lV2lkdGggPCB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSkge1xuICAgICAgICAgICAgICB3aWR0aCA9IHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhlaWdodCA9PT0gMCAmJiBjdHgubGluZVdpZHRoIDwgdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpIHtcbiAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeHcgPSB4ICsgd2lkdGg7XG4gICAgICAgICAgICB2YXIgeWggPSB5ICsgaGVpZ2h0O1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHkpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeWgpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5aCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubW92ZVRvOlxuICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubGluZVRvOlxuICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgICBjdHgubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzpcbiAgICAgICAgICAgIHggPSBhcmdzW2ogKyA0XTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2ogKyA1XTtcbiAgICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgICAgICBhcmdzW2pdLFxuICAgICAgICAgICAgICBhcmdzW2ogKyAxXSxcbiAgICAgICAgICAgICAgYXJnc1tqICsgMl0sXG4gICAgICAgICAgICAgIGFyZ3NbaiArIDNdLFxuICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICB5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaiArPSA2O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzI6XG4gICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgYXJnc1tqXSxcbiAgICAgICAgICAgICAgYXJnc1tqICsgMV0sXG4gICAgICAgICAgICAgIGFyZ3NbaiArIDJdLFxuICAgICAgICAgICAgICBhcmdzW2ogKyAzXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcbiAgICAgICAgICAgIGogKz0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8zOlxuICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDJdO1xuICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oYXJnc1tqXSwgYXJnc1tqICsgMV0sIHgsIHksIHgsIHkpO1xuICAgICAgICAgICAgaiArPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuY2xvc2VQYXRoOlxuICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpO1xuICAgIH0sXG4gICAgY2xvc2VQYXRoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbG9zZVBhdGgoKSB7XG4gICAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTtcbiAgICB9LFxuICAgIHN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc3Ryb2tlKGNvbnN1bWVQYXRoKSB7XG4gICAgICBjb25zdW1lUGF0aCA9IHR5cGVvZiBjb25zdW1lUGF0aCAhPT0gXCJ1bmRlZmluZWRcIiA/IGNvbnN1bWVQYXRoIDogdHJ1ZTtcbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgIHZhciBzdHJva2VDb2xvciA9IHRoaXMuY3VycmVudC5zdHJva2VDb2xvcjtcbiAgICAgIC8vIEZvciBzdHJva2Ugd2Ugd2FudCB0byB0ZW1wb3JhcmlseSBjaGFuZ2UgdGhlIGdsb2JhbCBhbHBoYSB0byB0aGVcbiAgICAgIC8vIHN0cm9raW5nIGFscGhhLlxuICAgICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhO1xuICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHN0cm9rZUNvbG9yICYmXG4gICAgICAgICAgc3Ryb2tlQ29sb3IuaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpICYmXG4gICAgICAgICAgc3Ryb2tlQ29sb3IudHlwZSA9PT0gXCJQYXR0ZXJuXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gZm9yIHBhdHRlcm5zLCB3ZSB0cmFuc2Zvcm0gdG8gcGF0dGVybiBzcGFjZSwgY2FsY3VsYXRlXG4gICAgICAgICAgLy8gdGhlIHBhdHRlcm4sIGNhbGwgc3Ryb2tlLCBhbmQgcmVzdG9yZSB0byB1c2VyIHNwYWNlXG4gICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAvLyBUaGUgY3VycmVudCB0cmFuc2Zvcm0gd2lsbCBiZSByZXBsYWNlZCB3aGlsZSBidWlsZGluZyB0aGUgcGF0dGVybixcbiAgICAgICAgICAvLyBidXQgdGhlIGxpbmUgd2lkdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgdGhlIGN1cnJlbnQgdHJhbnNmb3JtLFxuICAgICAgICAgIC8vIHNvIHdlIG11c3Qgc2NhbGUgaXQuIFRvIHByb3Blcmx5IGZpeCB0aGlzIHdlIHNob3VsZCBiZSB1c2luZyBhXG4gICAgICAgICAgLy8gcGF0dGVybiB0cmFuc2Zvcm0gaW5zdGVhZCAoc2VlICMxMDk1NSkuXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07XG4gICAgICAgICAgY29uc3Qgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRyYW5zZm9ybSlbMF07XG4gICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMpO1xuICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBNYXRoLm1heChcbiAgICAgICAgICAgIHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpICogTUlOX1dJRFRIX0ZBQ1RPUixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5saW5lV2lkdGggKiBzY2FsZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUHJldmVudCBkcmF3aW5nIHRvbyB0aGluIGxpbmVzIGJ5IGVuZm9yY2luZyBhIG1pbmltdW0gbGluZSB3aWR0aC5cbiAgICAgICAgICBjdHgubGluZVdpZHRoID0gTWF0aC5tYXgoXG4gICAgICAgICAgICB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSAqIE1JTl9XSURUSF9GQUNUT1IsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25zdW1lUGF0aCkge1xuICAgICAgICB0aGlzLmNvbnN1bWVQYXRoKCk7XG4gICAgICB9XG4gICAgICAvLyBSZXN0b3JlIHRoZSBnbG9iYWwgYWxwaGEgdG8gdGhlIGZpbGwgYWxwaGFcbiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5maWxsQWxwaGE7XG4gICAgfSxcbiAgICBjbG9zZVN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VTdHJva2UoKSB7XG4gICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICB9LFxuICAgIGZpbGw6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2ZpbGwoY29uc3VtZVBhdGgpIHtcbiAgICAgIGNvbnN1bWVQYXRoID0gdHlwZW9mIGNvbnN1bWVQYXRoICE9PSBcInVuZGVmaW5lZFwiID8gY29uc3VtZVBhdGggOiB0cnVlO1xuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgdmFyIGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgICB2YXIgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICAgIHZhciBuZWVkUmVzdG9yZSA9IGZhbHNlO1xuXG4gICAgICBpZiAoaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBpZiAodGhpcy5iYXNlVHJhbnNmb3JtKSB7XG4gICAgICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcyk7XG4gICAgICAgIG5lZWRSZXN0b3JlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0VPRmlsbCkge1xuICAgICAgICAgIGN0eC5maWxsKFwiZXZlbm9kZFwiKTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZWVkUmVzdG9yZSkge1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnN1bWVQYXRoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZVBhdGgoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVvRmlsbDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW9GaWxsKCkge1xuICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmlsbCgpO1xuICAgIH0sXG4gICAgZmlsbFN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZmlsbFN0cm9rZSgpIHtcbiAgICAgIHRoaXMuZmlsbChmYWxzZSk7XG4gICAgICB0aGlzLnN0cm9rZShmYWxzZSk7XG5cbiAgICAgIHRoaXMuY29uc3VtZVBhdGgoKTtcbiAgICB9LFxuICAgIGVvRmlsbFN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW9GaWxsU3Ryb2tlKCkge1xuICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgIH0sXG4gICAgY2xvc2VGaWxsU3Ryb2tlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbG9zZUZpbGxTdHJva2UoKSB7XG4gICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgfSxcbiAgICBjbG9zZUVPRmlsbFN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VFT0ZpbGxTdHJva2UoKSB7XG4gICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlO1xuICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgIH0sXG4gICAgZW5kUGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kUGF0aCgpIHtcbiAgICAgIHRoaXMuY29uc3VtZVBhdGgoKTtcbiAgICB9LFxuXG4gICAgLy8gQ2xpcHBpbmdcbiAgICBjbGlwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbGlwKCkge1xuICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IE5PUk1BTF9DTElQO1xuICAgIH0sXG4gICAgZW9DbGlwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lb0NsaXAoKSB7XG4gICAgICB0aGlzLnBlbmRpbmdDbGlwID0gRU9fQ0xJUDtcbiAgICB9LFxuXG4gICAgLy8gVGV4dFxuICAgIGJlZ2luVGV4dDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5UZXh0KCkge1xuICAgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVg7XG4gICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZID0gMDtcbiAgICB9LFxuICAgIGVuZFRleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFRleHQoKSB7XG4gICAgICB2YXIgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHM7XG4gICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICBpZiAocGF0aHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHBhdGgudHJhbnNmb3JtKTtcbiAgICAgICAgY3R4LnRyYW5zbGF0ZShwYXRoLngsIHBhdGgueSk7XG4gICAgICAgIHBhdGguYWRkVG9QYXRoKGN0eCwgcGF0aC5mb250U2l6ZSk7XG4gICAgICB9XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgY3R4LmNsaXAoKTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdUZXh0UGF0aHM7XG4gICAgfSxcbiAgICBzZXRDaGFyU3BhY2luZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Q2hhclNwYWNpbmcoc3BhY2luZykge1xuICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gc3BhY2luZztcbiAgICB9LFxuICAgIHNldFdvcmRTcGFjaW5nOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRXb3JkU3BhY2luZyhzcGFjaW5nKSB7XG4gICAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSBzcGFjaW5nO1xuICAgIH0sXG4gICAgc2V0SFNjYWxlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRIU2NhbGUoc2NhbGUpIHtcbiAgICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gc2NhbGUgLyAxMDA7XG4gICAgfSxcbiAgICBzZXRMZWFkaW5nOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMZWFkaW5nKGxlYWRpbmcpIHtcbiAgICAgIHRoaXMuY3VycmVudC5sZWFkaW5nID0gLWxlYWRpbmc7XG4gICAgfSxcbiAgICBzZXRGb250OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRGb250KGZvbnRSZWZOYW1lLCBzaXplKSB7XG4gICAgICB2YXIgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZm9udFJlZk5hbWUpO1xuICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cbiAgICAgIGlmICghZm9udE9iaikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGZpbmQgZm9udCBmb3IgJHtmb250UmVmTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudC5mb250TWF0cml4ID0gZm9udE9iai5mb250TWF0cml4XG4gICAgICAgID8gZm9udE9iai5mb250TWF0cml4XG4gICAgICAgIDogRk9OVF9JREVOVElUWV9NQVRSSVg7XG5cbiAgICAgIC8vIEEgdmFsaWQgbWF0cml4IG5lZWRzIGFsbCBtYWluIGRpYWdvbmFsIGVsZW1lbnRzIHRvIGJlIG5vbi16ZXJvXG4gICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyB3ZSBieXBhc3MgRkYgYnVnemlsbGEgYnVnICM3MTk4NDQuXG4gICAgICBpZiAoY3VycmVudC5mb250TWF0cml4WzBdID09PSAwIHx8IGN1cnJlbnQuZm9udE1hdHJpeFszXSA9PT0gMCkge1xuICAgICAgICB3YXJuKFwiSW52YWxpZCBmb250IG1hdHJpeCBmb3IgZm9udCBcIiArIGZvbnRSZWZOYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHNwZWMgZm9yIFRmIChzZXRGb250KSBzYXlzIHRoYXQgJ3NpemUnIHNwZWNpZmllcyB0aGUgZm9udCAnc2NhbGUnLFxuICAgICAgLy8gYW5kIGluIHNvbWUgZG9jcyB0aGlzIGNhbiBiZSBuZWdhdGl2ZSAoaW52ZXJ0ZWQgeC15IGF4ZXMpLlxuICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgIHNpemUgPSAtc2l6ZTtcbiAgICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAxO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnQuZm9udCA9IGZvbnRPYmo7XG4gICAgICB0aGlzLmN1cnJlbnQuZm9udFNpemUgPSBzaXplO1xuXG4gICAgICBpZiAoZm9udE9iai5pc1R5cGUzRm9udCkge1xuICAgICAgICByZXR1cm47IC8vIHdlIGRvbid0IG5lZWQgY3R4LmZvbnQgZm9yIFR5cGUzIGZvbnRzXG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gZm9udE9iai5sb2FkZWROYW1lIHx8IFwic2Fucy1zZXJpZlwiO1xuXG4gICAgICBsZXQgYm9sZCA9IFwibm9ybWFsXCI7XG4gICAgICBpZiAoZm9udE9iai5ibGFjaykge1xuICAgICAgICBib2xkID0gXCI5MDBcIjtcbiAgICAgIH0gZWxzZSBpZiAoZm9udE9iai5ib2xkKSB7XG4gICAgICAgIGJvbGQgPSBcImJvbGRcIjtcbiAgICAgIH1cbiAgICAgIHZhciBpdGFsaWMgPSBmb250T2JqLml0YWxpYyA/IFwiaXRhbGljXCIgOiBcIm5vcm1hbFwiO1xuICAgICAgdmFyIHR5cGVmYWNlID0gYFwiJHtuYW1lfVwiLCAke2ZvbnRPYmouZmFsbGJhY2tOYW1lfWA7XG5cbiAgICAgIC8vIFNvbWUgZm9udCBiYWNrZW5kcyBjYW5ub3QgaGFuZGxlIGZvbnRzIGJlbG93IGNlcnRhaW4gc2l6ZS5cbiAgICAgIC8vIEtlZXBpbmcgdGhlIGZvbnQgYXQgbWluaW1hbCBzaXplIGFuZCB1c2luZyB0aGUgZm9udFNpemVTY2FsZSB0byBjaGFuZ2VcbiAgICAgIC8vIHRoZSBjdXJyZW50IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBiZWZvcmUgdGhlIGZpbGxUZXh0L3N0cm9rZVRleHQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2MjI3XG4gICAgICBsZXQgYnJvd3NlckZvbnRTaXplID0gc2l6ZTtcbiAgICAgIGlmIChzaXplIDwgTUlOX0ZPTlRfU0laRSkge1xuICAgICAgICBicm93c2VyRm9udFNpemUgPSBNSU5fRk9OVF9TSVpFO1xuICAgICAgfSBlbHNlIGlmIChzaXplID4gTUFYX0ZPTlRfU0laRSkge1xuICAgICAgICBicm93c2VyRm9udFNpemUgPSBNQVhfRk9OVF9TSVpFO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGUgPSBzaXplIC8gYnJvd3NlckZvbnRTaXplO1xuXG4gICAgICB0aGlzLmN0eC5mb250ID0gYCR7aXRhbGljfSAke2JvbGR9ICR7YnJvd3NlckZvbnRTaXplfXB4ICR7dHlwZWZhY2V9YDtcbiAgICB9LFxuICAgIHNldFRleHRSZW5kZXJpbmdNb2RlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRUZXh0UmVuZGVyaW5nTW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPSBtb2RlO1xuICAgIH0sXG4gICAgc2V0VGV4dFJpc2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFRleHRSaXNlKHJpc2UpIHtcbiAgICAgIHRoaXMuY3VycmVudC50ZXh0UmlzZSA9IHJpc2U7XG4gICAgfSxcbiAgICBtb3ZlVGV4dDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfbW92ZVRleHQoeCwgeSkge1xuICAgICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggKz0geDtcbiAgICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZICs9IHk7XG4gICAgfSxcbiAgICBzZXRMZWFkaW5nTW92ZVRleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExlYWRpbmdNb3ZlVGV4dCh4LCB5KSB7XG4gICAgICB0aGlzLnNldExlYWRpbmcoLXkpO1xuICAgICAgdGhpcy5tb3ZlVGV4dCh4LCB5KTtcbiAgICB9LFxuICAgIHNldFRleHRNYXRyaXg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuXG4gICAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gICAgfSxcbiAgICBuZXh0TGluZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfbmV4dExpbmUoKSB7XG4gICAgICB0aGlzLm1vdmVUZXh0KDAsIHRoaXMuY3VycmVudC5sZWFkaW5nKTtcbiAgICB9LFxuXG4gICAgcGFpbnRDaGFyKGNoYXJhY3RlciwgeCwgeSwgcGF0dGVyblRyYW5zZm9ybSkge1xuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICB2YXIgZm9udCA9IGN1cnJlbnQuZm9udDtcbiAgICAgIHZhciB0ZXh0UmVuZGVyaW5nTW9kZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGU7XG4gICAgICB2YXIgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplIC8gY3VycmVudC5mb250U2l6ZVNjYWxlO1xuICAgICAgdmFyIGZpbGxTdHJva2VNb2RlID1cbiAgICAgICAgdGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO1xuICAgICAgdmFyIGlzQWRkVG9QYXRoU2V0ID0gISEoXG4gICAgICAgIHRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBR1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhdHRlcm5GaWxsID0gY3VycmVudC5wYXR0ZXJuRmlsbCAmJiAhZm9udC5taXNzaW5nRmlsZTtcblxuICAgICAgdmFyIGFkZFRvUGF0aDtcbiAgICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBpc0FkZFRvUGF0aFNldCB8fCBwYXR0ZXJuRmlsbCkge1xuICAgICAgICBhZGRUb1BhdGggPSBmb250LmdldFBhdGhHZW5lcmF0b3IodGhpcy5jb21tb25PYmpzLCBjaGFyYWN0ZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9udC5kaXNhYmxlRm9udEZhY2UgfHwgcGF0dGVybkZpbGwpIHtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBhZGRUb1BhdGgoY3R4LCBmb250U2l6ZSk7XG4gICAgICAgIGlmIChwYXR0ZXJuVHJhbnNmb3JtKSB7XG4gICAgICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fFxuICAgICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRVxuICAgICAgICApIHtcbiAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8XG4gICAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFXG4gICAgICAgICkge1xuICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8XG4gICAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFXG4gICAgICAgICkge1xuICAgICAgICAgIGN0eC5maWxsVGV4dChjaGFyYWN0ZXIsIHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8XG4gICAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFXG4gICAgICAgICkge1xuICAgICAgICAgIGN0eC5zdHJva2VUZXh0KGNoYXJhY3RlciwgeCwgeSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQWRkVG9QYXRoU2V0KSB7XG4gICAgICAgIHZhciBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRocyB8fCAodGhpcy5wZW5kaW5nVGV4dFBhdGhzID0gW10pO1xuICAgICAgICBwYXRocy5wdXNoKHtcbiAgICAgICAgICB0cmFuc2Zvcm06IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLFxuICAgICAgICAgIHgsXG4gICAgICAgICAgeSxcbiAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICBhZGRUb1BhdGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXQgaXNGb250U3VicGl4ZWxBQUVuYWJsZWQoKSB7XG4gICAgICAvLyBDaGVja3MgaWYgYW50aS1hbGlhc2luZyBpcyBlbmFibGVkIHdoZW4gc2NhbGVkIHRleHQgaXMgcGFpbnRlZC5cbiAgICAgIC8vIE9uIFdpbmRvd3MgR0RJIHNjYWxlZCBmb250cyBsb29rcyBiYWQuXG4gICAgICBjb25zdCB7IGNvbnRleHQ6IGN0eCB9ID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXG4gICAgICAgIFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIixcbiAgICAgICAgMTAsXG4gICAgICAgIDEwXG4gICAgICApO1xuICAgICAgY3R4LnNjYWxlKDEuNSwgMSk7XG4gICAgICBjdHguZmlsbFRleHQoXCJJXCIsIDAsIDEwKTtcbiAgICAgIHZhciBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMCwgMTApLmRhdGE7XG4gICAgICB2YXIgZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDM7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChkYXRhW2ldID4gMCAmJiBkYXRhW2ldIDwgMjU1KSB7XG4gICAgICAgICAgZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCBlbmFibGVkKTtcbiAgICB9LFxuXG4gICAgc2hvd1RleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3Nob3dUZXh0KGdseXBocykge1xuICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICB2YXIgZm9udCA9IGN1cnJlbnQuZm9udDtcbiAgICAgIGlmIChmb250LmlzVHlwZTNGb250KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQoZ2x5cGhzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTtcbiAgICAgIGlmIChmb250U2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICB2YXIgZm9udFNpemVTY2FsZSA9IGN1cnJlbnQuZm9udFNpemVTY2FsZTtcbiAgICAgIHZhciBjaGFyU3BhY2luZyA9IGN1cnJlbnQuY2hhclNwYWNpbmc7XG4gICAgICB2YXIgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nO1xuICAgICAgdmFyIGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG4gICAgICB2YXIgdGV4dEhTY2FsZSA9IGN1cnJlbnQudGV4dEhTY2FsZSAqIGZvbnREaXJlY3Rpb247XG4gICAgICB2YXIgZ2x5cGhzTGVuZ3RoID0gZ2x5cGhzLmxlbmd0aDtcbiAgICAgIHZhciB2ZXJ0aWNhbCA9IGZvbnQudmVydGljYWw7XG4gICAgICB2YXIgc3BhY2luZ0RpciA9IHZlcnRpY2FsID8gMSA6IC0xO1xuICAgICAgdmFyIGRlZmF1bHRWTWV0cmljcyA9IGZvbnQuZGVmYXVsdFZNZXRyaWNzO1xuICAgICAgdmFyIHdpZHRoQWR2YW5jZVNjYWxlID0gZm9udFNpemUgKiBjdXJyZW50LmZvbnRNYXRyaXhbMF07XG5cbiAgICAgIHZhciBzaW1wbGVGaWxsVGV4dCA9XG4gICAgICAgIGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiZcbiAgICAgICAgIWZvbnQuZGlzYWJsZUZvbnRGYWNlICYmXG4gICAgICAgICFjdXJyZW50LnBhdHRlcm5GaWxsO1xuXG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgbGV0IHBhdHRlcm5UcmFuc2Zvcm07XG4gICAgICBpZiAoY3VycmVudC5wYXR0ZXJuRmlsbCkge1xuICAgICAgICAvLyBUT0RPOiBQYXR0ZXJucyBhcmUgbm90IGFwcGxpZWQgY29ycmVjdGx5IHRvIHRleHQgaWYgYSBub24tZW1iZWRkZWRcbiAgICAgICAgLy8gZm9udCBpcyB1c2VkLiBFLmcuIGlzc3VlIDgxMTEgYW5kIFNob3dUZXh0LVNoYWRpbmdQYXR0ZXJuLnBkZi5cbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IGN1cnJlbnQuZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzKTtcbiAgICAgICAgcGF0dGVyblRyYW5zZm9ybSA9IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgICAgIH1cbiAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCBjdXJyZW50LnRleHRNYXRyaXgpO1xuICAgICAgY3R4LnRyYW5zbGF0ZShjdXJyZW50LngsIGN1cnJlbnQueSArIGN1cnJlbnQudGV4dFJpc2UpO1xuXG4gICAgICBpZiAoZm9udERpcmVjdGlvbiA+IDApIHtcbiAgICAgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIC0xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAxKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxpbmVXaWR0aCA9IGN1cnJlbnQubGluZVdpZHRoO1xuICAgICAgdmFyIHNjYWxlID0gY3VycmVudC50ZXh0TWF0cml4U2NhbGU7XG4gICAgICBpZiAoc2NhbGUgPT09IDAgfHwgbGluZVdpZHRoID09PSAwKSB7XG4gICAgICAgIHZhciBmaWxsU3Ryb2tlTW9kZSA9XG4gICAgICAgICAgY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8XG4gICAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICAgIGxpbmVXaWR0aCA9IHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpICogTUlOX1dJRFRIX0ZBQ1RPUjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZVdpZHRoIC89IHNjYWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9udFNpemVTY2FsZSAhPT0gMS4wKSB7XG4gICAgICAgIGN0eC5zY2FsZShmb250U2l6ZVNjYWxlLCBmb250U2l6ZVNjYWxlKTtcbiAgICAgICAgbGluZVdpZHRoIC89IGZvbnRTaXplU2NhbGU7XG4gICAgICB9XG5cbiAgICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG5cbiAgICAgIHZhciB4ID0gMCxcbiAgICAgICAgaTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICAgIGlmIChpc051bShnbHlwaCkpIHtcbiAgICAgICAgICB4ICs9IChzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSkgLyAxMDAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3RvcmVOZWVkZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZztcbiAgICAgICAgdmFyIGNoYXJhY3RlciA9IGdseXBoLmZvbnRDaGFyO1xuICAgICAgICB2YXIgYWNjZW50ID0gZ2x5cGguYWNjZW50O1xuICAgICAgICB2YXIgc2NhbGVkWCwgc2NhbGVkWSwgc2NhbGVkQWNjZW50WCwgc2NhbGVkQWNjZW50WTtcbiAgICAgICAgdmFyIHdpZHRoID0gZ2x5cGgud2lkdGg7XG4gICAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICAgIHZhciB2bWV0cmljLCB2eCwgdnk7XG4gICAgICAgICAgdm1ldHJpYyA9IGdseXBoLnZtZXRyaWMgfHwgZGVmYXVsdFZNZXRyaWNzO1xuICAgICAgICAgIHZ4ID0gZ2x5cGgudm1ldHJpYyA/IHZtZXRyaWNbMV0gOiB3aWR0aCAqIDAuNTtcbiAgICAgICAgICB2eCA9IC12eCAqIHdpZHRoQWR2YW5jZVNjYWxlO1xuICAgICAgICAgIHZ5ID0gdm1ldHJpY1syXSAqIHdpZHRoQWR2YW5jZVNjYWxlO1xuXG4gICAgICAgICAgd2lkdGggPSB2bWV0cmljID8gLXZtZXRyaWNbMF0gOiB3aWR0aDtcbiAgICAgICAgICBzY2FsZWRYID0gdnggLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgIHNjYWxlZFkgPSAoeCArIHZ5KSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NhbGVkWCA9IHggLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgIHNjYWxlZFkgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvbnQucmVtZWFzdXJlICYmIHdpZHRoID4gMCkge1xuICAgICAgICAgIC8vIFNvbWUgc3RhbmRhcmQgZm9udHMgbWF5IG5vdCBoYXZlIHRoZSBleGFjdCB3aWR0aDogcmVzY2FsZSBwZXJcbiAgICAgICAgICAvLyBjaGFyYWN0ZXIgaWYgbWVhc3VyZWQgd2lkdGggaXMgZ3JlYXRlciB0aGFuIGV4cGVjdGVkIGdseXBoIHdpZHRoXG4gICAgICAgICAgLy8gYW5kIHN1YnBpeGVsLWFhIGlzIGVuYWJsZWQsIG90aGVyd2lzZSBqdXN0IGNlbnRlciB0aGUgZ2x5cGguXG4gICAgICAgICAgdmFyIG1lYXN1cmVkV2lkdGggPVxuICAgICAgICAgICAgKChjdHgubWVhc3VyZVRleHQoY2hhcmFjdGVyKS53aWR0aCAqIDEwMDApIC8gZm9udFNpemUpICpcbiAgICAgICAgICAgIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgaWYgKHdpZHRoIDwgbWVhc3VyZWRXaWR0aCAmJiB0aGlzLmlzRm9udFN1YnBpeGVsQUFFbmFibGVkKSB7XG4gICAgICAgICAgICB2YXIgY2hhcmFjdGVyU2NhbGVYID0gd2lkdGggLyBtZWFzdXJlZFdpZHRoO1xuICAgICAgICAgICAgcmVzdG9yZU5lZWRlZCA9IHRydWU7XG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgY3R4LnNjYWxlKGNoYXJhY3RlclNjYWxlWCwgMSk7XG4gICAgICAgICAgICBzY2FsZWRYIC89IGNoYXJhY3RlclNjYWxlWDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoICE9PSBtZWFzdXJlZFdpZHRoKSB7XG4gICAgICAgICAgICBzY2FsZWRYICs9XG4gICAgICAgICAgICAgICgoKHdpZHRoIC0gbWVhc3VyZWRXaWR0aCkgLyAyMDAwKSAqIGZvbnRTaXplKSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhdHRlbXB0IHRvIGRyYXcgdGhlIGdseXBoIGlmIGl0IGlzIGFjdHVhbGx5IGluIHRoZSBlbWJlZGRlZCBmb250XG4gICAgICAgIC8vIGZpbGUgb3IgaWYgdGhlcmUgaXNuJ3QgYSBmb250IGZpbGUgc28gdGhlIGZhbGxiYWNrIGZvbnQgaXMgc2hvd24uXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIChnbHlwaC5pc0luRm9udCB8fCBmb250Lm1pc3NpbmdGaWxlKSkge1xuICAgICAgICAgIGlmIChzaW1wbGVGaWxsVGV4dCAmJiAhYWNjZW50KSB7XG4gICAgICAgICAgICAvLyBjb21tb24gY2FzZVxuICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3Rlciwgc2NhbGVkWCwgc2NhbGVkWSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnRDaGFyKGNoYXJhY3Rlciwgc2NhbGVkWCwgc2NhbGVkWSwgcGF0dGVyblRyYW5zZm9ybSk7XG4gICAgICAgICAgICBpZiAoYWNjZW50KSB7XG4gICAgICAgICAgICAgIHNjYWxlZEFjY2VudFggPVxuICAgICAgICAgICAgICAgIHNjYWxlZFggKyAoZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LngpIC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgICAgICAgc2NhbGVkQWNjZW50WSA9XG4gICAgICAgICAgICAgICAgc2NhbGVkWSAtIChmb250U2l6ZSAqIGFjY2VudC5vZmZzZXQueSkgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgICAgICB0aGlzLnBhaW50Q2hhcihcbiAgICAgICAgICAgICAgICBhY2NlbnQuZm9udENoYXIsXG4gICAgICAgICAgICAgICAgc2NhbGVkQWNjZW50WCxcbiAgICAgICAgICAgICAgICBzY2FsZWRBY2NlbnRZLFxuICAgICAgICAgICAgICAgIHBhdHRlcm5UcmFuc2Zvcm1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhcldpZHRoO1xuICAgICAgICBpZiAodmVydGljYWwpIHtcbiAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlIC0gc3BhY2luZyAqIGZvbnREaXJlY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSArIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHggKz0gY2hhcldpZHRoO1xuXG4gICAgICAgIGlmIChyZXN0b3JlTmVlZGVkKSB7XG4gICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICAgIGN1cnJlbnQueSAtPSB4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudC54ICs9IHggKiB0ZXh0SFNjYWxlO1xuICAgICAgfVxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9LFxuXG4gICAgc2hvd1R5cGUzVGV4dDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2hvd1R5cGUzVGV4dChnbHlwaHMpIHtcbiAgICAgIC8vIFR5cGUzIGZvbnRzIC0gZWFjaCBnbHlwaCBpcyBhIFwibWluaS1QREZcIlxuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICB2YXIgZm9udCA9IGN1cnJlbnQuZm9udDtcbiAgICAgIHZhciBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG4gICAgICB2YXIgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjtcbiAgICAgIHZhciBzcGFjaW5nRGlyID0gZm9udC52ZXJ0aWNhbCA/IDEgOiAtMTtcbiAgICAgIHZhciBjaGFyU3BhY2luZyA9IGN1cnJlbnQuY2hhclNwYWNpbmc7XG4gICAgICB2YXIgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nO1xuICAgICAgdmFyIHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uO1xuICAgICAgdmFyIGZvbnRNYXRyaXggPSBjdXJyZW50LmZvbnRNYXRyaXggfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICB2YXIgZ2x5cGhzTGVuZ3RoID0gZ2x5cGhzLmxlbmd0aDtcbiAgICAgIHZhciBpc1RleHRJbnZpc2libGUgPVxuICAgICAgICBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5JTlZJU0lCTEU7XG4gICAgICB2YXIgaSwgZ2x5cGgsIHdpZHRoLCBzcGFjaW5nTGVuZ3RoO1xuXG4gICAgICBpZiAoaXNUZXh0SW52aXNpYmxlIHx8IGZvbnRTaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuXG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIGN1cnJlbnQudGV4dE1hdHJpeCk7XG4gICAgICBjdHgudHJhbnNsYXRlKGN1cnJlbnQueCwgY3VycmVudC55KTtcblxuICAgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIGZvbnREaXJlY3Rpb24pO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICAgIGlmIChpc051bShnbHlwaCkpIHtcbiAgICAgICAgICBzcGFjaW5nTGVuZ3RoID0gKHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplKSAvIDEwMDA7XG4gICAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHNwYWNpbmdMZW5ndGgsIDApO1xuICAgICAgICAgIGN1cnJlbnQueCArPSBzcGFjaW5nTGVuZ3RoICogdGV4dEhTY2FsZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG4gICAgICAgIHZhciBvcGVyYXRvckxpc3QgPSBmb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0W2dseXBoLm9wZXJhdG9yTGlzdElkXTtcbiAgICAgICAgaWYgKCFvcGVyYXRvckxpc3QpIHtcbiAgICAgICAgICB3YXJuKGBUeXBlMyBjaGFyYWN0ZXIgXCIke2dseXBoLm9wZXJhdG9yTGlzdElkfVwiIGlzIG5vdCBhdmFpbGFibGUuYCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IGdseXBoO1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGN0eC5zY2FsZShmb250U2l6ZSwgZm9udFNpemUpO1xuICAgICAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCBmb250TWF0cml4KTtcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0KTtcbiAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0cmFuc2Zvcm1lZCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW2dseXBoLndpZHRoLCAwXSwgZm9udE1hdHJpeCk7XG4gICAgICAgIHdpZHRoID0gdHJhbnNmb3JtZWRbMF0gKiBmb250U2l6ZSArIHNwYWNpbmc7XG5cbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh3aWR0aCwgMCk7XG4gICAgICAgIGN1cnJlbnQueCArPSB3aWR0aCAqIHRleHRIU2NhbGU7XG4gICAgICB9XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyBUeXBlMyBmb250c1xuICAgIHNldENoYXJXaWR0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Q2hhcldpZHRoKHhXaWR0aCwgeVdpZHRoKSB7XG4gICAgICAvLyBXZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGlzIHNpbmNlIHRoZSB3aWR0aCBzaG91bGQgYmUgdGhlIHNhbWVcbiAgICAgIC8vIGFzIHRoZSB3aWR0aCBpbiB0aGUgV2lkdGhzIGFycmF5LlxuICAgIH0sXG4gICAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRDaGFyV2lkdGhBbmRCb3VuZHMoXG4gICAgICB4V2lkdGgsXG4gICAgICB5V2lkdGgsXG4gICAgICBsbHgsXG4gICAgICBsbHksXG4gICAgICB1cngsXG4gICAgICB1cnlcbiAgICApIHtcbiAgICAgIC8vIFRPRE8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjIHdlJ3JlIGFsc28gc3VwcG9zZSB0byBpZ25vcmUgYW55IG9wZXJhdG9yc1xuICAgICAgLy8gdGhhdCBzZXQgY29sb3Igb3IgaW5jbHVkZSBpbWFnZXMgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHR5cGUzIGZvbnQuXG4gICAgICB0aGlzLmN0eC5yZWN0KGxseCwgbGx5LCB1cnggLSBsbHgsIHVyeSAtIGxseSk7XG4gICAgICB0aGlzLmNsaXAoKTtcbiAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgIH0sXG5cbiAgICAvLyBDb2xvclxuICAgIGdldENvbG9yTl9QYXR0ZXJuOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19nZXRDb2xvck5fUGF0dGVybihJUikge1xuICAgICAgdmFyIHBhdHRlcm47XG4gICAgICBpZiAoSVJbMF0gPT09IFwiVGlsaW5nUGF0dGVyblwiKSB7XG4gICAgICAgIHZhciBjb2xvciA9IElSWzFdO1xuICAgICAgICB2YXIgYmFzZVRyYW5zZm9ybSA9XG4gICAgICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtIHx8IHRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0uc2xpY2UoKTtcbiAgICAgICAgdmFyIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IHtcbiAgICAgICAgICBjcmVhdGVDYW52YXNHcmFwaGljczogY3R4ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FudmFzR3JhcGhpY3MoXG4gICAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLFxuICAgICAgICAgICAgICB0aGlzLm9ianMsXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzRmFjdG9yeSxcbiAgICAgICAgICAgICAgdGhpcy53ZWJHTENvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcGF0dGVybiA9IG5ldyBUaWxpbmdQYXR0ZXJuKFxuICAgICAgICAgIElSLFxuICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgIHRoaXMuY3R4LFxuICAgICAgICAgIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSxcbiAgICAgICAgICBiYXNlVHJhbnNmb3JtXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXR0ZXJuID0gZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIoSVIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfSxcbiAgICBzZXRTdHJva2VDb2xvck46IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFN0cm9rZUNvbG9yTigpIHtcbiAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNldEZpbGxDb2xvck46IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEZpbGxDb2xvck4oKSB7XG4gICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpO1xuICAgICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gdHJ1ZTtcbiAgICB9LFxuICAgIHNldFN0cm9rZVJHQkNvbG9yOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRTdHJva2VSR0JDb2xvcihyLCBnLCBiKSB7XG4gICAgICB2YXIgY29sb3IgPSBVdGlsLm1ha2VDc3NSZ2IociwgZywgYik7XG4gICAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY29sb3I7XG4gICAgfSxcbiAgICBzZXRGaWxsUkdCQ29sb3I6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEZpbGxSR0JDb2xvcihyLCBnLCBiKSB7XG4gICAgICB2YXIgY29sb3IgPSBVdGlsLm1ha2VDc3NSZ2IociwgZywgYik7XG4gICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvcjtcbiAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBjb2xvcjtcbiAgICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBzaGFkaW5nRmlsbDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2hhZGluZ0ZpbGwocGF0dGVybklSKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuXG4gICAgICB0aGlzLnNhdmUoKTtcbiAgICAgIHZhciBwYXR0ZXJuID0gZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIocGF0dGVybklSKTtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBwYXR0ZXJuLmdldFBhdHRlcm4oY3R4LCB0aGlzLCB0cnVlKTtcblxuICAgICAgdmFyIGludiA9IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTtcbiAgICAgIGlmIChpbnYpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IGN0eC5jYW52YXM7XG4gICAgICAgIHZhciB3aWR0aCA9IGNhbnZhcy53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XG5cbiAgICAgICAgdmFyIGJsID0gVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIGludik7XG4gICAgICAgIHZhciBiciA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIGhlaWdodF0sIGludik7XG4gICAgICAgIHZhciB1bCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCAwXSwgaW52KTtcbiAgICAgICAgdmFyIHVyID0gVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIGhlaWdodF0sIGludik7XG5cbiAgICAgICAgdmFyIHgwID0gTWF0aC5taW4oYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pO1xuICAgICAgICB2YXIgeTAgPSBNYXRoLm1pbihibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7XG4gICAgICAgIHZhciB4MSA9IE1hdGgubWF4KGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTtcbiAgICAgICAgdmFyIHkxID0gTWF0aC5tYXgoYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pO1xuXG4gICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIQUNLIHRvIGRyYXcgdGhlIGdyYWRpZW50IG9udG8gYW4gaW5maW5pdGUgcmVjdGFuZ2xlLlxuICAgICAgICAvLyBQREYgZ3JhZGllbnRzIGFyZSBkcmF3biBhY3Jvc3MgdGhlIGVudGlyZSBpbWFnZSB3aGlsZVxuICAgICAgICAvLyBDYW52YXMgb25seSBhbGxvd3MgZ3JhZGllbnRzIHRvIGJlIGRyYXduIGluIGEgcmVjdGFuZ2xlXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYnVnIHNob3VsZCBhbGxvdyB1cyB0byByZW1vdmUgdGhpcy5cbiAgICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY0ODg0XG5cbiAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoLTFlMTAsIC0xZTEwLCAyZTEwLCAyZTEwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSxcblxuICAgIC8vIEltYWdlc1xuICAgIGJlZ2luSW5saW5lSW1hZ2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luSW5saW5lSW1hZ2UoKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlXCIpO1xuICAgIH0sXG4gICAgYmVnaW5JbWFnZURhdGE6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luSW1hZ2VEYXRhKCkge1xuICAgICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbWFnZURhdGFcIik7XG4gICAgfSxcblxuICAgIHBhaW50Rm9ybVhPYmplY3RCZWdpbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRGb3JtWE9iamVjdEJlZ2luKFxuICAgICAgbWF0cml4LFxuICAgICAgYmJveFxuICAgICkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLmJhc2VUcmFuc2Zvcm0pO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRyaXgpICYmIG1hdHJpeC5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0uYXBwbHkodGhpcywgbWF0cml4KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gdGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybTtcblxuICAgICAgaWYgKGJib3gpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07XG4gICAgICAgIHZhciBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcbiAgICAgICAgdGhpcy5jdHgucmVjdChiYm94WzBdLCBiYm94WzFdLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5jbGlwKCk7XG4gICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYWludEZvcm1YT2JqZWN0RW5kOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEZvcm1YT2JqZWN0RW5kKCkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgfSxcblxuICAgIGJlZ2luR3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luR3JvdXAoZ3JvdXApIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgdmFyIGN1cnJlbnRDdHggPSB0aGlzLmN0eDtcbiAgICAgIC8vIFRPRE8gbm9uLWlzb2xhdGVkIGdyb3VwcyAtIGFjY29yZGluZyB0byBSaWsgYXQgYWRvYmUgbm9uLWlzb2xhdGVkXG4gICAgICAvLyBncm91cCByZXN1bHRzIGFyZW4ndCB1c3VhbGx5IHRoYXQgZGlmZmVyZW50IGFuZCB0aGV5IGV2ZW4gaGF2ZSB0b29sc1xuICAgICAgLy8gdGhhdCBpZ25vcmUgdGhpcyBzZXR0aW5nLiBOb3RlcyBmcm9tIFJpayBvbiBpbXBsZW1lbnRpbmc6XG4gICAgICAvLyAtIFdoZW4geW91IGVuY291bnRlciBhbiB0cmFuc3BhcmVuY3kgZ3JvdXAsIGNyZWF0ZSBhIG5ldyBjYW52YXMgd2l0aFxuICAgICAgLy8gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGJib3hcbiAgICAgIC8vIC0gY29weSB0aGUgY29udGVudCBmcm9tIHRoZSBwcmV2aW91cyBjYW52YXMgdG8gdGhlIG5ldyBjYW52YXNcbiAgICAgIC8vIC0gZHJhdyBhcyB1c3VhbFxuICAgICAgLy8gLSByZW1vdmUgdGhlIGJhY2tkcm9wIGFscGhhOlxuICAgICAgLy8gYWxwaGFOZXcgPSAxIC0gKDEgLSBhbHBoYSkvKDEgLSBhbHBoYUJhY2tkcm9wKSB3aXRoICdhbHBoYScgdGhlIGFscGhhXG4gICAgICAvLyB2YWx1ZSBvZiB5b3VyIHRyYW5zcGFyZW5jeSBncm91cCBhbmQgJ2FscGhhQmFja2Ryb3AnIHRoZSBhbHBoYSBvZiB0aGVcbiAgICAgIC8vIGJhY2tkcm9wXG4gICAgICAvLyAtIHJlbW92ZSBiYWNrZ3JvdW5kIGNvbG9yOlxuICAgICAgLy8gY29sb3JOZXcgPSBjb2xvciAtIGFscGhhTmV3ICpjb2xvckJhY2tkcm9wIC8oMSAtIGFscGhhTmV3KVxuICAgICAgaWYgKCFncm91cC5pc29sYXRlZCkge1xuICAgICAgICBpbmZvKFwiVE9ETzogU3VwcG9ydCBub24taXNvbGF0ZWQgZ3JvdXBzLlwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyBrbm9ja291dCAtIHN1cHBvc2VkbHkgcG9zc2libGUgd2l0aCB0aGUgY2xldmVyIHVzZSBvZiBjb21wb3NpdGluZ1xuICAgICAgLy8gbW9kZXMuXG4gICAgICBpZiAoZ3JvdXAua25vY2tvdXQpIHtcbiAgICAgICAgd2FybihcIktub2Nrb3V0IGdyb3VwcyBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBjdXJyZW50Q3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07XG4gICAgICBpZiAoZ3JvdXAubWF0cml4KSB7XG4gICAgICAgIGN1cnJlbnRDdHgudHJhbnNmb3JtLmFwcGx5KGN1cnJlbnRDdHgsIGdyb3VwLm1hdHJpeCk7XG4gICAgICB9XG4gICAgICBpZiAoIWdyb3VwLmJib3gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzZWQgb24gdGhlIGN1cnJlbnQgdHJhbnNmb3JtIGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgYm91bmRpbmcgYm94XG4gICAgICAvLyB3aWxsIGFjdHVhbGx5IGJlLlxuICAgICAgdmFyIGJvdW5kcyA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goXG4gICAgICAgIGdyb3VwLmJib3gsXG4gICAgICAgIGN1cnJlbnRDdHgubW96Q3VycmVudFRyYW5zZm9ybVxuICAgICAgKTtcbiAgICAgIC8vIENsaXAgdGhlIGJvdW5kaW5nIGJveCB0byB0aGUgY3VycmVudCBjYW52YXMuXG4gICAgICB2YXIgY2FudmFzQm91bmRzID0gW1xuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICBjdXJyZW50Q3R4LmNhbnZhcy53aWR0aCxcbiAgICAgICAgY3VycmVudEN0eC5jYW52YXMuaGVpZ2h0LFxuICAgICAgXTtcbiAgICAgIGJvdW5kcyA9IFV0aWwuaW50ZXJzZWN0KGJvdW5kcywgY2FudmFzQm91bmRzKSB8fCBbMCwgMCwgMCwgMF07XG4gICAgICAvLyBVc2UgY2VpbCBpbiBjYXNlIHdlJ3JlIGJldHdlZW4gc2l6ZXMgc28gd2UgZG9uJ3QgY3JlYXRlIGNhbnZhcyB0aGF0IGlzXG4gICAgICAvLyB0b28gc21hbGwgYW5kIG1ha2UgdGhlIGNhbnZhcyBhdCBsZWFzdCAxeDEgcGl4ZWxzLlxuICAgICAgdmFyIG9mZnNldFggPSBNYXRoLmZsb29yKGJvdW5kc1swXSk7XG4gICAgICB2YXIgb2Zmc2V0WSA9IE1hdGguZmxvb3IoYm91bmRzWzFdKTtcbiAgICAgIHZhciBkcmF3bldpZHRoID0gTWF0aC5tYXgoTWF0aC5jZWlsKGJvdW5kc1syXSkgLSBvZmZzZXRYLCAxKTtcbiAgICAgIHZhciBkcmF3bkhlaWdodCA9IE1hdGgubWF4KE1hdGguY2VpbChib3VuZHNbM10pIC0gb2Zmc2V0WSwgMSk7XG4gICAgICB2YXIgc2NhbGVYID0gMSxcbiAgICAgICAgc2NhbGVZID0gMTtcbiAgICAgIGlmIChkcmF3bldpZHRoID4gTUFYX0dST1VQX1NJWkUpIHtcbiAgICAgICAgc2NhbGVYID0gZHJhd25XaWR0aCAvIE1BWF9HUk9VUF9TSVpFO1xuICAgICAgICBkcmF3bldpZHRoID0gTUFYX0dST1VQX1NJWkU7XG4gICAgICB9XG4gICAgICBpZiAoZHJhd25IZWlnaHQgPiBNQVhfR1JPVVBfU0laRSkge1xuICAgICAgICBzY2FsZVkgPSBkcmF3bkhlaWdodCAvIE1BWF9HUk9VUF9TSVpFO1xuICAgICAgICBkcmF3bkhlaWdodCA9IE1BWF9HUk9VUF9TSVpFO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2FjaGVJZCA9IFwiZ3JvdXBBdFwiICsgdGhpcy5ncm91cExldmVsO1xuICAgICAgaWYgKGdyb3VwLnNtYXNrKSB7XG4gICAgICAgIC8vIFVzaW5nIHR3byBjYWNoZSBlbnRyaWVzIGlzIGNhc2UgaWYgbWFza3MgYXJlIHVzZWQgb25lIGFmdGVyIGFub3RoZXIuXG4gICAgICAgIGNhY2hlSWQgKz0gXCJfc21hc2tfXCIgKyAodGhpcy5zbWFza0NvdW50ZXIrKyAlIDIpO1xuICAgICAgfVxuICAgICAgdmFyIHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcbiAgICAgICAgY2FjaGVJZCxcbiAgICAgICAgZHJhd25XaWR0aCxcbiAgICAgICAgZHJhd25IZWlnaHQsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICB2YXIgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG5cbiAgICAgIC8vIFNpbmNlIHdlIGNyZWF0ZWQgYSBuZXcgY2FudmFzIHRoYXQgaXMganVzdCB0aGUgc2l6ZSBvZiB0aGUgYm91bmRpbmcgYm94XG4gICAgICAvLyB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGUgZ3JvdXAgY3R4LlxuICAgICAgZ3JvdXBDdHguc2NhbGUoMSAvIHNjYWxlWCwgMSAvIHNjYWxlWSk7XG4gICAgICBncm91cEN0eC50cmFuc2xhdGUoLW9mZnNldFgsIC1vZmZzZXRZKTtcbiAgICAgIGdyb3VwQ3R4LnRyYW5zZm9ybS5hcHBseShncm91cEN0eCwgY3VycmVudFRyYW5zZm9ybSk7XG5cbiAgICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgICAvLyBTYXZpbmcgc3RhdGUgYW5kIGNhY2hlZCBtYXNrIHRvIGJlIHVzZWQgaW4gc2V0R1N0YXRlLlxuICAgICAgICB0aGlzLnNtYXNrU3RhY2sucHVzaCh7XG4gICAgICAgICAgY2FudmFzOiBzY3JhdGNoQ2FudmFzLmNhbnZhcyxcbiAgICAgICAgICBjb250ZXh0OiBncm91cEN0eCxcbiAgICAgICAgICBvZmZzZXRYLFxuICAgICAgICAgIG9mZnNldFksXG4gICAgICAgICAgc2NhbGVYLFxuICAgICAgICAgIHNjYWxlWSxcbiAgICAgICAgICBzdWJ0eXBlOiBncm91cC5zbWFzay5zdWJ0eXBlLFxuICAgICAgICAgIGJhY2tkcm9wOiBncm91cC5zbWFzay5iYWNrZHJvcCxcbiAgICAgICAgICB0cmFuc2Zlck1hcDogZ3JvdXAuc21hc2sudHJhbnNmZXJNYXAgfHwgbnVsbCxcbiAgICAgICAgICBzdGFydFRyYW5zZm9ybUludmVyc2U6IG51bGwsIC8vIHVzZWQgZHVyaW5nIHN1c3BlbmQgb3BlcmF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2V0dXAgdGhlIGN1cnJlbnQgY3R4IHNvIHdoZW4gdGhlIGdyb3VwIGlzIHBvcHBlZCB3ZSBkcmF3IGl0IGF0IHRoZVxuICAgICAgICAvLyByaWdodCBsb2NhdGlvbi5cbiAgICAgICAgY3VycmVudEN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgIGN1cnJlbnRDdHgudHJhbnNsYXRlKG9mZnNldFgsIG9mZnNldFkpO1xuICAgICAgICBjdXJyZW50Q3R4LnNjYWxlKHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB0cmFuc3BhcmVuY3kgZ3JvdXAgaW5oZXJpdHMgYWxsIG9mZiB0aGUgY3VycmVudCBncmFwaGljcyBzdGF0ZVxuICAgICAgLy8gZXhjZXB0IHRoZSBibGVuZCBtb2RlLCBzb2Z0IG1hc2ssIGFuZCBhbHBoYSBjb25zdGFudHMuXG4gICAgICBjb3B5Q3R4U3RhdGUoY3VycmVudEN0eCwgZ3JvdXBDdHgpO1xuICAgICAgdGhpcy5jdHggPSBncm91cEN0eDtcbiAgICAgIHRoaXMuc2V0R1N0YXRlKFtcbiAgICAgICAgW1wiQk1cIiwgXCJzb3VyY2Utb3ZlclwiXSxcbiAgICAgICAgW1wiY2FcIiwgMV0sXG4gICAgICAgIFtcIkNBXCIsIDFdLFxuICAgICAgXSk7XG4gICAgICB0aGlzLmdyb3VwU3RhY2sucHVzaChjdXJyZW50Q3R4KTtcbiAgICAgIHRoaXMuZ3JvdXBMZXZlbCsrO1xuXG4gICAgICAvLyBSZXNldGluZyBtYXNrIHN0YXRlLCBtYXNrcyB3aWxsIGJlIGFwcGxpZWQgb24gcmVzdG9yZSBvZiB0aGUgZ3JvdXAuXG4gICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSBudWxsO1xuICAgIH0sXG5cbiAgICBlbmRHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kR3JvdXAoZ3JvdXApIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcbiAgICAgIHZhciBncm91cEN0eCA9IHRoaXMuY3R4O1xuICAgICAgdGhpcy5jdHggPSB0aGlzLmdyb3VwU3RhY2sucG9wKCk7XG4gICAgICAvLyBUdXJuIG9mZiBpbWFnZSBzbW9vdGhpbmcgdG8gYXZvaWQgc3ViIHBpeGVsIGludGVycG9sYXRpb24gd2hpY2ggY2FuXG4gICAgICAvLyBsb29rIGtpbmQgb2YgYmx1cnJ5IGZvciBzb21lIHBkZnMuXG4gICAgICBpZiAodGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN0eC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgICB0aGlzLnRlbXBTTWFzayA9IHRoaXMuc21hc2tTdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShncm91cEN0eC5jYW52YXMsIDAsIDApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSxcblxuICAgIGJlZ2luQW5ub3RhdGlvbnM6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luQW5ub3RhdGlvbnMoKSB7XG4gICAgICB0aGlzLnNhdmUoKTtcbiAgICAgIGlmICh0aGlzLmJhc2VUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCB0aGlzLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlbmRBbm5vdGF0aW9uczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kQW5ub3RhdGlvbnMoKSB7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9LFxuXG4gICAgYmVnaW5Bbm5vdGF0aW9uOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkFubm90YXRpb24oXG4gICAgICByZWN0LFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgbWF0cml4XG4gICAgKSB7XG4gICAgICB0aGlzLnNhdmUoKTtcbiAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBDYW52YXNFeHRyYVN0YXRlKCk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlY3QpICYmIHJlY3QubGVuZ3RoID09PSA0KSB7XG4gICAgICAgIHZhciB3aWR0aCA9IHJlY3RbMl0gLSByZWN0WzBdO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gcmVjdFszXSAtIHJlY3RbMV07XG4gICAgICAgIHRoaXMuY3R4LnJlY3QocmVjdFswXSwgcmVjdFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuY2xpcCgpO1xuICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmFuc2Zvcm0uYXBwbHkodGhpcywgdHJhbnNmb3JtKTtcbiAgICAgIHRoaXMudHJhbnNmb3JtLmFwcGx5KHRoaXMsIG1hdHJpeCk7XG4gICAgfSxcblxuICAgIGVuZEFubm90YXRpb246IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEFubm90YXRpb24oKSB7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9LFxuXG4gICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlTWFza1hPYmplY3QoaW1nKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgdmFyIHdpZHRoID0gaW1nLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgdmFyIGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgICB2YXIgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcblxuICAgICAgdmFyIGdseXBoID0gdGhpcy5wcm9jZXNzaW5nVHlwZTM7XG5cbiAgICAgIGlmIChDT01QSUxFX1RZUEUzX0dMWVBIUyAmJiBnbHlwaCAmJiBnbHlwaC5jb21waWxlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh3aWR0aCA8PSBNQVhfU0laRV9UT19DT01QSUxFICYmIGhlaWdodCA8PSBNQVhfU0laRV9UT19DT01QSUxFKSB7XG4gICAgICAgICAgZ2x5cGguY29tcGlsZWQgPSBjb21waWxlVHlwZTNHbHlwaCh7IGRhdGE6IGltZy5kYXRhLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdseXBoLmNvbXBpbGVkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2x5cGggJiYgZ2x5cGguY29tcGlsZWQpIHtcbiAgICAgICAgZ2x5cGguY29tcGlsZWQoY3R4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFxuICAgICAgICBcIm1hc2tDYW52YXNcIixcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgKTtcbiAgICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0O1xuICAgICAgbWFza0N0eC5zYXZlKCk7XG5cbiAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ3R4LCBpbWcpO1xuXG4gICAgICBtYXNrQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWluXCI7XG5cbiAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbFxuICAgICAgICA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMpXG4gICAgICAgIDogZmlsbENvbG9yO1xuICAgICAgbWFza0N0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgbWFza0N0eC5yZXN0b3JlKCk7XG5cbiAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QobWFza0NhbnZhcy5jYW52YXMpO1xuICAgIH0sXG5cbiAgICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQoXG4gICAgICBpbWdEYXRhLFxuICAgICAgc2NhbGVYLFxuICAgICAgc2tld1ggPSAwLFxuICAgICAgc2tld1kgPSAwLFxuICAgICAgc2NhbGVZLFxuICAgICAgcG9zaXRpb25zXG4gICAgKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcbiAgICAgIHZhciBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgICAgdmFyIGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG5cbiAgICAgIHZhciBtYXNrQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXG4gICAgICAgIFwibWFza0NhbnZhc1wiLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICApO1xuICAgICAgdmFyIG1hc2tDdHggPSBtYXNrQ2FudmFzLmNvbnRleHQ7XG4gICAgICBtYXNrQ3R4LnNhdmUoKTtcblxuICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDdHgsIGltZ0RhdGEpO1xuXG4gICAgICBtYXNrQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWluXCI7XG5cbiAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbFxuICAgICAgICA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMpXG4gICAgICAgIDogZmlsbENvbG9yO1xuICAgICAgbWFza0N0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgbWFza0N0eC5yZXN0b3JlKCk7XG5cbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGN0eC50cmFuc2Zvcm0oXG4gICAgICAgICAgc2NhbGVYLFxuICAgICAgICAgIHNrZXdYLFxuICAgICAgICAgIHNrZXdZLFxuICAgICAgICAgIHNjYWxlWSxcbiAgICAgICAgICBwb3NpdGlvbnNbaV0sXG4gICAgICAgICAgcG9zaXRpb25zW2kgKyAxXVxuICAgICAgICApO1xuICAgICAgICBjdHguc2NhbGUoMSwgLTEpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKG1hc2tDYW52YXMuY2FudmFzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSwgMSk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlTWFza1hPYmplY3RHcm91cChcbiAgICAgIGltYWdlc1xuICAgICkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcblxuICAgICAgdmFyIGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgICB2YXIgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGltYWdlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHZhciBpbWFnZSA9IGltYWdlc1tpXTtcbiAgICAgICAgdmFyIHdpZHRoID0gaW1hZ2Uud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuXG4gICAgICAgIHZhciBtYXNrQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXG4gICAgICAgICAgXCJtYXNrQ2FudmFzXCIsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0O1xuICAgICAgICBtYXNrQ3R4LnNhdmUoKTtcblxuICAgICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0N0eCwgaW1hZ2UpO1xuXG4gICAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2UtaW5cIjtcblxuICAgICAgICBtYXNrQ3R4LmZpbGxTdHlsZSA9IGlzUGF0dGVybkZpbGxcbiAgICAgICAgICA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMpXG4gICAgICAgICAgOiBmaWxsQ29sb3I7XG4gICAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgbWFza0N0eC5yZXN0b3JlKCk7XG5cbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIGltYWdlLnRyYW5zZm9ybSk7XG4gICAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcy5jYW52YXMsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxLCAxKTtcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFpbnRJbWFnZVhPYmplY3Q6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VYT2JqZWN0KG9iaklkKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW1nRGF0YSA9IG9iaklkLnN0YXJ0c1dpdGgoXCJnX1wiKVxuICAgICAgICA/IHRoaXMuY29tbW9uT2Jqcy5nZXQob2JqSWQpXG4gICAgICAgIDogdGhpcy5vYmpzLmdldChvYmpJZCk7XG4gICAgICBpZiAoIWltZ0RhdGEpIHtcbiAgICAgICAgd2FybihcIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKTtcbiAgICB9LFxuXG4gICAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KFxuICAgICAgb2JqSWQsXG4gICAgICBzY2FsZVgsXG4gICAgICBzY2FsZVksXG4gICAgICBwb3NpdGlvbnNcbiAgICApIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbWdEYXRhID0gb2JqSWQuc3RhcnRzV2l0aChcImdfXCIpXG4gICAgICAgID8gdGhpcy5jb21tb25PYmpzLmdldChvYmpJZClcbiAgICAgICAgOiB0aGlzLm9ianMuZ2V0KG9iaklkKTtcbiAgICAgIGlmICghaW1nRGF0YSkge1xuICAgICAgICB3YXJuKFwiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgICAgdmFyIG1hcCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgIHRyYW5zZm9ybTogW3NjYWxlWCwgMCwgMCwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV1dLFxuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICB3OiB3aWR0aCxcbiAgICAgICAgICBoOiBoZWlnaHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGltZ0RhdGEsIG1hcCk7XG4gICAgfSxcblxuICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludElubGluZUltYWdlWE9iamVjdChcbiAgICAgIGltZ0RhdGFcbiAgICApIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuXG4gICAgICB0aGlzLnNhdmUoKTtcbiAgICAgIC8vIHNjYWxlIHRoZSBpbWFnZSB0byB0aGUgdW5pdCBzcXVhcmVcbiAgICAgIGN0eC5zY2FsZSgxIC8gd2lkdGgsIC0xIC8gaGVpZ2h0KTtcblxuICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBjdHgubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7XG4gICAgICB2YXIgYSA9IGN1cnJlbnRUcmFuc2Zvcm1bMF0sXG4gICAgICAgIGIgPSBjdXJyZW50VHJhbnNmb3JtWzFdO1xuICAgICAgdmFyIHdpZHRoU2NhbGUgPSBNYXRoLm1heChNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksIDEpO1xuICAgICAgdmFyIGMgPSBjdXJyZW50VHJhbnNmb3JtWzJdLFxuICAgICAgICBkID0gY3VycmVudFRyYW5zZm9ybVszXTtcbiAgICAgIHZhciBoZWlnaHRTY2FsZSA9IE1hdGgubWF4KE1hdGguc3FydChjICogYyArIGQgKiBkKSwgMSk7XG5cbiAgICAgIHZhciBpbWdUb1BhaW50LCB0bXBDYW52YXM7XG4gICAgICAvLyB0eXBlb2YgY2hlY2sgaXMgbmVlZGVkIGR1ZSB0byBub2RlLmpzIHN1cHBvcnQsIHNlZSBpc3N1ZSAjODQ4OVxuICAgICAgaWYgKFxuICAgICAgICAodHlwZW9mIEhUTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgaW1nRGF0YSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB8fFxuICAgICAgICAhaW1nRGF0YS5kYXRhXG4gICAgICApIHtcbiAgICAgICAgaW1nVG9QYWludCA9IGltZ0RhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICAgIHB1dEJpbmFyeUltYWdlRGF0YSh0bXBDdHgsIGltZ0RhdGEsIHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMpO1xuICAgICAgICBpbWdUb1BhaW50ID0gdG1wQ2FudmFzLmNhbnZhcztcbiAgICAgIH1cblxuICAgICAgdmFyIHBhaW50V2lkdGggPSB3aWR0aCxcbiAgICAgICAgcGFpbnRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICB2YXIgdG1wQ2FudmFzSWQgPSBcInByZXNjYWxlMVwiO1xuICAgICAgLy8gVmVydGljYWwgb3IgaG9yaXpvbnRhbCBzY2FsaW5nIHNoYWxsIG5vdCBiZSBtb3JlIHRoYW4gMiB0byBub3QgbG9zZSB0aGVcbiAgICAgIC8vIHBpeGVscyBkdXJpbmcgZHJhd0ltYWdlIG9wZXJhdGlvbiwgcGFpbnRpbmcgb24gdGhlIHRlbXBvcmFyeSBjYW52YXMoZXMpXG4gICAgICAvLyB0aGF0IGFyZSB0d2ljZSBzbWFsbGVyIGluIHNpemUuXG4gICAgICB3aGlsZSAoXG4gICAgICAgICh3aWR0aFNjYWxlID4gMiAmJiBwYWludFdpZHRoID4gMSkgfHxcbiAgICAgICAgKGhlaWdodFNjYWxlID4gMiAmJiBwYWludEhlaWdodCA+IDEpXG4gICAgICApIHtcbiAgICAgICAgdmFyIG5ld1dpZHRoID0gcGFpbnRXaWR0aCxcbiAgICAgICAgICBuZXdIZWlnaHQgPSBwYWludEhlaWdodDtcbiAgICAgICAgaWYgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxKSB7XG4gICAgICAgICAgbmV3V2lkdGggPSBNYXRoLmNlaWwocGFpbnRXaWR0aCAvIDIpO1xuICAgICAgICAgIHdpZHRoU2NhbGUgLz0gcGFpbnRXaWR0aCAvIG5ld1dpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKSB7XG4gICAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5jZWlsKHBhaW50SGVpZ2h0IC8gMik7XG4gICAgICAgICAgaGVpZ2h0U2NhbGUgLz0gcGFpbnRIZWlnaHQgLyBuZXdIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXG4gICAgICAgICAgdG1wQ2FudmFzSWQsXG4gICAgICAgICAgbmV3V2lkdGgsXG4gICAgICAgICAgbmV3SGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgICB0bXBDdHguY2xlYXJSZWN0KDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgICB0bXBDdHguZHJhd0ltYWdlKFxuICAgICAgICAgIGltZ1RvUGFpbnQsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHBhaW50V2lkdGgsXG4gICAgICAgICAgcGFpbnRIZWlnaHQsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIG5ld1dpZHRoLFxuICAgICAgICAgIG5ld0hlaWdodFxuICAgICAgICApO1xuICAgICAgICBpbWdUb1BhaW50ID0gdG1wQ2FudmFzLmNhbnZhcztcbiAgICAgICAgcGFpbnRXaWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICBwYWludEhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgICAgdG1wQ2FudmFzSWQgPSB0bXBDYW52YXNJZCA9PT0gXCJwcmVzY2FsZTFcIiA/IFwicHJlc2NhbGUyXCIgOiBcInByZXNjYWxlMVwiO1xuICAgICAgfVxuICAgICAgY3R4LmRyYXdJbWFnZShcbiAgICAgICAgaW1nVG9QYWludCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgcGFpbnRXaWR0aCxcbiAgICAgICAgcGFpbnRIZWlnaHQsXG4gICAgICAgIDAsXG4gICAgICAgIC1oZWlnaHQsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRDYW52YXNQb3NpdGlvbigwLCAtaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5pbWFnZUxheWVyLmFwcGVuZEltYWdlKHtcbiAgICAgICAgICBpbWdEYXRhLFxuICAgICAgICAgIGxlZnQ6IHBvc2l0aW9uWzBdLFxuICAgICAgICAgIHRvcDogcG9zaXRpb25bMV0sXG4gICAgICAgICAgd2lkdGg6IHdpZHRoIC8gY3VycmVudFRyYW5zZm9ybVswXSxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodCAvIGN1cnJlbnRUcmFuc2Zvcm1bM10sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSxcblxuICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAoXG4gICAgICBpbWdEYXRhLFxuICAgICAgbWFwXG4gICAgKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgdmFyIHcgPSBpbWdEYXRhLndpZHRoO1xuICAgICAgdmFyIGggPSBpbWdEYXRhLmhlaWdodDtcblxuICAgICAgdmFyIHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgdywgaCk7XG4gICAgICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhLCB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbWFwLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gbWFwW2ldO1xuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgZW50cnkudHJhbnNmb3JtKTtcbiAgICAgICAgY3R4LnNjYWxlKDEsIC0xKTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShcbiAgICAgICAgICB0bXBDYW52YXMuY2FudmFzLFxuICAgICAgICAgIGVudHJ5LngsXG4gICAgICAgICAgZW50cnkueSxcbiAgICAgICAgICBlbnRyeS53LFxuICAgICAgICAgIGVudHJ5LmgsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAtMSxcbiAgICAgICAgICAxLFxuICAgICAgICAgIDFcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VMYXllcikge1xuICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuZ2V0Q2FudmFzUG9zaXRpb24oZW50cnkueCwgZW50cnkueSk7XG4gICAgICAgICAgdGhpcy5pbWFnZUxheWVyLmFwcGVuZEltYWdlKHtcbiAgICAgICAgICAgIGltZ0RhdGEsXG4gICAgICAgICAgICBsZWZ0OiBwb3NpdGlvblswXSxcbiAgICAgICAgICAgIHRvcDogcG9zaXRpb25bMV0sXG4gICAgICAgICAgICB3aWR0aDogdyxcbiAgICAgICAgICAgIGhlaWdodDogaCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcbiAgICB9LFxuXG4gICAgLy8gTWFya2VkIGNvbnRlbnRcblxuICAgIG1hcmtQb2ludDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfbWFya1BvaW50KHRhZykge1xuICAgICAgLy8gVE9ETyBNYXJrZWQgY29udGVudC5cbiAgICB9LFxuICAgIG1hcmtQb2ludFByb3BzOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19tYXJrUG9pbnRQcm9wcyh0YWcsIHByb3BlcnRpZXMpIHtcbiAgICAgIC8vIFRPRE8gTWFya2VkIGNvbnRlbnQuXG4gICAgfSxcbiAgICBiZWdpbk1hcmtlZENvbnRlbnQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luTWFya2VkQ29udGVudCh0YWcpIHtcbiAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5NYXJrZWRDb250ZW50UHJvcHMoXG4gICAgICB0YWcsXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKSB7XG4gICAgICBpZiAodGFnID09PSBcIk9DXCIpIHtcbiAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcuaXNWaXNpYmxlKHByb3BlcnRpZXMpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpO1xuICAgIH0sXG4gICAgZW5kTWFya2VkQ29udGVudDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kTWFya2VkQ29udGVudCgpIHtcbiAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnBvcCgpO1xuICAgICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpO1xuICAgIH0sXG5cbiAgICAvLyBDb21wYXRpYmlsaXR5XG5cbiAgICBiZWdpbkNvbXBhdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5Db21wYXQoKSB7XG4gICAgICAvLyBUT0RPIGlnbm9yZSB1bmRlZmluZWQgb3BlcmF0b3JzIChzaG91bGQgd2UgZG8gdGhhdCBhbnl3YXk/KVxuICAgIH0sXG4gICAgZW5kQ29tcGF0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRDb21wYXQoKSB7XG4gICAgICAvLyBUT0RPIHN0b3AgaWdub3JpbmcgdW5kZWZpbmVkIG9wZXJhdG9yc1xuICAgIH0sXG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zXG5cbiAgICBjb25zdW1lUGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY29uc3VtZVBhdGgoKSB7XG4gICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCA9PT0gRU9fQ0xJUCkge1xuICAgICAgICAgIGN0eC5jbGlwKFwiZXZlbm9kZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHguY2xpcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgfVxuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIH0sXG4gICAgZ2V0U2luZ2xlUGl4ZWxXaWR0aChzY2FsZSkge1xuICAgICAgaWYgKHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgaW52ZXJzZSA9IHRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlO1xuICAgICAgICAvLyBtYXggb2YgdGhlIGN1cnJlbnQgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2NhbGVcbiAgICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IE1hdGguc3FydChcbiAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgIGludmVyc2VbMF0gKiBpbnZlcnNlWzBdICsgaW52ZXJzZVsxXSAqIGludmVyc2VbMV0sXG4gICAgICAgICAgICBpbnZlcnNlWzJdICogaW52ZXJzZVsyXSArIGludmVyc2VbM10gKiBpbnZlcnNlWzNdXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg7XG4gICAgfSxcbiAgICBnZXRDYW52YXNQb3NpdGlvbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZ2V0Q2FudmFzUG9zaXRpb24oeCwgeSkge1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0cmFuc2Zvcm1bMF0gKiB4ICsgdHJhbnNmb3JtWzJdICogeSArIHRyYW5zZm9ybVs0XSxcbiAgICAgICAgdHJhbnNmb3JtWzFdICogeCArIHRyYW5zZm9ybVszXSAqIHkgKyB0cmFuc2Zvcm1bNV0sXG4gICAgICBdO1xuICAgIH0sXG5cbiAgICBpc0NvbnRlbnRWaXNpYmxlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19pc0NvbnRlbnRWaXNpYmxlKCkge1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXJrZWRDb250ZW50U3RhY2tbaV0udmlzaWJsZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfTtcblxuICBmb3IgKHZhciBvcCBpbiBPUFMpIHtcbiAgICBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbT1BTW29wXV0gPSBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdO1xuICB9XG5cbiAgcmV0dXJuIENhbnZhc0dyYXBoaWNzO1xufSkoKTtcblxuZXhwb3J0IHsgQ2FudmFzR3JhcGhpY3MgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGb3JtYXRFcnJvciwgaW5mbywgVXRpbCB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG52YXIgU2hhZGluZ0lScyA9IHt9O1xuXG5mdW5jdGlvbiBhcHBseUJvdW5kaW5nQm94KGN0eCwgYmJveCkge1xuICBpZiAoIWJib3ggfHwgdHlwZW9mIFBhdGgyRCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdO1xuICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcbiAgY29uc3QgcmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICByZWdpb24ucmVjdChiYm94WzBdLCBiYm94WzFdLCB3aWR0aCwgaGVpZ2h0KTtcbiAgY3R4LmNsaXAocmVnaW9uKTtcbn1cblxuU2hhZGluZ0lScy5SYWRpYWxBeGlhbCA9IHtcbiAgZnJvbUlSOiBmdW5jdGlvbiBSYWRpYWxBeGlhbF9mcm9tSVIocmF3KSB7XG4gICAgdmFyIHR5cGUgPSByYXdbMV07XG4gICAgdmFyIGJib3ggPSByYXdbMl07XG4gICAgdmFyIGNvbG9yU3RvcHMgPSByYXdbM107XG4gICAgdmFyIHAwID0gcmF3WzRdO1xuICAgIHZhciBwMSA9IHJhd1s1XTtcbiAgICB2YXIgcjAgPSByYXdbNl07XG4gICAgdmFyIHIxID0gcmF3WzddO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIlBhdHRlcm5cIixcbiAgICAgIGdldFBhdHRlcm46IGZ1bmN0aW9uIFJhZGlhbEF4aWFsX2dldFBhdHRlcm4oY3R4KSB7XG4gICAgICAgIGFwcGx5Qm91bmRpbmdCb3goY3R4LCBiYm94KTtcbiAgICAgICAgdmFyIGdyYWQ7XG4gICAgICAgIGlmICh0eXBlID09PSBcImF4aWFsXCIpIHtcbiAgICAgICAgICBncmFkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KHAwWzBdLCBwMFsxXSwgcDFbMF0sIHAxWzFdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInJhZGlhbFwiKSB7XG4gICAgICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudChwMFswXSwgcDBbMV0sIHIwLCBwMVswXSwgcDFbMV0sIHIxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbG9yU3RvcHMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICAgIHZhciBjID0gY29sb3JTdG9wc1tpXTtcbiAgICAgICAgICBncmFkLmFkZENvbG9yU3RvcChjWzBdLCBjWzFdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ3JhZDtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG5cbnZhciBjcmVhdGVNZXNoQ2FudmFzID0gKGZ1bmN0aW9uIGNyZWF0ZU1lc2hDYW52YXNDbG9zdXJlKCkge1xuICBmdW5jdGlvbiBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcDEsIHAyLCBwMywgYzEsIGMyLCBjMykge1xuICAgIC8vIFZlcnkgYmFzaWMgR291cmF1ZC1zaGFkZWQgdHJpYW5nbGUgcmFzdGVyaXphdGlvbiBhbGdvcml0aG0uXG4gICAgdmFyIGNvb3JkcyA9IGNvbnRleHQuY29vcmRzLFxuICAgICAgY29sb3JzID0gY29udGV4dC5jb2xvcnM7XG4gICAgdmFyIGJ5dGVzID0gZGF0YS5kYXRhLFxuICAgICAgcm93U2l6ZSA9IGRhdGEud2lkdGggKiA0O1xuICAgIHZhciB0bXA7XG4gICAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHtcbiAgICAgIHRtcCA9IHAxO1xuICAgICAgcDEgPSBwMjtcbiAgICAgIHAyID0gdG1wO1xuICAgICAgdG1wID0gYzE7XG4gICAgICBjMSA9IGMyO1xuICAgICAgYzIgPSB0bXA7XG4gICAgfVxuICAgIGlmIChjb29yZHNbcDIgKyAxXSA+IGNvb3Jkc1twMyArIDFdKSB7XG4gICAgICB0bXAgPSBwMjtcbiAgICAgIHAyID0gcDM7XG4gICAgICBwMyA9IHRtcDtcbiAgICAgIHRtcCA9IGMyO1xuICAgICAgYzIgPSBjMztcbiAgICAgIGMzID0gdG1wO1xuICAgIH1cbiAgICBpZiAoY29vcmRzW3AxICsgMV0gPiBjb29yZHNbcDIgKyAxXSkge1xuICAgICAgdG1wID0gcDE7XG4gICAgICBwMSA9IHAyO1xuICAgICAgcDIgPSB0bXA7XG4gICAgICB0bXAgPSBjMTtcbiAgICAgIGMxID0gYzI7XG4gICAgICBjMiA9IHRtcDtcbiAgICB9XG4gICAgdmFyIHgxID0gKGNvb3Jkc1twMV0gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG4gICAgdmFyIHkxID0gKGNvb3Jkc1twMSArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuICAgIHZhciB4MiA9IChjb29yZHNbcDJdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuICAgIHZhciB5MiA9IChjb29yZHNbcDIgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcbiAgICB2YXIgeDMgPSAoY29vcmRzW3AzXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcbiAgICB2YXIgeTMgPSAoY29vcmRzW3AzICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG4gICAgaWYgKHkxID49IHkzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjMXIgPSBjb2xvcnNbYzFdLFxuICAgICAgYzFnID0gY29sb3JzW2MxICsgMV0sXG4gICAgICBjMWIgPSBjb2xvcnNbYzEgKyAyXTtcbiAgICB2YXIgYzJyID0gY29sb3JzW2MyXSxcbiAgICAgIGMyZyA9IGNvbG9yc1tjMiArIDFdLFxuICAgICAgYzJiID0gY29sb3JzW2MyICsgMl07XG4gICAgdmFyIGMzciA9IGNvbG9yc1tjM10sXG4gICAgICBjM2cgPSBjb2xvcnNbYzMgKyAxXSxcbiAgICAgIGMzYiA9IGNvbG9yc1tjMyArIDJdO1xuXG4gICAgdmFyIG1pblkgPSBNYXRoLnJvdW5kKHkxKSxcbiAgICAgIG1heFkgPSBNYXRoLnJvdW5kKHkzKTtcbiAgICB2YXIgeGEsIGNhciwgY2FnLCBjYWI7XG4gICAgdmFyIHhiLCBjYnIsIGNiZywgY2JiO1xuICAgIGZvciAodmFyIHkgPSBtaW5ZOyB5IDw9IG1heFk7IHkrKykge1xuICAgICAgaWYgKHkgPCB5Mikge1xuICAgICAgICBsZXQgaztcbiAgICAgICAgaWYgKHkgPCB5MSkge1xuICAgICAgICAgIGsgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHkxID09PSB5Mikge1xuICAgICAgICAgIGsgPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGsgPSAoeTEgLSB5KSAvICh5MSAtIHkyKTtcbiAgICAgICAgfVxuICAgICAgICB4YSA9IHgxIC0gKHgxIC0geDIpICogaztcbiAgICAgICAgY2FyID0gYzFyIC0gKGMxciAtIGMycikgKiBrO1xuICAgICAgICBjYWcgPSBjMWcgLSAoYzFnIC0gYzJnKSAqIGs7XG4gICAgICAgIGNhYiA9IGMxYiAtIChjMWIgLSBjMmIpICogaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBrO1xuICAgICAgICBpZiAoeSA+IHkzKSB7XG4gICAgICAgICAgayA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoeTIgPT09IHkzKSB7XG4gICAgICAgICAgayA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgayA9ICh5MiAtIHkpIC8gKHkyIC0geTMpO1xuICAgICAgICB9XG4gICAgICAgIHhhID0geDIgLSAoeDIgLSB4MykgKiBrO1xuICAgICAgICBjYXIgPSBjMnIgLSAoYzJyIC0gYzNyKSAqIGs7XG4gICAgICAgIGNhZyA9IGMyZyAtIChjMmcgLSBjM2cpICogaztcbiAgICAgICAgY2FiID0gYzJiIC0gKGMyYiAtIGMzYikgKiBrO1xuICAgICAgfVxuXG4gICAgICBsZXQgaztcbiAgICAgIGlmICh5IDwgeTEpIHtcbiAgICAgICAgayA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHkgPiB5Mykge1xuICAgICAgICBrID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsgPSAoeTEgLSB5KSAvICh5MSAtIHkzKTtcbiAgICAgIH1cbiAgICAgIHhiID0geDEgLSAoeDEgLSB4MykgKiBrO1xuICAgICAgY2JyID0gYzFyIC0gKGMxciAtIGMzcikgKiBrO1xuICAgICAgY2JnID0gYzFnIC0gKGMxZyAtIGMzZykgKiBrO1xuICAgICAgY2JiID0gYzFiIC0gKGMxYiAtIGMzYikgKiBrO1xuICAgICAgdmFyIHgxXyA9IE1hdGgucm91bmQoTWF0aC5taW4oeGEsIHhiKSk7XG4gICAgICB2YXIgeDJfID0gTWF0aC5yb3VuZChNYXRoLm1heCh4YSwgeGIpKTtcbiAgICAgIHZhciBqID0gcm93U2l6ZSAqIHkgKyB4MV8gKiA0O1xuICAgICAgZm9yICh2YXIgeCA9IHgxXzsgeCA8PSB4Ml87IHgrKykge1xuICAgICAgICBrID0gKHhhIC0geCkgLyAoeGEgLSB4Yik7XG4gICAgICAgIGlmIChrIDwgMCkge1xuICAgICAgICAgIGsgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGsgPiAxKSB7XG4gICAgICAgICAgayA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZXNbaisrXSA9IChjYXIgLSAoY2FyIC0gY2JyKSAqIGspIHwgMDtcbiAgICAgICAgYnl0ZXNbaisrXSA9IChjYWcgLSAoY2FnIC0gY2JnKSAqIGspIHwgMDtcbiAgICAgICAgYnl0ZXNbaisrXSA9IChjYWIgLSAoY2FiIC0gY2JiKSAqIGspIHwgMDtcbiAgICAgICAgYnl0ZXNbaisrXSA9IDI1NTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZSwgY29udGV4dCkge1xuICAgIHZhciBwcyA9IGZpZ3VyZS5jb29yZHM7XG4gICAgdmFyIGNzID0gZmlndXJlLmNvbG9ycztcbiAgICB2YXIgaSwgaWk7XG4gICAgc3dpdGNoIChmaWd1cmUudHlwZSkge1xuICAgICAgY2FzZSBcImxhdHRpY2VcIjpcbiAgICAgICAgdmFyIHZlcnRpY2VzUGVyUm93ID0gZmlndXJlLnZlcnRpY2VzUGVyUm93O1xuICAgICAgICB2YXIgcm93cyA9IE1hdGguZmxvb3IocHMubGVuZ3RoIC8gdmVydGljZXNQZXJSb3cpIC0gMTtcbiAgICAgICAgdmFyIGNvbHMgPSB2ZXJ0aWNlc1BlclJvdyAtIDE7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgICAgICB2YXIgcSA9IGkgKiB2ZXJ0aWNlc1BlclJvdztcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbHM7IGorKywgcSsrKSB7XG4gICAgICAgICAgICBkcmF3VHJpYW5nbGUoXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIHBzW3FdLFxuICAgICAgICAgICAgICBwc1txICsgMV0sXG4gICAgICAgICAgICAgIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sXG4gICAgICAgICAgICAgIGNzW3FdLFxuICAgICAgICAgICAgICBjc1txICsgMV0sXG4gICAgICAgICAgICAgIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkcmF3VHJpYW5nbGUoXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIHBzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLFxuICAgICAgICAgICAgICBwc1txICsgMV0sXG4gICAgICAgICAgICAgIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sXG4gICAgICAgICAgICAgIGNzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLFxuICAgICAgICAgICAgICBjc1txICsgMV0sXG4gICAgICAgICAgICAgIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRyaWFuZ2xlc1wiOlxuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHBzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHtcbiAgICAgICAgICBkcmF3VHJpYW5nbGUoXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHBzW2ldLFxuICAgICAgICAgICAgcHNbaSArIDFdLFxuICAgICAgICAgICAgcHNbaSArIDJdLFxuICAgICAgICAgICAgY3NbaV0sXG4gICAgICAgICAgICBjc1tpICsgMV0sXG4gICAgICAgICAgICBjc1tpICsgMl1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBmaWd1cmVcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBjcmVhdGVNZXNoQ2FudmFzKFxuICAgIGJvdW5kcyxcbiAgICBjb21iaW5lc1NjYWxlLFxuICAgIGNvb3JkcyxcbiAgICBjb2xvcnMsXG4gICAgZmlndXJlcyxcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgY2FjaGVkQ2FudmFzZXMsXG4gICAgd2ViR0xDb250ZXh0XG4gICkge1xuICAgIC8vIHdlIHdpbGwgaW5jcmVhc2Ugc2NhbGUgb24gc29tZSB3ZWlyZCBmYWN0b3IgdG8gbGV0IGFudGlhbGlhc2luZyB0YWtlXG4gICAgLy8gY2FyZSBvZiBcInJvdWdoXCIgZWRnZXNcbiAgICB2YXIgRVhQRUNURURfU0NBTEUgPSAxLjE7XG4gICAgLy8gTUFYX1BBVFRFUk5fU0laRSBpcyB1c2VkIHRvIGF2b2lkIE9PTSBzaXR1YXRpb24uXG4gICAgdmFyIE1BWF9QQVRURVJOX1NJWkUgPSAzMDAwOyAvLyAxMGluIEAgMzAwZHBpIHNoYWxsIGJlIGVub3VnaFxuICAgIC8vIFdlIG5lZWQgdG8ga2VlcCB0cmFuc3BhcmVudCBib3JkZXIgYXJvdW5kIG91ciBwYXR0ZXJuIGZvciBmaWxsKCk6XG4gICAgLy8gY3JlYXRlUGF0dGVybiB3aXRoICduby1yZXBlYXQnIHdpbGwgYmxlZWQgZWRnZXMgYWNyb3NzIGVudGlyZSBhcmVhLlxuICAgIHZhciBCT1JERVJfU0laRSA9IDI7XG5cbiAgICB2YXIgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTtcbiAgICB2YXIgb2Zmc2V0WSA9IE1hdGguZmxvb3IoYm91bmRzWzFdKTtcbiAgICB2YXIgYm91bmRzV2lkdGggPSBNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFg7XG4gICAgdmFyIGJvdW5kc0hlaWdodCA9IE1hdGguY2VpbChib3VuZHNbM10pIC0gb2Zmc2V0WTtcblxuICAgIHZhciB3aWR0aCA9IE1hdGgubWluKFxuICAgICAgTWF0aC5jZWlsKE1hdGguYWJzKGJvdW5kc1dpZHRoICogY29tYmluZXNTY2FsZVswXSAqIEVYUEVDVEVEX1NDQUxFKSksXG4gICAgICBNQVhfUEFUVEVSTl9TSVpFXG4gICAgKTtcbiAgICB2YXIgaGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICBNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzSGVpZ2h0ICogY29tYmluZXNTY2FsZVsxXSAqIEVYUEVDVEVEX1NDQUxFKSksXG4gICAgICBNQVhfUEFUVEVSTl9TSVpFXG4gICAgKTtcbiAgICB2YXIgc2NhbGVYID0gYm91bmRzV2lkdGggLyB3aWR0aDtcbiAgICB2YXIgc2NhbGVZID0gYm91bmRzSGVpZ2h0IC8gaGVpZ2h0O1xuXG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICBjb29yZHMsXG4gICAgICBjb2xvcnMsXG4gICAgICBvZmZzZXRYOiAtb2Zmc2V0WCxcbiAgICAgIG9mZnNldFk6IC1vZmZzZXRZLFxuICAgICAgc2NhbGVYOiAxIC8gc2NhbGVYLFxuICAgICAgc2NhbGVZOiAxIC8gc2NhbGVZLFxuICAgIH07XG5cbiAgICB2YXIgcGFkZGVkV2lkdGggPSB3aWR0aCArIEJPUkRFUl9TSVpFICogMjtcbiAgICB2YXIgcGFkZGVkSGVpZ2h0ID0gaGVpZ2h0ICsgQk9SREVSX1NJWkUgKiAyO1xuXG4gICAgdmFyIGNhbnZhcywgdG1wQ2FudmFzLCBpLCBpaTtcbiAgICBpZiAod2ViR0xDb250ZXh0LmlzRW5hYmxlZCkge1xuICAgICAgY2FudmFzID0gd2ViR0xDb250ZXh0LmRyYXdGaWd1cmVzKHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgICBmaWd1cmVzLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05NzIxMjZcbiAgICAgIHRtcENhbnZhcyA9IGNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcbiAgICAgICAgXCJtZXNoXCIsXG4gICAgICAgIHBhZGRlZFdpZHRoLFxuICAgICAgICBwYWRkZWRIZWlnaHQsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgdG1wQ2FudmFzLmNvbnRleHQuZHJhd0ltYWdlKGNhbnZhcywgQk9SREVSX1NJWkUsIEJPUkRFUl9TSVpFKTtcbiAgICAgIGNhbnZhcyA9IHRtcENhbnZhcy5jYW52YXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRtcENhbnZhcyA9IGNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcbiAgICAgICAgXCJtZXNoXCIsXG4gICAgICAgIHBhZGRlZFdpZHRoLFxuICAgICAgICBwYWRkZWRIZWlnaHQsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuXG4gICAgICB2YXIgZGF0YSA9IHRtcEN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG4gICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIHZhciBieXRlcyA9IGRhdGEuZGF0YTtcbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7XG4gICAgICAgICAgYnl0ZXNbaV0gPSBiYWNrZ3JvdW5kQ29sb3JbMF07XG4gICAgICAgICAgYnl0ZXNbaSArIDFdID0gYmFja2dyb3VuZENvbG9yWzFdO1xuICAgICAgICAgIGJ5dGVzW2kgKyAyXSA9IGJhY2tncm91bmRDb2xvclsyXTtcbiAgICAgICAgICBieXRlc1tpICsgM10gPSAyNTU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWd1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRyYXdGaWd1cmUoZGF0YSwgZmlndXJlc1tpXSwgY29udGV4dCk7XG4gICAgICB9XG4gICAgICB0bXBDdHgucHV0SW1hZ2VEYXRhKGRhdGEsIEJPUkRFUl9TSVpFLCBCT1JERVJfU0laRSk7XG4gICAgICBjYW52YXMgPSB0bXBDYW52YXMuY2FudmFzO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjYW52YXMsXG4gICAgICBvZmZzZXRYOiBvZmZzZXRYIC0gQk9SREVSX1NJWkUgKiBzY2FsZVgsXG4gICAgICBvZmZzZXRZOiBvZmZzZXRZIC0gQk9SREVSX1NJWkUgKiBzY2FsZVksXG4gICAgICBzY2FsZVgsXG4gICAgICBzY2FsZVksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gY3JlYXRlTWVzaENhbnZhcztcbn0pKCk7XG5cblNoYWRpbmdJUnMuTWVzaCA9IHtcbiAgZnJvbUlSOiBmdW5jdGlvbiBNZXNoX2Zyb21JUihyYXcpIHtcbiAgICAvLyB2YXIgdHlwZSA9IHJhd1sxXTtcbiAgICB2YXIgY29vcmRzID0gcmF3WzJdO1xuICAgIHZhciBjb2xvcnMgPSByYXdbM107XG4gICAgdmFyIGZpZ3VyZXMgPSByYXdbNF07XG4gICAgdmFyIGJvdW5kcyA9IHJhd1s1XTtcbiAgICB2YXIgbWF0cml4ID0gcmF3WzZdO1xuICAgIHZhciBiYm94ID0gcmF3WzddO1xuICAgIHZhciBiYWNrZ3JvdW5kID0gcmF3WzhdO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIlBhdHRlcm5cIixcbiAgICAgIGdldFBhdHRlcm46IGZ1bmN0aW9uIE1lc2hfZ2V0UGF0dGVybihjdHgsIG93bmVyLCBzaGFkaW5nRmlsbCkge1xuICAgICAgICBhcHBseUJvdW5kaW5nQm94KGN0eCwgYmJveCk7XG4gICAgICAgIHZhciBzY2FsZTtcbiAgICAgICAgaWYgKHNoYWRpbmdGaWxsKSB7XG4gICAgICAgICAgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPYnRhaW4gc2NhbGUgZnJvbSBtYXRyaXggYW5kIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxuICAgICAgICAgIHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShvd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICBpZiAobWF0cml4KSB7XG4gICAgICAgICAgICB2YXIgbWF0cml4U2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG1hdHJpeCk7XG4gICAgICAgICAgICBzY2FsZSA9IFtzY2FsZVswXSAqIG1hdHJpeFNjYWxlWzBdLCBzY2FsZVsxXSAqIG1hdHJpeFNjYWxlWzFdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSYXN0ZXJpemluZyBvbiB0aGUgbWFpbiB0aHJlYWQgc2luY2Ugc2VuZGluZy9xdWV1ZSBsYXJnZSBjYW52YXNlc1xuICAgICAgICAvLyBtaWdodCBjYXVzZSBPT00uXG4gICAgICAgIHZhciB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzID0gY3JlYXRlTWVzaENhbnZhcyhcbiAgICAgICAgICBib3VuZHMsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgY29vcmRzLFxuICAgICAgICAgIGNvbG9ycyxcbiAgICAgICAgICBmaWd1cmVzLFxuICAgICAgICAgIHNoYWRpbmdGaWxsID8gbnVsbCA6IGJhY2tncm91bmQsXG4gICAgICAgICAgb3duZXIuY2FjaGVkQ2FudmFzZXMsXG4gICAgICAgICAgb3duZXIud2ViR0xDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFzaGFkaW5nRmlsbCkge1xuICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3R4LCBvd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICBpZiAobWF0cml4KSB7XG4gICAgICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgbWF0cml4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdHgudHJhbnNsYXRlKFxuICAgICAgICAgIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCxcbiAgICAgICAgICB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFlcbiAgICAgICAgKTtcbiAgICAgICAgY3R4LnNjYWxlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7XG5cbiAgICAgICAgcmV0dXJuIGN0eC5jcmVhdGVQYXR0ZXJuKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuY2FudmFzLCBcIm5vLXJlcGVhdFwiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG5cblNoYWRpbmdJUnMuRHVtbXkgPSB7XG4gIGZyb21JUjogZnVuY3Rpb24gRHVtbXlfZnJvbUlSKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIlBhdHRlcm5cIixcbiAgICAgIGdldFBhdHRlcm46IGZ1bmN0aW9uIER1bW15X2Zyb21JUl9nZXRQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gXCJob3RwaW5rXCI7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRTaGFkaW5nUGF0dGVybkZyb21JUihyYXcpIHtcbiAgdmFyIHNoYWRpbmdJUiA9IFNoYWRpbmdJUnNbcmF3WzBdXTtcbiAgaWYgKCFzaGFkaW5nSVIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSVIgdHlwZTogJHtyYXdbMF19YCk7XG4gIH1cbiAgcmV0dXJuIHNoYWRpbmdJUi5mcm9tSVIocmF3KTtcbn1cblxuLyoqXG4gKiBAdHlwZSB7YW55fVxuICovXG52YXIgVGlsaW5nUGF0dGVybiA9IChmdW5jdGlvbiBUaWxpbmdQYXR0ZXJuQ2xvc3VyZSgpIHtcbiAgdmFyIFBhaW50VHlwZSA9IHtcbiAgICBDT0xPUkVEOiAxLFxuICAgIFVOQ09MT1JFRDogMixcbiAgfTtcblxuICB2YXIgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7IC8vIDEwaW4gQCAzMDBkcGkgc2hhbGwgYmUgZW5vdWdoXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBUaWxpbmdQYXR0ZXJuKElSLCBjb2xvciwgY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pIHtcbiAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IElSWzJdO1xuICAgIHRoaXMubWF0cml4ID0gSVJbM10gfHwgWzEsIDAsIDAsIDEsIDAsIDBdO1xuICAgIHRoaXMuYmJveCA9IElSWzRdO1xuICAgIHRoaXMueHN0ZXAgPSBJUls1XTtcbiAgICB0aGlzLnlzdGVwID0gSVJbNl07XG4gICAgdGhpcy5wYWludFR5cGUgPSBJUls3XTtcbiAgICB0aGlzLnRpbGluZ1R5cGUgPSBJUls4XTtcbiAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgdGhpcy5jYW52YXNHcmFwaGljc0ZhY3RvcnkgPSBjYW52YXNHcmFwaGljc0ZhY3Rvcnk7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gYmFzZVRyYW5zZm9ybTtcbiAgICB0aGlzLnR5cGUgPSBcIlBhdHRlcm5cIjtcbiAgICB0aGlzLmN0eCA9IGN0eDtcbiAgfVxuXG4gIFRpbGluZ1BhdHRlcm4ucHJvdG90eXBlID0ge1xuICAgIGNyZWF0ZVBhdHRlcm5DYW52YXM6IGZ1bmN0aW9uIFRpbGluUGF0dGVybl9jcmVhdGVQYXR0ZXJuQ2FudmFzKG93bmVyKSB7XG4gICAgICB2YXIgb3BlcmF0b3JMaXN0ID0gdGhpcy5vcGVyYXRvckxpc3Q7XG4gICAgICB2YXIgYmJveCA9IHRoaXMuYmJveDtcbiAgICAgIHZhciB4c3RlcCA9IHRoaXMueHN0ZXA7XG4gICAgICB2YXIgeXN0ZXAgPSB0aGlzLnlzdGVwO1xuICAgICAgdmFyIHBhaW50VHlwZSA9IHRoaXMucGFpbnRUeXBlO1xuICAgICAgdmFyIHRpbGluZ1R5cGUgPSB0aGlzLnRpbGluZ1R5cGU7XG4gICAgICB2YXIgY29sb3IgPSB0aGlzLmNvbG9yO1xuICAgICAgdmFyIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IHRoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5O1xuXG4gICAgICBpbmZvKFwiVGlsaW5nVHlwZTogXCIgKyB0aWxpbmdUeXBlKTtcblxuICAgICAgLy8gQSB0aWxpbmcgcGF0dGVybiBhcyBkZWZpbmVkIGJ5IFBERiBzcGVjIDguNy4yIGlzIGEgY2VsbCB3aG9zZSBzaXplIGlzXG4gICAgICAvLyBkZXNjcmliZWQgYnkgYmJveCwgYW5kIG1heSByZXBlYXQgcmVndWxhcmx5IGJ5IHNoaWZ0aW5nIHRoZSBjZWxsIGJ5XG4gICAgICAvLyB4c3RlcCBhbmQgeXN0ZXAuXG4gICAgICAvLyBCZWNhdXNlIHRoZSBIVE1MNSBjYW52YXMgQVBJIGRvZXMgbm90IHN1cHBvcnQgcGF0dGVybiByZXBldGl0aW9uIHdpdGhcbiAgICAgIC8vIGdhcHMgaW4gYmV0d2Vlbiwgd2UgdXNlIHRoZSB4c3RlcC95c3RlcCBpbnN0ZWFkIG9mIHRoZSBiYm94J3Mgc2l6ZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGhhcyB0aGUgZm9sbG93aW5nIGNvbnNlcXVlbmNlcyAoc2ltaWxhcmx5IGZvciB5c3RlcCk6XG4gICAgICAvL1xuICAgICAgLy8gLSBJZiB4c3RlcCBpcyB0aGUgc2FtZSBhcyBiYm94LCB0aGVuIHRoZXJlIGlzIG5vIG9ic2VydmFibGUgZGlmZmVyZW5jZS5cbiAgICAgIC8vXG4gICAgICAvLyAtIElmIHhzdGVwIGlzIGxhcmdlciB0aGFuIGJib3gsIHRoZW4gdGhlIHBhdHRlcm4gY2FudmFzIGlzIHBhcnRpYWxseVxuICAgICAgLy8gICBlbXB0eTogdGhlIGFyZWEgYm91bmRlZCBieSBiYm94IGlzIHBhaW50ZWQsIHRoZSBvdXRzaWRlIGFyZWEgaXMgdm9pZC5cbiAgICAgIC8vXG4gICAgICAvLyAtIElmIHhzdGVwIGlzIHNtYWxsZXIgdGhhbiBiYm94LCB0aGVuIHRoZSBwaXhlbHMgYmV0d2VlbiB4c3RlcCBhbmQgdGhlXG4gICAgICAvLyAgIGJib3ggYm91bmRhcnkgd2lsbCBiZSBtaXNzaW5nLiBUaGlzIGlzIElOQ09SUkVDVCBiZWhhdmlvci5cbiAgICAgIC8vICAgXCJGaWd1cmVzIG9uIGFkamFjZW50IHRpbGVzIHNob3VsZCBub3Qgb3ZlcmxhcFwiIChQREYgc3BlYyA4LjcuMy4xKSxcbiAgICAgIC8vICAgYnV0IG92ZXJsYXBwaW5nIGNlbGxzIHdpdGhvdXQgY29tbW9uIHBpeGVscyBhcmUgc3RpbGwgdmFsaWQuXG4gICAgICAvLyAgIFRPRE86IEZpeCB0aGUgaW1wbGVtZW50YXRpb24sIHRvIGFsbG93IHRoaXMgc2NlbmFyaW8gdG8gYmUgcGFpbnRlZFxuICAgICAgLy8gICBjb3JyZWN0bHkuXG5cbiAgICAgIHZhciB4MCA9IGJib3hbMF0sXG4gICAgICAgIHkwID0gYmJveFsxXSxcbiAgICAgICAgeDEgPSBiYm94WzJdLFxuICAgICAgICB5MSA9IGJib3hbM107XG5cbiAgICAgIC8vIE9idGFpbiBzY2FsZSBmcm9tIG1hdHJpeCBhbmQgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXG4gICAgICB2YXIgbWF0cml4U2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KTtcbiAgICAgIHZhciBjdXJNYXRyaXhTY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoXG4gICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVxuICAgICAgKTtcbiAgICAgIHZhciBjb21iaW5lZFNjYWxlID0gW1xuICAgICAgICBtYXRyaXhTY2FsZVswXSAqIGN1ck1hdHJpeFNjYWxlWzBdLFxuICAgICAgICBtYXRyaXhTY2FsZVsxXSAqIGN1ck1hdHJpeFNjYWxlWzFdLFxuICAgICAgXTtcblxuICAgICAgLy8gVXNlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIHRoYXQgYXJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBlbmRcbiAgICAgIC8vIHJlc3VsdCB3aGVuIHRoZSBwYXR0ZXJuIGlzIHVzZWQuIFRvbyBsb3cgdmFsdWUgbWFrZXMgdGhlIHBhdHRlcm4gbG9va1xuICAgICAgLy8gYmx1cnJ5LiBUb28gbGFyZ2UgdmFsdWUgbWFrZXMgaXQgbG9vayB0b28gY3Jpc3B5LlxuICAgICAgdmFyIGRpbXggPSB0aGlzLmdldFNpemVBbmRTY2FsZShcbiAgICAgICAgeHN0ZXAsXG4gICAgICAgIHRoaXMuY3R4LmNhbnZhcy53aWR0aCxcbiAgICAgICAgY29tYmluZWRTY2FsZVswXVxuICAgICAgKTtcbiAgICAgIHZhciBkaW15ID0gdGhpcy5nZXRTaXplQW5kU2NhbGUoXG4gICAgICAgIHlzdGVwLFxuICAgICAgICB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0LFxuICAgICAgICBjb21iaW5lZFNjYWxlWzFdXG4gICAgICApO1xuXG4gICAgICB2YXIgdG1wQ2FudmFzID0gb3duZXIuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFxuICAgICAgICBcInBhdHRlcm5cIixcbiAgICAgICAgZGlteC5zaXplLFxuICAgICAgICBkaW15LnNpemUsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICB2YXIgZ3JhcGhpY3MgPSBjYW52YXNHcmFwaGljc0ZhY3RvcnkuY3JlYXRlQ2FudmFzR3JhcGhpY3ModG1wQ3R4KTtcbiAgICAgIGdyYXBoaWNzLmdyb3VwTGV2ZWwgPSBvd25lci5ncm91cExldmVsO1xuXG4gICAgICB0aGlzLnNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChncmFwaGljcywgcGFpbnRUeXBlLCBjb2xvcik7XG5cbiAgICAgIGdyYXBoaWNzLnRyYW5zZm9ybShkaW14LnNjYWxlLCAwLCAwLCBkaW15LnNjYWxlLCAwLCAwKTtcblxuICAgICAgLy8gdHJhbnNmb3JtIGNvb3JkaW5hdGVzIHRvIHBhdHRlcm4gc3BhY2VcbiAgICAgIGdyYXBoaWNzLnRyYW5zZm9ybSgxLCAwLCAwLCAxLCAteDAsIC15MCk7XG5cbiAgICAgIHRoaXMuY2xpcEJib3goZ3JhcGhpY3MsIGJib3gsIHgwLCB5MCwgeDEsIHkxKTtcblxuICAgICAgZ3JhcGhpY3MuZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QpO1xuXG4gICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oMSwgMCwgMCwgMSwgeDAsIHkwKTtcblxuICAgICAgLy8gUmVzY2FsZSBjYW52YXMgc28gdGhhdCB0aGUgY3R4LmNyZWF0ZVBhdHRlcm4gY2FsbCBnZW5lcmF0ZXMgYSBwYXR0ZXJuXG4gICAgICAvLyB3aXRoIHRoZSBkZXNpcmVkIHNpemUuXG4gICAgICB0aGlzLmN0eC5zY2FsZSgxIC8gZGlteC5zY2FsZSwgMSAvIGRpbXkuc2NhbGUpO1xuICAgICAgcmV0dXJuIHRtcENhbnZhcy5jYW52YXM7XG4gICAgfSxcblxuICAgIGdldFNpemVBbmRTY2FsZTogZnVuY3Rpb24gVGlsaW5nUGF0dGVybl9nZXRTaXplQW5kU2NhbGUoXG4gICAgICBzdGVwLFxuICAgICAgcmVhbE91dHB1dFNpemUsXG4gICAgICBzY2FsZVxuICAgICkge1xuICAgICAgLy8geHN0ZXAgLyB5c3RlcCBtYXkgYmUgbmVnYXRpdmUgLS0gbm9ybWFsaXplLlxuICAgICAgc3RlcCA9IE1hdGguYWJzKHN0ZXApO1xuICAgICAgLy8gTUFYX1BBVFRFUk5fU0laRSBpcyB1c2VkIHRvIGF2b2lkIE9PTSBzaXR1YXRpb24uXG4gICAgICAvLyBVc2UgdGhlIGRlc3RpbmF0aW9uIGNhbnZhcydzIHNpemUgaWYgaXQgaXMgYmlnZ2VyIHRoYW4gdGhlIGhhcmQtY29kZWRcbiAgICAgIC8vIGxpbWl0IG9mIE1BWF9QQVRURVJOX1NJWkUgdG8gYXZvaWQgY2xpcHBpbmcgcGF0dGVybnMgdGhhdCBjb3ZlciB0aGVcbiAgICAgIC8vIHdob2xlIGNhbnZhcy5cbiAgICAgIHZhciBtYXhTaXplID0gTWF0aC5tYXgoTUFYX1BBVFRFUk5fU0laRSwgcmVhbE91dHB1dFNpemUpO1xuICAgICAgdmFyIHNpemUgPSBNYXRoLmNlaWwoc3RlcCAqIHNjYWxlKTtcbiAgICAgIGlmIChzaXplID49IG1heFNpemUpIHtcbiAgICAgICAgc2l6ZSA9IG1heFNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2FsZSA9IHNpemUgLyBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc2NhbGUsIHNpemUgfTtcbiAgICB9LFxuXG4gICAgY2xpcEJib3g6IGZ1bmN0aW9uIGNsaXBCYm94KGdyYXBoaWNzLCBiYm94LCB4MCwgeTAsIHgxLCB5MSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgdmFyIGJib3hXaWR0aCA9IHgxIC0geDA7XG4gICAgICAgIHZhciBiYm94SGVpZ2h0ID0geTEgLSB5MDtcbiAgICAgICAgZ3JhcGhpY3MuY3R4LnJlY3QoeDAsIHkwLCBiYm94V2lkdGgsIGJib3hIZWlnaHQpO1xuICAgICAgICBncmFwaGljcy5jbGlwKCk7XG4gICAgICAgIGdyYXBoaWNzLmVuZFBhdGgoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0OiBmdW5jdGlvbiBzZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQoXG4gICAgICBncmFwaGljcyxcbiAgICAgIHBhaW50VHlwZSxcbiAgICAgIGNvbG9yXG4gICAgKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gZ3JhcGhpY3MuY3R4LFxuICAgICAgICBjdXJyZW50ID0gZ3JhcGhpY3MuY3VycmVudDtcbiAgICAgIHN3aXRjaCAocGFpbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgUGFpbnRUeXBlLkNPTE9SRUQ6XG4gICAgICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY3R4LnN0cm9rZVN0eWxlO1xuICAgICAgICAgIGN1cnJlbnQuZmlsbENvbG9yID0gY3R4LmZpbGxTdHlsZTtcbiAgICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3R4LnN0cm9rZVN0eWxlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhaW50VHlwZS5VTkNPTE9SRUQ6XG4gICAgICAgICAgdmFyIGNzc0NvbG9yID0gVXRpbC5tYWtlQ3NzUmdiKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY3NzQ29sb3I7XG4gICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNzc0NvbG9yO1xuICAgICAgICAgIC8vIFNldCBjb2xvciBuZWVkZWQgYnkgaW1hZ2UgbWFza3MgKGZpeGVzIGlzc3VlcyAzMjI2IGFuZCA4NzQxKS5cbiAgICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGNzc0NvbG9yO1xuICAgICAgICAgIGN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjc3NDb2xvcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHBhaW50IHR5cGU6ICR7cGFpbnRUeXBlfWApO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRQYXR0ZXJuOiBmdW5jdGlvbiBUaWxpbmdQYXR0ZXJuX2dldFBhdHRlcm4oY3R4LCBvd25lcikge1xuICAgICAgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAvLyBQREYgc3BlYyA4LjcuMiBOT1RFIDE6IHBhdHRlcm4ncyBtYXRyaXggaXMgcmVsYXRpdmUgdG8gaW5pdGlhbCBtYXRyaXguXG4gICAgICBjdHguc2V0VHJhbnNmb3JtLmFwcGx5KGN0eCwgdGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCB0aGlzLm1hdHJpeCk7XG5cbiAgICAgIHZhciB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzID0gdGhpcy5jcmVhdGVQYXR0ZXJuQ2FudmFzKG93bmVyKTtcblxuICAgICAgcmV0dXJuIGN0eC5jcmVhdGVQYXR0ZXJuKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMsIFwicmVwZWF0XCIpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIFRpbGluZ1BhdHRlcm47XG59KSgpO1xuXG5leHBvcnQgeyBnZXRTaGFkaW5nUGF0dGVybkZyb21JUiwgVGlsaW5nUGF0dGVybiB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTggTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2xvYmFsV29ya2VyT3B0aW9uc1R5cGVcbiAqIEBwcm9wZXJ0eSB7V29ya2VyIHwgbnVsbH0gd29ya2VyUG9ydCAtIERlZmluZXMgZ2xvYmFsIHBvcnQgZm9yIHdvcmtlclxuICogICBwcm9jZXNzLiBPdmVycmlkZXMgdGhlIGB3b3JrZXJTcmNgIG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3b3JrZXJTcmMgLSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIGFuZCBmaWxlbmFtZVxuICogICBvZiB0aGUgd29ya2VyIGZpbGUuXG4gKlxuICogICBOT1RFOiBUaGUgYHdvcmtlclNyY2Agb3B0aW9uIHNob3VsZCBhbHdheXMgYmUgc2V0LCBpbiBvcmRlciB0byBwcmV2ZW50IGFueVxuICogICAgICAgICBpc3N1ZXMgd2hlbiB1c2luZyB0aGUgUERGLmpzIGxpYnJhcnkuXG4gKi9cblxuLyoqIEB0eXBlIHtHbG9iYWxXb3JrZXJPcHRpb25zVHlwZX0gKi9cbmNvbnN0IEdsb2JhbFdvcmtlck9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnQgPVxuICBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnQgPT09IHVuZGVmaW5lZFxuICAgID8gbnVsbFxuICAgIDogR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0O1xuXG5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9XG4gIEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID09PSB1bmRlZmluZWRcbiAgICA/IFwiXCJcbiAgICA6IEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjO1xuXG5leHBvcnQgeyBHbG9iYWxXb3JrZXJPcHRpb25zIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxOCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yLCBwcmVmZXItY29uc3Q6IGVycm9yICovXG5cbmltcG9ydCB7XG4gIEFib3J0RXhjZXB0aW9uLFxuICBhc3NlcnQsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBNaXNzaW5nUERGRXhjZXB0aW9uLFxuICBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sXG4gIFVua25vd25FcnJvckV4Y2VwdGlvbixcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5jb25zdCBDYWxsYmFja0tpbmQgPSB7XG4gIFVOS05PV046IDAsXG4gIERBVEE6IDEsXG4gIEVSUk9SOiAyLFxufTtcblxuY29uc3QgU3RyZWFtS2luZCA9IHtcbiAgVU5LTk9XTjogMCxcbiAgQ0FOQ0VMOiAxLFxuICBDQU5DRUxfQ09NUExFVEU6IDIsXG4gIENMT1NFOiAzLFxuICBFTlFVRVVFOiA0LFxuICBFUlJPUjogNSxcbiAgUFVMTDogNixcbiAgUFVMTF9DT01QTEVURTogNyxcbiAgU1RBUlRfQ09NUExFVEU6IDgsXG59O1xuXG5mdW5jdGlvbiB3cmFwUmVhc29uKHJlYXNvbikge1xuICBpZiAoXG4gICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAgICAgKHR5cGVvZiByZWFzb24gPT09IFwib2JqZWN0XCIgJiYgcmVhc29uICE9PSBudWxsKSxcbiAgICAgICd3cmFwUmVhc29uOiBFeHBlY3RlZCBcInJlYXNvblwiIHRvIGJlIGEgKHBvc3NpYmx5IGNsb25lZCkgRXJyb3IuJ1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiByZWFzb24gIT09IFwib2JqZWN0XCIgfHwgcmVhc29uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVhc29uO1xuICAgIH1cbiAgfVxuICBzd2l0Y2ggKHJlYXNvbi5uYW1lKSB7XG4gICAgY2FzZSBcIkFib3J0RXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IEFib3J0RXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTtcbiAgICBjYXNlIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTtcbiAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnN0YXR1cyk7XG4gICAgY2FzZSBcIlVua25vd25FcnJvckV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5kZXRhaWxzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi50b1N0cmluZygpKTtcbiAgfVxufVxuXG5jbGFzcyBNZXNzYWdlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZU5hbWUsIHRhcmdldE5hbWUsIGNvbU9iaikge1xuICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7XG4gICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTtcbiAgICB0aGlzLmNvbU9iaiA9IGNvbU9iajtcbiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxO1xuICAgIHRoaXMuc3RyZWFtSWQgPSAxO1xuICAgIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSB0cnVlO1xuICAgIHRoaXMuc3RyZWFtU2lua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSA9IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gdGhpcy5zb3VyY2VOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnN0cmVhbSkge1xuICAgICAgICB0aGlzLl9wcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07XG4gICAgICAgIGlmICghY2FwYWJpbGl0eSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdO1xuXG4gICAgICAgIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuREFUQSkge1xuICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZShkYXRhLmRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5FUlJPUikge1xuICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTtcbiAgICAgIGlmICghYWN0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhY3Rpb24gZnJvbSB3b3JrZXI6ICR7ZGF0YS5hY3Rpb259YCk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5jYWxsYmFja0lkKSB7XG4gICAgICAgIGNvbnN0IGNiU291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTtcbiAgICAgICAgY29uc3QgY2JUYXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSkpO1xuICAgICAgICB9KS50aGVuKFxuICAgICAgICAgIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLFxuICAgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkRBVEEsXG4gICAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWU6IGNiVGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5FUlJPUixcbiAgICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLFxuICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuc3RyZWFtSWQpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlU3RyZWFtU2luayhkYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYWN0aW9uKGRhdGEuZGF0YSk7XG4gICAgfTtcbiAgICBjb21PYmouYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuICB9XG5cbiAgb24oYWN0aW9uTmFtZSwgaGFuZGxlcikge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgdHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgJ01lc3NhZ2VIYW5kbGVyLm9uOiBFeHBlY3RlZCBcImhhbmRsZXJcIiB0byBiZSBhIGZ1bmN0aW9uLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFoID0gdGhpcy5hY3Rpb25IYW5kbGVyO1xuICAgIGlmIChhaFthY3Rpb25OYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkIFwiJHthY3Rpb25OYW1lfVwiYCk7XG4gICAgfVxuICAgIGFoW2FjdGlvbk5hbWVdID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGNvbU9iaiB0byBpbnZva2UgdGhlIGFjdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIEFjdGlvbiB0byBjYWxsLlxuICAgKiBAcGFyYW0ge0pTT059IGRhdGEgLSBKU09OIGRhdGEgdG8gc2VuZC5cbiAgICogQHBhcmFtIHtBcnJheX0gW3RyYW5zZmVyc10gLSBMaXN0IG9mIHRyYW5zZmVycy9BcnJheUJ1ZmZlcnMuXG4gICAqL1xuICBzZW5kKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykge1xuICAgIHRoaXMuX3Bvc3RNZXNzYWdlKFxuICAgICAge1xuICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICAgIHRyYW5zZmVyc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBjb21PYmogdG8gaW52b2tlIHRoZSBhY3Rpb24gd2l0aCB0aGUgc3VwcGxpZWQgZGF0YS5cbiAgICogRXhwZWN0cyB0aGF0IHRoZSBvdGhlciBzaWRlIHdpbGwgY2FsbGJhY2sgd2l0aCB0aGUgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gQWN0aW9uIHRvIGNhbGwuXG4gICAqIEBwYXJhbSB7SlNPTn0gZGF0YSAtIEpTT04gZGF0YSB0byBzZW5kLlxuICAgKiBAcGFyYW0ge0FycmF5fSBbdHJhbnNmZXJzXSAtIExpc3Qgb2YgdHJhbnNmZXJzL0FycmF5QnVmZmVycy5cbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdG8gYmUgcmVzb2x2ZWQgd2l0aCByZXNwb25zZSBkYXRhLlxuICAgKi9cbiAgc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykge1xuICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKztcbiAgICBjb25zdCBjYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdID0gY2FwYWJpbGl0eTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fcG9zdE1lc3NhZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLFxuICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcbiAgICAgICAgICBjYWxsYmFja0lkLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZmVyc1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY2FwYWJpbGl0eS5yZWplY3QoZXgpO1xuICAgIH1cbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY29tT2JqIHRvIGludm9rZSB0aGUgYWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGRhdGEuXG4gICAqIEV4cGVjdCB0aGF0IHRoZSBvdGhlciBzaWRlIHdpbGwgY2FsbGJhY2sgdG8gc2lnbmFsICdzdGFydF9jb21wbGV0ZScuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gQWN0aW9uIHRvIGNhbGwuXG4gICAqIEBwYXJhbSB7SlNPTn0gZGF0YSAtIEpTT04gZGF0YSB0byBzZW5kLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcXVldWVpbmdTdHJhdGVneSAtIFN0cmF0ZWd5IHRvIHNpZ25hbCBiYWNrcHJlc3N1cmUgYmFzZWQgb25cbiAgICogICAgICAgICAgICAgICAgIGludGVybmFsIHF1ZXVlLlxuICAgKiBAcGFyYW0ge0FycmF5fSBbdHJhbnNmZXJzXSAtIExpc3Qgb2YgdHJhbnNmZXJzL0FycmF5QnVmZmVycy5cbiAgICogQHJldHVybnMge1JlYWRhYmxlU3RyZWFtfSBSZWFkYWJsZVN0cmVhbSB0byByZWFkIGRhdGEgaW4gY2h1bmtzLlxuICAgKi9cbiAgc2VuZFdpdGhTdHJlYW0oYWN0aW9uTmFtZSwgZGF0YSwgcXVldWVpbmdTdHJhdGVneSwgdHJhbnNmZXJzKSB7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSB0aGlzLnN0cmVhbUlkKys7XG4gICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gdGhpcy50YXJnZXROYW1lO1xuICAgIGNvbnN0IGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbShcbiAgICAgIHtcbiAgICAgICAgc3RhcnQ6IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0Q2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0gPSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICAgICAgc3RhcnRDYWxsOiBzdGFydENhcGFiaWxpdHksXG4gICAgICAgICAgICBwdWxsQ2FsbDogbnVsbCxcbiAgICAgICAgICAgIGNhbmNlbENhbGw6IG51bGwsXG4gICAgICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLl9wb3N0TWVzc2FnZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhbnNmZXJzXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBSZXR1cm4gUHJvbWlzZSBmb3IgQXN5bmMgcHJvY2VzcywgdG8gc2lnbmFsIHN1Y2Nlc3MvZmFpbHVyZS5cbiAgICAgICAgICByZXR1cm4gc3RhcnRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcHVsbDogY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgY29uc3QgcHVsbENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsID0gcHVsbENhcGFiaWxpdHk7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTEwsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFJldHVybmluZyBQcm9taXNlIHdpbGwgbm90IGNhbGwgXCJwdWxsXCJcbiAgICAgICAgICAvLyBhZ2FpbiB1bnRpbCBjdXJyZW50IHB1bGwgaXMgcmVzb2x2ZWQuXG4gICAgICAgICAgcmV0dXJuIHB1bGxDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FuY2VsOiByZWFzb24gPT4ge1xuICAgICAgICAgIGFzc2VydChyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgXCJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuICAgICAgICAgIGNvbnN0IGNhbmNlbENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5O1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBSZXR1cm4gUHJvbWlzZSB0byBzaWduYWwgc3VjY2VzcyBvciBmYWlsdXJlLlxuICAgICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcXVldWVpbmdTdHJhdGVneVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jcmVhdGVTdHJlYW1TaW5rKGRhdGEpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZDtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgIGNvbnN0IHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG4gICAgY29uc3QgY29tT2JqID0gdGhpcy5jb21PYmo7XG5cbiAgICBjb25zdCBzdHJlYW1TaW5rID0ge1xuICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSA9IDEsIHRyYW5zZmVycykge1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0RGVzaXJlZFNpemUgPSB0aGlzLmRlc2lyZWRTaXplO1xuICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7XG4gICAgICAgIC8vIEVucXVldWUgZGVjcmVhc2VzIHRoZSBkZXNpcmVkU2l6ZSBwcm9wZXJ0eSBvZiBzaW5rLFxuICAgICAgICAvLyBzbyB3aGVuIGl0IGNoYW5nZXMgZnJvbSBwb3NpdGl2ZSB0byBuZWdhdGl2ZSxcbiAgICAgICAgLy8gc2V0IHJlYWR5IGFzIHVucmVzb2x2ZWQgcHJvbWlzZS5cbiAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5zaW5rQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5yZWFkeSA9IHRoaXMuc2lua0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9wb3N0TWVzc2FnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FTlFVRVVFLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRyYW5zZmVyc1xuICAgICAgICApO1xuICAgICAgfSxcblxuICAgICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgIH0pO1xuICAgICAgICBkZWxldGUgc2VsZi5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgICB9LFxuXG4gICAgICBlcnJvcihyZWFzb24pIHtcbiAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCBcImVycm9yIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvblwiKTtcbiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FUlJPUixcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICBzaW5rQ2FwYWJpbGl0eTogY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKSxcbiAgICAgIG9uUHVsbDogbnVsbCxcbiAgICAgIG9uQ2FuY2VsOiBudWxsLFxuICAgICAgaXNDYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgZGVzaXJlZFNpemU6IGRhdGEuZGVzaXJlZFNpemUsXG4gICAgICByZWFkeTogbnVsbCxcbiAgICB9O1xuXG4gICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgc3RyZWFtU2luay5yZWFkeSA9IHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSA9IHN0cmVhbVNpbms7XG4gICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSwgc3RyZWFtU2luaykpO1xuICAgIH0pLnRoZW4oXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQ7XG4gICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lO1xuICAgIGNvbnN0IGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuXG4gICAgc3dpdGNoIChkYXRhLnN0cmVhbSkge1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFOlxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5zdGFydENhbGwucmVqZWN0KFxuICAgICAgICAgICAgd3JhcFJlYXNvbihkYXRhLnJlYXNvbilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbC5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwucmVqZWN0KFxuICAgICAgICAgICAgd3JhcFJlYXNvbihkYXRhLnJlYXNvbilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTEw6XG4gICAgICAgIC8vIElnbm9yZSBhbnkgcHVsbCBhZnRlciBjbG9zZSBpcyBjYWxsZWQuXG4gICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBQdWxsIGluY3JlYXNlcyB0aGUgZGVzaXJlZFNpemUgcHJvcGVydHkgb2Ygc2luayxcbiAgICAgICAgLy8gc28gd2hlbiBpdCBjaGFuZ2VzIGZyb20gbmVnYXRpdmUgdG8gcG9zaXRpdmUsXG4gICAgICAgIC8vIHNldCByZWFkeSBwcm9wZXJ0eSBhcyByZXNvbHZlZCBwcm9taXNlLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uZGVzaXJlZFNpemUgPD0gMCAmJlxuICAgICAgICAgIGRhdGEuZGVzaXJlZFNpemUgPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNldCBkZXNpcmVkU2l6ZSBwcm9wZXJ0eSBvZiBzaW5rIG9uIGV2ZXJ5IHB1bGwuXG4gICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLmRlc2lyZWRTaXplID0gZGF0YS5kZXNpcmVkU2l6ZTtcbiAgICAgICAgY29uc3QgeyBvblB1bGwgfSA9IHRoaXMuc3RyZWFtU2lua3NbZGF0YS5zdHJlYW1JZF07XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShvblB1bGwgJiYgb25QdWxsKCkpO1xuICAgICAgICB9KS50aGVuKFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuICAgICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuRU5RVUVVRTpcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLFxuICAgICAgICAgIFwiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZW5xdWV1ZShkYXRhLmNodW5rKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0xPU0U6XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSxcbiAgICAgICAgICBcImNsb3NlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5FUlJPUjpcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLFxuICAgICAgICAgIFwiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIHdyYXBSZWFzb24oZGF0YS5yZWFzb24pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsLnJlamVjdChcbiAgICAgICAgICAgIHdyYXBSZWFzb24oZGF0YS5yZWFzb24pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOlxuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBvbkNhbmNlbCB9ID0gdGhpcy5zdHJlYW1TaW5rc1tkYXRhLnN0cmVhbUlkXTtcbiAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKG9uQ2FuY2VsICYmIG9uQ2FuY2VsKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKSk7XG4gICAgICAgIH0pLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSxcbiAgICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG4gICAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uc2lua0NhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgIHdyYXBSZWFzb24oZGF0YS5yZWFzb24pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2VcIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3luYyBfZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCkge1xuICAgIC8vIERlbGV0ZSB0aGUgYHN0cmVhbUNvbnRyb2xsZXJgIG9ubHkgd2hlbiB0aGUgc3RhcnQsIHB1bGwsIGFuZCBjYW5jZWxcbiAgICAvLyBjYXBhYmlsaXRpZXMgaGF2ZSBzZXR0bGVkLCB0byBwcmV2ZW50IGBUeXBlRXJyb3Jgcy5cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBbXG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnN0YXJ0Q2FsbCxcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwsXG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwsXG4gICAgICBdLm1hcChmdW5jdGlvbiAoY2FwYWJpbGl0eSkge1xuICAgICAgICByZXR1cm4gY2FwYWJpbGl0eSAmJiBjYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9KVxuICAgICk7XG4gICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHJhdyBtZXNzYWdlIHRvIHRoZSBjb21PYmouXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlIC0gUmF3IG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB0cmFuc2ZlcnMgTGlzdCBvZiB0cmFuc2ZlcnMvQXJyYXlCdWZmZXJzLCBvciB1bmRlZmluZWQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJzKSB7XG4gICAgaWYgKHRyYW5zZmVycyAmJiB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzKSB7XG4gICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2ZlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBNZXNzYWdlSGFuZGxlciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgU2ltcGxlWE1MUGFyc2VyIH0gZnJvbSBcIi4veG1sX3BhcnNlci5qc1wiO1xuXG5jbGFzcyBNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICBhc3NlcnQodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIsIFwiTWV0YWRhdGE6IGlucHV0IGlzIG5vdCBhIHN0cmluZ1wiKTtcblxuICAgIC8vIEdob3N0c2NyaXB0IG1heSBwcm9kdWNlIGludmFsaWQgbWV0YWRhdGEsIHNvIHRyeSB0byByZXBhaXIgdGhhdCBmaXJzdC5cbiAgICBkYXRhID0gdGhpcy5fcmVwYWlyKGRhdGEpO1xuXG4gICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIGFuIFhNTCBkb2N1bWVudC5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU2ltcGxlWE1MUGFyc2VyKCk7XG4gICAgY29uc3QgeG1sRG9jdW1lbnQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGRhdGEpO1xuXG4gICAgdGhpcy5fbWV0YWRhdGFNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAoeG1sRG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuX3BhcnNlKHhtbERvY3VtZW50KTtcbiAgICB9XG4gIH1cblxuICBfcmVwYWlyKGRhdGEpIHtcbiAgICAvLyBTdGFydCBieSByZW1vdmluZyBhbnkgXCJqdW5rXCIgYmVmb3JlIHRoZSBmaXJzdCB0YWcgKHNlZSBpc3N1ZSAxMDM5NSkuXG4gICAgcmV0dXJuIGRhdGFcbiAgICAgIC5yZXBsYWNlKC9eW148XSsvLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoLz5cXFxcMzc2XFxcXDM3NyhbXjxdKykvZywgZnVuY3Rpb24gKGFsbCwgY29kZXMpIHtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBjb2Rlc1xuICAgICAgICAgIC5yZXBsYWNlKC9cXFxcKFswLTNdKShbMC03XSkoWzAtN10pL2csIGZ1bmN0aW9uIChjb2RlLCBkMSwgZDIsIGQzKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShkMSAqIDY0ICsgZDIgKiA4ICsgZDMgKiAxKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXBsYWNlKC8mKGFtcHxhcG9zfGd0fGx0fHF1b3QpOy9nLCBmdW5jdGlvbiAoc3RyLCBuYW1lKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImFtcFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIiZcIjtcbiAgICAgICAgICAgICAgY2FzZSBcImFwb3NcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCInXCI7XG4gICAgICAgICAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIj5cIjtcbiAgICAgICAgICAgICAgY2FzZSBcImx0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiPFwiO1xuICAgICAgICAgICAgICBjYXNlIFwicXVvdFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAnXCInO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBfcmVwYWlyOiAke25hbWV9IGlzbid0IGRlZmluZWQuYCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGNoYXJzID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IGNvZGUgPSBieXRlcy5jaGFyQ29kZUF0KGkpICogMjU2ICsgYnl0ZXMuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29kZSA+PSAvKiBTcGFjZSA9ICovIDMyICYmXG4gICAgICAgICAgICBjb2RlIDwgLyogRGVsZXRlID0gKi8gMTI3ICYmXG4gICAgICAgICAgICBjb2RlICE9PSAvKiAnPCcgPSAqLyA2MCAmJlxuICAgICAgICAgICAgY29kZSAhPT0gLyogJz4nID0gKi8gNjIgJiZcbiAgICAgICAgICAgIGNvZGUgIT09IC8qICcmJyA9ICovIDM4XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjaGFycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGFycyArPSBcIiYjeFwiICsgKDB4MTAwMDAgKyBjb2RlKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpICsgXCI7XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiPlwiICsgY2hhcnM7XG4gICAgICB9KTtcbiAgfVxuXG4gIF9wYXJzZSh4bWxEb2N1bWVudCkge1xuICAgIGxldCByZGYgPSB4bWxEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICBpZiAocmRmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwicmRmOnJkZlwiKSB7XG4gICAgICAvLyBXcmFwcGVkIGluIDx4bXBtZXRhPlxuICAgICAgcmRmID0gcmRmLmZpcnN0Q2hpbGQ7XG4gICAgICB3aGlsZSAocmRmICYmIHJkZi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInJkZjpyZGZcIikge1xuICAgICAgICByZGYgPSByZGYubmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZU5hbWUgPSByZGYgPyByZGYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgaWYgKCFyZGYgfHwgbm9kZU5hbWUgIT09IFwicmRmOnJkZlwiIHx8ICFyZGYuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSByZGYuY2hpbGROb2RlcztcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCBkZXNjID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoZGVzYy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInJkZjpkZXNjcmlwdGlvblwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBqID0gMCwgamogPSBkZXNjLmNoaWxkTm9kZXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBpZiAoZGVzYy5jaGlsZE5vZGVzW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiI3RleHRcIikge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZGVzYy5jaGlsZE5vZGVzW2pdO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgdGhpcy5fbWV0YWRhdGFNYXAuc2V0KG5hbWUsIGVudHJ5LnRleHRDb250ZW50LnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQobmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YU1hcC5oYXMobmFtZSkgPyB0aGlzLl9tZXRhZGF0YU1hcC5nZXQobmFtZSkgOiBudWxsO1xuICB9XG5cbiAgZ2V0QWxsKCkge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fbWV0YWRhdGFNYXApO1xuICB9XG5cbiAgaGFzKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFNYXAuaGFzKG5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IE1ldGFkYXRhIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxOCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gVGhlIGNvZGUgZm9yIFhNTFBhcnNlckJhc2UgY29waWVkIGZyb21cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NodW13YXkvYmxvYi8xNjQ1MWQ4ODM2ZmE4NWY0YjE2ZWVkYThiNGJkYTJmYTllMmIyMmIwL3NyYy9hdm0yL25hdGl2ZXMveG1sLnRzXG5cbmNvbnN0IFhNTFBhcnNlckVycm9yQ29kZSA9IHtcbiAgTm9FcnJvcjogMCxcbiAgRW5kT2ZEb2N1bWVudDogLTEsXG4gIFVudGVybWluYXRlZENkYXQ6IC0yLFxuICBVbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbjogLTMsXG4gIFVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbjogLTQsXG4gIFVudGVybWluYXRlZENvbW1lbnQ6IC01LFxuICBNYWxmb3JtZWRFbGVtZW50OiAtNixcbiAgT3V0T2ZNZW1vcnk6IC03LFxuICBVbnRlcm1pbmF0ZWRBdHRyaWJ1dGVWYWx1ZTogLTgsXG4gIFVudGVybWluYXRlZEVsZW1lbnQ6IC05LFxuICBFbGVtZW50TmV2ZXJCZWd1bjogLTEwLFxufTtcblxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKHMsIGluZGV4KSB7XG4gIGNvbnN0IGNoID0gc1tpbmRleF07XG4gIHJldHVybiBjaCA9PT0gXCIgXCIgfHwgY2ggPT09IFwiXFxuXCIgfHwgY2ggPT09IFwiXFxyXCIgfHwgY2ggPT09IFwiXFx0XCI7XG59XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZVN0cmluZyhzKSB7XG4gIGZvciAobGV0IGkgPSAwLCBpaSA9IHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgIGlmICghaXNXaGl0ZXNwYWNlKHMsIGkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jbGFzcyBYTUxQYXJzZXJCYXNlIHtcbiAgX3Jlc29sdmVFbnRpdGllcyhzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvJihbXjtdKyk7L2csIChhbGwsIGVudGl0eSkgPT4ge1xuICAgICAgaWYgKGVudGl0eS5zdWJzdHJpbmcoMCwgMikgPT09IFwiI3hcIikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlbnRpdHkuc3Vic3RyaW5nKDIpLCAxNikpO1xuICAgICAgfSBlbHNlIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDEpID09PSBcIiNcIikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlbnRpdHkuc3Vic3RyaW5nKDEpLCAxMCkpO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChlbnRpdHkpIHtcbiAgICAgICAgY2FzZSBcImx0XCI6XG4gICAgICAgICAgcmV0dXJuIFwiPFwiO1xuICAgICAgICBjYXNlIFwiZ3RcIjpcbiAgICAgICAgICByZXR1cm4gXCI+XCI7XG4gICAgICAgIGNhc2UgXCJhbXBcIjpcbiAgICAgICAgICByZXR1cm4gXCImXCI7XG4gICAgICAgIGNhc2UgXCJxdW90XCI6XG4gICAgICAgICAgcmV0dXJuICdcIic7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vblJlc29sdmVFbnRpdHkoZW50aXR5KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9wYXJzZUNvbnRlbnQocywgc3RhcnQpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gW107XG4gICAgbGV0IHBvcyA9IHN0YXJ0O1xuXG4gICAgZnVuY3Rpb24gc2tpcFdzKCkge1xuICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7XG4gICAgICAgICsrcG9zO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdoaWxlIChcbiAgICAgIHBvcyA8IHMubGVuZ3RoICYmXG4gICAgICAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiZcbiAgICAgIHNbcG9zXSAhPT0gXCI+XCIgJiZcbiAgICAgIHNbcG9zXSAhPT0gXCIvXCJcbiAgICApIHtcbiAgICAgICsrcG9zO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7XG4gICAgc2tpcFdzKCk7XG4gICAgd2hpbGUgKFxuICAgICAgcG9zIDwgcy5sZW5ndGggJiZcbiAgICAgIHNbcG9zXSAhPT0gXCI+XCIgJiZcbiAgICAgIHNbcG9zXSAhPT0gXCIvXCIgJiZcbiAgICAgIHNbcG9zXSAhPT0gXCI/XCJcbiAgICApIHtcbiAgICAgIHNraXBXcygpO1xuICAgICAgbGV0IGF0dHJOYW1lID0gXCJcIixcbiAgICAgICAgYXR0clZhbHVlID0gXCJcIjtcbiAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSBcIj1cIikge1xuICAgICAgICBhdHRyTmFtZSArPSBzW3Bvc107XG4gICAgICAgICsrcG9zO1xuICAgICAgfVxuICAgICAgc2tpcFdzKCk7XG4gICAgICBpZiAoc1twb3NdICE9PSBcIj1cIikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgICsrcG9zO1xuICAgICAgc2tpcFdzKCk7XG4gICAgICBjb25zdCBhdHRyRW5kQ2hhciA9IHNbcG9zXTtcbiAgICAgIGlmIChhdHRyRW5kQ2hhciAhPT0gJ1wiJyAmJiBhdHRyRW5kQ2hhciAhPT0gXCInXCIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRyRW5kSW5kZXggPSBzLmluZGV4T2YoYXR0ckVuZENoYXIsICsrcG9zKTtcbiAgICAgIGlmIChhdHRyRW5kSW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgYXR0clZhbHVlID0gcy5zdWJzdHJpbmcocG9zLCBhdHRyRW5kSW5kZXgpO1xuICAgICAgYXR0cmlidXRlcy5wdXNoKHtcbiAgICAgICAgbmFtZTogYXR0ck5hbWUsXG4gICAgICAgIHZhbHVlOiB0aGlzLl9yZXNvbHZlRW50aXRpZXMoYXR0clZhbHVlKSxcbiAgICAgIH0pO1xuICAgICAgcG9zID0gYXR0ckVuZEluZGV4ICsgMTtcbiAgICAgIHNraXBXcygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBwYXJzZWQ6IHBvcyAtIHN0YXJ0LFxuICAgIH07XG4gIH1cblxuICBfcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocywgc3RhcnQpIHtcbiAgICBsZXQgcG9zID0gc3RhcnQ7XG5cbiAgICBmdW5jdGlvbiBza2lwV3MoKSB7XG4gICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlKHMsIHBvcykpIHtcbiAgICAgICAgKytwb3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2hpbGUgKFxuICAgICAgcG9zIDwgcy5sZW5ndGggJiZcbiAgICAgICFpc1doaXRlc3BhY2UocywgcG9zKSAmJlxuICAgICAgc1twb3NdICE9PSBcIj5cIiAmJlxuICAgICAgc1twb3NdICE9PSBcIi9cIlxuICAgICkge1xuICAgICAgKytwb3M7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTtcbiAgICBza2lwV3MoKTtcbiAgICBjb25zdCBhdHRyU3RhcnQgPSBwb3M7XG4gICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIChzW3Bvc10gIT09IFwiP1wiIHx8IHNbcG9zICsgMV0gIT09IFwiPlwiKSkge1xuICAgICAgKytwb3M7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcy5zdWJzdHJpbmcoYXR0clN0YXJ0LCBwb3MpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBwYXJzZWQ6IHBvcyAtIHN0YXJ0LFxuICAgIH07XG4gIH1cblxuICBwYXJzZVhtbChzKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNoID0gc1tpXTtcbiAgICAgIGxldCBqID0gaTtcbiAgICAgIGlmIChjaCA9PT0gXCI8XCIpIHtcbiAgICAgICAgKytqO1xuICAgICAgICBjb25zdCBjaDIgPSBzW2pdO1xuICAgICAgICBsZXQgcTtcbiAgICAgICAgc3dpdGNoIChjaDIpIHtcbiAgICAgICAgICBjYXNlIFwiL1wiOlxuICAgICAgICAgICAgKytqO1xuICAgICAgICAgICAgcSA9IHMuaW5kZXhPZihcIj5cIiwgaik7XG4gICAgICAgICAgICBpZiAocSA8IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbkVuZEVsZW1lbnQocy5zdWJzdHJpbmcoaiwgcSkpO1xuICAgICAgICAgICAgaiA9IHEgKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIj9cIjpcbiAgICAgICAgICAgICsrajtcbiAgICAgICAgICAgIGNvbnN0IHBpID0gdGhpcy5fcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocywgaik7XG4gICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIHBpLnBhcnNlZCwgaiArIHBpLnBhcnNlZCArIDIpICE9PSBcIj8+XCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25QaShwaS5uYW1lLCBwaS52YWx1ZSk7XG4gICAgICAgICAgICBqICs9IHBpLnBhcnNlZCArIDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiIVwiOlxuICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgMykgPT09IFwiLS1cIikge1xuICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKFwiLS0+XCIsIGogKyAzKTtcbiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRDb21tZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5vbkNvbW1lbnQocy5zdWJzdHJpbmcoaiArIDMsIHEpKTtcbiAgICAgICAgICAgICAgaiA9IHEgKyAzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDgpID09PSBcIltDREFUQVtcIikge1xuICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKFwiXV0+XCIsIGogKyA4KTtcbiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRDZGF0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5vbkNkYXRhKHMuc3Vic3RyaW5nKGogKyA4LCBxKSk7XG4gICAgICAgICAgICAgIGogPSBxICsgMztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gXCJET0NUWVBFXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgcTIgPSBzLmluZGV4T2YoXCJbXCIsIGogKyA4KTtcbiAgICAgICAgICAgICAgbGV0IGNvbXBsZXhEb2N0eXBlID0gZmFsc2U7XG4gICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoXCI+XCIsIGogKyA4KTtcbiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWREb2N0eXBlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocTIgPiAwICYmIHEgPiBxMikge1xuICAgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoXCJdPlwiLCBqICsgOCk7XG4gICAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWREb2N0eXBlRGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXBsZXhEb2N0eXBlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N0eXBlQ29udGVudCA9IHMuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgIGogKyA4LFxuICAgICAgICAgICAgICAgIHEgKyAoY29tcGxleERvY3R5cGUgPyAxIDogMClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdGhpcy5vbkRvY3R5cGUoZG9jdHlwZUNvbnRlbnQpO1xuICAgICAgICAgICAgICBqID0gcSArIChjb21wbGV4RG9jdHlwZSA/IDIgOiAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fcGFyc2VDb250ZW50KHMsIGopO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5NYWxmb3JtZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGlzQ2xvc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHMuc3Vic3RyaW5nKGogKyBjb250ZW50LnBhcnNlZCwgaiArIGNvbnRlbnQucGFyc2VkICsgMikgPT09IFwiLz5cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHMuc3Vic3RyaW5nKGogKyBjb250ZW50LnBhcnNlZCwgaiArIGNvbnRlbnQucGFyc2VkICsgMSkgIT09IFwiPlwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbkJlZ2luRWxlbWVudChjb250ZW50Lm5hbWUsIGNvbnRlbnQuYXR0cmlidXRlcywgaXNDbG9zZWQpO1xuICAgICAgICAgICAgaiArPSBjb250ZW50LnBhcnNlZCArIChpc0Nsb3NlZCA/IDIgOiAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoaiA8IHMubGVuZ3RoICYmIHNbal0gIT09IFwiPFwiKSB7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleHQgPSBzLnN1YnN0cmluZyhpLCBqKTtcbiAgICAgICAgdGhpcy5vblRleHQodGhpcy5fcmVzb2x2ZUVudGl0aWVzKHRleHQpKTtcbiAgICAgIH1cbiAgICAgIGkgPSBqO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVzb2x2ZUVudGl0eShuYW1lKSB7XG4gICAgcmV0dXJuIGAmJHtuYW1lfTtgO1xuICB9XG5cbiAgb25QaShuYW1lLCB2YWx1ZSkge31cblxuICBvbkNvbW1lbnQodGV4dCkge31cblxuICBvbkNkYXRhKHRleHQpIHt9XG5cbiAgb25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KSB7fVxuXG4gIG9uVGV4dCh0ZXh0KSB7fVxuXG4gIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHt9XG5cbiAgb25FbmRFbGVtZW50KG5hbWUpIHt9XG5cbiAgb25FcnJvcihjb2RlKSB7fVxufVxuXG5jbGFzcyBTaW1wbGVET01Ob2RlIHtcbiAgY29uc3RydWN0b3Iobm9kZU5hbWUsIG5vZGVWYWx1ZSkge1xuICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTtcbiAgICB0aGlzLm5vZGVWYWx1ZSA9IG5vZGVWYWx1ZTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInBhcmVudE5vZGVcIiwgeyB2YWx1ZTogbnVsbCwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH1cblxuICBnZXQgZmlyc3RDaGlsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVzICYmIHRoaXMuY2hpbGROb2Rlc1swXTtcbiAgfVxuXG4gIGdldCBuZXh0U2libGluZygpIHtcbiAgICBjb25zdCBjaGlsZE5vZGVzID0gdGhpcy5wYXJlbnROb2RlLmNoaWxkTm9kZXM7XG4gICAgaWYgKCFjaGlsZE5vZGVzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGROb2Rlc1tpbmRleCArIDFdO1xuICB9XG5cbiAgZ2V0IHRleHRDb250ZW50KCkge1xuICAgIGlmICghdGhpcy5jaGlsZE5vZGVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlVmFsdWUgfHwgXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hpbGROb2Rlc1xuICAgICAgLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkLnRleHRDb250ZW50O1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXCIpO1xuICB9XG5cbiAgaGFzQ2hpbGROb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVzICYmIHRoaXMuY2hpbGROb2Rlcy5sZW5ndGggPiAwO1xuICB9XG59XG5cbmNsYXNzIFNpbXBsZVhNTFBhcnNlciBleHRlbmRzIFhNTFBhcnNlckJhc2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG51bGw7XG4gICAgdGhpcy5fc3RhY2sgPSBudWxsO1xuICAgIHRoaXMuX2Vycm9yQ29kZSA9IFhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yO1xuICB9XG5cbiAgcGFyc2VGcm9tU3RyaW5nKGRhdGEpIHtcbiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBbXTtcbiAgICB0aGlzLl9zdGFjayA9IFtdO1xuICAgIHRoaXMuX2Vycm9yQ29kZSA9IFhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yO1xuXG4gICAgdGhpcy5wYXJzZVhtbChkYXRhKTtcblxuICAgIGlmICh0aGlzLl9lcnJvckNvZGUgIT09IFhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyByZXR1cm4gdW5kZWZpbmVkIG9uIGVycm9yXG4gICAgfVxuXG4gICAgLy8gV2Ugc2hvdWxkIG9ubHkgaGF2ZSBvbmUgcm9vdC5cbiAgICBjb25zdCBbZG9jdW1lbnRFbGVtZW50XSA9IHRoaXMuX2N1cnJlbnRGcmFnbWVudDtcbiAgICBpZiAoIWRvY3VtZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyByb290IHdhcyBmb3VuZC5cbiAgICB9XG4gICAgcmV0dXJuIHsgZG9jdW1lbnRFbGVtZW50IH07XG4gIH1cblxuICBvblJlc29sdmVFbnRpdHkobmFtZSkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSBcImFwb3NcIjpcbiAgICAgICAgcmV0dXJuIFwiJ1wiO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIub25SZXNvbHZlRW50aXR5KG5hbWUpO1xuICB9XG5cbiAgb25UZXh0KHRleHQpIHtcbiAgICBpZiAoaXNXaGl0ZXNwYWNlU3RyaW5nKHRleHQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSBuZXcgU2ltcGxlRE9NTm9kZShcIiN0ZXh0XCIsIHRleHQpO1xuICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG5vZGUpO1xuICB9XG5cbiAgb25DZGF0YSh0ZXh0KSB7XG4gICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKFwiI3RleHRcIiwgdGV4dCk7XG4gICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7XG4gIH1cblxuICBvbkJlZ2luRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCBpc0VtcHR5KSB7XG4gICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKG5hbWUpO1xuICAgIG5vZGUuY2hpbGROb2RlcyA9IFtdO1xuICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG5vZGUpO1xuICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudEZyYWdtZW50KTtcbiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBub2RlLmNoaWxkTm9kZXM7XG4gIH1cblxuICBvbkVuZEVsZW1lbnQobmFtZSkge1xuICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IHRoaXMuX3N0YWNrLnBvcCgpIHx8IFtdO1xuICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gdGhpcy5fY3VycmVudEZyYWdtZW50W3RoaXMuX2N1cnJlbnRGcmFnbWVudC5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWxhc3RFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxhc3RFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgbGFzdEVsZW1lbnQuY2hpbGROb2Rlc1tpXS5wYXJlbnROb2RlID0gbGFzdEVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgb25FcnJvcihjb2RlKSB7XG4gICAgdGhpcy5fZXJyb3JDb2RlID0gY29kZTtcbiAgfVxufVxuXG5leHBvcnQgeyBTaW1wbGVYTUxQYXJzZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgd2FybiB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG5jbGFzcyBPcHRpb25hbENvbnRlbnRHcm91cCB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGludGVudCkge1xuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmludGVudCA9IGludGVudDtcbiAgfVxufVxuXG5jbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcge1xuICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICB0aGlzLmNyZWF0b3IgPSBudWxsO1xuICAgIHRoaXMuX29yZGVyID0gbnVsbDtcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5jcmVhdG9yID0gZGF0YS5jcmVhdG9yO1xuICAgIHRoaXMuX29yZGVyID0gZGF0YS5vcmRlcjtcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGRhdGEuZ3JvdXBzKSB7XG4gICAgICB0aGlzLl9ncm91cHMuc2V0KFxuICAgICAgICBncm91cC5pZCxcbiAgICAgICAgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwLm5hbWUsIGdyb3VwLmludGVudClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuYmFzZVN0YXRlID09PSBcIk9GRlwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX2dyb3Vwcykge1xuICAgICAgICBncm91cC52aXNpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvbiBvZiBkYXRhLm9uKSB7XG4gICAgICB0aGlzLl9ncm91cHMuZ2V0KG9uKS52aXNpYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9mZiBvZiBkYXRhLm9mZikge1xuICAgICAgdGhpcy5fZ3JvdXBzLmdldChvZmYpLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc1Zpc2libGUoZ3JvdXApIHtcbiAgICBpZiAoZ3JvdXAudHlwZSA9PT0gXCJPQ0dcIikge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtncm91cC5pZH1gKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fZ3JvdXBzLmdldChncm91cC5pZCkudmlzaWJsZTtcbiAgICB9IGVsc2UgaWYgKGdyb3VwLnR5cGUgPT09IFwiT0NNRFwiKSB7XG4gICAgICAvLyBQZXIgdGhlIHNwZWMsIHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBwcmVmZXJyZWQgaWYgYXZhaWxhYmxlLiBVbnRpbFxuICAgICAgLy8gd2UgaW1wbGVtZW50IHRoaXMsIGp1c3QgZmFsbGJhY2sgdG8gdXNpbmcgdGhlIGdyb3VwIHBvbGljeSBmb3Igbm93LlxuICAgICAgaWYgKGdyb3VwLmV4cHJlc3Npb24pIHtcbiAgICAgICAgd2FybihcIlZpc2liaWxpdHkgZXhwcmVzc2lvbiBub3Qgc3VwcG9ydGVkIHlldC5cIik7XG4gICAgICB9XG4gICAgICBpZiAoIWdyb3VwLnBvbGljeSB8fCBncm91cC5wb2xpY3kgPT09IFwiQW55T25cIikge1xuICAgICAgICAvLyBEZWZhdWx0XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbGxPblwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQW55T2ZmXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbGxPZmZcIikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgd2FybihgVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSAke2dyb3VwLnBvbGljeX0uYCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2FybihgVW5rbm93biBncm91cCB0eXBlICR7Z3JvdXAudHlwZX0uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXRWaXNpYmlsaXR5KGlkLCB2aXNpYmxlID0gdHJ1ZSkge1xuICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9ncm91cHMuZ2V0KGlkKS52aXNpYmxlID0gISF2aXNpYmxlO1xuICB9XG5cbiAgZ2V0T3JkZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9ncm91cHMuc2l6ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuX29yZGVyLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2dyb3Vwcy5rZXlzKCkpO1xuICB9XG5cbiAgZ2V0R3JvdXBzKCkge1xuICAgIGlmICghdGhpcy5fZ3JvdXBzLnNpemUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX2dyb3Vwcyk7XG4gIH1cblxuICBnZXRHcm91cChpZCkge1xuICAgIHJldHVybiB0aGlzLl9ncm91cHMuZ2V0KGlkKSB8fCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCB7IE9wdGlvbmFsQ29udGVudENvbmZpZyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5IH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbi8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbX0gKi9cbmNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0ge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMsIHBkZkRhdGFSYW5nZVRyYW5zcG9ydCkge1xuICAgIGFzc2VydChcbiAgICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydCxcbiAgICAgICdQREZEYXRhVHJhbnNwb3J0U3RyZWFtIC0gbWlzc2luZyByZXF1aXJlZCBcInBkZkRhdGFSYW5nZVRyYW5zcG9ydFwiIGFyZ3VtZW50LidcbiAgICApO1xuXG4gICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gW107XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gcGFyYW1zLnByb2dyZXNzaXZlRG9uZSB8fCBmYWxzZTtcblxuICAgIGNvbnN0IGluaXRpYWxEYXRhID0gcGFyYW1zLmluaXRpYWxEYXRhO1xuICAgIGlmIChpbml0aWFsRGF0YSAmJiBpbml0aWFsRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShpbml0aWFsRGF0YSkuYnVmZmVyO1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goYnVmZmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhcGFyYW1zLmRpc2FibGVTdHJlYW07XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFwYXJhbXMuZGlzYWJsZVJhbmdlO1xuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBwYXJhbXMubGVuZ3RoO1xuXG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVhZGVycyA9IFtdO1xuXG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFJhbmdlTGlzdGVuZXIoKGJlZ2luLCBjaHVuaykgPT4ge1xuICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7IGJlZ2luLCBjaHVuayB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc0xpc3RlbmVyKChsb2FkZWQsIHRvdGFsKSA9PiB7XG4gICAgICB0aGlzLl9vblByb2dyZXNzKHsgbG9hZGVkLCB0b3RhbCB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihjaHVuayA9PiB7XG4gICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHsgY2h1bmsgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIoKCkgPT4ge1xuICAgICAgdGhpcy5fb25Qcm9ncmVzc2l2ZURvbmUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpO1xuICB9XG5cbiAgX29uUmVjZWl2ZURhdGEoYXJncykge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGFyZ3MuY2h1bmspLmJ1ZmZlcjtcbiAgICBpZiAoYXJncy5iZWdpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHtcbiAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2VucXVldWUoYnVmZmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNvbWUoZnVuY3Rpb24gKHJhbmdlUmVhZGVyKSB7XG4gICAgICAgIGlmIChyYW5nZVJlYWRlci5fYmVnaW4gIT09IGFyZ3MuYmVnaW4pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmFuZ2VSZWFkZXIuX2VucXVldWUoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZm91bmQsXG4gICAgICAgIFwiX29uUmVjZWl2ZURhdGEgLSBubyBgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyYCBpbnN0YW5jZSBmb3VuZC5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPyB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5fbG9hZGVkIDogMDtcbiAgfVxuXG4gIF9vblByb2dyZXNzKGV2dCkge1xuICAgIGlmIChldnQudG90YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVwb3J0aW5nIHRvIGZpcnN0IHJhbmdlIHJlYWRlciwgaWYgaXQgZXhpc3RzLlxuICAgICAgY29uc3QgZmlyc3RSZWFkZXIgPSB0aGlzLl9yYW5nZVJlYWRlcnNbMF07XG4gICAgICBpZiAoZmlyc3RSZWFkZXIgJiYgZmlyc3RSZWFkZXIub25Qcm9ncmVzcykge1xuICAgICAgICBmaXJzdFJlYWRlci5vblByb2dyZXNzKHsgbG9hZGVkOiBldnQubG9hZGVkIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmdWxsUmVhZGVyID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gICAgICBpZiAoZnVsbFJlYWRlciAmJiBmdWxsUmVhZGVyLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgZnVsbFJlYWRlci5vblByb2dyZXNzKHsgbG9hZGVkOiBldnQubG9hZGVkLCB0b3RhbDogZXZ0LnRvdGFsIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9vblByb2dyZXNzaXZlRG9uZSgpIHtcbiAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHtcbiAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLnByb2dyZXNzaXZlRG9uZSgpO1xuICAgIH1cbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmUgPSB0cnVlO1xuICB9XG5cbiAgX3JlbW92ZVJhbmdlUmVhZGVyKHJlYWRlcikge1xuICAgIGNvbnN0IGkgPSB0aGlzLl9yYW5nZVJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoXG4gICAgICAhdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsXG4gICAgICBcIlBERkRhdGFUcmFuc3BvcnRTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIlxuICAgICk7XG4gICAgY29uc3QgcXVldWVkQ2h1bmtzID0gdGhpcy5fcXVldWVkQ2h1bmtzO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IG51bGw7XG4gICAgcmV0dXJuIG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyKFxuICAgICAgdGhpcyxcbiAgICAgIHF1ZXVlZENodW5rcyxcbiAgICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZVxuICAgICk7XG4gIH1cblxuICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7XG4gICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIGJlZ2luLCBlbmQpO1xuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpO1xuICAgIHRoaXMuX3JhbmdlUmVhZGVycy5wdXNoKHJlYWRlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfVxuXG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikge1xuICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlcnMgPSB0aGlzLl9yYW5nZVJlYWRlcnMuc2xpY2UoMCk7XG4gICAgcmVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChyYW5nZVJlYWRlcikge1xuICAgICAgcmFuZ2VSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfSk7XG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFib3J0KCk7XG4gIH1cbn1cblxuLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmVhZGVyfSAqL1xuY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgcXVldWVkQ2h1bmtzLCBwcm9ncmVzc2l2ZURvbmUgPSBmYWxzZSkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9kb25lID0gcHJvZ3Jlc3NpdmVEb25lIHx8IGZhbHNlO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBxdWV1ZWRDaHVua3MgfHwgW107XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHRoaXMuX3F1ZXVlZENodW5rcykge1xuICAgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgc3RyZWFtLl9mdWxsUmVxdWVzdFJlYWRlciA9IHRoaXM7XG5cbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG5cbiAgX2VucXVldWUoY2h1bmspIHtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgbmV3IGRhdGEuXG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goY2h1bmspO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTtcbiAgfVxuXG4gIGdldCBmaWxlbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cblxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG5cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG5cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmVhbS5fY29udGVudExlbmd0aDtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rcy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gIH1cblxuICBwcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gIH1cbn1cblxuLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmFuZ2VSZWFkZXJ9ICovXG5jbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIGJlZ2luLCBlbmQpIHtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fYmVnaW4gPSBiZWdpbjtcbiAgICB0aGlzLl9lbmQgPSBlbmQ7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuXG4gIF9lbnF1ZXVlKGNodW5rKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjsgLy8gaWdub3JlIG5ldyBkYXRhXG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RzQ2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICByZXF1ZXN0c0NhcGFiaWxpdHkucmVzb2x2ZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkge1xuICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgdGhpcy5fc3RyZWFtLl9yZW1vdmVSYW5nZVJlYWRlcih0aGlzKTtcbiAgfVxuXG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZWFkKCkge1xuICAgIGlmICh0aGlzLl9xdWV1ZWRDaHVuaykge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVuaztcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGRGF0YVRyYW5zcG9ydFN0cmVhbSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zdHIgKi9cblxuaW1wb3J0IHsgc2hhZG93IH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbmNsYXNzIFdlYkdMQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKHsgZW5hYmxlID0gZmFsc2UgfSkge1xuICAgIHRoaXMuX2VuYWJsZWQgPSBlbmFibGUgPT09IHRydWU7XG4gIH1cblxuICBnZXQgaXNFbmFibGVkKCkge1xuICAgIGxldCBlbmFibGVkID0gdGhpcy5fZW5hYmxlZDtcbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgZW5hYmxlZCA9IFdlYkdMVXRpbHMudHJ5SW5pdEdMKCk7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0VuYWJsZWRcIiwgZW5hYmxlZCk7XG4gIH1cblxuICBjb21wb3NlU01hc2soeyBsYXllciwgbWFzaywgcHJvcGVydGllcyB9KSB7XG4gICAgcmV0dXJuIFdlYkdMVXRpbHMuY29tcG9zZVNNYXNrKGxheWVyLCBtYXNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIGRyYXdGaWd1cmVzKHsgd2lkdGgsIGhlaWdodCwgYmFja2dyb3VuZENvbG9yLCBmaWd1cmVzLCBjb250ZXh0IH0pIHtcbiAgICByZXR1cm4gV2ViR0xVdGlscy5kcmF3RmlndXJlcyhcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlndXJlcyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgV2ViR0xVdGlscy5jbGVhbnVwKCk7XG4gIH1cbn1cblxudmFyIFdlYkdMVXRpbHMgPSAoZnVuY3Rpb24gV2ViR0xVdGlsc0Nsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIGxvYWRTaGFkZXIoZ2wsIGNvZGUsIHNoYWRlclR5cGUpIHtcbiAgICB2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpO1xuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIGNvZGUpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcbiAgICB2YXIgY29tcGlsZWQgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyk7XG4gICAgaWYgKCFjb21waWxlZCkge1xuICAgICAgdmFyIGVycm9yTXNnID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgZHVyaW5nIHNoYWRlciBjb21waWxhdGlvbjogXCIgKyBlcnJvck1zZyk7XG4gICAgfVxuICAgIHJldHVybiBzaGFkZXI7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCBjb2RlKSB7XG4gICAgcmV0dXJuIGxvYWRTaGFkZXIoZ2wsIGNvZGUsIGdsLlZFUlRFWF9TSEFERVIpO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBjb2RlKSB7XG4gICAgcmV0dXJuIGxvYWRTaGFkZXIoZ2wsIGNvZGUsIGdsLkZSQUdNRU5UX1NIQURFUik7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbShnbCwgc2hhZGVycykge1xuICAgIHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNoYWRlcnMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHNoYWRlcnNbaV0pO1xuICAgIH1cbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKTtcbiAgICB2YXIgbGlua2VkID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyk7XG4gICAgaWYgKCFsaW5rZWQpIHtcbiAgICAgIHZhciBlcnJvck1zZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgZHVyaW5nIHByb2dyYW0gbGlua2luZzogXCIgKyBlcnJvck1zZyk7XG4gICAgfVxuICAgIHJldHVybiBwcm9ncmFtO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGltYWdlLCB0ZXh0dXJlSWQpIHtcbiAgICBnbC5hY3RpdmVUZXh0dXJlKHRleHR1cmVJZCk7XG4gICAgdmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG5cbiAgICAvLyBTZXQgdGhlIHBhcmFtZXRlcnMgc28gd2UgY2FuIHJlbmRlciBhbnkgc2l6ZSBpbWFnZS5cbiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuXG4gICAgLy8gVXBsb2FkIHRoZSBpbWFnZSBpbnRvIHRoZSB0ZXh0dXJlLlxuICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpO1xuICAgIHJldHVybiB0ZXh0dXJlO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRHTCwgY3VycmVudENhbnZhcztcbiAgZnVuY3Rpb24gZ2VuZXJhdGVHTCgpIHtcbiAgICBpZiAoY3VycmVudEdMKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHRlbXBvcmFyeSBjYW52YXMgaXMgdXNlZCBpbiB0aGUgV2ViR0wgY29udGV4dC5cbiAgICBjdXJyZW50Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjdXJyZW50R0wgPSBjdXJyZW50Q2FudmFzLmdldENvbnRleHQoXCJ3ZWJnbFwiLCB7XG4gICAgICBwcmVtdWx0aXBsaWVkYWxwaGE6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgdmFyIHNtYXNrVmVydGV4U2hhZGVyQ29kZSA9XG4gICAgXCJcXFxuICBhdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIGF0dHJpYnV0ZSB2ZWMyIGFfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB1bmlmb3JtIHZlYzIgdV9yZXNvbHV0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICB2ZWMyIGNsaXBTcGFjZSA9IChhX3Bvc2l0aW9uIC8gdV9yZXNvbHV0aW9uKSAqIDIuMCAtIDEuMDsgICBcXFxuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChjbGlwU3BhY2UgKiB2ZWMyKDEsIC0xKSwgMCwgMSk7ICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiO1xuXG4gIHZhciBzbWFza0ZyYWdtZW50U2hhZGVyQ29kZSA9XG4gICAgXCJcXFxuICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdW5pZm9ybSB2ZWM0IHVfYmFja2Ryb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB1bmlmb3JtIGludCB1X3N1YnR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHZhcnlpbmcgdmVjMiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgdmVjNCBpbWFnZUNvbG9yID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHZfdGV4Q29vcmQpOyAgICAgICAgICAgXFxcbiAgICB2ZWM0IG1hc2tDb2xvciA9IHRleHR1cmUyRCh1X21hc2ssIHZfdGV4Q29vcmQpOyAgICAgICAgICAgICBcXFxuICAgIGlmICh1X2JhY2tkcm9wLmEgPiAwLjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICBtYXNrQ29sb3IucmdiID0gbWFza0NvbG9yLnJnYiAqIG1hc2tDb2xvci5hICsgICAgICAgICAgICAgXFxcbiAgICAgICAgICAgICAgICAgICAgICB1X2JhY2tkcm9wLnJnYiAqICgxLjAgLSBtYXNrQ29sb3IuYSk7ICAgICBcXFxuICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgZmxvYXQgbHVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICBpZiAodV9zdWJ0eXBlID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgbHVtID0gbWFza0NvbG9yLmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICAgIGx1bSA9IG1hc2tDb2xvci5yICogMC4zICsgbWFza0NvbG9yLmcgKiAwLjU5ICsgICAgICAgICAgICBcXFxuICAgICAgICAgICAgbWFza0NvbG9yLmIgKiAwLjExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICBpbWFnZUNvbG9yLmEgKj0gbHVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgIGltYWdlQ29sb3IucmdiICo9IGltYWdlQ29sb3IuYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgZ2xfRnJhZ0NvbG9yID0gaW1hZ2VDb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjtcblxuICB2YXIgc21hc2tDYWNoZSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gaW5pdFNtYXNrR0woKSB7XG4gICAgdmFyIGNhbnZhcywgZ2w7XG5cbiAgICBnZW5lcmF0ZUdMKCk7XG4gICAgY2FudmFzID0gY3VycmVudENhbnZhcztcbiAgICBjdXJyZW50Q2FudmFzID0gbnVsbDtcbiAgICBnbCA9IGN1cnJlbnRHTDtcbiAgICBjdXJyZW50R0wgPSBudWxsO1xuXG4gICAgLy8gc2V0dXAgYSBHTFNMIHByb2dyYW1cbiAgICB2YXIgdmVydGV4U2hhZGVyID0gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCBzbWFza1ZlcnRleFNoYWRlckNvZGUpO1xuICAgIHZhciBmcmFnbWVudFNoYWRlciA9IGNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBzbWFza0ZyYWdtZW50U2hhZGVyQ29kZSk7XG4gICAgdmFyIHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKGdsLCBbdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcl0pO1xuICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7XG5cbiAgICB2YXIgY2FjaGUgPSB7fTtcbiAgICBjYWNoZS5nbCA9IGdsO1xuICAgIGNhY2hlLmNhbnZhcyA9IGNhbnZhcztcbiAgICBjYWNoZS5yZXNvbHV0aW9uTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgXCJ1X3Jlc29sdXRpb25cIik7XG4gICAgY2FjaGUucG9zaXRpb25Mb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIFwiYV9wb3NpdGlvblwiKTtcbiAgICBjYWNoZS5iYWNrZHJvcExvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIFwidV9iYWNrZHJvcFwiKTtcbiAgICBjYWNoZS5zdWJ0eXBlTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgXCJ1X3N1YnR5cGVcIik7XG5cbiAgICB2YXIgdGV4Q29vcmRMb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIFwiYV90ZXhDb29yZFwiKTtcbiAgICB2YXIgdGV4TGF5ZXJMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBcInVfaW1hZ2VcIik7XG4gICAgdmFyIHRleE1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBcInVfbWFza1wiKTtcblxuICAgIC8vIHByb3ZpZGUgdGV4dHVyZSBjb29yZGluYXRlcyBmb3IgdGhlIHJlY3RhbmdsZS5cbiAgICB2YXIgdGV4Q29vcmRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGV4Q29vcmRCdWZmZXIpO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgIDAuMCwgMC4wLFxuICAgICAgMS4wLCAwLjAsXG4gICAgICAwLjAsIDEuMCxcbiAgICAgIDAuMCwgMS4wLFxuICAgICAgMS4wLCAwLjAsXG4gICAgICAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGV4Q29vcmRMb2NhdGlvbik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZExvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuXG4gICAgZ2wudW5pZm9ybTFpKHRleExheWVyTG9jYXRpb24sIDApO1xuICAgIGdsLnVuaWZvcm0xaSh0ZXhNYXNrTG9jYXRpb24sIDEpO1xuXG4gICAgc21hc2tDYWNoZSA9IGNhY2hlO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcG9zZVNNYXNrKGxheWVyLCBtYXNrLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIHdpZHRoID0gbGF5ZXIud2lkdGgsXG4gICAgICBoZWlnaHQgPSBsYXllci5oZWlnaHQ7XG5cbiAgICBpZiAoIXNtYXNrQ2FjaGUpIHtcbiAgICAgIGluaXRTbWFza0dMKCk7XG4gICAgfVxuICAgIHZhciBjYWNoZSA9IHNtYXNrQ2FjaGUsXG4gICAgICBjYW52YXMgPSBjYWNoZS5jYW52YXMsXG4gICAgICBnbCA9IGNhY2hlLmdsO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTtcbiAgICBnbC51bmlmb3JtMmYoY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIGlmIChwcm9wZXJ0aWVzLmJhY2tkcm9wKSB7XG4gICAgICBnbC51bmlmb3JtNGYoXG4gICAgICAgIGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbixcbiAgICAgICAgcHJvcGVydGllcy5iYWNrZHJvcFswXSxcbiAgICAgICAgcHJvcGVydGllcy5iYWNrZHJvcFsxXSxcbiAgICAgICAgcHJvcGVydGllcy5iYWNrZHJvcFsyXSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2wudW5pZm9ybTRmKGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiwgMCwgMCwgMCwgMCk7XG4gICAgfVxuICAgIGdsLnVuaWZvcm0xaShcbiAgICAgIGNhY2hlLnN1YnR5cGVMb2NhdGlvbixcbiAgICAgIHByb3BlcnRpZXMuc3VidHlwZSA9PT0gXCJMdW1pbm9zaXR5XCIgPyAxIDogMFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSB0ZXh0dXJlc1xuICAgIHZhciB0ZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgbGF5ZXIsIGdsLlRFWFRVUkUwKTtcbiAgICB2YXIgbWFza1RleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBtYXNrLCBnbC5URVhUVVJFMSk7XG5cbiAgICAvLyBDcmVhdGUgYSBidWZmZXIgYW5kIHB1dCBhIHNpbmdsZSBjbGlwc3BhY2UgcmVjdGFuZ2xlIGluXG4gICAgLy8gaXQgKDIgdHJpYW5nbGVzKVxuICAgIHZhciBidWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKTtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAwLCAwLFxuICAgICAgd2lkdGgsIDAsXG4gICAgICAwLCBoZWlnaHQsXG4gICAgICAwLCBoZWlnaHQsXG4gICAgICB3aWR0aCwgMCxcbiAgICAgIHdpZHRoLCBoZWlnaHRdKSwgZ2wuU1RBVElDX0RSQVcpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNhY2hlLnBvc2l0aW9uTG9jYXRpb24pO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY2FjaGUucG9zaXRpb25Mb2NhdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcblxuICAgIC8vIGRyYXdcbiAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApO1xuICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7XG5cbiAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFUywgMCwgNik7XG5cbiAgICBnbC5mbHVzaCgpO1xuXG4gICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTtcbiAgICBnbC5kZWxldGVUZXh0dXJlKG1hc2tUZXh0dXJlKTtcbiAgICBnbC5kZWxldGVCdWZmZXIoYnVmZmVyKTtcblxuICAgIHJldHVybiBjYW52YXM7XG4gIH1cblxuICB2YXIgZmlndXJlc1ZlcnRleFNoYWRlckNvZGUgPVxuICAgIFwiXFxcbiAgYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICBhdHRyaWJ1dGUgdmVjMyBhX2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB1bmlmb3JtIHZlYzIgdV9zY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHVuaWZvcm0gdmVjMiB1X29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB2YXJ5aW5nIHZlYzQgdl9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgIHZlYzIgcG9zaXRpb24gPSAoYV9wb3NpdGlvbiArIHVfb2Zmc2V0KSAqIHVfc2NhbGU7ICAgICAgICAgIFxcXG4gICAgdmVjMiBjbGlwU3BhY2UgPSAocG9zaXRpb24gLyB1X3Jlc29sdXRpb24pICogMi4wIC0gMS4wOyAgICAgXFxcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoY2xpcFNwYWNlICogdmVjMigxLCAtMSksIDAsIDEpOyAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgdl9jb2xvciA9IHZlYzQoYV9jb2xvciAvIDI1NS4wLCAxLjApOyAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjtcblxuICB2YXIgZmlndXJlc0ZyYWdtZW50U2hhZGVyQ29kZSA9XG4gICAgXCJcXFxuICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdmFyeWluZyB2ZWM0IHZfY29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICBnbF9GcmFnQ29sb3IgPSB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiO1xuXG4gIHZhciBmaWd1cmVzQ2FjaGUgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGluaXRGaWd1cmVzR0woKSB7XG4gICAgdmFyIGNhbnZhcywgZ2w7XG5cbiAgICBnZW5lcmF0ZUdMKCk7XG4gICAgY2FudmFzID0gY3VycmVudENhbnZhcztcbiAgICBjdXJyZW50Q2FudmFzID0gbnVsbDtcbiAgICBnbCA9IGN1cnJlbnRHTDtcbiAgICBjdXJyZW50R0wgPSBudWxsO1xuXG4gICAgLy8gc2V0dXAgYSBHTFNMIHByb2dyYW1cbiAgICB2YXIgdmVydGV4U2hhZGVyID0gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCBmaWd1cmVzVmVydGV4U2hhZGVyQ29kZSk7XG4gICAgdmFyIGZyYWdtZW50U2hhZGVyID0gY3JlYXRlRnJhZ21lbnRTaGFkZXIoZ2wsIGZpZ3VyZXNGcmFnbWVudFNoYWRlckNvZGUpO1xuICAgIHZhciBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnbCwgW3ZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXJdKTtcbiAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgdmFyIGNhY2hlID0ge307XG4gICAgY2FjaGUuZ2wgPSBnbDtcbiAgICBjYWNoZS5jYW52YXMgPSBjYW52YXM7XG4gICAgY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIFwidV9yZXNvbHV0aW9uXCIpO1xuICAgIGNhY2hlLnNjYWxlTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgXCJ1X3NjYWxlXCIpO1xuICAgIGNhY2hlLm9mZnNldExvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIFwidV9vZmZzZXRcIik7XG4gICAgY2FjaGUucG9zaXRpb25Mb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIFwiYV9wb3NpdGlvblwiKTtcbiAgICBjYWNoZS5jb2xvckxvY2F0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgXCJhX2NvbG9yXCIpO1xuXG4gICAgZmlndXJlc0NhY2hlID0gY2FjaGU7XG4gIH1cblxuICBmdW5jdGlvbiBkcmF3RmlndXJlcyh3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kQ29sb3IsIGZpZ3VyZXMsIGNvbnRleHQpIHtcbiAgICBpZiAoIWZpZ3VyZXNDYWNoZSkge1xuICAgICAgaW5pdEZpZ3VyZXNHTCgpO1xuICAgIH1cbiAgICB2YXIgY2FjaGUgPSBmaWd1cmVzQ2FjaGUsXG4gICAgICBjYW52YXMgPSBjYWNoZS5jYW52YXMsXG4gICAgICBnbCA9IGNhY2hlLmdsO1xuXG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBnbC52aWV3cG9ydCgwLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQpO1xuICAgIGdsLnVuaWZvcm0yZihjYWNoZS5yZXNvbHV0aW9uTG9jYXRpb24sIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgLy8gY291bnQgdHJpYW5nbGUgcG9pbnRzXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgaSwgaWksIHJvd3M7XG4gICAgZm9yIChpID0gMCwgaWkgPSBmaWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHN3aXRjaCAoZmlndXJlc1tpXS50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJsYXR0aWNlXCI6XG4gICAgICAgICAgcm93cyA9IChmaWd1cmVzW2ldLmNvb3Jkcy5sZW5ndGggLyBmaWd1cmVzW2ldLnZlcnRpY2VzUGVyUm93KSB8IDA7XG4gICAgICAgICAgY291bnQgKz0gKHJvd3MgLSAxKSAqIChmaWd1cmVzW2ldLnZlcnRpY2VzUGVyUm93IC0gMSkgKiA2O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidHJpYW5nbGVzXCI6XG4gICAgICAgICAgY291bnQgKz0gZmlndXJlc1tpXS5jb29yZHMubGVuZ3RoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB0cmFuc2ZlciBkYXRhXG4gICAgdmFyIGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTtcbiAgICB2YXIgY29sb3JzID0gbmV3IFVpbnQ4QXJyYXkoY291bnQgKiAzKTtcbiAgICB2YXIgY29vcmRzTWFwID0gY29udGV4dC5jb29yZHMsXG4gICAgICBjb2xvcnNNYXAgPSBjb250ZXh0LmNvbG9ycztcbiAgICB2YXIgcEluZGV4ID0gMCxcbiAgICAgIGNJbmRleCA9IDA7XG4gICAgZm9yIChpID0gMCwgaWkgPSBmaWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBmaWd1cmUgPSBmaWd1cmVzW2ldLFxuICAgICAgICBwcyA9IGZpZ3VyZS5jb29yZHMsXG4gICAgICAgIGNzID0gZmlndXJlLmNvbG9ycztcbiAgICAgIHN3aXRjaCAoZmlndXJlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImxhdHRpY2VcIjpcbiAgICAgICAgICB2YXIgY29scyA9IGZpZ3VyZS52ZXJ0aWNlc1BlclJvdztcbiAgICAgICAgICByb3dzID0gKHBzLmxlbmd0aCAvIGNvbHMpIHwgMDtcbiAgICAgICAgICBmb3IgKHZhciByb3cgPSAxOyByb3cgPCByb3dzOyByb3crKykge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHJvdyAqIGNvbHMgKyAxO1xuICAgICAgICAgICAgZm9yICh2YXIgY29sID0gMTsgY29sIDwgY29sczsgY29sKyssIG9mZnNldCsrKSB7XG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXhdID0gY29vcmRzTWFwW3BzW29mZnNldCAtIGNvbHMgLSAxXV07XG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAxXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzIC0gMV0gKyAxXTtcbiAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDJdID0gY29vcmRzTWFwW3BzW29mZnNldCAtIGNvbHNdXTtcbiAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDNdID0gY29vcmRzTWFwW3BzW29mZnNldCAtIGNvbHNdICsgMV07XG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyA0XSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSAxXV07XG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyA1XSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSAxXSArIDFdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzIC0gMV1dO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMV0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29scyAtIDFdICsgMV07XG4gICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAyXSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzIC0gMV0gKyAyXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDNdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIGNvbHNdXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDRdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIGNvbHNdICsgMV07XG4gICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA1XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzXSArIDJdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgNl0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gMV1dO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgN10gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gMV0gKyAxXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDhdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIDFdICsgMl07XG5cbiAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDZdID0gY29vcmRzW3BJbmRleCArIDJdO1xuICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgN10gPSBjb29yZHNbcEluZGV4ICsgM107XG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyA4XSA9IGNvb3Jkc1twSW5kZXggKyA0XTtcbiAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDldID0gY29vcmRzW3BJbmRleCArIDVdO1xuICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMTBdID0gY29vcmRzTWFwW3BzW29mZnNldF1dO1xuICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMTFdID0gY29vcmRzTWFwW3BzW29mZnNldF0gKyAxXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDldID0gY29sb3JzW2NJbmRleCArIDNdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTBdID0gY29sb3JzW2NJbmRleCArIDRdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTFdID0gY29sb3JzW2NJbmRleCArIDVdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTJdID0gY29sb3JzW2NJbmRleCArIDZdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTNdID0gY29sb3JzW2NJbmRleCArIDddO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTRdID0gY29sb3JzW2NJbmRleCArIDhdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTVdID0gY29sb3JzTWFwW2NzW29mZnNldF1dO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTZdID0gY29sb3JzTWFwW2NzW29mZnNldF0gKyAxXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDE3XSA9IGNvbG9yc01hcFtjc1tvZmZzZXRdICsgMl07XG4gICAgICAgICAgICAgIHBJbmRleCArPSAxMjtcbiAgICAgICAgICAgICAgY0luZGV4ICs9IDE4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRyaWFuZ2xlc1wiOlxuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHBzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgIGNvb3Jkc1twSW5kZXhdID0gY29vcmRzTWFwW3BzW2pdXTtcbiAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAxXSA9IGNvb3Jkc01hcFtwc1tqXSArIDFdO1xuICAgICAgICAgICAgY29sb3JzW2NJbmRleF0gPSBjb2xvcnNNYXBbY3Nbal1dO1xuICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDFdID0gY29sb3JzTWFwW2NzW2pdICsgMV07XG4gICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMl0gPSBjb2xvcnNNYXBbY3Nbal0gKyAyXTtcbiAgICAgICAgICAgIHBJbmRleCArPSAyO1xuICAgICAgICAgICAgY0luZGV4ICs9IDM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRyYXdcbiAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBnbC5jbGVhckNvbG9yKFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JbMF0gLyAyNTUsXG4gICAgICAgIGJhY2tncm91bmRDb2xvclsxXSAvIDI1NSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yWzJdIC8gMjU1LFxuICAgICAgICAxLjBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgfVxuICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpO1xuXG4gICAgdmFyIGNvb3Jkc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBjb29yZHNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBjb29yZHMsIGdsLlNUQVRJQ19EUkFXKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjYWNoZS5wb3NpdGlvbkxvY2F0aW9uKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNhY2hlLnBvc2l0aW9uTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7XG5cbiAgICB2YXIgY29sb3JzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGNvbG9yc0J1ZmZlcik7XG4gICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGNvbG9ycywgZ2wuU1RBVElDX0RSQVcpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNhY2hlLmNvbG9yTG9jYXRpb24pO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICBjYWNoZS5jb2xvckxvY2F0aW9uLFxuICAgICAgMyxcbiAgICAgIGdsLlVOU0lHTkVEX0JZVEUsXG4gICAgICBmYWxzZSxcbiAgICAgIDAsXG4gICAgICAwXG4gICAgKTtcblxuICAgIGdsLnVuaWZvcm0yZihjYWNoZS5zY2FsZUxvY2F0aW9uLCBjb250ZXh0LnNjYWxlWCwgY29udGV4dC5zY2FsZVkpO1xuICAgIGdsLnVuaWZvcm0yZihjYWNoZS5vZmZzZXRMb2NhdGlvbiwgY29udGV4dC5vZmZzZXRYLCBjb250ZXh0Lm9mZnNldFkpO1xuXG4gICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRVMsIDAsIGNvdW50KTtcblxuICAgIGdsLmZsdXNoKCk7XG5cbiAgICBnbC5kZWxldGVCdWZmZXIoY29vcmRzQnVmZmVyKTtcbiAgICBnbC5kZWxldGVCdWZmZXIoY29sb3JzQnVmZmVyKTtcblxuICAgIHJldHVybiBjYW52YXM7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRyeUluaXRHTCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGdlbmVyYXRlR0woKTtcbiAgICAgICAgcmV0dXJuICEhY3VycmVudEdMO1xuICAgICAgfSBjYXRjaCAoZXgpIHt9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIGNvbXBvc2VTTWFzayxcblxuICAgIGRyYXdGaWd1cmVzLFxuXG4gICAgY2xlYW51cCgpIHtcbiAgICAgIGlmIChzbWFza0NhY2hlICYmIHNtYXNrQ2FjaGUuY2FudmFzKSB7XG4gICAgICAgIHNtYXNrQ2FjaGUuY2FudmFzLndpZHRoID0gMDtcbiAgICAgICAgc21hc2tDYWNoZS5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWd1cmVzQ2FjaGUgJiYgZmlndXJlc0NhY2hlLmNhbnZhcykge1xuICAgICAgICBmaWd1cmVzQ2FjaGUuY2FudmFzLndpZHRoID0gMDtcbiAgICAgICAgZmlndXJlc0NhY2hlLmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgICAgfVxuICAgICAgc21hc2tDYWNoZSA9IG51bGw7XG4gICAgICBmaWd1cmVzQ2FjaGUgPSBudWxsO1xuICAgIH0sXG4gIH07XG59KSgpO1xuXG5leHBvcnQgeyBXZWJHTENvbnRleHQgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgYWRkTGlua0F0dHJpYnV0ZXMsXG4gIERPTVNWR0ZhY3RvcnksXG4gIGdldEZpbGVuYW1lRnJvbVVybCxcbiAgTGlua1RhcmdldCxcbiAgUERGRGF0ZVN0cmluZyxcbn0gZnJvbSBcIi4vZGlzcGxheV91dGlscy5qc1wiO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICB1bnJlYWNoYWJsZSxcbiAgVXRpbCxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU3RvcmFnZSB9IGZyb20gXCIuL2Fubm90YXRpb25fc3RvcmFnZS5qc1wiO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFubm90YXRpb25FbGVtZW50UGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGFcbiAqIEBwcm9wZXJ0eSB7SFRNTERpdkVsZW1lbnR9IGxheWVyXG4gKiBAcHJvcGVydHkge1BERlBhZ2V9IHBhZ2VcbiAqIEBwcm9wZXJ0eSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydFxuICogQHByb3BlcnR5IHtJUERGTGlua1NlcnZpY2V9IGxpbmtTZXJ2aWNlXG4gKiBAcHJvcGVydHkge0Rvd25sb2FkTWFuYWdlcn0gZG93bmxvYWRNYW5hZ2VyXG4gKiBAcHJvcGVydHkge0Fubm90YXRpb25TdG9yYWdlfSBbYW5ub3RhdGlvblN0b3JhZ2VdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ltYWdlUmVzb3VyY2VzUGF0aF0gLSBQYXRoIGZvciBpbWFnZSByZXNvdXJjZXMsIG1haW5seVxuICogICBmb3IgYW5ub3RhdGlvbiBpY29ucy4gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVuZGVySW50ZXJhY3RpdmVGb3Jtc1xuICogQHByb3BlcnR5IHtPYmplY3R9IHN2Z0ZhY3RvcnlcbiAqL1xuXG5jbGFzcyBBbm5vdGF0aW9uRWxlbWVudEZhY3Rvcnkge1xuICAvKipcbiAgICogQHBhcmFtIHtBbm5vdGF0aW9uRWxlbWVudFBhcmFtZXRlcnN9IHBhcmFtZXRlcnNcbiAgICogQHJldHVybnMge0Fubm90YXRpb25FbGVtZW50fVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qgc3VidHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5hbm5vdGF0aW9uVHlwZTtcblxuICAgIHN3aXRjaCAoc3VidHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5MSU5LOlxuICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5URVhUOlxuICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5XSURHRVQ6XG4gICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5maWVsZFR5cGU7XG5cbiAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiVHhcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgIGNhc2UgXCJCdG5cIjpcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmRhdGEucmFkaW9CdXR0b24pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLmRhdGEuY2hlY2tCb3gpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgY2FzZSBcIkNoXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuUE9QVVA6XG4gICAgICAgIHJldHVybiBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDpcbiAgICAgICAgcmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkxJTkU6XG4gICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNRVUFSRTpcbiAgICAgICAgcmV0dXJuIG5ldyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5DSVJDTEU6XG4gICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU6XG4gICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5DQVJFVDpcbiAgICAgICAgcmV0dXJuIG5ldyBDYXJldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLklOSzpcbiAgICAgICAgcmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5QT0xZR09OOlxuICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ6XG4gICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOlxuICAgICAgICByZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNRVUlHR0xZOlxuICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOlxuICAgICAgICByZXR1cm4gbmV3IFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNUQU1QOlxuICAgICAgICByZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ6XG4gICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUgPSBmYWxzZSwgaWdub3JlQm9yZGVyID0gZmFsc2UpIHtcbiAgICB0aGlzLmlzUmVuZGVyYWJsZSA9IGlzUmVuZGVyYWJsZTtcbiAgICB0aGlzLmRhdGEgPSBwYXJhbWV0ZXJzLmRhdGE7XG4gICAgdGhpcy5sYXllciA9IHBhcmFtZXRlcnMubGF5ZXI7XG4gICAgdGhpcy5wYWdlID0gcGFyYW1ldGVycy5wYWdlO1xuICAgIHRoaXMudmlld3BvcnQgPSBwYXJhbWV0ZXJzLnZpZXdwb3J0O1xuICAgIHRoaXMubGlua1NlcnZpY2UgPSBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlO1xuICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gcGFyYW1ldGVycy5kb3dubG9hZE1hbmFnZXI7XG4gICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBwYXJhbWV0ZXJzLmltYWdlUmVzb3VyY2VzUGF0aDtcbiAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPSBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXM7XG4gICAgdGhpcy5zdmdGYWN0b3J5ID0gcGFyYW1ldGVycy5zdmdGYWN0b3J5O1xuICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlO1xuXG4gICAgaWYgKGlzUmVuZGVyYWJsZSkge1xuICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLl9jcmVhdGVDb250YWluZXIoaWdub3JlQm9yZGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVtcHR5IGNvbnRhaW5lciBmb3IgdGhlIGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQm9yZGVyXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIgPSBmYWxzZSkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEsXG4gICAgICBwYWdlID0gdGhpcy5wYWdlLFxuICAgICAgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0O1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIpO1xuICAgIGxldCB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTtcbiAgICBsZXQgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdO1xuXG4gICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtYW5ub3RhdGlvbi1pZFwiLCBkYXRhLmlkKTtcblxuICAgIC8vIERvICpub3QqIG1vZGlmeSBgZGF0YS5yZWN0YCwgc2luY2UgdGhhdCB3aWxsIGNvcnJ1cHQgdGhlIGFubm90YXRpb25cbiAgICAvLyBwb3NpdGlvbiBvbiBzdWJzZXF1ZW50IGNhbGxzIHRvIGBfY3JlYXRlQ29udGFpbmVyYCAoc2VlIGlzc3VlIDY4MDQpLlxuICAgIGNvbnN0IHJlY3QgPSBVdGlsLm5vcm1hbGl6ZVJlY3QoW1xuICAgICAgZGF0YS5yZWN0WzBdLFxuICAgICAgcGFnZS52aWV3WzNdIC0gZGF0YS5yZWN0WzFdICsgcGFnZS52aWV3WzFdLFxuICAgICAgZGF0YS5yZWN0WzJdLFxuICAgICAgcGFnZS52aWV3WzNdIC0gZGF0YS5yZWN0WzNdICsgcGFnZS52aWV3WzFdLFxuICAgIF0pO1xuXG4gICAgY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9IGBtYXRyaXgoJHt2aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIil9KWA7XG4gICAgY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGAtJHtyZWN0WzBdfXB4IC0ke3JlY3RbMV19cHhgO1xuXG4gICAgaWYgKCFpZ25vcmVCb3JkZXIgJiYgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCA+IDApIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJXaWR0aCA9IGAke2RhdGEuYm9yZGVyU3R5bGUud2lkdGh9cHhgO1xuICAgICAgaWYgKGRhdGEuYm9yZGVyU3R5bGUuc3R5bGUgIT09IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FKSB7XG4gICAgICAgIC8vIFVuZGVybGluZSBzdHlsZXMgb25seSBoYXZlIGEgYm90dG9tIGJvcmRlciwgc28gd2UgZG8gbm90IG5lZWRcbiAgICAgICAgLy8gdG8gYWRqdXN0IGZvciBhbGwgYm9yZGVycy4gVGhpcyB5aWVsZHMgYSBzaW1pbGFyIHJlc3VsdCBhc1xuICAgICAgICAvLyBBZG9iZSBBY3JvYmF0L1JlYWRlci5cbiAgICAgICAgd2lkdGggPSB3aWR0aCAtIDIgKiBkYXRhLmJvcmRlclN0eWxlLndpZHRoO1xuICAgICAgICBoZWlnaHQgPSBoZWlnaHQgLSAyICogZGF0YS5ib3JkZXJTdHlsZS53aWR0aDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9yaXpvbnRhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUuaG9yaXpvbnRhbENvcm5lclJhZGl1cztcbiAgICAgIGNvbnN0IHZlcnRpY2FsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS52ZXJ0aWNhbENvcm5lclJhZGl1cztcbiAgICAgIGlmIChob3Jpem9udGFsUmFkaXVzID4gMCB8fCB2ZXJ0aWNhbFJhZGl1cyA+IDApIHtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gYCR7aG9yaXpvbnRhbFJhZGl1c31weCAvICR7dmVydGljYWxSYWRpdXN9cHhgO1xuICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyUmFkaXVzID0gcmFkaXVzO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRhdGEuYm9yZGVyU3R5bGUuc3R5bGUpIHtcbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOlxuICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJTdHlsZSA9IFwic29saWRcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuREFTSEVEOlxuICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJTdHlsZSA9IFwiZGFzaGVkXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ6XG4gICAgICAgICAgd2FybihcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBiZXZlbGVkXCIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDpcbiAgICAgICAgICB3YXJuKFwiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGluc2V0XCIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU6XG4gICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlckJvdHRvbVN0eWxlID0gXCJzb2xpZFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmNvbG9yKSB7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJDb2xvciA9IFV0aWwubWFrZUNzc1JnYihcbiAgICAgICAgICBkYXRhLmNvbG9yWzBdIHwgMCxcbiAgICAgICAgICBkYXRhLmNvbG9yWzFdIHwgMCxcbiAgICAgICAgICBkYXRhLmNvbG9yWzJdIHwgMFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVHJhbnNwYXJlbnQgKGludmlzaWJsZSkgYm9yZGVyLCBzbyBkbyBub3QgZHJhdyBpdCBhdCBhbGwuXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHtyZWN0WzBdfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7cmVjdFsxXX1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcG9wdXAgZm9yIHRoZSBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50LiBUaGlzIGlzIHVzZWQgZm9yXG4gICAqIGFubm90YXRpb25zIHRoYXQgZG8gbm90IGhhdmUgYSBQb3B1cCBlbnRyeSBpbiB0aGUgZGljdGlvbmFyeSwgYnV0XG4gICAqIGFyZSBvZiBhIHR5cGUgdGhhdCB3b3JrcyB3aXRoIHBvcHVwcyAoc3VjaCBhcyBIaWdobGlnaHQgYW5ub3RhdGlvbnMpLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0hUTUxTZWN0aW9uRWxlbWVudH0gY29udGFpbmVyXG4gICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR8SFRNTEltYWdlRWxlbWVudHxudWxsfSB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uRWxlbWVudFxuICAgKi9cbiAgX2NyZWF0ZVBvcHVwKGNvbnRhaW5lciwgdHJpZ2dlciwgZGF0YSkge1xuICAgIC8vIElmIG5vIHRyaWdnZXIgZWxlbWVudCBpcyBzcGVjaWZpZWQsIGNyZWF0ZSBpdC5cbiAgICBpZiAoIXRyaWdnZXIpIHtcbiAgICAgIHRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdHJpZ2dlci5zdHlsZS5oZWlnaHQgPSBjb250YWluZXIuc3R5bGUuaGVpZ2h0O1xuICAgICAgdHJpZ2dlci5zdHlsZS53aWR0aCA9IGNvbnRhaW5lci5zdHlsZS53aWR0aDtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0cmlnZ2VyKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3B1cEVsZW1lbnQgPSBuZXcgUG9wdXBFbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHRyaWdnZXIsXG4gICAgICBjb2xvcjogZGF0YS5jb2xvcixcbiAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxuICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogZGF0YS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgY29udGVudHM6IGRhdGEuY29udGVudHMsXG4gICAgICBoaWRlV3JhcHBlcjogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBwb3B1cCA9IHBvcHVwRWxlbWVudC5yZW5kZXIoKTtcblxuICAgIC8vIFBvc2l0aW9uIHRoZSBwb3B1cCBuZXh0IHRvIHRoZSBhbm5vdGF0aW9uJ3MgY29udGFpbmVyLlxuICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBjb250YWluZXIuc3R5bGUud2lkdGg7XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocG9wdXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uRWxlbWVudFxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBBbm5vdGF0aW9uRWxlbWVudC5yZW5kZXJgIGNhbGxlZFwiKTtcbiAgfVxufVxuXG5jbGFzcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS51cmwgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5kZXN0IHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuYWN0aW9uXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgbGluayBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIExpbmtBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwibGlua0Fubm90YXRpb25cIjtcblxuICAgIGNvbnN0IHsgZGF0YSwgbGlua1NlcnZpY2UgfSA9IHRoaXM7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuXG4gICAgaWYgKGRhdGEudXJsKSB7XG4gICAgICBhZGRMaW5rQXR0cmlidXRlcyhsaW5rLCB7XG4gICAgICAgIHVybDogZGF0YS51cmwsXG4gICAgICAgIHRhcmdldDogZGF0YS5uZXdXaW5kb3dcbiAgICAgICAgICA/IExpbmtUYXJnZXQuQkxBTktcbiAgICAgICAgICA6IGxpbmtTZXJ2aWNlLmV4dGVybmFsTGlua1RhcmdldCxcbiAgICAgICAgcmVsOiBsaW5rU2VydmljZS5leHRlcm5hbExpbmtSZWwsXG4gICAgICAgIGVuYWJsZWQ6IGxpbmtTZXJ2aWNlLmV4dGVybmFsTGlua0VuYWJsZWQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuYWN0aW9uKSB7XG4gICAgICB0aGlzLl9iaW5kTmFtZWRBY3Rpb24obGluaywgZGF0YS5hY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9iaW5kTGluayhsaW5rLCBkYXRhLmRlc3QpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kIGludGVybmFsIGxpbmtzIHRvIHRoZSBsaW5rIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsaW5rXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0aW5hdGlvblxuICAgKiBAbWVtYmVyb2YgTGlua0Fubm90YXRpb25FbGVtZW50XG4gICAqL1xuICBfYmluZExpbmsobGluaywgZGVzdGluYXRpb24pIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldERlc3RpbmF0aW9uSGFzaChkZXN0aW5hdGlvbik7XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UubmF2aWdhdGVUbyhkZXN0aW5hdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBpZiAoZGVzdGluYXRpb24pIHtcbiAgICAgIGxpbmsuY2xhc3NOYW1lID0gXCJpbnRlcm5hbExpbmtcIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmluZCBuYW1lZCBhY3Rpb25zIHRvIHRoZSBsaW5rIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsaW5rXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAgICogQG1lbWJlcm9mIExpbmtBbm5vdGF0aW9uRWxlbWVudFxuICAgKi9cbiAgX2JpbmROYW1lZEFjdGlvbihsaW5rLCBhY3Rpb24pIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgbGluay5jbGFzc05hbWUgPSBcImludGVybmFsTGlua1wiO1xuICB9XG59XG5cbmNsYXNzIFRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHRleHQgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBUZXh0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcInRleHRBbm5vdGF0aW9uXCI7XG5cbiAgICBjb25zdCBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgaW1hZ2Uuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0O1xuICAgIGltYWdlLnN0eWxlLndpZHRoID0gdGhpcy5jb250YWluZXIuc3R5bGUud2lkdGg7XG4gICAgaW1hZ2Uuc3JjID1cbiAgICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoICtcbiAgICAgIFwiYW5ub3RhdGlvbi1cIiArXG4gICAgICB0aGlzLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgIFwiLnN2Z1wiO1xuICAgIGltYWdlLmFsdCA9IFwiW3t7dHlwZX19IEFubm90YXRpb25dXCI7XG4gICAgaW1hZ2UuZGF0YXNldC5sMTBuSWQgPSBcInRleHRfYW5ub3RhdGlvbl90eXBlXCI7XG4gICAgaW1hZ2UuZGF0YXNldC5sMTBuQXJncyA9IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogdGhpcy5kYXRhLm5hbWUgfSk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIGltYWdlLCB0aGlzLmRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGltYWdlKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHdpZGdldCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFdpZGdldEFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgLy8gU2hvdyBvbmx5IHRoZSBjb250YWluZXIgZm9yIHVuc3VwcG9ydGVkIGZpZWxkIHR5cGVzLlxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPVxuICAgICAgcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIHx8XG4gICAgICAoIXBhcmFtZXRlcnMuZGF0YS5oYXNBcHBlYXJhbmNlICYmICEhcGFyYW1ldGVycy5kYXRhLmZpZWxkVmFsdWUpO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSB0ZXh0IHdpZGdldCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IFRFWFRfQUxJR05NRU5UID0gW1wibGVmdFwiLCBcImNlbnRlclwiLCBcInJpZ2h0XCJdO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhLmlkO1xuXG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJ0ZXh0V2lkZ2V0QW5ub3RhdGlvblwiO1xuXG4gICAgbGV0IGVsZW1lbnQgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpIHtcbiAgICAgIC8vIE5PVEU6IFdlIGNhbm5vdCBzZXQgdGhlIHZhbHVlcyB1c2luZyBgZWxlbWVudC52YWx1ZWAgYmVsb3csIHNpbmNlIGl0XG4gICAgICAvLyAgICAgICBwcmV2ZW50cyB0aGUgQW5ub3RhdGlvbkxheWVyIHJhc3Rlcml6ZXIgaW4gYHRlc3QvZHJpdmVyLmpzYFxuICAgICAgLy8gICAgICAgZnJvbSBwYXJzaW5nIHRoZSBlbGVtZW50cyBjb3JyZWN0bHkgZm9yIHRoZSByZWZlcmVuY2UgdGVzdHMuXG4gICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHN0b3JhZ2UuZ2V0T3JDcmVhdGVWYWx1ZShpZCwgdGhpcy5kYXRhLmZpZWxkVmFsdWUpO1xuXG4gICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBlbGVtZW50LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCB0ZXh0Q29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCBldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuXG4gICAgICBpZiAodGhpcy5kYXRhLm1heExlbiAhPT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50Lm1heExlbmd0aCA9IHRoaXMuZGF0YS5tYXhMZW47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRhdGEuY29tYikge1xuICAgICAgICBjb25zdCBmaWVsZFdpZHRoID0gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTtcbiAgICAgICAgY29uc3QgY29tYldpZHRoID0gZmllbGRXaWR0aCAvIHRoaXMuZGF0YS5tYXhMZW47XG5cbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiY29tYlwiKTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gYGNhbGMoJHtjb21iV2lkdGh9cHggLSAxY2gpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7XG4gICAgICBlbGVtZW50LnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBcIm1pZGRsZVwiO1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJ0YWJsZS1jZWxsXCI7XG5cbiAgICAgIGxldCBmb250ID0gbnVsbDtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kYXRhLmZvbnRSZWZOYW1lICYmXG4gICAgICAgIHRoaXMucGFnZS5jb21tb25PYmpzLmhhcyh0aGlzLmRhdGEuZm9udFJlZk5hbWUpXG4gICAgICApIHtcbiAgICAgICAgZm9udCA9IHRoaXMucGFnZS5jb21tb25PYmpzLmdldCh0aGlzLmRhdGEuZm9udFJlZk5hbWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2V0VGV4dFN0eWxlKGVsZW1lbnQsIGZvbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGEudGV4dEFsaWdubWVudCAhPT0gbnVsbCkge1xuICAgICAgZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSBURVhUX0FMSUdOTUVOVFt0aGlzLmRhdGEudGV4dEFsaWdubWVudF07XG4gICAgfVxuXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRleHQgc3R5bGVzIHRvIHRoZSB0ZXh0IGluIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmb250XG4gICAqIEBtZW1iZXJvZiBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICovXG4gIF9zZXRUZXh0U3R5bGUoZWxlbWVudCwgZm9udCkge1xuICAgIC8vIFRPRE86IFRoaXMgZHVwbGljYXRlcyBzb21lIG9mIHRoZSBsb2dpYyBpbiBDYW52YXNHcmFwaGljcy5zZXRGb250KCkuXG4gICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50LnN0eWxlO1xuICAgIHN0eWxlLmZvbnRTaXplID0gYCR7dGhpcy5kYXRhLmZvbnRTaXplfXB4YDtcbiAgICBzdHlsZS5kaXJlY3Rpb24gPSB0aGlzLmRhdGEuZm9udERpcmVjdGlvbiA8IDAgPyBcInJ0bFwiIDogXCJsdHJcIjtcblxuICAgIGlmICghZm9udCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBib2xkID0gXCJub3JtYWxcIjtcbiAgICBpZiAoZm9udC5ibGFjaykge1xuICAgICAgYm9sZCA9IFwiOTAwXCI7XG4gICAgfSBlbHNlIGlmIChmb250LmJvbGQpIHtcbiAgICAgIGJvbGQgPSBcImJvbGRcIjtcbiAgICB9XG4gICAgc3R5bGUuZm9udFdlaWdodCA9IGJvbGQ7XG4gICAgc3R5bGUuZm9udFN0eWxlID0gZm9udC5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcblxuICAgIC8vIFVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBmb250IGlmIHRoZSBmb250IGRvZXNuJ3Qgc3BlY2lmeSBhIGZhbGxiYWNrLlxuICAgIGNvbnN0IGZvbnRGYW1pbHkgPSBmb250LmxvYWRlZE5hbWUgPyBgXCIke2ZvbnQubG9hZGVkTmFtZX1cIiwgYCA6IFwiXCI7XG4gICAgY29uc3QgZmFsbGJhY2tOYW1lID0gZm9udC5mYWxsYmFja05hbWUgfHwgXCJIZWx2ZXRpY2EsIHNhbnMtc2VyaWZcIjtcbiAgICBzdHlsZS5mb250RmFtaWx5ID0gZm9udEZhbWlseSArIGZhbGxiYWNrTmFtZTtcbiAgfVxufVxuXG5jbGFzcyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywgcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNoZWNrYm94IHdpZGdldCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50XG4gICAqIGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IGlkID0gZGF0YS5pZDtcbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0T3JDcmVhdGVWYWx1ZShcbiAgICAgIGlkLFxuICAgICAgZGF0YS5maWVsZFZhbHVlICYmIGRhdGEuZmllbGRWYWx1ZSAhPT0gXCJPZmZcIlxuICAgICk7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImJ1dHRvbldpZGdldEFubm90YXRpb24gY2hlY2tCb3hcIjtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgZWxlbWVudC5kaXNhYmxlZCA9IGRhdGEucmVhZE9ubHk7XG4gICAgZWxlbWVudC50eXBlID0gXCJjaGVja2JveFwiO1xuICAgIGVsZW1lbnQubmFtZSA9IHRoaXMuZGF0YS5maWVsZE5hbWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwgZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgcmFkaW8gYnV0dG9uIHdpZGdldCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50XG4gICAqIGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImJ1dHRvbldpZGdldEFubm90YXRpb24gcmFkaW9CdXR0b25cIjtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IGlkID0gZGF0YS5pZDtcbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0T3JDcmVhdGVWYWx1ZShcbiAgICAgIGlkLFxuICAgICAgZGF0YS5maWVsZFZhbHVlID09PSBkYXRhLmJ1dHRvblZhbHVlXG4gICAgKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgZWxlbWVudC5kaXNhYmxlZCA9IGRhdGEucmVhZE9ubHk7XG4gICAgZWxlbWVudC50eXBlID0gXCJyYWRpb1wiO1xuICAgIGVsZW1lbnQubmFtZSA9IGRhdGEuZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuICAgIH1cblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBldmVudC50YXJnZXQubmFtZTtcbiAgICAgIGZvciAoY29uc3QgcmFkaW8gb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUobmFtZSkpIHtcbiAgICAgICAgaWYgKHJhZGlvICE9PSBldmVudC50YXJnZXQpIHtcbiAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKFxuICAgICAgICAgICAgcmFkaW8ucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFubm90YXRpb24taWRcIiksXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIGV2ZW50LnRhcmdldC5jaGVja2VkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQge1xuICAvKipcbiAgICogUmVuZGVyIHRoZSBwdXNoIGJ1dHRvbiB3aWRnZXQgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudFxuICAgKiBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICAvLyBUaGUgcmVuZGVyaW5nIGFuZCBmdW5jdGlvbmFsaXR5IG9mIGEgcHVzaCBidXR0b24gd2lkZ2V0IGFubm90YXRpb24gaXNcbiAgICAvLyBlcXVhbCB0byB0aGF0IG9mIGEgbGluayBhbm5vdGF0aW9uLCBidXQgbWF5IGhhdmUgbW9yZSBmdW5jdGlvbmFsaXR5LCBzdWNoXG4gICAgLy8gYXMgcGVyZm9ybWluZyBhY3Rpb25zIG9uIGZvcm0gZmllbGRzIChyZXNldHRpbmcsIHN1Ym1pdHRpbmcsIGV0IGNldGVyYSkuXG4gICAgY29uc3QgY29udGFpbmVyID0gc3VwZXIucmVuZGVyKCk7XG4gICAgY29udGFpbmVyLmNsYXNzTmFtZSA9IFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBwdXNoQnV0dG9uXCI7XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjaG9pY2Ugd2lkZ2V0IGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5XG4gICAqIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImNob2ljZVdpZGdldEFubm90YXRpb25cIjtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZGF0YS5pZDtcblxuICAgIC8vIEZvciBwcmludGluZy9zYXZpbmcgd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBjaG9pY2Ugd2lkZ2V0cyB3aXRoIG9uZVxuICAgIC8vIG9wdGlvbiBzZWxlY3Rpb24uIFRoZXJlZm9yZSwgbGlzdGJveGVzICgjMTIxODkpIGFuZCBjb21ib2JveGVzICgjMTIyMjQpXG4gICAgLy8gYXJlIG5vdCBwcm9wZXJseSBwcmludGVkL3NhdmVkIHlldCwgc28gd2Ugb25seSBzdG9yZSB0aGUgZmlyc3QgaXRlbSBpblxuICAgIC8vIHRoZSBmaWVsZCB2YWx1ZSBhcnJheSBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgYXJyYXkuIE9uY2Ugc3VwcG9ydCBmb3IgdGhvc2VcbiAgICAvLyB0d28gZmllbGQgdHlwZXMgaXMgaW1wbGVtZW50ZWQsIHdlIHNob3VsZCB1c2UgdGhlIHNhbWUgcGF0dGVybiBhcyB0aGVcbiAgICAvLyBvdGhlciBpbnRlcmFjdGl2ZSB3aWRnZXRzIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgb2YgYGdldE9yQ3JlYXRlVmFsdWVgIGlzXG4gICAgLy8gdXNlZCBhbmQgdGhlIGZ1bGwgYXJyYXkgb2YgZmllbGQgdmFsdWVzIGlzIHN0b3JlZC5cbiAgICBzdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoXG4gICAgICBpZCxcbiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCA+IDAgPyB0aGlzLmRhdGEuZmllbGRWYWx1ZVswXSA6IG51bGxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XG4gICAgc2VsZWN0RWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGF0YS5yZWFkT25seTtcbiAgICBzZWxlY3RFbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEuY29tYm8pIHtcbiAgICAgIC8vIExpc3QgYm94ZXMgaGF2ZSBhIHNpemUgYW5kIChvcHRpb25hbGx5KSBtdWx0aXBsZSBzZWxlY3Rpb24uXG4gICAgICBzZWxlY3RFbGVtZW50LnNpemUgPSB0aGlzLmRhdGEub3B0aW9ucy5sZW5ndGg7XG4gICAgICBpZiAodGhpcy5kYXRhLm11bHRpU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc2VydCB0aGUgb3B0aW9ucyBpbnRvIHRoZSBjaG9pY2UgZmllbGQuXG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5kYXRhLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gb3B0aW9uLmV4cG9ydFZhbHVlO1xuICAgICAgaWYgKHRoaXMuZGF0YS5maWVsZFZhbHVlLmluY2x1ZGVzKG9wdGlvbi5leHBvcnRWYWx1ZSkpIHtcbiAgICAgICAgb3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7XG4gICAgfVxuXG4gICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZXZlbnQudGFyZ2V0Lm9wdGlvbnM7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0aW9ucy5zZWxlY3RlZEluZGV4XS52YWx1ZTtcbiAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHNlbGVjdEVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBQb3B1cEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHBvcHVwIGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUG9wdXBBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIC8vIERvIG5vdCByZW5kZXIgcG9wdXAgYW5ub3RhdGlvbnMgZm9yIHBhcmVudCBlbGVtZW50cyB3aXRoIHRoZXNlIHR5cGVzIGFzXG4gICAgLy8gdGhleSBjcmVhdGUgdGhlIHBvcHVwcyB0aGVtc2VsdmVzIChiZWNhdXNlIG9mIGN1c3RvbSB0cmlnZ2VyIGRpdnMpLlxuICAgIGNvbnN0IElHTk9SRV9UWVBFUyA9IFtcbiAgICAgIFwiTGluZVwiLFxuICAgICAgXCJTcXVhcmVcIixcbiAgICAgIFwiQ2lyY2xlXCIsXG4gICAgICBcIlBvbHlMaW5lXCIsXG4gICAgICBcIlBvbHlnb25cIixcbiAgICAgIFwiSW5rXCIsXG4gICAgXTtcblxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwicG9wdXBBbm5vdGF0aW9uXCI7XG5cbiAgICBpZiAoSUdOT1JFX1RZUEVTLmluY2x1ZGVzKHRoaXMuZGF0YS5wYXJlbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yID0gYFtkYXRhLWFubm90YXRpb24taWQ9XCIke3RoaXMuZGF0YS5wYXJlbnRJZH1cIl1gO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLmxheWVyLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIGlmICghcGFyZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcHVwID0gbmV3IFBvcHVwRWxlbWVudCh7XG4gICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxuICAgICAgdHJpZ2dlcjogcGFyZW50RWxlbWVudCxcbiAgICAgIGNvbG9yOiB0aGlzLmRhdGEuY29sb3IsXG4gICAgICB0aXRsZTogdGhpcy5kYXRhLnRpdGxlLFxuICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICBjb250ZW50czogdGhpcy5kYXRhLmNvbnRlbnRzLFxuICAgIH0pO1xuXG4gICAgLy8gUG9zaXRpb24gdGhlIHBvcHVwIG5leHQgdG8gdGhlIHBhcmVudCBhbm5vdGF0aW9uJ3MgY29udGFpbmVyLlxuICAgIC8vIFBERiB2aWV3ZXJzIGlnbm9yZSBhIHBvcHVwIGFubm90YXRpb24ncyByZWN0YW5nbGUuXG4gICAgY29uc3QgcGFyZW50TGVmdCA9IHBhcnNlRmxvYXQocGFyZW50RWxlbWVudC5zdHlsZS5sZWZ0KTtcbiAgICBjb25zdCBwYXJlbnRXaWR0aCA9IHBhcnNlRmxvYXQocGFyZW50RWxlbWVudC5zdHlsZS53aWR0aCk7XG4gICAgdGhpcy5jb250YWluZXIuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gYC0ke3BhcmVudExlZnQgKyBwYXJlbnRXaWR0aH1weCAtJHtcbiAgICAgIHBhcmVudEVsZW1lbnQuc3R5bGUudG9wXG4gICAgfWA7XG4gICAgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IGAke3BhcmVudExlZnQgKyBwYXJlbnRXaWR0aH1weGA7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChwb3B1cC5yZW5kZXIoKSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFBvcHVwRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IHBhcmFtZXRlcnMuY29udGFpbmVyO1xuICAgIHRoaXMudHJpZ2dlciA9IHBhcmFtZXRlcnMudHJpZ2dlcjtcbiAgICB0aGlzLmNvbG9yID0gcGFyYW1ldGVycy5jb2xvcjtcbiAgICB0aGlzLnRpdGxlID0gcGFyYW1ldGVycy50aXRsZTtcbiAgICB0aGlzLm1vZGlmaWNhdGlvbkRhdGUgPSBwYXJhbWV0ZXJzLm1vZGlmaWNhdGlvbkRhdGU7XG4gICAgdGhpcy5jb250ZW50cyA9IHBhcmFtZXRlcnMuY29udGVudHM7XG4gICAgdGhpcy5oaWRlV3JhcHBlciA9IHBhcmFtZXRlcnMuaGlkZVdyYXBwZXIgfHwgZmFsc2U7XG5cbiAgICB0aGlzLnBpbm5lZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgcG9wdXAncyBIVE1MIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFBvcHVwRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IEJBQ0tHUk9VTkRfRU5MSUdIVCA9IDAuNztcblxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHdyYXBwZXIuY2xhc3NOYW1lID0gXCJwb3B1cFdyYXBwZXJcIjtcblxuICAgIC8vIEZvciBQb3B1cCBhbm5vdGF0aW9ucyB3ZSBoaWRlIHRoZSBlbnRpcmUgc2VjdGlvbiBiZWNhdXNlIGl0IGNvbnRhaW5zXG4gICAgLy8gb25seSB0aGUgcG9wdXAuIEhvd2V2ZXIsIGZvciBUZXh0IGFubm90YXRpb25zIHdpdGhvdXQgYSBzZXBhcmF0ZSBQb3B1cFxuICAgIC8vIGFubm90YXRpb24sIHdlIGNhbm5vdCBoaWRlIHRoZSBlbnRpcmUgY29udGFpbmVyIGFzIHRoZSBpbWFnZSB3b3VsZFxuICAgIC8vIGRpc2FwcGVhciB0b28uIEluIHRoYXQgc3BlY2lhbCBjYXNlLCBoaWRpbmcgdGhlIHdyYXBwZXIgc3VmZmljZXMuXG4gICAgdGhpcy5oaWRlRWxlbWVudCA9IHRoaXMuaGlkZVdyYXBwZXIgPyB3cmFwcGVyIDogdGhpcy5jb250YWluZXI7XG4gICAgdGhpcy5oaWRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgdHJ1ZSk7XG5cbiAgICBjb25zdCBwb3B1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgcG9wdXAuY2xhc3NOYW1lID0gXCJwb3B1cFwiO1xuXG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yO1xuICAgIGlmIChjb2xvcikge1xuICAgICAgLy8gRW5saWdodGVuIHRoZSBjb2xvci5cbiAgICAgIGNvbnN0IHIgPSBCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gY29sb3JbMF0pICsgY29sb3JbMF07XG4gICAgICBjb25zdCBnID0gQkFDS0dST1VORF9FTkxJR0hUICogKDI1NSAtIGNvbG9yWzFdKSArIGNvbG9yWzFdO1xuICAgICAgY29uc3QgYiA9IEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjb2xvclsyXSkgKyBjb2xvclsyXTtcbiAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFV0aWwubWFrZUNzc1JnYihyIHwgMCwgZyB8IDAsIGIgfCAwKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IHRoaXMudGl0bGU7XG4gICAgcG9wdXAuYXBwZW5kQ2hpbGQodGl0bGUpO1xuXG4gICAgLy8gVGhlIG1vZGlmaWNhdGlvbiBkYXRlIGlzIHNob3duIGluIHRoZSBwb3B1cCBpbnN0ZWFkIG9mIHRoZSBjcmVhdGlvblxuICAgIC8vIGRhdGUgaWYgaXQgaXMgYXZhaWxhYmxlIGFuZCBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSwgd2hpY2ggaXNcbiAgICAvLyBjb25zaXN0ZW50IHdpdGggb3RoZXIgdmlld2VycyBzdWNoIGFzIEFkb2JlIEFjcm9iYXQuXG4gICAgY29uc3QgZGF0ZU9iamVjdCA9IFBERkRhdGVTdHJpbmcudG9EYXRlT2JqZWN0KHRoaXMubW9kaWZpY2F0aW9uRGF0ZSk7XG4gICAgaWYgKGRhdGVPYmplY3QpIHtcbiAgICAgIGNvbnN0IG1vZGlmaWNhdGlvbkRhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGUudGV4dENvbnRlbnQgPSBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiO1xuICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5kYXRhc2V0LmwxMG5JZCA9IFwiYW5ub3RhdGlvbl9kYXRlX3N0cmluZ1wiO1xuICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5kYXRhc2V0LmwxMG5BcmdzID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkYXRlOiBkYXRlT2JqZWN0LnRvTG9jYWxlRGF0ZVN0cmluZygpLFxuICAgICAgICB0aW1lOiBkYXRlT2JqZWN0LnRvTG9jYWxlVGltZVN0cmluZygpLFxuICAgICAgfSk7XG4gICAgICBwb3B1cC5hcHBlbmRDaGlsZChtb2RpZmljYXRpb25EYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50cyA9IHRoaXMuX2Zvcm1hdENvbnRlbnRzKHRoaXMuY29udGVudHMpO1xuICAgIHBvcHVwLmFwcGVuZENoaWxkKGNvbnRlbnRzKTtcblxuICAgIC8vIEF0dGFjaCB0aGUgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSB0cmlnZ2VyIGVsZW1lbnQuXG4gICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLl90b2dnbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgdGhpcy5fc2hvdy5iaW5kKHRoaXMsIGZhbHNlKSk7XG4gICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCB0aGlzLl9oaWRlLmJpbmQodGhpcywgZmFsc2UpKTtcbiAgICBwb3B1cC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGlkZS5iaW5kKHRoaXMsIHRydWUpKTtcblxuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQocG9wdXApO1xuICAgIHJldHVybiB3cmFwcGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aGUgY29udGVudHMgb2YgdGhlIHBvcHVwIGJ5IGFkZGluZyBuZXdsaW5lcyB3aGVyZSBuZWNlc3NhcnkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50c1xuICAgKiBAbWVtYmVyb2YgUG9wdXBFbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MUGFyYWdyYXBoRWxlbWVudH1cbiAgICovXG4gIF9mb3JtYXRDb250ZW50cyhjb250ZW50cykge1xuICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnRzLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICBwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpKTtcbiAgICAgIGlmIChpIDwgaWkgLSAxKSB7XG4gICAgICAgIHAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBwb3B1cC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBvcHVwRWxlbWVudFxuICAgKi9cbiAgX3RvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5waW5uZWQpIHtcbiAgICAgIHRoaXMuX2hpZGUodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nob3codHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIHBvcHVwLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBpblxuICAgKiBAbWVtYmVyb2YgUG9wdXBFbGVtZW50XG4gICAqL1xuICBfc2hvdyhwaW4gPSBmYWxzZSkge1xuICAgIGlmIChwaW4pIHtcbiAgICAgIHRoaXMucGlubmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGlkZUVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaGlkZGVuXCIpKSB7XG4gICAgICB0aGlzLmhpZGVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCArPSAxO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBwb3B1cC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtib29sZWFufSB1bnBpblxuICAgKiBAbWVtYmVyb2YgUG9wdXBFbGVtZW50XG4gICAqL1xuICBfaGlkZSh1bnBpbiA9IHRydWUpIHtcbiAgICBpZiAodW5waW4pIHtcbiAgICAgIHRoaXMucGlubmVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5oaWRlRWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJoaWRkZW5cIikgJiYgIXRoaXMucGlubmVkKSB7XG4gICAgICB0aGlzLmhpZGVFbGVtZW50LnNldEF0dHJpYnV0ZShcImhpZGRlblwiLCB0cnVlKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCAtPSAxO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIC8qIGlnbm9yZUJvcmRlciA9ICovIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgZnJlZSB0ZXh0IGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZnJlZVRleHRBbm5vdGF0aW9uXCI7XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgLyogaWdub3JlQm9yZGVyID0gKi8gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBsaW5lIGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgTGluZUFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJsaW5lQW5ub3RhdGlvblwiO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludmlzaWJsZSBsaW5lIHdpdGggdGhlIHNhbWUgc3RhcnRpbmcgYW5kIGVuZGluZyBjb29yZGluYXRlc1xuICAgIC8vIHRoYXQgYWN0cyBhcyB0aGUgdHJpZ2dlciBmb3IgdGhlIHBvcHVwLiBPbmx5IHRoZSBsaW5lIGl0c2VsZiBzaG91bGRcbiAgICAvLyB0cmlnZ2VyIHRoZSBwb3B1cCwgbm90IHRoZSBlbnRpcmUgY29udGFpbmVyLlxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07XG4gICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBQREYgY29vcmRpbmF0ZXMgYXJlIGNhbGN1bGF0ZWQgZnJvbSBhIGJvdHRvbSBsZWZ0IG9yaWdpbiwgc28gdHJhbnNmb3JtXG4gICAgLy8gdGhlIGxpbmUgY29vcmRpbmF0ZXMgdG8gYSB0b3AgbGVmdCBvcmlnaW4gZm9yIHRoZSBTVkcgZWxlbWVudC5cbiAgICBjb25zdCBsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bGluZVwiKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcIngxXCIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzBdKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInkxXCIsIGRhdGEucmVjdFszXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzFdKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcIngyXCIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzJdKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInkyXCIsIGRhdGEucmVjdFszXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzNdKTtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgJ3N0cm9rZS13aWR0aCcgaXMgYWx3YXlzIG5vbi16ZXJvLCBzaW5jZSBvdGhlcndpc2UgaXRcbiAgICAvLyB3b24ndCBiZSBwb3NzaWJsZSB0byBvcGVuL2Nsb3NlIHRoZSBwb3B1cCAobm90ZSBlLmcuIGlzc3VlIDExMTIyKS5cbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG5cbiAgICBzdmcuYXBwZW5kQ2hpbGQobGluZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHBvcHVwIG91cnNlbHZlcyBzbyB0aGF0IHdlIGNhbiBiaW5kIGl0IHRvIHRoZSBsaW5lIGluc3RlYWRcbiAgICAvLyBvZiB0byB0aGUgZW50aXJlIGNvbnRhaW5lciAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLlxuICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBsaW5lLCBkYXRhKTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCAvKiBpZ25vcmVCb3JkZXIgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHNxdWFyZSBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFNxdWFyZUFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJzcXVhcmVBbm5vdGF0aW9uXCI7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW52aXNpYmxlIHNxdWFyZSB3aXRoIHRoZSBzYW1lIHJlY3RhbmdsZSB0aGF0IGFjdHMgYXMgdGhlXG4gICAgLy8gdHJpZ2dlciBmb3IgdGhlIHBvcHVwLiBPbmx5IHRoZSBzcXVhcmUgaXRzZWxmIHNob3VsZCB0cmlnZ2VyIHRoZVxuICAgIC8vIHBvcHVwLCBub3QgdGhlIGVudGlyZSBjb250YWluZXIuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTtcbiAgICBjb25zdCBoZWlnaHQgPSBkYXRhLnJlY3RbM10gLSBkYXRhLnJlY3RbMV07XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICAgIC8vIFRoZSBicm93c2VyIGRyYXdzIGhhbGYgb2YgdGhlIGJvcmRlcnMgaW5zaWRlIHRoZSBzcXVhcmUgYW5kIGhhbGYgb2ZcbiAgICAvLyB0aGUgYm9yZGVycyBvdXRzaWRlIHRoZSBzcXVhcmUgYnkgZGVmYXVsdC4gVGhpcyBiZWhhdmlvciBjYW5ub3QgYmVcbiAgICAvLyBjaGFuZ2VkIHByb2dyYW1tYXRpY2FsbHksIHNvIGNvcnJlY3QgZm9yIHRoYXQgaGVyZS5cbiAgICBjb25zdCBib3JkZXJXaWR0aCA9IGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7XG4gICAgY29uc3Qgc3F1YXJlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwieFwiLCBib3JkZXJXaWR0aCAvIDIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ5XCIsIGJvcmRlcldpZHRoIC8gMik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHdpZHRoIC0gYm9yZGVyV2lkdGgpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgaGVpZ2h0IC0gYm9yZGVyV2lkdGgpO1xuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSAnc3Ryb2tlLXdpZHRoJyBpcyBhbHdheXMgbm9uLXplcm8sIHNpbmNlIG90aGVyd2lzZSBpdFxuICAgIC8vIHdvbid0IGJlIHBvc3NpYmxlIHRvIG9wZW4vY2xvc2UgdGhlIHBvcHVwIChub3RlIGUuZy4gaXNzdWUgMTExMjIpLlxuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyV2lkdGggfHwgMSk7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwibm9uZVwiKTtcblxuICAgIHN2Zy5hcHBlbmRDaGlsZChzcXVhcmUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBwb3B1cCBvdXJzZWx2ZXMgc28gdGhhdCB3ZSBjYW4gYmluZCBpdCB0byB0aGUgc3F1YXJlIGluc3RlYWRcbiAgICAvLyBvZiB0byB0aGUgZW50aXJlIGNvbnRhaW5lciAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLlxuICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBzcXVhcmUsIGRhdGEpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIC8qIGlnbm9yZUJvcmRlciA9ICovIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY2lyY2xlIGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImNpcmNsZUFubm90YXRpb25cIjtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnZpc2libGUgY2lyY2xlIHdpdGggdGhlIHNhbWUgZWxsaXBzZSB0aGF0IGFjdHMgYXMgdGhlXG4gICAgLy8gdHJpZ2dlciBmb3IgdGhlIHBvcHVwLiBPbmx5IHRoZSBjaXJjbGUgaXRzZWxmIHNob3VsZCB0cmlnZ2VyIHRoZVxuICAgIC8vIHBvcHVwLCBub3QgdGhlIGVudGlyZSBjb250YWluZXIuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTtcbiAgICBjb25zdCBoZWlnaHQgPSBkYXRhLnJlY3RbM10gLSBkYXRhLnJlY3RbMV07XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICAgIC8vIFRoZSBicm93c2VyIGRyYXdzIGhhbGYgb2YgdGhlIGJvcmRlcnMgaW5zaWRlIHRoZSBjaXJjbGUgYW5kIGhhbGYgb2ZcbiAgICAvLyB0aGUgYm9yZGVycyBvdXRzaWRlIHRoZSBjaXJjbGUgYnkgZGVmYXVsdC4gVGhpcyBiZWhhdmlvciBjYW5ub3QgYmVcbiAgICAvLyBjaGFuZ2VkIHByb2dyYW1tYXRpY2FsbHksIHNvIGNvcnJlY3QgZm9yIHRoYXQgaGVyZS5cbiAgICBjb25zdCBib3JkZXJXaWR0aCA9IGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7XG4gICAgY29uc3QgY2lyY2xlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6ZWxsaXBzZVwiKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiY3hcIiwgd2lkdGggLyAyKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiY3lcIiwgaGVpZ2h0IC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInJ4XCIsIHdpZHRoIC8gMiAtIGJvcmRlcldpZHRoIC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInJ5XCIsIGhlaWdodCAvIDIgLSBib3JkZXJXaWR0aCAvIDIpO1xuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSAnc3Ryb2tlLXdpZHRoJyBpcyBhbHdheXMgbm9uLXplcm8sIHNpbmNlIG90aGVyd2lzZSBpdFxuICAgIC8vIHdvbid0IGJlIHBvc3NpYmxlIHRvIG9wZW4vY2xvc2UgdGhlIHBvcHVwIChub3RlIGUuZy4gaXNzdWUgMTExMjIpLlxuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyV2lkdGggfHwgMSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwibm9uZVwiKTtcblxuICAgIHN2Zy5hcHBlbmRDaGlsZChjaXJjbGUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBwb3B1cCBvdXJzZWx2ZXMgc28gdGhhdCB3ZSBjYW4gYmluZCBpdCB0byB0aGUgY2lyY2xlIGluc3RlYWRcbiAgICAvLyBvZiB0byB0aGUgZW50aXJlIGNvbnRhaW5lciAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLlxuICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBjaXJjbGUsIGRhdGEpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgLyogaWdub3JlQm9yZGVyID0gKi8gdHJ1ZSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWxpbmVBbm5vdGF0aW9uXCI7XG4gICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBwb2x5bGluZSBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZTtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnZpc2libGUgcG9seWxpbmUgd2l0aCB0aGUgc2FtZSBwb2ludHMgdGhhdCBhY3RzIGFzIHRoZVxuICAgIC8vIHRyaWdnZXIgZm9yIHRoZSBwb3B1cC4gT25seSB0aGUgcG9seWxpbmUgaXRzZWxmIHNob3VsZCB0cmlnZ2VyIHRoZVxuICAgIC8vIHBvcHVwLCBub3QgdGhlIGVudGlyZSBjb250YWluZXIuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTtcbiAgICBjb25zdCBoZWlnaHQgPSBkYXRhLnJlY3RbM10gLSBkYXRhLnJlY3RbMV07XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICAgIC8vIENvbnZlcnQgdGhlIHZlcnRpY2VzIGFycmF5IHRvIGEgc2luZ2xlIHBvaW50cyBzdHJpbmcgdGhhdCB0aGUgU1ZHXG4gICAgLy8gcG9seWxpbmUgZWxlbWVudCBleHBlY3RzIChcIngxLHkxIHgyLHkyIC4uLlwiKS4gUERGIGNvb3JkaW5hdGVzIGFyZVxuICAgIC8vIGNhbGN1bGF0ZWQgZnJvbSBhIGJvdHRvbSBsZWZ0IG9yaWdpbiwgc28gdHJhbnNmb3JtIHRoZSBwb2x5bGluZVxuICAgIC8vIGNvb3JkaW5hdGVzIHRvIGEgdG9wIGxlZnQgb3JpZ2luIGZvciB0aGUgU1ZHIGVsZW1lbnQuXG4gICAgbGV0IHBvaW50cyA9IFtdO1xuICAgIGZvciAoY29uc3QgY29vcmRpbmF0ZSBvZiBkYXRhLnZlcnRpY2VzKSB7XG4gICAgICBjb25zdCB4ID0gY29vcmRpbmF0ZS54IC0gZGF0YS5yZWN0WzBdO1xuICAgICAgY29uc3QgeSA9IGRhdGEucmVjdFszXSAtIGNvb3JkaW5hdGUueTtcbiAgICAgIHBvaW50cy5wdXNoKHggKyBcIixcIiArIHkpO1xuICAgIH1cbiAgICBwb2ludHMgPSBwb2ludHMuam9pbihcIiBcIik7XG5cbiAgICBjb25zdCBwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBwb2ludHMpO1xuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSAnc3Ryb2tlLXdpZHRoJyBpcyBhbHdheXMgbm9uLXplcm8sIHNpbmNlIG90aGVyd2lzZSBpdFxuICAgIC8vIHdvbid0IGJlIHBvc3NpYmxlIHRvIG9wZW4vY2xvc2UgdGhlIHBvcHVwIChub3RlIGUuZy4gaXNzdWUgMTExMjIpLlxuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJub25lXCIpO1xuXG4gICAgc3ZnLmFwcGVuZENoaWxkKHBvbHlsaW5lKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcG9wdXAgb3Vyc2VsdmVzIHNvIHRoYXQgd2UgY2FuIGJpbmQgaXQgdG8gdGhlIHBvbHlsaW5lXG4gICAgLy8gaW5zdGVhZCBvZiB0byB0aGUgZW50aXJlIGNvbnRhaW5lciAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLlxuICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBwb2x5bGluZSwgZGF0YSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgUG9seWdvbkFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICAvLyBQb2x5Z29ucyBhcmUgc3BlY2lmaWMgZm9ybXMgb2YgcG9seWxpbmVzLCBzbyByZXVzZSB0aGVpciBsb2dpYy5cbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJwb2x5Z29uQW5ub3RhdGlvblwiO1xuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5Z29uXCI7XG4gIH1cbn1cblxuY2xhc3MgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCAvKiBpZ25vcmVCb3JkZXIgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNhcmV0IGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwiY2FyZXRBbm5vdGF0aW9uXCI7XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBJbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCAvKiBpZ25vcmVCb3JkZXIgPSAqLyB0cnVlKTtcblxuICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJpbmtBbm5vdGF0aW9uXCI7XG5cbiAgICAvLyBVc2UgdGhlIHBvbHlsaW5lIFNWRyBlbGVtZW50IHNpbmNlIGl0IGFsbG93cyB1cyB0byB1c2UgY29vcmRpbmF0ZXNcbiAgICAvLyBkaXJlY3RseSBhbmQgdG8gZHJhdyBib3RoIHN0cmFpZ2h0IGxpbmVzIGFuZCBjdXJ2ZXMuXG4gICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBpbmsgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJbmtBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludmlzaWJsZSBwb2x5bGluZSB3aXRoIHRoZSBzYW1lIHBvaW50cyB0aGF0IGFjdHMgYXMgdGhlXG4gICAgLy8gdHJpZ2dlciBmb3IgdGhlIHBvcHVwLlxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07XG4gICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG5cbiAgICBmb3IgKGNvbnN0IGlua0xpc3Qgb2YgZGF0YS5pbmtMaXN0cykge1xuICAgICAgLy8gQ29udmVydCB0aGUgaW5rIGxpc3QgdG8gYSBzaW5nbGUgcG9pbnRzIHN0cmluZyB0aGF0IHRoZSBTVkdcbiAgICAgIC8vIHBvbHlsaW5lIGVsZW1lbnQgZXhwZWN0cyAoXCJ4MSx5MSB4Mix5MiAuLi5cIikuIFBERiBjb29yZGluYXRlcyBhcmVcbiAgICAgIC8vIGNhbGN1bGF0ZWQgZnJvbSBhIGJvdHRvbSBsZWZ0IG9yaWdpbiwgc28gdHJhbnNmb3JtIHRoZSBwb2x5bGluZVxuICAgICAgLy8gY29vcmRpbmF0ZXMgdG8gYSB0b3AgbGVmdCBvcmlnaW4gZm9yIHRoZSBTVkcgZWxlbWVudC5cbiAgICAgIGxldCBwb2ludHMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY29vcmRpbmF0ZSBvZiBpbmtMaXN0KSB7XG4gICAgICAgIGNvbnN0IHggPSBjb29yZGluYXRlLnggLSBkYXRhLnJlY3RbMF07XG4gICAgICAgIGNvbnN0IHkgPSBkYXRhLnJlY3RbM10gLSBjb29yZGluYXRlLnk7XG4gICAgICAgIHBvaW50cy5wdXNoKGAke3h9LCR7eX1gKTtcbiAgICAgIH1cbiAgICAgIHBvaW50cyA9IHBvaW50cy5qb2luKFwiIFwiKTtcblxuICAgICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBwb2ludHMpO1xuICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlICdzdHJva2Utd2lkdGgnIGlzIGFsd2F5cyBub24temVybywgc2luY2Ugb3RoZXJ3aXNlIGl0XG4gICAgICAvLyB3b24ndCBiZSBwb3NzaWJsZSB0byBvcGVuL2Nsb3NlIHRoZSBwb3B1cCAobm90ZSBlLmcuIGlzc3VlIDExMTIyKS5cbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpO1xuICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwibm9uZVwiKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBwb3B1cCBvdXJzZWx2ZXMgc28gdGhhdCB3ZSBjYW4gYmluZCBpdCB0byB0aGUgcG9seWxpbmVcbiAgICAgIC8vIGluc3RlYWQgb2YgdG8gdGhlIGVudGlyZSBjb250YWluZXIgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS5cbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBwb2x5bGluZSwgZGF0YSk7XG5cbiAgICAgIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIC8qIGlnbm9yZUJvcmRlciA9ICovIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgaGlnaGxpZ2h0IGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImhpZ2hsaWdodEFubm90YXRpb25cIjtcblxuICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFVuZGVybGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIC8qIGlnbm9yZUJvcmRlciA9ICovIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgdW5kZXJsaW5lIGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcInVuZGVybGluZUFubm90YXRpb25cIjtcblxuICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgLyogaWdub3JlQm9yZGVyID0gKi8gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBzcXVpZ2dseSBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcInNxdWlnZ2x5QW5ub3RhdGlvblwiO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgLyogaWdub3JlQm9yZGVyID0gKi8gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBzdHJpa2VvdXQgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwic3RyaWtlb3V0QW5ub3RhdGlvblwiO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgU3RhbXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCAvKiBpZ25vcmVCb3JkZXIgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHN0YW1wIGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgU3RhbXBBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwic3RhbXBBbm5vdGF0aW9uXCI7XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywgLyogaXNSZW5kZXJhYmxlID0gKi8gdHJ1ZSk7XG5cbiAgICBjb25zdCB7IGZpbGVuYW1lLCBjb250ZW50IH0gPSB0aGlzLmRhdGEuZmlsZTtcbiAgICB0aGlzLmZpbGVuYW1lID0gZ2V0RmlsZW5hbWVGcm9tVXJsKGZpbGVuYW1lKTtcbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXG4gICAgaWYgKHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpIHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMuZGlzcGF0Y2goXCJmaWxlYXR0YWNobWVudGFubm90YXRpb25cIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIGlkOiBzdHJpbmdUb1BERlN0cmluZyhmaWxlbmFtZSksXG4gICAgICAgIGZpbGVuYW1lLFxuICAgICAgICBjb250ZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgZmlsZSBhdHRhY2htZW50IGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5XG4gICAqIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uXCI7XG5cbiAgICBjb25zdCB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0cmlnZ2VyLnN0eWxlLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodDtcbiAgICB0cmlnZ2VyLnN0eWxlLndpZHRoID0gdGhpcy5jb250YWluZXIuc3R5bGUud2lkdGg7XG4gICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIiwgdGhpcy5fZG93bmxvYWQuYmluZCh0aGlzKSk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCAmJiAodGhpcy5kYXRhLnRpdGxlIHx8IHRoaXMuZGF0YS5jb250ZW50cykpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCB0cmlnZ2VyLCB0aGlzLmRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRyaWdnZXIpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCB0aGUgZmlsZSBhdHRhY2htZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFubm90YXRpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50XG4gICAqL1xuICBfZG93bmxvYWQoKSB7XG4gICAgaWYgKCF0aGlzLmRvd25sb2FkTWFuYWdlcikge1xuICAgICAgd2FybihcIkRvd25sb2FkIGNhbm5vdCBiZSBzdGFydGVkIGR1ZSB0byB1bmF2YWlsYWJsZSBkb3dubG9hZCBtYW5hZ2VyXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlci5kb3dubG9hZERhdGEodGhpcy5jb250ZW50LCB0aGlzLmZpbGVuYW1lLCBcIlwiKTtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFubm90YXRpb25MYXllclBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydFxuICogQHByb3BlcnR5IHtIVE1MRGl2RWxlbWVudH0gZGl2XG4gKiBAcHJvcGVydHkge0FycmF5fSBhbm5vdGF0aW9uc1xuICogQHByb3BlcnR5IHtQREZQYWdlfSBwYWdlXG4gKiBAcHJvcGVydHkge0lQREZMaW5rU2VydmljZX0gbGlua1NlcnZpY2VcbiAqIEBwcm9wZXJ0eSB7RG93bmxvYWRNYW5hZ2VyfSBkb3dubG9hZE1hbmFnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW1hZ2VSZXNvdXJjZXNQYXRoXSAtIFBhdGggZm9yIGltYWdlIHJlc291cmNlcywgbWFpbmx5XG4gKiAgIGZvciBhbm5vdGF0aW9uIGljb25zLiBJbmNsdWRlIHRyYWlsaW5nIHNsYXNoLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zXG4gKi9cblxuY2xhc3MgQW5ub3RhdGlvbkxheWVyIHtcbiAgLyoqXG4gICAqIFJlbmRlciBhIG5ldyBhbm5vdGF0aW9uIGxheWVyIHdpdGggYWxsIGFubm90YXRpb24gZWxlbWVudHMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtBbm5vdGF0aW9uTGF5ZXJQYXJhbWV0ZXJzfSBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uTGF5ZXJcbiAgICovXG4gIHN0YXRpYyByZW5kZXIocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHNvcnRlZEFubm90YXRpb25zID0gW10sXG4gICAgICBwb3B1cEFubm90YXRpb25zID0gW107XG4gICAgLy8gRW5zdXJlIHRoYXQgUG9wdXAgYW5ub3RhdGlvbnMgYXJlIGhhbmRsZWQgbGFzdCwgc2luY2UgdGhleSdyZSBkZXBlbmRhbnRcbiAgICAvLyB1cG9uIHRoZSBwYXJlbnQgYW5ub3RhdGlvbiBoYXZpbmcgYWxyZWFkeSBiZWVuIHJlbmRlcmVkIChwbGVhc2UgcmVmZXIgdG9cbiAgICAvLyB0aGUgYFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBtZXRob2QpOyBmaXhlcyBpc3N1ZSAxMTM2Mi5cbiAgICBmb3IgKGNvbnN0IGRhdGEgb2YgcGFyYW1ldGVycy5hbm5vdGF0aW9ucykge1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuYW5ub3RhdGlvblR5cGUgPT09IEFubm90YXRpb25UeXBlLlBPUFVQKSB7XG4gICAgICAgIHBvcHVwQW5ub3RhdGlvbnMucHVzaChkYXRhKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzb3J0ZWRBbm5vdGF0aW9ucy5wdXNoKGRhdGEpO1xuICAgIH1cbiAgICBpZiAocG9wdXBBbm5vdGF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goLi4ucG9wdXBBbm5vdGF0aW9ucyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkYXRhIG9mIHNvcnRlZEFubm90YXRpb25zKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5LmNyZWF0ZSh7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGxheWVyOiBwYXJhbWV0ZXJzLmRpdixcbiAgICAgICAgcGFnZTogcGFyYW1ldGVycy5wYWdlLFxuICAgICAgICB2aWV3cG9ydDogcGFyYW1ldGVycy52aWV3cG9ydCxcbiAgICAgICAgbGlua1NlcnZpY2U6IHBhcmFtZXRlcnMubGlua1NlcnZpY2UsXG4gICAgICAgIGRvd25sb2FkTWFuYWdlcjogcGFyYW1ldGVycy5kb3dubG9hZE1hbmFnZXIsXG4gICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogcGFyYW1ldGVycy5pbWFnZVJlc291cmNlc1BhdGggfHwgXCJcIixcbiAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczpcbiAgICAgICAgICB0eXBlb2YgcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXNcbiAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgc3ZnRmFjdG9yeTogbmV3IERPTVNWR0ZhY3RvcnkoKSxcbiAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6XG4gICAgICAgICAgcGFyYW1ldGVycy5hbm5vdGF0aW9uU3RvcmFnZSB8fCBuZXcgQW5ub3RhdGlvblN0b3JhZ2UoKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGVsZW1lbnQuaXNSZW5kZXJhYmxlKSB7XG4gICAgICAgIHBhcmFtZXRlcnMuZGl2LmFwcGVuZENoaWxkKGVsZW1lbnQucmVuZGVyKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGFubm90YXRpb24gZWxlbWVudHMgb24gZXhpc3RpbmcgYW5ub3RhdGlvbiBsYXllci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge0Fubm90YXRpb25MYXllclBhcmFtZXRlcnN9IHBhcmFtZXRlcnNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25MYXllclxuICAgKi9cbiAgc3RhdGljIHVwZGF0ZShwYXJhbWV0ZXJzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhIG9mIHBhcmFtZXRlcnMuYW5ub3RhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBwYXJhbWV0ZXJzLmRpdi5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgW2RhdGEtYW5ub3RhdGlvbi1pZD1cIiR7ZGF0YS5pZH1cIl1gXG4gICAgICApO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgbWF0cml4KCR7cGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcbiAgICAgICAgICBcIixcIlxuICAgICAgICApfSlgO1xuICAgICAgfVxuICAgIH1cbiAgICBwYXJhbWV0ZXJzLmRpdi5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gIH1cbn1cblxuZXhwb3J0IHsgQW5ub3RhdGlvbkxheWVyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNSBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQWJvcnRFeGNlcHRpb24sXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBVdGlsLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuLyoqXG4gKiBUZXh0IGxheWVyIHJlbmRlciBwYXJhbWV0ZXJzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRMYXllclJlbmRlclBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9hcGlcIikuVGV4dENvbnRlbnR9IFt0ZXh0Q29udGVudF0gLSBUZXh0IGNvbnRlbnQgdG9cbiAqICAgcmVuZGVyICh0aGUgb2JqZWN0IGlzIHJldHVybmVkIGJ5IHRoZSBwYWdlJ3MgYGdldFRleHRDb250ZW50YCBtZXRob2QpLlxuICogQHByb3BlcnR5IHtSZWFkYWJsZVN0cmVhbX0gW3RleHRDb250ZW50U3RyZWFtXSAtIFRleHQgY29udGVudCBzdHJlYW0gdG9cbiAqICAgcmVuZGVyICh0aGUgc3RyZWFtIGlzIHJldHVybmVkIGJ5IHRoZSBwYWdlJ3MgYHN0cmVhbVRleHRDb250ZW50YCBtZXRob2QpLlxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gY29udGFpbmVyIC0gSFRNTCBlbGVtZW50IHRoYXQgd2lsbCBjb250YWluIHRleHQgcnVucy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9kaXNwbGF5X3V0aWxzXCIpLlBhZ2VWaWV3cG9ydH0gdmlld3BvcnQgLSBUaGUgdGFyZ2V0XG4gKiAgIHZpZXdwb3J0IHRvIHByb3Blcmx5IGxheW91dCB0aGUgdGV4dCBydW5zLlxuICogQHByb3BlcnR5IHtBcnJheTxIVE1MRWxlbWVudD59IFt0ZXh0RGl2c10gLSBIVE1MIGVsZW1lbnRzIHRoYXQgYXJlIGNvcnJlc3BvbmRcbiAqICAgdG8gdGhlIHRleHQgaXRlbXMgb2YgdGhlIHRleHRDb250ZW50IGlucHV0LiBUaGlzIGlzIG91dHB1dCBhbmQgc2hhbGwgYmVcbiAqICAgaW5pdGlhbGx5IGJlIHNldCB0byBlbXB0eSBhcnJheS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gW3RleHRDb250ZW50SXRlbXNTdHJdIC0gU3RyaW5ncyB0aGF0IGNvcnJlc3BvbmQgdG9cbiAqICAgIHRoZSBgc3RyYCBwcm9wZXJ0eSBvZiB0aGUgdGV4dCBpdGVtcyBvZiB0ZXh0Q29udGVudCBpbnB1dC4gVGhpcyBpcyBvdXRwdXRcbiAqICAgYW5kIHNoYWxsIGJlIGluaXRpYWxseSBiZSBzZXQgdG8gZW1wdHkgYXJyYXkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIC0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSByZW5kZXJpbmcgb2YgdGhlXG4gKiAgIHRleHQgcnVucyBvY2N1cnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmhhbmNlVGV4dFNlbGVjdGlvbl0gLSBXaGV0aGVyIHRvIHR1cm4gb24gdGhlIHRleHRcbiAqICAgc2VsZWN0aW9uIGVuaGFuY2VtZW50LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGV4dExheWVyUmVuZGVyVGFza1xuICogQHByb3BlcnR5IHtQcm9taXNlPHZvaWQ+fSBwcm9taXNlXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNhbmNlbFxuICogQHByb3BlcnR5IHsoZXhwYW5kRGl2czogYm9vbGVhbikgPT4gdm9pZH0gZXhwYW5kVGV4dERpdnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlIHsocmVuZGVyUGFyYW1ldGVyczogVGV4dExheWVyUmVuZGVyUGFyYW1ldGVycykgPT4gVGV4dExheWVyUmVuZGVyVGFza31cbiAqL1xudmFyIHJlbmRlclRleHRMYXllciA9IChmdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXJDbG9zdXJlKCkge1xuICB2YXIgTUFYX1RFWFRfRElWU19UT19SRU5ERVIgPSAxMDAwMDA7XG5cbiAgdmFyIE5vbldoaXRlc3BhY2VSZWdleHAgPSAvXFxTLztcblxuICBmdW5jdGlvbiBpc0FsbFdoaXRlc3BhY2Uoc3RyKSB7XG4gICAgcmV0dXJuICFOb25XaGl0ZXNwYWNlUmVnZXhwLnRlc3Qoc3RyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZFRleHQodGFzaywgZ2VvbSwgc3R5bGVzKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgdXNlZCBwcm9wZXJ0aWVzIHRvIGtlZXAgdGhlIGNhY2hlcyBtb25vbW9ycGhpYy5cbiAgICB2YXIgdGV4dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHZhciB0ZXh0RGl2UHJvcGVydGllcyA9IHtcbiAgICAgIGFuZ2xlOiAwLFxuICAgICAgY2FudmFzV2lkdGg6IDAsXG4gICAgICBpc1doaXRlc3BhY2U6IGZhbHNlLFxuICAgICAgb3JpZ2luYWxUcmFuc2Zvcm06IG51bGwsXG4gICAgICBwYWRkaW5nQm90dG9tOiAwLFxuICAgICAgcGFkZGluZ0xlZnQ6IDAsXG4gICAgICBwYWRkaW5nUmlnaHQ6IDAsXG4gICAgICBwYWRkaW5nVG9wOiAwLFxuICAgICAgc2NhbGU6IDEsXG4gICAgfTtcblxuICAgIHRhc2suX3RleHREaXZzLnB1c2godGV4dERpdik7XG4gICAgaWYgKGlzQWxsV2hpdGVzcGFjZShnZW9tLnN0cikpIHtcbiAgICAgIHRleHREaXZQcm9wZXJ0aWVzLmlzV2hpdGVzcGFjZSA9IHRydWU7XG4gICAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0eCA9IFV0aWwudHJhbnNmb3JtKHRhc2suX3ZpZXdwb3J0LnRyYW5zZm9ybSwgZ2VvbS50cmFuc2Zvcm0pO1xuICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIodHhbMV0sIHR4WzBdKTtcbiAgICB2YXIgc3R5bGUgPSBzdHlsZXNbZ2VvbS5mb250TmFtZV07XG4gICAgaWYgKHN0eWxlLnZlcnRpY2FsKSB7XG4gICAgICBhbmdsZSArPSBNYXRoLlBJIC8gMjtcbiAgICB9XG4gICAgdmFyIGZvbnRIZWlnaHQgPSBNYXRoLnNxcnQodHhbMl0gKiB0eFsyXSArIHR4WzNdICogdHhbM10pO1xuICAgIHZhciBmb250QXNjZW50ID0gZm9udEhlaWdodDtcbiAgICBpZiAoc3R5bGUuYXNjZW50KSB7XG4gICAgICBmb250QXNjZW50ID0gc3R5bGUuYXNjZW50ICogZm9udEFzY2VudDtcbiAgICB9IGVsc2UgaWYgKHN0eWxlLmRlc2NlbnQpIHtcbiAgICAgIGZvbnRBc2NlbnQgPSAoMSArIHN0eWxlLmRlc2NlbnQpICogZm9udEFzY2VudDtcbiAgICB9XG5cbiAgICBsZXQgbGVmdCwgdG9wO1xuICAgIGlmIChhbmdsZSA9PT0gMCkge1xuICAgICAgbGVmdCA9IHR4WzRdO1xuICAgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZWZ0ID0gdHhbNF0gKyBmb250QXNjZW50ICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50ICogTWF0aC5jb3MoYW5nbGUpO1xuICAgIH1cbiAgICAvLyBTZXR0aW5nIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGluZGl2aWR1YWxseSwgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UsXG4gICAgLy8gc2hvdWxkIGJlIE9LIHNpbmNlIHRoZSBgdGV4dERpdmAgaXNuJ3QgYXBwZW5kZWQgdG8gdGhlIGRvY3VtZW50IHlldC5cbiAgICB0ZXh0RGl2LnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICB0ZXh0RGl2LnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgdGV4dERpdi5zdHlsZS5mb250U2l6ZSA9IGAke2ZvbnRIZWlnaHR9cHhgO1xuICAgIHRleHREaXYuc3R5bGUuZm9udEZhbWlseSA9IHN0eWxlLmZvbnRGYW1pbHk7XG5cbiAgICB0ZXh0RGl2LnRleHRDb250ZW50ID0gZ2VvbS5zdHI7XG4gICAgLy8gYGZvbnROYW1lYCBpcyBvbmx5IHVzZWQgYnkgdGhlIEZvbnRJbnNwZWN0b3IsIGFuZCB3ZSBvbmx5IHVzZSBgZGF0YXNldGBcbiAgICAvLyBoZXJlIHRvIG1ha2UgdGhlIGZvbnQgbmFtZSBhdmFpbGFibGUgaW4gdGhlIGRlYnVnZ2VyLlxuICAgIGlmICh0YXNrLl9mb250SW5zcGVjdG9yRW5hYmxlZCkge1xuICAgICAgdGV4dERpdi5kYXRhc2V0LmZvbnROYW1lID0gZ2VvbS5mb250TmFtZTtcbiAgICB9XG4gICAgaWYgKGFuZ2xlICE9PSAwKSB7XG4gICAgICB0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSA9IGFuZ2xlICogKDE4MCAvIE1hdGguUEkpO1xuICAgIH1cbiAgICAvLyBXZSBkb24ndCBib3RoZXIgc2NhbGluZyBzaW5nbGUtY2hhciB0ZXh0IGRpdnMsIGJlY2F1c2UgaXQgaGFzIHZlcnlcbiAgICAvLyBsaXR0bGUgZWZmZWN0IG9uIHRleHQgaGlnaGxpZ2h0aW5nLiBUaGlzIG1ha2VzIHNjcm9sbGluZyBvbiBkb2NzIHdpdGhcbiAgICAvLyBsb3RzIG9mIHN1Y2ggZGl2cyBhIGxvdCBmYXN0ZXIuXG4gICAgbGV0IHNob3VsZFNjYWxlVGV4dCA9IGZhbHNlO1xuICAgIGlmIChnZW9tLnN0ci5sZW5ndGggPiAxKSB7XG4gICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZ2VvbS50cmFuc2Zvcm1bMF0gIT09IGdlb20udHJhbnNmb3JtWzNdKSB7XG4gICAgICBjb25zdCBhYnNTY2FsZVggPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVswXSksXG4gICAgICAgIGFic1NjYWxlWSA9IE1hdGguYWJzKGdlb20udHJhbnNmb3JtWzNdKTtcbiAgICAgIC8vIFdoZW4gdGhlIGhvcml6b250YWwvdmVydGljYWwgc2NhbGluZyBkaWZmZXJzIHNpZ25pZmljYW50bHksIGFsc28gc2NhbGVcbiAgICAgIC8vIGV2ZW4gc2luZ2xlLWNoYXIgdGV4dCB0byBpbXByb3ZlIGhpZ2hsaWdodGluZyAoZml4ZXMgaXNzdWUxMTcxMy5wZGYpLlxuICAgICAgaWYgKFxuICAgICAgICBhYnNTY2FsZVggIT09IGFic1NjYWxlWSAmJlxuICAgICAgICBNYXRoLm1heChhYnNTY2FsZVgsIGFic1NjYWxlWSkgLyBNYXRoLm1pbihhYnNTY2FsZVgsIGFic1NjYWxlWSkgPiAxLjVcbiAgICAgICkge1xuICAgICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkU2NhbGVUZXh0KSB7XG4gICAgICBpZiAoc3R5bGUudmVydGljYWwpIHtcbiAgICAgICAgdGV4dERpdlByb3BlcnRpZXMuY2FudmFzV2lkdGggPSBnZW9tLmhlaWdodCAqIHRhc2suX3ZpZXdwb3J0LnNjYWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dERpdlByb3BlcnRpZXMuY2FudmFzV2lkdGggPSBnZW9tLndpZHRoICogdGFzay5fdmlld3BvcnQuc2NhbGU7XG4gICAgICB9XG4gICAgfVxuICAgIHRhc2suX3RleHREaXZQcm9wZXJ0aWVzLnNldCh0ZXh0RGl2LCB0ZXh0RGl2UHJvcGVydGllcyk7XG4gICAgaWYgKHRhc2suX3RleHRDb250ZW50U3RyZWFtKSB7XG4gICAgICB0YXNrLl9sYXlvdXRUZXh0KHRleHREaXYpO1xuICAgIH1cblxuICAgIGlmICh0YXNrLl9lbmhhbmNlVGV4dFNlbGVjdGlvbikge1xuICAgICAgdmFyIGFuZ2xlQ29zID0gMSxcbiAgICAgICAgYW5nbGVTaW4gPSAwO1xuICAgICAgaWYgKGFuZ2xlICE9PSAwKSB7XG4gICAgICAgIGFuZ2xlQ29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICBhbmdsZVNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIH1cbiAgICAgIHZhciBkaXZXaWR0aCA9XG4gICAgICAgIChzdHlsZS52ZXJ0aWNhbCA/IGdlb20uaGVpZ2h0IDogZ2VvbS53aWR0aCkgKiB0YXNrLl92aWV3cG9ydC5zY2FsZTtcbiAgICAgIHZhciBkaXZIZWlnaHQgPSBmb250SGVpZ2h0O1xuXG4gICAgICB2YXIgbSwgYjtcbiAgICAgIGlmIChhbmdsZSAhPT0gMCkge1xuICAgICAgICBtID0gW2FuZ2xlQ29zLCBhbmdsZVNpbiwgLWFuZ2xlU2luLCBhbmdsZUNvcywgbGVmdCwgdG9wXTtcbiAgICAgICAgYiA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHRdLCBtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGIgPSBbbGVmdCwgdG9wLCBsZWZ0ICsgZGl2V2lkdGgsIHRvcCArIGRpdkhlaWdodF07XG4gICAgICB9XG5cbiAgICAgIHRhc2suX2JvdW5kcy5wdXNoKHtcbiAgICAgICAgbGVmdDogYlswXSxcbiAgICAgICAgdG9wOiBiWzFdLFxuICAgICAgICByaWdodDogYlsyXSxcbiAgICAgICAgYm90dG9tOiBiWzNdLFxuICAgICAgICBkaXY6IHRleHREaXYsXG4gICAgICAgIHNpemU6IFtkaXZXaWR0aCwgZGl2SGVpZ2h0XSxcbiAgICAgICAgbSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlcih0YXNrKSB7XG4gICAgaWYgKHRhc2suX2NhbmNlbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0ZXh0RGl2cyA9IHRhc2suX3RleHREaXZzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gdGFzay5fY2FwYWJpbGl0eTtcbiAgICB2YXIgdGV4dERpdnNMZW5ndGggPSB0ZXh0RGl2cy5sZW5ndGg7XG5cbiAgICAvLyBObyBwb2ludCBpbiByZW5kZXJpbmcgbWFueSBkaXZzIGFzIGl0IHdvdWxkIG1ha2UgdGhlIGJyb3dzZXJcbiAgICAvLyB1bnVzYWJsZSBldmVuIGFmdGVyIHRoZSBkaXZzIGFyZSByZW5kZXJlZC5cbiAgICBpZiAodGV4dERpdnNMZW5ndGggPiBNQVhfVEVYVF9ESVZTX1RPX1JFTkRFUikge1xuICAgICAgdGFzay5fcmVuZGVyaW5nRG9uZSA9IHRydWU7XG4gICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRhc2suX3RleHRDb250ZW50U3RyZWFtKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHREaXZzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGFzay5fbGF5b3V0VGV4dCh0ZXh0RGl2c1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFzay5fcmVuZGVyaW5nRG9uZSA9IHRydWU7XG4gICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kUG9zaXRpdmVNaW4odHMsIG9mZnNldCwgY291bnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHQgPSB0c1tvZmZzZXQrK107XG4gICAgICBpZiAodCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gTWF0aC5taW4odCwgcmVzdWx0KSA6IHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBleHBhbmQodGFzaykge1xuICAgIHZhciBib3VuZHMgPSB0YXNrLl9ib3VuZHM7XG4gICAgdmFyIHZpZXdwb3J0ID0gdGFzay5fdmlld3BvcnQ7XG5cbiAgICB2YXIgZXhwYW5kZWQgPSBleHBhbmRCb3VuZHModmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCwgYm91bmRzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGFuZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGl2ID0gYm91bmRzW2ldLmRpdjtcbiAgICAgIHZhciBkaXZQcm9wZXJ0aWVzID0gdGFzay5fdGV4dERpdlByb3BlcnRpZXMuZ2V0KGRpdik7XG4gICAgICBpZiAoZGl2UHJvcGVydGllcy5hbmdsZSA9PT0gMCkge1xuICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdMZWZ0ID0gYm91bmRzW2ldLmxlZnQgLSBleHBhbmRlZFtpXS5sZWZ0O1xuICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdUb3AgPSBib3VuZHNbaV0udG9wIC0gZXhwYW5kZWRbaV0udG9wO1xuICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdSaWdodCA9IGV4cGFuZGVkW2ldLnJpZ2h0IC0gYm91bmRzW2ldLnJpZ2h0O1xuICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdCb3R0b20gPSBleHBhbmRlZFtpXS5ib3R0b20gLSBib3VuZHNbaV0uYm90dG9tO1xuICAgICAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQoZGl2LCBkaXZQcm9wZXJ0aWVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBCb3ggaXMgcm90YXRlZCAtLSB0cnlpbmcgdG8gZmluZCBwYWRkaW5nIHNvIHJvdGF0ZWQgZGl2IHdpbGwgbm90XG4gICAgICAvLyBleGNlZWQgaXRzIGV4cGFuZGVkIGJvdW5kcy5cbiAgICAgIHZhciBlID0gZXhwYW5kZWRbaV0sXG4gICAgICAgIGIgPSBib3VuZHNbaV07XG4gICAgICB2YXIgbSA9IGIubSxcbiAgICAgICAgYyA9IG1bMF0sXG4gICAgICAgIHMgPSBtWzFdO1xuICAgICAgLy8gRmluZGluZyBpbnRlcnNlY3Rpb25zIHdpdGggZXhwYW5kZWQgYm94LlxuICAgICAgdmFyIHBvaW50cyA9IFtbMCwgMF0sIFswLCBiLnNpemVbMV1dLCBbYi5zaXplWzBdLCAwXSwgYi5zaXplXTtcbiAgICAgIHZhciB0cyA9IG5ldyBGbG9hdDY0QXJyYXkoNjQpO1xuICAgICAgcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHAsIGopIHtcbiAgICAgICAgdmFyIHQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHAsIG0pO1xuICAgICAgICB0c1tqICsgMF0gPSBjICYmIChlLmxlZnQgLSB0WzBdKSAvIGM7XG4gICAgICAgIHRzW2ogKyA0XSA9IHMgJiYgKGUudG9wIC0gdFsxXSkgLyBzO1xuICAgICAgICB0c1tqICsgOF0gPSBjICYmIChlLnJpZ2h0IC0gdFswXSkgLyBjO1xuICAgICAgICB0c1tqICsgMTJdID0gcyAmJiAoZS5ib3R0b20gLSB0WzFdKSAvIHM7XG5cbiAgICAgICAgdHNbaiArIDE2XSA9IHMgJiYgKGUubGVmdCAtIHRbMF0pIC8gLXM7XG4gICAgICAgIHRzW2ogKyAyMF0gPSBjICYmIChlLnRvcCAtIHRbMV0pIC8gYztcbiAgICAgICAgdHNbaiArIDI0XSA9IHMgJiYgKGUucmlnaHQgLSB0WzBdKSAvIC1zO1xuICAgICAgICB0c1tqICsgMjhdID0gYyAmJiAoZS5ib3R0b20gLSB0WzFdKSAvIGM7XG5cbiAgICAgICAgdHNbaiArIDMyXSA9IGMgJiYgKGUubGVmdCAtIHRbMF0pIC8gLWM7XG4gICAgICAgIHRzW2ogKyAzNl0gPSBzICYmIChlLnRvcCAtIHRbMV0pIC8gLXM7XG4gICAgICAgIHRzW2ogKyA0MF0gPSBjICYmIChlLnJpZ2h0IC0gdFswXSkgLyAtYztcbiAgICAgICAgdHNbaiArIDQ0XSA9IHMgJiYgKGUuYm90dG9tIC0gdFsxXSkgLyAtcztcblxuICAgICAgICB0c1tqICsgNDhdID0gcyAmJiAoZS5sZWZ0IC0gdFswXSkgLyBzO1xuICAgICAgICB0c1tqICsgNTJdID0gYyAmJiAoZS50b3AgLSB0WzFdKSAvIC1jO1xuICAgICAgICB0c1tqICsgNTZdID0gcyAmJiAoZS5yaWdodCAtIHRbMF0pIC8gcztcbiAgICAgICAgdHNbaiArIDYwXSA9IGMgJiYgKGUuYm90dG9tIC0gdFsxXSkgLyAtYztcbiAgICAgIH0pO1xuICAgICAgLy8gTm90IGJhc2VkIG9uIG1hdGgsIGJ1dCB0byBzaW1wbGlmeSBjYWxjdWxhdGlvbnMsIHVzaW5nIGNvcyBhbmQgc2luXG4gICAgICAvLyBhYnNvbHV0ZSB2YWx1ZXMgdG8gbm90IGV4Y2VlZCB0aGUgYm94IChpdCBjYW4gYnV0IGluc2lnbmlmaWNhbnRseSkuXG4gICAgICB2YXIgYm94U2NhbGUgPSAxICsgTWF0aC5taW4oTWF0aC5hYnMoYyksIE1hdGguYWJzKHMpKTtcbiAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ0xlZnQgPSBmaW5kUG9zaXRpdmVNaW4odHMsIDMyLCAxNikgLyBib3hTY2FsZTtcbiAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ1RvcCA9IGZpbmRQb3NpdGl2ZU1pbih0cywgNDgsIDE2KSAvIGJveFNjYWxlO1xuICAgICAgZGl2UHJvcGVydGllcy5wYWRkaW5nUmlnaHQgPSBmaW5kUG9zaXRpdmVNaW4odHMsIDAsIDE2KSAvIGJveFNjYWxlO1xuICAgICAgZGl2UHJvcGVydGllcy5wYWRkaW5nQm90dG9tID0gZmluZFBvc2l0aXZlTWluKHRzLCAxNiwgMTYpIC8gYm94U2NhbGU7XG4gICAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQoZGl2LCBkaXZQcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBleHBhbmRCb3VuZHMod2lkdGgsIGhlaWdodCwgYm94ZXMpIHtcbiAgICB2YXIgYm91bmRzID0gYm94ZXMubWFwKGZ1bmN0aW9uIChib3gsIGkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgxOiBib3gubGVmdCxcbiAgICAgICAgeTE6IGJveC50b3AsXG4gICAgICAgIHgyOiBib3gucmlnaHQsXG4gICAgICAgIHkyOiBib3guYm90dG9tLFxuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgeDFOZXc6IHVuZGVmaW5lZCxcbiAgICAgICAgeDJOZXc6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZXhwYW5kQm91bmRzTFRSKHdpZHRoLCBib3VuZHMpO1xuICAgIHZhciBleHBhbmRlZCA9IG5ldyBBcnJheShib3hlcy5sZW5ndGgpO1xuICAgIGJvdW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7XG4gICAgICB2YXIgaSA9IGIuaW5kZXg7XG4gICAgICBleHBhbmRlZFtpXSA9IHtcbiAgICAgICAgbGVmdDogYi54MU5ldyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICByaWdodDogYi54Mk5ldyxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFJvdGF0aW5nIG9uIDkwIGRlZ3JlZXMgYW5kIGV4dGVuZGluZyBleHRlbmRlZCBib3hlcy4gUmV1c2luZyB0aGUgYm91bmRzXG4gICAgLy8gYXJyYXkgYW5kIG9iamVjdHMuXG4gICAgYm94ZXMubWFwKGZ1bmN0aW9uIChib3gsIGkpIHtcbiAgICAgIHZhciBlID0gZXhwYW5kZWRbaV0sXG4gICAgICAgIGIgPSBib3VuZHNbaV07XG4gICAgICBiLngxID0gYm94LnRvcDtcbiAgICAgIGIueTEgPSB3aWR0aCAtIGUucmlnaHQ7XG4gICAgICBiLngyID0gYm94LmJvdHRvbTtcbiAgICAgIGIueTIgPSB3aWR0aCAtIGUubGVmdDtcbiAgICAgIGIuaW5kZXggPSBpO1xuICAgICAgYi54MU5ldyA9IHVuZGVmaW5lZDtcbiAgICAgIGIueDJOZXcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgZXhwYW5kQm91bmRzTFRSKGhlaWdodCwgYm91bmRzKTtcblxuICAgIGJvdW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7XG4gICAgICB2YXIgaSA9IGIuaW5kZXg7XG4gICAgICBleHBhbmRlZFtpXS50b3AgPSBiLngxTmV3O1xuICAgICAgZXhwYW5kZWRbaV0uYm90dG9tID0gYi54Mk5ldztcbiAgICB9KTtcbiAgICByZXR1cm4gZXhwYW5kZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBleHBhbmRCb3VuZHNMVFIod2lkdGgsIGJvdW5kcykge1xuICAgIC8vIFNvcnRpbmcgYnkgeDEgY29vcmRpbmF0ZSBhbmQgd2FsayBieSB0aGUgYm91bmRzIGluIHRoZSBzYW1lIG9yZGVyLlxuICAgIGJvdW5kcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS54MSAtIGIueDEgfHwgYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgfSk7XG5cbiAgICAvLyBGaXJzdCB3ZSBzZWUgb24gdGhlIGhvcml6b24gaXMgYSBmYWtlIGJvdW5kYXJ5LlxuICAgIHZhciBmYWtlQm91bmRhcnkgPSB7XG4gICAgICB4MTogLUluZmluaXR5LFxuICAgICAgeTE6IC1JbmZpbml0eSxcbiAgICAgIHgyOiAwLFxuICAgICAgeTI6IEluZmluaXR5LFxuICAgICAgaW5kZXg6IC0xLFxuICAgICAgeDFOZXc6IDAsXG4gICAgICB4Mk5ldzogMCxcbiAgICB9O1xuICAgIHZhciBob3Jpem9uID0gW1xuICAgICAge1xuICAgICAgICBzdGFydDogLUluZmluaXR5LFxuICAgICAgICBlbmQ6IEluZmluaXR5LFxuICAgICAgICBib3VuZGFyeTogZmFrZUJvdW5kYXJ5LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgYm91bmRzLmZvckVhY2goZnVuY3Rpb24gKGJvdW5kYXJ5KSB7XG4gICAgICAvLyBTZWFyY2hpbmcgZm9yIHRoZSBhZmZlY3RlZCBwYXJ0IG9mIGhvcml6b24uXG4gICAgICAvLyBUT0RPIHJlZC1ibGFjayB0cmVlIG9yIHNpbXBsZSBiaW5hcnkgc2VhcmNoXG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB3aGlsZSAoaSA8IGhvcml6b24ubGVuZ3RoICYmIGhvcml6b25baV0uZW5kIDw9IGJvdW5kYXJ5LnkxKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICAgIHZhciBqID0gaG9yaXpvbi5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGogPj0gMCAmJiBob3Jpem9uW2pdLnN0YXJ0ID49IGJvdW5kYXJ5LnkyKSB7XG4gICAgICAgIGotLTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhvcml6b25QYXJ0LCBhZmZlY3RlZEJvdW5kYXJ5O1xuICAgICAgdmFyIHEsXG4gICAgICAgIGssXG4gICAgICAgIG1heFhOZXcgPSAtSW5maW5pdHk7XG4gICAgICBmb3IgKHEgPSBpOyBxIDw9IGo7IHErKykge1xuICAgICAgICBob3Jpem9uUGFydCA9IGhvcml6b25bcV07XG4gICAgICAgIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTtcbiAgICAgICAgdmFyIHhOZXc7XG4gICAgICAgIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyID4gYm91bmRhcnkueDEpIHtcbiAgICAgICAgICAvLyBJbiB0aGUgbWlkZGxlIG9mIHRoZSBwcmV2aW91cyBlbGVtZW50LCBuZXcgeCBzaGFsbCBiZSBhdCB0aGVcbiAgICAgICAgICAvLyBib3VuZGFyeSBzdGFydC4gRXh0ZW5kaW5nIGlmIGZ1cnRoZXIgaWYgdGhlIGFmZmVjdGVkIGJvdW5kYXJ5XG4gICAgICAgICAgLy8gcGxhY2VkIG9uIHRvcCBvZiB0aGUgY3VycmVudCBvbmUuXG4gICAgICAgICAgeE5ldyA9XG4gICAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LmluZGV4ID4gYm91bmRhcnkuaW5kZXhcbiAgICAgICAgICAgICAgPyBhZmZlY3RlZEJvdW5kYXJ5LngxTmV3XG4gICAgICAgICAgICAgIDogYm91bmRhcnkueDE7XG4gICAgICAgIH0gZWxzZSBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBzb21lIHNwYWNlIGluIGJldHdlZW4sIG5ldyB4IGluIG1pZGRsZSB3aWxsIGJlIGEgZmFpclxuICAgICAgICAgIC8vIGNob2ljZS5cbiAgICAgICAgICB4TmV3ID0gKGFmZmVjdGVkQm91bmRhcnkueDIgKyBib3VuZGFyeS54MSkgLyAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFmZmVjdGVkIGJvdW5kYXJ5IGhhcyB4Mm5ldyBzZXQsIHVzaW5nIGl0IGFzIG5ldyB4LlxuICAgICAgICAgIHhOZXcgPSBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3O1xuICAgICAgICB9XG4gICAgICAgIGlmICh4TmV3ID4gbWF4WE5ldykge1xuICAgICAgICAgIG1heFhOZXcgPSB4TmV3O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBuZXcgeDEgZm9yIGN1cnJlbnQgYm91bmRhcnkuXG4gICAgICBib3VuZGFyeS54MU5ldyA9IG1heFhOZXc7XG5cbiAgICAgIC8vIEFkanVzdHMgbmV3IHgyIGZvciB0aGUgYWZmZWN0ZWQgYm91bmRhcmllcy5cbiAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7XG4gICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTtcbiAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5O1xuICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gV2FzIG5vdCBzZXQgeWV0LCBjaG9vc2luZyBuZXcgeCBpZiBwb3NzaWJsZS5cbiAgICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54MiA+IGJvdW5kYXJ5LngxKSB7XG4gICAgICAgICAgICAvLyBDdXJyZW50IGFuZCBhZmZlY3RlZCBib3VuZGFyaWVzIGludGVyc2VjdC4gSWYgYWZmZWN0ZWQgYm91bmRhcnlcbiAgICAgICAgICAgIC8vIGlzIHBsYWNlZCBvbiB0b3Agb2YgdGhlIGN1cnJlbnQsIHNocmlua2luZyB0aGUgYWZmZWN0ZWQuXG4gICAgICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS5pbmRleCA+IGJvdW5kYXJ5LmluZGV4KSB7XG4gICAgICAgICAgICAgIGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPSBhZmZlY3RlZEJvdW5kYXJ5LngyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gbWF4WE5ldztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA+IG1heFhOZXcpIHtcbiAgICAgICAgICAvLyBBZmZlY3RlZCBib3VuZGFyeSBpcyB0b3VjaGluZyBuZXcgeCwgcHVzaGluZyBpdCBiYWNrLlxuICAgICAgICAgIGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPSBNYXRoLm1heChtYXhYTmV3LCBhZmZlY3RlZEJvdW5kYXJ5LngyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGaXhpbmcgdGhlIGhvcml6b24uXG4gICAgICB2YXIgY2hhbmdlZEhvcml6b24gPSBbXSxcbiAgICAgICAgbGFzdEJvdW5kYXJ5ID0gbnVsbDtcbiAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7XG4gICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTtcbiAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5O1xuICAgICAgICAvLyBDaGVja2luZyB3aGljaCBib3VuZGFyeSB3aWxsIGJlIHZpc2libGUuXG4gICAgICAgIHZhciB1c2VCb3VuZGFyeSA9XG4gICAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54MiA+IGJvdW5kYXJ5LngyID8gYWZmZWN0ZWRCb3VuZGFyeSA6IGJvdW5kYXJ5O1xuICAgICAgICBpZiAobGFzdEJvdW5kYXJ5ID09PSB1c2VCb3VuZGFyeSkge1xuICAgICAgICAgIC8vIE1lcmdpbmcgd2l0aCBwcmV2aW91cy5cbiAgICAgICAgICBjaGFuZ2VkSG9yaXpvbltjaGFuZ2VkSG9yaXpvbi5sZW5ndGggLSAxXS5lbmQgPSBob3Jpem9uUGFydC5lbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbmdlZEhvcml6b24ucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogaG9yaXpvblBhcnQuc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGhvcml6b25QYXJ0LmVuZCxcbiAgICAgICAgICAgIGJvdW5kYXJ5OiB1c2VCb3VuZGFyeSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsYXN0Qm91bmRhcnkgPSB1c2VCb3VuZGFyeTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGhvcml6b25baV0uc3RhcnQgPCBib3VuZGFyeS55MSkge1xuICAgICAgICBjaGFuZ2VkSG9yaXpvblswXS5zdGFydCA9IGJvdW5kYXJ5LnkxO1xuICAgICAgICBjaGFuZ2VkSG9yaXpvbi51bnNoaWZ0KHtcbiAgICAgICAgICBzdGFydDogaG9yaXpvbltpXS5zdGFydCxcbiAgICAgICAgICBlbmQ6IGJvdW5kYXJ5LnkxLFxuICAgICAgICAgIGJvdW5kYXJ5OiBob3Jpem9uW2ldLmJvdW5kYXJ5LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChib3VuZGFyeS55MiA8IGhvcml6b25bal0uZW5kKSB7XG4gICAgICAgIGNoYW5nZWRIb3Jpem9uW2NoYW5nZWRIb3Jpem9uLmxlbmd0aCAtIDFdLmVuZCA9IGJvdW5kYXJ5LnkyO1xuICAgICAgICBjaGFuZ2VkSG9yaXpvbi5wdXNoKHtcbiAgICAgICAgICBzdGFydDogYm91bmRhcnkueTIsXG4gICAgICAgICAgZW5kOiBob3Jpem9uW2pdLmVuZCxcbiAgICAgICAgICBib3VuZGFyeTogaG9yaXpvbltqXS5ib3VuZGFyeSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB4MiBuZXcgb2YgYm91bmRhcnkgdGhhdCBpcyBubyBsb25nZXIgdmlzaWJsZSAoc2VlIG92ZXJsYXBwaW5nIGNhc2VcbiAgICAgIC8vIGFib3ZlKS5cbiAgICAgIC8vIFRPRE8gbW9yZSBlZmZpY2llbnQsIGUuZy4gdmlhIHJlZmVyZW5jZSBjb3VudGluZy5cbiAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7XG4gICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTtcbiAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5O1xuICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVzZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBrID0gaSAtIDE7XG4gICAgICAgICAgIXVzZWQgJiYgayA+PSAwICYmIGhvcml6b25ba10uc3RhcnQgPj0gYWZmZWN0ZWRCb3VuZGFyeS55MTtcbiAgICAgICAgICBrLS1cbiAgICAgICAgKSB7XG4gICAgICAgICAgdXNlZCA9IGhvcml6b25ba10uYm91bmRhcnkgPT09IGFmZmVjdGVkQm91bmRhcnk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChcbiAgICAgICAgICBrID0gaiArIDE7XG4gICAgICAgICAgIXVzZWQgJiYgayA8IGhvcml6b24ubGVuZ3RoICYmIGhvcml6b25ba10uZW5kIDw9IGFmZmVjdGVkQm91bmRhcnkueTI7XG4gICAgICAgICAgaysrXG4gICAgICAgICkge1xuICAgICAgICAgIHVzZWQgPSBob3Jpem9uW2tdLmJvdW5kYXJ5ID09PSBhZmZlY3RlZEJvdW5kYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoayA9IDA7ICF1c2VkICYmIGsgPCBjaGFuZ2VkSG9yaXpvbi5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIHVzZWQgPSBjaGFuZ2VkSG9yaXpvbltrXS5ib3VuZGFyeSA9PT0gYWZmZWN0ZWRCb3VuZGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVzZWQpIHtcbiAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gbWF4WE5ldztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KFxuICAgICAgICBob3Jpem9uLFxuICAgICAgICBbaSwgaiAtIGkgKyAxXS5jb25jYXQoY2hhbmdlZEhvcml6b24pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0IG5ldyB4MiBmb3IgYWxsIHVuc2V0IGJvdW5kYXJpZXMuXG4gICAgaG9yaXpvbi5mb3JFYWNoKGZ1bmN0aW9uIChob3Jpem9uUGFydCkge1xuICAgICAgdmFyIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTtcbiAgICAgIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IE1hdGgubWF4KHdpZHRoLCBhZmZlY3RlZEJvdW5kYXJ5LngyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXh0IGxheWVyIHJlbmRlcmluZyB0YXNrLlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRDb250ZW50fSB0ZXh0Q29udGVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJcbiAgICogQHBhcmFtIHtQYWdlVmlld3BvcnR9IHZpZXdwb3J0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHRleHREaXZzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5oYW5jZVRleHRTZWxlY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGZ1bmN0aW9uIFRleHRMYXllclJlbmRlclRhc2soe1xuICAgIHRleHRDb250ZW50LFxuICAgIHRleHRDb250ZW50U3RyZWFtLFxuICAgIGNvbnRhaW5lcixcbiAgICB2aWV3cG9ydCxcbiAgICB0ZXh0RGl2cyxcbiAgICB0ZXh0Q29udGVudEl0ZW1zU3RyLFxuICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uLFxuICB9KSB7XG4gICAgdGhpcy5fdGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcbiAgICB0aGlzLl90ZXh0Q29udGVudFN0cmVhbSA9IHRleHRDb250ZW50U3RyZWFtO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLl9kb2N1bWVudCA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50O1xuICAgIHRoaXMuX3ZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgdGhpcy5fdGV4dERpdnMgPSB0ZXh0RGl2cyB8fCBbXTtcbiAgICB0aGlzLl90ZXh0Q29udGVudEl0ZW1zU3RyID0gdGV4dENvbnRlbnRJdGVtc1N0ciB8fCBbXTtcbiAgICB0aGlzLl9lbmhhbmNlVGV4dFNlbGVjdGlvbiA9ICEhZW5oYW5jZVRleHRTZWxlY3Rpb247XG4gICAgdGhpcy5fZm9udEluc3BlY3RvckVuYWJsZWQgPSAhIShcbiAgICAgIGdsb2JhbFRoaXMuRm9udEluc3BlY3RvciAmJiBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IuZW5hYmxlZFxuICAgICk7XG5cbiAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udFNpemUgPSBudWxsO1xuICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSA9IG51bGw7XG4gICAgdGhpcy5fbGF5b3V0VGV4dEN0eCA9IG51bGw7XG4gICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMuX3JlbmRlcmluZ0RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9jYW5jZWxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX3JlbmRlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9ib3VuZHMgPSBbXTtcblxuICAgIC8vIEFsd2F5cyBjbGVhbi11cCB0aGUgdGVtcG9yYXJ5IGNhbnZhcyBvbmNlIHJlbmRlcmluZyBpcyBubyBsb25nZXIgcGVuZGluZy5cbiAgICB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2VcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dFRleHRDdHgpIHtcbiAgICAgICAgICAvLyBaZXJvaW5nIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGNhdXNlIEZpcmVmb3ggdG8gcmVsZWFzZSBncmFwaGljc1xuICAgICAgICAgIC8vIHJlc291cmNlcyBpbW1lZGlhdGVseSwgd2hpY2ggY2FuIGdyZWF0bHkgcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbi5cbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0Q3R4LmNhbnZhcy53aWR0aCA9IDA7XG4gICAgICAgICAgdGhpcy5fbGF5b3V0VGV4dEN0eC5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0Q3R4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8qIEF2b2lkIFwiVW5jYXVnaHQgcHJvbWlzZVwiIG1lc3NhZ2VzIGluIHRoZSBjb25zb2xlLiAqL1xuICAgICAgfSk7XG4gIH1cbiAgVGV4dExheWVyUmVuZGVyVGFzay5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH0sXG5cbiAgICBjYW5jZWw6IGZ1bmN0aW9uIFRleHRMYXllcl9jYW5jZWwoKSB7XG4gICAgICB0aGlzLl9jYW5jZWxlZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5fcmVhZGVyKSB7XG4gICAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwobmV3IEFib3J0RXhjZXB0aW9uKFwiVGV4dExheWVyIHRhc2sgY2FuY2VsbGVkLlwiKSk7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fcmVuZGVyVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3JlbmRlclRpbWVyKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKFwiVGV4dExheWVyIHRhc2sgY2FuY2VsbGVkLlwiKSk7XG4gICAgfSxcblxuICAgIF9wcm9jZXNzSXRlbXMoaXRlbXMsIHN0eWxlQ2FjaGUpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0aGlzLl90ZXh0Q29udGVudEl0ZW1zU3RyLnB1c2goaXRlbXNbaV0uc3RyKTtcbiAgICAgICAgYXBwZW5kVGV4dCh0aGlzLCBpdGVtc1tpXSwgc3R5bGVDYWNoZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9sYXlvdXRUZXh0KHRleHREaXYpIHtcbiAgICAgIGNvbnN0IHRleHREaXZQcm9wZXJ0aWVzID0gdGhpcy5fdGV4dERpdlByb3BlcnRpZXMuZ2V0KHRleHREaXYpO1xuICAgICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmlzV2hpdGVzcGFjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCB0cmFuc2Zvcm0gPSBcIlwiO1xuICAgICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IHsgZm9udFNpemUsIGZvbnRGYW1pbHkgfSA9IHRleHREaXYuc3R5bGU7XG5cbiAgICAgICAgLy8gT25seSBidWlsZCBmb250IHN0cmluZyBhbmQgc2V0IHRvIGNvbnRleHQgaWYgZGlmZmVyZW50IGZyb20gbGFzdC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZvbnRTaXplICE9PSB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRTaXplIHx8XG4gICAgICAgICAgZm9udEZhbWlseSAhPT0gdGhpcy5fbGF5b3V0VGV4dExhc3RGb250RmFtaWx5XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuX2xheW91dFRleHRDdHguZm9udCA9IGAke2ZvbnRTaXplfSAke2ZvbnRGYW1pbHl9YDtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgICAgdGhpcy5fbGF5b3V0VGV4dExhc3RGb250RmFtaWx5ID0gZm9udEZhbWlseTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG1lYXN1cmUgdGhlIHdpZHRoIGZvciBtdWx0aS1jaGFyIHRleHQgZGl2cywgc2VlIGBhcHBlbmRUZXh0YC5cbiAgICAgICAgY29uc3QgeyB3aWR0aCB9ID0gdGhpcy5fbGF5b3V0VGV4dEN0eC5tZWFzdXJlVGV4dCh0ZXh0RGl2LnRleHRDb250ZW50KTtcblxuICAgICAgICBpZiAod2lkdGggPiAwKSB7XG4gICAgICAgICAgdGV4dERpdlByb3BlcnRpZXMuc2NhbGUgPSB0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCAvIHdpZHRoO1xuICAgICAgICAgIHRyYW5zZm9ybSA9IGBzY2FsZVgoJHt0ZXh0RGl2UHJvcGVydGllcy5zY2FsZX0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmFuZ2xlICE9PSAwKSB7XG4gICAgICAgIHRyYW5zZm9ybSA9IGByb3RhdGUoJHt0ZXh0RGl2UHJvcGVydGllcy5hbmdsZX1kZWcpICR7dHJhbnNmb3JtfWA7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNmb3JtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGV4dERpdlByb3BlcnRpZXMub3JpZ2luYWxUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIH1cbiAgICAgICAgdGV4dERpdi5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICB9XG4gICAgICB0aGlzLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpO1xuICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHRleHREaXYpO1xuICAgIH0sXG5cbiAgICBfcmVuZGVyOiBmdW5jdGlvbiBUZXh0TGF5ZXJfcmVuZGVyKHRpbWVvdXQpIHtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgbGV0IHN0eWxlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAvLyBUaGUgdGVtcG9yYXJ5IGNhbnZhcyBpcyB1c2VkIHRvIG1lYXN1cmUgdGV4dCBsZW5ndGggaW4gdGhlIERPTS5cbiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTCB8fCBHRU5FUklDXCIpXG4gICAgICApIHtcbiAgICAgICAgY2FudmFzLm1vek9wYXF1ZSA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9sYXlvdXRUZXh0Q3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiLCB7IGFscGhhOiBmYWxzZSB9KTtcblxuICAgICAgaWYgKHRoaXMuX3RleHRDb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHRleHRJdGVtcyA9IHRoaXMuX3RleHRDb250ZW50Lml0ZW1zO1xuICAgICAgICBjb25zdCB0ZXh0U3R5bGVzID0gdGhpcy5fdGV4dENvbnRlbnQuc3R5bGVzO1xuICAgICAgICB0aGlzLl9wcm9jZXNzSXRlbXModGV4dEl0ZW1zLCB0ZXh0U3R5bGVzKTtcbiAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3RleHRDb250ZW50U3RyZWFtKSB7XG4gICAgICAgIGNvbnN0IHB1bXAgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVhZGVyLnJlYWQoKS50aGVuKCh7IHZhbHVlLCBkb25lIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGVDYWNoZSwgdmFsdWUuc3R5bGVzKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NJdGVtcyh2YWx1ZS5pdGVtcywgc3R5bGVDYWNoZSk7XG4gICAgICAgICAgICBwdW1wKCk7XG4gICAgICAgICAgfSwgY2FwYWJpbGl0eS5yZWplY3QpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX3JlYWRlciA9IHRoaXMuX3RleHRDb250ZW50U3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICBwdW1wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ05laXRoZXIgXCJ0ZXh0Q29udGVudFwiIG5vciBcInRleHRDb250ZW50U3RyZWFtXCInICtcbiAgICAgICAgICAgIFwiIHBhcmFtZXRlcnMgc3BlY2lmaWVkLlwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgc3R5bGVDYWNoZSA9IG51bGw7XG4gICAgICAgIGlmICghdGltZW91dCkge1xuICAgICAgICAgIC8vIFJlbmRlciByaWdodCBhd2F5XG4gICAgICAgICAgcmVuZGVyKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNjaGVkdWxlXG4gICAgICAgICAgdGhpcy5fcmVuZGVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHJlbmRlcih0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpbWVyID0gbnVsbDtcbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcy5fY2FwYWJpbGl0eS5yZWplY3QpO1xuICAgIH0sXG5cbiAgICBleHBhbmRUZXh0RGl2czogZnVuY3Rpb24gVGV4dExheWVyX2V4cGFuZFRleHREaXZzKGV4cGFuZERpdnMpIHtcbiAgICAgIGlmICghdGhpcy5fZW5oYW5jZVRleHRTZWxlY3Rpb24gfHwgIXRoaXMuX3JlbmRlcmluZ0RvbmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2JvdW5kcyAhPT0gbnVsbCkge1xuICAgICAgICBleHBhbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX2JvdW5kcyA9IG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2Zvcm1CdWYgPSBbXSxcbiAgICAgICAgcGFkZGluZ0J1ZiA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLl90ZXh0RGl2cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRpdiA9IHRoaXMuX3RleHREaXZzW2ldO1xuICAgICAgICBjb25zdCBkaXZQcm9wcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldChkaXYpO1xuXG4gICAgICAgIGlmIChkaXZQcm9wcy5pc1doaXRlc3BhY2UpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwYW5kRGl2cykge1xuICAgICAgICAgIHRyYW5zZm9ybUJ1Zi5sZW5ndGggPSAwO1xuICAgICAgICAgIHBhZGRpbmdCdWYubGVuZ3RoID0gMDtcblxuICAgICAgICAgIGlmIChkaXZQcm9wcy5vcmlnaW5hbFRyYW5zZm9ybSkge1xuICAgICAgICAgICAgdHJhbnNmb3JtQnVmLnB1c2goZGl2UHJvcHMub3JpZ2luYWxUcmFuc2Zvcm0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGl2UHJvcHMucGFkZGluZ1RvcCA+IDApIHtcbiAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaChgJHtkaXZQcm9wcy5wYWRkaW5nVG9wfXB4YCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm1CdWYucHVzaChgdHJhbnNsYXRlWSgkey1kaXZQcm9wcy5wYWRkaW5nVG9wfXB4KWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkaXZQcm9wcy5wYWRkaW5nUmlnaHQgPiAwKSB7XG4gICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goYCR7ZGl2UHJvcHMucGFkZGluZ1JpZ2h0IC8gZGl2UHJvcHMuc2NhbGV9cHhgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGl2UHJvcHMucGFkZGluZ0JvdHRvbSA+IDApIHtcbiAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaChgJHtkaXZQcm9wcy5wYWRkaW5nQm90dG9tfXB4YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdMZWZ0ID4gMCkge1xuICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKGAke2RpdlByb3BzLnBhZGRpbmdMZWZ0IC8gZGl2UHJvcHMuc2NhbGV9cHhgKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybUJ1Zi5wdXNoKFxuICAgICAgICAgICAgICBgdHJhbnNsYXRlWCgkey1kaXZQcm9wcy5wYWRkaW5nTGVmdCAvIGRpdlByb3BzLnNjYWxlfXB4KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaCgwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaXYuc3R5bGUucGFkZGluZyA9IHBhZGRpbmdCdWYuam9pbihcIiBcIik7XG4gICAgICAgICAgaWYgKHRyYW5zZm9ybUJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpdi5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1CdWYuam9pbihcIiBcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpdi5zdHlsZS5wYWRkaW5nID0gbnVsbDtcbiAgICAgICAgICBkaXYuc3R5bGUudHJhbnNmb3JtID0gZGl2UHJvcHMub3JpZ2luYWxUcmFuc2Zvcm07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKHJlbmRlclBhcmFtZXRlcnMpIHtcbiAgICB2YXIgdGFzayA9IG5ldyBUZXh0TGF5ZXJSZW5kZXJUYXNrKHtcbiAgICAgIHRleHRDb250ZW50OiByZW5kZXJQYXJhbWV0ZXJzLnRleHRDb250ZW50LFxuICAgICAgdGV4dENvbnRlbnRTdHJlYW06IHJlbmRlclBhcmFtZXRlcnMudGV4dENvbnRlbnRTdHJlYW0sXG4gICAgICBjb250YWluZXI6IHJlbmRlclBhcmFtZXRlcnMuY29udGFpbmVyLFxuICAgICAgdmlld3BvcnQ6IHJlbmRlclBhcmFtZXRlcnMudmlld3BvcnQsXG4gICAgICB0ZXh0RGl2czogcmVuZGVyUGFyYW1ldGVycy50ZXh0RGl2cyxcbiAgICAgIHRleHRDb250ZW50SXRlbXNTdHI6IHJlbmRlclBhcmFtZXRlcnMudGV4dENvbnRlbnRJdGVtc1N0cixcbiAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiByZW5kZXJQYXJhbWV0ZXJzLmVuaGFuY2VUZXh0U2VsZWN0aW9uLFxuICAgIH0pO1xuICAgIHRhc2suX3JlbmRlcihyZW5kZXJQYXJhbWV0ZXJzLnRpbWVvdXQpO1xuICAgIHJldHVybiB0YXNrO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclRleHRMYXllcjtcbn0pKCk7XG5cbmV4cG9ydCB7IHJlbmRlclRleHRMYXllciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWxzIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVPYmplY3RVUkwsXG4gIEZPTlRfSURFTlRJVFlfTUFUUklYLFxuICBJREVOVElUWV9NQVRSSVgsXG4gIEltYWdlS2luZCxcbiAgaXNOdW0sXG4gIE9QUyxcbiAgVGV4dFJlbmRlcmluZ01vZGUsXG4gIFV0aWwsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgRE9NU1ZHRmFjdG9yeSB9IGZyb20gXCIuL2Rpc3BsYXlfdXRpbHMuanNcIjtcbmltcG9ydCB7IGlzTm9kZUpTIH0gZnJvbSBcIi4uL3NoYXJlZC9pc19ub2RlLmpzXCI7XG5cbi8qKiBAdHlwZSB7YW55fSAqL1xubGV0IFNWR0dyYXBoaWNzID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQ6IFNWR0dyYXBoaWNzXCIpO1xufTtcblxuaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkge1xuICBjb25zdCBTVkdfREVGQVVMVFMgPSB7XG4gICAgZm9udFN0eWxlOiBcIm5vcm1hbFwiLFxuICAgIGZvbnRXZWlnaHQ6IFwibm9ybWFsXCIsXG4gICAgZmlsbENvbG9yOiBcIiMwMDAwMDBcIixcbiAgfTtcbiAgY29uc3QgWE1MX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIjtcbiAgY29uc3QgWExJTktfTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIjtcbiAgY29uc3QgTElORV9DQVBfU1RZTEVTID0gW1wiYnV0dFwiLCBcInJvdW5kXCIsIFwic3F1YXJlXCJdO1xuICBjb25zdCBMSU5FX0pPSU5fU1RZTEVTID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdO1xuXG4gIGNvbnN0IGNvbnZlcnRJbWdEYXRhVG9QbmcgPSAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IFBOR19IRUFERVIgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAweDg5LFxuICAgICAgMHg1MCxcbiAgICAgIDB4NGUsXG4gICAgICAweDQ3LFxuICAgICAgMHgwZCxcbiAgICAgIDB4MGEsXG4gICAgICAweDFhLFxuICAgICAgMHgwYSxcbiAgICBdKTtcbiAgICBjb25zdCBDSFVOS19XUkFQUEVSX1NJWkUgPSAxMjtcblxuICAgIGNvbnN0IGNyY1RhYmxlID0gbmV3IEludDMyQXJyYXkoMjU2KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICBsZXQgYyA9IGk7XG4gICAgICBmb3IgKGxldCBoID0gMDsgaCA8IDg7IGgrKykge1xuICAgICAgICBpZiAoYyAmIDEpIHtcbiAgICAgICAgICBjID0gMHhlZGI4ODMyMCBeICgoYyA+PiAxKSAmIDB4N2ZmZmZmZmYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGMgPSAoYyA+PiAxKSAmIDB4N2ZmZmZmZmY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNyY1RhYmxlW2ldID0gYztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmMzMihkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgICBsZXQgY3JjID0gLTE7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICBjb25zdCBhID0gKGNyYyBeIGRhdGFbaV0pICYgMHhmZjtcbiAgICAgICAgY29uc3QgYiA9IGNyY1RhYmxlW2FdO1xuICAgICAgICBjcmMgPSAoY3JjID4+PiA4KSBeIGI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JjIF4gLTE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd3JpdGVQbmdDaHVuayh0eXBlLCBib2R5LCBkYXRhLCBvZmZzZXQpIHtcbiAgICAgIGxldCBwID0gb2Zmc2V0O1xuICAgICAgY29uc3QgbGVuID0gYm9keS5sZW5ndGg7XG5cbiAgICAgIGRhdGFbcF0gPSAobGVuID4+IDI0KSAmIDB4ZmY7XG4gICAgICBkYXRhW3AgKyAxXSA9IChsZW4gPj4gMTYpICYgMHhmZjtcbiAgICAgIGRhdGFbcCArIDJdID0gKGxlbiA+PiA4KSAmIDB4ZmY7XG4gICAgICBkYXRhW3AgKyAzXSA9IGxlbiAmIDB4ZmY7XG4gICAgICBwICs9IDQ7XG5cbiAgICAgIGRhdGFbcF0gPSB0eXBlLmNoYXJDb2RlQXQoMCkgJiAweGZmO1xuICAgICAgZGF0YVtwICsgMV0gPSB0eXBlLmNoYXJDb2RlQXQoMSkgJiAweGZmO1xuICAgICAgZGF0YVtwICsgMl0gPSB0eXBlLmNoYXJDb2RlQXQoMikgJiAweGZmO1xuICAgICAgZGF0YVtwICsgM10gPSB0eXBlLmNoYXJDb2RlQXQoMykgJiAweGZmO1xuICAgICAgcCArPSA0O1xuXG4gICAgICBkYXRhLnNldChib2R5LCBwKTtcbiAgICAgIHAgKz0gYm9keS5sZW5ndGg7XG5cbiAgICAgIGNvbnN0IGNyYyA9IGNyYzMyKGRhdGEsIG9mZnNldCArIDQsIHApO1xuICAgICAgZGF0YVtwXSA9IChjcmMgPj4gMjQpICYgMHhmZjtcbiAgICAgIGRhdGFbcCArIDFdID0gKGNyYyA+PiAxNikgJiAweGZmO1xuICAgICAgZGF0YVtwICsgMl0gPSAoY3JjID4+IDgpICYgMHhmZjtcbiAgICAgIGRhdGFbcCArIDNdID0gY3JjICYgMHhmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGxlcjMyKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIGxldCBhID0gMTtcbiAgICAgIGxldCBiID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgIGEgPSAoYSArIChkYXRhW2ldICYgMHhmZikpICUgNjU1MjE7XG4gICAgICAgIGIgPSAoYiArIGEpICUgNjU1MjE7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGIgPDwgMTYpIHwgYTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGxpdGVyYWxzIFRoZSBpbnB1dCBkYXRhLlxuICAgICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBUaGUgREVGTEFURS1jb21wcmVzc2VkIGRhdGEgc3RyZWFtIGluIHpsaWIgZm9ybWF0LlxuICAgICAqICAgVGhpcyBpcyB0aGUgcmVxdWlyZWQgZm9ybWF0IGZvciBjb21wcmVzc2VkIHN0cmVhbXMgaW4gdGhlIFBORyBmb3JtYXQ6XG4gICAgICogICBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9zcGVjLzEuMi9QTkctQ29tcHJlc3Npb24uaHRtbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlZmxhdGVTeW5jKGxpdGVyYWxzKSB7XG4gICAgICBpZiAoIWlzTm9kZUpTKSB7XG4gICAgICAgIC8vIHpsaWIgaXMgY2VydGFpbmx5IG5vdCBhdmFpbGFibGUgb3V0c2lkZSBvZiBOb2RlLmpzLiBXZSBjYW4gZWl0aGVyIHVzZVxuICAgICAgICAvLyB0aGUgcGFrbyBsaWJyYXJ5IGZvciBjbGllbnQtc2lkZSBERUZMQVRFIGNvbXByZXNzaW9uLCBvciB1c2UgdGhlXG4gICAgICAgIC8vIGNhbnZhcyBBUEkgb2YgdGhlIGJyb3dzZXIgdG8gb2J0YWluIGEgbW9yZSBvcHRpbWFsIFBORyBmaWxlLlxuICAgICAgICByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQobGl0ZXJhbHMpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBmYXIgZnJvbSBwZXJmZWN0LCBidXQgYWxyZWFkeSB3YXkgYmV0dGVyXG4gICAgICAgIC8vIHRoYW4gbm90IGFwcGx5aW5nIGFueSBjb21wcmVzc2lvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQSBiZXR0ZXIgYWxnb3JpdGhtIHdpbGwgdHJ5IHRvIGNob29zZSBhIGdvb2QgcHJlZGljdG9yL2ZpbHRlciBhbmRcbiAgICAgICAgLy8gdGhlbiBjaG9vc2UgYSBzdWl0YWJsZSB6bGliIGNvbXByZXNzaW9uIHN0cmF0ZWd5IChlLmcuIDMsWl9STEUpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBOb2RlIHYwLjExLjEyIHpsaWIuZGVmbGF0ZVN5bmMgaXMgaW50cm9kdWNlZCAoYW5kIHJldHVybnMgYSBCdWZmZXIpLlxuICAgICAgICAvLyBOb2RlIHYzLjAuMCAgIEJ1ZmZlciBpbmhlcml0cyBmcm9tIFVpbnQ4QXJyYXkuXG4gICAgICAgIC8vIE5vZGUgdjguMC4wICAgemxpYi5kZWZsYXRlU3luYyBhY2NlcHRzIFVpbnQ4QXJyYXkgYXMgaW5wdXQuXG4gICAgICAgIGxldCBpbnB1dDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgIGlmIChwYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUpID49IDgpIHtcbiAgICAgICAgICBpbnB1dCA9IGxpdGVyYWxzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIGlucHV0ID0gQnVmZmVyLmZyb20obGl0ZXJhbHMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKFwiemxpYlwiKS5kZWZsYXRlU3luYyhpbnB1dCwge1xuICAgICAgICAgIGxldmVsOiA5LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG91dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBvdXRwdXQgOiBuZXcgVWludDhBcnJheShvdXRwdXQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwiTm90IGNvbXByZXNzaW5nIFBORyBiZWNhdXNlIHpsaWIuZGVmbGF0ZVN5bmMgaXMgdW5hdmFpbGFibGU6IFwiICsgZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQobGl0ZXJhbHMpO1xuICAgIH1cblxuICAgIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIERFRkxBVEUgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCAwIChaX05PX0NPTVBSRVNTSU9OKS5cbiAgICBmdW5jdGlvbiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZChsaXRlcmFscykge1xuICAgICAgbGV0IGxlbiA9IGxpdGVyYWxzLmxlbmd0aDtcbiAgICAgIGNvbnN0IG1heEJsb2NrTGVuZ3RoID0gMHhmZmZmO1xuXG4gICAgICBjb25zdCBkZWZsYXRlQmxvY2tzID0gTWF0aC5jZWlsKGxlbiAvIG1heEJsb2NrTGVuZ3RoKTtcbiAgICAgIGNvbnN0IGlkYXQgPSBuZXcgVWludDhBcnJheSgyICsgbGVuICsgZGVmbGF0ZUJsb2NrcyAqIDUgKyA0KTtcbiAgICAgIGxldCBwaSA9IDA7XG4gICAgICBpZGF0W3BpKytdID0gMHg3ODsgLy8gY29tcHJlc3Npb24gbWV0aG9kIGFuZCBmbGFnc1xuICAgICAgaWRhdFtwaSsrXSA9IDB4OWM7IC8vIGZsYWdzXG5cbiAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgd2hpbGUgKGxlbiA+IG1heEJsb2NrTGVuZ3RoKSB7XG4gICAgICAgIC8vIHdyaXRpbmcgbm9uLWZpbmFsIERFRkxBVEUgYmxvY2tzIHR5cGUgMCBhbmQgbGVuZ3RoIG9mIDY1NTM1XG4gICAgICAgIGlkYXRbcGkrK10gPSAweDAwO1xuICAgICAgICBpZGF0W3BpKytdID0gMHhmZjtcbiAgICAgICAgaWRhdFtwaSsrXSA9IDB4ZmY7XG4gICAgICAgIGlkYXRbcGkrK10gPSAweDAwO1xuICAgICAgICBpZGF0W3BpKytdID0gMHgwMDtcbiAgICAgICAgaWRhdC5zZXQobGl0ZXJhbHMuc3ViYXJyYXkocG9zLCBwb3MgKyBtYXhCbG9ja0xlbmd0aCksIHBpKTtcbiAgICAgICAgcGkgKz0gbWF4QmxvY2tMZW5ndGg7XG4gICAgICAgIHBvcyArPSBtYXhCbG9ja0xlbmd0aDtcbiAgICAgICAgbGVuIC09IG1heEJsb2NrTGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICAvLyB3cml0aW5nIG5vbi1maW5hbCBERUZMQVRFIGJsb2NrcyB0eXBlIDBcbiAgICAgIGlkYXRbcGkrK10gPSAweDAxO1xuICAgICAgaWRhdFtwaSsrXSA9IGxlbiAmIDB4ZmY7XG4gICAgICBpZGF0W3BpKytdID0gKGxlbiA+PiA4KSAmIDB4ZmY7XG4gICAgICBpZGF0W3BpKytdID0gfmxlbiAmIDB4ZmZmZiAmIDB4ZmY7XG4gICAgICBpZGF0W3BpKytdID0gKCh+bGVuICYgMHhmZmZmKSA+PiA4KSAmIDB4ZmY7XG4gICAgICBpZGF0LnNldChsaXRlcmFscy5zdWJhcnJheShwb3MpLCBwaSk7XG4gICAgICBwaSArPSBsaXRlcmFscy5sZW5ndGggLSBwb3M7XG5cbiAgICAgIGNvbnN0IGFkbGVyID0gYWRsZXIzMihsaXRlcmFscywgMCwgbGl0ZXJhbHMubGVuZ3RoKTsgLy8gY2hlY2tzdW1cbiAgICAgIGlkYXRbcGkrK10gPSAoYWRsZXIgPj4gMjQpICYgMHhmZjtcbiAgICAgIGlkYXRbcGkrK10gPSAoYWRsZXIgPj4gMTYpICYgMHhmZjtcbiAgICAgIGlkYXRbcGkrK10gPSAoYWRsZXIgPj4gOCkgJiAweGZmO1xuICAgICAgaWRhdFtwaSsrXSA9IGFkbGVyICYgMHhmZjtcbiAgICAgIHJldHVybiBpZGF0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuY29kZShpbWdEYXRhLCBraW5kLCBmb3JjZURhdGFTY2hlbWEsIGlzTWFzaykge1xuICAgICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG4gICAgICBsZXQgYml0RGVwdGgsIGNvbG9yVHlwZSwgbGluZVNpemU7XG4gICAgICBjb25zdCBieXRlcyA9IGltZ0RhdGEuZGF0YTtcblxuICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOlxuICAgICAgICAgIGNvbG9yVHlwZSA9IDA7XG4gICAgICAgICAgYml0RGVwdGggPSAxO1xuICAgICAgICAgIGxpbmVTaXplID0gKHdpZHRoICsgNykgPj4gMztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbWFnZUtpbmQuUkdCXzI0QlBQOlxuICAgICAgICAgIGNvbG9yVHlwZSA9IDI7XG4gICAgICAgICAgYml0RGVwdGggPSA4O1xuICAgICAgICAgIGxpbmVTaXplID0gd2lkdGggKiAzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEltYWdlS2luZC5SR0JBXzMyQlBQOlxuICAgICAgICAgIGNvbG9yVHlwZSA9IDY7XG4gICAgICAgICAgYml0RGVwdGggPSA4O1xuICAgICAgICAgIGxpbmVTaXplID0gd2lkdGggKiA0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0XCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBwcmVmaXggZXZlcnkgcm93IHdpdGggcHJlZGljdG9yIDBcbiAgICAgIGNvbnN0IGxpdGVyYWxzID0gbmV3IFVpbnQ4QXJyYXkoKDEgKyBsaW5lU2l6ZSkgKiBoZWlnaHQpO1xuICAgICAgbGV0IG9mZnNldExpdGVyYWxzID0gMCxcbiAgICAgICAgb2Zmc2V0Qnl0ZXMgPSAwO1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkge1xuICAgICAgICBsaXRlcmFsc1tvZmZzZXRMaXRlcmFscysrXSA9IDA7IC8vIG5vIHByZWRpY3Rpb25cbiAgICAgICAgbGl0ZXJhbHMuc2V0KFxuICAgICAgICAgIGJ5dGVzLnN1YmFycmF5KG9mZnNldEJ5dGVzLCBvZmZzZXRCeXRlcyArIGxpbmVTaXplKSxcbiAgICAgICAgICBvZmZzZXRMaXRlcmFsc1xuICAgICAgICApO1xuICAgICAgICBvZmZzZXRCeXRlcyArPSBsaW5lU2l6ZTtcbiAgICAgICAgb2Zmc2V0TGl0ZXJhbHMgKz0gbGluZVNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSBJbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgJiYgaXNNYXNrKSB7XG4gICAgICAgIC8vIGludmVydGluZyBmb3IgaW1hZ2UgbWFza3NcbiAgICAgICAgb2Zmc2V0TGl0ZXJhbHMgPSAwO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgb2Zmc2V0TGl0ZXJhbHMrKzsgLy8gc2tpcHBpbmcgcHJlZGljdG9yXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICBsaXRlcmFsc1tvZmZzZXRMaXRlcmFscysrXSBePSAweGZmO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpaGRyID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAod2lkdGggPj4gMjQpICYgMHhmZixcbiAgICAgICAgKHdpZHRoID4+IDE2KSAmIDB4ZmYsXG4gICAgICAgICh3aWR0aCA+PiA4KSAmIDB4ZmYsXG4gICAgICAgIHdpZHRoICYgMHhmZixcbiAgICAgICAgKGhlaWdodCA+PiAyNCkgJiAweGZmLFxuICAgICAgICAoaGVpZ2h0ID4+IDE2KSAmIDB4ZmYsXG4gICAgICAgIChoZWlnaHQgPj4gOCkgJiAweGZmLFxuICAgICAgICBoZWlnaHQgJiAweGZmLFxuICAgICAgICBiaXREZXB0aCwgLy8gYml0IGRlcHRoXG4gICAgICAgIGNvbG9yVHlwZSwgLy8gY29sb3IgdHlwZVxuICAgICAgICAweDAwLCAvLyBjb21wcmVzc2lvbiBtZXRob2RcbiAgICAgICAgMHgwMCwgLy8gZmlsdGVyIG1ldGhvZFxuICAgICAgICAweDAwLCAvLyBpbnRlcmxhY2UgbWV0aG9kXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IGlkYXQgPSBkZWZsYXRlU3luYyhsaXRlcmFscyk7XG5cbiAgICAgIC8vIFBORyBjb25zaXN0cyBvZjogaGVhZGVyLCBJSERSK2RhdGEsIElEQVQrZGF0YSwgYW5kIElFTkQuXG4gICAgICBjb25zdCBwbmdMZW5ndGggPVxuICAgICAgICBQTkdfSEVBREVSLmxlbmd0aCArIENIVU5LX1dSQVBQRVJfU0laRSAqIDMgKyBpaGRyLmxlbmd0aCArIGlkYXQubGVuZ3RoO1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHBuZ0xlbmd0aCk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIGRhdGEuc2V0KFBOR19IRUFERVIsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gUE5HX0hFQURFUi5sZW5ndGg7XG4gICAgICB3cml0ZVBuZ0NodW5rKFwiSUhEUlwiLCBpaGRyLCBkYXRhLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IENIVU5LX1dSQVBQRVJfU0laRSArIGloZHIubGVuZ3RoO1xuICAgICAgd3JpdGVQbmdDaHVuayhcIklEQVRBXCIsIGlkYXQsIGRhdGEsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gQ0hVTktfV1JBUFBFUl9TSVpFICsgaWRhdC5sZW5ndGg7XG4gICAgICB3cml0ZVBuZ0NodW5rKFwiSUVORFwiLCBuZXcgVWludDhBcnJheSgwKSwgZGF0YSwgb2Zmc2V0KTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZU9iamVjdFVSTChkYXRhLCBcImltYWdlL3BuZ1wiLCBmb3JjZURhdGFTY2hlbWEpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICByZXR1cm4gZnVuY3Rpb24gY29udmVydEltZ0RhdGFUb1BuZyhpbWdEYXRhLCBmb3JjZURhdGFTY2hlbWEsIGlzTWFzaykge1xuICAgICAgY29uc3Qga2luZCA9XG4gICAgICAgIGltZ0RhdGEua2luZCA9PT0gdW5kZWZpbmVkID8gSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQIDogaW1nRGF0YS5raW5kO1xuICAgICAgcmV0dXJuIGVuY29kZShpbWdEYXRhLCBraW5kLCBmb3JjZURhdGFTY2hlbWEsIGlzTWFzayk7XG4gICAgfTtcbiAgfSkoKTtcblxuICBjbGFzcyBTVkdFeHRyYVN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuZm9udFNpemVTY2FsZSA9IDE7XG4gICAgICB0aGlzLmZvbnRXZWlnaHQgPSBTVkdfREVGQVVMVFMuZm9udFdlaWdodDtcbiAgICAgIHRoaXMuZm9udFNpemUgPSAwO1xuXG4gICAgICB0aGlzLnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVg7XG4gICAgICB0aGlzLmZvbnRNYXRyaXggPSBGT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgIHRoaXMubGVhZGluZyA9IDA7XG4gICAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcbiAgICAgIHRoaXMudGV4dE1hdHJpeFNjYWxlID0gMTtcblxuICAgICAgLy8gQ3VycmVudCBwb2ludCAoaW4gdXNlciBjb29yZGluYXRlcylcbiAgICAgIHRoaXMueCA9IDA7XG4gICAgICB0aGlzLnkgPSAwO1xuXG4gICAgICAvLyBTdGFydCBvZiB0ZXh0IGxpbmUgKGluIHRleHQgY29vcmRpbmF0ZXMpXG4gICAgICB0aGlzLmxpbmVYID0gMDtcbiAgICAgIHRoaXMubGluZVkgPSAwO1xuXG4gICAgICAvLyBDaGFyYWN0ZXIgYW5kIHdvcmQgc3BhY2luZ1xuICAgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG4gICAgICB0aGlzLndvcmRTcGFjaW5nID0gMDtcbiAgICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7XG4gICAgICB0aGlzLnRleHRSaXNlID0gMDtcblxuICAgICAgLy8gRGVmYXVsdCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9yc1xuICAgICAgdGhpcy5maWxsQ29sb3IgPSBTVkdfREVGQVVMVFMuZmlsbENvbG9yO1xuICAgICAgdGhpcy5zdHJva2VDb2xvciA9IFwiIzAwMDAwMFwiO1xuXG4gICAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XG4gICAgICB0aGlzLnN0cm9rZUFscGhhID0gMTtcbiAgICAgIHRoaXMubGluZVdpZHRoID0gMTtcbiAgICAgIHRoaXMubGluZUpvaW4gPSBcIlwiO1xuICAgICAgdGhpcy5saW5lQ2FwID0gXCJcIjtcbiAgICAgIHRoaXMubWl0ZXJMaW1pdCA9IDA7XG5cbiAgICAgIHRoaXMuZGFzaEFycmF5ID0gW107XG4gICAgICB0aGlzLmRhc2hQaGFzZSA9IDA7XG5cbiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107XG5cbiAgICAgIC8vIENsaXBwaW5nXG4gICAgICB0aGlzLmFjdGl2ZUNsaXBVcmwgPSBudWxsO1xuICAgICAgdGhpcy5jbGlwR3JvdXAgPSBudWxsO1xuXG4gICAgICB0aGlzLm1hc2tJZCA9IFwiXCI7XG4gICAgfVxuXG4gICAgY2xvbmUoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50UG9pbnQoeCwgeSkge1xuICAgICAgdGhpcy54ID0geDtcbiAgICAgIHRoaXMueSA9IHk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWlubmVyLWRlY2xhcmF0aW9uc1xuICBmdW5jdGlvbiBvcExpc3RUb1RyZWUob3BMaXN0KSB7XG4gICAgbGV0IG9wVHJlZSA9IFtdO1xuICAgIGNvbnN0IHRtcCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBvcExpc3RFbGVtZW50IG9mIG9wTGlzdCkge1xuICAgICAgaWYgKG9wTGlzdEVsZW1lbnQuZm4gPT09IFwic2F2ZVwiKSB7XG4gICAgICAgIG9wVHJlZS5wdXNoKHsgZm5JZDogOTIsIGZuOiBcImdyb3VwXCIsIGl0ZW1zOiBbXSB9KTtcbiAgICAgICAgdG1wLnB1c2gob3BUcmVlKTtcbiAgICAgICAgb3BUcmVlID0gb3BUcmVlW29wVHJlZS5sZW5ndGggLSAxXS5pdGVtcztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcExpc3RFbGVtZW50LmZuID09PSBcInJlc3RvcmVcIikge1xuICAgICAgICBvcFRyZWUgPSB0bXAucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcFRyZWUucHVzaChvcExpc3RFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9wVHJlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBmbG9hdCBudW1iZXIgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSB7bnVtYmVyfSAtIFRoZSBmbG9hdCBudW1iZXIgdG8gZm9ybWF0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWlubmVyLWRlY2xhcmF0aW9uc1xuICBmdW5jdGlvbiBwZih2YWx1ZSkge1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGNvbnN0IHMgPSB2YWx1ZS50b0ZpeGVkKDEwKTtcbiAgICBsZXQgaSA9IHMubGVuZ3RoIC0gMTtcbiAgICBpZiAoc1tpXSAhPT0gXCIwXCIpIHtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0cmFpbGluZyB6ZXJvcy5cbiAgICBkbyB7XG4gICAgICBpLS07XG4gICAgfSB3aGlsZSAoc1tpXSA9PT0gXCIwXCIpO1xuICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBzW2ldID09PSBcIi5cIiA/IGkgOiBpICsgMSk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgdHJhbnNmb3JtIG1hdHJpeCBhcyBhIHN0cmluZy4gVGhlIHN0YW5kYXJkIHJvdGF0aW9uLCBzY2FsZSBhbmRcbiAgICogdHJhbnNsYXRpb24gbWF0cmljZXMgYXJlIHJlcGxhY2VkIGJ5IHRoZWlyIHNob3J0ZXIgZm9ybXMsIGFuZCBmb3JcbiAgICogaWRlbnRpdHkgbWF0cmljZXMgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIHRvIHNhdmUgbWVtb3J5LlxuICAgKlxuICAgKiBAcGFyYW0gbSB7QXJyYXl9IC0gVGhlIHRyYW5zZm9ybSBtYXRyaXggdG8gZm9ybWF0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWlubmVyLWRlY2xhcmF0aW9uc1xuICBmdW5jdGlvbiBwbShtKSB7XG4gICAgaWYgKG1bNF0gPT09IDAgJiYgbVs1XSA9PT0gMCkge1xuICAgICAgaWYgKG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCkge1xuICAgICAgICBpZiAobVswXSA9PT0gMSAmJiBtWzNdID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBzY2FsZSgke3BmKG1bMF0pfSAke3BmKG1bM10pfSlgO1xuICAgICAgfVxuICAgICAgaWYgKG1bMF0gPT09IG1bM10gJiYgbVsxXSA9PT0gLW1bMl0pIHtcbiAgICAgICAgY29uc3QgYSA9IChNYXRoLmFjb3MobVswXSkgKiAxODApIC8gTWF0aC5QSTtcbiAgICAgICAgcmV0dXJuIGByb3RhdGUoJHtwZihhKX0pYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1bMF0gPT09IDEgJiYgbVsxXSA9PT0gMCAmJiBtWzJdID09PSAwICYmIG1bM10gPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtwZihtWzRdKX0gJHtwZihtWzVdKX0pYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGBtYXRyaXgoJHtwZihtWzBdKX0gJHtwZihtWzFdKX0gJHtwZihtWzJdKX0gJHtwZihtWzNdKX0gJHtwZihtWzRdKX0gYCArXG4gICAgICBgJHtwZihtWzVdKX0pYFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgY291bnRzIGJlbG93IGFyZSByZWxldmFudCBmb3IgYWxsIHBhZ2VzLCBzbyB0aGV5IGhhdmUgdG8gYmUgZ2xvYmFsXG4gIC8vIGluc3RlYWQgb2YgYmVpbmcgbWVtYmVycyBvZiBgU1ZHR3JhcGhpY3NgICh3aGljaCBpcyByZWNyZWF0ZWQgZm9yXG4gIC8vIGVhY2ggcGFnZSkuXG4gIGxldCBjbGlwQ291bnQgPSAwO1xuICBsZXQgbWFza0NvdW50ID0gMDtcbiAgbGV0IHNoYWRpbmdDb3VudCA9IDA7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBTVkdHcmFwaGljcyA9IGNsYXNzIFNWR0dyYXBoaWNzIHtcbiAgICBjb25zdHJ1Y3Rvcihjb21tb25PYmpzLCBvYmpzLCBmb3JjZURhdGFTY2hlbWEgPSBmYWxzZSkge1xuICAgICAgdGhpcy5zdmdGYWN0b3J5ID0gbmV3IERPTVNWR0ZhY3RvcnkoKTtcblxuICAgICAgdGhpcy5jdXJyZW50ID0gbmV3IFNWR0V4dHJhU3RhdGUoKTtcbiAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gSURFTlRJVFlfTUFUUklYOyAvLyBHcmFwaGljcyBzdGF0ZSBtYXRyaXhcbiAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sgPSBbXTtcbiAgICAgIHRoaXMuZXh0cmFTdGFjayA9IFtdO1xuICAgICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqcztcbiAgICAgIHRoaXMub2JqcyA9IG9ianM7XG4gICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuXG4gICAgICB0aGlzLmVtYmVkRm9udHMgPSBmYWxzZTtcbiAgICAgIHRoaXMuZW1iZWRkZWRGb250cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLmNzc1N0eWxlID0gbnVsbDtcbiAgICAgIHRoaXMuZm9yY2VEYXRhU2NoZW1hID0gISFmb3JjZURhdGFTY2hlbWE7XG5cbiAgICAgIC8vIEluIGBzcmMvc2hhcmVkL3V0aWwuanNgIHRoZSBvcGVyYXRvciBuYW1lcyBhcmUgbWFwcGVkIHRvIElEcy5cbiAgICAgIC8vIFRoZSBsaXN0IGJlbG93IHJlcHJlc2VudHMgdGhlIHJldmVyc2Ugb2YgdGhhdCwgaS5lLiwgaXQgbWFwcyBJRHNcbiAgICAgIC8vIHRvIG9wZXJhdG9yIG5hbWVzLlxuICAgICAgdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmcgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgb3AgaW4gT1BTKSB7XG4gICAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nW09QU1tvcF1dID0gb3A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2F2ZSgpIHtcbiAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XG4gICAgICBjb25zdCBvbGQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICB0aGlzLmV4dHJhU3RhY2sucHVzaChvbGQpO1xuICAgICAgdGhpcy5jdXJyZW50ID0gb2xkLmNsb25lKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZSgpIHtcbiAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gdGhpcy50cmFuc2Zvcm1TdGFjay5wb3AoKTtcbiAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZXh0cmFTdGFjay5wb3AoKTtcbiAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgdGhpcy50Z3JwID0gbnVsbDtcbiAgICB9XG5cbiAgICBncm91cChpdGVtcykge1xuICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICB0aGlzLmV4ZWN1dGVPcFRyZWUoaXRlbXMpO1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfVxuXG4gICAgbG9hZERlcGVuZGVuY2llcyhvcGVyYXRvckxpc3QpIHtcbiAgICAgIGNvbnN0IGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTtcbiAgICAgIGNvbnN0IGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gT1BTLmRlcGVuZGVuY3kpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgb2JqIG9mIGFyZ3NBcnJheVtpXSkge1xuICAgICAgICAgIGNvbnN0IG9ianNQb29sID0gb2JqLnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2JqcyA6IHRoaXMub2JqcztcbiAgICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBvYmpzUG9vbC5nZXQob2JqLCByZXNvbHZlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZGVwZW5kZW5jaWVzLnB1c2gocHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzLmN1cnJlbnQuZGVwZW5kZW5jaWVzKTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgY29uc3QgdHJhbnNmb3JtTWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBVdGlsLnRyYW5zZm9ybShcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXgsXG4gICAgICAgIHRyYW5zZm9ybU1hdHJpeFxuICAgICAgKTtcbiAgICAgIHRoaXMudGdycCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0U1ZHKG9wZXJhdG9yTGlzdCwgdmlld3BvcnQpIHtcbiAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcblxuICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9IHRoaXMuX2luaXRpYWxpemUodmlld3BvcnQpO1xuICAgICAgcmV0dXJuIHRoaXMubG9hZERlcGVuZGVuY2llcyhvcGVyYXRvckxpc3QpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IElERU5USVRZX01BVFJJWDtcbiAgICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdChvcGVyYXRvckxpc3QpKTtcbiAgICAgICAgcmV0dXJuIHN2Z0VsZW1lbnQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb252ZXJ0T3BMaXN0KG9wZXJhdG9yTGlzdCkge1xuICAgICAgY29uc3Qgb3BlcmF0b3JJZE1hcHBpbmcgPSB0aGlzLl9vcGVyYXRvcklkTWFwcGluZztcbiAgICAgIGNvbnN0IGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7XG4gICAgICBjb25zdCBmbkFycmF5ID0gb3BlcmF0b3JMaXN0LmZuQXJyYXk7XG4gICAgICBjb25zdCBvcExpc3QgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb25zdCBmbklkID0gZm5BcnJheVtpXTtcbiAgICAgICAgb3BMaXN0LnB1c2goe1xuICAgICAgICAgIGZuSWQsXG4gICAgICAgICAgZm46IG9wZXJhdG9ySWRNYXBwaW5nW2ZuSWRdLFxuICAgICAgICAgIGFyZ3M6IGFyZ3NBcnJheVtpXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3BMaXN0VG9UcmVlKG9wTGlzdCk7XG4gICAgfVxuXG4gICAgZXhlY3V0ZU9wVHJlZShvcFRyZWUpIHtcbiAgICAgIGZvciAoY29uc3Qgb3BUcmVlRWxlbWVudCBvZiBvcFRyZWUpIHtcbiAgICAgICAgY29uc3QgZm4gPSBvcFRyZWVFbGVtZW50LmZuO1xuICAgICAgICBjb25zdCBmbklkID0gb3BUcmVlRWxlbWVudC5mbklkO1xuICAgICAgICBjb25zdCBhcmdzID0gb3BUcmVlRWxlbWVudC5hcmdzO1xuXG4gICAgICAgIHN3aXRjaCAoZm5JZCB8IDApIHtcbiAgICAgICAgICBjYXNlIE9QUy5iZWdpblRleHQ6XG4gICAgICAgICAgICB0aGlzLmJlZ2luVGV4dCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuZGVwZW5kZW5jeTpcbiAgICAgICAgICAgIC8vIEhhbmRsZWQgaW4gYGxvYWREZXBlbmRlbmNpZXNgLCBzbyBubyB3YXJuaW5nIHNob3VsZCBiZSBzaG93bi5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldExlYWRpbmc6XG4gICAgICAgICAgICB0aGlzLnNldExlYWRpbmcoYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRMZWFkaW5nTW92ZVRleHQ6XG4gICAgICAgICAgICB0aGlzLnNldExlYWRpbmdNb3ZlVGV4dChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZvbnQ6XG4gICAgICAgICAgICB0aGlzLnNldEZvbnQoYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaG93VGV4dDpcbiAgICAgICAgICAgIHRoaXMuc2hvd1RleHQoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDpcbiAgICAgICAgICAgIHRoaXMuc2hvd1RleHQoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5lbmRUZXh0OlxuICAgICAgICAgICAgdGhpcy5lbmRUZXh0KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5tb3ZlVGV4dDpcbiAgICAgICAgICAgIHRoaXMubW92ZVRleHQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRDaGFyU3BhY2luZzpcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhclNwYWNpbmcoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRXb3JkU3BhY2luZzpcbiAgICAgICAgICAgIHRoaXMuc2V0V29yZFNwYWNpbmcoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRIU2NhbGU6XG4gICAgICAgICAgICB0aGlzLnNldEhTY2FsZShhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRNYXRyaXg6XG4gICAgICAgICAgICB0aGlzLnNldFRleHRNYXRyaXgoXG4gICAgICAgICAgICAgIGFyZ3NbMF0sXG4gICAgICAgICAgICAgIGFyZ3NbMV0sXG4gICAgICAgICAgICAgIGFyZ3NbMl0sXG4gICAgICAgICAgICAgIGFyZ3NbM10sXG4gICAgICAgICAgICAgIGFyZ3NbNF0sXG4gICAgICAgICAgICAgIGFyZ3NbNV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRUZXh0UmlzZTpcbiAgICAgICAgICAgIHRoaXMuc2V0VGV4dFJpc2UoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZTpcbiAgICAgICAgICAgIHRoaXMuc2V0VGV4dFJlbmRlcmluZ01vZGUoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRMaW5lV2lkdGg6XG4gICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aChhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldExpbmVKb2luOlxuICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldExpbmVDYXA6XG4gICAgICAgICAgICB0aGlzLnNldExpbmVDYXAoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRNaXRlckxpbWl0OlxuICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbFJHQkNvbG9yOlxuICAgICAgICAgICAgdGhpcy5zZXRGaWxsUkdCQ29sb3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VSR0JDb2xvcjpcbiAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlUkdCQ29sb3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvck46XG4gICAgICAgICAgICB0aGlzLnNldFN0cm9rZUNvbG9yTihhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvck46XG4gICAgICAgICAgICB0aGlzLnNldEZpbGxDb2xvck4oYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDpcbiAgICAgICAgICAgIHRoaXMuc2hhZGluZ0ZpbGwoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXREYXNoOlxuICAgICAgICAgICAgdGhpcy5zZXREYXNoKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0UmVuZGVyaW5nSW50ZW50OlxuICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRGbGF0bmVzczpcbiAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3MoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRHU3RhdGU6XG4gICAgICAgICAgICB0aGlzLnNldEdTdGF0ZShhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmZpbGw6XG4gICAgICAgICAgICB0aGlzLmZpbGwoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmVvRmlsbDpcbiAgICAgICAgICAgIHRoaXMuZW9GaWxsKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zdHJva2U6XG4gICAgICAgICAgICB0aGlzLnN0cm9rZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuZmlsbFN0cm9rZTpcbiAgICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuZW9GaWxsU3Ryb2tlOlxuICAgICAgICAgICAgdGhpcy5lb0ZpbGxTdHJva2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmNsaXA6XG4gICAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuZW9DbGlwOlxuICAgICAgICAgICAgdGhpcy5jbGlwKFwiZXZlbm9kZFwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazpcbiAgICAgICAgICAgIHRoaXMucGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5wYWludEltYWdlWE9iamVjdDpcbiAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZVhPYmplY3QoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdDpcbiAgICAgICAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5wYWludEltYWdlTWFza1hPYmplY3Q6XG4gICAgICAgICAgICB0aGlzLnBhaW50SW1hZ2VNYXNrWE9iamVjdChhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnBhaW50Rm9ybVhPYmplY3RCZWdpbjpcbiAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEJlZ2luKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMucGFpbnRGb3JtWE9iamVjdEVuZDpcbiAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEVuZCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuY2xvc2VQYXRoOlxuICAgICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmNsb3NlU3Ryb2tlOlxuICAgICAgICAgICAgdGhpcy5jbG9zZVN0cm9rZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuY2xvc2VGaWxsU3Ryb2tlOlxuICAgICAgICAgICAgdGhpcy5jbG9zZUZpbGxTdHJva2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmNsb3NlRU9GaWxsU3Ryb2tlOlxuICAgICAgICAgICAgdGhpcy5jbG9zZUVPRmlsbFN0cm9rZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubmV4dExpbmU6XG4gICAgICAgICAgICB0aGlzLm5leHRMaW5lKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy50cmFuc2Zvcm06XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybShcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgYXJnc1sxXSxcbiAgICAgICAgICAgICAgYXJnc1syXSxcbiAgICAgICAgICAgICAgYXJnc1szXSxcbiAgICAgICAgICAgICAgYXJnc1s0XSxcbiAgICAgICAgICAgICAgYXJnc1s1XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmNvbnN0cnVjdFBhdGg6XG4gICAgICAgICAgICB0aGlzLmNvbnN0cnVjdFBhdGgoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5lbmRQYXRoOlxuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDkyOlxuICAgICAgICAgICAgdGhpcy5ncm91cChvcFRyZWVFbGVtZW50Lml0ZW1zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB3YXJuKGBVbmltcGxlbWVudGVkIG9wZXJhdG9yICR7Zm59YCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNldFdvcmRTcGFjaW5nKHdvcmRTcGFjaW5nKSB7XG4gICAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZztcbiAgICB9XG5cbiAgICBzZXRDaGFyU3BhY2luZyhjaGFyU3BhY2luZykge1xuICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gY2hhclNwYWNpbmc7XG4gICAgfVxuXG4gICAgbmV4dExpbmUoKSB7XG4gICAgICB0aGlzLm1vdmVUZXh0KDAsIHRoaXMuY3VycmVudC5sZWFkaW5nKTtcbiAgICB9XG5cbiAgICBzZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBjdXJyZW50LnRleHRNYXRyaXggPSBjdXJyZW50LmxpbmVNYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICBjdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcblxuICAgICAgY3VycmVudC54ID0gY3VycmVudC5saW5lWCA9IDA7XG4gICAgICBjdXJyZW50LnkgPSBjdXJyZW50LmxpbmVZID0gMDtcblxuICAgICAgY3VycmVudC54Y29vcmRzID0gW107XG4gICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTtcbiAgICAgIGN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmb250LWZhbWlseVwiLCBjdXJyZW50LmZvbnRGYW1pbHkpO1xuICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgICAgbnVsbCxcbiAgICAgICAgXCJmb250LXNpemVcIixcbiAgICAgICAgYCR7cGYoY3VycmVudC5mb250U2l6ZSl9cHhgXG4gICAgICApO1xuICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgcGYoLWN1cnJlbnQueSkpO1xuXG4gICAgICBjdXJyZW50LnR4dEVsZW1lbnQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0ZXh0XCIpO1xuICAgICAgY3VycmVudC50eHRFbGVtZW50LmFwcGVuZENoaWxkKGN1cnJlbnQudHNwYW4pO1xuICAgIH1cblxuICAgIGJlZ2luVGV4dCgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBjdXJyZW50LnggPSBjdXJyZW50LmxpbmVYID0gMDtcbiAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgPSAwO1xuICAgICAgY3VycmVudC50ZXh0TWF0cml4ID0gSURFTlRJVFlfTUFUUklYO1xuICAgICAgY3VycmVudC5saW5lTWF0cml4ID0gSURFTlRJVFlfTUFUUklYO1xuICAgICAgY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuICAgICAgY3VycmVudC50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcbiAgICAgIGN1cnJlbnQudHh0Z3JwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdO1xuICAgICAgY3VycmVudC55Y29vcmRzID0gW107XG4gICAgfVxuXG4gICAgbW92ZVRleHQoeCwgeSkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICAgIGN1cnJlbnQueCA9IGN1cnJlbnQubGluZVggKz0geDtcbiAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgKz0geTtcblxuICAgICAgY3VycmVudC54Y29vcmRzID0gW107XG4gICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTtcbiAgICAgIGN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmb250LWZhbWlseVwiLCBjdXJyZW50LmZvbnRGYW1pbHkpO1xuICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgICAgbnVsbCxcbiAgICAgICAgXCJmb250LXNpemVcIixcbiAgICAgICAgYCR7cGYoY3VycmVudC5mb250U2l6ZSl9cHhgXG4gICAgICApO1xuICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgcGYoLWN1cnJlbnQueSkpO1xuICAgIH1cblxuICAgIHNob3dUZXh0KGdseXBocykge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICAgIGNvbnN0IGZvbnQgPSBjdXJyZW50LmZvbnQ7XG4gICAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG4gICAgICBpZiAoZm9udFNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlO1xuICAgICAgY29uc3QgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nO1xuICAgICAgY29uc3Qgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nO1xuICAgICAgY29uc3QgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjtcbiAgICAgIGNvbnN0IHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uO1xuICAgICAgY29uc3QgdmVydGljYWwgPSBmb250LnZlcnRpY2FsO1xuICAgICAgY29uc3Qgc3BhY2luZ0RpciA9IHZlcnRpY2FsID8gMSA6IC0xO1xuICAgICAgY29uc3QgZGVmYXVsdFZNZXRyaWNzID0gZm9udC5kZWZhdWx0Vk1ldHJpY3M7XG4gICAgICBjb25zdCB3aWR0aEFkdmFuY2VTY2FsZSA9IGZvbnRTaXplICogY3VycmVudC5mb250TWF0cml4WzBdO1xuXG4gICAgICBsZXQgeCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykge1xuICAgICAgICBpZiAoZ2x5cGggPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXb3JkIGJyZWFrXG4gICAgICAgICAgeCArPSBmb250RGlyZWN0aW9uICogd29yZFNwYWNpbmc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW0oZ2x5cGgpKSB7XG4gICAgICAgICAgeCArPSAoc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUpIC8gMTAwMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZztcbiAgICAgICAgY29uc3QgY2hhcmFjdGVyID0gZ2x5cGguZm9udENoYXI7XG4gICAgICAgIGxldCBzY2FsZWRYLCBzY2FsZWRZO1xuICAgICAgICBsZXQgd2lkdGggPSBnbHlwaC53aWR0aDtcbiAgICAgICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICAgICAgbGV0IHZ4O1xuICAgICAgICAgIGNvbnN0IHZtZXRyaWMgPSBnbHlwaC52bWV0cmljIHx8IGRlZmF1bHRWTWV0cmljcztcbiAgICAgICAgICB2eCA9IGdseXBoLnZtZXRyaWMgPyB2bWV0cmljWzFdIDogd2lkdGggKiAwLjU7XG4gICAgICAgICAgdnggPSAtdnggKiB3aWR0aEFkdmFuY2VTY2FsZTtcbiAgICAgICAgICBjb25zdCB2eSA9IHZtZXRyaWNbMl0gKiB3aWR0aEFkdmFuY2VTY2FsZTtcblxuICAgICAgICAgIHdpZHRoID0gdm1ldHJpYyA/IC12bWV0cmljWzBdIDogd2lkdGg7XG4gICAgICAgICAgc2NhbGVkWCA9IHZ4IC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgICBzY2FsZWRZID0gKHggKyB2eSkgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjYWxlZFggPSB4IC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgICBzY2FsZWRZID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbHlwaC5pc0luRm9udCB8fCBmb250Lm1pc3NpbmdGaWxlKSB7XG4gICAgICAgICAgY3VycmVudC54Y29vcmRzLnB1c2goY3VycmVudC54ICsgc2NhbGVkWCk7XG4gICAgICAgICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICAgICAgICBjdXJyZW50Lnljb29yZHMucHVzaCgtY3VycmVudC55ICsgc2NhbGVkWSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQudHNwYW4udGV4dENvbnRlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRPRE86IFRvIGFzc2lzdCB3aXRoIHRleHQgc2VsZWN0aW9uLCB3ZSBzaG91bGQgcmVwbGFjZSB0aGUgbWlzc2luZ1xuICAgICAgICAgIC8vIGNoYXJhY3RlciB3aXRoIGEgc3BhY2UgY2hhcmFjdGVyIGlmIGNoYXJXaWR0aCBpcyBub3QgemVyby5cbiAgICAgICAgICAvLyBCdXQgd2UgY2Fubm90IGp1c3QgZG8gXCJjaGFyYWN0ZXIgPSAnICdcIiwgYmVjYXVzZSB0aGUgJyAnIGNoYXJhY3RlclxuICAgICAgICAgIC8vIG1pZ2h0IGFjdHVhbGx5IG1hcCB0byBhIGRpZmZlcmVudCBnbHlwaC5cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjaGFyV2lkdGg7XG4gICAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICAgIGNoYXJXaWR0aCA9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgLSBzcGFjaW5nICogZm9udERpcmVjdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICB4ICs9IGNoYXJXaWR0aDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwieFwiLFxuICAgICAgICBjdXJyZW50Lnhjb29yZHMubWFwKHBmKS5qb2luKFwiIFwiKVxuICAgICAgKTtcbiAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgXCJ5XCIsXG4gICAgICAgICAgY3VycmVudC55Y29vcmRzLm1hcChwZikuam9pbihcIiBcIilcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1jdXJyZW50LnkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICAgIGN1cnJlbnQueSAtPSB4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudC54ICs9IHggKiB0ZXh0SFNjYWxlO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1mYW1pbHlcIiwgY3VycmVudC5mb250RmFtaWx5KTtcbiAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwiZm9udC1zaXplXCIsXG4gICAgICAgIGAke3BmKGN1cnJlbnQuZm9udFNpemUpfXB4YFxuICAgICAgKTtcbiAgICAgIGlmIChjdXJyZW50LmZvbnRTdHlsZSAhPT0gU1ZHX0RFRkFVTFRTLmZvbnRTdHlsZSkge1xuICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1zdHlsZVwiLCBjdXJyZW50LmZvbnRTdHlsZSk7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudC5mb250V2VpZ2h0ICE9PSBTVkdfREVGQVVMVFMuZm9udFdlaWdodCkge1xuICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC13ZWlnaHRcIiwgY3VycmVudC5mb250V2VpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPVxuICAgICAgICBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICAgIGlmIChcbiAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHxcbiAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFXG4gICAgICApIHtcbiAgICAgICAgaWYgKGN1cnJlbnQuZmlsbENvbG9yICE9PSBTVkdfREVGQVVMVFMuZmlsbENvbG9yKSB7XG4gICAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgY3VycmVudC5maWxsQ29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50LmZpbGxBbHBoYSA8IDEpIHtcbiAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1vcGFjaXR5XCIsIGN1cnJlbnQuZmlsbEFscGhhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSCkge1xuICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBGaXJlZm94OiBXZSBtdXN0IHNldCBmaWxsPVwidHJhbnNwYXJlbnRcIiBiZWNhdXNlXG4gICAgICAgIC8vIGZpbGw9XCJub25lXCIgd291bGQgZ2VuZXJhdGUgYW4gZW1wdHkgY2xpcHBpbmcgcGF0aC5cbiAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwibm9uZVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8XG4gICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aFNjYWxlID0gMSAvIChjdXJyZW50LnRleHRNYXRyaXhTY2FsZSB8fCAxKTtcbiAgICAgICAgdGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhjdXJyZW50LnRzcGFuLCBsaW5lV2lkdGhTY2FsZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluY2x1ZGUgdGhlIHRleHQgcmlzZSBpbiB0aGUgdGV4dCBtYXRyaXggc2luY2UgdGhlIGBwbWAgZnVuY3Rpb25cbiAgICAgIC8vIGNyZWF0ZXMgdGhlIFNWRyBlbGVtZW50J3MgYHRyYW5zbGF0ZWAgZW50cnkgKHdvcmsgb24gYSBjb3B5IHRvIGF2b2lkXG4gICAgICAvLyBhbHRlcmluZyB0aGUgb3JpZ2luYWwgdGV4dCBtYXRyaXgpLlxuICAgICAgbGV0IHRleHRNYXRyaXggPSBjdXJyZW50LnRleHRNYXRyaXg7XG4gICAgICBpZiAoY3VycmVudC50ZXh0UmlzZSAhPT0gMCkge1xuICAgICAgICB0ZXh0TWF0cml4ID0gdGV4dE1hdHJpeC5zbGljZSgpO1xuICAgICAgICB0ZXh0TWF0cml4WzVdICs9IGN1cnJlbnQudGV4dFJpc2U7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgICAgbnVsbCxcbiAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgYCR7cG0odGV4dE1hdHJpeCl9IHNjYWxlKCR7cGYodGV4dEhTY2FsZSl9LCAtMSlgXG4gICAgICApO1xuICAgICAgY3VycmVudC50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhNTF9OUywgXCJ4bWw6c3BhY2VcIiwgXCJwcmVzZXJ2ZVwiKTtcbiAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5hcHBlbmRDaGlsZChjdXJyZW50LnRzcGFuKTtcbiAgICAgIGN1cnJlbnQudHh0Z3JwLmFwcGVuZENoaWxkKGN1cnJlbnQudHh0RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoY3VycmVudC50eHRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBzZXRMZWFkaW5nTW92ZVRleHQoeCwgeSkge1xuICAgICAgdGhpcy5zZXRMZWFkaW5nKC15KTtcbiAgICAgIHRoaXMubW92ZVRleHQoeCwgeSk7XG4gICAgfVxuXG4gICAgYWRkRm9udFN0eWxlKGZvbnRPYmopIHtcbiAgICAgIGlmICghZm9udE9iai5kYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcImFkZEZvbnRTdHlsZTogTm8gZm9udCBkYXRhIGF2YWlsYWJsZSwgXCIgK1xuICAgICAgICAgICAgJ2Vuc3VyZSB0aGF0IHRoZSBcImZvbnRFeHRyYVByb3BlcnRpZXNcIiBBUEkgcGFyYW1ldGVyIGlzIHNldC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY3NzU3R5bGUpIHtcbiAgICAgICAgdGhpcy5jc3NTdHlsZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnN0eWxlXCIpO1xuICAgICAgICB0aGlzLmNzc1N0eWxlLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHlwZVwiLCBcInRleHQvY3NzXCIpO1xuICAgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQodGhpcy5jc3NTdHlsZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVybCA9IGNyZWF0ZU9iamVjdFVSTChcbiAgICAgICAgZm9udE9iai5kYXRhLFxuICAgICAgICBmb250T2JqLm1pbWV0eXBlLFxuICAgICAgICB0aGlzLmZvcmNlRGF0YVNjaGVtYVxuICAgICAgKTtcbiAgICAgIHRoaXMuY3NzU3R5bGUudGV4dENvbnRlbnQgKz1cbiAgICAgICAgYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogXCIke2ZvbnRPYmoubG9hZGVkTmFtZX1cIjtgICtcbiAgICAgICAgYCBzcmM6IHVybCgke3VybH0pOyB9XFxuYDtcbiAgICB9XG5cbiAgICBzZXRGb250KGRldGFpbHMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBjb25zdCBmb250T2JqID0gdGhpcy5jb21tb25PYmpzLmdldChkZXRhaWxzWzBdKTtcbiAgICAgIGxldCBzaXplID0gZGV0YWlsc1sxXTtcbiAgICAgIGN1cnJlbnQuZm9udCA9IGZvbnRPYmo7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5lbWJlZEZvbnRzICYmXG4gICAgICAgICFmb250T2JqLm1pc3NpbmdGaWxlICYmXG4gICAgICAgICF0aGlzLmVtYmVkZGVkRm9udHNbZm9udE9iai5sb2FkZWROYW1lXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWRkRm9udFN0eWxlKGZvbnRPYmopO1xuICAgICAgICB0aGlzLmVtYmVkZGVkRm9udHNbZm9udE9iai5sb2FkZWROYW1lXSA9IGZvbnRPYmo7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQuZm9udE1hdHJpeCA9IGZvbnRPYmouZm9udE1hdHJpeFxuICAgICAgICA/IGZvbnRPYmouZm9udE1hdHJpeFxuICAgICAgICA6IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuXG4gICAgICBsZXQgYm9sZCA9IFwibm9ybWFsXCI7XG4gICAgICBpZiAoZm9udE9iai5ibGFjaykge1xuICAgICAgICBib2xkID0gXCI5MDBcIjtcbiAgICAgIH0gZWxzZSBpZiAoZm9udE9iai5ib2xkKSB7XG4gICAgICAgIGJvbGQgPSBcImJvbGRcIjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0YWxpYyA9IGZvbnRPYmouaXRhbGljID8gXCJpdGFsaWNcIiA6IFwibm9ybWFsXCI7XG5cbiAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICBzaXplID0gLXNpemU7XG4gICAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gMTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQuZm9udFNpemUgPSBzaXplO1xuICAgICAgY3VycmVudC5mb250RmFtaWx5ID0gZm9udE9iai5sb2FkZWROYW1lO1xuICAgICAgY3VycmVudC5mb250V2VpZ2h0ID0gYm9sZDtcbiAgICAgIGN1cnJlbnQuZm9udFN0eWxlID0gaXRhbGljO1xuXG4gICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtY3VycmVudC55KSk7XG4gICAgICBjdXJyZW50Lnhjb29yZHMgPSBbXTtcbiAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdO1xuICAgIH1cblxuICAgIGVuZFRleHQoKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBRyAmJlxuICAgICAgICBjdXJyZW50LnR4dEVsZW1lbnQgJiZcbiAgICAgICAgY3VycmVudC50eHRFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIG5vIGdseXBocyBhcmUgc2hvd24gKGkuZS4gbm8gY2hpbGQgbm9kZXMpLCBubyBjbGlwcGluZyBvY2N1cnMuXG4gICAgICAgIGN1cnJlbnQuZWxlbWVudCA9IGN1cnJlbnQudHh0RWxlbWVudDtcbiAgICAgICAgdGhpcy5jbGlwKFwibm9uemVyb1wiKTtcbiAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGF0aCBwcm9wZXJ0aWVzXG4gICAgc2V0TGluZVdpZHRoKHdpZHRoKSB7XG4gICAgICBpZiAod2lkdGggPiAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudC5saW5lV2lkdGggPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRMaW5lQ2FwKHN0eWxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQubGluZUNhcCA9IExJTkVfQ0FQX1NUWUxFU1tzdHlsZV07XG4gICAgfVxuXG4gICAgc2V0TGluZUpvaW4oc3R5bGUpIHtcbiAgICAgIHRoaXMuY3VycmVudC5saW5lSm9pbiA9IExJTkVfSk9JTl9TVFlMRVNbc3R5bGVdO1xuICAgIH1cblxuICAgIHNldE1pdGVyTGltaXQobGltaXQpIHtcbiAgICAgIHRoaXMuY3VycmVudC5taXRlckxpbWl0ID0gbGltaXQ7XG4gICAgfVxuXG4gICAgc2V0U3Ryb2tlQWxwaGEoc3Ryb2tlQWxwaGEpIHtcbiAgICAgIHRoaXMuY3VycmVudC5zdHJva2VBbHBoYSA9IHN0cm9rZUFscGhhO1xuICAgIH1cblxuICAgIHNldFN0cm9rZVJHQkNvbG9yKHIsIGcsIGIpIHtcbiAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IFV0aWwubWFrZUNzc1JnYihyLCBnLCBiKTtcbiAgICB9XG5cbiAgICBzZXRGaWxsQWxwaGEoZmlsbEFscGhhKSB7XG4gICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gZmlsbEFscGhhO1xuICAgIH1cblxuICAgIHNldEZpbGxSR0JDb2xvcihyLCBnLCBiKSB7XG4gICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gVXRpbC5tYWtlQ3NzUmdiKHIsIGcsIGIpO1xuICAgICAgdGhpcy5jdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICB0aGlzLmN1cnJlbnQueGNvb3JkcyA9IFtdO1xuICAgICAgdGhpcy5jdXJyZW50Lnljb29yZHMgPSBbXTtcbiAgICB9XG5cbiAgICBzZXRTdHJva2VDb2xvck4oYXJncykge1xuICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpO1xuICAgIH1cblxuICAgIHNldEZpbGxDb2xvck4oYXJncykge1xuICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IHRoaXMuX21ha2VDb2xvck5fUGF0dGVybihhcmdzKTtcbiAgICB9XG5cbiAgICBzaGFkaW5nRmlsbChhcmdzKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMudmlld3BvcnQud2lkdGg7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnZpZXdwb3J0LmhlaWdodDtcbiAgICAgIGNvbnN0IGludiA9IFV0aWwuaW52ZXJzZVRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XG4gICAgICBjb25zdCBibCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBpbnYpO1xuICAgICAgY29uc3QgYnIgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFswLCBoZWlnaHRdLCBpbnYpO1xuICAgICAgY29uc3QgdWwgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFt3aWR0aCwgMF0sIGludik7XG4gICAgICBjb25zdCB1ciA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCBoZWlnaHRdLCBpbnYpO1xuICAgICAgY29uc3QgeDAgPSBNYXRoLm1pbihibFswXSwgYnJbMF0sIHVsWzBdLCB1clswXSk7XG4gICAgICBjb25zdCB5MCA9IE1hdGgubWluKGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTtcbiAgICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pO1xuICAgICAgY29uc3QgeTEgPSBNYXRoLm1heChibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7XG5cbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgeDApO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgeTApO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHgxIC0geDApO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCB5MSAtIHkwKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIHRoaXMuX21ha2VTaGFkaW5nUGF0dGVybihhcmdzKSk7XG4gICAgICBpZiAodGhpcy5jdXJyZW50LmZpbGxBbHBoYSA8IDEpIHtcbiAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtb3BhY2l0eVwiLCB0aGlzLmN1cnJlbnQuZmlsbEFscGhhKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQocmVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpIHtcbiAgICAgIGlmIChhcmdzWzBdID09PSBcIlRpbGluZ1BhdHRlcm5cIikge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVRpbGluZ1BhdHRlcm4oYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fbWFrZVNoYWRpbmdQYXR0ZXJuKGFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX21ha2VUaWxpbmdQYXR0ZXJuKGFyZ3MpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gYXJnc1sxXTtcbiAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IGFyZ3NbMl07XG4gICAgICBjb25zdCBtYXRyaXggPSBhcmdzWzNdIHx8IElERU5USVRZX01BVFJJWDtcbiAgICAgIGNvbnN0IFt4MCwgeTAsIHgxLCB5MV0gPSBhcmdzWzRdO1xuICAgICAgY29uc3QgeHN0ZXAgPSBhcmdzWzVdO1xuICAgICAgY29uc3QgeXN0ZXAgPSBhcmdzWzZdO1xuICAgICAgY29uc3QgcGFpbnRUeXBlID0gYXJnc1s3XTtcblxuICAgICAgY29uc3QgdGlsaW5nSWQgPSBgc2hhZGluZyR7c2hhZGluZ0NvdW50Kyt9YDtcbiAgICAgIGNvbnN0IFt0eDAsIHR5MF0gPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFt4MCwgeTBdLCBtYXRyaXgpO1xuICAgICAgY29uc3QgW3R4MSwgdHkxXSA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gxLCB5MV0sIG1hdHJpeCk7XG4gICAgICBjb25zdCBbeHNjYWxlLCB5c2NhbGVdID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtYXRyaXgpO1xuICAgICAgY29uc3QgdHhzdGVwID0geHN0ZXAgKiB4c2NhbGU7XG4gICAgICBjb25zdCB0eXN0ZXAgPSB5c3RlcCAqIHlzY2FsZTtcblxuICAgICAgY29uc3QgdGlsaW5nID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cGF0dGVyblwiKTtcbiAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIHRpbGluZ0lkKTtcbiAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInBhdHRlcm5Vbml0c1wiLCBcInVzZXJTcGFjZU9uVXNlXCIpO1xuICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgdHhzdGVwKTtcbiAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCB0eXN0ZXApO1xuICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBgJHt0eDB9YCk7XG4gICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIGAke3R5MH1gKTtcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHN0YXRlLlxuICAgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmc7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1NYXRyaXggPSB0aGlzLnRyYW5zZm9ybU1hdHJpeDtcbiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY3VycmVudC5zdHJva2VDb2xvcjtcblxuICAgICAgY29uc3QgYmJveCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodHgxIC0gdHgwLCB0eTEgLSB0eTApO1xuICAgICAgdGhpcy5zdmcgPSBiYm94O1xuICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBtYXRyaXg7XG4gICAgICBpZiAocGFpbnRUeXBlID09PSAyKSB7XG4gICAgICAgIGNvbnN0IGNzc0NvbG9yID0gVXRpbC5tYWtlQ3NzUmdiKC4uLmNvbG9yKTtcbiAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGNzc0NvbG9yO1xuICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjc3NDb2xvcjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSk7XG5cbiAgICAgIC8vIFJlc3RvcmUgc2F2ZWQgc3RhdGUuXG4gICAgICB0aGlzLnN2ZyA9IHN2ZztcbiAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gdHJhbnNmb3JtTWF0cml4O1xuICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGZpbGxDb2xvcjtcbiAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHN0cm9rZUNvbG9yO1xuXG4gICAgICB0aWxpbmcuYXBwZW5kQ2hpbGQoYmJveC5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIHRoaXMuZGVmcy5hcHBlbmRDaGlsZCh0aWxpbmcpO1xuICAgICAgcmV0dXJuIGB1cmwoIyR7dGlsaW5nSWR9KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfbWFrZVNoYWRpbmdQYXR0ZXJuKGFyZ3MpIHtcbiAgICAgIHN3aXRjaCAoYXJnc1swXSkge1xuICAgICAgICBjYXNlIFwiUmFkaWFsQXhpYWxcIjpcbiAgICAgICAgICBjb25zdCBzaGFkaW5nSWQgPSBgc2hhZGluZyR7c2hhZGluZ0NvdW50Kyt9YDtcbiAgICAgICAgICBjb25zdCBjb2xvclN0b3BzID0gYXJnc1szXTtcbiAgICAgICAgICBsZXQgZ3JhZGllbnQ7XG5cbiAgICAgICAgICBzd2l0Y2ggKGFyZ3NbMV0pIHtcbiAgICAgICAgICAgIGNhc2UgXCJheGlhbFwiOlxuICAgICAgICAgICAgICBjb25zdCBwb2ludDAgPSBhcmdzWzRdO1xuICAgICAgICAgICAgICBjb25zdCBwb2ludDEgPSBhcmdzWzVdO1xuICAgICAgICAgICAgICBncmFkaWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmxpbmVhckdyYWRpZW50XCIpO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIHNoYWRpbmdJZCk7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZ3JhZGllbnRVbml0c1wiLCBcInVzZXJTcGFjZU9uVXNlXCIpO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIngxXCIsIHBvaW50MFswXSk7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTFcIiwgcG9pbnQwWzFdKTtcbiAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4MlwiLCBwb2ludDFbMF0pO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInkyXCIsIHBvaW50MVsxXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlhbFwiOlxuICAgICAgICAgICAgICBjb25zdCBmb2NhbFBvaW50ID0gYXJnc1s0XTtcbiAgICAgICAgICAgICAgY29uc3QgY2lyY2xlUG9pbnQgPSBhcmdzWzVdO1xuICAgICAgICAgICAgICBjb25zdCBmb2NhbFJhZGl1cyA9IGFyZ3NbNl07XG4gICAgICAgICAgICAgIGNvbnN0IGNpcmNsZVJhZGl1cyA9IGFyZ3NbN107XG4gICAgICAgICAgICAgIGdyYWRpZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmFkaWFsR3JhZGllbnRcIik7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgc2hhZGluZ0lkKTtcbiAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJncmFkaWVudFVuaXRzXCIsIFwidXNlclNwYWNlT25Vc2VcIik7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3hcIiwgY2lyY2xlUG9pbnRbMF0pO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN5XCIsIGNpcmNsZVBvaW50WzFdKTtcbiAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJyXCIsIGNpcmNsZVJhZGl1cyk7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZnhcIiwgZm9jYWxQb2ludFswXSk7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZnlcIiwgZm9jYWxQb2ludFsxXSk7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZnJcIiwgZm9jYWxSYWRpdXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBSYWRpYWxBeGlhbCB0eXBlOiAke2FyZ3NbMV19YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgY29sb3JTdG9wIG9mIGNvbG9yU3RvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3AgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpzdG9wXCIpO1xuICAgICAgICAgICAgc3RvcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIm9mZnNldFwiLCBjb2xvclN0b3BbMF0pO1xuICAgICAgICAgICAgc3RvcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0b3AtY29sb3JcIiwgY29sb3JTdG9wWzFdKTtcbiAgICAgICAgICAgIGdyYWRpZW50LmFwcGVuZENoaWxkKHN0b3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQoZ3JhZGllbnQpO1xuICAgICAgICAgIHJldHVybiBgdXJsKCMke3NoYWRpbmdJZH0pYDtcbiAgICAgICAgY2FzZSBcIk1lc2hcIjpcbiAgICAgICAgICB3YXJuKFwiVW5pbXBsZW1lbnRlZCBwYXR0ZXJuIE1lc2hcIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgXCJEdW1teVwiOlxuICAgICAgICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSVIgdHlwZTogJHthcmdzWzBdfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHtcbiAgICAgIHRoaXMuY3VycmVudC5kYXNoQXJyYXkgPSBkYXNoQXJyYXk7XG4gICAgICB0aGlzLmN1cnJlbnQuZGFzaFBoYXNlID0gZGFzaFBoYXNlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdFBhdGgob3BzLCBhcmdzKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgbGV0IHggPSBjdXJyZW50LngsXG4gICAgICAgIHkgPSBjdXJyZW50Lnk7XG4gICAgICBsZXQgZCA9IFtdO1xuICAgICAgbGV0IGogPSAwO1xuXG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgICBzd2l0Y2ggKG9wIHwgMCkge1xuICAgICAgICAgIGNhc2UgT1BTLnJlY3RhbmdsZTpcbiAgICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBhcmdzW2orK107XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhcmdzW2orK107XG4gICAgICAgICAgICBjb25zdCB4dyA9IHggKyB3aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHloID0geSArIGhlaWdodDtcbiAgICAgICAgICAgIGQucHVzaChcbiAgICAgICAgICAgICAgXCJNXCIsXG4gICAgICAgICAgICAgIHBmKHgpLFxuICAgICAgICAgICAgICBwZih5KSxcbiAgICAgICAgICAgICAgXCJMXCIsXG4gICAgICAgICAgICAgIHBmKHh3KSxcbiAgICAgICAgICAgICAgcGYoeSksXG4gICAgICAgICAgICAgIFwiTFwiLFxuICAgICAgICAgICAgICBwZih4dyksXG4gICAgICAgICAgICAgIHBmKHloKSxcbiAgICAgICAgICAgICAgXCJMXCIsXG4gICAgICAgICAgICAgIHBmKHgpLFxuICAgICAgICAgICAgICBwZih5aCksXG4gICAgICAgICAgICAgIFwiWlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubW92ZVRvOlxuICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgICBkLnB1c2goXCJNXCIsIHBmKHgpLCBwZih5KSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5saW5lVG86XG4gICAgICAgICAgICB4ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTtcbiAgICAgICAgICAgIGQucHVzaChcIkxcIiwgcGYoeCksIHBmKHkpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG86XG4gICAgICAgICAgICB4ID0gYXJnc1tqICsgNF07XG4gICAgICAgICAgICB5ID0gYXJnc1tqICsgNV07XG4gICAgICAgICAgICBkLnB1c2goXG4gICAgICAgICAgICAgIFwiQ1wiLFxuICAgICAgICAgICAgICBwZihhcmdzW2pdKSxcbiAgICAgICAgICAgICAgcGYoYXJnc1tqICsgMV0pLFxuICAgICAgICAgICAgICBwZihhcmdzW2ogKyAyXSksXG4gICAgICAgICAgICAgIHBmKGFyZ3NbaiArIDNdKSxcbiAgICAgICAgICAgICAgcGYoeCksXG4gICAgICAgICAgICAgIHBmKHkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaiArPSA2O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzI6XG4gICAgICAgICAgICBkLnB1c2goXG4gICAgICAgICAgICAgIFwiQ1wiLFxuICAgICAgICAgICAgICBwZih4KSxcbiAgICAgICAgICAgICAgcGYoeSksXG4gICAgICAgICAgICAgIHBmKGFyZ3Nbal0pLFxuICAgICAgICAgICAgICBwZihhcmdzW2ogKyAxXSksXG4gICAgICAgICAgICAgIHBmKGFyZ3NbaiArIDJdKSxcbiAgICAgICAgICAgICAgcGYoYXJnc1tqICsgM10pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDJdO1xuICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuICAgICAgICAgICAgaiArPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzM6XG4gICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG4gICAgICAgICAgICB5ID0gYXJnc1tqICsgM107XG4gICAgICAgICAgICBkLnB1c2goXG4gICAgICAgICAgICAgIFwiQ1wiLFxuICAgICAgICAgICAgICBwZihhcmdzW2pdKSxcbiAgICAgICAgICAgICAgcGYoYXJnc1tqICsgMV0pLFxuICAgICAgICAgICAgICBwZih4KSxcbiAgICAgICAgICAgICAgcGYoeSksXG4gICAgICAgICAgICAgIHBmKHgpLFxuICAgICAgICAgICAgICBwZih5KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGogKz0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICAgIGQucHVzaChcIlpcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkID0gZC5qb2luKFwiIFwiKTtcblxuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50LnBhdGggJiZcbiAgICAgICAgb3BzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgb3BzWzBdICE9PSBPUFMucmVjdGFuZ2xlICYmXG4gICAgICAgIG9wc1swXSAhPT0gT1BTLm1vdmVUb1xuICAgICAgKSB7XG4gICAgICAgIC8vIElmIGEgcGF0aCBkb2VzIG5vdCBzdGFydCB3aXRoIGFuIE9QUy5yZWN0YW5nbGUgb3IgT1BTLm1vdmVUbywgaXQgaGFzXG4gICAgICAgIC8vIHByb2JhYmx5IGJlZW4gZGl2aWRlZCBpbnRvIHR3byBPUFMuY29uc3RydWN0UGF0aCBvcGVyYXRvcnMgYnlcbiAgICAgICAgLy8gT3BlcmF0b3JMaXN0LiBBcHBlbmQgdGhlIGNvbW1hbmRzIHRvIHRoZSBwcmV2aW91cyBwYXRoIGVsZW1lbnQuXG4gICAgICAgIGQgPSBjdXJyZW50LnBhdGguZ2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIpICsgZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQucGF0aCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnBhdGhcIik7XG4gICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoY3VycmVudC5wYXRoKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudC5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZFwiLCBkKTtcbiAgICAgIGN1cnJlbnQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJub25lXCIpO1xuXG4gICAgICAvLyBTYXZpbmcgYSByZWZlcmVuY2UgaW4gY3VycmVudC5lbGVtZW50IHNvIHRoYXQgaXQgY2FuIGJlIGFkZHJlc3NlZFxuICAgICAgLy8gaW4gJ2ZpbGwnIGFuZCAnc3Ryb2tlJ1xuICAgICAgY3VycmVudC5lbGVtZW50ID0gY3VycmVudC5wYXRoO1xuICAgICAgY3VycmVudC5zZXRDdXJyZW50UG9pbnQoeCwgeSk7XG4gICAgfVxuXG4gICAgZW5kUGF0aCgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cbiAgICAgIC8vIFBhaW50aW5nIG9wZXJhdG9ycyBlbmQgYSBwYXRoLlxuICAgICAgY3VycmVudC5wYXRoID0gbnVsbDtcblxuICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY3VycmVudC5lbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBwYXRoIHRvIGEgY2xpcHBpbmcgcGF0aC5cbiAgICAgIGNvbnN0IGNsaXBJZCA9IGBjbGlwcGF0aCR7Y2xpcENvdW50Kyt9YDtcbiAgICAgIGNvbnN0IGNsaXBQYXRoID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Y2xpcFBhdGhcIik7XG4gICAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIGNsaXBJZCk7XG4gICAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuXG4gICAgICAvLyBBIGRlZXAgY2xvbmUgaXMgbmVlZGVkIHdoZW4gdGV4dCBpcyB1c2VkIGFzIGEgY2xpcHBpbmcgcGF0aC5cbiAgICAgIGNvbnN0IGNsaXBFbGVtZW50ID0gY3VycmVudC5lbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwID09PSBcImV2ZW5vZGRcIikge1xuICAgICAgICBjbGlwRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsaXAtcnVsZVwiLCBcImV2ZW5vZGRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGlwRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsaXAtcnVsZVwiLCBcIm5vbnplcm9cIik7XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgIGNsaXBQYXRoLmFwcGVuZENoaWxkKGNsaXBFbGVtZW50KTtcbiAgICAgIHRoaXMuZGVmcy5hcHBlbmRDaGlsZChjbGlwUGF0aCk7XG5cbiAgICAgIGlmIChjdXJyZW50LmFjdGl2ZUNsaXBVcmwpIHtcbiAgICAgICAgLy8gVGhlIHByZXZpb3VzIGNsaXBwaW5nIGdyb3VwIGNvbnRlbnQgY2FuIGdvIG91dCBvZiBvcmRlciAtLSByZXNldHRpbmdcbiAgICAgICAgLy8gY2FjaGVkIGNsaXBHcm91cHMuXG4gICAgICAgIGN1cnJlbnQuY2xpcEdyb3VwID0gbnVsbDtcbiAgICAgICAgdGhpcy5leHRyYVN0YWNrLmZvckVhY2goZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICAgICBwcmV2LmNsaXBHcm91cCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJbnRlcnNlY3Qgd2l0aCB0aGUgcHJldmlvdXMgY2xpcHBpbmcgcGF0aC5cbiAgICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXBhdGhcIiwgY3VycmVudC5hY3RpdmVDbGlwVXJsKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQuYWN0aXZlQ2xpcFVybCA9IGB1cmwoIyR7Y2xpcElkfSlgO1xuXG4gICAgICB0aGlzLnRncnAgPSBudWxsO1xuICAgIH1cblxuICAgIGNsaXAodHlwZSkge1xuICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHR5cGU7XG4gICAgfVxuXG4gICAgY2xvc2VQYXRoKCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICAgIGlmIChjdXJyZW50LnBhdGgpIHtcbiAgICAgICAgY29uc3QgZCA9IGAke2N1cnJlbnQucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIil9WmA7XG4gICAgICAgIGN1cnJlbnQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0TGVhZGluZyhsZWFkaW5nKSB7XG4gICAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC1sZWFkaW5nO1xuICAgIH1cblxuICAgIHNldFRleHRSaXNlKHRleHRSaXNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQudGV4dFJpc2UgPSB0ZXh0UmlzZTtcbiAgICB9XG5cbiAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZSh0ZXh0UmVuZGVyaW5nTW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gdGV4dFJlbmRlcmluZ01vZGU7XG4gICAgfVxuXG4gICAgc2V0SFNjYWxlKHNjYWxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHNjYWxlIC8gMTAwO1xuICAgIH1cblxuICAgIHNldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHtcbiAgICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIGlnbm9yZWQgc2luY2Ugd2UgaGF2ZW4ndCBmb3VuZCBhIHVzZSBjYXNlIGZvciBpdCB5ZXQuXG4gICAgfVxuXG4gICAgc2V0RmxhdG5lc3MoZmxhdG5lc3MpIHtcbiAgICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIGlnbm9yZWQgc2luY2Ugd2UgaGF2ZW4ndCBmb3VuZCBhIHVzZSBjYXNlIGZvciBpdCB5ZXQuXG4gICAgfVxuXG4gICAgc2V0R1N0YXRlKHN0YXRlcykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3RhdGVzKSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgY2FzZSBcIkxXXCI6XG4gICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiTENcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4odmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIk1MXCI6XG4gICAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkRcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0RGFzaCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIlJJXCI6XG4gICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiRkxcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3ModmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQ0FcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlQWxwaGEodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImNhXCI6XG4gICAgICAgICAgICB0aGlzLnNldEZpbGxBbHBoYSh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgd2FybihgVW5pbXBsZW1lbnRlZCBncmFwaGljIHN0YXRlIG9wZXJhdG9yICR7a2V5fWApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWxsKCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICAgIGlmIChjdXJyZW50LmVsZW1lbnQpIHtcbiAgICAgICAgY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBjdXJyZW50LmZpbGxDb2xvcik7XG4gICAgICAgIGN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtb3BhY2l0eVwiLCBjdXJyZW50LmZpbGxBbHBoYSk7XG4gICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0cm9rZSgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXMoY3VycmVudC5lbGVtZW50KTtcbiAgICAgICAgY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG4gICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3NldFN0cm9rZUF0dHJpYnV0ZXMoZWxlbWVudCwgbGluZVdpZHRoU2NhbGUgPSAxKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgbGV0IGRhc2hBcnJheSA9IGN1cnJlbnQuZGFzaEFycmF5O1xuICAgICAgaWYgKGxpbmVXaWR0aFNjYWxlICE9PSAxICYmIGRhc2hBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRhc2hBcnJheSA9IGRhc2hBcnJheS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGxpbmVXaWR0aFNjYWxlICogdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZVwiLCBjdXJyZW50LnN0cm9rZUNvbG9yKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2Utb3BhY2l0eVwiLCBjdXJyZW50LnN0cm9rZUFscGhhKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2UtbWl0ZXJsaW1pdFwiLCBwZihjdXJyZW50Lm1pdGVyTGltaXQpKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2UtbGluZWNhcFwiLCBjdXJyZW50LmxpbmVDYXApO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1saW5lam9pblwiLCBjdXJyZW50LmxpbmVKb2luKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwic3Ryb2tlLXdpZHRoXCIsXG4gICAgICAgIHBmKGxpbmVXaWR0aFNjYWxlICogY3VycmVudC5saW5lV2lkdGgpICsgXCJweFwiXG4gICAgICApO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgICAgbnVsbCxcbiAgICAgICAgXCJzdHJva2UtZGFzaGFycmF5XCIsXG4gICAgICAgIGRhc2hBcnJheS5tYXAocGYpLmpvaW4oXCIgXCIpXG4gICAgICApO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgICAgbnVsbCxcbiAgICAgICAgXCJzdHJva2UtZGFzaG9mZnNldFwiLFxuICAgICAgICBwZihsaW5lV2lkdGhTY2FsZSAqIGN1cnJlbnQuZGFzaFBoYXNlKSArIFwicHhcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBlb0ZpbGwoKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50LmVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5maWxsKCk7XG4gICAgfVxuXG4gICAgZmlsbFN0cm9rZSgpIHtcbiAgICAgIC8vIE9yZGVyIGlzIGltcG9ydGFudCBzaW5jZSBzdHJva2Ugd2FudHMgZmlsbCB0byBiZSBub25lLlxuICAgICAgLy8gRmlyc3Qgc3Ryb2tlLCB0aGVuIGlmIGZpbGwgbmVlZGVkLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICAgIHRoaXMuZmlsbCgpO1xuICAgIH1cblxuICAgIGVvRmlsbFN0cm9rZSgpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQuZWxlbWVudCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtcnVsZVwiLCBcImV2ZW5vZGRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICB9XG5cbiAgICBjbG9zZVN0cm9rZSgpIHtcbiAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICB0aGlzLnN0cm9rZSgpO1xuICAgIH1cblxuICAgIGNsb3NlRmlsbFN0cm9rZSgpIHtcbiAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICB9XG5cbiAgICBjbG9zZUVPRmlsbFN0cm9rZSgpIHtcbiAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICB0aGlzLmVvRmlsbFN0cm9rZSgpO1xuICAgIH1cblxuICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIwXCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIFwiMXB4XCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBcIjFweFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIHRoaXMuY3VycmVudC5maWxsQ29sb3IpO1xuXG4gICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKHJlY3QpO1xuICAgIH1cblxuICAgIHBhaW50SW1hZ2VYT2JqZWN0KG9iaklkKSB7XG4gICAgICBjb25zdCBpbWdEYXRhID0gb2JqSWQuc3RhcnRzV2l0aChcImdfXCIpXG4gICAgICAgID8gdGhpcy5jb21tb25PYmpzLmdldChvYmpJZClcbiAgICAgICAgOiB0aGlzLm9ianMuZ2V0KG9iaklkKTtcbiAgICAgIGlmICghaW1nRGF0YSkge1xuICAgICAgICB3YXJuKGBEZXBlbmRlbnQgaW1hZ2Ugd2l0aCBvYmplY3QgSUQgJHtvYmpJZH0gaXMgbm90IHJlYWR5IHlldGApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpO1xuICAgIH1cblxuICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEsIG1hc2spIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuXG4gICAgICBjb25zdCBpbWdTcmMgPSBjb252ZXJ0SW1nRGF0YVRvUG5nKGltZ0RhdGEsIHRoaXMuZm9yY2VEYXRhU2NoZW1hLCAhIW1hc2spO1xuICAgICAgY29uc3QgY2xpcHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcbiAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjBcIik7XG4gICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKHdpZHRoKSk7XG4gICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihoZWlnaHQpKTtcbiAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gY2xpcHJlY3Q7XG4gICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuXG4gICAgICBjb25zdCBpbWdFbCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmltYWdlXCIpO1xuICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMoWExJTktfTlMsIFwieGxpbms6aHJlZlwiLCBpbWdTcmMpO1xuICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcbiAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtaGVpZ2h0KSk7XG4gICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKHdpZHRoKSArIFwicHhcIik7XG4gICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihoZWlnaHQpICsgXCJweFwiKTtcbiAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgICBudWxsLFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgc2NhbGUoJHtwZigxIC8gd2lkdGgpfSAke3BmKC0xIC8gaGVpZ2h0KX0pYFxuICAgICAgKTtcbiAgICAgIGlmIChtYXNrKSB7XG4gICAgICAgIG1hc2suYXBwZW5kQ2hpbGQoaW1nRWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChpbWdFbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0KGltZ0RhdGEpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gICAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcbiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGN1cnJlbnQuZmlsbENvbG9yO1xuXG4gICAgICBjdXJyZW50Lm1hc2tJZCA9IGBtYXNrJHttYXNrQ291bnQrK31gO1xuICAgICAgY29uc3QgbWFzayA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOm1hc2tcIik7XG4gICAgICBtYXNrLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgY3VycmVudC5tYXNrSWQpO1xuXG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBwZih3aWR0aCkpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihoZWlnaHQpKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIGZpbGxDb2xvcik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwibWFza1wiLCBgdXJsKCMke2N1cnJlbnQubWFza0lkfSlgKTtcblxuICAgICAgdGhpcy5kZWZzLmFwcGVuZENoaWxkKG1hc2spO1xuICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChyZWN0KTtcblxuICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhLCBtYXNrKTtcbiAgICB9XG5cbiAgICBwYWludEZvcm1YT2JqZWN0QmVnaW4obWF0cml4LCBiYm94KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRyaXgpICYmIG1hdHJpeC5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0oXG4gICAgICAgICAgbWF0cml4WzBdLFxuICAgICAgICAgIG1hdHJpeFsxXSxcbiAgICAgICAgICBtYXRyaXhbMl0sXG4gICAgICAgICAgbWF0cml4WzNdLFxuICAgICAgICAgIG1hdHJpeFs0XSxcbiAgICAgICAgICBtYXRyaXhbNV1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJib3gpIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07XG5cbiAgICAgICAgY29uc3QgY2xpcHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgYmJveFswXSk7XG4gICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBiYm94WzFdKTtcbiAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBwZih3aWR0aCkpO1xuICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihoZWlnaHQpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50LmVsZW1lbnQgPSBjbGlwcmVjdDtcbiAgICAgICAgdGhpcy5jbGlwKFwibm9uemVyb1wiKTtcbiAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFpbnRGb3JtWE9iamVjdEVuZCgpIHt9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pbml0aWFsaXplKHZpZXdwb3J0KSB7XG4gICAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIGRlZmluaXRpb25zIGVsZW1lbnQuXG4gICAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmRlZnNcIik7XG4gICAgICBzdmcuYXBwZW5kQ2hpbGQoZGVmaW5pdGlvbnMpO1xuICAgICAgdGhpcy5kZWZzID0gZGVmaW5pdGlvbnM7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgcm9vdCBncm91cCBlbGVtZW50LCB3aGljaCBhY3RzIGEgY29udGFpbmVyIGZvciBhbGwgb3RoZXJcbiAgICAgIC8vIGdyb3VwcyBhbmQgYXBwbGllcyB0aGUgdmlld3BvcnQgdHJhbnNmb3JtLlxuICAgICAgY29uc3Qgcm9vdEdyb3VwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgIHJvb3RHcm91cC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh2aWV3cG9ydC50cmFuc2Zvcm0pKTtcbiAgICAgIHN2Zy5hcHBlbmRDaGlsZChyb290R3JvdXApO1xuXG4gICAgICAvLyBGb3IgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgU1ZHIGltYWdlIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlXG4gICAgICAvLyByb290IGdyb3VwLCBzbyB3ZSBleHBvc2UgaXQgYXMgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBTVkcgaW1hZ2UgZm9yXG4gICAgICAvLyB0aGUgb3RoZXIgY29kZSBpbiB0aGlzIGNsYXNzLlxuICAgICAgdGhpcy5zdmcgPSByb290R3JvdXA7XG5cbiAgICAgIHJldHVybiBzdmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZW5zdXJlQ2xpcEdyb3VwKCkge1xuICAgICAgaWYgKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGNsaXBHcm91cCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG4gICAgICAgIGNsaXBHcm91cC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsaXAtcGF0aFwiLCB0aGlzLmN1cnJlbnQuYWN0aXZlQ2xpcFVybCk7XG4gICAgICAgIHRoaXMuc3ZnLmFwcGVuZENoaWxkKGNsaXBHcm91cCk7XG4gICAgICAgIHRoaXMuY3VycmVudC5jbGlwR3JvdXAgPSBjbGlwR3JvdXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmNsaXBHcm91cDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpIHtcbiAgICAgIGlmICghdGhpcy50Z3JwKSB7XG4gICAgICAgIHRoaXMudGdycCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG4gICAgICAgIHRoaXMudGdycC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpIHtcbiAgICAgICAgICB0aGlzLl9lbnN1cmVDbGlwR3JvdXAoKS5hcHBlbmRDaGlsZCh0aGlzLnRncnApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3ZnLmFwcGVuZENoaWxkKHRoaXMudGdycCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRncnA7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgeyBTVkdHcmFwaGljcyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWxzIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fICovXG5cbmltcG9ydCB7XG4gIEFib3J0RXhjZXB0aW9uLFxuICBhc3NlcnQsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBNaXNzaW5nUERGRXhjZXB0aW9uLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7XG4gIGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIsXG4gIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzLFxufSBmcm9tIFwiLi9uZXR3b3JrX3V0aWxzLmpzXCI7XG5cbmlmICh0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiYgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdNb2R1bGUgXCIuL25vZGVfc3RyZWFtLmpzXCIgc2hhbGwgbm90IGJlIHVzZWQgd2l0aCBNT1pDRU5UUkFMIGJ1aWxkcy4nXG4gICk7XG59XG5cbmNvbnN0IGZzID0gX19ub25fd2VicGFja19yZXF1aXJlX18oXCJmc1wiKTtcbmNvbnN0IGh0dHAgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhcImh0dHBcIik7XG5jb25zdCBodHRwcyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKFwiaHR0cHNcIik7XG5jb25zdCB1cmwgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhcInVybFwiKTtcblxuY29uc3QgZmlsZVVyaVJlZ2V4ID0gL15maWxlOlxcL1xcL1xcL1thLXpBLVpdOlxcLy87XG5cbmZ1bmN0aW9uIHBhcnNlVXJsKHNvdXJjZVVybCkge1xuICBjb25zdCBwYXJzZWRVcmwgPSB1cmwucGFyc2Uoc291cmNlVXJsKTtcbiAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gXCJmaWxlOlwiIHx8IHBhcnNlZFVybC5ob3N0KSB7XG4gICAgcmV0dXJuIHBhcnNlZFVybDtcbiAgfVxuICAvLyBQcmVwZW5kaW5nICdmaWxlOi8vLycgdG8gV2luZG93cyBhYnNvbHV0ZSBwYXRoLlxuICBpZiAoL15bYS16XTpbL1xcXFxdL2kudGVzdChzb3VyY2VVcmwpKSB7XG4gICAgcmV0dXJuIHVybC5wYXJzZShgZmlsZTovLy8ke3NvdXJjZVVybH1gKTtcbiAgfVxuICAvLyBDaGFuZ2VzIHByb3RvY29sIHRvICdmaWxlOicgaWYgdXJsIHJlZmVycyB0byBmaWxlc3lzdGVtLlxuICBpZiAoIXBhcnNlZFVybC5ob3N0KSB7XG4gICAgcGFyc2VkVXJsLnByb3RvY29sID0gXCJmaWxlOlwiO1xuICB9XG4gIHJldHVybiBwYXJzZWRVcmw7XG59XG5cbmNsYXNzIFBERk5vZGVTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLnVybCA9IHBhcnNlVXJsKHNvdXJjZS51cmwpO1xuICAgIHRoaXMuaXNIdHRwID1cbiAgICAgIHRoaXMudXJsLnByb3RvY29sID09PSBcImh0dHA6XCIgfHwgdGhpcy51cmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCI7XG4gICAgLy8gQ2hlY2sgaWYgdXJsIHJlZmVycyB0byBmaWxlc3lzdGVtLlxuICAgIHRoaXMuaXNGc1VybCA9IHRoaXMudXJsLnByb3RvY29sID09PSBcImZpbGU6XCI7XG4gICAgdGhpcy5odHRwSGVhZGVycyA9ICh0aGlzLmlzSHR0cCAmJiBzb3VyY2UuaHR0cEhlYWRlcnMpIHx8IHt9O1xuXG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuXG4gIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQgOiAwO1xuICB9XG5cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoXG4gICAgICAhdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsXG4gICAgICBcIlBERk5vZGVTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIlxuICAgICk7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSB0aGlzLmlzRnNVcmxcbiAgICAgID8gbmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcylcbiAgICAgIDogbmV3IFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuXG4gIGdldFJhbmdlUmVhZGVyKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5pc0ZzVXJsXG4gICAgICA/IG5ldyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKVxuICAgICAgOiBuZXcgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIHN0YXJ0LCBlbmQpO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyYW5nZVJlYWRlcik7XG4gICAgcmV0dXJuIHJhbmdlUmVhZGVyO1xuICB9XG5cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7XG4gICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKTtcbiAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIEJhc2VGdWxsUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDsgLy8gb3B0aW9uYWxcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcblxuICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTtcblxuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gbnVsbDtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIGdldCBmaWxlbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cblxuICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgfVxuXG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG5cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpO1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZCgpO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsubGVuZ3RoO1xuICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMub25Qcm9ncmVzcyh7XG4gICAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkLFxuICAgICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhhdCBgcmVhZCgpYCBtZXRob2QgcmV0dXJucyBBcnJheUJ1ZmZlci5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShjaHVuaykuYnVmZmVyO1xuICAgIHJldHVybiB7IHZhbHVlOiBidWZmZXIsIGRvbmU6IGZhbHNlIH07XG4gIH1cblxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgLy8gQ2FsbCBgdGhpcy5fZXJyb3IoKWAgbWV0aG9kIHdoZW4gY2FuY2VsIGlzIGNhbGxlZFxuICAgIC8vIGJlZm9yZSBfcmVhZGFibGVTdHJlYW0gaXMgc2V0LlxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTtcbiAgfVxuXG4gIF9lcnJvcihyZWFzb24pIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cblxuICBfc2V0UmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtO1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgLy8gRGVzdHJveSByZWFkYWJsZSB0byBtaW5pbWl6ZSByZXNvdXJjZSB1c2FnZS5cbiAgICAgIHJlYWRhYmxlU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICB9KTtcblxuICAgIC8vIFdlIG5lZWQgdG8gc3RvcCByZWFkaW5nIHdoZW4gcmFuZ2UgaXMgc3VwcG9ydGVkIGFuZCBzdHJlYW1pbmcgaXNcbiAgICAvLyBkaXNhYmxlZC5cbiAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMuX2Vycm9yKG5ldyBBYm9ydEV4Y2VwdGlvbihcInN0cmVhbWluZyBpcyBkaXNhYmxlZFwiKSk7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJveSBSZWFkYWJsZVN0cmVhbSBpZiBhbHJlYWR5IGluIGVycm9yZWQgc3RhdGUuXG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgQmFzZVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG4gIH1cblxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG5cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKCk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5sZW5ndGg7XG4gICAgaWYgKHRoaXMub25Qcm9ncmVzcykge1xuICAgICAgdGhpcy5vblByb2dyZXNzKHsgbG9hZGVkOiB0aGlzLl9sb2FkZWQgfSk7XG4gICAgfVxuICAgIC8vIEVuc3VyZSB0aGF0IGByZWFkKClgIG1ldGhvZCByZXR1cm5zIEFycmF5QnVmZmVyLlxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7XG4gICAgcmV0dXJuIHsgdmFsdWU6IGJ1ZmZlciwgZG9uZTogZmFsc2UgfTtcbiAgfVxuXG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICAvLyBDYWxsIGB0aGlzLl9lcnJvcigpYCBtZXRob2Qgd2hlbiBjYW5jZWwgaXMgY2FsbGVkXG4gICAgLy8gYmVmb3JlIF9yZWFkYWJsZVN0cmVhbSBpcyBzZXQuXG4gICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0cmVhbSkge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveShyZWFzb24pO1xuICB9XG5cbiAgX2Vycm9yKHJlYXNvbikge1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG5cbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAvLyBEZXN0cm95IHJlYWRhYmxlU3RyZWFtIHRvIG1pbmltaXplIHJlc291cmNlIHVzYWdlLlxuICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG5cbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuICAgIH0pO1xuXG4gICAgLy8gRGVzdHJveSByZWFkYWJsZVN0cmVhbSBpZiBhbHJlYWR5IGluIGVycm9yZWQgc3RhdGUuXG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVxdWVzdE9wdGlvbnMocGFyc2VkVXJsLCBoZWFkZXJzKSB7XG4gIHJldHVybiB7XG4gICAgcHJvdG9jb2w6IHBhcnNlZFVybC5wcm90b2NvbCxcbiAgICBhdXRoOiBwYXJzZWRVcmwuYXV0aCxcbiAgICBob3N0OiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgcG9ydDogcGFyc2VkVXJsLnBvcnQsXG4gICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsXG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIGhlYWRlcnMsXG4gIH07XG59XG5cbmNsYXNzIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuXG4gICAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSByZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHt0aGlzLl91cmx9XCIuYCk7XG4gICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTtcblxuICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaGVhZGVycyBuYW1lIGFyZSBpbiBsb3dlciBjYXNlLCBhcyBtZW50aW9uZWRcbiAgICAgICAgLy8gaGVyZTogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnMuXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgICB9O1xuICAgICAgY29uc3Qge1xuICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsXG4gICAgICAgIHN1Z2dlc3RlZExlbmd0aCxcbiAgICAgIH0gPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7XG4gICAgICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgICBpc0h0dHA6IHN0cmVhbS5pc0h0dHAsXG4gICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2UsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0cztcbiAgICAgIC8vIFNldHRpbmcgcmlnaHQgY29udGVudCBsZW5ndGguXG4gICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cbiAgICAgIHRoaXMuX2ZpbGVuYW1lID0gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgfTtcblxuICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgIGlmICh0aGlzLl91cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIikge1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChcbiAgICAgICAgY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCBzdHJlYW0uaHR0cEhlYWRlcnMpLFxuICAgICAgICBoYW5kbGVSZXNwb25zZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QoXG4gICAgICAgIGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSxcbiAgICAgICAgaGFuZGxlUmVzcG9uc2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIH0pO1xuICAgIC8vIE5vdGU6IGByZXF1ZXN0LmVuZChkYXRhKWAgaXMgdXNlZCB0byB3cml0ZSBgZGF0YWAgdG8gcmVxdWVzdCBib2R5XG4gICAgLy8gYW5kIG5vdGlmeSBlbmQgb2YgcmVxdWVzdC4gQnV0IG9uZSBzaG91bGQgYWx3YXlzIGNhbGwgYHJlcXVlc3QuZW5kKClgXG4gICAgLy8gZXZlbiBpZiB0aGVyZSBpcyBubyBkYXRhIHRvIHdyaXRlIC0tICh0byBub3RpZnkgdGhlIGVuZCBvZiByZXF1ZXN0KS5cbiAgICB0aGlzLl9yZXF1ZXN0LmVuZCgpO1xuICB9XG59XG5cbmNsYXNzIFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG5cbiAgICB0aGlzLl9odHRwSGVhZGVycyA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gc3RyZWFtLmh0dHBIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHN0cmVhbS5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5faHR0cEhlYWRlcnNbcHJvcGVydHldID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuX2h0dHBIZWFkZXJzLlJhbmdlID0gYGJ5dGVzPSR7c3RhcnR9LSR7ZW5kIC0gMX1gO1xuXG4gICAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSByZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHt0aGlzLl91cmx9XCIuYCk7XG4gICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3VybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0KFxuICAgICAgICBjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSxcbiAgICAgICAgaGFuZGxlUmVzcG9uc2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KFxuICAgICAgICBjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSxcbiAgICAgICAgaGFuZGxlUmVzcG9uc2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0LmVuZCgpO1xuICB9XG59XG5cbmNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG5cbiAgICBsZXQgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLl91cmwucGF0aCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGV4dHJhIHNsYXNoIHRvIGdldCByaWdodCBwYXRoIGZyb20gdXJsIGxpa2UgYGZpbGU6Ly8vQzovYFxuICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcbiAgICB9XG5cbiAgICBmcy5sc3RhdChwYXRoLCAoZXJyb3IsIHN0YXQpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIikge1xuICAgICAgICAgIGVycm9yID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHtwYXRofVwiLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFNldHRpbmcgcmlnaHQgY29udGVudCBsZW5ndGguXG4gICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3RhdC5zaXplO1xuXG4gICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgpKTtcbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG5cbiAgICBsZXQgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLl91cmwucGF0aCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGV4dHJhIHNsYXNoIHRvIGdldCByaWdodCBwYXRoIGZyb20gdXJsIGxpa2UgYGZpbGU6Ly8vQzovYFxuICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgsIHsgc3RhcnQsIGVuZDogZW5kIC0gMSB9KSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGTm9kZVN0cmVhbSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIGFzc2VydCxcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbixcbiAgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciB9IGZyb20gXCIuL2NvbnRlbnRfZGlzcG9zaXRpb24uanNcIjtcblxuZnVuY3Rpb24gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICBnZXRSZXNwb25zZUhlYWRlcixcbiAgaXNIdHRwLFxuICByYW5nZUNodW5rU2l6ZSxcbiAgZGlzYWJsZVJhbmdlLFxufSkge1xuICBhc3NlcnQocmFuZ2VDaHVua1NpemUgPiAwLCBcIlJhbmdlIGNodW5rIHNpemUgbXVzdCBiZSBsYXJnZXIgdGhhbiB6ZXJvXCIpO1xuICBjb25zdCByZXR1cm5WYWx1ZXMgPSB7XG4gICAgYWxsb3dSYW5nZVJlcXVlc3RzOiBmYWxzZSxcbiAgICBzdWdnZXN0ZWRMZW5ndGg6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBsZW5ndGggPSBwYXJzZUludChnZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIpLCAxMCk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuXG4gIHJldHVyblZhbHVlcy5zdWdnZXN0ZWRMZW5ndGggPSBsZW5ndGg7XG5cbiAgaWYgKGxlbmd0aCA8PSAyICogcmFuZ2VDaHVua1NpemUpIHtcbiAgICAvLyBUaGUgZmlsZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiB0d28gY2h1bmtzLCBzbyBpdCBkb2VzIG5vdFxuICAgIC8vIG1ha2UgYW55IHNlbnNlIHRvIGFib3J0IHRoZSByZXF1ZXN0IGFuZCByZXRyeSB3aXRoIGEgcmFuZ2UgcmVxdWVzdC5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG5cbiAgaWYgKGRpc2FibGVSYW5nZSB8fCAhaXNIdHRwKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICBpZiAoZ2V0UmVzcG9uc2VIZWFkZXIoXCJBY2NlcHQtUmFuZ2VzXCIpICE9PSBcImJ5dGVzXCIpIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG5cbiAgY29uc3QgY29udGVudEVuY29kaW5nID0gZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LUVuY29kaW5nXCIpIHx8IFwiaWRlbnRpdHlcIjtcbiAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPT0gXCJpZGVudGl0eVwiKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuXG4gIHJldHVyblZhbHVlcy5hbGxvd1JhbmdlUmVxdWVzdHMgPSB0cnVlO1xuICByZXR1cm4gcmV0dXJuVmFsdWVzO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKSB7XG4gIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1EaXNwb3NpdGlvblwiKTtcbiAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbikge1xuICAgIGxldCBmaWxlbmFtZSA9IGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcihjb250ZW50RGlzcG9zaXRpb24pO1xuICAgIGlmIChmaWxlbmFtZS5pbmNsdWRlcyhcIiVcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbGVuYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7fVxuICAgIH1cbiAgICBpZiAoL1xcLnBkZiQvaS50ZXN0KGZpbGVuYW1lKSkge1xuICAgICAgcmV0dXJuIGZpbGVuYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihzdGF0dXMsIHVybCkge1xuICBpZiAoc3RhdHVzID09PSA0MDQgfHwgKHN0YXR1cyA9PT0gMCAmJiB1cmwuc3RhcnRzV2l0aChcImZpbGU6XCIpKSkge1xuICAgIHJldHVybiBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbignTWlzc2luZyBQREYgXCInICsgdXJsICsgJ1wiLicpO1xuICB9XG4gIHJldHVybiBuZXcgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKFxuICAgIFwiVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UgKFwiICtcbiAgICAgIHN0YXR1cyArXG4gICAgICAnKSB3aGlsZSByZXRyaWV2aW5nIFBERiBcIicgK1xuICAgICAgdXJsICtcbiAgICAgICdcIi4nLFxuICAgIHN0YXR1c1xuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHN0YXR1cykge1xuICByZXR1cm4gc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDY7XG59XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IsXG4gIGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIsXG4gIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzLFxuICB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBUaGlzIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciBmdW5jdGlvbiBpcyBhZGFwdGVkIGZyb21cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Sb2ItLVcvb3Blbi1pbi1icm93c2VyL2Jsb2IvN2UyZTM1YTM4YjhiNGU5ODFiMTFkYTdiMmYwMWRmMDE0OTA0OWU5Mi9leHRlbnNpb24vY29udGVudC1kaXNwb3NpdGlvbi5qc1xuLy8gd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6XG4vLyAtIE1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gUERGLmpzJ3MgY29kaW5nIHN0eWxlLlxuLy8gLSBTdXBwb3J0IFVURi04IGRlY29kaW5nIHdoZW4gVGV4dERlY29kZXIgaXMgdW5zdXBwb3J0ZWQuXG4vLyAtIE1vdmUgcmV0dXJuIHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIHRvIHByZXZlbnQgQmFiZWwgZnJvbSBkcm9wcGluZyB0aGVcbi8vICAgZnVuY3Rpb24gZGVjbGFyYXRpb25zLlxuXG4vKipcbiAqIEV4dHJhY3QgZmlsZSBuYW1lIGZyb20gdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnREaXNwb3NpdGlvblxuICogQHJldHVybnMge3N0cmluZ30gRmlsZW5hbWUsIGlmIGZvdW5kIGluIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlci5cbiAqL1xuZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKGNvbnRlbnREaXNwb3NpdGlvbikge1xuICBsZXQgbmVlZHNFbmNvZGluZ0ZpeHVwID0gdHJ1ZTtcblxuICAvLyBmaWxlbmFtZSo9ZXh0LXZhbHVlIChcImV4dC12YWx1ZVwiIGZyb20gUkZDIDU5ODcsIHJlZmVyZW5jZWQgYnkgUkZDIDYyNjYpLlxuICBsZXQgdG1wID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCpcIiwgXCJpXCIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcbiAgaWYgKHRtcCkge1xuICAgIHRtcCA9IHRtcFsxXTtcbiAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApO1xuICAgIGZpbGVuYW1lID0gdW5lc2NhcGUoZmlsZW5hbWUpO1xuICAgIGZpbGVuYW1lID0gcmZjNTk4N2RlY29kZShmaWxlbmFtZSk7XG4gICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cblxuICAvLyBDb250aW51YXRpb25zIChSRkMgMjIzMSBzZWN0aW9uIDMsIHJlZmVyZW5jZWQgYnkgUkZDIDU5ODcgc2VjdGlvbiAzLjEpLlxuICAvLyBmaWxlbmFtZSpuKj1wYXJ0XG4gIC8vIGZpbGVuYW1lKm49cGFydFxuICB0bXAgPSByZmMyMjMxZ2V0cGFyYW0oY29udGVudERpc3Bvc2l0aW9uKTtcbiAgaWYgKHRtcCkge1xuICAgIC8vIFJGQyAyMDQ3LCBzZWN0aW9uXG4gICAgY29uc3QgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKHRtcCk7XG4gICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpO1xuICB9XG5cbiAgLy8gZmlsZW5hbWU9dmFsdWUgKFJGQyA1OTg3LCBzZWN0aW9uIDQuMSkuXG4gIHRtcCA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVwiLCBcImlcIikuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pO1xuICBpZiAodG1wKSB7XG4gICAgdG1wID0gdG1wWzFdO1xuICAgIGxldCBmaWxlbmFtZSA9IHJmYzI2MTZ1bnF1b3RlKHRtcCk7XG4gICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cblxuICAvLyBBZnRlciB0aGlzIGxpbmUgdGhlcmUgYXJlIG9ubHkgZnVuY3Rpb24gZGVjbGFyYXRpb25zLiBXZSBjYW5ub3QgcHV0XG4gIC8vIFwicmV0dXJuXCIgaGVyZSBmb3IgcmVhZGFiaWxpdHkgYmVjYXVzZSBiYWJlbCB3b3VsZCB0aGVuIGRyb3AgdGhlIGZ1bmN0aW9uXG4gIC8vIGRlY2xhcmF0aW9ucy4uLlxuICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKGF0dHJpYnV0ZVBhdHRlcm4sIGZsYWdzKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBcIig/Ol58OylcXFxccypcIiArXG4gICAgICAgIGF0dHJpYnV0ZVBhdHRlcm4gK1xuICAgICAgICBcIlxcXFxzKj1cXFxccypcIiArXG4gICAgICAgIC8vIENhcHR1cmVzOiB2YWx1ZSA9IHRva2VuIHwgcXVvdGVkLXN0cmluZ1xuICAgICAgICAvLyAoUkZDIDI2MTYsIHNlY3Rpb24gMy42IGFuZCByZWZlcmVuY2VkIGJ5IFJGQyA2MjY2IDQuMSlcbiAgICAgICAgXCIoXCIgK1xuICAgICAgICAnW15cIjtcXFxcc11bXjtcXFxcc10qJyArXG4gICAgICAgIFwifFwiICtcbiAgICAgICAgJ1wiKD86W15cIlxcXFxcXFxcXXxcXFxcXFxcXFwiPykrXCI/JyArXG4gICAgICAgIFwiKVwiLFxuICAgICAgZmxhZ3NcbiAgICApO1xuICB9XG4gIGZ1bmN0aW9uIHRleHRkZWNvZGUoZW5jb2RpbmcsIHZhbHVlKSB7XG4gICAgaWYgKGVuY29kaW5nKSB7XG4gICAgICBpZiAoIS9eW1xceDAwLVxceEZGXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nLCB7IGZhdGFsOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBieXRlcyA9IEFycmF5LmZyb20odmFsdWUsIGZ1bmN0aW9uIChjaCkge1xuICAgICAgICAgIHJldHVybiBjaC5jaGFyQ29kZUF0KDApICYgMHhmZjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlID0gZGVjb2Rlci5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpKTtcbiAgICAgICAgbmVlZHNFbmNvZGluZ0ZpeHVwID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFRleHREZWNvZGVyIGNvbnN0cnVjdG9yIHRocmV3IC0gdW5yZWNvZ25pemVkIGVuY29kaW5nLlxuICAgICAgICAvLyBPciBUZXh0RGVjb2RlciBBUEkgaXMgbm90IGF2YWlsYWJsZSAoaW4gSUUgLyBFZGdlKS5cbiAgICAgICAgaWYgKC9edXRmLT84JC9pLnRlc3QoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgLy8gVVRGLTggaXMgY29tbW9ubHkgdXNlZCwgdHJ5IHRvIHN1cHBvcnQgaXQgaW4gYW5vdGhlciB3YXk6XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh2YWx1ZSkpO1xuICAgICAgICAgICAgbmVlZHNFbmNvZGluZ0ZpeHVwID0gZmFsc2U7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBmaXh1cEVuY29kaW5nKHZhbHVlKSB7XG4gICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCAmJiAvW1xceDgwLVxceGZmXS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIC8vIE1heWJlIG11bHRpLWJ5dGUgVVRGLTguXG4gICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoXCJ1dGYtOFwiLCB2YWx1ZSk7XG4gICAgICBpZiAobmVlZHNFbmNvZGluZ0ZpeHVwKSB7XG4gICAgICAgIC8vIFRyeSBpc28tODg1OS0xIGVuY29kaW5nLlxuICAgICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoXCJpc28tODg1OS0xXCIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb25TdHIpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgbGV0IG1hdGNoO1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZmlsZW5hbWUqbj0gYW5kIGZpbGVuYW1lKm4qPSB3aXRoIG4gYmVpbmcgYW4gaW50ZWdlclxuICAgIC8vIG9mIGF0IGxlYXN0IHplcm8uIEFueSBub24temVybyBudW1iZXIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnMCcuXG4gICAgY29uc3QgaXRlciA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqKCg/ITBcXFxcZClcXFxcZCspKFxcXFwqPylcIiwgXCJpZ1wiKTtcbiAgICB3aGlsZSAoKG1hdGNoID0gaXRlci5leGVjKGNvbnRlbnREaXNwb3NpdGlvblN0cikpICE9PSBudWxsKSB7XG4gICAgICBsZXQgWywgbiwgcXVvdCwgcGFydF0gPSBtYXRjaDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIG4gPSBwYXJzZUludChuLCAxMCk7XG4gICAgICBpZiAobiBpbiBtYXRjaGVzKSB7XG4gICAgICAgIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciB0aGUgaW52YWxpZCBzZWNvbmQgZmlsZW5hbWUqMC5cbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1hdGNoZXNbbl0gPSBbcXVvdCwgcGFydF07XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCBtYXRjaGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICBpZiAoIShuIGluIG1hdGNoZXMpKSB7XG4gICAgICAgIC8vIE51bWJlcnMgbXVzdCBiZSBjb25zZWN1dGl2ZS4gVHJ1bmNhdGUgd2hlbiB0aGVyZSBpcyBhIGhvbGUuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGV0IFtxdW90LCBwYXJ0XSA9IG1hdGNoZXNbbl07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICBwYXJ0ID0gcmZjMjYxNnVucXVvdGUocGFydCk7XG4gICAgICBpZiAocXVvdCkge1xuICAgICAgICBwYXJ0ID0gdW5lc2NhcGUocGFydCk7XG4gICAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgICAgcGFydCA9IHJmYzU5ODdkZWNvZGUocGFydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhcnRzLnB1c2gocGFydCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzI2MTZ1bnF1b3RlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc2xpY2UoMSkuc3BsaXQoJ1xcXFxcIicpO1xuICAgICAgLy8gRmluZCB0aGUgZmlyc3QgdW5lc2NhcGVkIFwiIGFuZCB0ZXJtaW5hdGUgdGhlcmUuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHF1b3RpbmRleCA9IHBhcnRzW2ldLmluZGV4T2YoJ1wiJyk7XG4gICAgICAgIGlmIChxdW90aW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5zbGljZSgwLCBxdW90aW5kZXgpO1xuICAgICAgICAgIHBhcnRzLmxlbmd0aCA9IGkgKyAxOyAvLyBUcnVuY2F0ZXMgYW5kIHN0b3AgdGhlIGl0ZXJhdGlvbi5cbiAgICAgICAgfVxuICAgICAgICBwYXJ0c1tpXSA9IHBhcnRzW2ldLnJlcGxhY2UoL1xcXFwoLikvZywgXCIkMVwiKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gcGFydHMuam9pbignXCInKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzU5ODdkZWNvZGUoZXh0dmFsdWUpIHtcbiAgICAvLyBEZWNvZGVzIFwiZXh0LXZhbHVlXCIgZnJvbSBSRkMgNTk4Ny5cbiAgICBjb25zdCBlbmNvZGluZ2VuZCA9IGV4dHZhbHVlLmluZGV4T2YoXCInXCIpO1xuICAgIGlmIChlbmNvZGluZ2VuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFNvbWUgc2VydmVycyBzZW5kIFwiZmlsZW5hbWUqPVwiIHdpdGhvdXQgZW5jb2RpbmcgJ2xhbmd1YWdlJyBwcmVmaXgsXG4gICAgICAvLyBlLmcuIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9Sb2ItLVcvb3Blbi1pbi1icm93c2VyL2lzc3Vlcy8yNlxuICAgICAgLy8gTGV0J3MgYWNjZXB0IHRoZSB2YWx1ZSBsaWtlIEZpcmVmb3ggKDU3KSAoQ2hyb21lIDYyIHJlamVjdHMgaXQpLlxuICAgICAgcmV0dXJuIGV4dHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGluZyA9IGV4dHZhbHVlLnNsaWNlKDAsIGVuY29kaW5nZW5kKTtcbiAgICBjb25zdCBsYW5ndmFsdWUgPSBleHR2YWx1ZS5zbGljZShlbmNvZGluZ2VuZCArIDEpO1xuICAgIC8vIElnbm9yZSBsYW5ndWFnZSAoUkZDIDU5ODcgc2VjdGlvbiAzLjIuMSwgYW5kIFJGQyA2MjY2IHNlY3Rpb24gNC4xICkuXG4gICAgY29uc3QgdmFsdWUgPSBsYW5ndmFsdWUucmVwbGFjZSgvXlteJ10qJy8sIFwiXCIpO1xuICAgIHJldHVybiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmZjMjA0N2RlY29kZSh2YWx1ZSkge1xuICAgIC8vIFJGQyAyMDQ3LWRlY29kZSB0aGUgcmVzdWx0LiBGaXJlZm94IHRyaWVkIHRvIGRyb3Agc3VwcG9ydCBmb3IgaXQsIGJ1dFxuICAgIC8vIGJhY2tlZCBvdXQgYmVjYXVzZSBzb21lIHNlcnZlcnMgdXNlIGl0IC0gaHR0cHM6Ly9idWd6aWwubGEvODc1NjE1XG4gICAgLy8gRmlyZWZveCdzIGNvbmRpdGlvbiBmb3IgZGVjb2RpbmcgaXMgaGVyZTogaHR0cHM6Ly9zZWFyY2hmb3gub3JnL21vemlsbGEtY2VudHJhbC9yZXYvNGE1OTBhNWExNWUzNWQ4OGEzYjIzZGQ2YWMzYzQ3MWNmODViMDRhOC9uZXR3ZXJrL21pbWUvbnNNSU1FSGVhZGVyUGFyYW1JbXBsLmNwcCM3NDItNzQ4XG5cbiAgICAvLyBXZSBhcmUgbW9yZSBzdHJpY3QgYW5kIG9ubHkgcmVjb2duaXplIFJGQyAyMDQ3LWVuY29kaW5nIGlmIHRoZSB2YWx1ZVxuICAgIC8vIHN0YXJ0cyB3aXRoIFwiPT9cIiwgc2luY2UgdGhlbiBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgZnVsbCB2YWx1ZSBpc1xuICAgIC8vIFJGQyAyMDQ3LWVuY29kZWQuXG5cbiAgICAvLyBGaXJlZm94IGFsc28gZGVjb2RlcyB3b3JkcyBldmVuIHdoZXJlIFJGQyAyMDQ3IHNlY3Rpb24gNSBzdGF0ZXM6XG4gICAgLy8gXCJBbiAnZW5jb2RlZC13b3JkJyBNVVNUIE5PVCBhcHBlYXIgd2l0aGluIGEgJ3F1b3RlZC1zdHJpbmcnLlwiXG4gICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKFwiPT9cIikgfHwgL1tcXHgwMC1cXHgxOVxceDgwLVxceGZmXS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLy8gUkZDIDIwNDcsIHNlY3Rpb24gMi40XG4gICAgLy8gZW5jb2RlZC13b3JkID0gXCI9P1wiIGNoYXJzZXQgXCI/XCIgZW5jb2RpbmcgXCI/XCIgZW5jb2RlZC10ZXh0IFwiPz1cIlxuICAgIC8vIGNoYXJzZXQgPSB0b2tlbiAoYnV0IGxldCdzIHJlc3RyaWN0IHRvIGNoYXJhY3RlcnMgdGhhdCBkZW5vdGUgYVxuICAgIC8vICAgICAgIHBvc3NpYmx5IHZhbGlkIGVuY29kaW5nKS5cbiAgICAvLyBlbmNvZGluZyA9IHEgb3IgYlxuICAgIC8vIGVuY29kZWQtdGV4dCA9IGFueSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyIG90aGVyIHRoYW4gPyBvciBzcGFjZS5cbiAgICAvLyAgICAgICAgLi4uIGJ1dCBGaXJlZm94IHBlcm1pdHMgPyBhbmQgc3BhY2UuXG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoXG4gICAgICAvPVxcPyhbXFx3LV0qKVxcPyhbUXFCYl0pXFw/KCg/OlteP118XFw/KD8hPSkpKilcXD89L2csXG4gICAgICBmdW5jdGlvbiAobWF0Y2hlcywgY2hhcnNldCwgZW5jb2RpbmcsIHRleHQpIHtcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSBcInFcIiB8fCBlbmNvZGluZyA9PT0gXCJRXCIpIHtcbiAgICAgICAgICAvLyBSRkMgMjA0NyBzZWN0aW9uIDQuMi5cbiAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9fL2csIFwiIFwiKTtcbiAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC89KFswLTlhLWZBLUZdezJ9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIGhleCkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LCAxNikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKGNoYXJzZXQsIHRleHQpO1xuICAgICAgICB9IC8vIGVsc2UgZW5jb2RpbmcgaXMgYiBvciBCIC0gYmFzZTY0IChSRkMgMjA0NyBzZWN0aW9uIDQuMSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0ZXh0ID0gYXRvYih0ZXh0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgcmV0dXJuIHRleHRkZWNvZGUoY2hhcnNldCwgdGV4dCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBcIlwiO1xufVxuXG5leHBvcnQgeyBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgc3RyaW5nVG9CeXRlcyxcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yLFxuICBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyLFxuICB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyxcbn0gZnJvbSBcIi4vbmV0d29ya191dGlscy5qc1wiO1xuXG5pZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMXCIpKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnTW9kdWxlIFwiLi9uZXR3b3JrLmpzXCIgc2hhbGwgbm90IGJlIHVzZWQgd2l0aCBNT1pDRU5UUkFMIGJ1aWxkcy4nXG4gICk7XG59XG5cbmNvbnN0IE9LX1JFU1BPTlNFID0gMjAwO1xuY29uc3QgUEFSVElBTF9DT05URU5UX1JFU1BPTlNFID0gMjA2O1xuXG5mdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih4aHIpIHtcbiAgY29uc3QgZGF0YSA9IHhoci5yZXNwb25zZTtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3QgYXJyYXkgPSBzdHJpbmdUb0J5dGVzKGRhdGEpO1xuICByZXR1cm4gYXJyYXkuYnVmZmVyO1xufVxuXG5jbGFzcyBOZXR3b3JrTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKHVybCwgYXJncykge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh1cmwpO1xuICAgIHRoaXMuaHR0cEhlYWRlcnMgPSAodGhpcy5pc0h0dHAgJiYgYXJncy5odHRwSGVhZGVycykgfHwge307XG4gICAgdGhpcy53aXRoQ3JlZGVudGlhbHMgPSBhcmdzLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICB0aGlzLmdldFhociA9XG4gICAgICBhcmdzLmdldFhociB8fFxuICAgICAgZnVuY3Rpb24gTmV0d29ya01hbmFnZXJfZ2V0WGhyKCkge1xuICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICB9O1xuXG4gICAgdGhpcy5jdXJyWGhySWQgPSAwO1xuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBsaXN0ZW5lcnMpIHtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgYmVnaW4sXG4gICAgICBlbmQsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBhcmdzW3Byb3BdID0gbGlzdGVuZXJzW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGFyZ3MpO1xuICB9XG5cbiAgcmVxdWVzdEZ1bGwobGlzdGVuZXJzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChsaXN0ZW5lcnMpO1xuICB9XG5cbiAgcmVxdWVzdChhcmdzKSB7XG4gICAgY29uc3QgeGhyID0gdGhpcy5nZXRYaHIoKTtcbiAgICBjb25zdCB4aHJJZCA9IHRoaXMuY3VyclhocklkKys7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSAodGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdID0ge1xuICAgICAgeGhyLFxuICAgIH0pO1xuXG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgdGhpcy51cmwpO1xuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFscztcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuaHR0cEhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIocHJvcGVydHksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNIdHRwICYmIFwiYmVnaW5cIiBpbiBhcmdzICYmIFwiZW5kXCIgaW4gYXJncykge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLCBgYnl0ZXM9JHthcmdzLmJlZ2lufS0ke2FyZ3MuZW5kIC0gMX1gKTtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9IE9LX1JFU1BPTlNFO1xuICAgIH1cbiAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuXG4gICAgaWYgKGFyZ3Mub25FcnJvcikge1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIGFyZ3Mub25FcnJvcih4aHIuc3RhdHVzKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzLCB4aHJJZCk7XG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzLCB4aHJJZCk7XG5cbiAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCA9IGFyZ3Mub25IZWFkZXJzUmVjZWl2ZWQ7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lID0gYXJncy5vbkRvbmU7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvciA9IGFyZ3Mub25FcnJvcjtcbiAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzID0gYXJncy5vblByb2dyZXNzO1xuXG4gICAgeGhyLnNlbmQobnVsbCk7XG5cbiAgICByZXR1cm4geGhySWQ7XG4gIH1cblxuICBvblByb2dyZXNzKHhocklkLCBldnQpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcbiAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICAvLyBNYXliZSBhYm9ydFJlcXVlc3Qgd2FzIGNhbGxlZC4uLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzKGV2dCk7XG4gICAgfVxuICB9XG5cbiAgb25TdGF0ZUNoYW5nZSh4aHJJZCwgZXZ0KSB7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgLy8gTWF5YmUgYWJvcnRSZXF1ZXN0IHdhcyBjYWxsZWQuLi5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBwZW5kaW5nUmVxdWVzdC54aHI7XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlID49IDIgJiYgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQpIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkKCk7XG4gICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoeGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSB7XG4gICAgICAvLyBUaGUgWEhSIHJlcXVlc3QgbWlnaHQgaGF2ZSBiZWVuIGFib3J0ZWQgaW4gb25IZWFkZXJzUmVjZWl2ZWQoKVxuICAgICAgLy8gY2FsbGJhY2ssIGluIHdoaWNoIGNhc2Ugd2Ugc2hvdWxkIGFib3J0IHJlcXVlc3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcblxuICAgIC8vIFN1Y2Nlc3Mgc3RhdHVzID09IDAgY2FuIGJlIG9uIGZ0cCwgZmlsZSBhbmQgb3RoZXIgcHJvdG9jb2xzLlxuICAgIGlmICh4aHIuc3RhdHVzID09PSAwICYmIHRoaXMuaXNIdHRwKSB7XG4gICAgICBpZiAocGVuZGluZ1JlcXVlc3Qub25FcnJvcikge1xuICAgICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yKHhoci5zdGF0dXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB4aHJTdGF0dXMgPSB4aHIuc3RhdHVzIHx8IE9LX1JFU1BPTlNFO1xuXG4gICAgLy8gRnJvbSBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuMzUuMjpcbiAgICAvLyBcIkEgc2VydmVyIE1BWSBpZ25vcmUgdGhlIFJhbmdlIGhlYWRlclwiLiBUaGlzIG1lYW5zIGl0J3MgcG9zc2libGUgdG9cbiAgICAvLyBnZXQgYSAyMDAgcmF0aGVyIHRoYW4gYSAyMDYgcmVzcG9uc2UgZnJvbSBhIHJhbmdlIHJlcXVlc3QuXG4gICAgY29uc3Qgb2tfcmVzcG9uc2Vfb25fcmFuZ2VfcmVxdWVzdCA9XG4gICAgICB4aHJTdGF0dXMgPT09IE9LX1JFU1BPTlNFICYmXG4gICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9PT0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFO1xuXG4gICAgaWYgKFxuICAgICAgIW9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QgJiZcbiAgICAgIHhoclN0YXR1cyAhPT0gcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXNcbiAgICApIHtcbiAgICAgIGlmIChwZW5kaW5nUmVxdWVzdC5vbkVycm9yKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IoeGhyLnN0YXR1cyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2h1bmsgPSBnZXRBcnJheUJ1ZmZlcih4aHIpO1xuICAgIGlmICh4aHJTdGF0dXMgPT09IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRSkge1xuICAgICAgY29uc3QgcmFuZ2VIZWFkZXIgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVJhbmdlXCIpO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IC9ieXRlcyAoXFxkKyktKFxcZCspXFwvKFxcZCspLy5leGVjKHJhbmdlSGVhZGVyKTtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSh7XG4gICAgICAgIGJlZ2luOiBwYXJzZUludChtYXRjaGVzWzFdLCAxMCksXG4gICAgICAgIGNodW5rLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjaHVuaykge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHtcbiAgICAgICAgYmVnaW46IDAsXG4gICAgICAgIGNodW5rLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nUmVxdWVzdC5vbkVycm9yKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yKHhoci5zdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIGdldFJlcXVlc3RYaHIoeGhySWQpIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdLnhocjtcbiAgfVxuXG4gIGlzUGVuZGluZ1JlcXVlc3QoeGhySWQpIHtcbiAgICByZXR1cm4geGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHM7XG4gIH1cblxuICBhYm9ydFJlcXVlc3QoeGhySWQpIHtcbiAgICBjb25zdCB4aHIgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0ueGhyO1xuICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgeGhyLmFib3J0KCk7XG4gIH1cbn1cblxuLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtfSAqL1xuY2xhc3MgUERGTmV0d29ya1N0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgIHRoaXMuX3NvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLl9tYW5hZ2VyID0gbmV3IE5ldHdvcmtNYW5hZ2VyKHNvdXJjZS51cmwsIHtcbiAgICAgIGh0dHBIZWFkZXJzOiBzb3VyY2UuaHR0cEhlYWRlcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMsXG4gICAgfSk7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuXG4gIF9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZChyZWFkZXIpIHtcbiAgICBjb25zdCBpID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5pbmRleE9mKHJlYWRlcik7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoXG4gICAgICAhdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsXG4gICAgICBcIlBERk5ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIlxuICAgICk7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyKFxuICAgICAgdGhpcy5fbWFuYWdlcixcbiAgICAgIHRoaXMuX3NvdXJjZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICB9XG5cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKFxuICAgICAgdGhpcy5fbWFuYWdlcixcbiAgICAgIGJlZ2luLFxuICAgICAgZW5kXG4gICAgKTtcbiAgICByZWFkZXIub25DbG9zZWQgPSB0aGlzLl9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cblxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHtcbiAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKTtcbiAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbVJlYWRlcn0gKi9cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKG1hbmFnZXIsIHNvdXJjZSkge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuXG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIG9uSGVhZGVyc1JlY2VpdmVkOiB0aGlzLl9vbkhlYWRlcnNSZWNlaXZlZC5iaW5kKHRoaXMpLFxuICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcbiAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIG9uUHJvZ3Jlc3M6IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKSxcbiAgICB9O1xuICAgIHRoaXMuX3VybCA9IHNvdXJjZS51cmw7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdEZ1bGwoYXJncyk7XG4gICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDsgLy8gT3B0aW9uYWxcbiAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcbiAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG5cbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG5cbiAgX29uSGVhZGVyc1JlY2VpdmVkKCkge1xuICAgIGNvbnN0IGZ1bGxSZXF1ZXN0WGhySWQgPSB0aGlzLl9mdWxsUmVxdWVzdElkO1xuICAgIGNvbnN0IGZ1bGxSZXF1ZXN0WGhyID0gdGhpcy5fbWFuYWdlci5nZXRSZXF1ZXN0WGhyKGZ1bGxSZXF1ZXN0WGhySWQpO1xuXG4gICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHtcbiAgICAgIHJldHVybiBmdWxsUmVxdWVzdFhoci5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTtcbiAgICB9O1xuICAgIGNvbnN0IHtcbiAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcbiAgICAgIHN1Z2dlc3RlZExlbmd0aCxcbiAgICB9ID0gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsXG4gICAgICBpc0h0dHA6IHRoaXMuX21hbmFnZXIuaXNIdHRwLFxuICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2UsXG4gICAgfSk7XG5cbiAgICBpZiAoYWxsb3dSYW5nZVJlcXVlc3RzKSB7XG4gICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gU2V0dGluZyByaWdodCBjb250ZW50IGxlbmd0aC5cbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cbiAgICB0aGlzLl9maWxlbmFtZSA9IGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuXG4gICAgaWYgKHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgIC8vIE5PVEU6IGJ5IGNhbmNlbGxpbmcgdGhlIGZ1bGwgcmVxdWVzdCwgYW5kIHRoZW4gaXNzdWluZyByYW5nZVxuICAgICAgLy8gcmVxdWVzdHMsIHRoZXJlIHdpbGwgYmUgYW4gaXNzdWUgZm9yIHNpdGVzIHdoZXJlIHlvdSBjYW4gb25seVxuICAgICAgLy8gcmVxdWVzdCB0aGUgcGRmIG9uY2UuIEhvd2V2ZXIsIGlmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4gdGhlXG4gICAgICAvLyBzZXJ2ZXIgc2hvdWxkIG5vdCBiZSByZXR1cm5pbmcgdGhhdCBpdCBjYW4gc3VwcG9ydCByYW5nZSByZXF1ZXN0cy5cbiAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KGZ1bGxSZXF1ZXN0WGhySWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgX29uRG9uZShhcmdzKSB7XG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7IHZhbHVlOiBhcmdzLmNodW5rLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZENodW5rcy5wdXNoKGFyZ3MuY2h1bmspO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gIH1cblxuICBfb25FcnJvcihzdGF0dXMpIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLl91cmw7XG4gICAgY29uc3QgZXhjZXB0aW9uID0gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihzdGF0dXMsIHVybCk7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBleGNlcHRpb247XG4gICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QoZXhjZXB0aW9uKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTtcbiAgfVxuXG4gIF9vblByb2dyZXNzKGRhdGEpIHtcbiAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7XG4gICAgICB0aGlzLm9uUHJvZ3Jlc3Moe1xuICAgICAgICBsb2FkZWQ6IGRhdGEubG9hZGVkLFxuICAgICAgICB0b3RhbDogZGF0YS5sZW5ndGhDb21wdXRhYmxlID8gZGF0YS50b3RhbCA6IHRoaXMuX2NvbnRlbnRMZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG5cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cblxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG5cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cblxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBhc3luYyByZWFkKCkge1xuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jYWNoZWRDaHVua3Muc2hpZnQoKTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgaWYgKHRoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKSkge1xuICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCk7XG4gICAgfVxuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgfVxufVxuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW1SYW5nZVJlYWRlcn0gKi9cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBiZWdpbiwgZW5kKSB7XG4gICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcyksXG4gICAgfTtcbiAgICB0aGlzLl9yZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBhcmdzKTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG5cbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHRoaXMub25DbG9zZWQgPSBudWxsO1xuICB9XG5cbiAgX2Nsb3NlKCkge1xuICAgIGlmICh0aGlzLm9uQ2xvc2VkKSB7XG4gICAgICB0aGlzLm9uQ2xvc2VkKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkRvbmUoZGF0YSkge1xuICAgIGNvbnN0IGNodW5rID0gZGF0YS5jaHVuaztcbiAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2Nsb3NlKCk7XG4gIH1cblxuICBfb25Qcm9ncmVzcyhldnQpIHtcbiAgICBpZiAoIXRoaXMuaXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5vblByb2dyZXNzKSB7XG4gICAgICB0aGlzLm9uUHJvZ3Jlc3Moe1xuICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmsgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICByZXR1cm4geyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCkpIHtcbiAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHRoaXMuX2Nsb3NlKCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGTmV0d29ya1N0cmVhbSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQge1xuICBBYm9ydEV4Y2VwdGlvbixcbiAgYXNzZXJ0LFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yLFxuICBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyLFxuICB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyxcbiAgdmFsaWRhdGVSZXNwb25zZVN0YXR1cyxcbn0gZnJvbSBcIi4vbmV0d29ya191dGlscy5qc1wiO1xuXG5pZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMXCIpKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnTW9kdWxlIFwiLi9mZXRjaF9zdHJlYW0uanNcIiBzaGFsbCBub3QgYmUgdXNlZCB3aXRoIE1PWkNFTlRSQUwgYnVpbGRzLidcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKGhlYWRlcnMsIHdpdGhDcmVkZW50aWFscywgYWJvcnRDb250cm9sbGVyKSB7XG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIGhlYWRlcnMsXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIgJiYgYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBtb2RlOiBcImNvcnNcIixcbiAgICBjcmVkZW50aWFsczogd2l0aENyZWRlbnRpYWxzID8gXCJpbmNsdWRlXCIgOiBcInNhbWUtb3JpZ2luXCIsXG4gICAgcmVkaXJlY3Q6IFwiZm9sbG93XCIsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnMoaHR0cEhlYWRlcnMpIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaHR0cEhlYWRlcnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0dHBIZWFkZXJzW3Byb3BlcnR5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaGVhZGVycy5hcHBlbmQocHJvcGVydHksIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtfSAqL1xuY2xhc3MgUERGRmV0Y2hTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3Qoc291cmNlLnVybCk7XG4gICAgdGhpcy5odHRwSGVhZGVycyA9ICh0aGlzLmlzSHR0cCAmJiBzb3VyY2UuaHR0cEhlYWRlcnMpIHx8IHt9O1xuXG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuXG4gIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQgOiAwO1xuICB9XG5cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoXG4gICAgICAhdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsXG4gICAgICBcIlBERkZldGNoU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCJcbiAgICApO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERkZldGNoU3RyZWFtUmVhZGVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuXG4gIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcbiAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIGJlZ2luLCBlbmQpO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cblxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHtcbiAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKTtcbiAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbVJlYWRlcn0gKi9cbmNsYXNzIFBERkZldGNoU3RyZWFtUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl93aXRoQ3JlZGVudGlhbHMgPSBzb3VyY2Uud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIH1cbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7XG5cbiAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gc291cmNlLnVybDtcbiAgICBmZXRjaChcbiAgICAgIHVybCxcbiAgICAgIGNyZWF0ZUZldGNoT3B0aW9ucyhcbiAgICAgICAgdGhpcy5faGVhZGVycyxcbiAgICAgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzLFxuICAgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXJcbiAgICAgIClcbiAgICApXG4gICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIGlmICghdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgICAgdGhyb3cgY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihyZXNwb25zZS5zdGF0dXMsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXG4gICAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KG5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuICAgICAgICAgIHN1Z2dlc3RlZExlbmd0aCxcbiAgICAgICAgfSA9IHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcbiAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsXG4gICAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gYWxsb3dSYW5nZVJlcXVlc3RzO1xuICAgICAgICAvLyBTZXR0aW5nIHJpZ2h0IGNvbnRlbnQgbGVuZ3RoLlxuICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKTtcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgcmVhZGluZyB3aGVuIHJhbmdlIGlzIHN1cHBvcnRlZCBhbmQgc3RyZWFtaW5nIGlzXG4gICAgICAgIC8vIGRpc2FibGVkLlxuICAgICAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbChuZXcgQWJvcnRFeGNlcHRpb24oXCJTdHJlYW1pbmcgaXMgZGlzYWJsZWQuXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCh0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QpO1xuXG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuXG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG5cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cblxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuXG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cblxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWUsIGRvbmUgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgaWYgKHRoaXMub25Qcm9ncmVzcykge1xuICAgICAgdGhpcy5vblByb2dyZXNzKHtcbiAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG4gICAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHZhbHVlKS5idWZmZXI7XG4gICAgcmV0dXJuIHsgdmFsdWU6IGJ1ZmZlciwgZG9uZTogZmFsc2UgfTtcbiAgfVxuXG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICBpZiAodGhpcy5fcmVhZGVyKSB7XG4gICAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW1SYW5nZVJlYWRlcn0gKi9cbmNsYXNzIFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIGJlZ2luLCBlbmQpIHtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG5cbiAgICBpZiAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIH1cblxuICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7XG4gICAgdGhpcy5faGVhZGVycy5hcHBlbmQoXCJSYW5nZVwiLCBgYnl0ZXM9JHtiZWdpbn0tJHtlbmQgLSAxfWApO1xuXG4gICAgY29uc3QgdXJsID0gc291cmNlLnVybDtcbiAgICBmZXRjaChcbiAgICAgIHVybCxcbiAgICAgIGNyZWF0ZUZldGNoT3B0aW9ucyhcbiAgICAgICAgdGhpcy5faGVhZGVycyxcbiAgICAgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzLFxuICAgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXJcbiAgICAgIClcbiAgICApXG4gICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIGlmICghdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgICAgdGhyb3cgY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihyZXNwb25zZS5zdGF0dXMsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9KTtcblxuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cblxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG5cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlLCBkb25lIH07XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMub25Qcm9ncmVzcyh7IGxvYWRlZDogdGhpcy5fbG9hZGVkIH0pO1xuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh2YWx1ZSkuYnVmZmVyO1xuICAgIHJldHVybiB7IHZhbHVlOiBidWZmZXIsIGRvbmU6IGZhbHNlIH07XG4gIH1cblxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRlcikge1xuICAgICAgdGhpcy5fcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGRmV0Y2hTdHJlYW0gfTtcbiJdLCJzb3VyY2VSb290IjoiIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9wZGYubWluLmpzIGIvYnVpbGQvcGRmLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDk1Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvcGRmLm1pbi5qcwpAQCAtMCwwICsxLDIyIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCishZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSgicGRmanMtZGlzdC9idWlsZC9wZGYiLFtdLHQpOiJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzWyJwZGZqcy1kaXN0L2J1aWxkL3BkZiJdPXQoKTplWyJwZGZqcy1kaXN0L2J1aWxkL3BkZiJdPWUucGRmanNMaWI9dCgpfSh0aGlzLChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD17fTtmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKHIpe2lmKHRbcl0pcmV0dXJuIHRbcl0uZXhwb3J0czt2YXIgbj10W3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtlW3JdLmNhbGwobi5leHBvcnRzLG4sbi5leHBvcnRzLF9fd19wZGZqc19yZXF1aXJlX18pO24ubD0hMDtyZXR1cm4gbi5leHBvcnRzfV9fd19wZGZqc19yZXF1aXJlX18ubT1lO19fd19wZGZqc19yZXF1aXJlX18uYz10O19fd19wZGZqc19yZXF1aXJlX18uZD1mdW5jdGlvbihlLHQscil7X193X3BkZmpzX3JlcXVpcmVfXy5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX07X193X3BkZmpzX3JlcXVpcmVfXy5yPWZ1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9O19fd19wZGZqc19yZXF1aXJlX18udD1mdW5jdGlvbihlLHQpezEmdCYmKGU9X193X3BkZmpzX3JlcXVpcmVfXyhlKSk7aWYoOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtfX3dfcGRmanNfcmVxdWlyZV9fLnIocik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KTtpZigyJnQmJiJzdHJpbmciIT10eXBlb2YgZSlmb3IodmFyIG4gaW4gZSlfX3dfcGRmanNfcmVxdWlyZV9fLmQocixuLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbikpO3JldHVybiByfTtfX3dfcGRmanNfcmVxdWlyZV9fLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uIGdldERlZmF1bHQoKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCl7cmV0dXJuIGV9O19fd19wZGZqc19yZXF1aXJlX18uZCh0LCJhIix0KTtyZXR1cm4gdH07X193X3BkZmpzX3JlcXVpcmVfXy5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfTtfX3dfcGRmanNfcmVxdWlyZV9fLnA9IiI7cmV0dXJuIF9fd19wZGZqc19yZXF1aXJlX18oX193X3BkZmpzX3JlcXVpcmVfXy5zPTApfShbZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImFkZExpbmtBdHRyaWJ1dGVzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5hZGRMaW5rQXR0cmlidXRlc319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiZ2V0RmlsZW5hbWVGcm9tVXJsIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXRGaWxlbmFtZUZyb21Vcmx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIkxpbmtUYXJnZXQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuLkxpbmtUYXJnZXR9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImxvYWRTY3JpcHQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuLmxvYWRTY3JpcHR9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlBERkRhdGVTdHJpbmciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuLlBERkRhdGVTdHJpbmd9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9ufX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJidWlsZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuYnVpbGR9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImdldERvY3VtZW50Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5nZXREb2N1bWVudH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiTG9vcGJhY2tQb3J0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5Mb29wYmFja1BvcnR9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlBERkRhdGFSYW5nZVRyYW5zcG9ydCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJQREZXb3JrZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBzLlBERldvcmtlcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwidmVyc2lvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHMudmVyc2lvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiQ01hcENvbXByZXNzaW9uVHlwZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuQ01hcENvbXByZXNzaW9uVHlwZX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiY3JlYXRlT2JqZWN0VVJMIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGVPYmplY3RVUkx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImNyZWF0ZVByb21pc2VDYXBhYmlsaXR5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiSW52YWxpZFBERkV4Y2VwdGlvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuSW52YWxpZFBERkV4Y2VwdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiTWlzc2luZ1BERkV4Y2VwdGlvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuTWlzc2luZ1BERkV4Y2VwdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiT1BTIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5PUFN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlBhc3N3b3JkUmVzcG9uc2VzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5QYXNzd29yZFJlc3BvbnNlc319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiUGVybWlzc2lvbkZsYWciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhLlBlcm1pc3Npb25GbGFnfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJyZW1vdmVOdWxsQ2hhcmFjdGVycyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEucmVtb3ZlTnVsbENoYXJhY3RlcnN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInNoYWRvdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuc2hhZG93fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiVU5TVVBQT1JURURfRkVBVFVSRVMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhLlVOU1VQUE9SVEVEX0ZFQVRVUkVTfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJVdGlsIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5VdGlsfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJWZXJib3NpdHlMZXZlbCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuVmVyYm9zaXR5TGV2ZWx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIkFubm90YXRpb25MYXllciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkuQW5ub3RhdGlvbkxheWVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJhcGlDb21wYXRpYmlsaXR5UGFyYW1zIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5hcGlDb21wYXRpYmlsaXR5UGFyYW1zfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJHbG9iYWxXb3JrZXJPcHRpb25zIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5HbG9iYWxXb3JrZXJPcHRpb25zfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJyZW5kZXJUZXh0TGF5ZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLnJlbmRlclRleHRMYXllcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiU1ZHR3JhcGhpY3MiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoLlNWR0dyYXBoaWNzfX0pO3ZhciBuPXIoMSkscz1yKDUpLGE9cigyKSxpPXIoMTkpLG89cig5KSxsPXIoMTIpLGM9cigyMCksaD1yKDIxKTt7Y29uc3R7aXNOb2RlSlM6ZX09cig0KTtpZihlKXtjb25zdCBlPXIoMjIpLlBERk5vZGVTdHJlYW07KDAscy5zZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeSkodD0+bmV3IGUodCkpfWVsc2V7Y29uc3QgZT1yKDI1KS5QREZOZXR3b3JrU3RyZWFtO2xldCB0OygwLG4uaXNGZXRjaFN1cHBvcnRlZCkoKSYmKHQ9cigyNikuUERGRmV0Y2hTdHJlYW0pOygwLHMuc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkpKHI9PnQmJigwLG4uaXNWYWxpZEZldGNoVXJsKShyLnVybCk/bmV3IHQocik6bmV3IGUocikpfX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuYWRkTGlua0F0dHJpYnV0ZXM9ZnVuY3Rpb24gYWRkTGlua0F0dHJpYnV0ZXMoZSx7dXJsOnQsdGFyZ2V0OnIscmVsOnMsZW5hYmxlZDppPSEwfT17fSl7KDAsbi5hc3NlcnQpKHQmJiJzdHJpbmciPT10eXBlb2YgdCwnYWRkTGlua0F0dHJpYnV0ZXM6IEEgdmFsaWQgInVybCIgcGFyYW1ldGVyIG11c3QgcHJvdmlkZWQuJyk7Y29uc3Qgbz0oMCxuLnJlbW92ZU51bGxDaGFyYWN0ZXJzKSh0KTtpZihpKWUuaHJlZj1lLnRpdGxlPW87ZWxzZXtlLmhyZWY9IiI7ZS50aXRsZT0iRGlzYWJsZWQ6ICIrbztlLm9uY2xpY2s9KCk9PiExfWxldCBsPSIiO3N3aXRjaChyKXtjYXNlIGEuTk9ORTpicmVhaztjYXNlIGEuU0VMRjpsPSJfc2VsZiI7YnJlYWs7Y2FzZSBhLkJMQU5LOmw9Il9ibGFuayI7YnJlYWs7Y2FzZSBhLlBBUkVOVDpsPSJfcGFyZW50IjticmVhaztjYXNlIGEuVE9QOmw9Il90b3AifWUudGFyZ2V0PWw7ZS5yZWw9InN0cmluZyI9PXR5cGVvZiBzP3M6Im5vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3cifTt0LmdldEZpbGVuYW1lRnJvbVVybD1mdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21VcmwoZSl7Y29uc3QgdD1lLmluZGV4T2YoIiMiKSxyPWUuaW5kZXhPZigiPyIpLG49TWF0aC5taW4odD4wP3Q6ZS5sZW5ndGgscj4wP3I6ZS5sZW5ndGgpO3JldHVybiBlLnN1YnN0cmluZyhlLmxhc3RJbmRleE9mKCIvIixuKSsxLG4pfTt0LmlzRmV0Y2hTdXBwb3J0ZWQ9aXNGZXRjaFN1cHBvcnRlZDt0LmlzVmFsaWRGZXRjaFVybD1pc1ZhbGlkRmV0Y2hVcmw7dC5sb2FkU2NyaXB0PWZ1bmN0aW9uIGxvYWRTY3JpcHQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LHIpPT57Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtuLnNyYz1lO24ub25sb2FkPXQ7bi5vbmVycm9yPWZ1bmN0aW9uKCl7cihuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHNjcmlwdCBhdDogIituLnNyYykpfTsoZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChuKX0pfTt0LmRlcHJlY2F0ZWQ9ZnVuY3Rpb24gZGVwcmVjYXRlZChlKXtjb25zb2xlLmxvZygiRGVwcmVjYXRlZCBBUEkgdXNhZ2U6ICIrZSl9O3QuUERGRGF0ZVN0cmluZz10LlN0YXRUaW1lcj10LkRPTVNWR0ZhY3Rvcnk9dC5ET01DTWFwUmVhZGVyRmFjdG9yeT10LkJhc2VDTWFwUmVhZGVyRmFjdG9yeT10LkRPTUNhbnZhc0ZhY3Rvcnk9dC5CYXNlQ2FudmFzRmFjdG9yeT10LkRFRkFVTFRfTElOS19SRUw9dC5MaW5rVGFyZ2V0PXQuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uPXQuUGFnZVZpZXdwb3J0PXZvaWQgMDt2YXIgbj1yKDIpO3QuREVGQVVMVF9MSU5LX1JFTD0ibm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdyI7Y29uc3Qgcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2NsYXNzIEJhc2VDYW52YXNGYWN0b3J5e2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VDYW52YXNGYWN0b3J5JiYoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNhbnZhc0ZhY3RvcnkuIil9Y3JlYXRlKGUsdCl7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlYCBjYWxsZWQuIil9cmVzZXQoZSx0LHIpe2lmKCFlLmNhbnZhcyl0aHJvdyBuZXcgRXJyb3IoIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkIik7aWYodDw9MHx8cjw9MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FudmFzIHNpemUiKTtlLmNhbnZhcy53aWR0aD10O2UuY2FudmFzLmhlaWdodD1yfWRlc3Ryb3koZSl7aWYoIWUuY2FudmFzKXRocm93IG5ldyBFcnJvcigiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWQiKTtlLmNhbnZhcy53aWR0aD0wO2UuY2FudmFzLmhlaWdodD0wO2UuY2FudmFzPW51bGw7ZS5jb250ZXh0PW51bGx9fXQuQmFzZUNhbnZhc0ZhY3Rvcnk9QmFzZUNhbnZhc0ZhY3Rvcnk7dC5ET01DYW52YXNGYWN0b3J5PWNsYXNzIERPTUNhbnZhc0ZhY3RvcnkgZXh0ZW5kcyBCYXNlQ2FudmFzRmFjdG9yeXtjb25zdHJ1Y3Rvcih7b3duZXJEb2N1bWVudDplPWdsb2JhbFRoaXMuZG9jdW1lbnR9PXt9KXtzdXBlcigpO3RoaXMuX2RvY3VtZW50PWV9Y3JlYXRlKGUsdCl7aWYoZTw9MHx8dDw9MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FudmFzIHNpemUiKTtjb25zdCByPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLG49ci5nZXRDb250ZXh0KCIyZCIpO3Iud2lkdGg9ZTtyLmhlaWdodD10O3JldHVybntjYW52YXM6cixjb250ZXh0Om59fX07Y2xhc3MgQmFzZUNNYXBSZWFkZXJGYWN0b3J5e2NvbnN0cnVjdG9yKHtiYXNlVXJsOmU9bnVsbCxpc0NvbXByZXNzZWQ6dD0hMX0pe3RoaXMuY29uc3RydWN0b3I9PT1CYXNlQ01hcFJlYWRlckZhY3RvcnkmJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ01hcFJlYWRlckZhY3RvcnkuIik7dGhpcy5iYXNlVXJsPWU7dGhpcy5pc0NvbXByZXNzZWQ9dH1hc3luYyBmZXRjaCh7bmFtZTplfSl7aWYoIXRoaXMuYmFzZVVybCl0aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwICJiYXNlVXJsIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0IHRoZSAiY01hcFVybCIgYW5kICJjTWFwUGFja2VkIiBBUEkgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQuJyk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJDTWFwIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIik7Y29uc3QgdD10aGlzLmJhc2VVcmwrZSsodGhpcy5pc0NvbXByZXNzZWQ/Ii5iY21hcCI6IiIpLHI9dGhpcy5pc0NvbXByZXNzZWQ/bi5DTWFwQ29tcHJlc3Npb25UeXBlLkJJTkFSWTpuLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORTtyZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKHQscikuY2F0Y2goZT0+e3Rocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgJHt0aGlzLmlzQ29tcHJlc3NlZD8iYmluYXJ5ICI6IiJ9Q01hcCBhdDogJHt0fWApfSl9X2ZldGNoRGF0YShlLHQpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC4iKX19dC5CYXNlQ01hcFJlYWRlckZhY3Rvcnk9QmFzZUNNYXBSZWFkZXJGYWN0b3J5O3QuRE9NQ01hcFJlYWRlckZhY3Rvcnk9Y2xhc3MgRE9NQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlQ01hcFJlYWRlckZhY3Rvcnl7X2ZldGNoRGF0YShlLHQpe3JldHVybiBpc0ZldGNoU3VwcG9ydGVkKCkmJmlzVmFsaWRGZXRjaFVybChlLGRvY3VtZW50LmJhc2VVUkkpP2ZldGNoKGUpLnRoZW4oYXN5bmMgZT0+e2lmKCFlLm9rKXRocm93IG5ldyBFcnJvcihlLnN0YXR1c1RleHQpO2xldCByO3I9dGhpcy5pc0NvbXByZXNzZWQ/bmV3IFVpbnQ4QXJyYXkoYXdhaXQgZS5hcnJheUJ1ZmZlcigpKTooMCxuLnN0cmluZ1RvQnl0ZXMpKGF3YWl0IGUudGV4dCgpKTtyZXR1cm57Y01hcERhdGE6cixjb21wcmVzc2lvblR5cGU6dH19KTpuZXcgUHJvbWlzZSgocixzKT0+e2NvbnN0IGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2Eub3BlbigiR0VUIixlLCEwKTt0aGlzLmlzQ29tcHJlc3NlZCYmKGEucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIpO2Eub25yZWFkeXN0YXRlY2hhbmdlPSgpPT57aWYoYS5yZWFkeVN0YXRlPT09WE1MSHR0cFJlcXVlc3QuRE9ORSl7aWYoMjAwPT09YS5zdGF0dXN8fDA9PT1hLnN0YXR1cyl7bGV0IGU7dGhpcy5pc0NvbXByZXNzZWQmJmEucmVzcG9uc2U/ZT1uZXcgVWludDhBcnJheShhLnJlc3BvbnNlKTohdGhpcy5pc0NvbXByZXNzZWQmJmEucmVzcG9uc2VUZXh0JiYoZT0oMCxuLnN0cmluZ1RvQnl0ZXMpKGEucmVzcG9uc2VUZXh0KSk7aWYoZSl7cih7Y01hcERhdGE6ZSxjb21wcmVzc2lvblR5cGU6dH0pO3JldHVybn19cyhuZXcgRXJyb3IoYS5zdGF0dXNUZXh0KSl9fTthLnNlbmQobnVsbCl9KX19O3QuRE9NU1ZHRmFjdG9yeT1jbGFzcyBET01TVkdGYWN0b3J5e2NyZWF0ZShlLHQpeygwLG4uYXNzZXJ0KShlPjAmJnQ+MCwiSW52YWxpZCBTVkcgZGltZW5zaW9ucyIpO2NvbnN0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHMsInN2ZzpzdmciKTtyLnNldEF0dHJpYnV0ZSgidmVyc2lvbiIsIjEuMSIpO3Iuc2V0QXR0cmlidXRlKCJ3aWR0aCIsZSsicHgiKTtyLnNldEF0dHJpYnV0ZSgiaGVpZ2h0Iix0KyJweCIpO3Iuc2V0QXR0cmlidXRlKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwibm9uZSIpO3Iuc2V0QXR0cmlidXRlKCJ2aWV3Qm94IiwiMCAwICIrZSsiICIrdCk7cmV0dXJuIHJ9Y3JlYXRlRWxlbWVudChlKXsoMCxuLmFzc2VydCkoInN0cmluZyI9PXR5cGVvZiBlLCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGUiKTtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHMsZSl9fTtjbGFzcyBQYWdlVmlld3BvcnR7Y29uc3RydWN0b3Ioe3ZpZXdCb3g6ZSxzY2FsZTp0LHJvdGF0aW9uOnIsb2Zmc2V0WDpuPTAsb2Zmc2V0WTpzPTAsZG9udEZsaXA6YT0hMX0pe3RoaXMudmlld0JveD1lO3RoaXMuc2NhbGU9dDt0aGlzLnJvdGF0aW9uPXI7dGhpcy5vZmZzZXRYPW47dGhpcy5vZmZzZXRZPXM7Y29uc3QgaT0oZVsyXStlWzBdKS8yLG89KGVbM10rZVsxXSkvMjtsZXQgbCxjLGgsZCx1LHAsZixnO3N3aXRjaChyPShyJT0zNjApPDA/ciszNjA6cil7Y2FzZSAxODA6bD0tMTtjPTA7aD0wO2Q9MTticmVhaztjYXNlIDkwOmw9MDtjPTE7aD0xO2Q9MDticmVhaztjYXNlIDI3MDpsPTA7Yz0tMTtoPS0xO2Q9MDticmVhaztjYXNlIDA6bD0xO2M9MDtoPTA7ZD0tMTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiUGFnZVZpZXdwb3J0OiBJbnZhbGlkIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy4iKX1pZihhKXtoPS1oO2Q9LWR9aWYoMD09PWwpe3U9TWF0aC5hYnMoby1lWzFdKSp0K247cD1NYXRoLmFicyhpLWVbMF0pKnQrcztmPU1hdGguYWJzKGVbM10tZVsxXSkqdDtnPU1hdGguYWJzKGVbMl0tZVswXSkqdH1lbHNle3U9TWF0aC5hYnMoaS1lWzBdKSp0K247cD1NYXRoLmFicyhvLWVbMV0pKnQrcztmPU1hdGguYWJzKGVbMl0tZVswXSkqdDtnPU1hdGguYWJzKGVbM10tZVsxXSkqdH10aGlzLnRyYW5zZm9ybT1bbCp0LGMqdCxoKnQsZCp0LHUtbCp0KmktaCp0Km8scC1jKnQqaS1kKnQqb107dGhpcy53aWR0aD1mO3RoaXMuaGVpZ2h0PWd9Y2xvbmUoe3NjYWxlOmU9dGhpcy5zY2FsZSxyb3RhdGlvbjp0PXRoaXMucm90YXRpb24sb2Zmc2V0WDpyPXRoaXMub2Zmc2V0WCxvZmZzZXRZOm49dGhpcy5vZmZzZXRZLGRvbnRGbGlwOnM9ITF9PXt9KXtyZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7dmlld0JveDp0aGlzLnZpZXdCb3guc2xpY2UoKSxzY2FsZTplLHJvdGF0aW9uOnQsb2Zmc2V0WDpyLG9mZnNldFk6bixkb250RmxpcDpzfSl9Y29udmVydFRvVmlld3BvcnRQb2ludChlLHQpe3JldHVybiBuLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW2UsdF0sdGhpcy50cmFuc2Zvcm0pfWNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlKGUpe2NvbnN0IHQ9bi5VdGlsLmFwcGx5VHJhbnNmb3JtKFtlWzBdLGVbMV1dLHRoaXMudHJhbnNmb3JtKSxyPW4uVXRpbC5hcHBseVRyYW5zZm9ybShbZVsyXSxlWzNdXSx0aGlzLnRyYW5zZm9ybSk7cmV0dXJuW3RbMF0sdFsxXSxyWzBdLHJbMV1dfWNvbnZlcnRUb1BkZlBvaW50KGUsdCl7cmV0dXJuIG4uVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW2UsdF0sdGhpcy50cmFuc2Zvcm0pfX10LlBhZ2VWaWV3cG9ydD1QYWdlVmlld3BvcnQ7Y2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSk7dGhpcy50eXBlPXR9fXQuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uPVJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbjtjb25zdCBhPXtOT05FOjAsU0VMRjoxLEJMQU5LOjIsUEFSRU5UOjMsVE9QOjR9O3QuTGlua1RhcmdldD1hO3QuU3RhdFRpbWVyPWNsYXNzIFN0YXRUaW1lcntjb25zdHJ1Y3Rvcigpe3RoaXMuc3RhcnRlZD1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMudGltZXM9W119dGltZShlKXtlIGluIHRoaXMuc3RhcnRlZCYmKDAsbi53YXJuKSgiVGltZXIgaXMgYWxyZWFkeSBydW5uaW5nIGZvciAiK2UpO3RoaXMuc3RhcnRlZFtlXT1EYXRlLm5vdygpfXRpbWVFbmQoZSl7ZSBpbiB0aGlzLnN0YXJ0ZWR8fCgwLG4ud2FybikoIlRpbWVyIGhhcyBub3QgYmVlbiBzdGFydGVkIGZvciAiK2UpO3RoaXMudGltZXMucHVzaCh7bmFtZTplLHN0YXJ0OnRoaXMuc3RhcnRlZFtlXSxlbmQ6RGF0ZS5ub3coKX0pO2RlbGV0ZSB0aGlzLnN0YXJ0ZWRbZV19dG9TdHJpbmcoKXtjb25zdCBlPVtdO2xldCB0PTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy50aW1lcyl7Y29uc3Qgcj1lLm5hbWU7ci5sZW5ndGg+dCYmKHQ9ci5sZW5ndGgpfWZvcihjb25zdCByIG9mIHRoaXMudGltZXMpe2NvbnN0IG49ci5lbmQtci5zdGFydDtlLnB1c2goYCR7ci5uYW1lLnBhZEVuZCh0KX0gJHtufW1zXG5gKX1yZXR1cm4gZS5qb2luKCIiKX19O2Z1bmN0aW9uIGlzRmV0Y2hTdXBwb3J0ZWQoKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGZldGNoJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlc3BvbnNlJiYiYm9keSJpbiBSZXNwb25zZS5wcm90b3R5cGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVhZGFibGVTdHJlYW19ZnVuY3Rpb24gaXNWYWxpZEZldGNoVXJsKGUsdCl7dHJ5e2NvbnN0e3Byb3RvY29sOnJ9PXQ/bmV3IFVSTChlLHQpOm5ldyBVUkwoZSk7cmV0dXJuImh0dHA6Ij09PXJ8fCJodHRwczoiPT09cn1jYXRjaChlKXtyZXR1cm4hMX19bGV0IGk7dC5QREZEYXRlU3RyaW5nPWNsYXNzIFBERkRhdGVTdHJpbmd7c3RhdGljIHRvRGF0ZU9iamVjdChlKXtpZighZXx8ISgwLG4uaXNTdHJpbmcpKGUpKXJldHVybiBudWxsO2l8fChpPW5ldyBSZWdFeHAoIl5EOihcXGR7NH0pKFxcZHsyfSk/KFxcZHsyfSk/KFxcZHsyfSk/KFxcZHsyfSk/KFxcZHsyfSk/KFtafCt8LV0pPyhcXGR7Mn0pPyc/KFxcZHsyfSk/Jz8iKSk7Y29uc3QgdD1pLmV4ZWMoZSk7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj1wYXJzZUludCh0WzFdLDEwKTtsZXQgcz1wYXJzZUludCh0WzJdLDEwKTtzPXM+PTEmJnM8PTEyP3MtMTowO2xldCBhPXBhcnNlSW50KHRbM10sMTApO2E9YT49MSYmYTw9MzE/YToxO2xldCBvPXBhcnNlSW50KHRbNF0sMTApO289bz49MCYmbzw9MjM/bzowO2xldCBsPXBhcnNlSW50KHRbNV0sMTApO2w9bD49MCYmbDw9NTk/bDowO2xldCBjPXBhcnNlSW50KHRbNl0sMTApO2M9Yz49MCYmYzw9NTk/YzowO2NvbnN0IGg9dFs3XXx8IloiO2xldCBkPXBhcnNlSW50KHRbOF0sMTApO2Q9ZD49MCYmZDw9MjM/ZDowO2xldCB1PXBhcnNlSW50KHRbOV0sMTApfHwwO3U9dT49MCYmdTw9NTk/dTowO2lmKCItIj09PWgpe28rPWQ7bCs9dX1lbHNlIGlmKCIrIj09PWgpe28tPWQ7bC09dX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMocixzLGEsbyxsLGMpKX19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmFycmF5Qnl0ZUxlbmd0aD1hcnJheUJ5dGVMZW5ndGg7dC5hcnJheXNUb0J5dGVzPWZ1bmN0aW9uIGFycmF5c1RvQnl0ZXMoZSl7Y29uc3QgdD1lLmxlbmd0aDtpZigxPT09dCYmZVswXWluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gZVswXTtsZXQgcj0wO2ZvcihsZXQgbj0wO248dDtuKyspcis9YXJyYXlCeXRlTGVuZ3RoKGVbbl0pO2xldCBuPTA7Y29uc3Qgcz1uZXcgVWludDhBcnJheShyKTtmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD1lW3JdO3QgaW5zdGFuY2VvZiBVaW50OEFycmF5fHwodD0ic3RyaW5nIj09dHlwZW9mIHQ/c3RyaW5nVG9CeXRlcyh0KTpuZXcgVWludDhBcnJheSh0KSk7Y29uc3QgYT10LmJ5dGVMZW5ndGg7cy5zZXQodCxuKTtuKz1hfXJldHVybiBzfTt0LmFzc2VydD1hc3NlcnQ7dC5ieXRlc1RvU3RyaW5nPWZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoZSl7YXNzZXJ0KG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJnZvaWQgMCE9PWUubGVuZ3RoLCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7Y29uc3QgdD1lLmxlbmd0aDtpZih0PDgxOTIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxlKTtjb25zdCByPVtdO2ZvcihsZXQgbj0wO248dDtuKz04MTkyKXtjb25zdCBzPU1hdGgubWluKG4rODE5Mix0KSxhPWUuc3ViYXJyYXkobixzKTtyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEpKX1yZXR1cm4gci5qb2luKCIiKX07dC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpe2NvbnN0IGU9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgdD0hMTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwic2V0dGxlZCIse2dldDooKT0+dH0pO2UucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixuKXtlLnJlc29sdmU9ZnVuY3Rpb24oZSl7dD0hMDtyKGUpfTtlLnJlamVjdD1mdW5jdGlvbihlKXt0PSEwO24oZSl9fSkpO3JldHVybiBlfTt0LmVzY2FwZVN0cmluZz1mdW5jdGlvbiBlc2NhcGVTdHJpbmcoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFtcKFwpXFxdKS9nLCJcXCQxIil9O3QuZ2V0TW9kaWZpY2F0aW9uRGF0ZT1mdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGU9bmV3IERhdGUoRGF0ZS5ub3coKSkpe3JldHVybltlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwoZS5nZXRVVENNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLChlLmdldFVUQ0RhdGUoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIildLmpvaW4oIiIpfTt0LmdldFZlcmJvc2l0eUxldmVsPWZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCl7cmV0dXJuIHN9O3QuaW5mbz1mdW5jdGlvbiBpbmZvKGUpe3M+PW4uSU5GT1MmJmNvbnNvbGUubG9nKCJJbmZvOiAiK2UpfTt0LmlzQXJyYXlCdWZmZXI9ZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lJiZ2b2lkIDAhPT1lLmJ5dGVMZW5ndGh9O3QuaXNBcnJheUVxdWFsPWZ1bmN0aW9uIGlzQXJyYXlFcXVhbChlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7cmV0dXJuIGUuZXZlcnkoKGZ1bmN0aW9uKGUscil7cmV0dXJuIGU9PT10W3JdfSkpfTt0LmlzQm9vbD1mdW5jdGlvbiBpc0Jvb2woZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZX07dC5pc051bT1mdW5jdGlvbiBpc051bShlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9O3QuaXNTdHJpbmc9ZnVuY3Rpb24gaXNTdHJpbmcoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfTt0LmlzU2FtZU9yaWdpbj1mdW5jdGlvbiBpc1NhbWVPcmlnaW4oZSx0KXtsZXQgcjt0cnl7cj1uZXcgVVJMKGUpO2lmKCFyLm9yaWdpbnx8Im51bGwiPT09ci5vcmlnaW4pcmV0dXJuITF9Y2F0Y2goZSl7cmV0dXJuITF9Y29uc3Qgbj1uZXcgVVJMKHQscik7cmV0dXJuIHIub3JpZ2luPT09bi5vcmlnaW59O3QuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybD1mdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKGUsdCl7aWYoIWUpcmV0dXJuIG51bGw7dHJ5e2NvbnN0IHI9dD9uZXcgVVJMKGUsdCk6bmV3IFVSTChlKTtpZihmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKGUpe2lmKCFlKXJldHVybiExO3N3aXRjaChlLnByb3RvY29sKXtjYXNlImh0dHA6IjpjYXNlImh0dHBzOiI6Y2FzZSJmdHA6IjpjYXNlIm1haWx0bzoiOmNhc2UidGVsOiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19KHIpKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gbnVsbH07dC5yZW1vdmVOdWxsQ2hhcmFjdGVycz1mdW5jdGlvbiByZW1vdmVOdWxsQ2hhcmFjdGVycyhlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpe3dhcm4oIlRoZSBhcmd1bWVudCBmb3IgcmVtb3ZlTnVsbENoYXJhY3RlcnMgbXVzdCBiZSBhIHN0cmluZy4iKTtyZXR1cm4gZX1yZXR1cm4gZS5yZXBsYWNlKGksIiIpfTt0LnNldFZlcmJvc2l0eUxldmVsPWZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGUpe051bWJlci5pc0ludGVnZXIoZSkmJihzPWUpfTt0LnNoYWRvdz1zaGFkb3c7dC5zdHJpbmczMj1mdW5jdGlvbiBzdHJpbmczMihlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LDI1NSZlKX07dC5zdHJpbmdUb0J5dGVzPXN0cmluZ1RvQnl0ZXM7dC5zdHJpbmdUb1BERlN0cmluZz1mdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhlKXtjb25zdCB0PWUubGVuZ3RoLHI9W107aWYoIsO+Ij09PWVbMF0mJiLDvyI9PT1lWzFdKWZvcihsZXQgbj0yO248dDtuKz0yKXIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGVBdChuKTw8OHxlLmNoYXJDb2RlQXQobisxKSkpO2Vsc2UgaWYoIsO/Ij09PWVbMF0mJiLDviI9PT1lWzFdKWZvcihsZXQgbj0yO248dDtuKz0yKXIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGVBdChuKzEpPDw4fGUuY2hhckNvZGVBdChuKSkpO2Vsc2UgZm9yKGxldCBuPTA7bjx0Oysrbil7Y29uc3QgdD1oW2UuY2hhckNvZGVBdChuKV07ci5wdXNoKHQ/U3RyaW5nLmZyb21DaGFyQ29kZSh0KTplLmNoYXJBdChuKSl9cmV0dXJuIHIuam9pbigiIil9O3Quc3RyaW5nVG9VVEY4U3RyaW5nPWZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhlKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShlKSl9O3QudXRmOFN0cmluZ1RvU3RyaW5nPWZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhlKXtyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKX07dC53YXJuPXdhcm47dC51bnJlYWNoYWJsZT11bnJlYWNoYWJsZTt0LklzRXZhbFN1cHBvcnRlZENhY2hlZD10LklzTGl0dGxlRW5kaWFuQ2FjaGVkPXQuY3JlYXRlT2JqZWN0VVJMPXQuRm9ybWF0RXJyb3I9dC5VdGlsPXQuVW5rbm93bkVycm9yRXhjZXB0aW9uPXQuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uPXQuVGV4dFJlbmRlcmluZ01vZGU9dC5TdHJlYW1UeXBlPXQuUGVybWlzc2lvbkZsYWc9dC5QYXNzd29yZFJlc3BvbnNlcz10LlBhc3N3b3JkRXhjZXB0aW9uPXQuTWlzc2luZ1BERkV4Y2VwdGlvbj10LkludmFsaWRQREZFeGNlcHRpb249dC5BYm9ydEV4Y2VwdGlvbj10LkNNYXBDb21wcmVzc2lvblR5cGU9dC5JbWFnZUtpbmQ9dC5Gb250VHlwZT10LkFubm90YXRpb25UeXBlPXQuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlPXQuQW5ub3RhdGlvblJldmlld1N0YXRlPXQuQW5ub3RhdGlvblJlcGx5VHlwZT10LkFubm90YXRpb25NYXJrZWRTdGF0ZT10LkFubm90YXRpb25GbGFnPXQuQW5ub3RhdGlvbkZpZWxkRmxhZz10LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9dC5VTlNVUFBPUlRFRF9GRUFUVVJFUz10LlZlcmJvc2l0eUxldmVsPXQuT1BTPXQuSURFTlRJVFlfTUFUUklYPXQuRk9OVF9JREVOVElUWV9NQVRSSVg9dC5CYXNlRXhjZXB0aW9uPXZvaWQgMDtyKDMpO3QuSURFTlRJVFlfTUFUUklYPVsxLDAsMCwxLDAsMF07dC5GT05UX0lERU5USVRZX01BVFJJWD1bLjAwMSwwLDAsLjAwMSwwLDBdO3QuUGVybWlzc2lvbkZsYWc9e1BSSU5UOjQsTU9ESUZZX0NPTlRFTlRTOjgsQ09QWToxNixNT0RJRllfQU5OT1RBVElPTlM6MzIsRklMTF9JTlRFUkFDVElWRV9GT1JNUzoyNTYsQ09QWV9GT1JfQUNDRVNTSUJJTElUWTo1MTIsQVNTRU1CTEU6MTAyNCxQUklOVF9ISUdIX1FVQUxJVFk6MjA0OH07dC5UZXh0UmVuZGVyaW5nTW9kZT17RklMTDowLFNUUk9LRToxLEZJTExfU1RST0tFOjIsSU5WSVNJQkxFOjMsRklMTF9BRERfVE9fUEFUSDo0LFNUUk9LRV9BRERfVE9fUEFUSDo1LEZJTExfU1RST0tFX0FERF9UT19QQVRIOjYsQUREX1RPX1BBVEg6NyxGSUxMX1NUUk9LRV9NQVNLOjMsQUREX1RPX1BBVEhfRkxBRzo0fTt0LkltYWdlS2luZD17R1JBWVNDQUxFXzFCUFA6MSxSR0JfMjRCUFA6MixSR0JBXzMyQlBQOjN9O3QuQW5ub3RhdGlvblR5cGU9e1RFWFQ6MSxMSU5LOjIsRlJFRVRFWFQ6MyxMSU5FOjQsU1FVQVJFOjUsQ0lSQ0xFOjYsUE9MWUdPTjo3LFBPTFlMSU5FOjgsSElHSExJR0hUOjksVU5ERVJMSU5FOjEwLFNRVUlHR0xZOjExLFNUUklLRU9VVDoxMixTVEFNUDoxMyxDQVJFVDoxNCxJTks6MTUsUE9QVVA6MTYsRklMRUFUVEFDSE1FTlQ6MTcsU09VTkQ6MTgsTU9WSUU6MTksV0lER0VUOjIwLFNDUkVFTjoyMSxQUklOVEVSTUFSSzoyMixUUkFQTkVUOjIzLFdBVEVSTUFSSzoyNCxUSFJFRUQ6MjUsUkVEQUNUOjI2fTt0LkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZT17TUFSS0VEOiJNYXJrZWQiLFJFVklFVzoiUmV2aWV3In07dC5Bbm5vdGF0aW9uTWFya2VkU3RhdGU9e01BUktFRDoiTWFya2VkIixVTk1BUktFRDoiVW5tYXJrZWQifTt0LkFubm90YXRpb25SZXZpZXdTdGF0ZT17QUNDRVBURUQ6IkFjY2VwdGVkIixSRUpFQ1RFRDoiUmVqZWN0ZWQiLENBTkNFTExFRDoiQ2FuY2VsbGVkIixDT01QTEVURUQ6IkNvbXBsZXRlZCIsTk9ORToiTm9uZSJ9O3QuQW5ub3RhdGlvblJlcGx5VHlwZT17R1JPVVA6Ikdyb3VwIixSRVBMWToiUiJ9O3QuQW5ub3RhdGlvbkZsYWc9e0lOVklTSUJMRToxLEhJRERFTjoyLFBSSU5UOjQsTk9aT09NOjgsTk9ST1RBVEU6MTYsTk9WSUVXOjMyLFJFQURPTkxZOjY0LExPQ0tFRDoxMjgsVE9HR0xFTk9WSUVXOjI1NixMT0NLRURDT05URU5UUzo1MTJ9O3QuQW5ub3RhdGlvbkZpZWxkRmxhZz17UkVBRE9OTFk6MSxSRVFVSVJFRDoyLE5PRVhQT1JUOjQsTVVMVElMSU5FOjQwOTYsUEFTU1dPUkQ6ODE5MixOT1RPR0dMRVRPT0ZGOjE2Mzg0LFJBRElPOjMyNzY4LFBVU0hCVVRUT046NjU1MzYsQ09NQk86MTMxMDcyLEVESVQ6MjYyMTQ0LFNPUlQ6NTI0Mjg4LEZJTEVTRUxFQ1Q6MTA0ODU3NixNVUxUSVNFTEVDVDoyMDk3MTUyLERPTk9UU1BFTExDSEVDSzo0MTk0MzA0LERPTk9UU0NST0xMOjgzODg2MDgsQ09NQjoxNjc3NzIxNixSSUNIVEVYVDozMzU1NDQzMixSQURJT1NJTlVOSVNPTjozMzU1NDQzMixDT01NSVRPTlNFTENIQU5HRTo2NzEwODg2NH07dC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlPXtTT0xJRDoxLERBU0hFRDoyLEJFVkVMRUQ6MyxJTlNFVDo0LFVOREVSTElORTo1fTt0LlN0cmVhbVR5cGU9e1VOS05PV046IlVOS05PV04iLEZMQVRFOiJGTEFURSIsTFpXOiJMWlciLERDVDoiRENUIixKUFg6IkpQWCIsSkJJRzoiSkJJRyIsQTg1OiJBODUiLEFIWDoiQUhYIixDQ0Y6IkNDRiIsUkxYOiJSTFgifTt0LkZvbnRUeXBlPXtVTktOT1dOOiJVTktOT1dOIixUWVBFMToiVFlQRTEiLFRZUEUxQzoiVFlQRTFDIixDSURGT05UVFlQRTA6IkNJREZPTlRUWVBFMCIsQ0lERk9OVFRZUEUwQzoiQ0lERk9OVFRZUEUwQyIsVFJVRVRZUEU6IlRSVUVUWVBFIixDSURGT05UVFlQRTI6IkNJREZPTlRUWVBFMiIsVFlQRTM6IlRZUEUzIixPUEVOVFlQRToiT1BFTlRZUEUiLFRZUEUwOiJUWVBFMCIsTU1UWVBFMToiTU1UWVBFMSJ9O2NvbnN0IG49e0VSUk9SUzowLFdBUk5JTkdTOjEsSU5GT1M6NX07dC5WZXJib3NpdHlMZXZlbD1uO3QuQ01hcENvbXByZXNzaW9uVHlwZT17Tk9ORTowLEJJTkFSWToxLFNUUkVBTToyfTt0Lk9QUz17ZGVwZW5kZW5jeToxLHNldExpbmVXaWR0aDoyLHNldExpbmVDYXA6MyxzZXRMaW5lSm9pbjo0LHNldE1pdGVyTGltaXQ6NSxzZXREYXNoOjYsc2V0UmVuZGVyaW5nSW50ZW50Ojcsc2V0RmxhdG5lc3M6OCxzZXRHU3RhdGU6OSxzYXZlOjEwLHJlc3RvcmU6MTEsdHJhbnNmb3JtOjEyLG1vdmVUbzoxMyxsaW5lVG86MTQsY3VydmVUbzoxNSxjdXJ2ZVRvMjoxNixjdXJ2ZVRvMzoxNyxjbG9zZVBhdGg6MTgscmVjdGFuZ2xlOjE5LHN0cm9rZToyMCxjbG9zZVN0cm9rZToyMSxmaWxsOjIyLGVvRmlsbDoyMyxmaWxsU3Ryb2tlOjI0LGVvRmlsbFN0cm9rZToyNSxjbG9zZUZpbGxTdHJva2U6MjYsY2xvc2VFT0ZpbGxTdHJva2U6MjcsZW5kUGF0aDoyOCxjbGlwOjI5LGVvQ2xpcDozMCxiZWdpblRleHQ6MzEsZW5kVGV4dDozMixzZXRDaGFyU3BhY2luZzozMyxzZXRXb3JkU3BhY2luZzozNCxzZXRIU2NhbGU6MzUsc2V0TGVhZGluZzozNixzZXRGb250OjM3LHNldFRleHRSZW5kZXJpbmdNb2RlOjM4LHNldFRleHRSaXNlOjM5LG1vdmVUZXh0OjQwLHNldExlYWRpbmdNb3ZlVGV4dDo0MSxzZXRUZXh0TWF0cml4OjQyLG5leHRMaW5lOjQzLHNob3dUZXh0OjQ0LHNob3dTcGFjZWRUZXh0OjQ1LG5leHRMaW5lU2hvd1RleHQ6NDYsbmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6NDcsc2V0Q2hhcldpZHRoOjQ4LHNldENoYXJXaWR0aEFuZEJvdW5kczo0OSxzZXRTdHJva2VDb2xvclNwYWNlOjUwLHNldEZpbGxDb2xvclNwYWNlOjUxLHNldFN0cm9rZUNvbG9yOjUyLHNldFN0cm9rZUNvbG9yTjo1MyxzZXRGaWxsQ29sb3I6NTQsc2V0RmlsbENvbG9yTjo1NSxzZXRTdHJva2VHcmF5OjU2LHNldEZpbGxHcmF5OjU3LHNldFN0cm9rZVJHQkNvbG9yOjU4LHNldEZpbGxSR0JDb2xvcjo1OSxzZXRTdHJva2VDTVlLQ29sb3I6NjAsc2V0RmlsbENNWUtDb2xvcjo2MSxzaGFkaW5nRmlsbDo2MixiZWdpbklubGluZUltYWdlOjYzLGJlZ2luSW1hZ2VEYXRhOjY0LGVuZElubGluZUltYWdlOjY1LHBhaW50WE9iamVjdDo2NixtYXJrUG9pbnQ6NjcsbWFya1BvaW50UHJvcHM6NjgsYmVnaW5NYXJrZWRDb250ZW50OjY5LGJlZ2luTWFya2VkQ29udGVudFByb3BzOjcwLGVuZE1hcmtlZENvbnRlbnQ6NzEsYmVnaW5Db21wYXQ6NzIsZW5kQ29tcGF0OjczLHBhaW50Rm9ybVhPYmplY3RCZWdpbjo3NCxwYWludEZvcm1YT2JqZWN0RW5kOjc1LGJlZ2luR3JvdXA6NzYsZW5kR3JvdXA6NzcsYmVnaW5Bbm5vdGF0aW9uczo3OCxlbmRBbm5vdGF0aW9uczo3OSxiZWdpbkFubm90YXRpb246ODAsZW5kQW5ub3RhdGlvbjo4MSxwYWludEpwZWdYT2JqZWN0OjgyLHBhaW50SW1hZ2VNYXNrWE9iamVjdDo4MyxwYWludEltYWdlTWFza1hPYmplY3RHcm91cDo4NCxwYWludEltYWdlWE9iamVjdDo4NSxwYWludElubGluZUltYWdlWE9iamVjdDo4NixwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOjg3LHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0Ojg4LHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDo4OSxwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6OTAsY29uc3RydWN0UGF0aDo5MX07dC5VTlNVUFBPUlRFRF9GRUFUVVJFUz17dW5rbm93bjoidW5rbm93biIsZm9ybXM6ImZvcm1zIixqYXZhU2NyaXB0OiJqYXZhU2NyaXB0IixzbWFzazoic21hc2siLHNoYWRpbmdQYXR0ZXJuOiJzaGFkaW5nUGF0dGVybiIsZm9udDoiZm9udCIsZXJyb3JUaWxpbmdQYXR0ZXJuOiJlcnJvclRpbGluZ1BhdHRlcm4iLGVycm9yRXh0R1N0YXRlOiJlcnJvckV4dEdTdGF0ZSIsZXJyb3JYT2JqZWN0OiJlcnJvclhPYmplY3QiLGVycm9yRm9udExvYWRUeXBlMzoiZXJyb3JGb250TG9hZFR5cGUzIixlcnJvckZvbnRTdGF0ZToiZXJyb3JGb250U3RhdGUiLGVycm9yRm9udE1pc3Npbmc6ImVycm9yRm9udE1pc3NpbmciLGVycm9yRm9udFRyYW5zbGF0ZToiZXJyb3JGb250VHJhbnNsYXRlIixlcnJvckNvbG9yU3BhY2U6ImVycm9yQ29sb3JTcGFjZSIsZXJyb3JPcGVyYXRvckxpc3Q6ImVycm9yT3BlcmF0b3JMaXN0IixlcnJvckZvbnRUb1VuaWNvZGU6ImVycm9yRm9udFRvVW5pY29kZSIsZXJyb3JGb250TG9hZE5hdGl2ZToiZXJyb3JGb250TG9hZE5hdGl2ZSIsZXJyb3JGb250R2V0UGF0aDoiZXJyb3JGb250R2V0UGF0aCIsZXJyb3JNYXJrZWRDb250ZW50OiJlcnJvck1hcmtlZENvbnRlbnQifTt0LlBhc3N3b3JkUmVzcG9uc2VzPXtORUVEX1BBU1NXT1JEOjEsSU5DT1JSRUNUX1BBU1NXT1JEOjJ9O2xldCBzPW4uV0FSTklOR1M7ZnVuY3Rpb24gd2FybihlKXtzPj1uLldBUk5JTkdTJiZjb25zb2xlLmxvZygiV2FybmluZzogIitlKX1mdW5jdGlvbiB1bnJlYWNoYWJsZShlKXt0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gYXNzZXJ0KGUsdCl7ZXx8dW5yZWFjaGFibGUodCl9ZnVuY3Rpb24gc2hhZG93KGUsdCxyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiExfSk7cmV0dXJuIHJ9Y29uc3QgYT1mdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpe2Z1bmN0aW9uIEJhc2VFeGNlcHRpb24oZSl7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VFeGNlcHRpb24mJnVucmVhY2hhYmxlKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLiIpO3RoaXMubWVzc2FnZT1lO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWV9QmFzZUV4Y2VwdGlvbi5wcm90b3R5cGU9bmV3IEVycm9yO0Jhc2VFeGNlcHRpb24uY29uc3RydWN0b3I9QmFzZUV4Y2VwdGlvbjtyZXR1cm4gQmFzZUV4Y2VwdGlvbn0oKTt0LkJhc2VFeGNlcHRpb249YTt0LlBhc3N3b3JkRXhjZXB0aW9uPWNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpO3RoaXMuY29kZT10fX07dC5Vbmtub3duRXJyb3JFeGNlcHRpb249Y2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpO3RoaXMuZGV0YWlscz10fX07dC5JbnZhbGlkUERGRXhjZXB0aW9uPWNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBhe307dC5NaXNzaW5nUERGRXhjZXB0aW9uPWNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBhe307dC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249Y2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpO3RoaXMuc3RhdHVzPXR9fTt0LkZvcm1hdEVycm9yPWNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgYXt9O3QuQWJvcnRFeGNlcHRpb249Y2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBhe307Y29uc3QgaT0vXHgwMC9nO2Z1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoZSl7YXNzZXJ0KCJzdHJpbmciPT10eXBlb2YgZSwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpO2NvbnN0IHQ9ZS5sZW5ndGgscj1uZXcgVWludDhBcnJheSh0KTtmb3IobGV0IG49MDtuPHQ7KytuKXJbbl09MjU1JmUuY2hhckNvZGVBdChuKTtyZXR1cm4gcn1mdW5jdGlvbiBhcnJheUJ5dGVMZW5ndGgoZSl7aWYodm9pZCAwIT09ZS5sZW5ndGgpcmV0dXJuIGUubGVuZ3RoO2Fzc2VydCh2b2lkIDAhPT1lLmJ5dGVMZW5ndGgsImFycmF5Qnl0ZUxlbmd0aCAtIGludmFsaWQgYXJndW1lbnQuIik7cmV0dXJuIGUuYnl0ZUxlbmd0aH1jb25zdCBvPXtnZXQgdmFsdWUoKXtyZXR1cm4gc2hhZG93KHRoaXMsInZhbHVlIixmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoNCk7ZVswXT0xO3JldHVybiAxPT09bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLDAsMSlbMF19KCkpfX07dC5Jc0xpdHRsZUVuZGlhbkNhY2hlZD1vO2NvbnN0IGw9e2dldCB2YWx1ZSgpe3JldHVybiBzaGFkb3codGhpcywidmFsdWUiLGZ1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpe3RyeXtuZXcgRnVuY3Rpb24oIiIpO3JldHVybiEwfWNhdGNoKGUpe3JldHVybiExfX0oKSl9fTt0LklzRXZhbFN1cHBvcnRlZENhY2hlZD1sO2NvbnN0IGM9WyJyZ2IoIiwwLCIsIiwwLCIsIiwwLCIpIl07Y2xhc3MgVXRpbHtzdGF0aWMgbWFrZUNzc1JnYihlLHQscil7Y1sxXT1lO2NbM109dDtjWzVdPXI7cmV0dXJuIGMuam9pbigiIil9c3RhdGljIHRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsyXSp0WzFdLGVbMV0qdFswXStlWzNdKnRbMV0sZVswXSp0WzJdK2VbMl0qdFszXSxlWzFdKnRbMl0rZVszXSp0WzNdLGVbMF0qdFs0XStlWzJdKnRbNV0rZVs0XSxlWzFdKnRbNF0rZVszXSp0WzVdK2VbNV1dfXN0YXRpYyBhcHBseVRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsxXSp0WzJdK3RbNF0sZVswXSp0WzFdK2VbMV0qdFszXSt0WzVdXX1zdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKGUsdCl7Y29uc3Qgcj10WzBdKnRbM10tdFsxXSp0WzJdO3JldHVyblsoZVswXSp0WzNdLWVbMV0qdFsyXSt0WzJdKnRbNV0tdFs0XSp0WzNdKS9yLCgtZVswXSp0WzFdK2VbMV0qdFswXSt0WzRdKnRbMV0tdFs1XSp0WzBdKS9yXX1zdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZSx0KXtjb25zdCByPVV0aWwuYXBwbHlUcmFuc2Zvcm0oZSx0KSxuPVV0aWwuYXBwbHlUcmFuc2Zvcm0oZS5zbGljZSgyLDQpLHQpLHM9VXRpbC5hcHBseVRyYW5zZm9ybShbZVswXSxlWzNdXSx0KSxhPVV0aWwuYXBwbHlUcmFuc2Zvcm0oW2VbMl0sZVsxXV0sdCk7cmV0dXJuW01hdGgubWluKHJbMF0sblswXSxzWzBdLGFbMF0pLE1hdGgubWluKHJbMV0sblsxXSxzWzFdLGFbMV0pLE1hdGgubWF4KHJbMF0sblswXSxzWzBdLGFbMF0pLE1hdGgubWF4KHJbMV0sblsxXSxzWzFdLGFbMV0pXX1zdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShlKXtjb25zdCB0PWVbMF0qZVszXS1lWzFdKmVbMl07cmV0dXJuW2VbM10vdCwtZVsxXS90LC1lWzJdL3QsZVswXS90LChlWzJdKmVbNV0tZVs0XSplWzNdKS90LChlWzRdKmVbMV0tZVs1XSplWzBdKS90XX1zdGF0aWMgYXBwbHkzZFRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsxXSp0WzFdK2VbMl0qdFsyXSxlWzNdKnRbMF0rZVs0XSp0WzFdK2VbNV0qdFsyXSxlWzZdKnRbMF0rZVs3XSp0WzFdK2VbOF0qdFsyXV19c3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUpe2NvbnN0IHQ9W2VbMF0sZVsyXSxlWzFdLGVbM11dLHI9ZVswXSp0WzBdK2VbMV0qdFsyXSxuPWVbMF0qdFsxXStlWzFdKnRbM10scz1lWzJdKnRbMF0rZVszXSp0WzJdLGE9ZVsyXSp0WzFdK2VbM10qdFszXSxpPShyK2EpLzIsbz1NYXRoLnNxcnQoKHIrYSkqKHIrYSktNCoociphLXMqbikpLzIsbD1pK298fDEsYz1pLW98fDE7cmV0dXJuW01hdGguc3FydChsKSxNYXRoLnNxcnQoYyldfXN0YXRpYyBub3JtYWxpemVSZWN0KGUpe2NvbnN0IHQ9ZS5zbGljZSgwKTtpZihlWzBdPmVbMl0pe3RbMF09ZVsyXTt0WzJdPWVbMF19aWYoZVsxXT5lWzNdKXt0WzFdPWVbM107dFszXT1lWzFdfXJldHVybiB0fXN0YXRpYyBpbnRlcnNlY3QoZSx0KXtmdW5jdGlvbiBjb21wYXJlKGUsdCl7cmV0dXJuIGUtdH1jb25zdCByPVtlWzBdLGVbMl0sdFswXSx0WzJdXS5zb3J0KGNvbXBhcmUpLG49W2VbMV0sZVszXSx0WzFdLHRbM11dLnNvcnQoY29tcGFyZSkscz1bXTtlPVV0aWwubm9ybWFsaXplUmVjdChlKTt0PVV0aWwubm9ybWFsaXplUmVjdCh0KTtpZighKHJbMF09PT1lWzBdJiZyWzFdPT09dFswXXx8clswXT09PXRbMF0mJnJbMV09PT1lWzBdKSlyZXR1cm4gbnVsbDtzWzBdPXJbMV07c1syXT1yWzJdO2lmKCEoblswXT09PWVbMV0mJm5bMV09PT10WzFdfHxuWzBdPT09dFsxXSYmblsxXT09PWVbMV0pKXJldHVybiBudWxsO3NbMV09blsxXTtzWzNdPW5bMl07cmV0dXJuIHN9fXQuVXRpbD1VdGlsO2NvbnN0IGg9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDcyOCw3MTEsNzEwLDcyOSw3MzMsNzMxLDczMCw3MzIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODIyNiw4MjI0LDgyMjUsODIzMCw4MjEyLDgyMTEsNDAyLDgyNjAsODI0OSw4MjUwLDg3MjIsODI0MCw4MjIyLDgyMjAsODIyMSw4MjE2LDgyMTcsODIxOCw4NDgyLDY0MjU3LDY0MjU4LDMyMSwzMzgsMzUyLDM3NiwzODEsMzA1LDMyMiwzMzksMzUzLDM4MiwwLDgzNjRdO2NvbnN0IGQ9ZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMQ2xvc3VyZSgpe2NvbnN0IGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjtyZXR1cm4gZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKHQscixuPSExKXtpZighbiYmVVJMLmNyZWF0ZU9iamVjdFVSTCl7Y29uc3QgZT1uZXcgQmxvYihbdF0se3R5cGU6cn0pO3JldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGUpfWxldCBzPWBkYXRhOiR7cn07YmFzZTY0LGA7Zm9yKGxldCByPTAsbj10Lmxlbmd0aDtyPG47cis9Myl7Y29uc3QgYT0yNTUmdFtyXSxpPTI1NSZ0W3IrMV0sbz0yNTUmdFtyKzJdO3MrPWVbYT4+Ml0rZVsoMyZhKTw8NHxpPj40XStlW3IrMTxuPygxNSZpKTw8MnxvPj42OjY0XStlW3IrMjxuPzYzJm86NjRdfXJldHVybiBzfX0oKTt0LmNyZWF0ZU9iamVjdFVSTD1kfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3IoNCl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuaXNOb2RlSlM9dm9pZCAwO2NvbnN0IG49ISgib2JqZWN0IiE9dHlwZW9mIHByb2Nlc3N8fHByb2Nlc3MrIiIhPSJbb2JqZWN0IHByb2Nlc3NdInx8cHJvY2Vzcy52ZXJzaW9ucy5ud3x8cHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiYmcHJvY2Vzcy50eXBlJiYiYnJvd3NlciIhPT1wcm9jZXNzLnR5cGUpO3QuaXNOb2RlSlM9bn0sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193X3BkZmpzX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtleHBvcnRzLmdldERvY3VtZW50PWdldERvY3VtZW50O2V4cG9ydHMuc2V0UERGTmV0d29ya1N0cmVhbUZhY3Rvcnk9c2V0UERGTmV0d29ya1N0cmVhbUZhY3Rvcnk7ZXhwb3J0cy5idWlsZD1leHBvcnRzLnZlcnNpb249ZXhwb3J0cy5QREZQYWdlUHJveHk9ZXhwb3J0cy5QREZEb2N1bWVudFByb3h5PWV4cG9ydHMuUERGV29ya2VyPWV4cG9ydHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0PWV4cG9ydHMuTG9vcGJhY2tQb3J0PXZvaWQgMDt2YXIgX3V0aWw9X193X3BkZmpzX3JlcXVpcmVfXygyKSxfZGlzcGxheV91dGlscz1fX3dfcGRmanNfcmVxdWlyZV9fKDEpLF9mb250X2xvYWRlcj1fX3dfcGRmanNfcmVxdWlyZV9fKDYpLF9ub2RlX3V0aWxzPV9fd19wZGZqc19yZXF1aXJlX18oNyksX2Fubm90YXRpb25fc3RvcmFnZT1fX3dfcGRmanNfcmVxdWlyZV9fKDgpLF9hcGlfY29tcGF0aWJpbGl0eT1fX3dfcGRmanNfcmVxdWlyZV9fKDkpLF9jYW52YXM9X193X3BkZmpzX3JlcXVpcmVfXygxMCksX3dvcmtlcl9vcHRpb25zPV9fd19wZGZqc19yZXF1aXJlX18oMTIpLF9pc19ub2RlPV9fd19wZGZqc19yZXF1aXJlX18oNCksX21lc3NhZ2VfaGFuZGxlcj1fX3dfcGRmanNfcmVxdWlyZV9fKDEzKSxfbWV0YWRhdGE9X193X3BkZmpzX3JlcXVpcmVfXygxNCksX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnPV9fd19wZGZqc19yZXF1aXJlX18oMTYpLF90cmFuc3BvcnRfc3RyZWFtPV9fd19wZGZqc19yZXF1aXJlX18oMTcpLF93ZWJnbD1fX3dfcGRmanNfcmVxdWlyZV9fKDE4KTtjb25zdCBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU9NjU1MzYsUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUPTEwMCxEZWZhdWx0Q2FudmFzRmFjdG9yeT1faXNfbm9kZS5pc05vZGVKUz9fbm9kZV91dGlscy5Ob2RlQ2FudmFzRmFjdG9yeTpfZGlzcGxheV91dGlscy5ET01DYW52YXNGYWN0b3J5LERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeT1faXNfbm9kZS5pc05vZGVKUz9fbm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3Rvcnk6X2Rpc3BsYXlfdXRpbHMuRE9NQ01hcFJlYWRlckZhY3Rvcnk7bGV0IGNyZWF0ZVBERk5ldHdvcmtTdHJlYW07ZnVuY3Rpb24gc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkoZSl7Y3JlYXRlUERGTmV0d29ya1N0cmVhbT1lfWZ1bmN0aW9uIGdldERvY3VtZW50KGUpe2NvbnN0IHQ9bmV3IFBERkRvY3VtZW50TG9hZGluZ1Rhc2s7bGV0IHI7aWYoInN0cmluZyI9PXR5cGVvZiBlKXI9e3VybDplfTtlbHNlIGlmKCgwLF91dGlsLmlzQXJyYXlCdWZmZXIpKGUpKXI9e2RhdGE6ZX07ZWxzZSBpZihlIGluc3RhbmNlb2YgUERGRGF0YVJhbmdlVHJhbnNwb3J0KXI9e3JhbmdlOmV9O2Vsc2V7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgaW4gZ2V0RG9jdW1lbnQsIG5lZWQgZWl0aGVyIFVpbnQ4QXJyYXksIHN0cmluZyBvciBhIHBhcmFtZXRlciBvYmplY3QiKTtpZighZS51cmwmJiFlLmRhdGEmJiFlLnJhbmdlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgb2JqZWN0OiBuZWVkIGVpdGhlciAuZGF0YSwgLnJhbmdlIG9yIC51cmwiKTtyPWV9Y29uc3Qgbj1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBzPW51bGwsYT1udWxsO2Zvcihjb25zdCBlIGluIHIpaWYoInVybCIhPT1lfHwidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdylpZigicmFuZ2UiIT09ZSlpZigid29ya2VyIiE9PWUpaWYoImRhdGEiIT09ZXx8cltlXWluc3RhbmNlb2YgVWludDhBcnJheSluW2VdPXJbZV07ZWxzZXtjb25zdCB0PXJbZV07aWYoInN0cmluZyI9PXR5cGVvZiB0KW5bZV09KDAsX3V0aWwuc3RyaW5nVG9CeXRlcykodCk7ZWxzZSBpZigib2JqZWN0IiE9dHlwZW9mIHR8fG51bGw9PT10fHxpc05hTih0Lmxlbmd0aCkpe2lmKCEoMCxfdXRpbC5pc0FycmF5QnVmZmVyKSh0KSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgUERGIGJpbmFyeSBkYXRhOiBlaXRoZXIgdHlwZWQgYXJyYXksIHN0cmluZyBvciBhcnJheS1saWtlIG9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgZGF0YSBwcm9wZXJ0eS4iKTtuW2VdPW5ldyBVaW50OEFycmF5KHQpfWVsc2UgbltlXT1uZXcgVWludDhBcnJheSh0KX1lbHNlIGE9cltlXTtlbHNlIHM9cltlXTtlbHNlIG5bZV09bmV3IFVSTChyW2VdLHdpbmRvdy5sb2NhdGlvbikuaHJlZjtuLnJhbmdlQ2h1bmtTaXplPW4ucmFuZ2VDaHVua1NpemV8fERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRTtuLkNNYXBSZWFkZXJGYWN0b3J5PW4uQ01hcFJlYWRlckZhY3Rvcnl8fERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeTtuLmlnbm9yZUVycm9ycz0hMCE9PW4uc3RvcEF0RXJyb3JzO24uZm9udEV4dHJhUHJvcGVydGllcz0hMD09PW4uZm9udEV4dHJhUHJvcGVydGllcztuLnBkZkJ1Zz0hMD09PW4ucGRmQnVnO051bWJlci5pc0ludGVnZXIobi5tYXhJbWFnZVNpemUpfHwobi5tYXhJbWFnZVNpemU9LTEpOyJib29sZWFuIiE9dHlwZW9mIG4uaXNFdmFsU3VwcG9ydGVkJiYobi5pc0V2YWxTdXBwb3J0ZWQ9ITApOyJib29sZWFuIiE9dHlwZW9mIG4uZGlzYWJsZUZvbnRGYWNlJiYobi5kaXNhYmxlRm9udEZhY2U9X2FwaV9jb21wYXRpYmlsaXR5LmFwaUNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUZvbnRGYWNlfHwhMSk7dm9pZCAwPT09bi5vd25lckRvY3VtZW50JiYobi5vd25lckRvY3VtZW50PWdsb2JhbFRoaXMuZG9jdW1lbnQpOyJib29sZWFuIiE9dHlwZW9mIG4uZGlzYWJsZVJhbmdlJiYobi5kaXNhYmxlUmFuZ2U9ITEpOyJib29sZWFuIiE9dHlwZW9mIG4uZGlzYWJsZVN0cmVhbSYmKG4uZGlzYWJsZVN0cmVhbT0hMSk7ImJvb2xlYW4iIT10eXBlb2Ygbi5kaXNhYmxlQXV0b0ZldGNoJiYobi5kaXNhYmxlQXV0b0ZldGNoPSExKTsoMCxfdXRpbC5zZXRWZXJib3NpdHlMZXZlbCkobi52ZXJib3NpdHkpO2lmKCFhKXtjb25zdCBlPXt2ZXJib3NpdHk6bi52ZXJib3NpdHkscG9ydDpfd29ya2VyX29wdGlvbnMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0fTthPWUucG9ydD9QREZXb3JrZXIuZnJvbVBvcnQoZSk6bmV3IFBERldvcmtlcihlKTt0Ll93b3JrZXI9YX1jb25zdCBpPXQuZG9jSWQ7YS5wcm9taXNlLnRoZW4oKGZ1bmN0aW9uKCl7aWYodC5kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJMb2FkaW5nIGFib3J0ZWQiKTtjb25zdCBlPV9mZXRjaERvY3VtZW50KGEsbixzLGkpLHI9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe2xldCB0O3M/dD1uZXcgX3RyYW5zcG9ydF9zdHJlYW0uUERGRGF0YVRyYW5zcG9ydFN0cmVhbSh7bGVuZ3RoOm4ubGVuZ3RoLGluaXRpYWxEYXRhOm4uaW5pdGlhbERhdGEscHJvZ3Jlc3NpdmVEb25lOm4ucHJvZ3Jlc3NpdmVEb25lLGRpc2FibGVSYW5nZTpuLmRpc2FibGVSYW5nZSxkaXNhYmxlU3RyZWFtOm4uZGlzYWJsZVN0cmVhbX0scyk6bi5kYXRhfHwodD1jcmVhdGVQREZOZXR3b3JrU3RyZWFtKHt1cmw6bi51cmwsbGVuZ3RoOm4ubGVuZ3RoLGh0dHBIZWFkZXJzOm4uaHR0cEhlYWRlcnMsd2l0aENyZWRlbnRpYWxzOm4ud2l0aENyZWRlbnRpYWxzLHJhbmdlQ2h1bmtTaXplOm4ucmFuZ2VDaHVua1NpemUsZGlzYWJsZVJhbmdlOm4uZGlzYWJsZVJhbmdlLGRpc2FibGVTdHJlYW06bi5kaXNhYmxlU3RyZWFtfSkpO2UodCl9KSk7cmV0dXJuIFByb21pc2UuYWxsKFtlLHJdKS50aGVuKChmdW5jdGlvbihbZSxyXSl7aWYodC5kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJMb2FkaW5nIGFib3J0ZWQiKTtjb25zdCBzPW5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKGksZSxhLnBvcnQpO3MucG9zdE1lc3NhZ2VUcmFuc2ZlcnM9YS5wb3N0TWVzc2FnZVRyYW5zZmVycztjb25zdCBvPW5ldyBXb3JrZXJUcmFuc3BvcnQocyx0LHIsbik7dC5fdHJhbnNwb3J0PW87cy5zZW5kKCJSZWFkeSIsbnVsbCl9KSl9KSkuY2F0Y2godC5fY2FwYWJpbGl0eS5yZWplY3QpO3JldHVybiB0fWZ1bmN0aW9uIF9mZXRjaERvY3VtZW50KGUsdCxyLG4pe2lmKGUuZGVzdHJveWVkKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpO2lmKHIpe3QubGVuZ3RoPXIubGVuZ3RoO3QuaW5pdGlhbERhdGE9ci5pbml0aWFsRGF0YTt0LnByb2dyZXNzaXZlRG9uZT1yLnByb2dyZXNzaXZlRG9uZX1yZXR1cm4gZS5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERvY1JlcXVlc3QiLHtkb2NJZDpuLGFwaVZlcnNpb246IjIuNi4zNDciLHNvdXJjZTp7ZGF0YTp0LmRhdGEsdXJsOnQudXJsLHBhc3N3b3JkOnQucGFzc3dvcmQsZGlzYWJsZUF1dG9GZXRjaDp0LmRpc2FibGVBdXRvRmV0Y2gscmFuZ2VDaHVua1NpemU6dC5yYW5nZUNodW5rU2l6ZSxsZW5ndGg6dC5sZW5ndGh9LG1heEltYWdlU2l6ZTp0Lm1heEltYWdlU2l6ZSxkaXNhYmxlRm9udEZhY2U6dC5kaXNhYmxlRm9udEZhY2UscG9zdE1lc3NhZ2VUcmFuc2ZlcnM6ZS5wb3N0TWVzc2FnZVRyYW5zZmVycyxkb2NCYXNlVXJsOnQuZG9jQmFzZVVybCxpZ25vcmVFcnJvcnM6dC5pZ25vcmVFcnJvcnMsaXNFdmFsU3VwcG9ydGVkOnQuaXNFdmFsU3VwcG9ydGVkLGZvbnRFeHRyYVByb3BlcnRpZXM6dC5mb250RXh0cmFQcm9wZXJ0aWVzfSkudGhlbigoZnVuY3Rpb24odCl7aWYoZS5kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpO3JldHVybiB0fSkpfWNvbnN0IFBERkRvY3VtZW50TG9hZGluZ1Rhc2s9ZnVuY3Rpb24gUERGRG9jdW1lbnRMb2FkaW5nVGFza0Nsb3N1cmUoKXtsZXQgZT0wO3JldHVybiBjbGFzcyBQREZEb2N1bWVudExvYWRpbmdUYXNre2NvbnN0cnVjdG9yKCl7dGhpcy5fY2FwYWJpbGl0eT0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl90cmFuc3BvcnQ9bnVsbDt0aGlzLl93b3JrZXI9bnVsbDt0aGlzLmRvY0lkPSJkIitlKys7dGhpcy5kZXN0cm95ZWQ9ITE7dGhpcy5vblBhc3N3b3JkPW51bGw7dGhpcy5vblByb2dyZXNzPW51bGw7dGhpcy5vblVuc3VwcG9ydGVkRmVhdHVyZT1udWxsfWdldCBwcm9taXNlKCl7cmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZX1kZXN0cm95KCl7dGhpcy5kZXN0cm95ZWQ9ITA7cmV0dXJuKHRoaXMuX3RyYW5zcG9ydD90aGlzLl90cmFuc3BvcnQuZGVzdHJveSgpOlByb21pc2UucmVzb2x2ZSgpKS50aGVuKCgpPT57dGhpcy5fdHJhbnNwb3J0PW51bGw7aWYodGhpcy5fd29ya2VyKXt0aGlzLl93b3JrZXIuZGVzdHJveSgpO3RoaXMuX3dvcmtlcj1udWxsfX0pfX19KCk7Y2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0e2NvbnN0cnVjdG9yKGUsdCxyPSExKXt0aGlzLmxlbmd0aD1lO3RoaXMuaW5pdGlhbERhdGE9dDt0aGlzLnByb2dyZXNzaXZlRG9uZT1yO3RoaXMuX3JhbmdlTGlzdGVuZXJzPVtdO3RoaXMuX3Byb2dyZXNzTGlzdGVuZXJzPVtdO3RoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycz1bXTt0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnM9W107dGhpcy5fcmVhZHlDYXBhYmlsaXR5PSgwLF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpfWFkZFJhbmdlTGlzdGVuZXIoZSl7dGhpcy5fcmFuZ2VMaXN0ZW5lcnMucHVzaChlKX1hZGRQcm9ncmVzc0xpc3RlbmVyKGUpe3RoaXMuX3Byb2dyZXNzTGlzdGVuZXJzLnB1c2goZSl9YWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIoZSl7dGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzLnB1c2goZSl9YWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIoZSl7dGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzLnB1c2goZSl9b25EYXRhUmFuZ2UoZSx0KXtmb3IoY29uc3QgciBvZiB0aGlzLl9yYW5nZUxpc3RlbmVycylyKGUsdCl9b25EYXRhUHJvZ3Jlc3MoZSx0KXt0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpPT57Zm9yKGNvbnN0IHIgb2YgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMpcihlLHQpfSl9b25EYXRhUHJvZ3Jlc3NpdmVSZWFkKGUpe3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCk9Pntmb3IoY29uc3QgdCBvZiB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMpdChlKX0pfW9uRGF0YVByb2dyZXNzaXZlRG9uZSgpe3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCk9Pntmb3IoY29uc3QgZSBvZiB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMpZSgpfSl9dHJhbnNwb3J0UmVhZHkoKXt0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpfXJlcXVlc3REYXRhUmFuZ2UoZSx0KXsoMCxfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBQREZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZSIpfWFib3J0KCl7fX1leHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydD1QREZEYXRhUmFuZ2VUcmFuc3BvcnQ7Y2xhc3MgUERGRG9jdW1lbnRQcm94eXtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX3BkZkluZm89ZTt0aGlzLl90cmFuc3BvcnQ9dH1nZXQgYW5ub3RhdGlvblN0b3JhZ2UoKXtyZXR1cm4oMCxfdXRpbC5zaGFkb3cpKHRoaXMsImFubm90YXRpb25TdG9yYWdlIixuZXcgX2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSl9Z2V0IG51bVBhZ2VzKCl7cmV0dXJuIHRoaXMuX3BkZkluZm8ubnVtUGFnZXN9Z2V0IGZpbmdlcnByaW50KCl7cmV0dXJuIHRoaXMuX3BkZkluZm8uZmluZ2VycHJpbnR9Z2V0UGFnZShlKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2UoZSl9Z2V0UGFnZUluZGV4KGUpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUluZGV4KGUpfWdldERlc3RpbmF0aW9ucygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCl9Z2V0RGVzdGluYXRpb24oZSl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbihlKX1nZXRQYWdlTGFiZWxzKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTGFiZWxzKCl9Z2V0UGFnZUxheW91dCgpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxheW91dCgpfWdldFBhZ2VNb2RlKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTW9kZSgpfWdldFZpZXdlclByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRWaWV3ZXJQcmVmZXJlbmNlcygpfWdldE9wZW5BY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wZW5BY3Rpb24oKX1nZXRBdHRhY2htZW50cygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QXR0YWNobWVudHMoKX1nZXRKYXZhU2NyaXB0KCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRKYXZhU2NyaXB0KCl9Z2V0T3V0bGluZSgpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpfWdldE9wdGlvbmFsQ29udGVudENvbmZpZygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCl9Z2V0UGVybWlzc2lvbnMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBlcm1pc3Npb25zKCl9Z2V0TWV0YWRhdGEoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCl9Z2V0RGF0YSgpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGF0YSgpfWdldERvd25sb2FkSW5mbygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlfWdldFN0YXRzKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRTdGF0cygpfWNsZWFudXAoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnN0YXJ0Q2xlYW51cCgpfWRlc3Ryb3koKXtyZXR1cm4gdGhpcy5sb2FkaW5nVGFzay5kZXN0cm95KCl9Z2V0IGxvYWRpbmdQYXJhbXMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdQYXJhbXN9Z2V0IGxvYWRpbmdUYXNrKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nVGFza31zYXZlRG9jdW1lbnQoZSl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zYXZlRG9jdW1lbnQoZSl9fWV4cG9ydHMuUERGRG9jdW1lbnRQcm94eT1QREZEb2N1bWVudFByb3h5O2NsYXNzIFBERlBhZ2VQcm94eXtjb25zdHJ1Y3RvcihlLHQscixuLHM9ITEpe3RoaXMuX3BhZ2VJbmRleD1lO3RoaXMuX3BhZ2VJbmZvPXQ7dGhpcy5fb3duZXJEb2N1bWVudD1uO3RoaXMuX3RyYW5zcG9ydD1yO3RoaXMuX3N0YXRzPXM/bmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcjpudWxsO3RoaXMuX3BkZkJ1Zz1zO3RoaXMuY29tbW9uT2Jqcz1yLmNvbW1vbk9ianM7dGhpcy5vYmpzPW5ldyBQREZPYmplY3RzO3RoaXMuY2xlYW51cEFmdGVyUmVuZGVyPSExO3RoaXMucGVuZGluZ0NsZWFudXA9ITE7dGhpcy5faW50ZW50U3RhdGVzPW5ldyBNYXA7dGhpcy5kZXN0cm95ZWQ9ITF9Z2V0IHBhZ2VOdW1iZXIoKXtyZXR1cm4gdGhpcy5fcGFnZUluZGV4KzF9Z2V0IHJvdGF0ZSgpe3JldHVybiB0aGlzLl9wYWdlSW5mby5yb3RhdGV9Z2V0IHJlZigpe3JldHVybiB0aGlzLl9wYWdlSW5mby5yZWZ9Z2V0IHVzZXJVbml0KCl7cmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnVzZXJVbml0fWdldCB2aWV3KCl7cmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnZpZXd9Z2V0Vmlld3BvcnQoe3NjYWxlOmUscm90YXRpb246dD10aGlzLnJvdGF0ZSxvZmZzZXRYOnI9MCxvZmZzZXRZOm49MCxkb250RmxpcDpzPSExfT17fSl7cmV0dXJuIG5ldyBfZGlzcGxheV91dGlscy5QYWdlVmlld3BvcnQoe3ZpZXdCb3g6dGhpcy52aWV3LHNjYWxlOmUscm90YXRpb246dCxvZmZzZXRYOnIsb2Zmc2V0WTpuLGRvbnRGbGlwOnN9KX1nZXRBbm5vdGF0aW9ucyh7aW50ZW50OmU9bnVsbH09e30pe2lmKCF0aGlzLmFubm90YXRpb25zUHJvbWlzZXx8dGhpcy5hbm5vdGF0aW9uc0ludGVudCE9PWUpe3RoaXMuYW5ub3RhdGlvbnNQcm9taXNlPXRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyh0aGlzLl9wYWdlSW5kZXgsZSk7dGhpcy5hbm5vdGF0aW9uc0ludGVudD1lfXJldHVybiB0aGlzLmFubm90YXRpb25zUHJvbWlzZX1yZW5kZXIoe2NhbnZhc0NvbnRleHQ6ZSx2aWV3cG9ydDp0LGludGVudDpyPSJkaXNwbGF5IixlbmFibGVXZWJHTDpuPSExLHJlbmRlckludGVyYWN0aXZlRm9ybXM6cz0hMSx0cmFuc2Zvcm06YT1udWxsLGltYWdlTGF5ZXI6aT1udWxsLGNhbnZhc0ZhY3Rvcnk6bz1udWxsLGJhY2tncm91bmQ6bD1udWxsLGFubm90YXRpb25TdG9yYWdlOmM9bnVsbCxvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlOmg9bnVsbH0pe3RoaXMuX3N0YXRzJiZ0aGlzLl9zdGF0cy50aW1lKCJPdmVyYWxsIik7Y29uc3QgZD0icHJpbnQiPT09cj8icHJpbnQiOiJkaXNwbGF5Ijt0aGlzLnBlbmRpbmdDbGVhbnVwPSExO2h8fChoPXRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSk7bGV0IHU9dGhpcy5faW50ZW50U3RhdGVzLmdldChkKTtpZighdSl7dT1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuX2ludGVudFN0YXRlcy5zZXQoZCx1KX1pZih1LnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpe2NsZWFyVGltZW91dCh1LnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpO3Uuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dD1udWxsfWNvbnN0IHA9b3x8bmV3IERlZmF1bHRDYW52YXNGYWN0b3J5KHtvd25lckRvY3VtZW50OnRoaXMuX293bmVyRG9jdW1lbnR9KSxmPW5ldyBfd2ViZ2wuV2ViR0xDb250ZXh0KHtlbmFibGU6bn0pO2lmKCF1LmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpe3UuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eT0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt1Lm9wZXJhdG9yTGlzdD17Zm5BcnJheTpbXSxhcmdzQXJyYXk6W10sbGFzdENodW5rOiExfTt0aGlzLl9zdGF0cyYmdGhpcy5fc3RhdHMudGltZSgiUGFnZSBSZXF1ZXN0Iik7dGhpcy5fcHVtcE9wZXJhdG9yTGlzdCh7cGFnZUluZGV4OnRoaXMuX3BhZ2VJbmRleCxpbnRlbnQ6ZCxyZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiEwPT09cyxhbm5vdGF0aW9uU3RvcmFnZTpjJiZjLmdldEFsbCgpfHxudWxsfSl9Y29uc3QgY29tcGxldGU9ZT0+e2NvbnN0IHQ9dS5yZW5kZXJUYXNrcy5pbmRleE9mKGcpO3Q+PTAmJnUucmVuZGVyVGFza3Muc3BsaWNlKHQsMSk7KHRoaXMuY2xlYW51cEFmdGVyUmVuZGVyfHwicHJpbnQiPT09ZCkmJih0aGlzLnBlbmRpbmdDbGVhbnVwPSEwKTt0aGlzLl90cnlDbGVhbnVwKCk7aWYoZSl7Zy5jYXBhYmlsaXR5LnJlamVjdChlKTt0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7aW50ZW50U3RhdGU6dSxyZWFzb246ZX0pfWVsc2UgZy5jYXBhYmlsaXR5LnJlc29sdmUoKTtpZih0aGlzLl9zdGF0cyl7dGhpcy5fc3RhdHMudGltZUVuZCgiUmVuZGVyaW5nIik7dGhpcy5fc3RhdHMudGltZUVuZCgiT3ZlcmFsbCIpfX0sZz1uZXcgSW50ZXJuYWxSZW5kZXJUYXNrKHtjYWxsYmFjazpjb21wbGV0ZSxwYXJhbXM6e2NhbnZhc0NvbnRleHQ6ZSx2aWV3cG9ydDp0LHRyYW5zZm9ybTphLGltYWdlTGF5ZXI6aSxiYWNrZ3JvdW5kOmx9LG9ianM6dGhpcy5vYmpzLGNvbW1vbk9ianM6dGhpcy5jb21tb25PYmpzLG9wZXJhdG9yTGlzdDp1Lm9wZXJhdG9yTGlzdCxwYWdlSW5kZXg6dGhpcy5fcGFnZUluZGV4LGNhbnZhc0ZhY3Rvcnk6cCx3ZWJHTENvbnRleHQ6Zix1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6InByaW50IiE9PWQscGRmQnVnOnRoaXMuX3BkZkJ1Z30pO3UucmVuZGVyVGFza3N8fCh1LnJlbmRlclRhc2tzPVtdKTt1LnJlbmRlclRhc2tzLnB1c2goZyk7Y29uc3QgbT1nLnRhc2s7UHJvbWlzZS5hbGwoW3UuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLGhdKS50aGVuKChbZSx0XSk9PntpZih0aGlzLnBlbmRpbmdDbGVhbnVwKWNvbXBsZXRlKCk7ZWxzZXt0aGlzLl9zdGF0cyYmdGhpcy5fc3RhdHMudGltZSgiUmVuZGVyaW5nIik7Zy5pbml0aWFsaXplR3JhcGhpY3Moe3RyYW5zcGFyZW5jeTplLG9wdGlvbmFsQ29udGVudENvbmZpZzp0fSk7Zy5vcGVyYXRvckxpc3RDaGFuZ2VkKCl9fSkuY2F0Y2goY29tcGxldGUpO3JldHVybiBtfWdldE9wZXJhdG9yTGlzdCgpe2xldCBlLHQ9dGhpcy5faW50ZW50U3RhdGVzLmdldCgib3BsaXN0Iik7aWYoIXQpe3Q9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KCJvcGxpc3QiLHQpfWlmKCF0Lm9wTGlzdFJlYWRDYXBhYmlsaXR5KXtlPU9iamVjdC5jcmVhdGUobnVsbCk7ZS5vcGVyYXRvckxpc3RDaGFuZ2VkPWZ1bmN0aW9uIG9wZXJhdG9yTGlzdENoYW5nZWQoKXtpZih0Lm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspe3Qub3BMaXN0UmVhZENhcGFiaWxpdHkucmVzb2x2ZSh0Lm9wZXJhdG9yTGlzdCk7Y29uc3Qgcj10LnJlbmRlclRhc2tzLmluZGV4T2YoZSk7cj49MCYmdC5yZW5kZXJUYXNrcy5zcGxpY2UociwxKX19O3Qub3BMaXN0UmVhZENhcGFiaWxpdHk9KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dC5yZW5kZXJUYXNrcz1bXTt0LnJlbmRlclRhc2tzLnB1c2goZSk7dC5vcGVyYXRvckxpc3Q9e2ZuQXJyYXk6W10sYXJnc0FycmF5OltdLGxhc3RDaHVuazohMX07dGhpcy5fc3RhdHMmJnRoaXMuX3N0YXRzLnRpbWUoIlBhZ2UgUmVxdWVzdCIpO3RoaXMuX3B1bXBPcGVyYXRvckxpc3Qoe3BhZ2VJbmRleDp0aGlzLl9wYWdlSW5kZXgsaW50ZW50OiJvcGxpc3QifSl9cmV0dXJuIHQub3BMaXN0UmVhZENhcGFiaWxpdHkucHJvbWlzZX1zdHJlYW1UZXh0Q29udGVudCh7bm9ybWFsaXplV2hpdGVzcGFjZTplPSExLGRpc2FibGVDb21iaW5lVGV4dEl0ZW1zOnQ9ITF9PXt9KXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRUZXh0Q29udGVudCIse3BhZ2VJbmRleDp0aGlzLl9wYWdlSW5kZXgsbm9ybWFsaXplV2hpdGVzcGFjZTohMD09PWUsY29tYmluZVRleHRJdGVtczohMCE9PXR9LHtoaWdoV2F0ZXJNYXJrOjEwMCxzaXplOmU9PmUuaXRlbXMubGVuZ3RofSl9Z2V0VGV4dENvbnRlbnQoZT17fSl7Y29uc3QgdD10aGlzLnN0cmVhbVRleHRDb250ZW50KGUpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXtjb25zdCBuPXQuZ2V0UmVhZGVyKCkscz17aXRlbXM6W10sc3R5bGVzOk9iamVjdC5jcmVhdGUobnVsbCl9OyFmdW5jdGlvbiBwdW1wKCl7bi5yZWFkKCkudGhlbigoZnVuY3Rpb24oe3ZhbHVlOnQsZG9uZTpyfSl7aWYocillKHMpO2Vsc2V7T2JqZWN0LmFzc2lnbihzLnN0eWxlcyx0LnN0eWxlcyk7cy5pdGVtcy5wdXNoKC4uLnQuaXRlbXMpO3B1bXAoKX19KSxyKX0oKX0pKX1fZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwO3RoaXMuX3RyYW5zcG9ydC5wYWdlQ2FjaGVbdGhpcy5fcGFnZUluZGV4XT1udWxsO2NvbnN0IGU9W107Zm9yKGNvbnN0W3Qscl1vZiB0aGlzLl9pbnRlbnRTdGF0ZXMpe3RoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtpbnRlbnRTdGF0ZTpyLHJlYXNvbjpuZXcgRXJyb3IoIlBhZ2Ugd2FzIGRlc3Ryb3llZC4iKSxmb3JjZTohMH0pO2lmKCJvcGxpc3QiIT09dClmb3IoY29uc3QgdCBvZiByLnJlbmRlclRhc2tzKXtlLnB1c2godC5jb21wbGV0ZWQpO3QuY2FuY2VsKCl9fXRoaXMub2Jqcy5jbGVhcigpO3RoaXMuYW5ub3RhdGlvbnNQcm9taXNlPW51bGw7dGhpcy5wZW5kaW5nQ2xlYW51cD0hMTtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9Y2xlYW51cChlPSExKXt0aGlzLnBlbmRpbmdDbGVhbnVwPSEwO3JldHVybiB0aGlzLl90cnlDbGVhbnVwKGUpfV90cnlDbGVhbnVwKGU9ITEpe2lmKCF0aGlzLnBlbmRpbmdDbGVhbnVwKXJldHVybiExO2Zvcihjb25zdHtyZW5kZXJUYXNrczplLG9wZXJhdG9yTGlzdDp0fW9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSlpZigwIT09ZS5sZW5ndGh8fCF0Lmxhc3RDaHVuaylyZXR1cm4hMTt0aGlzLl9pbnRlbnRTdGF0ZXMuY2xlYXIoKTt0aGlzLm9ianMuY2xlYXIoKTt0aGlzLmFubm90YXRpb25zUHJvbWlzZT1udWxsO2UmJnRoaXMuX3N0YXRzJiYodGhpcy5fc3RhdHM9bmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcik7dGhpcy5wZW5kaW5nQ2xlYW51cD0hMTtyZXR1cm4hMH1fc3RhcnRSZW5kZXJQYWdlKGUsdCl7Y29uc3Qgcj10aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KHQpO2lmKHIpe3RoaXMuX3N0YXRzJiZ0aGlzLl9zdGF0cy50aW1lRW5kKCJQYWdlIFJlcXVlc3QiKTtyLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkmJnIuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKGUpfX1fcmVuZGVyUGFnZUNodW5rKGUsdCl7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXt0Lm9wZXJhdG9yTGlzdC5mbkFycmF5LnB1c2goZS5mbkFycmF5W3JdKTt0Lm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkucHVzaChlLmFyZ3NBcnJheVtyXSl9dC5vcGVyYXRvckxpc3QubGFzdENodW5rPWUubGFzdENodW5rO2ZvcihsZXQgZT0wO2U8dC5yZW5kZXJUYXNrcy5sZW5ndGg7ZSsrKXQucmVuZGVyVGFza3NbZV0ub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO2UubGFzdENodW5rJiZ0aGlzLl90cnlDbGVhbnVwKCl9X3B1bXBPcGVyYXRvckxpc3QoZSl7KDAsX3V0aWwuYXNzZXJ0KShlLmludGVudCwnUERGUGFnZVByb3h5Ll9wdW1wT3BlcmF0b3JMaXN0OiBFeHBlY3RlZCAiaW50ZW50IiBhcmd1bWVudC4nKTtjb25zdCB0PXRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0T3BlcmF0b3JMaXN0IixlKS5nZXRSZWFkZXIoKSxyPXRoaXMuX2ludGVudFN0YXRlcy5nZXQoZS5pbnRlbnQpO3Iuc3RyZWFtUmVhZGVyPXQ7Y29uc3QgcHVtcD0oKT0+e3QucmVhZCgpLnRoZW4oKHt2YWx1ZTplLGRvbmU6dH0pPT57aWYodClyLnN0cmVhbVJlYWRlcj1udWxsO2Vsc2UgaWYoIXRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpe3RoaXMuX3JlbmRlclBhZ2VDaHVuayhlLHIpO3B1bXAoKX19LGU9PntyLnN0cmVhbVJlYWRlcj1udWxsO2lmKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKXtpZihyLm9wZXJhdG9yTGlzdCl7ci5vcGVyYXRvckxpc3QubGFzdENodW5rPSEwO2ZvcihsZXQgZT0wO2U8ci5yZW5kZXJUYXNrcy5sZW5ndGg7ZSsrKXIucmVuZGVyVGFza3NbZV0ub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO3RoaXMuX3RyeUNsZWFudXAoKX1pZihyLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpci5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnJlamVjdChlKTtlbHNle2lmKCFyLm9wTGlzdFJlYWRDYXBhYmlsaXR5KXRocm93IGU7ci5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZWplY3QoZSl9fX0pfTtwdW1wKCl9X2Fib3J0T3BlcmF0b3JMaXN0KHtpbnRlbnRTdGF0ZTplLHJlYXNvbjp0LGZvcmNlOnI9ITF9KXsoMCxfdXRpbC5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvcnx8Im9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dCwnUERGUGFnZVByb3h5Ll9hYm9ydE9wZXJhdG9yTGlzdDogRXhwZWN0ZWQgInJlYXNvbiIgYXJndW1lbnQuJyk7aWYoZS5zdHJlYW1SZWFkZXIpe2lmKCFyKXtpZigwIT09ZS5yZW5kZXJUYXNrcy5sZW5ndGgpcmV0dXJuO2lmKHQgaW5zdGFuY2VvZiBfZGlzcGxheV91dGlscy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pe2Uuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dD1zZXRUaW1lb3V0KCgpPT57dGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe2ludGVudFN0YXRlOmUscmVhc29uOnQsZm9yY2U6ITB9KTtlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQ9bnVsbH0sUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUKTtyZXR1cm59fWUuc3RyZWFtUmVhZGVyLmNhbmNlbChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24odCYmdC5tZXNzYWdlKSk7ZS5zdHJlYW1SZWFkZXI9bnVsbDtpZighdGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCl7Zm9yKGNvbnN0W3Qscl1vZiB0aGlzLl9pbnRlbnRTdGF0ZXMpaWYocj09PWUpe3RoaXMuX2ludGVudFN0YXRlcy5kZWxldGUodCk7YnJlYWt9dGhpcy5jbGVhbnVwKCl9fX1nZXQgc3RhdHMoKXtyZXR1cm4gdGhpcy5fc3RhdHN9fWV4cG9ydHMuUERGUGFnZVByb3h5PVBERlBhZ2VQcm94eTtjbGFzcyBMb29wYmFja1BvcnR7Y29uc3RydWN0b3IoZT0hMCl7dGhpcy5fbGlzdGVuZXJzPVtdO3RoaXMuX2RlZmVyPWU7dGhpcy5fZGVmZXJyZWQ9UHJvbWlzZS5yZXNvbHZlKHZvaWQgMCl9cG9zdE1lc3NhZ2UoZSx0KXtpZighdGhpcy5fZGVmZXIpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKHQ9Pnt0LmNhbGwodGhpcyx7ZGF0YTplfSl9KTtyZXR1cm59Y29uc3Qgcj1uZXcgV2Vha01hcCxuPXtkYXRhOmZ1bmN0aW9uIGNsb25lVmFsdWUoZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gZTtpZihyLmhhcyhlKSlyZXR1cm4gci5nZXQoZSk7bGV0IG4scztpZigobj1lLmJ1ZmZlcikmJigwLF91dGlsLmlzQXJyYXlCdWZmZXIpKG4pKXtzPXQmJnQuaW5jbHVkZXMobik/bmV3IGUuY29uc3RydWN0b3IobixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTpuZXcgZS5jb25zdHJ1Y3RvcihlKTtyLnNldChlLHMpO3JldHVybiBzfXM9QXJyYXkuaXNBcnJheShlKT9bXTp7fTtyLnNldChlLHMpO2Zvcihjb25zdCB0IGluIGUpe2xldCByLG49ZTtmb3IoOyEocj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkpOyluPU9iamVjdC5nZXRQcm90b3R5cGVPZihuKTtpZih2b2lkIDAhPT1yLnZhbHVlKWlmKCJmdW5jdGlvbiIhPXR5cGVvZiByLnZhbHVlKXNbdF09Y2xvbmVWYWx1ZShyLnZhbHVlKTtlbHNlIGlmKGUuaGFzT3duUHJvcGVydHkmJmUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJMb29wYmFja1BvcnQucG9zdE1lc3NhZ2UgLSBjYW5ub3QgY2xvbmU6ICIrZVt0XSl9cmV0dXJuIHN9KGUpfTt0aGlzLl9kZWZlcnJlZC50aGVuKCgpPT57dGhpcy5fbGlzdGVuZXJzLmZvckVhY2goZT0+e2UuY2FsbCh0aGlzLG4pfSl9KX1hZGRFdmVudExpc3RlbmVyKGUsdCl7dGhpcy5fbGlzdGVuZXJzLnB1c2godCl9cmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpe2NvbnN0IHI9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YodCk7dGhpcy5fbGlzdGVuZXJzLnNwbGljZShyLDEpfXRlcm1pbmF0ZSgpe3RoaXMuX2xpc3RlbmVycy5sZW5ndGg9MH19ZXhwb3J0cy5Mb29wYmFja1BvcnQ9TG9vcGJhY2tQb3J0O2NvbnN0IFBERldvcmtlcj1mdW5jdGlvbiBQREZXb3JrZXJDbG9zdXJlKCl7Y29uc3QgcGRmV29ya2VyUG9ydHM9bmV3IFdlYWtNYXA7bGV0IGlzV29ya2VyRGlzYWJsZWQ9ITEsZmFsbGJhY2tXb3JrZXJTcmMsbmV4dEZha2VXb3JrZXJJZD0wLGZha2VXb3JrZXJDYXBhYmlsaXR5O2lmKF9pc19ub2RlLmlzTm9kZUpTJiYiZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSl7aXNXb3JrZXJEaXNhYmxlZD0hMDtmYWxsYmFja1dvcmtlclNyYz0iLi9wZGYud29ya2VyLmpzIn1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnQmJiJjdXJyZW50U2NyaXB0ImluIGRvY3VtZW50KXtjb25zdCBlPWRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO2UmJihmYWxsYmFja1dvcmtlclNyYz1lLnJlcGxhY2UoLyhcLig/Om1pblwuKT9qcykoXD8uKik/JC9pLCIud29ya2VyJDEkMiIpKX1mdW5jdGlvbiBnZXRXb3JrZXJTcmMoKXtpZihfd29ya2VyX29wdGlvbnMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMpcmV0dXJuIF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYztpZih2b2lkIDAhPT1mYWxsYmFja1dvcmtlclNyYyl7X2lzX25vZGUuaXNOb2RlSlN8fCgwLF9kaXNwbGF5X3V0aWxzLmRlcHJlY2F0ZWQpKCdObyAiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMiIHNwZWNpZmllZC4nKTtyZXR1cm4gZmFsbGJhY2tXb3JrZXJTcmN9dGhyb3cgbmV3IEVycm9yKCdObyAiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMiIHNwZWNpZmllZC4nKX1mdW5jdGlvbiBnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKXtsZXQgZTt0cnl7ZT1nbG9iYWxUaGlzLnBkZmpzV29ya2VyJiZnbG9iYWxUaGlzLnBkZmpzV29ya2VyLldvcmtlck1lc3NhZ2VIYW5kbGVyfWNhdGNoKGUpe31yZXR1cm4gZXx8bnVsbH1mdW5jdGlvbiBzZXR1cEZha2VXb3JrZXJHbG9iYWwoKXtpZihmYWtlV29ya2VyQ2FwYWJpbGl0eSlyZXR1cm4gZmFrZVdvcmtlckNhcGFiaWxpdHkucHJvbWlzZTtmYWtlV29ya2VyQ2FwYWJpbGl0eT0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtjb25zdCBsb2FkZXI9YXN5bmMgZnVuY3Rpb24oKXtjb25zdCBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI9Z2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCk7aWYobWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyKXJldHVybiBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI7aWYoX2lzX25vZGUuaXNOb2RlSlMmJiJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlKXtjb25zdCB3b3JrZXI9ZXZhbCgicmVxdWlyZSIpKGdldFdvcmtlclNyYygpKTtyZXR1cm4gd29ya2VyLldvcmtlck1lc3NhZ2VIYW5kbGVyfWF3YWl0KDAsX2Rpc3BsYXlfdXRpbHMubG9hZFNjcmlwdCkoZ2V0V29ya2VyU3JjKCkpO3JldHVybiB3aW5kb3cucGRmanNXb3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXJ9O2xvYWRlcigpLnRoZW4oZmFrZVdvcmtlckNhcGFiaWxpdHkucmVzb2x2ZSxmYWtlV29ya2VyQ2FwYWJpbGl0eS5yZWplY3QpO3JldHVybiBmYWtlV29ya2VyQ2FwYWJpbGl0eS5wcm9taXNlfWZ1bmN0aW9uIGNyZWF0ZUNETldyYXBwZXIoZSl7Y29uc3QgdD0iaW1wb3J0U2NyaXB0cygnIitlKyInKTsiO3JldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0XSkpfWNsYXNzIFBERldvcmtlcntjb25zdHJ1Y3Rvcih7bmFtZTplPW51bGwscG9ydDp0PW51bGwsdmVyYm9zaXR5OnI9KDAsX3V0aWwuZ2V0VmVyYm9zaXR5TGV2ZWwpKCl9PXt9KXtpZih0JiZwZGZXb3JrZXJQb3J0cy5oYXModCkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXNlIG1vcmUgdGhhbiBvbmUgUERGV29ya2VyIHBlciBwb3J0Iik7dGhpcy5uYW1lPWU7dGhpcy5kZXN0cm95ZWQ9ITE7dGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycz0hMDt0aGlzLnZlcmJvc2l0eT1yO3RoaXMuX3JlYWR5Q2FwYWJpbGl0eT0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9wb3J0PW51bGw7dGhpcy5fd2ViV29ya2VyPW51bGw7dGhpcy5fbWVzc2FnZUhhbmRsZXI9bnVsbDtpZih0KXtwZGZXb3JrZXJQb3J0cy5zZXQodCx0aGlzKTt0aGlzLl9pbml0aWFsaXplRnJvbVBvcnQodCl9ZWxzZSB0aGlzLl9pbml0aWFsaXplKCl9Z2V0IHByb21pc2UoKXtyZXR1cm4gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2V9Z2V0IHBvcnQoKXtyZXR1cm4gdGhpcy5fcG9ydH1nZXQgbWVzc2FnZUhhbmRsZXIoKXtyZXR1cm4gdGhpcy5fbWVzc2FnZUhhbmRsZXJ9X2luaXRpYWxpemVGcm9tUG9ydChlKXt0aGlzLl9wb3J0PWU7dGhpcy5fbWVzc2FnZUhhbmRsZXI9bmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIm1haW4iLCJ3b3JrZXIiLGUpO3RoaXMuX21lc3NhZ2VIYW5kbGVyLm9uKCJyZWFkeSIsKGZ1bmN0aW9uKCl7fSkpO3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCl9X2luaXRpYWxpemUoKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlciYmIWlzV29ya2VyRGlzYWJsZWQmJiFnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKSl7bGV0IGU9Z2V0V29ya2VyU3JjKCk7dHJ5eygwLF91dGlsLmlzU2FtZU9yaWdpbikod2luZG93LmxvY2F0aW9uLmhyZWYsZSl8fChlPWNyZWF0ZUNETldyYXBwZXIobmV3IFVSTChlLHdpbmRvdy5sb2NhdGlvbikuaHJlZikpO2NvbnN0IHQ9bmV3IFdvcmtlcihlKSxyPW5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJtYWluIiwid29ya2VyIix0KSx0ZXJtaW5hdGVFYXJseT0oKT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG9uV29ya2VyRXJyb3IpO3IuZGVzdHJveSgpO3QudGVybWluYXRlKCk7dGhpcy5kZXN0cm95ZWQ/dGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpOnRoaXMuX3NldHVwRmFrZVdvcmtlcigpfSxvbldvcmtlckVycm9yPSgpPT57dGhpcy5fd2ViV29ya2VyfHx0ZXJtaW5hdGVFYXJseSgpfTt0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixvbldvcmtlckVycm9yKTtyLm9uKCJ0ZXN0IixlPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsb25Xb3JrZXJFcnJvcik7aWYodGhpcy5kZXN0cm95ZWQpdGVybWluYXRlRWFybHkoKTtlbHNlIGlmKGUpe3RoaXMuX21lc3NhZ2VIYW5kbGVyPXI7dGhpcy5fcG9ydD10O3RoaXMuX3dlYldvcmtlcj10O2Uuc3VwcG9ydFRyYW5zZmVyc3x8KHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM9ITEpO3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7ci5zZW5kKCJjb25maWd1cmUiLHt2ZXJib3NpdHk6dGhpcy52ZXJib3NpdHl9KX1lbHNle3RoaXMuX3NldHVwRmFrZVdvcmtlcigpO3IuZGVzdHJveSgpO3QudGVybWluYXRlKCl9fSk7ci5vbigicmVhZHkiLGU9Pnt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixvbldvcmtlckVycm9yKTtpZih0aGlzLmRlc3Ryb3llZCl0ZXJtaW5hdGVFYXJseSgpO2Vsc2UgdHJ5e3NlbmRUZXN0KCl9Y2F0Y2goZSl7dGhpcy5fc2V0dXBGYWtlV29ya2VyKCl9fSk7Y29uc3Qgc2VuZFRlc3Q9KCk9Pntjb25zdCBlPW5ldyBVaW50OEFycmF5KFt0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzPzI1NTowXSk7dHJ5e3Iuc2VuZCgidGVzdCIsZSxbZS5idWZmZXJdKX1jYXRjaCh0KXsoMCxfdXRpbC53YXJuKSgiQ2Fubm90IHVzZSBwb3N0TWVzc2FnZSB0cmFuc2ZlcnMuIik7ZVswXT0wO3Iuc2VuZCgidGVzdCIsZSl9fTtzZW5kVGVzdCgpO3JldHVybn1jYXRjaChlKXsoMCxfdXRpbC5pbmZvKSgiVGhlIHdvcmtlciBoYXMgYmVlbiBkaXNhYmxlZC4iKX19dGhpcy5fc2V0dXBGYWtlV29ya2VyKCl9X3NldHVwRmFrZVdvcmtlcigpe2lmKCFpc1dvcmtlckRpc2FibGVkKXsoMCxfdXRpbC53YXJuKSgiU2V0dGluZyB1cCBmYWtlIHdvcmtlci4iKTtpc1dvcmtlckRpc2FibGVkPSEwfXNldHVwRmFrZVdvcmtlckdsb2JhbCgpLnRoZW4oZT0+e2lmKHRoaXMuZGVzdHJveWVkKXt0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKSk7cmV0dXJufWNvbnN0IHQ9bmV3IExvb3BiYWNrUG9ydDt0aGlzLl9wb3J0PXQ7Y29uc3Qgcj0iZmFrZSIrbmV4dEZha2VXb3JrZXJJZCsrLG49bmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIocisiX3dvcmtlciIscix0KTtlLnNldHVwKG4sdCk7Y29uc3Qgcz1uZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihyLHIrIl93b3JrZXIiLHQpO3RoaXMuX21lc3NhZ2VIYW5kbGVyPXM7dGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtzLnNlbmQoImNvbmZpZ3VyZSIse3ZlcmJvc2l0eTp0aGlzLnZlcmJvc2l0eX0pfSkuY2F0Y2goZT0+e3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKGBTZXR0aW5nIHVwIGZha2Ugd29ya2VyIGZhaWxlZDogIiR7ZS5tZXNzYWdlfSIuYCkpfSl9ZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwO2lmKHRoaXMuX3dlYldvcmtlcil7dGhpcy5fd2ViV29ya2VyLnRlcm1pbmF0ZSgpO3RoaXMuX3dlYldvcmtlcj1udWxsfXBkZldvcmtlclBvcnRzLmRlbGV0ZSh0aGlzLl9wb3J0KTt0aGlzLl9wb3J0PW51bGw7aWYodGhpcy5fbWVzc2FnZUhhbmRsZXIpe3RoaXMuX21lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTt0aGlzLl9tZXNzYWdlSGFuZGxlcj1udWxsfX1zdGF0aWMgZnJvbVBvcnQoZSl7aWYoIWV8fCFlLnBvcnQpdGhyb3cgbmV3IEVycm9yKCJQREZXb3JrZXIuZnJvbVBvcnQgLSBpbnZhbGlkIG1ldGhvZCBzaWduYXR1cmUuIik7cmV0dXJuIHBkZldvcmtlclBvcnRzLmhhcyhlLnBvcnQpP3BkZldvcmtlclBvcnRzLmdldChlLnBvcnQpOm5ldyBQREZXb3JrZXIoZSl9c3RhdGljIGdldFdvcmtlclNyYygpe3JldHVybiBnZXRXb3JrZXJTcmMoKX19cmV0dXJuIFBERldvcmtlcn0oKTtleHBvcnRzLlBERldvcmtlcj1QREZXb3JrZXI7Y2xhc3MgV29ya2VyVHJhbnNwb3J0e2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMubWVzc2FnZUhhbmRsZXI9ZTt0aGlzLmxvYWRpbmdUYXNrPXQ7dGhpcy5jb21tb25PYmpzPW5ldyBQREZPYmplY3RzO3RoaXMuZm9udExvYWRlcj1uZXcgX2ZvbnRfbG9hZGVyLkZvbnRMb2FkZXIoe2RvY0lkOnQuZG9jSWQsb25VbnN1cHBvcnRlZEZlYXR1cmU6dGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUuYmluZCh0aGlzKSxvd25lckRvY3VtZW50Om4ub3duZXJEb2N1bWVudH0pO3RoaXMuX3BhcmFtcz1uO3RoaXMuQ01hcFJlYWRlckZhY3Rvcnk9bmV3IG4uQ01hcFJlYWRlckZhY3Rvcnkoe2Jhc2VVcmw6bi5jTWFwVXJsLGlzQ29tcHJlc3NlZDpuLmNNYXBQYWNrZWR9KTt0aGlzLmRlc3Ryb3llZD0hMTt0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5PW51bGw7dGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5PW51bGw7dGhpcy5fbmV0d29ya1N0cmVhbT1yO3RoaXMuX2Z1bGxSZWFkZXI9bnVsbDt0aGlzLl9sYXN0UHJvZ3Jlc3M9bnVsbDt0aGlzLnBhZ2VDYWNoZT1bXTt0aGlzLnBhZ2VQcm9taXNlcz1bXTt0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHk9KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVyKCl9ZGVzdHJveSgpe2lmKHRoaXMuZGVzdHJveUNhcGFiaWxpdHkpcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTt0aGlzLmRlc3Ryb3llZD0hMDt0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5PSgwLF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSYmdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIGR1cmluZyBvblBhc3N3b3JkIGNhbGxiYWNrIikpO2NvbnN0IGU9W107dGhpcy5wYWdlQ2FjaGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCYmZS5wdXNoKHQuX2Rlc3Ryb3koKSl9KSk7dGhpcy5wYWdlQ2FjaGUubGVuZ3RoPTA7dGhpcy5wYWdlUHJvbWlzZXMubGVuZ3RoPTA7Y29uc3QgdD10aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiVGVybWluYXRlIixudWxsKTtlLnB1c2godCk7UHJvbWlzZS5hbGwoZSkudGhlbigoKT0+e3RoaXMuZm9udExvYWRlci5jbGVhcigpO3RoaXMuX25ldHdvcmtTdHJlYW0mJnRoaXMuX25ldHdvcmtTdHJlYW0uY2FuY2VsQWxsUmVxdWVzdHMobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpO2lmKHRoaXMubWVzc2FnZUhhbmRsZXIpe3RoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO3RoaXMubWVzc2FnZUhhbmRsZXI9bnVsbH10aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlc29sdmUoKX0sdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZWplY3QpO3JldHVybiB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnByb21pc2V9c2V0dXBNZXNzYWdlSGFuZGxlcigpe2NvbnN0e21lc3NhZ2VIYW5kbGVyOmUsbG9hZGluZ1Rhc2s6dH09dGhpcztlLm9uKCJHZXRSZWFkZXIiLChlLHQpPT57KDAsX3V0aWwuYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCJHZXRSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLiIpO3RoaXMuX2Z1bGxSZWFkZXI9dGhpcy5fbmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyKCk7dGhpcy5fZnVsbFJlYWRlci5vblByb2dyZXNzPWU9Pnt0aGlzLl9sYXN0UHJvZ3Jlc3M9e2xvYWRlZDplLmxvYWRlZCx0b3RhbDplLnRvdGFsfX07dC5vblB1bGw9KCk9Pnt0aGlzLl9mdWxsUmVhZGVyLnJlYWQoKS50aGVuKChmdW5jdGlvbih7dmFsdWU6ZSxkb25lOnJ9KXtpZihyKXQuY2xvc2UoKTtlbHNleygwLF91dGlsLmFzc2VydCkoKDAsX3V0aWwuaXNBcnJheUJ1ZmZlcikoZSksIkdldFJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLiIpO3QuZW5xdWV1ZShuZXcgVWludDhBcnJheShlKSwxLFtlXSl9fSkpLmNhdGNoKGU9Pnt0LmVycm9yKGUpfSl9O3Qub25DYW5jZWw9ZT0+e3RoaXMuX2Z1bGxSZWFkZXIuY2FuY2VsKGUpO3QucmVhZHkuY2F0Y2goZT0+e2lmKCF0aGlzLmRlc3Ryb3llZCl0aHJvdyBlfSl9fSk7ZS5vbigiUmVhZGVySGVhZGVyc1JlYWR5IixlPT57Y29uc3Qgcj0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSxuPXRoaXMuX2Z1bGxSZWFkZXI7bi5oZWFkZXJzUmVhZHkudGhlbigoKT0+e2lmKCFuLmlzU3RyZWFtaW5nU3VwcG9ydGVkfHwhbi5pc1JhbmdlU3VwcG9ydGVkKXt0aGlzLl9sYXN0UHJvZ3Jlc3MmJnQub25Qcm9ncmVzcyYmdC5vblByb2dyZXNzKHRoaXMuX2xhc3RQcm9ncmVzcyk7bi5vblByb2dyZXNzPWU9Pnt0Lm9uUHJvZ3Jlc3MmJnQub25Qcm9ncmVzcyh7bG9hZGVkOmUubG9hZGVkLHRvdGFsOmUudG90YWx9KX19ci5yZXNvbHZlKHtpc1N0cmVhbWluZ1N1cHBvcnRlZDpuLmlzU3RyZWFtaW5nU3VwcG9ydGVkLGlzUmFuZ2VTdXBwb3J0ZWQ6bi5pc1JhbmdlU3VwcG9ydGVkLGNvbnRlbnRMZW5ndGg6bi5jb250ZW50TGVuZ3RofSl9LHIucmVqZWN0KTtyZXR1cm4gci5wcm9taXNlfSk7ZS5vbigiR2V0UmFuZ2VSZWFkZXIiLChlLHQpPT57KDAsX3V0aWwuYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCJHZXRSYW5nZVJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuIik7Y29uc3Qgcj10aGlzLl9uZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKGUuYmVnaW4sZS5lbmQpO2lmKHIpe3Qub25QdWxsPSgpPT57ci5yZWFkKCkudGhlbigoZnVuY3Rpb24oe3ZhbHVlOmUsZG9uZTpyfSl7aWYocil0LmNsb3NlKCk7ZWxzZXsoMCxfdXRpbC5hc3NlcnQpKCgwLF91dGlsLmlzQXJyYXlCdWZmZXIpKGUpLCJHZXRSYW5nZVJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLiIpO3QuZW5xdWV1ZShuZXcgVWludDhBcnJheShlKSwxLFtlXSl9fSkpLmNhdGNoKGU9Pnt0LmVycm9yKGUpfSl9O3Qub25DYW5jZWw9ZT0+e3IuY2FuY2VsKGUpO3QucmVhZHkuY2F0Y2goZT0+e2lmKCF0aGlzLmRlc3Ryb3llZCl0aHJvdyBlfSl9fWVsc2UgdC5jbG9zZSgpfSk7ZS5vbigiR2V0RG9jIiwoe3BkZkluZm86ZX0pPT57dGhpcy5fbnVtUGFnZXM9ZS5udW1QYWdlczt0Ll9jYXBhYmlsaXR5LnJlc29sdmUobmV3IFBERkRvY3VtZW50UHJveHkoZSx0aGlzKSl9KTtlLm9uKCJEb2NFeGNlcHRpb24iLChmdW5jdGlvbihlKXtsZXQgcjtzd2l0Y2goZS5uYW1lKXtjYXNlIlBhc3N3b3JkRXhjZXB0aW9uIjpyPW5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbihlLm1lc3NhZ2UsZS5jb2RlKTticmVhaztjYXNlIkludmFsaWRQREZFeGNlcHRpb24iOnI9bmV3IF91dGlsLkludmFsaWRQREZFeGNlcHRpb24oZS5tZXNzYWdlKTticmVhaztjYXNlIk1pc3NpbmdQREZFeGNlcHRpb24iOnI9bmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oZS5tZXNzYWdlKTticmVhaztjYXNlIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiI6cj1uZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGUubWVzc2FnZSxlLnN0YXR1cyk7YnJlYWs7Y2FzZSJVbmtub3duRXJyb3JFeGNlcHRpb24iOnI9bmV3IF91dGlsLlVua25vd25FcnJvckV4Y2VwdGlvbihlLm1lc3NhZ2UsZS5kZXRhaWxzKX1pZighKHIgaW5zdGFuY2VvZiBFcnJvcikpe2NvbnN0IGU9IkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuIjsoMCxfdXRpbC53YXJuKShlKX10Ll9jYXBhYmlsaXR5LnJlamVjdChyKX0pKTtlLm9uKCJQYXNzd29yZFJlcXVlc3QiLGU9Pnt0aGlzLl9wYXNzd29yZENhcGFiaWxpdHk9KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7aWYodC5vblBhc3N3b3JkKXtjb25zdCB1cGRhdGVQYXNzd29yZD1lPT57dGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlc29sdmUoe3Bhc3N3b3JkOmV9KX07dHJ5e3Qub25QYXNzd29yZCh1cGRhdGVQYXNzd29yZCxlLmNvZGUpfWNhdGNoKGUpe3RoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QoZSl9fWVsc2UgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChuZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24oZS5tZXNzYWdlLGUuY29kZSkpO3JldHVybiB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucHJvbWlzZX0pO2Uub24oIkRhdGFMb2FkZWQiLGU9Pnt0Lm9uUHJvZ3Jlc3MmJnQub25Qcm9ncmVzcyh7bG9hZGVkOmUubGVuZ3RoLHRvdGFsOmUubGVuZ3RofSk7dGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnJlc29sdmUoZSl9KTtlLm9uKCJTdGFydFJlbmRlclBhZ2UiLGU9PntpZih0aGlzLmRlc3Ryb3llZClyZXR1cm47dGhpcy5wYWdlQ2FjaGVbZS5wYWdlSW5kZXhdLl9zdGFydFJlbmRlclBhZ2UoZS50cmFuc3BhcmVuY3ksZS5pbnRlbnQpfSk7ZS5vbigiY29tbW9ub2JqIix0PT57aWYodGhpcy5kZXN0cm95ZWQpcmV0dXJuO2NvbnN0W3IsbixzXT10O2lmKCF0aGlzLmNvbW1vbk9ianMuaGFzKHIpKXN3aXRjaChuKXtjYXNlIkZvbnQiOmNvbnN0IHQ9dGhpcy5fcGFyYW1zO2lmKCJlcnJvciJpbiBzKXtjb25zdCBlPXMuZXJyb3I7KDAsX3V0aWwud2FybikoIkVycm9yIGR1cmluZyBmb250IGxvYWRpbmc6ICIrZSk7dGhpcy5jb21tb25PYmpzLnJlc29sdmUocixlKTticmVha31sZXQgYT1udWxsO3QucGRmQnVnJiZnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3ImJmdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5lbmFibGVkJiYoYT17cmVnaXN0ZXJGb250KGUsdCl7Z2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmZvbnRBZGRlZChlLHQpfX0pO2NvbnN0IGk9bmV3IF9mb250X2xvYWRlci5Gb250RmFjZU9iamVjdChzLHtpc0V2YWxTdXBwb3J0ZWQ6dC5pc0V2YWxTdXBwb3J0ZWQsZGlzYWJsZUZvbnRGYWNlOnQuZGlzYWJsZUZvbnRGYWNlLGlnbm9yZUVycm9yczp0Lmlnbm9yZUVycm9ycyxvblVuc3VwcG9ydGVkRmVhdHVyZTp0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZS5iaW5kKHRoaXMpLGZvbnRSZWdpc3RyeTphfSk7dGhpcy5mb250TG9hZGVyLmJpbmQoaSkuY2F0Y2godD0+ZS5zZW5kV2l0aFByb21pc2UoIkZvbnRGYWxsYmFjayIse2lkOnJ9KSkuZmluYWxseSgoKT0+eyF0LmZvbnRFeHRyYVByb3BlcnRpZXMmJmkuZGF0YSYmKGkuZGF0YT1udWxsKTt0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShyLGkpfSk7YnJlYWs7Y2FzZSJGb250UGF0aCI6Y2FzZSJJbWFnZSI6dGhpcy5jb21tb25PYmpzLnJlc29sdmUocixzKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiR290IHVua25vd24gY29tbW9uIG9iamVjdCB0eXBlICIrbil9fSk7ZS5vbigib2JqIixlPT57aWYodGhpcy5kZXN0cm95ZWQpcmV0dXJuO2NvbnN0W3QscixuLHNdPWUsYT10aGlzLnBhZ2VDYWNoZVtyXTtpZighYS5vYmpzLmhhcyh0KSlzd2l0Y2gobil7Y2FzZSJJbWFnZSI6YS5vYmpzLnJlc29sdmUodCxzKTtjb25zdCBlPThlNjtzJiYiZGF0YSJpbiBzJiZzLmRhdGEubGVuZ3RoPmUmJihhLmNsZWFudXBBZnRlclJlbmRlcj0hMCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkdvdCB1bmtub3duIG9iamVjdCB0eXBlICIrbil9fSk7ZS5vbigiRG9jUHJvZ3Jlc3MiLGU9Pnt0aGlzLmRlc3Ryb3llZHx8dC5vblByb2dyZXNzJiZ0Lm9uUHJvZ3Jlc3Moe2xvYWRlZDplLmxvYWRlZCx0b3RhbDplLnRvdGFsfSl9KTtlLm9uKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlLmJpbmQodGhpcykpO2Uub24oIkZldGNoQnVpbHRJbkNNYXAiLChlLHQpPT57aWYodGhpcy5kZXN0cm95ZWQpe3QuZXJyb3IobmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpKTtyZXR1cm59bGV0IHI9ITE7dC5vblB1bGw9KCk9PntpZihyKXQuY2xvc2UoKTtlbHNle3I9ITA7dGhpcy5DTWFwUmVhZGVyRmFjdG9yeS5mZXRjaChlKS50aGVuKChmdW5jdGlvbihlKXt0LmVucXVldWUoZSwxLFtlLmNNYXBEYXRhLmJ1ZmZlcl0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmVycm9yKGUpfSkpfX19KX1fb25VbnN1cHBvcnRlZEZlYXR1cmUoe2ZlYXR1cmVJZDplfSl7dGhpcy5kZXN0cm95ZWR8fHRoaXMubG9hZGluZ1Rhc2sub25VbnN1cHBvcnRlZEZlYXR1cmUmJnRoaXMubG9hZGluZ1Rhc2sub25VbnN1cHBvcnRlZEZlYXR1cmUoZSl9Z2V0RGF0YSgpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0RGF0YSIsbnVsbCl9Z2V0UGFnZShlKXtpZighTnVtYmVyLmlzSW50ZWdlcihlKXx8ZTw9MHx8ZT50aGlzLl9udW1QYWdlcylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJJbnZhbGlkIHBhZ2UgcmVxdWVzdCIpKTtjb25zdCB0PWUtMTtpZih0IGluIHRoaXMucGFnZVByb21pc2VzKXJldHVybiB0aGlzLnBhZ2VQcm9taXNlc1t0XTtjb25zdCByPXRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlIix7cGFnZUluZGV4OnR9KS50aGVuKGU9PntpZih0aGlzLmRlc3Ryb3llZCl0aHJvdyBuZXcgRXJyb3IoIlRyYW5zcG9ydCBkZXN0cm95ZWQiKTtjb25zdCByPW5ldyBQREZQYWdlUHJveHkodCxlLHRoaXMsdGhpcy5fcGFyYW1zLm93bmVyRG9jdW1lbnQsdGhpcy5fcGFyYW1zLnBkZkJ1Zyk7dGhpcy5wYWdlQ2FjaGVbdF09cjtyZXR1cm4gcn0pO3RoaXMucGFnZVByb21pc2VzW3RdPXI7cmV0dXJuIHJ9Z2V0UGFnZUluZGV4KGUpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGFnZUluZGV4Iix7cmVmOmV9KS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlKSl9KSl9Z2V0QW5ub3RhdGlvbnMoZSx0KXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldEFubm90YXRpb25zIix7cGFnZUluZGV4OmUsaW50ZW50OnR9KX1zYXZlRG9jdW1lbnQoZSl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJTYXZlRG9jdW1lbnQiLHtudW1QYWdlczp0aGlzLl9udW1QYWdlcyxhbm5vdGF0aW9uU3RvcmFnZTplJiZlLmdldEFsbCgpfHxudWxsLGZpbGVuYW1lOnRoaXMuX2Z1bGxSZWFkZXI/dGhpcy5fZnVsbFJlYWRlci5maWxlbmFtZTpudWxsfSkuZmluYWxseSgoKT0+e2UmJmUucmVzZXRNb2RpZmllZCgpfSl9Z2V0RGVzdGluYXRpb25zKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREZXN0aW5hdGlvbnMiLG51bGwpfWdldERlc3RpbmF0aW9uKGUpe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkludmFsaWQgZGVzdGluYXRpb24gcmVxdWVzdC4iKSk6dGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERlc3RpbmF0aW9uIix7aWQ6ZX0pfWdldFBhZ2VMYWJlbHMoKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2VMYWJlbHMiLG51bGwpfWdldFBhZ2VMYXlvdXQoKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2VMYXlvdXQiLG51bGwpfWdldFBhZ2VNb2RlKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlTW9kZSIsbnVsbCl9Z2V0Vmlld2VyUHJlZmVyZW5jZXMoKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFZpZXdlclByZWZlcmVuY2VzIixudWxsKX1nZXRPcGVuQWN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRPcGVuQWN0aW9uIixudWxsKX1nZXRBdHRhY2htZW50cygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0QXR0YWNobWVudHMiLG51bGwpfWdldEphdmFTY3JpcHQoKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldEphdmFTY3JpcHQiLG51bGwpfWdldE91dGxpbmUoKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldE91dGxpbmUiLG51bGwpfWdldE9wdGlvbmFsQ29udGVudENvbmZpZygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnIixudWxsKS50aGVuKGU9Pm5ldyBfb3B0aW9uYWxfY29udGVudF9jb25maWcuT3B0aW9uYWxDb250ZW50Q29uZmlnKGUpKX1nZXRQZXJtaXNzaW9ucygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGVybWlzc2lvbnMiLG51bGwpfWdldE1ldGFkYXRhKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRNZXRhZGF0YSIsbnVsbCkudGhlbihlPT4oe2luZm86ZVswXSxtZXRhZGF0YTplWzFdP25ldyBfbWV0YWRhdGEuTWV0YWRhdGEoZVsxXSk6bnVsbCxjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTp0aGlzLl9mdWxsUmVhZGVyP3RoaXMuX2Z1bGxSZWFkZXIuZmlsZW5hbWU6bnVsbH0pKX1nZXRTdGF0cygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0U3RhdHMiLG51bGwpfXN0YXJ0Q2xlYW51cCgpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiQ2xlYW51cCIsbnVsbCkudGhlbigoKT0+e2ZvcihsZXQgZT0wLHQ9dGhpcy5wYWdlQ2FjaGUubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9dGhpcy5wYWdlQ2FjaGVbZV07aWYodCl7aWYoIXQuY2xlYW51cCgpKXRocm93IG5ldyBFcnJvcihgc3RhcnRDbGVhbnVwOiBQYWdlICR7ZSsxfSBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLmApfX10aGlzLmNvbW1vbk9ianMuY2xlYXIoKTt0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKX0pfWdldCBsb2FkaW5nUGFyYW1zKCl7Y29uc3QgZT10aGlzLl9wYXJhbXM7cmV0dXJuKDAsX3V0aWwuc2hhZG93KSh0aGlzLCJsb2FkaW5nUGFyYW1zIix7ZGlzYWJsZUF1dG9GZXRjaDplLmRpc2FibGVBdXRvRmV0Y2gsZGlzYWJsZUZvbnRGYWNlOmUuZGlzYWJsZUZvbnRGYWNlfSl9fWNsYXNzIFBERk9iamVjdHN7Y29uc3RydWN0b3IoKXt0aGlzLl9vYmpzPU9iamVjdC5jcmVhdGUobnVsbCl9X2Vuc3VyZU9iaihlKXtyZXR1cm4gdGhpcy5fb2Jqc1tlXT90aGlzLl9vYmpzW2VdOnRoaXMuX29ianNbZV09e2NhcGFiaWxpdHk6KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCksZGF0YTpudWxsLHJlc29sdmVkOiExfX1nZXQoZSx0PW51bGwpe2lmKHQpe3RoaXMuX2Vuc3VyZU9iaihlKS5jYXBhYmlsaXR5LnByb21pc2UudGhlbih0KTtyZXR1cm4gbnVsbH1jb25zdCByPXRoaXMuX29ianNbZV07aWYoIXJ8fCFyLnJlc29sdmVkKXRocm93IG5ldyBFcnJvcihgUmVxdWVzdGluZyBvYmplY3QgdGhhdCBpc24ndCByZXNvbHZlZCB5ZXQgJHtlfS5gKTtyZXR1cm4gci5kYXRhfWhhcyhlKXtjb25zdCB0PXRoaXMuX29ianNbZV07cmV0dXJuISF0JiZ0LnJlc29sdmVkfXJlc29sdmUoZSx0KXtjb25zdCByPXRoaXMuX2Vuc3VyZU9iaihlKTtyLnJlc29sdmVkPSEwO3IuZGF0YT10O3IuY2FwYWJpbGl0eS5yZXNvbHZlKHQpfWNsZWFyKCl7dGhpcy5fb2Jqcz1PYmplY3QuY3JlYXRlKG51bGwpfX1jbGFzcyBSZW5kZXJUYXNre2NvbnN0cnVjdG9yKGUpe3RoaXMuX2ludGVybmFsUmVuZGVyVGFzaz1lO3RoaXMub25Db250aW51ZT1udWxsfWdldCBwcm9taXNlKCl7cmV0dXJuIHRoaXMuX2ludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnByb21pc2V9Y2FuY2VsKCl7dGhpcy5faW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbCgpfX1jb25zdCBJbnRlcm5hbFJlbmRlclRhc2s9ZnVuY3Rpb24gSW50ZXJuYWxSZW5kZXJUYXNrQ2xvc3VyZSgpe2NvbnN0IGU9bmV3IFdlYWtTZXQ7cmV0dXJuIGNsYXNzIEludGVybmFsUmVuZGVyVGFza3tjb25zdHJ1Y3Rvcih7Y2FsbGJhY2s6ZSxwYXJhbXM6dCxvYmpzOnIsY29tbW9uT2JqczpuLG9wZXJhdG9yTGlzdDpzLHBhZ2VJbmRleDphLGNhbnZhc0ZhY3Rvcnk6aSx3ZWJHTENvbnRleHQ6byx1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6bD0hMSxwZGZCdWc6Yz0hMX0pe3RoaXMuY2FsbGJhY2s9ZTt0aGlzLnBhcmFtcz10O3RoaXMub2Jqcz1yO3RoaXMuY29tbW9uT2Jqcz1uO3RoaXMub3BlcmF0b3JMaXN0SWR4PW51bGw7dGhpcy5vcGVyYXRvckxpc3Q9czt0aGlzLl9wYWdlSW5kZXg9YTt0aGlzLmNhbnZhc0ZhY3Rvcnk9aTt0aGlzLndlYkdMQ29udGV4dD1vO3RoaXMuX3BkZkJ1Zz1jO3RoaXMucnVubmluZz0hMTt0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaz1udWxsO3RoaXMuZ3JhcGhpY3NSZWFkeT0hMTt0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ITA9PT1sJiYidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdzt0aGlzLmNhbmNlbGxlZD0hMTt0aGlzLmNhcGFiaWxpdHk9KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy50YXNrPW5ldyBSZW5kZXJUYXNrKHRoaXMpO3RoaXMuX2NvbnRpbnVlQm91bmQ9dGhpcy5fY29udGludWUuYmluZCh0aGlzKTt0aGlzLl9zY2hlZHVsZU5leHRCb3VuZD10aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTt0aGlzLl9uZXh0Qm91bmQ9dGhpcy5fbmV4dC5iaW5kKHRoaXMpO3RoaXMuX2NhbnZhcz10LmNhbnZhc0NvbnRleHQuY2FudmFzfWdldCBjb21wbGV0ZWQoKXtyZXR1cm4gdGhpcy5jYXBhYmlsaXR5LnByb21pc2UuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpfWluaXRpYWxpemVHcmFwaGljcyh7dHJhbnNwYXJlbmN5OnQ9ITEsb3B0aW9uYWxDb250ZW50Q29uZmlnOnJ9KXtpZih0aGlzLmNhbmNlbGxlZClyZXR1cm47aWYodGhpcy5fY2FudmFzKXtpZihlLmhhcyh0aGlzLl9jYW52YXMpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuIFVzZSBkaWZmZXJlbnQgY2FudmFzIG9yIGVuc3VyZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC4iKTtlLmFkZCh0aGlzLl9jYW52YXMpfWlmKHRoaXMuX3BkZkJ1ZyYmZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlciYmZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5lbmFibGVkKXt0aGlzLnN0ZXBwZXI9Z2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5jcmVhdGUodGhpcy5fcGFnZUluZGV4KTt0aGlzLnN0ZXBwZXIuaW5pdCh0aGlzLm9wZXJhdG9yTGlzdCk7dGhpcy5zdGVwcGVyLm5leHRCcmVha1BvaW50PXRoaXMuc3RlcHBlci5nZXROZXh0QnJlYWtQb2ludCgpfWNvbnN0e2NhbnZhc0NvbnRleHQ6bix2aWV3cG9ydDpzLHRyYW5zZm9ybTphLGltYWdlTGF5ZXI6aSxiYWNrZ3JvdW5kOm99PXRoaXMucGFyYW1zO3RoaXMuZ2Z4PW5ldyBfY2FudmFzLkNhbnZhc0dyYXBoaWNzKG4sdGhpcy5jb21tb25PYmpzLHRoaXMub2Jqcyx0aGlzLmNhbnZhc0ZhY3RvcnksdGhpcy53ZWJHTENvbnRleHQsaSxyKTt0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe3RyYW5zZm9ybTphLHZpZXdwb3J0OnMsdHJhbnNwYXJlbmN5OnQsYmFja2dyb3VuZDpvfSk7dGhpcy5vcGVyYXRvckxpc3RJZHg9MDt0aGlzLmdyYXBoaWNzUmVhZHk9ITA7dGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2smJnRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrKCl9Y2FuY2VsKHQ9bnVsbCl7dGhpcy5ydW5uaW5nPSExO3RoaXMuY2FuY2VsbGVkPSEwO3RoaXMuZ2Z4JiZ0aGlzLmdmeC5lbmREcmF3aW5nKCk7dGhpcy5fY2FudmFzJiZlLmRlbGV0ZSh0aGlzLl9jYW52YXMpO3RoaXMuY2FsbGJhY2sodHx8bmV3IF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbigiUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSAiKyh0aGlzLl9wYWdlSW5kZXgrMSksImNhbnZhcyIpKX1vcGVyYXRvckxpc3RDaGFuZ2VkKCl7aWYodGhpcy5ncmFwaGljc1JlYWR5KXt0aGlzLnN0ZXBwZXImJnRoaXMuc3RlcHBlci51cGRhdGVPcGVyYXRvckxpc3QodGhpcy5vcGVyYXRvckxpc3QpO3RoaXMucnVubmluZ3x8dGhpcy5fY29udGludWUoKX1lbHNlIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrfHwodGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2s9dGhpcy5fY29udGludWVCb3VuZCl9X2NvbnRpbnVlKCl7dGhpcy5ydW5uaW5nPSEwO3RoaXMuY2FuY2VsbGVkfHwodGhpcy50YXNrLm9uQ29udGludWU/dGhpcy50YXNrLm9uQ29udGludWUodGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQpOnRoaXMuX3NjaGVkdWxlTmV4dCgpKX1fc2NoZWR1bGVOZXh0KCl7dGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLl9uZXh0Qm91bmQoKS5jYXRjaCh0aGlzLmNhbmNlbC5iaW5kKHRoaXMpKX0pOlByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5fbmV4dEJvdW5kKS5jYXRjaCh0aGlzLmNhbmNlbC5iaW5kKHRoaXMpKX1hc3luYyBfbmV4dCgpe2lmKCF0aGlzLmNhbmNlbGxlZCl7dGhpcy5vcGVyYXRvckxpc3RJZHg9dGhpcy5nZnguZXhlY3V0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCx0aGlzLm9wZXJhdG9yTGlzdElkeCx0aGlzLl9jb250aW51ZUJvdW5kLHRoaXMuc3RlcHBlcik7aWYodGhpcy5vcGVyYXRvckxpc3RJZHg9PT10aGlzLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkubGVuZ3RoKXt0aGlzLnJ1bm5pbmc9ITE7aWYodGhpcy5vcGVyYXRvckxpc3QubGFzdENodW5rKXt0aGlzLmdmeC5lbmREcmF3aW5nKCk7dGhpcy5fY2FudmFzJiZlLmRlbGV0ZSh0aGlzLl9jYW52YXMpO3RoaXMuY2FsbGJhY2soKX19fX19fSgpLHZlcnNpb249IjIuNi4zNDciO2V4cG9ydHMudmVyc2lvbj12ZXJzaW9uO2NvbnN0IGJ1aWxkPSIzYmU5YzY1ZiI7ZXhwb3J0cy5idWlsZD1idWlsZH0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Gb250TG9hZGVyPXQuRm9udEZhY2VPYmplY3Q9dm9pZCAwO3ZhciBuPXIoMik7Y2xhc3MgQmFzZUZvbnRMb2FkZXJ7Y29uc3RydWN0b3Ioe2RvY0lkOmUsb25VbnN1cHBvcnRlZEZlYXR1cmU6dCxvd25lckRvY3VtZW50OnI9Z2xvYmFsVGhpcy5kb2N1bWVudH0pe3RoaXMuY29uc3RydWN0b3I9PT1CYXNlRm9udExvYWRlciYmKDAsbi51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGb250TG9hZGVyLiIpO3RoaXMuZG9jSWQ9ZTt0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZT10O3RoaXMuX2RvY3VtZW50PXI7dGhpcy5uYXRpdmVGb250RmFjZXM9W107dGhpcy5zdHlsZUVsZW1lbnQ9bnVsbH1hZGROYXRpdmVGb250RmFjZShlKXt0aGlzLm5hdGl2ZUZvbnRGYWNlcy5wdXNoKGUpO3RoaXMuX2RvY3VtZW50LmZvbnRzLmFkZChlKX1pbnNlcnRSdWxlKGUpe2xldCB0PXRoaXMuc3R5bGVFbGVtZW50O2lmKCF0KXt0PXRoaXMuc3R5bGVFbGVtZW50PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC5pZD0iUERGSlNfRk9OVF9TVFlMRV9UQUdfIit0aGlzLmRvY0lkO3RoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHQpfWNvbnN0IHI9dC5zaGVldDtyLmluc2VydFJ1bGUoZSxyLmNzc1J1bGVzLmxlbmd0aCl9Y2xlYXIoKXt0aGlzLm5hdGl2ZUZvbnRGYWNlcy5mb3JFYWNoKGU9Pnt0aGlzLl9kb2N1bWVudC5mb250cy5kZWxldGUoZSl9KTt0aGlzLm5hdGl2ZUZvbnRGYWNlcy5sZW5ndGg9MDtpZih0aGlzLnN0eWxlRWxlbWVudCl7dGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7dGhpcy5zdHlsZUVsZW1lbnQ9bnVsbH19YXN5bmMgYmluZChlKXtpZihlLmF0dGFjaGVkfHxlLm1pc3NpbmdGaWxlKXJldHVybjtlLmF0dGFjaGVkPSEwO2lmKHRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCl7Y29uc3QgdD1lLmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7aWYodCl7dGhpcy5hZGROYXRpdmVGb250RmFjZSh0KTt0cnl7YXdhaXQgdC5sb2FkZWR9Y2F0Y2gocil7dGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUoe2ZlYXR1cmVJZDpuLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udExvYWROYXRpdmV9KTsoMCxuLndhcm4pKGBGYWlsZWQgdG8gbG9hZCBmb250ICcke3QuZmFtaWx5fSc6ICcke3J9Jy5gKTtlLmRpc2FibGVGb250RmFjZT0hMDt0aHJvdyByfX1yZXR1cm59Y29uc3QgdD1lLmNyZWF0ZUZvbnRGYWNlUnVsZSgpO2lmKHQpe3RoaXMuaW5zZXJ0UnVsZSh0KTtpZih0aGlzLmlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKXJldHVybjthd2FpdCBuZXcgUHJvbWlzZShyPT57Y29uc3Qgbj10aGlzLl9xdWV1ZUxvYWRpbmdDYWxsYmFjayhyKTt0aGlzLl9wcmVwYXJlRm9udExvYWRFdmVudChbdF0sW2VdLG4pfSl9fV9xdWV1ZUxvYWRpbmdDYWxsYmFjayhlKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfcXVldWVMb2FkaW5nQ2FsbGJhY2tgLiIpfWdldCBpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKCl7Y29uc3QgZT12b2lkIDAhPT10aGlzLl9kb2N1bWVudCYmISF0aGlzLl9kb2N1bWVudC5mb250cztyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCIsZSl9Z2V0IGlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKCl7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRgLiIpfWdldCBfbG9hZFRlc3RGb250KCl7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgX2xvYWRUZXN0Rm9udGAuIil9X3ByZXBhcmVGb250TG9hZEV2ZW50KGUsdCxyKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfcHJlcGFyZUZvbnRMb2FkRXZlbnRgLiIpfX1sZXQgczt0LkZvbnRMb2FkZXI9czt0LkZvbnRMb2FkZXI9cz1jbGFzcyBHZW5lcmljRm9udExvYWRlciBleHRlbmRzIEJhc2VGb250TG9hZGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMubG9hZGluZ0NvbnRleHQ9e3JlcXVlc3RzOltdLG5leHRSZXF1ZXN0SWQ6MH07dGhpcy5sb2FkVGVzdEZvbnRJZD0wfWdldCBpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCgpe2xldCBlPSExO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yKWU9ITA7ZWxzZXtjb25zdCB0PS9Nb3ppbGxhXC81LjAuKj9ydjooXGQrKS4qPyBHZWNrby8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KTt0JiZ0WzFdPj0xNCYmKGU9ITApfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCIsZSl9X3F1ZXVlTG9hZGluZ0NhbGxiYWNrKGUpe2NvbnN0IHQ9dGhpcy5sb2FkaW5nQ29udGV4dCxyPXtpZDoicGRmanMtZm9udC1sb2FkaW5nLSIrdC5uZXh0UmVxdWVzdElkKyssZG9uZTohMSxjb21wbGV0ZTpmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKXsoMCxuLmFzc2VydCkoIXIuZG9uZSwiY29tcGxldGVSZXF1ZXN0KCkgY2Fubm90IGJlIGNhbGxlZCB0d2ljZS4iKTtyLmRvbmU9ITA7Zm9yKDt0LnJlcXVlc3RzLmxlbmd0aD4wJiZ0LnJlcXVlc3RzWzBdLmRvbmU7KXtjb25zdCBlPXQucmVxdWVzdHMuc2hpZnQoKTtzZXRUaW1lb3V0KGUuY2FsbGJhY2ssMCl9fSxjYWxsYmFjazplfTt0LnJlcXVlc3RzLnB1c2gocik7cmV0dXJuIHJ9Z2V0IF9sb2FkVGVzdEZvbnQoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiX2xvYWRUZXN0Rm9udCIsYXRvYigiVDFSVVR3QUxBSUFBQXdBd1EwWkdJREh0Wmc0QUFBT1lBQUFBZ1VaR1ZFMWxrelp3QUFBRUhBQUFBQnhIUkVWR0FCUUFGUUFBQkRnQUFBQWVUMU12TWxZTll3a0FBQUVnQUFBQVlHTnRZWEFCRFFMVUFBQUNOQUFBQVVKb1pXRmsveFZGRFFBQUFMd0FBQUEyYUdobFlRZGtBK29BQUFEMEFBQUFKR2h0ZEhnRDZBQUFBQUFFV0FBQUFBWnRZWGh3QUFKUUFBQUFBUmdBQUFBR2JtRnRaVmptZEg0QUFBR0FBQUFBc1hCdmMzVC9oZ0F6QUFBRGVBQUFBQ0FBQVFBQUFBRUFBTFpSRnNSZkR6ejFBQXNENkFBQUFBRE9CT1RMQUFBQUFNNEtIRHdBQUFBQUErZ0RJUUFBQUFnQUFnQUFBQUFBQUFBQkFBQURJUUFBQUZvRDZBQUFBQUFENkFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQVVBQUFBZ0FBQUFRRDZBSDBBQVVBQUFLS0Fyd0FBQUNNQW9vQ3ZBQUFBZUFBTVFFQ0FBQUNBQVlKQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFGQm1SV1FBd0FBdUFDNERJUDg0QUZvRElRQUFBQUFBQVFBQUFBQUFBQUFBQUNBQUlBQUJBQUFBRGdDdUFBRUFBQUFBQUFBQUFRQUFBQUVBQUFBQUFBRUFBUUFBQUFFQUFBQUFBQUlBQVFBQUFBRUFBQUFBQUFNQUFRQUFBQUVBQUFBQUFBUUFBUUFBQUFFQUFBQUFBQVVBQVFBQUFBRUFBQUFBQUFZQUFRQUFBQU1BQVFRSkFBQUFBZ0FCQUFNQUFRUUpBQUVBQWdBQkFBTUFBUVFKQUFJQUFnQUJBQU1BQVFRSkFBTUFBZ0FCQUFNQUFRUUpBQVFBQWdBQkFBTUFBUVFKQUFVQUFnQUJBQU1BQVFRSkFBWUFBZ0FCV0FCWUFBQUFBQUFBQXdBQUFBTUFBQUFjQUFFQUFBQUFBRHdBQXdBQkFBQUFIQUFFQUNBQUFBQUVBQVFBQVFBQUFDNy8vd0FBQUM3Ly8vL1RBQUVBQUFBQUFBQUJCZ0FBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1BQUFBQUFBRC9nd0F5QUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBUUVBQUVCQVFKWUFBRUJBU0g0RHdENEd3SEVBdmdjQS9nWEJJd01BWXVMK256NXRRWGtENWozQ0JMbkVRQUNBUUVCSVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlBQUFCQVFBQUR3QUNBUUVFRS90M0RvdjZmQUg2ZkFUK2ZQcDgrbndIRG9zTUN2bTFDdm0xREF6NmZCUUFBQUFBQUFBQkFBQUFBTW1KYnpFQUFBQUF6Z1RqRlFBQUFBRE9CT1FwQUFFQUFBQUFBQUFBREFBVUFBUUFBQUFCQUFBQUFnQUJBQUFBQUFBQUFBQUQ2QUFBQUFBQUFBPT0iKSl9X3ByZXBhcmVGb250TG9hZEV2ZW50KGUsdCxyKXtmdW5jdGlvbiBpbnQzMihlLHQpe3JldHVybiBlLmNoYXJDb2RlQXQodCk8PDI0fGUuY2hhckNvZGVBdCh0KzEpPDwxNnxlLmNoYXJDb2RlQXQodCsyKTw8OHwyNTUmZS5jaGFyQ29kZUF0KHQrMyl9ZnVuY3Rpb24gc3BsaWNlU3RyaW5nKGUsdCxyLG4pe3JldHVybiBlLnN1YnN0cmluZygwLHQpK24rZS5zdWJzdHJpbmcodCtyKX1sZXQgcyxhO2NvbnN0IGk9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7aS53aWR0aD0xO2kuaGVpZ2h0PTE7Y29uc3Qgbz1pLmdldENvbnRleHQoIjJkIik7bGV0IGw9MDtjb25zdCBjPWBsdCR7RGF0ZS5ub3coKX0ke3RoaXMubG9hZFRlc3RGb250SWQrK31gO2xldCBoPXRoaXMuX2xvYWRUZXN0Rm9udDtoPXNwbGljZVN0cmluZyhoLDk3NixjLmxlbmd0aCxjKTtsZXQgZD1pbnQzMihoLDE2KTtmb3Iocz0wLGE9Yy5sZW5ndGgtMztzPGE7cys9NClkPWQtMTQ4MjE4NDc5MitpbnQzMihjLHMpfDA7czxjLmxlbmd0aCYmKGQ9ZC0xNDgyMTg0NzkyK2ludDMyKGMrIlhYWCIscyl8MCk7aD1zcGxpY2VTdHJpbmcoaCwxNiw0LCgwLG4uc3RyaW5nMzIpKGQpKTtjb25zdCB1PWBAZm9udC1mYWNlIHtmb250LWZhbWlseToiJHtjfSI7c3JjOiR7YHVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCR7YnRvYShoKX0pO2B9fWA7dGhpcy5pbnNlcnRSdWxlKHUpO2NvbnN0IHA9W107Zm9yKHM9MCxhPXQubGVuZ3RoO3M8YTtzKyspcC5wdXNoKHRbc10ubG9hZGVkTmFtZSk7cC5wdXNoKGMpO2NvbnN0IGY9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO2Yuc3R5bGUud2lkdGg9Zi5zdHlsZS5oZWlnaHQ9IjEwcHgiO2Yuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtmLnN0eWxlLnRvcD1mLnN0eWxlLmxlZnQ9IjBweCI7Zm9yKHM9MCxhPXAubGVuZ3RoO3M8YTsrK3Mpe2NvbnN0IGU9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2UudGV4dENvbnRlbnQ9IkhpIjtlLnN0eWxlLmZvbnRGYW1pbHk9cFtzXTtmLmFwcGVuZENoaWxkKGUpfXRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7IWZ1bmN0aW9uIGlzRm9udFJlYWR5KGUsdCl7bCsrO2lmKGw+MzApeygwLG4ud2FybikoIkxvYWQgdGVzdCBmb250IG5ldmVyIGxvYWRlZC4iKTt0KCk7cmV0dXJufW8uZm9udD0iMzBweCAiK2U7by5maWxsVGV4dCgiLiIsMCwyMCk7by5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YVszXT4wP3QoKTpzZXRUaW1lb3V0KGlzRm9udFJlYWR5LmJpbmQobnVsbCxlLHQpKX0oYywoKT0+e3RoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7ci5jb21wbGV0ZSgpfSl9fTt0LkZvbnRGYWNlT2JqZWN0PWNsYXNzIEZvbnRGYWNlT2JqZWN0e2NvbnN0cnVjdG9yKGUse2lzRXZhbFN1cHBvcnRlZDp0PSEwLGRpc2FibGVGb250RmFjZTpyPSExLGlnbm9yZUVycm9yczpuPSExLG9uVW5zdXBwb3J0ZWRGZWF0dXJlOnM9bnVsbCxmb250UmVnaXN0cnk6YT1udWxsfSl7dGhpcy5jb21waWxlZEdseXBocz1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdCB0IGluIGUpdGhpc1t0XT1lW3RdO3RoaXMuaXNFdmFsU3VwcG9ydGVkPSExIT09dDt0aGlzLmRpc2FibGVGb250RmFjZT0hMD09PXI7dGhpcy5pZ25vcmVFcnJvcnM9ITA9PT1uO3RoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlPXM7dGhpcy5mb250UmVnaXN0cnk9YX1jcmVhdGVOYXRpdmVGb250RmFjZSgpe2lmKCF0aGlzLmRhdGF8fHRoaXMuZGlzYWJsZUZvbnRGYWNlKXJldHVybiBudWxsO2NvbnN0IGU9bmV3IEZvbnRGYWNlKHRoaXMubG9hZGVkTmFtZSx0aGlzLmRhdGEse30pO3RoaXMuZm9udFJlZ2lzdHJ5JiZ0aGlzLmZvbnRSZWdpc3RyeS5yZWdpc3RlckZvbnQodGhpcyk7cmV0dXJuIGV9Y3JlYXRlRm9udEZhY2VSdWxlKCl7aWYoIXRoaXMuZGF0YXx8dGhpcy5kaXNhYmxlRm9udEZhY2UpcmV0dXJuIG51bGw7Y29uc3QgZT0oMCxuLmJ5dGVzVG9TdHJpbmcpKG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSkpLHQ9YHVybChkYXRhOiR7dGhpcy5taW1ldHlwZX07YmFzZTY0LCR7YnRvYShlKX0pO2Ascj1gQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6IiR7dGhpcy5sb2FkZWROYW1lfSI7c3JjOiR7dH19YDt0aGlzLmZvbnRSZWdpc3RyeSYmdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMsdCk7cmV0dXJuIHJ9Z2V0UGF0aEdlbmVyYXRvcihlLHQpe2lmKHZvaWQgMCE9PXRoaXMuY29tcGlsZWRHbHlwaHNbdF0pcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbdF07bGV0IHIsczt0cnl7cj1lLmdldCh0aGlzLmxvYWRlZE5hbWUrIl9wYXRoXyIrdCl9Y2F0Y2goZSl7aWYoIXRoaXMuaWdub3JlRXJyb3JzKXRocm93IGU7dGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUmJnRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlKHtmZWF0dXJlSWQ6bi5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRHZXRQYXRofSk7KDAsbi53YXJuKShgZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogIiR7ZX0iLmApO3JldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW3RdPWZ1bmN0aW9uKGUsdCl7fX1pZih0aGlzLmlzRXZhbFN1cHBvcnRlZCYmbi5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQudmFsdWUpe2xldCBlLG49IiI7Zm9yKGxldCB0PTAsYT1yLmxlbmd0aDt0PGE7dCsrKXtzPXJbdF07ZT12b2lkIDAhPT1zLmFyZ3M/cy5hcmdzLmpvaW4oIiwiKToiIjtuKz0iYy4iK3MuY21kKyIoIitlKyIpO1xuIn1yZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1t0XT1uZXcgRnVuY3Rpb24oImMiLCJzaXplIixuKX1yZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1t0XT1mdW5jdGlvbihlLHQpe2ZvcihsZXQgbj0wLGE9ci5sZW5ndGg7bjxhO24rKyl7cz1yW25dOyJzY2FsZSI9PT1zLmNtZCYmKHMuYXJncz1bdCwtdF0pO2Vbcy5jbWRdLmFwcGx5KGUscy5hcmdzKX19fX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuTm9kZUNNYXBSZWFkZXJGYWN0b3J5PXQuTm9kZUNhbnZhc0ZhY3Rvcnk9dm9pZCAwO3ZhciBuPXIoMSkscz1yKDQpLGE9cigyKTtsZXQgaT1jbGFzc3tjb25zdHJ1Y3RvcigpeygwLGEudW5yZWFjaGFibGUpKCJOb3QgaW1wbGVtZW50ZWQ6IE5vZGVDYW52YXNGYWN0b3J5Iil9fTt0Lk5vZGVDYW52YXNGYWN0b3J5PWk7bGV0IG89Y2xhc3N7Y29uc3RydWN0b3IoKXsoMCxhLnVucmVhY2hhYmxlKSgiTm90IGltcGxlbWVudGVkOiBOb2RlQ01hcFJlYWRlckZhY3RvcnkiKX19O3QuTm9kZUNNYXBSZWFkZXJGYWN0b3J5PW87aWYocy5pc05vZGVKUyl7dC5Ob2RlQ2FudmFzRmFjdG9yeT1pPWNsYXNzIGV4dGVuZHMgbi5CYXNlQ2FudmFzRmFjdG9yeXtjcmVhdGUoZSx0KXtpZihlPD0wfHx0PD0wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjYW52YXMgc2l6ZSIpO2NvbnN0IHI9cmVxdWlyZSgiY2FudmFzIikuY3JlYXRlQ2FudmFzKGUsdCk7cmV0dXJue2NhbnZhczpyLGNvbnRleHQ6ci5nZXRDb250ZXh0KCIyZCIpfX19O3QuTm9kZUNNYXBSZWFkZXJGYWN0b3J5PW89Y2xhc3MgZXh0ZW5kcyBuLkJhc2VDTWFwUmVhZGVyRmFjdG9yeXtfZmV0Y2hEYXRhKGUsdCl7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57cmVxdWlyZSgiZnMiKS5yZWFkRmlsZShlLChlLHMpPT57IWUmJnM/cih7Y01hcERhdGE6bmV3IFVpbnQ4QXJyYXkocyksY29tcHJlc3Npb25UeXBlOnR9KTpuKG5ldyBFcnJvcihlKSl9KX0pfX19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkFubm90YXRpb25TdG9yYWdlPXZvaWQgMDt0LkFubm90YXRpb25TdG9yYWdlPWNsYXNzIEFubm90YXRpb25TdG9yYWdle2NvbnN0cnVjdG9yKCl7dGhpcy5fc3RvcmFnZT1uZXcgTWFwO3RoaXMuX21vZGlmaWVkPSExO3RoaXMub25TZXRNb2RpZmllZD1udWxsO3RoaXMub25SZXNldE1vZGlmaWVkPW51bGx9Z2V0T3JDcmVhdGVWYWx1ZShlLHQpe2lmKHRoaXMuX3N0b3JhZ2UuaGFzKGUpKXJldHVybiB0aGlzLl9zdG9yYWdlLmdldChlKTt0aGlzLl9zdG9yYWdlLnNldChlLHQpO3JldHVybiB0fXNldFZhbHVlKGUsdCl7dGhpcy5fc3RvcmFnZS5nZXQoZSkhPT10JiZ0aGlzLl9zZXRNb2RpZmllZCgpO3RoaXMuX3N0b3JhZ2Uuc2V0KGUsdCl9Z2V0QWxsKCl7cmV0dXJuIDA9PT10aGlzLl9zdG9yYWdlLnNpemU/bnVsbDpPYmplY3QuZnJvbUVudHJpZXModGhpcy5fc3RvcmFnZSl9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fc3RvcmFnZS5zaXplfV9zZXRNb2RpZmllZCgpe2lmKCF0aGlzLl9tb2RpZmllZCl7dGhpcy5fbW9kaWZpZWQ9ITA7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub25TZXRNb2RpZmllZCYmdGhpcy5vblNldE1vZGlmaWVkKCl9fXJlc2V0TW9kaWZpZWQoKXtpZih0aGlzLl9tb2RpZmllZCl7dGhpcy5fbW9kaWZpZWQ9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub25SZXNldE1vZGlmaWVkJiZ0aGlzLm9uUmVzZXRNb2RpZmllZCgpfX19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmFwaUNvbXBhdGliaWxpdHlQYXJhbXM9dm9pZCAwO3ZhciBuPXIoNCk7Y29uc3Qgcz1PYmplY3QuY3JlYXRlKG51bGwpOyFmdW5jdGlvbiBjaGVja0ZvbnRGYWNlKCl7bi5pc05vZGVKUyYmKHMuZGlzYWJsZUZvbnRGYWNlPSEwKX0oKTtjb25zdCBhPU9iamVjdC5mcmVlemUocyk7dC5hcGlDb21wYXRpYmlsaXR5UGFyYW1zPWF9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQ2FudmFzR3JhcGhpY3M9dm9pZCAwO3ZhciBuPXIoMikscz1yKDExKTtmdW5jdGlvbiBhZGRDb250ZXh0Q3VycmVudFRyYW5zZm9ybShlKXtpZighZS5tb3pDdXJyZW50VHJhbnNmb3JtKXtlLl9vcmlnaW5hbFNhdmU9ZS5zYXZlO2UuX29yaWdpbmFsUmVzdG9yZT1lLnJlc3RvcmU7ZS5fb3JpZ2luYWxSb3RhdGU9ZS5yb3RhdGU7ZS5fb3JpZ2luYWxTY2FsZT1lLnNjYWxlO2UuX29yaWdpbmFsVHJhbnNsYXRlPWUudHJhbnNsYXRlO2UuX29yaWdpbmFsVHJhbnNmb3JtPWUudHJhbnNmb3JtO2UuX29yaWdpbmFsU2V0VHJhbnNmb3JtPWUuc2V0VHJhbnNmb3JtO2UuX3RyYW5zZm9ybU1hdHJpeD1lLl90cmFuc2Zvcm1NYXRyaXh8fFsxLDAsMCwxLDAsMF07ZS5fdHJhbnNmb3JtU3RhY2s9W107T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm1vekN1cnJlbnRUcmFuc2Zvcm0iLHtnZXQ6ZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybSgpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1NYXRyaXh9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlIix7Z2V0OmZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtTWF0cml4LHQ9ZVswXSxyPWVbMV0sbj1lWzJdLHM9ZVszXSxhPWVbNF0saT1lWzVdLG89dCpzLXIqbixsPXIqbi10KnM7cmV0dXJuW3MvbyxyL2wsbi9sLHQvbywocyphLW4qaSkvbCwociphLXQqaSkvb119fSk7ZS5zYXZlPWZ1bmN0aW9uIGN0eFNhdmUoKXt2YXIgZT10aGlzLl90cmFuc2Zvcm1NYXRyaXg7dGhpcy5fdHJhbnNmb3JtU3RhY2sucHVzaChlKTt0aGlzLl90cmFuc2Zvcm1NYXRyaXg9ZS5zbGljZSgwLDYpO3RoaXMuX29yaWdpbmFsU2F2ZSgpfTtlLnJlc3RvcmU9ZnVuY3Rpb24gY3R4UmVzdG9yZSgpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YWNrLnBvcCgpO2lmKGUpe3RoaXMuX3RyYW5zZm9ybU1hdHJpeD1lO3RoaXMuX29yaWdpbmFsUmVzdG9yZSgpfX07ZS50cmFuc2xhdGU9ZnVuY3Rpb24gY3R4VHJhbnNsYXRlKGUsdCl7dmFyIHI9dGhpcy5fdHJhbnNmb3JtTWF0cml4O3JbNF09clswXSplK3JbMl0qdCtyWzRdO3JbNV09clsxXSplK3JbM10qdCtyWzVdO3RoaXMuX29yaWdpbmFsVHJhbnNsYXRlKGUsdCl9O2Uuc2NhbGU9ZnVuY3Rpb24gY3R4U2NhbGUoZSx0KXt2YXIgcj10aGlzLl90cmFuc2Zvcm1NYXRyaXg7clswXT1yWzBdKmU7clsxXT1yWzFdKmU7clsyXT1yWzJdKnQ7clszXT1yWzNdKnQ7dGhpcy5fb3JpZ2luYWxTY2FsZShlLHQpfTtlLnRyYW5zZm9ybT1mdW5jdGlvbiBjdHhUcmFuc2Zvcm0odCxyLG4scyxhLGkpe3ZhciBvPXRoaXMuX3RyYW5zZm9ybU1hdHJpeDt0aGlzLl90cmFuc2Zvcm1NYXRyaXg9W29bMF0qdCtvWzJdKnIsb1sxXSp0K29bM10qcixvWzBdKm4rb1syXSpzLG9bMV0qbitvWzNdKnMsb1swXSphK29bMl0qaStvWzRdLG9bMV0qYStvWzNdKmkrb1s1XV07ZS5fb3JpZ2luYWxUcmFuc2Zvcm0odCxyLG4scyxhLGkpfTtlLnNldFRyYW5zZm9ybT1mdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0odCxyLG4scyxhLGkpe3RoaXMuX3RyYW5zZm9ybU1hdHJpeD1bdCxyLG4scyxhLGldO2UuX29yaWdpbmFsU2V0VHJhbnNmb3JtKHQscixuLHMsYSxpKX07ZS5yb3RhdGU9ZnVuY3Rpb24gY3R4Um90YXRlKGUpe3ZhciB0PU1hdGguY29zKGUpLHI9TWF0aC5zaW4oZSksbj10aGlzLl90cmFuc2Zvcm1NYXRyaXg7dGhpcy5fdHJhbnNmb3JtTWF0cml4PVtuWzBdKnQrblsyXSpyLG5bMV0qdCtuWzNdKnIsblswXSotcituWzJdKnQsblsxXSotcituWzNdKnQsbls0XSxuWzVdXTt0aGlzLl9vcmlnaW5hbFJvdGF0ZShlKX19fXZhciBhPWZ1bmN0aW9uIENhY2hlZENhbnZhc2VzQ2xvc3VyZSgpe2Z1bmN0aW9uIENhY2hlZENhbnZhc2VzKGUpe3RoaXMuY2FudmFzRmFjdG9yeT1lO3RoaXMuY2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKX1DYWNoZWRDYW52YXNlcy5wcm90b3R5cGU9e2dldENhbnZhczpmdW5jdGlvbiBDYWNoZWRDYW52YXNlc19nZXRDYW52YXMoZSx0LHIsbil7dmFyIHM7aWYodm9pZCAwIT09dGhpcy5jYWNoZVtlXSl7cz10aGlzLmNhY2hlW2VdO3RoaXMuY2FudmFzRmFjdG9yeS5yZXNldChzLHQscik7cy5jb250ZXh0LnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCl9ZWxzZXtzPXRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUodCxyKTt0aGlzLmNhY2hlW2VdPXN9biYmYWRkQ29udGV4dEN1cnJlbnRUcmFuc2Zvcm0ocy5jb250ZXh0KTtyZXR1cm4gc30sY2xlYXIoKXtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZSl7dmFyIHQ9dGhpcy5jYWNoZVtlXTt0aGlzLmNhbnZhc0ZhY3RvcnkuZGVzdHJveSh0KTtkZWxldGUgdGhpcy5jYWNoZVtlXX19fTtyZXR1cm4gQ2FjaGVkQ2FudmFzZXN9KCk7dmFyIGk9ZnVuY3Rpb24gQ2FudmFzRXh0cmFTdGF0ZUNsb3N1cmUoKXtmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlKCl7dGhpcy5hbHBoYUlzU2hhcGU9ITE7dGhpcy5mb250U2l6ZT0wO3RoaXMuZm9udFNpemVTY2FsZT0xO3RoaXMudGV4dE1hdHJpeD1uLklERU5USVRZX01BVFJJWDt0aGlzLnRleHRNYXRyaXhTY2FsZT0xO3RoaXMuZm9udE1hdHJpeD1uLkZPTlRfSURFTlRJVFlfTUFUUklYO3RoaXMubGVhZGluZz0wO3RoaXMueD0wO3RoaXMueT0wO3RoaXMubGluZVg9MDt0aGlzLmxpbmVZPTA7dGhpcy5jaGFyU3BhY2luZz0wO3RoaXMud29yZFNwYWNpbmc9MDt0aGlzLnRleHRIU2NhbGU9MTt0aGlzLnRleHRSZW5kZXJpbmdNb2RlPW4uVGV4dFJlbmRlcmluZ01vZGUuRklMTDt0aGlzLnRleHRSaXNlPTA7dGhpcy5maWxsQ29sb3I9IiMwMDAwMDAiO3RoaXMuc3Ryb2tlQ29sb3I9IiMwMDAwMDAiO3RoaXMucGF0dGVybkZpbGw9ITE7dGhpcy5maWxsQWxwaGE9MTt0aGlzLnN0cm9rZUFscGhhPTE7dGhpcy5saW5lV2lkdGg9MTt0aGlzLmFjdGl2ZVNNYXNrPW51bGw7dGhpcy5yZXN1bWVTTWFza0N0eD1udWxsO3RoaXMudHJhbnNmZXJNYXBzPW51bGx9Q2FudmFzRXh0cmFTdGF0ZS5wcm90b3R5cGU9e2Nsb25lOmZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGVfY2xvbmUoKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKX0sc2V0Q3VycmVudFBvaW50OmZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGVfc2V0Q3VycmVudFBvaW50KGUsdCl7dGhpcy54PWU7dGhpcy55PXR9fTtyZXR1cm4gQ2FudmFzRXh0cmFTdGF0ZX0oKSxvPWZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzQ2xvc3VyZSgpe2Z1bmN0aW9uIENhbnZhc0dyYXBoaWNzKGUsdCxyLG4scyxvLGwpe3RoaXMuY3R4PWU7dGhpcy5jdXJyZW50PW5ldyBpO3RoaXMuc3RhdGVTdGFjaz1bXTt0aGlzLnBlbmRpbmdDbGlwPW51bGw7dGhpcy5wZW5kaW5nRU9GaWxsPSExO3RoaXMucmVzPW51bGw7dGhpcy54b2Jqcz1udWxsO3RoaXMuY29tbW9uT2Jqcz10O3RoaXMub2Jqcz1yO3RoaXMuY2FudmFzRmFjdG9yeT1uO3RoaXMud2ViR0xDb250ZXh0PXM7dGhpcy5pbWFnZUxheWVyPW87dGhpcy5ncm91cFN0YWNrPVtdO3RoaXMucHJvY2Vzc2luZ1R5cGUzPW51bGw7dGhpcy5iYXNlVHJhbnNmb3JtPW51bGw7dGhpcy5iYXNlVHJhbnNmb3JtU3RhY2s9W107dGhpcy5ncm91cExldmVsPTA7dGhpcy5zbWFza1N0YWNrPVtdO3RoaXMuc21hc2tDb3VudGVyPTA7dGhpcy50ZW1wU01hc2s9bnVsbDt0aGlzLmNvbnRlbnRWaXNpYmxlPSEwO3RoaXMubWFya2VkQ29udGVudFN0YWNrPVtdO3RoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnPWw7dGhpcy5jYWNoZWRDYW52YXNlcz1uZXcgYSh0aGlzLmNhbnZhc0ZhY3RvcnkpO2UmJmFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGUpO3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbH1mdW5jdGlvbiBwdXRCaW5hcnlJbWFnZURhdGEoZSx0LHI9bnVsbCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZURhdGEmJnQgaW5zdGFuY2VvZiBJbWFnZURhdGEpe2UucHV0SW1hZ2VEYXRhKHQsMCwwKTtyZXR1cm59dmFyIHMsYSxpLG8sbCxjPXQuaGVpZ2h0LGg9dC53aWR0aCxkPWMlMTYsdT0oYy1kKS8xNixwPTA9PT1kP3U6dSsxLGY9ZS5jcmVhdGVJbWFnZURhdGEoaCwxNiksZz0wLG09dC5kYXRhLF89Zi5kYXRhO2xldCBBLGIseSx2O2lmKHIpc3dpdGNoKHIubGVuZ3RoKXtjYXNlIDE6QT1yWzBdO2I9clswXTt5PXJbMF07dj1yWzBdO2JyZWFrO2Nhc2UgNDpBPXJbMF07Yj1yWzFdO3k9clsyXTt2PXJbM119aWYodC5raW5kPT09bi5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFApe3ZhciBDPW0uYnl0ZUxlbmd0aCxTPW5ldyBVaW50MzJBcnJheShfLmJ1ZmZlciwwLF8uYnl0ZUxlbmd0aD4+MikseD1TLmxlbmd0aCxQPWgrNz4+MyxrPTQyOTQ5NjcyOTUsUj1uLklzTGl0dGxlRW5kaWFuQ2FjaGVkLnZhbHVlPzQyNzgxOTAwODA6MjU1O3YmJjI1NT09PXZbMF0mJjA9PT12WzI1NV0mJihbayxSXT1bUixrXSk7Zm9yKGE9MDthPHA7YSsrKXtvPWE8dT8xNjpkO3M9MDtmb3IoaT0wO2k8bztpKyspe3ZhciB3PUMtZztsZXQgZT0wO2Zvcih2YXIgVD13PlA/aDo4KnctNyxFPS04JlQsRj0wLEw9MDtlPEU7ZSs9OCl7TD1tW2crK107U1tzKytdPTEyOCZMP2s6UjtTW3MrK109NjQmTD9rOlI7U1tzKytdPTMyJkw/azpSO1NbcysrXT0xNiZMP2s6UjtTW3MrK109OCZMP2s6UjtTW3MrK109NCZMP2s6UjtTW3MrK109MiZMP2s6UjtTW3MrK109MSZMP2s6Un1mb3IoO2U8VDtlKyspe2lmKDA9PT1GKXtMPW1bZysrXTtGPTEyOH1TW3MrK109TCZGP2s6UjtGPj49MX19Zm9yKDtzPHg7KVNbcysrXT0wO2UucHV0SW1hZ2VEYXRhKGYsMCwxNiphKX19ZWxzZSBpZih0LmtpbmQ9PT1uLkltYWdlS2luZC5SR0JBXzMyQlBQKXtjb25zdCB0PSEhKEF8fGJ8fHkpO2k9MDtsPTE2KmgqNDtmb3IoYT0wO2E8dTthKyspe18uc2V0KG0uc3ViYXJyYXkoZyxnK2wpKTtnKz1sO2lmKHQpZm9yKGxldCBlPTA7ZTxsO2UrPTQpe0EmJihfW2UrMF09QVtfW2UrMF1dKTtiJiYoX1tlKzFdPWJbX1tlKzFdXSk7eSYmKF9bZSsyXT15W19bZSsyXV0pfWUucHV0SW1hZ2VEYXRhKGYsMCxpKTtpKz0xNn1pZihhPHApe2w9aCpkKjQ7Xy5zZXQobS5zdWJhcnJheShnLGcrbCkpO2lmKHQpZm9yKGxldCBlPTA7ZTxsO2UrPTQpe0EmJihfW2UrMF09QVtfW2UrMF1dKTtiJiYoX1tlKzFdPWJbX1tlKzFdXSk7eSYmKF9bZSsyXT15W19bZSsyXV0pfWUucHV0SW1hZ2VEYXRhKGYsMCxpKX19ZWxzZXtpZih0LmtpbmQhPT1uLkltYWdlS2luZC5SR0JfMjRCUFApdGhyb3cgbmV3IEVycm9yKCJiYWQgaW1hZ2Uga2luZDogIit0LmtpbmQpO3tjb25zdCB0PSEhKEF8fGJ8fHkpO2w9aCoobz0xNik7Zm9yKGE9MDthPHA7YSsrKXthPj11JiYobD1oKihvPWQpKTtzPTA7Zm9yKGk9bDtpLS07KXtfW3MrK109bVtnKytdO19bcysrXT1tW2crK107X1tzKytdPW1bZysrXTtfW3MrK109MjU1fWlmKHQpZm9yKGxldCBlPTA7ZTxzO2UrPTQpe0EmJihfW2UrMF09QVtfW2UrMF1dKTtiJiYoX1tlKzFdPWJbX1tlKzFdXSk7eSYmKF9bZSsyXT15W19bZSsyXV0pfWUucHV0SW1hZ2VEYXRhKGYsMCwxNiphKX19fX1mdW5jdGlvbiBwdXRCaW5hcnlJbWFnZU1hc2soZSx0KXtmb3IodmFyIHI9dC5oZWlnaHQsbj10LndpZHRoLHM9ciUxNixhPShyLXMpLzE2LGk9MD09PXM/YTphKzEsbz1lLmNyZWF0ZUltYWdlRGF0YShuLDE2KSxsPTAsYz10LmRhdGEsaD1vLmRhdGEsZD0wO2Q8aTtkKyspe2Zvcih2YXIgdT1kPGE/MTY6cyxwPTMsZj0wO2Y8dTtmKyspZm9yKHZhciBnPTAsbT0wO208bjttKyspe2lmKCFnKXt2YXIgXz1jW2wrK107Zz0xMjh9aFtwXT1fJmc/MDoyNTU7cCs9NDtnPj49MX1lLnB1dEltYWdlRGF0YShvLDAsMTYqZCl9fWZ1bmN0aW9uIGNvcHlDdHhTdGF0ZShlLHQpe2Zvcih2YXIgcj1bInN0cm9rZVN0eWxlIiwiZmlsbFN0eWxlIiwiZmlsbFJ1bGUiLCJnbG9iYWxBbHBoYSIsImxpbmVXaWR0aCIsImxpbmVDYXAiLCJsaW5lSm9pbiIsIm1pdGVyTGltaXQiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJmb250Il0sbj0wLHM9ci5sZW5ndGg7bjxzO24rKyl7dmFyIGE9cltuXTt2b2lkIDAhPT1lW2FdJiYodFthXT1lW2FdKX1pZih2b2lkIDAhPT1lLnNldExpbmVEYXNoKXt0LnNldExpbmVEYXNoKGUuZ2V0TGluZURhc2goKSk7dC5saW5lRGFzaE9mZnNldD1lLmxpbmVEYXNoT2Zmc2V0fX1mdW5jdGlvbiByZXNldEN0eFRvRGVmYXVsdChlKXtlLnN0cm9rZVN0eWxlPSIjMDAwMDAwIjtlLmZpbGxTdHlsZT0iIzAwMDAwMCI7ZS5maWxsUnVsZT0ibm9uemVybyI7ZS5nbG9iYWxBbHBoYT0xO2UubGluZVdpZHRoPTE7ZS5saW5lQ2FwPSJidXR0IjtlLmxpbmVKb2luPSJtaXRlciI7ZS5taXRlckxpbWl0PTEwO2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2Utb3ZlciI7ZS5mb250PSIxMHB4IHNhbnMtc2VyaWYiO2lmKHZvaWQgMCE9PWUuc2V0TGluZURhc2gpe2Uuc2V0TGluZURhc2goW10pO2UubGluZURhc2hPZmZzZXQ9MH19ZnVuY3Rpb24gY29tcG9zZVNNYXNrQmFja2Ryb3AoZSx0LHIsbil7Zm9yKHZhciBzPWUubGVuZ3RoLGE9MzthPHM7YSs9NCl7dmFyIGk9ZVthXTtpZigwPT09aSl7ZVthLTNdPXQ7ZVthLTJdPXI7ZVthLTFdPW59ZWxzZSBpZihpPDI1NSl7dmFyIG89MjU1LWk7ZVthLTNdPWVbYS0zXSppK3Qqbz4+ODtlW2EtMl09ZVthLTJdKmkrcipvPj44O2VbYS0xXT1lW2EtMV0qaStuKm8+Pjh9fX1mdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYShlLHQscil7Zm9yKHZhciBuPWUubGVuZ3RoLHM9MztzPG47cys9NCl7dmFyIGE9cj9yW2Vbc11dOmVbc107dFtzXT10W3NdKmEqKDEvMjU1KXwwfX1mdW5jdGlvbiBjb21wb3NlU01hc2tMdW1pbm9zaXR5KGUsdCxyKXtmb3IodmFyIG49ZS5sZW5ndGgscz0zO3M8bjtzKz00KXt2YXIgYT03NyplW3MtM10rMTUyKmVbcy0yXSsyOCplW3MtMV07dFtzXT1yP3Rbc10qclthPj44XT4+ODp0W3NdKmE+PjE2fX1mdW5jdGlvbiBjb21wb3NlU01hc2soZSx0LHIsbil7dmFyIHM9dC5jYW52YXMsYT10LmNvbnRleHQ7ZS5zZXRUcmFuc2Zvcm0odC5zY2FsZVgsMCwwLHQuc2NhbGVZLHQub2Zmc2V0WCx0Lm9mZnNldFkpO3ZhciBpPXQuYmFja2Ryb3B8fG51bGw7aWYodC50cmFuc2Zlck1hcHx8IW4uaXNFbmFibGVkKXshZnVuY3Rpb24gZ2VuZXJpY0NvbXBvc2VTTWFzayhlLHQscixuLHMsYSxpKXt2YXIgbyxsPSEhYSxjPWw/YVswXTowLGg9bD9hWzFdOjAsZD1sP2FbMl06MDtvPSJMdW1pbm9zaXR5Ij09PXM/Y29tcG9zZVNNYXNrTHVtaW5vc2l0eTpjb21wb3NlU01hc2tBbHBoYTtmb3IodmFyIHU9TWF0aC5taW4obixNYXRoLmNlaWwoMTA0ODU3Ni9yKSkscD0wO3A8bjtwKz11KXt2YXIgZj1NYXRoLm1pbih1LG4tcCksZz1lLmdldEltYWdlRGF0YSgwLHAscixmKSxtPXQuZ2V0SW1hZ2VEYXRhKDAscCxyLGYpO2wmJmNvbXBvc2VTTWFza0JhY2tkcm9wKGcuZGF0YSxjLGgsZCk7byhnLmRhdGEsbS5kYXRhLGkpO2UucHV0SW1hZ2VEYXRhKG0sMCxwKX19KGEscixzLndpZHRoLHMuaGVpZ2h0LHQuc3VidHlwZSxpLHQudHJhbnNmZXJNYXApO2UuZHJhd0ltYWdlKHMsMCwwKX1lbHNle2NvbnN0IGE9bi5jb21wb3NlU01hc2soe2xheWVyOnIuY2FudmFzLG1hc2s6cyxwcm9wZXJ0aWVzOntzdWJ0eXBlOnQuc3VidHlwZSxiYWNrZHJvcDppfX0pO2Uuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtlLmRyYXdJbWFnZShhLHQub2Zmc2V0WCx0Lm9mZnNldFkpfX12YXIgZT1bImJ1dHQiLCJyb3VuZCIsInNxdWFyZSJdLHQ9WyJtaXRlciIsInJvdW5kIiwiYmV2ZWwiXSxyPXt9LG89e307Q2FudmFzR3JhcGhpY3MucHJvdG90eXBlPXtiZWdpbkRyYXdpbmcoe3RyYW5zZm9ybTplLHZpZXdwb3J0OnQsdHJhbnNwYXJlbmN5OnI9ITEsYmFja2dyb3VuZDpuPW51bGx9KXt2YXIgcz10aGlzLmN0eC5jYW52YXMud2lkdGgsYT10aGlzLmN0eC5jYW52YXMuaGVpZ2h0O3RoaXMuY3R4LnNhdmUoKTt0aGlzLmN0eC5maWxsU3R5bGU9bnx8InJnYigyNTUsIDI1NSwgMjU1KSI7dGhpcy5jdHguZmlsbFJlY3QoMCwwLHMsYSk7dGhpcy5jdHgucmVzdG9yZSgpO2lmKHIpe3ZhciBpPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJ0cmFuc3BhcmVudCIscyxhLCEwKTt0aGlzLmNvbXBvc2l0ZUN0eD10aGlzLmN0eDt0aGlzLnRyYW5zcGFyZW50Q2FudmFzPWkuY2FudmFzO3RoaXMuY3R4PWkuY29udGV4dDt0aGlzLmN0eC5zYXZlKCk7dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LHRoaXMuY29tcG9zaXRlQ3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0pfXRoaXMuY3R4LnNhdmUoKTtyZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7ZSYmdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LGUpO3RoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCx0LnRyYW5zZm9ybSk7dGhpcy5iYXNlVHJhbnNmb3JtPXRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0uc2xpY2UoKTt0aGlzLmltYWdlTGF5ZXImJnRoaXMuaW1hZ2VMYXllci5iZWdpbkxheW91dCgpfSxleGVjdXRlT3BlcmF0b3JMaXN0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2V4ZWN1dGVPcGVyYXRvckxpc3QoZSx0LHIscyl7dmFyIGE9ZS5hcmdzQXJyYXksaT1lLmZuQXJyYXksbz10fHwwLGw9YS5sZW5ndGg7aWYobD09PW8pcmV0dXJuIG87Zm9yKHZhciBjLGg9bC1vPjEwJiYiZnVuY3Rpb24iPT10eXBlb2YgcixkPWg/RGF0ZS5ub3coKSsxNTowLHU9MCxwPXRoaXMuY29tbW9uT2JqcyxmPXRoaXMub2Jqczs7KXtpZih2b2lkIDAhPT1zJiZvPT09cy5uZXh0QnJlYWtQb2ludCl7cy5icmVha0l0KG8scik7cmV0dXJuIG99aWYoKGM9aVtvXSkhPT1uLk9QUy5kZXBlbmRlbmN5KXRoaXNbY10uYXBwbHkodGhpcyxhW29dKTtlbHNlIGZvcihjb25zdCBlIG9mIGFbb10pe2NvbnN0IHQ9ZS5zdGFydHNXaXRoKCJnXyIpP3A6ZjtpZighdC5oYXMoZSkpe3QuZ2V0KGUscik7cmV0dXJuIG99fWlmKCsrbz09PWwpcmV0dXJuIG87aWYoaCYmKyt1PjEwKXtpZihEYXRlLm5vdygpPmQpe3IoKTtyZXR1cm4gb311PTB9fX0sZW5kRHJhd2luZzpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmREcmF3aW5nKCl7bnVsbCE9PXRoaXMuY3VycmVudC5hY3RpdmVTTWFzayYmdGhpcy5lbmRTTWFza0dyb3VwKCk7dGhpcy5jdHgucmVzdG9yZSgpO2lmKHRoaXMudHJhbnNwYXJlbnRDYW52YXMpe3RoaXMuY3R4PXRoaXMuY29tcG9zaXRlQ3R4O3RoaXMuY3R4LnNhdmUoKTt0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApO3RoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnRyYW5zcGFyZW50Q2FudmFzLDAsMCk7dGhpcy5jdHgucmVzdG9yZSgpO3RoaXMudHJhbnNwYXJlbnRDYW52YXM9bnVsbH10aGlzLmNhY2hlZENhbnZhc2VzLmNsZWFyKCk7dGhpcy53ZWJHTENvbnRleHQuY2xlYXIoKTt0aGlzLmltYWdlTGF5ZXImJnRoaXMuaW1hZ2VMYXllci5lbmRMYXlvdXQoKX0sc2V0TGluZVdpZHRoOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExpbmVXaWR0aChlKXt0aGlzLmN1cnJlbnQubGluZVdpZHRoPWU7dGhpcy5jdHgubGluZVdpZHRoPWV9LHNldExpbmVDYXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGluZUNhcCh0KXt0aGlzLmN0eC5saW5lQ2FwPWVbdF19LHNldExpbmVKb2luOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExpbmVKb2luKGUpe3RoaXMuY3R4LmxpbmVKb2luPXRbZV19LHNldE1pdGVyTGltaXQ6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TWl0ZXJMaW1pdChlKXt0aGlzLmN0eC5taXRlckxpbWl0PWV9LHNldERhc2g6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0RGFzaChlLHQpe3ZhciByPXRoaXMuY3R4O2lmKHZvaWQgMCE9PXIuc2V0TGluZURhc2gpe3Iuc2V0TGluZURhc2goZSk7ci5saW5lRGFzaE9mZnNldD10fX0sc2V0UmVuZGVyaW5nSW50ZW50KGUpe30sc2V0RmxhdG5lc3MoZSl7fSxzZXRHU3RhdGU6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0R1N0YXRlKGUpe2Zvcih2YXIgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7dmFyIG49ZVt0XSxzPW5bMF0sYT1uWzFdO3N3aXRjaChzKXtjYXNlIkxXIjp0aGlzLnNldExpbmVXaWR0aChhKTticmVhaztjYXNlIkxDIjp0aGlzLnNldExpbmVDYXAoYSk7YnJlYWs7Y2FzZSJMSiI6dGhpcy5zZXRMaW5lSm9pbihhKTticmVhaztjYXNlIk1MIjp0aGlzLnNldE1pdGVyTGltaXQoYSk7YnJlYWs7Y2FzZSJEIjp0aGlzLnNldERhc2goYVswXSxhWzFdKTticmVhaztjYXNlIlJJIjp0aGlzLnNldFJlbmRlcmluZ0ludGVudChhKTticmVhaztjYXNlIkZMIjp0aGlzLnNldEZsYXRuZXNzKGEpO2JyZWFrO2Nhc2UiRm9udCI6dGhpcy5zZXRGb250KGFbMF0sYVsxXSk7YnJlYWs7Y2FzZSJDQSI6dGhpcy5jdXJyZW50LnN0cm9rZUFscGhhPW5bMV07YnJlYWs7Y2FzZSJjYSI6dGhpcy5jdXJyZW50LmZpbGxBbHBoYT1uWzFdO3RoaXMuY3R4Lmdsb2JhbEFscGhhPW5bMV07YnJlYWs7Y2FzZSJCTSI6dGhpcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWE7YnJlYWs7Y2FzZSJTTWFzayI6dGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrJiYodGhpcy5zdGF0ZVN0YWNrLmxlbmd0aD4wJiZ0aGlzLnN0YXRlU3RhY2tbdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aC0xXS5hY3RpdmVTTWFzaz09PXRoaXMuY3VycmVudC5hY3RpdmVTTWFzaz90aGlzLnN1c3BlbmRTTWFza0dyb3VwKCk6dGhpcy5lbmRTTWFza0dyb3VwKCkpO3RoaXMuY3VycmVudC5hY3RpdmVTTWFzaz1hP3RoaXMudGVtcFNNYXNrOm51bGw7dGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrJiZ0aGlzLmJlZ2luU01hc2tHcm91cCgpO3RoaXMudGVtcFNNYXNrPW51bGw7YnJlYWs7Y2FzZSJUUiI6dGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcz1hfX19LGJlZ2luU01hc2tHcm91cDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpblNNYXNrR3JvdXAoKXt2YXIgZT10aGlzLmN1cnJlbnQuYWN0aXZlU01hc2ssdD1lLmNhbnZhcy53aWR0aCxyPWUuY2FudmFzLmhlaWdodCxuPSJzbWFza0dyb3VwQXQiK3RoaXMuZ3JvdXBMZXZlbCxzPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKG4sdCxyLCEwKSxhPXRoaXMuY3R4LGk9YS5tb3pDdXJyZW50VHJhbnNmb3JtO3RoaXMuY3R4LnNhdmUoKTt2YXIgbz1zLmNvbnRleHQ7by5zY2FsZSgxL2Uuc2NhbGVYLDEvZS5zY2FsZVkpO28udHJhbnNsYXRlKC1lLm9mZnNldFgsLWUub2Zmc2V0WSk7by50cmFuc2Zvcm0uYXBwbHkobyxpKTtlLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZT1vLm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlO2NvcHlDdHhTdGF0ZShhLG8pO3RoaXMuY3R4PW87dGhpcy5zZXRHU3RhdGUoW1siQk0iLCJzb3VyY2Utb3ZlciJdLFsiY2EiLDFdLFsiQ0EiLDFdXSk7dGhpcy5ncm91cFN0YWNrLnB1c2goYSk7dGhpcy5ncm91cExldmVsKyt9LHN1c3BlbmRTTWFza0dyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFNNYXNrR3JvdXAoKXt2YXIgZT10aGlzLmN0eDt0aGlzLmdyb3VwTGV2ZWwtLTt0aGlzLmN0eD10aGlzLmdyb3VwU3RhY2sucG9wKCk7Y29tcG9zZVNNYXNrKHRoaXMuY3R4LHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayxlLHRoaXMud2ViR0xDb250ZXh0KTt0aGlzLmN0eC5yZXN0b3JlKCk7dGhpcy5jdHguc2F2ZSgpO2NvcHlDdHhTdGF0ZShlLHRoaXMuY3R4KTt0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHg9ZTt2YXIgdD1uLlV0aWwudHJhbnNmb3JtKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzay5zdGFydFRyYW5zZm9ybUludmVyc2UsZS5tb3pDdXJyZW50VHJhbnNmb3JtKTt0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsdCk7ZS5zYXZlKCk7ZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApO2UuY2xlYXJSZWN0KDAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpO2UucmVzdG9yZSgpfSxyZXN1bWVTTWFza0dyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFNNYXNrR3JvdXAoKXt2YXIgZT10aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHgsdD10aGlzLmN0eDt0aGlzLmN0eD1lO3RoaXMuZ3JvdXBTdGFjay5wdXNoKHQpO3RoaXMuZ3JvdXBMZXZlbCsrfSxlbmRTTWFza0dyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFNNYXNrR3JvdXAoKXt2YXIgZT10aGlzLmN0eDt0aGlzLmdyb3VwTGV2ZWwtLTt0aGlzLmN0eD10aGlzLmdyb3VwU3RhY2sucG9wKCk7Y29tcG9zZVNNYXNrKHRoaXMuY3R4LHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayxlLHRoaXMud2ViR0xDb250ZXh0KTt0aGlzLmN0eC5yZXN0b3JlKCk7Y29weUN0eFN0YXRlKGUsdGhpcy5jdHgpO3ZhciB0PW4uVXRpbC50cmFuc2Zvcm0odGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZSxlLm1vekN1cnJlbnRUcmFuc2Zvcm0pO3RoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCx0KX0sc2F2ZTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zYXZlKCl7dGhpcy5jdHguc2F2ZSgpO3ZhciBlPXRoaXMuY3VycmVudDt0aGlzLnN0YXRlU3RhY2sucHVzaChlKTt0aGlzLmN1cnJlbnQ9ZS5jbG9uZSgpO3RoaXMuY3VycmVudC5yZXN1bWVTTWFza0N0eD1udWxsfSxyZXN0b3JlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3Jlc3RvcmUoKXt0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHgmJnRoaXMucmVzdW1lU01hc2tHcm91cCgpO251bGw9PT10aGlzLmN1cnJlbnQuYWN0aXZlU01hc2t8fDAhPT10aGlzLnN0YXRlU3RhY2subGVuZ3RoJiZ0aGlzLnN0YXRlU3RhY2tbdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aC0xXS5hY3RpdmVTTWFzaz09PXRoaXMuY3VycmVudC5hY3RpdmVTTWFza3x8dGhpcy5lbmRTTWFza0dyb3VwKCk7aWYoMCE9PXRoaXMuc3RhdGVTdGFjay5sZW5ndGgpe3RoaXMuY3VycmVudD10aGlzLnN0YXRlU3RhY2sucG9wKCk7dGhpcy5jdHgucmVzdG9yZSgpO3RoaXMucGVuZGluZ0NsaXA9bnVsbDt0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoPW51bGx9fSx0cmFuc2Zvcm06ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfdHJhbnNmb3JtKGUsdCxyLG4scyxhKXt0aGlzLmN0eC50cmFuc2Zvcm0oZSx0LHIsbixzLGEpO3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbH0sY29uc3RydWN0UGF0aDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jb25zdHJ1Y3RQYXRoKGUsdCl7Zm9yKHZhciByPXRoaXMuY3R4LHM9dGhpcy5jdXJyZW50LGE9cy54LGk9cy55LG89MCxsPTAsYz1lLmxlbmd0aDtvPGM7bysrKXN3aXRjaCgwfGVbb10pe2Nhc2Ugbi5PUFMucmVjdGFuZ2xlOmE9dFtsKytdO2k9dFtsKytdO3ZhciBoPXRbbCsrXSxkPXRbbCsrXTswPT09aCYmci5saW5lV2lkdGg8dGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkmJihoPXRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpKTswPT09ZCYmci5saW5lV2lkdGg8dGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkmJihkPXRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpKTt2YXIgdT1hK2gscD1pK2Q7ci5tb3ZlVG8oYSxpKTtyLmxpbmVUbyh1LGkpO3IubGluZVRvKHUscCk7ci5saW5lVG8oYSxwKTtyLmxpbmVUbyhhLGkpO3IuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSBuLk9QUy5tb3ZlVG86YT10W2wrK107aT10W2wrK107ci5tb3ZlVG8oYSxpKTticmVhaztjYXNlIG4uT1BTLmxpbmVUbzphPXRbbCsrXTtpPXRbbCsrXTtyLmxpbmVUbyhhLGkpO2JyZWFrO2Nhc2Ugbi5PUFMuY3VydmVUbzphPXRbbCs0XTtpPXRbbCs1XTtyLmJlemllckN1cnZlVG8odFtsXSx0W2wrMV0sdFtsKzJdLHRbbCszXSxhLGkpO2wrPTY7YnJlYWs7Y2FzZSBuLk9QUy5jdXJ2ZVRvMjpyLmJlemllckN1cnZlVG8oYSxpLHRbbF0sdFtsKzFdLHRbbCsyXSx0W2wrM10pO2E9dFtsKzJdO2k9dFtsKzNdO2wrPTQ7YnJlYWs7Y2FzZSBuLk9QUy5jdXJ2ZVRvMzphPXRbbCsyXTtpPXRbbCszXTtyLmJlemllckN1cnZlVG8odFtsXSx0W2wrMV0sYSxpLGEsaSk7bCs9NDticmVhaztjYXNlIG4uT1BTLmNsb3NlUGF0aDpyLmNsb3NlUGF0aCgpfXMuc2V0Q3VycmVudFBvaW50KGEsaSl9LGNsb3NlUGF0aDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbG9zZVBhdGgoKXt0aGlzLmN0eC5jbG9zZVBhdGgoKX0sc3Ryb2tlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3N0cm9rZShlKXtlPXZvaWQgMD09PWV8fGU7dmFyIHQ9dGhpcy5jdHgscj10aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7dC5nbG9iYWxBbHBoYT10aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGE7aWYodGhpcy5jb250ZW50VmlzaWJsZSlpZihyJiZyLmhhc093blByb3BlcnR5KCJ0eXBlIikmJiJQYXR0ZXJuIj09PXIudHlwZSl7dC5zYXZlKCk7Y29uc3QgZT10Lm1vekN1cnJlbnRUcmFuc2Zvcm0scz1uLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoZSlbMF07dC5zdHJva2VTdHlsZT1yLmdldFBhdHRlcm4odCx0aGlzKTt0LmxpbmVXaWR0aD1NYXRoLm1heCguNjUqdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCksdGhpcy5jdXJyZW50LmxpbmVXaWR0aCpzKTt0LnN0cm9rZSgpO3QucmVzdG9yZSgpfWVsc2V7dC5saW5lV2lkdGg9TWF0aC5tYXgoLjY1KnRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpLHRoaXMuY3VycmVudC5saW5lV2lkdGgpO3Quc3Ryb2tlKCl9ZSYmdGhpcy5jb25zdW1lUGF0aCgpO3QuZ2xvYmFsQWxwaGE9dGhpcy5jdXJyZW50LmZpbGxBbHBoYX0sY2xvc2VTdHJva2U6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VTdHJva2UoKXt0aGlzLmNsb3NlUGF0aCgpO3RoaXMuc3Ryb2tlKCl9LGZpbGw6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZmlsbChlKXtlPXZvaWQgMD09PWV8fGU7dmFyIHQ9dGhpcy5jdHgscj10aGlzLmN1cnJlbnQuZmlsbENvbG9yLG49ITE7aWYodGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsKXt0LnNhdmUoKTt0aGlzLmJhc2VUcmFuc2Zvcm0mJnQuc2V0VHJhbnNmb3JtLmFwcGx5KHQsdGhpcy5iYXNlVHJhbnNmb3JtKTt0LmZpbGxTdHlsZT1yLmdldFBhdHRlcm4odCx0aGlzKTtuPSEwfWlmKHRoaXMuY29udGVudFZpc2libGUpaWYodGhpcy5wZW5kaW5nRU9GaWxsKXt0LmZpbGwoImV2ZW5vZGQiKTt0aGlzLnBlbmRpbmdFT0ZpbGw9ITF9ZWxzZSB0LmZpbGwoKTtuJiZ0LnJlc3RvcmUoKTtlJiZ0aGlzLmNvbnN1bWVQYXRoKCl9LGVvRmlsbDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lb0ZpbGwoKXt0aGlzLnBlbmRpbmdFT0ZpbGw9ITA7dGhpcy5maWxsKCl9LGZpbGxTdHJva2U6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZmlsbFN0cm9rZSgpe3RoaXMuZmlsbCghMSk7dGhpcy5zdHJva2UoITEpO3RoaXMuY29uc3VtZVBhdGgoKX0sZW9GaWxsU3Ryb2tlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VvRmlsbFN0cm9rZSgpe3RoaXMucGVuZGluZ0VPRmlsbD0hMDt0aGlzLmZpbGxTdHJva2UoKX0sY2xvc2VGaWxsU3Ryb2tlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlRmlsbFN0cm9rZSgpe3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5maWxsU3Ryb2tlKCl9LGNsb3NlRU9GaWxsU3Ryb2tlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlRU9GaWxsU3Ryb2tlKCl7dGhpcy5wZW5kaW5nRU9GaWxsPSEwO3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5maWxsU3Ryb2tlKCl9LGVuZFBhdGg6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kUGF0aCgpe3RoaXMuY29uc3VtZVBhdGgoKX0sY2xpcDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbGlwKCl7dGhpcy5wZW5kaW5nQ2xpcD1yfSxlb0NsaXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW9DbGlwKCl7dGhpcy5wZW5kaW5nQ2xpcD1vfSxiZWdpblRleHQ6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5UZXh0KCl7dGhpcy5jdXJyZW50LnRleHRNYXRyaXg9bi5JREVOVElUWV9NQVRSSVg7dGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZT0xO3RoaXMuY3VycmVudC54PXRoaXMuY3VycmVudC5saW5lWD0wO3RoaXMuY3VycmVudC55PXRoaXMuY3VycmVudC5saW5lWT0wfSxlbmRUZXh0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFRleHQoKXt2YXIgZT10aGlzLnBlbmRpbmdUZXh0UGF0aHMsdD10aGlzLmN0eDtpZih2b2lkIDAhPT1lKXt0LnNhdmUoKTt0LmJlZ2luUGF0aCgpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbj1lW3JdO3Quc2V0VHJhbnNmb3JtLmFwcGx5KHQsbi50cmFuc2Zvcm0pO3QudHJhbnNsYXRlKG4ueCxuLnkpO24uYWRkVG9QYXRoKHQsbi5mb250U2l6ZSl9dC5yZXN0b3JlKCk7dC5jbGlwKCk7dC5iZWdpblBhdGgoKTtkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzfWVsc2UgdC5iZWdpblBhdGgoKX0sc2V0Q2hhclNwYWNpbmc6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Q2hhclNwYWNpbmcoZSl7dGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nPWV9LHNldFdvcmRTcGFjaW5nOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFdvcmRTcGFjaW5nKGUpe3RoaXMuY3VycmVudC53b3JkU3BhY2luZz1lfSxzZXRIU2NhbGU6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0SFNjYWxlKGUpe3RoaXMuY3VycmVudC50ZXh0SFNjYWxlPWUvMTAwfSxzZXRMZWFkaW5nOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExlYWRpbmcoZSl7dGhpcy5jdXJyZW50LmxlYWRpbmc9LWV9LHNldEZvbnQ6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Rm9udChlLHQpe3ZhciByPXRoaXMuY29tbW9uT2Jqcy5nZXQoZSkscz10aGlzLmN1cnJlbnQ7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBmaW5kIGZvbnQgZm9yICIrZSk7cy5mb250TWF0cml4PXIuZm9udE1hdHJpeD9yLmZvbnRNYXRyaXg6bi5GT05UX0lERU5USVRZX01BVFJJWDswIT09cy5mb250TWF0cml4WzBdJiYwIT09cy5mb250TWF0cml4WzNdfHwoMCxuLndhcm4pKCJJbnZhbGlkIGZvbnQgbWF0cml4IGZvciBmb250ICIrZSk7aWYodDwwKXt0PS10O3MuZm9udERpcmVjdGlvbj0tMX1lbHNlIHMuZm9udERpcmVjdGlvbj0xO3RoaXMuY3VycmVudC5mb250PXI7dGhpcy5jdXJyZW50LmZvbnRTaXplPXQ7aWYoci5pc1R5cGUzRm9udClyZXR1cm47dmFyIGE9ci5sb2FkZWROYW1lfHwic2Fucy1zZXJpZiI7bGV0IGk9Im5vcm1hbCI7ci5ibGFjaz9pPSI5MDAiOnIuYm9sZCYmKGk9ImJvbGQiKTt2YXIgbz1yLml0YWxpYz8iaXRhbGljIjoibm9ybWFsIixsPWAiJHthfSIsICR7ci5mYWxsYmFja05hbWV9YDtsZXQgYz10O3Q8MTY/Yz0xNjp0PjEwMCYmKGM9MTAwKTt0aGlzLmN1cnJlbnQuZm9udFNpemVTY2FsZT10L2M7dGhpcy5jdHguZm9udD1gJHtvfSAke2l9ICR7Y31weCAke2x9YH0sc2V0VGV4dFJlbmRlcmluZ01vZGU6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0VGV4dFJlbmRlcmluZ01vZGUoZSl7dGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlPWV9LHNldFRleHRSaXNlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFRleHRSaXNlKGUpe3RoaXMuY3VycmVudC50ZXh0UmlzZT1lfSxtb3ZlVGV4dDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19tb3ZlVGV4dChlLHQpe3RoaXMuY3VycmVudC54PXRoaXMuY3VycmVudC5saW5lWCs9ZTt0aGlzLmN1cnJlbnQueT10aGlzLmN1cnJlbnQubGluZVkrPXR9LHNldExlYWRpbmdNb3ZlVGV4dDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMZWFkaW5nTW92ZVRleHQoZSx0KXt0aGlzLnNldExlYWRpbmcoLXQpO3RoaXMubW92ZVRleHQoZSx0KX0sc2V0VGV4dE1hdHJpeDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRUZXh0TWF0cml4KGUsdCxyLG4scyxhKXt0aGlzLmN1cnJlbnQudGV4dE1hdHJpeD1bZSx0LHIsbixzLGFdO3RoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGU9TWF0aC5zcXJ0KGUqZSt0KnQpO3RoaXMuY3VycmVudC54PXRoaXMuY3VycmVudC5saW5lWD0wO3RoaXMuY3VycmVudC55PXRoaXMuY3VycmVudC5saW5lWT0wfSxuZXh0TGluZTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19uZXh0TGluZSgpe3RoaXMubW92ZVRleHQoMCx0aGlzLmN1cnJlbnQubGVhZGluZyl9LHBhaW50Q2hhcihlLHQscixzKXt2YXIgYT10aGlzLmN0eCxpPXRoaXMuY3VycmVudCxvPWkuZm9udCxsPWkudGV4dFJlbmRlcmluZ01vZGUsYz1pLmZvbnRTaXplL2kuZm9udFNpemVTY2FsZSxoPWwmbi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLLGQ9ISEobCZuLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcpO2NvbnN0IHU9aS5wYXR0ZXJuRmlsbCYmIW8ubWlzc2luZ0ZpbGU7dmFyIHA7KG8uZGlzYWJsZUZvbnRGYWNlfHxkfHx1KSYmKHA9by5nZXRQYXRoR2VuZXJhdG9yKHRoaXMuY29tbW9uT2JqcyxlKSk7aWYoby5kaXNhYmxlRm9udEZhY2V8fHUpe2Euc2F2ZSgpO2EudHJhbnNsYXRlKHQscik7YS5iZWdpblBhdGgoKTtwKGEsYyk7cyYmYS5zZXRUcmFuc2Zvcm0uYXBwbHkoYSxzKTtoIT09bi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMJiZoIT09bi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRXx8YS5maWxsKCk7aCE9PW4uVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFJiZoIT09bi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRXx8YS5zdHJva2UoKTthLnJlc3RvcmUoKX1lbHNle2ghPT1uLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwmJmghPT1uLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFfHxhLmZpbGxUZXh0KGUsdCxyKTtoIT09bi5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UmJmghPT1uLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFfHxhLnN0cm9rZVRleHQoZSx0LHIpfWlmKGQpeyh0aGlzLnBlbmRpbmdUZXh0UGF0aHN8fCh0aGlzLnBlbmRpbmdUZXh0UGF0aHM9W10pKS5wdXNoKHt0cmFuc2Zvcm06YS5tb3pDdXJyZW50VHJhbnNmb3JtLHg6dCx5OnIsZm9udFNpemU6YyxhZGRUb1BhdGg6cH0pfX0sZ2V0IGlzRm9udFN1YnBpeGVsQUFFbmFibGVkKCl7Y29uc3R7Y29udGV4dDplfT10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygiaXNGb250U3VicGl4ZWxBQUVuYWJsZWQiLDEwLDEwKTtlLnNjYWxlKDEuNSwxKTtlLmZpbGxUZXh0KCJJIiwwLDEwKTtmb3IodmFyIHQ9ZS5nZXRJbWFnZURhdGEoMCwwLDEwLDEwKS5kYXRhLHI9ITEscz0zO3M8dC5sZW5ndGg7cys9NClpZih0W3NdPjAmJnRbc108MjU1KXtyPSEwO2JyZWFrfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCIscil9LHNob3dUZXh0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3Nob3dUZXh0KGUpe3ZhciB0PXRoaXMuY3VycmVudCxyPXQuZm9udDtpZihyLmlzVHlwZTNGb250KXJldHVybiB0aGlzLnNob3dUeXBlM1RleHQoZSk7dmFyIHM9dC5mb250U2l6ZTtpZigwPT09cylyZXR1cm47dmFyIGE9dGhpcy5jdHgsaT10LmZvbnRTaXplU2NhbGUsbz10LmNoYXJTcGFjaW5nLGw9dC53b3JkU3BhY2luZyxjPXQuZm9udERpcmVjdGlvbixoPXQudGV4dEhTY2FsZSpjLGQ9ZS5sZW5ndGgsdT1yLnZlcnRpY2FsLHA9dT8xOi0xLGY9ci5kZWZhdWx0Vk1ldHJpY3MsZz1zKnQuZm9udE1hdHJpeFswXSxtPXQudGV4dFJlbmRlcmluZ01vZGU9PT1uLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwmJiFyLmRpc2FibGVGb250RmFjZSYmIXQucGF0dGVybkZpbGw7YS5zYXZlKCk7bGV0IF87aWYodC5wYXR0ZXJuRmlsbCl7YS5zYXZlKCk7Y29uc3QgZT10LmZpbGxDb2xvci5nZXRQYXR0ZXJuKGEsdGhpcyk7Xz1hLm1vekN1cnJlbnRUcmFuc2Zvcm07YS5yZXN0b3JlKCk7YS5maWxsU3R5bGU9ZX1hLnRyYW5zZm9ybS5hcHBseShhLHQudGV4dE1hdHJpeCk7YS50cmFuc2xhdGUodC54LHQueSt0LnRleHRSaXNlKTtjPjA/YS5zY2FsZShoLC0xKTphLnNjYWxlKGgsMSk7dmFyIEE9dC5saW5lV2lkdGgsYj10LnRleHRNYXRyaXhTY2FsZTtpZigwPT09Ynx8MD09PUEpe3ZhciB5PXQudGV4dFJlbmRlcmluZ01vZGUmbi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO2lmKHk9PT1uLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRXx8eT09PW4uVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0Upe3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbDtBPS42NSp0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKX19ZWxzZSBBLz1iO2lmKDEhPT1pKXthLnNjYWxlKGksaSk7QS89aX1hLmxpbmVXaWR0aD1BO3ZhciB2LEM9MDtmb3Iodj0wO3Y8ZDsrK3Ype3ZhciBTPWVbdl07aWYoKDAsbi5pc051bSkoUykpQys9cCpTKnMvMWUzO2Vsc2V7dmFyIHgsUCxrLFIsdz0hMSxUPShTLmlzU3BhY2U/bDowKStvLEU9Uy5mb250Q2hhcixGPVMuYWNjZW50LEw9Uy53aWR0aDtpZih1KXt2YXIgTSxELE87TT1TLnZtZXRyaWN8fGY7RD0tKEQ9Uy52bWV0cmljP01bMV06LjUqTCkqZztPPU1bMl0qZztMPU0/LU1bMF06TDt4PUQvaTtQPShDK08pL2l9ZWxzZXt4PUMvaTtQPTB9aWYoci5yZW1lYXN1cmUmJkw+MCl7dmFyIEk9MWUzKmEubWVhc3VyZVRleHQoRSkud2lkdGgvcyppO2lmKEw8SSYmdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCl7dmFyIE49TC9JO3c9ITA7YS5zYXZlKCk7YS5zY2FsZShOLDEpO3gvPU59ZWxzZSBMIT09SSYmKHgrPShMLUkpLzJlMypzL2kpfWlmKHRoaXMuY29udGVudFZpc2libGUmJihTLmlzSW5Gb250fHxyLm1pc3NpbmdGaWxlKSlpZihtJiYhRilhLmZpbGxUZXh0KEUseCxQKTtlbHNle3RoaXMucGFpbnRDaGFyKEUseCxQLF8pO2lmKEYpe2s9eCtzKkYub2Zmc2V0LngvaTtSPVAtcypGLm9mZnNldC55L2k7dGhpcy5wYWludENoYXIoRi5mb250Q2hhcixrLFIsXyl9fUMrPXU/TCpnLVQqYzpMKmcrVCpjO3cmJmEucmVzdG9yZSgpfX11P3QueS09Qzp0LngrPUMqaDthLnJlc3RvcmUoKX0sc2hvd1R5cGUzVGV4dDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zaG93VHlwZTNUZXh0KGUpe3ZhciB0LHIscyxhLGk9dGhpcy5jdHgsbz10aGlzLmN1cnJlbnQsbD1vLmZvbnQsYz1vLmZvbnRTaXplLGg9by5mb250RGlyZWN0aW9uLGQ9bC52ZXJ0aWNhbD8xOi0xLHU9by5jaGFyU3BhY2luZyxwPW8ud29yZFNwYWNpbmcsZj1vLnRleHRIU2NhbGUqaCxnPW8uZm9udE1hdHJpeHx8bi5GT05UX0lERU5USVRZX01BVFJJWCxtPWUubGVuZ3RoO2lmKCEoby50ZXh0UmVuZGVyaW5nTW9kZT09PW4uVGV4dFJlbmRlcmluZ01vZGUuSU5WSVNJQkxFKSYmMCE9PWMpe3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbDtpLnNhdmUoKTtpLnRyYW5zZm9ybS5hcHBseShpLG8udGV4dE1hdHJpeCk7aS50cmFuc2xhdGUoby54LG8ueSk7aS5zY2FsZShmLGgpO2Zvcih0PTA7dDxtOysrdCl7cj1lW3RdO2lmKCgwLG4uaXNOdW0pKHIpKXthPWQqcipjLzFlMzt0aGlzLmN0eC50cmFuc2xhdGUoYSwwKTtvLngrPWEqZn1lbHNle3ZhciBfPShyLmlzU3BhY2U/cDowKSt1LEE9bC5jaGFyUHJvY09wZXJhdG9yTGlzdFtyLm9wZXJhdG9yTGlzdElkXTtpZihBKXtpZih0aGlzLmNvbnRlbnRWaXNpYmxlKXt0aGlzLnByb2Nlc3NpbmdUeXBlMz1yO3RoaXMuc2F2ZSgpO2kuc2NhbGUoYyxjKTtpLnRyYW5zZm9ybS5hcHBseShpLGcpO3RoaXMuZXhlY3V0ZU9wZXJhdG9yTGlzdChBKTt0aGlzLnJlc3RvcmUoKX1zPW4uVXRpbC5hcHBseVRyYW5zZm9ybShbci53aWR0aCwwXSxnKVswXSpjK187aS50cmFuc2xhdGUocywwKTtvLngrPXMqZn1lbHNlKDAsbi53YXJuKShgVHlwZTMgY2hhcmFjdGVyICIke3Iub3BlcmF0b3JMaXN0SWR9IiBpcyBub3QgYXZhaWxhYmxlLmApfX1pLnJlc3RvcmUoKTt0aGlzLnByb2Nlc3NpbmdUeXBlMz1udWxsfX0sc2V0Q2hhcldpZHRoOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJXaWR0aChlLHQpe30sc2V0Q2hhcldpZHRoQW5kQm91bmRzOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJXaWR0aEFuZEJvdW5kcyhlLHQscixuLHMsYSl7dGhpcy5jdHgucmVjdChyLG4scy1yLGEtbik7dGhpcy5jbGlwKCk7dGhpcy5lbmRQYXRoKCl9LGdldENvbG9yTl9QYXR0ZXJuOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2dldENvbG9yTl9QYXR0ZXJuKGUpe3ZhciB0O2lmKCJUaWxpbmdQYXR0ZXJuIj09PWVbMF0pe3ZhciByPWVbMV0sbj10aGlzLmJhc2VUcmFuc2Zvcm18fHRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0uc2xpY2UoKSxhPXtjcmVhdGVDYW52YXNHcmFwaGljczplPT5uZXcgQ2FudmFzR3JhcGhpY3MoZSx0aGlzLmNvbW1vbk9ianMsdGhpcy5vYmpzLHRoaXMuY2FudmFzRmFjdG9yeSx0aGlzLndlYkdMQ29udGV4dCl9O3Q9bmV3IHMuVGlsaW5nUGF0dGVybihlLHIsdGhpcy5jdHgsYSxuKX1lbHNlIHQ9KDAscy5nZXRTaGFkaW5nUGF0dGVybkZyb21JUikoZSk7cmV0dXJuIHR9LHNldFN0cm9rZUNvbG9yTjpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRTdHJva2VDb2xvck4oKXt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9dGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpfSxzZXRGaWxsQ29sb3JOOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEZpbGxDb2xvck4oKXt0aGlzLmN1cnJlbnQuZmlsbENvbG9yPXRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTt0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw9ITB9LHNldFN0cm9rZVJHQkNvbG9yOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFN0cm9rZVJHQkNvbG9yKGUsdCxyKXt2YXIgcz1uLlV0aWwubWFrZUNzc1JnYihlLHQscik7dGhpcy5jdHguc3Ryb2tlU3R5bGU9czt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9c30sc2V0RmlsbFJHQkNvbG9yOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEZpbGxSR0JDb2xvcihlLHQscil7dmFyIHM9bi5VdGlsLm1ha2VDc3NSZ2IoZSx0LHIpO3RoaXMuY3R4LmZpbGxTdHlsZT1zO3RoaXMuY3VycmVudC5maWxsQ29sb3I9czt0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw9ITF9LHNoYWRpbmdGaWxsOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NoYWRpbmdGaWxsKGUpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciB0PXRoaXMuY3R4O3RoaXMuc2F2ZSgpO3ZhciByPSgwLHMuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIpKGUpO3QuZmlsbFN0eWxlPXIuZ2V0UGF0dGVybih0LHRoaXMsITApO3ZhciBhPXQubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7aWYoYSl7dmFyIGk9dC5jYW52YXMsbz1pLndpZHRoLGw9aS5oZWlnaHQsYz1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsMF0sYSksaD1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsbF0sYSksZD1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW28sMF0sYSksdT1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW28sbF0sYSkscD1NYXRoLm1pbihjWzBdLGhbMF0sZFswXSx1WzBdKSxmPU1hdGgubWluKGNbMV0saFsxXSxkWzFdLHVbMV0pLGc9TWF0aC5tYXgoY1swXSxoWzBdLGRbMF0sdVswXSksbT1NYXRoLm1heChjWzFdLGhbMV0sZFsxXSx1WzFdKTt0aGlzLmN0eC5maWxsUmVjdChwLGYsZy1wLG0tZil9ZWxzZSB0aGlzLmN0eC5maWxsUmVjdCgtMWUxMCwtMWUxMCwyZTEwLDJlMTApO3RoaXMucmVzdG9yZSgpfX0sYmVnaW5JbmxpbmVJbWFnZTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbklubGluZUltYWdlKCl7KDAsbi51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlIil9LGJlZ2luSW1hZ2VEYXRhOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luSW1hZ2VEYXRhKCl7KDAsbi51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YSIpfSxwYWludEZvcm1YT2JqZWN0QmVnaW46ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRGb3JtWE9iamVjdEJlZ2luKGUsdCl7aWYodGhpcy5jb250ZW50VmlzaWJsZSl7dGhpcy5zYXZlKCk7dGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLmJhc2VUcmFuc2Zvcm0pO0FycmF5LmlzQXJyYXkoZSkmJjY9PT1lLmxlbmd0aCYmdGhpcy50cmFuc2Zvcm0uYXBwbHkodGhpcyxlKTt0aGlzLmJhc2VUcmFuc2Zvcm09dGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybTtpZih0KXt2YXIgcj10WzJdLXRbMF0sbj10WzNdLXRbMV07dGhpcy5jdHgucmVjdCh0WzBdLHRbMV0scixuKTt0aGlzLmNsaXAoKTt0aGlzLmVuZFBhdGgoKX19fSxwYWludEZvcm1YT2JqZWN0RW5kOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50Rm9ybVhPYmplY3RFbmQoKXtpZih0aGlzLmNvbnRlbnRWaXNpYmxlKXt0aGlzLnJlc3RvcmUoKTt0aGlzLmJhc2VUcmFuc2Zvcm09dGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucG9wKCl9fSxiZWdpbkdyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luR3JvdXAoZSl7aWYodGhpcy5jb250ZW50VmlzaWJsZSl7dGhpcy5zYXZlKCk7dmFyIHQ9dGhpcy5jdHg7ZS5pc29sYXRlZHx8KDAsbi5pbmZvKSgiVE9ETzogU3VwcG9ydCBub24taXNvbGF0ZWQgZ3JvdXBzLiIpO2Uua25vY2tvdXQmJigwLG4ud2FybikoIktub2Nrb3V0IGdyb3VwcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciByPXQubW96Q3VycmVudFRyYW5zZm9ybTtlLm1hdHJpeCYmdC50cmFuc2Zvcm0uYXBwbHkodCxlLm1hdHJpeCk7aWYoIWUuYmJveCl0aHJvdyBuZXcgRXJyb3IoIkJvdW5kaW5nIGJveCBpcyByZXF1aXJlZC4iKTt2YXIgcz1uLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZS5iYm94LHQubW96Q3VycmVudFRyYW5zZm9ybSksYT1bMCwwLHQuY2FudmFzLndpZHRoLHQuY2FudmFzLmhlaWdodF07cz1uLlV0aWwuaW50ZXJzZWN0KHMsYSl8fFswLDAsMCwwXTt2YXIgaT1NYXRoLmZsb29yKHNbMF0pLG89TWF0aC5mbG9vcihzWzFdKSxsPU1hdGgubWF4KE1hdGguY2VpbChzWzJdKS1pLDEpLGM9TWF0aC5tYXgoTWF0aC5jZWlsKHNbM10pLW8sMSksaD0xLGQ9MTtpZihsPjQwOTYpe2g9bC80MDk2O2w9NDA5Nn1pZihjPjQwOTYpe2Q9Yy80MDk2O2M9NDA5Nn12YXIgdT0iZ3JvdXBBdCIrdGhpcy5ncm91cExldmVsO2Uuc21hc2smJih1Kz0iX3NtYXNrXyIrdGhpcy5zbWFza0NvdW50ZXIrKyUyKTt2YXIgcD10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyh1LGwsYywhMCksZj1wLmNvbnRleHQ7Zi5zY2FsZSgxL2gsMS9kKTtmLnRyYW5zbGF0ZSgtaSwtbyk7Zi50cmFuc2Zvcm0uYXBwbHkoZixyKTtpZihlLnNtYXNrKXRoaXMuc21hc2tTdGFjay5wdXNoKHtjYW52YXM6cC5jYW52YXMsY29udGV4dDpmLG9mZnNldFg6aSxvZmZzZXRZOm8sc2NhbGVYOmgsc2NhbGVZOmQsc3VidHlwZTplLnNtYXNrLnN1YnR5cGUsYmFja2Ryb3A6ZS5zbWFzay5iYWNrZHJvcCx0cmFuc2Zlck1hcDplLnNtYXNrLnRyYW5zZmVyTWFwfHxudWxsLHN0YXJ0VHJhbnNmb3JtSW52ZXJzZTpudWxsfSk7ZWxzZXt0LnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7dC50cmFuc2xhdGUoaSxvKTt0LnNjYWxlKGgsZCl9Y29weUN0eFN0YXRlKHQsZik7dGhpcy5jdHg9Zjt0aGlzLnNldEdTdGF0ZShbWyJCTSIsInNvdXJjZS1vdmVyIl0sWyJjYSIsMV0sWyJDQSIsMV1dKTt0aGlzLmdyb3VwU3RhY2sucHVzaCh0KTt0aGlzLmdyb3VwTGV2ZWwrKzt0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s9bnVsbH19LGVuZEdyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEdyb3VwKGUpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3RoaXMuZ3JvdXBMZXZlbC0tO3ZhciB0PXRoaXMuY3R4O3RoaXMuY3R4PXRoaXMuZ3JvdXBTdGFjay5wb3AoKTt2b2lkIDAhPT10aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQ/dGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExOnRoaXMuY3R4Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZD0hMTtlLnNtYXNrP3RoaXMudGVtcFNNYXNrPXRoaXMuc21hc2tTdGFjay5wb3AoKTp0aGlzLmN0eC5kcmF3SW1hZ2UodC5jYW52YXMsMCwwKTt0aGlzLnJlc3RvcmUoKX19LGJlZ2luQW5ub3RhdGlvbnM6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5Bbm5vdGF0aW9ucygpe3RoaXMuc2F2ZSgpO3RoaXMuYmFzZVRyYW5zZm9ybSYmdGhpcy5jdHguc2V0VHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LHRoaXMuYmFzZVRyYW5zZm9ybSl9LGVuZEFubm90YXRpb25zOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEFubm90YXRpb25zKCl7dGhpcy5yZXN0b3JlKCl9LGJlZ2luQW5ub3RhdGlvbjpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkFubm90YXRpb24oZSx0LHIpe3RoaXMuc2F2ZSgpO3Jlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTt0aGlzLmN1cnJlbnQ9bmV3IGk7aWYoQXJyYXkuaXNBcnJheShlKSYmND09PWUubGVuZ3RoKXt2YXIgbj1lWzJdLWVbMF0scz1lWzNdLWVbMV07dGhpcy5jdHgucmVjdChlWzBdLGVbMV0sbixzKTt0aGlzLmNsaXAoKTt0aGlzLmVuZFBhdGgoKX10aGlzLnRyYW5zZm9ybS5hcHBseSh0aGlzLHQpO3RoaXMudHJhbnNmb3JtLmFwcGx5KHRoaXMscil9LGVuZEFubm90YXRpb246ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kQW5ub3RhdGlvbigpe3RoaXMucmVzdG9yZSgpfSxwYWludEltYWdlTWFza1hPYmplY3Q6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZU1hc2tYT2JqZWN0KGUpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciB0PXRoaXMuY3R4LHI9ZS53aWR0aCxuPWUuaGVpZ2h0LHM9dGhpcy5jdXJyZW50LmZpbGxDb2xvcixhPXRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCxpPXRoaXMucHJvY2Vzc2luZ1R5cGUzO2kmJnZvaWQgMD09PWkuY29tcGlsZWQmJihpLmNvbXBpbGVkPXI8PTFlMyYmbjw9MWUzP2Z1bmN0aW9uIGNvbXBpbGVUeXBlM0dseXBoKGUpe3ZhciB0LHIsbixzLGE9ZS53aWR0aCxpPWUuaGVpZ2h0LG89YSsxLGw9bmV3IFVpbnQ4QXJyYXkobyooaSsxKSksYz1uZXcgVWludDhBcnJheShbMCwyLDQsMCwxLDAsNSw0LDgsMTAsMCw4LDAsMiwxLDBdKSxoPWErNyYtOCxkPWUuZGF0YSx1PW5ldyBVaW50OEFycmF5KGgqaSkscD0wO2Zvcih0PTAscz1kLmxlbmd0aDt0PHM7dCsrKWZvcih2YXIgZj0xMjgsZz1kW3RdO2Y+MDspe3VbcCsrXT1nJmY/MDoyNTU7Zj4+PTF9dmFyIG09MDtpZigwIT09dVtwPTBdKXtsWzBdPTE7KyttfWZvcihyPTE7cjxhO3IrKyl7aWYodVtwXSE9PXVbcCsxXSl7bFtyXT11W3BdPzI6MTsrK219cCsrfWlmKDAhPT11W3BdKXtsW3JdPTI7KyttfWZvcih0PTE7dDxpO3QrKyl7bj10Km87aWYodVsocD10KmgpLWhdIT09dVtwXSl7bFtuXT11W3BdPzE6ODsrK219dmFyIF89KHVbcF0/NDowKSsodVtwLWhdPzg6MCk7Zm9yKHI9MTtyPGE7cisrKXtpZihjW189KF8+PjIpKyh1W3ArMV0/NDowKSsodVtwLWgrMV0/ODowKV0pe2xbbityXT1jW19dOysrbX1wKyt9aWYodVtwLWhdIT09dVtwXSl7bFtuK3JdPXVbcF0/Mjo0OysrbX1pZihtPjFlMylyZXR1cm4gbnVsbH1uPXQqbztpZigwIT09dVtwPWgqKGktMSldKXtsW25dPTg7KyttfWZvcihyPTE7cjxhO3IrKyl7aWYodVtwXSE9PXVbcCsxXSl7bFtuK3JdPXVbcF0/NDo4OysrbX1wKyt9aWYoMCE9PXVbcF0pe2xbbityXT00OysrbX1pZihtPjFlMylyZXR1cm4gbnVsbDt2YXIgQT1uZXcgSW50MzJBcnJheShbMCxvLC0xLDAsLW8sMCwwLDAsMV0pLGI9W107Zm9yKHQ9MDttJiZ0PD1pO3QrKyl7Zm9yKHZhciB5PXQqbyx2PXkrYTt5PHYmJiFsW3ldOyl5Kys7aWYoeSE9PXYpe3ZhciBDLFM9W3klbyx0XSx4PWxbeV0sUD15O2Rve3ZhciBrPUFbeF07ZG97eSs9a313aGlsZSghbFt5XSk7aWYoNSE9PShDPWxbeV0pJiYxMCE9PUMpe3g9QztsW3ldPTB9ZWxzZXt4PUMmNTEqeD4+NDtsW3ldJj14Pj4yfHg8PDJ9Uy5wdXNoKHklbyk7Uy5wdXNoKHkvb3wwKTtsW3ldfHwtLW19d2hpbGUoUCE9PXkpO2IucHVzaChTKTstLXR9fXJldHVybiBmdW5jdGlvbihlKXtlLnNhdmUoKTtlLnNjYWxlKDEvYSwtMS9pKTtlLnRyYW5zbGF0ZSgwLC1pKTtlLmJlZ2luUGF0aCgpO2ZvcihsZXQgcj0wLG49Yi5sZW5ndGg7cjxuO3IrKyl7dmFyIHQ9YltyXTtlLm1vdmVUbyh0WzBdLHRbMV0pO2ZvcihsZXQgcj0yLG49dC5sZW5ndGg7cjxuO3IrPTIpZS5saW5lVG8odFtyXSx0W3IrMV0pfWUuZmlsbCgpO2UuYmVnaW5QYXRoKCk7ZS5yZXN0b3JlKCl9fSh7ZGF0YTplLmRhdGEsd2lkdGg6cixoZWlnaHQ6bn0pOm51bGwpO2lmKGkmJmkuY29tcGlsZWQpaS5jb21waWxlZCh0KTtlbHNle3ZhciBvPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtYXNrQ2FudmFzIixyLG4pLGw9by5jb250ZXh0O2wuc2F2ZSgpO3B1dEJpbmFyeUltYWdlTWFzayhsLGUpO2wuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iO2wuZmlsbFN0eWxlPWE/cy5nZXRQYXR0ZXJuKGwsdGhpcyk6cztsLmZpbGxSZWN0KDAsMCxyLG4pO2wucmVzdG9yZSgpO3RoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Qoby5jYW52YXMpfX19LHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdChlLHQscj0wLG49MCxzLGEpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciBpPWUud2lkdGgsbz1lLmhlaWdodCxsPXRoaXMuY3VycmVudC5maWxsQ29sb3IsYz10aGlzLmN1cnJlbnQucGF0dGVybkZpbGwsaD10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygibWFza0NhbnZhcyIsaSxvKSxkPWguY29udGV4dDtkLnNhdmUoKTtwdXRCaW5hcnlJbWFnZU1hc2soZCxlKTtkLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIjtkLmZpbGxTdHlsZT1jP2wuZ2V0UGF0dGVybihkLHRoaXMpOmw7ZC5maWxsUmVjdCgwLDAsaSxvKTtkLnJlc3RvcmUoKTtmb3IodmFyIHU9dGhpcy5jdHgscD0wLGY9YS5sZW5ndGg7cDxmO3ArPTIpe3Uuc2F2ZSgpO3UudHJhbnNmb3JtKHQscixuLHMsYVtwXSxhW3ArMV0pO3Uuc2NhbGUoMSwtMSk7dS5kcmF3SW1hZ2UoaC5jYW52YXMsMCwwLGksbywwLC0xLDEsMSk7dS5yZXN0b3JlKCl9fX0scGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXAoZSl7aWYodGhpcy5jb250ZW50VmlzaWJsZSlmb3IodmFyIHQ9dGhpcy5jdHgscj10aGlzLmN1cnJlbnQuZmlsbENvbG9yLG49dGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsLHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspe3ZhciBpPWVbc10sbz1pLndpZHRoLGw9aS5oZWlnaHQsYz10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygibWFza0NhbnZhcyIsbyxsKSxoPWMuY29udGV4dDtoLnNhdmUoKTtwdXRCaW5hcnlJbWFnZU1hc2soaCxpKTtoLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIjtoLmZpbGxTdHlsZT1uP3IuZ2V0UGF0dGVybihoLHRoaXMpOnI7aC5maWxsUmVjdCgwLDAsbyxsKTtoLnJlc3RvcmUoKTt0LnNhdmUoKTt0LnRyYW5zZm9ybS5hcHBseSh0LGkudHJhbnNmb3JtKTt0LnNjYWxlKDEsLTEpO3QuZHJhd0ltYWdlKGMuY2FudmFzLDAsMCxvLGwsMCwtMSwxLDEpO3QucmVzdG9yZSgpfX0scGFpbnRJbWFnZVhPYmplY3Q6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZVhPYmplY3QoZSl7aWYoIXRoaXMuY29udGVudFZpc2libGUpcmV0dXJuO2NvbnN0IHQ9ZS5zdGFydHNXaXRoKCJnXyIpP3RoaXMuY29tbW9uT2Jqcy5nZXQoZSk6dGhpcy5vYmpzLmdldChlKTt0P3RoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QodCk6KDAsbi53YXJuKSgiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldCIpfSxwYWludEltYWdlWE9iamVjdFJlcGVhdDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlWE9iamVjdFJlcGVhdChlLHQscixzKXtpZighdGhpcy5jb250ZW50VmlzaWJsZSlyZXR1cm47Y29uc3QgYT1lLnN0YXJ0c1dpdGgoImdfIik/dGhpcy5jb21tb25PYmpzLmdldChlKTp0aGlzLm9ianMuZ2V0KGUpO2lmKGEpe2Zvcih2YXIgaT1hLndpZHRoLG89YS5oZWlnaHQsbD1bXSxjPTAsaD1zLmxlbmd0aDtjPGg7Yys9MilsLnB1c2goe3RyYW5zZm9ybTpbdCwwLDAscixzW2NdLHNbYysxXV0seDowLHk6MCx3OmksaDpvfSk7dGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGEsbCl9ZWxzZSgwLG4ud2FybikoIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXQiKX0scGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoZSl7aWYodGhpcy5jb250ZW50VmlzaWJsZSl7dmFyIHQ9ZS53aWR0aCxyPWUuaGVpZ2h0LG49dGhpcy5jdHg7dGhpcy5zYXZlKCk7bi5zY2FsZSgxL3QsLTEvcik7dmFyIHMsYSxpPW4ubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2Usbz1pWzBdLGw9aVsxXSxjPU1hdGgubWF4KE1hdGguc3FydChvKm8rbCpsKSwxKSxoPWlbMl0sZD1pWzNdLHU9TWF0aC5tYXgoTWF0aC5zcXJ0KGgqaCtkKmQpLDEpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBIVE1MRWxlbWVudCYmZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fHwhZS5kYXRhKXM9ZTtlbHNle3ZhciBwPShhPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJpbmxpbmVJbWFnZSIsdCxyKSkuY29udGV4dDtwdXRCaW5hcnlJbWFnZURhdGEocCxlLHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMpO3M9YS5jYW52YXN9Zm9yKHZhciBmPXQsZz1yLG09InByZXNjYWxlMSI7Yz4yJiZmPjF8fHU+MiYmZz4xOyl7dmFyIF89ZixBPWc7Yz4yJiZmPjEmJihjLz1mLyhfPU1hdGguY2VpbChmLzIpKSk7dT4yJiZnPjEmJih1Lz1nLyhBPU1hdGguY2VpbChnLzIpKSk7KHA9KGE9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMobSxfLEEpKS5jb250ZXh0KS5jbGVhclJlY3QoMCwwLF8sQSk7cC5kcmF3SW1hZ2UocywwLDAsZixnLDAsMCxfLEEpO3M9YS5jYW52YXM7Zj1fO2c9QTttPSJwcmVzY2FsZTEiPT09bT8icHJlc2NhbGUyIjoicHJlc2NhbGUxIn1uLmRyYXdJbWFnZShzLDAsMCxmLGcsMCwtcix0LHIpO2lmKHRoaXMuaW1hZ2VMYXllcil7dmFyIGI9dGhpcy5nZXRDYW52YXNQb3NpdGlvbigwLC1yKTt0aGlzLmltYWdlTGF5ZXIuYXBwZW5kSW1hZ2Uoe2ltZ0RhdGE6ZSxsZWZ0OmJbMF0sdG9wOmJbMV0sd2lkdGg6dC9pWzBdLGhlaWdodDpyL2lbM119KX10aGlzLnJlc3RvcmUoKX19LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cChlLHQpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciByPXRoaXMuY3R4LG49ZS53aWR0aCxzPWUuaGVpZ2h0LGE9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoImlubGluZUltYWdlIixuLHMpO3B1dEJpbmFyeUltYWdlRGF0YShhLmNvbnRleHQsZSx0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzKTtmb3IodmFyIGk9MCxvPXQubGVuZ3RoO2k8bztpKyspe3ZhciBsPXRbaV07ci5zYXZlKCk7ci50cmFuc2Zvcm0uYXBwbHkocixsLnRyYW5zZm9ybSk7ci5zY2FsZSgxLC0xKTtyLmRyYXdJbWFnZShhLmNhbnZhcyxsLngsbC55LGwudyxsLmgsMCwtMSwxLDEpO2lmKHRoaXMuaW1hZ2VMYXllcil7dmFyIGM9dGhpcy5nZXRDYW52YXNQb3NpdGlvbihsLngsbC55KTt0aGlzLmltYWdlTGF5ZXIuYXBwZW5kSW1hZ2Uoe2ltZ0RhdGE6ZSxsZWZ0OmNbMF0sdG9wOmNbMV0sd2lkdGg6bixoZWlnaHQ6c30pfXIucmVzdG9yZSgpfX19LHBhaW50U29saWRDb2xvckltYWdlTWFzazpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKXt0aGlzLmNvbnRlbnRWaXNpYmxlJiZ0aGlzLmN0eC5maWxsUmVjdCgwLDAsMSwxKX0sbWFya1BvaW50OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21hcmtQb2ludChlKXt9LG1hcmtQb2ludFByb3BzOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21hcmtQb2ludFByb3BzKGUsdCl7fSxiZWdpbk1hcmtlZENvbnRlbnQ6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5NYXJrZWRDb250ZW50KGUpe3RoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe3Zpc2libGU6ITB9KX0sYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5NYXJrZWRDb250ZW50UHJvcHMoZSx0KXsiT0MiPT09ZT90aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHt2aXNpYmxlOnRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZSh0KX0pOnRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe3Zpc2libGU6ITB9KTt0aGlzLmNvbnRlbnRWaXNpYmxlPXRoaXMuaXNDb250ZW50VmlzaWJsZSgpfSxlbmRNYXJrZWRDb250ZW50OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZE1hcmtlZENvbnRlbnQoKXt0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wb3AoKTt0aGlzLmNvbnRlbnRWaXNpYmxlPXRoaXMuaXNDb250ZW50VmlzaWJsZSgpfSxiZWdpbkNvbXBhdDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkNvbXBhdCgpe30sZW5kQ29tcGF0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZENvbXBhdCgpe30sY29uc3VtZVBhdGg6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY29uc3VtZVBhdGgoKXt2YXIgZT10aGlzLmN0eDtpZih0aGlzLnBlbmRpbmdDbGlwKXt0aGlzLnBlbmRpbmdDbGlwPT09bz9lLmNsaXAoImV2ZW5vZGQiKTplLmNsaXAoKTt0aGlzLnBlbmRpbmdDbGlwPW51bGx9ZS5iZWdpblBhdGgoKX0sZ2V0U2luZ2xlUGl4ZWxXaWR0aChlKXtpZihudWxsPT09dGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCl7Y29uc3QgZT10aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTt0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoPU1hdGguc3FydChNYXRoLm1heChlWzBdKmVbMF0rZVsxXSplWzFdLGVbMl0qZVsyXStlWzNdKmVbM10pKX1yZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aH0sZ2V0Q2FudmFzUG9zaXRpb246ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZ2V0Q2FudmFzUG9zaXRpb24oZSx0KXt2YXIgcj10aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtO3JldHVybltyWzBdKmUrclsyXSp0K3JbNF0sclsxXSplK3JbM10qdCtyWzVdXX0saXNDb250ZW50VmlzaWJsZTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19pc0NvbnRlbnRWaXNpYmxlKCl7Zm9yKGxldCBlPXRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aC0xO2U+PTA7ZS0tKWlmKCF0aGlzLm1hcmtlZENvbnRlbnRTdGFja1tlXS52aXNpYmxlKXJldHVybiExO3JldHVybiEwfX07Zm9yKHZhciBsIGluIG4uT1BTKUNhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtuLk9QU1tsXV09Q2FudmFzR3JhcGhpY3MucHJvdG90eXBlW2xdO3JldHVybiBDYW52YXNHcmFwaGljc30oKTt0LkNhbnZhc0dyYXBoaWNzPW99LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVI9ZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIoZSl7dmFyIHQ9c1tlWzBdXTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gSVIgdHlwZTogIitlWzBdKTtyZXR1cm4gdC5mcm9tSVIoZSl9O3QuVGlsaW5nUGF0dGVybj12b2lkIDA7dmFyIG49cigyKSxzPXt9O2Z1bmN0aW9uIGFwcGx5Qm91bmRpbmdCb3goZSx0KXtpZighdHx8InVuZGVmaW5lZCI9PXR5cGVvZiBQYXRoMkQpcmV0dXJuO2NvbnN0IHI9dFsyXS10WzBdLG49dFszXS10WzFdLHM9bmV3IFBhdGgyRDtzLnJlY3QodFswXSx0WzFdLHIsbik7ZS5jbGlwKHMpfXMuUmFkaWFsQXhpYWw9e2Zyb21JUjpmdW5jdGlvbiBSYWRpYWxBeGlhbF9mcm9tSVIoZSl7dmFyIHQ9ZVsxXSxyPWVbMl0sbj1lWzNdLHM9ZVs0XSxhPWVbNV0saT1lWzZdLG89ZVs3XTtyZXR1cm57dHlwZToiUGF0dGVybiIsZ2V0UGF0dGVybjpmdW5jdGlvbiBSYWRpYWxBeGlhbF9nZXRQYXR0ZXJuKGUpe2FwcGx5Qm91bmRpbmdCb3goZSxyKTt2YXIgbDsiYXhpYWwiPT09dD9sPWUuY3JlYXRlTGluZWFyR3JhZGllbnQoc1swXSxzWzFdLGFbMF0sYVsxXSk6InJhZGlhbCI9PT10JiYobD1lLmNyZWF0ZVJhZGlhbEdyYWRpZW50KHNbMF0sc1sxXSxpLGFbMF0sYVsxXSxvKSk7Zm9yKHZhciBjPTAsaD1uLmxlbmd0aDtjPGg7KytjKXt2YXIgZD1uW2NdO2wuYWRkQ29sb3JTdG9wKGRbMF0sZFsxXSl9cmV0dXJuIGx9fX19O3ZhciBhPWZ1bmN0aW9uIGNyZWF0ZU1lc2hDYW52YXNDbG9zdXJlKCl7ZnVuY3Rpb24gZHJhd1RyaWFuZ2xlKGUsdCxyLG4scyxhLGksbyl7dmFyIGwsYz10LmNvb3JkcyxoPXQuY29sb3JzLGQ9ZS5kYXRhLHU9NCplLndpZHRoO2lmKGNbcisxXT5jW24rMV0pe2w9cjtyPW47bj1sO2w9YTthPWk7aT1sfWlmKGNbbisxXT5jW3MrMV0pe2w9bjtuPXM7cz1sO2w9aTtpPW87bz1sfWlmKGNbcisxXT5jW24rMV0pe2w9cjtyPW47bj1sO2w9YTthPWk7aT1sfXZhciBwPShjW3JdK3Qub2Zmc2V0WCkqdC5zY2FsZVgsZj0oY1tyKzFdK3Qub2Zmc2V0WSkqdC5zY2FsZVksZz0oY1tuXSt0Lm9mZnNldFgpKnQuc2NhbGVYLG09KGNbbisxXSt0Lm9mZnNldFkpKnQuc2NhbGVZLF89KGNbc10rdC5vZmZzZXRYKSp0LnNjYWxlWCxBPShjW3MrMV0rdC5vZmZzZXRZKSp0LnNjYWxlWTtpZighKGY+PUEpKWZvcih2YXIgYix5LHYsQyxTLHgsUCxrLFI9aFthXSx3PWhbYSsxXSxUPWhbYSsyXSxFPWhbaV0sRj1oW2krMV0sTD1oW2krMl0sTT1oW29dLEQ9aFtvKzFdLE89aFtvKzJdLEk9TWF0aC5yb3VuZChmKSxOPU1hdGgucm91bmQoQSksaj1JO2o8PU47aisrKXtpZihqPG0pe2xldCBlO2U9ajxmPzA6Zj09PW0/MTooZi1qKS8oZi1tKTtiPXAtKHAtZykqZTt5PVItKFItRSkqZTt2PXctKHctRikqZTtDPVQtKFQtTCkqZX1lbHNle2xldCBlO2U9aj5BPzE6bT09PUE/MDoobS1qKS8obS1BKTtiPWctKGctXykqZTt5PUUtKEUtTSkqZTt2PUYtKEYtRCkqZTtDPUwtKEwtTykqZX1sZXQgZTtlPWo8Zj8wOmo+QT8xOihmLWopLyhmLUEpO1M9cC0ocC1fKSplO3g9Ui0oUi1NKSplO1A9dy0ody1EKSplO2s9VC0oVC1PKSplO2Zvcih2YXIgRz1NYXRoLnJvdW5kKE1hdGgubWluKGIsUykpLFU9TWF0aC5yb3VuZChNYXRoLm1heChiLFMpKSxXPXUqais0KkcscT1HO3E8PVU7cSsrKXtlPShiLXEpLyhiLVMpO2U8MD9lPTA6ZT4xJiYoZT0xKTtkW1crK109eS0oeS14KSplfDA7ZFtXKytdPXYtKHYtUCkqZXwwO2RbVysrXT1DLShDLWspKmV8MDtkW1crK109MjU1fX19ZnVuY3Rpb24gZHJhd0ZpZ3VyZShlLHQscil7dmFyIG4scyxhPXQuY29vcmRzLGk9dC5jb2xvcnM7c3dpdGNoKHQudHlwZSl7Y2FzZSJsYXR0aWNlIjp2YXIgbz10LnZlcnRpY2VzUGVyUm93LGw9TWF0aC5mbG9vcihhLmxlbmd0aC9vKS0xLGM9by0xO2ZvcihuPTA7bjxsO24rKylmb3IodmFyIGg9bipvLGQ9MDtkPGM7ZCsrLGgrKyl7ZHJhd1RyaWFuZ2xlKGUscixhW2hdLGFbaCsxXSxhW2grb10saVtoXSxpW2grMV0saVtoK29dKTtkcmF3VHJpYW5nbGUoZSxyLGFbaCtvKzFdLGFbaCsxXSxhW2grb10saVtoK28rMV0saVtoKzFdLGlbaCtvXSl9YnJlYWs7Y2FzZSJ0cmlhbmdsZXMiOmZvcihuPTAscz1hLmxlbmd0aDtuPHM7bis9MylkcmF3VHJpYW5nbGUoZSxyLGFbbl0sYVtuKzFdLGFbbisyXSxpW25dLGlbbisxXSxpW24rMl0pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGZpZ3VyZSIpfX1yZXR1cm4gZnVuY3Rpb24gY3JlYXRlTWVzaENhbnZhcyhlLHQscixuLHMsYSxpLG8pe3ZhciBsLGMsaCxkLHU9TWF0aC5mbG9vcihlWzBdKSxwPU1hdGguZmxvb3IoZVsxXSksZj1NYXRoLmNlaWwoZVsyXSktdSxnPU1hdGguY2VpbChlWzNdKS1wLG09TWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGYqdFswXSoxLjEpKSwzZTMpLF89TWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGcqdFsxXSoxLjEpKSwzZTMpLEE9Zi9tLGI9Zy9fLHk9e2Nvb3JkczpyLGNvbG9yczpuLG9mZnNldFg6LXUsb2Zmc2V0WTotcCxzY2FsZVg6MS9BLHNjYWxlWToxL2J9LHY9bSs0LEM9Xys0O2lmKG8uaXNFbmFibGVkKXtsPW8uZHJhd0ZpZ3VyZXMoe3dpZHRoOm0saGVpZ2h0Ol8sYmFja2dyb3VuZENvbG9yOmEsZmlndXJlczpzLGNvbnRleHQ6eX0pOyhjPWkuZ2V0Q2FudmFzKCJtZXNoIix2LEMsITEpKS5jb250ZXh0LmRyYXdJbWFnZShsLDIsMik7bD1jLmNhbnZhc31lbHNle3ZhciBTPShjPWkuZ2V0Q2FudmFzKCJtZXNoIix2LEMsITEpKS5jb250ZXh0LHg9Uy5jcmVhdGVJbWFnZURhdGEobSxfKTtpZihhKXt2YXIgUD14LmRhdGE7Zm9yKGg9MCxkPVAubGVuZ3RoO2g8ZDtoKz00KXtQW2hdPWFbMF07UFtoKzFdPWFbMV07UFtoKzJdPWFbMl07UFtoKzNdPTI1NX19Zm9yKGg9MDtoPHMubGVuZ3RoO2grKylkcmF3RmlndXJlKHgsc1toXSx5KTtTLnB1dEltYWdlRGF0YSh4LDIsMik7bD1jLmNhbnZhc31yZXR1cm57Y2FudmFzOmwsb2Zmc2V0WDp1LTIqQSxvZmZzZXRZOnAtMipiLHNjYWxlWDpBLHNjYWxlWTpifX19KCk7cy5NZXNoPXtmcm9tSVI6ZnVuY3Rpb24gTWVzaF9mcm9tSVIoZSl7dmFyIHQ9ZVsyXSxyPWVbM10scz1lWzRdLGk9ZVs1XSxvPWVbNl0sbD1lWzddLGM9ZVs4XTtyZXR1cm57dHlwZToiUGF0dGVybiIsZ2V0UGF0dGVybjpmdW5jdGlvbiBNZXNoX2dldFBhdHRlcm4oZSxoLGQpe2FwcGx5Qm91bmRpbmdCb3goZSxsKTt2YXIgdTtpZihkKXU9bi5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUubW96Q3VycmVudFRyYW5zZm9ybSk7ZWxzZXt1PW4uVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShoLmJhc2VUcmFuc2Zvcm0pO2lmKG8pe3ZhciBwPW4uVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShvKTt1PVt1WzBdKnBbMF0sdVsxXSpwWzFdXX19dmFyIGY9YShpLHUsdCxyLHMsZD9udWxsOmMsaC5jYWNoZWRDYW52YXNlcyxoLndlYkdMQ29udGV4dCk7aWYoIWQpe2Uuc2V0VHJhbnNmb3JtLmFwcGx5KGUsaC5iYXNlVHJhbnNmb3JtKTtvJiZlLnRyYW5zZm9ybS5hcHBseShlLG8pfWUudHJhbnNsYXRlKGYub2Zmc2V0WCxmLm9mZnNldFkpO2Uuc2NhbGUoZi5zY2FsZVgsZi5zY2FsZVkpO3JldHVybiBlLmNyZWF0ZVBhdHRlcm4oZi5jYW52YXMsIm5vLXJlcGVhdCIpfX19fTtzLkR1bW15PXtmcm9tSVI6ZnVuY3Rpb24gRHVtbXlfZnJvbUlSKCl7cmV0dXJue3R5cGU6IlBhdHRlcm4iLGdldFBhdHRlcm46ZnVuY3Rpb24gRHVtbXlfZnJvbUlSX2dldFBhdHRlcm4oKXtyZXR1cm4iaG90cGluayJ9fX19O3ZhciBpPWZ1bmN0aW9uIFRpbGluZ1BhdHRlcm5DbG9zdXJlKCl7dmFyIGU9MSx0PTI7ZnVuY3Rpb24gVGlsaW5nUGF0dGVybihlLHQscixuLHMpe3RoaXMub3BlcmF0b3JMaXN0PWVbMl07dGhpcy5tYXRyaXg9ZVszXXx8WzEsMCwwLDEsMCwwXTt0aGlzLmJib3g9ZVs0XTt0aGlzLnhzdGVwPWVbNV07dGhpcy55c3RlcD1lWzZdO3RoaXMucGFpbnRUeXBlPWVbN107dGhpcy50aWxpbmdUeXBlPWVbOF07dGhpcy5jb2xvcj10O3RoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5PW47dGhpcy5iYXNlVHJhbnNmb3JtPXM7dGhpcy50eXBlPSJQYXR0ZXJuIjt0aGlzLmN0eD1yfVRpbGluZ1BhdHRlcm4ucHJvdG90eXBlPXtjcmVhdGVQYXR0ZXJuQ2FudmFzOmZ1bmN0aW9uIFRpbGluUGF0dGVybl9jcmVhdGVQYXR0ZXJuQ2FudmFzKGUpe3ZhciB0PXRoaXMub3BlcmF0b3JMaXN0LHI9dGhpcy5iYm94LHM9dGhpcy54c3RlcCxhPXRoaXMueXN0ZXAsaT10aGlzLnBhaW50VHlwZSxvPXRoaXMudGlsaW5nVHlwZSxsPXRoaXMuY29sb3IsYz10aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTsoMCxuLmluZm8pKCJUaWxpbmdUeXBlOiAiK28pO3ZhciBoPXJbMF0sZD1yWzFdLHU9clsyXSxwPXJbM10sZj1uLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5tYXRyaXgpLGc9bi5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMuYmFzZVRyYW5zZm9ybSksbT1bZlswXSpnWzBdLGZbMV0qZ1sxXV0sXz10aGlzLmdldFNpemVBbmRTY2FsZShzLHRoaXMuY3R4LmNhbnZhcy53aWR0aCxtWzBdKSxBPXRoaXMuZ2V0U2l6ZUFuZFNjYWxlKGEsdGhpcy5jdHguY2FudmFzLmhlaWdodCxtWzFdKSxiPWUuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJwYXR0ZXJuIixfLnNpemUsQS5zaXplLCEwKSx5PWIuY29udGV4dCx2PWMuY3JlYXRlQ2FudmFzR3JhcGhpY3MoeSk7di5ncm91cExldmVsPWUuZ3JvdXBMZXZlbDt0aGlzLnNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dCh2LGksbCk7di50cmFuc2Zvcm0oXy5zY2FsZSwwLDAsQS5zY2FsZSwwLDApO3YudHJhbnNmb3JtKDEsMCwwLDEsLWgsLWQpO3RoaXMuY2xpcEJib3godixyLGgsZCx1LHApO3YuZXhlY3V0ZU9wZXJhdG9yTGlzdCh0KTt0aGlzLmN0eC50cmFuc2Zvcm0oMSwwLDAsMSxoLGQpO3RoaXMuY3R4LnNjYWxlKDEvXy5zY2FsZSwxL0Euc2NhbGUpO3JldHVybiBiLmNhbnZhc30sZ2V0U2l6ZUFuZFNjYWxlOmZ1bmN0aW9uIFRpbGluZ1BhdHRlcm5fZ2V0U2l6ZUFuZFNjYWxlKGUsdCxyKXtlPU1hdGguYWJzKGUpO3ZhciBuPU1hdGgubWF4KDNlMyx0KSxzPU1hdGguY2VpbChlKnIpO3M+PW4/cz1uOnI9cy9lO3JldHVybntzY2FsZTpyLHNpemU6c319LGNsaXBCYm94OmZ1bmN0aW9uIGNsaXBCYm94KGUsdCxyLG4scyxhKXtpZihBcnJheS5pc0FycmF5KHQpJiY0PT09dC5sZW5ndGgpe3ZhciBpPXMtcixvPWEtbjtlLmN0eC5yZWN0KHIsbixpLG8pO2UuY2xpcCgpO2UuZW5kUGF0aCgpfX0sc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0OmZ1bmN0aW9uIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChyLHMsYSl7Y29uc3QgaT1yLmN0eCxvPXIuY3VycmVudDtzd2l0Y2gocyl7Y2FzZSBlOnZhciBsPXRoaXMuY3R4O2kuZmlsbFN0eWxlPWwuZmlsbFN0eWxlO2kuc3Ryb2tlU3R5bGU9bC5zdHJva2VTdHlsZTtvLmZpbGxDb2xvcj1sLmZpbGxTdHlsZTtvLnN0cm9rZUNvbG9yPWwuc3Ryb2tlU3R5bGU7YnJlYWs7Y2FzZSB0OnZhciBjPW4uVXRpbC5tYWtlQ3NzUmdiKGFbMF0sYVsxXSxhWzJdKTtpLmZpbGxTdHlsZT1jO2kuc3Ryb2tlU3R5bGU9YztvLmZpbGxDb2xvcj1jO28uc3Ryb2tlQ29sb3I9YzticmVhaztkZWZhdWx0OnRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbnN1cHBvcnRlZCBwYWludCB0eXBlOiAiK3MpfX0sZ2V0UGF0dGVybjpmdW5jdGlvbiBUaWxpbmdQYXR0ZXJuX2dldFBhdHRlcm4oZSx0KXsoZT10aGlzLmN0eCkuc2V0VHJhbnNmb3JtLmFwcGx5KGUsdGhpcy5iYXNlVHJhbnNmb3JtKTtlLnRyYW5zZm9ybS5hcHBseShlLHRoaXMubWF0cml4KTt2YXIgcj10aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXModCk7cmV0dXJuIGUuY3JlYXRlUGF0dGVybihyLCJyZXBlYXQiKX19O3JldHVybiBUaWxpbmdQYXR0ZXJufSgpO3QuVGlsaW5nUGF0dGVybj1pfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lkdsb2JhbFdvcmtlck9wdGlvbnM9dm9pZCAwO2NvbnN0IG49T2JqZWN0LmNyZWF0ZShudWxsKTt0Lkdsb2JhbFdvcmtlck9wdGlvbnM9bjtuLndvcmtlclBvcnQ9dm9pZCAwPT09bi53b3JrZXJQb3J0P251bGw6bi53b3JrZXJQb3J0O24ud29ya2VyU3JjPXZvaWQgMD09PW4ud29ya2VyU3JjPyIiOm4ud29ya2VyU3JjfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lk1lc3NhZ2VIYW5kbGVyPXZvaWQgMDt2YXIgbj1yKDIpO2NvbnN0IHM9MSxhPTIsaT0xLG89MixsPTMsYz00LGg9NSxkPTYsdT03LHA9ODtmdW5jdGlvbiB3cmFwUmVhc29uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuIGU7c3dpdGNoKGUubmFtZSl7Y2FzZSJBYm9ydEV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBuLkFib3J0RXhjZXB0aW9uKGUubWVzc2FnZSk7Y2FzZSJNaXNzaW5nUERGRXhjZXB0aW9uIjpyZXR1cm4gbmV3IG4uTWlzc2luZ1BERkV4Y2VwdGlvbihlLm1lc3NhZ2UpO2Nhc2UiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjpyZXR1cm4gbmV3IG4uVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGUubWVzc2FnZSxlLnN0YXR1cyk7Y2FzZSJVbmtub3duRXJyb3JFeGNlcHRpb24iOnJldHVybiBuZXcgbi5Vbmtub3duRXJyb3JFeGNlcHRpb24oZS5tZXNzYWdlLGUuZGV0YWlscyk7ZGVmYXVsdDpyZXR1cm4gbmV3IG4uVW5rbm93bkVycm9yRXhjZXB0aW9uKGUubWVzc2FnZSxlLnRvU3RyaW5nKCkpfX10Lk1lc3NhZ2VIYW5kbGVyPWNsYXNzIE1lc3NhZ2VIYW5kbGVye2NvbnN0cnVjdG9yKGUsdCxyKXt0aGlzLnNvdXJjZU5hbWU9ZTt0aGlzLnRhcmdldE5hbWU9dDt0aGlzLmNvbU9iaj1yO3RoaXMuY2FsbGJhY2tJZD0xO3RoaXMuc3RyZWFtSWQ9MTt0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzPSEwO3RoaXMuc3RyZWFtU2lua3M9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuYWN0aW9uSGFuZGxlcj1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuX29uQ29tT2JqT25NZXNzYWdlPWU9Pntjb25zdCB0PWUuZGF0YTtpZih0LnRhcmdldE5hbWUhPT10aGlzLnNvdXJjZU5hbWUpcmV0dXJuO2lmKHQuc3RyZWFtKXt0aGlzLl9wcm9jZXNzU3RyZWFtTWVzc2FnZSh0KTtyZXR1cm59aWYodC5jYWxsYmFjayl7Y29uc3QgZT10LmNhbGxiYWNrSWQscj10aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2VdO2lmKCFyKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgIitlKTtkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tlXTtpZih0LmNhbGxiYWNrPT09cylyLnJlc29sdmUodC5kYXRhKTtlbHNle2lmKHQuY2FsbGJhY2shPT1hKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBjYWxsYmFjayBjYXNlIik7ci5yZWplY3Qod3JhcFJlYXNvbih0LnJlYXNvbikpfXJldHVybn1jb25zdCBuPXRoaXMuYWN0aW9uSGFuZGxlclt0LmFjdGlvbl07aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogIit0LmFjdGlvbik7aWYodC5jYWxsYmFja0lkKXtjb25zdCBlPXRoaXMuc291cmNlTmFtZSxpPXQuc291cmNlTmFtZTtuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7ZShuKHQuZGF0YSkpfSkpLnRoZW4oKGZ1bmN0aW9uKG4pe3IucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6ZSx0YXJnZXROYW1lOmksY2FsbGJhY2s6cyxjYWxsYmFja0lkOnQuY2FsbGJhY2tJZCxkYXRhOm59KX0pLChmdW5jdGlvbihuKXtyLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmUsdGFyZ2V0TmFtZTppLGNhbGxiYWNrOmEsY2FsbGJhY2tJZDp0LmNhbGxiYWNrSWQscmVhc29uOndyYXBSZWFzb24obil9KX0pKX1lbHNlIHQuc3RyZWFtSWQ/dGhpcy5fY3JlYXRlU3RyZWFtU2luayh0KTpuKHQuZGF0YSl9O3IuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpfW9uKGUsdCl7Y29uc3Qgcj10aGlzLmFjdGlvbkhhbmRsZXI7aWYocltlXSl0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIiR7ZX0iYCk7cltlXT10fXNlbmQoZSx0LHIpe3RoaXMuX3Bvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnRoaXMuc291cmNlTmFtZSx0YXJnZXROYW1lOnRoaXMudGFyZ2V0TmFtZSxhY3Rpb246ZSxkYXRhOnR9LHIpfXNlbmRXaXRoUHJvbWlzZShlLHQscil7Y29uc3Qgcz10aGlzLmNhbGxiYWNrSWQrKyxhPSgwLG4uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tzXT1hO3RyeXt0aGlzLl9wb3N0TWVzc2FnZSh7c291cmNlTmFtZTp0aGlzLnNvdXJjZU5hbWUsdGFyZ2V0TmFtZTp0aGlzLnRhcmdldE5hbWUsYWN0aW9uOmUsY2FsbGJhY2tJZDpzLGRhdGE6dH0scil9Y2F0Y2goZSl7YS5yZWplY3QoZSl9cmV0dXJuIGEucHJvbWlzZX1zZW5kV2l0aFN0cmVhbShlLHQscixzKXtjb25zdCBhPXRoaXMuc3RyZWFtSWQrKyxvPXRoaXMuc291cmNlTmFtZSxsPXRoaXMudGFyZ2V0TmFtZSxjPXRoaXMuY29tT2JqO3JldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0OnI9Pntjb25zdCBpPSgwLG4uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5zdHJlYW1Db250cm9sbGVyc1thXT17Y29udHJvbGxlcjpyLHN0YXJ0Q2FsbDppLHB1bGxDYWxsOm51bGwsY2FuY2VsQ2FsbDpudWxsLGlzQ2xvc2VkOiExfTt0aGlzLl9wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpvLHRhcmdldE5hbWU6bCxhY3Rpb246ZSxzdHJlYW1JZDphLGRhdGE6dCxkZXNpcmVkU2l6ZTpyLmRlc2lyZWRTaXplfSxzKTtyZXR1cm4gaS5wcm9taXNlfSxwdWxsOmU9Pntjb25zdCB0PSgwLG4uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5zdHJlYW1Db250cm9sbGVyc1thXS5wdWxsQ2FsbD10O2MucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6byx0YXJnZXROYW1lOmwsc3RyZWFtOmQsc3RyZWFtSWQ6YSxkZXNpcmVkU2l6ZTplLmRlc2lyZWRTaXplfSk7cmV0dXJuIHQucHJvbWlzZX0sY2FuY2VsOmU9PnsoMCxuLmFzc2VydCkoZSBpbnN0YW5jZW9mIEVycm9yLCJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7Y29uc3QgdD0oMCxuLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbYV0uY2FuY2VsQ2FsbD10O3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbYV0uaXNDbG9zZWQ9ITA7Yy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpvLHRhcmdldE5hbWU6bCxzdHJlYW06aSxzdHJlYW1JZDphLHJlYXNvbjp3cmFwUmVhc29uKGUpfSk7cmV0dXJuIHQucHJvbWlzZX19LHIpfV9jcmVhdGVTdHJlYW1TaW5rKGUpe2NvbnN0IHQ9dGhpcyxyPXRoaXMuYWN0aW9uSGFuZGxlcltlLmFjdGlvbl0scz1lLnN0cmVhbUlkLGE9dGhpcy5zb3VyY2VOYW1lLGk9ZS5zb3VyY2VOYW1lLG89dGhpcy5jb21PYmosZD17ZW5xdWV1ZShlLHI9MSxvKXtpZih0aGlzLmlzQ2FuY2VsbGVkKXJldHVybjtjb25zdCBsPXRoaXMuZGVzaXJlZFNpemU7dGhpcy5kZXNpcmVkU2l6ZS09cjtpZihsPjAmJnRoaXMuZGVzaXJlZFNpemU8PTApe3RoaXMuc2lua0NhcGFiaWxpdHk9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLnJlYWR5PXRoaXMuc2lua0NhcGFiaWxpdHkucHJvbWlzZX10Ll9wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6aSxzdHJlYW06YyxzdHJlYW1JZDpzLGNodW5rOmV9LG8pfSxjbG9zZSgpe2lmKCF0aGlzLmlzQ2FuY2VsbGVkKXt0aGlzLmlzQ2FuY2VsbGVkPSEwO28ucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6YSx0YXJnZXROYW1lOmksc3RyZWFtOmwsc3RyZWFtSWQ6c30pO2RlbGV0ZSB0LnN0cmVhbVNpbmtzW3NdfX0sZXJyb3IoZSl7KDAsbi5hc3NlcnQpKGUgaW5zdGFuY2VvZiBFcnJvciwiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7aWYoIXRoaXMuaXNDYW5jZWxsZWQpe3RoaXMuaXNDYW5jZWxsZWQ9ITA7by5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6aSxzdHJlYW06aCxzdHJlYW1JZDpzLHJlYXNvbjp3cmFwUmVhc29uKGUpfSl9fSxzaW5rQ2FwYWJpbGl0eTooMCxuLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpLG9uUHVsbDpudWxsLG9uQ2FuY2VsOm51bGwsaXNDYW5jZWxsZWQ6ITEsZGVzaXJlZFNpemU6ZS5kZXNpcmVkU2l6ZSxyZWFkeTpudWxsfTtkLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtkLnJlYWR5PWQuc2lua0NhcGFiaWxpdHkucHJvbWlzZTt0aGlzLnN0cmVhbVNpbmtzW3NdPWQ7bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3QocihlLmRhdGEsZCkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7by5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6aSxzdHJlYW06cCxzdHJlYW1JZDpzLHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbihlKXtvLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmEsdGFyZ2V0TmFtZTppLHN0cmVhbTpwLHN0cmVhbUlkOnMscmVhc29uOndyYXBSZWFzb24oZSl9KX0pKX1fcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZSl7Y29uc3QgdD1lLnN0cmVhbUlkLHI9dGhpcy5zb3VyY2VOYW1lLHM9ZS5zb3VyY2VOYW1lLGE9dGhpcy5jb21PYmo7c3dpdGNoKGUuc3RyZWFtKXtjYXNlIHA6ZS5zdWNjZXNzP3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0uc3RhcnRDYWxsLnJlc29sdmUoKTp0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLnN0YXJ0Q2FsbC5yZWplY3Qod3JhcFJlYXNvbihlLnJlYXNvbikpO2JyZWFrO2Nhc2UgdTplLnN1Y2Nlc3M/dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5wdWxsQ2FsbC5yZXNvbHZlKCk6dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihlLnJlYXNvbikpO2JyZWFrO2Nhc2UgZDppZighdGhpcy5zdHJlYW1TaW5rc1t0XSl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6cyxzdHJlYW06dSxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KTticmVha310aGlzLnN0cmVhbVNpbmtzW3RdLmRlc2lyZWRTaXplPD0wJiZlLmRlc2lyZWRTaXplPjAmJnRoaXMuc3RyZWFtU2lua3NbdF0uc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO3RoaXMuc3RyZWFtU2lua3NbdF0uZGVzaXJlZFNpemU9ZS5kZXNpcmVkU2l6ZTtjb25zdHtvblB1bGw6Zn09dGhpcy5zdHJlYW1TaW5rc1tlLnN0cmVhbUlkXTtuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7ZShmJiZmKCkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6cyxzdHJlYW06dSxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpzLHN0cmVhbTp1LHN0cmVhbUlkOnQscmVhc29uOndyYXBSZWFzb24oZSl9KX0pKTticmVhaztjYXNlIGM6KDAsbi5hc3NlcnQpKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0sImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTtpZih0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLmlzQ2xvc2VkKWJyZWFrO3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0uY29udHJvbGxlci5lbnF1ZXVlKGUuY2h1bmspO2JyZWFrO2Nhc2UgbDooMCxuLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XSwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTtpZih0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLmlzQ2xvc2VkKWJyZWFrO3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0uaXNDbG9zZWQ9ITA7dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5jb250cm9sbGVyLmNsb3NlKCk7dGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcih0KTticmVhaztjYXNlIGg6KDAsbi5hc3NlcnQpKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0sImVycm9yIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5jb250cm9sbGVyLmVycm9yKHdyYXBSZWFzb24oZS5yZWFzb24pKTt0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHQpO2JyZWFrO2Nhc2UgbzplLnN1Y2Nlc3M/dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5jYW5jZWxDYWxsLnJlc29sdmUoKTp0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZS5yZWFzb24pKTt0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHQpO2JyZWFrO2Nhc2UgaTppZighdGhpcy5zdHJlYW1TaW5rc1t0XSlicmVhaztjb25zdHtvbkNhbmNlbDpnfT10aGlzLnN0cmVhbVNpbmtzW2Uuc3RyZWFtSWRdO25ldyBQcm9taXNlKChmdW5jdGlvbih0KXt0KGcmJmcod3JhcFJlYXNvbihlLnJlYXNvbikpKX0pKS50aGVuKChmdW5jdGlvbigpe2EucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6cix0YXJnZXROYW1lOnMsc3RyZWFtOm8sc3RyZWFtSWQ6dCxzdWNjZXNzOiEwfSl9KSwoZnVuY3Rpb24oZSl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6cyxzdHJlYW06byxzdHJlYW1JZDp0LHJlYXNvbjp3cmFwUmVhc29uKGUpfSl9KSk7dGhpcy5zdHJlYW1TaW5rc1t0XS5zaW5rQ2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihlLnJlYXNvbikpO3RoaXMuc3RyZWFtU2lua3NbdF0uaXNDYW5jZWxsZWQ9ITA7ZGVsZXRlIHRoaXMuc3RyZWFtU2lua3NbdF07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2UiKX19YXN5bmMgX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoZSl7YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2VdLnN0YXJ0Q2FsbCx0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2VdLnB1bGxDYWxsLHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbZV0uY2FuY2VsQ2FsbF0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5wcm9taXNlfSkpKTtkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tlXX1fcG9zdE1lc3NhZ2UoZSx0KXt0JiZ0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzP3RoaXMuY29tT2JqLnBvc3RNZXNzYWdlKGUsdCk6dGhpcy5jb21PYmoucG9zdE1lc3NhZ2UoZSl9ZGVzdHJveSgpe3RoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKX19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lk1ldGFkYXRhPXZvaWQgMDt2YXIgbj1yKDIpLHM9cigxNSk7dC5NZXRhZGF0YT1jbGFzcyBNZXRhZGF0YXtjb25zdHJ1Y3RvcihlKXsoMCxuLmFzc2VydCkoInN0cmluZyI9PXR5cGVvZiBlLCJNZXRhZGF0YTogaW5wdXQgaXMgbm90IGEgc3RyaW5nIik7ZT10aGlzLl9yZXBhaXIoZSk7Y29uc3QgdD0obmV3IHMuU2ltcGxlWE1MUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSk7dGhpcy5fbWV0YWRhdGFNYXA9bmV3IE1hcDt0JiZ0aGlzLl9wYXJzZSh0KX1fcmVwYWlyKGUpe3JldHVybiBlLnJlcGxhY2UoL15bXjxdKy8sIiIpLnJlcGxhY2UoLz5cXDM3NlxcMzc3KFtePF0rKS9nLChmdW5jdGlvbihlLHQpe2NvbnN0IHI9dC5yZXBsYWNlKC9cXChbMC0zXSkoWzAtN10pKFswLTddKS9nLChmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg2NCp0KzgqcisxKm4pfSkpLnJlcGxhY2UoLyYoYW1wfGFwb3N8Z3R8bHR8cXVvdCk7L2csKGZ1bmN0aW9uKGUsdCl7c3dpdGNoKHQpe2Nhc2UiYW1wIjpyZXR1cm4iJiI7Y2FzZSJhcG9zIjpyZXR1cm4iJyI7Y2FzZSJndCI6cmV0dXJuIj4iO2Nhc2UibHQiOnJldHVybiI8IjtjYXNlInF1b3QiOnJldHVybiciJ310aHJvdyBuZXcgRXJyb3IoYF9yZXBhaXI6ICR7dH0gaXNuJ3QgZGVmaW5lZC5gKX0pKTtsZXQgbj0iIjtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKz0yKXtjb25zdCB0PTI1NipyLmNoYXJDb2RlQXQoZSkrci5jaGFyQ29kZUF0KGUrMSk7bis9dD49MzImJnQ8MTI3JiY2MCE9PXQmJjYyIT09dCYmMzghPT10P1N0cmluZy5mcm9tQ2hhckNvZGUodCk6IiYjeCIrKDY1NTM2K3QpLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSkrIjsifXJldHVybiI+IitufSkpfV9wYXJzZShlKXtsZXQgdD1lLmRvY3VtZW50RWxlbWVudDtpZigicmRmOnJkZiIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe3Q9dC5maXJzdENoaWxkO2Zvcig7dCYmInJkZjpyZGYiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyl0PXQubmV4dFNpYmxpbmd9Y29uc3Qgcj10P3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTpudWxsO2lmKCF0fHwicmRmOnJkZiIhPT1yfHwhdC5oYXNDaGlsZE5vZGVzKCkpcmV0dXJuO2NvbnN0IG49dC5jaGlsZE5vZGVzO2ZvcihsZXQgZT0wLHQ9bi5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1uW2VdO2lmKCJyZGY6ZGVzY3JpcHRpb24iPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWZvcihsZXQgZT0wLHI9dC5jaGlsZE5vZGVzLmxlbmd0aDtlPHI7ZSsrKWlmKCIjdGV4dCIhPT10LmNoaWxkTm9kZXNbZV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7Y29uc3Qgcj10LmNoaWxkTm9kZXNbZV0sbj1yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7dGhpcy5fbWV0YWRhdGFNYXAuc2V0KG4sci50ZXh0Q29udGVudC50cmltKCkpfX19Z2V0KGUpe3JldHVybiB0aGlzLl9tZXRhZGF0YU1hcC5oYXMoZSk/dGhpcy5fbWV0YWRhdGFNYXAuZ2V0KGUpOm51bGx9Z2V0QWxsKCl7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLl9tZXRhZGF0YU1hcCl9aGFzKGUpe3JldHVybiB0aGlzLl9tZXRhZGF0YU1hcC5oYXMoZSl9fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5TaW1wbGVYTUxQYXJzZXI9dm9pZCAwO2NvbnN0IG49MCxzPS0yLGE9LTMsaT0tNCxvPS01LGw9LTYsYz0tOTtmdW5jdGlvbiBpc1doaXRlc3BhY2UoZSx0KXtjb25zdCByPWVbdF07cmV0dXJuIiAiPT09cnx8IlxuIj09PXJ8fCJcciI9PT1yfHwiXHQiPT09cn1jbGFzcyBTaW1wbGVET01Ob2Rle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5ub2RlTmFtZT1lO3RoaXMubm9kZVZhbHVlPXQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBhcmVudE5vZGUiLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSl9Z2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzJiZ0aGlzLmNoaWxkTm9kZXNbMF19Z2V0IG5leHRTaWJsaW5nKCl7Y29uc3QgZT10aGlzLnBhcmVudE5vZGUuY2hpbGROb2RlcztpZighZSlyZXR1cm47Y29uc3QgdD1lLmluZGV4T2YodGhpcyk7cmV0dXJuLTEhPT10P2VbdCsxXTp2b2lkIDB9Z2V0IHRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlcz90aGlzLmNoaWxkTm9kZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50ZXh0Q29udGVudH0pKS5qb2luKCIiKTp0aGlzLm5vZGVWYWx1ZXx8IiJ9aGFzQ2hpbGROb2Rlcygpe3JldHVybiB0aGlzLmNoaWxkTm9kZXMmJnRoaXMuY2hpbGROb2Rlcy5sZW5ndGg+MH19dC5TaW1wbGVYTUxQYXJzZXI9Y2xhc3MgU2ltcGxlWE1MUGFyc2VyIGV4dGVuZHMgY2xhc3MgWE1MUGFyc2VyQmFzZXtfcmVzb2x2ZUVudGl0aWVzKGUpe3JldHVybiBlLnJlcGxhY2UoLyYoW147XSspOy9nLChlLHQpPT57aWYoIiN4Ij09PXQuc3Vic3RyaW5nKDAsMikpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodC5zdWJzdHJpbmcoMiksMTYpKTtpZigiIyI9PT10LnN1YnN0cmluZygwLDEpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHQuc3Vic3RyaW5nKDEpLDEwKSk7c3dpdGNoKHQpe2Nhc2UibHQiOnJldHVybiI8IjtjYXNlImd0IjpyZXR1cm4iPiI7Y2FzZSJhbXAiOnJldHVybiImIjtjYXNlInF1b3QiOnJldHVybiciJ31yZXR1cm4gdGhpcy5vblJlc29sdmVFbnRpdHkodCl9KX1fcGFyc2VDb250ZW50KGUsdCl7Y29uc3Qgcj1bXTtsZXQgbj10O2Z1bmN0aW9uIHNraXBXcygpe2Zvcig7bjxlLmxlbmd0aCYmaXNXaGl0ZXNwYWNlKGUsbik7KSsrbn1mb3IoO248ZS5sZW5ndGgmJiFpc1doaXRlc3BhY2UoZSxuKSYmIj4iIT09ZVtuXSYmIi8iIT09ZVtuXTspKytuO2NvbnN0IHM9ZS5zdWJzdHJpbmcodCxuKTtza2lwV3MoKTtmb3IoO248ZS5sZW5ndGgmJiI+IiE9PWVbbl0mJiIvIiE9PWVbbl0mJiI/IiE9PWVbbl07KXtza2lwV3MoKTtsZXQgdD0iIixzPSIiO2Zvcig7bjxlLmxlbmd0aCYmIWlzV2hpdGVzcGFjZShlLG4pJiYiPSIhPT1lW25dOyl7dCs9ZVtuXTsrK259c2tpcFdzKCk7aWYoIj0iIT09ZVtuXSlyZXR1cm4gbnVsbDsrK247c2tpcFdzKCk7Y29uc3QgYT1lW25dO2lmKCciJyE9PWEmJiInIiE9PWEpcmV0dXJuIG51bGw7Y29uc3QgaT1lLmluZGV4T2YoYSwrK24pO2lmKGk8MClyZXR1cm4gbnVsbDtzPWUuc3Vic3RyaW5nKG4saSk7ci5wdXNoKHtuYW1lOnQsdmFsdWU6dGhpcy5fcmVzb2x2ZUVudGl0aWVzKHMpfSk7bj1pKzE7c2tpcFdzKCl9cmV0dXJue25hbWU6cyxhdHRyaWJ1dGVzOnIscGFyc2VkOm4tdH19X3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGUsdCl7bGV0IHI9dDtmb3IoO3I8ZS5sZW5ndGgmJiFpc1doaXRlc3BhY2UoZSxyKSYmIj4iIT09ZVtyXSYmIi8iIT09ZVtyXTspKytyO2NvbnN0IG49ZS5zdWJzdHJpbmcodCxyKTshZnVuY3Rpb24gc2tpcFdzKCl7Zm9yKDtyPGUubGVuZ3RoJiZpc1doaXRlc3BhY2UoZSxyKTspKytyfSgpO2NvbnN0IHM9cjtmb3IoO3I8ZS5sZW5ndGgmJigiPyIhPT1lW3JdfHwiPiIhPT1lW3IrMV0pOykrK3I7cmV0dXJue25hbWU6bix2YWx1ZTplLnN1YnN0cmluZyhzLHIpLHBhcnNlZDpyLXR9fXBhcnNlWG1sKGUpe2xldCB0PTA7Zm9yKDt0PGUubGVuZ3RoOyl7bGV0IHI9dDtpZigiPCI9PT1lW3RdKXsrK3I7bGV0IHQ7c3dpdGNoKGVbcl0pe2Nhc2UiLyI6KytyO3Q9ZS5pbmRleE9mKCI+IixyKTtpZih0PDApe3RoaXMub25FcnJvcihjKTtyZXR1cm59dGhpcy5vbkVuZEVsZW1lbnQoZS5zdWJzdHJpbmcocix0KSk7cj10KzE7YnJlYWs7Y2FzZSI/IjorK3I7Y29uc3Qgbj10aGlzLl9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihlLHIpO2lmKCI/PiIhPT1lLnN1YnN0cmluZyhyK24ucGFyc2VkLHIrbi5wYXJzZWQrMikpe3RoaXMub25FcnJvcihhKTtyZXR1cm59dGhpcy5vblBpKG4ubmFtZSxuLnZhbHVlKTtyKz1uLnBhcnNlZCsyO2JyZWFrO2Nhc2UiISI6aWYoIi0tIj09PWUuc3Vic3RyaW5nKHIrMSxyKzMpKXt0PWUuaW5kZXhPZigiLS1ceDNlIixyKzMpO2lmKHQ8MCl7dGhpcy5vbkVycm9yKG8pO3JldHVybn10aGlzLm9uQ29tbWVudChlLnN1YnN0cmluZyhyKzMsdCkpO3I9dCszfWVsc2UgaWYoIltDREFUQVsiPT09ZS5zdWJzdHJpbmcocisxLHIrOCkpe3Q9ZS5pbmRleE9mKCJdXT4iLHIrOCk7aWYodDwwKXt0aGlzLm9uRXJyb3Iocyk7cmV0dXJufXRoaXMub25DZGF0YShlLnN1YnN0cmluZyhyKzgsdCkpO3I9dCszfWVsc2V7aWYoIkRPQ1RZUEUiIT09ZS5zdWJzdHJpbmcocisxLHIrOCkpe3RoaXMub25FcnJvcihsKTtyZXR1cm59e2NvbnN0IG49ZS5pbmRleE9mKCJbIixyKzgpO2xldCBzPSExO3Q9ZS5pbmRleE9mKCI+IixyKzgpO2lmKHQ8MCl7dGhpcy5vbkVycm9yKGkpO3JldHVybn1pZihuPjAmJnQ+bil7dD1lLmluZGV4T2YoIl0+IixyKzgpO2lmKHQ8MCl7dGhpcy5vbkVycm9yKGkpO3JldHVybn1zPSEwfWNvbnN0IGE9ZS5zdWJzdHJpbmcocis4LHQrKHM/MTowKSk7dGhpcy5vbkRvY3R5cGUoYSk7cj10KyhzPzI6MSl9fWJyZWFrO2RlZmF1bHQ6Y29uc3QgaD10aGlzLl9wYXJzZUNvbnRlbnQoZSxyKTtpZihudWxsPT09aCl7dGhpcy5vbkVycm9yKGwpO3JldHVybn1sZXQgZD0hMTtpZigiLz4iPT09ZS5zdWJzdHJpbmcocitoLnBhcnNlZCxyK2gucGFyc2VkKzIpKWQ9ITA7ZWxzZSBpZigiPiIhPT1lLnN1YnN0cmluZyhyK2gucGFyc2VkLHIraC5wYXJzZWQrMSkpe3RoaXMub25FcnJvcihjKTtyZXR1cm59dGhpcy5vbkJlZ2luRWxlbWVudChoLm5hbWUsaC5hdHRyaWJ1dGVzLGQpO3IrPWgucGFyc2VkKyhkPzI6MSl9fWVsc2V7Zm9yKDtyPGUubGVuZ3RoJiYiPCIhPT1lW3JdOylyKys7Y29uc3Qgbj1lLnN1YnN0cmluZyh0LHIpO3RoaXMub25UZXh0KHRoaXMuX3Jlc29sdmVFbnRpdGllcyhuKSl9dD1yfX1vblJlc29sdmVFbnRpdHkoZSl7cmV0dXJuYCYke2V9O2B9b25QaShlLHQpe31vbkNvbW1lbnQoZSl7fW9uQ2RhdGEoZSl7fW9uRG9jdHlwZShlKXt9b25UZXh0KGUpe31vbkJlZ2luRWxlbWVudChlLHQscil7fW9uRW5kRWxlbWVudChlKXt9b25FcnJvcihlKXt9fXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fY3VycmVudEZyYWdtZW50PW51bGw7dGhpcy5fc3RhY2s9bnVsbDt0aGlzLl9lcnJvckNvZGU9bn1wYXJzZUZyb21TdHJpbmcoZSl7dGhpcy5fY3VycmVudEZyYWdtZW50PVtdO3RoaXMuX3N0YWNrPVtdO3RoaXMuX2Vycm9yQ29kZT1uO3RoaXMucGFyc2VYbWwoZSk7aWYodGhpcy5fZXJyb3JDb2RlIT09bilyZXR1cm47Y29uc3RbdF09dGhpcy5fY3VycmVudEZyYWdtZW50O3JldHVybiB0P3tkb2N1bWVudEVsZW1lbnQ6dH06dm9pZCAwfW9uUmVzb2x2ZUVudGl0eShlKXtzd2l0Y2goZSl7Y2FzZSJhcG9zIjpyZXR1cm4iJyJ9cmV0dXJuIHN1cGVyLm9uUmVzb2x2ZUVudGl0eShlKX1vblRleHQoZSl7aWYoZnVuY3Rpb24gaXNXaGl0ZXNwYWNlU3RyaW5nKGUpe2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKylpZighaXNXaGl0ZXNwYWNlKGUsdCkpcmV0dXJuITE7cmV0dXJuITB9KGUpKXJldHVybjtjb25zdCB0PW5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsZSk7dGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2godCl9b25DZGF0YShlKXtjb25zdCB0PW5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsZSk7dGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2godCl9b25CZWdpbkVsZW1lbnQoZSx0LHIpe2NvbnN0IG49bmV3IFNpbXBsZURPTU5vZGUoZSk7bi5jaGlsZE5vZGVzPVtdO3RoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG4pO2lmKCFyKXt0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnRGcmFnbWVudCk7dGhpcy5fY3VycmVudEZyYWdtZW50PW4uY2hpbGROb2Rlc319b25FbmRFbGVtZW50KGUpe3RoaXMuX2N1cnJlbnRGcmFnbWVudD10aGlzLl9zdGFjay5wb3AoKXx8W107Y29uc3QgdD10aGlzLl9jdXJyZW50RnJhZ21lbnRbdGhpcy5fY3VycmVudEZyYWdtZW50Lmxlbmd0aC0xXTtpZih0KWZvcihsZXQgZT0wLHI9dC5jaGlsZE5vZGVzLmxlbmd0aDtlPHI7ZSsrKXQuY2hpbGROb2Rlc1tlXS5wYXJlbnROb2RlPXR9b25FcnJvcihlKXt0aGlzLl9lcnJvckNvZGU9ZX19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lk9wdGlvbmFsQ29udGVudENvbmZpZz12b2lkIDA7dmFyIG49cigyKTtjbGFzcyBPcHRpb25hbENvbnRlbnRHcm91cHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMudmlzaWJsZT0hMDt0aGlzLm5hbWU9ZTt0aGlzLmludGVudD10fX10Lk9wdGlvbmFsQ29udGVudENvbmZpZz1jbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWd7Y29uc3RydWN0b3IoZSl7dGhpcy5uYW1lPW51bGw7dGhpcy5jcmVhdG9yPW51bGw7dGhpcy5fb3JkZXI9bnVsbDt0aGlzLl9ncm91cHM9bmV3IE1hcDtpZihudWxsIT09ZSl7dGhpcy5uYW1lPWUubmFtZTt0aGlzLmNyZWF0b3I9ZS5jcmVhdG9yO3RoaXMuX29yZGVyPWUub3JkZXI7Zm9yKGNvbnN0IHQgb2YgZS5ncm91cHMpdGhpcy5fZ3JvdXBzLnNldCh0LmlkLG5ldyBPcHRpb25hbENvbnRlbnRHcm91cCh0Lm5hbWUsdC5pbnRlbnQpKTtpZigiT0ZGIj09PWUuYmFzZVN0YXRlKWZvcihjb25zdCBlIG9mIHRoaXMuX2dyb3VwcyllLnZpc2libGU9ITE7Zm9yKGNvbnN0IHQgb2YgZS5vbil0aGlzLl9ncm91cHMuZ2V0KHQpLnZpc2libGU9ITA7Zm9yKGNvbnN0IHQgb2YgZS5vZmYpdGhpcy5fZ3JvdXBzLmdldCh0KS52aXNpYmxlPSExfX1pc1Zpc2libGUoZSl7aWYoIk9DRyI9PT1lLnR5cGUpe2lmKCF0aGlzLl9ncm91cHMuaGFzKGUuaWQpKXsoMCxuLndhcm4pKCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogIitlLmlkKTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5fZ3JvdXBzLmdldChlLmlkKS52aXNpYmxlfWlmKCJPQ01EIj09PWUudHlwZSl7ZS5leHByZXNzaW9uJiYoMCxuLndhcm4pKCJWaXNpYmlsaXR5IGV4cHJlc3Npb24gbm90IHN1cHBvcnRlZCB5ZXQuIik7aWYoIWUucG9saWN5fHwiQW55T24iPT09ZS5wb2xpY3kpe2Zvcihjb25zdCB0IG9mIGUuaWRzKXtpZighdGhpcy5fZ3JvdXBzLmhhcyh0KSl7KDAsbi53YXJuKSgiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICIrdCk7cmV0dXJuITB9aWYodGhpcy5fZ3JvdXBzLmdldCh0KS52aXNpYmxlKXJldHVybiEwfXJldHVybiExfWlmKCJBbGxPbiI9PT1lLnBvbGljeSl7Zm9yKGNvbnN0IHQgb2YgZS5pZHMpe2lmKCF0aGlzLl9ncm91cHMuaGFzKHQpKXsoMCxuLndhcm4pKCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogIit0KTtyZXR1cm4hMH1pZighdGhpcy5fZ3JvdXBzLmdldCh0KS52aXNpYmxlKXJldHVybiExfXJldHVybiEwfWlmKCJBbnlPZmYiPT09ZS5wb2xpY3kpe2Zvcihjb25zdCB0IG9mIGUuaWRzKXtpZighdGhpcy5fZ3JvdXBzLmhhcyh0KSl7KDAsbi53YXJuKSgiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICIrdCk7cmV0dXJuITB9aWYoIXRoaXMuX2dyb3Vwcy5nZXQodCkudmlzaWJsZSlyZXR1cm4hMH1yZXR1cm4hMX1pZigiQWxsT2ZmIj09PWUucG9saWN5KXtmb3IoY29uc3QgdCBvZiBlLmlkcyl7aWYoIXRoaXMuX2dyb3Vwcy5oYXModCkpeygwLG4ud2FybikoIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAiK3QpO3JldHVybiEwfWlmKHRoaXMuX2dyb3Vwcy5nZXQodCkudmlzaWJsZSlyZXR1cm4hMX1yZXR1cm4hMH0oMCxuLndhcm4pKGBVbmtub3duIG9wdGlvbmFsIGNvbnRlbnQgcG9saWN5ICR7ZS5wb2xpY3l9LmApO3JldHVybiEwfSgwLG4ud2FybikoYFVua25vd24gZ3JvdXAgdHlwZSAke2UudHlwZX0uYCk7cmV0dXJuITB9c2V0VmlzaWJpbGl0eShlLHQ9ITApe3RoaXMuX2dyb3Vwcy5oYXMoZSk/dGhpcy5fZ3JvdXBzLmdldChlKS52aXNpYmxlPSEhdDooMCxuLndhcm4pKCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogIitlKX1nZXRPcmRlcigpe3JldHVybiB0aGlzLl9ncm91cHMuc2l6ZT90aGlzLl9vcmRlcj90aGlzLl9vcmRlci5zbGljZSgpOkFycmF5LmZyb20odGhpcy5fZ3JvdXBzLmtleXMoKSk6bnVsbH1nZXRHcm91cHMoKXtyZXR1cm4gdGhpcy5fZ3JvdXBzLnNpemU/T2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX2dyb3Vwcyk6bnVsbH1nZXRHcm91cChlKXtyZXR1cm4gdGhpcy5fZ3JvdXBzLmdldChlKXx8bnVsbH19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlBERkRhdGFUcmFuc3BvcnRTdHJlYW09dm9pZCAwO3ZhciBuPXIoMik7dC5QREZEYXRhVHJhbnNwb3J0U3RyZWFtPWNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW17Y29uc3RydWN0b3IoZSx0KXsoMCxuLmFzc2VydCkodCwnUERGRGF0YVRyYW5zcG9ydFN0cmVhbSAtIG1pc3NpbmcgcmVxdWlyZWQgInBkZkRhdGFSYW5nZVRyYW5zcG9ydCIgYXJndW1lbnQuJyk7dGhpcy5fcXVldWVkQ2h1bmtzPVtdO3RoaXMuX3Byb2dyZXNzaXZlRG9uZT1lLnByb2dyZXNzaXZlRG9uZXx8ITE7Y29uc3Qgcj1lLmluaXRpYWxEYXRhO2lmKHImJnIubGVuZ3RoPjApe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkocikuYnVmZmVyO3RoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGUpfXRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydD10O3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSFlLmRpc2FibGVTdHJlYW07dGhpcy5faXNSYW5nZVN1cHBvcnRlZD0hZS5kaXNhYmxlUmFuZ2U7dGhpcy5fY29udGVudExlbmd0aD1lLmxlbmd0aDt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1udWxsO3RoaXMuX3JhbmdlUmVhZGVycz1bXTt0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUmFuZ2VMaXN0ZW5lcigoZSx0KT0+e3RoaXMuX29uUmVjZWl2ZURhdGEoe2JlZ2luOmUsY2h1bms6dH0pfSk7dGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzTGlzdGVuZXIoKGUsdCk9Pnt0aGlzLl9vblByb2dyZXNzKHtsb2FkZWQ6ZSx0b3RhbDp0fSl9KTt0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIoZT0+e3RoaXMuX29uUmVjZWl2ZURhdGEoe2NodW5rOmV9KX0pO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcigoKT0+e3RoaXMuX29uUHJvZ3Jlc3NpdmVEb25lKCl9KTt0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQudHJhbnNwb3J0UmVhZHkoKX1fb25SZWNlaXZlRGF0YShlKXtjb25zdCB0PW5ldyBVaW50OEFycmF5KGUuY2h1bmspLmJ1ZmZlcjtpZih2b2lkIDA9PT1lLmJlZ2luKXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyP3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKHQpOnRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKHQpO2Vsc2V7Y29uc3Qgcj10aGlzLl9yYW5nZVJlYWRlcnMuc29tZSgoZnVuY3Rpb24ocil7aWYoci5fYmVnaW4hPT1lLmJlZ2luKXJldHVybiExO3IuX2VucXVldWUodCk7cmV0dXJuITB9KSk7KDAsbi5hc3NlcnQpKHIsIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuIil9fWdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyP3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQ6MH1fb25Qcm9ncmVzcyhlKXtpZih2b2lkIDA9PT1lLnRvdGFsKXtjb25zdCB0PXRoaXMuX3JhbmdlUmVhZGVyc1swXTt0JiZ0Lm9uUHJvZ3Jlc3MmJnQub25Qcm9ncmVzcyh7bG9hZGVkOmUubG9hZGVkfSl9ZWxzZXtjb25zdCB0PXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO3QmJnQub25Qcm9ncmVzcyYmdC5vblByb2dyZXNzKHtsb2FkZWQ6ZS5sb2FkZWQsdG90YWw6ZS50b3RhbH0pfX1fb25Qcm9ncmVzc2l2ZURvbmUoKXt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciYmdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIucHJvZ3Jlc3NpdmVEb25lKCk7dGhpcy5fcHJvZ3Jlc3NpdmVEb25lPSEwfV9yZW1vdmVSYW5nZVJlYWRlcihlKXtjb25zdCB0PXRoaXMuX3JhbmdlUmVhZGVycy5pbmRleE9mKGUpO3Q+PTAmJnRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UodCwxKX1nZXRGdWxsUmVhZGVyKCl7KDAsbi5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGRGF0YVRyYW5zcG9ydFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpO2NvbnN0IGU9dGhpcy5fcXVldWVkQ2h1bmtzO3RoaXMuX3F1ZXVlZENodW5rcz1udWxsO3JldHVybiBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcih0aGlzLGUsdGhpcy5fcHJvZ3Jlc3NpdmVEb25lKX1nZXRSYW5nZVJlYWRlcihlLHQpe2lmKHQ8PXRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aClyZXR1cm4gbnVsbDtjb25zdCByPW5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIodGhpcyxlLHQpO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlKGUsdCk7dGhpcy5fcmFuZ2VSZWFkZXJzLnB1c2gocik7cmV0dXJuIHJ9Y2FuY2VsQWxsUmVxdWVzdHMoZSl7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXImJnRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbChlKTt0aGlzLl9yYW5nZVJlYWRlcnMuc2xpY2UoMCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jYW5jZWwoZSl9KSk7dGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFib3J0KCl9fTtjbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVye2NvbnN0cnVjdG9yKGUsdCxyPSExKXt0aGlzLl9zdHJlYW09ZTt0aGlzLl9kb25lPXJ8fCExO3RoaXMuX2ZpbGVuYW1lPW51bGw7dGhpcy5fcXVldWVkQ2h1bmtzPXR8fFtdO3RoaXMuX2xvYWRlZD0wO2Zvcihjb25zdCBlIG9mIHRoaXMuX3F1ZXVlZENodW5rcyl0aGlzLl9sb2FkZWQrPWUuYnl0ZUxlbmd0aDt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9oZWFkZXJzUmVhZHk9UHJvbWlzZS5yZXNvbHZlKCk7ZS5fZnVsbFJlcXVlc3RSZWFkZXI9dGhpczt0aGlzLm9uUHJvZ3Jlc3M9bnVsbH1fZW5xdWV1ZShlKXtpZighdGhpcy5fZG9uZSl7aWYodGhpcy5fcmVxdWVzdHMubGVuZ3RoPjApe3RoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7dmFsdWU6ZSxkb25lOiExfSl9ZWxzZSB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChlKTt0aGlzLl9sb2FkZWQrPWUuYnl0ZUxlbmd0aH19Z2V0IGhlYWRlcnNSZWFkeSgpe3JldHVybiB0aGlzLl9oZWFkZXJzUmVhZHl9Z2V0IGZpbGVuYW1lKCl7cmV0dXJuIHRoaXMuX2ZpbGVuYW1lfWdldCBpc1JhbmdlU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX3N0cmVhbS5faXNSYW5nZVN1cHBvcnRlZH1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZH1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9zdHJlYW0uX2NvbnRlbnRMZW5ndGh9YXN5bmMgcmVhZCgpe2lmKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGg+MCl7cmV0dXJue3ZhbHVlOnRoaXMuX3F1ZXVlZENodW5rcy5zaGlmdCgpLGRvbmU6ITF9fWlmKHRoaXMuX2RvbmUpcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfTtjb25zdCBlPSgwLG4uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5fcmVxdWVzdHMucHVzaChlKTtyZXR1cm4gZS5wcm9taXNlfWNhbmNlbChlKXt0aGlzLl9kb25lPSEwO3RoaXMuX3JlcXVlc3RzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UucmVzb2x2ZSh7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KX0pKTt0aGlzLl9yZXF1ZXN0cz1bXX1wcm9ncmVzc2l2ZURvbmUoKXt0aGlzLl9kb25lfHwodGhpcy5fZG9uZT0hMCl9fWNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcntjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5fc3RyZWFtPWU7dGhpcy5fYmVnaW49dDt0aGlzLl9lbmQ9cjt0aGlzLl9xdWV1ZWRDaHVuaz1udWxsO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX2RvbmU9ITE7dGhpcy5vblByb2dyZXNzPW51bGx9X2VucXVldWUoZSl7aWYoIXRoaXMuX2RvbmUpe2lmKDA9PT10aGlzLl9yZXF1ZXN0cy5sZW5ndGgpdGhpcy5fcXVldWVkQ2h1bms9ZTtlbHNle3RoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7dmFsdWU6ZSxkb25lOiExfSk7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSkpO3RoaXMuX3JlcXVlc3RzPVtdfXRoaXMuX2RvbmU9ITA7dGhpcy5fc3RyZWFtLl9yZW1vdmVSYW5nZVJlYWRlcih0aGlzKX19Z2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCl7cmV0dXJuITF9YXN5bmMgcmVhZCgpe2lmKHRoaXMuX3F1ZXVlZENodW5rKXtjb25zdCBlPXRoaXMuX3F1ZXVlZENodW5rO3RoaXMuX3F1ZXVlZENodW5rPW51bGw7cmV0dXJue3ZhbHVlOmUsZG9uZTohMX19aWYodGhpcy5fZG9uZSlyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9O2NvbnN0IGU9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9yZXF1ZXN0cy5wdXNoKGUpO3JldHVybiBlLnByb21pc2V9Y2FuY2VsKGUpe3RoaXMuX2RvbmU9ITA7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSkpO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyl9fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5XZWJHTENvbnRleHQ9dm9pZCAwO3ZhciBuPXIoMik7dC5XZWJHTENvbnRleHQ9Y2xhc3MgV2ViR0xDb250ZXh0e2NvbnN0cnVjdG9yKHtlbmFibGU6ZT0hMX0pe3RoaXMuX2VuYWJsZWQ9ITA9PT1lfWdldCBpc0VuYWJsZWQoKXtsZXQgZT10aGlzLl9lbmFibGVkO2UmJihlPXMudHJ5SW5pdEdMKCkpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJpc0VuYWJsZWQiLGUpfWNvbXBvc2VTTWFzayh7bGF5ZXI6ZSxtYXNrOnQscHJvcGVydGllczpyfSl7cmV0dXJuIHMuY29tcG9zZVNNYXNrKGUsdCxyKX1kcmF3RmlndXJlcyh7d2lkdGg6ZSxoZWlnaHQ6dCxiYWNrZ3JvdW5kQ29sb3I6cixmaWd1cmVzOm4sY29udGV4dDphfSl7cmV0dXJuIHMuZHJhd0ZpZ3VyZXMoZSx0LHIsbixhKX1jbGVhcigpe3MuY2xlYW51cCgpfX07dmFyIHM9ZnVuY3Rpb24gV2ViR0xVdGlsc0Nsb3N1cmUoKXtmdW5jdGlvbiBsb2FkU2hhZGVyKGUsdCxyKXt2YXIgbj1lLmNyZWF0ZVNoYWRlcihyKTtlLnNoYWRlclNvdXJjZShuLHQpO2UuY29tcGlsZVNoYWRlcihuKTtpZighZS5nZXRTaGFkZXJQYXJhbWV0ZXIobixlLkNPTVBJTEVfU1RBVFVTKSl7dmFyIHM9ZS5nZXRTaGFkZXJJbmZvTG9nKG4pO3Rocm93IG5ldyBFcnJvcigiRXJyb3IgZHVyaW5nIHNoYWRlciBjb21waWxhdGlvbjogIitzKX1yZXR1cm4gbn1mdW5jdGlvbiBjcmVhdGVWZXJ0ZXhTaGFkZXIoZSx0KXtyZXR1cm4gbG9hZFNoYWRlcihlLHQsZS5WRVJURVhfU0hBREVSKX1mdW5jdGlvbiBjcmVhdGVGcmFnbWVudFNoYWRlcihlLHQpe3JldHVybiBsb2FkU2hhZGVyKGUsdCxlLkZSQUdNRU5UX1NIQURFUil9ZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbShlLHQpe2Zvcih2YXIgcj1lLmNyZWF0ZVByb2dyYW0oKSxuPTAscz10Lmxlbmd0aDtuPHM7KytuKWUuYXR0YWNoU2hhZGVyKHIsdFtuXSk7ZS5saW5rUHJvZ3JhbShyKTtpZighZS5nZXRQcm9ncmFtUGFyYW1ldGVyKHIsZS5MSU5LX1NUQVRVUykpe3ZhciBhPWUuZ2V0UHJvZ3JhbUluZm9Mb2cocik7dGhyb3cgbmV3IEVycm9yKCJFcnJvciBkdXJpbmcgcHJvZ3JhbSBsaW5raW5nOiAiK2EpfXJldHVybiByfWZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZSx0LHIpe2UuYWN0aXZlVGV4dHVyZShyKTt2YXIgbj1lLmNyZWF0ZVRleHR1cmUoKTtlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCxuKTtlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELGUuVEVYVFVSRV9XUkFQX1MsZS5DTEFNUF9UT19FREdFKTtlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELGUuVEVYVFVSRV9XUkFQX1QsZS5DTEFNUF9UT19FREdFKTtlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELGUuVEVYVFVSRV9NSU5fRklMVEVSLGUuTkVBUkVTVCk7ZS50ZXhQYXJhbWV0ZXJpKGUuVEVYVFVSRV8yRCxlLlRFWFRVUkVfTUFHX0ZJTFRFUixlLk5FQVJFU1QpO2UudGV4SW1hZ2UyRChlLlRFWFRVUkVfMkQsMCxlLlJHQkEsZS5SR0JBLGUuVU5TSUdORURfQllURSx0KTtyZXR1cm4gbn12YXIgZSx0O2Z1bmN0aW9uIGdlbmVyYXRlR0woKXtpZighZSl7dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtlPXQuZ2V0Q29udGV4dCgid2ViZ2wiLHtwcmVtdWx0aXBsaWVkYWxwaGE6ITF9KX19dmFyIHI9bnVsbDt2YXIgbj1udWxsO3JldHVybnt0cnlJbml0R0woKXt0cnl7Z2VuZXJhdGVHTCgpO3JldHVybiEhZX1jYXRjaChlKXt9cmV0dXJuITF9LGNvbXBvc2VTTWFzazpmdW5jdGlvbiBjb21wb3NlU01hc2sobixzLGEpe3ZhciBpPW4ud2lkdGgsbz1uLmhlaWdodDtyfHxmdW5jdGlvbiBpbml0U21hc2tHTCgpe3ZhciBuLHM7Z2VuZXJhdGVHTCgpO249dDt0PW51bGw7cz1lO2U9bnVsbDt2YXIgYT1jcmVhdGVQcm9ncmFtKHMsW2NyZWF0ZVZlcnRleFNoYWRlcihzLCIgIGF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMiBhX3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyIGNsaXBTcGFjZSA9IChhX3Bvc2l0aW9uIC8gdV9yZXNvbHV0aW9uKSAqIDIuMCAtIDEuMDsgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNsaXBTcGFjZSAqIHZlYzIoMSwgLTEpLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksY3JlYXRlRnJhZ21lbnRTaGFkZXIocywiICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm0gdmVjNCB1X2JhY2tkcm9wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtIGludCB1X3N1YnR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0IGltYWdlQ29sb3IgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdl90ZXhDb29yZCk7ICAgICAgICAgICAgICAgdmVjNCBtYXNrQ29sb3IgPSB0ZXh0dXJlMkQodV9tYXNrLCB2X3RleENvb3JkKTsgICAgICAgICAgICAgICAgIGlmICh1X2JhY2tkcm9wLmEgPiAwLjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tDb2xvci5yZ2IgPSBtYXNrQ29sb3IucmdiICogbWFza0NvbG9yLmEgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9iYWNrZHJvcC5yZ2IgKiAoMS4wIC0gbWFza0NvbG9yLmEpOyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVfc3VidHlwZSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVtID0gbWFza0NvbG9yLmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdW0gPSBtYXNrQ29sb3IuciAqIDAuMyArIG1hc2tDb2xvci5nICogMC41OSArICAgICAgICAgICAgICAgICAgICAgICAgbWFza0NvbG9yLmIgKiAwLjExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb2xvci5hICo9IGx1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQ29sb3IucmdiICo9IGltYWdlQ29sb3IuYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSBpbWFnZUNvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIildKTtzLnVzZVByb2dyYW0oYSk7dmFyIGk9e307aS5nbD1zO2kuY2FudmFzPW47aS5yZXNvbHV0aW9uTG9jYXRpb249cy5nZXRVbmlmb3JtTG9jYXRpb24oYSwidV9yZXNvbHV0aW9uIik7aS5wb3NpdGlvbkxvY2F0aW9uPXMuZ2V0QXR0cmliTG9jYXRpb24oYSwiYV9wb3NpdGlvbiIpO2kuYmFja2Ryb3BMb2NhdGlvbj1zLmdldFVuaWZvcm1Mb2NhdGlvbihhLCJ1X2JhY2tkcm9wIik7aS5zdWJ0eXBlTG9jYXRpb249cy5nZXRVbmlmb3JtTG9jYXRpb24oYSwidV9zdWJ0eXBlIik7dmFyIG89cy5nZXRBdHRyaWJMb2NhdGlvbihhLCJhX3RleENvb3JkIiksbD1zLmdldFVuaWZvcm1Mb2NhdGlvbihhLCJ1X2ltYWdlIiksYz1zLmdldFVuaWZvcm1Mb2NhdGlvbihhLCJ1X21hc2siKSxoPXMuY3JlYXRlQnVmZmVyKCk7cy5iaW5kQnVmZmVyKHMuQVJSQVlfQlVGRkVSLGgpO3MuYnVmZmVyRGF0YShzLkFSUkFZX0JVRkZFUixuZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDAsMSwwLDEsMSwwLDEsMV0pLHMuU1RBVElDX0RSQVcpO3MuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobyk7cy52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8sMixzLkZMT0FULCExLDAsMCk7cy51bmlmb3JtMWkobCwwKTtzLnVuaWZvcm0xaShjLDEpO3I9aX0oKTt2YXIgbD1yLGM9bC5jYW52YXMsaD1sLmdsO2Mud2lkdGg9aTtjLmhlaWdodD1vO2gudmlld3BvcnQoMCwwLGguZHJhd2luZ0J1ZmZlcldpZHRoLGguZHJhd2luZ0J1ZmZlckhlaWdodCk7aC51bmlmb3JtMmYobC5yZXNvbHV0aW9uTG9jYXRpb24saSxvKTthLmJhY2tkcm9wP2gudW5pZm9ybTRmKGwucmVzb2x1dGlvbkxvY2F0aW9uLGEuYmFja2Ryb3BbMF0sYS5iYWNrZHJvcFsxXSxhLmJhY2tkcm9wWzJdLDEpOmgudW5pZm9ybTRmKGwucmVzb2x1dGlvbkxvY2F0aW9uLDAsMCwwLDApO2gudW5pZm9ybTFpKGwuc3VidHlwZUxvY2F0aW9uLCJMdW1pbm9zaXR5Ij09PWEuc3VidHlwZT8xOjApO3ZhciBkPWNyZWF0ZVRleHR1cmUoaCxuLGguVEVYVFVSRTApLHU9Y3JlYXRlVGV4dHVyZShoLHMsaC5URVhUVVJFMSkscD1oLmNyZWF0ZUJ1ZmZlcigpO2guYmluZEJ1ZmZlcihoLkFSUkFZX0JVRkZFUixwKTtoLmJ1ZmZlckRhdGEoaC5BUlJBWV9CVUZGRVIsbmV3IEZsb2F0MzJBcnJheShbMCwwLGksMCwwLG8sMCxvLGksMCxpLG9dKSxoLlNUQVRJQ19EUkFXKTtoLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGwucG9zaXRpb25Mb2NhdGlvbik7aC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGwucG9zaXRpb25Mb2NhdGlvbiwyLGguRkxPQVQsITEsMCwwKTtoLmNsZWFyQ29sb3IoMCwwLDAsMCk7aC5lbmFibGUoaC5CTEVORCk7aC5ibGVuZEZ1bmMoaC5PTkUsaC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtoLmNsZWFyKGguQ09MT1JfQlVGRkVSX0JJVCk7aC5kcmF3QXJyYXlzKGguVFJJQU5HTEVTLDAsNik7aC5mbHVzaCgpO2guZGVsZXRlVGV4dHVyZShkKTtoLmRlbGV0ZVRleHR1cmUodSk7aC5kZWxldGVCdWZmZXIocCk7cmV0dXJuIGN9LGRyYXdGaWd1cmVzOmZ1bmN0aW9uIGRyYXdGaWd1cmVzKHIscyxhLGksbyl7bnx8ZnVuY3Rpb24gaW5pdEZpZ3VyZXNHTCgpe3ZhciByLHM7Z2VuZXJhdGVHTCgpO3I9dDt0PW51bGw7cz1lO2U9bnVsbDt2YXIgYT1jcmVhdGVQcm9ncmFtKHMsW2NyZWF0ZVZlcnRleFNoYWRlcihzLCIgIGF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMyBhX2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtIHZlYzIgdV9zY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdl9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIgcG9zaXRpb24gPSAoYV9wb3NpdGlvbiArIHVfb2Zmc2V0KSAqIHVfc2NhbGU7ICAgICAgICAgICAgICB2ZWMyIGNsaXBTcGFjZSA9IChwb3NpdGlvbiAvIHVfcmVzb2x1dGlvbikgKiAyLjAgLSAxLjA7ICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNsaXBTcGFjZSAqIHZlYzIoMSwgLTEpLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2NvbG9yID0gdmVjNChhX2NvbG9yIC8gMjU1LjAsIDEuMCk7ICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksY3JlYXRlRnJhZ21lbnRTaGFkZXIocywiICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpXSk7cy51c2VQcm9ncmFtKGEpO3ZhciBpPXt9O2kuZ2w9cztpLmNhbnZhcz1yO2kucmVzb2x1dGlvbkxvY2F0aW9uPXMuZ2V0VW5pZm9ybUxvY2F0aW9uKGEsInVfcmVzb2x1dGlvbiIpO2kuc2NhbGVMb2NhdGlvbj1zLmdldFVuaWZvcm1Mb2NhdGlvbihhLCJ1X3NjYWxlIik7aS5vZmZzZXRMb2NhdGlvbj1zLmdldFVuaWZvcm1Mb2NhdGlvbihhLCJ1X29mZnNldCIpO2kucG9zaXRpb25Mb2NhdGlvbj1zLmdldEF0dHJpYkxvY2F0aW9uKGEsImFfcG9zaXRpb24iKTtpLmNvbG9yTG9jYXRpb249cy5nZXRBdHRyaWJMb2NhdGlvbihhLCJhX2NvbG9yIik7bj1pfSgpO3ZhciBsPW4sYz1sLmNhbnZhcyxoPWwuZ2w7Yy53aWR0aD1yO2MuaGVpZ2h0PXM7aC52aWV3cG9ydCgwLDAsaC5kcmF3aW5nQnVmZmVyV2lkdGgsaC5kcmF3aW5nQnVmZmVySGVpZ2h0KTtoLnVuaWZvcm0yZihsLnJlc29sdXRpb25Mb2NhdGlvbixyLHMpO3ZhciBkLHUscCxmPTA7Zm9yKGQ9MCx1PWkubGVuZ3RoO2Q8dTtkKyspc3dpdGNoKGlbZF0udHlwZSl7Y2FzZSJsYXR0aWNlIjpmKz0oKHA9aVtkXS5jb29yZHMubGVuZ3RoL2lbZF0udmVydGljZXNQZXJSb3d8MCktMSkqKGlbZF0udmVydGljZXNQZXJSb3ctMSkqNjticmVhaztjYXNlInRyaWFuZ2xlcyI6Zis9aVtkXS5jb29yZHMubGVuZ3RofXZhciBnPW5ldyBGbG9hdDMyQXJyYXkoMipmKSxtPW5ldyBVaW50OEFycmF5KDMqZiksXz1vLmNvb3JkcyxBPW8uY29sb3JzLGI9MCx5PTA7Zm9yKGQ9MCx1PWkubGVuZ3RoO2Q8dTtkKyspe3ZhciB2PWlbZF0sQz12LmNvb3JkcyxTPXYuY29sb3JzO3N3aXRjaCh2LnR5cGUpe2Nhc2UibGF0dGljZSI6dmFyIHg9di52ZXJ0aWNlc1BlclJvdztwPUMubGVuZ3RoL3h8MDtmb3IodmFyIFA9MTtQPHA7UCsrKWZvcih2YXIgaz1QKngrMSxSPTE7Ujx4O1IrKyxrKyspe2dbYl09X1tDW2steC0xXV07Z1tiKzFdPV9bQ1trLXgtMV0rMV07Z1tiKzJdPV9bQ1trLXhdXTtnW2IrM109X1tDW2steF0rMV07Z1tiKzRdPV9bQ1trLTFdXTtnW2IrNV09X1tDW2stMV0rMV07bVt5XT1BW1Nbay14LTFdXTttW3krMV09QVtTW2steC0xXSsxXTttW3krMl09QVtTW2steC0xXSsyXTttW3krM109QVtTW2steF1dO21beSs0XT1BW1Nbay14XSsxXTttW3krNV09QVtTW2steF0rMl07bVt5KzZdPUFbU1trLTFdXTttW3krN109QVtTW2stMV0rMV07bVt5KzhdPUFbU1trLTFdKzJdO2dbYis2XT1nW2IrMl07Z1tiKzddPWdbYiszXTtnW2IrOF09Z1tiKzRdO2dbYis5XT1nW2IrNV07Z1tiKzEwXT1fW0Nba11dO2dbYisxMV09X1tDW2tdKzFdO21beSs5XT1tW3krM107bVt5KzEwXT1tW3krNF07bVt5KzExXT1tW3krNV07bVt5KzEyXT1tW3krNl07bVt5KzEzXT1tW3krN107bVt5KzE0XT1tW3krOF07bVt5KzE1XT1BW1Nba11dO21beSsxNl09QVtTW2tdKzFdO21beSsxN109QVtTW2tdKzJdO2IrPTEyO3krPTE4fWJyZWFrO2Nhc2UidHJpYW5nbGVzIjpmb3IodmFyIHc9MCxUPUMubGVuZ3RoO3c8VDt3Kyspe2dbYl09X1tDW3ddXTtnW2IrMV09X1tDW3ddKzFdO21beV09QVtTW3ddXTttW3krMV09QVtTW3ddKzFdO21beSsyXT1BW1Nbd10rMl07Yis9Mjt5Kz0zfX19YT9oLmNsZWFyQ29sb3IoYVswXS8yNTUsYVsxXS8yNTUsYVsyXS8yNTUsMSk6aC5jbGVhckNvbG9yKDAsMCwwLDApO2guY2xlYXIoaC5DT0xPUl9CVUZGRVJfQklUKTt2YXIgRT1oLmNyZWF0ZUJ1ZmZlcigpO2guYmluZEJ1ZmZlcihoLkFSUkFZX0JVRkZFUixFKTtoLmJ1ZmZlckRhdGEoaC5BUlJBWV9CVUZGRVIsZyxoLlNUQVRJQ19EUkFXKTtoLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGwucG9zaXRpb25Mb2NhdGlvbik7aC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGwucG9zaXRpb25Mb2NhdGlvbiwyLGguRkxPQVQsITEsMCwwKTt2YXIgRj1oLmNyZWF0ZUJ1ZmZlcigpO2guYmluZEJ1ZmZlcihoLkFSUkFZX0JVRkZFUixGKTtoLmJ1ZmZlckRhdGEoaC5BUlJBWV9CVUZGRVIsbSxoLlNUQVRJQ19EUkFXKTtoLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGwuY29sb3JMb2NhdGlvbik7aC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGwuY29sb3JMb2NhdGlvbiwzLGguVU5TSUdORURfQllURSwhMSwwLDApO2gudW5pZm9ybTJmKGwuc2NhbGVMb2NhdGlvbixvLnNjYWxlWCxvLnNjYWxlWSk7aC51bmlmb3JtMmYobC5vZmZzZXRMb2NhdGlvbixvLm9mZnNldFgsby5vZmZzZXRZKTtoLmRyYXdBcnJheXMoaC5UUklBTkdMRVMsMCxmKTtoLmZsdXNoKCk7aC5kZWxldGVCdWZmZXIoRSk7aC5kZWxldGVCdWZmZXIoRik7cmV0dXJuIGN9LGNsZWFudXAoKXtpZihyJiZyLmNhbnZhcyl7ci5jYW52YXMud2lkdGg9MDtyLmNhbnZhcy5oZWlnaHQ9MH1pZihuJiZuLmNhbnZhcyl7bi5jYW52YXMud2lkdGg9MDtuLmNhbnZhcy5oZWlnaHQ9MH1yPW51bGw7bj1udWxsfX19KCl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQW5ub3RhdGlvbkxheWVyPXZvaWQgMDt2YXIgbj1yKDEpLHM9cigyKSxhPXIoOCk7Y2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5e3N0YXRpYyBjcmVhdGUoZSl7c3dpdGNoKGUuZGF0YS5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBzLkFubm90YXRpb25UeXBlLkxJTks6cmV0dXJuIG5ldyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSBzLkFubm90YXRpb25UeXBlLlRFWFQ6cmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSBzLkFubm90YXRpb25UeXBlLldJREdFVDpzd2l0Y2goZS5kYXRhLmZpZWxkVHlwZSl7Y2FzZSJUeCI6cmV0dXJuIG5ldyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSJCdG4iOnJldHVybiBlLmRhdGEucmFkaW9CdXR0b24/bmV3IFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQoZSk6ZS5kYXRhLmNoZWNrQm94P25ldyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50KGUpOm5ldyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSJDaCI6cmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChlKX1yZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb25FbGVtZW50KGUpO2Nhc2Ugcy5Bbm5vdGF0aW9uVHlwZS5QT1BVUDpyZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSBzLkFubm90YXRpb25UeXBlLkZSRUVURVhUOnJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudChlKTtjYXNlIHMuQW5ub3RhdGlvblR5cGUuTElORTpyZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uRWxlbWVudChlKTtjYXNlIHMuQW5ub3RhdGlvblR5cGUuU1FVQVJFOnJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSBzLkFubm90YXRpb25UeXBlLkNJUkNMRTpyZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb25FbGVtZW50KGUpO2Nhc2Ugcy5Bbm5vdGF0aW9uVHlwZS5QT0xZTElORTpyZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSBzLkFubm90YXRpb25UeXBlLkNBUkVUOnJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChlKTtjYXNlIHMuQW5ub3RhdGlvblR5cGUuSU5LOnJldHVybiBuZXcgSW5rQW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSBzLkFubm90YXRpb25UeXBlLlBPTFlHT046cmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQoZSk7Y2FzZSBzLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVDpyZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KGUpO2Nhc2Ugcy5Bbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU6cmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudChlKTtjYXNlIHMuQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk6cmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50KGUpO2Nhc2Ugcy5Bbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ6cmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChlKTtjYXNlIHMuQW5ub3RhdGlvblR5cGUuU1RBTVA6cmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb25FbGVtZW50KGUpO2Nhc2Ugcy5Bbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDpyZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQoZSk7ZGVmYXVsdDpyZXR1cm4gbmV3IEFubm90YXRpb25FbGVtZW50KGUpfX19Y2xhc3MgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSx0PSExLHI9ITEpe3RoaXMuaXNSZW5kZXJhYmxlPXQ7dGhpcy5kYXRhPWUuZGF0YTt0aGlzLmxheWVyPWUubGF5ZXI7dGhpcy5wYWdlPWUucGFnZTt0aGlzLnZpZXdwb3J0PWUudmlld3BvcnQ7dGhpcy5saW5rU2VydmljZT1lLmxpbmtTZXJ2aWNlO3RoaXMuZG93bmxvYWRNYW5hZ2VyPWUuZG93bmxvYWRNYW5hZ2VyO3RoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoPWUuaW1hZ2VSZXNvdXJjZXNQYXRoO3RoaXMucmVuZGVySW50ZXJhY3RpdmVGb3Jtcz1lLnJlbmRlckludGVyYWN0aXZlRm9ybXM7dGhpcy5zdmdGYWN0b3J5PWUuc3ZnRmFjdG9yeTt0aGlzLmFubm90YXRpb25TdG9yYWdlPWUuYW5ub3RhdGlvblN0b3JhZ2U7dCYmKHRoaXMuY29udGFpbmVyPXRoaXMuX2NyZWF0ZUNvbnRhaW5lcihyKSl9X2NyZWF0ZUNvbnRhaW5lcihlPSExKXtjb25zdCB0PXRoaXMuZGF0YSxyPXRoaXMucGFnZSxuPXRoaXMudmlld3BvcnQsYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWN0aW9uIik7bGV0IGk9dC5yZWN0WzJdLXQucmVjdFswXSxvPXQucmVjdFszXS10LnJlY3RbMV07YS5zZXRBdHRyaWJ1dGUoImRhdGEtYW5ub3RhdGlvbi1pZCIsdC5pZCk7Y29uc3QgbD1zLlV0aWwubm9ybWFsaXplUmVjdChbdC5yZWN0WzBdLHIudmlld1szXS10LnJlY3RbMV0rci52aWV3WzFdLHQucmVjdFsyXSxyLnZpZXdbM10tdC5yZWN0WzNdK3Iudmlld1sxXV0pO2Euc3R5bGUudHJhbnNmb3JtPWBtYXRyaXgoJHtuLnRyYW5zZm9ybS5qb2luKCIsIil9KWA7YS5zdHlsZS50cmFuc2Zvcm1PcmlnaW49YC0ke2xbMF19cHggLSR7bFsxXX1weGA7aWYoIWUmJnQuYm9yZGVyU3R5bGUud2lkdGg+MCl7YS5zdHlsZS5ib3JkZXJXaWR0aD10LmJvcmRlclN0eWxlLndpZHRoKyJweCI7aWYodC5ib3JkZXJTdHlsZS5zdHlsZSE9PXMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkUpe2ktPTIqdC5ib3JkZXJTdHlsZS53aWR0aDtvLT0yKnQuYm9yZGVyU3R5bGUud2lkdGh9Y29uc3QgZT10LmJvcmRlclN0eWxlLmhvcml6b250YWxDb3JuZXJSYWRpdXMscj10LmJvcmRlclN0eWxlLnZlcnRpY2FsQ29ybmVyUmFkaXVzO2lmKGU+MHx8cj4wKXtjb25zdCB0PWAke2V9cHggLyAke3J9cHhgO2Euc3R5bGUuYm9yZGVyUmFkaXVzPXR9c3dpdGNoKHQuYm9yZGVyU3R5bGUuc3R5bGUpe2Nhc2Ugcy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOmEuc3R5bGUuYm9yZGVyU3R5bGU9InNvbGlkIjticmVhaztjYXNlIHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ6YS5zdHlsZS5ib3JkZXJTdHlsZT0iZGFzaGVkIjticmVhaztjYXNlIHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEOigwLHMud2FybikoIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBiZXZlbGVkIik7YnJlYWs7Y2FzZSBzLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ6KDAscy53YXJuKSgiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGluc2V0Iik7YnJlYWs7Y2FzZSBzLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOmEuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGU9InNvbGlkIn10LmNvbG9yP2Euc3R5bGUuYm9yZGVyQ29sb3I9cy5VdGlsLm1ha2VDc3NSZ2IoMHx0LmNvbG9yWzBdLDB8dC5jb2xvclsxXSwwfHQuY29sb3JbMl0pOmEuc3R5bGUuYm9yZGVyV2lkdGg9MH1hLnN0eWxlLmxlZnQ9bFswXSsicHgiO2Euc3R5bGUudG9wPWxbMV0rInB4IjthLnN0eWxlLndpZHRoPWkrInB4IjthLnN0eWxlLmhlaWdodD1vKyJweCI7cmV0dXJuIGF9X2NyZWF0ZVBvcHVwKGUsdCxyKXtpZighdCl7KHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLnN0eWxlLmhlaWdodD1lLnN0eWxlLmhlaWdodDt0LnN0eWxlLndpZHRoPWUuc3R5bGUud2lkdGg7ZS5hcHBlbmRDaGlsZCh0KX1jb25zdCBuPW5ldyBQb3B1cEVsZW1lbnQoe2NvbnRhaW5lcjplLHRyaWdnZXI6dCxjb2xvcjpyLmNvbG9yLHRpdGxlOnIudGl0bGUsbW9kaWZpY2F0aW9uRGF0ZTpyLm1vZGlmaWNhdGlvbkRhdGUsY29udGVudHM6ci5jb250ZW50cyxoaWRlV3JhcHBlcjohMH0pLnJlbmRlcigpO24uc3R5bGUubGVmdD1lLnN0eWxlLndpZHRoO2UuYXBwZW5kQ2hpbGQobil9cmVuZGVyKCl7KDAscy51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWQiKX19Y2xhc3MgTGlua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwhIShlLmRhdGEudXJsfHxlLmRhdGEuZGVzdHx8ZS5kYXRhLmFjdGlvbikpfXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0ibGlua0Fubm90YXRpb24iO2NvbnN0e2RhdGE6ZSxsaW5rU2VydmljZTp0fT10aGlzLHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2UudXJsPygwLG4uYWRkTGlua0F0dHJpYnV0ZXMpKHIse3VybDplLnVybCx0YXJnZXQ6ZS5uZXdXaW5kb3c/bi5MaW5rVGFyZ2V0LkJMQU5LOnQuZXh0ZXJuYWxMaW5rVGFyZ2V0LHJlbDp0LmV4dGVybmFsTGlua1JlbCxlbmFibGVkOnQuZXh0ZXJuYWxMaW5rRW5hYmxlZH0pOmUuYWN0aW9uP3RoaXMuX2JpbmROYW1lZEFjdGlvbihyLGUuYWN0aW9uKTp0aGlzLl9iaW5kTGluayhyLGUuZGVzdCk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQocik7cmV0dXJuIHRoaXMuY29udGFpbmVyfV9iaW5kTGluayhlLHQpe2UuaHJlZj10aGlzLmxpbmtTZXJ2aWNlLmdldERlc3RpbmF0aW9uSGFzaCh0KTtlLm9uY2xpY2s9KCk9Pnt0JiZ0aGlzLmxpbmtTZXJ2aWNlLm5hdmlnYXRlVG8odCk7cmV0dXJuITF9O3QmJihlLmNsYXNzTmFtZT0iaW50ZXJuYWxMaW5rIil9X2JpbmROYW1lZEFjdGlvbihlLHQpe2UuaHJlZj10aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybCgiIik7ZS5vbmNsaWNrPSgpPT57dGhpcy5saW5rU2VydmljZS5leGVjdXRlTmFtZWRBY3Rpb24odCk7cmV0dXJuITF9O2UuY2xhc3NOYW1lPSJpbnRlcm5hbExpbmsifX1jbGFzcyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCEhKGUuZGF0YS5oYXNQb3B1cHx8ZS5kYXRhLnRpdGxlfHxlLmRhdGEuY29udGVudHMpKX1yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9InRleHRBbm5vdGF0aW9uIjtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpO2Uuc3R5bGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodDtlLnN0eWxlLndpZHRoPXRoaXMuY29udGFpbmVyLnN0eWxlLndpZHRoO2Uuc3JjPXRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoKyJhbm5vdGF0aW9uLSIrdGhpcy5kYXRhLm5hbWUudG9Mb3dlckNhc2UoKSsiLnN2ZyI7ZS5hbHQ9Ilt7e3R5cGV9fSBBbm5vdGF0aW9uXSI7ZS5kYXRhc2V0LmwxMG5JZD0idGV4dF9hbm5vdGF0aW9uX3R5cGUiO2UuZGF0YXNldC5sMTBuQXJncz1KU09OLnN0cmluZ2lmeSh7dHlwZTp0aGlzLmRhdGEubmFtZX0pO3RoaXMuZGF0YS5oYXNQb3B1cHx8dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsZSx0aGlzLmRhdGEpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGUpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtyZW5kZXIoKXtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsZS5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zfHwhZS5kYXRhLmhhc0FwcGVhcmFuY2UmJiEhZS5kYXRhLmZpZWxkVmFsdWUpfXJlbmRlcigpe2NvbnN0IGU9WyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXSx0PXRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uscj10aGlzLmRhdGEuaWQ7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJ0ZXh0V2lkZ2V0QW5ub3RhdGlvbiI7bGV0IG49bnVsbDtpZih0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpe2NvbnN0IGU9dC5nZXRPckNyZWF0ZVZhbHVlKHIsdGhpcy5kYXRhLmZpZWxkVmFsdWUpO2lmKHRoaXMuZGF0YS5tdWx0aUxpbmUpe249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTtuLnRleHRDb250ZW50PWV9ZWxzZXtuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7bi50eXBlPSJ0ZXh0IjtuLnNldEF0dHJpYnV0ZSgidmFsdWUiLGUpfW4uYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLChmdW5jdGlvbihlKXt0LnNldFZhbHVlKHIsZS50YXJnZXQudmFsdWUpfSkpO24uZGlzYWJsZWQ9dGhpcy5kYXRhLnJlYWRPbmx5O24ubmFtZT10aGlzLmRhdGEuZmllbGROYW1lO251bGwhPT10aGlzLmRhdGEubWF4TGVuJiYobi5tYXhMZW5ndGg9dGhpcy5kYXRhLm1heExlbik7aWYodGhpcy5kYXRhLmNvbWIpe2NvbnN0IGU9KHRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdKS90aGlzLmRhdGEubWF4TGVuO24uY2xhc3NMaXN0LmFkZCgiY29tYiIpO24uc3R5bGUubGV0dGVyU3BhY2luZz1gY2FsYygke2V9cHggLSAxY2gpYH19ZWxzZXtuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24udGV4dENvbnRlbnQ9dGhpcy5kYXRhLmZpZWxkVmFsdWU7bi5zdHlsZS52ZXJ0aWNhbEFsaWduPSJtaWRkbGUiO24uc3R5bGUuZGlzcGxheT0idGFibGUtY2VsbCI7bGV0IGU9bnVsbDt0aGlzLmRhdGEuZm9udFJlZk5hbWUmJnRoaXMucGFnZS5jb21tb25PYmpzLmhhcyh0aGlzLmRhdGEuZm9udFJlZk5hbWUpJiYoZT10aGlzLnBhZ2UuY29tbW9uT2Jqcy5nZXQodGhpcy5kYXRhLmZvbnRSZWZOYW1lKSk7dGhpcy5fc2V0VGV4dFN0eWxlKG4sZSl9bnVsbCE9PXRoaXMuZGF0YS50ZXh0QWxpZ25tZW50JiYobi5zdHlsZS50ZXh0QWxpZ249ZVt0aGlzLmRhdGEudGV4dEFsaWdubWVudF0pO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKG4pO3JldHVybiB0aGlzLmNvbnRhaW5lcn1fc2V0VGV4dFN0eWxlKGUsdCl7Y29uc3Qgcj1lLnN0eWxlO3IuZm9udFNpemU9dGhpcy5kYXRhLmZvbnRTaXplKyJweCI7ci5kaXJlY3Rpb249dGhpcy5kYXRhLmZvbnREaXJlY3Rpb248MD8icnRsIjoibHRyIjtpZighdClyZXR1cm47bGV0IG49Im5vcm1hbCI7dC5ibGFjaz9uPSI5MDAiOnQuYm9sZCYmKG49ImJvbGQiKTtyLmZvbnRXZWlnaHQ9bjtyLmZvbnRTdHlsZT10Lml0YWxpYz8iaXRhbGljIjoibm9ybWFsIjtjb25zdCBzPXQubG9hZGVkTmFtZT9gIiR7dC5sb2FkZWROYW1lfSIsIGA6IiIsYT10LmZhbGxiYWNrTmFtZXx8IkhlbHZldGljYSwgc2Fucy1zZXJpZiI7ci5mb250RmFtaWx5PXMrYX19Y2xhc3MgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsZS5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zKX1yZW5kZXIoKXtjb25zdCBlPXRoaXMuYW5ub3RhdGlvblN0b3JhZ2UsdD10aGlzLmRhdGEscj10LmlkLG49ZS5nZXRPckNyZWF0ZVZhbHVlKHIsdC5maWVsZFZhbHVlJiYiT2ZmIiE9PXQuZmllbGRWYWx1ZSk7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJidXR0b25XaWRnZXRBbm5vdGF0aW9uIGNoZWNrQm94Ijtjb25zdCBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7cy5kaXNhYmxlZD10LnJlYWRPbmx5O3MudHlwZT0iY2hlY2tib3giO3MubmFtZT10aGlzLmRhdGEuZmllbGROYW1lO24mJnMuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwhMCk7cy5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLChmdW5jdGlvbih0KXtlLnNldFZhbHVlKHIsdC50YXJnZXQuY2hlY2tlZCl9KSk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQocyk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSxlLnJlbmRlckludGVyYWN0aXZlRm9ybXMpfXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0iYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiByYWRpb0J1dHRvbiI7Y29uc3QgZT10aGlzLmFubm90YXRpb25TdG9yYWdlLHQ9dGhpcy5kYXRhLHI9dC5pZCxuPWUuZ2V0T3JDcmVhdGVWYWx1ZShyLHQuZmllbGRWYWx1ZT09PXQuYnV0dG9uVmFsdWUpLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtzLmRpc2FibGVkPXQucmVhZE9ubHk7cy50eXBlPSJyYWRpbyI7cy5uYW1lPXQuZmllbGROYW1lO24mJnMuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwhMCk7cy5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLChmdW5jdGlvbih0KXtjb25zdCBuPXQudGFyZ2V0Lm5hbWU7Zm9yKGNvbnN0IHIgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUobikpciE9PXQudGFyZ2V0JiZlLnNldFZhbHVlKHIucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5ub3RhdGlvbi1pZCIpLCExKTtlLnNldFZhbHVlKHIsdC50YXJnZXQuY2hlY2tlZCl9KSk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQocyk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnR7cmVuZGVyKCl7Y29uc3QgZT1zdXBlci5yZW5kZXIoKTtlLmNsYXNzTmFtZT0iYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBwdXNoQnV0dG9uIjtyZXR1cm4gZX19Y2xhc3MgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLGUucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uIjtjb25zdCBlPXRoaXMuYW5ub3RhdGlvblN0b3JhZ2UsdD10aGlzLmRhdGEuaWQ7ZS5nZXRPckNyZWF0ZVZhbHVlKHQsdGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoPjA/dGhpcy5kYXRhLmZpZWxkVmFsdWVbMF06bnVsbCk7Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTtyLmRpc2FibGVkPXRoaXMuZGF0YS5yZWFkT25seTtyLm5hbWU9dGhpcy5kYXRhLmZpZWxkTmFtZTtpZighdGhpcy5kYXRhLmNvbWJvKXtyLnNpemU9dGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO3RoaXMuZGF0YS5tdWx0aVNlbGVjdCYmKHIubXVsdGlwbGU9ITApfWZvcihjb25zdCBlIG9mIHRoaXMuZGF0YS5vcHRpb25zKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO3QudGV4dENvbnRlbnQ9ZS5kaXNwbGF5VmFsdWU7dC52YWx1ZT1lLmV4cG9ydFZhbHVlO3RoaXMuZGF0YS5maWVsZFZhbHVlLmluY2x1ZGVzKGUuZXhwb3J0VmFsdWUpJiZ0LnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCEwKTtyLmFwcGVuZENoaWxkKHQpfXIuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLChmdW5jdGlvbihyKXtjb25zdCBuPXIudGFyZ2V0Lm9wdGlvbnMscz1uW24uc2VsZWN0ZWRJbmRleF0udmFsdWU7ZS5zZXRWYWx1ZSh0LHMpfSkpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsISghZS5kYXRhLnRpdGxlJiYhZS5kYXRhLmNvbnRlbnRzKSl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJwb3B1cEFubm90YXRpb24iO2lmKFsiTGluZSIsIlNxdWFyZSIsIkNpcmNsZSIsIlBvbHlMaW5lIiwiUG9seWdvbiIsIkluayJdLmluY2x1ZGVzKHRoaXMuZGF0YS5wYXJlbnRUeXBlKSlyZXR1cm4gdGhpcy5jb250YWluZXI7Y29uc3QgZT1gW2RhdGEtYW5ub3RhdGlvbi1pZD0iJHt0aGlzLmRhdGEucGFyZW50SWR9Il1gLHQ9dGhpcy5sYXllci5xdWVyeVNlbGVjdG9yKGUpO2lmKCF0KXJldHVybiB0aGlzLmNvbnRhaW5lcjtjb25zdCByPW5ldyBQb3B1cEVsZW1lbnQoe2NvbnRhaW5lcjp0aGlzLmNvbnRhaW5lcix0cmlnZ2VyOnQsY29sb3I6dGhpcy5kYXRhLmNvbG9yLHRpdGxlOnRoaXMuZGF0YS50aXRsZSxtb2RpZmljYXRpb25EYXRlOnRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlLGNvbnRlbnRzOnRoaXMuZGF0YS5jb250ZW50c30pLG49cGFyc2VGbG9hdCh0LnN0eWxlLmxlZnQpLHM9cGFyc2VGbG9hdCh0LnN0eWxlLndpZHRoKTt0aGlzLmNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm1PcmlnaW49YC0ke24rc31weCAtJHt0LnN0eWxlLnRvcH1gO3RoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQ9bitzKyJweCI7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoci5yZW5kZXIoKSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBQb3B1cEVsZW1lbnR7Y29uc3RydWN0b3IoZSl7dGhpcy5jb250YWluZXI9ZS5jb250YWluZXI7dGhpcy50cmlnZ2VyPWUudHJpZ2dlcjt0aGlzLmNvbG9yPWUuY29sb3I7dGhpcy50aXRsZT1lLnRpdGxlO3RoaXMubW9kaWZpY2F0aW9uRGF0ZT1lLm1vZGlmaWNhdGlvbkRhdGU7dGhpcy5jb250ZW50cz1lLmNvbnRlbnRzO3RoaXMuaGlkZVdyYXBwZXI9ZS5oaWRlV3JhcHBlcnx8ITE7dGhpcy5waW5uZWQ9ITF9cmVuZGVyKCl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0icG9wdXBXcmFwcGVyIjt0aGlzLmhpZGVFbGVtZW50PXRoaXMuaGlkZVdyYXBwZXI/ZTp0aGlzLmNvbnRhaW5lcjt0aGlzLmhpZGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0icG9wdXAiO2NvbnN0IHI9dGhpcy5jb2xvcjtpZihyKXtjb25zdCBlPS43KigyNTUtclswXSkrclswXSxuPS43KigyNTUtclsxXSkrclsxXSxhPS43KigyNTUtclsyXSkrclsyXTt0LnN0eWxlLmJhY2tncm91bmRDb2xvcj1zLlV0aWwubWFrZUNzc1JnYigwfGUsMHxuLDB8YSl9Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoMSIpO2EudGV4dENvbnRlbnQ9dGhpcy50aXRsZTt0LmFwcGVuZENoaWxkKGEpO2NvbnN0IGk9bi5QREZEYXRlU3RyaW5nLnRvRGF0ZU9iamVjdCh0aGlzLm1vZGlmaWNhdGlvbkRhdGUpO2lmKGkpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2UudGV4dENvbnRlbnQ9Int7ZGF0ZX19LCB7e3RpbWV9fSI7ZS5kYXRhc2V0LmwxMG5JZD0iYW5ub3RhdGlvbl9kYXRlX3N0cmluZyI7ZS5kYXRhc2V0LmwxMG5BcmdzPUpTT04uc3RyaW5naWZ5KHtkYXRlOmkudG9Mb2NhbGVEYXRlU3RyaW5nKCksdGltZTppLnRvTG9jYWxlVGltZVN0cmluZygpfSk7dC5hcHBlbmRDaGlsZChlKX1jb25zdCBvPXRoaXMuX2Zvcm1hdENvbnRlbnRzKHRoaXMuY29udGVudHMpO3QuYXBwZW5kQ2hpbGQobyk7dGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLl90b2dnbGUuYmluZCh0aGlzKSk7dGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5fc2hvdy5iaW5kKHRoaXMsITEpKTt0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuX2hpZGUuYmluZCh0aGlzLCExKSk7dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5faGlkZS5iaW5kKHRoaXMsITApKTtlLmFwcGVuZENoaWxkKHQpO3JldHVybiBlfV9mb3JtYXRDb250ZW50cyhlKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKSxyPWUuc3BsaXQoLyg/OlxyXG4/fFxuKS8pO2ZvcihsZXQgZT0wLG49ci5sZW5ndGg7ZTxuOysrZSl7Y29uc3Qgcz1yW2VdO3QuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocykpO2U8bi0xJiZ0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpfXJldHVybiB0fV90b2dnbGUoKXt0aGlzLnBpbm5lZD90aGlzLl9oaWRlKCEwKTp0aGlzLl9zaG93KCEwKX1fc2hvdyhlPSExKXtlJiYodGhpcy5waW5uZWQ9ITApO2lmKHRoaXMuaGlkZUVsZW1lbnQuaGFzQXR0cmlidXRlKCJoaWRkZW4iKSl7dGhpcy5oaWRlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpO3RoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCs9MX19X2hpZGUoZT0hMCl7ZSYmKHRoaXMucGlubmVkPSExKTtpZighdGhpcy5oaWRlRWxlbWVudC5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpJiYhdGhpcy5waW5uZWQpe3RoaXMuaGlkZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTt0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXgtPTF9fX1jbGFzcyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwhIShlLmRhdGEuaGFzUG9wdXB8fGUuZGF0YS50aXRsZXx8ZS5kYXRhLmNvbnRlbnRzKSwhMCl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJmcmVlVGV4dEFubm90YXRpb24iO3RoaXMuZGF0YS5oYXNQb3B1cHx8dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsbnVsbCx0aGlzLmRhdGEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgTGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwhIShlLmRhdGEuaGFzUG9wdXB8fGUuZGF0YS50aXRsZXx8ZS5kYXRhLmNvbnRlbnRzKSwhMCl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJsaW5lQW5ub3RhdGlvbiI7Y29uc3QgZT10aGlzLmRhdGEsdD1lLnJlY3RbMl0tZS5yZWN0WzBdLHI9ZS5yZWN0WzNdLWUucmVjdFsxXSxuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodCxyKSxzPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6bGluZSIpO3Muc2V0QXR0cmlidXRlKCJ4MSIsZS5yZWN0WzJdLWUubGluZUNvb3JkaW5hdGVzWzBdKTtzLnNldEF0dHJpYnV0ZSgieTEiLGUucmVjdFszXS1lLmxpbmVDb29yZGluYXRlc1sxXSk7cy5zZXRBdHRyaWJ1dGUoIngyIixlLnJlY3RbMl0tZS5saW5lQ29vcmRpbmF0ZXNbMl0pO3Muc2V0QXR0cmlidXRlKCJ5MiIsZS5yZWN0WzNdLWUubGluZUNvb3JkaW5hdGVzWzNdKTtzLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIixlLmJvcmRlclN0eWxlLndpZHRofHwxKTtzLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwidHJhbnNwYXJlbnQiKTtuLmFwcGVuZENoaWxkKHMpO3RoaXMuY29udGFpbmVyLmFwcGVuZChuKTt0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcixzLGUpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCEhKGUuZGF0YS5oYXNQb3B1cHx8ZS5kYXRhLnRpdGxlfHxlLmRhdGEuY29udGVudHMpLCEwKX1yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9InNxdWFyZUFubm90YXRpb24iO2NvbnN0IGU9dGhpcy5kYXRhLHQ9ZS5yZWN0WzJdLWUucmVjdFswXSxyPWUucmVjdFszXS1lLnJlY3RbMV0sbj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHQscikscz1lLmJvcmRlclN0eWxlLndpZHRoLGE9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7YS5zZXRBdHRyaWJ1dGUoIngiLHMvMik7YS5zZXRBdHRyaWJ1dGUoInkiLHMvMik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIix0LXMpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLHItcyk7YS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsc3x8MSk7YS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsInRyYW5zcGFyZW50Iik7YS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJub25lIik7bi5hcHBlbmRDaGlsZChhKTt0aGlzLmNvbnRhaW5lci5hcHBlbmQobik7dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsYSxlKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwhIShlLmRhdGEuaGFzUG9wdXB8fGUuZGF0YS50aXRsZXx8ZS5kYXRhLmNvbnRlbnRzKSwhMCl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJjaXJjbGVBbm5vdGF0aW9uIjtjb25zdCBlPXRoaXMuZGF0YSx0PWUucmVjdFsyXS1lLnJlY3RbMF0scj1lLnJlY3RbM10tZS5yZWN0WzFdLG49dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh0LHIpLHM9ZS5ib3JkZXJTdHlsZS53aWR0aCxhPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZWxsaXBzZSIpO2Euc2V0QXR0cmlidXRlKCJjeCIsdC8yKTthLnNldEF0dHJpYnV0ZSgiY3kiLHIvMik7YS5zZXRBdHRyaWJ1dGUoInJ4Iix0LzItcy8yKTthLnNldEF0dHJpYnV0ZSgicnkiLHIvMi1zLzIpO2Euc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLHN8fDEpO2Euc2V0QXR0cmlidXRlKCJzdHJva2UiLCJ0cmFuc3BhcmVudCIpO2Euc2V0QXR0cmlidXRlKCJmaWxsIiwibm9uZSIpO24uYXBwZW5kQ2hpbGQoYSk7dGhpcy5jb250YWluZXIuYXBwZW5kKG4pO3RoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLGEsZSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwhIShlLmRhdGEuaGFzUG9wdXB8fGUuZGF0YS50aXRsZXx8ZS5kYXRhLmNvbnRlbnRzKSwhMCk7dGhpcy5jb250YWluZXJDbGFzc05hbWU9InBvbHlsaW5lQW5ub3RhdGlvbiI7dGhpcy5zdmdFbGVtZW50TmFtZT0ic3ZnOnBvbHlsaW5lIn1yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9dGhpcy5jb250YWluZXJDbGFzc05hbWU7Y29uc3QgZT10aGlzLmRhdGEsdD1lLnJlY3RbMl0tZS5yZWN0WzBdLHI9ZS5yZWN0WzNdLWUucmVjdFsxXSxuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodCxyKTtsZXQgcz1bXTtmb3IoY29uc3QgdCBvZiBlLnZlcnRpY2VzKXtjb25zdCByPXQueC1lLnJlY3RbMF0sbj1lLnJlY3RbM10tdC55O3MucHVzaChyKyIsIituKX1zPXMuam9pbigiICIpO2NvbnN0IGE9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7YS5zZXRBdHRyaWJ1dGUoInBvaW50cyIscyk7YS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsZS5ib3JkZXJTdHlsZS53aWR0aHx8MSk7YS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsInRyYW5zcGFyZW50Iik7YS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJub25lIik7bi5hcHBlbmRDaGlsZChhKTt0aGlzLmNvbnRhaW5lci5hcHBlbmQobik7dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsYSxlKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5jb250YWluZXJDbGFzc05hbWU9InBvbHlnb25Bbm5vdGF0aW9uIjt0aGlzLnN2Z0VsZW1lbnROYW1lPSJzdmc6cG9seWdvbiJ9fWNsYXNzIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCEhKGUuZGF0YS5oYXNQb3B1cHx8ZS5kYXRhLnRpdGxlfHxlLmRhdGEuY29udGVudHMpLCEwKX1yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9ImNhcmV0QW5ub3RhdGlvbiI7dGhpcy5kYXRhLmhhc1BvcHVwfHx0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcixudWxsLHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBJbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsISEoZS5kYXRhLmhhc1BvcHVwfHxlLmRhdGEudGl0bGV8fGUuZGF0YS5jb250ZW50cyksITApO3RoaXMuY29udGFpbmVyQ2xhc3NOYW1lPSJpbmtBbm5vdGF0aW9uIjt0aGlzLnN2Z0VsZW1lbnROYW1lPSJzdmc6cG9seWxpbmUifXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT10aGlzLmNvbnRhaW5lckNsYXNzTmFtZTtjb25zdCBlPXRoaXMuZGF0YSx0PWUucmVjdFsyXS1lLnJlY3RbMF0scj1lLnJlY3RbM10tZS5yZWN0WzFdLG49dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh0LHIpO2Zvcihjb25zdCB0IG9mIGUuaW5rTGlzdHMpe2xldCByPVtdO2Zvcihjb25zdCBuIG9mIHQpe2NvbnN0IHQ9bi54LWUucmVjdFswXSxzPWUucmVjdFszXS1uLnk7ci5wdXNoKGAke3R9LCR7c31gKX1yPXIuam9pbigiICIpO2NvbnN0IHM9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7cy5zZXRBdHRyaWJ1dGUoInBvaW50cyIscik7cy5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsZS5ib3JkZXJTdHlsZS53aWR0aHx8MSk7cy5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsInRyYW5zcGFyZW50Iik7cy5zZXRBdHRyaWJ1dGUoImZpbGwiLCJub25lIik7dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIscyxlKTtuLmFwcGVuZENoaWxkKHMpfXRoaXMuY29udGFpbmVyLmFwcGVuZChuKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwhIShlLmRhdGEuaGFzUG9wdXB8fGUuZGF0YS50aXRsZXx8ZS5kYXRhLmNvbnRlbnRzKSwhMCl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJoaWdobGlnaHRBbm5vdGF0aW9uIjt0aGlzLmRhdGEuaGFzUG9wdXB8fHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLG51bGwsdGhpcy5kYXRhKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIFVuZGVybGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwhIShlLmRhdGEuaGFzUG9wdXB8fGUuZGF0YS50aXRsZXx8ZS5kYXRhLmNvbnRlbnRzKSwhMCl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJ1bmRlcmxpbmVBbm5vdGF0aW9uIjt0aGlzLmRhdGEuaGFzUG9wdXB8fHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLG51bGwsdGhpcy5kYXRhKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCEhKGUuZGF0YS5oYXNQb3B1cHx8ZS5kYXRhLnRpdGxlfHxlLmRhdGEuY29udGVudHMpLCEwKX1yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9InNxdWlnZ2x5QW5ub3RhdGlvbiI7dGhpcy5kYXRhLmhhc1BvcHVwfHx0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcixudWxsLHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsISEoZS5kYXRhLmhhc1BvcHVwfHxlLmRhdGEudGl0bGV8fGUuZGF0YS5jb250ZW50cyksITApfXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0ic3RyaWtlb3V0QW5ub3RhdGlvbiI7dGhpcy5kYXRhLmhhc1BvcHVwfHx0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcixudWxsLHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBTdGFtcEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwhIShlLmRhdGEuaGFzUG9wdXB8fGUuZGF0YS50aXRsZXx8ZS5kYXRhLmNvbnRlbnRzKSwhMCl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJzdGFtcEFubm90YXRpb24iO3RoaXMuZGF0YS5oYXNQb3B1cHx8dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsbnVsbCx0aGlzLmRhdGEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsITApO2NvbnN0e2ZpbGVuYW1lOnQsY29udGVudDpyfT10aGlzLmRhdGEuZmlsZTt0aGlzLmZpbGVuYW1lPSgwLG4uZ2V0RmlsZW5hbWVGcm9tVXJsKSh0KTt0aGlzLmNvbnRlbnQ9cjt0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzJiZ0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzLmRpc3BhdGNoKCJmaWxlYXR0YWNobWVudGFubm90YXRpb24iLHtzb3VyY2U6dGhpcyxpZDooMCxzLnN0cmluZ1RvUERGU3RyaW5nKSh0KSxmaWxlbmFtZTp0LGNvbnRlbnQ6cn0pfXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0iZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIjtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodDtlLnN0eWxlLndpZHRoPXRoaXMuY29udGFpbmVyLnN0eWxlLndpZHRoO2UuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLHRoaXMuX2Rvd25sb2FkLmJpbmQodGhpcykpO3RoaXMuZGF0YS5oYXNQb3B1cHx8IXRoaXMuZGF0YS50aXRsZSYmIXRoaXMuZGF0YS5jb250ZW50c3x8dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsZSx0aGlzLmRhdGEpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGUpO3JldHVybiB0aGlzLmNvbnRhaW5lcn1fZG93bmxvYWQoKXt0aGlzLmRvd25sb2FkTWFuYWdlcj90aGlzLmRvd25sb2FkTWFuYWdlci5kb3dubG9hZERhdGEodGhpcy5jb250ZW50LHRoaXMuZmlsZW5hbWUsIiIpOigwLHMud2FybikoIkRvd25sb2FkIGNhbm5vdCBiZSBzdGFydGVkIGR1ZSB0byB1bmF2YWlsYWJsZSBkb3dubG9hZCBtYW5hZ2VyIil9fXQuQW5ub3RhdGlvbkxheWVyPWNsYXNzIEFubm90YXRpb25MYXllcntzdGF0aWMgcmVuZGVyKGUpe2NvbnN0IHQ9W10scj1bXTtmb3IoY29uc3QgbiBvZiBlLmFubm90YXRpb25zKW4mJihuLmFubm90YXRpb25UeXBlIT09cy5Bbm5vdGF0aW9uVHlwZS5QT1BVUD90LnB1c2gobik6ci5wdXNoKG4pKTtyLmxlbmd0aCYmdC5wdXNoKC4uLnIpO2Zvcihjb25zdCByIG9mIHQpe2NvbnN0IHQ9QW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5LmNyZWF0ZSh7ZGF0YTpyLGxheWVyOmUuZGl2LHBhZ2U6ZS5wYWdlLHZpZXdwb3J0OmUudmlld3BvcnQsbGlua1NlcnZpY2U6ZS5saW5rU2VydmljZSxkb3dubG9hZE1hbmFnZXI6ZS5kb3dubG9hZE1hbmFnZXIsaW1hZ2VSZXNvdXJjZXNQYXRoOmUuaW1hZ2VSZXNvdXJjZXNQYXRofHwiIixyZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiJib29sZWFuIiE9dHlwZW9mIGUucmVuZGVySW50ZXJhY3RpdmVGb3Jtc3x8ZS5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLHN2Z0ZhY3Rvcnk6bmV3IG4uRE9NU1ZHRmFjdG9yeSxhbm5vdGF0aW9uU3RvcmFnZTplLmFubm90YXRpb25TdG9yYWdlfHxuZXcgYS5Bbm5vdGF0aW9uU3RvcmFnZX0pO3QuaXNSZW5kZXJhYmxlJiZlLmRpdi5hcHBlbmRDaGlsZCh0LnJlbmRlcigpKX19c3RhdGljIHVwZGF0ZShlKXtmb3IoY29uc3QgdCBvZiBlLmFubm90YXRpb25zKXtjb25zdCByPWUuZGl2LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFubm90YXRpb24taWQ9IiR7dC5pZH0iXWApO3ImJihyLnN0eWxlLnRyYW5zZm9ybT1gbWF0cml4KCR7ZS52aWV3cG9ydC50cmFuc2Zvcm0uam9pbigiLCIpfSlgKX1lLmRpdi5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpfX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QucmVuZGVyVGV4dExheWVyPXZvaWQgMDt2YXIgbj1yKDIpLHM9ZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyQ2xvc3VyZSgpe3ZhciBlPS9cUy87ZnVuY3Rpb24gYXBwZW5kVGV4dCh0LHIscyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLGk9e2FuZ2xlOjAsY2FudmFzV2lkdGg6MCxpc1doaXRlc3BhY2U6ITEsb3JpZ2luYWxUcmFuc2Zvcm06bnVsbCxwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6MCxwYWRkaW5nUmlnaHQ6MCxwYWRkaW5nVG9wOjAsc2NhbGU6MX07dC5fdGV4dERpdnMucHVzaChhKTtpZihmdW5jdGlvbiBpc0FsbFdoaXRlc3BhY2UodCl7cmV0dXJuIWUudGVzdCh0KX0oci5zdHIpKXtpLmlzV2hpdGVzcGFjZT0hMDt0Ll90ZXh0RGl2UHJvcGVydGllcy5zZXQoYSxpKTtyZXR1cm59dmFyIG89bi5VdGlsLnRyYW5zZm9ybSh0Ll92aWV3cG9ydC50cmFuc2Zvcm0sci50cmFuc2Zvcm0pLGw9TWF0aC5hdGFuMihvWzFdLG9bMF0pLGM9c1tyLmZvbnROYW1lXTtjLnZlcnRpY2FsJiYobCs9TWF0aC5QSS8yKTt2YXIgaD1NYXRoLnNxcnQob1syXSpvWzJdK29bM10qb1szXSksZD1oO2MuYXNjZW50P2Q9Yy5hc2NlbnQqZDpjLmRlc2NlbnQmJihkPSgxK2MuZGVzY2VudCkqZCk7bGV0IHUscDtpZigwPT09bCl7dT1vWzRdO3A9b1s1XS1kfWVsc2V7dT1vWzRdK2QqTWF0aC5zaW4obCk7cD1vWzVdLWQqTWF0aC5jb3MobCl9YS5zdHlsZS5sZWZ0PXUrInB4IjthLnN0eWxlLnRvcD1wKyJweCI7YS5zdHlsZS5mb250U2l6ZT1oKyJweCI7YS5zdHlsZS5mb250RmFtaWx5PWMuZm9udEZhbWlseTthLnRleHRDb250ZW50PXIuc3RyO3QuX2ZvbnRJbnNwZWN0b3JFbmFibGVkJiYoYS5kYXRhc2V0LmZvbnROYW1lPXIuZm9udE5hbWUpOzAhPT1sJiYoaS5hbmdsZT1sKigxODAvTWF0aC5QSSkpO2xldCBmPSExO2lmKHIuc3RyLmxlbmd0aD4xKWY9ITA7ZWxzZSBpZihyLnRyYW5zZm9ybVswXSE9PXIudHJhbnNmb3JtWzNdKXtjb25zdCBlPU1hdGguYWJzKHIudHJhbnNmb3JtWzBdKSx0PU1hdGguYWJzKHIudHJhbnNmb3JtWzNdKTtlIT09dCYmTWF0aC5tYXgoZSx0KS9NYXRoLm1pbihlLHQpPjEuNSYmKGY9ITApfWYmJihjLnZlcnRpY2FsP2kuY2FudmFzV2lkdGg9ci5oZWlnaHQqdC5fdmlld3BvcnQuc2NhbGU6aS5jYW52YXNXaWR0aD1yLndpZHRoKnQuX3ZpZXdwb3J0LnNjYWxlKTt0Ll90ZXh0RGl2UHJvcGVydGllcy5zZXQoYSxpKTt0Ll90ZXh0Q29udGVudFN0cmVhbSYmdC5fbGF5b3V0VGV4dChhKTtpZih0Ll9lbmhhbmNlVGV4dFNlbGVjdGlvbil7dmFyIGc9MSxtPTA7aWYoMCE9PWwpe2c9TWF0aC5jb3MobCk7bT1NYXRoLnNpbihsKX12YXIgXyxBLGI9KGMudmVydGljYWw/ci5oZWlnaHQ6ci53aWR0aCkqdC5fdmlld3BvcnQuc2NhbGUseT1oO2lmKDAhPT1sKXtfPVtnLG0sLW0sZyx1LHBdO0E9bi5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLDAsYix5XSxfKX1lbHNlIEE9W3UscCx1K2IscCt5XTt0Ll9ib3VuZHMucHVzaCh7bGVmdDpBWzBdLHRvcDpBWzFdLHJpZ2h0OkFbMl0sYm90dG9tOkFbM10sZGl2OmEsc2l6ZTpbYix5XSxtOl99KX19ZnVuY3Rpb24gcmVuZGVyKGUpe2lmKCFlLl9jYW5jZWxlZCl7dmFyIHQ9ZS5fdGV4dERpdnMscj1lLl9jYXBhYmlsaXR5LG49dC5sZW5ndGg7aWYobj4xZTUpe2UuX3JlbmRlcmluZ0RvbmU9ITA7ci5yZXNvbHZlKCl9ZWxzZXtpZighZS5fdGV4dENvbnRlbnRTdHJlYW0pZm9yKHZhciBzPTA7czxuO3MrKyllLl9sYXlvdXRUZXh0KHRbc10pO2UuX3JlbmRlcmluZ0RvbmU9ITA7ci5yZXNvbHZlKCl9fX1mdW5jdGlvbiBmaW5kUG9zaXRpdmVNaW4oZSx0LHIpe2xldCBuPTA7Zm9yKGxldCBzPTA7czxyO3MrKyl7Y29uc3Qgcj1lW3QrK107cj4wJiYobj1uP01hdGgubWluKHIsbik6cil9cmV0dXJuIG59ZnVuY3Rpb24gZXhwYW5kKGUpe2Zvcih2YXIgdD1lLl9ib3VuZHMscj1lLl92aWV3cG9ydCxzPWZ1bmN0aW9uIGV4cGFuZEJvdW5kcyhlLHQscil7dmFyIG49ci5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJue3gxOmUubGVmdCx5MTplLnRvcCx4MjplLnJpZ2h0LHkyOmUuYm90dG9tLGluZGV4OnQseDFOZXc6dm9pZCAwLHgyTmV3OnZvaWQgMH19KSk7ZXhwYW5kQm91bmRzTFRSKGUsbik7dmFyIHM9bmV3IEFycmF5KHIubGVuZ3RoKTtuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXg7c1t0XT17bGVmdDplLngxTmV3LHRvcDowLHJpZ2h0OmUueDJOZXcsYm90dG9tOjB9fSkpO3IubWFwKChmdW5jdGlvbih0LHIpe3ZhciBhPXNbcl0saT1uW3JdO2kueDE9dC50b3A7aS55MT1lLWEucmlnaHQ7aS54Mj10LmJvdHRvbTtpLnkyPWUtYS5sZWZ0O2kuaW5kZXg9cjtpLngxTmV3PXZvaWQgMDtpLngyTmV3PXZvaWQgMH0pKTtleHBhbmRCb3VuZHNMVFIodCxuKTtuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXg7c1t0XS50b3A9ZS54MU5ldztzW3RdLmJvdHRvbT1lLngyTmV3fSkpO3JldHVybiBzfShyLndpZHRoLHIuaGVpZ2h0LHQpLGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIGk9dFthXS5kaXYsbz1lLl90ZXh0RGl2UHJvcGVydGllcy5nZXQoaSk7aWYoMCE9PW8uYW5nbGUpe3ZhciBsPXNbYV0sYz10W2FdLGg9Yy5tLGQ9aFswXSx1PWhbMV0scD1bWzAsMF0sWzAsYy5zaXplWzFdXSxbYy5zaXplWzBdLDBdLGMuc2l6ZV0sZj1uZXcgRmxvYXQ2NEFycmF5KDY0KTtwLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7dmFyIHI9bi5VdGlsLmFwcGx5VHJhbnNmb3JtKGUsaCk7Zlt0KzBdPWQmJihsLmxlZnQtclswXSkvZDtmW3QrNF09dSYmKGwudG9wLXJbMV0pL3U7Zlt0KzhdPWQmJihsLnJpZ2h0LXJbMF0pL2Q7Zlt0KzEyXT11JiYobC5ib3R0b20tclsxXSkvdTtmW3QrMTZdPXUmJihsLmxlZnQtclswXSkvLXU7Zlt0KzIwXT1kJiYobC50b3AtclsxXSkvZDtmW3QrMjRdPXUmJihsLnJpZ2h0LXJbMF0pLy11O2ZbdCsyOF09ZCYmKGwuYm90dG9tLXJbMV0pL2Q7Zlt0KzMyXT1kJiYobC5sZWZ0LXJbMF0pLy1kO2ZbdCszNl09dSYmKGwudG9wLXJbMV0pLy11O2ZbdCs0MF09ZCYmKGwucmlnaHQtclswXSkvLWQ7Zlt0KzQ0XT11JiYobC5ib3R0b20tclsxXSkvLXU7Zlt0KzQ4XT11JiYobC5sZWZ0LXJbMF0pL3U7Zlt0KzUyXT1kJiYobC50b3AtclsxXSkvLWQ7Zlt0KzU2XT11JiYobC5yaWdodC1yWzBdKS91O2ZbdCs2MF09ZCYmKGwuYm90dG9tLXJbMV0pLy1kfSkpO3ZhciBnPTErTWF0aC5taW4oTWF0aC5hYnMoZCksTWF0aC5hYnModSkpO28ucGFkZGluZ0xlZnQ9ZmluZFBvc2l0aXZlTWluKGYsMzIsMTYpL2c7by5wYWRkaW5nVG9wPWZpbmRQb3NpdGl2ZU1pbihmLDQ4LDE2KS9nO28ucGFkZGluZ1JpZ2h0PWZpbmRQb3NpdGl2ZU1pbihmLDAsMTYpL2c7by5wYWRkaW5nQm90dG9tPWZpbmRQb3NpdGl2ZU1pbihmLDE2LDE2KS9nO2UuX3RleHREaXZQcm9wZXJ0aWVzLnNldChpLG8pfWVsc2V7by5wYWRkaW5nTGVmdD10W2FdLmxlZnQtc1thXS5sZWZ0O28ucGFkZGluZ1RvcD10W2FdLnRvcC1zW2FdLnRvcDtvLnBhZGRpbmdSaWdodD1zW2FdLnJpZ2h0LXRbYV0ucmlnaHQ7by5wYWRkaW5nQm90dG9tPXNbYV0uYm90dG9tLXRbYV0uYm90dG9tO2UuX3RleHREaXZQcm9wZXJ0aWVzLnNldChpLG8pfX19ZnVuY3Rpb24gZXhwYW5kQm91bmRzTFRSKGUsdCl7dC5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLngxLXQueDF8fGUuaW5kZXgtdC5pbmRleH0pKTt2YXIgcj1be3N0YXJ0Oi0xLzAsZW5kOjEvMCxib3VuZGFyeTp7eDE6LTEvMCx5MTotMS8wLHgyOjAseTI6MS8wLGluZGV4Oi0xLHgxTmV3OjAseDJOZXc6MH19XTt0LmZvckVhY2goKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ci5sZW5ndGgmJnJbdF0uZW5kPD1lLnkxOyl0Kys7Zm9yKHZhciBuLHMsYT1yLmxlbmd0aC0xO2E+PTAmJnJbYV0uc3RhcnQ+PWUueTI7KWEtLTt2YXIgaSxvLGw9LTEvMDtmb3IoaT10O2k8PWE7aSsrKXt2YXIgYzsoYz0ocz0obj1yW2ldKS5ib3VuZGFyeSkueDI+ZS54MT9zLmluZGV4PmUuaW5kZXg/cy54MU5ldzplLngxOnZvaWQgMD09PXMueDJOZXc/KHMueDIrZS54MSkvMjpzLngyTmV3KT5sJiYobD1jKX1lLngxTmV3PWw7Zm9yKGk9dDtpPD1hO2krKyl2b2lkIDA9PT0ocz0obj1yW2ldKS5ib3VuZGFyeSkueDJOZXc/cy54Mj5lLngxP3MuaW5kZXg+ZS5pbmRleCYmKHMueDJOZXc9cy54Mik6cy54Mk5ldz1sOnMueDJOZXc+bCYmKHMueDJOZXc9TWF0aC5tYXgobCxzLngyKSk7dmFyIGg9W10sZD1udWxsO2ZvcihpPXQ7aTw9YTtpKyspe3ZhciB1PShzPShuPXJbaV0pLmJvdW5kYXJ5KS54Mj5lLngyP3M6ZTtpZihkPT09dSloW2gubGVuZ3RoLTFdLmVuZD1uLmVuZDtlbHNle2gucHVzaCh7c3RhcnQ6bi5zdGFydCxlbmQ6bi5lbmQsYm91bmRhcnk6dX0pO2Q9dX19aWYoclt0XS5zdGFydDxlLnkxKXtoWzBdLnN0YXJ0PWUueTE7aC51bnNoaWZ0KHtzdGFydDpyW3RdLnN0YXJ0LGVuZDplLnkxLGJvdW5kYXJ5OnJbdF0uYm91bmRhcnl9KX1pZihlLnkyPHJbYV0uZW5kKXtoW2gubGVuZ3RoLTFdLmVuZD1lLnkyO2gucHVzaCh7c3RhcnQ6ZS55MixlbmQ6clthXS5lbmQsYm91bmRhcnk6clthXS5ib3VuZGFyeX0pfWZvcihpPXQ7aTw9YTtpKyspaWYodm9pZCAwPT09KHM9KG49cltpXSkuYm91bmRhcnkpLngyTmV3KXt2YXIgcD0hMTtmb3Iobz10LTE7IXAmJm8+PTAmJnJbb10uc3RhcnQ+PXMueTE7by0tKXA9cltvXS5ib3VuZGFyeT09PXM7Zm9yKG89YSsxOyFwJiZvPHIubGVuZ3RoJiZyW29dLmVuZDw9cy55MjtvKyspcD1yW29dLmJvdW5kYXJ5PT09cztmb3Iobz0wOyFwJiZvPGgubGVuZ3RoO28rKylwPWhbb10uYm91bmRhcnk9PT1zO3B8fChzLngyTmV3PWwpfUFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkocixbdCxhLXQrMV0uY29uY2F0KGgpKX0pKTtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPXQuYm91bmRhcnk7dm9pZCAwPT09ci54Mk5ldyYmKHIueDJOZXc9TWF0aC5tYXgoZSxyLngyKSl9KSl9ZnVuY3Rpb24gVGV4dExheWVyUmVuZGVyVGFzayh7dGV4dENvbnRlbnQ6ZSx0ZXh0Q29udGVudFN0cmVhbTp0LGNvbnRhaW5lcjpyLHZpZXdwb3J0OnMsdGV4dERpdnM6YSx0ZXh0Q29udGVudEl0ZW1zU3RyOmksZW5oYW5jZVRleHRTZWxlY3Rpb246b30pe3RoaXMuX3RleHRDb250ZW50PWU7dGhpcy5fdGV4dENvbnRlbnRTdHJlYW09dDt0aGlzLl9jb250YWluZXI9cjt0aGlzLl9kb2N1bWVudD1yLm93bmVyRG9jdW1lbnQ7dGhpcy5fdmlld3BvcnQ9czt0aGlzLl90ZXh0RGl2cz1hfHxbXTt0aGlzLl90ZXh0Q29udGVudEl0ZW1zU3RyPWl8fFtdO3RoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uPSEhbzt0aGlzLl9mb250SW5zcGVjdG9yRW5hYmxlZD0hKCFnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3J8fCFnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IuZW5hYmxlZCk7dGhpcy5fcmVhZGVyPW51bGw7dGhpcy5fbGF5b3V0VGV4dExhc3RGb250U2l6ZT1udWxsO3RoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseT1udWxsO3RoaXMuX2xheW91dFRleHRDdHg9bnVsbDt0aGlzLl90ZXh0RGl2UHJvcGVydGllcz1uZXcgV2Vha01hcDt0aGlzLl9yZW5kZXJpbmdEb25lPSExO3RoaXMuX2NhbmNlbGVkPSExO3RoaXMuX2NhcGFiaWxpdHk9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9yZW5kZXJUaW1lcj1udWxsO3RoaXMuX2JvdW5kcz1bXTt0aGlzLl9jYXBhYmlsaXR5LnByb21pc2UuZmluYWxseSgoKT0+e2lmKHRoaXMuX2xheW91dFRleHRDdHgpe3RoaXMuX2xheW91dFRleHRDdHguY2FudmFzLndpZHRoPTA7dGhpcy5fbGF5b3V0VGV4dEN0eC5jYW52YXMuaGVpZ2h0PTA7dGhpcy5fbGF5b3V0VGV4dEN0eD1udWxsfX0pLmNhdGNoKCgpPT57fSl9VGV4dExheWVyUmVuZGVyVGFzay5wcm90b3R5cGU9e2dldCBwcm9taXNlKCl7cmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZX0sY2FuY2VsOmZ1bmN0aW9uIFRleHRMYXllcl9jYW5jZWwoKXt0aGlzLl9jYW5jZWxlZD0hMDtpZih0aGlzLl9yZWFkZXIpe3RoaXMuX3JlYWRlci5jYW5jZWwobmV3IG4uQWJvcnRFeGNlcHRpb24oIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC4iKSk7dGhpcy5fcmVhZGVyPW51bGx9aWYobnVsbCE9PXRoaXMuX3JlbmRlclRpbWVyKXtjbGVhclRpbWVvdXQodGhpcy5fcmVuZGVyVGltZXIpO3RoaXMuX3JlbmRlclRpbWVyPW51bGx9dGhpcy5fY2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuIikpfSxfcHJvY2Vzc0l0ZW1zKGUsdCl7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXt0aGlzLl90ZXh0Q29udGVudEl0ZW1zU3RyLnB1c2goZVtyXS5zdHIpO2FwcGVuZFRleHQodGhpcyxlW3JdLHQpfX0sX2xheW91dFRleHQoZSl7Y29uc3QgdD10aGlzLl90ZXh0RGl2UHJvcGVydGllcy5nZXQoZSk7aWYodC5pc1doaXRlc3BhY2UpcmV0dXJuO2xldCByPSIiO2lmKDAhPT10LmNhbnZhc1dpZHRoKXtjb25zdHtmb250U2l6ZTpuLGZvbnRGYW1pbHk6c309ZS5zdHlsZTtpZihuIT09dGhpcy5fbGF5b3V0VGV4dExhc3RGb250U2l6ZXx8cyE9PXRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSl7dGhpcy5fbGF5b3V0VGV4dEN0eC5mb250PWAke259ICR7c31gO3RoaXMuX2xheW91dFRleHRMYXN0Rm9udFNpemU9bjt0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRGYW1pbHk9c31jb25zdHt3aWR0aDphfT10aGlzLl9sYXlvdXRUZXh0Q3R4Lm1lYXN1cmVUZXh0KGUudGV4dENvbnRlbnQpO2lmKGE+MCl7dC5zY2FsZT10LmNhbnZhc1dpZHRoL2E7cj1gc2NhbGVYKCR7dC5zY2FsZX0pYH19MCE9PXQuYW5nbGUmJihyPWByb3RhdGUoJHt0LmFuZ2xlfWRlZykgJHtyfWApO2lmKHIubGVuZ3RoPjApe3RoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uJiYodC5vcmlnaW5hbFRyYW5zZm9ybT1yKTtlLnN0eWxlLnRyYW5zZm9ybT1yfXRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLnNldChlLHQpO3RoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChlKX0sX3JlbmRlcjpmdW5jdGlvbiBUZXh0TGF5ZXJfcmVuZGVyKGUpe2NvbnN0IHQ9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtsZXQgcj1PYmplY3QuY3JlYXRlKG51bGwpO2NvbnN0IHM9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cy5tb3pPcGFxdWU9ITA7dGhpcy5fbGF5b3V0VGV4dEN0eD1zLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITF9KTtpZih0aGlzLl90ZXh0Q29udGVudCl7Y29uc3QgZT10aGlzLl90ZXh0Q29udGVudC5pdGVtcyxyPXRoaXMuX3RleHRDb250ZW50LnN0eWxlczt0aGlzLl9wcm9jZXNzSXRlbXMoZSxyKTt0LnJlc29sdmUoKX1lbHNle2lmKCF0aGlzLl90ZXh0Q29udGVudFN0cmVhbSl0aHJvdyBuZXcgRXJyb3IoJ05laXRoZXIgInRleHRDb250ZW50IiBub3IgInRleHRDb250ZW50U3RyZWFtIiBwYXJhbWV0ZXJzIHNwZWNpZmllZC4nKTt7Y29uc3QgcHVtcD0oKT0+e3RoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoe3ZhbHVlOmUsZG9uZTpufSk9PntpZihuKXQucmVzb2x2ZSgpO2Vsc2V7T2JqZWN0LmFzc2lnbihyLGUuc3R5bGVzKTt0aGlzLl9wcm9jZXNzSXRlbXMoZS5pdGVtcyxyKTtwdW1wKCl9fSx0LnJlamVjdCl9O3RoaXMuX3JlYWRlcj10aGlzLl90ZXh0Q29udGVudFN0cmVhbS5nZXRSZWFkZXIoKTtwdW1wKCl9fXQucHJvbWlzZS50aGVuKCgpPT57cj1udWxsO2U/dGhpcy5fcmVuZGVyVGltZXI9c2V0VGltZW91dCgoKT0+e3JlbmRlcih0aGlzKTt0aGlzLl9yZW5kZXJUaW1lcj1udWxsfSxlKTpyZW5kZXIodGhpcyl9LHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KX0sZXhwYW5kVGV4dERpdnM6ZnVuY3Rpb24gVGV4dExheWVyX2V4cGFuZFRleHREaXZzKGUpe2lmKCF0aGlzLl9lbmhhbmNlVGV4dFNlbGVjdGlvbnx8IXRoaXMuX3JlbmRlcmluZ0RvbmUpcmV0dXJuO2lmKG51bGwhPT10aGlzLl9ib3VuZHMpe2V4cGFuZCh0aGlzKTt0aGlzLl9ib3VuZHM9bnVsbH1jb25zdCB0PVtdLHI9W107Zm9yKHZhciBuPTAscz10aGlzLl90ZXh0RGl2cy5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgcz10aGlzLl90ZXh0RGl2c1tuXSxhPXRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldChzKTtpZighYS5pc1doaXRlc3BhY2UpaWYoZSl7dC5sZW5ndGg9MDtyLmxlbmd0aD0wO2Eub3JpZ2luYWxUcmFuc2Zvcm0mJnQucHVzaChhLm9yaWdpbmFsVHJhbnNmb3JtKTtpZihhLnBhZGRpbmdUb3A+MCl7ci5wdXNoKGEucGFkZGluZ1RvcCsicHgiKTt0LnB1c2goYHRyYW5zbGF0ZVkoJHstYS5wYWRkaW5nVG9wfXB4KWApfWVsc2Ugci5wdXNoKDApO2EucGFkZGluZ1JpZ2h0PjA/ci5wdXNoKGEucGFkZGluZ1JpZ2h0L2Euc2NhbGUrInB4Iik6ci5wdXNoKDApO2EucGFkZGluZ0JvdHRvbT4wP3IucHVzaChhLnBhZGRpbmdCb3R0b20rInB4Iik6ci5wdXNoKDApO2lmKGEucGFkZGluZ0xlZnQ+MCl7ci5wdXNoKGEucGFkZGluZ0xlZnQvYS5zY2FsZSsicHgiKTt0LnB1c2goYHRyYW5zbGF0ZVgoJHstYS5wYWRkaW5nTGVmdC9hLnNjYWxlfXB4KWApfWVsc2Ugci5wdXNoKDApO3Muc3R5bGUucGFkZGluZz1yLmpvaW4oIiAiKTt0Lmxlbmd0aCYmKHMuc3R5bGUudHJhbnNmb3JtPXQuam9pbigiICIpKX1lbHNle3Muc3R5bGUucGFkZGluZz1udWxsO3Muc3R5bGUudHJhbnNmb3JtPWEub3JpZ2luYWxUcmFuc2Zvcm19fX19O3JldHVybiBmdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXIoZSl7dmFyIHQ9bmV3IFRleHRMYXllclJlbmRlclRhc2soe3RleHRDb250ZW50OmUudGV4dENvbnRlbnQsdGV4dENvbnRlbnRTdHJlYW06ZS50ZXh0Q29udGVudFN0cmVhbSxjb250YWluZXI6ZS5jb250YWluZXIsdmlld3BvcnQ6ZS52aWV3cG9ydCx0ZXh0RGl2czplLnRleHREaXZzLHRleHRDb250ZW50SXRlbXNTdHI6ZS50ZXh0Q29udGVudEl0ZW1zU3RyLGVuaGFuY2VUZXh0U2VsZWN0aW9uOmUuZW5oYW5jZVRleHRTZWxlY3Rpb259KTt0Ll9yZW5kZXIoZS50aW1lb3V0KTtyZXR1cm4gdH19KCk7dC5yZW5kZXJUZXh0TGF5ZXI9c30sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5TVkdHcmFwaGljcz12b2lkIDA7dmFyIG49cigyKSxzPXIoMSksYT1yKDQpO2xldCBTVkdHcmFwaGljcz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBTVkdHcmFwaGljcyIpfTt0LlNWR0dyYXBoaWNzPVNWR0dyYXBoaWNzO3tjb25zdCBlPXtmb250U3R5bGU6Im5vcm1hbCIsZm9udFdlaWdodDoibm9ybWFsIixmaWxsQ29sb3I6IiMwMDAwMDAifSxyPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLGk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLG89WyJidXR0Iiwicm91bmQiLCJzcXVhcmUiXSxsPVsibWl0ZXIiLCJyb3VuZCIsImJldmVsIl0sYz1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoWzEzNyw4MCw3OCw3MSwxMywxMCwyNiwxMF0pLHQ9bmV3IEludDMyQXJyYXkoMjU2KTtmb3IobGV0IGU9MDtlPDI1NjtlKyspe2xldCByPWU7Zm9yKGxldCBlPTA7ZTw4O2UrKylyPTEmcj8zOTg4MjkyMzg0XnI+PjEmMjE0NzQ4MzY0NzpyPj4xJjIxNDc0ODM2NDc7dFtlXT1yfWZ1bmN0aW9uIHdyaXRlUG5nQ2h1bmsoZSxyLG4scyl7bGV0IGE9cztjb25zdCBpPXIubGVuZ3RoO25bYV09aT4+MjQmMjU1O25bYSsxXT1pPj4xNiYyNTU7blthKzJdPWk+PjgmMjU1O25bYSszXT0yNTUmaTthKz00O25bYV09MjU1JmUuY2hhckNvZGVBdCgwKTtuW2ErMV09MjU1JmUuY2hhckNvZGVBdCgxKTtuW2ErMl09MjU1JmUuY2hhckNvZGVBdCgyKTtuW2ErM109MjU1JmUuY2hhckNvZGVBdCgzKTthKz00O24uc2V0KHIsYSk7YSs9ci5sZW5ndGg7Y29uc3Qgbz1mdW5jdGlvbiBjcmMzMihlLHIsbil7bGV0IHM9LTE7Zm9yKGxldCBhPXI7YTxuO2ErKyl7Y29uc3Qgcj0yNTUmKHNeZVthXSk7cz1zPj4+OF50W3JdfXJldHVybi0xXnN9KG4scys0LGEpO25bYV09bz4+MjQmMjU1O25bYSsxXT1vPj4xNiYyNTU7blthKzJdPW8+PjgmMjU1O25bYSszXT0yNTUmb31mdW5jdGlvbiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZChlKXtsZXQgdD1lLmxlbmd0aDtjb25zdCByPU1hdGguY2VpbCh0LzY1NTM1KSxuPW5ldyBVaW50OEFycmF5KDIrdCs1KnIrNCk7bGV0IHM9MDtuW3MrK109MTIwO25bcysrXT0xNTY7bGV0IGE9MDtmb3IoO3Q+NjU1MzU7KXtuW3MrK109MDtuW3MrK109MjU1O25bcysrXT0yNTU7bltzKytdPTA7bltzKytdPTA7bi5zZXQoZS5zdWJhcnJheShhLGErNjU1MzUpLHMpO3MrPTY1NTM1O2ErPTY1NTM1O3QtPTY1NTM1fW5bcysrXT0xO25bcysrXT0yNTUmdDtuW3MrK109dD4+OCYyNTU7bltzKytdPTI1NSZ+dDtuW3MrK109KDY1NTM1Jn50KT4+OCYyNTU7bi5zZXQoZS5zdWJhcnJheShhKSxzKTtzKz1lLmxlbmd0aC1hO2NvbnN0IGk9ZnVuY3Rpb24gYWRsZXIzMihlLHQscil7bGV0IG49MSxzPTA7Zm9yKGxldCBhPXQ7YTxyOysrYSl7bj0obisoMjU1JmVbYV0pKSU2NTUyMTtzPShzK24pJTY1NTIxfXJldHVybiBzPDwxNnxufShlLDAsZS5sZW5ndGgpO25bcysrXT1pPj4yNCYyNTU7bltzKytdPWk+PjE2JjI1NTtuW3MrK109aT4+OCYyNTU7bltzKytdPTI1NSZpO3JldHVybiBufWZ1bmN0aW9uIGVuY29kZSh0LHIscyxpKXtjb25zdCBvPXQud2lkdGgsbD10LmhlaWdodDtsZXQgYyxoLGQ7Y29uc3QgdT10LmRhdGE7c3dpdGNoKHIpe2Nhc2Ugbi5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6aD0wO2M9MTtkPW8rNz4+MzticmVhaztjYXNlIG4uSW1hZ2VLaW5kLlJHQl8yNEJQUDpoPTI7Yz04O2Q9MypvO2JyZWFrO2Nhc2Ugbi5JbWFnZUtpbmQuUkdCQV8zMkJQUDpoPTY7Yz04O2Q9NCpvO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpfWNvbnN0IHA9bmV3IFVpbnQ4QXJyYXkoKDErZCkqbCk7bGV0IGY9MCxnPTA7Zm9yKGxldCBlPTA7ZTxsOysrZSl7cFtmKytdPTA7cC5zZXQodS5zdWJhcnJheShnLGcrZCksZik7Zys9ZDtmKz1kfWlmKHI9PT1uLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCYmaSl7Zj0wO2ZvcihsZXQgZT0wO2U8bDtlKyspe2YrKztmb3IobGV0IGU9MDtlPGQ7ZSsrKXBbZisrXV49MjU1fX1jb25zdCBtPW5ldyBVaW50OEFycmF5KFtvPj4yNCYyNTUsbz4+MTYmMjU1LG8+PjgmMjU1LDI1NSZvLGw+PjI0JjI1NSxsPj4xNiYyNTUsbD4+OCYyNTUsMjU1JmwsYyxoLDAsMCwwXSksXz1mdW5jdGlvbiBkZWZsYXRlU3luYyhlKXtpZighYS5pc05vZGVKUylyZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQoZSk7dHJ5e2xldCB0O3Q9cGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKT49OD9lOkJ1ZmZlci5mcm9tKGUpO2NvbnN0IHI9cmVxdWlyZSgiemxpYiIpLmRlZmxhdGVTeW5jKHQse2xldmVsOjl9KTtyZXR1cm4gciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/cjpuZXcgVWludDhBcnJheShyKX1jYXRjaChlKXsoMCxuLndhcm4pKCJOb3QgY29tcHJlc3NpbmcgUE5HIGJlY2F1c2UgemxpYi5kZWZsYXRlU3luYyBpcyB1bmF2YWlsYWJsZTogIitlKX1yZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQoZSl9KHApLEE9ZS5sZW5ndGgrMzYrbS5sZW5ndGgrXy5sZW5ndGgsYj1uZXcgVWludDhBcnJheShBKTtsZXQgeT0wO2Iuc2V0KGUseSk7eSs9ZS5sZW5ndGg7d3JpdGVQbmdDaHVuaygiSUhEUiIsbSxiLHkpO3krPTEyK20ubGVuZ3RoO3dyaXRlUG5nQ2h1bmsoIklEQVRBIixfLGIseSk7eSs9MTIrXy5sZW5ndGg7d3JpdGVQbmdDaHVuaygiSUVORCIsbmV3IFVpbnQ4QXJyYXkoMCksYix5KTtyZXR1cm4oMCxuLmNyZWF0ZU9iamVjdFVSTCkoYiwiaW1hZ2UvcG5nIixzKX1yZXR1cm4gZnVuY3Rpb24gY29udmVydEltZ0RhdGFUb1BuZyhlLHQscil7cmV0dXJuIGVuY29kZShlLHZvaWQgMD09PWUua2luZD9uLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDplLmtpbmQsdCxyKX19KCk7Y2xhc3MgU1ZHRXh0cmFTdGF0ZXtjb25zdHJ1Y3Rvcigpe3RoaXMuZm9udFNpemVTY2FsZT0xO3RoaXMuZm9udFdlaWdodD1lLmZvbnRXZWlnaHQ7dGhpcy5mb250U2l6ZT0wO3RoaXMudGV4dE1hdHJpeD1uLklERU5USVRZX01BVFJJWDt0aGlzLmZvbnRNYXRyaXg9bi5GT05UX0lERU5USVRZX01BVFJJWDt0aGlzLmxlYWRpbmc9MDt0aGlzLnRleHRSZW5kZXJpbmdNb2RlPW4uVGV4dFJlbmRlcmluZ01vZGUuRklMTDt0aGlzLnRleHRNYXRyaXhTY2FsZT0xO3RoaXMueD0wO3RoaXMueT0wO3RoaXMubGluZVg9MDt0aGlzLmxpbmVZPTA7dGhpcy5jaGFyU3BhY2luZz0wO3RoaXMud29yZFNwYWNpbmc9MDt0aGlzLnRleHRIU2NhbGU9MTt0aGlzLnRleHRSaXNlPTA7dGhpcy5maWxsQ29sb3I9ZS5maWxsQ29sb3I7dGhpcy5zdHJva2VDb2xvcj0iIzAwMDAwMCI7dGhpcy5maWxsQWxwaGE9MTt0aGlzLnN0cm9rZUFscGhhPTE7dGhpcy5saW5lV2lkdGg9MTt0aGlzLmxpbmVKb2luPSIiO3RoaXMubGluZUNhcD0iIjt0aGlzLm1pdGVyTGltaXQ9MDt0aGlzLmRhc2hBcnJheT1bXTt0aGlzLmRhc2hQaGFzZT0wO3RoaXMuZGVwZW5kZW5jaWVzPVtdO3RoaXMuYWN0aXZlQ2xpcFVybD1udWxsO3RoaXMuY2xpcEdyb3VwPW51bGw7dGhpcy5tYXNrSWQ9IiJ9Y2xvbmUoKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKX1zZXRDdXJyZW50UG9pbnQoZSx0KXt0aGlzLng9ZTt0aGlzLnk9dH19ZnVuY3Rpb24gcGYoZSl7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSlyZXR1cm4gZS50b1N0cmluZygpO2NvbnN0IHQ9ZS50b0ZpeGVkKDEwKTtsZXQgcj10Lmxlbmd0aC0xO2lmKCIwIiE9PXRbcl0pcmV0dXJuIHQ7ZG97ci0tfXdoaWxlKCIwIj09PXRbcl0pO3JldHVybiB0LnN1YnN0cmluZygwLCIuIj09PXRbcl0/cjpyKzEpfWZ1bmN0aW9uIHBtKGUpe2lmKDA9PT1lWzRdJiYwPT09ZVs1XSl7aWYoMD09PWVbMV0mJjA9PT1lWzJdKXJldHVybiAxPT09ZVswXSYmMT09PWVbM10/IiI6YHNjYWxlKCR7cGYoZVswXSl9ICR7cGYoZVszXSl9KWA7aWYoZVswXT09PWVbM10mJmVbMV09PT0tZVsyXSl7cmV0dXJuYHJvdGF0ZSgke3BmKDE4MCpNYXRoLmFjb3MoZVswXSkvTWF0aC5QSSl9KWB9fWVsc2UgaWYoMT09PWVbMF0mJjA9PT1lWzFdJiYwPT09ZVsyXSYmMT09PWVbM10pcmV0dXJuYHRyYW5zbGF0ZSgke3BmKGVbNF0pfSAke3BmKGVbNV0pfSlgO3JldHVybmBtYXRyaXgoJHtwZihlWzBdKX0gJHtwZihlWzFdKX0gJHtwZihlWzJdKX0gJHtwZihlWzNdKX0gJHtwZihlWzRdKX0gYCtwZihlWzVdKSsiKSJ9bGV0IGg9MCxkPTAsdT0wO3QuU1ZHR3JhcGhpY3M9U1ZHR3JhcGhpY3M9Y2xhc3MgU1ZHR3JhcGhpY3N7Y29uc3RydWN0b3IoZSx0LHI9ITEpe3RoaXMuc3ZnRmFjdG9yeT1uZXcgcy5ET01TVkdGYWN0b3J5O3RoaXMuY3VycmVudD1uZXcgU1ZHRXh0cmFTdGF0ZTt0aGlzLnRyYW5zZm9ybU1hdHJpeD1uLklERU5USVRZX01BVFJJWDt0aGlzLnRyYW5zZm9ybVN0YWNrPVtdO3RoaXMuZXh0cmFTdGFjaz1bXTt0aGlzLmNvbW1vbk9ianM9ZTt0aGlzLm9ianM9dDt0aGlzLnBlbmRpbmdDbGlwPW51bGw7dGhpcy5wZW5kaW5nRU9GaWxsPSExO3RoaXMuZW1iZWRGb250cz0hMTt0aGlzLmVtYmVkZGVkRm9udHM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmNzc1N0eWxlPW51bGw7dGhpcy5mb3JjZURhdGFTY2hlbWE9ISFyO3RoaXMuX29wZXJhdG9ySWRNYXBwaW5nPVtdO2Zvcihjb25zdCBlIGluIG4uT1BTKXRoaXMuX29wZXJhdG9ySWRNYXBwaW5nW24uT1BTW2VdXT1lfXNhdmUoKXt0aGlzLnRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy50cmFuc2Zvcm1NYXRyaXgpO2NvbnN0IGU9dGhpcy5jdXJyZW50O3RoaXMuZXh0cmFTdGFjay5wdXNoKGUpO3RoaXMuY3VycmVudD1lLmNsb25lKCl9cmVzdG9yZSgpe3RoaXMudHJhbnNmb3JtTWF0cml4PXRoaXMudHJhbnNmb3JtU3RhY2sucG9wKCk7dGhpcy5jdXJyZW50PXRoaXMuZXh0cmFTdGFjay5wb3AoKTt0aGlzLnBlbmRpbmdDbGlwPW51bGw7dGhpcy50Z3JwPW51bGx9Z3JvdXAoZSl7dGhpcy5zYXZlKCk7dGhpcy5leGVjdXRlT3BUcmVlKGUpO3RoaXMucmVzdG9yZSgpfWxvYWREZXBlbmRlbmNpZXMoZSl7Y29uc3QgdD1lLmZuQXJyYXkscj1lLmFyZ3NBcnJheTtmb3IobGV0IGU9MCxzPXQubGVuZ3RoO2U8cztlKyspaWYodFtlXT09PW4uT1BTLmRlcGVuZGVuY3kpZm9yKGNvbnN0IHQgb2YgcltlXSl7Y29uc3QgZT10LnN0YXJ0c1dpdGgoImdfIik/dGhpcy5jb21tb25PYmpzOnRoaXMub2JqcyxyPW5ldyBQcm9taXNlKHI9PntlLmdldCh0LHIpfSk7dGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcy5wdXNoKHIpfXJldHVybiBQcm9taXNlLmFsbCh0aGlzLmN1cnJlbnQuZGVwZW5kZW5jaWVzKX10cmFuc2Zvcm0oZSx0LHIscyxhLGkpe2NvbnN0IG89W2UsdCxyLHMsYSxpXTt0aGlzLnRyYW5zZm9ybU1hdHJpeD1uLlV0aWwudHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4LG8pO3RoaXMudGdycD1udWxsfWdldFNWRyhlLHQpe3RoaXMudmlld3BvcnQ9dDtjb25zdCByPXRoaXMuX2luaXRpYWxpemUodCk7cmV0dXJuIHRoaXMubG9hZERlcGVuZGVuY2llcyhlKS50aGVuKCgpPT57dGhpcy50cmFuc2Zvcm1NYXRyaXg9bi5JREVOVElUWV9NQVRSSVg7dGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdChlKSk7cmV0dXJuIHJ9KX1jb252ZXJ0T3BMaXN0KGUpe2NvbnN0IHQ9dGhpcy5fb3BlcmF0b3JJZE1hcHBpbmcscj1lLmFyZ3NBcnJheSxuPWUuZm5BcnJheSxzPVtdO2ZvcihsZXQgZT0wLGE9bi5sZW5ndGg7ZTxhO2UrKyl7Y29uc3QgYT1uW2VdO3MucHVzaCh7Zm5JZDphLGZuOnRbYV0sYXJnczpyW2VdfSl9cmV0dXJuIGZ1bmN0aW9uIG9wTGlzdFRvVHJlZShlKXtsZXQgdD1bXTtjb25zdCByPVtdO2Zvcihjb25zdCBuIG9mIGUpaWYoInNhdmUiIT09bi5mbikicmVzdG9yZSI9PT1uLmZuP3Q9ci5wb3AoKTp0LnB1c2gobik7ZWxzZXt0LnB1c2goe2ZuSWQ6OTIsZm46Imdyb3VwIixpdGVtczpbXX0pO3IucHVzaCh0KTt0PXRbdC5sZW5ndGgtMV0uaXRlbXN9cmV0dXJuIHR9KHMpfWV4ZWN1dGVPcFRyZWUoZSl7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT10LmZuLHI9dC5mbklkLHM9dC5hcmdzO3N3aXRjaCgwfHIpe2Nhc2Ugbi5PUFMuYmVnaW5UZXh0OnRoaXMuYmVnaW5UZXh0KCk7YnJlYWs7Y2FzZSBuLk9QUy5kZXBlbmRlbmN5OmJyZWFrO2Nhc2Ugbi5PUFMuc2V0TGVhZGluZzp0aGlzLnNldExlYWRpbmcocyk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRMZWFkaW5nTW92ZVRleHQ6dGhpcy5zZXRMZWFkaW5nTW92ZVRleHQoc1swXSxzWzFdKTticmVhaztjYXNlIG4uT1BTLnNldEZvbnQ6dGhpcy5zZXRGb250KHMpO2JyZWFrO2Nhc2Ugbi5PUFMuc2hvd1RleHQ6Y2FzZSBuLk9QUy5zaG93U3BhY2VkVGV4dDp0aGlzLnNob3dUZXh0KHNbMF0pO2JyZWFrO2Nhc2Ugbi5PUFMuZW5kVGV4dDp0aGlzLmVuZFRleHQoKTticmVhaztjYXNlIG4uT1BTLm1vdmVUZXh0OnRoaXMubW92ZVRleHQoc1swXSxzWzFdKTticmVhaztjYXNlIG4uT1BTLnNldENoYXJTcGFjaW5nOnRoaXMuc2V0Q2hhclNwYWNpbmcoc1swXSk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRXb3JkU3BhY2luZzp0aGlzLnNldFdvcmRTcGFjaW5nKHNbMF0pO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0SFNjYWxlOnRoaXMuc2V0SFNjYWxlKHNbMF0pO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0VGV4dE1hdHJpeDp0aGlzLnNldFRleHRNYXRyaXgoc1swXSxzWzFdLHNbMl0sc1szXSxzWzRdLHNbNV0pO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0VGV4dFJpc2U6dGhpcy5zZXRUZXh0UmlzZShzWzBdKTticmVhaztjYXNlIG4uT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOnRoaXMuc2V0VGV4dFJlbmRlcmluZ01vZGUoc1swXSk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRMaW5lV2lkdGg6dGhpcy5zZXRMaW5lV2lkdGgoc1swXSk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRMaW5lSm9pbjp0aGlzLnNldExpbmVKb2luKHNbMF0pO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0TGluZUNhcDp0aGlzLnNldExpbmVDYXAoc1swXSk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRNaXRlckxpbWl0OnRoaXMuc2V0TWl0ZXJMaW1pdChzWzBdKTticmVhaztjYXNlIG4uT1BTLnNldEZpbGxSR0JDb2xvcjp0aGlzLnNldEZpbGxSR0JDb2xvcihzWzBdLHNbMV0sc1syXSk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRTdHJva2VSR0JDb2xvcjp0aGlzLnNldFN0cm9rZVJHQkNvbG9yKHNbMF0sc1sxXSxzWzJdKTticmVhaztjYXNlIG4uT1BTLnNldFN0cm9rZUNvbG9yTjp0aGlzLnNldFN0cm9rZUNvbG9yTihzKTticmVhaztjYXNlIG4uT1BTLnNldEZpbGxDb2xvck46dGhpcy5zZXRGaWxsQ29sb3JOKHMpO2JyZWFrO2Nhc2Ugbi5PUFMuc2hhZGluZ0ZpbGw6dGhpcy5zaGFkaW5nRmlsbChzWzBdKTticmVhaztjYXNlIG4uT1BTLnNldERhc2g6dGhpcy5zZXREYXNoKHNbMF0sc1sxXSk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRSZW5kZXJpbmdJbnRlbnQ6dGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQoc1swXSk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRGbGF0bmVzczp0aGlzLnNldEZsYXRuZXNzKHNbMF0pO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0R1N0YXRlOnRoaXMuc2V0R1N0YXRlKHNbMF0pO2JyZWFrO2Nhc2Ugbi5PUFMuZmlsbDp0aGlzLmZpbGwoKTticmVhaztjYXNlIG4uT1BTLmVvRmlsbDp0aGlzLmVvRmlsbCgpO2JyZWFrO2Nhc2Ugbi5PUFMuc3Ryb2tlOnRoaXMuc3Ryb2tlKCk7YnJlYWs7Y2FzZSBuLk9QUy5maWxsU3Ryb2tlOnRoaXMuZmlsbFN0cm9rZSgpO2JyZWFrO2Nhc2Ugbi5PUFMuZW9GaWxsU3Ryb2tlOnRoaXMuZW9GaWxsU3Ryb2tlKCk7YnJlYWs7Y2FzZSBuLk9QUy5jbGlwOnRoaXMuY2xpcCgibm9uemVybyIpO2JyZWFrO2Nhc2Ugbi5PUFMuZW9DbGlwOnRoaXMuY2xpcCgiZXZlbm9kZCIpO2JyZWFrO2Nhc2Ugbi5PUFMucGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOnRoaXMucGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCk7YnJlYWs7Y2FzZSBuLk9QUy5wYWludEltYWdlWE9iamVjdDp0aGlzLnBhaW50SW1hZ2VYT2JqZWN0KHNbMF0pO2JyZWFrO2Nhc2Ugbi5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6dGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChzWzBdKTticmVhaztjYXNlIG4uT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDp0aGlzLnBhaW50SW1hZ2VNYXNrWE9iamVjdChzWzBdKTticmVhaztjYXNlIG4uT1BTLnBhaW50Rm9ybVhPYmplY3RCZWdpbjp0aGlzLnBhaW50Rm9ybVhPYmplY3RCZWdpbihzWzBdLHNbMV0pO2JyZWFrO2Nhc2Ugbi5PUFMucGFpbnRGb3JtWE9iamVjdEVuZDp0aGlzLnBhaW50Rm9ybVhPYmplY3RFbmQoKTticmVhaztjYXNlIG4uT1BTLmNsb3NlUGF0aDp0aGlzLmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2Ugbi5PUFMuY2xvc2VTdHJva2U6dGhpcy5jbG9zZVN0cm9rZSgpO2JyZWFrO2Nhc2Ugbi5PUFMuY2xvc2VGaWxsU3Ryb2tlOnRoaXMuY2xvc2VGaWxsU3Ryb2tlKCk7YnJlYWs7Y2FzZSBuLk9QUy5jbG9zZUVPRmlsbFN0cm9rZTp0aGlzLmNsb3NlRU9GaWxsU3Ryb2tlKCk7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZTp0aGlzLm5leHRMaW5lKCk7YnJlYWs7Y2FzZSBuLk9QUy50cmFuc2Zvcm06dGhpcy50cmFuc2Zvcm0oc1swXSxzWzFdLHNbMl0sc1szXSxzWzRdLHNbNV0pO2JyZWFrO2Nhc2Ugbi5PUFMuY29uc3RydWN0UGF0aDp0aGlzLmNvbnN0cnVjdFBhdGgoc1swXSxzWzFdKTticmVhaztjYXNlIG4uT1BTLmVuZFBhdGg6dGhpcy5lbmRQYXRoKCk7YnJlYWs7Y2FzZSA5Mjp0aGlzLmdyb3VwKHQuaXRlbXMpO2JyZWFrO2RlZmF1bHQ6KDAsbi53YXJuKSgiVW5pbXBsZW1lbnRlZCBvcGVyYXRvciAiK2UpfX19c2V0V29yZFNwYWNpbmcoZSl7dGhpcy5jdXJyZW50LndvcmRTcGFjaW5nPWV9c2V0Q2hhclNwYWNpbmcoZSl7dGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nPWV9bmV4dExpbmUoKXt0aGlzLm1vdmVUZXh0KDAsdGhpcy5jdXJyZW50LmxlYWRpbmcpfXNldFRleHRNYXRyaXgoZSx0LHIsbixzLGEpe2NvbnN0IGk9dGhpcy5jdXJyZW50O2kudGV4dE1hdHJpeD1pLmxpbmVNYXRyaXg9W2UsdCxyLG4scyxhXTtpLnRleHRNYXRyaXhTY2FsZT1NYXRoLnNxcnQoZSplK3QqdCk7aS54PWkubGluZVg9MDtpLnk9aS5saW5lWT0wO2kueGNvb3Jkcz1bXTtpLnljb29yZHM9W107aS50c3Bhbj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7aS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LWZhbWlseSIsaS5mb250RmFtaWx5KTtpLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZvbnQtc2l6ZSIscGYoaS5mb250U2l6ZSkrInB4Iik7aS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixwZigtaS55KSk7aS50eHRFbGVtZW50PXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dGV4dCIpO2kudHh0RWxlbWVudC5hcHBlbmRDaGlsZChpLnRzcGFuKX1iZWdpblRleHQoKXtjb25zdCBlPXRoaXMuY3VycmVudDtlLng9ZS5saW5lWD0wO2UueT1lLmxpbmVZPTA7ZS50ZXh0TWF0cml4PW4uSURFTlRJVFlfTUFUUklYO2UubGluZU1hdHJpeD1uLklERU5USVRZX01BVFJJWDtlLnRleHRNYXRyaXhTY2FsZT0xO2UudHNwYW49dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpO2UudHh0RWxlbWVudD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRleHQiKTtlLnR4dGdycD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTtlLnhjb29yZHM9W107ZS55Y29vcmRzPVtdfW1vdmVUZXh0KGUsdCl7Y29uc3Qgcj10aGlzLmN1cnJlbnQ7ci54PXIubGluZVgrPWU7ci55PXIubGluZVkrPXQ7ci54Y29vcmRzPVtdO3IueWNvb3Jkcz1bXTtyLnRzcGFuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTtyLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZvbnQtZmFtaWx5IixyLmZvbnRGYW1pbHkpO3IudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC1zaXplIixwZihyLmZvbnRTaXplKSsicHgiKTtyLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHBmKC1yLnkpKX1zaG93VGV4dCh0KXtjb25zdCBzPXRoaXMuY3VycmVudCxhPXMuZm9udCxpPXMuZm9udFNpemU7aWYoMD09PWkpcmV0dXJuO2NvbnN0IG89cy5mb250U2l6ZVNjYWxlLGw9cy5jaGFyU3BhY2luZyxjPXMud29yZFNwYWNpbmcsaD1zLmZvbnREaXJlY3Rpb24sZD1zLnRleHRIU2NhbGUqaCx1PWEudmVydGljYWwscD11PzE6LTEsZj1hLmRlZmF1bHRWTWV0cmljcyxnPWkqcy5mb250TWF0cml4WzBdO2xldCBtPTA7Zm9yKGNvbnN0IGUgb2YgdCl7aWYobnVsbD09PWUpe20rPWgqYztjb250aW51ZX1pZigoMCxuLmlzTnVtKShlKSl7bSs9cCplKmkvMWUzO2NvbnRpbnVlfWNvbnN0IHQ9KGUuaXNTcGFjZT9jOjApK2wscj1lLmZvbnRDaGFyO2xldCBkLF8sQSxiPWUud2lkdGg7aWYodSl7bGV0IHQ7Y29uc3Qgcj1lLnZtZXRyaWN8fGY7dD1lLnZtZXRyaWM/clsxXTouNSpiO3Q9LXQqZztjb25zdCBuPXJbMl0qZztiPXI/LXJbMF06YjtkPXQvbztfPShtK24pL299ZWxzZXtkPW0vbztfPTB9aWYoZS5pc0luRm9udHx8YS5taXNzaW5nRmlsZSl7cy54Y29vcmRzLnB1c2gocy54K2QpO3UmJnMueWNvb3Jkcy5wdXNoKC1zLnkrXyk7cy50c3Bhbi50ZXh0Q29udGVudCs9cn1BPXU/YipnLXQqaDpiKmcrdCpoO20rPUF9cy50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4IixzLnhjb29yZHMubWFwKHBmKS5qb2luKCIgIikpO3U/cy50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixzLnljb29yZHMubWFwKHBmKS5qb2luKCIgIikpOnMudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwieSIscGYoLXMueSkpO3U/cy55LT1tOnMueCs9bSpkO3MudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC1mYW1pbHkiLHMuZm9udEZhbWlseSk7cy50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LXNpemUiLHBmKHMuZm9udFNpemUpKyJweCIpO3MuZm9udFN0eWxlIT09ZS5mb250U3R5bGUmJnMudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC1zdHlsZSIscy5mb250U3R5bGUpO3MuZm9udFdlaWdodCE9PWUuZm9udFdlaWdodCYmcy50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LXdlaWdodCIscy5mb250V2VpZ2h0KTtjb25zdCBfPXMudGV4dFJlbmRlcmluZ01vZGUmbi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO2lmKF89PT1uLlRleHRSZW5kZXJpbmdNb2RlLkZJTEx8fF89PT1uLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKXtzLmZpbGxDb2xvciE9PWUuZmlsbENvbG9yJiZzLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLHMuZmlsbENvbG9yKTtzLmZpbGxBbHBoYTwxJiZzLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwtb3BhY2l0eSIscy5maWxsQWxwaGEpfWVsc2Ugcy50ZXh0UmVuZGVyaW5nTW9kZT09PW4uVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEg/cy50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIiwidHJhbnNwYXJlbnQiKTpzLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLCJub25lIik7aWYoXz09PW4uVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFfHxfPT09bi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSl7Y29uc3QgZT0xLyhzLnRleHRNYXRyaXhTY2FsZXx8MSk7dGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhzLnRzcGFuLGUpfWxldCBBPXMudGV4dE1hdHJpeDtpZigwIT09cy50ZXh0UmlzZSl7QT1BLnNsaWNlKCk7QVs1XSs9cy50ZXh0UmlzZX1zLnR4dEVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwidHJhbnNmb3JtIixgJHtwbShBKX0gc2NhbGUoJHtwZihkKX0sIC0xKWApO3MudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhyLCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpO3MudHh0RWxlbWVudC5hcHBlbmRDaGlsZChzLnRzcGFuKTtzLnR4dGdycC5hcHBlbmRDaGlsZChzLnR4dEVsZW1lbnQpO3RoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQocy50eHRFbGVtZW50KX1zZXRMZWFkaW5nTW92ZVRleHQoZSx0KXt0aGlzLnNldExlYWRpbmcoLXQpO3RoaXMubW92ZVRleHQoZSx0KX1hZGRGb250U3R5bGUoZSl7aWYoIWUuZGF0YSl0aHJvdyBuZXcgRXJyb3IoJ2FkZEZvbnRTdHlsZTogTm8gZm9udCBkYXRhIGF2YWlsYWJsZSwgZW5zdXJlIHRoYXQgdGhlICJmb250RXh0cmFQcm9wZXJ0aWVzIiBBUEkgcGFyYW1ldGVyIGlzIHNldC4nKTtpZighdGhpcy5jc3NTdHlsZSl7dGhpcy5jc3NTdHlsZT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnN0eWxlIik7dGhpcy5jc3NTdHlsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0eXBlIiwidGV4dC9jc3MiKTt0aGlzLmRlZnMuYXBwZW5kQ2hpbGQodGhpcy5jc3NTdHlsZSl9Y29uc3QgdD0oMCxuLmNyZWF0ZU9iamVjdFVSTCkoZS5kYXRhLGUubWltZXR5cGUsdGhpcy5mb3JjZURhdGFTY2hlbWEpO3RoaXMuY3NzU3R5bGUudGV4dENvbnRlbnQrPWBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICIke2UubG9hZGVkTmFtZX0iOyBzcmM6IHVybCgke3R9KTsgfVxuYH1zZXRGb250KGUpe2NvbnN0IHQ9dGhpcy5jdXJyZW50LHI9dGhpcy5jb21tb25PYmpzLmdldChlWzBdKTtsZXQgcz1lWzFdO3QuZm9udD1yO2lmKHRoaXMuZW1iZWRGb250cyYmIXIubWlzc2luZ0ZpbGUmJiF0aGlzLmVtYmVkZGVkRm9udHNbci5sb2FkZWROYW1lXSl7dGhpcy5hZGRGb250U3R5bGUocik7dGhpcy5lbWJlZGRlZEZvbnRzW3IubG9hZGVkTmFtZV09cn10LmZvbnRNYXRyaXg9ci5mb250TWF0cml4P3IuZm9udE1hdHJpeDpuLkZPTlRfSURFTlRJVFlfTUFUUklYO2xldCBhPSJub3JtYWwiO3IuYmxhY2s/YT0iOTAwIjpyLmJvbGQmJihhPSJib2xkIik7Y29uc3QgaT1yLml0YWxpYz8iaXRhbGljIjoibm9ybWFsIjtpZihzPDApe3M9LXM7dC5mb250RGlyZWN0aW9uPS0xfWVsc2UgdC5mb250RGlyZWN0aW9uPTE7dC5mb250U2l6ZT1zO3QuZm9udEZhbWlseT1yLmxvYWRlZE5hbWU7dC5mb250V2VpZ2h0PWE7dC5mb250U3R5bGU9aTt0LnRzcGFuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTt0LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHBmKC10LnkpKTt0Lnhjb29yZHM9W107dC55Y29vcmRzPVtdfWVuZFRleHQoKXtjb25zdCBlPXRoaXMuY3VycmVudDtpZihlLnRleHRSZW5kZXJpbmdNb2RlJm4uVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBRyYmZS50eHRFbGVtZW50JiZlLnR4dEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKXtlLmVsZW1lbnQ9ZS50eHRFbGVtZW50O3RoaXMuY2xpcCgibm9uemVybyIpO3RoaXMuZW5kUGF0aCgpfX1zZXRMaW5lV2lkdGgoZSl7ZT4wJiYodGhpcy5jdXJyZW50LmxpbmVXaWR0aD1lKX1zZXRMaW5lQ2FwKGUpe3RoaXMuY3VycmVudC5saW5lQ2FwPW9bZV19c2V0TGluZUpvaW4oZSl7dGhpcy5jdXJyZW50LmxpbmVKb2luPWxbZV19c2V0TWl0ZXJMaW1pdChlKXt0aGlzLmN1cnJlbnQubWl0ZXJMaW1pdD1lfXNldFN0cm9rZUFscGhhKGUpe3RoaXMuY3VycmVudC5zdHJva2VBbHBoYT1lfXNldFN0cm9rZVJHQkNvbG9yKGUsdCxyKXt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9bi5VdGlsLm1ha2VDc3NSZ2IoZSx0LHIpfXNldEZpbGxBbHBoYShlKXt0aGlzLmN1cnJlbnQuZmlsbEFscGhhPWV9c2V0RmlsbFJHQkNvbG9yKGUsdCxyKXt0aGlzLmN1cnJlbnQuZmlsbENvbG9yPW4uVXRpbC5tYWtlQ3NzUmdiKGUsdCxyKTt0aGlzLmN1cnJlbnQudHNwYW49dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpO3RoaXMuY3VycmVudC54Y29vcmRzPVtdO3RoaXMuY3VycmVudC55Y29vcmRzPVtdfXNldFN0cm9rZUNvbG9yTihlKXt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9dGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKGUpfXNldEZpbGxDb2xvck4oZSl7dGhpcy5jdXJyZW50LmZpbGxDb2xvcj10aGlzLl9tYWtlQ29sb3JOX1BhdHRlcm4oZSl9c2hhZGluZ0ZpbGwoZSl7Y29uc3QgdD10aGlzLnZpZXdwb3J0LndpZHRoLHI9dGhpcy52aWV3cG9ydC5oZWlnaHQscz1uLlV0aWwuaW52ZXJzZVRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCksYT1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsMF0scyksaT1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAscl0scyksbz1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3QsMF0scyksbD1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3Qscl0scyksYz1NYXRoLm1pbihhWzBdLGlbMF0sb1swXSxsWzBdKSxoPU1hdGgubWluKGFbMV0saVsxXSxvWzFdLGxbMV0pLGQ9TWF0aC5tYXgoYVswXSxpWzBdLG9bMF0sbFswXSksdT1NYXRoLm1heChhWzFdLGlbMV0sb1sxXSxsWzFdKSxwPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpO3Auc2V0QXR0cmlidXRlTlMobnVsbCwieCIsYyk7cC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixoKTtwLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixkLWMpO3Auc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0Iix1LWgpO3Auc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsdGhpcy5fbWFrZVNoYWRpbmdQYXR0ZXJuKGUpKTt0aGlzLmN1cnJlbnQuZmlsbEFscGhhPDEmJnAuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbC1vcGFjaXR5Iix0aGlzLmN1cnJlbnQuZmlsbEFscGhhKTt0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKHApfV9tYWtlQ29sb3JOX1BhdHRlcm4oZSl7cmV0dXJuIlRpbGluZ1BhdHRlcm4iPT09ZVswXT90aGlzLl9tYWtlVGlsaW5nUGF0dGVybihlKTp0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4oZSl9X21ha2VUaWxpbmdQYXR0ZXJuKGUpe2NvbnN0IHQ9ZVsxXSxyPWVbMl0scz1lWzNdfHxuLklERU5USVRZX01BVFJJWCxbYSxpLG8sbF09ZVs0XSxjPWVbNV0saD1lWzZdLGQ9ZVs3XSxwPSJzaGFkaW5nIit1KyssW2YsZ109bi5VdGlsLmFwcGx5VHJhbnNmb3JtKFthLGldLHMpLFttLF9dPW4uVXRpbC5hcHBseVRyYW5zZm9ybShbbyxsXSxzKSxbQSxiXT1uLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUocykseT1jKkEsdj1oKmIsQz10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnBhdHRlcm4iKTtDLnNldEF0dHJpYnV0ZU5TKG51bGwsImlkIixwKTtDLnNldEF0dHJpYnV0ZU5TKG51bGwsInBhdHRlcm5Vbml0cyIsInVzZXJTcGFjZU9uVXNlIik7Qy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIseSk7Qy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLHYpO0Muc2V0QXR0cmlidXRlTlMobnVsbCwieCIsIiIrZik7Qy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IiwiIitnKTtjb25zdCBTPXRoaXMuc3ZnLHg9dGhpcy50cmFuc2Zvcm1NYXRyaXgsUD10aGlzLmN1cnJlbnQuZmlsbENvbG9yLGs9dGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yLFI9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShtLWYsXy1nKTt0aGlzLnN2Zz1SO3RoaXMudHJhbnNmb3JtTWF0cml4PXM7aWYoMj09PWQpe2NvbnN0IGU9bi5VdGlsLm1ha2VDc3NSZ2IoLi4udCk7dGhpcy5jdXJyZW50LmZpbGxDb2xvcj1lO3RoaXMuY3VycmVudC5zdHJva2VDb2xvcj1lfXRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3QocikpO3RoaXMuc3ZnPVM7dGhpcy50cmFuc2Zvcm1NYXRyaXg9eDt0aGlzLmN1cnJlbnQuZmlsbENvbG9yPVA7dGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yPWs7Qy5hcHBlbmRDaGlsZChSLmNoaWxkTm9kZXNbMF0pO3RoaXMuZGVmcy5hcHBlbmRDaGlsZChDKTtyZXR1cm5gdXJsKCMke3B9KWB9X21ha2VTaGFkaW5nUGF0dGVybihlKXtzd2l0Y2goZVswXSl7Y2FzZSJSYWRpYWxBeGlhbCI6Y29uc3QgdD0ic2hhZGluZyIrdSsrLHI9ZVszXTtsZXQgcztzd2l0Y2goZVsxXSl7Y2FzZSJheGlhbCI6Y29uc3Qgcj1lWzRdLG49ZVs1XTtzPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6bGluZWFyR3JhZGllbnQiKTtzLnNldEF0dHJpYnV0ZU5TKG51bGwsImlkIix0KTtzLnNldEF0dHJpYnV0ZU5TKG51bGwsImdyYWRpZW50VW5pdHMiLCJ1c2VyU3BhY2VPblVzZSIpO3Muc2V0QXR0cmlidXRlTlMobnVsbCwieDEiLHJbMF0pO3Muc2V0QXR0cmlidXRlTlMobnVsbCwieTEiLHJbMV0pO3Muc2V0QXR0cmlidXRlTlMobnVsbCwieDIiLG5bMF0pO3Muc2V0QXR0cmlidXRlTlMobnVsbCwieTIiLG5bMV0pO2JyZWFrO2Nhc2UicmFkaWFsIjpjb25zdCBhPWVbNF0saT1lWzVdLG89ZVs2XSxsPWVbN107cz10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJhZGlhbEdyYWRpZW50Iik7cy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJpZCIsdCk7cy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJncmFkaWVudFVuaXRzIiwidXNlclNwYWNlT25Vc2UiKTtzLnNldEF0dHJpYnV0ZU5TKG51bGwsImN4IixpWzBdKTtzLnNldEF0dHJpYnV0ZU5TKG51bGwsImN5IixpWzFdKTtzLnNldEF0dHJpYnV0ZU5TKG51bGwsInIiLGwpO3Muc2V0QXR0cmlidXRlTlMobnVsbCwiZngiLGFbMF0pO3Muc2V0QXR0cmlidXRlTlMobnVsbCwiZnkiLGFbMV0pO3Muc2V0QXR0cmlidXRlTlMobnVsbCwiZnIiLG8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIFJhZGlhbEF4aWFsIHR5cGU6ICIrZVsxXSl9Zm9yKGNvbnN0IGUgb2Ygcil7Y29uc3QgdD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnN0b3AiKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsIm9mZnNldCIsZVswXSk7dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdG9wLWNvbG9yIixlWzFdKTtzLmFwcGVuZENoaWxkKHQpfXRoaXMuZGVmcy5hcHBlbmRDaGlsZChzKTtyZXR1cm5gdXJsKCMke3R9KWA7Y2FzZSJNZXNoIjooMCxuLndhcm4pKCJVbmltcGxlbWVudGVkIHBhdHRlcm4gTWVzaCIpO3JldHVybiBudWxsO2Nhc2UiRHVtbXkiOnJldHVybiJob3RwaW5rIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBJUiB0eXBlOiAiK2VbMF0pfX1zZXREYXNoKGUsdCl7dGhpcy5jdXJyZW50LmRhc2hBcnJheT1lO3RoaXMuY3VycmVudC5kYXNoUGhhc2U9dH1jb25zdHJ1Y3RQYXRoKGUsdCl7Y29uc3Qgcj10aGlzLmN1cnJlbnQ7bGV0IHM9ci54LGE9ci55LGk9W10sbz0wO2Zvcihjb25zdCByIG9mIGUpc3dpdGNoKDB8cil7Y2FzZSBuLk9QUy5yZWN0YW5nbGU6cz10W28rK107YT10W28rK107Y29uc3QgZT1zK3RbbysrXSxyPWErdFtvKytdO2kucHVzaCgiTSIscGYocykscGYoYSksIkwiLHBmKGUpLHBmKGEpLCJMIixwZihlKSxwZihyKSwiTCIscGYocykscGYociksIloiKTticmVhaztjYXNlIG4uT1BTLm1vdmVUbzpzPXRbbysrXTthPXRbbysrXTtpLnB1c2goIk0iLHBmKHMpLHBmKGEpKTticmVhaztjYXNlIG4uT1BTLmxpbmVUbzpzPXRbbysrXTthPXRbbysrXTtpLnB1c2goIkwiLHBmKHMpLHBmKGEpKTticmVhaztjYXNlIG4uT1BTLmN1cnZlVG86cz10W28rNF07YT10W28rNV07aS5wdXNoKCJDIixwZih0W29dKSxwZih0W28rMV0pLHBmKHRbbysyXSkscGYodFtvKzNdKSxwZihzKSxwZihhKSk7bys9NjticmVhaztjYXNlIG4uT1BTLmN1cnZlVG8yOmkucHVzaCgiQyIscGYocykscGYoYSkscGYodFtvXSkscGYodFtvKzFdKSxwZih0W28rMl0pLHBmKHRbbyszXSkpO3M9dFtvKzJdO2E9dFtvKzNdO28rPTQ7YnJlYWs7Y2FzZSBuLk9QUy5jdXJ2ZVRvMzpzPXRbbysyXTthPXRbbyszXTtpLnB1c2goIkMiLHBmKHRbb10pLHBmKHRbbysxXSkscGYocykscGYoYSkscGYocykscGYoYSkpO28rPTQ7YnJlYWs7Y2FzZSBuLk9QUy5jbG9zZVBhdGg6aS5wdXNoKCJaIil9aT1pLmpvaW4oIiAiKTtpZihyLnBhdGgmJmUubGVuZ3RoPjAmJmVbMF0hPT1uLk9QUy5yZWN0YW5nbGUmJmVbMF0hPT1uLk9QUy5tb3ZlVG8paT1yLnBhdGguZ2V0QXR0cmlidXRlTlMobnVsbCwiZCIpK2k7ZWxzZXtyLnBhdGg9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpwYXRoIik7dGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChyLnBhdGgpfXIucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJkIixpKTtyLnBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsIm5vbmUiKTtyLmVsZW1lbnQ9ci5wYXRoO3Iuc2V0Q3VycmVudFBvaW50KHMsYSl9ZW5kUGF0aCgpe2NvbnN0IGU9dGhpcy5jdXJyZW50O2UucGF0aD1udWxsO2lmKCF0aGlzLnBlbmRpbmdDbGlwKXJldHVybjtpZighZS5lbGVtZW50KXt0aGlzLnBlbmRpbmdDbGlwPW51bGw7cmV0dXJufWNvbnN0IHQ9ImNsaXBwYXRoIitoKysscj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmNsaXBQYXRoIik7ci5zZXRBdHRyaWJ1dGVOUyhudWxsLCJpZCIsdCk7ci5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0cmFuc2Zvcm0iLHBtKHRoaXMudHJhbnNmb3JtTWF0cml4KSk7Y29uc3Qgbj1lLmVsZW1lbnQuY2xvbmVOb2RlKCEwKTsiZXZlbm9kZCI9PT10aGlzLnBlbmRpbmdDbGlwP24uc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1ydWxlIiwiZXZlbm9kZCIpOm4uc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1ydWxlIiwibm9uemVybyIpO3RoaXMucGVuZGluZ0NsaXA9bnVsbDtyLmFwcGVuZENoaWxkKG4pO3RoaXMuZGVmcy5hcHBlbmRDaGlsZChyKTtpZihlLmFjdGl2ZUNsaXBVcmwpe2UuY2xpcEdyb3VwPW51bGw7dGhpcy5leHRyYVN0YWNrLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY2xpcEdyb3VwPW51bGx9KSk7ci5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGlwLXBhdGgiLGUuYWN0aXZlQ2xpcFVybCl9ZS5hY3RpdmVDbGlwVXJsPWB1cmwoIyR7dH0pYDt0aGlzLnRncnA9bnVsbH1jbGlwKGUpe3RoaXMucGVuZGluZ0NsaXA9ZX1jbG9zZVBhdGgoKXtjb25zdCBlPXRoaXMuY3VycmVudDtpZihlLnBhdGgpe2NvbnN0IHQ9ZS5wYXRoLmdldEF0dHJpYnV0ZU5TKG51bGwsImQiKSsiWiI7ZS5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsImQiLHQpfX1zZXRMZWFkaW5nKGUpe3RoaXMuY3VycmVudC5sZWFkaW5nPS1lfXNldFRleHRSaXNlKGUpe3RoaXMuY3VycmVudC50ZXh0UmlzZT1lfXNldFRleHRSZW5kZXJpbmdNb2RlKGUpe3RoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZT1lfXNldEhTY2FsZShlKXt0aGlzLmN1cnJlbnQudGV4dEhTY2FsZT1lLzEwMH1zZXRSZW5kZXJpbmdJbnRlbnQoZSl7fXNldEZsYXRuZXNzKGUpe31zZXRHU3RhdGUoZSl7Zm9yKGNvbnN0W3Qscl1vZiBlKXN3aXRjaCh0KXtjYXNlIkxXIjp0aGlzLnNldExpbmVXaWR0aChyKTticmVhaztjYXNlIkxDIjp0aGlzLnNldExpbmVDYXAocik7YnJlYWs7Y2FzZSJMSiI6dGhpcy5zZXRMaW5lSm9pbihyKTticmVhaztjYXNlIk1MIjp0aGlzLnNldE1pdGVyTGltaXQocik7YnJlYWs7Y2FzZSJEIjp0aGlzLnNldERhc2goclswXSxyWzFdKTticmVhaztjYXNlIlJJIjp0aGlzLnNldFJlbmRlcmluZ0ludGVudChyKTticmVhaztjYXNlIkZMIjp0aGlzLnNldEZsYXRuZXNzKHIpO2JyZWFrO2Nhc2UiRm9udCI6dGhpcy5zZXRGb250KHIpO2JyZWFrO2Nhc2UiQ0EiOnRoaXMuc2V0U3Ryb2tlQWxwaGEocik7YnJlYWs7Y2FzZSJjYSI6dGhpcy5zZXRGaWxsQWxwaGEocik7YnJlYWs7ZGVmYXVsdDooMCxuLndhcm4pKCJVbmltcGxlbWVudGVkIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIit0KX19ZmlsbCgpe2NvbnN0IGU9dGhpcy5jdXJyZW50O2lmKGUuZWxlbWVudCl7ZS5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLGUuZmlsbENvbG9yKTtlLmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbC1vcGFjaXR5IixlLmZpbGxBbHBoYSk7dGhpcy5lbmRQYXRoKCl9fXN0cm9rZSgpe2NvbnN0IGU9dGhpcy5jdXJyZW50O2lmKGUuZWxlbWVudCl7dGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhlLmVsZW1lbnQpO2UuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIiwibm9uZSIpO3RoaXMuZW5kUGF0aCgpfX1fc2V0U3Ryb2tlQXR0cmlidXRlcyhlLHQ9MSl7Y29uc3Qgcj10aGlzLmN1cnJlbnQ7bGV0IG49ci5kYXNoQXJyYXk7MSE9PXQmJm4ubGVuZ3RoPjAmJihuPW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdCplfSkpKTtlLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZSIsci5zdHJva2VDb2xvcik7ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHJva2Utb3BhY2l0eSIsci5zdHJva2VBbHBoYSk7ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHJva2UtbWl0ZXJsaW1pdCIscGYoci5taXRlckxpbWl0KSk7ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHJva2UtbGluZWNhcCIsci5saW5lQ2FwKTtlLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZS1saW5lam9pbiIsci5saW5lSm9pbik7ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHJva2Utd2lkdGgiLHBmKHQqci5saW5lV2lkdGgpKyJweCIpO2Uuc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLWRhc2hhcnJheSIsbi5tYXAocGYpLmpvaW4oIiAiKSk7ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHJva2UtZGFzaG9mZnNldCIscGYodCpyLmRhc2hQaGFzZSkrInB4Iil9ZW9GaWxsKCl7dGhpcy5jdXJyZW50LmVsZW1lbnQmJnRoaXMuY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwtcnVsZSIsImV2ZW5vZGQiKTt0aGlzLmZpbGwoKX1maWxsU3Ryb2tlKCl7dGhpcy5zdHJva2UoKTt0aGlzLmZpbGwoKX1lb0ZpbGxTdHJva2UoKXt0aGlzLmN1cnJlbnQuZWxlbWVudCYmdGhpcy5jdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbC1ydWxlIiwiZXZlbm9kZCIpO3RoaXMuZmlsbFN0cm9rZSgpfWNsb3NlU3Ryb2tlKCl7dGhpcy5jbG9zZVBhdGgoKTt0aGlzLnN0cm9rZSgpfWNsb3NlRmlsbFN0cm9rZSgpe3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5maWxsU3Ryb2tlKCl9Y2xvc2VFT0ZpbGxTdHJva2UoKXt0aGlzLmNsb3NlUGF0aCgpO3RoaXMuZW9GaWxsU3Ryb2tlKCl9cGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCl7Y29uc3QgZT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTtlLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLCIwIik7ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IiwiMCIpO2Uuc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLCIxcHgiKTtlLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsIjFweCIpO2Uuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsdGhpcy5jdXJyZW50LmZpbGxDb2xvcik7dGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChlKX1wYWludEltYWdlWE9iamVjdChlKXtjb25zdCB0PWUuc3RhcnRzV2l0aCgiZ18iKT90aGlzLmNvbW1vbk9ianMuZ2V0KGUpOnRoaXMub2Jqcy5nZXQoZSk7dD90aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KHQpOigwLG4ud2FybikoYERlcGVuZGVudCBpbWFnZSB3aXRoIG9iamVjdCBJRCAke2V9IGlzIG5vdCByZWFkeSB5ZXRgKX1wYWludElubGluZUltYWdlWE9iamVjdChlLHQpe2NvbnN0IHI9ZS53aWR0aCxuPWUuaGVpZ2h0LHM9YyhlLHRoaXMuZm9yY2VEYXRhU2NoZW1hLCEhdCksYT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTthLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLCIwIik7YS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IiwiMCIpO2Euc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLHBmKHIpKTthLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIscGYobikpO3RoaXMuY3VycmVudC5lbGVtZW50PWE7dGhpcy5jbGlwKCJub256ZXJvIik7Y29uc3Qgbz10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmltYWdlIik7by5zZXRBdHRyaWJ1dGVOUyhpLCJ4bGluazpocmVmIixzKTtvLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLCIwIik7by5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixwZigtbikpO28uc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLHBmKHIpKyJweCIpO28uc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0IixwZihuKSsicHgiKTtvLnNldEF0dHJpYnV0ZU5TKG51bGwsInRyYW5zZm9ybSIsYHNjYWxlKCR7cGYoMS9yKX0gJHtwZigtMS9uKX0pYCk7dD90LmFwcGVuZENoaWxkKG8pOnRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQobyl9cGFpbnRJbWFnZU1hc2tYT2JqZWN0KGUpe2NvbnN0IHQ9dGhpcy5jdXJyZW50LHI9ZS53aWR0aCxuPWUuaGVpZ2h0LHM9dC5maWxsQ29sb3I7dC5tYXNrSWQ9Im1hc2siK2QrKztjb25zdCBhPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6bWFzayIpO2Euc2V0QXR0cmlidXRlTlMobnVsbCwiaWQiLHQubWFza0lkKTtjb25zdCBpPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpO2kuc2V0QXR0cmlidXRlTlMobnVsbCwieCIsIjAiKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLCIwIik7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIscGYocikpO2kuc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0IixwZihuKSk7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIixzKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsIm1hc2siLGB1cmwoIyR7dC5tYXNrSWR9KWApO3RoaXMuZGVmcy5hcHBlbmRDaGlsZChhKTt0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKGkpO3RoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoZSxhKX1wYWludEZvcm1YT2JqZWN0QmVnaW4oZSx0KXtBcnJheS5pc0FycmF5KGUpJiY2PT09ZS5sZW5ndGgmJnRoaXMudHJhbnNmb3JtKGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdKTtpZih0KXtjb25zdCBlPXRbMl0tdFswXSxyPXRbM10tdFsxXSxuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpO24uc2V0QXR0cmlidXRlTlMobnVsbCwieCIsdFswXSk7bi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5Iix0WzFdKTtuLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixwZihlKSk7bi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLHBmKHIpKTt0aGlzLmN1cnJlbnQuZWxlbWVudD1uO3RoaXMuY2xpcCgibm9uemVybyIpO3RoaXMuZW5kUGF0aCgpfX1wYWludEZvcm1YT2JqZWN0RW5kKCl7fV9pbml0aWFsaXplKGUpe2NvbnN0IHQ9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShlLndpZHRoLGUuaGVpZ2h0KSxyPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZGVmcyIpO3QuYXBwZW5kQ2hpbGQocik7dGhpcy5kZWZzPXI7Y29uc3Qgbj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTtuLnNldEF0dHJpYnV0ZU5TKG51bGwsInRyYW5zZm9ybSIscG0oZS50cmFuc2Zvcm0pKTt0LmFwcGVuZENoaWxkKG4pO3RoaXMuc3ZnPW47cmV0dXJuIHR9X2Vuc3VyZUNsaXBHcm91cCgpe2lmKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKXtjb25zdCBlPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZyIpO2Uuc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1wYXRoIix0aGlzLmN1cnJlbnQuYWN0aXZlQ2xpcFVybCk7dGhpcy5zdmcuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jdXJyZW50LmNsaXBHcm91cD1lfXJldHVybiB0aGlzLmN1cnJlbnQuY2xpcEdyb3VwfV9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpe2lmKCF0aGlzLnRncnApe3RoaXMudGdycD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTt0aGlzLnRncnAuc2V0QXR0cmlidXRlTlMobnVsbCwidHJhbnNmb3JtIixwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO3RoaXMuY3VycmVudC5hY3RpdmVDbGlwVXJsP3RoaXMuX2Vuc3VyZUNsaXBHcm91cCgpLmFwcGVuZENoaWxkKHRoaXMudGdycCk6dGhpcy5zdmcuYXBwZW5kQ2hpbGQodGhpcy50Z3JwKX1yZXR1cm4gdGhpcy50Z3JwfX19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlBERk5vZGVTdHJlYW09dm9pZCAwO3ZhciBuPXIoMikscz1yKDIzKTtjb25zdCBhPXJlcXVpcmUoImZzIiksaT1yZXF1aXJlKCJodHRwIiksbz1yZXF1aXJlKCJodHRwcyIpLGw9cmVxdWlyZSgidXJsIiksYz0vXmZpbGU6XC9cL1wvW2EtekEtWl06XC8vO3QuUERGTm9kZVN0cmVhbT1jbGFzcyBQREZOb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUpe3RoaXMuc291cmNlPWU7dGhpcy51cmw9ZnVuY3Rpb24gcGFyc2VVcmwoZSl7Y29uc3QgdD1sLnBhcnNlKGUpO2lmKCJmaWxlOiI9PT10LnByb3RvY29sfHx0Lmhvc3QpcmV0dXJuIHQ7aWYoL15bYS16XTpbL1xcXS9pLnRlc3QoZSkpcmV0dXJuIGwucGFyc2UoImZpbGU6Ly8vIitlKTt0Lmhvc3R8fCh0LnByb3RvY29sPSJmaWxlOiIpO3JldHVybiB0fShlLnVybCk7dGhpcy5pc0h0dHA9Imh0dHA6Ij09PXRoaXMudXJsLnByb3RvY29sfHwiaHR0cHM6Ij09PXRoaXMudXJsLnByb3RvY29sO3RoaXMuaXNGc1VybD0iZmlsZToiPT09dGhpcy51cmwucHJvdG9jb2w7dGhpcy5odHRwSGVhZGVycz10aGlzLmlzSHR0cCYmZS5odHRwSGVhZGVyc3x8e307dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbDt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzPVtdfWdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyP3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQ6MH1nZXRGdWxsUmVhZGVyKCl7KDAsbi5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGTm9kZVN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpO3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPXRoaXMuaXNGc1VybD9uZXcgUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcih0aGlzKTpuZXcgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodGhpcyk7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyfWdldFJhbmdlUmVhZGVyKGUsdCl7aWYodDw9dGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKXJldHVybiBudWxsO2NvbnN0IHI9dGhpcy5pc0ZzVXJsP25ldyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcih0aGlzLGUsdCk6bmV3IFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlcih0aGlzLGUsdCk7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHIpO3JldHVybiByfWNhbmNlbEFsbFJlcXVlc3RzKGUpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyJiZ0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwoZSk7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNhbmNlbChlKX0pKX19O2NsYXNzIEJhc2VGdWxsUmVhZGVye2NvbnN0cnVjdG9yKGUpe3RoaXMuX3VybD1lLnVybDt0aGlzLl9kb25lPSExO3RoaXMuX3N0b3JlZEVycm9yPW51bGw7dGhpcy5vblByb2dyZXNzPW51bGw7Y29uc3QgdD1lLnNvdXJjZTt0aGlzLl9jb250ZW50TGVuZ3RoPXQubGVuZ3RoO3RoaXMuX2xvYWRlZD0wO3RoaXMuX2ZpbGVuYW1lPW51bGw7dGhpcy5fZGlzYWJsZVJhbmdlPXQuZGlzYWJsZVJhbmdlfHwhMTt0aGlzLl9yYW5nZUNodW5rU2l6ZT10LnJhbmdlQ2h1bmtTaXplO3RoaXMuX3JhbmdlQ2h1bmtTaXplfHx0aGlzLl9kaXNhYmxlUmFuZ2V8fCh0aGlzLl9kaXNhYmxlUmFuZ2U9ITApO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSF0LmRpc2FibGVTdHJlYW07dGhpcy5faXNSYW5nZVN1cHBvcnRlZD0hdC5kaXNhYmxlUmFuZ2U7dGhpcy5fcmVhZGFibGVTdHJlYW09bnVsbDt0aGlzLl9yZWFkQ2FwYWJpbGl0eT0oMCxuLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMuX2hlYWRlcnNDYXBhYmlsaXR5PSgwLG4uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCl9Z2V0IGhlYWRlcnNSZWFkeSgpe3JldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlfWdldCBmaWxlbmFtZSgpe3JldHVybiB0aGlzLl9maWxlbmFtZX1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofWdldCBpc1JhbmdlU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWR9Z2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkfWFzeW5jIHJlYWQoKXthd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO2lmKHRoaXMuX2RvbmUpcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfTtpZih0aGlzLl9zdG9yZWRFcnJvcil0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtjb25zdCBlPXRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTtpZihudWxsPT09ZSl7dGhpcy5fcmVhZENhcGFiaWxpdHk9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtyZXR1cm4gdGhpcy5yZWFkKCl9dGhpcy5fbG9hZGVkKz1lLmxlbmd0aDt0aGlzLm9uUHJvZ3Jlc3MmJnRoaXMub25Qcm9ncmVzcyh7bG9hZGVkOnRoaXMuX2xvYWRlZCx0b3RhbDp0aGlzLl9jb250ZW50TGVuZ3RofSk7cmV0dXJue3ZhbHVlOm5ldyBVaW50OEFycmF5KGUpLmJ1ZmZlcixkb25lOiExfX1jYW5jZWwoZSl7dGhpcy5fcmVhZGFibGVTdHJlYW0/dGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveShlKTp0aGlzLl9lcnJvcihlKX1fZXJyb3IoZSl7dGhpcy5fc3RvcmVkRXJyb3I9ZTt0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCl9X3NldFJlYWRhYmxlU3RyZWFtKGUpe3RoaXMuX3JlYWRhYmxlU3RyZWFtPWU7ZS5vbigicmVhZGFibGUiLCgpPT57dGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpfSk7ZS5vbigiZW5kIiwoKT0+e2UuZGVzdHJveSgpO3RoaXMuX2RvbmU9ITA7dGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpfSk7ZS5vbigiZXJyb3IiLGU9Pnt0aGlzLl9lcnJvcihlKX0pOyF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCYmdGhpcy5faXNSYW5nZVN1cHBvcnRlZCYmdGhpcy5fZXJyb3IobmV3IG4uQWJvcnRFeGNlcHRpb24oInN0cmVhbWluZyBpcyBkaXNhYmxlZCIpKTt0aGlzLl9zdG9yZWRFcnJvciYmdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcil9fWNsYXNzIEJhc2VSYW5nZVJlYWRlcntjb25zdHJ1Y3RvcihlKXt0aGlzLl91cmw9ZS51cmw7dGhpcy5fZG9uZT0hMTt0aGlzLl9zdG9yZWRFcnJvcj1udWxsO3RoaXMub25Qcm9ncmVzcz1udWxsO3RoaXMuX2xvYWRlZD0wO3RoaXMuX3JlYWRhYmxlU3RyZWFtPW51bGw7dGhpcy5fcmVhZENhcGFiaWxpdHk9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtjb25zdCB0PWUuc291cmNlO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSF0LmRpc2FibGVTdHJlYW19Z2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkfWFzeW5jIHJlYWQoKXthd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO2lmKHRoaXMuX2RvbmUpcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfTtpZih0aGlzLl9zdG9yZWRFcnJvcil0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtjb25zdCBlPXRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTtpZihudWxsPT09ZSl7dGhpcy5fcmVhZENhcGFiaWxpdHk9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtyZXR1cm4gdGhpcy5yZWFkKCl9dGhpcy5fbG9hZGVkKz1lLmxlbmd0aDt0aGlzLm9uUHJvZ3Jlc3MmJnRoaXMub25Qcm9ncmVzcyh7bG9hZGVkOnRoaXMuX2xvYWRlZH0pO3JldHVybnt2YWx1ZTpuZXcgVWludDhBcnJheShlKS5idWZmZXIsZG9uZTohMX19Y2FuY2VsKGUpe3RoaXMuX3JlYWRhYmxlU3RyZWFtP3RoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3koZSk6dGhpcy5fZXJyb3IoZSl9X2Vycm9yKGUpe3RoaXMuX3N0b3JlZEVycm9yPWU7dGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpfV9zZXRSZWFkYWJsZVN0cmVhbShlKXt0aGlzLl9yZWFkYWJsZVN0cmVhbT1lO2Uub24oInJlYWRhYmxlIiwoKT0+e3RoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKX0pO2Uub24oImVuZCIsKCk9PntlLmRlc3Ryb3koKTt0aGlzLl9kb25lPSEwO3RoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKX0pO2Uub24oImVycm9yIixlPT57dGhpcy5fZXJyb3IoZSl9KTt0aGlzLl9zdG9yZWRFcnJvciYmdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcil9fWZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RPcHRpb25zKGUsdCl7cmV0dXJue3Byb3RvY29sOmUucHJvdG9jb2wsYXV0aDplLmF1dGgsaG9zdDplLmhvc3RuYW1lLHBvcnQ6ZS5wb3J0LHBhdGg6ZS5wYXRoLG1ldGhvZDoiR0VUIixoZWFkZXJzOnR9fWNsYXNzIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7Y29uc3QgaGFuZGxlUmVzcG9uc2U9dD0+e2lmKDQwND09PXQuc3RhdHVzQ29kZSl7Y29uc3QgZT1uZXcgbi5NaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiAiJHt0aGlzLl91cmx9Ii5gKTt0aGlzLl9zdG9yZWRFcnJvcj1lO3RoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlKTtyZXR1cm59dGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO3RoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHQpO2NvbnN0IGdldFJlc3BvbnNlSGVhZGVyPWU9PnRoaXMuX3JlYWRhYmxlU3RyZWFtLmhlYWRlcnNbZS50b0xvd2VyQ2FzZSgpXSx7YWxsb3dSYW5nZVJlcXVlc3RzOnIsc3VnZ2VzdGVkTGVuZ3RoOmF9PSgwLHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHtnZXRSZXNwb25zZUhlYWRlcjpnZXRSZXNwb25zZUhlYWRlcixpc0h0dHA6ZS5pc0h0dHAscmFuZ2VDaHVua1NpemU6dGhpcy5fcmFuZ2VDaHVua1NpemUsZGlzYWJsZVJhbmdlOnRoaXMuX2Rpc2FibGVSYW5nZX0pO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9cjt0aGlzLl9jb250ZW50TGVuZ3RoPWF8fHRoaXMuX2NvbnRlbnRMZW5ndGg7dGhpcy5fZmlsZW5hbWU9KDAscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcil9O3RoaXMuX3JlcXVlc3Q9bnVsbDsiaHR0cDoiPT09dGhpcy5fdXJsLnByb3RvY29sP3RoaXMuX3JlcXVlc3Q9aS5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCxlLmh0dHBIZWFkZXJzKSxoYW5kbGVSZXNwb25zZSk6dGhpcy5fcmVxdWVzdD1vLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLGUuaHR0cEhlYWRlcnMpLGhhbmRsZVJlc3BvbnNlKTt0aGlzLl9yZXF1ZXN0Lm9uKCJlcnJvciIsZT0+e3RoaXMuX3N0b3JlZEVycm9yPWU7dGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGUpfSk7dGhpcy5fcmVxdWVzdC5lbmQoKX19Y2xhc3MgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVye2NvbnN0cnVjdG9yKGUsdCxyKXtzdXBlcihlKTt0aGlzLl9odHRwSGVhZGVycz17fTtmb3IoY29uc3QgdCBpbiBlLmh0dHBIZWFkZXJzKXtjb25zdCByPWUuaHR0cEhlYWRlcnNbdF07dm9pZCAwIT09ciYmKHRoaXMuX2h0dHBIZWFkZXJzW3RdPXIpfXRoaXMuX2h0dHBIZWFkZXJzLlJhbmdlPWBieXRlcz0ke3R9LSR7ci0xfWA7Y29uc3QgaGFuZGxlUmVzcG9uc2U9ZT0+e2lmKDQwNCE9PWUuc3RhdHVzQ29kZSl0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShlKTtlbHNle2NvbnN0IGU9bmV3IG4uTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgIiR7dGhpcy5fdXJsfSIuYCk7dGhpcy5fc3RvcmVkRXJyb3I9ZX19O3RoaXMuX3JlcXVlc3Q9bnVsbDsiaHR0cDoiPT09dGhpcy5fdXJsLnByb3RvY29sP3RoaXMuX3JlcXVlc3Q9aS5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCx0aGlzLl9odHRwSGVhZGVycyksaGFuZGxlUmVzcG9uc2UpOnRoaXMuX3JlcXVlc3Q9by5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCx0aGlzLl9odHRwSGVhZGVycyksaGFuZGxlUmVzcG9uc2UpO3RoaXMuX3JlcXVlc3Qub24oImVycm9yIixlPT57dGhpcy5fc3RvcmVkRXJyb3I9ZX0pO3RoaXMuX3JlcXVlc3QuZW5kKCl9fWNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtsZXQgdD1kZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO2MudGVzdCh0aGlzLl91cmwuaHJlZikmJih0PXQucmVwbGFjZSgvXlwvLywiIikpO2EubHN0YXQodCwoZSxyKT0+e2lmKGUpeyJFTk9FTlQiPT09ZS5jb2RlJiYoZT1uZXcgbi5NaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiAiJHt0fSIuYCkpO3RoaXMuX3N0b3JlZEVycm9yPWU7dGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGUpfWVsc2V7dGhpcy5fY29udGVudExlbmd0aD1yLnNpemU7dGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oYS5jcmVhdGVSZWFkU3RyZWFtKHQpKTt0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCl9fSl9fWNsYXNzIFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVye2NvbnN0cnVjdG9yKGUsdCxyKXtzdXBlcihlKTtsZXQgbj1kZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO2MudGVzdCh0aGlzLl91cmwuaHJlZikmJihuPW4ucmVwbGFjZSgvXlwvLywiIikpO3RoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGEuY3JlYXRlUmVhZFN0cmVhbShuLHtzdGFydDp0LGVuZDpyLTF9KSl9fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yPWZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IoZSx0KXtpZig0MDQ9PT1lfHwwPT09ZSYmdC5zdGFydHNXaXRoKCJmaWxlOiIpKXJldHVybiBuZXcgbi5NaXNzaW5nUERGRXhjZXB0aW9uKCdNaXNzaW5nIFBERiAiJyt0KyciLicpO3JldHVybiBuZXcgbi5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlICgiK2UrJykgd2hpbGUgcmV0cmlldmluZyBQREYgIicrdCsnIi4nLGUpfTt0LmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXI9ZnVuY3Rpb24gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihlKXtjb25zdCB0PWUoIkNvbnRlbnQtRGlzcG9zaXRpb24iKTtpZih0KXtsZXQgZT0oMCxzLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcikodCk7aWYoZS5pbmNsdWRlcygiJSIpKXRyeXtlPWRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaChlKXt9aWYoL1wucGRmJC9pLnRlc3QoZSkpcmV0dXJuIGV9cmV0dXJuIG51bGx9O3QudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXM9ZnVuY3Rpb24gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe2dldFJlc3BvbnNlSGVhZGVyOmUsaXNIdHRwOnQscmFuZ2VDaHVua1NpemU6cixkaXNhYmxlUmFuZ2U6c30peygwLG4uYXNzZXJ0KShyPjAsIlJhbmdlIGNodW5rIHNpemUgbXVzdCBiZSBsYXJnZXIgdGhhbiB6ZXJvIik7Y29uc3QgYT17YWxsb3dSYW5nZVJlcXVlc3RzOiExLHN1Z2dlc3RlZExlbmd0aDp2b2lkIDB9LGk9cGFyc2VJbnQoZSgiQ29udGVudC1MZW5ndGgiKSwxMCk7aWYoIU51bWJlci5pc0ludGVnZXIoaSkpcmV0dXJuIGE7YS5zdWdnZXN0ZWRMZW5ndGg9aTtpZihpPD0yKnIpcmV0dXJuIGE7aWYoc3x8IXQpcmV0dXJuIGE7aWYoImJ5dGVzIiE9PWUoIkFjY2VwdC1SYW5nZXMiKSlyZXR1cm4gYTtpZigiaWRlbnRpdHkiIT09KGUoIkNvbnRlbnQtRW5jb2RpbmciKXx8ImlkZW50aXR5IikpcmV0dXJuIGE7YS5hbGxvd1JhbmdlUmVxdWVzdHM9ITA7cmV0dXJuIGF9O3QudmFsaWRhdGVSZXNwb25zZVN0YXR1cz1mdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKGUpe3JldHVybiAyMDA9PT1lfHwyMDY9PT1lfTt2YXIgbj1yKDIpLHM9cigyNCl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyPWZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcihlKXtsZXQgdD0hMCxyPXRvUGFyYW1SZWdFeHAoImZpbGVuYW1lXFwqIiwiaSIpLmV4ZWMoZSk7aWYocil7cj1yWzFdO2xldCBlPXJmYzI2MTZ1bnF1b3RlKHIpO2U9dW5lc2NhcGUoZSk7ZT1yZmM1OTg3ZGVjb2RlKGUpO2U9cmZjMjA0N2RlY29kZShlKTtyZXR1cm4gZml4dXBFbmNvZGluZyhlKX1yPWZ1bmN0aW9uIHJmYzIyMzFnZXRwYXJhbShlKXtjb25zdCB0PVtdO2xldCByO2NvbnN0IG49dG9QYXJhbVJlZ0V4cCgiZmlsZW5hbWVcXCooKD8hMFxcZClcXGQrKShcXCo/KSIsImlnIik7Zm9yKDtudWxsIT09KHI9bi5leGVjKGUpKTspe2xldFssZSxuLHNdPXI7ZT1wYXJzZUludChlLDEwKTtpZihlIGluIHQpe2lmKDA9PT1lKWJyZWFrfWVsc2UgdFtlXT1bbixzXX1jb25zdCBzPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGgmJmUgaW4gdDsrK2Upe2xldFtyLG5dPXRbZV07bj1yZmMyNjE2dW5xdW90ZShuKTtpZihyKXtuPXVuZXNjYXBlKG4pOzA9PT1lJiYobj1yZmM1OTg3ZGVjb2RlKG4pKX1zLnB1c2gobil9cmV0dXJuIHMuam9pbigiIil9KGUpO2lmKHIpe3JldHVybiBmaXh1cEVuY29kaW5nKHJmYzIwNDdkZWNvZGUocikpfXI9dG9QYXJhbVJlZ0V4cCgiZmlsZW5hbWUiLCJpIikuZXhlYyhlKTtpZihyKXtyPXJbMV07bGV0IGU9cmZjMjYxNnVucXVvdGUocik7ZT1yZmMyMDQ3ZGVjb2RlKGUpO3JldHVybiBmaXh1cEVuY29kaW5nKGUpfWZ1bmN0aW9uIHRvUGFyYW1SZWdFeHAoZSx0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiKD86Xnw7KVxccyoiK2UrJ1xccyo9XFxzKihbXiI7XFxzXVteO1xcc10qfCIoPzpbXiJcXFxcXXxcXFxcIj8pKyI/KScsdCl9ZnVuY3Rpb24gdGV4dGRlY29kZShlLHIpe2lmKGUpe2lmKCEvXltceDAwLVx4RkZdKyQvLnRlc3QocikpcmV0dXJuIHI7dHJ5e2NvbnN0IG49bmV3IFRleHREZWNvZGVyKGUse2ZhdGFsOiEwfSkscz1BcnJheS5mcm9tKHIsKGZ1bmN0aW9uKGUpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KDApfSkpO3I9bi5kZWNvZGUobmV3IFVpbnQ4QXJyYXkocykpO3Q9ITF9Y2F0Y2gobil7aWYoL151dGYtPzgkL2kudGVzdChlKSl0cnl7cj1kZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHIpKTt0PSExfWNhdGNoKGUpe319fXJldHVybiByfWZ1bmN0aW9uIGZpeHVwRW5jb2RpbmcoZSl7aWYodCYmL1tceDgwLVx4ZmZdLy50ZXN0KGUpKXtlPXRleHRkZWNvZGUoInV0Zi04IixlKTt0JiYoZT10ZXh0ZGVjb2RlKCJpc28tODg1OS0xIixlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gcmZjMjYxNnVucXVvdGUoZSl7aWYoZS5zdGFydHNXaXRoKCciJykpe2NvbnN0IHQ9ZS5zbGljZSgxKS5zcGxpdCgnXFwiJyk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2Upe2NvbnN0IHI9dFtlXS5pbmRleE9mKCciJyk7aWYoLTEhPT1yKXt0W2VdPXRbZV0uc2xpY2UoMCxyKTt0Lmxlbmd0aD1lKzF9dFtlXT10W2VdLnJlcGxhY2UoL1xcKC4pL2csIiQxIil9ZT10LmpvaW4oJyInKX1yZXR1cm4gZX1mdW5jdGlvbiByZmM1OTg3ZGVjb2RlKGUpe2NvbnN0IHQ9ZS5pbmRleE9mKCInIik7aWYoLTE9PT10KXJldHVybiBlO3JldHVybiB0ZXh0ZGVjb2RlKGUuc2xpY2UoMCx0KSxlLnNsaWNlKHQrMSkucmVwbGFjZSgvXlteJ10qJy8sIiIpKX1mdW5jdGlvbiByZmMyMDQ3ZGVjb2RlKGUpe3JldHVybiFlLnN0YXJ0c1dpdGgoIj0/Iil8fC9bXHgwMC1ceDE5XHg4MC1ceGZmXS8udGVzdChlKT9lOmUucmVwbGFjZSgvPVw/KFtcdy1dKilcPyhbUXFCYl0pXD8oKD86W14/XXxcPyg/IT0pKSopXD89L2csKGZ1bmN0aW9uKGUsdCxyLG4pe2lmKCJxIj09PXJ8fCJRIj09PXIpcmV0dXJuIHRleHRkZWNvZGUodCxuPShuPW4ucmVwbGFjZSgvXy9nLCIgIikpLnJlcGxhY2UoLz0oWzAtOWEtZkEtRl17Mn0pL2csKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodCwxNikpfSkpKTt0cnl7bj1hdG9iKG4pfWNhdGNoKGUpe31yZXR1cm4gdGV4dGRlY29kZSh0LG4pfSkpfXJldHVybiIifX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5QREZOZXR3b3JrU3RyZWFtPXZvaWQgMDt2YXIgbj1yKDIpLHM9cigyMyk7Y2xhc3MgTmV0d29ya01hbmFnZXJ7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnVybD1lO3Q9dHx8e307dGhpcy5pc0h0dHA9L15odHRwcz86L2kudGVzdChlKTt0aGlzLmh0dHBIZWFkZXJzPXRoaXMuaXNIdHRwJiZ0Lmh0dHBIZWFkZXJzfHx7fTt0aGlzLndpdGhDcmVkZW50aWFscz10LndpdGhDcmVkZW50aWFsc3x8ITE7dGhpcy5nZXRYaHI9dC5nZXRYaHJ8fGZ1bmN0aW9uIE5ldHdvcmtNYW5hZ2VyX2dldFhocigpe3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9O3RoaXMuY3VyclhocklkPTA7dGhpcy5wZW5kaW5nUmVxdWVzdHM9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXF1ZXN0UmFuZ2UoZSx0LHIpe2NvbnN0IG49e2JlZ2luOmUsZW5kOnR9O2Zvcihjb25zdCBlIGluIHIpbltlXT1yW2VdO3JldHVybiB0aGlzLnJlcXVlc3Qobil9cmVxdWVzdEZ1bGwoZSl7cmV0dXJuIHRoaXMucmVxdWVzdChlKX1yZXF1ZXN0KGUpe2NvbnN0IHQ9dGhpcy5nZXRYaHIoKSxyPXRoaXMuY3VyclhocklkKyssbj10aGlzLnBlbmRpbmdSZXF1ZXN0c1tyXT17eGhyOnR9O3Qub3BlbigiR0VUIix0aGlzLnVybCk7dC53aXRoQ3JlZGVudGlhbHM9dGhpcy53aXRoQ3JlZGVudGlhbHM7Zm9yKGNvbnN0IGUgaW4gdGhpcy5odHRwSGVhZGVycyl7Y29uc3Qgcj10aGlzLmh0dHBIZWFkZXJzW2VdO3ZvaWQgMCE9PXImJnQuc2V0UmVxdWVzdEhlYWRlcihlLHIpfWlmKHRoaXMuaXNIdHRwJiYiYmVnaW4iaW4gZSYmImVuZCJpbiBlKXt0LnNldFJlcXVlc3RIZWFkZXIoIlJhbmdlIixgYnl0ZXM9JHtlLmJlZ2lufS0ke2UuZW5kLTF9YCk7bi5leHBlY3RlZFN0YXR1cz0yMDZ9ZWxzZSBuLmV4cGVjdGVkU3RhdHVzPTIwMDt0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO2Uub25FcnJvciYmKHQub25lcnJvcj1mdW5jdGlvbihyKXtlLm9uRXJyb3IodC5zdGF0dXMpfSk7dC5vbnJlYWR5c3RhdGVjaGFuZ2U9dGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcyxyKTt0Lm9ucHJvZ3Jlc3M9dGhpcy5vblByb2dyZXNzLmJpbmQodGhpcyxyKTtuLm9uSGVhZGVyc1JlY2VpdmVkPWUub25IZWFkZXJzUmVjZWl2ZWQ7bi5vbkRvbmU9ZS5vbkRvbmU7bi5vbkVycm9yPWUub25FcnJvcjtuLm9uUHJvZ3Jlc3M9ZS5vblByb2dyZXNzO3Quc2VuZChudWxsKTtyZXR1cm4gcn1vblByb2dyZXNzKGUsdCl7Y29uc3Qgcj10aGlzLnBlbmRpbmdSZXF1ZXN0c1tlXTtyJiZyLm9uUHJvZ3Jlc3MmJnIub25Qcm9ncmVzcyh0KX1vblN0YXRlQ2hhbmdlKGUsdCl7Y29uc3Qgcj10aGlzLnBlbmRpbmdSZXF1ZXN0c1tlXTtpZighcilyZXR1cm47Y29uc3Qgcz1yLnhocjtpZihzLnJlYWR5U3RhdGU+PTImJnIub25IZWFkZXJzUmVjZWl2ZWQpe3Iub25IZWFkZXJzUmVjZWl2ZWQoKTtkZWxldGUgci5vbkhlYWRlcnNSZWNlaXZlZH1pZig0IT09cy5yZWFkeVN0YXRlKXJldHVybjtpZighKGUgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKXJldHVybjtkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbZV07aWYoMD09PXMuc3RhdHVzJiZ0aGlzLmlzSHR0cCl7ci5vbkVycm9yJiZyLm9uRXJyb3Iocy5zdGF0dXMpO3JldHVybn1jb25zdCBhPXMuc3RhdHVzfHwyMDA7aWYoISgyMDA9PT1hJiYyMDY9PT1yLmV4cGVjdGVkU3RhdHVzKSYmYSE9PXIuZXhwZWN0ZWRTdGF0dXMpe3Iub25FcnJvciYmci5vbkVycm9yKHMuc3RhdHVzKTtyZXR1cm59Y29uc3QgaT1mdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcihlKXtjb25zdCB0PWUucmVzcG9uc2U7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0P3Q6KDAsbi5zdHJpbmdUb0J5dGVzKSh0KS5idWZmZXJ9KHMpO2lmKDIwNj09PWEpe2NvbnN0IGU9cy5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1SYW5nZSIpLHQ9L2J5dGVzIChcZCspLShcZCspXC8oXGQrKS8uZXhlYyhlKTtyLm9uRG9uZSh7YmVnaW46cGFyc2VJbnQodFsxXSwxMCksY2h1bms6aX0pfWVsc2UgaT9yLm9uRG9uZSh7YmVnaW46MCxjaHVuazppfSk6ci5vbkVycm9yJiZyLm9uRXJyb3Iocy5zdGF0dXMpfWdldFJlcXVlc3RYaHIoZSl7cmV0dXJuIHRoaXMucGVuZGluZ1JlcXVlc3RzW2VdLnhocn1pc1BlbmRpbmdSZXF1ZXN0KGUpe3JldHVybiBlIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzfWFib3J0UmVxdWVzdChlKXtjb25zdCB0PXRoaXMucGVuZGluZ1JlcXVlc3RzW2VdLnhocjtkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbZV07dC5hYm9ydCgpfX10LlBERk5ldHdvcmtTdHJlYW09Y2xhc3MgUERGTmV0d29ya1N0cmVhbXtjb25zdHJ1Y3RvcihlKXt0aGlzLl9zb3VyY2U9ZTt0aGlzLl9tYW5hZ2VyPW5ldyBOZXR3b3JrTWFuYWdlcihlLnVybCx7aHR0cEhlYWRlcnM6ZS5odHRwSGVhZGVycyx3aXRoQ3JlZGVudGlhbHM6ZS53aXRoQ3JlZGVudGlhbHN9KTt0aGlzLl9yYW5nZUNodW5rU2l6ZT1lLnJhbmdlQ2h1bmtTaXplO3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPW51bGw7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycz1bXX1fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQoZSl7Y29uc3QgdD10aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLmluZGV4T2YoZSk7dD49MCYmdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zcGxpY2UodCwxKX1nZXRGdWxsUmVhZGVyKCl7KDAsbi5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGTmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpO3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPW5ldyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlcix0aGlzLl9zb3VyY2UpO3JldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcn1nZXRSYW5nZVJlYWRlcihlLHQpe2NvbnN0IHI9bmV3IFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlcixlLHQpO3Iub25DbG9zZWQ9dGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocik7cmV0dXJuIHJ9Y2FuY2VsQWxsUmVxdWVzdHMoZSl7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXImJnRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbChlKTt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2FuY2VsKGUpfSkpfX07Y2xhc3MgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVye2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fbWFuYWdlcj1lO2NvbnN0IHI9e29uSGVhZGVyc1JlY2VpdmVkOnRoaXMuX29uSGVhZGVyc1JlY2VpdmVkLmJpbmQodGhpcyksb25Eb25lOnRoaXMuX29uRG9uZS5iaW5kKHRoaXMpLG9uRXJyb3I6dGhpcy5fb25FcnJvci5iaW5kKHRoaXMpLG9uUHJvZ3Jlc3M6dGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpfTt0aGlzLl91cmw9dC51cmw7dGhpcy5fZnVsbFJlcXVlc3RJZD1lLnJlcXVlc3RGdWxsKHIpO3RoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHk9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9kaXNhYmxlUmFuZ2U9dC5kaXNhYmxlUmFuZ2V8fCExO3RoaXMuX2NvbnRlbnRMZW5ndGg9dC5sZW5ndGg7dGhpcy5fcmFuZ2VDaHVua1NpemU9dC5yYW5nZUNodW5rU2l6ZTt0aGlzLl9yYW5nZUNodW5rU2l6ZXx8dGhpcy5fZGlzYWJsZVJhbmdlfHwodGhpcy5fZGlzYWJsZVJhbmdlPSEwKTt0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZD0hMTt0aGlzLl9pc1JhbmdlU3VwcG9ydGVkPSExO3RoaXMuX2NhY2hlZENodW5rcz1bXTt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9kb25lPSExO3RoaXMuX3N0b3JlZEVycm9yPXZvaWQgMDt0aGlzLl9maWxlbmFtZT1udWxsO3RoaXMub25Qcm9ncmVzcz1udWxsfV9vbkhlYWRlcnNSZWNlaXZlZCgpe2NvbnN0IGU9dGhpcy5fZnVsbFJlcXVlc3RJZCx0PXRoaXMuX21hbmFnZXIuZ2V0UmVxdWVzdFhocihlKSxnZXRSZXNwb25zZUhlYWRlcj1lPT50LmdldFJlc3BvbnNlSGVhZGVyKGUpLHthbGxvd1JhbmdlUmVxdWVzdHM6cixzdWdnZXN0ZWRMZW5ndGg6bn09KDAscy52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe2dldFJlc3BvbnNlSGVhZGVyOmdldFJlc3BvbnNlSGVhZGVyLGlzSHR0cDp0aGlzLl9tYW5hZ2VyLmlzSHR0cCxyYW5nZUNodW5rU2l6ZTp0aGlzLl9yYW5nZUNodW5rU2l6ZSxkaXNhYmxlUmFuZ2U6dGhpcy5fZGlzYWJsZVJhbmdlfSk7ciYmKHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9ITApO3RoaXMuX2NvbnRlbnRMZW5ndGg9bnx8dGhpcy5fY29udGVudExlbmd0aDt0aGlzLl9maWxlbmFtZT0oMCxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGdldFJlc3BvbnNlSGVhZGVyKTt0aGlzLl9pc1JhbmdlU3VwcG9ydGVkJiZ0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdChlKTt0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlc29sdmUoKX1fb25Eb25lKGUpe2lmKGUpaWYodGhpcy5fcmVxdWVzdHMubGVuZ3RoPjApe3RoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7dmFsdWU6ZS5jaHVuayxkb25lOiExfSl9ZWxzZSB0aGlzLl9jYWNoZWRDaHVua3MucHVzaChlLmNodW5rKTt0aGlzLl9kb25lPSEwO2lmKCEodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aD4wKSl7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSkpO3RoaXMuX3JlcXVlc3RzPVtdfX1fb25FcnJvcihlKXtjb25zdCB0PXRoaXMuX3VybCxyPSgwLHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikoZSx0KTt0aGlzLl9zdG9yZWRFcnJvcj1yO3RoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHIpO3RoaXMuX3JlcXVlc3RzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UucmVqZWN0KHIpfSkpO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX2NhY2hlZENodW5rcz1bXX1fb25Qcm9ncmVzcyhlKXt0aGlzLm9uUHJvZ3Jlc3MmJnRoaXMub25Qcm9ncmVzcyh7bG9hZGVkOmUubG9hZGVkLHRvdGFsOmUubGVuZ3RoQ29tcHV0YWJsZT9lLnRvdGFsOnRoaXMuX2NvbnRlbnRMZW5ndGh9KX1nZXQgZmlsZW5hbWUoKXtyZXR1cm4gdGhpcy5fZmlsZW5hbWV9Z2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZH1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9Z2V0IGNvbnRlbnRMZW5ndGgoKXtyZXR1cm4gdGhpcy5fY29udGVudExlbmd0aH1nZXQgaGVhZGVyc1JlYWR5KCl7cmV0dXJuIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucHJvbWlzZX1hc3luYyByZWFkKCl7aWYodGhpcy5fc3RvcmVkRXJyb3IpdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7aWYodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aD4wKXtyZXR1cm57dmFsdWU6dGhpcy5fY2FjaGVkQ2h1bmtzLnNoaWZ0KCksZG9uZTohMX19aWYodGhpcy5fZG9uZSlyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9O2NvbnN0IGU9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9yZXF1ZXN0cy5wdXNoKGUpO3JldHVybiBlLnByb21pc2V9Y2FuY2VsKGUpe3RoaXMuX2RvbmU9ITA7dGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QoZSk7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSkpO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKSYmdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCk7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbH19Y2xhc3MgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcntjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5fbWFuYWdlcj1lO2NvbnN0IG49e29uRG9uZTp0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxvblByb2dyZXNzOnRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKX07dGhpcy5fcmVxdWVzdElkPWUucmVxdWVzdFJhbmdlKHQscixuKTt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9xdWV1ZWRDaHVuaz1udWxsO3RoaXMuX2RvbmU9ITE7dGhpcy5vblByb2dyZXNzPW51bGw7dGhpcy5vbkNsb3NlZD1udWxsfV9jbG9zZSgpe3RoaXMub25DbG9zZWQmJnRoaXMub25DbG9zZWQodGhpcyl9X29uRG9uZShlKXtjb25zdCB0PWUuY2h1bms7aWYodGhpcy5fcmVxdWVzdHMubGVuZ3RoPjApe3RoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7dmFsdWU6dCxkb25lOiExfSl9ZWxzZSB0aGlzLl9xdWV1ZWRDaHVuaz10O3RoaXMuX2RvbmU9ITA7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSkpO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX2Nsb3NlKCl9X29uUHJvZ3Jlc3MoZSl7IXRoaXMuaXNTdHJlYW1pbmdTdXBwb3J0ZWQmJnRoaXMub25Qcm9ncmVzcyYmdGhpcy5vblByb2dyZXNzKHtsb2FkZWQ6ZS5sb2FkZWR9KX1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4hMX1hc3luYyByZWFkKCl7aWYobnVsbCE9PXRoaXMuX3F1ZXVlZENodW5rKXtjb25zdCBlPXRoaXMuX3F1ZXVlZENodW5rO3RoaXMuX3F1ZXVlZENodW5rPW51bGw7cmV0dXJue3ZhbHVlOmUsZG9uZTohMX19aWYodGhpcy5fZG9uZSlyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9O2NvbnN0IGU9KDAsbi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9yZXF1ZXN0cy5wdXNoKGUpO3JldHVybiBlLnByb21pc2V9Y2FuY2VsKGUpe3RoaXMuX2RvbmU9ITA7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSkpO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpJiZ0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpO3RoaXMuX2Nsb3NlKCl9fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5QREZGZXRjaFN0cmVhbT12b2lkIDA7dmFyIG49cigyKSxzPXIoMjMpO2Z1bmN0aW9uIGNyZWF0ZUZldGNoT3B0aW9ucyhlLHQscil7cmV0dXJue21ldGhvZDoiR0VUIixoZWFkZXJzOmUsc2lnbmFsOnImJnIuc2lnbmFsLG1vZGU6ImNvcnMiLGNyZWRlbnRpYWxzOnQ/ImluY2x1ZGUiOiJzYW1lLW9yaWdpbiIscmVkaXJlY3Q6ImZvbGxvdyJ9fWZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnMoZSl7Y29uc3QgdD1uZXcgSGVhZGVycztmb3IoY29uc3QgciBpbiBlKXtjb25zdCBuPWVbcl07dm9pZCAwIT09biYmdC5hcHBlbmQocixuKX1yZXR1cm4gdH10LlBERkZldGNoU3RyZWFtPWNsYXNzIFBERkZldGNoU3RyZWFte2NvbnN0cnVjdG9yKGUpe3RoaXMuc291cmNlPWU7dGhpcy5pc0h0dHA9L15odHRwcz86L2kudGVzdChlLnVybCk7dGhpcy5odHRwSGVhZGVycz10aGlzLmlzSHR0cCYmZS5odHRwSGVhZGVyc3x8e307dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbDt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzPVtdfWdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyP3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQ6MH1nZXRGdWxsUmVhZGVyKCl7KDAsbi5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGRmV0Y2hTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1uZXcgUERGRmV0Y2hTdHJlYW1SZWFkZXIodGhpcyk7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyfWdldFJhbmdlUmVhZGVyKGUsdCl7aWYodDw9dGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKXJldHVybiBudWxsO2NvbnN0IHI9bmV3IFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXIodGhpcyxlLHQpO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyKTtyZXR1cm4gcn1jYW5jZWxBbGxSZXF1ZXN0cyhlKXt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciYmdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKGUpO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jYW5jZWwoZSl9KSl9fTtjbGFzcyBQREZGZXRjaFN0cmVhbVJlYWRlcntjb25zdHJ1Y3RvcihlKXt0aGlzLl9zdHJlYW09ZTt0aGlzLl9yZWFkZXI9bnVsbDt0aGlzLl9sb2FkZWQ9MDt0aGlzLl9maWxlbmFtZT1udWxsO2NvbnN0IHQ9ZS5zb3VyY2U7dGhpcy5fd2l0aENyZWRlbnRpYWxzPXQud2l0aENyZWRlbnRpYWxzfHwhMTt0aGlzLl9jb250ZW50TGVuZ3RoPXQubGVuZ3RoO3RoaXMuX2hlYWRlcnNDYXBhYmlsaXR5PSgwLG4uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5fZGlzYWJsZVJhbmdlPXQuZGlzYWJsZVJhbmdlfHwhMTt0aGlzLl9yYW5nZUNodW5rU2l6ZT10LnJhbmdlQ2h1bmtTaXplO3RoaXMuX3JhbmdlQ2h1bmtTaXplfHx0aGlzLl9kaXNhYmxlUmFuZ2V8fCh0aGlzLl9kaXNhYmxlUmFuZ2U9ITApOyJ1bmRlZmluZWQiIT10eXBlb2YgQWJvcnRDb250cm9sbGVyJiYodGhpcy5fYWJvcnRDb250cm9sbGVyPW5ldyBBYm9ydENvbnRyb2xsZXIpO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSF0LmRpc2FibGVTdHJlYW07dGhpcy5faXNSYW5nZVN1cHBvcnRlZD0hdC5kaXNhYmxlUmFuZ2U7dGhpcy5faGVhZGVycz1jcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7Y29uc3Qgcj10LnVybDtmZXRjaChyLGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLHRoaXMuX3dpdGhDcmVkZW50aWFscyx0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKGU9PntpZighKDAscy52YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKShlLnN0YXR1cykpdGhyb3coMCxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKGUuc3RhdHVzLHIpO3RoaXMuX3JlYWRlcj1lLmJvZHkuZ2V0UmVhZGVyKCk7dGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO2NvbnN0IGdldFJlc3BvbnNlSGVhZGVyPXQ9PmUuaGVhZGVycy5nZXQodCkse2FsbG93UmFuZ2VSZXF1ZXN0czp0LHN1Z2dlc3RlZExlbmd0aDphfT0oMCxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7Z2V0UmVzcG9uc2VIZWFkZXI6Z2V0UmVzcG9uc2VIZWFkZXIsaXNIdHRwOnRoaXMuX3N0cmVhbS5pc0h0dHAscmFuZ2VDaHVua1NpemU6dGhpcy5fcmFuZ2VDaHVua1NpemUsZGlzYWJsZVJhbmdlOnRoaXMuX2Rpc2FibGVSYW5nZX0pO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9dDt0aGlzLl9jb250ZW50TGVuZ3RoPWF8fHRoaXMuX2NvbnRlbnRMZW5ndGg7dGhpcy5fZmlsZW5hbWU9KDAscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7IXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkJiZ0aGlzLl9pc1JhbmdlU3VwcG9ydGVkJiZ0aGlzLmNhbmNlbChuZXcgbi5BYm9ydEV4Y2VwdGlvbigiU3RyZWFtaW5nIGlzIGRpc2FibGVkLiIpKX0pLmNhdGNoKHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7dGhpcy5vblByb2dyZXNzPW51bGx9Z2V0IGhlYWRlcnNSZWFkeSgpe3JldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlfWdldCBmaWxlbmFtZSgpe3JldHVybiB0aGlzLl9maWxlbmFtZX1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofWdldCBpc1JhbmdlU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWR9Z2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkfWFzeW5jIHJlYWQoKXthd2FpdCB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO2NvbnN0e3ZhbHVlOmUsZG9uZTp0fT1hd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO2lmKHQpcmV0dXJue3ZhbHVlOmUsZG9uZTp0fTt0aGlzLl9sb2FkZWQrPWUuYnl0ZUxlbmd0aDt0aGlzLm9uUHJvZ3Jlc3MmJnRoaXMub25Qcm9ncmVzcyh7bG9hZGVkOnRoaXMuX2xvYWRlZCx0b3RhbDp0aGlzLl9jb250ZW50TGVuZ3RofSk7cmV0dXJue3ZhbHVlOm5ldyBVaW50OEFycmF5KGUpLmJ1ZmZlcixkb25lOiExfX1jYW5jZWwoZSl7dGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKGUpO3RoaXMuX2Fib3J0Q29udHJvbGxlciYmdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCl9fWNsYXNzIFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXJ7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuX3N0cmVhbT1lO3RoaXMuX3JlYWRlcj1udWxsO3RoaXMuX2xvYWRlZD0wO2NvbnN0IGE9ZS5zb3VyY2U7dGhpcy5fd2l0aENyZWRlbnRpYWxzPWEud2l0aENyZWRlbnRpYWxzfHwhMTt0aGlzLl9yZWFkQ2FwYWJpbGl0eT0oMCxuLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSFhLmRpc2FibGVTdHJlYW07InVuZGVmaW5lZCIhPXR5cGVvZiBBYm9ydENvbnRyb2xsZXImJih0aGlzLl9hYm9ydENvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcik7dGhpcy5faGVhZGVycz1jcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7dGhpcy5faGVhZGVycy5hcHBlbmQoIlJhbmdlIixgYnl0ZXM9JHt0fS0ke3ItMX1gKTtjb25zdCBpPWEudXJsO2ZldGNoKGksY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsdGhpcy5fd2l0aENyZWRlbnRpYWxzLHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4oZT0+e2lmKCEoMCxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKGUuc3RhdHVzKSl0aHJvdygwLHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikoZS5zdGF0dXMsaSk7dGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO3RoaXMuX3JlYWRlcj1lLmJvZHkuZ2V0UmVhZGVyKCl9KS5jYXRjaChlPT57aWYoIWV8fCJBYm9ydEVycm9yIiE9PWUubmFtZSl0aHJvdyBlfSk7dGhpcy5vblByb2dyZXNzPW51bGx9Z2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkfWFzeW5jIHJlYWQoKXthd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO2NvbnN0e3ZhbHVlOmUsZG9uZTp0fT1hd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO2lmKHQpcmV0dXJue3ZhbHVlOmUsZG9uZTp0fTt0aGlzLl9sb2FkZWQrPWUuYnl0ZUxlbmd0aDt0aGlzLm9uUHJvZ3Jlc3MmJnRoaXMub25Qcm9ncmVzcyh7bG9hZGVkOnRoaXMuX2xvYWRlZH0pO3JldHVybnt2YWx1ZTpuZXcgVWludDhBcnJheShlKS5idWZmZXIsZG9uZTohMX19Y2FuY2VsKGUpe3RoaXMuX3JlYWRlciYmdGhpcy5fcmVhZGVyLmNhbmNlbChlKTt0aGlzLl9hYm9ydENvbnRyb2xsZXImJnRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpfX19XSl9KSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvcGRmLndvcmtlci5lbnRyeS5qcyBiL2J1aWxkL3BkZi53b3JrZXIuZW50cnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwMGY2MQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3BkZi53b3JrZXIuZW50cnkuanMKQEAgLTAsMCArMSwxOSBAQAorLyogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiCisgID8gd2luZG93CisgIDoge30KKykucGRmanNXb3JrZXIgPSByZXF1aXJlKCIuL3BkZi53b3JrZXIuanMiKTsKZGlmZiAtLWdpdCBhL2J1aWxkL3BkZi53b3JrZXIuanMgYi9idWlsZC9wZGYud29ya2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmRmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9wZGYud29ya2VyLmpzCkBAIC0wLDAgKzEsNDc2MzggQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKworKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKKwlpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpCisJCW1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOworCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQorCQlkZWZpbmUoInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciIsIFtdLCBmYWN0b3J5KTsKKwllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKKwkJZXhwb3J0c1sicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyIl0gPSBmYWN0b3J5KCk7CisJZWxzZQorCQlyb290WyJwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIiXSA9IHJvb3QucGRmanNXb3JrZXIgPSBmYWN0b3J5KCk7Cit9KSh0aGlzLCBmdW5jdGlvbigpIHsKK3JldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwCisvKioqKioqLyAJLy8gVGhlIG1vZHVsZSBjYWNoZQorLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CisvKioqKioqLworLyoqKioqKi8gCS8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uCisvKioqKioqLyAJZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhtb2R1bGVJZCkgeworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCisvKioqKioqLyAJCWlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7CisvKioqKioqLyAJCQlyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0czsKKy8qKioqKiovIAkJfQorLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQorLyoqKioqKi8gCQl2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7CisvKioqKioqLyAJCQlpOiBtb2R1bGVJZCwKKy8qKioqKiovIAkJCWw6IGZhbHNlLAorLyoqKioqKi8gCQkJZXhwb3J0czoge30KKy8qKioqKiovIAkJfTsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgorLyoqKioqKi8gCQltb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKTsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWQKKy8qKioqKiovIAkJbW9kdWxlLmwgPSB0cnVlOworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKKy8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOworLyoqKioqKi8gCX0KKy8qKioqKiovCisvKioqKioqLworLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGUKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzOworLyoqKioqKi8KKy8qKioqKiovIAkvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHsKKy8qKioqKiovIAkJaWYoIV9fd19wZGZqc19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkgeworLyoqKioqKi8gCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7CisvKioqKioqLyAJCX0KKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykgeworLyoqKioqKi8gCQlpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHsKKy8qKioqKiovIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pOworLyoqKioqKi8gCQl9CisvKioqKioqLyAJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0CisvKioqKioqLyAJLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0CisvKioqKioqLyAJLy8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zCisvKioqKioqLyAJLy8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0CisvKioqKioqLyAJLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZQorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7CisvKioqKioqLyAJCWlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18odmFsdWUpOworLyoqKioqKi8gCQlpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlOworLyoqKioqKi8gCQlpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlOworLyoqKioqKi8gCQl2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworLyoqKioqKi8gCQlfX3dfcGRmanNfcmVxdWlyZV9fLnIobnMpOworLyoqKioqKi8gCQlPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7CisvKioqKioqLyAJCWlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd19wZGZqc19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTsKKy8qKioqKiovIAkJcmV0dXJuIG5zOworLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7CisvKioqKioqLyAJCXZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgPworLyoqKioqKi8gCQkJZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDoKKy8qKioqKiovIAkJCWZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07CisvKioqKioqLyAJCV9fd19wZGZqc19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTsKKy8qKioqKiovIAkJcmV0dXJuIGdldHRlcjsKKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07CisvKioqKioqLworLyoqKioqKi8gCS8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5wID0gIiI7CisvKioqKioqLworLyoqKioqKi8KKy8qKioqKiovIAkvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHMKKy8qKioqKiovIAlyZXR1cm4gX193X3BkZmpzX3JlcXVpcmVfXyhfX3dfcGRmanNfcmVxdWlyZV9fLnMgPSAwKTsKKy8qKioqKiovIH0pCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKi8gKFsKKy8qIDAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJXb3JrZXJNZXNzYWdlSGFuZGxlciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF93b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7CisgIH0KK30pOworCit2YXIgX3dvcmtlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK2NvbnN0IHBkZmpzVmVyc2lvbiA9ICcyLjYuMzQ3JzsKK2NvbnN0IHBkZmpzQnVpbGQgPSAnM2JlOWM2NWYnOworCisvKioqLyB9KSwKKy8qIDEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IGV4cG9ydHMuV29ya2VyVGFzayA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9wZGZfbWFuYWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7CisKK3ZhciBfd3JpdGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyNyk7CisKK3ZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CisKK3ZhciBfbWVzc2FnZV9oYW5kbGVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nik7CisKK3ZhciBfd29ya2VyX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworCitjbGFzcyBXb3JrZXJUYXNrIHsKKyAgY29uc3RydWN0b3IobmFtZSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy50ZXJtaW5hdGVkID0gZmFsc2U7CisgICAgdGhpcy5fY2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgfQorCisgIGdldCBmaW5pc2hlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgZmluaXNoKCkgeworICAgIHRoaXMuX2NhcGFiaWxpdHkucmVzb2x2ZSgpOworICB9CisKKyAgdGVybWluYXRlKCkgeworICAgIHRoaXMudGVybWluYXRlZCA9IHRydWU7CisgIH0KKworICBlbnN1cmVOb3RUZXJtaW5hdGVkKCkgeworICAgIGlmICh0aGlzLnRlcm1pbmF0ZWQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHRhc2sgd2FzIHRlcm1pbmF0ZWQiKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLldvcmtlclRhc2sgPSBXb3JrZXJUYXNrOworCitjbGFzcyBXb3JrZXJNZXNzYWdlSGFuZGxlciB7CisgIHN0YXRpYyBzZXR1cChoYW5kbGVyLCBwb3J0KSB7CisgICAgdmFyIHRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gZmFsc2U7CisgICAgaGFuZGxlci5vbigidGVzdCIsIGZ1bmN0aW9uIHdwaFNldHVwVGVzdChkYXRhKSB7CisgICAgICBpZiAodGVzdE1lc3NhZ2VQcm9jZXNzZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IHRydWU7CisKKyAgICAgIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgeworICAgICAgICBoYW5kbGVyLnNlbmQoInRlc3QiLCBudWxsKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBzdXBwb3J0VHJhbnNmZXJzID0gZGF0YVswXSA9PT0gMjU1OworICAgICAgaGFuZGxlci5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHN1cHBvcnRUcmFuc2ZlcnM7CisgICAgICBoYW5kbGVyLnNlbmQoInRlc3QiLCB7CisgICAgICAgIHN1cHBvcnRUcmFuc2ZlcnMKKyAgICAgIH0pOworICAgIH0pOworICAgIGhhbmRsZXIub24oImNvbmZpZ3VyZSIsIGZ1bmN0aW9uIHdwaENvbmZpZ3VyZShkYXRhKSB7CisgICAgICAoMCwgX3V0aWwuc2V0VmVyYm9zaXR5TGV2ZWwpKGRhdGEudmVyYm9zaXR5KTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXREb2NSZXF1ZXN0IiwgZnVuY3Rpb24gd3BoU2V0dXBEb2MoZGF0YSkgeworICAgICAgcmV0dXJuIFdvcmtlck1lc3NhZ2VIYW5kbGVyLmNyZWF0ZURvY3VtZW50SGFuZGxlcihkYXRhLCBwb3J0KTsKKyAgICB9KTsKKyAgfQorCisgIHN0YXRpYyBjcmVhdGVEb2N1bWVudEhhbmRsZXIoZG9jUGFyYW1zLCBwb3J0KSB7CisgICAgdmFyIHBkZk1hbmFnZXI7CisgICAgdmFyIHRlcm1pbmF0ZWQgPSBmYWxzZTsKKyAgICB2YXIgY2FuY2VsWEhScyA9IG51bGw7CisgICAgdmFyIFdvcmtlclRhc2tzID0gW107CisgICAgY29uc3QgdmVyYm9zaXR5ID0gKDAsIF91dGlsLmdldFZlcmJvc2l0eUxldmVsKSgpOworICAgIGNvbnN0IGFwaVZlcnNpb24gPSBkb2NQYXJhbXMuYXBpVmVyc2lvbjsKKyAgICBjb25zdCB3b3JrZXJWZXJzaW9uID0gJzIuNi4zNDcnOworCisgICAgaWYgKGFwaVZlcnNpb24gIT09IHdvcmtlclZlcnNpb24pIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEFQSSB2ZXJzaW9uICIke2FwaVZlcnNpb259IiBkb2VzIG5vdCBtYXRjaCBgICsgYHRoZSBXb3JrZXIgdmVyc2lvbiAiJHt3b3JrZXJWZXJzaW9ufSIuYCk7CisgICAgfQorCisgICAgY29uc3QgZW51bWVyYWJsZVByb3BlcnRpZXMgPSBbXTsKKworICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gW10pIHsKKyAgICAgIGVudW1lcmFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpOworICAgIH0KKworICAgIGlmIChlbnVtZXJhYmxlUHJvcGVydGllcy5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIGBBcnJheS5wcm90b3R5cGVgIGNvbnRhaW5zIHVuZXhwZWN0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzOiAiICsgZW51bWVyYWJsZVByb3BlcnRpZXMuam9pbigiLCAiKSArICI7IHRodXMgYnJlYWtpbmcgZS5nLiBgZm9yLi4uaW5gIGl0ZXJhdGlvbiBvZiBgQXJyYXlgcy4iKTsKKyAgICB9CisKKyAgICBpZiAodHlwZW9mIFJlYWRhYmxlU3RyZWFtID09PSAidW5kZWZpbmVkIiB8fCB0eXBlb2YgUHJvbWlzZS5hbGxTZXR0bGVkID09PSAidW5kZWZpbmVkIikgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYnJvd3Nlci9lbnZpcm9ubWVudCBsYWNrcyBuYXRpdmUgc3VwcG9ydCBmb3IgY3JpdGljYWwgIiArICJmdW5jdGlvbmFsaXR5IHVzZWQgYnkgdGhlIFBERi5qcyBsaWJyYXJ5IChlLmcuICIgKyAiYFJlYWRhYmxlU3RyZWFtYCBhbmQvb3IgYFByb21pc2UuYWxsU2V0dGxlZGApOyAiICsgInBsZWFzZSB1c2UgYW4gRVM1LWNvbXBhdGlibGUgYnVpbGQgaW5zdGVhZC4iKTsKKyAgICB9CisKKyAgICB2YXIgZG9jSWQgPSBkb2NQYXJhbXMuZG9jSWQ7CisgICAgdmFyIGRvY0Jhc2VVcmwgPSBkb2NQYXJhbXMuZG9jQmFzZVVybDsKKyAgICB2YXIgd29ya2VySGFuZGxlck5hbWUgPSBkb2NQYXJhbXMuZG9jSWQgKyAiX3dvcmtlciI7CisgICAgdmFyIGhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcih3b3JrZXJIYW5kbGVyTmFtZSwgZG9jSWQsIHBvcnQpOworICAgIGhhbmRsZXIucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSBkb2NQYXJhbXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM7CisKKyAgICBmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCkgeworICAgICAgaWYgKHRlcm1pbmF0ZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBzdGFydFdvcmtlclRhc2sodGFzaykgeworICAgICAgV29ya2VyVGFza3MucHVzaCh0YXNrKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBmaW5pc2hXb3JrZXJUYXNrKHRhc2spIHsKKyAgICAgIHRhc2suZmluaXNoKCk7CisgICAgICB2YXIgaSA9IFdvcmtlclRhc2tzLmluZGV4T2YodGFzayk7CisgICAgICBXb3JrZXJUYXNrcy5zcGxpY2UoaSwgMSk7CisgICAgfQorCisgICAgYXN5bmMgZnVuY3Rpb24gbG9hZERvY3VtZW50KHJlY292ZXJ5TW9kZSkgeworICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoImNoZWNrSGVhZGVyIik7CisgICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKTsKKyAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJwYXJzZSIsIFtyZWNvdmVyeU1vZGVdKTsKKworICAgICAgaWYgKCFyZWNvdmVyeU1vZGUpIHsKKyAgICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoImNoZWNrRmlyc3RQYWdlIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IFtudW1QYWdlcywgZmluZ2VycHJpbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3BkZk1hbmFnZXIuZW5zdXJlRG9jKCJudW1QYWdlcyIpLCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiZmluZ2VycHJpbnQiKV0pOworICAgICAgcmV0dXJuIHsKKyAgICAgICAgbnVtUGFnZXMsCisgICAgICAgIGZpbmdlcnByaW50CisgICAgICB9OworICAgIH0KKworICAgIGZ1bmN0aW9uIGdldFBkZk1hbmFnZXIoZGF0YSwgZXZhbHVhdG9yT3B0aW9ucykgeworICAgICAgdmFyIHBkZk1hbmFnZXJDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgbGV0IG5ld1BkZk1hbmFnZXI7CisgICAgICB2YXIgc291cmNlID0gZGF0YS5zb3VyY2U7CisKKyAgICAgIGlmIChzb3VyY2UuZGF0YSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgX3BkZl9tYW5hZ2VyLkxvY2FsUGRmTWFuYWdlcihkb2NJZCwgc291cmNlLmRhdGEsIHNvdXJjZS5wYXNzd29yZCwgZXZhbHVhdG9yT3B0aW9ucywgZG9jQmFzZVVybCk7CisgICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVzb2x2ZShuZXdQZGZNYW5hZ2VyKTsKKyAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZWplY3QoZXgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICB9CisKKyAgICAgIHZhciBwZGZTdHJlYW0sCisgICAgICAgICAgY2FjaGVkQ2h1bmtzID0gW107CisKKyAgICAgIHRyeSB7CisgICAgICAgIHBkZlN0cmVhbSA9IG5ldyBfd29ya2VyX3N0cmVhbS5QREZXb3JrZXJTdHJlYW0oaGFuZGxlcik7CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZWplY3QoZXgpOworICAgICAgICByZXR1cm4gcGRmTWFuYWdlckNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIH0KKworICAgICAgdmFyIGZ1bGxSZXF1ZXN0ID0gcGRmU3RyZWFtLmdldEZ1bGxSZWFkZXIoKTsKKyAgICAgIGZ1bGxSZXF1ZXN0LmhlYWRlcnNSZWFkeS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKCFmdWxsUmVxdWVzdC5pc1JhbmdlU3VwcG9ydGVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRpc2FibGVBdXRvRmV0Y2ggPSBzb3VyY2UuZGlzYWJsZUF1dG9GZXRjaCB8fCBmdWxsUmVxdWVzdC5pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgICAgICAgbmV3UGRmTWFuYWdlciA9IG5ldyBfcGRmX21hbmFnZXIuTmV0d29ya1BkZk1hbmFnZXIoZG9jSWQsIHBkZlN0cmVhbSwgeworICAgICAgICAgIG1zZ0hhbmRsZXI6IGhhbmRsZXIsCisgICAgICAgICAgcGFzc3dvcmQ6IHNvdXJjZS5wYXNzd29yZCwKKyAgICAgICAgICBsZW5ndGg6IGZ1bGxSZXF1ZXN0LmNvbnRlbnRMZW5ndGgsCisgICAgICAgICAgZGlzYWJsZUF1dG9GZXRjaCwKKyAgICAgICAgICByYW5nZUNodW5rU2l6ZTogc291cmNlLnJhbmdlQ2h1bmtTaXplCisgICAgICAgIH0sIGV2YWx1YXRvck9wdGlvbnMsIGRvY0Jhc2VVcmwpOworCisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVkQ2h1bmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgbmV3UGRmTWFuYWdlci5zZW5kUHJvZ3Jlc3NpdmVEYXRhKGNhY2hlZENodW5rc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKKyAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVzb2x2ZShuZXdQZGZNYW5hZ2VyKTsKKyAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CisgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOworICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDsKKyAgICAgIH0pOworICAgICAgdmFyIGxvYWRlZCA9IDA7CisKKyAgICAgIHZhciBmbHVzaENodW5rcyA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIHBkZkZpbGUgPSAoMCwgX3V0aWwuYXJyYXlzVG9CeXRlcykoY2FjaGVkQ2h1bmtzKTsKKworICAgICAgICBpZiAoc291cmNlLmxlbmd0aCAmJiBwZGZGaWxlLmxlbmd0aCAhPT0gc291cmNlLmxlbmd0aCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicmVwb3J0ZWQgSFRUUCBsZW5ndGggaXMgZGlmZmVyZW50IGZyb20gYWN0dWFsIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgX3BkZl9tYW5hZ2VyLkxvY2FsUGRmTWFuYWdlcihkb2NJZCwgcGRmRmlsZSwgc291cmNlLnBhc3N3b3JkLCBldmFsdWF0b3JPcHRpb25zLCBkb2NCYXNlVXJsKTsKKyAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOworICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChleCk7CisgICAgICAgIH0KKworICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKKyAgICAgIH07CisKKyAgICAgIHZhciByZWFkUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgICAgdmFyIHJlYWRDaHVuayA9IGZ1bmN0aW9uICh7CisgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgZG9uZQorICAgICAgICB9KSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKworICAgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgICAgaWYgKCFuZXdQZGZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgZmx1c2hDaHVua3MoKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvYWRlZCArPSAoMCwgX3V0aWwuYXJyYXlCeXRlTGVuZ3RoKSh2YWx1ZSk7CisKKyAgICAgICAgICAgIGlmICghZnVsbFJlcXVlc3QuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgaGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKKyAgICAgICAgICAgICAgICBsb2FkZWQsCisgICAgICAgICAgICAgICAgdG90YWw6IE1hdGgubWF4KGxvYWRlZCwgZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCB8fCAwKQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5ld1BkZk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgbmV3UGRmTWFuYWdlci5zZW5kUHJvZ3Jlc3NpdmVEYXRhKHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNhY2hlZENodW5rcy5wdXNoKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnVsbFJlcXVlc3QucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOworICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIHJlamVjdChlKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZnVsbFJlcXVlc3QucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOworICAgICAgfSk7CisgICAgICByZWFkUHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkgeworICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZWplY3QoZSk7CisgICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOworICAgICAgfSk7CisKKyAgICAgIGNhbmNlbFhIUnMgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIHBkZlN0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pOworICAgICAgfTsKKworICAgICAgcmV0dXJuIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorCisgICAgZnVuY3Rpb24gc2V0dXBEb2MoZGF0YSkgeworICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKGRvYykgeworICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisgICAgICAgIGhhbmRsZXIuc2VuZCgiR2V0RG9jIiwgeworICAgICAgICAgIHBkZkluZm86IGRvYworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gb25GYWlsdXJlKGV4KSB7CisgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbikgeworICAgICAgICAgIHZhciB0YXNrID0gbmV3IFdvcmtlclRhc2soYFBhc3N3b3JkRXhjZXB0aW9uOiByZXNwb25zZSAke2V4LmNvZGV9YCk7CisgICAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spOworICAgICAgICAgIGhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJQYXNzd29yZFJlcXVlc3QiLCBleCkudGhlbihmdW5jdGlvbiAoeworICAgICAgICAgICAgcGFzc3dvcmQKKyAgICAgICAgICB9KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOworICAgICAgICAgICAgcGRmTWFuYWdlci51cGRhdGVQYXNzd29yZChwYXNzd29yZCk7CisgICAgICAgICAgICBwZGZNYW5hZ2VyUmVhZHkoKTsKKyAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOworICAgICAgICAgICAgaGFuZGxlci5zZW5kKCJEb2NFeGNlcHRpb24iLCBleCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbiB8fCBleCBpbnN0YW5jZW9mIF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiB8fCBleCBpbnN0YW5jZW9mIF91dGlsLlVua25vd25FcnJvckV4Y2VwdGlvbikgeworICAgICAgICAgIGhhbmRsZXIuc2VuZCgiRG9jRXhjZXB0aW9uIiwgZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhhbmRsZXIuc2VuZCgiRG9jRXhjZXB0aW9uIiwgbmV3IF91dGlsLlVua25vd25FcnJvckV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcGRmTWFuYWdlclJlYWR5KCkgeworICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisgICAgICAgIGxvYWREb2N1bWVudChmYWxzZSkudGhlbihvblN1Y2Nlc3MsIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisKKyAgICAgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBfY29yZV91dGlscy5YUmVmUGFyc2VFeGNlcHRpb24pKSB7CisgICAgICAgICAgICBvbkZhaWx1cmUocmVhc29uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKTsKKyAgICAgICAgICBwZGZNYW5hZ2VyLm9uTG9hZGVkU3RyZWFtKCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisgICAgICAgICAgICBsb2FkRG9jdW1lbnQodHJ1ZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisgICAgICB2YXIgZXZhbHVhdG9yT3B0aW9ucyA9IHsKKyAgICAgICAgbWF4SW1hZ2VTaXplOiBkYXRhLm1heEltYWdlU2l6ZSwKKyAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBkYXRhLmRpc2FibGVGb250RmFjZSwKKyAgICAgICAgaWdub3JlRXJyb3JzOiBkYXRhLmlnbm9yZUVycm9ycywKKyAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBkYXRhLmlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgZm9udEV4dHJhUHJvcGVydGllczogZGF0YS5mb250RXh0cmFQcm9wZXJ0aWVzCisgICAgICB9OworICAgICAgZ2V0UGRmTWFuYWdlcihkYXRhLCBldmFsdWF0b3JPcHRpb25zKS50aGVuKGZ1bmN0aW9uIChuZXdQZGZNYW5hZ2VyKSB7CisgICAgICAgIGlmICh0ZXJtaW5hdGVkKSB7CisgICAgICAgICAgbmV3UGRmTWFuYWdlci50ZXJtaW5hdGUobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwZGZNYW5hZ2VyID0gbmV3UGRmTWFuYWdlcjsKKyAgICAgICAgcGRmTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpLnRoZW4oZnVuY3Rpb24gKHN0cmVhbSkgeworICAgICAgICAgIGhhbmRsZXIuc2VuZCgiRGF0YUxvYWRlZCIsIHsKKyAgICAgICAgICAgIGxlbmd0aDogc3RyZWFtLmJ5dGVzLmJ5dGVMZW5ndGgKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9KS50aGVuKHBkZk1hbmFnZXJSZWFkeSwgb25GYWlsdXJlKTsKKyAgICB9CisKKyAgICBoYW5kbGVyLm9uKCJHZXRQYWdlIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmdldFBhZ2UoZGF0YS5wYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKKyAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAicm90YXRlIiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJyZWYiKSwgcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInVzZXJVbml0IiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJ2aWV3IildKS50aGVuKGZ1bmN0aW9uIChbcm90YXRlLCByZWYsIHVzZXJVbml0LCB2aWV3XSkgeworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICByb3RhdGUsCisgICAgICAgICAgICByZWYsCisgICAgICAgICAgICB1c2VyVW5pdCwKKyAgICAgICAgICAgIHZpZXcKKyAgICAgICAgICB9OworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldFBhZ2VJbmRleCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUluZGV4KHsKKyAgICAgIHJlZgorICAgIH0pIHsKKyAgICAgIGNvbnN0IHBhZ2VSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KHJlZi5udW0sIHJlZi5nZW4pOworCisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJnZXRQYWdlSW5kZXgiLCBbcGFnZVJlZl0pOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9ucyIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0RGVzdGluYXRpb25zKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImRlc3RpbmF0aW9ucyIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9uIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXREZXN0aW5hdGlvbihkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJnZXREZXN0aW5hdGlvbiIsIFtkYXRhLmlkXSk7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0UGFnZUxhYmVscyIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUxhYmVscyhkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJwYWdlTGFiZWxzIik7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0UGFnZUxheW91dCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUxheW91dChkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJwYWdlTGF5b3V0Iik7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0UGFnZU1vZGUiLCBmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2VNb2RlKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VNb2RlIik7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0Vmlld2VyUHJlZmVyZW5jZXMiLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygidmlld2VyUHJlZmVyZW5jZXMiKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRPcGVuQWN0aW9uIiwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm9wZW5BY3Rpb24iKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRBdHRhY2htZW50cyIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0QXR0YWNobWVudHMoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYXR0YWNobWVudHMiKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRKYXZhU2NyaXB0IiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRKYXZhU2NyaXB0KGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImphdmFTY3JpcHQiKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRPdXRsaW5lIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRPdXRsaW5lKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImRvY3VtZW50T3V0bGluZSIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJvcHRpb25hbENvbnRlbnRDb25maWciKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRQZXJtaXNzaW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJwZXJtaXNzaW9ucyIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldE1ldGFkYXRhIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRNZXRhZGF0YShkYXRhKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3BkZk1hbmFnZXIuZW5zdXJlRG9jKCJkb2N1bWVudEluZm8iKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJtZXRhZGF0YSIpXSk7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0RGF0YSIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0RGF0YShkYXRhKSB7CisgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKTsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLm9uTG9hZGVkU3RyZWFtKCkudGhlbihmdW5jdGlvbiAoc3RyZWFtKSB7CisgICAgICAgIHJldHVybiBzdHJlYW0uYnl0ZXM7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRTdGF0cyIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0U3RhdHMoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlWFJlZigic3RhdHMiKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRBbm5vdGF0aW9ucyIsIGZ1bmN0aW9uICh7CisgICAgICBwYWdlSW5kZXgsCisgICAgICBpbnRlbnQKKyAgICB9KSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgeworICAgICAgICByZXR1cm4gcGFnZS5nZXRBbm5vdGF0aW9uc0RhdGEoaW50ZW50KTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGhhbmRsZXIub24oIlNhdmVEb2N1bWVudCIsIGZ1bmN0aW9uICh7CisgICAgICBudW1QYWdlcywKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLAorICAgICAgZmlsZW5hbWUKKyAgICB9KSB7CisgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKTsKKyAgICAgIGNvbnN0IHByb21pc2VzID0gW3BkZk1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKV07CisgICAgICBjb25zdCBkb2N1bWVudCA9IHBkZk1hbmFnZXIucGRmRG9jdW1lbnQ7CisKKyAgICAgIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IG51bVBhZ2VzOyBwYWdlSW5kZXgrKykgeworICAgICAgICBwcm9taXNlcy5wdXNoKHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKKyAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFNhdmU6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7CisgICAgICAgICAgcmV0dXJuIHBhZ2Uuc2F2ZShoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisgICAgICAgIH0pKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChbc3RyZWFtLCAuLi5yZWZzXSkgPT4geworICAgICAgICBsZXQgbmV3UmVmcyA9IFtdOworCisgICAgICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZnMpIHsKKyAgICAgICAgICBuZXdSZWZzID0gcmVmLmZpbHRlcih4ID0+IHggIT09IG51bGwpLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIG5ld1JlZnMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld1JlZnMubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHhyZWYgPSBkb2N1bWVudC54cmVmOworICAgICAgICBsZXQgbmV3WHJlZkluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICAgIGlmICh4cmVmLnRyYWlsZXIpIHsKKyAgICAgICAgICBjb25zdCBfaW5mbyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgICBjb25zdCB4cmVmSW5mbyA9IHhyZWYudHJhaWxlci5nZXQoIkluZm8iKSB8fCBudWxsOworCisgICAgICAgICAgaWYgKHhyZWZJbmZvKSB7CisgICAgICAgICAgICB4cmVmSW5mby5mb3JFYWNoKChrZXksIHZhbHVlKSA9PiB7CisgICAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKGtleSkgJiYgKDAsIF91dGlsLmlzU3RyaW5nKSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBfaW5mb1trZXldID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKSh2YWx1ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKworICAgICAgICAgIG5ld1hyZWZJbmZvID0geworICAgICAgICAgICAgcm9vdFJlZjogeHJlZi50cmFpbGVyLmdldFJhdygiUm9vdCIpIHx8IG51bGwsCisgICAgICAgICAgICBlbmNyeXB0OiB4cmVmLnRyYWlsZXIuZ2V0UmF3KCJFbmNyeXB0IikgfHwgbnVsbCwKKyAgICAgICAgICAgIG5ld1JlZjogeHJlZi5nZXROZXdSZWYoKSwKKyAgICAgICAgICAgIGluZm9SZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoIkluZm8iKSB8fCBudWxsLAorICAgICAgICAgICAgaW5mbzogX2luZm8sCisgICAgICAgICAgICBmaWxlSWRzOiB4cmVmLnRyYWlsZXIuZ2V0UmF3KCJJRCIpIHx8IG51bGwsCisgICAgICAgICAgICBzdGFydFhSZWY6IGRvY3VtZW50LnN0YXJ0WFJlZiwKKyAgICAgICAgICAgIGZpbGVuYW1lCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHhyZWYucmVzZXROZXdSZWYoKTsKKyAgICAgICAgcmV0dXJuICgwLCBfd3JpdGVyLmluY3JlbWVudGFsVXBkYXRlKShzdHJlYW0uYnl0ZXMsIG5ld1hyZWZJbmZvLCBuZXdSZWZzKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldE9wZXJhdG9yTGlzdCIsIGZ1bmN0aW9uIHdwaFNldHVwUmVuZGVyUGFnZShkYXRhLCBzaW5rKSB7CisgICAgICB2YXIgcGFnZUluZGV4ID0gZGF0YS5wYWdlSW5kZXg7CisgICAgICBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICAgIHZhciB0YXNrID0gbmV3IFdvcmtlclRhc2soYEdldE9wZXJhdG9yTGlzdDogcGFnZSAke3BhZ2VJbmRleH1gKTsKKyAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spOworICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBfdXRpbC5WZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOworICAgICAgICBwYWdlLmdldE9wZXJhdG9yTGlzdCh7CisgICAgICAgICAgaGFuZGxlciwKKyAgICAgICAgICBzaW5rLAorICAgICAgICAgIHRhc2ssCisgICAgICAgICAgaW50ZW50OiBkYXRhLmludGVudCwKKyAgICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiBkYXRhLnJlbmRlckludGVyYWN0aXZlRm9ybXMsCisgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IGRhdGEuYW5ub3RhdGlvblN0b3JhZ2UKKyAgICAgICAgfSkudGhlbihmdW5jdGlvbiAob3BlcmF0b3JMaXN0SW5mbykgeworICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisKKyAgICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgcGFnZT0ke3BhZ2VJbmRleCArIDF9IC0gZ2V0T3BlcmF0b3JMaXN0OiB0aW1lPWAgKyBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMsIGxlbj0ke29wZXJhdG9yTGlzdEluZm8ubGVuZ3RofWApOworICAgICAgICAgIH0KKworICAgICAgICAgIHNpbmsuY2xvc2UoKTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisKKyAgICAgICAgICBpZiAodGFzay50ZXJtaW5hdGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yT3BlcmF0b3JMaXN0CisgICAgICAgICAgfSk7CisgICAgICAgICAgc2luay5lcnJvcihyZWFzb24pOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0sIHRoaXMpOworICAgIGhhbmRsZXIub24oIkdldFRleHRDb250ZW50IiwgZnVuY3Rpb24gd3BoRXh0cmFjdFRleHQoZGF0YSwgc2luaykgeworICAgICAgdmFyIHBhZ2VJbmRleCA9IGRhdGEucGFnZUluZGV4OworCisgICAgICBzaW5rLm9uUHVsbCA9IGZ1bmN0aW9uIChkZXNpcmVkU2l6ZSkge307CisKKyAgICAgIHNpbmsub25DYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7fTsKKworICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgeworICAgICAgICB2YXIgdGFzayA9IG5ldyBXb3JrZXJUYXNrKCJHZXRUZXh0Q29udGVudDogcGFnZSAiICsgcGFnZUluZGV4KTsKKyAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spOworICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBfdXRpbC5WZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOworICAgICAgICBwYWdlLmV4dHJhY3RUZXh0Q29udGVudCh7CisgICAgICAgICAgaGFuZGxlciwKKyAgICAgICAgICB0YXNrLAorICAgICAgICAgIHNpbmssCisgICAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZTogZGF0YS5ub3JtYWxpemVXaGl0ZXNwYWNlLAorICAgICAgICAgIGNvbWJpbmVUZXh0SXRlbXM6IGRhdGEuY29tYmluZVRleHRJdGVtcworICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOworCisgICAgICAgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoYHBhZ2U9JHtwYWdlSW5kZXggKyAxfSAtIGdldFRleHRDb250ZW50OiB0aW1lPWAgKyBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzaW5rLmNsb3NlKCk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOworCisgICAgICAgICAgaWYgKHRhc2sudGVybWluYXRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJGb250RmFsbGJhY2siLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZm9udEZhbGxiYWNrKGRhdGEuaWQsIGhhbmRsZXIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkNsZWFudXAiLCBmdW5jdGlvbiB3cGhDbGVhbnVwKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmNsZWFudXAodHJ1ZSk7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiVGVybWluYXRlIiwgZnVuY3Rpb24gd3BoVGVybWluYXRlKGRhdGEpIHsKKyAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlOworICAgICAgY29uc3Qgd2FpdE9uID0gW107CisKKyAgICAgIGlmIChwZGZNYW5hZ2VyKSB7CisgICAgICAgIHBkZk1hbmFnZXIudGVybWluYXRlKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTsKKyAgICAgICAgY29uc3QgY2xlYW51cFByb21pc2UgPSBwZGZNYW5hZ2VyLmNsZWFudXAoKTsKKyAgICAgICAgd2FpdE9uLnB1c2goY2xlYW51cFByb21pc2UpOworICAgICAgICBwZGZNYW5hZ2VyID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgwLCBfcHJpbWl0aXZlcy5jbGVhclByaW1pdGl2ZUNhY2hlcykoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNhbmNlbFhIUnMpIHsKKyAgICAgICAgY2FuY2VsWEhScyhuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CisgICAgICB9CisKKyAgICAgIFdvcmtlclRhc2tzLmZvckVhY2goZnVuY3Rpb24gKHRhc2spIHsKKyAgICAgICAgd2FpdE9uLnB1c2godGFzay5maW5pc2hlZCk7CisgICAgICAgIHRhc2sudGVybWluYXRlKCk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiBQcm9taXNlLmFsbCh3YWl0T24pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBoYW5kbGVyLmRlc3Ryb3koKTsKKyAgICAgICAgaGFuZGxlciA9IG51bGw7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJSZWFkeSIsIGZ1bmN0aW9uIHdwaFJlYWR5KGRhdGEpIHsKKyAgICAgIHNldHVwRG9jKGRvY1BhcmFtcyk7CisgICAgICBkb2NQYXJhbXMgPSBudWxsOworICAgIH0pOworICAgIHJldHVybiB3b3JrZXJIYW5kbGVyTmFtZTsKKyAgfQorCisgIHN0YXRpYyBpbml0aWFsaXplRnJvbVBvcnQocG9ydCkgeworICAgIHZhciBoYW5kbGVyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIndvcmtlciIsICJtYWluIiwgcG9ydCk7CisgICAgV29ya2VyTWVzc2FnZUhhbmRsZXIuc2V0dXAoaGFuZGxlciwgcG9ydCk7CisgICAgaGFuZGxlci5zZW5kKCJyZWFkeSIsIG51bGwpOworICB9CisKK30KKworZXhwb3J0cy5Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IFdvcmtlck1lc3NhZ2VIYW5kbGVyOworCitmdW5jdGlvbiBpc01lc3NhZ2VQb3J0KG1heWJlUG9ydCkgeworICByZXR1cm4gdHlwZW9mIG1heWJlUG9ydC5wb3N0TWVzc2FnZSA9PT0gImZ1bmN0aW9uIiAmJiAib25tZXNzYWdlIiBpbiBtYXliZVBvcnQ7Cit9CisKK2lmICh0eXBlb2Ygd2luZG93ID09PSAidW5kZWZpbmVkIiAmJiAhX2lzX25vZGUuaXNOb2RlSlMgJiYgdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiICYmIGlzTWVzc2FnZVBvcnQoc2VsZikpIHsKKyAgV29ya2VyTWVzc2FnZUhhbmRsZXIuaW5pdGlhbGl6ZUZyb21Qb3J0KHNlbGYpOworfQorCisvKioqLyB9KSwKKy8qIDIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5hcnJheUJ5dGVMZW5ndGggPSBhcnJheUJ5dGVMZW5ndGg7CitleHBvcnRzLmFycmF5c1RvQnl0ZXMgPSBhcnJheXNUb0J5dGVzOworZXhwb3J0cy5hc3NlcnQgPSBhc3NlcnQ7CitleHBvcnRzLmJ5dGVzVG9TdHJpbmcgPSBieXRlc1RvU3RyaW5nOworZXhwb3J0cy5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5OworZXhwb3J0cy5lc2NhcGVTdHJpbmcgPSBlc2NhcGVTdHJpbmc7CitleHBvcnRzLmdldE1vZGlmaWNhdGlvbkRhdGUgPSBnZXRNb2RpZmljYXRpb25EYXRlOworZXhwb3J0cy5nZXRWZXJib3NpdHlMZXZlbCA9IGdldFZlcmJvc2l0eUxldmVsOworZXhwb3J0cy5pbmZvID0gaW5mbzsKK2V4cG9ydHMuaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7CitleHBvcnRzLmlzQXJyYXlFcXVhbCA9IGlzQXJyYXlFcXVhbDsKK2V4cG9ydHMuaXNCb29sID0gaXNCb29sOworZXhwb3J0cy5pc051bSA9IGlzTnVtOworZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nOworZXhwb3J0cy5pc1NhbWVPcmlnaW4gPSBpc1NhbWVPcmlnaW47CitleHBvcnRzLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsOworZXhwb3J0cy5yZW1vdmVOdWxsQ2hhcmFjdGVycyA9IHJlbW92ZU51bGxDaGFyYWN0ZXJzOworZXhwb3J0cy5zZXRWZXJib3NpdHlMZXZlbCA9IHNldFZlcmJvc2l0eUxldmVsOworZXhwb3J0cy5zaGFkb3cgPSBzaGFkb3c7CitleHBvcnRzLnN0cmluZzMyID0gc3RyaW5nMzI7CitleHBvcnRzLnN0cmluZ1RvQnl0ZXMgPSBzdHJpbmdUb0J5dGVzOworZXhwb3J0cy5zdHJpbmdUb1BERlN0cmluZyA9IHN0cmluZ1RvUERGU3RyaW5nOworZXhwb3J0cy5zdHJpbmdUb1VURjhTdHJpbmcgPSBzdHJpbmdUb1VURjhTdHJpbmc7CitleHBvcnRzLnV0ZjhTdHJpbmdUb1N0cmluZyA9IHV0ZjhTdHJpbmdUb1N0cmluZzsKK2V4cG9ydHMud2FybiA9IHdhcm47CitleHBvcnRzLnVucmVhY2hhYmxlID0gdW5yZWFjaGFibGU7CitleHBvcnRzLklzRXZhbFN1cHBvcnRlZENhY2hlZCA9IGV4cG9ydHMuSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSBleHBvcnRzLmNyZWF0ZU9iamVjdFVSTCA9IGV4cG9ydHMuRm9ybWF0RXJyb3IgPSBleHBvcnRzLlV0aWwgPSBleHBvcnRzLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IGV4cG9ydHMuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gZXhwb3J0cy5UZXh0UmVuZGVyaW5nTW9kZSA9IGV4cG9ydHMuU3RyZWFtVHlwZSA9IGV4cG9ydHMuUGVybWlzc2lvbkZsYWcgPSBleHBvcnRzLlBhc3N3b3JkUmVzcG9uc2VzID0gZXhwb3J0cy5QYXNzd29yZEV4Y2VwdGlvbiA9IGV4cG9ydHMuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IGV4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IGV4cG9ydHMuQWJvcnRFeGNlcHRpb24gPSBleHBvcnRzLkNNYXBDb21wcmVzc2lvblR5cGUgPSBleHBvcnRzLkltYWdlS2luZCA9IGV4cG9ydHMuRm9udFR5cGUgPSBleHBvcnRzLkFubm90YXRpb25UeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSBleHBvcnRzLkFubm90YXRpb25SZXZpZXdTdGF0ZSA9IGV4cG9ydHMuQW5ub3RhdGlvblJlcGx5VHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmxhZyA9IGV4cG9ydHMuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IGV4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IGV4cG9ydHMuVU5TVVBQT1JURURfRkVBVFVSRVMgPSBleHBvcnRzLlZlcmJvc2l0eUxldmVsID0gZXhwb3J0cy5PUFMgPSBleHBvcnRzLklERU5USVRZX01BVFJJWCA9IGV4cG9ydHMuRk9OVF9JREVOVElUWV9NQVRSSVggPSBleHBvcnRzLkJhc2VFeGNlcHRpb24gPSB2b2lkIDA7CisKK19fd19wZGZqc19yZXF1aXJlX18oMyk7CisKK2NvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKK2V4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gSURFTlRJVFlfTUFUUklYOworY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTsKK2V4cG9ydHMuRk9OVF9JREVOVElUWV9NQVRSSVggPSBGT05UX0lERU5USVRZX01BVFJJWDsKK2NvbnN0IFBlcm1pc3Npb25GbGFnID0geworICBQUklOVDogMHgwNCwKKyAgTU9ESUZZX0NPTlRFTlRTOiAweDA4LAorICBDT1BZOiAweDEwLAorICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsCisgIEZJTExfSU5URVJBQ1RJVkVfRk9STVM6IDB4MTAwLAorICBDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOiAweDIwMCwKKyAgQVNTRU1CTEU6IDB4NDAwLAorICBQUklOVF9ISUdIX1FVQUxJVFk6IDB4ODAwCit9OworZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IFBlcm1pc3Npb25GbGFnOworY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7CisgIEZJTEw6IDAsCisgIFNUUk9LRTogMSwKKyAgRklMTF9TVFJPS0U6IDIsCisgIElOVklTSUJMRTogMywKKyAgRklMTF9BRERfVE9fUEFUSDogNCwKKyAgU1RST0tFX0FERF9UT19QQVRIOiA1LAorICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNiwKKyAgQUREX1RPX1BBVEg6IDcsCisgIEZJTExfU1RST0tFX01BU0s6IDMsCisgIEFERF9UT19QQVRIX0ZMQUc6IDQKK307CitleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGU7Citjb25zdCBJbWFnZUtpbmQgPSB7CisgIEdSQVlTQ0FMRV8xQlBQOiAxLAorICBSR0JfMjRCUFA6IDIsCisgIFJHQkFfMzJCUFA6IDMKK307CitleHBvcnRzLkltYWdlS2luZCA9IEltYWdlS2luZDsKK2NvbnN0IEFubm90YXRpb25UeXBlID0geworICBURVhUOiAxLAorICBMSU5LOiAyLAorICBGUkVFVEVYVDogMywKKyAgTElORTogNCwKKyAgU1FVQVJFOiA1LAorICBDSVJDTEU6IDYsCisgIFBPTFlHT046IDcsCisgIFBPTFlMSU5FOiA4LAorICBISUdITElHSFQ6IDksCisgIFVOREVSTElORTogMTAsCisgIFNRVUlHR0xZOiAxMSwKKyAgU1RSSUtFT1VUOiAxMiwKKyAgU1RBTVA6IDEzLAorICBDQVJFVDogMTQsCisgIElOSzogMTUsCisgIFBPUFVQOiAxNiwKKyAgRklMRUFUVEFDSE1FTlQ6IDE3LAorICBTT1VORDogMTgsCisgIE1PVklFOiAxOSwKKyAgV0lER0VUOiAyMCwKKyAgU0NSRUVOOiAyMSwKKyAgUFJJTlRFUk1BUks6IDIyLAorICBUUkFQTkVUOiAyMywKKyAgV0FURVJNQVJLOiAyNCwKKyAgVEhSRUVEOiAyNSwKKyAgUkVEQUNUOiAyNgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZTsKK2NvbnN0IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHsKKyAgTUFSS0VEOiAiTWFya2VkIiwKKyAgUkVWSUVXOiAiUmV2aWV3IgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0gQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlOworY29uc3QgQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0geworICBNQVJLRUQ6ICJNYXJrZWQiLAorICBVTk1BUktFRDogIlVubWFya2VkIgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0gQW5ub3RhdGlvbk1hcmtlZFN0YXRlOworY29uc3QgQW5ub3RhdGlvblJldmlld1N0YXRlID0geworICBBQ0NFUFRFRDogIkFjY2VwdGVkIiwKKyAgUkVKRUNURUQ6ICJSZWplY3RlZCIsCisgIENBTkNFTExFRDogIkNhbmNlbGxlZCIsCisgIENPTVBMRVRFRDogIkNvbXBsZXRlZCIsCisgIE5PTkU6ICJOb25lIgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblJldmlld1N0YXRlID0gQW5ub3RhdGlvblJldmlld1N0YXRlOworY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHsKKyAgR1JPVVA6ICJHcm91cCIsCisgIFJFUExZOiAiUiIKK307CitleHBvcnRzLkFubm90YXRpb25SZXBseVR5cGUgPSBBbm5vdGF0aW9uUmVwbHlUeXBlOworY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7CisgIElOVklTSUJMRTogMHgwMSwKKyAgSElEREVOOiAweDAyLAorICBQUklOVDogMHgwNCwKKyAgTk9aT09NOiAweDA4LAorICBOT1JPVEFURTogMHgxMCwKKyAgTk9WSUVXOiAweDIwLAorICBSRUFET05MWTogMHg0MCwKKyAgTE9DS0VEOiAweDgwLAorICBUT0dHTEVOT1ZJRVc6IDB4MTAwLAorICBMT0NLRURDT05URU5UUzogMHgyMDAKK307CitleHBvcnRzLkFubm90YXRpb25GbGFnID0gQW5ub3RhdGlvbkZsYWc7Citjb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0geworICBSRUFET05MWTogMHgwMDAwMDAxLAorICBSRVFVSVJFRDogMHgwMDAwMDAyLAorICBOT0VYUE9SVDogMHgwMDAwMDA0LAorICBNVUxUSUxJTkU6IDB4MDAwMTAwMCwKKyAgUEFTU1dPUkQ6IDB4MDAwMjAwMCwKKyAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLAorICBSQURJTzogMHgwMDA4MDAwLAorICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsCisgIENPTUJPOiAweDAwMjAwMDAsCisgIEVESVQ6IDB4MDA0MDAwMCwKKyAgU09SVDogMHgwMDgwMDAwLAorICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsCisgIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsCisgIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLAorICBET05PVFNDUk9MTDogMHgwODAwMDAwLAorICBDT01COiAweDEwMDAwMDAsCisgIFJJQ0hURVhUOiAweDIwMDAwMDAsCisgIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsCisgIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDAKK307CitleHBvcnRzLkFubm90YXRpb25GaWVsZEZsYWcgPSBBbm5vdGF0aW9uRmllbGRGbGFnOworY29uc3QgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IHsKKyAgU09MSUQ6IDEsCisgIERBU0hFRDogMiwKKyAgQkVWRUxFRDogMywKKyAgSU5TRVQ6IDQsCisgIFVOREVSTElORTogNQorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU7Citjb25zdCBTdHJlYW1UeXBlID0geworICBVTktOT1dOOiAiVU5LTk9XTiIsCisgIEZMQVRFOiAiRkxBVEUiLAorICBMWlc6ICJMWlciLAorICBEQ1Q6ICJEQ1QiLAorICBKUFg6ICJKUFgiLAorICBKQklHOiAiSkJJRyIsCisgIEE4NTogIkE4NSIsCisgIEFIWDogIkFIWCIsCisgIENDRjogIkNDRiIsCisgIFJMWDogIlJMWCIKK307CitleHBvcnRzLlN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOworY29uc3QgRm9udFR5cGUgPSB7CisgIFVOS05PV046ICJVTktOT1dOIiwKKyAgVFlQRTE6ICJUWVBFMSIsCisgIFRZUEUxQzogIlRZUEUxQyIsCisgIENJREZPTlRUWVBFMDogIkNJREZPTlRUWVBFMCIsCisgIENJREZPTlRUWVBFMEM6ICJDSURGT05UVFlQRTBDIiwKKyAgVFJVRVRZUEU6ICJUUlVFVFlQRSIsCisgIENJREZPTlRUWVBFMjogIkNJREZPTlRUWVBFMiIsCisgIFRZUEUzOiAiVFlQRTMiLAorICBPUEVOVFlQRTogIk9QRU5UWVBFIiwKKyAgVFlQRTA6ICJUWVBFMCIsCisgIE1NVFlQRTE6ICJNTVRZUEUxIgorfTsKK2V4cG9ydHMuRm9udFR5cGUgPSBGb250VHlwZTsKK2NvbnN0IFZlcmJvc2l0eUxldmVsID0geworICBFUlJPUlM6IDAsCisgIFdBUk5JTkdTOiAxLAorICBJTkZPUzogNQorfTsKK2V4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBWZXJib3NpdHlMZXZlbDsKK2NvbnN0IENNYXBDb21wcmVzc2lvblR5cGUgPSB7CisgIE5PTkU6IDAsCisgIEJJTkFSWTogMSwKKyAgU1RSRUFNOiAyCit9OworZXhwb3J0cy5DTWFwQ29tcHJlc3Npb25UeXBlID0gQ01hcENvbXByZXNzaW9uVHlwZTsKK2NvbnN0IE9QUyA9IHsKKyAgZGVwZW5kZW5jeTogMSwKKyAgc2V0TGluZVdpZHRoOiAyLAorICBzZXRMaW5lQ2FwOiAzLAorICBzZXRMaW5lSm9pbjogNCwKKyAgc2V0TWl0ZXJMaW1pdDogNSwKKyAgc2V0RGFzaDogNiwKKyAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LAorICBzZXRGbGF0bmVzczogOCwKKyAgc2V0R1N0YXRlOiA5LAorICBzYXZlOiAxMCwKKyAgcmVzdG9yZTogMTEsCisgIHRyYW5zZm9ybTogMTIsCisgIG1vdmVUbzogMTMsCisgIGxpbmVUbzogMTQsCisgIGN1cnZlVG86IDE1LAorICBjdXJ2ZVRvMjogMTYsCisgIGN1cnZlVG8zOiAxNywKKyAgY2xvc2VQYXRoOiAxOCwKKyAgcmVjdGFuZ2xlOiAxOSwKKyAgc3Ryb2tlOiAyMCwKKyAgY2xvc2VTdHJva2U6IDIxLAorICBmaWxsOiAyMiwKKyAgZW9GaWxsOiAyMywKKyAgZmlsbFN0cm9rZTogMjQsCisgIGVvRmlsbFN0cm9rZTogMjUsCisgIGNsb3NlRmlsbFN0cm9rZTogMjYsCisgIGNsb3NlRU9GaWxsU3Ryb2tlOiAyNywKKyAgZW5kUGF0aDogMjgsCisgIGNsaXA6IDI5LAorICBlb0NsaXA6IDMwLAorICBiZWdpblRleHQ6IDMxLAorICBlbmRUZXh0OiAzMiwKKyAgc2V0Q2hhclNwYWNpbmc6IDMzLAorICBzZXRXb3JkU3BhY2luZzogMzQsCisgIHNldEhTY2FsZTogMzUsCisgIHNldExlYWRpbmc6IDM2LAorICBzZXRGb250OiAzNywKKyAgc2V0VGV4dFJlbmRlcmluZ01vZGU6IDM4LAorICBzZXRUZXh0UmlzZTogMzksCisgIG1vdmVUZXh0OiA0MCwKKyAgc2V0TGVhZGluZ01vdmVUZXh0OiA0MSwKKyAgc2V0VGV4dE1hdHJpeDogNDIsCisgIG5leHRMaW5lOiA0MywKKyAgc2hvd1RleHQ6IDQ0LAorICBzaG93U3BhY2VkVGV4dDogNDUsCisgIG5leHRMaW5lU2hvd1RleHQ6IDQ2LAorICBuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDogNDcsCisgIHNldENoYXJXaWR0aDogNDgsCisgIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksCisgIHNldFN0cm9rZUNvbG9yU3BhY2U6IDUwLAorICBzZXRGaWxsQ29sb3JTcGFjZTogNTEsCisgIHNldFN0cm9rZUNvbG9yOiA1MiwKKyAgc2V0U3Ryb2tlQ29sb3JOOiA1MywKKyAgc2V0RmlsbENvbG9yOiA1NCwKKyAgc2V0RmlsbENvbG9yTjogNTUsCisgIHNldFN0cm9rZUdyYXk6IDU2LAorICBzZXRGaWxsR3JheTogNTcsCisgIHNldFN0cm9rZVJHQkNvbG9yOiA1OCwKKyAgc2V0RmlsbFJHQkNvbG9yOiA1OSwKKyAgc2V0U3Ryb2tlQ01ZS0NvbG9yOiA2MCwKKyAgc2V0RmlsbENNWUtDb2xvcjogNjEsCisgIHNoYWRpbmdGaWxsOiA2MiwKKyAgYmVnaW5JbmxpbmVJbWFnZTogNjMsCisgIGJlZ2luSW1hZ2VEYXRhOiA2NCwKKyAgZW5kSW5saW5lSW1hZ2U6IDY1LAorICBwYWludFhPYmplY3Q6IDY2LAorICBtYXJrUG9pbnQ6IDY3LAorICBtYXJrUG9pbnRQcm9wczogNjgsCisgIGJlZ2luTWFya2VkQ29udGVudDogNjksCisgIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCwKKyAgZW5kTWFya2VkQ29udGVudDogNzEsCisgIGJlZ2luQ29tcGF0OiA3MiwKKyAgZW5kQ29tcGF0OiA3MywKKyAgcGFpbnRGb3JtWE9iamVjdEJlZ2luOiA3NCwKKyAgcGFpbnRGb3JtWE9iamVjdEVuZDogNzUsCisgIGJlZ2luR3JvdXA6IDc2LAorICBlbmRHcm91cDogNzcsCisgIGJlZ2luQW5ub3RhdGlvbnM6IDc4LAorICBlbmRBbm5vdGF0aW9uczogNzksCisgIGJlZ2luQW5ub3RhdGlvbjogODAsCisgIGVuZEFubm90YXRpb246IDgxLAorICBwYWludEpwZWdYT2JqZWN0OiA4MiwKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiA4MywKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LAorICBwYWludEltYWdlWE9iamVjdDogODUsCisgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiA4NiwKKyAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsCisgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiA4OCwKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0OiA4OSwKKyAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCwKKyAgY29uc3RydWN0UGF0aDogOTEKK307CitleHBvcnRzLk9QUyA9IE9QUzsKK2NvbnN0IFVOU1VQUE9SVEVEX0ZFQVRVUkVTID0geworICB1bmtub3duOiAidW5rbm93biIsCisgIGZvcm1zOiAiZm9ybXMiLAorICBqYXZhU2NyaXB0OiAiamF2YVNjcmlwdCIsCisgIHNtYXNrOiAic21hc2siLAorICBzaGFkaW5nUGF0dGVybjogInNoYWRpbmdQYXR0ZXJuIiwKKyAgZm9udDogImZvbnQiLAorICBlcnJvclRpbGluZ1BhdHRlcm46ICJlcnJvclRpbGluZ1BhdHRlcm4iLAorICBlcnJvckV4dEdTdGF0ZTogImVycm9yRXh0R1N0YXRlIiwKKyAgZXJyb3JYT2JqZWN0OiAiZXJyb3JYT2JqZWN0IiwKKyAgZXJyb3JGb250TG9hZFR5cGUzOiAiZXJyb3JGb250TG9hZFR5cGUzIiwKKyAgZXJyb3JGb250U3RhdGU6ICJlcnJvckZvbnRTdGF0ZSIsCisgIGVycm9yRm9udE1pc3Npbmc6ICJlcnJvckZvbnRNaXNzaW5nIiwKKyAgZXJyb3JGb250VHJhbnNsYXRlOiAiZXJyb3JGb250VHJhbnNsYXRlIiwKKyAgZXJyb3JDb2xvclNwYWNlOiAiZXJyb3JDb2xvclNwYWNlIiwKKyAgZXJyb3JPcGVyYXRvckxpc3Q6ICJlcnJvck9wZXJhdG9yTGlzdCIsCisgIGVycm9yRm9udFRvVW5pY29kZTogImVycm9yRm9udFRvVW5pY29kZSIsCisgIGVycm9yRm9udExvYWROYXRpdmU6ICJlcnJvckZvbnRMb2FkTmF0aXZlIiwKKyAgZXJyb3JGb250R2V0UGF0aDogImVycm9yRm9udEdldFBhdGgiLAorICBlcnJvck1hcmtlZENvbnRlbnQ6ICJlcnJvck1hcmtlZENvbnRlbnQiCit9OworZXhwb3J0cy5VTlNVUFBPUlRFRF9GRUFUVVJFUyA9IFVOU1VQUE9SVEVEX0ZFQVRVUkVTOworY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7CisgIE5FRURfUEFTU1dPUkQ6IDEsCisgIElOQ09SUkVDVF9QQVNTV09SRDogMgorfTsKK2V4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBQYXNzd29yZFJlc3BvbnNlczsKK2xldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUzsKKworZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHsKKyAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7CisgICAgdmVyYm9zaXR5ID0gbGV2ZWw7CisgIH0KK30KKworZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7CisgIHJldHVybiB2ZXJib3NpdHk7Cit9CisKK2Z1bmN0aW9uIGluZm8obXNnKSB7CisgIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MpIHsKKyAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7CisgIH0KK30KKworZnVuY3Rpb24gd2Fybihtc2cpIHsKKyAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykgeworICAgIGNvbnNvbGUubG9nKGBXYXJuaW5nOiAke21zZ31gKTsKKyAgfQorfQorCitmdW5jdGlvbiB1bnJlYWNoYWJsZShtc2cpIHsKKyAgdGhyb3cgbmV3IEVycm9yKG1zZyk7Cit9CisKK2Z1bmN0aW9uIGFzc2VydChjb25kLCBtc2cpIHsKKyAgaWYgKCFjb25kKSB7CisgICAgdW5yZWFjaGFibGUobXNnKTsKKyAgfQorfQorCitmdW5jdGlvbiBpc1NhbWVPcmlnaW4oYmFzZVVybCwgb3RoZXJVcmwpIHsKKyAgbGV0IGJhc2U7CisKKyAgdHJ5IHsKKyAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTsKKworICAgIGlmICghYmFzZS5vcmlnaW4gfHwgYmFzZS5vcmlnaW4gPT09ICJudWxsIikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBjYXRjaCAoZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IG90aGVyID0gbmV3IFVSTChvdGhlclVybCwgYmFzZSk7CisgIHJldHVybiBiYXNlLm9yaWdpbiA9PT0gb3RoZXIub3JpZ2luOworfQorCitmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkgeworICBpZiAoIXVybCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN3aXRjaCAodXJsLnByb3RvY29sKSB7CisgICAgY2FzZSAiaHR0cDoiOgorICAgIGNhc2UgImh0dHBzOiI6CisgICAgY2FzZSAiZnRwOiI6CisgICAgY2FzZSAibWFpbHRvOiI6CisgICAgY2FzZSAidGVsOiI6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwpIHsKKyAgaWYgKCF1cmwpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHRyeSB7CisgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpOworCisgICAgaWYgKF9pc1ZhbGlkUHJvdG9jb2woYWJzb2x1dGVVcmwpKSB7CisgICAgICByZXR1cm4gYWJzb2x1dGVVcmw7CisgICAgfQorICB9IGNhdGNoIChleCkge30KKworICByZXR1cm4gbnVsbDsKK30KKworZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUpIHsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgeworICAgIHZhbHVlLAorICAgIGVudW1lcmFibGU6IHRydWUsCisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIHdyaXRhYmxlOiBmYWxzZQorICB9KTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitjb25zdCBCYXNlRXhjZXB0aW9uID0gZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSkgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7CisgICAgICB1bnJlYWNoYWJsZSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi4iKTsKKyAgICB9CisKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgfQorCisgIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7CisgIEJhc2VFeGNlcHRpb24uY29uc3RydWN0b3IgPSBCYXNlRXhjZXB0aW9uOworICByZXR1cm4gQmFzZUV4Y2VwdGlvbjsKK30oKTsKKworZXhwb3J0cy5CYXNlRXhjZXB0aW9uID0gQmFzZUV4Y2VwdGlvbjsKKworY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnLCBjb2RlKSB7CisgICAgc3VwZXIobXNnKTsKKyAgICB0aGlzLmNvZGUgPSBjb2RlOworICB9CisKK30KKworZXhwb3J0cy5QYXNzd29yZEV4Y2VwdGlvbiA9IFBhc3N3b3JkRXhjZXB0aW9uOworCitjbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7CisgICAgc3VwZXIobXNnKTsKKyAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzOworICB9CisKK30KKworZXhwb3J0cy5Vbmtub3duRXJyb3JFeGNlcHRpb24gPSBVbmtub3duRXJyb3JFeGNlcHRpb247CisKK2NsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IEludmFsaWRQREZFeGNlcHRpb247CisKK2NsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IE1pc3NpbmdQREZFeGNlcHRpb247CisKK2NsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykgeworICAgIHN1cGVyKG1zZyk7CisgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgIH0KKworfQorCitleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjsKKworY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuRm9ybWF0RXJyb3IgPSBGb3JtYXRFcnJvcjsKKworY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuQWJvcnRFeGNlcHRpb24gPSBBYm9ydEV4Y2VwdGlvbjsKK2NvbnN0IE51bGxDaGFyYWN0ZXJzUmVnRXhwID0gL1x4MDAvZzsKKworZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnMoc3RyKSB7CisgIGlmICh0eXBlb2Ygc3RyICE9PSAic3RyaW5nIikgeworICAgIHdhcm4oIlRoZSBhcmd1bWVudCBmb3IgcmVtb3ZlTnVsbENoYXJhY3RlcnMgbXVzdCBiZSBhIHN0cmluZy4iKTsKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgcmV0dXJuIHN0ci5yZXBsYWNlKE51bGxDaGFyYWN0ZXJzUmVnRXhwLCAiIik7Cit9CisKK2Z1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHsKKyAgYXNzZXJ0KGJ5dGVzICE9PSBudWxsICYmIHR5cGVvZiBieXRlcyA9PT0gIm9iamVjdCIgJiYgYnl0ZXMubGVuZ3RoICE9PSB1bmRlZmluZWQsICJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7CisgIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgY29uc3QgTUFYX0FSR1VNRU5UX0NPVU5UID0gODE5MjsKKworICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7CisgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpOworICB9CisKKyAgY29uc3Qgc3RyQnVmID0gW107CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7CisgICAgY29uc3QgY2h1bmtFbmQgPSBNYXRoLm1pbihpICsgTUFYX0FSR1VNRU5UX0NPVU5ULCBsZW5ndGgpOworICAgIGNvbnN0IGNodW5rID0gYnl0ZXMuc3ViYXJyYXkoaSwgY2h1bmtFbmQpOworICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKKyAgfQorCisgIHJldHVybiBzdHJCdWYuam9pbigiIik7Cit9CisKK2Z1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7CisgIGFzc2VydCh0eXBlb2Ygc3RyID09PSAic3RyaW5nIiwgIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTsKKyAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDsKKyAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOworCisgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBieXRlc1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZjsKKyAgfQorCisgIHJldHVybiBieXRlczsKK30KKworZnVuY3Rpb24gYXJyYXlCeXRlTGVuZ3RoKGFycikgeworICBpZiAoYXJyLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIGFyci5sZW5ndGg7CisgIH0KKworICBhc3NlcnQoYXJyLmJ5dGVMZW5ndGggIT09IHVuZGVmaW5lZCwgImFycmF5Qnl0ZUxlbmd0aCAtIGludmFsaWQgYXJndW1lbnQuIik7CisgIHJldHVybiBhcnIuYnl0ZUxlbmd0aDsKK30KKworZnVuY3Rpb24gYXJyYXlzVG9CeXRlcyhhcnIpIHsKKyAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDsKKworICBpZiAobGVuZ3RoID09PSAxICYmIGFyclswXSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKKyAgICByZXR1cm4gYXJyWzBdOworICB9CisKKyAgbGV0IHJlc3VsdExlbmd0aCA9IDA7CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgIHJlc3VsdExlbmd0aCArPSBhcnJheUJ5dGVMZW5ndGgoYXJyW2ldKTsKKyAgfQorCisgIGxldCBwb3MgPSAwOworICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0TGVuZ3RoKTsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgbGV0IGl0ZW0gPSBhcnJbaV07CisKKyAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHsKKyAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gInN0cmluZyIpIHsKKyAgICAgICAgaXRlbSA9IHN0cmluZ1RvQnl0ZXMoaXRlbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpdGVtID0gbmV3IFVpbnQ4QXJyYXkoaXRlbSk7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgaXRlbUxlbmd0aCA9IGl0ZW0uYnl0ZUxlbmd0aDsKKyAgICBkYXRhLnNldChpdGVtLCBwb3MpOworICAgIHBvcyArPSBpdGVtTGVuZ3RoOworICB9CisKKyAgcmV0dXJuIGRhdGE7Cit9CisKK2Z1bmN0aW9uIHN0cmluZzMyKHZhbHVlKSB7CisgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKK30KKworZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7CisgIGNvbnN0IGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTsKKyAgYnVmZmVyOFswXSA9IDE7CisgIGNvbnN0IHZpZXczMiA9IG5ldyBVaW50MzJBcnJheShidWZmZXI4LmJ1ZmZlciwgMCwgMSk7CisgIHJldHVybiB2aWV3MzJbMF0gPT09IDE7Cit9CisKK2NvbnN0IElzTGl0dGxlRW5kaWFuQ2FjaGVkID0geworICBnZXQgdmFsdWUoKSB7CisgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmFsdWUiLCBpc0xpdHRsZUVuZGlhbigpKTsKKyAgfQorCit9OworZXhwb3J0cy5Jc0xpdHRsZUVuZGlhbkNhY2hlZCA9IElzTGl0dGxlRW5kaWFuQ2FjaGVkOworCitmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7CisgIHRyeSB7CisgICAgbmV3IEZ1bmN0aW9uKCIiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitjb25zdCBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSB7CisgIGdldCB2YWx1ZSgpIHsKKyAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2YWx1ZSIsIGlzRXZhbFN1cHBvcnRlZCgpKTsKKyAgfQorCit9OworZXhwb3J0cy5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQ7Citjb25zdCByZ2JCdWYgPSBbInJnYigiLCAwLCAiLCIsIDAsICIsIiwgMCwgIikiXTsKKworY2xhc3MgVXRpbCB7CisgIHN0YXRpYyBtYWtlQ3NzUmdiKHIsIGcsIGIpIHsKKyAgICByZ2JCdWZbMV0gPSByOworICAgIHJnYkJ1ZlszXSA9IGc7CisgICAgcmdiQnVmWzVdID0gYjsKKyAgICByZXR1cm4gcmdiQnVmLmpvaW4oIiIpOworICB9CisKKyAgc3RhdGljIHRyYW5zZm9ybShtMSwgbTIpIHsKKyAgICByZXR1cm4gW20xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLCBtMVsxXSAqIG0yWzBdICsgbTFbM10gKiBtMlsxXSwgbTFbMF0gKiBtMlsyXSArIG0xWzJdICogbTJbM10sIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLCBtMVswXSAqIG0yWzRdICsgbTFbMl0gKiBtMls1XSArIG0xWzRdLCBtMVsxXSAqIG0yWzRdICsgbTFbM10gKiBtMls1XSArIG0xWzVdXTsKKyAgfQorCisgIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7CisgICAgY29uc3QgeHQgPSBwWzBdICogbVswXSArIHBbMV0gKiBtWzJdICsgbVs0XTsKKyAgICBjb25zdCB5dCA9IHBbMF0gKiBtWzFdICsgcFsxXSAqIG1bM10gKyBtWzVdOworICAgIHJldHVybiBbeHQsIHl0XTsKKyAgfQorCisgIHN0YXRpYyBhcHBseUludmVyc2VUcmFuc2Zvcm0ocCwgbSkgeworICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOworICAgIGNvbnN0IHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7CisgICAgY29uc3QgeXQgPSAoLXBbMF0gKiBtWzFdICsgcFsxXSAqIG1bMF0gKyBtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQ7CisgICAgcmV0dXJuIFt4dCwgeXRdOworICB9CisKKyAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHsKKyAgICBjb25zdCBwMSA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0ociwgbSk7CisgICAgY29uc3QgcDIgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHIuc2xpY2UoMiwgNCksIG0pOworICAgIGNvbnN0IHAzID0gVXRpbC5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pOworICAgIGNvbnN0IHA0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbclsyXSwgclsxXV0sIG0pOworICAgIHJldHVybiBbTWF0aC5taW4ocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1pbihwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5tYXgocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pXTsKKyAgfQorCisgIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHsKKyAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTsKKyAgICByZXR1cm4gW21bM10gLyBkLCAtbVsxXSAvIGQsIC1tWzJdIC8gZCwgbVswXSAvIGQsIChtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQsIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGRdOworICB9CisKKyAgc3RhdGljIGFwcGx5M2RUcmFuc2Zvcm0obSwgdikgeworICAgIHJldHVybiBbbVswXSAqIHZbMF0gKyBtWzFdICogdlsxXSArIG1bMl0gKiB2WzJdLCBtWzNdICogdlswXSArIG1bNF0gKiB2WzFdICsgbVs1XSAqIHZbMl0sIG1bNl0gKiB2WzBdICsgbVs3XSAqIHZbMV0gKyBtWzhdICogdlsyXV07CisgIH0KKworICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkgeworICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTsKKyAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07CisgICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdOworICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTsKKyAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107CisgICAgY29uc3QgZmlyc3QgPSAoYSArIGQpIC8gMjsKKyAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqIChhICsgZCkgLSA0ICogKGEgKiBkIC0gYyAqIGIpKSAvIDI7CisgICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxOworICAgIGNvbnN0IHN5ID0gZmlyc3QgLSBzZWNvbmQgfHwgMTsKKyAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldOworICB9CisKKyAgc3RhdGljIG5vcm1hbGl6ZVJlY3QocmVjdCkgeworICAgIGNvbnN0IHIgPSByZWN0LnNsaWNlKDApOworCisgICAgaWYgKHJlY3RbMF0gPiByZWN0WzJdKSB7CisgICAgICByWzBdID0gcmVjdFsyXTsKKyAgICAgIHJbMl0gPSByZWN0WzBdOworICAgIH0KKworICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkgeworICAgICAgclsxXSA9IHJlY3RbM107CisgICAgICByWzNdID0gcmVjdFsxXTsKKyAgICB9CisKKyAgICByZXR1cm4gcjsKKyAgfQorCisgIHN0YXRpYyBpbnRlcnNlY3QocmVjdDEsIHJlY3QyKSB7CisgICAgZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7CisgICAgICByZXR1cm4gYSAtIGI7CisgICAgfQorCisgICAgY29uc3Qgb3JkZXJlZFggPSBbcmVjdDFbMF0sIHJlY3QxWzJdLCByZWN0MlswXSwgcmVjdDJbMl1dLnNvcnQoY29tcGFyZSk7CisgICAgY29uc3Qgb3JkZXJlZFkgPSBbcmVjdDFbMV0sIHJlY3QxWzNdLCByZWN0MlsxXSwgcmVjdDJbM11dLnNvcnQoY29tcGFyZSk7CisgICAgY29uc3QgcmVzdWx0ID0gW107CisgICAgcmVjdDEgPSBVdGlsLm5vcm1hbGl6ZVJlY3QocmVjdDEpOworICAgIHJlY3QyID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QyKTsKKworICAgIGlmIChvcmRlcmVkWFswXSA9PT0gcmVjdDFbMF0gJiYgb3JkZXJlZFhbMV0gPT09IHJlY3QyWzBdIHx8IG9yZGVyZWRYWzBdID09PSByZWN0MlswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDFbMF0pIHsKKyAgICAgIHJlc3VsdFswXSA9IG9yZGVyZWRYWzFdOworICAgICAgcmVzdWx0WzJdID0gb3JkZXJlZFhbMl07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGlmIChvcmRlcmVkWVswXSA9PT0gcmVjdDFbMV0gJiYgb3JkZXJlZFlbMV0gPT09IHJlY3QyWzFdIHx8IG9yZGVyZWRZWzBdID09PSByZWN0MlsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDFbMV0pIHsKKyAgICAgIHJlc3VsdFsxXSA9IG9yZGVyZWRZWzFdOworICAgICAgcmVzdWx0WzNdID0gb3JkZXJlZFlbMl07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworfQorCitleHBvcnRzLlV0aWwgPSBVdGlsOworY29uc3QgUERGU3RyaW5nVHJhbnNsYXRlVGFibGUgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyRDgsIDB4MkM3LCAweDJDNiwgMHgyRDksIDB4MkRELCAweDJEQiwgMHgyREEsIDB4MkRDLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDIwMjIsIDB4MjAyMCwgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDE5MiwgMHgyMDQ0LCAweDIwMzksIDB4MjAzQSwgMHgyMjEyLCAweDIwMzAsIDB4MjAxRSwgMHgyMDFDLCAweDIwMUQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUEsIDB4MjEyMiwgMHhGQjAxLCAweEZCMDIsIDB4MTQxLCAweDE1MiwgMHgxNjAsIDB4MTc4LCAweDE3RCwgMHgxMzEsIDB4MTQyLCAweDE1MywgMHgxNjEsIDB4MTdFLCAwLCAweDIwQUNdOworCitmdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhzdHIpIHsKKyAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aCwKKyAgICAgICAgc3RyQnVmID0gW107CisKKyAgaWYgKHN0clswXSA9PT0gIlx4RkUiICYmIHN0clsxXSA9PT0gIlx4RkYiKSB7CisgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikgeworICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShzdHIuY2hhckNvZGVBdChpKSA8PCA4IHwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0clswXSA9PT0gIlx4RkYiICYmIHN0clsxXSA9PT0gIlx4RkUiKSB7CisgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikgeworICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShzdHIuY2hhckNvZGVBdChpICsgMSkgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkpKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChpKV07CisgICAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHJCdWYuam9pbigiIik7Cit9CisKK2Z1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHsKKyAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW1woXClcXF0pL2csICJcXCQxIik7Cit9CisKK2Z1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhzdHIpIHsKKyAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7Cit9CisKK2Z1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhzdHIpIHsKKyAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsKK30KKworZnVuY3Rpb24gaXNCb29sKHYpIHsKKyAgcmV0dXJuIHR5cGVvZiB2ID09PSAiYm9vbGVhbiI7Cit9CisKK2Z1bmN0aW9uIGlzTnVtKHYpIHsKKyAgcmV0dXJuIHR5cGVvZiB2ID09PSAibnVtYmVyIjsKK30KKworZnVuY3Rpb24gaXNTdHJpbmcodikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJzdHJpbmciOworfQorCitmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHYpIHsKKyAgcmV0dXJuIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9PSBudWxsICYmIHYuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkOworfQorCitmdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikgeworICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIGFycjEuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7CisgICAgcmV0dXJuIGVsZW1lbnQgPT09IGFycjJbaW5kZXhdOworICB9KTsKK30KKworZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZShkYXRlID0gbmV3IERhdGUoRGF0ZS5ub3coKSkpIHsKKyAgY29uc3QgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCAoZGF0ZS5nZXRVVENEYXRlKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpXTsKKyAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKSB7CisgIGNvbnN0IGNhcGFiaWxpdHkgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICBsZXQgaXNTZXR0bGVkID0gZmFsc2U7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYXBhYmlsaXR5LCAic2V0dGxlZCIsIHsKKyAgICBnZXQoKSB7CisgICAgICByZXR1cm4gaXNTZXR0bGVkOworICAgIH0KKworICB9KTsKKyAgY2FwYWJpbGl0eS5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgIGNhcGFiaWxpdHkucmVzb2x2ZSA9IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICBpc1NldHRsZWQgPSB0cnVlOworICAgICAgcmVzb2x2ZShkYXRhKTsKKyAgICB9OworCisgICAgY2FwYWJpbGl0eS5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBpc1NldHRsZWQgPSB0cnVlOworICAgICAgcmVqZWN0KHJlYXNvbik7CisgICAgfTsKKyAgfSk7CisgIHJldHVybiBjYXBhYmlsaXR5OworfQorCitjb25zdCBjcmVhdGVPYmplY3RVUkwgPSBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkxDbG9zdXJlKCkgeworICBjb25zdCBkaWdpdHMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iOworICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGRhdGEsIGNvbnRlbnRUeXBlLCBmb3JjZURhdGFTY2hlbWEgPSBmYWxzZSkgeworICAgIGlmICghZm9yY2VEYXRhU2NoZW1hICYmIFVSTC5jcmVhdGVPYmplY3RVUkwpIHsKKyAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsKKyAgICAgICAgdHlwZTogY29udGVudFR5cGUKKyAgICAgIH0pOworICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CisgICAgfQorCisgICAgbGV0IGJ1ZmZlciA9IGBkYXRhOiR7Y29udGVudFR5cGV9O2Jhc2U2NCxgOworCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7CisgICAgICBjb25zdCBiMSA9IGRhdGFbaV0gJiAweGZmOworICAgICAgY29uc3QgYjIgPSBkYXRhW2kgKyAxXSAmIDB4ZmY7CisgICAgICBjb25zdCBiMyA9IGRhdGFbaSArIDJdICYgMHhmZjsKKyAgICAgIGNvbnN0IGQxID0gYjEgPj4gMiwKKyAgICAgICAgICAgIGQyID0gKGIxICYgMykgPDwgNCB8IGIyID4+IDQ7CisgICAgICBjb25zdCBkMyA9IGkgKyAxIDwgaWkgPyAoYjIgJiAweGYpIDw8IDIgfCBiMyA+PiA2IDogNjQ7CisgICAgICBjb25zdCBkNCA9IGkgKyAyIDwgaWkgPyBiMyAmIDB4M2YgOiA2NDsKKyAgICAgIGJ1ZmZlciArPSBkaWdpdHNbZDFdICsgZGlnaXRzW2QyXSArIGRpZ2l0c1tkM10gKyBkaWdpdHNbZDRdOworICAgIH0KKworICAgIHJldHVybiBidWZmZXI7CisgIH07Cit9KCk7CisKK2V4cG9ydHMuY3JlYXRlT2JqZWN0VVJMID0gY3JlYXRlT2JqZWN0VVJMOworCisvKioqLyB9KSwKKy8qIDMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK3ZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CisKKzsKKworLyoqKi8gfSksCisvKiA0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuaXNOb2RlSlMgPSB2b2lkIDA7Citjb25zdCBpc05vZGVKUyA9IHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJiBwcm9jZXNzICsgIiIgPT09ICJbb2JqZWN0IHByb2Nlc3NdIiAmJiAhcHJvY2Vzcy52ZXJzaW9ucy5udyAmJiAhKHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gJiYgcHJvY2Vzcy50eXBlICYmIHByb2Nlc3MudHlwZSAhPT0gImJyb3dzZXIiKTsKK2V4cG9ydHMuaXNOb2RlSlMgPSBpc05vZGVKUzsKKworLyoqKi8gfSksCisvKiA1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuY2xlYXJQcmltaXRpdmVDYWNoZXMgPSBjbGVhclByaW1pdGl2ZUNhY2hlczsKK2V4cG9ydHMuaXNFT0YgPSBpc0VPRjsKK2V4cG9ydHMuaXNDbWQgPSBpc0NtZDsKK2V4cG9ydHMuaXNEaWN0ID0gaXNEaWN0OworZXhwb3J0cy5pc05hbWUgPSBpc05hbWU7CitleHBvcnRzLmlzUmVmID0gaXNSZWY7CitleHBvcnRzLmlzUmVmc0VxdWFsID0gaXNSZWZzRXF1YWw7CitleHBvcnRzLmlzU3RyZWFtID0gaXNTdHJlYW07CitleHBvcnRzLlJlZlNldENhY2hlID0gZXhwb3J0cy5SZWZTZXQgPSBleHBvcnRzLlJlZiA9IGV4cG9ydHMuTmFtZSA9IGV4cG9ydHMuRGljdCA9IGV4cG9ydHMuQ21kID0gZXhwb3J0cy5FT0YgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBFT0YgPSB7fTsKK2V4cG9ydHMuRU9GID0gRU9GOworCit2YXIgTmFtZSA9IGZ1bmN0aW9uIE5hbWVDbG9zdXJlKCkgeworICBsZXQgbmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICBmdW5jdGlvbiBOYW1lKG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgTmFtZS5wcm90b3R5cGUgPSB7fTsKKworICBOYW1lLmdldCA9IGZ1bmN0aW9uIE5hbWVfZ2V0KG5hbWUpIHsKKyAgICB2YXIgbmFtZVZhbHVlID0gbmFtZUNhY2hlW25hbWVdOworICAgIHJldHVybiBuYW1lVmFsdWUgPyBuYW1lVmFsdWUgOiBuYW1lQ2FjaGVbbmFtZV0gPSBuZXcgTmFtZShuYW1lKTsKKyAgfTsKKworICBOYW1lLl9jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkgeworICAgIG5hbWVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH07CisKKyAgcmV0dXJuIE5hbWU7Cit9KCk7CisKK2V4cG9ydHMuTmFtZSA9IE5hbWU7CisKK3ZhciBDbWQgPSBmdW5jdGlvbiBDbWRDbG9zdXJlKCkgeworICBsZXQgY21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgIGZ1bmN0aW9uIENtZChjbWQpIHsKKyAgICB0aGlzLmNtZCA9IGNtZDsKKyAgfQorCisgIENtZC5wcm90b3R5cGUgPSB7fTsKKworICBDbWQuZ2V0ID0gZnVuY3Rpb24gQ21kX2dldChjbWQpIHsKKyAgICB2YXIgY21kVmFsdWUgPSBjbWRDYWNoZVtjbWRdOworICAgIHJldHVybiBjbWRWYWx1ZSA/IGNtZFZhbHVlIDogY21kQ2FjaGVbY21kXSA9IG5ldyBDbWQoY21kKTsKKyAgfTsKKworICBDbWQuX2NsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7CisgICAgY21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9OworCisgIHJldHVybiBDbWQ7Cit9KCk7CisKK2V4cG9ydHMuQ21kID0gQ21kOworCit2YXIgRGljdCA9IGZ1bmN0aW9uIERpY3RDbG9zdXJlKCkgeworICB2YXIgbm9uU2VyaWFsaXphYmxlID0gZnVuY3Rpb24gbm9uU2VyaWFsaXphYmxlQ2xvc3VyZSgpIHsKKyAgICByZXR1cm4gbm9uU2VyaWFsaXphYmxlOworICB9OworCisgIGZ1bmN0aW9uIERpY3QoeHJlZikgeworICAgIHRoaXMuX21hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLm9iaklkID0gbnVsbDsKKyAgICB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlOworICAgIHRoaXMuX19ub25TZXJpYWxpemFibGVfXyA9IG5vblNlcmlhbGl6YWJsZTsKKyAgfQorCisgIERpY3QucHJvdG90eXBlID0geworICAgIGFzc2lnblhyZWY6IGZ1bmN0aW9uIERpY3RfYXNzaWduWHJlZihuZXdYcmVmKSB7CisgICAgICB0aGlzLnhyZWYgPSBuZXdYcmVmOworICAgIH0sCisKKyAgICBnZXQgc2l6ZSgpIHsKKyAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApLmxlbmd0aDsKKyAgICB9LAorCisgICAgZ2V0KGtleTEsIGtleTIsIGtleTMpIHsKKyAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX21hcFtrZXkxXTsKKworICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHZhbHVlID0gdGhpcy5fbWFwW2tleTJdOworCisgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIHZhbHVlID0gdGhpcy5fbWFwW2tleTNdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMueHJlZi5mZXRjaCh2YWx1ZSwgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOworICAgICAgfQorCisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSwKKworICAgIGFzeW5jIGdldEFzeW5jKGtleTEsIGtleTIsIGtleTMpIHsKKyAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX21hcFtrZXkxXTsKKworICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHZhbHVlID0gdGhpcy5fbWFwW2tleTJdOworCisgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIHZhbHVlID0gdGhpcy5fbWFwW2tleTNdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMueHJlZi5mZXRjaEFzeW5jKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9LAorCisgICAgZ2V0QXJyYXkoa2V5MSwga2V5Miwga2V5MykgeworICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXQoa2V5MSwga2V5Miwga2V5Myk7CisKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgIXRoaXMueHJlZikgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisKKyAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoKTsKKworICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBpZiAoISh2YWx1ZVtpXSBpbnN0YW5jZW9mIFJlZikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlW2ldID0gdGhpcy54cmVmLmZldGNoKHZhbHVlW2ldLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9LAorCisgICAgZ2V0UmF3OiBmdW5jdGlvbiBEaWN0X2dldFJhdyhrZXkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBba2V5XTsKKyAgICB9LAorICAgIGdldEtleXM6IGZ1bmN0aW9uIERpY3RfZ2V0S2V5cygpIHsKKyAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApOworICAgIH0sCisgICAgZ2V0UmF3VmFsdWVzOiBmdW5jdGlvbiBEaWN0X2dldFJhd1ZhbHVlcygpIHsKKyAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX21hcCk7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uIERpY3Rfc2V0KGtleSwgdmFsdWUpIHsKKyAgICAgIHRoaXMuX21hcFtrZXldID0gdmFsdWU7CisgICAgfSwKKyAgICBoYXM6IGZ1bmN0aW9uIERpY3RfaGFzKGtleSkgeworICAgICAgcmV0dXJuIHRoaXMuX21hcFtrZXldICE9PSB1bmRlZmluZWQ7CisgICAgfSwKKyAgICBmb3JFYWNoOiBmdW5jdGlvbiBEaWN0X2ZvckVhY2goY2FsbGJhY2spIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9tYXApIHsKKyAgICAgICAgY2FsbGJhY2soa2V5LCB0aGlzLmdldChrZXkpKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisgIERpY3QuZW1wdHkgPSBuZXcgRGljdChudWxsKTsKKworICBEaWN0Lm1lcmdlID0gZnVuY3Rpb24gKHsKKyAgICB4cmVmLAorICAgIGRpY3RBcnJheSwKKyAgICBtZXJnZVN1YkRpY3RzID0gZmFsc2UKKyAgfSkgeworICAgIGNvbnN0IG1lcmdlZERpY3QgPSBuZXcgRGljdCh4cmVmKTsKKworICAgIGlmICghbWVyZ2VTdWJEaWN0cykgeworICAgICAgZm9yIChjb25zdCBkaWN0IG9mIGRpY3RBcnJheSkgeworICAgICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRpY3QuX21hcCkpIHsKKyAgICAgICAgICBpZiAobWVyZ2VkRGljdC5fbWFwW2tleV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgbWVyZ2VkRGljdC5fbWFwW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1lcmdlZERpY3Quc2l6ZSA+IDAgPyBtZXJnZWREaWN0IDogRGljdC5lbXB0eTsKKyAgICB9CisKKyAgICBjb25zdCBwcm9wZXJ0aWVzID0gbmV3IE1hcCgpOworCisgICAgZm9yIChjb25zdCBkaWN0IG9mIGRpY3RBcnJheSkgeworICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkaWN0Ll9tYXApKSB7CisgICAgICAgIGxldCBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7CisKKyAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBwcm9wZXJ0eSA9IFtdOworICAgICAgICAgIHByb3BlcnRpZXMuc2V0KGtleSwgcHJvcGVydHkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydHkucHVzaCh2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVzXSBvZiBwcm9wZXJ0aWVzKSB7CisgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSB8fCAhKHZhbHVlc1swXSBpbnN0YW5jZW9mIERpY3QpKSB7CisgICAgICAgIG1lcmdlZERpY3QuX21hcFtuYW1lXSA9IHZhbHVlc1swXTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHN1YkRpY3QgPSBuZXcgRGljdCh4cmVmKTsKKworICAgICAgZm9yIChjb25zdCBkaWN0IG9mIHZhbHVlcykgeworICAgICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRpY3QuX21hcCkpIHsKKyAgICAgICAgICBpZiAoc3ViRGljdC5fbWFwW2tleV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgc3ViRGljdC5fbWFwW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN1YkRpY3Quc2l6ZSA+IDApIHsKKyAgICAgICAgbWVyZ2VkRGljdC5fbWFwW25hbWVdID0gc3ViRGljdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgcmV0dXJuIG1lcmdlZERpY3Quc2l6ZSA+IDAgPyBtZXJnZWREaWN0IDogRGljdC5lbXB0eTsKKyAgfTsKKworICByZXR1cm4gRGljdDsKK30oKTsKKworZXhwb3J0cy5EaWN0ID0gRGljdDsKKwordmFyIFJlZiA9IGZ1bmN0aW9uIFJlZkNsb3N1cmUoKSB7CisgIGxldCByZWZDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgZnVuY3Rpb24gUmVmKG51bSwgZ2VuKSB7CisgICAgdGhpcy5udW0gPSBudW07CisgICAgdGhpcy5nZW4gPSBnZW47CisgIH0KKworICBSZWYucHJvdG90eXBlID0geworICAgIHRvU3RyaW5nOiBmdW5jdGlvbiBSZWZfdG9TdHJpbmcoKSB7CisgICAgICBpZiAodGhpcy5nZW4gPT09IDApIHsKKyAgICAgICAgcmV0dXJuIGAke3RoaXMubnVtfVJgOworICAgICAgfQorCisgICAgICByZXR1cm4gYCR7dGhpcy5udW19UiR7dGhpcy5nZW59YDsKKyAgICB9CisgIH07CisKKyAgUmVmLmdldCA9IGZ1bmN0aW9uIChudW0sIGdlbikgeworICAgIGNvbnN0IGtleSA9IGdlbiA9PT0gMCA/IGAke251bX1SYCA6IGAke251bX1SJHtnZW59YDsKKyAgICBjb25zdCByZWZWYWx1ZSA9IHJlZkNhY2hlW2tleV07CisgICAgcmV0dXJuIHJlZlZhbHVlID8gcmVmVmFsdWUgOiByZWZDYWNoZVtrZXldID0gbmV3IFJlZihudW0sIGdlbik7CisgIH07CisKKyAgUmVmLl9jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkgeworICAgIHJlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfTsKKworICByZXR1cm4gUmVmOworfSgpOworCitleHBvcnRzLlJlZiA9IFJlZjsKKworY2xhc3MgUmVmU2V0IHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5fc2V0ID0gbmV3IFNldCgpOworICB9CisKKyAgaGFzKHJlZikgeworICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKHJlZi50b1N0cmluZygpKTsKKyAgfQorCisgIHB1dChyZWYpIHsKKyAgICB0aGlzLl9zZXQuYWRkKHJlZi50b1N0cmluZygpKTsKKyAgfQorCisgIHJlbW92ZShyZWYpIHsKKyAgICB0aGlzLl9zZXQuZGVsZXRlKHJlZi50b1N0cmluZygpKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUmVmU2V0ID0gUmVmU2V0OworCitjbGFzcyBSZWZTZXRDYWNoZSB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKyAgfQorCisgIGdldCBzaXplKCkgeworICAgIHJldHVybiB0aGlzLl9tYXAuc2l6ZTsKKyAgfQorCisgIGdldChyZWYpIHsKKyAgICByZXR1cm4gdGhpcy5fbWFwLmdldChyZWYudG9TdHJpbmcoKSk7CisgIH0KKworICBoYXMocmVmKSB7CisgICAgcmV0dXJuIHRoaXMuX21hcC5oYXMocmVmLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHV0KHJlZiwgb2JqKSB7CisgICAgdGhpcy5fbWFwLnNldChyZWYudG9TdHJpbmcoKSwgb2JqKTsKKyAgfQorCisgIHB1dEFsaWFzKHJlZiwgYWxpYXNSZWYpIHsKKyAgICB0aGlzLl9tYXAuc2V0KHJlZi50b1N0cmluZygpLCB0aGlzLmdldChhbGlhc1JlZikpOworICB9CisKKyAgZm9yRWFjaChjYWxsYmFjaykgeworICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy5fbWFwLnZhbHVlcygpKSB7CisgICAgICBjYWxsYmFjayh2YWx1ZSk7CisgICAgfQorICB9CisKKyAgY2xlYXIoKSB7CisgICAgdGhpcy5fbWFwLmNsZWFyKCk7CisgIH0KKworfQorCitleHBvcnRzLlJlZlNldENhY2hlID0gUmVmU2V0Q2FjaGU7CisKK2Z1bmN0aW9uIGlzRU9GKHYpIHsKKyAgcmV0dXJuIHYgPT09IEVPRjsKK30KKworZnVuY3Rpb24gaXNOYW1lKHYsIG5hbWUpIHsKKyAgcmV0dXJuIHYgaW5zdGFuY2VvZiBOYW1lICYmIChuYW1lID09PSB1bmRlZmluZWQgfHwgdi5uYW1lID09PSBuYW1lKTsKK30KKworZnVuY3Rpb24gaXNDbWQodiwgY21kKSB7CisgIHJldHVybiB2IGluc3RhbmNlb2YgQ21kICYmIChjbWQgPT09IHVuZGVmaW5lZCB8fCB2LmNtZCA9PT0gY21kKTsKK30KKworZnVuY3Rpb24gaXNEaWN0KHYsIHR5cGUpIHsKKyAgcmV0dXJuIHYgaW5zdGFuY2VvZiBEaWN0ICYmICh0eXBlID09PSB1bmRlZmluZWQgfHwgaXNOYW1lKHYuZ2V0KCJUeXBlIiksIHR5cGUpKTsKK30KKworZnVuY3Rpb24gaXNSZWYodikgeworICByZXR1cm4gdiBpbnN0YW5jZW9mIFJlZjsKK30KKworZnVuY3Rpb24gaXNSZWZzRXF1YWwodjEsIHYyKSB7CisgIHJldHVybiB2MS5udW0gPT09IHYyLm51bSAmJiB2MS5nZW4gPT09IHYyLmdlbjsKK30KKworZnVuY3Rpb24gaXNTdHJlYW0odikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJvYmplY3QiICYmIHYgIT09IG51bGwgJiYgdi5nZXRCeXRlcyAhPT0gdW5kZWZpbmVkOworfQorCitmdW5jdGlvbiBjbGVhclByaW1pdGl2ZUNhY2hlcygpIHsKKyAgQ21kLl9jbGVhckNhY2hlKCk7CisKKyAgTmFtZS5fY2xlYXJDYWNoZSgpOworCisgIFJlZi5fY2xlYXJDYWNoZSgpOworfQorCisvKioqLyB9KSwKKy8qIDYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5OZXR3b3JrUGRmTWFuYWdlciA9IGV4cG9ydHMuTG9jYWxQZGZNYW5hZ2VyID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX2NodW5rZWRfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKwordmFyIF9kb2N1bWVudCA9IF9fd19wZGZqc19yZXF1aXJlX18oOSk7CisKK3ZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7CisKK2NsYXNzIEJhc2VQZGZNYW5hZ2VyIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VQZGZNYW5hZ2VyKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlUGRmTWFuYWdlci4iKTsKKyAgICB9CisgIH0KKworICBnZXQgZG9jSWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2RvY0lkOworICB9CisKKyAgZ2V0IHBhc3N3b3JkKCkgeworICAgIHJldHVybiB0aGlzLl9wYXNzd29yZDsKKyAgfQorCisgIGdldCBkb2NCYXNlVXJsKCkgeworICAgIGxldCBkb2NCYXNlVXJsID0gbnVsbDsKKworICAgIGlmICh0aGlzLl9kb2NCYXNlVXJsKSB7CisgICAgICBjb25zdCBhYnNvbHV0ZVVybCA9ICgwLCBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSh0aGlzLl9kb2NCYXNlVXJsKTsKKworICAgICAgaWYgKGFic29sdXRlVXJsKSB7CisgICAgICAgIGRvY0Jhc2VVcmwgPSBhYnNvbHV0ZVVybC5ocmVmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGBJbnZhbGlkIGFic29sdXRlIGRvY0Jhc2VVcmw6ICIke3RoaXMuX2RvY0Jhc2VVcmx9Ii5gKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRvY0Jhc2VVcmwiLCBkb2NCYXNlVXJsKTsKKyAgfQorCisgIG9uTG9hZGVkU3RyZWFtKCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgb25Mb2FkZWRTdHJlYW1gIGNhbGxlZCIpOworICB9CisKKyAgZW5zdXJlRG9jKHByb3AsIGFyZ3MpIHsKKyAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudCwgcHJvcCwgYXJncyk7CisgIH0KKworICBlbnN1cmVYUmVmKHByb3AsIGFyZ3MpIHsKKyAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC54cmVmLCBwcm9wLCBhcmdzKTsKKyAgfQorCisgIGVuc3VyZUNhdGFsb2cocHJvcCwgYXJncykgeworICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LmNhdGFsb2csIHByb3AsIGFyZ3MpOworICB9CisKKyAgZ2V0UGFnZShwYWdlSW5kZXgpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKHBhZ2VJbmRleCk7CisgIH0KKworICBmb250RmFsbGJhY2soaWQsIGhhbmRsZXIpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5mb250RmFsbGJhY2soaWQsIGhhbmRsZXIpOworICB9CisKKyAgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCk7CisgIH0KKworICBhc3luYyBlbnN1cmUob2JqLCBwcm9wLCBhcmdzKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBlbnN1cmVgIGNhbGxlZCIpOworICB9CisKKyAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHJlcXVlc3RSYW5nZWAgY2FsbGVkIik7CisgIH0KKworICByZXF1ZXN0TG9hZGVkU3RyZWFtKCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdExvYWRlZFN0cmVhbWAgY2FsbGVkIik7CisgIH0KKworICBzZW5kUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBzZW5kUHJvZ3Jlc3NpdmVEYXRhYCBjYWxsZWQiKTsKKyAgfQorCisgIHVwZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKSB7CisgICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgfQorCisgIHRlcm1pbmF0ZShyZWFzb24pIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHRlcm1pbmF0ZWAgY2FsbGVkIik7CisgIH0KKworfQorCitjbGFzcyBMb2NhbFBkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7CisgIGNvbnN0cnVjdG9yKGRvY0lkLCBkYXRhLCBwYXNzd29yZCwgZXZhbHVhdG9yT3B0aW9ucywgZG9jQmFzZVVybCkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5fZG9jSWQgPSBkb2NJZDsKKyAgICB0aGlzLl9wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIHRoaXMuX2RvY0Jhc2VVcmwgPSBkb2NCYXNlVXJsOworICAgIHRoaXMuZXZhbHVhdG9yT3B0aW9ucyA9IGV2YWx1YXRvck9wdGlvbnM7CisgICAgY29uc3Qgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyZWFtKGRhdGEpOworICAgIHRoaXMucGRmRG9jdW1lbnQgPSBuZXcgX2RvY3VtZW50LlBERkRvY3VtZW50KHRoaXMsIHN0cmVhbSk7CisgICAgdGhpcy5fbG9hZGVkU3RyZWFtUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShzdHJlYW0pOworICB9CisKKyAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgeworICAgIGNvbnN0IHZhbHVlID0gb2JqW3Byb3BdOworCisgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikgeworICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KG9iaiwgYXJncyk7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKKyAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CisgIH0KKworICByZXF1ZXN0TG9hZGVkU3RyZWFtKCkge30KKworICBvbkxvYWRlZFN0cmVhbSgpIHsKKyAgICByZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtUHJvbWlzZTsKKyAgfQorCisgIHRlcm1pbmF0ZShyZWFzb24pIHt9CisKK30KKworZXhwb3J0cy5Mb2NhbFBkZk1hbmFnZXIgPSBMb2NhbFBkZk1hbmFnZXI7CisKK2NsYXNzIE5ldHdvcmtQZGZNYW5hZ2VyIGV4dGVuZHMgQmFzZVBkZk1hbmFnZXIgeworICBjb25zdHJ1Y3Rvcihkb2NJZCwgcGRmTmV0d29ya1N0cmVhbSwgYXJncywgZXZhbHVhdG9yT3B0aW9ucywgZG9jQmFzZVVybCkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5fZG9jSWQgPSBkb2NJZDsKKyAgICB0aGlzLl9wYXNzd29yZCA9IGFyZ3MucGFzc3dvcmQ7CisgICAgdGhpcy5fZG9jQmFzZVVybCA9IGRvY0Jhc2VVcmw7CisgICAgdGhpcy5tc2dIYW5kbGVyID0gYXJncy5tc2dIYW5kbGVyOworICAgIHRoaXMuZXZhbHVhdG9yT3B0aW9ucyA9IGV2YWx1YXRvck9wdGlvbnM7CisgICAgdGhpcy5zdHJlYW1NYW5hZ2VyID0gbmV3IF9jaHVua2VkX3N0cmVhbS5DaHVua2VkU3RyZWFtTWFuYWdlcihwZGZOZXR3b3JrU3RyZWFtLCB7CisgICAgICBtc2dIYW5kbGVyOiBhcmdzLm1zZ0hhbmRsZXIsCisgICAgICBsZW5ndGg6IGFyZ3MubGVuZ3RoLAorICAgICAgZGlzYWJsZUF1dG9GZXRjaDogYXJncy5kaXNhYmxlQXV0b0ZldGNoLAorICAgICAgcmFuZ2VDaHVua1NpemU6IGFyZ3MucmFuZ2VDaHVua1NpemUKKyAgICB9KTsKKyAgICB0aGlzLnBkZkRvY3VtZW50ID0gbmV3IF9kb2N1bWVudC5QREZEb2N1bWVudCh0aGlzLCB0aGlzLnN0cmVhbU1hbmFnZXIuZ2V0U3RyZWFtKCkpOworICB9CisKKyAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgeworICAgIHRyeSB7CisgICAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTsKKworICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikgeworICAgICAgICByZXR1cm4gdmFsdWUuYXBwbHkob2JqLCBhcmdzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0UmFuZ2UoZXguYmVnaW4sIGV4LmVuZCk7CisgICAgICByZXR1cm4gdGhpcy5lbnN1cmUob2JqLCBwcm9wLCBhcmdzKTsKKyAgICB9CisgIH0KKworICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkgeworICAgIHJldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpOworICB9CisKKyAgcmVxdWVzdExvYWRlZFN0cmVhbSgpIHsKKyAgICB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdEFsbENodW5rcygpOworICB9CisKKyAgc2VuZFByb2dyZXNzaXZlRGF0YShjaHVuaykgeworICAgIHRoaXMuc3RyZWFtTWFuYWdlci5vblJlY2VpdmVEYXRhKHsKKyAgICAgIGNodW5rCisgICAgfSk7CisgIH0KKworICBvbkxvYWRlZFN0cmVhbSgpIHsKKyAgICByZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLm9uTG9hZGVkU3RyZWFtKCk7CisgIH0KKworICB0ZXJtaW5hdGUocmVhc29uKSB7CisgICAgdGhpcy5zdHJlYW1NYW5hZ2VyLmFib3J0KHJlYXNvbik7CisgIH0KKworfQorCitleHBvcnRzLk5ldHdvcmtQZGZNYW5hZ2VyID0gTmV0d29ya1BkZk1hbmFnZXI7CisKKy8qKiovIH0pLAorLyogNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNodW5rZWRTdHJlYW1NYW5hZ2VyID0gZXhwb3J0cy5DaHVua2VkU3RyZWFtID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworCitjbGFzcyBDaHVua2VkU3RyZWFtIHsKKyAgY29uc3RydWN0b3IobGVuZ3RoLCBjaHVua1NpemUsIG1hbmFnZXIpIHsKKyAgICB0aGlzLmJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKKyAgICB0aGlzLnN0YXJ0ID0gMDsKKyAgICB0aGlzLnBvcyA9IDA7CisgICAgdGhpcy5lbmQgPSBsZW5ndGg7CisgICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7CisgICAgdGhpcy5fbG9hZGVkQ2h1bmtzID0gbmV3IFNldCgpOworICAgIHRoaXMubnVtQ2h1bmtzID0gTWF0aC5jZWlsKGxlbmd0aCAvIGNodW5rU2l6ZSk7CisgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IDA7CisgICAgdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayA9IC0xOworICB9CisKKyAgZ2V0TWlzc2luZ0NodW5rcygpIHsKKyAgICBjb25zdCBjaHVua3MgPSBbXTsKKworICAgIGZvciAobGV0IGNodW5rID0gMCwgbiA9IHRoaXMubnVtQ2h1bmtzOyBjaHVuayA8IG47ICsrY2h1bmspIHsKKyAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKKyAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjaHVua3M7CisgIH0KKworICBnZXRCYXNlU3RyZWFtcygpIHsKKyAgICByZXR1cm4gW3RoaXNdOworICB9CisKKyAgZ2V0IG51bUNodW5rc0xvYWRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5fbG9hZGVkQ2h1bmtzLnNpemU7CisgIH0KKworICBhbGxDaHVua3NMb2FkZWQoKSB7CisgICAgcmV0dXJuIHRoaXMubnVtQ2h1bmtzTG9hZGVkID09PSB0aGlzLm51bUNodW5rczsKKyAgfQorCisgIG9uUmVjZWl2ZURhdGEoYmVnaW4sIGNodW5rKSB7CisgICAgY29uc3QgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemU7CisKKyAgICBpZiAoYmVnaW4gJSBjaHVua1NpemUgIT09IDApIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIGJlZ2luIG9mZnNldDogJHtiZWdpbn1gKTsKKyAgICB9CisKKyAgICBjb25zdCBlbmQgPSBiZWdpbiArIGNodW5rLmJ5dGVMZW5ndGg7CisKKyAgICBpZiAoZW5kICUgY2h1bmtTaXplICE9PSAwICYmIGVuZCAhPT0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIGVuZCBvZmZzZXQ6ICR7ZW5kfWApOworICAgIH0KKworICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgYmVnaW4pOworICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTsKKyAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gY2h1bmtTaXplKSArIDE7CisKKyAgICBmb3IgKGxldCBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHsKKyAgICAgIHRoaXMuX2xvYWRlZENodW5rcy5hZGQoY3VyQ2h1bmspOworICAgIH0KKyAgfQorCisgIG9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YShkYXRhKSB7CisgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg7CisgICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CisgICAgdGhpcy5ieXRlcy5zZXQobmV3IFVpbnQ4QXJyYXkoZGF0YSksIHBvc2l0aW9uKTsKKyAgICBwb3NpdGlvbiArPSBkYXRhLmJ5dGVMZW5ndGg7CisgICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBwb3NpdGlvbjsKKyAgICBjb25zdCBlbmRDaHVuayA9IHBvc2l0aW9uID49IHRoaXMuZW5kID8gdGhpcy5udW1DaHVua3MgOiBNYXRoLmZsb29yKHBvc2l0aW9uIC8gdGhpcy5jaHVua1NpemUpOworCisgICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CisgICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTsKKyAgICB9CisgIH0KKworICBlbnN1cmVCeXRlKHBvcykgeworICAgIGlmIChwb3MgPCB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNodW5rID0gTWF0aC5mbG9vcihwb3MgLyB0aGlzLmNodW5rU2l6ZSk7CisKKyAgICBpZiAoY2h1bmsgPT09IHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmspIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CisgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24ocG9zLCBwb3MgKyAxKTsKKyAgICB9CisKKyAgICB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rID0gY2h1bms7CisgIH0KKworICBlbnN1cmVSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgaWYgKGJlZ2luID49IGVuZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlbmQgPD0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZTsKKyAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihiZWdpbiAvIGNodW5rU2l6ZSk7CisgICAgY29uc3QgZW5kQ2h1bmsgPSBNYXRoLmZsb29yKChlbmQgLSAxKSAvIGNodW5rU2l6ZSkgKyAxOworCisgICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7CisgICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CisgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbihiZWdpbiwgZW5kKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBuZXh0RW1wdHlDaHVuayhiZWdpbkNodW5rKSB7CisgICAgY29uc3QgbnVtQ2h1bmtzID0gdGhpcy5udW1DaHVua3M7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNodW5rczsgKytpKSB7CisgICAgICBjb25zdCBjaHVuayA9IChiZWdpbkNodW5rICsgaSkgJSBudW1DaHVua3M7CisKKyAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKKyAgICAgICAgcmV0dXJuIGNodW5rOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgaGFzQ2h1bmsoY2h1bmspIHsKKyAgICByZXR1cm4gdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuayk7CisgIH0KKworICBnZXQgbGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7CisgIH0KKworICBnZXQgaXNFbXB0eSgpIHsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7CisgIH0KKworICBnZXRCeXRlKCkgeworICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOworCisgICAgaWYgKHBvcyA+PSB0aGlzLmVuZCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChwb3MgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgIHRoaXMuZW5zdXJlQnl0ZShwb3MpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdOworICB9CisKKyAgZ2V0VWludDE2KCkgeworICAgIGNvbnN0IGIwID0gdGhpcy5nZXRCeXRlKCk7CisgICAgY29uc3QgYjEgPSB0aGlzLmdldEJ5dGUoKTsKKworICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxOworICB9CisKKyAgZ2V0SW50MzIoKSB7CisgICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICBjb25zdCBiMSA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgIGNvbnN0IGIyID0gdGhpcy5nZXRCeXRlKCk7CisgICAgY29uc3QgYjMgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKKyAgfQorCisgIGdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkID0gZmFsc2UpIHsKKyAgICBjb25zdCBieXRlcyA9IHRoaXMuYnl0ZXM7CisgICAgY29uc3QgcG9zID0gdGhpcy5wb3M7CisgICAgY29uc3Qgc3RyRW5kID0gdGhpcy5lbmQ7CisKKyAgICBpZiAoIWxlbmd0aCkgeworICAgICAgaWYgKHN0ckVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlUmFuZ2UocG9zLCBzdHJFbmQpOworICAgICAgfQorCisgICAgICBjb25zdCBzdWJhcnJheSA9IGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTsKKyAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7CisgICAgfQorCisgICAgbGV0IGVuZCA9IHBvcyArIGxlbmd0aDsKKworICAgIGlmIChlbmQgPiBzdHJFbmQpIHsKKyAgICAgIGVuZCA9IHN0ckVuZDsKKyAgICB9CisKKyAgICBpZiAoZW5kID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgIHRoaXMuZW5zdXJlUmFuZ2UocG9zLCBlbmQpOworICAgIH0KKworICAgIHRoaXMucG9zID0gZW5kOworICAgIGNvbnN0IHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpOworICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7CisgIH0KKworICBwZWVrQnl0ZSgpIHsKKyAgICBjb25zdCBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7CisKKyAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKKyAgICAgIHRoaXMucG9zLS07CisgICAgfQorCisgICAgcmV0dXJuIHBlZWtlZEJ5dGU7CisgIH0KKworICBwZWVrQnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkgeworICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7CisgICAgdGhpcy5wb3MgLT0gYnl0ZXMubGVuZ3RoOworICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgaWYgKGJlZ2luIDwgMCkgeworICAgICAgYmVnaW4gPSAwOworICAgIH0KKworICAgIGlmIChlbmQgPiB0aGlzLmVuZCkgeworICAgICAgZW5kID0gdGhpcy5lbmQ7CisgICAgfQorCisgICAgaWYgKGVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICB0aGlzLmVuc3VyZVJhbmdlKGJlZ2luLCBlbmQpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KGJlZ2luLCBlbmQpOworICB9CisKKyAgc2tpcChuKSB7CisgICAgaWYgKCFuKSB7CisgICAgICBuID0gMTsKKyAgICB9CisKKyAgICB0aGlzLnBvcyArPSBuOworICB9CisKKyAgcmVzZXQoKSB7CisgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0OworICB9CisKKyAgbW92ZVN0YXJ0KCkgeworICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKKyAgfQorCisgIG1ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCkgeworICAgIGlmIChsZW5ndGgpIHsKKyAgICAgIGlmIChzdGFydCArIGxlbmd0aCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHN0YXJ0ID49IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlQnl0ZShzdGFydCk7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbSgpIHt9CisKKyAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CisKKyAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5nZXRNaXNzaW5nQ2h1bmtzID0gZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemU7CisgICAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcih0aGlzLnN0YXJ0IC8gY2h1bmtTaXplKTsKKyAgICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5mbG9vcigodGhpcy5lbmQgLSAxKSAvIGNodW5rU2l6ZSkgKyAxOworICAgICAgY29uc3QgbWlzc2luZ0NodW5rcyA9IFtdOworCisgICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKKyAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgeworICAgICAgICAgIG1pc3NpbmdDaHVua3MucHVzaChjaHVuayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1pc3NpbmdDaHVua3M7CisgICAgfTsKKworICAgIENodW5rZWRTdHJlYW1TdWJzdHJlYW0ucHJvdG90eXBlLmFsbENodW5rc0xvYWRlZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3MpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmdldE1pc3NpbmdDaHVua3MoKS5sZW5ndGggPT09IDA7CisgICAgfTsKKworICAgIGNvbnN0IHN1YlN0cmVhbSA9IG5ldyBDaHVua2VkU3RyZWFtU3Vic3RyZWFtKCk7CisgICAgc3ViU3RyZWFtLnBvcyA9IHN1YlN0cmVhbS5zdGFydCA9IHN0YXJ0OworICAgIHN1YlN0cmVhbS5lbmQgPSBzdGFydCArIGxlbmd0aCB8fCB0aGlzLmVuZDsKKyAgICBzdWJTdHJlYW0uZGljdCA9IGRpY3Q7CisgICAgcmV0dXJuIHN1YlN0cmVhbTsKKyAgfQorCit9CisKK2V4cG9ydHMuQ2h1bmtlZFN0cmVhbSA9IENodW5rZWRTdHJlYW07CisKK2NsYXNzIENodW5rZWRTdHJlYW1NYW5hZ2VyIHsKKyAgY29uc3RydWN0b3IocGRmTmV0d29ya1N0cmVhbSwgYXJncykgeworICAgIHRoaXMubGVuZ3RoID0gYXJncy5sZW5ndGg7CisgICAgdGhpcy5jaHVua1NpemUgPSBhcmdzLnJhbmdlQ2h1bmtTaXplOworICAgIHRoaXMuc3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW0odGhpcy5sZW5ndGgsIHRoaXMuY2h1bmtTaXplLCB0aGlzKTsKKyAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0gPSBwZGZOZXR3b3JrU3RyZWFtOworICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaCA9IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaDsKKyAgICB0aGlzLm1zZ0hhbmRsZXIgPSBhcmdzLm1zZ0hhbmRsZXI7CisgICAgdGhpcy5jdXJyUmVxdWVzdElkID0gMDsKKyAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QgPSBuZXcgTWFwKCk7CisgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rID0gbmV3IE1hcCgpOworICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0ID0gbmV3IE1hcCgpOworICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gMDsKKyAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICB9CisKKyAgb25Mb2FkZWRTdHJlYW0oKSB7CisgICAgcmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIHNlbmRSZXF1ZXN0KGJlZ2luLCBlbmQpIHsKKyAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMucGRmTmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKTsKKworICAgIGlmICghcmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKKyAgICAgIHJhbmdlUmVhZGVyLm9uUHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzKTsKKyAgICB9CisKKyAgICBsZXQgY2h1bmtzID0gW10sCisgICAgICAgIGxvYWRlZCA9IDA7CisgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKKyAgICAgIGNvbnN0IHJlYWRDaHVuayA9IGNodW5rID0+IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoIWNodW5rLmRvbmUpIHsKKyAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjaHVuay52YWx1ZTsKKyAgICAgICAgICAgIGNodW5rcy5wdXNoKGRhdGEpOworICAgICAgICAgICAgbG9hZGVkICs9ICgwLCBfdXRpbC5hcnJheUJ5dGVMZW5ndGgpKGRhdGEpOworCisgICAgICAgICAgICBpZiAocmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzKHsKKyAgICAgICAgICAgICAgICBsb2FkZWQKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBjaHVua0RhdGEgPSAoMCwgX3V0aWwuYXJyYXlzVG9CeXRlcykoY2h1bmtzKTsKKyAgICAgICAgICBjaHVua3MgPSBudWxsOworICAgICAgICAgIHJlc29sdmUoY2h1bmtEYXRhKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgIHJlamVjdChlKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOworICAgIH0pOworICAgIHByb21pc2UudGhlbihkYXRhID0+IHsKKyAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLm9uUmVjZWl2ZURhdGEoeworICAgICAgICBjaHVuazogZGF0YSwKKyAgICAgICAgYmVnaW4KKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgcmVxdWVzdEFsbENodW5rcygpIHsKKyAgICBjb25zdCBtaXNzaW5nQ2h1bmtzID0gdGhpcy5zdHJlYW0uZ2V0TWlzc2luZ0NodW5rcygpOworCisgICAgdGhpcy5fcmVxdWVzdENodW5rcyhtaXNzaW5nQ2h1bmtzKTsKKworICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBfcmVxdWVzdENodW5rcyhjaHVua3MpIHsKKyAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmN1cnJSZXF1ZXN0SWQrKzsKKyAgICBjb25zdCBjaHVua3NOZWVkZWQgPSBuZXcgU2V0KCk7CisKKyAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2h1bmtzTmVlZGVkKTsKKworICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7CisgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGNodW5rKSkgeworICAgICAgICBjaHVua3NOZWVkZWQuYWRkKGNodW5rKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2h1bmtzTmVlZGVkLnNpemUgPT09IDApIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICBjb25zdCBjYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2FwYWJpbGl0eSk7CisKKyAgICBjb25zdCBjaHVua3NUb1JlcXVlc3QgPSBbXTsKKworICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzTmVlZGVkKSB7CisgICAgICBsZXQgcmVxdWVzdElkcyA9IHRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoY2h1bmspOworCisgICAgICBpZiAoIXJlcXVlc3RJZHMpIHsKKyAgICAgICAgcmVxdWVzdElkcyA9IFtdOworCisgICAgICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zZXQoY2h1bmssIHJlcXVlc3RJZHMpOworCisgICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTsKKyAgICAgIH0KKworICAgICAgcmVxdWVzdElkcy5wdXNoKHJlcXVlc3RJZCk7CisgICAgfQorCisgICAgaWYgKGNodW5rc1RvUmVxdWVzdC5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCBncm91cGVkQ2h1bmtzVG9SZXF1ZXN0ID0gdGhpcy5ncm91cENodW5rcyhjaHVua3NUb1JlcXVlc3QpOworCisgICAgICBmb3IgKGNvbnN0IGdyb3VwZWRDaHVuayBvZiBncm91cGVkQ2h1bmtzVG9SZXF1ZXN0KSB7CisgICAgICAgIGNvbnN0IGJlZ2luID0gZ3JvdXBlZENodW5rLmJlZ2luQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZTsKKyAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oZ3JvdXBlZENodW5rLmVuZENodW5rICogdGhpcy5jaHVua1NpemUsIHRoaXMubGVuZ3RoKTsKKyAgICAgICAgdGhpcy5zZW5kUmVxdWVzdChiZWdpbiwgZW5kKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBpZiAodGhpcy5hYm9ydGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhyb3cgcmVhc29uOworICAgIH0pOworICB9CisKKyAgZ2V0U3RyZWFtKCkgeworICAgIHJldHVybiB0aGlzLnN0cmVhbTsKKyAgfQorCisgIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgZW5kID0gTWF0aC5taW4oZW5kLCB0aGlzLmxlbmd0aCk7CisgICAgY29uc3QgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhiZWdpbik7CisgICAgY29uc3QgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKGVuZCk7CisgICAgY29uc3QgY2h1bmtzID0gW107CisKKyAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKKyAgICAgIGNodW5rcy5wdXNoKGNodW5rKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3MpOworICB9CisKKyAgcmVxdWVzdFJhbmdlcyhyYW5nZXMgPSBbXSkgeworICAgIGNvbnN0IGNodW5rc1RvUmVxdWVzdCA9IFtdOworCisgICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHsKKyAgICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsocmFuZ2UuYmVnaW4pOworICAgICAgY29uc3QgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKHJhbmdlLmVuZCk7CisKKyAgICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgeworICAgICAgICBpZiAoIWNodW5rc1RvUmVxdWVzdC5pbmNsdWRlcyhjaHVuaykpIHsKKyAgICAgICAgICBjaHVua3NUb1JlcXVlc3QucHVzaChjaHVuayk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjaHVua3NUb1JlcXVlc3Quc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgcmV0dXJuIGEgLSBiOworICAgIH0pOworICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rc1RvUmVxdWVzdCk7CisgIH0KKworICBncm91cENodW5rcyhjaHVua3MpIHsKKyAgICBjb25zdCBncm91cGVkQ2h1bmtzID0gW107CisgICAgbGV0IGJlZ2luQ2h1bmsgPSAtMTsKKyAgICBsZXQgcHJldkNodW5rID0gLTE7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaV07CisKKyAgICAgIGlmIChiZWdpbkNodW5rIDwgMCkgeworICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7CisgICAgICB9CisKKyAgICAgIGlmIChwcmV2Q2h1bmsgPj0gMCAmJiBwcmV2Q2h1bmsgKyAxICE9PSBjaHVuaykgeworICAgICAgICBncm91cGVkQ2h1bmtzLnB1c2goeworICAgICAgICAgIGJlZ2luQ2h1bmssCisgICAgICAgICAgZW5kQ2h1bms6IHByZXZDaHVuayArIDEKKyAgICAgICAgfSk7CisgICAgICAgIGJlZ2luQ2h1bmsgPSBjaHVuazsKKyAgICAgIH0KKworICAgICAgaWYgKGkgKyAxID09PSBjaHVua3MubGVuZ3RoKSB7CisgICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7CisgICAgICAgICAgYmVnaW5DaHVuaywKKyAgICAgICAgICBlbmRDaHVuazogY2h1bmsgKyAxCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBwcmV2Q2h1bmsgPSBjaHVuazsKKyAgICB9CisKKyAgICByZXR1cm4gZ3JvdXBlZENodW5rczsKKyAgfQorCisgIG9uUHJvZ3Jlc3MoYXJncykgeworICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKKyAgICAgIGxvYWRlZDogdGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkICogdGhpcy5jaHVua1NpemUgKyBhcmdzLmxvYWRlZCwKKyAgICAgIHRvdGFsOiB0aGlzLmxlbmd0aAorICAgIH0pOworICB9CisKKyAgb25SZWNlaXZlRGF0YShhcmdzKSB7CisgICAgY29uc3QgY2h1bmsgPSBhcmdzLmNodW5rOworICAgIGNvbnN0IGlzUHJvZ3Jlc3NpdmUgPSBhcmdzLmJlZ2luID09PSB1bmRlZmluZWQ7CisgICAgY29uc3QgYmVnaW4gPSBpc1Byb2dyZXNzaXZlID8gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggOiBhcmdzLmJlZ2luOworICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgY2h1bmsuYnl0ZUxlbmd0aDsKKyAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihiZWdpbiAvIHRoaXMuY2h1bmtTaXplKTsKKyAgICBjb25zdCBlbmRDaHVuayA9IGVuZCA8IHRoaXMubGVuZ3RoID8gTWF0aC5mbG9vcihlbmQgLyB0aGlzLmNodW5rU2l6ZSkgOiBNYXRoLmNlaWwoZW5kIC8gdGhpcy5jaHVua1NpemUpOworCisgICAgaWYgKGlzUHJvZ3Jlc3NpdmUpIHsKKyAgICAgIHRoaXMuc3RyZWFtLm9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YShjaHVuayk7CisgICAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IGVuZDsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlRGF0YShiZWdpbiwgY2h1bmspOworICAgIH0KKworICAgIGlmICh0aGlzLnN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSkgeworICAgICAgdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5yZXNvbHZlKHRoaXMuc3RyZWFtKTsKKyAgICB9CisKKyAgICBjb25zdCBsb2FkZWRSZXF1ZXN0cyA9IFtdOworCisgICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CisgICAgICBjb25zdCByZXF1ZXN0SWRzID0gdGhpcy5fcmVxdWVzdHNCeUNodW5rLmdldChjdXJDaHVuayk7CisKKyAgICAgIGlmICghcmVxdWVzdElkcykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rLmRlbGV0ZShjdXJDaHVuayk7CisKKyAgICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIHJlcXVlc3RJZHMpIHsKKyAgICAgICAgY29uc3QgY2h1bmtzTmVlZGVkID0gdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0LmdldChyZXF1ZXN0SWQpOworCisgICAgICAgIGlmIChjaHVua3NOZWVkZWQuaGFzKGN1ckNodW5rKSkgeworICAgICAgICAgIGNodW5rc05lZWRlZC5kZWxldGUoY3VyQ2h1bmspOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNodW5rc05lZWRlZC5zaXplID4gMCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbG9hZGVkUmVxdWVzdHMucHVzaChyZXF1ZXN0SWQpOworICAgICAgfQorICAgIH0KKworICAgIGlmICghdGhpcy5kaXNhYmxlQXV0b0ZldGNoICYmIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zaXplID09PSAwKSB7CisgICAgICBsZXQgbmV4dEVtcHR5Q2h1bms7CisKKyAgICAgIGlmICh0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgPT09IDEpIHsKKyAgICAgICAgY29uc3QgbGFzdENodW5rID0gdGhpcy5zdHJlYW0ubnVtQ2h1bmtzIC0gMTsKKworICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHsKKyAgICAgICAgICBuZXh0RW1wdHlDaHVuayA9IGxhc3RDaHVuazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dEVtcHR5Q2h1bmsgPSB0aGlzLnN0cmVhbS5uZXh0RW1wdHlDaHVuayhlbmRDaHVuayk7CisgICAgICB9CisKKyAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG5leHRFbXB0eUNodW5rKSkgeworICAgICAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKFtuZXh0RW1wdHlDaHVua10pOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIGxvYWRlZFJlcXVlc3RzKSB7CisgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CisKKyAgICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShyZXF1ZXN0SWQpOworCisgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICB9CisKKyAgICB0aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLCB7CisgICAgICBsb2FkZWQ6IHRoaXMuc3RyZWFtLm51bUNodW5rc0xvYWRlZCAqIHRoaXMuY2h1bmtTaXplLAorICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCisgICAgfSk7CisgIH0KKworICBvbkVycm9yKGVycikgeworICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7CisgIH0KKworICBnZXRCZWdpbkNodW5rKGJlZ2luKSB7CisgICAgcmV0dXJuIE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CisgIH0KKworICBnZXRFbmRDaHVuayhlbmQpIHsKKyAgICByZXR1cm4gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyB0aGlzLmNodW5rU2l6ZSkgKyAxOworICB9CisKKyAgYWJvcnQocmVhc29uKSB7CisgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKKworICAgIGlmICh0aGlzLnBkZk5ldHdvcmtTdHJlYW0pIHsKKyAgICAgIHRoaXMucGRmTmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pOworICAgIH0KKworICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSkgeworICAgICAgY2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLkNodW5rZWRTdHJlYW1NYW5hZ2VyID0gQ2h1bmtlZFN0cmVhbU1hbmFnZXI7CisKKy8qKiovIH0pLAorLyogOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldExvb2t1cFRhYmxlRmFjdG9yeSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeTsKK2V4cG9ydHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSA9IGdldEluaGVyaXRhYmxlUHJvcGVydHk7CitleHBvcnRzLnRvUm9tYW5OdW1lcmFscyA9IHRvUm9tYW5OdW1lcmFsczsKK2V4cG9ydHMubG9nMiA9IGxvZzI7CitleHBvcnRzLnJlYWRJbnQ4ID0gcmVhZEludDg7CitleHBvcnRzLnJlYWRVaW50MTYgPSByZWFkVWludDE2OworZXhwb3J0cy5yZWFkVWludDMyID0gcmVhZFVpbnQzMjsKK2V4cG9ydHMuaXNXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlOworZXhwb3J0cy5YUmVmUGFyc2VFeGNlcHRpb24gPSBleHBvcnRzLlhSZWZFbnRyeUV4Y2VwdGlvbiA9IGV4cG9ydHMuTWlzc2luZ0RhdGFFeGNlcHRpb24gPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK2Z1bmN0aW9uIGdldExvb2t1cFRhYmxlRmFjdG9yeShpbml0aWFsaXplcikgeworICBsZXQgbG9va3VwOworICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIGlmIChpbml0aWFsaXplcikgeworICAgICAgbG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIGluaXRpYWxpemVyKGxvb2t1cCk7CisgICAgICBpbml0aWFsaXplciA9IG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIGxvb2t1cDsKKyAgfTsKK30KKworY2xhc3MgTWlzc2luZ0RhdGFFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCkgeworICAgIHN1cGVyKGBNaXNzaW5nIGRhdGEgWyR7YmVnaW59LCAke2VuZH0pYCk7CisgICAgdGhpcy5iZWdpbiA9IGJlZ2luOworICAgIHRoaXMuZW5kID0gZW5kOworICB9CisKK30KKworZXhwb3J0cy5NaXNzaW5nRGF0YUV4Y2VwdGlvbiA9IE1pc3NpbmdEYXRhRXhjZXB0aW9uOworCitjbGFzcyBYUmVmRW50cnlFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuWFJlZkVudHJ5RXhjZXB0aW9uID0gWFJlZkVudHJ5RXhjZXB0aW9uOworCitjbGFzcyBYUmVmUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuWFJlZlBhcnNlRXhjZXB0aW9uID0gWFJlZlBhcnNlRXhjZXB0aW9uOworCitmdW5jdGlvbiBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKKyAgZGljdCwKKyAga2V5LAorICBnZXRBcnJheSA9IGZhbHNlLAorICBzdG9wV2hlbkZvdW5kID0gdHJ1ZQorfSkgeworICBjb25zdCBMT09QX0xJTUlUID0gMTAwOworICBsZXQgbG9vcENvdW50ID0gMDsKKyAgbGV0IHZhbHVlczsKKworICB3aGlsZSAoZGljdCkgeworICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpOworCisgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGlmIChzdG9wV2hlbkZvdW5kKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCF2YWx1ZXMpIHsKKyAgICAgICAgdmFsdWVzID0gW107CisgICAgICB9CisKKyAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAoKytsb29wQ291bnQgPiBMT09QX0xJTUlUKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoYGdldEluaGVyaXRhYmxlUHJvcGVydHk6IG1heGltdW0gbG9vcCBjb3VudCBleGNlZWRlZCBmb3IgIiR7a2V5fSJgKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRpY3QgPSBkaWN0LmdldCgiUGFyZW50Iik7CisgIH0KKworICByZXR1cm4gdmFsdWVzOworfQorCitjb25zdCBST01BTl9OVU1CRVJfTUFQID0gWyIiLCAiQyIsICJDQyIsICJDQ0MiLCAiQ0QiLCAiRCIsICJEQyIsICJEQ0MiLCAiRENDQyIsICJDTSIsICIiLCAiWCIsICJYWCIsICJYWFgiLCAiWEwiLCAiTCIsICJMWCIsICJMWFgiLCAiTFhYWCIsICJYQyIsICIiLCAiSSIsICJJSSIsICJJSUkiLCAiSVYiLCAiViIsICJWSSIsICJWSUkiLCAiVklJSSIsICJJWCJdOworCitmdW5jdGlvbiB0b1JvbWFuTnVtZXJhbHMobnVtYmVyLCBsb3dlckNhc2UgPSBmYWxzZSkgeworICAoMCwgX3V0aWwuYXNzZXJ0KShOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcikgJiYgbnVtYmVyID4gMCwgIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4iKTsKKyAgY29uc3Qgcm9tYW5CdWYgPSBbXTsKKyAgbGV0IHBvczsKKworICB3aGlsZSAobnVtYmVyID49IDEwMDApIHsKKyAgICBudW1iZXIgLT0gMTAwMDsKKyAgICByb21hbkJ1Zi5wdXNoKCJNIik7CisgIH0KKworICBwb3MgPSBudW1iZXIgLyAxMDAgfCAwOworICBudW1iZXIgJT0gMTAwOworICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbcG9zXSk7CisgIHBvcyA9IG51bWJlciAvIDEwIHwgMDsKKyAgbnVtYmVyICU9IDEwOworICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbMTAgKyBwb3NdKTsKKyAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyXSk7CisgIGNvbnN0IHJvbWFuU3RyID0gcm9tYW5CdWYuam9pbigiIik7CisgIHJldHVybiBsb3dlckNhc2UgPyByb21hblN0ci50b0xvd2VyQ2FzZSgpIDogcm9tYW5TdHI7Cit9CisKK2Z1bmN0aW9uIGxvZzIoeCkgeworICBpZiAoeCA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nMih4KSk7Cit9CisKK2Z1bmN0aW9uIHJlYWRJbnQ4KGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDI0ID4+IDI0OworfQorCitmdW5jdGlvbiByZWFkVWludDE2KGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDggfCBkYXRhW29mZnNldCArIDFdOworfQorCitmdW5jdGlvbiByZWFkVWludDMyKGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gKGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdKSA+Pj4gMDsKK30KKworZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CisgIHJldHVybiBjaCA9PT0gMHgyMCB8fCBjaCA9PT0gMHgwOSB8fCBjaCA9PT0gMHgwZCB8fCBjaCA9PT0gMHgwYTsKK30KKworLyoqKi8gfSksCisvKiA5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGRG9jdW1lbnQgPSBleHBvcnRzLlBhZ2UgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfb2JqID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7CisKK3ZhciBfYW5ub3RhdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpOworCit2YXIgX2NyeXB0byA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOworCit2YXIgX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOworCit2YXIgX29wZXJhdG9yX2xpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI2KTsKKwordmFyIF9ldmFsdWF0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKKworY29uc3QgREVGQVVMVF9VU0VSX1VOSVQgPSAxLjA7Citjb25zdCBMRVRURVJfU0laRV9NRURJQUJPWCA9IFswLCAwLCA2MTIsIDc5Ml07CisKK2Z1bmN0aW9uIGlzQW5ub3RhdGlvblJlbmRlcmFibGUoYW5ub3RhdGlvbiwgaW50ZW50KSB7CisgIHJldHVybiBpbnRlbnQgPT09ICJkaXNwbGF5IiAmJiBhbm5vdGF0aW9uLnZpZXdhYmxlIHx8IGludGVudCA9PT0gInByaW50IiAmJiBhbm5vdGF0aW9uLnByaW50YWJsZTsKK30KKworY2xhc3MgUGFnZSB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBwZGZNYW5hZ2VyLAorICAgIHhyZWYsCisgICAgcGFnZUluZGV4LAorICAgIHBhZ2VEaWN0LAorICAgIHJlZiwKKyAgICBnbG9iYWxJZEZhY3RvcnksCisgICAgZm9udENhY2hlLAorICAgIGJ1aWx0SW5DTWFwQ2FjaGUsCisgICAgZ2xvYmFsSW1hZ2VDYWNoZQorICB9KSB7CisgICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKKyAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKKyAgICB0aGlzLnBhZ2VEaWN0ID0gcGFnZURpY3Q7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLnJlZiA9IHJlZjsKKyAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKKyAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBidWlsdEluQ01hcENhY2hlOworICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IGdsb2JhbEltYWdlQ2FjaGU7CisgICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zOworICAgIHRoaXMucmVzb3VyY2VzUHJvbWlzZSA9IG51bGw7CisgICAgY29uc3QgaWRDb3VudGVycyA9IHsKKyAgICAgIG9iajogMAorICAgIH07CisgICAgdGhpcy5fbG9jYWxJZEZhY3RvcnkgPSBjbGFzcyBleHRlbmRzIGdsb2JhbElkRmFjdG9yeSB7CisgICAgICBzdGF0aWMgY3JlYXRlT2JqSWQoKSB7CisgICAgICAgIHJldHVybiBgcCR7cGFnZUluZGV4fV8keysraWRDb3VudGVycy5vYmp9YDsKKyAgICAgIH0KKworICAgIH07CisgIH0KKworICBfZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShrZXksIGdldEFycmF5ID0gZmFsc2UpIHsKKyAgICBjb25zdCB2YWx1ZSA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0OiB0aGlzLnBhZ2VEaWN0LAorICAgICAga2V5LAorICAgICAgZ2V0QXJyYXksCisgICAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQorICAgIH0pOworCisgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEgfHwgISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHZhbHVlWzBdKSkgeworICAgICAgcmV0dXJuIHZhbHVlWzBdOworICAgIH0KKworICAgIHJldHVybiBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIGRpY3RBcnJheTogdmFsdWUKKyAgICB9KTsKKyAgfQorCisgIGdldCBjb250ZW50KCkgeworICAgIHJldHVybiB0aGlzLnBhZ2VEaWN0LmdldCgiQ29udGVudHMiKTsKKyAgfQorCisgIGdldCByZXNvdXJjZXMoKSB7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJyZXNvdXJjZXMiLCB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJSZXNvdXJjZXMiKSB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5KTsKKyAgfQorCisgIF9nZXRCb3VuZGluZ0JveChuYW1lKSB7CisgICAgY29uc3QgYm94ID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShuYW1lLCB0cnVlKTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KGJveCkgJiYgYm94Lmxlbmd0aCA9PT0gNCkgeworICAgICAgaWYgKGJveFsyXSAtIGJveFswXSAhPT0gMCAmJiBib3hbM10gLSBib3hbMV0gIT09IDApIHsKKyAgICAgICAgcmV0dXJuIGJveDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBFbXB0eSAvJHtuYW1lfSBlbnRyeS5gKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGdldCBtZWRpYUJveCgpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm1lZGlhQm94IiwgdGhpcy5fZ2V0Qm91bmRpbmdCb3goIk1lZGlhQm94IikgfHwgTEVUVEVSX1NJWkVfTUVESUFCT1gpOworICB9CisKKyAgZ2V0IGNyb3BCb3goKSB7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjcm9wQm94IiwgdGhpcy5fZ2V0Qm91bmRpbmdCb3goIkNyb3BCb3giKSB8fCB0aGlzLm1lZGlhQm94KTsKKyAgfQorCisgIGdldCB1c2VyVW5pdCgpIHsKKyAgICBsZXQgb2JqID0gdGhpcy5wYWdlRGljdC5nZXQoIlVzZXJVbml0Iik7CisKKyAgICBpZiAoISgwLCBfdXRpbC5pc051bSkob2JqKSB8fCBvYmogPD0gMCkgeworICAgICAgb2JqID0gREVGQVVMVF9VU0VSX1VOSVQ7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ1c2VyVW5pdCIsIG9iaik7CisgIH0KKworICBnZXQgdmlldygpIHsKKyAgICBjb25zdCB7CisgICAgICBjcm9wQm94LAorICAgICAgbWVkaWFCb3gKKyAgICB9ID0gdGhpczsKKyAgICBsZXQgdmlldzsKKworICAgIGlmIChjcm9wQm94ID09PSBtZWRpYUJveCB8fCAoMCwgX3V0aWwuaXNBcnJheUVxdWFsKShjcm9wQm94LCBtZWRpYUJveCkpIHsKKyAgICAgIHZpZXcgPSBtZWRpYUJveDsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgYm94ID0gX3V0aWwuVXRpbC5pbnRlcnNlY3QoY3JvcEJveCwgbWVkaWFCb3gpOworCisgICAgICBpZiAoYm94ICYmIGJveFsyXSAtIGJveFswXSAhPT0gMCAmJiBib3hbM10gLSBib3hbMV0gIT09IDApIHsKKyAgICAgICAgdmlldyA9IGJveDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRW1wdHkgL0Nyb3BCb3ggYW5kIC9NZWRpYUJveCBpbnRlcnNlY3Rpb24uIik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ2aWV3IiwgdmlldyB8fCBtZWRpYUJveCk7CisgIH0KKworICBnZXQgcm90YXRlKCkgeworICAgIGxldCByb3RhdGUgPSB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJSb3RhdGUiKSB8fCAwOworCisgICAgaWYgKHJvdGF0ZSAlIDkwICE9PSAwKSB7CisgICAgICByb3RhdGUgPSAwOworICAgIH0gZWxzZSBpZiAocm90YXRlID49IDM2MCkgeworICAgICAgcm90YXRlID0gcm90YXRlICUgMzYwOworICAgIH0gZWxzZSBpZiAocm90YXRlIDwgMCkgeworICAgICAgcm90YXRlID0gKHJvdGF0ZSAlIDM2MCArIDM2MCkgJSAzNjA7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJyb3RhdGUiLCByb3RhdGUpOworICB9CisKKyAgZ2V0Q29udGVudFN0cmVhbSgpIHsKKyAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50OworICAgIGxldCBzdHJlYW07CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkgeworICAgICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKKyAgICAgIGNvbnN0IHN0cmVhbXMgPSBbXTsKKworICAgICAgZm9yIChjb25zdCBzdWJTdHJlYW0gb2YgY29udGVudCkgeworICAgICAgICBzdHJlYW1zLnB1c2goeHJlZi5mZXRjaElmUmVmKHN1YlN0cmVhbSkpOworICAgICAgfQorCisgICAgICBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJlYW1zU2VxdWVuY2VTdHJlYW0oc3RyZWFtcyk7CisgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGNvbnRlbnQpKSB7CisgICAgICBzdHJlYW0gPSBjb250ZW50OworICAgIH0gZWxzZSB7CisgICAgICBzdHJlYW0gPSBuZXcgX3N0cmVhbS5OdWxsU3RyZWFtKCk7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmVhbTsKKyAgfQorCisgIHNhdmUoaGFuZGxlciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IF9ldmFsdWF0b3IuUGFydGlhbEV2YWx1YXRvcih7CisgICAgICB4cmVmOiB0aGlzLnhyZWYsCisgICAgICBoYW5kbGVyLAorICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKKyAgICAgIGlkRmFjdG9yeTogdGhpcy5fbG9jYWxJZEZhY3RvcnksCisgICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAorICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAorICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAorICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCisgICAgfSk7CisgICAgcmV0dXJuIHRoaXMuX3BhcnNlZEFubm90YXRpb25zLnRoZW4oZnVuY3Rpb24gKGFubm90YXRpb25zKSB7CisgICAgICBjb25zdCBuZXdSZWZzUHJvbWlzZXMgPSBbXTsKKworICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CisgICAgICAgIGlmICghaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uLCAicHJpbnQiKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbmV3UmVmc1Byb21pc2VzLnB1c2goYW5ub3RhdGlvbi5zYXZlKHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJzYXZlIC0gaWdub3JpbmcgYW5ub3RhdGlvbiBkYXRhIGR1cmluZyAiICsgYCIke3Rhc2submFtZX0iIHRhc2s6ICIke3JlYXNvbn0iLmApOworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBQcm9taXNlLmFsbChuZXdSZWZzUHJvbWlzZXMpOworICAgIH0pOworICB9CisKKyAgbG9hZFJlc291cmNlcyhrZXlzKSB7CisgICAgaWYgKCF0aGlzLnJlc291cmNlc1Byb21pc2UpIHsKKyAgICAgIHRoaXMucmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywgInJlc291cmNlcyIpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLnJlc291cmNlc1Byb21pc2UudGhlbigoKSA9PiB7CisgICAgICBjb25zdCBvYmplY3RMb2FkZXIgPSBuZXcgX29iai5PYmplY3RMb2FkZXIodGhpcy5yZXNvdXJjZXMsIGtleXMsIHRoaXMueHJlZik7CisgICAgICByZXR1cm4gb2JqZWN0TG9hZGVyLmxvYWQoKTsKKyAgICB9KTsKKyAgfQorCisgIGdldE9wZXJhdG9yTGlzdCh7CisgICAgaGFuZGxlciwKKyAgICBzaW5rLAorICAgIHRhc2ssCisgICAgaW50ZW50LAorICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMsCisgICAgYW5ub3RhdGlvblN0b3JhZ2UKKyAgfSkgeworICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1Qcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiZ2V0Q29udGVudFN0cmVhbSIpOworICAgIGNvbnN0IHJlc291cmNlc1Byb21pc2UgPSB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCAiQ29sb3JTcGFjZSIsICJQYXR0ZXJuIiwgIlNoYWRpbmciLCAiWE9iamVjdCIsICJGb250Il0pOworICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgX2V2YWx1YXRvci5QYXJ0aWFsRXZhbHVhdG9yKHsKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIGhhbmRsZXIsCisgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAorICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKKyAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCisgICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCisgICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCisgICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKKyAgICB9KTsKKyAgICBjb25zdCBkYXRhUHJvbWlzZXMgPSBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2VdKTsKKyAgICBjb25zdCBwYWdlTGlzdFByb21pc2UgPSBkYXRhUHJvbWlzZXMudGhlbigoW2NvbnRlbnRTdHJlYW1dKSA9PiB7CisgICAgICBjb25zdCBvcExpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KGludGVudCwgc2luayk7CisgICAgICBoYW5kbGVyLnNlbmQoIlN0YXJ0UmVuZGVyUGFnZSIsIHsKKyAgICAgICAgdHJhbnNwYXJlbmN5OiBwYXJ0aWFsRXZhbHVhdG9yLmhhc0JsZW5kTW9kZXModGhpcy5yZXNvdXJjZXMpLAorICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAorICAgICAgICBpbnRlbnQKKyAgICAgIH0pOworICAgICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgc3RyZWFtOiBjb250ZW50U3RyZWFtLAorICAgICAgICB0YXNrLAorICAgICAgICByZXNvdXJjZXM6IHRoaXMucmVzb3VyY2VzLAorICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdAorICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBvcExpc3Q7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3BhZ2VMaXN0UHJvbWlzZSwgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnNdKS50aGVuKGZ1bmN0aW9uIChbcGFnZU9wTGlzdCwgYW5ub3RhdGlvbnNdKSB7CisgICAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7CisgICAgICAgIHBhZ2VPcExpc3QuZmx1c2godHJ1ZSk7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgbGVuZ3RoOiBwYWdlT3BMaXN0LnRvdGFsTGVuZ3RoCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIGNvbnN0IG9wTGlzdFByb21pc2VzID0gW107CisKKyAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgeworICAgICAgICBpZiAoaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uLCBpbnRlbnQpKSB7CisgICAgICAgICAgb3BMaXN0UHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLmdldE9wZXJhdG9yTGlzdChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9KSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wTGlzdFByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChvcExpc3RzKSB7CisgICAgICAgIHBhZ2VPcExpc3QuYWRkT3AoX3V0aWwuT1BTLmJlZ2luQW5ub3RhdGlvbnMsIFtdKTsKKworICAgICAgICBmb3IgKGNvbnN0IG9wTGlzdCBvZiBvcExpc3RzKSB7CisgICAgICAgICAgcGFnZU9wTGlzdC5hZGRPcExpc3Qob3BMaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHBhZ2VPcExpc3QuYWRkT3AoX3V0aWwuT1BTLmVuZEFubm90YXRpb25zLCBbXSk7CisgICAgICAgIHBhZ2VPcExpc3QuZmx1c2godHJ1ZSk7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgbGVuZ3RoOiBwYWdlT3BMaXN0LnRvdGFsTGVuZ3RoCisgICAgICAgIH07CisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorCisgIGV4dHJhY3RUZXh0Q29udGVudCh7CisgICAgaGFuZGxlciwKKyAgICB0YXNrLAorICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UsCisgICAgc2luaywKKyAgICBjb21iaW5lVGV4dEl0ZW1zCisgIH0pIHsKKyAgICBjb25zdCBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywgImdldENvbnRlbnRTdHJlYW0iKTsKKyAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIlhPYmplY3QiLCAiRm9udCJdKTsKKyAgICBjb25zdCBkYXRhUHJvbWlzZXMgPSBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2VdKTsKKyAgICByZXR1cm4gZGF0YVByb21pc2VzLnRoZW4oKFtjb250ZW50U3RyZWFtXSkgPT4geworICAgICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBfZXZhbHVhdG9yLlBhcnRpYWxFdmFsdWF0b3IoeworICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCisgICAgICAgIGhhbmRsZXIsCisgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCisgICAgICAgIGlkRmFjdG9yeTogdGhpcy5fbG9jYWxJZEZhY3RvcnksCisgICAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCisgICAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKKyAgICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAorICAgICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKKyAgICAgIH0pOworICAgICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoeworICAgICAgICBzdHJlYW06IGNvbnRlbnRTdHJlYW0sCisgICAgICAgIHRhc2ssCisgICAgICAgIHJlc291cmNlczogdGhpcy5yZXNvdXJjZXMsCisgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UsCisgICAgICAgIGNvbWJpbmVUZXh0SXRlbXMsCisgICAgICAgIHNpbmsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgZ2V0QW5ub3RhdGlvbnNEYXRhKGludGVudCkgeworICAgIHJldHVybiB0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucy50aGVuKGZ1bmN0aW9uIChhbm5vdGF0aW9ucykgeworICAgICAgY29uc3QgYW5ub3RhdGlvbnNEYXRhID0gW107CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGFubm90YXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgaWYgKCFpbnRlbnQgfHwgaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uc1tpXSwgaW50ZW50KSkgeworICAgICAgICAgIGFubm90YXRpb25zRGF0YS5wdXNoKGFubm90YXRpb25zW2ldLmRhdGEpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBhbm5vdGF0aW9uc0RhdGE7CisgICAgfSk7CisgIH0KKworICBnZXQgYW5ub3RhdGlvbnMoKSB7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJhbm5vdGF0aW9ucyIsIHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIkFubm90cyIpIHx8IFtdKTsKKyAgfQorCisgIGdldCBfcGFyc2VkQW5ub3RhdGlvbnMoKSB7CisgICAgY29uc3QgcGFyc2VkQW5ub3RhdGlvbnMgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJhbm5vdGF0aW9ucyIpLnRoZW4oKCkgPT4geworICAgICAgY29uc3QgYW5ub3RhdGlvblByb21pc2VzID0gW107CisKKyAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvblJlZiBvZiB0aGlzLmFubm90YXRpb25zKSB7CisgICAgICAgIGFubm90YXRpb25Qcm9taXNlcy5wdXNoKF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh0aGlzLnhyZWYsIGFubm90YXRpb25SZWYsIHRoaXMucGRmTWFuYWdlciwgdGhpcy5fbG9jYWxJZEZhY3RvcnkpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoYF9wYXJzZWRBbm5vdGF0aW9uczogIiR7cmVhc29ufSIuYCk7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGFubm90YXRpb25Qcm9taXNlcykudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zLmZpbHRlcihhbm5vdGF0aW9uID0+ICEhYW5ub3RhdGlvbik7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIl9wYXJzZWRBbm5vdGF0aW9ucyIsIHBhcnNlZEFubm90YXRpb25zKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUGFnZSA9IFBhZ2U7Citjb25zdCBQREZfSEVBREVSX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDI1LCAweDUwLCAweDQ0LCAweDQ2LCAweDJkXSk7Citjb25zdCBTVEFSVFhSRUZfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4NzQsIDB4NzgsIDB4NzIsIDB4NjUsIDB4NjZdKTsKK2NvbnN0IEVORE9CSl9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHg2NSwgMHg2ZSwgMHg2NCwgMHg2ZiwgMHg2MiwgMHg2YV0pOworY29uc3QgRklOR0VSUFJJTlRfRklSU1RfQllURVMgPSAxMDI0OworY29uc3QgRU1QVFlfRklOR0VSUFJJTlQgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCI7Citjb25zdCBQREZfSEVBREVSX1ZFUlNJT05fUkVHRVhQID0gL15bMS05XVwuWzAtOV0kLzsKKworZnVuY3Rpb24gZmluZChzdHJlYW0sIHNpZ25hdHVyZSwgbGltaXQgPSAxMDI0LCBiYWNrd2FyZHMgPSBmYWxzZSkgeworICBjb25zdCBzaWduYXR1cmVMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOworICBjb25zdCBzY2FuQnl0ZXMgPSBzdHJlYW0ucGVla0J5dGVzKGxpbWl0KTsKKyAgY29uc3Qgc2Nhbkxlbmd0aCA9IHNjYW5CeXRlcy5sZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7CisKKyAgaWYgKHNjYW5MZW5ndGggPD0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChiYWNrd2FyZHMpIHsKKyAgICBjb25zdCBzaWduYXR1cmVFbmQgPSBzaWduYXR1cmVMZW5ndGggLSAxOworICAgIGxldCBwb3MgPSBzY2FuQnl0ZXMubGVuZ3RoIC0gMTsKKworICAgIHdoaWxlIChwb3MgPj0gc2lnbmF0dXJlRW5kKSB7CisgICAgICBsZXQgaiA9IDA7CisKKyAgICAgIHdoaWxlIChqIDwgc2lnbmF0dXJlTGVuZ3RoICYmIHNjYW5CeXRlc1twb3MgLSBqXSA9PT0gc2lnbmF0dXJlW3NpZ25hdHVyZUVuZCAtIGpdKSB7CisgICAgICAgIGorKzsKKyAgICAgIH0KKworICAgICAgaWYgKGogPj0gc2lnbmF0dXJlTGVuZ3RoKSB7CisgICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zIC0gc2lnbmF0dXJlRW5kOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcG9zLS07CisgICAgfQorICB9IGVsc2UgeworICAgIGxldCBwb3MgPSAwOworCisgICAgd2hpbGUgKHBvcyA8PSBzY2FuTGVuZ3RoKSB7CisgICAgICBsZXQgaiA9IDA7CisKKyAgICAgIHdoaWxlIChqIDwgc2lnbmF0dXJlTGVuZ3RoICYmIHNjYW5CeXRlc1twb3MgKyBqXSA9PT0gc2lnbmF0dXJlW2pdKSB7CisgICAgICAgIGorKzsKKyAgICAgIH0KKworICAgICAgaWYgKGogPj0gc2lnbmF0dXJlTGVuZ3RoKSB7CisgICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcG9zKys7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitjbGFzcyBQREZEb2N1bWVudCB7CisgIGNvbnN0cnVjdG9yKHBkZk1hbmFnZXIsIGFyZykgeworICAgIGxldCBzdHJlYW07CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShhcmcpKSB7CisgICAgICBzdHJlYW0gPSBhcmc7CisgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNBcnJheUJ1ZmZlcikoYXJnKSkgeworICAgICAgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyZWFtKGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiUERGRG9jdW1lbnQ6IFVua25vd24gYXJndW1lbnQgdHlwZSIpOworICAgIH0KKworICAgIGlmIChzdHJlYW0ubGVuZ3RoIDw9IDApIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKCJUaGUgUERGIGZpbGUgaXMgZW1wdHksIGkuZS4gaXRzIHNpemUgaXMgemVybyBieXRlcy4iKTsKKyAgICB9CisKKyAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMueHJlZiA9IG5ldyBfb2JqLlhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKTsKKyAgICB0aGlzLl9wYWdlUHJvbWlzZXMgPSBbXTsKKyAgICB0aGlzLl92ZXJzaW9uID0gbnVsbDsKKyAgICBjb25zdCBpZENvdW50ZXJzID0geworICAgICAgZm9udDogMAorICAgIH07CisgICAgdGhpcy5fZ2xvYmFsSWRGYWN0b3J5ID0gY2xhc3MgeworICAgICAgc3RhdGljIGdldERvY0lkKCkgeworICAgICAgICByZXR1cm4gYGdfJHtwZGZNYW5hZ2VyLmRvY0lkfWA7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjcmVhdGVGb250SWQoKSB7CisgICAgICAgIHJldHVybiBgZiR7KytpZENvdW50ZXJzLmZvbnR9YDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkgeworICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGNyZWF0ZU9iaklkYCBjYWxsZWQuIik7CisgICAgICB9CisKKyAgICB9OworICB9CisKKyAgcGFyc2UocmVjb3ZlcnlNb2RlKSB7CisgICAgdGhpcy54cmVmLnBhcnNlKHJlY292ZXJ5TW9kZSk7CisgICAgdGhpcy5jYXRhbG9nID0gbmV3IF9vYmouQ2F0YWxvZyh0aGlzLnBkZk1hbmFnZXIsIHRoaXMueHJlZik7CisKKyAgICBpZiAodGhpcy5jYXRhbG9nLnZlcnNpb24pIHsKKyAgICAgIHRoaXMuX3ZlcnNpb24gPSB0aGlzLmNhdGFsb2cudmVyc2lvbjsKKyAgICB9CisgIH0KKworICBnZXQgbGluZWFyaXphdGlvbigpIHsKKyAgICBsZXQgbGluZWFyaXphdGlvbiA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgbGluZWFyaXphdGlvbiA9IF9wYXJzZXIuTGluZWFyaXphdGlvbi5jcmVhdGUodGhpcy5zdHJlYW0pOworICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGVycjsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKGVycik7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJsaW5lYXJpemF0aW9uIiwgbGluZWFyaXphdGlvbik7CisgIH0KKworICBnZXQgc3RhcnRYUmVmKCkgeworICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOworICAgIGxldCBzdGFydFhSZWYgPSAwOworCisgICAgaWYgKHRoaXMubGluZWFyaXphdGlvbikgeworICAgICAgc3RyZWFtLnJlc2V0KCk7CisKKyAgICAgIGlmIChmaW5kKHN0cmVhbSwgRU5ET0JKX1NJR05BVFVSRSkpIHsKKyAgICAgICAgc3RhcnRYUmVmID0gc3RyZWFtLnBvcyArIDYgLSBzdHJlYW0uc3RhcnQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHN0ZXAgPSAxMDI0OworICAgICAgY29uc3Qgc3RhcnRYUmVmTGVuZ3RoID0gU1RBUlRYUkVGX1NJR05BVFVSRS5sZW5ndGg7CisgICAgICBsZXQgZm91bmQgPSBmYWxzZSwKKyAgICAgICAgICBwb3MgPSBzdHJlYW0uZW5kOworCisgICAgICB3aGlsZSAoIWZvdW5kICYmIHBvcyA+IDApIHsKKyAgICAgICAgcG9zIC09IHN0ZXAgLSBzdGFydFhSZWZMZW5ndGg7CisKKyAgICAgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgICBwb3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgc3RyZWFtLnBvcyA9IHBvczsKKyAgICAgICAgZm91bmQgPSBmaW5kKHN0cmVhbSwgU1RBUlRYUkVGX1NJR05BVFVSRSwgc3RlcCwgdHJ1ZSk7CisgICAgICB9CisKKyAgICAgIGlmIChmb3VuZCkgeworICAgICAgICBzdHJlYW0uc2tpcCg5KTsKKyAgICAgICAgbGV0IGNoOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBjaCA9IHN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgIH0gd2hpbGUgKCgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGNoKSk7CisKKyAgICAgICAgbGV0IHN0ciA9ICIiOworCisgICAgICAgIHdoaWxlIChjaCA+PSAweDIwICYmIGNoIDw9IDB4MzkpIHsKKyAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisgICAgICAgICAgY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgc3RhcnRYUmVmID0gcGFyc2VJbnQoc3RyLCAxMCk7CisKKyAgICAgICAgaWYgKGlzTmFOKHN0YXJ0WFJlZikpIHsKKyAgICAgICAgICBzdGFydFhSZWYgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJzdGFydFhSZWYiLCBzdGFydFhSZWYpOworICB9CisKKyAgY2hlY2tIZWFkZXIoKSB7CisgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CisgICAgc3RyZWFtLnJlc2V0KCk7CisKKyAgICBpZiAoIWZpbmQoc3RyZWFtLCBQREZfSEVBREVSX1NJR05BVFVSRSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJlYW0ubW92ZVN0YXJ0KCk7CisgICAgY29uc3QgTUFYX1BERl9WRVJTSU9OX0xFTkdUSCA9IDEyOworICAgIGxldCB2ZXJzaW9uID0gIiIsCisgICAgICAgIGNoOworCisgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpID4gMHgyMCkgeworICAgICAgaWYgKHZlcnNpb24ubGVuZ3RoID49IE1BWF9QREZfVkVSU0lPTl9MRU5HVEgpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHZlcnNpb24gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisgICAgfQorCisgICAgaWYgKCF0aGlzLl92ZXJzaW9uKSB7CisgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbi5zdWJzdHJpbmcoNSk7CisgICAgfQorICB9CisKKyAgcGFyc2VTdGFydFhSZWYoKSB7CisgICAgdGhpcy54cmVmLnNldFN0YXJ0WFJlZih0aGlzLnN0YXJ0WFJlZik7CisgIH0KKworICBnZXQgbnVtUGFnZXMoKSB7CisgICAgY29uc3QgbGluZWFyaXphdGlvbiA9IHRoaXMubGluZWFyaXphdGlvbjsKKyAgICBjb25zdCBudW0gPSBsaW5lYXJpemF0aW9uID8gbGluZWFyaXphdGlvbi5udW1QYWdlcyA6IHRoaXMuY2F0YWxvZy5udW1QYWdlczsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm51bVBhZ2VzIiwgbnVtKTsKKyAgfQorCisgIF9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkcywgcmVjdXJzaW9uRGVwdGggPSAwKSB7CisgICAgY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTA7CisgICAgcmV0dXJuIGZpZWxkcy5ldmVyeShmaWVsZCA9PiB7CisgICAgICBmaWVsZCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZpZWxkKTsKKworICAgICAgaWYgKGZpZWxkLmhhcygiS2lkcyIpKSB7CisgICAgICAgIGlmICgrK3JlY3Vyc2lvbkRlcHRoID4gUkVDVVJTSU9OX0xJTUlUKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJfaGFzT25seURvY3VtZW50U2lnbmF0dXJlczogbWF4aW11bSByZWN1cnNpb24gZGVwdGggcmVhY2hlZCIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkLmdldCgiS2lkcyIpLCByZWN1cnNpb25EZXB0aCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGlzU2lnbmF0dXJlID0gKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmllbGQuZ2V0KCJGVCIpLCAiU2lnIik7CisgICAgICBjb25zdCByZWN0YW5nbGUgPSBmaWVsZC5nZXQoIlJlY3QiKTsKKyAgICAgIGNvbnN0IGlzSW52aXNpYmxlID0gQXJyYXkuaXNBcnJheShyZWN0YW5nbGUpICYmIHJlY3RhbmdsZS5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSA9PT0gMCk7CisgICAgICByZXR1cm4gaXNTaWduYXR1cmUgJiYgaXNJbnZpc2libGU7CisgICAgfSk7CisgIH0KKworICBnZXQgZm9ybUluZm8oKSB7CisgICAgY29uc3QgZm9ybUluZm8gPSB7CisgICAgICBoYXNBY3JvRm9ybTogZmFsc2UsCisgICAgICBoYXNYZmE6IGZhbHNlCisgICAgfTsKKyAgICBjb25zdCBhY3JvRm9ybSA9IHRoaXMuY2F0YWxvZy5hY3JvRm9ybTsKKworICAgIGlmICghYWNyb0Zvcm0pIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZm9ybUluZm8iLCBmb3JtSW5mbyk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGNvbnN0IHhmYSA9IGFjcm9Gb3JtLmdldCgiWEZBIik7CisgICAgICBjb25zdCBoYXNYZmEgPSBBcnJheS5pc0FycmF5KHhmYSkgJiYgeGZhLmxlbmd0aCA+IDAgfHwgKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh4ZmEpICYmICF4ZmEuaXNFbXB0eTsKKyAgICAgIGZvcm1JbmZvLmhhc1hmYSA9IGhhc1hmYTsKKyAgICAgIGNvbnN0IGZpZWxkcyA9IGFjcm9Gb3JtLmdldCgiRmllbGRzIik7CisgICAgICBjb25zdCBoYXNGaWVsZHMgPSBBcnJheS5pc0FycmF5KGZpZWxkcykgJiYgZmllbGRzLmxlbmd0aCA+IDA7CisgICAgICBjb25zdCBzaWdGbGFncyA9IGFjcm9Gb3JtLmdldCgiU2lnRmxhZ3MiKTsKKworICAgICAgY29uc3QgaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyA9ICEhKHNpZ0ZsYWdzICYgMHgxKSAmJiB0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkcyk7CisKKyAgICAgIGZvcm1JbmZvLmhhc0Fjcm9Gb3JtID0gaGFzRmllbGRzICYmICFoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJDYW5ub3QgZmV0Y2ggZm9ybSBpbmZvcm1hdGlvbi4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImZvcm1JbmZvIiwgZm9ybUluZm8pOworICB9CisKKyAgZ2V0IGRvY3VtZW50SW5mbygpIHsKKyAgICBjb25zdCBEb2N1bWVudEluZm9WYWxpZGF0b3JzID0geworICAgICAgVGl0bGU6IF91dGlsLmlzU3RyaW5nLAorICAgICAgQXV0aG9yOiBfdXRpbC5pc1N0cmluZywKKyAgICAgIFN1YmplY3Q6IF91dGlsLmlzU3RyaW5nLAorICAgICAgS2V5d29yZHM6IF91dGlsLmlzU3RyaW5nLAorICAgICAgQ3JlYXRvcjogX3V0aWwuaXNTdHJpbmcsCisgICAgICBQcm9kdWNlcjogX3V0aWwuaXNTdHJpbmcsCisgICAgICBDcmVhdGlvbkRhdGU6IF91dGlsLmlzU3RyaW5nLAorICAgICAgTW9kRGF0ZTogX3V0aWwuaXNTdHJpbmcsCisgICAgICBUcmFwcGVkOiBfcHJpbWl0aXZlcy5pc05hbWUKKyAgICB9OworICAgIGxldCB2ZXJzaW9uID0gdGhpcy5fdmVyc2lvbjsKKworICAgIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gInN0cmluZyIgfHwgIVBERl9IRUFERVJfVkVSU0lPTl9SRUdFWFAudGVzdCh2ZXJzaW9uKSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKGBJbnZhbGlkIFBERiBoZWFkZXIgdmVyc2lvbiBudW1iZXI6ICR7dmVyc2lvbn1gKTsKKyAgICAgIHZlcnNpb24gPSBudWxsOworICAgIH0KKworICAgIGNvbnN0IGRvY0luZm8gPSB7CisgICAgICBQREZGb3JtYXRWZXJzaW9uOiB2ZXJzaW9uLAorICAgICAgSXNMaW5lYXJpemVkOiAhIXRoaXMubGluZWFyaXphdGlvbiwKKyAgICAgIElzQWNyb0Zvcm1QcmVzZW50OiB0aGlzLmZvcm1JbmZvLmhhc0Fjcm9Gb3JtLAorICAgICAgSXNYRkFQcmVzZW50OiB0aGlzLmZvcm1JbmZvLmhhc1hmYSwKKyAgICAgIElzQ29sbGVjdGlvblByZXNlbnQ6ICEhdGhpcy5jYXRhbG9nLmNvbGxlY3Rpb24KKyAgICB9OworICAgIGxldCBpbmZvRGljdDsKKworICAgIHRyeSB7CisgICAgICBpbmZvRGljdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldCgiSW5mbyIpOworICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGVycjsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJUaGUgZG9jdW1lbnQgaW5mb3JtYXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpOworICAgIH0KKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShpbmZvRGljdCkpIHsKKyAgICAgIGZvciAoY29uc3Qga2V5IG9mIGluZm9EaWN0LmdldEtleXMoKSkgeworICAgICAgICBjb25zdCB2YWx1ZSA9IGluZm9EaWN0LmdldChrZXkpOworCisgICAgICAgIGlmIChEb2N1bWVudEluZm9WYWxpZGF0b3JzW2tleV0pIHsKKyAgICAgICAgICBpZiAoRG9jdW1lbnRJbmZvVmFsaWRhdG9yc1trZXldKHZhbHVlKSkgeworICAgICAgICAgICAgZG9jSW5mb1trZXldID0gdHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIiA/IHZhbHVlIDogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKSh2YWx1ZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgQmFkIHZhbHVlIGluIGRvY3VtZW50IGluZm8gZm9yICIke2tleX0iLmApOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5ID09PSAic3RyaW5nIikgeworICAgICAgICAgIGxldCBjdXN0b21WYWx1ZTsKKworICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKHZhbHVlKSkgeworICAgICAgICAgICAgY3VzdG9tVmFsdWUgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHZhbHVlKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHZhbHVlKSB8fCAoMCwgX3V0aWwuaXNOdW0pKHZhbHVlKSB8fCAoMCwgX3V0aWwuaXNCb29sKSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gdmFsdWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgVW5zdXBwb3J0ZWQgdmFsdWUgaW4gZG9jdW1lbnQgaW5mbyBmb3IgKGN1c3RvbSkgIiR7a2V5fSIuYCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWRvY0luZm8uQ3VzdG9tKSB7CisgICAgICAgICAgICBkb2NJbmZvLkN1c3RvbSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZG9jSW5mby5DdXN0b21ba2V5XSA9IGN1c3RvbVZhbHVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJkb2N1bWVudEluZm8iLCBkb2NJbmZvKTsKKyAgfQorCisgIGdldCBmaW5nZXJwcmludCgpIHsKKyAgICBsZXQgaGFzaDsKKyAgICBjb25zdCBpZEFycmF5ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJRCIpOworCisgICAgaWYgKEFycmF5LmlzQXJyYXkoaWRBcnJheSkgJiYgaWRBcnJheVswXSAmJiAoMCwgX3V0aWwuaXNTdHJpbmcpKGlkQXJyYXlbMF0pICYmIGlkQXJyYXlbMF0gIT09IEVNUFRZX0ZJTkdFUlBSSU5UKSB7CisgICAgICBoYXNoID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGlkQXJyYXlbMF0pOworICAgIH0gZWxzZSB7CisgICAgICBoYXNoID0gKDAsIF9jcnlwdG8uY2FsY3VsYXRlTUQ1KSh0aGlzLnN0cmVhbS5nZXRCeXRlUmFuZ2UoMCwgRklOR0VSUFJJTlRfRklSU1RfQllURVMpLCAwLCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyk7CisgICAgfQorCisgICAgY29uc3QgZmluZ2VycHJpbnRCdWYgPSBbXTsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGhhc2gubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgY29uc3QgaGV4ID0gaGFzaFtpXS50b1N0cmluZygxNik7CisgICAgICBmaW5nZXJwcmludEJ1Zi5wdXNoKGhleC5wYWRTdGFydCgyLCAiMCIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImZpbmdlcnByaW50IiwgZmluZ2VycHJpbnRCdWYuam9pbigiIikpOworICB9CisKKyAgX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCkgeworICAgIGNvbnN0IHsKKyAgICAgIGNhdGFsb2csCisgICAgICBsaW5lYXJpemF0aW9uCisgICAgfSA9IHRoaXM7CisKKyAgICBjb25zdCByZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KGxpbmVhcml6YXRpb24ub2JqZWN0TnVtYmVyRmlyc3QsIDApOworCisgICAgcmV0dXJuIHRoaXMueHJlZi5mZXRjaEFzeW5jKHJlZikudGhlbihvYmogPT4geworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaiwgIlBhZ2UiKSB8fCAoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopICYmICFvYmouaGFzKCJUeXBlIikgJiYgb2JqLmhhcygiQ29udGVudHMiKSkgeworICAgICAgICBpZiAocmVmICYmICFjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5oYXMocmVmKSkgeworICAgICAgICAgIGNhdGFsb2cucGFnZUtpZHNDb3VudENhY2hlLnB1dChyZWYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFtvYmosIHJlZl07CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVGhlIExpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2Vzbid0IHBvaW50ICIgKyAidG8gYSB2YWxpZCBQYWdlIGRpY3Rpb25hcnkuIik7CisgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgICgwLCBfdXRpbC5pbmZvKShyZWFzb24pOworICAgICAgcmV0dXJuIGNhdGFsb2cuZ2V0UGFnZURpY3QocGFnZUluZGV4KTsKKyAgICB9KTsKKyAgfQorCisgIGdldFBhZ2UocGFnZUluZGV4KSB7CisgICAgaWYgKHRoaXMuX3BhZ2VQcm9taXNlc1twYWdlSW5kZXhdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlUHJvbWlzZXNbcGFnZUluZGV4XTsKKyAgICB9CisKKyAgICBjb25zdCB7CisgICAgICBjYXRhbG9nLAorICAgICAgbGluZWFyaXphdGlvbgorICAgIH0gPSB0aGlzOworICAgIGNvbnN0IHByb21pc2UgPSBsaW5lYXJpemF0aW9uICYmIGxpbmVhcml6YXRpb24ucGFnZUZpcnN0ID09PSBwYWdlSW5kZXggPyB0aGlzLl9nZXRMaW5lYXJpemF0aW9uUGFnZShwYWdlSW5kZXgpIDogY2F0YWxvZy5nZXRQYWdlRGljdChwYWdlSW5kZXgpOworICAgIHJldHVybiB0aGlzLl9wYWdlUHJvbWlzZXNbcGFnZUluZGV4XSA9IHByb21pc2UudGhlbigoW3BhZ2VEaWN0LCByZWZdKSA9PiB7CisgICAgICByZXR1cm4gbmV3IFBhZ2UoeworICAgICAgICBwZGZNYW5hZ2VyOiB0aGlzLnBkZk1hbmFnZXIsCisgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgICAgcGFnZUluZGV4LAorICAgICAgICBwYWdlRGljdCwKKyAgICAgICAgcmVmLAorICAgICAgICBnbG9iYWxJZEZhY3Rvcnk6IHRoaXMuX2dsb2JhbElkRmFjdG9yeSwKKyAgICAgICAgZm9udENhY2hlOiBjYXRhbG9nLmZvbnRDYWNoZSwKKyAgICAgICAgYnVpbHRJbkNNYXBDYWNoZTogY2F0YWxvZy5idWlsdEluQ01hcENhY2hlLAorICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiBjYXRhbG9nLmdsb2JhbEltYWdlQ2FjaGUKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgY2hlY2tGaXJzdFBhZ2UoKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0UGFnZSgwKS5jYXRjaChhc3luYyByZWFzb24gPT4geworICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLlhSZWZFbnRyeUV4Y2VwdGlvbikgeworICAgICAgICB0aGlzLl9wYWdlUHJvbWlzZXMubGVuZ3RoID0gMDsKKyAgICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwKCk7CisgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikgeworICAgIHJldHVybiB0aGlzLmNhdGFsb2cuZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKTsKKyAgfQorCisgIGFzeW5jIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgeworICAgIHJldHVybiB0aGlzLmNhdGFsb2cgPyB0aGlzLmNhdGFsb2cuY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCkgOiAoMCwgX3ByaW1pdGl2ZXMuY2xlYXJQcmltaXRpdmVDYWNoZXMpKCk7CisgIH0KKworfQorCitleHBvcnRzLlBERkRvY3VtZW50ID0gUERGRG9jdW1lbnQ7CisKKy8qKiovIH0pLAorLyogMTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5GaWxlU3BlYyA9IGV4cG9ydHMuWFJlZiA9IGV4cG9ydHMuT2JqZWN0TG9hZGVyID0gZXhwb3J0cy5DYXRhbG9nID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworCit2YXIgX2NyeXB0byA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOworCit2YXIgX2NvbG9yc3BhY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKKwordmFyIF9pbWFnZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjQpOworCitmdW5jdGlvbiBmZXRjaERlc3RpbmF0aW9uKGRlc3QpIHsKKyAgcmV0dXJuICgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRlc3QpID8gZGVzdC5nZXQoIkQiKSA6IGRlc3Q7Cit9CisKK2NsYXNzIENhdGFsb2cgeworICBjb25zdHJ1Y3RvcihwZGZNYW5hZ2VyLCB4cmVmKSB7CisgICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKKyAgICB0aGlzLnhyZWYgPSB4cmVmOworICAgIHRoaXMuX2NhdERpY3QgPSB4cmVmLmdldENhdGFsb2dPYmooKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkodGhpcy5fY2F0RGljdCkpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQ2F0YWxvZyBvYmplY3QgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKKyAgICB9CisKKyAgICB0aGlzLmZvbnRDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOworICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IG5ldyBNYXAoKTsKKyAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkdsb2JhbEltYWdlQ2FjaGUoKTsKKyAgICB0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOworICB9CisKKyAgZ2V0IHZlcnNpb24oKSB7CisgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJWZXJzaW9uIik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHZlcnNpb24pKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInZlcnNpb24iLCBudWxsKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInZlcnNpb24iLCB2ZXJzaW9uLm5hbWUpOworICB9CisKKyAgZ2V0IGNvbGxlY3Rpb24oKSB7CisgICAgbGV0IGNvbGxlY3Rpb24gPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJDb2xsZWN0aW9uIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopICYmIG9iai5zaXplID4gMCkgeworICAgICAgICBjb2xsZWN0aW9uID0gb2JqOworICAgICAgfQorICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJDYW5ub3QgZmV0Y2ggQ29sbGVjdGlvbiBlbnRyeTsgYXNzdW1pbmcgbm8gY29sbGVjdGlvbiBpcyBwcmVzZW50LiIpOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiY29sbGVjdGlvbiIsIGNvbGxlY3Rpb24pOworICB9CisKKyAgZ2V0IGFjcm9Gb3JtKCkgeworICAgIGxldCBhY3JvRm9ybSA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIkFjcm9Gb3JtIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopICYmIG9iai5zaXplID4gMCkgeworICAgICAgICBhY3JvRm9ybSA9IG9iajsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChleCkgeworICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgZXg7CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiQ2Fubm90IGZldGNoIEFjcm9Gb3JtIGVudHJ5OyBhc3N1bWluZyBubyBmb3JtcyBhcmUgcHJlc2VudC4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImFjcm9Gb3JtIiwgYWNyb0Zvcm0pOworICB9CisKKyAgZ2V0IG1ldGFkYXRhKCkgeworICAgIGNvbnN0IHN0cmVhbVJlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJNZXRhZGF0YSIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKHN0cmVhbVJlZikpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAibWV0YWRhdGEiLCBudWxsKTsKKyAgICB9CisKKyAgICBjb25zdCBzdXBwcmVzc0VuY3J5cHRpb24gPSAhKHRoaXMueHJlZi5lbmNyeXB0ICYmIHRoaXMueHJlZi5lbmNyeXB0LmVuY3J5cHRNZXRhZGF0YSk7CisgICAgY29uc3Qgc3RyZWFtID0gdGhpcy54cmVmLmZldGNoKHN0cmVhbVJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICBsZXQgbWV0YWRhdGE7CisKKyAgICBpZiAoc3RyZWFtICYmICgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHN0cmVhbS5kaWN0KSkgeworICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5kaWN0LmdldCgiVHlwZSIpOworICAgICAgY29uc3Qgc3VidHlwZSA9IHN0cmVhbS5kaWN0LmdldCgiU3VidHlwZSIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSwgIk1ldGFkYXRhIikgJiYgKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoc3VidHlwZSwgIlhNTCIpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgbWV0YWRhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9VVEY4U3RyaW5nKSgoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoc3RyZWFtLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgfQorCisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJTa2lwcGluZyBpbnZhbGlkIG1ldGFkYXRhLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJtZXRhZGF0YSIsIG1ldGFkYXRhKTsKKyAgfQorCisgIGdldCB0b3BsZXZlbFBhZ2VzRGljdCgpIHsKKyAgICBjb25zdCBwYWdlc09iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlcyIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShwYWdlc09iaikpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeS4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInRvcGxldmVsUGFnZXNEaWN0IiwgcGFnZXNPYmopOworICB9CisKKyAgZ2V0IGRvY3VtZW50T3V0bGluZSgpIHsKKyAgICBsZXQgb2JqID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBvYmogPSB0aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCk7CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorCisgICAgICAoMCwgX3V0aWwud2FybikoIlVuYWJsZSB0byByZWFkIGRvY3VtZW50IG91dGxpbmUuIik7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJkb2N1bWVudE91dGxpbmUiLCBvYmopOworICB9CisKKyAgX3JlYWREb2N1bWVudE91dGxpbmUoKSB7CisgICAgbGV0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPdXRsaW5lcyIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBvYmogPSBvYmouZ2V0UmF3KCJGaXJzdCIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKG9iaikpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IHJvb3QgPSB7CisgICAgICBpdGVtczogW10KKyAgICB9OworICAgIGNvbnN0IHF1ZXVlID0gW3sKKyAgICAgIG9iaiwKKyAgICAgIHBhcmVudDogcm9vdAorICAgIH1dOworICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKTsKKyAgICBwcm9jZXNzZWQucHV0KG9iaik7CisgICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKKyAgICAgICAgICBibGFja0NvbG9yID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpOworCisgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgIGNvbnN0IGkgPSBxdWV1ZS5zaGlmdCgpOworICAgICAgY29uc3Qgb3V0bGluZURpY3QgPSB4cmVmLmZldGNoSWZSZWYoaS5vYmopOworCisgICAgICBpZiAob3V0bGluZURpY3QgPT09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmICghb3V0bGluZURpY3QuaGFzKCJUaXRsZSIpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGRhdGEgPSB7CisgICAgICAgIHVybDogbnVsbCwKKyAgICAgICAgZGVzdDogbnVsbAorICAgICAgfTsKKyAgICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7CisgICAgICAgIGRlc3REaWN0OiBvdXRsaW5lRGljdCwKKyAgICAgICAgcmVzdWx0T2JqOiBkYXRhLAorICAgICAgICBkb2NCYXNlVXJsOiB0aGlzLnBkZk1hbmFnZXIuZG9jQmFzZVVybAorICAgICAgfSk7CisgICAgICBjb25zdCB0aXRsZSA9IG91dGxpbmVEaWN0LmdldCgiVGl0bGUiKTsKKyAgICAgIGNvbnN0IGZsYWdzID0gb3V0bGluZURpY3QuZ2V0KCJGIikgfHwgMDsKKyAgICAgIGNvbnN0IGNvbG9yID0gb3V0bGluZURpY3QuZ2V0QXJyYXkoIkMiKTsKKyAgICAgIGNvbnN0IGNvdW50ID0gb3V0bGluZURpY3QuZ2V0KCJDb3VudCIpOworICAgICAgbGV0IHJnYkNvbG9yID0gYmxhY2tDb2xvcjsKKworICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sb3IpICYmIGNvbG9yLmxlbmd0aCA9PT0gMyAmJiAoY29sb3JbMF0gIT09IDAgfHwgY29sb3JbMV0gIT09IDAgfHwgY29sb3JbMl0gIT09IDApKSB7CisgICAgICAgIHJnYkNvbG9yID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoY29sb3IsIDApOworICAgICAgfQorCisgICAgICBjb25zdCBvdXRsaW5lSXRlbSA9IHsKKyAgICAgICAgZGVzdDogZGF0YS5kZXN0LAorICAgICAgICB1cmw6IGRhdGEudXJsLAorICAgICAgICB1bnNhZmVVcmw6IGRhdGEudW5zYWZlVXJsLAorICAgICAgICBuZXdXaW5kb3c6IGRhdGEubmV3V2luZG93LAorICAgICAgICB0aXRsZTogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKSh0aXRsZSksCisgICAgICAgIGNvbG9yOiByZ2JDb2xvciwKKyAgICAgICAgY291bnQ6IE51bWJlci5pc0ludGVnZXIoY291bnQpID8gY291bnQgOiB1bmRlZmluZWQsCisgICAgICAgIGJvbGQ6ICEhKGZsYWdzICYgMiksCisgICAgICAgIGl0YWxpYzogISEoZmxhZ3MgJiAxKSwKKyAgICAgICAgaXRlbXM6IFtdCisgICAgICB9OworICAgICAgaS5wYXJlbnQuaXRlbXMucHVzaChvdXRsaW5lSXRlbSk7CisgICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIkZpcnN0Iik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKG9iaikgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkgeworICAgICAgICBxdWV1ZS5wdXNoKHsKKyAgICAgICAgICBvYmosCisgICAgICAgICAgcGFyZW50OiBvdXRsaW5lSXRlbQorICAgICAgICB9KTsKKyAgICAgICAgcHJvY2Vzc2VkLnB1dChvYmopOworICAgICAgfQorCisgICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIk5leHQiKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikob2JqKSAmJiAhcHJvY2Vzc2VkLmhhcyhvYmopKSB7CisgICAgICAgIHF1ZXVlLnB1c2goeworICAgICAgICAgIG9iaiwKKyAgICAgICAgICBwYXJlbnQ6IGkucGFyZW50CisgICAgICAgIH0pOworICAgICAgICBwcm9jZXNzZWQucHV0KG9iaik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJvb3QuaXRlbXMubGVuZ3RoID4gMCA/IHJvb3QuaXRlbXMgOiBudWxsOworICB9CisKKyAgZ2V0IHBlcm1pc3Npb25zKCkgeworICAgIGxldCBwZXJtaXNzaW9ucyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgcGVybWlzc2lvbnMgPSB0aGlzLl9yZWFkUGVybWlzc2lvbnMoKTsKKyAgICB9IGNhdGNoIChleCkgeworICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgZXg7CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5hYmxlIHRvIHJlYWQgcGVybWlzc2lvbnMuIik7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJwZXJtaXNzaW9ucyIsIHBlcm1pc3Npb25zKTsKKyAgfQorCisgIF9yZWFkUGVybWlzc2lvbnMoKSB7CisgICAgY29uc3QgZW5jcnlwdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldCgiRW5jcnlwdCIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShlbmNyeXB0KSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgbGV0IGZsYWdzID0gZW5jcnlwdC5nZXQoIlAiKTsKKworICAgIGlmICghKDAsIF91dGlsLmlzTnVtKShmbGFncykpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGZsYWdzICs9IDIgKiogMzI7CisgICAgY29uc3QgcGVybWlzc2lvbnMgPSBbXTsKKworICAgIGZvciAoY29uc3Qga2V5IGluIF91dGlsLlBlcm1pc3Npb25GbGFnKSB7CisgICAgICBjb25zdCB2YWx1ZSA9IF91dGlsLlBlcm1pc3Npb25GbGFnW2tleV07CisKKyAgICAgIGlmIChmbGFncyAmIHZhbHVlKSB7CisgICAgICAgIHBlcm1pc3Npb25zLnB1c2godmFsdWUpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwZXJtaXNzaW9uczsKKyAgfQorCisgIGdldCBvcHRpb25hbENvbnRlbnRDb25maWcoKSB7CisgICAgbGV0IGNvbmZpZyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPQ1Byb3BlcnRpZXMiKTsKKworICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBwcm9wZXJ0aWVzLmdldCgiRCIpOworCisgICAgICBpZiAoIWRlZmF1bHRDb25maWcpIHsKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBudWxsKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZ3JvdXBzRGF0YSA9IHByb3BlcnRpZXMuZ2V0KCJPQ0dzIik7CisKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheShncm91cHNEYXRhKSkgeworICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIG51bGwpOworICAgICAgfQorCisgICAgICBjb25zdCBncm91cHMgPSBbXTsKKyAgICAgIGNvbnN0IGdyb3VwUmVmcyA9IFtdOworCisgICAgICBmb3IgKGNvbnN0IGdyb3VwUmVmIG9mIGdyb3Vwc0RhdGEpIHsKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGdyb3VwUmVmKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZ3JvdXBSZWZzLnB1c2goZ3JvdXBSZWYpOworICAgICAgICBjb25zdCBncm91cCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGdyb3VwUmVmKTsKKyAgICAgICAgZ3JvdXBzLnB1c2goeworICAgICAgICAgIGlkOiBncm91cFJlZi50b1N0cmluZygpLAorICAgICAgICAgIG5hbWU6ICgwLCBfdXRpbC5pc1N0cmluZykoZ3JvdXAuZ2V0KCJOYW1lIikpID8gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShncm91cC5nZXQoIk5hbWUiKSkgOiBudWxsLAorICAgICAgICAgIGludGVudDogKDAsIF91dGlsLmlzU3RyaW5nKShncm91cC5nZXQoIkludGVudCIpKSA/ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZ3JvdXAuZ2V0KCJJbnRlbnQiKSkgOiBudWxsCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBjb25maWcgPSB0aGlzLl9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKGRlZmF1bHRDb25maWcsIGdyb3VwUmVmcyk7CisgICAgICBjb25maWcuZ3JvdXBzID0gZ3JvdXBzOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBVbmFibGUgdG8gcmVhZCBvcHRpb25hbCBjb250ZW50IGNvbmZpZzogJHtleH1gKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIGNvbmZpZyk7CisgIH0KKworICBfcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhjb25maWcsIGNvbnRlbnRHcm91cFJlZnMpIHsKKyAgICBmdW5jdGlvbiBwYXJzZU9uT2ZmKHJlZnMpIHsKKyAgICAgIGNvbnN0IG9uUGFyc2VkID0gW107CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlZnMpKSB7CisgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVmcykgeworICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzUmVmKSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjb250ZW50R3JvdXBSZWZzLmluY2x1ZGVzKHZhbHVlKSkgeworICAgICAgICAgICAgb25QYXJzZWQucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG9uUGFyc2VkOworICAgIH0KKworICAgIGZ1bmN0aW9uIHBhcnNlT3JkZXIocmVmcywgbmVzdGVkTGV2ZWxzID0gMCkgeworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnMpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBjb25zdCBvcmRlciA9IFtdOworCisgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlZnMpIHsKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikodmFsdWUpICYmIGNvbnRlbnRHcm91cFJlZnMuaW5jbHVkZXModmFsdWUpKSB7CisgICAgICAgICAgcGFyc2VkT3JkZXJSZWZzLnB1dCh2YWx1ZSk7CisgICAgICAgICAgb3JkZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG5lc3RlZE9yZGVyID0gcGFyc2VOZXN0ZWRPcmRlcih2YWx1ZSwgbmVzdGVkTGV2ZWxzKTsKKworICAgICAgICBpZiAobmVzdGVkT3JkZXIpIHsKKyAgICAgICAgICBvcmRlci5wdXNoKG5lc3RlZE9yZGVyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobmVzdGVkTGV2ZWxzID4gMCkgeworICAgICAgICByZXR1cm4gb3JkZXI7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGhpZGRlbkdyb3VwcyA9IFtdOworCisgICAgICBmb3IgKGNvbnN0IGdyb3VwUmVmIG9mIGNvbnRlbnRHcm91cFJlZnMpIHsKKyAgICAgICAgaWYgKHBhcnNlZE9yZGVyUmVmcy5oYXMoZ3JvdXBSZWYpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBoaWRkZW5Hcm91cHMucHVzaChncm91cFJlZi50b1N0cmluZygpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGhpZGRlbkdyb3Vwcy5sZW5ndGgpIHsKKyAgICAgICAgb3JkZXIucHVzaCh7CisgICAgICAgICAgbmFtZTogbnVsbCwKKyAgICAgICAgICBvcmRlcjogaGlkZGVuR3JvdXBzCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gb3JkZXI7CisgICAgfQorCisgICAgZnVuY3Rpb24gcGFyc2VOZXN0ZWRPcmRlcihyZWYsIG5lc3RlZExldmVscykgeworICAgICAgaWYgKCsrbmVzdGVkTGV2ZWxzID4gTUFYX05FU1RFRF9MRVZFTFMpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZU5lc3RlZE9yZGVyIC0gcmVhY2hlZCBNQVhfTkVTVEVEX0xFVkVMUy4iKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHZhbHVlID0geHJlZi5mZXRjaElmUmVmKHJlZik7CisKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG5lc3RlZE5hbWUgPSB4cmVmLmZldGNoSWZSZWYodmFsdWVbMF0pOworCisgICAgICBpZiAodHlwZW9mIG5lc3RlZE5hbWUgIT09ICJzdHJpbmciKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBjb25zdCBuZXN0ZWRPcmRlciA9IHBhcnNlT3JkZXIodmFsdWUuc2xpY2UoMSksIG5lc3RlZExldmVscyk7CisKKyAgICAgIGlmICghbmVzdGVkT3JkZXIgfHwgIW5lc3RlZE9yZGVyLmxlbmd0aCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgbmFtZTogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShuZXN0ZWROYW1lKSwKKyAgICAgICAgb3JkZXI6IG5lc3RlZE9yZGVyCisgICAgICB9OworICAgIH0KKworICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWYsCisgICAgICAgICAgcGFyc2VkT3JkZXJSZWZzID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpLAorICAgICAgICAgIE1BWF9ORVNURURfTEVWRUxTID0gMTA7CisgICAgcmV0dXJuIHsKKyAgICAgIG5hbWU6ICgwLCBfdXRpbC5pc1N0cmluZykoY29uZmlnLmdldCgiTmFtZSIpKSA/ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoY29uZmlnLmdldCgiTmFtZSIpKSA6IG51bGwsCisgICAgICBjcmVhdG9yOiAoMCwgX3V0aWwuaXNTdHJpbmcpKGNvbmZpZy5nZXQoIkNyZWF0b3IiKSkgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGNvbmZpZy5nZXQoIkNyZWF0b3IiKSkgOiBudWxsLAorICAgICAgYmFzZVN0YXRlOiAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShjb25maWcuZ2V0KCJCYXNlU3RhdGUiKSkgPyBjb25maWcuZ2V0KCJCYXNlU3RhdGUiKS5uYW1lIDogbnVsbCwKKyAgICAgIG9uOiBwYXJzZU9uT2ZmKGNvbmZpZy5nZXQoIk9OIikpLAorICAgICAgb2ZmOiBwYXJzZU9uT2ZmKGNvbmZpZy5nZXQoIk9GRiIpKSwKKyAgICAgIG9yZGVyOiBwYXJzZU9yZGVyKGNvbmZpZy5nZXQoIk9yZGVyIikpLAorICAgICAgZ3JvdXBzOiBudWxsCisgICAgfTsKKyAgfQorCisgIGdldCBudW1QYWdlcygpIHsKKyAgICBjb25zdCBvYmogPSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldCgiQ291bnQiKTsKKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhZ2UgY291bnQgaW4gdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkgaXMgbm90IGFuIGludGVnZXIuIik7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJudW1QYWdlcyIsIG9iaik7CisgIH0KKworICBnZXQgZGVzdGluYXRpb25zKCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX3JlYWREZXN0cygpLAorICAgICAgICAgIGRlc3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lVHJlZSkgeworICAgICAgY29uc3QgbmFtZXMgPSBvYmouZ2V0QWxsKCk7CisKKyAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lcykgeworICAgICAgICBkZXN0c1tuYW1lXSA9IGZldGNoRGVzdGluYXRpb24obmFtZXNbbmFtZV0pOworICAgICAgfQorICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgeworICAgICAgb2JqLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgZGVzdHNba2V5XSA9IGZldGNoRGVzdGluYXRpb24odmFsdWUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRlc3RpbmF0aW9ucyIsIGRlc3RzKTsKKyAgfQorCisgIGdldERlc3RpbmF0aW9uKGRlc3RpbmF0aW9uSWQpIHsKKyAgICBjb25zdCBvYmogPSB0aGlzLl9yZWFkRGVzdHMoKTsKKworICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lVHJlZSB8fCBvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CisgICAgICByZXR1cm4gZmV0Y2hEZXN0aW5hdGlvbihvYmouZ2V0KGRlc3RpbmF0aW9uSWQpIHx8IG51bGwpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgX3JlYWREZXN0cygpIHsKKyAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKKworICAgIGlmIChvYmogJiYgb2JqLmhhcygiRGVzdHMiKSkgeworICAgICAgcmV0dXJuIG5ldyBOYW1lVHJlZShvYmouZ2V0UmF3KCJEZXN0cyIpLCB0aGlzLnhyZWYpOworICAgIH0gZWxzZSBpZiAodGhpcy5fY2F0RGljdC5oYXMoIkRlc3RzIikpIHsKKyAgICAgIHJldHVybiB0aGlzLl9jYXREaWN0LmdldCgiRGVzdHMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gdW5kZWZpbmVkOworICB9CisKKyAgZ2V0IHBhZ2VMYWJlbHMoKSB7CisgICAgbGV0IG9iaiA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgb2JqID0gdGhpcy5fcmVhZFBhZ2VMYWJlbHMoKTsKKyAgICB9IGNhdGNoIChleCkgeworICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgZXg7CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5hYmxlIHRvIHJlYWQgcGFnZSBsYWJlbHMuIik7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJwYWdlTGFiZWxzIiwgb2JqKTsKKyAgfQorCisgIF9yZWFkUGFnZUxhYmVscygpIHsKKyAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZUxhYmVscyIpOworCisgICAgaWYgKCFvYmopIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IHBhZ2VMYWJlbHMgPSBuZXcgQXJyYXkodGhpcy5udW1QYWdlcyk7CisgICAgbGV0IHN0eWxlID0gbnVsbCwKKyAgICAgICAgcHJlZml4ID0gIiI7CisgICAgY29uc3QgbnVtYmVyVHJlZSA9IG5ldyBOdW1iZXJUcmVlKG9iaiwgdGhpcy54cmVmKTsKKyAgICBjb25zdCBudW1zID0gbnVtYmVyVHJlZS5nZXRBbGwoKTsKKyAgICBsZXQgY3VycmVudExhYmVsID0gIiIsCisgICAgICAgIGN1cnJlbnRJbmRleCA9IDE7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLm51bVBhZ2VzOyBpIDwgaWk7IGkrKykgeworICAgICAgaWYgKGkgaW4gbnVtcykgeworICAgICAgICBjb25zdCBsYWJlbERpY3QgPSBudW1zW2ldOworCisgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobGFiZWxEaWN0KSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZUxhYmVsIGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFiZWxEaWN0LmhhcygiVHlwZSIpICYmICEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShsYWJlbERpY3QuZ2V0KCJUeXBlIiksICJQYWdlTGFiZWwiKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCB0eXBlIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlMiKSkgeworICAgICAgICAgIGNvbnN0IHMgPSBsYWJlbERpY3QuZ2V0KCJTIik7CisKKyAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgc3R5bGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3R5bGUgPSBzLm5hbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3R5bGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlAiKSkgeworICAgICAgICAgIGNvbnN0IHAgPSBsYWJlbERpY3QuZ2V0KCJQIik7CisKKyAgICAgICAgICBpZiAoISgwLCBfdXRpbC5pc1N0cmluZykocCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBwcmVmaXggaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHJlZml4ID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmVmaXggPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJTdCIpKSB7CisgICAgICAgICAgY29uc3Qgc3QgPSBsYWJlbERpY3QuZ2V0KCJTdCIpOworCisgICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihzdCkgJiYgc3QgPj0gMSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBzdGFydCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjdXJyZW50SW5kZXggPSBzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdXJyZW50SW5kZXggPSAxOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoc3R5bGUpIHsKKyAgICAgICAgY2FzZSAiRCI6CisgICAgICAgICAgY3VycmVudExhYmVsID0gY3VycmVudEluZGV4OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIlIiOgorICAgICAgICBjYXNlICJyIjoKKyAgICAgICAgICBjdXJyZW50TGFiZWwgPSAoMCwgX2NvcmVfdXRpbHMudG9Sb21hbk51bWVyYWxzKShjdXJyZW50SW5kZXgsIHN0eWxlID09PSAiciIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIkEiOgorICAgICAgICBjYXNlICJhIjoKKyAgICAgICAgICBjb25zdCBMSU1JVCA9IDI2OworICAgICAgICAgIGNvbnN0IEFfVVBQRVJfQ0FTRSA9IDB4NDEsCisgICAgICAgICAgICAgICAgQV9MT1dFUl9DQVNFID0gMHg2MTsKKyAgICAgICAgICBjb25zdCBiYXNlQ2hhckNvZGUgPSBzdHlsZSA9PT0gImEiID8gQV9MT1dFUl9DQVNFIDogQV9VUFBFUl9DQVNFOworICAgICAgICAgIGNvbnN0IGxldHRlckluZGV4ID0gY3VycmVudEluZGV4IC0gMTsKKyAgICAgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJhc2VDaGFyQ29kZSArIGxldHRlckluZGV4ICUgTElNSVQpOworICAgICAgICAgIGNvbnN0IGNoYXJCdWYgPSBbXTsKKworICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IGxldHRlckluZGV4IC8gTElNSVQgfCAwOyBqIDw9IGpqOyBqKyspIHsKKyAgICAgICAgICAgIGNoYXJCdWYucHVzaChjaGFyYWN0ZXIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IGNoYXJCdWYuam9pbigiIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoc3R5bGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBzdHlsZSAiJHtzdHlsZX0iIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LmApOworICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnRMYWJlbCA9ICIiOworICAgICAgfQorCisgICAgICBwYWdlTGFiZWxzW2ldID0gcHJlZml4ICsgY3VycmVudExhYmVsOworICAgICAgY3VycmVudEluZGV4Kys7CisgICAgfQorCisgICAgcmV0dXJuIHBhZ2VMYWJlbHM7CisgIH0KKworICBnZXQgcGFnZUxheW91dCgpIHsKKyAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpOworCisgICAgbGV0IHBhZ2VMYXlvdXQgPSAiIjsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShvYmopKSB7CisgICAgICBzd2l0Y2ggKG9iai5uYW1lKSB7CisgICAgICAgIGNhc2UgIlNpbmdsZVBhZ2UiOgorICAgICAgICBjYXNlICJPbmVDb2x1bW4iOgorICAgICAgICBjYXNlICJUd29Db2x1bW5MZWZ0IjoKKyAgICAgICAgY2FzZSAiVHdvQ29sdW1uUmlnaHQiOgorICAgICAgICBjYXNlICJUd29QYWdlTGVmdCI6CisgICAgICAgIGNhc2UgIlR3b1BhZ2VSaWdodCI6CisgICAgICAgICAgcGFnZUxheW91dCA9IG9iai5uYW1lOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAicGFnZUxheW91dCIsIHBhZ2VMYXlvdXQpOworICB9CisKKyAgZ2V0IHBhZ2VNb2RlKCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlTW9kZSIpOworCisgICAgbGV0IHBhZ2VNb2RlID0gIlVzZU5vbmUiOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG9iaikpIHsKKyAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKKyAgICAgICAgY2FzZSAiVXNlTm9uZSI6CisgICAgICAgIGNhc2UgIlVzZU91dGxpbmVzIjoKKyAgICAgICAgY2FzZSAiVXNlVGh1bWJzIjoKKyAgICAgICAgY2FzZSAiRnVsbFNjcmVlbiI6CisgICAgICAgIGNhc2UgIlVzZU9DIjoKKyAgICAgICAgY2FzZSAiVXNlQXR0YWNobWVudHMiOgorICAgICAgICAgIHBhZ2VNb2RlID0gb2JqLm5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJwYWdlTW9kZSIsIHBhZ2VNb2RlKTsKKyAgfQorCisgIGdldCB2aWV3ZXJQcmVmZXJlbmNlcygpIHsKKyAgICBjb25zdCBWaWV3ZXJQcmVmZXJlbmNlc1ZhbGlkYXRvcnMgPSB7CisgICAgICBIaWRlVG9vbGJhcjogX3V0aWwuaXNCb29sLAorICAgICAgSGlkZU1lbnViYXI6IF91dGlsLmlzQm9vbCwKKyAgICAgIEhpZGVXaW5kb3dVSTogX3V0aWwuaXNCb29sLAorICAgICAgRml0V2luZG93OiBfdXRpbC5pc0Jvb2wsCisgICAgICBDZW50ZXJXaW5kb3c6IF91dGlsLmlzQm9vbCwKKyAgICAgIERpc3BsYXlEb2NUaXRsZTogX3V0aWwuaXNCb29sLAorICAgICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlOiBfcHJpbWl0aXZlcy5pc05hbWUsCisgICAgICBEaXJlY3Rpb246IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgIFZpZXdBcmVhOiBfcHJpbWl0aXZlcy5pc05hbWUsCisgICAgICBWaWV3Q2xpcDogX3ByaW1pdGl2ZXMuaXNOYW1lLAorICAgICAgUHJpbnRBcmVhOiBfcHJpbWl0aXZlcy5pc05hbWUsCisgICAgICBQcmludENsaXA6IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgIFByaW50U2NhbGluZzogX3ByaW1pdGl2ZXMuaXNOYW1lLAorICAgICAgRHVwbGV4OiBfcHJpbWl0aXZlcy5pc05hbWUsCisgICAgICBQaWNrVHJheUJ5UERGU2l6ZTogX3V0aWwuaXNCb29sLAorICAgICAgUHJpbnRQYWdlUmFuZ2U6IEFycmF5LmlzQXJyYXksCisgICAgICBOdW1Db3BpZXM6IE51bWJlci5pc0ludGVnZXIKKyAgICB9OworCisgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIlZpZXdlclByZWZlcmVuY2VzIik7CisKKyAgICBsZXQgcHJlZnMgPSBudWxsOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaikpIHsKKyAgICAgIGZvciAoY29uc3Qga2V5IGluIFZpZXdlclByZWZlcmVuY2VzVmFsaWRhdG9ycykgeworICAgICAgICBpZiAoIW9iai5oYXMoa2V5KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdmFsdWUgPSBvYmouZ2V0KGtleSk7CisKKyAgICAgICAgaWYgKCFWaWV3ZXJQcmVmZXJlbmNlc1ZhbGlkYXRvcnNba2V5XSh2YWx1ZSkpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoYEJhZCB2YWx1ZSBpbiBWaWV3ZXJQcmVmZXJlbmNlcyBmb3IgIiR7a2V5fSIuYCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZXQgcHJlZlZhbHVlOworCisgICAgICAgIHN3aXRjaCAoa2V5KSB7CisgICAgICAgICAgY2FzZSAiTm9uRnVsbFNjcmVlblBhZ2VNb2RlIjoKKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgeworICAgICAgICAgICAgICBjYXNlICJVc2VOb25lIjoKKyAgICAgICAgICAgICAgY2FzZSAiVXNlT3V0bGluZXMiOgorICAgICAgICAgICAgICBjYXNlICJVc2VUaHVtYnMiOgorICAgICAgICAgICAgICBjYXNlICJVc2VPQyI6CisgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJVc2VOb25lIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJEaXJlY3Rpb24iOgorICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CisgICAgICAgICAgICAgIGNhc2UgIkwyUiI6CisgICAgICAgICAgICAgIGNhc2UgIlIyTCI6CisgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJMMlIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlZpZXdBcmVhIjoKKyAgICAgICAgICBjYXNlICJWaWV3Q2xpcCI6CisgICAgICAgICAgY2FzZSAiUHJpbnRBcmVhIjoKKyAgICAgICAgICBjYXNlICJQcmludENsaXAiOgorICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CisgICAgICAgICAgICAgIGNhc2UgIk1lZGlhQm94IjoKKyAgICAgICAgICAgICAgY2FzZSAiQ3JvcEJveCI6CisgICAgICAgICAgICAgIGNhc2UgIkJsZWVkQm94IjoKKyAgICAgICAgICAgICAgY2FzZSAiVHJpbUJveCI6CisgICAgICAgICAgICAgIGNhc2UgIkFydEJveCI6CisgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJDcm9wQm94IjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJQcmludFNjYWxpbmciOgorICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CisgICAgICAgICAgICAgIGNhc2UgIk5vbmUiOgorICAgICAgICAgICAgICBjYXNlICJBcHBEZWZhdWx0IjoKKyAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIkFwcERlZmF1bHQiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkR1cGxleCI6CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKKyAgICAgICAgICAgICAgY2FzZSAiU2ltcGxleCI6CisgICAgICAgICAgICAgIGNhc2UgIkR1cGxleEZsaXBTaG9ydEVkZ2UiOgorICAgICAgICAgICAgICBjYXNlICJEdXBsZXhGbGlwTG9uZ0VkZ2UiOgorICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiTm9uZSI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiUHJpbnRQYWdlUmFuZ2UiOgorICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoOworCisgICAgICAgICAgICBpZiAobGVuZ3RoICUgMiAhPT0gMCkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IHZhbHVlLmV2ZXJ5KChwYWdlLCBpLCBhcnIpID0+IHsKKyAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGFnZSkgJiYgcGFnZSA+IDAgJiYgKGkgPT09IDAgfHwgcGFnZSA+PSBhcnJbaSAtIDFdKSAmJiBwYWdlIDw9IHRoaXMubnVtUGFnZXM7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHsKKyAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiTnVtQ29waWVzIjoKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJib29sZWFuIikgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYHZpZXdlclByZWZlcmVuY2VzIC0gZXhwZWN0ZWQgYSBib29sZWFuIHZhbHVlIGZvcjogJHtrZXl9YCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZWZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgaWYgKCFwcmVmcykgeworICAgICAgICAgICAgcHJlZnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICAgIH0KKworICAgICAgICAgIHByZWZzW2tleV0gPSBwcmVmVmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBCYWQgdmFsdWUgaW4gVmlld2VyUHJlZmVyZW5jZXMgZm9yICIke2tleX0iLmApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ2aWV3ZXJQcmVmZXJlbmNlcyIsIHByZWZzKTsKKyAgfQorCisgIGdldCBvcGVuQWN0aW9uKCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIik7CisKKyAgICBsZXQgb3BlbkFjdGlvbiA9IG51bGw7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSkgeworICAgICAgY29uc3QgZGVzdERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOworICAgICAgZGVzdERpY3Quc2V0KCJBIiwgb2JqKTsKKyAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IHsKKyAgICAgICAgdXJsOiBudWxsLAorICAgICAgICBkZXN0OiBudWxsLAorICAgICAgICBhY3Rpb246IG51bGwKKyAgICAgIH07CisgICAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoeworICAgICAgICBkZXN0RGljdCwKKyAgICAgICAgcmVzdWx0T2JqCisgICAgICB9KTsKKworICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0T2JqLmRlc3QpKSB7CisgICAgICAgIGlmICghb3BlbkFjdGlvbikgeworICAgICAgICAgIG9wZW5BY3Rpb24gPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgb3BlbkFjdGlvbi5kZXN0ID0gcmVzdWx0T2JqLmRlc3Q7CisgICAgICB9IGVsc2UgaWYgKHJlc3VsdE9iai5hY3Rpb24pIHsKKyAgICAgICAgaWYgKCFvcGVuQWN0aW9uKSB7CisgICAgICAgICAgb3BlbkFjdGlvbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBvcGVuQWN0aW9uLmFjdGlvbiA9IHJlc3VsdE9iai5hY3Rpb247CisgICAgICB9CisgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHsKKyAgICAgIGlmICghb3BlbkFjdGlvbikgeworICAgICAgICBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIH0KKworICAgICAgb3BlbkFjdGlvbi5kZXN0ID0gb2JqOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3BlbkFjdGlvbiIsIG9wZW5BY3Rpb24pOworICB9CisKKyAgZ2V0IGF0dGFjaG1lbnRzKCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOworCisgICAgbGV0IGF0dGFjaG1lbnRzID0gbnVsbDsKKworICAgIGlmIChvYmogJiYgb2JqLmhhcygiRW1iZWRkZWRGaWxlcyIpKSB7CisgICAgICBjb25zdCBuYW1lVHJlZSA9IG5ldyBOYW1lVHJlZShvYmouZ2V0UmF3KCJFbWJlZGRlZEZpbGVzIiksIHRoaXMueHJlZik7CisgICAgICBjb25zdCBuYW1lcyA9IG5hbWVUcmVlLmdldEFsbCgpOworCisgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbmFtZXMpIHsKKyAgICAgICAgY29uc3QgZnMgPSBuZXcgRmlsZVNwZWMobmFtZXNbbmFtZV0sIHRoaXMueHJlZik7CisKKyAgICAgICAgaWYgKCFhdHRhY2htZW50cykgeworICAgICAgICAgIGF0dGFjaG1lbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGF0dGFjaG1lbnRzWygwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykobmFtZSldID0gZnMuc2VyaWFsaXphYmxlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYXR0YWNobWVudHMiLCBhdHRhY2htZW50cyk7CisgIH0KKworICBnZXQgamF2YVNjcmlwdCgpIHsKKyAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKKworICAgIGxldCBqYXZhU2NyaXB0ID0gbnVsbDsKKworICAgIGZ1bmN0aW9uIGFwcGVuZElmSmF2YVNjcmlwdERpY3QoanNEaWN0KSB7CisgICAgICBjb25zdCB0eXBlID0ganNEaWN0LmdldCgiUyIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUsICJKYXZhU2NyaXB0IikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBsZXQganMgPSBqc0RpY3QuZ2V0KCJKUyIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShqcykpIHsKKyAgICAgICAganMgPSAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoanMuZ2V0Qnl0ZXMoKSk7CisgICAgICB9IGVsc2UgaWYgKCEoMCwgX3V0aWwuaXNTdHJpbmcpKGpzKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICghamF2YVNjcmlwdCkgeworICAgICAgICBqYXZhU2NyaXB0ID0gW107CisgICAgICB9CisKKyAgICAgIGphdmFTY3JpcHQucHVzaCgoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGpzKSk7CisgICAgfQorCisgICAgaWYgKG9iaiAmJiBvYmouaGFzKCJKYXZhU2NyaXB0IikpIHsKKyAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIkphdmFTY3JpcHQiKSwgdGhpcy54cmVmKTsKKyAgICAgIGNvbnN0IG5hbWVzID0gbmFtZVRyZWUuZ2V0QWxsKCk7CisKKyAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lcykgeworICAgICAgICBjb25zdCBqc0RpY3QgPSBuYW1lc1tuYW1lXTsKKworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoanNEaWN0KSkgeworICAgICAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3QoanNEaWN0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IG9wZW5BY3Rpb24gPSB0aGlzLl9jYXREaWN0LmdldCgiT3BlbkFjdGlvbiIpOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9wZW5BY3Rpb24pICYmICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG9wZW5BY3Rpb24uZ2V0KCJTIiksICJKYXZhU2NyaXB0IikpIHsKKyAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3Qob3BlbkFjdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJqYXZhU2NyaXB0IiwgamF2YVNjcmlwdCk7CisgIH0KKworICBmb250RmFsbGJhY2soaWQsIGhhbmRsZXIpIHsKKyAgICBjb25zdCBwcm9taXNlcyA9IFtdOworICAgIHRoaXMuZm9udENhY2hlLmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UpIHsKKyAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZSk7CisgICAgfSk7CisgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKHRyYW5zbGF0ZWRGb250cyA9PiB7CisgICAgICBmb3IgKGNvbnN0IHRyYW5zbGF0ZWRGb250IG9mIHRyYW5zbGF0ZWRGb250cykgeworICAgICAgICBpZiAodHJhbnNsYXRlZEZvbnQubG9hZGVkTmFtZSA9PT0gaWQpIHsKKyAgICAgICAgICB0cmFuc2xhdGVkRm9udC5mYWxsYmFjayhoYW5kbGVyKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgeworICAgICgwLCBfcHJpbWl0aXZlcy5jbGVhclByaW1pdGl2ZUNhY2hlcykoKTsKKyAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIobWFudWFsbHlUcmlnZ2VyZWQpOworICAgIHRoaXMucGFnZUtpZHNDb3VudENhY2hlLmNsZWFyKCk7CisgICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKKyAgICB0aGlzLmZvbnRDYWNoZS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9taXNlKSB7CisgICAgICBwcm9taXNlcy5wdXNoKHByb21pc2UpOworICAgIH0pOworICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbih0cmFuc2xhdGVkRm9udHMgPT4geworICAgICAgZm9yIChjb25zdCB7CisgICAgICAgIGRpY3QKKyAgICAgIH0gb2YgdHJhbnNsYXRlZEZvbnRzKSB7CisgICAgICAgIGRlbGV0ZSBkaWN0LnRyYW5zbGF0ZWQ7CisgICAgICB9CisKKyAgICAgIHRoaXMuZm9udENhY2hlLmNsZWFyKCk7CisgICAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuY2xlYXIoKTsKKyAgICB9KTsKKyAgfQorCisgIGdldFBhZ2VEaWN0KHBhZ2VJbmRleCkgeworICAgIGNvbnN0IGNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgY29uc3Qgbm9kZXNUb1Zpc2l0ID0gW3RoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpXTsKKyAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CisgICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKKyAgICAgICAgICBwYWdlS2lkc0NvdW50Q2FjaGUgPSB0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZTsKKyAgICBsZXQgY291bnQsCisgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggPSAwOworCisgICAgZnVuY3Rpb24gbmV4dCgpIHsKKyAgICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CisgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGN1cnJlbnROb2RlKSkgeworICAgICAgICAgIGNvdW50ID0gcGFnZUtpZHNDb3VudENhY2hlLmdldChjdXJyZW50Tm9kZSk7CisKKyAgICAgICAgICBpZiAoY291bnQgPiAwICYmIGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8IHBhZ2VJbmRleCkgeworICAgICAgICAgICAgY3VycmVudFBhZ2VJbmRleCArPSBjb3VudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh2aXNpdGVkTm9kZXMuaGFzKGN1cnJlbnROb2RlKSkgeworICAgICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3QobmV3IF91dGlsLkZvcm1hdEVycm9yKCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgdmlzaXRlZE5vZGVzLnB1dChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgeHJlZi5mZXRjaEFzeW5jKGN1cnJlbnROb2RlKS50aGVuKGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmosICJQYWdlIikgfHwgKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSAmJiAhb2JqLmhhcygiS2lkcyIpKSB7CisgICAgICAgICAgICAgIGlmIChwYWdlSW5kZXggPT09IGN1cnJlbnRQYWdlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUgJiYgIXBhZ2VLaWRzQ291bnRDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CisgICAgICAgICAgICAgICAgICBwYWdlS2lkc0NvdW50Q2FjaGUucHV0KGN1cnJlbnROb2RlLCAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoW29iaiwgY3VycmVudE5vZGVdKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CisgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChvYmopOworICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgIH0sIGNhcGFiaWxpdHkucmVqZWN0KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGN1cnJlbnROb2RlKSkgeworICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb3VudCA9IGN1cnJlbnROb2RlLmdldCgiQ291bnQiKTsKKworICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgJiYgY291bnQgPj0gMCkgeworICAgICAgICAgIGNvbnN0IG9iaklkID0gY3VycmVudE5vZGUub2JqSWQ7CisKKyAgICAgICAgICBpZiAob2JqSWQgJiYgIXBhZ2VLaWRzQ291bnRDYWNoZS5oYXMob2JqSWQpKSB7CisgICAgICAgICAgICBwYWdlS2lkc0NvdW50Q2FjaGUucHV0KG9iaklkLCBjb3VudCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKKyAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBraWRzID0gY3VycmVudE5vZGUuZ2V0KCJLaWRzIik7CisKKyAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGN1cnJlbnROb2RlLmdldCgiVHlwZSIpLCAiUGFnZSIpIHx8ICFjdXJyZW50Tm9kZS5oYXMoIlR5cGUiKSAmJiBjdXJyZW50Tm9kZS5oYXMoIkNvbnRlbnRzIikpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ID09PSBwYWdlSW5kZXgpIHsKKyAgICAgICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKFtjdXJyZW50Tm9kZSwgbnVsbF0pOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXgrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS4iKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChsZXQgbGFzdCA9IGtpZHMubGVuZ3RoIC0gMTsgbGFzdCA+PSAwOyBsYXN0LS0pIHsKKyAgICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChraWRzW2xhc3RdKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoYFBhZ2UgaW5kZXggJHtwYWdlSW5kZXh9IG5vdCBmb3VuZC5gKSk7CisgICAgfQorCisgICAgbmV4dCgpOworICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBnZXRQYWdlSW5kZXgocGFnZVJlZikgeworICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CisKKyAgICBmdW5jdGlvbiBwYWdlc0JlZm9yZVJlZihraWRSZWYpIHsKKyAgICAgIGxldCB0b3RhbCA9IDAsCisgICAgICAgICAgcGFyZW50UmVmOworICAgICAgcmV0dXJuIHhyZWYuZmV0Y2hBc3luYyhraWRSZWYpLnRoZW4oZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZnNFcXVhbCkoa2lkUmVmLCBwYWdlUmVmKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9kZSwgIlBhZ2UiKSAmJiAhKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG5vZGUpICYmICFub2RlLmhhcygiVHlwZSIpICYmIG5vZGUuaGFzKCJDb250ZW50cyIpKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVGhlIHJlZmVyZW5jZSBkb2VzIG5vdCBwb2ludCB0byBhIC9QYWdlIGRpY3Rpb25hcnkuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9kZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vZGUgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgIH0KKworICAgICAgICBwYXJlbnRSZWYgPSBub2RlLmdldFJhdygiUGFyZW50Iik7CisgICAgICAgIHJldHVybiBub2RlLmdldEFzeW5jKCJQYXJlbnQiKTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHBhcmVudCkgeworICAgICAgICBpZiAoIXBhcmVudCkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShwYXJlbnQpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJQYXJlbnQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyZW50LmdldEFzeW5jKCJLaWRzIik7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChraWRzKSB7CisgICAgICAgIGlmICgha2lkcykgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qga2lkUHJvbWlzZXMgPSBbXTsKKyAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0ga2lkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgY29uc3Qga2lkID0ga2lkc1tpXTsKKworICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzUmVmKShraWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIktpZCBtdXN0IGJlIGEgcmVmZXJlbmNlLiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWZzRXF1YWwpKGtpZCwga2lkUmVmKSkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAga2lkUHJvbWlzZXMucHVzaCh4cmVmLmZldGNoQXN5bmMoa2lkKS50aGVuKGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIktpZCBub2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2JqLmhhcygiQ291bnQiKSkgeworICAgICAgICAgICAgICB0b3RhbCArPSBvYmouZ2V0KCJDb3VudCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJLaWQgcmVmZXJlbmNlIG5vdCBmb3VuZCBpbiBwYXJlbnQncyBraWRzLiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGtpZFByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXR1cm4gW3RvdGFsLCBwYXJlbnRSZWZdOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKworICAgIGxldCB0b3RhbCA9IDA7CisKKyAgICBmdW5jdGlvbiBuZXh0KHJlZikgeworICAgICAgcmV0dXJuIHBhZ2VzQmVmb3JlUmVmKHJlZikudGhlbihmdW5jdGlvbiAoYXJncykgeworICAgICAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgICByZXR1cm4gdG90YWw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBbY291bnQsIHBhcmVudFJlZl0gPSBhcmdzOworICAgICAgICB0b3RhbCArPSBjb3VudDsKKyAgICAgICAgcmV0dXJuIG5leHQocGFyZW50UmVmKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHJldHVybiBuZXh0KHBhZ2VSZWYpOworICB9CisKKyAgc3RhdGljIHBhcnNlRGVzdERpY3Rpb25hcnkocGFyYW1zKSB7CisgICAgZnVuY3Rpb24gYWRkRGVmYXVsdFByb3RvY29sVG9VcmwodXJsKSB7CisgICAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSA/IGBodHRwOi8vJHt1cmx9YCA6IHVybDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0cnlDb252ZXJ0VXJsRW5jb2RpbmcodXJsKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gKDAsIF91dGlsLnN0cmluZ1RvVVRGOFN0cmluZykodXJsKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBkZXN0RGljdCA9IHBhcmFtcy5kZXN0RGljdDsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGVzdERpY3QpKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IGBkZXN0RGljdGAgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgcmVzdWx0T2JqID0gcGFyYW1zLnJlc3VsdE9iajsKKworICAgIGlmICh0eXBlb2YgcmVzdWx0T2JqICE9PSAib2JqZWN0IikgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgcmVzdWx0T2JqYCBtdXN0IGJlIGFuIG9iamVjdC4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBkb2NCYXNlVXJsID0gcGFyYW1zLmRvY0Jhc2VVcmwgfHwgbnVsbDsKKyAgICBsZXQgYWN0aW9uID0gZGVzdERpY3QuZ2V0KCJBIiksCisgICAgICAgIHVybCwKKyAgICAgICAgZGVzdDsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoYWN0aW9uKSAmJiBkZXN0RGljdC5oYXMoIkRlc3QiKSkgeworICAgICAgYWN0aW9uID0gZGVzdERpY3QuZ2V0KCJEZXN0Iik7CisgICAgfQorCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGFjdGlvbikpIHsKKyAgICAgIGNvbnN0IGFjdGlvblR5cGUgPSBhY3Rpb24uZ2V0KCJTIik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoYWN0aW9uVHlwZSkpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBJbnZhbGlkIHR5cGUgaW4gQWN0aW9uIGRpY3Rpb25hcnkuIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgYWN0aW9uTmFtZSA9IGFjdGlvblR5cGUubmFtZTsKKworICAgICAgc3dpdGNoIChhY3Rpb25OYW1lKSB7CisgICAgICAgIGNhc2UgIlVSSSI6CisgICAgICAgICAgdXJsID0gYWN0aW9uLmdldCgiVVJJIik7CisKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodXJsKSkgeworICAgICAgICAgICAgdXJsID0gIi8iICsgdXJsLm5hbWU7CisgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKHVybCkpIHsKKyAgICAgICAgICAgIHVybCA9IGFkZERlZmF1bHRQcm90b2NvbFRvVXJsKHVybCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiR29UbyI6CisgICAgICAgICAgZGVzdCA9IGFjdGlvbi5nZXQoIkQiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJMYXVuY2giOgorICAgICAgICBjYXNlICJHb1RvUiI6CisgICAgICAgICAgY29uc3QgdXJsRGljdCA9IGFjdGlvbi5nZXQoIkYiKTsKKworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh1cmxEaWN0KSkgeworICAgICAgICAgICAgdXJsID0gdXJsRGljdC5nZXQoIkYiKSB8fCBudWxsOworICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKSh1cmxEaWN0KSkgeworICAgICAgICAgICAgdXJsID0gdXJsRGljdDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsZXQgcmVtb3RlRGVzdCA9IGFjdGlvbi5nZXQoIkQiKTsKKworICAgICAgICAgIGlmIChyZW1vdGVEZXN0KSB7CisgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkocmVtb3RlRGVzdCkpIHsKKyAgICAgICAgICAgICAgcmVtb3RlRGVzdCA9IHJlbW90ZURlc3QubmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykodXJsKSkgeworICAgICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gdXJsLnNwbGl0KCIjIilbMF07CisKKyAgICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykocmVtb3RlRGVzdCkpIHsKKyAgICAgICAgICAgICAgICB1cmwgPSBiYXNlVXJsICsgIiMiICsgcmVtb3RlRGVzdDsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlbW90ZURlc3QpKSB7CisgICAgICAgICAgICAgICAgdXJsID0gYmFzZVVybCArICIjIiArIEpTT04uc3RyaW5naWZ5KHJlbW90ZURlc3QpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgbmV3V2luZG93ID0gYWN0aW9uLmdldCgiTmV3V2luZG93Iik7CisKKyAgICAgICAgICBpZiAoKDAsIF91dGlsLmlzQm9vbCkobmV3V2luZG93KSkgeworICAgICAgICAgICAgcmVzdWx0T2JqLm5ld1dpbmRvdyA9IG5ld1dpbmRvdzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJOYW1lZCI6CisgICAgICAgICAgY29uc3QgbmFtZWRBY3Rpb24gPSBhY3Rpb24uZ2V0KCJOIik7CisKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkobmFtZWRBY3Rpb24pKSB7CisgICAgICAgICAgICByZXN1bHRPYmouYWN0aW9uID0gbmFtZWRBY3Rpb24ubmFtZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJKYXZhU2NyaXB0IjoKKyAgICAgICAgICBjb25zdCBqc0FjdGlvbiA9IGFjdGlvbi5nZXQoIkpTIik7CisgICAgICAgICAgbGV0IGpzOworCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoanNBY3Rpb24pKSB7CisgICAgICAgICAgICBqcyA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShqc0FjdGlvbi5nZXRCeXRlcygpKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykoanNBY3Rpb24pKSB7CisgICAgICAgICAgICBqcyA9IGpzQWN0aW9uOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChqcykgeworICAgICAgICAgICAgY29uc3QgVVJMX09QRU5fTUVUSE9EUyA9IFsiYXBwLmxhdW5jaFVSTCIsICJ3aW5kb3cub3BlbiJdOworICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCJeXFxzKigiICsgVVJMX09QRU5fTUVUSE9EUy5qb2luKCJ8Iikuc3BsaXQoIi4iKS5qb2luKCJcXC4iKSArICIpXFwoKD86J3xcIikoW14nXCJdKikoPzonfFwiKSg/OixcXHMqKFxcdyspXFwpfFxcKSkiLCAiaSIpOworICAgICAgICAgICAgY29uc3QganNVcmwgPSByZWdleC5leGVjKCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoanMpKTsKKworICAgICAgICAgICAgaWYgKGpzVXJsICYmIGpzVXJsWzJdKSB7CisgICAgICAgICAgICAgIHVybCA9IGpzVXJsWzJdOworCisgICAgICAgICAgICAgIGlmIChqc1VybFszXSA9PT0gInRydWUiICYmIGpzVXJsWzFdID09PSAiYXBwLmxhdW5jaFVSTCIpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgcGFyc2VEZXN0RGljdGlvbmFyeTogdW5zdXBwb3J0ZWQgYWN0aW9uIHR5cGUgIiR7YWN0aW9uTmFtZX0iLmApOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGVzdERpY3QuaGFzKCJEZXN0IikpIHsKKyAgICAgIGRlc3QgPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKKyAgICB9CisKKyAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKSh1cmwpKSB7CisgICAgICB1cmwgPSB0cnlDb252ZXJ0VXJsRW5jb2RpbmcodXJsKTsKKyAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKHVybCwgZG9jQmFzZVVybCk7CisKKyAgICAgIGlmIChhYnNvbHV0ZVVybCkgeworICAgICAgICByZXN1bHRPYmoudXJsID0gYWJzb2x1dGVVcmwuaHJlZjsKKyAgICAgIH0KKworICAgICAgcmVzdWx0T2JqLnVuc2FmZVVybCA9IHVybDsKKyAgICB9CisKKyAgICBpZiAoZGVzdCkgeworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGRlc3QpKSB7CisgICAgICAgIGRlc3QgPSBkZXN0Lm5hbWU7CisgICAgICB9CisKKyAgICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKGRlc3QpIHx8IEFycmF5LmlzQXJyYXkoZGVzdCkpIHsKKyAgICAgICAgcmVzdWx0T2JqLmRlc3QgPSBkZXN0OworICAgICAgfQorICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuQ2F0YWxvZyA9IENhdGFsb2c7CisKK3ZhciBYUmVmID0gZnVuY3Rpb24gWFJlZkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKSB7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKKyAgICB0aGlzLmVudHJpZXMgPSBbXTsKKyAgICB0aGlzLnhyZWZzdG1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLl9jYWNoZU1hcCA9IG5ldyBNYXAoKTsKKyAgICB0aGlzLnN0YXRzID0geworICAgICAgc3RyZWFtVHlwZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCisgICAgICBmb250VHlwZXM6IE9iamVjdC5jcmVhdGUobnVsbCkKKyAgICB9OworICAgIHRoaXMuX25ld1JlZk51bSA9IG51bGw7CisgIH0KKworICBYUmVmLnByb3RvdHlwZSA9IHsKKyAgICBnZXROZXdSZWY6IGZ1bmN0aW9uIFhSZWZfZ2V0TmV3UmVmKCkgeworICAgICAgaWYgKHRoaXMuX25ld1JlZk51bSA9PT0gbnVsbCkgeworICAgICAgICB0aGlzLl9uZXdSZWZOdW0gPSB0aGlzLmVudHJpZXMubGVuZ3RoOworICAgICAgfQorCisgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuUmVmLmdldCh0aGlzLl9uZXdSZWZOdW0rKywgMCk7CisgICAgfSwKKyAgICByZXNldE5ld1JlZjogZnVuY3Rpb24gWFJlZl9yZXNldE5ld1JlZigpIHsKKyAgICAgIHRoaXMuX25ld1JlZk51bSA9IG51bGw7CisgICAgfSwKKyAgICBzZXRTdGFydFhSZWY6IGZ1bmN0aW9uIFhSZWZfc2V0U3RhcnRYUmVmKHN0YXJ0WFJlZikgeworICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZSA9IFtzdGFydFhSZWZdOworICAgIH0sCisgICAgcGFyc2U6IGZ1bmN0aW9uIFhSZWZfcGFyc2UocmVjb3ZlcnlNb2RlKSB7CisgICAgICB2YXIgdHJhaWxlckRpY3Q7CisKKyAgICAgIGlmICghcmVjb3ZlcnlNb2RlKSB7CisgICAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5yZWFkWFJlZigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbmRleGluZyBhbGwgUERGIG9iamVjdHMiKTsKKyAgICAgICAgdHJhaWxlckRpY3QgPSB0aGlzLmluZGV4T2JqZWN0cygpOworICAgICAgfQorCisgICAgICB0cmFpbGVyRGljdC5hc3NpZ25YcmVmKHRoaXMpOworICAgICAgdGhpcy50cmFpbGVyID0gdHJhaWxlckRpY3Q7CisgICAgICBsZXQgZW5jcnlwdDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZW5jcnlwdCA9IHRyYWlsZXJEaWN0LmdldCgiRW5jcnlwdCIpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKShgWFJlZi5wYXJzZSAtIEludmFsaWQgIkVuY3J5cHQiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGVuY3J5cHQpKSB7CisgICAgICAgIHZhciBpZHMgPSB0cmFpbGVyRGljdC5nZXQoIklEIik7CisgICAgICAgIHZhciBmaWxlSWQgPSBpZHMgJiYgaWRzLmxlbmd0aCA/IGlkc1swXSA6ICIiOworICAgICAgICBlbmNyeXB0LnN1cHByZXNzRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgIHRoaXMuZW5jcnlwdCA9IG5ldyBfY3J5cHRvLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkoZW5jcnlwdCwgZmlsZUlkLCB0aGlzLnBkZk1hbmFnZXIucGFzc3dvcmQpOworICAgICAgfQorCisgICAgICBsZXQgcm9vdDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgcm9vdCA9IHRyYWlsZXJEaWN0LmdldCgiUm9vdCIpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKShgWFJlZi5wYXJzZSAtIEludmFsaWQgIlJvb3QiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHJvb3QpICYmIHJvb3QuaGFzKCJQYWdlcyIpKSB7CisgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXJlY292ZXJ5TW9kZSkgeworICAgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCByb290IHJlZmVyZW5jZSIpOworICAgICAgfQorICAgIH0sCisgICAgcHJvY2Vzc1hSZWZUYWJsZTogZnVuY3Rpb24gWFJlZl9wcm9jZXNzWFJlZlRhYmxlKHBhcnNlcikgeworICAgICAgaWYgKCEoInRhYmxlU3RhdGUiIGluIHRoaXMpKSB7CisgICAgICAgIHRoaXMudGFibGVTdGF0ZSA9IHsKKyAgICAgICAgICBlbnRyeU51bTogMCwKKyAgICAgICAgICBzdHJlYW1Qb3M6IHBhcnNlci5sZXhlci5zdHJlYW0ucG9zLAorICAgICAgICAgIHBhcnNlckJ1ZjE6IHBhcnNlci5idWYxLAorICAgICAgICAgIHBhcnNlckJ1ZjI6IHBhcnNlci5idWYyCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHZhciBvYmogPSB0aGlzLnJlYWRYUmVmVGFibGUocGFyc2VyKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgInRyYWlsZXIiKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogY291bGQgbm90IGZpbmQgdHJhaWxlciBkaWN0aW9uYXJ5Iik7CisgICAgICB9CisKKyAgICAgIHZhciBkaWN0ID0gcGFyc2VyLmdldE9iaigpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QpICYmIGRpY3QuZGljdCkgeworICAgICAgICBkaWN0ID0gZGljdC5kaWN0OworICAgICAgfQorCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgcGFyc2UgdHJhaWxlciBkaWN0aW9uYXJ5Iik7CisgICAgICB9CisKKyAgICAgIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGU7CisgICAgICByZXR1cm4gZGljdDsKKyAgICB9LAorICAgIHJlYWRYUmVmVGFibGU6IGZ1bmN0aW9uIFhSZWZfcmVhZFhSZWZUYWJsZShwYXJzZXIpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBwYXJzZXIubGV4ZXIuc3RyZWFtOworICAgICAgdmFyIHRhYmxlU3RhdGUgPSB0aGlzLnRhYmxlU3RhdGU7CisgICAgICBzdHJlYW0ucG9zID0gdGFibGVTdGF0ZS5zdHJlYW1Qb3M7CisgICAgICBwYXJzZXIuYnVmMSA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMTsKKyAgICAgIHBhcnNlci5idWYyID0gdGFibGVTdGF0ZS5wYXJzZXJCdWYyOworICAgICAgdmFyIG9iajsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKCEoImZpcnN0RW50cnlOdW0iIGluIHRhYmxlU3RhdGUpIHx8ICEoImVudHJ5Q291bnQiIGluIHRhYmxlU3RhdGUpKSB7CisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqID0gcGFyc2VyLmdldE9iaigpLCAidHJhaWxlciIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW0gPSBvYmo7CisgICAgICAgICAgdGFibGVTdGF0ZS5lbnRyeUNvdW50ID0gcGFyc2VyLmdldE9iaigpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZpcnN0ID0gdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtOworICAgICAgICB2YXIgY291bnQgPSB0YWJsZVN0YXRlLmVudHJ5Q291bnQ7CisKKyAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihjb3VudCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogd3JvbmcgdHlwZXMgaW4gc3Vic2VjdGlvbiBoZWFkZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIGkgPSB0YWJsZVN0YXRlLmVudHJ5TnVtOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgICB0YWJsZVN0YXRlLmVudHJ5TnVtID0gaTsKKyAgICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjEgPSBwYXJzZXIuYnVmMTsKKyAgICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjIgPSBwYXJzZXIuYnVmMjsKKyAgICAgICAgICB2YXIgZW50cnkgPSB7fTsKKyAgICAgICAgICBlbnRyeS5vZmZzZXQgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgICAgICAgZW50cnkuZ2VuID0gcGFyc2VyLmdldE9iaigpOworICAgICAgICAgIHZhciB0eXBlID0gcGFyc2VyLmdldE9iaigpOworCisgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZS5jbWQpIHsKKyAgICAgICAgICAgICAgY2FzZSAiZiI6CisgICAgICAgICAgICAgICAgZW50cnkuZnJlZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAibiI6CisgICAgICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZW50cnkub2Zmc2V0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihlbnRyeS5nZW4pIHx8ICEoZW50cnkuZnJlZSB8fCBlbnRyeS51bmNvbXByZXNzZWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgZW50cnkgaW4gWFJlZiBzdWJzZWN0aW9uOiAke2ZpcnN0fSwgJHtjb3VudH1gKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBlbnRyeS5mcmVlICYmIGZpcnN0ID09PSAxKSB7CisgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNbaSArIGZpcnN0XSkgeworICAgICAgICAgICAgdGhpcy5lbnRyaWVzW2kgKyBmaXJzdF0gPSBlbnRyeTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0YWJsZVN0YXRlLmVudHJ5TnVtID0gMDsKKyAgICAgICAgdGFibGVTdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOworICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjEgPSBwYXJzZXIuYnVmMTsKKyAgICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYyID0gcGFyc2VyLmJ1ZjI7CisgICAgICAgIGRlbGV0ZSB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW07CisgICAgICAgIGRlbGV0ZSB0YWJsZVN0YXRlLmVudHJ5Q291bnQ7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmVudHJpZXNbMF0gJiYgIXRoaXMuZW50cmllc1swXS5mcmVlKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiB1bmV4cGVjdGVkIGZpcnN0IG9iamVjdCIpOworICAgICAgfQorCisgICAgICByZXR1cm4gb2JqOworICAgIH0sCisgICAgcHJvY2Vzc1hSZWZTdHJlYW06IGZ1bmN0aW9uIFhSZWZfcHJvY2Vzc1hSZWZTdHJlYW0oc3RyZWFtKSB7CisgICAgICBpZiAoISgic3RyZWFtU3RhdGUiIGluIHRoaXMpKSB7CisgICAgICAgIHZhciBzdHJlYW1QYXJhbWV0ZXJzID0gc3RyZWFtLmRpY3Q7CisgICAgICAgIHZhciBieXRlV2lkdGhzID0gc3RyZWFtUGFyYW1ldGVycy5nZXQoIlciKTsKKyAgICAgICAgdmFyIHJhbmdlID0gc3RyZWFtUGFyYW1ldGVycy5nZXQoIkluZGV4Iik7CisKKyAgICAgICAgaWYgKCFyYW5nZSkgeworICAgICAgICAgIHJhbmdlID0gWzAsIHN0cmVhbVBhcmFtZXRlcnMuZ2V0KCJTaXplIildOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5zdHJlYW1TdGF0ZSA9IHsKKyAgICAgICAgICBlbnRyeVJhbmdlczogcmFuZ2UsCisgICAgICAgICAgYnl0ZVdpZHRocywKKyAgICAgICAgICBlbnRyeU51bTogMCwKKyAgICAgICAgICBzdHJlYW1Qb3M6IHN0cmVhbS5wb3MKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZWFkWFJlZlN0cmVhbShzdHJlYW0pOworICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtU3RhdGU7CisgICAgICByZXR1cm4gc3RyZWFtLmRpY3Q7CisgICAgfSwKKyAgICByZWFkWFJlZlN0cmVhbTogZnVuY3Rpb24gWFJlZl9yZWFkWFJlZlN0cmVhbShzdHJlYW0pIHsKKyAgICAgIHZhciBpLCBqOworICAgICAgdmFyIHN0cmVhbVN0YXRlID0gdGhpcy5zdHJlYW1TdGF0ZTsKKyAgICAgIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGF0ZS5zdHJlYW1Qb3M7CisgICAgICB2YXIgYnl0ZVdpZHRocyA9IHN0cmVhbVN0YXRlLmJ5dGVXaWR0aHM7CisgICAgICB2YXIgdHlwZUZpZWxkV2lkdGggPSBieXRlV2lkdGhzWzBdOworICAgICAgdmFyIG9mZnNldEZpZWxkV2lkdGggPSBieXRlV2lkdGhzWzFdOworICAgICAgdmFyIGdlbmVyYXRpb25GaWVsZFdpZHRoID0gYnl0ZVdpZHRoc1syXTsKKyAgICAgIHZhciBlbnRyeVJhbmdlcyA9IHN0cmVhbVN0YXRlLmVudHJ5UmFuZ2VzOworCisgICAgICB3aGlsZSAoZW50cnlSYW5nZXMubGVuZ3RoID4gMCkgeworICAgICAgICB2YXIgZmlyc3QgPSBlbnRyeVJhbmdlc1swXTsKKyAgICAgICAgdmFyIG4gPSBlbnRyeVJhbmdlc1sxXTsKKworICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIFhSZWYgcmFuZ2UgZmllbGRzOiAke2ZpcnN0fSwgJHtufWApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHR5cGVGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihvZmZzZXRGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihnZW5lcmF0aW9uRmllbGRXaWR0aCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAke2ZpcnN0fSwgJHtufWApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gc3RyZWFtU3RhdGUuZW50cnlOdW07IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICBzdHJlYW1TdGF0ZS5lbnRyeU51bSA9IGk7CisgICAgICAgICAgc3RyZWFtU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgICB2YXIgdHlwZSA9IDAsCisgICAgICAgICAgICAgIG9mZnNldCA9IDAsCisgICAgICAgICAgICAgIGdlbmVyYXRpb24gPSAwOworCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHR5cGVGaWVsZFdpZHRoOyArK2opIHsKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlIDw8IDggfCBzdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0eXBlRmllbGRXaWR0aCA9PT0gMCkgeworICAgICAgICAgICAgdHlwZSA9IDE7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9mZnNldEZpZWxkV2lkdGg7ICsraikgeworICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IDw8IDggfCBzdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW5lcmF0aW9uRmllbGRXaWR0aDsgKytqKSB7CisgICAgICAgICAgICBnZW5lcmF0aW9uID0gZ2VuZXJhdGlvbiA8PCA4IHwgc3RyZWFtLmdldEJ5dGUoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgZW50cnkgPSB7fTsKKyAgICAgICAgICBlbnRyeS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgZW50cnkuZ2VuID0gZ2VuZXJhdGlvbjsKKworICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBlbnRyeS5mcmVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIGVudHJ5IHR5cGU6ICR7dHlwZX1gKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tmaXJzdCArIGldKSB7CisgICAgICAgICAgICB0aGlzLmVudHJpZXNbZmlyc3QgKyBpXSA9IGVudHJ5OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0cmVhbVN0YXRlLmVudHJ5TnVtID0gMDsKKyAgICAgICAgc3RyZWFtU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgZW50cnlSYW5nZXMuc3BsaWNlKDAsIDIpOworICAgICAgfQorICAgIH0sCisgICAgaW5kZXhPYmplY3RzOiBmdW5jdGlvbiBYUmVmX2luZGV4T2JqZWN0cygpIHsKKyAgICAgIHZhciBUQUIgPSAweDksCisgICAgICAgICAgTEYgPSAweGEsCisgICAgICAgICAgQ1IgPSAweGQsCisgICAgICAgICAgU1BBQ0UgPSAweDIwOworICAgICAgdmFyIFBFUkNFTlQgPSAweDI1LAorICAgICAgICAgIExUID0gMHgzYzsKKworICAgICAgZnVuY3Rpb24gcmVhZFRva2VuKGRhdGEsIG9mZnNldCkgeworICAgICAgICB2YXIgdG9rZW4gPSAiIiwKKyAgICAgICAgICAgIGNoID0gZGF0YVtvZmZzZXRdOworCisgICAgICAgIHdoaWxlIChjaCAhPT0gTEYgJiYgY2ggIT09IENSICYmIGNoICE9PSBMVCkgeworICAgICAgICAgIGlmICgrK29mZnNldCA+PSBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgdG9rZW4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisgICAgICAgICAgY2ggPSBkYXRhW29mZnNldF07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHNraXBVbnRpbChkYXRhLCBvZmZzZXQsIHdoYXQpIHsKKyAgICAgICAgdmFyIGxlbmd0aCA9IHdoYXQubGVuZ3RoLAorICAgICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgICAgICB2YXIgc2tpcHBlZCA9IDA7CisKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGRhdGFMZW5ndGgpIHsKKyAgICAgICAgICB2YXIgaSA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBkYXRhW29mZnNldCArIGldID09PSB3aGF0W2ldKSB7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICBza2lwcGVkKys7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2tpcHBlZDsKKyAgICAgIH0KKworICAgICAgdmFyIG9ialJlZ0V4cCA9IC9eKFxkKylccysoXGQrKVxzK29ialxiLzsKKyAgICAgIGNvbnN0IGVuZG9ialJlZ0V4cCA9IC9cYmVuZG9ialtcYlxzXSQvOworICAgICAgY29uc3QgbmVzdGVkT2JqUmVnRXhwID0gL1xzKyhcZCtccytcZCtccytvYmpbXGJcczxdKSQvOworICAgICAgY29uc3QgQ0hFQ0tfQ09OVEVOVF9MRU5HVEggPSAyNTsKKyAgICAgIHZhciB0cmFpbGVyQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE2LCAxMTQsIDk3LCAxMDUsIDEwOCwgMTAxLCAxMTRdKTsKKyAgICAgIHZhciBzdGFydHhyZWZCeXRlcyA9IG5ldyBVaW50OEFycmF5KFsxMTUsIDExNiwgOTcsIDExNCwgMTE2LCAxMjAsIDExNCwgMTAxLCAxMDJdKTsKKyAgICAgIGNvbnN0IG9iakJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExMSwgOTgsIDEwNl0pOworICAgICAgdmFyIHhyZWZCeXRlcyA9IG5ldyBVaW50OEFycmF5KFs0NywgODgsIDgyLCAxMDEsIDEwMl0pOworICAgICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7CisgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07CisgICAgICBzdHJlYW0ucG9zID0gMDsKKyAgICAgIHZhciBidWZmZXIgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKKyAgICAgIHZhciBwb3NpdGlvbiA9IHN0cmVhbS5zdGFydCwKKyAgICAgICAgICBsZW5ndGggPSBidWZmZXIubGVuZ3RoOworICAgICAgdmFyIHRyYWlsZXJzID0gW10sCisgICAgICAgICAgeHJlZlN0bXMgPSBbXTsKKworICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciBjaCA9IGJ1ZmZlcltwb3NpdGlvbl07CisKKyAgICAgICAgaWYgKGNoID09PSBUQUIgfHwgY2ggPT09IExGIHx8IGNoID09PSBDUiB8fCBjaCA9PT0gU1BBQ0UpIHsKKyAgICAgICAgICArK3Bvc2l0aW9uOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoID09PSBQRVJDRU5UKSB7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgKytwb3NpdGlvbjsKKworICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IGxlbmd0aCkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2ggPSBidWZmZXJbcG9zaXRpb25dOworICAgICAgICAgIH0gd2hpbGUgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IpOworCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdG9rZW4gPSByZWFkVG9rZW4oYnVmZmVyLCBwb3NpdGlvbik7CisgICAgICAgIHZhciBtOworCisgICAgICAgIGlmICh0b2tlbi5zdGFydHNXaXRoKCJ4cmVmIikgJiYgKHRva2VuLmxlbmd0aCA9PT0gNCB8fCAvXHMvLnRlc3QodG9rZW5bNF0pKSkgeworICAgICAgICAgIHBvc2l0aW9uICs9IHNraXBVbnRpbChidWZmZXIsIHBvc2l0aW9uLCB0cmFpbGVyQnl0ZXMpOworICAgICAgICAgIHRyYWlsZXJzLnB1c2gocG9zaXRpb24pOworICAgICAgICAgIHBvc2l0aW9uICs9IHNraXBVbnRpbChidWZmZXIsIHBvc2l0aW9uLCBzdGFydHhyZWZCeXRlcyk7CisgICAgICAgIH0gZWxzZSBpZiAobSA9IG9ialJlZ0V4cC5leGVjKHRva2VuKSkgeworICAgICAgICAgIGNvbnN0IG51bSA9IG1bMV0gfCAwLAorICAgICAgICAgICAgICAgIGdlbiA9IG1bMl0gfCAwOworCisgICAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNbbnVtXSB8fCB0aGlzLmVudHJpZXNbbnVtXS5nZW4gPT09IGdlbikgeworICAgICAgICAgICAgdGhpcy5lbnRyaWVzW251bV0gPSB7CisgICAgICAgICAgICAgIG9mZnNldDogcG9zaXRpb24gLSBzdHJlYW0uc3RhcnQsCisgICAgICAgICAgICAgIGdlbiwKKyAgICAgICAgICAgICAgdW5jb21wcmVzc2VkOiB0cnVlCisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKworICAgICAgICAgIGxldCBjb250ZW50TGVuZ3RoLAorICAgICAgICAgICAgICBzdGFydFBvcyA9IHBvc2l0aW9uICsgdG9rZW4ubGVuZ3RoOworCisgICAgICAgICAgd2hpbGUgKHN0YXJ0UG9zIDwgYnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgY29uc3QgZW5kUG9zID0gc3RhcnRQb3MgKyBza2lwVW50aWwoYnVmZmVyLCBzdGFydFBvcywgb2JqQnl0ZXMpICsgNDsKKyAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBlbmRQb3MgLSBwb3NpdGlvbjsKKyAgICAgICAgICAgIGNvbnN0IGNoZWNrUG9zID0gTWF0aC5tYXgoZW5kUG9zIC0gQ0hFQ0tfQ09OVEVOVF9MRU5HVEgsIHN0YXJ0UG9zKTsKKyAgICAgICAgICAgIGNvbnN0IHRva2VuU3RyID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGJ1ZmZlci5zdWJhcnJheShjaGVja1BvcywgZW5kUG9zKSk7CisKKyAgICAgICAgICAgIGlmIChlbmRvYmpSZWdFeHAudGVzdCh0b2tlblN0cikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjb25zdCBvYmpUb2tlbiA9IG5lc3RlZE9ialJlZ0V4cC5leGVjKHRva2VuU3RyKTsKKworICAgICAgICAgICAgICBpZiAob2JqVG9rZW4gJiYgb2JqVG9rZW5bMV0pIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoJ2luZGV4T2JqZWN0czogRm91bmQgbmV3ICJvYmoiIGluc2lkZSBvZiBhbm90aGVyICJvYmoiLCAnICsgJ2NhdXNlZCBieSBtaXNzaW5nICJlbmRvYmoiIC0tIHRyeWluZyB0byByZWNvdmVyLicpOworICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggLT0gb2JqVG9rZW5bMV0ubGVuZ3RoOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXJ0UG9zID0gZW5kUG9zOworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBidWZmZXIuc3ViYXJyYXkocG9zaXRpb24sIHBvc2l0aW9uICsgY29udGVudExlbmd0aCk7CisgICAgICAgICAgdmFyIHhyZWZUYWdPZmZzZXQgPSBza2lwVW50aWwoY29udGVudCwgMCwgeHJlZkJ5dGVzKTsKKworICAgICAgICAgIGlmICh4cmVmVGFnT2Zmc2V0IDwgY29udGVudExlbmd0aCAmJiBjb250ZW50W3hyZWZUYWdPZmZzZXQgKyA1XSA8IDY0KSB7CisgICAgICAgICAgICB4cmVmU3Rtcy5wdXNoKHBvc2l0aW9uIC0gc3RyZWFtLnN0YXJ0KTsKKyAgICAgICAgICAgIHRoaXMueHJlZnN0bXNbcG9zaXRpb24gLSBzdHJlYW0uc3RhcnRdID0gMTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwb3NpdGlvbiArPSBjb250ZW50TGVuZ3RoOworICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoInRyYWlsZXIiKSAmJiAodG9rZW4ubGVuZ3RoID09PSA3IHx8IC9ccy8udGVzdCh0b2tlbls3XSkpKSB7CisgICAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7CisgICAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHN0YXJ0eHJlZkJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwb3NpdGlvbiArPSB0b2tlbi5sZW5ndGggKyAxOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBpLCBpaTsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSB4cmVmU3Rtcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaCh4cmVmU3Rtc1tpXSk7CisgICAgICAgIHRoaXMucmVhZFhSZWYodHJ1ZSk7CisgICAgICB9CisKKyAgICAgIGxldCB0cmFpbGVyRGljdDsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSB0cmFpbGVycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHN0cmVhbS5wb3MgPSB0cmFpbGVyc1tpXTsKKyAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IF9wYXJzZXIuUGFyc2VyKHsKKyAgICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICB4cmVmOiB0aGlzLAorICAgICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSwKKyAgICAgICAgICByZWNvdmVyeU1vZGU6IHRydWUKKyAgICAgICAgfSk7CisgICAgICAgIHZhciBvYmogPSBwYXJzZXIuZ2V0T2JqKCk7CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgInRyYWlsZXIiKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgZGljdCA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZXQgcm9vdERpY3Q7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByb290RGljdCA9IGRpY3QuZ2V0KCJSb290Iik7CisgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShyb290RGljdCkgfHwgIXJvb3REaWN0LmhhcygiUGFnZXMiKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpY3QuaGFzKCJJRCIpKSB7CisgICAgICAgICAgcmV0dXJuIGRpY3Q7CisgICAgICAgIH0KKworICAgICAgICB0cmFpbGVyRGljdCA9IGRpY3Q7CisgICAgICB9CisKKyAgICAgIGlmICh0cmFpbGVyRGljdCkgeworICAgICAgICByZXR1cm4gdHJhaWxlckRpY3Q7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKCJJbnZhbGlkIFBERiBzdHJ1Y3R1cmUuIik7CisgICAgfSwKKyAgICByZWFkWFJlZjogZnVuY3Rpb24gWFJlZl9yZWFkWFJlZihyZWNvdmVyeU1vZGUpIHsKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKKyAgICAgIGNvbnN0IHN0YXJ0WFJlZlBhcnNlZENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgd2hpbGUgKHRoaXMuc3RhcnRYUmVmUXVldWUubGVuZ3RoKSB7CisgICAgICAgICAgdmFyIHN0YXJ0WFJlZiA9IHRoaXMuc3RhcnRYUmVmUXVldWVbMF07CisKKyAgICAgICAgICBpZiAoc3RhcnRYUmVmUGFyc2VkQ2FjaGVbc3RhcnRYUmVmXSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLiIpOworICAgICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3RhcnRYUmVmUGFyc2VkQ2FjaGVbc3RhcnRYUmVmXSA9IHRydWU7CisgICAgICAgICAgc3RyZWFtLnBvcyA9IHN0YXJ0WFJlZiArIHN0cmVhbS5zdGFydDsKKyAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKHN0cmVhbSksCisgICAgICAgICAgICB4cmVmOiB0aGlzLAorICAgICAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgICAgdmFyIG9iaiA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgICAgICB2YXIgZGljdDsKKworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgInhyZWYiKSkgeworICAgICAgICAgICAgZGljdCA9IHRoaXMucHJvY2Vzc1hSZWZUYWJsZShwYXJzZXIpOworCisgICAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkgeworICAgICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvYmogPSBkaWN0LmdldCgiWFJlZlN0bSIpOworCisgICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CisgICAgICAgICAgICAgIHZhciBwb3MgPSBvYmo7CisKKyAgICAgICAgICAgICAgaWYgKCEocG9zIGluIHRoaXMueHJlZnN0bXMpKSB7CisgICAgICAgICAgICAgICAgdGhpcy54cmVmc3Rtc1twb3NdID0gMTsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gocG9zKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CisgICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyc2VyLmdldE9iaigpKSB8fCAhKDAsIF9wcmltaXRpdmVzLmlzQ21kKShwYXJzZXIuZ2V0T2JqKCksICJvYmoiKSB8fCAhKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShvYmogPSBwYXJzZXIuZ2V0T2JqKCkpKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlN0cmVhbShvYmopOworCisgICAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkgeworICAgICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJGYWlsZWQgdG8gcmVhZCBYUmVmIHN0cmVhbSIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBzdHJlYW0gaGVhZGVyIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgb2JqID0gZGljdC5nZXQoIlByZXYiKTsKKworICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChvYmopOworICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKShvYmopKSB7CisgICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqLm51bSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMudG9wRGljdDsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiICsgZSk7CisgICAgICB9CisKKyAgICAgIGlmIChyZWNvdmVyeU1vZGUpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLlhSZWZQYXJzZUV4Y2VwdGlvbigpOworICAgIH0sCisgICAgZ2V0RW50cnk6IGZ1bmN0aW9uIFhSZWZfZ2V0RW50cnkoaSkgeworICAgICAgdmFyIHhyZWZFbnRyeSA9IHRoaXMuZW50cmllc1tpXTsKKworICAgICAgaWYgKHhyZWZFbnRyeSAmJiAheHJlZkVudHJ5LmZyZWUgJiYgeHJlZkVudHJ5Lm9mZnNldCkgeworICAgICAgICByZXR1cm4geHJlZkVudHJ5OworICAgICAgfQorCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorICAgIGZldGNoSWZSZWY6IGZ1bmN0aW9uIFhSZWZfZmV0Y2hJZlJlZihvYmosIHN1cHByZXNzRW5jcnlwdGlvbikgeworICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgeworICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChvYmosIHN1cHByZXNzRW5jcnlwdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvYmo7CisgICAgfSwKKyAgICBmZXRjaDogZnVuY3Rpb24gWFJlZl9mZXRjaChyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikgeworICAgICAgaWYgKCEocmVmIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInJlZiBvYmplY3QgaXMgbm90IGEgcmVmZXJlbmNlIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG51bSA9IHJlZi5udW07CisKKyAgICAgIGNvbnN0IGNhY2hlRW50cnkgPSB0aGlzLl9jYWNoZU1hcC5nZXQobnVtKTsKKworICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkgeworICAgICAgICBpZiAoY2FjaGVFbnRyeSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QgJiYgIWNhY2hlRW50cnkub2JqSWQpIHsKKyAgICAgICAgICBjYWNoZUVudHJ5Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2FjaGVFbnRyeTsKKyAgICAgIH0KKworICAgICAgbGV0IHhyZWZFbnRyeSA9IHRoaXMuZ2V0RW50cnkobnVtKTsKKworICAgICAgaWYgKHhyZWZFbnRyeSA9PT0gbnVsbCkgeworICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCB4cmVmRW50cnkpOworCisgICAgICAgIHJldHVybiB4cmVmRW50cnk7CisgICAgICB9CisKKyAgICAgIGlmICh4cmVmRW50cnkudW5jb21wcmVzc2VkKSB7CisgICAgICAgIHhyZWZFbnRyeSA9IHRoaXMuZmV0Y2hVbmNvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbik7CisgICAgICB9IGVsc2UgeworICAgICAgICB4cmVmRW50cnkgPSB0aGlzLmZldGNoQ29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHhyZWZFbnRyeSkpIHsKKyAgICAgICAgeHJlZkVudHJ5Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CisgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoeHJlZkVudHJ5KSkgeworICAgICAgICB4cmVmRW50cnkuZGljdC5vYmpJZCA9IHJlZi50b1N0cmluZygpOworICAgICAgfQorCisgICAgICByZXR1cm4geHJlZkVudHJ5OworICAgIH0sCisKKyAgICBmZXRjaFVuY29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKKyAgICAgIHZhciBnZW4gPSByZWYuZ2VuOworICAgICAgdmFyIG51bSA9IHJlZi5udW07CisKKyAgICAgIGlmICh4cmVmRW50cnkuZ2VuICE9PSBnZW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLlhSZWZFbnRyeUV4Y2VwdGlvbihgSW5jb25zaXN0ZW50IGdlbmVyYXRpb24gaW4gWFJlZjogJHtyZWZ9YCk7CisgICAgICB9CisKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbS5tYWtlU3ViU3RyZWFtKHhyZWZFbnRyeS5vZmZzZXQgKyB0aGlzLnN0cmVhbS5zdGFydCk7CisgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgeHJlZjogdGhpcywKKyAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCisgICAgICB9KTsKKyAgICAgIHZhciBvYmoxID0gcGFyc2VyLmdldE9iaigpOworICAgICAgdmFyIG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgICB2YXIgb2JqMyA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgaWYgKG9iajEgIT09IG51bSB8fCBvYmoyICE9PSBnZW4gfHwgIShvYmozIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSkgeworICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZkVudHJ5RXhjZXB0aW9uKGBCYWQgKHVuY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogJHtyZWZ9YCk7CisgICAgICB9CisKKyAgICAgIGlmIChvYmozLmNtZCAhPT0gIm9iaiIpIHsKKyAgICAgICAgaWYgKG9iajMuY21kLnN0YXJ0c1dpdGgoIm9iaiIpKSB7CisgICAgICAgICAgbnVtID0gcGFyc2VJbnQob2JqMy5jbWQuc3Vic3RyaW5nKDMpLCAxMCk7CisKKyAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW0pKSB7CisgICAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuZW5jcnlwdCAmJiAhc3VwcHJlc3NFbmNyeXB0aW9uKSB7CisgICAgICAgIHhyZWZFbnRyeSA9IHBhcnNlci5nZXRPYmoodGhpcy5lbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShudW0sIGdlbikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeHJlZkVudHJ5ID0gcGFyc2VyLmdldE9iaigpOworICAgICAgfQorCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoeHJlZkVudHJ5KSkgeworICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCB4cmVmRW50cnkpOworICAgICAgfQorCisgICAgICByZXR1cm4geHJlZkVudHJ5OworICAgIH0sCisKKyAgICBmZXRjaENvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CisgICAgICBjb25zdCB0YWJsZU9mZnNldCA9IHhyZWZFbnRyeS5vZmZzZXQ7CisgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLmZldGNoKF9wcmltaXRpdmVzLlJlZi5nZXQodGFibGVPZmZzZXQsIDApKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKHN0cmVhbSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJiYWQgT2JqU3RtIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICBjb25zdCBmaXJzdCA9IHN0cmVhbS5kaWN0LmdldCgiRmlyc3QiKTsKKyAgICAgIGNvbnN0IG4gPSBzdHJlYW0uZGljdC5nZXQoIk4iKTsKKworICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoImludmFsaWQgZmlyc3QgYW5kIG4gcGFyYW1ldGVycyBmb3IgT2JqU3RtIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgeHJlZjogdGhpcywKKyAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCisgICAgICB9KTsKKyAgICAgIGNvbnN0IG51bXMgPSBuZXcgQXJyYXkobik7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgaW52YWxpZCBvYmplY3QgbnVtYmVyIGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke251bX1gKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG9mZnNldCA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgaW52YWxpZCBvYmplY3Qgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke29mZnNldH1gKTsKKyAgICAgICAgfQorCisgICAgICAgIG51bXNbaV0gPSBudW07CisgICAgICB9CisKKyAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgQXJyYXkobik7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGNvbnN0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgICAgZW50cmllc1tpXSA9IG9iajsKKworICAgICAgICBpZiAocGFyc2VyLmJ1ZjEgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQgJiYgcGFyc2VyLmJ1ZjEuY21kID09PSAiZW5kb2JqIikgeworICAgICAgICAgIHBhcnNlci5zaGlmdCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkob2JqKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgbnVtID0gbnVtc1tpXSwKKyAgICAgICAgICAgICAgZW50cnkgPSB0aGlzLmVudHJpZXNbbnVtXTsKKworICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkub2Zmc2V0ID09PSB0YWJsZU9mZnNldCAmJiBlbnRyeS5nZW4gPT09IGkpIHsKKyAgICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCBvYmopOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHhyZWZFbnRyeSA9IGVudHJpZXNbeHJlZkVudHJ5Lmdlbl07CisKKyAgICAgIGlmICh4cmVmRW50cnkgPT09IHVuZGVmaW5lZCkgeworICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZkVudHJ5RXhjZXB0aW9uKGBCYWQgKGNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOworICAgICAgfQorCisgICAgICByZXR1cm4geHJlZkVudHJ5OworICAgIH0sCisKKyAgICBhc3luYyBmZXRjaElmUmVmQXN5bmMob2JqLCBzdXBwcmVzc0VuY3J5cHRpb24pIHsKKyAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hBc3luYyhvYmosIHN1cHByZXNzRW5jcnlwdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvYmo7CisgICAgfSwKKworICAgIGFzeW5jIGZldGNoQXN5bmMocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiB0aGlzLmZldGNoKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pKSB7CisgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKworICAgICAgICBhd2FpdCB0aGlzLnBkZk1hbmFnZXIucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpOworICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEFzeW5jKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgZ2V0Q2F0YWxvZ09iajogZnVuY3Rpb24gWFJlZl9nZXRDYXRhbG9nT2JqKCkgeworICAgICAgcmV0dXJuIHRoaXMucm9vdDsKKyAgICB9CisgIH07CisgIHJldHVybiBYUmVmOworfSgpOworCitleHBvcnRzLlhSZWYgPSBYUmVmOworCitjbGFzcyBOYW1lT3JOdW1iZXJUcmVlIHsKKyAgY29uc3RydWN0b3Iocm9vdCwgeHJlZiwgdHlwZSkgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBOYW1lT3JOdW1iZXJUcmVlKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBOYW1lT3JOdW1iZXJUcmVlLiIpOworICAgIH0KKworICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgfQorCisgIGdldEFsbCgpIHsKKyAgICBjb25zdCBkaWN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgIGlmICghdGhpcy5yb290KSB7CisgICAgICByZXR1cm4gZGljdDsKKyAgICB9CisKKyAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOworICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKTsKKyAgICBwcm9jZXNzZWQucHV0KHRoaXMucm9vdCk7CisgICAgY29uc3QgcXVldWUgPSBbdGhpcy5yb290XTsKKworICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCBvYmogPSB4cmVmLmZldGNoSWZSZWYocXVldWUuc2hpZnQoKSk7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKG9iai5oYXMoIktpZHMiKSkgeworICAgICAgICBjb25zdCBraWRzID0gb2JqLmdldCgiS2lkcyIpOworCisgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGtpZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGNvbnN0IGtpZCA9IGtpZHNbaV07CisKKyAgICAgICAgICBpZiAocHJvY2Vzc2VkLmhhcyhraWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYER1cGxpY2F0ZSBlbnRyeSBpbiAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBxdWV1ZS5wdXNoKGtpZCk7CisgICAgICAgICAgcHJvY2Vzc2VkLnB1dChraWQpOworICAgICAgICB9CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGVudHJpZXMgPSBvYmouZ2V0KHRoaXMuX3R5cGUpOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgeworICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgICAgICBkaWN0W3hyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW2ldKV0gPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tpICsgMV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRpY3Q7CisgIH0KKworICBnZXQoa2V5KSB7CisgICAgaWYgKCF0aGlzLnJvb3QpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CisgICAgbGV0IGtpZHNPckVudHJpZXMgPSB4cmVmLmZldGNoSWZSZWYodGhpcy5yb290KTsKKyAgICBsZXQgbG9vcENvdW50ID0gMDsKKyAgICBjb25zdCBNQVhfTEVWRUxTID0gMTA7CisKKyAgICB3aGlsZSAoa2lkc09yRW50cmllcy5oYXMoIktpZHMiKSkgeworICAgICAgaWYgKCsrbG9vcENvdW50ID4gTUFYX0xFVkVMUykgeworICAgICAgICAoMCwgX3V0aWwud2FybikoYFNlYXJjaCBkZXB0aCBsaW1pdCByZWFjaGVkIGZvciAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGtpZHMgPSBraWRzT3JFbnRyaWVzLmdldCgiS2lkcyIpOworCisgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2lkcykpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGxldCBsID0gMCwKKyAgICAgICAgICByID0ga2lkcy5sZW5ndGggLSAxOworCisgICAgICB3aGlsZSAobCA8PSByKSB7CisgICAgICAgIGNvbnN0IG0gPSBsICsgciA+PiAxOworICAgICAgICBjb25zdCBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkc1ttXSk7CisgICAgICAgIGNvbnN0IGxpbWl0cyA9IGtpZC5nZXQoIkxpbWl0cyIpOworCisgICAgICAgIGlmIChrZXkgPCB4cmVmLmZldGNoSWZSZWYobGltaXRzWzBdKSkgeworICAgICAgICAgIHIgPSBtIC0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkgPiB4cmVmLmZldGNoSWZSZWYobGltaXRzWzFdKSkgeworICAgICAgICAgIGwgPSBtICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBraWRzT3JFbnRyaWVzID0geHJlZi5mZXRjaElmUmVmKGtpZHNbbV0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChsID4gcikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBlbnRyaWVzID0ga2lkc09yRW50cmllcy5nZXQodGhpcy5fdHlwZSk7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgeworICAgICAgbGV0IGwgPSAwLAorICAgICAgICAgIHIgPSBlbnRyaWVzLmxlbmd0aCAtIDI7CisKKyAgICAgIHdoaWxlIChsIDw9IHIpIHsKKyAgICAgICAgY29uc3QgdG1wID0gbCArIHIgPj4gMSwKKyAgICAgICAgICAgICAgbSA9IHRtcCArICh0bXAgJiAxKTsKKyAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW21dKTsKKworICAgICAgICBpZiAoa2V5IDwgY3VycmVudEtleSkgeworICAgICAgICAgIHIgPSBtIC0gMjsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkgPiBjdXJyZW50S2V5KSB7CisgICAgICAgICAgbCA9IG0gKyAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttICsgMV0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC5pbmZvKShgRmFsbGluZyBiYWNrIHRvIGFuIGV4aGF1c3RpdmUgc2VhcmNoLCBmb3Iga2V5ICIke2tleX0iLCBgICsgYGluICIke3RoaXMuX3R5cGV9IiB0cmVlLmApOworCisgICAgICBmb3IgKGxldCBtID0gMCwgbW0gPSBlbnRyaWVzLmxlbmd0aDsgbSA8IG1tOyBtICs9IDIpIHsKKyAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW21dKTsKKworICAgICAgICBpZiAoY3VycmVudEtleSA9PT0ga2V5KSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBUaGUgIiR7a2V5fSIga2V5IHdhcyBmb3VuZCBhdCBhbiBpbmNvcnJlY3QsIGAgKyBgaS5lLiBvdXQtb2Ytb3JkZXIsIHBvc2l0aW9uIGluICIke3RoaXMuX3R5cGV9IiB0cmVlLmApOworICAgICAgICAgIHJldHVybiB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttICsgMV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworfQorCitjbGFzcyBOYW1lVHJlZSBleHRlbmRzIE5hbWVPck51bWJlclRyZWUgeworICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmKSB7CisgICAgc3VwZXIocm9vdCwgeHJlZiwgIk5hbWVzIik7CisgIH0KKworfQorCitjbGFzcyBOdW1iZXJUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZSB7CisgIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYpIHsKKyAgICBzdXBlcihyb290LCB4cmVmLCAiTnVtcyIpOworICB9CisKK30KKwordmFyIEZpbGVTcGVjID0gZnVuY3Rpb24gRmlsZVNwZWNDbG9zdXJlKCkgeworICBmdW5jdGlvbiBGaWxlU3BlYyhyb290LCB4cmVmKSB7CisgICAgaWYgKCFyb290IHx8ICEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShyb290KSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMueHJlZiA9IHhyZWY7CisgICAgdGhpcy5yb290ID0gcm9vdDsKKworICAgIGlmIChyb290LmhhcygiRlMiKSkgeworICAgICAgdGhpcy5mcyA9IHJvb3QuZ2V0KCJGUyIpOworICAgIH0KKworICAgIHRoaXMuZGVzY3JpcHRpb24gPSByb290LmhhcygiRGVzYyIpID8gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShyb290LmdldCgiRGVzYyIpKSA6ICIiOworCisgICAgaWYgKHJvb3QuaGFzKCJSRiIpKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIlJlbGF0ZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IHRydWU7CisKKyAgICBpZiAoIXJvb3QuaGFzKCJFRiIpKSB7CisgICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiTm9uLWVtYmVkZGVkIGZpbGUgc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwaWNrUGxhdGZvcm1JdGVtKGRpY3QpIHsKKyAgICBpZiAoZGljdC5oYXMoIlVGIikpIHsKKyAgICAgIHJldHVybiBkaWN0LmdldCgiVUYiKTsKKyAgICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJGIikpIHsKKyAgICAgIHJldHVybiBkaWN0LmdldCgiRiIpOworICAgIH0gZWxzZSBpZiAoZGljdC5oYXMoIlVuaXgiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJVbml4Iik7CisgICAgfSBlbHNlIGlmIChkaWN0LmhhcygiTWFjIikpIHsKKyAgICAgIHJldHVybiBkaWN0LmdldCgiTWFjIik7CisgICAgfSBlbHNlIGlmIChkaWN0LmhhcygiRE9TIikpIHsKKyAgICAgIHJldHVybiBkaWN0LmdldCgiRE9TIik7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBGaWxlU3BlYy5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGZpbGVuYW1lKCkgeworICAgICAgaWYgKCF0aGlzLl9maWxlbmFtZSAmJiB0aGlzLnJvb3QpIHsKKyAgICAgICAgdmFyIGZpbGVuYW1lID0gcGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QpIHx8ICJ1bm5hbWVkIjsKKyAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGZpbGVuYW1lKS5yZXBsYWNlKC9cXFxcL2csICJcXCIpLnJlcGxhY2UoL1xcXC8vZywgIi8iKS5yZXBsYWNlKC9cXC9nLCAiLyIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7CisgICAgfSwKKworICAgIGdldCBjb250ZW50KCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRBdmFpbGFibGUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGlmICghdGhpcy5jb250ZW50UmVmICYmIHRoaXMucm9vdCkgeworICAgICAgICB0aGlzLmNvbnRlbnRSZWYgPSBwaWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdC5nZXQoIkVGIikpOworICAgICAgfQorCisgICAgICB2YXIgY29udGVudCA9IG51bGw7CisKKyAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWYpIHsKKyAgICAgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7CisgICAgICAgIHZhciBmaWxlT2JqID0geHJlZi5mZXRjaElmUmVmKHRoaXMuY29udGVudFJlZik7CisKKyAgICAgICAgaWYgKGZpbGVPYmogJiYgKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShmaWxlT2JqKSkgeworICAgICAgICAgIGNvbnRlbnQgPSBmaWxlT2JqLmdldEJ5dGVzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gcG9pbnRzIHRvIG5vbi1leGlzdGluZy9pbnZhbGlkICIgKyAiY29udGVudCIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIkVtYmVkZGVkIGZpbGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGEgY29udGVudCIpOworICAgICAgfQorCisgICAgICByZXR1cm4gY29udGVudDsKKyAgICB9LAorCisgICAgZ2V0IHNlcmlhbGl6YWJsZSgpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLAorICAgICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQKKyAgICAgIH07CisgICAgfQorCisgIH07CisgIHJldHVybiBGaWxlU3BlYzsKK30oKTsKKworZXhwb3J0cy5GaWxlU3BlYyA9IEZpbGVTcGVjOworCitjb25zdCBPYmplY3RMb2FkZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIG1heUhhdmVDaGlsZHJlbih2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZiB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh2YWx1ZSk7CisgIH0KKworICBmdW5jdGlvbiBhZGRDaGlsZHJlbihub2RlLCBub2Rlc1RvVmlzaXQpIHsKKyAgICBpZiAobm9kZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKKyAgICAgIG5vZGUgPSBub2RlLmdldFJhd1ZhbHVlcygpOworICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShub2RlKSkgeworICAgICAgbm9kZSA9IG5vZGUuZGljdC5nZXRSYXdWYWx1ZXMoKTsKKyAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChjb25zdCByYXdWYWx1ZSBvZiBub2RlKSB7CisgICAgICBpZiAobWF5SGF2ZUNoaWxkcmVuKHJhd1ZhbHVlKSkgeworICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChyYXdWYWx1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gT2JqZWN0TG9hZGVyKGRpY3QsIGtleXMsIHhyZWYpIHsKKyAgICB0aGlzLmRpY3QgPSBkaWN0OworICAgIHRoaXMua2V5cyA9IGtleXM7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLnJlZlNldCA9IG51bGw7CisgIH0KKworICBPYmplY3RMb2FkZXIucHJvdG90eXBlID0geworICAgIGFzeW5jIGxvYWQoKSB7CisgICAgICBpZiAoIXRoaXMueHJlZi5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkIHx8IHRoaXMueHJlZi5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgY29uc3QgeworICAgICAgICBrZXlzLAorICAgICAgICBkaWN0CisgICAgICB9ID0gdGhpczsKKyAgICAgIHRoaXMucmVmU2V0ID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOworICAgICAgY29uc3Qgbm9kZXNUb1Zpc2l0ID0gW107CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGtleXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGRpY3QuZ2V0UmF3KGtleXNbaV0pOworCisgICAgICAgIGlmIChyYXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gocmF3VmFsdWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl93YWxrKG5vZGVzVG9WaXNpdCk7CisgICAgfSwKKworICAgIGFzeW5jIF93YWxrKG5vZGVzVG9WaXNpdCkgeworICAgICAgY29uc3Qgbm9kZXNUb1JldmlzaXQgPSBbXTsKKyAgICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0cyA9IFtdOworCisgICAgICB3aGlsZSAobm9kZXNUb1Zpc2l0Lmxlbmd0aCkgeworICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBub2Rlc1RvVmlzaXQucG9wKCk7CisKKyAgICAgICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICAgICAgaWYgKHRoaXMucmVmU2V0LmhhcyhjdXJyZW50Tm9kZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnJlZlNldC5wdXQoY3VycmVudE5vZGUpOworICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0aGlzLnhyZWYuZmV0Y2goY3VycmVudE5vZGUpOworICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgeworICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm9kZXNUb1JldmlzaXQucHVzaChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICBwZW5kaW5nUmVxdWVzdHMucHVzaCh7CisgICAgICAgICAgICAgIGJlZ2luOiBleC5iZWdpbiwKKyAgICAgICAgICAgICAgZW5kOiBleC5lbmQKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZS5nZXRCYXNlU3RyZWFtcykgeworICAgICAgICAgIGNvbnN0IGJhc2VTdHJlYW1zID0gY3VycmVudE5vZGUuZ2V0QmFzZVN0cmVhbXMoKTsKKyAgICAgICAgICBsZXQgZm91bmRNaXNzaW5nRGF0YSA9IGZhbHNlOworCisgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYmFzZVN0cmVhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gYmFzZVN0cmVhbXNbaV07CisKKyAgICAgICAgICAgIGlmIChzdHJlYW0uYWxsQ2h1bmtzTG9hZGVkICYmICFzdHJlYW0uYWxsQ2h1bmtzTG9hZGVkKCkpIHsKKyAgICAgICAgICAgICAgZm91bmRNaXNzaW5nRGF0YSA9IHRydWU7CisgICAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKKyAgICAgICAgICAgICAgICBiZWdpbjogc3RyZWFtLnN0YXJ0LAorICAgICAgICAgICAgICAgIGVuZDogc3RyZWFtLmVuZAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZm91bmRNaXNzaW5nRGF0YSkgeworICAgICAgICAgICAgbm9kZXNUb1JldmlzaXQucHVzaChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYWRkQ2hpbGRyZW4oY3VycmVudE5vZGUsIG5vZGVzVG9WaXNpdCk7CisgICAgICB9CisKKyAgICAgIGlmIChwZW5kaW5nUmVxdWVzdHMubGVuZ3RoKSB7CisgICAgICAgIGF3YWl0IHRoaXMueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKHBlbmRpbmdSZXF1ZXN0cyk7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbm9kZXNUb1JldmlzaXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1RvUmV2aXNpdFtpXTsKKworICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICAgICAgICB0aGlzLnJlZlNldC5yZW1vdmUobm9kZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGsobm9kZXNUb1JldmlzaXQpOworICAgICAgfQorCisgICAgICB0aGlzLnJlZlNldCA9IG51bGw7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICB9OworICByZXR1cm4gT2JqZWN0TG9hZGVyOworfSgpOworCitleHBvcnRzLk9iamVjdExvYWRlciA9IE9iamVjdExvYWRlcjsKKworLyoqKi8gfSksCisvKiAxMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBhcnNlciA9IGV4cG9ydHMuTGluZWFyaXphdGlvbiA9IGV4cG9ydHMuTGV4ZXIgPSB2b2lkIDA7CisKK3ZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBfY2NpdHRfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7CisKK3ZhciBfamJpZzJfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7CisKK3ZhciBfanBlZ19zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKKwordmFyIF9qcHhfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7CisKK2NvbnN0IE1BWF9MRU5HVEhfVE9fQ0FDSEUgPSAxMDAwOworY29uc3QgTUFYX0FETEVSMzJfTEVOR1RIID0gNTU1MjsKKworZnVuY3Rpb24gY29tcHV0ZUFkbGVyMzIoYnl0ZXMpIHsKKyAgY29uc3QgYnl0ZXNMZW5ndGggPSBieXRlcy5sZW5ndGg7CisgIGxldCBhID0gMSwKKyAgICAgIGIgPSAwOworCisgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXNMZW5ndGg7ICsraSkgeworICAgIGEgKz0gYnl0ZXNbaV0gJiAweGZmOworICAgIGIgKz0gYTsKKyAgfQorCisgIHJldHVybiBiICUgNjU1MjEgPDwgMTYgfCBhICUgNjU1MjE7Cit9CisKK2NsYXNzIFBhcnNlciB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBsZXhlciwKKyAgICB4cmVmLAorICAgIGFsbG93U3RyZWFtcyA9IGZhbHNlLAorICAgIHJlY292ZXJ5TW9kZSA9IGZhbHNlCisgIH0pIHsKKyAgICB0aGlzLmxleGVyID0gbGV4ZXI7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLmFsbG93U3RyZWFtcyA9IGFsbG93U3RyZWFtczsKKyAgICB0aGlzLnJlY292ZXJ5TW9kZSA9IHJlY292ZXJ5TW9kZTsKKyAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHRoaXMucmVmaWxsKCk7CisgIH0KKworICByZWZpbGwoKSB7CisgICAgdGhpcy5idWYxID0gdGhpcy5sZXhlci5nZXRPYmooKTsKKyAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOworICB9CisKKyAgc2hpZnQoKSB7CisgICAgaWYgKHRoaXMuYnVmMiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkNtZCAmJiB0aGlzLmJ1ZjIuY21kID09PSAiSUQiKSB7CisgICAgICB0aGlzLmJ1ZjEgPSB0aGlzLmJ1ZjI7CisgICAgICB0aGlzLmJ1ZjIgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmJ1ZjEgPSB0aGlzLmJ1ZjI7CisgICAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOworICAgIH0KKyAgfQorCisgIHRyeVNoaWZ0KCkgeworICAgIHRyeSB7CisgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBnZXRPYmooY2lwaGVyVHJhbnNmb3JtID0gbnVsbCkgeworICAgIGNvbnN0IGJ1ZjEgPSB0aGlzLmJ1ZjE7CisgICAgdGhpcy5zaGlmdCgpOworCisgICAgaWYgKGJ1ZjEgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQpIHsKKyAgICAgIHN3aXRjaCAoYnVmMS5jbWQpIHsKKyAgICAgICAgY2FzZSAiQkkiOgorICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VJbmxpbmVJbWFnZShjaXBoZXJUcmFuc2Zvcm0pOworCisgICAgICAgIGNhc2UgIlsiOgorICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107CisKKyAgICAgICAgICB3aGlsZSAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYxLCAiXSIpICYmICEoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgICAgIGFycmF5LnB1c2godGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikodGhpcy5idWYxKSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnJlY292ZXJ5TW9kZSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkVuZCBvZiBmaWxlIGluc2lkZSBhcnJheSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5zaGlmdCgpOworICAgICAgICAgIHJldHVybiBhcnJheTsKKworICAgICAgICBjYXNlICI8PCI6CisgICAgICAgICAgY29uc3QgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CisKKyAgICAgICAgICB3aGlsZSAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYxLCAiPj4iKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRU9GKSh0aGlzLmJ1ZjEpKSB7CisgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJNYWxmb3JtZWQgZGljdGlvbmFyeToga2V5IG11c3QgYmUgYSBuYW1lIG9iamVjdCIpOworICAgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1ZjEubmFtZTsKKyAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikodGhpcy5idWYxKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKSh0aGlzLmJ1ZjEpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMucmVjb3ZlcnlNb2RlKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRW5kIG9mIGZpbGUgaW5zaWRlIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRpY3Q7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYyLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmFsbG93U3RyZWFtcyA/IHRoaXMubWFrZVN0cmVhbShkaWN0LCBjaXBoZXJUcmFuc2Zvcm0pIDogZGljdDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgICAgcmV0dXJuIGRpY3Q7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gYnVmMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihidWYxKSkgeworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodGhpcy5idWYxKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKHRoaXMuYnVmMiwgIlIiKSkgeworICAgICAgICBjb25zdCByZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KGJ1ZjEsIHRoaXMuYnVmMSk7CisKKyAgICAgICAgdGhpcy5zaGlmdCgpOworICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgIHJldHVybiByZWY7CisgICAgICB9CisKKyAgICAgIHJldHVybiBidWYxOworICAgIH0KKworICAgIGlmICh0eXBlb2YgYnVmMSA9PT0gInN0cmluZyIpIHsKKyAgICAgIGlmIChjaXBoZXJUcmFuc2Zvcm0pIHsKKyAgICAgICAgcmV0dXJuIGNpcGhlclRyYW5zZm9ybS5kZWNyeXB0U3RyaW5nKGJ1ZjEpOworICAgICAgfQorCisgICAgICByZXR1cm4gYnVmMTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmMTsKKyAgfQorCisgIGZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSkgeworICAgIGNvbnN0IEUgPSAweDQ1LAorICAgICAgICAgIEkgPSAweDQ5LAorICAgICAgICAgIFNQQUNFID0gMHgyMCwKKyAgICAgICAgICBMRiA9IDB4YSwKKyAgICAgICAgICBDUiA9IDB4ZCwKKyAgICAgICAgICBOVUwgPSAweDA7CisgICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyLAorICAgICAgICAgIHN0YXJ0UG9zID0gc3RyZWFtLnBvcywKKyAgICAgICAgICBuID0gMTA7CisgICAgbGV0IHN0YXRlID0gMCwKKyAgICAgICAgY2gsCisgICAgICAgIG1heWJlRUlQb3M7CisKKyAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgIT09IC0xKSB7CisgICAgICBpZiAoc3RhdGUgPT09IDApIHsKKyAgICAgICAgc3RhdGUgPSBjaCA9PT0gRSA/IDEgOiAwOworICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gMSkgeworICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShzdGF0ZSA9PT0gMiwgImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kIC0gaW52YWxpZCBzdGF0ZS4iKTsKKworICAgICAgICBpZiAoY2ggPT09IFNQQUNFIHx8IGNoID09PSBMRiB8fCBjaCA9PT0gQ1IpIHsKKyAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgICBjb25zdCBmb2xsb3dpbmdCeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMobik7CisKKyAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmb2xsb3dpbmdCeXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICBjaCA9IGZvbGxvd2luZ0J5dGVzW2ldOworCisgICAgICAgICAgICBpZiAoY2ggPT09IE5VTCAmJiBmb2xsb3dpbmdCeXRlc1tpICsgMV0gIT09IE5VTCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkgeworICAgICAgICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdGF0ZSAhPT0gMikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxleGVyLmtub3duQ29tbWFuZHMpIHsKKyAgICAgICAgICAgIGNvbnN0IG5leHRPYmogPSBsZXhlci5wZWVrT2JqKCk7CisKKyAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kICYmICFsZXhlci5rbm93bkNvbW1hbmRzW25leHRPYmouY21kXSkgeworICAgICAgICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQgLSBgbGV4ZXIua25vd25Db21tYW5kc2AgaXMgdW5kZWZpbmVkLiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChjaCA9PT0gLTEpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6ICIgKyAiUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aG91dCBmaW5kaW5nIGEgdmFsaWQgRUkgbWFya2VyIik7CisKKyAgICAgIGlmIChtYXliZUVJUG9zKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgnLi4uIHRyeWluZyB0byByZWNvdmVyIGJ5IHVzaW5nIHRoZSBsYXN0ICJFSSIgb2NjdXJyZW5jZS4nKTsKKyAgICAgICAgc3RyZWFtLnNraXAoLShzdHJlYW0ucG9zIC0gbWF5YmVFSVBvcykpOworICAgICAgfQorICAgIH0KKworICAgIGxldCBlbmRPZmZzZXQgPSA0OworICAgIHN0cmVhbS5za2lwKC1lbmRPZmZzZXQpOworICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CisgICAgc3RyZWFtLnNraXAoZW5kT2Zmc2V0KTsKKworICAgIGlmICghKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CisgICAgICBlbmRPZmZzZXQtLTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtLnBvcyAtIGVuZE9mZnNldCAtIHN0YXJ0UG9zOworICB9CisKKyAgZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKKyAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3M7CisgICAgbGV0IGZvdW5kRU9JID0gZmFsc2UsCisgICAgICAgIGIsCisgICAgICAgIG1hcmtlckxlbmd0aDsKKworICAgIHdoaWxlICgoYiA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgaWYgKGIgIT09IDB4ZmYpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoc3RyZWFtLmdldEJ5dGUoKSkgeworICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweGZmOgorICAgICAgICAgIHN0cmVhbS5za2lwKC0xKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4ZDk6CisgICAgICAgICAgZm91bmRFT0kgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHhjMDoKKyAgICAgICAgY2FzZSAweGMxOgorICAgICAgICBjYXNlIDB4YzI6CisgICAgICAgIGNhc2UgMHhjMzoKKyAgICAgICAgY2FzZSAweGM1OgorICAgICAgICBjYXNlIDB4YzY6CisgICAgICAgIGNhc2UgMHhjNzoKKyAgICAgICAgY2FzZSAweGM5OgorICAgICAgICBjYXNlIDB4Y2E6CisgICAgICAgIGNhc2UgMHhjYjoKKyAgICAgICAgY2FzZSAweGNkOgorICAgICAgICBjYXNlIDB4Y2U6CisgICAgICAgIGNhc2UgMHhjZjoKKyAgICAgICAgY2FzZSAweGM0OgorICAgICAgICBjYXNlIDB4Y2M6CisgICAgICAgIGNhc2UgMHhkYToKKyAgICAgICAgY2FzZSAweGRiOgorICAgICAgICBjYXNlIDB4ZGM6CisgICAgICAgIGNhc2UgMHhkZDoKKyAgICAgICAgY2FzZSAweGRlOgorICAgICAgICBjYXNlIDB4ZGY6CisgICAgICAgIGNhc2UgMHhlMDoKKyAgICAgICAgY2FzZSAweGUxOgorICAgICAgICBjYXNlIDB4ZTI6CisgICAgICAgIGNhc2UgMHhlMzoKKyAgICAgICAgY2FzZSAweGU0OgorICAgICAgICBjYXNlIDB4ZTU6CisgICAgICAgIGNhc2UgMHhlNjoKKyAgICAgICAgY2FzZSAweGU3OgorICAgICAgICBjYXNlIDB4ZTg6CisgICAgICAgIGNhc2UgMHhlOToKKyAgICAgICAgY2FzZSAweGVhOgorICAgICAgICBjYXNlIDB4ZWI6CisgICAgICAgIGNhc2UgMHhlYzoKKyAgICAgICAgY2FzZSAweGVkOgorICAgICAgICBjYXNlIDB4ZWU6CisgICAgICAgIGNhc2UgMHhlZjoKKyAgICAgICAgY2FzZSAweGZlOgorICAgICAgICAgIG1hcmtlckxlbmd0aCA9IHN0cmVhbS5nZXRVaW50MTYoKTsKKworICAgICAgICAgIGlmIChtYXJrZXJMZW5ndGggPiAyKSB7CisgICAgICAgICAgICBzdHJlYW0uc2tpcChtYXJrZXJMZW5ndGggLSAyKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyZWFtLnNraXAoLTIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZm91bmRFT0kpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zOworCisgICAgaWYgKGIgPT09IC0xKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBEQ1REZWNvZGUgaW1hZ2Ugc3RyZWFtOiAiICsgIkVPSSBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTsKKyAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOworICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKKyAgICB9CisKKyAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pOworICAgIHJldHVybiBsZW5ndGg7CisgIH0KKworICBmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKKyAgICBjb25zdCBUSUxERSA9IDB4N2UsCisgICAgICAgICAgR1QgPSAweDNlOworICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKKyAgICBsZXQgY2g7CisKKyAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgIT09IC0xKSB7CisgICAgICBpZiAoY2ggPT09IFRJTERFKSB7CisgICAgICAgIGNvbnN0IHRpbGRlUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgY2ggPSBzdHJlYW0ucGVla0J5dGUoKTsKKworICAgICAgICB3aGlsZSAoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CisgICAgICAgICAgc3RyZWFtLnNraXAoKTsKKyAgICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoID09PSBHVCkgeworICAgICAgICAgIHN0cmVhbS5za2lwKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHRpbGRlUG9zKSB7CisgICAgICAgICAgY29uc3QgbWF5YmVFSSA9IHN0cmVhbS5wZWVrQnl0ZXMoMik7CisKKyAgICAgICAgICBpZiAobWF5YmVFSVswXSA9PT0gMHg0NSAmJiBtYXliZUVJWzFdID09PSAweDQ5KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CisKKyAgICBpZiAoY2ggPT09IC0xKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CisgICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKKyAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CisgICAgfQorCisgICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKKyAgICByZXR1cm4gbGVuZ3RoOworICB9CisKKyAgZmluZEFTQ0lJSGV4RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSkgeworICAgIGNvbnN0IEdUID0gMHgzZTsKKyAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3M7CisgICAgbGV0IGNoOworCisgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgaWYgKGNoID09PSBHVCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CisKKyAgICBpZiAoY2ggPT09IC0xKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOworICAgICAgc3RyZWFtLnNraXAoLWxlbmd0aCk7CisgICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgIH0KKworICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7CisgICAgcmV0dXJuIGxlbmd0aDsKKyAgfQorCisgIGlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pIHsKKyAgICBjb25zdCBFID0gMHg0NSwKKyAgICAgICAgICBJID0gMHg0OTsKKyAgICBsZXQgc3RhdGUgPSAwLAorICAgICAgICBjaDsKKworICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKKyAgICAgIGlmIChzdGF0ZSA9PT0gMCkgeworICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CisgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAxKSB7CisgICAgICAgIHN0YXRlID0gY2ggPT09IEkgPyAyIDogMDsKKyAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgbWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSkgeworICAgIGNvbnN0IGxleGVyID0gdGhpcy5sZXhlcjsKKyAgICBjb25zdCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CisgICAgY29uc3QgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CisgICAgbGV0IGRpY3RMZW5ndGg7CisKKyAgICB3aGlsZSAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYxLCAiSUQiKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRU9GKSh0aGlzLmJ1ZjEpKSB7CisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJEaWN0aW9uYXJ5IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTsKKyAgICAgIH0KKworICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CisgICAgICB0aGlzLnNoaWZ0KCk7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRpY3Quc2V0KGtleSwgdGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7CisgICAgfQorCisgICAgaWYgKGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3MgIT09IC0xKSB7CisgICAgICBkaWN0TGVuZ3RoID0gc3RyZWFtLnBvcyAtIGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7CisgICAgfQorCisgICAgY29uc3QgZmlsdGVyID0gZGljdC5nZXQoIkZpbHRlciIsICJGIik7CisgICAgbGV0IGZpbHRlck5hbWU7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmlsdGVyKSkgeworICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOworICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7CisgICAgICBjb25zdCBmaWx0ZXJaZXJvID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmlsdGVyWzBdKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpbHRlclplcm8pKSB7CisgICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXJaZXJvLm5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOworICAgIGxldCBsZW5ndGg7CisKKyAgICBpZiAoZmlsdGVyTmFtZSA9PT0gIkRDVERlY29kZSIgfHwgZmlsdGVyTmFtZSA9PT0gIkRDVCIpIHsKKyAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgIH0gZWxzZSBpZiAoZmlsdGVyTmFtZSA9PT0gIkFTQ0lJODVEZWNvZGUiIHx8IGZpbHRlck5hbWUgPT09ICJBODUiKSB7CisgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CisgICAgfSBlbHNlIGlmIChmaWx0ZXJOYW1lID09PSAiQVNDSUlIZXhEZWNvZGUiIHx8IGZpbHRlck5hbWUgPT09ICJBSHgiKSB7CisgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgIH0gZWxzZSB7CisgICAgICBsZW5ndGggPSB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CisgICAgfQorCisgICAgbGV0IGltYWdlU3RyZWFtID0gc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MsIGxlbmd0aCwgZGljdCk7CisgICAgbGV0IGNhY2hlS2V5OworCisgICAgaWYgKGxlbmd0aCA8IE1BWF9MRU5HVEhfVE9fQ0FDSEUgJiYgZGljdExlbmd0aCA8IE1BWF9BRExFUjMyX0xFTkdUSCkgeworICAgICAgY29uc3QgaW1hZ2VCeXRlcyA9IGltYWdlU3RyZWFtLmdldEJ5dGVzKCk7CisgICAgICBpbWFnZVN0cmVhbS5yZXNldCgpOworICAgICAgY29uc3QgaW5pdGlhbFN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CisgICAgICBzdHJlYW0ucG9zID0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvczsKKyAgICAgIGNvbnN0IGRpY3RCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcyhkaWN0TGVuZ3RoKTsKKyAgICAgIHN0cmVhbS5wb3MgPSBpbml0aWFsU3RyZWFtUG9zOworICAgICAgY2FjaGVLZXkgPSBjb21wdXRlQWRsZXIzMihpbWFnZUJ5dGVzKSArICJfIiArIGNvbXB1dGVBZGxlcjMyKGRpY3RCeXRlcyk7CisgICAgICBjb25zdCBjYWNoZUVudHJ5ID0gdGhpcy5pbWFnZUNhY2hlW2NhY2hlS2V5XTsKKworICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkgeworICAgICAgICB0aGlzLmJ1ZjIgPSBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJFSSIpOworICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgIGNhY2hlRW50cnkucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIGNhY2hlRW50cnk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgeworICAgICAgaW1hZ2VTdHJlYW0gPSBjaXBoZXJUcmFuc2Zvcm0uY3JlYXRlU3RyZWFtKGltYWdlU3RyZWFtLCBsZW5ndGgpOworICAgIH0KKworICAgIGltYWdlU3RyZWFtID0gdGhpcy5maWx0ZXIoaW1hZ2VTdHJlYW0sIGRpY3QsIGxlbmd0aCk7CisgICAgaW1hZ2VTdHJlYW0uZGljdCA9IGRpY3Q7CisKKyAgICBpZiAoY2FjaGVLZXkgIT09IHVuZGVmaW5lZCkgeworICAgICAgaW1hZ2VTdHJlYW0uY2FjaGVLZXkgPSBgaW5saW5lXyR7bGVuZ3RofV8ke2NhY2hlS2V5fWA7CisgICAgICB0aGlzLmltYWdlQ2FjaGVbY2FjaGVLZXldID0gaW1hZ2VTdHJlYW07CisgICAgfQorCisgICAgdGhpcy5idWYyID0gX3ByaW1pdGl2ZXMuQ21kLmdldCgiRUkiKTsKKyAgICB0aGlzLnNoaWZ0KCk7CisgICAgcmV0dXJuIGltYWdlU3RyZWFtOworICB9CisKKyAgX2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MsIHNpZ25hdHVyZSkgeworICAgIGNvbnN0IHsKKyAgICAgIHN0cmVhbQorICAgIH0gPSB0aGlzLmxleGVyOworICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvczsKKyAgICBjb25zdCBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7CisgICAgY29uc3Qgc2lnbmF0dXJlTGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aDsKKworICAgIHdoaWxlIChzdHJlYW0ucG9zIDwgc3RyZWFtLmVuZCkgeworICAgICAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhTQ0FOX0JMT0NLX0xFTkdUSCk7CisgICAgICBjb25zdCBzY2FuTGVuZ3RoID0gc2NhbkJ5dGVzLmxlbmd0aCAtIHNpZ25hdHVyZUxlbmd0aDsKKworICAgICAgaWYgKHNjYW5MZW5ndGggPD0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbGV0IHBvcyA9IDA7CisKKyAgICAgIHdoaWxlIChwb3MgPCBzY2FuTGVuZ3RoKSB7CisgICAgICAgIGxldCBqID0gMDsKKworICAgICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zICsgal0gPT09IHNpZ25hdHVyZVtqXSkgeworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqID49IHNpZ25hdHVyZUxlbmd0aCkgeworICAgICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zOworICAgICAgICAgIHJldHVybiBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CisgICAgICAgIH0KKworICAgICAgICBwb3MrKzsKKyAgICAgIH0KKworICAgICAgc3RyZWFtLnBvcyArPSBzY2FuTGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKSB7CisgICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyOworICAgIGxldCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CisgICAgbGV4ZXIuc2tpcFRvTmV4dExpbmUoKTsKKyAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3MgLSAxOworICAgIGxldCBsZW5ndGggPSBkaWN0LmdldCgiTGVuZ3RoIik7CisKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkgeworICAgICAgKDAsIF91dGlsLmluZm8pKGBCYWQgbGVuZ3RoICIke2xlbmd0aH0iIGluIHN0cmVhbWApOworICAgICAgbGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3MgKyBsZW5ndGg7CisgICAgbGV4ZXIubmV4dENoYXIoKTsKKworICAgIGlmICh0aGlzLnRyeVNoaWZ0KCkgJiYgKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjIsICJlbmRzdHJlYW0iKSkgeworICAgICAgdGhpcy5zaGlmdCgpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBFTkRTVFJFQU1fU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NkUsIDB4NjQsIDB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NkRdKTsKKworICAgICAgbGV0IGFjdHVhbExlbmd0aCA9IHRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MsIEVORFNUUkVBTV9TSUdOQVRVUkUpOworCisgICAgICBpZiAoYWN0dWFsTGVuZ3RoIDwgMCkgeworICAgICAgICBjb25zdCBNQVhfVFJVTkNBVElPTiA9IDE7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gTUFYX1RSVU5DQVRJT047IGkrKykgeworICAgICAgICAgIGNvbnN0IGVuZCA9IEVORFNUUkVBTV9TSUdOQVRVUkUubGVuZ3RoIC0gaTsKKyAgICAgICAgICBjb25zdCBUUlVOQ0FURURfU0lHTkFUVVJFID0gRU5EU1RSRUFNX1NJR05BVFVSRS5zbGljZSgwLCBlbmQpOworCisgICAgICAgICAgY29uc3QgbWF5YmVMZW5ndGggPSB0aGlzLl9maW5kU3RyZWFtTGVuZ3RoKHN0YXJ0UG9zLCBUUlVOQ0FURURfU0lHTkFUVVJFKTsKKworICAgICAgICAgIGlmIChtYXliZUxlbmd0aCA+PSAwKSB7CisgICAgICAgICAgICBjb25zdCBsYXN0Qnl0ZSA9IHN0cmVhbS5wZWVrQnl0ZXMoZW5kICsgMSlbZW5kXTsKKworICAgICAgICAgICAgaWYgKCEoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShsYXN0Qnl0ZSkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgRm91bmQgIiR7KDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKFRSVU5DQVRFRF9TSUdOQVRVUkUpfSIgd2hlbiBgICsgInNlYXJjaGluZyBmb3IgZW5kc3RyZWFtIGNvbW1hbmQuIik7CisgICAgICAgICAgICBhY3R1YWxMZW5ndGggPSBtYXliZUxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhY3R1YWxMZW5ndGggPCAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNaXNzaW5nIGVuZHN0cmVhbSBjb21tYW5kLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxlbmd0aCA9IGFjdHVhbExlbmd0aDsKKyAgICAgIGxleGVyLm5leHRDaGFyKCk7CisgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgfQorCisgICAgdGhpcy5zaGlmdCgpOworICAgIHN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOworCisgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgeworICAgICAgc3RyZWFtID0gY2lwaGVyVHJhbnNmb3JtLmNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCk7CisgICAgfQorCisgICAgc3RyZWFtID0gdGhpcy5maWx0ZXIoc3RyZWFtLCBkaWN0LCBsZW5ndGgpOworICAgIHN0cmVhbS5kaWN0ID0gZGljdDsKKyAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKSB7CisgICAgbGV0IGZpbHRlciA9IGRpY3QuZ2V0KCJGaWx0ZXIiLCAiRiIpOworICAgIGxldCBwYXJhbXMgPSBkaWN0LmdldCgiRGVjb2RlUGFybXMiLCAiRFAiKTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmaWx0ZXIpKSB7CisgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiL0RlY29kZVBhcm1zIHNob3VsZCBub3QgY29udGFpbiBhbiBBcnJheSwgIiArICJ3aGVuIC9GaWx0ZXIgY29udGFpbnMgYSBOYW1lLiIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIGxlbmd0aCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBsZXQgbWF5YmVMZW5ndGggPSBsZW5ndGg7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7CisgICAgICBjb25zdCBmaWx0ZXJBcnJheSA9IGZpbHRlcjsKKyAgICAgIGNvbnN0IHBhcmFtc0FycmF5ID0gcGFyYW1zOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmaWx0ZXJBcnJheS5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIGZpbHRlciA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZpbHRlckFycmF5W2ldKTsKKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpbHRlcikpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEJhZCBmaWx0ZXIgbmFtZSAiJHtmaWx0ZXJ9ImApOworICAgICAgICB9CisKKyAgICAgICAgcGFyYW1zID0gbnVsbDsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXNBcnJheSkgJiYgaSBpbiBwYXJhbXNBcnJheSkgeworICAgICAgICAgIHBhcmFtcyA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHBhcmFtc0FycmF5W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmVhbSA9IHRoaXMubWFrZUZpbHRlcihzdHJlYW0sIGZpbHRlci5uYW1lLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKKyAgICAgICAgbWF5YmVMZW5ndGggPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHJlYW07CisgIH0KKworICBtYWtlRmlsdGVyKHN0cmVhbSwgbmFtZSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgeworICAgIGlmIChtYXliZUxlbmd0aCA9PT0gMCkgeworICAgICAgKDAsIF91dGlsLndhcm4pKGBFbXB0eSAiJHtuYW1lfSIgc3RyZWFtLmApOworICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLk51bGxTdHJlYW0oKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgY29uc3QgeHJlZlN0cmVhbVN0YXRzID0gdGhpcy54cmVmLnN0YXRzLnN0cmVhbVR5cGVzOworCisgICAgICBpZiAobmFtZSA9PT0gIkZsYXRlRGVjb2RlIiB8fCBuYW1lID09PSAiRmwiKSB7CisgICAgICAgIHhyZWZTdHJlYW1TdGF0c1tfdXRpbC5TdHJlYW1UeXBlLkZMQVRFXSA9IHRydWU7CisKKyAgICAgICAgaWYgKHBhcmFtcykgeworICAgICAgICAgIHJldHVybiBuZXcgX3N0cmVhbS5QcmVkaWN0b3JTdHJlYW0obmV3IF9zdHJlYW0uRmxhdGVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCksIG1heWJlTGVuZ3RoLCBwYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLkZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkxaV0RlY29kZSIgfHwgbmFtZSA9PT0gIkxaVyIpIHsKKyAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuTFpXXSA9IHRydWU7CisgICAgICAgIGxldCBlYXJseUNoYW5nZSA9IDE7CisKKyAgICAgICAgaWYgKHBhcmFtcykgeworICAgICAgICAgIGlmIChwYXJhbXMuaGFzKCJFYXJseUNoYW5nZSIpKSB7CisgICAgICAgICAgICBlYXJseUNoYW5nZSA9IHBhcmFtcy5nZXQoIkVhcmx5Q2hhbmdlIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLlByZWRpY3RvclN0cmVhbShuZXcgX3N0cmVhbS5MWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgX3N0cmVhbS5MWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkRDVERlY29kZSIgfHwgbmFtZSA9PT0gIkRDVCIpIHsKKyAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuRENUXSA9IHRydWU7CisgICAgICAgIHJldHVybiBuZXcgX2pwZWdfc3RyZWFtLkpwZWdTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgc3RyZWFtLmRpY3QsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIGlmIChuYW1lID09PSAiSlBYRGVjb2RlIiB8fCBuYW1lID09PSAiSlBYIikgeworICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5KUFhdID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBfanB4X3N0cmVhbS5KcHhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgc3RyZWFtLmRpY3QsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIGlmIChuYW1lID09PSAiQVNDSUk4NURlY29kZSIgfHwgbmFtZSA9PT0gIkE4NSIpIHsKKyAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuQTg1XSA9IHRydWU7CisgICAgICAgIHJldHVybiBuZXcgX3N0cmVhbS5Bc2NpaTg1U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkFTQ0lJSGV4RGVjb2RlIiB8fCBuYW1lID09PSAiQUh4IikgeworICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5BSFhdID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLkFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkNDSVRURmF4RGVjb2RlIiB8fCBuYW1lID09PSAiQ0NGIikgeworICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5DQ0ZdID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBfY2NpdHRfc3RyZWFtLkNDSVRURmF4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIGlmIChuYW1lID09PSAiUnVuTGVuZ3RoRGVjb2RlIiB8fCBuYW1lID09PSAiUkwiKSB7CisgICAgICAgIHhyZWZTdHJlYW1TdGF0c1tfdXRpbC5TdHJlYW1UeXBlLlJMWF0gPSB0cnVlOworICAgICAgICByZXR1cm4gbmV3IF9zdHJlYW0uUnVuTGVuZ3RoU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkpCSUcyRGVjb2RlIikgeworICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5KQklHXSA9IHRydWU7CisgICAgICAgIHJldHVybiBuZXcgX2piaWcyX3N0cmVhbS5KYmlnMlN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBzdHJlYW0uZGljdCwgcGFyYW1zKTsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBGaWx0ZXIgIiR7bmFtZX0iIGlzIG5vdCBzdXBwb3J0ZWQuYCk7CisgICAgICByZXR1cm4gc3RyZWFtOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBJbnZhbGlkIHN0cmVhbTogIiR7ZXh9ImApOworICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLk51bGxTdHJlYW0oKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLlBhcnNlciA9IFBhcnNlcjsKK2NvbnN0IHNwZWNpYWxDaGFycyA9IFsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKKworZnVuY3Rpb24gdG9IZXhEaWdpdChjaCkgeworICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB7CisgICAgcmV0dXJuIGNoICYgMHgwZjsKKyAgfQorCisgIGlmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSB7CisgICAgcmV0dXJuIChjaCAmIDB4MGYpICsgOTsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworY2xhc3MgTGV4ZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0sIGtub3duQ29tbWFuZHMgPSBudWxsKSB7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5uZXh0Q2hhcigpOworICAgIHRoaXMuc3RyQnVmID0gW107CisgICAgdGhpcy5rbm93bkNvbW1hbmRzID0ga25vd25Db21tYW5kczsKKyAgICB0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID0gMDsKKyAgICB0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3MgPSAtMTsKKyAgfQorCisgIG5leHRDaGFyKCkgeworICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICB9CisKKyAgcGVla0NoYXIoKSB7CisgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBlZWtCeXRlKCk7CisgIH0KKworICBnZXROdW1iZXIoKSB7CisgICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKKyAgICBsZXQgZU5vdGF0aW9uID0gZmFsc2U7CisgICAgbGV0IGRpdmlkZUJ5ID0gMDsKKyAgICBsZXQgc2lnbiA9IDA7CisKKyAgICBpZiAoY2ggPT09IDB4MmQpIHsKKyAgICAgIHNpZ24gPSAtMTsKKyAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgICBpZiAoY2ggPT09IDB4MmQpIHsKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyYikgeworICAgICAgc2lnbiA9IDE7CisgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICB9CisKKyAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICB9IHdoaWxlIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCk7CisgICAgfQorCisgICAgaWYgKGNoID09PSAweDJlKSB7CisgICAgICBkaXZpZGVCeSA9IDEwOworICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgfQorCisgICAgaWYgKGNoIDwgMHgzMCB8fCBjaCA+IDB4MzkpIHsKKyAgICAgIGlmIChkaXZpZGVCeSA9PT0gMTAgJiYgc2lnbiA9PT0gMCAmJiAoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpIHx8IGNoID09PSAtMSkpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJMZXhlci5nZXROdW1iZXIgLSB0cmVhdGluZyBhIHNpbmdsZSBkZWNpbWFsIHBvaW50IGFzIHplcm8uIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgbnVtYmVyOiAke1N0cmluZy5mcm9tQ2hhckNvZGUoY2gpfSAoY2hhckNvZGUgJHtjaH0pYCk7CisgICAgfQorCisgICAgc2lnbiA9IHNpZ24gfHwgMTsKKyAgICBsZXQgYmFzZVZhbHVlID0gY2ggLSAweDMwOworICAgIGxldCBwb3dlclZhbHVlID0gMDsKKyAgICBsZXQgcG93ZXJWYWx1ZVNpZ24gPSAxOworCisgICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgeworICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkgeworICAgICAgICBjb25zdCBjdXJyZW50RGlnaXQgPSBjaCAtIDB4MzA7CisKKyAgICAgICAgaWYgKGVOb3RhdGlvbikgeworICAgICAgICAgIHBvd2VyVmFsdWUgPSBwb3dlclZhbHVlICogMTAgKyBjdXJyZW50RGlnaXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CisgICAgICAgICAgICBkaXZpZGVCeSAqPSAxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBiYXNlVmFsdWUgPSBiYXNlVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyZSkgeworICAgICAgICBpZiAoZGl2aWRlQnkgPT09IDApIHsKKyAgICAgICAgICBkaXZpZGVCeSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MmQpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJCYWRseSBmb3JtYXR0ZWQgbnVtYmVyOiBtaW51cyBzaWduIGluIHRoZSBtaWRkbGUiKTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NDUgfHwgY2ggPT09IDB4NjUpIHsKKyAgICAgICAgY2ggPSB0aGlzLnBlZWtDaGFyKCk7CisKKyAgICAgICAgaWYgKGNoID09PSAweDJiIHx8IGNoID09PSAweDJkKSB7CisgICAgICAgICAgcG93ZXJWYWx1ZVNpZ24gPSBjaCA9PT0gMHgyZCA/IC0xIDogMTsKKyAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPCAweDMwIHx8IGNoID4gMHgzOSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZU5vdGF0aW9uID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChkaXZpZGVCeSAhPT0gMCkgeworICAgICAgYmFzZVZhbHVlIC89IGRpdmlkZUJ5OworICAgIH0KKworICAgIGlmIChlTm90YXRpb24pIHsKKyAgICAgIGJhc2VWYWx1ZSAqPSAxMCAqKiAocG93ZXJWYWx1ZVNpZ24gKiBwb3dlclZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2lnbiAqIGJhc2VWYWx1ZTsKKyAgfQorCisgIGdldFN0cmluZygpIHsKKyAgICBsZXQgbnVtUGFyZW4gPSAxOworICAgIGxldCBkb25lID0gZmFsc2U7CisgICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CisgICAgc3RyQnVmLmxlbmd0aCA9IDA7CisgICAgbGV0IGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGxldCBjaGFyQnVmZmVyZWQgPSBmYWxzZTsKKworICAgICAgc3dpdGNoIChjaCB8IDApIHsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4Mjg6CisgICAgICAgICAgKytudW1QYXJlbjsKKyAgICAgICAgICBzdHJCdWYucHVzaCgiKCIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgyOToKKyAgICAgICAgICBpZiAoLS1udW1QYXJlbiA9PT0gMCkgeworICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIpIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDVjOgorICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7CisgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDZlOgorICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXG4iKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHg3MjoKKyAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxyIik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4NzQ6CisgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcdCIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDYyOgorICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXGIiKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHg2NjoKKyAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxmIik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4NWM6CisgICAgICAgICAgICBjYXNlIDB4Mjg6CisgICAgICAgICAgICBjYXNlIDB4Mjk6CisgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHgzMDoKKyAgICAgICAgICAgIGNhc2UgMHgzMToKKyAgICAgICAgICAgIGNhc2UgMHgzMjoKKyAgICAgICAgICAgIGNhc2UgMHgzMzoKKyAgICAgICAgICAgIGNhc2UgMHgzNDoKKyAgICAgICAgICAgIGNhc2UgMHgzNToKKyAgICAgICAgICAgIGNhc2UgMHgzNjoKKyAgICAgICAgICAgIGNhc2UgMHgzNzoKKyAgICAgICAgICAgICAgbGV0IHggPSBjaCAmIDB4MGY7CisgICAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgICBjaGFyQnVmZmVyZWQgPSB0cnVlOworCisgICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKKyAgICAgICAgICAgICAgICB4ID0gKHggPDwgMykgKyAoY2ggJiAweDBmKTsKKyAgICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKKyAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgeCA9ICh4IDw8IDMpICsgKGNoICYgMHgwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh4KSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4MGQ6CisgICAgICAgICAgICAgIGlmICh0aGlzLnBlZWtDaGFyKCkgPT09IDB4MGEpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDBhOgorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICghY2hhckJ1ZmZlcmVkKSB7CisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHJCdWYuam9pbigiIik7CisgIH0KKworICBnZXROYW1lKCkgeworICAgIGxldCBjaCwgcHJldmlvdXNDaDsKKyAgICBjb25zdCBzdHJCdWYgPSB0aGlzLnN0ckJ1ZjsKKyAgICBzdHJCdWYubGVuZ3RoID0gMDsKKworICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgIXNwZWNpYWxDaGFyc1tjaF0pIHsKKyAgICAgIGlmIChjaCA9PT0gMHgyMykgeworICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICBpZiAoc3BlY2lhbENoYXJzW2NoXSkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTGV4ZXJfZ2V0TmFtZTogIiArICJOVU1CRVIgU0lHTiAoIykgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgaGV4YWRlY2ltYWwgbnVtYmVyLiIpOworICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB4ID0gdG9IZXhEaWdpdChjaCk7CisKKyAgICAgICAgaWYgKHggIT09IC0xKSB7CisgICAgICAgICAgcHJldmlvdXNDaCA9IGNoOworICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgIGNvbnN0IHgyID0gdG9IZXhEaWdpdChjaCk7CisKKyAgICAgICAgICBpZiAoeDIgPT09IC0xKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYExleGVyX2dldE5hbWU6IElsbGVnYWwgZGlnaXQgKCR7U3RyaW5nLmZyb21DaGFyQ29kZShjaCl9KSBgICsgImluIGhleGFkZWNpbWFsIG51bWJlci4iKTsKKyAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIiwgU3RyaW5nLmZyb21DaGFyQ29kZShwcmV2aW91c0NoKSk7CisKKyAgICAgICAgICAgIGlmIChzcGVjaWFsQ2hhcnNbY2hdKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHggPDwgNCB8IHgyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RyQnVmLnB1c2goIiMiLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RyQnVmLmxlbmd0aCA+IDEyNykgeworICAgICAgKDAsIF91dGlsLndhcm4pKGBOYW1lIHRva2VuIGlzIGxvbmdlciB0aGFuIGFsbG93ZWQgYnkgdGhlIHNwZWM6ICR7c3RyQnVmLmxlbmd0aH1gKTsKKyAgICB9CisKKyAgICByZXR1cm4gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoc3RyQnVmLmpvaW4oIiIpKTsKKyAgfQorCisgIF9oZXhTdHJpbmdXYXJuKGNoKSB7CisgICAgY29uc3QgTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4gPSA1OworCisgICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4rKyA9PT0gTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4pIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiZ2V0SGV4U3RyaW5nIC0gaWdub3JpbmcgYWRkaXRpb25hbCBpbnZhbGlkIGNoYXJhY3RlcnMuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4gPiBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgICgwLCBfdXRpbC53YXJuKShgZ2V0SGV4U3RyaW5nIC0gaWdub3JpbmcgaW52YWxpZCBjaGFyYWN0ZXI6ICR7Y2h9YCk7CisgIH0KKworICBnZXRIZXhTdHJpbmcoKSB7CisgICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CisgICAgc3RyQnVmLmxlbmd0aCA9IDA7CisgICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKKyAgICBsZXQgaXNGaXJzdEhleCA9IHRydWU7CisgICAgbGV0IGZpcnN0RGlnaXQsIHNlY29uZERpZ2l0OworICAgIHRoaXMuX2hleFN0cmluZ051bVdhcm4gPSAwOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnRlcm1pbmF0ZWQgaGV4IHN0cmluZyIpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4M2UpIHsKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAoc3BlY2lhbENoYXJzW2NoXSA9PT0gMSkgeworICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNGaXJzdEhleCkgeworICAgICAgICAgIGZpcnN0RGlnaXQgPSB0b0hleERpZ2l0KGNoKTsKKworICAgICAgICAgIGlmIChmaXJzdERpZ2l0ID09PSAtMSkgeworICAgICAgICAgICAgdGhpcy5faGV4U3RyaW5nV2FybihjaCk7CisKKyAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlY29uZERpZ2l0ID0gdG9IZXhEaWdpdChjaCk7CisKKyAgICAgICAgICBpZiAoc2Vjb25kRGlnaXQgPT09IC0xKSB7CisgICAgICAgICAgICB0aGlzLl9oZXhTdHJpbmdXYXJuKGNoKTsKKworICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGZpcnN0RGlnaXQgPDwgNCB8IHNlY29uZERpZ2l0KSk7CisgICAgICAgIH0KKworICAgICAgICBpc0ZpcnN0SGV4ID0gIWlzRmlyc3RIZXg7CisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHJCdWYuam9pbigiIik7CisgIH0KKworICBnZXRPYmooKSB7CisgICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKKyAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkVPRjsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbW1lbnQpIHsKKyAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CisgICAgICAgICAgY29tbWVudCA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CisgICAgICAgIGNvbW1lbnQgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdICE9PSAxKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNoIHwgMCkgeworICAgICAgY2FzZSAweDMwOgorICAgICAgY2FzZSAweDMxOgorICAgICAgY2FzZSAweDMyOgorICAgICAgY2FzZSAweDMzOgorICAgICAgY2FzZSAweDM0OgorICAgICAgY2FzZSAweDM1OgorICAgICAgY2FzZSAweDM2OgorICAgICAgY2FzZSAweDM3OgorICAgICAgY2FzZSAweDM4OgorICAgICAgY2FzZSAweDM5OgorICAgICAgY2FzZSAweDJiOgorICAgICAgY2FzZSAweDJkOgorICAgICAgY2FzZSAweDJlOgorICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTsKKworICAgICAgY2FzZSAweDI4OgorICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoKTsKKworICAgICAgY2FzZSAweDJmOgorICAgICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCk7CisKKyAgICAgIGNhc2UgMHg1YjoKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgiWyIpOworCisgICAgICBjYXNlIDB4NWQ6CisgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIl0iKTsKKworICAgICAgY2FzZSAweDNjOgorICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICBpZiAoY2ggPT09IDB4M2MpIHsKKyAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIjw8Iik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5nZXRIZXhTdHJpbmcoKTsKKworICAgICAgY2FzZSAweDNlOgorICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICBpZiAoY2ggPT09IDB4M2UpIHsKKyAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIj4+Iik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgiPiIpOworCisgICAgICBjYXNlIDB4N2I6CisgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoInsiKTsKKworICAgICAgY2FzZSAweDdkOgorICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJ9Iik7CisKKyAgICAgIGNhc2UgMHgyOToKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYElsbGVnYWwgY2hhcmFjdGVyOiAke2NofWApOworICAgIH0KKworICAgIGxldCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKyAgICBjb25zdCBrbm93bkNvbW1hbmRzID0gdGhpcy5rbm93bkNvbW1hbmRzOworICAgIGxldCBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHMgJiYga25vd25Db21tYW5kc1tzdHJdICE9PSB1bmRlZmluZWQ7CisKKyAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmICFzcGVjaWFsQ2hhcnNbY2hdKSB7CisgICAgICBjb25zdCBwb3NzaWJsZUNvbW1hbmQgPSBzdHIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKworICAgICAgaWYgKGtub3duQ29tbWFuZEZvdW5kICYmIGtub3duQ29tbWFuZHNbcG9zc2libGVDb21tYW5kXSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTI4KSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHtzdHIubGVuZ3RofWApOworICAgICAgfQorCisgICAgICBzdHIgPSBwb3NzaWJsZUNvbW1hbmQ7CisgICAgICBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHMgJiYga25vd25Db21tYW5kc1tzdHJdICE9PSB1bmRlZmluZWQ7CisgICAgfQorCisgICAgaWYgKHN0ciA9PT0gInRydWUiKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoc3RyID09PSAiZmFsc2UiKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0ciA9PT0gIm51bGwiKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAoc3RyID09PSAiQkkiKSB7CisgICAgICB0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3MgPSB0aGlzLnN0cmVhbS5wb3M7CisgICAgfQorCisgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoc3RyKTsKKyAgfQorCisgIHBlZWtPYmooKSB7CisgICAgY29uc3Qgc3RyZWFtUG9zID0gdGhpcy5zdHJlYW0ucG9zLAorICAgICAgICAgIGN1cnJlbnRDaGFyID0gdGhpcy5jdXJyZW50Q2hhciwKKyAgICAgICAgICBiZWdpbklubGluZUltYWdlUG9zID0gdGhpcy5iZWdpbklubGluZUltYWdlUG9zOworICAgIGxldCBuZXh0T2JqOworCisgICAgdHJ5IHsKKyAgICAgIG5leHRPYmogPSB0aGlzLmdldE9iaigpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBwZWVrT2JqOiAke2V4fWApOworICAgIH0KKworICAgIHRoaXMuc3RyZWFtLnBvcyA9IHN0cmVhbVBvczsKKyAgICB0aGlzLmN1cnJlbnRDaGFyID0gY3VycmVudENoYXI7CisgICAgdGhpcy5iZWdpbklubGluZUltYWdlUG9zID0gYmVnaW5JbmxpbmVJbWFnZVBvczsKKyAgICByZXR1cm4gbmV4dE9iajsKKyAgfQorCisgIHNraXBUb05leHRMaW5lKCkgeworICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CisKKyAgICB3aGlsZSAoY2ggPj0gMCkgeworICAgICAgaWYgKGNoID09PSAweDBkKSB7CisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgICAgIGlmIChjaCA9PT0gMHgwYSkgeworICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgwYSkgeworICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLkxleGVyID0gTGV4ZXI7CisKK2NsYXNzIExpbmVhcml6YXRpb24geworICBzdGF0aWMgY3JlYXRlKHN0cmVhbSkgeworICAgIGZ1bmN0aW9uIGdldEludChsaW5EaWN0LCBuYW1lLCBhbGxvd1plcm9WYWx1ZSA9IGZhbHNlKSB7CisgICAgICBjb25zdCBvYmogPSBsaW5EaWN0LmdldChuYW1lKTsKKworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSAmJiAoYWxsb3daZXJvVmFsdWUgPyBvYmogPj0gMCA6IG9iaiA+IDApKSB7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICIke25hbWV9IiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gYCArICJkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gZ2V0SGludHMobGluRGljdCkgeworICAgICAgY29uc3QgaGludHMgPSBsaW5EaWN0LmdldCgiSCIpOworICAgICAgbGV0IGhpbnRzTGVuZ3RoOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShoaW50cykgJiYgKChoaW50c0xlbmd0aCA9IGhpbnRzLmxlbmd0aCkgPT09IDIgfHwgaGludHNMZW5ndGggPT09IDQpKSB7CisgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBoaW50c0xlbmd0aDsgaW5kZXgrKykgeworICAgICAgICAgIGNvbnN0IGhpbnQgPSBoaW50c1tpbmRleF07CisKKyAgICAgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKGhpbnQpICYmIGhpbnQgPiAwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIaW50ICgke2luZGV4fSkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmApOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoaW50czsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKTsKKyAgICB9CisKKyAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHsKKyAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKKyAgICAgIHhyZWY6IG51bGwKKyAgICB9KTsKKyAgICBjb25zdCBvYmoxID0gcGFyc2VyLmdldE9iaigpOworICAgIGNvbnN0IG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgY29uc3Qgb2JqMyA9IHBhcnNlci5nZXRPYmooKTsKKyAgICBjb25zdCBsaW5EaWN0ID0gcGFyc2VyLmdldE9iaigpOworICAgIGxldCBvYmosIGxlbmd0aDsKKworICAgIGlmICghKE51bWJlci5pc0ludGVnZXIob2JqMSkgJiYgTnVtYmVyLmlzSW50ZWdlcihvYmoyKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iajMsICJvYmoiKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShsaW5EaWN0KSAmJiAoMCwgX3V0aWwuaXNOdW0pKG9iaiA9IGxpbkRpY3QuZ2V0KCJMaW5lYXJpemVkIikpICYmIG9iaiA+IDApKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgaWYgKChsZW5ndGggPSBnZXRJbnQobGluRGljdCwgIkwiKSkgIT09IHN0cmVhbS5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignVGhlICJMIiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSAnICsgImRvZXMgbm90IGVxdWFsIHRoZSBzdHJlYW0gbGVuZ3RoLiIpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBsZW5ndGgsCisgICAgICBoaW50czogZ2V0SGludHMobGluRGljdCksCisgICAgICBvYmplY3ROdW1iZXJGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJPIiksCisgICAgICBlbmRGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJFIiksCisgICAgICBudW1QYWdlczogZ2V0SW50KGxpbkRpY3QsICJOIiksCisgICAgICBtYWluWFJlZkVudHJpZXNPZmZzZXQ6IGdldEludChsaW5EaWN0LCAiVCIpLAorICAgICAgcGFnZUZpcnN0OiBsaW5EaWN0LmhhcygiUCIpID8gZ2V0SW50KGxpbkRpY3QsICJQIiwgdHJ1ZSkgOiAwCisgICAgfTsKKyAgfQorCit9CisKK2V4cG9ydHMuTGluZWFyaXphdGlvbiA9IExpbmVhcml6YXRpb247CisKKy8qKiovIH0pLAorLyogMTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5MWldTdHJlYW0gPSBleHBvcnRzLlN0cmluZ1N0cmVhbSA9IGV4cG9ydHMuU3RyZWFtc1NlcXVlbmNlU3RyZWFtID0gZXhwb3J0cy5TdHJlYW0gPSBleHBvcnRzLlJ1bkxlbmd0aFN0cmVhbSA9IGV4cG9ydHMuUHJlZGljdG9yU3RyZWFtID0gZXhwb3J0cy5OdWxsU3RyZWFtID0gZXhwb3J0cy5GbGF0ZVN0cmVhbSA9IGV4cG9ydHMuRGVjb2RlU3RyZWFtID0gZXhwb3J0cy5EZWNyeXB0U3RyZWFtID0gZXhwb3J0cy5Bc2NpaUhleFN0cmVhbSA9IGV4cG9ydHMuQXNjaWk4NVN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKwordmFyIFN0cmVhbSA9IGZ1bmN0aW9uIFN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFN0cmVhbShhcnJheUJ1ZmZlciwgc3RhcnQsIGxlbmd0aCwgZGljdCkgeworICAgIHRoaXMuYnl0ZXMgPSBhcnJheUJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBhcnJheUJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTsKKyAgICB0aGlzLnN0YXJ0ID0gc3RhcnQgfHwgMDsKKyAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CisgICAgdGhpcy5lbmQgPSBzdGFydCArIGxlbmd0aCB8fCB0aGlzLmJ5dGVzLmxlbmd0aDsKKyAgICB0aGlzLmRpY3QgPSBkaWN0OworICB9CisKKyAgU3RyZWFtLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgbGVuZ3RoKCkgeworICAgICAgcmV0dXJuIHRoaXMuZW5kIC0gdGhpcy5zdGFydDsKKyAgICB9LAorCisgICAgZ2V0IGlzRW1wdHkoKSB7CisgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7CisgICAgfSwKKworICAgIGdldEJ5dGU6IGZ1bmN0aW9uIFN0cmVhbV9nZXRCeXRlKCkgeworICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuZW5kKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107CisgICAgfSwKKyAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIFN0cmVhbV9nZXRVaW50MTYoKSB7CisgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpOworCisgICAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTsKKyAgICB9LAorICAgIGdldEludDMyOiBmdW5jdGlvbiBTdHJlYW1fZ2V0SW50MzIoKSB7CisgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIyID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOworICAgIH0sCisKKyAgICBnZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCA9IGZhbHNlKSB7CisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzOworICAgICAgdmFyIHBvcyA9IHRoaXMucG9zOworICAgICAgdmFyIHN0ckVuZCA9IHRoaXMuZW5kOworCisgICAgICBpZiAoIWxlbmd0aCkgeworICAgICAgICBjb25zdCBzdWJhcnJheSA9IGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTsKKyAgICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTsKKyAgICAgIH0KKworICAgICAgdmFyIGVuZCA9IHBvcyArIGxlbmd0aDsKKworICAgICAgaWYgKGVuZCA+IHN0ckVuZCkgeworICAgICAgICBlbmQgPSBzdHJFbmQ7CisgICAgICB9CisKKyAgICAgIHRoaXMucG9zID0gZW5kOworICAgICAgY29uc3Qgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7CisgICAgICByZXR1cm4gZm9yY2VDbGFtcGVkID8gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN1YmFycmF5KSA6IHN1YmFycmF5OworICAgIH0sCisKKyAgICBwZWVrQnl0ZTogZnVuY3Rpb24gU3RyZWFtX3BlZWtCeXRlKCkgeworICAgICAgdmFyIHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTsKKworICAgICAgaWYgKHBlZWtlZEJ5dGUgIT09IC0xKSB7CisgICAgICAgIHRoaXMucG9zLS07CisgICAgICB9CisKKyAgICAgIHJldHVybiBwZWVrZWRCeXRlOworICAgIH0sCisKKyAgICBwZWVrQnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkgeworICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7CisgICAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7CisgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfSwKKworICAgIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgICBpZiAoYmVnaW4gPCAwKSB7CisgICAgICAgIGJlZ2luID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKGVuZCA+IHRoaXMuZW5kKSB7CisgICAgICAgIGVuZCA9IHRoaXMuZW5kOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheShiZWdpbiwgZW5kKTsKKyAgICB9LAorCisgICAgc2tpcDogZnVuY3Rpb24gU3RyZWFtX3NraXAobikgeworICAgICAgaWYgKCFuKSB7CisgICAgICAgIG4gPSAxOworICAgICAgfQorCisgICAgICB0aGlzLnBvcyArPSBuOworICAgIH0sCisgICAgcmVzZXQ6IGZ1bmN0aW9uIFN0cmVhbV9yZXNldCgpIHsKKyAgICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDsKKyAgICB9LAorICAgIG1vdmVTdGFydDogZnVuY3Rpb24gU3RyZWFtX21vdmVTdGFydCgpIHsKKyAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKKyAgICB9LAorICAgIG1ha2VTdWJTdHJlYW06IGZ1bmN0aW9uIFN0cmVhbV9tYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QpIHsKKyAgICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnl0ZXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KTsKKyAgICB9CisgIH07CisgIHJldHVybiBTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuU3RyZWFtID0gU3RyZWFtOworCit2YXIgU3RyaW5nU3RyZWFtID0gZnVuY3Rpb24gU3RyaW5nU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gU3RyaW5nU3RyZWFtKHN0cikgeworICAgIGNvbnN0IGJ5dGVzID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHN0cik7CisgICAgU3RyZWFtLmNhbGwodGhpcywgYnl0ZXMpOworICB9CisKKyAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZSA9IFN0cmVhbS5wcm90b3R5cGU7CisgIHJldHVybiBTdHJpbmdTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuU3RyaW5nU3RyZWFtID0gU3RyaW5nU3RyZWFtOworCit2YXIgRGVjb2RlU3RyZWFtID0gZnVuY3Rpb24gRGVjb2RlU3RyZWFtQ2xvc3VyZSgpIHsKKyAgdmFyIGVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7CisKKyAgZnVuY3Rpb24gRGVjb2RlU3RyZWFtKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CisgICAgdGhpcy5fcmF3TWluQnVmZmVyTGVuZ3RoID0gbWF5YmVNaW5CdWZmZXJMZW5ndGggfHwgMDsKKyAgICB0aGlzLnBvcyA9IDA7CisgICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOworICAgIHRoaXMuZW9mID0gZmFsc2U7CisgICAgdGhpcy5idWZmZXIgPSBlbXB0eUJ1ZmZlcjsKKyAgICB0aGlzLm1pbkJ1ZmZlckxlbmd0aCA9IDUxMjsKKworICAgIGlmIChtYXliZU1pbkJ1ZmZlckxlbmd0aCkgeworICAgICAgd2hpbGUgKHRoaXMubWluQnVmZmVyTGVuZ3RoIDwgbWF5YmVNaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggKj0gMjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlID0geworICAgIGdldCBpc0VtcHR5KCkgeworICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMCkgeworICAgICAgICB0aGlzLnJlYWRCbG9jaygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5idWZmZXJMZW5ndGggPT09IDA7CisgICAgfSwKKworICAgIGVuc3VyZUJ1ZmZlcjogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2Vuc3VyZUJ1ZmZlcihyZXF1ZXN0ZWQpIHsKKyAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKKworICAgICAgaWYgKHJlcXVlc3RlZCA8PSBidWZmZXIuYnl0ZUxlbmd0aCkgeworICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgfQorCisgICAgICB2YXIgc2l6ZSA9IHRoaXMubWluQnVmZmVyTGVuZ3RoOworCisgICAgICB3aGlsZSAoc2l6ZSA8IHJlcXVlc3RlZCkgeworICAgICAgICBzaXplICo9IDI7CisgICAgICB9CisKKyAgICAgIHZhciBidWZmZXIyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7CisgICAgICBidWZmZXIyLnNldChidWZmZXIpOworICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID0gYnVmZmVyMjsKKyAgICB9LAorICAgIGdldEJ5dGU6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9nZXRCeXRlKCkgeworICAgICAgdmFyIHBvcyA9IHRoaXMucG9zOworCisgICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gcG9zKSB7CisgICAgICAgIGlmICh0aGlzLmVvZikgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXTsKKyAgICB9LAorICAgIGdldFVpbnQxNjogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2dldFVpbnQxNigpIHsKKyAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7CisKKyAgICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxOworICAgIH0sCisgICAgZ2V0SW50MzI6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9nZXRJbnQzMigpIHsKKyAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjIgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMyA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7CisgICAgfSwKKworICAgIGdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkID0gZmFsc2UpIHsKKyAgICAgIHZhciBlbmQsCisgICAgICAgICAgcG9zID0gdGhpcy5wb3M7CisKKyAgICAgIGlmIChsZW5ndGgpIHsKKyAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuZ3RoKTsKKyAgICAgICAgZW5kID0gcG9zICsgbGVuZ3RoOworCisgICAgICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPCBlbmQpIHsKKyAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGJ1ZkVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworCisgICAgICAgIGlmIChlbmQgPiBidWZFbmQpIHsKKyAgICAgICAgICBlbmQgPSBidWZFbmQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlICghdGhpcy5lb2YpIHsKKyAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgZW5kID0gdGhpcy5idWZmZXJMZW5ndGg7CisgICAgICB9CisKKyAgICAgIHRoaXMucG9zID0gZW5kOworICAgICAgY29uc3Qgc3ViYXJyYXkgPSB0aGlzLmJ1ZmZlci5zdWJhcnJheShwb3MsIGVuZCk7CisgICAgICByZXR1cm4gZm9yY2VDbGFtcGVkICYmICEoc3ViYXJyYXkgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7CisgICAgfSwKKworICAgIHBlZWtCeXRlOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fcGVla0J5dGUoKSB7CisgICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpOworCisgICAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKKyAgICAgICAgdGhpcy5wb3MtLTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7CisgICAgfSwKKworICAgIHBlZWtCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCA9IGZhbHNlKSB7CisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTsKKyAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDsKKyAgICAgIHJldHVybiBieXRlczsKKyAgICB9LAorCisgICAgbWFrZVN1YlN0cmVhbTogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX21ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCkgeworICAgICAgdmFyIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOworCisgICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gZW5kICYmICF0aGlzLmVvZikgeworICAgICAgICB0aGlzLnJlYWRCbG9jaygpOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ1ZmZlciwgc3RhcnQsIGxlbmd0aCwgZGljdCk7CisgICAgfSwKKworICAgIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgRGVjb2RlU3RyZWFtLmdldEJ5dGVSYW5nZSIpOworICAgIH0sCisKKyAgICBza2lwOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fc2tpcChuKSB7CisgICAgICBpZiAoIW4pIHsKKyAgICAgICAgbiA9IDE7CisgICAgICB9CisKKyAgICAgIHRoaXMucG9zICs9IG47CisgICAgfSwKKyAgICByZXNldDogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3Jlc2V0KCkgeworICAgICAgdGhpcy5wb3MgPSAwOworICAgIH0sCisgICAgZ2V0QmFzZVN0cmVhbXM6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9nZXRCYXNlU3RyZWFtcygpIHsKKyAgICAgIGlmICh0aGlzLnN0ciAmJiB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcykgeworICAgICAgICByZXR1cm4gdGhpcy5zdHIuZ2V0QmFzZVN0cmVhbXMoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFtdOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIERlY29kZVN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5EZWNvZGVTdHJlYW0gPSBEZWNvZGVTdHJlYW07CisKK3ZhciBTdHJlYW1zU2VxdWVuY2VTdHJlYW0gPSBmdW5jdGlvbiBTdHJlYW1zU2VxdWVuY2VTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBTdHJlYW1zU2VxdWVuY2VTdHJlYW0oc3RyZWFtcykgeworICAgIHRoaXMuc3RyZWFtcyA9IHN0cmVhbXM7CisgICAgbGV0IG1heWJlTGVuZ3RoID0gMDsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0cmVhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1tpXTsKKworICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSkgeworICAgICAgICBtYXliZUxlbmd0aCArPSBzdHJlYW0uX3Jhd01pbkJ1ZmZlckxlbmd0aDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1heWJlTGVuZ3RoICs9IHN0cmVhbS5sZW5ndGg7CisgICAgICB9CisgICAgfQorCisgICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgU3RyZWFtc1NlcXVlbmNlU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisKKyAgU3RyZWFtc1NlcXVlbmNlU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBzdHJlYW1TZXF1ZW5jZVN0cmVhbVJlYWRCbG9jaygpIHsKKyAgICB2YXIgc3RyZWFtcyA9IHRoaXMuc3RyZWFtczsKKworICAgIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMCkgeworICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBzdHJlYW0gPSBzdHJlYW1zLnNoaWZ0KCk7CisgICAgdmFyIGNodW5rID0gc3RyZWFtLmdldEJ5dGVzKCk7CisgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgIHZhciBuZXdMZW5ndGggPSBidWZmZXJMZW5ndGggKyBjaHVuay5sZW5ndGg7CisgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CisgICAgYnVmZmVyLnNldChjaHVuaywgYnVmZmVyTGVuZ3RoKTsKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IG5ld0xlbmd0aDsKKyAgfTsKKworICBTdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlLmdldEJhc2VTdHJlYW1zID0gZnVuY3Rpb24gU3RyZWFtc1NlcXVlbmNlU3RyZWFtX2dldEJhc2VTdHJlYW1zKCkgeworICAgIHZhciBiYXNlU3RyZWFtcyA9IFtdOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5zdHJlYW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbXNbaV07CisKKyAgICAgIGlmIChzdHJlYW0uZ2V0QmFzZVN0cmVhbXMpIHsKKyAgICAgICAgYmFzZVN0cmVhbXMucHVzaCguLi5zdHJlYW0uZ2V0QmFzZVN0cmVhbXMoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJhc2VTdHJlYW1zOworICB9OworCisgIHJldHVybiBTdHJlYW1zU2VxdWVuY2VTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuU3RyZWFtc1NlcXVlbmNlU3RyZWFtID0gU3RyZWFtc1NlcXVlbmNlU3RyZWFtOworCit2YXIgRmxhdGVTdHJlYW0gPSBmdW5jdGlvbiBGbGF0ZVN0cmVhbUNsb3N1cmUoKSB7CisgIHZhciBjb2RlTGVuQ29kZU1hcCA9IG5ldyBJbnQzMkFycmF5KFsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1XSk7CisgIHZhciBsZW5ndGhEZWNvZGUgPSBuZXcgSW50MzJBcnJheShbMHgwMDAwMywgMHgwMDAwNCwgMHgwMDAwNSwgMHgwMDAwNiwgMHgwMDAwNywgMHgwMDAwOCwgMHgwMDAwOSwgMHgwMDAwYSwgMHgxMDAwYiwgMHgxMDAwZCwgMHgxMDAwZiwgMHgxMDAxMSwgMHgyMDAxMywgMHgyMDAxNywgMHgyMDAxYiwgMHgyMDAxZiwgMHgzMDAyMywgMHgzMDAyYiwgMHgzMDAzMywgMHgzMDAzYiwgMHg0MDA0MywgMHg0MDA1MywgMHg0MDA2MywgMHg0MDA3MywgMHg1MDA4MywgMHg1MDBhMywgMHg1MDBjMywgMHg1MDBlMywgMHgwMDEwMiwgMHgwMDEwMiwgMHgwMDEwMl0pOworICB2YXIgZGlzdERlY29kZSA9IG5ldyBJbnQzMkFycmF5KFsweDAwMDAxLCAweDAwMDAyLCAweDAwMDAzLCAweDAwMDA0LCAweDEwMDA1LCAweDEwMDA3LCAweDIwMDA5LCAweDIwMDBkLCAweDMwMDExLCAweDMwMDE5LCAweDQwMDIxLCAweDQwMDMxLCAweDUwMDQxLCAweDUwMDYxLCAweDYwMDgxLCAweDYwMGMxLCAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLCAweGIxMDAxLCAweGIxODAxLCAweGMyMDAxLCAweGMzMDAxLCAweGQ0MDAxLCAweGQ2MDAxXSk7CisgIHZhciBmaXhlZExpdENvZGVUYWIgPSBbbmV3IEludDMyQXJyYXkoWzB4NzAxMDAsIDB4ODAwNTAsIDB4ODAwMTAsIDB4ODAxMTgsIDB4NzAxMTAsIDB4ODAwNzAsIDB4ODAwMzAsIDB4OTAwYzAsIDB4NzAxMDgsIDB4ODAwNjAsIDB4ODAwMjAsIDB4OTAwYTAsIDB4ODAwMDAsIDB4ODAwODAsIDB4ODAwNDAsIDB4OTAwZTAsIDB4NzAxMDQsIDB4ODAwNTgsIDB4ODAwMTgsIDB4OTAwOTAsIDB4NzAxMTQsIDB4ODAwNzgsIDB4ODAwMzgsIDB4OTAwZDAsIDB4NzAxMGMsIDB4ODAwNjgsIDB4ODAwMjgsIDB4OTAwYjAsIDB4ODAwMDgsIDB4ODAwODgsIDB4ODAwNDgsIDB4OTAwZjAsIDB4NzAxMDIsIDB4ODAwNTQsIDB4ODAwMTQsIDB4ODAxMWMsIDB4NzAxMTIsIDB4ODAwNzQsIDB4ODAwMzQsIDB4OTAwYzgsIDB4NzAxMGEsIDB4ODAwNjQsIDB4ODAwMjQsIDB4OTAwYTgsIDB4ODAwMDQsIDB4ODAwODQsIDB4ODAwNDQsIDB4OTAwZTgsIDB4NzAxMDYsIDB4ODAwNWMsIDB4ODAwMWMsIDB4OTAwOTgsIDB4NzAxMTYsIDB4ODAwN2MsIDB4ODAwM2MsIDB4OTAwZDgsIDB4NzAxMGUsIDB4ODAwNmMsIDB4ODAwMmMsIDB4OTAwYjgsIDB4ODAwMGMsIDB4ODAwOGMsIDB4ODAwNGMsIDB4OTAwZjgsIDB4NzAxMDEsIDB4ODAwNTIsIDB4ODAwMTIsIDB4ODAxMWEsIDB4NzAxMTEsIDB4ODAwNzIsIDB4ODAwMzIsIDB4OTAwYzQsIDB4NzAxMDksIDB4ODAwNjIsIDB4ODAwMjIsIDB4OTAwYTQsIDB4ODAwMDIsIDB4ODAwODIsIDB4ODAwNDIsIDB4OTAwZTQsIDB4NzAxMDUsIDB4ODAwNWEsIDB4ODAwMWEsIDB4OTAwOTQsIDB4NzAxMTUsIDB4ODAwN2EsIDB4ODAwM2EsIDB4OTAwZDQsIDB4NzAxMGQsIDB4ODAwNmEsIDB4ODAwMmEsIDB4OTAwYjQsIDB4ODAwMGEsIDB4ODAwOGEsIDB4ODAwNGEsIDB4OTAwZjQsIDB4NzAxMDMsIDB4ODAwNTYsIDB4ODAwMTYsIDB4ODAxMWUsIDB4NzAxMTMsIDB4ODAwNzYsIDB4ODAwMzYsIDB4OTAwY2MsIDB4NzAxMGIsIDB4ODAwNjYsIDB4ODAwMjYsIDB4OTAwYWMsIDB4ODAwMDYsIDB4ODAwODYsIDB4ODAwNDYsIDB4OTAwZWMsIDB4NzAxMDcsIDB4ODAwNWUsIDB4ODAwMWUsIDB4OTAwOWMsIDB4NzAxMTcsIDB4ODAwN2UsIDB4ODAwM2UsIDB4OTAwZGMsIDB4NzAxMGYsIDB4ODAwNmUsIDB4ODAwMmUsIDB4OTAwYmMsIDB4ODAwMGUsIDB4ODAwOGUsIDB4ODAwNGUsIDB4OTAwZmMsIDB4NzAxMDAsIDB4ODAwNTEsIDB4ODAwMTEsIDB4ODAxMTksIDB4NzAxMTAsIDB4ODAwNzEsIDB4ODAwMzEsIDB4OTAwYzIsIDB4NzAxMDgsIDB4ODAwNjEsIDB4ODAwMjEsIDB4OTAwYTIsIDB4ODAwMDEsIDB4ODAwODEsIDB4ODAwNDEsIDB4OTAwZTIsIDB4NzAxMDQsIDB4ODAwNTksIDB4ODAwMTksIDB4OTAwOTIsIDB4NzAxMTQsIDB4ODAwNzksIDB4ODAwMzksIDB4OTAwZDIsIDB4NzAxMGMsIDB4ODAwNjksIDB4ODAwMjksIDB4OTAwYjIsIDB4ODAwMDksIDB4ODAwODksIDB4ODAwNDksIDB4OTAwZjIsIDB4NzAxMDIsIDB4ODAwNTUsIDB4ODAwMTUsIDB4ODAxMWQsIDB4NzAxMTIsIDB4ODAwNzUsIDB4ODAwMzUsIDB4OTAwY2EsIDB4NzAxMGEsIDB4ODAwNjUsIDB4ODAwMjUsIDB4OTAwYWEsIDB4ODAwMDUsIDB4ODAwODUsIDB4ODAwNDUsIDB4OTAwZWEsIDB4NzAxMDYsIDB4ODAwNWQsIDB4ODAwMWQsIDB4OTAwOWEsIDB4NzAxMTYsIDB4ODAwN2QsIDB4ODAwM2QsIDB4OTAwZGEsIDB4NzAxMGUsIDB4ODAwNmQsIDB4ODAwMmQsIDB4OTAwYmEsIDB4ODAwMGQsIDB4ODAwOGQsIDB4ODAwNGQsIDB4OTAwZmEsIDB4NzAxMDEsIDB4ODAwNTMsIDB4ODAwMTMsIDB4ODAxMWIsIDB4NzAxMTEsIDB4ODAwNzMsIDB4ODAwMzMsIDB4OTAwYzYsIDB4NzAxMDksIDB4ODAwNjMsIDB4ODAwMjMsIDB4OTAwYTYsIDB4ODAwMDMsIDB4ODAwODMsIDB4ODAwNDMsIDB4OTAwZTYsIDB4NzAxMDUsIDB4ODAwNWIsIDB4ODAwMWIsIDB4OTAwOTYsIDB4NzAxMTUsIDB4ODAwN2IsIDB4ODAwM2IsIDB4OTAwZDYsIDB4NzAxMGQsIDB4ODAwNmIsIDB4ODAwMmIsIDB4OTAwYjYsIDB4ODAwMGIsIDB4ODAwOGIsIDB4ODAwNGIsIDB4OTAwZjYsIDB4NzAxMDMsIDB4ODAwNTcsIDB4ODAwMTcsIDB4ODAxMWYsIDB4NzAxMTMsIDB4ODAwNzcsIDB4ODAwMzcsIDB4OTAwY2UsIDB4NzAxMGIsIDB4ODAwNjcsIDB4ODAwMjcsIDB4OTAwYWUsIDB4ODAwMDcsIDB4ODAwODcsIDB4ODAwNDcsIDB4OTAwZWUsIDB4NzAxMDcsIDB4ODAwNWYsIDB4ODAwMWYsIDB4OTAwOWUsIDB4NzAxMTcsIDB4ODAwN2YsIDB4ODAwM2YsIDB4OTAwZGUsIDB4NzAxMGYsIDB4ODAwNmYsIDB4ODAwMmYsIDB4OTAwYmUsIDB4ODAwMGYsIDB4ODAwOGYsIDB4ODAwNGYsIDB4OTAwZmUsIDB4NzAxMDAsIDB4ODAwNTAsIDB4ODAwMTAsIDB4ODAxMTgsIDB4NzAxMTAsIDB4ODAwNzAsIDB4ODAwMzAsIDB4OTAwYzEsIDB4NzAxMDgsIDB4ODAwNjAsIDB4ODAwMjAsIDB4OTAwYTEsIDB4ODAwMDAsIDB4ODAwODAsIDB4ODAwNDAsIDB4OTAwZTEsIDB4NzAxMDQsIDB4ODAwNTgsIDB4ODAwMTgsIDB4OTAwOTEsIDB4NzAxMTQsIDB4ODAwNzgsIDB4ODAwMzgsIDB4OTAwZDEsIDB4NzAxMGMsIDB4ODAwNjgsIDB4ODAwMjgsIDB4OTAwYjEsIDB4ODAwMDgsIDB4ODAwODgsIDB4ODAwNDgsIDB4OTAwZjEsIDB4NzAxMDIsIDB4ODAwNTQsIDB4ODAwMTQsIDB4ODAxMWMsIDB4NzAxMTIsIDB4ODAwNzQsIDB4ODAwMzQsIDB4OTAwYzksIDB4NzAxMGEsIDB4ODAwNjQsIDB4ODAwMjQsIDB4OTAwYTksIDB4ODAwMDQsIDB4ODAwODQsIDB4ODAwNDQsIDB4OTAwZTksIDB4NzAxMDYsIDB4ODAwNWMsIDB4ODAwMWMsIDB4OTAwOTksIDB4NzAxMTYsIDB4ODAwN2MsIDB4ODAwM2MsIDB4OTAwZDksIDB4NzAxMGUsIDB4ODAwNmMsIDB4ODAwMmMsIDB4OTAwYjksIDB4ODAwMGMsIDB4ODAwOGMsIDB4ODAwNGMsIDB4OTAwZjksIDB4NzAxMDEsIDB4ODAwNTIsIDB4ODAwMTIsIDB4ODAxMWEsIDB4NzAxMTEsIDB4ODAwNzIsIDB4ODAwMzIsIDB4OTAwYzUsIDB4NzAxMDksIDB4ODAwNjIsIDB4ODAwMjIsIDB4OTAwYTUsIDB4ODAwMDIsIDB4ODAwODIsIDB4ODAwNDIsIDB4OTAwZTUsIDB4NzAxMDUsIDB4ODAwNWEsIDB4ODAwMWEsIDB4OTAwOTUsIDB4NzAxMTUsIDB4ODAwN2EsIDB4ODAwM2EsIDB4OTAwZDUsIDB4NzAxMGQsIDB4ODAwNmEsIDB4ODAwMmEsIDB4OTAwYjUsIDB4ODAwMGEsIDB4ODAwOGEsIDB4ODAwNGEsIDB4OTAwZjUsIDB4NzAxMDMsIDB4ODAwNTYsIDB4ODAwMTYsIDB4ODAxMWUsIDB4NzAxMTMsIDB4ODAwNzYsIDB4ODAwMzYsIDB4OTAwY2QsIDB4NzAxMGIsIDB4ODAwNjYsIDB4ODAwMjYsIDB4OTAwYWQsIDB4ODAwMDYsIDB4ODAwODYsIDB4ODAwNDYsIDB4OTAwZWQsIDB4NzAxMDcsIDB4ODAwNWUsIDB4ODAwMWUsIDB4OTAwOWQsIDB4NzAxMTcsIDB4ODAwN2UsIDB4ODAwM2UsIDB4OTAwZGQsIDB4NzAxMGYsIDB4ODAwNmUsIDB4ODAwMmUsIDB4OTAwYmQsIDB4ODAwMGUsIDB4ODAwOGUsIDB4ODAwNGUsIDB4OTAwZmQsIDB4NzAxMDAsIDB4ODAwNTEsIDB4ODAwMTEsIDB4ODAxMTksIDB4NzAxMTAsIDB4ODAwNzEsIDB4ODAwMzEsIDB4OTAwYzMsIDB4NzAxMDgsIDB4ODAwNjEsIDB4ODAwMjEsIDB4OTAwYTMsIDB4ODAwMDEsIDB4ODAwODEsIDB4ODAwNDEsIDB4OTAwZTMsIDB4NzAxMDQsIDB4ODAwNTksIDB4ODAwMTksIDB4OTAwOTMsIDB4NzAxMTQsIDB4ODAwNzksIDB4ODAwMzksIDB4OTAwZDMsIDB4NzAxMGMsIDB4ODAwNjksIDB4ODAwMjksIDB4OTAwYjMsIDB4ODAwMDksIDB4ODAwODksIDB4ODAwNDksIDB4OTAwZjMsIDB4NzAxMDIsIDB4ODAwNTUsIDB4ODAwMTUsIDB4ODAxMWQsIDB4NzAxMTIsIDB4ODAwNzUsIDB4ODAwMzUsIDB4OTAwY2IsIDB4NzAxMGEsIDB4ODAwNjUsIDB4ODAwMjUsIDB4OTAwYWIsIDB4ODAwMDUsIDB4ODAwODUsIDB4ODAwNDUsIDB4OTAwZWIsIDB4NzAxMDYsIDB4ODAwNWQsIDB4ODAwMWQsIDB4OTAwOWIsIDB4NzAxMTYsIDB4ODAwN2QsIDB4ODAwM2QsIDB4OTAwZGIsIDB4NzAxMGUsIDB4ODAwNmQsIDB4ODAwMmQsIDB4OTAwYmIsIDB4ODAwMGQsIDB4ODAwOGQsIDB4ODAwNGQsIDB4OTAwZmIsIDB4NzAxMDEsIDB4ODAwNTMsIDB4ODAwMTMsIDB4ODAxMWIsIDB4NzAxMTEsIDB4ODAwNzMsIDB4ODAwMzMsIDB4OTAwYzcsIDB4NzAxMDksIDB4ODAwNjMsIDB4ODAwMjMsIDB4OTAwYTcsIDB4ODAwMDMsIDB4ODAwODMsIDB4ODAwNDMsIDB4OTAwZTcsIDB4NzAxMDUsIDB4ODAwNWIsIDB4ODAwMWIsIDB4OTAwOTcsIDB4NzAxMTUsIDB4ODAwN2IsIDB4ODAwM2IsIDB4OTAwZDcsIDB4NzAxMGQsIDB4ODAwNmIsIDB4ODAwMmIsIDB4OTAwYjcsIDB4ODAwMGIsIDB4ODAwOGIsIDB4ODAwNGIsIDB4OTAwZjcsIDB4NzAxMDMsIDB4ODAwNTcsIDB4ODAwMTcsIDB4ODAxMWYsIDB4NzAxMTMsIDB4ODAwNzcsIDB4ODAwMzcsIDB4OTAwY2YsIDB4NzAxMGIsIDB4ODAwNjcsIDB4ODAwMjcsIDB4OTAwYWYsIDB4ODAwMDcsIDB4ODAwODcsIDB4ODAwNDcsIDB4OTAwZWYsIDB4NzAxMDcsIDB4ODAwNWYsIDB4ODAwMWYsIDB4OTAwOWYsIDB4NzAxMTcsIDB4ODAwN2YsIDB4ODAwM2YsIDB4OTAwZGYsIDB4NzAxMGYsIDB4ODAwNmYsIDB4ODAwMmYsIDB4OTAwYmYsIDB4ODAwMGYsIDB4ODAwOGYsIDB4ODAwNGYsIDB4OTAwZmZdKSwgOV07CisgIHZhciBmaXhlZERpc3RDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFsweDUwMDAwLCAweDUwMDEwLCAweDUwMDA4LCAweDUwMDE4LCAweDUwMDA0LCAweDUwMDE0LCAweDUwMDBjLCAweDUwMDFjLCAweDUwMDAyLCAweDUwMDEyLCAweDUwMDBhLCAweDUwMDFhLCAweDUwMDA2LCAweDUwMDE2LCAweDUwMDBlLCAweDAwMDAwLCAweDUwMDAxLCAweDUwMDExLCAweDUwMDA5LCAweDUwMDE5LCAweDUwMDA1LCAweDUwMDE1LCAweDUwMDBkLCAweDUwMDFkLCAweDUwMDAzLCAweDUwMDEzLCAweDUwMDBiLCAweDUwMDFiLCAweDUwMDA3LCAweDUwMDE3LCAweDUwMDBmLCAweDAwMDAwXSksIDVdOworCisgIGZ1bmN0aW9uIEZsYXRlU3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgpIHsKKyAgICB0aGlzLnN0ciA9IHN0cjsKKyAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKKyAgICB2YXIgY21mID0gc3RyLmdldEJ5dGUoKTsKKyAgICB2YXIgZmxnID0gc3RyLmdldEJ5dGUoKTsKKworICAgIGlmIChjbWYgPT09IC0xIHx8IGZsZyA9PT0gLTEpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOworICAgIH0KKworICAgIGlmICgoY21mICYgMHgwZikgIT09IDB4MDgpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOworICAgIH0KKworICAgIGlmICgoKGNtZiA8PCA4KSArIGZsZykgJSAzMSAhPT0gMCkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBCYWQgRkNIRUNLIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTsKKyAgICB9CisKKyAgICBpZiAoZmxnICYgMHgyMCkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBGRElDVCBiaXQgc2V0IGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTsKKyAgICB9CisKKyAgICB0aGlzLmNvZGVTaXplID0gMDsKKyAgICB0aGlzLmNvZGVCdWYgPSAwOworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIEZsYXRlU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisKKyAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldEJpdHMgPSBmdW5jdGlvbiBGbGF0ZVN0cmVhbV9nZXRCaXRzKGJpdHMpIHsKKyAgICB2YXIgc3RyID0gdGhpcy5zdHI7CisgICAgdmFyIGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTsKKyAgICB2YXIgY29kZUJ1ZiA9IHRoaXMuY29kZUJ1ZjsKKyAgICB2YXIgYjsKKworICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJpdHMpIHsKKyAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTsKKyAgICAgIH0KKworICAgICAgY29kZUJ1ZiB8PSBiIDw8IGNvZGVTaXplOworICAgICAgY29kZVNpemUgKz0gODsKKyAgICB9CisKKyAgICBiID0gY29kZUJ1ZiAmICgxIDw8IGJpdHMpIC0gMTsKKyAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGJpdHM7CisgICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC09IGJpdHM7CisgICAgcmV0dXJuIGI7CisgIH07CisKKyAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldENvZGUgPSBmdW5jdGlvbiBGbGF0ZVN0cmVhbV9nZXRDb2RlKHRhYmxlKSB7CisgICAgdmFyIHN0ciA9IHRoaXMuc3RyOworICAgIHZhciBjb2RlcyA9IHRhYmxlWzBdOworICAgIHZhciBtYXhMZW4gPSB0YWJsZVsxXTsKKyAgICB2YXIgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplOworICAgIHZhciBjb2RlQnVmID0gdGhpcy5jb2RlQnVmOworICAgIHZhciBiOworCisgICAgd2hpbGUgKGNvZGVTaXplIDwgbWF4TGVuKSB7CisgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTsKKyAgICAgIGNvZGVTaXplICs9IDg7CisgICAgfQorCisgICAgdmFyIGNvZGUgPSBjb2Rlc1tjb2RlQnVmICYgKDEgPDwgbWF4TGVuKSAtIDFdOworICAgIHZhciBjb2RlTGVuID0gY29kZSA+PiAxNjsKKyAgICB2YXIgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7CisKKyAgICBpZiAoY29kZUxlbiA8IDEgfHwgY29kZVNpemUgPCBjb2RlTGVuKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTsKKyAgICB9CisKKyAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGNvZGVMZW47CisgICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC0gY29kZUxlbjsKKyAgICByZXR1cm4gY29kZVZhbDsKKyAgfTsKKworICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2VuZXJhdGVIdWZmbWFuVGFibGUgPSBmdW5jdGlvbiBmbGF0ZVN0cmVhbUdlbmVyYXRlSHVmZm1hblRhYmxlKGxlbmd0aHMpIHsKKyAgICB2YXIgbiA9IGxlbmd0aHMubGVuZ3RoOworICAgIHZhciBtYXhMZW4gPSAwOworICAgIHZhciBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgaWYgKGxlbmd0aHNbaV0gPiBtYXhMZW4pIHsKKyAgICAgICAgbWF4TGVuID0gbGVuZ3Roc1tpXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgc2l6ZSA9IDEgPDwgbWF4TGVuOworICAgIHZhciBjb2RlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpOworCisgICAgZm9yICh2YXIgbGVuID0gMSwgY29kZSA9IDAsIHNraXAgPSAyOyBsZW4gPD0gbWF4TGVuOyArK2xlbiwgY29kZSA8PD0gMSwgc2tpcCA8PD0gMSkgeworICAgICAgZm9yICh2YXIgdmFsID0gMDsgdmFsIDwgbjsgKyt2YWwpIHsKKyAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7CisgICAgICAgICAgdmFyIGNvZGUyID0gMDsKKyAgICAgICAgICB2YXIgdCA9IGNvZGU7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgIGNvZGUyID0gY29kZTIgPDwgMSB8IHQgJiAxOworICAgICAgICAgICAgdCA+Pj0gMTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGkgPSBjb2RlMjsgaSA8IHNpemU7IGkgKz0gc2tpcCkgeworICAgICAgICAgICAgY29kZXNbaV0gPSBsZW4gPDwgMTYgfCB2YWw7CisgICAgICAgICAgfQorCisgICAgICAgICAgKytjb2RlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFtjb2RlcywgbWF4TGVuXTsKKyAgfTsKKworICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gRmxhdGVTdHJlYW1fcmVhZEJsb2NrKCkgeworICAgIHZhciBidWZmZXIsIGxlbjsKKyAgICB2YXIgc3RyID0gdGhpcy5zdHI7CisgICAgdmFyIGhkciA9IHRoaXMuZ2V0Qml0cygzKTsKKworICAgIGlmIChoZHIgJiAxKSB7CisgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgfQorCisgICAgaGRyID4+PSAxOworCisgICAgaWYgKGhkciA9PT0gMCkgeworICAgICAgdmFyIGI7CisKKyAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIHZhciBibG9ja0xlbiA9IGI7CisKKyAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIGJsb2NrTGVuIHw9IGIgPDwgODsKKworICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNoZWNrID0gYjsKKworICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKKyAgICAgIH0KKworICAgICAgY2hlY2sgfD0gYiA8PCA4OworCisgICAgICBpZiAoY2hlY2sgIT09ICh+YmxvY2tMZW4gJiAweGZmZmYpICYmIChibG9ja0xlbiAhPT0gMCB8fCBjaGVjayAhPT0gMCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgdW5jb21wcmVzc2VkIGJsb2NrIGxlbmd0aCBpbiBmbGF0ZSBzdHJlYW0iKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jb2RlQnVmID0gMDsKKyAgICAgIHRoaXMuY29kZVNpemUgPSAwOworICAgICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGgsCisgICAgICAgICAgICBlbmQgPSBidWZmZXJMZW5ndGggKyBibG9ja0xlbjsKKyAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGVuZCk7CisgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGVuZDsKKworICAgICAgaWYgKGJsb2NrTGVuID09PSAwKSB7CisgICAgICAgIGlmIChzdHIucGVla0J5dGUoKSA9PT0gLTEpIHsKKyAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGJsb2NrID0gc3RyLmdldEJ5dGVzKGJsb2NrTGVuKTsKKyAgICAgICAgYnVmZmVyLnNldChibG9jaywgYnVmZmVyTGVuZ3RoKTsKKworICAgICAgICBpZiAoYmxvY2subGVuZ3RoIDwgYmxvY2tMZW4pIHsKKyAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBsaXRDb2RlVGFibGU7CisgICAgdmFyIGRpc3RDb2RlVGFibGU7CisKKyAgICBpZiAoaGRyID09PSAxKSB7CisgICAgICBsaXRDb2RlVGFibGUgPSBmaXhlZExpdENvZGVUYWI7CisgICAgICBkaXN0Q29kZVRhYmxlID0gZml4ZWREaXN0Q29kZVRhYjsKKyAgICB9IGVsc2UgaWYgKGhkciA9PT0gMikgeworICAgICAgdmFyIG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3OworICAgICAgdmFyIG51bURpc3RDb2RlcyA9IHRoaXMuZ2V0Qml0cyg1KSArIDE7CisgICAgICB2YXIgbnVtQ29kZUxlbkNvZGVzID0gdGhpcy5nZXRCaXRzKDQpICsgNDsKKyAgICAgIHZhciBjb2RlTGVuQ29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuQ29kZU1hcC5sZW5ndGgpOworICAgICAgdmFyIGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db2RlTGVuQ29kZXM7ICsraSkgeworICAgICAgICBjb2RlTGVuQ29kZUxlbmd0aHNbY29kZUxlbkNvZGVNYXBbaV1dID0gdGhpcy5nZXRCaXRzKDMpOworICAgICAgfQorCisgICAgICB2YXIgY29kZUxlbkNvZGVUYWIgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5Db2RlTGVuZ3Rocyk7CisgICAgICBsZW4gPSAwOworICAgICAgaSA9IDA7CisgICAgICB2YXIgY29kZXMgPSBudW1MaXRDb2RlcyArIG51bURpc3RDb2RlczsKKyAgICAgIHZhciBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGNvZGVzKTsKKyAgICAgIHZhciBiaXRzTGVuZ3RoLCBiaXRzT2Zmc2V0LCB3aGF0OworCisgICAgICB3aGlsZSAoaSA8IGNvZGVzKSB7CisgICAgICAgIHZhciBjb2RlID0gdGhpcy5nZXRDb2RlKGNvZGVMZW5Db2RlVGFiKTsKKworICAgICAgICBpZiAoY29kZSA9PT0gMTYpIHsKKyAgICAgICAgICBiaXRzTGVuZ3RoID0gMjsKKyAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKKyAgICAgICAgICB3aGF0ID0gbGVuOworICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDE3KSB7CisgICAgICAgICAgYml0c0xlbmd0aCA9IDM7CisgICAgICAgICAgYml0c09mZnNldCA9IDM7CisgICAgICAgICAgd2hhdCA9IGxlbiA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTgpIHsKKyAgICAgICAgICBiaXRzTGVuZ3RoID0gNzsKKyAgICAgICAgICBiaXRzT2Zmc2V0ID0gMTE7CisgICAgICAgICAgd2hhdCA9IGxlbiA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kZUxlbmd0aHNbaSsrXSA9IGxlbiA9IGNvZGU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmVwZWF0TGVuZ3RoID0gdGhpcy5nZXRCaXRzKGJpdHNMZW5ndGgpICsgYml0c09mZnNldDsKKworICAgICAgICB3aGlsZSAocmVwZWF0TGVuZ3RoLS0gPiAwKSB7CisgICAgICAgICAgY29kZUxlbmd0aHNbaSsrXSA9IHdoYXQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbGl0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuZ3Rocy5zdWJhcnJheSgwLCBudW1MaXRDb2RlcykpOworICAgICAgZGlzdENvZGVUYWJsZSA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMuc3ViYXJyYXkobnVtTGl0Q29kZXMsIGNvZGVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBibG9jayB0eXBlIGluIGZsYXRlIHN0cmVhbSIpOworICAgIH0KKworICAgIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOworICAgIHZhciBsaW1pdCA9IGJ1ZmZlciA/IGJ1ZmZlci5sZW5ndGggOiAwOworICAgIHZhciBwb3MgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgY29kZTEgPSB0aGlzLmdldENvZGUobGl0Q29kZVRhYmxlKTsKKworICAgICAgaWYgKGNvZGUxIDwgMjU2KSB7CisgICAgICAgIGlmIChwb3MgKyAxID49IGxpbWl0KSB7CisgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgMSk7CisgICAgICAgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyW3BvcysrXSA9IGNvZGUxOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvZGUxID09PSAyNTYpIHsKKyAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29kZTEgLT0gMjU3OworICAgICAgY29kZTEgPSBsZW5ndGhEZWNvZGVbY29kZTFdOworICAgICAgdmFyIGNvZGUyID0gY29kZTEgPj4gMTY7CisKKyAgICAgIGlmIChjb2RlMiA+IDApIHsKKyAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpOworICAgICAgfQorCisgICAgICBsZW4gPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CisgICAgICBjb2RlMSA9IHRoaXMuZ2V0Q29kZShkaXN0Q29kZVRhYmxlKTsKKyAgICAgIGNvZGUxID0gZGlzdERlY29kZVtjb2RlMV07CisgICAgICBjb2RlMiA9IGNvZGUxID4+IDE2OworCisgICAgICBpZiAoY29kZTIgPiAwKSB7CisgICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRpc3QgPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CisKKyAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHsKKyAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuKTsKKyAgICAgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGxlbjsgKytrLCArK3BvcykgeworICAgICAgICBidWZmZXJbcG9zXSA9IGJ1ZmZlcltwb3MgLSBkaXN0XTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgcmV0dXJuIEZsYXRlU3RyZWFtOworfSgpOworCitleHBvcnRzLkZsYXRlU3RyZWFtID0gRmxhdGVTdHJlYW07CisKK3ZhciBQcmVkaWN0b3JTdHJlYW0gPSBmdW5jdGlvbiBQcmVkaWN0b3JTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBQcmVkaWN0b3JTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShwYXJhbXMpKSB7CisgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIHZhciBwcmVkaWN0b3IgPSB0aGlzLnByZWRpY3RvciA9IHBhcmFtcy5nZXQoIlByZWRpY3RvciIpIHx8IDE7CisKKyAgICBpZiAocHJlZGljdG9yIDw9IDEpIHsKKyAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgaWYgKHByZWRpY3RvciAhPT0gMiAmJiAocHJlZGljdG9yIDwgMTAgfHwgcHJlZGljdG9yID4gMTUpKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHByZWRpY3RvcjogJHtwcmVkaWN0b3J9YCk7CisgICAgfQorCisgICAgaWYgKHByZWRpY3RvciA9PT0gMikgeworICAgICAgdGhpcy5yZWFkQmxvY2sgPSB0aGlzLnJlYWRCbG9ja1RpZmY7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMucmVhZEJsb2NrID0gdGhpcy5yZWFkQmxvY2tQbmc7CisgICAgfQorCisgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CisgICAgdmFyIGNvbG9ycyA9IHRoaXMuY29sb3JzID0gcGFyYW1zLmdldCgiQ29sb3JzIikgfHwgMTsKKyAgICB2YXIgYml0cyA9IHRoaXMuYml0cyA9IHBhcmFtcy5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSB8fCA4OworICAgIHZhciBjb2x1bW5zID0gdGhpcy5jb2x1bW5zID0gcGFyYW1zLmdldCgiQ29sdW1ucyIpIHx8IDE7CisgICAgdGhpcy5waXhCeXRlcyA9IGNvbG9ycyAqIGJpdHMgKyA3ID4+IDM7CisgICAgdGhpcy5yb3dCeXRlcyA9IGNvbHVtbnMgKiBjb2xvcnMgKiBiaXRzICsgNyA+PiAzOworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIFByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIFByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrVGlmZiA9IGZ1bmN0aW9uIHByZWRpY3RvclN0cmVhbVJlYWRCbG9ja1RpZmYoKSB7CisgICAgdmFyIHJvd0J5dGVzID0gdGhpcy5yb3dCeXRlczsKKyAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CisgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIHJvd0J5dGVzKTsKKyAgICB2YXIgYml0cyA9IHRoaXMuYml0czsKKyAgICB2YXIgY29sb3JzID0gdGhpcy5jb2xvcnM7CisgICAgdmFyIHJhd0J5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMocm93Qnl0ZXMpOworICAgIHRoaXMuZW9mID0gIXJhd0J5dGVzLmxlbmd0aDsKKworICAgIGlmICh0aGlzLmVvZikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBpbmJ1ZiA9IDAsCisgICAgICAgIG91dGJ1ZiA9IDA7CisgICAgdmFyIGluYml0cyA9IDAsCisgICAgICAgIG91dGJpdHMgPSAwOworICAgIHZhciBwb3MgPSBidWZmZXJMZW5ndGg7CisgICAgdmFyIGk7CisKKyAgICBpZiAoYml0cyA9PT0gMSAmJiBjb2xvcnMgPT09IDEpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CisgICAgICAgIHZhciBjID0gcmF3Qnl0ZXNbaV0gXiBpbmJ1ZjsKKyAgICAgICAgYyBePSBjID4+IDE7CisgICAgICAgIGMgXj0gYyA+PiAyOworICAgICAgICBjIF49IGMgPj4gNDsKKyAgICAgICAgaW5idWYgPSAoYyAmIDEpIDw8IDc7CisgICAgICAgIGJ1ZmZlcltwb3MrK10gPSBjOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYml0cyA9PT0gOCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yczsgKytpKSB7CisgICAgICAgIGJ1ZmZlcltwb3MrK10gPSByYXdCeXRlc1tpXTsKKyAgICAgIH0KKworICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CisgICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGNvbG9yc10gKyByYXdCeXRlc1tpXTsKKyAgICAgICAgcG9zKys7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChiaXRzID09PSAxNikgeworICAgICAgdmFyIGJ5dGVzUGVyUGl4ZWwgPSBjb2xvcnMgKiAyOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgYnl0ZXNQZXJQaXhlbDsgKytpKSB7CisgICAgICAgIGJ1ZmZlcltwb3MrK10gPSByYXdCeXRlc1tpXTsKKyAgICAgIH0KKworICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgaSArPSAyKSB7CisgICAgICAgIHZhciBzdW0gPSAoKHJhd0J5dGVzW2ldICYgMHhmZikgPDwgOCkgKyAocmF3Qnl0ZXNbaSArIDFdICYgMHhmZikgKyAoKGJ1ZmZlcltwb3MgLSBieXRlc1BlclBpeGVsXSAmIDB4ZmYpIDw8IDgpICsgKGJ1ZmZlcltwb3MgLSBieXRlc1BlclBpeGVsICsgMV0gJiAweGZmKTsKKyAgICAgICAgYnVmZmVyW3BvcysrXSA9IHN1bSA+PiA4ICYgMHhmZjsKKyAgICAgICAgYnVmZmVyW3BvcysrXSA9IHN1bSAmIDB4ZmY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBjb21wQXJyYXkgPSBuZXcgVWludDhBcnJheShjb2xvcnMgKyAxKTsKKyAgICAgIHZhciBiaXRNYXNrID0gKDEgPDwgYml0cykgLSAxOworICAgICAgdmFyIGogPSAwLAorICAgICAgICAgIGsgPSBidWZmZXJMZW5ndGg7CisgICAgICB2YXIgY29sdW1ucyA9IHRoaXMuY29sdW1uczsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGNvbHVtbnM7ICsraSkgeworICAgICAgICBmb3IgKHZhciBrayA9IDA7IGtrIDwgY29sb3JzOyArK2trKSB7CisgICAgICAgICAgaWYgKGluYml0cyA8IGJpdHMpIHsKKyAgICAgICAgICAgIGluYnVmID0gaW5idWYgPDwgOCB8IHJhd0J5dGVzW2orK10gJiAweGZmOworICAgICAgICAgICAgaW5iaXRzICs9IDg7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29tcEFycmF5W2trXSA9IGNvbXBBcnJheVtra10gKyAoaW5idWYgPj4gaW5iaXRzIC0gYml0cykgJiBiaXRNYXNrOworICAgICAgICAgIGluYml0cyAtPSBiaXRzOworICAgICAgICAgIG91dGJ1ZiA9IG91dGJ1ZiA8PCBiaXRzIHwgY29tcEFycmF5W2trXTsKKyAgICAgICAgICBvdXRiaXRzICs9IGJpdHM7CisKKyAgICAgICAgICBpZiAob3V0Yml0cyA+PSA4KSB7CisgICAgICAgICAgICBidWZmZXJbaysrXSA9IG91dGJ1ZiA+PiBvdXRiaXRzIC0gOCAmIDB4ZmY7CisgICAgICAgICAgICBvdXRiaXRzIC09IDg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChvdXRiaXRzID4gMCkgeworICAgICAgICBidWZmZXJbaysrXSA9IChvdXRidWYgPDwgOCAtIG91dGJpdHMpICsgKGluYnVmICYgKDEgPDwgOCAtIG91dGJpdHMpIC0gMSk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gcm93Qnl0ZXM7CisgIH07CisKKyAgUHJlZGljdG9yU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2tQbmcgPSBmdW5jdGlvbiBwcmVkaWN0b3JTdHJlYW1SZWFkQmxvY2tQbmcoKSB7CisgICAgdmFyIHJvd0J5dGVzID0gdGhpcy5yb3dCeXRlczsKKyAgICB2YXIgcGl4Qnl0ZXMgPSB0aGlzLnBpeEJ5dGVzOworICAgIHZhciBwcmVkaWN0b3IgPSB0aGlzLnN0ci5nZXRCeXRlKCk7CisgICAgdmFyIHJhd0J5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMocm93Qnl0ZXMpOworICAgIHRoaXMuZW9mID0gIXJhd0J5dGVzLmxlbmd0aDsKKworICAgIGlmICh0aGlzLmVvZikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKyAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgcm93Qnl0ZXMpOworICAgIHZhciBwcmV2Um93ID0gYnVmZmVyLnN1YmFycmF5KGJ1ZmZlckxlbmd0aCAtIHJvd0J5dGVzLCBidWZmZXJMZW5ndGgpOworCisgICAgaWYgKHByZXZSb3cubGVuZ3RoID09PSAwKSB7CisgICAgICBwcmV2Um93ID0gbmV3IFVpbnQ4QXJyYXkocm93Qnl0ZXMpOworICAgIH0KKworICAgIHZhciBpLAorICAgICAgICBqID0gYnVmZmVyTGVuZ3RoLAorICAgICAgICB1cCwKKyAgICAgICAgYzsKKworICAgIHN3aXRjaCAocHJlZGljdG9yKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CisgICAgICAgICAgYnVmZmVyW2orK10gPSByYXdCeXRlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDE6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CisgICAgICAgICAgYnVmZmVyW2orK10gPSByYXdCeXRlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkgeworICAgICAgICAgIGJ1ZmZlcltqXSA9IGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdICsgcmF3Qnl0ZXNbaV0gJiAweGZmOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CisgICAgICAgICAgYnVmZmVyW2orK10gPSBwcmV2Um93W2ldICsgcmF3Qnl0ZXNbaV0gJiAweGZmOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHsKKyAgICAgICAgICBidWZmZXJbaisrXSA9IChwcmV2Um93W2ldID4+IDEpICsgcmF3Qnl0ZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKKyAgICAgICAgICBidWZmZXJbal0gPSAocHJldlJvd1tpXSArIGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdID4+IDEpICsgcmF3Qnl0ZXNbaV0gJiAweGZmOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQ6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CisgICAgICAgICAgdXAgPSBwcmV2Um93W2ldOworICAgICAgICAgIGMgPSByYXdCeXRlc1tpXTsKKyAgICAgICAgICBidWZmZXJbaisrXSA9IHVwICsgYzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkgeworICAgICAgICAgIHVwID0gcHJldlJvd1tpXTsKKyAgICAgICAgICB2YXIgdXBMZWZ0ID0gcHJldlJvd1tpIC0gcGl4Qnl0ZXNdOworICAgICAgICAgIHZhciBsZWZ0ID0gYnVmZmVyW2ogLSBwaXhCeXRlc107CisgICAgICAgICAgdmFyIHAgPSBsZWZ0ICsgdXAgLSB1cExlZnQ7CisgICAgICAgICAgdmFyIHBhID0gcCAtIGxlZnQ7CisKKyAgICAgICAgICBpZiAocGEgPCAwKSB7CisgICAgICAgICAgICBwYSA9IC1wYTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgcGIgPSBwIC0gdXA7CisKKyAgICAgICAgICBpZiAocGIgPCAwKSB7CisgICAgICAgICAgICBwYiA9IC1wYjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgcGMgPSBwIC0gdXBMZWZ0OworCisgICAgICAgICAgaWYgKHBjIDwgMCkgeworICAgICAgICAgICAgcGMgPSAtcGM7CisgICAgICAgICAgfQorCisgICAgICAgICAgYyA9IHJhd0J5dGVzW2ldOworCisgICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKSB7CisgICAgICAgICAgICBidWZmZXJbaisrXSA9IGxlZnQgKyBjOworICAgICAgICAgIH0gZWxzZSBpZiAocGIgPD0gcGMpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXAgKyBjOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJbaisrXSA9IHVwTGVmdCArIGM7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAke3ByZWRpY3Rvcn1gKTsKKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlczsKKyAgfTsKKworICByZXR1cm4gUHJlZGljdG9yU3RyZWFtOworfSgpOworCitleHBvcnRzLlByZWRpY3RvclN0cmVhbSA9IFByZWRpY3RvclN0cmVhbTsKKwordmFyIERlY3J5cHRTdHJlYW0gPSBmdW5jdGlvbiBEZWNyeXB0U3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gRGVjcnlwdFN0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBkZWNyeXB0KSB7CisgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CisgICAgdGhpcy5kZWNyeXB0ID0gZGVjcnlwdDsKKyAgICB0aGlzLm5leHRDaHVuayA9IG51bGw7CisgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlOworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIHZhciBjaHVua1NpemUgPSA1MTI7CisgIERlY3J5cHRTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKworICBEZWNyeXB0U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBEZWNyeXB0U3RyZWFtX3JlYWRCbG9jaygpIHsKKyAgICB2YXIgY2h1bms7CisKKyAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgeworICAgICAgY2h1bmsgPSB0aGlzLm5leHRDaHVuazsKKyAgICB9IGVsc2UgeworICAgICAgY2h1bmsgPSB0aGlzLnN0ci5nZXRCeXRlcyhjaHVua1NpemUpOworICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFjaHVuayB8fCBjaHVuay5sZW5ndGggPT09IDApIHsKKyAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLm5leHRDaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7CisgICAgdmFyIGhhc01vcmVEYXRhID0gdGhpcy5uZXh0Q2h1bmsgJiYgdGhpcy5uZXh0Q2h1bmsubGVuZ3RoID4gMDsKKyAgICB2YXIgZGVjcnlwdCA9IHRoaXMuZGVjcnlwdDsKKyAgICBjaHVuayA9IGRlY3J5cHQoY2h1bmssICFoYXNNb3JlRGF0YSk7CisgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgIHZhciBpLAorICAgICAgICBuID0gY2h1bmsubGVuZ3RoOworICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBjaHVua1tpXTsKKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgfTsKKworICByZXR1cm4gRGVjcnlwdFN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5EZWNyeXB0U3RyZWFtID0gRGVjcnlwdFN0cmVhbTsKKwordmFyIEFzY2lpODVTdHJlYW0gPSBmdW5jdGlvbiBBc2NpaTg1U3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQXNjaWk4NVN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7CisgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CisgICAgdGhpcy5pbnB1dCA9IG5ldyBVaW50OEFycmF5KDUpOworCisgICAgaWYgKG1heWJlTGVuZ3RoKSB7CisgICAgICBtYXliZUxlbmd0aCA9IDAuOCAqIG1heWJlTGVuZ3RoOworICAgIH0KKworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIEFzY2lpODVTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKworICBBc2NpaTg1U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBBc2NpaTg1U3RyZWFtX3JlYWRCbG9jaygpIHsKKyAgICB2YXIgVElMREFfQ0hBUiA9IDB4N2U7CisgICAgdmFyIFpfTE9XRVJfQ0hBUiA9IDB4N2E7CisgICAgdmFyIEVPRiA9IC0xOworICAgIHZhciBzdHIgPSB0aGlzLnN0cjsKKyAgICB2YXIgYyA9IHN0ci5nZXRCeXRlKCk7CisKKyAgICB3aGlsZSAoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoYykpIHsKKyAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpOworICAgIH0KKworICAgIGlmIChjID09PSBFT0YgfHwgYyA9PT0gVElMREFfQ0hBUikgeworICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aCwKKyAgICAgICAgYnVmZmVyOworICAgIHZhciBpOworCisgICAgaWYgKGMgPT09IFpfTE9XRVJfQ0hBUikgeworICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgNCk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gMDsKKyAgICAgIH0KKworICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gNDsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dDsKKyAgICAgIGlucHV0WzBdID0gYzsKKworICAgICAgZm9yIChpID0gMTsgaSA8IDU7ICsraSkgeworICAgICAgICBjID0gc3RyLmdldEJ5dGUoKTsKKworICAgICAgICB3aGlsZSAoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoYykpIHsKKyAgICAgICAgICBjID0gc3RyLmdldEJ5dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlucHV0W2ldID0gYzsKKworICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBpIC0gMSk7CisgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSBpIC0gMTsKKworICAgICAgaWYgKGkgPCA1KSB7CisgICAgICAgIGZvciAoOyBpIDwgNTsgKytpKSB7CisgICAgICAgICAgaW5wdXRbaV0gPSAweDIxICsgODQ7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHZhciB0ID0gMDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgICB0ID0gdCAqIDg1ICsgKGlucHV0W2ldIC0gMHgyMSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDM7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGggKyBpXSA9IHQgJiAweGZmOworICAgICAgICB0ID4+PSA4OworICAgICAgfQorICAgIH0KKyAgfTsKKworICByZXR1cm4gQXNjaWk4NVN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5Bc2NpaTg1U3RyZWFtID0gQXNjaWk4NVN0cmVhbTsKKwordmFyIEFzY2lpSGV4U3RyZWFtID0gZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBBc2NpaUhleFN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7CisgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CisgICAgdGhpcy5maXJzdERpZ2l0ID0gLTE7CisKKyAgICBpZiAobWF5YmVMZW5ndGgpIHsKKyAgICAgIG1heWJlTGVuZ3RoID0gMC41ICogbWF5YmVMZW5ndGg7CisgICAgfQorCisgICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgQXNjaWlIZXhTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKworICBBc2NpaUhleFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW1fcmVhZEJsb2NrKCkgeworICAgIHZhciBVUFNUUkVBTV9CTE9DS19TSVpFID0gODAwMDsKKyAgICB2YXIgYnl0ZXMgPSB0aGlzLnN0ci5nZXRCeXRlcyhVUFNUUkVBTV9CTE9DS19TSVpFKTsKKworICAgIGlmICghYnl0ZXMubGVuZ3RoKSB7CisgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG1heERlY29kZUxlbmd0aCA9IGJ5dGVzLmxlbmd0aCArIDEgPj4gMTsKKyAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBtYXhEZWNvZGVMZW5ndGgpOworICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKyAgICB2YXIgZmlyc3REaWdpdCA9IHRoaXMuZmlyc3REaWdpdDsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjaCA9IGJ5dGVzW2ldLAorICAgICAgICAgIGRpZ2l0OworCisgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB7CisgICAgICAgIGRpZ2l0ID0gY2ggJiAweDBmOworICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSB7CisgICAgICAgIGRpZ2l0ID0gKGNoICYgMHgwZikgKyA5OworICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgzZSkgeworICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChmaXJzdERpZ2l0IDwgMCkgeworICAgICAgICBmaXJzdERpZ2l0ID0gZGlnaXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0IHwgZGlnaXQ7CisgICAgICAgIGZpcnN0RGlnaXQgPSAtMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmlyc3REaWdpdCA+PSAwICYmIHRoaXMuZW9mKSB7CisgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0OworICAgICAgZmlyc3REaWdpdCA9IC0xOworICAgIH0KKworICAgIHRoaXMuZmlyc3REaWdpdCA9IGZpcnN0RGlnaXQ7CisgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgIH07CisKKyAgcmV0dXJuIEFzY2lpSGV4U3RyZWFtOworfSgpOworCitleHBvcnRzLkFzY2lpSGV4U3RyZWFtID0gQXNjaWlIZXhTdHJlYW07CisKK3ZhciBSdW5MZW5ndGhTdHJlYW0gPSBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCkgeworICAgIHRoaXMuc3RyID0gc3RyOworICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIFJ1bkxlbmd0aFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIFJ1bkxlbmd0aFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gUnVuTGVuZ3RoU3RyZWFtX3JlYWRCbG9jaygpIHsKKyAgICB2YXIgcmVwZWF0SGVhZGVyID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoMik7CisKKyAgICBpZiAoIXJlcGVhdEhlYWRlciB8fCByZXBlYXRIZWFkZXIubGVuZ3RoIDwgMiB8fCByZXBlYXRIZWFkZXJbMF0gPT09IDEyOCkgeworICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBidWZmZXI7CisgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgIHZhciBuID0gcmVwZWF0SGVhZGVyWzBdOworCisgICAgaWYgKG4gPCAxMjgpIHsKKyAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTsKKyAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSByZXBlYXRIZWFkZXJbMV07CisKKyAgICAgIGlmIChuID4gMCkgeworICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zdHIuZ2V0Qnl0ZXMobik7CisgICAgICAgIGJ1ZmZlci5zZXQoc291cmNlLCBidWZmZXJMZW5ndGgpOworICAgICAgICBidWZmZXJMZW5ndGggKz0gbjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbiA9IDI1NyAtIG47CisgICAgICB2YXIgYiA9IHJlcGVhdEhlYWRlclsxXTsKKyAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGI7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgIH07CisKKyAgcmV0dXJuIFJ1bkxlbmd0aFN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5SdW5MZW5ndGhTdHJlYW0gPSBSdW5MZW5ndGhTdHJlYW07CisKK3ZhciBMWldTdHJlYW0gPSBmdW5jdGlvbiBMWldTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBMWldTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpIHsKKyAgICB0aGlzLnN0ciA9IHN0cjsKKyAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKKyAgICB0aGlzLmNhY2hlZERhdGEgPSAwOworICAgIHRoaXMuYml0c0NhY2hlZCA9IDA7CisgICAgdmFyIG1heEx6d0RpY3Rpb25hcnlTaXplID0gNDA5NjsKKyAgICB2YXIgbHp3U3RhdGUgPSB7CisgICAgICBlYXJseUNoYW5nZSwKKyAgICAgIGNvZGVMZW5ndGg6IDksCisgICAgICBuZXh0Q29kZTogMjU4LAorICAgICAgZGljdGlvbmFyeVZhbHVlczogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAorICAgICAgZGljdGlvbmFyeUxlbmd0aHM6IG5ldyBVaW50MTZBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCisgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAorICAgICAgY3VycmVudFNlcXVlbmNlOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCisgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGg6IDAKKyAgICB9OworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlc1tpXSA9IGk7CisgICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3Roc1tpXSA9IDE7CisgICAgfQorCisgICAgdGhpcy5sendTdGF0ZSA9IGx6d1N0YXRlOworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIExaV1N0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJpdHMgPSBmdW5jdGlvbiBMWldTdHJlYW1fcmVhZEJpdHMobikgeworICAgIHZhciBiaXRzQ2FjaGVkID0gdGhpcy5iaXRzQ2FjaGVkOworICAgIHZhciBjYWNoZWREYXRhID0gdGhpcy5jYWNoZWREYXRhOworCisgICAgd2hpbGUgKGJpdHNDYWNoZWQgPCBuKSB7CisgICAgICB2YXIgYyA9IHRoaXMuc3RyLmdldEJ5dGUoKTsKKworICAgICAgaWYgKGMgPT09IC0xKSB7CisgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNhY2hlZERhdGEgPSBjYWNoZWREYXRhIDw8IDggfCBjOworICAgICAgYml0c0NhY2hlZCArPSA4OworICAgIH0KKworICAgIHRoaXMuYml0c0NhY2hlZCA9IGJpdHNDYWNoZWQgLT0gbjsKKyAgICB0aGlzLmNhY2hlZERhdGEgPSBjYWNoZWREYXRhOworICAgIHRoaXMubGFzdENvZGUgPSBudWxsOworICAgIHJldHVybiBjYWNoZWREYXRhID4+PiBiaXRzQ2FjaGVkICYgKDEgPDwgbikgLSAxOworICB9OworCisgIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gTFpXU3RyZWFtX3JlYWRCbG9jaygpIHsKKyAgICB2YXIgYmxvY2tTaXplID0gNTEyOworICAgIHZhciBlc3RpbWF0ZWREZWNvZGVkU2l6ZSA9IGJsb2NrU2l6ZSAqIDIsCisgICAgICAgIGRlY29kZWRTaXplRGVsdGEgPSBibG9ja1NpemU7CisgICAgdmFyIGksIGosIHE7CisgICAgdmFyIGx6d1N0YXRlID0gdGhpcy5sendTdGF0ZTsKKworICAgIGlmICghbHp3U3RhdGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZWFybHlDaGFuZ2UgPSBsendTdGF0ZS5lYXJseUNoYW5nZTsKKyAgICB2YXIgbmV4dENvZGUgPSBsendTdGF0ZS5uZXh0Q29kZTsKKyAgICB2YXIgZGljdGlvbmFyeVZhbHVlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXM7CisgICAgdmFyIGRpY3Rpb25hcnlMZW5ndGhzID0gbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHM7CisgICAgdmFyIGRpY3Rpb25hcnlQcmV2Q29kZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5UHJldkNvZGVzOworICAgIHZhciBjb2RlTGVuZ3RoID0gbHp3U3RhdGUuY29kZUxlbmd0aDsKKyAgICB2YXIgcHJldkNvZGUgPSBsendTdGF0ZS5wcmV2Q29kZTsKKyAgICB2YXIgY3VycmVudFNlcXVlbmNlID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlOworICAgIHZhciBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGg7CisgICAgdmFyIGRlY29kZWRMZW5ndGggPSAwOworICAgIHZhciBjdXJyZW50QnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CisgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7CisgICAgICB2YXIgY29kZSA9IHRoaXMucmVhZEJpdHMoY29kZUxlbmd0aCk7CisgICAgICB2YXIgaGFzUHJldiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA+IDA7CisKKyAgICAgIGlmIChjb2RlIDwgMjU2KSB7CisgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVswXSA9IGNvZGU7CisgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDE7CisgICAgICB9IGVsc2UgaWYgKGNvZGUgPj0gMjU4KSB7CisgICAgICAgIGlmIChjb2RlIDwgbmV4dENvZGUpIHsKKyAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBkaWN0aW9uYXJ5TGVuZ3Roc1tjb2RlXTsKKworICAgICAgICAgIGZvciAoaiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCAtIDEsIHEgPSBjb2RlOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlW2pdID0gZGljdGlvbmFyeVZhbHVlc1txXTsKKyAgICAgICAgICAgIHEgPSBkaWN0aW9uYXJ5UHJldkNvZGVzW3FdOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdXJyZW50U2VxdWVuY2VbY3VycmVudFNlcXVlbmNlTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlWzBdOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDI1NikgeworICAgICAgICBjb2RlTGVuZ3RoID0gOTsKKyAgICAgICAgbmV4dENvZGUgPSAyNTg7CisgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICBkZWxldGUgdGhpcy5sendTdGF0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChoYXNQcmV2KSB7CisgICAgICAgIGRpY3Rpb25hcnlQcmV2Q29kZXNbbmV4dENvZGVdID0gcHJldkNvZGU7CisgICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzW25leHRDb2RlXSA9IGRpY3Rpb25hcnlMZW5ndGhzW3ByZXZDb2RlXSArIDE7CisgICAgICAgIGRpY3Rpb25hcnlWYWx1ZXNbbmV4dENvZGVdID0gY3VycmVudFNlcXVlbmNlWzBdOworICAgICAgICBuZXh0Q29kZSsrOworICAgICAgICBjb2RlTGVuZ3RoID0gbmV4dENvZGUgKyBlYXJseUNoYW5nZSAmIG5leHRDb2RlICsgZWFybHlDaGFuZ2UgLSAxID8gY29kZUxlbmd0aCA6IE1hdGgubWluKE1hdGgubG9nKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpIC8gMC42OTMxNDcxODA1NTk5NDUzICsgMSwgMTIpIHwgMDsKKyAgICAgIH0KKworICAgICAgcHJldkNvZGUgPSBjb2RlOworICAgICAgZGVjb2RlZExlbmd0aCArPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7CisKKyAgICAgIGlmIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpIHsKKyAgICAgICAgZG8geworICAgICAgICAgIGVzdGltYXRlZERlY29kZWRTaXplICs9IGRlY29kZWRTaXplRGVsdGE7CisgICAgICAgIH0gd2hpbGUgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCk7CisKKyAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBlc3RpbWF0ZWREZWNvZGVkU2l6ZSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50U2VxdWVuY2VMZW5ndGg7IGorKykgeworICAgICAgICBidWZmZXJbY3VycmVudEJ1ZmZlckxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVtqXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBsendTdGF0ZS5uZXh0Q29kZSA9IG5leHRDb2RlOworICAgIGx6d1N0YXRlLmNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoOworICAgIGx6d1N0YXRlLnByZXZDb2RlID0gcHJldkNvZGU7CisgICAgbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gY3VycmVudEJ1ZmZlckxlbmd0aDsKKyAgfTsKKworICByZXR1cm4gTFpXU3RyZWFtOworfSgpOworCitleHBvcnRzLkxaV1N0cmVhbSA9IExaV1N0cmVhbTsKKwordmFyIE51bGxTdHJlYW0gPSBmdW5jdGlvbiBOdWxsU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gTnVsbFN0cmVhbSgpIHsKKyAgICBTdHJlYW0uY2FsbCh0aGlzLCBuZXcgVWludDhBcnJheSgwKSk7CisgIH0KKworICBOdWxsU3RyZWFtLnByb3RvdHlwZSA9IFN0cmVhbS5wcm90b3R5cGU7CisgIHJldHVybiBOdWxsU3RyZWFtOworfSgpOworCitleHBvcnRzLk51bGxTdHJlYW0gPSBOdWxsU3RyZWFtOworCisvKioqLyB9KSwKKy8qIDEzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQ0NJVFRGYXhTdHJlYW0gPSB2b2lkIDA7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY2NpdHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKKwordmFyIENDSVRURmF4U3RyZWFtID0gZnVuY3Rpb24gQ0NJVFRGYXhTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBDQ0lUVEZheFN0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKKyAgICB0aGlzLnN0ciA9IHN0cjsKKyAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkocGFyYW1zKSkgeworICAgICAgcGFyYW1zID0gX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKKyAgICB9CisKKyAgICBjb25zdCBzb3VyY2UgPSB7CisgICAgICBuZXh0KCkgeworICAgICAgICByZXR1cm4gc3RyLmdldEJ5dGUoKTsKKyAgICAgIH0KKworICAgIH07CisgICAgdGhpcy5jY2l0dEZheERlY29kZXIgPSBuZXcgX2NjaXR0LkNDSVRURmF4RGVjb2Rlcihzb3VyY2UsIHsKKyAgICAgIEs6IHBhcmFtcy5nZXQoIksiKSwKKyAgICAgIEVuZE9mTGluZTogcGFyYW1zLmdldCgiRW5kT2ZMaW5lIiksCisgICAgICBFbmNvZGVkQnl0ZUFsaWduOiBwYXJhbXMuZ2V0KCJFbmNvZGVkQnl0ZUFsaWduIiksCisgICAgICBDb2x1bW5zOiBwYXJhbXMuZ2V0KCJDb2x1bW5zIiksCisgICAgICBSb3dzOiBwYXJhbXMuZ2V0KCJSb3dzIiksCisgICAgICBFbmRPZkJsb2NrOiBwYXJhbXMuZ2V0KCJFbmRPZkJsb2NrIiksCisgICAgICBCbGFja0lzMTogcGFyYW1zLmdldCgiQmxhY2tJczEiKQorICAgIH0pOworCisgICAgX3N0cmVhbS5EZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBDQ0lUVEZheFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKF9zdHJlYW0uRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisKKyAgQ0NJVFRGYXhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHsKKyAgICB3aGlsZSAoIXRoaXMuZW9mKSB7CisgICAgICBjb25zdCBjID0gdGhpcy5jY2l0dEZheERlY29kZXIucmVhZE5leHRDaGFyKCk7CisKKyAgICAgIGlmIChjID09PSAtMSkgeworICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyAxKTsKKyAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdID0gYzsKKyAgICB9CisgIH07CisKKyAgcmV0dXJuIENDSVRURmF4U3RyZWFtOworfSgpOworCitleHBvcnRzLkNDSVRURmF4U3RyZWFtID0gQ0NJVFRGYXhTdHJlYW07CisKKy8qKiovIH0pLAorLyogMTQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DQ0lUVEZheERlY29kZXIgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK2NvbnN0IENDSVRURmF4RGVjb2RlciA9IGZ1bmN0aW9uIENDSVRURmF4RGVjb2RlcigpIHsKKyAgY29uc3QgY2NpdHRFT0wgPSAtMjsKKyAgY29uc3QgY2NpdHRFT0YgPSAtMTsKKyAgY29uc3QgdHdvRGltUGFzcyA9IDA7CisgIGNvbnN0IHR3b0RpbUhvcml6ID0gMTsKKyAgY29uc3QgdHdvRGltVmVydDAgPSAyOworICBjb25zdCB0d29EaW1WZXJ0UjEgPSAzOworICBjb25zdCB0d29EaW1WZXJ0TDEgPSA0OworICBjb25zdCB0d29EaW1WZXJ0UjIgPSA1OworICBjb25zdCB0d29EaW1WZXJ0TDIgPSA2OworICBjb25zdCB0d29EaW1WZXJ0UjMgPSA3OworICBjb25zdCB0d29EaW1WZXJ0TDMgPSA4OworICBjb25zdCB0d29EaW1UYWJsZSA9IFtbLTEsIC0xXSwgWy0xLCAtMV0sIFs3LCB0d29EaW1WZXJ0TDNdLCBbNywgdHdvRGltVmVydFIzXSwgWzYsIHR3b0RpbVZlcnRMMl0sIFs2LCB0d29EaW1WZXJ0TDJdLCBbNiwgdHdvRGltVmVydFIyXSwgWzYsIHR3b0RpbVZlcnRSMl0sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF1dOworICBjb25zdCB3aGl0ZVRhYmxlMSA9IFtbLTEsIC0xXSwgWzEyLCBjY2l0dEVPTF0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzEyLCAxOTg0XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMTEyXSwgWzEyLCAyMTc2XSwgWzEyLCAyMjQwXSwgWzEyLCAyMzA0XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzEyLCAyMzY4XSwgWzEyLCAyNDMyXSwgWzEyLCAyNDk2XSwgWzEyLCAyNTYwXV07CisgIGNvbnN0IHdoaXRlVGFibGUyID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbOCwgMjldLCBbOCwgMjldLCBbOCwgMzBdLCBbOCwgMzBdLCBbOCwgNDVdLCBbOCwgNDVdLCBbOCwgNDZdLCBbOCwgNDZdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjNdLCBbNywgMjNdLCBbNywgMjNdLCBbNywgMjNdLCBbOCwgNDddLCBbOCwgNDddLCBbOCwgNDhdLCBbOCwgNDhdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbOCwgMzNdLCBbOCwgMzNdLCBbOCwgMzRdLCBbOCwgMzRdLCBbOCwgMzVdLCBbOCwgMzVdLCBbOCwgMzZdLCBbOCwgMzZdLCBbOCwgMzddLCBbOCwgMzddLCBbOCwgMzhdLCBbOCwgMzhdLCBbNywgMTldLCBbNywgMTldLCBbNywgMTldLCBbNywgMTldLCBbOCwgMzFdLCBbOCwgMzFdLCBbOCwgMzJdLCBbOCwgMzJdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzgsIDUzXSwgWzgsIDUzXSwgWzgsIDU0XSwgWzgsIDU0XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzgsIDM5XSwgWzgsIDM5XSwgWzgsIDQwXSwgWzgsIDQwXSwgWzgsIDQxXSwgWzgsIDQxXSwgWzgsIDQyXSwgWzgsIDQyXSwgWzgsIDQzXSwgWzgsIDQzXSwgWzgsIDQ0XSwgWzgsIDQ0XSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzgsIDYxXSwgWzgsIDYxXSwgWzgsIDYyXSwgWzgsIDYyXSwgWzgsIDYzXSwgWzgsIDYzXSwgWzgsIDBdLCBbOCwgMF0sIFs4LCAzMjBdLCBbOCwgMzIwXSwgWzgsIDM4NF0sIFs4LCAzODRdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNywgMjddLCBbNywgMjddLCBbNywgMjddLCBbNywgMjddLCBbOCwgNTldLCBbOCwgNTldLCBbOCwgNjBdLCBbOCwgNjBdLCBbOSwgMTQ3Ml0sIFs5LCAxNTM2XSwgWzksIDE2MDBdLCBbOSwgMTcyOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs4LCA0OV0sIFs4LCA0OV0sIFs4LCA1MF0sIFs4LCA1MF0sIFs4LCA1MV0sIFs4LCA1MV0sIFs4LCA1Ml0sIFs4LCA1Ml0sIFs3LCAyNV0sIFs3LCAyNV0sIFs3LCAyNV0sIFs3LCAyNV0sIFs4LCA1NV0sIFs4LCA1NV0sIFs4LCA1Nl0sIFs4LCA1Nl0sIFs4LCA1N10sIFs4LCA1N10sIFs4LCA1OF0sIFs4LCA1OF0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs4LCA0NDhdLCBbOCwgNDQ4XSwgWzgsIDUxMl0sIFs4LCA1MTJdLCBbOSwgNzA0XSwgWzksIDc2OF0sIFs4LCA2NDBdLCBbOCwgNjQwXSwgWzgsIDU3Nl0sIFs4LCA1NzZdLCBbOSwgODMyXSwgWzksIDg5Nl0sIFs5LCA5NjBdLCBbOSwgMTAyNF0sIFs5LCAxMDg4XSwgWzksIDExNTJdLCBbOSwgMTIxNl0sIFs5LCAxMjgwXSwgWzksIDEzNDRdLCBbOSwgMTQwOF0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN11dOworICBjb25zdCBibGFja1RhYmxlMSA9IFtbLTEsIC0xXSwgWy0xLCAtMV0sIFsxMiwgY2NpdHRFT0xdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMiwgMTk4NF0sIFsxMiwgMTk4NF0sIFsxMiwgMjA0OF0sIFsxMiwgMjA0OF0sIFsxMiwgMjExMl0sIFsxMiwgMjExMl0sIFsxMiwgMjE3Nl0sIFsxMiwgMjE3Nl0sIFsxMiwgMjI0MF0sIFsxMiwgMjI0MF0sIFsxMiwgMjMwNF0sIFsxMiwgMjMwNF0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTkyMF0sIFsxMSwgMTkyMF0sIFsxMSwgMTkyMF0sIFsxMSwgMTkyMF0sIFsxMiwgMjM2OF0sIFsxMiwgMjM2OF0sIFsxMiwgMjQzMl0sIFsxMiwgMjQzMl0sIFsxMiwgMjQ5Nl0sIFsxMiwgMjQ5Nl0sIFsxMiwgMjU2MF0sIFsxMiwgMjU2MF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEyLCA1Ml0sIFsxMiwgNTJdLCBbMTMsIDY0MF0sIFsxMywgNzA0XSwgWzEzLCA3NjhdLCBbMTMsIDgzMl0sIFsxMiwgNTVdLCBbMTIsIDU1XSwgWzEyLCA1Nl0sIFsxMiwgNTZdLCBbMTMsIDEyODBdLCBbMTMsIDEzNDRdLCBbMTMsIDE0MDhdLCBbMTMsIDE0NzJdLCBbMTIsIDU5XSwgWzEyLCA1OV0sIFsxMiwgNjBdLCBbMTIsIDYwXSwgWzEzLCAxNTM2XSwgWzEzLCAxNjAwXSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTMsIDE2NjRdLCBbMTMsIDE3MjhdLCBbMTIsIDMyMF0sIFsxMiwgMzIwXSwgWzEyLCAzODRdLCBbMTIsIDM4NF0sIFsxMiwgNDQ4XSwgWzEyLCA0NDhdLCBbMTMsIDUxMl0sIFsxMywgNTc2XSwgWzEyLCA1M10sIFsxMiwgNTNdLCBbMTIsIDU0XSwgWzEyLCA1NF0sIFsxMywgODk2XSwgWzEzLCA5NjBdLCBbMTMsIDEwMjRdLCBbMTMsIDEwODhdLCBbMTMsIDExNTJdLCBbMTMsIDEyMTZdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF1dOworICBjb25zdCBibGFja1RhYmxlMiA9IFtbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbMTEsIDIzXSwgWzExLCAyM10sIFsxMiwgNTBdLCBbMTIsIDUxXSwgWzEyLCA0NF0sIFsxMiwgNDVdLCBbMTIsIDQ2XSwgWzEyLCA0N10sIFsxMiwgNTddLCBbMTIsIDU4XSwgWzEyLCA2MV0sIFsxMiwgMjU2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTIsIDQ4XSwgWzEyLCA0OV0sIFsxMiwgNjJdLCBbMTIsIDYzXSwgWzEyLCAzMF0sIFsxMiwgMzFdLCBbMTIsIDMyXSwgWzEyLCAzM10sIFsxMiwgNDBdLCBbMTIsIDQxXSwgWzExLCAyMl0sIFsxMSwgMjJdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbMTIsIDEyOF0sIFsxMiwgMTkyXSwgWzEyLCAyNl0sIFsxMiwgMjddLCBbMTIsIDI4XSwgWzEyLCAyOV0sIFsxMSwgMTldLCBbMTEsIDE5XSwgWzExLCAyMF0sIFsxMSwgMjBdLCBbMTIsIDM0XSwgWzEyLCAzNV0sIFsxMiwgMzZdLCBbMTIsIDM3XSwgWzEyLCAzOF0sIFsxMiwgMzldLCBbMTEsIDIxXSwgWzExLCAyMV0sIFsxMiwgNDJdLCBbMTIsIDQzXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXV07CisgIGNvbnN0IGJsYWNrVGFibGUzID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbNiwgOV0sIFs2LCA4XSwgWzUsIDddLCBbNSwgN10sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdXTsKKworICBmdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoc291cmNlLCBvcHRpb25zID0ge30pIHsKKyAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlLm5leHQgIT09ICJmdW5jdGlvbiIpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignQ0NJVFRGYXhEZWNvZGVyIC0gaW52YWxpZCAic291cmNlIiBwYXJhbWV0ZXIuJyk7CisgICAgfQorCisgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgdGhpcy5lb2YgPSBmYWxzZTsKKyAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5LIHx8IDA7CisgICAgdGhpcy5lb2xpbmUgPSBvcHRpb25zLkVuZE9mTGluZSB8fCBmYWxzZTsKKyAgICB0aGlzLmJ5dGVBbGlnbiA9IG9wdGlvbnMuRW5jb2RlZEJ5dGVBbGlnbiB8fCBmYWxzZTsKKyAgICB0aGlzLmNvbHVtbnMgPSBvcHRpb25zLkNvbHVtbnMgfHwgMTcyODsKKyAgICB0aGlzLnJvd3MgPSBvcHRpb25zLlJvd3MgfHwgMDsKKyAgICBsZXQgZW9ibG9jayA9IG9wdGlvbnMuRW5kT2ZCbG9jazsKKworICAgIGlmIChlb2Jsb2NrID09PSBudWxsIHx8IGVvYmxvY2sgPT09IHVuZGVmaW5lZCkgeworICAgICAgZW9ibG9jayA9IHRydWU7CisgICAgfQorCisgICAgdGhpcy5lb2Jsb2NrID0gZW9ibG9jazsKKyAgICB0aGlzLmJsYWNrID0gb3B0aW9ucy5CbGFja0lzMSB8fCBmYWxzZTsKKyAgICB0aGlzLmNvZGluZ0xpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMSk7CisgICAgdGhpcy5yZWZMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDIpOworICAgIHRoaXMuY29kaW5nTGluZVswXSA9IHRoaXMuY29sdW1uczsKKyAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CisgICAgdGhpcy5yb3cgPSAwOworICAgIHRoaXMubmV4dExpbmUyRCA9IHRoaXMuZW5jb2RpbmcgPCAwOworICAgIHRoaXMuaW5wdXRCaXRzID0gMDsKKyAgICB0aGlzLmlucHV0QnVmID0gMDsKKyAgICB0aGlzLm91dHB1dEJpdHMgPSAwOworICAgIHRoaXMucm93c0RvbmUgPSBmYWxzZTsKKyAgICBsZXQgY29kZTE7CisKKyAgICB3aGlsZSAoKGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpKSA9PT0gMCkgeworICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICB9CisKKyAgICBpZiAoY29kZTEgPT09IDEpIHsKKyAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworICAgIH0KKworICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkgeworICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOworCisgICAgICB0aGlzLl9lYXRCaXRzKDEpOworICAgIH0KKyAgfQorCisgIENDSVRURmF4RGVjb2Rlci5wcm90b3R5cGUgPSB7CisgICAgcmVhZE5leHRDaGFyKCkgeworICAgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgY29uc3QgcmVmTGluZSA9IHRoaXMucmVmTGluZTsKKyAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CisgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOworICAgICAgbGV0IHJlZlBvcywgYmxhY2tQaXhlbHMsIGJpdHMsIGk7CisKKyAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDApIHsKKyAgICAgICAgaWYgKHRoaXMucm93c0RvbmUpIHsKKyAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmVyciA9IGZhbHNlOworICAgICAgICBsZXQgY29kZTEsIGNvZGUyLCBjb2RlMzsKKworICAgICAgICBpZiAodGhpcy5uZXh0TGluZTJEKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgY29kaW5nTGluZVtpXSA8IGNvbHVtbnM7ICsraSkgeworICAgICAgICAgICAgcmVmTGluZVtpXSA9IGNvZGluZ0xpbmVbaV07CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVmTGluZVtpKytdID0gY29sdW1uczsKKyAgICAgICAgICByZWZMaW5lW2ldID0gY29sdW1uczsKKyAgICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKKyAgICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CisgICAgICAgICAgcmVmUG9zID0gMDsKKyAgICAgICAgICBibGFja1BpeGVscyA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2dldFR3b0RpbUNvZGUoKTsKKworICAgICAgICAgICAgc3dpdGNoIChjb2RlMSkgeworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVBhc3M6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zICsgMV0sIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWZMaW5lW3JlZlBvcyArIDFdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1Ib3JpejoKKyAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUyID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgeworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworCisgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CisgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKKyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMiwgYmxhY2tQaXhlbHMgXiAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIzOgorICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAzLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOworCisgICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRSMjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdICsgMiwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjE6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICArK3JlZlBvczsKKworICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydDA6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDM6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDMsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDI6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDIsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDE6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBjY2l0dEVPRjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoImJhZCAyZCBjb2RlIik7CisKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVyciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOworICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKKyAgICAgICAgICBibGFja1BpeGVscyA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICBjb2RlMSA9IDA7CisKKyAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgeworICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CisgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsZXQgZ290RU9MID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHRoaXMuYnl0ZUFsaWduKSB7CisgICAgICAgICAgdGhpcy5pbnB1dEJpdHMgJj0gfjc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuZW9ibG9jayAmJiB0aGlzLnJvdyA9PT0gdGhpcy5yb3dzIC0gMSkgeworICAgICAgICAgIHRoaXMucm93c0RvbmUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOworCisgICAgICAgICAgaWYgKHRoaXMuZW9saW5lKSB7CisgICAgICAgICAgICB3aGlsZSAoY29kZTEgIT09IGNjaXR0RU9GICYmIGNvZGUxICE9PSAxKSB7CisgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdoaWxlIChjb2RlMSA9PT0gMCkgeworICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjb2RlMSA9PT0gMSkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICAgIGdvdEVPTCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuZW9mICYmIHRoaXMuZW5jb2RpbmcgPiAwICYmICF0aGlzLnJvd3NEb25lKSB7CisgICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOworCisgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmVvYmxvY2sgJiYgZ290RU9MICYmIHRoaXMuYnl0ZUFsaWduKSB7CisgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICBpZiAoY29kZTEgPT09IDEpIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworCisgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7CisKKyAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPj0gMCkgeworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHsKKyAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIHJ0YyBjb2RlOiAiICsgY29kZTEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKKworICAgICAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVyciAmJiB0aGlzLmVvbGluZSkgeworICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKKworICAgICAgICAgICAgaWYgKGNvZGUxID09PSBjY2l0dEVPRikgeworICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGUxID4+IDEgPT09IDEpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgIHRoaXMubmV4dExpbmUyRCA9ICEoY29kZTEgJiAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kaW5nTGluZVswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zID0gMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyA9IDFdOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5yb3crKzsKKyAgICAgIH0KKworICAgICAgbGV0IGM7CisKKyAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPj0gOCkgeworICAgICAgICBjID0gdGhpcy5jb2RpbmdQb3MgJiAxID8gMCA6IDB4ZmY7CisgICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSA4OworCisgICAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDAgJiYgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYml0cyA9IDg7CisgICAgICAgIGMgPSAwOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykgeworICAgICAgICAgICAgYyA8PD0gYml0czsKKworICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgeworICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIGJpdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSBiaXRzOworICAgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMgPDw9IHRoaXMub3V0cHV0Qml0czsKKworICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgeworICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIHRoaXMub3V0cHV0Qml0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0cyAtPSB0aGlzLm91dHB1dEJpdHM7CisgICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSAwOworCisgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7CisgICAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdOworICAgICAgICAgICAgfSBlbHNlIGlmIChiaXRzID4gMCkgeworICAgICAgICAgICAgICBjIDw8PSBiaXRzOworICAgICAgICAgICAgICBiaXRzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGJpdHMpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5ibGFjaykgeworICAgICAgICBjIF49IDB4ZmY7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjOworICAgIH0sCisKKyAgICBfYWRkUGl4ZWxzKGExLCBibGFja1BpeGVscykgeworICAgICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKKyAgICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvczsKKworICAgICAgaWYgKGExID4gY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7CisgICAgICAgIGlmIChhMSA+IHRoaXMuY29sdW1ucykgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgicm93IGlzIHdyb25nIGxlbmd0aCIpOworICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKKyAgICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RpbmdQb3MgJiAxIF4gYmxhY2tQaXhlbHMpIHsKKyAgICAgICAgICArK2NvZGluZ1BvczsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOworICAgICAgfQorCisgICAgICB0aGlzLmNvZGluZ1BvcyA9IGNvZGluZ1BvczsKKyAgICB9LAorCisgICAgX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHsKKyAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CisgICAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CisKKyAgICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkgeworICAgICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKTsKKyAgICAgICAgICB0aGlzLmVyciA9IHRydWU7CisgICAgICAgICAgYTEgPSB0aGlzLmNvbHVtbnM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kaW5nUG9zICYgMSBeIGJsYWNrUGl4ZWxzKSB7CisgICAgICAgICAgKytjb2RpbmdQb3M7CisgICAgICAgIH0KKworICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTsKKyAgICAgIH0gZWxzZSBpZiAoYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKKyAgICAgICAgaWYgKGExIDwgMCkgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiaW52YWxpZCBjb2RlIik7CisgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOworICAgICAgICAgIGExID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChjb2RpbmdQb3MgPiAwICYmIGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3MgLSAxXSkgeworICAgICAgICAgIC0tY29kaW5nUG9zOworICAgICAgICB9CisKKyAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zOworICAgIH0sCisKKyAgICBfZmluZFRhYmxlQ29kZShzdGFydCwgZW5kLCB0YWJsZSwgbGltaXQpIHsKKyAgICAgIGNvbnN0IGxpbWl0VmFsdWUgPSBsaW1pdCB8fCAwOworCisgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKKyAgICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTsKKworICAgICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICByZXR1cm4gW3RydWUsIDEsIGZhbHNlXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgZW5kKSB7CisgICAgICAgICAgY29kZSA8PD0gZW5kIC0gaTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHsKKyAgICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdOworCisgICAgICAgICAgaWYgKHBbMF0gPT09IGkpIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoaSk7CisKKyAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgcFsxXSwgdHJ1ZV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTsKKyAgICB9LAorCisgICAgX2dldFR3b0RpbUNvZGUoKSB7CisgICAgICBsZXQgY29kZSA9IDA7CisgICAgICBsZXQgcDsKKworICAgICAgaWYgKHRoaXMuZW9ibG9jaykgeworICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoNyk7CisgICAgICAgIHAgPSB0d29EaW1UYWJsZVtjb2RlXTsKKworICAgICAgICBpZiAocCAmJiBwWzBdID4gMCkgeworICAgICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CisKKyAgICAgICAgICByZXR1cm4gcFsxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA3LCB0d29EaW1UYWJsZSk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSAmJiByZXN1bHRbMl0pIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiQmFkIHR3byBkaW0gY29kZSIpOworICAgICAgcmV0dXJuIGNjaXR0RU9GOworICAgIH0sCisKKyAgICBfZ2V0V2hpdGVDb2RlKCkgeworICAgICAgbGV0IGNvZGUgPSAwOworICAgICAgbGV0IHA7CisKKyAgICAgIGlmICh0aGlzLmVvYmxvY2spIHsKKyAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKKworICAgICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RlID4+IDUgPT09IDApIHsKKyAgICAgICAgICBwID0gd2hpdGVUYWJsZTFbY29kZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcCA9IHdoaXRlVGFibGUyW2NvZGUgPj4gM107CisgICAgICAgIH0KKworICAgICAgICBpZiAocFswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOworCisgICAgICAgICAgcmV0dXJuIHBbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsIDEyLCB3aGl0ZVRhYmxlMSk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJiYWQgd2hpdGUgY29kZSIpOworCisgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICByZXR1cm4gMTsKKyAgICB9LAorCisgICAgX2dldEJsYWNrQ29kZSgpIHsKKyAgICAgIGxldCBjb2RlLCBwOworCisgICAgICBpZiAodGhpcy5lb2Jsb2NrKSB7CisgICAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMyk7CisKKyAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kZSA+PiA3ID09PSAwKSB7CisgICAgICAgICAgcCA9IGJsYWNrVGFibGUxW2NvZGVdOworICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPj4gOSA9PT0gMCAmJiBjb2RlID4+IDcgIT09IDApIHsKKyAgICAgICAgICBwID0gYmxhY2tUYWJsZTJbKGNvZGUgPj4gMSkgLSA2NF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcCA9IGJsYWNrVGFibGUzW2NvZGUgPj4gN107CisgICAgICAgIH0KKworICAgICAgICBpZiAocFswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOworCisgICAgICAgICAgcmV0dXJuIHBbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDIsIDYsIGJsYWNrVGFibGUzKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoNywgMTIsIGJsYWNrVGFibGUyLCA2NCk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEwLCAxMywgYmxhY2tUYWJsZTEpOworCisgICAgICAgIGlmIChyZXN1bHRbMF0pIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIGJsYWNrIGNvZGUiKTsKKworICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKworICAgICAgcmV0dXJuIDE7CisgICAgfSwKKworICAgIF9sb29rQml0cyhuKSB7CisgICAgICBsZXQgYzsKKworICAgICAgd2hpbGUgKHRoaXMuaW5wdXRCaXRzIDwgbikgeworICAgICAgICBpZiAoKGMgPSB0aGlzLnNvdXJjZS5uZXh0KCkpID09PSAtMSkgeworICAgICAgICAgIGlmICh0aGlzLmlucHV0Qml0cyA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNjaXR0RU9GOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0QnVmIDw8IG4gLSB0aGlzLmlucHV0Qml0cyAmIDB4ZmZmZiA+PiAxNiAtIG47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmlucHV0QnVmID0gdGhpcy5pbnB1dEJ1ZiA8PCA4IHwgYzsKKyAgICAgICAgdGhpcy5pbnB1dEJpdHMgKz0gODsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuaW5wdXRCdWYgPj4gdGhpcy5pbnB1dEJpdHMgLSBuICYgMHhmZmZmID4+IDE2IC0gbjsKKyAgICB9LAorCisgICAgX2VhdEJpdHMobikgeworICAgICAgaWYgKCh0aGlzLmlucHV0Qml0cyAtPSBuKSA8IDApIHsKKyAgICAgICAgdGhpcy5pbnB1dEJpdHMgPSAwOworICAgICAgfQorICAgIH0KKworICB9OworICByZXR1cm4gQ0NJVFRGYXhEZWNvZGVyOworfSgpOworCitleHBvcnRzLkNDSVRURmF4RGVjb2RlciA9IENDSVRURmF4RGVjb2RlcjsKKworLyoqKi8gfSksCisvKiAxNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkpiaWcyU3RyZWFtID0gdm9pZCAwOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOworCit2YXIgX2piaWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworY29uc3QgSmJpZzJTdHJlYW0gPSBmdW5jdGlvbiBKYmlnMlN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEpiaWcyU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGRpY3QsIHBhcmFtcykgeworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDsKKyAgICB0aGlzLmRpY3QgPSBkaWN0OworICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworCisgICAgX3N0cmVhbS5EZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBKYmlnMlN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKF9zdHJlYW0uRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKYmlnMlN0cmVhbS5wcm90b3R5cGUsICJieXRlcyIsIHsKKyAgICBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImJ5dGVzIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpOworICAgIH0sCisKKyAgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisKKyAgSmJpZzJTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlciA9IGZ1bmN0aW9uIChyZXF1ZXN0ZWQpIHt9OworCisgIEpiaWcyU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgamJpZzJJbWFnZSA9IG5ldyBfamJpZy5KYmlnMkltYWdlKCk7CisgICAgY29uc3QgY2h1bmtzID0gW107CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkodGhpcy5wYXJhbXMpKSB7CisgICAgICBjb25zdCBnbG9iYWxzU3RyZWFtID0gdGhpcy5wYXJhbXMuZ2V0KCJKQklHMkdsb2JhbHMiKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoZ2xvYmFsc1N0cmVhbSkpIHsKKyAgICAgICAgY29uc3QgZ2xvYmFscyA9IGdsb2JhbHNTdHJlYW0uZ2V0Qnl0ZXMoKTsKKyAgICAgICAgY2h1bmtzLnB1c2goeworICAgICAgICAgIGRhdGE6IGdsb2JhbHMsCisgICAgICAgICAgc3RhcnQ6IDAsCisgICAgICAgICAgZW5kOiBnbG9iYWxzLmxlbmd0aAorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjaHVua3MucHVzaCh7CisgICAgICBkYXRhOiB0aGlzLmJ5dGVzLAorICAgICAgc3RhcnQ6IDAsCisgICAgICBlbmQ6IHRoaXMuYnl0ZXMubGVuZ3RoCisgICAgfSk7CisgICAgY29uc3QgZGF0YSA9IGpiaWcySW1hZ2UucGFyc2VDaHVua3MoY2h1bmtzKTsKKyAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykgeworICAgICAgZGF0YVtpXSBePSAweGZmOworICAgIH0KKworICAgIHRoaXMuYnVmZmVyID0gZGF0YTsKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGFMZW5ndGg7CisgICAgdGhpcy5lb2YgPSB0cnVlOworICB9OworCisgIHJldHVybiBKYmlnMlN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5KYmlnMlN0cmVhbSA9IEpiaWcyU3RyZWFtOworCisvKioqLyB9KSwKKy8qIDE2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSmJpZzJJbWFnZSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKwordmFyIF9hcml0aG1ldGljX2RlY29kZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKKwordmFyIF9jY2l0dCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOworCitjbGFzcyBKYmlnMkVycm9yIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7CisgIGNvbnN0cnVjdG9yKG1zZykgeworICAgIHN1cGVyKGBKQklHMiBlcnJvcjogJHttc2d9YCk7CisgIH0KKworfQorCit2YXIgSmJpZzJJbWFnZSA9IGZ1bmN0aW9uIEpiaWcySW1hZ2VDbG9zdXJlKCkgeworICBmdW5jdGlvbiBDb250ZXh0Q2FjaGUoKSB7fQorCisgIENvbnRleHRDYWNoZS5wcm90b3R5cGUgPSB7CisgICAgZ2V0Q29udGV4dHMoaWQpIHsKKyAgICAgIGlmIChpZCBpbiB0aGlzKSB7CisgICAgICAgIHJldHVybiB0aGlzW2lkXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXNbaWRdID0gbmV3IEludDhBcnJheSgxIDw8IDE2KTsKKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgIHRoaXMuZW5kID0gZW5kOworICB9CisKKyAgRGVjb2RpbmdDb250ZXh0LnByb3RvdHlwZSA9IHsKKyAgICBnZXQgZGVjb2RlcigpIHsKKyAgICAgIHZhciBkZWNvZGVyID0gbmV3IF9hcml0aG1ldGljX2RlY29kZXIuQXJpdGhtZXRpY0RlY29kZXIodGhpcy5kYXRhLCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRlY29kZXIiLCBkZWNvZGVyKTsKKyAgICB9LAorCisgICAgZ2V0IGNvbnRleHRDYWNoZSgpIHsKKyAgICAgIHZhciBjYWNoZSA9IG5ldyBDb250ZXh0Q2FjaGUoKTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiY29udGV4dENhY2hlIiwgY2FjaGUpOworICAgIH0KKworICB9OworCisgIGZ1bmN0aW9uIGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBwcm9jZWR1cmUsIGRlY29kZXIpIHsKKyAgICB2YXIgY29udGV4dHMgPSBjb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMocHJvY2VkdXJlKTsKKyAgICB2YXIgcHJldiA9IDE7CisKKyAgICBmdW5jdGlvbiByZWFkQml0cyhsZW5ndGgpIHsKKyAgICAgIHZhciB2ID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKKyAgICAgICAgcHJldiA9IHByZXYgPCAyNTYgPyBwcmV2IDw8IDEgfCBiaXQgOiAocHJldiA8PCAxIHwgYml0KSAmIDUxMSB8IDI1NjsKKyAgICAgICAgdiA9IHYgPDwgMSB8IGJpdDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHYgPj4+IDA7CisgICAgfQorCisgICAgdmFyIHNpZ24gPSByZWFkQml0cygxKTsKKyAgICB2YXIgdmFsdWUgPSByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMzIpICsgNDQzNiA6IHJlYWRCaXRzKDEyKSArIDM0MCA6IHJlYWRCaXRzKDgpICsgODQgOiByZWFkQml0cyg2KSArIDIwIDogcmVhZEJpdHMoNCkgKyA0IDogcmVhZEJpdHMoMik7CisKKyAgICBpZiAoc2lnbiA9PT0gMCkgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gZWxzZSBpZiAodmFsdWUgPiAwKSB7CisgICAgICByZXR1cm4gLXZhbHVlOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIGNvZGVMZW5ndGgpIHsKKyAgICB2YXIgY29udGV4dHMgPSBjb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIklBSUQiKTsKKyAgICB2YXIgcHJldiA9IDE7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVMZW5ndGg7IGkrKykgeworICAgICAgdmFyIGJpdCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHJldik7CisgICAgICBwcmV2ID0gcHJldiA8PCAxIHwgYml0OworICAgIH0KKworICAgIGlmIChjb2RlTGVuZ3RoIDwgMzEpIHsKKyAgICAgIHJldHVybiBwcmV2ICYgKDEgPDwgY29kZUxlbmd0aCkgLSAxOworICAgIH0KKworICAgIHJldHVybiBwcmV2ICYgMHg3ZmZmZmZmZjsKKyAgfQorCisgIHZhciBTZWdtZW50VHlwZXMgPSBbIlN5bWJvbERpY3Rpb25hcnkiLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVUZXh0UmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYXR0ZXJuRGljdGlvbmFyeSIsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCAiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYWdlSW5mb3JtYXRpb24iLCAiRW5kT2ZQYWdlIiwgIkVuZE9mU3RyaXBlIiwgIkVuZE9mRmlsZSIsICJQcm9maWxlcyIsICJUYWJsZXMiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiRXh0ZW5zaW9uIl07CisgIHZhciBDb2RpbmdUZW1wbGF0ZXMgPSBbW3sKKyAgICB4OiAtMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAyLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtNCwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMywKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAwCisgIH1dLCBbeworICAgIHg6IC0xLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAyLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0zLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IDAKKyAgfV0sIFt7CisgICAgeDogLTEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogMAorICB9XSwgW3sKKyAgICB4OiAtMywKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtNCwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMywKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAwCisgIH1dXTsKKyAgdmFyIFJlZmluZW1lbnRUZW1wbGF0ZXMgPSBbeworICAgIGNvZGluZzogW3sKKyAgICAgIHg6IDAsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMAorICAgIH1dLAorICAgIHJlZmVyZW5jZTogW3sKKyAgICAgIHg6IDAsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IDEKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAxCisgICAgfV0KKyAgfSwgeworICAgIGNvZGluZzogW3sKKyAgICAgIHg6IC0xLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IDAKKyAgICB9XSwKKyAgICByZWZlcmVuY2U6IFt7CisgICAgICB4OiAwLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMCwKKyAgICAgIHk6IDEKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogMQorICAgIH1dCisgIH1dOworICB2YXIgUmV1c2VkQ29udGV4dHMgPSBbMHg5YjI1LCAweDA3OTUsIDB4MDBlNSwgMHgwMTk1XTsKKyAgdmFyIFJlZmluZW1lbnRSZXVzZWRDb250ZXh0cyA9IFsweDAwMjAsIDB4MDAwOF07CisKKyAgZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkgeworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKTsKKyAgICB2YXIgY29udGV4dExhYmVsLAorICAgICAgICBpLAorICAgICAgICBqLAorICAgICAgICBwaXhlbCwKKyAgICAgICAgcm93LAorICAgICAgICByb3cxLAorICAgICAgICByb3cyLAorICAgICAgICBiaXRtYXAgPSBbXTsKKyAgICB2YXIgT0xEX1BJWEVMX01BU0sgPSAweDdiZjc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHJvdyA9IGJpdG1hcFtpXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKyAgICAgIHJvdzEgPSBpIDwgMSA/IHJvdyA6IGJpdG1hcFtpIC0gMV07CisgICAgICByb3cyID0gaSA8IDIgPyByb3cgOiBiaXRtYXBbaSAtIDJdOworICAgICAgY29udGV4dExhYmVsID0gcm93MlswXSA8PCAxMyB8IHJvdzJbMV0gPDwgMTIgfCByb3cyWzJdIDw8IDExIHwgcm93MVswXSA8PCA3IHwgcm93MVsxXSA8PCA2IHwgcm93MVsyXSA8PCA1IHwgcm93MVszXSA8PCA0OworCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICByb3dbal0gPSBwaXhlbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTsKKyAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCAmIE9MRF9QSVhFTF9NQVNLKSA8PCAxIHwgKGogKyAzIDwgd2lkdGggPyByb3cyW2ogKyAzXSA8PCAxMSA6IDApIHwgKGogKyA0IDwgd2lkdGggPyByb3cxW2ogKyA0XSA8PCA0IDogMCkgfCBwaXhlbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlQml0bWFwKG1tciwgd2lkdGgsIGhlaWdodCwgdGVtcGxhdGVJbmRleCwgcHJlZGljdGlvbiwgc2tpcCwgYXQsIGRlY29kaW5nQ29udGV4dCkgeworICAgIGlmIChtbXIpIHsKKyAgICAgIGNvbnN0IGlucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKKyAgICAgIHJldHVybiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAodGVtcGxhdGVJbmRleCA9PT0gMCAmJiAhc2tpcCAmJiAhcHJlZGljdGlvbiAmJiBhdC5sZW5ndGggPT09IDQgJiYgYXRbMF0ueCA9PT0gMyAmJiBhdFswXS55ID09PSAtMSAmJiBhdFsxXS54ID09PSAtMyAmJiBhdFsxXS55ID09PSAtMSAmJiBhdFsyXS54ID09PSAyICYmIGF0WzJdLnkgPT09IC0yICYmIGF0WzNdLnggPT09IC0yICYmIGF0WzNdLnkgPT09IC0yKSB7CisgICAgICByZXR1cm4gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgfQorCisgICAgdmFyIHVzZXNraXAgPSAhIXNraXA7CisgICAgdmFyIHRlbXBsYXRlID0gQ29kaW5nVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvbmNhdChhdCk7CisgICAgdGVtcGxhdGUuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgcmV0dXJuIGEueSAtIGIueSB8fCBhLnggLSBiLng7CisgICAgfSk7CisgICAgdmFyIHRlbXBsYXRlTGVuZ3RoID0gdGVtcGxhdGUubGVuZ3RoOworICAgIHZhciB0ZW1wbGF0ZVggPSBuZXcgSW50OEFycmF5KHRlbXBsYXRlTGVuZ3RoKTsKKyAgICB2YXIgdGVtcGxhdGVZID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CisgICAgdmFyIGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzID0gW107CisgICAgdmFyIHJldXNlTWFzayA9IDAsCisgICAgICAgIG1pblggPSAwLAorICAgICAgICBtYXhYID0gMCwKKyAgICAgICAgbWluWSA9IDA7CisgICAgdmFyIGMsIGs7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgdGVtcGxhdGVYW2tdID0gdGVtcGxhdGVba10ueDsKKyAgICAgIHRlbXBsYXRlWVtrXSA9IHRlbXBsYXRlW2tdLnk7CisgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgdGVtcGxhdGVba10ueCk7CisgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgdGVtcGxhdGVba10ueCk7CisgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgdGVtcGxhdGVba10ueSk7CisKKyAgICAgIGlmIChrIDwgdGVtcGxhdGVMZW5ndGggLSAxICYmIHRlbXBsYXRlW2tdLnkgPT09IHRlbXBsYXRlW2sgKyAxXS55ICYmIHRlbXBsYXRlW2tdLnggPT09IHRlbXBsYXRlW2sgKyAxXS54IC0gMSkgeworICAgICAgICByZXVzZU1hc2sgfD0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMucHVzaChrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMubGVuZ3RoOworICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKKyAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CisgICAgdmFyIGNoYW5naW5nVGVtcGxhdGVCaXQgPSBuZXcgVWludDE2QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKKworICAgIGZvciAoYyA9IDA7IGMgPCBjaGFuZ2luZ0VudHJpZXNMZW5ndGg7IGMrKykgeworICAgICAgayA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzW2NdOworICAgICAgY2hhbmdpbmdUZW1wbGF0ZVhbY10gPSB0ZW1wbGF0ZVtrXS54OworICAgICAgY2hhbmdpbmdUZW1wbGF0ZVlbY10gPSB0ZW1wbGF0ZVtrXS55OworICAgICAgY2hhbmdpbmdUZW1wbGF0ZUJpdFtjXSA9IDEgPDwgdGVtcGxhdGVMZW5ndGggLSAxIC0gazsKKyAgICB9CisKKyAgICB2YXIgc2JiX2xlZnQgPSAtbWluWDsKKyAgICB2YXIgc2JiX3RvcCA9IC1taW5ZOworICAgIHZhciBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7CisgICAgdmFyIHBzZXVkb1BpeGVsQ29udGV4dCA9IFJldXNlZENvbnRleHRzW3RlbXBsYXRlSW5kZXhdOworICAgIHZhciByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKTsKKyAgICB2YXIgbHRwID0gMCwKKyAgICAgICAgaiwKKyAgICAgICAgaTAsCisgICAgICAgIGowLAorICAgICAgICBjb250ZXh0TGFiZWwgPSAwLAorICAgICAgICBiaXQsCisgICAgICAgIHNoaWZ0OworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgaWYgKHByZWRpY3Rpb24pIHsKKyAgICAgICAgdmFyIHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7CisgICAgICAgIGx0cCBePSBzbHRwOworCisgICAgICAgIGlmIChsdHApIHsKKyAgICAgICAgICBiaXRtYXAucHVzaChyb3cpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHJvdyk7CisgICAgICBiaXRtYXAucHVzaChyb3cpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICBpZiAodXNlc2tpcCAmJiBza2lwW2ldW2pdKSB7CisgICAgICAgICAgcm93W2pdID0gMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqID49IHNiYl9sZWZ0ICYmIGogPCBzYmJfcmlnaHQgJiYgaSA+PSBzYmJfdG9wKSB7CisgICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgJiByZXVzZU1hc2s7CisKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIGkwID0gaSArIGNoYW5naW5nVGVtcGxhdGVZW2tdOworICAgICAgICAgICAgajAgPSBqICsgY2hhbmdpbmdUZW1wbGF0ZVhba107CisgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTsKKworICAgICAgICAgICAgaWYgKGJpdCkgeworICAgICAgICAgICAgICBiaXQgPSBjaGFuZ2luZ1RlbXBsYXRlQml0W2tdOworICAgICAgICAgICAgICBjb250ZXh0TGFiZWwgfD0gYml0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSAwOworICAgICAgICAgIHNoaWZ0ID0gdGVtcGxhdGVMZW5ndGggLSAxOworCisgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyssIHNoaWZ0LS0pIHsKKyAgICAgICAgICAgIGowID0gaiArIHRlbXBsYXRlWFtrXTsKKworICAgICAgICAgICAgaWYgKGowID49IDAgJiYgajAgPCB3aWR0aCkgeworICAgICAgICAgICAgICBpMCA9IGkgKyB0ZW1wbGF0ZVlba107CisKKyAgICAgICAgICAgICAgaWYgKGkwID49IDApIHsKKyAgICAgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTsKKworICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKKyAgICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICByb3dbal0gPSBwaXhlbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlUmVmaW5lbWVudCh3aWR0aCwgaGVpZ2h0LCB0ZW1wbGF0ZUluZGV4LCByZWZlcmVuY2VCaXRtYXAsIG9mZnNldFgsIG9mZnNldFksIHByZWRpY3Rpb24sIGF0LCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICB2YXIgY29kaW5nVGVtcGxhdGUgPSBSZWZpbmVtZW50VGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvZGluZzsKKworICAgIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CisgICAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTsKKyAgICB9CisKKyAgICB2YXIgY29kaW5nVGVtcGxhdGVMZW5ndGggPSBjb2RpbmdUZW1wbGF0ZS5sZW5ndGg7CisgICAgdmFyIGNvZGluZ1RlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTsKKyAgICB2YXIgY29kaW5nVGVtcGxhdGVZID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOworICAgIHZhciBrOworCisgICAgZm9yIChrID0gMDsgayA8IGNvZGluZ1RlbXBsYXRlTGVuZ3RoOyBrKyspIHsKKyAgICAgIGNvZGluZ1RlbXBsYXRlWFtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLng7CisgICAgICBjb2RpbmdUZW1wbGF0ZVlba10gPSBjb2RpbmdUZW1wbGF0ZVtrXS55OworICAgIH0KKworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0ucmVmZXJlbmNlOworCisgICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHsKKyAgICAgIHJlZmVyZW5jZVRlbXBsYXRlID0gcmVmZXJlbmNlVGVtcGxhdGUuY29uY2F0KFthdFsxXV0pOworICAgIH0KKworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCA9IHJlZmVyZW5jZVRlbXBsYXRlLmxlbmd0aDsKKyAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpOworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZVkgPSBuZXcgSW50MzJBcnJheShyZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCk7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgcmVmZXJlbmNlVGVtcGxhdGVYW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueDsKKyAgICAgIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLnk7CisgICAgfQorCisgICAgdmFyIHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDsKKyAgICB2YXIgcmVmZXJlbmNlSGVpZ2h0ID0gcmVmZXJlbmNlQml0bWFwLmxlbmd0aDsKKyAgICB2YXIgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmVmaW5lbWVudFJldXNlZENvbnRleHRzW3RlbXBsYXRlSW5kZXhdOworICAgIHZhciBiaXRtYXAgPSBbXTsKKyAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOworICAgIHZhciBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdSIik7CisgICAgdmFyIGx0cCA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBpZiAocHJlZGljdGlvbikgeworICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKKyAgICAgICAgbHRwIF49IHNsdHA7CisKKyAgICAgICAgaWYgKGx0cCkgeworICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJwcmVkaWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgYml0bWFwLnB1c2gocm93KTsKKworICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIHZhciBpMCwgajA7CisgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSAwOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb2RpbmdUZW1wbGF0ZUxlbmd0aDsgaysrKSB7CisgICAgICAgICAgaTAgPSBpICsgY29kaW5nVGVtcGxhdGVZW2tdOworICAgICAgICAgIGowID0gaiArIGNvZGluZ1RlbXBsYXRlWFtrXTsKKworICAgICAgICAgIGlmIChpMCA8IDAgfHwgajAgPCAwIHx8IGowID49IHdpZHRoKSB7CisgICAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxIHwgYml0bWFwW2kwXVtqMF07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICBpMCA9IGkgKyByZWZlcmVuY2VUZW1wbGF0ZVlba10gLSBvZmZzZXRZOworICAgICAgICAgIGowID0gaiArIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSAtIG9mZnNldFg7CisKKyAgICAgICAgICBpZiAoaTAgPCAwIHx8IGkwID49IHJlZmVyZW5jZUhlaWdodCB8fCBqMCA8IDAgfHwgajAgPj0gcmVmZXJlbmNlV2lkdGgpIHsKKyAgICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCByZWZlcmVuY2VCaXRtYXBbaTBdW2owXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgIHJvd1tqXSA9IHBpeGVsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGh1ZmZtYW4sIHJlZmluZW1lbnQsIHN5bWJvbHMsIG51bWJlck9mTmV3U3ltYm9scywgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIHRlbXBsYXRlSW5kZXgsIGF0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGh1ZmZtYW5JbnB1dCkgeworICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIHZhciBuZXdTeW1ib2xzID0gW107CisgICAgdmFyIGN1cnJlbnRIZWlnaHQgPSAwOworICAgIHZhciBzeW1ib2xDb2RlTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzKTsKKyAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOworICAgIHZhciBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOworICAgIGxldCB0YWJsZUIxLCBzeW1ib2xXaWR0aHM7CisKKyAgICBpZiAoaHVmZm1hbikgeworICAgICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CisgICAgICBzeW1ib2xXaWR0aHMgPSBbXTsKKyAgICAgIHN5bWJvbENvZGVMZW5ndGggPSBNYXRoLm1heChzeW1ib2xDb2RlTGVuZ3RoLCAxKTsKKyAgICB9CisKKyAgICB3aGlsZSAobmV3U3ltYm9scy5sZW5ndGggPCBudW1iZXJPZk5ld1N5bWJvbHMpIHsKKyAgICAgIHZhciBkZWx0YUhlaWdodCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFIZWlnaHQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBREgiLCBkZWNvZGVyKTsKKyAgICAgIGN1cnJlbnRIZWlnaHQgKz0gZGVsdGFIZWlnaHQ7CisgICAgICBsZXQgY3VycmVudFdpZHRoID0gMCwKKyAgICAgICAgICB0b3RhbFdpZHRoID0gMDsKKyAgICAgIGNvbnN0IGZpcnN0U3ltYm9sID0gaHVmZm1hbiA/IHN5bWJvbFdpZHRocy5sZW5ndGggOiAwOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgZGVsdGFXaWR0aCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFXaWR0aC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVyIsIGRlY29kZXIpOworCisgICAgICAgIGlmIChkZWx0YVdpZHRoID09PSBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDsKKyAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7CisgICAgICAgIHZhciBiaXRtYXA7CisKKyAgICAgICAgaWYgKHJlZmluZW1lbnQpIHsKKyAgICAgICAgICB2YXIgbnVtYmVyT2ZJbnN0YW5jZXMgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBQUkiLCBkZWNvZGVyKTsKKworICAgICAgICAgIGlmIChudW1iZXJPZkluc3RhbmNlcyA+IDEpIHsKKyAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24oaHVmZm1hbiwgcmVmaW5lbWVudCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCAwLCBudW1iZXJPZkluc3RhbmNlcywgMSwgc3ltYm9scy5jb25jYXQobmV3U3ltYm9scyksIHN5bWJvbENvZGVMZW5ndGgsIDAsIDAsIDEsIDAsIGh1ZmZtYW5UYWJsZXMsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgMCwgaHVmZm1hbklucHV0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFyIHN5bWJvbElkID0gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpOworICAgICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFgiLCBkZWNvZGVyKTsKKyAgICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRZIiwgZGVjb2Rlcik7CisgICAgICAgICAgICB2YXIgc3ltYm9sID0gc3ltYm9sSWQgPCBzeW1ib2xzLmxlbmd0aCA/IHN5bWJvbHNbc3ltYm9sSWRdIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTsKKyAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgc3ltYm9sLCByZHgsIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTsKKyAgICAgICAgfSBlbHNlIGlmIChodWZmbWFuKSB7CisgICAgICAgICAgc3ltYm9sV2lkdGhzLnB1c2goY3VycmVudFdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgdGVtcGxhdGVJbmRleCwgZmFsc2UsIG51bGwsIGF0LCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChiaXRtYXApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChodWZmbWFuICYmICFyZWZpbmVtZW50KSB7CisgICAgICAgIGNvbnN0IGJpdG1hcFNpemUgPSBodWZmbWFuVGFibGVzLnRhYmxlQml0bWFwU2l6ZS5kZWNvZGUoaHVmZm1hbklucHV0KTsKKyAgICAgICAgaHVmZm1hbklucHV0LmJ5dGVBbGlnbigpOworICAgICAgICBsZXQgY29sbGVjdGl2ZUJpdG1hcDsKKworICAgICAgICBpZiAoYml0bWFwU2l6ZSA9PT0gMCkgeworICAgICAgICAgIGNvbGxlY3RpdmVCaXRtYXAgPSByZWFkVW5jb21wcmVzc2VkQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kOworICAgICAgICAgIGNvbnN0IGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7CisgICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDsKKyAgICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCwgZmFsc2UpOworICAgICAgICAgIGh1ZmZtYW5JbnB1dC5lbmQgPSBvcmlnaW5hbEVuZDsKKyAgICAgICAgICBodWZmbWFuSW5wdXQucG9zaXRpb24gPSBiaXRtYXBFbmQ7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkID0gc3ltYm9sV2lkdGhzLmxlbmd0aDsKKworICAgICAgICBpZiAoZmlyc3RTeW1ib2wgPT09IG51bWJlck9mU3ltYm9sc0RlY29kZWQgLSAxKSB7CisgICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGNvbGxlY3RpdmVCaXRtYXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxldCBpLAorICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICB4TWluID0gMCwKKyAgICAgICAgICAgICAgeE1heCwKKyAgICAgICAgICAgICAgYml0bWFwV2lkdGgsCisgICAgICAgICAgICAgIHN5bWJvbEJpdG1hcDsKKworICAgICAgICAgIGZvciAoaSA9IGZpcnN0U3ltYm9sOyBpIDwgbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZDsgaSsrKSB7CisgICAgICAgICAgICBiaXRtYXBXaWR0aCA9IHN5bWJvbFdpZHRoc1tpXTsKKyAgICAgICAgICAgIHhNYXggPSB4TWluICsgYml0bWFwV2lkdGg7CisgICAgICAgICAgICBzeW1ib2xCaXRtYXAgPSBbXTsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV3U3ltYm9scy5wdXNoKHN5bWJvbEJpdG1hcCk7CisgICAgICAgICAgICB4TWluID0geE1heDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZXhwb3J0ZWRTeW1ib2xzID0gW107CisgICAgdmFyIGZsYWdzID0gW10sCisgICAgICAgIGN1cnJlbnRGbGFnID0gZmFsc2U7CisgICAgdmFyIHRvdGFsU3ltYm9sc0xlbmd0aCA9IHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzOworCisgICAgd2hpbGUgKGZsYWdzLmxlbmd0aCA8IHRvdGFsU3ltYm9sc0xlbmd0aCkgeworICAgICAgdmFyIHJ1bkxlbmd0aCA9IGh1ZmZtYW4gPyB0YWJsZUIxLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUVYIiwgZGVjb2Rlcik7CisKKyAgICAgIHdoaWxlIChydW5MZW5ndGgtLSkgeworICAgICAgICBmbGFncy5wdXNoKGN1cnJlbnRGbGFnKTsKKyAgICAgIH0KKworICAgICAgY3VycmVudEZsYWcgPSAhY3VycmVudEZsYWc7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3ltYm9scy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBpZiAoZmxhZ3NbaV0pIHsKKyAgICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2goc3ltYm9sc1tpXSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1iZXJPZk5ld1N5bWJvbHM7IGkrKywgaisrKSB7CisgICAgICBpZiAoZmxhZ3NbaV0pIHsKKyAgICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2gobmV3U3ltYm9sc1tqXSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGV4cG9ydGVkU3ltYm9sczsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVRleHRSZWdpb24oaHVmZm1hbiwgcmVmaW5lbWVudCwgd2lkdGgsIGhlaWdodCwgZGVmYXVsdFBpeGVsVmFsdWUsIG51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCBzdHJpcFNpemUsIGlucHV0U3ltYm9scywgc3ltYm9sQ29kZUxlbmd0aCwgdHJhbnNwb3NlZCwgZHNPZmZzZXQsIHJlZmVyZW5jZUNvcm5lciwgY29tYmluYXRpb25PcGVyYXRvciwgaHVmZm1hblRhYmxlcywgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBsb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCkgeworICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBpLCByb3c7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKworICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgIHJvd1tqXSA9IGRlZmF1bHRQaXhlbFZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisgICAgfQorCisgICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKKyAgICB2YXIgY29udGV4dENhY2hlID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZTsKKyAgICB2YXIgc3RyaXBUID0gaHVmZm1hbiA/IC1odWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpIDogLWRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVCIsIGRlY29kZXIpOworICAgIHZhciBmaXJzdFMgPSAwOworICAgIGkgPSAwOworCisgICAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykgeworICAgICAgdmFyIGRlbHRhVCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURUIiwgZGVjb2Rlcik7CisgICAgICBzdHJpcFQgKz0gZGVsdGFUOworICAgICAgdmFyIGRlbHRhRmlyc3RTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVGaXJzdFMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRlMiLCBkZWNvZGVyKTsKKyAgICAgIGZpcnN0UyArPSBkZWx0YUZpcnN0UzsKKyAgICAgIHZhciBjdXJyZW50UyA9IGZpcnN0UzsKKworICAgICAgZG8geworICAgICAgICBsZXQgY3VycmVudFQgPSAwOworCisgICAgICAgIGlmIChzdHJpcFNpemUgPiAxKSB7CisgICAgICAgICAgY3VycmVudFQgPSBodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBSVQiLCBkZWNvZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0ID0gc3RyaXBTaXplICogc3RyaXBUICsgY3VycmVudFQ7CisgICAgICAgIHZhciBzeW1ib2xJZCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnN5bWJvbElEVGFibGUuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2Rlciwgc3ltYm9sQ29kZUxlbmd0aCk7CisgICAgICAgIHZhciBhcHBseVJlZmluZW1lbnQgPSByZWZpbmVtZW50ICYmIChodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXQoKSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSSSIsIGRlY29kZXIpKTsKKyAgICAgICAgdmFyIHN5bWJvbEJpdG1hcCA9IGlucHV0U3ltYm9sc1tzeW1ib2xJZF07CisgICAgICAgIHZhciBzeW1ib2xXaWR0aCA9IHN5bWJvbEJpdG1hcFswXS5sZW5ndGg7CisgICAgICAgIHZhciBzeW1ib2xIZWlnaHQgPSBzeW1ib2xCaXRtYXAubGVuZ3RoOworCisgICAgICAgIGlmIChhcHBseVJlZmluZW1lbnQpIHsKKyAgICAgICAgICB2YXIgcmR3ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEVyIsIGRlY29kZXIpOworICAgICAgICAgIHZhciByZGggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRIIiwgZGVjb2Rlcik7CisgICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFgiLCBkZWNvZGVyKTsKKyAgICAgICAgICB2YXIgcmR5ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWSIsIGRlY29kZXIpOworICAgICAgICAgIHN5bWJvbFdpZHRoICs9IHJkdzsKKyAgICAgICAgICBzeW1ib2xIZWlnaHQgKz0gcmRoOworICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoc3ltYm9sV2lkdGgsIHN5bWJvbEhlaWdodCwgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHN5bWJvbEJpdG1hcCwgKHJkdyA+PiAxKSArIHJkeCwgKHJkaCA+PiAxKSArIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpOworICAgICAgICB2YXIgb2Zmc2V0UyA9IGN1cnJlbnRTIC0gKHJlZmVyZW5jZUNvcm5lciAmIDIgPyBzeW1ib2xXaWR0aCAtIDEgOiAwKTsKKyAgICAgICAgdmFyIHMyLCB0Miwgc3ltYm9sUm93OworCisgICAgICAgIGlmICh0cmFuc3Bvc2VkKSB7CisgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sSGVpZ2h0OyBzMisrKSB7CisgICAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0UyArIHMyXTsKKworICAgICAgICAgICAgaWYgKCFyb3cpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFtzMl07CisgICAgICAgICAgICB2YXIgbWF4V2lkdGggPSBNYXRoLm1pbih3aWR0aCAtIG9mZnNldFQsIHN5bWJvbFdpZHRoKTsKKworICAgICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykgeworICAgICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gfD0gc3ltYm9sUm93W3QyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHsKKyAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIF49IHN5bWJvbFJvd1t0Ml07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudFMgKz0gc3ltYm9sSGVpZ2h0IC0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBzeW1ib2xIZWlnaHQ7IHQyKyspIHsKKyAgICAgICAgICAgIHJvdyA9IGJpdG1hcFtvZmZzZXRUICsgdDJdOworCisgICAgICAgICAgICBpZiAoIXJvdykgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3QyXTsKKworICAgICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xXaWR0aDsgczIrKykgeworICAgICAgICAgICAgICAgICAgcm93W29mZnNldFMgKyBzMl0gfD0gc3ltYm9sUm93W3MyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sV2lkdGg7IHMyKyspIHsKKyAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRTICsgczJdIF49IHN5bWJvbFJvd1tzMl07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudFMgKz0gc3ltYm9sV2lkdGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgaSsrOworICAgICAgICB2YXIgZGVsdGFTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFMiLCBkZWNvZGVyKTsKKworICAgICAgICBpZiAoZGVsdGFTID09PSBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50UyArPSBkZWx0YVMgKyBkc09mZnNldDsKKyAgICAgIH0gd2hpbGUgKHRydWUpOworICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShtbXIsIHBhdHRlcm5XaWR0aCwgcGF0dGVybkhlaWdodCwgbWF4UGF0dGVybkluZGV4LCB0ZW1wbGF0ZSwgZGVjb2RpbmdDb250ZXh0KSB7CisgICAgY29uc3QgYXQgPSBbXTsKKworICAgIGlmICghbW1yKSB7CisgICAgICBhdC5wdXNoKHsKKyAgICAgICAgeDogLXBhdHRlcm5XaWR0aCwKKyAgICAgICAgeTogMAorICAgICAgfSk7CisKKyAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gMCkgeworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAtMywKKyAgICAgICAgICB5OiAtMQorICAgICAgICB9KTsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogMiwKKyAgICAgICAgICB5OiAtMgorICAgICAgICB9KTsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogLTIsCisgICAgICAgICAgeTogLTIKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgY29sbGVjdGl2ZVdpZHRoID0gKG1heFBhdHRlcm5JbmRleCArIDEpICogcGF0dGVybldpZHRoOworICAgIGNvbnN0IGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVCaXRtYXAobW1yLCBjb2xsZWN0aXZlV2lkdGgsIHBhdHRlcm5IZWlnaHQsIHRlbXBsYXRlLCBmYWxzZSwgbnVsbCwgYXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgY29uc3QgcGF0dGVybnMgPSBbXTsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1heFBhdHRlcm5JbmRleDsgaSsrKSB7CisgICAgICBjb25zdCBwYXR0ZXJuQml0bWFwID0gW107CisgICAgICBjb25zdCB4TWluID0gcGF0dGVybldpZHRoICogaTsKKyAgICAgIGNvbnN0IHhNYXggPSB4TWluICsgcGF0dGVybldpZHRoOworCisgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHBhdHRlcm5IZWlnaHQ7IHkrKykgeworICAgICAgICBwYXR0ZXJuQml0bWFwLnB1c2goY29sbGVjdGl2ZUJpdG1hcFt5XS5zdWJhcnJheSh4TWluLCB4TWF4KSk7CisgICAgICB9CisKKyAgICAgIHBhdHRlcm5zLnB1c2gocGF0dGVybkJpdG1hcCk7CisgICAgfQorCisgICAgcmV0dXJuIHBhdHRlcm5zOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24obW1yLCBwYXR0ZXJucywgdGVtcGxhdGUsIHJlZ2lvbldpZHRoLCByZWdpb25IZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBlbmFibGVTa2lwLCBjb21iaW5hdGlvbk9wZXJhdG9yLCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIGdyaWRPZmZzZXRYLCBncmlkT2Zmc2V0WSwgZ3JpZFZlY3RvclgsIGdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICBjb25zdCBza2lwID0gbnVsbDsKKworICAgIGlmIChlbmFibGVTa2lwKSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigic2tpcCBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgaWYgKGNvbWJpbmF0aW9uT3BlcmF0b3IgIT09IDApIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJvcGVyYXRvciAiICsgY29tYmluYXRpb25PcGVyYXRvciArICIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb24iKTsKKyAgICB9CisKKyAgICBjb25zdCByZWdpb25CaXRtYXAgPSBbXTsKKyAgICBsZXQgaSwgaiwgcm93OworCisgICAgZm9yIChpID0gMDsgaSA8IHJlZ2lvbkhlaWdodDsgaSsrKSB7CisgICAgICByb3cgPSBuZXcgVWludDhBcnJheShyZWdpb25XaWR0aCk7CisKKyAgICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVnaW9uV2lkdGg7IGorKykgeworICAgICAgICAgIHJvd1tqXSA9IGRlZmF1bHRQaXhlbFZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7CisgICAgfQorCisgICAgY29uc3QgbnVtYmVyT2ZQYXR0ZXJucyA9IHBhdHRlcm5zLmxlbmd0aDsKKyAgICBjb25zdCBwYXR0ZXJuMCA9IHBhdHRlcm5zWzBdOworICAgIGNvbnN0IHBhdHRlcm5XaWR0aCA9IHBhdHRlcm4wWzBdLmxlbmd0aCwKKyAgICAgICAgICBwYXR0ZXJuSGVpZ2h0ID0gcGF0dGVybjAubGVuZ3RoOworICAgIGNvbnN0IGJpdHNQZXJWYWx1ZSA9ICgwLCBfY29yZV91dGlscy5sb2cyKShudW1iZXJPZlBhdHRlcm5zKTsKKyAgICBjb25zdCBhdCA9IFtdOworCisgICAgaWYgKCFtbXIpIHsKKyAgICAgIGF0LnB1c2goeworICAgICAgICB4OiB0ZW1wbGF0ZSA8PSAxID8gMyA6IDIsCisgICAgICAgIHk6IC0xCisgICAgICB9KTsKKworICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IC0zLAorICAgICAgICAgIHk6IC0xCisgICAgICAgIH0pOworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAyLAorICAgICAgICAgIHk6IC0yCisgICAgICAgIH0pOworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAtMiwKKyAgICAgICAgICB5OiAtMgorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBncmF5U2NhbGVCaXRQbGFuZXMgPSBbXTsKKyAgICBsZXQgbW1ySW5wdXQsIGJpdG1hcDsKKworICAgIGlmIChtbXIpIHsKKyAgICAgIG1tcklucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBiaXRzUGVyVmFsdWUgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgaWYgKG1tcikgeworICAgICAgICBiaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAobW1ySW5wdXQsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgZ3JheVNjYWxlQml0UGxhbmVzW2ldID0gYml0bWFwOworICAgIH0KKworICAgIGxldCBtZywgbmcsIGJpdCwgcGF0dGVybkluZGV4LCBwYXR0ZXJuQml0bWFwLCB4LCB5LCBwYXR0ZXJuUm93LCByZWdpb25Sb3c7CisKKyAgICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7CisgICAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHsKKyAgICAgICAgYml0ID0gMDsKKyAgICAgICAgcGF0dGVybkluZGV4ID0gMDsKKworICAgICAgICBmb3IgKGogPSBiaXRzUGVyVmFsdWUgLSAxOyBqID49IDA7IGotLSkgeworICAgICAgICAgIGJpdCA9IGdyYXlTY2FsZUJpdFBsYW5lc1tqXVttZ11bbmddIF4gYml0OworICAgICAgICAgIHBhdHRlcm5JbmRleCB8PSBiaXQgPDwgajsKKyAgICAgICAgfQorCisgICAgICAgIHBhdHRlcm5CaXRtYXAgPSBwYXR0ZXJuc1twYXR0ZXJuSW5kZXhdOworICAgICAgICB4ID0gZ3JpZE9mZnNldFggKyBtZyAqIGdyaWRWZWN0b3JZICsgbmcgKiBncmlkVmVjdG9yWCA+PiA4OworICAgICAgICB5ID0gZ3JpZE9mZnNldFkgKyBtZyAqIGdyaWRWZWN0b3JYIC0gbmcgKiBncmlkVmVjdG9yWSA+PiA4OworCisgICAgICAgIGlmICh4ID49IDAgJiYgeCArIHBhdHRlcm5XaWR0aCA8PSByZWdpb25XaWR0aCAmJiB5ID49IDAgJiYgeSArIHBhdHRlcm5IZWlnaHQgPD0gcmVnaW9uSGVpZ2h0KSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdHRlcm5IZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgcmVnaW9uUm93ID0gcmVnaW9uQml0bWFwW3kgKyBpXTsKKyAgICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0dGVybldpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgcmVnaW9uUm93W3ggKyBqXSB8PSBwYXR0ZXJuUm93W2pdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsZXQgcmVnaW9uWCwgcmVnaW9uWTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTsKKworICAgICAgICAgICAgaWYgKHJlZ2lvblkgPCAwIHx8IHJlZ2lvblkgPj0gcmVnaW9uSGVpZ2h0KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWdpb25Sb3cgPSByZWdpb25CaXRtYXBbcmVnaW9uWV07CisgICAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CisgICAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajsKKworICAgICAgICAgICAgICBpZiAocmVnaW9uWCA+PSAwICYmIHJlZ2lvblggPCByZWdpb25XaWR0aCkgeworICAgICAgICAgICAgICAgIHJlZ2lvblJvd1tyZWdpb25YXSB8PSBwYXR0ZXJuUm93W2pdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlZ2lvbkJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHN0YXJ0KSB7CisgICAgdmFyIHNlZ21lbnRIZWFkZXIgPSB7fTsKKyAgICBzZWdtZW50SGVhZGVyLm51bWJlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCk7CisgICAgdmFyIGZsYWdzID0gZGF0YVtzdGFydCArIDRdOworICAgIHZhciBzZWdtZW50VHlwZSA9IGZsYWdzICYgMHgzZjsKKworICAgIGlmICghU2VnbWVudFR5cGVzW3NlZ21lbnRUeXBlXSkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgc2VnbWVudCB0eXBlOiAiICsgc2VnbWVudFR5cGUpOworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIudHlwZSA9IHNlZ21lbnRUeXBlOworICAgIHNlZ21lbnRIZWFkZXIudHlwZU5hbWUgPSBTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdOworICAgIHNlZ21lbnRIZWFkZXIuZGVmZXJyZWROb25SZXRhaW4gPSAhIShmbGFncyAmIDB4ODApOworICAgIHZhciBwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUgPSAhIShmbGFncyAmIDB4NDApOworICAgIHZhciByZWZlcnJlZEZsYWdzID0gZGF0YVtzdGFydCArIDVdOworICAgIHZhciByZWZlcnJlZFRvQ291bnQgPSByZWZlcnJlZEZsYWdzID4+IDUgJiA3OworICAgIHZhciByZXRhaW5CaXRzID0gW3JlZmVycmVkRmxhZ3MgJiAzMV07CisgICAgdmFyIHBvc2l0aW9uID0gc3RhcnQgKyA2OworCisgICAgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDcpIHsKKyAgICAgIHJlZmVycmVkVG9Db3VudCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiAtIDEpICYgMHgxZmZmZmZmZjsKKyAgICAgIHBvc2l0aW9uICs9IDM7CisgICAgICB2YXIgYnl0ZXMgPSByZWZlcnJlZFRvQ291bnQgKyA3ID4+IDM7CisgICAgICByZXRhaW5CaXRzWzBdID0gZGF0YVtwb3NpdGlvbisrXTsKKworICAgICAgd2hpbGUgKC0tYnl0ZXMgPiAwKSB7CisgICAgICAgIHJldGFpbkJpdHMucHVzaChkYXRhW3Bvc2l0aW9uKytdKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDUgfHwgcmVmZXJyZWRGbGFncyA9PT0gNikgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgcmVmZXJyZWQtdG8gZmxhZ3MiKTsKKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLnJldGFpbkJpdHMgPSByZXRhaW5CaXRzOworICAgIGxldCByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSA0OworCisgICAgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDI1NikgeworICAgICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMTsKKyAgICB9IGVsc2UgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDY1NTM2KSB7CisgICAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAyOworICAgIH0KKworICAgIHZhciByZWZlcnJlZFRvID0gW107CisgICAgdmFyIGksIGlpOworCisgICAgZm9yIChpID0gMDsgaSA8IHJlZmVycmVkVG9Db3VudDsgaSsrKSB7CisgICAgICBsZXQgbnVtYmVyOworCisgICAgICBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAxKSB7CisgICAgICAgIG51bWJlciA9IGRhdGFbcG9zaXRpb25dOworICAgICAgfSBlbHNlIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDIpIHsKKyAgICAgICAgbnVtYmVyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG51bWJlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICB9CisKKyAgICAgIHJlZmVycmVkVG8ucHVzaChudW1iZXIpOworICAgICAgcG9zaXRpb24gKz0gcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplOworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIucmVmZXJyZWRUbyA9IHJlZmVycmVkVG87CisKKyAgICBpZiAoIXBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSkgeworICAgICAgc2VnbWVudEhlYWRlci5wYWdlQXNzb2NpYXRpb24gPSBkYXRhW3Bvc2l0aW9uKytdOworICAgIH0gZWxzZSB7CisgICAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICBwb3NpdGlvbiArPSA0OworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICBwb3NpdGlvbiArPSA0OworCisgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CisgICAgICBpZiAoc2VnbWVudFR5cGUgPT09IDM4KSB7CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uSW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aF07CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uTW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpOworICAgICAgICB2YXIgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7CisgICAgICAgIHZhciBzZWFyY2hQYXR0ZXJuID0gbmV3IFVpbnQ4QXJyYXkoc2VhcmNoUGF0dGVybkxlbmd0aCk7CisKKyAgICAgICAgaWYgKCFnZW5lcmljUmVnaW9uTW1yKSB7CisgICAgICAgICAgc2VhcmNoUGF0dGVyblswXSA9IDB4ZmY7CisgICAgICAgICAgc2VhcmNoUGF0dGVyblsxXSA9IDB4YWM7CisgICAgICAgIH0KKworICAgICAgICBzZWFyY2hQYXR0ZXJuWzJdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+PiAyNCAmIDB4ZmY7CisgICAgICAgIHNlYXJjaFBhdHRlcm5bM10gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgPj4gMTYgJiAweGZmOworICAgICAgICBzZWFyY2hQYXR0ZXJuWzRdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDggJiAweGZmOworICAgICAgICBzZWFyY2hQYXR0ZXJuWzVdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ICYgMHhmZjsKKworICAgICAgICBmb3IgKGkgPSBwb3NpdGlvbiwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICB2YXIgaiA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoaiA8IHNlYXJjaFBhdHRlcm5MZW5ndGggJiYgc2VhcmNoUGF0dGVybltqXSA9PT0gZGF0YVtpICsgal0pIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaiA9PT0gc2VhcmNoUGF0dGVybkxlbmd0aCkgeworICAgICAgICAgICAgc2VnbWVudEhlYWRlci5sZW5ndGggPSBpICsgc2VhcmNoUGF0dGVybkxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikgeworICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzZWdtZW50IGVuZCB3YXMgbm90IGZvdW5kIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGgiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLmhlYWRlckVuZCA9IHBvc2l0aW9uOworICAgIHJldHVybiBzZWdtZW50SGVhZGVyOworICB9CisKKyAgZnVuY3Rpb24gcmVhZFNlZ21lbnRzKGhlYWRlciwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHZhciBzZWdtZW50cyA9IFtdOworICAgIHZhciBwb3NpdGlvbiA9IHN0YXJ0OworCisgICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7CisgICAgICB2YXIgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7CisgICAgICB2YXIgc2VnbWVudCA9IHsKKyAgICAgICAgaGVhZGVyOiBzZWdtZW50SGVhZGVyLAorICAgICAgICBkYXRhCisgICAgICB9OworCisgICAgICBpZiAoIWhlYWRlci5yYW5kb21BY2Nlc3MpIHsKKyAgICAgICAgc2VnbWVudC5zdGFydCA9IHBvc2l0aW9uOworICAgICAgICBwb3NpdGlvbiArPSBzZWdtZW50SGVhZGVyLmxlbmd0aDsKKyAgICAgICAgc2VnbWVudC5lbmQgPSBwb3NpdGlvbjsKKyAgICAgIH0KKworICAgICAgc2VnbWVudHMucHVzaChzZWdtZW50KTsKKworICAgICAgaWYgKHNlZ21lbnRIZWFkZXIudHlwZSA9PT0gNTEpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhlYWRlci5yYW5kb21BY2Nlc3MpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgc2VnbWVudHNbaV0uc3RhcnQgPSBwb3NpdGlvbjsKKyAgICAgICAgcG9zaXRpb24gKz0gc2VnbWVudHNbaV0uaGVhZGVyLmxlbmd0aDsKKyAgICAgICAgc2VnbWVudHNbaV0uZW5kID0gcG9zaXRpb247CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNlZ21lbnRzOworICB9CisKKyAgZnVuY3Rpb24gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBzdGFydCkgeworICAgIHJldHVybiB7CisgICAgICB3aWR0aDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0KSwKKyAgICAgIGhlaWdodDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgNCksCisgICAgICB4OiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyA4KSwKKyAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDEyKSwKKyAgICAgIGNvbWJpbmF0aW9uT3BlcmF0b3I6IGRhdGFbc3RhcnQgKyAxNl0gJiA3CisgICAgfTsKKyAgfQorCisgIHZhciBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3OworCisgIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHNlZ21lbnQsIHZpc2l0b3IpIHsKKyAgICB2YXIgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7CisgICAgdmFyIGRhdGEgPSBzZWdtZW50LmRhdGEsCisgICAgICAgIHBvc2l0aW9uID0gc2VnbWVudC5zdGFydCwKKyAgICAgICAgZW5kID0gc2VnbWVudC5lbmQ7CisgICAgdmFyIGFyZ3MsIGF0LCBpLCBhdExlbmd0aDsKKworICAgIHN3aXRjaCAoaGVhZGVyLnR5cGUpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdmFyIGRpY3Rpb25hcnkgPSB7fTsKKyAgICAgICAgdmFyIGRpY3Rpb25hcnlGbGFncyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpOworICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTsKKyAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiAyICYgMzsKKyAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA0ICYgMzsKKyAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNiAmIDE7CisgICAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA3ICYgMTsKKyAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDI1Nik7CisgICAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkID0gISEoZGljdGlvbmFyeUZsYWdzICYgNTEyKTsKKyAgICAgICAgZGljdGlvbmFyeS50ZW1wbGF0ZSA9IGRpY3Rpb25hcnlGbGFncyA+PiAxMCAmIDM7CisgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlID0gZGljdGlvbmFyeUZsYWdzID4+IDEyICYgMTsKKyAgICAgICAgcG9zaXRpb24gKz0gMjsKKworICAgICAgICBpZiAoIWRpY3Rpb25hcnkuaHVmZm1hbikgeworICAgICAgICAgIGF0TGVuZ3RoID0gZGljdGlvbmFyeS50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBkaWN0aW9uYXJ5LmF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGljdGlvbmFyeS5yZWZpbmVtZW50ICYmICFkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSkgeworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudEF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBhcmdzID0gW2RpY3Rpb25hcnksIGhlYWRlci5udW1iZXIsIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNjoKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgdmFyIHRleHRSZWdpb24gPSB7fTsKKyAgICAgICAgdGV4dFJlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoOworICAgICAgICB2YXIgdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbiA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKKyAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50ID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDIpOworICAgICAgICB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMiAmIDM7CisgICAgICAgIHRleHRSZWdpb24uc3RyaXBTaXplID0gMSA8PCB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZTsKKyAgICAgICAgdGV4dFJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDQgJiAzOworICAgICAgICB0ZXh0UmVnaW9uLnRyYW5zcG9zZWQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgNjQpOworICAgICAgICB0ZXh0UmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDcgJiAzOworICAgICAgICB0ZXh0UmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA5ICYgMTsKKyAgICAgICAgdGV4dFJlZ2lvbi5kc09mZnNldCA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPDwgMTcgPj4gMjc7CisgICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiAxNSAmIDE7CisKKyAgICAgICAgaWYgKHRleHRSZWdpb24uaHVmZm1hbikgeworICAgICAgICAgIHZhciB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkZTID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFMgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDIgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRUID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA0ICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFcgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDYgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRESCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gOCAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERYID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMCAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERZID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMiAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudFNpemVTZWxlY3RvciA9ICEhKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAweDQwMDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCAmJiAhdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUpIHsKKyAgICAgICAgICBhdCA9IFtdOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRBdCA9IGF0OworICAgICAgICB9CisKKyAgICAgICAgdGV4dFJlZ2lvbi5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGFyZ3MgPSBbdGV4dFJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxNjoKKyAgICAgICAgY29uc3QgcGF0dGVybkRpY3Rpb25hcnkgPSB7fTsKKyAgICAgICAgY29uc3QgcGF0dGVybkRpY3Rpb25hcnlGbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1tciA9ICEhKHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgJiAxKTsKKyAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkudGVtcGxhdGUgPSBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID4+IDEgJiAzOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuV2lkdGggPSBkYXRhW3Bvc2l0aW9uKytdOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0ID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgYXJncyA9IFtwYXR0ZXJuRGljdGlvbmFyeSwgaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDIyOgorICAgICAgY2FzZSAyMzoKKyAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb24gPSB7fTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKKyAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb25GbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLm1tciA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiAxKTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24udGVtcGxhdGUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDEgJiAzOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5lbmFibGVTa2lwID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDgpOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiA0ICYgNzsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDcgJiAxOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkV2lkdGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkSGVpZ2h0ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFkgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFZlY3RvclggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkVmVjdG9yWSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgIGFyZ3MgPSBbaGFsZnRvbmVSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzg6CisgICAgICBjYXNlIDM5OgorICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvbiA9IHt9OworICAgICAgICBnZW5lcmljUmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgZ2VuZXJpY1JlZ2lvbi5tbXIgPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CisgICAgICAgIGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPSBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID4+IDEgJiAzOworICAgICAgICBnZW5lcmljUmVnaW9uLnByZWRpY3Rpb24gPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgOCk7CisKKyAgICAgICAgaWYgKCFnZW5lcmljUmVnaW9uLm1tcikgeworICAgICAgICAgIGF0TGVuZ3RoID0gZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnZW5lcmljUmVnaW9uLmF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICBhcmdzID0gW2dlbmVyaWNSZWdpb24sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0ODoKKyAgICAgICAgdmFyIHBhZ2VJbmZvID0geworICAgICAgICAgIHdpZHRoOiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgIGhlaWdodDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCksCisgICAgICAgICAgcmVzb2x1dGlvblg6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDgpLAorICAgICAgICAgIHJlc29sdXRpb25ZOiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAxMikKKyAgICAgICAgfTsKKworICAgICAgICBpZiAocGFnZUluZm8uaGVpZ2h0ID09PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgZGVsZXRlIHBhZ2VJbmZvLmhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwYWdlU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIDE2XTsKKyAgICAgICAgKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uICsgMTcpOworICAgICAgICBwYWdlSW5mby5sb3NzbGVzcyA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAxKTsKKyAgICAgICAgcGFnZUluZm8ucmVmaW5lbWVudCA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAyKTsKKyAgICAgICAgcGFnZUluZm8uZGVmYXVsdFBpeGVsVmFsdWUgPSBwYWdlU2VnbWVudEZsYWdzID4+IDIgJiAxOworICAgICAgICBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yID0gcGFnZVNlZ21lbnRGbGFncyA+PiAzICYgMzsKKyAgICAgICAgcGFnZUluZm8ucmVxdWlyZXNCdWZmZXIgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMzIpOworICAgICAgICBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGUgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgNjQpOworICAgICAgICBhcmdzID0gW3BhZ2VJbmZvXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDk6CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDUwOgorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA1MToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNTM6CisgICAgICAgIGFyZ3MgPSBbaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDYyOgorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYHNlZ21lbnQgdHlwZSAke2hlYWRlci50eXBlTmFtZX0oJHtoZWFkZXIudHlwZX0pYCArICIgaXMgbm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgdmFyIGNhbGxiYWNrTmFtZSA9ICJvbiIgKyBoZWFkZXIudHlwZU5hbWU7CisKKyAgICBpZiAoY2FsbGJhY2tOYW1lIGluIHZpc2l0b3IpIHsKKyAgICAgIHZpc2l0b3JbY2FsbGJhY2tOYW1lXS5hcHBseSh2aXNpdG9yLCBhcmdzKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBwcm9jZXNzU2VnbWVudChzZWdtZW50c1tpXSwgdmlzaXRvcik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpIHsKKyAgICB2YXIgdmlzaXRvciA9IG5ldyBTaW1wbGVTZWdtZW50VmlzaXRvcigpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjaHVuayA9IGNodW5rc1tpXTsKKyAgICAgIHZhciBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyh7fSwgY2h1bmsuZGF0YSwgY2h1bmsuc3RhcnQsIGNodW5rLmVuZCk7CisgICAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpOworICAgIH0KKworICAgIHJldHVybiB2aXNpdG9yLmJ1ZmZlcjsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlSmJpZzIoZGF0YSkgeworICAgIGNvbnN0IGVuZCA9IGRhdGEubGVuZ3RoOworICAgIGxldCBwb3NpdGlvbiA9IDA7CisKKyAgICBpZiAoZGF0YVtwb3NpdGlvbl0gIT09IDB4OTcgfHwgZGF0YVtwb3NpdGlvbiArIDFdICE9PSAweDRhIHx8IGRhdGFbcG9zaXRpb24gKyAyXSAhPT0gMHg0MiB8fCBkYXRhW3Bvc2l0aW9uICsgM10gIT09IDB4MzIgfHwgZGF0YVtwb3NpdGlvbiArIDRdICE9PSAweDBkIHx8IGRhdGFbcG9zaXRpb24gKyA1XSAhPT0gMHgwYSB8fCBkYXRhW3Bvc2l0aW9uICsgNl0gIT09IDB4MWEgfHwgZGF0YVtwb3NpdGlvbiArIDddICE9PSAweDBhKSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicGFyc2VKYmlnMiAtIGludmFsaWQgaGVhZGVyLiIpOworICAgIH0KKworICAgIGNvbnN0IGhlYWRlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgcG9zaXRpb24gKz0gODsKKyAgICBjb25zdCBmbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgaGVhZGVyLnJhbmRvbUFjY2VzcyA9ICEoZmxhZ3MgJiAxKTsKKworICAgIGlmICghKGZsYWdzICYgMikpIHsKKyAgICAgIGhlYWRlci5udW1iZXJPZlBhZ2VzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgfQorCisgICAgY29uc3Qgc2VnbWVudHMgPSByZWFkU2VnbWVudHMoaGVhZGVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kKTsKKyAgICBjb25zdCB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7CisgICAgcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKTsKKyAgICBjb25zdCB7CisgICAgICB3aWR0aCwKKyAgICAgIGhlaWdodAorICAgIH0gPSB2aXNpdG9yLmN1cnJlbnRQYWdlSW5mbzsKKyAgICBjb25zdCBiaXRQYWNrZWQgPSB2aXNpdG9yLmJ1ZmZlcjsKKyAgICBjb25zdCBpbWdEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTsKKyAgICBsZXQgcSA9IDAsCisgICAgICAgIGsgPSAwOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgbGV0IG1hc2sgPSAwLAorICAgICAgICAgIGJ1ZmZlcjsKKworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGlmICghbWFzaykgeworICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgYnVmZmVyID0gYml0UGFja2VkW2srK107CisgICAgICAgIH0KKworICAgICAgICBpbWdEYXRhW3ErK10gPSBidWZmZXIgJiBtYXNrID8gMCA6IDI1NTsKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgaW1nRGF0YSwKKyAgICAgIHdpZHRoLAorICAgICAgaGVpZ2h0CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yKCkge30KKworICBTaW1wbGVTZWdtZW50VmlzaXRvci5wcm90b3R5cGUgPSB7CisgICAgb25QYWdlSW5mb3JtYXRpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uUGFnZUluZm9ybWF0aW9uKGluZm8pIHsKKyAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbzsKKyAgICAgIHZhciByb3dTaXplID0gaW5mby53aWR0aCArIDcgPj4gMzsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSAqIGluZm8uaGVpZ2h0KTsKKworICAgICAgaWYgKGluZm8uZGVmYXVsdFBpeGVsVmFsdWUpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBidWZmZXJbaV0gPSAweGZmOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOworICAgIH0sCisgICAgZHJhd0JpdG1hcDogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3JfZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApIHsKKyAgICAgIHZhciBwYWdlSW5mbyA9IHRoaXMuY3VycmVudFBhZ2VJbmZvOworICAgICAgdmFyIHdpZHRoID0gcmVnaW9uSW5mby53aWR0aCwKKyAgICAgICAgICBoZWlnaHQgPSByZWdpb25JbmZvLmhlaWdodDsKKyAgICAgIHZhciByb3dTaXplID0gcGFnZUluZm8ud2lkdGggKyA3ID4+IDM7CisgICAgICB2YXIgY29tYmluYXRpb25PcGVyYXRvciA9IHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA/IHJlZ2lvbkluZm8uY29tYmluYXRpb25PcGVyYXRvciA6IHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3I7CisgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CisgICAgICB2YXIgbWFzazAgPSAxMjggPj4gKHJlZ2lvbkluZm8ueCAmIDcpOworICAgICAgdmFyIG9mZnNldDAgPSByZWdpb25JbmZvLnkgKiByb3dTaXplICsgKHJlZ2lvbkluZm8ueCA+PiAzKTsKKyAgICAgIHZhciBpLCBqLCBtYXNrLCBvZmZzZXQ7CisKKyAgICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBtYXNrID0gbWFzazA7CisgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQwOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gfD0gbWFzazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG1hc2sgPj49IDE7CisKKyAgICAgICAgICAgICAgaWYgKCFtYXNrKSB7CisgICAgICAgICAgICAgICAgbWFzayA9IDEyODsKKyAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgbWFzayA9IG1hc2swOworICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJpdG1hcFtpXVtqXSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXRdIF49IG1hc2s7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBtYXNrID4+PSAxOworCisgICAgICAgICAgICAgIGlmICghbWFzaykgeworICAgICAgICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0MCArPSByb3dTaXplOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICR7Y29tYmluYXRpb25PcGVyYXRvcn0gaXMgbm90IHN1cHBvcnRlZGApOworICAgICAgfQorICAgIH0sCisgICAgb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24ocmVnaW9uLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvOworICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICB2YXIgYml0bWFwID0gZGVjb2RlQml0bWFwKHJlZ2lvbi5tbXIsIHJlZ2lvbkluZm8ud2lkdGgsIHJlZ2lvbkluZm8uaGVpZ2h0LCByZWdpb24udGVtcGxhdGUsIHJlZ2lvbi5wcmVkaWN0aW9uLCBudWxsLCByZWdpb24uYXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbigpIHsKKyAgICAgIHRoaXMub25JbW1lZGlhdGVHZW5lcmljUmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKyAgICBvblN5bWJvbERpY3Rpb25hcnk6IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uU3ltYm9sRGljdGlvbmFyeShkaWN0aW9uYXJ5LCBjdXJyZW50U2VnbWVudCwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgbGV0IGh1ZmZtYW5UYWJsZXMsIGh1ZmZtYW5JbnB1dDsKKworICAgICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikgeworICAgICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRTZWdtZW50cywgdGhpcy5jdXN0b21UYWJsZXMpOworICAgICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgfQorCisgICAgICB2YXIgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKKworICAgICAgaWYgKCFzeW1ib2xzKSB7CisgICAgICAgIHRoaXMuc3ltYm9scyA9IHN5bWJvbHMgPSB7fTsKKyAgICAgIH0KKworICAgICAgdmFyIGlucHV0U3ltYm9scyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29uc3QgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRzW2ldXTsKKworICAgICAgICBpZiAocmVmZXJyZWRTeW1ib2xzKSB7CisgICAgICAgICAgaW5wdXRTeW1ib2xzID0gaW5wdXRTeW1ib2xzLmNvbmNhdChyZWZlcnJlZFN5bWJvbHMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgc3ltYm9sc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnkuaHVmZm1hbiwgZGljdGlvbmFyeS5yZWZpbmVtZW50LCBpbnB1dFN5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZOZXdTeW1ib2xzLCBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLCBodWZmbWFuVGFibGVzLCBkaWN0aW9uYXJ5LnRlbXBsYXRlLCBkaWN0aW9uYXJ5LmF0LCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSwgZGljdGlvbmFyeS5yZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgaHVmZm1hbklucHV0KTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlVGV4dFJlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVUZXh0UmVnaW9uKHJlZ2lvbiwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKKyAgICAgIGxldCBodWZmbWFuVGFibGVzLCBodWZmbWFuSW5wdXQ7CisgICAgICB2YXIgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKKyAgICAgIHZhciBpbnB1dFN5bWJvbHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVmZXJyZWRTZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50c1tpXV07CisKKyAgICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykgeworICAgICAgICAgIGlucHV0U3ltYm9scyA9IGlucHV0U3ltYm9scy5jb25jYXQocmVmZXJyZWRTeW1ib2xzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgc3ltYm9sQ29kZUxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5sb2cyKShpbnB1dFN5bWJvbHMubGVuZ3RoKTsKKworICAgICAgaWYgKHJlZ2lvbi5odWZmbWFuKSB7CisgICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIHRoaXMuY3VzdG9tVGFibGVzLCBpbnB1dFN5bWJvbHMubGVuZ3RoLCBodWZmbWFuSW5wdXQpOworICAgICAgfQorCisgICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKHJlZ2lvbi5odWZmbWFuLCByZWdpb24ucmVmaW5lbWVudCwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCByZWdpb24uc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHJlZ2lvbi50cmFuc3Bvc2VkLCByZWdpb24uZHNPZmZzZXQsIHJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCBodWZmbWFuVGFibGVzLCByZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlLCByZWdpb24ucmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIHJlZ2lvbi5sb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCk7CisgICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpIHsKKyAgICAgIHRoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKworICAgIG9uUGF0dGVybkRpY3Rpb25hcnkoZGljdGlvbmFyeSwgY3VycmVudFNlZ21lbnQsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIGxldCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnM7CisKKyAgICAgIGlmICghcGF0dGVybnMpIHsKKyAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHBhdHRlcm5zID0ge307CisgICAgICB9CisKKyAgICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShkaWN0aW9uYXJ5Lm1tciwgZGljdGlvbmFyeS5wYXR0ZXJuV2lkdGgsIGRpY3Rpb25hcnkucGF0dGVybkhlaWdodCwgZGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXgsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCk7CisgICAgfSwKKworICAgIG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnNbcmVmZXJyZWRTZWdtZW50c1swXV07CisgICAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CisgICAgICBjb25zdCBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgY29uc3QgYml0bWFwID0gZGVjb2RlSGFsZnRvbmVSZWdpb24ocmVnaW9uLm1tciwgcGF0dGVybnMsIHJlZ2lvbi50ZW1wbGF0ZSwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLmVuYWJsZVNraXAsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCByZWdpb24uZ3JpZFdpZHRoLCByZWdpb24uZ3JpZEhlaWdodCwgcmVnaW9uLmdyaWRPZmZzZXRYLCByZWdpb24uZ3JpZE9mZnNldFksIHJlZ2lvbi5ncmlkVmVjdG9yWCwgcmVnaW9uLmdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CisgICAgfSwKKworICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbigpIHsKKyAgICAgIHRoaXMub25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgbGV0IGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzOworCisgICAgICBpZiAoIWN1c3RvbVRhYmxlcykgeworICAgICAgICB0aGlzLmN1c3RvbVRhYmxlcyA9IGN1c3RvbVRhYmxlcyA9IHt9OworICAgICAgfQorCisgICAgICBjdXN0b21UYWJsZXNbY3VycmVudFNlZ21lbnRdID0gZGVjb2RlVGFibGVzU2VnbWVudChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBIdWZmbWFuTGluZShsaW5lRGF0YSkgeworICAgIGlmIChsaW5lRGF0YS5sZW5ndGggPT09IDIpIHsKKyAgICAgIHRoaXMuaXNPT0IgPSB0cnVlOworICAgICAgdGhpcy5yYW5nZUxvdyA9IDA7CisgICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzBdOworICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IDA7CisgICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVsxXTsKKyAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuaXNPT0IgPSBmYWxzZTsKKyAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lRGF0YVswXTsKKyAgICAgIHRoaXMucHJlZml4TGVuZ3RoID0gbGluZURhdGFbMV07CisgICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gbGluZURhdGFbMl07CisgICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVszXTsKKyAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gbGluZURhdGFbNF0gPT09ICJsb3dlciI7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gSHVmZm1hblRyZWVOb2RlKGxpbmUpIHsKKyAgICB0aGlzLmNoaWxkcmVuID0gW107CisKKyAgICBpZiAobGluZSkgeworICAgICAgdGhpcy5pc0xlYWYgPSB0cnVlOworICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmUucmFuZ2VMZW5ndGg7CisgICAgICB0aGlzLnJhbmdlTG93ID0gbGluZS5yYW5nZUxvdzsKKyAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gbGluZS5pc0xvd2VyUmFuZ2U7CisgICAgICB0aGlzLmlzT09CID0gbGluZS5pc09PQjsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5pc0xlYWYgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBIdWZmbWFuVHJlZU5vZGUucHJvdG90eXBlID0geworICAgIGJ1aWxkVHJlZShsaW5lLCBzaGlmdCkgeworICAgICAgY29uc3QgYml0ID0gbGluZS5wcmVmaXhDb2RlID4+IHNoaWZ0ICYgMTsKKworICAgICAgaWYgKHNoaWZ0IDw9IDApIHsKKyAgICAgICAgdGhpcy5jaGlsZHJlbltiaXRdID0gbmV3IEh1ZmZtYW5UcmVlTm9kZShsaW5lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxldCBub2RlID0gdGhpcy5jaGlsZHJlbltiaXRdOworCisgICAgICAgIGlmICghbm9kZSkgeworICAgICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgbm9kZS5idWlsZFRyZWUobGluZSwgc2hpZnQgLSAxKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgZGVjb2RlTm9kZShyZWFkZXIpIHsKKyAgICAgIGlmICh0aGlzLmlzTGVhZikgeworICAgICAgICBpZiAodGhpcy5pc09PQikgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaHRPZmZzZXQgPSByZWFkZXIucmVhZEJpdHModGhpcy5yYW5nZUxlbmd0aCk7CisgICAgICAgIHJldHVybiB0aGlzLnJhbmdlTG93ICsgKHRoaXMuaXNMb3dlclJhbmdlID8gLWh0T2Zmc2V0IDogaHRPZmZzZXQpOworICAgICAgfQorCisgICAgICBjb25zdCBub2RlID0gdGhpcy5jaGlsZHJlbltyZWFkZXIucmVhZEJpdCgpXTsKKworICAgICAgaWYgKCFub2RlKSB7CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gZGF0YSIpOworICAgICAgfQorCisgICAgICByZXR1cm4gbm9kZS5kZWNvZGVOb2RlKHJlYWRlcik7CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gSHVmZm1hblRhYmxlKGxpbmVzLCBwcmVmaXhDb2Rlc0RvbmUpIHsKKyAgICBpZiAoIXByZWZpeENvZGVzRG9uZSkgeworICAgICAgdGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhsaW5lcyk7CisgICAgfQorCisgICAgdGhpcy5yb290Tm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07CisKKyAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5yb290Tm9kZS5idWlsZFRyZWUobGluZSwgbGluZS5wcmVmaXhMZW5ndGggLSAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBIdWZmbWFuVGFibGUucHJvdG90eXBlID0geworICAgIGRlY29kZShyZWFkZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTsKKyAgICB9LAorCisgICAgYXNzaWduUHJlZml4Q29kZXMobGluZXMpIHsKKyAgICAgIGNvbnN0IGxpbmVzTGVuZ3RoID0gbGluZXMubGVuZ3RoOworICAgICAgbGV0IHByZWZpeExlbmd0aE1heCA9IDA7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNMZW5ndGg7IGkrKykgeworICAgICAgICBwcmVmaXhMZW5ndGhNYXggPSBNYXRoLm1heChwcmVmaXhMZW5ndGhNYXgsIGxpbmVzW2ldLnByZWZpeExlbmd0aCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGhpc3RvZ3JhbSA9IG5ldyBVaW50MzJBcnJheShwcmVmaXhMZW5ndGhNYXggKyAxKTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7CisgICAgICAgIGhpc3RvZ3JhbVtsaW5lc1tpXS5wcmVmaXhMZW5ndGhdKys7CisgICAgICB9CisKKyAgICAgIGxldCBjdXJyZW50TGVuZ3RoID0gMSwKKyAgICAgICAgICBmaXJzdENvZGUgPSAwLAorICAgICAgICAgIGN1cnJlbnRDb2RlLAorICAgICAgICAgIGN1cnJlbnRUZW1wLAorICAgICAgICAgIGxpbmU7CisgICAgICBoaXN0b2dyYW1bMF0gPSAwOworCisgICAgICB3aGlsZSAoY3VycmVudExlbmd0aCA8PSBwcmVmaXhMZW5ndGhNYXgpIHsKKyAgICAgICAgZmlyc3RDb2RlID0gZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSA8PCAxOworICAgICAgICBjdXJyZW50Q29kZSA9IGZpcnN0Q29kZTsKKyAgICAgICAgY3VycmVudFRlbXAgPSAwOworCisgICAgICAgIHdoaWxlIChjdXJyZW50VGVtcCA8IGxpbmVzTGVuZ3RoKSB7CisgICAgICAgICAgbGluZSA9IGxpbmVzW2N1cnJlbnRUZW1wXTsKKworICAgICAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA9PT0gY3VycmVudExlbmd0aCkgeworICAgICAgICAgICAgbGluZS5wcmVmaXhDb2RlID0gY3VycmVudENvZGU7CisgICAgICAgICAgICBjdXJyZW50Q29kZSsrOworICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnRUZW1wKys7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50TGVuZ3RoKys7CisgICAgICB9CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gZGVjb2RlVGFibGVzU2VnbWVudChkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgY29uc3QgZmxhZ3MgPSBkYXRhW3N0YXJ0XTsKKyAgICBjb25zdCBsb3dlc3RWYWx1ZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDEpICYgMHhmZmZmZmZmZjsKKyAgICBjb25zdCBoaWdoZXN0VmFsdWUgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyA1KSAmIDB4ZmZmZmZmZmY7CisgICAgY29uc3QgcmVhZGVyID0gbmV3IFJlYWRlcihkYXRhLCBzdGFydCArIDksIGVuZCk7CisgICAgY29uc3QgcHJlZml4U2l6ZUJpdHMgPSAoZmxhZ3MgPj4gMSAmIDcpICsgMTsKKyAgICBjb25zdCByYW5nZVNpemVCaXRzID0gKGZsYWdzID4+IDQgJiA3KSArIDE7CisgICAgY29uc3QgbGluZXMgPSBbXTsKKyAgICBsZXQgcHJlZml4TGVuZ3RoLAorICAgICAgICByYW5nZUxlbmd0aCwKKyAgICAgICAgY3VycmVudFJhbmdlTG93ID0gbG93ZXN0VmFsdWU7CisKKyAgICBkbyB7CisgICAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOworICAgICAgcmFuZ2VMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocmFuZ2VTaXplQml0cyk7CisgICAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbY3VycmVudFJhbmdlTG93LCBwcmVmaXhMZW5ndGgsIHJhbmdlTGVuZ3RoLCAwXSkpOworICAgICAgY3VycmVudFJhbmdlTG93ICs9IDEgPDwgcmFuZ2VMZW5ndGg7CisgICAgfSB3aGlsZSAoY3VycmVudFJhbmdlTG93IDwgaGlnaGVzdFZhbHVlKTsKKworICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CisgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2xvd2VzdFZhbHVlIC0gMSwgcHJlZml4TGVuZ3RoLCAzMiwgMCwgImxvd2VyIl0pKTsKKyAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOworICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtoaWdoZXN0VmFsdWUsIHByZWZpeExlbmd0aCwgMzIsIDBdKSk7CisKKyAgICBpZiAoZmxhZ3MgJiAxKSB7CisgICAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOworICAgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgZmFsc2UpOworICB9CisKKyAgY29uc3Qgc3RhbmRhcmRUYWJsZXNDYWNoZSA9IHt9OworCisgIGZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7CisgICAgbGV0IHRhYmxlID0gc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdOworCisgICAgaWYgKHRhYmxlKSB7CisgICAgICByZXR1cm4gdGFibGU7CisgICAgfQorCisgICAgbGV0IGxpbmVzOworCisgICAgc3dpdGNoIChudW1iZXIpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgbGluZXMgPSBbWzAsIDEsIDQsIDB4MF0sIFsxNiwgMiwgOCwgMHgyXSwgWzI3MiwgMywgMTYsIDB4Nl0sIFs2NTgwOCwgMywgMzIsIDB4N11dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAyOgorICAgICAgICBsaW5lcyA9IFtbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWzc1LCA2LCAzMiwgMHgzZV0sIFs2LCAweDNmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIGxpbmVzID0gW1stMjU2LCA4LCA4LCAweGZlXSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAyLCAwLCAweDJdLCBbMiwgMywgMCwgMHg2XSwgWzMsIDQsIDMsIDB4ZV0sIFsxMSwgNSwgNiwgMHgxZV0sIFstMjU3LCA4LCAzMiwgMHhmZiwgImxvd2VyIl0sIFs3NSwgNywgMzIsIDB4N2VdLCBbNiwgMHgzZV1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0OgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWzc2LCA1LCAzMiwgMHgxZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA1OgorICAgICAgICBsaW5lcyA9IFtbLTI1NSwgNywgOCwgMHg3ZV0sIFsxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDAsIDB4Nl0sIFs0LCA0LCAzLCAweGVdLCBbMTIsIDUsIDYsIDB4MWVdLCBbLTI1NiwgNywgMzIsIDB4N2YsICJsb3dlciJdLCBbNzYsIDYsIDMyLCAweDNlXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDY6CisgICAgICAgIGxpbmVzID0gW1stMjA0OCwgNSwgMTAsIDB4MWNdLCBbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCA0LCA4LCAweDldLCBbLTI1NiwgNCwgNywgMHhhXSwgWy0xMjgsIDUsIDYsIDB4MWRdLCBbLTY0LCA1LCA1LCAweDFlXSwgWy0zMiwgNCwgNSwgMHhiXSwgWzAsIDIsIDcsIDB4MF0sIFsxMjgsIDMsIDcsIDB4Ml0sIFsyNTYsIDMsIDgsIDB4M10sIFs1MTIsIDQsIDksIDB4Y10sIFsxMDI0LCA0LCAxMCwgMHhkXSwgWy0yMDQ5LCA2LCAzMiwgMHgzZSwgImxvd2VyIl0sIFsyMDQ4LCA2LCAzMiwgMHgzZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA3OgorICAgICAgICBsaW5lcyA9IFtbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCAzLCA4LCAweDBdLCBbLTI1NiwgNCwgNywgMHg5XSwgWy0xMjgsIDUsIDYsIDB4MWFdLCBbLTY0LCA1LCA1LCAweDFiXSwgWy0zMiwgNCwgNSwgMHhhXSwgWzAsIDQsIDUsIDB4Yl0sIFszMiwgNSwgNSwgMHgxY10sIFs2NCwgNSwgNiwgMHgxZF0sIFsxMjgsIDQsIDcsIDB4Y10sIFsyNTYsIDMsIDgsIDB4MV0sIFs1MTIsIDMsIDksIDB4Ml0sIFsxMDI0LCAzLCAxMCwgMHgzXSwgWy0xMDI1LCA1LCAzMiwgMHgxZSwgImxvd2VyIl0sIFsyMDQ4LCA1LCAzMiwgMHgxZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA4OgorICAgICAgICBsaW5lcyA9IFtbLTE1LCA4LCAzLCAweGZjXSwgWy03LCA5LCAxLCAweDFmY10sIFstNSwgOCwgMSwgMHhmZF0sIFstMywgOSwgMCwgMHgxZmRdLCBbLTIsIDcsIDAsIDB4N2NdLCBbLTEsIDQsIDAsIDB4YV0sIFswLCAyLCAxLCAweDBdLCBbMiwgNSwgMCwgMHgxYV0sIFszLCA2LCAwLCAweDNhXSwgWzQsIDMsIDQsIDB4NF0sIFsyMCwgNiwgMSwgMHgzYl0sIFsyMiwgNCwgNCwgMHhiXSwgWzM4LCA0LCA1LCAweGNdLCBbNzAsIDUsIDYsIDB4MWJdLCBbMTM0LCA1LCA3LCAweDFjXSwgWzI2MiwgNiwgNywgMHgzY10sIFszOTAsIDcsIDgsIDB4N2RdLCBbNjQ2LCA2LCAxMCwgMHgzZF0sIFstMTYsIDksIDMyLCAweDFmZSwgImxvd2VyIl0sIFsxNjcwLCA5LCAzMiwgMHgxZmZdLCBbMiwgMHgxXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDk6CisgICAgICAgIGxpbmVzID0gW1stMzEsIDgsIDQsIDB4ZmNdLCBbLTE1LCA5LCAyLCAweDFmY10sIFstMTEsIDgsIDIsIDB4ZmRdLCBbLTcsIDksIDEsIDB4MWZkXSwgWy01LCA3LCAxLCAweDdjXSwgWy0zLCA0LCAxLCAweGFdLCBbLTEsIDMsIDEsIDB4Ml0sIFsxLCAzLCAxLCAweDNdLCBbMywgNSwgMSwgMHgxYV0sIFs1LCA2LCAxLCAweDNhXSwgWzcsIDMsIDUsIDB4NF0sIFszOSwgNiwgMiwgMHgzYl0sIFs0MywgNCwgNSwgMHhiXSwgWzc1LCA0LCA2LCAweGNdLCBbMTM5LCA1LCA3LCAweDFiXSwgWzI2NywgNSwgOCwgMHgxY10sIFs1MjMsIDYsIDgsIDB4M2NdLCBbNzc5LCA3LCA5LCAweDdkXSwgWzEyOTEsIDYsIDExLCAweDNkXSwgWy0zMiwgOSwgMzIsIDB4MWZlLCAibG93ZXIiXSwgWzMzMzksIDksIDMyLCAweDFmZl0sIFsyLCAweDBdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIGxpbmVzID0gW1stMjEsIDcsIDQsIDB4N2FdLCBbLTUsIDgsIDAsIDB4ZmNdLCBbLTQsIDcsIDAsIDB4N2JdLCBbLTMsIDUsIDAsIDB4MThdLCBbLTIsIDIsIDIsIDB4MF0sIFsyLCA1LCAwLCAweDE5XSwgWzMsIDYsIDAsIDB4MzZdLCBbNCwgNywgMCwgMHg3Y10sIFs1LCA4LCAwLCAweGZkXSwgWzYsIDIsIDYsIDB4MV0sIFs3MCwgNSwgNSwgMHgxYV0sIFsxMDIsIDYsIDUsIDB4MzddLCBbMTM0LCA2LCA2LCAweDM4XSwgWzE5OCwgNiwgNywgMHgzOV0sIFszMjYsIDYsIDgsIDB4M2FdLCBbNTgyLCA2LCA5LCAweDNiXSwgWzEwOTQsIDYsIDEwLCAweDNjXSwgWzIxMTgsIDcsIDExLCAweDdkXSwgWy0yMiwgOCwgMzIsIDB4ZmUsICJsb3dlciJdLCBbNDE2NiwgOCwgMzIsIDB4ZmZdLCBbMiwgMHgyXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDExOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDEsIDB4Ml0sIFs0LCA0LCAwLCAweGNdLCBbNSwgNCwgMSwgMHhkXSwgWzcsIDUsIDEsIDB4MWNdLCBbOSwgNSwgMiwgMHgxZF0sIFsxMywgNiwgMiwgMHgzY10sIFsxNywgNywgMiwgMHg3YV0sIFsyMSwgNywgMywgMHg3Yl0sIFsyOSwgNywgNCwgMHg3Y10sIFs0NSwgNywgNSwgMHg3ZF0sIFs3NywgNywgNiwgMHg3ZV0sIFsxNDEsIDcsIDMyLCAweDdmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDEyOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAxLCAweDZdLCBbNSwgNSwgMCwgMHgxY10sIFs2LCA1LCAxLCAweDFkXSwgWzgsIDYsIDEsIDB4M2NdLCBbMTAsIDcsIDAsIDB4N2FdLCBbMTEsIDcsIDEsIDB4N2JdLCBbMTMsIDcsIDIsIDB4N2NdLCBbMTcsIDcsIDMsIDB4N2RdLCBbMjUsIDcsIDQsIDB4N2VdLCBbNDEsIDgsIDUsIDB4ZmVdLCBbNzMsIDgsIDMyLCAweGZmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDEzOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDMsIDAsIDB4NF0sIFszLCA0LCAwLCAweGNdLCBbNCwgNSwgMCwgMHgxY10sIFs1LCA0LCAxLCAweGRdLCBbNywgMywgMywgMHg1XSwgWzE1LCA2LCAxLCAweDNhXSwgWzE3LCA2LCAyLCAweDNiXSwgWzIxLCA2LCAzLCAweDNjXSwgWzI5LCA2LCA0LCAweDNkXSwgWzQ1LCA2LCA1LCAweDNlXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTQ6CisgICAgICAgIGxpbmVzID0gW1stMiwgMywgMCwgMHg0XSwgWy0xLCAzLCAwLCAweDVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4Nl0sIFsyLCAzLCAwLCAweDddXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIGxpbmVzID0gW1stMjQsIDcsIDQsIDB4N2NdLCBbLTgsIDYsIDIsIDB4M2NdLCBbLTQsIDUsIDEsIDB4MWNdLCBbLTIsIDQsIDAsIDB4Y10sIFstMSwgMywgMCwgMHg0XSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAzLCAwLCAweDVdLCBbMiwgNCwgMCwgMHhkXSwgWzMsIDUsIDEsIDB4MWRdLCBbNSwgNiwgMiwgMHgzZF0sIFs5LCA3LCA0LCAweDdkXSwgWy0yNSwgNywgMzIsIDB4N2UsICJsb3dlciJdLCBbMjUsIDcsIDMyLCAweDdmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBsaW5lc1tpXSA9IG5ldyBIdWZmbWFuTGluZShsaW5lc1tpXSk7CisgICAgfQorCisgICAgdGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGxpbmVzLCB0cnVlKTsKKyAgICBzdGFuZGFyZFRhYmxlc0NhY2hlW251bWJlcl0gPSB0YWJsZTsKKyAgICByZXR1cm4gdGFibGU7CisgIH0KKworICBmdW5jdGlvbiBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgIHRoaXMuZW5kID0gZW5kOworICAgIHRoaXMucG9zaXRpb24gPSBzdGFydDsKKyAgICB0aGlzLnNoaWZ0ID0gLTE7CisgICAgdGhpcy5jdXJyZW50Qnl0ZSA9IDA7CisgIH0KKworICBSZWFkZXIucHJvdG90eXBlID0geworICAgIHJlYWRCaXQoKSB7CisgICAgICBpZiAodGhpcy5zaGlmdCA8IDApIHsKKyAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5lbmQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY3VycmVudEJ5dGUgPSB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTsKKyAgICAgICAgdGhpcy5zaGlmdCA9IDc7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGJpdCA9IHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCAmIDE7CisgICAgICB0aGlzLnNoaWZ0LS07CisgICAgICByZXR1cm4gYml0OworICAgIH0sCisKKyAgICByZWFkQml0cyhudW1CaXRzKSB7CisgICAgICBsZXQgcmVzdWx0ID0gMCwKKyAgICAgICAgICBpOworCisgICAgICBmb3IgKGkgPSBudW1CaXRzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgcmVzdWx0IHw9IHRoaXMucmVhZEJpdCgpIDw8IGk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSwKKworICAgIGJ5dGVBbGlnbigpIHsKKyAgICAgIHRoaXMuc2hpZnQgPSAtMTsKKyAgICB9LAorCisgICAgbmV4dCgpIHsKKyAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdOworICAgIH0KKworICB9OworCisgIGZ1bmN0aW9uIGdldEN1c3RvbUh1ZmZtYW5UYWJsZShpbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CisgICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSByZWZlcnJlZFRvLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IHRhYmxlID0gY3VzdG9tVGFibGVzW3JlZmVycmVkVG9baV1dOworCisgICAgICBpZiAodGFibGUpIHsKKyAgICAgICAgaWYgKGluZGV4ID09PSBjdXJyZW50SW5kZXgpIHsKKyAgICAgICAgICByZXR1cm4gdGFibGU7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50SW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpOworICB9CisKKyAgZnVuY3Rpb24gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXModGV4dFJlZ2lvbiwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzLCBudW1iZXJPZlN5bWJvbHMsIHJlYWRlcikgeworICAgIGNvbnN0IGNvZGVzID0gW107CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAzNDsgaSsrKSB7CisgICAgICBjb25zdCBjb2RlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKDQpOworICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIGNvZGVMZW5ndGgsIDAsIDBdKSk7CisgICAgfQorCisgICAgY29uc3QgcnVuQ29kZXNUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKKyAgICBjb2Rlcy5sZW5ndGggPSAwOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlN5bWJvbHM7KSB7CisgICAgICBjb25zdCBjb2RlTGVuZ3RoID0gcnVuQ29kZXNUYWJsZS5kZWNvZGUocmVhZGVyKTsKKworICAgICAgaWYgKGNvZGVMZW5ndGggPj0gMzIpIHsKKyAgICAgICAgbGV0IHJlcGVhdGVkTGVuZ3RoLCBudW1iZXJPZlJlcGVhdHMsIGo7CisKKyAgICAgICAgc3dpdGNoIChjb2RlTGVuZ3RoKSB7CisgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgIGlmIChpID09PSAwKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJubyBwcmV2aW91cyB2YWx1ZSBpbiBzeW1ib2wgSUQgdGFibGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDIpICsgMzsKKyAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gY29kZXNbaSAtIDFdLnByZWZpeExlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygzKSArIDM7CisgICAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTsKKyAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIGNvZGUgbGVuZ3RoIGluIHN5bWJvbCBJRCB0YWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUmVwZWF0czsgaisrKSB7CisgICAgICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIHJlcGVhdGVkTGVuZ3RoLCAwLCAwXSkpOworICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIGNvZGVMZW5ndGgsIDAsIDBdKSk7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZWFkZXIuYnl0ZUFsaWduKCk7CisgICAgY29uc3Qgc3ltYm9sSURUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKKyAgICBsZXQgY3VzdG9tSW5kZXggPSAwLAorICAgICAgICB0YWJsZUZpcnN0UywKKyAgICAgICAgdGFibGVEZWx0YVMsCisgICAgICAgIHRhYmxlRGVsdGFUOworCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5GUykgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgICB0YWJsZUZpcnN0UyA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRlMgKyA2KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVGaXJzdFMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5EUykgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgY2FzZSAyOgorICAgICAgICB0YWJsZURlbHRhUyA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRFMgKyA4KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVEZWx0YVMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5EVCkgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgY2FzZSAyOgorICAgICAgICB0YWJsZURlbHRhVCA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRFQgKyAxMSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgICBjdXN0b21JbmRleCsrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpOworICAgIH0KKworICAgIGlmICh0ZXh0UmVnaW9uLnJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIHN5bWJvbElEVGFibGUsCisgICAgICB0YWJsZUZpcnN0UywKKyAgICAgIHRhYmxlRGVsdGFTLAorICAgICAgdGFibGVEZWx0YVQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CisgICAgbGV0IGN1c3RvbUluZGV4ID0gMCwKKyAgICAgICAgdGFibGVEZWx0YUhlaWdodCwKKyAgICAgICAgdGFibGVEZWx0YVdpZHRoOworCisgICAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgKyA0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gREggc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yICsgMik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFcgc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICBsZXQgdGFibGVCaXRtYXBTaXplLCB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczsKKworICAgIGlmIChkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3RvcikgeworICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKKyAgICB9CisKKyAgICBpZiAoZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yKSB7CisgICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMgPSBnZXRTdGFuZGFyZFRhYmxlKDEpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICB0YWJsZURlbHRhSGVpZ2h0LAorICAgICAgdGFibGVEZWx0YVdpZHRoLAorICAgICAgdGFibGVCaXRtYXBTaXplLAorICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChyZWFkZXIsIHdpZHRoLCBoZWlnaHQpIHsKKyAgICBjb25zdCBiaXRtYXAgPSBbXTsKKworICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgIGNvbnN0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKyAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisKKyAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpOworICAgICAgfQorCisgICAgICByZWFkZXIuYnl0ZUFsaWduKCk7CisgICAgfQorCisgICAgcmV0dXJuIGJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZW5kT2ZCbG9jaykgeworICAgIGNvbnN0IHBhcmFtcyA9IHsKKyAgICAgIEs6IC0xLAorICAgICAgQ29sdW1uczogd2lkdGgsCisgICAgICBSb3dzOiBoZWlnaHQsCisgICAgICBCbGFja0lzMTogdHJ1ZSwKKyAgICAgIEVuZE9mQmxvY2s6IGVuZE9mQmxvY2sKKyAgICB9OworICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgX2NjaXR0LkNDSVRURmF4RGVjb2RlcihpbnB1dCwgcGFyYW1zKTsKKyAgICBjb25zdCBiaXRtYXAgPSBbXTsKKyAgICBsZXQgY3VycmVudEJ5dGUsCisgICAgICAgIGVvZiA9IGZhbHNlOworCisgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgYml0bWFwLnB1c2gocm93KTsKKyAgICAgIGxldCBzaGlmdCA9IC0xOworCisgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgaWYgKHNoaWZ0IDwgMCkgeworICAgICAgICAgIGN1cnJlbnRCeXRlID0gZGVjb2Rlci5yZWFkTmV4dENoYXIoKTsKKworICAgICAgICAgIGlmIChjdXJyZW50Qnl0ZSA9PT0gLTEpIHsKKyAgICAgICAgICAgIGN1cnJlbnRCeXRlID0gMDsKKyAgICAgICAgICAgIGVvZiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2hpZnQgPSA3OworICAgICAgICB9CisKKyAgICAgICAgcm93W3hdID0gY3VycmVudEJ5dGUgPj4gc2hpZnQgJiAxOworICAgICAgICBzaGlmdC0tOworICAgICAgfQorICAgIH0KKworICAgIGlmIChlbmRPZkJsb2NrICYmICFlb2YpIHsKKyAgICAgIGNvbnN0IGxvb2tGb3JFT0ZMaW1pdCA9IDU7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va0ZvckVPRkxpbWl0OyBpKyspIHsKKyAgICAgICAgaWYgKGRlY29kZXIucmVhZE5leHRDaGFyKCkgPT09IC0xKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gSmJpZzJJbWFnZSgpIHt9CisKKyAgSmJpZzJJbWFnZS5wcm90b3R5cGUgPSB7CisgICAgcGFyc2VDaHVua3MoY2h1bmtzKSB7CisgICAgICByZXR1cm4gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpOworICAgIH0sCisKKyAgICBwYXJzZShkYXRhKSB7CisgICAgICBjb25zdCB7CisgICAgICAgIGltZ0RhdGEsCisgICAgICAgIHdpZHRoLAorICAgICAgICBoZWlnaHQKKyAgICAgIH0gPSBwYXJzZUpiaWcyKGRhdGEpOworICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICByZXR1cm4gaW1nRGF0YTsKKyAgICB9CisKKyAgfTsKKyAgcmV0dXJuIEpiaWcySW1hZ2U7Cit9KCk7CisKK2V4cG9ydHMuSmJpZzJJbWFnZSA9IEpiaWcySW1hZ2U7CisKKy8qKiovIH0pLAorLyogMTcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Bcml0aG1ldGljRGVjb2RlciA9IHZvaWQgMDsKK2NvbnN0IFFlVGFibGUgPSBbeworICBxZTogMHg1NjAxLAorICBubXBzOiAxLAorICBubHBzOiAxLAorICBzd2l0Y2hGbGFnOiAxCit9LCB7CisgIHFlOiAweDM0MDEsCisgIG5tcHM6IDIsCisgIG5scHM6IDYsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTgwMSwKKyAgbm1wczogMywKKyAgbmxwczogOSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwYWMxLAorICBubXBzOiA0LAorICBubHBzOiAxMiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwNTIxLAorICBubXBzOiA1LAorICBubHBzOiAyOSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMjIxLAorICBubXBzOiAzOCwKKyAgbmxwczogMzMsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NTYwMSwKKyAgbm1wczogNywKKyAgbmxwczogNiwKKyAgc3dpdGNoRmxhZzogMQorfSwgeworICBxZTogMHg1NDAxLAorICBubXBzOiA4LAorICBubHBzOiAxNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg0ODAxLAorICBubXBzOiA5LAorICBubHBzOiAxNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgzODAxLAorICBubXBzOiAxMCwKKyAgbmxwczogMTQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MzAwMSwKKyAgbm1wczogMTEsCisgIG5scHM6IDE3LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDI0MDEsCisgIG5tcHM6IDEyLAorICBubHBzOiAxOCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxYzAxLAorICBubXBzOiAxMywKKyAgbmxwczogMjAsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTYwMSwKKyAgbm1wczogMjksCisgIG5scHM6IDIxLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDU2MDEsCisgIG5tcHM6IDE1LAorICBubHBzOiAxNCwKKyAgc3dpdGNoRmxhZzogMQorfSwgeworICBxZTogMHg1NDAxLAorICBubXBzOiAxNiwKKyAgbmxwczogMTQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NTEwMSwKKyAgbm1wczogMTcsCisgIG5scHM6IDE1LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDQ4MDEsCisgIG5tcHM6IDE4LAorICBubHBzOiAxNiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgzODAxLAorICBubXBzOiAxOSwKKyAgbmxwczogMTcsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MzQwMSwKKyAgbm1wczogMjAsCisgIG5scHM6IDE4LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDMwMDEsCisgIG5tcHM6IDIxLAorICBubHBzOiAxOSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgyODAxLAorICBubXBzOiAyMiwKKyAgbmxwczogMTksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MjQwMSwKKyAgbm1wczogMjMsCisgIG5scHM6IDIwLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDIyMDEsCisgIG5tcHM6IDI0LAorICBubHBzOiAyMSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxYzAxLAorICBubXBzOiAyNSwKKyAgbmxwczogMjIsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTgwMSwKKyAgbm1wczogMjYsCisgIG5scHM6IDIzLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE2MDEsCisgIG5tcHM6IDI3LAorICBubHBzOiAyNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxNDAxLAorICBubXBzOiAyOCwKKyAgbmxwczogMjUsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTIwMSwKKyAgbm1wczogMjksCisgIG5scHM6IDI2LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDExMDEsCisgIG5tcHM6IDMwLAorICBubHBzOiAyNywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwYWMxLAorICBubXBzOiAzMSwKKyAgbmxwczogMjgsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDljMSwKKyAgbm1wczogMzIsCisgIG5scHM6IDI5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA4YTEsCisgIG5tcHM6IDMzLAorICBubHBzOiAzMCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwNTIxLAorICBubXBzOiAzNCwKKyAgbmxwczogMzEsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDQ0MSwKKyAgbm1wczogMzUsCisgIG5scHM6IDMyLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAyYTEsCisgIG5tcHM6IDM2LAorICBubHBzOiAzMywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMjIxLAorICBubXBzOiAzNywKKyAgbmxwczogMzQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDE0MSwKKyAgbm1wczogMzgsCisgIG5scHM6IDM1LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAxMTEsCisgIG5tcHM6IDM5LAorICBubHBzOiAzNiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDg1LAorICBubXBzOiA0MCwKKyAgbmxwczogMzcsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDA0OSwKKyAgbm1wczogNDEsCisgIG5scHM6IDM4LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwMjUsCisgIG5tcHM6IDQyLAorICBubHBzOiAzOSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDE1LAorICBubXBzOiA0MywKKyAgbmxwczogNDAsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAwOSwKKyAgbm1wczogNDQsCisgIG5scHM6IDQxLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwMDUsCisgIG5tcHM6IDQ1LAorICBubHBzOiA0MiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDAxLAorICBubXBzOiA0NSwKKyAgbmxwczogNDMsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NTYwMSwKKyAgbm1wczogNDYsCisgIG5scHM6IDQ2LAorICBzd2l0Y2hGbGFnOiAwCit9XTsKKworY2xhc3MgQXJpdGhtZXRpY0RlY29kZXIgeworICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB0aGlzLmJwID0gc3RhcnQ7CisgICAgdGhpcy5kYXRhRW5kID0gZW5kOworICAgIHRoaXMuY2hpZ2ggPSBkYXRhW3N0YXJ0XTsKKyAgICB0aGlzLmNsb3cgPSAwOworICAgIHRoaXMuYnl0ZUluKCk7CisgICAgdGhpcy5jaGlnaCA9IHRoaXMuY2hpZ2ggPDwgNyAmIDB4ZmZmZiB8IHRoaXMuY2xvdyA+PiA5ICYgMHg3ZjsKKyAgICB0aGlzLmNsb3cgPSB0aGlzLmNsb3cgPDwgNyAmIDB4ZmZmZjsKKyAgICB0aGlzLmN0IC09IDc7CisgICAgdGhpcy5hID0gMHg4MDAwOworICB9CisKKyAgYnl0ZUluKCkgeworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgbGV0IGJwID0gdGhpcy5icDsKKworICAgIGlmIChkYXRhW2JwXSA9PT0gMHhmZikgeworICAgICAgaWYgKGRhdGFbYnAgKyAxXSA+IDB4OGYpIHsKKyAgICAgICAgdGhpcy5jbG93ICs9IDB4ZmYwMDsKKyAgICAgICAgdGhpcy5jdCA9IDg7CisgICAgICB9IGVsc2UgeworICAgICAgICBicCsrOworICAgICAgICB0aGlzLmNsb3cgKz0gZGF0YVticF0gPDwgOTsKKyAgICAgICAgdGhpcy5jdCA9IDc7CisgICAgICAgIHRoaXMuYnAgPSBicDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYnArKzsKKyAgICAgIHRoaXMuY2xvdyArPSBicCA8IHRoaXMuZGF0YUVuZCA/IGRhdGFbYnBdIDw8IDggOiAweGZmMDA7CisgICAgICB0aGlzLmN0ID0gODsKKyAgICAgIHRoaXMuYnAgPSBicDsKKyAgICB9CisKKyAgICBpZiAodGhpcy5jbG93ID4gMHhmZmZmKSB7CisgICAgICB0aGlzLmNoaWdoICs9IHRoaXMuY2xvdyA+PiAxNjsKKyAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7CisgICAgfQorICB9CisKKyAgcmVhZEJpdChjb250ZXh0cywgcG9zKSB7CisgICAgbGV0IGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLAorICAgICAgICBjeF9tcHMgPSBjb250ZXh0c1twb3NdICYgMTsKKyAgICBjb25zdCBxZVRhYmxlSWN4ID0gUWVUYWJsZVtjeF9pbmRleF07CisgICAgY29uc3QgcWVJY3ggPSBxZVRhYmxlSWN4LnFlOworICAgIGxldCBkOworICAgIGxldCBhID0gdGhpcy5hIC0gcWVJY3g7CisKKyAgICBpZiAodGhpcy5jaGlnaCA8IHFlSWN4KSB7CisgICAgICBpZiAoYSA8IHFlSWN4KSB7CisgICAgICAgIGEgPSBxZUljeDsKKyAgICAgICAgZCA9IGN4X21wczsKKyAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5tcHM7CisgICAgICB9IGVsc2UgeworICAgICAgICBhID0gcWVJY3g7CisgICAgICAgIGQgPSAxIF4gY3hfbXBzOworCisgICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHsKKyAgICAgICAgICBjeF9tcHMgPSBkOworICAgICAgICB9CisKKyAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5scHM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuY2hpZ2ggLT0gcWVJY3g7CisKKyAgICAgIGlmICgoYSAmIDB4ODAwMCkgIT09IDApIHsKKyAgICAgICAgdGhpcy5hID0gYTsKKyAgICAgICAgcmV0dXJuIGN4X21wczsKKyAgICAgIH0KKworICAgICAgaWYgKGEgPCBxZUljeCkgeworICAgICAgICBkID0gMSBeIGN4X21wczsKKworICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7CisgICAgICAgICAgY3hfbXBzID0gZDsKKyAgICAgICAgfQorCisgICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZCA9IGN4X21wczsKKyAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5tcHM7CisgICAgICB9CisgICAgfQorCisgICAgZG8geworICAgICAgaWYgKHRoaXMuY3QgPT09IDApIHsKKyAgICAgICAgdGhpcy5ieXRlSW4oKTsKKyAgICAgIH0KKworICAgICAgYSA8PD0gMTsKKyAgICAgIHRoaXMuY2hpZ2ggPSB0aGlzLmNoaWdoIDw8IDEgJiAweGZmZmYgfCB0aGlzLmNsb3cgPj4gMTUgJiAxOworICAgICAgdGhpcy5jbG93ID0gdGhpcy5jbG93IDw8IDEgJiAweGZmZmY7CisgICAgICB0aGlzLmN0LS07CisgICAgfSB3aGlsZSAoKGEgJiAweDgwMDApID09PSAwKTsKKworICAgIHRoaXMuYSA9IGE7CisgICAgY29udGV4dHNbcG9zXSA9IGN4X2luZGV4IDw8IDEgfCBjeF9tcHM7CisgICAgcmV0dXJuIGQ7CisgIH0KKworfQorCitleHBvcnRzLkFyaXRobWV0aWNEZWNvZGVyID0gQXJpdGhtZXRpY0RlY29kZXI7CisKKy8qKiovIH0pLAorLyogMTggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5KcGVnU3RyZWFtID0gdm9pZCAwOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2pwZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCitjb25zdCBKcGVnU3RyZWFtID0gZnVuY3Rpb24gSnBlZ1N0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEpwZWdTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZGljdCwgcGFyYW1zKSB7CisgICAgbGV0IGNoOworCisgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgaWYgKGNoID09PSAweGZmKSB7CisgICAgICAgIHN0cmVhbS5za2lwKC0xKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5tYXliZUxlbmd0aCA9IG1heWJlTGVuZ3RoOworICAgIHRoaXMuZGljdCA9IGRpY3Q7CisgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisKKyAgICBfc3RyZWFtLkRlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIEpwZWdTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShfc3RyZWFtLkRlY29kZVN0cmVhbS5wcm90b3R5cGUpOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSnBlZ1N0cmVhbS5wcm90b3R5cGUsICJieXRlcyIsIHsKKyAgICBnZXQ6IGZ1bmN0aW9uIEpwZWdTdHJlYW1fYnl0ZXMoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImJ5dGVzIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpOworICAgIH0sCisgICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworCisgIEpwZWdTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlciA9IGZ1bmN0aW9uIChyZXF1ZXN0ZWQpIHt9OworCisgIEpwZWdTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBqcGVnT3B0aW9ucyA9IHsKKyAgICAgIGRlY29kZVRyYW5zZm9ybTogdW5kZWZpbmVkLAorICAgICAgY29sb3JUcmFuc2Zvcm06IHVuZGVmaW5lZAorICAgIH07CisgICAgY29uc3QgZGVjb2RlQXJyID0gdGhpcy5kaWN0LmdldEFycmF5KCJEZWNvZGUiLCAiRCIpOworCisgICAgaWYgKHRoaXMuZm9yY2VSR0IgJiYgQXJyYXkuaXNBcnJheShkZWNvZGVBcnIpKSB7CisgICAgICBjb25zdCBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5kaWN0LmdldCgiQml0c1BlckNvbXBvbmVudCIpIHx8IDg7CisgICAgICBjb25zdCBkZWNvZGVBcnJMZW5ndGggPSBkZWNvZGVBcnIubGVuZ3RoOworICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEludDMyQXJyYXkoZGVjb2RlQXJyTGVuZ3RoKTsKKyAgICAgIGxldCB0cmFuc2Zvcm1OZWVkZWQgPSBmYWxzZTsKKyAgICAgIGNvbnN0IG1heFZhbHVlID0gKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZUFyckxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgIHRyYW5zZm9ybVtpXSA9IChkZWNvZGVBcnJbaSArIDFdIC0gZGVjb2RlQXJyW2ldKSAqIDI1NiB8IDA7CisgICAgICAgIHRyYW5zZm9ybVtpICsgMV0gPSBkZWNvZGVBcnJbaV0gKiBtYXhWYWx1ZSB8IDA7CisKKyAgICAgICAgaWYgKHRyYW5zZm9ybVtpXSAhPT0gMjU2IHx8IHRyYW5zZm9ybVtpICsgMV0gIT09IDApIHsKKyAgICAgICAgICB0cmFuc2Zvcm1OZWVkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0cmFuc2Zvcm1OZWVkZWQpIHsKKyAgICAgICAganBlZ09wdGlvbnMuZGVjb2RlVHJhbnNmb3JtID0gdHJhbnNmb3JtOworICAgICAgfQorICAgIH0KKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh0aGlzLnBhcmFtcykpIHsKKyAgICAgIGNvbnN0IGNvbG9yVHJhbnNmb3JtID0gdGhpcy5wYXJhbXMuZ2V0KCJDb2xvclRyYW5zZm9ybSIpOworCisgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb2xvclRyYW5zZm9ybSkpIHsKKyAgICAgICAganBlZ09wdGlvbnMuY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBqcGVnSW1hZ2UgPSBuZXcgX2pwZy5KcGVnSW1hZ2UoanBlZ09wdGlvbnMpOworICAgIGpwZWdJbWFnZS5wYXJzZSh0aGlzLmJ5dGVzKTsKKyAgICBjb25zdCBkYXRhID0ganBlZ0ltYWdlLmdldERhdGEoeworICAgICAgd2lkdGg6IHRoaXMuZHJhd1dpZHRoLAorICAgICAgaGVpZ2h0OiB0aGlzLmRyYXdIZWlnaHQsCisgICAgICBmb3JjZVJHQjogdGhpcy5mb3JjZVJHQiwKKyAgICAgIGlzU291cmNlUERGOiB0cnVlCisgICAgfSk7CisgICAgdGhpcy5idWZmZXIgPSBkYXRhOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgdGhpcy5lb2YgPSB0cnVlOworICB9OworCisgIHJldHVybiBKcGVnU3RyZWFtOworfSgpOworCitleHBvcnRzLkpwZWdTdHJlYW0gPSBKcGVnU3RyZWFtOworCisvKioqLyB9KSwKKy8qIDE5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSnBlZ0ltYWdlID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworCitjbGFzcyBKcGVnRXJyb3IgZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnKSB7CisgICAgc3VwZXIoYEpQRUcgZXJyb3I6ICR7bXNnfWApOworICB9CisKK30KKworY2xhc3MgRE5MTWFya2VyRXJyb3IgZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobWVzc2FnZSwgc2NhbkxpbmVzKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgICAgdGhpcy5zY2FuTGluZXMgPSBzY2FuTGluZXM7CisgIH0KKworfQorCitjbGFzcyBFT0lNYXJrZXJFcnJvciBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24ge30KKwordmFyIEpwZWdJbWFnZSA9IGZ1bmN0aW9uIEpwZWdJbWFnZUNsb3N1cmUoKSB7CisgIHZhciBkY3RaaWdaYWcgPSBuZXcgVWludDhBcnJheShbMCwgMSwgOCwgMTYsIDksIDIsIDMsIDEwLCAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCA0LCA1LCAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsIDI3LCAyMCwgMTMsIDYsIDcsIDE0LCAyMSwgMjgsIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLCA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2M10pOworICB2YXIgZGN0Q29zMSA9IDQwMTc7CisgIHZhciBkY3RTaW4xID0gNzk5OworICB2YXIgZGN0Q29zMyA9IDM0MDY7CisgIHZhciBkY3RTaW4zID0gMjI3NjsKKyAgdmFyIGRjdENvczYgPSAxNTY3OworICB2YXIgZGN0U2luNiA9IDM3ODQ7CisgIHZhciBkY3RTcXJ0MiA9IDU3OTM7CisgIHZhciBkY3RTcXJ0MWQyID0gMjg5NjsKKworICBmdW5jdGlvbiBKcGVnSW1hZ2UoeworICAgIGRlY29kZVRyYW5zZm9ybSA9IG51bGwsCisgICAgY29sb3JUcmFuc2Zvcm0gPSAtMQorICB9ID0ge30pIHsKKyAgICB0aGlzLl9kZWNvZGVUcmFuc2Zvcm0gPSBkZWNvZGVUcmFuc2Zvcm07CisgICAgdGhpcy5fY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCB2YWx1ZXMpIHsKKyAgICB2YXIgayA9IDAsCisgICAgICAgIGNvZGUgPSBbXSwKKyAgICAgICAgaSwKKyAgICAgICAgaiwKKyAgICAgICAgbGVuZ3RoID0gMTY7CisKKyAgICB3aGlsZSAobGVuZ3RoID4gMCAmJiAhY29kZUxlbmd0aHNbbGVuZ3RoIC0gMV0pIHsKKyAgICAgIGxlbmd0aC0tOworICAgIH0KKworICAgIGNvZGUucHVzaCh7CisgICAgICBjaGlsZHJlbjogW10sCisgICAgICBpbmRleDogMAorICAgIH0pOworICAgIHZhciBwID0gY29kZVswXSwKKyAgICAgICAgcTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGVMZW5ndGhzW2ldOyBqKyspIHsKKyAgICAgICAgcCA9IGNvZGUucG9wKCk7CisgICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSB2YWx1ZXNba107CisKKyAgICAgICAgd2hpbGUgKHAuaW5kZXggPiAwKSB7CisgICAgICAgICAgcCA9IGNvZGUucG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwLmluZGV4Kys7CisgICAgICAgIGNvZGUucHVzaChwKTsKKworICAgICAgICB3aGlsZSAoY29kZS5sZW5ndGggPD0gaSkgeworICAgICAgICAgIGNvZGUucHVzaChxID0geworICAgICAgICAgICAgY2hpbGRyZW46IFtdLAorICAgICAgICAgICAgaW5kZXg6IDAKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKKyAgICAgICAgICBwID0gcTsKKyAgICAgICAgfQorCisgICAgICAgIGsrKzsKKyAgICAgIH0KKworICAgICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7CisgICAgICAgIGNvZGUucHVzaChxID0geworICAgICAgICAgIGNoaWxkcmVuOiBbXSwKKyAgICAgICAgICBpbmRleDogMAorICAgICAgICB9KTsKKyAgICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHEuY2hpbGRyZW47CisgICAgICAgIHAgPSBxOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb2RlWzBdLmNoaWxkcmVuOworICB9CisKKyAgZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkgeworICAgIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlUHJldiwgc3VjY2Vzc2l2ZSwgcGFyc2VETkxNYXJrZXIgPSBmYWxzZSkgeworICAgIHZhciBtY3VzUGVyTGluZSA9IGZyYW1lLm1jdXNQZXJMaW5lOworICAgIHZhciBwcm9ncmVzc2l2ZSA9IGZyYW1lLnByb2dyZXNzaXZlOworICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OworICAgIGxldCBiaXRzRGF0YSA9IDAsCisgICAgICAgIGJpdHNDb3VudCA9IDA7CisKKyAgICBmdW5jdGlvbiByZWFkQml0KCkgeworICAgICAgaWYgKGJpdHNDb3VudCA+IDApIHsKKyAgICAgICAgYml0c0NvdW50LS07CisgICAgICAgIHJldHVybiBiaXRzRGF0YSA+PiBiaXRzQ291bnQgJiAxOworICAgICAgfQorCisgICAgICBiaXRzRGF0YSA9IGRhdGFbb2Zmc2V0KytdOworCisgICAgICBpZiAoYml0c0RhdGEgPT09IDB4ZmYpIHsKKyAgICAgICAgdmFyIG5leHRCeXRlID0gZGF0YVtvZmZzZXQrK107CisKKyAgICAgICAgaWYgKG5leHRCeXRlKSB7CisgICAgICAgICAgaWYgKG5leHRCeXRlID09PSAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGNvbnN0IHNjYW5MaW5lcyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgICAgICAgIGlmIChzY2FuTGluZXMgPiAwICYmIHNjYW5MaW5lcyAhPT0gZnJhbWUuc2NhbkxpbmVzKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRE5MIG1hcmtlciAoMHhGRkRDKSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIsIHNjYW5MaW5lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Qnl0ZSA9PT0gMHhkOSkgeworICAgICAgICAgICAgaWYgKHBhcnNlRE5MTWFya2VyKSB7CisgICAgICAgICAgICAgIGNvbnN0IG1heWJlU2NhbkxpbmVzID0gYmxvY2tSb3cgKiAoZnJhbWUucHJlY2lzaW9uID09PSA4ID8gOCA6IDApOworCisgICAgICAgICAgICAgIGlmIChtYXliZVNjYW5MaW5lcyA+IDAgJiYgTWF0aC5yb3VuZChmcmFtZS5zY2FuTGluZXMgLyBtYXliZVNjYW5MaW5lcykgPj0gMTApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEsICIgKyAicG9zc2libHkgY2F1c2VkIGJ5IGluY29ycmVjdCBgc2NhbkxpbmVzYCBwYXJhbWV0ZXIiLCBtYXliZVNjYW5MaW5lcyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IEVPSU1hcmtlckVycm9yKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihgdW5leHBlY3RlZCBtYXJrZXIgJHsoYml0c0RhdGEgPDwgOCB8IG5leHRCeXRlKS50b1N0cmluZygxNil9YCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYml0c0NvdW50ID0gNzsKKyAgICAgIHJldHVybiBiaXRzRGF0YSA+Pj4gNzsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBkZWNvZGVIdWZmbWFuKHRyZWUpIHsKKyAgICAgIHZhciBub2RlID0gdHJlZTsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgbm9kZSA9IG5vZGVbcmVhZEJpdCgpXTsKKworICAgICAgICBzd2l0Y2ggKHR5cGVvZiBub2RlKSB7CisgICAgICAgICAgY2FzZSAibnVtYmVyIjoKKyAgICAgICAgICAgIHJldHVybiBub2RlOworCisgICAgICAgICAgY2FzZSAib2JqZWN0IjoKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiaW52YWxpZCBodWZmbWFuIHNlcXVlbmNlIik7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVjZWl2ZShsZW5ndGgpIHsKKyAgICAgIHZhciBuID0gMDsKKworICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgbiA9IG4gPDwgMSB8IHJlYWRCaXQoKTsKKyAgICAgICAgbGVuZ3RoLS07CisgICAgICB9CisKKyAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIGZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQobGVuZ3RoKSB7CisgICAgICBpZiAobGVuZ3RoID09PSAxKSB7CisgICAgICAgIHJldHVybiByZWFkQml0KCkgPT09IDEgPyAxIDogLTE7CisgICAgICB9CisKKyAgICAgIHZhciBuID0gcmVjZWl2ZShsZW5ndGgpOworCisgICAgICBpZiAobiA+PSAxIDw8IGxlbmd0aCAtIDEpIHsKKyAgICAgICAgcmV0dXJuIG47CisgICAgICB9CisKKyAgICAgIHJldHVybiBuICsgKC0xIDw8IGxlbmd0aCkgKyAxOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZUJhc2VsaW5lKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIHZhciB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpOworICAgICAgdmFyIGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCk7CisgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CisgICAgICB2YXIgayA9IDE7CisKKyAgICAgIHdoaWxlIChrIDwgNjQpIHsKKyAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOworICAgICAgICB2YXIgcyA9IHJzICYgMTUsCisgICAgICAgICAgICByID0gcnMgPj4gNDsKKworICAgICAgICBpZiAocyA9PT0gMCkgeworICAgICAgICAgIGlmIChyIDwgMTUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGsgKz0gMTY7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBrICs9IHI7CisgICAgICAgIHZhciB6ID0gZGN0WmlnWmFnW2tdOworICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0ICsgel0gPSByZWNlaXZlQW5kRXh0ZW5kKHMpOworICAgICAgICBrKys7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlRENGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICB2YXIgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKKyAgICAgIHZhciBkaWZmID0gdCA9PT0gMCA/IDAgOiByZWNlaXZlQW5kRXh0ZW5kKHQpIDw8IHN1Y2Nlc3NpdmU7CisgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlRENTdWNjZXNzaXZlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdIHw9IHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlOworICAgIH0KKworICAgIHZhciBlb2JydW4gPSAwOworCisgICAgZnVuY3Rpb24gZGVjb2RlQUNGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICBpZiAoZW9icnVuID4gMCkgeworICAgICAgICBlb2JydW4tLTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQsCisgICAgICAgICAgZSA9IHNwZWN0cmFsRW5kOworCisgICAgICB3aGlsZSAoayA8PSBlKSB7CisgICAgICAgIHZhciBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKKyAgICAgICAgdmFyIHMgPSBycyAmIDE1LAorICAgICAgICAgICAgciA9IHJzID4+IDQ7CisKKyAgICAgICAgaWYgKHMgPT09IDApIHsKKyAgICAgICAgICBpZiAociA8IDE1KSB7CisgICAgICAgICAgICBlb2JydW4gPSByZWNlaXZlKHIpICsgKDEgPDwgcikgLSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgayArPSAxNjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGsgKz0gcjsKKyAgICAgICAgdmFyIHogPSBkY3RaaWdaYWdba107CisgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocykgKiAoMSA8PCBzdWNjZXNzaXZlKTsKKyAgICAgICAgaysrOworICAgICAgfQorICAgIH0KKworICAgIHZhciBzdWNjZXNzaXZlQUNTdGF0ZSA9IDAsCisgICAgICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZTsKKworICAgIGZ1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQ7CisgICAgICB2YXIgZSA9IHNwZWN0cmFsRW5kOworICAgICAgdmFyIHIgPSAwOworICAgICAgdmFyIHM7CisgICAgICB2YXIgcnM7CisKKyAgICAgIHdoaWxlIChrIDw9IGUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0WiA9IGJsb2NrT2Zmc2V0ICsgZGN0WmlnWmFnW2tdOworICAgICAgICBjb25zdCBzaWduID0gY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA8IDAgPyAtMSA6IDE7CisKKyAgICAgICAgc3dpdGNoIChzdWNjZXNzaXZlQUNTdGF0ZSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOworICAgICAgICAgICAgcyA9IHJzICYgMTU7CisgICAgICAgICAgICByID0gcnMgPj4gNDsKKworICAgICAgICAgICAgaWYgKHMgPT09IDApIHsKKyAgICAgICAgICAgICAgaWYgKHIgPCAxNSkgeworICAgICAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKTsKKyAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDQ7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgciA9IDE2OworICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHMgIT09IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIEFDbiBlbmNvZGluZyIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTsKKyAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CisgICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByLS07CisKKyAgICAgICAgICAgICAgaWYgKHIgPT09IDApIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSAyID8gMyA6IDA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkgeworICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA9IHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZSA8PCBzdWNjZXNzaXZlOworICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBrKys7CisgICAgICB9CisKKyAgICAgIGlmIChzdWNjZXNzaXZlQUNTdGF0ZSA9PT0gNCkgeworICAgICAgICBlb2JydW4tLTsKKworICAgICAgICBpZiAoZW9icnVuID09PSAwKSB7CisgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgbGV0IGJsb2NrUm93ID0gMDsKKworICAgIGZ1bmN0aW9uIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZSwgbWN1LCByb3csIGNvbCkgeworICAgICAgdmFyIG1jdVJvdyA9IG1jdSAvIG1jdXNQZXJMaW5lIHwgMDsKKyAgICAgIHZhciBtY3VDb2wgPSBtY3UgJSBtY3VzUGVyTGluZTsKKyAgICAgIGJsb2NrUm93ID0gbWN1Um93ICogY29tcG9uZW50LnYgKyByb3c7CisgICAgICB2YXIgYmxvY2tDb2wgPSBtY3VDb2wgKiBjb21wb25lbnQuaCArIGNvbDsKKyAgICAgIGNvbnN0IGJsb2NrT2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpOworICAgICAgZGVjb2RlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlLCBtY3UpIHsKKyAgICAgIGJsb2NrUm93ID0gbWN1IC8gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgfCAwOworICAgICAgdmFyIGJsb2NrQ29sID0gbWN1ICUgY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7CisgICAgICBjb25zdCBibG9ja09mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKKyAgICAgIGRlY29kZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KTsKKyAgICB9CisKKyAgICB2YXIgY29tcG9uZW50c0xlbmd0aCA9IGNvbXBvbmVudHMubGVuZ3RoOworICAgIHZhciBjb21wb25lbnQsIGksIGosIGssIG47CisgICAgdmFyIGRlY29kZUZuOworCisgICAgaWYgKHByb2dyZXNzaXZlKSB7CisgICAgICBpZiAoc3BlY3RyYWxTdGFydCA9PT0gMCkgeworICAgICAgICBkZWNvZGVGbiA9IHN1Y2Nlc3NpdmVQcmV2ID09PSAwID8gZGVjb2RlRENGaXJzdCA6IGRlY29kZURDU3VjY2Vzc2l2ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVBQ0ZpcnN0IDogZGVjb2RlQUNTdWNjZXNzaXZlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBkZWNvZGVGbiA9IGRlY29kZUJhc2VsaW5lOworICAgIH0KKworICAgIHZhciBtY3UgPSAwLAorICAgICAgICBmaWxlTWFya2VyOworICAgIHZhciBtY3VFeHBlY3RlZDsKKworICAgIGlmIChjb21wb25lbnRzTGVuZ3RoID09PSAxKSB7CisgICAgICBtY3VFeHBlY3RlZCA9IGNvbXBvbmVudHNbMF0uYmxvY2tzUGVyTGluZSAqIGNvbXBvbmVudHNbMF0uYmxvY2tzUGVyQ29sdW1uOworICAgIH0gZWxzZSB7CisgICAgICBtY3VFeHBlY3RlZCA9IG1jdXNQZXJMaW5lICogZnJhbWUubWN1c1BlckNvbHVtbjsKKyAgICB9CisKKyAgICB2YXIgaCwgdjsKKworICAgIHdoaWxlIChtY3UgPD0gbWN1RXhwZWN0ZWQpIHsKKyAgICAgIHZhciBtY3VUb1JlYWQgPSByZXNldEludGVydmFsID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpIDogbWN1RXhwZWN0ZWQ7CisKKyAgICAgIGlmIChtY3VUb1JlYWQgPiAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBjb21wb25lbnRzW2ldLnByZWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgZW9icnVuID0gMDsKKworICAgICAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkgeworICAgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbMF07CisKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHsKKyAgICAgICAgICAgIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlRm4sIG1jdSk7CisgICAgICAgICAgICBtY3UrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG1jdVRvUmVhZDsgbisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07CisgICAgICAgICAgICAgIGggPSBjb21wb25lbnQuaDsKKyAgICAgICAgICAgICAgdiA9IGNvbXBvbmVudC52OworCisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2OyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaDsgaysrKSB7CisgICAgICAgICAgICAgICAgICBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1LCBqLCBrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWN1Kys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJpdHNDb3VudCA9IDA7CisgICAgICBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIG9mZnNldCk7CisKKyAgICAgIGlmICghZmlsZU1hcmtlcikgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkgeworICAgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/ICJ1bmV4cGVjdGVkIiA6ICJleGNlc3NpdmUiOworICAgICAgICAoMCwgX3V0aWwud2FybikoYGRlY29kZVNjYW4gLSAke3BhcnRpYWxNc2d9IE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogJHtmaWxlTWFya2VyLmludmFsaWR9YCk7CisgICAgICAgIG9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0OworICAgICAgfQorCisgICAgICBpZiAoZmlsZU1hcmtlci5tYXJrZXIgPj0gMHhmZmQwICYmIGZpbGVNYXJrZXIubWFya2VyIDw9IDB4ZmZkNykgeworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDsKKyAgfQorCisgIGZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIGJsb2NrQnVmZmVyT2Zmc2V0LCBwKSB7CisgICAgdmFyIHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLAorICAgICAgICBibG9ja0RhdGEgPSBjb21wb25lbnQuYmxvY2tEYXRhOworICAgIHZhciB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2Niwgdjc7CisgICAgdmFyIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNzsKKyAgICB2YXIgdDsKKworICAgIGlmICghcXQpIHsKKyAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpOworICAgIH0KKworICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IDY0OyByb3cgKz0gOCkgeworICAgICAgcDAgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3ddOworICAgICAgcDEgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAxXTsKKyAgICAgIHAyID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMl07CisgICAgICBwMyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDNdOworICAgICAgcDQgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA0XTsKKyAgICAgIHA1ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNV07CisgICAgICBwNiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDZdOworICAgICAgcDcgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA3XTsKKyAgICAgIHAwICo9IHF0W3Jvd107CisKKyAgICAgIGlmICgocDEgfCBwMiB8IHAzIHwgcDQgfCBwNSB8IHA2IHwgcDcpID09PSAwKSB7CisgICAgICAgIHQgPSBkY3RTcXJ0MiAqIHAwICsgNTEyID4+IDEwOworICAgICAgICBwW3Jvd10gPSB0OworICAgICAgICBwW3JvdyArIDFdID0gdDsKKyAgICAgICAgcFtyb3cgKyAyXSA9IHQ7CisgICAgICAgIHBbcm93ICsgM10gPSB0OworICAgICAgICBwW3JvdyArIDRdID0gdDsKKyAgICAgICAgcFtyb3cgKyA1XSA9IHQ7CisgICAgICAgIHBbcm93ICsgNl0gPSB0OworICAgICAgICBwW3JvdyArIDddID0gdDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHAxICo9IHF0W3JvdyArIDFdOworICAgICAgcDIgKj0gcXRbcm93ICsgMl07CisgICAgICBwMyAqPSBxdFtyb3cgKyAzXTsKKyAgICAgIHA0ICo9IHF0W3JvdyArIDRdOworICAgICAgcDUgKj0gcXRbcm93ICsgNV07CisgICAgICBwNiAqPSBxdFtyb3cgKyA2XTsKKyAgICAgIHA3ICo9IHF0W3JvdyArIDddOworICAgICAgdjAgPSBkY3RTcXJ0MiAqIHAwICsgMTI4ID4+IDg7CisgICAgICB2MSA9IGRjdFNxcnQyICogcDQgKyAxMjggPj4gODsKKyAgICAgIHYyID0gcDI7CisgICAgICB2MyA9IHA2OworICAgICAgdjQgPSBkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMTI4ID4+IDg7CisgICAgICB2NyA9IGRjdFNxcnQxZDIgKiAocDEgKyBwNykgKyAxMjggPj4gODsKKyAgICAgIHY1ID0gcDMgPDwgNDsKKyAgICAgIHY2ID0gcDUgPDwgNDsKKyAgICAgIHYwID0gdjAgKyB2MSArIDEgPj4gMTsKKyAgICAgIHYxID0gdjAgLSB2MTsKKyAgICAgIHQgPSB2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAxMjggPj4gODsKKyAgICAgIHYyID0gdjIgKiBkY3RDb3M2IC0gdjMgKiBkY3RTaW42ICsgMTI4ID4+IDg7CisgICAgICB2MyA9IHQ7CisgICAgICB2NCA9IHY0ICsgdjYgKyAxID4+IDE7CisgICAgICB2NiA9IHY0IC0gdjY7CisgICAgICB2NyA9IHY3ICsgdjUgKyAxID4+IDE7CisgICAgICB2NSA9IHY3IC0gdjU7CisgICAgICB2MCA9IHYwICsgdjMgKyAxID4+IDE7CisgICAgICB2MyA9IHYwIC0gdjM7CisgICAgICB2MSA9IHYxICsgdjIgKyAxID4+IDE7CisgICAgICB2MiA9IHYxIC0gdjI7CisgICAgICB0ID0gdjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCA+PiAxMjsKKyAgICAgIHY0ID0gdjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCA+PiAxMjsKKyAgICAgIHY3ID0gdDsKKyAgICAgIHQgPSB2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4ID4+IDEyOworICAgICAgdjUgPSB2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4ID4+IDEyOworICAgICAgdjYgPSB0OworICAgICAgcFtyb3ddID0gdjAgKyB2NzsKKyAgICAgIHBbcm93ICsgN10gPSB2MCAtIHY3OworICAgICAgcFtyb3cgKyAxXSA9IHYxICsgdjY7CisgICAgICBwW3JvdyArIDZdID0gdjEgLSB2NjsKKyAgICAgIHBbcm93ICsgMl0gPSB2MiArIHY1OworICAgICAgcFtyb3cgKyA1XSA9IHYyIC0gdjU7CisgICAgICBwW3JvdyArIDNdID0gdjMgKyB2NDsKKyAgICAgIHBbcm93ICsgNF0gPSB2MyAtIHY0OworICAgIH0KKworICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IDg7ICsrY29sKSB7CisgICAgICBwMCA9IHBbY29sXTsKKyAgICAgIHAxID0gcFtjb2wgKyA4XTsKKyAgICAgIHAyID0gcFtjb2wgKyAxNl07CisgICAgICBwMyA9IHBbY29sICsgMjRdOworICAgICAgcDQgPSBwW2NvbCArIDMyXTsKKyAgICAgIHA1ID0gcFtjb2wgKyA0MF07CisgICAgICBwNiA9IHBbY29sICsgNDhdOworICAgICAgcDcgPSBwW2NvbCArIDU2XTsKKworICAgICAgaWYgKChwMSB8IHAyIHwgcDMgfCBwNCB8IHA1IHwgcDYgfCBwNykgPT09IDApIHsKKyAgICAgICAgdCA9IGRjdFNxcnQyICogcDAgKyA4MTkyID4+IDE0OworCisgICAgICAgIGlmICh0IDwgLTIwNDApIHsKKyAgICAgICAgICB0ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh0ID49IDIwMjQpIHsKKyAgICAgICAgICB0ID0gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHQgPSB0ICsgMjA1NiA+PiA0OworICAgICAgICB9CisKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gdDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHYwID0gZGN0U3FydDIgKiBwMCArIDIwNDggPj4gMTI7CisgICAgICB2MSA9IGRjdFNxcnQyICogcDQgKyAyMDQ4ID4+IDEyOworICAgICAgdjIgPSBwMjsKKyAgICAgIHYzID0gcDY7CisgICAgICB2NCA9IGRjdFNxcnQxZDIgKiAocDEgLSBwNykgKyAyMDQ4ID4+IDEyOworICAgICAgdjcgPSBkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMjA0OCA+PiAxMjsKKyAgICAgIHY1ID0gcDM7CisgICAgICB2NiA9IHA1OworICAgICAgdjAgPSAodjAgKyB2MSArIDEgPj4gMSkgKyA0MTEyOworICAgICAgdjEgPSB2MCAtIHYxOworICAgICAgdCA9IHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDIwNDggPj4gMTI7CisgICAgICB2MiA9IHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDIwNDggPj4gMTI7CisgICAgICB2MyA9IHQ7CisgICAgICB2NCA9IHY0ICsgdjYgKyAxID4+IDE7CisgICAgICB2NiA9IHY0IC0gdjY7CisgICAgICB2NyA9IHY3ICsgdjUgKyAxID4+IDE7CisgICAgICB2NSA9IHY3IC0gdjU7CisgICAgICB2MCA9IHYwICsgdjMgKyAxID4+IDE7CisgICAgICB2MyA9IHYwIC0gdjM7CisgICAgICB2MSA9IHYxICsgdjIgKyAxID4+IDE7CisgICAgICB2MiA9IHYxIC0gdjI7CisgICAgICB0ID0gdjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCA+PiAxMjsKKyAgICAgIHY0ID0gdjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCA+PiAxMjsKKyAgICAgIHY3ID0gdDsKKyAgICAgIHQgPSB2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4ID4+IDEyOworICAgICAgdjUgPSB2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4ID4+IDEyOworICAgICAgdjYgPSB0OworICAgICAgcDAgPSB2MCArIHY3OworICAgICAgcDcgPSB2MCAtIHY3OworICAgICAgcDEgPSB2MSArIHY2OworICAgICAgcDYgPSB2MSAtIHY2OworICAgICAgcDIgPSB2MiArIHY1OworICAgICAgcDUgPSB2MiAtIHY1OworICAgICAgcDMgPSB2MyArIHY0OworICAgICAgcDQgPSB2MyAtIHY0OworCisgICAgICBpZiAocDAgPCAxNikgeworICAgICAgICBwMCA9IDA7CisgICAgICB9IGVsc2UgaWYgKHAwID49IDQwODApIHsKKyAgICAgICAgcDAgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwMCA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHAxIDwgMTYpIHsKKyAgICAgICAgcDEgPSAwOworICAgICAgfSBlbHNlIGlmIChwMSA+PSA0MDgwKSB7CisgICAgICAgIHAxID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDEgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwMiA8IDE2KSB7CisgICAgICAgIHAyID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDIgPj0gNDA4MCkgeworICAgICAgICBwMiA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHAyID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDMgPCAxNikgeworICAgICAgICBwMyA9IDA7CisgICAgICB9IGVsc2UgaWYgKHAzID49IDQwODApIHsKKyAgICAgICAgcDMgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwMyA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHA0IDwgMTYpIHsKKyAgICAgICAgcDQgPSAwOworICAgICAgfSBlbHNlIGlmIChwNCA+PSA0MDgwKSB7CisgICAgICAgIHA0ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDQgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwNSA8IDE2KSB7CisgICAgICAgIHA1ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDUgPj0gNDA4MCkgeworICAgICAgICBwNSA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHA1ID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDYgPCAxNikgeworICAgICAgICBwNiA9IDA7CisgICAgICB9IGVsc2UgaWYgKHA2ID49IDQwODApIHsKKyAgICAgICAgcDYgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwNiA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHA3IDwgMTYpIHsKKyAgICAgICAgcDcgPSAwOworICAgICAgfSBlbHNlIGlmIChwNyA+PSA0MDgwKSB7CisgICAgICAgIHA3ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDcgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbF0gPSBwMDsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gcDE7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSBwMjsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDI0XSA9IHAzOworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gcDQ7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSBwNTsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQ4XSA9IHA2OworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gcDc7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpIHsKKyAgICB2YXIgYmxvY2tzUGVyTGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOworICAgIHZhciBibG9ja3NQZXJDb2x1bW4gPSBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uOworICAgIHZhciBjb21wdXRhdGlvbkJ1ZmZlciA9IG5ldyBJbnQxNkFycmF5KDY0KTsKKworICAgIGZvciAodmFyIGJsb2NrUm93ID0gMDsgYmxvY2tSb3cgPCBibG9ja3NQZXJDb2x1bW47IGJsb2NrUm93KyspIHsKKyAgICAgIGZvciAodmFyIGJsb2NrQ29sID0gMDsgYmxvY2tDb2wgPCBibG9ja3NQZXJMaW5lOyBibG9ja0NvbCsrKSB7CisgICAgICAgIHZhciBvZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CisgICAgICAgIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIG9mZnNldCwgY29tcHV0YXRpb25CdWZmZXIpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhOworICB9CisKKyAgZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGN1cnJlbnRQb3MsIHN0YXJ0UG9zID0gY3VycmVudFBvcykgeworICAgIGNvbnN0IG1heFBvcyA9IGRhdGEubGVuZ3RoIC0gMTsKKyAgICB2YXIgbmV3UG9zID0gc3RhcnRQb3MgPCBjdXJyZW50UG9zID8gc3RhcnRQb3MgOiBjdXJyZW50UG9zOworCisgICAgaWYgKGN1cnJlbnRQb3MgPj0gbWF4UG9zKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgY3VycmVudE1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBjdXJyZW50UG9zKTsKKworICAgIGlmIChjdXJyZW50TWFya2VyID49IDB4ZmZjMCAmJiBjdXJyZW50TWFya2VyIDw9IDB4ZmZmZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgaW52YWxpZDogbnVsbCwKKyAgICAgICAgbWFya2VyOiBjdXJyZW50TWFya2VyLAorICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQb3MKKyAgICAgIH07CisgICAgfQorCisgICAgdmFyIG5ld01hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBuZXdQb3MpOworCisgICAgd2hpbGUgKCEobmV3TWFya2VyID49IDB4ZmZjMCAmJiBuZXdNYXJrZXIgPD0gMHhmZmZlKSkgeworICAgICAgaWYgKCsrbmV3UG9zID49IG1heFBvcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgbmV3TWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG5ld1Bvcyk7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGludmFsaWQ6IGN1cnJlbnRNYXJrZXIudG9TdHJpbmcoMTYpLAorICAgICAgbWFya2VyOiBuZXdNYXJrZXIsCisgICAgICBvZmZzZXQ6IG5ld1BvcworICAgIH07CisgIH0KKworICBKcGVnSW1hZ2UucHJvdG90eXBlID0geworICAgIHBhcnNlKGRhdGEsIHsKKyAgICAgIGRubFNjYW5MaW5lcyA9IG51bGwKKyAgICB9ID0ge30pIHsKKyAgICAgIGZ1bmN0aW9uIHJlYWREYXRhQmxvY2soKSB7CisgICAgICAgIGNvbnN0IGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgbGV0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7CisgICAgICAgIHZhciBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGVuZE9mZnNldCwgb2Zmc2V0KTsKKworICAgICAgICBpZiAoZmlsZU1hcmtlciAmJiBmaWxlTWFya2VyLmludmFsaWQpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIiArIGZpbGVNYXJrZXIuaW52YWxpZCk7CisgICAgICAgICAgZW5kT2Zmc2V0ID0gZmlsZU1hcmtlci5vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYXJyYXkgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgZW5kT2Zmc2V0KTsKKyAgICAgICAgb2Zmc2V0ICs9IGFycmF5Lmxlbmd0aDsKKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBwcmVwYXJlQ29tcG9uZW50cyhmcmFtZSkgeworICAgICAgICB2YXIgbWN1c1BlckxpbmUgPSBNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4IC8gZnJhbWUubWF4SCk7CisgICAgICAgIHZhciBtY3VzUGVyQ29sdW1uID0gTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDggLyBmcmFtZS5tYXhWKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2ldOworICAgICAgICAgIHZhciBibG9ja3NQZXJMaW5lID0gTWF0aC5jZWlsKE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDgpICogY29tcG9uZW50LmggLyBmcmFtZS5tYXhIKTsKKyAgICAgICAgICB2YXIgYmxvY2tzUGVyQ29sdW1uID0gTWF0aC5jZWlsKE1hdGguY2VpbChmcmFtZS5zY2FuTGluZXMgLyA4KSAqIGNvbXBvbmVudC52IC8gZnJhbWUubWF4Vik7CisgICAgICAgICAgdmFyIGJsb2Nrc1BlckxpbmVGb3JNY3UgPSBtY3VzUGVyTGluZSAqIGNvbXBvbmVudC5oOworICAgICAgICAgIHZhciBibG9ja3NQZXJDb2x1bW5Gb3JNY3UgPSBtY3VzUGVyQ29sdW1uICogY29tcG9uZW50LnY7CisgICAgICAgICAgdmFyIGJsb2Nrc0J1ZmZlclNpemUgPSA2NCAqIGJsb2Nrc1BlckNvbHVtbkZvck1jdSAqIChibG9ja3NQZXJMaW5lRm9yTWN1ICsgMSk7CisgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YSA9IG5ldyBJbnQxNkFycmF5KGJsb2Nrc0J1ZmZlclNpemUpOworICAgICAgICAgIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lID0gYmxvY2tzUGVyTGluZTsKKyAgICAgICAgICBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uID0gYmxvY2tzUGVyQ29sdW1uOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWUubWN1c1BlckxpbmUgPSBtY3VzUGVyTGluZTsKKyAgICAgICAgZnJhbWUubWN1c1BlckNvbHVtbiA9IG1jdXNQZXJDb2x1bW47CisgICAgICB9CisKKyAgICAgIHZhciBvZmZzZXQgPSAwOworICAgICAgdmFyIGpmaWYgPSBudWxsOworICAgICAgdmFyIGFkb2JlID0gbnVsbDsKKyAgICAgIHZhciBmcmFtZSwgcmVzZXRJbnRlcnZhbDsKKyAgICAgIGxldCBudW1TT1NNYXJrZXJzID0gMDsKKyAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTsKKyAgICAgIHZhciBodWZmbWFuVGFibGVzQUMgPSBbXSwKKyAgICAgICAgICBodWZmbWFuVGFibGVzREMgPSBbXTsKKyAgICAgIGxldCBmaWxlTWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgaWYgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOCkgeworICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJTT0kgbm90IGZvdW5kIik7CisgICAgICB9CisKKyAgICAgIGZpbGVNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCArPSAyOworCisgICAgICBtYXJrZXJMb29wOiB3aGlsZSAoZmlsZU1hcmtlciAhPT0gMHhmZmQ5KSB7CisgICAgICAgIHZhciBpLCBqLCBsOworCisgICAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikgeworICAgICAgICAgIGNhc2UgMHhmZmUwOgorICAgICAgICAgIGNhc2UgMHhmZmUxOgorICAgICAgICAgIGNhc2UgMHhmZmUyOgorICAgICAgICAgIGNhc2UgMHhmZmUzOgorICAgICAgICAgIGNhc2UgMHhmZmU0OgorICAgICAgICAgIGNhc2UgMHhmZmU1OgorICAgICAgICAgIGNhc2UgMHhmZmU2OgorICAgICAgICAgIGNhc2UgMHhmZmU3OgorICAgICAgICAgIGNhc2UgMHhmZmU4OgorICAgICAgICAgIGNhc2UgMHhmZmU5OgorICAgICAgICAgIGNhc2UgMHhmZmVhOgorICAgICAgICAgIGNhc2UgMHhmZmViOgorICAgICAgICAgIGNhc2UgMHhmZmVjOgorICAgICAgICAgIGNhc2UgMHhmZmVkOgorICAgICAgICAgIGNhc2UgMHhmZmVlOgorICAgICAgICAgIGNhc2UgMHhmZmVmOgorICAgICAgICAgIGNhc2UgMHhmZmZlOgorICAgICAgICAgICAgdmFyIGFwcERhdGEgPSByZWFkRGF0YUJsb2NrKCk7CisKKyAgICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZTApIHsKKyAgICAgICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NGEgJiYgYXBwRGF0YVsxXSA9PT0gMHg0NiAmJiBhcHBEYXRhWzJdID09PSAweDQ5ICYmIGFwcERhdGFbM10gPT09IDB4NDYgJiYgYXBwRGF0YVs0XSA9PT0gMCkgeworICAgICAgICAgICAgICAgIGpmaWYgPSB7CisgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB7CisgICAgICAgICAgICAgICAgICAgIG1ham9yOiBhcHBEYXRhWzVdLAorICAgICAgICAgICAgICAgICAgICBtaW5vcjogYXBwRGF0YVs2XQorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIGRlbnNpdHlVbml0czogYXBwRGF0YVs3XSwKKyAgICAgICAgICAgICAgICAgIHhEZW5zaXR5OiBhcHBEYXRhWzhdIDw8IDggfCBhcHBEYXRhWzldLAorICAgICAgICAgICAgICAgICAgeURlbnNpdHk6IGFwcERhdGFbMTBdIDw8IDggfCBhcHBEYXRhWzExXSwKKyAgICAgICAgICAgICAgICAgIHRodW1iV2lkdGg6IGFwcERhdGFbMTJdLAorICAgICAgICAgICAgICAgICAgdGh1bWJIZWlnaHQ6IGFwcERhdGFbMTNdLAorICAgICAgICAgICAgICAgICAgdGh1bWJEYXRhOiBhcHBEYXRhLnN1YmFycmF5KDE0LCAxNCArIDMgKiBhcHBEYXRhWzEyXSAqIGFwcERhdGFbMTNdKQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpbGVNYXJrZXIgPT09IDB4ZmZlZSkgeworICAgICAgICAgICAgICBpZiAoYXBwRGF0YVswXSA9PT0gMHg0MSAmJiBhcHBEYXRhWzFdID09PSAweDY0ICYmIGFwcERhdGFbMl0gPT09IDB4NmYgJiYgYXBwRGF0YVszXSA9PT0gMHg2MiAmJiBhcHBEYXRhWzRdID09PSAweDY1KSB7CisgICAgICAgICAgICAgICAgYWRvYmUgPSB7CisgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBhcHBEYXRhWzVdIDw8IDggfCBhcHBEYXRhWzZdLAorICAgICAgICAgICAgICAgICAgZmxhZ3MwOiBhcHBEYXRhWzddIDw8IDggfCBhcHBEYXRhWzhdLAorICAgICAgICAgICAgICAgICAgZmxhZ3MxOiBhcHBEYXRhWzldIDw8IDggfCBhcHBEYXRhWzEwXSwKKyAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUNvZGU6IGFwcERhdGFbMTFdCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmRiOgorICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXNFbmQgPSBxdWFudGl6YXRpb25UYWJsZXNMZW5ndGggKyBvZmZzZXQgLSAyOworICAgICAgICAgICAgdmFyIHo7CisKKyAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBxdWFudGl6YXRpb25UYWJsZXNFbmQpIHsKKyAgICAgICAgICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICB2YXIgdGFibGVEYXRhID0gbmV3IFVpbnQxNkFycmF5KDY0KTsKKworICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTsKKyAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisgICAgICAgICAgICAgICAgICB6ID0gZGN0WmlnWmFnW2pdOworICAgICAgICAgICAgICAgICAgdGFibGVEYXRhW3pdID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiRFFUIC0gaW52YWxpZCB0YWJsZSBzcGVjIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmMwOgorICAgICAgICAgIGNhc2UgMHhmZmMxOgorICAgICAgICAgIGNhc2UgMHhmZmMyOgorICAgICAgICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIk9ubHkgc2luZ2xlIGZyYW1lIEpQRUdzIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGZyYW1lID0ge307CisgICAgICAgICAgICBmcmFtZS5leHRlbmRlZCA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMTsKKyAgICAgICAgICAgIGZyYW1lLnByb2dyZXNzaXZlID0gZmlsZU1hcmtlciA9PT0gMHhmZmMyOworICAgICAgICAgICAgZnJhbWUucHJlY2lzaW9uID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICBjb25zdCBzb2ZTY2FuTGluZXMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgZnJhbWUuc2NhbkxpbmVzID0gZG5sU2NhbkxpbmVzIHx8IHNvZlNjYW5MaW5lczsKKyAgICAgICAgICAgIGZyYW1lLnNhbXBsZXNQZXJMaW5lID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudHMgPSBbXTsKKyAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkcyA9IHt9OworICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IGRhdGFbb2Zmc2V0KytdLAorICAgICAgICAgICAgICAgIGNvbXBvbmVudElkOworICAgICAgICAgICAgdmFyIG1heEggPSAwLAorICAgICAgICAgICAgICAgIG1heFYgPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07CisgICAgICAgICAgICAgIHZhciBoID0gZGF0YVtvZmZzZXQgKyAxXSA+PiA0OworICAgICAgICAgICAgICB2YXIgdiA9IGRhdGFbb2Zmc2V0ICsgMV0gJiAxNTsKKworICAgICAgICAgICAgICBpZiAobWF4SCA8IGgpIHsKKyAgICAgICAgICAgICAgICBtYXhIID0gaDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChtYXhWIDwgdikgeworICAgICAgICAgICAgICAgIG1heFYgPSB2OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07CisgICAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goeworICAgICAgICAgICAgICAgIGgsCisgICAgICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLAorICAgICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHNbY29tcG9uZW50SWRdID0gbCAtIDE7CisgICAgICAgICAgICAgIG9mZnNldCArPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZS5tYXhIID0gbWF4SDsKKyAgICAgICAgICAgIGZyYW1lLm1heFYgPSBtYXhWOworICAgICAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZjNDoKKyAgICAgICAgICAgIGNvbnN0IGh1ZmZtYW5MZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgaHVmZm1hbkxlbmd0aDspIHsKKyAgICAgICAgICAgICAgdmFyIGh1ZmZtYW5UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgICAgdmFyIGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoMTYpOworICAgICAgICAgICAgICB2YXIgY29kZUxlbmd0aFN1bSA9IDA7CisKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyssIG9mZnNldCsrKSB7CisgICAgICAgICAgICAgICAgY29kZUxlbmd0aFN1bSArPSBjb2RlTGVuZ3Roc1tqXSA9IGRhdGFbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7CisKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGVMZW5ndGhTdW07IGorKywgb2Zmc2V0KyspIHsKKyAgICAgICAgICAgICAgICBodWZmbWFuVmFsdWVzW2pdID0gZGF0YVtvZmZzZXRdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaSArPSAxNyArIGNvZGVMZW5ndGhTdW07CisgICAgICAgICAgICAgIChodWZmbWFuVGFibGVTcGVjID4+IDQgPT09IDAgPyBodWZmbWFuVGFibGVzREMgOiBodWZmbWFuVGFibGVzQUMpW2h1ZmZtYW5UYWJsZVNwZWMgJiAxNV0gPSBidWlsZEh1ZmZtYW5UYWJsZShjb2RlTGVuZ3RocywgaHVmZm1hblZhbHVlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZGQ6CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHJlc2V0SW50ZXJ2YWwgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZkYToKKyAgICAgICAgICAgIGNvbnN0IHBhcnNlRE5MTWFya2VyID0gKytudW1TT1NNYXJrZXJzID09PSAxICYmICFkbmxTY2FuTGluZXM7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHZhciBzZWxlY3RvcnNDb3VudCA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXSwKKyAgICAgICAgICAgICAgICBjb21wb25lbnQ7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgIHZhciBjb21wb25lbnRJbmRleCA9IGZyYW1lLmNvbXBvbmVudElkc1tpbmRleF07CisgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbY29tcG9uZW50SW5kZXhdOworICAgICAgICAgICAgICBjb21wb25lbnQuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgdmFyIHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlREMgPSBodWZmbWFuVGFibGVzRENbdGFibGVTcGVjID4+IDRdOworICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlQUMgPSBodWZmbWFuVGFibGVzQUNbdGFibGVTcGVjICYgMTVdOworICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNwZWN0cmFsU3RhcnQgPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgIHZhciBzcGVjdHJhbEVuZCA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgdmFyIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID0gZGF0YVtvZmZzZXQrK107CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHZhciBwcm9jZXNzZWQgPSBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA+PiA0LCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LCBwYXJzZUROTE1hcmtlcik7CisgICAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7CisgICAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgJHtleC5tZXNzYWdlfSAtLSBhdHRlbXB0aW5nIHRvIHJlLXBhcnNlIHRoZSBKUEVHIGltYWdlLmApOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlKGRhdGEsIHsKKyAgICAgICAgICAgICAgICAgIGRubFNjYW5MaW5lczogZXguc2NhbkxpbmVzCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFT0lNYXJrZXJFcnJvcikgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgJHtleC5tZXNzYWdlfSAtLSBpZ25vcmluZyB0aGUgcmVzdCBvZiB0aGUgaW1hZ2UgZGF0YS5gKTsKKyAgICAgICAgICAgICAgICBicmVhayBtYXJrZXJMb29wOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZGM6CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZmY6CisgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CisgICAgICAgICAgICAgIG9mZnNldC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjb25zdCBuZXh0RmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBvZmZzZXQgLSAyLCBvZmZzZXQgLSAzKTsKKworICAgICAgICAgICAgaWYgKG5leHRGaWxlTWFya2VyICYmIG5leHRGaWxlTWFya2VyLmludmFsaWQpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAiICsgbmV4dEZpbGVNYXJrZXIuaW52YWxpZCk7CisgICAgICAgICAgICAgIG9mZnNldCA9IG5leHRGaWxlTWFya2VyLm9mZnNldDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gZGF0YS5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhICIgKyAid2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuIik7CisgICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiAiICsgZmlsZU1hcmtlci50b1N0cmluZygxNikpOworICAgICAgICB9CisKKyAgICAgICAgZmlsZU1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIH0KKworICAgICAgdGhpcy53aWR0aCA9IGZyYW1lLnNhbXBsZXNQZXJMaW5lOworICAgICAgdGhpcy5oZWlnaHQgPSBmcmFtZS5zY2FuTGluZXM7CisgICAgICB0aGlzLmpmaWYgPSBqZmlmOworICAgICAgdGhpcy5hZG9iZSA9IGFkb2JlOworICAgICAgdGhpcy5jb21wb25lbnRzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS5jb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbaV07CisgICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlc1tjb21wb25lbnQucXVhbnRpemF0aW9uSWRdOworCisgICAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZSkgeworICAgICAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goeworICAgICAgICAgIGluZGV4OiBjb21wb25lbnQuaW5kZXgsCisgICAgICAgICAgb3V0cHV0OiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCksCisgICAgICAgICAgc2NhbGVYOiBjb21wb25lbnQuaCAvIGZyYW1lLm1heEgsCisgICAgICAgICAgc2NhbGVZOiBjb21wb25lbnQudiAvIGZyYW1lLm1heFYsCisgICAgICAgICAgYmxvY2tzUGVyTGluZTogY29tcG9uZW50LmJsb2Nrc1BlckxpbmUsCisgICAgICAgICAgYmxvY2tzUGVyQ29sdW1uOiBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLm51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9LAorCisgICAgX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCwgaXNTb3VyY2VQREYgPSBmYWxzZSkgeworICAgICAgdmFyIHNjYWxlWCA9IHRoaXMud2lkdGggLyB3aWR0aCwKKyAgICAgICAgICBzY2FsZVkgPSB0aGlzLmhlaWdodCAvIGhlaWdodDsKKyAgICAgIHZhciBjb21wb25lbnQsIGNvbXBvbmVudFNjYWxlWCwgY29tcG9uZW50U2NhbGVZLCBibG9ja3NQZXJTY2FubGluZTsKKyAgICAgIHZhciB4LCB5LCBpLCBqLCBrOworICAgICAgdmFyIGluZGV4OworICAgICAgdmFyIG9mZnNldCA9IDA7CisgICAgICB2YXIgb3V0cHV0OworICAgICAgdmFyIG51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOworICAgICAgdmFyIGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7CisgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoKTsKKyAgICAgIHZhciB4U2NhbGVCbG9ja09mZnNldCA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCk7CisgICAgICB2YXIgbWFzazNMU0IgPSAweGZmZmZmZmY4OworICAgICAgbGV0IGxhc3RDb21wb25lbnRTY2FsZVg7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2ldOworICAgICAgICBjb21wb25lbnRTY2FsZVggPSBjb21wb25lbnQuc2NhbGVYICogc2NhbGVYOworICAgICAgICBjb21wb25lbnRTY2FsZVkgPSBjb21wb25lbnQuc2NhbGVZICogc2NhbGVZOworICAgICAgICBvZmZzZXQgPSBpOworICAgICAgICBvdXRwdXQgPSBjb21wb25lbnQub3V0cHV0OworICAgICAgICBibG9ja3NQZXJTY2FubGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lICsgMSA8PCAzOworCisgICAgICAgIGlmIChjb21wb25lbnRTY2FsZVggIT09IGxhc3RDb21wb25lbnRTY2FsZVgpIHsKKyAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaiA9IDAgfCB4ICogY29tcG9uZW50U2NhbGVYOworICAgICAgICAgICAgeFNjYWxlQmxvY2tPZmZzZXRbeF0gPSAoaiAmIG1hc2szTFNCKSA8PCAzIHwgaiAmIDc7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgIGogPSAwIHwgeSAqIGNvbXBvbmVudFNjYWxlWTsKKyAgICAgICAgICBpbmRleCA9IGJsb2Nrc1BlclNjYW5saW5lICogKGogJiBtYXNrM0xTQikgfCAoaiAmIDcpIDw8IDM7CisKKyAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgZGF0YVtvZmZzZXRdID0gb3V0cHV0W2luZGV4ICsgeFNjYWxlQmxvY2tPZmZzZXRbeF1dOworICAgICAgICAgICAgb2Zmc2V0ICs9IG51bUNvbXBvbmVudHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07CisKKyAgICAgIGlmICghaXNTb3VyY2VQREYgJiYgbnVtQ29tcG9uZW50cyA9PT0gNCAmJiAhdHJhbnNmb3JtKSB7CisgICAgICAgIHRyYW5zZm9ybSA9IG5ldyBJbnQzMkFycmF5KFstMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1LCAtMjU2LCAyNTVdKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRyYW5zZm9ybSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDspIHsKKyAgICAgICAgICBmb3IgKGogPSAwLCBrID0gMDsgaiA8IG51bUNvbXBvbmVudHM7IGorKywgaSsrLCBrICs9IDIpIHsKKyAgICAgICAgICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAqIHRyYW5zZm9ybVtrXSA+PiA4KSArIHRyYW5zZm9ybVtrICsgMV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisKKyAgICBnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCkgeworICAgICAgaWYgKHRoaXMuYWRvYmUpIHsKKyAgICAgICAgcmV0dXJuICEhdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzKSB7CisgICAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudHNbMF0uaW5kZXggPT09IDB4NTIgJiYgdGhpcy5jb21wb25lbnRzWzFdLmluZGV4ID09PSAweDQ3ICYmIHRoaXMuY29tcG9uZW50c1syXS5pbmRleCA9PT0gMHg0MikgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgX2NvbnZlcnRZY2NUb1JnYjogZnVuY3Rpb24gY29udmVydFljY1RvUmdiKGRhdGEpIHsKKyAgICAgIHZhciBZLCBDYiwgQ3I7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CisgICAgICAgIFkgPSBkYXRhW2ldOworICAgICAgICBDYiA9IGRhdGFbaSArIDFdOworICAgICAgICBDciA9IGRhdGFbaSArIDJdOworICAgICAgICBkYXRhW2ldID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyOworICAgICAgICBkYXRhW2kgKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CisgICAgICAgIGRhdGFbaSArIDJdID0gWSAtIDIyNi44MTYgKyAxLjc3MiAqIENiOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YTsKKyAgICB9LAorICAgIF9jb252ZXJ0WWNja1RvUmdiOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvUmdiKGRhdGEpIHsKKyAgICAgIHZhciBZLCBDYiwgQ3IsIGs7CisgICAgICB2YXIgb2Zmc2V0ID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgICAgWSA9IGRhdGFbaV07CisgICAgICAgIENiID0gZGF0YVtpICsgMV07CisgICAgICAgIENyID0gZGF0YVtpICsgMl07CisgICAgICAgIGsgPSBkYXRhW2kgKyAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAtMTIyLjY3MTk1NDA2ODk0ICsgQ2IgKiAoLTYuNjA2MzU2Njk0MjAzNjRlLTUgKiBDYiArIDAuMDAwNDM3MTMwNDc1OTI2MjMyICogQ3IgLSA1LjQwODA2MTAwNjQ1OTllLTUgKiBZICsgMC4wMDA0ODQ0OTc5NzEyMDI4MSAqIGsgLSAwLjE1NDM2MjE1MTg3MTEyNikgKyBDciAqICgtMC4wMDA5NTc5NjQzNzg0NDU3NzMgKiBDciArIDAuMDAwODE3MDc2OTExMzQ2NjI1ICogWSAtIDAuMDA0NzcyNzE0MDU0MDg3NDcgKiBrICsgMS41MzM4MDI1MzIyMTczNCkgKyBZICogKDAuMDAwOTYxMjUwMTg0MTMwNjg4ICogWSAtIDAuMDAyNjYyNTczMzIyODM5MzMgKiBrICsgMC40ODM1NzA4ODQ1MTI2NSkgKyBrICogKC0wLjAwMDMzNjE5NzE3NzYxODM5NCAqIGsgKyAwLjQ4NDc5MTU2MTQ5MDc3Nik7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMTA3LjI2ODAzOTM5NzcyNCArIENiICogKDIuMTk5MjcxMDQ1MjU3NDFlLTUgKiBDYiAtIDAuMDAwNjQwOTkyMDE4Mjk3OTQ1ICogQ3IgKyAwLjAwMDY1OTM5NzAwMTI0NTU3NyAqIFkgKyAwLjAwMDQyNjEwNTY1MjkzODgzNyAqIGsgLSAwLjE3NjQ5MTc5MjQ2Mjg3NSkgKyBDciAqICgtMC4wMDA3NzgyNjk5NDE1MTM2ODMgKiBDciArIDAuMDAxMzA4NzIyNjE0MDgyNzUgKiBZICsgMC4wMDA3NzA0ODI2MzE4MDExMzIgKiBrIC0gMC4xNTEwNTE0OTI3NzU1NjIpICsgWSAqICgwLjAwMTI2OTM1MzY4MTE0ODQzICogWSAtIDAuMDAyNjUwOTAxODkwMTA4OTggKiBrICsgMC4yNTgwMjkxMDIwNjg0NSkgKyBrICogKC0wLjAwMDMxODkxMzExNzU4ODMyOCAqIGsgLSAwLjIxMzc0MjQwMDMyMzY2NSk7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gLTIwLjgxMDAxMjU0Njk0NyArIENiICogKC0wLjAwMDU3MDExNTE5Njk3MzY3NyAqIENiIC0gMi42MzQwOTA1MTAwNDU4OWUtNSAqIENyICsgMC4wMDIwNzQxMDg4MTE1MDEyICogWSAtIDAuMDAyODgyNjAyMzY4NTM0NDIgKiBrICsgMC44MTQyNzI5NjgzNTkyOTUpICsgQ3IgKiAoLTEuNTM0OTYwNTc0NDA5NzVlLTUgKiBDciAtIDAuMDAwMTMyNjg5MDQzOTYxNDQ2ICogWSArIDAuMDAwNTYwODMzNjkxMjQyODEyICogayAtIDAuMTk1MTUyMDI3NTM0MDQ5KSArIFkgKiAoMC4wMDE3NDQxODEzMjkyNzU4MiAqIFkgLSAwLjAwMjU1MjQzMzIxNDM5MzQ3ICogayArIDAuMTE2OTM1MDIwNDY1MTQ1KSArIGsgKiAoLTAuMDAwMzQzNTMxOTk2NTEwNTU1ICogayArIDAuMjQxNjUyNjAyMzI0MDcpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YS5zdWJhcnJheSgwLCBvZmZzZXQpOworICAgIH0sCisgICAgX2NvbnZlcnRZY2NrVG9DbXlrOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7CisgICAgICB2YXIgWSwgQ2IsIENyOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgeworICAgICAgICBZID0gZGF0YVtpXTsKKyAgICAgICAgQ2IgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgQ3IgPSBkYXRhW2kgKyAyXTsKKyAgICAgICAgZGF0YVtpXSA9IDQzNC40NTYgLSBZIC0gMS40MDIgKiBDcjsKKyAgICAgICAgZGF0YVtpICsgMV0gPSAxMTkuNTQxIC0gWSArIDAuMzQ0ICogQ2IgKyAwLjcxNCAqIENyOworICAgICAgICBkYXRhW2kgKyAyXSA9IDQ4MS44MTYgLSBZIC0gMS43NzIgKiBDYjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfSwKKyAgICBfY29udmVydENteWtUb1JnYjogZnVuY3Rpb24gY29udmVydENteWtUb1JnYihkYXRhKSB7CisgICAgICB2YXIgYywgbSwgeSwgazsKKyAgICAgIHZhciBvZmZzZXQgPSAwOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgeworICAgICAgICBjID0gZGF0YVtpXTsKKyAgICAgICAgbSA9IGRhdGFbaSArIDFdOworICAgICAgICB5ID0gZGF0YVtpICsgMl07CisgICAgICAgIGsgPSBkYXRhW2kgKyAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKC0wLjAwMDA2NzQ3MTQ3MDczNjAyNDQxICogYyArIDAuMDAwODM3OTI2MjEyMTAxMzcyNyAqIG0gKyAwLjAwMDI4OTQ3MTgxODg2NDMyOTQgKiB5ICsgMC4wMDMyNjQyMzEwNTc1Mzc4MDYgKiBrIC0gMS4xMTg1NjExODY3MjAzOTM3KSArIG0gKiAoMC4wMDAwMjYzNzQxMDc2MTYwODk0MDUgKiBtIC0gMC4wMDAwODYyNjk0OTE1ODYzODU3MiAqIHkgLSAwLjAwMDI3NDg3NjkwNjc0OTk0OTEgKiBrIC0gMC4wMjE1NTY4ODc5NDk3ODk2NykgKyB5ICogKC0wLjAwMDAzODc4MDk5MjEyODY5MzYzICogeSAtIDAuMDAwMzI2NzgwODI3OTQ4NTI4NiAqIGsgKyAwLjA2ODY3NDIyMzg1OTUzNDUpIC0gayAqICgwLjAwMDMzNjE5NzE3NzYxODM5MzcgKiBrICsgMC43NDMwNjU5MTUxMzQyMjU0KTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKDAuMDAwMTM1OTYzNzI4MTM1ODg4NDggKiBjICsgMC4wMDA5MjQ1MzcxMzI1NzM1ODUgKiBtICsgMC4wMDAxMDU2NzM1OTYxODY4MzU5MyAqIHkgKyAwLjAwMDQ3OTE4NjQ2ODc0MzY1MTIgKiBrIC0gMC4zMTA5Njg5NTg3NTE1ODc1KSArIG0gKiAoLTAuMDAwMjM1NDUzNDYxMDgzNzAzNDQgKiBtICsgMC4wMDAyNzAyODQ1MjUzNTM0NzE0ICogeSArIDAuMDAyMDIwMDMwODk3NzMwNzE1NiAqIGsgLSAwLjc0ODgwNTIxNjcwMTU0OTQpICsgeSAqICgwLjAwMDA2ODM0ODE1OTk4MjM1NjYyICogeSArIDAuMDAwMTUxNjg0NTIzNjM0NjA5NzMgKiBrIC0gMC4wOTc1MTkyNzc3NDcyODkzMykgLSBrICogKDAuMDAwMzE4OTEzMTE3NTg4MzI4MTQgKiBrICsgMC43MzY0ODgzODA3NzMzMTY4KTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKDAuMDAwMDEzNTk4NjUwNDExMzg1MzA3ICogYyArIDAuMDAwMTI0MjM5NTYxNzU0OTA4NTEgKiBtICsgMC4wMDA0NzUxOTg1MDk3NTgzNTg5ICogeSAtIDAuMDAwMDAzNjcyOTMxNzQ3NjYzMDQyMiAqIGsgLSAwLjA1NTYyMTg2OTgwMjY0MDM0KSArIG0gKiAoMC4wMDAxNjE0MTM4MDU5ODcyNDY3NiAqIG0gKyAwLjAwMDk2OTIyMzkxMzA3MjUxODYgKiB5ICsgMC4wMDA3NzgyNjkyNDUwMDM2MjUzICogayAtIDAuNDQwMTUyMzIzNjc1MjY0NjMpICsgeSAqICg1LjA2ODg4MjkxNDA2ODc2OWUtNyAqIHkgKyAwLjAwMTc3NzgzNjkwMTEzNzUwNzEgKiBrIC0gMC43NTkxNDU0NjQ5NzQ5NjA5KSAtIGsgKiAoMC4wMDAzNDM1MzE5OTY1MTA1NTUzICogayArIDAuNzA2Mzc3MDE4NjE2MDE0NCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7CisgICAgfSwKKworICAgIGdldERhdGEoeworICAgICAgd2lkdGgsCisgICAgICBoZWlnaHQsCisgICAgICBmb3JjZVJHQiA9IGZhbHNlLAorICAgICAgaXNTb3VyY2VQREYgPSBmYWxzZQorICAgIH0pIHsKKyAgICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPiA0KSB7CisgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTsKKworICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMSAmJiBmb3JjZVJHQikgeworICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgICAgICB2YXIgcmdiRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoICogMyk7CisgICAgICAgIHZhciBvZmZzZXQgPSAwOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgdmFyIGdyYXlDb2xvciA9IGRhdGFbaV07CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmdiRGF0YTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzICYmIHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2IoZGF0YSk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gNCkgeworICAgICAgICBpZiAodGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKKyAgICAgICAgICBpZiAoZm9yY2VSR0IpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvUmdiKGRhdGEpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JjZVJHQikgeworICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICB9OworICByZXR1cm4gSnBlZ0ltYWdlOworfSgpOworCitleHBvcnRzLkpwZWdJbWFnZSA9IEpwZWdJbWFnZTsKKworLyoqKi8gfSksCisvKiAyMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkpweFN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKKwordmFyIF9qcHggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxKTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworY29uc3QgSnB4U3RyZWFtID0gZnVuY3Rpb24gSnB4U3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gSnB4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGRpY3QsIHBhcmFtcykgeworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDsKKyAgICB0aGlzLmRpY3QgPSBkaWN0OworICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworCisgICAgX3N0cmVhbS5EZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBKcHhTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShfc3RyZWFtLkRlY29kZVN0cmVhbS5wcm90b3R5cGUpOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSnB4U3RyZWFtLnByb3RvdHlwZSwgImJ5dGVzIiwgeworICAgIGdldDogZnVuY3Rpb24gSnB4U3RyZWFtX2J5dGVzKCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJieXRlcyIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTsKKyAgICB9LAorICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKworICBKcHhTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlciA9IGZ1bmN0aW9uIChyZXF1ZXN0ZWQpIHt9OworCisgIEpweFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkgeworICAgIGlmICh0aGlzLmVvZikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGpweEltYWdlID0gbmV3IF9qcHguSnB4SW1hZ2UoKTsKKyAgICBqcHhJbWFnZS5wYXJzZSh0aGlzLmJ5dGVzKTsKKyAgICBjb25zdCB3aWR0aCA9IGpweEltYWdlLndpZHRoOworICAgIGNvbnN0IGhlaWdodCA9IGpweEltYWdlLmhlaWdodDsKKyAgICBjb25zdCBjb21wb25lbnRzQ291bnQgPSBqcHhJbWFnZS5jb21wb25lbnRzQ291bnQ7CisgICAgY29uc3QgdGlsZUNvdW50ID0ganB4SW1hZ2UudGlsZXMubGVuZ3RoOworCisgICAgaWYgKHRpbGVDb3VudCA9PT0gMSkgeworICAgICAgdGhpcy5idWZmZXIgPSBqcHhJbWFnZS50aWxlc1swXS5pdGVtczsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIGNvbXBvbmVudHNDb3VudCk7CisKKyAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGlsZUNvdW50OyBrKyspIHsKKyAgICAgICAgY29uc3QgdGlsZUNvbXBvbmVudHMgPSBqcHhJbWFnZS50aWxlc1trXTsKKyAgICAgICAgY29uc3QgdGlsZVdpZHRoID0gdGlsZUNvbXBvbmVudHMud2lkdGg7CisgICAgICAgIGNvbnN0IHRpbGVIZWlnaHQgPSB0aWxlQ29tcG9uZW50cy5oZWlnaHQ7CisgICAgICAgIGNvbnN0IHRpbGVMZWZ0ID0gdGlsZUNvbXBvbmVudHMubGVmdDsKKyAgICAgICAgY29uc3QgdGlsZVRvcCA9IHRpbGVDb21wb25lbnRzLnRvcDsKKyAgICAgICAgY29uc3Qgc3JjID0gdGlsZUNvbXBvbmVudHMuaXRlbXM7CisgICAgICAgIGxldCBzcmNQb3NpdGlvbiA9IDA7CisgICAgICAgIGxldCBkYXRhUG9zaXRpb24gPSAod2lkdGggKiB0aWxlVG9wICsgdGlsZUxlZnQpICogY29tcG9uZW50c0NvdW50OworICAgICAgICBjb25zdCBpbWdSb3dTaXplID0gd2lkdGggKiBjb21wb25lbnRzQ291bnQ7CisgICAgICAgIGNvbnN0IHRpbGVSb3dTaXplID0gdGlsZVdpZHRoICogY29tcG9uZW50c0NvdW50OworCisgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGlsZUhlaWdodDsgaisrKSB7CisgICAgICAgICAgY29uc3Qgcm93Qnl0ZXMgPSBzcmMuc3ViYXJyYXkoc3JjUG9zaXRpb24sIHNyY1Bvc2l0aW9uICsgdGlsZVJvd1NpemUpOworICAgICAgICAgIGRhdGEuc2V0KHJvd0J5dGVzLCBkYXRhUG9zaXRpb24pOworICAgICAgICAgIHNyY1Bvc2l0aW9uICs9IHRpbGVSb3dTaXplOworICAgICAgICAgIGRhdGFQb3NpdGlvbiArPSBpbWdSb3dTaXplOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVmZmVyID0gZGF0YTsKKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyLmxlbmd0aDsKKyAgICB0aGlzLmVvZiA9IHRydWU7CisgIH07CisKKyAgcmV0dXJuIEpweFN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5KcHhTdHJlYW0gPSBKcHhTdHJlYW07CisKKy8qKiovIH0pLAorLyogMjEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5KcHhJbWFnZSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKwordmFyIF9hcml0aG1ldGljX2RlY29kZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKKworY2xhc3MgSnB4RXJyb3IgZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnKSB7CisgICAgc3VwZXIoYEpQWCBlcnJvcjogJHttc2d9YCk7CisgIH0KKworfQorCit2YXIgSnB4SW1hZ2UgPSBmdW5jdGlvbiBKcHhJbWFnZUNsb3N1cmUoKSB7CisgIHZhciBTdWJiYW5kc0dhaW5Mb2cyID0geworICAgIExMOiAwLAorICAgIExIOiAxLAorICAgIEhMOiAxLAorICAgIEhIOiAyCisgIH07CisKKyAgZnVuY3Rpb24gSnB4SW1hZ2UoKSB7CisgICAgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSA9IGZhbHNlOworICB9CisKKyAgSnB4SW1hZ2UucHJvdG90eXBlID0geworICAgIHBhcnNlOiBmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZShkYXRhKSB7CisgICAgICB2YXIgaGVhZCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCAwKTsKKworICAgICAgaWYgKGhlYWQgPT09IDB4ZmY0ZikgeworICAgICAgICB0aGlzLnBhcnNlQ29kZXN0cmVhbShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHBvc2l0aW9uID0gMCwKKyAgICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aDsKKworICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciBoZWFkZXJTaXplID0gODsKKyAgICAgICAgdmFyIGxib3ggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICB2YXIgdGJveCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpOworICAgICAgICBwb3NpdGlvbiArPSBoZWFkZXJTaXplOworCisgICAgICAgIGlmIChsYm94ID09PSAxKSB7CisgICAgICAgICAgbGJveCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgKiA0Mjk0OTY3Mjk2ICsgKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CisgICAgICAgICAgcG9zaXRpb24gKz0gODsKKyAgICAgICAgICBoZWFkZXJTaXplICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGJveCA9PT0gMCkgeworICAgICAgICAgIGxib3ggPSBsZW5ndGggLSBwb3NpdGlvbiArIGhlYWRlclNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGJveCA8IGhlYWRlclNpemUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgYm94IGZpZWxkIHNpemUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkYXRhTGVuZ3RoID0gbGJveCAtIGhlYWRlclNpemU7CisgICAgICAgIHZhciBqdW1wRGF0YUxlbmd0aCA9IHRydWU7CisKKyAgICAgICAgc3dpdGNoICh0Ym94KSB7CisgICAgICAgICAgY2FzZSAweDZhNzAzMjY4OgorICAgICAgICAgICAganVtcERhdGFMZW5ndGggPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDYzNmY2YzcyOgorICAgICAgICAgICAgdmFyIG1ldGhvZCA9IGRhdGFbcG9zaXRpb25dOworCisgICAgICAgICAgICBpZiAobWV0aG9kID09PSAxKSB7CisgICAgICAgICAgICAgIHZhciBjb2xvcnNwYWNlID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMyk7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChjb2xvcnNwYWNlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVua25vd24gY29sb3JzcGFjZSAiICsgY29sb3JzcGFjZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IDIpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJJQ0MgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDZhNzAzMjYzOgorICAgICAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgcG9zaXRpb24sIHBvc2l0aW9uICsgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHg2YTUwMjAyMDoKKyAgICAgICAgICAgIGlmICgoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pICE9PSAweDBkMGE4NzBhKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBKUDIgc2lnbmF0dXJlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDZhNTAxYTFhOgorICAgICAgICAgIGNhc2UgMHg2Njc0Nzk3MDoKKyAgICAgICAgICBjYXNlIDB4NzI3MjY1NzE6CisgICAgICAgICAgY2FzZSAweDcyNjU3MzIwOgorICAgICAgICAgIGNhc2UgMHg2OTY4NjQ3MjoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhciBoZWFkZXJUeXBlID0gU3RyaW5nLmZyb21DaGFyQ29kZSh0Ym94ID4+IDI0ICYgMHhmZiwgdGJveCA+PiAxNiAmIDB4ZmYsIHRib3ggPj4gOCAmIDB4ZmYsIHRib3ggJiAweGZmKTsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgIiArIHRib3ggKyAiICgiICsgaGVhZGVyVHlwZSArICIpIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqdW1wRGF0YUxlbmd0aCkgeworICAgICAgICAgIHBvc2l0aW9uICs9IGRhdGFMZW5ndGg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIHBhcnNlSW1hZ2VQcm9wZXJ0aWVzOiBmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZUltYWdlUHJvcGVydGllcyhzdHJlYW0pIHsKKyAgICAgIHZhciBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKKworICAgICAgd2hpbGUgKG5ld0J5dGUgPj0gMCkgeworICAgICAgICB2YXIgb2xkQnl0ZSA9IG5ld0J5dGU7CisgICAgICAgIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICB2YXIgY29kZSA9IG9sZEJ5dGUgPDwgOCB8IG5ld0J5dGU7CisKKyAgICAgICAgaWYgKGNvZGUgPT09IDB4ZmY1MSkgeworICAgICAgICAgIHN0cmVhbS5za2lwKDQpOworICAgICAgICAgIHZhciBYc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgdmFyIFlzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICB2YXIgWE9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICB2YXIgWU9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICBzdHJlYW0uc2tpcCgxNik7CisgICAgICAgICAgdmFyIENzaXogPSBzdHJlYW0uZ2V0VWludDE2KCk7CisgICAgICAgICAgdGhpcy53aWR0aCA9IFhzaXogLSBYT3NpejsKKyAgICAgICAgICB0aGlzLmhlaWdodCA9IFlzaXogLSBZT3NpejsKKyAgICAgICAgICB0aGlzLmNvbXBvbmVudHNDb3VudCA9IENzaXo7CisgICAgICAgICAgdGhpcy5iaXRzUGVyQ29tcG9uZW50ID0gODsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJObyBzaXplIG1hcmtlciBmb3VuZCBpbiBKUFggc3RyZWFtIik7CisgICAgfSwKKyAgICBwYXJzZUNvZGVzdHJlYW06IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlQ29kZXN0cmVhbShkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgY29udGV4dCA9IHt9OworICAgICAgdmFyIGRvTm90UmVjb3ZlciA9IGZhbHNlOworCisgICAgICB0cnkgeworICAgICAgICB2YXIgcG9zaXRpb24gPSBzdGFydDsKKworICAgICAgICB3aGlsZSAocG9zaXRpb24gKyAxIDwgZW5kKSB7CisgICAgICAgICAgdmFyIGNvZGUgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgICAgdmFyIGxlbmd0aCA9IDAsCisgICAgICAgICAgICAgIGosCisgICAgICAgICAgICAgIHNxY2QsCisgICAgICAgICAgICAgIHNwcWNkcywKKyAgICAgICAgICAgICAgc3BxY2RTaXplLAorICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQsCisgICAgICAgICAgICAgIHRpbGU7CisKKyAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMHhmZjRmOgorICAgICAgICAgICAgICBjb250ZXh0Lm1haW5IZWFkZXIgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmZDk6CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1MToKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdmFyIHNpeiA9IHt9OworICAgICAgICAgICAgICBzaXouWHNpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpOworICAgICAgICAgICAgICBzaXouWXNpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDgpOworICAgICAgICAgICAgICBzaXouWE9zaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAxMik7CisgICAgICAgICAgICAgIHNpei5ZT3NpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDE2KTsKKyAgICAgICAgICAgICAgc2l6LlhUc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMjApOworICAgICAgICAgICAgICBzaXouWVRzaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAyNCk7CisgICAgICAgICAgICAgIHNpei5YVE9zaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAyOCk7CisgICAgICAgICAgICAgIHNpei5ZVE9zaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAzMik7CisgICAgICAgICAgICAgIHZhciBjb21wb25lbnRzQ291bnQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24gKyAzNik7CisgICAgICAgICAgICAgIHNpei5Dc2l6ID0gY29tcG9uZW50c0NvdW50OworICAgICAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdOworICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAzODsKKworICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHsKKyAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogKGRhdGFbal0gJiAweDdmKSArIDEsCisgICAgICAgICAgICAgICAgICBpc1NpZ25lZDogISEoZGF0YVtqXSAmIDB4ODApLAorICAgICAgICAgICAgICAgICAgWFJzaXo6IGRhdGFbaiArIDFdLAorICAgICAgICAgICAgICAgICAgWVJzaXo6IGRhdGFbaiArIDJdCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBqICs9IDM7CisgICAgICAgICAgICAgICAgY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhjb21wb25lbnQsIHNpeik7CisgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb250ZXh0LlNJWiA9IHNpejsKKyAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gY29tcG9uZW50czsKKyAgICAgICAgICAgICAgY2FsY3VsYXRlVGlsZUdyaWRzKGNvbnRleHQsIGNvbXBvbmVudHMpOworICAgICAgICAgICAgICBjb250ZXh0LlFDQyA9IFtdOworICAgICAgICAgICAgICBjb250ZXh0LkNPQyA9IFtdOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNWM6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHZhciBxY2QgPSB7fTsKKyAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjsKKyAgICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKHNxY2QgJiAweDFmKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gODsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIgKyBzcWNkKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHFjZC5ub1F1YW50aXphdGlvbiA9IHNwcWNkU2l6ZSA9PT0gODsKKyAgICAgICAgICAgICAgcWNkLnNjYWxhckV4cG91bmRlZCA9IHNjYWxhckV4cG91bmRlZDsKKyAgICAgICAgICAgICAgcWNkLmd1YXJkQml0cyA9IHNxY2QgPj4gNTsKKyAgICAgICAgICAgICAgc3BxY2RzID0gW107CisKKyAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikgeworICAgICAgICAgICAgICAgIHZhciBzcHFjZCA9IHt9OworCisgICAgICAgICAgICAgICAgaWYgKHNwcWNkU2l6ZSA9PT0gOCkgeworICAgICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbaisrXSA+PiAzOworICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqXSA+PiAzOworICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAoZGF0YVtqXSAmIDB4NykgPDwgOCB8IGRhdGFbaiArIDFdOworICAgICAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwcWNkcy5wdXNoKHNwcWNkKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHFjZC5TUHFjZHMgPSBzcHFjZHM7CisKKyAgICAgICAgICAgICAgaWYgKGNvbnRleHQubWFpbkhlYWRlcikgeworICAgICAgICAgICAgICAgIGNvbnRleHQuUUNEID0gcWNkOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNEID0gcWNkOworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNDID0gW107CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNWQ6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHZhciBxY2MgPSB7fTsKKyAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjsKKyAgICAgICAgICAgICAgdmFyIGNxY2M7CisKKyAgICAgICAgICAgICAgaWYgKGNvbnRleHQuU0laLkNzaXogPCAyNTcpIHsKKyAgICAgICAgICAgICAgICBjcWNjID0gZGF0YVtqKytdOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNxY2MgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgaik7CisgICAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKHNxY2QgJiAweDFmKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gODsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIgKyBzcWNkKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHFjYy5ub1F1YW50aXphdGlvbiA9IHNwcWNkU2l6ZSA9PT0gODsKKyAgICAgICAgICAgICAgcWNjLnNjYWxhckV4cG91bmRlZCA9IHNjYWxhckV4cG91bmRlZDsKKyAgICAgICAgICAgICAgcWNjLmd1YXJkQml0cyA9IHNxY2QgPj4gNTsKKyAgICAgICAgICAgICAgc3BxY2RzID0gW107CisKKyAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikgeworICAgICAgICAgICAgICAgIHNwcWNkID0ge307CisKKyAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7CisgICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7CisgICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7CisgICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IChkYXRhW2pdICYgMHg3KSA8PCA4IHwgZGF0YVtqICsgMV07CisgICAgICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNjLlNQcWNkcyA9IHNwcWNkczsKKworICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5RQ0NbY3FjY10gPSBxY2M7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0NbY3FjY10gPSBxY2M7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNTI6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHZhciBjb2QgPSB7fTsKKyAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjsKKyAgICAgICAgICAgICAgdmFyIHNjb2QgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzID0gISEoc2NvZCAmIDEpOworICAgICAgICAgICAgICBjb2Quc29wTWFya2VyVXNlZCA9ICEhKHNjb2QgJiAyKTsKKyAgICAgICAgICAgICAgY29kLmVwaE1hcmtlclVzZWQgPSAhIShzY29kICYgNCk7CisgICAgICAgICAgICAgIGNvZC5wcm9ncmVzc2lvbk9yZGVyID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2QubGF5ZXJzQ291bnQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgaik7CisgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgICAgY29kLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2QuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2QueGNiID0gKGRhdGFbaisrXSAmIDB4ZikgKyAyOworICAgICAgICAgICAgICBjb2QueWNiID0gKGRhdGFbaisrXSAmIDB4ZikgKyAyOworICAgICAgICAgICAgICB2YXIgYmxvY2tTdHlsZSA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgY29kLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MgPSAhIShibG9ja1N0eWxlICYgMSk7CisgICAgICAgICAgICAgIGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzID0gISEoYmxvY2tTdHlsZSAmIDIpOworICAgICAgICAgICAgICBjb2QudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzID0gISEoYmxvY2tTdHlsZSAmIDQpOworICAgICAgICAgICAgICBjb2QudmVydGljYWxseVN0cmlwZSA9ICEhKGJsb2NrU3R5bGUgJiA4KTsKKyAgICAgICAgICAgICAgY29kLnByZWRpY3RhYmxlVGVybWluYXRpb24gPSAhIShibG9ja1N0eWxlICYgMTYpOworICAgICAgICAgICAgICBjb2Quc2VnbWVudGF0aW9uU3ltYm9sVXNlZCA9ICEhKGJsb2NrU3R5bGUgJiAzMik7CisgICAgICAgICAgICAgIGNvZC5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24gPSBkYXRhW2orK107CisKKyAgICAgICAgICAgICAgaWYgKGNvZC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7CisgICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemVzID0gW107CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICB2YXIgcHJlY2luY3RzU2l6ZSA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgICAgIHByZWNpbmN0c1NpemVzLnB1c2goeworICAgICAgICAgICAgICAgICAgICBQUHg6IHByZWNpbmN0c1NpemUgJiAweGYsCisgICAgICAgICAgICAgICAgICAgIFBQeTogcHJlY2luY3RzU2l6ZSA+PiA0CisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb2QucHJlY2luY3RzU2l6ZXMgPSBwcmVjaW5jdHNTaXplczsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciB1bnN1cHBvcnRlZCA9IFtdOworCisgICAgICAgICAgICAgIGlmIChjb2Quc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcykgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb2QucmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcykgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb2QudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgidGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoY29kLnZlcnRpY2FsbHlTdHJpcGUpIHsKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKCJ2ZXJ0aWNhbGx5U3RyaXBlIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoY29kLnByZWRpY3RhYmxlVGVybWluYXRpb24pIHsKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKCJwcmVkaWN0YWJsZVRlcm1pbmF0aW9uIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWQubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGRvTm90UmVjb3ZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBDT0Qgb3B0aW9ucyAoIiArIHVuc3VwcG9ydGVkLmpvaW4oIiwgIikgKyAiKSIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvbnRleHQubWFpbkhlYWRlcikgeworICAgICAgICAgICAgICAgIGNvbnRleHQuQ09EID0gY29kOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuQ09EID0gY29kOworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuQ09DID0gW107CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmOTA6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHRpbGUgPSB7fTsKKyAgICAgICAgICAgICAgdGlsZS5pbmRleCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbiArIDIpOworICAgICAgICAgICAgICB0aWxlLmxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpOworICAgICAgICAgICAgICB0aWxlLmRhdGFFbmQgPSB0aWxlLmxlbmd0aCArIHBvc2l0aW9uIC0gMjsKKyAgICAgICAgICAgICAgdGlsZS5wYXJ0SW5kZXggPSBkYXRhW3Bvc2l0aW9uICsgOF07CisgICAgICAgICAgICAgIHRpbGUucGFydHNDb3VudCA9IGRhdGFbcG9zaXRpb24gKyA5XTsKKyAgICAgICAgICAgICAgY29udGV4dC5tYWluSGVhZGVyID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgaWYgKHRpbGUucGFydEluZGV4ID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGlsZS5DT0QgPSBjb250ZXh0LkNPRDsKKyAgICAgICAgICAgICAgICB0aWxlLkNPQyA9IGNvbnRleHQuQ09DLnNsaWNlKDApOworICAgICAgICAgICAgICAgIHRpbGUuUUNEID0gY29udGV4dC5RQ0Q7CisgICAgICAgICAgICAgICAgdGlsZS5RQ0MgPSBjb250ZXh0LlFDQy5zbGljZSgwKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUgPSB0aWxlOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmOTM6CisgICAgICAgICAgICAgIHRpbGUgPSBjb250ZXh0LmN1cnJlbnRUaWxlOworCisgICAgICAgICAgICAgIGlmICh0aWxlLnBhcnRJbmRleCA9PT0gMCkgeworICAgICAgICAgICAgICAgIGluaXRpYWxpemVUaWxlKGNvbnRleHQsIHRpbGUuaW5kZXgpOworICAgICAgICAgICAgICAgIGJ1aWxkUGFja2V0cyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGxlbmd0aCA9IHRpbGUuZGF0YUVuZCAtIHBvc2l0aW9uOworICAgICAgICAgICAgICBwYXJzZVRpbGVQYWNrZXRzKGNvbnRleHQsIGRhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNTU6CisgICAgICAgICAgICBjYXNlIDB4ZmY1NzoKKyAgICAgICAgICAgIGNhc2UgMHhmZjU4OgorICAgICAgICAgICAgY2FzZSAweGZmNjQ6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1MzoKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb2Rlc3RyZWFtIGNvZGUgMHhGRjUzIChDT0MpIGlzIG5vdCBpbXBsZW1lbnRlZCIpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29kZXN0cmVhbSBjb2RlOiAiICsgY29kZS50b1N0cmluZygxNikpOworICAgICAgICAgIH0KKworICAgICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBpZiAoZG9Ob3RSZWNvdmVyIHx8IHRoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2UpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoZS5tZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkpQWDogVHJ5aW5nIHRvIHJlY292ZXIgZnJvbTogIiArIGUubWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy50aWxlcyA9IHRyYW5zZm9ybUNvbXBvbmVudHMoY29udGV4dCk7CisgICAgICB0aGlzLndpZHRoID0gY29udGV4dC5TSVouWHNpeiAtIGNvbnRleHQuU0laLlhPc2l6OworICAgICAgdGhpcy5oZWlnaHQgPSBjb250ZXh0LlNJWi5Zc2l6IC0gY29udGV4dC5TSVouWU9zaXo7CisgICAgICB0aGlzLmNvbXBvbmVudHNDb3VudCA9IGNvbnRleHQuU0laLkNzaXo7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnMoY29tcG9uZW50LCBzaXopIHsKKyAgICBjb21wb25lbnQueDAgPSBNYXRoLmNlaWwoc2l6LlhPc2l6IC8gY29tcG9uZW50LlhSc2l6KTsKKyAgICBjb21wb25lbnQueDEgPSBNYXRoLmNlaWwoc2l6LlhzaXogLyBjb21wb25lbnQuWFJzaXopOworICAgIGNvbXBvbmVudC55MCA9IE1hdGguY2VpbChzaXouWU9zaXogLyBjb21wb25lbnQuWVJzaXopOworICAgIGNvbXBvbmVudC55MSA9IE1hdGguY2VpbChzaXouWXNpeiAvIGNvbXBvbmVudC5ZUnNpeik7CisgICAgY29tcG9uZW50LndpZHRoID0gY29tcG9uZW50LngxIC0gY29tcG9uZW50LngwOworICAgIGNvbXBvbmVudC5oZWlnaHQgPSBjb21wb25lbnQueTEgLSBjb21wb25lbnQueTA7CisgIH0KKworICBmdW5jdGlvbiBjYWxjdWxhdGVUaWxlR3JpZHMoY29udGV4dCwgY29tcG9uZW50cykgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZSwKKyAgICAgICAgdGlsZXMgPSBbXTsKKyAgICB2YXIgbnVtWHRpbGVzID0gTWF0aC5jZWlsKChzaXouWHNpeiAtIHNpei5YVE9zaXopIC8gc2l6LlhUc2l6KTsKKyAgICB2YXIgbnVtWXRpbGVzID0gTWF0aC5jZWlsKChzaXouWXNpeiAtIHNpei5ZVE9zaXopIC8gc2l6LllUc2l6KTsKKworICAgIGZvciAodmFyIHEgPSAwOyBxIDwgbnVtWXRpbGVzOyBxKyspIHsKKyAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgbnVtWHRpbGVzOyBwKyspIHsKKyAgICAgICAgdGlsZSA9IHt9OworICAgICAgICB0aWxlLnR4MCA9IE1hdGgubWF4KHNpei5YVE9zaXogKyBwICogc2l6LlhUc2l6LCBzaXouWE9zaXopOworICAgICAgICB0aWxlLnR5MCA9IE1hdGgubWF4KHNpei5ZVE9zaXogKyBxICogc2l6LllUc2l6LCBzaXouWU9zaXopOworICAgICAgICB0aWxlLnR4MSA9IE1hdGgubWluKHNpei5YVE9zaXogKyAocCArIDEpICogc2l6LlhUc2l6LCBzaXouWHNpeik7CisgICAgICAgIHRpbGUudHkxID0gTWF0aC5taW4oc2l6LllUT3NpeiArIChxICsgMSkgKiBzaXouWVRzaXosIHNpei5Zc2l6KTsKKyAgICAgICAgdGlsZS53aWR0aCA9IHRpbGUudHgxIC0gdGlsZS50eDA7CisgICAgICAgIHRpbGUuaGVpZ2h0ID0gdGlsZS50eTEgLSB0aWxlLnR5MDsKKyAgICAgICAgdGlsZS5jb21wb25lbnRzID0gW107CisgICAgICAgIHRpbGVzLnB1c2godGlsZSk7CisgICAgICB9CisgICAgfQorCisgICAgY29udGV4dC50aWxlcyA9IHRpbGVzOworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbXBvbmVudHNDb3VudDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOworCisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSB0aWxlcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIHZhciB0aWxlQ29tcG9uZW50ID0ge307CisgICAgICAgIHRpbGUgPSB0aWxlc1tqXTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC50Y3gwID0gTWF0aC5jZWlsKHRpbGUudHgwIC8gY29tcG9uZW50LlhSc2l6KTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC50Y3kwID0gTWF0aC5jZWlsKHRpbGUudHkwIC8gY29tcG9uZW50LllSc2l6KTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC50Y3gxID0gTWF0aC5jZWlsKHRpbGUudHgxIC8gY29tcG9uZW50LlhSc2l6KTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC50Y3kxID0gTWF0aC5jZWlsKHRpbGUudHkxIC8gY29tcG9uZW50LllSc2l6KTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC53aWR0aCA9IHRpbGVDb21wb25lbnQudGN4MSAtIHRpbGVDb21wb25lbnQudGN4MDsKKyAgICAgICAgdGlsZUNvbXBvbmVudC5oZWlnaHQgPSB0aWxlQ29tcG9uZW50LnRjeTEgLSB0aWxlQ29tcG9uZW50LnRjeTA7CisgICAgICAgIHRpbGUuY29tcG9uZW50c1tpXSA9IHRpbGVDb21wb25lbnQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpIHsKKyAgICB2YXIgY29kT3JDb2MgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzOworICAgIHZhciByZXN1bHQgPSB7fTsKKworICAgIGlmICghY29kT3JDb2MuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cykgeworICAgICAgcmVzdWx0LlBQeCA9IDE1OworICAgICAgcmVzdWx0LlBQeSA9IDE1OworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQuUFB4ID0gY29kT3JDb2MucHJlY2luY3RzU2l6ZXNbcl0uUFB4OworICAgICAgcmVzdWx0LlBQeSA9IGNvZE9yQ29jLnByZWNpbmN0c1NpemVzW3JdLlBQeTsKKyAgICB9CisKKyAgICByZXN1bHQueGNiXyA9IHIgPiAwID8gTWF0aC5taW4oY29kT3JDb2MueGNiLCByZXN1bHQuUFB4IC0gMSkgOiBNYXRoLm1pbihjb2RPckNvYy54Y2IsIHJlc3VsdC5QUHgpOworICAgIHJlc3VsdC55Y2JfID0gciA+IDAgPyBNYXRoLm1pbihjb2RPckNvYy55Y2IsIHJlc3VsdC5QUHkgLSAxKSA6IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkUHJlY2luY3RzKGNvbnRleHQsIHJlc29sdXRpb24sIGRpbWVuc2lvbnMpIHsKKyAgICB2YXIgcHJlY2luY3RXaWR0aCA9IDEgPDwgZGltZW5zaW9ucy5QUHg7CisgICAgdmFyIHByZWNpbmN0SGVpZ2h0ID0gMSA8PCBkaW1lbnNpb25zLlBQeTsKKyAgICB2YXIgaXNaZXJvUmVzID0gcmVzb2x1dGlvbi5yZXNMZXZlbCA9PT0gMDsKKyAgICB2YXIgcHJlY2luY3RXaWR0aEluU3ViYmFuZCA9IDEgPDwgZGltZW5zaW9ucy5QUHggKyAoaXNaZXJvUmVzID8gMCA6IC0xKTsKKyAgICB2YXIgcHJlY2luY3RIZWlnaHRJblN1YmJhbmQgPSAxIDw8IGRpbWVuc2lvbnMuUFB5ICsgKGlzWmVyb1JlcyA/IDAgOiAtMSk7CisgICAgdmFyIG51bXByZWNpbmN0c3dpZGUgPSByZXNvbHV0aW9uLnRyeDEgPiByZXNvbHV0aW9uLnRyeDAgPyBNYXRoLmNlaWwocmVzb2x1dGlvbi50cngxIC8gcHJlY2luY3RXaWR0aCkgLSBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ4MCAvIHByZWNpbmN0V2lkdGgpIDogMDsKKyAgICB2YXIgbnVtcHJlY2luY3RzaGlnaCA9IHJlc29sdXRpb24udHJ5MSA+IHJlc29sdXRpb24udHJ5MCA/IE1hdGguY2VpbChyZXNvbHV0aW9uLnRyeTEgLyBwcmVjaW5jdEhlaWdodCkgLSBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ5MCAvIHByZWNpbmN0SGVpZ2h0KSA6IDA7CisgICAgdmFyIG51bXByZWNpbmN0cyA9IG51bXByZWNpbmN0c3dpZGUgKiBudW1wcmVjaW5jdHNoaWdoOworICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzID0geworICAgICAgcHJlY2luY3RXaWR0aCwKKyAgICAgIHByZWNpbmN0SGVpZ2h0LAorICAgICAgbnVtcHJlY2luY3Rzd2lkZSwKKyAgICAgIG51bXByZWNpbmN0c2hpZ2gsCisgICAgICBudW1wcmVjaW5jdHMsCisgICAgICBwcmVjaW5jdFdpZHRoSW5TdWJiYW5kLAorICAgICAgcHJlY2luY3RIZWlnaHRJblN1YmJhbmQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGRpbWVuc2lvbnMpIHsKKyAgICB2YXIgeGNiXyA9IGRpbWVuc2lvbnMueGNiXzsKKyAgICB2YXIgeWNiXyA9IGRpbWVuc2lvbnMueWNiXzsKKyAgICB2YXIgY29kZWJsb2NrV2lkdGggPSAxIDw8IHhjYl87CisgICAgdmFyIGNvZGVibG9ja0hlaWdodCA9IDEgPDwgeWNiXzsKKyAgICB2YXIgY2J4MCA9IHN1YmJhbmQudGJ4MCA+PiB4Y2JfOworICAgIHZhciBjYnkwID0gc3ViYmFuZC50YnkwID4+IHljYl87CisgICAgdmFyIGNieDEgPSBzdWJiYW5kLnRieDEgKyBjb2RlYmxvY2tXaWR0aCAtIDEgPj4geGNiXzsKKyAgICB2YXIgY2J5MSA9IHN1YmJhbmQudGJ5MSArIGNvZGVibG9ja0hlaWdodCAtIDEgPj4geWNiXzsKKyAgICB2YXIgcHJlY2luY3RQYXJhbWV0ZXJzID0gc3ViYmFuZC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVyczsKKyAgICB2YXIgY29kZWJsb2NrcyA9IFtdOworICAgIHZhciBwcmVjaW5jdHMgPSBbXTsKKyAgICB2YXIgaSwgaiwgY29kZWJsb2NrLCBwcmVjaW5jdE51bWJlcjsKKworICAgIGZvciAoaiA9IGNieTA7IGogPCBjYnkxOyBqKyspIHsKKyAgICAgIGZvciAoaSA9IGNieDA7IGkgPCBjYngxOyBpKyspIHsKKyAgICAgICAgY29kZWJsb2NrID0geworICAgICAgICAgIGNieDogaSwKKyAgICAgICAgICBjYnk6IGosCisgICAgICAgICAgdGJ4MDogY29kZWJsb2NrV2lkdGggKiBpLAorICAgICAgICAgIHRieTA6IGNvZGVibG9ja0hlaWdodCAqIGosCisgICAgICAgICAgdGJ4MTogY29kZWJsb2NrV2lkdGggKiAoaSArIDEpLAorICAgICAgICAgIHRieTE6IGNvZGVibG9ja0hlaWdodCAqIChqICsgMSkKKyAgICAgICAgfTsKKyAgICAgICAgY29kZWJsb2NrLnRieDBfID0gTWF0aC5tYXgoc3ViYmFuZC50YngwLCBjb2RlYmxvY2sudGJ4MCk7CisgICAgICAgIGNvZGVibG9jay50YnkwXyA9IE1hdGgubWF4KHN1YmJhbmQudGJ5MCwgY29kZWJsb2NrLnRieTApOworICAgICAgICBjb2RlYmxvY2sudGJ4MV8gPSBNYXRoLm1pbihzdWJiYW5kLnRieDEsIGNvZGVibG9jay50YngxKTsKKyAgICAgICAgY29kZWJsb2NrLnRieTFfID0gTWF0aC5taW4oc3ViYmFuZC50YnkxLCBjb2RlYmxvY2sudGJ5MSk7CisgICAgICAgIHZhciBwaSA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YngwXyAtIHN1YmJhbmQudGJ4MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aEluU3ViYmFuZCk7CisgICAgICAgIHZhciBwaiA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YnkwXyAtIHN1YmJhbmQudGJ5MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHRJblN1YmJhbmQpOworICAgICAgICBwcmVjaW5jdE51bWJlciA9IHBpICsgcGogKiBwcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTsKKyAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyID0gcHJlY2luY3ROdW1iZXI7CisgICAgICAgIGNvZGVibG9jay5zdWJiYW5kVHlwZSA9IHN1YmJhbmQudHlwZTsKKyAgICAgICAgY29kZWJsb2NrLkxibG9jayA9IDM7CisKKyAgICAgICAgaWYgKGNvZGVibG9jay50YngxXyA8PSBjb2RlYmxvY2sudGJ4MF8gfHwgY29kZWJsb2NrLnRieTFfIDw9IGNvZGVibG9jay50YnkwXykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7CisgICAgICAgIHZhciBwcmVjaW5jdCA9IHByZWNpbmN0c1twcmVjaW5jdE51bWJlcl07CisKKyAgICAgICAgaWYgKHByZWNpbmN0ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBpZiAoaSA8IHByZWNpbmN0LmNieE1pbikgeworICAgICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gaTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBwcmVjaW5jdC5jYnhNYXgpIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1heCA9IGk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGogPCBwcmVjaW5jdC5jYnlNaW4pIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1pbiA9IGo7CisgICAgICAgICAgfSBlbHNlIGlmIChqID4gcHJlY2luY3QuY2J5TWF4KSB7CisgICAgICAgICAgICBwcmVjaW5jdC5jYnlNYXggPSBqOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmVjaW5jdHNbcHJlY2luY3ROdW1iZXJdID0gcHJlY2luY3QgPSB7CisgICAgICAgICAgICBjYnhNaW46IGksCisgICAgICAgICAgICBjYnlNaW46IGosCisgICAgICAgICAgICBjYnhNYXg6IGksCisgICAgICAgICAgICBjYnlNYXg6IGoKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0ID0gcHJlY2luY3Q7CisgICAgICB9CisgICAgfQorCisgICAgc3ViYmFuZC5jb2RlYmxvY2tQYXJhbWV0ZXJzID0geworICAgICAgY29kZWJsb2NrV2lkdGg6IHhjYl8sCisgICAgICBjb2RlYmxvY2tIZWlnaHQ6IHljYl8sCisgICAgICBudW1jb2RlYmxvY2t3aWRlOiBjYngxIC0gY2J4MCArIDEsCisgICAgICBudW1jb2RlYmxvY2toaWdoOiBjYnkxIC0gY2J5MCArIDEKKyAgICB9OworICAgIHN1YmJhbmQuY29kZWJsb2NrcyA9IGNvZGVibG9ja3M7CisgICAgc3ViYmFuZC5wcmVjaW5jdHMgPSBwcmVjaW5jdHM7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcHJlY2luY3ROdW1iZXIsIGxheWVyTnVtYmVyKSB7CisgICAgdmFyIHByZWNpbmN0Q29kZWJsb2NrcyA9IFtdOworICAgIHZhciBzdWJiYW5kcyA9IHJlc29sdXRpb24uc3ViYmFuZHM7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdWJiYW5kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgc3ViYmFuZCA9IHN1YmJhbmRzW2ldOworICAgICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGNvZGVibG9ja3MubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICB2YXIgY29kZWJsb2NrID0gY29kZWJsb2Nrc1tqXTsKKworICAgICAgICBpZiAoY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyICE9PSBwcmVjaW5jdE51bWJlcikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJlY2luY3RDb2RlYmxvY2tzLnB1c2goY29kZWJsb2NrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgbGF5ZXJOdW1iZXIsCisgICAgICBjb2RlYmxvY2tzOiBwcmVjaW5jdENvZGVibG9ja3MKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IDA7CisKKyAgICBmb3IgKHZhciBxID0gMDsgcSA8IGNvbXBvbmVudHNDb3VudDsgcSsrKSB7CisgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBNYXRoLm1heChtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsIHRpbGUuY29tcG9uZW50c1txXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KTsKKyAgICB9CisKKyAgICB2YXIgbCA9IDAsCisgICAgICAgIHIgPSAwLAorICAgICAgICBpID0gMCwKKyAgICAgICAgayA9IDA7CisKKyAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgeworICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgbCsrKSB7CisgICAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgICAgZm9yICg7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tpXTsKKworICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzOworCisgICAgICAgICAgICBmb3IgKDsgayA8IG51bXByZWNpbmN0czspIHsKKyAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgICByZXR1cm4gcGFja2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHIgPSAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBjb21wb25lbnRzQ291bnQ7IHErKykgeworICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CisgICAgfQorCisgICAgdmFyIHIgPSAwLAorICAgICAgICBsID0gMCwKKyAgICAgICAgaSA9IDAsCisgICAgICAgIGsgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7IGwrKykgeworICAgICAgICAgIGZvciAoOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbaV07CisKKyAgICAgICAgICAgIGlmIChyID4gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgdmFyIG51bXByZWNpbmN0cyA9IHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0czsKKworICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7KSB7CisgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7CisgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBsID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgbCwgciwgYywgcDsKKyAgICB2YXIgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gMDsKKworICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CisgICAgfQorCisgICAgdmFyIG1heE51bVByZWNpbmN0c0luTGV2ZWwgPSBuZXcgSW50MzJBcnJheShtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgKyAxKTsKKworICAgIGZvciAociA9IDA7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyArK3IpIHsKKyAgICAgIHZhciBtYXhOdW1QcmVjaW5jdHMgPSAwOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyArK2MpIHsKKyAgICAgICAgdmFyIHJlc29sdXRpb25zID0gdGlsZS5jb21wb25lbnRzW2NdLnJlc29sdXRpb25zOworCisgICAgICAgIGlmIChyIDwgcmVzb2x1dGlvbnMubGVuZ3RoKSB7CisgICAgICAgICAgbWF4TnVtUHJlY2luY3RzID0gTWF0aC5tYXgobWF4TnVtUHJlY2luY3RzLCByZXNvbHV0aW9uc1tyXS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBtYXhOdW1QcmVjaW5jdHNJbkxldmVsW3JdID0gbWF4TnVtUHJlY2luY3RzOworICAgIH0KKworICAgIGwgPSAwOworICAgIHIgPSAwOworICAgIGMgPSAwOworICAgIHAgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgIGZvciAoOyBwIDwgbWF4TnVtUHJlY2luY3RzSW5MZXZlbFtyXTsgcCsrKSB7CisgICAgICAgICAgZm9yICg7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworCisgICAgICAgICAgICBpZiAociA+IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKKyAgICAgICAgICAgIHZhciBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CisKKyAgICAgICAgICAgIGlmIChwID49IG51bXByZWNpbmN0cykgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDspIHsKKyAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBwLCBsKTsKKyAgICAgICAgICAgICAgbCsrOworICAgICAgICAgICAgICByZXR1cm4gcGFja2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7CisgICAgdmFyIHByZWNpbmN0c0l0ZXJhdGlvblNpemVzID0gcHJlY2luY3RzU2l6ZXM7CisgICAgdmFyIGwgPSAwLAorICAgICAgICByID0gMCwKKyAgICAgICAgYyA9IDAsCisgICAgICAgIHB4ID0gMCwKKyAgICAgICAgcHkgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyBweSA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bUhpZ2g7IHB5KyspIHsKKyAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykgeworICAgICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisKKyAgICAgICAgICAgIGZvciAoOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgICB2YXIgc2l6ZUluSW1hZ2VTY2FsZSA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHgsIHB5LCBzaXplSW5JbWFnZVNjYWxlLCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB4ID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgcHJlY2luY3RzU2l6ZXMgPSBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpOworICAgIHZhciBsID0gMCwKKyAgICAgICAgciA9IDAsCisgICAgICAgIGMgPSAwLAorICAgICAgICBweCA9IDAsCisgICAgICAgIHB5ID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7CisgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICAgIHZhciBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY107CisgICAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKKworICAgICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7CisgICAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykgeworICAgICAgICAgICAgZm9yICg7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHgsIHB5LCBzaXplSW5JbWFnZVNjYWxlLCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBweCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBweSA9IDA7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHhJbmRleCwgcHlJbmRleCwgc2l6ZUluSW1hZ2VTY2FsZSwgcHJlY2luY3RJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbikgeworICAgIHZhciBwb3NYID0gcHhJbmRleCAqIHByZWNpbmN0SXRlcmF0aW9uU2l6ZXMubWluV2lkdGg7CisgICAgdmFyIHBvc1kgPSBweUluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5IZWlnaHQ7CisKKyAgICBpZiAocG9zWCAlIHNpemVJbkltYWdlU2NhbGUud2lkdGggIT09IDAgfHwgcG9zWSAlIHNpemVJbkltYWdlU2NhbGUuaGVpZ2h0ICE9PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgc3RhcnRQcmVjaW5jdFJvd0luZGV4ID0gcG9zWSAvIHNpemVJbkltYWdlU2NhbGUud2lkdGggKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlOworICAgIHJldHVybiBwb3NYIC8gc2l6ZUluSW1hZ2VTY2FsZS5oZWlnaHQgKyBzdGFydFByZWNpbmN0Um93SW5kZXg7CisgIH0KKworICBmdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpIHsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gdGlsZS5jb21wb25lbnRzLmxlbmd0aDsKKyAgICB2YXIgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFOworICAgIHZhciBtaW5IZWlnaHQgPSBOdW1iZXIuTUFYX1ZBTFVFOworICAgIHZhciBtYXhOdW1XaWRlID0gMDsKKyAgICB2YXIgbWF4TnVtSGlnaCA9IDA7CisgICAgdmFyIHNpemVQZXJDb21wb25lbnQgPSBuZXcgQXJyYXkoY29tcG9uZW50c0NvdW50KTsKKworICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisgICAgICB2YXIgc2l6ZVBlclJlc29sdXRpb24gPSBuZXcgQXJyYXkoZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ICsgMSk7CisgICAgICB2YXIgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgIHZhciBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgIHZhciBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IDA7CisgICAgICB2YXIgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSAwOworICAgICAgdmFyIHNjYWxlID0gMTsKKworICAgICAgZm9yICh2YXIgciA9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgciA+PSAwOyAtLXIpIHsKKyAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgIHZhciB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uID0gc2NhbGUgKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdFdpZHRoOworICAgICAgICB2YXIgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24gPSBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0OworICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1pbihtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsIHdpZHRoQ3VycmVudFJlc29sdXRpb24pOworICAgICAgICBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4obWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24pOworICAgICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IE1hdGgubWF4KG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LCByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlKTsKKyAgICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCwgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzaGlnaCk7CisgICAgICAgIHNpemVQZXJSZXNvbHV0aW9uW3JdID0geworICAgICAgICAgIHdpZHRoOiB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uLAorICAgICAgICAgIGhlaWdodDogaGVpZ2h0Q3VycmVudFJlc29sdXRpb24KKyAgICAgICAgfTsKKyAgICAgICAgc2NhbGUgPDw9IDE7CisgICAgICB9CisKKyAgICAgIG1pbldpZHRoID0gTWF0aC5taW4obWluV2lkdGgsIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCk7CisgICAgICBtaW5IZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQpOworICAgICAgbWF4TnVtV2lkZSA9IE1hdGgubWF4KG1heE51bVdpZGUsIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50KTsKKyAgICAgIG1heE51bUhpZ2ggPSBNYXRoLm1heChtYXhOdW1IaWdoLCBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCk7CisgICAgICBzaXplUGVyQ29tcG9uZW50W2NdID0geworICAgICAgICByZXNvbHV0aW9uczogc2l6ZVBlclJlc29sdXRpb24sCisgICAgICAgIG1pbldpZHRoOiBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1pbkhlaWdodDogbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwKKyAgICAgICAgbWF4TnVtV2lkZTogbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1heE51bUhpZ2g6IG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50CisgICAgICB9OworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBjb21wb25lbnRzOiBzaXplUGVyQ29tcG9uZW50LAorICAgICAgbWluV2lkdGgsCisgICAgICBtaW5IZWlnaHQsCisgICAgICBtYXhOdW1XaWRlLAorICAgICAgbWF4TnVtSGlnaAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBidWlsZFBhY2tldHMoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisKKyAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OworICAgICAgdmFyIHJlc29sdXRpb25zID0gW107CisgICAgICB2YXIgc3ViYmFuZHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgciA9IDA7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgdmFyIGJsb2Nrc0RpbWVuc2lvbnMgPSBnZXRCbG9ja3NEaW1lbnNpb25zKGNvbnRleHQsIGNvbXBvbmVudCwgcik7CisgICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CisgICAgICAgIHZhciBzY2FsZSA9IDEgPDwgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50IC0gcjsKKyAgICAgICAgcmVzb2x1dGlvbi50cngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnRyeTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7CisgICAgICAgIHJlc29sdXRpb24udHJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTsKKyAgICAgICAgcmVzb2x1dGlvbi50cnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnJlc0xldmVsID0gcjsKKyAgICAgICAgYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgIHJlc29sdXRpb25zLnB1c2gocmVzb2x1dGlvbik7CisgICAgICAgIHZhciBzdWJiYW5kOworCisgICAgICAgIGlmIChyID09PSAwKSB7CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJMTCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIHNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IFtzdWJiYW5kXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgYnNjYWxlID0gMSA8PCBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByICsgMTsKKyAgICAgICAgICB2YXIgcmVzb2x1dGlvblN1YmJhbmRzID0gW107CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJITCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOworICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTsKKyAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHN1YmJhbmQgPSB7fTsKKyAgICAgICAgICBzdWJiYW5kLnR5cGUgPSAiTEgiOworICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKyAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICBzdWJiYW5kID0ge307CisgICAgICAgICAgc3ViYmFuZC50eXBlID0gIkhIIjsKKyAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IHJlc29sdXRpb25TdWJiYW5kczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb21wb25lbnQucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uczsKKyAgICAgIGNvbXBvbmVudC5zdWJiYW5kcyA9IHN1YmJhbmRzOworICAgIH0KKworICAgIHZhciBwcm9ncmVzc2lvbk9yZGVyID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7CisKKyAgICBzd2l0Y2ggKHByb2dyZXNzaW9uT3JkZXIpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvbkxheWVyQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihgVW5zdXBwb3J0ZWQgcHJvZ3Jlc3Npb24gb3JkZXIgJHtwcm9ncmVzc2lvbk9yZGVyfWApOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgb2Zmc2V0LCBkYXRhTGVuZ3RoKSB7CisgICAgdmFyIHBvc2l0aW9uID0gMDsKKyAgICB2YXIgYnVmZmVyLAorICAgICAgICBidWZmZXJTaXplID0gMCwKKyAgICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTsKKworICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGNvdW50KSB7CisgICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IGNvdW50KSB7CisgICAgICAgIHZhciBiID0gZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl07CisgICAgICAgIHBvc2l0aW9uKys7CisKKyAgICAgICAgaWYgKHNraXBOZXh0Qml0KSB7CisgICAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDcgfCBiOworICAgICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKKyAgICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCA4IHwgYjsKKyAgICAgICAgICBidWZmZXJTaXplICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYiA9PT0gMHhmZikgeworICAgICAgICAgIHNraXBOZXh0Qml0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBidWZmZXJTaXplIC09IGNvdW50OworICAgICAgcmV0dXJuIGJ1ZmZlciA+Pj4gYnVmZmVyU2l6ZSAmICgxIDw8IGNvdW50KSAtIDE7CisgICAgfQorCisgICAgZnVuY3Rpb24gc2tpcE1hcmtlcklmRXF1YWwodmFsdWUpIHsKKyAgICAgIGlmIChkYXRhW29mZnNldCArIHBvc2l0aW9uIC0gMV0gPT09IDB4ZmYgJiYgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl0gPT09IHZhbHVlKSB7CisgICAgICAgIHNraXBCeXRlcygxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSAweGZmICYmIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb24gKyAxXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgc2tpcEJ5dGVzKDIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIHNraXBCeXRlcyhjb3VudCkgeworICAgICAgcG9zaXRpb24gKz0gY291bnQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKSB7CisgICAgICBidWZmZXJTaXplID0gMDsKKworICAgICAgaWYgKHNraXBOZXh0Qml0KSB7CisgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgIHNraXBOZXh0Qml0ID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVhZENvZGluZ3Bhc3NlcygpIHsKKyAgICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7CisgICAgICAgIHJldHVybiAyOworICAgICAgfQorCisgICAgICB2YXIgdmFsdWUgPSByZWFkQml0cygyKTsKKworICAgICAgaWYgKHZhbHVlIDwgMykgeworICAgICAgICByZXR1cm4gdmFsdWUgKyAzOworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHJlYWRCaXRzKDUpOworCisgICAgICBpZiAodmFsdWUgPCAzMSkgeworICAgICAgICByZXR1cm4gdmFsdWUgKyA2OworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHJlYWRCaXRzKDcpOworICAgICAgcmV0dXJuIHZhbHVlICsgMzc7CisgICAgfQorCisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIHNvcE1hcmtlclVzZWQgPSBjb250ZXh0LkNPRC5zb3BNYXJrZXJVc2VkOworICAgIHZhciBlcGhNYXJrZXJVc2VkID0gY29udGV4dC5DT0QuZXBoTWFya2VyVXNlZDsKKyAgICB2YXIgcGFja2V0c0l0ZXJhdG9yID0gdGlsZS5wYWNrZXRzSXRlcmF0b3I7CisKKyAgICB3aGlsZSAocG9zaXRpb24gPCBkYXRhTGVuZ3RoKSB7CisgICAgICBhbGlnblRvQnl0ZSgpOworCisgICAgICBpZiAoc29wTWFya2VyVXNlZCAmJiBza2lwTWFya2VySWZFcXVhbCgweDkxKSkgeworICAgICAgICBza2lwQnl0ZXMoNCk7CisgICAgICB9CisKKyAgICAgIHZhciBwYWNrZXQgPSBwYWNrZXRzSXRlcmF0b3IubmV4dFBhY2tldCgpOworCisgICAgICBpZiAoIXJlYWRCaXRzKDEpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgbGF5ZXJOdW1iZXIgPSBwYWNrZXQubGF5ZXJOdW1iZXI7CisgICAgICB2YXIgcXVldWUgPSBbXSwKKyAgICAgICAgICBjb2RlYmxvY2s7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhY2tldC5jb2RlYmxvY2tzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29kZWJsb2NrID0gcGFja2V0LmNvZGVibG9ja3NbaV07CisgICAgICAgIHZhciBwcmVjaW5jdCA9IGNvZGVibG9jay5wcmVjaW5jdDsKKyAgICAgICAgdmFyIGNvZGVibG9ja0NvbHVtbiA9IGNvZGVibG9jay5jYnggLSBwcmVjaW5jdC5jYnhNaW47CisgICAgICAgIHZhciBjb2RlYmxvY2tSb3cgPSBjb2RlYmxvY2suY2J5IC0gcHJlY2luY3QuY2J5TWluOworICAgICAgICB2YXIgY29kZWJsb2NrSW5jbHVkZWQgPSBmYWxzZTsKKyAgICAgICAgdmFyIGZpcnN0VGltZUluY2x1c2lvbiA9IGZhbHNlOworICAgICAgICB2YXIgdmFsdWVSZWFkeTsKKworICAgICAgICBpZiAoY29kZWJsb2NrLmluY2x1ZGVkICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBjb2RlYmxvY2tJbmNsdWRlZCA9ICEhcmVhZEJpdHMoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJlY2luY3QgPSBjb2RlYmxvY2sucHJlY2luY3Q7CisgICAgICAgICAgdmFyIGluY2x1c2lvblRyZWUsIHplcm9CaXRQbGFuZXNUcmVlOworCisgICAgICAgICAgaWYgKHByZWNpbmN0LmluY2x1c2lvblRyZWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgaW5jbHVzaW9uVHJlZSA9IHByZWNpbmN0LmluY2x1c2lvblRyZWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciB3aWR0aCA9IHByZWNpbmN0LmNieE1heCAtIHByZWNpbmN0LmNieE1pbiArIDE7CisgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcHJlY2luY3QuY2J5TWF4IC0gcHJlY2luY3QuY2J5TWluICsgMTsKKyAgICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBuZXcgSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBsYXllck51bWJlcik7CisgICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IG5ldyBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgcHJlY2luY3QuaW5jbHVzaW9uVHJlZSA9IGluY2x1c2lvblRyZWU7CisgICAgICAgICAgICBwcmVjaW5jdC56ZXJvQml0UGxhbmVzVHJlZSA9IHplcm9CaXRQbGFuZXNUcmVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpbmNsdXNpb25UcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93LCBsYXllck51bWJlcikpIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgeworICAgICAgICAgICAgICAgIHZhbHVlUmVhZHkgPSAhaW5jbHVzaW9uVHJlZS5uZXh0TGV2ZWwoKTsKKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CisgICAgICAgICAgICAgICAgICBjb2RlYmxvY2suaW5jbHVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgY29kZWJsb2NrSW5jbHVkZWQgPSBmaXJzdFRpbWVJbmNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluY2x1c2lvblRyZWUuaW5jcmVtZW50VmFsdWUobGF5ZXJOdW1iZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb2RlYmxvY2tJbmNsdWRlZCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0VGltZUluY2x1c2lvbikgeworICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlID0gcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWU7CisgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUucmVzZXQoY29kZWJsb2NrQ29sdW1uLCBjb2RlYmxvY2tSb3cpOworCisgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgeworICAgICAgICAgICAgICB2YWx1ZVJlYWR5ID0gIXplcm9CaXRQbGFuZXNUcmVlLm5leHRMZXZlbCgpOworCisgICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlLmluY3JlbWVudFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMgPSB6ZXJvQml0UGxhbmVzVHJlZS52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBjb2RpbmdwYXNzZXMgPSByZWFkQ29kaW5ncGFzc2VzKCk7CisKKyAgICAgICAgd2hpbGUgKHJlYWRCaXRzKDEpKSB7CisgICAgICAgICAgY29kZWJsb2NrLkxibG9jaysrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNvZGluZ3Bhc3Nlc0xvZzIgPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoY29kaW5ncGFzc2VzKTsKKyAgICAgICAgdmFyIGJpdHMgPSAoY29kaW5ncGFzc2VzIDwgMSA8PCBjb2RpbmdwYXNzZXNMb2cyID8gY29kaW5ncGFzc2VzTG9nMiAtIDEgOiBjb2RpbmdwYXNzZXNMb2cyKSArIGNvZGVibG9jay5MYmxvY2s7CisgICAgICAgIHZhciBjb2RlZERhdGFMZW5ndGggPSByZWFkQml0cyhiaXRzKTsKKyAgICAgICAgcXVldWUucHVzaCh7CisgICAgICAgICAgY29kZWJsb2NrLAorICAgICAgICAgIGNvZGluZ3Bhc3NlcywKKyAgICAgICAgICBkYXRhTGVuZ3RoOiBjb2RlZERhdGFMZW5ndGgKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGFsaWduVG9CeXRlKCk7CisKKyAgICAgIGlmIChlcGhNYXJrZXJVc2VkKSB7CisgICAgICAgIHNraXBNYXJrZXJJZkVxdWFsKDB4OTIpOworICAgICAgfQorCisgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgeworICAgICAgICB2YXIgcGFja2V0SXRlbSA9IHF1ZXVlLnNoaWZ0KCk7CisgICAgICAgIGNvZGVibG9jayA9IHBhY2tldEl0ZW0uY29kZWJsb2NrOworCisgICAgICAgIGlmIChjb2RlYmxvY2suZGF0YSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgY29kZWJsb2NrLmRhdGEgPSBbXTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGVibG9jay5kYXRhLnB1c2goeworICAgICAgICAgIGRhdGEsCisgICAgICAgICAgc3RhcnQ6IG9mZnNldCArIHBvc2l0aW9uLAorICAgICAgICAgIGVuZDogb2Zmc2V0ICsgcG9zaXRpb24gKyBwYWNrZXRJdGVtLmRhdGFMZW5ndGgsCisgICAgICAgICAgY29kaW5ncGFzc2VzOiBwYWNrZXRJdGVtLmNvZGluZ3Bhc3NlcworICAgICAgICB9KTsKKyAgICAgICAgcG9zaXRpb24gKz0gcGFja2V0SXRlbS5kYXRhTGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwb3NpdGlvbjsKKyAgfQorCisgIGZ1bmN0aW9uIGNvcHlDb2VmZmljaWVudHMoY29lZmZpY2llbnRzLCBsZXZlbFdpZHRoLCBsZXZlbEhlaWdodCwgc3ViYmFuZCwgZGVsdGEsIG1iLCByZXZlcnNpYmxlLCBzZWdtZW50YXRpb25TeW1ib2xVc2VkKSB7CisgICAgdmFyIHgwID0gc3ViYmFuZC50YngwOworICAgIHZhciB5MCA9IHN1YmJhbmQudGJ5MDsKKyAgICB2YXIgd2lkdGggPSBzdWJiYW5kLnRieDEgLSBzdWJiYW5kLnRieDA7CisgICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7CisgICAgdmFyIHJpZ2h0ID0gc3ViYmFuZC50eXBlLmNoYXJBdCgwKSA9PT0gIkgiID8gMSA6IDA7CisgICAgdmFyIGJvdHRvbSA9IHN1YmJhbmQudHlwZS5jaGFyQXQoMSkgPT09ICJIIiA/IGxldmVsV2lkdGggOiAwOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29kZWJsb2Nrcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICB2YXIgY29kZWJsb2NrID0gY29kZWJsb2Nrc1tpXTsKKyAgICAgIHZhciBibG9ja1dpZHRoID0gY29kZWJsb2NrLnRieDFfIC0gY29kZWJsb2NrLnRieDBfOworICAgICAgdmFyIGJsb2NrSGVpZ2h0ID0gY29kZWJsb2NrLnRieTFfIC0gY29kZWJsb2NrLnRieTBfOworCisgICAgICBpZiAoYmxvY2tXaWR0aCA9PT0gMCB8fCBibG9ja0hlaWdodCA9PT0gMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvZGVibG9jay5kYXRhID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHZhciBiaXRNb2RlbCwgY3VycmVudENvZGluZ3Bhc3NUeXBlOworICAgICAgYml0TW9kZWwgPSBuZXcgQml0TW9kZWwoYmxvY2tXaWR0aCwgYmxvY2tIZWlnaHQsIGNvZGVibG9jay5zdWJiYW5kVHlwZSwgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMsIG1iKTsKKyAgICAgIGN1cnJlbnRDb2RpbmdwYXNzVHlwZSA9IDI7CisgICAgICB2YXIgZGF0YSA9IGNvZGVibG9jay5kYXRhLAorICAgICAgICAgIHRvdGFsTGVuZ3RoID0gMCwKKyAgICAgICAgICBjb2RpbmdwYXNzZXMgPSAwOworICAgICAgdmFyIGosIGpqLCBkYXRhSXRlbTsKKworICAgICAgZm9yIChqID0gMCwgamogPSBkYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgZGF0YUl0ZW0gPSBkYXRhW2pdOworICAgICAgICB0b3RhbExlbmd0aCArPSBkYXRhSXRlbS5lbmQgLSBkYXRhSXRlbS5zdGFydDsKKyAgICAgICAgY29kaW5ncGFzc2VzICs9IGRhdGFJdGVtLmNvZGluZ3Bhc3NlczsKKyAgICAgIH0KKworICAgICAgdmFyIGVuY29kZWREYXRhID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpOworICAgICAgdmFyIHBvc2l0aW9uID0gMDsKKworICAgICAgZm9yIChqID0gMCwgamogPSBkYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgZGF0YUl0ZW0gPSBkYXRhW2pdOworICAgICAgICB2YXIgY2h1bmsgPSBkYXRhSXRlbS5kYXRhLnN1YmFycmF5KGRhdGFJdGVtLnN0YXJ0LCBkYXRhSXRlbS5lbmQpOworICAgICAgICBlbmNvZGVkRGF0YS5zZXQoY2h1bmssIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gY2h1bmsubGVuZ3RoOworICAgICAgfQorCisgICAgICB2YXIgZGVjb2RlciA9IG5ldyBfYXJpdGhtZXRpY19kZWNvZGVyLkFyaXRobWV0aWNEZWNvZGVyKGVuY29kZWREYXRhLCAwLCB0b3RhbExlbmd0aCk7CisgICAgICBiaXRNb2RlbC5zZXREZWNvZGVyKGRlY29kZXIpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgY29kaW5ncGFzc2VzOyBqKyspIHsKKyAgICAgICAgc3dpdGNoIChjdXJyZW50Q29kaW5ncGFzc1R5cGUpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBiaXRNb2RlbC5ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYml0TW9kZWwucnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYml0TW9kZWwucnVuQ2xlYW51cFBhc3MoKTsKKworICAgICAgICAgICAgaWYgKHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpIHsKKyAgICAgICAgICAgICAgYml0TW9kZWwuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAoY3VycmVudENvZGluZ3Bhc3NUeXBlICsgMSkgJSAzOworICAgICAgfQorCisgICAgICB2YXIgb2Zmc2V0ID0gY29kZWJsb2NrLnRieDBfIC0geDAgKyAoY29kZWJsb2NrLnRieTBfIC0geTApICogd2lkdGg7CisgICAgICB2YXIgc2lnbiA9IGJpdE1vZGVsLmNvZWZmaWNlbnRzU2lnbjsKKyAgICAgIHZhciBtYWduaXR1ZGUgPSBiaXRNb2RlbC5jb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgIHZhciBiaXRzRGVjb2RlZCA9IGJpdE1vZGVsLmJpdHNEZWNvZGVkOworICAgICAgdmFyIG1hZ25pdHVkZUNvcnJlY3Rpb24gPSByZXZlcnNpYmxlID8gMCA6IDAuNTsKKyAgICAgIHZhciBrLCBuLCBuYjsKKyAgICAgIHBvc2l0aW9uID0gMDsKKyAgICAgIHZhciBpbnRlcmxlYXZlID0gc3ViYmFuZC50eXBlICE9PSAiTEwiOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgYmxvY2tIZWlnaHQ7IGorKykgeworICAgICAgICB2YXIgcm93ID0gb2Zmc2V0IC8gd2lkdGggfCAwOworICAgICAgICB2YXIgbGV2ZWxPZmZzZXQgPSAyICogcm93ICogKGxldmVsV2lkdGggLSB3aWR0aCkgKyByaWdodCArIGJvdHRvbTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgYmxvY2tXaWR0aDsgaysrKSB7CisgICAgICAgICAgbiA9IG1hZ25pdHVkZVtwb3NpdGlvbl07CisKKyAgICAgICAgICBpZiAobiAhPT0gMCkgeworICAgICAgICAgICAgbiA9IChuICsgbWFnbml0dWRlQ29ycmVjdGlvbikgKiBkZWx0YTsKKworICAgICAgICAgICAgaWYgKHNpZ25bcG9zaXRpb25dICE9PSAwKSB7CisgICAgICAgICAgICAgIG4gPSAtbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmIgPSBiaXRzRGVjb2RlZFtwb3NpdGlvbl07CisgICAgICAgICAgICB2YXIgcG9zID0gaW50ZXJsZWF2ZSA/IGxldmVsT2Zmc2V0ICsgKG9mZnNldCA8PCAxKSA6IG9mZnNldDsKKworICAgICAgICAgICAgaWYgKHJldmVyc2libGUgJiYgbmIgPj0gbWIpIHsKKyAgICAgICAgICAgICAgY29lZmZpY2llbnRzW3Bvc10gPSBuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY29lZmZpY2llbnRzW3Bvc10gPSBuICogKDEgPDwgbWIgLSBuYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgcG9zaXRpb24rKzsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSB3aWR0aCAtIGJsb2NrV2lkdGg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gdHJhbnNmb3JtVGlsZShjb250ZXh0LCB0aWxlLCBjKSB7CisgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKyAgICB2YXIgY29kaW5nU3R5bGVQYXJhbWV0ZXJzID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVyczsKKyAgICB2YXIgcXVhbnRpemF0aW9uUGFyYW1ldGVycyA9IGNvbXBvbmVudC5xdWFudGl6YXRpb25QYXJhbWV0ZXJzOworICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBjb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OworICAgIHZhciBzcHFjZHMgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlNQcWNkczsKKyAgICB2YXIgc2NhbGFyRXhwb3VuZGVkID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5zY2FsYXJFeHBvdW5kZWQ7CisgICAgdmFyIGd1YXJkQml0cyA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuZ3VhcmRCaXRzOworICAgIHZhciBzZWdtZW50YXRpb25TeW1ib2xVc2VkID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQ7CisgICAgdmFyIHByZWNpc2lvbiA9IGNvbnRleHQuY29tcG9uZW50c1tjXS5wcmVjaXNpb247CisgICAgdmFyIHJldmVyc2libGUgPSBjb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uOworICAgIHZhciB0cmFuc2Zvcm0gPSByZXZlcnNpYmxlID8gbmV3IFJldmVyc2libGVUcmFuc2Zvcm0oKSA6IG5ldyBJcnJldmVyc2libGVUcmFuc2Zvcm0oKTsKKyAgICB2YXIgc3ViYmFuZENvZWZmaWNpZW50cyA9IFtdOworICAgIHZhciBiID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgaSsrKSB7CisgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tpXTsKKyAgICAgIHZhciB3aWR0aCA9IHJlc29sdXRpb24udHJ4MSAtIHJlc29sdXRpb24udHJ4MDsKKyAgICAgIHZhciBoZWlnaHQgPSByZXNvbHV0aW9uLnRyeTEgLSByZXNvbHV0aW9uLnRyeTA7CisgICAgICB2YXIgY29lZmZpY2llbnRzID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCk7CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHJlc29sdXRpb24uc3ViYmFuZHMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICB2YXIgbXUsIGVwc2lsb247CisKKyAgICAgICAgaWYgKCFzY2FsYXJFeHBvdW5kZWQpIHsKKyAgICAgICAgICBtdSA9IHNwcWNkc1swXS5tdTsKKyAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzWzBdLmVwc2lsb24gKyAoaSA+IDAgPyAxIC0gaSA6IDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG11ID0gc3BxY2RzW2JdLm11OworICAgICAgICAgIGVwc2lsb24gPSBzcHFjZHNbYl0uZXBzaWxvbjsKKyAgICAgICAgICBiKys7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3ViYmFuZCA9IHJlc29sdXRpb24uc3ViYmFuZHNbal07CisgICAgICAgIHZhciBnYWluTG9nMiA9IFN1YmJhbmRzR2FpbkxvZzJbc3ViYmFuZC50eXBlXTsKKyAgICAgICAgdmFyIGRlbHRhID0gcmV2ZXJzaWJsZSA/IDEgOiAyICoqIChwcmVjaXNpb24gKyBnYWluTG9nMiAtIGVwc2lsb24pICogKDEgKyBtdSAvIDIwNDgpOworICAgICAgICB2YXIgbWIgPSBndWFyZEJpdHMgKyBlcHNpbG9uIC0gMTsKKyAgICAgICAgY29weUNvZWZmaWNpZW50cyhjb2VmZmljaWVudHMsIHdpZHRoLCBoZWlnaHQsIHN1YmJhbmQsIGRlbHRhLCBtYiwgcmV2ZXJzaWJsZSwgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCk7CisgICAgICB9CisKKyAgICAgIHN1YmJhbmRDb2VmZmljaWVudHMucHVzaCh7CisgICAgICAgIHdpZHRoLAorICAgICAgICBoZWlnaHQsCisgICAgICAgIGl0ZW1zOiBjb2VmZmljaWVudHMKKyAgICAgIH0pOworICAgIH0KKworICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm0uY2FsY3VsYXRlKHN1YmJhbmRDb2VmZmljaWVudHMsIGNvbXBvbmVudC50Y3gwLCBjb21wb25lbnQudGN5MCk7CisgICAgcmV0dXJuIHsKKyAgICAgIGxlZnQ6IGNvbXBvbmVudC50Y3gwLAorICAgICAgdG9wOiBjb21wb25lbnQudGN5MCwKKyAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsCisgICAgICBoZWlnaHQ6IHJlc3VsdC5oZWlnaHQsCisgICAgICBpdGVtczogcmVzdWx0Lml0ZW1zCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zZm9ybUNvbXBvbmVudHMoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgY29tcG9uZW50cyA9IGNvbnRleHQuY29tcG9uZW50czsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIHJlc3VsdEltYWdlcyA9IFtdOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29udGV4dC50aWxlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbaV07CisgICAgICB2YXIgdHJhbnNmb3JtZWRUaWxlcyA9IFtdOworICAgICAgdmFyIGM7CisKKyAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgICB0cmFuc2Zvcm1lZFRpbGVzW2NdID0gdHJhbnNmb3JtVGlsZShjb250ZXh0LCB0aWxlLCBjKTsKKyAgICAgIH0KKworICAgICAgdmFyIHRpbGUwID0gdHJhbnNmb3JtZWRUaWxlc1swXTsKKyAgICAgIHZhciBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodGlsZTAuaXRlbXMubGVuZ3RoICogY29tcG9uZW50c0NvdW50KTsKKyAgICAgIHZhciByZXN1bHQgPSB7CisgICAgICAgIGxlZnQ6IHRpbGUwLmxlZnQsCisgICAgICAgIHRvcDogdGlsZTAudG9wLAorICAgICAgICB3aWR0aDogdGlsZTAud2lkdGgsCisgICAgICAgIGhlaWdodDogdGlsZTAuaGVpZ2h0LAorICAgICAgICBpdGVtczogb3V0CisgICAgICB9OworICAgICAgdmFyIHNoaWZ0LCBvZmZzZXQ7CisgICAgICB2YXIgcG9zID0gMCwKKyAgICAgICAgICBqLAorICAgICAgICAgIGpqLAorICAgICAgICAgIHkwLAorICAgICAgICAgIHkxLAorICAgICAgICAgIHkyOworCisgICAgICBpZiAodGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKSB7CisgICAgICAgIHZhciBmb3VyQ29tcG9uZW50cyA9IGNvbXBvbmVudHNDb3VudCA9PT0gNDsKKyAgICAgICAgdmFyIHkwaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdLml0ZW1zOworICAgICAgICB2YXIgeTFpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMV0uaXRlbXM7CisgICAgICAgIHZhciB5Mml0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1syXS5pdGVtczsKKyAgICAgICAgdmFyIHkzaXRlbXMgPSBmb3VyQ29tcG9uZW50cyA/IHRyYW5zZm9ybWVkVGlsZXNbM10uaXRlbXMgOiBudWxsOworICAgICAgICBzaGlmdCA9IGNvbXBvbmVudHNbMF0ucHJlY2lzaW9uIC0gODsKKyAgICAgICAgb2Zmc2V0ID0gKDEyOCA8PCBzaGlmdCkgKyAwLjU7CisgICAgICAgIHZhciBjb21wb25lbnQwID0gdGlsZS5jb21wb25lbnRzWzBdOworICAgICAgICB2YXIgYWxwaGEwMSA9IGNvbXBvbmVudHNDb3VudCAtIDM7CisgICAgICAgIGpqID0geTBpdGVtcy5sZW5ndGg7CisKKyAgICAgICAgaWYgKCFjb21wb25lbnQwLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgamo7IGorKywgcG9zICs9IGFscGhhMDEpIHsKKyAgICAgICAgICAgIHkwID0geTBpdGVtc1tqXSArIG9mZnNldDsKKyAgICAgICAgICAgIHkxID0geTFpdGVtc1tqXTsKKyAgICAgICAgICAgIHkyID0geTJpdGVtc1tqXTsKKyAgICAgICAgICAgIG91dFtwb3MrK10gPSB5MCArIDEuNDAyICogeTIgPj4gc2hpZnQ7CisgICAgICAgICAgICBvdXRbcG9zKytdID0geTAgLSAwLjM0NDEzICogeTEgLSAwLjcxNDE0ICogeTIgPj4gc2hpZnQ7CisgICAgICAgICAgICBvdXRbcG9zKytdID0geTAgKyAxLjc3MiAqIHkxID4+IHNoaWZ0OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgamo7IGorKywgcG9zICs9IGFscGhhMDEpIHsKKyAgICAgICAgICAgIHkwID0geTBpdGVtc1tqXSArIG9mZnNldDsKKyAgICAgICAgICAgIHkxID0geTFpdGVtc1tqXTsKKyAgICAgICAgICAgIHkyID0geTJpdGVtc1tqXTsKKyAgICAgICAgICAgIGNvbnN0IGcgPSB5MCAtICh5MiArIHkxID4+IDIpOworICAgICAgICAgICAgb3V0W3BvcysrXSA9IGcgKyB5MiA+PiBzaGlmdDsKKyAgICAgICAgICAgIG91dFtwb3MrK10gPSBnID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IGcgKyB5MSA+PiBzaGlmdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91ckNvbXBvbmVudHMpIHsKKyAgICAgICAgICBmb3IgKGogPSAwLCBwb3MgPSAzOyBqIDwgamo7IGorKywgcG9zICs9IDQpIHsKKyAgICAgICAgICAgIG91dFtwb3NdID0geTNpdGVtc1tqXSArIG9mZnNldCA+PiBzaGlmdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgICAgIHZhciBpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbY10uaXRlbXM7CisgICAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzW2NdLnByZWNpc2lvbiAtIDg7CisgICAgICAgICAgb2Zmc2V0ID0gKDEyOCA8PCBzaGlmdCkgKyAwLjU7CisKKyAgICAgICAgICBmb3IgKHBvcyA9IGMsIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICAgIG91dFtwb3NdID0gaXRlbXNbal0gKyBvZmZzZXQgPj4gc2hpZnQ7CisgICAgICAgICAgICBwb3MgKz0gY29tcG9uZW50c0NvdW50OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXN1bHRJbWFnZXMucHVzaChyZXN1bHQpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHRJbWFnZXM7CisgIH0KKworICBmdW5jdGlvbiBpbml0aWFsaXplVGlsZShjb250ZXh0LCB0aWxlSW5kZXgpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworCisgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKyAgICAgIHZhciBxY2RPclFjYyA9IGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdICE9PSB1bmRlZmluZWQgPyBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjXSA6IGNvbnRleHQuY3VycmVudFRpbGUuUUNEOworICAgICAgY29tcG9uZW50LnF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBxY2RPclFjYzsKKyAgICAgIHZhciBjb2RPckNvYyA9IGNvbnRleHQuY3VycmVudFRpbGUuQ09DW2NdICE9PSB1bmRlZmluZWQgPyBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXSA6IGNvbnRleHQuY3VycmVudFRpbGUuQ09EOworICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvZE9yQ29jOworICAgIH0KKworICAgIHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycyA9IGNvbnRleHQuY3VycmVudFRpbGUuQ09EOworICB9CisKKyAgdmFyIFRhZ1RyZWUgPSBmdW5jdGlvbiBUYWdUcmVlQ2xvc3VyZSgpIHsKKyAgICBmdW5jdGlvbiBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpIHsKKyAgICAgIHZhciBsZXZlbHNMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpICsgMTsKKyAgICAgIHRoaXMubGV2ZWxzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGV2ZWxzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGxldmVsID0geworICAgICAgICAgIHdpZHRoLAorICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICBpdGVtczogW10KKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7CisgICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7CisgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBUYWdUcmVlLnByb3RvdHlwZSA9IHsKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBUYWdUcmVlX3Jlc2V0KGksIGopIHsKKyAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IDAsCisgICAgICAgICAgICB2YWx1ZSA9IDAsCisgICAgICAgICAgICBsZXZlbDsKKworICAgICAgICB3aGlsZSAoY3VycmVudExldmVsIDwgdGhpcy5sZXZlbHMubGVuZ3RoKSB7CisgICAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICAgIHZhciBpbmRleCA9IGkgKyBqICogbGV2ZWwud2lkdGg7CisKKyAgICAgICAgICBpZiAobGV2ZWwuaXRlbXNbaW5kZXhdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbGV2ZWwuaXRlbXNbaW5kZXhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICBpID4+PSAxOworICAgICAgICAgIGogPj49IDE7CisgICAgICAgICAgY3VycmVudExldmVsKys7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50TGV2ZWwtLTsKKyAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7CisgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlOworICAgICAgfSwKKyAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBUYWdUcmVlX2luY3JlbWVudFZhbHVlKCkgeworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSsrOworICAgICAgfSwKKyAgICAgIG5leHRMZXZlbDogZnVuY3Rpb24gVGFnVHJlZV9uZXh0TGV2ZWwoKSB7CisgICAgICAgIHZhciBjdXJyZW50TGV2ZWwgPSB0aGlzLmN1cnJlbnRMZXZlbDsKKyAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgdmFyIHZhbHVlID0gbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdOworICAgICAgICBjdXJyZW50TGV2ZWwtLTsKKworICAgICAgICBpZiAoY3VycmVudExldmVsIDwgMCkgeworICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gVGFnVHJlZTsKKyAgfSgpOworCisgIHZhciBJbmNsdXNpb25UcmVlID0gZnVuY3Rpb24gSW5jbHVzaW9uVHJlZUNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgIHZhciBsZXZlbHNMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpICsgMTsKKyAgICAgIHRoaXMubGV2ZWxzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGV2ZWxzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGl0ZW1zID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpOworCisgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICBpdGVtc1tqXSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsZXZlbCA9IHsKKyAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgaXRlbXMKKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7CisgICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7CisgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBJbmNsdXNpb25UcmVlLnByb3RvdHlwZSA9IHsKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Jlc2V0KGksIGosIHN0b3BWYWx1ZSkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gMDsKKworICAgICAgICB3aGlsZSAoY3VycmVudExldmVsIDwgdGhpcy5sZXZlbHMubGVuZ3RoKSB7CisgICAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoOworICAgICAgICAgIGxldmVsLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgdmFyIHZhbHVlID0gbGV2ZWwuaXRlbXNbaW5kZXhdOworCisgICAgICAgICAgaWYgKHZhbHVlID09PSAweGZmKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodmFsdWUgPiBzdG9wVmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsOworICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpID4+PSAxOworICAgICAgICAgIGogPj49IDE7CisgICAgICAgICAgY3VycmVudExldmVsKys7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbCAtIDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSwKKyAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKHN0b3BWYWx1ZSkgeworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHN0b3BWYWx1ZSArIDE7CisgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7CisgICAgICB9LAorICAgICAgcHJvcGFnYXRlVmFsdWVzOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Byb3BhZ2F0ZVZhbHVlcygpIHsKKyAgICAgICAgdmFyIGxldmVsSW5kZXggPSB0aGlzLmN1cnJlbnRMZXZlbDsKKyAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07CisgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07CisKKyAgICAgICAgd2hpbGUgKC0tbGV2ZWxJbmRleCA+PSAwKSB7CisgICAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tsZXZlbEluZGV4XTsKKyAgICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSBjdXJyZW50VmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBuZXh0TGV2ZWw6IGZ1bmN0aW9uIEluY2x1c2lvblRyZWVfbmV4dExldmVsKCkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gdGhpcy5jdXJyZW50TGV2ZWw7CisgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gMHhmZjsKKyAgICAgICAgY3VycmVudExldmVsLS07CisKKyAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA8IDApIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gSW5jbHVzaW9uVHJlZTsKKyAgfSgpOworCisgIHZhciBCaXRNb2RlbCA9IGZ1bmN0aW9uIEJpdE1vZGVsQ2xvc3VyZSgpIHsKKyAgICB2YXIgVU5JRk9STV9DT05URVhUID0gMTc7CisgICAgdmFyIFJVTkxFTkdUSF9DT05URVhUID0gMTg7CisgICAgdmFyIExMQW5kTEhDb250ZXh0c0xhYmVsID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDUsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDEsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDhdKTsKKyAgICB2YXIgSExDb250ZXh0TGFiZWwgPSBuZXcgVWludDhBcnJheShbMCwgMywgNCwgMCwgNSwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMSwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOF0pOworICAgIHZhciBISENvbnRleHRMYWJlbCA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAyLCAwLCAxLCAyLCAyLCAwLCAyLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAzLCA0LCA1LCAwLCA0LCA1LCA1LCAwLCA1LCA1LCA1LCAwLCAwLCAwLCAwLCAwLCA2LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4XSk7CisKKyAgICBmdW5jdGlvbiBCaXRNb2RlbCh3aWR0aCwgaGVpZ2h0LCBzdWJiYW5kLCB6ZXJvQml0UGxhbmVzLCBtYikgeworICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICBsZXQgY29udGV4dExhYmVsVGFibGU7CisKKyAgICAgIGlmIChzdWJiYW5kID09PSAiSEgiKSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gSEhDb250ZXh0TGFiZWw7CisgICAgICB9IGVsc2UgaWYgKHN1YmJhbmQgPT09ICJITCIpIHsKKyAgICAgICAgY29udGV4dExhYmVsVGFibGUgPSBITENvbnRleHRMYWJlbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gTExBbmRMSENvbnRleHRzTGFiZWw7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29udGV4dExhYmVsVGFibGUgPSBjb250ZXh0TGFiZWxUYWJsZTsKKyAgICAgIHZhciBjb2VmZmljaWVudENvdW50ID0gd2lkdGggKiBoZWlnaHQ7CisgICAgICB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpOworICAgICAgdGhpcy5jb2VmZmljZW50c1NpZ24gPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIGxldCBjb2VmZmljZW50c01hZ25pdHVkZTsKKworICAgICAgaWYgKG1iID4gMTQpIHsKKyAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDMyQXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9IGVsc2UgaWYgKG1iID4gNikgeworICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50MTZBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUgPSBjb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgIHRoaXMucHJvY2Vzc2luZ0ZsYWdzID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB2YXIgYml0c0RlY29kZWQgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKworICAgICAgaWYgKHplcm9CaXRQbGFuZXMgIT09IDApIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2VmZmljaWVudENvdW50OyBpKyspIHsKKyAgICAgICAgICBiaXRzRGVjb2RlZFtpXSA9IHplcm9CaXRQbGFuZXM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5iaXRzRGVjb2RlZCA9IGJpdHNEZWNvZGVkOworICAgICAgdGhpcy5yZXNldCgpOworICAgIH0KKworICAgIEJpdE1vZGVsLnByb3RvdHlwZSA9IHsKKyAgICAgIHNldERlY29kZXI6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldERlY29kZXIoZGVjb2RlcikgeworICAgICAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyOworICAgICAgfSwKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBCaXRNb2RlbF9yZXNldCgpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0cyA9IG5ldyBJbnQ4QXJyYXkoMTkpOworICAgICAgICB0aGlzLmNvbnRleHRzWzBdID0gNCA8PCAxIHwgMDsKKyAgICAgICAgdGhpcy5jb250ZXh0c1tVTklGT1JNX0NPTlRFWFRdID0gNDYgPDwgMSB8IDA7CisgICAgICAgIHRoaXMuY29udGV4dHNbUlVOTEVOR1RIX0NPTlRFWFRdID0gMyA8PCAxIHwgMDsKKyAgICAgIH0sCisgICAgICBzZXROZWlnaGJvcnNTaWduaWZpY2FuY2U6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldE5laWdoYm9yc1NpZ25pZmljYW5jZShyb3csIGNvbHVtbiwgaW5kZXgpIHsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBsZWZ0ID0gY29sdW1uID4gMDsKKyAgICAgICAgdmFyIHJpZ2h0ID0gY29sdW1uICsgMSA8IHdpZHRoOworICAgICAgICB2YXIgaTsKKworICAgICAgICBpZiAocm93ID4gMCkgeworICAgICAgICAgIGkgPSBpbmRleCAtIHdpZHRoOworCisgICAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmlnaHQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaV0gKz0gMHgwNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0KSB7CisgICAgICAgICAgaSA9IGluZGV4ICsgd2lkdGg7CisKKyAgICAgICAgICBpZiAobGVmdCkgeworICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgLSAxXSArPSAweDEwOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyaWdodCkgeworICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgKyAxXSArPSAweDEwOworICAgICAgICAgIH0KKworICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpXSArPSAweDA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXggLSAxXSArPSAweDAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJpZ2h0KSB7CisgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4ICsgMV0gKz0gMHgwMTsKKyAgICAgICAgfQorCisgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gfD0gMHg4MDsKKyAgICAgIH0sCisgICAgICBydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduOworICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CisgICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKKyAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0czsKKyAgICAgICAgdmFyIGxhYmVscyA9IHRoaXMuY29udGV4dExhYmVsVGFibGU7CisgICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CisgICAgICAgIHZhciBwcm9jZXNzZWRJbnZlcnNlTWFzayA9IH4xOworICAgICAgICB2YXIgcHJvY2Vzc2VkTWFzayA9IDE7CisgICAgICAgIHZhciBmaXJzdE1hZ25pdHVkZUJpdE1hc2sgPSAyOworCisgICAgICAgIGZvciAodmFyIGkwID0gMDsgaTAgPCBoZWlnaHQ7IGkwICs9IDQpIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBpbmRleCA9IGkwICogd2lkdGggKyBqOworCisgICAgICAgICAgICBmb3IgKHZhciBpMSA9IDA7IGkxIDwgNDsgaTErKywgaW5kZXggKz0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgdmFyIGkgPSBpMCArIGkxOworCisgICAgICAgICAgICAgIGlmIChpID49IGhlaWdodCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmPSBwcm9jZXNzZWRJbnZlcnNlTWFzazsKKworICAgICAgICAgICAgICBpZiAoY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8ICFuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dOworICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisKKyAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uKSB7CisgICAgICAgICAgICAgICAgdmFyIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gcHJvY2Vzc2VkTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBkZWNvZGVTaWduQml0OiBmdW5jdGlvbiBCaXRNb2RlbF9kZWNvZGVTaWduQml0KHJvdywgY29sdW1uLCBpbmRleCkgeworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjsKKyAgICAgICAgdmFyIGNvbnRyaWJ1dGlvbiwgc2lnbjAsIHNpZ24xLCBzaWduaWZpY2FuY2UxOworICAgICAgICB2YXIgY29udGV4dExhYmVsLCBkZWNvZGVkOworICAgICAgICBzaWduaWZpY2FuY2UxID0gY29sdW1uID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIDFdICE9PSAwOworCisgICAgICAgIGlmIChjb2x1bW4gKyAxIDwgd2lkdGggJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyAxXSAhPT0gMCkgeworICAgICAgICAgIHNpZ24xID0gY29lZmZpY2VudHNTaWduW2luZGV4ICsgMV07CisKKyAgICAgICAgICBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSAxXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gMV07CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBob3Jpem9udGFsQ29udHJpYnV0aW9uID0gMyAqIGNvbnRyaWJ1dGlvbjsKKyAgICAgICAgc2lnbmlmaWNhbmNlMSA9IHJvdyA+IDAgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggLSB3aWR0aF0gIT09IDA7CisKKyAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyB3aWR0aF0gIT09IDApIHsKKyAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIHdpZHRoXTsKKworICAgICAgICAgIGlmIChzaWduaWZpY2FuY2UxKSB7CisgICAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIHdpZHRoXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjEgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzaWduaWZpY2FuY2UxKSB7CisgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSB3aWR0aF07CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjAgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IGhvcml6b250YWxDb250cmlidXRpb247CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udHJpYnV0aW9uID49IDApIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSA5ICsgY29udHJpYnV0aW9uOworICAgICAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRleHRMYWJlbCA9IDkgLSBjb250cmlidXRpb247CisgICAgICAgICAgZGVjb2RlZCA9IHRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsIGNvbnRleHRMYWJlbCkgXiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlY29kZWQ7CisgICAgICB9LAorICAgICAgcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCkgeworICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjsKKyAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CisgICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKKyAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxOworICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjsKKyAgICAgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB2YXIgd2lkdGg0ID0gd2lkdGggKiA0OworCisgICAgICAgIGZvciAodmFyIGluZGV4MCA9IDAsIGluZGV4TmV4dDsgaW5kZXgwIDwgbGVuZ3RoOyBpbmRleDAgPSBpbmRleE5leHQpIHsKKyAgICAgICAgICBpbmRleE5leHQgPSBNYXRoLm1pbihsZW5ndGgsIGluZGV4MCArIHdpZHRoNCk7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gaW5kZXgwICsgajsgaW5kZXggPCBpbmRleE5leHQ7IGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgIGlmICghY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8IChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSAxNjsKKworICAgICAgICAgICAgICBpZiAoKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBmaXJzdE1hZ25pdHVkZUJpdE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSBePSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gJiAxMjc7CisgICAgICAgICAgICAgICAgY29udGV4dExhYmVsID0gc2lnbmlmaWNhbmNlID09PSAwID8gMTUgOiAxNDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA8PCAxIHwgYml0OworICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBwcm9jZXNzZWRNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHJ1bkNsZWFudXBQYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5DbGVhbnVwUGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBsYWJlbHMgPSB0aGlzLmNvbnRleHRMYWJlbFRhYmxlOworICAgICAgICB2YXIgYml0c0RlY29kZWQgPSB0aGlzLmJpdHNEZWNvZGVkOworICAgICAgICB2YXIgcHJvY2Vzc2luZ0ZsYWdzID0gdGhpcy5wcm9jZXNzaW5nRmxhZ3M7CisgICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTsKKyAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7CisgICAgICAgIHZhciBvbmVSb3dEb3duID0gd2lkdGg7CisgICAgICAgIHZhciB0d29Sb3dzRG93biA9IHdpZHRoICogMjsKKyAgICAgICAgdmFyIHRocmVlUm93c0Rvd24gPSB3aWR0aCAqIDM7CisgICAgICAgIHZhciBpTmV4dDsKKworICAgICAgICBmb3IgKHZhciBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCA9IGlOZXh0KSB7CisgICAgICAgICAgaU5leHQgPSBNYXRoLm1pbihpMCArIDQsIGhlaWdodCk7CisgICAgICAgICAgdmFyIGluZGV4QmFzZSA9IGkwICogd2lkdGg7CisgICAgICAgICAgdmFyIGNoZWNrQWxsRW1wdHkgPSBpMCArIDMgPCBoZWlnaHQ7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBpbmRleDAgPSBpbmRleEJhc2UgKyBqOworICAgICAgICAgICAgdmFyIGFsbEVtcHR5ID0gY2hlY2tBbGxFbXB0eSAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwXSA9PT0gMCAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgb25lUm93RG93bl0gPT09IDAgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHR3b1Jvd3NEb3duXSA9PT0gMCAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgdGhyZWVSb3dzRG93bl0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MF0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwOworICAgICAgICAgICAgdmFyIGkxID0gMCwKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4MDsKKyAgICAgICAgICAgIHZhciBpID0gaTAsCisgICAgICAgICAgICAgICAgc2lnbjsKKworICAgICAgICAgICAgaWYgKGFsbEVtcHR5KSB7CisgICAgICAgICAgICAgIHZhciBoYXNTaWduaWZpY2FudENvZWZmaWNlbnQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFJVTkxFTkdUSF9DT05URVhUKTsKKworICAgICAgICAgICAgICBpZiAoIWhhc1NpZ25pZmljYW50Q29lZmZpY2VudCkgeworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MF0rKzsKKyAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleDAgKyBvbmVSb3dEb3duXSsrOworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHR3b1Jvd3NEb3duXSsrOworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHRocmVlUm93c0Rvd25dKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpMSA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpOworCisgICAgICAgICAgICAgIGlmIChpMSAhPT0gMCkgeworICAgICAgICAgICAgICAgIGkgPSBpMCArIGkxOworICAgICAgICAgICAgICAgIGluZGV4ICs9IGkxICogd2lkdGg7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzaWduID0gdGhpcy5kZWNvZGVTaWduQml0KGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgIHRoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwOworCisgICAgICAgICAgICAgIGZvciAodmFyIGkyID0gaTA7IGkyIDw9IGk7IGkyKyssIGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpMSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSBpMCArIGkxOyBpIDwgaU5leHQ7IGkrKywgaW5kZXggKz0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fCAocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIHByb2Nlc3NlZE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dOworICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisKKyAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uID09PSAxKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CisgICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBjaGVja1NlZ21lbnRhdGlvblN5bWJvbDogZnVuY3Rpb24gQml0TW9kZWxfY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKSB7CisgICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyOworICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOworICAgICAgICB2YXIgc3ltYm9sID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpIDw8IDMgfCBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMiB8IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpOworCisgICAgICAgIGlmIChzeW1ib2wgIT09IDB4YSkgeworICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiSW52YWxpZCBzZWdtZW50YXRpb24gc3ltYm9sIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIHJldHVybiBCaXRNb2RlbDsKKyAgfSgpOworCisgIHZhciBUcmFuc2Zvcm0gPSBmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFRyYW5zZm9ybSgpIHt9CisKKyAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLmNhbGN1bGF0ZSA9IGZ1bmN0aW9uIHRyYW5zZm9ybUNhbGN1bGF0ZShzdWJiYW5kcywgdTAsIHYwKSB7CisgICAgICB2YXIgbGwgPSBzdWJiYW5kc1swXTsKKworICAgICAgZm9yICh2YXIgaSA9IDEsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBsbCA9IHRoaXMuaXRlcmF0ZShsbCwgc3ViYmFuZHNbaV0sIHUwLCB2MCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBsbDsKKyAgICB9OworCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbiBleHRlbmQoYnVmZmVyLCBvZmZzZXQsIHNpemUpIHsKKyAgICAgIHZhciBpMSA9IG9mZnNldCAtIDEsCisgICAgICAgICAgajEgPSBvZmZzZXQgKyAxOworICAgICAgdmFyIGkyID0gb2Zmc2V0ICsgc2l6ZSAtIDIsCisgICAgICAgICAgajIgPSBvZmZzZXQgKyBzaXplOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxXSA9IGJ1ZmZlcltqMV07CisgICAgICBidWZmZXJbajJdID0gYnVmZmVyW2kyXTsKKyAgICB9OworCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24gVHJhbnNmb3JtX2l0ZXJhdGUobGwsIGhsX2xoX2hoLCB1MCwgdjApIHsKKyAgICAgIHZhciBsbFdpZHRoID0gbGwud2lkdGgsCisgICAgICAgICAgbGxIZWlnaHQgPSBsbC5oZWlnaHQsCisgICAgICAgICAgbGxJdGVtcyA9IGxsLml0ZW1zOworICAgICAgdmFyIHdpZHRoID0gaGxfbGhfaGgud2lkdGg7CisgICAgICB2YXIgaGVpZ2h0ID0gaGxfbGhfaGguaGVpZ2h0OworICAgICAgdmFyIGl0ZW1zID0gaGxfbGhfaGguaXRlbXM7CisgICAgICB2YXIgaSwgaiwgaywgbCwgdSwgdjsKKworICAgICAgZm9yIChrID0gMCwgaSA9IDA7IGkgPCBsbEhlaWdodDsgaSsrKSB7CisgICAgICAgIGwgPSBpICogMiAqIHdpZHRoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsbFdpZHRoOyBqKyssIGsrKywgbCArPSAyKSB7CisgICAgICAgICAgaXRlbXNbbF0gPSBsbEl0ZW1zW2tdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxsSXRlbXMgPSBsbC5pdGVtcyA9IG51bGw7CisgICAgICB2YXIgYnVmZmVyUGFkZGluZyA9IDQ7CisgICAgICB2YXIgcm93QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCArIDIgKiBidWZmZXJQYWRkaW5nKTsKKworICAgICAgaWYgKHdpZHRoID09PSAxKSB7CisgICAgICAgIGlmICgodTAgJiAxKSAhPT0gMCkgeworICAgICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKKyAgICAgICAgICAgIGl0ZW1zW2tdICo9IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKKyAgICAgICAgICByb3dCdWZmZXIuc2V0KGl0ZW1zLnN1YmFycmF5KGssIGsgKyB3aWR0aCksIGJ1ZmZlclBhZGRpbmcpOworICAgICAgICAgIHRoaXMuZXh0ZW5kKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOworICAgICAgICAgIHRoaXMuZmlsdGVyKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOworICAgICAgICAgIGl0ZW1zLnNldChyb3dCdWZmZXIuc3ViYXJyYXkoYnVmZmVyUGFkZGluZywgYnVmZmVyUGFkZGluZyArIHdpZHRoKSwgayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIG51bUJ1ZmZlcnMgPSAxNjsKKyAgICAgIHZhciBjb2xCdWZmZXJzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspIHsKKyAgICAgICAgY29sQnVmZmVycy5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoaGVpZ2h0ICsgMiAqIGJ1ZmZlclBhZGRpbmcpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGIsCisgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IDA7CisgICAgICBsbCA9IGJ1ZmZlclBhZGRpbmcgKyBoZWlnaHQ7CisKKyAgICAgIGlmIChoZWlnaHQgPT09IDEpIHsKKyAgICAgICAgaWYgKCh2MCAmIDEpICE9PSAwKSB7CisgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHsKKyAgICAgICAgICAgIGl0ZW1zW3VdICo9IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodSA9IDA7IHUgPCB3aWR0aDsgdSsrKSB7CisgICAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXIgPT09IDApIHsKKyAgICAgICAgICAgIG51bUJ1ZmZlcnMgPSBNYXRoLm1pbih3aWR0aCAtIHUsIG51bUJ1ZmZlcnMpOworCisgICAgICAgICAgICBmb3IgKGsgPSB1LCBsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGNvbEJ1ZmZlcnNbYl1bbF0gPSBpdGVtc1trICsgYl07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IG51bUJ1ZmZlcnM7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudEJ1ZmZlci0tOworICAgICAgICAgIHZhciBidWZmZXIgPSBjb2xCdWZmZXJzW2N1cnJlbnRCdWZmZXJdOworICAgICAgICAgIHRoaXMuZXh0ZW5kKGJ1ZmZlciwgYnVmZmVyUGFkZGluZywgaGVpZ2h0KTsKKyAgICAgICAgICB0aGlzLmZpbHRlcihidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7CisKKyAgICAgICAgICBpZiAoY3VycmVudEJ1ZmZlciA9PT0gMCkgeworICAgICAgICAgICAgayA9IHUgLSBudW1CdWZmZXJzICsgMTsKKworICAgICAgICAgICAgZm9yIChsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGl0ZW1zW2sgKyBiXSA9IGNvbEJ1ZmZlcnNbYl1bbF07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgd2lkdGgsCisgICAgICAgIGhlaWdodCwKKyAgICAgICAgaXRlbXMKKyAgICAgIH07CisgICAgfTsKKworICAgIHJldHVybiBUcmFuc2Zvcm07CisgIH0oKTsKKworICB2YXIgSXJyZXZlcnNpYmxlVHJhbnNmb3JtID0gZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtQ2xvc3VyZSgpIHsKKyAgICBmdW5jdGlvbiBJcnJldmVyc2libGVUcmFuc2Zvcm0oKSB7CisgICAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTsKKyAgICB9CisKKyAgICBJcnJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm0ucHJvdG90eXBlKTsKKworICAgIElycmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gaXJyZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKHgsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7CisgICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwOworICAgICAgdmFyIGosIG4sIGN1cnJlbnQsIG5leHQ7CisgICAgICB2YXIgYWxwaGEgPSAtMS41ODYxMzQzNDIwNTk5MjQ7CisgICAgICB2YXIgYmV0YSA9IC0wLjA1Mjk4MDExODU3Mjk2MTsKKyAgICAgIHZhciBnYW1tYSA9IDAuODgyOTExMDc1NTMwOTM0OworICAgICAgdmFyIGRlbHRhID0gMC40NDM1MDY4NTIwNDM5NzE7CisgICAgICB2YXIgSyA9IDEuMjMwMTc0MTA0OTE0MDAxOworICAgICAgdmFyIEtfID0gMSAvIEs7CisgICAgICBqID0gb2Zmc2V0IC0gMzsKKworICAgICAgZm9yIChuID0gbGVuICsgNDsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgeFtqXSAqPSBLXzsKKyAgICAgIH0KKworICAgICAgaiA9IG9mZnNldCAtIDI7CisgICAgICBjdXJyZW50ID0gZGVsdGEgKiB4W2ogLSAxXTsKKworICAgICAgZm9yIChuID0gbGVuICsgMzsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgbmV4dCA9IGRlbHRhICogeFtqICsgMV07CisgICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0OworCisgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgY3VycmVudCA9IGRlbHRhICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSA9IEsgKiB4W2pdIC0gY3VycmVudCAtIG5leHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaiA9IG9mZnNldCAtIDE7CisgICAgICBjdXJyZW50ID0gZ2FtbWEgKiB4W2ogLSAxXTsKKworICAgICAgZm9yIChuID0gbGVuICsgMjsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgbmV4dCA9IGdhbW1hICogeFtqICsgMV07CisgICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7CisKKyAgICAgICAgaWYgKG4tLSkgeworICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICBjdXJyZW50ID0gZ2FtbWEgKiB4W2ogKyAxXTsKKyAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGogPSBvZmZzZXQ7CisgICAgICBjdXJyZW50ID0gYmV0YSAqIHhbaiAtIDFdOworCisgICAgICBmb3IgKG4gPSBsZW4gKyAxOyBuLS07IGogKz0gMikgeworICAgICAgICBuZXh0ID0gYmV0YSAqIHhbaiArIDFdOworICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworCisgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogKyAxXTsKKyAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChsZW4gIT09IDApIHsKKyAgICAgICAgaiA9IG9mZnNldCArIDE7CisgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiAtIDFdOworCisgICAgICAgIGZvciAobiA9IGxlbjsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgICBuZXh0ID0gYWxwaGEgKiB4W2ogKyAxXTsKKyAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworCisgICAgICAgICAgaWYgKG4tLSkgeworICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgY3VycmVudCA9IGFscGhhICogeFtqICsgMV07CisgICAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAgcmV0dXJuIElycmV2ZXJzaWJsZVRyYW5zZm9ybTsKKyAgfSgpOworCisgIHZhciBSZXZlcnNpYmxlVHJhbnNmb3JtID0gZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybSgpIHsKKyAgICAgIFRyYW5zZm9ybS5jYWxsKHRoaXMpOworICAgIH0KKworICAgIFJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm0ucHJvdG90eXBlKTsKKworICAgIFJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIHJldmVyc2libGVUcmFuc2Zvcm1GaWx0ZXIoeCwgb2Zmc2V0LCBsZW5ndGgpIHsKKyAgICAgIHZhciBsZW4gPSBsZW5ndGggPj4gMTsKKyAgICAgIG9mZnNldCA9IG9mZnNldCB8IDA7CisgICAgICB2YXIgaiwgbjsKKworICAgICAgZm9yIChqID0gb2Zmc2V0LCBuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgeFtqXSAtPSB4W2ogLSAxXSArIHhbaiArIDFdICsgMiA+PiAyOworICAgICAgfQorCisgICAgICBmb3IgKGogPSBvZmZzZXQgKyAxLCBuID0gbGVuOyBuLS07IGogKz0gMikgeworICAgICAgICB4W2pdICs9IHhbaiAtIDFdICsgeFtqICsgMV0gPj4gMTsKKyAgICAgIH0KKyAgICB9OworCisgICAgcmV0dXJuIFJldmVyc2libGVUcmFuc2Zvcm07CisgIH0oKTsKKworICByZXR1cm4gSnB4SW1hZ2U7Cit9KCk7CisKK2V4cG9ydHMuSnB4SW1hZ2UgPSBKcHhJbWFnZTsKKworLyoqKi8gfSksCisvKiAyMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmNhbGN1bGF0ZVNIQTUxMiA9IGV4cG9ydHMuY2FsY3VsYXRlU0hBMzg0ID0gZXhwb3J0cy5jYWxjdWxhdGVTSEEyNTYgPSBleHBvcnRzLmNhbGN1bGF0ZU1ENSA9IGV4cG9ydHMuUERGMjAgPSBleHBvcnRzLlBERjE3ID0gZXhwb3J0cy5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5ID0gZXhwb3J0cy5BUkNGb3VyQ2lwaGVyID0gZXhwb3J0cy5BRVMyNTZDaXBoZXIgPSBleHBvcnRzLkFFUzEyOENpcGhlciA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKKwordmFyIEFSQ0ZvdXJDaXBoZXIgPSBmdW5jdGlvbiBBUkNGb3VyQ2lwaGVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQVJDRm91ckNpcGhlcihrZXkpIHsKKyAgICB0aGlzLmEgPSAwOworICAgIHRoaXMuYiA9IDA7CisgICAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgyNTYpOworICAgIHZhciBpLAorICAgICAgICBqID0gMCwKKyAgICAgICAgdG1wLAorICAgICAgICBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICBzW2ldID0gaTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgIHRtcCA9IHNbaV07CisgICAgICBqID0gaiArIHRtcCArIGtleVtpICUga2V5TGVuZ3RoXSAmIDB4ZmY7CisgICAgICBzW2ldID0gc1tqXTsKKyAgICAgIHNbal0gPSB0bXA7CisgICAgfQorCisgICAgdGhpcy5zID0gczsKKyAgfQorCisgIEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlID0geworICAgIGVuY3J5cHRCbG9jazogZnVuY3Rpb24gQVJDRm91ckNpcGhlcl9lbmNyeXB0QmxvY2soZGF0YSkgeworICAgICAgdmFyIGksCisgICAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAorICAgICAgICAgIHRtcCwKKyAgICAgICAgICB0bXAyOworICAgICAgdmFyIGEgPSB0aGlzLmEsCisgICAgICAgICAgYiA9IHRoaXMuYiwKKyAgICAgICAgICBzID0gdGhpcy5zOworICAgICAgdmFyIG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG4pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGEgPSBhICsgMSAmIDB4ZmY7CisgICAgICAgIHRtcCA9IHNbYV07CisgICAgICAgIGIgPSBiICsgdG1wICYgMHhmZjsKKyAgICAgICAgdG1wMiA9IHNbYl07CisgICAgICAgIHNbYV0gPSB0bXAyOworICAgICAgICBzW2JdID0gdG1wOworICAgICAgICBvdXRwdXRbaV0gPSBkYXRhW2ldIF4gc1t0bXAgKyB0bXAyICYgMHhmZl07CisgICAgICB9CisKKyAgICAgIHRoaXMuYSA9IGE7CisgICAgICB0aGlzLmIgPSBiOworICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisgIH07CisgIEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmRlY3J5cHRCbG9jayA9IEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHRCbG9jazsKKyAgQVJDRm91ckNpcGhlci5wcm90b3R5cGUuZW5jcnlwdCA9IEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHRCbG9jazsKKyAgcmV0dXJuIEFSQ0ZvdXJDaXBoZXI7Cit9KCk7CisKK2V4cG9ydHMuQVJDRm91ckNpcGhlciA9IEFSQ0ZvdXJDaXBoZXI7CisKK3ZhciBjYWxjdWxhdGVNRDUgPSBmdW5jdGlvbiBjYWxjdWxhdGVNRDVDbG9zdXJlKCkgeworICB2YXIgciA9IG5ldyBVaW50OEFycmF5KFs3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjFdKTsKKyAgdmFyIGsgPSBuZXcgSW50MzJBcnJheShbLTY4MDg3NjkzNiwgLTM4OTU2NDU4NiwgNjA2MTA1ODE5LCAtMTA0NDUyNTMzMCwgLTE3NjQxODg5NywgMTIwMDA4MDQyNiwgLTE0NzMyMzEzNDEsIC00NTcwNTk4MywgMTc3MDAzNTQxNiwgLTE5NTg0MTQ0MTcsIC00MjA2MywgLTE5OTA0MDQxNjIsIDE4MDQ2MDM2ODIsIC00MDM0MTEwMSwgLTE1MDIwMDIyOTAsIDEyMzY1MzUzMjksIC0xNjU3OTY1MTAsIC0xMDY5NTAxNjMyLCA2NDM3MTc3MTMsIC0zNzM4OTczMDIsIC03MDE1NTg2OTEsIDM4MDE2MDgzLCAtNjYwNDc4MzM1LCAtNDA1NTM3ODQ4LCA1Njg0NDY0MzgsIC0xMDE5ODAzNjkwLCAtMTg3MzYzOTYxLCAxMTYzNTMxNTAxLCAtMTQ0NDY4MTQ2NywgLTUxNDAzNzg0LCAxNzM1MzI4NDczLCAtMTkyNjYwNzczNCwgLTM3ODU1OCwgLTIwMjI1NzQ0NjMsIDE4MzkwMzA1NjIsIC0zNTMwOTU1NiwgLTE1MzA5OTIwNjAsIDEyNzI4OTMzNTMsIC0xNTU0OTc2MzIsIC0xMDk0NzMwNjQwLCA2ODEyNzkxNzQsIC0zNTg1MzcyMjIsIC03MjI1MjE5NzksIDc2MDI5MTg5LCAtNjQwMzY0NDg3LCAtNDIxODE1ODM1LCA1MzA3NDI1MjAsIC05OTUzMzg2NTEsIC0xOTg2MzA4NDQsIDExMjY4OTE0MTUsIC0xNDE2MzU0OTA1LCAtNTc0MzQwNTUsIDE3MDA0ODU1NzEsIC0xODk0OTg2NjA2LCAtMTA1MTUyMywgLTIwNTQ5MjI3OTksIDE4NzMzMTMzNTksIC0zMDYxMTc0NCwgLTE1NjAxOTgzODAsIDEzMDkxNTE2NDksIC0xNDU1MjMwNzAsIC0xMTIwMjEwMzc5LCA3MTg3ODcyNTksIC0zNDM0ODU1NTFdKTsKKworICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgdmFyIGgwID0gMTczMjU4NDE5MywKKyAgICAgICAgaDEgPSAtMjcxNzMzODc5LAorICAgICAgICBoMiA9IC0xNzMyNTg0MTk0LAorICAgICAgICBoMyA9IDI3MTczMzg3ODsKKyAgICB2YXIgcGFkZGVkTGVuZ3RoID0gbGVuZ3RoICsgNzIgJiB+NjM7CisgICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7CisgICAgdmFyIGksIGosIG47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIHBhZGRlZFtpXSA9IGRhdGFbb2Zmc2V0KytdOworICAgIH0KKworICAgIHBhZGRlZFtpKytdID0gMHg4MDsKKyAgICBuID0gcGFkZGVkTGVuZ3RoIC0gODsKKworICAgIHdoaWxlIChpIDwgbikgeworICAgICAgcGFkZGVkW2krK10gPSAwOworICAgIH0KKworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoIDw8IDMgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDUgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAyMSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4+IDI5ICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICB2YXIgdyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraiwgaSArPSA0KSB7CisgICAgICAgIHdbal0gPSBwYWRkZWRbaV0gfCBwYWRkZWRbaSArIDFdIDw8IDggfCBwYWRkZWRbaSArIDJdIDw8IDE2IHwgcGFkZGVkW2kgKyAzXSA8PCAyNDsKKyAgICAgIH0KKworICAgICAgdmFyIGEgPSBoMCwKKyAgICAgICAgICBiID0gaDEsCisgICAgICAgICAgYyA9IGgyLAorICAgICAgICAgIGQgPSBoMywKKyAgICAgICAgICBmLAorICAgICAgICAgIGc7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgKytqKSB7CisgICAgICAgIGlmIChqIDwgMTYpIHsKKyAgICAgICAgICBmID0gYiAmIGMgfCB+YiAmIGQ7CisgICAgICAgICAgZyA9IGo7CisgICAgICAgIH0gZWxzZSBpZiAoaiA8IDMyKSB7CisgICAgICAgICAgZiA9IGQgJiBiIHwgfmQgJiBjOworICAgICAgICAgIGcgPSA1ICogaiArIDEgJiAxNTsKKyAgICAgICAgfSBlbHNlIGlmIChqIDwgNDgpIHsKKyAgICAgICAgICBmID0gYiBeIGMgXiBkOworICAgICAgICAgIGcgPSAzICogaiArIDUgJiAxNTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmID0gYyBeIChiIHwgfmQpOworICAgICAgICAgIGcgPSA3ICogaiAmIDE1OworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRtcCA9IGQsCisgICAgICAgICAgICByb3RhdGVBcmcgPSBhICsgZiArIGtbal0gKyB3W2ddIHwgMCwKKyAgICAgICAgICAgIHJvdGF0ZSA9IHJbal07CisgICAgICAgIGQgPSBjOworICAgICAgICBjID0gYjsKKyAgICAgICAgYiA9IGIgKyAocm90YXRlQXJnIDw8IHJvdGF0ZSB8IHJvdGF0ZUFyZyA+Pj4gMzIgLSByb3RhdGUpIHwgMDsKKyAgICAgICAgYSA9IHRtcDsKKyAgICAgIH0KKworICAgICAgaDAgPSBoMCArIGEgfCAwOworICAgICAgaDEgPSBoMSArIGIgfCAwOworICAgICAgaDIgPSBoMiArIGMgfCAwOworICAgICAgaDMgPSBoMyArIGQgfCAwOworICAgIH0KKworICAgIHJldHVybiBuZXcgVWludDhBcnJheShbaDAgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+Pj4gMjQgJiAweEZGLCBoMSAmIDB4RkYsIGgxID4+IDggJiAweEZGLCBoMSA+PiAxNiAmIDB4RkYsIGgxID4+PiAyNCAmIDB4RkYsIGgyICYgMHhGRiwgaDIgPj4gOCAmIDB4RkYsIGgyID4+IDE2ICYgMHhGRiwgaDIgPj4+IDI0ICYgMHhGRiwgaDMgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+Pj4gMjQgJiAweEZGXSk7CisgIH0KKworICByZXR1cm4gaGFzaDsKK30oKTsKKworZXhwb3J0cy5jYWxjdWxhdGVNRDUgPSBjYWxjdWxhdGVNRDU7CisKK3ZhciBXb3JkNjQgPSBmdW5jdGlvbiBXb3JkNjRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBXb3JkNjQoaGlnaEludGVnZXIsIGxvd0ludGVnZXIpIHsKKyAgICB0aGlzLmhpZ2ggPSBoaWdoSW50ZWdlciB8IDA7CisgICAgdGhpcy5sb3cgPSBsb3dJbnRlZ2VyIHwgMDsKKyAgfQorCisgIFdvcmQ2NC5wcm90b3R5cGUgPSB7CisgICAgYW5kOiBmdW5jdGlvbiBXb3JkNjRfYW5kKHdvcmQpIHsKKyAgICAgIHRoaXMuaGlnaCAmPSB3b3JkLmhpZ2g7CisgICAgICB0aGlzLmxvdyAmPSB3b3JkLmxvdzsKKyAgICB9LAorICAgIHhvcjogZnVuY3Rpb24gV29yZDY0X3hvcih3b3JkKSB7CisgICAgICB0aGlzLmhpZ2ggXj0gd29yZC5oaWdoOworICAgICAgdGhpcy5sb3cgXj0gd29yZC5sb3c7CisgICAgfSwKKyAgICBvcjogZnVuY3Rpb24gV29yZDY0X29yKHdvcmQpIHsKKyAgICAgIHRoaXMuaGlnaCB8PSB3b3JkLmhpZ2g7CisgICAgICB0aGlzLmxvdyB8PSB3b3JkLmxvdzsKKyAgICB9LAorICAgIHNoaWZ0UmlnaHQ6IGZ1bmN0aW9uIFdvcmQ2NF9zaGlmdFJpZ2h0KHBsYWNlcykgeworICAgICAgaWYgKHBsYWNlcyA+PSAzMikgeworICAgICAgICB0aGlzLmxvdyA9IHRoaXMuaGlnaCA+Pj4gcGxhY2VzIC0gMzIgfCAwOworICAgICAgICB0aGlzLmhpZ2ggPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5sb3cgPSB0aGlzLmxvdyA+Pj4gcGxhY2VzIHwgdGhpcy5oaWdoIDw8IDMyIC0gcGxhY2VzOworICAgICAgICB0aGlzLmhpZ2ggPSB0aGlzLmhpZ2ggPj4+IHBsYWNlcyB8IDA7CisgICAgICB9CisgICAgfSwKKyAgICBzaGlmdExlZnQ6IGZ1bmN0aW9uIFdvcmQ2NF9zaGlmdExlZnQocGxhY2VzKSB7CisgICAgICBpZiAocGxhY2VzID49IDMyKSB7CisgICAgICAgIHRoaXMuaGlnaCA9IHRoaXMubG93IDw8IHBsYWNlcyAtIDMyOworICAgICAgICB0aGlzLmxvdyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmhpZ2ggPSB0aGlzLmhpZ2ggPDwgcGxhY2VzIHwgdGhpcy5sb3cgPj4+IDMyIC0gcGxhY2VzOworICAgICAgICB0aGlzLmxvdyA9IHRoaXMubG93IDw8IHBsYWNlczsKKyAgICAgIH0KKyAgICB9LAorICAgIHJvdGF0ZVJpZ2h0OiBmdW5jdGlvbiBXb3JkNjRfcm90YXRlUmlnaHQocGxhY2VzKSB7CisgICAgICB2YXIgbG93LCBoaWdoOworCisgICAgICBpZiAocGxhY2VzICYgMzIpIHsKKyAgICAgICAgaGlnaCA9IHRoaXMubG93OworICAgICAgICBsb3cgPSB0aGlzLmhpZ2g7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb3cgPSB0aGlzLmxvdzsKKyAgICAgICAgaGlnaCA9IHRoaXMuaGlnaDsKKyAgICAgIH0KKworICAgICAgcGxhY2VzICY9IDMxOworICAgICAgdGhpcy5sb3cgPSBsb3cgPj4+IHBsYWNlcyB8IGhpZ2ggPDwgMzIgLSBwbGFjZXM7CisgICAgICB0aGlzLmhpZ2ggPSBoaWdoID4+PiBwbGFjZXMgfCBsb3cgPDwgMzIgLSBwbGFjZXM7CisgICAgfSwKKyAgICBub3Q6IGZ1bmN0aW9uIFdvcmQ2NF9ub3QoKSB7CisgICAgICB0aGlzLmhpZ2ggPSB+dGhpcy5oaWdoOworICAgICAgdGhpcy5sb3cgPSB+dGhpcy5sb3c7CisgICAgfSwKKyAgICBhZGQ6IGZ1bmN0aW9uIFdvcmQ2NF9hZGQod29yZCkgeworICAgICAgdmFyIGxvd0FkZCA9ICh0aGlzLmxvdyA+Pj4gMCkgKyAod29yZC5sb3cgPj4+IDApOworICAgICAgdmFyIGhpZ2hBZGQgPSAodGhpcy5oaWdoID4+PiAwKSArICh3b3JkLmhpZ2ggPj4+IDApOworCisgICAgICBpZiAobG93QWRkID4gMHhmZmZmZmZmZikgeworICAgICAgICBoaWdoQWRkICs9IDE7CisgICAgICB9CisKKyAgICAgIHRoaXMubG93ID0gbG93QWRkIHwgMDsKKyAgICAgIHRoaXMuaGlnaCA9IGhpZ2hBZGQgfCAwOworICAgIH0sCisgICAgY29weVRvOiBmdW5jdGlvbiBXb3JkNjRfY29weVRvKGJ5dGVzLCBvZmZzZXQpIHsKKyAgICAgIGJ5dGVzW29mZnNldF0gPSB0aGlzLmhpZ2ggPj4+IDI0ICYgMHhmZjsKKyAgICAgIGJ5dGVzW29mZnNldCArIDFdID0gdGhpcy5oaWdoID4+IDE2ICYgMHhmZjsKKyAgICAgIGJ5dGVzW29mZnNldCArIDJdID0gdGhpcy5oaWdoID4+IDggJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgM10gPSB0aGlzLmhpZ2ggJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgNF0gPSB0aGlzLmxvdyA+Pj4gMjQgJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgNV0gPSB0aGlzLmxvdyA+PiAxNiAmIDB4ZmY7CisgICAgICBieXRlc1tvZmZzZXQgKyA2XSA9IHRoaXMubG93ID4+IDggJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgN10gPSB0aGlzLmxvdyAmIDB4ZmY7CisgICAgfSwKKyAgICBhc3NpZ246IGZ1bmN0aW9uIFdvcmQ2NF9hc3NpZ24od29yZCkgeworICAgICAgdGhpcy5oaWdoID0gd29yZC5oaWdoOworICAgICAgdGhpcy5sb3cgPSB3b3JkLmxvdzsKKyAgICB9CisgIH07CisgIHJldHVybiBXb3JkNjQ7Cit9KCk7CisKK3ZhciBjYWxjdWxhdGVTSEEyNTYgPSBmdW5jdGlvbiBjYWxjdWxhdGVTSEEyNTZDbG9zdXJlKCkgeworICBmdW5jdGlvbiByb3RyKHgsIG4pIHsKKyAgICByZXR1cm4geCA+Pj4gbiB8IHggPDwgMzIgLSBuOworICB9CisKKyAgZnVuY3Rpb24gY2goeCwgeSwgeikgeworICAgIHJldHVybiB4ICYgeSBeIH54ICYgejsKKyAgfQorCisgIGZ1bmN0aW9uIG1haih4LCB5LCB6KSB7CisgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejsKKyAgfQorCisgIGZ1bmN0aW9uIHNpZ21hKHgpIHsKKyAgICByZXR1cm4gcm90cih4LCAyKSBeIHJvdHIoeCwgMTMpIF4gcm90cih4LCAyMik7CisgIH0KKworICBmdW5jdGlvbiBzaWdtYVByaW1lKHgpIHsKKyAgICByZXR1cm4gcm90cih4LCA2KSBeIHJvdHIoeCwgMTEpIF4gcm90cih4LCAyNSk7CisgIH0KKworICBmdW5jdGlvbiBsaXR0bGVTaWdtYSh4KSB7CisgICAgcmV0dXJuIHJvdHIoeCwgNykgXiByb3RyKHgsIDE4KSBeIHggPj4+IDM7CisgIH0KKworICBmdW5jdGlvbiBsaXR0bGVTaWdtYVByaW1lKHgpIHsKKyAgICByZXR1cm4gcm90cih4LCAxNykgXiByb3RyKHgsIDE5KSBeIHggPj4+IDEwOworICB9CisKKyAgdmFyIGsgPSBbMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCwgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NywgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMywgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMl07CisKKyAgZnVuY3Rpb24gaGFzaChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgeworICAgIHZhciBoMCA9IDB4NmEwOWU2NjcsCisgICAgICAgIGgxID0gMHhiYjY3YWU4NSwKKyAgICAgICAgaDIgPSAweDNjNmVmMzcyLAorICAgICAgICBoMyA9IDB4YTU0ZmY1M2EsCisgICAgICAgIGg0ID0gMHg1MTBlNTI3ZiwKKyAgICAgICAgaDUgPSAweDliMDU2ODhjLAorICAgICAgICBoNiA9IDB4MWY4M2Q5YWIsCisgICAgICAgIGg3ID0gMHg1YmUwY2QxOTsKKyAgICB2YXIgcGFkZGVkTGVuZ3RoID0gTWF0aC5jZWlsKChsZW5ndGggKyA5KSAvIDY0KSAqIDY0OworICAgIHZhciBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOworICAgIHZhciBpLCBqLCBuOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTsKKyAgICB9CisKKyAgICBwYWRkZWRbaSsrXSA9IDB4ODA7CisgICAgbiA9IHBhZGRlZExlbmd0aCAtIDg7CisKKyAgICB3aGlsZSAoaSA8IG4pIHsKKyAgICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICB9CisKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+Pj4gMjkgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDIxICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gNSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPDwgMyAmIDB4ZmY7CisgICAgdmFyIHcgPSBuZXcgVWludDMyQXJyYXkoNjQpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICAgIHdbal0gPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKKyAgICAgICAgaSArPSA0OworICAgICAgfQorCisgICAgICBmb3IgKGogPSAxNjsgaiA8IDY0OyArK2opIHsKKyAgICAgICAgd1tqXSA9IGxpdHRsZVNpZ21hUHJpbWUod1tqIC0gMl0pICsgd1tqIC0gN10gKyBsaXR0bGVTaWdtYSh3W2ogLSAxNV0pICsgd1tqIC0gMTZdIHwgMDsKKyAgICAgIH0KKworICAgICAgdmFyIGEgPSBoMCwKKyAgICAgICAgICBiID0gaDEsCisgICAgICAgICAgYyA9IGgyLAorICAgICAgICAgIGQgPSBoMywKKyAgICAgICAgICBlID0gaDQsCisgICAgICAgICAgZiA9IGg1LAorICAgICAgICAgIGcgPSBoNiwKKyAgICAgICAgICBoID0gaDcsCisgICAgICAgICAgdDEsCisgICAgICAgICAgdDI7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgKytqKSB7CisgICAgICAgIHQxID0gaCArIHNpZ21hUHJpbWUoZSkgKyBjaChlLCBmLCBnKSArIGtbal0gKyB3W2pdOworICAgICAgICB0MiA9IHNpZ21hKGEpICsgbWFqKGEsIGIsIGMpOworICAgICAgICBoID0gZzsKKyAgICAgICAgZyA9IGY7CisgICAgICAgIGYgPSBlOworICAgICAgICBlID0gZCArIHQxIHwgMDsKKyAgICAgICAgZCA9IGM7CisgICAgICAgIGMgPSBiOworICAgICAgICBiID0gYTsKKyAgICAgICAgYSA9IHQxICsgdDIgfCAwOworICAgICAgfQorCisgICAgICBoMCA9IGgwICsgYSB8IDA7CisgICAgICBoMSA9IGgxICsgYiB8IDA7CisgICAgICBoMiA9IGgyICsgYyB8IDA7CisgICAgICBoMyA9IGgzICsgZCB8IDA7CisgICAgICBoNCA9IGg0ICsgZSB8IDA7CisgICAgICBoNSA9IGg1ICsgZiB8IDA7CisgICAgICBoNiA9IGg2ICsgZyB8IDA7CisgICAgICBoNyA9IGg3ICsgaCB8IDA7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtoMCA+PiAyNCAmIDB4RkYsIGgwID4+IDE2ICYgMHhGRiwgaDAgPj4gOCAmIDB4RkYsIGgwICYgMHhGRiwgaDEgPj4gMjQgJiAweEZGLCBoMSA+PiAxNiAmIDB4RkYsIGgxID4+IDggJiAweEZGLCBoMSAmIDB4RkYsIGgyID4+IDI0ICYgMHhGRiwgaDIgPj4gMTYgJiAweEZGLCBoMiA+PiA4ICYgMHhGRiwgaDIgJiAweEZGLCBoMyA+PiAyNCAmIDB4RkYsIGgzID4+IDE2ICYgMHhGRiwgaDMgPj4gOCAmIDB4RkYsIGgzICYgMHhGRiwgaDQgPj4gMjQgJiAweEZGLCBoNCA+PiAxNiAmIDB4RkYsIGg0ID4+IDggJiAweEZGLCBoNCAmIDB4RkYsIGg1ID4+IDI0ICYgMHhGRiwgaDUgPj4gMTYgJiAweEZGLCBoNSA+PiA4ICYgMHhGRiwgaDUgJiAweEZGLCBoNiA+PiAyNCAmIDB4RkYsIGg2ID4+IDE2ICYgMHhGRiwgaDYgPj4gOCAmIDB4RkYsIGg2ICYgMHhGRiwgaDcgPj4gMjQgJiAweEZGLCBoNyA+PiAxNiAmIDB4RkYsIGg3ID4+IDggJiAweEZGLCBoNyAmIDB4RkZdKTsKKyAgfQorCisgIHJldHVybiBoYXNoOworfSgpOworCitleHBvcnRzLmNhbGN1bGF0ZVNIQTI1NiA9IGNhbGN1bGF0ZVNIQTI1NjsKKwordmFyIGNhbGN1bGF0ZVNIQTUxMiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTUxMkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGNoKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CisgICAgcmVzdWx0LmFzc2lnbih4KTsKKyAgICByZXN1bHQuYW5kKHkpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLm5vdCgpOworICAgIHRtcC5hbmQoeik7CisgICAgcmVzdWx0Lnhvcih0bXApOworICB9CisKKyAgZnVuY3Rpb24gbWFqKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CisgICAgcmVzdWx0LmFzc2lnbih4KTsKKyAgICByZXN1bHQuYW5kKHkpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLmFuZCh6KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgICAgdG1wLmFzc2lnbih5KTsKKyAgICB0bXAuYW5kKHopOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgfQorCisgIGZ1bmN0aW9uIHNpZ21hKHJlc3VsdCwgeCwgdG1wKSB7CisgICAgcmVzdWx0LmFzc2lnbih4KTsKKyAgICByZXN1bHQucm90YXRlUmlnaHQoMjgpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLnJvdGF0ZVJpZ2h0KDM0KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAucm90YXRlUmlnaHQoMzkpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgfQorCisgIGZ1bmN0aW9uIHNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKKyAgICByZXN1bHQuYXNzaWduKHgpOworICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxNCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAucm90YXRlUmlnaHQoMTgpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgICB0bXAuYXNzaWduKHgpOworICAgIHRtcC5yb3RhdGVSaWdodCg0MSk7CisgICAgcmVzdWx0Lnhvcih0bXApOworICB9CisKKyAgZnVuY3Rpb24gbGl0dGxlU2lnbWEocmVzdWx0LCB4LCB0bXApIHsKKyAgICByZXN1bHQuYXNzaWduKHgpOworICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxKTsKKyAgICB0bXAuYXNzaWduKHgpOworICAgIHRtcC5yb3RhdGVSaWdodCg4KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAuc2hpZnRSaWdodCg3KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgIH0KKworICBmdW5jdGlvbiBsaXR0bGVTaWdtYVByaW1lKHJlc3VsdCwgeCwgdG1wKSB7CisgICAgcmVzdWx0LmFzc2lnbih4KTsKKyAgICByZXN1bHQucm90YXRlUmlnaHQoMTkpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLnJvdGF0ZVJpZ2h0KDYxKTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAuc2hpZnRSaWdodCg2KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgIH0KKworICB2YXIgayA9IFtuZXcgV29yZDY0KDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIpLCBuZXcgV29yZDY0KDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QpLCBuZXcgV29yZDY0KDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYpLCBuZXcgV29yZDY0KDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMpLCBuZXcgV29yZDY0KDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgpLCBuZXcgV29yZDY0KDB4NTlmMTExZjEsIDB4YjYwNWQwMTkpLCBuZXcgV29yZDY0KDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIpLCBuZXcgV29yZDY0KDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgpLCBuZXcgV29yZDY0KDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIpLCBuZXcgV29yZDY0KDB4MTI4MzViMDEsIDB4NDU3MDZmYmUpLCBuZXcgV29yZDY0KDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMpLCBuZXcgV29yZDY0KDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIpLCBuZXcgV29yZDY0KDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYpLCBuZXcgV29yZDY0KDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEpLCBuZXcgV29yZDY0KDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUpLCBuZXcgV29yZDY0KDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQpLCBuZXcgV29yZDY0KDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIpLCBuZXcgV29yZDY0KDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMpLCBuZXcgV29yZDY0KDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUpLCBuZXcgV29yZDY0KDB4MjQwY2ExY2MsIDB4NzdhYzljNjUpLCBuZXcgV29yZDY0KDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUpLCBuZXcgV29yZDY0KDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMpLCBuZXcgV29yZDY0KDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQpLCBuZXcgV29yZDY0KDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUpLCBuZXcgV29yZDY0KDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIpLCBuZXcgV29yZDY0KDB4YTgzMWM2NmQsIDB4MmRiNDMyMTApLCBuZXcgV29yZDY0KDB4YjAwMzI3YzgsIDB4OThmYjIxM2YpLCBuZXcgV29yZDY0KDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQpLCBuZXcgV29yZDY0KDB4YzZlMDBiZjMsIDB4M2RhODhmYzIpLCBuZXcgV29yZDY0KDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUpLCBuZXcgV29yZDY0KDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYpLCBuZXcgV29yZDY0KDB4MTQyOTI5NjcsIDB4MGEwZTZlNzApLCBuZXcgV29yZDY0KDB4MjdiNzBhODUsIDB4NDZkMjJmZmMpLCBuZXcgV29yZDY0KDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYpLCBuZXcgV29yZDY0KDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQpLCBuZXcgV29yZDY0KDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYpLCBuZXcgV29yZDY0KDB4NjUwYTczNTQsIDB4OGJhZjYzZGUpLCBuZXcgV29yZDY0KDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgpLCBuZXcgV29yZDY0KDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYpLCBuZXcgV29yZDY0KDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IpLCBuZXcgV29yZDY0KDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQpLCBuZXcgV29yZDY0KDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEpLCBuZXcgV29yZDY0KDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEpLCBuZXcgV29yZDY0KDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzApLCBuZXcgV29yZDY0KDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgpLCBuZXcgV29yZDY0KDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTApLCBuZXcgV29yZDY0KDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEpLCBuZXcgV29yZDY0KDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgpLCBuZXcgV29yZDY0KDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgpLCBuZXcgV29yZDY0KDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMpLCBuZXcgV29yZDY0KDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTkpLCBuZXcgV29yZDY0KDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgpLCBuZXcgV29yZDY0KDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMpLCBuZXcgV29yZDY0KDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IpLCBuZXcgV29yZDY0KDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMpLCBuZXcgV29yZDY0KDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMpLCBuZXcgV29yZDY0KDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMpLCBuZXcgV29yZDY0KDB4NzhhNTYzNmYsIDB4NDMxNzJmNjApLCBuZXcgV29yZDY0KDB4ODRjODc4MTQsIDB4YTFmMGFiNzIpLCBuZXcgV29yZDY0KDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMpLCBuZXcgV29yZDY0KDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgpLCBuZXcgV29yZDY0KDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTkpLCBuZXcgV29yZDY0KDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUpLCBuZXcgV29yZDY0KDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIpLCBuZXcgV29yZDY0KDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMpLCBuZXcgV29yZDY0KDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcpLCBuZXcgV29yZDY0KDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUpLCBuZXcgV29yZDY0KDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgpLCBuZXcgV29yZDY0KDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEpLCBuZXcgV29yZDY0KDB4MGE2MzdkYzUsIDB4YTJjODk4YTYpLCBuZXcgV29yZDY0KDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUpLCBuZXcgV29yZDY0KDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIpLCBuZXcgV29yZDY0KDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQpLCBuZXcgV29yZDY0KDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMpLCBuZXcgV29yZDY0KDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMpLCBuZXcgV29yZDY0KDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMpLCBuZXcgV29yZDY0KDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYpLCBuZXcgV29yZDY0KDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEpLCBuZXcgV29yZDY0KDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMpLCBuZXcgV29yZDY0KDB4NmM0NDE5OGMsIDB4NGE0NzU4MTcpXTsKKworICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCBtb2RlMzg0KSB7CisgICAgbW9kZTM4NCA9ICEhbW9kZTM4NDsKKyAgICB2YXIgaDAsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIGg3OworCisgICAgaWYgKCFtb2RlMzg0KSB7CisgICAgICBoMCA9IG5ldyBXb3JkNjQoMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCk7CisgICAgICBoMSA9IG5ldyBXb3JkNjQoMHhiYjY3YWU4NSwgMHg4NGNhYTczYik7CisgICAgICBoMiA9IG5ldyBXb3JkNjQoMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYik7CisgICAgICBoMyA9IG5ldyBXb3JkNjQoMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSk7CisgICAgICBoNCA9IG5ldyBXb3JkNjQoMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSk7CisgICAgICBoNSA9IG5ldyBXb3JkNjQoMHg5YjA1Njg4YywgMHgyYjNlNmMxZik7CisgICAgICBoNiA9IG5ldyBXb3JkNjQoMHgxZjgzZDlhYiwgMHhmYjQxYmQ2Yik7CisgICAgICBoNyA9IG5ldyBXb3JkNjQoMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGgwID0gbmV3IFdvcmQ2NCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KTsKKyAgICAgIGgxID0gbmV3IFdvcmQ2NCgweDYyOWEyOTJhLCAweDM2N2NkNTA3KTsKKyAgICAgIGgyID0gbmV3IFdvcmQ2NCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KTsKKyAgICAgIGgzID0gbmV3IFdvcmQ2NCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KTsKKyAgICAgIGg0ID0gbmV3IFdvcmQ2NCgweDY3MzMyNjY3LCAweGZmYzAwYjMxKTsKKyAgICAgIGg1ID0gbmV3IFdvcmQ2NCgweDhlYjQ0YTg3LCAweDY4NTgxNTExKTsKKyAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KTsKKyAgICAgIGg3ID0gbmV3IFdvcmQ2NCgweDQ3YjU0ODFkLCAweGJlZmE0ZmE0KTsKKyAgICB9CisKKyAgICB2YXIgcGFkZGVkTGVuZ3RoID0gTWF0aC5jZWlsKChsZW5ndGggKyAxNykgLyAxMjgpICogMTI4OworICAgIHZhciBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOworICAgIHZhciBpLCBqLCBuOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTsKKyAgICB9CisKKyAgICBwYWRkZWRbaSsrXSA9IDB4ODA7CisgICAgbiA9IHBhZGRlZExlbmd0aCAtIDE2OworCisgICAgd2hpbGUgKGkgPCBuKSB7CisgICAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgfQorCisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+Pj4gMjkgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDIxICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gNSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPDwgMyAmIDB4ZmY7CisgICAgdmFyIHcgPSBuZXcgQXJyYXkoODApOworCisgICAgZm9yIChpID0gMDsgaSA8IDgwOyBpKyspIHsKKyAgICAgIHdbaV0gPSBuZXcgV29yZDY0KDAsIDApOworICAgIH0KKworICAgIHZhciBhID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgYiA9IG5ldyBXb3JkNjQoMCwgMCksCisgICAgICAgIGMgPSBuZXcgV29yZDY0KDAsIDApOworICAgIHZhciBkID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgZSA9IG5ldyBXb3JkNjQoMCwgMCksCisgICAgICAgIGYgPSBuZXcgV29yZDY0KDAsIDApOworICAgIHZhciBnID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgaCA9IG5ldyBXb3JkNjQoMCwgMCk7CisgICAgdmFyIHQxID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgdDIgPSBuZXcgV29yZDY0KDAsIDApOworICAgIHZhciB0bXAxID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgdG1wMiA9IG5ldyBXb3JkNjQoMCwgMCksCisgICAgICAgIHRtcDM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFkZGVkTGVuZ3RoOykgeworICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgd1tqXS5oaWdoID0gcGFkZGVkW2ldIDw8IDI0IHwgcGFkZGVkW2kgKyAxXSA8PCAxNiB8IHBhZGRlZFtpICsgMl0gPDwgOCB8IHBhZGRlZFtpICsgM107CisgICAgICAgIHdbal0ubG93ID0gcGFkZGVkW2kgKyA0XSA8PCAyNCB8IHBhZGRlZFtpICsgNV0gPDwgMTYgfCBwYWRkZWRbaSArIDZdIDw8IDggfCBwYWRkZWRbaSArIDddOworICAgICAgICBpICs9IDg7CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IDE2OyBqIDwgODA7ICsraikgeworICAgICAgICB0bXAzID0gd1tqXTsKKyAgICAgICAgbGl0dGxlU2lnbWFQcmltZSh0bXAzLCB3W2ogLSAyXSwgdG1wMik7CisgICAgICAgIHRtcDMuYWRkKHdbaiAtIDddKTsKKyAgICAgICAgbGl0dGxlU2lnbWEodG1wMSwgd1tqIC0gMTVdLCB0bXAyKTsKKyAgICAgICAgdG1wMy5hZGQodG1wMSk7CisgICAgICAgIHRtcDMuYWRkKHdbaiAtIDE2XSk7CisgICAgICB9CisKKyAgICAgIGEuYXNzaWduKGgwKTsKKyAgICAgIGIuYXNzaWduKGgxKTsKKyAgICAgIGMuYXNzaWduKGgyKTsKKyAgICAgIGQuYXNzaWduKGgzKTsKKyAgICAgIGUuYXNzaWduKGg0KTsKKyAgICAgIGYuYXNzaWduKGg1KTsKKyAgICAgIGcuYXNzaWduKGg2KTsKKyAgICAgIGguYXNzaWduKGg3KTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IDgwOyArK2opIHsKKyAgICAgICAgdDEuYXNzaWduKGgpOworICAgICAgICBzaWdtYVByaW1lKHRtcDEsIGUsIHRtcDIpOworICAgICAgICB0MS5hZGQodG1wMSk7CisgICAgICAgIGNoKHRtcDEsIGUsIGYsIGcsIHRtcDIpOworICAgICAgICB0MS5hZGQodG1wMSk7CisgICAgICAgIHQxLmFkZChrW2pdKTsKKyAgICAgICAgdDEuYWRkKHdbal0pOworICAgICAgICBzaWdtYSh0MiwgYSwgdG1wMik7CisgICAgICAgIG1haih0bXAxLCBhLCBiLCBjLCB0bXAyKTsKKyAgICAgICAgdDIuYWRkKHRtcDEpOworICAgICAgICB0bXAzID0gaDsKKyAgICAgICAgaCA9IGc7CisgICAgICAgIGcgPSBmOworICAgICAgICBmID0gZTsKKyAgICAgICAgZC5hZGQodDEpOworICAgICAgICBlID0gZDsKKyAgICAgICAgZCA9IGM7CisgICAgICAgIGMgPSBiOworICAgICAgICBiID0gYTsKKyAgICAgICAgdG1wMy5hc3NpZ24odDEpOworICAgICAgICB0bXAzLmFkZCh0Mik7CisgICAgICAgIGEgPSB0bXAzOworICAgICAgfQorCisgICAgICBoMC5hZGQoYSk7CisgICAgICBoMS5hZGQoYik7CisgICAgICBoMi5hZGQoYyk7CisgICAgICBoMy5hZGQoZCk7CisgICAgICBoNC5hZGQoZSk7CisgICAgICBoNS5hZGQoZik7CisgICAgICBoNi5hZGQoZyk7CisgICAgICBoNy5hZGQoaCk7CisgICAgfQorCisgICAgdmFyIHJlc3VsdDsKKworICAgIGlmICghbW9kZTM4NCkgeworICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoNjQpOworICAgICAgaDAuY29weVRvKHJlc3VsdCwgMCk7CisgICAgICBoMS5jb3B5VG8ocmVzdWx0LCA4KTsKKyAgICAgIGgyLmNvcHlUbyhyZXN1bHQsIDE2KTsKKyAgICAgIGgzLmNvcHlUbyhyZXN1bHQsIDI0KTsKKyAgICAgIGg0LmNvcHlUbyhyZXN1bHQsIDMyKTsKKyAgICAgIGg1LmNvcHlUbyhyZXN1bHQsIDQwKTsKKyAgICAgIGg2LmNvcHlUbyhyZXN1bHQsIDQ4KTsKKyAgICAgIGg3LmNvcHlUbyhyZXN1bHQsIDU2KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoNDgpOworICAgICAgaDAuY29weVRvKHJlc3VsdCwgMCk7CisgICAgICBoMS5jb3B5VG8ocmVzdWx0LCA4KTsKKyAgICAgIGgyLmNvcHlUbyhyZXN1bHQsIDE2KTsKKyAgICAgIGgzLmNvcHlUbyhyZXN1bHQsIDI0KTsKKyAgICAgIGg0LmNvcHlUbyhyZXN1bHQsIDMyKTsKKyAgICAgIGg1LmNvcHlUbyhyZXN1bHQsIDQwKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIGhhc2g7Cit9KCk7CisKK2V4cG9ydHMuY2FsY3VsYXRlU0hBNTEyID0gY2FsY3VsYXRlU0hBNTEyOworCit2YXIgY2FsY3VsYXRlU0hBMzg0ID0gZnVuY3Rpb24gY2FsY3VsYXRlU0hBMzg0Q2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gaGFzaChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgeworICAgIHJldHVybiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOworICB9CisKKyAgcmV0dXJuIGhhc2g7Cit9KCk7CisKK2V4cG9ydHMuY2FsY3VsYXRlU0hBMzg0ID0gY2FsY3VsYXRlU0hBMzg0OworCit2YXIgTnVsbENpcGhlciA9IGZ1bmN0aW9uIE51bGxDaXBoZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiBOdWxsQ2lwaGVyKCkge30KKworICBOdWxsQ2lwaGVyLnByb3RvdHlwZSA9IHsKKyAgICBkZWNyeXB0QmxvY2s6IGZ1bmN0aW9uIE51bGxDaXBoZXJfZGVjcnlwdEJsb2NrKGRhdGEpIHsKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisgICAgZW5jcnlwdDogZnVuY3Rpb24gTnVsbENpcGhlcl9lbmNyeXB0KGRhdGEpIHsKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIE51bGxDaXBoZXI7Cit9KCk7CisKK2NsYXNzIEFFU0Jhc2VDaXBoZXIgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQUVTQmFzZUNpcGhlcikgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQUVTQmFzZUNpcGhlci4iKTsKKyAgICB9CisKKyAgICB0aGlzLl9zID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsIDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsIDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsIDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsIDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsIDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsIDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsIDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksIDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsIDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTZdKTsKKyAgICB0aGlzLl9pbnZfcyA9IG5ldyBVaW50OEFycmF5KFsweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiLCAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LCAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkLCAweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlLCAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLCAweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1LCAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LCAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhLCAweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0LCAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2LCAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLCAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhLCAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLCAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LCAweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlLCAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LCAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwLCAweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0LCAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLCAweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmLCAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLCAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwLCAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLCAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkXSk7CisgICAgdGhpcy5fbWl4ID0gbmV3IFVpbnQzMkFycmF5KFsweDAwMDAwMDAwLCAweDBlMDkwZDBiLCAweDFjMTIxYTE2LCAweDEyMWIxNzFkLCAweDM4MjQzNDJjLCAweDM2MmQzOTI3LCAweDI0MzYyZTNhLCAweDJhM2YyMzMxLCAweDcwNDg2ODU4LCAweDdlNDE2NTUzLCAweDZjNWE3MjRlLCAweDYyNTM3ZjQ1LCAweDQ4NmM1Yzc0LCAweDQ2NjU1MTdmLCAweDU0N2U0NjYyLCAweDVhNzc0YjY5LCAweGUwOTBkMGIwLCAweGVlOTlkZGJiLCAweGZjODJjYWE2LCAweGYyOGJjN2FkLCAweGQ4YjRlNDljLCAweGQ2YmRlOTk3LCAweGM0YTZmZThhLCAweGNhYWZmMzgxLCAweDkwZDhiOGU4LCAweDllZDFiNWUzLCAweDhjY2FhMmZlLCAweDgyYzNhZmY1LCAweGE4ZmM4Y2M0LCAweGE2ZjU4MWNmLCAweGI0ZWU5NmQyLCAweGJhZTc5YmQ5LCAweGRiM2JiYjdiLCAweGQ1MzJiNjcwLCAweGM3MjlhMTZkLCAweGM5MjBhYzY2LCAweGUzMWY4ZjU3LCAweGVkMTY4MjVjLCAweGZmMGQ5NTQxLCAweGYxMDQ5ODRhLCAweGFiNzNkMzIzLCAweGE1N2FkZTI4LCAweGI3NjFjOTM1LCAweGI5NjhjNDNlLCAweDkzNTdlNzBmLCAweDlkNWVlYTA0LCAweDhmNDVmZDE5LCAweDgxNGNmMDEyLCAweDNiYWI2YmNiLCAweDM1YTI2NmMwLCAweDI3Yjk3MWRkLCAweDI5YjA3Y2Q2LCAweDAzOGY1ZmU3LCAweDBkODY1MmVjLCAweDFmOWQ0NWYxLCAweDExOTQ0OGZhLCAweDRiZTMwMzkzLCAweDQ1ZWEwZTk4LCAweDU3ZjExOTg1LCAweDU5ZjgxNDhlLCAweDczYzczN2JmLCAweDdkY2UzYWI0LCAweDZmZDUyZGE5LCAweDYxZGMyMGEyLCAweGFkNzY2ZGY2LCAweGEzN2Y2MGZkLCAweGIxNjQ3N2UwLCAweGJmNmQ3YWViLCAweDk1NTI1OWRhLCAweDliNWI1NGQxLCAweDg5NDA0M2NjLCAweDg3NDk0ZWM3LCAweGRkM2UwNWFlLCAweGQzMzcwOGE1LCAweGMxMmMxZmI4LCAweGNmMjUxMmIzLCAweGU1MWEzMTgyLCAweGViMTMzYzg5LCAweGY5MDgyYjk0LCAweGY3MDEyNjlmLCAweDRkZTZiZDQ2LCAweDQzZWZiMDRkLCAweDUxZjRhNzUwLCAweDVmZmRhYTViLCAweDc1YzI4OTZhLCAweDdiY2I4NDYxLCAweDY5ZDA5MzdjLCAweDY3ZDk5ZTc3LCAweDNkYWVkNTFlLCAweDMzYTdkODE1LCAweDIxYmNjZjA4LCAweDJmYjVjMjAzLCAweDA1OGFlMTMyLCAweDBiODNlYzM5LCAweDE5OThmYjI0LCAweDE3OTFmNjJmLCAweDc2NGRkNjhkLCAweDc4NDRkYjg2LCAweDZhNWZjYzliLCAweDY0NTZjMTkwLCAweDRlNjllMmExLCAweDQwNjBlZmFhLCAweDUyN2JmOGI3LCAweDVjNzJmNWJjLCAweDA2MDViZWQ1LCAweDA4MGNiM2RlLCAweDFhMTdhNGMzLCAweDE0MWVhOWM4LCAweDNlMjE4YWY5LCAweDMwMjg4N2YyLCAweDIyMzM5MGVmLCAweDJjM2E5ZGU0LCAweDk2ZGQwNjNkLCAweDk4ZDQwYjM2LCAweDhhY2YxYzJiLCAweDg0YzYxMTIwLCAweGFlZjkzMjExLCAweGEwZjAzZjFhLCAweGIyZWIyODA3LCAweGJjZTIyNTBjLCAweGU2OTU2ZTY1LCAweGU4OWM2MzZlLCAweGZhODc3NDczLCAweGY0OGU3OTc4LCAweGRlYjE1YTQ5LCAweGQwYjg1NzQyLCAweGMyYTM0MDVmLCAweGNjYWE0ZDU0LCAweDQxZWNkYWY3LCAweDRmZTVkN2ZjLCAweDVkZmVjMGUxLCAweDUzZjdjZGVhLCAweDc5YzhlZWRiLCAweDc3YzFlM2QwLCAweDY1ZGFmNGNkLCAweDZiZDNmOWM2LCAweDMxYTRiMmFmLCAweDNmYWRiZmE0LCAweDJkYjZhOGI5LCAweDIzYmZhNWIyLCAweDA5ODA4NjgzLCAweDA3ODk4Yjg4LCAweDE1OTI5Yzk1LCAweDFiOWI5MTllLCAweGExN2MwYTQ3LCAweGFmNzUwNzRjLCAweGJkNmUxMDUxLCAweGIzNjcxZDVhLCAweDk5NTgzZTZiLCAweDk3NTEzMzYwLCAweDg1NGEyNDdkLCAweDhiNDMyOTc2LCAweGQxMzQ2MjFmLCAweGRmM2Q2ZjE0LCAweGNkMjY3ODA5LCAweGMzMmY3NTAyLCAweGU5MTA1NjMzLCAweGU3MTk1YjM4LCAweGY1MDI0YzI1LCAweGZiMGI0MTJlLCAweDlhZDc2MThjLCAweDk0ZGU2Yzg3LCAweDg2YzU3YjlhLCAweDg4Y2M3NjkxLCAweGEyZjM1NWEwLCAweGFjZmE1OGFiLCAweGJlZTE0ZmI2LCAweGIwZTg0MmJkLCAweGVhOWYwOWQ0LCAweGU0OTYwNGRmLCAweGY2OGQxM2MyLCAweGY4ODQxZWM5LCAweGQyYmIzZGY4LCAweGRjYjIzMGYzLCAweGNlYTkyN2VlLCAweGMwYTAyYWU1LCAweDdhNDdiMTNjLCAweDc0NGViYzM3LCAweDY2NTVhYjJhLCAweDY4NWNhNjIxLCAweDQyNjM4NTEwLCAweDRjNmE4ODFiLCAweDVlNzE5ZjA2LCAweDUwNzg5MjBkLCAweDBhMGZkOTY0LCAweDA0MDZkNDZmLCAweDE2MWRjMzcyLCAweDE4MTRjZTc5LCAweDMyMmJlZDQ4LCAweDNjMjJlMDQzLCAweDJlMzlmNzVlLCAweDIwMzBmYTU1LCAweGVjOWFiNzAxLCAweGUyOTNiYTBhLCAweGYwODhhZDE3LCAweGZlODFhMDFjLCAweGQ0YmU4MzJkLCAweGRhYjc4ZTI2LCAweGM4YWM5OTNiLCAweGM2YTU5NDMwLCAweDljZDJkZjU5LCAweDkyZGJkMjUyLCAweDgwYzBjNTRmLCAweDhlYzljODQ0LCAweGE0ZjZlYjc1LCAweGFhZmZlNjdlLCAweGI4ZTRmMTYzLCAweGI2ZWRmYzY4LCAweDBjMGE2N2IxLCAweDAyMDM2YWJhLCAweDEwMTg3ZGE3LCAweDFlMTE3MGFjLCAweDM0MmU1MzlkLCAweDNhMjc1ZTk2LCAweDI4M2M0OThiLCAweDI2MzU0NDgwLCAweDdjNDIwZmU5LCAweDcyNGIwMmUyLCAweDYwNTAxNWZmLCAweDZlNTkxOGY0LCAweDQ0NjYzYmM1LCAweDRhNmYzNmNlLCAweDU4NzQyMWQzLCAweDU2N2QyY2Q4LCAweDM3YTEwYzdhLCAweDM5YTgwMTcxLCAweDJiYjMxNjZjLCAweDI1YmExYjY3LCAweDBmODUzODU2LCAweDAxOGMzNTVkLCAweDEzOTcyMjQwLCAweDFkOWUyZjRiLCAweDQ3ZTk2NDIyLCAweDQ5ZTA2OTI5LCAweDViZmI3ZTM0LCAweDU1ZjI3MzNmLCAweDdmY2Q1MDBlLCAweDcxYzQ1ZDA1LCAweDYzZGY0YTE4LCAweDZkZDY0NzEzLCAweGQ3MzFkY2NhLCAweGQ5MzhkMWMxLCAweGNiMjNjNmRjLCAweGM1MmFjYmQ3LCAweGVmMTVlOGU2LCAweGUxMWNlNWVkLCAweGYzMDdmMmYwLCAweGZkMGVmZmZiLCAweGE3NzliNDkyLCAweGE5NzBiOTk5LCAweGJiNmJhZTg0LCAweGI1NjJhMzhmLCAweDlmNWQ4MGJlLCAweDkxNTQ4ZGI1LCAweDgzNGY5YWE4LCAweDhkNDY5N2EzXSk7CisgICAgdGhpcy5fbWl4Q29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIGlmIChpIDwgMTI4KSB7CisgICAgICAgIHRoaXMuX21peENvbFtpXSA9IGkgPDwgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX21peENvbFtpXSA9IGkgPDwgMSBeIDB4MWI7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgdGhpcy5idWZmZXJQb3NpdGlvbiA9IDA7CisgIH0KKworICBfZXhwYW5kS2V5KGNpcGhlcktleSkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBjYWxsIGBfZXhwYW5kS2V5YCBvbiB0aGUgYmFzZSBjbGFzcyIpOworICB9CisKKyAgX2RlY3J5cHQoaW5wdXQsIGtleSkgeworICAgIGxldCB0LCB1LCB2OworICAgIGNvbnN0IHN0YXRlID0gbmV3IFVpbnQ4QXJyYXkoMTYpOworICAgIHN0YXRlLnNldChpbnB1dCk7CisKKyAgICBmb3IgKGxldCBqID0gMCwgayA9IHRoaXMuX2tleVNpemU7IGogPCAxNjsgKytqLCArK2spIHsKKyAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uIC0gMTsgaSA+PSAxOyAtLWkpIHsKKyAgICAgIHQgPSBzdGF0ZVsxM107CisgICAgICBzdGF0ZVsxM10gPSBzdGF0ZVs5XTsKKyAgICAgIHN0YXRlWzldID0gc3RhdGVbNV07CisgICAgICBzdGF0ZVs1XSA9IHN0YXRlWzFdOworICAgICAgc3RhdGVbMV0gPSB0OworICAgICAgdCA9IHN0YXRlWzE0XTsKKyAgICAgIHUgPSBzdGF0ZVsxMF07CisgICAgICBzdGF0ZVsxNF0gPSBzdGF0ZVs2XTsKKyAgICAgIHN0YXRlWzEwXSA9IHN0YXRlWzJdOworICAgICAgc3RhdGVbNl0gPSB0OworICAgICAgc3RhdGVbMl0gPSB1OworICAgICAgdCA9IHN0YXRlWzE1XTsKKyAgICAgIHUgPSBzdGF0ZVsxMV07CisgICAgICB2ID0gc3RhdGVbN107CisgICAgICBzdGF0ZVsxNV0gPSBzdGF0ZVszXTsKKyAgICAgIHN0YXRlWzExXSA9IHQ7CisgICAgICBzdGF0ZVs3XSA9IHU7CisgICAgICBzdGF0ZVszXSA9IHY7CisKKyAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICBzdGF0ZVtqXSA9IHRoaXMuX2ludl9zW3N0YXRlW2pdXTsKKyAgICAgIH0KKworICAgICAgZm9yIChsZXQgaiA9IDAsIGsgPSBpICogMTY7IGogPCAxNjsgKytqLCArK2spIHsKKyAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOworICAgICAgfQorCisgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKKyAgICAgICAgY29uc3QgczAgPSB0aGlzLl9taXhbc3RhdGVbal1dOworICAgICAgICBjb25zdCBzMSA9IHRoaXMuX21peFtzdGF0ZVtqICsgMV1dOworICAgICAgICBjb25zdCBzMiA9IHRoaXMuX21peFtzdGF0ZVtqICsgMl1dOworICAgICAgICBjb25zdCBzMyA9IHRoaXMuX21peFtzdGF0ZVtqICsgM11dOworICAgICAgICB0ID0gczAgXiBzMSA+Pj4gOCBeIHMxIDw8IDI0IF4gczIgPj4+IDE2IF4gczIgPDwgMTYgXiBzMyA+Pj4gMjQgXiBzMyA8PCA4OworICAgICAgICBzdGF0ZVtqXSA9IHQgPj4+IDI0ICYgMHhmZjsKKyAgICAgICAgc3RhdGVbaiArIDFdID0gdCA+PiAxNiAmIDB4ZmY7CisgICAgICAgIHN0YXRlW2ogKyAyXSA9IHQgPj4gOCAmIDB4ZmY7CisgICAgICAgIHN0YXRlW2ogKyAzXSA9IHQgJiAweGZmOworICAgICAgfQorICAgIH0KKworICAgIHQgPSBzdGF0ZVsxM107CisgICAgc3RhdGVbMTNdID0gc3RhdGVbOV07CisgICAgc3RhdGVbOV0gPSBzdGF0ZVs1XTsKKyAgICBzdGF0ZVs1XSA9IHN0YXRlWzFdOworICAgIHN0YXRlWzFdID0gdDsKKyAgICB0ID0gc3RhdGVbMTRdOworICAgIHUgPSBzdGF0ZVsxMF07CisgICAgc3RhdGVbMTRdID0gc3RhdGVbNl07CisgICAgc3RhdGVbMTBdID0gc3RhdGVbMl07CisgICAgc3RhdGVbNl0gPSB0OworICAgIHN0YXRlWzJdID0gdTsKKyAgICB0ID0gc3RhdGVbMTVdOworICAgIHUgPSBzdGF0ZVsxMV07CisgICAgdiA9IHN0YXRlWzddOworICAgIHN0YXRlWzE1XSA9IHN0YXRlWzNdOworICAgIHN0YXRlWzExXSA9IHQ7CisgICAgc3RhdGVbN10gPSB1OworICAgIHN0YXRlWzNdID0gdjsKKworICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgc3RhdGVbal0gPSB0aGlzLl9pbnZfc1tzdGF0ZVtqXV07CisgICAgICBzdGF0ZVtqXSBePSBrZXlbal07CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRlOworICB9CisKKyAgX2VuY3J5cHQoaW5wdXQsIGtleSkgeworICAgIGNvbnN0IHMgPSB0aGlzLl9zOworICAgIGxldCB0LCB1LCB2OworICAgIGNvbnN0IHN0YXRlID0gbmV3IFVpbnQ4QXJyYXkoMTYpOworICAgIHN0YXRlLnNldChpbnB1dCk7CisKKyAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgIHN0YXRlW2pdIF49IGtleVtqXTsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbjsgaSsrKSB7CisgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgc3RhdGVbal0gPSBzW3N0YXRlW2pdXTsKKyAgICAgIH0KKworICAgICAgdiA9IHN0YXRlWzFdOworICAgICAgc3RhdGVbMV0gPSBzdGF0ZVs1XTsKKyAgICAgIHN0YXRlWzVdID0gc3RhdGVbOV07CisgICAgICBzdGF0ZVs5XSA9IHN0YXRlWzEzXTsKKyAgICAgIHN0YXRlWzEzXSA9IHY7CisgICAgICB2ID0gc3RhdGVbMl07CisgICAgICB1ID0gc3RhdGVbNl07CisgICAgICBzdGF0ZVsyXSA9IHN0YXRlWzEwXTsKKyAgICAgIHN0YXRlWzZdID0gc3RhdGVbMTRdOworICAgICAgc3RhdGVbMTBdID0gdjsKKyAgICAgIHN0YXRlWzE0XSA9IHU7CisgICAgICB2ID0gc3RhdGVbM107CisgICAgICB1ID0gc3RhdGVbN107CisgICAgICB0ID0gc3RhdGVbMTFdOworICAgICAgc3RhdGVbM10gPSBzdGF0ZVsxNV07CisgICAgICBzdGF0ZVs3XSA9IHY7CisgICAgICBzdGF0ZVsxMV0gPSB1OworICAgICAgc3RhdGVbMTVdID0gdDsKKworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgaiArPSA0KSB7CisgICAgICAgIGNvbnN0IHMwID0gc3RhdGVbaiArIDBdOworICAgICAgICBjb25zdCBzMSA9IHN0YXRlW2ogKyAxXTsKKyAgICAgICAgY29uc3QgczIgPSBzdGF0ZVtqICsgMl07CisgICAgICAgIGNvbnN0IHMzID0gc3RhdGVbaiArIDNdOworICAgICAgICB0ID0gczAgXiBzMSBeIHMyIF4gczM7CisgICAgICAgIHN0YXRlW2ogKyAwXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MwIF4gczFdOworICAgICAgICBzdGF0ZVtqICsgMV0gXj0gdCBeIHRoaXMuX21peENvbFtzMSBeIHMyXTsKKyAgICAgICAgc3RhdGVbaiArIDJdIF49IHQgXiB0aGlzLl9taXhDb2xbczIgXiBzM107CisgICAgICAgIHN0YXRlW2ogKyAzXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MzIF4gczBdOworICAgICAgfQorCisgICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykgeworICAgICAgICBzdGF0ZVtqXSBePSBrZXlba107CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICBzdGF0ZVtqXSA9IHNbc3RhdGVbal1dOworICAgIH0KKworICAgIHYgPSBzdGF0ZVsxXTsKKyAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdOworICAgIHN0YXRlWzVdID0gc3RhdGVbOV07CisgICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107CisgICAgc3RhdGVbMTNdID0gdjsKKyAgICB2ID0gc3RhdGVbMl07CisgICAgdSA9IHN0YXRlWzZdOworICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdOworICAgIHN0YXRlWzZdID0gc3RhdGVbMTRdOworICAgIHN0YXRlWzEwXSA9IHY7CisgICAgc3RhdGVbMTRdID0gdTsKKyAgICB2ID0gc3RhdGVbM107CisgICAgdSA9IHN0YXRlWzddOworICAgIHQgPSBzdGF0ZVsxMV07CisgICAgc3RhdGVbM10gPSBzdGF0ZVsxNV07CisgICAgc3RhdGVbN10gPSB2OworICAgIHN0YXRlWzExXSA9IHU7CisgICAgc3RhdGVbMTVdID0gdDsKKworICAgIGZvciAobGV0IGogPSAwLCBrID0gdGhpcy5fa2V5U2l6ZTsgaiA8IDE2OyArK2osICsraykgeworICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOworICAgIH0KKworICAgIHJldHVybiBzdGF0ZTsKKyAgfQorCisgIF9kZWNyeXB0QmxvY2syKGRhdGEsIGZpbmFsaXplKSB7CisgICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgbGV0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAorICAgICAgICBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOworICAgIGNvbnN0IHJlc3VsdCA9IFtdOworICAgIGxldCBpdiA9IHRoaXMuaXY7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgKytpKSB7CisgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CisgICAgICArK2J1ZmZlckxlbmd0aDsKKworICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDE2KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBjb25zdCBwbGFpbiA9IHRoaXMuX2RlY3J5cHQoYnVmZmVyLCB0aGlzLl9rZXkpOworCisgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgcGxhaW5bal0gXj0gaXZbal07CisgICAgICB9CisKKyAgICAgIGl2ID0gYnVmZmVyOworICAgICAgcmVzdWx0LnB1c2gocGxhaW4pOworICAgICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOworICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgICB0aGlzLml2ID0gaXY7CisKKyAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgeworICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOworICAgIH0KKworICAgIGxldCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7CisKKyAgICBpZiAoZmluYWxpemUpIHsKKyAgICAgIGNvbnN0IGxhc3RCbG9jayA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07CisgICAgICBsZXQgcHNMZW4gPSBsYXN0QmxvY2tbMTVdOworCisgICAgICBpZiAocHNMZW4gPD0gMTYpIHsKKyAgICAgICAgZm9yIChsZXQgaSA9IDE1LCBpaSA9IDE2IC0gcHNMZW47IGkgPj0gaWk7IC0taSkgeworICAgICAgICAgIGlmIChsYXN0QmxvY2tbaV0gIT09IHBzTGVuKSB7CisgICAgICAgICAgICBwc0xlbiA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXRMZW5ndGggLT0gcHNMZW47CisgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBsYXN0QmxvY2suc3ViYXJyYXkoMCwgMTYgLSBwc0xlbik7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTsKKworICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7ICsraSwgaiArPSAxNikgeworICAgICAgb3V0cHV0LnNldChyZXN1bHRbaV0sIGopOworICAgIH0KKworICAgIHJldHVybiBvdXRwdXQ7CisgIH0KKworICBkZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUsIGl2ID0gbnVsbCkgeworICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOworICAgIGxldCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOworCisgICAgaWYgKGl2KSB7CisgICAgICB0aGlzLml2ID0gaXY7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAobGV0IGkgPSAwOyBidWZmZXJMZW5ndGggPCAxNiAmJiBpIDwgc291cmNlTGVuZ3RoOyArK2ksICsrYnVmZmVyTGVuZ3RoKSB7CisgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKKyAgICAgIH0KKworICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDE2KSB7CisgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuaXYgPSBidWZmZXI7CisgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheSgxNik7CisgICAgfQorCisgICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOworICAgIHRoaXMuZGVjcnlwdEJsb2NrID0gdGhpcy5fZGVjcnlwdEJsb2NrMjsKKyAgICByZXR1cm4gdGhpcy5kZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUpOworICB9CisKKyAgZW5jcnlwdChkYXRhLCBpdikgeworICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgIGxldCBidWZmZXIgPSB0aGlzLmJ1ZmZlciwKKyAgICAgICAgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJQb3NpdGlvbjsKKyAgICBjb25zdCByZXN1bHQgPSBbXTsKKworICAgIGlmICghaXYpIHsKKyAgICAgIGl2ID0gbmV3IFVpbnQ4QXJyYXkoMTYpOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyArK2kpIHsKKyAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKKyAgICAgICsrYnVmZmVyTGVuZ3RoOworCisgICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICBidWZmZXJbal0gXj0gaXZbal07CisgICAgICB9CisKKyAgICAgIGNvbnN0IGNpcGhlciA9IHRoaXMuX2VuY3J5cHQoYnVmZmVyLCB0aGlzLl9rZXkpOworCisgICAgICBpdiA9IGNpcGhlcjsKKyAgICAgIHJlc3VsdC5wdXNoKGNpcGhlcik7CisgICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgICBidWZmZXJMZW5ndGggPSAwOworICAgIH0KKworICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgIHRoaXMuaXYgPSBpdjsKKworICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CisgICAgfQorCisgICAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gMTYgKiByZXN1bHQubGVuZ3RoOworICAgIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG91dHB1dExlbmd0aCk7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlpID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGlpOyArK2ksIGogKz0gMTYpIHsKKyAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0OworICB9CisKK30KKworY2xhc3MgQUVTMTI4Q2lwaGVyIGV4dGVuZHMgQUVTQmFzZUNpcGhlciB7CisgIGNvbnN0cnVjdG9yKGtleSkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uID0gMTA7CisgICAgdGhpcy5fa2V5U2l6ZSA9IDE2MDsKKyAgICB0aGlzLl9yY29uID0gbmV3IFVpbnQ4QXJyYXkoWzB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGRdKTsKKyAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKKyAgfQorCisgIF9leHBhbmRLZXkoY2lwaGVyS2V5KSB7CisgICAgY29uc3QgYiA9IDE3NjsKKyAgICBjb25zdCBzID0gdGhpcy5fczsKKyAgICBjb25zdCByY29uID0gdGhpcy5fcmNvbjsKKyAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShiKTsKKyAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7CisKKyAgICBmb3IgKGxldCBqID0gMTYsIGkgPSAxOyBqIDwgYjsgKytpKSB7CisgICAgICBsZXQgdDEgPSByZXN1bHRbaiAtIDNdOworICAgICAgbGV0IHQyID0gcmVzdWx0W2ogLSAyXTsKKyAgICAgIGxldCB0MyA9IHJlc3VsdFtqIC0gMV07CisgICAgICBsZXQgdDQgPSByZXN1bHRbaiAtIDRdOworICAgICAgdDEgPSBzW3QxXTsKKyAgICAgIHQyID0gc1t0Ml07CisgICAgICB0MyA9IHNbdDNdOworICAgICAgdDQgPSBzW3Q0XTsKKyAgICAgIHQxID0gdDEgXiByY29uW2ldOworCisgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IDQ7ICsrbikgeworICAgICAgICByZXN1bHRbal0gPSB0MSBePSByZXN1bHRbaiAtIDE2XTsKKyAgICAgICAgaisrOworICAgICAgICByZXN1bHRbal0gPSB0MiBePSByZXN1bHRbaiAtIDE2XTsKKyAgICAgICAgaisrOworICAgICAgICByZXN1bHRbal0gPSB0MyBePSByZXN1bHRbaiAtIDE2XTsKKyAgICAgICAgaisrOworICAgICAgICByZXN1bHRbal0gPSB0NCBePSByZXN1bHRbaiAtIDE2XTsKKyAgICAgICAgaisrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworfQorCitleHBvcnRzLkFFUzEyOENpcGhlciA9IEFFUzEyOENpcGhlcjsKKworY2xhc3MgQUVTMjU2Q2lwaGVyIGV4dGVuZHMgQUVTQmFzZUNpcGhlciB7CisgIGNvbnN0cnVjdG9yKGtleSkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uID0gMTQ7CisgICAgdGhpcy5fa2V5U2l6ZSA9IDIyNDsKKyAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKKyAgfQorCisgIF9leHBhbmRLZXkoY2lwaGVyS2V5KSB7CisgICAgY29uc3QgYiA9IDI0MDsKKyAgICBjb25zdCBzID0gdGhpcy5fczsKKyAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShiKTsKKyAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7CisgICAgbGV0IHIgPSAxOworICAgIGxldCB0MSwgdDIsIHQzLCB0NDsKKworICAgIGZvciAobGV0IGogPSAzMiwgaSA9IDE7IGogPCBiOyArK2kpIHsKKyAgICAgIGlmIChqICUgMzIgPT09IDE2KSB7CisgICAgICAgIHQxID0gc1t0MV07CisgICAgICAgIHQyID0gc1t0Ml07CisgICAgICAgIHQzID0gc1t0M107CisgICAgICAgIHQ0ID0gc1t0NF07CisgICAgICB9IGVsc2UgaWYgKGogJSAzMiA9PT0gMCkgeworICAgICAgICB0MSA9IHJlc3VsdFtqIC0gM107CisgICAgICAgIHQyID0gcmVzdWx0W2ogLSAyXTsKKyAgICAgICAgdDMgPSByZXN1bHRbaiAtIDFdOworICAgICAgICB0NCA9IHJlc3VsdFtqIC0gNF07CisgICAgICAgIHQxID0gc1t0MV07CisgICAgICAgIHQyID0gc1t0Ml07CisgICAgICAgIHQzID0gc1t0M107CisgICAgICAgIHQ0ID0gc1t0NF07CisgICAgICAgIHQxID0gdDEgXiByOworCisgICAgICAgIGlmICgociA8PD0gMSkgPj0gMjU2KSB7CisgICAgICAgICAgciA9IChyIF4gMHgxYikgJiAweGZmOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgNDsgKytuKSB7CisgICAgICAgIHJlc3VsdFtqXSA9IHQxIF49IHJlc3VsdFtqIC0gMzJdOworICAgICAgICBqKys7CisgICAgICAgIHJlc3VsdFtqXSA9IHQyIF49IHJlc3VsdFtqIC0gMzJdOworICAgICAgICBqKys7CisgICAgICAgIHJlc3VsdFtqXSA9IHQzIF49IHJlc3VsdFtqIC0gMzJdOworICAgICAgICBqKys7CisgICAgICAgIHJlc3VsdFtqXSA9IHQ0IF49IHJlc3VsdFtqIC0gMzJdOworICAgICAgICBqKys7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCit9CisKK2V4cG9ydHMuQUVTMjU2Q2lwaGVyID0gQUVTMjU2Q2lwaGVyOworCit2YXIgUERGMTcgPSBmdW5jdGlvbiBQREYxN0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGNvbXBhcmVCeXRlQXJyYXlzKGFycmF5MSwgYXJyYXkyKSB7CisgICAgaWYgKGFycmF5MS5sZW5ndGggIT09IGFycmF5Mi5sZW5ndGgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5MS5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIFBERjE3KCkge30KKworICBQREYxNy5wcm90b3R5cGUgPSB7CisgICAgY2hlY2tPd25lclBhc3N3b3JkOiBmdW5jdGlvbiBQREYxN19jaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIHVzZXJCeXRlcywgb3duZXJQYXNzd29yZCkgeworICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOworICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKKyAgICAgIGhhc2hEYXRhLnNldChvd25lclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJWYWxpZGF0aW9uU2FsdC5sZW5ndGgpOworICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTsKKyAgICAgIHJldHVybiBjb21wYXJlQnl0ZUFycmF5cyhyZXN1bHQsIG93bmVyUGFzc3dvcmQpOworICAgIH0sCisgICAgY2hlY2tVc2VyUGFzc3dvcmQ6IGZ1bmN0aW9uIFBERjE3X2NoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJQYXNzd29yZCkgeworICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CisgICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOworICAgICAgaGFzaERhdGEuc2V0KHVzZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7CisgICAgICByZXR1cm4gY29tcGFyZUJ5dGVBcnJheXMocmVzdWx0LCB1c2VyUGFzc3dvcmQpOworICAgIH0sCisgICAgZ2V0T3duZXJLZXk6IGZ1bmN0aW9uIFBERjE3X2dldE93bmVyS2V5KHBhc3N3b3JkLCBvd25lcktleVNhbHQsIHVzZXJCeXRlcywgb3duZXJFbmNyeXB0aW9uKSB7CisgICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CisgICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOworICAgICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpOworICAgICAgdmFyIGtleSA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTsKKyAgICAgIHZhciBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CisgICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhvd25lckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpOworICAgIH0sCisgICAgZ2V0VXNlcktleTogZnVuY3Rpb24gUERGMTdfZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKSB7CisgICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTsKKyAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CisgICAgICBoYXNoRGF0YS5zZXQodXNlcktleVNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICB2YXIga2V5ID0gY2FsY3VsYXRlU0hBMjU2KGhhc2hEYXRhLCAwLCBoYXNoRGF0YS5sZW5ndGgpOworICAgICAgdmFyIGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKKyAgICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKHVzZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKKyAgICB9CisgIH07CisgIHJldHVybiBQREYxNzsKK30oKTsKKworZXhwb3J0cy5QREYxNyA9IFBERjE3OworCit2YXIgUERGMjAgPSBmdW5jdGlvbiBQREYyMENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGNvbmNhdEFycmF5cyhhcnJheTEsIGFycmF5MikgeworICAgIHZhciB0ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpOworICAgIHQuc2V0KGFycmF5MSwgMCk7CisgICAgdC5zZXQoYXJyYXkyLCBhcnJheTEubGVuZ3RoKTsKKyAgICByZXR1cm4gdDsKKyAgfQorCisgIGZ1bmN0aW9uIGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykgeworICAgIHZhciBrID0gY2FsY3VsYXRlU0hBMjU2KGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpLnN1YmFycmF5KDAsIDMyKTsKKyAgICB2YXIgZSA9IFswXTsKKyAgICB2YXIgaSA9IDA7CisKKyAgICB3aGlsZSAoaSA8IDY0IHx8IGVbZS5sZW5ndGggLSAxXSA+IGkgLSAzMikgeworICAgICAgdmFyIGFycmF5TGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoICsgay5sZW5ndGggKyB1c2VyQnl0ZXMubGVuZ3RoOworICAgICAgdmFyIGsxID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlMZW5ndGggKiA2NCk7CisgICAgICB2YXIgYXJyYXkgPSBjb25jYXRBcnJheXMocGFzc3dvcmQsIGspOworICAgICAgYXJyYXkgPSBjb25jYXRBcnJheXMoYXJyYXksIHVzZXJCeXRlcyk7CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBwb3MgPSAwOyBqIDwgNjQ7IGorKywgcG9zICs9IGFycmF5TGVuZ3RoKSB7CisgICAgICAgIGsxLnNldChhcnJheSwgcG9zKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNpcGhlciA9IG5ldyBBRVMxMjhDaXBoZXIoay5zdWJhcnJheSgwLCAxNikpOworICAgICAgZSA9IGNpcGhlci5lbmNyeXB0KGsxLCBrLnN1YmFycmF5KDE2LCAzMikpOworICAgICAgdmFyIHJlbWFpbmRlciA9IDA7CisKKyAgICAgIGZvciAodmFyIHogPSAwOyB6IDwgMTY7IHorKykgeworICAgICAgICByZW1haW5kZXIgKj0gMjU2ICUgMzsKKyAgICAgICAgcmVtYWluZGVyICU9IDM7CisgICAgICAgIHJlbWFpbmRlciArPSAoZVt6XSA+Pj4gMCkgJSAzOworICAgICAgICByZW1haW5kZXIgJT0gMzsKKyAgICAgIH0KKworICAgICAgaWYgKHJlbWFpbmRlciA9PT0gMCkgeworICAgICAgICBrID0gY2FsY3VsYXRlU0hBMjU2KGUsIDAsIGUubGVuZ3RoKTsKKyAgICAgIH0gZWxzZSBpZiAocmVtYWluZGVyID09PSAxKSB7CisgICAgICAgIGsgPSBjYWxjdWxhdGVTSEEzODQoZSwgMCwgZS5sZW5ndGgpOworICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDIpIHsKKyAgICAgICAgayA9IGNhbGN1bGF0ZVNIQTUxMihlLCAwLCBlLmxlbmd0aCk7CisgICAgICB9CisKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4gay5zdWJhcnJheSgwLCAzMik7CisgIH0KKworICBmdW5jdGlvbiBQREYyMCgpIHt9CisKKyAgZnVuY3Rpb24gY29tcGFyZUJ5dGVBcnJheXMoYXJyYXkxLCBhcnJheTIpIHsKKyAgICBpZiAoYXJyYXkxLmxlbmd0aCAhPT0gYXJyYXkyLmxlbmd0aCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkxLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgUERGMjAucHJvdG90eXBlID0geworICAgIGhhc2g6IGZ1bmN0aW9uIFBERjIwX2hhc2gocGFzc3dvcmQsIGNvbmNhdEJ5dGVzLCB1c2VyQnl0ZXMpIHsKKyAgICAgIHJldHVybiBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGNvbmNhdEJ5dGVzLCB1c2VyQnl0ZXMpOworICAgIH0sCisgICAgY2hlY2tPd25lclBhc3N3b3JkOiBmdW5jdGlvbiBQREYyMF9jaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIHVzZXJCeXRlcywgb3duZXJQYXNzd29yZCkgeworICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOworICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKKyAgICAgIGhhc2hEYXRhLnNldChvd25lclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJWYWxpZGF0aW9uU2FsdC5sZW5ndGgpOworICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CisgICAgICByZXR1cm4gY29tcGFyZUJ5dGVBcnJheXMocmVzdWx0LCBvd25lclBhc3N3b3JkKTsKKyAgICB9LAorICAgIGNoZWNrVXNlclBhc3N3b3JkOiBmdW5jdGlvbiBQREYyMF9jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpIHsKKyAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOworICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKKyAgICAgIGhhc2hEYXRhLnNldCh1c2VyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgW10pOworICAgICAgcmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKHJlc3VsdCwgdXNlclBhc3N3b3JkKTsKKyAgICB9LAorICAgIGdldE93bmVyS2V5OiBmdW5jdGlvbiBQREYyMF9nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1c2VyQnl0ZXMsIG93bmVyRW5jcnlwdGlvbikgeworICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOworICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKKyAgICAgIGhhc2hEYXRhLnNldChvd25lcktleVNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lcktleVNhbHQubGVuZ3RoKTsKKyAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCB1c2VyQnl0ZXMpOworICAgICAgdmFyIGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKKyAgICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKG93bmVyRW5jcnlwdGlvbiwgZmFsc2UsIG5ldyBVaW50OEFycmF5KDE2KSk7CisgICAgfSwKKyAgICBnZXRVc2VyS2V5OiBmdW5jdGlvbiBQREYyMF9nZXRVc2VyS2V5KHBhc3N3b3JkLCB1c2VyS2V5U2FsdCwgdXNlckVuY3J5cHRpb24pIHsKKyAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOworICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKKyAgICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCBbXSk7CisgICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpOworICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sodXNlckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIFBERjIwOworfSgpOworCitleHBvcnRzLlBERjIwID0gUERGMjA7CisKK3ZhciBDaXBoZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm0oc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IsIHN0cmVhbUNpcGhlckNvbnN0cnVjdG9yKSB7CisgICAgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvciA9IHN0cmluZ0NpcGhlckNvbnN0cnVjdG9yOworICAgIHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IgPSBzdHJlYW1DaXBoZXJDb25zdHJ1Y3RvcjsKKyAgfQorCisgIENpcGhlclRyYW5zZm9ybS5wcm90b3R5cGUgPSB7CisgICAgY3JlYXRlU3RyZWFtOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fY3JlYXRlU3RyZWFtKHN0cmVhbSwgbGVuZ3RoKSB7CisgICAgICB2YXIgY2lwaGVyID0gbmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IoKTsKKyAgICAgIHJldHVybiBuZXcgX3N0cmVhbS5EZWNyeXB0U3RyZWFtKHN0cmVhbSwgbGVuZ3RoLCBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1EZWNyeXB0U3RyZWFtKGRhdGEsIGZpbmFsaXplKSB7CisgICAgICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKGRhdGEsIGZpbmFsaXplKTsKKyAgICAgIH0pOworICAgIH0sCisgICAgZGVjcnlwdFN0cmluZzogZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtX2RlY3J5cHRTdHJpbmcocykgeworICAgICAgdmFyIGNpcGhlciA9IG5ldyB0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yKCk7CisgICAgICB2YXIgZGF0YSA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShzKTsKKyAgICAgIGRhdGEgPSBjaXBoZXIuZGVjcnlwdEJsb2NrKGRhdGEsIHRydWUpOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShkYXRhKTsKKyAgICB9LAorICAgIGVuY3J5cHRTdHJpbmc6IGZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybV9lbmNyeXB0U3RyaW5nKHMpIHsKKyAgICAgIGNvbnN0IGNpcGhlciA9IG5ldyB0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yKCk7CisKKyAgICAgIGlmIChjaXBoZXIgaW5zdGFuY2VvZiBBRVNCYXNlQ2lwaGVyKSB7CisgICAgICAgIGNvbnN0IHN0ckxlbiA9IHMubGVuZ3RoOworICAgICAgICBjb25zdCBwYWQgPSAxNiAtIHN0ckxlbiAlIDE2OworCisgICAgICAgIGlmIChwYWQgIT09IDE2KSB7CisgICAgICAgICAgcyA9IHMucGFkRW5kKDE2ICogTWF0aC5jZWlsKHN0ckxlbiAvIDE2KSwgU3RyaW5nLmZyb21DaGFyQ29kZShwYWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGl2ID0gbmV3IFVpbnQ4QXJyYXkoMTYpOworCisgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAidW5kZWZpbmVkIikgeworICAgICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoaXYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgaXZbaV0gPSBNYXRoLmZsb29yKDI1NiAqIE1hdGgucmFuZG9tKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxldCBkYXRhID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHMpOworICAgICAgICBkYXRhID0gY2lwaGVyLmVuY3J5cHQoZGF0YSwgaXYpOworICAgICAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheSgxNiArIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgYnVmLnNldChpdik7CisgICAgICAgIGJ1Zi5zZXQoZGF0YSwgMTYpOworICAgICAgICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGJ1Zik7CisgICAgICB9CisKKyAgICAgIGxldCBkYXRhID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHMpOworICAgICAgZGF0YSA9IGNpcGhlci5lbmNyeXB0KGRhdGEpOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShkYXRhKTsKKyAgICB9CisgIH07CisgIHJldHVybiBDaXBoZXJUcmFuc2Zvcm07Cit9KCk7CisKK3ZhciBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5ID0gZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeUNsb3N1cmUoKSB7CisgIHZhciBkZWZhdWx0UGFzc3dvcmRCeXRlcyA9IG5ldyBVaW50OEFycmF5KFsweDI4LCAweEJGLCAweDRFLCAweDVFLCAweDRFLCAweDc1LCAweDhBLCAweDQxLCAweDY0LCAweDAwLCAweDRFLCAweDU2LCAweEZGLCAweEZBLCAweDAxLCAweDA4LCAweDJFLCAweDJFLCAweDAwLCAweEI2LCAweEQwLCAweDY4LCAweDNFLCAweDgwLCAweDJGLCAweDBDLCAweEE5LCAweEZFLCAweDY0LCAweDUzLCAweDY5LCAweDdBXSk7CisKKyAgZnVuY3Rpb24gY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZCwgb3duZXJQYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIHVzZXJQYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyS2V5U2FsdCwgb3duZXJFbmNyeXB0aW9uLCB1c2VyRW5jcnlwdGlvbiwgcGVybXMpIHsKKyAgICBpZiAocGFzc3dvcmQpIHsKKyAgICAgIHZhciBwYXNzd29yZExlbmd0aCA9IE1hdGgubWluKDEyNywgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmQuc3ViYXJyYXkoMCwgcGFzc3dvcmRMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBwYXNzd29yZCA9IFtdOworICAgIH0KKworICAgIHZhciBwZGZBbGdvcml0aG07CisKKyAgICBpZiAocmV2aXNpb24gPT09IDYpIHsKKyAgICAgIHBkZkFsZ29yaXRobSA9IG5ldyBQREYyMCgpOworICAgIH0gZWxzZSB7CisgICAgICBwZGZBbGdvcml0aG0gPSBuZXcgUERGMTcoKTsKKyAgICB9CisKKyAgICBpZiAocGRmQWxnb3JpdGhtLmNoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJQYXNzd29yZCkpIHsKKyAgICAgIHJldHVybiBwZGZBbGdvcml0aG0uZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKTsKKyAgICB9IGVsc2UgaWYgKHBhc3N3b3JkLmxlbmd0aCAmJiBwZGZBbGdvcml0aG0uY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1Qnl0ZXMsIG93bmVyUGFzc3dvcmQpKSB7CisgICAgICByZXR1cm4gcGRmQWxnb3JpdGhtLmdldE93bmVyS2V5KHBhc3N3b3JkLCBvd25lcktleVNhbHQsIHVCeXRlcywgb3duZXJFbmNyeXB0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGZ1bmN0aW9uIHByZXBhcmVLZXlEYXRhKGZpbGVJZCwgcGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSkgeworICAgIHZhciBoYXNoRGF0YVNpemUgPSA0MCArIG93bmVyUGFzc3dvcmQubGVuZ3RoICsgZmlsZUlkLmxlbmd0aDsKKyAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShoYXNoRGF0YVNpemUpLAorICAgICAgICBpID0gMCwKKyAgICAgICAgaiwKKyAgICAgICAgbjsKKworICAgIGlmIChwYXNzd29yZCkgeworICAgICAgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOworCisgICAgICBmb3IgKDsgaSA8IG47ICsraSkgeworICAgICAgICBoYXNoRGF0YVtpXSA9IHBhc3N3b3JkW2ldOworICAgICAgfQorICAgIH0KKworICAgIGogPSAwOworCisgICAgd2hpbGUgKGkgPCAzMikgeworICAgICAgaGFzaERhdGFbaSsrXSA9IGRlZmF1bHRQYXNzd29yZEJ5dGVzW2orK107CisgICAgfQorCisgICAgZm9yIChqID0gMCwgbiA9IG93bmVyUGFzc3dvcmQubGVuZ3RoOyBqIDwgbjsgKytqKSB7CisgICAgICBoYXNoRGF0YVtpKytdID0gb3duZXJQYXNzd29yZFtqXTsKKyAgICB9CisKKyAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgJiAweGZmOworICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyA+PiA4ICYgMHhmZjsKKyAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgPj4gMTYgJiAweGZmOworICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyA+Pj4gMjQgJiAweGZmOworCisgICAgZm9yIChqID0gMCwgbiA9IGZpbGVJZC5sZW5ndGg7IGogPCBuOyArK2opIHsKKyAgICAgIGhhc2hEYXRhW2krK10gPSBmaWxlSWRbal07CisgICAgfQorCisgICAgaWYgKHJldmlzaW9uID49IDQgJiYgIWVuY3J5cHRNZXRhZGF0YSkgeworICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7CisgICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjsKKyAgICAgIGhhc2hEYXRhW2krK10gPSAweGZmOworICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7CisgICAgfQorCisgICAgdmFyIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaERhdGEsIDAsIGkpOworICAgIHZhciBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CisKKyAgICBpZiAocmV2aXNpb24gPj0gMykgeworICAgICAgZm9yIChqID0gMDsgaiA8IDUwOyArK2opIHsKKyAgICAgICAgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoLCAwLCBrZXlMZW5ndGhJbkJ5dGVzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZW5jcnlwdGlvbktleSA9IGhhc2guc3ViYXJyYXkoMCwga2V5TGVuZ3RoSW5CeXRlcyk7CisgICAgdmFyIGNpcGhlciwgY2hlY2tEYXRhOworCisgICAgaWYgKHJldmlzaW9uID49IDMpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7CisgICAgICAgIGhhc2hEYXRhW2ldID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaV07CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IDAsIG4gPSBmaWxlSWQubGVuZ3RoOyBqIDwgbjsgKytqKSB7CisgICAgICAgIGhhc2hEYXRhW2krK10gPSBmaWxlSWRbal07CisgICAgICB9CisKKyAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOworICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhjYWxjdWxhdGVNRDUoaGFzaERhdGEsIDAsIGkpKTsKKyAgICAgIG4gPSBlbmNyeXB0aW9uS2V5Lmxlbmd0aDsKKyAgICAgIHZhciBkZXJpdmVkS2V5ID0gbmV3IFVpbnQ4QXJyYXkobiksCisgICAgICAgICAgazsKKworICAgICAgZm9yIChqID0gMTsgaiA8PSAxOTsgKytqKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuOyArK2spIHsKKyAgICAgICAgICBkZXJpdmVkS2V5W2tdID0gZW5jcnlwdGlvbktleVtrXSBeIGo7CisgICAgICAgIH0KKworICAgICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihkZXJpdmVkS2V5KTsKKyAgICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhjaGVja0RhdGEpOworICAgICAgfQorCisgICAgICBmb3IgKGogPSAwLCBuID0gY2hlY2tEYXRhLmxlbmd0aDsgaiA8IG47ICsraikgeworICAgICAgICBpZiAodXNlclBhc3N3b3JkW2pdICE9PSBjaGVja0RhdGFbal0pIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihlbmNyeXB0aW9uS2V5KTsKKyAgICAgIGNoZWNrRGF0YSA9IGNpcGhlci5lbmNyeXB0QmxvY2soZGVmYXVsdFBhc3N3b3JkQnl0ZXMpOworCisgICAgICBmb3IgKGogPSAwLCBuID0gY2hlY2tEYXRhLmxlbmd0aDsgaiA8IG47ICsraikgeworICAgICAgICBpZiAodXNlclBhc3N3b3JkW2pdICE9PSBjaGVja0RhdGFbal0pIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlbmNyeXB0aW9uS2V5OworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclBhc3N3b3JkLCByZXZpc2lvbiwga2V5TGVuZ3RoKSB7CisgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMzIpLAorICAgICAgICBpID0gMCwKKyAgICAgICAgaiwKKyAgICAgICAgbjsKKyAgICBuID0gTWF0aC5taW4oMzIsIHBhc3N3b3JkLmxlbmd0aCk7CisKKyAgICBmb3IgKDsgaSA8IG47ICsraSkgeworICAgICAgaGFzaERhdGFbaV0gPSBwYXNzd29yZFtpXTsKKyAgICB9CisKKyAgICBqID0gMDsKKworICAgIHdoaWxlIChpIDwgMzIpIHsKKyAgICAgIGhhc2hEYXRhW2krK10gPSBkZWZhdWx0UGFzc3dvcmRCeXRlc1tqKytdOworICAgIH0KKworICAgIHZhciBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTsKKyAgICB2YXIga2V5TGVuZ3RoSW5CeXRlcyA9IGtleUxlbmd0aCA+PiAzOworCisgICAgaWYgKHJldmlzaW9uID49IDMpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCA1MDsgKytqKSB7CisgICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaCwgMCwgaGFzaC5sZW5ndGgpOworICAgICAgfQorICAgIH0KKworICAgIHZhciBjaXBoZXIsIHVzZXJQYXNzd29yZDsKKworICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7CisgICAgICB1c2VyUGFzc3dvcmQgPSBvd25lclBhc3N3b3JkOworICAgICAgdmFyIGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShrZXlMZW5ndGhJbkJ5dGVzKSwKKyAgICAgICAgICBrOworCisgICAgICBmb3IgKGogPSAxOTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGtleUxlbmd0aEluQnl0ZXM7ICsraykgeworICAgICAgICAgIGRlcml2ZWRLZXlba10gPSBoYXNoW2tdIF4gajsKKyAgICAgICAgfQorCisgICAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGRlcml2ZWRLZXkpOworICAgICAgICB1c2VyUGFzc3dvcmQgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKHVzZXJQYXNzd29yZCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGhhc2guc3ViYXJyYXkoMCwga2V5TGVuZ3RoSW5CeXRlcykpOworICAgICAgdXNlclBhc3N3b3JkID0gY2lwaGVyLmVuY3J5cHRCbG9jayhvd25lclBhc3N3b3JkKTsKKyAgICB9CisKKyAgICByZXR1cm4gdXNlclBhc3N3b3JkOworICB9CisKKyAgdmFyIGlkZW50aXR5TmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJJZGVudGl0eSIpOworCisgIGZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybUZhY3RvcnkoZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgeworICAgIHZhciBmaWx0ZXIgPSBkaWN0LmdldCgiRmlsdGVyIik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpbHRlciwgIlN0YW5kYXJkIikpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5rbm93biBlbmNyeXB0aW9uIG1ldGhvZCIpOworICAgIH0KKworICAgIHRoaXMuZGljdCA9IGRpY3Q7CisgICAgdmFyIGFsZ29yaXRobSA9IGRpY3QuZ2V0KCJWIik7CisKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxnb3JpdGhtKSB8fCBhbGdvcml0aG0gIT09IDEgJiYgYWxnb3JpdGhtICE9PSAyICYmIGFsZ29yaXRobSAhPT0gNCAmJiBhbGdvcml0aG0gIT09IDUpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBhbGdvcml0aG0iKTsKKyAgICB9CisKKyAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTsKKyAgICB2YXIga2V5TGVuZ3RoID0gZGljdC5nZXQoIkxlbmd0aCIpOworCisgICAgaWYgKCFrZXlMZW5ndGgpIHsKKyAgICAgIGlmIChhbGdvcml0aG0gPD0gMykgeworICAgICAgICBrZXlMZW5ndGggPSA0MDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBjZkRpY3QgPSBkaWN0LmdldCgiQ0YiKTsKKyAgICAgICAgdmFyIHN0cmVhbUNyeXB0b05hbWUgPSBkaWN0LmdldCgiU3RtRiIpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShjZkRpY3QpICYmICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHN0cmVhbUNyeXB0b05hbWUpKSB7CisgICAgICAgICAgY2ZEaWN0LnN1cHByZXNzRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgdmFyIGhhbmRsZXJEaWN0ID0gY2ZEaWN0LmdldChzdHJlYW1DcnlwdG9OYW1lLm5hbWUpOworICAgICAgICAgIGtleUxlbmd0aCA9IGhhbmRsZXJEaWN0ICYmIGhhbmRsZXJEaWN0LmdldCgiTGVuZ3RoIikgfHwgMTI4OworCisgICAgICAgICAgaWYgKGtleUxlbmd0aCA8IDQwKSB7CisgICAgICAgICAgICBrZXlMZW5ndGggPDw9IDM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtleUxlbmd0aCkgfHwga2V5TGVuZ3RoIDwgNDAgfHwga2V5TGVuZ3RoICUgOCAhPT0gMCkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIGtleSBsZW5ndGgiKTsKKyAgICB9CisKKyAgICB2YXIgb3duZXJQYXNzd29yZCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiTyIpKS5zdWJhcnJheSgwLCAzMik7CisgICAgdmFyIHVzZXJQYXNzd29yZCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiVSIpKS5zdWJhcnJheSgwLCAzMik7CisgICAgdmFyIGZsYWdzID0gZGljdC5nZXQoIlAiKTsKKyAgICB2YXIgcmV2aXNpb24gPSBkaWN0LmdldCgiUiIpOworICAgIHZhciBlbmNyeXB0TWV0YWRhdGEgPSAoYWxnb3JpdGhtID09PSA0IHx8IGFsZ29yaXRobSA9PT0gNSkgJiYgZGljdC5nZXQoIkVuY3J5cHRNZXRhZGF0YSIpICE9PSBmYWxzZTsKKyAgICB0aGlzLmVuY3J5cHRNZXRhZGF0YSA9IGVuY3J5cHRNZXRhZGF0YTsKKyAgICB2YXIgZmlsZUlkQnl0ZXMgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZmlsZUlkKTsKKyAgICB2YXIgcGFzc3dvcmRCeXRlczsKKworICAgIGlmIChwYXNzd29yZCkgeworICAgICAgaWYgKHJldmlzaW9uID09PSA2KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcGFzc3dvcmQgPSAoMCwgX3V0aWwudXRmOFN0cmluZ1RvU3RyaW5nKShwYXNzd29yZCk7CisgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5OiAiICsgIlVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC4iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwYXNzd29yZEJ5dGVzID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHBhc3N3b3JkKTsKKyAgICB9CisKKyAgICB2YXIgZW5jcnlwdGlvbktleTsKKworICAgIGlmIChhbGdvcml0aG0gIT09IDUpIHsKKyAgICAgIGVuY3J5cHRpb25LZXkgPSBwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgcGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIG93bmVyVmFsaWRhdGlvblNhbHQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIk8iKSkuc3ViYXJyYXkoMzIsIDQwKTsKKyAgICAgIHZhciBvd25lcktleVNhbHQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIk8iKSkuc3ViYXJyYXkoNDAsIDQ4KTsKKyAgICAgIHZhciB1Qnl0ZXMgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIlUiKSkuc3ViYXJyYXkoMCwgNDgpOworICAgICAgdmFyIHVzZXJWYWxpZGF0aW9uU2FsdCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiVSIpKS5zdWJhcnJheSgzMiwgNDApOworICAgICAgdmFyIHVzZXJLZXlTYWx0ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJVIikpLnN1YmFycmF5KDQwLCA0OCk7CisgICAgICB2YXIgb3duZXJFbmNyeXB0aW9uID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJPRSIpKTsKKyAgICAgIHZhciB1c2VyRW5jcnlwdGlvbiA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiVUUiKSk7CisgICAgICB2YXIgcGVybXMgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIlBlcm1zIikpOworICAgICAgZW5jcnlwdGlvbktleSA9IGNyZWF0ZUVuY3J5cHRpb25LZXkyMChyZXZpc2lvbiwgcGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIHVzZXJQYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyS2V5U2FsdCwgb3duZXJFbmNyeXB0aW9uLCB1c2VyRW5jcnlwdGlvbiwgcGVybXMpOworICAgIH0KKworICAgIGlmICghZW5jcnlwdGlvbktleSAmJiAhcGFzc3dvcmQpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbigiTm8gcGFzc3dvcmQgZ2l2ZW4iLCBfdXRpbC5QYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTsKKyAgICB9IGVsc2UgaWYgKCFlbmNyeXB0aW9uS2V5ICYmIHBhc3N3b3JkKSB7CisgICAgICB2YXIgZGVjb2RlZFBhc3N3b3JkID0gZGVjb2RlVXNlclBhc3N3b3JkKHBhc3N3b3JkQnl0ZXMsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpOworICAgICAgZW5jcnlwdGlvbktleSA9IHByZXBhcmVLZXlEYXRhKGZpbGVJZEJ5dGVzLCBkZWNvZGVkUGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSk7CisgICAgfQorCisgICAgaWYgKCFlbmNyeXB0aW9uS2V5KSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24oIkluY29ycmVjdCBQYXNzd29yZCIsIF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCk7CisgICAgfQorCisgICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gZW5jcnlwdGlvbktleTsKKworICAgIGlmIChhbGdvcml0aG0gPj0gNCkgeworICAgICAgdmFyIGNmID0gZGljdC5nZXQoIkNGIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShjZikpIHsKKyAgICAgICAgY2Yuc3VwcHJlc3NFbmNyeXB0aW9uID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jZiA9IGNmOworICAgICAgdGhpcy5zdG1mID0gZGljdC5nZXQoIlN0bUYiKSB8fCBpZGVudGl0eU5hbWU7CisgICAgICB0aGlzLnN0cmYgPSBkaWN0LmdldCgiU3RyRiIpIHx8IGlkZW50aXR5TmFtZTsKKyAgICAgIHRoaXMuZWZmID0gZGljdC5nZXQoIkVGRiIpIHx8IHRoaXMuc3RtZjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBidWlsZE9iamVjdEtleShudW0sIGdlbiwgZW5jcnlwdGlvbktleSwgaXNBZXMpIHsKKyAgICB2YXIga2V5ID0gbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGlvbktleS5sZW5ndGggKyA5KSwKKyAgICAgICAgaSwKKyAgICAgICAgbjsKKworICAgIGZvciAoaSA9IDAsIG4gPSBlbmNyeXB0aW9uS2V5Lmxlbmd0aDsgaSA8IG47ICsraSkgeworICAgICAga2V5W2ldID0gZW5jcnlwdGlvbktleVtpXTsKKyAgICB9CisKKyAgICBrZXlbaSsrXSA9IG51bSAmIDB4ZmY7CisgICAga2V5W2krK10gPSBudW0gPj4gOCAmIDB4ZmY7CisgICAga2V5W2krK10gPSBudW0gPj4gMTYgJiAweGZmOworICAgIGtleVtpKytdID0gZ2VuICYgMHhmZjsKKyAgICBrZXlbaSsrXSA9IGdlbiA+PiA4ICYgMHhmZjsKKworICAgIGlmIChpc0FlcykgeworICAgICAga2V5W2krK10gPSAweDczOworICAgICAga2V5W2krK10gPSAweDQxOworICAgICAga2V5W2krK10gPSAweDZjOworICAgICAga2V5W2krK10gPSAweDU0OworICAgIH0KKworICAgIHZhciBoYXNoID0gY2FsY3VsYXRlTUQ1KGtleSwgMCwgaSk7CisgICAgcmV0dXJuIGhhc2guc3ViYXJyYXkoMCwgTWF0aC5taW4oZW5jcnlwdGlvbktleS5sZW5ndGggKyA1LCAxNikpOworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihjZiwgbmFtZSwgbnVtLCBnZW4sIGtleSkgeworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkobmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS4iKTsKKyAgICB9CisKKyAgICB2YXIgY3J5cHRGaWx0ZXIgPSBjZi5nZXQobmFtZS5uYW1lKTsKKyAgICB2YXIgY2ZtOworCisgICAgaWYgKGNyeXB0RmlsdGVyICE9PSBudWxsICYmIGNyeXB0RmlsdGVyICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGNmbSA9IGNyeXB0RmlsdGVyLmdldCgiQ0ZNIik7CisgICAgfQorCisgICAgaWYgKCFjZm0gfHwgY2ZtLm5hbWUgPT09ICJOb25lIikgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOdWxsQ2lwaGVyKCk7CisgICAgICB9OworICAgIH0KKworICAgIGlmIChjZm0ubmFtZSA9PT0gIlYyIikgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yVjIoKSB7CisgICAgICAgIHJldHVybiBuZXcgQVJDRm91ckNpcGhlcihidWlsZE9iamVjdEtleShudW0sIGdlbiwga2V5LCBmYWxzZSkpOworICAgICAgfTsKKyAgICB9CisKKyAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMiIpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1GYWN0b3J5QnVpbGRDaXBoZXJDb25zdHJ1Y3RvckFFU1YyKCkgeworICAgICAgICByZXR1cm4gbmV3IEFFUzEyOENpcGhlcihidWlsZE9iamVjdEtleShudW0sIGdlbiwga2V5LCB0cnVlKSk7CisgICAgICB9OworICAgIH0KKworICAgIGlmIChjZm0ubmFtZSA9PT0gIkFFU1YzIikgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yQUVTVjMoKSB7CisgICAgICAgIHJldHVybiBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CisgICAgICB9OworICAgIH0KKworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBjcnlwdG8gbWV0aG9kIik7CisgIH0KKworICBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5LnByb3RvdHlwZSA9IHsKKyAgICBjcmVhdGVDaXBoZXJUcmFuc2Zvcm06IGZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybUZhY3RvcnlfY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKG51bSwgZ2VuKSB7CisgICAgICBpZiAodGhpcy5hbGdvcml0aG0gPT09IDQgfHwgdGhpcy5hbGdvcml0aG0gPT09IDUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJUcmFuc2Zvcm0oYnVpbGRDaXBoZXJDb25zdHJ1Y3Rvcih0aGlzLmNmLCB0aGlzLnN0bWYsIG51bSwgZ2VuLCB0aGlzLmVuY3J5cHRpb25LZXkpLCBidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsIHRoaXMuc3RyZiwgbnVtLCBnZW4sIHRoaXMuZW5jcnlwdGlvbktleSkpOworICAgICAgfQorCisgICAgICB2YXIga2V5ID0gYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIHRoaXMuZW5jcnlwdGlvbktleSwgZmFsc2UpOworCisgICAgICB2YXIgY2lwaGVyQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBidWlsZENpcGhlckNpcGhlckNvbnN0cnVjdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IEFSQ0ZvdXJDaXBoZXIoa2V5KTsKKyAgICAgIH07CisKKyAgICAgIHJldHVybiBuZXcgQ2lwaGVyVHJhbnNmb3JtKGNpcGhlckNvbnN0cnVjdG9yLCBjaXBoZXJDb25zdHJ1Y3Rvcik7CisgICAgfQorICB9OworICByZXR1cm4gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeTsKK30oKTsKKworZXhwb3J0cy5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5ID0gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeTsKKworLyoqKi8gfSksCisvKiAyMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNvbG9yU3BhY2UgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK2Z1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKHNyYywgZGVzdCwgdzEsIGgxLCB3MiwgaDIsIGFscGhhMDEpIHsKKyAgY29uc3QgQ09NUE9ORU5UUyA9IDM7CisgIGFscGhhMDEgPSBhbHBoYTAxICE9PSAxID8gMCA6IGFscGhhMDE7CisgIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CisgIGNvbnN0IHlSYXRpbyA9IGgxIC8gaDI7CisgIGxldCBuZXdJbmRleCA9IDAsCisgICAgICBvbGRJbmRleDsKKyAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7CisgIGNvbnN0IHcxU2NhbmxpbmUgPSB3MSAqIENPTVBPTkVOVFM7CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCB3MjsgaSsrKSB7CisgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbykgKiBDT01QT05FTlRTOworICB9CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CisgICAgY29uc3QgcHkgPSBNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzFTY2FubGluZTsKKworICAgIGZvciAobGV0IGogPSAwOyBqIDwgdzI7IGorKykgeworICAgICAgb2xkSW5kZXggPSBweSArIHhTY2FsZWRbal07CisgICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOworICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IHNyY1tvbGRJbmRleCsrXTsKKyAgICAgIGRlc3RbbmV3SW5kZXgrK10gPSBzcmNbb2xkSW5kZXgrK107CisgICAgICBuZXdJbmRleCArPSBhbHBoYTAxOworICAgIH0KKyAgfQorfQorCitjbGFzcyBDb2xvclNwYWNlIHsKKyAgY29uc3RydWN0b3IobmFtZSwgbnVtQ29tcHMpIHsKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQ29sb3JTcGFjZSkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29sb3JTcGFjZS4iKTsKKyAgICB9CisKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMubnVtQ29tcHMgPSBudW1Db21wczsKKyAgfQorCisgIGdldFJnYihzcmMsIHNyY09mZnNldCkgeworICAgIGNvbnN0IHJnYiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKKyAgICB0aGlzLmdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIHJnYiwgMCk7CisgICAgcmV0dXJuIHJnYjsKKyAgfQorCisgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIik7CisgIH0KKworICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0UmdiQnVmZmVyIik7CisgIH0KKworICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGgiKTsKKyAgfQorCisgIGlzUGFzc3Rocm91Z2goYml0cykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgeworICAgIHJldHVybiBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIHRoaXMubnVtQ29tcHMpOworICB9CisKKyAgZmlsbFJnYihkZXN0LCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgd2lkdGgsIGhlaWdodCwgYWN0dWFsSGVpZ2h0LCBicGMsIGNvbXBzLCBhbHBoYTAxKSB7CisgICAgY29uc3QgY291bnQgPSBvcmlnaW5hbFdpZHRoICogb3JpZ2luYWxIZWlnaHQ7CisgICAgbGV0IHJnYkJ1ZiA9IG51bGw7CisgICAgY29uc3QgbnVtQ29tcG9uZW50Q29sb3JzID0gMSA8PCBicGM7CisgICAgY29uc3QgbmVlZHNSZXNpemluZyA9IG9yaWdpbmFsSGVpZ2h0ICE9PSBoZWlnaHQgfHwgb3JpZ2luYWxXaWR0aCAhPT0gd2lkdGg7CisKKyAgICBpZiAodGhpcy5pc1Bhc3N0aHJvdWdoKGJwYykpIHsKKyAgICAgIHJnYkJ1ZiA9IGNvbXBzOworICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wcyA9PT0gMSAmJiBjb3VudCA+IG51bUNvbXBvbmVudENvbG9ycyAmJiB0aGlzLm5hbWUgIT09ICJEZXZpY2VHcmF5IiAmJiB0aGlzLm5hbWUgIT09ICJEZXZpY2VSR0IiKSB7CisgICAgICBjb25zdCBhbGxDb2xvcnMgPSBicGMgPD0gOCA/IG5ldyBVaW50OEFycmF5KG51bUNvbXBvbmVudENvbG9ycykgOiBuZXcgVWludDE2QXJyYXkobnVtQ29tcG9uZW50Q29sb3JzKTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRDb2xvcnM7IGkrKykgeworICAgICAgICBhbGxDb2xvcnNbaV0gPSBpOworICAgICAgfQorCisgICAgICBjb25zdCBjb2xvck1hcCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShudW1Db21wb25lbnRDb2xvcnMgKiAzKTsKKyAgICAgIHRoaXMuZ2V0UmdiQnVmZmVyKGFsbENvbG9ycywgMCwgbnVtQ29tcG9uZW50Q29sb3JzLCBjb2xvck1hcCwgMCwgYnBjLCAwKTsKKworICAgICAgaWYgKCFuZWVkc1Jlc2l6aW5nKSB7CisgICAgICAgIGxldCBkZXN0UG9zID0gMDsKKworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICBjb25zdCBrZXkgPSBjb21wc1tpXSAqIDM7CisgICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gY29sb3JNYXBba2V5XTsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAyXTsKKyAgICAgICAgICBkZXN0UG9zICs9IGFscGhhMDE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OEFycmF5KGNvdW50ICogMyk7CisgICAgICAgIGxldCByZ2JQb3MgPSAwOworCisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgIGNvbnN0IGtleSA9IGNvbXBzW2ldICogMzsKKyAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5XTsKKyAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMV07CisgICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleSArIDJdOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghbmVlZHNSZXNpemluZykgeworICAgICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgd2lkdGggKiBhY3R1YWxIZWlnaHQsIGRlc3QsIDAsIGJwYywgYWxwaGEwMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZ2JCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoY291bnQgKiAzKTsKKyAgICAgICAgdGhpcy5nZXRSZ2JCdWZmZXIoY29tcHMsIDAsIGNvdW50LCByZ2JCdWYsIDAsIGJwYywgMCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJnYkJ1ZikgeworICAgICAgaWYgKG5lZWRzUmVzaXppbmcpIHsKKyAgICAgICAgcmVzaXplUmdiSW1hZ2UocmdiQnVmLCBkZXN0LCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgd2lkdGgsIGhlaWdodCwgYWxwaGEwMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsZXQgZGVzdFBvcyA9IDAsCisgICAgICAgICAgICByZ2JQb3MgPSAwOworCisgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107CisgICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdOworICAgICAgICAgIGRlc3RQb3MgKz0gYWxwaGEwMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKSB7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ1c2VzWmVyb1RvT25lUmFuZ2UiLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBfY2FjaGUoY2FjaGVLZXksIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKSB7CisgICAgaWYgKCFsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xvclNwYWNlLl9jYWNoZSAtIGV4cGVjdGVkICJsb2NhbENvbG9yU3BhY2VDYWNoZSIgYXJndW1lbnQuJyk7CisgICAgfQorCisgICAgaWYgKCFwYXJzZWRDb2xvclNwYWNlKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgInBhcnNlZENvbG9yU3BhY2UiIGFyZ3VtZW50LicpOworICAgIH0KKworICAgIGxldCBjc05hbWUsIGNzUmVmOworCisgICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICBjc1JlZiA9IGNhY2hlS2V5OworICAgICAgY2FjaGVLZXkgPSB4cmVmLmZldGNoKGNhY2hlS2V5KTsKKyAgICB9CisKKyAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CisgICAgICBjc05hbWUgPSBjYWNoZUtleS5uYW1lOworICAgIH0KKworICAgIGlmIChjc05hbWUgfHwgY3NSZWYpIHsKKyAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLnNldChjc05hbWUsIGNzUmVmLCBwYXJzZWRDb2xvclNwYWNlKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgZ2V0Q2FjaGVkKGNhY2hlS2V5LCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIGlmICghbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5nZXRDYWNoZWQgLSBleHBlY3RlZCAibG9jYWxDb2xvclNwYWNlQ2FjaGUiIGFyZ3VtZW50LicpOworICAgIH0KKworICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgeworICAgICAgY29uc3QgbG9jYWxDb2xvclNwYWNlID0gbG9jYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlSZWYoY2FjaGVLZXkpOworCisgICAgICBpZiAobG9jYWxDb2xvclNwYWNlKSB7CisgICAgICAgIHJldHVybiBsb2NhbENvbG9yU3BhY2U7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNhY2hlS2V5ID0geHJlZi5mZXRjaChjYWNoZUtleSk7CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgeworICAgICAgY29uc3QgbG9jYWxDb2xvclNwYWNlID0gbG9jYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlOYW1lKGNhY2hlS2V5Lm5hbWUpOworCisgICAgICBpZiAobG9jYWxDb2xvclNwYWNlKSB7CisgICAgICAgIHJldHVybiBsb2NhbENvbG9yU3BhY2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBzdGF0aWMgYXN5bmMgcGFyc2VBc3luYyh7CisgICAgY3MsCisgICAgeHJlZiwKKyAgICByZXNvdXJjZXMgPSBudWxsLAorICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICB9KSB7CisgICAgY29uc3QgcGFyc2VkQ29sb3JTcGFjZSA9IHRoaXMuX3BhcnNlKGNzLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CisKKyAgICB0aGlzLl9jYWNoZShjcywgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIHBhcnNlZENvbG9yU3BhY2UpOworCisgICAgcmV0dXJuIHBhcnNlZENvbG9yU3BhY2U7CisgIH0KKworICBzdGF0aWMgcGFyc2UoeworICAgIGNzLAorICAgIHhyZWYsCisgICAgcmVzb3VyY2VzID0gbnVsbCwKKyAgICBwZGZGdW5jdGlvbkZhY3RvcnksCisgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgfSkgeworICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSB0aGlzLmdldENhY2hlZChjcywgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHsKKyAgICAgIHJldHVybiBjYWNoZWRDb2xvclNwYWNlOworICAgIH0KKworICAgIGNvbnN0IHBhcnNlZENvbG9yU3BhY2UgPSB0aGlzLl9wYXJzZShjcywgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworCisgICAgdGhpcy5fY2FjaGUoY3MsIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKTsKKworICAgIHJldHVybiBwYXJzZWRDb2xvclNwYWNlOworICB9CisKKyAgc3RhdGljIF9wYXJzZShjcywgeHJlZiwgcmVzb3VyY2VzID0gbnVsbCwgcGRmRnVuY3Rpb25GYWN0b3J5KSB7CisgICAgY3MgPSB4cmVmLmZldGNoSWZSZWYoY3MpOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGNzKSkgeworICAgICAgc3dpdGNoIChjcy5uYW1lKSB7CisgICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgorICAgICAgICBjYXNlICJHIjoKKyAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7CisKKyAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKKyAgICAgICAgY2FzZSAiUkdCIjoKKyAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjsKKworICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKKyAgICAgICAgY2FzZSAiQ01ZSyI6CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOworCisgICAgICAgIGNhc2UgIlBhdHRlcm4iOgorICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKG51bGwpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGNvbnN0IGNvbG9yU3BhY2VzID0gcmVzb3VyY2VzLmdldCgiQ29sb3JTcGFjZSIpOworCisgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY29sb3JTcGFjZXMpKSB7CisgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlc0NTID0gY29sb3JTcGFjZXMuZ2V0KGNzLm5hbWUpOworCisgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNDUykgeworICAgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShyZXNvdXJjZXNDUykpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJzZShyZXNvdXJjZXNDUywgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNzID0gcmVzb3VyY2VzQ1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVucmVjb2duaXplZCBDb2xvclNwYWNlOiAke2NzLm5hbWV9YCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEFycmF5LmlzQXJyYXkoY3MpKSB7CisgICAgICBjb25zdCBtb2RlID0geHJlZi5mZXRjaElmUmVmKGNzWzBdKS5uYW1lOworICAgICAgbGV0IHBhcmFtcywgbnVtQ29tcHMsIGJhc2VDUywgd2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWE7CisKKyAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlICJEZXZpY2VHcmF5IjoKKyAgICAgICAgY2FzZSAiRyI6CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5OworCisgICAgICAgIGNhc2UgIkRldmljZVJHQiI6CisgICAgICAgIGNhc2UgIlJHQiI6CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5yZ2I7CisKKyAgICAgICAgY2FzZSAiRGV2aWNlQ01ZSyI6CisgICAgICAgIGNhc2UgIkNNWUsiOgorICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuY215azsKKworICAgICAgICBjYXNlICJDYWxHcmF5IjoKKyAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOworICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKKyAgICAgICAgICBibGFja1BvaW50ID0gcGFyYW1zLmdldEFycmF5KCJCbGFja1BvaW50Iik7CisgICAgICAgICAgZ2FtbWEgPSBwYXJhbXMuZ2V0KCJHYW1tYSIpOworICAgICAgICAgIHJldHVybiBuZXcgQ2FsR3JheUNTKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hKTsKKworICAgICAgICBjYXNlICJDYWxSR0IiOgorICAgICAgICAgIHBhcmFtcyA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CisgICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOworICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKKyAgICAgICAgICBnYW1tYSA9IHBhcmFtcy5nZXRBcnJheSgiR2FtbWEiKTsKKyAgICAgICAgICBjb25zdCBtYXRyaXggPSBwYXJhbXMuZ2V0QXJyYXkoIk1hdHJpeCIpOworICAgICAgICAgIHJldHVybiBuZXcgQ2FsUkdCQ1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEsIG1hdHJpeCk7CisKKyAgICAgICAgY2FzZSAiSUNDQmFzZWQiOgorICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CisgICAgICAgICAgY29uc3QgZGljdCA9IHN0cmVhbS5kaWN0OworICAgICAgICAgIG51bUNvbXBzID0gZGljdC5nZXQoIk4iKTsKKyAgICAgICAgICBjb25zdCBhbHQgPSBkaWN0LmdldCgiQWx0ZXJuYXRlIik7CisKKyAgICAgICAgICBpZiAoYWx0KSB7CisgICAgICAgICAgICBjb25zdCBhbHRDUyA9IHRoaXMuX3BhcnNlKGFsdCwgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworCisgICAgICAgICAgICBpZiAoYWx0Q1MubnVtQ29tcHMgPT09IG51bUNvbXBzKSB7CisgICAgICAgICAgICAgIHJldHVybiBhbHRDUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJQ0NCYXNlZCBjb2xvciBzcGFjZTogSWdub3JpbmcgaW5jb3JyZWN0IC9BbHRlcm5hdGUgZW50cnkuIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG51bUNvbXBzID09PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7CisgICAgICAgICAgfSBlbHNlIGlmIChudW1Db21wcyA9PT0gMykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5yZ2I7CisgICAgICAgICAgfSBlbHNlIGlmIChudW1Db21wcyA9PT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIlBhdHRlcm4iOgorICAgICAgICAgIGJhc2VDUyA9IGNzWzFdIHx8IG51bGw7CisKKyAgICAgICAgICBpZiAoYmFzZUNTKSB7CisgICAgICAgICAgICBiYXNlQ1MgPSB0aGlzLl9wYXJzZShiYXNlQ1MsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gbmV3IFBhdHRlcm5DUyhiYXNlQ1MpOworCisgICAgICAgIGNhc2UgIkluZGV4ZWQiOgorICAgICAgICBjYXNlICJJIjoKKyAgICAgICAgICBiYXNlQ1MgPSB0aGlzLl9wYXJzZShjc1sxXSwgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworICAgICAgICAgIGNvbnN0IGhpVmFsID0geHJlZi5mZXRjaElmUmVmKGNzWzJdKSArIDE7CisgICAgICAgICAgY29uc3QgbG9va3VwID0geHJlZi5mZXRjaElmUmVmKGNzWzNdKTsKKyAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRDUyhiYXNlQ1MsIGhpVmFsLCBsb29rdXApOworCisgICAgICAgIGNhc2UgIlNlcGFyYXRpb24iOgorICAgICAgICBjYXNlICJEZXZpY2VOIjoKKyAgICAgICAgICBjb25zdCBuYW1lID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKKyAgICAgICAgICBudW1Db21wcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lLmxlbmd0aCA6IDE7CisgICAgICAgICAgYmFzZUNTID0gdGhpcy5fcGFyc2UoY3NbMl0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKKyAgICAgICAgICBjb25zdCB0aW50Rm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGNzWzNdKTsKKyAgICAgICAgICByZXR1cm4gbmV3IEFsdGVybmF0ZUNTKG51bUNvbXBzLCBiYXNlQ1MsIHRpbnRGbik7CisKKyAgICAgICAgY2FzZSAiTGFiIjoKKyAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOworICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKKyAgICAgICAgICBibGFja1BvaW50ID0gcGFyYW1zLmdldEFycmF5KCJCbGFja1BvaW50Iik7CisgICAgICAgICAgY29uc3QgcmFuZ2UgPSBwYXJhbXMuZ2V0QXJyYXkoIlJhbmdlIik7CisgICAgICAgICAgcmV0dXJuIG5ldyBMYWJDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVuaW1wbGVtZW50ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICR7bW9kZX1gKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogJHtjc31gKTsKKyAgfQorCisgIHN0YXRpYyBpc0RlZmF1bHREZWNvZGUoZGVjb2RlLCBudW1Db21wcykgeworICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNvZGUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobnVtQ29tcHMgKiAyICE9PSBkZWNvZGUubGVuZ3RoKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIlRoZSBkZWNvZGUgbWFwIGlzIG5vdCB0aGUgY29ycmVjdCBsZW5ndGgiKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRlY29kZS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CisgICAgICBpZiAoZGVjb2RlW2ldICE9PSAwIHx8IGRlY29kZVtpICsgMV0gIT09IDEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3RhdGljIGdldCBzaW5nbGV0b25zKCkgeworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAic2luZ2xldG9ucyIsIHsKKyAgICAgIGdldCBncmF5KCkgeworICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImdyYXkiLCBuZXcgRGV2aWNlR3JheUNTKCkpOworICAgICAgfSwKKworICAgICAgZ2V0IHJnYigpIHsKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJyZ2IiLCBuZXcgRGV2aWNlUmdiQ1MoKSk7CisgICAgICB9LAorCisgICAgICBnZXQgY215aygpIHsKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjbXlrIiwgbmV3IERldmljZUNteWtDUygpKTsKKyAgICAgIH0KKworICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5Db2xvclNwYWNlID0gQ29sb3JTcGFjZTsKKworY2xhc3MgQWx0ZXJuYXRlQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKKyAgY29uc3RydWN0b3IobnVtQ29tcHMsIGJhc2UsIHRpbnRGbikgeworICAgIHN1cGVyKCJBbHRlcm5hdGUiLCBudW1Db21wcyk7CisgICAgdGhpcy5iYXNlID0gYmFzZTsKKyAgICB0aGlzLnRpbnRGbiA9IHRpbnRGbjsKKyAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBGbG9hdDMyQXJyYXkoYmFzZS5udW1Db21wcyk7CisgIH0KKworICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgY29uc3QgdG1wQnVmID0gdGhpcy50bXBCdWY7CisgICAgdGhpcy50aW50Rm4oc3JjLCBzcmNPZmZzZXQsIHRtcEJ1ZiwgMCk7CisgICAgdGhpcy5iYXNlLmdldFJnYkl0ZW0odG1wQnVmLCAwLCBkZXN0LCBkZXN0T2Zmc2V0KTsKKyAgfQorCisgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICBjb25zdCB0aW50Rm4gPSB0aGlzLnRpbnRGbjsKKyAgICBjb25zdCBiYXNlID0gdGhpcy5iYXNlOworICAgIGNvbnN0IHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOworICAgIGNvbnN0IGJhc2VOdW1Db21wcyA9IGJhc2UubnVtQ29tcHM7CisgICAgY29uc3QgdXNlc1plcm9Ub09uZVJhbmdlID0gYmFzZS51c2VzWmVyb1RvT25lUmFuZ2U7CisgICAgY29uc3QgaXNQYXNzdGhyb3VnaCA9IChiYXNlLmlzUGFzc3Rocm91Z2goOCkgfHwgIXVzZXNaZXJvVG9PbmVSYW5nZSkgJiYgYWxwaGEwMSA9PT0gMDsKKyAgICBsZXQgcG9zID0gaXNQYXNzdGhyb3VnaCA/IGRlc3RPZmZzZXQgOiAwOworICAgIGNvbnN0IGJhc2VCdWYgPSBpc1Bhc3N0aHJvdWdoID8gZGVzdCA6IG5ldyBVaW50OENsYW1wZWRBcnJheShiYXNlTnVtQ29tcHMgKiBjb3VudCk7CisgICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOworICAgIGNvbnN0IHNjYWxlZCA9IG5ldyBGbG9hdDMyQXJyYXkobnVtQ29tcHMpOworICAgIGNvbnN0IHRpbnRlZCA9IG5ldyBGbG9hdDMyQXJyYXkoYmFzZU51bUNvbXBzKTsKKyAgICBsZXQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7IGorKykgeworICAgICAgICBzY2FsZWRbal0gPSBzcmNbc3JjT2Zmc2V0KytdICogc2NhbGU7CisgICAgICB9CisKKyAgICAgIHRpbnRGbihzY2FsZWQsIDAsIHRpbnRlZCwgMCk7CisKKyAgICAgIGlmICh1c2VzWmVyb1RvT25lUmFuZ2UpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJhc2VOdW1Db21wczsgaisrKSB7CisgICAgICAgICAgYmFzZUJ1Zltwb3MrK10gPSB0aW50ZWRbal0gKiAyNTU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJhc2UuZ2V0UmdiSXRlbSh0aW50ZWQsIDAsIGJhc2VCdWYsIHBvcyk7CisgICAgICAgIHBvcyArPSBiYXNlTnVtQ29tcHM7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFpc1Bhc3N0aHJvdWdoKSB7CisgICAgICBiYXNlLmdldFJnYkJ1ZmZlcihiYXNlQnVmLCAwLCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7CisgICAgfQorICB9CisKKyAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGggKiB0aGlzLmJhc2UubnVtQ29tcHMgLyB0aGlzLm51bUNvbXBzLCBhbHBoYTAxKTsKKyAgfQorCit9CisKK2NsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2UgeworICBjb25zdHJ1Y3RvcihiYXNlQ1MpIHsKKyAgICBzdXBlcigiUGF0dGVybiIsIG51bGwpOworICAgIHRoaXMuYmFzZSA9IGJhc2VDUzsKKyAgfQorCisgIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBQYXR0ZXJuQ1MuaXNEZWZhdWx0RGVjb2RlIik7CisgIH0KKworfQorCitjbGFzcyBJbmRleGVkQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKKyAgY29uc3RydWN0b3IoYmFzZSwgaGlnaFZhbCwgbG9va3VwKSB7CisgICAgc3VwZXIoIkluZGV4ZWQiLCAxKTsKKyAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgIHRoaXMuaGlnaFZhbCA9IGhpZ2hWYWw7CisgICAgY29uc3QgbGVuZ3RoID0gYmFzZS5udW1Db21wcyAqIGhpZ2hWYWw7CisgICAgdGhpcy5sb29rdXAgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkobG9va3VwKSkgeworICAgICAgY29uc3QgYnl0ZXMgPSBsb29rdXAuZ2V0Qnl0ZXMobGVuZ3RoKTsKKyAgICAgIHRoaXMubG9va3VwLnNldChieXRlcyk7CisgICAgfSBlbHNlIGlmICh0eXBlb2YgbG9va3VwID09PSAic3RyaW5nIikgeworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICB0aGlzLmxvb2t1cFtpXSA9IGxvb2t1cC5jaGFyQ29kZUF0KGkpICYgMHhmZjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbmRleGVkQ1MgLSB1bnJlY29nbml6ZWQgbG9va3VwIHRhYmxlOiAke2xvb2t1cH1gKTsKKyAgICB9CisgIH0KKworICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLmJhc2UubnVtQ29tcHM7CisgICAgY29uc3Qgc3RhcnQgPSBzcmNbc3JjT2Zmc2V0XSAqIG51bUNvbXBzOworICAgIHRoaXMuYmFzZS5nZXRSZ2JCdWZmZXIodGhpcy5sb29rdXAsIHN0YXJ0LCAxLCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCAwKTsKKyAgfQorCisgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICBjb25zdCBiYXNlID0gdGhpcy5iYXNlOworICAgIGNvbnN0IG51bUNvbXBzID0gYmFzZS5udW1Db21wczsKKyAgICBjb25zdCBvdXRwdXREZWx0YSA9IGJhc2UuZ2V0T3V0cHV0TGVuZ3RoKG51bUNvbXBzLCBhbHBoYTAxKTsKKyAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgY29uc3QgbG9va3VwUG9zID0gc3JjW3NyY09mZnNldCsrXSAqIG51bUNvbXBzOworICAgICAgYmFzZS5nZXRSZ2JCdWZmZXIobG9va3VwLCBsb29rdXBQb3MsIDEsIGRlc3QsIGRlc3RPZmZzZXQsIDgsIGFscGhhMDEpOworICAgICAgZGVzdE9mZnNldCArPSBvdXRwdXREZWx0YTsKKyAgICB9CisgIH0KKworICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKKyAgICByZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCAqIHRoaXMuYmFzZS5udW1Db21wcywgYWxwaGEwMSk7CisgIH0KKworICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKKyAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjb2RlTWFwKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGRlY29kZU1hcC5sZW5ndGggIT09IDIpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiRGVjb2RlIG1hcCBsZW5ndGggaXMgbm90IGNvcnJlY3QiKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihicGMpIHx8IGJwYyA8IDEpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiQml0cyBwZXIgY29tcG9uZW50IGlzIG5vdCBjb3JyZWN0Iik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZGVjb2RlTWFwWzBdID09PSAwICYmIGRlY29kZU1hcFsxXSA9PT0gKDEgPDwgYnBjKSAtIDE7CisgIH0KKworfQorCitjbGFzcyBEZXZpY2VHcmF5Q1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgc3VwZXIoIkRldmljZUdyYXkiLCAxKTsKKyAgfQorCisgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICBjb25zdCBjID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CisgICAgZGVzdFtkZXN0T2Zmc2V0XSA9IGRlc3RbZGVzdE9mZnNldCArIDFdID0gZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBjOworICB9CisKKyAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgIGNvbnN0IHNjYWxlID0gMjU1IC8gKCgxIDw8IGJpdHMpIC0gMSk7CisgICAgbGV0IGogPSBzcmNPZmZzZXQsCisgICAgICAgIHEgPSBkZXN0T2Zmc2V0OworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICBjb25zdCBjID0gc2NhbGUgKiBzcmNbaisrXTsKKyAgICAgIGRlc3RbcSsrXSA9IGM7CisgICAgICBkZXN0W3ErK10gPSBjOworICAgICAgZGVzdFtxKytdID0gYzsKKyAgICAgIHEgKz0gYWxwaGEwMTsKKyAgICB9CisgIH0KKworICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKKyAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpOworICB9CisKK30KKworY2xhc3MgRGV2aWNlUmdiQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgc3VwZXIoIkRldmljZVJHQiIsIDMpOworICB9CisKKyAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgIGRlc3RbZGVzdE9mZnNldF0gPSBzcmNbc3JjT2Zmc2V0XSAqIDI1NTsKKyAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIDI1NTsKKyAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IHNyY1tzcmNPZmZzZXQgKyAyXSAqIDI1NTsKKyAgfQorCisgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICBpZiAoYml0cyA9PT0gOCAmJiBhbHBoYTAxID09PSAwKSB7CisgICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjT2Zmc2V0LCBzcmNPZmZzZXQgKyBjb3VudCAqIDMpLCBkZXN0T2Zmc2V0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBzY2FsZSA9IDI1NSAvICgoMSA8PCBiaXRzKSAtIDEpOworICAgIGxldCBqID0gc3JjT2Zmc2V0LAorICAgICAgICBxID0gZGVzdE9mZnNldDsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgZGVzdFtxKytdID0gc2NhbGUgKiBzcmNbaisrXTsKKyAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CisgICAgICBkZXN0W3ErK10gPSBzY2FsZSAqIHNyY1tqKytdOworICAgICAgcSArPSBhbHBoYTAxOworICAgIH0KKyAgfQorCisgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgeworICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSkgLyAzIHwgMDsKKyAgfQorCisgIGlzUGFzc3Rocm91Z2goYml0cykgeworICAgIHJldHVybiBiaXRzID09PSA4OworICB9CisKK30KKworY29uc3QgRGV2aWNlQ215a0NTID0gZnVuY3Rpb24gRGV2aWNlQ215a0NTQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzcmNTY2FsZSwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgIGNvbnN0IGMgPSBzcmNbc3JjT2Zmc2V0XSAqIHNyY1NjYWxlOworICAgIGNvbnN0IG0gPSBzcmNbc3JjT2Zmc2V0ICsgMV0gKiBzcmNTY2FsZTsKKyAgICBjb25zdCB5ID0gc3JjW3NyY09mZnNldCArIDJdICogc3JjU2NhbGU7CisgICAgY29uc3QgayA9IHNyY1tzcmNPZmZzZXQgKyAzXSAqIHNyY1NjYWxlOworICAgIGRlc3RbZGVzdE9mZnNldF0gPSAyNTUgKyBjICogKC00LjM4NzMzMjM4NDYwOTk4OCAqIGMgKyA1NC40ODYxNTE5NDE4OTE3NiAqIG0gKyAxOC44MjI5MDUwMjE2NTMwMiAqIHkgKyAyMTIuMjU2NjI0NTE2Mzk1ODUgKiBrICsgLTI4NS4yMzMxMDI2MTM3MDA0KSArIG0gKiAoMS43MTQ5NzYzNDc3MzYyMTM0ICogbSAtIDUuNjA5NjczNjkwNDA0NzMxNSAqIHkgKyAtMTcuODczODcwODYxNDE1NDQ0ICogayAtIDUuNDk3MDA2NDI3MTk2MzY2KSArIHkgKiAoLTIuNTIxNzM0MDEzMTY4MzAzMyAqIHkgLSAyMS4yNDg5MjMzMzczNTMwNzMgKiBrICsgMTcuNTExOTI3MDg0MTgxMykgKyBrICogKC0yMS44NjEyMjE0NzQ2MzYwNSAqIGsgLSAxODkuNDgxODA4MzU5MjI3NDcpOworICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gMjU1ICsgYyAqICg4Ljg0MTA0MTQyMjAzNjE0OSAqIGMgKyA2MC4xMTgwMjcwNDU1OTczNjYgKiBtICsgNi44NzE0MjU1OTIwNDkwMDcgKiB5ICsgMzEuMTU5MTAwMTMwMDU1OTIyICogayArIC03OS4yOTcwODQ0ODE2NTQ4KSArIG0gKiAoLTE1LjMxMDM2MTMwNjk2NzgxNyAqIG0gKyAxNy41NzUyNTEyNjExMDk0ODIgKiB5ICsgMTMxLjM1MjUwOTEyNDkzOTc2ICogayAtIDE5MC45NDUzMzAyNTg4OTUxKSArIHkgKiAoNC40NDQzMzkxMDI4NTI3MzkgKiB5ICsgOS44NjMyODYxNDkzNDA1ICogayAtIDI0Ljg2NzQxNTgyNTU1ODc4KSArIGsgKiAoLTIwLjczNzMyNTQ3MTE4MTAzNCAqIGsgLSAxODcuODA0NTM3MDk3MTk1NzgpOworICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gMjU1ICsgYyAqICgwLjg4NDI1MjI0MzAwMDMyOTYgKiBjICsgOC4wNzg2Nzc1MDMxMTI5MjggKiBtICsgMzAuODk5NzgzMDk3MDM3MjkgKiB5IC0gMC4yMzg4MzIzODY4OTE3ODkzNCAqIGsgKyAtMTQuMTgzNTc2Nzk5NjczMjg2KSArIG0gKiAoMTAuNDk1OTMyNzM0MzIwNzIgKiBtICsgNjMuMDIzNzg0OTQ3NTQwNTIgKiB5ICsgNTAuNjA2OTU3NjU2MzYwNzM0ICogayAtIDExMi4yMzg4NDI1MzcxOTI0OCkgKyB5ICogKDAuMDMyOTYwNDExMTQ4NzMyMTcgKiB5ICsgMTE1LjYwMzg0NDQ5NjQ2NjQxICogayArIC0xOTMuNTgyMDkzNTY4NjE1MDUpICsgayAqICgtMjIuMzM4MTY4MDczMDk4ODYgKiBrIC0gMTgwLjEyNjEzOTc0NzA4MzY3KTsKKyAgfQorCisgIGNsYXNzIERldmljZUNteWtDUyBleHRlbmRzIENvbG9yU3BhY2UgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgc3VwZXIoIkRldmljZUNNWUsiLCA0KTsKKyAgICB9CisKKyAgICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICBjb252ZXJ0VG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIDEsIGRlc3QsIGRlc3RPZmZzZXQpOworICAgIH0KKworICAgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICAgIGNvbnN0IHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzY2FsZSwgZGVzdCwgZGVzdE9mZnNldCk7CisgICAgICAgIHNyY09mZnNldCArPSA0OworICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOworICAgICAgfQorICAgIH0KKworICAgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgeworICAgICAgcmV0dXJuIGlucHV0TGVuZ3RoIC8gNCAqICgzICsgYWxwaGEwMSkgfCAwOworICAgIH0KKworICB9CisKKyAgcmV0dXJuIERldmljZUNteWtDUzsKK30oKTsKKworY29uc3QgQ2FsR3JheUNTID0gZnVuY3Rpb24gQ2FsR3JheUNTQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gY29udmVydFRvUmdiKGNzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpIHsKKyAgICBjb25zdCBBID0gc3JjW3NyY09mZnNldF0gKiBzY2FsZTsKKyAgICBjb25zdCBBRyA9IEEgKiogY3MuRzsKKyAgICBjb25zdCBMID0gY3MuWVcgKiBBRzsKKyAgICBjb25zdCB2YWwgPSBNYXRoLm1heCgyOTUuOCAqIEwgKiogMC4zMzMzMzMzMzMzMzMzMzMzMzMgLSA0MC44LCAwKTsKKyAgICBkZXN0W2Rlc3RPZmZzZXRdID0gdmFsOworICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdmFsOworICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gdmFsOworICB9CisKKyAgY2xhc3MgQ2FsR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CisgICAgY29uc3RydWN0b3Iod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEpIHsKKyAgICAgIHN1cGVyKCJDYWxHcmF5IiwgMSk7CisKKyAgICAgIGlmICghd2hpdGVQb2ludCkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxHcmF5Iik7CisgICAgICB9CisKKyAgICAgIGJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IFswLCAwLCAwXTsKKyAgICAgIGdhbW1hID0gZ2FtbWEgfHwgMTsKKyAgICAgIHRoaXMuWFcgPSB3aGl0ZVBvaW50WzBdOworICAgICAgdGhpcy5ZVyA9IHdoaXRlUG9pbnRbMV07CisgICAgICB0aGlzLlpXID0gd2hpdGVQb2ludFsyXTsKKyAgICAgIHRoaXMuWEIgPSBibGFja1BvaW50WzBdOworICAgICAgdGhpcy5ZQiA9IGJsYWNrUG9pbnRbMV07CisgICAgICB0aGlzLlpCID0gYmxhY2tQb2ludFsyXTsKKyAgICAgIHRoaXMuRyA9IGdhbW1hOworCisgICAgICBpZiAodGhpcy5YVyA8IDAgfHwgdGhpcy5aVyA8IDAgfHwgdGhpcy5ZVyAhPT0gMSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX1gICsgIiwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLlhCIDwgMCB8fCB0aGlzLllCIDwgMCB8fCB0aGlzLlpCIDwgMCkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoYEludmFsaWQgQmxhY2tQb2ludCBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTsKKyAgICAgICAgdGhpcy5YQiA9IHRoaXMuWUIgPSB0aGlzLlpCID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuWEIgIT09IDAgfHwgdGhpcy5ZQiAhPT0gMCB8fCB0aGlzLlpCICE9PSAwKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgJHt0aGlzLm5hbWV9LCBCbGFja1BvaW50OiBYQjogJHt0aGlzLlhCfSwgWUI6ICR7dGhpcy5ZQn0sIGAgKyBgWkI6ICR7dGhpcy5aQn0sIG9ubHkgZGVmYXVsdCB2YWx1ZXMgYXJlIHN1cHBvcnRlZC5gKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuRyA8IDEpIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKGBJbnZhbGlkIEdhbW1hOiAke3RoaXMuR30gZm9yICR7dGhpcy5uYW1lfSwgYCArICJmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC4iKTsKKyAgICAgICAgdGhpcy5HID0gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIDEpOworICAgIH0KKworICAgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICAgIGNvbnN0IHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgY29udmVydFRvUmdiKHRoaXMsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSk7CisgICAgICAgIHNyY09mZnNldCArPSAxOworICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOworICAgICAgfQorICAgIH0KKworICAgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgeworICAgICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiBDYWxHcmF5Q1M7Cit9KCk7CisKK2NvbnN0IENhbFJHQkNTID0gZnVuY3Rpb24gQ2FsUkdCQ1NDbG9zdXJlKCkgeworICBjb25zdCBCUkFERk9SRF9TQ0FMRV9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFswLjg5NTEsIDAuMjY2NCwgLTAuMTYxNCwgLTAuNzUwMiwgMS43MTM1LCAwLjAzNjcsIDAuMDM4OSwgLTAuMDY4NSwgMS4wMjk2XSk7CisgIGNvbnN0IEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMC45ODY5OTI5LCAtMC4xNDcwNTQzLCAwLjE1OTk2MjcsIDAuNDMyMzA1MywgMC41MTgzNjAzLCAwLjA0OTI5MTIsIC0wLjAwODUyODcsIDAuMDQwMDQyOCwgMC45Njg0ODY3XSk7CisgIGNvbnN0IFNSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMy4yNDA0NTQyLCAtMS41MzcxMzg1LCAtMC40OTg1MzE0LCAtMC45NjkyNjYwLCAxLjg3NjAxMDgsIDAuMDQxNTU2MCwgMC4wNTU2NDM0LCAtMC4yMDQwMjU5LCAxLjA1NzIyNTJdKTsKKyAgY29uc3QgRkxBVF9XSElURVBPSU5UX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDFdKTsKKyAgY29uc3QgdGVtcE5vcm1hbGl6ZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CisgIGNvbnN0IHRlbXBDb252ZXJ0TWF0cml4MSA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CisgIGNvbnN0IHRlbXBDb252ZXJ0TWF0cml4MiA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CisgIGNvbnN0IERFQ09ERV9MX0NPTlNUQU5UID0gKCg4ICsgMTYpIC8gMTE2KSAqKiAzIC8gOC4wOworCisgIGZ1bmN0aW9uIG1hdHJpeFByb2R1Y3QoYSwgYiwgcmVzdWx0KSB7CisgICAgcmVzdWx0WzBdID0gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdOworICAgIHJlc3VsdFsxXSA9IGFbM10gKiBiWzBdICsgYVs0XSAqIGJbMV0gKyBhWzVdICogYlsyXTsKKyAgICByZXN1bHRbMl0gPSBhWzZdICogYlswXSArIGFbN10gKiBiWzFdICsgYVs4XSAqIGJbMl07CisgIH0KKworICBmdW5jdGlvbiBjb252ZXJ0VG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgcmVzdWx0KSB7CisgICAgcmVzdWx0WzBdID0gTE1TWzBdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMF07CisgICAgcmVzdWx0WzFdID0gTE1TWzFdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMV07CisgICAgcmVzdWx0WzJdID0gTE1TWzJdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMl07CisgIH0KKworICBmdW5jdGlvbiBjb252ZXJ0VG9ENjUoc291cmNlV2hpdGVQb2ludCwgTE1TLCByZXN1bHQpIHsKKyAgICBjb25zdCBENjVYID0gMC45NTA0NzsKKyAgICBjb25zdCBENjVZID0gMTsKKyAgICBjb25zdCBENjVaID0gMS4wODg4MzsKKyAgICByZXN1bHRbMF0gPSBMTVNbMF0gKiBENjVYIC8gc291cmNlV2hpdGVQb2ludFswXTsKKyAgICByZXN1bHRbMV0gPSBMTVNbMV0gKiBENjVZIC8gc291cmNlV2hpdGVQb2ludFsxXTsKKyAgICByZXN1bHRbMl0gPSBMTVNbMl0gKiBENjVaIC8gc291cmNlV2hpdGVQb2ludFsyXTsKKyAgfQorCisgIGZ1bmN0aW9uIHNSR0JUcmFuc2ZlckZ1bmN0aW9uKGNvbG9yKSB7CisgICAgaWYgKGNvbG9yIDw9IDAuMDAzMTMwOCkgeworICAgICAgcmV0dXJuIGFkanVzdFRvUmFuZ2UoMCwgMSwgMTIuOTIgKiBjb2xvcik7CisgICAgfQorCisgICAgaWYgKGNvbG9yID49IDAuOTk1NTQ1MjUpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiBhZGp1c3RUb1JhbmdlKDAsIDEsICgxICsgMC4wNTUpICogY29sb3IgKiogKDEgLyAyLjQpIC0gMC4wNTUpOworICB9CisKKyAgZnVuY3Rpb24gYWRqdXN0VG9SYW5nZShtaW4sIG1heCwgdmFsdWUpIHsKKyAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVMKEwpIHsKKyAgICBpZiAoTCA8IDApIHsKKyAgICAgIHJldHVybiAtZGVjb2RlTCgtTCk7CisgICAgfQorCisgICAgaWYgKEwgPiA4LjApIHsKKyAgICAgIHJldHVybiAoKEwgKyAxNikgLyAxMTYpICoqIDM7CisgICAgfQorCisgICAgcmV0dXJuIEwgKiBERUNPREVfTF9DT05TVEFOVDsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbXBlbnNhdGVCbGFja1BvaW50KHNvdXJjZUJsYWNrUG9pbnQsIFhZWl9GbGF0LCByZXN1bHQpIHsKKyAgICBpZiAoc291cmNlQmxhY2tQb2ludFswXSA9PT0gMCAmJiBzb3VyY2VCbGFja1BvaW50WzFdID09PSAwICYmIHNvdXJjZUJsYWNrUG9pbnRbMl0gPT09IDApIHsKKyAgICAgIHJlc3VsdFswXSA9IFhZWl9GbGF0WzBdOworICAgICAgcmVzdWx0WzFdID0gWFlaX0ZsYXRbMV07CisgICAgICByZXN1bHRbMl0gPSBYWVpfRmxhdFsyXTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB6ZXJvRGVjb2RlTCA9IGRlY29kZUwoMCk7CisgICAgY29uc3QgWF9EU1QgPSB6ZXJvRGVjb2RlTDsKKyAgICBjb25zdCBYX1NSQyA9IGRlY29kZUwoc291cmNlQmxhY2tQb2ludFswXSk7CisgICAgY29uc3QgWV9EU1QgPSB6ZXJvRGVjb2RlTDsKKyAgICBjb25zdCBZX1NSQyA9IGRlY29kZUwoc291cmNlQmxhY2tQb2ludFsxXSk7CisgICAgY29uc3QgWl9EU1QgPSB6ZXJvRGVjb2RlTDsKKyAgICBjb25zdCBaX1NSQyA9IGRlY29kZUwoc291cmNlQmxhY2tQb2ludFsyXSk7CisgICAgY29uc3QgWF9TY2FsZSA9ICgxIC0gWF9EU1QpIC8gKDEgLSBYX1NSQyk7CisgICAgY29uc3QgWF9PZmZzZXQgPSAxIC0gWF9TY2FsZTsKKyAgICBjb25zdCBZX1NjYWxlID0gKDEgLSBZX0RTVCkgLyAoMSAtIFlfU1JDKTsKKyAgICBjb25zdCBZX09mZnNldCA9IDEgLSBZX1NjYWxlOworICAgIGNvbnN0IFpfU2NhbGUgPSAoMSAtIFpfRFNUKSAvICgxIC0gWl9TUkMpOworICAgIGNvbnN0IFpfT2Zmc2V0ID0gMSAtIFpfU2NhbGU7CisgICAgcmVzdWx0WzBdID0gWFlaX0ZsYXRbMF0gKiBYX1NjYWxlICsgWF9PZmZzZXQ7CisgICAgcmVzdWx0WzFdID0gWFlaX0ZsYXRbMV0gKiBZX1NjYWxlICsgWV9PZmZzZXQ7CisgICAgcmVzdWx0WzJdID0gWFlaX0ZsYXRbMl0gKiBaX1NjYWxlICsgWl9PZmZzZXQ7CisgIH0KKworICBmdW5jdGlvbiBub3JtYWxpemVXaGl0ZVBvaW50VG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIFhZWl9JbiwgcmVzdWx0KSB7CisgICAgaWYgKHNvdXJjZVdoaXRlUG9pbnRbMF0gPT09IDEgJiYgc291cmNlV2hpdGVQb2ludFsyXSA9PT0gMSkgeworICAgICAgcmVzdWx0WzBdID0gWFlaX0luWzBdOworICAgICAgcmVzdWx0WzFdID0gWFlaX0luWzFdOworICAgICAgcmVzdWx0WzJdID0gWFlaX0luWzJdOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IExNUyA9IHJlc3VsdDsKKyAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpOworICAgIGNvbnN0IExNU19GbGF0ID0gdGVtcE5vcm1hbGl6ZU1hdHJpeDsKKyAgICBjb252ZXJ0VG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgTE1TX0ZsYXQpOworICAgIG1hdHJpeFByb2R1Y3QoQlJBREZPUkRfU0NBTEVfSU5WRVJTRV9NQVRSSVgsIExNU19GbGF0LCByZXN1bHQpOworICB9CisKKyAgZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIFhZWl9JbiwgcmVzdWx0KSB7CisgICAgY29uc3QgTE1TID0gcmVzdWx0OworICAgIG1hdHJpeFByb2R1Y3QoQlJBREZPUkRfU0NBTEVfTUFUUklYLCBYWVpfSW4sIExNUyk7CisgICAgY29uc3QgTE1TX0Q2NSA9IHRlbXBOb3JtYWxpemVNYXRyaXg7CisgICAgY29udmVydFRvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgTE1TX0Q2NSk7CisgICAgbWF0cml4UHJvZHVjdChCUkFERk9SRF9TQ0FMRV9JTlZFUlNFX01BVFJJWCwgTE1TX0Q2NSwgcmVzdWx0KTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbnZlcnRUb1JnYihjcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKSB7CisgICAgY29uc3QgQSA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldF0gKiBzY2FsZSk7CisgICAgY29uc3QgQiA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldCArIDFdICogc2NhbGUpOworICAgIGNvbnN0IEMgPSBhZGp1c3RUb1JhbmdlKDAsIDEsIHNyY1tzcmNPZmZzZXQgKyAyXSAqIHNjYWxlKTsKKyAgICBjb25zdCBBR1IgPSBBID09PSAxID8gMSA6IEEgKiogY3MuR1I7CisgICAgY29uc3QgQkdHID0gQiA9PT0gMSA/IDEgOiBCICoqIGNzLkdHOworICAgIGNvbnN0IENHQiA9IEMgPT09IDEgPyAxIDogQyAqKiBjcy5HQjsKKyAgICBjb25zdCBYID0gY3MuTVhBICogQUdSICsgY3MuTVhCICogQkdHICsgY3MuTVhDICogQ0dCOworICAgIGNvbnN0IFkgPSBjcy5NWUEgKiBBR1IgKyBjcy5NWUIgKiBCR0cgKyBjcy5NWUMgKiBDR0I7CisgICAgY29uc3QgWiA9IGNzLk1aQSAqIEFHUiArIGNzLk1aQiAqIEJHRyArIGNzLk1aQyAqIENHQjsKKyAgICBjb25zdCBYWVogPSB0ZW1wQ29udmVydE1hdHJpeDE7CisgICAgWFlaWzBdID0gWDsKKyAgICBYWVpbMV0gPSBZOworICAgIFhZWlsyXSA9IFo7CisgICAgY29uc3QgWFlaX0ZsYXQgPSB0ZW1wQ29udmVydE1hdHJpeDI7CisgICAgbm9ybWFsaXplV2hpdGVQb2ludFRvRmxhdChjcy53aGl0ZVBvaW50LCBYWVosIFhZWl9GbGF0KTsKKyAgICBjb25zdCBYWVpfQmxhY2sgPSB0ZW1wQ29udmVydE1hdHJpeDE7CisgICAgY29tcGVuc2F0ZUJsYWNrUG9pbnQoY3MuYmxhY2tQb2ludCwgWFlaX0ZsYXQsIFhZWl9CbGFjayk7CisgICAgY29uc3QgWFlaX0Q2NSA9IHRlbXBDb252ZXJ0TWF0cml4MjsKKyAgICBub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUoRkxBVF9XSElURVBPSU5UX01BVFJJWCwgWFlaX0JsYWNrLCBYWVpfRDY1KTsKKyAgICBjb25zdCBTUkdCID0gdGVtcENvbnZlcnRNYXRyaXgxOworICAgIG1hdHJpeFByb2R1Y3QoU1JHQl9ENjVfWFlaX1RPX1JHQl9NQVRSSVgsIFhZWl9ENjUsIFNSR0IpOworICAgIGRlc3RbZGVzdE9mZnNldF0gPSBzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzBdKSAqIDI1NTsKKyAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHNSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMV0pICogMjU1OworICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlsyXSkgKiAyNTU7CisgIH0KKworICBjbGFzcyBDYWxSR0JDUyBleHRlbmRzIENvbG9yU3BhY2UgeworICAgIGNvbnN0cnVjdG9yKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hLCBtYXRyaXgpIHsKKyAgICAgIHN1cGVyKCJDYWxSR0IiLCAzKTsKKworICAgICAgaWYgKCF3aGl0ZVBvaW50KSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbFJHQiIpOworICAgICAgfQorCisgICAgICBibGFja1BvaW50ID0gYmxhY2tQb2ludCB8fCBuZXcgRmxvYXQzMkFycmF5KDMpOworICAgICAgZ2FtbWEgPSBnYW1tYSB8fCBuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxXSk7CisgICAgICBtYXRyaXggPSBtYXRyaXggfHwgbmV3IEZsb2F0MzJBcnJheShbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV0pOworICAgICAgY29uc3QgWFcgPSB3aGl0ZVBvaW50WzBdOworICAgICAgY29uc3QgWVcgPSB3aGl0ZVBvaW50WzFdOworICAgICAgY29uc3QgWlcgPSB3aGl0ZVBvaW50WzJdOworICAgICAgdGhpcy53aGl0ZVBvaW50ID0gd2hpdGVQb2ludDsKKyAgICAgIGNvbnN0IFhCID0gYmxhY2tQb2ludFswXTsKKyAgICAgIGNvbnN0IFlCID0gYmxhY2tQb2ludFsxXTsKKyAgICAgIGNvbnN0IFpCID0gYmxhY2tQb2ludFsyXTsKKyAgICAgIHRoaXMuYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQ7CisgICAgICB0aGlzLkdSID0gZ2FtbWFbMF07CisgICAgICB0aGlzLkdHID0gZ2FtbWFbMV07CisgICAgICB0aGlzLkdCID0gZ2FtbWFbMl07CisgICAgICB0aGlzLk1YQSA9IG1hdHJpeFswXTsKKyAgICAgIHRoaXMuTVlBID0gbWF0cml4WzFdOworICAgICAgdGhpcy5NWkEgPSBtYXRyaXhbMl07CisgICAgICB0aGlzLk1YQiA9IG1hdHJpeFszXTsKKyAgICAgIHRoaXMuTVlCID0gbWF0cml4WzRdOworICAgICAgdGhpcy5NWkIgPSBtYXRyaXhbNV07CisgICAgICB0aGlzLk1YQyA9IG1hdHJpeFs2XTsKKyAgICAgIHRoaXMuTVlDID0gbWF0cml4WzddOworICAgICAgdGhpcy5NWkMgPSBtYXRyaXhbOF07CisKKyAgICAgIGlmIChYVyA8IDAgfHwgWlcgPCAwIHx8IFlXICE9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMgZm9yICR7dGhpcy5uYW1lfWAgKyAiLCBubyBmYWxsYmFjayBhdmFpbGFibGUiKTsKKyAgICAgIH0KKworICAgICAgaWYgKFhCIDwgMCB8fCBZQiA8IDAgfHwgWkIgPCAwKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKShgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0gWyR7WEJ9LCAke1lCfSwgJHtaQn1dLCBgICsgImZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpOworICAgICAgICB0aGlzLmJsYWNrUG9pbnQgPSBuZXcgRmxvYXQzMkFycmF5KDMpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5HUiA8IDAgfHwgdGhpcy5HRyA8IDAgfHwgdGhpcy5HQiA8IDApIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKGBJbnZhbGlkIEdhbW1hIFske3RoaXMuR1J9LCAke3RoaXMuR0d9LCAke3RoaXMuR0J9XSBmb3IgYCArIGAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApOworICAgICAgICB0aGlzLkdSID0gdGhpcy5HRyA9IHRoaXMuR0IgPSAxOworICAgICAgfQorICAgIH0KKworICAgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CisgICAgfQorCisgICAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKTsKKyAgICAgICAgc3JjT2Zmc2V0ICs9IDM7CisgICAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CisgICAgICB9CisgICAgfQorCisgICAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpIC8gMyB8IDA7CisgICAgfQorCisgIH0KKworICByZXR1cm4gQ2FsUkdCQ1M7Cit9KCk7CisKK2NvbnN0IExhYkNTID0gZnVuY3Rpb24gTGFiQ1NDbG9zdXJlKCkgeworICBmdW5jdGlvbiBmbl9nKHgpIHsKKyAgICBsZXQgcmVzdWx0OworCisgICAgaWYgKHggPj0gNiAvIDI5KSB7CisgICAgICByZXN1bHQgPSB4ICogeCAqIHg7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IDEwOCAvIDg0MSAqICh4IC0gNCAvIDI5KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlKHZhbHVlLCBoaWdoMSwgbG93MiwgaGlnaDIpIHsKKyAgICByZXR1cm4gbG93MiArIHZhbHVlICogKGhpZ2gyIC0gbG93MikgLyBoaWdoMTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbnZlcnRUb1JnYihjcywgc3JjLCBzcmNPZmZzZXQsIG1heFZhbCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgIGxldCBMcyA9IHNyY1tzcmNPZmZzZXRdOworICAgIGxldCBhcyA9IHNyY1tzcmNPZmZzZXQgKyAxXTsKKyAgICBsZXQgYnMgPSBzcmNbc3JjT2Zmc2V0ICsgMl07CisKKyAgICBpZiAobWF4VmFsICE9PSBmYWxzZSkgeworICAgICAgTHMgPSBkZWNvZGUoTHMsIG1heFZhbCwgMCwgMTAwKTsKKyAgICAgIGFzID0gZGVjb2RlKGFzLCBtYXhWYWwsIGNzLmFtaW4sIGNzLmFtYXgpOworICAgICAgYnMgPSBkZWNvZGUoYnMsIG1heFZhbCwgY3MuYm1pbiwgY3MuYm1heCk7CisgICAgfQorCisgICAgaWYgKGFzID4gY3MuYW1heCkgeworICAgICAgYXMgPSBjcy5hbWF4OworICAgIH0gZWxzZSBpZiAoYXMgPCBjcy5hbWluKSB7CisgICAgICBhcyA9IGNzLmFtaW47CisgICAgfQorCisgICAgaWYgKGJzID4gY3MuYm1heCkgeworICAgICAgYnMgPSBjcy5ibWF4OworICAgIH0gZWxzZSBpZiAoYnMgPCBjcy5ibWluKSB7CisgICAgICBicyA9IGNzLmJtaW47CisgICAgfQorCisgICAgY29uc3QgTSA9IChMcyArIDE2KSAvIDExNjsKKyAgICBjb25zdCBMID0gTSArIGFzIC8gNTAwOworICAgIGNvbnN0IE4gPSBNIC0gYnMgLyAyMDA7CisgICAgY29uc3QgWCA9IGNzLlhXICogZm5fZyhMKTsKKyAgICBjb25zdCBZID0gY3MuWVcgKiBmbl9nKE0pOworICAgIGNvbnN0IFogPSBjcy5aVyAqIGZuX2coTik7CisgICAgbGV0IHIsIGcsIGI7CisKKyAgICBpZiAoY3MuWlcgPCAxKSB7CisgICAgICByID0gWCAqIDMuMTMzOSArIFkgKiAtMS42MTcgKyBaICogLTAuNDkwNjsKKyAgICAgIGcgPSBYICogLTAuOTc4NSArIFkgKiAxLjkxNiArIFogKiAwLjAzMzM7CisgICAgICBiID0gWCAqIDAuMDcyICsgWSAqIC0wLjIyOSArIFogKiAxLjQwNTc7CisgICAgfSBlbHNlIHsKKyAgICAgIHIgPSBYICogMy4yNDA2ICsgWSAqIC0xLjUzNzIgKyBaICogLTAuNDk4NjsKKyAgICAgIGcgPSBYICogLTAuOTY4OSArIFkgKiAxLjg3NTggKyBaICogMC4wNDE1OworICAgICAgYiA9IFggKiAwLjA1NTcgKyBZICogLTAuMjA0ICsgWiAqIDEuMDU3OworICAgIH0KKworICAgIGRlc3RbZGVzdE9mZnNldF0gPSBNYXRoLnNxcnQocikgKiAyNTU7CisgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBNYXRoLnNxcnQoZykgKiAyNTU7CisgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBNYXRoLnNxcnQoYikgKiAyNTU7CisgIH0KKworICBjbGFzcyBMYWJDUyBleHRlbmRzIENvbG9yU3BhY2UgeworICAgIGNvbnN0cnVjdG9yKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIHJhbmdlKSB7CisgICAgICBzdXBlcigiTGFiIiwgMyk7CisKKyAgICAgIGlmICghd2hpdGVQb2ludCkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBMYWIiKTsKKyAgICAgIH0KKworICAgICAgYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQgfHwgWzAsIDAsIDBdOworICAgICAgcmFuZ2UgPSByYW5nZSB8fCBbLTEwMCwgMTAwLCAtMTAwLCAxMDBdOworICAgICAgdGhpcy5YVyA9IHdoaXRlUG9pbnRbMF07CisgICAgICB0aGlzLllXID0gd2hpdGVQb2ludFsxXTsKKyAgICAgIHRoaXMuWlcgPSB3aGl0ZVBvaW50WzJdOworICAgICAgdGhpcy5hbWluID0gcmFuZ2VbMF07CisgICAgICB0aGlzLmFtYXggPSByYW5nZVsxXTsKKyAgICAgIHRoaXMuYm1pbiA9IHJhbmdlWzJdOworICAgICAgdGhpcy5ibWF4ID0gcmFuZ2VbM107CisgICAgICB0aGlzLlhCID0gYmxhY2tQb2ludFswXTsKKyAgICAgIHRoaXMuWUIgPSBibGFja1BvaW50WzFdOworICAgICAgdGhpcy5aQiA9IGJsYWNrUG9pbnRbMl07CisKKyAgICAgIGlmICh0aGlzLlhXIDwgMCB8fCB0aGlzLlpXIDwgMCB8fCB0aGlzLllXICE9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5YQiA8IDAgfHwgdGhpcy5ZQiA8IDAgfHwgdGhpcy5aQiA8IDApIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJJbnZhbGlkIEJsYWNrUG9pbnQsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0Iik7CisgICAgICAgIHRoaXMuWEIgPSB0aGlzLllCID0gdGhpcy5aQiA9IDA7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmFtaW4gPiB0aGlzLmFtYXggfHwgdGhpcy5ibWluID4gdGhpcy5ibWF4KSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW52YWxpZCBSYW5nZSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzIik7CisgICAgICAgIHRoaXMuYW1pbiA9IC0xMDA7CisgICAgICAgIHRoaXMuYW1heCA9IDEwMDsKKyAgICAgICAgdGhpcy5ibWluID0gLTEwMDsKKyAgICAgICAgdGhpcy5ibWF4ID0gMTAwOworICAgICAgfQorICAgIH0KKworICAgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZmFsc2UsIGRlc3QsIGRlc3RPZmZzZXQpOworICAgIH0KKworICAgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICAgIGNvbnN0IG1heFZhbCA9ICgxIDw8IGJpdHMpIC0gMTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KTsKKyAgICAgICAgc3JjT2Zmc2V0ICs9IDM7CisgICAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CisgICAgICB9CisgICAgfQorCisgICAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpIC8gMyB8IDA7CisgICAgfQorCisgICAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBnZXQgdXNlc1plcm9Ub09uZVJhbmdlKCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ1c2VzWmVyb1RvT25lUmFuZ2UiLCBmYWxzZSk7CisgICAgfQorCisgIH0KKworICByZXR1cm4gTGFiQ1M7Cit9KCk7CisKKy8qKiovIH0pLAorLyogMjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5HbG9iYWxJbWFnZUNhY2hlID0gZXhwb3J0cy5Mb2NhbEdTdGF0ZUNhY2hlID0gZXhwb3J0cy5Mb2NhbEZ1bmN0aW9uQ2FjaGUgPSBleHBvcnRzLkxvY2FsQ29sb3JTcGFjZUNhY2hlID0gZXhwb3J0cy5Mb2NhbEltYWdlQ2FjaGUgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK2NsYXNzIEJhc2VMb2NhbENhY2hlIHsKKyAgY29uc3RydWN0b3Iob3B0aW9ucykgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlTG9jYWxDYWNoZSkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUxvY2FsQ2FjaGUuIik7CisgICAgfQorCisgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm9ubHlSZWZzKSB7CisgICAgICB0aGlzLl9uYW1lUmVmTWFwID0gbmV3IE1hcCgpOworICAgICAgdGhpcy5faW1hZ2VNYXAgPSBuZXcgTWFwKCk7CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOworICB9CisKKyAgZ2V0QnlOYW1lKG5hbWUpIHsKKyAgICBjb25zdCByZWYgPSB0aGlzLl9uYW1lUmVmTWFwLmdldChuYW1lKTsKKworICAgIGlmIChyZWYpIHsKKyAgICAgIHJldHVybiB0aGlzLmdldEJ5UmVmKHJlZik7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX2ltYWdlTWFwLmdldChuYW1lKSB8fCBudWxsOworICB9CisKKyAgZ2V0QnlSZWYocmVmKSB7CisgICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZikgfHwgbnVsbDsKKyAgfQorCisgIHNldChuYW1lLCByZWYsIGRhdGEpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHNldGAgY2FsbGVkLiIpOworICB9CisKK30KKworY2xhc3MgTG9jYWxJbWFnZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgeworICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkgeworICAgIGlmICghbmFtZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEltYWdlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFyZ3VtZW50LicpOworICAgIH0KKworICAgIGlmIChyZWYpIHsKKyAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKKworICAgICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7CisgIH0KKworfQorCitleHBvcnRzLkxvY2FsSW1hZ2VDYWNoZSA9IExvY2FsSW1hZ2VDYWNoZTsKKworY2xhc3MgTG9jYWxDb2xvclNwYWNlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7CisgIHNldChuYW1lID0gbnVsbCwgcmVmID0gbnVsbCwgZGF0YSkgeworICAgIGlmICghbmFtZSAmJiAhcmVmKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7CisgICAgfQorCisgICAgaWYgKHJlZikgeworICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAobmFtZSkgeworICAgICAgICB0aGlzLl9uYW1lUmVmTWFwLnNldChuYW1lLCByZWYpOworICAgICAgfQorCisgICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTsKKyAgfQorCit9CisKK2V4cG9ydHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBMb2NhbENvbG9yU3BhY2VDYWNoZTsKKworY2xhc3MgTG9jYWxGdW5jdGlvbkNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgeworICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CisgICAgc3VwZXIoeworICAgICAgb25seVJlZnM6IHRydWUKKyAgICB9KTsKKyAgfQorCisgIGdldEJ5TmFtZShuYW1lKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGBnZXRCeU5hbWVgIG1ldGhvZC4iKTsKKyAgfQorCisgIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7CisgICAgaWYgKCFyZWYpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxGdW5jdGlvbkNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpOworICAgIH0KKworICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKKyAgfQorCit9CisKK2V4cG9ydHMuTG9jYWxGdW5jdGlvbkNhY2hlID0gTG9jYWxGdW5jdGlvbkNhY2hlOworCitjbGFzcyBMb2NhbEdTdGF0ZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgeworICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkgeworICAgIGlmICghbmFtZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEdTdGF0ZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhcmd1bWVudC4nKTsKKyAgICB9CisKKyAgICBpZiAocmVmKSB7CisgICAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CisKKyAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOworICB9CisKK30KKworZXhwb3J0cy5Mb2NhbEdTdGF0ZUNhY2hlID0gTG9jYWxHU3RhdGVDYWNoZTsKKworY2xhc3MgR2xvYmFsSW1hZ2VDYWNoZSB7CisgIHN0YXRpYyBnZXQgTlVNX1BBR0VTX1RIUkVTSE9MRCgpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIk5VTV9QQUdFU19USFJFU0hPTEQiLCAyKTsKKyAgfQorCisgIHN0YXRpYyBnZXQgTUFYX0lNQUdFU19UT19DQUNIRSgpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIk1BWF9JTUFHRVNfVE9fQ0FDSEUiLCAxMCk7CisgIH0KKworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLl9yZWZDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOworICAgIHRoaXMuX2ltYWdlQ2FjaGUgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKTsKKyAgfQorCisgIHNob3VsZENhY2hlKHJlZiwgcGFnZUluZGV4KSB7CisgICAgY29uc3QgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7CisKKyAgICBjb25zdCBudW1QYWdlcyA9IHBhZ2VJbmRleFNldCA/IHBhZ2VJbmRleFNldC5zaXplICsgKHBhZ2VJbmRleFNldC5oYXMocGFnZUluZGV4KSA/IDAgOiAxKSA6IDE7CisKKyAgICBpZiAobnVtUGFnZXMgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikgJiYgdGhpcy5faW1hZ2VDYWNoZS5zaXplID49IEdsb2JhbEltYWdlQ2FjaGUuTUFYX0lNQUdFU19UT19DQUNIRSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYWRkUGFnZUluZGV4KHJlZiwgcGFnZUluZGV4KSB7CisgICAgbGV0IHBhZ2VJbmRleFNldCA9IHRoaXMuX3JlZkNhY2hlLmdldChyZWYpOworCisgICAgaWYgKCFwYWdlSW5kZXhTZXQpIHsKKyAgICAgIHBhZ2VJbmRleFNldCA9IG5ldyBTZXQoKTsKKworICAgICAgdGhpcy5fcmVmQ2FjaGUucHV0KHJlZiwgcGFnZUluZGV4U2V0KTsKKyAgICB9CisKKyAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7CisgIH0KKworICBnZXREYXRhKHJlZiwgcGFnZUluZGV4KSB7CisgICAgY29uc3QgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7CisKKyAgICBpZiAoIXBhZ2VJbmRleFNldCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaWYgKHBhZ2VJbmRleFNldC5zaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHBhZ2VJbmRleFNldC5hZGQocGFnZUluZGV4KTsKKyAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKTsKKyAgfQorCisgIHNldERhdGEocmVmLCBkYXRhKSB7CisgICAgaWYgKCF0aGlzLl9yZWZDYWNoZS5oYXMocmVmKSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBleHBlY3RlZCAiYWRkUGFnZUluZGV4IiB0byBoYXZlIGJlZW4gY2FsbGVkLicpOworICAgIH0KKworICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA+PSBHbG9iYWxJbWFnZUNhY2hlLk1BWF9JTUFHRVNfVE9fQ0FDSEUpIHsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gaWdub3JpbmcgaW1hZ2UgYWJvdmUgTUFYX0lNQUdFU19UT19DQUNIRS4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOworICB9CisKKyAgY2xlYXIob25seURhdGEgPSBmYWxzZSkgeworICAgIGlmICghb25seURhdGEpIHsKKyAgICAgIHRoaXMuX3JlZkNhY2hlLmNsZWFyKCk7CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VDYWNoZS5jbGVhcigpOworICB9CisKK30KKworZXhwb3J0cy5HbG9iYWxJbWFnZUNhY2hlID0gR2xvYmFsSW1hZ2VDYWNoZTsKKworLyoqKi8gfSksCisvKiAyNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldFF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzOworZXhwb3J0cy5NYXJrdXBBbm5vdGF0aW9uID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmFjdG9yeSA9IGV4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlID0gZXhwb3J0cy5Bbm5vdGF0aW9uID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX29iaiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2NvbG9yc3BhY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKwordmFyIF9vcGVyYXRvcl9saXN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNik7CisKK3ZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7CisKK3ZhciBfd3JpdGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyNyk7CisKK2NsYXNzIEFubm90YXRpb25GYWN0b3J5IHsKKyAgc3RhdGljIGNyZWF0ZSh4cmVmLCByZWYsIHBkZk1hbmFnZXIsIGlkRmFjdG9yeSkgeworICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIikudGhlbihhY3JvRm9ybSA9PiB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmUodGhpcywgIl9jcmVhdGUiLCBbeHJlZiwgcmVmLCBwZGZNYW5hZ2VyLCBpZEZhY3RvcnksIGFjcm9Gb3JtXSk7CisgICAgfSk7CisgIH0KKworICBzdGF0aWMgX2NyZWF0ZSh4cmVmLCByZWYsIHBkZk1hbmFnZXIsIGlkRmFjdG9yeSwgYWNyb0Zvcm0pIHsKKyAgICBjb25zdCBkaWN0ID0geHJlZi5mZXRjaElmUmVmKHJlZik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QpKSB7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIGNvbnN0IGlkID0gKDAsIF9wcmltaXRpdmVzLmlzUmVmKShyZWYpID8gcmVmLnRvU3RyaW5nKCkgOiBgYW5ub3RfJHtpZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gOworICAgIGxldCBzdWJ0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKKyAgICBzdWJ0eXBlID0gKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoc3VidHlwZSkgPyBzdWJ0eXBlLm5hbWUgOiBudWxsOworICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7CisgICAgICB4cmVmLAorICAgICAgcmVmLAorICAgICAgZGljdCwKKyAgICAgIHN1YnR5cGUsCisgICAgICBpZCwKKyAgICAgIHBkZk1hbmFnZXIsCisgICAgICBhY3JvRm9ybTogYWNyb0Zvcm0gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0ID8gYWNyb0Zvcm0gOiBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5CisgICAgfTsKKworICAgIHN3aXRjaCAoc3VidHlwZSkgeworICAgICAgY2FzZSAiTGluayI6CisgICAgICAgIHJldHVybiBuZXcgTGlua0Fubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgIlRleHQiOgorICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJXaWRnZXQiOgorICAgICAgICBsZXQgZmllbGRUeXBlID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgICAgICBkaWN0LAorICAgICAgICAgIGtleTogIkZUIgorICAgICAgICB9KTsKKyAgICAgICAgZmllbGRUeXBlID0gKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmllbGRUeXBlKSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKKworICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgIGNhc2UgIlR4IjoKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgICBjYXNlICJCdG4iOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25XaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICAgICAgY2FzZSAiQ2giOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCdVbmltcGxlbWVudGVkIHdpZGdldCBmaWVsZCB0eXBlICInICsgZmllbGRUeXBlICsgJyIsICcgKyAiZmFsbGluZyBiYWNrIHRvIGJhc2UgZmllbGQgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJQb3B1cCI6CisgICAgICAgIHJldHVybiBuZXcgUG9wdXBBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJGcmVlVGV4dCI6CisgICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJMaW5lIjoKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiU3F1YXJlIjoKKyAgICAgICAgcmV0dXJuIG5ldyBTcXVhcmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJDaXJjbGUiOgorICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgIlBvbHlMaW5lIjoKKyAgICAgICAgcmV0dXJuIG5ldyBQb2x5bGluZUFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgIlBvbHlnb24iOgorICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJDYXJldCI6CisgICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJJbmsiOgorICAgICAgICByZXR1cm4gbmV3IElua0Fubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgIkhpZ2hsaWdodCI6CisgICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiVW5kZXJsaW5lIjoKKyAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJTcXVpZ2dseSI6CisgICAgICAgIHJldHVybiBuZXcgU3F1aWdnbHlBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJTdHJpa2VPdXQiOgorICAgICAgICByZXR1cm4gbmV3IFN0cmlrZU91dEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgIlN0YW1wIjoKKyAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgIkZpbGVBdHRhY2htZW50IjoKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlQXR0YWNobWVudEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICghc3VidHlwZSkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQW5ub3RhdGlvbiBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCAvU3VidHlwZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoJ1VuaW1wbGVtZW50ZWQgYW5ub3RhdGlvbiB0eXBlICInICsgc3VidHlwZSArICciLCAnICsgImZhbGxpbmcgYmFjayB0byBiYXNlIGFubm90YXRpb24uIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb24ocGFyYW1ldGVycyk7CisgICAgfQorICB9CisKK30KKworZXhwb3J0cy5Bbm5vdGF0aW9uRmFjdG9yeSA9IEFubm90YXRpb25GYWN0b3J5OworCitmdW5jdGlvbiBnZXRRdWFkUG9pbnRzKGRpY3QsIHJlY3QpIHsKKyAgaWYgKCFkaWN0LmhhcygiUXVhZFBvaW50cyIpKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBjb25zdCBxdWFkUG9pbnRzID0gZGljdC5nZXRBcnJheSgiUXVhZFBvaW50cyIpOworCisgIGlmICghQXJyYXkuaXNBcnJheShxdWFkUG9pbnRzKSB8fCBxdWFkUG9pbnRzLmxlbmd0aCAlIDggPiAwKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBjb25zdCBxdWFkUG9pbnRzTGlzdHMgPSBbXTsKKworICBmb3IgKGxldCBpID0gMCwgaWkgPSBxdWFkUG9pbnRzLmxlbmd0aCAvIDg7IGkgPCBpaTsgaSsrKSB7CisgICAgcXVhZFBvaW50c0xpc3RzLnB1c2goW10pOworCisgICAgZm9yIChsZXQgaiA9IGkgKiA4LCBqaiA9IGkgKiA4ICsgODsgaiA8IGpqOyBqICs9IDIpIHsKKyAgICAgIGNvbnN0IHggPSBxdWFkUG9pbnRzW2pdOworICAgICAgY29uc3QgeSA9IHF1YWRQb2ludHNbaiArIDFdOworCisgICAgICBpZiAoeCA8IHJlY3RbMF0gfHwgeCA+IHJlY3RbMl0gfHwgeSA8IHJlY3RbMV0gfHwgeSA+IHJlY3RbM10pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHF1YWRQb2ludHNMaXN0c1tpXS5wdXNoKHsKKyAgICAgICAgeCwKKyAgICAgICAgeQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHF1YWRQb2ludHNMaXN0czsKK30KKworZnVuY3Rpb24gZ2V0VHJhbnNmb3JtTWF0cml4KHJlY3QsIGJib3gsIG1hdHJpeCkgeworICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBfdXRpbC5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KGJib3gsIG1hdHJpeCk7CisKKyAgaWYgKG1pblggPT09IG1heFggfHwgbWluWSA9PT0gbWF4WSkgeworICAgIHJldHVybiBbMSwgMCwgMCwgMSwgcmVjdFswXSwgcmVjdFsxXV07CisgIH0KKworICBjb25zdCB4UmF0aW8gPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gKG1heFggLSBtaW5YKTsKKyAgY29uc3QgeVJhdGlvID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIChtYXhZIC0gbWluWSk7CisgIHJldHVybiBbeFJhdGlvLCAwLCAwLCB5UmF0aW8sIHJlY3RbMF0gLSBtaW5YICogeFJhdGlvLCByZWN0WzFdIC0gbWluWSAqIHlSYXRpb107Cit9CisKK2NsYXNzIEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKKyAgICBjb25zdCBkaWN0ID0gcGFyYW1zLmRpY3Q7CisgICAgdGhpcy5zZXRDb250ZW50cyhkaWN0LmdldCgiQ29udGVudHMiKSk7CisgICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKGRpY3QuZ2V0KCJNIikpOworICAgIHRoaXMuc2V0RmxhZ3MoZGljdC5nZXQoIkYiKSk7CisgICAgdGhpcy5zZXRSZWN0YW5nbGUoZGljdC5nZXRBcnJheSgiUmVjdCIpKTsKKyAgICB0aGlzLnNldENvbG9yKGRpY3QuZ2V0QXJyYXkoIkMiKSk7CisgICAgdGhpcy5zZXRCb3JkZXJTdHlsZShkaWN0KTsKKyAgICB0aGlzLnNldEFwcGVhcmFuY2UoZGljdCk7CisgICAgdGhpcy5kYXRhID0geworICAgICAgYW5ub3RhdGlvbkZsYWdzOiB0aGlzLmZsYWdzLAorICAgICAgYm9yZGVyU3R5bGU6IHRoaXMuYm9yZGVyU3R5bGUsCisgICAgICBjb2xvcjogdGhpcy5jb2xvciwKKyAgICAgIGNvbnRlbnRzOiB0aGlzLmNvbnRlbnRzLAorICAgICAgaGFzQXBwZWFyYW5jZTogISF0aGlzLmFwcGVhcmFuY2UsCisgICAgICBpZDogcGFyYW1zLmlkLAorICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogdGhpcy5tb2RpZmljYXRpb25EYXRlLAorICAgICAgcmVjdDogdGhpcy5yZWN0YW5nbGUsCisgICAgICBzdWJ0eXBlOiBwYXJhbXMuc3VidHlwZQorICAgIH07CisgIH0KKworICBfaGFzRmxhZyhmbGFncywgZmxhZykgeworICAgIHJldHVybiAhIShmbGFncyAmIGZsYWcpOworICB9CisKKyAgX2lzVmlld2FibGUoZmxhZ3MpIHsKKyAgICByZXR1cm4gIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIF91dGlsLkFubm90YXRpb25GbGFnLklOVklTSUJMRSkgJiYgIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIF91dGlsLkFubm90YXRpb25GbGFnLkhJRERFTikgJiYgIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIF91dGlsLkFubm90YXRpb25GbGFnLk5PVklFVyk7CisgIH0KKworICBfaXNQcmludGFibGUoZmxhZ3MpIHsKKyAgICByZXR1cm4gdGhpcy5faGFzRmxhZyhmbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuUFJJTlQpICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5ISURERU4pOworICB9CisKKyAgZ2V0IHZpZXdhYmxlKCkgeworICAgIGlmICh0aGlzLmZsYWdzID09PSAwKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKTsKKyAgfQorCisgIGdldCBwcmludGFibGUoKSB7CisgICAgaWYgKHRoaXMuZmxhZ3MgPT09IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5faXNQcmludGFibGUodGhpcy5mbGFncyk7CisgIH0KKworICBzZXRDb250ZW50cyhjb250ZW50cykgeworICAgIHRoaXMuY29udGVudHMgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGNvbnRlbnRzIHx8ICIiKTsKKyAgfQorCisgIHNldE1vZGlmaWNhdGlvbkRhdGUobW9kaWZpY2F0aW9uRGF0ZSkgeworICAgIHRoaXMubW9kaWZpY2F0aW9uRGF0ZSA9ICgwLCBfdXRpbC5pc1N0cmluZykobW9kaWZpY2F0aW9uRGF0ZSkgPyBtb2RpZmljYXRpb25EYXRlIDogbnVsbDsKKyAgfQorCisgIHNldEZsYWdzKGZsYWdzKSB7CisgICAgdGhpcy5mbGFncyA9IE51bWJlci5pc0ludGVnZXIoZmxhZ3MpICYmIGZsYWdzID4gMCA/IGZsYWdzIDogMDsKKyAgfQorCisgIGhhc0ZsYWcoZmxhZykgeworICAgIHJldHVybiB0aGlzLl9oYXNGbGFnKHRoaXMuZmxhZ3MsIGZsYWcpOworICB9CisKKyAgc2V0UmVjdGFuZ2xlKHJlY3RhbmdsZSkgeworICAgIGlmIChBcnJheS5pc0FycmF5KHJlY3RhbmdsZSkgJiYgcmVjdGFuZ2xlLmxlbmd0aCA9PT0gNCkgeworICAgICAgdGhpcy5yZWN0YW5nbGUgPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QocmVjdGFuZ2xlKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5yZWN0YW5nbGUgPSBbMCwgMCwgMCwgMF07CisgICAgfQorICB9CisKKyAgc2V0Q29sb3IoY29sb3IpIHsKKyAgICBjb25zdCByZ2JDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKKworICAgIGlmICghQXJyYXkuaXNBcnJheShjb2xvcikpIHsKKyAgICAgIHRoaXMuY29sb3IgPSByZ2JDb2xvcjsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvbG9yLmxlbmd0aCkgeworICAgICAgY2FzZSAwOgorICAgICAgICB0aGlzLmNvbG9yID0gbnVsbDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOworCisgICAgICAgIHRoaXMuY29sb3IgPSByZ2JDb2xvcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2JJdGVtKGNvbG9yLCAwLCByZ2JDb2xvciwgMCk7CisKKyAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0OgorICAgICAgICBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2JJdGVtKGNvbG9yLCAwLCByZ2JDb2xvciwgMCk7CisKKyAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBzZXRCb3JkZXJTdHlsZShib3JkZXJTdHlsZSkgeworICAgIHRoaXMuYm9yZGVyU3R5bGUgPSBuZXcgQW5ub3RhdGlvbkJvcmRlclN0eWxlKCk7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGJvcmRlclN0eWxlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChib3JkZXJTdHlsZS5oYXMoIkJTIikpIHsKKyAgICAgIGNvbnN0IGRpY3QgPSBib3JkZXJTdHlsZS5nZXQoIkJTIik7CisgICAgICBjb25zdCBkaWN0VHlwZSA9IGRpY3QuZ2V0KCJUeXBlIik7CisKKyAgICAgIGlmICghZGljdFR5cGUgfHwgKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZGljdFR5cGUsICJCb3JkZXIiKSkgeworICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGRpY3QuZ2V0KCJXIiksIHRoaXMucmVjdGFuZ2xlKTsKKyAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRTdHlsZShkaWN0LmdldCgiUyIpKTsKKyAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoZGljdC5nZXRBcnJheSgiRCIpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJvcmRlclN0eWxlLmhhcygiQm9yZGVyIikpIHsKKyAgICAgIGNvbnN0IGFycmF5ID0gYm9yZGVyU3R5bGUuZ2V0QXJyYXkoIkJvcmRlciIpOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheSkgJiYgYXJyYXkubGVuZ3RoID49IDMpIHsKKyAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKGFycmF5WzBdKTsKKyAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRWZXJ0aWNhbENvcm5lclJhZGl1cyhhcnJheVsxXSk7CisgICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgoYXJyYXlbMl0sIHRoaXMucmVjdGFuZ2xlKTsKKworICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSA0KSB7CisgICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoYXJyYXlbM10pOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgoMCk7CisgICAgfQorICB9CisKKyAgc2V0QXBwZWFyYW5jZShkaWN0KSB7CisgICAgdGhpcy5hcHBlYXJhbmNlID0gbnVsbDsKKyAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gZGljdC5nZXQoIkFQIik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGFwcGVhcmFuY2VTdGF0ZXMpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZVN0YXRlID0gYXBwZWFyYW5jZVN0YXRlcy5nZXQoIk4iKTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSkpIHsKKyAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBhcyA9IGRpY3QuZ2V0KCJBUyIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShhcykgfHwgIW5vcm1hbEFwcGVhcmFuY2VTdGF0ZS5oYXMoYXMubmFtZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGUuZ2V0KGFzLm5hbWUpOworICB9CisKKyAgbG9hZFJlc291cmNlcyhrZXlzKSB7CisgICAgcmV0dXJuIHRoaXMuYXBwZWFyYW5jZS5kaWN0LmdldEFzeW5jKCJSZXNvdXJjZXMiKS50aGVuKHJlc291cmNlcyA9PiB7CisgICAgICBpZiAoIXJlc291cmNlcykgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICBjb25zdCBvYmplY3RMb2FkZXIgPSBuZXcgX29iai5PYmplY3RMb2FkZXIocmVzb3VyY2VzLCBrZXlzLCByZXNvdXJjZXMueHJlZik7CisgICAgICByZXR1cm4gb2JqZWN0TG9hZGVyLmxvYWQoKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlczsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpKTsKKyAgICB9CisKKyAgICBjb25zdCBhcHBlYXJhbmNlID0gdGhpcy5hcHBlYXJhbmNlOworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgY29uc3QgYXBwZWFyYW5jZURpY3QgPSBhcHBlYXJhbmNlLmRpY3Q7CisgICAgY29uc3QgcmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJDb2xvclNwYWNlIiwgIlBhdHRlcm4iLCAiU2hhZGluZyIsICJYT2JqZWN0IiwgIkZvbnQiXSk7CisgICAgY29uc3QgYmJveCA9IGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJCQm94IikgfHwgWzAsIDAsIDEsIDFdOworICAgIGNvbnN0IG1hdHJpeCA9IGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJNYXRyaXgiKSB8fCBbMSwgMCwgMCwgMSwgMCwgMF07CisgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0VHJhbnNmb3JtTWF0cml4KGRhdGEucmVjdCwgYmJveCwgbWF0cml4KTsKKyAgICByZXR1cm4gcmVzb3VyY2VzUHJvbWlzZS50aGVuKHJlc291cmNlcyA9PiB7CisgICAgICBjb25zdCBvcExpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CisgICAgICBvcExpc3QuYWRkT3AoX3V0aWwuT1BTLmJlZ2luQW5ub3RhdGlvbiwgW2RhdGEucmVjdCwgdHJhbnNmb3JtLCBtYXRyaXhdKTsKKyAgICAgIHJldHVybiBldmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgc3RyZWFtOiBhcHBlYXJhbmNlLAorICAgICAgICB0YXNrLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIG9wZXJhdG9yTGlzdDogb3BMaXN0CisgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgb3BMaXN0LmFkZE9wKF91dGlsLk9QUy5lbmRBbm5vdGF0aW9uLCBbXSk7CisgICAgICAgIGFwcGVhcmFuY2UucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIG9wTGlzdDsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgYXN5bmMgc2F2ZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworfQorCitleHBvcnRzLkFubm90YXRpb24gPSBBbm5vdGF0aW9uOworCitjbGFzcyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLndpZHRoID0gMTsKKyAgICB0aGlzLnN0eWxlID0gX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDsKKyAgICB0aGlzLmRhc2hBcnJheSA9IFszXTsKKyAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSAwOworICAgIHRoaXMudmVydGljYWxDb3JuZXJSYWRpdXMgPSAwOworICB9CisKKyAgc2V0V2lkdGgod2lkdGgsIHJlY3QgPSBbMCwgMCwgMCwgMF0pIHsKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkod2lkdGgpKSB7CisgICAgICB0aGlzLndpZHRoID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih3aWR0aCkpIHsKKyAgICAgIGlmICh3aWR0aCA+IDApIHsKKyAgICAgICAgY29uc3QgbWF4V2lkdGggPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gMjsKKyAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7CisKKyAgICAgICAgaWYgKG1heFdpZHRoID4gMCAmJiBtYXhIZWlnaHQgPiAwICYmICh3aWR0aCA+IG1heFdpZHRoIHx8IHdpZHRoID4gbWF4SGVpZ2h0KSkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICR7d2lkdGh9YCk7CisgICAgICAgICAgd2lkdGggPSAxOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKyAgICB9CisgIH0KKworICBzZXRTdHlsZShzdHlsZSkgeworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoc3R5bGUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChzdHlsZS5uYW1lKSB7CisgICAgICBjYXNlICJTIjoKKyAgICAgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJEIjoKKyAgICAgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuREFTSEVEOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiQiI6CisgICAgICAgIHRoaXMuc3R5bGUgPSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJJIjoKKyAgICAgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJVIjoKKyAgICAgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgc2V0RGFzaEFycmF5KGRhc2hBcnJheSkgeworICAgIGlmIChBcnJheS5pc0FycmF5KGRhc2hBcnJheSkgJiYgZGFzaEFycmF5Lmxlbmd0aCA+IDApIHsKKyAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTsKKyAgICAgIGxldCBhbGxaZXJvcyA9IHRydWU7CisKKyAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkYXNoQXJyYXkpIHsKKyAgICAgICAgY29uc3QgdmFsaWROdW1iZXIgPSArZWxlbWVudCA+PSAwOworCisgICAgICAgIGlmICghdmFsaWROdW1iZXIpIHsKKyAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA+IDApIHsKKyAgICAgICAgICBhbGxaZXJvcyA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChpc1ZhbGlkICYmICFhbGxaZXJvcykgeworICAgICAgICB0aGlzLmRhc2hBcnJheSA9IGRhc2hBcnJheTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMud2lkdGggPSAwOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGFzaEFycmF5KSB7CisgICAgICB0aGlzLndpZHRoID0gMDsKKyAgICB9CisgIH0KKworICBzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHJhZGl1cykgeworICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHJhZGl1cykpIHsKKyAgICAgIHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cyA9IHJhZGl1czsKKyAgICB9CisgIH0KKworICBzZXRWZXJ0aWNhbENvcm5lclJhZGl1cyhyYWRpdXMpIHsKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihyYWRpdXMpKSB7CisgICAgICB0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzID0gcmFkaXVzOworICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlOworCitjbGFzcyBNYXJrdXBBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICBjb25zdCBkaWN0ID0gcGFyYW1ldGVycy5kaWN0OworCisgICAgaWYgKGRpY3QuaGFzKCJJUlQiKSkgeworICAgICAgY29uc3QgcmF3SVJUID0gZGljdC5nZXRSYXcoIklSVCIpOworICAgICAgdGhpcy5kYXRhLmluUmVwbHlUbyA9ICgwLCBfcHJpbWl0aXZlcy5pc1JlZikocmF3SVJUKSA/IHJhd0lSVC50b1N0cmluZygpIDogbnVsbDsKKyAgICAgIGNvbnN0IHJ0ID0gZGljdC5nZXQoIlJUIik7CisgICAgICB0aGlzLmRhdGEucmVwbHlUeXBlID0gKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkocnQpID8gcnQubmFtZSA6IF91dGlsLkFubm90YXRpb25SZXBseVR5cGUuUkVQTFk7CisgICAgfQorCisgICAgaWYgKHRoaXMuZGF0YS5yZXBseVR5cGUgPT09IF91dGlsLkFubm90YXRpb25SZXBseVR5cGUuR1JPVVApIHsKKyAgICAgIGNvbnN0IHBhcmVudCA9IGRpY3QuZ2V0KCJJUlQiKTsKKyAgICAgIHRoaXMuZGF0YS50aXRsZSA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykocGFyZW50LmdldCgiVCIpIHx8ICIiKTsKKyAgICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50LmdldCgiQ29udGVudHMiKSk7CisgICAgICB0aGlzLmRhdGEuY29udGVudHMgPSB0aGlzLmNvbnRlbnRzOworCisgICAgICBpZiAoIXBhcmVudC5oYXMoIkNyZWF0aW9uRGF0ZSIpKSB7CisgICAgICAgIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGUgPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUocGFyZW50LmdldCgiQ3JlYXRpb25EYXRlIikpOworICAgICAgICB0aGlzLmRhdGEuY3JlYXRpb25EYXRlID0gdGhpcy5jcmVhdGlvbkRhdGU7CisgICAgICB9CisKKyAgICAgIGlmICghcGFyZW50LmhhcygiTSIpKSB7CisgICAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShwYXJlbnQuZ2V0KCJNIikpOworICAgICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMubW9kaWZpY2F0aW9uRGF0ZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5kYXRhLmhhc1BvcHVwID0gcGFyZW50LmhhcygiUG9wdXAiKTsKKworICAgICAgaWYgKCFwYXJlbnQuaGFzKCJDIikpIHsKKyAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50LmdldEFycmF5KCJDIikpOworICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSB0aGlzLmNvbG9yOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmRhdGEudGl0bGUgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRpY3QuZ2V0KCJUIikgfHwgIiIpOworICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUoZGljdC5nZXQoIkNyZWF0aW9uRGF0ZSIpKTsKKyAgICAgIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGUgPSB0aGlzLmNyZWF0aW9uRGF0ZTsKKyAgICAgIHRoaXMuZGF0YS5oYXNQb3B1cCA9IGRpY3QuaGFzKCJQb3B1cCIpOworCisgICAgICBpZiAoIWRpY3QuaGFzKCJDIikpIHsKKyAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzZXRDcmVhdGlvbkRhdGUoY3JlYXRpb25EYXRlKSB7CisgICAgdGhpcy5jcmVhdGlvbkRhdGUgPSAoMCwgX3V0aWwuaXNTdHJpbmcpKGNyZWF0aW9uRGF0ZSkgPyBjcmVhdGlvbkRhdGUgOiBudWxsOworICB9CisKK30KKworZXhwb3J0cy5NYXJrdXBBbm5vdGF0aW9uID0gTWFya3VwQW5ub3RhdGlvbjsKKworY2xhc3MgV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKKyAgICBzdXBlcihwYXJhbXMpOworICAgIGNvbnN0IGRpY3QgPSBwYXJhbXMuZGljdDsKKyAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOworICAgIHRoaXMucmVmID0gcGFyYW1zLnJlZjsKKyAgICBkYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUOworICAgIGRhdGEuZmllbGROYW1lID0gdGhpcy5fY29uc3RydWN0RmllbGROYW1lKGRpY3QpOworICAgIGNvbnN0IGZpZWxkVmFsdWUgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgZGljdCwKKyAgICAgIGtleTogIlYiLAorICAgICAgZ2V0QXJyYXk6IHRydWUKKyAgICB9KTsKKyAgICBkYXRhLmZpZWxkVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoZmllbGRWYWx1ZSk7CisgICAgZGF0YS5hbHRlcm5hdGl2ZVRleHQgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRpY3QuZ2V0KCJUVSIpIHx8ICIiKTsKKyAgICBkYXRhLmRlZmF1bHRBcHBlYXJhbmNlID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3QsCisgICAgICBrZXk6ICJEQSIKKyAgICB9KSB8fCBwYXJhbXMuYWNyb0Zvcm0uZ2V0KCJEQSIpIHx8ICIiOworICAgIGNvbnN0IGZpZWxkVHlwZSA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0LAorICAgICAga2V5OiAiRlQiCisgICAgfSk7CisgICAgZGF0YS5maWVsZFR5cGUgPSAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmaWVsZFR5cGUpID8gZmllbGRUeXBlLm5hbWUgOiBudWxsOworICAgIHRoaXMuZmllbGRSZXNvdXJjZXMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgZGljdCwKKyAgICAgIGtleTogIkRSIgorICAgIH0pIHx8IHBhcmFtcy5hY3JvRm9ybS5nZXQoIkRSIikgfHwgX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKKyAgICBkYXRhLmZpZWxkRmxhZ3MgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgZGljdCwKKyAgICAgIGtleTogIkZmIgorICAgIH0pOworCisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRhdGEuZmllbGRGbGFncykgfHwgZGF0YS5maWVsZEZsYWdzIDwgMCkgeworICAgICAgZGF0YS5maWVsZEZsYWdzID0gMDsKKyAgICB9CisKKyAgICBkYXRhLnJlYWRPbmx5ID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5SRUFET05MWSk7CisKKyAgICBpZiAoZGF0YS5maWVsZFR5cGUgPT09ICJTaWciKSB7CisgICAgICBkYXRhLmZpZWxkVmFsdWUgPSBudWxsOworICAgICAgdGhpcy5zZXRGbGFncyhfdXRpbC5Bbm5vdGF0aW9uRmxhZy5ISURERU4pOworICAgIH0KKyAgfQorCisgIF9jb25zdHJ1Y3RGaWVsZE5hbWUoZGljdCkgeworICAgIGlmICghZGljdC5oYXMoIlQiKSAmJiAhZGljdC5oYXMoIlBhcmVudCIpKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIlVua25vd24gZmllbGQgbmFtZSwgZmFsbGluZyBiYWNrIHRvIGVtcHR5IGZpZWxkIG5hbWUuIik7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgaWYgKCFkaWN0LmhhcygiUGFyZW50IikpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRpY3QuZ2V0KCJUIikpOworICAgIH0KKworICAgIGNvbnN0IGZpZWxkTmFtZSA9IFtdOworCisgICAgaWYgKGRpY3QuaGFzKCJUIikpIHsKKyAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZGljdC5nZXQoIlQiKSkpOworICAgIH0KKworICAgIGxldCBsb29wRGljdCA9IGRpY3Q7CisKKyAgICB3aGlsZSAobG9vcERpY3QuaGFzKCJQYXJlbnQiKSkgeworICAgICAgbG9vcERpY3QgPSBsb29wRGljdC5nZXQoIlBhcmVudCIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGxvb3BEaWN0KSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGxvb3BEaWN0LmhhcygiVCIpKSB7CisgICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykobG9vcERpY3QuZ2V0KCJUIikpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmllbGROYW1lLmpvaW4oIi4iKTsKKyAgfQorCisgIF9kZWNvZGVGb3JtVmFsdWUoZm9ybVZhbHVlKSB7CisgICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlKSkgeworICAgICAgcmV0dXJuIGZvcm1WYWx1ZS5maWx0ZXIoaXRlbSA9PiAoMCwgX3V0aWwuaXNTdHJpbmcpKGl0ZW0pKS5tYXAoaXRlbSA9PiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGl0ZW0pKTsKKyAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZvcm1WYWx1ZSkpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGZvcm1WYWx1ZS5uYW1lKTsKKyAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykoZm9ybVZhbHVlKSkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZm9ybVZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGhhc0ZpZWxkRmxhZyhmbGFnKSB7CisgICAgcmV0dXJuICEhKHRoaXMuZGF0YS5maWVsZEZsYWdzICYgZmxhZyk7CisgIH0KKworICBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICBpZiAocmVuZGVyRm9ybXMpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpKTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2hhc1RleHQpIHsKKyAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLl9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpLnRoZW4oY29udGVudCA9PiB7CisgICAgICBpZiAodGhpcy5hcHBlYXJhbmNlICYmIGNvbnRlbnQgPT09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKKworICAgICAgaWYgKCF0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2UgfHwgY29udGVudCA9PT0gbnVsbCkgeworICAgICAgICByZXR1cm4gb3BlcmF0b3JMaXN0OworICAgICAgfQorCisgICAgICBjb25zdCBtYXRyaXggPSBbMSwgMCwgMCwgMSwgMCwgMF07CisgICAgICBjb25zdCBiYm94ID0gWzAsIDAsIHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF0sIHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV1dOworICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0VHJhbnNmb3JtTWF0cml4KHRoaXMuZGF0YS5yZWN0LCBiYm94LCBtYXRyaXgpOworICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5iZWdpbkFubm90YXRpb24sIFt0aGlzLmRhdGEucmVjdCwgdHJhbnNmb3JtLCBtYXRyaXhdKTsKKyAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShjb250ZW50KTsKKyAgICAgIHJldHVybiBldmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgc3RyZWFtLAorICAgICAgICB0YXNrLAorICAgICAgICByZXNvdXJjZXM6IHRoaXMuZmllbGRSZXNvdXJjZXMsCisgICAgICAgIG9wZXJhdG9yTGlzdAorICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuZW5kQW5ub3RhdGlvbiwgW10pOworICAgICAgICByZXR1cm4gb3BlcmF0b3JMaXN0OworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICBpZiAodGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF0pIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGxldCBhcHBlYXJhbmNlID0gYXdhaXQgdGhpcy5fZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKworICAgIGlmIChhcHBlYXJhbmNlID09PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCBiYm94ID0gWzAsIDAsIHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF0sIHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV1dOworICAgIGNvbnN0IG5ld1JlZiA9IGV2YWx1YXRvci54cmVmLmdldE5ld1JlZigpOworICAgIGNvbnN0IEFQID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoZXZhbHVhdG9yLnhyZWYpOworICAgIEFQLnNldCgiTiIsIG5ld1JlZik7CisgICAgY29uc3QgdmFsdWUgPSBhbm5vdGF0aW9uU3RvcmFnZVt0aGlzLmRhdGEuaWRdOworICAgIGNvbnN0IGVuY3J5cHQgPSBldmFsdWF0b3IueHJlZi5lbmNyeXB0OworICAgIGxldCBvcmlnaW5hbFRyYW5zZm9ybSA9IG51bGw7CisgICAgbGV0IG5ld1RyYW5zZm9ybSA9IG51bGw7CisKKyAgICBpZiAoZW5jcnlwdCkgeworICAgICAgb3JpZ2luYWxUcmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnJlZi5udW0sIHRoaXMucmVmLmdlbik7CisgICAgICBuZXdUcmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShuZXdSZWYubnVtLCBuZXdSZWYuZ2VuKTsKKyAgICAgIGFwcGVhcmFuY2UgPSBuZXdUcmFuc2Zvcm0uZW5jcnlwdFN0cmluZyhhcHBlYXJhbmNlKTsKKyAgICB9CisKKyAgICBkaWN0LnNldCgiViIsIHZhbHVlKTsKKyAgICBkaWN0LnNldCgiQVAiLCBBUCk7CisgICAgZGljdC5zZXQoIk0iLCBgRDokeygwLCBfdXRpbC5nZXRNb2RpZmljYXRpb25EYXRlKSgpfWApOworICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoZXZhbHVhdG9yLnhyZWYpOworICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOworICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb3JtIikpOworICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiUmVzb3VyY2VzIiwgdGhpcy5maWVsZFJlc291cmNlcyk7CisgICAgYXBwZWFyYW5jZURpY3Quc2V0KCJCQm94IiwgYmJveCk7CisgICAgY29uc3QgYnVmZmVyT3JpZ2luYWwgPSBbYCR7dGhpcy5yZWYubnVtfSAke3RoaXMucmVmLmdlbn0gb2JqXG5gXTsKKyAgICAoMCwgX3dyaXRlci53cml0ZURpY3QpKGRpY3QsIGJ1ZmZlck9yaWdpbmFsLCBvcmlnaW5hbFRyYW5zZm9ybSk7CisgICAgYnVmZmVyT3JpZ2luYWwucHVzaCgiXG5lbmRvYmpcbiIpOworICAgIGNvbnN0IGJ1ZmZlck5ldyA9IFtgJHtuZXdSZWYubnVtfSAke25ld1JlZi5nZW59IG9ialxuYF07CisgICAgKDAsIF93cml0ZXIud3JpdGVEaWN0KShhcHBlYXJhbmNlRGljdCwgYnVmZmVyTmV3LCBuZXdUcmFuc2Zvcm0pOworICAgIGJ1ZmZlck5ldy5wdXNoKCIgc3RyZWFtXG4iKTsKKyAgICBidWZmZXJOZXcucHVzaChhcHBlYXJhbmNlKTsKKyAgICBidWZmZXJOZXcucHVzaCgiXG5lbmRzdHJlYW1cbmVuZG9ialxuIik7CisgICAgcmV0dXJuIFt7CisgICAgICByZWY6IHRoaXMucmVmLAorICAgICAgZGF0YTogYnVmZmVyT3JpZ2luYWwuam9pbigiIikKKyAgICB9LCB7CisgICAgICByZWY6IG5ld1JlZiwKKyAgICAgIGRhdGE6IGJ1ZmZlck5ldy5qb2luKCIiKQorICAgIH1dOworICB9CisKKyAgYXN5bmMgX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIGNvbnN0IGlzUGFzc3dvcmQgPSB0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKTsKKworICAgIGlmICghYW5ub3RhdGlvblN0b3JhZ2UgfHwgaXNQYXNzd29yZCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgdmFsdWUgPSBhbm5vdGF0aW9uU3RvcmFnZVt0aGlzLmRhdGEuaWRdOworCisgICAgaWYgKHZhbHVlID09PSAiIikgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIGNvbnN0IGRlZmF1bHRQYWRkaW5nID0gMjsKKyAgICBjb25zdCBoUGFkZGluZyA9IGRlZmF1bHRQYWRkaW5nOworICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gdGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXTsKKyAgICBjb25zdCB0b3RhbFdpZHRoID0gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTsKKyAgICBjb25zdCBmb250SW5mbyA9IGF3YWl0IHRoaXMuX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzayk7CisgICAgY29uc3QgW2ZvbnQsIGZvbnROYW1lXSA9IGZvbnRJbmZvOworICAgIGxldCBmb250U2l6ZSA9IGZvbnRJbmZvWzJdOworICAgIGZvbnRTaXplID0gdGhpcy5fY29tcHV0ZUZvbnRTaXplKGZvbnQsIGZvbnROYW1lLCBmb250U2l6ZSwgdG90YWxIZWlnaHQpOworICAgIGxldCBkZXNjZW50ID0gZm9udC5kZXNjZW50OworCisgICAgaWYgKGlzTmFOKGRlc2NlbnQpKSB7CisgICAgICBkZXNjZW50ID0gMDsKKyAgICB9CisKKyAgICBjb25zdCB2UGFkZGluZyA9IGRlZmF1bHRQYWRkaW5nICsgTWF0aC5hYnMoZGVzY2VudCkgKiBmb250U2l6ZTsKKyAgICBjb25zdCBkZWZhdWx0QXBwZWFyYW5jZSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZTsKKyAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLmRhdGEudGV4dEFsaWdubWVudDsKKworICAgIGlmICh0aGlzLmRhdGEuY29tYikgeworICAgICAgcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCB2YWx1ZSwgdG90YWxXaWR0aCwgaFBhZGRpbmcsIHZQYWRkaW5nKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkgeworICAgICAgcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIHZhbHVlLCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCwgdG90YWxIZWlnaHQsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nKTsKKyAgICB9CisKKyAgICBpZiAoYWxpZ25tZW50ID09PSAwIHx8IGFsaWdubWVudCA+IDIpIHsKKyAgICAgIHJldHVybiAiL1R4IEJNQyBxIEJUICIgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke2hQYWRkaW5nfSAke3ZQYWRkaW5nfSBUbSAoJHsoMCwgX3V0aWwuZXNjYXBlU3RyaW5nKSh2YWx1ZSl9KSBUamAgKyAiIEVUIFEgRU1DIjsKKyAgICB9CisKKyAgICBjb25zdCByZW5kZXJlZFRleHQgPSB0aGlzLl9yZW5kZXJUZXh0KHZhbHVlLCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCwgYWxpZ25tZW50LCBoUGFkZGluZywgdlBhZGRpbmcpOworCisgICAgcmV0dXJuICIvVHggQk1DIHEgQlQgIiArIGRlZmF1bHRBcHBlYXJhbmNlICsgYCAxIDAgMCAxIDAgMCBUbSAke3JlbmRlcmVkVGV4dH1gICsgIiBFVCBRIEVNQyI7CisgIH0KKworICBhc3luYyBfZ2V0Rm9udERhdGEoZXZhbHVhdG9yLCB0YXNrKSB7CisgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gbmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpOworICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHsKKyAgICAgIGZvbnRTaXplOiAwLAorICAgICAgZm9udDogbnVsbCwKKyAgICAgIGZvbnROYW1lOiBudWxsLAorCisgICAgICBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICB9OworICAgIGF3YWl0IGV2YWx1YXRvci5nZXRPcGVyYXRvckxpc3QoeworICAgICAgc3RyZWFtOiBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0odGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlKSwKKyAgICAgIHRhc2ssCisgICAgICByZXNvdXJjZXM6IHRoaXMuZmllbGRSZXNvdXJjZXMsCisgICAgICBvcGVyYXRvckxpc3QsCisgICAgICBpbml0aWFsU3RhdGUKKyAgICB9KTsKKyAgICByZXR1cm4gW2luaXRpYWxTdGF0ZS5mb250LCBpbml0aWFsU3RhdGUuZm9udE5hbWUsIGluaXRpYWxTdGF0ZS5mb250U2l6ZV07CisgIH0KKworICBfY29tcHV0ZUZvbnRTaXplKGZvbnQsIGZvbnROYW1lLCBmb250U2l6ZSwgaGVpZ2h0KSB7CisgICAgaWYgKGZvbnRTaXplID09PSBudWxsIHx8IGZvbnRTaXplID09PSAwKSB7CisgICAgICBjb25zdCBlbSA9IGZvbnQuY2hhcnNUb0dseXBocygiTSIsIHRydWUpWzBdLndpZHRoIC8gMTAwMDsKKyAgICAgIGNvbnN0IGNhcEhlaWdodCA9IDAuNyAqIGVtOworICAgICAgZm9udFNpemUgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGhlaWdodCAvICgxLjUgKiBjYXBIZWlnaHQpKSk7CisgICAgICBsZXQgZm9udFJlZ2V4ID0gbmV3IFJlZ0V4cChgLyR7Zm9udE5hbWV9XFxzK1swLTlcLl0rXFxzK1RmYCk7CisKKyAgICAgIGlmICh0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2Uuc2VhcmNoKGZvbnRSZWdleCkgPT09IC0xKSB7CisgICAgICAgIGZvbnRSZWdleCA9IG5ldyBSZWdFeHAoYC8ke2ZvbnROYW1lfVxccytUZmApOworICAgICAgfQorCisgICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2UgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2UucmVwbGFjZShmb250UmVnZXgsIGAvJHtmb250TmFtZX0gJHtmb250U2l6ZX0gVGZgKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9udFNpemU7CisgIH0KKworICBfcmVuZGVyVGV4dCh0ZXh0LCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCwgYWxpZ25tZW50LCBoUGFkZGluZywgdlBhZGRpbmcpIHsKKyAgICBjb25zdCBnbHlwaHMgPSBmb250LmNoYXJzVG9HbHlwaHModGV4dCk7CisgICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7CisgICAgbGV0IHdpZHRoID0gMDsKKworICAgIGZvciAoY29uc3QgZ2x5cGggb2YgZ2x5cGhzKSB7CisgICAgICB3aWR0aCArPSBnbHlwaC53aWR0aCAqIHNjYWxlOworICAgIH0KKworICAgIGxldCBzaGlmdDsKKworICAgIGlmIChhbGlnbm1lbnQgPT09IDEpIHsKKyAgICAgIHNoaWZ0ID0gKHRvdGFsV2lkdGggLSB3aWR0aCkgLyAyOworICAgIH0gZWxzZSBpZiAoYWxpZ25tZW50ID09PSAyKSB7CisgICAgICBzaGlmdCA9IHRvdGFsV2lkdGggLSB3aWR0aCAtIGhQYWRkaW5nOworICAgIH0gZWxzZSB7CisgICAgICBzaGlmdCA9IGhQYWRkaW5nOworICAgIH0KKworICAgIHNoaWZ0ID0gc2hpZnQudG9GaXhlZCgyKTsKKyAgICB2UGFkZGluZyA9IHZQYWRkaW5nLnRvRml4ZWQoMik7CisgICAgcmV0dXJuIGAke3NoaWZ0fSAke3ZQYWRkaW5nfSBUZCAoJHsoMCwgX3V0aWwuZXNjYXBlU3RyaW5nKSh0ZXh0KX0pIFRqYDsKKyAgfQorCit9CisKK2NsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtcykgeworICAgIHN1cGVyKHBhcmFtcyk7CisgICAgdGhpcy5faGFzVGV4dCA9IHRydWU7CisgICAgY29uc3QgZGljdCA9IHBhcmFtcy5kaWN0OworCisgICAgaWYgKCEoMCwgX3V0aWwuaXNTdHJpbmcpKHRoaXMuZGF0YS5maWVsZFZhbHVlKSkgeworICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSAiIjsKKyAgICB9CisKKyAgICBsZXQgYWxpZ25tZW50ID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3QsCisgICAgICBrZXk6ICJRIgorICAgIH0pOworCisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGFsaWdubWVudCkgfHwgYWxpZ25tZW50IDwgMCB8fCBhbGlnbm1lbnQgPiAyKSB7CisgICAgICBhbGlnbm1lbnQgPSBudWxsOworICAgIH0KKworICAgIHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ID0gYWxpZ25tZW50OworICAgIGxldCBtYXhpbXVtTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3QsCisgICAgICBrZXk6ICJNYXhMZW4iCisgICAgfSk7CisKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4aW11bUxlbmd0aCkgfHwgbWF4aW11bUxlbmd0aCA8IDApIHsKKyAgICAgIG1heGltdW1MZW5ndGggPSBudWxsOworICAgIH0KKworICAgIHRoaXMuZGF0YS5tYXhMZW4gPSBtYXhpbXVtTGVuZ3RoOworICAgIHRoaXMuZGF0YS5tdWx0aUxpbmUgPSB0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7CisgICAgdGhpcy5kYXRhLmNvbWIgPSB0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLkNPTUIpICYmICF0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSkgJiYgIXRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpICYmICF0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLkZJTEVTRUxFQ1QpICYmIHRoaXMuZGF0YS5tYXhMZW4gIT09IG51bGw7CisgIH0KKworICBfZ2V0Q29tYkFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIHRleHQsIHdpZHRoLCBoUGFkZGluZywgdlBhZGRpbmcpIHsKKyAgICBjb25zdCBjb21iV2lkdGggPSAod2lkdGggLyB0aGlzLmRhdGEubWF4TGVuKS50b0ZpeGVkKDIpOworICAgIGNvbnN0IGJ1ZiA9IFtdOworCisgICAgZm9yIChjb25zdCBjaGFyYWN0ZXIgb2YgdGV4dCkgeworICAgICAgYnVmLnB1c2goYCgkeygwLCBfdXRpbC5lc2NhcGVTdHJpbmcpKGNoYXJhY3Rlcil9KSBUamApOworICAgIH0KKworICAgIGNvbnN0IHJlbmRlcmVkQ29tYiA9IGJ1Zi5qb2luKGAgJHtjb21iV2lkdGh9IDAgVGQgYCk7CisgICAgcmV0dXJuICIvVHggQk1DIHEgQlQgIiArIGRlZmF1bHRBcHBlYXJhbmNlICsgYCAxIDAgMCAxICR7aFBhZGRpbmd9ICR7dlBhZGRpbmd9IFRtICR7cmVuZGVyZWRDb21ifWAgKyAiIEVUIFEgRU1DIjsKKyAgfQorCisgIF9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCB0ZXh0LCBmb250LCBmb250U2l6ZSwgd2lkdGgsIGhlaWdodCwgYWxpZ25tZW50LCBoUGFkZGluZywgdlBhZGRpbmcpIHsKKyAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xyXG58XHJ8XG4vKTsKKyAgICBjb25zdCBidWYgPSBbXTsKKyAgICBjb25zdCB0b3RhbFdpZHRoID0gd2lkdGggLSAyICogaFBhZGRpbmc7CisKKyAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKKyAgICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuX3NwbGl0TGluZShsaW5lLCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCk7CisKKyAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7CisgICAgICAgIGNvbnN0IHBhZGRpbmcgPSBidWYubGVuZ3RoID09PSAwID8gaFBhZGRpbmcgOiAwOworICAgICAgICBidWYucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGNodW5rLCBmb250LCBmb250U2l6ZSwgd2lkdGgsIGFsaWdubWVudCwgcGFkZGluZywgLWZvbnRTaXplKSk7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgcmVuZGVyZWRUZXh0ID0gYnVmLmpvaW4oIlxuIik7CisgICAgcmV0dXJuICIvVHggQk1DIHEgQlQgIiArIGRlZmF1bHRBcHBlYXJhbmNlICsgYCAxIDAgMCAxIDAgJHtoZWlnaHR9IFRtICR7cmVuZGVyZWRUZXh0fWAgKyAiIEVUIFEgRU1DIjsKKyAgfQorCisgIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoKSB7CisgICAgaWYgKGxpbmUubGVuZ3RoIDw9IDEpIHsKKyAgICAgIHJldHVybiBbbGluZV07CisgICAgfQorCisgICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7CisgICAgY29uc3Qgd2hpdGVzcGFjZSA9IGZvbnQuY2hhcnNUb0dseXBocygiICIsIHRydWUpWzBdLndpZHRoICogc2NhbGU7CisgICAgY29uc3QgY2h1bmtzID0gW107CisgICAgbGV0IGxhc3RTcGFjZVBvcyA9IC0xLAorICAgICAgICBzdGFydENodW5rID0gMCwKKyAgICAgICAgY3VycmVudFdpZHRoID0gMDsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgY29uc3QgY2hhcmFjdGVyID0gbGluZS5jaGFyQXQoaSk7CisKKyAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICIgIikgeworICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgd2hpdGVzcGFjZSA+IHdpZHRoKSB7CisgICAgICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgaSkpOworICAgICAgICAgIHN0YXJ0Q2h1bmsgPSBpOworICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IHdoaXRlc3BhY2U7CisgICAgICAgICAgbGFzdFNwYWNlUG9zID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VycmVudFdpZHRoICs9IHdoaXRlc3BhY2U7CisgICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhcldpZHRoID0gZm9udC5jaGFyc1RvR2x5cGhzKGNoYXJhY3RlciwgZmFsc2UpWzBdLndpZHRoICogc2NhbGU7CisKKyAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCArIGNoYXJXaWR0aCA+IHdpZHRoKSB7CisgICAgICAgICAgaWYgKGxhc3RTcGFjZVBvcyAhPT0gLTEpIHsKKyAgICAgICAgICAgIGNodW5rcy5wdXNoKGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q2h1bmssIGxhc3RTcGFjZVBvcyArIDEpKTsKKyAgICAgICAgICAgIHN0YXJ0Q2h1bmsgPSBpID0gbGFzdFNwYWNlUG9zICsgMTsKKyAgICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOworICAgICAgICAgICAgY3VycmVudFdpZHRoID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgaSkpOworICAgICAgICAgICAgc3RhcnRDaHVuayA9IGk7CisgICAgICAgICAgICBjdXJyZW50V2lkdGggPSBjaGFyV2lkdGg7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGN1cnJlbnRXaWR0aCArPSBjaGFyV2lkdGg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhcnRDaHVuayA8IGxpbmUubGVuZ3RoKSB7CisgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsaW5lLmxlbmd0aCkpOworICAgIH0KKworICAgIHJldHVybiBjaHVua3M7CisgIH0KKworfQorCitjbGFzcyBCdXR0b25XaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtcykgeworICAgIHN1cGVyKHBhcmFtcyk7CisgICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IG51bGw7CisgICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbnVsbDsKKyAgICB0aGlzLmRhdGEuY2hlY2tCb3ggPSAhdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5SQURJTykgJiYgIXRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7CisgICAgdGhpcy5kYXRhLnJhZGlvQnV0dG9uID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5SQURJTykgJiYgIXRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7CisgICAgdGhpcy5kYXRhLnB1c2hCdXR0b24gPSB0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pOworCisgICAgaWYgKHRoaXMuZGF0YS5jaGVja0JveCkgeworICAgICAgdGhpcy5fcHJvY2Vzc0NoZWNrQm94KHBhcmFtcyk7CisgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHsKKyAgICAgIHRoaXMuX3Byb2Nlc3NSYWRpb0J1dHRvbihwYXJhbXMpOworICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnB1c2hCdXR0b24pIHsKKyAgICAgIHRoaXMuX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBmaWVsZCBmbGFncyBmb3IgYnV0dG9uIHdpZGdldCBhbm5vdGF0aW9uIik7CisgICAgfQorICB9CisKKyAgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgZmFsc2UsIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICB9CisKKyAgICBpZiAoYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXSB8fCBmYWxzZTsKKyAgICAgIGxldCBhcHBlYXJhbmNlOworCisgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgYXBwZWFyYW5jZSA9IHRoaXMuY2hlY2tlZEFwcGVhcmFuY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcHBlYXJhbmNlID0gdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlOworICAgICAgfQorCisgICAgICBpZiAoYXBwZWFyYW5jZSkgeworICAgICAgICBjb25zdCBzYXZlZEFwcGVhcmFuY2UgPSB0aGlzLmFwcGVhcmFuY2U7CisgICAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2U7CisgICAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisgICAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IHNhdmVkQXBwZWFyYW5jZTsKKyAgICAgICAgcmV0dXJuIG9wZXJhdG9yTGlzdDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCkpOworICAgIH0KKworICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpOworICB9CisKKyAgYXN5bmMgc2F2ZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgaWYgKHRoaXMuZGF0YS5jaGVja0JveCkgeworICAgICAgcmV0dXJuIHRoaXMuX3NhdmVDaGVja2JveChldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5kYXRhLnJhZGlvQnV0dG9uKSB7CisgICAgICByZXR1cm4gdGhpcy5fc2F2ZVJhZGlvQnV0dG9uKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgIH0KKworICAgIHJldHVybiBzdXBlci5zYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpOworICB9CisKKyAgYXN5bmMgX3NhdmVDaGVja2JveChldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgJiYgdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09ICJPZmYiOworICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXTsKKworICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IHZhbHVlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCBuYW1lID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiAiT2ZmIik7CisKKyAgICBkaWN0LnNldCgiViIsIG5hbWUpOworICAgIGRpY3Quc2V0KCJBUyIsIG5hbWUpOworICAgIGRpY3Quc2V0KCJNIiwgYEQ6JHsoMCwgX3V0aWwuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKX1gKTsKKyAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDsKKyAgICBsZXQgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsOworCisgICAgaWYgKGVuY3J5cHQpIHsKKyAgICAgIG9yaWdpbmFsVHJhbnNmb3JtID0gZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLCB0aGlzLnJlZi5nZW4pOworICAgIH0KKworICAgIGNvbnN0IGJ1ZmZlciA9IFtgJHt0aGlzLnJlZi5udW19ICR7dGhpcy5yZWYuZ2VufSBvYmpcbmBdOworICAgICgwLCBfd3JpdGVyLndyaXRlRGljdCkoZGljdCwgYnVmZmVyLCBvcmlnaW5hbFRyYW5zZm9ybSk7CisgICAgYnVmZmVyLnB1c2goIlxuZW5kb2JqXG4iKTsKKyAgICByZXR1cm4gW3sKKyAgICAgIHJlZjogdGhpcy5yZWYsCisgICAgICBkYXRhOiBidWZmZXIuam9pbigiIikKKyAgICB9XTsKKyAgfQorCisgIGFzeW5jIF9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CisgICAgY29uc3QgdmFsdWUgPSBhbm5vdGF0aW9uU3RvcmFnZVt0aGlzLmRhdGEuaWRdOworCisgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IGRpY3QgPSBldmFsdWF0b3IueHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGljdCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IG5hbWUgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCh2YWx1ZSA/IHRoaXMuZGF0YS5idXR0b25WYWx1ZSA6ICJPZmYiKTsKKworICAgIGxldCBwYXJlbnRCdWZmZXIgPSBudWxsOworICAgIGNvbnN0IGVuY3J5cHQgPSBldmFsdWF0b3IueHJlZi5lbmNyeXB0OworCisgICAgaWYgKHZhbHVlKSB7CisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKSh0aGlzLnBhcmVudCkpIHsKKyAgICAgICAgY29uc3QgcGFyZW50ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2godGhpcy5wYXJlbnQpOworICAgICAgICBsZXQgcGFyZW50VHJhbnNmb3JtID0gbnVsbDsKKworICAgICAgICBpZiAoZW5jcnlwdCkgeworICAgICAgICAgIHBhcmVudFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucGFyZW50Lm51bSwgdGhpcy5wYXJlbnQuZ2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmVudC5zZXQoIlYiLCBuYW1lKTsKKyAgICAgICAgcGFyZW50QnVmZmVyID0gW2Ake3RoaXMucGFyZW50Lm51bX0gJHt0aGlzLnBhcmVudC5nZW59IG9ialxuYF07CisgICAgICAgICgwLCBfd3JpdGVyLndyaXRlRGljdCkocGFyZW50LCBwYXJlbnRCdWZmZXIsIHBhcmVudFRyYW5zZm9ybSk7CisgICAgICAgIHBhcmVudEJ1ZmZlci5wdXNoKCJcbmVuZG9ialxuIik7CisgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHRoaXMucGFyZW50KSkgeworICAgICAgICB0aGlzLnBhcmVudC5zZXQoIlYiLCBuYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKKyAgICBkaWN0LnNldCgiTSIsIGBEOiR7KDAsIF91dGlsLmdldE1vZGlmaWNhdGlvbkRhdGUpKCl9YCk7CisgICAgbGV0IG9yaWdpbmFsVHJhbnNmb3JtID0gbnVsbDsKKworICAgIGlmIChlbmNyeXB0KSB7CisgICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucmVmLm51bSwgdGhpcy5yZWYuZ2VuKTsKKyAgICB9CisKKyAgICBjb25zdCBidWZmZXIgPSBbYCR7dGhpcy5yZWYubnVtfSAke3RoaXMucmVmLmdlbn0gb2JqXG5gXTsKKyAgICAoMCwgX3dyaXRlci53cml0ZURpY3QpKGRpY3QsIGJ1ZmZlciwgb3JpZ2luYWxUcmFuc2Zvcm0pOworICAgIGJ1ZmZlci5wdXNoKCJcbmVuZG9ialxuIik7CisgICAgY29uc3QgbmV3UmVmcyA9IFt7CisgICAgICByZWY6IHRoaXMucmVmLAorICAgICAgZGF0YTogYnVmZmVyLmpvaW4oIiIpCisgICAgfV07CisKKyAgICBpZiAocGFyZW50QnVmZmVyICE9PSBudWxsKSB7CisgICAgICBuZXdSZWZzLnB1c2goeworICAgICAgICByZWY6IHRoaXMucGFyZW50LAorICAgICAgICBkYXRhOiBwYXJlbnRCdWZmZXIuam9pbigiIikKKyAgICAgIH0pOworICAgIH0KKworICAgIHJldHVybiBuZXdSZWZzOworICB9CisKKyAgX3Byb2Nlc3NDaGVja0JveChwYXJhbXMpIHsKKyAgICBjb25zdCBjdXN0b21BcHBlYXJhbmNlID0gcGFyYW1zLmRpY3QuZ2V0KCJBUCIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShjdXN0b21BcHBlYXJhbmNlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2UgPSBjdXN0b21BcHBlYXJhbmNlLmdldCgiTiIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShub3JtYWxBcHBlYXJhbmNlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGV4cG9ydFZhbHVlcyA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0S2V5cygpOworCisgICAgaWYgKCFleHBvcnRWYWx1ZXMuaW5jbHVkZXMoIk9mZiIpKSB7CisgICAgICBleHBvcnRWYWx1ZXMucHVzaCgiT2ZmIik7CisgICAgfQorCisgICAgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggIT09IDIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgPSBleHBvcnRWYWx1ZXNbMF0gPT09ICJPZmYiID8gZXhwb3J0VmFsdWVzWzFdIDogZXhwb3J0VmFsdWVzWzBdOworICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuZXhwb3J0VmFsdWUpOworICAgIHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KCJPZmYiKSB8fCBudWxsOworICB9CisKKyAgX3Byb2Nlc3NSYWRpb0J1dHRvbihwYXJhbXMpIHsKKyAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuZGF0YS5idXR0b25WYWx1ZSA9IG51bGw7CisgICAgY29uc3QgZmllbGRQYXJlbnQgPSBwYXJhbXMuZGljdC5nZXQoIlBhcmVudCIpOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGZpZWxkUGFyZW50KSAmJiBmaWVsZFBhcmVudC5oYXMoIlYiKSkgeworICAgICAgY29uc3QgZmllbGRQYXJlbnRWYWx1ZSA9IGZpZWxkUGFyZW50LmdldCgiViIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmllbGRQYXJlbnRWYWx1ZSkpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMuZGljdC5nZXRSYXcoIlBhcmVudCIpOworICAgICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShmaWVsZFBhcmVudFZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gcGFyYW1zLmRpY3QuZ2V0KCJBUCIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShhcHBlYXJhbmNlU3RhdGVzKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlU3RhdGVzLmdldCgiTiIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShub3JtYWxBcHBlYXJhbmNlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY29uc3Qga2V5IG9mIG5vcm1hbEFwcGVhcmFuY2UuZ2V0S2V5cygpKSB7CisgICAgICBpZiAoa2V5ICE9PSAiT2ZmIikgeworICAgICAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBrZXk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuYnV0dG9uVmFsdWUpOworICAgIHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KCJPZmYiKSB8fCBudWxsOworICB9CisKKyAgX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcykgeworICAgIGlmICghcGFyYW1zLmRpY3QuaGFzKCJBIikpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9vYmouQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKKyAgICAgIGRlc3REaWN0OiBwYXJhbXMuZGljdCwKKyAgICAgIHJlc3VsdE9iajogdGhpcy5kYXRhLAorICAgICAgZG9jQmFzZVVybDogcGFyYW1zLnBkZk1hbmFnZXIuZG9jQmFzZVVybAorICAgIH0pOworICB9CisKK30KKworY2xhc3MgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKKyAgICBzdXBlcihwYXJhbXMpOworICAgIHRoaXMuZGF0YS5vcHRpb25zID0gW107CisgICAgY29uc3Qgb3B0aW9ucyA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0OiBwYXJhbXMuZGljdCwKKyAgICAgIGtleTogIk9wdCIKKyAgICB9KTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7CisgICAgICBjb25zdCB4cmVmID0gcGFyYW1zLnhyZWY7CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb25zdCBvcHRpb24gPSB4cmVmLmZldGNoSWZSZWYob3B0aW9uc1tpXSk7CisgICAgICAgIGNvbnN0IGlzT3B0aW9uQXJyYXkgPSBBcnJheS5pc0FycmF5KG9wdGlvbik7CisgICAgICAgIHRoaXMuZGF0YS5vcHRpb25zW2ldID0geworICAgICAgICAgIGV4cG9ydFZhbHVlOiB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoaXNPcHRpb25BcnJheSA/IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25bMF0pIDogb3B0aW9uKSwKKyAgICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShpc09wdGlvbkFycmF5ID8geHJlZi5mZXRjaElmUmVmKG9wdGlvblsxXSkgOiBvcHRpb24pCisgICAgICAgIH07CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykodGhpcy5kYXRhLmZpZWxkVmFsdWUpKSB7CisgICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFt0aGlzLmRhdGEuZmllbGRWYWx1ZV07CisgICAgfSBlbHNlIGlmICghdGhpcy5kYXRhLmZpZWxkVmFsdWUpIHsKKyAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107CisgICAgfQorCisgICAgdGhpcy5kYXRhLmNvbWJvID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CTyk7CisgICAgdGhpcy5kYXRhLm11bHRpU2VsZWN0ID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSVNFTEVDVCk7CisgICAgdGhpcy5faGFzVGV4dCA9IHRydWU7CisgIH0KKworfQorCitjbGFzcyBUZXh0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgREVGQVVMVF9JQ09OX1NJWkUgPSAyMjsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICBjb25zdCBkaWN0ID0gcGFyYW1ldGVycy5kaWN0OworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlRFWFQ7CisKKyAgICBpZiAodGhpcy5kYXRhLmhhc0FwcGVhcmFuY2UpIHsKKyAgICAgIHRoaXMuZGF0YS5uYW1lID0gIk5vSWNvbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuZGF0YS5yZWN0WzFdID0gdGhpcy5kYXRhLnJlY3RbM10gLSBERUZBVUxUX0lDT05fU0laRTsKKyAgICAgIHRoaXMuZGF0YS5yZWN0WzJdID0gdGhpcy5kYXRhLnJlY3RbMF0gKyBERUZBVUxUX0lDT05fU0laRTsKKyAgICAgIHRoaXMuZGF0YS5uYW1lID0gZGljdC5oYXMoIk5hbWUiKSA/IGRpY3QuZ2V0KCJOYW1lIikubmFtZSA6ICJOb3RlIjsKKyAgICB9CisKKyAgICBpZiAoZGljdC5oYXMoIlN0YXRlIikpIHsKKyAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IGRpY3QuZ2V0KCJTdGF0ZSIpIHx8IG51bGw7CisgICAgICB0aGlzLmRhdGEuc3RhdGVNb2RlbCA9IGRpY3QuZ2V0KCJTdGF0ZU1vZGVsIikgfHwgbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5kYXRhLnN0YXRlID0gbnVsbDsKKyAgICAgIHRoaXMuZGF0YS5zdGF0ZU1vZGVsID0gbnVsbDsKKyAgICB9CisgIH0KKworfQorCitjbGFzcyBMaW5rQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKKyAgICBzdXBlcihwYXJhbXMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLkxJTks7CisgICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1zLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTsKKworICAgIGlmIChxdWFkUG9pbnRzKSB7CisgICAgICB0aGlzLmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7CisgICAgfQorCisgICAgX29iai5DYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoeworICAgICAgZGVzdERpY3Q6IHBhcmFtcy5kaWN0LAorICAgICAgcmVzdWx0T2JqOiB0aGlzLmRhdGEsCisgICAgICBkb2NCYXNlVXJsOiBwYXJhbXMucGRmTWFuYWdlci5kb2NCYXNlVXJsCisgICAgfSk7CisgIH0KKworfQorCitjbGFzcyBQb3B1cEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlBPUFVQOworICAgIGxldCBwYXJlbnRJdGVtID0gcGFyYW1ldGVycy5kaWN0LmdldCgiUGFyZW50Iik7CisKKyAgICBpZiAoIXBhcmVudEl0ZW0pIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiUG9wdXAgYW5ub3RhdGlvbiBoYXMgYSBtaXNzaW5nIG9yIGludmFsaWQgcGFyZW50IGFubm90YXRpb24uIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgcGFyZW50U3VidHlwZSA9IHBhcmVudEl0ZW0uZ2V0KCJTdWJ0eXBlIik7CisgICAgdGhpcy5kYXRhLnBhcmVudFR5cGUgPSAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShwYXJlbnRTdWJ0eXBlKSA/IHBhcmVudFN1YnR5cGUubmFtZSA6IG51bGw7CisgICAgY29uc3QgcmF3UGFyZW50ID0gcGFyYW1ldGVycy5kaWN0LmdldFJhdygiUGFyZW50Iik7CisgICAgdGhpcy5kYXRhLnBhcmVudElkID0gKDAsIF9wcmltaXRpdmVzLmlzUmVmKShyYXdQYXJlbnQpID8gcmF3UGFyZW50LnRvU3RyaW5nKCkgOiBudWxsOworICAgIGNvbnN0IHJ0ID0gcGFyZW50SXRlbS5nZXQoIlJUIik7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkocnQsIF91dGlsLkFubm90YXRpb25SZXBseVR5cGUuR1JPVVApKSB7CisgICAgICBwYXJlbnRJdGVtID0gcGFyZW50SXRlbS5nZXQoIklSVCIpOworICAgIH0KKworICAgIGlmICghcGFyZW50SXRlbS5oYXMoIk0iKSkgeworICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50SXRlbS5nZXQoIk0iKSk7CisgICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMubW9kaWZpY2F0aW9uRGF0ZTsKKyAgICB9CisKKyAgICBpZiAoIXBhcmVudEl0ZW0uaGFzKCJDIikpIHsKKyAgICAgIHRoaXMuZGF0YS5jb2xvciA9IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50SXRlbS5nZXRBcnJheSgiQyIpKTsKKyAgICAgIHRoaXMuZGF0YS5jb2xvciA9IHRoaXMuY29sb3I7CisgICAgfQorCisgICAgaWYgKCF0aGlzLnZpZXdhYmxlKSB7CisgICAgICBjb25zdCBwYXJlbnRGbGFncyA9IHBhcmVudEl0ZW0uZ2V0KCJGIik7CisKKyAgICAgIGlmICh0aGlzLl9pc1ZpZXdhYmxlKHBhcmVudEZsYWdzKSkgeworICAgICAgICB0aGlzLnNldEZsYWdzKHBhcmVudEZsYWdzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmRhdGEudGl0bGUgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHBhcmVudEl0ZW0uZ2V0KCJUIikgfHwgIiIpOworICAgIHRoaXMuZGF0YS5jb250ZW50cyA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykocGFyZW50SXRlbS5nZXQoIkNvbnRlbnRzIikgfHwgIiIpOworICB9CisKK30KKworY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDsKKyAgfQorCit9CisKK2NsYXNzIExpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5FOworICAgIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXMgPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QocGFyYW1ldGVycy5kaWN0LmdldEFycmF5KCJMIikpOworICB9CisKK30KKworY2xhc3MgU3F1YXJlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1FVQVJFOworICB9CisKK30KKworY2xhc3MgQ2lyY2xlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOworICB9CisKK30KKworY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT0xZTElORTsKKyAgICBjb25zdCByYXdWZXJ0aWNlcyA9IHBhcmFtZXRlcnMuZGljdC5nZXRBcnJheSgiVmVydGljZXMiKTsKKyAgICB0aGlzLmRhdGEudmVydGljZXMgPSBbXTsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHJhd1ZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgIHRoaXMuZGF0YS52ZXJ0aWNlcy5wdXNoKHsKKyAgICAgICAgeDogcmF3VmVydGljZXNbaV0sCisgICAgICAgIHk6IHJhd1ZlcnRpY2VzW2kgKyAxXQorICAgICAgfSk7CisgICAgfQorICB9CisKK30KKworY2xhc3MgUG9seWdvbkFubm90YXRpb24gZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9MWUdPTjsKKyAgfQorCit9CisKK2NsYXNzIENhcmV0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuQ0FSRVQ7CisgIH0KKworfQorCitjbGFzcyBJbmtBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5JTks7CisgICAgY29uc3QgeHJlZiA9IHBhcmFtZXRlcnMueHJlZjsKKyAgICBjb25zdCBvcmlnaW5hbElua0xpc3RzID0gcGFyYW1ldGVycy5kaWN0LmdldEFycmF5KCJJbmtMaXN0Iik7CisgICAgdGhpcy5kYXRhLmlua0xpc3RzID0gW107CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcmlnaW5hbElua0xpc3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgIHRoaXMuZGF0YS5pbmtMaXN0cy5wdXNoKFtdKTsKKworICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gb3JpZ2luYWxJbmtMaXN0c1tpXS5sZW5ndGg7IGogPCBqajsgaiArPSAyKSB7CisgICAgICAgIHRoaXMuZGF0YS5pbmtMaXN0c1tpXS5wdXNoKHsKKyAgICAgICAgICB4OiB4cmVmLmZldGNoSWZSZWYob3JpZ2luYWxJbmtMaXN0c1tpXVtqXSksCisgICAgICAgICAgeTogeHJlZi5mZXRjaElmUmVmKG9yaWdpbmFsSW5rTGlzdHNbaV1baiArIDFdKQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCitjbGFzcyBIaWdobGlnaHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ7CisgICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1ldGVycy5kaWN0LCB0aGlzLnJlY3RhbmdsZSk7CisKKyAgICBpZiAocXVhZFBvaW50cykgeworICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzOworICAgIH0KKyAgfQorCit9CisKK2NsYXNzIFVuZGVybGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlVOREVSTElORTsKKyAgICBjb25zdCBxdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhwYXJhbWV0ZXJzLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTsKKworICAgIGlmIChxdWFkUG9pbnRzKSB7CisgICAgICB0aGlzLmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7CisgICAgfQorICB9CisKK30KKworY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TUVVJR0dMWTsKKyAgICBjb25zdCBxdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhwYXJhbWV0ZXJzLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTsKKworICAgIGlmIChxdWFkUG9pbnRzKSB7CisgICAgICB0aGlzLmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7CisgICAgfQorICB9CisKK30KKworY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOworICAgIGNvbnN0IHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKHBhcmFtZXRlcnMuZGljdCwgdGhpcy5yZWN0YW5nbGUpOworCisgICAgaWYgKHF1YWRQb2ludHMpIHsKKyAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50czsKKyAgICB9CisgIH0KKworfQorCitjbGFzcyBTdGFtcEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlNUQU1QOworICB9CisKK30KKworY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICBjb25zdCBmaWxlID0gbmV3IF9vYmouRmlsZVNwZWMocGFyYW1ldGVycy5kaWN0LmdldCgiRlMiKSwgcGFyYW1ldGVycy54cmVmKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDsKKyAgICB0aGlzLmRhdGEuZmlsZSA9IGZpbGUuc2VyaWFsaXphYmxlOworICB9CisKK30KKworLyoqKi8gfSksCisvKiAyNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk9wZXJhdG9yTGlzdCA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIFF1ZXVlT3B0aW1pemVyID0gZnVuY3Rpb24gUXVldWVPcHRpbWl6ZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiBhZGRTdGF0ZShwYXJlbnRTdGF0ZSwgcGF0dGVybiwgY2hlY2tGbiwgaXRlcmF0ZUZuLCBwcm9jZXNzRm4pIHsKKyAgICB2YXIgc3RhdGUgPSBwYXJlbnRTdGF0ZTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhdHRlcm4ubGVuZ3RoIC0gMTsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBpdGVtID0gcGF0dGVybltpXTsKKyAgICAgIHN0YXRlID0gc3RhdGVbaXRlbV0gfHwgKHN0YXRlW2l0ZW1dID0gW10pOworICAgIH0KKworICAgIHN0YXRlW3BhdHRlcm5bcGF0dGVybi5sZW5ndGggLSAxXV0gPSB7CisgICAgICBjaGVja0ZuLAorICAgICAgaXRlcmF0ZUZuLAorICAgICAgcHJvY2Vzc0ZuCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRsZVBhaW50U29saWRDb2xvckltYWdlTWFzayhpRmlyc3RTYXZlLCBjb3VudCwgZm5BcnJheSwgYXJnc0FycmF5KSB7CisgICAgdmFyIGlGaXJzdFBJTVhPID0gaUZpcnN0U2F2ZSArIDI7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIHZhciBhcmcgPSBhcmdzQXJyYXlbaUZpcnN0UElNWE8gKyA0ICogaV07CisgICAgICB2YXIgaW1hZ2VNYXNrID0gYXJnLmxlbmd0aCA9PT0gMSAmJiBhcmdbMF07CisKKyAgICAgIGlmIChpbWFnZU1hc2sgJiYgaW1hZ2VNYXNrLndpZHRoID09PSAxICYmIGltYWdlTWFzay5oZWlnaHQgPT09IDEgJiYgKCFpbWFnZU1hc2suZGF0YS5sZW5ndGggfHwgaW1hZ2VNYXNrLmRhdGEubGVuZ3RoID09PSAxICYmIGltYWdlTWFzay5kYXRhWzBdID09PSAwKSkgeworICAgICAgICBmbkFycmF5W2lGaXJzdFBJTVhPICsgNCAqIGldID0gX3V0aWwuT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudCAtIGk7CisgIH0KKworICB2YXIgSW5pdGlhbFN0YXRlID0gW107CisgIGFkZFN0YXRlKEluaXRpYWxTdGF0ZSwgW191dGlsLk9QUy5zYXZlLCBfdXRpbC5PUFMudHJhbnNmb3JtLCBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIF91dGlsLk9QUy5yZXN0b3JlXSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZUlubGluZUltYWdlR3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5OworICAgIHZhciBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7CisgICAgdmFyIHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0OworCisgICAgc3dpdGNoIChwb3MpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5zYXZlOworCisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMudHJhbnNmb3JtOworCisgICAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5yZXN0b3JlOworICAgIH0KKworICAgIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZUlubGluZUltYWdlR3JvdXAgLSBpbnZhbGlkIHBvczogJHtwb3N9YCk7CisgIH0sIGZ1bmN0aW9uIGZvdW5kSW5saW5lSW1hZ2VHcm91cChjb250ZXh0LCBpKSB7CisgICAgdmFyIE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSyA9IDEwOworICAgIHZhciBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAyMDA7CisgICAgdmFyIE1BWF9XSURUSCA9IDEwMDA7CisgICAgdmFyIElNQUdFX1BBRERJTkcgPSAxOworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgY3VyciA9IGNvbnRleHQuaUN1cnI7CisgICAgdmFyIGlGaXJzdFNhdmUgPSBjdXJyIC0gMzsKKyAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CisgICAgdmFyIGlGaXJzdFBJSVhPID0gY3VyciAtIDE7CisgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCksIE1BWF9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSyk7CisKKyAgICBpZiAoY291bnQgPCBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0spIHsKKyAgICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CisgICAgfQorCisgICAgdmFyIG1heFggPSAwOworICAgIHZhciBtYXAgPSBbXSwKKyAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7CisgICAgdmFyIGN1cnJlbnRYID0gSU1BR0VfUEFERElORywKKyAgICAgICAgY3VycmVudFkgPSBJTUFHRV9QQURESU5HOworICAgIHZhciBxOworCisgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKKyAgICAgIHZhciB0cmFuc2Zvcm0gPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtICsgKHEgPDwgMildOworICAgICAgdmFyIGltZyA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXTsKKworICAgICAgaWYgKGN1cnJlbnRYICsgaW1nLndpZHRoID4gTUFYX1dJRFRIKSB7CisgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBjdXJyZW50WCk7CisgICAgICAgIGN1cnJlbnRZICs9IG1heExpbmVIZWlnaHQgKyAyICogSU1BR0VfUEFERElORzsKKyAgICAgICAgY3VycmVudFggPSAwOworICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gMDsKKyAgICAgIH0KKworICAgICAgbWFwLnB1c2goeworICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgIHg6IGN1cnJlbnRYLAorICAgICAgICB5OiBjdXJyZW50WSwKKyAgICAgICAgdzogaW1nLndpZHRoLAorICAgICAgICBoOiBpbWcuaGVpZ2h0CisgICAgICB9KTsKKyAgICAgIGN1cnJlbnRYICs9IGltZy53aWR0aCArIDIgKiBJTUFHRV9QQURESU5HOworICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIGltZy5oZWlnaHQpOworICAgIH0KKworICAgIHZhciBpbWdXaWR0aCA9IE1hdGgubWF4KG1heFgsIGN1cnJlbnRYKSArIElNQUdFX1BBRERJTkc7CisgICAgdmFyIGltZ0hlaWdodCA9IGN1cnJlbnRZICsgbWF4TGluZUhlaWdodCArIElNQUdFX1BBRERJTkc7CisgICAgdmFyIGltZ0RhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoaW1nV2lkdGggKiBpbWdIZWlnaHQgKiA0KTsKKyAgICB2YXIgaW1nUm93U2l6ZSA9IGltZ1dpZHRoIDw8IDI7CisKKyAgICBmb3IgKHEgPSAwOyBxIDwgY291bnQ7IHErKykgeworICAgICAgdmFyIGRhdGEgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF0uZGF0YTsKKyAgICAgIHZhciByb3dTaXplID0gbWFwW3FdLncgPDwgMjsKKyAgICAgIHZhciBkYXRhT2Zmc2V0ID0gMDsKKyAgICAgIHZhciBvZmZzZXQgPSBtYXBbcV0ueCArIG1hcFtxXS55ICogaW1nV2lkdGggPDwgMjsKKyAgICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoMCwgcm93U2l6ZSksIG9mZnNldCAtIGltZ1Jvd1NpemUpOworCisgICAgICBmb3IgKHZhciBrID0gMCwga2sgPSBtYXBbcV0uaDsgayA8IGtrOyBrKyspIHsKKyAgICAgICAgaW1nRGF0YS5zZXQoZGF0YS5zdWJhcnJheShkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0ICsgcm93U2l6ZSksIG9mZnNldCk7CisgICAgICAgIGRhdGFPZmZzZXQgKz0gcm93U2l6ZTsKKyAgICAgICAgb2Zmc2V0ICs9IGltZ1Jvd1NpemU7CisgICAgICB9CisKKyAgICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoZGF0YU9mZnNldCAtIHJvd1NpemUsIGRhdGFPZmZzZXQpLCBvZmZzZXQpOworCisgICAgICB3aGlsZSAob2Zmc2V0ID49IDApIHsKKyAgICAgICAgZGF0YVtvZmZzZXQgLSA0XSA9IGRhdGFbb2Zmc2V0XTsKKyAgICAgICAgZGF0YVtvZmZzZXQgLSAzXSA9IGRhdGFbb2Zmc2V0ICsgMV07CisgICAgICAgIGRhdGFbb2Zmc2V0IC0gMl0gPSBkYXRhW29mZnNldCArIDJdOworICAgICAgICBkYXRhW29mZnNldCAtIDFdID0gZGF0YVtvZmZzZXQgKyAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDRdOworICAgICAgICBkYXRhW29mZnNldCArIHJvd1NpemUgKyAxXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDNdOworICAgICAgICBkYXRhW29mZnNldCArIHJvd1NpemUgKyAyXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDJdOworICAgICAgICBkYXRhW29mZnNldCArIHJvd1NpemUgKyAzXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDFdOworICAgICAgICBvZmZzZXQgLT0gaW1nUm93U2l6ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKTsKKyAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW3sKKyAgICAgIHdpZHRoOiBpbWdXaWR0aCwKKyAgICAgIGhlaWdodDogaW1nSGVpZ2h0LAorICAgICAga2luZDogX3V0aWwuSW1hZ2VLaW5kLlJHQkFfMzJCUFAsCisgICAgICBkYXRhOiBpbWdEYXRhCisgICAgfSwgbWFwXSk7CisgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOworICB9KTsKKyAgYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbX3V0aWwuT1BTLnNhdmUsIF91dGlsLk9QUy50cmFuc2Zvcm0sIF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsIF91dGlsLk9QUy5yZXN0b3JlXSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZUltYWdlTWFza0dyb3VwKGNvbnRleHQsIGkpIHsKKyAgICB2YXIgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheTsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOworICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKKworICAgIHN3aXRjaCAocG9zKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2F2ZTsKKworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnRyYW5zZm9ybTsKKworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDsKKworICAgICAgY2FzZSAzOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnJlc3RvcmU7CisgICAgfQorCisgICAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAgLSBpbnZhbGlkIHBvczogJHtwb3N9YCk7CisgIH0sIGZ1bmN0aW9uIGZvdW5kSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTA7CisgICAgdmFyIE1BWF9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDA7CisgICAgdmFyIE1BWF9TQU1FX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwMDA7CisgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OworICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOworICAgIHZhciBpRmlyc3RUcmFuc2Zvcm0gPSBjdXJyIC0gMjsKKyAgICB2YXIgaUZpcnN0UElNWE8gPSBjdXJyIC0gMTsKKyAgICB2YXIgY291bnQgPSBNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KTsKKyAgICBjb3VudCA9IGhhbmRsZVBhaW50U29saWRDb2xvckltYWdlTWFzayhpRmlyc3RTYXZlLCBjb3VudCwgZm5BcnJheSwgYXJnc0FycmF5KTsKKworICAgIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spIHsKKyAgICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CisgICAgfQorCisgICAgdmFyIHE7CisgICAgdmFyIGlzU2FtZUltYWdlID0gZmFsc2U7CisgICAgdmFyIGlUcmFuc2Zvcm0sIHRyYW5zZm9ybUFyZ3M7CisgICAgdmFyIGZpcnN0UElNWE9BcmcwID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPXVswXTsKKyAgICBjb25zdCBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXSwKKyAgICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSwKKyAgICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzIgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSwKKyAgICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzMgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVszXTsKKworICAgIGlmIChmaXJzdFRyYW5zZm9ybUFyZzEgPT09IGZpcnN0VHJhbnNmb3JtQXJnMikgeworICAgICAgaXNTYW1lSW1hZ2UgPSB0cnVlOworICAgICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybSArIDQ7CisgICAgICB2YXIgaVBJTVhPID0gaUZpcnN0UElNWE8gKyA0OworCisgICAgICBmb3IgKHEgPSAxOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0LCBpUElNWE8gKz0gNCkgeworICAgICAgICB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOworCisgICAgICAgIGlmIChhcmdzQXJyYXlbaVBJTVhPXVswXSAhPT0gZmlyc3RQSU1YT0FyZzAgfHwgdHJhbnNmb3JtQXJnc1swXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcwIHx8IHRyYW5zZm9ybUFyZ3NbMV0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMSB8fCB0cmFuc2Zvcm1BcmdzWzJdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzIgfHwgdHJhbnNmb3JtQXJnc1szXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmczKSB7CisgICAgICAgICAgaWYgKHEgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7CisgICAgICAgICAgICBpc1NhbWVJbWFnZSA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb3VudCA9IHE7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNTYW1lSW1hZ2UpIHsKKyAgICAgIGNvdW50ID0gTWF0aC5taW4oY291bnQsIE1BWF9TQU1FX0lNQUdFU19JTl9NQVNLU19CTE9DSyk7CisgICAgICB2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOworICAgICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTsKKworICAgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCkgeworICAgICAgICB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOworICAgICAgICBwb3NpdGlvbnNbcSA8PCAxXSA9IHRyYW5zZm9ybUFyZ3NbNF07CisgICAgICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTsKKyAgICAgIH0KKworICAgICAgZm5BcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KTsKKyAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbZmlyc3RQSU1YT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmcxLCBmaXJzdFRyYW5zZm9ybUFyZzIsIGZpcnN0VHJhbnNmb3JtQXJnMywgcG9zaXRpb25zXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvdW50ID0gTWF0aC5taW4oY291bnQsIE1BWF9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOworICAgICAgdmFyIGltYWdlcyA9IFtdOworCisgICAgICBmb3IgKHEgPSAwOyBxIDwgY291bnQ7IHErKykgeworICAgICAgICB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybSArIChxIDw8IDIpXTsKKyAgICAgICAgdmFyIG1hc2tQYXJhbXMgPSBhcmdzQXJyYXlbaUZpcnN0UElNWE8gKyAocSA8PCAyKV1bMF07CisgICAgICAgIGltYWdlcy5wdXNoKHsKKyAgICAgICAgICBkYXRhOiBtYXNrUGFyYW1zLmRhdGEsCisgICAgICAgICAgd2lkdGg6IG1hc2tQYXJhbXMud2lkdGgsCisgICAgICAgICAgaGVpZ2h0OiBtYXNrUGFyYW1zLmhlaWdodCwKKyAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybUFyZ3MKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwKTsKKyAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbaW1hZ2VzXSk7CisgICAgfQorCisgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOworICB9KTsKKyAgYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbX3V0aWwuT1BTLnNhdmUsIF91dGlsLk9QUy50cmFuc2Zvcm0sIF91dGlsLk9QUy5wYWludEltYWdlWE9iamVjdCwgX3V0aWwuT1BTLnJlc3RvcmVdLCBmdW5jdGlvbiAoY29udGV4dCkgeworICAgIHZhciBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY29udGV4dC5pQ3VyciAtIDI7CisgICAgcmV0dXJuIGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzFdID09PSAwICYmIGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdID09PSAwOworICB9LCBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VHcm91cChjb250ZXh0LCBpKSB7CisgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OworICAgIHZhciBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7CisgICAgdmFyIHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0OworCisgICAgc3dpdGNoIChwb3MpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5zYXZlOworCisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChmbkFycmF5W2ldICE9PSBfdXRpbC5PUFMudHJhbnNmb3JtKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyOworICAgICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF07CisgICAgICAgIHZhciBmaXJzdFRyYW5zZm9ybUFyZzMgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVszXTsKKworICAgICAgICBpZiAoYXJnc0FycmF5W2ldWzBdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzAgfHwgYXJnc0FycmF5W2ldWzFdICE9PSAwIHx8IGFyZ3NBcnJheVtpXVsyXSAhPT0gMCB8fCBhcmdzQXJyYXlbaV1bM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnMykgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChmbkFycmF5W2ldICE9PSBfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2YXIgaUZpcnN0UElYTyA9IGNvbnRleHQuaUN1cnIgLSAxOworICAgICAgICB2YXIgZmlyc3RQSVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSVhPXVswXTsKKworICAgICAgICBpZiAoYXJnc0FycmF5W2ldWzBdICE9PSBmaXJzdFBJWE9BcmcwKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5yZXN0b3JlOworICAgIH0KKworICAgIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZUltYWdlR3JvdXAgLSBpbnZhbGlkIHBvczogJHtwb3N9YCk7CisgIH0sIGZ1bmN0aW9uIChjb250ZXh0LCBpKSB7CisgICAgdmFyIE1JTl9JTUFHRVNfSU5fQkxPQ0sgPSAzOworICAgIHZhciBNQVhfSU1BR0VTX0lOX0JMT0NLID0gMTAwMDsKKyAgICB2YXIgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKKyAgICAgICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CisgICAgdmFyIGN1cnIgPSBjb250ZXh0LmlDdXJyOworICAgIHZhciBpRmlyc3RTYXZlID0gY3VyciAtIDM7CisgICAgdmFyIGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOworICAgIHZhciBpRmlyc3RQSVhPID0gY3VyciAtIDE7CisgICAgdmFyIGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07CisgICAgdmFyIGZpcnN0VHJhbnNmb3JtQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzBdOworICAgIHZhciBmaXJzdFRyYW5zZm9ybUFyZzMgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVszXTsKKyAgICB2YXIgY291bnQgPSBNYXRoLm1pbihNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KSwgTUFYX0lNQUdFU19JTl9CTE9DSyk7CisKKyAgICBpZiAoY291bnQgPCBNSU5fSU1BR0VTX0lOX0JMT0NLKSB7CisgICAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0U2F2ZSkgJSA0OworICAgIH0KKworICAgIHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7CisgICAgdmFyIGlUcmFuc2Zvcm0gPSBpRmlyc3RUcmFuc2Zvcm07CisKKyAgICBmb3IgKHZhciBxID0gMDsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCkgeworICAgICAgdmFyIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaVRyYW5zZm9ybV07CisgICAgICBwb3NpdGlvbnNbcSA8PCAxXSA9IHRyYW5zZm9ybUFyZ3NbNF07CisgICAgICBwb3NpdGlvbnNbKHEgPDwgMSkgKyAxXSA9IHRyYW5zZm9ybUFyZ3NbNV07CisgICAgfQorCisgICAgdmFyIGFyZ3MgPSBbZmlyc3RQSVhPQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmcwLCBmaXJzdFRyYW5zZm9ybUFyZzMsIHBvc2l0aW9uc107CisgICAgZm5BcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3RSZXBlYXQpOworICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBhcmdzKTsKKyAgICByZXR1cm4gaUZpcnN0U2F2ZSArIDE7CisgIH0pOworICBhZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtfdXRpbC5PUFMuYmVnaW5UZXh0LCBfdXRpbC5PUFMuc2V0Rm9udCwgX3V0aWwuT1BTLnNldFRleHRNYXRyaXgsIF91dGlsLk9QUy5zaG93VGV4dCwgX3V0aWwuT1BTLmVuZFRleHRdLCBudWxsLCBmdW5jdGlvbiBpdGVyYXRlU2hvd1RleHRHcm91cChjb250ZXh0LCBpKSB7CisgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OworICAgIHZhciBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDQ7CisgICAgdmFyIHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA1OworCisgICAgc3dpdGNoIChwb3MpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5iZWdpblRleHQ7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5zZXRGb250OworCisgICAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2V0VGV4dE1hdHJpeDsKKworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLnNob3dUZXh0KSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGlGaXJzdFNldEZvbnQgPSBjb250ZXh0LmlDdXJyIC0gMzsKKyAgICAgICAgdmFyIGZpcnN0U2V0Rm9udEFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMF07CisgICAgICAgIHZhciBmaXJzdFNldEZvbnRBcmcxID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzFdOworCisgICAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0U2V0Rm9udEFyZzAgfHwgYXJnc0FycmF5W2ldWzFdICE9PSBmaXJzdFNldEZvbnRBcmcxKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5lbmRUZXh0OworICAgIH0KKworICAgIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZVNob3dUZXh0R3JvdXAgLSBpbnZhbGlkIHBvczogJHtwb3N9YCk7CisgIH0sIGZ1bmN0aW9uIChjb250ZXh0LCBpKSB7CisgICAgdmFyIE1JTl9DSEFSU19JTl9CTE9DSyA9IDM7CisgICAgdmFyIE1BWF9DSEFSU19JTl9CTE9DSyA9IDEwMDA7CisgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OworICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjsKKyAgICB2YXIgaUZpcnN0QmVnaW5UZXh0ID0gY3VyciAtIDQ7CisgICAgdmFyIGlGaXJzdFNldEZvbnQgPSBjdXJyIC0gMzsKKyAgICB2YXIgaUZpcnN0U2V0VGV4dE1hdHJpeCA9IGN1cnIgLSAyOworICAgIHZhciBpRmlyc3RTaG93VGV4dCA9IGN1cnIgLSAxOworICAgIHZhciBpRmlyc3RFbmRUZXh0ID0gY3VycjsKKyAgICB2YXIgZmlyc3RTZXRGb250QXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVswXTsKKyAgICB2YXIgZmlyc3RTZXRGb250QXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVsxXTsKKyAgICB2YXIgY291bnQgPSBNYXRoLm1pbihNYXRoLmZsb29yKChpIC0gaUZpcnN0QmVnaW5UZXh0KSAvIDUpLCBNQVhfQ0hBUlNfSU5fQkxPQ0spOworCisgICAgaWYgKGNvdW50IDwgTUlOX0NIQVJTX0lOX0JMT0NLKSB7CisgICAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0QmVnaW5UZXh0KSAlIDU7CisgICAgfQorCisgICAgdmFyIGlGaXJzdCA9IGlGaXJzdEJlZ2luVGV4dDsKKworICAgIGlmIChpRmlyc3RCZWdpblRleHQgPj0gNCAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdID09PSBmbkFycmF5W2lGaXJzdFNldEZvbnRdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gM10gPT09IGZuQXJyYXlbaUZpcnN0U2V0VGV4dE1hdHJpeF0gJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSAyXSA9PT0gZm5BcnJheVtpRmlyc3RTaG93VGV4dF0gJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSAxXSA9PT0gZm5BcnJheVtpRmlyc3RFbmRUZXh0XSAmJiBhcmdzQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gNF1bMF0gPT09IGZpcnN0U2V0Rm9udEFyZzAgJiYgYXJnc0FycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdWzFdID09PSBmaXJzdFNldEZvbnRBcmcxKSB7CisgICAgICBjb3VudCsrOworICAgICAgaUZpcnN0IC09IDU7CisgICAgfQorCisgICAgdmFyIGlFbmRUZXh0ID0gaUZpcnN0ICsgNDsKKworICAgIGZvciAodmFyIHEgPSAxOyBxIDwgY291bnQ7IHErKykgeworICAgICAgZm5BcnJheS5zcGxpY2UoaUVuZFRleHQsIDMpOworICAgICAgYXJnc0FycmF5LnNwbGljZShpRW5kVGV4dCwgMyk7CisgICAgICBpRW5kVGV4dCArPSAyOworICAgIH0KKworICAgIHJldHVybiBpRW5kVGV4dCArIDE7CisgIH0pOworCisgIGZ1bmN0aW9uIFF1ZXVlT3B0aW1pemVyKHF1ZXVlKSB7CisgICAgdGhpcy5xdWV1ZSA9IHF1ZXVlOworICAgIHRoaXMuc3RhdGUgPSBudWxsOworICAgIHRoaXMuY29udGV4dCA9IHsKKyAgICAgIGlDdXJyOiAwLAorICAgICAgZm5BcnJheTogcXVldWUuZm5BcnJheSwKKyAgICAgIGFyZ3NBcnJheTogcXVldWUuYXJnc0FycmF5CisgICAgfTsKKyAgICB0aGlzLm1hdGNoID0gbnVsbDsKKyAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSAwOworICB9CisKKyAgUXVldWVPcHRpbWl6ZXIucHJvdG90eXBlID0geworICAgIF9vcHRpbWl6ZSgpIHsKKyAgICAgIGNvbnN0IGZuQXJyYXkgPSB0aGlzLnF1ZXVlLmZuQXJyYXk7CisgICAgICBsZXQgaSA9IHRoaXMubGFzdFByb2Nlc3NlZCwKKyAgICAgICAgICBpaSA9IGZuQXJyYXkubGVuZ3RoOworICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZTsKKyAgICAgIGxldCBtYXRjaCA9IHRoaXMubWF0Y2g7CisKKyAgICAgIGlmICghc3RhdGUgJiYgIW1hdGNoICYmIGkgKyAxID09PSBpaSAmJiAhSW5pdGlhbFN0YXRlW2ZuQXJyYXlbaV1dKSB7CisgICAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGlpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CisKKyAgICAgIHdoaWxlIChpIDwgaWkpIHsKKyAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgY29uc3QgaXRlcmF0ZSA9ICgwLCBtYXRjaC5pdGVyYXRlRm4pKGNvbnRleHQsIGkpOworCisgICAgICAgICAgaWYgKGl0ZXJhdGUpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGkgPSAoMCwgbWF0Y2gucHJvY2Vzc0ZuKShjb250ZXh0LCBpICsgMSk7CisgICAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKKyAgICAgICAgICBtYXRjaCA9IG51bGw7CisgICAgICAgICAgc3RhdGUgPSBudWxsOworCisgICAgICAgICAgaWYgKGkgPj0gaWkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlID0gKHN0YXRlIHx8IEluaXRpYWxTdGF0ZSlbZm5BcnJheVtpXV07CisKKyAgICAgICAgaWYgKCFzdGF0ZSB8fCBBcnJheS5pc0FycmF5KHN0YXRlKSkgeworICAgICAgICAgIGkrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQuaUN1cnIgPSBpOworICAgICAgICBpKys7CisKKyAgICAgICAgaWYgKHN0YXRlLmNoZWNrRm4gJiYgISgwLCBzdGF0ZS5jaGVja0ZuKShjb250ZXh0KSkgeworICAgICAgICAgIHN0YXRlID0gbnVsbDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoID0gc3RhdGU7CisgICAgICAgIHN0YXRlID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoOworICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gaTsKKyAgICB9LAorCisgICAgcHVzaChmbiwgYXJncykgeworICAgICAgdGhpcy5xdWV1ZS5mbkFycmF5LnB1c2goZm4pOworICAgICAgdGhpcy5xdWV1ZS5hcmdzQXJyYXkucHVzaChhcmdzKTsKKworICAgICAgdGhpcy5fb3B0aW1pemUoKTsKKyAgICB9LAorCisgICAgZmx1c2goKSB7CisgICAgICB3aGlsZSAodGhpcy5tYXRjaCkgeworICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnF1ZXVlLmZuQXJyYXkubGVuZ3RoOworICAgICAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSAoMCwgdGhpcy5tYXRjaC5wcm9jZXNzRm4pKHRoaXMuY29udGV4dCwgbGVuZ3RoKTsKKyAgICAgICAgdGhpcy5tYXRjaCA9IG51bGw7CisgICAgICAgIHRoaXMuc3RhdGUgPSBudWxsOworCisgICAgICAgIHRoaXMuX29wdGltaXplKCk7CisgICAgICB9CisgICAgfSwKKworICAgIHJlc2V0KCkgeworICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7CisgICAgICB0aGlzLm1hdGNoID0gbnVsbDsKKyAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7CisgICAgfQorCisgIH07CisgIHJldHVybiBRdWV1ZU9wdGltaXplcjsKK30oKTsKKwordmFyIE51bGxPcHRpbWl6ZXIgPSBmdW5jdGlvbiBOdWxsT3B0aW1pemVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gTnVsbE9wdGltaXplcihxdWV1ZSkgeworICAgIHRoaXMucXVldWUgPSBxdWV1ZTsKKyAgfQorCisgIE51bGxPcHRpbWl6ZXIucHJvdG90eXBlID0geworICAgIHB1c2goZm4sIGFyZ3MpIHsKKyAgICAgIHRoaXMucXVldWUuZm5BcnJheS5wdXNoKGZuKTsKKyAgICAgIHRoaXMucXVldWUuYXJnc0FycmF5LnB1c2goYXJncyk7CisgICAgfSwKKworICAgIGZsdXNoKCkge30sCisKKyAgICByZXNldCgpIHt9CisKKyAgfTsKKyAgcmV0dXJuIE51bGxPcHRpbWl6ZXI7Cit9KCk7CisKK3ZhciBPcGVyYXRvckxpc3QgPSBmdW5jdGlvbiBPcGVyYXRvckxpc3RDbG9zdXJlKCkgeworICB2YXIgQ0hVTktfU0laRSA9IDEwMDA7CisgIHZhciBDSFVOS19TSVpFX0FCT1VUID0gQ0hVTktfU0laRSAtIDU7CisKKyAgZnVuY3Rpb24gT3BlcmF0b3JMaXN0KGludGVudCwgc3RyZWFtU2luaykgeworICAgIHRoaXMuX3N0cmVhbVNpbmsgPSBzdHJlYW1TaW5rOworICAgIHRoaXMuZm5BcnJheSA9IFtdOworICAgIHRoaXMuYXJnc0FycmF5ID0gW107CisKKyAgICBpZiAoc3RyZWFtU2luayAmJiBpbnRlbnQgIT09ICJvcGxpc3QiKSB7CisgICAgICB0aGlzLm9wdGltaXplciA9IG5ldyBRdWV1ZU9wdGltaXplcih0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5vcHRpbWl6ZXIgPSBuZXcgTnVsbE9wdGltaXplcih0aGlzKTsKKyAgICB9CisKKyAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBTZXQoKTsKKyAgICB0aGlzLl90b3RhbExlbmd0aCA9IDA7CisgICAgdGhpcy53ZWlnaHQgPSAwOworICAgIHRoaXMuX3Jlc29sdmVkID0gc3RyZWFtU2luayA/IG51bGwgOiBQcm9taXNlLnJlc29sdmUoKTsKKyAgfQorCisgIE9wZXJhdG9yTGlzdC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGxlbmd0aCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmFyZ3NBcnJheS5sZW5ndGg7CisgICAgfSwKKworICAgIGdldCByZWFkeSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZCB8fCB0aGlzLl9zdHJlYW1TaW5rLnJlYWR5OworICAgIH0sCisKKyAgICBnZXQgdG90YWxMZW5ndGgoKSB7CisgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGggKyB0aGlzLmxlbmd0aDsKKyAgICB9LAorCisgICAgYWRkT3AoZm4sIGFyZ3MpIHsKKyAgICAgIHRoaXMub3B0aW1pemVyLnB1c2goZm4sIGFyZ3MpOworICAgICAgdGhpcy53ZWlnaHQrKzsKKworICAgICAgaWYgKHRoaXMuX3N0cmVhbVNpbmspIHsKKyAgICAgICAgaWYgKHRoaXMud2VpZ2h0ID49IENIVU5LX1NJWkUpIHsKKyAgICAgICAgICB0aGlzLmZsdXNoKCk7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy53ZWlnaHQgPj0gQ0hVTktfU0laRV9BQk9VVCAmJiAoZm4gPT09IF91dGlsLk9QUy5yZXN0b3JlIHx8IGZuID09PSBfdXRpbC5PUFMuZW5kVGV4dCkpIHsKKyAgICAgICAgICB0aGlzLmZsdXNoKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KSB7CisgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOworICAgICAgdGhpcy5hZGRPcChfdXRpbC5PUFMuZGVwZW5kZW5jeSwgW2RlcGVuZGVuY3ldKTsKKyAgICB9LAorCisgICAgYWRkRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcykgeworICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIGRlcGVuZGVuY2llcykgeworICAgICAgICB0aGlzLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSk7CisgICAgICB9CisgICAgfSwKKworICAgIGFkZE9wTGlzdChvcExpc3QpIHsKKyAgICAgIGlmICghKG9wTGlzdCBpbnN0YW5jZW9mIE9wZXJhdG9yTGlzdCkpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb3BMaXN0LmRlcGVuZGVuY2llcykgeworICAgICAgICB0aGlzLmRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG9wTGlzdC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHRoaXMuYWRkT3Aob3BMaXN0LmZuQXJyYXlbaV0sIG9wTGlzdC5hcmdzQXJyYXlbaV0pOworICAgICAgfQorICAgIH0sCisKKyAgICBnZXRJUigpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIGZuQXJyYXk6IHRoaXMuZm5BcnJheSwKKyAgICAgICAgYXJnc0FycmF5OiB0aGlzLmFyZ3NBcnJheSwKKyAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aAorICAgICAgfTsKKyAgICB9LAorCisgICAgZ2V0IF90cmFuc2ZlcnMoKSB7CisgICAgICBjb25zdCB0cmFuc2ZlcnMgPSBbXTsKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgZm5BcnJheSwKKyAgICAgICAgYXJnc0FycmF5LAorICAgICAgICBsZW5ndGgKKyAgICAgIH0gPSB0aGlzOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAoZm5BcnJheVtpXSkgeworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OgorICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OgorICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc0FycmF5W2ldWzBdOworICAgICAgICAgICAgOworCisgICAgICAgICAgICBpZiAoIWFyZy5jYWNoZWQpIHsKKyAgICAgICAgICAgICAgdHJhbnNmZXJzLnB1c2goYXJnLmRhdGEuYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRyYW5zZmVyczsKKyAgICB9LAorCisgICAgZmx1c2gobGFzdENodW5rID0gZmFsc2UpIHsKKyAgICAgIHRoaXMub3B0aW1pemVyLmZsdXNoKCk7CisgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKKyAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IGxlbmd0aDsKKworICAgICAgdGhpcy5fc3RyZWFtU2luay5lbnF1ZXVlKHsKKyAgICAgICAgZm5BcnJheTogdGhpcy5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXk6IHRoaXMuYXJnc0FycmF5LAorICAgICAgICBsYXN0Q2h1bmssCisgICAgICAgIGxlbmd0aAorICAgICAgfSwgMSwgdGhpcy5fdHJhbnNmZXJzKTsKKworICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuY2xlYXIoKTsKKyAgICAgIHRoaXMuZm5BcnJheS5sZW5ndGggPSAwOworICAgICAgdGhpcy5hcmdzQXJyYXkubGVuZ3RoID0gMDsKKyAgICAgIHRoaXMud2VpZ2h0ID0gMDsKKyAgICAgIHRoaXMub3B0aW1pemVyLnJlc2V0KCk7CisgICAgfQorCisgIH07CisgIHJldHVybiBPcGVyYXRvckxpc3Q7Cit9KCk7CisKK2V4cG9ydHMuT3BlcmF0b3JMaXN0ID0gT3BlcmF0b3JMaXN0OworCisvKioqLyB9KSwKKy8qIDI3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMud3JpdGVEaWN0ID0gd3JpdGVEaWN0OworZXhwb3J0cy5pbmNyZW1lbnRhbFVwZGF0ZSA9IGluY3JlbWVudGFsVXBkYXRlOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2NyeXB0byA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOworCitmdW5jdGlvbiB3cml0ZURpY3QoZGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKKyAgYnVmZmVyLnB1c2goIjw8Iik7CisKKyAgZm9yIChjb25zdCBrZXkgb2YgZGljdC5nZXRLZXlzKCkpIHsKKyAgICBidWZmZXIucHVzaChgIC8ke2tleX0gYCk7CisgICAgd3JpdGVWYWx1ZShkaWN0LmdldFJhdyhrZXkpLCBidWZmZXIsIHRyYW5zZm9ybSk7CisgIH0KKworICBidWZmZXIucHVzaCgiPj4iKTsKK30KKworZnVuY3Rpb24gd3JpdGVTdHJlYW0oc3RyZWFtLCBidWZmZXIsIHRyYW5zZm9ybSkgeworICB3cml0ZURpY3Qoc3RyZWFtLmRpY3QsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKKyAgYnVmZmVyLnB1c2goIiBzdHJlYW1cbiIpOworICBsZXQgc3RyaW5nID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKHN0cmVhbS5nZXRCeXRlcygpKTsKKworICBpZiAodHJhbnNmb3JtICE9PSBudWxsKSB7CisgICAgc3RyaW5nID0gdHJhbnNmb3JtLmVuY3J5cHRTdHJpbmcoc3RyaW5nKTsKKyAgfQorCisgIGJ1ZmZlci5wdXNoKHN0cmluZyk7CisgIGJ1ZmZlci5wdXNoKCJcbmVuZHN0cmVhbVxuIik7Cit9CisKK2Z1bmN0aW9uIHdyaXRlQXJyYXkoYXJyYXksIGJ1ZmZlciwgdHJhbnNmb3JtKSB7CisgIGJ1ZmZlci5wdXNoKCJbIik7CisgIGxldCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChjb25zdCB2YWwgb2YgYXJyYXkpIHsKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBidWZmZXIucHVzaCgiICIpOworICAgIH0gZWxzZSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKworICAgIHdyaXRlVmFsdWUodmFsLCBidWZmZXIsIHRyYW5zZm9ybSk7CisgIH0KKworICBidWZmZXIucHVzaCgiXSIpOworfQorCitmdW5jdGlvbiBudW1iZXJUb1N0cmluZyh2YWx1ZSkgeworICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKKyAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgfQorCisgIGNvbnN0IHJvdW5kZWRWYWx1ZSA9IE1hdGgucm91bmQodmFsdWUgKiAxMDApOworCisgIGlmIChyb3VuZGVkVmFsdWUgJSAxMDAgPT09IDApIHsKKyAgICByZXR1cm4gKHJvdW5kZWRWYWx1ZSAvIDEwMCkudG9TdHJpbmcoKTsKKyAgfQorCisgIGlmIChyb3VuZGVkVmFsdWUgJSAxMCA9PT0gMCkgeworICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKDEpOworICB9CisKKyAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoMik7Cit9CisKK2Z1bmN0aW9uIHdyaXRlVmFsdWUodmFsdWUsIGJ1ZmZlciwgdHJhbnNmb3JtKSB7CisgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh2YWx1ZSkpIHsKKyAgICBidWZmZXIucHVzaChgLyR7dmFsdWUubmFtZX1gKTsKKyAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKHZhbHVlKSkgeworICAgIGJ1ZmZlci5wdXNoKGAke3ZhbHVlLm51bX0gJHt2YWx1ZS5nZW59IFJgKTsKKyAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgeworICAgIHdyaXRlQXJyYXkodmFsdWUsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKKyAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CisgICAgaWYgKHRyYW5zZm9ybSAhPT0gbnVsbCkgeworICAgICAgdmFsdWUgPSB0cmFuc2Zvcm0uZW5jcnlwdFN0cmluZyh2YWx1ZSk7CisgICAgfQorCisgICAgYnVmZmVyLnB1c2goYCgkeygwLCBfdXRpbC5lc2NhcGVTdHJpbmcpKHZhbHVlKX0pYCk7CisgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikgeworICAgIGJ1ZmZlci5wdXNoKG51bWJlclRvU3RyaW5nKHZhbHVlKSk7CisgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkodmFsdWUpKSB7CisgICAgd3JpdGVEaWN0KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CisgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh2YWx1ZSkpIHsKKyAgICB3cml0ZVN0cmVhbSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pOworICB9Cit9CisKK2Z1bmN0aW9uIHdyaXRlSW50KG51bWJlciwgc2l6ZSwgb2Zmc2V0LCBidWZmZXIpIHsKKyAgZm9yIChsZXQgaSA9IHNpemUgKyBvZmZzZXQgLSAxOyBpID4gb2Zmc2V0IC0gMTsgaS0tKSB7CisgICAgYnVmZmVyW2ldID0gbnVtYmVyICYgMHhmZjsKKyAgICBudW1iZXIgPj49IDg7CisgIH0KKworICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTsKK30KKworZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyaW5nLCBvZmZzZXQsIGJ1ZmZlcikgeworICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgYnVmZmVyW29mZnNldCArIGldID0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweGZmOworICB9Cit9CisKK2Z1bmN0aW9uIGNvbXB1dGVNRDUoZmlsZXNpemUsIHhyZWZJbmZvKSB7CisgIGNvbnN0IHRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTsKKyAgY29uc3QgZmlsZW5hbWUgPSB4cmVmSW5mby5maWxlbmFtZSB8fCAiIjsKKyAgY29uc3QgbWQ1QnVmZmVyID0gW3RpbWUudG9TdHJpbmcoKSwgZmlsZW5hbWUsIGZpbGVzaXplLnRvU3RyaW5nKCldOworICBsZXQgbWQ1QnVmZmVyTGVuID0gbWQ1QnVmZmVyLnJlZHVjZSgoYSwgc3RyKSA9PiBhICsgc3RyLmxlbmd0aCwgMCk7CisKKyAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKHhyZWZJbmZvLmluZm8pKSB7CisgICAgbWQ1QnVmZmVyLnB1c2godmFsdWUpOworICAgIG1kNUJ1ZmZlckxlbiArPSB2YWx1ZS5sZW5ndGg7CisgIH0KKworICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KG1kNUJ1ZmZlckxlbik7CisgIGxldCBvZmZzZXQgPSAwOworCisgIGZvciAoY29uc3Qgc3RyIG9mIG1kNUJ1ZmZlcikgeworICAgIHdyaXRlU3RyaW5nKHN0ciwgb2Zmc2V0LCBhcnJheSk7CisgICAgb2Zmc2V0ICs9IHN0ci5sZW5ndGg7CisgIH0KKworICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKCgwLCBfY3J5cHRvLmNhbGN1bGF0ZU1ENSkoYXJyYXkpKTsKK30KKworZnVuY3Rpb24gaW5jcmVtZW50YWxVcGRhdGUob3JpZ2luYWxEYXRhLCB4cmVmSW5mbywgbmV3UmVmcykgeworICBjb25zdCBuZXdYcmVmID0gbmV3IF9wcmltaXRpdmVzLkRpY3QobnVsbCk7CisgIGNvbnN0IHJlZkZvclhyZWZUYWJsZSA9IHhyZWZJbmZvLm5ld1JlZjsKKyAgbGV0IGJ1ZmZlciwgYmFzZU9mZnNldDsKKyAgY29uc3QgbGFzdEJ5dGUgPSBvcmlnaW5hbERhdGFbb3JpZ2luYWxEYXRhLmxlbmd0aCAtIDFdOworCisgIGlmIChsYXN0Qnl0ZSA9PT0gMHgwYSB8fCBsYXN0Qnl0ZSA9PT0gMHgwZCkgeworICAgIGJ1ZmZlciA9IFtdOworICAgIGJhc2VPZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoOworICB9IGVsc2UgeworICAgIGJ1ZmZlciA9IFsiXG4iXTsKKyAgICBiYXNlT2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aCArIDE7CisgIH0KKworICBuZXdYcmVmLnNldCgiU2l6ZSIsIHJlZkZvclhyZWZUYWJsZS5udW0gKyAxKTsKKyAgbmV3WHJlZi5zZXQoIlByZXYiLCB4cmVmSW5mby5zdGFydFhSZWYpOworICBuZXdYcmVmLnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJYUmVmIikpOworCisgIGlmICh4cmVmSW5mby5yb290UmVmICE9PSBudWxsKSB7CisgICAgbmV3WHJlZi5zZXQoIlJvb3QiLCB4cmVmSW5mby5yb290UmVmKTsKKyAgfQorCisgIGlmICh4cmVmSW5mby5pbmZvUmVmICE9PSBudWxsKSB7CisgICAgbmV3WHJlZi5zZXQoIkluZm8iLCB4cmVmSW5mby5pbmZvUmVmKTsKKyAgfQorCisgIGlmICh4cmVmSW5mby5lbmNyeXB0ICE9PSBudWxsKSB7CisgICAgbmV3WHJlZi5zZXQoIkVuY3J5cHQiLCB4cmVmSW5mby5lbmNyeXB0KTsKKyAgfQorCisgIG5ld1JlZnMucHVzaCh7CisgICAgcmVmOiByZWZGb3JYcmVmVGFibGUsCisgICAgZGF0YTogIiIKKyAgfSk7CisgIG5ld1JlZnMgPSBuZXdSZWZzLnNvcnQoKGEsIGIpID0+IHsKKyAgICByZXR1cm4gYS5yZWYubnVtIC0gYi5yZWYubnVtOworICB9KTsKKyAgY29uc3QgeHJlZlRhYmxlRGF0YSA9IFtbMCwgMSwgMHhmZmZmXV07CisgIGNvbnN0IGluZGV4ZXMgPSBbMCwgMV07CisgIGxldCBtYXhPZmZzZXQgPSAwOworCisgIGZvciAoY29uc3QgeworICAgIHJlZiwKKyAgICBkYXRhCisgIH0gb2YgbmV3UmVmcykgeworICAgIG1heE9mZnNldCA9IE1hdGgubWF4KG1heE9mZnNldCwgYmFzZU9mZnNldCk7CisgICAgeHJlZlRhYmxlRGF0YS5wdXNoKFsxLCBiYXNlT2Zmc2V0LCBNYXRoLm1pbihyZWYuZ2VuLCAweGZmZmYpXSk7CisgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKKyAgICBpbmRleGVzLnB1c2gocmVmLm51bSk7CisgICAgaW5kZXhlcy5wdXNoKDEpOworICAgIGJ1ZmZlci5wdXNoKGRhdGEpOworICB9CisKKyAgbmV3WHJlZi5zZXQoIkluZGV4IiwgaW5kZXhlcyk7CisKKyAgaWYgKHhyZWZJbmZvLmZpbGVJZHMubGVuZ3RoICE9PSAwKSB7CisgICAgY29uc3QgbWQ1ID0gY29tcHV0ZU1ENShiYXNlT2Zmc2V0LCB4cmVmSW5mbyk7CisgICAgbmV3WHJlZi5zZXQoIklEIiwgW3hyZWZJbmZvLmZpbGVJZHNbMF0sIG1kNV0pOworICB9CisKKyAgY29uc3Qgb2Zmc2V0U2l6ZSA9IE1hdGguY2VpbChNYXRoLmxvZzIobWF4T2Zmc2V0KSAvIDgpOworICBjb25zdCBzaXplcyA9IFsxLCBvZmZzZXRTaXplLCAyXTsKKyAgY29uc3Qgc3RydWN0U2l6ZSA9IHNpemVzWzBdICsgc2l6ZXNbMV0gKyBzaXplc1syXTsKKyAgY29uc3QgdGFibGVMZW5ndGggPSBzdHJ1Y3RTaXplICogeHJlZlRhYmxlRGF0YS5sZW5ndGg7CisgIG5ld1hyZWYuc2V0KCJXIiwgc2l6ZXMpOworICBuZXdYcmVmLnNldCgiTGVuZ3RoIiwgdGFibGVMZW5ndGgpOworICBidWZmZXIucHVzaChgJHtyZWZGb3JYcmVmVGFibGUubnVtfSAke3JlZkZvclhyZWZUYWJsZS5nZW59IG9ialxuYCk7CisgIHdyaXRlRGljdChuZXdYcmVmLCBidWZmZXIsIG51bGwpOworICBidWZmZXIucHVzaCgiIHN0cmVhbVxuIik7CisgIGNvbnN0IGJ1ZmZlckxlbiA9IGJ1ZmZlci5yZWR1Y2UoKGEsIHN0cikgPT4gYSArIHN0ci5sZW5ndGgsIDApOworICBjb25zdCBmb290ZXIgPSBgXG5lbmRzdHJlYW1cbmVuZG9ialxuc3RhcnR4cmVmXG4ke2Jhc2VPZmZzZXR9XG4lJUVPRlxuYDsKKyAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShvcmlnaW5hbERhdGEubGVuZ3RoICsgYnVmZmVyTGVuICsgdGFibGVMZW5ndGggKyBmb290ZXIubGVuZ3RoKTsKKyAgYXJyYXkuc2V0KG9yaWdpbmFsRGF0YSk7CisgIGxldCBvZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoOworCisgIGZvciAoY29uc3Qgc3RyIG9mIGJ1ZmZlcikgeworICAgIHdyaXRlU3RyaW5nKHN0ciwgb2Zmc2V0LCBhcnJheSk7CisgICAgb2Zmc2V0ICs9IHN0ci5sZW5ndGg7CisgIH0KKworICBmb3IgKGNvbnN0IFt0eXBlLCBvYmpPZmZzZXQsIGdlbl0gb2YgeHJlZlRhYmxlRGF0YSkgeworICAgIG9mZnNldCA9IHdyaXRlSW50KHR5cGUsIHNpemVzWzBdLCBvZmZzZXQsIGFycmF5KTsKKyAgICBvZmZzZXQgPSB3cml0ZUludChvYmpPZmZzZXQsIHNpemVzWzFdLCBvZmZzZXQsIGFycmF5KTsKKyAgICBvZmZzZXQgPSB3cml0ZUludChnZW4sIHNpemVzWzJdLCBvZmZzZXQsIGFycmF5KTsKKyAgfQorCisgIHdyaXRlU3RyaW5nKGZvb3Rlciwgb2Zmc2V0LCBhcnJheSk7CisgIHJldHVybiBhcnJheTsKK30KKworLyoqKi8gfSksCisvKiAyOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBhcnRpYWxFdmFsdWF0b3IgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfY21hcCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2ZvbnRzID0gX193X3BkZmpzX3JlcXVpcmVfXygzMCk7CisKK3ZhciBfZW5jb2RpbmdzID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBfdW5pY29kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzYpOworCit2YXIgX3N0YW5kYXJkX2ZvbnRzID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7CisKK3ZhciBfcGF0dGVybiA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOworCit2YXIgX2Z1bmN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MCk7CisKK3ZhciBfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7CisKK3ZhciBfaW1hZ2VfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI0KTsKKwordmFyIF9iaWRpID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Mik7CisKK3ZhciBfY29sb3JzcGFjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOworCit2YXIgX2dseXBobGlzdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzQpOworCit2YXIgX21ldHJpY3MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKKwordmFyIF9tdXJtdXJoYXNoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NCk7CisKK3ZhciBfb3BlcmF0b3JfbGlzdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOworCit2YXIgX2ltYWdlID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NSk7CisKK2NvbnN0IERlZmF1bHRQYXJ0aWFsRXZhbHVhdG9yT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoeworICBtYXhJbWFnZVNpemU6IC0xLAorICBkaXNhYmxlRm9udEZhY2U6IGZhbHNlLAorICBpZ25vcmVFcnJvcnM6IGZhbHNlLAorICBpc0V2YWxTdXBwb3J0ZWQ6IHRydWUsCisgIGZvbnRFeHRyYVByb3BlcnRpZXM6IGZhbHNlCit9KTsKK2NvbnN0IFBhdHRlcm5UeXBlID0geworICBUSUxJTkc6IDEsCisgIFNIQURJTkc6IDIKK307Citjb25zdCBkZWZlcnJlZCA9IFByb21pc2UucmVzb2x2ZSgpOworCitmdW5jdGlvbiBub3JtYWxpemVCbGVuZE1vZGUodmFsdWUsIHBhcnNpbmdBcnJheSA9IGZhbHNlKSB7CisgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgeworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IG1heWJlQk0gPSBub3JtYWxpemVCbGVuZE1vZGUodmFsdWVbaV0sIHRydWUpOworCisgICAgICBpZiAobWF5YmVCTSkgeworICAgICAgICByZXR1cm4gbWF5YmVCTTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAoMCwgX3V0aWwud2FybikoYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGUgQXJyYXk6ICR7dmFsdWV9YCk7CisgICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CisgIH0KKworICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHZhbHVlKSkgeworICAgIGlmIChwYXJzaW5nQXJyYXkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiAic291cmNlLW92ZXIiOworICB9CisKKyAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CisgICAgY2FzZSAiTm9ybWFsIjoKKyAgICBjYXNlICJDb21wYXRpYmxlIjoKKyAgICAgIHJldHVybiAic291cmNlLW92ZXIiOworCisgICAgY2FzZSAiTXVsdGlwbHkiOgorICAgICAgcmV0dXJuICJtdWx0aXBseSI7CisKKyAgICBjYXNlICJTY3JlZW4iOgorICAgICAgcmV0dXJuICJzY3JlZW4iOworCisgICAgY2FzZSAiT3ZlcmxheSI6CisgICAgICByZXR1cm4gIm92ZXJsYXkiOworCisgICAgY2FzZSAiRGFya2VuIjoKKyAgICAgIHJldHVybiAiZGFya2VuIjsKKworICAgIGNhc2UgIkxpZ2h0ZW4iOgorICAgICAgcmV0dXJuICJsaWdodGVuIjsKKworICAgIGNhc2UgIkNvbG9yRG9kZ2UiOgorICAgICAgcmV0dXJuICJjb2xvci1kb2RnZSI7CisKKyAgICBjYXNlICJDb2xvckJ1cm4iOgorICAgICAgcmV0dXJuICJjb2xvci1idXJuIjsKKworICAgIGNhc2UgIkhhcmRMaWdodCI6CisgICAgICByZXR1cm4gImhhcmQtbGlnaHQiOworCisgICAgY2FzZSAiU29mdExpZ2h0IjoKKyAgICAgIHJldHVybiAic29mdC1saWdodCI7CisKKyAgICBjYXNlICJEaWZmZXJlbmNlIjoKKyAgICAgIHJldHVybiAiZGlmZmVyZW5jZSI7CisKKyAgICBjYXNlICJFeGNsdXNpb24iOgorICAgICAgcmV0dXJuICJleGNsdXNpb24iOworCisgICAgY2FzZSAiSHVlIjoKKyAgICAgIHJldHVybiAiaHVlIjsKKworICAgIGNhc2UgIlNhdHVyYXRpb24iOgorICAgICAgcmV0dXJuICJzYXR1cmF0aW9uIjsKKworICAgIGNhc2UgIkNvbG9yIjoKKyAgICAgIHJldHVybiAiY29sb3IiOworCisgICAgY2FzZSAiTHVtaW5vc2l0eSI6CisgICAgICByZXR1cm4gImx1bWlub3NpdHkiOworICB9CisKKyAgaWYgKHBhcnNpbmdBcnJheSkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgKDAsIF91dGlsLndhcm4pKGBVbnN1cHBvcnRlZCBibGVuZCBtb2RlOiAke3ZhbHVlLm5hbWV9YCk7CisgIHJldHVybiAic291cmNlLW92ZXIiOworfQorCitjbGFzcyBUaW1lU2xvdE1hbmFnZXIgeworICBzdGF0aWMgZ2V0IFRJTUVfU0xPVF9EVVJBVElPTl9NUygpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIlRJTUVfU0xPVF9EVVJBVElPTl9NUyIsIDIwKTsKKyAgfQorCisgIHN0YXRpYyBnZXQgQ0hFQ0tfVElNRV9FVkVSWSgpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIkNIRUNLX1RJTUVfRVZFUlkiLCAxMDApOworICB9CisKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5yZXNldCgpOworICB9CisKKyAgY2hlY2soKSB7CisgICAgaWYgKCsrdGhpcy5jaGVja2VkIDwgVGltZVNsb3RNYW5hZ2VyLkNIRUNLX1RJTUVfRVZFUlkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aGlzLmNoZWNrZWQgPSAwOworICAgIHJldHVybiB0aGlzLmVuZFRpbWUgPD0gRGF0ZS5ub3coKTsKKyAgfQorCisgIHJlc2V0KCkgeworICAgIHRoaXMuZW5kVGltZSA9IERhdGUubm93KCkgKyBUaW1lU2xvdE1hbmFnZXIuVElNRV9TTE9UX0RVUkFUSU9OX01TOworICAgIHRoaXMuY2hlY2tlZCA9IDA7CisgIH0KKworfQorCitjbGFzcyBQYXJ0aWFsRXZhbHVhdG9yIHsKKyAgY29uc3RydWN0b3IoeworICAgIHhyZWYsCisgICAgaGFuZGxlciwKKyAgICBwYWdlSW5kZXgsCisgICAgaWRGYWN0b3J5LAorICAgIGZvbnRDYWNoZSwKKyAgICBidWlsdEluQ01hcENhY2hlLAorICAgIGdsb2JhbEltYWdlQ2FjaGUsCisgICAgb3B0aW9ucyA9IG51bGwKKyAgfSkgeworICAgIHRoaXMueHJlZiA9IHhyZWY7CisgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKKyAgICB0aGlzLmlkRmFjdG9yeSA9IGlkRmFjdG9yeTsKKyAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKKyAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBidWlsdEluQ01hcENhY2hlOworICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IGdsb2JhbEltYWdlQ2FjaGU7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnM7CisgICAgdGhpcy5wYXJzaW5nVHlwZTNGb250ID0gZmFsc2U7CisgICAgdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kID0gdGhpcy5mZXRjaEJ1aWx0SW5DTWFwLmJpbmQodGhpcyk7CisgIH0KKworICBnZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpIHsKKyAgICBjb25zdCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBuZXcgX2Z1bmN0aW9uLlBERkZ1bmN0aW9uRmFjdG9yeSh7CisgICAgICB4cmVmOiB0aGlzLnhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc0V2YWxTdXBwb3J0ZWQKKyAgICB9KTsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIl9wZGZGdW5jdGlvbkZhY3RvcnkiLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworICB9CisKKyAgY2xvbmUobmV3T3B0aW9ucyA9IERlZmF1bHRQYXJ0aWFsRXZhbHVhdG9yT3B0aW9ucykgeworICAgIHZhciBuZXdFdmFsdWF0b3IgPSBPYmplY3QuY3JlYXRlKHRoaXMpOworICAgIG5ld0V2YWx1YXRvci5vcHRpb25zID0gbmV3T3B0aW9uczsKKyAgICByZXR1cm4gbmV3RXZhbHVhdG9yOworICB9CisKKyAgaGFzQmxlbmRNb2RlcyhyZXNvdXJjZXMpIHsKKyAgICBpZiAoIShyZXNvdXJjZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKTsKKworICAgIGlmIChyZXNvdXJjZXMub2JqSWQpIHsKKyAgICAgIHByb2Nlc3NlZC5wdXQocmVzb3VyY2VzLm9iaklkKTsKKyAgICB9CisKKyAgICB2YXIgbm9kZXMgPSBbcmVzb3VyY2VzXSwKKyAgICAgICAgeHJlZiA9IHRoaXMueHJlZjsKKworICAgIHdoaWxlIChub2Rlcy5sZW5ndGgpIHsKKyAgICAgIHZhciBub2RlID0gbm9kZXMuc2hpZnQoKTsKKyAgICAgIHZhciBncmFwaGljU3RhdGVzID0gbm9kZS5nZXQoIkV4dEdTdGF0ZSIpOworCisgICAgICBpZiAoZ3JhcGhpY1N0YXRlcyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKKyAgICAgICAgZm9yIChsZXQgZ3JhcGhpY1N0YXRlIG9mIGdyYXBoaWNTdGF0ZXMuZ2V0UmF3VmFsdWVzKCkpIHsKKyAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICAgICAgICBpZiAocHJvY2Vzc2VkLmhhcyhncmFwaGljU3RhdGUpKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBncmFwaGljU3RhdGUgPSB4cmVmLmZldGNoKGdyYXBoaWNTdGF0ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dChncmFwaGljU3RhdGUpOworICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke2V4fSIuYCk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghKGdyYXBoaWNTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlLm9iaklkKSB7CisgICAgICAgICAgICBwcm9jZXNzZWQucHV0KGdyYXBoaWNTdGF0ZS5vYmpJZCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgYm0gPSBncmFwaGljU3RhdGUuZ2V0KCJCTSIpOworCisgICAgICAgICAgaWYgKGJtIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgeworICAgICAgICAgICAgaWYgKGJtLm5hbWUgIT09ICJOb3JtYWwiKSB7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoYm0gIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KGJtKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGJtKSB7CisgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSAmJiBlbGVtZW50Lm5hbWUgIT09ICJOb3JtYWwiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIHhPYmplY3RzID0gbm9kZS5nZXQoIlhPYmplY3QiKTsKKworICAgICAgaWYgKCEoeE9iamVjdHMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZm9yIChsZXQgeE9iamVjdCBvZiB4T2JqZWN0cy5nZXRSYXdWYWx1ZXMoKSkgeworICAgICAgICBpZiAoeE9iamVjdCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgeworICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKHhPYmplY3QpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgeE9iamVjdCA9IHhyZWYuZmV0Y2goeE9iamVjdCk7CisgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9jZXNzZWQucHV0KHhPYmplY3QpOworICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgWE9iamVjdDogIiR7ZXh9Ii5gKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh4T2JqZWN0KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHhPYmplY3QuZGljdC5vYmpJZCkgeworICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeE9iamVjdC5kaWN0Lm9iaklkKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB4UmVzb3VyY2VzID0geE9iamVjdC5kaWN0LmdldCgiUmVzb3VyY2VzIik7CisKKyAgICAgICAgaWYgKCEoeFJlc291cmNlcyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeFJlc291cmNlcy5vYmpJZCAmJiBwcm9jZXNzZWQuaGFzKHhSZXNvdXJjZXMub2JqSWQpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBub2Rlcy5wdXNoKHhSZXNvdXJjZXMpOworCisgICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkKSB7CisgICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4UmVzb3VyY2VzLm9iaklkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGFzeW5jIGZldGNoQnVpbHRJbkNNYXAobmFtZSkgeworICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuZ2V0KG5hbWUpOworCisgICAgaWYgKGNhY2hlZERhdGEpIHsKKyAgICAgIHJldHVybiBjYWNoZWREYXRhOworICAgIH0KKworICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5oYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJGZXRjaEJ1aWx0SW5DTWFwIiwgeworICAgICAgbmFtZQorICAgIH0pOworICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOworICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICBmdW5jdGlvbiBwdW1wKCkgeworICAgICAgICByZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHsKKyAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICBkb25lCisgICAgICAgIH0pIHsKKyAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHJlc29sdmUodmFsdWUpOworICAgICAgICAgIHB1bXAoKTsKKyAgICAgICAgfSwgcmVqZWN0KTsKKyAgICAgIH0KKworICAgICAgcHVtcCgpOworICAgIH0pOworCisgICAgaWYgKGRhdGEuY29tcHJlc3Npb25UeXBlICE9PSBfdXRpbC5DTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpIHsKKyAgICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZS5zZXQobmFtZSwgZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBhc3luYyBidWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgeG9iaiwgc21hc2ssIG9wZXJhdG9yTGlzdCwgdGFzaywgaW5pdGlhbFN0YXRlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIHZhciBkaWN0ID0geG9iai5kaWN0OworICAgIHZhciBtYXRyaXggPSBkaWN0LmdldEFycmF5KCJNYXRyaXgiKTsKKyAgICB2YXIgYmJveCA9IGRpY3QuZ2V0QXJyYXkoIkJCb3giKTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7CisgICAgICBiYm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KGJib3gpOworICAgIH0gZWxzZSB7CisgICAgICBiYm94ID0gbnVsbDsKKyAgICB9CisKKyAgICBsZXQgb3B0aW9uYWxDb250ZW50ID0gbnVsbDsKKworICAgIGlmIChkaWN0LmhhcygiT0MiKSkgeworICAgICAgb3B0aW9uYWxDb250ZW50ID0gYXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhkaWN0LmdldCgiT0MiKSwgcmVzb3VyY2VzKTsKKyAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBvcHRpb25hbENvbnRlbnRdKTsKKyAgICB9CisKKyAgICB2YXIgZ3JvdXAgPSBkaWN0LmdldCgiR3JvdXAiKTsKKworICAgIGlmIChncm91cCkgeworICAgICAgdmFyIGdyb3VwT3B0aW9ucyA9IHsKKyAgICAgICAgbWF0cml4LAorICAgICAgICBiYm94LAorICAgICAgICBzbWFzaywKKyAgICAgICAgaXNvbGF0ZWQ6IGZhbHNlLAorICAgICAgICBrbm9ja291dDogZmFsc2UKKyAgICAgIH07CisgICAgICB2YXIgZ3JvdXBTdWJ0eXBlID0gZ3JvdXAuZ2V0KCJTIik7CisgICAgICB2YXIgY29sb3JTcGFjZSA9IG51bGw7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShncm91cFN1YnR5cGUsICJUcmFuc3BhcmVuY3kiKSkgeworICAgICAgICBncm91cE9wdGlvbnMuaXNvbGF0ZWQgPSBncm91cC5nZXQoIkkiKSB8fCBmYWxzZTsKKyAgICAgICAgZ3JvdXBPcHRpb25zLmtub2Nrb3V0ID0gZ3JvdXAuZ2V0KCJLIikgfHwgZmFsc2U7CisKKyAgICAgICAgaWYgKGdyb3VwLmhhcygiQ1MiKSkgeworICAgICAgICAgIGNvbnN0IGNzID0gZ3JvdXAuZ2V0UmF3KCJDUyIpOworCisgICAgICAgICAgY29uc3QgY2FjaGVkQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKGNzLCB0aGlzLnhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKworICAgICAgICAgIGlmIChjYWNoZWRDb2xvclNwYWNlKSB7CisgICAgICAgICAgICBjb2xvclNwYWNlID0gY2FjaGVkQ29sb3JTcGFjZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29sb3JTcGFjZSA9IGF3YWl0IHRoaXMucGFyc2VDb2xvclNwYWNlKHsKKyAgICAgICAgICAgICAgY3MsCisgICAgICAgICAgICAgIHJlc291cmNlcywKKyAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc21hc2sgJiYgc21hc2suYmFja2Ryb3ApIHsKKyAgICAgICAgY29sb3JTcGFjZSA9IGNvbG9yU3BhY2UgfHwgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjsKKyAgICAgICAgc21hc2suYmFja2Ryb3AgPSBjb2xvclNwYWNlLmdldFJnYihzbWFzay5iYWNrZHJvcCwgMCk7CisgICAgICB9CisKKyAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5Hcm91cCwgW2dyb3VwT3B0aW9uc10pOworICAgIH0KKworICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luLCBbbWF0cml4LCBiYm94XSk7CisgICAgcmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgIHN0cmVhbTogeG9iaiwKKyAgICAgIHRhc2ssCisgICAgICByZXNvdXJjZXM6IGRpY3QuZ2V0KCJSZXNvdXJjZXMiKSB8fCByZXNvdXJjZXMsCisgICAgICBvcGVyYXRvckxpc3QsCisgICAgICBpbml0aWFsU3RhdGUKKyAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucGFpbnRGb3JtWE9iamVjdEVuZCwgW10pOworCisgICAgICBpZiAoZ3JvdXApIHsKKyAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5lbmRHcm91cCwgW2dyb3VwT3B0aW9uc10pOworICAgICAgfQorCisgICAgICBpZiAob3B0aW9uYWxDb250ZW50KSB7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuZW5kTWFya2VkQ29udGVudCwgW10pOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5ID0gZmFsc2UpIHsKKyAgICBjb25zdCB0cmFuc2ZlcnMgPSBpbWdEYXRhID8gW2ltZ0RhdGEuZGF0YS5idWZmZXJdIDogbnVsbDsKKworICAgIGlmICh0aGlzLnBhcnNpbmdUeXBlM0ZvbnQgfHwgY2FjaGVHbG9iYWxseSkgeworICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbb2JqSWQsICJJbWFnZSIsIGltZ0RhdGFdLCB0cmFuc2ZlcnMpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgib2JqIiwgW29iaklkLCB0aGlzLnBhZ2VJbmRleCwgIkltYWdlIiwgaW1nRGF0YV0sIHRyYW5zZmVycyk7CisgIH0KKworICBhc3luYyBidWlsZFBhaW50SW1hZ2VYT2JqZWN0KHsKKyAgICByZXNvdXJjZXMsCisgICAgaW1hZ2UsCisgICAgaXNJbmxpbmUgPSBmYWxzZSwKKyAgICBvcGVyYXRvckxpc3QsCisgICAgY2FjaGVLZXksCisgICAgbG9jYWxJbWFnZUNhY2hlLAorICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgIH0pIHsKKyAgICB2YXIgZGljdCA9IGltYWdlLmRpY3Q7CisgICAgY29uc3QgaW1hZ2VSZWYgPSBkaWN0Lm9iaklkOworICAgIHZhciB3ID0gZGljdC5nZXQoIldpZHRoIiwgIlciKTsKKyAgICB2YXIgaCA9IGRpY3QuZ2V0KCJIZWlnaHQiLCAiSCIpOworCisgICAgaWYgKCEodyAmJiAoMCwgX3V0aWwuaXNOdW0pKHcpKSB8fCAhKGggJiYgKDAsIF91dGlsLmlzTnVtKShoKSkpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiSW1hZ2UgZGltZW5zaW9ucyBhcmUgbWlzc2luZywgb3Igbm90IG51bWJlcnMuIik7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIHZhciBtYXhJbWFnZVNpemUgPSB0aGlzLm9wdGlvbnMubWF4SW1hZ2VTaXplOworCisgICAgaWYgKG1heEltYWdlU2l6ZSAhPT0gLTEgJiYgdyAqIGggPiBtYXhJbWFnZVNpemUpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiSW1hZ2UgZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIHNpemUgYW5kIHdhcyByZW1vdmVkLiIpOworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICB2YXIgaW1hZ2VNYXNrID0gZGljdC5nZXQoIkltYWdlTWFzayIsICJJTSIpIHx8IGZhbHNlOworICAgIHZhciBpbWdEYXRhLCBhcmdzOworCisgICAgaWYgKGltYWdlTWFzaykgeworICAgICAgdmFyIHdpZHRoID0gZGljdC5nZXQoIldpZHRoIiwgIlciKTsKKyAgICAgIHZhciBoZWlnaHQgPSBkaWN0LmdldCgiSGVpZ2h0IiwgIkgiKTsKKyAgICAgIHZhciBiaXRTdHJpZGVMZW5ndGggPSB3aWR0aCArIDcgPj4gMzsKKyAgICAgIHZhciBpbWdBcnJheSA9IGltYWdlLmdldEJ5dGVzKGJpdFN0cmlkZUxlbmd0aCAqIGhlaWdodCwgdHJ1ZSk7CisgICAgICB2YXIgZGVjb2RlID0gZGljdC5nZXRBcnJheSgiRGVjb2RlIiwgIkQiKTsKKyAgICAgIGltZ0RhdGEgPSBfaW1hZ2UuUERGSW1hZ2UuY3JlYXRlTWFzayh7CisgICAgICAgIGltZ0FycmF5LAorICAgICAgICB3aWR0aCwKKyAgICAgICAgaGVpZ2h0LAorICAgICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbTogaW1hZ2UgaW5zdGFuY2VvZiBfc3RyZWFtLkRlY29kZVN0cmVhbSwKKyAgICAgICAgaW52ZXJzZURlY29kZTogISFkZWNvZGUgJiYgZGVjb2RlWzBdID4gMAorICAgICAgfSk7CisgICAgICBpbWdEYXRhLmNhY2hlZCA9ICEhY2FjaGVLZXk7CisgICAgICBhcmdzID0gW2ltZ0RhdGFdOworICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsIGFyZ3MpOworCisgICAgICBpZiAoY2FjaGVLZXkpIHsKKyAgICAgICAgbG9jYWxJbWFnZUNhY2hlLnNldChjYWNoZUtleSwgaW1hZ2VSZWYsIHsKKyAgICAgICAgICBmbjogX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCwKKyAgICAgICAgICBhcmdzCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIHZhciBzb2Z0TWFzayA9IGRpY3QuZ2V0KCJTTWFzayIsICJTTSIpIHx8IGZhbHNlOworICAgIHZhciBtYXNrID0gZGljdC5nZXQoIk1hc2siKSB8fCBmYWxzZTsKKyAgICB2YXIgU01BTExfSU1BR0VfRElNRU5TSU9OUyA9IDIwMDsKKworICAgIGlmIChpc0lubGluZSAmJiAhc29mdE1hc2sgJiYgIW1hc2sgJiYgdyArIGggPCBTTUFMTF9JTUFHRV9ESU1FTlNJT05TKSB7CisgICAgICBjb25zdCBpbWFnZU9iaiA9IG5ldyBfaW1hZ2UuUERGSW1hZ2UoeworICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCisgICAgICAgIHJlczogcmVzb3VyY2VzLAorICAgICAgICBpbWFnZSwKKyAgICAgICAgaXNJbmxpbmUsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSk7CisgICAgICBpbWdEYXRhID0gaW1hZ2VPYmouY3JlYXRlSW1hZ2VEYXRhKHRydWUpOworICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdCwgW2ltZ0RhdGFdKTsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgbGV0IG9iaklkID0gYGltZ18ke3RoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCl9YCwKKyAgICAgICAgY2FjaGVHbG9iYWxseSA9IGZhbHNlOworCisgICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCkgeworICAgICAgb2JqSWQgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV90eXBlM18ke29iaklkfWA7CisgICAgfSBlbHNlIGlmIChpbWFnZVJlZikgeworICAgICAgY2FjaGVHbG9iYWxseSA9IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zaG91bGRDYWNoZShpbWFnZVJlZiwgdGhpcy5wYWdlSW5kZXgpOworCisgICAgICBpZiAoY2FjaGVHbG9iYWxseSkgeworICAgICAgICBvYmpJZCA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9XyR7b2JqSWR9YDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShvYmpJZCk7CisgICAgYXJncyA9IFtvYmpJZCwgdywgaF07CisKKyAgICBfaW1hZ2UuUERGSW1hZ2UuYnVpbGRJbWFnZSh7CisgICAgICB4cmVmOiB0aGlzLnhyZWYsCisgICAgICByZXM6IHJlc291cmNlcywKKyAgICAgIGltYWdlLAorICAgICAgaXNJbmxpbmUsCisgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgfSkudGhlbihpbWFnZU9iaiA9PiB7CisgICAgICBpbWdEYXRhID0gaW1hZ2VPYmouY3JlYXRlSW1hZ2VEYXRhKGZhbHNlKTsKKyAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgaW1nRGF0YSwgY2FjaGVHbG9iYWxseSk7CisgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgICgwLCBfdXRpbC53YXJuKShgVW5hYmxlIHRvIGRlY29kZSBpbWFnZSAiJHtvYmpJZH0iOiAiJHtyZWFzb259Ii5gKTsKKyAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgbnVsbCwgY2FjaGVHbG9iYWxseSk7CisgICAgfSk7CisKKyAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LCBhcmdzKTsKKworICAgIGlmIChjYWNoZUtleSkgeworICAgICAgbG9jYWxJbWFnZUNhY2hlLnNldChjYWNoZUtleSwgaW1hZ2VSZWYsIHsKKyAgICAgICAgZm46IF91dGlsLk9QUy5wYWludEltYWdlWE9iamVjdCwKKyAgICAgICAgYXJncworICAgICAgfSk7CisKKyAgICAgIGlmIChpbWFnZVJlZikgeworICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSghaXNJbmxpbmUsICJDYW5ub3QgY2FjaGUgYW4gaW5saW5lIGltYWdlIGdsb2JhbGx5LiIpOworICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuYWRkUGFnZUluZGV4KGltYWdlUmVmLCB0aGlzLnBhZ2VJbmRleCk7CisKKyAgICAgICAgaWYgKGNhY2hlR2xvYmFsbHkpIHsKKyAgICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShpbWFnZVJlZiwgeworICAgICAgICAgICAgb2JqSWQsCisgICAgICAgICAgICBmbjogX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LAorICAgICAgICAgICAgYXJncworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgfQorCisgIGhhbmRsZVNNYXNrKHNtYXNrLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIHZhciBzbWFza0NvbnRlbnQgPSBzbWFzay5nZXQoIkciKTsKKyAgICB2YXIgc21hc2tPcHRpb25zID0geworICAgICAgc3VidHlwZTogc21hc2suZ2V0KCJTIikubmFtZSwKKyAgICAgIGJhY2tkcm9wOiBzbWFzay5nZXQoIkJDIikKKyAgICB9OworICAgIHZhciB0cmFuc2Zlck9iaiA9IHNtYXNrLmdldCgiVFIiKTsKKworICAgIGlmICgoMCwgX2Z1bmN0aW9uLmlzUERGRnVuY3Rpb24pKHRyYW5zZmVyT2JqKSkgeworICAgICAgY29uc3QgdHJhbnNmZXJGbiA9IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUodHJhbnNmZXJPYmopOworCisgICAgICB2YXIgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpOworICAgICAgdmFyIHRtcCA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgdG1wWzBdID0gaSAvIDI1NTsKKyAgICAgICAgdHJhbnNmZXJGbih0bXAsIDAsIHRtcCwgMCk7CisgICAgICAgIHRyYW5zZmVyTWFwW2ldID0gdG1wWzBdICogMjU1IHwgMDsKKyAgICAgIH0KKworICAgICAgc21hc2tPcHRpb25zLnRyYW5zZmVyTWFwID0gdHJhbnNmZXJNYXA7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuYnVpbGRGb3JtWE9iamVjdChyZXNvdXJjZXMsIHNtYXNrQ29udGVudCwgc21hc2tPcHRpb25zLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZS5jbG9uZSgpLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisgIH0KKworICBoYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKHRyKSB7CisgICAgbGV0IHRyYW5zZmVyQXJyYXk7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheSh0cikpIHsKKyAgICAgIHRyYW5zZmVyQXJyYXkgPSB0cjsKKyAgICB9IGVsc2UgaWYgKCgwLCBfZnVuY3Rpb24uaXNQREZGdW5jdGlvbikodHIpKSB7CisgICAgICB0cmFuc2ZlckFycmF5ID0gW3RyXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgdHJhbnNmZXJNYXBzID0gW107CisgICAgbGV0IG51bUZucyA9IDAsCisgICAgICAgIG51bUVmZmVjdGZ1bEZucyA9IDA7CisKKyAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRyYW5zZmVyQXJyYXkpIHsKKyAgICAgIGNvbnN0IHRyYW5zZmVyT2JqID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZW50cnkpOworICAgICAgbnVtRm5zKys7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh0cmFuc2Zlck9iaiwgIklkZW50aXR5IikpIHsKKyAgICAgICAgdHJhbnNmZXJNYXBzLnB1c2gobnVsbCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmICghKDAsIF9mdW5jdGlvbi5pc1BERkZ1bmN0aW9uKSh0cmFuc2Zlck9iaikpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHRyYW5zZmVyRm4gPSB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHRyYW5zZmVyT2JqKTsKKworICAgICAgY29uc3QgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpLAorICAgICAgICAgICAgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKKworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAyNTY7IGorKykgeworICAgICAgICB0bXBbMF0gPSBqIC8gMjU1OworICAgICAgICB0cmFuc2ZlckZuKHRtcCwgMCwgdG1wLCAwKTsKKyAgICAgICAgdHJhbnNmZXJNYXBbal0gPSB0bXBbMF0gKiAyNTUgfCAwOworICAgICAgfQorCisgICAgICB0cmFuc2Zlck1hcHMucHVzaCh0cmFuc2Zlck1hcCk7CisgICAgICBudW1FZmZlY3RmdWxGbnMrKzsKKyAgICB9CisKKyAgICBpZiAoIShudW1GbnMgPT09IDEgfHwgbnVtRm5zID09PSA0KSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaWYgKG51bUVmZmVjdGZ1bEZucyA9PT0gMCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIHRyYW5zZmVyTWFwczsKKyAgfQorCisgIGhhbmRsZVRpbGluZ1R5cGUoZm4sIGFyZ3MsIHJlc291cmNlcywgcGF0dGVybiwgcGF0dGVybkRpY3QsIG9wZXJhdG9yTGlzdCwgdGFzaykgeworICAgIGNvbnN0IHRpbGluZ09wTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKKworICAgIGNvbnN0IHBhdHRlcm5SZXNvdXJjZXMgPSBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIGRpY3RBcnJheTogW3BhdHRlcm5EaWN0LmdldCgiUmVzb3VyY2VzIiksIHJlc291cmNlc10KKyAgICB9KTsKKworICAgIHJldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7CisgICAgICBzdHJlYW06IHBhdHRlcm4sCisgICAgICB0YXNrLAorICAgICAgcmVzb3VyY2VzOiBwYXR0ZXJuUmVzb3VyY2VzLAorICAgICAgb3BlcmF0b3JMaXN0OiB0aWxpbmdPcExpc3QKKyAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiAoMCwgX3BhdHRlcm4uZ2V0VGlsaW5nUGF0dGVybklSKSh7CisgICAgICAgIGZuQXJyYXk6IHRpbGluZ09wTGlzdC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXk6IHRpbGluZ09wTGlzdC5hcmdzQXJyYXkKKyAgICAgIH0sIHBhdHRlcm5EaWN0LCBhcmdzKTsKKyAgICB9KS50aGVuKGZ1bmN0aW9uICh0aWxpbmdQYXR0ZXJuSVIpIHsKKyAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmNpZXModGlsaW5nT3BMaXN0LmRlcGVuZGVuY2llcyk7CisgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHRpbGluZ1BhdHRlcm5JUik7CisgICAgfSwgcmVhc29uID0+IHsKKyAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvclRpbGluZ1BhdHRlcm4KKyAgICAgICAgfSk7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgaGFuZGxlVGlsaW5nVHlwZSAtIGlnbm9yaW5nIHBhdHRlcm46ICIke3JlYXNvbn0iLmApOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRocm93IHJlYXNvbjsKKyAgICB9KTsKKyAgfQorCisgIGhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBmb250QXJncywgZm9udFJlZiwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZSkgeworICAgIHZhciBmb250TmFtZSwKKyAgICAgICAgZm9udFNpemUgPSAwOworCisgICAgaWYgKGZvbnRBcmdzKSB7CisgICAgICBmb250QXJncyA9IGZvbnRBcmdzLnNsaWNlKCk7CisgICAgICBmb250TmFtZSA9IGZvbnRBcmdzWzBdLm5hbWU7CisgICAgICBmb250U2l6ZSA9IGZvbnRBcmdzWzFdOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmxvYWRGb250KGZvbnROYW1lLCBmb250UmVmLCByZXNvdXJjZXMpLnRoZW4odHJhbnNsYXRlZCA9PiB7CisgICAgICBpZiAoIXRyYW5zbGF0ZWQuZm9udC5pc1R5cGUzRm9udCkgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlZDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQubG9hZFR5cGUzRGF0YSh0aGlzLCByZXNvdXJjZXMsIHRhc2spLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRyYW5zbGF0ZWQudHlwZTNEZXBlbmRlbmNpZXMpOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlZDsKKyAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRMb2FkVHlwZTMKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBuZXcgVHJhbnNsYXRlZEZvbnQoeworICAgICAgICAgIGxvYWRlZE5hbWU6ICJnX2ZvbnRfZXJyb3IiLAorICAgICAgICAgIGZvbnQ6IG5ldyBfZm9udHMuRXJyb3JGb250KGBUeXBlMyBmb250IGxvYWQgZXJyb3I6ICR7cmVhc29ufWApLAorICAgICAgICAgIGRpY3Q6IHRyYW5zbGF0ZWQuZm9udCwKKyAgICAgICAgICBleHRyYVByb3BlcnRpZXM6IHRoaXMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfSkudGhlbih0cmFuc2xhdGVkID0+IHsKKyAgICAgIHN0YXRlLmZvbnQgPSB0cmFuc2xhdGVkLmZvbnQ7CisgICAgICBzdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplOworICAgICAgc3RhdGUuZm9udE5hbWUgPSBmb250TmFtZTsKKyAgICAgIHRyYW5zbGF0ZWQuc2VuZCh0aGlzLmhhbmRsZXIpOworICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQubG9hZGVkTmFtZTsKKyAgICB9KTsKKyAgfQorCisgIGhhbmRsZVRleHQoY2hhcnMsIHN0YXRlKSB7CisgICAgY29uc3QgZm9udCA9IHN0YXRlLmZvbnQ7CisgICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGNoYXJzKTsKKworICAgIGlmIChmb250LmRhdGEpIHsKKyAgICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEoc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTsKKworICAgICAgaWYgKGlzQWRkVG9QYXRoU2V0IHx8IHN0YXRlLmZpbGxDb2xvclNwYWNlLm5hbWUgPT09ICJQYXR0ZXJuIiB8fCBmb250LmRpc2FibGVGb250RmFjZSB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZUZvbnRGYWNlKSB7CisgICAgICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCB0aGlzLmhhbmRsZXIpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBnbHlwaHM7CisgIH0KKworICBlbnN1cmVTdGF0ZUZvbnQoc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUuZm9udCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHJlYXNvbiA9IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTWlzc2luZyBzZXRGb250IChUZikgb3BlcmF0b3IgYmVmb3JlIHRleHQgcmVuZGVyaW5nIG9wZXJhdG9yLiIpOworCisgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250U3RhdGUKKyAgICAgIH0pOworICAgICAgKDAsIF91dGlsLndhcm4pKGBlbnN1cmVTdGF0ZUZvbnQ6ICIke3JlYXNvbn0iLmApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRocm93IHJlYXNvbjsKKyAgfQorCisgIGFzeW5jIHNldEdTdGF0ZSh7CisgICAgcmVzb3VyY2VzLAorICAgIGdTdGF0ZSwKKyAgICBvcGVyYXRvckxpc3QsCisgICAgY2FjaGVLZXksCisgICAgdGFzaywKKyAgICBzdGF0ZU1hbmFnZXIsCisgICAgbG9jYWxHU3RhdGVDYWNoZSwKKyAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICB9KSB7CisgICAgY29uc3QgZ1N0YXRlUmVmID0gZ1N0YXRlLm9iaklkOworICAgIGxldCBpc1NpbXBsZUdTdGF0ZSA9IHRydWU7CisgICAgdmFyIGdTdGF0ZU9iaiA9IFtdOworICAgIHZhciBnU3RhdGVLZXlzID0gZ1N0YXRlLmdldEtleXMoKTsKKyAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZ1N0YXRlS2V5cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBjb25zdCBrZXkgPSBnU3RhdGVLZXlzW2ldOworICAgICAgY29uc3QgdmFsdWUgPSBnU3RhdGUuZ2V0KGtleSk7CisKKyAgICAgIHN3aXRjaCAoa2V5KSB7CisgICAgICAgIGNhc2UgIlR5cGUiOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIkxXIjoKKyAgICAgICAgY2FzZSAiTEMiOgorICAgICAgICBjYXNlICJMSiI6CisgICAgICAgIGNhc2UgIk1MIjoKKyAgICAgICAgY2FzZSAiRCI6CisgICAgICAgIGNhc2UgIlJJIjoKKyAgICAgICAgY2FzZSAiRkwiOgorICAgICAgICBjYXNlICJDQSI6CisgICAgICAgIGNhc2UgImNhIjoKKyAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB2YWx1ZV0pOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIkZvbnQiOgorICAgICAgICAgIGlzU2ltcGxlR1N0YXRlID0gZmFsc2U7CisgICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTZXRGb250KHJlc291cmNlcywgbnVsbCwgdmFsdWVbMF0sIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlKS50aGVuKGZ1bmN0aW9uIChsb2FkZWROYW1lKSB7CisgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KGxvYWRlZE5hbWUpOworICAgICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBbbG9hZGVkTmFtZSwgdmFsdWVbMV1dXSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJCTSI6CisgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgbm9ybWFsaXplQmxlbmRNb2RlKHZhbHVlKV0pOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIlNNYXNrIjoKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodmFsdWUsICJOb25lIikpIHsKKyAgICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIGZhbHNlXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkodmFsdWUpKSB7CisgICAgICAgICAgICBpc1NpbXBsZUdTdGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB7CisgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVNNYXNrKHZhbHVlLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHRydWVdKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiVFIiOgorICAgICAgICAgIGNvbnN0IHRyYW5zZmVyTWFwcyA9IHRoaXMuaGFuZGxlVHJhbnNmZXJGdW5jdGlvbih2YWx1ZSk7CisgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgdHJhbnNmZXJNYXBzXSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiT1AiOgorICAgICAgICBjYXNlICJvcCI6CisgICAgICAgIGNhc2UgIk9QTSI6CisgICAgICAgIGNhc2UgIkJHIjoKKyAgICAgICAgY2FzZSAiQkcyIjoKKyAgICAgICAgY2FzZSAiVUNSIjoKKyAgICAgICAgY2FzZSAiVUNSMiI6CisgICAgICAgIGNhc2UgIlRSMiI6CisgICAgICAgIGNhc2UgIkhUIjoKKyAgICAgICAgY2FzZSAiU00iOgorICAgICAgICBjYXNlICJTQSI6CisgICAgICAgIGNhc2UgIkFJUyI6CisgICAgICAgIGNhc2UgIlRLIjoKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoImdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIiArIGtleSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIlVua25vd24gZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiICsga2V5KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmIChnU3RhdGVPYmoubGVuZ3RoID4gMCkgeworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNldEdTdGF0ZSwgW2dTdGF0ZU9ial0pOworICAgICAgfQorCisgICAgICBpZiAoaXNTaW1wbGVHU3RhdGUpIHsKKyAgICAgICAgbG9jYWxHU3RhdGVDYWNoZS5zZXQoY2FjaGVLZXksIGdTdGF0ZVJlZiwgZ1N0YXRlT2JqKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIGxvYWRGb250KGZvbnROYW1lLCBmb250LCByZXNvdXJjZXMpIHsKKyAgICBjb25zdCBlcnJvckZvbnQgPSAoKSA9PiB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBUcmFuc2xhdGVkRm9udCh7CisgICAgICAgIGxvYWRlZE5hbWU6ICJnX2ZvbnRfZXJyb3IiLAorICAgICAgICBmb250OiBuZXcgX2ZvbnRzLkVycm9yRm9udChgRm9udCAiJHtmb250TmFtZX0iIGlzIG5vdCBhdmFpbGFibGUuYCksCisgICAgICAgIGRpY3Q6IGZvbnQsCisgICAgICAgIGV4dHJhUHJvcGVydGllczogdGhpcy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMKKyAgICAgIH0pKTsKKyAgICB9OworCisgICAgdmFyIGZvbnRSZWYsCisgICAgICAgIHhyZWYgPSB0aGlzLnhyZWY7CisKKyAgICBpZiAoZm9udCkgeworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGZvbnQpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcignVGhlICJmb250IiBvYmplY3Qgc2hvdWxkIGJlIGEgcmVmZXJlbmNlLicpOworICAgICAgfQorCisgICAgICBmb250UmVmID0gZm9udDsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGZvbnRSZXMgPSByZXNvdXJjZXMuZ2V0KCJGb250Iik7CisKKyAgICAgIGlmIChmb250UmVzKSB7CisgICAgICAgIGZvbnRSZWYgPSBmb250UmVzLmdldFJhdyhmb250TmFtZSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb250UmVmKSB7CisgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gYEZvbnQgIiR7Zm9udE5hbWUgfHwgZm9udCAmJiBmb250LnRvU3RyaW5nKCl9IiBpcyBub3QgYXZhaWxhYmxlYDsKKworICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzICYmICF0aGlzLnBhcnNpbmdUeXBlM0ZvbnQpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGAke3BhcnRpYWxNc2d9LmApOworICAgICAgICByZXR1cm4gZXJyb3JGb250KCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250TWlzc2luZworICAgICAgfSk7CisgICAgICAoMCwgX3V0aWwud2FybikoYCR7cGFydGlhbE1zZ30gLS0gYXR0ZW1wdGluZyB0byBmYWxsYmFjayB0byBhIGRlZmF1bHQgZm9udC5gKTsKKyAgICAgIGZvbnRSZWYgPSBQYXJ0aWFsRXZhbHVhdG9yLmZhbGxiYWNrRm9udERpY3Q7CisgICAgfQorCisgICAgaWYgKHRoaXMuZm9udENhY2hlLmhhcyhmb250UmVmKSkgeworICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250UmVmKTsKKyAgICB9CisKKyAgICBmb250ID0geHJlZi5mZXRjaElmUmVmKGZvbnRSZWYpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShmb250KSkgeworICAgICAgcmV0dXJuIGVycm9yRm9udCgpOworICAgIH0KKworICAgIGlmIChmb250LnRyYW5zbGF0ZWQpIHsKKyAgICAgIHJldHVybiBmb250LnRyYW5zbGF0ZWQ7CisgICAgfQorCisgICAgdmFyIGZvbnRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHZhciBwcmVFdmFsdWF0ZWRGb250ID0gdGhpcy5wcmVFdmFsdWF0ZUZvbnQoZm9udCk7CisgICAgY29uc3QgeworICAgICAgZGVzY3JpcHRvciwKKyAgICAgIGhhc2gKKyAgICB9ID0gcHJlRXZhbHVhdGVkRm9udDsKKyAgICB2YXIgZm9udFJlZklzUmVmID0gKDAsIF9wcmltaXRpdmVzLmlzUmVmKShmb250UmVmKSwKKyAgICAgICAgZm9udElEOworCisgICAgaWYgKGZvbnRSZWZJc1JlZikgeworICAgICAgZm9udElEID0gYGYke2ZvbnRSZWYudG9TdHJpbmcoKX1gOworICAgIH0KKworICAgIGlmIChoYXNoICYmICgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRlc2NyaXB0b3IpKSB7CisgICAgICBpZiAoIWRlc2NyaXB0b3IuZm9udEFsaWFzZXMpIHsKKyAgICAgICAgZGVzY3JpcHRvci5mb250QWxpYXNlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB9CisKKyAgICAgIHZhciBmb250QWxpYXNlcyA9IGRlc2NyaXB0b3IuZm9udEFsaWFzZXM7CisKKyAgICAgIGlmIChmb250QWxpYXNlc1toYXNoXSkgeworICAgICAgICB2YXIgYWxpYXNGb250UmVmID0gZm9udEFsaWFzZXNbaGFzaF0uYWxpYXNSZWY7CisKKyAgICAgICAgaWYgKGZvbnRSZWZJc1JlZiAmJiBhbGlhc0ZvbnRSZWYgJiYgdGhpcy5mb250Q2FjaGUuaGFzKGFsaWFzRm9udFJlZikpIHsKKyAgICAgICAgICB0aGlzLmZvbnRDYWNoZS5wdXRBbGlhcyhmb250UmVmLCBhbGlhc0ZvbnRSZWYpOworICAgICAgICAgIHJldHVybiB0aGlzLmZvbnRDYWNoZS5nZXQoZm9udFJlZik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvbnRBbGlhc2VzW2hhc2hdID0geworICAgICAgICAgIGZvbnRJRDogdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCkKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgaWYgKGZvbnRSZWZJc1JlZikgeworICAgICAgICBmb250QWxpYXNlc1toYXNoXS5hbGlhc1JlZiA9IGZvbnRSZWY7CisgICAgICB9CisKKyAgICAgIGZvbnRJRCA9IGZvbnRBbGlhc2VzW2hhc2hdLmZvbnRJRDsKKyAgICB9CisKKyAgICBpZiAoZm9udFJlZklzUmVmKSB7CisgICAgICB0aGlzLmZvbnRDYWNoZS5wdXQoZm9udFJlZiwgZm9udENhcGFiaWxpdHkucHJvbWlzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghZm9udElEKSB7CisgICAgICAgIGZvbnRJRCA9IHRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpOworICAgICAgfQorCisgICAgICB0aGlzLmZvbnRDYWNoZS5wdXQoYGlkXyR7Zm9udElEfWAsIGZvbnRDYXBhYmlsaXR5LnByb21pc2UpOworICAgIH0KKworICAgICgwLCBfdXRpbC5hc3NlcnQpKGZvbnRJRCAmJiBmb250SUQuc3RhcnRzV2l0aCgiZiIpLCAnVGhlICJmb250SUQiIG11c3QgYmUgKGNvcnJlY3RseSkgZGVmaW5lZC4nKTsKKyAgICBmb250LmxvYWRlZE5hbWUgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke2ZvbnRJRH1gOworICAgIGZvbnQudHJhbnNsYXRlZCA9IGZvbnRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgdmFyIHRyYW5zbGF0ZWRQcm9taXNlOworCisgICAgdHJ5IHsKKyAgICAgIHRyYW5zbGF0ZWRQcm9taXNlID0gdGhpcy50cmFuc2xhdGVGb250KHByZUV2YWx1YXRlZEZvbnQpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRyYW5zbGF0ZWRQcm9taXNlID0gUHJvbWlzZS5yZWplY3QoZSk7CisgICAgfQorCisgICAgdHJhbnNsYXRlZFByb21pc2UudGhlbih0cmFuc2xhdGVkRm9udCA9PiB7CisgICAgICBpZiAodHJhbnNsYXRlZEZvbnQuZm9udFR5cGUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICB2YXIgeHJlZkZvbnRTdGF0cyA9IHhyZWYuc3RhdHMuZm9udFR5cGVzOworICAgICAgICB4cmVmRm9udFN0YXRzW3RyYW5zbGF0ZWRGb250LmZvbnRUeXBlXSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGZvbnRDYXBhYmlsaXR5LnJlc29sdmUobmV3IFRyYW5zbGF0ZWRGb250KHsKKyAgICAgICAgbG9hZGVkTmFtZTogZm9udC5sb2FkZWROYW1lLAorICAgICAgICBmb250OiB0cmFuc2xhdGVkRm9udCwKKyAgICAgICAgZGljdDogZm9udCwKKyAgICAgICAgZXh0cmFQcm9wZXJ0aWVzOiB0aGlzLm9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllcworICAgICAgfSkpOworICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICB0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIiwgeworICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udFRyYW5zbGF0ZQorICAgICAgfSk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBmb250RmlsZTMgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZ2V0KCJGb250RmlsZTMiKTsKKyAgICAgICAgdmFyIHN1YnR5cGUgPSBmb250RmlsZTMgJiYgZm9udEZpbGUzLmdldCgiU3VidHlwZSIpOworICAgICAgICB2YXIgZm9udFR5cGUgPSAoMCwgX2ZvbnRzLmdldEZvbnRUeXBlKShwcmVFdmFsdWF0ZWRGb250LnR5cGUsIHN1YnR5cGUgJiYgc3VidHlwZS5uYW1lKTsKKyAgICAgICAgdmFyIHhyZWZGb250U3RhdHMgPSB4cmVmLnN0YXRzLmZvbnRUeXBlczsKKyAgICAgICAgeHJlZkZvbnRTdGF0c1tmb250VHlwZV0gPSB0cnVlOworICAgICAgfSBjYXRjaCAoZXgpIHt9CisKKyAgICAgIGZvbnRDYXBhYmlsaXR5LnJlc29sdmUobmV3IFRyYW5zbGF0ZWRGb250KHsKKyAgICAgICAgbG9hZGVkTmFtZTogZm9udC5sb2FkZWROYW1lLAorICAgICAgICBmb250OiBuZXcgX2ZvbnRzLkVycm9yRm9udChyZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbi5tZXNzYWdlIDogcmVhc29uKSwKKyAgICAgICAgZGljdDogZm9udCwKKyAgICAgICAgZXh0cmFQcm9wZXJ0aWVzOiB0aGlzLm9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllcworICAgICAgfSkpOworICAgIH0pOworICAgIHJldHVybiBmb250Q2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgYnVpbGRQYXRoKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIHBhcnNpbmdUZXh0ID0gZmFsc2UpIHsKKyAgICB2YXIgbGFzdEluZGV4ID0gb3BlcmF0b3JMaXN0Lmxlbmd0aCAtIDE7CisKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgIGFyZ3MgPSBbXTsKKyAgICB9CisKKyAgICBpZiAobGFzdEluZGV4IDwgMCB8fCBvcGVyYXRvckxpc3QuZm5BcnJheVtsYXN0SW5kZXhdICE9PSBfdXRpbC5PUFMuY29uc3RydWN0UGF0aCkgeworICAgICAgaWYgKHBhcnNpbmdUZXh0KSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgRW5jb3VudGVyZWQgcGF0aCBvcGVyYXRvciAiJHtmbn0iIGluc2lkZSBvZiBhIHRleHQgb2JqZWN0LmApOworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNhdmUsIG51bGwpOworICAgICAgfQorCisgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLmNvbnN0cnVjdFBhdGgsIFtbZm5dLCBhcmdzXSk7CisKKyAgICAgIGlmIChwYXJzaW5nVGV4dCkgeworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnJlc3RvcmUsIG51bGwpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgb3BBcmdzID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheVtsYXN0SW5kZXhdOworICAgICAgb3BBcmdzWzBdLnB1c2goZm4pOworICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkob3BBcmdzWzFdLCBhcmdzKTsKKyAgICB9CisgIH0KKworICBwYXJzZUNvbG9yU3BhY2UoeworICAgIGNzLAorICAgIHJlc291cmNlcywKKyAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICB9KSB7CisgICAgcmV0dXJuIF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2VBc3luYyh7CisgICAgICBjcywKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIHJlc291cmNlcywKKyAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICB9KS5jYXRjaChyZWFzb24gPT4geworICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICB0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIiwgeworICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JDb2xvclNwYWNlCisgICAgICAgIH0pOworICAgICAgICAoMCwgX3V0aWwud2FybikoYHBhcnNlQ29sb3JTcGFjZSAtIGlnbm9yaW5nIENvbG9yU3BhY2U6ICIke3JlYXNvbn0iLmApOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgcmVhc29uOworICAgIH0pOworICB9CisKKyAgYXN5bmMgaGFuZGxlQ29sb3JOKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIHZhciBwYXR0ZXJuTmFtZSA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTsKKyAgICB2YXIgcGF0dGVybjsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShwYXR0ZXJuTmFtZSkgJiYgKHBhdHRlcm4gPSBwYXR0ZXJucy5nZXQocGF0dGVybk5hbWUubmFtZSkpKSB7CisgICAgICB2YXIgZGljdCA9ICgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkocGF0dGVybikgPyBwYXR0ZXJuLmRpY3QgOiBwYXR0ZXJuOworICAgICAgdmFyIHR5cGVOdW0gPSBkaWN0LmdldCgiUGF0dGVyblR5cGUiKTsKKworICAgICAgaWYgKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlRJTElORykgeworICAgICAgICB2YXIgY29sb3IgPSBjcy5iYXNlID8gY3MuYmFzZS5nZXRSZ2IoYXJncywgMCkgOiBudWxsOworICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVUaWxpbmdUeXBlKGZuLCBjb2xvciwgcmVzb3VyY2VzLCBwYXR0ZXJuLCBkaWN0LCBvcGVyYXRvckxpc3QsIHRhc2spOworICAgICAgfSBlbHNlIGlmICh0eXBlTnVtID09PSBQYXR0ZXJuVHlwZS5TSEFESU5HKSB7CisgICAgICAgIHZhciBzaGFkaW5nID0gZGljdC5nZXQoIlNoYWRpbmciKTsKKyAgICAgICAgdmFyIG1hdHJpeCA9IGRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpOworICAgICAgICBwYXR0ZXJuID0gX3BhdHRlcm4uUGF0dGVybi5wYXJzZVNoYWRpbmcoc2hhZGluZywgbWF0cml4LCB0aGlzLnhyZWYsIHJlc291cmNlcywgdGhpcy5oYW5kbGVyLCB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKyAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCBwYXR0ZXJuLmdldElSKCkpOworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVua25vd24gUGF0dGVyblR5cGU6ICR7dHlwZU51bX1gKTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVua25vd24gUGF0dGVybk5hbWU6ICR7cGF0dGVybk5hbWV9YCk7CisgIH0KKworICBhc3luYyBwYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhjb250ZW50UHJvcGVydGllcywgcmVzb3VyY2VzKSB7CisgICAgbGV0IG9wdGlvbmFsQ29udGVudDsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShjb250ZW50UHJvcGVydGllcykpIHsKKyAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSByZXNvdXJjZXMuZ2V0KCJQcm9wZXJ0aWVzIik7CisgICAgICBvcHRpb25hbENvbnRlbnQgPSBwcm9wZXJ0aWVzLmdldChjb250ZW50UHJvcGVydGllcy5uYW1lKTsKKyAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGNvbnRlbnRQcm9wZXJ0aWVzKSkgeworICAgICAgb3B0aW9uYWxDb250ZW50ID0gY29udGVudFByb3BlcnRpZXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiT3B0aW9uYWwgY29udGVudCBwcm9wZXJ0aWVzIG1hbGZvcm1lZC4iKTsKKyAgICB9CisKKyAgICBjb25zdCBvcHRpb25hbENvbnRlbnRUeXBlID0gb3B0aW9uYWxDb250ZW50LmdldCgiVHlwZSIpLm5hbWU7CisKKyAgICBpZiAob3B0aW9uYWxDb250ZW50VHlwZSA9PT0gIk9DRyIpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCisgICAgICAgIGlkOiBvcHRpb25hbENvbnRlbnQub2JqSWQKKyAgICAgIH07CisgICAgfSBlbHNlIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NNRCIpIHsKKyAgICAgIGNvbnN0IG9wdGlvbmFsQ29udGVudEdyb3VwcyA9IG9wdGlvbmFsQ29udGVudC5nZXQoIk9DR3MiKTsKKworICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSB8fCAoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvcHRpb25hbENvbnRlbnRHcm91cHMpKSB7CisgICAgICAgIGNvbnN0IGdyb3VwSWRzID0gW107CisKKyAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSkgeworICAgICAgICAgIG9wdGlvbmFsQ29udGVudC5nZXQoIk9DR3MiKS5mb3JFYWNoKG9jZyA9PiB7CisgICAgICAgICAgICBncm91cElkcy5wdXNoKG9jZy50b1N0cmluZygpKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBncm91cElkcy5wdXNoKG9wdGlvbmFsQ29udGVudEdyb3Vwcy5vYmpJZCk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgZXhwcmVzc2lvbiA9IG51bGw7CisKKyAgICAgICAgaWYgKG9wdGlvbmFsQ29udGVudC5nZXQoIlZFIikpIHsKKyAgICAgICAgICBleHByZXNzaW9uID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSwKKyAgICAgICAgICBpZHM6IGdyb3VwSWRzLAorICAgICAgICAgIHBvbGljeTogKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkob3B0aW9uYWxDb250ZW50LmdldCgiUCIpKSA/IG9wdGlvbmFsQ29udGVudC5nZXQoIlAiKS5uYW1lIDogbnVsbCwKKyAgICAgICAgICBleHByZXNzaW9uCisgICAgICAgIH07CisgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikob3B0aW9uYWxDb250ZW50R3JvdXBzKSkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCisgICAgICAgICAgaWQ6IG9wdGlvbmFsQ29udGVudEdyb3Vwcy50b1N0cmluZygpCisgICAgICAgIH07CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBnZXRPcGVyYXRvckxpc3QoeworICAgIHN0cmVhbSwKKyAgICB0YXNrLAorICAgIHJlc291cmNlcywKKyAgICBvcGVyYXRvckxpc3QsCisgICAgaW5pdGlhbFN0YXRlID0gbnVsbAorICB9KSB7CisgICAgcmVzb3VyY2VzID0gcmVzb3VyY2VzIHx8IF9wcmltaXRpdmVzLkRpY3QuZW1wdHk7CisgICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlIHx8IG5ldyBFdmFsU3RhdGUoKTsKKworICAgIGlmICghb3BlcmF0b3JMaXN0KSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldE9wZXJhdG9yTGlzdDogbWlzc2luZyAib3BlcmF0b3JMaXN0IiBwYXJhbWV0ZXInKTsKKyAgICB9CisKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7CisgICAgbGV0IHBhcnNpbmdUZXh0ID0gZmFsc2U7CisgICAgY29uc3QgbG9jYWxJbWFnZUNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEltYWdlQ2FjaGUoKTsKKyAgICBjb25zdCBsb2NhbENvbG9yU3BhY2VDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTsKKyAgICBjb25zdCBsb2NhbEdTdGF0ZUNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEdTdGF0ZUNhY2hlKCk7CisKKyAgICB2YXIgeG9ianMgPSByZXNvdXJjZXMuZ2V0KCJYT2JqZWN0IikgfHwgX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKKworICAgIHZhciBwYXR0ZXJucyA9IHJlc291cmNlcy5nZXQoIlBhdHRlcm4iKSB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworCisgICAgdmFyIHN0YXRlTWFuYWdlciA9IG5ldyBTdGF0ZU1hbmFnZXIoaW5pdGlhbFN0YXRlKTsKKyAgICB2YXIgcHJlcHJvY2Vzc29yID0gbmV3IEV2YWx1YXRvclByZXByb2Nlc3NvcihzdHJlYW0sIHhyZWYsIHN0YXRlTWFuYWdlcik7CisgICAgdmFyIHRpbWVTbG90TWFuYWdlciA9IG5ldyBUaW1lU2xvdE1hbmFnZXIoKTsKKworICAgIGZ1bmN0aW9uIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoYXJndW1lbnQpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHByZXByb2Nlc3Nvci5zYXZlZFN0YXRlc0RlcHRoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnJlc3RvcmUsIFtdKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICBjb25zdCBuZXh0ID0gZnVuY3Rpb24gKHByb21pc2UpIHsKKyAgICAgICAgUHJvbWlzZS5hbGwoW3Byb21pc2UsIG9wZXJhdG9yTGlzdC5yZWFkeV0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9taXNlQm9keShyZXNvbHZlLCByZWplY3QpOworICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICByZWplY3QoZXgpOworICAgICAgICAgIH0KKyAgICAgICAgfSwgcmVqZWN0KTsKKyAgICAgIH07CisKKyAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpOworICAgICAgdGltZVNsb3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICB2YXIgc3RvcCwKKyAgICAgICAgICBvcGVyYXRpb24gPSB7fSwKKyAgICAgICAgICBpLAorICAgICAgICAgIGlpLAorICAgICAgICAgIGNzLAorICAgICAgICAgIG5hbWU7CisKKyAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKKyAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBudWxsOworCisgICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKKyAgICAgICAgdmFyIGZuID0gb3BlcmF0aW9uLmZuOworCisgICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRYT2JqZWN0OgorICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKKworICAgICAgICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgICAgICAgY29uc3QgbG9jYWxJbWFnZSA9IGxvY2FsSW1hZ2VDYWNoZS5nZXRCeU5hbWUobmFtZSk7CisKKyAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKKyAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AobG9jYWxJbWFnZS5mbiwgbG9jYWxJbWFnZS5hcmdzKTsKKyAgICAgICAgICAgICAgICBhcmdzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0KG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlWE9iamVjdCwgcmVqZWN0WE9iamVjdCkgeworICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7CisKKyAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5UmVmKHhvYmopOworCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChsb2NhbEltYWdlLmZuLCBsb2NhbEltYWdlLmFyZ3MpOworICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWxJbWFnZSA9IHNlbGYuZ2xvYmFsSW1hZ2VDYWNoZS5nZXREYXRhKHhvYmosIHNlbGYucGFnZUluZGV4KTsKKworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxJbWFnZSkgeworICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3koZ2xvYmFsSW1hZ2Uub2JqSWQpOworICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGdsb2JhbEltYWdlLmZuLCBnbG9iYWxJbWFnZS5hcmdzKTsKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeG9iaiA9IHhyZWYuZmV0Y2goeG9iaik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoeG9iaikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb25zdCB0eXBlID0geG9iai5kaWN0LmdldCgiU3VidHlwZSIpOworCisgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh0eXBlLm5hbWUgPT09ICJGb3JtIikgeworICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zYXZlKCk7CisgICAgICAgICAgICAgICAgc2VsZi5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgeG9iaiwgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoKSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnJlc3RvcmUoKTsKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUubmFtZSA9PT0gIkltYWdlIikgeworICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRQYWludEltYWdlWE9iamVjdCh7CisgICAgICAgICAgICAgICAgICByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICBpbWFnZTogeG9iaiwKKyAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKKyAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLAorICAgICAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLAorICAgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgICB9KS50aGVuKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSAiUFMiKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJJZ25vcmVkIFhPYmplY3Qgc3VidHlwZSBQUyIpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5oYW5kbGVkIFhPYmplY3Qgc3VidHlwZSAke3R5cGUubmFtZX1gKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JYT2JqZWN0CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBYT2JqZWN0OiAiJHtyZWFzb259Ii5gKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB0aHJvdyByZWFzb247CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGb250OgorICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gYXJnc1sxXTsKKyAgICAgICAgICAgIG5leHQoc2VsZi5oYW5kbGVTZXRGb250KHJlc291cmNlcywgYXJncywgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUpLnRoZW4oZnVuY3Rpb24gKGxvYWRlZE5hbWUpIHsKKyAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kobG9hZGVkTmFtZSk7CisgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0Rm9udCwgW2xvYWRlZE5hbWUsIGZvbnRTaXplXSk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpblRleHQ6CisgICAgICAgICAgICBwYXJzaW5nVGV4dCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZFRleHQ6CisgICAgICAgICAgICBwYXJzaW5nVGV4dCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRJbmxpbmVJbWFnZToKKyAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IGFyZ3NbMF0uY2FjaGVLZXk7CisKKyAgICAgICAgICAgIGlmIChjYWNoZUtleSkgeworICAgICAgICAgICAgICBjb25zdCBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5TmFtZShjYWNoZUtleSk7CisKKyAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKKyAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AobG9jYWxJbWFnZS5mbiwgbG9jYWxJbWFnZS5hcmdzKTsKKyAgICAgICAgICAgICAgICBhcmdzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0KHNlbGYuYnVpbGRQYWludEltYWdlWE9iamVjdCh7CisgICAgICAgICAgICAgIHJlc291cmNlcywKKyAgICAgICAgICAgICAgaW1hZ2U6IGFyZ3NbMF0sCisgICAgICAgICAgICAgIGlzSW5saW5lOiB0cnVlLAorICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsCisgICAgICAgICAgICAgIGNhY2hlS2V5LAorICAgICAgICAgICAgICBsb2NhbEltYWdlQ2FjaGUsCisgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93VGV4dDoKKyAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hvd1NwYWNlZFRleHQ6CisgICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CisgICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYXJyID0gYXJnc1swXTsKKyAgICAgICAgICAgIHZhciBjb21iaW5lZEdseXBocyA9IFtdOworICAgICAgICAgICAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7CisgICAgICAgICAgICB2YXIgc3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGU7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnJMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICB2YXIgYXJySXRlbSA9IGFycltpXTsKKworICAgICAgICAgICAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShhcnJJdGVtKSkgeworICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGNvbWJpbmVkR2x5cGhzLCBzZWxmLmhhbmRsZVRleHQoYXJySXRlbSwgc3RhdGUpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNOdW0pKGFyckl0ZW0pKSB7CisgICAgICAgICAgICAgICAgY29tYmluZWRHbHlwaHMucHVzaChhcnJJdGVtKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcmdzWzBdID0gY29tYmluZWRHbHlwaHM7CisgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaG93VGV4dDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmVTaG93VGV4dDoKKyAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMubmV4dExpbmUpOworICAgICAgICAgICAgYXJnc1swXSA9IHNlbGYuaGFuZGxlVGV4dChhcmdzWzBdLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2hvd1RleHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OgorICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5uZXh0TGluZSk7CisgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNldFdvcmRTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7CisgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNldENoYXJTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7CisgICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaG93VGV4dDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6CisgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgPSBhcmdzWzBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3JTcGFjZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2FjaGVkQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKGFyZ3NbMF0sIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKworICAgICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkgeworICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IGNhY2hlZENvbG9yU3BhY2U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBuZXh0KHNlbGYucGFyc2VDb2xvclNwYWNlKHsKKyAgICAgICAgICAgICAgICBjczogYXJnc1swXSwKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29sb3JTcGFjZSkgeworICAgICAgICAgICAgICAgIGlmIChjb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBjb2xvclNwYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5nZXRDYWNoZWQoYXJnc1swXSwgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgICAgICAgICAgIGlmIChjYWNoZWRDb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBjYWNoZWRDb2xvclNwYWNlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlQ29sb3JTcGFjZSh7CisgICAgICAgICAgICAgICAgY3M6IGFyZ3NbMF0sCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbG9yU3BhY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29sb3JTcGFjZSkgeworICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBjb2xvclNwYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3I6CisgICAgICAgICAgICBjcyA9IHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZTsKKyAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yOgorICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZTsKKyAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zZXRTdHJva2VSR0JDb2xvcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbEdyYXk6CisgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTsKKyAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUdyYXk6CisgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5OworICAgICAgICAgICAgYXJncyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ01ZS0NvbG9yOgorICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWs7CisgICAgICAgICAgICBhcmdzID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKGFyZ3MsIDApOworICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDTVlLQ29sb3I6CisgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrOworICAgICAgICAgICAgYXJncyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I6CisgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiOworICAgICAgICAgICAgYXJncyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKGFyZ3MsIDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VSR0JDb2xvcjoKKyAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjsKKyAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbENvbG9yTjoKKyAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlOworCisgICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CisgICAgICAgICAgICAgIG5leHQoc2VsZi5oYW5kbGVDb2xvck4ob3BlcmF0b3JMaXN0LCBfdXRpbC5PUFMuc2V0RmlsbENvbG9yTiwgYXJncywgY3MsIHBhdHRlcm5zLCByZXNvdXJjZXMsIHRhc2ssIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3JOOgorICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZTsKKworICAgICAgICAgICAgaWYgKGNzLm5hbWUgPT09ICJQYXR0ZXJuIikgeworICAgICAgICAgICAgICBuZXh0KHNlbGYuaGFuZGxlQ29sb3JOKG9wZXJhdG9yTGlzdCwgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yTiwgYXJncywgY3MsIHBhdHRlcm5zLCByZXNvdXJjZXMsIHRhc2ssIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaGFkaW5nRmlsbDoKKyAgICAgICAgICAgIHZhciBzaGFkaW5nUmVzID0gcmVzb3VyY2VzLmdldCgiU2hhZGluZyIpOworCisgICAgICAgICAgICBpZiAoIXNoYWRpbmdSZXMpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBzaGFkaW5nIHJlc291cmNlIGZvdW5kIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzaGFkaW5nID0gc2hhZGluZ1Jlcy5nZXQoYXJnc1swXS5uYW1lKTsKKworICAgICAgICAgICAgaWYgKCFzaGFkaW5nKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNoYWRpbmdGaWxsID0gX3BhdHRlcm4uUGF0dGVybi5wYXJzZVNoYWRpbmcoc2hhZGluZywgbnVsbCwgeHJlZiwgcmVzb3VyY2VzLCBzZWxmLmhhbmRsZXIsIHNlbGYuX3BkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgICAgICAgICB2YXIgcGF0dGVybklSID0gc2hhZGluZ0ZpbGwuZ2V0SVIoKTsKKyAgICAgICAgICAgIGFyZ3MgPSBbcGF0dGVybklSXTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNoYWRpbmdGaWxsOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRHU3RhdGU6CisgICAgICAgICAgICBuYW1lID0gYXJnc1swXS5uYW1lOworCisgICAgICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgICBjb25zdCBsb2NhbEdTdGF0ZU9iaiA9IGxvY2FsR1N0YXRlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpOworCisgICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iaikgeworICAgICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iai5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNldEdTdGF0ZSwgW2xvY2FsR1N0YXRlT2JqXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXJncyA9IG51bGw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKSB7CisgICAgICAgICAgICAgIGlmICghbmFtZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IHJlc291cmNlcy5nZXQoIkV4dEdTdGF0ZSIpOworCisgICAgICAgICAgICAgIGlmICghKGV4dEdTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJFeHRHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CisKKyAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc2VsZi5zZXRHU3RhdGUoeworICAgICAgICAgICAgICAgIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICBnU3RhdGUsCisgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LAorICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLAorICAgICAgICAgICAgICAgIHRhc2ssCisgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUsCisgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgfSkudGhlbihyZXNvbHZlR1N0YXRlLCByZWplY3RHU3RhdGUpOworICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRXh0R1N0YXRlCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke3JlYXNvbn0iLmApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1vdmVUbzoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5saW5lVG86CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jdXJ2ZVRvMjoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jdXJ2ZVRvMzoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVBhdGg6CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucmVjdGFuZ2xlOgorICAgICAgICAgICAgc2VsZi5idWlsZFBhdGgob3BlcmF0b3JMaXN0LCBmbiwgYXJncywgcGFyc2luZ1RleHQpOworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5tYXJrUG9pbnQ6CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubWFya1BvaW50UHJvcHM6CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5Db21wYXQ6CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW5kQ29tcGF0OgorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wczoKKyAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoYXJnc1swXSkpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBFeHBlY3RlZCBuYW1lIGZvciBiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyBhcmcwPSR7YXJnc1swXX1gKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhcmdzWzBdLm5hbWUgPT09ICJPQyIpIHsKKyAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcykudGhlbihkYXRhID0+IHsKKyAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbIk9DIiwgZGF0YV0pOworICAgICAgICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4geworICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIiwgeworICAgICAgICAgICAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yTWFya2VkQ29udGVudAorICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiAiJHtyZWFzb259Ii5gKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyByZWFzb247CisgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcmdzID0gW2FyZ3NbMF0ubmFtZV07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudDoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRNYXJrZWRDb250ZW50OgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkgeworICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgeworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGkgPCBpaSkgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3Jpbmcgb3BlcmF0b3I6ICIgKyBmbik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCBhcmdzKTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0b3ApIHsKKyAgICAgICAgbmV4dChkZWZlcnJlZCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY2xvc2VQZW5kaW5nUmVzdG9yZU9QUygpOworICAgICAgcmVzb2x2ZSgpOworICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICB0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIiwgeworICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JPcGVyYXRvckxpc3QKKyAgICAgICAgfSk7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJHt0YXNrLm5hbWV9IiBgICsgYHRhc2s6ICIke3JlYXNvbn0iLmApOworICAgICAgICBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhyb3cgcmVhc29uOworICAgIH0pOworICB9CisKKyAgZ2V0VGV4dENvbnRlbnQoeworICAgIHN0cmVhbSwKKyAgICB0YXNrLAorICAgIHJlc291cmNlcywKKyAgICBzdGF0ZU1hbmFnZXIgPSBudWxsLAorICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UgPSBmYWxzZSwKKyAgICBjb21iaW5lVGV4dEl0ZW1zID0gZmFsc2UsCisgICAgc2luaywKKyAgICBzZWVuU3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKQorICB9KSB7CisgICAgcmVzb3VyY2VzID0gcmVzb3VyY2VzIHx8IF9wcmltaXRpdmVzLkRpY3QuZW1wdHk7CisgICAgc3RhdGVNYW5hZ2VyID0gc3RhdGVNYW5hZ2VyIHx8IG5ldyBTdGF0ZU1hbmFnZXIobmV3IFRleHRTdGF0ZSgpKTsKKyAgICB2YXIgV2hpdGVzcGFjZVJlZ2V4cCA9IC9ccy9nOworICAgIHZhciB0ZXh0Q29udGVudCA9IHsKKyAgICAgIGl0ZW1zOiBbXSwKKyAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKQorICAgIH07CisgICAgdmFyIHRleHRDb250ZW50SXRlbSA9IHsKKyAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKKyAgICAgIHN0cjogW10sCisgICAgICB3aWR0aDogMCwKKyAgICAgIGhlaWdodDogMCwKKyAgICAgIHZlcnRpY2FsOiBmYWxzZSwKKyAgICAgIGxhc3RBZHZhbmNlV2lkdGg6IDAsCisgICAgICBsYXN0QWR2YW5jZUhlaWdodDogMCwKKyAgICAgIHRleHRBZHZhbmNlU2NhbGU6IDAsCisgICAgICBzcGFjZVdpZHRoOiAwLAorICAgICAgZmFrZVNwYWNlTWluOiBJbmZpbml0eSwKKyAgICAgIGZha2VNdWx0aVNwYWNlTWluOiBJbmZpbml0eSwKKyAgICAgIGZha2VNdWx0aVNwYWNlTWF4OiAtMCwKKyAgICAgIHRleHRSdW5CcmVha0FsbG93ZWQ6IGZhbHNlLAorICAgICAgdHJhbnNmb3JtOiBudWxsLAorICAgICAgZm9udE5hbWU6IG51bGwKKyAgICB9OworICAgIHZhciBTUEFDRV9GQUNUT1IgPSAwLjM7CisgICAgdmFyIE1VTFRJX1NQQUNFX0ZBQ1RPUiA9IDEuNTsKKyAgICB2YXIgTVVMVElfU1BBQ0VfRkFDVE9SX01BWCA9IDQ7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIHZhciB4cmVmID0gdGhpcy54cmVmOworICAgIHZhciB4b2JqcyA9IG51bGw7CisgICAgY29uc3QgZW1wdHlYT2JqZWN0Q2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsSW1hZ2VDYWNoZSgpOworICAgIGNvbnN0IGVtcHR5R1N0YXRlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsR1N0YXRlQ2FjaGUoKTsKKyAgICB2YXIgcHJlcHJvY2Vzc29yID0gbmV3IEV2YWx1YXRvclByZXByb2Nlc3NvcihzdHJlYW0sIHhyZWYsIHN0YXRlTWFuYWdlcik7CisgICAgdmFyIHRleHRTdGF0ZTsKKworICAgIGZ1bmN0aW9uIGVuc3VyZVRleHRDb250ZW50SXRlbSgpIHsKKyAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuIHRleHRDb250ZW50SXRlbTsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnQgPSB0ZXh0U3RhdGUuZm9udDsKKworICAgICAgaWYgKCEoZm9udC5sb2FkZWROYW1lIGluIHNlZW5TdHlsZXMpKSB7CisgICAgICAgIHNlZW5TdHlsZXNbZm9udC5sb2FkZWROYW1lXSA9IHRydWU7CisgICAgICAgIHRleHRDb250ZW50LnN0eWxlc1tmb250LmxvYWRlZE5hbWVdID0geworICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQuZmFsbGJhY2tOYW1lLAorICAgICAgICAgIGFzY2VudDogZm9udC5hc2NlbnQsCisgICAgICAgICAgZGVzY2VudDogZm9udC5kZXNjZW50LAorICAgICAgICAgIHZlcnRpY2FsOiBmb250LnZlcnRpY2FsCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHRleHRDb250ZW50SXRlbS5mb250TmFtZSA9IGZvbnQubG9hZGVkTmFtZTsKKyAgICAgIHZhciB0c20gPSBbdGV4dFN0YXRlLmZvbnRTaXplICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDAsIDAsIHRleHRTdGF0ZS5mb250U2l6ZSwgMCwgdGV4dFN0YXRlLnRleHRSaXNlXTsKKworICAgICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQgJiYgdGV4dFN0YXRlLmZvbnRTaXplIDw9IDEgJiYgISgwLCBfdXRpbC5pc0FycmF5RXF1YWwpKHRleHRTdGF0ZS5mb250TWF0cml4LCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWCkpIHsKKyAgICAgICAgY29uc3QgZ2x5cGhIZWlnaHQgPSBmb250LmJib3hbM10gLSBmb250LmJib3hbMV07CisKKyAgICAgICAgaWYgKGdseXBoSGVpZ2h0ID4gMCkgeworICAgICAgICAgIHRzbVszXSAqPSBnbHlwaEhlaWdodCAqIHRleHRTdGF0ZS5mb250TWF0cml4WzNdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciB0cm0gPSBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUuY3RtLCBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUudGV4dE1hdHJpeCwgdHNtKSk7CisKKyAgICAgIHRleHRDb250ZW50SXRlbS50cmFuc2Zvcm0gPSB0cm07CisKKyAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgeworICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSAwOworICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gTWF0aC5zcXJ0KHRybVsyXSAqIHRybVsyXSArIHRybVszXSAqIHRybVszXSk7CisgICAgICAgIHRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoID0gTWF0aC5zcXJ0KHRybVswXSAqIHRybVswXSArIHRybVsxXSAqIHRybVsxXSk7CisgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgPSAwOworICAgICAgICB0ZXh0Q29udGVudEl0ZW0udmVydGljYWwgPSB0cnVlOworICAgICAgfQorCisgICAgICB2YXIgYSA9IHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeFswXTsKKyAgICAgIHZhciBiID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzFdOworICAgICAgdmFyIHNjYWxlTGluZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7CisgICAgICBhID0gdGV4dFN0YXRlLmN0bVswXTsKKyAgICAgIGIgPSB0ZXh0U3RhdGUuY3RtWzFdOworICAgICAgdmFyIHNjYWxlQ3RtWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTsKKyAgICAgIHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlID0gc2NhbGVDdG1YICogc2NhbGVMaW5lWDsKKyAgICAgIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZVdpZHRoID0gMDsKKyAgICAgIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZUhlaWdodCA9IDA7CisgICAgICB2YXIgc3BhY2VXaWR0aCA9IGZvbnQuc3BhY2VXaWR0aCAvIDEwMDAgKiB0ZXh0U3RhdGUuZm9udFNpemU7CisKKyAgICAgIGlmIChzcGFjZVdpZHRoKSB7CisgICAgICAgIHRleHRDb250ZW50SXRlbS5zcGFjZVdpZHRoID0gc3BhY2VXaWR0aDsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VTcGFjZU1pbiA9IHNwYWNlV2lkdGggKiBTUEFDRV9GQUNUT1I7CisgICAgICAgIHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1pbiA9IHNwYWNlV2lkdGggKiBNVUxUSV9TUEFDRV9GQUNUT1I7CisgICAgICAgIHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heCA9IHNwYWNlV2lkdGggKiBNVUxUSV9TUEFDRV9GQUNUT1JfTUFYOworICAgICAgICB0ZXh0Q29udGVudEl0ZW0udGV4dFJ1bkJyZWFrQWxsb3dlZCA9ICFmb250LmlzTW9ub3NwYWNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLnNwYWNlV2lkdGggPSAwOworICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZVNwYWNlTWluID0gSW5maW5pdHk7CisgICAgICAgIHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1pbiA9IEluZmluaXR5OworICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXggPSAwOworICAgICAgICB0ZXh0Q29udGVudEl0ZW0udGV4dFJ1bkJyZWFrQWxsb3dlZCA9IGZhbHNlOworICAgICAgfQorCisgICAgICB0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgcmV0dXJuIHRleHRDb250ZW50SXRlbTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiByZXBsYWNlV2hpdGVzcGFjZShzdHIpIHsKKyAgICAgIHZhciBpID0gMCwKKyAgICAgICAgICBpaSA9IHN0ci5sZW5ndGgsCisgICAgICAgICAgY29kZTsKKworICAgICAgd2hpbGUgKGkgPCBpaSAmJiAoY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpKSA+PSAweDIwICYmIGNvZGUgPD0gMHg3ZikgeworICAgICAgICBpKys7CisgICAgICB9CisKKyAgICAgIHJldHVybiBpIDwgaWkgPyBzdHIucmVwbGFjZShXaGl0ZXNwYWNlUmVnZXhwLCAiICIpIDogc3RyOworICAgIH0KKworICAgIGZ1bmN0aW9uIHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENodW5rKSB7CisgICAgICB2YXIgc3RyID0gdGV4dENodW5rLnN0ci5qb2luKCIiKTsKKyAgICAgIHZhciBiaWRpUmVzdWx0ID0gKDAsIF9iaWRpLmJpZGkpKHN0ciwgLTEsIHRleHRDaHVuay52ZXJ0aWNhbCk7CisgICAgICByZXR1cm4geworICAgICAgICBzdHI6IG5vcm1hbGl6ZVdoaXRlc3BhY2UgPyByZXBsYWNlV2hpdGVzcGFjZShiaWRpUmVzdWx0LnN0cikgOiBiaWRpUmVzdWx0LnN0ciwKKyAgICAgICAgZGlyOiBiaWRpUmVzdWx0LmRpciwKKyAgICAgICAgd2lkdGg6IHRleHRDaHVuay53aWR0aCwKKyAgICAgICAgaGVpZ2h0OiB0ZXh0Q2h1bmsuaGVpZ2h0LAorICAgICAgICB0cmFuc2Zvcm06IHRleHRDaHVuay50cmFuc2Zvcm0sCisgICAgICAgIGZvbnROYW1lOiB0ZXh0Q2h1bmsuZm9udE5hbWUKKyAgICAgIH07CisgICAgfQorCisgICAgZnVuY3Rpb24gaGFuZGxlU2V0Rm9udChmb250TmFtZSwgZm9udFJlZikgeworICAgICAgcmV0dXJuIHNlbGYubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcykudGhlbihmdW5jdGlvbiAodHJhbnNsYXRlZCkgeworICAgICAgICB0ZXh0U3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKKyAgICAgICAgdGV4dFN0YXRlLmZvbnRNYXRyaXggPSB0cmFuc2xhdGVkLmZvbnQuZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWDsKKyAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGNoYXJzKSB7CisgICAgICB2YXIgZm9udCA9IHRleHRTdGF0ZS5mb250OworICAgICAgdmFyIHRleHRDaHVuayA9IGVuc3VyZVRleHRDb250ZW50SXRlbSgpOworICAgICAgdmFyIHdpZHRoID0gMDsKKyAgICAgIHZhciBoZWlnaHQgPSAwOworICAgICAgdmFyIGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpXTsKKyAgICAgICAgdmFyIGdseXBoV2lkdGggPSBudWxsOworCisgICAgICAgIGlmIChmb250LnZlcnRpY2FsICYmIGdseXBoLnZtZXRyaWMpIHsKKyAgICAgICAgICBnbHlwaFdpZHRoID0gZ2x5cGgudm1ldHJpY1swXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnbHlwaFdpZHRoID0gZ2x5cGgud2lkdGg7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ2x5cGhVbmljb2RlID0gZ2x5cGgudW5pY29kZTsKKyAgICAgICAgdmFyIE5vcm1hbGl6ZWRVbmljb2RlcyA9ICgwLCBfdW5pY29kZS5nZXROb3JtYWxpemVkVW5pY29kZXMpKCk7CisKKyAgICAgICAgaWYgKE5vcm1hbGl6ZWRVbmljb2Rlc1tnbHlwaFVuaWNvZGVdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBnbHlwaFVuaWNvZGUgPSBOb3JtYWxpemVkVW5pY29kZXNbZ2x5cGhVbmljb2RlXTsKKyAgICAgICAgfQorCisgICAgICAgIGdseXBoVW5pY29kZSA9ICgwLCBfdW5pY29kZS5yZXZlcnNlSWZSdGwpKGdseXBoVW5pY29kZSk7CisgICAgICAgIHZhciBjaGFyU3BhY2luZyA9IHRleHRTdGF0ZS5jaGFyU3BhY2luZzsKKworICAgICAgICBpZiAoZ2x5cGguaXNTcGFjZSkgeworICAgICAgICAgIHZhciB3b3JkU3BhY2luZyA9IHRleHRTdGF0ZS53b3JkU3BhY2luZzsKKyAgICAgICAgICBjaGFyU3BhY2luZyArPSB3b3JkU3BhY2luZzsKKworICAgICAgICAgIGlmICh3b3JkU3BhY2luZyA+IDApIHsKKyAgICAgICAgICAgIGFkZEZha2VTcGFjZXMod29yZFNwYWNpbmcsIHRleHRDaHVuay5zdHIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciB0eCA9IDA7CisgICAgICAgIHZhciB0eSA9IDA7CisKKyAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CisgICAgICAgICAgdmFyIHcwID0gZ2x5cGhXaWR0aCAqIHRleHRTdGF0ZS5mb250TWF0cml4WzBdOworICAgICAgICAgIHR4ID0gKHcwICogdGV4dFN0YXRlLmZvbnRTaXplICsgY2hhclNwYWNpbmcpICogdGV4dFN0YXRlLnRleHRIU2NhbGU7CisgICAgICAgICAgd2lkdGggKz0gdHg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIHcxID0gZ2x5cGhXaWR0aCAqIHRleHRTdGF0ZS5mb250TWF0cml4WzBdOworICAgICAgICAgIHR5ID0gdzEgKiB0ZXh0U3RhdGUuZm9udFNpemUgKyBjaGFyU3BhY2luZzsKKyAgICAgICAgICBoZWlnaHQgKz0gdHk7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCh0eCwgdHkpOworICAgICAgICB0ZXh0Q2h1bmsuc3RyLnB1c2goZ2x5cGhVbmljb2RlKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CisgICAgICAgIHRleHRDaHVuay5sYXN0QWR2YW5jZVdpZHRoID0gd2lkdGg7CisgICAgICAgIHRleHRDaHVuay53aWR0aCArPSB3aWR0aDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRleHRDaHVuay5sYXN0QWR2YW5jZUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgdGV4dENodW5rLmhlaWdodCArPSBNYXRoLmFicyhoZWlnaHQpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGV4dENodW5rOworICAgIH0KKworICAgIGZ1bmN0aW9uIGFkZEZha2VTcGFjZXMod2lkdGgsIHN0ckJ1ZikgeworICAgICAgaWYgKHdpZHRoIDwgdGV4dENvbnRlbnRJdGVtLmZha2VTcGFjZU1pbikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh3aWR0aCA8IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1pbikgeworICAgICAgICBzdHJCdWYucHVzaCgiICIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBmYWtlU3BhY2VzID0gTWF0aC5yb3VuZCh3aWR0aCAvIHRleHRDb250ZW50SXRlbS5zcGFjZVdpZHRoKTsKKworICAgICAgd2hpbGUgKGZha2VTcGFjZXMtLSA+IDApIHsKKyAgICAgICAgc3RyQnVmLnB1c2goIiAiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBmbHVzaFRleHRDb250ZW50SXRlbSgpIHsKKyAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICo9IHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCAqPSB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKKyAgICAgIH0KKworICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaChydW5CaWRpVHJhbnNmb3JtKHRleHRDb250ZW50SXRlbSkpOworICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICB0ZXh0Q29udGVudEl0ZW0uc3RyLmxlbmd0aCA9IDA7CisgICAgfQorCisgICAgZnVuY3Rpb24gZW5xdWV1ZUNodW5rKCkgeworICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoOworCisgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICBzaW5rLmVucXVldWUodGV4dENvbnRlbnQsIGxlbmd0aCk7CisgICAgICAgIHRleHRDb250ZW50Lml0ZW1zID0gW107CisgICAgICAgIHRleHRDb250ZW50LnN0eWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIHRpbWVTbG90TWFuYWdlciA9IG5ldyBUaW1lU2xvdE1hbmFnZXIoKTsKKyAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICBjb25zdCBuZXh0ID0gZnVuY3Rpb24gKHByb21pc2UpIHsKKyAgICAgICAgZW5xdWV1ZUNodW5rKCk7CisgICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBzaW5rLnJlYWR5XSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICAgIHJlamVjdChleCk7CisgICAgICAgICAgfQorICAgICAgICB9LCByZWplY3QpOworICAgICAgfTsKKworICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisgICAgICB0aW1lU2xvdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgIHZhciBzdG9wLAorICAgICAgICAgIG9wZXJhdGlvbiA9IHt9LAorICAgICAgICAgIGFyZ3MgPSBbXTsKKworICAgICAgd2hpbGUgKCEoc3RvcCA9IHRpbWVTbG90TWFuYWdlci5jaGVjaygpKSkgeworICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CisgICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJnczsKKworICAgICAgICBpZiAoIXByZXByb2Nlc3Nvci5yZWFkKG9wZXJhdGlvbikpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRleHRTdGF0ZSA9IHN0YXRlTWFuYWdlci5zdGF0ZTsKKyAgICAgICAgdmFyIGZuID0gb3BlcmF0aW9uLmZuOworICAgICAgICBhcmdzID0gb3BlcmF0aW9uLmFyZ3M7CisgICAgICAgIHZhciBhZHZhbmNlLCBkaWZmOworCisgICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0Rm9udDoKKyAgICAgICAgICAgIHZhciBmb250TmFtZUFyZyA9IGFyZ3NbMF0ubmFtZSwKKyAgICAgICAgICAgICAgICBmb250U2l6ZUFyZyA9IGFyZ3NbMV07CisKKyAgICAgICAgICAgIGlmICh0ZXh0U3RhdGUuZm9udCAmJiBmb250TmFtZUFyZyA9PT0gdGV4dFN0YXRlLmZvbnROYW1lICYmIGZvbnRTaXplQXJnID09PSB0ZXh0U3RhdGUuZm9udFNpemUpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICB0ZXh0U3RhdGUuZm9udE5hbWUgPSBmb250TmFtZUFyZzsKKyAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplQXJnOworICAgICAgICAgICAgbmV4dChoYW5kbGVTZXRGb250KGZvbnROYW1lQXJnLCBudWxsKSk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0UmlzZToKKyAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICB0ZXh0U3RhdGUudGV4dFJpc2UgPSBhcmdzWzBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRIU2NhbGU6CisgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRIU2NhbGUgPSBhcmdzWzBdIC8gMTAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMZWFkaW5nOgorICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS5sZWFkaW5nID0gYXJnc1swXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRleHQ6CisgICAgICAgICAgICB2YXIgaXNTYW1lVGV4dExpbmUgPSAhdGV4dFN0YXRlLmZvbnQgPyBmYWxzZSA6ICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCA/IGFyZ3NbMF0gOiBhcmdzWzFdKSA9PT0gMDsKKyAgICAgICAgICAgIGFkdmFuY2UgPSBhcmdzWzBdIC0gYXJnc1sxXTsKKworICAgICAgICAgICAgaWYgKGNvbWJpbmVUZXh0SXRlbXMgJiYgaXNTYW1lVGV4dExpbmUgJiYgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkICYmIGFkdmFuY2UgPiAwICYmIGFkdmFuY2UgPD0gdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4KSB7CisgICAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TGluZU1hdHJpeChhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICs9IGFyZ3NbMF0gLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aDsKKyAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBhcmdzWzFdIC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0OworICAgICAgICAgICAgICBkaWZmID0gYXJnc1swXSAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZVdpZHRoIC0gKGFyZ3NbMV0gLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VIZWlnaHQpOworICAgICAgICAgICAgICBhZGRGYWtlU3BhY2VzKGRpZmYsIHRleHRDb250ZW50SXRlbS5zdHIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TGluZU1hdHJpeChhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExlYWRpbmdNb3ZlVGV4dDoKKyAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICB0ZXh0U3RhdGUubGVhZGluZyA9IC1hcmdzWzFdOworICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmU6CisgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgdGV4dFN0YXRlLmNhcnJpYWdlUmV0dXJuKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRNYXRyaXg6CisgICAgICAgICAgICBhZHZhbmNlID0gdGV4dFN0YXRlLmNhbGNUZXh0TGluZU1hdHJpeEFkdmFuY2UoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7CisKKyAgICAgICAgICAgIGlmIChjb21iaW5lVGV4dEl0ZW1zICYmIGFkdmFuY2UgIT09IG51bGwgJiYgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkICYmIGFkdmFuY2UudmFsdWUgPiAwICYmIGFkdmFuY2UudmFsdWUgPD0gdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4KSB7CisgICAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TGluZU1hdHJpeChhZHZhbmNlLndpZHRoLCBhZHZhbmNlLmhlaWdodCk7CisgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCArPSBhZHZhbmNlLndpZHRoIC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGg7CisgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgKz0gYWR2YW5jZS5oZWlnaHQgLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VIZWlnaHQ7CisgICAgICAgICAgICAgIGRpZmYgPSBhZHZhbmNlLndpZHRoIC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGggLSAoYWR2YW5jZS5oZWlnaHQgLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VIZWlnaHQpOworICAgICAgICAgICAgICBhZGRGYWtlU3BhY2VzKGRpZmYsIHRleHRDb250ZW50SXRlbS5zdHIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS5zZXRUZXh0TWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOworICAgICAgICAgICAgdGV4dFN0YXRlLnNldFRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZzoKKyAgICAgICAgICAgIHRleHRTdGF0ZS5jaGFyU3BhY2luZyA9IGFyZ3NbMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFdvcmRTcGFjaW5nOgorICAgICAgICAgICAgdGV4dFN0YXRlLndvcmRTcGFjaW5nID0gYXJnc1swXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5UZXh0OgorICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CisgICAgICAgICAgICB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVguc2xpY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hvd1NwYWNlZFRleHQ6CisgICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CisgICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaXRlbXMgPSBhcmdzWzBdOworICAgICAgICAgICAgdmFyIG9mZnNldDsKKworICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW1zW2pdID09PSAic3RyaW5nIikgeworICAgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGl0ZW1zW2pdKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNOdW0pKGl0ZW1zW2pdKSkgeworICAgICAgICAgICAgICAgIGVuc3VyZVRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBpdGVtc1tqXSAqIHRleHRTdGF0ZS5mb250U2l6ZSAvIDEwMDA7CisgICAgICAgICAgICAgICAgdmFyIGJyZWFrVGV4dFJ1biA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKHRleHRTdGF0ZS5mb250LnZlcnRpY2FsKSB7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBhZHZhbmNlOworICAgICAgICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrVGV4dFJ1biA9IHRleHRDb250ZW50SXRlbS50ZXh0UnVuQnJlYWtBbGxvd2VkICYmIGFkdmFuY2UgPiB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXg7CisKKyAgICAgICAgICAgICAgICAgIGlmICghYnJlYWtUZXh0UnVuKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gLWFkdmFuY2U7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBhZHZhbmNlICogdGV4dFN0YXRlLnRleHRIU2NhbGU7CisgICAgICAgICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeChvZmZzZXQsIDApOworICAgICAgICAgICAgICAgICAgYnJlYWtUZXh0UnVuID0gdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgJiYgYWR2YW5jZSA+IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heDsKKworICAgICAgICAgICAgICAgICAgaWYgKCFicmVha1RleHRSdW4pIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYnJlYWtUZXh0UnVuKSB7CisgICAgICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWR2YW5jZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgIGFkZEZha2VTcGFjZXMoYWR2YW5jZSwgdGV4dENvbnRlbnRJdGVtLnN0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hvd1RleHQ6CisgICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CisgICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbShhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmVTaG93VGV4dDoKKyAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICB0ZXh0U3RhdGUuY2FycmlhZ2VSZXR1cm4oKTsKKyAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDoKKyAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICB0ZXh0U3RhdGUud29yZFNwYWNpbmcgPSBhcmdzWzBdOworICAgICAgICAgICAgdGV4dFN0YXRlLmNoYXJTcGFjaW5nID0gYXJnc1sxXTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOworICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oYXJnc1syXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50WE9iamVjdDoKKyAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisKKyAgICAgICAgICAgIGlmICgheG9ianMpIHsKKyAgICAgICAgICAgICAgeG9ianMgPSByZXNvdXJjZXMuZ2V0KCJYT2JqZWN0IikgfHwgX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIG5hbWUgPSBhcmdzWzBdLm5hbWU7CisKKyAgICAgICAgICAgIGlmIChuYW1lICYmIGVtcHR5WE9iamVjdENhY2hlLmdldEJ5TmFtZShuYW1lKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpIHsKKyAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGxldCB4b2JqID0geG9ianMuZ2V0UmF3KG5hbWUpOworCisgICAgICAgICAgICAgIGlmICh4b2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICAgICAgICAgICAgaWYgKGVtcHR5WE9iamVjdENhY2hlLmdldEJ5UmVmKHhvYmopKSB7CisgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHhvYmogPSB4cmVmLmZldGNoKHhvYmopOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKHhvYmopKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJYT2JqZWN0IHNob3VsZCBiZSBhIHN0cmVhbSIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHhvYmouZGljdC5nZXQoIlN1YnR5cGUiKTsKKworICAgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJYT2JqZWN0IHNob3VsZCBoYXZlIGEgTmFtZSBzdWJ0eXBlIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lICE9PSAiRm9ybSIpIHsKKyAgICAgICAgICAgICAgICBlbXB0eVhPYmplY3RDYWNoZS5zZXQobmFtZSwgeG9iai5kaWN0Lm9iaklkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHN0YXRlTWFuYWdlci5zdGF0ZS5jbG9uZSgpOworICAgICAgICAgICAgICBjb25zdCB4T2JqU3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihjdXJyZW50U3RhdGUpOworICAgICAgICAgICAgICBjb25zdCBtYXRyaXggPSB4b2JqLmRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpOworCisgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdHJpeCkgJiYgbWF0cml4Lmxlbmd0aCA9PT0gNikgeworICAgICAgICAgICAgICAgIHhPYmpTdGF0ZU1hbmFnZXIudHJhbnNmb3JtKG1hdHJpeCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKKyAgICAgICAgICAgICAgY29uc3Qgc2lua1dyYXBwZXIgPSB7CisgICAgICAgICAgICAgICAgZW5xdWV1ZUludm9rZWQ6IGZhbHNlLAorCisgICAgICAgICAgICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgdGhpcy5lbnF1ZXVlSW52b2tlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBzaW5rLmVucXVldWUoY2h1bmssIHNpemUpOworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBnZXQgZGVzaXJlZFNpemUoKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5kZXNpcmVkU2l6ZTsKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgZ2V0IHJlYWR5KCkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmsucmVhZHk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIHNlbGYuZ2V0VGV4dENvbnRlbnQoeworICAgICAgICAgICAgICAgIHN0cmVhbTogeG9iaiwKKyAgICAgICAgICAgICAgICB0YXNrLAorICAgICAgICAgICAgICAgIHJlc291cmNlczogeG9iai5kaWN0LmdldCgiUmVzb3VyY2VzIikgfHwgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlcjogeE9ialN0YXRlTWFuYWdlciwKKyAgICAgICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlLAorICAgICAgICAgICAgICAgIGNvbWJpbmVUZXh0SXRlbXMsCisgICAgICAgICAgICAgICAgc2luazogc2lua1dyYXBwZXIsCisgICAgICAgICAgICAgICAgc2VlblN0eWxlcworICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNpbmtXcmFwcGVyLmVucXVldWVJbnZva2VkKSB7CisgICAgICAgICAgICAgICAgICBlbXB0eVhPYmplY3RDYWNoZS5zZXQobmFtZSwgeG9iai5kaWN0Lm9iaklkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOworICAgICAgICAgICAgICB9LCByZWplY3RYT2JqZWN0KTsKKyAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgWE9iamVjdDogIiR7cmVhc29ufSIuYCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0R1N0YXRlOgorICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKKworICAgICAgICAgICAgaWYgKG5hbWUgJiYgZW1wdHlHU3RhdGVDYWNoZS5nZXRCeU5hbWUobmFtZSkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgeworICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb25zdCBleHRHU3RhdGUgPSByZXNvdXJjZXMuZ2V0KCJFeHRHU3RhdGUiKTsKKworICAgICAgICAgICAgICBpZiAoIShleHRHU3RhdGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb25zdCBnU3RhdGUgPSBleHRHU3RhdGUuZ2V0KG5hbWUpOworCisgICAgICAgICAgICAgIGlmICghKGdTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZUZvbnQgPSBnU3RhdGUuZ2V0KCJGb250Iik7CisKKyAgICAgICAgICAgICAgaWYgKCFnU3RhdGVGb250KSB7CisgICAgICAgICAgICAgICAgZW1wdHlHU3RhdGVDYWNoZS5zZXQobmFtZSwgZ1N0YXRlLm9iaklkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXNvbHZlR1N0YXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnROYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZ1N0YXRlRm9udFsxXTsKKyAgICAgICAgICAgICAgaGFuZGxlU2V0Rm9udChudWxsLCBnU3RhdGVGb250WzBdKS50aGVuKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSk7CisgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7cmVhc29ufSIuYCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aCA+PSBzaW5rLmRlc2lyZWRTaXplKSB7CisgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN0b3ApIHsKKyAgICAgICAgbmV4dChkZWZlcnJlZCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgIGVucXVldWVDaHVuaygpOworICAgICAgcmVzb2x2ZSgpOworICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICAoMCwgX3V0aWwud2FybikoYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJHt0YXNrLm5hbWV9IiBgICsgYHRhc2s6ICIke3JlYXNvbn0iLmApOworICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aHJvdyByZWFzb247CisgICAgfSk7CisgIH0KKworICBleHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgYmFzZURpY3QsIHByb3BlcnRpZXMpIHsKKyAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOworICAgIGxldCBjaWRUb0dpZEJ5dGVzOworICAgIHZhciB0b1VuaWNvZGUgPSBkaWN0LmdldCgiVG9Vbmljb2RlIikgfHwgYmFzZURpY3QuZ2V0KCJUb1VuaWNvZGUiKTsKKyAgICB2YXIgdG9Vbmljb2RlUHJvbWlzZSA9IHRvVW5pY29kZSA/IHRoaXMucmVhZFRvVW5pY29kZSh0b1VuaWNvZGUpIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7CisKKyAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKKyAgICAgIHZhciBjaWRTeXN0ZW1JbmZvID0gZGljdC5nZXQoIkNJRFN5c3RlbUluZm8iKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGNpZFN5c3RlbUluZm8pKSB7CisgICAgICAgIHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mbyA9IHsKKyAgICAgICAgICByZWdpc3RyeTogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShjaWRTeXN0ZW1JbmZvLmdldCgiUmVnaXN0cnkiKSksCisgICAgICAgICAgb3JkZXJpbmc6ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoY2lkU3lzdGVtSW5mby5nZXQoIk9yZGVyaW5nIikpLAorICAgICAgICAgIHN1cHBsZW1lbnQ6IGNpZFN5c3RlbUluZm8uZ2V0KCJTdXBwbGVtZW50IikKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgdmFyIGNpZFRvR2lkTWFwID0gZGljdC5nZXQoIkNJRFRvR0lETWFwIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGNpZFRvR2lkTWFwKSkgeworICAgICAgICBjaWRUb0dpZEJ5dGVzID0gY2lkVG9HaWRNYXAuZ2V0Qnl0ZXMoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZGlmZmVyZW5jZXMgPSBbXTsKKyAgICB2YXIgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CisgICAgdmFyIGVuY29kaW5nOworCisgICAgaWYgKGRpY3QuaGFzKCJFbmNvZGluZyIpKSB7CisgICAgICBlbmNvZGluZyA9IGRpY3QuZ2V0KCJFbmNvZGluZyIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZW5jb2RpbmcpKSB7CisgICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBlbmNvZGluZy5nZXQoIkJhc2VFbmNvZGluZyIpOworICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoYmFzZUVuY29kaW5nTmFtZSkgPyBiYXNlRW5jb2RpbmdOYW1lLm5hbWUgOiBudWxsOworCisgICAgICAgIGlmIChlbmNvZGluZy5oYXMoIkRpZmZlcmVuY2VzIikpIHsKKyAgICAgICAgICB2YXIgZGlmZkVuY29kaW5nID0gZW5jb2RpbmcuZ2V0KCJEaWZmZXJlbmNlcyIpOworICAgICAgICAgIHZhciBpbmRleCA9IDA7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBkaWZmRW5jb2RpbmcubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgdmFyIGRhdGEgPSB4cmVmLmZldGNoSWZSZWYoZGlmZkVuY29kaW5nW2pdKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc051bSkoZGF0YSkpIHsKKyAgICAgICAgICAgICAgaW5kZXggPSBkYXRhOworICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShkYXRhKSkgeworICAgICAgICAgICAgICBkaWZmZXJlbmNlc1tpbmRleCsrXSA9IGRhdGEubmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBlbnRyeSBpbiAnRGlmZmVyZW5jZXMnIGFycmF5OiAke2RhdGF9YCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGVuY29kaW5nKSkgeworICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRW5jb2RpbmcgaXMgbm90IGEgTmFtZSBub3IgYSBEaWN0Iik7CisgICAgICB9CisKKyAgICAgIGlmIChiYXNlRW5jb2RpbmdOYW1lICE9PSAiTWFjUm9tYW5FbmNvZGluZyIgJiYgYmFzZUVuY29kaW5nTmFtZSAhPT0gIk1hY0V4cGVydEVuY29kaW5nIiAmJiBiYXNlRW5jb2RpbmdOYW1lICE9PSAiV2luQW5zaUVuY29kaW5nIikgeworICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmFzZUVuY29kaW5nTmFtZSkgeworICAgICAgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPSAoMCwgX2VuY29kaW5ncy5nZXRFbmNvZGluZykoYmFzZUVuY29kaW5nTmFtZSkuc2xpY2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIF9mb250cy5Gb250RmxhZ3MuU3ltYm9saWMpOworICAgICAgdmFyIGlzTm9uc3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIF9mb250cy5Gb250RmxhZ3MuTm9uc3ltYm9saWMpOworICAgICAgZW5jb2RpbmcgPSBfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2Rpbmc7CisKKyAgICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09ICJUcnVlVHlwZSIgJiYgIWlzTm9uc3ltYm9saWNGb250KSB7CisgICAgICAgIGVuY29kaW5nID0gX2VuY29kaW5ncy5XaW5BbnNpRW5jb2Rpbmc7CisgICAgICB9CisKKyAgICAgIGlmIChpc1N5bWJvbGljRm9udCkgeworICAgICAgICBlbmNvZGluZyA9IF9lbmNvZGluZ3MuTWFjUm9tYW5FbmNvZGluZzsKKworICAgICAgICBpZiAoIXByb3BlcnRpZXMuZmlsZSkgeworICAgICAgICAgIGlmICgvU3ltYm9sL2kudGVzdChwcm9wZXJ0aWVzLm5hbWUpKSB7CisgICAgICAgICAgICBlbmNvZGluZyA9IF9lbmNvZGluZ3MuU3ltYm9sU2V0RW5jb2Rpbmc7CisgICAgICAgICAgfSBlbHNlIGlmICgvRGluZ2JhdHN8V2luZ2RpbmdzL2kudGVzdChwcm9wZXJ0aWVzLm5hbWUpKSB7CisgICAgICAgICAgICBlbmNvZGluZyA9IF9lbmNvZGluZ3MuWmFwZkRpbmdiYXRzRW5jb2Rpbmc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgcHJvcGVydGllcy5kaWZmZXJlbmNlcyA9IGRpZmZlcmVuY2VzOworICAgIHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSA9IGJhc2VFbmNvZGluZ05hbWU7CisgICAgcHJvcGVydGllcy5oYXNFbmNvZGluZyA9ICEhYmFzZUVuY29kaW5nTmFtZSB8fCBkaWZmZXJlbmNlcy5sZW5ndGggPiAwOworICAgIHByb3BlcnRpZXMuZGljdCA9IGRpY3Q7CisgICAgcmV0dXJuIHRvVW5pY29kZVByb21pc2UudGhlbihyZWFkVG9Vbmljb2RlID0+IHsKKyAgICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gcmVhZFRvVW5pY29kZTsKKyAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpOworICAgIH0pLnRoZW4oYnVpbHRUb1VuaWNvZGUgPT4geworICAgICAgcHJvcGVydGllcy50b1VuaWNvZGUgPSBidWlsdFRvVW5pY29kZTsKKworICAgICAgaWYgKGNpZFRvR2lkQnl0ZXMpIHsKKyAgICAgICAgcHJvcGVydGllcy5jaWRUb0dpZE1hcCA9IHRoaXMucmVhZENpZFRvR2lkTWFwKGNpZFRvR2lkQnl0ZXMsIGJ1aWx0VG9Vbmljb2RlKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfSk7CisgIH0KKworICBfYnVpbGRTaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIGZvcmNlR2x5cGhzID0gZmFsc2UpIHsKKyAgICAoMCwgX3V0aWwuYXNzZXJ0KSghcHJvcGVydGllcy5jb21wb3NpdGUsICJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7CisgICAgY29uc3QgdG9Vbmljb2RlID0gW107CisgICAgY29uc3QgZW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZy5zbGljZSgpOworICAgIGNvbnN0IGJhc2VFbmNvZGluZ05hbWUgPSBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWU7CisgICAgY29uc3QgZGlmZmVyZW5jZXMgPSBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzOworCisgICAgZm9yIChjb25zdCBjaGFyY29kZSBpbiBkaWZmZXJlbmNlcykgeworICAgICAgY29uc3QgZ2x5cGhOYW1lID0gZGlmZmVyZW5jZXNbY2hhcmNvZGVdOworCisgICAgICBpZiAoZ2x5cGhOYW1lID09PSAiLm5vdGRlZiIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGVuY29kaW5nW2NoYXJjb2RlXSA9IGdseXBoTmFtZTsKKyAgICB9CisKKyAgICBjb25zdCBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKworICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZW5jb2RpbmcpIHsKKyAgICAgIGxldCBnbHlwaE5hbWUgPSBlbmNvZGluZ1tjaGFyY29kZV07CisKKyAgICAgIGlmIChnbHlwaE5hbWUgPT09ICIiKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmIChnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICBsZXQgY29kZSA9IDA7CisKKyAgICAgICAgc3dpdGNoIChnbHlwaE5hbWVbMF0pIHsKKyAgICAgICAgICBjYXNlICJHIjoKKyAgICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSAzKSB7CisgICAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiZyI6CisgICAgICAgICAgICBpZiAoZ2x5cGhOYW1lLmxlbmd0aCA9PT0gNSkgeworICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoZ2x5cGhOYW1lLnN1YnN0cmluZygxKSwgMTYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkMiOgorICAgICAgICAgIGNhc2UgImMiOgorICAgICAgICAgICAgaWYgKGdseXBoTmFtZS5sZW5ndGggPj0gMyAmJiBnbHlwaE5hbWUubGVuZ3RoIDw9IDQpIHsKKyAgICAgICAgICAgICAgY29uc3QgY29kZVN0ciA9IGdseXBoTmFtZS5zdWJzdHJpbmcoMSk7CisKKyAgICAgICAgICAgICAgaWYgKGZvcmNlR2x5cGhzKSB7CisgICAgICAgICAgICAgICAgY29kZSA9IHBhcnNlSW50KGNvZGVTdHIsIDE2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvZGUgPSArY29kZVN0cjsKKworICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGNvZGUpICYmIE51bWJlci5pc0ludGVnZXIocGFyc2VJbnQoY29kZVN0ciwgMTYpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUocHJvcGVydGllcywgdHJ1ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29uc3QgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CisKKyAgICAgICAgICAgIGlmICh1bmljb2RlICE9PSAtMSkgeworICAgICAgICAgICAgICBjb2RlID0gdW5pY29kZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGUgPiAwICYmIGNvZGUgPD0gMHgxMGZmZmYgJiYgTnVtYmVyLmlzSW50ZWdlcihjb2RlKSkgeworICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmdOYW1lICYmIGNvZGUgPT09ICtjaGFyY29kZSkgeworICAgICAgICAgICAgY29uc3QgYmFzZUVuY29kaW5nID0gKDAsIF9lbmNvZGluZ3MuZ2V0RW5jb2RpbmcpKGJhc2VFbmNvZGluZ05hbWUpOworCisgICAgICAgICAgICBpZiAoYmFzZUVuY29kaW5nICYmIChnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbY2hhcmNvZGVdKSkgeworICAgICAgICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZShnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV0pOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSk7CisgICAgICAgIH0KKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdG9Vbmljb2RlW2NoYXJjb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZ2x5cGhzVW5pY29kZU1hcFtnbHlwaE5hbWVdKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IF9mb250cy5Ub1VuaWNvZGVNYXAodG9Vbmljb2RlKTsKKyAgfQorCisgIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHsKKyAgICBwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwID0gISFwcm9wZXJ0aWVzLnRvVW5pY29kZSAmJiBwcm9wZXJ0aWVzLnRvVW5pY29kZS5sZW5ndGggPiAwOworCisgICAgaWYgKHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApIHsKKyAgICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUgJiYgcHJvcGVydGllcy5oYXNFbmNvZGluZykgeworICAgICAgICBwcm9wZXJ0aWVzLmZhbGxiYWNrVG9Vbmljb2RlID0gdGhpcy5fYnVpbGRTaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMpOworICAgICAgfQorCisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb3BlcnRpZXMudG9Vbmljb2RlKTsKKyAgICB9CisKKyAgICBpZiAoIXByb3BlcnRpZXMuY29tcG9zaXRlKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzKSk7CisgICAgfQorCisgICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlICYmIChwcm9wZXJ0aWVzLmNNYXAuYnVpbHRJbkNNYXAgJiYgIShwcm9wZXJ0aWVzLmNNYXAgaW5zdGFuY2VvZiBfY21hcC5JZGVudGl0eUNNYXApIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5yZWdpc3RyeSA9PT0gIkFkb2JlIiAmJiAocHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiR0IxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJDTlMxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJKYXBhbjEiIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIktvcmVhMSIpKSkgeworICAgICAgY29uc3QgcmVnaXN0cnkgPSBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ucmVnaXN0cnk7CisgICAgICBjb25zdCBvcmRlcmluZyA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZzsKKworICAgICAgY29uc3QgdWNzMkNNYXBOYW1lID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQocmVnaXN0cnkgKyAiLSIgKyBvcmRlcmluZyArICItVUNTMiIpOworCisgICAgICByZXR1cm4gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgICAgZW5jb2Rpbmc6IHVjczJDTWFwTmFtZSwKKyAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAorICAgICAgICB1c2VDTWFwOiBudWxsCisgICAgICB9KS50aGVuKGZ1bmN0aW9uICh1Y3MyQ01hcCkgeworICAgICAgICBjb25zdCBjTWFwID0gcHJvcGVydGllcy5jTWFwOworICAgICAgICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKKyAgICAgICAgY01hcC5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyY29kZSwgY2lkKSB7CisgICAgICAgICAgaWYgKGNpZCA+IDB4ZmZmZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNYXggc2l6ZSBvZiBDSUQgaXMgNjUsNTM1Iik7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgdWNzMiA9IHVjczJDTWFwLmxvb2t1cChjaWQpOworCisgICAgICAgICAgaWYgKHVjczIpIHsKKyAgICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCh1Y3MyLmNoYXJDb2RlQXQoMCkgPDwgOCkgKyB1Y3MyLmNoYXJDb2RlQXQoMSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBuZXcgX2ZvbnRzLlRvVW5pY29kZU1hcCh0b1VuaWNvZGUpOworICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgX2ZvbnRzLklkZW50aXR5VG9Vbmljb2RlTWFwKHByb3BlcnRpZXMuZmlyc3RDaGFyLCBwcm9wZXJ0aWVzLmxhc3RDaGFyKSk7CisgIH0KKworICByZWFkVG9Vbmljb2RlKHRvVW5pY29kZSkgeworICAgIHZhciBjbWFwT2JqID0gdG9Vbmljb2RlOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGNtYXBPYmopKSB7CisgICAgICByZXR1cm4gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgICAgZW5jb2Rpbmc6IGNtYXBPYmosCisgICAgICAgIGZldGNoQnVpbHRJbkNNYXA6IHRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCwKKyAgICAgICAgdXNlQ01hcDogbnVsbAorICAgICAgfSkudGhlbihmdW5jdGlvbiAoY21hcCkgeworICAgICAgICBpZiAoY21hcCBpbnN0YW5jZW9mIF9jbWFwLklkZW50aXR5Q01hcCkgeworICAgICAgICAgIHJldHVybiBuZXcgX2ZvbnRzLklkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IF9mb250cy5Ub1VuaWNvZGVNYXAoY21hcC5nZXRNYXAoKSk7CisgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoY21hcE9iaikpIHsKKyAgICAgIHJldHVybiBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgICBlbmNvZGluZzogY21hcE9iaiwKKyAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAorICAgICAgICB1c2VDTWFwOiBudWxsCisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICAgIGlmIChjbWFwIGluc3RhbmNlb2YgX2NtYXAuSWRlbnRpdHlDTWFwKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBfZm9udHMuSWRlbnRpdHlUb1VuaWNvZGVNYXAoMCwgMHhmZmZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBtYXAgPSBuZXcgQXJyYXkoY21hcC5sZW5ndGgpOworICAgICAgICBjbWFwLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCB0b2tlbikgeworICAgICAgICAgIHZhciBzdHIgPSBbXTsKKworICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdG9rZW4ubGVuZ3RoOyBrICs9IDIpIHsKKyAgICAgICAgICAgIHZhciB3MSA9IHRva2VuLmNoYXJDb2RlQXQoaykgPDwgOCB8IHRva2VuLmNoYXJDb2RlQXQoayArIDEpOworCisgICAgICAgICAgICBpZiAoKHcxICYgMHhmODAwKSAhPT0gMHhkODAwKSB7CisgICAgICAgICAgICAgIHN0ci5wdXNoKHcxKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGsgKz0gMjsKKyAgICAgICAgICAgIHZhciB3MiA9IHRva2VuLmNoYXJDb2RlQXQoaykgPDwgOCB8IHRva2VuLmNoYXJDb2RlQXQoayArIDEpOworICAgICAgICAgICAgc3RyLnB1c2goKCh3MSAmIDB4M2ZmKSA8PCAxMCkgKyAodzIgJiAweDNmZikgKyAweDEwMDAwKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBtYXBbY2hhckNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLCBzdHIpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG5ldyBfZm9udHMuVG9Vbmljb2RlTWFwKG1hcCk7CisgICAgICB9LCByZWFzb24gPT4geworICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250VG9Vbmljb2RlCisgICAgICAgICAgfSk7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGByZWFkVG9Vbmljb2RlIC0gaWdub3JpbmcgVG9Vbmljb2RlIGRhdGE6ICIke3JlYXNvbn0iLmApOworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKKyAgfQorCisgIHJlYWRDaWRUb0dpZE1hcChnbHlwaHNEYXRhLCB0b1VuaWNvZGUpIHsKKyAgICB2YXIgcmVzdWx0ID0gW107CisKKyAgICBmb3IgKHZhciBqID0gMCwgamogPSBnbHlwaHNEYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgIHZhciBnbHlwaElEID0gZ2x5cGhzRGF0YVtqKytdIDw8IDggfCBnbHlwaHNEYXRhW2pdOworICAgICAgY29uc3QgY29kZSA9IGogPj4gMTsKKworICAgICAgaWYgKGdseXBoSUQgPT09IDAgJiYgIXRvVW5pY29kZS5oYXMoY29kZSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHJlc3VsdFtjb2RlXSA9IGdseXBoSUQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgcHJvcGVydGllcykgeworICAgIHZhciB4cmVmID0gdGhpcy54cmVmOworICAgIHZhciBnbHlwaHNXaWR0aHMgPSBbXTsKKyAgICB2YXIgZGVmYXVsdFdpZHRoID0gMDsKKyAgICB2YXIgZ2x5cGhzVk1ldHJpY3MgPSBbXTsKKyAgICB2YXIgZGVmYXVsdFZNZXRyaWNzOworICAgIHZhciBpLCBpaSwgaiwgamosIHN0YXJ0LCBjb2RlLCB3aWR0aHM7CisKKyAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKKyAgICAgIGRlZmF1bHRXaWR0aCA9IGRpY3QuaGFzKCJEVyIpID8gZGljdC5nZXQoIkRXIikgOiAxMDAwOworICAgICAgd2lkdGhzID0gZGljdC5nZXQoIlciKTsKKworICAgICAgaWYgKHdpZHRocykgeworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgc3RhcnQgPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2krK10pOworICAgICAgICAgIGNvZGUgPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2ldKTsKKworICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvZGUpKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvZGUubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgICBnbHlwaHNXaWR0aHNbc3RhcnQrK10gPSB4cmVmLmZldGNoSWZSZWYoY29kZVtqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciB3aWR0aCA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbKytpXSk7CisKKyAgICAgICAgICAgIGZvciAoaiA9IHN0YXJ0OyBqIDw9IGNvZGU7IGorKykgeworICAgICAgICAgICAgICBnbHlwaHNXaWR0aHNbal0gPSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHByb3BlcnRpZXMudmVydGljYWwpIHsKKyAgICAgICAgdmFyIHZtZXRyaWNzID0gZGljdC5nZXRBcnJheSgiRFcyIikgfHwgWzg4MCwgLTEwMDBdOworICAgICAgICBkZWZhdWx0Vk1ldHJpY3MgPSBbdm1ldHJpY3NbMV0sIGRlZmF1bHRXaWR0aCAqIDAuNSwgdm1ldHJpY3NbMF1dOworICAgICAgICB2bWV0cmljcyA9IGRpY3QuZ2V0KCJXMiIpOworCisgICAgICAgIGlmICh2bWV0cmljcykgeworICAgICAgICAgIGZvciAoaSA9IDAsIGlpID0gdm1ldHJpY3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgc3RhcnQgPSB4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbaSsrXSk7CisgICAgICAgICAgICBjb2RlID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2ldKTsKKworICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29kZSkpIHsKKyAgICAgICAgICAgICAgZm9yIChqID0gMCwgamogPSBjb2RlLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICAgICAgICBnbHlwaHNWTWV0cmljc1tzdGFydCsrXSA9IFt4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSwgeHJlZi5mZXRjaElmUmVmKGNvZGVbaisrXSksIHhyZWYuZmV0Y2hJZlJlZihjb2RlW2pdKV07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHZhciB2bWV0cmljID0gW3hyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSwgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pLCB4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSldOworCisgICAgICAgICAgICAgIGZvciAoaiA9IHN0YXJ0OyBqIDw9IGNvZGU7IGorKykgeworICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW2pdID0gdm1ldHJpYzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgZmlyc3RDaGFyID0gcHJvcGVydGllcy5maXJzdENoYXI7CisgICAgICB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIik7CisKKyAgICAgIGlmICh3aWR0aHMpIHsKKyAgICAgICAgaiA9IGZpcnN0Q2hhcjsKKworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgZ2x5cGhzV2lkdGhzW2orK10gPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHRXaWR0aCA9IHBhcnNlRmxvYXQoZGVzY3JpcHRvci5nZXQoIk1pc3NpbmdXaWR0aCIpKSB8fCAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGJhc2VGb250TmFtZSA9IGRpY3QuZ2V0KCJCYXNlRm9udCIpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShiYXNlRm9udE5hbWUpKSB7CisgICAgICAgICAgdmFyIG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUubmFtZSk7CisgICAgICAgICAgZ2x5cGhzV2lkdGhzID0gdGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChtZXRyaWNzLndpZHRocywgcHJvcGVydGllcyk7CisgICAgICAgICAgZGVmYXVsdFdpZHRoID0gbWV0cmljcy5kZWZhdWx0V2lkdGg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgaXNNb25vc3BhY2UgPSB0cnVlOworICAgIHZhciBmaXJzdFdpZHRoID0gZGVmYXVsdFdpZHRoOworCisgICAgZm9yICh2YXIgZ2x5cGggaW4gZ2x5cGhzV2lkdGhzKSB7CisgICAgICB2YXIgZ2x5cGhXaWR0aCA9IGdseXBoc1dpZHRoc1tnbHlwaF07CisKKyAgICAgIGlmICghZ2x5cGhXaWR0aCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFmaXJzdFdpZHRoKSB7CisgICAgICAgIGZpcnN0V2lkdGggPSBnbHlwaFdpZHRoOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpcnN0V2lkdGggIT09IGdseXBoV2lkdGgpIHsKKyAgICAgICAgaXNNb25vc3BhY2UgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzTW9ub3NwYWNlKSB7CisgICAgICBwcm9wZXJ0aWVzLmZsYWdzIHw9IF9mb250cy5Gb250RmxhZ3MuRml4ZWRQaXRjaDsKKyAgICB9CisKKyAgICBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aDsKKyAgICBwcm9wZXJ0aWVzLndpZHRocyA9IGdseXBoc1dpZHRoczsKKyAgICBwcm9wZXJ0aWVzLmRlZmF1bHRWTWV0cmljcyA9IGRlZmF1bHRWTWV0cmljczsKKyAgICBwcm9wZXJ0aWVzLnZtZXRyaWNzID0gZ2x5cGhzVk1ldHJpY3M7CisgIH0KKworICBpc1NlcmlmRm9udChiYXNlRm9udE5hbWUpIHsKKyAgICB2YXIgZm9udE5hbWVXb1N0eWxlID0gYmFzZUZvbnROYW1lLnNwbGl0KCItIilbMF07CisgICAgcmV0dXJuIGZvbnROYW1lV29TdHlsZSBpbiAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFNlcmlmRm9udHMpKCkgfHwgZm9udE5hbWVXb1N0eWxlLnNlYXJjaCgvc2VyaWYvZ2kpICE9PSAtMTsKKyAgfQorCisgIGdldEJhc2VGb250TWV0cmljcyhuYW1lKSB7CisgICAgdmFyIGRlZmF1bHRXaWR0aCA9IDA7CisgICAgdmFyIHdpZHRocyA9IFtdOworICAgIHZhciBtb25vc3BhY2UgPSBmYWxzZTsKKyAgICB2YXIgc3RkRm9udE1hcCA9ICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0U3RkRm9udE1hcCkoKTsKKyAgICB2YXIgbG9va3VwTmFtZSA9IHN0ZEZvbnRNYXBbbmFtZV0gfHwgbmFtZTsKKyAgICB2YXIgTWV0cmljcyA9ICgwLCBfbWV0cmljcy5nZXRNZXRyaWNzKSgpOworCisgICAgaWYgKCEobG9va3VwTmFtZSBpbiBNZXRyaWNzKSkgeworICAgICAgaWYgKHRoaXMuaXNTZXJpZkZvbnQobmFtZSkpIHsKKyAgICAgICAgbG9va3VwTmFtZSA9ICJUaW1lcy1Sb21hbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb29rdXBOYW1lID0gIkhlbHZldGljYSI7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGdseXBoV2lkdGhzID0gTWV0cmljc1tsb29rdXBOYW1lXTsKKworICAgIGlmICgoMCwgX3V0aWwuaXNOdW0pKGdseXBoV2lkdGhzKSkgeworICAgICAgZGVmYXVsdFdpZHRoID0gZ2x5cGhXaWR0aHM7CisgICAgICBtb25vc3BhY2UgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICB3aWR0aHMgPSBnbHlwaFdpZHRocygpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBkZWZhdWx0V2lkdGgsCisgICAgICBtb25vc3BhY2UsCisgICAgICB3aWR0aHMKKyAgICB9OworICB9CisKKyAgYnVpbGRDaGFyQ29kZVRvV2lkdGgod2lkdGhzQnlHbHlwaE5hbWUsIHByb3BlcnRpZXMpIHsKKyAgICB2YXIgd2lkdGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB2YXIgZGlmZmVyZW5jZXMgPSBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzOworICAgIHZhciBlbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nOworCisgICAgZm9yICh2YXIgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgeworICAgICAgaWYgKGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzICYmIHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV0pIHsKKyAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV07CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoY2hhckNvZGUgaW4gZW5jb2RpbmcgJiYgd2lkdGhzQnlHbHlwaE5hbWVbZW5jb2RpbmdbY2hhckNvZGVdXSkgeworICAgICAgICB3aWR0aHNbY2hhckNvZGVdID0gd2lkdGhzQnlHbHlwaE5hbWVbZW5jb2RpbmdbY2hhckNvZGVdXTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHdpZHRoczsKKyAgfQorCisgIHByZUV2YWx1YXRlRm9udChkaWN0KSB7CisgICAgdmFyIGJhc2VEaWN0ID0gZGljdDsKKyAgICB2YXIgdHlwZSA9IGRpY3QuZ2V0KCJTdWJ0eXBlIik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUpKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7CisgICAgfQorCisgICAgdmFyIGNvbXBvc2l0ZSA9IGZhbHNlOworICAgIHZhciB1aW50OGFycmF5OworCisgICAgaWYgKHR5cGUubmFtZSA9PT0gIlR5cGUwIikgeworICAgICAgdmFyIGRmID0gZGljdC5nZXQoIkRlc2NlbmRhbnRGb250cyIpOworCisgICAgICBpZiAoIWRmKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRGVzY2VuZGFudCBmb250cyBhcmUgbm90IHNwZWNpZmllZCIpOworICAgICAgfQorCisgICAgICBkaWN0ID0gQXJyYXkuaXNBcnJheShkZikgPyB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkZlswXSkgOiBkZjsKKyAgICAgIHR5cGUgPSBkaWN0LmdldCgiU3VidHlwZSIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBmb250IFN1YnR5cGUiKTsKKyAgICAgIH0KKworICAgICAgY29tcG9zaXRlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2YXIgZGVzY3JpcHRvciA9IGRpY3QuZ2V0KCJGb250RGVzY3JpcHRvciIpOworCisgICAgaWYgKGRlc2NyaXB0b3IpIHsKKyAgICAgIHZhciBoYXNoID0gbmV3IF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KCk7CisgICAgICB2YXIgZW5jb2RpbmcgPSBiYXNlRGljdC5nZXRSYXcoIkVuY29kaW5nIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShlbmNvZGluZykpIHsKKyAgICAgICAgaGFzaC51cGRhdGUoZW5jb2RpbmcubmFtZSk7CisgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikoZW5jb2RpbmcpKSB7CisgICAgICAgIGhhc2gudXBkYXRlKGVuY29kaW5nLnRvU3RyaW5nKCkpOworICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShlbmNvZGluZykpIHsKKyAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbmNvZGluZy5nZXRSYXdWYWx1ZXMoKSkgeworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShlbnRyeSkpIHsKKyAgICAgICAgICAgIGhhc2gudXBkYXRlKGVudHJ5Lm5hbWUpOworICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKShlbnRyeSkpIHsKKyAgICAgICAgICAgIGhhc2gudXBkYXRlKGVudHJ5LnRvU3RyaW5nKCkpOworICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKKyAgICAgICAgICAgIHZhciBkaWZmTGVuZ3RoID0gZW50cnkubGVuZ3RoLAorICAgICAgICAgICAgICAgIGRpZmZCdWYgPSBuZXcgQXJyYXkoZGlmZkxlbmd0aCk7CisKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGlmZkxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgIHZhciBkaWZmRW50cnkgPSBlbnRyeVtqXTsKKworICAgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZGlmZkVudHJ5KSkgeworICAgICAgICAgICAgICAgIGRpZmZCdWZbal0gPSBkaWZmRW50cnkubmFtZTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNOdW0pKGRpZmZFbnRyeSkgfHwgKDAsIF9wcmltaXRpdmVzLmlzUmVmKShkaWZmRW50cnkpKSB7CisgICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS50b1N0cmluZygpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhc2gudXBkYXRlKGRpZmZCdWYuam9pbigpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29uc3QgZmlyc3RDaGFyID0gZGljdC5nZXQoIkZpcnN0Q2hhciIpIHx8IDA7CisgICAgICBjb25zdCBsYXN0Q2hhciA9IGRpY3QuZ2V0KCJMYXN0Q2hhciIpIHx8IChjb21wb3NpdGUgPyAweGZmZmYgOiAweGZmKTsKKyAgICAgIGhhc2gudXBkYXRlKGAke2ZpcnN0Q2hhcn0tJHtsYXN0Q2hhcn1gKTsKKyAgICAgIHZhciB0b1VuaWNvZGUgPSBkaWN0LmdldCgiVG9Vbmljb2RlIikgfHwgYmFzZURpY3QuZ2V0KCJUb1VuaWNvZGUiKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkodG9Vbmljb2RlKSkgeworICAgICAgICB2YXIgc3RyZWFtID0gdG9Vbmljb2RlLnN0ciB8fCB0b1VuaWNvZGU7CisgICAgICAgIHVpbnQ4YXJyYXkgPSBzdHJlYW0uYnVmZmVyID8gbmV3IFVpbnQ4QXJyYXkoc3RyZWFtLmJ1ZmZlci5idWZmZXIsIDAsIHN0cmVhbS5idWZmZXJMZW5ndGgpIDogbmV3IFVpbnQ4QXJyYXkoc3RyZWFtLmJ5dGVzLmJ1ZmZlciwgc3RyZWFtLnN0YXJ0LCBzdHJlYW0uZW5kIC0gc3RyZWFtLnN0YXJ0KTsKKyAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CisgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHRvVW5pY29kZSkpIHsKKyAgICAgICAgaGFzaC51cGRhdGUodG9Vbmljb2RlLm5hbWUpOworICAgICAgfQorCisgICAgICB2YXIgd2lkdGhzID0gZGljdC5nZXQoIldpZHRocyIpIHx8IGJhc2VEaWN0LmdldCgiV2lkdGhzIik7CisKKyAgICAgIGlmICh3aWR0aHMpIHsKKyAgICAgICAgdWludDhhcnJheSA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheSh3aWR0aHMpLmJ1ZmZlcik7CisgICAgICAgIGhhc2gudXBkYXRlKHVpbnQ4YXJyYXkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBkZXNjcmlwdG9yLAorICAgICAgZGljdCwKKyAgICAgIGJhc2VEaWN0LAorICAgICAgY29tcG9zaXRlLAorICAgICAgdHlwZTogdHlwZS5uYW1lLAorICAgICAgaGFzaDogaGFzaCA/IGhhc2guaGV4ZGlnZXN0KCkgOiAiIgorICAgIH07CisgIH0KKworICB0cmFuc2xhdGVGb250KHByZUV2YWx1YXRlZEZvbnQpIHsKKyAgICB2YXIgYmFzZURpY3QgPSBwcmVFdmFsdWF0ZWRGb250LmJhc2VEaWN0OworICAgIHZhciBkaWN0ID0gcHJlRXZhbHVhdGVkRm9udC5kaWN0OworICAgIHZhciBjb21wb3NpdGUgPSBwcmVFdmFsdWF0ZWRGb250LmNvbXBvc2l0ZTsKKyAgICB2YXIgZGVzY3JpcHRvciA9IHByZUV2YWx1YXRlZEZvbnQuZGVzY3JpcHRvcjsKKyAgICB2YXIgdHlwZSA9IHByZUV2YWx1YXRlZEZvbnQudHlwZTsKKyAgICB2YXIgbWF4Q2hhckluZGV4ID0gY29tcG9zaXRlID8gMHhmZmZmIDogMHhmZjsKKyAgICB2YXIgcHJvcGVydGllczsKKyAgICBjb25zdCBmaXJzdENoYXIgPSBkaWN0LmdldCgiRmlyc3RDaGFyIikgfHwgMDsKKyAgICBjb25zdCBsYXN0Q2hhciA9IGRpY3QuZ2V0KCJMYXN0Q2hhciIpIHx8IG1heENoYXJJbmRleDsKKworICAgIGlmICghZGVzY3JpcHRvcikgeworICAgICAgaWYgKHR5cGUgPT09ICJUeXBlMyIpIHsKKyAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KG51bGwpOworICAgICAgICBkZXNjcmlwdG9yLnNldCgiRm9udE5hbWUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCh0eXBlKSk7CisgICAgICAgIGRlc2NyaXB0b3Iuc2V0KCJGb250QkJveCIsIGRpY3QuZ2V0QXJyYXkoIkZvbnRCQm94IikgfHwgWzAsIDAsIDAsIDBdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBiYXNlRm9udE5hbWUgPSBkaWN0LmdldCgiQmFzZUZvbnQiKTsKKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGJhc2VGb250TmFtZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhc2UgZm9udCBpcyBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKworICAgICAgICBiYXNlRm9udE5hbWUgPSBiYXNlRm9udE5hbWUubmFtZS5yZXBsYWNlKC9bLF9dL2csICItIik7CisgICAgICAgIHZhciBtZXRyaWNzID0gdGhpcy5nZXRCYXNlRm9udE1ldHJpY3MoYmFzZUZvbnROYW1lKTsKKyAgICAgICAgdmFyIGZvbnROYW1lV29TdHlsZSA9IGJhc2VGb250TmFtZS5zcGxpdCgiLSIpWzBdOworICAgICAgICB2YXIgZmxhZ3MgPSAodGhpcy5pc1NlcmlmRm9udChmb250TmFtZVdvU3R5bGUpID8gX2ZvbnRzLkZvbnRGbGFncy5TZXJpZiA6IDApIHwgKG1ldHJpY3MubW9ub3NwYWNlID8gX2ZvbnRzLkZvbnRGbGFncy5GaXhlZFBpdGNoIDogMCkgfCAoKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTeW1ib2xzRm9udHMpKClbZm9udE5hbWVXb1N0eWxlXSA/IF9mb250cy5Gb250RmxhZ3MuU3ltYm9saWMgOiBfZm9udHMuRm9udEZsYWdzLk5vbnN5bWJvbGljKTsKKyAgICAgICAgcHJvcGVydGllcyA9IHsKKyAgICAgICAgICB0eXBlLAorICAgICAgICAgIG5hbWU6IGJhc2VGb250TmFtZSwKKyAgICAgICAgICB3aWR0aHM6IG1ldHJpY3Mud2lkdGhzLAorICAgICAgICAgIGRlZmF1bHRXaWR0aDogbWV0cmljcy5kZWZhdWx0V2lkdGgsCisgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgZmlyc3RDaGFyLAorICAgICAgICAgIGxhc3RDaGFyCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHdpZHRocyA9IGRpY3QuZ2V0KCJXaWR0aHMiKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIGRpY3QsIHByb3BlcnRpZXMpLnRoZW4obmV3UHJvcGVydGllcyA9PiB7CisgICAgICAgICAgaWYgKHdpZHRocykgeworICAgICAgICAgICAgY29uc3QgZ2x5cGhXaWR0aHMgPSBbXTsKKyAgICAgICAgICAgIGxldCBqID0gZmlyc3RDaGFyOworCisgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB3aWR0aHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgICBnbHlwaFdpZHRoc1tqKytdID0gdGhpcy54cmVmLmZldGNoSWZSZWYod2lkdGhzW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBnbHlwaFdpZHRoczsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBuZXdQcm9wZXJ0aWVzKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gbmV3IF9mb250cy5Gb250KGJhc2VGb250TmFtZSwgbnVsbCwgbmV3UHJvcGVydGllcyk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIHZhciBmb250TmFtZSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250TmFtZSIpOworICAgIHZhciBiYXNlRm9udCA9IGRpY3QuZ2V0KCJCYXNlRm9udCIpOworCisgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykoZm9udE5hbWUpKSB7CisgICAgICBmb250TmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KGZvbnROYW1lKTsKKyAgICB9CisKKyAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShiYXNlRm9udCkpIHsKKyAgICAgIGJhc2VGb250ID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoYmFzZUZvbnQpOworICAgIH0KKworICAgIGlmICh0eXBlICE9PSAiVHlwZTMiKSB7CisgICAgICB2YXIgZm9udE5hbWVTdHIgPSBmb250TmFtZSAmJiBmb250TmFtZS5uYW1lOworICAgICAgdmFyIGJhc2VGb250U3RyID0gYmFzZUZvbnQgJiYgYmFzZUZvbnQubmFtZTsKKworICAgICAgaWYgKGZvbnROYW1lU3RyICE9PSBiYXNlRm9udFN0cikgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoYFRoZSBGb250RGVzY3JpcHRvclwncyBGb250TmFtZSBpcyAiJHtmb250TmFtZVN0cn0iIGJ1dCBgICsgYHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRm9udFwncyBCYXNlRm9udCAiJHtiYXNlRm9udFN0cn0iLmApOworCisgICAgICAgIGlmIChmb250TmFtZVN0ciAmJiBiYXNlRm9udFN0ciAmJiBiYXNlRm9udFN0ci5zdGFydHNXaXRoKGZvbnROYW1lU3RyKSkgeworICAgICAgICAgIGZvbnROYW1lID0gYmFzZUZvbnQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBmb250TmFtZSA9IGZvbnROYW1lIHx8IGJhc2VGb250OworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmb250TmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBmb250IG5hbWUiKTsKKyAgICB9CisKKyAgICB2YXIgZm9udEZpbGUgPSBkZXNjcmlwdG9yLmdldCgiRm9udEZpbGUiLCAiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIpOworCisgICAgaWYgKGZvbnRGaWxlKSB7CisgICAgICBpZiAoZm9udEZpbGUuZGljdCkgeworICAgICAgICB2YXIgc3VidHlwZSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CisKKyAgICAgICAgaWYgKHN1YnR5cGUpIHsKKyAgICAgICAgICBzdWJ0eXBlID0gc3VidHlwZS5uYW1lOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxlbmd0aDEgPSBmb250RmlsZS5kaWN0LmdldCgiTGVuZ3RoMSIpOworICAgICAgICB2YXIgbGVuZ3RoMiA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgyIik7CisgICAgICAgIHZhciBsZW5ndGgzID0gZm9udEZpbGUuZGljdC5nZXQoIkxlbmd0aDMiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm9wZXJ0aWVzID0geworICAgICAgdHlwZSwKKyAgICAgIG5hbWU6IGZvbnROYW1lLm5hbWUsCisgICAgICBzdWJ0eXBlLAorICAgICAgZmlsZTogZm9udEZpbGUsCisgICAgICBsZW5ndGgxLAorICAgICAgbGVuZ3RoMiwKKyAgICAgIGxlbmd0aDMsCisgICAgICBsb2FkZWROYW1lOiBiYXNlRGljdC5sb2FkZWROYW1lLAorICAgICAgY29tcG9zaXRlLAorICAgICAgZml4ZWRQaXRjaDogZmFsc2UsCisgICAgICBmb250TWF0cml4OiBkaWN0LmdldEFycmF5KCJGb250TWF0cml4IikgfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVgsCisgICAgICBmaXJzdENoYXI6IGZpcnN0Q2hhciB8fCAwLAorICAgICAgbGFzdENoYXI6IGxhc3RDaGFyIHx8IG1heENoYXJJbmRleCwKKyAgICAgIGJib3g6IGRlc2NyaXB0b3IuZ2V0QXJyYXkoIkZvbnRCQm94IiksCisgICAgICBhc2NlbnQ6IGRlc2NyaXB0b3IuZ2V0KCJBc2NlbnQiKSwKKyAgICAgIGRlc2NlbnQ6IGRlc2NyaXB0b3IuZ2V0KCJEZXNjZW50IiksCisgICAgICB4SGVpZ2h0OiBkZXNjcmlwdG9yLmdldCgiWEhlaWdodCIpLAorICAgICAgY2FwSGVpZ2h0OiBkZXNjcmlwdG9yLmdldCgiQ2FwSGVpZ2h0IiksCisgICAgICBmbGFnczogZGVzY3JpcHRvci5nZXQoIkZsYWdzIiksCisgICAgICBpdGFsaWNBbmdsZTogZGVzY3JpcHRvci5nZXQoIkl0YWxpY0FuZ2xlIiksCisgICAgICBpc1R5cGUzRm9udDogZmFsc2UKKyAgICB9OworICAgIHZhciBjTWFwUHJvbWlzZTsKKworICAgIGlmIChjb21wb3NpdGUpIHsKKyAgICAgIHZhciBjaWRFbmNvZGluZyA9IGJhc2VEaWN0LmdldCgiRW5jb2RpbmciKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGNpZEVuY29kaW5nKSkgeworICAgICAgICBwcm9wZXJ0aWVzLmNpZEVuY29kaW5nID0gY2lkRW5jb2RpbmcubmFtZTsKKyAgICAgIH0KKworICAgICAgY01hcFByb21pc2UgPSBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgICBlbmNvZGluZzogY2lkRW5jb2RpbmcsCisgICAgICAgIGZldGNoQnVpbHRJbkNNYXA6IHRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCwKKyAgICAgICAgdXNlQ01hcDogbnVsbAorICAgICAgfSkudGhlbihmdW5jdGlvbiAoY01hcCkgeworICAgICAgICBwcm9wZXJ0aWVzLmNNYXAgPSBjTWFwOworICAgICAgICBwcm9wZXJ0aWVzLnZlcnRpY2FsID0gcHJvcGVydGllcy5jTWFwLnZlcnRpY2FsOworICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNNYXBQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7CisgICAgfQorCisgICAgcmV0dXJuIGNNYXBQcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIGJhc2VEaWN0LCBwcm9wZXJ0aWVzKTsKKyAgICB9KS50aGVuKG5ld1Byb3BlcnRpZXMgPT4geworICAgICAgdGhpcy5leHRyYWN0V2lkdGhzKGRpY3QsIGRlc2NyaXB0b3IsIG5ld1Byb3BlcnRpZXMpOworCisgICAgICBpZiAodHlwZSA9PT0gIlR5cGUzIikgeworICAgICAgICBuZXdQcm9wZXJ0aWVzLmlzVHlwZTNGb250ID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBfZm9udHMuRm9udChmb250TmFtZS5uYW1lLCBmb250RmlsZSwgbmV3UHJvcGVydGllcyk7CisgICAgfSk7CisgIH0KKworICBzdGF0aWMgYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCBoYW5kbGVyKSB7CisgICAgZnVuY3Rpb24gYnVpbGRQYXRoKGZvbnRDaGFyKSB7CisgICAgICBpZiAoZm9udC5yZW5kZXJlci5oYXNCdWlsdFBhdGgoZm9udENoYXIpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbYCR7Zm9udC5sb2FkZWROYW1lfV9wYXRoXyR7Zm9udENoYXJ9YCwgIkZvbnRQYXRoIiwgZm9udC5yZW5kZXJlci5nZXRQYXRoSnMoZm9udENoYXIpXSk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKKyAgICAgIGJ1aWxkUGF0aChnbHlwaC5mb250Q2hhcik7CisgICAgICBjb25zdCBhY2NlbnQgPSBnbHlwaC5hY2NlbnQ7CisKKyAgICAgIGlmIChhY2NlbnQgJiYgYWNjZW50LmZvbnRDaGFyKSB7CisgICAgICAgIGJ1aWxkUGF0aChhY2NlbnQuZm9udENoYXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBnZXQgZmFsbGJhY2tGb250RGljdCgpIHsKKyAgICBjb25zdCBkaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICBkaWN0LnNldCgiQmFzZUZvbnQiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiUERGSlMtRmFsbGJhY2tGb250IikpOworICAgIGRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKKyAgICBkaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7CisgICAgZGljdC5zZXQoIkVuY29kaW5nIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIldpbkFuc2lFbmNvZGluZyIpKTsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImZhbGxiYWNrRm9udERpY3QiLCBkaWN0KTsKKyAgfQorCit9CisKK2V4cG9ydHMuUGFydGlhbEV2YWx1YXRvciA9IFBhcnRpYWxFdmFsdWF0b3I7CisKK2NsYXNzIFRyYW5zbGF0ZWRGb250IHsKKyAgY29uc3RydWN0b3IoeworICAgIGxvYWRlZE5hbWUsCisgICAgZm9udCwKKyAgICBkaWN0LAorICAgIGV4dHJhUHJvcGVydGllcyA9IGZhbHNlCisgIH0pIHsKKyAgICB0aGlzLmxvYWRlZE5hbWUgPSBsb2FkZWROYW1lOworICAgIHRoaXMuZm9udCA9IGZvbnQ7CisgICAgdGhpcy5kaWN0ID0gZGljdDsKKyAgICB0aGlzLl9leHRyYVByb3BlcnRpZXMgPSBleHRyYVByb3BlcnRpZXM7CisgICAgdGhpcy50eXBlM0xvYWRlZCA9IG51bGw7CisgICAgdGhpcy50eXBlM0RlcGVuZGVuY2llcyA9IGZvbnQuaXNUeXBlM0ZvbnQgPyBuZXcgU2V0KCkgOiBudWxsOworICAgIHRoaXMuc2VudCA9IGZhbHNlOworICB9CisKKyAgc2VuZChoYW5kbGVyKSB7CisgICAgaWYgKHRoaXMuc2VudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuc2VudCA9IHRydWU7CisgICAgaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbdGhpcy5sb2FkZWROYW1lLCAiRm9udCIsIHRoaXMuZm9udC5leHBvcnREYXRhKHRoaXMuX2V4dHJhUHJvcGVydGllcyldKTsKKyAgfQorCisgIGZhbGxiYWNrKGhhbmRsZXIpIHsKKyAgICBpZiAoIXRoaXMuZm9udC5kYXRhKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5mb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7CisgICAgY29uc3QgZ2x5cGhzID0gdGhpcy5mb250LmdseXBoQ2FjaGVWYWx1ZXM7CisgICAgUGFydGlhbEV2YWx1YXRvci5idWlsZEZvbnRQYXRocyh0aGlzLmZvbnQsIGdseXBocywgaGFuZGxlcik7CisgIH0KKworICBsb2FkVHlwZTNEYXRhKGV2YWx1YXRvciwgcmVzb3VyY2VzLCB0YXNrKSB7CisgICAgaWYgKHRoaXMudHlwZTNMb2FkZWQpIHsKKyAgICAgIHJldHVybiB0aGlzLnR5cGUzTG9hZGVkOworICAgIH0KKworICAgIGlmICghdGhpcy5mb250LmlzVHlwZTNGb250KSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIk11c3QgYmUgYSBUeXBlMyBmb250LiIpOworICAgIH0KKworICAgIHZhciB0eXBlM09wdGlvbnMgPSBPYmplY3QuY3JlYXRlKGV2YWx1YXRvci5vcHRpb25zKTsKKyAgICB0eXBlM09wdGlvbnMuaWdub3JlRXJyb3JzID0gZmFsc2U7CisgICAgdmFyIHR5cGUzRXZhbHVhdG9yID0gZXZhbHVhdG9yLmNsb25lKHR5cGUzT3B0aW9ucyk7CisgICAgdHlwZTNFdmFsdWF0b3IucGFyc2luZ1R5cGUzRm9udCA9IHRydWU7CisgICAgY29uc3QgdHJhbnNsYXRlZEZvbnQgPSB0aGlzLmZvbnQsCisgICAgICAgICAgdHlwZTNEZXBlbmRlbmNpZXMgPSB0aGlzLnR5cGUzRGVwZW5kZW5jaWVzOworICAgIHZhciBsb2FkQ2hhclByb2NzUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOworICAgIHZhciBjaGFyUHJvY3MgPSB0aGlzLmRpY3QuZ2V0KCJDaGFyUHJvY3MiKTsKKyAgICB2YXIgZm9udFJlc291cmNlcyA9IHRoaXMuZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlczsKKyAgICB2YXIgY2hhclByb2NPcGVyYXRvckxpc3QgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgZm9yIChjb25zdCBrZXkgb2YgY2hhclByb2NzLmdldEtleXMoKSkgeworICAgICAgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBsb2FkQ2hhclByb2NzUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGdseXBoU3RyZWFtID0gY2hhclByb2NzLmdldChrZXkpOworICAgICAgICB2YXIgb3BlcmF0b3JMaXN0ID0gbmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpOworICAgICAgICByZXR1cm4gdHlwZTNFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgICBzdHJlYW06IGdseXBoU3RyZWFtLAorICAgICAgICAgIHRhc2ssCisgICAgICAgICAgcmVzb3VyY2VzOiBmb250UmVzb3VyY2VzLAorICAgICAgICAgIG9wZXJhdG9yTGlzdAorICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gb3BlcmF0b3JMaXN0LmdldElSKCk7CisKKyAgICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb3BlcmF0b3JMaXN0LmRlcGVuZGVuY2llcykgeworICAgICAgICAgICAgdHlwZTNEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOworICAgICAgICAgIH0KKyAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgVHlwZTMgZm9udCByZXNvdXJjZSAiJHtrZXl9IiBpcyBub3QgYXZhaWxhYmxlLmApOworICAgICAgICAgIGNvbnN0IGR1bW15T3BlcmF0b3JMaXN0ID0gbmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpOworICAgICAgICAgIGNoYXJQcm9jT3BlcmF0b3JMaXN0W2tleV0gPSBkdW1teU9wZXJhdG9yTGlzdC5nZXRJUigpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHRoaXMudHlwZTNMb2FkZWQgPSBsb2FkQ2hhclByb2NzUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIHRyYW5zbGF0ZWRGb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gY2hhclByb2NPcGVyYXRvckxpc3Q7CisgICAgfSk7CisgICAgcmV0dXJuIHRoaXMudHlwZTNMb2FkZWQ7CisgIH0KKworfQorCitjbGFzcyBTdGF0ZU1hbmFnZXIgeworICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUpIHsKKyAgICB0aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlOworICAgIHRoaXMuc3RhdGVTdGFjayA9IFtdOworICB9CisKKyAgc2F2ZSgpIHsKKyAgICB2YXIgb2xkID0gdGhpcy5zdGF0ZTsKKyAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0aGlzLnN0YXRlKTsKKyAgICB0aGlzLnN0YXRlID0gb2xkLmNsb25lKCk7CisgIH0KKworICByZXN0b3JlKCkgeworICAgIHZhciBwcmV2ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpOworCisgICAgaWYgKHByZXYpIHsKKyAgICAgIHRoaXMuc3RhdGUgPSBwcmV2OworICAgIH0KKyAgfQorCisgIHRyYW5zZm9ybShhcmdzKSB7CisgICAgdGhpcy5zdGF0ZS5jdG0gPSBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0aGlzLnN0YXRlLmN0bSwgYXJncyk7CisgIH0KKworfQorCitjbGFzcyBUZXh0U3RhdGUgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLmN0bSA9IG5ldyBGbG9hdDMyQXJyYXkoX3V0aWwuSURFTlRJVFlfTUFUUklYKTsKKyAgICB0aGlzLmZvbnROYW1lID0gbnVsbDsKKyAgICB0aGlzLmZvbnRTaXplID0gMDsKKyAgICB0aGlzLmZvbnQgPSBudWxsOworICAgIHRoaXMuZm9udE1hdHJpeCA9IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgIHRoaXMudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWC5zbGljZSgpOworICAgIHRoaXMudGV4dExpbmVNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVguc2xpY2UoKTsKKyAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDsKKyAgICB0aGlzLndvcmRTcGFjaW5nID0gMDsKKyAgICB0aGlzLmxlYWRpbmcgPSAwOworICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7CisgICAgdGhpcy50ZXh0UmlzZSA9IDA7CisgIH0KKworICBzZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICB2YXIgbSA9IHRoaXMudGV4dE1hdHJpeDsKKyAgICBtWzBdID0gYTsKKyAgICBtWzFdID0gYjsKKyAgICBtWzJdID0gYzsKKyAgICBtWzNdID0gZDsKKyAgICBtWzRdID0gZTsKKyAgICBtWzVdID0gZjsKKyAgfQorCisgIHNldFRleHRMaW5lTWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICB2YXIgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7CisgICAgbVswXSA9IGE7CisgICAgbVsxXSA9IGI7CisgICAgbVsyXSA9IGM7CisgICAgbVszXSA9IGQ7CisgICAgbVs0XSA9IGU7CisgICAgbVs1XSA9IGY7CisgIH0KKworICB0cmFuc2xhdGVUZXh0TWF0cml4KHgsIHkpIHsKKyAgICB2YXIgbSA9IHRoaXMudGV4dE1hdHJpeDsKKyAgICBtWzRdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07CisgICAgbVs1XSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdOworICB9CisKKyAgdHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoeCwgeSkgeworICAgIHZhciBtID0gdGhpcy50ZXh0TGluZU1hdHJpeDsKKyAgICBtWzRdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07CisgICAgbVs1XSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdOworICB9CisKKyAgY2FsY1RleHRMaW5lTWF0cml4QWR2YW5jZShhLCBiLCBjLCBkLCBlLCBmKSB7CisgICAgdmFyIGZvbnQgPSB0aGlzLmZvbnQ7CisKKyAgICBpZiAoIWZvbnQpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHZhciBtID0gdGhpcy50ZXh0TGluZU1hdHJpeDsKKworICAgIGlmICghKGEgPT09IG1bMF0gJiYgYiA9PT0gbVsxXSAmJiBjID09PSBtWzJdICYmIGQgPT09IG1bM10pKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgdHhEaWZmID0gZSAtIG1bNF0sCisgICAgICAgIHR5RGlmZiA9IGYgLSBtWzVdOworCisgICAgaWYgKGZvbnQudmVydGljYWwgJiYgdHhEaWZmICE9PSAwIHx8ICFmb250LnZlcnRpY2FsICYmIHR5RGlmZiAhPT0gMCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdmFyIHR4LAorICAgICAgICB0eSwKKyAgICAgICAgZGVub21pbmF0b3IgPSBhICogZCAtIGIgKiBjOworCisgICAgaWYgKGZvbnQudmVydGljYWwpIHsKKyAgICAgIHR4ID0gLXR5RGlmZiAqIGMgLyBkZW5vbWluYXRvcjsKKyAgICAgIHR5ID0gdHlEaWZmICogYSAvIGRlbm9taW5hdG9yOworICAgIH0gZWxzZSB7CisgICAgICB0eCA9IHR4RGlmZiAqIGQgLyBkZW5vbWluYXRvcjsKKyAgICAgIHR5ID0gLXR4RGlmZiAqIGIgLyBkZW5vbWluYXRvcjsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgd2lkdGg6IHR4LAorICAgICAgaGVpZ2h0OiB0eSwKKyAgICAgIHZhbHVlOiBmb250LnZlcnRpY2FsID8gdHkgOiB0eAorICAgIH07CisgIH0KKworICBjYWxjUmVuZGVyTWF0cml4KGN0bSkgeworICAgIHZhciB0c20gPSBbdGhpcy5mb250U2l6ZSAqIHRoaXMudGV4dEhTY2FsZSwgMCwgMCwgdGhpcy5mb250U2l6ZSwgMCwgdGhpcy50ZXh0UmlzZV07CisgICAgcmV0dXJuIF91dGlsLlV0aWwudHJhbnNmb3JtKGN0bSwgX3V0aWwuVXRpbC50cmFuc2Zvcm0odGhpcy50ZXh0TWF0cml4LCB0c20pKTsKKyAgfQorCisgIGNhcnJpYWdlUmV0dXJuKCkgeworICAgIHRoaXMudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoMCwgLXRoaXMubGVhZGluZyk7CisgICAgdGhpcy50ZXh0TWF0cml4ID0gdGhpcy50ZXh0TGluZU1hdHJpeC5zbGljZSgpOworICB9CisKKyAgY2xvbmUoKSB7CisgICAgdmFyIGNsb25lID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTsKKyAgICBjbG9uZS50ZXh0TWF0cml4ID0gdGhpcy50ZXh0TWF0cml4LnNsaWNlKCk7CisgICAgY2xvbmUudGV4dExpbmVNYXRyaXggPSB0aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CisgICAgY2xvbmUuZm9udE1hdHJpeCA9IHRoaXMuZm9udE1hdHJpeC5zbGljZSgpOworICAgIHJldHVybiBjbG9uZTsKKyAgfQorCit9CisKK2NsYXNzIEV2YWxTdGF0ZSB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuY3RtID0gbmV3IEZsb2F0MzJBcnJheShfdXRpbC5JREVOVElUWV9NQVRSSVgpOworICAgIHRoaXMuZm9udCA9IG51bGw7CisgICAgdGhpcy50ZXh0UmVuZGVyaW5nTW9kZSA9IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7CisgICAgdGhpcy5maWxsQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5OworICAgIHRoaXMuc3Ryb2tlQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5OworICB9CisKKyAgY2xvbmUoKSB7CisgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7CisgIH0KKworfQorCitjbGFzcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgeworICBzdGF0aWMgZ2V0IG9wTWFwKCkgeworICAgIGNvbnN0IGdldE9QTWFwID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgICAgIHQudyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRMaW5lV2lkdGgsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkogPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0TGluZUNhcCwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuaiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRMaW5lSm9pbiwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuTSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRNaXRlckxpbWl0LAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5kID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldERhc2gsCisgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LnJpID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFJlbmRlcmluZ0ludGVudCwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuaSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGbGF0bmVzcywKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuZ3MgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0R1N0YXRlLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5xID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNhdmUsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlEgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMucmVzdG9yZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuY20gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMudHJhbnNmb3JtLAorICAgICAgICBudW1BcmdzOiA2LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5tID0geworICAgICAgICBpZDogX3V0aWwuT1BTLm1vdmVUbywKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQubCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5saW5lVG8sCisgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LmMgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuY3VydmVUbywKKyAgICAgICAgbnVtQXJnczogNiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQudiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5jdXJ2ZVRvMiwKKyAgICAgICAgbnVtQXJnczogNCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQueSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5jdXJ2ZVRvMywKKyAgICAgICAgbnVtQXJnczogNCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuaCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5jbG9zZVBhdGgsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LnJlID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnJlY3RhbmdsZSwKKyAgICAgICAgbnVtQXJnczogNCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuUyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zdHJva2UsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LnMgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuY2xvc2VTdHJva2UsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LmYgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuZmlsbCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuRiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdFsiZioiXSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5lb0ZpbGwsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkIgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuZmlsbFN0cm9rZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHRbIkIqIl0gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuZW9GaWxsU3Ryb2tlLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5iID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmNsb3NlRmlsbFN0cm9rZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHRbImIqIl0gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuY2xvc2VFT0ZpbGxTdHJva2UsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0Lm4gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuZW5kUGF0aCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5jbGlwLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdFsiVyoiXSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5lb0NsaXAsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkJUID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmJlZ2luVGV4dCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuRVQgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuZW5kVGV4dCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVGMgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0Q2hhclNwYWNpbmcsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlR3ID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFdvcmRTcGFjaW5nLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5UeiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRIU2NhbGUsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlRMID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldExlYWRpbmcsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlRmID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZvbnQsCisgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlRyID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5UcyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRUZXh0UmlzZSwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVGQgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMubW92ZVRleHQsCisgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlREID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldExlYWRpbmdNb3ZlVGV4dCwKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVG0gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0VGV4dE1hdHJpeCwKKyAgICAgICAgbnVtQXJnczogNiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHRbIlQqIl0gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMubmV4dExpbmUsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlRqID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNob3dUZXh0LAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5USiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zaG93U3BhY2VkVGV4dCwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHRbIiciXSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5uZXh0TGluZVNob3dUZXh0LAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdFsnIiddID0geworICAgICAgICBpZDogX3V0aWwuT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0LAorICAgICAgICBudW1BcmdzOiAzLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5kMCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRDaGFyV2lkdGgsCisgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LmQxID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcywKKyAgICAgICAgbnVtQXJnczogNiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuQ1MgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZSwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuY3MgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbENvbG9yU3BhY2UsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlNDID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yLAorICAgICAgICBudW1BcmdzOiA0LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IHRydWUKKyAgICAgIH07CisgICAgICB0LlNDTiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRTdHJva2VDb2xvck4sCisgICAgICAgIG51bUFyZ3M6IDMzLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IHRydWUKKyAgICAgIH07CisgICAgICB0LnNjID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZpbGxDb2xvciwKKyAgICAgICAgbnVtQXJnczogNCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCisgICAgICB9OworICAgICAgdC5zY24gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbENvbG9yTiwKKyAgICAgICAgbnVtQXJnczogMzMsCisgICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQorICAgICAgfTsKKyAgICAgIHQuRyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRTdHJva2VHcmF5LAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5nID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZpbGxHcmF5LAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5SRyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRTdHJva2VSR0JDb2xvciwKKyAgICAgICAgbnVtQXJnczogMywKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQucmcgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yLAorICAgICAgICBudW1BcmdzOiAzLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5LID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZUNNWUtDb2xvciwKKyAgICAgICAgbnVtQXJnczogNCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuayA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGaWxsQ01ZS0NvbG9yLAorICAgICAgICBudW1BcmdzOiA0LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5zaCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zaGFkaW5nRmlsbCwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuQkkgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuYmVnaW5JbmxpbmVJbWFnZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuSUQgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuYmVnaW5JbWFnZURhdGEsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkVJID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmVuZElubGluZUltYWdlLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5EbyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5wYWludFhPYmplY3QsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0Lk1QID0geworICAgICAgICBpZDogX3V0aWwuT1BTLm1hcmtQb2ludCwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuRFAgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMubWFya1BvaW50UHJvcHMsCisgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkJNQyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnQsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkJEQyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuRU1DID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmVuZE1hcmtlZENvbnRlbnQsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkJYID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmJlZ2luQ29tcGF0LAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5FWCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRDb21wYXQsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkJNID0gbnVsbDsKKyAgICAgIHQuQkQgPSBudWxsOworICAgICAgdC50cnVlID0gbnVsbDsKKyAgICAgIHQuZmEgPSBudWxsOworICAgICAgdC5mYWwgPSBudWxsOworICAgICAgdC5mYWxzID0gbnVsbDsKKyAgICAgIHQuZmFsc2UgPSBudWxsOworICAgICAgdC5udSA9IG51bGw7CisgICAgICB0Lm51bCA9IG51bGw7CisgICAgICB0Lm51bGwgPSBudWxsOworICAgIH0pOworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3BNYXAiLCBnZXRPUE1hcCgpKTsKKyAgfQorCisgIHN0YXRpYyBnZXQgTUFYX0lOVkFMSURfUEFUSF9PUFMoKSB7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJNQVhfSU5WQUxJRF9QQVRIX09QUyIsIDIwKTsKKyAgfQorCisgIGNvbnN0cnVjdG9yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKSB7CisgICAgdGhpcy5wYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKHN0cmVhbSwgRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSwKKyAgICAgIHhyZWYKKyAgICB9KTsKKyAgICB0aGlzLnN0YXRlTWFuYWdlciA9IHN0YXRlTWFuYWdlcjsKKyAgICB0aGlzLm5vblByb2Nlc3NlZEFyZ3MgPSBbXTsKKyAgICB0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA9IDA7CisgIH0KKworICBnZXQgc2F2ZWRTdGF0ZXNEZXB0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5zdGF0ZU1hbmFnZXIuc3RhdGVTdGFjay5sZW5ndGg7CisgIH0KKworICByZWFkKG9wZXJhdGlvbikgeworICAgIHZhciBhcmdzID0gb3BlcmF0aW9uLmFyZ3M7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIG9iaiA9IHRoaXMucGFyc2VyLmdldE9iaigpOworCisgICAgICBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSB7CisgICAgICAgIHZhciBjbWQgPSBvYmouY21kOworICAgICAgICB2YXIgb3BTcGVjID0gRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwW2NtZF07CisKKyAgICAgICAgaWYgKCFvcFNwZWMpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFVua25vd24gY29tbWFuZCAiJHtjbWR9Ii5gKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmbiA9IG9wU3BlYy5pZDsKKyAgICAgICAgdmFyIG51bUFyZ3MgPSBvcFNwZWMubnVtQXJnczsKKyAgICAgICAgdmFyIGFyZ3NMZW5ndGggPSBhcmdzICE9PSBudWxsID8gYXJncy5sZW5ndGggOiAwOworCisgICAgICAgIGlmICghb3BTcGVjLnZhcmlhYmxlQXJncykgeworICAgICAgICAgIGlmIChhcmdzTGVuZ3RoICE9PSBudW1BcmdzKSB7CisgICAgICAgICAgICB2YXIgbm9uUHJvY2Vzc2VkQXJncyA9IHRoaXMubm9uUHJvY2Vzc2VkQXJnczsKKworICAgICAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGggPiBudW1BcmdzKSB7CisgICAgICAgICAgICAgIG5vblByb2Nlc3NlZEFyZ3MucHVzaChhcmdzLnNoaWZ0KCkpOworICAgICAgICAgICAgICBhcmdzTGVuZ3RoLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoIDwgbnVtQXJncyAmJiBub25Qcm9jZXNzZWRBcmdzLmxlbmd0aCAhPT0gMCkgeworICAgICAgICAgICAgICBpZiAoYXJncyA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBbXTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGFyZ3MudW5zaGlmdChub25Qcm9jZXNzZWRBcmdzLnBvcCgpKTsKKyAgICAgICAgICAgICAgYXJnc0xlbmd0aCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChhcmdzTGVuZ3RoIDwgbnVtQXJncykgeworICAgICAgICAgICAgY29uc3QgcGFydGlhbE1zZyA9IGBjb21tYW5kICR7Y21kfTogZXhwZWN0ZWQgJHtudW1BcmdzfSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYDsKKworICAgICAgICAgICAgaWYgKGZuID49IF91dGlsLk9QUy5tb3ZlVG8gJiYgZm4gPD0gX3V0aWwuT1BTLmVuZFBhdGggJiYgKyt0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA+IEV2YWx1YXRvclByZXByb2Nlc3Nvci5NQVhfSU5WQUxJRF9QQVRIX09QUykgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgJHtwYXJ0aWFsTXNnfWApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFNraXBwaW5nICR7cGFydGlhbE1zZ31gKTsKKworICAgICAgICAgICAgaWYgKGFyZ3MgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgYXJncy5sZW5ndGggPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc0xlbmd0aCA+IG51bUFyZ3MpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoYENvbW1hbmQgJHtjbWR9OiBleHBlY3RlZCBbMCwgJHtudW1BcmdzfV0gYXJncywgYCArIGBidXQgcmVjZWl2ZWQgJHthcmdzTGVuZ3RofSBhcmdzLmApOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5wcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncyk7CisgICAgICAgIG9wZXJhdGlvbi5mbiA9IGZuOworICAgICAgICBvcGVyYXRpb24uYXJncyA9IGFyZ3M7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpZiAob2JqID09PSBfcHJpbWl0aXZlcy5FT0YpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAob2JqICE9PSBudWxsKSB7CisgICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CisgICAgICAgICAgYXJncyA9IFtdOworICAgICAgICB9CisKKyAgICAgICAgYXJncy5wdXNoKG9iaik7CisKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMzMpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJlcHJvY2Vzc0NvbW1hbmQoZm4sIGFyZ3MpIHsKKyAgICBzd2l0Y2ggKGZuIHwgMCkgeworICAgICAgY2FzZSBfdXRpbC5PUFMuc2F2ZToKKyAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIuc2F2ZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBfdXRpbC5PUFMucmVzdG9yZToKKyAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIucmVzdG9yZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBfdXRpbC5PUFMudHJhbnNmb3JtOgorICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci50cmFuc2Zvcm0oYXJncyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCit9CisKKy8qKiovIH0pLAorLyogMjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DTWFwRmFjdG9yeSA9IGV4cG9ydHMuSWRlbnRpdHlDTWFwID0gZXhwb3J0cy5DTWFwID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOworCit2YXIgQlVJTFRfSU5fQ01BUFMgPSBbIkFkb2JlLUdCMS1VQ1MyIiwgIkFkb2JlLUNOUzEtVUNTMiIsICJBZG9iZS1KYXBhbjEtVUNTMiIsICJBZG9iZS1Lb3JlYTEtVUNTMiIsICI3OC1FVUMtSCIsICI3OC1FVUMtViIsICI3OC1IIiwgIjc4LVJLU0otSCIsICI3OC1SS1NKLVYiLCAiNzgtViIsICI3OG1zLVJLU0otSCIsICI3OG1zLVJLU0otViIsICI4M3B2LVJLU0otSCIsICI5MG1zLVJLU0otSCIsICI5MG1zLVJLU0otViIsICI5MG1zcC1SS1NKLUgiLCAiOTBtc3AtUktTSi1WIiwgIjkwcHYtUktTSi1IIiwgIjkwcHYtUktTSi1WIiwgIkFkZC1IIiwgIkFkZC1SS1NKLUgiLCAiQWRkLVJLU0otViIsICJBZGQtViIsICJBZG9iZS1DTlMxLTAiLCAiQWRvYmUtQ05TMS0xIiwgIkFkb2JlLUNOUzEtMiIsICJBZG9iZS1DTlMxLTMiLCAiQWRvYmUtQ05TMS00IiwgIkFkb2JlLUNOUzEtNSIsICJBZG9iZS1DTlMxLTYiLCAiQWRvYmUtR0IxLTAiLCAiQWRvYmUtR0IxLTEiLCAiQWRvYmUtR0IxLTIiLCAiQWRvYmUtR0IxLTMiLCAiQWRvYmUtR0IxLTQiLCAiQWRvYmUtR0IxLTUiLCAiQWRvYmUtSmFwYW4xLTAiLCAiQWRvYmUtSmFwYW4xLTEiLCAiQWRvYmUtSmFwYW4xLTIiLCAiQWRvYmUtSmFwYW4xLTMiLCAiQWRvYmUtSmFwYW4xLTQiLCAiQWRvYmUtSmFwYW4xLTUiLCAiQWRvYmUtSmFwYW4xLTYiLCAiQWRvYmUtS29yZWExLTAiLCAiQWRvYmUtS29yZWExLTEiLCAiQWRvYmUtS29yZWExLTIiLCAiQjUtSCIsICJCNS1WIiwgIkI1cGMtSCIsICJCNXBjLVYiLCAiQ05TLUVVQy1IIiwgIkNOUy1FVUMtViIsICJDTlMxLUgiLCAiQ05TMS1WIiwgIkNOUzItSCIsICJDTlMyLVYiLCAiRVRISy1CNS1IIiwgIkVUSEstQjUtViIsICJFVGVuLUI1LUgiLCAiRVRlbi1CNS1WIiwgIkVUZW5tcy1CNS1IIiwgIkVUZW5tcy1CNS1WIiwgIkVVQy1IIiwgIkVVQy1WIiwgIkV4dC1IIiwgIkV4dC1SS1NKLUgiLCAiRXh0LVJLU0otViIsICJFeHQtViIsICJHQi1FVUMtSCIsICJHQi1FVUMtViIsICJHQi1IIiwgIkdCLVYiLCAiR0JLLUVVQy1IIiwgIkdCSy1FVUMtViIsICJHQksySy1IIiwgIkdCSzJLLVYiLCAiR0JLcC1FVUMtSCIsICJHQktwLUVVQy1WIiwgIkdCVC1FVUMtSCIsICJHQlQtRVVDLVYiLCAiR0JULUgiLCAiR0JULVYiLCAiR0JUcGMtRVVDLUgiLCAiR0JUcGMtRVVDLVYiLCAiR0JwYy1FVUMtSCIsICJHQnBjLUVVQy1WIiwgIkgiLCAiSEtkbGEtQjUtSCIsICJIS2RsYS1CNS1WIiwgIkhLZGxiLUI1LUgiLCAiSEtkbGItQjUtViIsICJIS2djY3MtQjUtSCIsICJIS2djY3MtQjUtViIsICJIS20zMTQtQjUtSCIsICJIS20zMTQtQjUtViIsICJIS200NzEtQjUtSCIsICJIS200NzEtQjUtViIsICJIS3Njcy1CNS1IIiwgIkhLc2NzLUI1LVYiLCAiSGFua2FrdSIsICJIaXJhZ2FuYSIsICJLU0MtRVVDLUgiLCAiS1NDLUVVQy1WIiwgIktTQy1IIiwgIktTQy1Kb2hhYi1IIiwgIktTQy1Kb2hhYi1WIiwgIktTQy1WIiwgIktTQ21zLVVIQy1IIiwgIktTQ21zLVVIQy1IVy1IIiwgIktTQ21zLVVIQy1IVy1WIiwgIktTQ21zLVVIQy1WIiwgIktTQ3BjLUVVQy1IIiwgIktTQ3BjLUVVQy1WIiwgIkthdGFrYW5hIiwgIk5XUC1IIiwgIk5XUC1WIiwgIlJLU0otSCIsICJSS1NKLVYiLCAiUm9tYW4iLCAiVW5pQ05TLVVDUzItSCIsICJVbmlDTlMtVUNTMi1WIiwgIlVuaUNOUy1VVEYxNi1IIiwgIlVuaUNOUy1VVEYxNi1WIiwgIlVuaUNOUy1VVEYzMi1IIiwgIlVuaUNOUy1VVEYzMi1WIiwgIlVuaUNOUy1VVEY4LUgiLCAiVW5pQ05TLVVURjgtViIsICJVbmlHQi1VQ1MyLUgiLCAiVW5pR0ItVUNTMi1WIiwgIlVuaUdCLVVURjE2LUgiLCAiVW5pR0ItVVRGMTYtViIsICJVbmlHQi1VVEYzMi1IIiwgIlVuaUdCLVVURjMyLVYiLCAiVW5pR0ItVVRGOC1IIiwgIlVuaUdCLVVURjgtViIsICJVbmlKSVMtVUNTMi1IIiwgIlVuaUpJUy1VQ1MyLUhXLUgiLCAiVW5pSklTLVVDUzItSFctViIsICJVbmlKSVMtVUNTMi1WIiwgIlVuaUpJUy1VVEYxNi1IIiwgIlVuaUpJUy1VVEYxNi1WIiwgIlVuaUpJUy1VVEYzMi1IIiwgIlVuaUpJUy1VVEYzMi1WIiwgIlVuaUpJUy1VVEY4LUgiLCAiVW5pSklTLVVURjgtViIsICJVbmlKSVMyMDA0LVVURjE2LUgiLCAiVW5pSklTMjAwNC1VVEYxNi1WIiwgIlVuaUpJUzIwMDQtVVRGMzItSCIsICJVbmlKSVMyMDA0LVVURjMyLVYiLCAiVW5pSklTMjAwNC1VVEY4LUgiLCAiVW5pSklTMjAwNC1VVEY4LVYiLCAiVW5pSklTUHJvLVVDUzItSFctViIsICJVbmlKSVNQcm8tVUNTMi1WIiwgIlVuaUpJU1Byby1VVEY4LVYiLCAiVW5pSklTWDAyMTMtVVRGMzItSCIsICJVbmlKSVNYMDIxMy1VVEYzMi1WIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1IIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwgIlVuaUtTLVVDUzItSCIsICJVbmlLUy1VQ1MyLVYiLCAiVW5pS1MtVVRGMTYtSCIsICJVbmlLUy1VVEYxNi1WIiwgIlVuaUtTLVVURjMyLUgiLCAiVW5pS1MtVVRGMzItViIsICJVbmlLUy1VVEY4LUgiLCAiVW5pS1MtVVRGOC1WIiwgIlYiLCAiV1AtU3ltYm9sIl07Citjb25zdCBNQVhfTUFQX1JBTkdFID0gMiAqKiAyNCAtIDE7CisKK2NsYXNzIENNYXAgeworICBjb25zdHJ1Y3RvcihidWlsdEluQ01hcCA9IGZhbHNlKSB7CisgICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXMgPSBbW10sIFtdLCBbXSwgW11dOworICAgIHRoaXMubnVtQ29kZXNwYWNlUmFuZ2VzID0gMDsKKyAgICB0aGlzLl9tYXAgPSBbXTsKKyAgICB0aGlzLm5hbWUgPSAiIjsKKyAgICB0aGlzLnZlcnRpY2FsID0gZmFsc2U7CisgICAgdGhpcy51c2VDTWFwID0gbnVsbDsKKyAgICB0aGlzLmJ1aWx0SW5DTWFwID0gYnVpbHRJbkNNYXA7CisgIH0KKworICBhZGRDb2Rlc3BhY2VSYW5nZShuLCBsb3csIGhpZ2gpIHsKKyAgICB0aGlzLmNvZGVzcGFjZVJhbmdlc1tuIC0gMV0ucHVzaChsb3csIGhpZ2gpOworICAgIHRoaXMubnVtQ29kZXNwYWNlUmFuZ2VzKys7CisgIH0KKworICBtYXBDaWRSYW5nZShsb3csIGhpZ2gsIGRzdExvdykgeworICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXBDaWRSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKKyAgICB9CisKKyAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKKyAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3crKzsKKyAgICB9CisgIH0KKworICBtYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CisgICAgaWYgKGhpZ2ggLSBsb3cgPiBNQVhfTUFQX1JBTkdFKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7CisgICAgfQorCisgICAgdmFyIGxhc3RCeXRlID0gZHN0TG93Lmxlbmd0aCAtIDE7CisKKyAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKKyAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3c7CisgICAgICBkc3RMb3cgPSBkc3RMb3cuc3Vic3RyaW5nKDAsIGxhc3RCeXRlKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoZHN0TG93LmNoYXJDb2RlQXQobGFzdEJ5dGUpICsgMSk7CisgICAgfQorICB9CisKKyAgbWFwQmZSYW5nZVRvQXJyYXkobG93LCBoaWdoLCBhcnJheSkgeworICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXBCZlJhbmdlVG9BcnJheSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKKyAgICB9CisKKyAgICBjb25zdCBpaSA9IGFycmF5Lmxlbmd0aDsKKyAgICBsZXQgaSA9IDA7CisKKyAgICB3aGlsZSAobG93IDw9IGhpZ2ggJiYgaSA8IGlpKSB7CisgICAgICB0aGlzLl9tYXBbbG93XSA9IGFycmF5W2krK107CisgICAgICArK2xvdzsKKyAgICB9CisgIH0KKworICBtYXBPbmUoc3JjLCBkc3QpIHsKKyAgICB0aGlzLl9tYXBbc3JjXSA9IGRzdDsKKyAgfQorCisgIGxvb2t1cChjb2RlKSB7CisgICAgcmV0dXJuIHRoaXMuX21hcFtjb2RlXTsKKyAgfQorCisgIGNvbnRhaW5zKGNvZGUpIHsKKyAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdICE9PSB1bmRlZmluZWQ7CisgIH0KKworICBmb3JFYWNoKGNhbGxiYWNrKSB7CisgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwOworICAgIGNvbnN0IGxlbmd0aCA9IG1hcC5sZW5ndGg7CisKKyAgICBpZiAobGVuZ3RoIDw9IDB4MTAwMDApIHsKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKG1hcFtpXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGNvbnN0IGkgaW4gbWFwKSB7CisgICAgICAgIGNhbGxiYWNrKGksIG1hcFtpXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2hhckNvZGVPZih2YWx1ZSkgeworICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKKworICAgIGlmIChtYXAubGVuZ3RoIDw9IDB4MTAwMDApIHsKKyAgICAgIHJldHVybiBtYXAuaW5kZXhPZih2YWx1ZSk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHsKKyAgICAgIGlmIChtYXBbY2hhckNvZGVdID09PSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGdldE1hcCgpIHsKKyAgICByZXR1cm4gdGhpcy5fbWFwOworICB9CisKKyAgcmVhZENoYXJDb2RlKHN0ciwgb2Zmc2V0LCBvdXQpIHsKKyAgICBsZXQgYyA9IDA7CisgICAgY29uc3QgY29kZXNwYWNlUmFuZ2VzID0gdGhpcy5jb2Rlc3BhY2VSYW5nZXM7CisKKyAgICBmb3IgKGxldCBuID0gMCwgbm4gPSBjb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBuIDwgbm47IG4rKykgeworICAgICAgYyA9IChjIDw8IDggfCBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyBuKSkgPj4+IDA7CisgICAgICBjb25zdCBjb2Rlc3BhY2VSYW5nZSA9IGNvZGVzcGFjZVJhbmdlc1tuXTsKKworICAgICAgZm9yIChsZXQgayA9IDAsIGtrID0gY29kZXNwYWNlUmFuZ2UubGVuZ3RoOyBrIDwga2s7KSB7CisgICAgICAgIGNvbnN0IGxvdyA9IGNvZGVzcGFjZVJhbmdlW2srK107CisgICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOworCisgICAgICAgIGlmIChjID49IGxvdyAmJiBjIDw9IGhpZ2gpIHsKKyAgICAgICAgICBvdXQuY2hhcmNvZGUgPSBjOworICAgICAgICAgIG91dC5sZW5ndGggPSBuICsgMTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQuY2hhcmNvZGUgPSAwOworICAgIG91dC5sZW5ndGggPSAxOworICB9CisKKyAgZ2V0IGxlbmd0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKKyAgfQorCisgIGdldCBpc0lkZW50aXR5Q01hcCgpIHsKKyAgICBpZiAoISh0aGlzLm5hbWUgPT09ICJJZGVudGl0eS1IIiB8fCB0aGlzLm5hbWUgPT09ICJJZGVudGl0eS1WIikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fbWFwLmxlbmd0aCAhPT0gMHgxMDAwMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMHgxMDAwMDsgaSsrKSB7CisgICAgICBpZiAodGhpcy5fbWFwW2ldICE9PSBpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCit9CisKK2V4cG9ydHMuQ01hcCA9IENNYXA7CisKK2NsYXNzIElkZW50aXR5Q01hcCBleHRlbmRzIENNYXAgeworICBjb25zdHJ1Y3Rvcih2ZXJ0aWNhbCwgbikgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy52ZXJ0aWNhbCA9IHZlcnRpY2FsOworICAgIHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UobiwgMCwgMHhmZmZmKTsKKyAgfQorCisgIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcENpZFJhbmdlIik7CisgIH0KKworICBtYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2UiKTsKKyAgfQorCisgIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZVRvQXJyYXkiKTsKKyAgfQorCisgIG1hcE9uZShzcmMsIGRzdCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBDaWRPbmUiKTsKKyAgfQorCisgIGxvb2t1cChjb2RlKSB7CisgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29kZSkgJiYgY29kZSA8PSAweGZmZmYgPyBjb2RlIDogdW5kZWZpbmVkOworICB9CisKKyAgY29udGFpbnMoY29kZSkgeworICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpICYmIGNvZGUgPD0gMHhmZmZmOworICB9CisKKyAgZm9yRWFjaChjYWxsYmFjaykgeworICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKSB7CisgICAgICBjYWxsYmFjayhpLCBpKTsKKyAgICB9CisgIH0KKworICBjaGFyQ29kZU9mKHZhbHVlKSB7CisgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlIDw9IDB4ZmZmZiA/IHZhbHVlIDogLTE7CisgIH0KKworICBnZXRNYXAoKSB7CisgICAgY29uc3QgbWFwID0gbmV3IEFycmF5KDB4MTAwMDApOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMHhmZmZmOyBpKyspIHsKKyAgICAgIG1hcFtpXSA9IGk7CisgICAgfQorCisgICAgcmV0dXJuIG1hcDsKKyAgfQorCisgIGdldCBsZW5ndGgoKSB7CisgICAgcmV0dXJuIDB4MTAwMDA7CisgIH0KKworICBnZXQgaXNJZGVudGl0eUNNYXAoKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBhY2Nlc3MgLmlzSWRlbnRpdHlDTWFwIik7CisgIH0KKworfQorCitleHBvcnRzLklkZW50aXR5Q01hcCA9IElkZW50aXR5Q01hcDsKKwordmFyIEJpbmFyeUNNYXBSZWFkZXIgPSBmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gaGV4VG9JbnQoYSwgc2l6ZSkgeworICAgIHZhciBuID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHNpemU7IGkrKykgeworICAgICAgbiA9IG4gPDwgOCB8IGFbaV07CisgICAgfQorCisgICAgcmV0dXJuIG4gPj4+IDA7CisgIH0KKworICBmdW5jdGlvbiBoZXhUb1N0cihhLCBzaXplKSB7CisgICAgaWYgKHNpemUgPT09IDEpIHsKKyAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0pOworICAgIH0KKworICAgIGlmIChzaXplID09PSAzKSB7CisgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7CisgIH0KKworICBmdW5jdGlvbiBhZGRIZXgoYSwgYiwgc2l6ZSkgeworICAgIHZhciBjID0gMDsKKworICAgIGZvciAodmFyIGkgPSBzaXplOyBpID49IDA7IGktLSkgeworICAgICAgYyArPSBhW2ldICsgYltpXTsKKyAgICAgIGFbaV0gPSBjICYgMjU1OworICAgICAgYyA+Pj0gODsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBpbmNIZXgoYSwgc2l6ZSkgeworICAgIHZhciBjID0gMTsKKworICAgIGZvciAodmFyIGkgPSBzaXplOyBpID49IDAgJiYgYyA+IDA7IGktLSkgeworICAgICAgYyArPSBhW2ldOworICAgICAgYVtpXSA9IGMgJiAyNTU7CisgICAgICBjID4+PSA4OworICAgIH0KKyAgfQorCisgIHZhciBNQVhfTlVNX1NJWkUgPSAxNjsKKyAgdmFyIE1BWF9FTkNPREVEX05VTV9TSVpFID0gMTk7CisKKyAgZnVuY3Rpb24gQmluYXJ5Q01hcFN0cmVhbShkYXRhKSB7CisgICAgdGhpcy5idWZmZXIgPSBkYXRhOworICAgIHRoaXMucG9zID0gMDsKKyAgICB0aGlzLmVuZCA9IGRhdGEubGVuZ3RoOworICAgIHRoaXMudG1wQnVmID0gbmV3IFVpbnQ4QXJyYXkoTUFYX0VOQ09ERURfTlVNX1NJWkUpOworICB9CisKKyAgQmluYXJ5Q01hcFN0cmVhbS5wcm90b3R5cGUgPSB7CisgICAgcmVhZEJ5dGUoKSB7CisgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107CisgICAgfSwKKworICAgIHJlYWROdW1iZXIoKSB7CisgICAgICB2YXIgbiA9IDA7CisgICAgICB2YXIgbGFzdDsKKworICAgICAgZG8geworICAgICAgICB2YXIgYiA9IHRoaXMucmVhZEJ5dGUoKTsKKworICAgICAgICBpZiAoYiA8IDApIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoInVuZXhwZWN0ZWQgRU9GIGluIGJjbWFwIik7CisgICAgICAgIH0KKworICAgICAgICBsYXN0ID0gIShiICYgMHg4MCk7CisgICAgICAgIG4gPSBuIDw8IDcgfCBiICYgMHg3ZjsKKyAgICAgIH0gd2hpbGUgKCFsYXN0KTsKKworICAgICAgcmV0dXJuIG47CisgICAgfSwKKworICAgIHJlYWRTaWduZWQoKSB7CisgICAgICB2YXIgbiA9IHRoaXMucmVhZE51bWJlcigpOworICAgICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7CisgICAgfSwKKworICAgIHJlYWRIZXgobnVtLCBzaXplKSB7CisgICAgICBudW0uc2V0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zLCB0aGlzLnBvcyArIHNpemUgKyAxKSk7CisgICAgICB0aGlzLnBvcyArPSBzaXplICsgMTsKKyAgICB9LAorCisgICAgcmVhZEhleE51bWJlcihudW0sIHNpemUpIHsKKyAgICAgIHZhciBsYXN0OworICAgICAgdmFyIHN0YWNrID0gdGhpcy50bXBCdWYsCisgICAgICAgICAgc3AgPSAwOworCisgICAgICBkbyB7CisgICAgICAgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpOworCisgICAgICAgIGlmIChiIDwgMCkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3QgPSAhKGIgJiAweDgwKTsKKyAgICAgICAgc3RhY2tbc3ArK10gPSBiICYgMHg3ZjsKKyAgICAgIH0gd2hpbGUgKCFsYXN0KTsKKworICAgICAgdmFyIGkgPSBzaXplLAorICAgICAgICAgIGJ1ZmZlciA9IDAsCisgICAgICAgICAgYnVmZmVyU2l6ZSA9IDA7CisKKyAgICAgIHdoaWxlIChpID49IDApIHsKKyAgICAgICAgd2hpbGUgKGJ1ZmZlclNpemUgPCA4ICYmIHN0YWNrLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICBidWZmZXIgPSBzdGFja1stLXNwXSA8PCBidWZmZXJTaXplIHwgYnVmZmVyOworICAgICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIG51bVtpXSA9IGJ1ZmZlciAmIDI1NTsKKyAgICAgICAgaS0tOworICAgICAgICBidWZmZXIgPj49IDg7CisgICAgICAgIGJ1ZmZlclNpemUgLT0gODsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVhZEhleFNpZ25lZChudW0sIHNpemUpIHsKKyAgICAgIHRoaXMucmVhZEhleE51bWJlcihudW0sIHNpemUpOworICAgICAgdmFyIHNpZ24gPSBudW1bc2l6ZV0gJiAxID8gMjU1IDogMDsKKyAgICAgIHZhciBjID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7CisgICAgICAgIGMgPSAoYyAmIDEpIDw8IDggfCBudW1baV07CisgICAgICAgIG51bVtpXSA9IGMgPj4gMSBeIHNpZ247CisgICAgICB9CisgICAgfSwKKworICAgIHJlYWRTdHJpbmcoKSB7CisgICAgICB2YXIgbGVuID0gdGhpcy5yZWFkTnVtYmVyKCk7CisgICAgICB2YXIgcyA9ICIiOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWROdW1iZXIoKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBzOworICAgIH0KKworICB9OworCisgIGZ1bmN0aW9uIHByb2Nlc3NCaW5hcnlDTWFwKGRhdGEsIGNNYXAsIGV4dGVuZCkgeworICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICB2YXIgc3RyZWFtID0gbmV3IEJpbmFyeUNNYXBTdHJlYW0oZGF0YSk7CisgICAgICB2YXIgaGVhZGVyID0gc3RyZWFtLnJlYWRCeXRlKCk7CisgICAgICBjTWFwLnZlcnRpY2FsID0gISEoaGVhZGVyICYgMSk7CisgICAgICB2YXIgdXNlQ01hcCA9IG51bGw7CisgICAgICB2YXIgc3RhcnQgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOworICAgICAgdmFyIGVuZCA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7CisgICAgICB2YXIgY2hhciA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7CisgICAgICB2YXIgY2hhckNvZGUgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOworICAgICAgdmFyIHRtcCA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7CisgICAgICB2YXIgY29kZTsKKyAgICAgIHZhciBiOworCisgICAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZEJ5dGUoKSkgPj0gMCkgeworICAgICAgICB2YXIgdHlwZSA9IGIgPj4gNTsKKworICAgICAgICBpZiAodHlwZSA9PT0gNykgeworICAgICAgICAgIHN3aXRjaCAoYiAmIDB4MWYpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgdXNlQ01hcCA9IHN0cmVhbS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHNlcXVlbmNlID0gISEoYiAmIDB4MTApOworICAgICAgICB2YXIgZGF0YVNpemUgPSBiICYgMTU7CisKKyAgICAgICAgaWYgKGRhdGFTaXplICsgMSA+IE1BWF9OVU1fU0laRSkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigicHJvY2Vzc0JpbmFyeUNNYXA6IEludmFsaWQgZGF0YVNpemUuIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdWNzMkRhdGFTaXplID0gMTsKKyAgICAgICAgdmFyIHN1Yml0ZW1zQ291bnQgPSBzdHJlYW0ucmVhZE51bWJlcigpOworICAgICAgICB2YXIgaTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShkYXRhU2l6ZSArIDEsIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpKTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBjTWFwLmFkZENvZGVzcGFjZVJhbmdlKGRhdGFTaXplICsgMSwgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBzdHJlYW0ucmVhZE51bWJlcigpOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGluY0hleChlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgYWRkSGV4KHN0YXJ0LCBlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkTnVtYmVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhciwgZGF0YVNpemUpOworICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CisgICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGluY0hleChjaGFyLCBkYXRhU2l6ZSk7CisKKyAgICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgeworICAgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHRtcCwgZGF0YVNpemUpOworICAgICAgICAgICAgICAgIGFkZEhleChjaGFyLCB0bXAsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZFNpZ25lZCgpICsgKGNvZGUgKyAxKTsKKyAgICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgZGF0YVNpemUpLCBjb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CisgICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLCBjb2RlKTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CisKKyAgICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgeworICAgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkSGV4KHN0YXJ0LCBlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBjb2RlID0gc3RyZWFtLnJlYWROdW1iZXIoKTsKKyAgICAgICAgICAgICAgY01hcC5tYXBDaWRSYW5nZShoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSwgY29kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhciwgdWNzMkRhdGFTaXplKTsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXJDb2RlLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCB1Y3MyRGF0YVNpemUpLCBoZXhUb1N0cihjaGFyQ29kZSwgZGF0YVNpemUpKTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICBpbmNIZXgoY2hhciwgdWNzMkRhdGFTaXplKTsKKworICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIodG1wLCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgICAgIGFkZEhleChjaGFyLCB0bXAsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpbmNIZXgoY2hhckNvZGUsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhTaWduZWQodG1wLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGFkZEhleChjaGFyQ29kZSwgdG1wLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGNNYXAubWFwT25lKGhleFRvSW50KGNoYXIsIHVjczJEYXRhU2l6ZSksIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOworICAgICAgICAgICAgY01hcC5tYXBCZlJhbmdlKGhleFRvSW50KHN0YXJ0LCB1Y3MyRGF0YVNpemUpLCBoZXhUb0ludChlbmQsIHVjczJEYXRhU2l6ZSksIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSkpOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGluY0hleChlbmQsIHVjczJEYXRhU2l6ZSk7CisKKyAgICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgeworICAgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHN0YXJ0LCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0LnNldChlbmQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgdWNzMkRhdGFTaXplKTsKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhckNvZGUsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgY01hcC5tYXBCZlJhbmdlKGhleFRvSW50KHN0YXJ0LCB1Y3MyRGF0YVNpemUpLCBoZXhUb0ludChlbmQsIHVjczJEYXRhU2l6ZSksIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJwcm9jZXNzQmluYXJ5Q01hcDogVW5rbm93biB0eXBlOiAiICsgdHlwZSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh1c2VDTWFwKSB7CisgICAgICAgIHJlc29sdmUoZXh0ZW5kKHVzZUNNYXApKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICByZXNvbHZlKGNNYXApOworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gQmluYXJ5Q01hcFJlYWRlcigpIHt9CisKKyAgQmluYXJ5Q01hcFJlYWRlci5wcm90b3R5cGUgPSB7CisgICAgcHJvY2VzczogcHJvY2Vzc0JpbmFyeUNNYXAKKyAgfTsKKyAgcmV0dXJuIEJpbmFyeUNNYXBSZWFkZXI7Cit9KCk7CisKK3ZhciBDTWFwRmFjdG9yeSA9IGZ1bmN0aW9uIENNYXBGYWN0b3J5Q2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gc3RyVG9JbnQoc3RyKSB7CisgICAgdmFyIGEgPSAwOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKKyAgICAgIGEgPSBhIDw8IDggfCBzdHIuY2hhckNvZGVBdChpKTsKKyAgICB9CisKKyAgICByZXR1cm4gYSA+Pj4gMDsKKyAgfQorCisgIGZ1bmN0aW9uIGV4cGVjdFN0cmluZyhvYmopIHsKKyAgICBpZiAoISgwLCBfdXRpbC5pc1N0cmluZykob2JqKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgc3RyaW5nLiIpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGV4cGVjdEludChvYmopIHsKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2JqKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgaW50LiIpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlQmZDaGFyKGNNYXAsIGxleGVyKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAiZW5kYmZjaGFyIikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBzcmMgPSBzdHJUb0ludChvYmopOworICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBkc3QgPSBvYmo7CisgICAgICBjTWFwLm1hcE9uZShzcmMsIGRzdCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAiZW5kYmZyYW5nZSIpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZXhwZWN0U3RyaW5nKG9iaik7CisgICAgICB2YXIgbG93ID0gc3RyVG9JbnQob2JqKTsKKyAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOworICAgICAgZXhwZWN0U3RyaW5nKG9iaik7CisgICAgICB2YXIgaGlnaCA9IHN0clRvSW50KG9iaik7CisgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSB8fCAoMCwgX3V0aWwuaXNTdHJpbmcpKG9iaikpIHsKKyAgICAgICAgdmFyIGRzdExvdyA9IE51bWJlci5pc0ludGVnZXIob2JqKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUob2JqKSA6IG9iajsKKyAgICAgICAgY01hcC5tYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJbIikpIHsKKyAgICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisgICAgICAgIHZhciBhcnJheSA9IFtdOworCisgICAgICAgIHdoaWxlICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJdIikgJiYgISgwLCBfcHJpbWl0aXZlcy5pc0VPRikob2JqKSkgeworICAgICAgICAgIGFycmF5LnB1c2gob2JqKTsKKyAgICAgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgICAgfQorCisgICAgICAgIGNNYXAubWFwQmZSYW5nZVRvQXJyYXkobG93LCBoaWdoLCBhcnJheSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgYmYgcmFuZ2UuIik7CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKShvYmopKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJlbmRjaWRjaGFyIikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBzcmMgPSBzdHJUb0ludChvYmopOworICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisgICAgICBleHBlY3RJbnQob2JqKTsKKyAgICAgIHZhciBkc3QgPSBvYmo7CisgICAgICBjTWFwLm1hcE9uZShzcmMsIGRzdCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VDaWRSYW5nZShjTWFwLCBsZXhlcikgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKG9iaikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgImVuZGNpZHJhbmdlIikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBsb3cgPSBzdHJUb0ludChvYmopOworICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBoaWdoID0gc3RyVG9JbnQob2JqKTsKKyAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOworICAgICAgZXhwZWN0SW50KG9iaik7CisgICAgICB2YXIgZHN0TG93ID0gb2JqOworICAgICAgY01hcC5tYXBDaWRSYW5nZShsb3csIGhpZ2gsIGRzdExvdyk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VDb2Rlc3BhY2VSYW5nZShjTWFwLCBsZXhlcikgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKG9iaikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgImVuZGNvZGVzcGFjZXJhbmdlIikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoISgwLCBfdXRpbC5pc1N0cmluZykob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdmFyIGxvdyA9IHN0clRvSW50KG9iaik7CisgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgaWYgKCEoMCwgX3V0aWwuaXNTdHJpbmcpKG9iaikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHZhciBoaWdoID0gc3RyVG9JbnQob2JqKTsKKyAgICAgIGNNYXAuYWRkQ29kZXNwYWNlUmFuZ2Uob2JqLmxlbmd0aCwgbG93LCBoaWdoKTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgY29kZXNwYWNlIHJhbmdlLiIpOworICB9CisKKyAgZnVuY3Rpb24gcGFyc2VXTW9kZShjTWFwLCBsZXhlcikgeworICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKKyAgICAgIGNNYXAudmVydGljYWwgPSAhIW9iajsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKSB7CisgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG9iaikgJiYgKDAsIF91dGlsLmlzU3RyaW5nKShvYmoubmFtZSkpIHsKKyAgICAgIGNNYXAubmFtZSA9IG9iai5uYW1lOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkgeworICAgIHZhciBwcmV2aW91czsKKyAgICB2YXIgZW1iZWRkZWRVc2VDTWFwOworCisgICAgb2JqTG9vcDogd2hpbGUgKHRydWUpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKShvYmopKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkob2JqKSkgeworICAgICAgICAgIGlmIChvYmoubmFtZSA9PT0gIldNb2RlIikgeworICAgICAgICAgICAgcGFyc2VXTW9kZShjTWFwLCBsZXhlcik7CisgICAgICAgICAgfSBlbHNlIGlmIChvYmoubmFtZSA9PT0gIkNNYXBOYW1lIikgeworICAgICAgICAgICAgcGFyc2VDTWFwTmFtZShjTWFwLCBsZXhlcik7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHJldmlvdXMgPSBvYmo7CisgICAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmopKSB7CisgICAgICAgICAgc3dpdGNoIChvYmouY21kKSB7CisgICAgICAgICAgICBjYXNlICJlbmRjbWFwIjoKKyAgICAgICAgICAgICAgYnJlYWsgb2JqTG9vcDsKKworICAgICAgICAgICAgY2FzZSAidXNlY21hcCI6CisgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShwcmV2aW91cykpIHsKKyAgICAgICAgICAgICAgICBlbWJlZGRlZFVzZUNNYXAgPSBwcmV2aW91cy5uYW1lOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgImJlZ2luY29kZXNwYWNlcmFuZ2UiOgorICAgICAgICAgICAgICBwYXJzZUNvZGVzcGFjZVJhbmdlKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgImJlZ2luYmZjaGFyIjoKKyAgICAgICAgICAgICAgcGFyc2VCZkNoYXIoY01hcCwgbGV4ZXIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYmVnaW5jaWRjaGFyIjoKKyAgICAgICAgICAgICAgcGFyc2VDaWRDaGFyKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgImJlZ2luYmZyYW5nZSI6CisgICAgICAgICAgICAgIHBhcnNlQmZSYW5nZShjTWFwLCBsZXhlcik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJiZWdpbmNpZHJhbmdlIjoKKyAgICAgICAgICAgICAgcGFyc2VDaWRSYW5nZShjTWFwLCBsZXhlcik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBjTWFwIGRhdGE6ICIgKyBleCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmICghdXNlQ01hcCAmJiBlbWJlZGRlZFVzZUNNYXApIHsKKyAgICAgIHVzZUNNYXAgPSBlbWJlZGRlZFVzZUNNYXA7CisgICAgfQorCisgICAgaWYgKHVzZUNNYXApIHsKKyAgICAgIHJldHVybiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApOworICAgIH0KKworICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY01hcCk7CisgIH0KKworICBmdW5jdGlvbiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApIHsKKyAgICByZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAodXNlQ01hcCwgZmV0Y2hCdWlsdEluQ01hcCkudGhlbihmdW5jdGlvbiAobmV3Q01hcCkgeworICAgICAgY01hcC51c2VDTWFwID0gbmV3Q01hcDsKKworICAgICAgaWYgKGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID09PSAwKSB7CisgICAgICAgIHZhciB1c2VDb2Rlc3BhY2VSYW5nZXMgPSBjTWFwLnVzZUNNYXAuY29kZXNwYWNlUmFuZ2VzOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXNlQ29kZXNwYWNlUmFuZ2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgY01hcC5jb2Rlc3BhY2VSYW5nZXNbaV0gPSB1c2VDb2Rlc3BhY2VSYW5nZXNbaV0uc2xpY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlczsKKyAgICAgIH0KKworICAgICAgY01hcC51c2VDTWFwLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgICAgaWYgKCFjTWFwLmNvbnRhaW5zKGtleSkpIHsKKyAgICAgICAgICBjTWFwLm1hcE9uZShrZXksIGNNYXAudXNlQ01hcC5sb29rdXAoa2V5KSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJuIGNNYXA7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVCdWlsdEluQ01hcChuYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKSB7CisgICAgaWYgKG5hbWUgPT09ICJJZGVudGl0eS1IIikgeworICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgSWRlbnRpdHlDTWFwKGZhbHNlLCAyKSk7CisgICAgfSBlbHNlIGlmIChuYW1lID09PSAiSWRlbnRpdHktViIpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IElkZW50aXR5Q01hcCh0cnVlLCAyKSk7CisgICAgfQorCisgICAgaWYgKCFCVUlMVF9JTl9DTUFQUy5pbmNsdWRlcyhuYW1lKSkgeworICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiVW5rbm93biBDTWFwIG5hbWU6ICIgKyBuYW1lKSk7CisgICAgfQorCisgICAgaWYgKCFmZXRjaEJ1aWx0SW5DTWFwKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJCdWlsdC1pbiBDTWFwIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm92aWRlZC4iKSk7CisgICAgfQorCisgICAgcmV0dXJuIGZldGNoQnVpbHRJbkNNYXAobmFtZSkudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgdmFyIGNNYXBEYXRhID0gZGF0YS5jTWFwRGF0YSwKKyAgICAgICAgICBjb21wcmVzc2lvblR5cGUgPSBkYXRhLmNvbXByZXNzaW9uVHlwZTsKKyAgICAgIHZhciBjTWFwID0gbmV3IENNYXAodHJ1ZSk7CisKKyAgICAgIGlmIChjb21wcmVzc2lvblR5cGUgPT09IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZKSB7CisgICAgICAgIHJldHVybiBuZXcgQmluYXJ5Q01hcFJlYWRlcigpLnByb2Nlc3MoY01hcERhdGEsIGNNYXAsIGZ1bmN0aW9uICh1c2VDTWFwKSB7CisgICAgICAgICAgcmV0dXJuIGV4dGVuZENNYXAoY01hcCwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBpZiAoY29tcHJlc3Npb25UeXBlID09PSBfdXRpbC5DTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpIHsKKyAgICAgICAgdmFyIGxleGVyID0gbmV3IF9wYXJzZXIuTGV4ZXIobmV3IF9zdHJlYW0uU3RyZWFtKGNNYXBEYXRhKSk7CisgICAgICAgIHJldHVybiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIG51bGwpOworICAgICAgfQorCisgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJUT0RPOiBPbmx5IEJJTkFSWS9OT05FIENNYXAgY29tcHJlc3Npb24gaXMgY3VycmVudGx5IHN1cHBvcnRlZC4iKSk7CisgICAgfSk7CisgIH0KKworICByZXR1cm4geworICAgIGFzeW5jIGNyZWF0ZShwYXJhbXMpIHsKKyAgICAgIHZhciBlbmNvZGluZyA9IHBhcmFtcy5lbmNvZGluZzsKKyAgICAgIHZhciBmZXRjaEJ1aWx0SW5DTWFwID0gcGFyYW1zLmZldGNoQnVpbHRJbkNNYXA7CisgICAgICB2YXIgdXNlQ01hcCA9IHBhcmFtcy51c2VDTWFwOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZW5jb2RpbmcpKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVCdWlsdEluQ01hcChlbmNvZGluZy5uYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShlbmNvZGluZykpIHsKKyAgICAgICAgdmFyIGNNYXAgPSBuZXcgQ01hcCgpOworICAgICAgICB2YXIgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihlbmNvZGluZyk7CisgICAgICAgIHJldHVybiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApLnRoZW4oZnVuY3Rpb24gKHBhcnNlZENNYXApIHsKKyAgICAgICAgICBpZiAocGFyc2VkQ01hcC5pc0lkZW50aXR5Q01hcCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKHBhcnNlZENNYXAubmFtZSwgZmV0Y2hCdWlsdEluQ01hcCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHBhcnNlZENNYXA7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuY29kaW5nIHJlcXVpcmVkLiIpOworICAgIH0KKworICB9OworfSgpOworCitleHBvcnRzLkNNYXBGYWN0b3J5ID0gQ01hcEZhY3Rvcnk7CisKKy8qKiovIH0pLAorLyogMzAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRGb250VHlwZSA9IGdldEZvbnRUeXBlOworZXhwb3J0cy5JZGVudGl0eVRvVW5pY29kZU1hcCA9IGV4cG9ydHMuVG9Vbmljb2RlTWFwID0gZXhwb3J0cy5Gb250RmxhZ3MgPSBleHBvcnRzLkZvbnQgPSBleHBvcnRzLkVycm9yRm9udCA9IGV4cG9ydHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX2NmZl9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMxKTsKKwordmFyIF9nbHlwaGxpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM0KTsKKwordmFyIF9lbmNvZGluZ3MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMzKTsKKwordmFyIF9zdGFuZGFyZF9mb250cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzUpOworCit2YXIgX3VuaWNvZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM2KTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKwordmFyIF9mb250X3JlbmRlcmVyID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7CisKK3ZhciBfY21hcCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOworCit2YXIgX3R5cGUxX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMzgpOworCitjb25zdCBQUklWQVRFX1VTRV9BUkVBUyA9IFtbMHhlMDAwLCAweGY4ZmZdLCBbMHgxMDAwMDAsIDB4MTBmZmZkXV07Cit2YXIgUERGX0dMWVBIX1NQQUNFX1VOSVRTID0gMTAwMDsKK3ZhciBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB0cnVlOworZXhwb3J0cy5TRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSBTRUFDX0FOQUxZU0lTX0VOQUJMRUQ7Citjb25zdCBFWFBPUlRfREFUQV9QUk9QRVJUSUVTID0gWyJhc2NlbnQiLCAiYmJveCIsICJibGFjayIsICJib2xkIiwgImNoYXJQcm9jT3BlcmF0b3JMaXN0IiwgImNvbXBvc2l0ZSIsICJkYXRhIiwgImRlZmF1bHRWTWV0cmljcyIsICJkZWZhdWx0V2lkdGgiLCAiZGVzY2VudCIsICJmYWxsYmFja05hbWUiLCAiZm9udE1hdHJpeCIsICJmb250VHlwZSIsICJpc01vbm9zcGFjZSIsICJpc1NlcmlmRm9udCIsICJpc1R5cGUzRm9udCIsICJpdGFsaWMiLCAibG9hZGVkTmFtZSIsICJtaW1ldHlwZSIsICJtaXNzaW5nRmlsZSIsICJuYW1lIiwgInJlbWVhc3VyZSIsICJzdWJ0eXBlIiwgInR5cGUiLCAidmVydGljYWwiXTsKK2NvbnN0IEVYUE9SVF9EQVRBX0VYVFJBX1BST1BFUlRJRVMgPSBbImNNYXAiLCAiZGVmYXVsdEVuY29kaW5nIiwgImRpZmZlcmVuY2VzIiwgImlzU3ltYm9saWNGb250IiwgInNlYWNNYXAiLCAidG9Gb250Q2hhciIsICJ0b1VuaWNvZGUiLCAidm1ldHJpY3MiLCAid2lkdGhzIl07Cit2YXIgRm9udEZsYWdzID0geworICBGaXhlZFBpdGNoOiAxLAorICBTZXJpZjogMiwKKyAgU3ltYm9saWM6IDQsCisgIFNjcmlwdDogOCwKKyAgTm9uc3ltYm9saWM6IDMyLAorICBJdGFsaWM6IDY0LAorICBBbGxDYXA6IDY1NTM2LAorICBTbWFsbENhcDogMTMxMDcyLAorICBGb3JjZUJvbGQ6IDI2MjE0NAorfTsKK2V4cG9ydHMuRm9udEZsYWdzID0gRm9udEZsYWdzOwordmFyIE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZyA9IFsiLm5vdGRlZiIsICIubnVsbCIsICJub25tYXJraW5ncmV0dXJuIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAiZ3JhdmUiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIkFkaWVyZXNpcyIsICJBcmluZyIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLCAiYWFjdXRlIiwgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvdGlsZGUiLCAidWFjdXRlIiwgInVncmF2ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLCAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwgInJlZ2lzdGVyZWQiLCAiY29weXJpZ2h0IiwgInRyYWRlbWFyayIsICJhY3V0ZSIsICJkaWVyZXNpcyIsICJub3RlcXVhbCIsICJBRSIsICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLCAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsICJwcm9kdWN0IiwgInBpIiwgImludGVncmFsIiwgIm9yZGZlbWluaW5lIiwgIm9yZG1hc2N1bGluZSIsICJPbWVnYSIsICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsICJyYWRpY2FsIiwgImZsb3JpbiIsICJhcHByb3hlcXVhbCIsICJEZWx0YSIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgIm5vbmJyZWFraW5nc3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgIkxzbGFzaCIsICJsc2xhc2giLCAiU2Nhcm9uIiwgInNjYXJvbiIsICJaY2Fyb24iLCAiemNhcm9uIiwgImJyb2tlbmJhciIsICJFdGgiLCAiZXRoIiwgIllhY3V0ZSIsICJ5YWN1dGUiLCAiVGhvcm4iLCAidGhvcm4iLCAibWludXMiLCAibXVsdGlwbHkiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJvbmVoYWxmIiwgIm9uZXF1YXJ0ZXIiLCAidGhyZWVxdWFydGVycyIsICJmcmFuYyIsICJHYnJldmUiLCAiZ2JyZXZlIiwgIklkb3RhY2NlbnQiLCAiU2NlZGlsbGEiLCAic2NlZGlsbGEiLCAiQ2FjdXRlIiwgImNhY3V0ZSIsICJDY2Fyb24iLCAiY2Nhcm9uIiwgImRjcm9hdCJdOworCitmdW5jdGlvbiBhZGp1c3RXaWR0aHMocHJvcGVydGllcykgeworICBpZiAoIXByb3BlcnRpZXMuZm9udE1hdHJpeCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF0gPT09IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYWzBdKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFyIHNjYWxlID0gMC4wMDEgLyBwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF07CisgIHZhciBnbHlwaHNXaWR0aHMgPSBwcm9wZXJ0aWVzLndpZHRoczsKKworICBmb3IgKHZhciBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKKyAgICBnbHlwaHNXaWR0aHNbZ2x5cGhdICo9IHNjYWxlOworICB9CisKKyAgcHJvcGVydGllcy5kZWZhdWx0V2lkdGggKj0gc2NhbGU7Cit9CisKK2Z1bmN0aW9uIGFkanVzdFRvVW5pY29kZShwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcpIHsKKyAgaWYgKHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZykgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChidWlsdEluRW5jb2RpbmcgPT09IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHByb3BlcnRpZXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgdG9Vbmljb2RlID0gW10sCisgICAgICBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKworICBmb3IgKHZhciBjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKKyAgICB2YXIgZ2x5cGhOYW1lID0gYnVpbHRJbkVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICB2YXIgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CisKKyAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKKyAgICAgIHRvVW5pY29kZVtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOworICAgIH0KKyAgfQorCisgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7Cit9CisKK2Z1bmN0aW9uIGdldEZvbnRUeXBlKHR5cGUsIHN1YnR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAiVHlwZTEiOgorICAgICAgcmV0dXJuIHN1YnR5cGUgPT09ICJUeXBlMUMiID8gX3V0aWwuRm9udFR5cGUuVFlQRTFDIDogX3V0aWwuRm9udFR5cGUuVFlQRTE7CisKKyAgICBjYXNlICJDSURGb250VHlwZTAiOgorICAgICAgcmV0dXJuIHN1YnR5cGUgPT09ICJDSURGb250VHlwZTBDIiA/IF91dGlsLkZvbnRUeXBlLkNJREZPTlRUWVBFMEMgOiBfdXRpbC5Gb250VHlwZS5DSURGT05UVFlQRTA7CisKKyAgICBjYXNlICJPcGVuVHlwZSI6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuT1BFTlRZUEU7CisKKyAgICBjYXNlICJUcnVlVHlwZSI6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuVFJVRVRZUEU7CisKKyAgICBjYXNlICJDSURGb250VHlwZTIiOgorICAgICAgcmV0dXJuIF91dGlsLkZvbnRUeXBlLkNJREZPTlRUWVBFMjsKKworICAgIGNhc2UgIk1NVHlwZTEiOgorICAgICAgcmV0dXJuIF91dGlsLkZvbnRUeXBlLk1NVFlQRTE7CisKKyAgICBjYXNlICJUeXBlMCI6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuVFlQRTA7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIF91dGlsLkZvbnRUeXBlLlVOS05PV047CisgIH0KK30KKworZnVuY3Rpb24gcmVjb3ZlckdseXBoTmFtZShuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CisgIGlmIChnbHlwaHNVbmljb2RlTWFwW25hbWVdICE9PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIHZhciB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkobmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CisKKyAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CisgICAgZm9yICh2YXIga2V5IGluIGdseXBoc1VuaWNvZGVNYXApIHsKKyAgICAgIGlmIChnbHlwaHNVbmljb2RlTWFwW2tleV0gPT09IHVuaWNvZGUpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAoMCwgX3V0aWwuaW5mbykoIlVuYWJsZSB0byByZWNvdmVyIGEgc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3I6ICIgKyBuYW1lKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3ZhciBHbHlwaCA9IGZ1bmN0aW9uIEdseXBoQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gR2x5cGgoZm9udENoYXIsIHVuaWNvZGUsIGFjY2VudCwgd2lkdGgsIHZtZXRyaWMsIG9wZXJhdG9yTGlzdElkLCBpc1NwYWNlLCBpc0luRm9udCkgeworICAgIHRoaXMuZm9udENoYXIgPSBmb250Q2hhcjsKKyAgICB0aGlzLnVuaWNvZGUgPSB1bmljb2RlOworICAgIHRoaXMuYWNjZW50ID0gYWNjZW50OworICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKyAgICB0aGlzLnZtZXRyaWMgPSB2bWV0cmljOworICAgIHRoaXMub3BlcmF0b3JMaXN0SWQgPSBvcGVyYXRvckxpc3RJZDsKKyAgICB0aGlzLmlzU3BhY2UgPSBpc1NwYWNlOworICAgIHRoaXMuaXNJbkZvbnQgPSBpc0luRm9udDsKKyAgfQorCisgIEdseXBoLnByb3RvdHlwZS5tYXRjaGVzRm9yQ2FjaGUgPSBmdW5jdGlvbiAoZm9udENoYXIsIHVuaWNvZGUsIGFjY2VudCwgd2lkdGgsIHZtZXRyaWMsIG9wZXJhdG9yTGlzdElkLCBpc1NwYWNlLCBpc0luRm9udCkgeworICAgIHJldHVybiB0aGlzLmZvbnRDaGFyID09PSBmb250Q2hhciAmJiB0aGlzLnVuaWNvZGUgPT09IHVuaWNvZGUgJiYgdGhpcy5hY2NlbnQgPT09IGFjY2VudCAmJiB0aGlzLndpZHRoID09PSB3aWR0aCAmJiB0aGlzLnZtZXRyaWMgPT09IHZtZXRyaWMgJiYgdGhpcy5vcGVyYXRvckxpc3RJZCA9PT0gb3BlcmF0b3JMaXN0SWQgJiYgdGhpcy5pc1NwYWNlID09PSBpc1NwYWNlICYmIHRoaXMuaXNJbkZvbnQgPT09IGlzSW5Gb250OworICB9OworCisgIHJldHVybiBHbHlwaDsKK30oKTsKKwordmFyIFRvVW5pY29kZU1hcCA9IGZ1bmN0aW9uIFRvVW5pY29kZU1hcENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFRvVW5pY29kZU1hcChjbWFwID0gW10pIHsKKyAgICB0aGlzLl9tYXAgPSBjbWFwOworICB9CisKKyAgVG9Vbmljb2RlTWFwLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgbGVuZ3RoKCkgeworICAgICAgcmV0dXJuIHRoaXMuX21hcC5sZW5ndGg7CisgICAgfSwKKworICAgIGZvckVhY2goY2FsbGJhY2spIHsKKyAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIHRoaXMuX21hcCkgeworICAgICAgICBjYWxsYmFjayhjaGFyQ29kZSwgdGhpcy5fbWFwW2NoYXJDb2RlXS5jaGFyQ29kZUF0KDApKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgaGFzKGkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBbaV0gIT09IHVuZGVmaW5lZDsKKyAgICB9LAorCisgICAgZ2V0KGkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBbaV07CisgICAgfSwKKworICAgIGNoYXJDb2RlT2YodmFsdWUpIHsKKyAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKKworICAgICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkgeworICAgICAgICByZXR1cm4gbWFwLmluZGV4T2YodmFsdWUpOworICAgICAgfQorCisgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgeworICAgICAgICBpZiAobWFwW2NoYXJDb2RlXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAtMTsKKyAgICB9LAorCisgICAgYW1lbmQobWFwKSB7CisgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBtYXApIHsKKyAgICAgICAgdGhpcy5fbWFwW2NoYXJDb2RlXSA9IG1hcFtjaGFyQ29kZV07CisgICAgICB9CisgICAgfQorCisgIH07CisgIHJldHVybiBUb1VuaWNvZGVNYXA7Cit9KCk7CisKK2V4cG9ydHMuVG9Vbmljb2RlTWFwID0gVG9Vbmljb2RlTWFwOworCit2YXIgSWRlbnRpdHlUb1VuaWNvZGVNYXAgPSBmdW5jdGlvbiBJZGVudGl0eVRvVW5pY29kZU1hcENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIElkZW50aXR5VG9Vbmljb2RlTWFwKGZpcnN0Q2hhciwgbGFzdENoYXIpIHsKKyAgICB0aGlzLmZpcnN0Q2hhciA9IGZpcnN0Q2hhcjsKKyAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7CisgIH0KKworICBJZGVudGl0eVRvVW5pY29kZU1hcC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGxlbmd0aCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmxhc3RDaGFyICsgMSAtIHRoaXMuZmlyc3RDaGFyOworICAgIH0sCisKKyAgICBmb3JFYWNoKGNhbGxiYWNrKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy5maXJzdENoYXIsIGlpID0gdGhpcy5sYXN0Q2hhcjsgaSA8PSBpaTsgaSsrKSB7CisgICAgICAgIGNhbGxiYWNrKGksIGkpOworICAgICAgfQorICAgIH0sCisKKyAgICBoYXMoaSkgeworICAgICAgcmV0dXJuIHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyOworICAgIH0sCisKKyAgICBnZXQoaSkgeworICAgICAgaWYgKHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0sCisKKyAgICBjaGFyQ29kZU9mKHYpIHsKKyAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHYpICYmIHYgPj0gdGhpcy5maXJzdENoYXIgJiYgdiA8PSB0aGlzLmxhc3RDaGFyID8gdiA6IC0xOworICAgIH0sCisKKyAgICBhbWVuZChtYXApIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpIik7CisgICAgfQorCisgIH07CisgIHJldHVybiBJZGVudGl0eVRvVW5pY29kZU1hcDsKK30oKTsKKworZXhwb3J0cy5JZGVudGl0eVRvVW5pY29kZU1hcCA9IElkZW50aXR5VG9Vbmljb2RlTWFwOworCit2YXIgT3BlblR5cGVGaWxlQnVpbGRlciA9IGZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiB3cml0ZUludDE2KGRlc3QsIG9mZnNldCwgbnVtKSB7CisgICAgZGVzdFtvZmZzZXRdID0gbnVtID4+IDggJiAweGZmOworICAgIGRlc3Rbb2Zmc2V0ICsgMV0gPSBudW0gJiAweGZmOworICB9CisKKyAgZnVuY3Rpb24gd3JpdGVJbnQzMihkZXN0LCBvZmZzZXQsIG51bSkgeworICAgIGRlc3Rbb2Zmc2V0XSA9IG51bSA+PiAyNCAmIDB4ZmY7CisgICAgZGVzdFtvZmZzZXQgKyAxXSA9IG51bSA+PiAxNiAmIDB4ZmY7CisgICAgZGVzdFtvZmZzZXQgKyAyXSA9IG51bSA+PiA4ICYgMHhmZjsKKyAgICBkZXN0W29mZnNldCArIDNdID0gbnVtICYgMHhmZjsKKyAgfQorCisgIGZ1bmN0aW9uIHdyaXRlRGF0YShkZXN0LCBvZmZzZXQsIGRhdGEpIHsKKyAgICB2YXIgaSwgaWk7CisKKyAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKKyAgICAgIGRlc3Quc2V0KGRhdGEsIG9mZnNldCk7CisgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGRlc3Rbb2Zmc2V0KytdID0gZGF0YS5jaGFyQ29kZUF0KGkpICYgMHhmZjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMCwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgZGVzdFtvZmZzZXQrK10gPSBkYXRhW2ldICYgMHhmZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBPcGVuVHlwZUZpbGVCdWlsZGVyKHNmbnQpIHsKKyAgICB0aGlzLnNmbnQgPSBzZm50OworICAgIHRoaXMudGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfQorCisgIE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl9nZXRTZWFyY2hQYXJhbXMoZW50cmllc0NvdW50LCBlbnRyeVNpemUpIHsKKyAgICB2YXIgbWF4UG93ZXIyID0gMSwKKyAgICAgICAgbG9nMiA9IDA7CisKKyAgICB3aGlsZSAoKG1heFBvd2VyMiBeIGVudHJpZXNDb3VudCkgPiBtYXhQb3dlcjIpIHsKKyAgICAgIG1heFBvd2VyMiA8PD0gMTsKKyAgICAgIGxvZzIrKzsKKyAgICB9CisKKyAgICB2YXIgc2VhcmNoUmFuZ2UgPSBtYXhQb3dlcjIgKiBlbnRyeVNpemU7CisgICAgcmV0dXJuIHsKKyAgICAgIHJhbmdlOiBzZWFyY2hSYW5nZSwKKyAgICAgIGVudHJ5OiBsb2cyLAorICAgICAgcmFuZ2VTaGlmdDogZW50cnlTaXplICogZW50cmllc0NvdW50IC0gc2VhcmNoUmFuZ2UKKyAgICB9OworICB9OworCisgIHZhciBPVEZfSEVBREVSX1NJWkUgPSAxMjsKKyAgdmFyIE9URl9UQUJMRV9FTlRSWV9TSVpFID0gMTY7CisgIE9wZW5UeXBlRmlsZUJ1aWxkZXIucHJvdG90eXBlID0geworICAgIHRvQXJyYXk6IGZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJfdG9BcnJheSgpIHsKKyAgICAgIHZhciBzZm50ID0gdGhpcy5zZm50OworICAgICAgdmFyIHRhYmxlcyA9IHRoaXMudGFibGVzOworICAgICAgdmFyIHRhYmxlc05hbWVzID0gT2JqZWN0LmtleXModGFibGVzKTsKKyAgICAgIHRhYmxlc05hbWVzLnNvcnQoKTsKKyAgICAgIHZhciBudW1UYWJsZXMgPSB0YWJsZXNOYW1lcy5sZW5ndGg7CisgICAgICB2YXIgaSwgaiwgamosIHRhYmxlLCB0YWJsZU5hbWU7CisgICAgICB2YXIgb2Zmc2V0ID0gT1RGX0hFQURFUl9TSVpFICsgbnVtVGFibGVzICogT1RGX1RBQkxFX0VOVFJZX1NJWkU7CisgICAgICB2YXIgdGFibGVPZmZzZXRzID0gW29mZnNldF07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgeworICAgICAgICB0YWJsZSA9IHRhYmxlc1t0YWJsZXNOYW1lc1tpXV07CisgICAgICAgIHZhciBwYWRkZWRMZW5ndGggPSAodGFibGUubGVuZ3RoICsgMyAmIH4zKSA+Pj4gMDsKKyAgICAgICAgb2Zmc2V0ICs9IHBhZGRlZExlbmd0aDsKKyAgICAgICAgdGFibGVPZmZzZXRzLnB1c2gob2Zmc2V0KTsKKyAgICAgIH0KKworICAgICAgdmFyIGZpbGUgPSBuZXcgVWludDhBcnJheShvZmZzZXQpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgdGFibGUgPSB0YWJsZXNbdGFibGVzTmFtZXNbaV1dOworICAgICAgICB3cml0ZURhdGEoZmlsZSwgdGFibGVPZmZzZXRzW2ldLCB0YWJsZSk7CisgICAgICB9CisKKyAgICAgIGlmIChzZm50ID09PSAidHJ1ZSIpIHsKKyAgICAgICAgc2ZudCA9ICgwLCBfdXRpbC5zdHJpbmczMikoMHgwMDAxMDAwMCk7CisgICAgICB9CisKKyAgICAgIGZpbGVbMF0gPSBzZm50LmNoYXJDb2RlQXQoMCkgJiAweGZmOworICAgICAgZmlsZVsxXSA9IHNmbnQuY2hhckNvZGVBdCgxKSAmIDB4ZmY7CisgICAgICBmaWxlWzJdID0gc2ZudC5jaGFyQ29kZUF0KDIpICYgMHhmZjsKKyAgICAgIGZpbGVbM10gPSBzZm50LmNoYXJDb2RlQXQoMykgJiAweGZmOworICAgICAgd3JpdGVJbnQxNihmaWxlLCA0LCBudW1UYWJsZXMpOworICAgICAgdmFyIHNlYXJjaFBhcmFtcyA9IE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKG51bVRhYmxlcywgMTYpOworICAgICAgd3JpdGVJbnQxNihmaWxlLCA2LCBzZWFyY2hQYXJhbXMucmFuZ2UpOworICAgICAgd3JpdGVJbnQxNihmaWxlLCA4LCBzZWFyY2hQYXJhbXMuZW50cnkpOworICAgICAgd3JpdGVJbnQxNihmaWxlLCAxMCwgc2VhcmNoUGFyYW1zLnJhbmdlU2hpZnQpOworICAgICAgb2Zmc2V0ID0gT1RGX0hFQURFUl9TSVpFOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgdGFibGVOYW1lID0gdGFibGVzTmFtZXNbaV07CisgICAgICAgIGZpbGVbb2Zmc2V0XSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDApICYgMHhmZjsKKyAgICAgICAgZmlsZVtvZmZzZXQgKyAxXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDEpICYgMHhmZjsKKyAgICAgICAgZmlsZVtvZmZzZXQgKyAyXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDIpICYgMHhmZjsKKyAgICAgICAgZmlsZVtvZmZzZXQgKyAzXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDMpICYgMHhmZjsKKyAgICAgICAgdmFyIGNoZWNrc3VtID0gMDsKKworICAgICAgICBmb3IgKGogPSB0YWJsZU9mZnNldHNbaV0sIGpqID0gdGFibGVPZmZzZXRzW2kgKyAxXTsgaiA8IGpqOyBqICs9IDQpIHsKKyAgICAgICAgICB2YXIgcXVhZCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShmaWxlLCBqKTsKKyAgICAgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtICsgcXVhZCA+Pj4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgNCwgY2hlY2tzdW0pOworICAgICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDgsIHRhYmxlT2Zmc2V0c1tpXSk7CisgICAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgMTIsIHRhYmxlc1t0YWJsZU5hbWVdLmxlbmd0aCk7CisgICAgICAgIG9mZnNldCArPSBPVEZfVEFCTEVfRU5UUllfU0laRTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZpbGU7CisgICAgfSwKKyAgICBhZGRUYWJsZTogZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl9hZGRUYWJsZSh0YWcsIGRhdGEpIHsKKyAgICAgIGlmICh0YWcgaW4gdGhpcy50YWJsZXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYWJsZSAiICsgdGFnICsgIiBhbHJlYWR5IGV4aXN0cyIpOworICAgICAgfQorCisgICAgICB0aGlzLnRhYmxlc1t0YWddID0gZGF0YTsKKyAgICB9CisgIH07CisgIHJldHVybiBPcGVuVHlwZUZpbGVCdWlsZGVyOworfSgpOworCit2YXIgRm9udCA9IGZ1bmN0aW9uIEZvbnRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpIHsKKyAgICB2YXIgY2hhckNvZGU7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB0aGlzLmxvYWRlZE5hbWUgPSBwcm9wZXJ0aWVzLmxvYWRlZE5hbWU7CisgICAgdGhpcy5pc1R5cGUzRm9udCA9IHByb3BlcnRpZXMuaXNUeXBlM0ZvbnQ7CisgICAgdGhpcy5taXNzaW5nRmlsZSA9IGZhbHNlOworICAgIHRoaXMuZ2x5cGhDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy5pc1NlcmlmRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBGb250RmxhZ3MuU2VyaWYpOworICAgIHRoaXMuaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlN5bWJvbGljKTsKKyAgICB0aGlzLmlzTW9ub3NwYWNlID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5GaXhlZFBpdGNoKTsKKyAgICB2YXIgdHlwZSA9IHByb3BlcnRpZXMudHlwZTsKKyAgICB2YXIgc3VidHlwZSA9IHByb3BlcnRpZXMuc3VidHlwZTsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CisgICAgbGV0IGZhbGxiYWNrTmFtZSA9ICJzYW5zLXNlcmlmIjsKKworICAgIGlmICh0aGlzLmlzTW9ub3NwYWNlKSB7CisgICAgICBmYWxsYmFja05hbWUgPSAibW9ub3NwYWNlIjsKKyAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZXJpZkZvbnQpIHsKKyAgICAgIGZhbGxiYWNrTmFtZSA9ICJzZXJpZiI7CisgICAgfQorCisgICAgdGhpcy5mYWxsYmFja05hbWUgPSBmYWxsYmFja05hbWU7CisgICAgdGhpcy5kaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CisgICAgdGhpcy53aWR0aHMgPSBwcm9wZXJ0aWVzLndpZHRoczsKKyAgICB0aGlzLmRlZmF1bHRXaWR0aCA9IHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoOworICAgIHRoaXMuY29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGU7CisgICAgdGhpcy5jTWFwID0gcHJvcGVydGllcy5jTWFwOworICAgIHRoaXMuYXNjZW50ID0gcHJvcGVydGllcy5hc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CisgICAgdGhpcy5kZXNjZW50ID0gcHJvcGVydGllcy5kZXNjZW50IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOworICAgIHRoaXMuZm9udE1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeDsKKyAgICB0aGlzLmJib3ggPSBwcm9wZXJ0aWVzLmJib3g7CisgICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKKyAgICB0aGlzLnRvVW5pY29kZSA9IHByb3BlcnRpZXMudG9Vbmljb2RlOworICAgIHRoaXMuZmFsbGJhY2tUb1VuaWNvZGUgPSBwcm9wZXJ0aWVzLmZhbGxiYWNrVG9Vbmljb2RlIHx8IG5ldyBUb1VuaWNvZGVNYXAoKTsKKyAgICB0aGlzLnRvRm9udENoYXIgPSBbXTsKKworICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09ICJUeXBlMyIpIHsKKyAgICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgeworICAgICAgICB0aGlzLnRvRm9udENoYXJbY2hhckNvZGVdID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gfHwgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmdbY2hhckNvZGVdOworICAgICAgfQorCisgICAgICB0aGlzLmZvbnRUeXBlID0gX3V0aWwuRm9udFR5cGUuVFlQRTM7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5jaWRFbmNvZGluZyA9IHByb3BlcnRpZXMuY2lkRW5jb2Rpbmc7CisgICAgdGhpcy52ZXJ0aWNhbCA9ICEhcHJvcGVydGllcy52ZXJ0aWNhbDsKKworICAgIGlmICh0aGlzLnZlcnRpY2FsKSB7CisgICAgICB0aGlzLnZtZXRyaWNzID0gcHJvcGVydGllcy52bWV0cmljczsKKyAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7CisgICAgfQorCisgICAgaWYgKCFmaWxlIHx8IGZpbGUuaXNFbXB0eSkgeworICAgICAgaWYgKGZpbGUpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCdGb250IGZpbGUgaXMgZW1wdHkgaW4gIicgKyBuYW1lICsgJyIgKCcgKyB0aGlzLmxvYWRlZE5hbWUgKyAiKSIpOworICAgICAgfQorCisgICAgICB0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgW3R5cGUsIHN1YnR5cGVdID0gZ2V0Rm9udEZpbGVUeXBlKGZpbGUsIHByb3BlcnRpZXMpOworCisgICAgaWYgKHR5cGUgIT09IHRoaXMudHlwZSB8fCBzdWJ0eXBlICE9PSB0aGlzLnN1YnR5cGUpIHsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW5jb25zaXN0ZW50IGZvbnQgZmlsZSBUeXBlL1N1YlR5cGUsIGV4cGVjdGVkOiAiICsgYCR7dGhpcy50eXBlfS8ke3RoaXMuc3VidHlwZX0gYnV0IGZvdW5kOiAke3R5cGV9LyR7c3VidHlwZX0uYCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHZhciBkYXRhOworCisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSAiTU1UeXBlMSI6CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJNTVR5cGUxIGZvbnQgKCIgKyBuYW1lICsgIiksIGZhbGxpbmcgYmFjayB0byBUeXBlMS4iKTsKKworICAgICAgICBjYXNlICJUeXBlMSI6CisgICAgICAgIGNhc2UgIkNJREZvbnRUeXBlMCI6CisgICAgICAgICAgdGhpcy5taW1ldHlwZSA9ICJmb250L29wZW50eXBlIjsKKyAgICAgICAgICB2YXIgY2ZmID0gc3VidHlwZSA9PT0gIlR5cGUxQyIgfHwgc3VidHlwZSA9PT0gIkNJREZvbnRUeXBlMEMiID8gbmV3IENGRkZvbnQoZmlsZSwgcHJvcGVydGllcykgOiBuZXcgVHlwZTFGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpOworICAgICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKKyAgICAgICAgICBkYXRhID0gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiT3BlblR5cGUiOgorICAgICAgICBjYXNlICJUcnVlVHlwZSI6CisgICAgICAgIGNhc2UgIkNJREZvbnRUeXBlMiI6CisgICAgICAgICAgdGhpcy5taW1ldHlwZSA9ICJmb250L29wZW50eXBlIjsKKyAgICAgICAgICBkYXRhID0gdGhpcy5jaGVja0FuZFJlcGFpcihuYW1lLCBmaWxlLCBwcm9wZXJ0aWVzKTsKKworICAgICAgICAgIGlmICh0aGlzLmlzT3BlblR5cGUpIHsKKyAgICAgICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIHR5cGUgPSAiT3BlblR5cGUiOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBGb250ICR7dHlwZX0gaXMgbm90IHN1cHBvcnRlZGApOworICAgICAgfQorICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKShlKTsKKyAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIHRoaXMuZm9udFR5cGUgPSBnZXRGb250VHlwZSh0eXBlLCBzdWJ0eXBlKTsKKyAgICB0aGlzLmZvbnRNYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXg7CisgICAgdGhpcy53aWR0aHMgPSBwcm9wZXJ0aWVzLndpZHRoczsKKyAgICB0aGlzLmRlZmF1bHRXaWR0aCA9IHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoOworICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CisgICAgdGhpcy5zZWFjTWFwID0gcHJvcGVydGllcy5zZWFjTWFwOworICB9CisKKyAgZnVuY3Rpb24gaW50MTYoYjAsIGIxKSB7CisgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxOworICB9CisKKyAgZnVuY3Rpb24gd3JpdGVTaWduZWRJbnQxNihieXRlcywgaW5kZXgsIHZhbHVlKSB7CisgICAgYnl0ZXNbaW5kZXggKyAxXSA9IHZhbHVlOworICAgIGJ5dGVzW2luZGV4XSA9IHZhbHVlID4+PiA4OworICB9CisKKyAgZnVuY3Rpb24gc2lnbmVkSW50MTYoYjAsIGIxKSB7CisgICAgdmFyIHZhbHVlID0gKGIwIDw8IDgpICsgYjE7CisgICAgcmV0dXJuIHZhbHVlICYgMSA8PCAxNSA/IHZhbHVlIC0gMHgxMDAwMCA6IHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gaW50MzIoYjAsIGIxLCBiMiwgYjMpIHsKKyAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKKyAgfQorCisgIGZ1bmN0aW9uIHN0cmluZzE2KHZhbHVlKSB7CisgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CisgIH0KKworICBmdW5jdGlvbiBzYWZlU3RyaW5nMTYodmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPiAweDdmZmYpIHsKKyAgICAgIHZhbHVlID0gMHg3ZmZmOworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAtMHg4MDAwKSB7CisgICAgICB2YWx1ZSA9IC0weDgwMDA7CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CisgIH0KKworICBmdW5jdGlvbiBpc1RydWVUeXBlRmlsZShmaWxlKSB7CisgICAgdmFyIGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOworICAgIHJldHVybiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoaGVhZGVyLCAwKSA9PT0gMHgwMDAxMDAwMCB8fCAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoaGVhZGVyKSA9PT0gInRydWUiOworICB9CisKKyAgZnVuY3Rpb24gaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpIHsKKyAgICBjb25zdCBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyg0KTsKKyAgICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGhlYWRlcikgPT09ICJ0dGNmIjsKKyAgfQorCisgIGZ1bmN0aW9uIGlzT3BlblR5cGVGaWxlKGZpbGUpIHsKKyAgICB2YXIgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CisgICAgcmV0dXJuICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShoZWFkZXIpID09PSAiT1RUTyI7CisgIH0KKworICBmdW5jdGlvbiBpc1R5cGUxRmlsZShmaWxlKSB7CisgICAgdmFyIGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDIpOworCisgICAgaWYgKGhlYWRlclswXSA9PT0gMHgyNSAmJiBoZWFkZXJbMV0gPT09IDB4MjEpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChoZWFkZXJbMF0gPT09IDB4ODAgJiYgaGVhZGVyWzFdID09PSAweDAxKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmdW5jdGlvbiBpc0NGRkZpbGUoZmlsZSkgeworICAgIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOworCisgICAgaWYgKGhlYWRlclswXSA+PSAxICYmIGhlYWRlclszXSA+PSAxICYmIGhlYWRlclszXSA8PSA0KSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmdW5jdGlvbiBnZXRGb250RmlsZVR5cGUoZmlsZSwgeworICAgIHR5cGUsCisgICAgc3VidHlwZSwKKyAgICBjb21wb3NpdGUKKyAgfSkgeworICAgIGxldCBmaWxlVHlwZSwgZmlsZVN1YnR5cGU7CisKKyAgICBpZiAoaXNUcnVlVHlwZUZpbGUoZmlsZSkgfHwgaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpKSB7CisgICAgICBpZiAoY29tcG9zaXRlKSB7CisgICAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWxlVHlwZSA9ICJUcnVlVHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpc09wZW5UeXBlRmlsZShmaWxlKSkgeworICAgICAgaWYgKGNvbXBvc2l0ZSkgeworICAgICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsZVR5cGUgPSAiT3BlblR5cGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNUeXBlMUZpbGUoZmlsZSkpIHsKKyAgICAgIGlmIChjb21wb3NpdGUpIHsKKyAgICAgICAgZmlsZVR5cGUgPSAiQ0lERm9udFR5cGUwIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGVUeXBlID0gdHlwZSA9PT0gIk1NVHlwZTEiID8gIk1NVHlwZTEiIDogIlR5cGUxIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzQ0ZGRmlsZShmaWxlKSkgeworICAgICAgaWYgKGNvbXBvc2l0ZSkgeworICAgICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTAiOworICAgICAgICBmaWxlU3VidHlwZSA9ICJDSURGb250VHlwZTBDIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGVUeXBlID0gdHlwZSA9PT0gIk1NVHlwZTEiID8gIk1NVHlwZTEiIDogIlR5cGUxIjsKKyAgICAgICAgZmlsZVN1YnR5cGUgPSAiVHlwZTFDIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLiIpOworICAgICAgZmlsZVR5cGUgPSB0eXBlOworICAgICAgZmlsZVN1YnR5cGUgPSBzdWJ0eXBlOworICAgIH0KKworICAgIHJldHVybiBbZmlsZVR5cGUsIGZpbGVTdWJ0eXBlXTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkVG9Gb250Q2hhcihlbmNvZGluZywgZ2x5cGhzVW5pY29kZU1hcCwgZGlmZmVyZW5jZXMpIHsKKyAgICB2YXIgdG9Gb250Q2hhciA9IFtdLAorICAgICAgICB1bmljb2RlOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZW5jb2RpbmcubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKGVuY29kaW5nW2ldLCBnbHlwaHNVbmljb2RlTWFwKTsKKworICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CisgICAgICAgIHRvRm9udENoYXJbaV0gPSB1bmljb2RlOworICAgICAgfQorICAgIH0KKworICAgIGZvciAodmFyIGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzKSB7CisgICAgICB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkoZGlmZmVyZW5jZXNbY2hhckNvZGVdLCBnbHlwaHNVbmljb2RlTWFwKTsKKworICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CisgICAgICAgIHRvRm9udENoYXJbK2NoYXJDb2RlXSA9IHVuaWNvZGU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRvRm9udENoYXI7CisgIH0KKworICBmdW5jdGlvbiBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgbmV3R2x5cGhaZXJvSWQpIHsKKyAgICB2YXIgbmV3TWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB2YXIgdG9Gb250Q2hhciA9IFtdOworICAgIHZhciBwcml2YXRlVXNlQXJlYUluZGV4ID0gMDsKKyAgICB2YXIgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzBdOworICAgIHZhciBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKKworICAgIGZvciAodmFyIG9yaWdpbmFsQ2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKKyAgICAgIG9yaWdpbmFsQ2hhckNvZGUgfD0gMDsKKyAgICAgIHZhciBnbHlwaElkID0gY2hhckNvZGVUb0dseXBoSWRbb3JpZ2luYWxDaGFyQ29kZV07CisKKyAgICAgIGlmICghaGFzR2x5cGgoZ2x5cGhJZCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlID4gcHJpdmF0ZVVzZU9mZmV0RW5kKSB7CisgICAgICAgIHByaXZhdGVVc2VBcmVhSW5kZXgrKzsKKworICAgICAgICBpZiAocHJpdmF0ZVVzZUFyZWFJbmRleCA+PSBQUklWQVRFX1VTRV9BUkVBUy5sZW5ndGgpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlJhbiBvdXQgb2Ygc3BhY2UgaW4gZm9udCBwcml2YXRlIHVzZSBhcmVhLiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzBdOworICAgICAgICBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnRDaGFyQ29kZSA9IG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrKzsKKworICAgICAgaWYgKGdseXBoSWQgPT09IDApIHsKKyAgICAgICAgZ2x5cGhJZCA9IG5ld0dseXBoWmVyb0lkOworICAgICAgfQorCisgICAgICBuZXdNYXBbZm9udENoYXJDb2RlXSA9IGdseXBoSWQ7CisgICAgICB0b0ZvbnRDaGFyW29yaWdpbmFsQ2hhckNvZGVdID0gZm9udENoYXJDb2RlOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICB0b0ZvbnRDaGFyLAorICAgICAgY2hhckNvZGVUb0dseXBoSWQ6IG5ld01hcCwKKyAgICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0UmFuZ2VzKGdseXBocywgbnVtR2x5cGhzKSB7CisgICAgdmFyIGNvZGVzID0gW107CisKKyAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBnbHlwaHMpIHsKKyAgICAgIGlmIChnbHlwaHNbY2hhckNvZGVdID49IG51bUdseXBocykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgY29kZXMucHVzaCh7CisgICAgICAgIGZvbnRDaGFyQ29kZTogY2hhckNvZGUgfCAwLAorICAgICAgICBnbHlwaElkOiBnbHlwaHNbY2hhckNvZGVdCisgICAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoY29kZXMubGVuZ3RoID09PSAwKSB7CisgICAgICBjb2Rlcy5wdXNoKHsKKyAgICAgICAgZm9udENoYXJDb2RlOiAwLAorICAgICAgICBnbHlwaElkOiAwCisgICAgICB9KTsKKyAgICB9CisKKyAgICBjb2Rlcy5zb3J0KGZ1bmN0aW9uIGZvbnRHZXRSYW5nZXNTb3J0KGEsIGIpIHsKKyAgICAgIHJldHVybiBhLmZvbnRDaGFyQ29kZSAtIGIuZm9udENoYXJDb2RlOworICAgIH0pOworICAgIHZhciByYW5nZXMgPSBbXTsKKyAgICB2YXIgbGVuZ3RoID0gY29kZXMubGVuZ3RoOworCisgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBsZW5ndGg7KSB7CisgICAgICB2YXIgc3RhcnQgPSBjb2Rlc1tuXS5mb250Q2hhckNvZGU7CisgICAgICB2YXIgY29kZUluZGljZXMgPSBbY29kZXNbbl0uZ2x5cGhJZF07CisgICAgICArK247CisgICAgICB2YXIgZW5kID0gc3RhcnQ7CisKKyAgICAgIHdoaWxlIChuIDwgbGVuZ3RoICYmIGVuZCArIDEgPT09IGNvZGVzW25dLmZvbnRDaGFyQ29kZSkgeworICAgICAgICBjb2RlSW5kaWNlcy5wdXNoKGNvZGVzW25dLmdseXBoSWQpOworICAgICAgICArK2VuZDsKKyAgICAgICAgKytuOworCisgICAgICAgIGlmIChlbmQgPT09IDB4ZmZmZikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJhbmdlcy5wdXNoKFtzdGFydCwgZW5kLCBjb2RlSW5kaWNlc10pOworICAgIH0KKworICAgIHJldHVybiByYW5nZXM7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVDbWFwVGFibGUoZ2x5cGhzLCBudW1HbHlwaHMpIHsKKyAgICB2YXIgcmFuZ2VzID0gZ2V0UmFuZ2VzKGdseXBocywgbnVtR2x5cGhzKTsKKyAgICB2YXIgbnVtVGFibGVzID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXVsxXSA+IDB4ZmZmZiA/IDIgOiAxOworICAgIHZhciBjbWFwID0gIlx4MDBceDAwIiArIHN0cmluZzE2KG51bVRhYmxlcykgKyAiXHgwMFx4MDMiICsgIlx4MDBceDAxIiArICgwLCBfdXRpbC5zdHJpbmczMikoNCArIG51bVRhYmxlcyAqIDgpOworICAgIHZhciBpLCBpaSwgaiwgamo7CisKKyAgICBmb3IgKGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgIGlmIChyYW5nZXNbaV1bMF0gPD0gMHhmZmZmKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHZhciBibXBMZW5ndGggPSBpICsgMTsKKworICAgIGlmIChyYW5nZXNbaV1bMF0gPCAweGZmZmYgJiYgcmFuZ2VzW2ldWzFdID09PSAweGZmZmYpIHsKKyAgICAgIHJhbmdlc1tpXVsxXSA9IDB4ZmZmZTsKKyAgICB9CisKKyAgICB2YXIgdHJhaWxpbmdSYW5nZXNDb3VudCA9IHJhbmdlc1tpXVsxXSA8IDB4ZmZmZiA/IDEgOiAwOworICAgIHZhciBzZWdDb3VudCA9IGJtcExlbmd0aCArIHRyYWlsaW5nUmFuZ2VzQ291bnQ7CisgICAgdmFyIHNlYXJjaFBhcmFtcyA9IE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKHNlZ0NvdW50LCAyKTsKKyAgICB2YXIgc3RhcnRDb3VudCA9ICIiOworICAgIHZhciBlbmRDb3VudCA9ICIiOworICAgIHZhciBpZERlbHRhcyA9ICIiOworICAgIHZhciBpZFJhbmdlT2Zmc2V0cyA9ICIiOworICAgIHZhciBnbHlwaHNJZHMgPSAiIjsKKyAgICB2YXIgYmlhcyA9IDA7CisgICAgdmFyIHJhbmdlLCBzdGFydCwgZW5kLCBjb2RlczsKKworICAgIGZvciAoaSA9IDAsIGlpID0gYm1wTGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgcmFuZ2UgPSByYW5nZXNbaV07CisgICAgICBzdGFydCA9IHJhbmdlWzBdOworICAgICAgZW5kID0gcmFuZ2VbMV07CisgICAgICBzdGFydENvdW50ICs9IHN0cmluZzE2KHN0YXJ0KTsKKyAgICAgIGVuZENvdW50ICs9IHN0cmluZzE2KGVuZCk7CisgICAgICBjb2RlcyA9IHJhbmdlWzJdOworICAgICAgdmFyIGNvbnRpZ3VvdXMgPSB0cnVlOworCisgICAgICBmb3IgKGogPSAxLCBqaiA9IGNvZGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKKyAgICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CisgICAgICAgICAgY29udGlndW91cyA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghY29udGlndW91cykgeworICAgICAgICB2YXIgb2Zmc2V0ID0gKHNlZ0NvdW50IC0gaSkgKiAyICsgYmlhcyAqIDI7CisgICAgICAgIGJpYXMgKz0gZW5kIC0gc3RhcnQgKyAxOworICAgICAgICBpZERlbHRhcyArPSBzdHJpbmcxNigwKTsKKyAgICAgICAgaWRSYW5nZU9mZnNldHMgKz0gc3RyaW5nMTYob2Zmc2V0KTsKKworICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvZGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKKyAgICAgICAgICBnbHlwaHNJZHMgKz0gc3RyaW5nMTYoY29kZXNbal0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgc3RhcnRDb2RlID0gY29kZXNbMF07CisgICAgICAgIGlkRGVsdGFzICs9IHN0cmluZzE2KHN0YXJ0Q29kZSAtIHN0YXJ0ICYgMHhmZmZmKTsKKyAgICAgICAgaWRSYW5nZU9mZnNldHMgKz0gc3RyaW5nMTYoMCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyYWlsaW5nUmFuZ2VzQ291bnQgPiAwKSB7CisgICAgICBlbmRDb3VudCArPSAiXHhGRlx4RkYiOworICAgICAgc3RhcnRDb3VudCArPSAiXHhGRlx4RkYiOworICAgICAgaWREZWx0YXMgKz0gIlx4MDBceDAxIjsKKyAgICAgIGlkUmFuZ2VPZmZzZXRzICs9ICJceDAwXHgwMCI7CisgICAgfQorCisgICAgdmFyIGZvcm1hdDMxNCA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNigyICogc2VnQ291bnQpICsgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLnJhbmdlKSArIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5lbnRyeSkgKyBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2VTaGlmdCkgKyBlbmRDb3VudCArICJceDAwXHgwMCIgKyBzdGFydENvdW50ICsgaWREZWx0YXMgKyBpZFJhbmdlT2Zmc2V0cyArIGdseXBoc0lkczsKKyAgICB2YXIgZm9ybWF0MzEwMTIgPSAiIjsKKyAgICB2YXIgaGVhZGVyMzEwMTIgPSAiIjsKKworICAgIGlmIChudW1UYWJsZXMgPiAxKSB7CisgICAgICBjbWFwICs9ICJceDAwXHgwMyIgKyAiXHgwMFx4MEEiICsgKDAsIF91dGlsLnN0cmluZzMyKSg0ICsgbnVtVGFibGVzICogOCArIDQgKyBmb3JtYXQzMTQubGVuZ3RoKTsKKyAgICAgIGZvcm1hdDMxMDEyID0gIiI7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gcmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgcmFuZ2UgPSByYW5nZXNbaV07CisgICAgICAgIHN0YXJ0ID0gcmFuZ2VbMF07CisgICAgICAgIGNvZGVzID0gcmFuZ2VbMl07CisgICAgICAgIHZhciBjb2RlID0gY29kZXNbMF07CisKKyAgICAgICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CisgICAgICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CisgICAgICAgICAgICBlbmQgPSByYW5nZVswXSArIGogLSAxOworICAgICAgICAgICAgZm9ybWF0MzEwMTIgKz0gKDAsIF91dGlsLnN0cmluZzMyKShzdGFydCkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGVuZCkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGNvZGUpOworICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOworICAgICAgICAgICAgY29kZSA9IGNvZGVzW2pdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcm1hdDMxMDEyICs9ICgwLCBfdXRpbC5zdHJpbmczMikoc3RhcnQpICsgKDAsIF91dGlsLnN0cmluZzMyKShyYW5nZVsxXSkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGNvZGUpOworICAgICAgfQorCisgICAgICBoZWFkZXIzMTAxMiA9ICJceDAwXHgwQyIgKyAiXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKShmb3JtYXQzMTAxMi5sZW5ndGggKyAxNikgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGZvcm1hdDMxMDEyLmxlbmd0aCAvIDEyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY21hcCArICJceDAwXHgwNCIgKyBzdHJpbmcxNihmb3JtYXQzMTQubGVuZ3RoICsgNCkgKyBmb3JtYXQzMTQgKyBoZWFkZXIzMTAxMiArIGZvcm1hdDMxMDEyOworICB9CisKKyAgZnVuY3Rpb24gdmFsaWRhdGVPUzJUYWJsZShvczIsIGZpbGUpIHsKKyAgICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0IHx8IDApICsgb3MyLm9mZnNldDsKKyAgICB2YXIgdmVyc2lvbiA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgZmlsZS5za2lwKDYwKTsKKyAgICB2YXIgc2VsZWN0aW9uID0gZmlsZS5nZXRVaW50MTYoKTsKKworICAgIGlmICh2ZXJzaW9uIDwgNCAmJiBzZWxlY3Rpb24gJiAweDAzMDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2YXIgZmlyc3RDaGFyID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICB2YXIgbGFzdENoYXIgPSBmaWxlLmdldFVpbnQxNigpOworCisgICAgaWYgKGZpcnN0Q2hhciA+IGxhc3RDaGFyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmlsZS5za2lwKDYpOworICAgIHZhciB1c1dpbkFzY2VudCA9IGZpbGUuZ2V0VWludDE2KCk7CisKKyAgICBpZiAodXNXaW5Bc2NlbnQgPT09IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvczIuZGF0YVs4XSA9IG9zMi5kYXRhWzldID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZU9TMlRhYmxlKHByb3BlcnRpZXMsIGNoYXJzdHJpbmdzLCBvdmVycmlkZSkgeworICAgIG92ZXJyaWRlID0gb3ZlcnJpZGUgfHwgeworICAgICAgdW5pdHNQZXJFbTogMCwKKyAgICAgIHlNYXg6IDAsCisgICAgICB5TWluOiAwLAorICAgICAgYXNjZW50OiAwLAorICAgICAgZGVzY2VudDogMAorICAgIH07CisgICAgdmFyIHVsVW5pY29kZVJhbmdlMSA9IDA7CisgICAgdmFyIHVsVW5pY29kZVJhbmdlMiA9IDA7CisgICAgdmFyIHVsVW5pY29kZVJhbmdlMyA9IDA7CisgICAgdmFyIHVsVW5pY29kZVJhbmdlNCA9IDA7CisgICAgdmFyIGZpcnN0Q2hhckluZGV4ID0gbnVsbDsKKyAgICB2YXIgbGFzdENoYXJJbmRleCA9IDA7CisKKyAgICBpZiAoY2hhcnN0cmluZ3MpIHsKKyAgICAgIGZvciAodmFyIGNvZGUgaW4gY2hhcnN0cmluZ3MpIHsKKyAgICAgICAgY29kZSB8PSAwOworCisgICAgICAgIGlmIChmaXJzdENoYXJJbmRleCA+IGNvZGUgfHwgIWZpcnN0Q2hhckluZGV4KSB7CisgICAgICAgICAgZmlyc3RDaGFySW5kZXggPSBjb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3RDaGFySW5kZXggPCBjb2RlKSB7CisgICAgICAgICAgbGFzdENoYXJJbmRleCA9IGNvZGU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcG9zaXRpb24gPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZVJhbmdlRm9yKShjb2RlKTsKKworICAgICAgICBpZiAocG9zaXRpb24gPCAzMikgeworICAgICAgICAgIHVsVW5pY29kZVJhbmdlMSB8PSAxIDw8IHBvc2l0aW9uOworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgNjQpIHsKKyAgICAgICAgICB1bFVuaWNvZGVSYW5nZTIgfD0gMSA8PCBwb3NpdGlvbiAtIDMyOworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgOTYpIHsKKyAgICAgICAgICB1bFVuaWNvZGVSYW5nZTMgfD0gMSA8PCBwb3NpdGlvbiAtIDY0OworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgMTIzKSB7CisgICAgICAgICAgdWxVbmljb2RlUmFuZ2U0IHw9IDEgPDwgcG9zaXRpb24gLSA5NjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVuaWNvZGUgcmFuZ2VzIEJpdHMgPiAxMjMgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZSIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChsYXN0Q2hhckluZGV4ID4gMHhmZmZmKSB7CisgICAgICAgIGxhc3RDaGFySW5kZXggPSAweGZmZmY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZpcnN0Q2hhckluZGV4ID0gMDsKKyAgICAgIGxhc3RDaGFySW5kZXggPSAyNTU7CisgICAgfQorCisgICAgdmFyIGJib3ggPSBwcm9wZXJ0aWVzLmJib3ggfHwgWzAsIDAsIDAsIDBdOworICAgIHZhciB1bml0c1BlckVtID0gb3ZlcnJpZGUudW5pdHNQZXJFbSB8fCAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWClbMF07CisgICAgdmFyIHNjYWxlID0gcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPyAxLjAgOiB1bml0c1BlckVtIC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOworICAgIHZhciB0eXBvQXNjZW50ID0gb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpOworICAgIHZhciB0eXBvRGVzY2VudCA9IG92ZXJyaWRlLmRlc2NlbnQgfHwgTWF0aC5yb3VuZChzY2FsZSAqIChwcm9wZXJ0aWVzLmRlc2NlbnQgfHwgYmJveFsxXSkpOworCisgICAgaWYgKHR5cG9EZXNjZW50ID4gMCAmJiBwcm9wZXJ0aWVzLmRlc2NlbnQgPiAwICYmIGJib3hbMV0gPCAwKSB7CisgICAgICB0eXBvRGVzY2VudCA9IC10eXBvRGVzY2VudDsKKyAgICB9CisKKyAgICB2YXIgd2luQXNjZW50ID0gb3ZlcnJpZGUueU1heCB8fCB0eXBvQXNjZW50OworICAgIHZhciB3aW5EZXNjZW50ID0gLW92ZXJyaWRlLnlNaW4gfHwgLXR5cG9EZXNjZW50OworICAgIHJldHVybiAiXHgwMFx4MDMiICsgIlx4MDJceDI0IiArICJceDAxXHhGNCIgKyAiXHgwMFx4MDUiICsgIlx4MDBceDAwIiArICJceDAyXHg4QSIgKyAiXHgwMlx4QkIiICsgIlx4MDBceDAwIiArICJceDAwXHg4QyIgKyAiXHgwMlx4OEEiICsgIlx4MDJceEJCIiArICJceDAwXHgwMCIgKyAiXHgwMVx4REYiICsgIlx4MDBceDMxIiArICJceDAxXHgwMiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwNiIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHByb3BlcnRpZXMuZml4ZWRQaXRjaCA/IDB4MDkgOiAweDAwKSArICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTEpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTIpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTMpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTQpICsgIlx4MkFceDMyXHgzMVx4MkEiICsgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDEgOiAwKSArIHN0cmluZzE2KGZpcnN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMuZmlyc3RDaGFyKSArIHN0cmluZzE2KGxhc3RDaGFySW5kZXggfHwgcHJvcGVydGllcy5sYXN0Q2hhcikgKyBzdHJpbmcxNih0eXBvQXNjZW50KSArIHN0cmluZzE2KHR5cG9EZXNjZW50KSArICJceDAwXHg2NCIgKyBzdHJpbmcxNih3aW5Bc2NlbnQpICsgc3RyaW5nMTYod2luRGVzY2VudCkgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyBzdHJpbmcxNihwcm9wZXJ0aWVzLnhIZWlnaHQpICsgc3RyaW5nMTYocHJvcGVydGllcy5jYXBIZWlnaHQpICsgc3RyaW5nMTYoMCkgKyBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyAiXHgwMFx4MDMiOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpIHsKKyAgICB2YXIgYW5nbGUgPSBNYXRoLmZsb29yKHByb3BlcnRpZXMuaXRhbGljQW5nbGUgKiAyICoqIDE2KTsKKyAgICByZXR1cm4gIlx4MDBceDAzXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKShhbmdsZSkgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICgwLCBfdXRpbC5zdHJpbmczMikocHJvcGVydGllcy5maXhlZFBpdGNoKSArICJceDAwXHgwMFx4MDBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIjsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykgeworICAgIGlmICghcHJvdG8pIHsKKyAgICAgIHByb3RvID0gW1tdLCBbXV07CisgICAgfQorCisgICAgdmFyIHN0cmluZ3MgPSBbcHJvdG9bMF1bMF0gfHwgIk9yaWdpbmFsIGxpY2VuY2UiLCBwcm90b1swXVsxXSB8fCBuYW1lLCBwcm90b1swXVsyXSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzNdIHx8ICJ1bmlxdWVJRCIsIHByb3RvWzBdWzRdIHx8IG5hbWUsIHByb3RvWzBdWzVdIHx8ICJWZXJzaW9uIDAuMTEiLCBwcm90b1swXVs2XSB8fCAiIiwgcHJvdG9bMF1bN10gfHwgIlVua25vd24iLCBwcm90b1swXVs4XSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzldIHx8ICJVbmtub3duIl07CisgICAgdmFyIHN0cmluZ3NVbmljb2RlID0gW107CisgICAgdmFyIGksIGlpLCBqLCBqaiwgc3RyOworCisgICAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07CisgICAgICB2YXIgc3RyQnVmVW5pY29kZSA9IFtdOworCisgICAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpOworICAgICAgfQorCisgICAgICBzdHJpbmdzVW5pY29kZS5wdXNoKHN0ckJ1ZlVuaWNvZGUuam9pbigiIikpOworICAgIH0KKworICAgIHZhciBuYW1lcyA9IFtzdHJpbmdzLCBzdHJpbmdzVW5pY29kZV07CisgICAgdmFyIHBsYXRmb3JtcyA9IFsiXHgwMFx4MDEiLCAiXHgwMFx4MDMiXTsKKyAgICB2YXIgZW5jb2RpbmdzID0gWyJceDAwXHgwMCIsICJceDAwXHgwMSJdOworICAgIHZhciBsYW5ndWFnZXMgPSBbIlx4MDBceDAwIiwgIlx4MDRceDA5Il07CisgICAgdmFyIG5hbWVzUmVjb3JkQ291bnQgPSBzdHJpbmdzLmxlbmd0aCAqIHBsYXRmb3Jtcy5sZW5ndGg7CisgICAgdmFyIG5hbWVUYWJsZSA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOworICAgIHZhciBzdHJPZmZzZXQgPSAwOworCisgICAgZm9yIChpID0gMCwgaWkgPSBwbGF0Zm9ybXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIHN0cnMgPSBuYW1lc1tpXTsKKworICAgICAgZm9yIChqID0gMCwgamogPSBzdHJzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgc3RyID0gc3Ryc1tqXTsKKyAgICAgICAgdmFyIG5hbWVSZWNvcmQgPSBwbGF0Zm9ybXNbaV0gKyBlbmNvZGluZ3NbaV0gKyBsYW5ndWFnZXNbaV0gKyBzdHJpbmcxNihqKSArIHN0cmluZzE2KHN0ci5sZW5ndGgpICsgc3RyaW5nMTYoc3RyT2Zmc2V0KTsKKyAgICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7CisgICAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIG5hbWVUYWJsZSArPSBzdHJpbmdzLmpvaW4oIiIpICsgc3RyaW5nc1VuaWNvZGUuam9pbigiIik7CisgICAgcmV0dXJuIG5hbWVUYWJsZTsKKyAgfQorCisgIEZvbnQucHJvdG90eXBlID0geworICAgIG5hbWU6IG51bGwsCisgICAgZm9udDogbnVsbCwKKyAgICBtaW1ldHlwZTogbnVsbCwKKyAgICBkaXNhYmxlRm9udEZhY2U6IGZhbHNlLAorCisgICAgZ2V0IHJlbmRlcmVyKCkgeworICAgICAgdmFyIHJlbmRlcmVyID0gX2ZvbnRfcmVuZGVyZXIuRm9udFJlbmRlcmVyRmFjdG9yeS5jcmVhdGUodGhpcywgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJyZW5kZXJlciIsIHJlbmRlcmVyKTsKKyAgICB9LAorCisgICAgZXhwb3J0RGF0YShleHRyYVByb3BlcnRpZXMgPSBmYWxzZSkgeworICAgICAgY29uc3QgZXhwb3J0RGF0YVByb3BlcnRpZXMgPSBleHRyYVByb3BlcnRpZXMgPyBbLi4uRVhQT1JUX0RBVEFfUFJPUEVSVElFUywgLi4uRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFU10gOiBFWFBPUlRfREFUQV9QUk9QRVJUSUVTOworICAgICAgY29uc3QgZGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICBsZXQgcHJvcGVydHksIHZhbHVlOworCisgICAgICBmb3IgKHByb3BlcnR5IG9mIGV4cG9ydERhdGFQcm9wZXJ0aWVzKSB7CisgICAgICAgIHZhbHVlID0gdGhpc1twcm9wZXJ0eV07CisKKyAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBkYXRhW3Byb3BlcnR5XSA9IHZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisKKyAgICBmYWxsYmFja1RvU3lzdGVtRm9udDogZnVuY3Rpb24gRm9udF9mYWxsYmFja1RvU3lzdGVtRm9udCgpIHsKKyAgICAgIHRoaXMubWlzc2luZ0ZpbGUgPSB0cnVlOworICAgICAgdmFyIG5hbWUgPSB0aGlzLm5hbWU7CisgICAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKKyAgICAgIHZhciBzdWJ0eXBlID0gdGhpcy5zdWJ0eXBlOworICAgICAgbGV0IGZvbnROYW1lID0gbmFtZS5yZXBsYWNlKC9bLF9dL2csICItIikucmVwbGFjZSgvXHMvZywgIiIpOworICAgICAgdmFyIHN0ZEZvbnRNYXAgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN0ZEZvbnRNYXApKCksCisgICAgICAgICAgbm9uU3RkRm9udE1hcCA9ICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0Tm9uU3RkRm9udE1hcCkoKTsKKyAgICAgIHZhciBpc1N0YW5kYXJkRm9udCA9ICEhc3RkRm9udE1hcFtmb250TmFtZV0gfHwgISEobm9uU3RkRm9udE1hcFtmb250TmFtZV0gJiYgc3RkRm9udE1hcFtub25TdGRGb250TWFwW2ZvbnROYW1lXV0pOworICAgICAgZm9udE5hbWUgPSBzdGRGb250TWFwW2ZvbnROYW1lXSB8fCBub25TdGRGb250TWFwW2ZvbnROYW1lXSB8fCBmb250TmFtZTsKKyAgICAgIHRoaXMuYm9sZCA9IGZvbnROYW1lLnNlYXJjaCgvYm9sZC9naSkgIT09IC0xOworICAgICAgdGhpcy5pdGFsaWMgPSBmb250TmFtZS5zZWFyY2goL29ibGlxdWUvZ2kpICE9PSAtMSB8fCBmb250TmFtZS5zZWFyY2goL2l0YWxpYy9naSkgIT09IC0xOworICAgICAgdGhpcy5ibGFjayA9IG5hbWUuc2VhcmNoKC9CbGFjay9nKSAhPT0gLTE7CisgICAgICB0aGlzLnJlbWVhc3VyZSA9IE9iamVjdC5rZXlzKHRoaXMud2lkdGhzKS5sZW5ndGggPiAwOworCisgICAgICBpZiAoaXNTdGFuZGFyZEZvbnQgJiYgdHlwZSA9PT0gIkNJREZvbnRUeXBlMiIgJiYgdGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKCJJZGVudGl0eS0iKSkgeworICAgICAgICBjb25zdCBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKTsKKyAgICAgICAgY29uc3QgbWFwID0gW107CisKKyAgICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMpIHsKKyAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IEdseXBoTWFwRm9yU3RhbmRhcmRGb250c1tjaGFyQ29kZV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoL0FyaWFsLT9CbGFjay9pLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICB2YXIgU3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrID0gKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2spKCk7CisKKyAgICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaykgeworICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2tbY2hhckNvZGVdOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgvQ2FsaWJyaS9pLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICBjb25zdCBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSkoKTsKKworICAgICAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gU3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpKSB7CisgICAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaVtjaGFyQ29kZV07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIGlzSWRlbnRpdHlVbmljb2RlID0gdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcDsKKworICAgICAgICBpZiAoIWlzSWRlbnRpdHlVbmljb2RlKSB7CisgICAgICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgeworICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSB1bmljb2RlQ2hhckNvZGU7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBtYXA7CisgICAgICAgIHRoaXMudG9Vbmljb2RlID0gbmV3IFRvVW5pY29kZU1hcChtYXApOworICAgICAgfSBlbHNlIGlmICgvU3ltYm9sL2kudGVzdChmb250TmFtZSkpIHsKKyAgICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKF9lbmNvZGluZ3MuU3ltYm9sU2V0RW5jb2RpbmcsICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCksIHRoaXMuZGlmZmVyZW5jZXMpOworICAgICAgfSBlbHNlIGlmICgvRGluZ2JhdHMvaS50ZXN0KGZvbnROYW1lKSkgeworICAgICAgICBpZiAoL1dpbmdkaW5ncy9pLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIk5vbi1lbWJlZGRlZCBXaW5nZGluZ3MgZm9udCwgZmFsbGluZyBiYWNrIHRvIFphcGZEaW5nYmF0cy4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihfZW5jb2RpbmdzLlphcGZEaW5nYmF0c0VuY29kaW5nLCAoMCwgX2dseXBobGlzdC5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGUpKCksIHRoaXMuZGlmZmVyZW5jZXMpOworICAgICAgfSBlbHNlIGlmIChpc1N0YW5kYXJkRm9udCkgeworICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBidWlsZFRvRm9udENoYXIodGhpcy5kZWZhdWx0RW5jb2RpbmcsICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCksIHRoaXMuZGlmZmVyZW5jZXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CisgICAgICAgIGNvbnN0IG1hcCA9IFtdOworICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSA9PiB7CisgICAgICAgICAgaWYgKCF0aGlzLmNvbXBvc2l0ZSkgeworICAgICAgICAgICAgdmFyIGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdIHx8IHRoaXMuZGVmYXVsdEVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOworCisgICAgICAgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKKyAgICAgICAgICAgICAgdW5pY29kZUNoYXJDb2RlID0gdW5pY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICYmIHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKKyAgICAgICAgICBpZiAoL1ZlcmRhbmEvaS50ZXN0KG5hbWUpKSB7CisgICAgICAgICAgICBjb25zdCBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMpIHsKKyAgICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHNbY2hhckNvZGVdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKKyAgICAgIH0KKworICAgICAgdGhpcy5sb2FkZWROYW1lID0gZm9udE5hbWUuc3BsaXQoIi0iKVswXTsKKyAgICAgIHRoaXMuZm9udFR5cGUgPSBnZXRGb250VHlwZSh0eXBlLCBzdWJ0eXBlKTsKKyAgICB9LAorICAgIGNoZWNrQW5kUmVwYWlyOiBmdW5jdGlvbiBGb250X2NoZWNrQW5kUmVwYWlyKG5hbWUsIGZvbnQsIHByb3BlcnRpZXMpIHsKKyAgICAgIGNvbnN0IFZBTElEX1RBQkxFUyA9IFsiT1MvMiIsICJjbWFwIiwgImhlYWQiLCAiaGhlYSIsICJobXR4IiwgIm1heHAiLCAibmFtZSIsICJwb3N0IiwgImxvY2EiLCAiZ2x5ZiIsICJmcGdtIiwgInByZXAiLCAiY3Z0ICIsICJDRkYgIl07CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUYWJsZXMoZmlsZSwgbnVtVGFibGVzKSB7CisgICAgICAgIGNvbnN0IHRhYmxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgIHRhYmxlc1siT1MvMiJdID0gbnVsbDsKKyAgICAgICAgdGFibGVzLmNtYXAgPSBudWxsOworICAgICAgICB0YWJsZXMuaGVhZCA9IG51bGw7CisgICAgICAgIHRhYmxlcy5oaGVhID0gbnVsbDsKKyAgICAgICAgdGFibGVzLmhtdHggPSBudWxsOworICAgICAgICB0YWJsZXMubWF4cCA9IG51bGw7CisgICAgICAgIHRhYmxlcy5uYW1lID0gbnVsbDsKKyAgICAgICAgdGFibGVzLnBvc3QgPSBudWxsOworCisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgICBjb25zdCB0YWJsZSA9IHJlYWRUYWJsZUVudHJ5KGZpbGUpOworCisgICAgICAgICAgaWYgKCFWQUxJRF9UQUJMRVMuaW5jbHVkZXModGFibGUudGFnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRhYmxlLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGFibGVzW3RhYmxlLnRhZ10gPSB0YWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0YWJsZXM7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUYWJsZUVudHJ5KGZpbGUpIHsKKyAgICAgICAgdmFyIHRhZyA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShmaWxlLmdldEJ5dGVzKDQpKTsKKyAgICAgICAgdmFyIGNoZWNrc3VtID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICB2YXIgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICB2YXIgbGVuZ3RoID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICB2YXIgcHJldmlvdXNQb3NpdGlvbiA9IGZpbGUucG9zOworICAgICAgICBmaWxlLnBvcyA9IGZpbGUuc3RhcnQgPyBmaWxlLnN0YXJ0IDogMDsKKyAgICAgICAgZmlsZS5za2lwKG9mZnNldCk7CisgICAgICAgIHZhciBkYXRhID0gZmlsZS5nZXRCeXRlcyhsZW5ndGgpOworICAgICAgICBmaWxlLnBvcyA9IHByZXZpb3VzUG9zaXRpb247CisKKyAgICAgICAgaWYgKHRhZyA9PT0gImhlYWQiKSB7CisgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOV0gPSBkYXRhWzEwXSA9IGRhdGFbMTFdID0gMDsKKyAgICAgICAgICBkYXRhWzE3XSB8PSAweDIwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICB0YWcsCisgICAgICAgICAgY2hlY2tzdW0sCisgICAgICAgICAgbGVuZ3RoLAorICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICBkYXRhCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0dGYpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICB2ZXJzaW9uOiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykodHRmLmdldEJ5dGVzKDQpKSwKKyAgICAgICAgICBudW1UYWJsZXM6IHR0Zi5nZXRVaW50MTYoKSwKKyAgICAgICAgICBzZWFyY2hSYW5nZTogdHRmLmdldFVpbnQxNigpLAorICAgICAgICAgIGVudHJ5U2VsZWN0b3I6IHR0Zi5nZXRVaW50MTYoKSwKKyAgICAgICAgICByYW5nZVNoaWZ0OiB0dGYuZ2V0VWludDE2KCkKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkhlYWRlcih0dGMpIHsKKyAgICAgICAgY29uc3QgdHRjVGFnID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKHR0Yy5nZXRCeXRlcyg0KSk7CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHR0Y1RhZyA9PT0gInR0Y2YiLCAiTXVzdCBiZSBhIFRydWVUeXBlIENvbGxlY3Rpb24gZm9udC4iKTsKKyAgICAgICAgY29uc3QgbWFqb3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpOworICAgICAgICBjb25zdCBtaW5vclZlcnNpb24gPSB0dGMuZ2V0VWludDE2KCk7CisgICAgICAgIGNvbnN0IG51bUZvbnRzID0gdHRjLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgIGNvbnN0IG9mZnNldFRhYmxlID0gW107CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Gb250czsgaSsrKSB7CisgICAgICAgICAgb2Zmc2V0VGFibGUucHVzaCh0dGMuZ2V0SW50MzIoKSA+Pj4gMCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBoZWFkZXIgPSB7CisgICAgICAgICAgdHRjVGFnLAorICAgICAgICAgIG1ham9yVmVyc2lvbiwKKyAgICAgICAgICBtaW5vclZlcnNpb24sCisgICAgICAgICAgbnVtRm9udHMsCisgICAgICAgICAgb2Zmc2V0VGFibGUKKyAgICAgICAgfTsKKworICAgICAgICBzd2l0Y2ggKG1ham9yVmVyc2lvbikgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXI7CisKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBoZWFkZXIuZHNpZ1RhZyA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgICAgaGVhZGVyLmRzaWdMZW5ndGggPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICAgIGhlYWRlci5kc2lnT2Zmc2V0ID0gdHRjLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIFRydWVUeXBlIENvbGxlY3Rpb24gbWFqb3JWZXJzaW9uOiAke21ham9yVmVyc2lvbn0uYCk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKHR0YywgZm9udE5hbWUpIHsKKyAgICAgICAgY29uc3QgeworICAgICAgICAgIG51bUZvbnRzLAorICAgICAgICAgIG9mZnNldFRhYmxlCisgICAgICAgIH0gPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yyk7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Gb250czsgaSsrKSB7CisgICAgICAgICAgdHRjLnBvcyA9ICh0dGMuc3RhcnQgfHwgMCkgKyBvZmZzZXRUYWJsZVtpXTsKKyAgICAgICAgICBjb25zdCBwb3RlbnRpYWxIZWFkZXIgPSByZWFkT3BlblR5cGVIZWFkZXIodHRjKTsKKyAgICAgICAgICBjb25zdCBwb3RlbnRpYWxUYWJsZXMgPSByZWFkVGFibGVzKHR0YywgcG90ZW50aWFsSGVhZGVyLm51bVRhYmxlcyk7CisKKyAgICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlcy5uYW1lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZm9udCBtdXN0IGNvbnRhaW4gYSAibmFtZSIgdGFibGUuJyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgbmFtZVRhYmxlID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7CisKKyAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamogPSBuYW1lVGFibGUubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgZm9yIChsZXQgayA9IDAsIGtrID0gbmFtZVRhYmxlW2pdLmxlbmd0aDsgayA8IGtrOyBrKyspIHsKKyAgICAgICAgICAgICAgY29uc3QgbmFtZUVudHJ5ID0gbmFtZVRhYmxlW2pdW2tdOworCisgICAgICAgICAgICAgIGlmIChuYW1lRW50cnkgJiYgbmFtZUVudHJ5LnJlcGxhY2UoL1xzL2csICIiKSA9PT0gZm9udE5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgaGVhZGVyOiBwb3RlbnRpYWxIZWFkZXIsCisgICAgICAgICAgICAgICAgICB0YWJsZXM6IHBvdGVudGlhbFRhYmxlcworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFRydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiAiJHtmb250TmFtZX0iIGZvbnQuYCk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRDbWFwVGFibGUoY21hcCwgZmlsZSwgaXNTeW1ib2xpY0ZvbnQsIGhhc0VuY29kaW5nKSB7CisgICAgICAgIGlmICghY21hcCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTm8gY21hcCB0YWJsZSBhdmFpbGFibGUuIik7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAorICAgICAgICAgICAgZW5jb2RpbmdJZDogLTEsCisgICAgICAgICAgICBtYXBwaW5nczogW10sCisgICAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzZWdtZW50OworICAgICAgICB2YXIgc3RhcnQgPSAoZmlsZS5zdGFydCA/IGZpbGUuc3RhcnQgOiAwKSArIGNtYXAub2Zmc2V0OworICAgICAgICBmaWxlLnBvcyA9IHN0YXJ0OworICAgICAgICBmaWxlLnNraXAoMik7CisgICAgICAgIHZhciBudW1UYWJsZXMgPSBmaWxlLmdldFVpbnQxNigpOworICAgICAgICB2YXIgcG90ZW50aWFsVGFibGU7CisgICAgICAgIHZhciBjYW5CcmVhayA9IGZhbHNlOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgICB2YXIgcGxhdGZvcm1JZCA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgICAgICAgdmFyIGVuY29kaW5nSWQgPSBmaWxlLmdldFVpbnQxNigpOworICAgICAgICAgIHZhciBvZmZzZXQgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgdmFyIHVzZVRhYmxlID0gZmFsc2U7CisKKyAgICAgICAgICBpZiAocG90ZW50aWFsVGFibGUgJiYgcG90ZW50aWFsVGFibGUucGxhdGZvcm1JZCA9PT0gcGxhdGZvcm1JZCAmJiBwb3RlbnRpYWxUYWJsZS5lbmNvZGluZ0lkID09PSBlbmNvZGluZ0lkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocGxhdGZvcm1JZCA9PT0gMCAmJiAoZW5jb2RpbmdJZCA9PT0gMCB8fCBlbmNvZGluZ0lkID09PSAxIHx8IGVuY29kaW5nSWQgPT09IDMpKSB7CisgICAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChwbGF0Zm9ybUlkID09PSAxICYmIGVuY29kaW5nSWQgPT09IDApIHsKKyAgICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMSAmJiAoaGFzRW5jb2RpbmcgfHwgIXBvdGVudGlhbFRhYmxlKSkgeworICAgICAgICAgICAgdXNlVGFibGUgPSB0cnVlOworCisgICAgICAgICAgICBpZiAoIWlzU3ltYm9saWNGb250KSB7CisgICAgICAgICAgICAgIGNhbkJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGlzU3ltYm9saWNGb250ICYmIHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMCkgeworICAgICAgICAgICAgdXNlVGFibGUgPSB0cnVlOworICAgICAgICAgICAgY2FuQnJlYWsgPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh1c2VUYWJsZSkgeworICAgICAgICAgICAgcG90ZW50aWFsVGFibGUgPSB7CisgICAgICAgICAgICAgIHBsYXRmb3JtSWQsCisgICAgICAgICAgICAgIGVuY29kaW5nSWQsCisgICAgICAgICAgICAgIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoY2FuQnJlYWspIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3RlbnRpYWxUYWJsZSkgeworICAgICAgICAgIGZpbGUucG9zID0gc3RhcnQgKyBwb3RlbnRpYWxUYWJsZS5vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlIHx8IGZpbGUucGVla0J5dGUoKSA9PT0gLTEpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkNvdWxkIG5vdCBmaW5kIGEgcHJlZmVycmVkIGNtYXAgdGFibGUuIik7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAorICAgICAgICAgICAgZW5jb2RpbmdJZDogLTEsCisgICAgICAgICAgICBtYXBwaW5nczogW10sCisgICAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmb3JtYXQgPSBmaWxlLmdldFVpbnQxNigpOworICAgICAgICBmaWxlLnNraXAoMiArIDIpOworICAgICAgICB2YXIgaGFzU2hvcnRDbWFwID0gZmFsc2U7CisgICAgICAgIHZhciBtYXBwaW5ncyA9IFtdOworICAgICAgICB2YXIgaiwgZ2x5cGhJZDsKKworICAgICAgICBpZiAoZm9ybWF0ID09PSAwKSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisgICAgICAgICAgICB2YXIgaW5kZXggPSBmaWxlLmdldEJ5dGUoKTsKKworICAgICAgICAgICAgaWYgKCFpbmRleCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgIGNoYXJDb2RlOiBqLAorICAgICAgICAgICAgICBnbHlwaElkOiBpbmRleAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaGFzU2hvcnRDbWFwID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDQpIHsKKyAgICAgICAgICB2YXIgc2VnQ291bnQgPSBmaWxlLmdldFVpbnQxNigpID4+IDE7CisgICAgICAgICAgZmlsZS5za2lwKDYpOworICAgICAgICAgIHZhciBzZWdJbmRleCwKKyAgICAgICAgICAgICAgc2VnbWVudHMgPSBbXTsKKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50cy5wdXNoKHsKKyAgICAgICAgICAgICAgZW5kOiBmaWxlLmdldFVpbnQxNigpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmaWxlLnNraXAoMik7CisKKyAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykgeworICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLnN0YXJ0ID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykgeworICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLmRlbHRhID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgb2Zmc2V0c0NvdW50ID0gMDsKKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOworICAgICAgICAgICAgdmFyIHJhbmdlT2Zmc2V0ID0gZmlsZS5nZXRVaW50MTYoKTsKKworICAgICAgICAgICAgaWYgKCFyYW5nZU9mZnNldCkgeworICAgICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gLTE7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgb2Zmc2V0SW5kZXggPSAocmFuZ2VPZmZzZXQgPj4gMSkgLSAoc2VnQ291bnQgLSBzZWdJbmRleCk7CisgICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7CisgICAgICAgICAgICBvZmZzZXRzQ291bnQgPSBNYXRoLm1heChvZmZzZXRzQ291bnQsIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIG9mZnNldHMgPSBbXTsKKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvZmZzZXRzQ291bnQ7IGorKykgeworICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKGZpbGUuZ2V0VWludDE2KCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOworICAgICAgICAgICAgc3RhcnQgPSBzZWdtZW50LnN0YXJ0OworICAgICAgICAgICAgdmFyIGVuZCA9IHNlZ21lbnQuZW5kOworICAgICAgICAgICAgdmFyIGRlbHRhID0gc2VnbWVudC5kZWx0YTsKKyAgICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDsKKworICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgaWYgKGogPT09IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZ2x5cGhJZCA9IG9mZnNldEluZGV4IDwgMCA/IGogOiBvZmZzZXRzW29mZnNldEluZGV4ICsgaiAtIHN0YXJ0XTsKKyAgICAgICAgICAgICAgZ2x5cGhJZCA9IGdseXBoSWQgKyBkZWx0YSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgICAgY2hhckNvZGU6IGosCisgICAgICAgICAgICAgICAgZ2x5cGhJZAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA2KSB7CisgICAgICAgICAgdmFyIGZpcnN0Q29kZSA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgICAgICAgdmFyIGVudHJ5Q291bnQgPSBmaWxlLmdldFVpbnQxNigpOworCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGVudHJ5Q291bnQ7IGorKykgeworICAgICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgICAgICAgICB2YXIgY2hhckNvZGUgPSBmaXJzdENvZGUgKyBqOworICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgIGNoYXJDb2RlLAorICAgICAgICAgICAgICBnbHlwaElkCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJjbWFwIHRhYmxlIGhhcyB1bnN1cHBvcnRlZCBmb3JtYXQ6ICIgKyBmb3JtYXQpOworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKKyAgICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAorICAgICAgICAgICAgbWFwcGluZ3M6IFtdLAorICAgICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBtYXBwaW5ncy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICAgICAgcmV0dXJuIGEuY2hhckNvZGUgLSBiLmNoYXJDb2RlOworICAgICAgICB9KTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAobWFwcGluZ3NbaSAtIDFdLmNoYXJDb2RlID09PSBtYXBwaW5nc1tpXS5jaGFyQ29kZSkgeworICAgICAgICAgICAgbWFwcGluZ3Muc3BsaWNlKGksIDEpOworICAgICAgICAgICAgaS0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgcGxhdGZvcm1JZDogcG90ZW50aWFsVGFibGUucGxhdGZvcm1JZCwKKyAgICAgICAgICBlbmNvZGluZ0lkOiBwb3RlbnRpYWxUYWJsZS5lbmNvZGluZ0lkLAorICAgICAgICAgIG1hcHBpbmdzLAorICAgICAgICAgIGhhc1Nob3J0Q21hcAorICAgICAgICB9OworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZU1ldHJpY3MoZmlsZSwgaGVhZGVyLCBtZXRyaWNzLCBudW1HbHlwaHMsIGR1cEZpcnN0RW50cnkpIHsKKyAgICAgICAgaWYgKCFoZWFkZXIpIHsKKyAgICAgICAgICBpZiAobWV0cmljcykgeworICAgICAgICAgICAgbWV0cmljcy5kYXRhID0gbnVsbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0ID8gZmlsZS5zdGFydCA6IDApICsgaGVhZGVyLm9mZnNldDsKKyAgICAgICAgZmlsZS5wb3MgKz0gNDsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gODsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgdmFyIG51bU9mTWV0cmljcyA9IGZpbGUuZ2V0VWludDE2KCk7CisKKyAgICAgICAgaWYgKG51bU9mTWV0cmljcyA+IG51bUdseXBocykgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVGhlIG51bU9mTWV0cmljcyAoIiArIG51bU9mTWV0cmljcyArICIpIHNob3VsZCBub3QgYmUgIiArICJncmVhdGVyIHRoYW4gdGhlIG51bUdseXBocyAoIiArIG51bUdseXBocyArICIpIik7CisgICAgICAgICAgbnVtT2ZNZXRyaWNzID0gbnVtR2x5cGhzOworICAgICAgICAgIGhlYWRlci5kYXRhWzM0XSA9IChudW1PZk1ldHJpY3MgJiAweGZmMDApID4+IDg7CisgICAgICAgICAgaGVhZGVyLmRhdGFbMzVdID0gbnVtT2ZNZXRyaWNzICYgMHgwMGZmOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG51bU9mU2lkZWJlYXJpbmdzID0gbnVtR2x5cGhzIC0gbnVtT2ZNZXRyaWNzOworICAgICAgICB2YXIgbnVtTWlzc2luZyA9IG51bU9mU2lkZWJlYXJpbmdzIC0gKG1ldHJpY3MubGVuZ3RoIC0gbnVtT2ZNZXRyaWNzICogNCA+PiAxKTsKKworICAgICAgICBpZiAobnVtTWlzc2luZyA+IDApIHsKKyAgICAgICAgICB2YXIgZW50cmllcyA9IG5ldyBVaW50OEFycmF5KG1ldHJpY3MubGVuZ3RoICsgbnVtTWlzc2luZyAqIDIpOworICAgICAgICAgIGVudHJpZXMuc2V0KG1ldHJpY3MuZGF0YSk7CisKKyAgICAgICAgICBpZiAoZHVwRmlyc3RFbnRyeSkgeworICAgICAgICAgICAgZW50cmllc1ttZXRyaWNzLmxlbmd0aF0gPSBtZXRyaWNzLmRhdGFbMl07CisgICAgICAgICAgICBlbnRyaWVzW21ldHJpY3MubGVuZ3RoICsgMV0gPSBtZXRyaWNzLmRhdGFbM107CisgICAgICAgICAgfQorCisgICAgICAgICAgbWV0cmljcy5kYXRhID0gZW50cmllczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgZGVzdCwgZGVzdFN0YXJ0LCBoaW50c1ZhbGlkKSB7CisgICAgICAgIHZhciBnbHlwaFByb2ZpbGUgPSB7CisgICAgICAgICAgbGVuZ3RoOiAwLAorICAgICAgICAgIHNpemVPZkluc3RydWN0aW9uczogMAorICAgICAgICB9OworCisgICAgICAgIGlmIChzb3VyY2VFbmQgLSBzb3VyY2VTdGFydCA8PSAxMikgeworICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ2x5ZiA9IHNvdXJjZS5zdWJhcnJheShzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKyAgICAgICAgdmFyIGNvbnRvdXJzQ291bnQgPSBzaWduZWRJbnQxNihnbHlmWzBdLCBnbHlmWzFdKTsKKworICAgICAgICBpZiAoY29udG91cnNDb3VudCA8IDApIHsKKyAgICAgICAgICBjb250b3Vyc0NvdW50ID0gLTE7CisgICAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCAwLCBjb250b3Vyc0NvdW50KTsKKyAgICAgICAgICBkZXN0LnNldChnbHlmLCBkZXN0U3RhcnQpOworICAgICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlmLmxlbmd0aDsKKyAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGksCisgICAgICAgICAgICBqID0gMTAsCisgICAgICAgICAgICBmbGFnc0NvdW50ID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udG91cnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgdmFyIGVuZFBvaW50ID0gZ2x5ZltqXSA8PCA4IHwgZ2x5ZltqICsgMV07CisgICAgICAgICAgZmxhZ3NDb3VudCA9IGVuZFBvaW50ICsgMTsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgIH0KKworICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zU3RhcnQgPSBqOworICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gZ2x5ZltqXSA8PCA4IHwgZ2x5ZltqICsgMV07CisgICAgICAgIGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnNMZW5ndGg7CisgICAgICAgIGogKz0gMiArIGluc3RydWN0aW9uc0xlbmd0aDsKKyAgICAgICAgdmFyIGluc3RydWN0aW9uc0VuZCA9IGo7CisgICAgICAgIHZhciBjb29yZGluYXRlc0xlbmd0aCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsYWdzQ291bnQ7IGkrKykgeworICAgICAgICAgIHZhciBmbGFnID0gZ2x5ZltqKytdOworCisgICAgICAgICAgaWYgKGZsYWcgJiAweGMwKSB7CisgICAgICAgICAgICBnbHlmW2ogLSAxXSA9IGZsYWcgJiAweDNmOworICAgICAgICAgIH0KKworICAgICAgICAgIGxldCB4TGVuZ3RoID0gMjsKKworICAgICAgICAgIGlmIChmbGFnICYgMikgeworICAgICAgICAgICAgeExlbmd0aCA9IDE7CisgICAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMTYpIHsKKyAgICAgICAgICAgIHhMZW5ndGggPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGxldCB5TGVuZ3RoID0gMjsKKworICAgICAgICAgIGlmIChmbGFnICYgNCkgeworICAgICAgICAgICAgeUxlbmd0aCA9IDE7CisgICAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMzIpIHsKKyAgICAgICAgICAgIHlMZW5ndGggPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IHh5TGVuZ3RoID0geExlbmd0aCArIHlMZW5ndGg7CisgICAgICAgICAgY29vcmRpbmF0ZXNMZW5ndGggKz0geHlMZW5ndGg7CisKKyAgICAgICAgICBpZiAoZmxhZyAmIDgpIHsKKyAgICAgICAgICAgIHZhciByZXBlYXQgPSBnbHlmW2orK107CisgICAgICAgICAgICBpICs9IHJlcGVhdDsKKyAgICAgICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHJlcGVhdCAqIHh5TGVuZ3RoOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb29yZGluYXRlc0xlbmd0aCA9PT0gMCkgeworICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ2x5cGhEYXRhTGVuZ3RoID0gaiArIGNvb3JkaW5hdGVzTGVuZ3RoOworCisgICAgICAgIGlmIChnbHlwaERhdGFMZW5ndGggPiBnbHlmLmxlbmd0aCkgeworICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWhpbnRzVmFsaWQgJiYgaW5zdHJ1Y3Rpb25zTGVuZ3RoID4gMCkgeworICAgICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoMCwgaW5zdHJ1Y3Rpb25zU3RhcnQpLCBkZXN0U3RhcnQpOworICAgICAgICAgIGRlc3Quc2V0KFswLCAwXSwgZGVzdFN0YXJ0ICsgaW5zdHJ1Y3Rpb25zU3RhcnQpOworICAgICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoaW5zdHJ1Y3Rpb25zRW5kLCBnbHlwaERhdGFMZW5ndGgpLCBkZXN0U3RhcnQgKyBpbnN0cnVjdGlvbnNTdGFydCArIDIpOworICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCAtPSBpbnN0cnVjdGlvbnNMZW5ndGg7CisKKyAgICAgICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7CisgICAgICAgICAgICBnbHlwaERhdGFMZW5ndGggPSBnbHlwaERhdGFMZW5ndGggKyAzICYgfjM7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aDsKKyAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdseWYubGVuZ3RoIC0gZ2x5cGhEYXRhTGVuZ3RoID4gMykgeworICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aCArIDMgJiB+MzsKKyAgICAgICAgICBkZXN0LnNldChnbHlmLnN1YmFycmF5KDAsIGdseXBoRGF0YUxlbmd0aCksIGRlc3RTdGFydCk7CisgICAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aDsKKyAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgICB9CisKKyAgICAgICAgZGVzdC5zZXQoZ2x5ZiwgZGVzdFN0YXJ0KTsKKyAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoOworICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZUhlYWQoaGVhZCwgbnVtR2x5cGhzLCBsb2NhTGVuZ3RoKSB7CisgICAgICAgIHZhciBkYXRhID0gaGVhZC5kYXRhOworICAgICAgICB2YXIgdmVyc2lvbiA9IGludDMyKGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworCisgICAgICAgIGlmICh2ZXJzaW9uID4+IDE2ICE9PSAxKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogIiArIHZlcnNpb24pOworICAgICAgICAgIGRhdGFbMF0gPSAwOworICAgICAgICAgIGRhdGFbMV0gPSAxOworICAgICAgICAgIGRhdGFbMl0gPSAwOworICAgICAgICAgIGRhdGFbM10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGluZGV4VG9Mb2NGb3JtYXQgPSBpbnQxNihkYXRhWzUwXSwgZGF0YVs1MV0pOworCisgICAgICAgIGlmIChpbmRleFRvTG9jRm9ybWF0IDwgMCB8fCBpbmRleFRvTG9jRm9ybWF0ID4gMSkgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCBpbmRleFRvTG9jRm9ybWF0IGluIGhlYWQgdGFibGU6ICIgKyBpbmRleFRvTG9jRm9ybWF0KTsKKyAgICAgICAgICB2YXIgbnVtR2x5cGhzUGx1c09uZSA9IG51bUdseXBocyArIDE7CisKKyAgICAgICAgICBpZiAobG9jYUxlbmd0aCA9PT0gbnVtR2x5cGhzUGx1c09uZSA8PCAxKSB7CisgICAgICAgICAgICBkYXRhWzUwXSA9IDA7CisgICAgICAgICAgICBkYXRhWzUxXSA9IDA7CisgICAgICAgICAgfSBlbHNlIGlmIChsb2NhTGVuZ3RoID09PSBudW1HbHlwaHNQbHVzT25lIDw8IDIpIHsKKyAgICAgICAgICAgIGRhdGFbNTBdID0gMDsKKyAgICAgICAgICAgIGRhdGFbNTFdID0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJDb3VsZCBub3QgZml4IGluZGV4VG9Mb2NGb3JtYXQ6ICIgKyBpbmRleFRvTG9jRm9ybWF0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc2FuaXRpemVHbHlwaExvY2F0aW9ucyhsb2NhLCBnbHlmLCBudW1HbHlwaHMsIGlzR2x5cGhMb2NhdGlvbnNMb25nLCBoaW50c1ZhbGlkLCBkdXBGaXJzdEVudHJ5LCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgdmFyIGl0ZW1TaXplLCBpdGVtRGVjb2RlLCBpdGVtRW5jb2RlOworCisgICAgICAgIGlmIChpc0dseXBoTG9jYXRpb25zTG9uZykgeworICAgICAgICAgIGl0ZW1TaXplID0gNDsKKworICAgICAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZUxvbmcoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNiB8IGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgM107CisgICAgICAgICAgfTsKKworICAgICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZUxvbmcoZGF0YSwgb2Zmc2V0LCB2YWx1ZSkgeworICAgICAgICAgICAgZGF0YVtvZmZzZXRdID0gdmFsdWUgPj4+IDI0ICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhW29mZnNldCArIDJdID0gdmFsdWUgPj4gOCAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhW29mZnNldCArIDNdID0gdmFsdWUgJiAweGZmOworICAgICAgICAgIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaXRlbVNpemUgPSAyOworCisgICAgICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlKGRhdGEsIG9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA5IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxOworICAgICAgICAgIH07CisKKyAgICAgICAgICBpdGVtRW5jb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGUoZGF0YSwgb2Zmc2V0LCB2YWx1ZSkgeworICAgICAgICAgICAgZGF0YVtvZmZzZXRdID0gdmFsdWUgPj4gOSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhW29mZnNldCArIDFdID0gdmFsdWUgPj4gMSAmIDB4ZmY7CisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBudW1HbHlwaHNPdXQgPSBkdXBGaXJzdEVudHJ5ID8gbnVtR2x5cGhzICsgMSA6IG51bUdseXBoczsKKyAgICAgICAgdmFyIGxvY2FEYXRhU2l6ZSA9IGl0ZW1TaXplICogKDEgKyBudW1HbHlwaHNPdXQpOworICAgICAgICB2YXIgbG9jYURhdGEgPSBuZXcgVWludDhBcnJheShsb2NhRGF0YVNpemUpOworICAgICAgICBsb2NhRGF0YS5zZXQobG9jYS5kYXRhLnN1YmFycmF5KDAsIGxvY2FEYXRhU2l6ZSkpOworICAgICAgICBsb2NhLmRhdGEgPSBsb2NhRGF0YTsKKyAgICAgICAgdmFyIG9sZEdseWZEYXRhID0gZ2x5Zi5kYXRhOworICAgICAgICB2YXIgb2xkR2x5ZkRhdGFMZW5ndGggPSBvbGRHbHlmRGF0YS5sZW5ndGg7CisgICAgICAgIHZhciBuZXdHbHlmRGF0YSA9IG5ldyBVaW50OEFycmF5KG9sZEdseWZEYXRhTGVuZ3RoKTsKKyAgICAgICAgdmFyIGksIGo7CisgICAgICAgIGNvbnN0IGxvY2FFbnRyaWVzID0gW107CisKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBudW1HbHlwaHMgKyAxOyBpKyssIGogKz0gaXRlbVNpemUpIHsKKyAgICAgICAgICBsZXQgb2Zmc2V0ID0gaXRlbURlY29kZShsb2NhRGF0YSwgaik7CisKKyAgICAgICAgICBpZiAob2Zmc2V0ID4gb2xkR2x5ZkRhdGFMZW5ndGgpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IG9sZEdseWZEYXRhTGVuZ3RoOworICAgICAgICAgIH0KKworICAgICAgICAgIGxvY2FFbnRyaWVzLnB1c2goeworICAgICAgICAgICAgaW5kZXg6IGksCisgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICBlbmRPZmZzZXQ6IDAKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FFbnRyaWVzLnNvcnQoKGEsIGIpID0+IHsKKyAgICAgICAgICByZXR1cm4gYS5vZmZzZXQgLSBiLm9mZnNldDsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CisgICAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbG9jYUVudHJpZXNbaSArIDFdLm9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FFbnRyaWVzLnNvcnQoKGEsIGIpID0+IHsKKyAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7CisgICAgICAgIH0pOworICAgICAgICB2YXIgbWlzc2luZ0dseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgIHZhciB3cml0ZU9mZnNldCA9IDA7CisgICAgICAgIGl0ZW1FbmNvZGUobG9jYURhdGEsIDAsIHdyaXRlT2Zmc2V0KTsKKworICAgICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHM7IGkrKywgaiArPSBpdGVtU2l6ZSkgeworICAgICAgICAgIHZhciBnbHlwaFByb2ZpbGUgPSBzYW5pdGl6ZUdseXBoKG9sZEdseWZEYXRhLCBsb2NhRW50cmllc1tpXS5vZmZzZXQsIGxvY2FFbnRyaWVzW2ldLmVuZE9mZnNldCwgbmV3R2x5ZkRhdGEsIHdyaXRlT2Zmc2V0LCBoaW50c1ZhbGlkKTsKKyAgICAgICAgICB2YXIgbmV3TGVuZ3RoID0gZ2x5cGhQcm9maWxlLmxlbmd0aDsKKworICAgICAgICAgIGlmIChuZXdMZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgIG1pc3NpbmdHbHlwaHNbaV0gPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID4gbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zOworICAgICAgICAgIH0KKworICAgICAgICAgIHdyaXRlT2Zmc2V0ICs9IG5ld0xlbmd0aDsKKyAgICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCB3cml0ZU9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JpdGVPZmZzZXQgPT09IDApIHsKKyAgICAgICAgICB2YXIgc2ltcGxlR2x5cGggPSBuZXcgVWludDhBcnJheShbMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNDksIDBdKTsKKworICAgICAgICAgIGZvciAoaSA9IDAsIGogPSBpdGVtU2l6ZTsgaSA8IG51bUdseXBoc091dDsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCBzaW1wbGVHbHlwaC5sZW5ndGgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGdseWYuZGF0YSA9IHNpbXBsZUdseXBoOworICAgICAgICB9IGVsc2UgaWYgKGR1cEZpcnN0RW50cnkpIHsKKyAgICAgICAgICB2YXIgZmlyc3RFbnRyeUxlbmd0aCA9IGl0ZW1EZWNvZGUobG9jYURhdGEsIGl0ZW1TaXplKTsKKworICAgICAgICAgIGlmIChuZXdHbHlmRGF0YS5sZW5ndGggPiBmaXJzdEVudHJ5TGVuZ3RoICsgd3JpdGVPZmZzZXQpIHsKKyAgICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdseWYuZGF0YSA9IG5ldyBVaW50OEFycmF5KGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7CisgICAgICAgICAgICBnbHlmLmRhdGEuc2V0KG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ2x5Zi5kYXRhLnNldChuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCBmaXJzdEVudHJ5TGVuZ3RoKSwgd3JpdGVPZmZzZXQpOworICAgICAgICAgIGl0ZW1FbmNvZGUobG9jYS5kYXRhLCBsb2NhRGF0YS5sZW5ndGggLSBpdGVtU2l6ZSwgd3JpdGVPZmZzZXQgKyBmaXJzdEVudHJ5TGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnbHlmLmRhdGEgPSBuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCB3cml0ZU9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgIG1pc3NpbmdHbHlwaHMsCisgICAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRQb3N0U2NyaXB0VGFibGUocG9zdCwgcHJvcGVydGllc09iaiwgbWF4cE51bUdseXBocykgeworICAgICAgICB2YXIgc3RhcnQgPSAoZm9udC5zdGFydCA/IGZvbnQuc3RhcnQgOiAwKSArIHBvc3Qub2Zmc2V0OworICAgICAgICBmb250LnBvcyA9IHN0YXJ0OworICAgICAgICB2YXIgbGVuZ3RoID0gcG9zdC5sZW5ndGgsCisgICAgICAgICAgICBlbmQgPSBzdGFydCArIGxlbmd0aDsKKyAgICAgICAgdmFyIHZlcnNpb24gPSBmb250LmdldEludDMyKCk7CisgICAgICAgIGZvbnQuc2tpcCgyOCk7CisgICAgICAgIHZhciBnbHlwaE5hbWVzOworICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOworICAgICAgICB2YXIgaTsKKworICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIDB4MDAwMTAwMDA6CisgICAgICAgICAgICBnbHlwaE5hbWVzID0gTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4MDAwMjAwMDA6CisgICAgICAgICAgICB2YXIgbnVtR2x5cGhzID0gZm9udC5nZXRVaW50MTYoKTsKKworICAgICAgICAgICAgaWYgKG51bUdseXBocyAhPT0gbWF4cE51bUdseXBocykgeworICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdseXBoTmFtZUluZGV4ZXMgPSBbXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CisgICAgICAgICAgICAgIHZhciBpbmRleCA9IGZvbnQuZ2V0VWludDE2KCk7CisKKyAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDMyNzY4KSB7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGdseXBoTmFtZUluZGV4ZXMucHVzaChpbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBjdXN0b21OYW1lcyA9IFtdOworICAgICAgICAgICAgdmFyIHN0ckJ1ZiA9IFtdOworCisgICAgICAgICAgICB3aGlsZSAoZm9udC5wb3MgPCBlbmQpIHsKKyAgICAgICAgICAgICAgdmFyIHN0cmluZ0xlbmd0aCA9IGZvbnQuZ2V0Qnl0ZSgpOworICAgICAgICAgICAgICBzdHJCdWYubGVuZ3RoID0gc3RyaW5nTGVuZ3RoOworCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHN0ckJ1ZltpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nZXRCeXRlKCkpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY3VzdG9tTmFtZXMucHVzaChzdHJCdWYuam9pbigiIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnbHlwaE5hbWVzID0gW107CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICAgICAgICB2YXIgaiA9IGdseXBoTmFtZUluZGV4ZXNbaV07CisKKyAgICAgICAgICAgICAgaWYgKGogPCAyNTgpIHsKKyAgICAgICAgICAgICAgICBnbHlwaE5hbWVzLnB1c2goTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nW2pdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGdseXBoTmFtZXMucHVzaChjdXN0b21OYW1lc1tqIC0gMjU4XSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDAwMDMwMDAwOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmtub3duL3Vuc3VwcG9ydGVkIHBvc3QgdGFibGUgdmVyc2lvbiAiICsgdmVyc2lvbik7CisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAocHJvcGVydGllc09iai5kZWZhdWx0RW5jb2RpbmcpIHsKKyAgICAgICAgICAgICAgZ2x5cGhOYW1lcyA9IHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHByb3BlcnRpZXNPYmouZ2x5cGhOYW1lcyA9IGdseXBoTmFtZXM7CisgICAgICAgIHJldHVybiB2YWxpZDsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcmVhZE5hbWVUYWJsZShuYW1lVGFibGUpIHsKKyAgICAgICAgdmFyIHN0YXJ0ID0gKGZvbnQuc3RhcnQgPyBmb250LnN0YXJ0IDogMCkgKyBuYW1lVGFibGUub2Zmc2V0OworICAgICAgICBmb250LnBvcyA9IHN0YXJ0OworICAgICAgICB2YXIgbmFtZXMgPSBbW10sIFtdXTsKKyAgICAgICAgdmFyIGxlbmd0aCA9IG5hbWVUYWJsZS5sZW5ndGgsCisgICAgICAgICAgICBlbmQgPSBzdGFydCArIGxlbmd0aDsKKyAgICAgICAgdmFyIGZvcm1hdCA9IGZvbnQuZ2V0VWludDE2KCk7CisgICAgICAgIHZhciBGT1JNQVRfMF9IRUFERVJfTEVOR1RIID0gNjsKKworICAgICAgICBpZiAoZm9ybWF0ICE9PSAwIHx8IGxlbmd0aCA8IEZPUk1BVF8wX0hFQURFUl9MRU5HVEgpIHsKKyAgICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbnVtUmVjb3JkcyA9IGZvbnQuZ2V0VWludDE2KCk7CisgICAgICAgIHZhciBzdHJpbmdzU3RhcnQgPSBmb250LmdldFVpbnQxNigpOworICAgICAgICB2YXIgcmVjb3JkcyA9IFtdOworICAgICAgICB2YXIgTkFNRV9SRUNPUkRfTEVOR1RIID0gMTI7CisgICAgICAgIHZhciBpLCBpaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjb3JkcyAmJiBmb250LnBvcyArIE5BTUVfUkVDT1JEX0xFTkdUSCA8PSBlbmQ7IGkrKykgeworICAgICAgICAgIHZhciByID0geworICAgICAgICAgICAgcGxhdGZvcm06IGZvbnQuZ2V0VWludDE2KCksCisgICAgICAgICAgICBlbmNvZGluZzogZm9udC5nZXRVaW50MTYoKSwKKyAgICAgICAgICAgIGxhbmd1YWdlOiBmb250LmdldFVpbnQxNigpLAorICAgICAgICAgICAgbmFtZTogZm9udC5nZXRVaW50MTYoKSwKKyAgICAgICAgICAgIGxlbmd0aDogZm9udC5nZXRVaW50MTYoKSwKKyAgICAgICAgICAgIG9mZnNldDogZm9udC5nZXRVaW50MTYoKQorICAgICAgICAgIH07CisKKyAgICAgICAgICBpZiAoci5wbGF0Zm9ybSA9PT0gMSAmJiByLmVuY29kaW5nID09PSAwICYmIHIubGFuZ3VhZ2UgPT09IDAgfHwgci5wbGF0Zm9ybSA9PT0gMyAmJiByLmVuY29kaW5nID09PSAxICYmIHIubGFuZ3VhZ2UgPT09IDB4NDA5KSB7CisgICAgICAgICAgICByZWNvcmRzLnB1c2gocik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSByZWNvcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICB2YXIgcmVjb3JkID0gcmVjb3Jkc1tpXTsKKworICAgICAgICAgIGlmIChyZWNvcmQubGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBwb3MgPSBzdGFydCArIHN0cmluZ3NTdGFydCArIHJlY29yZC5vZmZzZXQ7CisKKyAgICAgICAgICBpZiAocG9zICsgcmVjb3JkLmxlbmd0aCA+IGVuZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9udC5wb3MgPSBwb3M7CisgICAgICAgICAgdmFyIG5hbWVJbmRleCA9IHJlY29yZC5uYW1lOworCisgICAgICAgICAgaWYgKHJlY29yZC5lbmNvZGluZykgeworICAgICAgICAgICAgdmFyIHN0ciA9ICIiOworCisgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSByZWNvcmQubGVuZ3RoOyBqIDwgamo7IGogKz0gMikgeworICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmb250LmdldFVpbnQxNigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmFtZXNbMV1bbmFtZUluZGV4XSA9IHN0cjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZXNbMF1bbmFtZUluZGV4XSA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShmb250LmdldEJ5dGVzKHJlY29yZC5sZW5ndGgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgICB9CisKKyAgICAgIHZhciBUVE9wc1N0YWNrRGVsdGFzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0yLCAtMiwgLTIsIC0yLCAwLCAwLCAtMiwgLTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xLCAxLCAtMSwgLTk5OSwgMCwgMSwgMCwgLTEsIC0yLCAwLCAtMSwgLTIsIC0xLCAtMSwgMCwgLTEsIC0xLCAwLCAwLCAtOTk5LCAtOTk5LCAtMSwgLTEsIC0xLCAtMSwgLTIsIC05OTksIC0yLCAtMiwgLTk5OSwgMCwgLTIsIC0yLCAwLCAwLCAtMiwgMCwgLTIsIDAsIDAsIDAsIC0yLCAtMSwgLTEsIDEsIDEsIDAsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAtMSwgMCwgLTEsIC0xLCAwLCAtOTk5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMiwgLTk5OSwgLTk5OSwgLTk5OSwgLTk5OSwgLTk5OSwgLTEsIC0xLCAtMiwgLTIsIDAsIDAsIDAsIDAsIC0xLCAtMSwgLTk5OSwgLTIsIC0yLCAwLCAwLCAtMSwgLTIsIC0yLCAwLCAwLCAwLCAtMSwgLTEsIC0xLCAtMl07CisKKyAgICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtKHRhYmxlLCB0dENvbnRleHQpIHsKKyAgICAgICAgdmFyIGRhdGEgPSB0YWJsZS5kYXRhOworICAgICAgICB2YXIgaSA9IDAsCisgICAgICAgICAgICBqLAorICAgICAgICAgICAgbiwKKyAgICAgICAgICAgIGIsCisgICAgICAgICAgICBmdW5jSWQsCisgICAgICAgICAgICBwYywKKyAgICAgICAgICAgIGxhc3RFbmRmID0gMCwKKyAgICAgICAgICAgIGxhc3REZWZmID0gMDsKKyAgICAgICAgdmFyIHN0YWNrID0gW107CisgICAgICAgIHZhciBjYWxsc3RhY2sgPSBbXTsKKyAgICAgICAgdmFyIGZ1bmN0aW9uc0NhbGxlZCA9IFtdOworICAgICAgICB2YXIgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczsKKyAgICAgICAgdmFyIGluRkRFRiA9IGZhbHNlLAorICAgICAgICAgICAgaWZMZXZlbCA9IDAsCisgICAgICAgICAgICBpbkVMU0UgPSAwOworCisgICAgICAgIGZvciAodmFyIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTspIHsKKyAgICAgICAgICB2YXIgb3AgPSBkYXRhW2krK107CisKKyAgICAgICAgICBpZiAob3AgPT09IDB4NDApIHsKKyAgICAgICAgICAgIG4gPSBkYXRhW2krK107CisKKyAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CisgICAgICAgICAgICAgIGkgKz0gbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDQxKSB7CisgICAgICAgICAgICBuID0gZGF0YVtpKytdOworCisgICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgeworICAgICAgICAgICAgICBpICs9IG4gKiAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgeworICAgICAgICAgICAgICAgIGIgPSBkYXRhW2krK107CisgICAgICAgICAgICAgICAgc3RhY2sucHVzaChiIDw8IDggfCBkYXRhW2krK10pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiMCkgeworICAgICAgICAgICAgbiA9IG9wIC0gMHhiMCArIDE7CisKKyAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CisgICAgICAgICAgICAgIGkgKz0gbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZjgpID09PSAweGI4KSB7CisgICAgICAgICAgICBuID0gb3AgLSAweGI4ICsgMTsKKworICAgICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKKyAgICAgICAgICAgICAgaSArPSBuICogMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICBiID0gZGF0YVtpKytdOworICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYiA8PCA4IHwgZGF0YVtpKytdKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmIgJiYgIXRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgeworICAgICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgeworICAgICAgICAgICAgICBmdW5jSWQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKKworICAgICAgICAgICAgICBpZiAoaXNOYU4oZnVuY0lkKSkgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2Z1bmNJZF0gPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYgKGZ1bmNJZCBpbiB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXMpIHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YWNrTGVuZ3RoID0gc3RhY2subGVuZ3RoICsgdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW2Z1bmNJZF07CisKKyAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGFja0xlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS4iKTsKKyAgICAgICAgICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBzdGFjay5sZW5ndGggPSBuZXdTdGFja0xlbmd0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZ1bmNJZCBpbiB0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZCAmJiAhZnVuY3Rpb25zQ2FsbGVkLmluY2x1ZGVzKGZ1bmNJZCkpIHsKKyAgICAgICAgICAgICAgICAgIGNhbGxzdGFjay5wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tUb3A6IHN0YWNrLmxlbmd0aCAtIDEKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zQ2FsbGVkLnB1c2goZnVuY0lkKTsKKyAgICAgICAgICAgICAgICAgIHBjID0gdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXTsKKworICAgICAgICAgICAgICAgICAgaWYgKCFwYykgeworICAgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBDQUxMIG5vbi1leGlzdGVudCBmdW5jdGlvbiIpOworICAgICAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYy5kYXRhOworICAgICAgICAgICAgICAgICAgaSA9IHBjLmk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgyYyAmJiAhdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBuZXN0ZWQgRkRFRnMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5GREVGID0gdHJ1ZTsKKyAgICAgICAgICAgIGxhc3REZWZmID0gaTsKKyAgICAgICAgICAgIGZ1bmNJZCA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXSA9IHsKKyAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgaQorICAgICAgICAgICAgfTsKKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJkKSB7CisgICAgICAgICAgICBpZiAoaW5GREVGKSB7CisgICAgICAgICAgICAgIGluRkRFRiA9IGZhbHNlOworICAgICAgICAgICAgICBsYXN0RW5kZiA9IGk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBwYyA9IGNhbGxzdGFjay5wb3AoKTsKKworICAgICAgICAgICAgICBpZiAoIXBjKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogRU5ERiBiYWQgc3RhY2siKTsKKyAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZ1bmNJZCA9IGZ1bmN0aW9uc0NhbGxlZC5wb3AoKTsKKyAgICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7CisgICAgICAgICAgICAgIGkgPSBwYy5pOworICAgICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXSA9IHN0YWNrLmxlbmd0aCAtIHBjLnN0YWNrVG9wOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4ODkpIHsKKyAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IG5lc3RlZCBJREVGcyBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbkZERUYgPSB0cnVlOworICAgICAgICAgICAgbGFzdERlZmYgPSBpOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NTgpIHsKKyAgICAgICAgICAgICsraWZMZXZlbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDFiKSB7CisgICAgICAgICAgICBpbkVMU0UgPSBpZkxldmVsOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NTkpIHsKKyAgICAgICAgICAgIGlmIChpbkVMU0UgPT09IGlmTGV2ZWwpIHsKKyAgICAgICAgICAgICAgaW5FTFNFID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLS1pZkxldmVsOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWMpIHsKKyAgICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHsKKyAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOworCisgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgaSArPSBvZmZzZXQgLSAxOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgeworICAgICAgICAgICAgbGV0IHN0YWNrRGVsdGEgPSAwOworCisgICAgICAgICAgICBpZiAob3AgPD0gMHg4ZSkgeworICAgICAgICAgICAgICBzdGFja0RlbHRhID0gVFRPcHNTdGFja0RlbHRhc1tvcF07CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4YzAgJiYgb3AgPD0gMHhkZikgeworICAgICAgICAgICAgICBzdGFja0RlbHRhID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4ZTApIHsKKyAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3AgPj0gMHg3MSAmJiBvcCA8PSAweDc1KSB7CisgICAgICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKKworICAgICAgICAgICAgICBpZiAoIWlzTmFOKG4pKSB7CisgICAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC1uICogMjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoc3RhY2tEZWx0YSA8IDAgJiYgc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgc3RhY2tEZWx0YSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoc3RhY2tEZWx0YSA+IDApIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChOYU4pOworICAgICAgICAgICAgICBzdGFja0RlbHRhLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczsKKyAgICAgICAgdmFyIGNvbnRlbnQgPSBbZGF0YV07CisKKyAgICAgICAgaWYgKGkgPiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgIGNvbnRlbnQucHVzaChuZXcgVWludDhBcnJheShpIC0gZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RGVmZiA+IGxhc3RFbmRmKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogY29tcGxlbWVudGluZyBhIG1pc3NpbmcgZnVuY3Rpb24gdGFpbCIpOworICAgICAgICAgIGNvbnRlbnQucHVzaChuZXcgVWludDhBcnJheShbMHgyMiwgMHgyZF0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvbGRUVFRhYmxlKHRhYmxlLCBjb250ZW50KTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKSB7CisgICAgICAgIGlmICh0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkLmxlbmd0aCA+IG1heEZ1bmN0aW9uRGVmcykgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IG1vcmUgZnVuY3Rpb25zIGRlZmluZWQgdGhhbiBleHBlY3RlZCIpOworICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gdHRDb250ZXh0LmZ1bmN0aW9uc1VzZWQubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgIGlmIChqID4gbWF4RnVuY3Rpb25EZWZzKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBpbnZhbGlkIGZ1bmN0aW9uIGlkOiAiICsgaik7CisgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0dENvbnRleHQuZnVuY3Rpb25zVXNlZFtqXSAmJiAhdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbal0pIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IHVuZGVmaW5lZCBmdW5jdGlvbjogIiArIGopOworICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpIHsKKyAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gMSkgeworICAgICAgICAgIHZhciBuZXdMZW5ndGggPSAwOworICAgICAgICAgIHZhciBqLCBqajsKKworICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29udGVudC5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICBuZXdMZW5ndGggKz0gY29udGVudFtqXS5sZW5ndGg7CisgICAgICAgICAgfQorCisgICAgICAgICAgbmV3TGVuZ3RoID0gbmV3TGVuZ3RoICsgMyAmIH4zOworICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShuZXdMZW5ndGgpOworICAgICAgICAgIHZhciBwb3MgPSAwOworCisgICAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICAgIHJlc3VsdC5zZXQoY29udGVudFtqXSwgcG9zKTsKKyAgICAgICAgICAgIHBvcyArPSBjb250ZW50W2pdLmxlbmd0aDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0YWJsZS5kYXRhID0gcmVzdWx0OworICAgICAgICAgIHRhYmxlLmxlbmd0aCA9IG5ld0xlbmd0aDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbXMoZnBnbSwgcHJlcCwgY3Z0LCBtYXhGdW5jdGlvbkRlZnMpIHsKKyAgICAgICAgdmFyIHR0Q29udGV4dCA9IHsKKyAgICAgICAgICBmdW5jdGlvbnNEZWZpbmVkOiBbXSwKKyAgICAgICAgICBmdW5jdGlvbnNVc2VkOiBbXSwKKyAgICAgICAgICBmdW5jdGlvbnNTdGFja0RlbHRhczogW10sCisgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOiBmYWxzZSwKKyAgICAgICAgICBoaW50c1ZhbGlkOiB0cnVlCisgICAgICAgIH07CisKKyAgICAgICAgaWYgKGZwZ20pIHsKKyAgICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShmcGdtLCB0dENvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZXApIHsKKyAgICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShwcmVwLCB0dENvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZwZ20pIHsKKyAgICAgICAgICBjaGVja0ludmFsaWRGdW5jdGlvbnModHRDb250ZXh0LCBtYXhGdW5jdGlvbkRlZnMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN2dCAmJiBjdnQubGVuZ3RoICYgMSkgeworICAgICAgICAgIHZhciBjdnREYXRhID0gbmV3IFVpbnQ4QXJyYXkoY3Z0Lmxlbmd0aCArIDEpOworICAgICAgICAgIGN2dERhdGEuc2V0KGN2dC5kYXRhKTsKKyAgICAgICAgICBjdnQuZGF0YSA9IGN2dERhdGE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHRDb250ZXh0LmhpbnRzVmFsaWQ7CisgICAgICB9CisKKyAgICAgIGZvbnQgPSBuZXcgX3N0cmVhbS5TdHJlYW0obmV3IFVpbnQ4QXJyYXkoZm9udC5nZXRCeXRlcygpKSk7CisgICAgICBsZXQgaGVhZGVyLCB0YWJsZXM7CisKKyAgICAgIGlmIChpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZm9udCkpIHsKKyAgICAgICAgY29uc3QgdHRjRGF0YSA9IHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKGZvbnQsIHRoaXMubmFtZSk7CisgICAgICAgIGhlYWRlciA9IHR0Y0RhdGEuaGVhZGVyOworICAgICAgICB0YWJsZXMgPSB0dGNEYXRhLnRhYmxlczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWRlciA9IHJlYWRPcGVuVHlwZUhlYWRlcihmb250KTsKKyAgICAgICAgdGFibGVzID0gcmVhZFRhYmxlcyhmb250LCBoZWFkZXIubnVtVGFibGVzKTsKKyAgICAgIH0KKworICAgICAgbGV0IGNmZiwgY2ZmRmlsZTsKKyAgICAgIHZhciBpc1RydWVUeXBlID0gIXRhYmxlc1siQ0ZGICJdOworCisgICAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKKyAgICAgICAgY29uc3QgaXNDb21wb3NpdGUgPSBwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAmJiAoKHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW10pLmxlbmd0aCA+IDAgfHwgIShwcm9wZXJ0aWVzLmNNYXAgaW5zdGFuY2VvZiBfY21hcC5JZGVudGl0eUNNYXApKTsKKworICAgICAgICBpZiAoaGVhZGVyLnZlcnNpb24gPT09ICJPVFRPIiAmJiAhaXNDb21wb3NpdGUgfHwgIXRhYmxlcy5oZWFkIHx8ICF0YWJsZXMuaGhlYSB8fCAhdGFibGVzLm1heHAgfHwgIXRhYmxlcy5wb3N0KSB7CisgICAgICAgICAgY2ZmRmlsZSA9IG5ldyBfc3RyZWFtLlN0cmVhbSh0YWJsZXNbIkNGRiAiXS5kYXRhKTsKKyAgICAgICAgICBjZmYgPSBuZXcgQ0ZGRm9udChjZmZGaWxlLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CisgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydChuYW1lLCBjZmYsIHByb3BlcnRpZXMpOworICAgICAgICB9CisKKyAgICAgICAgZGVsZXRlIHRhYmxlcy5nbHlmOworICAgICAgICBkZWxldGUgdGFibGVzLmxvY2E7CisgICAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTsKKyAgICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwOworICAgICAgICBkZWxldGUgdGFibGVzWyJjdnQgIl07CisgICAgICAgIHRoaXMuaXNPcGVuVHlwZSA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXRhYmxlcy5sb2NhKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibG9jYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRhYmxlcy5nbHlmKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCdSZXF1aXJlZCAiZ2x5ZiIgdGFibGUgaXMgbm90IGZvdW5kIC0tIHRyeWluZyB0byByZWNvdmVyLicpOworICAgICAgICAgIHRhYmxlcy5nbHlmID0geworICAgICAgICAgICAgdGFnOiAiZ2x5ZiIsCisgICAgICAgICAgICBkYXRhOiBuZXcgVWludDhBcnJheSgwKQorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmlzT3BlblR5cGUgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0YWJsZXMubWF4cCkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJtYXhwIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKKyAgICAgIH0KKworICAgICAgZm9udC5wb3MgPSAoZm9udC5zdGFydCB8fCAwKSArIHRhYmxlcy5tYXhwLm9mZnNldDsKKyAgICAgIHZhciB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpOworICAgICAgY29uc3QgbnVtR2x5cGhzID0gZm9udC5nZXRVaW50MTYoKTsKKyAgICAgIGxldCBudW1HbHlwaHNPdXQgPSBudW1HbHlwaHMgKyAxOworICAgICAgbGV0IGR1cEZpcnN0RW50cnkgPSB0cnVlOworCisgICAgICBpZiAobnVtR2x5cGhzT3V0ID4gMHhmZmZmKSB7CisgICAgICAgIGR1cEZpcnN0RW50cnkgPSBmYWxzZTsKKyAgICAgICAgbnVtR2x5cGhzT3V0ID0gbnVtR2x5cGhzOworICAgICAgICAoMCwgX3V0aWwud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gZ2x5ZnMgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpOworICAgICAgfQorCisgICAgICB2YXIgbWF4RnVuY3Rpb25EZWZzID0gMDsKKyAgICAgIHZhciBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSAwOworCisgICAgICBpZiAodmVyc2lvbiA+PSAweDAwMDEwMDAwICYmIHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAyMikgeworICAgICAgICBmb250LnBvcyArPSA4OworICAgICAgICB2YXIgbWF4Wm9uZXMgPSBmb250LmdldFVpbnQxNigpOworCisgICAgICAgIGlmIChtYXhab25lcyA+IDIpIHsKKyAgICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE0XSA9IDA7CisgICAgICAgICAgdGFibGVzLm1heHAuZGF0YVsxNV0gPSAyOworICAgICAgICB9CisKKyAgICAgICAgZm9udC5wb3MgKz0gNDsKKyAgICAgICAgbWF4RnVuY3Rpb25EZWZzID0gZm9udC5nZXRVaW50MTYoKTsKKyAgICAgICAgZm9udC5wb3MgKz0gNDsKKyAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID0gZm9udC5nZXRVaW50MTYoKTsKKyAgICAgIH0KKworICAgICAgdGFibGVzLm1heHAuZGF0YVs0XSA9IG51bUdseXBoc091dCA+PiA4OworICAgICAgdGFibGVzLm1heHAuZGF0YVs1XSA9IG51bUdseXBoc091dCAmIDI1NTsKKyAgICAgIHZhciBoaW50c1ZhbGlkID0gc2FuaXRpemVUVFByb2dyYW1zKHRhYmxlcy5mcGdtLCB0YWJsZXMucHJlcCwgdGFibGVzWyJjdnQgIl0sIG1heEZ1bmN0aW9uRGVmcyk7CisKKyAgICAgIGlmICghaGludHNWYWxpZCkgeworICAgICAgICBkZWxldGUgdGFibGVzLmZwZ207CisgICAgICAgIGRlbGV0ZSB0YWJsZXMucHJlcDsKKyAgICAgICAgZGVsZXRlIHRhYmxlc1siY3Z0ICJdOworICAgICAgfQorCisgICAgICBzYW5pdGl6ZU1ldHJpY3MoZm9udCwgdGFibGVzLmhoZWEsIHRhYmxlcy5obXR4LCBudW1HbHlwaHNPdXQsIGR1cEZpcnN0RW50cnkpOworCisgICAgICBpZiAoIXRhYmxlcy5oZWFkKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcignUmVxdWlyZWQgImhlYWQiIHRhYmxlIGlzIG5vdCBmb3VuZCcpOworICAgICAgfQorCisgICAgICBzYW5pdGl6ZUhlYWQodGFibGVzLmhlYWQsIG51bUdseXBocywgaXNUcnVlVHlwZSA/IHRhYmxlcy5sb2NhLmxlbmd0aCA6IDApOworICAgICAgdmFyIG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICBpZiAoaXNUcnVlVHlwZSkgeworICAgICAgICB2YXIgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOworICAgICAgICB2YXIgZ2x5cGhzSW5mbyA9IHNhbml0aXplR2x5cGhMb2NhdGlvbnModGFibGVzLmxvY2EsIHRhYmxlcy5nbHlmLCBudW1HbHlwaHMsIGlzR2x5cGhMb2NhdGlvbnNMb25nLCBoaW50c1ZhbGlkLCBkdXBGaXJzdEVudHJ5LCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpOworICAgICAgICBtaXNzaW5nR2x5cGhzID0gZ2x5cGhzSW5mby5taXNzaW5nR2x5cGhzOworCisgICAgICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDIyKSB7CisgICAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyNl0gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyA+PiA4OworICAgICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMjddID0gZ2x5cGhzSW5mby5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgJiAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCF0YWJsZXMuaGhlYSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoaGVhIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRhYmxlcy5oaGVhLmRhdGFbMTBdID09PSAwICYmIHRhYmxlcy5oaGVhLmRhdGFbMTFdID09PSAwKSB7CisgICAgICAgIHRhYmxlcy5oaGVhLmRhdGFbMTBdID0gMHhmZjsKKyAgICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMV0gPSAweGZmOworICAgICAgfQorCisgICAgICB2YXIgbWV0cmljc092ZXJyaWRlID0geworICAgICAgICB1bml0c1BlckVtOiBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzE4XSwgdGFibGVzLmhlYWQuZGF0YVsxOV0pLAorICAgICAgICB5TWF4OiBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzQyXSwgdGFibGVzLmhlYWQuZGF0YVs0M10pLAorICAgICAgICB5TWluOiBzaWduZWRJbnQxNih0YWJsZXMuaGVhZC5kYXRhWzM4XSwgdGFibGVzLmhlYWQuZGF0YVszOV0pLAorICAgICAgICBhc2NlbnQ6IGludDE2KHRhYmxlcy5oaGVhLmRhdGFbNF0sIHRhYmxlcy5oaGVhLmRhdGFbNV0pLAorICAgICAgICBkZXNjZW50OiBzaWduZWRJbnQxNih0YWJsZXMuaGhlYS5kYXRhWzZdLCB0YWJsZXMuaGhlYS5kYXRhWzddKQorICAgICAgfTsKKyAgICAgIHRoaXMuYXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmFzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtOworICAgICAgdGhpcy5kZXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmRlc2NlbnQgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTsKKworICAgICAgaWYgKHRhYmxlcy5wb3N0KSB7CisgICAgICAgIHJlYWRQb3N0U2NyaXB0VGFibGUodGFibGVzLnBvc3QsIHByb3BlcnRpZXMsIG51bUdseXBocyk7CisgICAgICB9CisKKyAgICAgIHRhYmxlcy5wb3N0ID0geworICAgICAgICB0YWc6ICJwb3N0IiwKKyAgICAgICAgZGF0YTogY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpCisgICAgICB9OworICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBbXTsKKworICAgICAgZnVuY3Rpb24gaGFzR2x5cGgoZ2x5cGhJZCkgeworICAgICAgICByZXR1cm4gIW1pc3NpbmdHbHlwaHNbZ2x5cGhJZF07CisgICAgICB9CisKKyAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgeworICAgICAgICB2YXIgY2lkVG9HaWRNYXAgPSBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwIHx8IFtdOworICAgICAgICB2YXIgaXNDaWRUb0dpZE1hcEVtcHR5ID0gY2lkVG9HaWRNYXAubGVuZ3RoID09PSAwOworICAgICAgICBwcm9wZXJ0aWVzLmNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIGNpZCkgeworICAgICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBnbHlwaElkID0gLTE7CisKKyAgICAgICAgICBpZiAoaXNDaWRUb0dpZE1hcEVtcHR5KSB7CisgICAgICAgICAgICBnbHlwaElkID0gY2lkOworICAgICAgICAgIH0gZWxzZSBpZiAoY2lkVG9HaWRNYXBbY2lkXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBnbHlwaElkID0gY2lkVG9HaWRNYXBbY2lkXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwICYmIGdseXBoSWQgPCBudW1HbHlwaHMgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKKyAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBjbWFwVGFibGUgPSByZWFkQ21hcFRhYmxlKHRhYmxlcy5jbWFwLCBmb250LCB0aGlzLmlzU3ltYm9saWNGb250LCBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKTsKKyAgICAgICAgdmFyIGNtYXBQbGF0Zm9ybUlkID0gY21hcFRhYmxlLnBsYXRmb3JtSWQ7CisgICAgICAgIHZhciBjbWFwRW5jb2RpbmdJZCA9IGNtYXBUYWJsZS5lbmNvZGluZ0lkOworICAgICAgICB2YXIgY21hcE1hcHBpbmdzID0gY21hcFRhYmxlLm1hcHBpbmdzOworICAgICAgICB2YXIgY21hcE1hcHBpbmdzTGVuZ3RoID0gY21hcE1hcHBpbmdzLmxlbmd0aDsKKyAgICAgICAgbGV0IGJhc2VFbmNvZGluZyA9IFtdOworCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nICYmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPT09ICJNYWNSb21hbkVuY29kaW5nIiB8fCBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPT09ICJXaW5BbnNpRW5jb2RpbmciKSkgeworICAgICAgICAgIGJhc2VFbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzRW5jb2RpbmcgJiYgIXRoaXMuaXNTeW1ib2xpY0ZvbnQgJiYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxIHx8IGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSkgeworICAgICAgICAgIHZhciBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKworICAgICAgICAgIGZvciAobGV0IGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCAyNTY7IGNoYXJDb2RlKyspIHsKKyAgICAgICAgICAgIHZhciBnbHlwaE5hbWUsIHN0YW5kYXJkR2x5cGhOYW1lOworCisgICAgICAgICAgICBpZiAodGhpcy5kaWZmZXJlbmNlcyAmJiBjaGFyQ29kZSBpbiB0aGlzLmRpZmZlcmVuY2VzKSB7CisgICAgICAgICAgICAgIGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyQ29kZSBpbiBiYXNlRW5jb2RpbmcgJiYgYmFzZUVuY29kaW5nW2NoYXJDb2RlXSAhPT0gIiIpIHsKKyAgICAgICAgICAgICAgZ2x5cGhOYW1lID0gYmFzZUVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGdseXBoTmFtZSA9IF9lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZ1tjaGFyQ29kZV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZ2x5cGhOYW1lKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFuZGFyZEdseXBoTmFtZSA9IHJlY292ZXJHbHlwaE5hbWUoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKKyAgICAgICAgICAgIHZhciB1bmljb2RlT3JDaGFyQ29kZTsKKworICAgICAgICAgICAgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxKSB7CisgICAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtzdGFuZGFyZEdseXBoTmFtZV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CisgICAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gX2VuY29kaW5ncy5NYWNSb21hbkVuY29kaW5nLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGUgIT09IHVuaWNvZGVPckNoYXJDb2RlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBjbWFwTWFwcGluZ3NbaV0uZ2x5cGhJZDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAwKSB7CisgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbWFwTWFwcGluZ3NMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY21hcE1hcHBpbmdzW2ldLmNoYXJDb2RlXSA9IGNtYXBNYXBwaW5nc1tpXS5nbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgY2hhckNvZGUgPSBjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGU7CisKKyAgICAgICAgICAgIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjaGFyQ29kZSA+PSAweGYwMDAgJiYgY2hhckNvZGUgPD0gMHhmMGZmKSB7CisgICAgICAgICAgICAgIGNoYXJDb2RlICY9IDB4ZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGNtYXBNYXBwaW5nc1tpXS5nbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmdseXBoTmFtZXMgJiYgYmFzZUVuY29kaW5nLmxlbmd0aCkgeworICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChjaGFyQ29kZVRvR2x5cGhJZFtpXSA9PT0gdW5kZWZpbmVkICYmIGJhc2VFbmNvZGluZ1tpXSkgeworICAgICAgICAgICAgICBnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbaV07CisgICAgICAgICAgICAgIGNvbnN0IGdseXBoSWQgPSBwcm9wZXJ0aWVzLmdseXBoTmFtZXMuaW5kZXhPZihnbHlwaE5hbWUpOworCisgICAgICAgICAgICAgIGlmIChnbHlwaElkID4gMCAmJiBoYXNHbHlwaChnbHlwaElkKSkgeworICAgICAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2ldID0gZ2x5cGhJZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2hhckNvZGVUb0dseXBoSWQubGVuZ3RoID09PSAwKSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkWzBdID0gMDsKKyAgICAgIH0KKworICAgICAgbGV0IGdseXBoWmVyb0lkID0gbnVtR2x5cGhzT3V0IC0gMTsKKworICAgICAgaWYgKCFkdXBGaXJzdEVudHJ5KSB7CisgICAgICAgIGdseXBoWmVyb0lkID0gMDsKKyAgICAgIH0KKworICAgICAgdmFyIG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgZ2x5cGhaZXJvSWQpOworICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOworICAgICAgdGFibGVzLmNtYXAgPSB7CisgICAgICAgIHRhZzogImNtYXAiLAorICAgICAgICBkYXRhOiBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbnVtR2x5cGhzT3V0KQorICAgICAgfTsKKworICAgICAgaWYgKCF0YWJsZXNbIk9TLzIiXSB8fCAhdmFsaWRhdGVPUzJUYWJsZSh0YWJsZXNbIk9TLzIiXSwgZm9udCkpIHsKKyAgICAgICAgdGFibGVzWyJPUy8yIl0gPSB7CisgICAgICAgICAgdGFnOiAiT1MvMiIsCisgICAgICAgICAgZGF0YTogY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbWV0cmljc092ZXJyaWRlKQorICAgICAgICB9OworICAgICAgfQorCisgICAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjZmZGaWxlID0gbmV3IF9zdHJlYW0uU3RyZWFtKHRhYmxlc1siQ0ZGICJdLmRhdGEpOworICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKGNmZkZpbGUsIHByb3BlcnRpZXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgICAgICAgY2ZmID0gcGFyc2VyLnBhcnNlKCk7CisgICAgICAgICAgY2ZmLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTsKKyAgICAgICAgICB2YXIgY29tcGlsZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIoY2ZmKTsKKyAgICAgICAgICB0YWJsZXNbIkNGRiAiXS5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghdGFibGVzLm5hbWUpIHsKKyAgICAgICAgdGFibGVzLm5hbWUgPSB7CisgICAgICAgICAgdGFnOiAibmFtZSIsCisgICAgICAgICAgZGF0YTogY3JlYXRlTmFtZVRhYmxlKHRoaXMubmFtZSkKKyAgICAgICAgfTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBuYW1lUHJvdG90eXBlID0gcmVhZE5hbWVUYWJsZSh0YWJsZXMubmFtZSk7CisgICAgICAgIHRhYmxlcy5uYW1lLmRhdGEgPSBjcmVhdGVOYW1lVGFibGUobmFtZSwgbmFtZVByb3RvdHlwZSk7CisgICAgICB9CisKKyAgICAgIHZhciBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoaGVhZGVyLnZlcnNpb24pOworCisgICAgICBmb3IgKHZhciB0YWJsZVRhZyBpbiB0YWJsZXMpIHsKKyAgICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpOworICAgIH0sCisgICAgY29udmVydDogZnVuY3Rpb24gRm9udF9jb252ZXJ0KGZvbnROYW1lLCBmb250LCBwcm9wZXJ0aWVzKSB7CisgICAgICBwcm9wZXJ0aWVzLmZpeGVkUGl0Y2ggPSBmYWxzZTsKKworICAgICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7CisgICAgICAgIGFkanVzdFRvVW5pY29kZShwcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZyk7CisgICAgICB9CisKKyAgICAgIGxldCBnbHlwaFplcm9JZCA9IDE7CisKKyAgICAgIGlmIChmb250IGluc3RhbmNlb2YgQ0ZGRm9udCkgeworICAgICAgICBnbHlwaFplcm9JZCA9IGZvbnQubnVtR2x5cGhzIC0gMTsKKyAgICAgIH0KKworICAgICAgdmFyIG1hcHBpbmcgPSBmb250LmdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKTsKKyAgICAgIHZhciBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhtYXBwaW5nLCBmb250Lmhhc0dseXBoSWQuYmluZChmb250KSwgZ2x5cGhaZXJvSWQpOworICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOworICAgICAgdmFyIG51bUdseXBocyA9IGZvbnQubnVtR2x5cGhzOworCisgICAgICBmdW5jdGlvbiBnZXRDaGFyQ29kZXMoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKKyAgICAgICAgdmFyIGNoYXJDb2RlcyA9IG51bGw7CisKKyAgICAgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKKyAgICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7CisgICAgICAgICAgICBpZiAoIWNoYXJDb2RlcykgeworICAgICAgICAgICAgICBjaGFyQ29kZXMgPSBbXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hhckNvZGVzLnB1c2goY2hhckNvZGUgfCAwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2hhckNvZGVzOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBjcmVhdGVDaGFyQ29kZShjaGFyQ29kZVRvR2x5cGhJZCwgZ2x5cGhJZCkgeworICAgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgeworICAgICAgICAgIGlmIChnbHlwaElkID09PSBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0pIHsKKyAgICAgICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZFtuZXdNYXBwaW5nLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGVdID0gZ2x5cGhJZDsKKyAgICAgICAgcmV0dXJuIG5ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrOworICAgICAgfQorCisgICAgICB2YXIgc2VhY3MgPSBmb250LnNlYWNzOworCisgICAgICBpZiAoU0VBQ19BTkFMWVNJU19FTkFCTEVEICYmIHNlYWNzICYmIHNlYWNzLmxlbmd0aCkgeworICAgICAgICB2YXIgbWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgICB2YXIgY2hhcnNldCA9IGZvbnQuZ2V0Q2hhcnNldCgpOworICAgICAgICB2YXIgc2VhY01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgZm9yICh2YXIgZ2x5cGhJZCBpbiBzZWFjcykgeworICAgICAgICAgIGdseXBoSWQgfD0gMDsKKyAgICAgICAgICB2YXIgc2VhYyA9IHNlYWNzW2dseXBoSWRdOworICAgICAgICAgIHZhciBiYXNlR2x5cGhOYW1lID0gX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nW3NlYWNbMl1dOworICAgICAgICAgIHZhciBhY2NlbnRHbHlwaE5hbWUgPSBfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2Rpbmdbc2VhY1szXV07CisgICAgICAgICAgdmFyIGJhc2VHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGJhc2VHbHlwaE5hbWUpOworICAgICAgICAgIHZhciBhY2NlbnRHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGFjY2VudEdseXBoTmFtZSk7CisKKyAgICAgICAgICBpZiAoYmFzZUdseXBoSWQgPCAwIHx8IGFjY2VudEdseXBoSWQgPCAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgYWNjZW50T2Zmc2V0ID0geworICAgICAgICAgICAgeDogc2VhY1swXSAqIG1hdHJpeFswXSArIHNlYWNbMV0gKiBtYXRyaXhbMl0gKyBtYXRyaXhbNF0sCisgICAgICAgICAgICB5OiBzZWFjWzBdICogbWF0cml4WzFdICsgc2VhY1sxXSAqIG1hdHJpeFszXSArIG1hdHJpeFs1XQorICAgICAgICAgIH07CisgICAgICAgICAgdmFyIGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTsKKworICAgICAgICAgIGlmICghY2hhckNvZGVzKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGFyQ29kZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gY2hhckNvZGVzW2ldOworICAgICAgICAgICAgdmFyIGNoYXJDb2RlVG9HbHlwaElkID0gbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZDsKKyAgICAgICAgICAgIHZhciBiYXNlRm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGJhc2VHbHlwaElkKTsKKyAgICAgICAgICAgIHZhciBhY2NlbnRGb250Q2hhckNvZGUgPSBjcmVhdGVDaGFyQ29kZShjaGFyQ29kZVRvR2x5cGhJZCwgYWNjZW50R2x5cGhJZCk7CisgICAgICAgICAgICBzZWFjTWFwW2NoYXJDb2RlXSA9IHsKKyAgICAgICAgICAgICAgYmFzZUZvbnRDaGFyQ29kZSwKKyAgICAgICAgICAgICAgYWNjZW50Rm9udENoYXJDb2RlLAorICAgICAgICAgICAgICBhY2NlbnRPZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydGllcy5zZWFjTWFwID0gc2VhY01hcDsKKyAgICAgIH0KKworICAgICAgdmFyIHVuaXRzUGVyRW0gPSAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWClbMF07CisgICAgICB2YXIgYnVpbGRlciA9IG5ldyBPcGVuVHlwZUZpbGVCdWlsZGVyKCJceDRGXHg1NFx4NTRceDRGIik7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJDRkYgIiwgZm9udC5kYXRhKTsKKyAgICAgIGJ1aWxkZXIuYWRkVGFibGUoIk9TLzIiLCBjcmVhdGVPUzJUYWJsZShwcm9wZXJ0aWVzLCBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJjbWFwIiwgY3JlYXRlQ21hcFRhYmxlKG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQsIG51bUdseXBocykpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgiaGVhZCIsICJceDAwXHgwMVx4MDBceDAwIiArICJceDAwXHgwMFx4MTBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIiArICJceDVGXHgwRlx4M0NceEY1IiArICJceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYodW5pdHNQZXJFbSkgKyAiXHgwMFx4MDBceDAwXHgwMFx4OWVceDBiXHg3ZVx4MjciICsgIlx4MDBceDAwXHgwMFx4MDBceDllXHgwYlx4N2VceDI3IiArICJceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5kZXNjZW50KSArICJceDBGXHhGRiIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDIgOiAwKSArICJceDAwXHgxMSIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgiaGhlYSIsICJceDAwXHgwMVx4MDBceDAwIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmFzY2VudCkgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5kZXNjZW50KSArICJceDAwXHgwMCIgKyAiXHhGRlx4RkYiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuY2FwSGVpZ2h0KSArIHNhZmVTdHJpbmcxNihNYXRoLnRhbihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlKSAqIHByb3BlcnRpZXMueEhlaWdodCkgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyBzdHJpbmcxNihudW1HbHlwaHMpKTsKKyAgICAgIGJ1aWxkZXIuYWRkVGFibGUoImhtdHgiLCBmdW5jdGlvbiBmb250RmllbGRzSG10eCgpIHsKKyAgICAgICAgdmFyIGNoYXJzdHJpbmdzID0gZm9udC5jaGFyc3RyaW5nczsKKyAgICAgICAgdmFyIGNmZldpZHRocyA9IGZvbnQuY2ZmID8gZm9udC5jZmYud2lkdGhzIDogbnVsbDsKKyAgICAgICAgdmFyIGhtdHggPSAiXHgwMFx4MDBceDAwXHgwMCI7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbnVtR2x5cGhzOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIHZhciB3aWR0aCA9IDA7CisKKyAgICAgICAgICBpZiAoY2hhcnN0cmluZ3MpIHsKKyAgICAgICAgICAgIHZhciBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbaSAtIDFdOworICAgICAgICAgICAgd2lkdGggPSAid2lkdGgiIGluIGNoYXJzdHJpbmcgPyBjaGFyc3RyaW5nLndpZHRoIDogMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNmZldpZHRocykgeworICAgICAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwoY2ZmV2lkdGhzW2ldIHx8IDApOworICAgICAgICAgIH0KKworICAgICAgICAgIGhtdHggKz0gc3RyaW5nMTYod2lkdGgpICsgc3RyaW5nMTYoMCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaG10eDsKKyAgICAgIH0oKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJtYXhwIiwgIlx4MDBceDAwXHg1MFx4MDAiICsgc3RyaW5nMTYobnVtR2x5cGhzKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJuYW1lIiwgY3JlYXRlTmFtZVRhYmxlKGZvbnROYW1lKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJwb3N0IiwgY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpKTsKKyAgICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTsKKyAgICB9LAorCisgICAgZ2V0IHNwYWNlV2lkdGgoKSB7CisgICAgICB2YXIgcG9zc2libGVTcGFjZVJlcGxhY2VtZW50cyA9IFsic3BhY2UiLCAibWludXMiLCAib25lIiwgImkiLCAiSSJdOworICAgICAgdmFyIHdpZHRoOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGdseXBoTmFtZSA9IHBvc3NpYmxlU3BhY2VSZXBsYWNlbWVudHNbaV07CisKKyAgICAgICAgaWYgKGdseXBoTmFtZSBpbiB0aGlzLndpZHRocykgeworICAgICAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbZ2x5cGhOYW1lXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKyAgICAgICAgdmFyIGdseXBoVW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKKyAgICAgICAgdmFyIGNoYXJjb2RlID0gMDsKKworICAgICAgICBpZiAodGhpcy5jb21wb3NpdGUgJiYgdGhpcy5jTWFwLmNvbnRhaW5zKGdseXBoVW5pY29kZSkpIHsKKyAgICAgICAgICBjaGFyY29kZSA9IHRoaXMuY01hcC5sb29rdXAoZ2x5cGhVbmljb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2hhcmNvZGUgJiYgdGhpcy50b1VuaWNvZGUpIHsKKyAgICAgICAgICBjaGFyY29kZSA9IHRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YoZ2x5cGhVbmljb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFyY29kZSA8PSAwKSB7CisgICAgICAgICAgY2hhcmNvZGUgPSBnbHlwaFVuaWNvZGU7CisgICAgICAgIH0KKworICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2NoYXJjb2RlXTsKKworICAgICAgICBpZiAod2lkdGgpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB3aWR0aCA9IHdpZHRoIHx8IHRoaXMuZGVmYXVsdFdpZHRoOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJzcGFjZVdpZHRoIiwgd2lkdGgpOworICAgIH0sCisKKyAgICBjaGFyVG9HbHlwaDogZnVuY3Rpb24gRm9udF9jaGFyVG9HbHlwaChjaGFyY29kZSwgaXNTcGFjZSkgeworICAgICAgdmFyIGZvbnRDaGFyQ29kZSwgd2lkdGgsIG9wZXJhdG9yTGlzdElkOworICAgICAgdmFyIHdpZHRoQ29kZSA9IGNoYXJjb2RlOworCisgICAgICBpZiAodGhpcy5jTWFwICYmIHRoaXMuY01hcC5jb250YWlucyhjaGFyY29kZSkpIHsKKyAgICAgICAgd2lkdGhDb2RlID0gdGhpcy5jTWFwLmxvb2t1cChjaGFyY29kZSk7CisgICAgICB9CisKKyAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbd2lkdGhDb2RlXTsKKyAgICAgIHdpZHRoID0gKDAsIF91dGlsLmlzTnVtKSh3aWR0aCkgPyB3aWR0aCA6IHRoaXMuZGVmYXVsdFdpZHRoOworICAgICAgdmFyIHZtZXRyaWMgPSB0aGlzLnZtZXRyaWNzICYmIHRoaXMudm1ldHJpY3Nbd2lkdGhDb2RlXTsKKyAgICAgIGxldCB1bmljb2RlID0gdGhpcy50b1VuaWNvZGUuZ2V0KGNoYXJjb2RlKSB8fCB0aGlzLmZhbGxiYWNrVG9Vbmljb2RlLmdldChjaGFyY29kZSkgfHwgY2hhcmNvZGU7CisKKyAgICAgIGlmICh0eXBlb2YgdW5pY29kZSA9PT0gIm51bWJlciIpIHsKKyAgICAgICAgdW5pY29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7CisgICAgICB9CisKKyAgICAgIHZhciBpc0luRm9udCA9IChjaGFyY29kZSBpbiB0aGlzLnRvRm9udENoYXIpOworICAgICAgZm9udENoYXJDb2RlID0gdGhpcy50b0ZvbnRDaGFyW2NoYXJjb2RlXSB8fCBjaGFyY29kZTsKKworICAgICAgaWYgKHRoaXMubWlzc2luZ0ZpbGUpIHsKKyAgICAgICAgY29uc3QgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyY29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhcmNvZGVdOworCisgICAgICAgIGlmICgoZ2x5cGhOYW1lID09PSAiLm5vdGRlZiIgfHwgZ2x5cGhOYW1lID09PSAiIikgJiYgdGhpcy50eXBlID09PSAiVHlwZTEiKSB7CisgICAgICAgICAgZm9udENoYXJDb2RlID0gMHgyMDsKKyAgICAgICAgfQorCisgICAgICAgIGZvbnRDaGFyQ29kZSA9ICgwLCBfdW5pY29kZS5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcykoZm9udENoYXJDb2RlKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuaXNUeXBlM0ZvbnQpIHsKKyAgICAgICAgb3BlcmF0b3JMaXN0SWQgPSBmb250Q2hhckNvZGU7CisgICAgICB9CisKKyAgICAgIHZhciBhY2NlbnQgPSBudWxsOworCisgICAgICBpZiAodGhpcy5zZWFjTWFwICYmIHRoaXMuc2VhY01hcFtjaGFyY29kZV0pIHsKKyAgICAgICAgaXNJbkZvbnQgPSB0cnVlOworICAgICAgICB2YXIgc2VhYyA9IHRoaXMuc2VhY01hcFtjaGFyY29kZV07CisgICAgICAgIGZvbnRDaGFyQ29kZSA9IHNlYWMuYmFzZUZvbnRDaGFyQ29kZTsKKyAgICAgICAgYWNjZW50ID0geworICAgICAgICAgIGZvbnRDaGFyOiBTdHJpbmcuZnJvbUNvZGVQb2ludChzZWFjLmFjY2VudEZvbnRDaGFyQ29kZSksCisgICAgICAgICAgb2Zmc2V0OiBzZWFjLmFjY2VudE9mZnNldAorICAgICAgICB9OworICAgICAgfQorCisgICAgICBsZXQgZm9udENoYXIgPSAiIjsKKworICAgICAgaWYgKHR5cGVvZiBmb250Q2hhckNvZGUgPT09ICJudW1iZXIiKSB7CisgICAgICAgIGlmIChmb250Q2hhckNvZGUgPD0gMHgxMGZmZmYpIHsKKyAgICAgICAgICBmb250Q2hhciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGZvbnRDaGFyQ29kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBjaGFyVG9HbHlwaCAtIGludmFsaWQgZm9udENoYXJDb2RlOiAke2ZvbnRDaGFyQ29kZX1gKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdseXBoQ2FjaGVbY2hhcmNvZGVdOworCisgICAgICBpZiAoIWdseXBoIHx8ICFnbHlwaC5tYXRjaGVzRm9yQ2FjaGUoZm9udENoYXIsIHVuaWNvZGUsIGFjY2VudCwgd2lkdGgsIHZtZXRyaWMsIG9wZXJhdG9yTGlzdElkLCBpc1NwYWNlLCBpc0luRm9udCkpIHsKKyAgICAgICAgZ2x5cGggPSBuZXcgR2x5cGgoZm9udENoYXIsIHVuaWNvZGUsIGFjY2VudCwgd2lkdGgsIHZtZXRyaWMsIG9wZXJhdG9yTGlzdElkLCBpc1NwYWNlLCBpc0luRm9udCk7CisgICAgICAgIHRoaXMuZ2x5cGhDYWNoZVtjaGFyY29kZV0gPSBnbHlwaDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGdseXBoOworICAgIH0sCisgICAgY2hhcnNUb0dseXBoczogZnVuY3Rpb24gRm9udF9jaGFyc1RvR2x5cGhzKGNoYXJzKSB7CisgICAgICB2YXIgY2hhcnNDYWNoZSA9IHRoaXMuY2hhcnNDYWNoZTsKKyAgICAgIHZhciBnbHlwaHMsIGdseXBoLCBjaGFyY29kZTsKKworICAgICAgaWYgKGNoYXJzQ2FjaGUpIHsKKyAgICAgICAgZ2x5cGhzID0gY2hhcnNDYWNoZVtjaGFyc107CisKKyAgICAgICAgaWYgKGdseXBocykgeworICAgICAgICAgIHJldHVybiBnbHlwaHM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCFjaGFyc0NhY2hlKSB7CisgICAgICAgIGNoYXJzQ2FjaGUgPSB0aGlzLmNoYXJzQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgfQorCisgICAgICBnbHlwaHMgPSBbXTsKKyAgICAgIHZhciBjaGFyc0NhY2hlS2V5ID0gY2hhcnM7CisgICAgICB2YXIgaSA9IDAsCisgICAgICAgICAgaWk7CisKKyAgICAgIGlmICh0aGlzLmNNYXApIHsKKyAgICAgICAgdmFyIGMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICAgIHdoaWxlIChpIDwgY2hhcnMubGVuZ3RoKSB7CisgICAgICAgICAgdGhpcy5jTWFwLnJlYWRDaGFyQ29kZShjaGFycywgaSwgYyk7CisgICAgICAgICAgY2hhcmNvZGUgPSBjLmNoYXJjb2RlOworICAgICAgICAgIHZhciBsZW5ndGggPSBjLmxlbmd0aDsKKyAgICAgICAgICBpICs9IGxlbmd0aDsKKyAgICAgICAgICB2YXIgaXNTcGFjZSA9IGxlbmd0aCA9PT0gMSAmJiBjaGFycy5jaGFyQ29kZUF0KGkgLSAxKSA9PT0gMHgyMDsKKyAgICAgICAgICBnbHlwaCA9IHRoaXMuY2hhclRvR2x5cGgoY2hhcmNvZGUsIGlzU3BhY2UpOworICAgICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSBjaGFycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgY2hhcmNvZGUgPSBjaGFycy5jaGFyQ29kZUF0KGkpOworICAgICAgICAgIGdseXBoID0gdGhpcy5jaGFyVG9HbHlwaChjaGFyY29kZSwgY2hhcmNvZGUgPT09IDB4MjApOworICAgICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gY2hhcnNDYWNoZVtjaGFyc0NhY2hlS2V5XSA9IGdseXBoczsKKyAgICB9LAorCisgICAgZ2V0IGdseXBoQ2FjaGVWYWx1ZXMoKSB7CisgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmdseXBoQ2FjaGUpOworICAgIH0KKworICB9OworICByZXR1cm4gRm9udDsKK30oKTsKKworZXhwb3J0cy5Gb250ID0gRm9udDsKKwordmFyIEVycm9yRm9udCA9IGZ1bmN0aW9uIEVycm9yRm9udENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEVycm9yRm9udChlcnJvcikgeworICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKKyAgICB0aGlzLmxvYWRlZE5hbWUgPSAiZ19mb250X2Vycm9yIjsKKyAgICB0aGlzLm1pc3NpbmdGaWxlID0gdHJ1ZTsKKyAgfQorCisgIEVycm9yRm9udC5wcm90b3R5cGUgPSB7CisgICAgY2hhcnNUb0dseXBoczogZnVuY3Rpb24gRXJyb3JGb250X2NoYXJzVG9HbHlwaHMoKSB7CisgICAgICByZXR1cm4gW107CisgICAgfSwKKworICAgIGV4cG9ydERhdGEoZXh0cmFQcm9wZXJ0aWVzID0gZmFsc2UpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIGVycm9yOiB0aGlzLmVycm9yCisgICAgICB9OworICAgIH0KKworICB9OworICByZXR1cm4gRXJyb3JGb250OworfSgpOworCitleHBvcnRzLkVycm9yRm9udCA9IEVycm9yRm9udDsKKworZnVuY3Rpb24gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhOYW1lcykgeworICB2YXIgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB2YXIgZ2x5cGhJZCwgY2hhckNvZGUsIGJhc2VFbmNvZGluZzsKKyAgdmFyIGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CisKKyAgaWYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSkgeworICAgIGJhc2VFbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOworCisgICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgeworICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKKworICAgICAgaWYgKGdseXBoSWQgPj0gMCkgeworICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoaXNTeW1ib2xpY0ZvbnQpIHsKKyAgICBmb3IgKGNoYXJDb2RlIGluIGJ1aWx0SW5FbmNvZGluZykgeworICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gYnVpbHRJbkVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYmFzZUVuY29kaW5nID0gX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nOworCisgICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgeworICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKKworICAgICAgaWYgKGdseXBoSWQgPj0gMCkgeworICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2YXIgZGlmZmVyZW5jZXMgPSBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzLAorICAgICAgZ2x5cGhzVW5pY29kZU1hcDsKKworICBpZiAoZGlmZmVyZW5jZXMpIHsKKyAgICBmb3IgKGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzKSB7CisgICAgICB2YXIgZ2x5cGhOYW1lID0gZGlmZmVyZW5jZXNbY2hhckNvZGVdOworICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihnbHlwaE5hbWUpOworCisgICAgICBpZiAoZ2x5cGhJZCA9PT0gLTEpIHsKKyAgICAgICAgaWYgKCFnbHlwaHNVbmljb2RlTWFwKSB7CisgICAgICAgICAgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3RhbmRhcmRHbHlwaE5hbWUgPSByZWNvdmVyR2x5cGhOYW1lKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CisKKyAgICAgICAgaWYgKHN0YW5kYXJkR2x5cGhOYW1lICE9PSBnbHlwaE5hbWUpIHsKKyAgICAgICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKHN0YW5kYXJkR2x5cGhOYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKK30KKwordmFyIFR5cGUxRm9udCA9IGZ1bmN0aW9uIFR5cGUxRm9udENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGZpbmRCbG9jayhzdHJlYW1CeXRlcywgc2lnbmF0dXJlLCBzdGFydEluZGV4KSB7CisgICAgdmFyIHN0cmVhbUJ5dGVzTGVuZ3RoID0gc3RyZWFtQnl0ZXMubGVuZ3RoOworICAgIHZhciBzaWduYXR1cmVMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOworICAgIHZhciBzY2FuTGVuZ3RoID0gc3RyZWFtQnl0ZXNMZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7CisgICAgdmFyIGkgPSBzdGFydEluZGV4LAorICAgICAgICBqLAorICAgICAgICBmb3VuZCA9IGZhbHNlOworCisgICAgd2hpbGUgKGkgPCBzY2FuTGVuZ3RoKSB7CisgICAgICBqID0gMDsKKworICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc3RyZWFtQnl0ZXNbaSArIGpdID09PSBzaWduYXR1cmVbal0pIHsKKyAgICAgICAgaisrOworICAgICAgfQorCisgICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKKyAgICAgICAgaSArPSBqOworCisgICAgICAgIHdoaWxlIChpIDwgc3RyZWFtQnl0ZXNMZW5ndGggJiYgKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoc3RyZWFtQnl0ZXNbaV0pKSB7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBmb3VuZCwKKyAgICAgIGxlbmd0aDogaQorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBnZXRIZWFkZXJCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgeworICAgIHZhciBFRVhFQ19TSUdOQVRVUkUgPSBbMHg2NSwgMHg2NSwgMHg3OCwgMHg2NSwgMHg2M107CisgICAgdmFyIHN0cmVhbVN0YXJ0UG9zID0gc3RyZWFtLnBvczsKKyAgICB2YXIgaGVhZGVyQnl0ZXMsIGhlYWRlckJ5dGVzTGVuZ3RoLCBibG9jazsKKworICAgIHRyeSB7CisgICAgICBoZWFkZXJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcyhzdWdnZXN0ZWRMZW5ndGgpOworICAgICAgaGVhZGVyQnl0ZXNMZW5ndGggPSBoZWFkZXJCeXRlcy5sZW5ndGg7CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorICAgIH0KKworICAgIGlmIChoZWFkZXJCeXRlc0xlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7CisgICAgICBibG9jayA9IGZpbmRCbG9jayhoZWFkZXJCeXRlcywgRUVYRUNfU0lHTkFUVVJFLCBzdWdnZXN0ZWRMZW5ndGggLSAyICogRUVYRUNfU0lHTkFUVVJFLmxlbmd0aCk7CisKKyAgICAgIGlmIChibG9jay5mb3VuZCAmJiBibG9jay5sZW5ndGggPT09IHN1Z2dlc3RlZExlbmd0aCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyZWFtKGhlYWRlckJ5dGVzKSwKKyAgICAgICAgICBsZW5ndGg6IHN1Z2dlc3RlZExlbmd0aAorICAgICAgICB9OworICAgICAgfQorICAgIH0KKworICAgICgwLCBfdXRpbC53YXJuKSgnSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKKyAgICBzdHJlYW0ucG9zID0gc3RyZWFtU3RhcnRQb3M7CisgICAgdmFyIFNDQU5fQkxPQ0tfTEVOR1RIID0gMjA0ODsKKyAgICB2YXIgYWN0dWFsTGVuZ3RoOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBzY2FuQnl0ZXMgPSBzdHJlYW0ucGVla0J5dGVzKFNDQU5fQkxPQ0tfTEVOR1RIKTsKKyAgICAgIGJsb2NrID0gZmluZEJsb2NrKHNjYW5CeXRlcywgRUVYRUNfU0lHTkFUVVJFLCAwKTsKKworICAgICAgaWYgKGJsb2NrLmxlbmd0aCA9PT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3RyZWFtLnBvcyArPSBibG9jay5sZW5ndGg7CisKKyAgICAgIGlmIChibG9jay5mb3VuZCkgeworICAgICAgICBhY3R1YWxMZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RyZWFtU3RhcnRQb3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsKKworICAgIGlmIChhY3R1YWxMZW5ndGgpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyZWFtKHN0cmVhbS5nZXRCeXRlcyhhY3R1YWxMZW5ndGgpKSwKKyAgICAgICAgbGVuZ3RoOiBhY3R1YWxMZW5ndGgKKyAgICAgIH07CisgICAgfQorCisgICAgKDAsIF91dGlsLndhcm4pKCdVbmFibGUgdG8gcmVjb3ZlciAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB1c2luZyBhcyBpcy4nKTsKKyAgICByZXR1cm4geworICAgICAgc3RyZWFtOiBuZXcgX3N0cmVhbS5TdHJlYW0oc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCkpLAorICAgICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0RWV4ZWNCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgeworICAgIHZhciBlZXhlY0J5dGVzID0gc3RyZWFtLmdldEJ5dGVzKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyZWFtKGVleGVjQnl0ZXMpLAorICAgICAgbGVuZ3RoOiBlZXhlY0J5dGVzLmxlbmd0aAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBUeXBlMUZvbnQobmFtZSwgZmlsZSwgcHJvcGVydGllcykgeworICAgIHZhciBQRkJfSEVBREVSX1NJWkUgPSA2OworICAgIHZhciBoZWFkZXJCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMTsKKyAgICB2YXIgZWV4ZWNCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMjsKKyAgICB2YXIgcGZiSGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoUEZCX0hFQURFUl9TSVpFKTsKKyAgICB2YXIgcGZiSGVhZGVyUHJlc2VudCA9IHBmYkhlYWRlclswXSA9PT0gMHg4MCAmJiBwZmJIZWFkZXJbMV0gPT09IDB4MDE7CisKKyAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkgeworICAgICAgZmlsZS5za2lwKFBGQl9IRUFERVJfU0laRSk7CisgICAgICBoZWFkZXJCbG9ja0xlbmd0aCA9IHBmYkhlYWRlcls1XSA8PCAyNCB8IHBmYkhlYWRlcls0XSA8PCAxNiB8IHBmYkhlYWRlclszXSA8PCA4IHwgcGZiSGVhZGVyWzJdOworICAgIH0KKworICAgIHZhciBoZWFkZXJCbG9jayA9IGdldEhlYWRlckJsb2NrKGZpbGUsIGhlYWRlckJsb2NrTGVuZ3RoKTsKKyAgICB2YXIgaGVhZGVyQmxvY2tQYXJzZXIgPSBuZXcgX3R5cGUxX3BhcnNlci5UeXBlMVBhcnNlcihoZWFkZXJCbG9jay5zdHJlYW0sIGZhbHNlLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOworICAgIGhlYWRlckJsb2NrUGFyc2VyLmV4dHJhY3RGb250SGVhZGVyKHByb3BlcnRpZXMpOworCisgICAgaWYgKHBmYkhlYWRlclByZXNlbnQpIHsKKyAgICAgIHBmYkhlYWRlciA9IGZpbGUuZ2V0Qnl0ZXMoUEZCX0hFQURFUl9TSVpFKTsKKyAgICAgIGVleGVjQmxvY2tMZW5ndGggPSBwZmJIZWFkZXJbNV0gPDwgMjQgfCBwZmJIZWFkZXJbNF0gPDwgMTYgfCBwZmJIZWFkZXJbM10gPDwgOCB8IHBmYkhlYWRlclsyXTsKKyAgICB9CisKKyAgICB2YXIgZWV4ZWNCbG9jayA9IGdldEVleGVjQmxvY2soZmlsZSwgZWV4ZWNCbG9ja0xlbmd0aCk7CisgICAgdmFyIGVleGVjQmxvY2tQYXJzZXIgPSBuZXcgX3R5cGUxX3BhcnNlci5UeXBlMVBhcnNlcihlZXhlY0Jsb2NrLnN0cmVhbSwgdHJ1ZSwgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKKyAgICB2YXIgZGF0YSA9IGVleGVjQmxvY2tQYXJzZXIuZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpOworCisgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YS5wcm9wZXJ0aWVzKSB7CisgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBkYXRhLnByb3BlcnRpZXNba2V5XTsKKyAgICB9CisKKyAgICB2YXIgY2hhcnN0cmluZ3MgPSBkYXRhLmNoYXJzdHJpbmdzOworICAgIHZhciB0eXBlMkNoYXJzdHJpbmdzID0gdGhpcy5nZXRUeXBlMkNoYXJzdHJpbmdzKGNoYXJzdHJpbmdzKTsKKyAgICB2YXIgc3VicnMgPSB0aGlzLmdldFR5cGUyU3VicnMoZGF0YS5zdWJycyk7CisgICAgdGhpcy5jaGFyc3RyaW5ncyA9IGNoYXJzdHJpbmdzOworICAgIHRoaXMuZGF0YSA9IHRoaXMud3JhcChuYW1lLCB0eXBlMkNoYXJzdHJpbmdzLCB0aGlzLmNoYXJzdHJpbmdzLCBzdWJycywgcHJvcGVydGllcyk7CisgICAgdGhpcy5zZWFjcyA9IHRoaXMuZ2V0U2VhY3MoZGF0YS5jaGFyc3RyaW5ncyk7CisgIH0KKworICBUeXBlMUZvbnQucHJvdG90eXBlID0geworICAgIGdldCBudW1HbHlwaHMoKSB7CisgICAgICByZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggKyAxOworICAgIH0sCisKKyAgICBnZXRDaGFyc2V0OiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0Q2hhcnNldCgpIHsKKyAgICAgIHZhciBjaGFyc2V0ID0gWyIubm90ZGVmIl07CisgICAgICB2YXIgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzOworCisgICAgICBmb3IgKHZhciBnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CisgICAgICAgIGNoYXJzZXQucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2hhcnNldDsKKyAgICB9LAorICAgIGdldEdseXBoTWFwcGluZzogZnVuY3Rpb24gVHlwZTFGb250X2dldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKSB7CisgICAgICB2YXIgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzOworCisgICAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKKyAgICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICAgIGZvciAobGV0IGdseXBoSWQgPSAwLCBjaGFyc3RyaW5nc0xlbiA9IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzTGVuOyBnbHlwaElkKyspIHsKKyAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGdseXBoSWQpOworICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQgKyAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOworICAgICAgfQorCisgICAgICB2YXIgZ2x5cGhOYW1lcyA9IFsiLm5vdGRlZiJdLAorICAgICAgICAgIGdseXBoSWQ7CisKKyAgICAgIGZvciAoZ2x5cGhJZCA9IDA7IGdseXBoSWQgPCBjaGFyc3RyaW5ncy5sZW5ndGg7IGdseXBoSWQrKykgeworICAgICAgICBnbHlwaE5hbWVzLnB1c2goY2hhcnN0cmluZ3NbZ2x5cGhJZF0uZ2x5cGhOYW1lKTsKKyAgICAgIH0KKworICAgICAgdmFyIGVuY29kaW5nID0gcHJvcGVydGllcy5idWlsdEluRW5jb2Rpbmc7CisKKyAgICAgIGlmIChlbmNvZGluZykgeworICAgICAgICB2YXIgYnVpbHRJbkVuY29kaW5nID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBlbmNvZGluZykgeworICAgICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoZW5jb2RpbmdbY2hhckNvZGVdKTsKKworICAgICAgICAgIGlmIChnbHlwaElkID49IDApIHsKKyAgICAgICAgICAgIGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhOYW1lcyk7CisgICAgfSwKKyAgICBoYXNHbHlwaElkOiBmdW5jdGlvbiBUeXBlMUZvbnRfaGFzR2x5cGhJRChpZCkgeworICAgICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLm51bUdseXBocykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChpZCA9PT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdmFyIGdseXBoID0gdGhpcy5jaGFyc3RyaW5nc1tpZCAtIDFdOworICAgICAgcmV0dXJuIGdseXBoLmNoYXJzdHJpbmcubGVuZ3RoID4gMDsKKyAgICB9LAorICAgIGdldFNlYWNzOiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0U2VhY3MoY2hhcnN0cmluZ3MpIHsKKyAgICAgIHZhciBpLCBpaTsKKyAgICAgIHZhciBzZWFjTWFwID0gW107CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gY2hhcnN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgY2hhcnN0cmluZyA9IGNoYXJzdHJpbmdzW2ldOworCisgICAgICAgIGlmIChjaGFyc3RyaW5nLnNlYWMpIHsKKyAgICAgICAgICBzZWFjTWFwW2kgKyAxXSA9IGNoYXJzdHJpbmcuc2VhYzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gc2VhY01hcDsKKyAgICB9LAorICAgIGdldFR5cGUyQ2hhcnN0cmluZ3M6IGZ1bmN0aW9uIFR5cGUxRm9udF9nZXRUeXBlMkNoYXJzdHJpbmdzKHR5cGUxQ2hhcnN0cmluZ3MpIHsKKyAgICAgIHZhciB0eXBlMkNoYXJzdHJpbmdzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHR5cGUxQ2hhcnN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB0eXBlMkNoYXJzdHJpbmdzLnB1c2godHlwZTFDaGFyc3RyaW5nc1tpXS5jaGFyc3RyaW5nKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHR5cGUyQ2hhcnN0cmluZ3M7CisgICAgfSwKKyAgICBnZXRUeXBlMlN1YnJzOiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0VHlwZTJTdWJycyh0eXBlMVN1YnJzKSB7CisgICAgICB2YXIgYmlhcyA9IDA7CisgICAgICB2YXIgY291bnQgPSB0eXBlMVN1YnJzLmxlbmd0aDsKKworICAgICAgaWYgKGNvdW50IDwgMTEzMykgeworICAgICAgICBiaWFzID0gMTA3OworICAgICAgfSBlbHNlIGlmIChjb3VudCA8IDMzNzY5KSB7CisgICAgICAgIGJpYXMgPSAxMTMxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmlhcyA9IDMyNzY4OworICAgICAgfQorCisgICAgICB2YXIgdHlwZTJTdWJycyA9IFtdOworICAgICAgdmFyIGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBiaWFzOyBpKyspIHsKKyAgICAgICAgdHlwZTJTdWJycy5wdXNoKFsweDBiXSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHR5cGUyU3VicnMucHVzaCh0eXBlMVN1YnJzW2ldKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHR5cGUyU3VicnM7CisgICAgfSwKKyAgICB3cmFwOiBmdW5jdGlvbiBUeXBlMUZvbnRfd3JhcChuYW1lLCBnbHlwaHMsIGNoYXJzdHJpbmdzLCBzdWJycywgcHJvcGVydGllcykgeworICAgICAgdmFyIGNmZiA9IG5ldyBfY2ZmX3BhcnNlci5DRkYoKTsKKyAgICAgIGNmZi5oZWFkZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGSGVhZGVyKDEsIDAsIDQsIDQpOworICAgICAgY2ZmLm5hbWVzID0gW25hbWVdOworICAgICAgdmFyIHRvcERpY3QgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGVG9wRGljdCgpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoInZlcnNpb24iLCAzOTEpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIk5vdGljZSIsIDM5Mik7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRnVsbE5hbWUiLCAzOTMpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIkZhbWlseU5hbWUiLCAzOTQpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIldlaWdodCIsIDM5NSk7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRW5jb2RpbmciLCBudWxsKTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGb250TWF0cml4IiwgcHJvcGVydGllcy5mb250TWF0cml4KTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGb250QkJveCIsIHByb3BlcnRpZXMuYmJveCk7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiY2hhcnNldCIsIG51bGwpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIkNoYXJTdHJpbmdzIiwgbnVsbCk7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiUHJpdmF0ZSIsIG51bGwpOworICAgICAgY2ZmLnRvcERpY3QgPSB0b3BEaWN0OworICAgICAgdmFyIHN0cmluZ3MgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGU3RyaW5ncygpOworICAgICAgc3RyaW5ncy5hZGQoIlZlcnNpb24gMC4xMSIpOworICAgICAgc3RyaW5ncy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKTsKKyAgICAgIHN0cmluZ3MuYWRkKG5hbWUpOworICAgICAgc3RyaW5ncy5hZGQobmFtZSk7CisgICAgICBzdHJpbmdzLmFkZCgiTWVkaXVtIik7CisgICAgICBjZmYuc3RyaW5ncyA9IHN0cmluZ3M7CisgICAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gbmV3IF9jZmZfcGFyc2VyLkNGRkluZGV4KCk7CisgICAgICB2YXIgY291bnQgPSBnbHlwaHMubGVuZ3RoOworICAgICAgdmFyIGNoYXJzZXRBcnJheSA9IFsiLm5vdGRlZiJdOworICAgICAgdmFyIGksIGlpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBnbHlwaE5hbWUgPSBjaGFyc3RyaW5nc1tpXS5nbHlwaE5hbWU7CisKKyAgICAgICAgY29uc3QgaW5kZXggPSBfY2ZmX3BhcnNlci5DRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihnbHlwaE5hbWUpOworCisgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsKKyAgICAgICAgICBzdHJpbmdzLmFkZChnbHlwaE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgY2hhcnNldEFycmF5LnB1c2goZ2x5cGhOYW1lKTsKKyAgICAgIH0KKworICAgICAgY2ZmLmNoYXJzZXQgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ2hhcnNldChmYWxzZSwgMCwgY2hhcnNldEFycmF5KTsKKyAgICAgIHZhciBjaGFyU3RyaW5nc0luZGV4ID0gbmV3IF9jZmZfcGFyc2VyLkNGRkluZGV4KCk7CisgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChbMHg4YiwgMHgwZV0pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaHNbaV0pOworICAgICAgfQorCisgICAgICBjZmYuY2hhclN0cmluZ3MgPSBjaGFyU3RyaW5nc0luZGV4OworICAgICAgdmFyIHByaXZhdGVEaWN0ID0gbmV3IF9jZmZfcGFyc2VyLkNGRlByaXZhdGVEaWN0KCk7CisgICAgICBwcml2YXRlRGljdC5zZXRCeU5hbWUoIlN1YnJzIiwgbnVsbCk7CisgICAgICB2YXIgZmllbGRzID0gWyJCbHVlVmFsdWVzIiwgIk90aGVyQmx1ZXMiLCAiRmFtaWx5Qmx1ZXMiLCAiRmFtaWx5T3RoZXJCbHVlcyIsICJTdGVtU25hcEgiLCAiU3RlbVNuYXBWIiwgIkJsdWVTaGlmdCIsICJCbHVlRnV6eiIsICJCbHVlU2NhbGUiLCAiTGFuZ3VhZ2VHcm91cCIsICJFeHBhbnNpb25GYWN0b3IiLCAiRm9yY2VCb2xkIiwgIlN0ZEhXIiwgIlN0ZFZXIl07CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZmllbGRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldOworCisgICAgICAgIGlmICghKGZpZWxkIGluIHByb3BlcnRpZXMucHJpdmF0ZURhdGEpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2ZpZWxkXTsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gdmFsdWUubGVuZ3RoIC0gMTsgaiA+IDA7IGotLSkgeworICAgICAgICAgICAgdmFsdWVbal0gLT0gdmFsdWVbaiAtIDFdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZShmaWVsZCwgdmFsdWUpOworICAgICAgfQorCisgICAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OworICAgICAgdmFyIHN1YnJJbmRleCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZJbmRleCgpOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHN1YnJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgc3VickluZGV4LmFkZChzdWJyc1tpXSk7CisgICAgICB9CisKKyAgICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJySW5kZXg7CisgICAgICB2YXIgY29tcGlsZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIoY2ZmKTsKKyAgICAgIHJldHVybiBjb21waWxlci5jb21waWxlKCk7CisgICAgfQorICB9OworICByZXR1cm4gVHlwZTFGb250OworfSgpOworCit2YXIgQ0ZGRm9udCA9IGZ1bmN0aW9uIENGRkZvbnRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBDRkZGb250KGZpbGUsIHByb3BlcnRpZXMpIHsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICAgIHZhciBwYXJzZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKGZpbGUsIHByb3BlcnRpZXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgdGhpcy5jZmYgPSBwYXJzZXIucGFyc2UoKTsKKyAgICB0aGlzLmNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7CisgICAgdmFyIGNvbXBpbGVyID0gbmV3IF9jZmZfcGFyc2VyLkNGRkNvbXBpbGVyKHRoaXMuY2ZmKTsKKyAgICB0aGlzLnNlYWNzID0gdGhpcy5jZmYuc2VhY3M7CisKKyAgICB0cnkgeworICAgICAgdGhpcy5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiICsgcHJvcGVydGllcy5sb2FkZWROYW1lKTsKKyAgICAgIHRoaXMuZGF0YSA9IGZpbGU7CisgICAgfQorICB9CisKKyAgQ0ZGRm9udC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IG51bUdseXBocygpIHsKKyAgICAgIHJldHVybiB0aGlzLmNmZi5jaGFyU3RyaW5ncy5jb3VudDsKKyAgICB9LAorCisgICAgZ2V0Q2hhcnNldDogZnVuY3Rpb24gQ0ZGRm9udF9nZXRDaGFyc2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuY2ZmLmNoYXJzZXQuY2hhcnNldDsKKyAgICB9LAorICAgIGdldEdseXBoTWFwcGluZzogZnVuY3Rpb24gQ0ZGRm9udF9nZXRHbHlwaE1hcHBpbmcoKSB7CisgICAgICB2YXIgY2ZmID0gdGhpcy5jZmY7CisgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKKyAgICAgIHZhciBjaGFyc2V0cyA9IGNmZi5jaGFyc2V0LmNoYXJzZXQ7CisgICAgICB2YXIgY2hhckNvZGVUb0dseXBoSWQ7CisgICAgICB2YXIgZ2x5cGhJZDsKKworICAgICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgbGV0IGNoYXJDb2RlOworCisgICAgICAgIGlmIChjZmYuaXNDSURGb250KSB7CisgICAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzZXRzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CisgICAgICAgICAgICB2YXIgY2lkID0gY2hhcnNldHNbZ2x5cGhJZF07CisgICAgICAgICAgICBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGNpZCk7CisgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGdseXBoSWQgPSAwOyBnbHlwaElkIDwgY2ZmLmNoYXJTdHJpbmdzLmNvdW50OyBnbHlwaElkKyspIHsKKyAgICAgICAgICAgIGNoYXJDb2RlID0gcHJvcGVydGllcy5jTWFwLmNoYXJDb2RlT2YoZ2x5cGhJZCk7CisgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKKyAgICAgIH0KKworICAgICAgdmFyIGVuY29kaW5nID0gY2ZmLmVuY29kaW5nID8gY2ZmLmVuY29kaW5nLmVuY29kaW5nIDogbnVsbDsKKyAgICAgIGNoYXJDb2RlVG9HbHlwaElkID0gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGVuY29kaW5nLCBjaGFyc2V0cyk7CisgICAgICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7CisgICAgfSwKKyAgICBoYXNHbHlwaElkOiBmdW5jdGlvbiBDRkZGb250X2hhc0dseXBoSUQoaWQpIHsKKyAgICAgIHJldHVybiB0aGlzLmNmZi5oYXNHbHlwaElkKGlkKTsKKyAgICB9CisgIH07CisgIHJldHVybiBDRkZGb250OworfSgpOworCisvKioqLyB9KSwKKy8qIDMxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQ0ZGRkRTZWxlY3QgPSBleHBvcnRzLkNGRkNvbXBpbGVyID0gZXhwb3J0cy5DRkZQcml2YXRlRGljdCA9IGV4cG9ydHMuQ0ZGVG9wRGljdCA9IGV4cG9ydHMuQ0ZGQ2hhcnNldCA9IGV4cG9ydHMuQ0ZGSW5kZXggPSBleHBvcnRzLkNGRlN0cmluZ3MgPSBleHBvcnRzLkNGRkhlYWRlciA9IGV4cG9ydHMuQ0ZGID0gZXhwb3J0cy5DRkZQYXJzZXIgPSBleHBvcnRzLkNGRlN0YW5kYXJkU3RyaW5ncyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9jaGFyc2V0cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzIpOworCit2YXIgX2VuY29kaW5ncyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpOworCit2YXIgTUFYX1NVQlJfTkVTVElORyA9IDEwOwordmFyIENGRlN0YW5kYXJkU3RyaW5ncyA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVyaWdodCIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAicXVvdGVsZWZ0IiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZW5kYXNoIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAicGFyYWdyYXBoIiwgImJ1bGxldCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicXVvdGVkYmxyaWdodCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJwZXJ0aG91c2FuZCIsICJxdWVzdGlvbmRvd24iLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICJBRSIsICJvcmRmZW1pbmluZSIsICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICJhZSIsICJkb3RsZXNzaSIsICJsc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLCAib25lc3VwZXJpb3IiLCAibG9naWNhbG5vdCIsICJtdSIsICJ0cmFkZW1hcmsiLCAiRXRoIiwgIm9uZWhhbGYiLCAicGx1c21pbnVzIiwgIlRob3JuIiwgIm9uZXF1YXJ0ZXIiLCAiZGl2aWRlIiwgImJyb2tlbmJhciIsICJkZWdyZWUiLCAidGhvcm4iLCAidGhyZWVxdWFydGVycyIsICJ0d29zdXBlcmlvciIsICJyZWdpc3RlcmVkIiwgIm1pbnVzIiwgImV0aCIsICJtdWx0aXBseSIsICJ0aHJlZXN1cGVyaW9yIiwgImNvcHlyaWdodCIsICJBYWN1dGUiLCAiQWNpcmN1bWZsZXgiLCAiQWRpZXJlc2lzIiwgIkFncmF2ZSIsICJBcmluZyIsICJBdGlsZGUiLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIkVjaXJjdW1mbGV4IiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiTnRpbGRlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJPZGllcmVzaXMiLCAiT2dyYXZlIiwgIk90aWxkZSIsICJTY2Fyb24iLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVkaWVyZXNpcyIsICJVZ3JhdmUiLCAiWWFjdXRlIiwgIllkaWVyZXNpcyIsICJaY2Fyb24iLCAiYWFjdXRlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhZ3JhdmUiLCAiYXJpbmciLCAiYXRpbGRlIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiZWdyYXZlIiwgImlhY3V0ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAiaWdyYXZlIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm9ncmF2ZSIsICJvdGlsZGUiLCAic2Nhcm9uIiwgInVhY3V0ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAidWdyYXZlIiwgInlhY3V0ZSIsICJ5ZGllcmVzaXMiLCAiemNhcm9uIiwgImV4Y2xhbXNtYWxsIiwgIkh1bmdhcnVtbGF1dHNtYWxsIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgImFtcGVyc2FuZHNtYWxsIiwgIkFjdXRlc21hbGwiLCAicGFyZW5sZWZ0c3VwZXJpb3IiLCAicGFyZW5yaWdodHN1cGVyaW9yIiwgInR3b2RvdGVubGVhZGVyIiwgIm9uZWRvdGVubGVhZGVyIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb21tYXN1cGVyaW9yIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAicGVyaW9kc3VwZXJpb3IiLCAicXVlc3Rpb25zbWFsbCIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgImlzdXBlcmlvciIsICJsc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJ0c3VwZXJpb3IiLCAiZmYiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbnN1cGVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICJleGNsYW1kb3duc21hbGwiLCAiY2VudG9sZHN0eWxlIiwgIkxzbGFzaHNtYWxsIiwgIlNjYXJvbnNtYWxsIiwgIlpjYXJvbnNtYWxsIiwgIkRpZXJlc2lzc21hbGwiLCAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIkRvdGFjY2VudHNtYWxsIiwgIk1hY3JvbnNtYWxsIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuaW5mZXJpb3IiLCAiT2dvbmVrc21hbGwiLCAiUmluZ3NtYWxsIiwgIkNlZGlsbGFzbWFsbCIsICJxdWVzdGlvbmRvd25zbWFsbCIsICJvbmVlaWdodGgiLCAidGhyZWVlaWdodGhzIiwgImZpdmVlaWdodGhzIiwgInNldmVuZWlnaHRocyIsICJvbmV0aGlyZCIsICJ0d290aGlyZHMiLCAiemVyb3N1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkFFc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklncmF2ZXNtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiRXRoc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCIsICIwMDEuMDAwIiwgIjAwMS4wMDEiLCAiMDAxLjAwMiIsICIwMDEuMDAzIiwgIkJsYWNrIiwgIkJvbGQiLCAiQm9vayIsICJMaWdodCIsICJNZWRpdW0iLCAiUmVndWxhciIsICJSb21hbiIsICJTZW1pYm9sZCJdOworZXhwb3J0cy5DRkZTdGFuZGFyZFN0cmluZ3MgPSBDRkZTdGFuZGFyZFN0cmluZ3M7Citjb25zdCBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1MgPSAzOTE7CisKK3ZhciBDRkZQYXJzZXIgPSBmdW5jdGlvbiBDRkZQYXJzZXJDbG9zdXJlKCkgeworICB2YXIgQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhID0gW251bGwsIHsKKyAgICBpZDogImhzdGVtIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKKyAgICBzdGVtOiB0cnVlCisgIH0sIG51bGwsIHsKKyAgICBpZDogInZzdGVtIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKKyAgICBzdGVtOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInZtb3ZldG8iLAorICAgIG1pbjogMSwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInJsaW5ldG8iLAorICAgIG1pbjogMiwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImhsaW5ldG8iLAorICAgIG1pbjogMSwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInZsaW5ldG8iLAorICAgIG1pbjogMSwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInJyY3VydmV0byIsCisgICAgbWluOiA2LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgbnVsbCwgeworICAgIGlkOiAiY2FsbHN1YnIiLAorICAgIG1pbjogMSwKKyAgICB1bmRlZlN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInJldHVybiIsCisgICAgbWluOiAwLAorICAgIHVuZGVmU3RhY2s6IHRydWUKKyAgfSwgbnVsbCwgbnVsbCwgeworICAgIGlkOiAiZW5kY2hhciIsCisgICAgbWluOiAwLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUKKyAgfSwgbnVsbCwgbnVsbCwgbnVsbCwgeworICAgIGlkOiAiaHN0ZW1obSIsCisgICAgbWluOiAyLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUsCisgICAgc3RlbTogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJoaW50bWFzayIsCisgICAgbWluOiAwLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUKKyAgfSwgeworICAgIGlkOiAiY250cm1hc2siLAorICAgIG1pbjogMCwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInJtb3ZldG8iLAorICAgIG1pbjogMiwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImhtb3ZldG8iLAorICAgIG1pbjogMSwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInZzdGVtaG0iLAorICAgIG1pbjogMiwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlLAorICAgIHN0ZW06IHRydWUKKyAgfSwgeworICAgIGlkOiAicmN1cnZlbGluZSIsCisgICAgbWluOiA4LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAicmxpbmVjdXJ2ZSIsCisgICAgbWluOiA4LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAidnZjdXJ2ZXRvIiwKKyAgICBtaW46IDQsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJoaGN1cnZldG8iLAorICAgIG1pbjogNCwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIG51bGwsIHsKKyAgICBpZDogImNhbGxnc3ViciIsCisgICAgbWluOiAxLAorICAgIHVuZGVmU3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAidmhjdXJ2ZXRvIiwKKyAgICBtaW46IDQsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJodmN1cnZldG8iLAorICAgIG1pbjogNCwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH1dOworICB2YXIgQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhMTIgPSBbbnVsbCwgbnVsbCwgbnVsbCwgeworICAgIGlkOiAiYW5kIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogLTEKKyAgfSwgeworICAgIGlkOiAib3IiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAtMQorICB9LCB7CisgICAgaWQ6ICJub3QiLAorICAgIG1pbjogMSwKKyAgICBzdGFja0RlbHRhOiAwCisgIH0sIG51bGwsIG51bGwsIG51bGwsIHsKKyAgICBpZDogImFicyIsCisgICAgbWluOiAxLAorICAgIHN0YWNrRGVsdGE6IDAKKyAgfSwgeworICAgIGlkOiAiYWRkIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogLTEsCisgICAgc3RhY2tGbjogZnVuY3Rpb24gc3RhY2tfZGl2KHN0YWNrLCBpbmRleCkgeworICAgICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKyBzdGFja1tpbmRleCAtIDFdOworICAgIH0KKyAgfSwgeworICAgIGlkOiAic3ViIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogLTEsCisgICAgc3RhY2tGbjogZnVuY3Rpb24gc3RhY2tfZGl2KHN0YWNrLCBpbmRleCkgeworICAgICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gLSBzdGFja1tpbmRleCAtIDFdOworICAgIH0KKyAgfSwgeworICAgIGlkOiAiZGl2IiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogLTEsCisgICAgc3RhY2tGbjogZnVuY3Rpb24gc3RhY2tfZGl2KHN0YWNrLCBpbmRleCkgeworICAgICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gLyBzdGFja1tpbmRleCAtIDFdOworICAgIH0KKyAgfSwgbnVsbCwgeworICAgIGlkOiAibmVnIiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tEZWx0YTogMCwKKyAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7CisgICAgICBzdGFja1tpbmRleCAtIDFdID0gLXN0YWNrW2luZGV4IC0gMV07CisgICAgfQorICB9LCB7CisgICAgaWQ6ICJlcSIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IC0xCisgIH0sIG51bGwsIG51bGwsIHsKKyAgICBpZDogImRyb3AiLAorICAgIG1pbjogMSwKKyAgICBzdGFja0RlbHRhOiAtMQorICB9LCBudWxsLCB7CisgICAgaWQ6ICJwdXQiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAtMgorICB9LCB7CisgICAgaWQ6ICJnZXQiLAorICAgIG1pbjogMSwKKyAgICBzdGFja0RlbHRhOiAwCisgIH0sIHsKKyAgICBpZDogImlmZWxzZSIsCisgICAgbWluOiA0LAorICAgIHN0YWNrRGVsdGE6IC0zCisgIH0sIHsKKyAgICBpZDogInJhbmRvbSIsCisgICAgbWluOiAwLAorICAgIHN0YWNrRGVsdGE6IDEKKyAgfSwgeworICAgIGlkOiAibXVsIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogLTEsCisgICAgc3RhY2tGbjogZnVuY3Rpb24gc3RhY2tfZGl2KHN0YWNrLCBpbmRleCkgeworICAgICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKiBzdGFja1tpbmRleCAtIDFdOworICAgIH0KKyAgfSwgbnVsbCwgeworICAgIGlkOiAic3FydCIsCisgICAgbWluOiAxLAorICAgIHN0YWNrRGVsdGE6IDAKKyAgfSwgeworICAgIGlkOiAiZHVwIiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tEZWx0YTogMQorICB9LCB7CisgICAgaWQ6ICJleGNoIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogMAorICB9LCB7CisgICAgaWQ6ICJpbmRleCIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IDAKKyAgfSwgeworICAgIGlkOiAicm9sbCIsCisgICAgbWluOiAzLAorICAgIHN0YWNrRGVsdGE6IC0yCisgIH0sIG51bGwsIG51bGwsIG51bGwsIHsKKyAgICBpZDogImhmbGV4IiwKKyAgICBtaW46IDcsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJmbGV4IiwKKyAgICBtaW46IDEzLAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAiaGZsZXgxIiwKKyAgICBtaW46IDksCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJmbGV4MSIsCisgICAgbWluOiAxMSwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH1dOworCisgIGNsYXNzIENGRlBhcnNlciB7CisgICAgY29uc3RydWN0b3IoZmlsZSwgcHJvcGVydGllcywgc2VhY0FuYWx5c2lzRW5hYmxlZCkgeworICAgICAgdGhpcy5ieXRlcyA9IGZpbGUuZ2V0Qnl0ZXMoKTsKKyAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisgICAgICB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQgPSAhIXNlYWNBbmFseXNpc0VuYWJsZWQ7CisgICAgfQorCisgICAgcGFyc2UoKSB7CisgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKKyAgICAgIHZhciBjZmYgPSBuZXcgQ0ZGKCk7CisgICAgICB0aGlzLmNmZiA9IGNmZjsKKyAgICAgIHZhciBoZWFkZXIgPSB0aGlzLnBhcnNlSGVhZGVyKCk7CisgICAgICB2YXIgbmFtZUluZGV4ID0gdGhpcy5wYXJzZUluZGV4KGhlYWRlci5lbmRQb3MpOworICAgICAgdmFyIHRvcERpY3RJbmRleCA9IHRoaXMucGFyc2VJbmRleChuYW1lSW5kZXguZW5kUG9zKTsKKyAgICAgIHZhciBzdHJpbmdJbmRleCA9IHRoaXMucGFyc2VJbmRleCh0b3BEaWN0SW5kZXguZW5kUG9zKTsKKyAgICAgIHZhciBnbG9iYWxTdWJySW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoc3RyaW5nSW5kZXguZW5kUG9zKTsKKyAgICAgIHZhciB0b3BEaWN0UGFyc2VkID0gdGhpcy5wYXJzZURpY3QodG9wRGljdEluZGV4Lm9iai5nZXQoMCkpOworICAgICAgdmFyIHRvcERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdG9wRGljdFBhcnNlZCwgY2ZmLnN0cmluZ3MpOworICAgICAgY2ZmLmhlYWRlciA9IGhlYWRlci5vYmo7CisgICAgICBjZmYubmFtZXMgPSB0aGlzLnBhcnNlTmFtZUluZGV4KG5hbWVJbmRleC5vYmopOworICAgICAgY2ZmLnN0cmluZ3MgPSB0aGlzLnBhcnNlU3RyaW5nSW5kZXgoc3RyaW5nSW5kZXgub2JqKTsKKyAgICAgIGNmZi50b3BEaWN0ID0gdG9wRGljdDsKKyAgICAgIGNmZi5nbG9iYWxTdWJySW5kZXggPSBnbG9iYWxTdWJySW5kZXgub2JqOworICAgICAgdGhpcy5wYXJzZVByaXZhdGVEaWN0KGNmZi50b3BEaWN0KTsKKyAgICAgIGNmZi5pc0NJREZvbnQgPSB0b3BEaWN0Lmhhc05hbWUoIlJPUyIpOworICAgICAgdmFyIGNoYXJTdHJpbmdPZmZzZXQgPSB0b3BEaWN0LmdldEJ5TmFtZSgiQ2hhclN0cmluZ3MiKTsKKyAgICAgIHZhciBjaGFyU3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoY2hhclN0cmluZ09mZnNldCkub2JqOworICAgICAgdmFyIGZvbnRNYXRyaXggPSB0b3BEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpOworCisgICAgICBpZiAoZm9udE1hdHJpeCkgeworICAgICAgICBwcm9wZXJ0aWVzLmZvbnRNYXRyaXggPSBmb250TWF0cml4OworICAgICAgfQorCisgICAgICB2YXIgZm9udEJCb3ggPSB0b3BEaWN0LmdldEJ5TmFtZSgiRm9udEJCb3giKTsKKworICAgICAgaWYgKGZvbnRCQm94KSB7CisgICAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTsKKyAgICAgICAgcHJvcGVydGllcy5kZXNjZW50ID0gTWF0aC5taW4oZm9udEJCb3hbMV0sIGZvbnRCQm94WzNdKTsKKyAgICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlOworICAgICAgfQorCisgICAgICB2YXIgY2hhcnNldCwgZW5jb2Rpbmc7CisKKyAgICAgIGlmIChjZmYuaXNDSURGb250KSB7CisgICAgICAgIHZhciBmZEFycmF5SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdC5nZXRCeU5hbWUoIkZEQXJyYXkiKSkub2JqOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGZkQXJyYXlJbmRleC5jb3VudDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgICB2YXIgZGljdFJhdyA9IGZkQXJyYXlJbmRleC5nZXQoaSk7CisgICAgICAgICAgdmFyIGZvbnREaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlRvcERpY3QsIHRoaXMucGFyc2VEaWN0KGRpY3RSYXcpLCBjZmYuc3RyaW5ncyk7CisgICAgICAgICAgdGhpcy5wYXJzZVByaXZhdGVEaWN0KGZvbnREaWN0KTsKKyAgICAgICAgICBjZmYuZmRBcnJheS5wdXNoKGZvbnREaWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGVuY29kaW5nID0gbnVsbDsKKyAgICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCB0cnVlKTsKKyAgICAgICAgY2ZmLmZkU2VsZWN0ID0gdGhpcy5wYXJzZUZEU2VsZWN0KHRvcERpY3QuZ2V0QnlOYW1lKCJGRFNlbGVjdCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCBmYWxzZSk7CisgICAgICAgIGVuY29kaW5nID0gdGhpcy5wYXJzZUVuY29kaW5nKHRvcERpY3QuZ2V0QnlOYW1lKCJFbmNvZGluZyIpLCBwcm9wZXJ0aWVzLCBjZmYuc3RyaW5ncywgY2hhcnNldC5jaGFyc2V0KTsKKyAgICAgIH0KKworICAgICAgY2ZmLmNoYXJzZXQgPSBjaGFyc2V0OworICAgICAgY2ZmLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICB2YXIgY2hhclN0cmluZ3NBbmRTZWFjcyA9IHRoaXMucGFyc2VDaGFyU3RyaW5ncyh7CisgICAgICAgIGNoYXJTdHJpbmdzOiBjaGFyU3RyaW5nSW5kZXgsCisgICAgICAgIGxvY2FsU3VickluZGV4OiB0b3BEaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgsCisgICAgICAgIGdsb2JhbFN1YnJJbmRleDogZ2xvYmFsU3VickluZGV4Lm9iaiwKKyAgICAgICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCwKKyAgICAgICAgZmRBcnJheTogY2ZmLmZkQXJyYXksCisgICAgICAgIHByaXZhdGVEaWN0OiB0b3BEaWN0LnByaXZhdGVEaWN0CisgICAgICB9KTsKKyAgICAgIGNmZi5jaGFyU3RyaW5ncyA9IGNoYXJTdHJpbmdzQW5kU2VhY3MuY2hhclN0cmluZ3M7CisgICAgICBjZmYuc2VhY3MgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLnNlYWNzOworICAgICAgY2ZmLndpZHRocyA9IGNoYXJTdHJpbmdzQW5kU2VhY3Mud2lkdGhzOworICAgICAgcmV0dXJuIGNmZjsKKyAgICB9CisKKyAgICBwYXJzZUhlYWRlcigpIHsKKyAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7CisgICAgICB2YXIgYnl0ZXNMZW5ndGggPSBieXRlcy5sZW5ndGg7CisgICAgICB2YXIgb2Zmc2V0ID0gMDsKKworICAgICAgd2hpbGUgKG9mZnNldCA8IGJ5dGVzTGVuZ3RoICYmIGJ5dGVzW29mZnNldF0gIT09IDEpIHsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgICB9CisKKyAgICAgIGlmIChvZmZzZXQgPj0gYnl0ZXNMZW5ndGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIENGRiBoZWFkZXIiKTsKKyAgICAgIH0KKworICAgICAgaWYgKG9mZnNldCAhPT0gMCkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoImNmZiBkYXRhIGlzIHNoaWZ0ZWQiKTsKKyAgICAgICAgYnl0ZXMgPSBieXRlcy5zdWJhcnJheShvZmZzZXQpOworICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7CisgICAgICB9CisKKyAgICAgIHZhciBtYWpvciA9IGJ5dGVzWzBdOworICAgICAgdmFyIG1pbm9yID0gYnl0ZXNbMV07CisgICAgICB2YXIgaGRyU2l6ZSA9IGJ5dGVzWzJdOworICAgICAgdmFyIG9mZlNpemUgPSBieXRlc1szXTsKKyAgICAgIHZhciBoZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSk7CisgICAgICByZXR1cm4geworICAgICAgICBvYmo6IGhlYWRlciwKKyAgICAgICAgZW5kUG9zOiBoZHJTaXplCisgICAgICB9OworICAgIH0KKworICAgIHBhcnNlRGljdChkaWN0KSB7CisgICAgICB2YXIgcG9zID0gMDsKKworICAgICAgZnVuY3Rpb24gcGFyc2VPcGVyYW5kKCkgeworICAgICAgICB2YXIgdmFsdWUgPSBkaWN0W3BvcysrXTsKKworICAgICAgICBpZiAodmFsdWUgPT09IDMwKSB7CisgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXRPcGVyYW5kKCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7CisgICAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTsKKyAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCAyNCB8IGRpY3RbcG9zKytdIDw8IDE2KSA+PiAxNjsKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI5KSB7CisgICAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTsKKyAgICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKKyAgICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKKyAgICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlIC0gMTM5OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTApIHsKKyAgICAgICAgICByZXR1cm4gKHZhbHVlIC0gMjQ3KSAqIDI1NiArIGRpY3RbcG9zKytdICsgMTA4OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI1MSAmJiB2YWx1ZSA8PSAyNTQpIHsKKyAgICAgICAgICByZXR1cm4gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGRpY3RbcG9zKytdIC0gMTA4OworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCdDRkZQYXJzZXJfcGFyc2VEaWN0OiAiJyArIHZhbHVlICsgJyIgaXMgYSByZXNlcnZlZCBjb21tYW5kLicpOworICAgICAgICByZXR1cm4gTmFOOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBwYXJzZUZsb2F0T3BlcmFuZCgpIHsKKyAgICAgICAgdmFyIHN0ciA9ICIiOworICAgICAgICB2YXIgZW9mID0gMTU7CisgICAgICAgIGNvbnN0IGxvb2t1cCA9IFsiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIuIiwgIkUiLCAiRS0iLCBudWxsLCAiLSJdOworICAgICAgICB2YXIgbGVuZ3RoID0gZGljdC5sZW5ndGg7CisKKyAgICAgICAgd2hpbGUgKHBvcyA8IGxlbmd0aCkgeworICAgICAgICAgIHZhciBiID0gZGljdFtwb3MrK107CisgICAgICAgICAgdmFyIGIxID0gYiA+PiA0OworICAgICAgICAgIHZhciBiMiA9IGIgJiAxNTsKKworICAgICAgICAgIGlmIChiMSA9PT0gZW9mKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHIgKz0gbG9va3VwW2IxXTsKKworICAgICAgICAgIGlmIChiMiA9PT0gZW9mKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHIgKz0gbG9va3VwW2IyXTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHN0cik7CisgICAgICB9CisKKyAgICAgIHZhciBvcGVyYW5kcyA9IFtdOworICAgICAgdmFyIGVudHJpZXMgPSBbXTsKKyAgICAgIHBvcyA9IDA7CisgICAgICB2YXIgZW5kID0gZGljdC5sZW5ndGg7CisKKyAgICAgIHdoaWxlIChwb3MgPCBlbmQpIHsKKyAgICAgICAgdmFyIGIgPSBkaWN0W3Bvc107CisKKyAgICAgICAgaWYgKGIgPD0gMjEpIHsKKyAgICAgICAgICBpZiAoYiA9PT0gMTIpIHsKKyAgICAgICAgICAgIGIgPSBiIDw8IDggfCBkaWN0WysrcG9zXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbnRyaWVzLnB1c2goW2IsIG9wZXJhbmRzXSk7CisgICAgICAgICAgb3BlcmFuZHMgPSBbXTsKKyAgICAgICAgICArK3BvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvcGVyYW5kcy5wdXNoKHBhcnNlT3BlcmFuZCgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZW50cmllczsKKyAgICB9CisKKyAgICBwYXJzZUluZGV4KHBvcykgeworICAgICAgdmFyIGNmZkluZGV4ID0gbmV3IENGRkluZGV4KCk7CisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzOworICAgICAgdmFyIGNvdW50ID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CisgICAgICB2YXIgb2Zmc2V0cyA9IFtdOworICAgICAgdmFyIGVuZCA9IHBvczsKKyAgICAgIHZhciBpLCBpaTsKKworICAgICAgaWYgKGNvdW50ICE9PSAwKSB7CisgICAgICAgIHZhciBvZmZzZXRTaXplID0gYnl0ZXNbcG9zKytdOworICAgICAgICB2YXIgc3RhcnRQb3MgPSBwb3MgKyAoY291bnQgKyAxKSAqIG9mZnNldFNpemUgLSAxOworCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gY291bnQgKyAxOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIHZhciBvZmZzZXQgPSAwOworCisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvZmZzZXRTaXplOyArK2opIHsKKyAgICAgICAgICAgIG9mZnNldCA8PD0gODsKKyAgICAgICAgICAgIG9mZnNldCArPSBieXRlc1twb3MrK107CisgICAgICAgICAgfQorCisgICAgICAgICAgb2Zmc2V0cy5wdXNoKHN0YXJ0UG9zICsgb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGVuZCA9IG9mZnNldHNbY291bnRdOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IG9mZnNldHMubGVuZ3RoIC0gMTsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgdmFyIG9mZnNldFN0YXJ0ID0gb2Zmc2V0c1tpXTsKKyAgICAgICAgdmFyIG9mZnNldEVuZCA9IG9mZnNldHNbaSArIDFdOworICAgICAgICBjZmZJbmRleC5hZGQoYnl0ZXMuc3ViYXJyYXkob2Zmc2V0U3RhcnQsIG9mZnNldEVuZCkpOworICAgICAgfQorCisgICAgICByZXR1cm4geworICAgICAgICBvYmo6IGNmZkluZGV4LAorICAgICAgICBlbmRQb3M6IGVuZAorICAgICAgfTsKKyAgICB9CisKKyAgICBwYXJzZU5hbWVJbmRleChpbmRleCkgeworICAgICAgdmFyIG5hbWVzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGluZGV4LmNvdW50OyBpIDwgaWk7ICsraSkgeworICAgICAgICB2YXIgbmFtZSA9IGluZGV4LmdldChpKTsKKyAgICAgICAgbmFtZXMucHVzaCgoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykobmFtZSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gbmFtZXM7CisgICAgfQorCisgICAgcGFyc2VTdHJpbmdJbmRleChpbmRleCkgeworICAgICAgdmFyIHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbmRleC5jb3VudDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgdmFyIGRhdGEgPSBpbmRleC5nZXQoaSk7CisgICAgICAgIHN0cmluZ3MuYWRkKCgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShkYXRhKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBzdHJpbmdzOworICAgIH0KKworICAgIGNyZWF0ZURpY3QoVHlwZSwgZGljdCwgc3RyaW5ncykgeworICAgICAgdmFyIGNmZkRpY3QgPSBuZXcgVHlwZShzdHJpbmdzKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGljdC5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHZhciBwYWlyID0gZGljdFtpXTsKKyAgICAgICAgdmFyIGtleSA9IHBhaXJbMF07CisgICAgICAgIHZhciB2YWx1ZSA9IHBhaXJbMV07CisgICAgICAgIGNmZkRpY3Quc2V0QnlLZXkoa2V5LCB2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjZmZEaWN0OworICAgIH0KKworICAgIHBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgZGF0YSwgbG9jYWxTdWJySW5kZXgsIGdsb2JhbFN1YnJJbmRleCkgeworICAgICAgaWYgKCFkYXRhIHx8IHN0YXRlLmNhbGxEZXB0aCA+IE1BWF9TVUJSX05FU1RJTkcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB2YXIgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplOworICAgICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7CisgICAgICB2YXIgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CisKKyAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuZ3RoOykgeworICAgICAgICB2YXIgdmFsdWUgPSBkYXRhW2orK107CisgICAgICAgIHZhciB2YWxpZGF0aW9uQ29tbWFuZCA9IG51bGw7CisKKyAgICAgICAgaWYgKHZhbHVlID09PSAxMikgeworICAgICAgICAgIHZhciBxID0gZGF0YVtqKytdOworCisgICAgICAgICAgaWYgKHEgPT09IDApIHsKKyAgICAgICAgICAgIGRhdGFbaiAtIDJdID0gMTM5OworICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSAyMjsKKyAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhMTJbcV07CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOCkgeworICAgICAgICAgIHN0YWNrW3N0YWNrU2l6ZV0gPSAoZGF0YVtqXSA8PCAyNCB8IGRhdGFbaiArIDFdIDw8IDE2KSA+PiAxNjsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgc3RhY2tTaXplKys7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDE0KSB7CisgICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+PSA0KSB7CisgICAgICAgICAgICBzdGFja1NpemUgLT0gNDsKKworICAgICAgICAgICAgaWYgKHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCkgeworICAgICAgICAgICAgICBzdGF0ZS5zZWFjID0gc3RhY2suc2xpY2Uoc3RhY2tTaXplLCBzdGFja1NpemUgKyA0KTsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAzMiAmJiB2YWx1ZSA8PSAyNDYpIHsKKyAgICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgLSAxMzk7CisgICAgICAgICAgc3RhY2tTaXplKys7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMjQ3ICYmIHZhbHVlIDw9IDI1NCkgeworICAgICAgICAgIHN0YWNrW3N0YWNrU2l6ZV0gPSB2YWx1ZSA8IDI1MSA/ICh2YWx1ZSAtIDI0NyA8PCA4KSArIGRhdGFbal0gKyAxMDggOiAtKHZhbHVlIC0gMjUxIDw8IDgpIC0gZGF0YVtqXSAtIDEwODsKKyAgICAgICAgICBqKys7CisgICAgICAgICAgc3RhY2tTaXplKys7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI1NSkgeworICAgICAgICAgIHN0YWNrW3N0YWNrU2l6ZV0gPSAoZGF0YVtqXSA8PCAyNCB8IGRhdGFbaiArIDFdIDw8IDE2IHwgZGF0YVtqICsgMl0gPDwgOCB8IGRhdGFbaiArIDNdKSAvIDY1NTM2OworICAgICAgICAgIGogKz0gNDsKKyAgICAgICAgICBzdGFja1NpemUrKzsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTkgfHwgdmFsdWUgPT09IDIwKSB7CisgICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7CisgICAgICAgICAgaiArPSBzdGF0ZS5oaW50cyArIDcgPj4gMzsKKyAgICAgICAgICBzdGFja1NpemUgJT0gMjsKKyAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDEwIHx8IHZhbHVlID09PSAyOSkgeworICAgICAgICAgIHZhciBzdWJyc0luZGV4OworCisgICAgICAgICAgaWYgKHZhbHVlID09PSAxMCkgeworICAgICAgICAgICAgc3VicnNJbmRleCA9IGxvY2FsU3VickluZGV4OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWJyc0luZGV4ID0gZ2xvYmFsU3VickluZGV4OworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghc3VicnNJbmRleCkgeworICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJNaXNzaW5nIHN1YnJzSW5kZXggZm9yICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5pZCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIGJpYXMgPSAzMjc2ODsKKworICAgICAgICAgIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMTI0MCkgeworICAgICAgICAgICAgYmlhcyA9IDEwNzsKKyAgICAgICAgICB9IGVsc2UgaWYgKHN1YnJzSW5kZXguY291bnQgPCAzMzkwMCkgeworICAgICAgICAgICAgYmlhcyA9IDExMzE7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIHN1YnJOdW1iZXIgPSBzdGFja1stLXN0YWNrU2l6ZV0gKyBiaWFzOworCisgICAgICAgICAgaWYgKHN1YnJOdW1iZXIgPCAwIHx8IHN1YnJOdW1iZXIgPj0gc3VicnNJbmRleC5jb3VudCB8fCBpc05hTihzdWJyTnVtYmVyKSkgeworICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJPdXQgb2YgYm91bmRzIHN1YnJJbmRleCBmb3IgIiArIHZhbGlkYXRpb25Db21tYW5kLmlkKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdGF0ZS5zdGFja1NpemUgPSBzdGFja1NpemU7CisgICAgICAgICAgc3RhdGUuY2FsbERlcHRoKys7CisgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy5wYXJzZUNoYXJTdHJpbmcoc3RhdGUsIHN1YnJzSW5kZXguZ2V0KHN1YnJOdW1iZXIpLCBsb2NhbFN1YnJJbmRleCwgZ2xvYmFsU3VickluZGV4KTsKKworICAgICAgICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdGF0ZS5jYWxsRGVwdGgtLTsKKyAgICAgICAgICBzdGFja1NpemUgPSBzdGF0ZS5zdGFja1NpemU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDExKSB7CisgICAgICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWxpZGF0aW9uQ29tbWFuZCkgeworICAgICAgICAgIGlmICh2YWxpZGF0aW9uQ29tbWFuZC5zdGVtKSB7CisgICAgICAgICAgICBzdGF0ZS5oaW50cyArPSBzdGFja1NpemUgPj4gMTsKKworICAgICAgICAgICAgaWYgKHZhbHVlID09PSAzIHx8IHZhbHVlID09PSAyMykgeworICAgICAgICAgICAgICBzdGF0ZS5oYXNWU3RlbXMgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5oYXNWU3RlbXMgJiYgKHZhbHVlID09PSAxIHx8IHZhbHVlID09PSAxOCkpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKTsKKyAgICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIm1pbiIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHsKKyAgICAgICAgICAgIGlmICghc3RhdGUudW5kZWZTdGFjayAmJiBzdGFja1NpemUgPCB2YWxpZGF0aW9uQ29tbWFuZC5taW4pIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJOb3QgZW5vdWdoIHBhcmFtZXRlcnMgZm9yICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5pZCArICI7IGFjdHVhbDogIiArIHN0YWNrU2l6ZSArICIsIGV4cGVjdGVkOiAiICsgdmFsaWRhdGlvbkNvbW1hbmQubWluKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgeworICAgICAgICAgICAgc3RhdGUuZmlyc3RTdGFja0NsZWFyaW5nID0gZmFsc2U7CisgICAgICAgICAgICBzdGFja1NpemUgLT0gdmFsaWRhdGlvbkNvbW1hbmQubWluOworCisgICAgICAgICAgICBpZiAoc3RhY2tTaXplID49IDIgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkgeworICAgICAgICAgICAgICBzdGFja1NpemUgJT0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tTaXplID4gMSkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkZvdW5kIHRvbyBtYW55IHBhcmFtZXRlcnMgZm9yIHN0YWNrLWNsZWFyaW5nIGNvbW1hbmQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+IDAgJiYgc3RhY2tbc3RhY2tTaXplIC0gMV0gPj0gMCkgeworICAgICAgICAgICAgICBzdGF0ZS53aWR0aCA9IHN0YWNrW3N0YWNrU2l6ZSAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmICgic3RhY2tEZWx0YSIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHsKKyAgICAgICAgICAgIGlmICgic3RhY2tGbiIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHsKKyAgICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tGbihzdGFjaywgc3RhY2tTaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhY2tTaXplICs9IHZhbGlkYXRpb25Db21tYW5kLnN0YWNrRGVsdGE7CisgICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0NsZWFyaW5nKSB7CisgICAgICAgICAgICBzdGFja1NpemUgPSAwOworICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQucmVzZXRTdGFjaykgeworICAgICAgICAgICAgc3RhY2tTaXplID0gMDsKKyAgICAgICAgICAgIHN0YXRlLnVuZGVmU3RhY2sgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnVuZGVmU3RhY2spIHsKKyAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CisgICAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzdGF0ZS5zdGFja1NpemUgPSBzdGFja1NpemU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwYXJzZUNoYXJTdHJpbmdzKHsKKyAgICAgIGNoYXJTdHJpbmdzLAorICAgICAgbG9jYWxTdWJySW5kZXgsCisgICAgICBnbG9iYWxTdWJySW5kZXgsCisgICAgICBmZFNlbGVjdCwKKyAgICAgIGZkQXJyYXksCisgICAgICBwcml2YXRlRGljdAorICAgIH0pIHsKKyAgICAgIHZhciBzZWFjcyA9IFtdOworICAgICAgdmFyIHdpZHRocyA9IFtdOworICAgICAgdmFyIGNvdW50ID0gY2hhclN0cmluZ3MuY291bnQ7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB2YXIgY2hhcnN0cmluZyA9IGNoYXJTdHJpbmdzLmdldChpKTsKKyAgICAgICAgdmFyIHN0YXRlID0geworICAgICAgICAgIGNhbGxEZXB0aDogMCwKKyAgICAgICAgICBzdGFja1NpemU6IDAsCisgICAgICAgICAgc3RhY2s6IFtdLAorICAgICAgICAgIHVuZGVmU3RhY2s6IHRydWUsCisgICAgICAgICAgaGludHM6IDAsCisgICAgICAgICAgZmlyc3RTdGFja0NsZWFyaW5nOiB0cnVlLAorICAgICAgICAgIHNlYWM6IG51bGwsCisgICAgICAgICAgd2lkdGg6IG51bGwsCisgICAgICAgICAgaGFzVlN0ZW1zOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOworICAgICAgICB2YXIgbG9jYWxTdWJyVG9Vc2UgPSBudWxsOworICAgICAgICB2YXIgcHJpdmF0ZURpY3RUb1VzZSA9IHByaXZhdGVEaWN0OworCisgICAgICAgIGlmIChmZFNlbGVjdCAmJiBmZEFycmF5Lmxlbmd0aCkgeworICAgICAgICAgIHZhciBmZEluZGV4ID0gZmRTZWxlY3QuZ2V0RkRJbmRleChpKTsKKworICAgICAgICAgIGlmIChmZEluZGV4ID09PSAtMSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJHbHlwaCBpbmRleCBpcyBub3QgaW4gZmQgc2VsZWN0LiIpOworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZmRJbmRleCA+PSBmZEFycmF5Lmxlbmd0aCkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKKyAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHZhbGlkKSB7CisgICAgICAgICAgICBwcml2YXRlRGljdFRvVXNlID0gZmRBcnJheVtmZEluZGV4XS5wcml2YXRlRGljdDsKKyAgICAgICAgICAgIGxvY2FsU3ViclRvVXNlID0gcHJpdmF0ZURpY3RUb1VzZS5zdWJyc0luZGV4OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbFN1YnJJbmRleCkgeworICAgICAgICAgIGxvY2FsU3ViclRvVXNlID0gbG9jYWxTdWJySW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsaWQpIHsKKyAgICAgICAgICB2YWxpZCA9IHRoaXMucGFyc2VDaGFyU3RyaW5nKHN0YXRlLCBjaGFyc3RyaW5nLCBsb2NhbFN1YnJUb1VzZSwgZ2xvYmFsU3VickluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0ZS53aWR0aCAhPT0gbnVsbCkgeworICAgICAgICAgIGNvbnN0IG5vbWluYWxXaWR0aCA9IHByaXZhdGVEaWN0VG9Vc2UuZ2V0QnlOYW1lKCJub21pbmFsV2lkdGhYIik7CisgICAgICAgICAgd2lkdGhzW2ldID0gbm9taW5hbFdpZHRoICsgc3RhdGUud2lkdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTsKKyAgICAgICAgICB3aWR0aHNbaV0gPSBkZWZhdWx0V2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGUuc2VhYyAhPT0gbnVsbCkgeworICAgICAgICAgIHNlYWNzW2ldID0gc3RhdGUuc2VhYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgICBjaGFyU3RyaW5ncy5zZXQoaSwgbmV3IFVpbnQ4QXJyYXkoWzE0XSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIGNoYXJTdHJpbmdzLAorICAgICAgICBzZWFjcywKKyAgICAgICAgd2lkdGhzCisgICAgICB9OworICAgIH0KKworICAgIGVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCkgeworICAgICAgdmFyIHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LCBbXSwgcGFyZW50RGljdC5zdHJpbmdzKTsKKyAgICAgIHBhcmVudERpY3Quc2V0QnlLZXkoMTgsIFswLCAwXSk7CisgICAgICBwYXJlbnREaWN0LnByaXZhdGVEaWN0ID0gcHJpdmF0ZURpY3Q7CisgICAgfQorCisgICAgcGFyc2VQcml2YXRlRGljdChwYXJlbnREaWN0KSB7CisgICAgICBpZiAoIXBhcmVudERpY3QuaGFzTmFtZSgiUHJpdmF0ZSIpKSB7CisgICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcHJpdmF0ZU9mZnNldCA9IHBhcmVudERpY3QuZ2V0QnlOYW1lKCJQcml2YXRlIik7CisKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcml2YXRlT2Zmc2V0KSB8fCBwcml2YXRlT2Zmc2V0Lmxlbmd0aCAhPT0gMikgeworICAgICAgICBwYXJlbnREaWN0LnJlbW92ZUJ5TmFtZSgiUHJpdmF0ZSIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBzaXplID0gcHJpdmF0ZU9mZnNldFswXTsKKyAgICAgIHZhciBvZmZzZXQgPSBwcml2YXRlT2Zmc2V0WzFdOworCisgICAgICBpZiAoc2l6ZSA9PT0gMCB8fCBvZmZzZXQgPj0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKKyAgICAgICAgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBwcml2YXRlRGljdEVuZCA9IG9mZnNldCArIHNpemU7CisgICAgICB2YXIgZGljdERhdGEgPSB0aGlzLmJ5dGVzLnN1YmFycmF5KG9mZnNldCwgcHJpdmF0ZURpY3RFbmQpOworICAgICAgdmFyIGRpY3QgPSB0aGlzLnBhcnNlRGljdChkaWN0RGF0YSk7CisgICAgICB2YXIgcHJpdmF0ZURpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGUHJpdmF0ZURpY3QsIGRpY3QsIHBhcmVudERpY3Quc3RyaW5ncyk7CisgICAgICBwYXJlbnREaWN0LnByaXZhdGVEaWN0ID0gcHJpdmF0ZURpY3Q7CisKKyAgICAgIGlmICghcHJpdmF0ZURpY3QuZ2V0QnlOYW1lKCJTdWJycyIpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHN1YnJzT2Zmc2V0ID0gcHJpdmF0ZURpY3QuZ2V0QnlOYW1lKCJTdWJycyIpOworICAgICAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gb2Zmc2V0ICsgc3VicnNPZmZzZXQ7CisKKyAgICAgIGlmIChzdWJyc09mZnNldCA9PT0gMCB8fCByZWxhdGl2ZU9mZnNldCA+PSB0aGlzLmJ5dGVzLmxlbmd0aCkgeworICAgICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHN1YnJzSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgocmVsYXRpdmVPZmZzZXQpOworICAgICAgcHJpdmF0ZURpY3Quc3VicnNJbmRleCA9IHN1YnJzSW5kZXgub2JqOworICAgIH0KKworICAgIHBhcnNlQ2hhcnNldHMocG9zLCBsZW5ndGgsIHN0cmluZ3MsIGNpZCkgeworICAgICAgaWYgKHBvcyA9PT0gMCkgeworICAgICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQodHJ1ZSwgQ0ZGQ2hhcnNldFByZWRlZmluZWRUeXBlcy5JU09fQURPQkUsIF9jaGFyc2V0cy5JU09BZG9iZUNoYXJzZXQpOworICAgICAgfSBlbHNlIGlmIChwb3MgPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KHRydWUsIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJULCBfY2hhcnNldHMuRXhwZXJ0Q2hhcnNldCk7CisgICAgICB9IGVsc2UgaWYgKHBvcyA9PT0gMikgeworICAgICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQodHJ1ZSwgQ0ZGQ2hhcnNldFByZWRlZmluZWRUeXBlcy5FWFBFUlRfU1VCU0VULCBfY2hhcnNldHMuRXhwZXJ0U3Vic2V0Q2hhcnNldCk7CisgICAgICB9CisKKyAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7CisgICAgICB2YXIgc3RhcnQgPSBwb3M7CisgICAgICB2YXIgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOworICAgICAgY29uc3QgY2hhcnNldCA9IFtjaWQgPyAwIDogIi5ub3RkZWYiXTsKKyAgICAgIHZhciBpZCwgY291bnQsIGk7CisgICAgICBsZW5ndGggLT0gMTsKKworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCA6IHN0cmluZ3MuZ2V0KGlkKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHsKKyAgICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CisgICAgICAgICAgICBjb3VudCA9IGJ5dGVzW3BvcysrXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCsrIDogc3RyaW5ncy5nZXQoaWQrKykpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICB3aGlsZSAoY2hhcnNldC5sZW5ndGggPD0gbGVuZ3RoKSB7CisgICAgICAgICAgICBpZCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgY291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCsrIDogc3RyaW5ncy5nZXQoaWQrKykpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIGNoYXJzZXQgZm9ybWF0Iik7CisgICAgICB9CisKKyAgICAgIHZhciBlbmQgPSBwb3M7CisgICAgICB2YXIgcmF3ID0gYnl0ZXMuc3ViYXJyYXkoc3RhcnQsIGVuZCk7CisgICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQoZmFsc2UsIGZvcm1hdCwgY2hhcnNldCwgcmF3KTsKKyAgICB9CisKKyAgICBwYXJzZUVuY29kaW5nKHBvcywgcHJvcGVydGllcywgc3RyaW5ncywgY2hhcnNldCkgeworICAgICAgdmFyIGVuY29kaW5nID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7CisgICAgICB2YXIgcHJlZGVmaW5lZCA9IGZhbHNlOworICAgICAgdmFyIGZvcm1hdCwgaSwgaWk7CisgICAgICB2YXIgcmF3ID0gbnVsbDsKKworICAgICAgZnVuY3Rpb24gcmVhZFN1cHBsZW1lbnQoKSB7CisgICAgICAgIHZhciBzdXBwbGVtZW50c0NvdW50ID0gYnl0ZXNbcG9zKytdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdXBwbGVtZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICB2YXIgY29kZSA9IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICB2YXIgc2lkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSArIChieXRlc1twb3MrK10gJiAweGZmKTsKKyAgICAgICAgICBlbmNvZGluZ1tjb2RlXSA9IGNoYXJzZXQuaW5kZXhPZihzdHJpbmdzLmdldChzaWQpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocG9zID09PSAwIHx8IHBvcyA9PT0gMSkgeworICAgICAgICBwcmVkZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgZm9ybWF0ID0gcG9zOworICAgICAgICB2YXIgYmFzZUVuY29kaW5nID0gcG9zID8gX2VuY29kaW5ncy5FeHBlcnRFbmNvZGluZyA6IF9lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZzsKKworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIHZhciBpbmRleCA9IGJhc2VFbmNvZGluZy5pbmRleE9mKGNoYXJzZXRbaV0pOworCisgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgeworICAgICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gaTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBkYXRhU3RhcnQgPSBwb3M7CisgICAgICAgIGZvcm1hdCA9IGJ5dGVzW3BvcysrXTsKKworICAgICAgICBzd2l0Y2ggKGZvcm1hdCAmIDB4N2YpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB2YXIgZ2x5cGhzQ291bnQgPSBieXRlc1twb3MrK107CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICBlbmNvZGluZ1tieXRlc1twb3MrK11dID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB2YXIgcmFuZ2VzQ291bnQgPSBieXRlc1twb3MrK107CisgICAgICAgICAgICB2YXIgZ2lkID0gMTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhbmdlc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgICB2YXIgbGVmdCA9IGJ5dGVzW3BvcysrXTsKKworICAgICAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPD0gc3RhcnQgKyBsZWZ0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBlbmNvZGluZ1tqXSA9IGdpZCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICR7Zm9ybWF0fSBpbiBDRkZgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkYXRhRW5kID0gcG9zOworCisgICAgICAgIGlmIChmb3JtYXQgJiAweDgwKSB7CisgICAgICAgICAgYnl0ZXNbZGF0YVN0YXJ0XSAmPSAweDdmOworICAgICAgICAgIHJlYWRTdXBwbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICByYXcgPSBieXRlcy5zdWJhcnJheShkYXRhU3RhcnQsIGRhdGFFbmQpOworICAgICAgfQorCisgICAgICBmb3JtYXQgPSBmb3JtYXQgJiAweDdmOworICAgICAgcmV0dXJuIG5ldyBDRkZFbmNvZGluZyhwcmVkZWZpbmVkLCBmb3JtYXQsIGVuY29kaW5nLCByYXcpOworICAgIH0KKworICAgIHBhcnNlRkRTZWxlY3QocG9zLCBsZW5ndGgpIHsKKyAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7CisgICAgICB2YXIgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOworICAgICAgdmFyIGZkU2VsZWN0ID0gW107CisgICAgICB2YXIgaTsKKworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgdmFyIGlkID0gYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgZmRTZWxlY3QucHVzaChpZCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIHZhciByYW5nZXNDb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhbmdlc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHZhciBmaXJzdCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOworCisgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBmaXJzdCAhPT0gMCkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhhdmUgYSBmaXJzdCBHSUQgb2YgMCIgKyAiIC0tIHRyeWluZyB0byByZWNvdmVyLiIpOworICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmZEluZGV4ID0gYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgdmFyIG5leHQgPSBieXRlc1twb3NdIDw8IDggfCBieXRlc1twb3MgKyAxXTsKKworICAgICAgICAgICAgZm9yICh2YXIgaiA9IGZpcnN0OyBqIDwgbmV4dDsgKytqKSB7CisgICAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goZmRJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYHBhcnNlRkRTZWxlY3Q6IFVua25vd24gZm9ybWF0ICIke2Zvcm1hdH0iLmApOworICAgICAgfQorCisgICAgICBpZiAoZmRTZWxlY3QubGVuZ3RoICE9PSBsZW5ndGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBDRkZGRFNlbGVjdChmb3JtYXQsIGZkU2VsZWN0KTsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiBDRkZQYXJzZXI7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGUGFyc2VyID0gQ0ZGUGFyc2VyOworCitjbGFzcyBDRkYgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLmhlYWRlciA9IG51bGw7CisgICAgdGhpcy5uYW1lcyA9IFtdOworICAgIHRoaXMudG9wRGljdCA9IG51bGw7CisgICAgdGhpcy5zdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKKyAgICB0aGlzLmdsb2JhbFN1YnJJbmRleCA9IG51bGw7CisgICAgdGhpcy5lbmNvZGluZyA9IG51bGw7CisgICAgdGhpcy5jaGFyc2V0ID0gbnVsbDsKKyAgICB0aGlzLmNoYXJTdHJpbmdzID0gbnVsbDsKKyAgICB0aGlzLmZkQXJyYXkgPSBbXTsKKyAgICB0aGlzLmZkU2VsZWN0ID0gbnVsbDsKKyAgICB0aGlzLmlzQ0lERm9udCA9IGZhbHNlOworICB9CisKKyAgZHVwbGljYXRlRmlyc3RHbHlwaCgpIHsKKyAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJOb3QgZW5vdWdoIHNwYWNlIGluIGNoYXJzdHJpbmdzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZ2x5cGhaZXJvID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoMCk7CisgICAgdGhpcy5jaGFyU3RyaW5ncy5hZGQoZ2x5cGhaZXJvKTsKKworICAgIGlmICh0aGlzLmlzQ0lERm9udCkgeworICAgICAgdGhpcy5mZFNlbGVjdC5mZFNlbGVjdC5wdXNoKHRoaXMuZmRTZWxlY3QuZmRTZWxlY3RbMF0pOworICAgIH0KKyAgfQorCisgIGhhc0dseXBoSWQoaWQpIHsKKyAgICBpZiAoaWQgPCAwIHx8IGlkID49IHRoaXMuY2hhclN0cmluZ3MuY291bnQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2YXIgZ2x5cGggPSB0aGlzLmNoYXJTdHJpbmdzLmdldChpZCk7CisgICAgcmV0dXJuIGdseXBoLmxlbmd0aCA+IDA7CisgIH0KKworfQorCitleHBvcnRzLkNGRiA9IENGRjsKKworY2xhc3MgQ0ZGSGVhZGVyIHsKKyAgY29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKSB7CisgICAgdGhpcy5tYWpvciA9IG1ham9yOworICAgIHRoaXMubWlub3IgPSBtaW5vcjsKKyAgICB0aGlzLmhkclNpemUgPSBoZHJTaXplOworICAgIHRoaXMub2ZmU2l6ZSA9IG9mZlNpemU7CisgIH0KKworfQorCitleHBvcnRzLkNGRkhlYWRlciA9IENGRkhlYWRlcjsKKworY2xhc3MgQ0ZGU3RyaW5ncyB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuc3RyaW5ncyA9IFtdOworICB9CisKKyAgZ2V0KGluZGV4KSB7CisgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIC0gMSkgeworICAgICAgcmV0dXJuIENGRlN0YW5kYXJkU3RyaW5nc1tpbmRleF07CisgICAgfQorCisgICAgaWYgKGluZGV4IC0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIDw9IHRoaXMuc3RyaW5ncy5sZW5ndGgpIHsKKyAgICAgIHJldHVybiB0aGlzLnN0cmluZ3NbaW5kZXggLSBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1NdOworICAgIH0KKworICAgIHJldHVybiBDRkZTdGFuZGFyZFN0cmluZ3NbMF07CisgIH0KKworICBnZXRTSUQoc3RyKSB7CisgICAgbGV0IGluZGV4ID0gQ0ZGU3RhbmRhcmRTdHJpbmdzLmluZGV4T2Yoc3RyKTsKKworICAgIGlmIChpbmRleCAhPT0gLTEpIHsKKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICBpbmRleCA9IHRoaXMuc3RyaW5ncy5pbmRleE9mKHN0cik7CisKKyAgICBpZiAoaW5kZXggIT09IC0xKSB7CisgICAgICByZXR1cm4gaW5kZXggKyBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1M7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgYWRkKHZhbHVlKSB7CisgICAgdGhpcy5zdHJpbmdzLnB1c2godmFsdWUpOworICB9CisKKyAgZ2V0IGNvdW50KCkgeworICAgIHJldHVybiB0aGlzLnN0cmluZ3MubGVuZ3RoOworICB9CisKK30KKworZXhwb3J0cy5DRkZTdHJpbmdzID0gQ0ZGU3RyaW5nczsKKworY2xhc3MgQ0ZGSW5kZXggeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLm9iamVjdHMgPSBbXTsKKyAgICB0aGlzLmxlbmd0aCA9IDA7CisgIH0KKworICBhZGQoZGF0YSkgeworICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoOworICAgIHRoaXMub2JqZWN0cy5wdXNoKGRhdGEpOworICB9CisKKyAgc2V0KGluZGV4LCBkYXRhKSB7CisgICAgdGhpcy5sZW5ndGggKz0gZGF0YS5sZW5ndGggLSB0aGlzLm9iamVjdHNbaW5kZXhdLmxlbmd0aDsKKyAgICB0aGlzLm9iamVjdHNbaW5kZXhdID0gZGF0YTsKKyAgfQorCisgIGdldChpbmRleCkgeworICAgIHJldHVybiB0aGlzLm9iamVjdHNbaW5kZXhdOworICB9CisKKyAgZ2V0IGNvdW50KCkgeworICAgIHJldHVybiB0aGlzLm9iamVjdHMubGVuZ3RoOworICB9CisKK30KKworZXhwb3J0cy5DRkZJbmRleCA9IENGRkluZGV4OworCitjbGFzcyBDRkZEaWN0IHsKKyAgY29uc3RydWN0b3IodGFibGVzLCBzdHJpbmdzKSB7CisgICAgdGhpcy5rZXlUb05hbWVNYXAgPSB0YWJsZXMua2V5VG9OYW1lTWFwOworICAgIHRoaXMubmFtZVRvS2V5TWFwID0gdGFibGVzLm5hbWVUb0tleU1hcDsKKyAgICB0aGlzLmRlZmF1bHRzID0gdGFibGVzLmRlZmF1bHRzOworICAgIHRoaXMudHlwZXMgPSB0YWJsZXMudHlwZXM7CisgICAgdGhpcy5vcGNvZGVzID0gdGFibGVzLm9wY29kZXM7CisgICAgdGhpcy5vcmRlciA9IHRhYmxlcy5vcmRlcjsKKyAgICB0aGlzLnN0cmluZ3MgPSBzdHJpbmdzOworICAgIHRoaXMudmFsdWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfQorCisgIHNldEJ5S2V5KGtleSwgdmFsdWUpIHsKKyAgICBpZiAoIShrZXkgaW4gdGhpcy5rZXlUb05hbWVNYXApKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmFyIHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoOworCisgICAgaWYgKHZhbHVlTGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlTGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChpc05hTih2YWx1ZVtpXSkpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCdJbnZhbGlkIENGRkRpY3QgdmFsdWU6ICInICsgdmFsdWUgKyAnIiBmb3Iga2V5ICInICsga2V5ICsgJyIuJyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHZhciB0eXBlID0gdGhpcy50eXBlc1trZXldOworCisgICAgaWYgKHR5cGUgPT09ICJudW0iIHx8IHR5cGUgPT09ICJzaWQiIHx8IHR5cGUgPT09ICJvZmZzZXQiKSB7CisgICAgICB2YWx1ZSA9IHZhbHVlWzBdOworICAgIH0KKworICAgIHRoaXMudmFsdWVzW2tleV0gPSB2YWx1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHNldEJ5TmFtZShuYW1lLCB2YWx1ZSkgeworICAgIGlmICghKG5hbWUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgZGljdGlvbmFyeSBuYW1lICIke25hbWV9ImApOworICAgIH0KKworICAgIHRoaXMudmFsdWVzW3RoaXMubmFtZVRvS2V5TWFwW25hbWVdXSA9IHZhbHVlOworICB9CisKKyAgaGFzTmFtZShuYW1lKSB7CisgICAgcmV0dXJuIHRoaXMubmFtZVRvS2V5TWFwW25hbWVdIGluIHRoaXMudmFsdWVzOworICB9CisKKyAgZ2V0QnlOYW1lKG5hbWUpIHsKKyAgICBpZiAoIShuYW1lIGluIHRoaXMubmFtZVRvS2V5TWFwKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAke25hbWV9ImApOworICAgIH0KKworICAgIHZhciBrZXkgPSB0aGlzLm5hbWVUb0tleU1hcFtuYW1lXTsKKworICAgIGlmICghKGtleSBpbiB0aGlzLnZhbHVlcykpIHsKKyAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRzW2tleV07CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMudmFsdWVzW2tleV07CisgIH0KKworICByZW1vdmVCeU5hbWUobmFtZSkgeworICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtuYW1lXV07CisgIH0KKworICBzdGF0aWMgY3JlYXRlVGFibGVzKGxheW91dCkgeworICAgIHZhciB0YWJsZXMgPSB7CisgICAgICBrZXlUb05hbWVNYXA6IHt9LAorICAgICAgbmFtZVRvS2V5TWFwOiB7fSwKKyAgICAgIGRlZmF1bHRzOiB7fSwKKyAgICAgIHR5cGVzOiB7fSwKKyAgICAgIG9wY29kZXM6IHt9LAorICAgICAgb3JkZXI6IFtdCisgICAgfTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGxheW91dC5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICB2YXIgZW50cnkgPSBsYXlvdXRbaV07CisgICAgICB2YXIga2V5ID0gQXJyYXkuaXNBcnJheShlbnRyeVswXSkgPyAoZW50cnlbMF1bMF0gPDwgOCkgKyBlbnRyeVswXVsxXSA6IGVudHJ5WzBdOworICAgICAgdGFibGVzLmtleVRvTmFtZU1hcFtrZXldID0gZW50cnlbMV07CisgICAgICB0YWJsZXMubmFtZVRvS2V5TWFwW2VudHJ5WzFdXSA9IGtleTsKKyAgICAgIHRhYmxlcy50eXBlc1trZXldID0gZW50cnlbMl07CisgICAgICB0YWJsZXMuZGVmYXVsdHNba2V5XSA9IGVudHJ5WzNdOworICAgICAgdGFibGVzLm9wY29kZXNba2V5XSA9IEFycmF5LmlzQXJyYXkoZW50cnlbMF0pID8gZW50cnlbMF0gOiBbZW50cnlbMF1dOworICAgICAgdGFibGVzLm9yZGVyLnB1c2goa2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGFibGVzOworICB9CisKK30KKwordmFyIENGRlRvcERpY3QgPSBmdW5jdGlvbiBDRkZUb3BEaWN0Q2xvc3VyZSgpIHsKKyAgdmFyIGxheW91dCA9IFtbWzEyLCAzMF0sICJST1MiLCBbInNpZCIsICJzaWQiLCAibnVtIl0sIG51bGxdLCBbWzEyLCAyMF0sICJTeW50aGV0aWNCYXNlIiwgIm51bSIsIG51bGxdLCBbMCwgInZlcnNpb24iLCAic2lkIiwgbnVsbF0sIFsxLCAiTm90aWNlIiwgInNpZCIsIG51bGxdLCBbWzEyLCAwXSwgIkNvcHlyaWdodCIsICJzaWQiLCBudWxsXSwgWzIsICJGdWxsTmFtZSIsICJzaWQiLCBudWxsXSwgWzMsICJGYW1pbHlOYW1lIiwgInNpZCIsIG51bGxdLCBbNCwgIldlaWdodCIsICJzaWQiLCBudWxsXSwgW1sxMiwgMV0sICJpc0ZpeGVkUGl0Y2giLCAibnVtIiwgMF0sIFtbMTIsIDJdLCAiSXRhbGljQW5nbGUiLCAibnVtIiwgMF0sIFtbMTIsIDNdLCAiVW5kZXJsaW5lUG9zaXRpb24iLCAibnVtIiwgLTEwMF0sIFtbMTIsIDRdLCAiVW5kZXJsaW5lVGhpY2tuZXNzIiwgIm51bSIsIDUwXSwgW1sxMiwgNV0sICJQYWludFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDZdLCAiQ2hhcnN0cmluZ1R5cGUiLCAibnVtIiwgMl0sIFtbMTIsIDddLCAiRm9udE1hdHJpeCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIiwgIm51bSIsICJudW0iXSwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF1dLCBbMTMsICJVbmlxdWVJRCIsICJudW0iLCBudWxsXSwgWzUsICJGb250QkJveCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIl0sIFswLCAwLCAwLCAwXV0sIFtbMTIsIDhdLCAiU3Ryb2tlV2lkdGgiLCAibnVtIiwgMF0sIFsxNCwgIlhVSUQiLCAiYXJyYXkiLCBudWxsXSwgWzE1LCAiY2hhcnNldCIsICJvZmZzZXQiLCAwXSwgWzE2LCAiRW5jb2RpbmciLCAib2Zmc2V0IiwgMF0sIFsxNywgIkNoYXJTdHJpbmdzIiwgIm9mZnNldCIsIDBdLCBbMTgsICJQcml2YXRlIiwgWyJvZmZzZXQiLCAib2Zmc2V0Il0sIG51bGxdLCBbWzEyLCAyMV0sICJQb3N0U2NyaXB0IiwgInNpZCIsIG51bGxdLCBbWzEyLCAyMl0sICJCYXNlRm9udE5hbWUiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDIzXSwgIkJhc2VGb250QmxlbmQiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMzFdLCAiQ0lERm9udFZlcnNpb24iLCAibnVtIiwgMF0sIFtbMTIsIDMyXSwgIkNJREZvbnRSZXZpc2lvbiIsICJudW0iLCAwXSwgW1sxMiwgMzNdLCAiQ0lERm9udFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDM0XSwgIkNJRENvdW50IiwgIm51bSIsIDg3MjBdLCBbWzEyLCAzNV0sICJVSURCYXNlIiwgIm51bSIsIG51bGxdLCBbWzEyLCAzN10sICJGRFNlbGVjdCIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzZdLCAiRkRBcnJheSIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzhdLCAiRm9udE5hbWUiLCAic2lkIiwgbnVsbF1dOworICB2YXIgdGFibGVzID0gbnVsbDsKKworICBjbGFzcyBDRkZUb3BEaWN0IGV4dGVuZHMgQ0ZGRGljdCB7CisgICAgY29uc3RydWN0b3Ioc3RyaW5ncykgeworICAgICAgaWYgKHRhYmxlcyA9PT0gbnVsbCkgeworICAgICAgICB0YWJsZXMgPSBDRkZEaWN0LmNyZWF0ZVRhYmxlcyhsYXlvdXQpOworICAgICAgfQorCisgICAgICBzdXBlcih0YWJsZXMsIHN0cmluZ3MpOworICAgICAgdGhpcy5wcml2YXRlRGljdCA9IG51bGw7CisgICAgfQorCisgIH0KKworICByZXR1cm4gQ0ZGVG9wRGljdDsKK30oKTsKKworZXhwb3J0cy5DRkZUb3BEaWN0ID0gQ0ZGVG9wRGljdDsKKwordmFyIENGRlByaXZhdGVEaWN0ID0gZnVuY3Rpb24gQ0ZGUHJpdmF0ZURpY3RDbG9zdXJlKCkgeworICB2YXIgbGF5b3V0ID0gW1s2LCAiQmx1ZVZhbHVlcyIsICJkZWx0YSIsIG51bGxdLCBbNywgIk90aGVyQmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzgsICJGYW1pbHlCbHVlcyIsICJkZWx0YSIsIG51bGxdLCBbOSwgIkZhbWlseU90aGVyQmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgOV0sICJCbHVlU2NhbGUiLCAibnVtIiwgMC4wMzk2MjVdLCBbWzEyLCAxMF0sICJCbHVlU2hpZnQiLCAibnVtIiwgN10sIFtbMTIsIDExXSwgIkJsdWVGdXp6IiwgIm51bSIsIDFdLCBbMTAsICJTdGRIVyIsICJudW0iLCBudWxsXSwgWzExLCAiU3RkVlciLCAibnVtIiwgbnVsbF0sIFtbMTIsIDEyXSwgIlN0ZW1TbmFwSCIsICJkZWx0YSIsIG51bGxdLCBbWzEyLCAxM10sICJTdGVtU25hcFYiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMTRdLCAiRm9yY2VCb2xkIiwgIm51bSIsIDBdLCBbWzEyLCAxN10sICJMYW5ndWFnZUdyb3VwIiwgIm51bSIsIDBdLCBbWzEyLCAxOF0sICJFeHBhbnNpb25GYWN0b3IiLCAibnVtIiwgMC4wNl0sIFtbMTIsIDE5XSwgImluaXRpYWxSYW5kb21TZWVkIiwgIm51bSIsIDBdLCBbMjAsICJkZWZhdWx0V2lkdGhYIiwgIm51bSIsIDBdLCBbMjEsICJub21pbmFsV2lkdGhYIiwgIm51bSIsIDBdLCBbMTksICJTdWJycyIsICJvZmZzZXQiLCBudWxsXV07CisgIHZhciB0YWJsZXMgPSBudWxsOworCisgIGNsYXNzIENGRlByaXZhdGVEaWN0IGV4dGVuZHMgQ0ZGRGljdCB7CisgICAgY29uc3RydWN0b3Ioc3RyaW5ncykgeworICAgICAgaWYgKHRhYmxlcyA9PT0gbnVsbCkgeworICAgICAgICB0YWJsZXMgPSBDRkZEaWN0LmNyZWF0ZVRhYmxlcyhsYXlvdXQpOworICAgICAgfQorCisgICAgICBzdXBlcih0YWJsZXMsIHN0cmluZ3MpOworICAgICAgdGhpcy5zdWJyc0luZGV4ID0gbnVsbDsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiBDRkZQcml2YXRlRGljdDsKK30oKTsKKworZXhwb3J0cy5DRkZQcml2YXRlRGljdCA9IENGRlByaXZhdGVEaWN0OwordmFyIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMgPSB7CisgIElTT19BRE9CRTogMCwKKyAgRVhQRVJUOiAxLAorICBFWFBFUlRfU1VCU0VUOiAyCit9OworCitjbGFzcyBDRkZDaGFyc2V0IHsKKyAgY29uc3RydWN0b3IocHJlZGVmaW5lZCwgZm9ybWF0LCBjaGFyc2V0LCByYXcpIHsKKyAgICB0aGlzLnByZWRlZmluZWQgPSBwcmVkZWZpbmVkOworICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OworICAgIHRoaXMuY2hhcnNldCA9IGNoYXJzZXQ7CisgICAgdGhpcy5yYXcgPSByYXc7CisgIH0KKworfQorCitleHBvcnRzLkNGRkNoYXJzZXQgPSBDRkZDaGFyc2V0OworCitjbGFzcyBDRkZFbmNvZGluZyB7CisgIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgZW5jb2RpbmcsIHJhdykgeworICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CisgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIHRoaXMucmF3ID0gcmF3OworICB9CisKK30KKworY2xhc3MgQ0ZGRkRTZWxlY3QgeworICBjb25zdHJ1Y3Rvcihmb3JtYXQsIGZkU2VsZWN0KSB7CisgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgdGhpcy5mZFNlbGVjdCA9IGZkU2VsZWN0OworICB9CisKKyAgZ2V0RkRJbmRleChnbHlwaEluZGV4KSB7CisgICAgaWYgKGdseXBoSW5kZXggPCAwIHx8IGdseXBoSW5kZXggPj0gdGhpcy5mZFNlbGVjdC5sZW5ndGgpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5mZFNlbGVjdFtnbHlwaEluZGV4XTsKKyAgfQorCit9CisKK2V4cG9ydHMuQ0ZGRkRTZWxlY3QgPSBDRkZGRFNlbGVjdDsKKworY2xhc3MgQ0ZGT2Zmc2V0VHJhY2tlciB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMub2Zmc2V0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBpc1RyYWNraW5nKGtleSkgeworICAgIHJldHVybiBrZXkgaW4gdGhpcy5vZmZzZXRzOworICB9CisKKyAgdHJhY2soa2V5LCBsb2NhdGlvbikgeworICAgIGlmIChrZXkgaW4gdGhpcy5vZmZzZXRzKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEFscmVhZHkgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtrZXl9YCk7CisgICAgfQorCisgICAgdGhpcy5vZmZzZXRzW2tleV0gPSBsb2NhdGlvbjsKKyAgfQorCisgIG9mZnNldCh2YWx1ZSkgeworICAgIGZvciAodmFyIGtleSBpbiB0aGlzLm9mZnNldHMpIHsKKyAgICAgIHRoaXMub2Zmc2V0c1trZXldICs9IHZhbHVlOworICAgIH0KKyAgfQorCisgIHNldEVudHJ5TG9jYXRpb24oa2V5LCB2YWx1ZXMsIG91dHB1dCkgeworICAgIGlmICghKGtleSBpbiB0aGlzLm9mZnNldHMpKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYE5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAke2tleX1gKTsKKyAgICB9CisKKyAgICB2YXIgZGF0YSA9IG91dHB1dC5kYXRhOworICAgIHZhciBkYXRhT2Zmc2V0ID0gdGhpcy5vZmZzZXRzW2tleV07CisgICAgdmFyIHNpemUgPSA1OworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgIHZhciBvZmZzZXQwID0gaSAqIHNpemUgKyBkYXRhT2Zmc2V0OworICAgICAgdmFyIG9mZnNldDEgPSBvZmZzZXQwICsgMTsKKyAgICAgIHZhciBvZmZzZXQyID0gb2Zmc2V0MCArIDI7CisgICAgICB2YXIgb2Zmc2V0MyA9IG9mZnNldDAgKyAzOworICAgICAgdmFyIG9mZnNldDQgPSBvZmZzZXQwICsgNDsKKworICAgICAgaWYgKGRhdGFbb2Zmc2V0MF0gIT09IDB4MWQgfHwgZGF0YVtvZmZzZXQxXSAhPT0gMCB8fCBkYXRhW29mZnNldDJdICE9PSAwIHx8IGRhdGFbb2Zmc2V0M10gIT09IDAgfHwgZGF0YVtvZmZzZXQ0XSAhPT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIndyaXRpbmcgdG8gYW4gb2Zmc2V0IHRoYXQgaXMgbm90IGVtcHR5Iik7CisgICAgICB9CisKKyAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTsKKyAgICAgIGRhdGFbb2Zmc2V0MF0gPSAweDFkOworICAgICAgZGF0YVtvZmZzZXQxXSA9IHZhbHVlID4+IDI0ICYgMHhmZjsKKyAgICAgIGRhdGFbb2Zmc2V0Ml0gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7CisgICAgICBkYXRhW29mZnNldDNdID0gdmFsdWUgPj4gOCAmIDB4ZmY7CisgICAgICBkYXRhW29mZnNldDRdID0gdmFsdWUgJiAweGZmOworICAgIH0KKyAgfQorCit9CisKK2NsYXNzIENGRkNvbXBpbGVyIHsKKyAgY29uc3RydWN0b3IoY2ZmKSB7CisgICAgdGhpcy5jZmYgPSBjZmY7CisgIH0KKworICBjb21waWxlKCkgeworICAgIHZhciBjZmYgPSB0aGlzLmNmZjsKKyAgICB2YXIgb3V0cHV0ID0geworICAgICAgZGF0YTogW10sCisgICAgICBsZW5ndGg6IDAsCisgICAgICBhZGQ6IGZ1bmN0aW9uIENGRkNvbXBpbGVyX2FkZChkYXRhKSB7CisgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZGF0YSk7CisgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDsKKyAgICAgIH0KKyAgICB9OworICAgIHZhciBoZWFkZXIgPSB0aGlzLmNvbXBpbGVIZWFkZXIoY2ZmLmhlYWRlcik7CisgICAgb3V0cHV0LmFkZChoZWFkZXIpOworICAgIHZhciBuYW1lSW5kZXggPSB0aGlzLmNvbXBpbGVOYW1lSW5kZXgoY2ZmLm5hbWVzKTsKKyAgICBvdXRwdXQuYWRkKG5hbWVJbmRleCk7CisKKyAgICBpZiAoY2ZmLmlzQ0lERm9udCkgeworICAgICAgaWYgKGNmZi50b3BEaWN0Lmhhc05hbWUoIkZvbnRNYXRyaXgiKSkgeworICAgICAgICB2YXIgYmFzZSA9IGNmZi50b3BEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpOworICAgICAgICBjZmYudG9wRGljdC5yZW1vdmVCeU5hbWUoIkZvbnRNYXRyaXgiKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjZmYuZmRBcnJheS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgdmFyIHN1YkRpY3QgPSBjZmYuZmRBcnJheVtpXTsKKyAgICAgICAgICB2YXIgbWF0cml4ID0gYmFzZS5zbGljZSgwKTsKKworICAgICAgICAgIGlmIChzdWJEaWN0Lmhhc05hbWUoIkZvbnRNYXRyaXgiKSkgeworICAgICAgICAgICAgbWF0cml4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0obWF0cml4LCBzdWJEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdWJEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIG1hdHJpeCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjZmYudG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCAwKTsKKyAgICB2YXIgY29tcGlsZWQgPSB0aGlzLmNvbXBpbGVUb3BEaWN0cyhbY2ZmLnRvcERpY3RdLCBvdXRwdXQubGVuZ3RoLCBjZmYuaXNDSURGb250KTsKKyAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7CisgICAgdmFyIHRvcERpY3RUcmFja2VyID0gY29tcGlsZWQudHJhY2tlcnNbMF07CisgICAgdmFyIHN0cmluZ0luZGV4ID0gdGhpcy5jb21waWxlU3RyaW5nSW5kZXgoY2ZmLnN0cmluZ3Muc3RyaW5ncyk7CisgICAgb3V0cHV0LmFkZChzdHJpbmdJbmRleCk7CisgICAgdmFyIGdsb2JhbFN1YnJJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGNmZi5nbG9iYWxTdWJySW5kZXgpOworICAgIG91dHB1dC5hZGQoZ2xvYmFsU3VickluZGV4KTsKKworICAgIGlmIChjZmYuZW5jb2RpbmcgJiYgY2ZmLnRvcERpY3QuaGFzTmFtZSgiRW5jb2RpbmciKSkgeworICAgICAgaWYgKGNmZi5lbmNvZGluZy5wcmVkZWZpbmVkKSB7CisgICAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIiwgW2NmZi5lbmNvZGluZy5mb3JtYXRdLCBvdXRwdXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGVuY29kaW5nID0gdGhpcy5jb21waWxlRW5jb2RpbmcoY2ZmLmVuY29kaW5nKTsKKyAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRW5jb2RpbmciLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CisgICAgICAgIG91dHB1dC5hZGQoZW5jb2RpbmcpOworICAgICAgfQorICAgIH0KKworICAgIHZhciBjaGFyc2V0ID0gdGhpcy5jb21waWxlQ2hhcnNldChjZmYuY2hhcnNldCwgY2ZmLmNoYXJTdHJpbmdzLmNvdW50LCBjZmYuc3RyaW5ncywgY2ZmLmlzQ0lERm9udCk7CisgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKKyAgICBvdXRwdXQuYWRkKGNoYXJzZXQpOworICAgIHZhciBjaGFyU3RyaW5ncyA9IHRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGNmZi5jaGFyU3RyaW5ncyk7CisgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiQ2hhclN0cmluZ3MiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CisgICAgb3V0cHV0LmFkZChjaGFyU3RyaW5ncyk7CisKKyAgICBpZiAoY2ZmLmlzQ0lERm9udCkgeworICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CisgICAgICB2YXIgZmRTZWxlY3QgPSB0aGlzLmNvbXBpbGVGRFNlbGVjdChjZmYuZmRTZWxlY3QpOworICAgICAgb3V0cHV0LmFkZChmZFNlbGVjdCk7CisgICAgICBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKGNmZi5mZEFycmF5LCBvdXRwdXQubGVuZ3RoLCB0cnVlKTsKKyAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkZEQXJyYXkiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CisgICAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7CisgICAgICB2YXIgZm9udERpY3RUcmFja2VycyA9IGNvbXBpbGVkLnRyYWNrZXJzOworICAgICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKGNmZi5mZEFycmF5LCBmb250RGljdFRyYWNrZXJzLCBvdXRwdXQpOworICAgIH0KKworICAgIHRoaXMuY29tcGlsZVByaXZhdGVEaWN0cyhbY2ZmLnRvcERpY3RdLCBbdG9wRGljdFRyYWNrZXJdLCBvdXRwdXQpOworICAgIG91dHB1dC5hZGQoWzBdKTsKKyAgICByZXR1cm4gb3V0cHV0LmRhdGE7CisgIH0KKworICBlbmNvZGVOdW1iZXIodmFsdWUpIHsKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKKyAgICAgIHJldHVybiB0aGlzLmVuY29kZUludGVnZXIodmFsdWUpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmVuY29kZUZsb2F0KHZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyBnZXQgRW5jb2RlRmxvYXRSZWdFeHAoKSB7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJFbmNvZGVGbG9hdFJlZ0V4cCIsIC9cLihcZCo/KSg/Ojl7NSwyMH18MHs1LDIwfSlcZHswLDJ9KD86ZSguKyl8JCkvKTsKKyAgfQorCisgIGVuY29kZUZsb2F0KG51bSkgeworICAgIHZhciB2YWx1ZSA9IG51bS50b1N0cmluZygpOworICAgIHZhciBtID0gQ0ZGQ29tcGlsZXIuRW5jb2RlRmxvYXRSZWdFeHAuZXhlYyh2YWx1ZSk7CisKKyAgICBpZiAobSkgeworICAgICAgdmFyIGVwc2lsb24gPSBwYXJzZUZsb2F0KCIxZSIgKyAoKG1bMl0gPyArbVsyXSA6IDApICsgbVsxXS5sZW5ndGgpKTsKKyAgICAgIHZhbHVlID0gKE1hdGgucm91bmQobnVtICogZXBzaWxvbikgLyBlcHNpbG9uKS50b1N0cmluZygpOworICAgIH0KKworICAgIHZhciBuaWJibGVzID0gIiI7CisgICAgdmFyIGksIGlpOworCisgICAgZm9yIChpID0gMCwgaWkgPSB2YWx1ZS5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICB2YXIgYSA9IHZhbHVlW2ldOworCisgICAgICBpZiAoYSA9PT0gImUiKSB7CisgICAgICAgIG5pYmJsZXMgKz0gdmFsdWVbKytpXSA9PT0gIi0iID8gImMiIDogImIiOworICAgICAgfSBlbHNlIGlmIChhID09PSAiLiIpIHsKKyAgICAgICAgbmliYmxlcyArPSAiYSI7CisgICAgICB9IGVsc2UgaWYgKGEgPT09ICItIikgeworICAgICAgICBuaWJibGVzICs9ICJlIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5pYmJsZXMgKz0gYTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBuaWJibGVzICs9IG5pYmJsZXMubGVuZ3RoICYgMSA/ICJmIiA6ICJmZiI7CisgICAgdmFyIG91dCA9IFszMF07CisKKyAgICBmb3IgKGkgPSAwLCBpaSA9IG5pYmJsZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgeworICAgICAgb3V0LnB1c2gocGFyc2VJbnQobmliYmxlcy5zdWJzdHJpbmcoaSwgaSArIDIpLCAxNikpOworICAgIH0KKworICAgIHJldHVybiBvdXQ7CisgIH0KKworICBlbmNvZGVJbnRlZ2VyKHZhbHVlKSB7CisgICAgdmFyIGNvZGU7CisKKyAgICBpZiAodmFsdWUgPj0gLTEwNyAmJiB2YWx1ZSA8PSAxMDcpIHsKKyAgICAgIGNvZGUgPSBbdmFsdWUgKyAxMzldOworICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHsKKyAgICAgIHZhbHVlID0gdmFsdWUgLSAxMDg7CisgICAgICBjb2RlID0gWyh2YWx1ZSA+PiA4KSArIDI0NywgdmFsdWUgJiAweGZmXTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0xMTMxICYmIHZhbHVlIDw9IC0xMDgpIHsKKyAgICAgIHZhbHVlID0gLXZhbHVlIC0gMTA4OworICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNTEsIHZhbHVlICYgMHhmZl07CisgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAtMzI3NjggJiYgdmFsdWUgPD0gMzI3NjcpIHsKKyAgICAgIGNvZGUgPSBbMHgxYywgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZl07CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGUgPSBbMHgxZCwgdmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmZdOworICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9CisKKyAgY29tcGlsZUhlYWRlcihoZWFkZXIpIHsKKyAgICByZXR1cm4gW2hlYWRlci5tYWpvciwgaGVhZGVyLm1pbm9yLCBoZWFkZXIuaGRyU2l6ZSwgaGVhZGVyLm9mZlNpemVdOworICB9CisKKyAgY29tcGlsZU5hbWVJbmRleChuYW1lcykgeworICAgIHZhciBuYW1lSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG5hbWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgIHZhciBuYW1lID0gbmFtZXNbaV07CisgICAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7CisgICAgICB2YXIgc2FuaXRpemVkTmFtZSA9IG5ldyBBcnJheShsZW5ndGgpOworCisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisgICAgICAgIHZhciBjaGFyID0gbmFtZVtqXTsKKworICAgICAgICBpZiAoY2hhciA8ICIhIiB8fCBjaGFyID4gIn4iIHx8IGNoYXIgPT09ICJbIiB8fCBjaGFyID09PSAiXSIgfHwgY2hhciA9PT0gIigiIHx8IGNoYXIgPT09ICIpIiB8fCBjaGFyID09PSAieyIgfHwgY2hhciA9PT0gIn0iIHx8IGNoYXIgPT09ICI8IiB8fCBjaGFyID09PSAiPiIgfHwgY2hhciA9PT0gIi8iIHx8IGNoYXIgPT09ICIlIikgeworICAgICAgICAgIGNoYXIgPSAiXyI7CisgICAgICAgIH0KKworICAgICAgICBzYW5pdGl6ZWROYW1lW2pdID0gY2hhcjsKKyAgICAgIH0KKworICAgICAgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplZE5hbWUuam9pbigiIik7CisKKyAgICAgIGlmIChzYW5pdGl6ZWROYW1lID09PSAiIikgeworICAgICAgICBzYW5pdGl6ZWROYW1lID0gIkJhZF9Gb250X05hbWUiOworICAgICAgfQorCisgICAgICBuYW1lSW5kZXguYWRkKCgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShzYW5pdGl6ZWROYW1lKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KG5hbWVJbmRleCk7CisgIH0KKworICBjb21waWxlVG9wRGljdHMoZGljdHMsIGxlbmd0aCwgcmVtb3ZlQ2lkS2V5cykgeworICAgIHZhciBmb250RGljdFRyYWNrZXJzID0gW107CisgICAgdmFyIGZkQXJyYXlJbmRleCA9IG5ldyBDRkZJbmRleCgpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGljdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgdmFyIGZvbnREaWN0ID0gZGljdHNbaV07CisKKyAgICAgIGlmIChyZW1vdmVDaWRLZXlzKSB7CisgICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiQ0lERm9udFZlcnNpb24iKTsKKyAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURGb250UmV2aXNpb24iKTsKKyAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURGb250VHlwZSIpOworICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJRENvdW50Iik7CisgICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiVUlEQmFzZSIpOworICAgICAgfQorCisgICAgICB2YXIgZm9udERpY3RUcmFja2VyID0gbmV3IENGRk9mZnNldFRyYWNrZXIoKTsKKyAgICAgIHZhciBmb250RGljdERhdGEgPSB0aGlzLmNvbXBpbGVEaWN0KGZvbnREaWN0LCBmb250RGljdFRyYWNrZXIpOworICAgICAgZm9udERpY3RUcmFja2Vycy5wdXNoKGZvbnREaWN0VHJhY2tlcik7CisgICAgICBmZEFycmF5SW5kZXguYWRkKGZvbnREaWN0RGF0YSk7CisgICAgICBmb250RGljdFRyYWNrZXIub2Zmc2V0KGxlbmd0aCk7CisgICAgfQorCisgICAgZmRBcnJheUluZGV4ID0gdGhpcy5jb21waWxlSW5kZXgoZmRBcnJheUluZGV4LCBmb250RGljdFRyYWNrZXJzKTsKKyAgICByZXR1cm4geworICAgICAgdHJhY2tlcnM6IGZvbnREaWN0VHJhY2tlcnMsCisgICAgICBvdXRwdXQ6IGZkQXJyYXlJbmRleAorICAgIH07CisgIH0KKworICBjb21waWxlUHJpdmF0ZURpY3RzKGRpY3RzLCB0cmFja2Vycywgb3V0cHV0KSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGljdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgdmFyIGZvbnREaWN0ID0gZGljdHNbaV07CisgICAgICB2YXIgcHJpdmF0ZURpY3QgPSBmb250RGljdC5wcml2YXRlRGljdDsKKworICAgICAgaWYgKCFwcml2YXRlRGljdCB8fCAhZm9udERpY3QuaGFzTmFtZSgiUHJpdmF0ZSIpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVGhlcmUgbXVzdCBiZSBhIHByaXZhdGUgZGljdGlvbmFyeS4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIHByaXZhdGVEaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CisgICAgICB2YXIgcHJpdmF0ZURpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChwcml2YXRlRGljdCwgcHJpdmF0ZURpY3RUcmFja2VyKTsKKyAgICAgIHZhciBvdXRwdXRMZW5ndGggPSBvdXRwdXQubGVuZ3RoOworICAgICAgcHJpdmF0ZURpY3RUcmFja2VyLm9mZnNldChvdXRwdXRMZW5ndGgpOworCisgICAgICBpZiAoIXByaXZhdGVEaWN0RGF0YS5sZW5ndGgpIHsKKyAgICAgICAgb3V0cHV0TGVuZ3RoID0gMDsKKyAgICAgIH0KKworICAgICAgdHJhY2tlcnNbaV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoLCBvdXRwdXRMZW5ndGhdLCBvdXRwdXQpOworICAgICAgb3V0cHV0LmFkZChwcml2YXRlRGljdERhdGEpOworCisgICAgICBpZiAocHJpdmF0ZURpY3Quc3VicnNJbmRleCAmJiBwcml2YXRlRGljdC5oYXNOYW1lKCJTdWJycyIpKSB7CisgICAgICAgIHZhciBzdWJycyA9IHRoaXMuY29tcGlsZUluZGV4KHByaXZhdGVEaWN0LnN1YnJzSW5kZXgpOworICAgICAgICBwcml2YXRlRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiU3VicnMiLCBbcHJpdmF0ZURpY3REYXRhLmxlbmd0aF0sIG91dHB1dCk7CisgICAgICAgIG91dHB1dC5hZGQoc3VicnMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGNvbXBpbGVEaWN0KGRpY3QsIG9mZnNldFRyYWNrZXIpIHsKKyAgICB2YXIgb3V0ID0gW107CisgICAgdmFyIG9yZGVyID0gZGljdC5vcmRlcjsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyArK2kpIHsKKyAgICAgIHZhciBrZXkgPSBvcmRlcltpXTsKKworICAgICAgaWYgKCEoa2V5IGluIGRpY3QudmFsdWVzKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdmFyIHZhbHVlcyA9IGRpY3QudmFsdWVzW2tleV07CisgICAgICB2YXIgdHlwZXMgPSBkaWN0LnR5cGVzW2tleV07CisKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlcykpIHsKKyAgICAgICAgdHlwZXMgPSBbdHlwZXNdOworICAgICAgfQorCisgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgeworICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKKyAgICAgIH0KKworICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHR5cGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKKyAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tqXTsKKyAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzW2pdOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgIGNhc2UgIm51bSI6CisgICAgICAgICAgY2FzZSAic2lkIjoKKyAgICAgICAgICAgIG91dCA9IG91dC5jb25jYXQodGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAib2Zmc2V0IjoKKyAgICAgICAgICAgIHZhciBuYW1lID0gZGljdC5rZXlUb05hbWVNYXBba2V5XTsKKworICAgICAgICAgICAgaWYgKCFvZmZzZXRUcmFja2VyLmlzVHJhY2tpbmcobmFtZSkpIHsKKyAgICAgICAgICAgICAgb2Zmc2V0VHJhY2tlci50cmFjayhuYW1lLCBvdXQubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdChbMHgxZCwgMCwgMCwgMCwgMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJhcnJheSI6CisgICAgICAgICAgY2FzZSAiZGVsdGEiOgorICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdCh0aGlzLmVuY29kZU51bWJlcih2YWx1ZSkpOworCisgICAgICAgICAgICBmb3IgKHZhciBrID0gMSwga2sgPSB2YWx1ZXMubGVuZ3RoOyBrIDwga2s7ICsraykgeworICAgICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlc1trXSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVua25vd24gZGF0YSB0eXBlIG9mICR7dHlwZX1gKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBvdXQgPSBvdXQuY29uY2F0KGRpY3Qub3Bjb2Rlc1trZXldKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgY29tcGlsZVN0cmluZ0luZGV4KHN0cmluZ3MpIHsKKyAgICB2YXIgc3RyaW5nSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgc3RyaW5nSW5kZXguYWRkKCgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShzdHJpbmdzW2ldKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KHN0cmluZ0luZGV4KTsKKyAgfQorCisgIGNvbXBpbGVHbG9iYWxTdWJySW5kZXgoKSB7CisgICAgdmFyIGdsb2JhbFN1YnJJbmRleCA9IHRoaXMuY2ZmLmdsb2JhbFN1YnJJbmRleDsKKyAgICB0aGlzLm91dC53cml0ZUJ5dGVBcnJheSh0aGlzLmNvbXBpbGVJbmRleChnbG9iYWxTdWJySW5kZXgpKTsKKyAgfQorCisgIGNvbXBpbGVDaGFyU3RyaW5ncyhjaGFyU3RyaW5ncykgeworICAgIHZhciBjaGFyU3RyaW5nc0luZGV4ID0gbmV3IENGRkluZGV4KCk7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJTdHJpbmdzLmNvdW50OyBpKyspIHsKKyAgICAgIHZhciBnbHlwaCA9IGNoYXJTdHJpbmdzLmdldChpKTsKKworICAgICAgaWYgKGdseXBoLmxlbmd0aCA9PT0gMCkgeworICAgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChuZXcgVWludDhBcnJheShbMHg4YiwgMHgwZV0pKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgoY2hhclN0cmluZ3NJbmRleCk7CisgIH0KKworICBjb21waWxlQ2hhcnNldChjaGFyc2V0LCBudW1HbHlwaHMsIHN0cmluZ3MsIGlzQ0lERm9udCkgeworICAgIGxldCBvdXQ7CisgICAgY29uc3QgbnVtR2x5cGhzTGVzc05vdERlZiA9IG51bUdseXBocyAtIDE7CisKKyAgICBpZiAoaXNDSURGb250KSB7CisgICAgICBvdXQgPSBuZXcgVWludDhBcnJheShbMiwgMCwgMCwgbnVtR2x5cGhzTGVzc05vdERlZiA+PiA4ICYgMHhmZiwgbnVtR2x5cGhzTGVzc05vdERlZiAmIDB4ZmZdKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgbGVuZ3RoID0gMSArIG51bUdseXBoc0xlc3NOb3REZWYgKiAyOworICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKKyAgICAgIG91dFswXSA9IDA7CisgICAgICBsZXQgY2hhcnNldEluZGV4ID0gMDsKKyAgICAgIGNvbnN0IG51bUNoYXJzZXRzID0gY2hhcnNldC5jaGFyc2V0Lmxlbmd0aDsKKyAgICAgIGxldCB3YXJuZWQgPSBmYWxzZTsKKworICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgbGV0IHNpZCA9IDA7CisKKyAgICAgICAgaWYgKGNoYXJzZXRJbmRleCA8IG51bUNoYXJzZXRzKSB7CisgICAgICAgICAgY29uc3QgbmFtZSA9IGNoYXJzZXQuY2hhcnNldFtjaGFyc2V0SW5kZXgrK107CisgICAgICAgICAgc2lkID0gc3RyaW5ncy5nZXRTSUQobmFtZSk7CisKKyAgICAgICAgICBpZiAoc2lkID09PSAtMSkgeworICAgICAgICAgICAgc2lkID0gMDsKKworICAgICAgICAgICAgaWYgKCF3YXJuZWQpIHsKKyAgICAgICAgICAgICAgd2FybmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBDb3VsZG4ndCBmaW5kICR7bmFtZX0gaW4gQ0ZGIHN0cmluZ3NgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRbaV0gPSBzaWQgPj4gOCAmIDB4ZmY7CisgICAgICAgIG91dFtpICsgMV0gPSBzaWQgJiAweGZmOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KG91dCk7CisgIH0KKworICBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHsKKyAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShlbmNvZGluZy5yYXcpOworICB9CisKKyAgY29tcGlsZUZEU2VsZWN0KGZkU2VsZWN0KSB7CisgICAgY29uc3QgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0OworICAgIGxldCBvdXQsIGk7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgY2FzZSAwOgorICAgICAgICBvdXQgPSBuZXcgVWludDhBcnJheSgxICsgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoKTsKKyAgICAgICAgb3V0WzBdID0gZm9ybWF0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIG91dFtpICsgMV0gPSBmZFNlbGVjdC5mZFNlbGVjdFtpXTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIGNvbnN0IHN0YXJ0ID0gMDsKKyAgICAgICAgbGV0IGxhc3RGRCA9IGZkU2VsZWN0LmZkU2VsZWN0WzBdOworICAgICAgICBjb25zdCByYW5nZXMgPSBbZm9ybWF0LCAwLCAwLCBzdGFydCA+PiA4ICYgMHhmZiwgc3RhcnQgJiAweGZmLCBsYXN0RkRdOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGNvbnN0IGN1cnJlbnRGRCA9IGZkU2VsZWN0LmZkU2VsZWN0W2ldOworCisgICAgICAgICAgaWYgKGN1cnJlbnRGRCAhPT0gbGFzdEZEKSB7CisgICAgICAgICAgICByYW5nZXMucHVzaChpID4+IDggJiAweGZmLCBpICYgMHhmZiwgY3VycmVudEZEKTsKKyAgICAgICAgICAgIGxhc3RGRCA9IGN1cnJlbnRGRDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBudW1SYW5nZXMgPSAocmFuZ2VzLmxlbmd0aCAtIDMpIC8gMzsKKyAgICAgICAgcmFuZ2VzWzFdID0gbnVtUmFuZ2VzID4+IDggJiAweGZmOworICAgICAgICByYW5nZXNbMl0gPSBudW1SYW5nZXMgJiAweGZmOworICAgICAgICByYW5nZXMucHVzaChpID4+IDggJiAweGZmLCBpICYgMHhmZik7CisgICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHJhbmdlcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KG91dCk7CisgIH0KKworICBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7CisgICAgdmFyIG91dCA9IFtdOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICBvdXRbaV0gPSBkYXRhW2ldOworICAgIH0KKworICAgIHJldHVybiBvdXQ7CisgIH0KKworICBjb21waWxlSW5kZXgoaW5kZXgsIHRyYWNrZXJzID0gW10pIHsKKyAgICB2YXIgb2JqZWN0cyA9IGluZGV4Lm9iamVjdHM7CisgICAgdmFyIGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7CisKKyAgICBpZiAoY291bnQgPT09IDApIHsKKyAgICAgIHJldHVybiBbMCwgMCwgMF07CisgICAgfQorCisgICAgdmFyIGRhdGEgPSBbY291bnQgPj4gOCAmIDB4ZmYsIGNvdW50ICYgMHhmZl07CisgICAgdmFyIGxhc3RPZmZzZXQgPSAxLAorICAgICAgICBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgIGxhc3RPZmZzZXQgKz0gb2JqZWN0c1tpXS5sZW5ndGg7CisgICAgfQorCisgICAgdmFyIG9mZnNldFNpemU7CisKKyAgICBpZiAobGFzdE9mZnNldCA8IDB4MTAwKSB7CisgICAgICBvZmZzZXRTaXplID0gMTsKKyAgICB9IGVsc2UgaWYgKGxhc3RPZmZzZXQgPCAweDEwMDAwKSB7CisgICAgICBvZmZzZXRTaXplID0gMjsKKyAgICB9IGVsc2UgaWYgKGxhc3RPZmZzZXQgPCAweDEwMDAwMDApIHsKKyAgICAgIG9mZnNldFNpemUgPSAzOworICAgIH0gZWxzZSB7CisgICAgICBvZmZzZXRTaXplID0gNDsKKyAgICB9CisKKyAgICBkYXRhLnB1c2gob2Zmc2V0U2l6ZSk7CisgICAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCArIDE7IGkrKykgeworICAgICAgaWYgKG9mZnNldFNpemUgPT09IDEpIHsKKyAgICAgICAgZGF0YS5wdXNoKHJlbGF0aXZlT2Zmc2V0ICYgMHhmZik7CisgICAgICB9IGVsc2UgaWYgKG9mZnNldFNpemUgPT09IDIpIHsKKyAgICAgICAgZGF0YS5wdXNoKHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOworICAgICAgfSBlbHNlIGlmIChvZmZzZXRTaXplID09PSAzKSB7CisgICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS5wdXNoKHJlbGF0aXZlT2Zmc2V0ID4+PiAyNCAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDE2ICYgMHhmZiwgcmVsYXRpdmVPZmZzZXQgPj4gOCAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZik7CisgICAgICB9CisKKyAgICAgIGlmIChvYmplY3RzW2ldKSB7CisgICAgICAgIHJlbGF0aXZlT2Zmc2V0ICs9IG9iamVjdHNbaV0ubGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBpZiAodHJhY2tlcnNbaV0pIHsKKyAgICAgICAgdHJhY2tlcnNbaV0ub2Zmc2V0KGRhdGEubGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gb2JqZWN0c1tpXS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGRhdGEucHVzaChvYmplY3RzW2ldW2pdKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCit9CisKK2V4cG9ydHMuQ0ZGQ29tcGlsZXIgPSBDRkZDb21waWxlcjsKKworLyoqKi8gfSksCisvKiAzMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkV4cGVydFN1YnNldENoYXJzZXQgPSBleHBvcnRzLkV4cGVydENoYXJzZXQgPSBleHBvcnRzLklTT0Fkb2JlQ2hhcnNldCA9IHZvaWQgMDsKK2NvbnN0IElTT0Fkb2JlQ2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVyaWdodCIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAicXVvdGVsZWZ0IiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZW5kYXNoIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAicGFyYWdyYXBoIiwgImJ1bGxldCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicXVvdGVkYmxyaWdodCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJwZXJ0aG91c2FuZCIsICJxdWVzdGlvbmRvd24iLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICJBRSIsICJvcmRmZW1pbmluZSIsICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICJhZSIsICJkb3RsZXNzaSIsICJsc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLCAib25lc3VwZXJpb3IiLCAibG9naWNhbG5vdCIsICJtdSIsICJ0cmFkZW1hcmsiLCAiRXRoIiwgIm9uZWhhbGYiLCAicGx1c21pbnVzIiwgIlRob3JuIiwgIm9uZXF1YXJ0ZXIiLCAiZGl2aWRlIiwgImJyb2tlbmJhciIsICJkZWdyZWUiLCAidGhvcm4iLCAidGhyZWVxdWFydGVycyIsICJ0d29zdXBlcmlvciIsICJyZWdpc3RlcmVkIiwgIm1pbnVzIiwgImV0aCIsICJtdWx0aXBseSIsICJ0aHJlZXN1cGVyaW9yIiwgImNvcHlyaWdodCIsICJBYWN1dGUiLCAiQWNpcmN1bWZsZXgiLCAiQWRpZXJlc2lzIiwgIkFncmF2ZSIsICJBcmluZyIsICJBdGlsZGUiLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIkVjaXJjdW1mbGV4IiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiTnRpbGRlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJPZGllcmVzaXMiLCAiT2dyYXZlIiwgIk90aWxkZSIsICJTY2Fyb24iLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVkaWVyZXNpcyIsICJVZ3JhdmUiLCAiWWFjdXRlIiwgIllkaWVyZXNpcyIsICJaY2Fyb24iLCAiYWFjdXRlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhZ3JhdmUiLCAiYXJpbmciLCAiYXRpbGRlIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiZWdyYXZlIiwgImlhY3V0ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAiaWdyYXZlIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm9ncmF2ZSIsICJvdGlsZGUiLCAic2Nhcm9uIiwgInVhY3V0ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAidWdyYXZlIiwgInlhY3V0ZSIsICJ5ZGllcmVzaXMiLCAiemNhcm9uIl07CitleHBvcnRzLklTT0Fkb2JlQ2hhcnNldCA9IElTT0Fkb2JlQ2hhcnNldDsKK2NvbnN0IEV4cGVydENoYXJzZXQgPSBbIi5ub3RkZWYiLCAic3BhY2UiLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLCAiRGllcmVzaXNzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIiwgIkFncmF2ZXNtYWxsIiwgIkFhY3V0ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXJpbmdzbWFsbCIsICJBRXNtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIkV0aHNtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT3RpbGRlc21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT0VzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJVZ3JhdmVzbWFsbCIsICJVYWN1dGVzbWFsbCIsICJVY2lyY3VtZmxleHNtYWxsIiwgIlVkaWVyZXNpc3NtYWxsIiwgIllhY3V0ZXNtYWxsIiwgIlRob3Juc21hbGwiLCAiWWRpZXJlc2lzc21hbGwiXTsKK2V4cG9ydHMuRXhwZXJ0Q2hhcnNldCA9IEV4cGVydENoYXJzZXQ7Citjb25zdCBFeHBlcnRTdWJzZXRDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJoeXBoZW5zdXBlcmlvciIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiY2VudG9sZHN0eWxlIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuaW5mZXJpb3IiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiXTsKK2V4cG9ydHMuRXhwZXJ0U3Vic2V0Q2hhcnNldCA9IEV4cGVydFN1YnNldENoYXJzZXQ7CisKKy8qKiovIH0pLAorLyogMzMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRFbmNvZGluZyA9IGdldEVuY29kaW5nOworZXhwb3J0cy5FeHBlcnRFbmNvZGluZyA9IGV4cG9ydHMuWmFwZkRpbmdiYXRzRW5jb2RpbmcgPSBleHBvcnRzLlN5bWJvbFNldEVuY29kaW5nID0gZXhwb3J0cy5NYWNSb21hbkVuY29kaW5nID0gZXhwb3J0cy5TdGFuZGFyZEVuY29kaW5nID0gZXhwb3J0cy5XaW5BbnNpRW5jb2RpbmcgPSB2b2lkIDA7Citjb25zdCBFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICIiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgIiIsICIiLCAiIiwgImlzdXBlcmlvciIsICIiLCAiIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICIiLCAiIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbnN1cGVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIlNjYXJvbnNtYWxsIiwgIlpjYXJvbnNtYWxsIiwgIkRpZXJlc2lzc21hbGwiLCAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIiIsICJEb3RhY2NlbnRzbWFsbCIsICIiLCAiIiwgIk1hY3JvbnNtYWxsIiwgIiIsICIiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICIiLCAiIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiemVyb3N1cGVyaW9yIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIl07CitleHBvcnRzLkV4cGVydEVuY29kaW5nID0gRXhwZXJ0RW5jb2Rpbmc7Citjb25zdCBNYWNFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgIiIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgIiIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICIiLCAiIiwgIiIsICJFdGhzbWFsbCIsICIiLCAiIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbmluZmVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgImFzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgIkFhY3V0ZXNtYWxsIiwgIkFncmF2ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQXJpbmdzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk90aWxkZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiIiwgImVpZ2h0c3VwZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgIlNjYXJvbnNtYWxsIiwgIiIsICJjZW50aW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAiIiwgIkRpZXJlc2lzc21hbGwiLCAiIiwgIkNhcm9uc21hbGwiLCAib3N1cGVyaW9yIiwgImZpdmVpbmZlcmlvciIsICIiLCAiY29tbWFpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJZYWN1dGVzbWFsbCIsICIiLCAiZG9sbGFyaW5mZXJpb3IiLCAiIiwgIiIsICJUaG9ybnNtYWxsIiwgIiIsICJuaW5laW5mZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIlpjYXJvbnNtYWxsIiwgIkFFc21hbGwiLCAiT3NsYXNoc21hbGwiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25laW5mZXJpb3IiLCAiTHNsYXNoc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiQ2VkaWxsYXNtYWxsIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiT0VzbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbnN1cGVyaW9yIiwgIiIsICIiLCAiIiwgIiIsICJleGNsYW1kb3duc21hbGwiLCAiIiwgIllkaWVyZXNpc3NtYWxsIiwgIiIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb3N1cGVyaW9yIiwgIiIsICJlc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInRzdXBlcmlvciIsICIiLCAiIiwgImlzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgIiIsICIiLCAiIiwgIiIsICIiLCAibHN1cGVyaW9yIiwgIk9nb25la3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiTWFjcm9uc21hbGwiLCAiYnN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJtc3VwZXJpb3IiLCAiY29tbWFzdXBlcmlvciIsICJwZXJpb2RzdXBlcmlvciIsICJEb3RhY2NlbnRzbWFsbCIsICJSaW5nc21hbGwiLCAiIiwgIiIsICIiLCAiIl07Citjb25zdCBNYWNSb21hbkVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAiZ3JhdmUiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIiIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIk50aWxkZSIsICJPZGllcmVzaXMiLCAiVWRpZXJlc2lzIiwgImFhY3V0ZSIsICJhZ3JhdmUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImF0aWxkZSIsICJhcmluZyIsICJjY2VkaWxsYSIsICJlYWN1dGUiLCAiZWdyYXZlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpYWN1dGUiLCAiaWdyYXZlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJudGlsZGUiLCAib2FjdXRlIiwgIm9ncmF2ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib3RpbGRlIiwgInVhY3V0ZSIsICJ1Z3JhdmUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgImRhZ2dlciIsICJkZWdyZWUiLCAiY2VudCIsICJzdGVybGluZyIsICJzZWN0aW9uIiwgImJ1bGxldCIsICJwYXJhZ3JhcGgiLCAiZ2VybWFuZGJscyIsICJyZWdpc3RlcmVkIiwgImNvcHlyaWdodCIsICJ0cmFkZW1hcmsiLCAiYWN1dGUiLCAiZGllcmVzaXMiLCAibm90ZXF1YWwiLCAiQUUiLCAiT3NsYXNoIiwgImluZmluaXR5IiwgInBsdXNtaW51cyIsICJsZXNzZXF1YWwiLCAiZ3JlYXRlcmVxdWFsIiwgInllbiIsICJtdSIsICJwYXJ0aWFsZGlmZiIsICJzdW1tYXRpb24iLCAicHJvZHVjdCIsICJwaSIsICJpbnRlZ3JhbCIsICJvcmRmZW1pbmluZSIsICJvcmRtYXNjdWxpbmUiLCAiT21lZ2EiLCAiYWUiLCAib3NsYXNoIiwgInF1ZXN0aW9uZG93biIsICJleGNsYW1kb3duIiwgImxvZ2ljYWxub3QiLCAicmFkaWNhbCIsICJmbG9yaW4iLCAiYXBwcm94ZXF1YWwiLCAiRGVsdGEiLCAiZ3VpbGxlbW90bGVmdCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJzcGFjZSIsICJBZ3JhdmUiLCAiQXRpbGRlIiwgIk90aWxkZSIsICJPRSIsICJvZSIsICJlbmRhc2giLCAiZW1kYXNoIiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgImRpdmlkZSIsICJsb3plbmdlIiwgInlkaWVyZXNpcyIsICJZZGllcmVzaXMiLCAiZnJhY3Rpb24iLCAiY3VycmVuY3kiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInBlcnRob3VzYW5kIiwgIkFjaXJjdW1mbGV4IiwgIkVjaXJjdW1mbGV4IiwgIkFhY3V0ZSIsICJFZGllcmVzaXMiLCAiRWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiSWdyYXZlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJhcHBsZSIsICJPZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVncmF2ZSIsICJkb3RsZXNzaSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iXTsKK2V4cG9ydHMuTWFjUm9tYW5FbmNvZGluZyA9IE1hY1JvbWFuRW5jb2Rpbmc7Citjb25zdCBTdGFuZGFyZEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiIiwgImVuZGFzaCIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgIiIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgIiIsICJxdWVzdGlvbmRvd24iLCAiIiwgImdyYXZlIiwgImFjdXRlIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJkaWVyZXNpcyIsICIiLCAicmluZyIsICJjZWRpbGxhIiwgIiIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiQUUiLCAiIiwgIm9yZGZlbWluaW5lIiwgIiIsICIiLCAiIiwgIiIsICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICIiLCAiIiwgIiIsICIiLCAiIiwgImFlIiwgIiIsICIiLCAiIiwgImRvdGxlc3NpIiwgIiIsICIiLCAibHNsYXNoIiwgIm9zbGFzaCIsICJvZSIsICJnZXJtYW5kYmxzIiwgIiIsICIiLCAiIiwgIiJdOworZXhwb3J0cy5TdGFuZGFyZEVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKK2NvbnN0IFdpbkFuc2lFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJidWxsZXQiLCAiRXVybyIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAiZmxvcmluIiwgInF1b3RlZGJsYmFzZSIsICJlbGxpcHNpcyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgImNpcmN1bWZsZXgiLCAicGVydGhvdXNhbmQiLCAiU2Nhcm9uIiwgImd1aWxzaW5nbGxlZnQiLCAiT0UiLCAiYnVsbGV0IiwgIlpjYXJvbiIsICJidWxsZXQiLCAiYnVsbGV0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgImJ1bGxldCIsICJlbmRhc2giLCAiZW1kYXNoIiwgInRpbGRlIiwgInRyYWRlbWFyayIsICJzY2Fyb24iLCAiZ3VpbHNpbmdscmlnaHQiLCAib2UiLCAiYnVsbGV0IiwgInpjYXJvbiIsICJZZGllcmVzaXMiLCAic3BhY2UiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImN1cnJlbmN5IiwgInllbiIsICJicm9rZW5iYXIiLCAic2VjdGlvbiIsICJkaWVyZXNpcyIsICJjb3B5cmlnaHQiLCAib3JkZmVtaW5pbmUiLCAiZ3VpbGxlbW90bGVmdCIsICJsb2dpY2Fsbm90IiwgImh5cGhlbiIsICJyZWdpc3RlcmVkIiwgIm1hY3JvbiIsICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwgImNlZGlsbGEiLCAib25lc3VwZXJpb3IiLCAib3JkbWFzY3VsaW5lIiwgImd1aWxsZW1vdHJpZ2h0IiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93biIsICJBZ3JhdmUiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkF0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQUUiLCAiQ2NlZGlsbGEiLCAiRWdyYXZlIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiSWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiRXRoIiwgIk50aWxkZSIsICJPZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk90aWxkZSIsICJPZGllcmVzaXMiLCAibXVsdGlwbHkiLCAiT3NsYXNoIiwgIlVncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIllhY3V0ZSIsICJUaG9ybiIsICJnZXJtYW5kYmxzIiwgImFncmF2ZSIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYXRpbGRlIiwgImFkaWVyZXNpcyIsICJhcmluZyIsICJhZSIsICJjY2VkaWxsYSIsICJlZ3JhdmUiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJldGgiLCAibnRpbGRlIiwgIm9ncmF2ZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib3RpbGRlIiwgIm9kaWVyZXNpcyIsICJkaXZpZGUiLCAib3NsYXNoIiwgInVncmF2ZSIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInlhY3V0ZSIsICJ0aG9ybiIsICJ5ZGllcmVzaXMiXTsKK2V4cG9ydHMuV2luQW5zaUVuY29kaW5nID0gV2luQW5zaUVuY29kaW5nOworY29uc3QgU3ltYm9sU2V0RW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInVuaXZlcnNhbCIsICJudW1iZXJzaWduIiwgImV4aXN0ZW50aWFsIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInN1Y2h0aGF0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrbWF0aCIsICJwbHVzIiwgImNvbW1hIiwgIm1pbnVzIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiY29uZ3J1ZW50IiwgIkFscGhhIiwgIkJldGEiLCAiQ2hpIiwgIkRlbHRhIiwgIkVwc2lsb24iLCAiUGhpIiwgIkdhbW1hIiwgIkV0YSIsICJJb3RhIiwgInRoZXRhMSIsICJLYXBwYSIsICJMYW1iZGEiLCAiTXUiLCAiTnUiLCAiT21pY3JvbiIsICJQaSIsICJUaGV0YSIsICJSaG8iLCAiU2lnbWEiLCAiVGF1IiwgIlVwc2lsb24iLCAic2lnbWExIiwgIk9tZWdhIiwgIlhpIiwgIlBzaSIsICJaZXRhIiwgImJyYWNrZXRsZWZ0IiwgInRoZXJlZm9yZSIsICJicmFja2V0cmlnaHQiLCAicGVycGVuZGljdWxhciIsICJ1bmRlcnNjb3JlIiwgInJhZGljYWxleCIsICJhbHBoYSIsICJiZXRhIiwgImNoaSIsICJkZWx0YSIsICJlcHNpbG9uIiwgInBoaSIsICJnYW1tYSIsICJldGEiLCAiaW90YSIsICJwaGkxIiwgImthcHBhIiwgImxhbWJkYSIsICJtdSIsICJudSIsICJvbWljcm9uIiwgInBpIiwgInRoZXRhIiwgInJobyIsICJzaWdtYSIsICJ0YXUiLCAidXBzaWxvbiIsICJvbWVnYTEiLCAib21lZ2EiLCAieGkiLCAicHNpIiwgInpldGEiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgInNpbWlsYXIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiRXVybyIsICJVcHNpbG9uMSIsICJtaW51dGUiLCAibGVzc2VxdWFsIiwgImZyYWN0aW9uIiwgImluZmluaXR5IiwgImZsb3JpbiIsICJjbHViIiwgImRpYW1vbmQiLCAiaGVhcnQiLCAic3BhZGUiLCAiYXJyb3dib3RoIiwgImFycm93bGVmdCIsICJhcnJvd3VwIiwgImFycm93cmlnaHQiLCAiYXJyb3dkb3duIiwgImRlZ3JlZSIsICJwbHVzbWludXMiLCAic2Vjb25kIiwgImdyZWF0ZXJlcXVhbCIsICJtdWx0aXBseSIsICJwcm9wb3J0aW9uYWwiLCAicGFydGlhbGRpZmYiLCAiYnVsbGV0IiwgImRpdmlkZSIsICJub3RlcXVhbCIsICJlcXVpdmFsZW5jZSIsICJhcHByb3hlcXVhbCIsICJlbGxpcHNpcyIsICJhcnJvd3ZlcnRleCIsICJhcnJvd2hvcml6ZXgiLCAiY2FycmlhZ2VyZXR1cm4iLCAiYWxlcGgiLCAiSWZyYWt0dXIiLCAiUmZyYWt0dXIiLCAid2VpZXJzdHJhc3MiLCAiY2lyY2xlbXVsdGlwbHkiLCAiY2lyY2xlcGx1cyIsICJlbXB0eXNldCIsICJpbnRlcnNlY3Rpb24iLCAidW5pb24iLCAicHJvcGVyc3VwZXJzZXQiLCAicmVmbGV4c3VwZXJzZXQiLCAibm90c3Vic2V0IiwgInByb3BlcnN1YnNldCIsICJyZWZsZXhzdWJzZXQiLCAiZWxlbWVudCIsICJub3RlbGVtZW50IiwgImFuZ2xlIiwgImdyYWRpZW50IiwgInJlZ2lzdGVyc2VyaWYiLCAiY29weXJpZ2h0c2VyaWYiLCAidHJhZGVtYXJrc2VyaWYiLCAicHJvZHVjdCIsICJyYWRpY2FsIiwgImRvdG1hdGgiLCAibG9naWNhbG5vdCIsICJsb2dpY2FsYW5kIiwgImxvZ2ljYWxvciIsICJhcnJvd2RibGJvdGgiLCAiYXJyb3dkYmxsZWZ0IiwgImFycm93ZGJsdXAiLCAiYXJyb3dkYmxyaWdodCIsICJhcnJvd2RibGRvd24iLCAibG96ZW5nZSIsICJhbmdsZWxlZnQiLCAicmVnaXN0ZXJzYW5zIiwgImNvcHlyaWdodHNhbnMiLCAidHJhZGVtYXJrc2FucyIsICJzdW1tYXRpb24iLCAicGFyZW5sZWZ0dHAiLCAicGFyZW5sZWZ0ZXgiLCAicGFyZW5sZWZ0YnQiLCAiYnJhY2tldGxlZnR0cCIsICJicmFja2V0bGVmdGV4IiwgImJyYWNrZXRsZWZ0YnQiLCAiYnJhY2VsZWZ0dHAiLCAiYnJhY2VsZWZ0bWlkIiwgImJyYWNlbGVmdGJ0IiwgImJyYWNlZXgiLCAiIiwgImFuZ2xlcmlnaHQiLCAiaW50ZWdyYWwiLCAiaW50ZWdyYWx0cCIsICJpbnRlZ3JhbGV4IiwgImludGVncmFsYnQiLCAicGFyZW5yaWdodHRwIiwgInBhcmVucmlnaHRleCIsICJwYXJlbnJpZ2h0YnQiLCAiYnJhY2tldHJpZ2h0dHAiLCAiYnJhY2tldHJpZ2h0ZXgiLCAiYnJhY2tldHJpZ2h0YnQiLCAiYnJhY2VyaWdodHRwIiwgImJyYWNlcmlnaHRtaWQiLCAiYnJhY2VyaWdodGJ0IiwgIiJdOworZXhwb3J0cy5TeW1ib2xTZXRFbmNvZGluZyA9IFN5bWJvbFNldEVuY29kaW5nOworY29uc3QgWmFwZkRpbmdiYXRzRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiYTEiLCAiYTIiLCAiYTIwMiIsICJhMyIsICJhNCIsICJhNSIsICJhMTE5IiwgImExMTgiLCAiYTExNyIsICJhMTEiLCAiYTEyIiwgImExMyIsICJhMTQiLCAiYTE1IiwgImExNiIsICJhMTA1IiwgImExNyIsICJhMTgiLCAiYTE5IiwgImEyMCIsICJhMjEiLCAiYTIyIiwgImEyMyIsICJhMjQiLCAiYTI1IiwgImEyNiIsICJhMjciLCAiYTI4IiwgImE2IiwgImE3IiwgImE4IiwgImE5IiwgImExMCIsICJhMjkiLCAiYTMwIiwgImEzMSIsICJhMzIiLCAiYTMzIiwgImEzNCIsICJhMzUiLCAiYTM2IiwgImEzNyIsICJhMzgiLCAiYTM5IiwgImE0MCIsICJhNDEiLCAiYTQyIiwgImE0MyIsICJhNDQiLCAiYTQ1IiwgImE0NiIsICJhNDciLCAiYTQ4IiwgImE0OSIsICJhNTAiLCAiYTUxIiwgImE1MiIsICJhNTMiLCAiYTU0IiwgImE1NSIsICJhNTYiLCAiYTU3IiwgImE1OCIsICJhNTkiLCAiYTYwIiwgImE2MSIsICJhNjIiLCAiYTYzIiwgImE2NCIsICJhNjUiLCAiYTY2IiwgImE2NyIsICJhNjgiLCAiYTY5IiwgImE3MCIsICJhNzEiLCAiYTcyIiwgImE3MyIsICJhNzQiLCAiYTIwMyIsICJhNzUiLCAiYTIwNCIsICJhNzYiLCAiYTc3IiwgImE3OCIsICJhNzkiLCAiYTgxIiwgImE4MiIsICJhODMiLCAiYTg0IiwgImE5NyIsICJhOTgiLCAiYTk5IiwgImExMDAiLCAiIiwgImE4OSIsICJhOTAiLCAiYTkzIiwgImE5NCIsICJhOTEiLCAiYTkyIiwgImEyMDUiLCAiYTg1IiwgImEyMDYiLCAiYTg2IiwgImE4NyIsICJhODgiLCAiYTk1IiwgImE5NiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiYTEwMSIsICJhMTAyIiwgImExMDMiLCAiYTEwNCIsICJhMTA2IiwgImExMDciLCAiYTEwOCIsICJhMTEyIiwgImExMTEiLCAiYTExMCIsICJhMTA5IiwgImExMjAiLCAiYTEyMSIsICJhMTIyIiwgImExMjMiLCAiYTEyNCIsICJhMTI1IiwgImExMjYiLCAiYTEyNyIsICJhMTI4IiwgImExMjkiLCAiYTEzMCIsICJhMTMxIiwgImExMzIiLCAiYTEzMyIsICJhMTM0IiwgImExMzUiLCAiYTEzNiIsICJhMTM3IiwgImExMzgiLCAiYTEzOSIsICJhMTQwIiwgImExNDEiLCAiYTE0MiIsICJhMTQzIiwgImExNDQiLCAiYTE0NSIsICJhMTQ2IiwgImExNDciLCAiYTE0OCIsICJhMTQ5IiwgImExNTAiLCAiYTE1MSIsICJhMTUyIiwgImExNTMiLCAiYTE1NCIsICJhMTU1IiwgImExNTYiLCAiYTE1NyIsICJhMTU4IiwgImExNTkiLCAiYTE2MCIsICJhMTYxIiwgImExNjMiLCAiYTE2NCIsICJhMTk2IiwgImExNjUiLCAiYTE5MiIsICJhMTY2IiwgImExNjciLCAiYTE2OCIsICJhMTY5IiwgImExNzAiLCAiYTE3MSIsICJhMTcyIiwgImExNzMiLCAiYTE2MiIsICJhMTc0IiwgImExNzUiLCAiYTE3NiIsICJhMTc3IiwgImExNzgiLCAiYTE3OSIsICJhMTkzIiwgImExODAiLCAiYTE5OSIsICJhMTgxIiwgImEyMDAiLCAiYTE4MiIsICIiLCAiYTIwMSIsICJhMTgzIiwgImExODQiLCAiYTE5NyIsICJhMTg1IiwgImExOTQiLCAiYTE5OCIsICJhMTg2IiwgImExOTUiLCAiYTE4NyIsICJhMTg4IiwgImExODkiLCAiYTE5MCIsICJhMTkxIiwgIiJdOworZXhwb3J0cy5aYXBmRGluZ2JhdHNFbmNvZGluZyA9IFphcGZEaW5nYmF0c0VuY29kaW5nOworCitmdW5jdGlvbiBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpIHsKKyAgc3dpdGNoIChlbmNvZGluZ05hbWUpIHsKKyAgICBjYXNlICJXaW5BbnNpRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFdpbkFuc2lFbmNvZGluZzsKKworICAgIGNhc2UgIlN0YW5kYXJkRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFN0YW5kYXJkRW5jb2Rpbmc7CisKKyAgICBjYXNlICJNYWNSb21hbkVuY29kaW5nIjoKKyAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nOworCisgICAgY2FzZSAiU3ltYm9sU2V0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIFN5bWJvbFNldEVuY29kaW5nOworCisgICAgY2FzZSAiWmFwZkRpbmdiYXRzRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFphcGZEaW5nYmF0c0VuY29kaW5nOworCisgICAgY2FzZSAiRXhwZXJ0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIEV4cGVydEVuY29kaW5nOworCisgICAgY2FzZSAiTWFjRXhwZXJ0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxsOworICB9Cit9CisKKy8qKiovIH0pLAorLyogMzQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdldExvb2t1cFRhYmxlRmFjdG9yeSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCkuZ2V0TG9va3VwVGFibGVGYWN0b3J5OwordmFyIGdldEdseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKKyB0LkEgPSAweDAwNDE7CisgdC5BRSA9IDB4MDBjNjsKKyB0LkFFYWN1dGUgPSAweDAxZmM7CisgdC5BRW1hY3JvbiA9IDB4MDFlMjsKKyB0LkFFc21hbGwgPSAweGY3ZTY7CisgdC5BYWN1dGUgPSAweDAwYzE7CisgdC5BYWN1dGVzbWFsbCA9IDB4ZjdlMTsKKyB0LkFicmV2ZSA9IDB4MDEwMjsKKyB0LkFicmV2ZWFjdXRlID0gMHgxZWFlOworIHQuQWJyZXZlY3lyaWxsaWMgPSAweDA0ZDA7CisgdC5BYnJldmVkb3RiZWxvdyA9IDB4MWViNjsKKyB0LkFicmV2ZWdyYXZlID0gMHgxZWIwOworIHQuQWJyZXZlaG9va2Fib3ZlID0gMHgxZWIyOworIHQuQWJyZXZldGlsZGUgPSAweDFlYjQ7CisgdC5BY2Fyb24gPSAweDAxY2Q7CisgdC5BY2lyY2xlID0gMHgyNGI2OworIHQuQWNpcmN1bWZsZXggPSAweDAwYzI7CisgdC5BY2lyY3VtZmxleGFjdXRlID0gMHgxZWE0OworIHQuQWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVhYzsKKyB0LkFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTY7CisgdC5BY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVhODsKKyB0LkFjaXJjdW1mbGV4c21hbGwgPSAweGY3ZTI7CisgdC5BY2lyY3VtZmxleHRpbGRlID0gMHgxZWFhOworIHQuQWN1dGUgPSAweGY2Yzk7CisgdC5BY3V0ZXNtYWxsID0gMHhmN2I0OworIHQuQWN5cmlsbGljID0gMHgwNDEwOworIHQuQWRibGdyYXZlID0gMHgwMjAwOworIHQuQWRpZXJlc2lzID0gMHgwMGM0OworIHQuQWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDI7CisgdC5BZGllcmVzaXNtYWNyb24gPSAweDAxZGU7CisgdC5BZGllcmVzaXNzbWFsbCA9IDB4ZjdlNDsKKyB0LkFkb3RiZWxvdyA9IDB4MWVhMDsKKyB0LkFkb3RtYWNyb24gPSAweDAxZTA7CisgdC5BZ3JhdmUgPSAweDAwYzA7CisgdC5BZ3JhdmVzbWFsbCA9IDB4ZjdlMDsKKyB0LkFob29rYWJvdmUgPSAweDFlYTI7CisgdC5BaWVjeXJpbGxpYyA9IDB4MDRkNDsKKyB0LkFpbnZlcnRlZGJyZXZlID0gMHgwMjAyOworIHQuQWxwaGEgPSAweDAzOTE7CisgdC5BbHBoYXRvbm9zID0gMHgwMzg2OworIHQuQW1hY3JvbiA9IDB4MDEwMDsKKyB0LkFtb25vc3BhY2UgPSAweGZmMjE7CisgdC5Bb2dvbmVrID0gMHgwMTA0OworIHQuQXJpbmcgPSAweDAwYzU7CisgdC5BcmluZ2FjdXRlID0gMHgwMWZhOworIHQuQXJpbmdiZWxvdyA9IDB4MWUwMDsKKyB0LkFyaW5nc21hbGwgPSAweGY3ZTU7CisgdC5Bc21hbGwgPSAweGY3NjE7CisgdC5BdGlsZGUgPSAweDAwYzM7CisgdC5BdGlsZGVzbWFsbCA9IDB4ZjdlMzsKKyB0LkF5YmFybWVuaWFuID0gMHgwNTMxOworIHQuQiA9IDB4MDA0MjsKKyB0LkJjaXJjbGUgPSAweDI0Yjc7CisgdC5CZG90YWNjZW50ID0gMHgxZTAyOworIHQuQmRvdGJlbG93ID0gMHgxZTA0OworIHQuQmVjeXJpbGxpYyA9IDB4MDQxMTsKKyB0LkJlbmFybWVuaWFuID0gMHgwNTMyOworIHQuQmV0YSA9IDB4MDM5MjsKKyB0LkJob29rID0gMHgwMTgxOworIHQuQmxpbmViZWxvdyA9IDB4MWUwNjsKKyB0LkJtb25vc3BhY2UgPSAweGZmMjI7CisgdC5CcmV2ZXNtYWxsID0gMHhmNmY0OworIHQuQnNtYWxsID0gMHhmNzYyOworIHQuQnRvcGJhciA9IDB4MDE4MjsKKyB0LkMgPSAweDAwNDM7CisgdC5DYWFybWVuaWFuID0gMHgwNTNlOworIHQuQ2FjdXRlID0gMHgwMTA2OworIHQuQ2Fyb24gPSAweGY2Y2E7CisgdC5DYXJvbnNtYWxsID0gMHhmNmY1OworIHQuQ2Nhcm9uID0gMHgwMTBjOworIHQuQ2NlZGlsbGEgPSAweDAwYzc7CisgdC5DY2VkaWxsYWFjdXRlID0gMHgxZTA4OworIHQuQ2NlZGlsbGFzbWFsbCA9IDB4ZjdlNzsKKyB0LkNjaXJjbGUgPSAweDI0Yjg7CisgdC5DY2lyY3VtZmxleCA9IDB4MDEwODsKKyB0LkNkb3QgPSAweDAxMGE7CisgdC5DZG90YWNjZW50ID0gMHgwMTBhOworIHQuQ2VkaWxsYXNtYWxsID0gMHhmN2I4OworIHQuQ2hhYXJtZW5pYW4gPSAweDA1NDk7CisgdC5DaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiYzsKKyB0LkNoZWN5cmlsbGljID0gMHgwNDI3OworIHQuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmU7CisgdC5DaGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiNjsKKyB0LkNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjQ7CisgdC5DaGVoYXJtZW5pYW4gPSAweDA1NDM7CisgdC5DaGVraGFrYXNzaWFuY3lyaWxsaWMgPSAweDA0Y2I7CisgdC5DaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI4OworIHQuQ2hpID0gMHgwM2E3OworIHQuQ2hvb2sgPSAweDAxODc7CisgdC5DaXJjdW1mbGV4c21hbGwgPSAweGY2ZjY7CisgdC5DbW9ub3NwYWNlID0gMHhmZjIzOworIHQuQ29hcm1lbmlhbiA9IDB4MDU1MTsKKyB0LkNzbWFsbCA9IDB4Zjc2MzsKKyB0LkQgPSAweDAwNDQ7CisgdC5EWiA9IDB4MDFmMTsKKyB0LkRaY2Fyb24gPSAweDAxYzQ7CisgdC5EYWFybWVuaWFuID0gMHgwNTM0OworIHQuRGFmcmljYW4gPSAweDAxODk7CisgdC5EY2Fyb24gPSAweDAxMGU7CisgdC5EY2VkaWxsYSA9IDB4MWUxMDsKKyB0LkRjaXJjbGUgPSAweDI0Yjk7CisgdC5EY2lyY3VtZmxleGJlbG93ID0gMHgxZTEyOworIHQuRGNyb2F0ID0gMHgwMTEwOworIHQuRGRvdGFjY2VudCA9IDB4MWUwYTsKKyB0LkRkb3RiZWxvdyA9IDB4MWUwYzsKKyB0LkRlY3lyaWxsaWMgPSAweDA0MTQ7CisgdC5EZWljb3B0aWMgPSAweDAzZWU7CisgdC5EZWx0YSA9IDB4MjIwNjsKKyB0LkRlbHRhZ3JlZWsgPSAweDAzOTQ7CisgdC5EaG9vayA9IDB4MDE4YTsKKyB0LkRpZXJlc2lzID0gMHhmNmNiOworIHQuRGllcmVzaXNBY3V0ZSA9IDB4ZjZjYzsKKyB0LkRpZXJlc2lzR3JhdmUgPSAweGY2Y2Q7CisgdC5EaWVyZXNpc3NtYWxsID0gMHhmN2E4OworIHQuRGlnYW1tYWdyZWVrID0gMHgwM2RjOworIHQuRGplY3lyaWxsaWMgPSAweDA0MDI7CisgdC5EbGluZWJlbG93ID0gMHgxZTBlOworIHQuRG1vbm9zcGFjZSA9IDB4ZmYyNDsKKyB0LkRvdGFjY2VudHNtYWxsID0gMHhmNmY3OworIHQuRHNsYXNoID0gMHgwMTEwOworIHQuRHNtYWxsID0gMHhmNzY0OworIHQuRHRvcGJhciA9IDB4MDE4YjsKKyB0LkR6ID0gMHgwMWYyOworIHQuRHpjYXJvbiA9IDB4MDFjNTsKKyB0LkR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUwOworIHQuRHplY3lyaWxsaWMgPSAweDA0MDU7CisgdC5EemhlY3lyaWxsaWMgPSAweDA0MGY7CisgdC5FID0gMHgwMDQ1OworIHQuRWFjdXRlID0gMHgwMGM5OworIHQuRWFjdXRlc21hbGwgPSAweGY3ZTk7CisgdC5FYnJldmUgPSAweDAxMTQ7CisgdC5FY2Fyb24gPSAweDAxMWE7CisgdC5FY2VkaWxsYWJyZXZlID0gMHgxZTFjOworIHQuRWNoYXJtZW5pYW4gPSAweDA1MzU7CisgdC5FY2lyY2xlID0gMHgyNGJhOworIHQuRWNpcmN1bWZsZXggPSAweDAwY2E7CisgdC5FY2lyY3VtZmxleGFjdXRlID0gMHgxZWJlOworIHQuRWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxODsKKyB0LkVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzY7CisgdC5FY2lyY3VtZmxleGdyYXZlID0gMHgxZWMwOworIHQuRWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzI7CisgdC5FY2lyY3VtZmxleHNtYWxsID0gMHhmN2VhOworIHQuRWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNDsKKyB0LkVjeXJpbGxpYyA9IDB4MDQwNDsKKyB0LkVkYmxncmF2ZSA9IDB4MDIwNDsKKyB0LkVkaWVyZXNpcyA9IDB4MDBjYjsKKyB0LkVkaWVyZXNpc3NtYWxsID0gMHhmN2ViOworIHQuRWRvdCA9IDB4MDExNjsKKyB0LkVkb3RhY2NlbnQgPSAweDAxMTY7CisgdC5FZG90YmVsb3cgPSAweDFlYjg7CisgdC5FZmN5cmlsbGljID0gMHgwNDI0OworIHQuRWdyYXZlID0gMHgwMGM4OworIHQuRWdyYXZlc21hbGwgPSAweGY3ZTg7CisgdC5FaGFybWVuaWFuID0gMHgwNTM3OworIHQuRWhvb2thYm92ZSA9IDB4MWViYTsKKyB0LkVpZ2h0cm9tYW4gPSAweDIxNjc7CisgdC5FaW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNjsKKyB0LkVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY0OworIHQuRWxjeXJpbGxpYyA9IDB4MDQxYjsKKyB0LkVsZXZlbnJvbWFuID0gMHgyMTZhOworIHQuRW1hY3JvbiA9IDB4MDExMjsKKyB0LkVtYWNyb25hY3V0ZSA9IDB4MWUxNjsKKyB0LkVtYWNyb25ncmF2ZSA9IDB4MWUxNDsKKyB0LkVtY3lyaWxsaWMgPSAweDA0MWM7CisgdC5FbW9ub3NwYWNlID0gMHhmZjI1OworIHQuRW5jeXJpbGxpYyA9IDB4MDQxZDsKKyB0LkVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTI7CisgdC5FbmcgPSAweDAxNGE7CisgdC5FbmdoZWN5cmlsbGljID0gMHgwNGE0OworIHQuRW5ob29rY3lyaWxsaWMgPSAweDA0Yzc7CisgdC5Fb2dvbmVrID0gMHgwMTE4OworIHQuRW9wZW4gPSAweDAxOTA7CisgdC5FcHNpbG9uID0gMHgwMzk1OworIHQuRXBzaWxvbnRvbm9zID0gMHgwMzg4OworIHQuRXJjeXJpbGxpYyA9IDB4MDQyMDsKKyB0LkVyZXZlcnNlZCA9IDB4MDE4ZTsKKyB0LkVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDJkOworIHQuRXNjeXJpbGxpYyA9IDB4MDQyMTsKKyB0LkVzZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWE7CisgdC5Fc2ggPSAweDAxYTk7CisgdC5Fc21hbGwgPSAweGY3NjU7CisgdC5FdGEgPSAweDAzOTc7CisgdC5FdGFybWVuaWFuID0gMHgwNTM4OworIHQuRXRhdG9ub3MgPSAweDAzODk7CisgdC5FdGggPSAweDAwZDA7CisgdC5FdGhzbWFsbCA9IDB4ZjdmMDsKKyB0LkV0aWxkZSA9IDB4MWViYzsKKyB0LkV0aWxkZWJlbG93ID0gMHgxZTFhOworIHQuRXVybyA9IDB4MjBhYzsKKyB0LkV6aCA9IDB4MDFiNzsKKyB0LkV6aGNhcm9uID0gMHgwMWVlOworIHQuRXpocmV2ZXJzZWQgPSAweDAxYjg7CisgdC5GID0gMHgwMDQ2OworIHQuRmNpcmNsZSA9IDB4MjRiYjsKKyB0LkZkb3RhY2NlbnQgPSAweDFlMWU7CisgdC5GZWhhcm1lbmlhbiA9IDB4MDU1NjsKKyB0LkZlaWNvcHRpYyA9IDB4MDNlNDsKKyB0LkZob29rID0gMHgwMTkxOworIHQuRml0YWN5cmlsbGljID0gMHgwNDcyOworIHQuRml2ZXJvbWFuID0gMHgyMTY0OworIHQuRm1vbm9zcGFjZSA9IDB4ZmYyNjsKKyB0LkZvdXJyb21hbiA9IDB4MjE2MzsKKyB0LkZzbWFsbCA9IDB4Zjc2NjsKKyB0LkcgPSAweDAwNDc7CisgdC5HQnNxdWFyZSA9IDB4MzM4NzsKKyB0LkdhY3V0ZSA9IDB4MDFmNDsKKyB0LkdhbW1hID0gMHgwMzkzOworIHQuR2FtbWFhZnJpY2FuID0gMHgwMTk0OworIHQuR2FuZ2lhY29wdGljID0gMHgwM2VhOworIHQuR2JyZXZlID0gMHgwMTFlOworIHQuR2Nhcm9uID0gMHgwMWU2OworIHQuR2NlZGlsbGEgPSAweDAxMjI7CisgdC5HY2lyY2xlID0gMHgyNGJjOworIHQuR2NpcmN1bWZsZXggPSAweDAxMWM7CisgdC5HY29tbWFhY2NlbnQgPSAweDAxMjI7CisgdC5HZG90ID0gMHgwMTIwOworIHQuR2RvdGFjY2VudCA9IDB4MDEyMDsKKyB0LkdlY3lyaWxsaWMgPSAweDA0MTM7CisgdC5HaGFkYXJtZW5pYW4gPSAweDA1NDI7CisgdC5HaGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTQ7CisgdC5HaGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MjsKKyB0LkdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkwOworIHQuR2hvb2sgPSAweDAxOTM7CisgdC5HaW1hcm1lbmlhbiA9IDB4MDUzMzsKKyB0LkdqZWN5cmlsbGljID0gMHgwNDAzOworIHQuR21hY3JvbiA9IDB4MWUyMDsKKyB0Lkdtb25vc3BhY2UgPSAweGZmMjc7CisgdC5HcmF2ZSA9IDB4ZjZjZTsKKyB0LkdyYXZlc21hbGwgPSAweGY3NjA7CisgdC5Hc21hbGwgPSAweGY3Njc7CisgdC5Hc21hbGxob29rID0gMHgwMjliOworIHQuR3N0cm9rZSA9IDB4MDFlNDsKKyB0LkggPSAweDAwNDg7CisgdC5IMTg1MzMgPSAweDI1Y2Y7CisgdC5IMTg1NDMgPSAweDI1YWE7CisgdC5IMTg1NTEgPSAweDI1YWI7CisgdC5IMjIwNzMgPSAweDI1YTE7CisgdC5IUHNxdWFyZSA9IDB4MzNjYjsKKyB0LkhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTg7CisgdC5IYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGIyOworIHQuSGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQyYTsKKyB0LkhiYXIgPSAweDAxMjY7CisgdC5IYnJldmViZWxvdyA9IDB4MWUyYTsKKyB0LkhjZWRpbGxhID0gMHgxZTI4OworIHQuSGNpcmNsZSA9IDB4MjRiZDsKKyB0LkhjaXJjdW1mbGV4ID0gMHgwMTI0OworIHQuSGRpZXJlc2lzID0gMHgxZTI2OworIHQuSGRvdGFjY2VudCA9IDB4MWUyMjsKKyB0Lkhkb3RiZWxvdyA9IDB4MWUyNDsKKyB0Lkhtb25vc3BhY2UgPSAweGZmMjg7CisgdC5Ib2FybWVuaWFuID0gMHgwNTQwOworIHQuSG9yaWNvcHRpYyA9IDB4MDNlODsKKyB0LkhzbWFsbCA9IDB4Zjc2ODsKKyB0Lkh1bmdhcnVtbGF1dCA9IDB4ZjZjZjsKKyB0Lkh1bmdhcnVtbGF1dHNtYWxsID0gMHhmNmY4OworIHQuSHpzcXVhcmUgPSAweDMzOTA7CisgdC5JID0gMHgwMDQ5OworIHQuSUFjeXJpbGxpYyA9IDB4MDQyZjsKKyB0LklKID0gMHgwMTMyOworIHQuSVVjeXJpbGxpYyA9IDB4MDQyZTsKKyB0LklhY3V0ZSA9IDB4MDBjZDsKKyB0LklhY3V0ZXNtYWxsID0gMHhmN2VkOworIHQuSWJyZXZlID0gMHgwMTJjOworIHQuSWNhcm9uID0gMHgwMWNmOworIHQuSWNpcmNsZSA9IDB4MjRiZTsKKyB0LkljaXJjdW1mbGV4ID0gMHgwMGNlOworIHQuSWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlZTsKKyB0LkljeXJpbGxpYyA9IDB4MDQwNjsKKyB0LklkYmxncmF2ZSA9IDB4MDIwODsKKyB0LklkaWVyZXNpcyA9IDB4MDBjZjsKKyB0LklkaWVyZXNpc2FjdXRlID0gMHgxZTJlOworIHQuSWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTQ7CisgdC5JZGllcmVzaXNzbWFsbCA9IDB4ZjdlZjsKKyB0Lklkb3QgPSAweDAxMzA7CisgdC5JZG90YWNjZW50ID0gMHgwMTMwOworIHQuSWRvdGJlbG93ID0gMHgxZWNhOworIHQuSWVicmV2ZWN5cmlsbGljID0gMHgwNGQ2OworIHQuSWVjeXJpbGxpYyA9IDB4MDQxNTsKKyB0LklmcmFrdHVyID0gMHgyMTExOworIHQuSWdyYXZlID0gMHgwMGNjOworIHQuSWdyYXZlc21hbGwgPSAweGY3ZWM7CisgdC5JaG9va2Fib3ZlID0gMHgxZWM4OworIHQuSWljeXJpbGxpYyA9IDB4MDQxODsKKyB0LklpbnZlcnRlZGJyZXZlID0gMHgwMjBhOworIHQuSWlzaG9ydGN5cmlsbGljID0gMHgwNDE5OworIHQuSW1hY3JvbiA9IDB4MDEyYTsKKyB0LkltYWNyb25jeXJpbGxpYyA9IDB4MDRlMjsKKyB0Lkltb25vc3BhY2UgPSAweGZmMjk7CisgdC5Jbmlhcm1lbmlhbiA9IDB4MDUzYjsKKyB0LklvY3lyaWxsaWMgPSAweDA0MDE7CisgdC5Jb2dvbmVrID0gMHgwMTJlOworIHQuSW90YSA9IDB4MDM5OTsKKyB0LklvdGFhZnJpY2FuID0gMHgwMTk2OworIHQuSW90YWRpZXJlc2lzID0gMHgwM2FhOworIHQuSW90YXRvbm9zID0gMHgwMzhhOworIHQuSXNtYWxsID0gMHhmNzY5OworIHQuSXN0cm9rZSA9IDB4MDE5NzsKKyB0Lkl0aWxkZSA9IDB4MDEyODsKKyB0Lkl0aWxkZWJlbG93ID0gMHgxZTJjOworIHQuSXpoaXRzYWN5cmlsbGljID0gMHgwNDc0OworIHQuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0NzY7CisgdC5KID0gMHgwMDRhOworIHQuSmFhcm1lbmlhbiA9IDB4MDU0MTsKKyB0LkpjaXJjbGUgPSAweDI0YmY7CisgdC5KY2lyY3VtZmxleCA9IDB4MDEzNDsKKyB0LkplY3lyaWxsaWMgPSAweDA0MDg7CisgdC5KaGVoYXJtZW5pYW4gPSAweDA1NGI7CisgdC5KbW9ub3NwYWNlID0gMHhmZjJhOworIHQuSnNtYWxsID0gMHhmNzZhOworIHQuSyA9IDB4MDA0YjsKKyB0LktCc3F1YXJlID0gMHgzMzg1OworIHQuS0tzcXVhcmUgPSAweDMzY2Q7CisgdC5LYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMDsKKyB0LkthY3V0ZSA9IDB4MWUzMDsKKyB0LkthY3lyaWxsaWMgPSAweDA0MWE7CisgdC5LYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDlhOworIHQuS2Fob29rY3lyaWxsaWMgPSAweDA0YzM7CisgdC5LYXBwYSA9IDB4MDM5YTsKKyB0Lkthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWU7CisgdC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWM7CisgdC5LY2Fyb24gPSAweDAxZTg7CisgdC5LY2VkaWxsYSA9IDB4MDEzNjsKKyB0LktjaXJjbGUgPSAweDI0YzA7CisgdC5LY29tbWFhY2NlbnQgPSAweDAxMzY7CisgdC5LZG90YmVsb3cgPSAweDFlMzI7CisgdC5LZWhhcm1lbmlhbiA9IDB4MDU1NDsKKyB0LktlbmFybWVuaWFuID0gMHgwNTNmOworIHQuS2hhY3lyaWxsaWMgPSAweDA0MjU7CisgdC5LaGVpY29wdGljID0gMHgwM2U2OworIHQuS2hvb2sgPSAweDAxOTg7CisgdC5LamVjeXJpbGxpYyA9IDB4MDQwYzsKKyB0LktsaW5lYmVsb3cgPSAweDFlMzQ7CisgdC5LbW9ub3NwYWNlID0gMHhmZjJiOworIHQuS29wcGFjeXJpbGxpYyA9IDB4MDQ4MDsKKyB0LktvcHBhZ3JlZWsgPSAweDAzZGU7CisgdC5Lc2ljeXJpbGxpYyA9IDB4MDQ2ZTsKKyB0LktzbWFsbCA9IDB4Zjc2YjsKKyB0LkwgPSAweDAwNGM7CisgdC5MSiA9IDB4MDFjNzsKKyB0LkxMID0gMHhmNmJmOworIHQuTGFjdXRlID0gMHgwMTM5OworIHQuTGFtYmRhID0gMHgwMzliOworIHQuTGNhcm9uID0gMHgwMTNkOworIHQuTGNlZGlsbGEgPSAweDAxM2I7CisgdC5MY2lyY2xlID0gMHgyNGMxOworIHQuTGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzYzsKKyB0Lkxjb21tYWFjY2VudCA9IDB4MDEzYjsKKyB0Lkxkb3QgPSAweDAxM2Y7CisgdC5MZG90YWNjZW50ID0gMHgwMTNmOworIHQuTGRvdGJlbG93ID0gMHgxZTM2OworIHQuTGRvdGJlbG93bWFjcm9uID0gMHgxZTM4OworIHQuTGl3bmFybWVuaWFuID0gMHgwNTNjOworIHQuTGogPSAweDAxYzg7CisgdC5MamVjeXJpbGxpYyA9IDB4MDQwOTsKKyB0LkxsaW5lYmVsb3cgPSAweDFlM2E7CisgdC5MbW9ub3NwYWNlID0gMHhmZjJjOworIHQuTHNsYXNoID0gMHgwMTQxOworIHQuTHNsYXNoc21hbGwgPSAweGY2Zjk7CisgdC5Mc21hbGwgPSAweGY3NmM7CisgdC5NID0gMHgwMDRkOworIHQuTUJzcXVhcmUgPSAweDMzODY7CisgdC5NYWNyb24gPSAweGY2ZDA7CisgdC5NYWNyb25zbWFsbCA9IDB4ZjdhZjsKKyB0Lk1hY3V0ZSA9IDB4MWUzZTsKKyB0Lk1jaXJjbGUgPSAweDI0YzI7CisgdC5NZG90YWNjZW50ID0gMHgxZTQwOworIHQuTWRvdGJlbG93ID0gMHgxZTQyOworIHQuTWVuYXJtZW5pYW4gPSAweDA1NDQ7CisgdC5NbW9ub3NwYWNlID0gMHhmZjJkOworIHQuTXNtYWxsID0gMHhmNzZkOworIHQuTXR1cm5lZCA9IDB4MDE5YzsKKyB0Lk11ID0gMHgwMzljOworIHQuTiA9IDB4MDA0ZTsKKyB0Lk5KID0gMHgwMWNhOworIHQuTmFjdXRlID0gMHgwMTQzOworIHQuTmNhcm9uID0gMHgwMTQ3OworIHQuTmNlZGlsbGEgPSAweDAxNDU7CisgdC5OY2lyY2xlID0gMHgyNGMzOworIHQuTmNpcmN1bWZsZXhiZWxvdyA9IDB4MWU0YTsKKyB0Lk5jb21tYWFjY2VudCA9IDB4MDE0NTsKKyB0Lk5kb3RhY2NlbnQgPSAweDFlNDQ7CisgdC5OZG90YmVsb3cgPSAweDFlNDY7CisgdC5OaG9va2xlZnQgPSAweDAxOWQ7CisgdC5OaW5lcm9tYW4gPSAweDIxNjg7CisgdC5OaiA9IDB4MDFjYjsKKyB0Lk5qZWN5cmlsbGljID0gMHgwNDBhOworIHQuTmxpbmViZWxvdyA9IDB4MWU0ODsKKyB0Lk5tb25vc3BhY2UgPSAweGZmMmU7CisgdC5Ob3dhcm1lbmlhbiA9IDB4MDU0NjsKKyB0Lk5zbWFsbCA9IDB4Zjc2ZTsKKyB0Lk50aWxkZSA9IDB4MDBkMTsKKyB0Lk50aWxkZXNtYWxsID0gMHhmN2YxOworIHQuTnUgPSAweDAzOWQ7CisgdC5PID0gMHgwMDRmOworIHQuT0UgPSAweDAxNTI7CisgdC5PRXNtYWxsID0gMHhmNmZhOworIHQuT2FjdXRlID0gMHgwMGQzOworIHQuT2FjdXRlc21hbGwgPSAweGY3ZjM7CisgdC5PYmFycmVkY3lyaWxsaWMgPSAweDA0ZTg7CisgdC5PYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYTsKKyB0Lk9icmV2ZSA9IDB4MDE0ZTsKKyB0Lk9jYXJvbiA9IDB4MDFkMTsKKyB0Lk9jZW50ZXJlZHRpbGRlID0gMHgwMTlmOworIHQuT2NpcmNsZSA9IDB4MjRjNDsKKyB0Lk9jaXJjdW1mbGV4ID0gMHgwMGQ0OworIHQuT2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMDsKKyB0Lk9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDg7CisgdC5PY2lyY3VtZmxleGdyYXZlID0gMHgxZWQyOworIHQuT2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDQ7CisgdC5PY2lyY3VtZmxleHNtYWxsID0gMHhmN2Y0OworIHQuT2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNjsKKyB0Lk9jeXJpbGxpYyA9IDB4MDQxZTsKKyB0Lk9kYmxhY3V0ZSA9IDB4MDE1MDsKKyB0Lk9kYmxncmF2ZSA9IDB4MDIwYzsKKyB0Lk9kaWVyZXNpcyA9IDB4MDBkNjsKKyB0Lk9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU2OworIHQuT2RpZXJlc2lzc21hbGwgPSAweGY3ZjY7CisgdC5PZG90YmVsb3cgPSAweDFlY2M7CisgdC5PZ29uZWtzbWFsbCA9IDB4ZjZmYjsKKyB0Lk9ncmF2ZSA9IDB4MDBkMjsKKyB0Lk9ncmF2ZXNtYWxsID0gMHhmN2YyOworIHQuT2hhcm1lbmlhbiA9IDB4MDU1NTsKKyB0Lk9obSA9IDB4MjEyNjsKKyB0Lk9ob29rYWJvdmUgPSAweDFlY2U7CisgdC5PaG9ybiA9IDB4MDFhMDsKKyB0Lk9ob3JuYWN1dGUgPSAweDFlZGE7CisgdC5PaG9ybmRvdGJlbG93ID0gMHgxZWUyOworIHQuT2hvcm5ncmF2ZSA9IDB4MWVkYzsKKyB0Lk9ob3JuaG9va2Fib3ZlID0gMHgxZWRlOworIHQuT2hvcm50aWxkZSA9IDB4MWVlMDsKKyB0Lk9odW5nYXJ1bWxhdXQgPSAweDAxNTA7CisgdC5PaSA9IDB4MDFhMjsKKyB0Lk9pbnZlcnRlZGJyZXZlID0gMHgwMjBlOworIHQuT21hY3JvbiA9IDB4MDE0YzsKKyB0Lk9tYWNyb25hY3V0ZSA9IDB4MWU1MjsKKyB0Lk9tYWNyb25ncmF2ZSA9IDB4MWU1MDsKKyB0Lk9tZWdhID0gMHgyMTI2OworIHQuT21lZ2FjeXJpbGxpYyA9IDB4MDQ2MDsKKyB0Lk9tZWdhZ3JlZWsgPSAweDAzYTk7CisgdC5PbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2E7CisgdC5PbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2M7CisgdC5PbWVnYXRvbm9zID0gMHgwMzhmOworIHQuT21pY3JvbiA9IDB4MDM5ZjsKKyB0Lk9taWNyb250b25vcyA9IDB4MDM4YzsKKyB0Lk9tb25vc3BhY2UgPSAweGZmMmY7CisgdC5PbmVyb21hbiA9IDB4MjE2MDsKKyB0Lk9vZ29uZWsgPSAweDAxZWE7CisgdC5Pb2dvbmVrbWFjcm9uID0gMHgwMWVjOworIHQuT29wZW4gPSAweDAxODY7CisgdC5Pc2xhc2ggPSAweDAwZDg7CisgdC5Pc2xhc2hhY3V0ZSA9IDB4MDFmZTsKKyB0Lk9zbGFzaHNtYWxsID0gMHhmN2Y4OworIHQuT3NtYWxsID0gMHhmNzZmOworIHQuT3N0cm9rZWFjdXRlID0gMHgwMWZlOworIHQuT3RjeXJpbGxpYyA9IDB4MDQ3ZTsKKyB0Lk90aWxkZSA9IDB4MDBkNTsKKyB0Lk90aWxkZWFjdXRlID0gMHgxZTRjOworIHQuT3RpbGRlZGllcmVzaXMgPSAweDFlNGU7CisgdC5PdGlsZGVzbWFsbCA9IDB4ZjdmNTsKKyB0LlAgPSAweDAwNTA7CisgdC5QYWN1dGUgPSAweDFlNTQ7CisgdC5QY2lyY2xlID0gMHgyNGM1OworIHQuUGRvdGFjY2VudCA9IDB4MWU1NjsKKyB0LlBlY3lyaWxsaWMgPSAweDA0MWY7CisgdC5QZWhhcm1lbmlhbiA9IDB4MDU0YTsKKyB0LlBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE2OworIHQuUGhpID0gMHgwM2E2OworIHQuUGhvb2sgPSAweDAxYTQ7CisgdC5QaSA9IDB4MDNhMDsKKyB0LlBpd3Jhcm1lbmlhbiA9IDB4MDU1MzsKKyB0LlBtb25vc3BhY2UgPSAweGZmMzA7CisgdC5Qc2kgPSAweDAzYTg7CisgdC5Qc2ljeXJpbGxpYyA9IDB4MDQ3MDsKKyB0LlBzbWFsbCA9IDB4Zjc3MDsKKyB0LlEgPSAweDAwNTE7CisgdC5RY2lyY2xlID0gMHgyNGM2OworIHQuUW1vbm9zcGFjZSA9IDB4ZmYzMTsKKyB0LlFzbWFsbCA9IDB4Zjc3MTsKKyB0LlIgPSAweDAwNTI7CisgdC5SYWFybWVuaWFuID0gMHgwNTRjOworIHQuUmFjdXRlID0gMHgwMTU0OworIHQuUmNhcm9uID0gMHgwMTU4OworIHQuUmNlZGlsbGEgPSAweDAxNTY7CisgdC5SY2lyY2xlID0gMHgyNGM3OworIHQuUmNvbW1hYWNjZW50ID0gMHgwMTU2OworIHQuUmRibGdyYXZlID0gMHgwMjEwOworIHQuUmRvdGFjY2VudCA9IDB4MWU1ODsKKyB0LlJkb3RiZWxvdyA9IDB4MWU1YTsKKyB0LlJkb3RiZWxvd21hY3JvbiA9IDB4MWU1YzsKKyB0LlJlaGFybWVuaWFuID0gMHgwNTUwOworIHQuUmZyYWt0dXIgPSAweDIxMWM7CisgdC5SaG8gPSAweDAzYTE7CisgdC5SaW5nc21hbGwgPSAweGY2ZmM7CisgdC5SaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMjsKKyB0LlJsaW5lYmVsb3cgPSAweDFlNWU7CisgdC5SbW9ub3NwYWNlID0gMHhmZjMyOworIHQuUnNtYWxsID0gMHhmNzcyOworIHQuUnNtYWxsaW52ZXJ0ZWQgPSAweDAyODE7CisgdC5Sc21hbGxpbnZlcnRlZHN1cGVyaW9yID0gMHgwMmI2OworIHQuUyA9IDB4MDA1MzsKKyB0LlNGMDEwMDAwID0gMHgyNTBjOworIHQuU0YwMjAwMDAgPSAweDI1MTQ7CisgdC5TRjAzMDAwMCA9IDB4MjUxMDsKKyB0LlNGMDQwMDAwID0gMHgyNTE4OworIHQuU0YwNTAwMDAgPSAweDI1M2M7CisgdC5TRjA2MDAwMCA9IDB4MjUyYzsKKyB0LlNGMDcwMDAwID0gMHgyNTM0OworIHQuU0YwODAwMDAgPSAweDI1MWM7CisgdC5TRjA5MDAwMCA9IDB4MjUyNDsKKyB0LlNGMTAwMDAwID0gMHgyNTAwOworIHQuU0YxMTAwMDAgPSAweDI1MDI7CisgdC5TRjE5MDAwMCA9IDB4MjU2MTsKKyB0LlNGMjAwMDAwID0gMHgyNTYyOworIHQuU0YyMTAwMDAgPSAweDI1NTY7CisgdC5TRjIyMDAwMCA9IDB4MjU1NTsKKyB0LlNGMjMwMDAwID0gMHgyNTYzOworIHQuU0YyNDAwMDAgPSAweDI1NTE7CisgdC5TRjI1MDAwMCA9IDB4MjU1NzsKKyB0LlNGMjYwMDAwID0gMHgyNTVkOworIHQuU0YyNzAwMDAgPSAweDI1NWM7CisgdC5TRjI4MDAwMCA9IDB4MjU1YjsKKyB0LlNGMzYwMDAwID0gMHgyNTVlOworIHQuU0YzNzAwMDAgPSAweDI1NWY7CisgdC5TRjM4MDAwMCA9IDB4MjU1YTsKKyB0LlNGMzkwMDAwID0gMHgyNTU0OworIHQuU0Y0MDAwMDAgPSAweDI1Njk7CisgdC5TRjQxMDAwMCA9IDB4MjU2NjsKKyB0LlNGNDIwMDAwID0gMHgyNTYwOworIHQuU0Y0MzAwMDAgPSAweDI1NTA7CisgdC5TRjQ0MDAwMCA9IDB4MjU2YzsKKyB0LlNGNDUwMDAwID0gMHgyNTY3OworIHQuU0Y0NjAwMDAgPSAweDI1Njg7CisgdC5TRjQ3MDAwMCA9IDB4MjU2NDsKKyB0LlNGNDgwMDAwID0gMHgyNTY1OworIHQuU0Y0OTAwMDAgPSAweDI1NTk7CisgdC5TRjUwMDAwMCA9IDB4MjU1ODsKKyB0LlNGNTEwMDAwID0gMHgyNTUyOworIHQuU0Y1MjAwMDAgPSAweDI1NTM7CisgdC5TRjUzMDAwMCA9IDB4MjU2YjsKKyB0LlNGNTQwMDAwID0gMHgyNTZhOworIHQuU2FjdXRlID0gMHgwMTVhOworIHQuU2FjdXRlZG90YWNjZW50ID0gMHgxZTY0OworIHQuU2FtcGlncmVlayA9IDB4MDNlMDsKKyB0LlNjYXJvbiA9IDB4MDE2MDsKKyB0LlNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NjsKKyB0LlNjYXJvbnNtYWxsID0gMHhmNmZkOworIHQuU2NlZGlsbGEgPSAweDAxNWU7CisgdC5TY2h3YSA9IDB4MDE4ZjsKKyB0LlNjaHdhY3lyaWxsaWMgPSAweDA0ZDg7CisgdC5TY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGE7CisgdC5TY2lyY2xlID0gMHgyNGM4OworIHQuU2NpcmN1bWZsZXggPSAweDAxNWM7CisgdC5TY29tbWFhY2NlbnQgPSAweDAyMTg7CisgdC5TZG90YWNjZW50ID0gMHgxZTYwOworIHQuU2RvdGJlbG93ID0gMHgxZTYyOworIHQuU2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY4OworIHQuU2VoYXJtZW5pYW4gPSAweDA1NGQ7CisgdC5TZXZlbnJvbWFuID0gMHgyMTY2OworIHQuU2hhYXJtZW5pYW4gPSAweDA1NDc7CisgdC5TaGFjeXJpbGxpYyA9IDB4MDQyODsKKyB0LlNoY2hhY3lyaWxsaWMgPSAweDA0Mjk7CisgdC5TaGVpY29wdGljID0gMHgwM2UyOworIHQuU2hoYWN5cmlsbGljID0gMHgwNGJhOworIHQuU2hpbWFjb3B0aWMgPSAweDAzZWM7CisgdC5TaWdtYSA9IDB4MDNhMzsKKyB0LlNpeHJvbWFuID0gMHgyMTY1OworIHQuU21vbm9zcGFjZSA9IDB4ZmYzMzsKKyB0LlNvZnRzaWduY3lyaWxsaWMgPSAweDA0MmM7CisgdC5Tc21hbGwgPSAweGY3NzM7CisgdC5TdGlnbWFncmVlayA9IDB4MDNkYTsKKyB0LlQgPSAweDAwNTQ7CisgdC5UYXUgPSAweDAzYTQ7CisgdC5UYmFyID0gMHgwMTY2OworIHQuVGNhcm9uID0gMHgwMTY0OworIHQuVGNlZGlsbGEgPSAweDAxNjI7CisgdC5UY2lyY2xlID0gMHgyNGM5OworIHQuVGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MDsKKyB0LlRjb21tYWFjY2VudCA9IDB4MDE2MjsKKyB0LlRkb3RhY2NlbnQgPSAweDFlNmE7CisgdC5UZG90YmVsb3cgPSAweDFlNmM7CisgdC5UZWN5cmlsbGljID0gMHgwNDIyOworIHQuVGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYzsKKyB0LlRlbnJvbWFuID0gMHgyMTY5OworIHQuVGV0c2VjeXJpbGxpYyA9IDB4MDRiNDsKKyB0LlRoZXRhID0gMHgwMzk4OworIHQuVGhvb2sgPSAweDAxYWM7CisgdC5UaG9ybiA9IDB4MDBkZTsKKyB0LlRob3Juc21hbGwgPSAweGY3ZmU7CisgdC5UaHJlZXJvbWFuID0gMHgyMTYyOworIHQuVGlsZGVzbWFsbCA9IDB4ZjZmZTsKKyB0LlRpd25hcm1lbmlhbiA9IDB4MDU0ZjsKKyB0LlRsaW5lYmVsb3cgPSAweDFlNmU7CisgdC5UbW9ub3NwYWNlID0gMHhmZjM0OworIHQuVG9hcm1lbmlhbiA9IDB4MDUzOTsKKyB0LlRvbmVmaXZlID0gMHgwMWJjOworIHQuVG9uZXNpeCA9IDB4MDE4NDsKKyB0LlRvbmV0d28gPSAweDAxYTc7CisgdC5UcmV0cm9mbGV4aG9vayA9IDB4MDFhZTsKKyB0LlRzZWN5cmlsbGljID0gMHgwNDI2OworIHQuVHNoZWN5cmlsbGljID0gMHgwNDBiOworIHQuVHNtYWxsID0gMHhmNzc0OworIHQuVHdlbHZlcm9tYW4gPSAweDIxNmI7CisgdC5Ud29yb21hbiA9IDB4MjE2MTsKKyB0LlUgPSAweDAwNTU7CisgdC5VYWN1dGUgPSAweDAwZGE7CisgdC5VYWN1dGVzbWFsbCA9IDB4ZjdmYTsKKyB0LlVicmV2ZSA9IDB4MDE2YzsKKyB0LlVjYXJvbiA9IDB4MDFkMzsKKyB0LlVjaXJjbGUgPSAweDI0Y2E7CisgdC5VY2lyY3VtZmxleCA9IDB4MDBkYjsKKyB0LlVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzY7CisgdC5VY2lyY3VtZmxleHNtYWxsID0gMHhmN2ZiOworIHQuVWN5cmlsbGljID0gMHgwNDIzOworIHQuVWRibGFjdXRlID0gMHgwMTcwOworIHQuVWRibGdyYXZlID0gMHgwMjE0OworIHQuVWRpZXJlc2lzID0gMHgwMGRjOworIHQuVWRpZXJlc2lzYWN1dGUgPSAweDAxZDc7CisgdC5VZGllcmVzaXNiZWxvdyA9IDB4MWU3MjsKKyB0LlVkaWVyZXNpc2Nhcm9uID0gMHgwMWQ5OworIHQuVWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjA7CisgdC5VZGllcmVzaXNncmF2ZSA9IDB4MDFkYjsKKyB0LlVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNTsKKyB0LlVkaWVyZXNpc3NtYWxsID0gMHhmN2ZjOworIHQuVWRvdGJlbG93ID0gMHgxZWU0OworIHQuVWdyYXZlID0gMHgwMGQ5OworIHQuVWdyYXZlc21hbGwgPSAweGY3Zjk7CisgdC5VaG9va2Fib3ZlID0gMHgxZWU2OworIHQuVWhvcm4gPSAweDAxYWY7CisgdC5VaG9ybmFjdXRlID0gMHgxZWU4OworIHQuVWhvcm5kb3RiZWxvdyA9IDB4MWVmMDsKKyB0LlVob3JuZ3JhdmUgPSAweDFlZWE7CisgdC5VaG9ybmhvb2thYm92ZSA9IDB4MWVlYzsKKyB0LlVob3JudGlsZGUgPSAweDFlZWU7CisgdC5VaHVuZ2FydW1sYXV0ID0gMHgwMTcwOworIHQuVWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYyOworIHQuVWludmVydGVkYnJldmUgPSAweDAyMTY7CisgdC5Va2N5cmlsbGljID0gMHgwNDc4OworIHQuVW1hY3JvbiA9IDB4MDE2YTsKKyB0LlVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZTsKKyB0LlVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YTsKKyB0LlVtb25vc3BhY2UgPSAweGZmMzU7CisgdC5Vb2dvbmVrID0gMHgwMTcyOworIHQuVXBzaWxvbiA9IDB4MDNhNTsKKyB0LlVwc2lsb24xID0gMHgwM2QyOworIHQuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrID0gMHgwM2QzOworIHQuVXBzaWxvbmFmcmljYW4gPSAweDAxYjE7CisgdC5VcHNpbG9uZGllcmVzaXMgPSAweDAzYWI7CisgdC5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWsgPSAweDAzZDQ7CisgdC5VcHNpbG9uaG9va3N5bWJvbCA9IDB4MDNkMjsKKyB0LlVwc2lsb250b25vcyA9IDB4MDM4ZTsKKyB0LlVyaW5nID0gMHgwMTZlOworIHQuVXNob3J0Y3lyaWxsaWMgPSAweDA0MGU7CisgdC5Vc21hbGwgPSAweGY3NzU7CisgdC5Vc3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZTsKKyB0LlVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIwOworIHQuVXRpbGRlID0gMHgwMTY4OworIHQuVXRpbGRlYWN1dGUgPSAweDFlNzg7CisgdC5VdGlsZGViZWxvdyA9IDB4MWU3NDsKKyB0LlYgPSAweDAwNTY7CisgdC5WY2lyY2xlID0gMHgyNGNiOworIHQuVmRvdGJlbG93ID0gMHgxZTdlOworIHQuVmVjeXJpbGxpYyA9IDB4MDQxMjsKKyB0LlZld2FybWVuaWFuID0gMHgwNTRlOworIHQuVmhvb2sgPSAweDAxYjI7CisgdC5WbW9ub3NwYWNlID0gMHhmZjM2OworIHQuVm9hcm1lbmlhbiA9IDB4MDU0ODsKKyB0LlZzbWFsbCA9IDB4Zjc3NjsKKyB0LlZ0aWxkZSA9IDB4MWU3YzsKKyB0LlcgPSAweDAwNTc7CisgdC5XYWN1dGUgPSAweDFlODI7CisgdC5XY2lyY2xlID0gMHgyNGNjOworIHQuV2NpcmN1bWZsZXggPSAweDAxNzQ7CisgdC5XZGllcmVzaXMgPSAweDFlODQ7CisgdC5XZG90YWNjZW50ID0gMHgxZTg2OworIHQuV2RvdGJlbG93ID0gMHgxZTg4OworIHQuV2dyYXZlID0gMHgxZTgwOworIHQuV21vbm9zcGFjZSA9IDB4ZmYzNzsKKyB0LldzbWFsbCA9IDB4Zjc3NzsKKyB0LlggPSAweDAwNTg7CisgdC5YY2lyY2xlID0gMHgyNGNkOworIHQuWGRpZXJlc2lzID0gMHgxZThjOworIHQuWGRvdGFjY2VudCA9IDB4MWU4YTsKKyB0LlhlaGFybWVuaWFuID0gMHgwNTNkOworIHQuWGkgPSAweDAzOWU7CisgdC5YbW9ub3NwYWNlID0gMHhmZjM4OworIHQuWHNtYWxsID0gMHhmNzc4OworIHQuWSA9IDB4MDA1OTsKKyB0LllhY3V0ZSA9IDB4MDBkZDsKKyB0LllhY3V0ZXNtYWxsID0gMHhmN2ZkOworIHQuWWF0Y3lyaWxsaWMgPSAweDA0NjI7CisgdC5ZY2lyY2xlID0gMHgyNGNlOworIHQuWWNpcmN1bWZsZXggPSAweDAxNzY7CisgdC5ZZGllcmVzaXMgPSAweDAxNzg7CisgdC5ZZGllcmVzaXNzbWFsbCA9IDB4ZjdmZjsKKyB0Lllkb3RhY2NlbnQgPSAweDFlOGU7CisgdC5ZZG90YmVsb3cgPSAweDFlZjQ7CisgdC5ZZXJpY3lyaWxsaWMgPSAweDA0MmI7CisgdC5ZZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmODsKKyB0LllncmF2ZSA9IDB4MWVmMjsKKyB0Lllob29rID0gMHgwMWIzOworIHQuWWhvb2thYm92ZSA9IDB4MWVmNjsKKyB0LllpYXJtZW5pYW4gPSAweDA1NDU7CisgdC5ZaWN5cmlsbGljID0gMHgwNDA3OworIHQuWWl3bmFybWVuaWFuID0gMHgwNTUyOworIHQuWW1vbm9zcGFjZSA9IDB4ZmYzOTsKKyB0LllzbWFsbCA9IDB4Zjc3OTsKKyB0Lll0aWxkZSA9IDB4MWVmODsKKyB0Lll1c2JpZ2N5cmlsbGljID0gMHgwNDZhOworIHQuWXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2YzsKKyB0Lll1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY2OworIHQuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ODsKKyB0LlogPSAweDAwNWE7CisgdC5aYWFybWVuaWFuID0gMHgwNTM2OworIHQuWmFjdXRlID0gMHgwMTc5OworIHQuWmNhcm9uID0gMHgwMTdkOworIHQuWmNhcm9uc21hbGwgPSAweGY2ZmY7CisgdC5aY2lyY2xlID0gMHgyNGNmOworIHQuWmNpcmN1bWZsZXggPSAweDFlOTA7CisgdC5aZG90ID0gMHgwMTdiOworIHQuWmRvdGFjY2VudCA9IDB4MDE3YjsKKyB0Llpkb3RiZWxvdyA9IDB4MWU5MjsKKyB0LlplY3lyaWxsaWMgPSAweDA0MTc7CisgdC5aZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk4OworIHQuWmVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRlOworIHQuWmV0YSA9IDB4MDM5NjsKKyB0LlpoZWFybWVuaWFuID0gMHgwNTNhOworIHQuWmhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMTsKKyB0LlpoZWN5cmlsbGljID0gMHgwNDE2OworIHQuWmhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTY7CisgdC5aaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRjOworIHQuWmxpbmViZWxvdyA9IDB4MWU5NDsKKyB0Llptb25vc3BhY2UgPSAweGZmM2E7CisgdC5ac21hbGwgPSAweGY3N2E7CisgdC5ac3Ryb2tlID0gMHgwMWI1OworIHQuYSA9IDB4MDA2MTsKKyB0LmFhYmVuZ2FsaSA9IDB4MDk4NjsKKyB0LmFhY3V0ZSA9IDB4MDBlMTsKKyB0LmFhZGV2YSA9IDB4MDkwNjsKKyB0LmFhZ3VqYXJhdGkgPSAweDBhODY7CisgdC5hYWd1cm11a2hpID0gMHgwYTA2OworIHQuYWFtYXRyYWd1cm11a2hpID0gMHgwYTNlOworIHQuYWFydXNxdWFyZSA9IDB4MzMwMzsKKyB0LmFhdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZTsKKyB0LmFhdm93ZWxzaWduZGV2YSA9IDB4MDkzZTsKKyB0LmFhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmU7CisgdC5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4gPSAweDA1NWY7CisgdC5hYmJyZXZpYXRpb25zaWduZGV2YSA9IDB4MDk3MDsKKyB0LmFiZW5nYWxpID0gMHgwOTg1OworIHQuYWJvcG9tb2ZvID0gMHgzMTFhOworIHQuYWJyZXZlID0gMHgwMTAzOworIHQuYWJyZXZlYWN1dGUgPSAweDFlYWY7CisgdC5hYnJldmVjeXJpbGxpYyA9IDB4MDRkMTsKKyB0LmFicmV2ZWRvdGJlbG93ID0gMHgxZWI3OworIHQuYWJyZXZlZ3JhdmUgPSAweDFlYjE7CisgdC5hYnJldmVob29rYWJvdmUgPSAweDFlYjM7CisgdC5hYnJldmV0aWxkZSA9IDB4MWViNTsKKyB0LmFjYXJvbiA9IDB4MDFjZTsKKyB0LmFjaXJjbGUgPSAweDI0ZDA7CisgdC5hY2lyY3VtZmxleCA9IDB4MDBlMjsKKyB0LmFjaXJjdW1mbGV4YWN1dGUgPSAweDFlYTU7CisgdC5hY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFkOworIHQuYWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNzsKKyB0LmFjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWE5OworIHQuYWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVhYjsKKyB0LmFjdXRlID0gMHgwMGI0OworIHQuYWN1dGViZWxvd2NtYiA9IDB4MDMxNzsKKyB0LmFjdXRlY21iID0gMHgwMzAxOworIHQuYWN1dGVjb21iID0gMHgwMzAxOworIHQuYWN1dGVkZXZhID0gMHgwOTU0OworIHQuYWN1dGVsb3dtb2QgPSAweDAyY2Y7CisgdC5hY3V0ZXRvbmVjbWIgPSAweDAzNDE7CisgdC5hY3lyaWxsaWMgPSAweDA0MzA7CisgdC5hZGJsZ3JhdmUgPSAweDAyMDE7CisgdC5hZGRha2d1cm11a2hpID0gMHgwYTcxOworIHQuYWRldmEgPSAweDA5MDU7CisgdC5hZGllcmVzaXMgPSAweDAwZTQ7CisgdC5hZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMzsKKyB0LmFkaWVyZXNpc21hY3JvbiA9IDB4MDFkZjsKKyB0LmFkb3RiZWxvdyA9IDB4MWVhMTsKKyB0LmFkb3RtYWNyb24gPSAweDAxZTE7CisgdC5hZSA9IDB4MDBlNjsKKyB0LmFlYWN1dGUgPSAweDAxZmQ7CisgdC5hZWtvcmVhbiA9IDB4MzE1MDsKKyB0LmFlbWFjcm9uID0gMHgwMWUzOworIHQuYWZpaTAwMjA4ID0gMHgyMDE1OworIHQuYWZpaTA4OTQxID0gMHgyMGE0OworIHQuYWZpaTEwMDE3ID0gMHgwNDEwOworIHQuYWZpaTEwMDE4ID0gMHgwNDExOworIHQuYWZpaTEwMDE5ID0gMHgwNDEyOworIHQuYWZpaTEwMDIwID0gMHgwNDEzOworIHQuYWZpaTEwMDIxID0gMHgwNDE0OworIHQuYWZpaTEwMDIyID0gMHgwNDE1OworIHQuYWZpaTEwMDIzID0gMHgwNDAxOworIHQuYWZpaTEwMDI0ID0gMHgwNDE2OworIHQuYWZpaTEwMDI1ID0gMHgwNDE3OworIHQuYWZpaTEwMDI2ID0gMHgwNDE4OworIHQuYWZpaTEwMDI3ID0gMHgwNDE5OworIHQuYWZpaTEwMDI4ID0gMHgwNDFhOworIHQuYWZpaTEwMDI5ID0gMHgwNDFiOworIHQuYWZpaTEwMDMwID0gMHgwNDFjOworIHQuYWZpaTEwMDMxID0gMHgwNDFkOworIHQuYWZpaTEwMDMyID0gMHgwNDFlOworIHQuYWZpaTEwMDMzID0gMHgwNDFmOworIHQuYWZpaTEwMDM0ID0gMHgwNDIwOworIHQuYWZpaTEwMDM1ID0gMHgwNDIxOworIHQuYWZpaTEwMDM2ID0gMHgwNDIyOworIHQuYWZpaTEwMDM3ID0gMHgwNDIzOworIHQuYWZpaTEwMDM4ID0gMHgwNDI0OworIHQuYWZpaTEwMDM5ID0gMHgwNDI1OworIHQuYWZpaTEwMDQwID0gMHgwNDI2OworIHQuYWZpaTEwMDQxID0gMHgwNDI3OworIHQuYWZpaTEwMDQyID0gMHgwNDI4OworIHQuYWZpaTEwMDQzID0gMHgwNDI5OworIHQuYWZpaTEwMDQ0ID0gMHgwNDJhOworIHQuYWZpaTEwMDQ1ID0gMHgwNDJiOworIHQuYWZpaTEwMDQ2ID0gMHgwNDJjOworIHQuYWZpaTEwMDQ3ID0gMHgwNDJkOworIHQuYWZpaTEwMDQ4ID0gMHgwNDJlOworIHQuYWZpaTEwMDQ5ID0gMHgwNDJmOworIHQuYWZpaTEwMDUwID0gMHgwNDkwOworIHQuYWZpaTEwMDUxID0gMHgwNDAyOworIHQuYWZpaTEwMDUyID0gMHgwNDAzOworIHQuYWZpaTEwMDUzID0gMHgwNDA0OworIHQuYWZpaTEwMDU0ID0gMHgwNDA1OworIHQuYWZpaTEwMDU1ID0gMHgwNDA2OworIHQuYWZpaTEwMDU2ID0gMHgwNDA3OworIHQuYWZpaTEwMDU3ID0gMHgwNDA4OworIHQuYWZpaTEwMDU4ID0gMHgwNDA5OworIHQuYWZpaTEwMDU5ID0gMHgwNDBhOworIHQuYWZpaTEwMDYwID0gMHgwNDBiOworIHQuYWZpaTEwMDYxID0gMHgwNDBjOworIHQuYWZpaTEwMDYyID0gMHgwNDBlOworIHQuYWZpaTEwMDYzID0gMHhmNmM0OworIHQuYWZpaTEwMDY0ID0gMHhmNmM1OworIHQuYWZpaTEwMDY1ID0gMHgwNDMwOworIHQuYWZpaTEwMDY2ID0gMHgwNDMxOworIHQuYWZpaTEwMDY3ID0gMHgwNDMyOworIHQuYWZpaTEwMDY4ID0gMHgwNDMzOworIHQuYWZpaTEwMDY5ID0gMHgwNDM0OworIHQuYWZpaTEwMDcwID0gMHgwNDM1OworIHQuYWZpaTEwMDcxID0gMHgwNDUxOworIHQuYWZpaTEwMDcyID0gMHgwNDM2OworIHQuYWZpaTEwMDczID0gMHgwNDM3OworIHQuYWZpaTEwMDc0ID0gMHgwNDM4OworIHQuYWZpaTEwMDc1ID0gMHgwNDM5OworIHQuYWZpaTEwMDc2ID0gMHgwNDNhOworIHQuYWZpaTEwMDc3ID0gMHgwNDNiOworIHQuYWZpaTEwMDc4ID0gMHgwNDNjOworIHQuYWZpaTEwMDc5ID0gMHgwNDNkOworIHQuYWZpaTEwMDgwID0gMHgwNDNlOworIHQuYWZpaTEwMDgxID0gMHgwNDNmOworIHQuYWZpaTEwMDgyID0gMHgwNDQwOworIHQuYWZpaTEwMDgzID0gMHgwNDQxOworIHQuYWZpaTEwMDg0ID0gMHgwNDQyOworIHQuYWZpaTEwMDg1ID0gMHgwNDQzOworIHQuYWZpaTEwMDg2ID0gMHgwNDQ0OworIHQuYWZpaTEwMDg3ID0gMHgwNDQ1OworIHQuYWZpaTEwMDg4ID0gMHgwNDQ2OworIHQuYWZpaTEwMDg5ID0gMHgwNDQ3OworIHQuYWZpaTEwMDkwID0gMHgwNDQ4OworIHQuYWZpaTEwMDkxID0gMHgwNDQ5OworIHQuYWZpaTEwMDkyID0gMHgwNDRhOworIHQuYWZpaTEwMDkzID0gMHgwNDRiOworIHQuYWZpaTEwMDk0ID0gMHgwNDRjOworIHQuYWZpaTEwMDk1ID0gMHgwNDRkOworIHQuYWZpaTEwMDk2ID0gMHgwNDRlOworIHQuYWZpaTEwMDk3ID0gMHgwNDRmOworIHQuYWZpaTEwMDk4ID0gMHgwNDkxOworIHQuYWZpaTEwMDk5ID0gMHgwNDUyOworIHQuYWZpaTEwMTAwID0gMHgwNDUzOworIHQuYWZpaTEwMTAxID0gMHgwNDU0OworIHQuYWZpaTEwMTAyID0gMHgwNDU1OworIHQuYWZpaTEwMTAzID0gMHgwNDU2OworIHQuYWZpaTEwMTA0ID0gMHgwNDU3OworIHQuYWZpaTEwMTA1ID0gMHgwNDU4OworIHQuYWZpaTEwMTA2ID0gMHgwNDU5OworIHQuYWZpaTEwMTA3ID0gMHgwNDVhOworIHQuYWZpaTEwMTA4ID0gMHgwNDViOworIHQuYWZpaTEwMTA5ID0gMHgwNDVjOworIHQuYWZpaTEwMTEwID0gMHgwNDVlOworIHQuYWZpaTEwMTQ1ID0gMHgwNDBmOworIHQuYWZpaTEwMTQ2ID0gMHgwNDYyOworIHQuYWZpaTEwMTQ3ID0gMHgwNDcyOworIHQuYWZpaTEwMTQ4ID0gMHgwNDc0OworIHQuYWZpaTEwMTkyID0gMHhmNmM2OworIHQuYWZpaTEwMTkzID0gMHgwNDVmOworIHQuYWZpaTEwMTk0ID0gMHgwNDYzOworIHQuYWZpaTEwMTk1ID0gMHgwNDczOworIHQuYWZpaTEwMTk2ID0gMHgwNDc1OworIHQuYWZpaTEwODMxID0gMHhmNmM3OworIHQuYWZpaTEwODMyID0gMHhmNmM4OworIHQuYWZpaTEwODQ2ID0gMHgwNGQ5OworIHQuYWZpaTI5OSA9IDB4MjAwZTsKKyB0LmFmaWkzMDAgPSAweDIwMGY7CisgdC5hZmlpMzAxID0gMHgyMDBkOworIHQuYWZpaTU3MzgxID0gMHgwNjZhOworIHQuYWZpaTU3Mzg4ID0gMHgwNjBjOworIHQuYWZpaTU3MzkyID0gMHgwNjYwOworIHQuYWZpaTU3MzkzID0gMHgwNjYxOworIHQuYWZpaTU3Mzk0ID0gMHgwNjYyOworIHQuYWZpaTU3Mzk1ID0gMHgwNjYzOworIHQuYWZpaTU3Mzk2ID0gMHgwNjY0OworIHQuYWZpaTU3Mzk3ID0gMHgwNjY1OworIHQuYWZpaTU3Mzk4ID0gMHgwNjY2OworIHQuYWZpaTU3Mzk5ID0gMHgwNjY3OworIHQuYWZpaTU3NDAwID0gMHgwNjY4OworIHQuYWZpaTU3NDAxID0gMHgwNjY5OworIHQuYWZpaTU3NDAzID0gMHgwNjFiOworIHQuYWZpaTU3NDA3ID0gMHgwNjFmOworIHQuYWZpaTU3NDA5ID0gMHgwNjIxOworIHQuYWZpaTU3NDEwID0gMHgwNjIyOworIHQuYWZpaTU3NDExID0gMHgwNjIzOworIHQuYWZpaTU3NDEyID0gMHgwNjI0OworIHQuYWZpaTU3NDEzID0gMHgwNjI1OworIHQuYWZpaTU3NDE0ID0gMHgwNjI2OworIHQuYWZpaTU3NDE1ID0gMHgwNjI3OworIHQuYWZpaTU3NDE2ID0gMHgwNjI4OworIHQuYWZpaTU3NDE3ID0gMHgwNjI5OworIHQuYWZpaTU3NDE4ID0gMHgwNjJhOworIHQuYWZpaTU3NDE5ID0gMHgwNjJiOworIHQuYWZpaTU3NDIwID0gMHgwNjJjOworIHQuYWZpaTU3NDIxID0gMHgwNjJkOworIHQuYWZpaTU3NDIyID0gMHgwNjJlOworIHQuYWZpaTU3NDIzID0gMHgwNjJmOworIHQuYWZpaTU3NDI0ID0gMHgwNjMwOworIHQuYWZpaTU3NDI1ID0gMHgwNjMxOworIHQuYWZpaTU3NDI2ID0gMHgwNjMyOworIHQuYWZpaTU3NDI3ID0gMHgwNjMzOworIHQuYWZpaTU3NDI4ID0gMHgwNjM0OworIHQuYWZpaTU3NDI5ID0gMHgwNjM1OworIHQuYWZpaTU3NDMwID0gMHgwNjM2OworIHQuYWZpaTU3NDMxID0gMHgwNjM3OworIHQuYWZpaTU3NDMyID0gMHgwNjM4OworIHQuYWZpaTU3NDMzID0gMHgwNjM5OworIHQuYWZpaTU3NDM0ID0gMHgwNjNhOworIHQuYWZpaTU3NDQwID0gMHgwNjQwOworIHQuYWZpaTU3NDQxID0gMHgwNjQxOworIHQuYWZpaTU3NDQyID0gMHgwNjQyOworIHQuYWZpaTU3NDQzID0gMHgwNjQzOworIHQuYWZpaTU3NDQ0ID0gMHgwNjQ0OworIHQuYWZpaTU3NDQ1ID0gMHgwNjQ1OworIHQuYWZpaTU3NDQ2ID0gMHgwNjQ2OworIHQuYWZpaTU3NDQ4ID0gMHgwNjQ4OworIHQuYWZpaTU3NDQ5ID0gMHgwNjQ5OworIHQuYWZpaTU3NDUwID0gMHgwNjRhOworIHQuYWZpaTU3NDUxID0gMHgwNjRiOworIHQuYWZpaTU3NDUyID0gMHgwNjRjOworIHQuYWZpaTU3NDUzID0gMHgwNjRkOworIHQuYWZpaTU3NDU0ID0gMHgwNjRlOworIHQuYWZpaTU3NDU1ID0gMHgwNjRmOworIHQuYWZpaTU3NDU2ID0gMHgwNjUwOworIHQuYWZpaTU3NDU3ID0gMHgwNjUxOworIHQuYWZpaTU3NDU4ID0gMHgwNjUyOworIHQuYWZpaTU3NDcwID0gMHgwNjQ3OworIHQuYWZpaTU3NTA1ID0gMHgwNmE0OworIHQuYWZpaTU3NTA2ID0gMHgwNjdlOworIHQuYWZpaTU3NTA3ID0gMHgwNjg2OworIHQuYWZpaTU3NTA4ID0gMHgwNjk4OworIHQuYWZpaTU3NTA5ID0gMHgwNmFmOworIHQuYWZpaTU3NTExID0gMHgwNjc5OworIHQuYWZpaTU3NTEyID0gMHgwNjg4OworIHQuYWZpaTU3NTEzID0gMHgwNjkxOworIHQuYWZpaTU3NTE0ID0gMHgwNmJhOworIHQuYWZpaTU3NTE5ID0gMHgwNmQyOworIHQuYWZpaTU3NTM0ID0gMHgwNmQ1OworIHQuYWZpaTU3NjM2ID0gMHgyMGFhOworIHQuYWZpaTU3NjQ1ID0gMHgwNWJlOworIHQuYWZpaTU3NjU4ID0gMHgwNWMzOworIHQuYWZpaTU3NjY0ID0gMHgwNWQwOworIHQuYWZpaTU3NjY1ID0gMHgwNWQxOworIHQuYWZpaTU3NjY2ID0gMHgwNWQyOworIHQuYWZpaTU3NjY3ID0gMHgwNWQzOworIHQuYWZpaTU3NjY4ID0gMHgwNWQ0OworIHQuYWZpaTU3NjY5ID0gMHgwNWQ1OworIHQuYWZpaTU3NjcwID0gMHgwNWQ2OworIHQuYWZpaTU3NjcxID0gMHgwNWQ3OworIHQuYWZpaTU3NjcyID0gMHgwNWQ4OworIHQuYWZpaTU3NjczID0gMHgwNWQ5OworIHQuYWZpaTU3Njc0ID0gMHgwNWRhOworIHQuYWZpaTU3Njc1ID0gMHgwNWRiOworIHQuYWZpaTU3Njc2ID0gMHgwNWRjOworIHQuYWZpaTU3Njc3ID0gMHgwNWRkOworIHQuYWZpaTU3Njc4ID0gMHgwNWRlOworIHQuYWZpaTU3Njc5ID0gMHgwNWRmOworIHQuYWZpaTU3NjgwID0gMHgwNWUwOworIHQuYWZpaTU3NjgxID0gMHgwNWUxOworIHQuYWZpaTU3NjgyID0gMHgwNWUyOworIHQuYWZpaTU3NjgzID0gMHgwNWUzOworIHQuYWZpaTU3Njg0ID0gMHgwNWU0OworIHQuYWZpaTU3Njg1ID0gMHgwNWU1OworIHQuYWZpaTU3Njg2ID0gMHgwNWU2OworIHQuYWZpaTU3Njg3ID0gMHgwNWU3OworIHQuYWZpaTU3Njg4ID0gMHgwNWU4OworIHQuYWZpaTU3Njg5ID0gMHgwNWU5OworIHQuYWZpaTU3NjkwID0gMHgwNWVhOworIHQuYWZpaTU3Njk0ID0gMHhmYjJhOworIHQuYWZpaTU3Njk1ID0gMHhmYjJiOworIHQuYWZpaTU3NzAwID0gMHhmYjRiOworIHQuYWZpaTU3NzA1ID0gMHhmYjFmOworIHQuYWZpaTU3NzE2ID0gMHgwNWYwOworIHQuYWZpaTU3NzE3ID0gMHgwNWYxOworIHQuYWZpaTU3NzE4ID0gMHgwNWYyOworIHQuYWZpaTU3NzIzID0gMHhmYjM1OworIHQuYWZpaTU3NzkzID0gMHgwNWI0OworIHQuYWZpaTU3Nzk0ID0gMHgwNWI1OworIHQuYWZpaTU3Nzk1ID0gMHgwNWI2OworIHQuYWZpaTU3Nzk2ID0gMHgwNWJiOworIHQuYWZpaTU3Nzk3ID0gMHgwNWI4OworIHQuYWZpaTU3Nzk4ID0gMHgwNWI3OworIHQuYWZpaTU3Nzk5ID0gMHgwNWIwOworIHQuYWZpaTU3ODAwID0gMHgwNWIyOworIHQuYWZpaTU3ODAxID0gMHgwNWIxOworIHQuYWZpaTU3ODAyID0gMHgwNWIzOworIHQuYWZpaTU3ODAzID0gMHgwNWMyOworIHQuYWZpaTU3ODA0ID0gMHgwNWMxOworIHQuYWZpaTU3ODA2ID0gMHgwNWI5OworIHQuYWZpaTU3ODA3ID0gMHgwNWJjOworIHQuYWZpaTU3ODM5ID0gMHgwNWJkOworIHQuYWZpaTU3ODQxID0gMHgwNWJmOworIHQuYWZpaTU3ODQyID0gMHgwNWMwOworIHQuYWZpaTU3OTI5ID0gMHgwMmJjOworIHQuYWZpaTYxMjQ4ID0gMHgyMTA1OworIHQuYWZpaTYxMjg5ID0gMHgyMTEzOworIHQuYWZpaTYxMzUyID0gMHgyMTE2OworIHQuYWZpaTYxNTczID0gMHgyMDJjOworIHQuYWZpaTYxNTc0ID0gMHgyMDJkOworIHQuYWZpaTYxNTc1ID0gMHgyMDJlOworIHQuYWZpaTYxNjY0ID0gMHgyMDBjOworIHQuYWZpaTYzMTY3ID0gMHgwNjZkOworIHQuYWZpaTY0OTM3ID0gMHgwMmJkOworIHQuYWdyYXZlID0gMHgwMGUwOworIHQuYWd1amFyYXRpID0gMHgwYTg1OworIHQuYWd1cm11a2hpID0gMHgwYTA1OworIHQuYWhpcmFnYW5hID0gMHgzMDQyOworIHQuYWhvb2thYm92ZSA9IDB4MWVhMzsKKyB0LmFpYmVuZ2FsaSA9IDB4MDk5MDsKKyB0LmFpYm9wb21vZm8gPSAweDMxMWU7CisgdC5haWRldmEgPSAweDA5MTA7CisgdC5haWVjeXJpbGxpYyA9IDB4MDRkNTsKKyB0LmFpZ3VqYXJhdGkgPSAweDBhOTA7CisgdC5haWd1cm11a2hpID0gMHgwYTEwOworIHQuYWltYXRyYWd1cm11a2hpID0gMHgwYTQ4OworIHQuYWluYXJhYmljID0gMHgwNjM5OworIHQuYWluZmluYWxhcmFiaWMgPSAweGZlY2E7CisgdC5haW5pbml0aWFsYXJhYmljID0gMHhmZWNiOworIHQuYWlubWVkaWFsYXJhYmljID0gMHhmZWNjOworIHQuYWludmVydGVkYnJldmUgPSAweDAyMDM7CisgdC5haXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzg7CisgdC5haXZvd2Vsc2lnbmRldmEgPSAweDA5NDg7CisgdC5haXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM4OworIHQuYWthdGFrYW5hID0gMHgzMGEyOworIHQuYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcxOworIHQuYWtvcmVhbiA9IDB4MzE0ZjsKKyB0LmFsZWYgPSAweDA1ZDA7CisgdC5hbGVmYXJhYmljID0gMHgwNjI3OworIHQuYWxlZmRhZ2VzaGhlYnJldyA9IDB4ZmIzMDsKKyB0LmFsZWZmaW5hbGFyYWJpYyA9IDB4ZmU4ZTsKKyB0LmFsZWZoYW16YWFib3ZlYXJhYmljID0gMHgwNjIzOworIHQuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NDsKKyB0LmFsZWZoYW16YWJlbG93YXJhYmljID0gMHgwNjI1OworIHQuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmU4ODsKKyB0LmFsZWZoZWJyZXcgPSAweDA1ZDA7CisgdC5hbGVmbGFtZWRoZWJyZXcgPSAweGZiNGY7CisgdC5hbGVmbWFkZGFhYm92ZWFyYWJpYyA9IDB4MDYyMjsKKyB0LmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODI7CisgdC5hbGVmbWFrc3VyYWFyYWJpYyA9IDB4MDY0OTsKKyB0LmFsZWZtYWtzdXJhZmluYWxhcmFiaWMgPSAweGZlZjA7CisgdC5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWMgPSAweGZlZjM7CisgdC5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKKyB0LmFsZWZwYXRhaGhlYnJldyA9IDB4ZmIyZTsKKyB0LmFsZWZxYW1hdHNoZWJyZXcgPSAweGZiMmY7CisgdC5hbGVwaCA9IDB4MjEzNTsKKyB0LmFsbGVxdWFsID0gMHgyMjRjOworIHQuYWxwaGEgPSAweDAzYjE7CisgdC5hbHBoYXRvbm9zID0gMHgwM2FjOworIHQuYW1hY3JvbiA9IDB4MDEwMTsKKyB0LmFtb25vc3BhY2UgPSAweGZmNDE7CisgdC5hbXBlcnNhbmQgPSAweDAwMjY7CisgdC5hbXBlcnNhbmRtb25vc3BhY2UgPSAweGZmMDY7CisgdC5hbXBlcnNhbmRzbWFsbCA9IDB4ZjcyNjsKKyB0LmFtc3F1YXJlID0gMHgzM2MyOworIHQuYW5ib3BvbW9mbyA9IDB4MzEyMjsKKyB0LmFuZ2JvcG9tb2ZvID0gMHgzMTI0OworIHQuYW5nYnJhY2tldGxlZnQgPSAweDMwMDg7CisgdC5hbmdicmFja2V0cmlnaHQgPSAweDMwMDk7CisgdC5hbmdraGFua2h1dGhhaSA9IDB4MGU1YTsKKyB0LmFuZ2xlID0gMHgyMjIwOworIHQuYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwODsKKyB0LmFuZ2xlYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzZjsKKyB0LmFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDA5OworIHQuYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0MDsKKyB0LmFuZ2xlbGVmdCA9IDB4MjMyOTsKKyB0LmFuZ2xlcmlnaHQgPSAweDIzMmE7CisgdC5hbmdzdHJvbSA9IDB4MjEyYjsKKyB0LmFub3RlbGVpYSA9IDB4MDM4NzsKKyB0LmFudWRhdHRhZGV2YSA9IDB4MDk1MjsKKyB0LmFudXN2YXJhYmVuZ2FsaSA9IDB4MDk4MjsKKyB0LmFudXN2YXJhZGV2YSA9IDB4MDkwMjsKKyB0LmFudXN2YXJhZ3VqYXJhdGkgPSAweDBhODI7CisgdC5hb2dvbmVrID0gMHgwMTA1OworIHQuYXBhYXRvc3F1YXJlID0gMHgzMzAwOworIHQuYXBhcmVuID0gMHgyNDljOworIHQuYXBvc3Ryb3BoZWFybWVuaWFuID0gMHgwNTVhOworIHQuYXBvc3Ryb3BoZW1vZCA9IDB4MDJiYzsKKyB0LmFwcGxlID0gMHhmOGZmOworIHQuYXBwcm9hY2hlcyA9IDB4MjI1MDsKKyB0LmFwcHJveGVxdWFsID0gMHgyMjQ4OworIHQuYXBwcm94ZXF1YWxvcmltYWdlID0gMHgyMjUyOworIHQuYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjQ1OworIHQuYXJhZWFla29yZWFuID0gMHgzMThlOworIHQuYXJhZWFrb3JlYW4gPSAweDMxOGQ7CisgdC5hcmMgPSAweDIzMTI7CisgdC5hcmlnaHRoYWxmcmluZyA9IDB4MWU5YTsKKyB0LmFyaW5nID0gMHgwMGU1OworIHQuYXJpbmdhY3V0ZSA9IDB4MDFmYjsKKyB0LmFyaW5nYmVsb3cgPSAweDFlMDE7CisgdC5hcnJvd2JvdGggPSAweDIxOTQ7CisgdC5hcnJvd2Rhc2hkb3duID0gMHgyMWUzOworIHQuYXJyb3dkYXNobGVmdCA9IDB4MjFlMDsKKyB0LmFycm93ZGFzaHJpZ2h0ID0gMHgyMWUyOworIHQuYXJyb3dkYXNodXAgPSAweDIxZTE7CisgdC5hcnJvd2RibGJvdGggPSAweDIxZDQ7CisgdC5hcnJvd2RibGRvd24gPSAweDIxZDM7CisgdC5hcnJvd2RibGxlZnQgPSAweDIxZDA7CisgdC5hcnJvd2RibHJpZ2h0ID0gMHgyMWQyOworIHQuYXJyb3dkYmx1cCA9IDB4MjFkMTsKKyB0LmFycm93ZG93biA9IDB4MjE5MzsKKyB0LmFycm93ZG93bmxlZnQgPSAweDIxOTk7CisgdC5hcnJvd2Rvd25yaWdodCA9IDB4MjE5ODsKKyB0LmFycm93ZG93bndoaXRlID0gMHgyMWU5OworIHQuYXJyb3doZWFkZG93bm1vZCA9IDB4MDJjNTsKKyB0LmFycm93aGVhZGxlZnRtb2QgPSAweDAyYzI7CisgdC5hcnJvd2hlYWRyaWdodG1vZCA9IDB4MDJjMzsKKyB0LmFycm93aGVhZHVwbW9kID0gMHgwMmM0OworIHQuYXJyb3dob3JpemV4ID0gMHhmOGU3OworIHQuYXJyb3dsZWZ0ID0gMHgyMTkwOworIHQuYXJyb3dsZWZ0ZGJsID0gMHgyMWQwOworIHQuYXJyb3dsZWZ0ZGJsc3Ryb2tlID0gMHgyMWNkOworIHQuYXJyb3dsZWZ0b3ZlcnJpZ2h0ID0gMHgyMWM2OworIHQuYXJyb3dsZWZ0d2hpdGUgPSAweDIxZTY7CisgdC5hcnJvd3JpZ2h0ID0gMHgyMTkyOworIHQuYXJyb3dyaWdodGRibHN0cm9rZSA9IDB4MjFjZjsKKyB0LmFycm93cmlnaHRoZWF2eSA9IDB4Mjc5ZTsKKyB0LmFycm93cmlnaHRvdmVybGVmdCA9IDB4MjFjNDsKKyB0LmFycm93cmlnaHR3aGl0ZSA9IDB4MjFlODsKKyB0LmFycm93dGFibGVmdCA9IDB4MjFlNDsKKyB0LmFycm93dGFicmlnaHQgPSAweDIxZTU7CisgdC5hcnJvd3VwID0gMHgyMTkxOworIHQuYXJyb3d1cGRuID0gMHgyMTk1OworIHQuYXJyb3d1cGRuYnNlID0gMHgyMWE4OworIHQuYXJyb3d1cGRvd25iYXNlID0gMHgyMWE4OworIHQuYXJyb3d1cGxlZnQgPSAweDIxOTY7CisgdC5hcnJvd3VwbGVmdG9mZG93biA9IDB4MjFjNTsKKyB0LmFycm93dXByaWdodCA9IDB4MjE5NzsKKyB0LmFycm93dXB3aGl0ZSA9IDB4MjFlNzsKKyB0LmFycm93dmVydGV4ID0gMHhmOGU2OworIHQuYXNjaWljaXJjdW0gPSAweDAwNWU7CisgdC5hc2NpaWNpcmN1bW1vbm9zcGFjZSA9IDB4ZmYzZTsKKyB0LmFzY2lpdGlsZGUgPSAweDAwN2U7CisgdC5hc2NpaXRpbGRlbW9ub3NwYWNlID0gMHhmZjVlOworIHQuYXNjcmlwdCA9IDB4MDI1MTsKKyB0LmFzY3JpcHR0dXJuZWQgPSAweDAyNTI7CisgdC5hc21hbGxoaXJhZ2FuYSA9IDB4MzA0MTsKKyB0LmFzbWFsbGthdGFrYW5hID0gMHgzMGExOworIHQuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjc7CisgdC5hc3RlcmlzayA9IDB4MDAyYTsKKyB0LmFzdGVyaXNrYWx0b25lYXJhYmljID0gMHgwNjZkOworIHQuYXN0ZXJpc2thcmFiaWMgPSAweDA2NmQ7CisgdC5hc3Rlcmlza21hdGggPSAweDIyMTc7CisgdC5hc3Rlcmlza21vbm9zcGFjZSA9IDB4ZmYwYTsKKyB0LmFzdGVyaXNrc21hbGwgPSAweGZlNjE7CisgdC5hc3RlcmlzbSA9IDB4MjA0MjsKKyB0LmFzdXBlcmlvciA9IDB4ZjZlOTsKKyB0LmFzeW1wdG90aWNhbGx5ZXF1YWwgPSAweDIyNDM7CisgdC5hdCA9IDB4MDA0MDsKKyB0LmF0aWxkZSA9IDB4MDBlMzsKKyB0LmF0bW9ub3NwYWNlID0gMHhmZjIwOworIHQuYXRzbWFsbCA9IDB4ZmU2YjsKKyB0LmF0dXJuZWQgPSAweDAyNTA7CisgdC5hdWJlbmdhbGkgPSAweDA5OTQ7CisgdC5hdWJvcG9tb2ZvID0gMHgzMTIwOworIHQuYXVkZXZhID0gMHgwOTE0OworIHQuYXVndWphcmF0aSA9IDB4MGE5NDsKKyB0LmF1Z3VybXVraGkgPSAweDBhMTQ7CisgdC5hdWxlbmd0aG1hcmtiZW5nYWxpID0gMHgwOWQ3OworIHQuYXVtYXRyYWd1cm11a2hpID0gMHgwYTRjOworIHQuYXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNjOworIHQuYXV2b3dlbHNpZ25kZXZhID0gMHgwOTRjOworIHQuYXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjYzsKKyB0LmF2YWdyYWhhZGV2YSA9IDB4MDkzZDsKKyB0LmF5YmFybWVuaWFuID0gMHgwNTYxOworIHQuYXlpbiA9IDB4MDVlMjsKKyB0LmF5aW5hbHRvbmVoZWJyZXcgPSAweGZiMjA7CisgdC5heWluaGVicmV3ID0gMHgwNWUyOworIHQuYiA9IDB4MDA2MjsKKyB0LmJhYmVuZ2FsaSA9IDB4MDlhYzsKKyB0LmJhY2tzbGFzaCA9IDB4MDA1YzsKKyB0LmJhY2tzbGFzaG1vbm9zcGFjZSA9IDB4ZmYzYzsKKyB0LmJhZGV2YSA9IDB4MDkyYzsKKyB0LmJhZ3VqYXJhdGkgPSAweDBhYWM7CisgdC5iYWd1cm11a2hpID0gMHgwYTJjOworIHQuYmFoaXJhZ2FuYSA9IDB4MzA3MDsKKyB0LmJhaHR0aGFpID0gMHgwZTNmOworIHQuYmFrYXRha2FuYSA9IDB4MzBkMDsKKyB0LmJhciA9IDB4MDA3YzsKKyB0LmJhcm1vbm9zcGFjZSA9IDB4ZmY1YzsKKyB0LmJib3BvbW9mbyA9IDB4MzEwNTsKKyB0LmJjaXJjbGUgPSAweDI0ZDE7CisgdC5iZG90YWNjZW50ID0gMHgxZTAzOworIHQuYmRvdGJlbG93ID0gMHgxZTA1OworIHQuYmVhbWVkc2l4dGVlbnRobm90ZXMgPSAweDI2NmM7CisgdC5iZWNhdXNlID0gMHgyMjM1OworIHQuYmVjeXJpbGxpYyA9IDB4MDQzMTsKKyB0LmJlaGFyYWJpYyA9IDB4MDYyODsKKyB0LmJlaGZpbmFsYXJhYmljID0gMHhmZTkwOworIHQuYmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5MTsKKyB0LmJlaGlyYWdhbmEgPSAweDMwNzk7CisgdC5iZWhtZWRpYWxhcmFiaWMgPSAweGZlOTI7CisgdC5iZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmM5ZjsKKyB0LmJlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwODsKKyB0LmJlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM2ZDsKKyB0LmJla2F0YWthbmEgPSAweDMwZDk7CisgdC5iZW5hcm1lbmlhbiA9IDB4MDU2MjsKKyB0LmJldCA9IDB4MDVkMTsKKyB0LmJldGEgPSAweDAzYjI7CisgdC5iZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDA7CisgdC5iZXRkYWdlc2ggPSAweGZiMzE7CisgdC5iZXRkYWdlc2hoZWJyZXcgPSAweGZiMzE7CisgdC5iZXRoZWJyZXcgPSAweDA1ZDE7CisgdC5iZXRyYWZlaGVicmV3ID0gMHhmYjRjOworIHQuYmhhYmVuZ2FsaSA9IDB4MDlhZDsKKyB0LmJoYWRldmEgPSAweDA5MmQ7CisgdC5iaGFndWphcmF0aSA9IDB4MGFhZDsKKyB0LmJoYWd1cm11a2hpID0gMHgwYTJkOworIHQuYmhvb2sgPSAweDAyNTM7CisgdC5iaWhpcmFnYW5hID0gMHgzMDczOworIHQuYmlrYXRha2FuYSA9IDB4MzBkMzsKKyB0LmJpbGFiaWFsY2xpY2sgPSAweDAyOTg7CisgdC5iaW5kaWd1cm11a2hpID0gMHgwYTAyOworIHQuYmlydXNxdWFyZSA9IDB4MzMzMTsKKyB0LmJsYWNrY2lyY2xlID0gMHgyNWNmOworIHQuYmxhY2tkaWFtb25kID0gMHgyNWM2OworIHQuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViYzsKKyB0LmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciA9IDB4MjVjNDsKKyB0LmJsYWNrbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzA7CisgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxMDsKKyB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2I7CisgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTE7CisgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYzsKKyB0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTM7CisgdC5ibGFja2xvd2VycmlnaHR0cmlhbmdsZSA9IDB4MjVlMjsKKyB0LmJsYWNrcmVjdGFuZ2xlID0gMHgyNWFjOworIHQuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciA9IDB4MjViYTsKKyB0LmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI2OworIHQuYmxhY2tzbWFsbHNxdWFyZSA9IDB4MjVhYTsKKyB0LmJsYWNrc21pbGluZ2ZhY2UgPSAweDI2M2I7CisgdC5ibGFja3NxdWFyZSA9IDB4MjVhMDsKKyB0LmJsYWNrc3RhciA9IDB4MjYwNTsKKyB0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTQ7CisgdC5ibGFja3VwcGVycmlnaHR0cmlhbmdsZSA9IDB4MjVlNTsKKyB0LmJsYWNrdXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjQ7CisgdC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMjsKKyB0LmJsYW5rID0gMHgyNDIzOworIHQuYmxpbmViZWxvdyA9IDB4MWUwNzsKKyB0LmJsb2NrID0gMHgyNTg4OworIHQuYm1vbm9zcGFjZSA9IDB4ZmY0MjsKKyB0LmJvYmFpbWFpdGhhaSA9IDB4MGUxYTsKKyB0LmJvaGlyYWdhbmEgPSAweDMwN2M7CisgdC5ib2thdGFrYW5hID0gMHgzMGRjOworIHQuYnBhcmVuID0gMHgyNDlkOworIHQuYnFzcXVhcmUgPSAweDMzYzM7CisgdC5icmFjZWV4ID0gMHhmOGY0OworIHQuYnJhY2VsZWZ0ID0gMHgwMDdiOworIHQuYnJhY2VsZWZ0YnQgPSAweGY4ZjM7CisgdC5icmFjZWxlZnRtaWQgPSAweGY4ZjI7CisgdC5icmFjZWxlZnRtb25vc3BhY2UgPSAweGZmNWI7CisgdC5icmFjZWxlZnRzbWFsbCA9IDB4ZmU1YjsKKyB0LmJyYWNlbGVmdHRwID0gMHhmOGYxOworIHQuYnJhY2VsZWZ0dmVydGljYWwgPSAweGZlMzc7CisgdC5icmFjZXJpZ2h0ID0gMHgwMDdkOworIHQuYnJhY2VyaWdodGJ0ID0gMHhmOGZlOworIHQuYnJhY2VyaWdodG1pZCA9IDB4ZjhmZDsKKyB0LmJyYWNlcmlnaHRtb25vc3BhY2UgPSAweGZmNWQ7CisgdC5icmFjZXJpZ2h0c21hbGwgPSAweGZlNWM7CisgdC5icmFjZXJpZ2h0dHAgPSAweGY4ZmM7CisgdC5icmFjZXJpZ2h0dmVydGljYWwgPSAweGZlMzg7CisgdC5icmFja2V0bGVmdCA9IDB4MDA1YjsKKyB0LmJyYWNrZXRsZWZ0YnQgPSAweGY4ZjA7CisgdC5icmFja2V0bGVmdGV4ID0gMHhmOGVmOworIHQuYnJhY2tldGxlZnRtb25vc3BhY2UgPSAweGZmM2I7CisgdC5icmFja2V0bGVmdHRwID0gMHhmOGVlOworIHQuYnJhY2tldHJpZ2h0ID0gMHgwMDVkOworIHQuYnJhY2tldHJpZ2h0YnQgPSAweGY4ZmI7CisgdC5icmFja2V0cmlnaHRleCA9IDB4ZjhmYTsKKyB0LmJyYWNrZXRyaWdodG1vbm9zcGFjZSA9IDB4ZmYzZDsKKyB0LmJyYWNrZXRyaWdodHRwID0gMHhmOGY5OworIHQuYnJldmUgPSAweDAyZDg7CisgdC5icmV2ZWJlbG93Y21iID0gMHgwMzJlOworIHQuYnJldmVjbWIgPSAweDAzMDY7CisgdC5icmV2ZWludmVydGVkYmVsb3djbWIgPSAweDAzMmY7CisgdC5icmV2ZWludmVydGVkY21iID0gMHgwMzExOworIHQuYnJldmVpbnZlcnRlZGRvdWJsZWNtYiA9IDB4MDM2MTsKKyB0LmJyaWRnZWJlbG93Y21iID0gMHgwMzJhOworIHQuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMzYTsKKyB0LmJyb2tlbmJhciA9IDB4MDBhNjsKKyB0LmJzdHJva2UgPSAweDAxODA7CisgdC5ic3VwZXJpb3IgPSAweGY2ZWE7CisgdC5idG9wYmFyID0gMHgwMTgzOworIHQuYnVoaXJhZ2FuYSA9IDB4MzA3NjsKKyB0LmJ1a2F0YWthbmEgPSAweDMwZDY7CisgdC5idWxsZXQgPSAweDIwMjI7CisgdC5idWxsZXRpbnZlcnNlID0gMHgyNWQ4OworIHQuYnVsbGV0b3BlcmF0b3IgPSAweDIyMTk7CisgdC5idWxsc2V5ZSA9IDB4MjVjZTsKKyB0LmMgPSAweDAwNjM7CisgdC5jYWFybWVuaWFuID0gMHgwNTZlOworIHQuY2FiZW5nYWxpID0gMHgwOTlhOworIHQuY2FjdXRlID0gMHgwMTA3OworIHQuY2FkZXZhID0gMHgwOTFhOworIHQuY2FndWphcmF0aSA9IDB4MGE5YTsKKyB0LmNhZ3VybXVraGkgPSAweDBhMWE7CisgdC5jYWxzcXVhcmUgPSAweDMzODg7CisgdC5jYW5kcmFiaW5kdWJlbmdhbGkgPSAweDA5ODE7CisgdC5jYW5kcmFiaW5kdWNtYiA9IDB4MDMxMDsKKyB0LmNhbmRyYWJpbmR1ZGV2YSA9IDB4MDkwMTsKKyB0LmNhbmRyYWJpbmR1Z3VqYXJhdGkgPSAweDBhODE7CisgdC5jYXBzbG9jayA9IDB4MjFlYTsKKyB0LmNhcmVvZiA9IDB4MjEwNTsKKyB0LmNhcm9uID0gMHgwMmM3OworIHQuY2Fyb25iZWxvd2NtYiA9IDB4MDMyYzsKKyB0LmNhcm9uY21iID0gMHgwMzBjOworIHQuY2FycmlhZ2VyZXR1cm4gPSAweDIxYjU7CisgdC5jYm9wb21vZm8gPSAweDMxMTg7CisgdC5jY2Fyb24gPSAweDAxMGQ7CisgdC5jY2VkaWxsYSA9IDB4MDBlNzsKKyB0LmNjZWRpbGxhYWN1dGUgPSAweDFlMDk7CisgdC5jY2lyY2xlID0gMHgyNGQyOworIHQuY2NpcmN1bWZsZXggPSAweDAxMDk7CisgdC5jY3VybCA9IDB4MDI1NTsKKyB0LmNkb3QgPSAweDAxMGI7CisgdC5jZG90YWNjZW50ID0gMHgwMTBiOworIHQuY2RzcXVhcmUgPSAweDMzYzU7CisgdC5jZWRpbGxhID0gMHgwMGI4OworIHQuY2VkaWxsYWNtYiA9IDB4MDMyNzsKKyB0LmNlbnQgPSAweDAwYTI7CisgdC5jZW50aWdyYWRlID0gMHgyMTAzOworIHQuY2VudGluZmVyaW9yID0gMHhmNmRmOworIHQuY2VudG1vbm9zcGFjZSA9IDB4ZmZlMDsKKyB0LmNlbnRvbGRzdHlsZSA9IDB4ZjdhMjsKKyB0LmNlbnRzdXBlcmlvciA9IDB4ZjZlMDsKKyB0LmNoYWFybWVuaWFuID0gMHgwNTc5OworIHQuY2hhYmVuZ2FsaSA9IDB4MDk5YjsKKyB0LmNoYWRldmEgPSAweDA5MWI7CisgdC5jaGFndWphcmF0aSA9IDB4MGE5YjsKKyB0LmNoYWd1cm11a2hpID0gMHgwYTFiOworIHQuY2hib3BvbW9mbyA9IDB4MzExNDsKKyB0LmNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJkOworIHQuY2hlY2ttYXJrID0gMHgyNzEzOworIHQuY2hlY3lyaWxsaWMgPSAweDA0NDc7CisgdC5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZjsKKyB0LmNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI3OworIHQuY2hlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmNTsKKyB0LmNoZWhhcm1lbmlhbiA9IDB4MDU3MzsKKyB0LmNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYzsKKyB0LmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0Yjk7CisgdC5jaGkgPSAweDAzYzc7CisgdC5jaGlldWNoYWNpcmNsZWtvcmVhbiA9IDB4MzI3NzsKKyB0LmNoaWV1Y2hhcGFyZW5rb3JlYW4gPSAweDMyMTc7CisgdC5jaGlldWNoY2lyY2xla29yZWFuID0gMHgzMjY5OworIHQuY2hpZXVjaGtvcmVhbiA9IDB4MzE0YTsKKyB0LmNoaWV1Y2hwYXJlbmtvcmVhbiA9IDB4MzIwOTsKKyB0LmNob2NoYW5ndGhhaSA9IDB4MGUwYTsKKyB0LmNob2NoYW50aGFpID0gMHgwZTA4OworIHQuY2hvY2hpbmd0aGFpID0gMHgwZTA5OworIHQuY2hvY2hvZXRoYWkgPSAweDBlMGM7CisgdC5jaG9vayA9IDB4MDE4ODsKKyB0LmNpZXVjYWNpcmNsZWtvcmVhbiA9IDB4MzI3NjsKKyB0LmNpZXVjYXBhcmVua29yZWFuID0gMHgzMjE2OworIHQuY2lldWNjaXJjbGVrb3JlYW4gPSAweDMyNjg7CisgdC5jaWV1Y2tvcmVhbiA9IDB4MzE0ODsKKyB0LmNpZXVjcGFyZW5rb3JlYW4gPSAweDMyMDg7CisgdC5jaWV1Y3VwYXJlbmtvcmVhbiA9IDB4MzIxYzsKKyB0LmNpcmNsZSA9IDB4MjVjYjsKKyB0LmNpcmNsZWNvcHlydCA9IDB4MDBhOTsKKyB0LmNpcmNsZW11bHRpcGx5ID0gMHgyMjk3OworIHQuY2lyY2xlb3QgPSAweDIyOTk7CisgdC5jaXJjbGVwbHVzID0gMHgyMjk1OworIHQuY2lyY2xlcG9zdGFsbWFyayA9IDB4MzAzNjsKKyB0LmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrID0gMHgyNWQwOworIHQuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrID0gMHgyNWQxOworIHQuY2lyY3VtZmxleCA9IDB4MDJjNjsKKyB0LmNpcmN1bWZsZXhiZWxvd2NtYiA9IDB4MDMyZDsKKyB0LmNpcmN1bWZsZXhjbWIgPSAweDAzMDI7CisgdC5jbGVhciA9IDB4MjMyNzsKKyB0LmNsaWNrYWx2ZW9sYXIgPSAweDAxYzI7CisgdC5jbGlja2RlbnRhbCA9IDB4MDFjMDsKKyB0LmNsaWNrbGF0ZXJhbCA9IDB4MDFjMTsKKyB0LmNsaWNrcmV0cm9mbGV4ID0gMHgwMWMzOworIHQuY2x1YiA9IDB4MjY2MzsKKyB0LmNsdWJzdWl0YmxhY2sgPSAweDI2NjM7CisgdC5jbHVic3VpdHdoaXRlID0gMHgyNjY3OworIHQuY21jdWJlZHNxdWFyZSA9IDB4MzNhNDsKKyB0LmNtb25vc3BhY2UgPSAweGZmNDM7CisgdC5jbXNxdWFyZWRzcXVhcmUgPSAweDMzYTA7CisgdC5jb2FybWVuaWFuID0gMHgwNTgxOworIHQuY29sb24gPSAweDAwM2E7CisgdC5jb2xvbm1vbmV0YXJ5ID0gMHgyMGExOworIHQuY29sb25tb25vc3BhY2UgPSAweGZmMWE7CisgdC5jb2xvbnNpZ24gPSAweDIwYTE7CisgdC5jb2xvbnNtYWxsID0gMHhmZTU1OworIHQuY29sb250cmlhbmd1bGFyaGFsZm1vZCA9IDB4MDJkMTsKKyB0LmNvbG9udHJpYW5ndWxhcm1vZCA9IDB4MDJkMDsKKyB0LmNvbW1hID0gMHgwMDJjOworIHQuY29tbWFhYm92ZWNtYiA9IDB4MDMxMzsKKyB0LmNvbW1hYWJvdmVyaWdodGNtYiA9IDB4MDMxNTsKKyB0LmNvbW1hYWNjZW50ID0gMHhmNmMzOworIHQuY29tbWFhcmFiaWMgPSAweDA2MGM7CisgdC5jb21tYWFybWVuaWFuID0gMHgwNTVkOworIHQuY29tbWFpbmZlcmlvciA9IDB4ZjZlMTsKKyB0LmNvbW1hbW9ub3NwYWNlID0gMHhmZjBjOworIHQuY29tbWFyZXZlcnNlZGFib3ZlY21iID0gMHgwMzE0OworIHQuY29tbWFyZXZlcnNlZG1vZCA9IDB4MDJiZDsKKyB0LmNvbW1hc21hbGwgPSAweGZlNTA7CisgdC5jb21tYXN1cGVyaW9yID0gMHhmNmUyOworIHQuY29tbWF0dXJuZWRhYm92ZWNtYiA9IDB4MDMxMjsKKyB0LmNvbW1hdHVybmVkbW9kID0gMHgwMmJiOworIHQuY29tcGFzcyA9IDB4MjYzYzsKKyB0LmNvbmdydWVudCA9IDB4MjI0NTsKKyB0LmNvbnRvdXJpbnRlZ3JhbCA9IDB4MjIyZTsKKyB0LmNvbnRyb2wgPSAweDIzMDM7CisgdC5jb250cm9sQUNLID0gMHgwMDA2OworIHQuY29udHJvbEJFTCA9IDB4MDAwNzsKKyB0LmNvbnRyb2xCUyA9IDB4MDAwODsKKyB0LmNvbnRyb2xDQU4gPSAweDAwMTg7CisgdC5jb250cm9sQ1IgPSAweDAwMGQ7CisgdC5jb250cm9sREMxID0gMHgwMDExOworIHQuY29udHJvbERDMiA9IDB4MDAxMjsKKyB0LmNvbnRyb2xEQzMgPSAweDAwMTM7CisgdC5jb250cm9sREM0ID0gMHgwMDE0OworIHQuY29udHJvbERFTCA9IDB4MDA3ZjsKKyB0LmNvbnRyb2xETEUgPSAweDAwMTA7CisgdC5jb250cm9sRU0gPSAweDAwMTk7CisgdC5jb250cm9sRU5RID0gMHgwMDA1OworIHQuY29udHJvbEVPVCA9IDB4MDAwNDsKKyB0LmNvbnRyb2xFU0MgPSAweDAwMWI7CisgdC5jb250cm9sRVRCID0gMHgwMDE3OworIHQuY29udHJvbEVUWCA9IDB4MDAwMzsKKyB0LmNvbnRyb2xGRiA9IDB4MDAwYzsKKyB0LmNvbnRyb2xGUyA9IDB4MDAxYzsKKyB0LmNvbnRyb2xHUyA9IDB4MDAxZDsKKyB0LmNvbnRyb2xIVCA9IDB4MDAwOTsKKyB0LmNvbnRyb2xMRiA9IDB4MDAwYTsKKyB0LmNvbnRyb2xOQUsgPSAweDAwMTU7CisgdC5jb250cm9sTlVMTCA9IDB4MDAwMDsKKyB0LmNvbnRyb2xSUyA9IDB4MDAxZTsKKyB0LmNvbnRyb2xTSSA9IDB4MDAwZjsKKyB0LmNvbnRyb2xTTyA9IDB4MDAwZTsKKyB0LmNvbnRyb2xTT1QgPSAweDAwMDI7CisgdC5jb250cm9sU1RYID0gMHgwMDAxOworIHQuY29udHJvbFNVQiA9IDB4MDAxYTsKKyB0LmNvbnRyb2xTWU4gPSAweDAwMTY7CisgdC5jb250cm9sVVMgPSAweDAwMWY7CisgdC5jb250cm9sVlQgPSAweDAwMGI7CisgdC5jb3B5cmlnaHQgPSAweDAwYTk7CisgdC5jb3B5cmlnaHRzYW5zID0gMHhmOGU5OworIHQuY29weXJpZ2h0c2VyaWYgPSAweGY2ZDk7CisgdC5jb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwYzsKKyB0LmNvcm5lcmJyYWNrZXRsZWZ0aGFsZndpZHRoID0gMHhmZjYyOworIHQuY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MTsKKyB0LmNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZDsKKyB0LmNvcm5lcmJyYWNrZXRyaWdodGhhbGZ3aWR0aCA9IDB4ZmY2MzsKKyB0LmNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQyOworIHQuY29ycG9yYXRpb25zcXVhcmUgPSAweDMzN2Y7CisgdC5jb3NxdWFyZSA9IDB4MzNjNzsKKyB0LmNvdmVya2dzcXVhcmUgPSAweDMzYzY7CisgdC5jcGFyZW4gPSAweDI0OWU7CisgdC5jcnV6ZWlybyA9IDB4MjBhMjsKKyB0LmNzdHJldGNoZWQgPSAweDAyOTc7CisgdC5jdXJseWFuZCA9IDB4MjJjZjsKKyB0LmN1cmx5b3IgPSAweDIyY2U7CisgdC5jdXJyZW5jeSA9IDB4MDBhNDsKKyB0LmN5ckJyZXZlID0gMHhmNmQxOworIHQuY3lyRmxleCA9IDB4ZjZkMjsKKyB0LmN5cmJyZXZlID0gMHhmNmQ0OworIHQuY3lyZmxleCA9IDB4ZjZkNTsKKyB0LmQgPSAweDAwNjQ7CisgdC5kYWFybWVuaWFuID0gMHgwNTY0OworIHQuZGFiZW5nYWxpID0gMHgwOWE2OworIHQuZGFkYXJhYmljID0gMHgwNjM2OworIHQuZGFkZXZhID0gMHgwOTI2OworIHQuZGFkZmluYWxhcmFiaWMgPSAweGZlYmU7CisgdC5kYWRpbml0aWFsYXJhYmljID0gMHhmZWJmOworIHQuZGFkbWVkaWFsYXJhYmljID0gMHhmZWMwOworIHQuZGFnZXNoID0gMHgwNWJjOworIHQuZGFnZXNoaGVicmV3ID0gMHgwNWJjOworIHQuZGFnZ2VyID0gMHgyMDIwOworIHQuZGFnZ2VyZGJsID0gMHgyMDIxOworIHQuZGFndWphcmF0aSA9IDB4MGFhNjsKKyB0LmRhZ3VybXVraGkgPSAweDBhMjY7CisgdC5kYWhpcmFnYW5hID0gMHgzMDYwOworIHQuZGFrYXRha2FuYSA9IDB4MzBjMDsKKyB0LmRhbGFyYWJpYyA9IDB4MDYyZjsKKyB0LmRhbGV0ID0gMHgwNWQzOworIHQuZGFsZXRkYWdlc2ggPSAweGZiMzM7CisgdC5kYWxldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMzsKKyB0LmRhbGV0aGVicmV3ID0gMHgwNWQzOworIHQuZGFsZmluYWxhcmFiaWMgPSAweGZlYWE7CisgdC5kYW1tYWFyYWJpYyA9IDB4MDY0ZjsKKyB0LmRhbW1hbG93YXJhYmljID0gMHgwNjRmOworIHQuZGFtbWF0YW5hbHRvbmVhcmFiaWMgPSAweDA2NGM7CisgdC5kYW1tYXRhbmFyYWJpYyA9IDB4MDY0YzsKKyB0LmRhbmRhID0gMHgwOTY0OworIHQuZGFyZ2FoZWJyZXcgPSAweDA1YTc7CisgdC5kYXJnYWxlZnRoZWJyZXcgPSAweDA1YTc7CisgdC5kYXNpYXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODU7CisgdC5kYmxHcmF2ZSA9IDB4ZjZkMzsKKyB0LmRibGFuZ2xlYnJhY2tldGxlZnQgPSAweDMwMGE7CisgdC5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Q7CisgdC5kYmxhbmdsZWJyYWNrZXRyaWdodCA9IDB4MzAwYjsKKyB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2U7CisgdC5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyYjsKKyB0LmRibGFycm93bGVmdCA9IDB4MjFkNDsKKyB0LmRibGFycm93cmlnaHQgPSAweDIxZDI7CisgdC5kYmxkYW5kYSA9IDB4MDk2NTsKKyB0LmRibGdyYXZlID0gMHhmNmQ2OworIHQuZGJsZ3JhdmVjbWIgPSAweDAzMGY7CisgdC5kYmxpbnRlZ3JhbCA9IDB4MjIyYzsKKyB0LmRibGxvd2xpbmUgPSAweDIwMTc7CisgdC5kYmxsb3dsaW5lY21iID0gMHgwMzMzOworIHQuZGJsb3ZlcmxpbmVjbWIgPSAweDAzM2Y7CisgdC5kYmxwcmltZW1vZCA9IDB4MDJiYTsKKyB0LmRibHZlcnRpY2FsYmFyID0gMHgyMDE2OworIHQuZGJsdmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGU7CisgdC5kYm9wb21vZm8gPSAweDMxMDk7CisgdC5kYnNxdWFyZSA9IDB4MzNjODsKKyB0LmRjYXJvbiA9IDB4MDEwZjsKKyB0LmRjZWRpbGxhID0gMHgxZTExOworIHQuZGNpcmNsZSA9IDB4MjRkMzsKKyB0LmRjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTM7CisgdC5kY3JvYXQgPSAweDAxMTE7CisgdC5kZGFiZW5nYWxpID0gMHgwOWExOworIHQuZGRhZGV2YSA9IDB4MDkyMTsKKyB0LmRkYWd1amFyYXRpID0gMHgwYWExOworIHQuZGRhZ3VybXVraGkgPSAweDBhMjE7CisgdC5kZGFsYXJhYmljID0gMHgwNjg4OworIHQuZGRhbGZpbmFsYXJhYmljID0gMHhmYjg5OworIHQuZGRkaGFkZXZhID0gMHgwOTVjOworIHQuZGRoYWJlbmdhbGkgPSAweDA5YTI7CisgdC5kZGhhZGV2YSA9IDB4MDkyMjsKKyB0LmRkaGFndWphcmF0aSA9IDB4MGFhMjsKKyB0LmRkaGFndXJtdWtoaSA9IDB4MGEyMjsKKyB0LmRkb3RhY2NlbnQgPSAweDFlMGI7CisgdC5kZG90YmVsb3cgPSAweDFlMGQ7CisgdC5kZWNpbWFsc2VwYXJhdG9yYXJhYmljID0gMHgwNjZiOworIHQuZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmI7CisgdC5kZWN5cmlsbGljID0gMHgwNDM0OworIHQuZGVncmVlID0gMHgwMGIwOworIHQuZGVoaWhlYnJldyA9IDB4MDVhZDsKKyB0LmRlaGlyYWdhbmEgPSAweDMwNjc7CisgdC5kZWljb3B0aWMgPSAweDAzZWY7CisgdC5kZWthdGFrYW5hID0gMHgzMGM3OworIHQuZGVsZXRlbGVmdCA9IDB4MjMyYjsKKyB0LmRlbGV0ZXJpZ2h0ID0gMHgyMzI2OworIHQuZGVsdGEgPSAweDAzYjQ7CisgdC5kZWx0YXR1cm5lZCA9IDB4MDE4ZDsKKyB0LmRlbm9taW5hdG9ybWludXNvbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY4OworIHQuZGV6aCA9IDB4MDJhNDsKKyB0LmRoYWJlbmdhbGkgPSAweDA5YTc7CisgdC5kaGFkZXZhID0gMHgwOTI3OworIHQuZGhhZ3VqYXJhdGkgPSAweDBhYTc7CisgdC5kaGFndXJtdWtoaSA9IDB4MGEyNzsKKyB0LmRob29rID0gMHgwMjU3OworIHQuZGlhbHl0aWthdG9ub3MgPSAweDAzODU7CisgdC5kaWFseXRpa2F0b25vc2NtYiA9IDB4MDM0NDsKKyB0LmRpYW1vbmQgPSAweDI2NjY7CisgdC5kaWFtb25kc3VpdHdoaXRlID0gMHgyNjYyOworIHQuZGllcmVzaXMgPSAweDAwYTg7CisgdC5kaWVyZXNpc2FjdXRlID0gMHhmNmQ3OworIHQuZGllcmVzaXNiZWxvd2NtYiA9IDB4MDMyNDsKKyB0LmRpZXJlc2lzY21iID0gMHgwMzA4OworIHQuZGllcmVzaXNncmF2ZSA9IDB4ZjZkODsKKyB0LmRpZXJlc2lzdG9ub3MgPSAweDAzODU7CisgdC5kaWhpcmFnYW5hID0gMHgzMDYyOworIHQuZGlrYXRha2FuYSA9IDB4MzBjMjsKKyB0LmRpdHRvbWFyayA9IDB4MzAwMzsKKyB0LmRpdmlkZSA9IDB4MDBmNzsKKyB0LmRpdmlkZXMgPSAweDIyMjM7CisgdC5kaXZpc2lvbnNsYXNoID0gMHgyMjE1OworIHQuZGplY3lyaWxsaWMgPSAweDA0NTI7CisgdC5ka3NoYWRlID0gMHgyNTkzOworIHQuZGxpbmViZWxvdyA9IDB4MWUwZjsKKyB0LmRsc3F1YXJlID0gMHgzMzk3OworIHQuZG1hY3JvbiA9IDB4MDExMTsKKyB0LmRtb25vc3BhY2UgPSAweGZmNDQ7CisgdC5kbmJsb2NrID0gMHgyNTg0OworIHQuZG9jaGFkYXRoYWkgPSAweDBlMGU7CisgdC5kb2Rla3RoYWkgPSAweDBlMTQ7CisgdC5kb2hpcmFnYW5hID0gMHgzMDY5OworIHQuZG9rYXRha2FuYSA9IDB4MzBjOTsKKyB0LmRvbGxhciA9IDB4MDAyNDsKKyB0LmRvbGxhcmluZmVyaW9yID0gMHhmNmUzOworIHQuZG9sbGFybW9ub3NwYWNlID0gMHhmZjA0OworIHQuZG9sbGFyb2xkc3R5bGUgPSAweGY3MjQ7CisgdC5kb2xsYXJzbWFsbCA9IDB4ZmU2OTsKKyB0LmRvbGxhcnN1cGVyaW9yID0gMHhmNmU0OworIHQuZG9uZyA9IDB4MjBhYjsKKyB0LmRvcnVzcXVhcmUgPSAweDMzMjY7CisgdC5kb3RhY2NlbnQgPSAweDAyZDk7CisgdC5kb3RhY2NlbnRjbWIgPSAweDAzMDc7CisgdC5kb3RiZWxvd2NtYiA9IDB4MDMyMzsKKyB0LmRvdGJlbG93Y29tYiA9IDB4MDMyMzsKKyB0LmRvdGthdGFrYW5hID0gMHgzMGZiOworIHQuZG90bGVzc2kgPSAweDAxMzE7CisgdC5kb3RsZXNzaiA9IDB4ZjZiZTsKKyB0LmRvdGxlc3Nqc3Ryb2tlaG9vayA9IDB4MDI4NDsKKyB0LmRvdG1hdGggPSAweDIyYzU7CisgdC5kb3R0ZWRjaXJjbGUgPSAweDI1Y2M7CisgdC5kb3VibGV5b2RwYXRhaCA9IDB4ZmIxZjsKKyB0LmRvdWJsZXlvZHBhdGFoaGVicmV3ID0gMHhmYjFmOworIHQuZG93bnRhY2tiZWxvd2NtYiA9IDB4MDMxZTsKKyB0LmRvd250YWNrbW9kID0gMHgwMmQ1OworIHQuZHBhcmVuID0gMHgyNDlmOworIHQuZHN1cGVyaW9yID0gMHhmNmViOworIHQuZHRhaWwgPSAweDAyNTY7CisgdC5kdG9wYmFyID0gMHgwMThjOworIHQuZHVoaXJhZ2FuYSA9IDB4MzA2NTsKKyB0LmR1a2F0YWthbmEgPSAweDMwYzU7CisgdC5keiA9IDB4MDFmMzsKKyB0LmR6YWx0b25lID0gMHgwMmEzOworIHQuZHpjYXJvbiA9IDB4MDFjNjsKKyB0LmR6Y3VybCA9IDB4MDJhNTsKKyB0LmR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUxOworIHQuZHplY3lyaWxsaWMgPSAweDA0NTU7CisgdC5kemhlY3lyaWxsaWMgPSAweDA0NWY7CisgdC5lID0gMHgwMDY1OworIHQuZWFjdXRlID0gMHgwMGU5OworIHQuZWFydGggPSAweDI2NDE7CisgdC5lYmVuZ2FsaSA9IDB4MDk4ZjsKKyB0LmVib3BvbW9mbyA9IDB4MzExYzsKKyB0LmVicmV2ZSA9IDB4MDExNTsKKyB0LmVjYW5kcmFkZXZhID0gMHgwOTBkOworIHQuZWNhbmRyYWd1amFyYXRpID0gMHgwYThkOworIHQuZWNhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDU7CisgdC5lY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzU7CisgdC5lY2Fyb24gPSAweDAxMWI7CisgdC5lY2VkaWxsYWJyZXZlID0gMHgxZTFkOworIHQuZWNoYXJtZW5pYW4gPSAweDA1NjU7CisgdC5lY2h5aXduYXJtZW5pYW4gPSAweDA1ODc7CisgdC5lY2lyY2xlID0gMHgyNGQ0OworIHQuZWNpcmN1bWZsZXggPSAweDAwZWE7CisgdC5lY2lyY3VtZmxleGFjdXRlID0gMHgxZWJmOworIHQuZWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxOTsKKyB0LmVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzc7CisgdC5lY2lyY3VtZmxleGdyYXZlID0gMHgxZWMxOworIHQuZWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzM7CisgdC5lY2lyY3VtZmxleHRpbGRlID0gMHgxZWM1OworIHQuZWN5cmlsbGljID0gMHgwNDU0OworIHQuZWRibGdyYXZlID0gMHgwMjA1OworIHQuZWRldmEgPSAweDA5MGY7CisgdC5lZGllcmVzaXMgPSAweDAwZWI7CisgdC5lZG90ID0gMHgwMTE3OworIHQuZWRvdGFjY2VudCA9IDB4MDExNzsKKyB0LmVkb3RiZWxvdyA9IDB4MWViOTsKKyB0LmVlZ3VybXVraGkgPSAweDBhMGY7CisgdC5lZW1hdHJhZ3VybXVraGkgPSAweDBhNDc7CisgdC5lZmN5cmlsbGljID0gMHgwNDQ0OworIHQuZWdyYXZlID0gMHgwMGU4OworIHQuZWd1amFyYXRpID0gMHgwYThmOworIHQuZWhhcm1lbmlhbiA9IDB4MDU2NzsKKyB0LmVoYm9wb21vZm8gPSAweDMxMWQ7CisgdC5laGlyYWdhbmEgPSAweDMwNDg7CisgdC5laG9va2Fib3ZlID0gMHgxZWJiOworIHQuZWlib3BvbW9mbyA9IDB4MzExZjsKKyB0LmVpZ2h0ID0gMHgwMDM4OworIHQuZWlnaHRhcmFiaWMgPSAweDA2Njg7CisgdC5laWdodGJlbmdhbGkgPSAweDA5ZWU7CisgdC5laWdodGNpcmNsZSA9IDB4MjQ2NzsKKyB0LmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MTsKKyB0LmVpZ2h0ZGV2YSA9IDB4MDk2ZTsKKyB0LmVpZ2h0ZWVuY2lyY2xlID0gMHgyNDcxOworIHQuZWlnaHRlZW5wYXJlbiA9IDB4MjQ4NTsKKyB0LmVpZ2h0ZWVucGVyaW9kID0gMHgyNDk5OworIHQuZWlnaHRndWphcmF0aSA9IDB4MGFlZTsKKyB0LmVpZ2h0Z3VybXVraGkgPSAweDBhNmU7CisgdC5laWdodGhhY2thcmFiaWMgPSAweDA2Njg7CisgdC5laWdodGhhbmd6aG91ID0gMHgzMDI4OworIHQuZWlnaHRobm90ZWJlYW1lZCA9IDB4MjY2YjsKKyB0LmVpZ2h0aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNzsKKyB0LmVpZ2h0aW5mZXJpb3IgPSAweDIwODg7CisgdC5laWdodG1vbm9zcGFjZSA9IDB4ZmYxODsKKyB0LmVpZ2h0b2xkc3R5bGUgPSAweGY3Mzg7CisgdC5laWdodHBhcmVuID0gMHgyNDdiOworIHQuZWlnaHRwZXJpb2QgPSAweDI0OGY7CisgdC5laWdodHBlcnNpYW4gPSAweDA2Zjg7CisgdC5laWdodHJvbWFuID0gMHgyMTc3OworIHQuZWlnaHRzdXBlcmlvciA9IDB4MjA3ODsKKyB0LmVpZ2h0dGhhaSA9IDB4MGU1ODsKKyB0LmVpbnZlcnRlZGJyZXZlID0gMHgwMjA3OworIHQuZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjU7CisgdC5la2F0YWthbmEgPSAweDMwYTg7CisgdC5la2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzQ7CisgdC5la29ua2FyZ3VybXVraGkgPSAweDBhNzQ7CisgdC5la29yZWFuID0gMHgzMTU0OworIHQuZWxjeXJpbGxpYyA9IDB4MDQzYjsKKyB0LmVsZW1lbnQgPSAweDIyMDg7CisgdC5lbGV2ZW5jaXJjbGUgPSAweDI0NmE7CisgdC5lbGV2ZW5wYXJlbiA9IDB4MjQ3ZTsKKyB0LmVsZXZlbnBlcmlvZCA9IDB4MjQ5MjsKKyB0LmVsZXZlbnJvbWFuID0gMHgyMTdhOworIHQuZWxsaXBzaXMgPSAweDIwMjY7CisgdC5lbGxpcHNpc3ZlcnRpY2FsID0gMHgyMmVlOworIHQuZW1hY3JvbiA9IDB4MDExMzsKKyB0LmVtYWNyb25hY3V0ZSA9IDB4MWUxNzsKKyB0LmVtYWNyb25ncmF2ZSA9IDB4MWUxNTsKKyB0LmVtY3lyaWxsaWMgPSAweDA0M2M7CisgdC5lbWRhc2ggPSAweDIwMTQ7CisgdC5lbWRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMTsKKyB0LmVtb25vc3BhY2UgPSAweGZmNDU7CisgdC5lbXBoYXNpc21hcmthcm1lbmlhbiA9IDB4MDU1YjsKKyB0LmVtcHR5c2V0ID0gMHgyMjA1OworIHQuZW5ib3BvbW9mbyA9IDB4MzEyMzsKKyB0LmVuY3lyaWxsaWMgPSAweDA0M2Q7CisgdC5lbmRhc2ggPSAweDIwMTM7CisgdC5lbmRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMjsKKyB0LmVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTM7CisgdC5lbmcgPSAweDAxNGI7CisgdC5lbmdib3BvbW9mbyA9IDB4MzEyNTsKKyB0LmVuZ2hlY3lyaWxsaWMgPSAweDA0YTU7CisgdC5lbmhvb2tjeXJpbGxpYyA9IDB4MDRjODsKKyB0LmVuc3BhY2UgPSAweDIwMDI7CisgdC5lb2dvbmVrID0gMHgwMTE5OworIHQuZW9rb3JlYW4gPSAweDMxNTM7CisgdC5lb3BlbiA9IDB4MDI1YjsKKyB0LmVvcGVuY2xvc2VkID0gMHgwMjlhOworIHQuZW9wZW5yZXZlcnNlZCA9IDB4MDI1YzsKKyB0LmVvcGVucmV2ZXJzZWRjbG9zZWQgPSAweDAyNWU7CisgdC5lb3BlbnJldmVyc2VkaG9vayA9IDB4MDI1ZDsKKyB0LmVwYXJlbiA9IDB4MjRhMDsKKyB0LmVwc2lsb24gPSAweDAzYjU7CisgdC5lcHNpbG9udG9ub3MgPSAweDAzYWQ7CisgdC5lcXVhbCA9IDB4MDAzZDsKKyB0LmVxdWFsbW9ub3NwYWNlID0gMHhmZjFkOworIHQuZXF1YWxzbWFsbCA9IDB4ZmU2NjsKKyB0LmVxdWFsc3VwZXJpb3IgPSAweDIwN2M7CisgdC5lcXVpdmFsZW5jZSA9IDB4MjI2MTsKKyB0LmVyYm9wb21vZm8gPSAweDMxMjY7CisgdC5lcmN5cmlsbGljID0gMHgwNDQwOworIHQuZXJldmVyc2VkID0gMHgwMjU4OworIHQuZXJldmVyc2VkY3lyaWxsaWMgPSAweDA0NGQ7CisgdC5lc2N5cmlsbGljID0gMHgwNDQxOworIHQuZXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYjsKKyB0LmVzaCA9IDB4MDI4MzsKKyB0LmVzaGN1cmwgPSAweDAyODY7CisgdC5lc2hvcnRkZXZhID0gMHgwOTBlOworIHQuZXNob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0NjsKKyB0LmVzaHJldmVyc2VkbG9vcCA9IDB4MDFhYTsKKyB0LmVzaHNxdWF0cmV2ZXJzZWQgPSAweDAyODU7CisgdC5lc21hbGxoaXJhZ2FuYSA9IDB4MzA0NzsKKyB0LmVzbWFsbGthdGFrYW5hID0gMHgzMGE3OworIHQuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmE7CisgdC5lc3RpbWF0ZWQgPSAweDIxMmU7CisgdC5lc3VwZXJpb3IgPSAweGY2ZWM7CisgdC5ldGEgPSAweDAzYjc7CisgdC5ldGFybWVuaWFuID0gMHgwNTY4OworIHQuZXRhdG9ub3MgPSAweDAzYWU7CisgdC5ldGggPSAweDAwZjA7CisgdC5ldGlsZGUgPSAweDFlYmQ7CisgdC5ldGlsZGViZWxvdyA9IDB4MWUxYjsKKyB0LmV0bmFodGFmb3VraGhlYnJldyA9IDB4MDU5MTsKKyB0LmV0bmFodGFmb3VraGxlZnRoZWJyZXcgPSAweDA1OTE7CisgdC5ldG5haHRhaGVicmV3ID0gMHgwNTkxOworIHQuZXRuYWh0YWxlZnRoZWJyZXcgPSAweDA1OTE7CisgdC5ldHVybmVkID0gMHgwMWRkOworIHQuZXVrb3JlYW4gPSAweDMxNjE7CisgdC5ldXJvID0gMHgyMGFjOworIHQuZXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzc7CisgdC5ldm93ZWxzaWduZGV2YSA9IDB4MDk0NzsKKyB0LmV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNzsKKyB0LmV4Y2xhbSA9IDB4MDAyMTsKKyB0LmV4Y2xhbWFybWVuaWFuID0gMHgwNTVjOworIHQuZXhjbGFtZGJsID0gMHgyMDNjOworIHQuZXhjbGFtZG93biA9IDB4MDBhMTsKKyB0LmV4Y2xhbWRvd25zbWFsbCA9IDB4ZjdhMTsKKyB0LmV4Y2xhbW1vbm9zcGFjZSA9IDB4ZmYwMTsKKyB0LmV4Y2xhbXNtYWxsID0gMHhmNzIxOworIHQuZXhpc3RlbnRpYWwgPSAweDIyMDM7CisgdC5lemggPSAweDAyOTI7CisgdC5lemhjYXJvbiA9IDB4MDFlZjsKKyB0LmV6aGN1cmwgPSAweDAyOTM7CisgdC5lemhyZXZlcnNlZCA9IDB4MDFiOTsKKyB0LmV6aHRhaWwgPSAweDAxYmE7CisgdC5mID0gMHgwMDY2OworIHQuZmFkZXZhID0gMHgwOTVlOworIHQuZmFndXJtdWtoaSA9IDB4MGE1ZTsKKyB0LmZhaHJlbmhlaXQgPSAweDIxMDk7CisgdC5mYXRoYWFyYWJpYyA9IDB4MDY0ZTsKKyB0LmZhdGhhbG93YXJhYmljID0gMHgwNjRlOworIHQuZmF0aGF0YW5hcmFiaWMgPSAweDA2NGI7CisgdC5mYm9wb21vZm8gPSAweDMxMDg7CisgdC5mY2lyY2xlID0gMHgyNGQ1OworIHQuZmRvdGFjY2VudCA9IDB4MWUxZjsKKyB0LmZlaGFyYWJpYyA9IDB4MDY0MTsKKyB0LmZlaGFybWVuaWFuID0gMHgwNTg2OworIHQuZmVoZmluYWxhcmFiaWMgPSAweGZlZDI7CisgdC5mZWhpbml0aWFsYXJhYmljID0gMHhmZWQzOworIHQuZmVobWVkaWFsYXJhYmljID0gMHhmZWQ0OworIHQuZmVpY29wdGljID0gMHgwM2U1OworIHQuZmVtYWxlID0gMHgyNjQwOworIHQuZmYgPSAweGZiMDA7CisgdC5mX2YgPSAweGZiMDA7CisgdC5mZmkgPSAweGZiMDM7CisgdC5mZmwgPSAweGZiMDQ7CisgdC5maSA9IDB4ZmIwMTsKKyB0LmZpZnRlZW5jaXJjbGUgPSAweDI0NmU7CisgdC5maWZ0ZWVucGFyZW4gPSAweDI0ODI7CisgdC5maWZ0ZWVucGVyaW9kID0gMHgyNDk2OworIHQuZmlndXJlZGFzaCA9IDB4MjAxMjsKKyB0LmZpbGxlZGJveCA9IDB4MjVhMDsKKyB0LmZpbGxlZHJlY3QgPSAweDI1YWM7CisgdC5maW5hbGthZiA9IDB4MDVkYTsKKyB0LmZpbmFsa2FmZGFnZXNoID0gMHhmYjNhOworIHQuZmluYWxrYWZkYWdlc2hoZWJyZXcgPSAweGZiM2E7CisgdC5maW5hbGthZmhlYnJldyA9IDB4MDVkYTsKKyB0LmZpbmFsbWVtID0gMHgwNWRkOworIHQuZmluYWxtZW1oZWJyZXcgPSAweDA1ZGQ7CisgdC5maW5hbG51biA9IDB4MDVkZjsKKyB0LmZpbmFsbnVuaGVicmV3ID0gMHgwNWRmOworIHQuZmluYWxwZSA9IDB4MDVlMzsKKyB0LmZpbmFscGVoZWJyZXcgPSAweDA1ZTM7CisgdC5maW5hbHRzYWRpID0gMHgwNWU1OworIHQuZmluYWx0c2FkaWhlYnJldyA9IDB4MDVlNTsKKyB0LmZpcnN0dG9uZWNoaW5lc2UgPSAweDAyYzk7CisgdC5maXNoZXllID0gMHgyNWM5OworIHQuZml0YWN5cmlsbGljID0gMHgwNDczOworIHQuZml2ZSA9IDB4MDAzNTsKKyB0LmZpdmVhcmFiaWMgPSAweDA2NjU7CisgdC5maXZlYmVuZ2FsaSA9IDB4MDllYjsKKyB0LmZpdmVjaXJjbGUgPSAweDI0NjQ7CisgdC5maXZlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZTsKKyB0LmZpdmVkZXZhID0gMHgwOTZiOworIHQuZml2ZWVpZ2h0aHMgPSAweDIxNWQ7CisgdC5maXZlZ3VqYXJhdGkgPSAweDBhZWI7CisgdC5maXZlZ3VybXVraGkgPSAweDBhNmI7CisgdC5maXZlaGFja2FyYWJpYyA9IDB4MDY2NTsKKyB0LmZpdmVoYW5nemhvdSA9IDB4MzAyNTsKKyB0LmZpdmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI0OworIHQuZml2ZWluZmVyaW9yID0gMHgyMDg1OworIHQuZml2ZW1vbm9zcGFjZSA9IDB4ZmYxNTsKKyB0LmZpdmVvbGRzdHlsZSA9IDB4ZjczNTsKKyB0LmZpdmVwYXJlbiA9IDB4MjQ3ODsKKyB0LmZpdmVwZXJpb2QgPSAweDI0OGM7CisgdC5maXZlcGVyc2lhbiA9IDB4MDZmNTsKKyB0LmZpdmVyb21hbiA9IDB4MjE3NDsKKyB0LmZpdmVzdXBlcmlvciA9IDB4MjA3NTsKKyB0LmZpdmV0aGFpID0gMHgwZTU1OworIHQuZmwgPSAweGZiMDI7CisgdC5mbG9yaW4gPSAweDAxOTI7CisgdC5mbW9ub3NwYWNlID0gMHhmZjQ2OworIHQuZm1zcXVhcmUgPSAweDMzOTk7CisgdC5mb2ZhbnRoYWkgPSAweDBlMWY7CisgdC5mb2ZhdGhhaSA9IDB4MGUxZDsKKyB0LmZvbmdtYW50aGFpID0gMHgwZTRmOworIHQuZm9yYWxsID0gMHgyMjAwOworIHQuZm91ciA9IDB4MDAzNDsKKyB0LmZvdXJhcmFiaWMgPSAweDA2NjQ7CisgdC5mb3VyYmVuZ2FsaSA9IDB4MDllYTsKKyB0LmZvdXJjaXJjbGUgPSAweDI0NjM7CisgdC5mb3VyY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZDsKKyB0LmZvdXJkZXZhID0gMHgwOTZhOworIHQuZm91cmd1amFyYXRpID0gMHgwYWVhOworIHQuZm91cmd1cm11a2hpID0gMHgwYTZhOworIHQuZm91cmhhY2thcmFiaWMgPSAweDA2NjQ7CisgdC5mb3VyaGFuZ3pob3UgPSAweDMwMjQ7CisgdC5mb3VyaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMzsKKyB0LmZvdXJpbmZlcmlvciA9IDB4MjA4NDsKKyB0LmZvdXJtb25vc3BhY2UgPSAweGZmMTQ7CisgdC5mb3VybnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNzsKKyB0LmZvdXJvbGRzdHlsZSA9IDB4ZjczNDsKKyB0LmZvdXJwYXJlbiA9IDB4MjQ3NzsKKyB0LmZvdXJwZXJpb2QgPSAweDI0OGI7CisgdC5mb3VycGVyc2lhbiA9IDB4MDZmNDsKKyB0LmZvdXJyb21hbiA9IDB4MjE3MzsKKyB0LmZvdXJzdXBlcmlvciA9IDB4MjA3NDsKKyB0LmZvdXJ0ZWVuY2lyY2xlID0gMHgyNDZkOworIHQuZm91cnRlZW5wYXJlbiA9IDB4MjQ4MTsKKyB0LmZvdXJ0ZWVucGVyaW9kID0gMHgyNDk1OworIHQuZm91cnRoYWkgPSAweDBlNTQ7CisgdC5mb3VydGh0b25lY2hpbmVzZSA9IDB4MDJjYjsKKyB0LmZwYXJlbiA9IDB4MjRhMTsKKyB0LmZyYWN0aW9uID0gMHgyMDQ0OworIHQuZnJhbmMgPSAweDIwYTM7CisgdC5nID0gMHgwMDY3OworIHQuZ2FiZW5nYWxpID0gMHgwOTk3OworIHQuZ2FjdXRlID0gMHgwMWY1OworIHQuZ2FkZXZhID0gMHgwOTE3OworIHQuZ2FmYXJhYmljID0gMHgwNmFmOworIHQuZ2FmZmluYWxhcmFiaWMgPSAweGZiOTM7CisgdC5nYWZpbml0aWFsYXJhYmljID0gMHhmYjk0OworIHQuZ2FmbWVkaWFsYXJhYmljID0gMHhmYjk1OworIHQuZ2FndWphcmF0aSA9IDB4MGE5NzsKKyB0LmdhZ3VybXVraGkgPSAweDBhMTc7CisgdC5nYWhpcmFnYW5hID0gMHgzMDRjOworIHQuZ2FrYXRha2FuYSA9IDB4MzBhYzsKKyB0LmdhbW1hID0gMHgwM2IzOworIHQuZ2FtbWFsYXRpbnNtYWxsID0gMHgwMjYzOworIHQuZ2FtbWFzdXBlcmlvciA9IDB4MDJlMDsKKyB0LmdhbmdpYWNvcHRpYyA9IDB4MDNlYjsKKyB0Lmdib3BvbW9mbyA9IDB4MzEwZDsKKyB0LmdicmV2ZSA9IDB4MDExZjsKKyB0LmdjYXJvbiA9IDB4MDFlNzsKKyB0LmdjZWRpbGxhID0gMHgwMTIzOworIHQuZ2NpcmNsZSA9IDB4MjRkNjsKKyB0LmdjaXJjdW1mbGV4ID0gMHgwMTFkOworIHQuZ2NvbW1hYWNjZW50ID0gMHgwMTIzOworIHQuZ2RvdCA9IDB4MDEyMTsKKyB0Lmdkb3RhY2NlbnQgPSAweDAxMjE7CisgdC5nZWN5cmlsbGljID0gMHgwNDMzOworIHQuZ2VoaXJhZ2FuYSA9IDB4MzA1MjsKKyB0Lmdla2F0YWthbmEgPSAweDMwYjI7CisgdC5nZW9tZXRyaWNhbGx5ZXF1YWwgPSAweDIyNTE7CisgdC5nZXJlc2hhY2NlbnRoZWJyZXcgPSAweDA1OWM7CisgdC5nZXJlc2hoZWJyZXcgPSAweDA1ZjM7CisgdC5nZXJlc2htdXFkYW1oZWJyZXcgPSAweDA1OWQ7CisgdC5nZXJtYW5kYmxzID0gMHgwMGRmOworIHQuZ2Vyc2hheWltYWNjZW50aGVicmV3ID0gMHgwNTllOworIHQuZ2Vyc2hheWltaGVicmV3ID0gMHgwNWY0OworIHQuZ2V0YW1hcmsgPSAweDMwMTM7CisgdC5naGFiZW5nYWxpID0gMHgwOTk4OworIHQuZ2hhZGFybWVuaWFuID0gMHgwNTcyOworIHQuZ2hhZGV2YSA9IDB4MDkxODsKKyB0LmdoYWd1amFyYXRpID0gMHgwYTk4OworIHQuZ2hhZ3VybXVraGkgPSAweDBhMTg7CisgdC5naGFpbmFyYWJpYyA9IDB4MDYzYTsKKyB0LmdoYWluZmluYWxhcmFiaWMgPSAweGZlY2U7CisgdC5naGFpbmluaXRpYWxhcmFiaWMgPSAweGZlY2Y7CisgdC5naGFpbm1lZGlhbGFyYWJpYyA9IDB4ZmVkMDsKKyB0LmdoZW1pZGRsZWhvb2tjeXJpbGxpYyA9IDB4MDQ5NTsKKyB0LmdoZXN0cm9rZWN5cmlsbGljID0gMHgwNDkzOworIHQuZ2hldXB0dXJuY3lyaWxsaWMgPSAweDA0OTE7CisgdC5naGhhZGV2YSA9IDB4MDk1YTsKKyB0LmdoaGFndXJtdWtoaSA9IDB4MGE1YTsKKyB0Lmdob29rID0gMHgwMjYwOworIHQuZ2h6c3F1YXJlID0gMHgzMzkzOworIHQuZ2loaXJhZ2FuYSA9IDB4MzA0ZTsKKyB0Lmdpa2F0YWthbmEgPSAweDMwYWU7CisgdC5naW1hcm1lbmlhbiA9IDB4MDU2MzsKKyB0LmdpbWVsID0gMHgwNWQyOworIHQuZ2ltZWxkYWdlc2ggPSAweGZiMzI7CisgdC5naW1lbGRhZ2VzaGhlYnJldyA9IDB4ZmIzMjsKKyB0LmdpbWVsaGVicmV3ID0gMHgwNWQyOworIHQuZ2plY3lyaWxsaWMgPSAweDA0NTM7CisgdC5nbG90dGFsaW52ZXJ0ZWRzdHJva2UgPSAweDAxYmU7CisgdC5nbG90dGFsc3RvcCA9IDB4MDI5NDsKKyB0Lmdsb3R0YWxzdG9waW52ZXJ0ZWQgPSAweDAyOTY7CisgdC5nbG90dGFsc3RvcG1vZCA9IDB4MDJjMDsKKyB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWQgPSAweDAyOTU7CisgdC5nbG90dGFsc3RvcHJldmVyc2VkbW9kID0gMHgwMmMxOworIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZHN1cGVyaW9yID0gMHgwMmU0OworIHQuZ2xvdHRhbHN0b3BzdHJva2UgPSAweDAyYTE7CisgdC5nbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkID0gMHgwMmEyOworIHQuZ21hY3JvbiA9IDB4MWUyMTsKKyB0Lmdtb25vc3BhY2UgPSAweGZmNDc7CisgdC5nb2hpcmFnYW5hID0gMHgzMDU0OworIHQuZ29rYXRha2FuYSA9IDB4MzBiNDsKKyB0LmdwYXJlbiA9IDB4MjRhMjsKKyB0LmdwYXNxdWFyZSA9IDB4MzNhYzsKKyB0LmdyYWRpZW50ID0gMHgyMjA3OworIHQuZ3JhdmUgPSAweDAwNjA7CisgdC5ncmF2ZWJlbG93Y21iID0gMHgwMzE2OworIHQuZ3JhdmVjbWIgPSAweDAzMDA7CisgdC5ncmF2ZWNvbWIgPSAweDAzMDA7CisgdC5ncmF2ZWRldmEgPSAweDA5NTM7CisgdC5ncmF2ZWxvd21vZCA9IDB4MDJjZTsKKyB0LmdyYXZlbW9ub3NwYWNlID0gMHhmZjQwOworIHQuZ3JhdmV0b25lY21iID0gMHgwMzQwOworIHQuZ3JlYXRlciA9IDB4MDAzZTsKKyB0LmdyZWF0ZXJlcXVhbCA9IDB4MjI2NTsKKyB0LmdyZWF0ZXJlcXVhbG9ybGVzcyA9IDB4MjJkYjsKKyB0LmdyZWF0ZXJtb25vc3BhY2UgPSAweGZmMWU7CisgdC5ncmVhdGVyb3JlcXVpdmFsZW50ID0gMHgyMjczOworIHQuZ3JlYXRlcm9ybGVzcyA9IDB4MjI3NzsKKyB0LmdyZWF0ZXJvdmVyZXF1YWwgPSAweDIyNjc7CisgdC5ncmVhdGVyc21hbGwgPSAweGZlNjU7CisgdC5nc2NyaXB0ID0gMHgwMjYxOworIHQuZ3N0cm9rZSA9IDB4MDFlNTsKKyB0Lmd1aGlyYWdhbmEgPSAweDMwNTA7CisgdC5ndWlsbGVtb3RsZWZ0ID0gMHgwMGFiOworIHQuZ3VpbGxlbW90cmlnaHQgPSAweDAwYmI7CisgdC5ndWlsc2luZ2xsZWZ0ID0gMHgyMDM5OworIHQuZ3VpbHNpbmdscmlnaHQgPSAweDIwM2E7CisgdC5ndWthdGFrYW5hID0gMHgzMGIwOworIHQuZ3VyYW11c3F1YXJlID0gMHgzMzE4OworIHQuZ3lzcXVhcmUgPSAweDMzYzk7CisgdC5oID0gMHgwMDY4OworIHQuaGFhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRhOTsKKyB0LmhhYWx0b25lYXJhYmljID0gMHgwNmMxOworIHQuaGFiZW5nYWxpID0gMHgwOWI5OworIHQuaGFkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiMzsKKyB0LmhhZGV2YSA9IDB4MDkzOTsKKyB0LmhhZ3VqYXJhdGkgPSAweDBhYjk7CisgdC5oYWd1cm11a2hpID0gMHgwYTM5OworIHQuaGFoYXJhYmljID0gMHgwNjJkOworIHQuaGFoZmluYWxhcmFiaWMgPSAweGZlYTI7CisgdC5oYWhpbml0aWFsYXJhYmljID0gMHhmZWEzOworIHQuaGFoaXJhZ2FuYSA9IDB4MzA2ZjsKKyB0LmhhaG1lZGlhbGFyYWJpYyA9IDB4ZmVhNDsKKyB0LmhhaXR1c3F1YXJlID0gMHgzMzJhOworIHQuaGFrYXRha2FuYSA9IDB4MzBjZjsKKyB0Lmhha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGE7CisgdC5oYWxhbnRndXJtdWtoaSA9IDB4MGE0ZDsKKyB0LmhhbXphYXJhYmljID0gMHgwNjIxOworIHQuaGFtemFsb3dhcmFiaWMgPSAweDA2MjE7CisgdC5oYW5ndWxmaWxsZXIgPSAweDMxNjQ7CisgdC5oYXJkc2lnbmN5cmlsbGljID0gMHgwNDRhOworIHQuaGFycG9vbmxlZnRiYXJidXAgPSAweDIxYmM7CisgdC5oYXJwb29ucmlnaHRiYXJidXAgPSAweDIxYzA7CisgdC5oYXNxdWFyZSA9IDB4MzNjYTsKKyB0LmhhdGFmcGF0YWggPSAweDA1YjI7CisgdC5oYXRhZnBhdGFoMTYgPSAweDA1YjI7CisgdC5oYXRhZnBhdGFoMjMgPSAweDA1YjI7CisgdC5oYXRhZnBhdGFoMmYgPSAweDA1YjI7CisgdC5oYXRhZnBhdGFoaGVicmV3ID0gMHgwNWIyOworIHQuaGF0YWZwYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViMjsKKyB0LmhhdGFmcGF0YWhxdWFydGVyaGVicmV3ID0gMHgwNWIyOworIHQuaGF0YWZwYXRhaHdpZGVoZWJyZXcgPSAweDA1YjI7CisgdC5oYXRhZnFhbWF0cyA9IDB4MDViMzsKKyB0LmhhdGFmcWFtYXRzMWIgPSAweDA1YjM7CisgdC5oYXRhZnFhbWF0czI4ID0gMHgwNWIzOworIHQuaGF0YWZxYW1hdHMzNCA9IDB4MDViMzsKKyB0LmhhdGFmcWFtYXRzaGVicmV3ID0gMHgwNWIzOworIHQuaGF0YWZxYW1hdHNuYXJyb3doZWJyZXcgPSAweDA1YjM7CisgdC5oYXRhZnFhbWF0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1YjM7CisgdC5oYXRhZnFhbWF0c3dpZGVoZWJyZXcgPSAweDA1YjM7CisgdC5oYXRhZnNlZ29sID0gMHgwNWIxOworIHQuaGF0YWZzZWdvbDE3ID0gMHgwNWIxOworIHQuaGF0YWZzZWdvbDI0ID0gMHgwNWIxOworIHQuaGF0YWZzZWdvbDMwID0gMHgwNWIxOworIHQuaGF0YWZzZWdvbGhlYnJldyA9IDB4MDViMTsKKyB0LmhhdGFmc2Vnb2xuYXJyb3doZWJyZXcgPSAweDA1YjE7CisgdC5oYXRhZnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViMTsKKyB0LmhhdGFmc2Vnb2x3aWRlaGVicmV3ID0gMHgwNWIxOworIHQuaGJhciA9IDB4MDEyNzsKKyB0Lmhib3BvbW9mbyA9IDB4MzEwZjsKKyB0LmhicmV2ZWJlbG93ID0gMHgxZTJiOworIHQuaGNlZGlsbGEgPSAweDFlMjk7CisgdC5oY2lyY2xlID0gMHgyNGQ3OworIHQuaGNpcmN1bWZsZXggPSAweDAxMjU7CisgdC5oZGllcmVzaXMgPSAweDFlMjc7CisgdC5oZG90YWNjZW50ID0gMHgxZTIzOworIHQuaGRvdGJlbG93ID0gMHgxZTI1OworIHQuaGUgPSAweDA1ZDQ7CisgdC5oZWFydCA9IDB4MjY2NTsKKyB0LmhlYXJ0c3VpdGJsYWNrID0gMHgyNjY1OworIHQuaGVhcnRzdWl0d2hpdGUgPSAweDI2NjE7CisgdC5oZWRhZ2VzaCA9IDB4ZmIzNDsKKyB0LmhlZGFnZXNoaGVicmV3ID0gMHhmYjM0OworIHQuaGVoYWx0b25lYXJhYmljID0gMHgwNmMxOworIHQuaGVoYXJhYmljID0gMHgwNjQ3OworIHQuaGVoZWJyZXcgPSAweDA1ZDQ7CisgdC5oZWhmaW5hbGFsdG9uZWFyYWJpYyA9IDB4ZmJhNzsKKyB0LmhlaGZpbmFsYWx0dHdvYXJhYmljID0gMHhmZWVhOworIHQuaGVoZmluYWxhcmFiaWMgPSAweGZlZWE7CisgdC5oZWhoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZiYTU7CisgdC5oZWhoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWMgPSAweGZiYTQ7CisgdC5oZWhpbml0aWFsYWx0b25lYXJhYmljID0gMHhmYmE4OworIHQuaGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmVlYjsKKyB0LmhlaGlyYWdhbmEgPSAweDMwNzg7CisgdC5oZWhtZWRpYWxhbHRvbmVhcmFiaWMgPSAweGZiYTk7CisgdC5oZWhtZWRpYWxhcmFiaWMgPSAweGZlZWM7CisgdC5oZWlzZWllcmFzcXVhcmUgPSAweDMzN2I7CisgdC5oZWthdGFrYW5hID0gMHgzMGQ4OworIHQuaGVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZDsKKyB0Lmhla3V0YWFydXNxdWFyZSA9IDB4MzMzNjsKKyB0Lmhlbmdob29rID0gMHgwMjY3OworIHQuaGVydXR1c3F1YXJlID0gMHgzMzM5OworIHQuaGV0ID0gMHgwNWQ3OworIHQuaGV0aGVicmV3ID0gMHgwNWQ3OworIHQuaGhvb2sgPSAweDAyNjY7CisgdC5oaG9va3N1cGVyaW9yID0gMHgwMmIxOworIHQuaGlldWhhY2lyY2xla29yZWFuID0gMHgzMjdiOworIHQuaGlldWhhcGFyZW5rb3JlYW4gPSAweDMyMWI7CisgdC5oaWV1aGNpcmNsZWtvcmVhbiA9IDB4MzI2ZDsKKyB0LmhpZXVoa29yZWFuID0gMHgzMTRlOworIHQuaGlldWhwYXJlbmtvcmVhbiA9IDB4MzIwZDsKKyB0LmhpaGlyYWdhbmEgPSAweDMwNzI7CisgdC5oaWthdGFrYW5hID0gMHgzMGQyOworIHQuaGlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YjsKKyB0LmhpcmlxID0gMHgwNWI0OworIHQuaGlyaXExNCA9IDB4MDViNDsKKyB0LmhpcmlxMjEgPSAweDA1YjQ7CisgdC5oaXJpcTJkID0gMHgwNWI0OworIHQuaGlyaXFoZWJyZXcgPSAweDA1YjQ7CisgdC5oaXJpcW5hcnJvd2hlYnJldyA9IDB4MDViNDsKKyB0LmhpcmlxcXVhcnRlcmhlYnJldyA9IDB4MDViNDsKKyB0Lmhpcmlxd2lkZWhlYnJldyA9IDB4MDViNDsKKyB0LmhsaW5lYmVsb3cgPSAweDFlOTY7CisgdC5obW9ub3NwYWNlID0gMHhmZjQ4OworIHQuaG9hcm1lbmlhbiA9IDB4MDU3MDsKKyB0LmhvaGlwdGhhaSA9IDB4MGUyYjsKKyB0LmhvaGlyYWdhbmEgPSAweDMwN2I7CisgdC5ob2thdGFrYW5hID0gMHgzMGRiOworIHQuaG9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZTsKKyB0LmhvbGFtID0gMHgwNWI5OworIHQuaG9sYW0xOSA9IDB4MDViOTsKKyB0LmhvbGFtMjYgPSAweDA1Yjk7CisgdC5ob2xhbTMyID0gMHgwNWI5OworIHQuaG9sYW1oZWJyZXcgPSAweDA1Yjk7CisgdC5ob2xhbW5hcnJvd2hlYnJldyA9IDB4MDViOTsKKyB0LmhvbGFtcXVhcnRlcmhlYnJldyA9IDB4MDViOTsKKyB0LmhvbGFtd2lkZWhlYnJldyA9IDB4MDViOTsKKyB0Lmhvbm9raHVrdGhhaSA9IDB4MGUyZTsKKyB0Lmhvb2thYm92ZWNvbWIgPSAweDAzMDk7CisgdC5ob29rY21iID0gMHgwMzA5OworIHQuaG9va3BhbGF0YWxpemVkYmVsb3djbWIgPSAweDAzMjE7CisgdC5ob29rcmV0cm9mbGV4YmVsb3djbWIgPSAweDAzMjI7CisgdC5ob29uc3F1YXJlID0gMHgzMzQyOworIHQuaG9yaWNvcHRpYyA9IDB4MDNlOTsKKyB0Lmhvcml6b250YWxiYXIgPSAweDIwMTU7CisgdC5ob3JuY21iID0gMHgwMzFiOworIHQuaG90c3ByaW5ncyA9IDB4MjY2ODsKKyB0LmhvdXNlID0gMHgyMzAyOworIHQuaHBhcmVuID0gMHgyNGEzOworIHQuaHN1cGVyaW9yID0gMHgwMmIwOworIHQuaHR1cm5lZCA9IDB4MDI2NTsKKyB0Lmh1aGlyYWdhbmEgPSAweDMwNzU7CisgdC5odWlpdG9zcXVhcmUgPSAweDMzMzM7CisgdC5odWthdGFrYW5hID0gMHgzMGQ1OworIHQuaHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YzsKKyB0Lmh1bmdhcnVtbGF1dCA9IDB4MDJkZDsKKyB0Lmh1bmdhcnVtbGF1dGNtYiA9IDB4MDMwYjsKKyB0Lmh2ID0gMHgwMTk1OworIHQuaHlwaGVuID0gMHgwMDJkOworIHQuaHlwaGVuaW5mZXJpb3IgPSAweGY2ZTU7CisgdC5oeXBoZW5tb25vc3BhY2UgPSAweGZmMGQ7CisgdC5oeXBoZW5zbWFsbCA9IDB4ZmU2MzsKKyB0Lmh5cGhlbnN1cGVyaW9yID0gMHhmNmU2OworIHQuaHlwaGVudHdvID0gMHgyMDEwOworIHQuaSA9IDB4MDA2OTsKKyB0LmlhY3V0ZSA9IDB4MDBlZDsKKyB0LmlhY3lyaWxsaWMgPSAweDA0NGY7CisgdC5pYmVuZ2FsaSA9IDB4MDk4NzsKKyB0Lmlib3BvbW9mbyA9IDB4MzEyNzsKKyB0LmlicmV2ZSA9IDB4MDEyZDsKKyB0LmljYXJvbiA9IDB4MDFkMDsKKyB0LmljaXJjbGUgPSAweDI0ZDg7CisgdC5pY2lyY3VtZmxleCA9IDB4MDBlZTsKKyB0LmljeXJpbGxpYyA9IDB4MDQ1NjsKKyB0LmlkYmxncmF2ZSA9IDB4MDIwOTsKKyB0LmlkZW9ncmFwaGVhcnRoY2lyY2xlID0gMHgzMjhmOworIHQuaWRlb2dyYXBoZmlyZWNpcmNsZSA9IDB4MzI4YjsKKyB0LmlkZW9ncmFwaGljYWxsaWFuY2VwYXJlbiA9IDB4MzIzZjsKKyB0LmlkZW9ncmFwaGljY2FsbHBhcmVuID0gMHgzMjNhOworIHQuaWRlb2dyYXBoaWNjZW50cmVjaXJjbGUgPSAweDMyYTU7CisgdC5pZGVvZ3JhcGhpY2Nsb3NlID0gMHgzMDA2OworIHQuaWRlb2dyYXBoaWNjb21tYSA9IDB4MzAwMTsKKyB0LmlkZW9ncmFwaGljY29tbWFsZWZ0ID0gMHhmZjY0OworIHQuaWRlb2dyYXBoaWNjb25ncmF0dWxhdGlvbnBhcmVuID0gMHgzMjM3OworIHQuaWRlb2dyYXBoaWNjb3JyZWN0Y2lyY2xlID0gMHgzMmEzOworIHQuaWRlb2dyYXBoaWNlYXJ0aHBhcmVuID0gMHgzMjJmOworIHQuaWRlb2dyYXBoaWNlbnRlcnByaXNlcGFyZW4gPSAweDMyM2Q7CisgdC5pZGVvZ3JhcGhpY2V4Y2VsbGVudGNpcmNsZSA9IDB4MzI5ZDsKKyB0LmlkZW9ncmFwaGljZmVzdGl2YWxwYXJlbiA9IDB4MzI0MDsKKyB0LmlkZW9ncmFwaGljZmluYW5jaWFsY2lyY2xlID0gMHgzMjk2OworIHQuaWRlb2dyYXBoaWNmaW5hbmNpYWxwYXJlbiA9IDB4MzIzNjsKKyB0LmlkZW9ncmFwaGljZmlyZXBhcmVuID0gMHgzMjJiOworIHQuaWRlb2dyYXBoaWNoYXZlcGFyZW4gPSAweDMyMzI7CisgdC5pZGVvZ3JhcGhpY2hpZ2hjaXJjbGUgPSAweDMyYTQ7CisgdC5pZGVvZ3JhcGhpY2l0ZXJhdGlvbm1hcmsgPSAweDMwMDU7CisgdC5pZGVvZ3JhcGhpY2xhYm9yY2lyY2xlID0gMHgzMjk4OworIHQuaWRlb2dyYXBoaWNsYWJvcnBhcmVuID0gMHgzMjM4OworIHQuaWRlb2dyYXBoaWNsZWZ0Y2lyY2xlID0gMHgzMmE3OworIHQuaWRlb2dyYXBoaWNsb3djaXJjbGUgPSAweDMyYTY7CisgdC5pZGVvZ3JhcGhpY21lZGljaW5lY2lyY2xlID0gMHgzMmE5OworIHQuaWRlb2dyYXBoaWNtZXRhbHBhcmVuID0gMHgzMjJlOworIHQuaWRlb2dyYXBoaWNtb29ucGFyZW4gPSAweDMyMmE7CisgdC5pZGVvZ3JhcGhpY25hbWVwYXJlbiA9IDB4MzIzNDsKKyB0LmlkZW9ncmFwaGljcGVyaW9kID0gMHgzMDAyOworIHQuaWRlb2dyYXBoaWNwcmludGNpcmNsZSA9IDB4MzI5ZTsKKyB0LmlkZW9ncmFwaGljcmVhY2hwYXJlbiA9IDB4MzI0MzsKKyB0LmlkZW9ncmFwaGljcmVwcmVzZW50cGFyZW4gPSAweDMyMzk7CisgdC5pZGVvZ3JhcGhpY3Jlc291cmNlcGFyZW4gPSAweDMyM2U7CisgdC5pZGVvZ3JhcGhpY3JpZ2h0Y2lyY2xlID0gMHgzMmE4OworIHQuaWRlb2dyYXBoaWNzZWNyZXRjaXJjbGUgPSAweDMyOTk7CisgdC5pZGVvZ3JhcGhpY3NlbGZwYXJlbiA9IDB4MzI0MjsKKyB0LmlkZW9ncmFwaGljc29jaWV0eXBhcmVuID0gMHgzMjMzOworIHQuaWRlb2dyYXBoaWNzcGFjZSA9IDB4MzAwMDsKKyB0LmlkZW9ncmFwaGljc3BlY2lhbHBhcmVuID0gMHgzMjM1OworIHQuaWRlb2dyYXBoaWNzdG9ja3BhcmVuID0gMHgzMjMxOworIHQuaWRlb2dyYXBoaWNzdHVkeXBhcmVuID0gMHgzMjNiOworIHQuaWRlb2dyYXBoaWNzdW5wYXJlbiA9IDB4MzIzMDsKKyB0LmlkZW9ncmFwaGljc3VwZXJ2aXNlcGFyZW4gPSAweDMyM2M7CisgdC5pZGVvZ3JhcGhpY3dhdGVycGFyZW4gPSAweDMyMmM7CisgdC5pZGVvZ3JhcGhpY3dvb2RwYXJlbiA9IDB4MzIyZDsKKyB0LmlkZW9ncmFwaGljemVybyA9IDB4MzAwNzsKKyB0LmlkZW9ncmFwaG1ldGFsY2lyY2xlID0gMHgzMjhlOworIHQuaWRlb2dyYXBobW9vbmNpcmNsZSA9IDB4MzI4YTsKKyB0LmlkZW9ncmFwaG5hbWVjaXJjbGUgPSAweDMyOTQ7CisgdC5pZGVvZ3JhcGhzdW5jaXJjbGUgPSAweDMyOTA7CisgdC5pZGVvZ3JhcGh3YXRlcmNpcmNsZSA9IDB4MzI4YzsKKyB0LmlkZW9ncmFwaHdvb2RjaXJjbGUgPSAweDMyOGQ7CisgdC5pZGV2YSA9IDB4MDkwNzsKKyB0LmlkaWVyZXNpcyA9IDB4MDBlZjsKKyB0LmlkaWVyZXNpc2FjdXRlID0gMHgxZTJmOworIHQuaWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTU7CisgdC5pZG90YmVsb3cgPSAweDFlY2I7CisgdC5pZWJyZXZlY3lyaWxsaWMgPSAweDA0ZDc7CisgdC5pZWN5cmlsbGljID0gMHgwNDM1OworIHQuaWV1bmdhY2lyY2xla29yZWFuID0gMHgzMjc1OworIHQuaWV1bmdhcGFyZW5rb3JlYW4gPSAweDMyMTU7CisgdC5pZXVuZ2NpcmNsZWtvcmVhbiA9IDB4MzI2NzsKKyB0LmlldW5na29yZWFuID0gMHgzMTQ3OworIHQuaWV1bmdwYXJlbmtvcmVhbiA9IDB4MzIwNzsKKyB0LmlncmF2ZSA9IDB4MDBlYzsKKyB0LmlndWphcmF0aSA9IDB4MGE4NzsKKyB0LmlndXJtdWtoaSA9IDB4MGEwNzsKKyB0LmloaXJhZ2FuYSA9IDB4MzA0NDsKKyB0Lmlob29rYWJvdmUgPSAweDFlYzk7CisgdC5paWJlbmdhbGkgPSAweDA5ODg7CisgdC5paWN5cmlsbGljID0gMHgwNDM4OworIHQuaWlkZXZhID0gMHgwOTA4OworIHQuaWlndWphcmF0aSA9IDB4MGE4ODsKKyB0LmlpZ3VybXVraGkgPSAweDBhMDg7CisgdC5paW1hdHJhZ3VybXVraGkgPSAweDBhNDA7CisgdC5paW52ZXJ0ZWRicmV2ZSA9IDB4MDIwYjsKKyB0Lmlpc2hvcnRjeXJpbGxpYyA9IDB4MDQzOTsKKyB0Lmlpdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMDsKKyB0Lmlpdm93ZWxzaWduZGV2YSA9IDB4MDk0MDsKKyB0Lmlpdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzA7CisgdC5paiA9IDB4MDEzMzsKKyB0LmlrYXRha2FuYSA9IDB4MzBhNDsKKyB0LmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3MjsKKyB0Lmlrb3JlYW4gPSAweDMxNjM7CisgdC5pbGRlID0gMHgwMmRjOworIHQuaWx1eWhlYnJldyA9IDB4MDVhYzsKKyB0LmltYWNyb24gPSAweDAxMmI7CisgdC5pbWFjcm9uY3lyaWxsaWMgPSAweDA0ZTM7CisgdC5pbWFnZW9yYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjUzOworIHQuaW1hdHJhZ3VybXVraGkgPSAweDBhM2Y7CisgdC5pbW9ub3NwYWNlID0gMHhmZjQ5OworIHQuaW5jcmVtZW50ID0gMHgyMjA2OworIHQuaW5maW5pdHkgPSAweDIyMWU7CisgdC5pbmlhcm1lbmlhbiA9IDB4MDU2YjsKKyB0LmludGVncmFsID0gMHgyMjJiOworIHQuaW50ZWdyYWxib3R0b20gPSAweDIzMjE7CisgdC5pbnRlZ3JhbGJ0ID0gMHgyMzIxOworIHQuaW50ZWdyYWxleCA9IDB4ZjhmNTsKKyB0LmludGVncmFsdG9wID0gMHgyMzIwOworIHQuaW50ZWdyYWx0cCA9IDB4MjMyMDsKKyB0LmludGVyc2VjdGlvbiA9IDB4MjIyOTsKKyB0LmludGlzcXVhcmUgPSAweDMzMDU7CisgdC5pbnZidWxsZXQgPSAweDI1ZDg7CisgdC5pbnZjaXJjbGUgPSAweDI1ZDk7CisgdC5pbnZzbWlsZWZhY2UgPSAweDI2M2I7CisgdC5pb2N5cmlsbGljID0gMHgwNDUxOworIHQuaW9nb25layA9IDB4MDEyZjsKKyB0LmlvdGEgPSAweDAzYjk7CisgdC5pb3RhZGllcmVzaXMgPSAweDAzY2E7CisgdC5pb3RhZGllcmVzaXN0b25vcyA9IDB4MDM5MDsKKyB0LmlvdGFsYXRpbiA9IDB4MDI2OTsKKyB0LmlvdGF0b25vcyA9IDB4MDNhZjsKKyB0LmlwYXJlbiA9IDB4MjRhNDsKKyB0LmlyaWd1cm11a2hpID0gMHgwYTcyOworIHQuaXNtYWxsaGlyYWdhbmEgPSAweDMwNDM7CisgdC5pc21hbGxrYXRha2FuYSA9IDB4MzBhMzsKKyB0LmlzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY4OworIHQuaXNzaGFyYmVuZ2FsaSA9IDB4MDlmYTsKKyB0LmlzdHJva2UgPSAweDAyNjg7CisgdC5pc3VwZXJpb3IgPSAweGY2ZWQ7CisgdC5pdGVyYXRpb25oaXJhZ2FuYSA9IDB4MzA5ZDsKKyB0Lml0ZXJhdGlvbmthdGFrYW5hID0gMHgzMGZkOworIHQuaXRpbGRlID0gMHgwMTI5OworIHQuaXRpbGRlYmVsb3cgPSAweDFlMmQ7CisgdC5pdWJvcG9tb2ZvID0gMHgzMTI5OworIHQuaXVjeXJpbGxpYyA9IDB4MDQ0ZTsKKyB0Lml2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWJmOworIHQuaXZvd2Vsc2lnbmRldmEgPSAweDA5M2Y7CisgdC5pdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmY7CisgdC5pemhpdHNhY3lyaWxsaWMgPSAweDA0NzU7CisgdC5pemhpdHNhZGJsZ3JhdmVjeXJpbGxpYyA9IDB4MDQ3NzsKKyB0LmogPSAweDAwNmE7CisgdC5qYWFybWVuaWFuID0gMHgwNTcxOworIHQuamFiZW5nYWxpID0gMHgwOTljOworIHQuamFkZXZhID0gMHgwOTFjOworIHQuamFndWphcmF0aSA9IDB4MGE5YzsKKyB0LmphZ3VybXVraGkgPSAweDBhMWM7CisgdC5qYm9wb21vZm8gPSAweDMxMTA7CisgdC5qY2Fyb24gPSAweDAxZjA7CisgdC5qY2lyY2xlID0gMHgyNGQ5OworIHQuamNpcmN1bWZsZXggPSAweDAxMzU7CisgdC5qY3Jvc3NlZHRhaWwgPSAweDAyOWQ7CisgdC5qZG90bGVzc3N0cm9rZSA9IDB4MDI1ZjsKKyB0LmplY3lyaWxsaWMgPSAweDA0NTg7CisgdC5qZWVtYXJhYmljID0gMHgwNjJjOworIHQuamVlbWZpbmFsYXJhYmljID0gMHhmZTllOworIHQuamVlbWluaXRpYWxhcmFiaWMgPSAweGZlOWY7CisgdC5qZWVtbWVkaWFsYXJhYmljID0gMHhmZWEwOworIHQuamVoYXJhYmljID0gMHgwNjk4OworIHQuamVoZmluYWxhcmFiaWMgPSAweGZiOGI7CisgdC5qaGFiZW5nYWxpID0gMHgwOTlkOworIHQuamhhZGV2YSA9IDB4MDkxZDsKKyB0LmpoYWd1amFyYXRpID0gMHgwYTlkOworIHQuamhhZ3VybXVraGkgPSAweDBhMWQ7CisgdC5qaGVoYXJtZW5pYW4gPSAweDA1N2I7CisgdC5qaXMgPSAweDMwMDQ7CisgdC5qbW9ub3NwYWNlID0gMHhmZjRhOworIHQuanBhcmVuID0gMHgyNGE1OworIHQuanN1cGVyaW9yID0gMHgwMmIyOworIHQuayA9IDB4MDA2YjsKKyB0LmthYmFzaGtpcmN5cmlsbGljID0gMHgwNGExOworIHQua2FiZW5nYWxpID0gMHgwOTk1OworIHQua2FjdXRlID0gMHgxZTMxOworIHQua2FjeXJpbGxpYyA9IDB4MDQzYTsKKyB0LmthZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OWI7CisgdC5rYWRldmEgPSAweDA5MTU7CisgdC5rYWYgPSAweDA1ZGI7CisgdC5rYWZhcmFiaWMgPSAweDA2NDM7CisgdC5rYWZkYWdlc2ggPSAweGZiM2I7CisgdC5rYWZkYWdlc2hoZWJyZXcgPSAweGZiM2I7CisgdC5rYWZmaW5hbGFyYWJpYyA9IDB4ZmVkYTsKKyB0LmthZmhlYnJldyA9IDB4MDVkYjsKKyB0LmthZmluaXRpYWxhcmFiaWMgPSAweGZlZGI7CisgdC5rYWZtZWRpYWxhcmFiaWMgPSAweGZlZGM7CisgdC5rYWZyYWZlaGVicmV3ID0gMHhmYjRkOworIHQua2FndWphcmF0aSA9IDB4MGE5NTsKKyB0LmthZ3VybXVraGkgPSAweDBhMTU7CisgdC5rYWhpcmFnYW5hID0gMHgzMDRiOworIHQua2Fob29rY3lyaWxsaWMgPSAweDA0YzQ7CisgdC5rYWthdGFrYW5hID0gMHgzMGFiOworIHQua2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NjsKKyB0LmthcHBhID0gMHgwM2JhOworIHQua2FwcGFzeW1ib2xncmVlayA9IDB4MDNmMDsKKyB0LmthcHllb3VubWlldW1rb3JlYW4gPSAweDMxNzE7CisgdC5rYXB5ZW91bnBoaWV1cGhrb3JlYW4gPSAweDMxODQ7CisgdC5rYXB5ZW91bnBpZXVwa29yZWFuID0gMHgzMTc4OworIHQua2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTc5OworIHQua2Fyb3JpaXNxdWFyZSA9IDB4MzMwZDsKKyB0Lmthc2hpZGFhdXRvYXJhYmljID0gMHgwNjQwOworIHQua2FzaGlkYWF1dG9ub3NpZGViZWFyaW5nYXJhYmljID0gMHgwNjQwOworIHQua2FzbWFsbGthdGFrYW5hID0gMHgzMGY1OworIHQua2FzcXVhcmUgPSAweDMzODQ7CisgdC5rYXNyYWFyYWJpYyA9IDB4MDY1MDsKKyB0Lmthc3JhdGFuYXJhYmljID0gMHgwNjRkOworIHQua2FzdHJva2VjeXJpbGxpYyA9IDB4MDQ5ZjsKKyB0LmthdGFoaXJhcHJvbG9uZ21hcmtoYWxmd2lkdGggPSAweGZmNzA7CisgdC5rYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWQ7CisgdC5rYm9wb21vZm8gPSAweDMxMGU7CisgdC5rY2Fsc3F1YXJlID0gMHgzMzg5OworIHQua2Nhcm9uID0gMHgwMWU5OworIHQua2NlZGlsbGEgPSAweDAxMzc7CisgdC5rY2lyY2xlID0gMHgyNGRhOworIHQua2NvbW1hYWNjZW50ID0gMHgwMTM3OworIHQua2RvdGJlbG93ID0gMHgxZTMzOworIHQua2VoYXJtZW5pYW4gPSAweDA1ODQ7CisgdC5rZWhpcmFnYW5hID0gMHgzMDUxOworIHQua2VrYXRha2FuYSA9IDB4MzBiMTsKKyB0Lmtla2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzk7CisgdC5rZW5hcm1lbmlhbiA9IDB4MDU2ZjsKKyB0Lmtlc21hbGxrYXRha2FuYSA9IDB4MzBmNjsKKyB0LmtncmVlbmxhbmRpYyA9IDB4MDEzODsKKyB0LmtoYWJlbmdhbGkgPSAweDA5OTY7CisgdC5raGFjeXJpbGxpYyA9IDB4MDQ0NTsKKyB0LmtoYWRldmEgPSAweDA5MTY7CisgdC5raGFndWphcmF0aSA9IDB4MGE5NjsKKyB0LmtoYWd1cm11a2hpID0gMHgwYTE2OworIHQua2hhaGFyYWJpYyA9IDB4MDYyZTsKKyB0LmtoYWhmaW5hbGFyYWJpYyA9IDB4ZmVhNjsKKyB0LmtoYWhpbml0aWFsYXJhYmljID0gMHhmZWE3OworIHQua2hhaG1lZGlhbGFyYWJpYyA9IDB4ZmVhODsKKyB0LmtoZWljb3B0aWMgPSAweDAzZTc7CisgdC5raGhhZGV2YSA9IDB4MDk1OTsKKyB0LmtoaGFndXJtdWtoaSA9IDB4MGE1OTsKKyB0LmtoaWV1a2hhY2lyY2xla29yZWFuID0gMHgzMjc4OworIHQua2hpZXVraGFwYXJlbmtvcmVhbiA9IDB4MzIxODsKKyB0LmtoaWV1a2hjaXJjbGVrb3JlYW4gPSAweDMyNmE7CisgdC5raGlldWtoa29yZWFuID0gMHgzMTRiOworIHQua2hpZXVraHBhcmVua29yZWFuID0gMHgzMjBhOworIHQua2hva2hhaXRoYWkgPSAweDBlMDI7CisgdC5raG9raG9udGhhaSA9IDB4MGUwNTsKKyB0Lmtob2todWF0dGhhaSA9IDB4MGUwMzsKKyB0Lmtob2tod2FpdGhhaSA9IDB4MGUwNDsKKyB0Lmtob211dHRoYWkgPSAweDBlNWI7CisgdC5raG9vayA9IDB4MDE5OTsKKyB0Lmtob3Jha2hhbmd0aGFpID0gMHgwZTA2OworIHQua2h6c3F1YXJlID0gMHgzMzkxOworIHQua2loaXJhZ2FuYSA9IDB4MzA0ZDsKKyB0Lmtpa2F0YWthbmEgPSAweDMwYWQ7CisgdC5raWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc3OworIHQua2lyb2d1cmFtdXNxdWFyZSA9IDB4MzMxNTsKKyB0Lmtpcm9tZWV0b3J1c3F1YXJlID0gMHgzMzE2OworIHQua2lyb3NxdWFyZSA9IDB4MzMxNDsKKyB0LmtpeWVva2FjaXJjbGVrb3JlYW4gPSAweDMyNmU7CisgdC5raXllb2thcGFyZW5rb3JlYW4gPSAweDMyMGU7CisgdC5raXllb2tjaXJjbGVrb3JlYW4gPSAweDMyNjA7CisgdC5raXllb2trb3JlYW4gPSAweDMxMzE7CisgdC5raXllb2twYXJlbmtvcmVhbiA9IDB4MzIwMDsKKyB0LmtpeWVva3Npb3Nrb3JlYW4gPSAweDMxMzM7CisgdC5ramVjeXJpbGxpYyA9IDB4MDQ1YzsKKyB0LmtsaW5lYmVsb3cgPSAweDFlMzU7CisgdC5rbHNxdWFyZSA9IDB4MzM5ODsKKyB0LmttY3ViZWRzcXVhcmUgPSAweDMzYTY7CisgdC5rbW9ub3NwYWNlID0gMHhmZjRiOworIHQua21zcXVhcmVkc3F1YXJlID0gMHgzM2EyOworIHQua29oaXJhZ2FuYSA9IDB4MzA1MzsKKyB0LmtvaG1zcXVhcmUgPSAweDMzYzA7CisgdC5rb2thaXRoYWkgPSAweDBlMDE7CisgdC5rb2thdGFrYW5hID0gMHgzMGIzOworIHQua29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YTsKKyB0Lmtvb3Bvc3F1YXJlID0gMHgzMzFlOworIHQua29wcGFjeXJpbGxpYyA9IDB4MDQ4MTsKKyB0LmtvcmVhbnN0YW5kYXJkc3ltYm9sID0gMHgzMjdmOworIHQua29yb25pc2NtYiA9IDB4MDM0MzsKKyB0LmtwYXJlbiA9IDB4MjRhNjsKKyB0LmtwYXNxdWFyZSA9IDB4MzNhYTsKKyB0LmtzaWN5cmlsbGljID0gMHgwNDZmOworIHQua3RzcXVhcmUgPSAweDMzY2Y7CisgdC5rdHVybmVkID0gMHgwMjllOworIHQua3VoaXJhZ2FuYSA9IDB4MzA0ZjsKKyB0Lmt1a2F0YWthbmEgPSAweDMwYWY7CisgdC5rdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc4OworIHQua3ZzcXVhcmUgPSAweDMzYjg7CisgdC5rd3NxdWFyZSA9IDB4MzNiZTsKKyB0LmwgPSAweDAwNmM7CisgdC5sYWJlbmdhbGkgPSAweDA5YjI7CisgdC5sYWN1dGUgPSAweDAxM2E7CisgdC5sYWRldmEgPSAweDA5MzI7CisgdC5sYWd1amFyYXRpID0gMHgwYWIyOworIHQubGFndXJtdWtoaSA9IDB4MGEzMjsKKyB0Lmxha2toYW5neWFvdGhhaSA9IDB4MGU0NTsKKyB0LmxhbWFsZWZmaW5hbGFyYWJpYyA9IDB4ZmVmYzsKKyB0LmxhbWFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlZjg7CisgdC5sYW1hbGVmaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmZWY3OworIHQubGFtYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmVmYTsKKyB0LmxhbWFsZWZoYW16YWJlbG93aXNvbGF0ZWRhcmFiaWMgPSAweGZlZjk7CisgdC5sYW1hbGVmaXNvbGF0ZWRhcmFiaWMgPSAweGZlZmI7CisgdC5sYW1hbGVmbWFkZGFhYm92ZWZpbmFsYXJhYmljID0gMHhmZWY2OworIHQubGFtYWxlZm1hZGRhYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmVmNTsKKyB0LmxhbWFyYWJpYyA9IDB4MDY0NDsKKyB0LmxhbWJkYSA9IDB4MDNiYjsKKyB0LmxhbWJkYXN0cm9rZSA9IDB4MDE5YjsKKyB0LmxhbWVkID0gMHgwNWRjOworIHQubGFtZWRkYWdlc2ggPSAweGZiM2M7CisgdC5sYW1lZGRhZ2VzaGhlYnJldyA9IDB4ZmIzYzsKKyB0LmxhbWVkaGVicmV3ID0gMHgwNWRjOworIHQubGFtZmluYWxhcmFiaWMgPSAweGZlZGU7CisgdC5sYW1oYWhpbml0aWFsYXJhYmljID0gMHhmY2NhOworIHQubGFtaW5pdGlhbGFyYWJpYyA9IDB4ZmVkZjsKKyB0LmxhbWplZW1pbml0aWFsYXJhYmljID0gMHhmY2M5OworIHQubGFta2hhaGluaXRpYWxhcmFiaWMgPSAweGZjY2I7CisgdC5sYW1sYW1oZWhpc29sYXRlZGFyYWJpYyA9IDB4ZmRmMjsKKyB0LmxhbW1lZGlhbGFyYWJpYyA9IDB4ZmVlMDsKKyB0LmxhbW1lZW1oYWhpbml0aWFsYXJhYmljID0gMHhmZDg4OworIHQubGFtbWVlbWluaXRpYWxhcmFiaWMgPSAweGZjY2M7CisgdC5sYXJnZWNpcmNsZSA9IDB4MjVlZjsKKyB0LmxiYXIgPSAweDAxOWE7CisgdC5sYmVsdCA9IDB4MDI2YzsKKyB0Lmxib3BvbW9mbyA9IDB4MzEwYzsKKyB0LmxjYXJvbiA9IDB4MDEzZTsKKyB0LmxjZWRpbGxhID0gMHgwMTNjOworIHQubGNpcmNsZSA9IDB4MjRkYjsKKyB0LmxjaXJjdW1mbGV4YmVsb3cgPSAweDFlM2Q7CisgdC5sY29tbWFhY2NlbnQgPSAweDAxM2M7CisgdC5sZG90ID0gMHgwMTQwOworIHQubGRvdGFjY2VudCA9IDB4MDE0MDsKKyB0Lmxkb3RiZWxvdyA9IDB4MWUzNzsKKyB0Lmxkb3RiZWxvd21hY3JvbiA9IDB4MWUzOTsKKyB0LmxlZnRhbmdsZWFib3ZlY21iID0gMHgwMzFhOworIHQubGVmdHRhY2tiZWxvd2NtYiA9IDB4MDMxODsKKyB0Lmxlc3MgPSAweDAwM2M7CisgdC5sZXNzZXF1YWwgPSAweDIyNjQ7CisgdC5sZXNzZXF1YWxvcmdyZWF0ZXIgPSAweDIyZGE7CisgdC5sZXNzbW9ub3NwYWNlID0gMHhmZjFjOworIHQubGVzc29yZXF1aXZhbGVudCA9IDB4MjI3MjsKKyB0Lmxlc3NvcmdyZWF0ZXIgPSAweDIyNzY7CisgdC5sZXNzb3ZlcmVxdWFsID0gMHgyMjY2OworIHQubGVzc3NtYWxsID0gMHhmZTY0OworIHQubGV6aCA9IDB4MDI2ZTsKKyB0LmxmYmxvY2sgPSAweDI1OGM7CisgdC5saG9va3JldHJvZmxleCA9IDB4MDI2ZDsKKyB0LmxpcmEgPSAweDIwYTQ7CisgdC5saXduYXJtZW5pYW4gPSAweDA1NmM7CisgdC5saiA9IDB4MDFjOTsKKyB0LmxqZWN5cmlsbGljID0gMHgwNDU5OworIHQubGwgPSAweGY2YzA7CisgdC5sbGFkZXZhID0gMHgwOTMzOworIHQubGxhZ3VqYXJhdGkgPSAweDBhYjM7CisgdC5sbGluZWJlbG93ID0gMHgxZTNiOworIHQubGxsYWRldmEgPSAweDA5MzQ7CisgdC5sbHZvY2FsaWNiZW5nYWxpID0gMHgwOWUxOworIHQubGx2b2NhbGljZGV2YSA9IDB4MDk2MTsKKyB0Lmxsdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5ZTM7CisgdC5sbHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYzOworIHQubG1pZGRsZXRpbGRlID0gMHgwMjZiOworIHQubG1vbm9zcGFjZSA9IDB4ZmY0YzsKKyB0Lmxtc3F1YXJlID0gMHgzM2QwOworIHQubG9jaHVsYXRoYWkgPSAweDBlMmM7CisgdC5sb2dpY2FsYW5kID0gMHgyMjI3OworIHQubG9naWNhbG5vdCA9IDB4MDBhYzsKKyB0LmxvZ2ljYWxub3RyZXZlcnNlZCA9IDB4MjMxMDsKKyB0LmxvZ2ljYWxvciA9IDB4MjIyODsKKyB0LmxvbGluZ3RoYWkgPSAweDBlMjU7CisgdC5sb25ncyA9IDB4MDE3ZjsKKyB0Lmxvd2xpbmVjZW50ZXJsaW5lID0gMHhmZTRlOworIHQubG93bGluZWNtYiA9IDB4MDMzMjsKKyB0Lmxvd2xpbmVkYXNoZWQgPSAweGZlNGQ7CisgdC5sb3plbmdlID0gMHgyNWNhOworIHQubHBhcmVuID0gMHgyNGE3OworIHQubHNsYXNoID0gMHgwMTQyOworIHQubHNxdWFyZSA9IDB4MjExMzsKKyB0LmxzdXBlcmlvciA9IDB4ZjZlZTsKKyB0Lmx0c2hhZGUgPSAweDI1OTE7CisgdC5sdXRoYWkgPSAweDBlMjY7CisgdC5sdm9jYWxpY2JlbmdhbGkgPSAweDA5OGM7CisgdC5sdm9jYWxpY2RldmEgPSAweDA5MGM7CisgdC5sdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5ZTI7CisgdC5sdm9jYWxpY3Zvd2Vsc2lnbmRldmEgPSAweDA5NjI7CisgdC5seHNxdWFyZSA9IDB4MzNkMzsKKyB0Lm0gPSAweDAwNmQ7CisgdC5tYWJlbmdhbGkgPSAweDA5YWU7CisgdC5tYWNyb24gPSAweDAwYWY7CisgdC5tYWNyb25iZWxvd2NtYiA9IDB4MDMzMTsKKyB0Lm1hY3JvbmNtYiA9IDB4MDMwNDsKKyB0Lm1hY3Jvbmxvd21vZCA9IDB4MDJjZDsKKyB0Lm1hY3Jvbm1vbm9zcGFjZSA9IDB4ZmZlMzsKKyB0Lm1hY3V0ZSA9IDB4MWUzZjsKKyB0Lm1hZGV2YSA9IDB4MDkyZTsKKyB0Lm1hZ3VqYXJhdGkgPSAweDBhYWU7CisgdC5tYWd1cm11a2hpID0gMHgwYTJlOworIHQubWFoYXBha2hoZWJyZXcgPSAweDA1YTQ7CisgdC5tYWhhcGFraGxlZnRoZWJyZXcgPSAweDA1YTQ7CisgdC5tYWhpcmFnYW5hID0gMHgzMDdlOworIHQubWFpY2hhdHRhd2Fsb3dsZWZ0dGhhaSA9IDB4Zjg5NTsKKyB0Lm1haWNoYXR0YXdhbG93cmlnaHR0aGFpID0gMHhmODk0OworIHQubWFpY2hhdHRhd2F0aGFpID0gMHgwZTRiOworIHQubWFpY2hhdHRhd2F1cHBlcmxlZnR0aGFpID0gMHhmODkzOworIHQubWFpZWtsb3dsZWZ0dGhhaSA9IDB4Zjg4YzsKKyB0Lm1haWVrbG93cmlnaHR0aGFpID0gMHhmODhiOworIHQubWFpZWt0aGFpID0gMHgwZTQ4OworIHQubWFpZWt1cHBlcmxlZnR0aGFpID0gMHhmODhhOworIHQubWFpaGFuYWthdGxlZnR0aGFpID0gMHhmODg0OworIHQubWFpaGFuYWthdHRoYWkgPSAweDBlMzE7CisgdC5tYWl0YWlraHVsZWZ0dGhhaSA9IDB4Zjg4OTsKKyB0Lm1haXRhaWtodXRoYWkgPSAweDBlNDc7CisgdC5tYWl0aG9sb3dsZWZ0dGhhaSA9IDB4Zjg4ZjsKKyB0Lm1haXRob2xvd3JpZ2h0dGhhaSA9IDB4Zjg4ZTsKKyB0Lm1haXRob3RoYWkgPSAweDBlNDk7CisgdC5tYWl0aG91cHBlcmxlZnR0aGFpID0gMHhmODhkOworIHQubWFpdHJpbG93bGVmdHRoYWkgPSAweGY4OTI7CisgdC5tYWl0cmlsb3dyaWdodHRoYWkgPSAweGY4OTE7CisgdC5tYWl0cml0aGFpID0gMHgwZTRhOworIHQubWFpdHJpdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MDsKKyB0Lm1haXlhbW9rdGhhaSA9IDB4MGU0NjsKKyB0Lm1ha2F0YWthbmEgPSAweDMwZGU7CisgdC5tYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhmOworIHQubWFsZSA9IDB4MjY0MjsKKyB0Lm1hbnN5b25zcXVhcmUgPSAweDMzNDc7CisgdC5tYXFhZmhlYnJldyA9IDB4MDViZTsKKyB0Lm1hcnMgPSAweDI2NDI7CisgdC5tYXNvcmFjaXJjbGVoZWJyZXcgPSAweDA1YWY7CisgdC5tYXNxdWFyZSA9IDB4MzM4MzsKKyB0Lm1ib3BvbW9mbyA9IDB4MzEwNzsKKyB0Lm1ic3F1YXJlID0gMHgzM2Q0OworIHQubWNpcmNsZSA9IDB4MjRkYzsKKyB0Lm1jdWJlZHNxdWFyZSA9IDB4MzNhNTsKKyB0Lm1kb3RhY2NlbnQgPSAweDFlNDE7CisgdC5tZG90YmVsb3cgPSAweDFlNDM7CisgdC5tZWVtYXJhYmljID0gMHgwNjQ1OworIHQubWVlbWZpbmFsYXJhYmljID0gMHhmZWUyOworIHQubWVlbWluaXRpYWxhcmFiaWMgPSAweGZlZTM7CisgdC5tZWVtbWVkaWFsYXJhYmljID0gMHhmZWU0OworIHQubWVlbW1lZW1pbml0aWFsYXJhYmljID0gMHhmY2QxOworIHQubWVlbW1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0ODsKKyB0Lm1lZXRvcnVzcXVhcmUgPSAweDMzNGQ7CisgdC5tZWhpcmFnYW5hID0gMHgzMDgxOworIHQubWVpemllcmFzcXVhcmUgPSAweDMzN2U7CisgdC5tZWthdGFrYW5hID0gMHgzMGUxOworIHQubWVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MjsKKyB0Lm1lbSA9IDB4MDVkZTsKKyB0Lm1lbWRhZ2VzaCA9IDB4ZmIzZTsKKyB0Lm1lbWRhZ2VzaGhlYnJldyA9IDB4ZmIzZTsKKyB0Lm1lbWhlYnJldyA9IDB4MDVkZTsKKyB0Lm1lbmFybWVuaWFuID0gMHgwNTc0OworIHQubWVya2hhaGVicmV3ID0gMHgwNWE1OworIHQubWVya2hha2VmdWxhaGVicmV3ID0gMHgwNWE2OworIHQubWVya2hha2VmdWxhbGVmdGhlYnJldyA9IDB4MDVhNjsKKyB0Lm1lcmtoYWxlZnRoZWJyZXcgPSAweDA1YTU7CisgdC5taG9vayA9IDB4MDI3MTsKKyB0Lm1oenNxdWFyZSA9IDB4MzM5MjsKKyB0Lm1pZGRsZWRvdGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY1OworIHQubWlkZG90ID0gMHgwMGI3OworIHQubWlldW1hY2lyY2xla29yZWFuID0gMHgzMjcyOworIHQubWlldW1hcGFyZW5rb3JlYW4gPSAweDMyMTI7CisgdC5taWV1bWNpcmNsZWtvcmVhbiA9IDB4MzI2NDsKKyB0Lm1pZXVta29yZWFuID0gMHgzMTQxOworIHQubWlldW1wYW5zaW9za29yZWFuID0gMHgzMTcwOworIHQubWlldW1wYXJlbmtvcmVhbiA9IDB4MzIwNDsKKyB0Lm1pZXVtcGlldXBrb3JlYW4gPSAweDMxNmU7CisgdC5taWV1bXNpb3Nrb3JlYW4gPSAweDMxNmY7CisgdC5taWhpcmFnYW5hID0gMHgzMDdmOworIHQubWlrYXRha2FuYSA9IDB4MzBkZjsKKyB0Lm1pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTA7CisgdC5taW51cyA9IDB4MjIxMjsKKyB0Lm1pbnVzYmVsb3djbWIgPSAweDAzMjA7CisgdC5taW51c2NpcmNsZSA9IDB4MjI5NjsKKyB0Lm1pbnVzbW9kID0gMHgwMmQ3OworIHQubWludXNwbHVzID0gMHgyMjEzOworIHQubWludXRlID0gMHgyMDMyOworIHQubWlyaWJhYXJ1c3F1YXJlID0gMHgzMzRhOworIHQubWlyaXNxdWFyZSA9IDB4MzM0OTsKKyB0Lm1sb25nbGVndHVybmVkID0gMHgwMjcwOworIHQubWxzcXVhcmUgPSAweDMzOTY7CisgdC5tbWN1YmVkc3F1YXJlID0gMHgzM2EzOworIHQubW1vbm9zcGFjZSA9IDB4ZmY0ZDsKKyB0Lm1tc3F1YXJlZHNxdWFyZSA9IDB4MzM5ZjsKKyB0Lm1vaGlyYWdhbmEgPSAweDMwODI7CisgdC5tb2htc3F1YXJlID0gMHgzM2MxOworIHQubW9rYXRha2FuYSA9IDB4MzBlMjsKKyB0Lm1va2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTM7CisgdC5tb2xzcXVhcmUgPSAweDMzZDY7CisgdC5tb21hdGhhaSA9IDB4MGUyMTsKKyB0Lm1vdmVyc3NxdWFyZSA9IDB4MzNhNzsKKyB0Lm1vdmVyc3NxdWFyZWRzcXVhcmUgPSAweDMzYTg7CisgdC5tcGFyZW4gPSAweDI0YTg7CisgdC5tcGFzcXVhcmUgPSAweDMzYWI7CisgdC5tc3NxdWFyZSA9IDB4MzNiMzsKKyB0Lm1zdXBlcmlvciA9IDB4ZjZlZjsKKyB0Lm10dXJuZWQgPSAweDAyNmY7CisgdC5tdSA9IDB4MDBiNTsKKyB0Lm11MSA9IDB4MDBiNTsKKyB0Lm11YXNxdWFyZSA9IDB4MzM4MjsKKyB0Lm11Y2hncmVhdGVyID0gMHgyMjZiOworIHQubXVjaGxlc3MgPSAweDIyNmE7CisgdC5tdWZzcXVhcmUgPSAweDMzOGM7CisgdC5tdWdyZWVrID0gMHgwM2JjOworIHQubXVnc3F1YXJlID0gMHgzMzhkOworIHQubXVoaXJhZ2FuYSA9IDB4MzA4MDsKKyB0Lm11a2F0YWthbmEgPSAweDMwZTA7CisgdC5tdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkxOworIHQubXVsc3F1YXJlID0gMHgzMzk1OworIHQubXVsdGlwbHkgPSAweDAwZDc7CisgdC5tdW1zcXVhcmUgPSAweDMzOWI7CisgdC5tdW5haGhlYnJldyA9IDB4MDVhMzsKKyB0Lm11bmFobGVmdGhlYnJldyA9IDB4MDVhMzsKKyB0Lm11c2ljYWxub3RlID0gMHgyNjZhOworIHQubXVzaWNhbG5vdGVkYmwgPSAweDI2NmI7CisgdC5tdXNpY2ZsYXRzaWduID0gMHgyNjZkOworIHQubXVzaWNzaGFycHNpZ24gPSAweDI2NmY7CisgdC5tdXNzcXVhcmUgPSAweDMzYjI7CisgdC5tdXZzcXVhcmUgPSAweDMzYjY7CisgdC5tdXdzcXVhcmUgPSAweDMzYmM7CisgdC5tdm1lZ2FzcXVhcmUgPSAweDMzYjk7CisgdC5tdnNxdWFyZSA9IDB4MzNiNzsKKyB0Lm13bWVnYXNxdWFyZSA9IDB4MzNiZjsKKyB0Lm13c3F1YXJlID0gMHgzM2JkOworIHQubiA9IDB4MDA2ZTsKKyB0Lm5hYmVuZ2FsaSA9IDB4MDlhODsKKyB0Lm5hYmxhID0gMHgyMjA3OworIHQubmFjdXRlID0gMHgwMTQ0OworIHQubmFkZXZhID0gMHgwOTI4OworIHQubmFndWphcmF0aSA9IDB4MGFhODsKKyB0Lm5hZ3VybXVraGkgPSAweDBhMjg7CisgdC5uYWhpcmFnYW5hID0gMHgzMDZhOworIHQubmFrYXRha2FuYSA9IDB4MzBjYTsKKyB0Lm5ha2F0YWthbmFoYWxmd2lkdGggPSAweGZmODU7CisgdC5uYXBvc3Ryb3BoZSA9IDB4MDE0OTsKKyB0Lm5hc3F1YXJlID0gMHgzMzgxOworIHQubmJvcG9tb2ZvID0gMHgzMTBiOworIHQubmJzcGFjZSA9IDB4MDBhMDsKKyB0Lm5jYXJvbiA9IDB4MDE0ODsKKyB0Lm5jZWRpbGxhID0gMHgwMTQ2OworIHQubmNpcmNsZSA9IDB4MjRkZDsKKyB0Lm5jaXJjdW1mbGV4YmVsb3cgPSAweDFlNGI7CisgdC5uY29tbWFhY2NlbnQgPSAweDAxNDY7CisgdC5uZG90YWNjZW50ID0gMHgxZTQ1OworIHQubmRvdGJlbG93ID0gMHgxZTQ3OworIHQubmVoaXJhZ2FuYSA9IDB4MzA2ZDsKKyB0Lm5la2F0YWthbmEgPSAweDMwY2Q7CisgdC5uZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg4OworIHQubmV3c2hlcWVsc2lnbiA9IDB4MjBhYTsKKyB0Lm5mc3F1YXJlID0gMHgzMzhiOworIHQubmdhYmVuZ2FsaSA9IDB4MDk5OTsKKyB0Lm5nYWRldmEgPSAweDA5MTk7CisgdC5uZ2FndWphcmF0aSA9IDB4MGE5OTsKKyB0Lm5nYWd1cm11a2hpID0gMHgwYTE5OworIHQubmdvbmd1dGhhaSA9IDB4MGUwNzsKKyB0Lm5oaXJhZ2FuYSA9IDB4MzA5MzsKKyB0Lm5ob29rbGVmdCA9IDB4MDI3MjsKKyB0Lm5ob29rcmV0cm9mbGV4ID0gMHgwMjczOworIHQubmlldW5hY2lyY2xla29yZWFuID0gMHgzMjZmOworIHQubmlldW5hcGFyZW5rb3JlYW4gPSAweDMyMGY7CisgdC5uaWV1bmNpZXVja29yZWFuID0gMHgzMTM1OworIHQubmlldW5jaXJjbGVrb3JlYW4gPSAweDMyNjE7CisgdC5uaWV1bmhpZXVoa29yZWFuID0gMHgzMTM2OworIHQubmlldW5rb3JlYW4gPSAweDMxMzQ7CisgdC5uaWV1bnBhbnNpb3Nrb3JlYW4gPSAweDMxNjg7CisgdC5uaWV1bnBhcmVua29yZWFuID0gMHgzMjAxOworIHQubmlldW5zaW9za29yZWFuID0gMHgzMTY3OworIHQubmlldW50aWtldXRrb3JlYW4gPSAweDMxNjY7CisgdC5uaWhpcmFnYW5hID0gMHgzMDZiOworIHQubmlrYXRha2FuYSA9IDB4MzBjYjsKKyB0Lm5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmODY7CisgdC5uaWtoYWhpdGxlZnR0aGFpID0gMHhmODk5OworIHQubmlraGFoaXR0aGFpID0gMHgwZTRkOworIHQubmluZSA9IDB4MDAzOTsKKyB0Lm5pbmVhcmFiaWMgPSAweDA2Njk7CisgdC5uaW5lYmVuZ2FsaSA9IDB4MDllZjsKKyB0Lm5pbmVjaXJjbGUgPSAweDI0Njg7CisgdC5uaW5lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MjsKKyB0Lm5pbmVkZXZhID0gMHgwOTZmOworIHQubmluZWd1amFyYXRpID0gMHgwYWVmOworIHQubmluZWd1cm11a2hpID0gMHgwYTZmOworIHQubmluZWhhY2thcmFiaWMgPSAweDA2Njk7CisgdC5uaW5laGFuZ3pob3UgPSAweDMwMjk7CisgdC5uaW5laWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyODsKKyB0Lm5pbmVpbmZlcmlvciA9IDB4MjA4OTsKKyB0Lm5pbmVtb25vc3BhY2UgPSAweGZmMTk7CisgdC5uaW5lb2xkc3R5bGUgPSAweGY3Mzk7CisgdC5uaW5lcGFyZW4gPSAweDI0N2M7CisgdC5uaW5lcGVyaW9kID0gMHgyNDkwOworIHQubmluZXBlcnNpYW4gPSAweDA2Zjk7CisgdC5uaW5lcm9tYW4gPSAweDIxNzg7CisgdC5uaW5lc3VwZXJpb3IgPSAweDIwNzk7CisgdC5uaW5ldGVlbmNpcmNsZSA9IDB4MjQ3MjsKKyB0Lm5pbmV0ZWVucGFyZW4gPSAweDI0ODY7CisgdC5uaW5ldGVlbnBlcmlvZCA9IDB4MjQ5YTsKKyB0Lm5pbmV0aGFpID0gMHgwZTU5OworIHQubmogPSAweDAxY2M7CisgdC5uamVjeXJpbGxpYyA9IDB4MDQ1YTsKKyB0Lm5rYXRha2FuYSA9IDB4MzBmMzsKKyB0Lm5rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ZDsKKyB0Lm5sZWdyaWdodGxvbmcgPSAweDAxOWU7CisgdC5ubGluZWJlbG93ID0gMHgxZTQ5OworIHQubm1vbm9zcGFjZSA9IDB4ZmY0ZTsKKyB0Lm5tc3F1YXJlID0gMHgzMzlhOworIHQubm5hYmVuZ2FsaSA9IDB4MDlhMzsKKyB0Lm5uYWRldmEgPSAweDA5MjM7CisgdC5ubmFndWphcmF0aSA9IDB4MGFhMzsKKyB0Lm5uYWd1cm11a2hpID0gMHgwYTIzOworIHQubm5uYWRldmEgPSAweDA5Mjk7CisgdC5ub2hpcmFnYW5hID0gMHgzMDZlOworIHQubm9rYXRha2FuYSA9IDB4MzBjZTsKKyB0Lm5va2F0YWthbmFoYWxmd2lkdGggPSAweGZmODk7CisgdC5ub25icmVha2luZ3NwYWNlID0gMHgwMGEwOworIHQubm9uZW50aGFpID0gMHgwZTEzOworIHQubm9udXRoYWkgPSAweDBlMTk7CisgdC5ub29uYXJhYmljID0gMHgwNjQ2OworIHQubm9vbmZpbmFsYXJhYmljID0gMHhmZWU2OworIHQubm9vbmdodW5uYWFyYWJpYyA9IDB4MDZiYTsKKyB0Lm5vb25naHVubmFmaW5hbGFyYWJpYyA9IDB4ZmI5ZjsKKyB0Lm5vb25pbml0aWFsYXJhYmljID0gMHhmZWU3OworIHQubm9vbmplZW1pbml0aWFsYXJhYmljID0gMHhmY2QyOworIHQubm9vbmplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0YjsKKyB0Lm5vb25tZWRpYWxhcmFiaWMgPSAweGZlZTg7CisgdC5ub29ubWVlbWluaXRpYWxhcmFiaWMgPSAweGZjZDU7CisgdC5ub29ubWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzRlOworIHQubm9vbm5vb25maW5hbGFyYWJpYyA9IDB4ZmM4ZDsKKyB0Lm5vdGNvbnRhaW5zID0gMHgyMjBjOworIHQubm90ZWxlbWVudCA9IDB4MjIwOTsKKyB0Lm5vdGVsZW1lbnRvZiA9IDB4MjIwOTsKKyB0Lm5vdGVxdWFsID0gMHgyMjYwOworIHQubm90Z3JlYXRlciA9IDB4MjI2ZjsKKyB0Lm5vdGdyZWF0ZXJub3JlcXVhbCA9IDB4MjI3MTsKKyB0Lm5vdGdyZWF0ZXJub3JsZXNzID0gMHgyMjc5OworIHQubm90aWRlbnRpY2FsID0gMHgyMjYyOworIHQubm90bGVzcyA9IDB4MjI2ZTsKKyB0Lm5vdGxlc3Nub3JlcXVhbCA9IDB4MjI3MDsKKyB0Lm5vdHBhcmFsbGVsID0gMHgyMjI2OworIHQubm90cHJlY2VkZXMgPSAweDIyODA7CisgdC5ub3RzdWJzZXQgPSAweDIyODQ7CisgdC5ub3RzdWNjZWVkcyA9IDB4MjI4MTsKKyB0Lm5vdHN1cGVyc2V0ID0gMHgyMjg1OworIHQubm93YXJtZW5pYW4gPSAweDA1NzY7CisgdC5ucGFyZW4gPSAweDI0YTk7CisgdC5uc3NxdWFyZSA9IDB4MzNiMTsKKyB0Lm5zdXBlcmlvciA9IDB4MjA3ZjsKKyB0Lm50aWxkZSA9IDB4MDBmMTsKKyB0Lm51ID0gMHgwM2JkOworIHQubnVoaXJhZ2FuYSA9IDB4MzA2YzsKKyB0Lm51a2F0YWthbmEgPSAweDMwY2M7CisgdC5udWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg3OworIHQubnVrdGFiZW5nYWxpID0gMHgwOWJjOworIHQubnVrdGFkZXZhID0gMHgwOTNjOworIHQubnVrdGFndWphcmF0aSA9IDB4MGFiYzsKKyB0Lm51a3RhZ3VybXVraGkgPSAweDBhM2M7CisgdC5udW1iZXJzaWduID0gMHgwMDIzOworIHQubnVtYmVyc2lnbm1vbm9zcGFjZSA9IDB4ZmYwMzsKKyB0Lm51bWJlcnNpZ25zbWFsbCA9IDB4ZmU1ZjsKKyB0Lm51bWVyYWxzaWduZ3JlZWsgPSAweDAzNzQ7CisgdC5udW1lcmFsc2lnbmxvd2VyZ3JlZWsgPSAweDAzNzU7CisgdC5udW1lcm8gPSAweDIxMTY7CisgdC5udW4gPSAweDA1ZTA7CisgdC5udW5kYWdlc2ggPSAweGZiNDA7CisgdC5udW5kYWdlc2hoZWJyZXcgPSAweGZiNDA7CisgdC5udW5oZWJyZXcgPSAweDA1ZTA7CisgdC5udnNxdWFyZSA9IDB4MzNiNTsKKyB0Lm53c3F1YXJlID0gMHgzM2JiOworIHQubnlhYmVuZ2FsaSA9IDB4MDk5ZTsKKyB0Lm55YWRldmEgPSAweDA5MWU7CisgdC5ueWFndWphcmF0aSA9IDB4MGE5ZTsKKyB0Lm55YWd1cm11a2hpID0gMHgwYTFlOworIHQubyA9IDB4MDA2ZjsKKyB0Lm9hY3V0ZSA9IDB4MDBmMzsKKyB0Lm9hbmd0aGFpID0gMHgwZTJkOworIHQub2JhcnJlZCA9IDB4MDI3NTsKKyB0Lm9iYXJyZWRjeXJpbGxpYyA9IDB4MDRlOTsKKyB0Lm9iYXJyZWRkaWVyZXNpc2N5cmlsbGljID0gMHgwNGViOworIHQub2JlbmdhbGkgPSAweDA5OTM7CisgdC5vYm9wb21vZm8gPSAweDMxMWI7CisgdC5vYnJldmUgPSAweDAxNGY7CisgdC5vY2FuZHJhZGV2YSA9IDB4MDkxMTsKKyB0Lm9jYW5kcmFndWphcmF0aSA9IDB4MGE5MTsKKyB0Lm9jYW5kcmF2b3dlbHNpZ25kZXZhID0gMHgwOTQ5OworIHQub2NhbmRyYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM5OworIHQub2Nhcm9uID0gMHgwMWQyOworIHQub2NpcmNsZSA9IDB4MjRkZTsKKyB0Lm9jaXJjdW1mbGV4ID0gMHgwMGY0OworIHQub2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMTsKKyB0Lm9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDk7CisgdC5vY2lyY3VtZmxleGdyYXZlID0gMHgxZWQzOworIHQub2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDU7CisgdC5vY2lyY3VtZmxleHRpbGRlID0gMHgxZWQ3OworIHQub2N5cmlsbGljID0gMHgwNDNlOworIHQub2RibGFjdXRlID0gMHgwMTUxOworIHQub2RibGdyYXZlID0gMHgwMjBkOworIHQub2RldmEgPSAweDA5MTM7CisgdC5vZGllcmVzaXMgPSAweDAwZjY7CisgdC5vZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlNzsKKyB0Lm9kb3RiZWxvdyA9IDB4MWVjZDsKKyB0Lm9lID0gMHgwMTUzOworIHQub2Vrb3JlYW4gPSAweDMxNWE7CisgdC5vZ29uZWsgPSAweDAyZGI7CisgdC5vZ29uZWtjbWIgPSAweDAzMjg7CisgdC5vZ3JhdmUgPSAweDAwZjI7CisgdC5vZ3VqYXJhdGkgPSAweDBhOTM7CisgdC5vaGFybWVuaWFuID0gMHgwNTg1OworIHQub2hpcmFnYW5hID0gMHgzMDRhOworIHQub2hvb2thYm92ZSA9IDB4MWVjZjsKKyB0Lm9ob3JuID0gMHgwMWExOworIHQub2hvcm5hY3V0ZSA9IDB4MWVkYjsKKyB0Lm9ob3JuZG90YmVsb3cgPSAweDFlZTM7CisgdC5vaG9ybmdyYXZlID0gMHgxZWRkOworIHQub2hvcm5ob29rYWJvdmUgPSAweDFlZGY7CisgdC5vaG9ybnRpbGRlID0gMHgxZWUxOworIHQub2h1bmdhcnVtbGF1dCA9IDB4MDE1MTsKKyB0Lm9pID0gMHgwMWEzOworIHQub2ludmVydGVkYnJldmUgPSAweDAyMGY7CisgdC5va2F0YWthbmEgPSAweDMwYWE7CisgdC5va2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzU7CisgdC5va29yZWFuID0gMHgzMTU3OworIHQub2xlaGVicmV3ID0gMHgwNWFiOworIHQub21hY3JvbiA9IDB4MDE0ZDsKKyB0Lm9tYWNyb25hY3V0ZSA9IDB4MWU1MzsKKyB0Lm9tYWNyb25ncmF2ZSA9IDB4MWU1MTsKKyB0Lm9tZGV2YSA9IDB4MDk1MDsKKyB0Lm9tZWdhID0gMHgwM2M5OworIHQub21lZ2ExID0gMHgwM2Q2OworIHQub21lZ2FjeXJpbGxpYyA9IDB4MDQ2MTsKKyB0Lm9tZWdhbGF0aW5jbG9zZWQgPSAweDAyNzc7CisgdC5vbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2I7CisgdC5vbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2Q7CisgdC5vbWVnYXRvbm9zID0gMHgwM2NlOworIHQub21ndWphcmF0aSA9IDB4MGFkMDsKKyB0Lm9taWNyb24gPSAweDAzYmY7CisgdC5vbWljcm9udG9ub3MgPSAweDAzY2M7CisgdC5vbW9ub3NwYWNlID0gMHhmZjRmOworIHQub25lID0gMHgwMDMxOworIHQub25lYXJhYmljID0gMHgwNjYxOworIHQub25lYmVuZ2FsaSA9IDB4MDllNzsKKyB0Lm9uZWNpcmNsZSA9IDB4MjQ2MDsKKyB0Lm9uZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGE7CisgdC5vbmVkZXZhID0gMHgwOTY3OworIHQub25lZG90ZW5sZWFkZXIgPSAweDIwMjQ7CisgdC5vbmVlaWdodGggPSAweDIxNWI7CisgdC5vbmVmaXR0ZWQgPSAweGY2ZGM7CisgdC5vbmVndWphcmF0aSA9IDB4MGFlNzsKKyB0Lm9uZWd1cm11a2hpID0gMHgwYTY3OworIHQub25laGFja2FyYWJpYyA9IDB4MDY2MTsKKyB0Lm9uZWhhbGYgPSAweDAwYmQ7CisgdC5vbmVoYW5nemhvdSA9IDB4MzAyMTsKKyB0Lm9uZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjA7CisgdC5vbmVpbmZlcmlvciA9IDB4MjA4MTsKKyB0Lm9uZW1vbm9zcGFjZSA9IDB4ZmYxMTsKKyB0Lm9uZW51bWVyYXRvcmJlbmdhbGkgPSAweDA5ZjQ7CisgdC5vbmVvbGRzdHlsZSA9IDB4ZjczMTsKKyB0Lm9uZXBhcmVuID0gMHgyNDc0OworIHQub25lcGVyaW9kID0gMHgyNDg4OworIHQub25lcGVyc2lhbiA9IDB4MDZmMTsKKyB0Lm9uZXF1YXJ0ZXIgPSAweDAwYmM7CisgdC5vbmVyb21hbiA9IDB4MjE3MDsKKyB0Lm9uZXN1cGVyaW9yID0gMHgwMGI5OworIHQub25ldGhhaSA9IDB4MGU1MTsKKyB0Lm9uZXRoaXJkID0gMHgyMTUzOworIHQub29nb25layA9IDB4MDFlYjsKKyB0Lm9vZ29uZWttYWNyb24gPSAweDAxZWQ7CisgdC5vb2d1cm11a2hpID0gMHgwYTEzOworIHQub29tYXRyYWd1cm11a2hpID0gMHgwYTRiOworIHQub29wZW4gPSAweDAyNTQ7CisgdC5vcGFyZW4gPSAweDI0YWE7CisgdC5vcGVuYnVsbGV0ID0gMHgyNWU2OworIHQub3B0aW9uID0gMHgyMzI1OworIHQub3JkZmVtaW5pbmUgPSAweDAwYWE7CisgdC5vcmRtYXNjdWxpbmUgPSAweDAwYmE7CisgdC5vcnRob2dvbmFsID0gMHgyMjFmOworIHQub3Nob3J0ZGV2YSA9IDB4MDkxMjsKKyB0Lm9zaG9ydHZvd2Vsc2lnbmRldmEgPSAweDA5NGE7CisgdC5vc2xhc2ggPSAweDAwZjg7CisgdC5vc2xhc2hhY3V0ZSA9IDB4MDFmZjsKKyB0Lm9zbWFsbGhpcmFnYW5hID0gMHgzMDQ5OworIHQub3NtYWxsa2F0YWthbmEgPSAweDMwYTk7CisgdC5vc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2YjsKKyB0Lm9zdHJva2VhY3V0ZSA9IDB4MDFmZjsKKyB0Lm9zdXBlcmlvciA9IDB4ZjZmMDsKKyB0Lm90Y3lyaWxsaWMgPSAweDA0N2Y7CisgdC5vdGlsZGUgPSAweDAwZjU7CisgdC5vdGlsZGVhY3V0ZSA9IDB4MWU0ZDsKKyB0Lm90aWxkZWRpZXJlc2lzID0gMHgxZTRmOworIHQub3Vib3BvbW9mbyA9IDB4MzEyMTsKKyB0Lm92ZXJsaW5lID0gMHgyMDNlOworIHQub3ZlcmxpbmVjZW50ZXJsaW5lID0gMHhmZTRhOworIHQub3ZlcmxpbmVjbWIgPSAweDAzMDU7CisgdC5vdmVybGluZWRhc2hlZCA9IDB4ZmU0OTsKKyB0Lm92ZXJsaW5lZGJsd2F2eSA9IDB4ZmU0YzsKKyB0Lm92ZXJsaW5ld2F2eSA9IDB4ZmU0YjsKKyB0Lm92ZXJzY29yZSA9IDB4MDBhZjsKKyB0Lm92b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNiOworIHQub3Zvd2Vsc2lnbmRldmEgPSAweDA5NGI7CisgdC5vdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhY2I7CisgdC5wID0gMHgwMDcwOworIHQucGFhbXBzc3F1YXJlID0gMHgzMzgwOworIHQucGFhc2VudG9zcXVhcmUgPSAweDMzMmI7CisgdC5wYWJlbmdhbGkgPSAweDA5YWE7CisgdC5wYWN1dGUgPSAweDFlNTU7CisgdC5wYWRldmEgPSAweDA5MmE7CisgdC5wYWdlZG93biA9IDB4MjFkZjsKKyB0LnBhZ2V1cCA9IDB4MjFkZTsKKyB0LnBhZ3VqYXJhdGkgPSAweDBhYWE7CisgdC5wYWd1cm11a2hpID0gMHgwYTJhOworIHQucGFoaXJhZ2FuYSA9IDB4MzA3MTsKKyB0LnBhaXlhbm5vaXRoYWkgPSAweDBlMmY7CisgdC5wYWthdGFrYW5hID0gMHgzMGQxOworIHQucGFsYXRhbGl6YXRpb25jeXJpbGxpY2NtYiA9IDB4MDQ4NDsKKyB0LnBhbG9jaGthY3lyaWxsaWMgPSAweDA0YzA7CisgdC5wYW5zaW9za29yZWFuID0gMHgzMTdmOworIHQucGFyYWdyYXBoID0gMHgwMGI2OworIHQucGFyYWxsZWwgPSAweDIyMjU7CisgdC5wYXJlbmxlZnQgPSAweDAwMjg7CisgdC5wYXJlbmxlZnRhbHRvbmVhcmFiaWMgPSAweGZkM2U7CisgdC5wYXJlbmxlZnRidCA9IDB4ZjhlZDsKKyB0LnBhcmVubGVmdGV4ID0gMHhmOGVjOworIHQucGFyZW5sZWZ0aW5mZXJpb3IgPSAweDIwOGQ7CisgdC5wYXJlbmxlZnRtb25vc3BhY2UgPSAweGZmMDg7CisgdC5wYXJlbmxlZnRzbWFsbCA9IDB4ZmU1OTsKKyB0LnBhcmVubGVmdHN1cGVyaW9yID0gMHgyMDdkOworIHQucGFyZW5sZWZ0dHAgPSAweGY4ZWI7CisgdC5wYXJlbmxlZnR2ZXJ0aWNhbCA9IDB4ZmUzNTsKKyB0LnBhcmVucmlnaHQgPSAweDAwMjk7CisgdC5wYXJlbnJpZ2h0YWx0b25lYXJhYmljID0gMHhmZDNmOworIHQucGFyZW5yaWdodGJ0ID0gMHhmOGY4OworIHQucGFyZW5yaWdodGV4ID0gMHhmOGY3OworIHQucGFyZW5yaWdodGluZmVyaW9yID0gMHgyMDhlOworIHQucGFyZW5yaWdodG1vbm9zcGFjZSA9IDB4ZmYwOTsKKyB0LnBhcmVucmlnaHRzbWFsbCA9IDB4ZmU1YTsKKyB0LnBhcmVucmlnaHRzdXBlcmlvciA9IDB4MjA3ZTsKKyB0LnBhcmVucmlnaHR0cCA9IDB4ZjhmNjsKKyB0LnBhcmVucmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzNjsKKyB0LnBhcnRpYWxkaWZmID0gMHgyMjAyOworIHQucGFzZXFoZWJyZXcgPSAweDA1YzA7CisgdC5wYXNodGFoZWJyZXcgPSAweDA1OTk7CisgdC5wYXNxdWFyZSA9IDB4MzNhOTsKKyB0LnBhdGFoID0gMHgwNWI3OworIHQucGF0YWgxMSA9IDB4MDViNzsKKyB0LnBhdGFoMWQgPSAweDA1Yjc7CisgdC5wYXRhaDJhID0gMHgwNWI3OworIHQucGF0YWhoZWJyZXcgPSAweDA1Yjc7CisgdC5wYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViNzsKKyB0LnBhdGFocXVhcnRlcmhlYnJldyA9IDB4MDViNzsKKyB0LnBhdGFod2lkZWhlYnJldyA9IDB4MDViNzsKKyB0LnBhemVyaGVicmV3ID0gMHgwNWExOworIHQucGJvcG9tb2ZvID0gMHgzMTA2OworIHQucGNpcmNsZSA9IDB4MjRkZjsKKyB0LnBkb3RhY2NlbnQgPSAweDFlNTc7CisgdC5wZSA9IDB4MDVlNDsKKyB0LnBlY3lyaWxsaWMgPSAweDA0M2Y7CisgdC5wZWRhZ2VzaCA9IDB4ZmI0NDsKKyB0LnBlZGFnZXNoaGVicmV3ID0gMHhmYjQ0OworIHQucGVlemlzcXVhcmUgPSAweDMzM2I7CisgdC5wZWZpbmFsZGFnZXNoaGVicmV3ID0gMHhmYjQzOworIHQucGVoYXJhYmljID0gMHgwNjdlOworIHQucGVoYXJtZW5pYW4gPSAweDA1N2E7CisgdC5wZWhlYnJldyA9IDB4MDVlNDsKKyB0LnBlaGZpbmFsYXJhYmljID0gMHhmYjU3OworIHQucGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI1ODsKKyB0LnBlaGlyYWdhbmEgPSAweDMwN2E7CisgdC5wZWhtZWRpYWxhcmFiaWMgPSAweGZiNTk7CisgdC5wZWthdGFrYW5hID0gMHgzMGRhOworIHQucGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0YTc7CisgdC5wZXJhZmVoZWJyZXcgPSAweGZiNGU7CisgdC5wZXJjZW50ID0gMHgwMDI1OworIHQucGVyY2VudGFyYWJpYyA9IDB4MDY2YTsKKyB0LnBlcmNlbnRtb25vc3BhY2UgPSAweGZmMDU7CisgdC5wZXJjZW50c21hbGwgPSAweGZlNmE7CisgdC5wZXJpb2QgPSAweDAwMmU7CisgdC5wZXJpb2Rhcm1lbmlhbiA9IDB4MDU4OTsKKyB0LnBlcmlvZGNlbnRlcmVkID0gMHgwMGI3OworIHQucGVyaW9kaGFsZndpZHRoID0gMHhmZjYxOworIHQucGVyaW9kaW5mZXJpb3IgPSAweGY2ZTc7CisgdC5wZXJpb2Rtb25vc3BhY2UgPSAweGZmMGU7CisgdC5wZXJpb2RzbWFsbCA9IDB4ZmU1MjsKKyB0LnBlcmlvZHN1cGVyaW9yID0gMHhmNmU4OworIHQucGVyaXNwb21lbmlncmVla2NtYiA9IDB4MDM0MjsKKyB0LnBlcnBlbmRpY3VsYXIgPSAweDIyYTU7CisgdC5wZXJ0aG91c2FuZCA9IDB4MjAzMDsKKyB0LnBlc2V0YSA9IDB4MjBhNzsKKyB0LnBmc3F1YXJlID0gMHgzMzhhOworIHQucGhhYmVuZ2FsaSA9IDB4MDlhYjsKKyB0LnBoYWRldmEgPSAweDA5MmI7CisgdC5waGFndWphcmF0aSA9IDB4MGFhYjsKKyB0LnBoYWd1cm11a2hpID0gMHgwYTJiOworIHQucGhpID0gMHgwM2M2OworIHQucGhpMSA9IDB4MDNkNTsKKyB0LnBoaWV1cGhhY2lyY2xla29yZWFuID0gMHgzMjdhOworIHQucGhpZXVwaGFwYXJlbmtvcmVhbiA9IDB4MzIxYTsKKyB0LnBoaWV1cGhjaXJjbGVrb3JlYW4gPSAweDMyNmM7CisgdC5waGlldXBoa29yZWFuID0gMHgzMTRkOworIHQucGhpZXVwaHBhcmVua29yZWFuID0gMHgzMjBjOworIHQucGhpbGF0aW4gPSAweDAyNzg7CisgdC5waGludGh1dGhhaSA9IDB4MGUzYTsKKyB0LnBoaXN5bWJvbGdyZWVrID0gMHgwM2Q1OworIHQucGhvb2sgPSAweDAxYTU7CisgdC5waG9waGFudGhhaSA9IDB4MGUxZTsKKyB0LnBob3BodW5ndGhhaSA9IDB4MGUxYzsKKyB0LnBob3NhbXBoYW90aGFpID0gMHgwZTIwOworIHQucGkgPSAweDAzYzA7CisgdC5waWV1cGFjaXJjbGVrb3JlYW4gPSAweDMyNzM7CisgdC5waWV1cGFwYXJlbmtvcmVhbiA9IDB4MzIxMzsKKyB0LnBpZXVwY2lldWNrb3JlYW4gPSAweDMxNzY7CisgdC5waWV1cGNpcmNsZWtvcmVhbiA9IDB4MzI2NTsKKyB0LnBpZXVwa2l5ZW9ra29yZWFuID0gMHgzMTcyOworIHQucGlldXBrb3JlYW4gPSAweDMxNDI7CisgdC5waWV1cHBhcmVua29yZWFuID0gMHgzMjA1OworIHQucGlldXBzaW9za2l5ZW9ra29yZWFuID0gMHgzMTc0OworIHQucGlldXBzaW9za29yZWFuID0gMHgzMTQ0OworIHQucGlldXBzaW9zdGlrZXV0a29yZWFuID0gMHgzMTc1OworIHQucGlldXB0aGlldXRoa29yZWFuID0gMHgzMTc3OworIHQucGlldXB0aWtldXRrb3JlYW4gPSAweDMxNzM7CisgdC5waWhpcmFnYW5hID0gMHgzMDc0OworIHQucGlrYXRha2FuYSA9IDB4MzBkNDsKKyB0LnBpc3ltYm9sZ3JlZWsgPSAweDAzZDY7CisgdC5waXdyYXJtZW5pYW4gPSAweDA1ODM7CisgdC5wbHVzID0gMHgwMDJiOworIHQucGx1c2JlbG93Y21iID0gMHgwMzFmOworIHQucGx1c2NpcmNsZSA9IDB4MjI5NTsKKyB0LnBsdXNtaW51cyA9IDB4MDBiMTsKKyB0LnBsdXNtb2QgPSAweDAyZDY7CisgdC5wbHVzbW9ub3NwYWNlID0gMHhmZjBiOworIHQucGx1c3NtYWxsID0gMHhmZTYyOworIHQucGx1c3N1cGVyaW9yID0gMHgyMDdhOworIHQucG1vbm9zcGFjZSA9IDB4ZmY1MDsKKyB0LnBtc3F1YXJlID0gMHgzM2Q4OworIHQucG9oaXJhZ2FuYSA9IDB4MzA3ZDsKKyB0LnBvaW50aW5naW5kZXhkb3dud2hpdGUgPSAweDI2MWY7CisgdC5wb2ludGluZ2luZGV4bGVmdHdoaXRlID0gMHgyNjFjOworIHQucG9pbnRpbmdpbmRleHJpZ2h0d2hpdGUgPSAweDI2MWU7CisgdC5wb2ludGluZ2luZGV4dXB3aGl0ZSA9IDB4MjYxZDsKKyB0LnBva2F0YWthbmEgPSAweDMwZGQ7CisgdC5wb3BsYXRoYWkgPSAweDBlMWI7CisgdC5wb3N0YWxtYXJrID0gMHgzMDEyOworIHQucG9zdGFsbWFya2ZhY2UgPSAweDMwMjA7CisgdC5wcGFyZW4gPSAweDI0YWI7CisgdC5wcmVjZWRlcyA9IDB4MjI3YTsKKyB0LnByZXNjcmlwdGlvbiA9IDB4MjExZTsKKyB0LnByaW1lbW9kID0gMHgwMmI5OworIHQucHJpbWVyZXZlcnNlZCA9IDB4MjAzNTsKKyB0LnByb2R1Y3QgPSAweDIyMGY7CisgdC5wcm9qZWN0aXZlID0gMHgyMzA1OworIHQucHJvbG9uZ2Vka2FuYSA9IDB4MzBmYzsKKyB0LnByb3BlbGxvciA9IDB4MjMxODsKKyB0LnByb3BlcnN1YnNldCA9IDB4MjI4MjsKKyB0LnByb3BlcnN1cGVyc2V0ID0gMHgyMjgzOworIHQucHJvcG9ydGlvbiA9IDB4MjIzNzsKKyB0LnByb3BvcnRpb25hbCA9IDB4MjIxZDsKKyB0LnBzaSA9IDB4MDNjODsKKyB0LnBzaWN5cmlsbGljID0gMHgwNDcxOworIHQucHNpbGlwbmV1bWF0YWN5cmlsbGljY21iID0gMHgwNDg2OworIHQucHNzcXVhcmUgPSAweDMzYjA7CisgdC5wdWhpcmFnYW5hID0gMHgzMDc3OworIHQucHVrYXRha2FuYSA9IDB4MzBkNzsKKyB0LnB2c3F1YXJlID0gMHgzM2I0OworIHQucHdzcXVhcmUgPSAweDMzYmE7CisgdC5xID0gMHgwMDcxOworIHQucWFkZXZhID0gMHgwOTU4OworIHQucWFkbWFoZWJyZXcgPSAweDA1YTg7CisgdC5xYWZhcmFiaWMgPSAweDA2NDI7CisgdC5xYWZmaW5hbGFyYWJpYyA9IDB4ZmVkNjsKKyB0LnFhZmluaXRpYWxhcmFiaWMgPSAweGZlZDc7CisgdC5xYWZtZWRpYWxhcmFiaWMgPSAweGZlZDg7CisgdC5xYW1hdHMgPSAweDA1Yjg7CisgdC5xYW1hdHMxMCA9IDB4MDViODsKKyB0LnFhbWF0czFhID0gMHgwNWI4OworIHQucWFtYXRzMWMgPSAweDA1Yjg7CisgdC5xYW1hdHMyNyA9IDB4MDViODsKKyB0LnFhbWF0czI5ID0gMHgwNWI4OworIHQucWFtYXRzMzMgPSAweDA1Yjg7CisgdC5xYW1hdHNkZSA9IDB4MDViODsKKyB0LnFhbWF0c2hlYnJldyA9IDB4MDViODsKKyB0LnFhbWF0c25hcnJvd2hlYnJldyA9IDB4MDViODsKKyB0LnFhbWF0c3FhdGFuaGVicmV3ID0gMHgwNWI4OworIHQucWFtYXRzcWF0YW5uYXJyb3doZWJyZXcgPSAweDA1Yjg7CisgdC5xYW1hdHNxYXRhbnF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjg7CisgdC5xYW1hdHNxYXRhbndpZGVoZWJyZXcgPSAweDA1Yjg7CisgdC5xYW1hdHNxdWFydGVyaGVicmV3ID0gMHgwNWI4OworIHQucWFtYXRzd2lkZWhlYnJldyA9IDB4MDViODsKKyB0LnFhcm5leXBhcmFoZWJyZXcgPSAweDA1OWY7CisgdC5xYm9wb21vZm8gPSAweDMxMTE7CisgdC5xY2lyY2xlID0gMHgyNGUwOworIHQucWhvb2sgPSAweDAyYTA7CisgdC5xbW9ub3NwYWNlID0gMHhmZjUxOworIHQucW9mID0gMHgwNWU3OworIHQucW9mZGFnZXNoID0gMHhmYjQ3OworIHQucW9mZGFnZXNoaGVicmV3ID0gMHhmYjQ3OworIHQucW9maGVicmV3ID0gMHgwNWU3OworIHQucXBhcmVuID0gMHgyNGFjOworIHQucXVhcnRlcm5vdGUgPSAweDI2Njk7CisgdC5xdWJ1dHMgPSAweDA1YmI7CisgdC5xdWJ1dHMxOCA9IDB4MDViYjsKKyB0LnF1YnV0czI1ID0gMHgwNWJiOworIHQucXVidXRzMzEgPSAweDA1YmI7CisgdC5xdWJ1dHNoZWJyZXcgPSAweDA1YmI7CisgdC5xdWJ1dHNuYXJyb3doZWJyZXcgPSAweDA1YmI7CisgdC5xdWJ1dHNxdWFydGVyaGVicmV3ID0gMHgwNWJiOworIHQucXVidXRzd2lkZWhlYnJldyA9IDB4MDViYjsKKyB0LnF1ZXN0aW9uID0gMHgwMDNmOworIHQucXVlc3Rpb25hcmFiaWMgPSAweDA2MWY7CisgdC5xdWVzdGlvbmFybWVuaWFuID0gMHgwNTVlOworIHQucXVlc3Rpb25kb3duID0gMHgwMGJmOworIHQucXVlc3Rpb25kb3duc21hbGwgPSAweGY3YmY7CisgdC5xdWVzdGlvbmdyZWVrID0gMHgwMzdlOworIHQucXVlc3Rpb25tb25vc3BhY2UgPSAweGZmMWY7CisgdC5xdWVzdGlvbnNtYWxsID0gMHhmNzNmOworIHQucXVvdGVkYmwgPSAweDAwMjI7CisgdC5xdW90ZWRibGJhc2UgPSAweDIwMWU7CisgdC5xdW90ZWRibGxlZnQgPSAweDIwMWM7CisgdC5xdW90ZWRibG1vbm9zcGFjZSA9IDB4ZmYwMjsKKyB0LnF1b3RlZGJscHJpbWUgPSAweDMwMWU7CisgdC5xdW90ZWRibHByaW1lcmV2ZXJzZWQgPSAweDMwMWQ7CisgdC5xdW90ZWRibHJpZ2h0ID0gMHgyMDFkOworIHQucXVvdGVsZWZ0ID0gMHgyMDE4OworIHQucXVvdGVsZWZ0cmV2ZXJzZWQgPSAweDIwMWI7CisgdC5xdW90ZXJldmVyc2VkID0gMHgyMDFiOworIHQucXVvdGVyaWdodCA9IDB4MjAxOTsKKyB0LnF1b3RlcmlnaHRuID0gMHgwMTQ5OworIHQucXVvdGVzaW5nbGJhc2UgPSAweDIwMWE7CisgdC5xdW90ZXNpbmdsZSA9IDB4MDAyNzsKKyB0LnF1b3Rlc2luZ2xlbW9ub3NwYWNlID0gMHhmZjA3OworIHQuciA9IDB4MDA3MjsKKyB0LnJhYXJtZW5pYW4gPSAweDA1N2M7CisgdC5yYWJlbmdhbGkgPSAweDA5YjA7CisgdC5yYWN1dGUgPSAweDAxNTU7CisgdC5yYWRldmEgPSAweDA5MzA7CisgdC5yYWRpY2FsID0gMHgyMjFhOworIHQucmFkaWNhbGV4ID0gMHhmOGU1OworIHQucmFkb3ZlcnNzcXVhcmUgPSAweDMzYWU7CisgdC5yYWRvdmVyc3NxdWFyZWRzcXVhcmUgPSAweDMzYWY7CisgdC5yYWRzcXVhcmUgPSAweDMzYWQ7CisgdC5yYWZlID0gMHgwNWJmOworIHQucmFmZWhlYnJldyA9IDB4MDViZjsKKyB0LnJhZ3VqYXJhdGkgPSAweDBhYjA7CisgdC5yYWd1cm11a2hpID0gMHgwYTMwOworIHQucmFoaXJhZ2FuYSA9IDB4MzA4OTsKKyB0LnJha2F0YWthbmEgPSAweDMwZTk7CisgdC5yYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk3OworIHQucmFsb3dlcmRpYWdvbmFsYmVuZ2FsaSA9IDB4MDlmMTsKKyB0LnJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpID0gMHgwOWYwOworIHQucmFtc2hvcm4gPSAweDAyNjQ7CisgdC5yYXRpbyA9IDB4MjIzNjsKKyB0LnJib3BvbW9mbyA9IDB4MzExNjsKKyB0LnJjYXJvbiA9IDB4MDE1OTsKKyB0LnJjZWRpbGxhID0gMHgwMTU3OworIHQucmNpcmNsZSA9IDB4MjRlMTsKKyB0LnJjb21tYWFjY2VudCA9IDB4MDE1NzsKKyB0LnJkYmxncmF2ZSA9IDB4MDIxMTsKKyB0LnJkb3RhY2NlbnQgPSAweDFlNTk7CisgdC5yZG90YmVsb3cgPSAweDFlNWI7CisgdC5yZG90YmVsb3dtYWNyb24gPSAweDFlNWQ7CisgdC5yZWZlcmVuY2VtYXJrID0gMHgyMDNiOworIHQucmVmbGV4c3Vic2V0ID0gMHgyMjg2OworIHQucmVmbGV4c3VwZXJzZXQgPSAweDIyODc7CisgdC5yZWdpc3RlcmVkID0gMHgwMGFlOworIHQucmVnaXN0ZXJzYW5zID0gMHhmOGU4OworIHQucmVnaXN0ZXJzZXJpZiA9IDB4ZjZkYTsKKyB0LnJlaGFyYWJpYyA9IDB4MDYzMTsKKyB0LnJlaGFybWVuaWFuID0gMHgwNTgwOworIHQucmVoZmluYWxhcmFiaWMgPSAweGZlYWU7CisgdC5yZWhpcmFnYW5hID0gMHgzMDhjOworIHQucmVrYXRha2FuYSA9IDB4MzBlYzsKKyB0LnJla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWE7CisgdC5yZXNoID0gMHgwNWU4OworIHQucmVzaGRhZ2VzaGhlYnJldyA9IDB4ZmI0ODsKKyB0LnJlc2hoZWJyZXcgPSAweDA1ZTg7CisgdC5yZXZlcnNlZHRpbGRlID0gMHgyMjNkOworIHQucmV2aWFoZWJyZXcgPSAweDA1OTc7CisgdC5yZXZpYW11Z3Jhc2hoZWJyZXcgPSAweDA1OTc7CisgdC5yZXZsb2dpY2Fsbm90ID0gMHgyMzEwOworIHQucmZpc2hob29rID0gMHgwMjdlOworIHQucmZpc2hob29rcmV2ZXJzZWQgPSAweDAyN2Y7CisgdC5yaGFiZW5nYWxpID0gMHgwOWRkOworIHQucmhhZGV2YSA9IDB4MDk1ZDsKKyB0LnJobyA9IDB4MDNjMTsKKyB0LnJob29rID0gMHgwMjdkOworIHQucmhvb2t0dXJuZWQgPSAweDAyN2I7CisgdC5yaG9va3R1cm5lZHN1cGVyaW9yID0gMHgwMmI1OworIHQucmhvc3ltYm9sZ3JlZWsgPSAweDAzZjE7CisgdC5yaG90aWNob29rbW9kID0gMHgwMmRlOworIHQucmlldWxhY2lyY2xla29yZWFuID0gMHgzMjcxOworIHQucmlldWxhcGFyZW5rb3JlYW4gPSAweDMyMTE7CisgdC5yaWV1bGNpcmNsZWtvcmVhbiA9IDB4MzI2MzsKKyB0LnJpZXVsaGlldWhrb3JlYW4gPSAweDMxNDA7CisgdC5yaWV1bGtpeWVva2tvcmVhbiA9IDB4MzEzYTsKKyB0LnJpZXVsa2l5ZW9rc2lvc2tvcmVhbiA9IDB4MzE2OTsKKyB0LnJpZXVsa29yZWFuID0gMHgzMTM5OworIHQucmlldWxtaWV1bWtvcmVhbiA9IDB4MzEzYjsKKyB0LnJpZXVscGFuc2lvc2tvcmVhbiA9IDB4MzE2YzsKKyB0LnJpZXVscGFyZW5rb3JlYW4gPSAweDMyMDM7CisgdC5yaWV1bHBoaWV1cGhrb3JlYW4gPSAweDMxM2Y7CisgdC5yaWV1bHBpZXVwa29yZWFuID0gMHgzMTNjOworIHQucmlldWxwaWV1cHNpb3Nrb3JlYW4gPSAweDMxNmI7CisgdC5yaWV1bHNpb3Nrb3JlYW4gPSAweDMxM2Q7CisgdC5yaWV1bHRoaWV1dGhrb3JlYW4gPSAweDMxM2U7CisgdC5yaWV1bHRpa2V1dGtvcmVhbiA9IDB4MzE2YTsKKyB0LnJpZXVseWVvcmluaGlldWhrb3JlYW4gPSAweDMxNmQ7CisgdC5yaWdodGFuZ2xlID0gMHgyMjFmOworIHQucmlnaHR0YWNrYmVsb3djbWIgPSAweDAzMTk7CisgdC5yaWdodHRyaWFuZ2xlID0gMHgyMmJmOworIHQucmloaXJhZ2FuYSA9IDB4MzA4YTsKKyB0LnJpa2F0YWthbmEgPSAweDMwZWE7CisgdC5yaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk4OworIHQucmluZyA9IDB4MDJkYTsKKyB0LnJpbmdiZWxvd2NtYiA9IDB4MDMyNTsKKyB0LnJpbmdjbWIgPSAweDAzMGE7CisgdC5yaW5naGFsZmxlZnQgPSAweDAyYmY7CisgdC5yaW5naGFsZmxlZnRhcm1lbmlhbiA9IDB4MDU1OTsKKyB0LnJpbmdoYWxmbGVmdGJlbG93Y21iID0gMHgwMzFjOworIHQucmluZ2hhbGZsZWZ0Y2VudGVyZWQgPSAweDAyZDM7CisgdC5yaW5naGFsZnJpZ2h0ID0gMHgwMmJlOworIHQucmluZ2hhbGZyaWdodGJlbG93Y21iID0gMHgwMzM5OworIHQucmluZ2hhbGZyaWdodGNlbnRlcmVkID0gMHgwMmQyOworIHQucmludmVydGVkYnJldmUgPSAweDAyMTM7CisgdC5yaXR0b3J1c3F1YXJlID0gMHgzMzUxOworIHQucmxpbmViZWxvdyA9IDB4MWU1ZjsKKyB0LnJsb25nbGVnID0gMHgwMjdjOworIHQucmxvbmdsZWd0dXJuZWQgPSAweDAyN2E7CisgdC5ybW9ub3NwYWNlID0gMHhmZjUyOworIHQucm9oaXJhZ2FuYSA9IDB4MzA4ZDsKKyB0LnJva2F0YWthbmEgPSAweDMwZWQ7CisgdC5yb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjliOworIHQucm9ydWF0aGFpID0gMHgwZTIzOworIHQucnBhcmVuID0gMHgyNGFkOworIHQucnJhYmVuZ2FsaSA9IDB4MDlkYzsKKyB0LnJyYWRldmEgPSAweDA5MzE7CisgdC5ycmFndXJtdWtoaSA9IDB4MGE1YzsKKyB0LnJyZWhhcmFiaWMgPSAweDA2OTE7CisgdC5ycmVoZmluYWxhcmFiaWMgPSAweGZiOGQ7CisgdC5ycnZvY2FsaWNiZW5nYWxpID0gMHgwOWUwOworIHQucnJ2b2NhbGljZGV2YSA9IDB4MDk2MDsKKyB0LnJydm9jYWxpY2d1amFyYXRpID0gMHgwYWUwOworIHQucnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljNDsKKyB0LnJydm9jYWxpY3Zvd2Vsc2lnbmRldmEgPSAweDA5NDQ7CisgdC5ycnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNDsKKyB0LnJzdXBlcmlvciA9IDB4ZjZmMTsKKyB0LnJ0YmxvY2sgPSAweDI1OTA7CisgdC5ydHVybmVkID0gMHgwMjc5OworIHQucnR1cm5lZHN1cGVyaW9yID0gMHgwMmI0OworIHQucnVoaXJhZ2FuYSA9IDB4MzA4YjsKKyB0LnJ1a2F0YWthbmEgPSAweDMwZWI7CisgdC5ydWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk5OworIHQucnVwZWVtYXJrYmVuZ2FsaSA9IDB4MDlmMjsKKyB0LnJ1cGVlc2lnbmJlbmdhbGkgPSAweDA5ZjM7CisgdC5ydXBpYWggPSAweGY2ZGQ7CisgdC5ydXRoYWkgPSAweDBlMjQ7CisgdC5ydm9jYWxpY2JlbmdhbGkgPSAweDA5OGI7CisgdC5ydm9jYWxpY2RldmEgPSAweDA5MGI7CisgdC5ydm9jYWxpY2d1amFyYXRpID0gMHgwYThiOworIHQucnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMzOworIHQucnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQzOworIHQucnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMzsKKyB0LnMgPSAweDAwNzM7CisgdC5zYWJlbmdhbGkgPSAweDA5Yjg7CisgdC5zYWN1dGUgPSAweDAxNWI7CisgdC5zYWN1dGVkb3RhY2NlbnQgPSAweDFlNjU7CisgdC5zYWRhcmFiaWMgPSAweDA2MzU7CisgdC5zYWRldmEgPSAweDA5Mzg7CisgdC5zYWRmaW5hbGFyYWJpYyA9IDB4ZmViYTsKKyB0LnNhZGluaXRpYWxhcmFiaWMgPSAweGZlYmI7CisgdC5zYWRtZWRpYWxhcmFiaWMgPSAweGZlYmM7CisgdC5zYWd1amFyYXRpID0gMHgwYWI4OworIHQuc2FndXJtdWtoaSA9IDB4MGEzODsKKyB0LnNhaGlyYWdhbmEgPSAweDMwNTU7CisgdC5zYWthdGFrYW5hID0gMHgzMGI1OworIHQuc2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YjsKKyB0LnNhbGxhbGxhaG91YWxheWhld2FzYWxsYW1hcmFiaWMgPSAweGZkZmE7CisgdC5zYW1la2ggPSAweDA1ZTE7CisgdC5zYW1la2hkYWdlc2ggPSAweGZiNDE7CisgdC5zYW1la2hkYWdlc2hoZWJyZXcgPSAweGZiNDE7CisgdC5zYW1la2hoZWJyZXcgPSAweDA1ZTE7CisgdC5zYXJhYWF0aGFpID0gMHgwZTMyOworIHQuc2FyYWFldGhhaSA9IDB4MGU0MTsKKyB0LnNhcmFhaW1haW1hbGFpdGhhaSA9IDB4MGU0NDsKKyB0LnNhcmFhaW1haW11YW50aGFpID0gMHgwZTQzOworIHQuc2FyYWFtdGhhaSA9IDB4MGUzMzsKKyB0LnNhcmFhdGhhaSA9IDB4MGUzMDsKKyB0LnNhcmFldGhhaSA9IDB4MGU0MDsKKyB0LnNhcmFpaWxlZnR0aGFpID0gMHhmODg2OworIHQuc2FyYWlpdGhhaSA9IDB4MGUzNTsKKyB0LnNhcmFpbGVmdHRoYWkgPSAweGY4ODU7CisgdC5zYXJhaXRoYWkgPSAweDBlMzQ7CisgdC5zYXJhb3RoYWkgPSAweDBlNDI7CisgdC5zYXJhdWVlbGVmdHRoYWkgPSAweGY4ODg7CisgdC5zYXJhdWVldGhhaSA9IDB4MGUzNzsKKyB0LnNhcmF1ZWxlZnR0aGFpID0gMHhmODg3OworIHQuc2FyYXVldGhhaSA9IDB4MGUzNjsKKyB0LnNhcmF1dGhhaSA9IDB4MGUzODsKKyB0LnNhcmF1dXRoYWkgPSAweDBlMzk7CisgdC5zYm9wb21vZm8gPSAweDMxMTk7CisgdC5zY2Fyb24gPSAweDAxNjE7CisgdC5zY2Fyb25kb3RhY2NlbnQgPSAweDFlNjc7CisgdC5zY2VkaWxsYSA9IDB4MDE1ZjsKKyB0LnNjaHdhID0gMHgwMjU5OworIHQuc2Nod2FjeXJpbGxpYyA9IDB4MDRkOTsKKyB0LnNjaHdhZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkYjsKKyB0LnNjaHdhaG9vayA9IDB4MDI1YTsKKyB0LnNjaXJjbGUgPSAweDI0ZTI7CisgdC5zY2lyY3VtZmxleCA9IDB4MDE1ZDsKKyB0LnNjb21tYWFjY2VudCA9IDB4MDIxOTsKKyB0LnNkb3RhY2NlbnQgPSAweDFlNjE7CisgdC5zZG90YmVsb3cgPSAweDFlNjM7CisgdC5zZG90YmVsb3dkb3RhY2NlbnQgPSAweDFlNjk7CisgdC5zZWFndWxsYmVsb3djbWIgPSAweDAzM2M7CisgdC5zZWNvbmQgPSAweDIwMzM7CisgdC5zZWNvbmR0b25lY2hpbmVzZSA9IDB4MDJjYTsKKyB0LnNlY3Rpb24gPSAweDAwYTc7CisgdC5zZWVuYXJhYmljID0gMHgwNjMzOworIHQuc2VlbmZpbmFsYXJhYmljID0gMHhmZWIyOworIHQuc2VlbmluaXRpYWxhcmFiaWMgPSAweGZlYjM7CisgdC5zZWVubWVkaWFsYXJhYmljID0gMHhmZWI0OworIHQuc2Vnb2wgPSAweDA1YjY7CisgdC5zZWdvbDEzID0gMHgwNWI2OworIHQuc2Vnb2wxZiA9IDB4MDViNjsKKyB0LnNlZ29sMmMgPSAweDA1YjY7CisgdC5zZWdvbGhlYnJldyA9IDB4MDViNjsKKyB0LnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWI2OworIHQuc2Vnb2xxdWFydGVyaGVicmV3ID0gMHgwNWI2OworIHQuc2Vnb2x0YWhlYnJldyA9IDB4MDU5MjsKKyB0LnNlZ29sd2lkZWhlYnJldyA9IDB4MDViNjsKKyB0LnNlaGFybWVuaWFuID0gMHgwNTdkOworIHQuc2VoaXJhZ2FuYSA9IDB4MzA1YjsKKyB0LnNla2F0YWthbmEgPSAweDMwYmI7CisgdC5zZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdlOworIHQuc2VtaWNvbG9uID0gMHgwMDNiOworIHQuc2VtaWNvbG9uYXJhYmljID0gMHgwNjFiOworIHQuc2VtaWNvbG9ubW9ub3NwYWNlID0gMHhmZjFiOworIHQuc2VtaWNvbG9uc21hbGwgPSAweGZlNTQ7CisgdC5zZW1pdm9pY2VkbWFya2thbmEgPSAweDMwOWM7CisgdC5zZW1pdm9pY2VkbWFya2thbmFoYWxmd2lkdGggPSAweGZmOWY7CisgdC5zZW50aXNxdWFyZSA9IDB4MzMyMjsKKyB0LnNlbnRvc3F1YXJlID0gMHgzMzIzOworIHQuc2V2ZW4gPSAweDAwMzc7CisgdC5zZXZlbmFyYWJpYyA9IDB4MDY2NzsKKyB0LnNldmVuYmVuZ2FsaSA9IDB4MDllZDsKKyB0LnNldmVuY2lyY2xlID0gMHgyNDY2OworIHQuc2V2ZW5jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzkwOworIHQuc2V2ZW5kZXZhID0gMHgwOTZkOworIHQuc2V2ZW5laWdodGhzID0gMHgyMTVlOworIHQuc2V2ZW5ndWphcmF0aSA9IDB4MGFlZDsKKyB0LnNldmVuZ3VybXVraGkgPSAweDBhNmQ7CisgdC5zZXZlbmhhY2thcmFiaWMgPSAweDA2Njc7CisgdC5zZXZlbmhhbmd6aG91ID0gMHgzMDI3OworIHQuc2V2ZW5pZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI2OworIHQuc2V2ZW5pbmZlcmlvciA9IDB4MjA4NzsKKyB0LnNldmVubW9ub3NwYWNlID0gMHhmZjE3OworIHQuc2V2ZW5vbGRzdHlsZSA9IDB4ZjczNzsKKyB0LnNldmVucGFyZW4gPSAweDI0N2E7CisgdC5zZXZlbnBlcmlvZCA9IDB4MjQ4ZTsKKyB0LnNldmVucGVyc2lhbiA9IDB4MDZmNzsKKyB0LnNldmVucm9tYW4gPSAweDIxNzY7CisgdC5zZXZlbnN1cGVyaW9yID0gMHgyMDc3OworIHQuc2V2ZW50ZWVuY2lyY2xlID0gMHgyNDcwOworIHQuc2V2ZW50ZWVucGFyZW4gPSAweDI0ODQ7CisgdC5zZXZlbnRlZW5wZXJpb2QgPSAweDI0OTg7CisgdC5zZXZlbnRoYWkgPSAweDBlNTc7CisgdC5zZnRoeXBoZW4gPSAweDAwYWQ7CisgdC5zaGFhcm1lbmlhbiA9IDB4MDU3NzsKKyB0LnNoYWJlbmdhbGkgPSAweDA5YjY7CisgdC5zaGFjeXJpbGxpYyA9IDB4MDQ0ODsKKyB0LnNoYWRkYWFyYWJpYyA9IDB4MDY1MTsKKyB0LnNoYWRkYWRhbW1hYXJhYmljID0gMHhmYzYxOworIHQuc2hhZGRhZGFtbWF0YW5hcmFiaWMgPSAweGZjNWU7CisgdC5zaGFkZGFmYXRoYWFyYWJpYyA9IDB4ZmM2MDsKKyB0LnNoYWRkYWthc3JhYXJhYmljID0gMHhmYzYyOworIHQuc2hhZGRha2FzcmF0YW5hcmFiaWMgPSAweGZjNWY7CisgdC5zaGFkZSA9IDB4MjU5MjsKKyB0LnNoYWRlZGFyayA9IDB4MjU5MzsKKyB0LnNoYWRlbGlnaHQgPSAweDI1OTE7CisgdC5zaGFkZW1lZGl1bSA9IDB4MjU5MjsKKyB0LnNoYWRldmEgPSAweDA5MzY7CisgdC5zaGFndWphcmF0aSA9IDB4MGFiNjsKKyB0LnNoYWd1cm11a2hpID0gMHgwYTM2OworIHQuc2hhbHNoZWxldGhlYnJldyA9IDB4MDU5MzsKKyB0LnNoYm9wb21vZm8gPSAweDMxMTU7CisgdC5zaGNoYWN5cmlsbGljID0gMHgwNDQ5OworIHQuc2hlZW5hcmFiaWMgPSAweDA2MzQ7CisgdC5zaGVlbmZpbmFsYXJhYmljID0gMHhmZWI2OworIHQuc2hlZW5pbml0aWFsYXJhYmljID0gMHhmZWI3OworIHQuc2hlZW5tZWRpYWxhcmFiaWMgPSAweGZlYjg7CisgdC5zaGVpY29wdGljID0gMHgwM2UzOworIHQuc2hlcWVsID0gMHgyMGFhOworIHQuc2hlcWVsaGVicmV3ID0gMHgyMGFhOworIHQuc2hldmEgPSAweDA1YjA7CisgdC5zaGV2YTExNSA9IDB4MDViMDsKKyB0LnNoZXZhMTUgPSAweDA1YjA7CisgdC5zaGV2YTIyID0gMHgwNWIwOworIHQuc2hldmEyZSA9IDB4MDViMDsKKyB0LnNoZXZhaGVicmV3ID0gMHgwNWIwOworIHQuc2hldmFuYXJyb3doZWJyZXcgPSAweDA1YjA7CisgdC5zaGV2YXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjA7CisgdC5zaGV2YXdpZGVoZWJyZXcgPSAweDA1YjA7CisgdC5zaGhhY3lyaWxsaWMgPSAweDA0YmI7CisgdC5zaGltYWNvcHRpYyA9IDB4MDNlZDsKKyB0LnNoaW4gPSAweDA1ZTk7CisgdC5zaGluZGFnZXNoID0gMHhmYjQ5OworIHQuc2hpbmRhZ2VzaGhlYnJldyA9IDB4ZmI0OTsKKyB0LnNoaW5kYWdlc2hzaGluZG90ID0gMHhmYjJjOworIHQuc2hpbmRhZ2VzaHNoaW5kb3RoZWJyZXcgPSAweGZiMmM7CisgdC5zaGluZGFnZXNoc2luZG90ID0gMHhmYjJkOworIHQuc2hpbmRhZ2VzaHNpbmRvdGhlYnJldyA9IDB4ZmIyZDsKKyB0LnNoaW5kb3RoZWJyZXcgPSAweDA1YzE7CisgdC5zaGluaGVicmV3ID0gMHgwNWU5OworIHQuc2hpbnNoaW5kb3QgPSAweGZiMmE7CisgdC5zaGluc2hpbmRvdGhlYnJldyA9IDB4ZmIyYTsKKyB0LnNoaW5zaW5kb3QgPSAweGZiMmI7CisgdC5zaGluc2luZG90aGVicmV3ID0gMHhmYjJiOworIHQuc2hvb2sgPSAweDAyODI7CisgdC5zaWdtYSA9IDB4MDNjMzsKKyB0LnNpZ21hMSA9IDB4MDNjMjsKKyB0LnNpZ21hZmluYWwgPSAweDAzYzI7CisgdC5zaWdtYWx1bmF0ZXN5bWJvbGdyZWVrID0gMHgwM2YyOworIHQuc2loaXJhZ2FuYSA9IDB4MzA1NzsKKyB0LnNpa2F0YWthbmEgPSAweDMwYjc7CisgdC5zaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdjOworIHQuc2lsdXFoZWJyZXcgPSAweDA1YmQ7CisgdC5zaWx1cWxlZnRoZWJyZXcgPSAweDA1YmQ7CisgdC5zaW1pbGFyID0gMHgyMjNjOworIHQuc2luZG90aGVicmV3ID0gMHgwNWMyOworIHQuc2lvc2FjaXJjbGVrb3JlYW4gPSAweDMyNzQ7CisgdC5zaW9zYXBhcmVua29yZWFuID0gMHgzMjE0OworIHQuc2lvc2NpZXVja29yZWFuID0gMHgzMTdlOworIHQuc2lvc2NpcmNsZWtvcmVhbiA9IDB4MzI2NjsKKyB0LnNpb3NraXllb2trb3JlYW4gPSAweDMxN2E7CisgdC5zaW9za29yZWFuID0gMHgzMTQ1OworIHQuc2lvc25pZXVua29yZWFuID0gMHgzMTdiOworIHQuc2lvc3BhcmVua29yZWFuID0gMHgzMjA2OworIHQuc2lvc3BpZXVwa29yZWFuID0gMHgzMTdkOworIHQuc2lvc3Rpa2V1dGtvcmVhbiA9IDB4MzE3YzsKKyB0LnNpeCA9IDB4MDAzNjsKKyB0LnNpeGFyYWJpYyA9IDB4MDY2NjsKKyB0LnNpeGJlbmdhbGkgPSAweDA5ZWM7CisgdC5zaXhjaXJjbGUgPSAweDI0NjU7CisgdC5zaXhjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhmOworIHQuc2l4ZGV2YSA9IDB4MDk2YzsKKyB0LnNpeGd1amFyYXRpID0gMHgwYWVjOworIHQuc2l4Z3VybXVraGkgPSAweDBhNmM7CisgdC5zaXhoYWNrYXJhYmljID0gMHgwNjY2OworIHQuc2l4aGFuZ3pob3UgPSAweDMwMjY7CisgdC5zaXhpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI1OworIHQuc2l4aW5mZXJpb3IgPSAweDIwODY7CisgdC5zaXhtb25vc3BhY2UgPSAweGZmMTY7CisgdC5zaXhvbGRzdHlsZSA9IDB4ZjczNjsKKyB0LnNpeHBhcmVuID0gMHgyNDc5OworIHQuc2l4cGVyaW9kID0gMHgyNDhkOworIHQuc2l4cGVyc2lhbiA9IDB4MDZmNjsKKyB0LnNpeHJvbWFuID0gMHgyMTc1OworIHQuc2l4c3VwZXJpb3IgPSAweDIwNzY7CisgdC5zaXh0ZWVuY2lyY2xlID0gMHgyNDZmOworIHQuc2l4dGVlbmN1cnJlbmN5ZGVub21pbmF0b3JiZW5nYWxpID0gMHgwOWY5OworIHQuc2l4dGVlbnBhcmVuID0gMHgyNDgzOworIHQuc2l4dGVlbnBlcmlvZCA9IDB4MjQ5NzsKKyB0LnNpeHRoYWkgPSAweDBlNTY7CisgdC5zbGFzaCA9IDB4MDAyZjsKKyB0LnNsYXNobW9ub3NwYWNlID0gMHhmZjBmOworIHQuc2xvbmcgPSAweDAxN2Y7CisgdC5zbG9uZ2RvdGFjY2VudCA9IDB4MWU5YjsKKyB0LnNtaWxlZmFjZSA9IDB4MjYzYTsKKyB0LnNtb25vc3BhY2UgPSAweGZmNTM7CisgdC5zb2ZwYXN1cWhlYnJldyA9IDB4MDVjMzsKKyB0LnNvZnRoeXBoZW4gPSAweDAwYWQ7CisgdC5zb2Z0c2lnbmN5cmlsbGljID0gMHgwNDRjOworIHQuc29oaXJhZ2FuYSA9IDB4MzA1ZDsKKyB0LnNva2F0YWthbmEgPSAweDMwYmQ7CisgdC5zb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjdmOworIHQuc29saWR1c2xvbmdvdmVybGF5Y21iID0gMHgwMzM4OworIHQuc29saWR1c3Nob3J0b3ZlcmxheWNtYiA9IDB4MDMzNzsKKyB0LnNvcnVzaXRoYWkgPSAweDBlMjk7CisgdC5zb3NhbGF0aGFpID0gMHgwZTI4OworIHQuc29zb3RoYWkgPSAweDBlMGI7CisgdC5zb3N1YXRoYWkgPSAweDBlMmE7CisgdC5zcGFjZSA9IDB4MDAyMDsKKyB0LnNwYWNlaGFja2FyYWJpYyA9IDB4MDAyMDsKKyB0LnNwYWRlID0gMHgyNjYwOworIHQuc3BhZGVzdWl0YmxhY2sgPSAweDI2NjA7CisgdC5zcGFkZXN1aXR3aGl0ZSA9IDB4MjY2NDsKKyB0LnNwYXJlbiA9IDB4MjRhZTsKKyB0LnNxdWFyZWJlbG93Y21iID0gMHgwMzNiOworIHQuc3F1YXJlY2MgPSAweDMzYzQ7CisgdC5zcXVhcmVjbSA9IDB4MzM5ZDsKKyB0LnNxdWFyZWRpYWdvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTk7CisgdC5zcXVhcmVob3Jpem9udGFsZmlsbCA9IDB4MjVhNDsKKyB0LnNxdWFyZWtnID0gMHgzMzhmOworIHQuc3F1YXJla20gPSAweDMzOWU7CisgdC5zcXVhcmVrbWNhcGl0YWwgPSAweDMzY2U7CisgdC5zcXVhcmVsbiA9IDB4MzNkMTsKKyB0LnNxdWFyZWxvZyA9IDB4MzNkMjsKKyB0LnNxdWFyZW1nID0gMHgzMzhlOworIHQuc3F1YXJlbWlsID0gMHgzM2Q1OworIHQuc3F1YXJlbW0gPSAweDMzOWM7CisgdC5zcXVhcmVtc3F1YXJlZCA9IDB4MzNhMTsKKyB0LnNxdWFyZW9ydGhvZ29uYWxjcm9zc2hhdGNoZmlsbCA9IDB4MjVhNjsKKyB0LnNxdWFyZXVwcGVybGVmdHRvbG93ZXJyaWdodGZpbGwgPSAweDI1YTc7CisgdC5zcXVhcmV1cHBlcnJpZ2h0dG9sb3dlcmxlZnRmaWxsID0gMHgyNWE4OworIHQuc3F1YXJldmVydGljYWxmaWxsID0gMHgyNWE1OworIHQuc3F1YXJld2hpdGV3aXRoc21hbGxibGFjayA9IDB4MjVhMzsKKyB0LnNyc3F1YXJlID0gMHgzM2RiOworIHQuc3NhYmVuZ2FsaSA9IDB4MDliNzsKKyB0LnNzYWRldmEgPSAweDA5Mzc7CisgdC5zc2FndWphcmF0aSA9IDB4MGFiNzsKKyB0LnNzYW5nY2lldWNrb3JlYW4gPSAweDMxNDk7CisgdC5zc2FuZ2hpZXVoa29yZWFuID0gMHgzMTg1OworIHQuc3NhbmdpZXVuZ2tvcmVhbiA9IDB4MzE4MDsKKyB0LnNzYW5na2l5ZW9ra29yZWFuID0gMHgzMTMyOworIHQuc3NhbmduaWV1bmtvcmVhbiA9IDB4MzE2NTsKKyB0LnNzYW5ncGlldXBrb3JlYW4gPSAweDMxNDM7CisgdC5zc2FuZ3Npb3Nrb3JlYW4gPSAweDMxNDY7CisgdC5zc2FuZ3Rpa2V1dGtvcmVhbiA9IDB4MzEzODsKKyB0LnNzdXBlcmlvciA9IDB4ZjZmMjsKKyB0LnN0ZXJsaW5nID0gMHgwMGEzOworIHQuc3Rlcmxpbmdtb25vc3BhY2UgPSAweGZmZTE7CisgdC5zdHJva2Vsb25nb3ZlcmxheWNtYiA9IDB4MDMzNjsKKyB0LnN0cm9rZXNob3J0b3ZlcmxheWNtYiA9IDB4MDMzNTsKKyB0LnN1YnNldCA9IDB4MjI4MjsKKyB0LnN1YnNldG5vdGVxdWFsID0gMHgyMjhhOworIHQuc3Vic2V0b3JlcXVhbCA9IDB4MjI4NjsKKyB0LnN1Y2NlZWRzID0gMHgyMjdiOworIHQuc3VjaHRoYXQgPSAweDIyMGI7CisgdC5zdWhpcmFnYW5hID0gMHgzMDU5OworIHQuc3VrYXRha2FuYSA9IDB4MzBiOTsKKyB0LnN1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2Q7CisgdC5zdWt1bmFyYWJpYyA9IDB4MDY1MjsKKyB0LnN1bW1hdGlvbiA9IDB4MjIxMTsKKyB0LnN1biA9IDB4MjYzYzsKKyB0LnN1cGVyc2V0ID0gMHgyMjgzOworIHQuc3VwZXJzZXRub3RlcXVhbCA9IDB4MjI4YjsKKyB0LnN1cGVyc2V0b3JlcXVhbCA9IDB4MjI4NzsKKyB0LnN2c3F1YXJlID0gMHgzM2RjOworIHQuc3lvdXdhZXJhc3F1YXJlID0gMHgzMzdjOworIHQudCA9IDB4MDA3NDsKKyB0LnRhYmVuZ2FsaSA9IDB4MDlhNDsKKyB0LnRhY2tkb3duID0gMHgyMmE0OworIHQudGFja2xlZnQgPSAweDIyYTM7CisgdC50YWRldmEgPSAweDA5MjQ7CisgdC50YWd1amFyYXRpID0gMHgwYWE0OworIHQudGFndXJtdWtoaSA9IDB4MGEyNDsKKyB0LnRhaGFyYWJpYyA9IDB4MDYzNzsKKyB0LnRhaGZpbmFsYXJhYmljID0gMHhmZWMyOworIHQudGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjMzsKKyB0LnRhaGlyYWdhbmEgPSAweDMwNWY7CisgdC50YWhtZWRpYWxhcmFiaWMgPSAweGZlYzQ7CisgdC50YWlzeW91ZXJhc3F1YXJlID0gMHgzMzdkOworIHQudGFrYXRha2FuYSA9IDB4MzBiZjsKKyB0LnRha2F0YWthbmFoYWxmd2lkdGggPSAweGZmODA7CisgdC50YXR3ZWVsYXJhYmljID0gMHgwNjQwOworIHQudGF1ID0gMHgwM2M0OworIHQudGF2ID0gMHgwNWVhOworIHQudGF2ZGFnZXMgPSAweGZiNGE7CisgdC50YXZkYWdlc2ggPSAweGZiNGE7CisgdC50YXZkYWdlc2hoZWJyZXcgPSAweGZiNGE7CisgdC50YXZoZWJyZXcgPSAweDA1ZWE7CisgdC50YmFyID0gMHgwMTY3OworIHQudGJvcG9tb2ZvID0gMHgzMTBhOworIHQudGNhcm9uID0gMHgwMTY1OworIHQudGNjdXJsID0gMHgwMmE4OworIHQudGNlZGlsbGEgPSAweDAxNjM7CisgdC50Y2hlaGFyYWJpYyA9IDB4MDY4NjsKKyB0LnRjaGVoZmluYWxhcmFiaWMgPSAweGZiN2I7CisgdC50Y2hlaGluaXRpYWxhcmFiaWMgPSAweGZiN2M7CisgdC50Y2hlaG1lZGlhbGFyYWJpYyA9IDB4ZmI3ZDsKKyB0LnRjaXJjbGUgPSAweDI0ZTM7CisgdC50Y2lyY3VtZmxleGJlbG93ID0gMHgxZTcxOworIHQudGNvbW1hYWNjZW50ID0gMHgwMTYzOworIHQudGRpZXJlc2lzID0gMHgxZTk3OworIHQudGRvdGFjY2VudCA9IDB4MWU2YjsKKyB0LnRkb3RiZWxvdyA9IDB4MWU2ZDsKKyB0LnRlY3lyaWxsaWMgPSAweDA0NDI7CisgdC50ZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGFkOworIHQudGVoYXJhYmljID0gMHgwNjJhOworIHQudGVoZmluYWxhcmFiaWMgPSAweGZlOTY7CisgdC50ZWhoYWhpbml0aWFsYXJhYmljID0gMHhmY2EyOworIHQudGVoaGFoaXNvbGF0ZWRhcmFiaWMgPSAweGZjMGM7CisgdC50ZWhpbml0aWFsYXJhYmljID0gMHhmZTk3OworIHQudGVoaXJhZ2FuYSA9IDB4MzA2NjsKKyB0LnRlaGplZW1pbml0aWFsYXJhYmljID0gMHhmY2ExOworIHQudGVoamVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzBiOworIHQudGVobWFyYnV0YWFyYWJpYyA9IDB4MDYyOTsKKyB0LnRlaG1hcmJ1dGFmaW5hbGFyYWJpYyA9IDB4ZmU5NDsKKyB0LnRlaG1lZGlhbGFyYWJpYyA9IDB4ZmU5ODsKKyB0LnRlaG1lZW1pbml0aWFsYXJhYmljID0gMHhmY2E0OworIHQudGVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzBlOworIHQudGVobm9vbmZpbmFsYXJhYmljID0gMHhmYzczOworIHQudGVrYXRha2FuYSA9IDB4MzBjNjsKKyB0LnRla2F0YWthbmFoYWxmd2lkdGggPSAweGZmODM7CisgdC50ZWxlcGhvbmUgPSAweDIxMjE7CisgdC50ZWxlcGhvbmVibGFjayA9IDB4MjYwZTsKKyB0LnRlbGlzaGFnZWRvbGFoZWJyZXcgPSAweDA1YTA7CisgdC50ZWxpc2hhcWV0YW5haGVicmV3ID0gMHgwNWE5OworIHQudGVuY2lyY2xlID0gMHgyNDY5OworIHQudGVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyOTsKKyB0LnRlbnBhcmVuID0gMHgyNDdkOworIHQudGVucGVyaW9kID0gMHgyNDkxOworIHQudGVucm9tYW4gPSAweDIxNzk7CisgdC50ZXNoID0gMHgwMmE3OworIHQudGV0ID0gMHgwNWQ4OworIHQudGV0ZGFnZXNoID0gMHhmYjM4OworIHQudGV0ZGFnZXNoaGVicmV3ID0gMHhmYjM4OworIHQudGV0aGVicmV3ID0gMHgwNWQ4OworIHQudGV0c2VjeXJpbGxpYyA9IDB4MDRiNTsKKyB0LnRldmlyaGVicmV3ID0gMHgwNTliOworIHQudGV2aXJsZWZ0aGVicmV3ID0gMHgwNTliOworIHQudGhhYmVuZ2FsaSA9IDB4MDlhNTsKKyB0LnRoYWRldmEgPSAweDA5MjU7CisgdC50aGFndWphcmF0aSA9IDB4MGFhNTsKKyB0LnRoYWd1cm11a2hpID0gMHgwYTI1OworIHQudGhhbGFyYWJpYyA9IDB4MDYzMDsKKyB0LnRoYWxmaW5hbGFyYWJpYyA9IDB4ZmVhYzsKKyB0LnRoYW50aGFraGF0bG93bGVmdHRoYWkgPSAweGY4OTg7CisgdC50aGFudGhha2hhdGxvd3JpZ2h0dGhhaSA9IDB4Zjg5NzsKKyB0LnRoYW50aGFraGF0dGhhaSA9IDB4MGU0YzsKKyB0LnRoYW50aGFraGF0dXBwZXJsZWZ0dGhhaSA9IDB4Zjg5NjsKKyB0LnRoZWhhcmFiaWMgPSAweDA2MmI7CisgdC50aGVoZmluYWxhcmFiaWMgPSAweGZlOWE7CisgdC50aGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5YjsKKyB0LnRoZWhtZWRpYWxhcmFiaWMgPSAweGZlOWM7CisgdC50aGVyZWV4aXN0cyA9IDB4MjIwMzsKKyB0LnRoZXJlZm9yZSA9IDB4MjIzNDsKKyB0LnRoZXRhID0gMHgwM2I4OworIHQudGhldGExID0gMHgwM2QxOworIHQudGhldGFzeW1ib2xncmVlayA9IDB4MDNkMTsKKyB0LnRoaWV1dGhhY2lyY2xla29yZWFuID0gMHgzMjc5OworIHQudGhpZXV0aGFwYXJlbmtvcmVhbiA9IDB4MzIxOTsKKyB0LnRoaWV1dGhjaXJjbGVrb3JlYW4gPSAweDMyNmI7CisgdC50aGlldXRoa29yZWFuID0gMHgzMTRjOworIHQudGhpZXV0aHBhcmVua29yZWFuID0gMHgzMjBiOworIHQudGhpcnRlZW5jaXJjbGUgPSAweDI0NmM7CisgdC50aGlydGVlbnBhcmVuID0gMHgyNDgwOworIHQudGhpcnRlZW5wZXJpb2QgPSAweDI0OTQ7CisgdC50aG9uYW5nbW9udGhvdGhhaSA9IDB4MGUxMTsKKyB0LnRob29rID0gMHgwMWFkOworIHQudGhvcGh1dGhhb3RoYWkgPSAweDBlMTI7CisgdC50aG9ybiA9IDB4MDBmZTsKKyB0LnRob3RoYWhhbnRoYWkgPSAweDBlMTc7CisgdC50aG90aGFudGhhaSA9IDB4MGUxMDsKKyB0LnRob3Rob25ndGhhaSA9IDB4MGUxODsKKyB0LnRob3RodW5ndGhhaSA9IDB4MGUxNjsKKyB0LnRob3VzYW5kY3lyaWxsaWMgPSAweDA0ODI7CisgdC50aG91c2FuZHNzZXBhcmF0b3JhcmFiaWMgPSAweDA2NmM7CisgdC50aG91c2FuZHNzZXBhcmF0b3JwZXJzaWFuID0gMHgwNjZjOworIHQudGhyZWUgPSAweDAwMzM7CisgdC50aHJlZWFyYWJpYyA9IDB4MDY2MzsKKyB0LnRocmVlYmVuZ2FsaSA9IDB4MDllOTsKKyB0LnRocmVlY2lyY2xlID0gMHgyNDYyOworIHQudGhyZWVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhjOworIHQudGhyZWVkZXZhID0gMHgwOTY5OworIHQudGhyZWVlaWdodGhzID0gMHgyMTVjOworIHQudGhyZWVndWphcmF0aSA9IDB4MGFlOTsKKyB0LnRocmVlZ3VybXVraGkgPSAweDBhNjk7CisgdC50aHJlZWhhY2thcmFiaWMgPSAweDA2NjM7CisgdC50aHJlZWhhbmd6aG91ID0gMHgzMDIzOworIHQudGhyZWVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIyOworIHQudGhyZWVpbmZlcmlvciA9IDB4MjA4MzsKKyB0LnRocmVlbW9ub3NwYWNlID0gMHhmZjEzOworIHQudGhyZWVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY2OworIHQudGhyZWVvbGRzdHlsZSA9IDB4ZjczMzsKKyB0LnRocmVlcGFyZW4gPSAweDI0NzY7CisgdC50aHJlZXBlcmlvZCA9IDB4MjQ4YTsKKyB0LnRocmVlcGVyc2lhbiA9IDB4MDZmMzsKKyB0LnRocmVlcXVhcnRlcnMgPSAweDAwYmU7CisgdC50aHJlZXF1YXJ0ZXJzZW1kYXNoID0gMHhmNmRlOworIHQudGhyZWVyb21hbiA9IDB4MjE3MjsKKyB0LnRocmVlc3VwZXJpb3IgPSAweDAwYjM7CisgdC50aHJlZXRoYWkgPSAweDBlNTM7CisgdC50aHpzcXVhcmUgPSAweDMzOTQ7CisgdC50aWhpcmFnYW5hID0gMHgzMDYxOworIHQudGlrYXRha2FuYSA9IDB4MzBjMTsKKyB0LnRpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmODE7CisgdC50aWtldXRhY2lyY2xla29yZWFuID0gMHgzMjcwOworIHQudGlrZXV0YXBhcmVua29yZWFuID0gMHgzMjEwOworIHQudGlrZXV0Y2lyY2xla29yZWFuID0gMHgzMjYyOworIHQudGlrZXV0a29yZWFuID0gMHgzMTM3OworIHQudGlrZXV0cGFyZW5rb3JlYW4gPSAweDMyMDI7CisgdC50aWxkZSA9IDB4MDJkYzsKKyB0LnRpbGRlYmVsb3djbWIgPSAweDAzMzA7CisgdC50aWxkZWNtYiA9IDB4MDMwMzsKKyB0LnRpbGRlY29tYiA9IDB4MDMwMzsKKyB0LnRpbGRlZG91YmxlY21iID0gMHgwMzYwOworIHQudGlsZGVvcGVyYXRvciA9IDB4MjIzYzsKKyB0LnRpbGRlb3ZlcmxheWNtYiA9IDB4MDMzNDsKKyB0LnRpbGRldmVydGljYWxjbWIgPSAweDAzM2U7CisgdC50aW1lc2NpcmNsZSA9IDB4MjI5NzsKKyB0LnRpcGVoYWhlYnJldyA9IDB4MDU5NjsKKyB0LnRpcGVoYWxlZnRoZWJyZXcgPSAweDA1OTY7CisgdC50aXBwaWd1cm11a2hpID0gMHgwYTcwOworIHQudGl0bG9jeXJpbGxpY2NtYiA9IDB4MDQ4MzsKKyB0LnRpd25hcm1lbmlhbiA9IDB4MDU3ZjsKKyB0LnRsaW5lYmVsb3cgPSAweDFlNmY7CisgdC50bW9ub3NwYWNlID0gMHhmZjU0OworIHQudG9hcm1lbmlhbiA9IDB4MDU2OTsKKyB0LnRvaGlyYWdhbmEgPSAweDMwNjg7CisgdC50b2thdGFrYW5hID0gMHgzMGM4OworIHQudG9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NDsKKyB0LnRvbmViYXJleHRyYWhpZ2htb2QgPSAweDAyZTU7CisgdC50b25lYmFyZXh0cmFsb3dtb2QgPSAweDAyZTk7CisgdC50b25lYmFyaGlnaG1vZCA9IDB4MDJlNjsKKyB0LnRvbmViYXJsb3dtb2QgPSAweDAyZTg7CisgdC50b25lYmFybWlkbW9kID0gMHgwMmU3OworIHQudG9uZWZpdmUgPSAweDAxYmQ7CisgdC50b25lc2l4ID0gMHgwMTg1OworIHQudG9uZXR3byA9IDB4MDFhODsKKyB0LnRvbm9zID0gMHgwMzg0OworIHQudG9uc3F1YXJlID0gMHgzMzI3OworIHQudG9wYXRha3RoYWkgPSAweDBlMGY7CisgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQgPSAweDMwMTQ7CisgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnRzbWFsbCA9IDB4ZmU1ZDsKKyB0LnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTM5OworIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxNTsKKyB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHRzbWFsbCA9IDB4ZmU1ZTsKKyB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYTsKKyB0LnRvdGFvdGhhaSA9IDB4MGUxNTsKKyB0LnRwYWxhdGFsaG9vayA9IDB4MDFhYjsKKyB0LnRwYXJlbiA9IDB4MjRhZjsKKyB0LnRyYWRlbWFyayA9IDB4MjEyMjsKKyB0LnRyYWRlbWFya3NhbnMgPSAweGY4ZWE7CisgdC50cmFkZW1hcmtzZXJpZiA9IDB4ZjZkYjsKKyB0LnRyZXRyb2ZsZXhob29rID0gMHgwMjg4OworIHQudHJpYWdkbiA9IDB4MjViYzsKKyB0LnRyaWFnbGYgPSAweDI1YzQ7CisgdC50cmlhZ3J0ID0gMHgyNWJhOworIHQudHJpYWd1cCA9IDB4MjViMjsKKyB0LnRzID0gMHgwMmE2OworIHQudHNhZGkgPSAweDA1ZTY7CisgdC50c2FkaWRhZ2VzaCA9IDB4ZmI0NjsKKyB0LnRzYWRpZGFnZXNoaGVicmV3ID0gMHhmYjQ2OworIHQudHNhZGloZWJyZXcgPSAweDA1ZTY7CisgdC50c2VjeXJpbGxpYyA9IDB4MDQ0NjsKKyB0LnRzZXJlID0gMHgwNWI1OworIHQudHNlcmUxMiA9IDB4MDViNTsKKyB0LnRzZXJlMWUgPSAweDA1YjU7CisgdC50c2VyZTJiID0gMHgwNWI1OworIHQudHNlcmVoZWJyZXcgPSAweDA1YjU7CisgdC50c2VyZW5hcnJvd2hlYnJldyA9IDB4MDViNTsKKyB0LnRzZXJlcXVhcnRlcmhlYnJldyA9IDB4MDViNTsKKyB0LnRzZXJld2lkZWhlYnJldyA9IDB4MDViNTsKKyB0LnRzaGVjeXJpbGxpYyA9IDB4MDQ1YjsKKyB0LnRzdXBlcmlvciA9IDB4ZjZmMzsKKyB0LnR0YWJlbmdhbGkgPSAweDA5OWY7CisgdC50dGFkZXZhID0gMHgwOTFmOworIHQudHRhZ3VqYXJhdGkgPSAweDBhOWY7CisgdC50dGFndXJtdWtoaSA9IDB4MGExZjsKKyB0LnR0ZWhhcmFiaWMgPSAweDA2Nzk7CisgdC50dGVoZmluYWxhcmFiaWMgPSAweGZiNjc7CisgdC50dGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI2ODsKKyB0LnR0ZWhtZWRpYWxhcmFiaWMgPSAweGZiNjk7CisgdC50dGhhYmVuZ2FsaSA9IDB4MDlhMDsKKyB0LnR0aGFkZXZhID0gMHgwOTIwOworIHQudHRoYWd1amFyYXRpID0gMHgwYWEwOworIHQudHRoYWd1cm11a2hpID0gMHgwYTIwOworIHQudHR1cm5lZCA9IDB4MDI4NzsKKyB0LnR1aGlyYWdhbmEgPSAweDMwNjQ7CisgdC50dWthdGFrYW5hID0gMHgzMGM0OworIHQudHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MjsKKyB0LnR1c21hbGxoaXJhZ2FuYSA9IDB4MzA2MzsKKyB0LnR1c21hbGxrYXRha2FuYSA9IDB4MzBjMzsKKyB0LnR1c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ZjsKKyB0LnR3ZWx2ZWNpcmNsZSA9IDB4MjQ2YjsKKyB0LnR3ZWx2ZXBhcmVuID0gMHgyNDdmOworIHQudHdlbHZlcGVyaW9kID0gMHgyNDkzOworIHQudHdlbHZlcm9tYW4gPSAweDIxN2I7CisgdC50d2VudHljaXJjbGUgPSAweDI0NzM7CisgdC50d2VudHloYW5nemhvdSA9IDB4NTM0NDsKKyB0LnR3ZW50eXBhcmVuID0gMHgyNDg3OworIHQudHdlbnR5cGVyaW9kID0gMHgyNDliOworIHQudHdvID0gMHgwMDMyOworIHQudHdvYXJhYmljID0gMHgwNjYyOworIHQudHdvYmVuZ2FsaSA9IDB4MDllODsKKyB0LnR3b2NpcmNsZSA9IDB4MjQ2MTsKKyB0LnR3b2NpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGI7CisgdC50d29kZXZhID0gMHgwOTY4OworIHQudHdvZG90ZW5sZWFkZXIgPSAweDIwMjU7CisgdC50d29kb3RsZWFkZXIgPSAweDIwMjU7CisgdC50d29kb3RsZWFkZXJ2ZXJ0aWNhbCA9IDB4ZmUzMDsKKyB0LnR3b2d1amFyYXRpID0gMHgwYWU4OworIHQudHdvZ3VybXVraGkgPSAweDBhNjg7CisgdC50d29oYWNrYXJhYmljID0gMHgwNjYyOworIHQudHdvaGFuZ3pob3UgPSAweDMwMjI7CisgdC50d29pZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIxOworIHQudHdvaW5mZXJpb3IgPSAweDIwODI7CisgdC50d29tb25vc3BhY2UgPSAweGZmMTI7CisgdC50d29udW1lcmF0b3JiZW5nYWxpID0gMHgwOWY1OworIHQudHdvb2xkc3R5bGUgPSAweGY3MzI7CisgdC50d29wYXJlbiA9IDB4MjQ3NTsKKyB0LnR3b3BlcmlvZCA9IDB4MjQ4OTsKKyB0LnR3b3BlcnNpYW4gPSAweDA2ZjI7CisgdC50d29yb21hbiA9IDB4MjE3MTsKKyB0LnR3b3N0cm9rZSA9IDB4MDFiYjsKKyB0LnR3b3N1cGVyaW9yID0gMHgwMGIyOworIHQudHdvdGhhaSA9IDB4MGU1MjsKKyB0LnR3b3RoaXJkcyA9IDB4MjE1NDsKKyB0LnUgPSAweDAwNzU7CisgdC51YWN1dGUgPSAweDAwZmE7CisgdC51YmFyID0gMHgwMjg5OworIHQudWJlbmdhbGkgPSAweDA5ODk7CisgdC51Ym9wb21vZm8gPSAweDMxMjg7CisgdC51YnJldmUgPSAweDAxNmQ7CisgdC51Y2Fyb24gPSAweDAxZDQ7CisgdC51Y2lyY2xlID0gMHgyNGU0OworIHQudWNpcmN1bWZsZXggPSAweDAwZmI7CisgdC51Y2lyY3VtZmxleGJlbG93ID0gMHgxZTc3OworIHQudWN5cmlsbGljID0gMHgwNDQzOworIHQudWRhdHRhZGV2YSA9IDB4MDk1MTsKKyB0LnVkYmxhY3V0ZSA9IDB4MDE3MTsKKyB0LnVkYmxncmF2ZSA9IDB4MDIxNTsKKyB0LnVkZXZhID0gMHgwOTA5OworIHQudWRpZXJlc2lzID0gMHgwMGZjOworIHQudWRpZXJlc2lzYWN1dGUgPSAweDAxZDg7CisgdC51ZGllcmVzaXNiZWxvdyA9IDB4MWU3MzsKKyB0LnVkaWVyZXNpc2Nhcm9uID0gMHgwMWRhOworIHQudWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjE7CisgdC51ZGllcmVzaXNncmF2ZSA9IDB4MDFkYzsKKyB0LnVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNjsKKyB0LnVkb3RiZWxvdyA9IDB4MWVlNTsKKyB0LnVncmF2ZSA9IDB4MDBmOTsKKyB0LnVndWphcmF0aSA9IDB4MGE4OTsKKyB0LnVndXJtdWtoaSA9IDB4MGEwOTsKKyB0LnVoaXJhZ2FuYSA9IDB4MzA0NjsKKyB0LnVob29rYWJvdmUgPSAweDFlZTc7CisgdC51aG9ybiA9IDB4MDFiMDsKKyB0LnVob3JuYWN1dGUgPSAweDFlZTk7CisgdC51aG9ybmRvdGJlbG93ID0gMHgxZWYxOworIHQudWhvcm5ncmF2ZSA9IDB4MWVlYjsKKyB0LnVob3JuaG9va2Fib3ZlID0gMHgxZWVkOworIHQudWhvcm50aWxkZSA9IDB4MWVlZjsKKyB0LnVodW5nYXJ1bWxhdXQgPSAweDAxNzE7CisgdC51aHVuZ2FydW1sYXV0Y3lyaWxsaWMgPSAweDA0ZjM7CisgdC51aW52ZXJ0ZWRicmV2ZSA9IDB4MDIxNzsKKyB0LnVrYXRha2FuYSA9IDB4MzBhNjsKKyB0LnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3MzsKKyB0LnVrY3lyaWxsaWMgPSAweDA0Nzk7CisgdC51a29yZWFuID0gMHgzMTVjOworIHQudW1hY3JvbiA9IDB4MDE2YjsKKyB0LnVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZjsKKyB0LnVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YjsKKyB0LnVtYXRyYWd1cm11a2hpID0gMHgwYTQxOworIHQudW1vbm9zcGFjZSA9IDB4ZmY1NTsKKyB0LnVuZGVyc2NvcmUgPSAweDAwNWY7CisgdC51bmRlcnNjb3JlZGJsID0gMHgyMDE3OworIHQudW5kZXJzY29yZW1vbm9zcGFjZSA9IDB4ZmYzZjsKKyB0LnVuZGVyc2NvcmV2ZXJ0aWNhbCA9IDB4ZmUzMzsKKyB0LnVuZGVyc2NvcmV3YXZ5ID0gMHhmZTRmOworIHQudW5pb24gPSAweDIyMmE7CisgdC51bml2ZXJzYWwgPSAweDIyMDA7CisgdC51b2dvbmVrID0gMHgwMTczOworIHQudXBhcmVuID0gMHgyNGIwOworIHQudXBibG9jayA9IDB4MjU4MDsKKyB0LnVwcGVyZG90aGVicmV3ID0gMHgwNWM0OworIHQudXBzaWxvbiA9IDB4MDNjNTsKKyB0LnVwc2lsb25kaWVyZXNpcyA9IDB4MDNjYjsKKyB0LnVwc2lsb25kaWVyZXNpc3Rvbm9zID0gMHgwM2IwOworIHQudXBzaWxvbmxhdGluID0gMHgwMjhhOworIHQudXBzaWxvbnRvbm9zID0gMHgwM2NkOworIHQudXB0YWNrYmVsb3djbWIgPSAweDAzMWQ7CisgdC51cHRhY2ttb2QgPSAweDAyZDQ7CisgdC51cmFndXJtdWtoaSA9IDB4MGE3MzsKKyB0LnVyaW5nID0gMHgwMTZmOworIHQudXNob3J0Y3lyaWxsaWMgPSAweDA0NWU7CisgdC51c21hbGxoaXJhZ2FuYSA9IDB4MzA0NTsKKyB0LnVzbWFsbGthdGFrYW5hID0gMHgzMGE1OworIHQudXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjk7CisgdC51c3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZjsKKyB0LnVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIxOworIHQudXRpbGRlID0gMHgwMTY5OworIHQudXRpbGRlYWN1dGUgPSAweDFlNzk7CisgdC51dGlsZGViZWxvdyA9IDB4MWU3NTsKKyB0LnV1YmVuZ2FsaSA9IDB4MDk4YTsKKyB0LnV1ZGV2YSA9IDB4MDkwYTsKKyB0LnV1Z3VqYXJhdGkgPSAweDBhOGE7CisgdC51dWd1cm11a2hpID0gMHgwYTBhOworIHQudXVtYXRyYWd1cm11a2hpID0gMHgwYTQyOworIHQudXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMyOworIHQudXV2b3dlbHNpZ25kZXZhID0gMHgwOTQyOworIHQudXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMjsKKyB0LnV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMxOworIHQudXZvd2Vsc2lnbmRldmEgPSAweDA5NDE7CisgdC51dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzE7CisgdC52ID0gMHgwMDc2OworIHQudmFkZXZhID0gMHgwOTM1OworIHQudmFndWphcmF0aSA9IDB4MGFiNTsKKyB0LnZhZ3VybXVraGkgPSAweDBhMzU7CisgdC52YWthdGFrYW5hID0gMHgzMGY3OworIHQudmF2ID0gMHgwNWQ1OworIHQudmF2ZGFnZXNoID0gMHhmYjM1OworIHQudmF2ZGFnZXNoNjUgPSAweGZiMzU7CisgdC52YXZkYWdlc2hoZWJyZXcgPSAweGZiMzU7CisgdC52YXZoZWJyZXcgPSAweDA1ZDU7CisgdC52YXZob2xhbSA9IDB4ZmI0YjsKKyB0LnZhdmhvbGFtaGVicmV3ID0gMHhmYjRiOworIHQudmF2dmF2aGVicmV3ID0gMHgwNWYwOworIHQudmF2eW9kaGVicmV3ID0gMHgwNWYxOworIHQudmNpcmNsZSA9IDB4MjRlNTsKKyB0LnZkb3RiZWxvdyA9IDB4MWU3ZjsKKyB0LnZlY3lyaWxsaWMgPSAweDA0MzI7CisgdC52ZWhhcmFiaWMgPSAweDA2YTQ7CisgdC52ZWhmaW5hbGFyYWJpYyA9IDB4ZmI2YjsKKyB0LnZlaGluaXRpYWxhcmFiaWMgPSAweGZiNmM7CisgdC52ZWhtZWRpYWxhcmFiaWMgPSAweGZiNmQ7CisgdC52ZWthdGFrYW5hID0gMHgzMGY5OworIHQudmVudXMgPSAweDI2NDA7CisgdC52ZXJ0aWNhbGJhciA9IDB4MDA3YzsKKyB0LnZlcnRpY2FsbGluZWFib3ZlY21iID0gMHgwMzBkOworIHQudmVydGljYWxsaW5lYmVsb3djbWIgPSAweDAzMjk7CisgdC52ZXJ0aWNhbGxpbmVsb3dtb2QgPSAweDAyY2M7CisgdC52ZXJ0aWNhbGxpbmVtb2QgPSAweDAyYzg7CisgdC52ZXdhcm1lbmlhbiA9IDB4MDU3ZTsKKyB0LnZob29rID0gMHgwMjhiOworIHQudmlrYXRha2FuYSA9IDB4MzBmODsKKyB0LnZpcmFtYWJlbmdhbGkgPSAweDA5Y2Q7CisgdC52aXJhbWFkZXZhID0gMHgwOTRkOworIHQudmlyYW1hZ3VqYXJhdGkgPSAweDBhY2Q7CisgdC52aXNhcmdhYmVuZ2FsaSA9IDB4MDk4MzsKKyB0LnZpc2FyZ2FkZXZhID0gMHgwOTAzOworIHQudmlzYXJnYWd1amFyYXRpID0gMHgwYTgzOworIHQudm1vbm9zcGFjZSA9IDB4ZmY1NjsKKyB0LnZvYXJtZW5pYW4gPSAweDA1Nzg7CisgdC52b2ljZWRpdGVyYXRpb25oaXJhZ2FuYSA9IDB4MzA5ZTsKKyB0LnZvaWNlZGl0ZXJhdGlvbmthdGFrYW5hID0gMHgzMGZlOworIHQudm9pY2VkbWFya2thbmEgPSAweDMwOWI7CisgdC52b2ljZWRtYXJra2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ZTsKKyB0LnZva2F0YWthbmEgPSAweDMwZmE7CisgdC52cGFyZW4gPSAweDI0YjE7CisgdC52dGlsZGUgPSAweDFlN2Q7CisgdC52dHVybmVkID0gMHgwMjhjOworIHQudnVoaXJhZ2FuYSA9IDB4MzA5NDsKKyB0LnZ1a2F0YWthbmEgPSAweDMwZjQ7CisgdC53ID0gMHgwMDc3OworIHQud2FjdXRlID0gMHgxZTgzOworIHQud2Fla29yZWFuID0gMHgzMTU5OworIHQud2FoaXJhZ2FuYSA9IDB4MzA4ZjsKKyB0Lndha2F0YWthbmEgPSAweDMwZWY7CisgdC53YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjljOworIHQud2Frb3JlYW4gPSAweDMxNTg7CisgdC53YXNtYWxsaGlyYWdhbmEgPSAweDMwOGU7CisgdC53YXNtYWxsa2F0YWthbmEgPSAweDMwZWU7CisgdC53YXR0b3NxdWFyZSA9IDB4MzM1NzsKKyB0LndhdmVkYXNoID0gMHgzMDFjOworIHQud2F2eXVuZGVyc2NvcmV2ZXJ0aWNhbCA9IDB4ZmUzNDsKKyB0Lndhd2FyYWJpYyA9IDB4MDY0ODsKKyB0Lndhd2ZpbmFsYXJhYmljID0gMHhmZWVlOworIHQud2F3aGFtemFhYm92ZWFyYWJpYyA9IDB4MDYyNDsKKyB0Lndhd2hhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NjsKKyB0Lndic3F1YXJlID0gMHgzM2RkOworIHQud2NpcmNsZSA9IDB4MjRlNjsKKyB0LndjaXJjdW1mbGV4ID0gMHgwMTc1OworIHQud2RpZXJlc2lzID0gMHgxZTg1OworIHQud2RvdGFjY2VudCA9IDB4MWU4NzsKKyB0Lndkb3RiZWxvdyA9IDB4MWU4OTsKKyB0LndlaGlyYWdhbmEgPSAweDMwOTE7CisgdC53ZWllcnN0cmFzcyA9IDB4MjExODsKKyB0Lndla2F0YWthbmEgPSAweDMwZjE7CisgdC53ZWtvcmVhbiA9IDB4MzE1ZTsKKyB0Lndlb2tvcmVhbiA9IDB4MzE1ZDsKKyB0LndncmF2ZSA9IDB4MWU4MTsKKyB0LndoaXRlYnVsbGV0ID0gMHgyNWU2OworIHQud2hpdGVjaXJjbGUgPSAweDI1Y2I7CisgdC53aGl0ZWNpcmNsZWludmVyc2UgPSAweDI1ZDk7CisgdC53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0ID0gMHgzMDBlOworIHQud2hpdGVjb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTQzOworIHQud2hpdGVjb3JuZXJicmFja2V0cmlnaHQgPSAweDMwMGY7CisgdC53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQ0OworIHQud2hpdGVkaWFtb25kID0gMHgyNWM3OworIHQud2hpdGVkaWFtb25kY29udGFpbmluZ2JsYWNrc21hbGxkaWFtb25kID0gMHgyNWM4OworIHQud2hpdGVkb3ducG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWJmOworIHQud2hpdGVkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViZDsKKyB0LndoaXRlbGVmdHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjVjMzsKKyB0LndoaXRlbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzE7CisgdC53aGl0ZWxlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxNjsKKyB0LndoaXRlbGVudGljdWxhcmJyYWNrZXRyaWdodCA9IDB4MzAxNzsKKyB0LndoaXRlcmlnaHRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1Yjk7CisgdC53aGl0ZXJpZ2h0cG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViNzsKKyB0LndoaXRlc21hbGxzcXVhcmUgPSAweDI1YWI7CisgdC53aGl0ZXNtaWxpbmdmYWNlID0gMHgyNjNhOworIHQud2hpdGVzcXVhcmUgPSAweDI1YTE7CisgdC53aGl0ZXN0YXIgPSAweDI2MDY7CisgdC53aGl0ZXRlbGVwaG9uZSA9IDB4MjYwZjsKKyB0LndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0ID0gMHgzMDE4OworIHQud2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0ID0gMHgzMDE5OworIHQud2hpdGV1cHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViNTsKKyB0LndoaXRldXBwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWIzOworIHQud2loaXJhZ2FuYSA9IDB4MzA5MDsKKyB0Lndpa2F0YWthbmEgPSAweDMwZjA7CisgdC53aWtvcmVhbiA9IDB4MzE1ZjsKKyB0Lndtb25vc3BhY2UgPSAweGZmNTc7CisgdC53b2hpcmFnYW5hID0gMHgzMDkyOworIHQud29rYXRha2FuYSA9IDB4MzBmMjsKKyB0Lndva2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjY7CisgdC53b24gPSAweDIwYTk7CisgdC53b25tb25vc3BhY2UgPSAweGZmZTY7CisgdC53b3dhZW50aGFpID0gMHgwZTI3OworIHQud3BhcmVuID0gMHgyNGIyOworIHQud3JpbmcgPSAweDFlOTg7CisgdC53c3VwZXJpb3IgPSAweDAyYjc7CisgdC53dHVybmVkID0gMHgwMjhkOworIHQud3lubiA9IDB4MDFiZjsKKyB0LnggPSAweDAwNzg7CisgdC54YWJvdmVjbWIgPSAweDAzM2Q7CisgdC54Ym9wb21vZm8gPSAweDMxMTI7CisgdC54Y2lyY2xlID0gMHgyNGU3OworIHQueGRpZXJlc2lzID0gMHgxZThkOworIHQueGRvdGFjY2VudCA9IDB4MWU4YjsKKyB0LnhlaGFybWVuaWFuID0gMHgwNTZkOworIHQueGkgPSAweDAzYmU7CisgdC54bW9ub3NwYWNlID0gMHhmZjU4OworIHQueHBhcmVuID0gMHgyNGIzOworIHQueHN1cGVyaW9yID0gMHgwMmUzOworIHQueSA9IDB4MDA3OTsKKyB0LnlhYWRvc3F1YXJlID0gMHgzMzRlOworIHQueWFiZW5nYWxpID0gMHgwOWFmOworIHQueWFjdXRlID0gMHgwMGZkOworIHQueWFkZXZhID0gMHgwOTJmOworIHQueWFla29yZWFuID0gMHgzMTUyOworIHQueWFndWphcmF0aSA9IDB4MGFhZjsKKyB0LnlhZ3VybXVraGkgPSAweDBhMmY7CisgdC55YWhpcmFnYW5hID0gMHgzMDg0OworIHQueWFrYXRha2FuYSA9IDB4MzBlNDsKKyB0Lnlha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTQ7CisgdC55YWtvcmVhbiA9IDB4MzE1MTsKKyB0LnlhbWFra2FudGhhaSA9IDB4MGU0ZTsKKyB0Lnlhc21hbGxoaXJhZ2FuYSA9IDB4MzA4MzsKKyB0Lnlhc21hbGxrYXRha2FuYSA9IDB4MzBlMzsKKyB0Lnlhc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2YzsKKyB0LnlhdGN5cmlsbGljID0gMHgwNDYzOworIHQueWNpcmNsZSA9IDB4MjRlODsKKyB0LnljaXJjdW1mbGV4ID0gMHgwMTc3OworIHQueWRpZXJlc2lzID0gMHgwMGZmOworIHQueWRvdGFjY2VudCA9IDB4MWU4ZjsKKyB0Lnlkb3RiZWxvdyA9IDB4MWVmNTsKKyB0LnllaGFyYWJpYyA9IDB4MDY0YTsKKyB0LnllaGJhcnJlZWFyYWJpYyA9IDB4MDZkMjsKKyB0LnllaGJhcnJlZWZpbmFsYXJhYmljID0gMHhmYmFmOworIHQueWVoZmluYWxhcmFiaWMgPSAweGZlZjI7CisgdC55ZWhoYW16YWFib3ZlYXJhYmljID0gMHgwNjI2OworIHQueWVoaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZThhOworIHQueWVoaGFtemFhYm92ZWluaXRpYWxhcmFiaWMgPSAweGZlOGI7CisgdC55ZWhoYW16YWFib3ZlbWVkaWFsYXJhYmljID0gMHhmZThjOworIHQueWVoaW5pdGlhbGFyYWJpYyA9IDB4ZmVmMzsKKyB0LnllaG1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKKyB0LnllaG1lZW1pbml0aWFsYXJhYmljID0gMHhmY2RkOworIHQueWVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzU4OworIHQueWVobm9vbmZpbmFsYXJhYmljID0gMHhmYzk0OworIHQueWVodGhyZWVkb3RzYmVsb3dhcmFiaWMgPSAweDA2ZDE7CisgdC55ZWtvcmVhbiA9IDB4MzE1NjsKKyB0LnllbiA9IDB4MDBhNTsKKyB0Lnllbm1vbm9zcGFjZSA9IDB4ZmZlNTsKKyB0Lnllb2tvcmVhbiA9IDB4MzE1NTsKKyB0Lnllb3JpbmhpZXVoa29yZWFuID0gMHgzMTg2OworIHQueWVyYWhiZW55b21vaGVicmV3ID0gMHgwNWFhOworIHQueWVyYWhiZW55b21vbGVmdGhlYnJldyA9IDB4MDVhYTsKKyB0LnllcmljeXJpbGxpYyA9IDB4MDQ0YjsKKyB0LnllcnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY5OworIHQueWVzaWV1bmdrb3JlYW4gPSAweDMxODE7CisgdC55ZXNpZXVuZ3BhbnNpb3Nrb3JlYW4gPSAweDMxODM7CisgdC55ZXNpZXVuZ3Npb3Nrb3JlYW4gPSAweDMxODI7CisgdC55ZXRpdmhlYnJldyA9IDB4MDU5YTsKKyB0LnlncmF2ZSA9IDB4MWVmMzsKKyB0Lnlob29rID0gMHgwMWI0OworIHQueWhvb2thYm92ZSA9IDB4MWVmNzsKKyB0LnlpYXJtZW5pYW4gPSAweDA1NzU7CisgdC55aWN5cmlsbGljID0gMHgwNDU3OworIHQueWlrb3JlYW4gPSAweDMxNjI7CisgdC55aW55YW5nID0gMHgyNjJmOworIHQueWl3bmFybWVuaWFuID0gMHgwNTgyOworIHQueW1vbm9zcGFjZSA9IDB4ZmY1OTsKKyB0LnlvZCA9IDB4MDVkOTsKKyB0LnlvZGRhZ2VzaCA9IDB4ZmIzOTsKKyB0LnlvZGRhZ2VzaGhlYnJldyA9IDB4ZmIzOTsKKyB0LnlvZGhlYnJldyA9IDB4MDVkOTsKKyB0LnlvZHlvZGhlYnJldyA9IDB4MDVmMjsKKyB0LnlvZHlvZHBhdGFoaGVicmV3ID0gMHhmYjFmOworIHQueW9oaXJhZ2FuYSA9IDB4MzA4ODsKKyB0LnlvaWtvcmVhbiA9IDB4MzE4OTsKKyB0Lnlva2F0YWthbmEgPSAweDMwZTg7CisgdC55b2thdGFrYW5haGFsZndpZHRoID0gMHhmZjk2OworIHQueW9rb3JlYW4gPSAweDMxNWI7CisgdC55b3NtYWxsaGlyYWdhbmEgPSAweDMwODc7CisgdC55b3NtYWxsa2F0YWthbmEgPSAweDMwZTc7CisgdC55b3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmU7CisgdC55b3RncmVlayA9IDB4MDNmMzsKKyB0LnlveWFla29yZWFuID0gMHgzMTg4OworIHQueW95YWtvcmVhbiA9IDB4MzE4NzsKKyB0LnlveWFrdGhhaSA9IDB4MGUyMjsKKyB0LnlveWluZ3RoYWkgPSAweDBlMGQ7CisgdC55cGFyZW4gPSAweDI0YjQ7CisgdC55cG9nZWdyYW1tZW5pID0gMHgwMzdhOworIHQueXBvZ2VncmFtbWVuaWdyZWVrY21iID0gMHgwMzQ1OworIHQueXIgPSAweDAxYTY7CisgdC55cmluZyA9IDB4MWU5OTsKKyB0LnlzdXBlcmlvciA9IDB4MDJiODsKKyB0Lnl0aWxkZSA9IDB4MWVmOTsKKyB0Lnl0dXJuZWQgPSAweDAyOGU7CisgdC55dWhpcmFnYW5hID0gMHgzMDg2OworIHQueXVpa29yZWFuID0gMHgzMThjOworIHQueXVrYXRha2FuYSA9IDB4MzBlNjsKKyB0Lnl1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTU7CisgdC55dWtvcmVhbiA9IDB4MzE2MDsKKyB0Lnl1c2JpZ2N5cmlsbGljID0gMHgwNDZiOworIHQueXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ZDsKKyB0Lnl1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY3OworIHQueXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2OTsKKyB0Lnl1c21hbGxoaXJhZ2FuYSA9IDB4MzA4NTsKKyB0Lnl1c21hbGxrYXRha2FuYSA9IDB4MzBlNTsKKyB0Lnl1c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ZDsKKyB0Lnl1eWVrb3JlYW4gPSAweDMxOGI7CisgdC55dXllb2tvcmVhbiA9IDB4MzE4YTsKKyB0Lnl5YWJlbmdhbGkgPSAweDA5ZGY7CisgdC55eWFkZXZhID0gMHgwOTVmOworIHQueiA9IDB4MDA3YTsKKyB0LnphYXJtZW5pYW4gPSAweDA1NjY7CisgdC56YWN1dGUgPSAweDAxN2E7CisgdC56YWRldmEgPSAweDA5NWI7CisgdC56YWd1cm11a2hpID0gMHgwYTViOworIHQuemFoYXJhYmljID0gMHgwNjM4OworIHQuemFoZmluYWxhcmFiaWMgPSAweGZlYzY7CisgdC56YWhpbml0aWFsYXJhYmljID0gMHhmZWM3OworIHQuemFoaXJhZ2FuYSA9IDB4MzA1NjsKKyB0LnphaG1lZGlhbGFyYWJpYyA9IDB4ZmVjODsKKyB0LnphaW5hcmFiaWMgPSAweDA2MzI7CisgdC56YWluZmluYWxhcmFiaWMgPSAweGZlYjA7CisgdC56YWthdGFrYW5hID0gMHgzMGI2OworIHQuemFxZWZnYWRvbGhlYnJldyA9IDB4MDU5NTsKKyB0LnphcWVmcWF0YW5oZWJyZXcgPSAweDA1OTQ7CisgdC56YXJxYWhlYnJldyA9IDB4MDU5ODsKKyB0LnpheWluID0gMHgwNWQ2OworIHQuemF5aW5kYWdlc2ggPSAweGZiMzY7CisgdC56YXlpbmRhZ2VzaGhlYnJldyA9IDB4ZmIzNjsKKyB0LnpheWluaGVicmV3ID0gMHgwNWQ2OworIHQuemJvcG9tb2ZvID0gMHgzMTE3OworIHQuemNhcm9uID0gMHgwMTdlOworIHQuemNpcmNsZSA9IDB4MjRlOTsKKyB0LnpjaXJjdW1mbGV4ID0gMHgxZTkxOworIHQuemN1cmwgPSAweDAyOTE7CisgdC56ZG90ID0gMHgwMTdjOworIHQuemRvdGFjY2VudCA9IDB4MDE3YzsKKyB0Lnpkb3RiZWxvdyA9IDB4MWU5MzsKKyB0LnplY3lyaWxsaWMgPSAweDA0Mzc7CisgdC56ZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk5OworIHQuemVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRmOworIHQuemVoaXJhZ2FuYSA9IDB4MzA1YzsKKyB0Lnpla2F0YWthbmEgPSAweDMwYmM7CisgdC56ZXJvID0gMHgwMDMwOworIHQuemVyb2FyYWJpYyA9IDB4MDY2MDsKKyB0Lnplcm9iZW5nYWxpID0gMHgwOWU2OworIHQuemVyb2RldmEgPSAweDA5NjY7CisgdC56ZXJvZ3VqYXJhdGkgPSAweDBhZTY7CisgdC56ZXJvZ3VybXVraGkgPSAweDBhNjY7CisgdC56ZXJvaGFja2FyYWJpYyA9IDB4MDY2MDsKKyB0Lnplcm9pbmZlcmlvciA9IDB4MjA4MDsKKyB0Lnplcm9tb25vc3BhY2UgPSAweGZmMTA7CisgdC56ZXJvb2xkc3R5bGUgPSAweGY3MzA7CisgdC56ZXJvcGVyc2lhbiA9IDB4MDZmMDsKKyB0Lnplcm9zdXBlcmlvciA9IDB4MjA3MDsKKyB0Lnplcm90aGFpID0gMHgwZTUwOworIHQuemVyb3dpZHRoam9pbmVyID0gMHhmZWZmOworIHQuemVyb3dpZHRobm9uam9pbmVyID0gMHgyMDBjOworIHQuemVyb3dpZHRoc3BhY2UgPSAweDIwMGI7CisgdC56ZXRhID0gMHgwM2I2OworIHQuemhib3BvbW9mbyA9IDB4MzExMzsKKyB0LnpoZWFybWVuaWFuID0gMHgwNTZhOworIHQuemhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMjsKKyB0LnpoZWN5cmlsbGljID0gMHgwNDM2OworIHQuemhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTc7CisgdC56aGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRkOworIHQuemloaXJhZ2FuYSA9IDB4MzA1ODsKKyB0Lnppa2F0YWthbmEgPSAweDMwYjg7CisgdC56aW5vcmhlYnJldyA9IDB4MDVhZTsKKyB0LnpsaW5lYmVsb3cgPSAweDFlOTU7CisgdC56bW9ub3NwYWNlID0gMHhmZjVhOworIHQuem9oaXJhZ2FuYSA9IDB4MzA1ZTsKKyB0Lnpva2F0YWthbmEgPSAweDMwYmU7CisgdC56cGFyZW4gPSAweDI0YjU7CisgdC56cmV0cm9mbGV4aG9vayA9IDB4MDI5MDsKKyB0LnpzdHJva2UgPSAweDAxYjY7CisgdC56dWhpcmFnYW5hID0gMHgzMDVhOworIHQuenVrYXRha2FuYSA9IDB4MzBiYTsKKyB0WyIubm90ZGVmIl0gPSAweDAwMDA7CisgdC5hbmdicmFja2V0bGVmdGJpZyA9IDB4MjMyOTsKKyB0LmFuZ2JyYWNrZXRsZWZ0QmlnID0gMHgyMzI5OworIHQuYW5nYnJhY2tldGxlZnRiaWdnID0gMHgyMzI5OworIHQuYW5nYnJhY2tldGxlZnRCaWdnID0gMHgyMzI5OworIHQuYW5nYnJhY2tldHJpZ2h0QmlnID0gMHgyMzJhOworIHQuYW5nYnJhY2tldHJpZ2h0YmlnID0gMHgyMzJhOworIHQuYW5nYnJhY2tldHJpZ2h0QmlnZyA9IDB4MjMyYTsKKyB0LmFuZ2JyYWNrZXRyaWdodGJpZ2cgPSAweDIzMmE7CisgdC5hcnJvd2hvb2tsZWZ0ID0gMHgyMWFhOworIHQuYXJyb3dob29rcmlnaHQgPSAweDIxYTk7CisgdC5hcnJvd2xlZnR0b3BoYWxmID0gMHgyMWJjOworIHQuYXJyb3dsZWZ0Ym90aGFsZiA9IDB4MjFiZDsKKyB0LmFycm93bm9ydGhlYXN0ID0gMHgyMTk3OworIHQuYXJyb3dub3J0aHdlc3QgPSAweDIxOTY7CisgdC5hcnJvd3JpZ2h0dG9waGFsZiA9IDB4MjFjMDsKKyB0LmFycm93cmlnaHRib3RoYWxmID0gMHgyMWMxOworIHQuYXJyb3dzb3V0aGVhc3QgPSAweDIxOTg7CisgdC5hcnJvd3NvdXRod2VzdCA9IDB4MjE5OTsKKyB0LmJhY2tzbGFzaGJpZyA9IDB4MjIxNjsKKyB0LmJhY2tzbGFzaEJpZyA9IDB4MjIxNjsKKyB0LmJhY2tzbGFzaEJpZ2cgPSAweDIyMTY7CisgdC5iYWNrc2xhc2hiaWdnID0gMHgyMjE2OworIHQuYmFyZGJsID0gMHgyMDE2OworIHQuYnJhY2VodGlwZG93bmxlZnQgPSAweGZlMzc7CisgdC5icmFjZWh0aXBkb3ducmlnaHQgPSAweGZlMzc7CisgdC5icmFjZWh0aXB1cGxlZnQgPSAweGZlMzg7CisgdC5icmFjZWh0aXB1cHJpZ2h0ID0gMHhmZTM4OworIHQuYnJhY2VsZWZ0QmlnID0gMHgwMDdiOworIHQuYnJhY2VsZWZ0YmlnID0gMHgwMDdiOworIHQuYnJhY2VsZWZ0YmlnZyA9IDB4MDA3YjsKKyB0LmJyYWNlbGVmdEJpZ2cgPSAweDAwN2I7CisgdC5icmFjZXJpZ2h0QmlnID0gMHgwMDdkOworIHQuYnJhY2VyaWdodGJpZyA9IDB4MDA3ZDsKKyB0LmJyYWNlcmlnaHRiaWdnID0gMHgwMDdkOworIHQuYnJhY2VyaWdodEJpZ2cgPSAweDAwN2Q7CisgdC5icmFja2V0bGVmdGJpZyA9IDB4MDA1YjsKKyB0LmJyYWNrZXRsZWZ0QmlnID0gMHgwMDViOworIHQuYnJhY2tldGxlZnRiaWdnID0gMHgwMDViOworIHQuYnJhY2tldGxlZnRCaWdnID0gMHgwMDViOworIHQuYnJhY2tldHJpZ2h0QmlnID0gMHgwMDVkOworIHQuYnJhY2tldHJpZ2h0YmlnID0gMHgwMDVkOworIHQuYnJhY2tldHJpZ2h0YmlnZyA9IDB4MDA1ZDsKKyB0LmJyYWNrZXRyaWdodEJpZ2cgPSAweDAwNWQ7CisgdC5jZWlsaW5nbGVmdGJpZyA9IDB4MjMwODsKKyB0LmNlaWxpbmdsZWZ0QmlnID0gMHgyMzA4OworIHQuY2VpbGluZ2xlZnRCaWdnID0gMHgyMzA4OworIHQuY2VpbGluZ2xlZnRiaWdnID0gMHgyMzA4OworIHQuY2VpbGluZ3JpZ2h0YmlnID0gMHgyMzA5OworIHQuY2VpbGluZ3JpZ2h0QmlnID0gMHgyMzA5OworIHQuY2VpbGluZ3JpZ2h0YmlnZyA9IDB4MjMwOTsKKyB0LmNlaWxpbmdyaWdodEJpZ2cgPSAweDIzMDk7CisgdC5jaXJjbGVkb3RkaXNwbGF5ID0gMHgyMjk5OworIHQuY2lyY2xlZG90dGV4dCA9IDB4MjI5OTsKKyB0LmNpcmNsZW11bHRpcGx5ZGlzcGxheSA9IDB4MjI5NzsKKyB0LmNpcmNsZW11bHRpcGx5dGV4dCA9IDB4MjI5NzsKKyB0LmNpcmNsZXBsdXNkaXNwbGF5ID0gMHgyMjk1OworIHQuY2lyY2xlcGx1c3RleHQgPSAweDIyOTU7CisgdC5jb250aW50ZWdyYWxkaXNwbGF5ID0gMHgyMjJlOworIHQuY29udGludGVncmFsdGV4dCA9IDB4MjIyZTsKKyB0LmNvcHJvZHVjdGRpc3BsYXkgPSAweDIyMTA7CisgdC5jb3Byb2R1Y3R0ZXh0ID0gMHgyMjEwOworIHQuZmxvb3JsZWZ0QmlnID0gMHgyMzBhOworIHQuZmxvb3JsZWZ0YmlnID0gMHgyMzBhOworIHQuZmxvb3JsZWZ0YmlnZyA9IDB4MjMwYTsKKyB0LmZsb29ybGVmdEJpZ2cgPSAweDIzMGE7CisgdC5mbG9vcnJpZ2h0YmlnID0gMHgyMzBiOworIHQuZmxvb3JyaWdodEJpZyA9IDB4MjMwYjsKKyB0LmZsb29ycmlnaHRCaWdnID0gMHgyMzBiOworIHQuZmxvb3JyaWdodGJpZ2cgPSAweDIzMGI7CisgdC5oYXR3aWRlID0gMHgwMzAyOworIHQuaGF0d2lkZXIgPSAweDAzMDI7CisgdC5oYXR3aWRlc3QgPSAweDAzMDI7CisgdC5pbnRlcmNhbCA9IDB4MWQ0MDsKKyB0LmludGVncmFsZGlzcGxheSA9IDB4MjIyYjsKKyB0LmludGVncmFsdGV4dCA9IDB4MjIyYjsKKyB0LmludGVyc2VjdGlvbmRpc3BsYXkgPSAweDIyYzI7CisgdC5pbnRlcnNlY3Rpb250ZXh0ID0gMHgyMmMyOworIHQubG9naWNhbGFuZGRpc3BsYXkgPSAweDIyMjc7CisgdC5sb2dpY2FsYW5kdGV4dCA9IDB4MjIyNzsKKyB0LmxvZ2ljYWxvcmRpc3BsYXkgPSAweDIyMjg7CisgdC5sb2dpY2Fsb3J0ZXh0ID0gMHgyMjI4OworIHQucGFyZW5sZWZ0QmlnID0gMHgwMDI4OworIHQucGFyZW5sZWZ0YmlnID0gMHgwMDI4OworIHQucGFyZW5sZWZ0QmlnZyA9IDB4MDAyODsKKyB0LnBhcmVubGVmdGJpZ2cgPSAweDAwMjg7CisgdC5wYXJlbnJpZ2h0QmlnID0gMHgwMDI5OworIHQucGFyZW5yaWdodGJpZyA9IDB4MDAyOTsKKyB0LnBhcmVucmlnaHRCaWdnID0gMHgwMDI5OworIHQucGFyZW5yaWdodGJpZ2cgPSAweDAwMjk7CisgdC5wcmltZSA9IDB4MjAzMjsKKyB0LnByb2R1Y3RkaXNwbGF5ID0gMHgyMjBmOworIHQucHJvZHVjdHRleHQgPSAweDIyMGY7CisgdC5yYWRpY2FsYmlnID0gMHgyMjFhOworIHQucmFkaWNhbEJpZyA9IDB4MjIxYTsKKyB0LnJhZGljYWxCaWdnID0gMHgyMjFhOworIHQucmFkaWNhbGJpZ2cgPSAweDIyMWE7CisgdC5yYWRpY2FsYnQgPSAweDIyMWE7CisgdC5yYWRpY2FsdHAgPSAweDIyMWE7CisgdC5yYWRpY2FsdmVydGV4ID0gMHgyMjFhOworIHQuc2xhc2hiaWcgPSAweDAwMmY7CisgdC5zbGFzaEJpZyA9IDB4MDAyZjsKKyB0LnNsYXNoQmlnZyA9IDB4MDAyZjsKKyB0LnNsYXNoYmlnZyA9IDB4MDAyZjsKKyB0LnN1bW1hdGlvbmRpc3BsYXkgPSAweDIyMTE7CisgdC5zdW1tYXRpb250ZXh0ID0gMHgyMjExOworIHQudGlsZGV3aWRlID0gMHgwMmRjOworIHQudGlsZGV3aWRlciA9IDB4MDJkYzsKKyB0LnRpbGRld2lkZXN0ID0gMHgwMmRjOworIHQudW5pb25kaXNwbGF5ID0gMHgyMmMzOworIHQudW5pb25tdWx0aWRpc3BsYXkgPSAweDIyOGU7CisgdC51bmlvbm11bHRpdGV4dCA9IDB4MjI4ZTsKKyB0LnVuaW9uc3FkaXNwbGF5ID0gMHgyMjk0OworIHQudW5pb25zcXRleHQgPSAweDIyOTQ7CisgdC51bmlvbnRleHQgPSAweDIyYzM7CisgdC52ZXh0ZW5kZG91YmxlID0gMHgyMjI1OworIHQudmV4dGVuZHNpbmdsZSA9IDB4MjIyMzsKK30pOwordmFyIGdldERpbmdiYXRzR2x5cGhzVW5pY29kZSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgeworIHQuc3BhY2UgPSAweDAwMjA7CisgdC5hMSA9IDB4MjcwMTsKKyB0LmEyID0gMHgyNzAyOworIHQuYTIwMiA9IDB4MjcwMzsKKyB0LmEzID0gMHgyNzA0OworIHQuYTQgPSAweDI2MGU7CisgdC5hNSA9IDB4MjcwNjsKKyB0LmExMTkgPSAweDI3MDc7CisgdC5hMTE4ID0gMHgyNzA4OworIHQuYTExNyA9IDB4MjcwOTsKKyB0LmExMSA9IDB4MjYxYjsKKyB0LmExMiA9IDB4MjYxZTsKKyB0LmExMyA9IDB4MjcwYzsKKyB0LmExNCA9IDB4MjcwZDsKKyB0LmExNSA9IDB4MjcwZTsKKyB0LmExNiA9IDB4MjcwZjsKKyB0LmExMDUgPSAweDI3MTA7CisgdC5hMTcgPSAweDI3MTE7CisgdC5hMTggPSAweDI3MTI7CisgdC5hMTkgPSAweDI3MTM7CisgdC5hMjAgPSAweDI3MTQ7CisgdC5hMjEgPSAweDI3MTU7CisgdC5hMjIgPSAweDI3MTY7CisgdC5hMjMgPSAweDI3MTc7CisgdC5hMjQgPSAweDI3MTg7CisgdC5hMjUgPSAweDI3MTk7CisgdC5hMjYgPSAweDI3MWE7CisgdC5hMjcgPSAweDI3MWI7CisgdC5hMjggPSAweDI3MWM7CisgdC5hNiA9IDB4MjcxZDsKKyB0LmE3ID0gMHgyNzFlOworIHQuYTggPSAweDI3MWY7CisgdC5hOSA9IDB4MjcyMDsKKyB0LmExMCA9IDB4MjcyMTsKKyB0LmEyOSA9IDB4MjcyMjsKKyB0LmEzMCA9IDB4MjcyMzsKKyB0LmEzMSA9IDB4MjcyNDsKKyB0LmEzMiA9IDB4MjcyNTsKKyB0LmEzMyA9IDB4MjcyNjsKKyB0LmEzNCA9IDB4MjcyNzsKKyB0LmEzNSA9IDB4MjYwNTsKKyB0LmEzNiA9IDB4MjcyOTsKKyB0LmEzNyA9IDB4MjcyYTsKKyB0LmEzOCA9IDB4MjcyYjsKKyB0LmEzOSA9IDB4MjcyYzsKKyB0LmE0MCA9IDB4MjcyZDsKKyB0LmE0MSA9IDB4MjcyZTsKKyB0LmE0MiA9IDB4MjcyZjsKKyB0LmE0MyA9IDB4MjczMDsKKyB0LmE0NCA9IDB4MjczMTsKKyB0LmE0NSA9IDB4MjczMjsKKyB0LmE0NiA9IDB4MjczMzsKKyB0LmE0NyA9IDB4MjczNDsKKyB0LmE0OCA9IDB4MjczNTsKKyB0LmE0OSA9IDB4MjczNjsKKyB0LmE1MCA9IDB4MjczNzsKKyB0LmE1MSA9IDB4MjczODsKKyB0LmE1MiA9IDB4MjczOTsKKyB0LmE1MyA9IDB4MjczYTsKKyB0LmE1NCA9IDB4MjczYjsKKyB0LmE1NSA9IDB4MjczYzsKKyB0LmE1NiA9IDB4MjczZDsKKyB0LmE1NyA9IDB4MjczZTsKKyB0LmE1OCA9IDB4MjczZjsKKyB0LmE1OSA9IDB4Mjc0MDsKKyB0LmE2MCA9IDB4Mjc0MTsKKyB0LmE2MSA9IDB4Mjc0MjsKKyB0LmE2MiA9IDB4Mjc0MzsKKyB0LmE2MyA9IDB4Mjc0NDsKKyB0LmE2NCA9IDB4Mjc0NTsKKyB0LmE2NSA9IDB4Mjc0NjsKKyB0LmE2NiA9IDB4Mjc0NzsKKyB0LmE2NyA9IDB4Mjc0ODsKKyB0LmE2OCA9IDB4Mjc0OTsKKyB0LmE2OSA9IDB4Mjc0YTsKKyB0LmE3MCA9IDB4Mjc0YjsKKyB0LmE3MSA9IDB4MjVjZjsKKyB0LmE3MiA9IDB4Mjc0ZDsKKyB0LmE3MyA9IDB4MjVhMDsKKyB0LmE3NCA9IDB4Mjc0ZjsKKyB0LmEyMDMgPSAweDI3NTA7CisgdC5hNzUgPSAweDI3NTE7CisgdC5hMjA0ID0gMHgyNzUyOworIHQuYTc2ID0gMHgyNWIyOworIHQuYTc3ID0gMHgyNWJjOworIHQuYTc4ID0gMHgyNWM2OworIHQuYTc5ID0gMHgyNzU2OworIHQuYTgxID0gMHgyNWQ3OworIHQuYTgyID0gMHgyNzU4OworIHQuYTgzID0gMHgyNzU5OworIHQuYTg0ID0gMHgyNzVhOworIHQuYTk3ID0gMHgyNzViOworIHQuYTk4ID0gMHgyNzVjOworIHQuYTk5ID0gMHgyNzVkOworIHQuYTEwMCA9IDB4Mjc1ZTsKKyB0LmExMDEgPSAweDI3NjE7CisgdC5hMTAyID0gMHgyNzYyOworIHQuYTEwMyA9IDB4Mjc2MzsKKyB0LmExMDQgPSAweDI3NjQ7CisgdC5hMTA2ID0gMHgyNzY1OworIHQuYTEwNyA9IDB4Mjc2NjsKKyB0LmExMDggPSAweDI3Njc7CisgdC5hMTEyID0gMHgyNjYzOworIHQuYTExMSA9IDB4MjY2NjsKKyB0LmExMTAgPSAweDI2NjU7CisgdC5hMTA5ID0gMHgyNjYwOworIHQuYTEyMCA9IDB4MjQ2MDsKKyB0LmExMjEgPSAweDI0NjE7CisgdC5hMTIyID0gMHgyNDYyOworIHQuYTEyMyA9IDB4MjQ2MzsKKyB0LmExMjQgPSAweDI0NjQ7CisgdC5hMTI1ID0gMHgyNDY1OworIHQuYTEyNiA9IDB4MjQ2NjsKKyB0LmExMjcgPSAweDI0Njc7CisgdC5hMTI4ID0gMHgyNDY4OworIHQuYTEyOSA9IDB4MjQ2OTsKKyB0LmExMzAgPSAweDI3NzY7CisgdC5hMTMxID0gMHgyNzc3OworIHQuYTEzMiA9IDB4Mjc3ODsKKyB0LmExMzMgPSAweDI3Nzk7CisgdC5hMTM0ID0gMHgyNzdhOworIHQuYTEzNSA9IDB4Mjc3YjsKKyB0LmExMzYgPSAweDI3N2M7CisgdC5hMTM3ID0gMHgyNzdkOworIHQuYTEzOCA9IDB4Mjc3ZTsKKyB0LmExMzkgPSAweDI3N2Y7CisgdC5hMTQwID0gMHgyNzgwOworIHQuYTE0MSA9IDB4Mjc4MTsKKyB0LmExNDIgPSAweDI3ODI7CisgdC5hMTQzID0gMHgyNzgzOworIHQuYTE0NCA9IDB4Mjc4NDsKKyB0LmExNDUgPSAweDI3ODU7CisgdC5hMTQ2ID0gMHgyNzg2OworIHQuYTE0NyA9IDB4Mjc4NzsKKyB0LmExNDggPSAweDI3ODg7CisgdC5hMTQ5ID0gMHgyNzg5OworIHQuYTE1MCA9IDB4Mjc4YTsKKyB0LmExNTEgPSAweDI3OGI7CisgdC5hMTUyID0gMHgyNzhjOworIHQuYTE1MyA9IDB4Mjc4ZDsKKyB0LmExNTQgPSAweDI3OGU7CisgdC5hMTU1ID0gMHgyNzhmOworIHQuYTE1NiA9IDB4Mjc5MDsKKyB0LmExNTcgPSAweDI3OTE7CisgdC5hMTU4ID0gMHgyNzkyOworIHQuYTE1OSA9IDB4Mjc5MzsKKyB0LmExNjAgPSAweDI3OTQ7CisgdC5hMTYxID0gMHgyMTkyOworIHQuYTE2MyA9IDB4MjE5NDsKKyB0LmExNjQgPSAweDIxOTU7CisgdC5hMTk2ID0gMHgyNzk4OworIHQuYTE2NSA9IDB4Mjc5OTsKKyB0LmExOTIgPSAweDI3OWE7CisgdC5hMTY2ID0gMHgyNzliOworIHQuYTE2NyA9IDB4Mjc5YzsKKyB0LmExNjggPSAweDI3OWQ7CisgdC5hMTY5ID0gMHgyNzllOworIHQuYTE3MCA9IDB4Mjc5ZjsKKyB0LmExNzEgPSAweDI3YTA7CisgdC5hMTcyID0gMHgyN2ExOworIHQuYTE3MyA9IDB4MjdhMjsKKyB0LmExNjIgPSAweDI3YTM7CisgdC5hMTc0ID0gMHgyN2E0OworIHQuYTE3NSA9IDB4MjdhNTsKKyB0LmExNzYgPSAweDI3YTY7CisgdC5hMTc3ID0gMHgyN2E3OworIHQuYTE3OCA9IDB4MjdhODsKKyB0LmExNzkgPSAweDI3YTk7CisgdC5hMTkzID0gMHgyN2FhOworIHQuYTE4MCA9IDB4MjdhYjsKKyB0LmExOTkgPSAweDI3YWM7CisgdC5hMTgxID0gMHgyN2FkOworIHQuYTIwMCA9IDB4MjdhZTsKKyB0LmExODIgPSAweDI3YWY7CisgdC5hMjAxID0gMHgyN2IxOworIHQuYTE4MyA9IDB4MjdiMjsKKyB0LmExODQgPSAweDI3YjM7CisgdC5hMTk3ID0gMHgyN2I0OworIHQuYTE4NSA9IDB4MjdiNTsKKyB0LmExOTQgPSAweDI3YjY7CisgdC5hMTk4ID0gMHgyN2I3OworIHQuYTE4NiA9IDB4MjdiODsKKyB0LmExOTUgPSAweDI3Yjk7CisgdC5hMTg3ID0gMHgyN2JhOworIHQuYTE4OCA9IDB4MjdiYjsKKyB0LmExODkgPSAweDI3YmM7CisgdC5hMTkwID0gMHgyN2JkOworIHQuYTE5MSA9IDB4MjdiZTsKKyB0LmE4OSA9IDB4Mjc2ODsKKyB0LmE5MCA9IDB4Mjc2OTsKKyB0LmE5MyA9IDB4Mjc2YTsKKyB0LmE5NCA9IDB4Mjc2YjsKKyB0LmE5MSA9IDB4Mjc2YzsKKyB0LmE5MiA9IDB4Mjc2ZDsKKyB0LmEyMDUgPSAweDI3NmU7CisgdC5hODUgPSAweDI3NmY7CisgdC5hMjA2ID0gMHgyNzcwOworIHQuYTg2ID0gMHgyNzcxOworIHQuYTg3ID0gMHgyNzcyOworIHQuYTg4ID0gMHgyNzczOworIHQuYTk1ID0gMHgyNzc0OworIHQuYTk2ID0gMHgyNzc1OworIHRbIi5ub3RkZWYiXSA9IDB4MDAwMDsKK30pOworZXhwb3J0cy5nZXRHbHlwaHNVbmljb2RlID0gZ2V0R2x5cGhzVW5pY29kZTsKK2V4cG9ydHMuZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlID0gZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlOworCisvKioqLyB9KSwKKy8qIDM1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpID0gZXhwb3J0cy5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSBleHBvcnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGV4cG9ydHMuZ2V0U3ltYm9sc0ZvbnRzID0gZXhwb3J0cy5nZXRTZXJpZkZvbnRzID0gZXhwb3J0cy5nZXROb25TdGRGb250TWFwID0gZXhwb3J0cy5nZXRTdGRGb250TWFwID0gdm9pZCAwOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworCitjb25zdCBnZXRTdGRGb250TWFwID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgdC5BcmlhbE5hcnJvdyA9ICJIZWx2ZXRpY2EiOworICB0WyJBcmlhbE5hcnJvdy1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJBcmlhbE5hcnJvdy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKKyAgdFsiQXJpYWxOYXJyb3ctSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0LkFyaWFsQmxhY2sgPSAiSGVsdmV0aWNhIjsKKyAgdFsiQXJpYWxCbGFjay1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJBcmlhbEJsYWNrLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdFsiQXJpYWwtQmxhY2siXSA9ICJIZWx2ZXRpY2EiOworICB0WyJBcmlhbC1CbGFjay1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJBcmlhbC1CbGFjay1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKKyAgdFsiQXJpYWwtQmxhY2stSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0LkFyaWFsID0gIkhlbHZldGljYSI7CisgIHRbIkFyaWFsLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CisgIHRbIkFyaWFsLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJBcmlhbC1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CisgIHRbIkFyaWFsLUJvbGRJdGFsaWNNVCJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkFyaWFsLUJvbGRNVCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQXJpYWwtSXRhbGljTVQiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CisgIHQuQXJpYWxNVCA9ICJIZWx2ZXRpY2EiOworICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOworICB0WyJDb3VyaWVyLUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKKyAgdFsiQ291cmllci1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOworICB0LkNvdXJpZXJOZXcgPSAiQ291cmllciI7CisgIHRbIkNvdXJpZXJOZXctQm9sZCJdID0gIkNvdXJpZXItQm9sZCI7CisgIHRbIkNvdXJpZXJOZXctQm9sZEl0YWxpYyJdID0gIkNvdXJpZXItQm9sZE9ibGlxdWUiOworICB0WyJDb3VyaWVyTmV3LUl0YWxpYyJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CisgIHRbIkNvdXJpZXJOZXdQUy1Cb2xkSXRhbGljTVQiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKKyAgdFsiQ291cmllck5ld1BTLUJvbGRNVCJdID0gIkNvdXJpZXItQm9sZCI7CisgIHRbIkNvdXJpZXJOZXdQUy1JdGFsaWNNVCJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CisgIHQuQ291cmllck5ld1BTTVQgPSAiQ291cmllciI7CisgIHQuSGVsdmV0aWNhID0gIkhlbHZldGljYSI7CisgIHRbIkhlbHZldGljYS1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJIZWx2ZXRpY2EtQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkhlbHZldGljYS1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CisgIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0WyJTeW1ib2wtQm9sZCJdID0gIlN5bWJvbCI7CisgIHRbIlN5bWJvbC1Cb2xkSXRhbGljIl0gPSAiU3ltYm9sIjsKKyAgdFsiU3ltYm9sLUl0YWxpYyJdID0gIlN5bWJvbCI7CisgIHQuVGltZXNOZXdSb21hbiA9ICJUaW1lcy1Sb21hbiI7CisgIHRbIlRpbWVzTmV3Um9tYW4tQm9sZCJdID0gIlRpbWVzLUJvbGQiOworICB0WyJUaW1lc05ld1JvbWFuLUJvbGRJdGFsaWMiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKKyAgdFsiVGltZXNOZXdSb21hbi1JdGFsaWMiXSA9ICJUaW1lcy1JdGFsaWMiOworICB0LlRpbWVzTmV3Um9tYW5QUyA9ICJUaW1lcy1Sb21hbiI7CisgIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CisgIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CisgIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKKyAgdFsiVGltZXNOZXdSb21hblBTLUJvbGRNVCJdID0gIlRpbWVzLUJvbGQiOworICB0WyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKKyAgdFsiVGltZXNOZXdSb21hblBTLUl0YWxpY01UIl0gPSAiVGltZXMtSXRhbGljIjsKKyAgdC5UaW1lc05ld1JvbWFuUFNNVCA9ICJUaW1lcy1Sb21hbiI7CisgIHRbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKKyAgdFsiVGltZXNOZXdSb21hblBTTVQtQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOworICB0WyJUaW1lc05ld1JvbWFuUFNNVC1JdGFsaWMiXSA9ICJUaW1lcy1JdGFsaWMiOworfSk7CitleHBvcnRzLmdldFN0ZEZvbnRNYXAgPSBnZXRTdGRGb250TWFwOworY29uc3QgZ2V0Tm9uU3RkRm9udE1hcCA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgIHQuQ2FsaWJyaSA9ICJIZWx2ZXRpY2EiOworICB0WyJDYWxpYnJpLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CisgIHRbIkNhbGlicmktQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkNhbGlicmktSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0LkNlbnR1cnlHb3RoaWMgPSAiSGVsdmV0aWNhIjsKKyAgdFsiQ2VudHVyeUdvdGhpYy1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJDZW50dXJ5R290aGljLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJDZW50dXJ5R290aGljLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdC5Db21pY1NhbnNNUyA9ICJDb21pYyBTYW5zIE1TIjsKKyAgdFsiQ29taWNTYW5zTVMtQm9sZCJdID0gIkNvbWljIFNhbnMgTVMtQm9sZCI7CisgIHRbIkNvbWljU2Fuc01TLUJvbGRJdGFsaWMiXSA9ICJDb21pYyBTYW5zIE1TLUJvbGRJdGFsaWMiOworICB0WyJDb21pY1NhbnNNUy1JdGFsaWMiXSA9ICJDb21pYyBTYW5zIE1TLUl0YWxpYyI7CisgIHQuTHVjaWRhQ29uc29sZSA9ICJDb3VyaWVyIjsKKyAgdFsiTHVjaWRhQ29uc29sZS1Cb2xkIl0gPSAiQ291cmllci1Cb2xkIjsKKyAgdFsiTHVjaWRhQ29uc29sZS1Cb2xkSXRhbGljIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CisgIHRbIkx1Y2lkYUNvbnNvbGUtSXRhbGljIl0gPSAiQ291cmllci1PYmxpcXVlIjsKKyAgdFsiTHVjaWRhU2Fucy1EZW1pIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJNUy1Hb3RoaWMiXSA9ICJNUyBHb3RoaWMiOworICB0WyJNUy1Hb3RoaWMtQm9sZCJdID0gIk1TIEdvdGhpYy1Cb2xkIjsKKyAgdFsiTVMtR290aGljLUJvbGRJdGFsaWMiXSA9ICJNUyBHb3RoaWMtQm9sZEl0YWxpYyI7CisgIHRbIk1TLUdvdGhpYy1JdGFsaWMiXSA9ICJNUyBHb3RoaWMtSXRhbGljIjsKKyAgdFsiTVMtTWluY2hvIl0gPSAiTVMgTWluY2hvIjsKKyAgdFsiTVMtTWluY2hvLUJvbGQiXSA9ICJNUyBNaW5jaG8tQm9sZCI7CisgIHRbIk1TLU1pbmNoby1Cb2xkSXRhbGljIl0gPSAiTVMgTWluY2hvLUJvbGRJdGFsaWMiOworICB0WyJNUy1NaW5jaG8tSXRhbGljIl0gPSAiTVMgTWluY2hvLUl0YWxpYyI7CisgIHRbIk1TLVBHb3RoaWMiXSA9ICJNUyBQR290aGljIjsKKyAgdFsiTVMtUEdvdGhpYy1Cb2xkIl0gPSAiTVMgUEdvdGhpYy1Cb2xkIjsKKyAgdFsiTVMtUEdvdGhpYy1Cb2xkSXRhbGljIl0gPSAiTVMgUEdvdGhpYy1Cb2xkSXRhbGljIjsKKyAgdFsiTVMtUEdvdGhpYy1JdGFsaWMiXSA9ICJNUyBQR290aGljLUl0YWxpYyI7CisgIHRbIk1TLVBNaW5jaG8iXSA9ICJNUyBQTWluY2hvIjsKKyAgdFsiTVMtUE1pbmNoby1Cb2xkIl0gPSAiTVMgUE1pbmNoby1Cb2xkIjsKKyAgdFsiTVMtUE1pbmNoby1Cb2xkSXRhbGljIl0gPSAiTVMgUE1pbmNoby1Cb2xkSXRhbGljIjsKKyAgdFsiTVMtUE1pbmNoby1JdGFsaWMiXSA9ICJNUyBQTWluY2hvLUl0YWxpYyI7CisgIHQuTnVwdGlhbFNjcmlwdCA9ICJUaW1lcy1JdGFsaWMiOworICB0LlNlZ29lVUlTeW1ib2wgPSAiSGVsdmV0aWNhIjsKKyAgdC5XaW5nZGluZ3MgPSAiWmFwZkRpbmdiYXRzIjsKKyAgdFsiV2luZ2RpbmdzLVJlZ3VsYXIiXSA9ICJaYXBmRGluZ2JhdHMiOworfSk7CitleHBvcnRzLmdldE5vblN0ZEZvbnRNYXAgPSBnZXROb25TdGRGb250TWFwOworY29uc3QgZ2V0U2VyaWZGb250cyA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgIHRbIkFkb2JlIEplbnNvbiJdID0gdHJ1ZTsKKyAgdFsiQWRvYmUgVGV4dCJdID0gdHJ1ZTsKKyAgdC5BbGJlcnR1cyA9IHRydWU7CisgIHQuQWxkdXMgPSB0cnVlOworICB0LkFsZXhhbmRyaWEgPSB0cnVlOworICB0LkFsZ2VyaWFuID0gdHJ1ZTsKKyAgdFsiQW1lcmljYW4gVHlwZXdyaXRlciJdID0gdHJ1ZTsKKyAgdC5BbnRpcXVhID0gdHJ1ZTsKKyAgdC5BcGV4ID0gdHJ1ZTsKKyAgdC5Bcm5vID0gdHJ1ZTsKKyAgdC5Bc3RlciA9IHRydWU7CisgIHQuQXVyb3JhID0gdHJ1ZTsKKyAgdC5CYXNrZXJ2aWxsZSA9IHRydWU7CisgIHQuQmVsbCA9IHRydWU7CisgIHQuQmVtYm8gPSB0cnVlOworICB0WyJCZW1ibyBTY2hvb2xib29rIl0gPSB0cnVlOworICB0LkJlbmd1aWF0ID0gdHJ1ZTsKKyAgdFsiQmVya2VsZXkgT2xkIFN0eWxlIl0gPSB0cnVlOworICB0WyJCZXJuaGFyZCBNb2Rlcm4iXSA9IHRydWU7CisgIHRbIkJlcnRob2xkIENpdHkiXSA9IHRydWU7CisgIHQuQm9kb25pID0gdHJ1ZTsKKyAgdFsiQmF1ZXIgQm9kb25pIl0gPSB0cnVlOworICB0WyJCb29rIEFudGlxdWEiXSA9IHRydWU7CisgIHQuQm9va21hbiA9IHRydWU7CisgIHRbIkJvcmRlYXV4IFJvbWFuIl0gPSB0cnVlOworICB0WyJDYWxpZm9ybmlhbiBGQiJdID0gdHJ1ZTsKKyAgdC5DYWxpc3RvID0gdHJ1ZTsKKyAgdC5DYWx2ZXJ0ID0gdHJ1ZTsKKyAgdC5DYXBpdGFscyA9IHRydWU7CisgIHQuQ2FtYnJpYSA9IHRydWU7CisgIHQuQ2FydGllciA9IHRydWU7CisgIHQuQ2FzbG9uID0gdHJ1ZTsKKyAgdC5DYXR1bGwgPSB0cnVlOworICB0LkNlbnRhdXIgPSB0cnVlOworICB0WyJDZW50dXJ5IE9sZCBTdHlsZSJdID0gdHJ1ZTsKKyAgdFsiQ2VudHVyeSBTY2hvb2xib29rIl0gPSB0cnVlOworICB0LkNoYXBhcnJhbCA9IHRydWU7CisgIHRbIkNoYXJpcyBTSUwiXSA9IHRydWU7CisgIHQuQ2hlbHRlbmhhbSA9IHRydWU7CisgIHRbIkNob2xsYSBTbGFiIl0gPSB0cnVlOworICB0LkNsYXJlbmRvbiA9IHRydWU7CisgIHQuQ2xlYXJmYWNlID0gdHJ1ZTsKKyAgdC5Db2NoaW4gPSB0cnVlOworICB0LkNvbG9ubmEgPSB0cnVlOworICB0WyJDb21wdXRlciBNb2Rlcm4iXSA9IHRydWU7CisgIHRbIkNvbmNyZXRlIFJvbWFuIl0gPSB0cnVlOworICB0LkNvbnN0YW50aWEgPSB0cnVlOworICB0WyJDb29wZXIgQmxhY2siXSA9IHRydWU7CisgIHQuQ29yb25hID0gdHJ1ZTsKKyAgdC5FY290eXBlID0gdHJ1ZTsKKyAgdC5FZ3lwdGllbm5lID0gdHJ1ZTsKKyAgdC5FbGVwaGFudCA9IHRydWU7CisgIHQuRXhjZWxzaW9yID0gdHJ1ZTsKKyAgdC5GYWlyZmllbGQgPSB0cnVlOworICB0WyJGRiBTY2FsYSJdID0gdHJ1ZTsKKyAgdC5Gb2xrYXJkID0gdHJ1ZTsKKyAgdC5Gb290bGlnaHQgPSB0cnVlOworICB0LkZyZWVTZXJpZiA9IHRydWU7CisgIHRbIkZyaXogUXVhZHJhdGEiXSA9IHRydWU7CisgIHQuR2FyYW1vbmQgPSB0cnVlOworICB0LkdlbnRpdW0gPSB0cnVlOworICB0Lkdlb3JnaWEgPSB0cnVlOworICB0Lkdsb3VjZXN0ZXIgPSB0cnVlOworICB0WyJHb3VkeSBPbGQgU3R5bGUiXSA9IHRydWU7CisgIHRbIkdvdWR5IFNjaG9vbGJvb2siXSA9IHRydWU7CisgIHRbIkdvdWR5IFBybyBGb250Il0gPSB0cnVlOworICB0LkdyYW5qb24gPSB0cnVlOworICB0WyJHdWFyZGlhbiBFZ3lwdGlhbiJdID0gdHJ1ZTsKKyAgdC5IZWF0aGVyID0gdHJ1ZTsKKyAgdC5IZXJjdWxlcyA9IHRydWU7CisgIHRbIkhpZ2ggVG93ZXIgVGV4dCJdID0gdHJ1ZTsKKyAgdC5IaXJvc2hpZ2UgPSB0cnVlOworICB0WyJIb2VmbGVyIFRleHQiXSA9IHRydWU7CisgIHRbIkh1bWFuYSBTZXJpZiJdID0gdHJ1ZTsKKyAgdC5JbXByaW50ID0gdHJ1ZTsKKyAgdFsiSW9uaWMgTm8uIDUiXSA9IHRydWU7CisgIHQuSmFuc29uID0gdHJ1ZTsKKyAgdC5Kb2FubmEgPSB0cnVlOworICB0LktvcmlubmEgPSB0cnVlOworICB0LkxleGljb24gPSB0cnVlOworICB0WyJMaWJlcmF0aW9uIFNlcmlmIl0gPSB0cnVlOworICB0WyJMaW51eCBMaWJlcnRpbmUiXSA9IHRydWU7CisgIHQuTGl0ZXJhdHVybmF5YSA9IHRydWU7CisgIHQuTHVjaWRhID0gdHJ1ZTsKKyAgdFsiTHVjaWRhIEJyaWdodCJdID0gdHJ1ZTsKKyAgdC5NZWxpb3IgPSB0cnVlOworICB0Lk1lbXBoaXMgPSB0cnVlOworICB0Lk1pbGxlciA9IHRydWU7CisgIHQuTWluaW9uID0gdHJ1ZTsKKyAgdC5Nb2Rlcm4gPSB0cnVlOworICB0WyJNb25hIExpc2EiXSA9IHRydWU7CisgIHRbIk1ycyBFYXZlcyJdID0gdHJ1ZTsKKyAgdFsiTVMgU2VyaWYiXSA9IHRydWU7CisgIHRbIk11c2VvIFNsYWIiXSA9IHRydWU7CisgIHRbIk5ldyBZb3JrIl0gPSB0cnVlOworICB0WyJOaW1idXMgUm9tYW4iXSA9IHRydWU7CisgIHRbIk5QUyBSYXdsaW5zb24gUm9hZHdheSJdID0gdHJ1ZTsKKyAgdC5OdXB0aWFsU2NyaXB0ID0gdHJ1ZTsKKyAgdC5QYWxhdGlubyA9IHRydWU7CisgIHQuUGVycGV0dWEgPSB0cnVlOworICB0LlBsYW50aW4gPSB0cnVlOworICB0WyJQbGFudGluIFNjaG9vbGJvb2siXSA9IHRydWU7CisgIHQuUGxheWJpbGwgPSB0cnVlOworICB0WyJQb29yIFJpY2hhcmQiXSA9IHRydWU7CisgIHRbIlJhd2xpbnNvbiBSb2Fkd2F5Il0gPSB0cnVlOworICB0LlJlbmF1bHQgPSB0cnVlOworICB0LlJlcXVpZW0gPSB0cnVlOworICB0LlJvY2t3ZWxsID0gdHJ1ZTsKKyAgdC5Sb21hbiA9IHRydWU7CisgIHRbIlJvdGlzIFNlcmlmIl0gPSB0cnVlOworICB0LlNhYm9uID0gdHJ1ZTsKKyAgdC5TY2FsYSA9IHRydWU7CisgIHQuU2VhZ3VsbCA9IHRydWU7CisgIHQuU2lzdGluYSA9IHRydWU7CisgIHQuU291dmVuaXIgPSB0cnVlOworICB0LlNUSVggPSB0cnVlOworICB0WyJTdG9uZSBJbmZvcm1hbCJdID0gdHJ1ZTsKKyAgdFsiU3RvbmUgU2VyaWYiXSA9IHRydWU7CisgIHQuU3lsZmFlbiA9IHRydWU7CisgIHQuVGltZXMgPSB0cnVlOworICB0LlRyYWphbiA9IHRydWU7CisgIHRbIlRyaW5pdMOpIl0gPSB0cnVlOworICB0WyJUcnVtcCBNZWRpYWV2YWwiXSA9IHRydWU7CisgIHQuVXRvcGlhID0gdHJ1ZTsKKyAgdFsiVmFsZSBUeXBlIl0gPSB0cnVlOworICB0WyJCaXRzdHJlYW0gVmVyYSJdID0gdHJ1ZTsKKyAgdFsiVmVyYSBTZXJpZiJdID0gdHJ1ZTsKKyAgdC5WZXJzYWlsbGVzID0gdHJ1ZTsKKyAgdC5XYW50ZWQgPSB0cnVlOworICB0LldlaXNzID0gdHJ1ZTsKKyAgdFsiV2lkZSBMYXRpbiJdID0gdHJ1ZTsKKyAgdC5XaW5kc29yID0gdHJ1ZTsKKyAgdC5YSVRTID0gdHJ1ZTsKK30pOworZXhwb3J0cy5nZXRTZXJpZkZvbnRzID0gZ2V0U2VyaWZGb250czsKK2NvbnN0IGdldFN5bWJvbHNGb250cyA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgIHQuRGluZ2JhdHMgPSB0cnVlOworICB0LlN5bWJvbCA9IHRydWU7CisgIHQuWmFwZkRpbmdiYXRzID0gdHJ1ZTsKK30pOworZXhwb3J0cy5nZXRTeW1ib2xzRm9udHMgPSBnZXRTeW1ib2xzRm9udHM7Citjb25zdCBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0WzJdID0gMTA7CisgIHRbM10gPSAzMjsKKyAgdFs0XSA9IDMzOworICB0WzVdID0gMzQ7CisgIHRbNl0gPSAzNTsKKyAgdFs3XSA9IDM2OworICB0WzhdID0gMzc7CisgIHRbOV0gPSAzODsKKyAgdFsxMF0gPSAzOTsKKyAgdFsxMV0gPSA0MDsKKyAgdFsxMl0gPSA0MTsKKyAgdFsxM10gPSA0MjsKKyAgdFsxNF0gPSA0MzsKKyAgdFsxNV0gPSA0NDsKKyAgdFsxNl0gPSA0NTsKKyAgdFsxN10gPSA0NjsKKyAgdFsxOF0gPSA0NzsKKyAgdFsxOV0gPSA0ODsKKyAgdFsyMF0gPSA0OTsKKyAgdFsyMV0gPSA1MDsKKyAgdFsyMl0gPSA1MTsKKyAgdFsyM10gPSA1MjsKKyAgdFsyNF0gPSA1MzsKKyAgdFsyNV0gPSA1NDsKKyAgdFsyNl0gPSA1NTsKKyAgdFsyN10gPSA1NjsKKyAgdFsyOF0gPSA1NzsKKyAgdFsyOV0gPSA1ODsKKyAgdFszMF0gPSA4OTQ7CisgIHRbMzFdID0gNjA7CisgIHRbMzJdID0gNjE7CisgIHRbMzNdID0gNjI7CisgIHRbMzRdID0gNjM7CisgIHRbMzVdID0gNjQ7CisgIHRbMzZdID0gNjU7CisgIHRbMzddID0gNjY7CisgIHRbMzhdID0gNjc7CisgIHRbMzldID0gNjg7CisgIHRbNDBdID0gNjk7CisgIHRbNDFdID0gNzA7CisgIHRbNDJdID0gNzE7CisgIHRbNDNdID0gNzI7CisgIHRbNDRdID0gNzM7CisgIHRbNDVdID0gNzQ7CisgIHRbNDZdID0gNzU7CisgIHRbNDddID0gNzY7CisgIHRbNDhdID0gNzc7CisgIHRbNDldID0gNzg7CisgIHRbNTBdID0gNzk7CisgIHRbNTFdID0gODA7CisgIHRbNTJdID0gODE7CisgIHRbNTNdID0gODI7CisgIHRbNTRdID0gODM7CisgIHRbNTVdID0gODQ7CisgIHRbNTZdID0gODU7CisgIHRbNTddID0gODY7CisgIHRbNThdID0gODc7CisgIHRbNTldID0gODg7CisgIHRbNjBdID0gODk7CisgIHRbNjFdID0gOTA7CisgIHRbNjJdID0gOTE7CisgIHRbNjNdID0gOTI7CisgIHRbNjRdID0gOTM7CisgIHRbNjVdID0gOTQ7CisgIHRbNjZdID0gOTU7CisgIHRbNjddID0gOTY7CisgIHRbNjhdID0gOTc7CisgIHRbNjldID0gOTg7CisgIHRbNzBdID0gOTk7CisgIHRbNzFdID0gMTAwOworICB0WzcyXSA9IDEwMTsKKyAgdFs3M10gPSAxMDI7CisgIHRbNzRdID0gMTAzOworICB0Wzc1XSA9IDEwNDsKKyAgdFs3Nl0gPSAxMDU7CisgIHRbNzddID0gMTA2OworICB0Wzc4XSA9IDEwNzsKKyAgdFs3OV0gPSAxMDg7CisgIHRbODBdID0gMTA5OworICB0WzgxXSA9IDExMDsKKyAgdFs4Ml0gPSAxMTE7CisgIHRbODNdID0gMTEyOworICB0Wzg0XSA9IDExMzsKKyAgdFs4NV0gPSAxMTQ7CisgIHRbODZdID0gMTE1OworICB0Wzg3XSA9IDExNjsKKyAgdFs4OF0gPSAxMTc7CisgIHRbODldID0gMTE4OworICB0WzkwXSA9IDExOTsKKyAgdFs5MV0gPSAxMjA7CisgIHRbOTJdID0gMTIxOworICB0WzkzXSA9IDEyMjsKKyAgdFs5NF0gPSAxMjM7CisgIHRbOTVdID0gMTI0OworICB0Wzk2XSA9IDEyNTsKKyAgdFs5N10gPSAxMjY7CisgIHRbOThdID0gMTk2OworICB0Wzk5XSA9IDE5NzsKKyAgdFsxMDBdID0gMTk5OworICB0WzEwMV0gPSAyMDE7CisgIHRbMTAyXSA9IDIwOTsKKyAgdFsxMDNdID0gMjE0OworICB0WzEwNF0gPSAyMjA7CisgIHRbMTA1XSA9IDIyNTsKKyAgdFsxMDZdID0gMjI0OworICB0WzEwN10gPSAyMjY7CisgIHRbMTA4XSA9IDIyODsKKyAgdFsxMDldID0gMjI3OworICB0WzExMF0gPSAyMjk7CisgIHRbMTExXSA9IDIzMTsKKyAgdFsxMTJdID0gMjMzOworICB0WzExM10gPSAyMzI7CisgIHRbMTE0XSA9IDIzNDsKKyAgdFsxMTVdID0gMjM1OworICB0WzExNl0gPSAyMzc7CisgIHRbMTE3XSA9IDIzNjsKKyAgdFsxMThdID0gMjM4OworICB0WzExOV0gPSAyMzk7CisgIHRbMTIwXSA9IDI0MTsKKyAgdFsxMjFdID0gMjQzOworICB0WzEyMl0gPSAyNDI7CisgIHRbMTIzXSA9IDI0NDsKKyAgdFsxMjRdID0gMjQ2OworICB0WzEyNV0gPSAyNDU7CisgIHRbMTI2XSA9IDI1MDsKKyAgdFsxMjddID0gMjQ5OworICB0WzEyOF0gPSAyNTE7CisgIHRbMTI5XSA9IDI1MjsKKyAgdFsxMzBdID0gODIyNDsKKyAgdFsxMzFdID0gMTc2OworICB0WzEzMl0gPSAxNjI7CisgIHRbMTMzXSA9IDE2MzsKKyAgdFsxMzRdID0gMTY3OworICB0WzEzNV0gPSA4MjI2OworICB0WzEzNl0gPSAxODI7CisgIHRbMTM3XSA9IDIyMzsKKyAgdFsxMzhdID0gMTc0OworICB0WzEzOV0gPSAxNjk7CisgIHRbMTQwXSA9IDg0ODI7CisgIHRbMTQxXSA9IDE4MDsKKyAgdFsxNDJdID0gMTY4OworICB0WzE0M10gPSA4ODAwOworICB0WzE0NF0gPSAxOTg7CisgIHRbMTQ1XSA9IDIxNjsKKyAgdFsxNDZdID0gODczNDsKKyAgdFsxNDddID0gMTc3OworICB0WzE0OF0gPSA4ODA0OworICB0WzE0OV0gPSA4ODA1OworICB0WzE1MF0gPSAxNjU7CisgIHRbMTUxXSA9IDE4MTsKKyAgdFsxNTJdID0gODcwNjsKKyAgdFsxNTNdID0gODcyMTsKKyAgdFsxNTRdID0gODcxOTsKKyAgdFsxNTZdID0gODc0NzsKKyAgdFsxNTddID0gMTcwOworICB0WzE1OF0gPSAxODY7CisgIHRbMTU5XSA9IDg0ODY7CisgIHRbMTYwXSA9IDIzMDsKKyAgdFsxNjFdID0gMjQ4OworICB0WzE2Ml0gPSAxOTE7CisgIHRbMTYzXSA9IDE2MTsKKyAgdFsxNjRdID0gMTcyOworICB0WzE2NV0gPSA4NzMwOworICB0WzE2Nl0gPSA0MDI7CisgIHRbMTY3XSA9IDg3NzY7CisgIHRbMTY4XSA9IDg3MTA7CisgIHRbMTY5XSA9IDE3MTsKKyAgdFsxNzBdID0gMTg3OworICB0WzE3MV0gPSA4MjMwOworICB0WzIxMF0gPSAyMTg7CisgIHRbMjIzXSA9IDcxMTsKKyAgdFsyMjRdID0gMzIxOworICB0WzIyNV0gPSAzMjI7CisgIHRbMjI3XSA9IDM1MzsKKyAgdFsyMjldID0gMzgyOworICB0WzIzNF0gPSAyNTM7CisgIHRbMjUyXSA9IDI2MzsKKyAgdFsyNTNdID0gMjY4OworICB0WzI1NF0gPSAyNjk7CisgIHRbMjU4XSA9IDI1ODsKKyAgdFsyNjBdID0gMjYwOworICB0WzI2MV0gPSAyNjE7CisgIHRbMjY1XSA9IDI4MDsKKyAgdFsyNjZdID0gMjgxOworICB0WzI2OF0gPSAyODM7CisgIHRbMjY5XSA9IDMxMzsKKyAgdFsyNzVdID0gMzIzOworICB0WzI3Nl0gPSAzMjQ7CisgIHRbMjc4XSA9IDMyODsKKyAgdFsyODRdID0gMzQ1OworICB0WzI4NV0gPSAzNDY7CisgIHRbMjg2XSA9IDM0NzsKKyAgdFsyOTJdID0gMzY3OworICB0WzI5NV0gPSAzNzc7CisgIHRbMjk2XSA9IDM3ODsKKyAgdFsyOThdID0gMzgwOworICB0WzMwNV0gPSA5NjM7CisgIHRbMzA2XSA9IDk2NDsKKyAgdFszMDddID0gOTY2OworICB0WzMwOF0gPSA4MjE1OworICB0WzMwOV0gPSA4MjUyOworICB0WzMxMF0gPSA4MzE5OworICB0WzMxMV0gPSA4MzU5OworICB0WzMxMl0gPSA4NTkyOworICB0WzMxM10gPSA4NTkzOworICB0WzMzN10gPSA5NTUyOworICB0WzQ5M10gPSAxMDM5OworICB0WzQ5NF0gPSAxMDQwOworICB0WzcwNV0gPSAxNTI0OworICB0WzcwNl0gPSA4MzYyOworICB0WzcxMF0gPSA2NDI4ODsKKyAgdFs3MTFdID0gNjQyOTg7CisgIHRbNzU5XSA9IDE2MTc7CisgIHRbNzYxXSA9IDE3NzY7CisgIHRbNzYzXSA9IDE3Nzg7CisgIHRbNzc1XSA9IDE2NTI7CisgIHRbNzc3XSA9IDE3NjQ7CisgIHRbNzc4XSA9IDE3ODA7CisgIHRbNzc5XSA9IDE3ODE7CisgIHRbNzgwXSA9IDE3ODI7CisgIHRbNzgyXSA9IDc3MTsKKyAgdFs3ODNdID0gNjQ3MjY7CisgIHRbNzg2XSA9IDgzNjM7CisgIHRbNzg4XSA9IDg1MzI7CisgIHRbNzkwXSA9IDc2ODsKKyAgdFs3OTFdID0gNzY5OworICB0Wzc5Ml0gPSA3Njg7CisgIHRbNzk1XSA9IDgwMzsKKyAgdFs3OTddID0gNjQzMzY7CisgIHRbNzk4XSA9IDY0MzM3OworICB0Wzc5OV0gPSA2NDM0MjsKKyAgdFs4MDBdID0gNjQzNDM7CisgIHRbODAxXSA9IDY0MzQ0OworICB0WzgwMl0gPSA2NDM0NTsKKyAgdFs4MDNdID0gNjQzNjI7CisgIHRbODA0XSA9IDY0MzYzOworICB0WzgwNV0gPSA2NDM2NDsKKyAgdFsyNDI0XSA9IDc4MjE7CisgIHRbMjQyNV0gPSA3ODIyOworICB0WzI0MjZdID0gNzgyMzsKKyAgdFsyNDI3XSA9IDc4MjQ7CisgIHRbMjQyOF0gPSA3ODI1OworICB0WzI0MjldID0gNzgyNjsKKyAgdFsyNDMwXSA9IDc4Mjc7CisgIHRbMjQzM10gPSA3NjgyOworICB0WzI2NzhdID0gODA0NTsKKyAgdFsyNjc5XSA9IDgwNDY7CisgIHRbMjgzMF0gPSAxNTUyOworICB0WzI4MzhdID0gNjg2OworICB0WzI4NDBdID0gNzUxOworICB0WzI4NDJdID0gNzUzOworICB0WzI4NDNdID0gNzU0OworICB0WzI4NDRdID0gNzU1OworICB0WzI4NDZdID0gNzU3OworICB0WzI4NTZdID0gNzY3OworICB0WzI4NTddID0gODQ4OworICB0WzI4NThdID0gODQ5OworICB0WzI4NjJdID0gODUzOworICB0WzI4NjNdID0gODU0OworICB0WzI4NjRdID0gODU1OworICB0WzI4NjVdID0gODYxOworICB0WzI4NjZdID0gODYyOworICB0WzI5MDZdID0gNzQ2MDsKKyAgdFsyOTA4XSA9IDc0NjI7CisgIHRbMjkwOV0gPSA3NDYzOworICB0WzI5MTBdID0gNzQ2NDsKKyAgdFsyOTEyXSA9IDc0NjY7CisgIHRbMjkxM10gPSA3NDY3OworICB0WzI5MTRdID0gNzQ2ODsKKyAgdFsyOTE2XSA9IDc0NzA7CisgIHRbMjkxN10gPSA3NDcxOworICB0WzI5MThdID0gNzQ3MjsKKyAgdFsyOTIwXSA9IDc0NzQ7CisgIHRbMjkyMV0gPSA3NDc1OworICB0WzI5MjJdID0gNzQ3NjsKKyAgdFsyOTI0XSA9IDc0Nzg7CisgIHRbMjkyNV0gPSA3NDc5OworICB0WzI5MjZdID0gNzQ4MDsKKyAgdFsyOTI4XSA9IDc0ODI7CisgIHRbMjkyOV0gPSA3NDgzOworICB0WzI5MzBdID0gNzQ4NDsKKyAgdFsyOTMyXSA9IDc0ODY7CisgIHRbMjkzM10gPSA3NDg3OworICB0WzI5MzRdID0gNzQ4ODsKKyAgdFsyOTM2XSA9IDc0OTA7CisgIHRbMjkzN10gPSA3NDkxOworICB0WzI5MzhdID0gNzQ5MjsKKyAgdFsyOTQwXSA9IDc0OTQ7CisgIHRbMjk0MV0gPSA3NDk1OworICB0WzI5NDJdID0gNzQ5NjsKKyAgdFsyOTQ0XSA9IDc0OTg7CisgIHRbMjk0Nl0gPSA3NTAwOworICB0WzI5NDhdID0gNzUwMjsKKyAgdFsyOTUwXSA9IDc1MDQ7CisgIHRbMjk1MV0gPSA3NTA1OworICB0WzI5NTJdID0gNzUwNjsKKyAgdFsyOTU0XSA9IDc1MDg7CisgIHRbMjk1NV0gPSA3NTA5OworICB0WzI5NTZdID0gNzUxMDsKKyAgdFsyOTU4XSA9IDc1MTI7CisgIHRbMjk1OV0gPSA3NTEzOworICB0WzI5NjBdID0gNzUxNDsKKyAgdFsyOTYyXSA9IDc1MTY7CisgIHRbMjk2M10gPSA3NTE3OworICB0WzI5NjRdID0gNzUxODsKKyAgdFsyOTY2XSA9IDc1MjA7CisgIHRbMjk2N10gPSA3NTIxOworICB0WzI5NjhdID0gNzUyMjsKKyAgdFsyOTcwXSA9IDc1MjQ7CisgIHRbMjk3MV0gPSA3NTI1OworICB0WzI5NzJdID0gNzUyNjsKKyAgdFsyOTc0XSA9IDc1Mjg7CisgIHRbMjk3NV0gPSA3NTI5OworICB0WzI5NzZdID0gNzUzMDsKKyAgdFsyOTc4XSA9IDE1Mzc7CisgIHRbMjk3OV0gPSAxNTM4OworICB0WzI5ODBdID0gMTUzOTsKKyAgdFsyOTgyXSA9IDE1NDk7CisgIHRbMjk4M10gPSAxNTUxOworICB0WzI5ODRdID0gMTU1MjsKKyAgdFsyOTg2XSA9IDE1NTQ7CisgIHRbMjk4N10gPSAxNTU1OworICB0WzI5ODhdID0gMTU1NjsKKyAgdFsyOTkwXSA9IDE2MjM7CisgIHRbMjk5MV0gPSAxNjI0OworICB0WzI5OTVdID0gMTc3NTsKKyAgdFsyOTk5XSA9IDE3OTE7CisgIHRbMzAwMl0gPSA2NDI5MDsKKyAgdFszMDAzXSA9IDY0MjkxOworICB0WzMwMDRdID0gNjQyOTI7CisgIHRbMzAwNl0gPSA2NDI5NDsKKyAgdFszMDA3XSA9IDY0Mjk1OworICB0WzMwMDhdID0gNjQyOTY7CisgIHRbMzAxMV0gPSAxOTAwOworICB0WzMwMTRdID0gODIyMzsKKyAgdFszMDE1XSA9IDgyNDQ7CisgIHRbMzAxN10gPSA3NTMyOworICB0WzMwMThdID0gNzUzMzsKKyAgdFszMDE5XSA9IDc1MzQ7CisgIHRbMzA3NV0gPSA3NTkwOworICB0WzMwNzZdID0gNzU5MTsKKyAgdFszMDc5XSA9IDc1OTQ7CisgIHRbMzA4MF0gPSA3NTk1OworICB0WzMwODNdID0gNzU5ODsKKyAgdFszMDg0XSA9IDc1OTk7CisgIHRbMzA4N10gPSA3NjAyOworICB0WzMwODhdID0gNzYwMzsKKyAgdFszMDkxXSA9IDc2MDY7CisgIHRbMzA5Ml0gPSA3NjA3OworICB0WzMwOTVdID0gNzYxMDsKKyAgdFszMDk2XSA9IDc2MTE7CisgIHRbMzA5OV0gPSA3NjE0OworICB0WzMxMDBdID0gNzYxNTsKKyAgdFszMTAzXSA9IDc2MTg7CisgIHRbMzEwNF0gPSA3NjE5OworICB0WzMxMDddID0gODMzNzsKKyAgdFszMTA4XSA9IDgzMzg7CisgIHRbMzExNl0gPSAxODg0OworICB0WzMxMTldID0gMTg4NTsKKyAgdFszMTIwXSA9IDE4ODU7CisgIHRbMzEyM10gPSAxODg2OworICB0WzMxMjRdID0gMTg4NjsKKyAgdFszMTI3XSA9IDE4ODc7CisgIHRbMzEyOF0gPSAxODg3OworICB0WzMxMzFdID0gMTg4ODsKKyAgdFszMTMyXSA9IDE4ODg7CisgIHRbMzEzNV0gPSAxODg5OworICB0WzMxMzZdID0gMTg4OTsKKyAgdFszMTM5XSA9IDE4OTA7CisgIHRbMzE0MF0gPSAxODkwOworICB0WzMxNDNdID0gMTg5MTsKKyAgdFszMTQ0XSA9IDE4OTE7CisgIHRbMzE0N10gPSAxODkyOworICB0WzMxNDhdID0gMTg5MjsKKyAgdFszMTUzXSA9IDU4MDsKKyAgdFszMTU0XSA9IDU4MTsKKyAgdFszMTU3XSA9IDU4NDsKKyAgdFszMTU4XSA9IDU4NTsKKyAgdFszMTYxXSA9IDU4ODsKKyAgdFszMTYyXSA9IDU4OTsKKyAgdFszMTY1XSA9IDg5MTsKKyAgdFszMTY2XSA9IDg5MjsKKyAgdFszMTY5XSA9IDEyNzQ7CisgIHRbMzE3MF0gPSAxMjc1OworICB0WzMxNzNdID0gMTI3ODsKKyAgdFszMTc0XSA9IDEyNzk7CisgIHRbMzE4MV0gPSA3NjIyOworICB0WzMxODJdID0gNzYyMzsKKyAgdFszMjgyXSA9IDExNzk5OworICB0WzMzMTZdID0gNTc4OworICB0WzMzNzldID0gNDI3ODU7CisgIHRbMzM5M10gPSAxMTU5OworICB0WzM0MTZdID0gODM3NzsKK30pOworZXhwb3J0cy5nZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHM7Citjb25zdCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0WzIyN10gPSAzMjI7CisgIHRbMjY0XSA9IDI2MTsKKyAgdFsyOTFdID0gMzQ2OworfSk7CitleHBvcnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayA9IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjazsKK2NvbnN0IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgIHRbMV0gPSAzMjsKKyAgdFs0XSA9IDY1OworICB0WzE3XSA9IDY2OworICB0WzE4XSA9IDY3OworICB0WzI0XSA9IDY4OworICB0WzI4XSA9IDY5OworICB0WzM4XSA9IDcwOworICB0WzM5XSA9IDcxOworICB0WzQ0XSA9IDcyOworICB0WzQ3XSA9IDczOworICB0WzU4XSA9IDc0OworICB0WzYwXSA9IDc1OworICB0WzYyXSA9IDc2OworICB0WzY4XSA9IDc3OworICB0WzY5XSA9IDc4OworICB0Wzc1XSA9IDc5OworICB0Wzg3XSA9IDgwOworICB0Wzg5XSA9IDgxOworICB0WzkwXSA9IDgyOworICB0Wzk0XSA9IDgzOworICB0WzEwMF0gPSA4NDsKKyAgdFsxMDRdID0gODU7CisgIHRbMTE1XSA9IDg2OworICB0WzExNl0gPSA4NzsKKyAgdFsxMjFdID0gODg7CisgIHRbMTIyXSA9IDg5OworICB0WzEyN10gPSA5MDsKKyAgdFsyNThdID0gOTc7CisgIHRbMjY4XSA9IDI2MTsKKyAgdFsyNzFdID0gOTg7CisgIHRbMjcyXSA9IDk5OworICB0WzI3M10gPSAyNjM7CisgIHRbMjgyXSA9IDEwMDsKKyAgdFsyODZdID0gMTAxOworICB0WzI5NV0gPSAyODE7CisgIHRbMjk2XSA9IDEwMjsKKyAgdFszMzZdID0gMTAzOworICB0WzM0Nl0gPSAxMDQ7CisgIHRbMzQ5XSA9IDEwNTsKKyAgdFszNjFdID0gMTA2OworICB0WzM2NF0gPSAxMDc7CisgIHRbMzY3XSA9IDEwODsKKyAgdFszNzFdID0gMzIyOworICB0WzM3M10gPSAxMDk7CisgIHRbMzc0XSA9IDExMDsKKyAgdFszODFdID0gMTExOworICB0WzM4M10gPSAyNDM7CisgIHRbMzkzXSA9IDExMjsKKyAgdFszOTVdID0gMTEzOworICB0WzM5Nl0gPSAxMTQ7CisgIHRbNDAwXSA9IDExNTsKKyAgdFs0MDFdID0gMzQ3OworICB0WzQxMF0gPSAxMTY7CisgIHRbNDM3XSA9IDExNzsKKyAgdFs0NDhdID0gMTE4OworICB0WzQ0OV0gPSAxMTk7CisgIHRbNDU0XSA9IDEyMDsKKyAgdFs0NTVdID0gMTIxOworICB0WzQ2MF0gPSAxMjI7CisgIHRbNDYzXSA9IDM4MDsKKyAgdFs4NTNdID0gNDQ7CisgIHRbODU1XSA9IDU4OworICB0Wzg1Nl0gPSA0NjsKKyAgdFs4NzZdID0gNDc7CisgIHRbODc4XSA9IDQ1OworICB0Wzg4Ml0gPSA0NTsKKyAgdFs4OTRdID0gNDA7CisgIHRbODk1XSA9IDQxOworICB0Wzg5Nl0gPSA5MTsKKyAgdFs4OTddID0gOTM7CisgIHRbOTIzXSA9IDY0OworICB0WzEwMDRdID0gNDg7CisgIHRbMTAwNV0gPSA0OTsKKyAgdFsxMDA2XSA9IDUwOworICB0WzEwMDddID0gNTE7CisgIHRbMTAwOF0gPSA1MjsKKyAgdFsxMDA5XSA9IDUzOworICB0WzEwMTBdID0gNTQ7CisgIHRbMTAxMV0gPSA1NTsKKyAgdFsxMDEyXSA9IDU2OworICB0WzEwMTNdID0gNTc7CisgIHRbMTA4MV0gPSAzNzsKKyAgdFsxMDg1XSA9IDQzOworICB0WzEwODZdID0gNDU7Cit9KTsKK2V4cG9ydHMuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpID0gZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpOworCisvKioqLyB9KSwKKy8qIDM2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnZXRMb29rdXBUYWJsZUZhY3RvcnkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpLmdldExvb2t1cFRhYmxlRmFjdG9yeTsKK3ZhciBnZXRTcGVjaWFsUFVBU3ltYm9scyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgeworIHRbNjM3MjFdID0gMHgwMGE5OworIHRbNjMxOTNdID0gMHgwMGE5OworIHRbNjM3MjBdID0gMHgwMGFlOworIHRbNjMxOTRdID0gMHgwMGFlOworIHRbNjM3MjJdID0gMHgyMTIyOworIHRbNjMxOTVdID0gMHgyMTIyOworIHRbNjM3MjldID0gMHgyM2E3OworIHRbNjM3MzBdID0gMHgyM2E4OworIHRbNjM3MzFdID0gMHgyM2E5OworIHRbNjM3NDBdID0gMHgyM2FiOworIHRbNjM3NDFdID0gMHgyM2FjOworIHRbNjM3NDJdID0gMHgyM2FkOworIHRbNjM3MjZdID0gMHgyM2ExOworIHRbNjM3MjddID0gMHgyM2EyOworIHRbNjM3MjhdID0gMHgyM2EzOworIHRbNjM3MzddID0gMHgyM2E0OworIHRbNjM3MzhdID0gMHgyM2E1OworIHRbNjM3MzldID0gMHgyM2E2OworIHRbNjM3MjNdID0gMHgyMzliOworIHRbNjM3MjRdID0gMHgyMzljOworIHRbNjM3MjVdID0gMHgyMzlkOworIHRbNjM3MzRdID0gMHgyMzllOworIHRbNjM3MzVdID0gMHgyMzlmOworIHRbNjM3MzZdID0gMHgyM2EwOworfSk7CitmdW5jdGlvbiBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhjb2RlKSB7CisgaWYgKGNvZGUgPj0gMHhmZmYwICYmIGNvZGUgPD0gMHhmZmZmKSB7CisgIHJldHVybiAwOworIH0gZWxzZSBpZiAoY29kZSA+PSAweGY2MDAgJiYgY29kZSA8PSAweGY4ZmYpIHsKKyAgcmV0dXJuIGdldFNwZWNpYWxQVUFTeW1ib2xzKClbY29kZV0gfHwgY29kZTsKKyB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MDBhZCkgeworICByZXR1cm4gMHgwMDJkOworIH0KKyByZXR1cm4gY29kZTsKK30KK2Z1bmN0aW9uIGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CisgdmFyIHVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW25hbWVdOworIGlmICh1bmljb2RlICE9PSB1bmRlZmluZWQpIHsKKyAgcmV0dXJuIHVuaWNvZGU7CisgfQorIGlmICghbmFtZSkgeworICByZXR1cm4gLTE7CisgfQorIGlmIChuYW1lWzBdID09PSAidSIpIHsKKyAgdmFyIG5hbWVMZW4gPSBuYW1lLmxlbmd0aCwgaGV4U3RyOworICBpZiAobmFtZUxlbiA9PT0gNyAmJiBuYW1lWzFdID09PSAibiIgJiYgbmFtZVsyXSA9PT0gImkiKSB7CisgICBoZXhTdHIgPSBuYW1lLnN1YnN0cmluZygzKTsKKyAgfSBlbHNlIGlmIChuYW1lTGVuID49IDUgJiYgbmFtZUxlbiA8PSA3KSB7CisgICBoZXhTdHIgPSBuYW1lLnN1YnN0cmluZygxKTsKKyAgfSBlbHNlIHsKKyAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoaGV4U3RyID09PSBoZXhTdHIudG9VcHBlckNhc2UoKSkgeworICAgdW5pY29kZSA9IHBhcnNlSW50KGhleFN0ciwgMTYpOworICAgaWYgKHVuaWNvZGUgPj0gMCkgeworICAgIHJldHVybiB1bmljb2RlOworICAgfQorICB9CisgfQorIHJldHVybiAtMTsKK30KK3ZhciBVbmljb2RlUmFuZ2VzID0gWworIHsKKyAgYmVnaW46IDB4MDAwMCwKKyAgZW5kOiAweDAwN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MDA4MCwKKyAgZW5kOiAweDAwZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDEwMCwKKyAgZW5kOiAweDAxN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MDE4MCwKKyAgZW5kOiAweDAyNGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDI1MCwKKyAgZW5kOiAweDAyYWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDJiMCwKKyAgZW5kOiAweDAyZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDMwMCwKKyAgZW5kOiAweDAzNmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDM3MCwKKyAgZW5kOiAweDAzZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MmM4MCwKKyAgZW5kOiAweDJjZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDQwMCwKKyAgZW5kOiAweDA0ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDUzMCwKKyAgZW5kOiAweDA1OGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDU5MCwKKyAgZW5kOiAweDA1ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4YTUwMCwKKyAgZW5kOiAweGE2M2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MDYwMCwKKyAgZW5kOiAweDA2ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDdjMCwKKyAgZW5kOiAweDA3ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDkwMCwKKyAgZW5kOiAweDA5N2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MDk4MCwKKyAgZW5kOiAweDA5ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MGEwMCwKKyAgZW5kOiAweDBhN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MGE4MCwKKyAgZW5kOiAweDBhZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MGIwMCwKKyAgZW5kOiAweDBiN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MGI4MCwKKyAgZW5kOiAweDBiZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MGMwMCwKKyAgZW5kOiAweDBjN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MGM4MCwKKyAgZW5kOiAweDBjZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MGQwMCwKKyAgZW5kOiAweDBkN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MGUwMCwKKyAgZW5kOiAweDBlN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MGU4MCwKKyAgZW5kOiAweDBlZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTBhMCwKKyAgZW5kOiAweDEwZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWIwMCwKKyAgZW5kOiAweDFiN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MTEwMCwKKyAgZW5kOiAweDExZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWUwMCwKKyAgZW5kOiAweDFlZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWYwMCwKKyAgZW5kOiAweDFmZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjAwMCwKKyAgZW5kOiAweDIwNmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjA3MCwKKyAgZW5kOiAweDIwOWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjBhMCwKKyAgZW5kOiAweDIwY2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MjBkMCwKKyAgZW5kOiAweDIwZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjEwMCwKKyAgZW5kOiAweDIxNGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjE1MCwKKyAgZW5kOiAweDIxOGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjE5MCwKKyAgZW5kOiAweDIxZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjIwMCwKKyAgZW5kOiAweDIyZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjMwMCwKKyAgZW5kOiAweDIzZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjQwMCwKKyAgZW5kOiAweDI0M2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MjQ0MCwKKyAgZW5kOiAweDI0NWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjQ2MCwKKyAgZW5kOiAweDI0ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjUwMCwKKyAgZW5kOiAweDI1N2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MjU4MCwKKyAgZW5kOiAweDI1OWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjVhMCwKKyAgZW5kOiAweDI1ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjYwMCwKKyAgZW5kOiAweDI2ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjcwMCwKKyAgZW5kOiAweDI3YmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MzAwMCwKKyAgZW5kOiAweDMwM2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MzA0MCwKKyAgZW5kOiAweDMwOWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MzBhMCwKKyAgZW5kOiAweDMwZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MzEwMCwKKyAgZW5kOiAweDMxMmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MzEzMCwKKyAgZW5kOiAweDMxOGYKKyB9LAorIHsKKyAgYmVnaW46IDB4YTg0MCwKKyAgZW5kOiAweGE4N2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MzIwMCwKKyAgZW5kOiAweDMyZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MzMwMCwKKyAgZW5kOiAweDMzZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4YWMwMCwKKyAgZW5kOiAweGQ3YWYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZDgwMCwKKyAgZW5kOiAweGRmZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTA5MDAsCisgIGVuZDogMHgxMDkxZgorIH0sCisgeworICBiZWdpbjogMHg0ZTAwLAorICBlbmQ6IDB4OWZmZgorIH0sCisgeworICBiZWdpbjogMHhlMDAwLAorICBlbmQ6IDB4ZjhmZgorIH0sCisgeworICBiZWdpbjogMHgzMWMwLAorICBlbmQ6IDB4MzFlZgorIH0sCisgeworICBiZWdpbjogMHhmYjAwLAorICBlbmQ6IDB4ZmI0ZgorIH0sCisgeworICBiZWdpbjogMHhmYjUwLAorICBlbmQ6IDB4ZmRmZgorIH0sCisgeworICBiZWdpbjogMHhmZTIwLAorICBlbmQ6IDB4ZmUyZgorIH0sCisgeworICBiZWdpbjogMHhmZTEwLAorICBlbmQ6IDB4ZmUxZgorIH0sCisgeworICBiZWdpbjogMHhmZTUwLAorICBlbmQ6IDB4ZmU2ZgorIH0sCisgeworICBiZWdpbjogMHhmZTcwLAorICBlbmQ6IDB4ZmVmZgorIH0sCisgeworICBiZWdpbjogMHhmZjAwLAorICBlbmQ6IDB4ZmZlZgorIH0sCisgeworICBiZWdpbjogMHhmZmYwLAorICBlbmQ6IDB4ZmZmZgorIH0sCisgeworICBiZWdpbjogMHgwZjAwLAorICBlbmQ6IDB4MGZmZgorIH0sCisgeworICBiZWdpbjogMHgwNzAwLAorICBlbmQ6IDB4MDc0ZgorIH0sCisgeworICBiZWdpbjogMHgwNzgwLAorICBlbmQ6IDB4MDdiZgorIH0sCisgeworICBiZWdpbjogMHgwZDgwLAorICBlbmQ6IDB4MGRmZgorIH0sCisgeworICBiZWdpbjogMHgxMDAwLAorICBlbmQ6IDB4MTA5ZgorIH0sCisgeworICBiZWdpbjogMHgxMjAwLAorICBlbmQ6IDB4MTM3ZgorIH0sCisgeworICBiZWdpbjogMHgxM2EwLAorICBlbmQ6IDB4MTNmZgorIH0sCisgeworICBiZWdpbjogMHgxNDAwLAorICBlbmQ6IDB4MTY3ZgorIH0sCisgeworICBiZWdpbjogMHgxNjgwLAorICBlbmQ6IDB4MTY5ZgorIH0sCisgeworICBiZWdpbjogMHgxNmEwLAorICBlbmQ6IDB4MTZmZgorIH0sCisgeworICBiZWdpbjogMHgxNzgwLAorICBlbmQ6IDB4MTdmZgorIH0sCisgeworICBiZWdpbjogMHgxODAwLAorICBlbmQ6IDB4MThhZgorIH0sCisgeworICBiZWdpbjogMHgyODAwLAorICBlbmQ6IDB4MjhmZgorIH0sCisgeworICBiZWdpbjogMHhhMDAwLAorICBlbmQ6IDB4YTQ4ZgorIH0sCisgeworICBiZWdpbjogMHgxNzAwLAorICBlbmQ6IDB4MTcxZgorIH0sCisgeworICBiZWdpbjogMHgxMDMwMCwKKyAgZW5kOiAweDEwMzJmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwMzMwLAorICBlbmQ6IDB4MTAzNGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTA0MDAsCisgIGVuZDogMHgxMDQ0ZgorIH0sCisgeworICBiZWdpbjogMHgxZDAwMCwKKyAgZW5kOiAweDFkMGZmCisgfSwKKyB7CisgIGJlZ2luOiAweDFkNDAwLAorICBlbmQ6IDB4MWQ3ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmYwMDAsCisgIGVuZDogMHhmZmZmZAorIH0sCisgeworICBiZWdpbjogMHhmZTAwLAorICBlbmQ6IDB4ZmUwZgorIH0sCisgeworICBiZWdpbjogMHhlMDAwMCwKKyAgZW5kOiAweGUwMDdmCisgfSwKKyB7CisgIGJlZ2luOiAweDE5MDAsCisgIGVuZDogMHgxOTRmCisgfSwKKyB7CisgIGJlZ2luOiAweDE5NTAsCisgIGVuZDogMHgxOTdmCisgfSwKKyB7CisgIGJlZ2luOiAweDE5ODAsCisgIGVuZDogMHgxOWRmCisgfSwKKyB7CisgIGJlZ2luOiAweDFhMDAsCisgIGVuZDogMHgxYTFmCisgfSwKKyB7CisgIGJlZ2luOiAweDJjMDAsCisgIGVuZDogMHgyYzVmCisgfSwKKyB7CisgIGJlZ2luOiAweDJkMzAsCisgIGVuZDogMHgyZDdmCisgfSwKKyB7CisgIGJlZ2luOiAweDRkYzAsCisgIGVuZDogMHg0ZGZmCisgfSwKKyB7CisgIGJlZ2luOiAweGE4MDAsCisgIGVuZDogMHhhODJmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwMDAwLAorICBlbmQ6IDB4MTAwN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MTAxNDAsCisgIGVuZDogMHgxMDE4ZgorIH0sCisgeworICBiZWdpbjogMHgxMDM4MCwKKyAgZW5kOiAweDEwMzlmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwM2EwLAorICBlbmQ6IDB4MTAzZGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTA0NTAsCisgIGVuZDogMHgxMDQ3ZgorIH0sCisgeworICBiZWdpbjogMHgxMDQ4MCwKKyAgZW5kOiAweDEwNGFmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwODAwLAorICBlbmQ6IDB4MTA4M2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MTBhMDAsCisgIGVuZDogMHgxMGE1ZgorIH0sCisgeworICBiZWdpbjogMHgxZDMwMCwKKyAgZW5kOiAweDFkMzVmCisgfSwKKyB7CisgIGJlZ2luOiAweDEyMDAwLAorICBlbmQ6IDB4MTIzZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWQzNjAsCisgIGVuZDogMHgxZDM3ZgorIH0sCisgeworICBiZWdpbjogMHgxYjgwLAorICBlbmQ6IDB4MWJiZgorIH0sCisgeworICBiZWdpbjogMHgxYzAwLAorICBlbmQ6IDB4MWM0ZgorIH0sCisgeworICBiZWdpbjogMHgxYzUwLAorICBlbmQ6IDB4MWM3ZgorIH0sCisgeworICBiZWdpbjogMHhhODgwLAorICBlbmQ6IDB4YThkZgorIH0sCisgeworICBiZWdpbjogMHhhOTAwLAorICBlbmQ6IDB4YTkyZgorIH0sCisgeworICBiZWdpbjogMHhhOTMwLAorICBlbmQ6IDB4YTk1ZgorIH0sCisgeworICBiZWdpbjogMHhhYTAwLAorICBlbmQ6IDB4YWE1ZgorIH0sCisgeworICBiZWdpbjogMHgxMDE5MCwKKyAgZW5kOiAweDEwMWNmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwMWQwLAorICBlbmQ6IDB4MTAxZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTAyYTAsCisgIGVuZDogMHgxMDJkZgorIH0sCisgeworICBiZWdpbjogMHgxZjAzMCwKKyAgZW5kOiAweDFmMDlmCisgfQorXTsKK2Z1bmN0aW9uIGdldFVuaWNvZGVSYW5nZUZvcih2YWx1ZSkgeworIGZvciAodmFyIGkgPSAwLCBpaSA9IFVuaWNvZGVSYW5nZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICB2YXIgcmFuZ2UgPSBVbmljb2RlUmFuZ2VzW2ldOworICBpZiAodmFsdWUgPj0gcmFuZ2UuYmVnaW4gJiYgdmFsdWUgPCByYW5nZS5lbmQpIHsKKyAgIHJldHVybiBpOworICB9CisgfQorIHJldHVybiAtMTsKK30KK2Z1bmN0aW9uIGlzUlRMUmFuZ2VGb3IodmFsdWUpIHsKKyB2YXIgcmFuZ2UgPSBVbmljb2RlUmFuZ2VzWzEzXTsKKyBpZiAodmFsdWUgPj0gcmFuZ2UuYmVnaW4gJiYgdmFsdWUgPCByYW5nZS5lbmQpIHsKKyAgcmV0dXJuIHRydWU7CisgfQorIHJhbmdlID0gVW5pY29kZVJhbmdlc1sxMV07CisgaWYgKHZhbHVlID49IHJhbmdlLmJlZ2luICYmIHZhbHVlIDwgcmFuZ2UuZW5kKSB7CisgIHJldHVybiB0cnVlOworIH0KKyByZXR1cm4gZmFsc2U7Cit9Cit2YXIgZ2V0Tm9ybWFsaXplZFVuaWNvZGVzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CisgdFsiXHUwMEE4Il0gPSAiXHUwMDIwXHUwMzA4IjsKKyB0WyJcdTAwQUYiXSA9ICJcdTAwMjBcdTAzMDQiOworIHRbIlx1MDBCNCJdID0gIlx1MDAyMFx1MDMwMSI7CisgdFsiXHUwMEI1Il0gPSAiXHUwM0JDIjsKKyB0WyJcdTAwQjgiXSA9ICJcdTAwMjBcdTAzMjciOworIHRbIlx1MDEzMiJdID0gIlx1MDA0OVx1MDA0QSI7CisgdFsiXHUwMTMzIl0gPSAiXHUwMDY5XHUwMDZBIjsKKyB0WyJcdTAxM0YiXSA9ICJcdTAwNENcdTAwQjciOworIHRbIlx1MDE0MCJdID0gIlx1MDA2Q1x1MDBCNyI7CisgdFsiXHUwMTQ5Il0gPSAiXHUwMkJDXHUwMDZFIjsKKyB0WyJcdTAxN0YiXSA9ICJcdTAwNzMiOworIHRbIlx1MDFDNCJdID0gIlx1MDA0NFx1MDE3RCI7CisgdFsiXHUwMUM1Il0gPSAiXHUwMDQ0XHUwMTdFIjsKKyB0WyJcdTAxQzYiXSA9ICJcdTAwNjRcdTAxN0UiOworIHRbIlx1MDFDNyJdID0gIlx1MDA0Q1x1MDA0QSI7CisgdFsiXHUwMUM4Il0gPSAiXHUwMDRDXHUwMDZBIjsKKyB0WyJcdTAxQzkiXSA9ICJcdTAwNkNcdTAwNkEiOworIHRbIlx1MDFDQSJdID0gIlx1MDA0RVx1MDA0QSI7CisgdFsiXHUwMUNCIl0gPSAiXHUwMDRFXHUwMDZBIjsKKyB0WyJcdTAxQ0MiXSA9ICJcdTAwNkVcdTAwNkEiOworIHRbIlx1MDFGMSJdID0gIlx1MDA0NFx1MDA1QSI7CisgdFsiXHUwMUYyIl0gPSAiXHUwMDQ0XHUwMDdBIjsKKyB0WyJcdTAxRjMiXSA9ICJcdTAwNjRcdTAwN0EiOworIHRbIlx1MDJEOCJdID0gIlx1MDAyMFx1MDMwNiI7CisgdFsiXHUwMkQ5Il0gPSAiXHUwMDIwXHUwMzA3IjsKKyB0WyJcdTAyREEiXSA9ICJcdTAwMjBcdTAzMEEiOworIHRbIlx1MDJEQiJdID0gIlx1MDAyMFx1MDMyOCI7CisgdFsiXHUwMkRDIl0gPSAiXHUwMDIwXHUwMzAzIjsKKyB0WyJcdTAyREQiXSA9ICJcdTAwMjBcdTAzMEIiOworIHRbIlx1MDM3QSJdID0gIlx1MDAyMFx1MDM0NSI7CisgdFsiXHUwMzg0Il0gPSAiXHUwMDIwXHUwMzAxIjsKKyB0WyJcdTAzRDAiXSA9ICJcdTAzQjIiOworIHRbIlx1MDNEMSJdID0gIlx1MDNCOCI7CisgdFsiXHUwM0QyIl0gPSAiXHUwM0E1IjsKKyB0WyJcdTAzRDUiXSA9ICJcdTAzQzYiOworIHRbIlx1MDNENiJdID0gIlx1MDNDMCI7CisgdFsiXHUwM0YwIl0gPSAiXHUwM0JBIjsKKyB0WyJcdTAzRjEiXSA9ICJcdTAzQzEiOworIHRbIlx1MDNGMiJdID0gIlx1MDNDMiI7CisgdFsiXHUwM0Y0Il0gPSAiXHUwMzk4IjsKKyB0WyJcdTAzRjUiXSA9ICJcdTAzQjUiOworIHRbIlx1MDNGOSJdID0gIlx1MDNBMyI7CisgdFsiXHUwNTg3Il0gPSAiXHUwNTY1XHUwNTgyIjsKKyB0WyJcdTA2NzUiXSA9ICJcdTA2MjdcdTA2NzQiOworIHRbIlx1MDY3NiJdID0gIlx1MDY0OFx1MDY3NCI7CisgdFsiXHUwNjc3Il0gPSAiXHUwNkM3XHUwNjc0IjsKKyB0WyJcdTA2NzgiXSA9ICJcdTA2NEFcdTA2NzQiOworIHRbIlx1MEUzMyJdID0gIlx1MEU0RFx1MEUzMiI7CisgdFsiXHUwRUIzIl0gPSAiXHUwRUNEXHUwRUIyIjsKKyB0WyJcdTBFREMiXSA9ICJcdTBFQUJcdTBFOTkiOworIHRbIlx1MEVERCJdID0gIlx1MEVBQlx1MEVBMSI7CisgdFsiXHUwRjc3Il0gPSAiXHUwRkIyXHUwRjgxIjsKKyB0WyJcdTBGNzkiXSA9ICJcdTBGQjNcdTBGODEiOworIHRbIlx1MUU5QSJdID0gIlx1MDA2MVx1MDJCRSI7CisgdFsiXHUxRkJEIl0gPSAiXHUwMDIwXHUwMzEzIjsKKyB0WyJcdTFGQkYiXSA9ICJcdTAwMjBcdTAzMTMiOworIHRbIlx1MUZDMCJdID0gIlx1MDAyMFx1MDM0MiI7CisgdFsiXHUxRkZFIl0gPSAiXHUwMDIwXHUwMzE0IjsKKyB0WyJcdTIwMDIiXSA9ICJcdTAwMjAiOworIHRbIlx1MjAwMyJdID0gIlx1MDAyMCI7CisgdFsiXHUyMDA0Il0gPSAiXHUwMDIwIjsKKyB0WyJcdTIwMDUiXSA9ICJcdTAwMjAiOworIHRbIlx1MjAwNiJdID0gIlx1MDAyMCI7CisgdFsiXHUyMDA4Il0gPSAiXHUwMDIwIjsKKyB0WyJcdTIwMDkiXSA9ICJcdTAwMjAiOworIHRbIlx1MjAwQSJdID0gIlx1MDAyMCI7CisgdFsiXHUyMDE3Il0gPSAiXHUwMDIwXHUwMzMzIjsKKyB0WyJcdTIwMjQiXSA9ICJcdTAwMkUiOworIHRbIlx1MjAyNSJdID0gIlx1MDAyRVx1MDAyRSI7CisgdFsiXHUyMDI2Il0gPSAiXHUwMDJFXHUwMDJFXHUwMDJFIjsKKyB0WyJcdTIwMzMiXSA9ICJcdTIwMzJcdTIwMzIiOworIHRbIlx1MjAzNCJdID0gIlx1MjAzMlx1MjAzMlx1MjAzMiI7CisgdFsiXHUyMDM2Il0gPSAiXHUyMDM1XHUyMDM1IjsKKyB0WyJcdTIwMzciXSA9ICJcdTIwMzVcdTIwMzVcdTIwMzUiOworIHRbIlx1MjAzQyJdID0gIlx1MDAyMVx1MDAyMSI7CisgdFsiXHUyMDNFIl0gPSAiXHUwMDIwXHUwMzA1IjsKKyB0WyJcdTIwNDciXSA9ICJcdTAwM0ZcdTAwM0YiOworIHRbIlx1MjA0OCJdID0gIlx1MDAzRlx1MDAyMSI7CisgdFsiXHUyMDQ5Il0gPSAiXHUwMDIxXHUwMDNGIjsKKyB0WyJcdTIwNTciXSA9ICJcdTIwMzJcdTIwMzJcdTIwMzJcdTIwMzIiOworIHRbIlx1MjA1RiJdID0gIlx1MDAyMCI7CisgdFsiXHUyMEE4Il0gPSAiXHUwMDUyXHUwMDczIjsKKyB0WyJcdTIxMDAiXSA9ICJcdTAwNjFcdTAwMkZcdTAwNjMiOworIHRbIlx1MjEwMSJdID0gIlx1MDA2MVx1MDAyRlx1MDA3MyI7CisgdFsiXHUyMTAzIl0gPSAiXHUwMEIwXHUwMDQzIjsKKyB0WyJcdTIxMDUiXSA9ICJcdTAwNjNcdTAwMkZcdTAwNkYiOworIHRbIlx1MjEwNiJdID0gIlx1MDA2M1x1MDAyRlx1MDA3NSI7CisgdFsiXHUyMTA3Il0gPSAiXHUwMTkwIjsKKyB0WyJcdTIxMDkiXSA9ICJcdTAwQjBcdTAwNDYiOworIHRbIlx1MjExNiJdID0gIlx1MDA0RVx1MDA2RiI7CisgdFsiXHUyMTIxIl0gPSAiXHUwMDU0XHUwMDQ1XHUwMDRDIjsKKyB0WyJcdTIxMzUiXSA9ICJcdTA1RDAiOworIHRbIlx1MjEzNiJdID0gIlx1MDVEMSI7CisgdFsiXHUyMTM3Il0gPSAiXHUwNUQyIjsKKyB0WyJcdTIxMzgiXSA9ICJcdTA1RDMiOworIHRbIlx1MjEzQiJdID0gIlx1MDA0Nlx1MDA0MVx1MDA1OCI7CisgdFsiXHUyMTYwIl0gPSAiXHUwMDQ5IjsKKyB0WyJcdTIxNjEiXSA9ICJcdTAwNDlcdTAwNDkiOworIHRbIlx1MjE2MiJdID0gIlx1MDA0OVx1MDA0OVx1MDA0OSI7CisgdFsiXHUyMTYzIl0gPSAiXHUwMDQ5XHUwMDU2IjsKKyB0WyJcdTIxNjQiXSA9ICJcdTAwNTYiOworIHRbIlx1MjE2NSJdID0gIlx1MDA1Nlx1MDA0OSI7CisgdFsiXHUyMTY2Il0gPSAiXHUwMDU2XHUwMDQ5XHUwMDQ5IjsKKyB0WyJcdTIxNjciXSA9ICJcdTAwNTZcdTAwNDlcdTAwNDlcdTAwNDkiOworIHRbIlx1MjE2OCJdID0gIlx1MDA0OVx1MDA1OCI7CisgdFsiXHUyMTY5Il0gPSAiXHUwMDU4IjsKKyB0WyJcdTIxNkEiXSA9ICJcdTAwNThcdTAwNDkiOworIHRbIlx1MjE2QiJdID0gIlx1MDA1OFx1MDA0OVx1MDA0OSI7CisgdFsiXHUyMTZDIl0gPSAiXHUwMDRDIjsKKyB0WyJcdTIxNkQiXSA9ICJcdTAwNDMiOworIHRbIlx1MjE2RSJdID0gIlx1MDA0NCI7CisgdFsiXHUyMTZGIl0gPSAiXHUwMDREIjsKKyB0WyJcdTIxNzAiXSA9ICJcdTAwNjkiOworIHRbIlx1MjE3MSJdID0gIlx1MDA2OVx1MDA2OSI7CisgdFsiXHUyMTcyIl0gPSAiXHUwMDY5XHUwMDY5XHUwMDY5IjsKKyB0WyJcdTIxNzMiXSA9ICJcdTAwNjlcdTAwNzYiOworIHRbIlx1MjE3NCJdID0gIlx1MDA3NiI7CisgdFsiXHUyMTc1Il0gPSAiXHUwMDc2XHUwMDY5IjsKKyB0WyJcdTIxNzYiXSA9ICJcdTAwNzZcdTAwNjlcdTAwNjkiOworIHRbIlx1MjE3NyJdID0gIlx1MDA3Nlx1MDA2OVx1MDA2OVx1MDA2OSI7CisgdFsiXHUyMTc4Il0gPSAiXHUwMDY5XHUwMDc4IjsKKyB0WyJcdTIxNzkiXSA9ICJcdTAwNzgiOworIHRbIlx1MjE3QSJdID0gIlx1MDA3OFx1MDA2OSI7CisgdFsiXHUyMTdCIl0gPSAiXHUwMDc4XHUwMDY5XHUwMDY5IjsKKyB0WyJcdTIxN0MiXSA9ICJcdTAwNkMiOworIHRbIlx1MjE3RCJdID0gIlx1MDA2MyI7CisgdFsiXHUyMTdFIl0gPSAiXHUwMDY0IjsKKyB0WyJcdTIxN0YiXSA9ICJcdTAwNkQiOworIHRbIlx1MjIyQyJdID0gIlx1MjIyQlx1MjIyQiI7CisgdFsiXHUyMjJEIl0gPSAiXHUyMjJCXHUyMjJCXHUyMjJCIjsKKyB0WyJcdTIyMkYiXSA9ICJcdTIyMkVcdTIyMkUiOworIHRbIlx1MjIzMCJdID0gIlx1MjIyRVx1MjIyRVx1MjIyRSI7CisgdFsiXHUyNDc0Il0gPSAiXHUwMDI4XHUwMDMxXHUwMDI5IjsKKyB0WyJcdTI0NzUiXSA9ICJcdTAwMjhcdTAwMzJcdTAwMjkiOworIHRbIlx1MjQ3NiJdID0gIlx1MDAyOFx1MDAzM1x1MDAyOSI7CisgdFsiXHUyNDc3Il0gPSAiXHUwMDI4XHUwMDM0XHUwMDI5IjsKKyB0WyJcdTI0NzgiXSA9ICJcdTAwMjhcdTAwMzVcdTAwMjkiOworIHRbIlx1MjQ3OSJdID0gIlx1MDAyOFx1MDAzNlx1MDAyOSI7CisgdFsiXHUyNDdBIl0gPSAiXHUwMDI4XHUwMDM3XHUwMDI5IjsKKyB0WyJcdTI0N0IiXSA9ICJcdTAwMjhcdTAwMzhcdTAwMjkiOworIHRbIlx1MjQ3QyJdID0gIlx1MDAyOFx1MDAzOVx1MDAyOSI7CisgdFsiXHUyNDdEIl0gPSAiXHUwMDI4XHUwMDMxXHUwMDMwXHUwMDI5IjsKKyB0WyJcdTI0N0UiXSA9ICJcdTAwMjhcdTAwMzFcdTAwMzFcdTAwMjkiOworIHRbIlx1MjQ3RiJdID0gIlx1MDAyOFx1MDAzMVx1MDAzMlx1MDAyOSI7CisgdFsiXHUyNDgwIl0gPSAiXHUwMDI4XHUwMDMxXHUwMDMzXHUwMDI5IjsKKyB0WyJcdTI0ODEiXSA9ICJcdTAwMjhcdTAwMzFcdTAwMzRcdTAwMjkiOworIHRbIlx1MjQ4MiJdID0gIlx1MDAyOFx1MDAzMVx1MDAzNVx1MDAyOSI7CisgdFsiXHUyNDgzIl0gPSAiXHUwMDI4XHUwMDMxXHUwMDM2XHUwMDI5IjsKKyB0WyJcdTI0ODQiXSA9ICJcdTAwMjhcdTAwMzFcdTAwMzdcdTAwMjkiOworIHRbIlx1MjQ4NSJdID0gIlx1MDAyOFx1MDAzMVx1MDAzOFx1MDAyOSI7CisgdFsiXHUyNDg2Il0gPSAiXHUwMDI4XHUwMDMxXHUwMDM5XHUwMDI5IjsKKyB0WyJcdTI0ODciXSA9ICJcdTAwMjhcdTAwMzJcdTAwMzBcdTAwMjkiOworIHRbIlx1MjQ4OCJdID0gIlx1MDAzMVx1MDAyRSI7CisgdFsiXHUyNDg5Il0gPSAiXHUwMDMyXHUwMDJFIjsKKyB0WyJcdTI0OEEiXSA9ICJcdTAwMzNcdTAwMkUiOworIHRbIlx1MjQ4QiJdID0gIlx1MDAzNFx1MDAyRSI7CisgdFsiXHUyNDhDIl0gPSAiXHUwMDM1XHUwMDJFIjsKKyB0WyJcdTI0OEQiXSA9ICJcdTAwMzZcdTAwMkUiOworIHRbIlx1MjQ4RSJdID0gIlx1MDAzN1x1MDAyRSI7CisgdFsiXHUyNDhGIl0gPSAiXHUwMDM4XHUwMDJFIjsKKyB0WyJcdTI0OTAiXSA9ICJcdTAwMzlcdTAwMkUiOworIHRbIlx1MjQ5MSJdID0gIlx1MDAzMVx1MDAzMFx1MDAyRSI7CisgdFsiXHUyNDkyIl0gPSAiXHUwMDMxXHUwMDMxXHUwMDJFIjsKKyB0WyJcdTI0OTMiXSA9ICJcdTAwMzFcdTAwMzJcdTAwMkUiOworIHRbIlx1MjQ5NCJdID0gIlx1MDAzMVx1MDAzM1x1MDAyRSI7CisgdFsiXHUyNDk1Il0gPSAiXHUwMDMxXHUwMDM0XHUwMDJFIjsKKyB0WyJcdTI0OTYiXSA9ICJcdTAwMzFcdTAwMzVcdTAwMkUiOworIHRbIlx1MjQ5NyJdID0gIlx1MDAzMVx1MDAzNlx1MDAyRSI7CisgdFsiXHUyNDk4Il0gPSAiXHUwMDMxXHUwMDM3XHUwMDJFIjsKKyB0WyJcdTI0OTkiXSA9ICJcdTAwMzFcdTAwMzhcdTAwMkUiOworIHRbIlx1MjQ5QSJdID0gIlx1MDAzMVx1MDAzOVx1MDAyRSI7CisgdFsiXHUyNDlCIl0gPSAiXHUwMDMyXHUwMDMwXHUwMDJFIjsKKyB0WyJcdTI0OUMiXSA9ICJcdTAwMjhcdTAwNjFcdTAwMjkiOworIHRbIlx1MjQ5RCJdID0gIlx1MDAyOFx1MDA2Mlx1MDAyOSI7CisgdFsiXHUyNDlFIl0gPSAiXHUwMDI4XHUwMDYzXHUwMDI5IjsKKyB0WyJcdTI0OUYiXSA9ICJcdTAwMjhcdTAwNjRcdTAwMjkiOworIHRbIlx1MjRBMCJdID0gIlx1MDAyOFx1MDA2NVx1MDAyOSI7CisgdFsiXHUyNEExIl0gPSAiXHUwMDI4XHUwMDY2XHUwMDI5IjsKKyB0WyJcdTI0QTIiXSA9ICJcdTAwMjhcdTAwNjdcdTAwMjkiOworIHRbIlx1MjRBMyJdID0gIlx1MDAyOFx1MDA2OFx1MDAyOSI7CisgdFsiXHUyNEE0Il0gPSAiXHUwMDI4XHUwMDY5XHUwMDI5IjsKKyB0WyJcdTI0QTUiXSA9ICJcdTAwMjhcdTAwNkFcdTAwMjkiOworIHRbIlx1MjRBNiJdID0gIlx1MDAyOFx1MDA2Qlx1MDAyOSI7CisgdFsiXHUyNEE3Il0gPSAiXHUwMDI4XHUwMDZDXHUwMDI5IjsKKyB0WyJcdTI0QTgiXSA9ICJcdTAwMjhcdTAwNkRcdTAwMjkiOworIHRbIlx1MjRBOSJdID0gIlx1MDAyOFx1MDA2RVx1MDAyOSI7CisgdFsiXHUyNEFBIl0gPSAiXHUwMDI4XHUwMDZGXHUwMDI5IjsKKyB0WyJcdTI0QUIiXSA9ICJcdTAwMjhcdTAwNzBcdTAwMjkiOworIHRbIlx1MjRBQyJdID0gIlx1MDAyOFx1MDA3MVx1MDAyOSI7CisgdFsiXHUyNEFEIl0gPSAiXHUwMDI4XHUwMDcyXHUwMDI5IjsKKyB0WyJcdTI0QUUiXSA9ICJcdTAwMjhcdTAwNzNcdTAwMjkiOworIHRbIlx1MjRBRiJdID0gIlx1MDAyOFx1MDA3NFx1MDAyOSI7CisgdFsiXHUyNEIwIl0gPSAiXHUwMDI4XHUwMDc1XHUwMDI5IjsKKyB0WyJcdTI0QjEiXSA9ICJcdTAwMjhcdTAwNzZcdTAwMjkiOworIHRbIlx1MjRCMiJdID0gIlx1MDAyOFx1MDA3N1x1MDAyOSI7CisgdFsiXHUyNEIzIl0gPSAiXHUwMDI4XHUwMDc4XHUwMDI5IjsKKyB0WyJcdTI0QjQiXSA9ICJcdTAwMjhcdTAwNzlcdTAwMjkiOworIHRbIlx1MjRCNSJdID0gIlx1MDAyOFx1MDA3QVx1MDAyOSI7CisgdFsiXHUyQTBDIl0gPSAiXHUyMjJCXHUyMjJCXHUyMjJCXHUyMjJCIjsKKyB0WyJcdTJBNzQiXSA9ICJcdTAwM0FcdTAwM0FcdTAwM0QiOworIHRbIlx1MkE3NSJdID0gIlx1MDAzRFx1MDAzRCI7CisgdFsiXHUyQTc2Il0gPSAiXHUwMDNEXHUwMDNEXHUwMDNEIjsKKyB0WyJcdTJFOUYiXSA9ICJcdTZCQ0QiOworIHRbIlx1MkVGMyJdID0gIlx1OUY5RiI7CisgdFsiXHUyRjAwIl0gPSAiXHU0RTAwIjsKKyB0WyJcdTJGMDEiXSA9ICJcdTRFMjgiOworIHRbIlx1MkYwMiJdID0gIlx1NEUzNiI7CisgdFsiXHUyRjAzIl0gPSAiXHU0RTNGIjsKKyB0WyJcdTJGMDQiXSA9ICJcdTRFNTkiOworIHRbIlx1MkYwNSJdID0gIlx1NEU4NSI7CisgdFsiXHUyRjA2Il0gPSAiXHU0RThDIjsKKyB0WyJcdTJGMDciXSA9ICJcdTRFQTAiOworIHRbIlx1MkYwOCJdID0gIlx1NEVCQSI7CisgdFsiXHUyRjA5Il0gPSAiXHU1MTNGIjsKKyB0WyJcdTJGMEEiXSA9ICJcdTUxNjUiOworIHRbIlx1MkYwQiJdID0gIlx1NTE2QiI7CisgdFsiXHUyRjBDIl0gPSAiXHU1MTgyIjsKKyB0WyJcdTJGMEQiXSA9ICJcdTUxOTYiOworIHRbIlx1MkYwRSJdID0gIlx1NTFBQiI7CisgdFsiXHUyRjBGIl0gPSAiXHU1MUUwIjsKKyB0WyJcdTJGMTAiXSA9ICJcdTUxRjUiOworIHRbIlx1MkYxMSJdID0gIlx1NTIwMCI7CisgdFsiXHUyRjEyIl0gPSAiXHU1MjlCIjsKKyB0WyJcdTJGMTMiXSA9ICJcdTUyRjkiOworIHRbIlx1MkYxNCJdID0gIlx1NTMxNSI7CisgdFsiXHUyRjE1Il0gPSAiXHU1MzFBIjsKKyB0WyJcdTJGMTYiXSA9ICJcdTUzMzgiOworIHRbIlx1MkYxNyJdID0gIlx1NTM0MSI7CisgdFsiXHUyRjE4Il0gPSAiXHU1MzVDIjsKKyB0WyJcdTJGMTkiXSA9ICJcdTUzNjkiOworIHRbIlx1MkYxQSJdID0gIlx1NTM4MiI7CisgdFsiXHUyRjFCIl0gPSAiXHU1M0I2IjsKKyB0WyJcdTJGMUMiXSA9ICJcdTUzQzgiOworIHRbIlx1MkYxRCJdID0gIlx1NTNFMyI7CisgdFsiXHUyRjFFIl0gPSAiXHU1NkQ3IjsKKyB0WyJcdTJGMUYiXSA9ICJcdTU3MUYiOworIHRbIlx1MkYyMCJdID0gIlx1NThFQiI7CisgdFsiXHUyRjIxIl0gPSAiXHU1OTAyIjsKKyB0WyJcdTJGMjIiXSA9ICJcdTU5MEEiOworIHRbIlx1MkYyMyJdID0gIlx1NTkxNSI7CisgdFsiXHUyRjI0Il0gPSAiXHU1OTI3IjsKKyB0WyJcdTJGMjUiXSA9ICJcdTU5NzMiOworIHRbIlx1MkYyNiJdID0gIlx1NUI1MCI7CisgdFsiXHUyRjI3Il0gPSAiXHU1QjgwIjsKKyB0WyJcdTJGMjgiXSA9ICJcdTVCRjgiOworIHRbIlx1MkYyOSJdID0gIlx1NUMwRiI7CisgdFsiXHUyRjJBIl0gPSAiXHU1QzIyIjsKKyB0WyJcdTJGMkIiXSA9ICJcdTVDMzgiOworIHRbIlx1MkYyQyJdID0gIlx1NUM2RSI7CisgdFsiXHUyRjJEIl0gPSAiXHU1QzcxIjsKKyB0WyJcdTJGMkUiXSA9ICJcdTVEREIiOworIHRbIlx1MkYyRiJdID0gIlx1NURFNSI7CisgdFsiXHUyRjMwIl0gPSAiXHU1REYxIjsKKyB0WyJcdTJGMzEiXSA9ICJcdTVERkUiOworIHRbIlx1MkYzMiJdID0gIlx1NUU3MiI7CisgdFsiXHUyRjMzIl0gPSAiXHU1RTdBIjsKKyB0WyJcdTJGMzQiXSA9ICJcdTVFN0YiOworIHRbIlx1MkYzNSJdID0gIlx1NUVGNCI7CisgdFsiXHUyRjM2Il0gPSAiXHU1RUZFIjsKKyB0WyJcdTJGMzciXSA9ICJcdTVGMEIiOworIHRbIlx1MkYzOCJdID0gIlx1NUYxMyI7CisgdFsiXHUyRjM5Il0gPSAiXHU1RjUwIjsKKyB0WyJcdTJGM0EiXSA9ICJcdTVGNjEiOworIHRbIlx1MkYzQiJdID0gIlx1NUY3MyI7CisgdFsiXHUyRjNDIl0gPSAiXHU1RkMzIjsKKyB0WyJcdTJGM0QiXSA9ICJcdTYyMDgiOworIHRbIlx1MkYzRSJdID0gIlx1NjIzNiI7CisgdFsiXHUyRjNGIl0gPSAiXHU2MjRCIjsKKyB0WyJcdTJGNDAiXSA9ICJcdTY1MkYiOworIHRbIlx1MkY0MSJdID0gIlx1NjUzNCI7CisgdFsiXHUyRjQyIl0gPSAiXHU2NTg3IjsKKyB0WyJcdTJGNDMiXSA9ICJcdTY1OTciOworIHRbIlx1MkY0NCJdID0gIlx1NjVBNCI7CisgdFsiXHUyRjQ1Il0gPSAiXHU2NUI5IjsKKyB0WyJcdTJGNDYiXSA9ICJcdTY1RTAiOworIHRbIlx1MkY0NyJdID0gIlx1NjVFNSI7CisgdFsiXHUyRjQ4Il0gPSAiXHU2NkYwIjsKKyB0WyJcdTJGNDkiXSA9ICJcdTY3MDgiOworIHRbIlx1MkY0QSJdID0gIlx1NjcyOCI7CisgdFsiXHUyRjRCIl0gPSAiXHU2QjIwIjsKKyB0WyJcdTJGNEMiXSA9ICJcdTZCNjIiOworIHRbIlx1MkY0RCJdID0gIlx1NkI3OSI7CisgdFsiXHUyRjRFIl0gPSAiXHU2QkIzIjsKKyB0WyJcdTJGNEYiXSA9ICJcdTZCQ0IiOworIHRbIlx1MkY1MCJdID0gIlx1NkJENCI7CisgdFsiXHUyRjUxIl0gPSAiXHU2QkRCIjsKKyB0WyJcdTJGNTIiXSA9ICJcdTZDMEYiOworIHRbIlx1MkY1MyJdID0gIlx1NkMxNCI7CisgdFsiXHUyRjU0Il0gPSAiXHU2QzM0IjsKKyB0WyJcdTJGNTUiXSA9ICJcdTcwNkIiOworIHRbIlx1MkY1NiJdID0gIlx1NzIyQSI7CisgdFsiXHUyRjU3Il0gPSAiXHU3MjM2IjsKKyB0WyJcdTJGNTgiXSA9ICJcdTcyM0IiOworIHRbIlx1MkY1OSJdID0gIlx1NzIzRiI7CisgdFsiXHUyRjVBIl0gPSAiXHU3MjQ3IjsKKyB0WyJcdTJGNUIiXSA9ICJcdTcyNTkiOworIHRbIlx1MkY1QyJdID0gIlx1NzI1QiI7CisgdFsiXHUyRjVEIl0gPSAiXHU3MkFDIjsKKyB0WyJcdTJGNUUiXSA9ICJcdTczODQiOworIHRbIlx1MkY1RiJdID0gIlx1NzM4OSI7CisgdFsiXHUyRjYwIl0gPSAiXHU3NERDIjsKKyB0WyJcdTJGNjEiXSA9ICJcdTc0RTYiOworIHRbIlx1MkY2MiJdID0gIlx1NzUxOCI7CisgdFsiXHUyRjYzIl0gPSAiXHU3NTFGIjsKKyB0WyJcdTJGNjQiXSA9ICJcdTc1MjgiOworIHRbIlx1MkY2NSJdID0gIlx1NzUzMCI7CisgdFsiXHUyRjY2Il0gPSAiXHU3NThCIjsKKyB0WyJcdTJGNjciXSA9ICJcdTc1OTIiOworIHRbIlx1MkY2OCJdID0gIlx1NzY3NiI7CisgdFsiXHUyRjY5Il0gPSAiXHU3NjdEIjsKKyB0WyJcdTJGNkEiXSA9ICJcdTc2QUUiOworIHRbIlx1MkY2QiJdID0gIlx1NzZCRiI7CisgdFsiXHUyRjZDIl0gPSAiXHU3NkVFIjsKKyB0WyJcdTJGNkQiXSA9ICJcdTc3REIiOworIHRbIlx1MkY2RSJdID0gIlx1NzdFMiI7CisgdFsiXHUyRjZGIl0gPSAiXHU3N0YzIjsKKyB0WyJcdTJGNzAiXSA9ICJcdTc5M0EiOworIHRbIlx1MkY3MSJdID0gIlx1NzlCOCI7CisgdFsiXHUyRjcyIl0gPSAiXHU3OUJFIjsKKyB0WyJcdTJGNzMiXSA9ICJcdTdBNzQiOworIHRbIlx1MkY3NCJdID0gIlx1N0FDQiI7CisgdFsiXHUyRjc1Il0gPSAiXHU3QUY5IjsKKyB0WyJcdTJGNzYiXSA9ICJcdTdDNzMiOworIHRbIlx1MkY3NyJdID0gIlx1N0NGOCI7CisgdFsiXHUyRjc4Il0gPSAiXHU3RjM2IjsKKyB0WyJcdTJGNzkiXSA9ICJcdTdGNTEiOworIHRbIlx1MkY3QSJdID0gIlx1N0Y4QSI7CisgdFsiXHUyRjdCIl0gPSAiXHU3RkJEIjsKKyB0WyJcdTJGN0MiXSA9ICJcdTgwMDEiOworIHRbIlx1MkY3RCJdID0gIlx1ODAwQyI7CisgdFsiXHUyRjdFIl0gPSAiXHU4MDEyIjsKKyB0WyJcdTJGN0YiXSA9ICJcdTgwMzMiOworIHRbIlx1MkY4MCJdID0gIlx1ODA3RiI7CisgdFsiXHUyRjgxIl0gPSAiXHU4MDg5IjsKKyB0WyJcdTJGODIiXSA9ICJcdTgxRTMiOworIHRbIlx1MkY4MyJdID0gIlx1ODFFQSI7CisgdFsiXHUyRjg0Il0gPSAiXHU4MUYzIjsKKyB0WyJcdTJGODUiXSA9ICJcdTgxRkMiOworIHRbIlx1MkY4NiJdID0gIlx1ODIwQyI7CisgdFsiXHUyRjg3Il0gPSAiXHU4MjFCIjsKKyB0WyJcdTJGODgiXSA9ICJcdTgyMUYiOworIHRbIlx1MkY4OSJdID0gIlx1ODI2RSI7CisgdFsiXHUyRjhBIl0gPSAiXHU4MjcyIjsKKyB0WyJcdTJGOEIiXSA9ICJcdTgyNzgiOworIHRbIlx1MkY4QyJdID0gIlx1ODY0RCI7CisgdFsiXHUyRjhEIl0gPSAiXHU4NjZCIjsKKyB0WyJcdTJGOEUiXSA9ICJcdTg4NDAiOworIHRbIlx1MkY4RiJdID0gIlx1ODg0QyI7CisgdFsiXHUyRjkwIl0gPSAiXHU4ODYzIjsKKyB0WyJcdTJGOTEiXSA9ICJcdTg5N0UiOworIHRbIlx1MkY5MiJdID0gIlx1ODk4QiI7CisgdFsiXHUyRjkzIl0gPSAiXHU4OUQyIjsKKyB0WyJcdTJGOTQiXSA9ICJcdThBMDAiOworIHRbIlx1MkY5NSJdID0gIlx1OEMzNyI7CisgdFsiXHUyRjk2Il0gPSAiXHU4QzQ2IjsKKyB0WyJcdTJGOTciXSA9ICJcdThDNTUiOworIHRbIlx1MkY5OCJdID0gIlx1OEM3OCI7CisgdFsiXHUyRjk5Il0gPSAiXHU4QzlEIjsKKyB0WyJcdTJGOUEiXSA9ICJcdThENjQiOworIHRbIlx1MkY5QiJdID0gIlx1OEQ3MCI7CisgdFsiXHUyRjlDIl0gPSAiXHU4REIzIjsKKyB0WyJcdTJGOUQiXSA9ICJcdThFQUIiOworIHRbIlx1MkY5RSJdID0gIlx1OEVDQSI7CisgdFsiXHUyRjlGIl0gPSAiXHU4RjlCIjsKKyB0WyJcdTJGQTAiXSA9ICJcdThGQjAiOworIHRbIlx1MkZBMSJdID0gIlx1OEZCNSI7CisgdFsiXHUyRkEyIl0gPSAiXHU5MDkxIjsKKyB0WyJcdTJGQTMiXSA9ICJcdTkxNDkiOworIHRbIlx1MkZBNCJdID0gIlx1OTFDNiI7CisgdFsiXHUyRkE1Il0gPSAiXHU5MUNDIjsKKyB0WyJcdTJGQTYiXSA9ICJcdTkxRDEiOworIHRbIlx1MkZBNyJdID0gIlx1OTU3NyI7CisgdFsiXHUyRkE4Il0gPSAiXHU5NTgwIjsKKyB0WyJcdTJGQTkiXSA9ICJcdTk2MUMiOworIHRbIlx1MkZBQSJdID0gIlx1OTZCNiI7CisgdFsiXHUyRkFCIl0gPSAiXHU5NkI5IjsKKyB0WyJcdTJGQUMiXSA9ICJcdTk2RTgiOworIHRbIlx1MkZBRCJdID0gIlx1OTc1MSI7CisgdFsiXHUyRkFFIl0gPSAiXHU5NzVFIjsKKyB0WyJcdTJGQUYiXSA9ICJcdTk3NjIiOworIHRbIlx1MkZCMCJdID0gIlx1OTc2OSI7CisgdFsiXHUyRkIxIl0gPSAiXHU5N0NCIjsKKyB0WyJcdTJGQjIiXSA9ICJcdTk3RUQiOworIHRbIlx1MkZCMyJdID0gIlx1OTdGMyI7CisgdFsiXHUyRkI0Il0gPSAiXHU5ODAxIjsKKyB0WyJcdTJGQjUiXSA9ICJcdTk4QTgiOworIHRbIlx1MkZCNiJdID0gIlx1OThEQiI7CisgdFsiXHUyRkI3Il0gPSAiXHU5OERGIjsKKyB0WyJcdTJGQjgiXSA9ICJcdTk5OTYiOworIHRbIlx1MkZCOSJdID0gIlx1OTk5OSI7CisgdFsiXHUyRkJBIl0gPSAiXHU5OUFDIjsKKyB0WyJcdTJGQkIiXSA9ICJcdTlBQTgiOworIHRbIlx1MkZCQyJdID0gIlx1OUFEOCI7CisgdFsiXHUyRkJEIl0gPSAiXHU5QURGIjsKKyB0WyJcdTJGQkUiXSA9ICJcdTlCMjUiOworIHRbIlx1MkZCRiJdID0gIlx1OUIyRiI7CisgdFsiXHUyRkMwIl0gPSAiXHU5QjMyIjsKKyB0WyJcdTJGQzEiXSA9ICJcdTlCM0MiOworIHRbIlx1MkZDMiJdID0gIlx1OUI1QSI7CisgdFsiXHUyRkMzIl0gPSAiXHU5Q0U1IjsKKyB0WyJcdTJGQzQiXSA9ICJcdTlFNzUiOworIHRbIlx1MkZDNSJdID0gIlx1OUU3RiI7CisgdFsiXHUyRkM2Il0gPSAiXHU5RUE1IjsKKyB0WyJcdTJGQzciXSA9ICJcdTlFQkIiOworIHRbIlx1MkZDOCJdID0gIlx1OUVDMyI7CisgdFsiXHUyRkM5Il0gPSAiXHU5RUNEIjsKKyB0WyJcdTJGQ0EiXSA9ICJcdTlFRDEiOworIHRbIlx1MkZDQiJdID0gIlx1OUVGOSI7CisgdFsiXHUyRkNDIl0gPSAiXHU5RUZEIjsKKyB0WyJcdTJGQ0QiXSA9ICJcdTlGMEUiOworIHRbIlx1MkZDRSJdID0gIlx1OUYxMyI7CisgdFsiXHUyRkNGIl0gPSAiXHU5RjIwIjsKKyB0WyJcdTJGRDAiXSA9ICJcdTlGM0IiOworIHRbIlx1MkZEMSJdID0gIlx1OUY0QSI7CisgdFsiXHUyRkQyIl0gPSAiXHU5RjUyIjsKKyB0WyJcdTJGRDMiXSA9ICJcdTlGOEQiOworIHRbIlx1MkZENCJdID0gIlx1OUY5QyI7CisgdFsiXHUyRkQ1Il0gPSAiXHU5RkEwIjsKKyB0WyJcdTMwMzYiXSA9ICJcdTMwMTIiOworIHRbIlx1MzAzOCJdID0gIlx1NTM0MSI7CisgdFsiXHUzMDM5Il0gPSAiXHU1MzQ0IjsKKyB0WyJcdTMwM0EiXSA9ICJcdTUzNDUiOworIHRbIlx1MzA5QiJdID0gIlx1MDAyMFx1MzA5OSI7CisgdFsiXHUzMDlDIl0gPSAiXHUwMDIwXHUzMDlBIjsKKyB0WyJcdTMxMzEiXSA9ICJcdTExMDAiOworIHRbIlx1MzEzMiJdID0gIlx1MTEwMSI7CisgdFsiXHUzMTMzIl0gPSAiXHUxMUFBIjsKKyB0WyJcdTMxMzQiXSA9ICJcdTExMDIiOworIHRbIlx1MzEzNSJdID0gIlx1MTFBQyI7CisgdFsiXHUzMTM2Il0gPSAiXHUxMUFEIjsKKyB0WyJcdTMxMzciXSA9ICJcdTExMDMiOworIHRbIlx1MzEzOCJdID0gIlx1MTEwNCI7CisgdFsiXHUzMTM5Il0gPSAiXHUxMTA1IjsKKyB0WyJcdTMxM0EiXSA9ICJcdTExQjAiOworIHRbIlx1MzEzQiJdID0gIlx1MTFCMSI7CisgdFsiXHUzMTNDIl0gPSAiXHUxMUIyIjsKKyB0WyJcdTMxM0QiXSA9ICJcdTExQjMiOworIHRbIlx1MzEzRSJdID0gIlx1MTFCNCI7CisgdFsiXHUzMTNGIl0gPSAiXHUxMUI1IjsKKyB0WyJcdTMxNDAiXSA9ICJcdTExMUEiOworIHRbIlx1MzE0MSJdID0gIlx1MTEwNiI7CisgdFsiXHUzMTQyIl0gPSAiXHUxMTA3IjsKKyB0WyJcdTMxNDMiXSA9ICJcdTExMDgiOworIHRbIlx1MzE0NCJdID0gIlx1MTEyMSI7CisgdFsiXHUzMTQ1Il0gPSAiXHUxMTA5IjsKKyB0WyJcdTMxNDYiXSA9ICJcdTExMEEiOworIHRbIlx1MzE0NyJdID0gIlx1MTEwQiI7CisgdFsiXHUzMTQ4Il0gPSAiXHUxMTBDIjsKKyB0WyJcdTMxNDkiXSA9ICJcdTExMEQiOworIHRbIlx1MzE0QSJdID0gIlx1MTEwRSI7CisgdFsiXHUzMTRCIl0gPSAiXHUxMTBGIjsKKyB0WyJcdTMxNEMiXSA9ICJcdTExMTAiOworIHRbIlx1MzE0RCJdID0gIlx1MTExMSI7CisgdFsiXHUzMTRFIl0gPSAiXHUxMTEyIjsKKyB0WyJcdTMxNEYiXSA9ICJcdTExNjEiOworIHRbIlx1MzE1MCJdID0gIlx1MTE2MiI7CisgdFsiXHUzMTUxIl0gPSAiXHUxMTYzIjsKKyB0WyJcdTMxNTIiXSA9ICJcdTExNjQiOworIHRbIlx1MzE1MyJdID0gIlx1MTE2NSI7CisgdFsiXHUzMTU0Il0gPSAiXHUxMTY2IjsKKyB0WyJcdTMxNTUiXSA9ICJcdTExNjciOworIHRbIlx1MzE1NiJdID0gIlx1MTE2OCI7CisgdFsiXHUzMTU3Il0gPSAiXHUxMTY5IjsKKyB0WyJcdTMxNTgiXSA9ICJcdTExNkEiOworIHRbIlx1MzE1OSJdID0gIlx1MTE2QiI7CisgdFsiXHUzMTVBIl0gPSAiXHUxMTZDIjsKKyB0WyJcdTMxNUIiXSA9ICJcdTExNkQiOworIHRbIlx1MzE1QyJdID0gIlx1MTE2RSI7CisgdFsiXHUzMTVEIl0gPSAiXHUxMTZGIjsKKyB0WyJcdTMxNUUiXSA9ICJcdTExNzAiOworIHRbIlx1MzE1RiJdID0gIlx1MTE3MSI7CisgdFsiXHUzMTYwIl0gPSAiXHUxMTcyIjsKKyB0WyJcdTMxNjEiXSA9ICJcdTExNzMiOworIHRbIlx1MzE2MiJdID0gIlx1MTE3NCI7CisgdFsiXHUzMTYzIl0gPSAiXHUxMTc1IjsKKyB0WyJcdTMxNjQiXSA9ICJcdTExNjAiOworIHRbIlx1MzE2NSJdID0gIlx1MTExNCI7CisgdFsiXHUzMTY2Il0gPSAiXHUxMTE1IjsKKyB0WyJcdTMxNjciXSA9ICJcdTExQzciOworIHRbIlx1MzE2OCJdID0gIlx1MTFDOCI7CisgdFsiXHUzMTY5Il0gPSAiXHUxMUNDIjsKKyB0WyJcdTMxNkEiXSA9ICJcdTExQ0UiOworIHRbIlx1MzE2QiJdID0gIlx1MTFEMyI7CisgdFsiXHUzMTZDIl0gPSAiXHUxMUQ3IjsKKyB0WyJcdTMxNkQiXSA9ICJcdTExRDkiOworIHRbIlx1MzE2RSJdID0gIlx1MTExQyI7CisgdFsiXHUzMTZGIl0gPSAiXHUxMUREIjsKKyB0WyJcdTMxNzAiXSA9ICJcdTExREYiOworIHRbIlx1MzE3MSJdID0gIlx1MTExRCI7CisgdFsiXHUzMTcyIl0gPSAiXHUxMTFFIjsKKyB0WyJcdTMxNzMiXSA9ICJcdTExMjAiOworIHRbIlx1MzE3NCJdID0gIlx1MTEyMiI7CisgdFsiXHUzMTc1Il0gPSAiXHUxMTIzIjsKKyB0WyJcdTMxNzYiXSA9ICJcdTExMjciOworIHRbIlx1MzE3NyJdID0gIlx1MTEyOSI7CisgdFsiXHUzMTc4Il0gPSAiXHUxMTJCIjsKKyB0WyJcdTMxNzkiXSA9ICJcdTExMkMiOworIHRbIlx1MzE3QSJdID0gIlx1MTEyRCI7CisgdFsiXHUzMTdCIl0gPSAiXHUxMTJFIjsKKyB0WyJcdTMxN0MiXSA9ICJcdTExMkYiOworIHRbIlx1MzE3RCJdID0gIlx1MTEzMiI7CisgdFsiXHUzMTdFIl0gPSAiXHUxMTM2IjsKKyB0WyJcdTMxN0YiXSA9ICJcdTExNDAiOworIHRbIlx1MzE4MCJdID0gIlx1MTE0NyI7CisgdFsiXHUzMTgxIl0gPSAiXHUxMTRDIjsKKyB0WyJcdTMxODIiXSA9ICJcdTExRjEiOworIHRbIlx1MzE4MyJdID0gIlx1MTFGMiI7CisgdFsiXHUzMTg0Il0gPSAiXHUxMTU3IjsKKyB0WyJcdTMxODUiXSA9ICJcdTExNTgiOworIHRbIlx1MzE4NiJdID0gIlx1MTE1OSI7CisgdFsiXHUzMTg3Il0gPSAiXHUxMTg0IjsKKyB0WyJcdTMxODgiXSA9ICJcdTExODUiOworIHRbIlx1MzE4OSJdID0gIlx1MTE4OCI7CisgdFsiXHUzMThBIl0gPSAiXHUxMTkxIjsKKyB0WyJcdTMxOEIiXSA9ICJcdTExOTIiOworIHRbIlx1MzE4QyJdID0gIlx1MTE5NCI7CisgdFsiXHUzMThEIl0gPSAiXHUxMTlFIjsKKyB0WyJcdTMxOEUiXSA9ICJcdTExQTEiOworIHRbIlx1MzIwMCJdID0gIlx1MDAyOFx1MTEwMFx1MDAyOSI7CisgdFsiXHUzMjAxIl0gPSAiXHUwMDI4XHUxMTAyXHUwMDI5IjsKKyB0WyJcdTMyMDIiXSA9ICJcdTAwMjhcdTExMDNcdTAwMjkiOworIHRbIlx1MzIwMyJdID0gIlx1MDAyOFx1MTEwNVx1MDAyOSI7CisgdFsiXHUzMjA0Il0gPSAiXHUwMDI4XHUxMTA2XHUwMDI5IjsKKyB0WyJcdTMyMDUiXSA9ICJcdTAwMjhcdTExMDdcdTAwMjkiOworIHRbIlx1MzIwNiJdID0gIlx1MDAyOFx1MTEwOVx1MDAyOSI7CisgdFsiXHUzMjA3Il0gPSAiXHUwMDI4XHUxMTBCXHUwMDI5IjsKKyB0WyJcdTMyMDgiXSA9ICJcdTAwMjhcdTExMENcdTAwMjkiOworIHRbIlx1MzIwOSJdID0gIlx1MDAyOFx1MTEwRVx1MDAyOSI7CisgdFsiXHUzMjBBIl0gPSAiXHUwMDI4XHUxMTBGXHUwMDI5IjsKKyB0WyJcdTMyMEIiXSA9ICJcdTAwMjhcdTExMTBcdTAwMjkiOworIHRbIlx1MzIwQyJdID0gIlx1MDAyOFx1MTExMVx1MDAyOSI7CisgdFsiXHUzMjBEIl0gPSAiXHUwMDI4XHUxMTEyXHUwMDI5IjsKKyB0WyJcdTMyMEUiXSA9ICJcdTAwMjhcdTExMDBcdTExNjFcdTAwMjkiOworIHRbIlx1MzIwRiJdID0gIlx1MDAyOFx1MTEwMlx1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjEwIl0gPSAiXHUwMDI4XHUxMTAzXHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMTEiXSA9ICJcdTAwMjhcdTExMDVcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxMiJdID0gIlx1MDAyOFx1MTEwNlx1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjEzIl0gPSAiXHUwMDI4XHUxMTA3XHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMTQiXSA9ICJcdTAwMjhcdTExMDlcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxNSJdID0gIlx1MDAyOFx1MTEwQlx1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjE2Il0gPSAiXHUwMDI4XHUxMTBDXHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMTciXSA9ICJcdTAwMjhcdTExMEVcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxOCJdID0gIlx1MDAyOFx1MTEwRlx1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjE5Il0gPSAiXHUwMDI4XHUxMTEwXHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMUEiXSA9ICJcdTAwMjhcdTExMTFcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxQiJdID0gIlx1MDAyOFx1MTExMlx1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjFDIl0gPSAiXHUwMDI4XHUxMTBDXHUxMTZFXHUwMDI5IjsKKyB0WyJcdTMyMUQiXSA9ICJcdTAwMjhcdTExMEJcdTExNjlcdTExMENcdTExNjVcdTExQUJcdTAwMjkiOworIHRbIlx1MzIxRSJdID0gIlx1MDAyOFx1MTEwQlx1MTE2OVx1MTExMlx1MTE2RVx1MDAyOSI7CisgdFsiXHUzMjIwIl0gPSAiXHUwMDI4XHU0RTAwXHUwMDI5IjsKKyB0WyJcdTMyMjEiXSA9ICJcdTAwMjhcdTRFOENcdTAwMjkiOworIHRbIlx1MzIyMiJdID0gIlx1MDAyOFx1NEUwOVx1MDAyOSI7CisgdFsiXHUzMjIzIl0gPSAiXHUwMDI4XHU1NkRCXHUwMDI5IjsKKyB0WyJcdTMyMjQiXSA9ICJcdTAwMjhcdTRFOTRcdTAwMjkiOworIHRbIlx1MzIyNSJdID0gIlx1MDAyOFx1NTE2RFx1MDAyOSI7CisgdFsiXHUzMjI2Il0gPSAiXHUwMDI4XHU0RTAzXHUwMDI5IjsKKyB0WyJcdTMyMjciXSA9ICJcdTAwMjhcdTUxNkJcdTAwMjkiOworIHRbIlx1MzIyOCJdID0gIlx1MDAyOFx1NEU1RFx1MDAyOSI7CisgdFsiXHUzMjI5Il0gPSAiXHUwMDI4XHU1MzQxXHUwMDI5IjsKKyB0WyJcdTMyMkEiXSA9ICJcdTAwMjhcdTY3MDhcdTAwMjkiOworIHRbIlx1MzIyQiJdID0gIlx1MDAyOFx1NzA2Qlx1MDAyOSI7CisgdFsiXHUzMjJDIl0gPSAiXHUwMDI4XHU2QzM0XHUwMDI5IjsKKyB0WyJcdTMyMkQiXSA9ICJcdTAwMjhcdTY3MjhcdTAwMjkiOworIHRbIlx1MzIyRSJdID0gIlx1MDAyOFx1OTFEMVx1MDAyOSI7CisgdFsiXHUzMjJGIl0gPSAiXHUwMDI4XHU1NzFGXHUwMDI5IjsKKyB0WyJcdTMyMzAiXSA9ICJcdTAwMjhcdTY1RTVcdTAwMjkiOworIHRbIlx1MzIzMSJdID0gIlx1MDAyOFx1NjgyQVx1MDAyOSI7CisgdFsiXHUzMjMyIl0gPSAiXHUwMDI4XHU2NzA5XHUwMDI5IjsKKyB0WyJcdTMyMzMiXSA9ICJcdTAwMjhcdTc5M0VcdTAwMjkiOworIHRbIlx1MzIzNCJdID0gIlx1MDAyOFx1NTQwRFx1MDAyOSI7CisgdFsiXHUzMjM1Il0gPSAiXHUwMDI4XHU3Mjc5XHUwMDI5IjsKKyB0WyJcdTMyMzYiXSA9ICJcdTAwMjhcdThDQTFcdTAwMjkiOworIHRbIlx1MzIzNyJdID0gIlx1MDAyOFx1Nzk1RFx1MDAyOSI7CisgdFsiXHUzMjM4Il0gPSAiXHUwMDI4XHU1MkI0XHUwMDI5IjsKKyB0WyJcdTMyMzkiXSA9ICJcdTAwMjhcdTRFRTNcdTAwMjkiOworIHRbIlx1MzIzQSJdID0gIlx1MDAyOFx1NTQ3Q1x1MDAyOSI7CisgdFsiXHUzMjNCIl0gPSAiXHUwMDI4XHU1QjY2XHUwMDI5IjsKKyB0WyJcdTMyM0MiXSA9ICJcdTAwMjhcdTc2RTNcdTAwMjkiOworIHRbIlx1MzIzRCJdID0gIlx1MDAyOFx1NEYwMVx1MDAyOSI7CisgdFsiXHUzMjNFIl0gPSAiXHUwMDI4XHU4Q0M3XHUwMDI5IjsKKyB0WyJcdTMyM0YiXSA9ICJcdTAwMjhcdTUzNTRcdTAwMjkiOworIHRbIlx1MzI0MCJdID0gIlx1MDAyOFx1Nzk2RFx1MDAyOSI7CisgdFsiXHUzMjQxIl0gPSAiXHUwMDI4XHU0RjExXHUwMDI5IjsKKyB0WyJcdTMyNDIiXSA9ICJcdTAwMjhcdTgxRUFcdTAwMjkiOworIHRbIlx1MzI0MyJdID0gIlx1MDAyOFx1ODFGM1x1MDAyOSI7CisgdFsiXHUzMkMwIl0gPSAiXHUwMDMxXHU2NzA4IjsKKyB0WyJcdTMyQzEiXSA9ICJcdTAwMzJcdTY3MDgiOworIHRbIlx1MzJDMiJdID0gIlx1MDAzM1x1NjcwOCI7CisgdFsiXHUzMkMzIl0gPSAiXHUwMDM0XHU2NzA4IjsKKyB0WyJcdTMyQzQiXSA9ICJcdTAwMzVcdTY3MDgiOworIHRbIlx1MzJDNSJdID0gIlx1MDAzNlx1NjcwOCI7CisgdFsiXHUzMkM2Il0gPSAiXHUwMDM3XHU2NzA4IjsKKyB0WyJcdTMyQzciXSA9ICJcdTAwMzhcdTY3MDgiOworIHRbIlx1MzJDOCJdID0gIlx1MDAzOVx1NjcwOCI7CisgdFsiXHUzMkM5Il0gPSAiXHUwMDMxXHUwMDMwXHU2NzA4IjsKKyB0WyJcdTMyQ0EiXSA9ICJcdTAwMzFcdTAwMzFcdTY3MDgiOworIHRbIlx1MzJDQiJdID0gIlx1MDAzMVx1MDAzMlx1NjcwOCI7CisgdFsiXHUzMzU4Il0gPSAiXHUwMDMwXHU3MEI5IjsKKyB0WyJcdTMzNTkiXSA9ICJcdTAwMzFcdTcwQjkiOworIHRbIlx1MzM1QSJdID0gIlx1MDAzMlx1NzBCOSI7CisgdFsiXHUzMzVCIl0gPSAiXHUwMDMzXHU3MEI5IjsKKyB0WyJcdTMzNUMiXSA9ICJcdTAwMzRcdTcwQjkiOworIHRbIlx1MzM1RCJdID0gIlx1MDAzNVx1NzBCOSI7CisgdFsiXHUzMzVFIl0gPSAiXHUwMDM2XHU3MEI5IjsKKyB0WyJcdTMzNUYiXSA9ICJcdTAwMzdcdTcwQjkiOworIHRbIlx1MzM2MCJdID0gIlx1MDAzOFx1NzBCOSI7CisgdFsiXHUzMzYxIl0gPSAiXHUwMDM5XHU3MEI5IjsKKyB0WyJcdTMzNjIiXSA9ICJcdTAwMzFcdTAwMzBcdTcwQjkiOworIHRbIlx1MzM2MyJdID0gIlx1MDAzMVx1MDAzMVx1NzBCOSI7CisgdFsiXHUzMzY0Il0gPSAiXHUwMDMxXHUwMDMyXHU3MEI5IjsKKyB0WyJcdTMzNjUiXSA9ICJcdTAwMzFcdTAwMzNcdTcwQjkiOworIHRbIlx1MzM2NiJdID0gIlx1MDAzMVx1MDAzNFx1NzBCOSI7CisgdFsiXHUzMzY3Il0gPSAiXHUwMDMxXHUwMDM1XHU3MEI5IjsKKyB0WyJcdTMzNjgiXSA9ICJcdTAwMzFcdTAwMzZcdTcwQjkiOworIHRbIlx1MzM2OSJdID0gIlx1MDAzMVx1MDAzN1x1NzBCOSI7CisgdFsiXHUzMzZBIl0gPSAiXHUwMDMxXHUwMDM4XHU3MEI5IjsKKyB0WyJcdTMzNkIiXSA9ICJcdTAwMzFcdTAwMzlcdTcwQjkiOworIHRbIlx1MzM2QyJdID0gIlx1MDAzMlx1MDAzMFx1NzBCOSI7CisgdFsiXHUzMzZEIl0gPSAiXHUwMDMyXHUwMDMxXHU3MEI5IjsKKyB0WyJcdTMzNkUiXSA9ICJcdTAwMzJcdTAwMzJcdTcwQjkiOworIHRbIlx1MzM2RiJdID0gIlx1MDAzMlx1MDAzM1x1NzBCOSI7CisgdFsiXHUzMzcwIl0gPSAiXHUwMDMyXHUwMDM0XHU3MEI5IjsKKyB0WyJcdTMzRTAiXSA9ICJcdTAwMzFcdTY1RTUiOworIHRbIlx1MzNFMSJdID0gIlx1MDAzMlx1NjVFNSI7CisgdFsiXHUzM0UyIl0gPSAiXHUwMDMzXHU2NUU1IjsKKyB0WyJcdTMzRTMiXSA9ICJcdTAwMzRcdTY1RTUiOworIHRbIlx1MzNFNCJdID0gIlx1MDAzNVx1NjVFNSI7CisgdFsiXHUzM0U1Il0gPSAiXHUwMDM2XHU2NUU1IjsKKyB0WyJcdTMzRTYiXSA9ICJcdTAwMzdcdTY1RTUiOworIHRbIlx1MzNFNyJdID0gIlx1MDAzOFx1NjVFNSI7CisgdFsiXHUzM0U4Il0gPSAiXHUwMDM5XHU2NUU1IjsKKyB0WyJcdTMzRTkiXSA9ICJcdTAwMzFcdTAwMzBcdTY1RTUiOworIHRbIlx1MzNFQSJdID0gIlx1MDAzMVx1MDAzMVx1NjVFNSI7CisgdFsiXHUzM0VCIl0gPSAiXHUwMDMxXHUwMDMyXHU2NUU1IjsKKyB0WyJcdTMzRUMiXSA9ICJcdTAwMzFcdTAwMzNcdTY1RTUiOworIHRbIlx1MzNFRCJdID0gIlx1MDAzMVx1MDAzNFx1NjVFNSI7CisgdFsiXHUzM0VFIl0gPSAiXHUwMDMxXHUwMDM1XHU2NUU1IjsKKyB0WyJcdTMzRUYiXSA9ICJcdTAwMzFcdTAwMzZcdTY1RTUiOworIHRbIlx1MzNGMCJdID0gIlx1MDAzMVx1MDAzN1x1NjVFNSI7CisgdFsiXHUzM0YxIl0gPSAiXHUwMDMxXHUwMDM4XHU2NUU1IjsKKyB0WyJcdTMzRjIiXSA9ICJcdTAwMzFcdTAwMzlcdTY1RTUiOworIHRbIlx1MzNGMyJdID0gIlx1MDAzMlx1MDAzMFx1NjVFNSI7CisgdFsiXHUzM0Y0Il0gPSAiXHUwMDMyXHUwMDMxXHU2NUU1IjsKKyB0WyJcdTMzRjUiXSA9ICJcdTAwMzJcdTAwMzJcdTY1RTUiOworIHRbIlx1MzNGNiJdID0gIlx1MDAzMlx1MDAzM1x1NjVFNSI7CisgdFsiXHUzM0Y3Il0gPSAiXHUwMDMyXHUwMDM0XHU2NUU1IjsKKyB0WyJcdTMzRjgiXSA9ICJcdTAwMzJcdTAwMzVcdTY1RTUiOworIHRbIlx1MzNGOSJdID0gIlx1MDAzMlx1MDAzNlx1NjVFNSI7CisgdFsiXHUzM0ZBIl0gPSAiXHUwMDMyXHUwMDM3XHU2NUU1IjsKKyB0WyJcdTMzRkIiXSA9ICJcdTAwMzJcdTAwMzhcdTY1RTUiOworIHRbIlx1MzNGQyJdID0gIlx1MDAzMlx1MDAzOVx1NjVFNSI7CisgdFsiXHUzM0ZEIl0gPSAiXHUwMDMzXHUwMDMwXHU2NUU1IjsKKyB0WyJcdTMzRkUiXSA9ICJcdTAwMzNcdTAwMzFcdTY1RTUiOworIHRbIlx1RkIwMCJdID0gIlx1MDA2Nlx1MDA2NiI7CisgdFsiXHVGQjAxIl0gPSAiXHUwMDY2XHUwMDY5IjsKKyB0WyJcdUZCMDIiXSA9ICJcdTAwNjZcdTAwNkMiOworIHRbIlx1RkIwMyJdID0gIlx1MDA2Nlx1MDA2Nlx1MDA2OSI7CisgdFsiXHVGQjA0Il0gPSAiXHUwMDY2XHUwMDY2XHUwMDZDIjsKKyB0WyJcdUZCMDUiXSA9ICJcdTAxN0ZcdTAwNzQiOworIHRbIlx1RkIwNiJdID0gIlx1MDA3M1x1MDA3NCI7CisgdFsiXHVGQjEzIl0gPSAiXHUwNTc0XHUwNTc2IjsKKyB0WyJcdUZCMTQiXSA9ICJcdTA1NzRcdTA1NjUiOworIHRbIlx1RkIxNSJdID0gIlx1MDU3NFx1MDU2QiI7CisgdFsiXHVGQjE2Il0gPSAiXHUwNTdFXHUwNTc2IjsKKyB0WyJcdUZCMTciXSA9ICJcdTA1NzRcdTA1NkQiOworIHRbIlx1RkI0RiJdID0gIlx1MDVEMFx1MDVEQyI7CisgdFsiXHVGQjUwIl0gPSAiXHUwNjcxIjsKKyB0WyJcdUZCNTEiXSA9ICJcdTA2NzEiOworIHRbIlx1RkI1MiJdID0gIlx1MDY3QiI7CisgdFsiXHVGQjUzIl0gPSAiXHUwNjdCIjsKKyB0WyJcdUZCNTQiXSA9ICJcdTA2N0IiOworIHRbIlx1RkI1NSJdID0gIlx1MDY3QiI7CisgdFsiXHVGQjU2Il0gPSAiXHUwNjdFIjsKKyB0WyJcdUZCNTciXSA9ICJcdTA2N0UiOworIHRbIlx1RkI1OCJdID0gIlx1MDY3RSI7CisgdFsiXHVGQjU5Il0gPSAiXHUwNjdFIjsKKyB0WyJcdUZCNUEiXSA9ICJcdTA2ODAiOworIHRbIlx1RkI1QiJdID0gIlx1MDY4MCI7CisgdFsiXHVGQjVDIl0gPSAiXHUwNjgwIjsKKyB0WyJcdUZCNUQiXSA9ICJcdTA2ODAiOworIHRbIlx1RkI1RSJdID0gIlx1MDY3QSI7CisgdFsiXHVGQjVGIl0gPSAiXHUwNjdBIjsKKyB0WyJcdUZCNjAiXSA9ICJcdTA2N0EiOworIHRbIlx1RkI2MSJdID0gIlx1MDY3QSI7CisgdFsiXHVGQjYyIl0gPSAiXHUwNjdGIjsKKyB0WyJcdUZCNjMiXSA9ICJcdTA2N0YiOworIHRbIlx1RkI2NCJdID0gIlx1MDY3RiI7CisgdFsiXHVGQjY1Il0gPSAiXHUwNjdGIjsKKyB0WyJcdUZCNjYiXSA9ICJcdTA2NzkiOworIHRbIlx1RkI2NyJdID0gIlx1MDY3OSI7CisgdFsiXHVGQjY4Il0gPSAiXHUwNjc5IjsKKyB0WyJcdUZCNjkiXSA9ICJcdTA2NzkiOworIHRbIlx1RkI2QSJdID0gIlx1MDZBNCI7CisgdFsiXHVGQjZCIl0gPSAiXHUwNkE0IjsKKyB0WyJcdUZCNkMiXSA9ICJcdTA2QTQiOworIHRbIlx1RkI2RCJdID0gIlx1MDZBNCI7CisgdFsiXHVGQjZFIl0gPSAiXHUwNkE2IjsKKyB0WyJcdUZCNkYiXSA9ICJcdTA2QTYiOworIHRbIlx1RkI3MCJdID0gIlx1MDZBNiI7CisgdFsiXHVGQjcxIl0gPSAiXHUwNkE2IjsKKyB0WyJcdUZCNzIiXSA9ICJcdTA2ODQiOworIHRbIlx1RkI3MyJdID0gIlx1MDY4NCI7CisgdFsiXHVGQjc0Il0gPSAiXHUwNjg0IjsKKyB0WyJcdUZCNzUiXSA9ICJcdTA2ODQiOworIHRbIlx1RkI3NiJdID0gIlx1MDY4MyI7CisgdFsiXHVGQjc3Il0gPSAiXHUwNjgzIjsKKyB0WyJcdUZCNzgiXSA9ICJcdTA2ODMiOworIHRbIlx1RkI3OSJdID0gIlx1MDY4MyI7CisgdFsiXHVGQjdBIl0gPSAiXHUwNjg2IjsKKyB0WyJcdUZCN0IiXSA9ICJcdTA2ODYiOworIHRbIlx1RkI3QyJdID0gIlx1MDY4NiI7CisgdFsiXHVGQjdEIl0gPSAiXHUwNjg2IjsKKyB0WyJcdUZCN0UiXSA9ICJcdTA2ODciOworIHRbIlx1RkI3RiJdID0gIlx1MDY4NyI7CisgdFsiXHVGQjgwIl0gPSAiXHUwNjg3IjsKKyB0WyJcdUZCODEiXSA9ICJcdTA2ODciOworIHRbIlx1RkI4MiJdID0gIlx1MDY4RCI7CisgdFsiXHVGQjgzIl0gPSAiXHUwNjhEIjsKKyB0WyJcdUZCODQiXSA9ICJcdTA2OEMiOworIHRbIlx1RkI4NSJdID0gIlx1MDY4QyI7CisgdFsiXHVGQjg2Il0gPSAiXHUwNjhFIjsKKyB0WyJcdUZCODciXSA9ICJcdTA2OEUiOworIHRbIlx1RkI4OCJdID0gIlx1MDY4OCI7CisgdFsiXHVGQjg5Il0gPSAiXHUwNjg4IjsKKyB0WyJcdUZCOEEiXSA9ICJcdTA2OTgiOworIHRbIlx1RkI4QiJdID0gIlx1MDY5OCI7CisgdFsiXHVGQjhDIl0gPSAiXHUwNjkxIjsKKyB0WyJcdUZCOEQiXSA9ICJcdTA2OTEiOworIHRbIlx1RkI4RSJdID0gIlx1MDZBOSI7CisgdFsiXHVGQjhGIl0gPSAiXHUwNkE5IjsKKyB0WyJcdUZCOTAiXSA9ICJcdTA2QTkiOworIHRbIlx1RkI5MSJdID0gIlx1MDZBOSI7CisgdFsiXHVGQjkyIl0gPSAiXHUwNkFGIjsKKyB0WyJcdUZCOTMiXSA9ICJcdTA2QUYiOworIHRbIlx1RkI5NCJdID0gIlx1MDZBRiI7CisgdFsiXHVGQjk1Il0gPSAiXHUwNkFGIjsKKyB0WyJcdUZCOTYiXSA9ICJcdTA2QjMiOworIHRbIlx1RkI5NyJdID0gIlx1MDZCMyI7CisgdFsiXHVGQjk4Il0gPSAiXHUwNkIzIjsKKyB0WyJcdUZCOTkiXSA9ICJcdTA2QjMiOworIHRbIlx1RkI5QSJdID0gIlx1MDZCMSI7CisgdFsiXHVGQjlCIl0gPSAiXHUwNkIxIjsKKyB0WyJcdUZCOUMiXSA9ICJcdTA2QjEiOworIHRbIlx1RkI5RCJdID0gIlx1MDZCMSI7CisgdFsiXHVGQjlFIl0gPSAiXHUwNkJBIjsKKyB0WyJcdUZCOUYiXSA9ICJcdTA2QkEiOworIHRbIlx1RkJBMCJdID0gIlx1MDZCQiI7CisgdFsiXHVGQkExIl0gPSAiXHUwNkJCIjsKKyB0WyJcdUZCQTIiXSA9ICJcdTA2QkIiOworIHRbIlx1RkJBMyJdID0gIlx1MDZCQiI7CisgdFsiXHVGQkE0Il0gPSAiXHUwNkMwIjsKKyB0WyJcdUZCQTUiXSA9ICJcdTA2QzAiOworIHRbIlx1RkJBNiJdID0gIlx1MDZDMSI7CisgdFsiXHVGQkE3Il0gPSAiXHUwNkMxIjsKKyB0WyJcdUZCQTgiXSA9ICJcdTA2QzEiOworIHRbIlx1RkJBOSJdID0gIlx1MDZDMSI7CisgdFsiXHVGQkFBIl0gPSAiXHUwNkJFIjsKKyB0WyJcdUZCQUIiXSA9ICJcdTA2QkUiOworIHRbIlx1RkJBQyJdID0gIlx1MDZCRSI7CisgdFsiXHVGQkFEIl0gPSAiXHUwNkJFIjsKKyB0WyJcdUZCQUUiXSA9ICJcdTA2RDIiOworIHRbIlx1RkJBRiJdID0gIlx1MDZEMiI7CisgdFsiXHVGQkIwIl0gPSAiXHUwNkQzIjsKKyB0WyJcdUZCQjEiXSA9ICJcdTA2RDMiOworIHRbIlx1RkJEMyJdID0gIlx1MDZBRCI7CisgdFsiXHVGQkQ0Il0gPSAiXHUwNkFEIjsKKyB0WyJcdUZCRDUiXSA9ICJcdTA2QUQiOworIHRbIlx1RkJENiJdID0gIlx1MDZBRCI7CisgdFsiXHVGQkQ3Il0gPSAiXHUwNkM3IjsKKyB0WyJcdUZCRDgiXSA9ICJcdTA2QzciOworIHRbIlx1RkJEOSJdID0gIlx1MDZDNiI7CisgdFsiXHVGQkRBIl0gPSAiXHUwNkM2IjsKKyB0WyJcdUZCREIiXSA9ICJcdTA2QzgiOworIHRbIlx1RkJEQyJdID0gIlx1MDZDOCI7CisgdFsiXHVGQkREIl0gPSAiXHUwNjc3IjsKKyB0WyJcdUZCREUiXSA9ICJcdTA2Q0IiOworIHRbIlx1RkJERiJdID0gIlx1MDZDQiI7CisgdFsiXHVGQkUwIl0gPSAiXHUwNkM1IjsKKyB0WyJcdUZCRTEiXSA9ICJcdTA2QzUiOworIHRbIlx1RkJFMiJdID0gIlx1MDZDOSI7CisgdFsiXHVGQkUzIl0gPSAiXHUwNkM5IjsKKyB0WyJcdUZCRTQiXSA9ICJcdTA2RDAiOworIHRbIlx1RkJFNSJdID0gIlx1MDZEMCI7CisgdFsiXHVGQkU2Il0gPSAiXHUwNkQwIjsKKyB0WyJcdUZCRTciXSA9ICJcdTA2RDAiOworIHRbIlx1RkJFOCJdID0gIlx1MDY0OSI7CisgdFsiXHVGQkU5Il0gPSAiXHUwNjQ5IjsKKyB0WyJcdUZCRUEiXSA9ICJcdTA2MjZcdTA2MjciOworIHRbIlx1RkJFQiJdID0gIlx1MDYyNlx1MDYyNyI7CisgdFsiXHVGQkVDIl0gPSAiXHUwNjI2XHUwNkQ1IjsKKyB0WyJcdUZCRUQiXSA9ICJcdTA2MjZcdTA2RDUiOworIHRbIlx1RkJFRSJdID0gIlx1MDYyNlx1MDY0OCI7CisgdFsiXHVGQkVGIl0gPSAiXHUwNjI2XHUwNjQ4IjsKKyB0WyJcdUZCRjAiXSA9ICJcdTA2MjZcdTA2QzciOworIHRbIlx1RkJGMSJdID0gIlx1MDYyNlx1MDZDNyI7CisgdFsiXHVGQkYyIl0gPSAiXHUwNjI2XHUwNkM2IjsKKyB0WyJcdUZCRjMiXSA9ICJcdTA2MjZcdTA2QzYiOworIHRbIlx1RkJGNCJdID0gIlx1MDYyNlx1MDZDOCI7CisgdFsiXHVGQkY1Il0gPSAiXHUwNjI2XHUwNkM4IjsKKyB0WyJcdUZCRjYiXSA9ICJcdTA2MjZcdTA2RDAiOworIHRbIlx1RkJGNyJdID0gIlx1MDYyNlx1MDZEMCI7CisgdFsiXHVGQkY4Il0gPSAiXHUwNjI2XHUwNkQwIjsKKyB0WyJcdUZCRjkiXSA9ICJcdTA2MjZcdTA2NDkiOworIHRbIlx1RkJGQSJdID0gIlx1MDYyNlx1MDY0OSI7CisgdFsiXHVGQkZCIl0gPSAiXHUwNjI2XHUwNjQ5IjsKKyB0WyJcdUZCRkMiXSA9ICJcdTA2Q0MiOworIHRbIlx1RkJGRCJdID0gIlx1MDZDQyI7CisgdFsiXHVGQkZFIl0gPSAiXHUwNkNDIjsKKyB0WyJcdUZCRkYiXSA9ICJcdTA2Q0MiOworIHRbIlx1RkMwMCJdID0gIlx1MDYyNlx1MDYyQyI7CisgdFsiXHVGQzAxIl0gPSAiXHUwNjI2XHUwNjJEIjsKKyB0WyJcdUZDMDIiXSA9ICJcdTA2MjZcdTA2NDUiOworIHRbIlx1RkMwMyJdID0gIlx1MDYyNlx1MDY0OSI7CisgdFsiXHVGQzA0Il0gPSAiXHUwNjI2XHUwNjRBIjsKKyB0WyJcdUZDMDUiXSA9ICJcdTA2MjhcdTA2MkMiOworIHRbIlx1RkMwNiJdID0gIlx1MDYyOFx1MDYyRCI7CisgdFsiXHVGQzA3Il0gPSAiXHUwNjI4XHUwNjJFIjsKKyB0WyJcdUZDMDgiXSA9ICJcdTA2MjhcdTA2NDUiOworIHRbIlx1RkMwOSJdID0gIlx1MDYyOFx1MDY0OSI7CisgdFsiXHVGQzBBIl0gPSAiXHUwNjI4XHUwNjRBIjsKKyB0WyJcdUZDMEIiXSA9ICJcdTA2MkFcdTA2MkMiOworIHRbIlx1RkMwQyJdID0gIlx1MDYyQVx1MDYyRCI7CisgdFsiXHVGQzBEIl0gPSAiXHUwNjJBXHUwNjJFIjsKKyB0WyJcdUZDMEUiXSA9ICJcdTA2MkFcdTA2NDUiOworIHRbIlx1RkMwRiJdID0gIlx1MDYyQVx1MDY0OSI7CisgdFsiXHVGQzEwIl0gPSAiXHUwNjJBXHUwNjRBIjsKKyB0WyJcdUZDMTEiXSA9ICJcdTA2MkJcdTA2MkMiOworIHRbIlx1RkMxMiJdID0gIlx1MDYyQlx1MDY0NSI7CisgdFsiXHVGQzEzIl0gPSAiXHUwNjJCXHUwNjQ5IjsKKyB0WyJcdUZDMTQiXSA9ICJcdTA2MkJcdTA2NEEiOworIHRbIlx1RkMxNSJdID0gIlx1MDYyQ1x1MDYyRCI7CisgdFsiXHVGQzE2Il0gPSAiXHUwNjJDXHUwNjQ1IjsKKyB0WyJcdUZDMTciXSA9ICJcdTA2MkRcdTA2MkMiOworIHRbIlx1RkMxOCJdID0gIlx1MDYyRFx1MDY0NSI7CisgdFsiXHVGQzE5Il0gPSAiXHUwNjJFXHUwNjJDIjsKKyB0WyJcdUZDMUEiXSA9ICJcdTA2MkVcdTA2MkQiOworIHRbIlx1RkMxQiJdID0gIlx1MDYyRVx1MDY0NSI7CisgdFsiXHVGQzFDIl0gPSAiXHUwNjMzXHUwNjJDIjsKKyB0WyJcdUZDMUQiXSA9ICJcdTA2MzNcdTA2MkQiOworIHRbIlx1RkMxRSJdID0gIlx1MDYzM1x1MDYyRSI7CisgdFsiXHVGQzFGIl0gPSAiXHUwNjMzXHUwNjQ1IjsKKyB0WyJcdUZDMjAiXSA9ICJcdTA2MzVcdTA2MkQiOworIHRbIlx1RkMyMSJdID0gIlx1MDYzNVx1MDY0NSI7CisgdFsiXHVGQzIyIl0gPSAiXHUwNjM2XHUwNjJDIjsKKyB0WyJcdUZDMjMiXSA9ICJcdTA2MzZcdTA2MkQiOworIHRbIlx1RkMyNCJdID0gIlx1MDYzNlx1MDYyRSI7CisgdFsiXHVGQzI1Il0gPSAiXHUwNjM2XHUwNjQ1IjsKKyB0WyJcdUZDMjYiXSA9ICJcdTA2MzdcdTA2MkQiOworIHRbIlx1RkMyNyJdID0gIlx1MDYzN1x1MDY0NSI7CisgdFsiXHVGQzI4Il0gPSAiXHUwNjM4XHUwNjQ1IjsKKyB0WyJcdUZDMjkiXSA9ICJcdTA2MzlcdTA2MkMiOworIHRbIlx1RkMyQSJdID0gIlx1MDYzOVx1MDY0NSI7CisgdFsiXHVGQzJCIl0gPSAiXHUwNjNBXHUwNjJDIjsKKyB0WyJcdUZDMkMiXSA9ICJcdTA2M0FcdTA2NDUiOworIHRbIlx1RkMyRCJdID0gIlx1MDY0MVx1MDYyQyI7CisgdFsiXHVGQzJFIl0gPSAiXHUwNjQxXHUwNjJEIjsKKyB0WyJcdUZDMkYiXSA9ICJcdTA2NDFcdTA2MkUiOworIHRbIlx1RkMzMCJdID0gIlx1MDY0MVx1MDY0NSI7CisgdFsiXHVGQzMxIl0gPSAiXHUwNjQxXHUwNjQ5IjsKKyB0WyJcdUZDMzIiXSA9ICJcdTA2NDFcdTA2NEEiOworIHRbIlx1RkMzMyJdID0gIlx1MDY0Mlx1MDYyRCI7CisgdFsiXHVGQzM0Il0gPSAiXHUwNjQyXHUwNjQ1IjsKKyB0WyJcdUZDMzUiXSA9ICJcdTA2NDJcdTA2NDkiOworIHRbIlx1RkMzNiJdID0gIlx1MDY0Mlx1MDY0QSI7CisgdFsiXHVGQzM3Il0gPSAiXHUwNjQzXHUwNjI3IjsKKyB0WyJcdUZDMzgiXSA9ICJcdTA2NDNcdTA2MkMiOworIHRbIlx1RkMzOSJdID0gIlx1MDY0M1x1MDYyRCI7CisgdFsiXHVGQzNBIl0gPSAiXHUwNjQzXHUwNjJFIjsKKyB0WyJcdUZDM0IiXSA9ICJcdTA2NDNcdTA2NDQiOworIHRbIlx1RkMzQyJdID0gIlx1MDY0M1x1MDY0NSI7CisgdFsiXHVGQzNEIl0gPSAiXHUwNjQzXHUwNjQ5IjsKKyB0WyJcdUZDM0UiXSA9ICJcdTA2NDNcdTA2NEEiOworIHRbIlx1RkMzRiJdID0gIlx1MDY0NFx1MDYyQyI7CisgdFsiXHVGQzQwIl0gPSAiXHUwNjQ0XHUwNjJEIjsKKyB0WyJcdUZDNDEiXSA9ICJcdTA2NDRcdTA2MkUiOworIHRbIlx1RkM0MiJdID0gIlx1MDY0NFx1MDY0NSI7CisgdFsiXHVGQzQzIl0gPSAiXHUwNjQ0XHUwNjQ5IjsKKyB0WyJcdUZDNDQiXSA9ICJcdTA2NDRcdTA2NEEiOworIHRbIlx1RkM0NSJdID0gIlx1MDY0NVx1MDYyQyI7CisgdFsiXHVGQzQ2Il0gPSAiXHUwNjQ1XHUwNjJEIjsKKyB0WyJcdUZDNDciXSA9ICJcdTA2NDVcdTA2MkUiOworIHRbIlx1RkM0OCJdID0gIlx1MDY0NVx1MDY0NSI7CisgdFsiXHVGQzQ5Il0gPSAiXHUwNjQ1XHUwNjQ5IjsKKyB0WyJcdUZDNEEiXSA9ICJcdTA2NDVcdTA2NEEiOworIHRbIlx1RkM0QiJdID0gIlx1MDY0Nlx1MDYyQyI7CisgdFsiXHVGQzRDIl0gPSAiXHUwNjQ2XHUwNjJEIjsKKyB0WyJcdUZDNEQiXSA9ICJcdTA2NDZcdTA2MkUiOworIHRbIlx1RkM0RSJdID0gIlx1MDY0Nlx1MDY0NSI7CisgdFsiXHVGQzRGIl0gPSAiXHUwNjQ2XHUwNjQ5IjsKKyB0WyJcdUZDNTAiXSA9ICJcdTA2NDZcdTA2NEEiOworIHRbIlx1RkM1MSJdID0gIlx1MDY0N1x1MDYyQyI7CisgdFsiXHVGQzUyIl0gPSAiXHUwNjQ3XHUwNjQ1IjsKKyB0WyJcdUZDNTMiXSA9ICJcdTA2NDdcdTA2NDkiOworIHRbIlx1RkM1NCJdID0gIlx1MDY0N1x1MDY0QSI7CisgdFsiXHVGQzU1Il0gPSAiXHUwNjRBXHUwNjJDIjsKKyB0WyJcdUZDNTYiXSA9ICJcdTA2NEFcdTA2MkQiOworIHRbIlx1RkM1NyJdID0gIlx1MDY0QVx1MDYyRSI7CisgdFsiXHVGQzU4Il0gPSAiXHUwNjRBXHUwNjQ1IjsKKyB0WyJcdUZDNTkiXSA9ICJcdTA2NEFcdTA2NDkiOworIHRbIlx1RkM1QSJdID0gIlx1MDY0QVx1MDY0QSI7CisgdFsiXHVGQzVCIl0gPSAiXHUwNjMwXHUwNjcwIjsKKyB0WyJcdUZDNUMiXSA9ICJcdTA2MzFcdTA2NzAiOworIHRbIlx1RkM1RCJdID0gIlx1MDY0OVx1MDY3MCI7CisgdFsiXHVGQzVFIl0gPSAiXHUwMDIwXHUwNjRDXHUwNjUxIjsKKyB0WyJcdUZDNUYiXSA9ICJcdTAwMjBcdTA2NERcdTA2NTEiOworIHRbIlx1RkM2MCJdID0gIlx1MDAyMFx1MDY0RVx1MDY1MSI7CisgdFsiXHVGQzYxIl0gPSAiXHUwMDIwXHUwNjRGXHUwNjUxIjsKKyB0WyJcdUZDNjIiXSA9ICJcdTAwMjBcdTA2NTBcdTA2NTEiOworIHRbIlx1RkM2MyJdID0gIlx1MDAyMFx1MDY1MVx1MDY3MCI7CisgdFsiXHVGQzY0Il0gPSAiXHUwNjI2XHUwNjMxIjsKKyB0WyJcdUZDNjUiXSA9ICJcdTA2MjZcdTA2MzIiOworIHRbIlx1RkM2NiJdID0gIlx1MDYyNlx1MDY0NSI7CisgdFsiXHVGQzY3Il0gPSAiXHUwNjI2XHUwNjQ2IjsKKyB0WyJcdUZDNjgiXSA9ICJcdTA2MjZcdTA2NDkiOworIHRbIlx1RkM2OSJdID0gIlx1MDYyNlx1MDY0QSI7CisgdFsiXHVGQzZBIl0gPSAiXHUwNjI4XHUwNjMxIjsKKyB0WyJcdUZDNkIiXSA9ICJcdTA2MjhcdTA2MzIiOworIHRbIlx1RkM2QyJdID0gIlx1MDYyOFx1MDY0NSI7CisgdFsiXHVGQzZEIl0gPSAiXHUwNjI4XHUwNjQ2IjsKKyB0WyJcdUZDNkUiXSA9ICJcdTA2MjhcdTA2NDkiOworIHRbIlx1RkM2RiJdID0gIlx1MDYyOFx1MDY0QSI7CisgdFsiXHVGQzcwIl0gPSAiXHUwNjJBXHUwNjMxIjsKKyB0WyJcdUZDNzEiXSA9ICJcdTA2MkFcdTA2MzIiOworIHRbIlx1RkM3MiJdID0gIlx1MDYyQVx1MDY0NSI7CisgdFsiXHVGQzczIl0gPSAiXHUwNjJBXHUwNjQ2IjsKKyB0WyJcdUZDNzQiXSA9ICJcdTA2MkFcdTA2NDkiOworIHRbIlx1RkM3NSJdID0gIlx1MDYyQVx1MDY0QSI7CisgdFsiXHVGQzc2Il0gPSAiXHUwNjJCXHUwNjMxIjsKKyB0WyJcdUZDNzciXSA9ICJcdTA2MkJcdTA2MzIiOworIHRbIlx1RkM3OCJdID0gIlx1MDYyQlx1MDY0NSI7CisgdFsiXHVGQzc5Il0gPSAiXHUwNjJCXHUwNjQ2IjsKKyB0WyJcdUZDN0EiXSA9ICJcdTA2MkJcdTA2NDkiOworIHRbIlx1RkM3QiJdID0gIlx1MDYyQlx1MDY0QSI7CisgdFsiXHVGQzdDIl0gPSAiXHUwNjQxXHUwNjQ5IjsKKyB0WyJcdUZDN0QiXSA9ICJcdTA2NDFcdTA2NEEiOworIHRbIlx1RkM3RSJdID0gIlx1MDY0Mlx1MDY0OSI7CisgdFsiXHVGQzdGIl0gPSAiXHUwNjQyXHUwNjRBIjsKKyB0WyJcdUZDODAiXSA9ICJcdTA2NDNcdTA2MjciOworIHRbIlx1RkM4MSJdID0gIlx1MDY0M1x1MDY0NCI7CisgdFsiXHVGQzgyIl0gPSAiXHUwNjQzXHUwNjQ1IjsKKyB0WyJcdUZDODMiXSA9ICJcdTA2NDNcdTA2NDkiOworIHRbIlx1RkM4NCJdID0gIlx1MDY0M1x1MDY0QSI7CisgdFsiXHVGQzg1Il0gPSAiXHUwNjQ0XHUwNjQ1IjsKKyB0WyJcdUZDODYiXSA9ICJcdTA2NDRcdTA2NDkiOworIHRbIlx1RkM4NyJdID0gIlx1MDY0NFx1MDY0QSI7CisgdFsiXHVGQzg4Il0gPSAiXHUwNjQ1XHUwNjI3IjsKKyB0WyJcdUZDODkiXSA9ICJcdTA2NDVcdTA2NDUiOworIHRbIlx1RkM4QSJdID0gIlx1MDY0Nlx1MDYzMSI7CisgdFsiXHVGQzhCIl0gPSAiXHUwNjQ2XHUwNjMyIjsKKyB0WyJcdUZDOEMiXSA9ICJcdTA2NDZcdTA2NDUiOworIHRbIlx1RkM4RCJdID0gIlx1MDY0Nlx1MDY0NiI7CisgdFsiXHVGQzhFIl0gPSAiXHUwNjQ2XHUwNjQ5IjsKKyB0WyJcdUZDOEYiXSA9ICJcdTA2NDZcdTA2NEEiOworIHRbIlx1RkM5MCJdID0gIlx1MDY0OVx1MDY3MCI7CisgdFsiXHVGQzkxIl0gPSAiXHUwNjRBXHUwNjMxIjsKKyB0WyJcdUZDOTIiXSA9ICJcdTA2NEFcdTA2MzIiOworIHRbIlx1RkM5MyJdID0gIlx1MDY0QVx1MDY0NSI7CisgdFsiXHVGQzk0Il0gPSAiXHUwNjRBXHUwNjQ2IjsKKyB0WyJcdUZDOTUiXSA9ICJcdTA2NEFcdTA2NDkiOworIHRbIlx1RkM5NiJdID0gIlx1MDY0QVx1MDY0QSI7CisgdFsiXHVGQzk3Il0gPSAiXHUwNjI2XHUwNjJDIjsKKyB0WyJcdUZDOTgiXSA9ICJcdTA2MjZcdTA2MkQiOworIHRbIlx1RkM5OSJdID0gIlx1MDYyNlx1MDYyRSI7CisgdFsiXHVGQzlBIl0gPSAiXHUwNjI2XHUwNjQ1IjsKKyB0WyJcdUZDOUIiXSA9ICJcdTA2MjZcdTA2NDciOworIHRbIlx1RkM5QyJdID0gIlx1MDYyOFx1MDYyQyI7CisgdFsiXHVGQzlEIl0gPSAiXHUwNjI4XHUwNjJEIjsKKyB0WyJcdUZDOUUiXSA9ICJcdTA2MjhcdTA2MkUiOworIHRbIlx1RkM5RiJdID0gIlx1MDYyOFx1MDY0NSI7CisgdFsiXHVGQ0EwIl0gPSAiXHUwNjI4XHUwNjQ3IjsKKyB0WyJcdUZDQTEiXSA9ICJcdTA2MkFcdTA2MkMiOworIHRbIlx1RkNBMiJdID0gIlx1MDYyQVx1MDYyRCI7CisgdFsiXHVGQ0EzIl0gPSAiXHUwNjJBXHUwNjJFIjsKKyB0WyJcdUZDQTQiXSA9ICJcdTA2MkFcdTA2NDUiOworIHRbIlx1RkNBNSJdID0gIlx1MDYyQVx1MDY0NyI7CisgdFsiXHVGQ0E2Il0gPSAiXHUwNjJCXHUwNjQ1IjsKKyB0WyJcdUZDQTciXSA9ICJcdTA2MkNcdTA2MkQiOworIHRbIlx1RkNBOCJdID0gIlx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGQ0E5Il0gPSAiXHUwNjJEXHUwNjJDIjsKKyB0WyJcdUZDQUEiXSA9ICJcdTA2MkRcdTA2NDUiOworIHRbIlx1RkNBQiJdID0gIlx1MDYyRVx1MDYyQyI7CisgdFsiXHVGQ0FDIl0gPSAiXHUwNjJFXHUwNjQ1IjsKKyB0WyJcdUZDQUQiXSA9ICJcdTA2MzNcdTA2MkMiOworIHRbIlx1RkNBRSJdID0gIlx1MDYzM1x1MDYyRCI7CisgdFsiXHVGQ0FGIl0gPSAiXHUwNjMzXHUwNjJFIjsKKyB0WyJcdUZDQjAiXSA9ICJcdTA2MzNcdTA2NDUiOworIHRbIlx1RkNCMSJdID0gIlx1MDYzNVx1MDYyRCI7CisgdFsiXHVGQ0IyIl0gPSAiXHUwNjM1XHUwNjJFIjsKKyB0WyJcdUZDQjMiXSA9ICJcdTA2MzVcdTA2NDUiOworIHRbIlx1RkNCNCJdID0gIlx1MDYzNlx1MDYyQyI7CisgdFsiXHVGQ0I1Il0gPSAiXHUwNjM2XHUwNjJEIjsKKyB0WyJcdUZDQjYiXSA9ICJcdTA2MzZcdTA2MkUiOworIHRbIlx1RkNCNyJdID0gIlx1MDYzNlx1MDY0NSI7CisgdFsiXHVGQ0I4Il0gPSAiXHUwNjM3XHUwNjJEIjsKKyB0WyJcdUZDQjkiXSA9ICJcdTA2MzhcdTA2NDUiOworIHRbIlx1RkNCQSJdID0gIlx1MDYzOVx1MDYyQyI7CisgdFsiXHVGQ0JCIl0gPSAiXHUwNjM5XHUwNjQ1IjsKKyB0WyJcdUZDQkMiXSA9ICJcdTA2M0FcdTA2MkMiOworIHRbIlx1RkNCRCJdID0gIlx1MDYzQVx1MDY0NSI7CisgdFsiXHVGQ0JFIl0gPSAiXHUwNjQxXHUwNjJDIjsKKyB0WyJcdUZDQkYiXSA9ICJcdTA2NDFcdTA2MkQiOworIHRbIlx1RkNDMCJdID0gIlx1MDY0MVx1MDYyRSI7CisgdFsiXHVGQ0MxIl0gPSAiXHUwNjQxXHUwNjQ1IjsKKyB0WyJcdUZDQzIiXSA9ICJcdTA2NDJcdTA2MkQiOworIHRbIlx1RkNDMyJdID0gIlx1MDY0Mlx1MDY0NSI7CisgdFsiXHVGQ0M0Il0gPSAiXHUwNjQzXHUwNjJDIjsKKyB0WyJcdUZDQzUiXSA9ICJcdTA2NDNcdTA2MkQiOworIHRbIlx1RkNDNiJdID0gIlx1MDY0M1x1MDYyRSI7CisgdFsiXHVGQ0M3Il0gPSAiXHUwNjQzXHUwNjQ0IjsKKyB0WyJcdUZDQzgiXSA9ICJcdTA2NDNcdTA2NDUiOworIHRbIlx1RkNDOSJdID0gIlx1MDY0NFx1MDYyQyI7CisgdFsiXHVGQ0NBIl0gPSAiXHUwNjQ0XHUwNjJEIjsKKyB0WyJcdUZDQ0IiXSA9ICJcdTA2NDRcdTA2MkUiOworIHRbIlx1RkNDQyJdID0gIlx1MDY0NFx1MDY0NSI7CisgdFsiXHVGQ0NEIl0gPSAiXHUwNjQ0XHUwNjQ3IjsKKyB0WyJcdUZDQ0UiXSA9ICJcdTA2NDVcdTA2MkMiOworIHRbIlx1RkNDRiJdID0gIlx1MDY0NVx1MDYyRCI7CisgdFsiXHVGQ0QwIl0gPSAiXHUwNjQ1XHUwNjJFIjsKKyB0WyJcdUZDRDEiXSA9ICJcdTA2NDVcdTA2NDUiOworIHRbIlx1RkNEMiJdID0gIlx1MDY0Nlx1MDYyQyI7CisgdFsiXHVGQ0QzIl0gPSAiXHUwNjQ2XHUwNjJEIjsKKyB0WyJcdUZDRDQiXSA9ICJcdTA2NDZcdTA2MkUiOworIHRbIlx1RkNENSJdID0gIlx1MDY0Nlx1MDY0NSI7CisgdFsiXHVGQ0Q2Il0gPSAiXHUwNjQ2XHUwNjQ3IjsKKyB0WyJcdUZDRDciXSA9ICJcdTA2NDdcdTA2MkMiOworIHRbIlx1RkNEOCJdID0gIlx1MDY0N1x1MDY0NSI7CisgdFsiXHVGQ0Q5Il0gPSAiXHUwNjQ3XHUwNjcwIjsKKyB0WyJcdUZDREEiXSA9ICJcdTA2NEFcdTA2MkMiOworIHRbIlx1RkNEQiJdID0gIlx1MDY0QVx1MDYyRCI7CisgdFsiXHVGQ0RDIl0gPSAiXHUwNjRBXHUwNjJFIjsKKyB0WyJcdUZDREQiXSA9ICJcdTA2NEFcdTA2NDUiOworIHRbIlx1RkNERSJdID0gIlx1MDY0QVx1MDY0NyI7CisgdFsiXHVGQ0RGIl0gPSAiXHUwNjI2XHUwNjQ1IjsKKyB0WyJcdUZDRTAiXSA9ICJcdTA2MjZcdTA2NDciOworIHRbIlx1RkNFMSJdID0gIlx1MDYyOFx1MDY0NSI7CisgdFsiXHVGQ0UyIl0gPSAiXHUwNjI4XHUwNjQ3IjsKKyB0WyJcdUZDRTMiXSA9ICJcdTA2MkFcdTA2NDUiOworIHRbIlx1RkNFNCJdID0gIlx1MDYyQVx1MDY0NyI7CisgdFsiXHVGQ0U1Il0gPSAiXHUwNjJCXHUwNjQ1IjsKKyB0WyJcdUZDRTYiXSA9ICJcdTA2MkJcdTA2NDciOworIHRbIlx1RkNFNyJdID0gIlx1MDYzM1x1MDY0NSI7CisgdFsiXHVGQ0U4Il0gPSAiXHUwNjMzXHUwNjQ3IjsKKyB0WyJcdUZDRTkiXSA9ICJcdTA2MzRcdTA2NDUiOworIHRbIlx1RkNFQSJdID0gIlx1MDYzNFx1MDY0NyI7CisgdFsiXHVGQ0VCIl0gPSAiXHUwNjQzXHUwNjQ0IjsKKyB0WyJcdUZDRUMiXSA9ICJcdTA2NDNcdTA2NDUiOworIHRbIlx1RkNFRCJdID0gIlx1MDY0NFx1MDY0NSI7CisgdFsiXHVGQ0VFIl0gPSAiXHUwNjQ2XHUwNjQ1IjsKKyB0WyJcdUZDRUYiXSA9ICJcdTA2NDZcdTA2NDciOworIHRbIlx1RkNGMCJdID0gIlx1MDY0QVx1MDY0NSI7CisgdFsiXHVGQ0YxIl0gPSAiXHUwNjRBXHUwNjQ3IjsKKyB0WyJcdUZDRjIiXSA9ICJcdTA2NDBcdTA2NEVcdTA2NTEiOworIHRbIlx1RkNGMyJdID0gIlx1MDY0MFx1MDY0Rlx1MDY1MSI7CisgdFsiXHVGQ0Y0Il0gPSAiXHUwNjQwXHUwNjUwXHUwNjUxIjsKKyB0WyJcdUZDRjUiXSA9ICJcdTA2MzdcdTA2NDkiOworIHRbIlx1RkNGNiJdID0gIlx1MDYzN1x1MDY0QSI7CisgdFsiXHVGQ0Y3Il0gPSAiXHUwNjM5XHUwNjQ5IjsKKyB0WyJcdUZDRjgiXSA9ICJcdTA2MzlcdTA2NEEiOworIHRbIlx1RkNGOSJdID0gIlx1MDYzQVx1MDY0OSI7CisgdFsiXHVGQ0ZBIl0gPSAiXHUwNjNBXHUwNjRBIjsKKyB0WyJcdUZDRkIiXSA9ICJcdTA2MzNcdTA2NDkiOworIHRbIlx1RkNGQyJdID0gIlx1MDYzM1x1MDY0QSI7CisgdFsiXHVGQ0ZEIl0gPSAiXHUwNjM0XHUwNjQ5IjsKKyB0WyJcdUZDRkUiXSA9ICJcdTA2MzRcdTA2NEEiOworIHRbIlx1RkNGRiJdID0gIlx1MDYyRFx1MDY0OSI7CisgdFsiXHVGRDAwIl0gPSAiXHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEMDEiXSA9ICJcdTA2MkNcdTA2NDkiOworIHRbIlx1RkQwMiJdID0gIlx1MDYyQ1x1MDY0QSI7CisgdFsiXHVGRDAzIl0gPSAiXHUwNjJFXHUwNjQ5IjsKKyB0WyJcdUZEMDQiXSA9ICJcdTA2MkVcdTA2NEEiOworIHRbIlx1RkQwNSJdID0gIlx1MDYzNVx1MDY0OSI7CisgdFsiXHVGRDA2Il0gPSAiXHUwNjM1XHUwNjRBIjsKKyB0WyJcdUZEMDciXSA9ICJcdTA2MzZcdTA2NDkiOworIHRbIlx1RkQwOCJdID0gIlx1MDYzNlx1MDY0QSI7CisgdFsiXHVGRDA5Il0gPSAiXHUwNjM0XHUwNjJDIjsKKyB0WyJcdUZEMEEiXSA9ICJcdTA2MzRcdTA2MkQiOworIHRbIlx1RkQwQiJdID0gIlx1MDYzNFx1MDYyRSI7CisgdFsiXHVGRDBDIl0gPSAiXHUwNjM0XHUwNjQ1IjsKKyB0WyJcdUZEMEQiXSA9ICJcdTA2MzRcdTA2MzEiOworIHRbIlx1RkQwRSJdID0gIlx1MDYzM1x1MDYzMSI7CisgdFsiXHVGRDBGIl0gPSAiXHUwNjM1XHUwNjMxIjsKKyB0WyJcdUZEMTAiXSA9ICJcdTA2MzZcdTA2MzEiOworIHRbIlx1RkQxMSJdID0gIlx1MDYzN1x1MDY0OSI7CisgdFsiXHVGRDEyIl0gPSAiXHUwNjM3XHUwNjRBIjsKKyB0WyJcdUZEMTMiXSA9ICJcdTA2MzlcdTA2NDkiOworIHRbIlx1RkQxNCJdID0gIlx1MDYzOVx1MDY0QSI7CisgdFsiXHVGRDE1Il0gPSAiXHUwNjNBXHUwNjQ5IjsKKyB0WyJcdUZEMTYiXSA9ICJcdTA2M0FcdTA2NEEiOworIHRbIlx1RkQxNyJdID0gIlx1MDYzM1x1MDY0OSI7CisgdFsiXHVGRDE4Il0gPSAiXHUwNjMzXHUwNjRBIjsKKyB0WyJcdUZEMTkiXSA9ICJcdTA2MzRcdTA2NDkiOworIHRbIlx1RkQxQSJdID0gIlx1MDYzNFx1MDY0QSI7CisgdFsiXHVGRDFCIl0gPSAiXHUwNjJEXHUwNjQ5IjsKKyB0WyJcdUZEMUMiXSA9ICJcdTA2MkRcdTA2NEEiOworIHRbIlx1RkQxRCJdID0gIlx1MDYyQ1x1MDY0OSI7CisgdFsiXHVGRDFFIl0gPSAiXHUwNjJDXHUwNjRBIjsKKyB0WyJcdUZEMUYiXSA9ICJcdTA2MkVcdTA2NDkiOworIHRbIlx1RkQyMCJdID0gIlx1MDYyRVx1MDY0QSI7CisgdFsiXHVGRDIxIl0gPSAiXHUwNjM1XHUwNjQ5IjsKKyB0WyJcdUZEMjIiXSA9ICJcdTA2MzVcdTA2NEEiOworIHRbIlx1RkQyMyJdID0gIlx1MDYzNlx1MDY0OSI7CisgdFsiXHVGRDI0Il0gPSAiXHUwNjM2XHUwNjRBIjsKKyB0WyJcdUZEMjUiXSA9ICJcdTA2MzRcdTA2MkMiOworIHRbIlx1RkQyNiJdID0gIlx1MDYzNFx1MDYyRCI7CisgdFsiXHVGRDI3Il0gPSAiXHUwNjM0XHUwNjJFIjsKKyB0WyJcdUZEMjgiXSA9ICJcdTA2MzRcdTA2NDUiOworIHRbIlx1RkQyOSJdID0gIlx1MDYzNFx1MDYzMSI7CisgdFsiXHVGRDJBIl0gPSAiXHUwNjMzXHUwNjMxIjsKKyB0WyJcdUZEMkIiXSA9ICJcdTA2MzVcdTA2MzEiOworIHRbIlx1RkQyQyJdID0gIlx1MDYzNlx1MDYzMSI7CisgdFsiXHVGRDJEIl0gPSAiXHUwNjM0XHUwNjJDIjsKKyB0WyJcdUZEMkUiXSA9ICJcdTA2MzRcdTA2MkQiOworIHRbIlx1RkQyRiJdID0gIlx1MDYzNFx1MDYyRSI7CisgdFsiXHVGRDMwIl0gPSAiXHUwNjM0XHUwNjQ1IjsKKyB0WyJcdUZEMzEiXSA9ICJcdTA2MzNcdTA2NDciOworIHRbIlx1RkQzMiJdID0gIlx1MDYzNFx1MDY0NyI7CisgdFsiXHVGRDMzIl0gPSAiXHUwNjM3XHUwNjQ1IjsKKyB0WyJcdUZEMzQiXSA9ICJcdTA2MzNcdTA2MkMiOworIHRbIlx1RkQzNSJdID0gIlx1MDYzM1x1MDYyRCI7CisgdFsiXHVGRDM2Il0gPSAiXHUwNjMzXHUwNjJFIjsKKyB0WyJcdUZEMzciXSA9ICJcdTA2MzRcdTA2MkMiOworIHRbIlx1RkQzOCJdID0gIlx1MDYzNFx1MDYyRCI7CisgdFsiXHVGRDM5Il0gPSAiXHUwNjM0XHUwNjJFIjsKKyB0WyJcdUZEM0EiXSA9ICJcdTA2MzdcdTA2NDUiOworIHRbIlx1RkQzQiJdID0gIlx1MDYzOFx1MDY0NSI7CisgdFsiXHVGRDNDIl0gPSAiXHUwNjI3XHUwNjRCIjsKKyB0WyJcdUZEM0QiXSA9ICJcdTA2MjdcdTA2NEIiOworIHRbIlx1RkQ1MCJdID0gIlx1MDYyQVx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGRDUxIl0gPSAiXHUwNjJBXHUwNjJEXHUwNjJDIjsKKyB0WyJcdUZENTIiXSA9ICJcdTA2MkFcdTA2MkRcdTA2MkMiOworIHRbIlx1RkQ1MyJdID0gIlx1MDYyQVx1MDYyRFx1MDY0NSI7CisgdFsiXHVGRDU0Il0gPSAiXHUwNjJBXHUwNjJFXHUwNjQ1IjsKKyB0WyJcdUZENTUiXSA9ICJcdTA2MkFcdTA2NDVcdTA2MkMiOworIHRbIlx1RkQ1NiJdID0gIlx1MDYyQVx1MDY0NVx1MDYyRCI7CisgdFsiXHVGRDU3Il0gPSAiXHUwNjJBXHUwNjQ1XHUwNjJFIjsKKyB0WyJcdUZENTgiXSA9ICJcdTA2MkNcdTA2NDVcdTA2MkQiOworIHRbIlx1RkQ1OSJdID0gIlx1MDYyQ1x1MDY0NVx1MDYyRCI7CisgdFsiXHVGRDVBIl0gPSAiXHUwNjJEXHUwNjQ1XHUwNjRBIjsKKyB0WyJcdUZENUIiXSA9ICJcdTA2MkRcdTA2NDVcdTA2NDkiOworIHRbIlx1RkQ1QyJdID0gIlx1MDYzM1x1MDYyRFx1MDYyQyI7CisgdFsiXHVGRDVEIl0gPSAiXHUwNjMzXHUwNjJDXHUwNjJEIjsKKyB0WyJcdUZENUUiXSA9ICJcdTA2MzNcdTA2MkNcdTA2NDkiOworIHRbIlx1RkQ1RiJdID0gIlx1MDYzM1x1MDY0NVx1MDYyRCI7CisgdFsiXHVGRDYwIl0gPSAiXHUwNjMzXHUwNjQ1XHUwNjJEIjsKKyB0WyJcdUZENjEiXSA9ICJcdTA2MzNcdTA2NDVcdTA2MkMiOworIHRbIlx1RkQ2MiJdID0gIlx1MDYzM1x1MDY0NVx1MDY0NSI7CisgdFsiXHVGRDYzIl0gPSAiXHUwNjMzXHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZENjQiXSA9ICJcdTA2MzVcdTA2MkRcdTA2MkQiOworIHRbIlx1RkQ2NSJdID0gIlx1MDYzNVx1MDYyRFx1MDYyRCI7CisgdFsiXHVGRDY2Il0gPSAiXHUwNjM1XHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZENjciXSA9ICJcdTA2MzRcdTA2MkRcdTA2NDUiOworIHRbIlx1RkQ2OCJdID0gIlx1MDYzNFx1MDYyRFx1MDY0NSI7CisgdFsiXHVGRDY5Il0gPSAiXHUwNjM0XHUwNjJDXHUwNjRBIjsKKyB0WyJcdUZENkEiXSA9ICJcdTA2MzRcdTA2NDVcdTA2MkUiOworIHRbIlx1RkQ2QiJdID0gIlx1MDYzNFx1MDY0NVx1MDYyRSI7CisgdFsiXHVGRDZDIl0gPSAiXHUwNjM0XHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZENkQiXSA9ICJcdTA2MzRcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ2RSJdID0gIlx1MDYzNlx1MDYyRFx1MDY0OSI7CisgdFsiXHVGRDZGIl0gPSAiXHUwNjM2XHUwNjJFXHUwNjQ1IjsKKyB0WyJcdUZENzAiXSA9ICJcdTA2MzZcdTA2MkVcdTA2NDUiOworIHRbIlx1RkQ3MSJdID0gIlx1MDYzN1x1MDY0NVx1MDYyRCI7CisgdFsiXHVGRDcyIl0gPSAiXHUwNjM3XHUwNjQ1XHUwNjJEIjsKKyB0WyJcdUZENzMiXSA9ICJcdTA2MzdcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ3NCJdID0gIlx1MDYzN1x1MDY0NVx1MDY0QSI7CisgdFsiXHVGRDc1Il0gPSAiXHUwNjM5XHUwNjJDXHUwNjQ1IjsKKyB0WyJcdUZENzYiXSA9ICJcdTA2MzlcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ3NyJdID0gIlx1MDYzOVx1MDY0NVx1MDY0NSI7CisgdFsiXHVGRDc4Il0gPSAiXHUwNjM5XHUwNjQ1XHUwNjQ5IjsKKyB0WyJcdUZENzkiXSA9ICJcdTA2M0FcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ3QSJdID0gIlx1MDYzQVx1MDY0NVx1MDY0QSI7CisgdFsiXHVGRDdCIl0gPSAiXHUwNjNBXHUwNjQ1XHUwNjQ5IjsKKyB0WyJcdUZEN0MiXSA9ICJcdTA2NDFcdTA2MkVcdTA2NDUiOworIHRbIlx1RkQ3RCJdID0gIlx1MDY0MVx1MDYyRVx1MDY0NSI7CisgdFsiXHVGRDdFIl0gPSAiXHUwNjQyXHUwNjQ1XHUwNjJEIjsKKyB0WyJcdUZEN0YiXSA9ICJcdTA2NDJcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ4MCJdID0gIlx1MDY0NFx1MDYyRFx1MDY0NSI7CisgdFsiXHVGRDgxIl0gPSAiXHUwNjQ0XHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEODIiXSA9ICJcdTA2NDRcdTA2MkRcdTA2NDkiOworIHRbIlx1RkQ4MyJdID0gIlx1MDY0NFx1MDYyQ1x1MDYyQyI7CisgdFsiXHVGRDg0Il0gPSAiXHUwNjQ0XHUwNjJDXHUwNjJDIjsKKyB0WyJcdUZEODUiXSA9ICJcdTA2NDRcdTA2MkVcdTA2NDUiOworIHRbIlx1RkQ4NiJdID0gIlx1MDY0NFx1MDYyRVx1MDY0NSI7CisgdFsiXHVGRDg3Il0gPSAiXHUwNjQ0XHUwNjQ1XHUwNjJEIjsKKyB0WyJcdUZEODgiXSA9ICJcdTA2NDRcdTA2NDVcdTA2MkQiOworIHRbIlx1RkQ4OSJdID0gIlx1MDY0NVx1MDYyRFx1MDYyQyI7CisgdFsiXHVGRDhBIl0gPSAiXHUwNjQ1XHUwNjJEXHUwNjQ1IjsKKyB0WyJcdUZEOEIiXSA9ICJcdTA2NDVcdTA2MkRcdTA2NEEiOworIHRbIlx1RkQ4QyJdID0gIlx1MDY0NVx1MDYyQ1x1MDYyRCI7CisgdFsiXHVGRDhEIl0gPSAiXHUwNjQ1XHUwNjJDXHUwNjQ1IjsKKyB0WyJcdUZEOEUiXSA9ICJcdTA2NDVcdTA2MkVcdTA2MkMiOworIHRbIlx1RkQ4RiJdID0gIlx1MDY0NVx1MDYyRVx1MDY0NSI7CisgdFsiXHVGRDkyIl0gPSAiXHUwNjQ1XHUwNjJDXHUwNjJFIjsKKyB0WyJcdUZEOTMiXSA9ICJcdTA2NDdcdTA2NDVcdTA2MkMiOworIHRbIlx1RkQ5NCJdID0gIlx1MDY0N1x1MDY0NVx1MDY0NSI7CisgdFsiXHVGRDk1Il0gPSAiXHUwNjQ2XHUwNjJEXHUwNjQ1IjsKKyB0WyJcdUZEOTYiXSA9ICJcdTA2NDZcdTA2MkRcdTA2NDkiOworIHRbIlx1RkQ5NyJdID0gIlx1MDY0Nlx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGRDk4Il0gPSAiXHUwNjQ2XHUwNjJDXHUwNjQ1IjsKKyB0WyJcdUZEOTkiXSA9ICJcdTA2NDZcdTA2MkNcdTA2NDkiOworIHRbIlx1RkQ5QSJdID0gIlx1MDY0Nlx1MDY0NVx1MDY0QSI7CisgdFsiXHVGRDlCIl0gPSAiXHUwNjQ2XHUwNjQ1XHUwNjQ5IjsKKyB0WyJcdUZEOUMiXSA9ICJcdTA2NEFcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ5RCJdID0gIlx1MDY0QVx1MDY0NVx1MDY0NSI7CisgdFsiXHVGRDlFIl0gPSAiXHUwNjI4XHUwNjJFXHUwNjRBIjsKKyB0WyJcdUZEOUYiXSA9ICJcdTA2MkFcdTA2MkNcdTA2NEEiOworIHRbIlx1RkRBMCJdID0gIlx1MDYyQVx1MDYyQ1x1MDY0OSI7CisgdFsiXHVGREExIl0gPSAiXHUwNjJBXHUwNjJFXHUwNjRBIjsKKyB0WyJcdUZEQTIiXSA9ICJcdTA2MkFcdTA2MkVcdTA2NDkiOworIHRbIlx1RkRBMyJdID0gIlx1MDYyQVx1MDY0NVx1MDY0QSI7CisgdFsiXHVGREE0Il0gPSAiXHUwNjJBXHUwNjQ1XHUwNjQ5IjsKKyB0WyJcdUZEQTUiXSA9ICJcdTA2MkNcdTA2NDVcdTA2NEEiOworIHRbIlx1RkRBNiJdID0gIlx1MDYyQ1x1MDYyRFx1MDY0OSI7CisgdFsiXHVGREE3Il0gPSAiXHUwNjJDXHUwNjQ1XHUwNjQ5IjsKKyB0WyJcdUZEQTgiXSA9ICJcdTA2MzNcdTA2MkVcdTA2NDkiOworIHRbIlx1RkRBOSJdID0gIlx1MDYzNVx1MDYyRFx1MDY0QSI7CisgdFsiXHVGREFBIl0gPSAiXHUwNjM0XHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEQUIiXSA9ICJcdTA2MzZcdTA2MkRcdTA2NEEiOworIHRbIlx1RkRBQyJdID0gIlx1MDY0NFx1MDYyQ1x1MDY0QSI7CisgdFsiXHVGREFEIl0gPSAiXHUwNjQ0XHUwNjQ1XHUwNjRBIjsKKyB0WyJcdUZEQUUiXSA9ICJcdTA2NEFcdTA2MkRcdTA2NEEiOworIHRbIlx1RkRBRiJdID0gIlx1MDY0QVx1MDYyQ1x1MDY0QSI7CisgdFsiXHVGREIwIl0gPSAiXHUwNjRBXHUwNjQ1XHUwNjRBIjsKKyB0WyJcdUZEQjEiXSA9ICJcdTA2NDVcdTA2NDVcdTA2NEEiOworIHRbIlx1RkRCMiJdID0gIlx1MDY0Mlx1MDY0NVx1MDY0QSI7CisgdFsiXHVGREIzIl0gPSAiXHUwNjQ2XHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEQjQiXSA9ICJcdTA2NDJcdTA2NDVcdTA2MkQiOworIHRbIlx1RkRCNSJdID0gIlx1MDY0NFx1MDYyRFx1MDY0NSI7CisgdFsiXHVGREI2Il0gPSAiXHUwNjM5XHUwNjQ1XHUwNjRBIjsKKyB0WyJcdUZEQjciXSA9ICJcdTA2NDNcdTA2NDVcdTA2NEEiOworIHRbIlx1RkRCOCJdID0gIlx1MDY0Nlx1MDYyQ1x1MDYyRCI7CisgdFsiXHVGREI5Il0gPSAiXHUwNjQ1XHUwNjJFXHUwNjRBIjsKKyB0WyJcdUZEQkEiXSA9ICJcdTA2NDRcdTA2MkNcdTA2NDUiOworIHRbIlx1RkRCQiJdID0gIlx1MDY0M1x1MDY0NVx1MDY0NSI7CisgdFsiXHVGREJDIl0gPSAiXHUwNjQ0XHUwNjJDXHUwNjQ1IjsKKyB0WyJcdUZEQkQiXSA9ICJcdTA2NDZcdTA2MkNcdTA2MkQiOworIHRbIlx1RkRCRSJdID0gIlx1MDYyQ1x1MDYyRFx1MDY0QSI7CisgdFsiXHVGREJGIl0gPSAiXHUwNjJEXHUwNjJDXHUwNjRBIjsKKyB0WyJcdUZEQzAiXSA9ICJcdTA2NDVcdTA2MkNcdTA2NEEiOworIHRbIlx1RkRDMSJdID0gIlx1MDY0MVx1MDY0NVx1MDY0QSI7CisgdFsiXHVGREMyIl0gPSAiXHUwNjI4XHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEQzMiXSA9ICJcdTA2NDNcdTA2NDVcdTA2NDUiOworIHRbIlx1RkRDNCJdID0gIlx1MDYzOVx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGREM1Il0gPSAiXHUwNjM1XHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZEQzYiXSA9ICJcdTA2MzNcdTA2MkVcdTA2NEEiOworIHRbIlx1RkRDNyJdID0gIlx1MDY0Nlx1MDYyQ1x1MDY0QSI7CisgdFsiXHVGRTQ5Il0gPSAiXHUyMDNFIjsKKyB0WyJcdUZFNEEiXSA9ICJcdTIwM0UiOworIHRbIlx1RkU0QiJdID0gIlx1MjAzRSI7CisgdFsiXHVGRTRDIl0gPSAiXHUyMDNFIjsKKyB0WyJcdUZFNEQiXSA9ICJcdTAwNUYiOworIHRbIlx1RkU0RSJdID0gIlx1MDA1RiI7CisgdFsiXHVGRTRGIl0gPSAiXHUwMDVGIjsKKyB0WyJcdUZFODAiXSA9ICJcdTA2MjEiOworIHRbIlx1RkU4MSJdID0gIlx1MDYyMiI7CisgdFsiXHVGRTgyIl0gPSAiXHUwNjIyIjsKKyB0WyJcdUZFODMiXSA9ICJcdTA2MjMiOworIHRbIlx1RkU4NCJdID0gIlx1MDYyMyI7CisgdFsiXHVGRTg1Il0gPSAiXHUwNjI0IjsKKyB0WyJcdUZFODYiXSA9ICJcdTA2MjQiOworIHRbIlx1RkU4NyJdID0gIlx1MDYyNSI7CisgdFsiXHVGRTg4Il0gPSAiXHUwNjI1IjsKKyB0WyJcdUZFODkiXSA9ICJcdTA2MjYiOworIHRbIlx1RkU4QSJdID0gIlx1MDYyNiI7CisgdFsiXHVGRThCIl0gPSAiXHUwNjI2IjsKKyB0WyJcdUZFOEMiXSA9ICJcdTA2MjYiOworIHRbIlx1RkU4RCJdID0gIlx1MDYyNyI7CisgdFsiXHVGRThFIl0gPSAiXHUwNjI3IjsKKyB0WyJcdUZFOEYiXSA9ICJcdTA2MjgiOworIHRbIlx1RkU5MCJdID0gIlx1MDYyOCI7CisgdFsiXHVGRTkxIl0gPSAiXHUwNjI4IjsKKyB0WyJcdUZFOTIiXSA9ICJcdTA2MjgiOworIHRbIlx1RkU5MyJdID0gIlx1MDYyOSI7CisgdFsiXHVGRTk0Il0gPSAiXHUwNjI5IjsKKyB0WyJcdUZFOTUiXSA9ICJcdTA2MkEiOworIHRbIlx1RkU5NiJdID0gIlx1MDYyQSI7CisgdFsiXHVGRTk3Il0gPSAiXHUwNjJBIjsKKyB0WyJcdUZFOTgiXSA9ICJcdTA2MkEiOworIHRbIlx1RkU5OSJdID0gIlx1MDYyQiI7CisgdFsiXHVGRTlBIl0gPSAiXHUwNjJCIjsKKyB0WyJcdUZFOUIiXSA9ICJcdTA2MkIiOworIHRbIlx1RkU5QyJdID0gIlx1MDYyQiI7CisgdFsiXHVGRTlEIl0gPSAiXHUwNjJDIjsKKyB0WyJcdUZFOUUiXSA9ICJcdTA2MkMiOworIHRbIlx1RkU5RiJdID0gIlx1MDYyQyI7CisgdFsiXHVGRUEwIl0gPSAiXHUwNjJDIjsKKyB0WyJcdUZFQTEiXSA9ICJcdTA2MkQiOworIHRbIlx1RkVBMiJdID0gIlx1MDYyRCI7CisgdFsiXHVGRUEzIl0gPSAiXHUwNjJEIjsKKyB0WyJcdUZFQTQiXSA9ICJcdTA2MkQiOworIHRbIlx1RkVBNSJdID0gIlx1MDYyRSI7CisgdFsiXHVGRUE2Il0gPSAiXHUwNjJFIjsKKyB0WyJcdUZFQTciXSA9ICJcdTA2MkUiOworIHRbIlx1RkVBOCJdID0gIlx1MDYyRSI7CisgdFsiXHVGRUE5Il0gPSAiXHUwNjJGIjsKKyB0WyJcdUZFQUEiXSA9ICJcdTA2MkYiOworIHRbIlx1RkVBQiJdID0gIlx1MDYzMCI7CisgdFsiXHVGRUFDIl0gPSAiXHUwNjMwIjsKKyB0WyJcdUZFQUQiXSA9ICJcdTA2MzEiOworIHRbIlx1RkVBRSJdID0gIlx1MDYzMSI7CisgdFsiXHVGRUFGIl0gPSAiXHUwNjMyIjsKKyB0WyJcdUZFQjAiXSA9ICJcdTA2MzIiOworIHRbIlx1RkVCMSJdID0gIlx1MDYzMyI7CisgdFsiXHVGRUIyIl0gPSAiXHUwNjMzIjsKKyB0WyJcdUZFQjMiXSA9ICJcdTA2MzMiOworIHRbIlx1RkVCNCJdID0gIlx1MDYzMyI7CisgdFsiXHVGRUI1Il0gPSAiXHUwNjM0IjsKKyB0WyJcdUZFQjYiXSA9ICJcdTA2MzQiOworIHRbIlx1RkVCNyJdID0gIlx1MDYzNCI7CisgdFsiXHVGRUI4Il0gPSAiXHUwNjM0IjsKKyB0WyJcdUZFQjkiXSA9ICJcdTA2MzUiOworIHRbIlx1RkVCQSJdID0gIlx1MDYzNSI7CisgdFsiXHVGRUJCIl0gPSAiXHUwNjM1IjsKKyB0WyJcdUZFQkMiXSA9ICJcdTA2MzUiOworIHRbIlx1RkVCRCJdID0gIlx1MDYzNiI7CisgdFsiXHVGRUJFIl0gPSAiXHUwNjM2IjsKKyB0WyJcdUZFQkYiXSA9ICJcdTA2MzYiOworIHRbIlx1RkVDMCJdID0gIlx1MDYzNiI7CisgdFsiXHVGRUMxIl0gPSAiXHUwNjM3IjsKKyB0WyJcdUZFQzIiXSA9ICJcdTA2MzciOworIHRbIlx1RkVDMyJdID0gIlx1MDYzNyI7CisgdFsiXHVGRUM0Il0gPSAiXHUwNjM3IjsKKyB0WyJcdUZFQzUiXSA9ICJcdTA2MzgiOworIHRbIlx1RkVDNiJdID0gIlx1MDYzOCI7CisgdFsiXHVGRUM3Il0gPSAiXHUwNjM4IjsKKyB0WyJcdUZFQzgiXSA9ICJcdTA2MzgiOworIHRbIlx1RkVDOSJdID0gIlx1MDYzOSI7CisgdFsiXHVGRUNBIl0gPSAiXHUwNjM5IjsKKyB0WyJcdUZFQ0IiXSA9ICJcdTA2MzkiOworIHRbIlx1RkVDQyJdID0gIlx1MDYzOSI7CisgdFsiXHVGRUNEIl0gPSAiXHUwNjNBIjsKKyB0WyJcdUZFQ0UiXSA9ICJcdTA2M0EiOworIHRbIlx1RkVDRiJdID0gIlx1MDYzQSI7CisgdFsiXHVGRUQwIl0gPSAiXHUwNjNBIjsKKyB0WyJcdUZFRDEiXSA9ICJcdTA2NDEiOworIHRbIlx1RkVEMiJdID0gIlx1MDY0MSI7CisgdFsiXHVGRUQzIl0gPSAiXHUwNjQxIjsKKyB0WyJcdUZFRDQiXSA9ICJcdTA2NDEiOworIHRbIlx1RkVENSJdID0gIlx1MDY0MiI7CisgdFsiXHVGRUQ2Il0gPSAiXHUwNjQyIjsKKyB0WyJcdUZFRDciXSA9ICJcdTA2NDIiOworIHRbIlx1RkVEOCJdID0gIlx1MDY0MiI7CisgdFsiXHVGRUQ5Il0gPSAiXHUwNjQzIjsKKyB0WyJcdUZFREEiXSA9ICJcdTA2NDMiOworIHRbIlx1RkVEQiJdID0gIlx1MDY0MyI7CisgdFsiXHVGRURDIl0gPSAiXHUwNjQzIjsKKyB0WyJcdUZFREQiXSA9ICJcdTA2NDQiOworIHRbIlx1RkVERSJdID0gIlx1MDY0NCI7CisgdFsiXHVGRURGIl0gPSAiXHUwNjQ0IjsKKyB0WyJcdUZFRTAiXSA9ICJcdTA2NDQiOworIHRbIlx1RkVFMSJdID0gIlx1MDY0NSI7CisgdFsiXHVGRUUyIl0gPSAiXHUwNjQ1IjsKKyB0WyJcdUZFRTMiXSA9ICJcdTA2NDUiOworIHRbIlx1RkVFNCJdID0gIlx1MDY0NSI7CisgdFsiXHVGRUU1Il0gPSAiXHUwNjQ2IjsKKyB0WyJcdUZFRTYiXSA9ICJcdTA2NDYiOworIHRbIlx1RkVFNyJdID0gIlx1MDY0NiI7CisgdFsiXHVGRUU4Il0gPSAiXHUwNjQ2IjsKKyB0WyJcdUZFRTkiXSA9ICJcdTA2NDciOworIHRbIlx1RkVFQSJdID0gIlx1MDY0NyI7CisgdFsiXHVGRUVCIl0gPSAiXHUwNjQ3IjsKKyB0WyJcdUZFRUMiXSA9ICJcdTA2NDciOworIHRbIlx1RkVFRCJdID0gIlx1MDY0OCI7CisgdFsiXHVGRUVFIl0gPSAiXHUwNjQ4IjsKKyB0WyJcdUZFRUYiXSA9ICJcdTA2NDkiOworIHRbIlx1RkVGMCJdID0gIlx1MDY0OSI7CisgdFsiXHVGRUYxIl0gPSAiXHUwNjRBIjsKKyB0WyJcdUZFRjIiXSA9ICJcdTA2NEEiOworIHRbIlx1RkVGMyJdID0gIlx1MDY0QSI7CisgdFsiXHVGRUY0Il0gPSAiXHUwNjRBIjsKKyB0WyJcdUZFRjUiXSA9ICJcdTA2NDRcdTA2MjIiOworIHRbIlx1RkVGNiJdID0gIlx1MDY0NFx1MDYyMiI7CisgdFsiXHVGRUY3Il0gPSAiXHUwNjQ0XHUwNjIzIjsKKyB0WyJcdUZFRjgiXSA9ICJcdTA2NDRcdTA2MjMiOworIHRbIlx1RkVGOSJdID0gIlx1MDY0NFx1MDYyNSI7CisgdFsiXHVGRUZBIl0gPSAiXHUwNjQ0XHUwNjI1IjsKKyB0WyJcdUZFRkIiXSA9ICJcdTA2NDRcdTA2MjciOworIHRbIlx1RkVGQyJdID0gIlx1MDY0NFx1MDYyNyI7Cit9KTsKK2Z1bmN0aW9uIHJldmVyc2VJZlJ0bChjaGFycykgeworIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDsKKyBpZiAoY2hhcnNMZW5ndGggPD0gMSB8fCAhaXNSVExSYW5nZUZvcihjaGFycy5jaGFyQ29kZUF0KDApKSkgeworICByZXR1cm4gY2hhcnM7CisgfQorIHZhciBzID0gIiI7CisgZm9yICh2YXIgaWkgPSBjaGFyc0xlbmd0aCAtIDE7IGlpID49IDA7IGlpLS0pIHsKKyAgcyArPSBjaGFyc1tpaV07CisgfQorIHJldHVybiBzOworfQorZXhwb3J0cy5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcyA9IG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzOworZXhwb3J0cy5yZXZlcnNlSWZSdGwgPSByZXZlcnNlSWZSdGw7CitleHBvcnRzLmdldFVuaWNvZGVSYW5nZUZvciA9IGdldFVuaWNvZGVSYW5nZUZvcjsKK2V4cG9ydHMuZ2V0Tm9ybWFsaXplZFVuaWNvZGVzID0gZ2V0Tm9ybWFsaXplZFVuaWNvZGVzOworZXhwb3J0cy5nZXRVbmljb2RlRm9yR2x5cGggPSBnZXRVbmljb2RlRm9yR2x5cGg7CisKKy8qKiovIH0pLAorLyogMzcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Gb250UmVuZGVyZXJGYWN0b3J5ID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX2NmZl9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMxKTsKKwordmFyIF9nbHlwaGxpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM0KTsKKwordmFyIF9lbmNvZGluZ3MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMzKTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKKwordmFyIEZvbnRSZW5kZXJlckZhY3RvcnkgPSBmdW5jdGlvbiBGb250UmVuZGVyZXJGYWN0b3J5Q2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gZ2V0TG9uZyhkYXRhLCBvZmZzZXQpIHsKKyAgICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNiB8IGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgM107CisgIH0KKworICBmdW5jdGlvbiBnZXRVc2hvcnQoZGF0YSwgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAxXTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFN1YnJvdXRpbmVCaWFzKHN1YnJzKSB7CisgICAgY29uc3QgbnVtU3VicnMgPSBzdWJycy5sZW5ndGg7CisgICAgbGV0IGJpYXMgPSAzMjc2ODsKKworICAgIGlmIChudW1TdWJycyA8IDEyNDApIHsKKyAgICAgIGJpYXMgPSAxMDc7CisgICAgfSBlbHNlIGlmIChudW1TdWJycyA8IDMzOTAwKSB7CisgICAgICBiaWFzID0gMTEzMTsKKyAgICB9CisKKyAgICByZXR1cm4gYmlhczsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlQ21hcChkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgdmFyIG9mZnNldCA9IGdldFVzaG9ydChkYXRhLCBzdGFydCArIDIpID09PSAxID8gZ2V0TG9uZyhkYXRhLCBzdGFydCArIDgpIDogZ2V0TG9uZyhkYXRhLCBzdGFydCArIDE2KTsKKyAgICB2YXIgZm9ybWF0ID0gZ2V0VXNob3J0KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0KTsKKyAgICB2YXIgcmFuZ2VzLCBwLCBpOworCisgICAgaWYgKGZvcm1hdCA9PT0gNCkgeworICAgICAgZ2V0VXNob3J0KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0ICsgMik7CisgICAgICB2YXIgc2VnQ291bnQgPSBnZXRVc2hvcnQoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA2KSA+PiAxOworICAgICAgcCA9IHN0YXJ0ICsgb2Zmc2V0ICsgMTQ7CisgICAgICByYW5nZXMgPSBbXTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgeworICAgICAgICByYW5nZXNbaV0gPSB7CisgICAgICAgICAgZW5kOiBnZXRVc2hvcnQoZGF0YSwgcCkKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgcCArPSAyOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CisgICAgICAgIHJhbmdlc1tpXS5zdGFydCA9IGdldFVzaG9ydChkYXRhLCBwKTsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgeworICAgICAgICByYW5nZXNbaV0uaWREZWx0YSA9IGdldFVzaG9ydChkYXRhLCBwKTsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgeworICAgICAgICB2YXIgaWRPZmZzZXQgPSBnZXRVc2hvcnQoZGF0YSwgcCk7CisKKyAgICAgICAgaWYgKGlkT2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByYW5nZXNbaV0uaWRzID0gW107CisKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gcmFuZ2VzW2ldLmVuZCAtIHJhbmdlc1tpXS5zdGFydCArIDE7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgcmFuZ2VzW2ldLmlkc1tqXSA9IGdldFVzaG9ydChkYXRhLCBwICsgaWRPZmZzZXQpOworICAgICAgICAgIGlkT2Zmc2V0ICs9IDI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJhbmdlczsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMTIpIHsKKyAgICAgIGdldExvbmcoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA0KTsKKyAgICAgIHZhciBncm91cHMgPSBnZXRMb25nKGRhdGEsIHN0YXJ0ICsgb2Zmc2V0ICsgMTIpOworICAgICAgcCA9IHN0YXJ0ICsgb2Zmc2V0ICsgMTY7CisgICAgICByYW5nZXMgPSBbXTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwczsgaSsrKSB7CisgICAgICAgIHJhbmdlcy5wdXNoKHsKKyAgICAgICAgICBzdGFydDogZ2V0TG9uZyhkYXRhLCBwKSwKKyAgICAgICAgICBlbmQ6IGdldExvbmcoZGF0YSwgcCArIDQpLAorICAgICAgICAgIGlkRGVsdGE6IGdldExvbmcoZGF0YSwgcCArIDgpIC0gZ2V0TG9uZyhkYXRhLCBwKQorICAgICAgICB9KTsKKyAgICAgICAgcCArPSAxMjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJhbmdlczsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYHVuc3VwcG9ydGVkIGNtYXA6ICR7Zm9ybWF0fWApOworICB9CisKKyAgZnVuY3Rpb24gcGFyc2VDZmYoZGF0YSwgc3RhcnQsIGVuZCwgc2VhY0FuYWx5c2lzRW5hYmxlZCkgeworICAgIHZhciBwcm9wZXJ0aWVzID0ge307CisgICAgdmFyIHBhcnNlciA9IG5ldyBfY2ZmX3BhcnNlci5DRkZQYXJzZXIobmV3IF9zdHJlYW0uU3RyZWFtKGRhdGEsIHN0YXJ0LCBlbmQgLSBzdGFydCksIHByb3BlcnRpZXMsIHNlYWNBbmFseXNpc0VuYWJsZWQpOworICAgIHZhciBjZmYgPSBwYXJzZXIucGFyc2UoKTsKKyAgICByZXR1cm4geworICAgICAgZ2x5cGhzOiBjZmYuY2hhclN0cmluZ3Mub2JqZWN0cywKKyAgICAgIHN1YnJzOiBjZmYudG9wRGljdC5wcml2YXRlRGljdCAmJiBjZmYudG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4ICYmIGNmZi50b3BEaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgub2JqZWN0cywKKyAgICAgIGdzdWJyczogY2ZmLmdsb2JhbFN1YnJJbmRleCAmJiBjZmYuZ2xvYmFsU3VickluZGV4Lm9iamVjdHMsCisgICAgICBpc0NGRkNJREZvbnQ6IGNmZi5pc0NJREZvbnQsCisgICAgICBmZFNlbGVjdDogY2ZmLmZkU2VsZWN0LAorICAgICAgZmRBcnJheTogY2ZmLmZkQXJyYXkKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gcGFyc2VHbHlmVGFibGUoZ2x5ZiwgbG9jYSwgaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKKyAgICB2YXIgaXRlbVNpemUsIGl0ZW1EZWNvZGU7CisKKyAgICBpZiAoaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKKyAgICAgIGl0ZW1TaXplID0gNDsKKworICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlTG9uZyhkYXRhLCBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdOworICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgaXRlbVNpemUgPSAyOworCisgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGUoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgOSB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTsKKyAgICAgIH07CisgICAgfQorCisgICAgdmFyIGdseXBocyA9IFtdOworICAgIHZhciBzdGFydE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgMCk7CisKKyAgICBmb3IgKHZhciBqID0gaXRlbVNpemU7IGogPCBsb2NhLmxlbmd0aDsgaiArPSBpdGVtU2l6ZSkgeworICAgICAgdmFyIGVuZE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgaik7CisgICAgICBnbHlwaHMucHVzaChnbHlmLnN1YmFycmF5KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpKTsKKyAgICAgIHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0OworICAgIH0KKworICAgIHJldHVybiBnbHlwaHM7CisgIH0KKworICBmdW5jdGlvbiBsb29rdXBDbWFwKHJhbmdlcywgdW5pY29kZSkgeworICAgIHZhciBjb2RlID0gdW5pY29kZS5jb2RlUG9pbnRBdCgwKSwKKyAgICAgICAgZ2lkID0gMDsKKyAgICB2YXIgbCA9IDAsCisgICAgICAgIHIgPSByYW5nZXMubGVuZ3RoIC0gMTsKKworICAgIHdoaWxlIChsIDwgcikgeworICAgICAgdmFyIGMgPSBsICsgciArIDEgPj4gMTsKKworICAgICAgaWYgKGNvZGUgPCByYW5nZXNbY10uc3RhcnQpIHsKKyAgICAgICAgciA9IGMgLSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbCA9IGM7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJhbmdlc1tsXS5zdGFydCA8PSBjb2RlICYmIGNvZGUgPD0gcmFuZ2VzW2xdLmVuZCkgeworICAgICAgZ2lkID0gcmFuZ2VzW2xdLmlkRGVsdGEgKyAocmFuZ2VzW2xdLmlkcyA/IHJhbmdlc1tsXS5pZHNbY29kZSAtIHJhbmdlc1tsXS5zdGFydF0gOiBjb2RlKSAmIDB4ZmZmZjsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgY2hhckNvZGU6IGNvZGUsCisgICAgICBnbHlwaElkOiBnaWQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gY29tcGlsZUdseWYoY29kZSwgY21kcywgZm9udCkgeworICAgIGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJtb3ZlVG8iLAorICAgICAgICBhcmdzOiBbeCwgeV0KKyAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJsaW5lVG8iLAorICAgICAgICBhcmdzOiBbeCwgeV0KKyAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIHF1YWRyYXRpY0N1cnZlVG8oeGEsIHlhLCB4LCB5KSB7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJxdWFkcmF0aWNDdXJ2ZVRvIiwKKyAgICAgICAgYXJnczogW3hhLCB5YSwgeCwgeV0KKyAgICAgIH0pOworICAgIH0KKworICAgIHZhciBpID0gMDsKKyAgICB2YXIgbnVtYmVyT2ZDb250b3VycyA9IChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpID4+IDE2OworICAgIHZhciBmbGFnczsKKyAgICB2YXIgeCA9IDAsCisgICAgICAgIHkgPSAwOworICAgIGkgKz0gMTA7CisKKyAgICBpZiAobnVtYmVyT2ZDb250b3VycyA8IDApIHsKKyAgICAgIGRvIHsKKyAgICAgICAgZmxhZ3MgPSBjb2RlW2ldIDw8IDggfCBjb2RlW2kgKyAxXTsKKyAgICAgICAgdmFyIGdseXBoSW5kZXggPSBjb2RlW2kgKyAyXSA8PCA4IHwgY29kZVtpICsgM107CisgICAgICAgIGkgKz0gNDsKKyAgICAgICAgdmFyIGFyZzEsIGFyZzI7CisKKyAgICAgICAgaWYgKGZsYWdzICYgMHgwMSkgeworICAgICAgICAgIGFyZzEgPSAoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSA+PiAxNjsKKyAgICAgICAgICBhcmcyID0gKGNvZGVbaSArIDJdIDw8IDI0IHwgY29kZVtpICsgM10gPDwgMTYpID4+IDE2OworICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhcmcxID0gY29kZVtpKytdOworICAgICAgICAgIGFyZzIgPSBjb2RlW2krK107CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgJiAweDAyKSB7CisgICAgICAgICAgeCA9IGFyZzE7CisgICAgICAgICAgeSA9IGFyZzI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgeSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc2NhbGVYID0gMSwKKyAgICAgICAgICAgIHNjYWxlWSA9IDEsCisgICAgICAgICAgICBzY2FsZTAxID0gMCwKKyAgICAgICAgICAgIHNjYWxlMTAgPSAwOworCisgICAgICAgIGlmIChmbGFncyAmIDB4MDgpIHsKKyAgICAgICAgICBzY2FsZVggPSBzY2FsZVkgPSAoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSAvIDEwNzM3NDE4MjQ7CisgICAgICAgICAgaSArPSAyOworICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgMHg0MCkgeworICAgICAgICAgIHNjYWxlWCA9IChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpIC8gMTA3Mzc0MTgyNDsKKyAgICAgICAgICBzY2FsZVkgPSAoY29kZVtpICsgMl0gPDwgMjQgfCBjb2RlW2kgKyAzXSA8PCAxNikgLyAxMDczNzQxODI0OworICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4ODApIHsKKyAgICAgICAgICBzY2FsZVggPSAoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSAvIDEwNzM3NDE4MjQ7CisgICAgICAgICAgc2NhbGUwMSA9IChjb2RlW2kgKyAyXSA8PCAyNCB8IGNvZGVbaSArIDNdIDw8IDE2KSAvIDEwNzM3NDE4MjQ7CisgICAgICAgICAgc2NhbGUxMCA9IChjb2RlW2kgKyA0XSA8PCAyNCB8IGNvZGVbaSArIDVdIDw8IDE2KSAvIDEwNzM3NDE4MjQ7CisgICAgICAgICAgc2NhbGVZID0gKGNvZGVbaSArIDZdIDw8IDI0IHwgY29kZVtpICsgN10gPDwgMTYpIC8gMTA3Mzc0MTgyNDsKKyAgICAgICAgICBpICs9IDg7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3ViZ2x5cGggPSBmb250LmdseXBoc1tnbHlwaEluZGV4XTsKKworICAgICAgICBpZiAoc3ViZ2x5cGgpIHsKKyAgICAgICAgICBjbWRzLnB1c2goeworICAgICAgICAgICAgY21kOiAic2F2ZSIKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBjbWRzLnB1c2goeworICAgICAgICAgICAgY21kOiAidHJhbnNmb3JtIiwKKyAgICAgICAgICAgIGFyZ3M6IFtzY2FsZVgsIHNjYWxlMDEsIHNjYWxlMTAsIHNjYWxlWSwgeCwgeV0KKyAgICAgICAgICB9KTsKKyAgICAgICAgICBjb21waWxlR2x5ZihzdWJnbHlwaCwgY21kcywgZm9udCk7CisgICAgICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgICAgIGNtZDogInJlc3RvcmUiCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGZsYWdzICYgMHgyMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBlbmRQdHNPZkNvbnRvdXJzID0gW107CisgICAgICB2YXIgaiwgamo7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZkNvbnRvdXJzOyBqKyspIHsKKyAgICAgICAgZW5kUHRzT2ZDb250b3Vycy5wdXNoKGNvZGVbaV0gPDwgOCB8IGNvZGVbaSArIDFdKTsKKyAgICAgICAgaSArPSAyOworICAgICAgfQorCisgICAgICB2YXIgaW5zdHJ1Y3Rpb25MZW5ndGggPSBjb2RlW2ldIDw8IDggfCBjb2RlW2kgKyAxXTsKKyAgICAgIGkgKz0gMiArIGluc3RydWN0aW9uTGVuZ3RoOworICAgICAgdmFyIG51bWJlck9mUG9pbnRzID0gZW5kUHRzT2ZDb250b3Vyc1tlbmRQdHNPZkNvbnRvdXJzLmxlbmd0aCAtIDFdICsgMTsKKyAgICAgIHZhciBwb2ludHMgPSBbXTsKKworICAgICAgd2hpbGUgKHBvaW50cy5sZW5ndGggPCBudW1iZXJPZlBvaW50cykgeworICAgICAgICBmbGFncyA9IGNvZGVbaSsrXTsKKyAgICAgICAgdmFyIHJlcGVhdCA9IDE7CisKKyAgICAgICAgaWYgKGZsYWdzICYgMHgwOCkgeworICAgICAgICAgIHJlcGVhdCArPSBjb2RlW2krK107CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSB7CisgICAgICAgICAgcG9pbnRzLnB1c2goeworICAgICAgICAgICAgZmxhZ3MKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZQb2ludHM7IGorKykgeworICAgICAgICBzd2l0Y2ggKHBvaW50c1tqXS5mbGFncyAmIDB4MTIpIHsKKyAgICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICB4ICs9IChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpID4+IDE2OworICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICB4IC09IGNvZGVbaSsrXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDEyOgorICAgICAgICAgICAgeCArPSBjb2RlW2krK107CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBvaW50c1tqXS54ID0geDsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKKyAgICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDI0KSB7CisgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgeSArPSAoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSA+PiAxNjsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDA0OgorICAgICAgICAgICAgeSAtPSBjb2RlW2krK107CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHgyNDoKKyAgICAgICAgICAgIHkgKz0gY29kZVtpKytdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwb2ludHNbal0ueSA9IHk7CisgICAgICB9CisKKyAgICAgIHZhciBzdGFydFBvaW50ID0gMDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgeworICAgICAgICB2YXIgZW5kUG9pbnQgPSBlbmRQdHNPZkNvbnRvdXJzW2ldOworICAgICAgICB2YXIgY29udG91ciA9IHBvaW50cy5zbGljZShzdGFydFBvaW50LCBlbmRQb2ludCArIDEpOworCisgICAgICAgIGlmIChjb250b3VyWzBdLmZsYWdzICYgMSkgeworICAgICAgICAgIGNvbnRvdXIucHVzaChjb250b3VyWzBdKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0uZmxhZ3MgJiAxKSB7CisgICAgICAgICAgY29udG91ci51bnNoaWZ0KGNvbnRvdXJbY29udG91ci5sZW5ndGggLSAxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIHAgPSB7CisgICAgICAgICAgICBmbGFnczogMSwKKyAgICAgICAgICAgIHg6IChjb250b3VyWzBdLnggKyBjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0ueCkgLyAyLAorICAgICAgICAgICAgeTogKGNvbnRvdXJbMF0ueSArIGNvbnRvdXJbY29udG91ci5sZW5ndGggLSAxXS55KSAvIDIKKyAgICAgICAgICB9OworICAgICAgICAgIGNvbnRvdXIudW5zaGlmdChwKTsKKyAgICAgICAgICBjb250b3VyLnB1c2gocCk7CisgICAgICAgIH0KKworICAgICAgICBtb3ZlVG8oY29udG91clswXS54LCBjb250b3VyWzBdLnkpOworCisgICAgICAgIGZvciAoaiA9IDEsIGpqID0gY29udG91ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgaWYgKGNvbnRvdXJbal0uZmxhZ3MgJiAxKSB7CisgICAgICAgICAgICBsaW5lVG8oY29udG91cltqXS54LCBjb250b3VyW2pdLnkpOworICAgICAgICAgIH0gZWxzZSBpZiAoY29udG91cltqICsgMV0uZmxhZ3MgJiAxKSB7CisgICAgICAgICAgICBxdWFkcmF0aWNDdXJ2ZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55LCBjb250b3VyW2ogKyAxXS54LCBjb250b3VyW2ogKyAxXS55KTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVhZHJhdGljQ3VydmVUbyhjb250b3VyW2pdLngsIGNvbnRvdXJbal0ueSwgKGNvbnRvdXJbal0ueCArIGNvbnRvdXJbaiArIDFdLngpIC8gMiwgKGNvbnRvdXJbal0ueSArIGNvbnRvdXJbaiArIDFdLnkpIC8gMik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhcnRQb2ludCA9IGVuZFBvaW50ICsgMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21waWxlQ2hhclN0cmluZyhjaGFyU3RyaW5nQ29kZSwgY21kcywgZm9udCwgZ2x5cGhJZCkgeworICAgIGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJtb3ZlVG8iLAorICAgICAgICBhcmdzOiBbeCwgeV0KKyAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJsaW5lVG8iLAorICAgICAgICBhcmdzOiBbeCwgeV0KKyAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIGJlemllckN1cnZlVG8oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsKKyAgICAgIGNtZHMucHVzaCh7CisgICAgICAgIGNtZDogImJlemllckN1cnZlVG8iLAorICAgICAgICBhcmdzOiBbeDEsIHkxLCB4MiwgeTIsIHgsIHldCisgICAgICB9KTsKKyAgICB9CisKKyAgICB2YXIgc3RhY2sgPSBbXTsKKyAgICB2YXIgeCA9IDAsCisgICAgICAgIHkgPSAwOworICAgIHZhciBzdGVtcyA9IDA7CisKKyAgICBmdW5jdGlvbiBwYXJzZShjb2RlKSB7CisgICAgICB2YXIgaSA9IDA7CisKKyAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHsKKyAgICAgICAgdmFyIHN0YWNrQ2xlYW4gPSBmYWxzZTsKKyAgICAgICAgdmFyIHYgPSBjb2RlW2krK107CisgICAgICAgIHZhciB4YSwgeGIsIHlhLCB5YiwgeTEsIHkyLCB5Mywgbiwgc3VickNvZGU7CisKKyAgICAgICAgc3dpdGNoICh2KSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgeSArPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIG1vdmVUbyh4LCB5KTsKKyAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworCisgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworCisgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN1YnJDb2RlID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGZvbnQuaXNDRkZDSURGb250KSB7CisgICAgICAgICAgICAgIGNvbnN0IGZkSW5kZXggPSBmb250LmZkU2VsZWN0LmdldEZESW5kZXgoZ2x5cGhJZCk7CisKKyAgICAgICAgICAgICAgaWYgKGZkSW5kZXggPj0gMCAmJiBmZEluZGV4IDwgZm9udC5mZEFycmF5Lmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGZvbnREaWN0ID0gZm9udC5mZEFycmF5W2ZkSW5kZXhdOworICAgICAgICAgICAgICAgIGxldCBzdWJyczsKKworICAgICAgICAgICAgICAgIGlmIChmb250RGljdC5wcml2YXRlRGljdCAmJiBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4KSB7CisgICAgICAgICAgICAgICAgICBzdWJycyA9IGZvbnREaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgub2JqZWN0czsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3VicnMpIHsKKyAgICAgICAgICAgICAgICAgIG4gKz0gZ2V0U3Vicm91dGluZUJpYXMoc3VicnMpOworICAgICAgICAgICAgICAgICAgc3VickNvZGUgPSBzdWJyc1tuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3VickNvZGUgPSBmb250LnN1YnJzW24gKyBmb250LnN1YnJzQmlhc107CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdWJyQ29kZSkgeworICAgICAgICAgICAgICBwYXJzZShzdWJyQ29kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB2ID0gY29kZVtpKytdOworCisgICAgICAgICAgICBzd2l0Y2ggKHYpIHsKKyAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHkxID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5LCB4YiwgeTEsIHgsIHkxKTsKKyAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeTEsIHhiLCB5LCB4LCB5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDM1OgorICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5MiA9IHkxICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkxLCB4YiwgeTIsIHgsIHkyKTsKKyAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHkzID0geTIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeTIsIHhiLCB5MywgeCwgeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICB2YXIgeDAgPSB4LAorICAgICAgICAgICAgICAgICAgICB5MCA9IHk7CisgICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeCA9IHhiOworICAgICAgICAgICAgICAgIHkgPSB5YjsKKworICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyh4IC0geDApID4gTWF0aC5hYnMoeSAtIHkwKSkgeworICAgICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYHVua25vd24gb3BlcmF0b3I6IDEyICR7dn1gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+PSA0KSB7CisgICAgICAgICAgICAgIHZhciBhY2hhciA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB2YXIgYmNoYXIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgeSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB4ID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgICAgICAgY21kOiAic2F2ZSIKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgICAgICAgY21kOiAidHJhbnNsYXRlIiwKKyAgICAgICAgICAgICAgICBhcmdzOiBbeCwgeV0KKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIHZhciBjbWFwID0gbG9va3VwQ21hcChmb250LmNtYXAsIFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nbHlwaE5hbWVNYXBbX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nW2FjaGFyXV0pKTsKKyAgICAgICAgICAgICAgY29tcGlsZUNoYXJTdHJpbmcoZm9udC5nbHlwaHNbY21hcC5nbHlwaElkXSwgY21kcywgZm9udCwgY21hcC5nbHlwaElkKTsKKyAgICAgICAgICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgICAgICAgICBjbWQ6ICJyZXN0b3JlIgorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW19lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZ1tiY2hhcl1dKSk7CisgICAgICAgICAgICAgIGNvbXBpbGVDaGFyU3RyaW5nKGZvbnQuZ2x5cGhzW2NtYXAuZ2x5cGhJZF0sIGNtZHMsIGZvbnQsIGNtYXAuZ2x5cGhJZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKKyAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CisgICAgICAgICAgICBpICs9IHN0ZW1zICsgNyA+PiAzOworICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKKyAgICAgICAgICAgIGkgKz0gc3RlbXMgKyA3ID4+IDM7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgIHkgKz0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbW92ZVRvKHgsIHkpOworICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbW92ZVRvKHgsIHkpOworICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKKyAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDIpIHsKKyAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgbGluZVRvKHgsIHkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDYpIHsKKyAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggJSAyKSB7CisgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgeGEgPSB4OworICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHggPSB4YjsKKyAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggJSAyKSB7CisgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWEgPSB5OworICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgPSB5YjsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgIHN0YWNrLnB1c2goKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNikgPj4gMTYpOworICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgbiA9IHN0YWNrLnBvcCgpICsgZm9udC5nc3VicnNCaWFzOworICAgICAgICAgICAgc3VickNvZGUgPSBmb250LmdzdWJyc1tuXTsKKworICAgICAgICAgICAgaWYgKHN1YnJDb2RlKSB7CisgICAgICAgICAgICAgIHBhcnNlKHN1YnJDb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgeGEgPSB4OworICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CisgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworCisgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHlhID0geTsKKyAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4ID0geGIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOworICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWEgPSB5OworICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHggPSB4YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CisgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworCisgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHhhID0geDsKKyAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5ID0geWIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOworICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHYgPCAzMikgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYHVua25vd24gb3BlcmF0b3I6ICR7dn1gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHYgPCAyNDcpIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaCh2IC0gMTM5KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1MSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKCh2IC0gMjQ3KSAqIDI1NiArIGNvZGVbaSsrXSArIDEwOCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPCAyNTUpIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaCgtKHYgLSAyNTEpICogMjU2IC0gY29kZVtpKytdIC0gMTA4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNiB8IGNvZGVbaSArIDJdIDw8IDggfCBjb2RlW2kgKyAzXSkgLyA2NTUzNik7CisgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhY2tDbGVhbikgeworICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwYXJzZShjaGFyU3RyaW5nQ29kZSk7CisgIH0KKworICBjb25zdCBOT09QID0gW107CisKKyAgY2xhc3MgQ29tcGlsZWRGb250IHsKKyAgICBjb25zdHJ1Y3Rvcihmb250TWF0cml4KSB7CisgICAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQ29tcGlsZWRGb250KSB7CisgICAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIENvbXBpbGVkRm9udC4iKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKKyAgICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB9CisKKyAgICBnZXRQYXRoSnModW5pY29kZSkgeworICAgICAgY29uc3QgY21hcCA9IGxvb2t1cENtYXAodGhpcy5jbWFwLCB1bmljb2RlKTsKKyAgICAgIGxldCBmbiA9IHRoaXMuY29tcGlsZWRHbHlwaHNbY21hcC5nbHlwaElkXTsKKworICAgICAgaWYgKCFmbikgeworICAgICAgICBmbiA9IHRoaXMuY29tcGlsZUdseXBoKHRoaXMuZ2x5cGhzW2NtYXAuZ2x5cGhJZF0sIGNtYXAuZ2x5cGhJZCk7CisgICAgICAgIHRoaXMuY29tcGlsZWRHbHlwaHNbY21hcC5nbHlwaElkXSA9IGZuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NtYXAuY2hhckNvZGVdID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NtYXAuY2hhckNvZGVdID0gY21hcC5nbHlwaElkOworICAgICAgfQorCisgICAgICByZXR1cm4gZm47CisgICAgfQorCisgICAgY29tcGlsZUdseXBoKGNvZGUsIGdseXBoSWQpIHsKKyAgICAgIGlmICghY29kZSB8fCBjb2RlLmxlbmd0aCA9PT0gMCB8fCBjb2RlWzBdID09PSAxNCkgeworICAgICAgICByZXR1cm4gTk9PUDsKKyAgICAgIH0KKworICAgICAgbGV0IGZvbnRNYXRyaXggPSB0aGlzLmZvbnRNYXRyaXg7CisKKyAgICAgIGlmICh0aGlzLmlzQ0ZGQ0lERm9udCkgeworICAgICAgICBjb25zdCBmZEluZGV4ID0gdGhpcy5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOworCisgICAgICAgIGlmIChmZEluZGV4ID49IDAgJiYgZmRJbmRleCA8IHRoaXMuZmRBcnJheS5sZW5ndGgpIHsKKyAgICAgICAgICBjb25zdCBmb250RGljdCA9IHRoaXMuZmRBcnJheVtmZEluZGV4XTsKKyAgICAgICAgICBmb250TWF0cml4ID0gZm9udERpY3QuZ2V0QnlOYW1lKCJGb250TWF0cml4IikgfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb25zdCBjbWRzID0gW107CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJzYXZlIgorICAgICAgfSk7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJ0cmFuc2Zvcm0iLAorICAgICAgICBhcmdzOiBmb250TWF0cml4LnNsaWNlKCkKKyAgICAgIH0pOworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAic2NhbGUiLAorICAgICAgICBhcmdzOiBbInNpemUiLCAiLXNpemUiXQorICAgICAgfSk7CisgICAgICB0aGlzLmNvbXBpbGVHbHlwaEltcGwoY29kZSwgY21kcywgZ2x5cGhJZCk7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJyZXN0b3JlIgorICAgICAgfSk7CisgICAgICByZXR1cm4gY21kczsKKyAgICB9CisKKyAgICBjb21waWxlR2x5cGhJbXBsKCkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2hpbGRyZW4gY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMuIik7CisgICAgfQorCisgICAgaGFzQnVpbHRQYXRoKHVuaWNvZGUpIHsKKyAgICAgIGNvbnN0IGNtYXAgPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CisgICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjbWFwLmdseXBoSWRdICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NtYXAuY2hhckNvZGVdICE9PSB1bmRlZmluZWQ7CisgICAgfQorCisgIH0KKworICBjbGFzcyBUcnVlVHlwZUNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHsKKyAgICBjb25zdHJ1Y3RvcihnbHlwaHMsIGNtYXAsIGZvbnRNYXRyaXgpIHsKKyAgICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAwNDg4LCAwLCAwLCAwLjAwMDQ4OCwgMCwgMF0pOworICAgICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7CisgICAgICB0aGlzLmNtYXAgPSBjbWFwOworICAgIH0KKworICAgIGNvbXBpbGVHbHlwaEltcGwoY29kZSwgY21kcykgeworICAgICAgY29tcGlsZUdseWYoY29kZSwgY21kcywgdGhpcyk7CisgICAgfQorCisgIH0KKworICBjbGFzcyBUeXBlMkNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHsKKyAgICBjb25zdHJ1Y3RvcihjZmZJbmZvLCBjbWFwLCBmb250TWF0cml4LCBnbHlwaE5hbWVNYXApIHsKKyAgICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF0pOworICAgICAgdGhpcy5nbHlwaHMgPSBjZmZJbmZvLmdseXBoczsKKyAgICAgIHRoaXMuZ3N1YnJzID0gY2ZmSW5mby5nc3VicnMgfHwgW107CisgICAgICB0aGlzLnN1YnJzID0gY2ZmSW5mby5zdWJycyB8fCBbXTsKKyAgICAgIHRoaXMuY21hcCA9IGNtYXA7CisgICAgICB0aGlzLmdseXBoTmFtZU1hcCA9IGdseXBoTmFtZU1hcCB8fCAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOworICAgICAgdGhpcy5nc3VicnNCaWFzID0gZ2V0U3Vicm91dGluZUJpYXModGhpcy5nc3VicnMpOworICAgICAgdGhpcy5zdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyh0aGlzLnN1YnJzKTsKKyAgICAgIHRoaXMuaXNDRkZDSURGb250ID0gY2ZmSW5mby5pc0NGRkNJREZvbnQ7CisgICAgICB0aGlzLmZkU2VsZWN0ID0gY2ZmSW5mby5mZFNlbGVjdDsKKyAgICAgIHRoaXMuZmRBcnJheSA9IGNmZkluZm8uZmRBcnJheTsKKyAgICB9CisKKyAgICBjb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMsIGdseXBoSWQpIHsKKyAgICAgIGNvbXBpbGVDaGFyU3RyaW5nKGNvZGUsIGNtZHMsIHRoaXMsIGdseXBoSWQpOworICAgIH0KKworICB9CisKKyAgcmV0dXJuIHsKKyAgICBjcmVhdGU6IGZ1bmN0aW9uIEZvbnRSZW5kZXJlckZhY3RvcnlfY3JlYXRlKGZvbnQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKKyAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZm9udC5kYXRhKTsKKyAgICAgIHZhciBjbWFwLCBnbHlmLCBsb2NhLCBjZmYsIGluZGV4VG9Mb2NGb3JtYXQsIHVuaXRzUGVyRW07CisgICAgICB2YXIgbnVtVGFibGVzID0gZ2V0VXNob3J0KGRhdGEsIDQpOworCisgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IDEyOyBpIDwgbnVtVGFibGVzOyBpKyssIHAgKz0gMTYpIHsKKyAgICAgICAgdmFyIHRhZyA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShkYXRhLnN1YmFycmF5KHAsIHAgKyA0KSk7CisgICAgICAgIHZhciBvZmZzZXQgPSBnZXRMb25nKGRhdGEsIHAgKyA4KTsKKyAgICAgICAgdmFyIGxlbmd0aCA9IGdldExvbmcoZGF0YSwgcCArIDEyKTsKKworICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgIGNhc2UgImNtYXAiOgorICAgICAgICAgICAgY21hcCA9IHBhcnNlQ21hcChkYXRhLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImdseWYiOgorICAgICAgICAgICAgZ2x5ZiA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJsb2NhIjoKKyAgICAgICAgICAgIGxvY2EgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiaGVhZCI6CisgICAgICAgICAgICB1bml0c1BlckVtID0gZ2V0VXNob3J0KGRhdGEsIG9mZnNldCArIDE4KTsKKyAgICAgICAgICAgIGluZGV4VG9Mb2NGb3JtYXQgPSBnZXRVc2hvcnQoZGF0YSwgb2Zmc2V0ICsgNTApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJDRkYgIjoKKyAgICAgICAgICAgIGNmZiA9IHBhcnNlQ2ZmKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChnbHlmKSB7CisgICAgICAgIHZhciBmb250TWF0cml4ID0gIXVuaXRzUGVyRW0gPyBmb250LmZvbnRNYXRyaXggOiBbMSAvIHVuaXRzUGVyRW0sIDAsIDAsIDEgLyB1bml0c1BlckVtLCAwLCAwXTsKKyAgICAgICAgcmV0dXJuIG5ldyBUcnVlVHlwZUNvbXBpbGVkKHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGluZGV4VG9Mb2NGb3JtYXQpLCBjbWFwLCBmb250TWF0cml4KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBUeXBlMkNvbXBpbGVkKGNmZiwgY21hcCwgZm9udC5mb250TWF0cml4LCBmb250LmdseXBoTmFtZU1hcCk7CisgICAgfQorICB9OworfSgpOworCitleHBvcnRzLkZvbnRSZW5kZXJlckZhY3RvcnkgPSBGb250UmVuZGVyZXJGYWN0b3J5OworCisvKioqLyB9KSwKKy8qIDM4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuVHlwZTFQYXJzZXIgPSB2b2lkIDA7CisKK3ZhciBfZW5jb2RpbmdzID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBISU5USU5HX0VOQUJMRUQgPSBmYWxzZTsKKwordmFyIFR5cGUxQ2hhclN0cmluZyA9IGZ1bmN0aW9uIFR5cGUxQ2hhclN0cmluZ0Nsb3N1cmUoKSB7CisgIHZhciBDT01NQU5EX01BUCA9IHsKKyAgICBoc3RlbTogWzFdLAorICAgIHZzdGVtOiBbM10sCisgICAgdm1vdmV0bzogWzRdLAorICAgIHJsaW5ldG86IFs1XSwKKyAgICBobGluZXRvOiBbNl0sCisgICAgdmxpbmV0bzogWzddLAorICAgIHJyY3VydmV0bzogWzhdLAorICAgIGNhbGxzdWJyOiBbMTBdLAorICAgIGZsZXg6IFsxMiwgMzVdLAorICAgIGRyb3A6IFsxMiwgMThdLAorICAgIGVuZGNoYXI6IFsxNF0sCisgICAgcm1vdmV0bzogWzIxXSwKKyAgICBobW92ZXRvOiBbMjJdLAorICAgIHZoY3VydmV0bzogWzMwXSwKKyAgICBodmN1cnZldG86IFszMV0KKyAgfTsKKworICBmdW5jdGlvbiBUeXBlMUNoYXJTdHJpbmcoKSB7CisgICAgdGhpcy53aWR0aCA9IDA7CisgICAgdGhpcy5sc2IgPSAwOworICAgIHRoaXMuZmxleGluZyA9IGZhbHNlOworICAgIHRoaXMub3V0cHV0ID0gW107CisgICAgdGhpcy5zdGFjayA9IFtdOworICB9CisKKyAgVHlwZTFDaGFyU3RyaW5nLnByb3RvdHlwZSA9IHsKKyAgICBjb252ZXJ0OiBmdW5jdGlvbiBUeXBlMUNoYXJTdHJpbmdfY29udmVydChlbmNvZGVkLCBzdWJycywgc2VhY0FuYWx5c2lzRW5hYmxlZCkgeworICAgICAgdmFyIGNvdW50ID0gZW5jb2RlZC5sZW5ndGg7CisgICAgICB2YXIgZXJyb3IgPSBmYWxzZTsKKyAgICAgIHZhciB3eCwgc2J4LCBzdWJyTnVtYmVyOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdmFyIHZhbHVlID0gZW5jb2RlZFtpXTsKKworICAgICAgICBpZiAodmFsdWUgPCAzMikgeworICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHsKKyAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpICsgZW5jb2RlZFsrK2ldOworICAgICAgICAgIH0KKworICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaHN0ZW0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICBpZiAoIUhJTlRJTkdfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC52c3RlbSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgZHkgPSB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCgwLCBkeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAudm1vdmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybGluZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEsIENPTU1BTkRfTUFQLmhsaW5ldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAudmxpbmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg2LCBDT01NQU5EX01BUC5ycmN1cnZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgICAgaWYgKCFzdWJyc1tzdWJyTnVtYmVyXSkgeworICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5jb252ZXJ0KHN1YnJzW3N1YnJOdW1iZXJdLCBzdWJycywgc2VhY0FuYWx5c2lzRW5hYmxlZCk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB3eCA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHNieCA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHRoaXMubHNiID0gc2J4OworICAgICAgICAgICAgICB0aGlzLndpZHRoID0gd3g7CisgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh3eCwgc2J4KTsKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLmhtb3ZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaChDT01NQU5EX01BUC5lbmRjaGFyWzBdKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybW92ZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAuaG1vdmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNCwgQ09NTUFORF9NQVAudmhjdXJ2ZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5odmN1cnZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAwOgorICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE6CisgICAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMjoKKyAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaHN0ZW0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA2OgorICAgICAgICAgICAgICBpZiAoc2VhY0FuYWx5c2lzRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGFzYiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSA1XTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlYWMgPSB0aGlzLnN0YWNrLnNwbGljZSgtNCwgNCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZWFjWzBdICs9IHRoaXMubHNiIC0gYXNiOworICAgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgwLCBDT01NQU5EX01BUC5lbmRjaGFyKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNCwgQ09NTUFORF9NQVAuZW5kY2hhcik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA3OgorICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCA0KSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgd3ggPSB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB2YXIgc2J5ID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7CisgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDsKKyAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngsIHNieSk7CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgzLCBDT01NQU5EX01BUC5ybW92ZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMTI6CisgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgbnVtMiA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHZhciBudW0xID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKG51bTEgLyBudW0yKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMTY6CisgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdWJyTnVtYmVyID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgdmFyIG51bUFyZ3MgPSB0aGlzLnN0YWNrLnBvcCgpOworCisgICAgICAgICAgICAgIGlmIChzdWJyTnVtYmVyID09PSAwICYmIG51bUFyZ3MgPT09IDMpIHsKKyAgICAgICAgICAgICAgICB2YXIgZmxleEFyZ3MgPSB0aGlzLnN0YWNrLnNwbGljZSh0aGlzLnN0YWNrLmxlbmd0aCAtIDE3LCAxNyk7CisgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGZsZXhBcmdzWzJdICsgZmxleEFyZ3NbMF0sIGZsZXhBcmdzWzNdICsgZmxleEFyZ3NbMV0sIGZsZXhBcmdzWzRdLCBmbGV4QXJnc1s1XSwgZmxleEFyZ3NbNl0sIGZsZXhBcmdzWzddLCBmbGV4QXJnc1s4XSwgZmxleEFyZ3NbOV0sIGZsZXhBcmdzWzEwXSwgZmxleEFyZ3NbMTFdLCBmbGV4QXJnc1sxMl0sIGZsZXhBcmdzWzEzXSwgZmxleEFyZ3NbMTRdKTsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMTMsIENPTU1BTkRfTUFQLmZsZXgsIHRydWUpOworICAgICAgICAgICAgICAgIHRoaXMuZmxleGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmbGV4QXJnc1sxNV0sIGZsZXhBcmdzWzE2XSk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Vick51bWJlciA9PT0gMSAmJiBudW1BcmdzID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mbGV4aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE3OgorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAzMzoKKyAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgIicgKyB2YWx1ZSArICciJyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjQ2KSB7CisgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAtIDEzOTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAyNTApIHsKKyAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIDI0NykgKiAyNTYgKyBlbmNvZGVkWysraV0gKyAxMDg7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjU0KSB7CisgICAgICAgICAgdmFsdWUgPSAtKCh2YWx1ZSAtIDI1MSkgKiAyNTYpIC0gZW5jb2RlZFsrK2ldIC0gMTA4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhbHVlID0gKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDI0IHwgKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDE2IHwgKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDggfCAoZW5jb2RlZFsrK2ldICYgMHhmZikgPDwgMDsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuc3RhY2sucHVzaCh2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9LAorCisgICAgZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykgeworICAgICAgdmFyIHN0YWNrTGVuZ3RoID0gdGhpcy5zdGFjay5sZW5ndGg7CisKKyAgICAgIGlmIChob3dNYW55QXJncyA+IHN0YWNrTGVuZ3RoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICB2YXIgc3RhcnQgPSBzdGFja0xlbmd0aCAtIGhvd01hbnlBcmdzOworCisgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBzdGFja0xlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc3RhY2tbaV07CisKKyAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CisgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaCgyOCwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFsdWUgPSA2NTUzNiAqIHZhbHVlIHwgMDsKKyAgICAgICAgICB0aGlzLm91dHB1dC5wdXNoKDI1NSwgdmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMub3V0cHV0LnB1c2guYXBwbHkodGhpcy5vdXRwdXQsIGNvbW1hbmQpOworCisgICAgICBpZiAoa2VlcFN0YWNrKSB7CisgICAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgfTsKKyAgcmV0dXJuIFR5cGUxQ2hhclN0cmluZzsKK30oKTsKKwordmFyIFR5cGUxUGFyc2VyID0gZnVuY3Rpb24gVHlwZTFQYXJzZXJDbG9zdXJlKCkgeworICB2YXIgRUVYRUNfRU5DUllQVF9LRVkgPSA1NTY2NTsKKyAgdmFyIENIQVJfU1RSU19FTkNSWVBUX0tFWSA9IDQzMzA7CisKKyAgZnVuY3Rpb24gaXNIZXhEaWdpdChjb2RlKSB7CisgICAgcmV0dXJuIGNvZGUgPj0gNDggJiYgY29kZSA8PSA1NyB8fCBjb2RlID49IDY1ICYmIGNvZGUgPD0gNzAgfHwgY29kZSA+PSA5NyAmJiBjb2RlIDw9IDEwMjsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY3J5cHQoZGF0YSwga2V5LCBkaXNjYXJkTnVtYmVyKSB7CisgICAgaWYgKGRpc2NhcmROdW1iZXIgPj0gZGF0YS5sZW5ndGgpIHsKKyAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKKyAgICB9CisKKyAgICB2YXIgciA9IGtleSB8IDAsCisgICAgICAgIGMxID0gNTI4NDUsCisgICAgICAgIGMyID0gMjI3MTksCisgICAgICAgIGksCisgICAgICAgIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGlzY2FyZE51bWJlcjsgaSsrKSB7CisgICAgICByID0gKGRhdGFbaV0gKyByKSAqIGMxICsgYzIgJiAoMSA8PCAxNikgLSAxOworICAgIH0KKworICAgIHZhciBjb3VudCA9IGRhdGEubGVuZ3RoIC0gZGlzY2FyZE51bWJlcjsKKyAgICB2YXIgZGVjcnlwdGVkID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpOworCisgICAgZm9yIChpID0gZGlzY2FyZE51bWJlciwgaiA9IDA7IGogPCBjb3VudDsgaSsrLCBqKyspIHsKKyAgICAgIHZhciB2YWx1ZSA9IGRhdGFbaV07CisgICAgICBkZWNyeXB0ZWRbal0gPSB2YWx1ZSBeIHIgPj4gODsKKyAgICAgIHIgPSAodmFsdWUgKyByKSAqIGMxICsgYzIgJiAoMSA8PCAxNikgLSAxOworICAgIH0KKworICAgIHJldHVybiBkZWNyeXB0ZWQ7CisgIH0KKworICBmdW5jdGlvbiBkZWNyeXB0QXNjaWkoZGF0YSwga2V5LCBkaXNjYXJkTnVtYmVyKSB7CisgICAgdmFyIHIgPSBrZXkgfCAwLAorICAgICAgICBjMSA9IDUyODQ1LAorICAgICAgICBjMiA9IDIyNzE5OworICAgIHZhciBjb3VudCA9IGRhdGEubGVuZ3RoLAorICAgICAgICBtYXliZUxlbmd0aCA9IGNvdW50ID4+PiAxOworICAgIHZhciBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShtYXliZUxlbmd0aCk7CisgICAgdmFyIGksIGo7CisKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIHZhciBkaWdpdDEgPSBkYXRhW2ldOworCisgICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQxKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaSsrOworICAgICAgdmFyIGRpZ2l0MjsKKworICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAhaXNIZXhEaWdpdChkaWdpdDIgPSBkYXRhW2ldKSkgeworICAgICAgICBpKys7CisgICAgICB9CisKKyAgICAgIGlmIChpIDwgY291bnQpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZShkaWdpdDEsIGRpZ2l0MiksIDE2KTsKKyAgICAgICAgZGVjcnlwdGVkW2orK10gPSB2YWx1ZSBeIHIgPj4gODsKKyAgICAgICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRlY3J5cHRlZC5zbGljZShkaXNjYXJkTnVtYmVyLCBqKTsKKyAgfQorCisgIGZ1bmN0aW9uIGlzU3BlY2lhbChjKSB7CisgICAgcmV0dXJuIGMgPT09IDB4MmYgfHwgYyA9PT0gMHg1YiB8fCBjID09PSAweDVkIHx8IGMgPT09IDB4N2IgfHwgYyA9PT0gMHg3ZCB8fCBjID09PSAweDI4IHx8IGMgPT09IDB4Mjk7CisgIH0KKworICBmdW5jdGlvbiBUeXBlMVBhcnNlcihzdHJlYW0sIGVuY3J5cHRlZCwgc2VhY0FuYWx5c2lzRW5hYmxlZCkgeworICAgIGlmIChlbmNyeXB0ZWQpIHsKKyAgICAgIHZhciBkYXRhID0gc3RyZWFtLmdldEJ5dGVzKCk7CisgICAgICB2YXIgaXNCaW5hcnkgPSAhKChpc0hleERpZ2l0KGRhdGFbMF0pIHx8ICgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGRhdGFbMF0pKSAmJiBpc0hleERpZ2l0KGRhdGFbMV0pICYmIGlzSGV4RGlnaXQoZGF0YVsyXSkgJiYgaXNIZXhEaWdpdChkYXRhWzNdKSAmJiBpc0hleERpZ2l0KGRhdGFbNF0pICYmIGlzSGV4RGlnaXQoZGF0YVs1XSkgJiYgaXNIZXhEaWdpdChkYXRhWzZdKSAmJiBpc0hleERpZ2l0KGRhdGFbN10pKTsKKyAgICAgIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmVhbShpc0JpbmFyeSA/IGRlY3J5cHQoZGF0YSwgRUVYRUNfRU5DUllQVF9LRVksIDQpIDogZGVjcnlwdEFzY2lpKGRhdGEsIEVFWEVDX0VOQ1JZUFRfS0VZLCA0KSk7CisgICAgfQorCisgICAgdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkID0gISFzZWFjQW5hbHlzaXNFbmFibGVkOworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMubmV4dENoYXIoKTsKKyAgfQorCisgIFR5cGUxUGFyc2VyLnByb3RvdHlwZSA9IHsKKyAgICByZWFkTnVtYmVyQXJyYXk6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWROdW1iZXJBcnJheSgpIHsKKyAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgIHZhciBhcnJheSA9IFtdOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgaWYgKHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSAiXSIgfHwgdG9rZW4gPT09ICJ9IikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXJyYXkucHVzaChwYXJzZUZsb2F0KHRva2VuIHx8IDApKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGFycmF5OworICAgIH0sCisgICAgcmVhZE51bWJlcjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZE51bWJlcigpIHsKKyAgICAgIHZhciB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRva2VuIHx8IDApOworICAgIH0sCisgICAgcmVhZEludDogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZEludCgpIHsKKyAgICAgIHZhciB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgIHJldHVybiBwYXJzZUludCh0b2tlbiB8fCAwLCAxMCkgfCAwOworICAgIH0sCisgICAgcmVhZEJvb2xlYW46IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWRCb29sZWFuKCkgeworICAgICAgdmFyIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworICAgICAgcmV0dXJuIHRva2VuID09PSAidHJ1ZSIgPyAxIDogMDsKKyAgICB9LAorICAgIG5leHRDaGFyOiBmdW5jdGlvbiBUeXBlMV9uZXh0Q2hhcigpIHsKKyAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICAgIH0sCisgICAgZ2V0VG9rZW46IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX2dldFRva2VuKCkgeworICAgICAgdmFyIGNvbW1lbnQgPSBmYWxzZTsKKyAgICAgIHZhciBjaCA9IHRoaXMuY3VycmVudENoYXI7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChjaCA9PT0gLTEpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb21tZW50KSB7CisgICAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CisgICAgICAgICAgICBjb21tZW50ID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CisgICAgICAgICAgY29tbWVudCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoISgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGNoKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICB9CisKKyAgICAgIGlmIChpc1NwZWNpYWwoY2gpKSB7CisgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOworICAgICAgfQorCisgICAgICB2YXIgdG9rZW4gPSAiIjsKKworICAgICAgZG8geworICAgICAgICB0b2tlbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICB9IHdoaWxlIChjaCA+PSAwICYmICEoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjaCkgJiYgIWlzU3BlY2lhbChjaCkpOworCisgICAgICByZXR1cm4gdG9rZW47CisgICAgfSwKKyAgICByZWFkQ2hhclN0cmluZ3M6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWRDaGFyU3RyaW5ncyhieXRlcywgbGVuSVYpIHsKKyAgICAgIGlmIChsZW5JViA9PT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgICAgfQorCisgICAgICByZXR1cm4gZGVjcnlwdChieXRlcywgQ0hBUl9TVFJTX0VOQ1JZUFRfS0VZLCBsZW5JVik7CisgICAgfSwKKyAgICBleHRyYWN0Rm9udFByb2dyYW06IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX2V4dHJhY3RGb250UHJvZ3JhbShwcm9wZXJ0aWVzKSB7CisgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07CisgICAgICB2YXIgc3VicnMgPSBbXSwKKyAgICAgICAgICBjaGFyc3RyaW5ncyA9IFtdOworICAgICAgdmFyIHByaXZhdGVEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIHByaXZhdGVEYXRhLmxlbklWID0gNDsKKyAgICAgIHZhciBwcm9ncmFtID0geworICAgICAgICBzdWJyczogW10sCisgICAgICAgIGNoYXJzdHJpbmdzOiBbXSwKKyAgICAgICAgcHJvcGVydGllczogeworICAgICAgICAgIHByaXZhdGVEYXRhCisgICAgICAgIH0KKyAgICAgIH07CisgICAgICB2YXIgdG9rZW4sIGxlbmd0aCwgZGF0YSwgbGVuSVYsIGVuY29kZWQ7CisKKyAgICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmdldFRva2VuKCkpICE9PSBudWxsKSB7CisgICAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CisgICAgICAgICAgY2FzZSAiQ2hhclN0cmluZ3MiOgorICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09ICJlbmQiKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAodG9rZW4gIT09ICIvIikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIGdseXBoID0gdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICBsZW5ndGggPSB0aGlzLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICBkYXRhID0gbGVuZ3RoID4gMCA/IHN0cmVhbS5nZXRCeXRlcyhsZW5ndGgpIDogbmV3IFVpbnQ4QXJyYXkoMCk7CisgICAgICAgICAgICAgIGxlbklWID0gcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhLmxlbklWOworICAgICAgICAgICAgICBlbmNvZGVkID0gdGhpcy5yZWFkQ2hhclN0cmluZ3MoZGF0YSwgbGVuSVYpOworICAgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgeworICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNoYXJzdHJpbmdzLnB1c2goeworICAgICAgICAgICAgICAgIGdseXBoLAorICAgICAgICAgICAgICAgIGVuY29kZWQKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiU3VicnMiOgorICAgICAgICAgICAgdGhpcy5yZWFkSW50KCk7CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgIHdoaWxlICh0aGlzLmdldFRva2VuKCkgPT09ICJkdXAiKSB7CisgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CisgICAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOworICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKKyAgICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CisgICAgICAgICAgICAgIGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CisgICAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgICAgaWYgKHRva2VuID09PSAibm9hY2Nlc3MiKSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3VicnNbaW5kZXhdID0gZW5jb2RlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJCbHVlVmFsdWVzIjoKKyAgICAgICAgICBjYXNlICJPdGhlckJsdWVzIjoKKyAgICAgICAgICBjYXNlICJGYW1pbHlCbHVlcyI6CisgICAgICAgICAgY2FzZSAiRmFtaWx5T3RoZXJCbHVlcyI6CisgICAgICAgICAgICB2YXIgYmx1ZUFycmF5ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKKworICAgICAgICAgICAgaWYgKGJsdWVBcnJheS5sZW5ndGggPiAwICYmIGJsdWVBcnJheS5sZW5ndGggJSAyID09PSAwICYmIEhJTlRJTkdfRU5BQkxFRCkgeworICAgICAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gYmx1ZUFycmF5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlN0ZW1TbmFwSCI6CisgICAgICAgICAgY2FzZSAiU3RlbVNuYXBWIjoKKyAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJTdGRIVyI6CisgICAgICAgICAgY2FzZSAiU3RkVlciOgorICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlckFycmF5KClbMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkJsdWVTaGlmdCI6CisgICAgICAgICAgY2FzZSAibGVuSVYiOgorICAgICAgICAgIGNhc2UgIkJsdWVGdXp6IjoKKyAgICAgICAgICBjYXNlICJCbHVlU2NhbGUiOgorICAgICAgICAgIGNhc2UgIkxhbmd1YWdlR3JvdXAiOgorICAgICAgICAgIGNhc2UgIkV4cGFuc2lvbkZhY3RvciI6CisgICAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkTnVtYmVyKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkZvcmNlQm9sZCI6CisgICAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkQm9vbGVhbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFyc3RyaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICBnbHlwaCA9IGNoYXJzdHJpbmdzW2ldLmdseXBoOworICAgICAgICBlbmNvZGVkID0gY2hhcnN0cmluZ3NbaV0uZW5jb2RlZDsKKyAgICAgICAgdmFyIGNoYXJTdHJpbmcgPSBuZXcgVHlwZTFDaGFyU3RyaW5nKCk7CisgICAgICAgIHZhciBlcnJvciA9IGNoYXJTdHJpbmcuY29udmVydChlbmNvZGVkLCBzdWJycywgdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKTsKKyAgICAgICAgdmFyIG91dHB1dCA9IGNoYXJTdHJpbmcub3V0cHV0OworCisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgIG91dHB1dCA9IFsxNF07CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyU3RyaW5nT2JqZWN0ID0geworICAgICAgICAgIGdseXBoTmFtZTogZ2x5cGgsCisgICAgICAgICAgY2hhcnN0cmluZzogb3V0cHV0LAorICAgICAgICAgIHdpZHRoOiBjaGFyU3RyaW5nLndpZHRoLAorICAgICAgICAgIGxzYjogY2hhclN0cmluZy5sc2IsCisgICAgICAgICAgc2VhYzogY2hhclN0cmluZy5zZWFjCisgICAgICAgIH07CisKKyAgICAgICAgaWYgKGdseXBoID09PSAiLm5vdGRlZiIpIHsKKyAgICAgICAgICBwcm9ncmFtLmNoYXJzdHJpbmdzLnVuc2hpZnQoY2hhclN0cmluZ09iamVjdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJvZ3JhbS5jaGFyc3RyaW5ncy5wdXNoKGNoYXJTdHJpbmdPYmplY3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7CisgICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZy5pbmRleE9mKGdseXBoKTsKKworICAgICAgICAgIGlmIChpbmRleCA+IC0xICYmIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9PT0gdW5kZWZpbmVkICYmIGluZGV4ID49IHByb3BlcnRpZXMuZmlyc3RDaGFyICYmIGluZGV4IDw9IHByb3BlcnRpZXMubGFzdENoYXIpIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9IGNoYXJTdHJpbmcud2lkdGg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBwcm9ncmFtOworICAgIH0sCisgICAgZXh0cmFjdEZvbnRIZWFkZXI6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX2V4dHJhY3RGb250SGVhZGVyKHByb3BlcnRpZXMpIHsKKyAgICAgIHZhciB0b2tlbjsKKworICAgICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKKyAgICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgICBjYXNlICJGb250TWF0cml4IjoKKyAgICAgICAgICAgIHZhciBtYXRyaXggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOworICAgICAgICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gbWF0cml4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJFbmNvZGluZyI6CisgICAgICAgICAgICB2YXIgZW5jb2RpbmdBcmcgPSB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICB2YXIgZW5jb2Rpbmc7CisKKyAgICAgICAgICAgIGlmICghL15cZCskLy50ZXN0KGVuY29kaW5nQXJnKSkgeworICAgICAgICAgICAgICBlbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShlbmNvZGluZ0FyZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlbmNvZGluZyA9IFtdOworICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHBhcnNlSW50KGVuY29kaW5nQXJnLCAxMCkgfCAwOworICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbiAhPT0gImR1cCIgJiYgdG9rZW4gIT09ICJkZWYiKSB7CisgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09ICJkZWYiKSB7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgICAgdmFyIGdseXBoID0gdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGdseXBoOworICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJGb250QkJveCI6CisgICAgICAgICAgICB2YXIgZm9udEJCb3ggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOworICAgICAgICAgICAgcHJvcGVydGllcy5hc2NlbnQgPSBNYXRoLm1heChmb250QkJveFszXSwgZm9udEJCb3hbMV0pOworICAgICAgICAgICAgcHJvcGVydGllcy5kZXNjZW50ID0gTWF0aC5taW4oZm9udEJCb3hbMV0sIGZvbnRCQm94WzNdKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuYXNjZW50U2NhbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworICByZXR1cm4gVHlwZTFQYXJzZXI7Cit9KCk7CisKK2V4cG9ydHMuVHlwZTFQYXJzZXIgPSBUeXBlMVBhcnNlcjsKKworLyoqKi8gfSksCisvKiAzOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldFRpbGluZ1BhdHRlcm5JUiA9IGdldFRpbGluZ1BhdHRlcm5JUjsKK2V4cG9ydHMuUGF0dGVybiA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9jb2xvcnNwYWNlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBTaGFkaW5nVHlwZSA9IHsKKyAgRlVOQ1RJT05fQkFTRUQ6IDEsCisgIEFYSUFMOiAyLAorICBSQURJQUw6IDMsCisgIEZSRUVfRk9STV9NRVNIOiA0LAorICBMQVRUSUNFX0ZPUk1fTUVTSDogNSwKKyAgQ09PTlNfUEFUQ0hfTUVTSDogNiwKKyAgVEVOU09SX1BBVENIX01FU0g6IDcKK307CisKK3ZhciBQYXR0ZXJuID0gZnVuY3Rpb24gUGF0dGVybkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFBhdHRlcm4oKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIFBhdHRlcm4gY29uc3RydWN0b3IiKTsKKyAgfQorCisgIFBhdHRlcm4ucHJvdG90eXBlID0geworICAgIGdldFBhdHRlcm46IGZ1bmN0aW9uIFBhdHRlcm5fZ2V0UGF0dGVybihjdHgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoYFNob3VsZCBub3QgY2FsbCBQYXR0ZXJuLmdldFN0eWxlOiAke2N0eH1gKTsKKyAgICB9CisgIH07CisKKyAgUGF0dGVybi5wYXJzZVNoYWRpbmcgPSBmdW5jdGlvbiAoc2hhZGluZywgbWF0cml4LCB4cmVmLCByZXMsIGhhbmRsZXIsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKKyAgICB2YXIgZGljdCA9ICgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoc2hhZGluZykgPyBzaGFkaW5nLmRpY3QgOiBzaGFkaW5nOworICAgIHZhciB0eXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CisKKyAgICB0cnkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQVhJQUw6CisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuUkFESUFMOgorICAgICAgICAgIHJldHVybiBuZXcgU2hhZGluZ3MuUmFkaWFsQXhpYWwoZGljdCwgbWF0cml4LCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6CisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6CisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDoKKyAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDoKKyAgICAgICAgICByZXR1cm4gbmV3IFNoYWRpbmdzLk1lc2goc2hhZGluZywgbWF0cml4LCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbnN1cHBvcnRlZCBTaGFkaW5nVHlwZTogIiArIHR5cGUpOworICAgICAgfQorICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuc2hhZGluZ1BhdHRlcm4KKyAgICAgIH0pOworICAgICAgKDAsIF91dGlsLndhcm4pKGV4KTsKKyAgICAgIHJldHVybiBuZXcgU2hhZGluZ3MuRHVtbXkoKTsKKyAgICB9CisgIH07CisKKyAgcmV0dXJuIFBhdHRlcm47Cit9KCk7CisKK2V4cG9ydHMuUGF0dGVybiA9IFBhdHRlcm47Cit2YXIgU2hhZGluZ3MgPSB7fTsKK1NoYWRpbmdzLlNNQUxMX05VTUJFUiA9IDFlLTY7CisKK1NoYWRpbmdzLlJhZGlhbEF4aWFsID0gZnVuY3Rpb24gUmFkaWFsQXhpYWxDbG9zdXJlKCkgeworICBmdW5jdGlvbiBSYWRpYWxBeGlhbChkaWN0LCBtYXRyaXgsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIHRoaXMubWF0cml4ID0gbWF0cml4OworICAgIHRoaXMuY29vcmRzQXJyID0gZGljdC5nZXRBcnJheSgiQ29vcmRzIik7CisgICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KCJTaGFkaW5nVHlwZSIpOworICAgIHRoaXMudHlwZSA9ICJQYXR0ZXJuIjsKKworICAgIGNvbnN0IGNzID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICBjczogZGljdC5nZXRSYXcoIkNvbG9yU3BhY2UiKSB8fCBkaWN0LmdldFJhdygiQ1MiKSwKKyAgICAgIHhyZWYsCisgICAgICByZXNvdXJjZXMsCisgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgIH0pOworCisgICAgdGhpcy5jcyA9IGNzOworICAgIGNvbnN0IGJib3ggPSBkaWN0LmdldEFycmF5KCJCQm94Iik7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShiYm94KSAmJiBiYm94Lmxlbmd0aCA9PT0gNCkgeworICAgICAgdGhpcy5iYm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KGJib3gpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmJib3ggPSBudWxsOworICAgIH0KKworICAgIHZhciB0MCA9IDAuMCwKKyAgICAgICAgdDEgPSAxLjA7CisKKyAgICBpZiAoZGljdC5oYXMoIkRvbWFpbiIpKSB7CisgICAgICB2YXIgZG9tYWluQXJyID0gZGljdC5nZXRBcnJheSgiRG9tYWluIik7CisgICAgICB0MCA9IGRvbWFpbkFyclswXTsKKyAgICAgIHQxID0gZG9tYWluQXJyWzFdOworICAgIH0KKworICAgIHZhciBleHRlbmRTdGFydCA9IGZhbHNlLAorICAgICAgICBleHRlbmRFbmQgPSBmYWxzZTsKKworICAgIGlmIChkaWN0LmhhcygiRXh0ZW5kIikpIHsKKyAgICAgIHZhciBleHRlbmRBcnIgPSBkaWN0LmdldEFycmF5KCJFeHRlbmQiKTsKKyAgICAgIGV4dGVuZFN0YXJ0ID0gZXh0ZW5kQXJyWzBdOworICAgICAgZXh0ZW5kRW5kID0gZXh0ZW5kQXJyWzFdOworICAgIH0KKworICAgIGlmICh0aGlzLnNoYWRpbmdUeXBlID09PSBTaGFkaW5nVHlwZS5SQURJQUwgJiYgKCFleHRlbmRTdGFydCB8fCAhZXh0ZW5kRW5kKSkgeworICAgICAgdmFyIHgxID0gdGhpcy5jb29yZHNBcnJbMF07CisgICAgICB2YXIgeTEgPSB0aGlzLmNvb3Jkc0FyclsxXTsKKyAgICAgIHZhciByMSA9IHRoaXMuY29vcmRzQXJyWzJdOworICAgICAgdmFyIHgyID0gdGhpcy5jb29yZHNBcnJbM107CisgICAgICB2YXIgeTIgPSB0aGlzLmNvb3Jkc0Fycls0XTsKKyAgICAgIHZhciByMiA9IHRoaXMuY29vcmRzQXJyWzVdOworICAgICAgdmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KCh4MSAtIHgyKSAqICh4MSAtIHgyKSArICh5MSAtIHkyKSAqICh5MSAtIHkyKSk7CisKKyAgICAgIGlmIChyMSA8PSByMiArIGRpc3RhbmNlICYmIHIyIDw9IHIxICsgZGlzdGFuY2UpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnN1cHBvcnRlZCByYWRpYWwgZ3JhZGllbnQuIik7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5leHRlbmRTdGFydCA9IGV4dGVuZFN0YXJ0OworICAgIHRoaXMuZXh0ZW5kRW5kID0gZXh0ZW5kRW5kOworICAgIHZhciBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOworICAgIHZhciBmbiA9IHBkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGVGcm9tQXJyYXkoZm5PYmopOworICAgIGNvbnN0IE5VTUJFUl9PRl9TQU1QTEVTID0gMTA7CisgICAgY29uc3Qgc3RlcCA9ICh0MSAtIHQwKSAvIE5VTUJFUl9PRl9TQU1QTEVTOworICAgIHZhciBjb2xvclN0b3BzID0gdGhpcy5jb2xvclN0b3BzID0gW107CisKKyAgICBpZiAodDAgPj0gdDEgfHwgc3RlcCA8PSAwKSB7CisgICAgICAoMCwgX3V0aWwuaW5mbykoIkJhZCBzaGFkaW5nIGRvbWFpbi4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgY29sb3IgPSBuZXcgRmxvYXQzMkFycmF5KGNzLm51bUNvbXBzKSwKKyAgICAgICAgcmF0aW8gPSBuZXcgRmxvYXQzMkFycmF5KDEpOworICAgIHZhciByZ2JDb2xvcjsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE5VTUJFUl9PRl9TQU1QTEVTOyBpKyspIHsKKyAgICAgIHJhdGlvWzBdID0gdDAgKyBpICogc3RlcDsKKyAgICAgIGZuKHJhdGlvLCAwLCBjb2xvciwgMCk7CisgICAgICByZ2JDb2xvciA9IGNzLmdldFJnYihjb2xvciwgMCk7CisKKyAgICAgIHZhciBjc3NDb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyZ2JDb2xvclswXSwgcmdiQ29sb3JbMV0sIHJnYkNvbG9yWzJdKTsKKworICAgICAgY29sb3JTdG9wcy5wdXNoKFtpIC8gTlVNQkVSX09GX1NBTVBMRVMsIGNzc0NvbG9yXSk7CisgICAgfQorCisgICAgdmFyIGJhY2tncm91bmQgPSAidHJhbnNwYXJlbnQiOworCisgICAgaWYgKGRpY3QuaGFzKCJCYWNrZ3JvdW5kIikpIHsKKyAgICAgIHJnYkNvbG9yID0gY3MuZ2V0UmdiKGRpY3QuZ2V0KCJCYWNrZ3JvdW5kIiksIDApOworICAgICAgYmFja2dyb3VuZCA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyZ2JDb2xvclswXSwgcmdiQ29sb3JbMV0sIHJnYkNvbG9yWzJdKTsKKyAgICB9CisKKyAgICBpZiAoIWV4dGVuZFN0YXJ0KSB7CisgICAgICBjb2xvclN0b3BzLnVuc2hpZnQoWzAsIGJhY2tncm91bmRdKTsKKyAgICAgIGNvbG9yU3RvcHNbMV1bMF0gKz0gU2hhZGluZ3MuU01BTExfTlVNQkVSOworICAgIH0KKworICAgIGlmICghZXh0ZW5kRW5kKSB7CisgICAgICBjb2xvclN0b3BzW2NvbG9yU3RvcHMubGVuZ3RoIC0gMV1bMF0gLT0gU2hhZGluZ3MuU01BTExfTlVNQkVSOworICAgICAgY29sb3JTdG9wcy5wdXNoKFsxLCBiYWNrZ3JvdW5kXSk7CisgICAgfQorCisgICAgdGhpcy5jb2xvclN0b3BzID0gY29sb3JTdG9wczsKKyAgfQorCisgIFJhZGlhbEF4aWFsLnByb3RvdHlwZSA9IHsKKyAgICBnZXRJUjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZ2V0SVIoKSB7CisgICAgICB2YXIgY29vcmRzQXJyID0gdGhpcy5jb29yZHNBcnI7CisgICAgICB2YXIgc2hhZGluZ1R5cGUgPSB0aGlzLnNoYWRpbmdUeXBlOworICAgICAgdmFyIHR5cGUsIHAwLCBwMSwgcjAsIHIxOworCisgICAgICBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLkFYSUFMKSB7CisgICAgICAgIHAwID0gW2Nvb3Jkc0FyclswXSwgY29vcmRzQXJyWzFdXTsKKyAgICAgICAgcDEgPSBbY29vcmRzQXJyWzJdLCBjb29yZHNBcnJbM11dOworICAgICAgICByMCA9IG51bGw7CisgICAgICAgIHIxID0gbnVsbDsKKyAgICAgICAgdHlwZSA9ICJheGlhbCI7CisgICAgICB9IGVsc2UgaWYgKHNoYWRpbmdUeXBlID09PSBTaGFkaW5nVHlwZS5SQURJQUwpIHsKKyAgICAgICAgcDAgPSBbY29vcmRzQXJyWzBdLCBjb29yZHNBcnJbMV1dOworICAgICAgICBwMSA9IFtjb29yZHNBcnJbM10sIGNvb3Jkc0Fycls0XV07CisgICAgICAgIHIwID0gY29vcmRzQXJyWzJdOworICAgICAgICByMSA9IGNvb3Jkc0Fycls1XTsKKyAgICAgICAgdHlwZSA9ICJyYWRpYWwiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShgZ2V0UGF0dGVybiB0eXBlIHVua25vd246ICR7c2hhZGluZ1R5cGV9YCk7CisgICAgICB9CisKKyAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDsKKworICAgICAgaWYgKG1hdHJpeCkgeworICAgICAgICBwMCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0ocDAsIG1hdHJpeCk7CisgICAgICAgIHAxID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShwMSwgbWF0cml4KTsKKworICAgICAgICBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkgeworICAgICAgICAgIHZhciBzY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobWF0cml4KTsKKworICAgICAgICAgIHIwICo9IHNjYWxlWzBdOworICAgICAgICAgIHIxICo9IHNjYWxlWzFdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBbIlJhZGlhbEF4aWFsIiwgdHlwZSwgdGhpcy5iYm94LCB0aGlzLmNvbG9yU3RvcHMsIHAwLCBwMSwgcjAsIHIxXTsKKyAgICB9CisgIH07CisgIHJldHVybiBSYWRpYWxBeGlhbDsKK30oKTsKKworU2hhZGluZ3MuTWVzaCA9IGZ1bmN0aW9uIE1lc2hDbG9zdXJlKCkgeworICBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyKHN0cmVhbSwgY29udGV4dCkgeworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgdGhpcy5idWZmZXIgPSAwOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKKyAgICB2YXIgbnVtQ29tcHMgPSBjb250ZXh0Lm51bUNvbXBzOworICAgIHRoaXMudG1wQ29tcHNCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUNvbXBzKTsKKyAgICB2YXIgY3NOdW1Db21wcyA9IGNvbnRleHQuY29sb3JTcGFjZS5udW1Db21wczsKKyAgICB0aGlzLnRtcENzQ29tcHNCdWYgPSBjb250ZXh0LmNvbG9yRm4gPyBuZXcgRmxvYXQzMkFycmF5KGNzTnVtQ29tcHMpIDogdGhpcy50bXBDb21wc0J1ZjsKKyAgfQorCisgIE1lc2hTdHJlYW1SZWFkZXIucHJvdG90eXBlID0geworICAgIGdldCBoYXNEYXRhKCkgeworICAgICAgaWYgKHRoaXMuc3RyZWFtLmVuZCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucG9zIDwgdGhpcy5zdHJlYW0uZW5kOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5idWZmZXJMZW5ndGggPiAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICB2YXIgbmV4dEJ5dGUgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CisKKyAgICAgIGlmIChuZXh0Qnl0ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB0aGlzLmJ1ZmZlciA9IG5leHRCeXRlOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSA4OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIHJlYWRCaXRzOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRCaXRzKG4pIHsKKyAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKKyAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKworICAgICAgaWYgKG4gPT09IDMyKSB7CisgICAgICAgIGlmIChidWZmZXJMZW5ndGggPT09IDApIHsKKyAgICAgICAgICByZXR1cm4gKHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAyNCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAxNiB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCA4IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKSA+Pj4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCAyNCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAxNiB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCA4IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICB2YXIgbmV4dEJ5dGUgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgIHRoaXMuYnVmZmVyID0gbmV4dEJ5dGUgJiAoMSA8PCBidWZmZXJMZW5ndGgpIC0gMTsKKyAgICAgICAgcmV0dXJuIChidWZmZXIgPDwgOCAtIGJ1ZmZlckxlbmd0aCB8IChuZXh0Qnl0ZSAmIDB4ZmYpID4+IGJ1ZmZlckxlbmd0aCkgPj4+IDA7CisgICAgICB9CisKKyAgICAgIGlmIChuID09PSA4ICYmIGJ1ZmZlckxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgfQorCisgICAgICB3aGlsZSAoYnVmZmVyTGVuZ3RoIDwgbikgeworICAgICAgICBidWZmZXIgPSBidWZmZXIgPDwgOCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKKyAgICAgICAgYnVmZmVyTGVuZ3RoICs9IDg7CisgICAgICB9CisKKyAgICAgIGJ1ZmZlckxlbmd0aCAtPSBuOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciAmICgxIDw8IGJ1ZmZlckxlbmd0aCkgLSAxOworICAgICAgcmV0dXJuIGJ1ZmZlciA+PiBidWZmZXJMZW5ndGg7CisgICAgfSwKKyAgICBhbGlnbjogZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9hbGlnbigpIHsKKyAgICAgIHRoaXMuYnVmZmVyID0gMDsKKyAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKKyAgICB9LAorICAgIHJlYWRGbGFnOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRGbGFnKCkgeworICAgICAgcmV0dXJuIHRoaXMucmVhZEJpdHModGhpcy5jb250ZXh0LmJpdHNQZXJGbGFnKTsKKyAgICB9LAorICAgIHJlYWRDb29yZGluYXRlOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRDb29yZGluYXRlKCkgeworICAgICAgdmFyIGJpdHNQZXJDb29yZGluYXRlID0gdGhpcy5jb250ZXh0LmJpdHNQZXJDb29yZGluYXRlOworICAgICAgdmFyIHhpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29vcmRpbmF0ZSk7CisgICAgICB2YXIgeWkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTsKKyAgICAgIHZhciBkZWNvZGUgPSB0aGlzLmNvbnRleHQuZGVjb2RlOworICAgICAgdmFyIHNjYWxlID0gYml0c1BlckNvb3JkaW5hdGUgPCAzMiA/IDEgLyAoKDEgPDwgYml0c1BlckNvb3JkaW5hdGUpIC0gMSkgOiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOworICAgICAgcmV0dXJuIFt4aSAqIHNjYWxlICogKGRlY29kZVsxXSAtIGRlY29kZVswXSkgKyBkZWNvZGVbMF0sIHlpICogc2NhbGUgKiAoZGVjb2RlWzNdIC0gZGVjb2RlWzJdKSArIGRlY29kZVsyXV07CisgICAgfSwKKyAgICByZWFkQ29tcG9uZW50czogZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9yZWFkQ29tcG9uZW50cygpIHsKKyAgICAgIHZhciBudW1Db21wcyA9IHRoaXMuY29udGV4dC5udW1Db21wczsKKyAgICAgIHZhciBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5jb250ZXh0LmJpdHNQZXJDb21wb25lbnQ7CisgICAgICB2YXIgc2NhbGUgPSBiaXRzUGVyQ29tcG9uZW50IDwgMzIgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb21wb25lbnQpIC0gMSkgOiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOworICAgICAgdmFyIGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7CisgICAgICB2YXIgY29tcG9uZW50cyA9IHRoaXMudG1wQ29tcHNCdWY7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gNDsgaSA8IG51bUNvbXBzOyBpKyssIGogKz0gMikgeworICAgICAgICB2YXIgY2kgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb21wb25lbnQpOworICAgICAgICBjb21wb25lbnRzW2ldID0gY2kgKiBzY2FsZSAqIChkZWNvZGVbaiArIDFdIC0gZGVjb2RlW2pdKSArIGRlY29kZVtqXTsKKyAgICAgIH0KKworICAgICAgdmFyIGNvbG9yID0gdGhpcy50bXBDc0NvbXBzQnVmOworCisgICAgICBpZiAodGhpcy5jb250ZXh0LmNvbG9yRm4pIHsKKyAgICAgICAgdGhpcy5jb250ZXh0LmNvbG9yRm4oY29tcG9uZW50cywgMCwgY29sb3IsIDApOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbG9yU3BhY2UuZ2V0UmdiKGNvbG9yLCAwKTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZGVjb2RlVHlwZTRTaGFkaW5nKG1lc2gsIHJlYWRlcikgeworICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkczsKKyAgICB2YXIgY29sb3JzID0gbWVzaC5jb2xvcnM7CisgICAgdmFyIG9wZXJhdG9ycyA9IFtdOworICAgIHZhciBwcyA9IFtdOworICAgIHZhciB2ZXJ0aWNlc0xlZnQgPSAwOworCisgICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CisgICAgICB2YXIgZiA9IHJlYWRlci5yZWFkRmxhZygpOworICAgICAgdmFyIGNvb3JkID0gcmVhZGVyLnJlYWRDb29yZGluYXRlKCk7CisgICAgICB2YXIgY29sb3IgPSByZWFkZXIucmVhZENvbXBvbmVudHMoKTsKKworICAgICAgaWYgKHZlcnRpY2VzTGVmdCA9PT0gMCkgeworICAgICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAyKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNCBmbGFnIik7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGYpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwcy5wdXNoKHBzW3BzLmxlbmd0aCAtIDJdLCBwc1twcy5sZW5ndGggLSAxXSk7CisgICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwcy5wdXNoKHBzW3BzLmxlbmd0aCAtIDNdLCBwc1twcy5sZW5ndGggLSAxXSk7CisgICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvcGVyYXRvcnMucHVzaChmKTsKKyAgICAgIH0KKworICAgICAgcHMucHVzaChjb29yZHMubGVuZ3RoKTsKKyAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKKyAgICAgIGNvbG9ycy5wdXNoKGNvbG9yKTsKKyAgICAgIHZlcnRpY2VzTGVmdC0tOworICAgICAgcmVhZGVyLmFsaWduKCk7CisgICAgfQorCisgICAgbWVzaC5maWd1cmVzLnB1c2goeworICAgICAgdHlwZTogInRyaWFuZ2xlcyIsCisgICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKKyAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkocHMpCisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVUeXBlNVNoYWRpbmcobWVzaCwgcmVhZGVyLCB2ZXJ0aWNlc1BlclJvdykgeworICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkczsKKyAgICB2YXIgY29sb3JzID0gbWVzaC5jb2xvcnM7CisgICAgdmFyIHBzID0gW107CisKKyAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKKyAgICAgIHZhciBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpOworICAgICAgdmFyIGNvbG9yID0gcmVhZGVyLnJlYWRDb21wb25lbnRzKCk7CisgICAgICBwcy5wdXNoKGNvb3Jkcy5sZW5ndGgpOworICAgICAgY29vcmRzLnB1c2goY29vcmQpOworICAgICAgY29sb3JzLnB1c2goY29sb3IpOworICAgIH0KKworICAgIG1lc2guZmlndXJlcy5wdXNoKHsKKyAgICAgIHR5cGU6ICJsYXR0aWNlIiwKKyAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAorICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShwcyksCisgICAgICB2ZXJ0aWNlc1BlclJvdworICAgIH0pOworICB9CisKKyAgdmFyIE1JTl9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UID0gMzsKKyAgdmFyIE1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UID0gMjA7CisgIHZhciBUUklBTkdMRV9ERU5TSVRZID0gMjA7CisKKyAgdmFyIGdldEIgPSBmdW5jdGlvbiBnZXRCQ2xvc3VyZSgpIHsKKyAgICBmdW5jdGlvbiBidWlsZEIoY291bnQpIHsKKyAgICAgIHZhciBsdXQgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgeworICAgICAgICB2YXIgdCA9IGkgLyBjb3VudCwKKyAgICAgICAgICAgIHRfID0gMSAtIHQ7CisgICAgICAgIGx1dC5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoW3RfICogdF8gKiB0XywgMyAqIHQgKiB0XyAqIHRfLCAzICogdCAqIHQgKiB0XywgdCAqIHQgKiB0XSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gbHV0OworICAgIH0KKworICAgIHZhciBjYWNoZSA9IFtdOworICAgIHJldHVybiBmdW5jdGlvbiBnZXRCKGNvdW50KSB7CisgICAgICBpZiAoIWNhY2hlW2NvdW50XSkgeworICAgICAgICBjYWNoZVtjb3VudF0gPSBidWlsZEIoY291bnQpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2FjaGVbY291bnRdOworICAgIH07CisgIH0oKTsKKworICBmdW5jdGlvbiBidWlsZEZpZ3VyZUZyb21QYXRjaChtZXNoLCBpbmRleCkgeworICAgIHZhciBmaWd1cmUgPSBtZXNoLmZpZ3VyZXNbaW5kZXhdOworICAgICgwLCBfdXRpbC5hc3NlcnQpKGZpZ3VyZS50eXBlID09PSAicGF0Y2giLCAiVW5leHBlY3RlZCBwYXRjaCBtZXNoIGZpZ3VyZSIpOworICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkcywKKyAgICAgICAgY29sb3JzID0gbWVzaC5jb2xvcnM7CisgICAgdmFyIHBpID0gZmlndXJlLmNvb3JkczsKKyAgICB2YXIgY2kgPSBmaWd1cmUuY29sb3JzOworICAgIHZhciBmaWd1cmVNaW5YID0gTWF0aC5taW4oY29vcmRzW3BpWzBdXVswXSwgY29vcmRzW3BpWzNdXVswXSwgY29vcmRzW3BpWzEyXV1bMF0sIGNvb3Jkc1twaVsxNV1dWzBdKTsKKyAgICB2YXIgZmlndXJlTWluWSA9IE1hdGgubWluKGNvb3Jkc1twaVswXV1bMV0sIGNvb3Jkc1twaVszXV1bMV0sIGNvb3Jkc1twaVsxMl1dWzFdLCBjb29yZHNbcGlbMTVdXVsxXSk7CisgICAgdmFyIGZpZ3VyZU1heFggPSBNYXRoLm1heChjb29yZHNbcGlbMF1dWzBdLCBjb29yZHNbcGlbM11dWzBdLCBjb29yZHNbcGlbMTJdXVswXSwgY29vcmRzW3BpWzE1XV1bMF0pOworICAgIHZhciBmaWd1cmVNYXhZID0gTWF0aC5tYXgoY29vcmRzW3BpWzBdXVsxXSwgY29vcmRzW3BpWzNdXVsxXSwgY29vcmRzW3BpWzEyXV1bMV0sIGNvb3Jkc1twaVsxNV1dWzFdKTsKKyAgICB2YXIgc3BsaXRYQnkgPSBNYXRoLmNlaWwoKGZpZ3VyZU1heFggLSBmaWd1cmVNaW5YKSAqIFRSSUFOR0xFX0RFTlNJVFkgLyAobWVzaC5ib3VuZHNbMl0gLSBtZXNoLmJvdW5kc1swXSkpOworICAgIHNwbGl0WEJ5ID0gTWF0aC5tYXgoTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1hdGgubWluKE1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULCBzcGxpdFhCeSkpOworICAgIHZhciBzcGxpdFlCeSA9IE1hdGguY2VpbCgoZmlndXJlTWF4WSAtIGZpZ3VyZU1pblkpICogVFJJQU5HTEVfREVOU0lUWSAvIChtZXNoLmJvdW5kc1szXSAtIG1lc2guYm91bmRzWzFdKSk7CisgICAgc3BsaXRZQnkgPSBNYXRoLm1heChNSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgTWF0aC5taW4oTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIHNwbGl0WUJ5KSk7CisgICAgdmFyIHZlcnRpY2VzUGVyUm93ID0gc3BsaXRYQnkgKyAxOworICAgIHZhciBmaWd1cmVDb29yZHMgPSBuZXcgSW50MzJBcnJheSgoc3BsaXRZQnkgKyAxKSAqIHZlcnRpY2VzUGVyUm93KTsKKyAgICB2YXIgZmlndXJlQ29sb3JzID0gbmV3IEludDMyQXJyYXkoKHNwbGl0WUJ5ICsgMSkgKiB2ZXJ0aWNlc1BlclJvdyk7CisgICAgdmFyIGsgPSAwOworICAgIHZhciBjbCA9IG5ldyBVaW50OEFycmF5KDMpLAorICAgICAgICBjciA9IG5ldyBVaW50OEFycmF5KDMpOworICAgIHZhciBjMCA9IGNvbG9yc1tjaVswXV0sCisgICAgICAgIGMxID0gY29sb3JzW2NpWzFdXSwKKyAgICAgICAgYzIgPSBjb2xvcnNbY2lbMl1dLAorICAgICAgICBjMyA9IGNvbG9yc1tjaVszXV07CisgICAgdmFyIGJSb3cgPSBnZXRCKHNwbGl0WUJ5KSwKKyAgICAgICAgYkNvbCA9IGdldEIoc3BsaXRYQnkpOworCisgICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDw9IHNwbGl0WUJ5OyByb3crKykgeworICAgICAgY2xbMF0gPSAoYzBbMF0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMF0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOworICAgICAgY2xbMV0gPSAoYzBbMV0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMV0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOworICAgICAgY2xbMl0gPSAoYzBbMl0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMl0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOworICAgICAgY3JbMF0gPSAoYzFbMF0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMF0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOworICAgICAgY3JbMV0gPSAoYzFbMV0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMV0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOworICAgICAgY3JbMl0gPSAoYzFbMl0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMl0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOworCisgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPD0gc3BsaXRYQnk7IGNvbCsrLCBrKyspIHsKKyAgICAgICAgaWYgKChyb3cgPT09IDAgfHwgcm93ID09PSBzcGxpdFlCeSkgJiYgKGNvbCA9PT0gMCB8fCBjb2wgPT09IHNwbGl0WEJ5KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHggPSAwLAorICAgICAgICAgICAgeSA9IDA7CisgICAgICAgIHZhciBxID0gMDsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSAzOyBpKyspIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAzOyBqKyssIHErKykgeworICAgICAgICAgICAgdmFyIG0gPSBiUm93W3Jvd11baV0gKiBiQ29sW2NvbF1bal07CisgICAgICAgICAgICB4ICs9IGNvb3Jkc1twaVtxXV1bMF0gKiBtOworICAgICAgICAgICAgeSArPSBjb29yZHNbcGlbcV1dWzFdICogbTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaWd1cmVDb29yZHNba10gPSBjb29yZHMubGVuZ3RoOworICAgICAgICBjb29yZHMucHVzaChbeCwgeV0pOworICAgICAgICBmaWd1cmVDb2xvcnNba10gPSBjb2xvcnMubGVuZ3RoOworICAgICAgICB2YXIgbmV3Q29sb3IgPSBuZXcgVWludDhBcnJheSgzKTsKKyAgICAgICAgbmV3Q29sb3JbMF0gPSAoY2xbMF0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMF0gKiBjb2wpIC8gc3BsaXRYQnkgfCAwOworICAgICAgICBuZXdDb2xvclsxXSA9IChjbFsxXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclsxXSAqIGNvbCkgLyBzcGxpdFhCeSB8IDA7CisgICAgICAgIG5ld0NvbG9yWzJdID0gKGNsWzJdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzJdICogY29sKSAvIHNwbGl0WEJ5IHwgMDsKKyAgICAgICAgY29sb3JzLnB1c2gobmV3Q29sb3IpOworICAgICAgfQorICAgIH0KKworICAgIGZpZ3VyZUNvb3Jkc1swXSA9IHBpWzBdOworICAgIGZpZ3VyZUNvbG9yc1swXSA9IGNpWzBdOworICAgIGZpZ3VyZUNvb3Jkc1tzcGxpdFhCeV0gPSBwaVszXTsKKyAgICBmaWd1cmVDb2xvcnNbc3BsaXRYQnldID0gY2lbMV07CisgICAgZmlndXJlQ29vcmRzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gcGlbMTJdOworICAgIGZpZ3VyZUNvbG9yc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5XSA9IGNpWzJdOworICAgIGZpZ3VyZUNvb3Jkc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5ICsgc3BsaXRYQnldID0gcGlbMTVdOworICAgIGZpZ3VyZUNvbG9yc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5ICsgc3BsaXRYQnldID0gY2lbM107CisgICAgbWVzaC5maWd1cmVzW2luZGV4XSA9IHsKKyAgICAgIHR5cGU6ICJsYXR0aWNlIiwKKyAgICAgIGNvb3JkczogZmlndXJlQ29vcmRzLAorICAgICAgY29sb3JzOiBmaWd1cmVDb2xvcnMsCisgICAgICB2ZXJ0aWNlc1BlclJvdworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVUeXBlNlNoYWRpbmcobWVzaCwgcmVhZGVyKSB7CisgICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzOworICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9yczsKKyAgICB2YXIgcHMgPSBuZXcgSW50MzJBcnJheSgxNik7CisgICAgdmFyIGNzID0gbmV3IEludDMyQXJyYXkoNCk7CisKKyAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKKyAgICAgIHZhciBmID0gcmVhZGVyLnJlYWRGbGFnKCk7CisKKyAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNiBmbGFnIik7CisgICAgICB9CisKKyAgICAgIHZhciBpLCBpaTsKKyAgICAgIHZhciBwaSA9IGNvb3Jkcy5sZW5ndGg7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDggOiAxMjsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29vcmRzLnB1c2gocmVhZGVyLnJlYWRDb29yZGluYXRlKCkpOworICAgICAgfQorCisgICAgICB2YXIgY2kgPSBjb2xvcnMubGVuZ3RoOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IGYgIT09IDAgPyAyIDogNDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29sb3JzLnB1c2gocmVhZGVyLnJlYWRDb21wb25lbnRzKCkpOworICAgICAgfQorCisgICAgICB2YXIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKworICAgICAgc3dpdGNoIChmKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBwc1sxMl0gPSBwaSArIDM7CisgICAgICAgICAgcHNbMTNdID0gcGkgKyA0OworICAgICAgICAgIHBzWzE0XSA9IHBpICsgNTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDY7CisgICAgICAgICAgcHNbOF0gPSBwaSArIDI7CisgICAgICAgICAgcHNbMTFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzRdID0gcGkgKyAxOworICAgICAgICAgIHBzWzddID0gcGkgKyA4OworICAgICAgICAgIHBzWzBdID0gcGk7CisgICAgICAgICAgcHNbMV0gPSBwaSArIDExOworICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKKyAgICAgICAgICBwc1szXSA9IHBpICsgOTsKKyAgICAgICAgICBjc1syXSA9IGNpICsgMTsKKyAgICAgICAgICBjc1szXSA9IGNpICsgMjsKKyAgICAgICAgICBjc1swXSA9IGNpOworICAgICAgICAgIGNzWzFdID0gY2kgKyAzOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICB0bXAxID0gcHNbMTJdOworICAgICAgICAgIHRtcDIgPSBwc1sxM107CisgICAgICAgICAgdG1wMyA9IHBzWzE0XTsKKyAgICAgICAgICB0bXA0ID0gcHNbMTVdOworICAgICAgICAgIHBzWzEyXSA9IHRtcDQ7CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSB0bXAzOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHRtcDI7CisgICAgICAgICAgcHNbN10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMF0gPSB0bXAxOworICAgICAgICAgIHBzWzFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzJdID0gcGkgKyA2OworICAgICAgICAgIHBzWzNdID0gcGkgKyA1OworICAgICAgICAgIHRtcDEgPSBjc1syXTsKKyAgICAgICAgICB0bXAyID0gY3NbM107CisgICAgICAgICAgY3NbMl0gPSB0bXAyOworICAgICAgICAgIGNzWzNdID0gY2k7CisgICAgICAgICAgY3NbMF0gPSB0bXAxOworICAgICAgICAgIGNzWzFdID0gY2kgKyAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICB0bXAxID0gcHNbMTVdOworICAgICAgICAgIHRtcDIgPSBwc1sxMV07CisgICAgICAgICAgcHNbMTJdID0gcHNbM107CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSBwc1s3XTsKKyAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CisgICAgICAgICAgcHNbNF0gPSB0bXAyOworICAgICAgICAgIHBzWzddID0gcGkgKyA0OworICAgICAgICAgIHBzWzBdID0gdG1wMTsKKyAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKKyAgICAgICAgICBwc1syXSA9IHBpICsgNjsKKyAgICAgICAgICBwc1szXSA9IHBpICsgNTsKKyAgICAgICAgICB0bXAxID0gY3NbM107CisgICAgICAgICAgY3NbMl0gPSBjc1sxXTsKKyAgICAgICAgICBjc1szXSA9IGNpOworICAgICAgICAgIGNzWzBdID0gdG1wMTsKKyAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgcHNbMTJdID0gcHNbMF07CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSBwc1sxXTsKKyAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CisgICAgICAgICAgcHNbNF0gPSBwc1syXTsKKyAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKKyAgICAgICAgICBwc1swXSA9IHBzWzNdOworICAgICAgICAgIHBzWzFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzJdID0gcGkgKyA2OworICAgICAgICAgIHBzWzNdID0gcGkgKyA1OworICAgICAgICAgIGNzWzJdID0gY3NbMF07CisgICAgICAgICAgY3NbM10gPSBjaTsKKyAgICAgICAgICBjc1swXSA9IGNzWzFdOworICAgICAgICAgIGNzWzFdID0gY2kgKyAxOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwc1s1XSA9IGNvb3Jkcy5sZW5ndGg7CisgICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzBdXVswXSAtIGNvb3Jkc1twc1sxNV1dWzBdICsgNiAqIChjb29yZHNbcHNbNF1dWzBdICsgY29vcmRzW3BzWzFdXVswXSkgLSAyICogKGNvb3Jkc1twc1sxMl1dWzBdICsgY29vcmRzW3BzWzNdXVswXSkgKyAzICogKGNvb3Jkc1twc1sxM11dWzBdICsgY29vcmRzW3BzWzddXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzBdXVsxXSAtIGNvb3Jkc1twc1sxNV1dWzFdICsgNiAqIChjb29yZHNbcHNbNF1dWzFdICsgY29vcmRzW3BzWzFdXVsxXSkgLSAyICogKGNvb3Jkc1twc1sxMl1dWzFdICsgY29vcmRzW3BzWzNdXVsxXSkgKyAzICogKGNvb3Jkc1twc1sxM11dWzFdICsgY29vcmRzW3BzWzddXVsxXSkpIC8gOV0pOworICAgICAgcHNbNl0gPSBjb29yZHMubGVuZ3RoOworICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1szXV1bMF0gLSBjb29yZHNbcHNbMTJdXVswXSArIDYgKiAoY29vcmRzW3BzWzJdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzBdICsgY29vcmRzW3BzWzE1XV1bMF0pICsgMyAqIChjb29yZHNbcHNbNF1dWzBdICsgY29vcmRzW3BzWzE0XV1bMF0pKSAvIDksICgtNCAqIGNvb3Jkc1twc1szXV1bMV0gLSBjb29yZHNbcHNbMTJdXVsxXSArIDYgKiAoY29vcmRzW3BzWzJdXVsxXSArIGNvb3Jkc1twc1s3XV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICsgMyAqIChjb29yZHNbcHNbNF1dWzFdICsgY29vcmRzW3BzWzE0XV1bMV0pKSAvIDldKTsKKyAgICAgIHBzWzldID0gY29vcmRzLmxlbmd0aDsKKyAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMTJdXVswXSAtIGNvb3Jkc1twc1szXV1bMF0gKyA2ICogKGNvb3Jkc1twc1s4XV1bMF0gKyBjb29yZHNbcHNbMTNdXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1sxMV1dWzBdICsgY29vcmRzW3BzWzFdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzEyXV1bMV0gLSBjb29yZHNbcHNbM11dWzFdICsgNiAqIChjb29yZHNbcHNbOF1dWzFdICsgY29vcmRzW3BzWzEzXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTFdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pKSAvIDldKTsKKyAgICAgIHBzWzEwXSA9IGNvb3Jkcy5sZW5ndGg7CisgICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzE1XV1bMF0gLSBjb29yZHNbcHNbMF1dWzBdICsgNiAqIChjb29yZHNbcHNbMTFdXVswXSArIGNvb3Jkc1twc1sxNF1dWzBdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMF0gKyBjb29yZHNbcHNbM11dWzBdKSArIDMgKiAoY29vcmRzW3BzWzJdXVswXSArIGNvb3Jkc1twc1s4XV1bMF0pKSAvIDksICgtNCAqIGNvb3Jkc1twc1sxNV1dWzFdIC0gY29vcmRzW3BzWzBdXVsxXSArIDYgKiAoY29vcmRzW3BzWzExXV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkgLSAyICogKGNvb3Jkc1twc1sxMl1dWzFdICsgY29vcmRzW3BzWzNdXVsxXSkgKyAzICogKGNvb3Jkc1twc1syXV1bMV0gKyBjb29yZHNbcHNbOF1dWzFdKSkgLyA5XSk7CisgICAgICBtZXNoLmZpZ3VyZXMucHVzaCh7CisgICAgICAgIHR5cGU6ICJwYXRjaCIsCisgICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAorICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlVHlwZTdTaGFkaW5nKG1lc2gsIHJlYWRlcikgeworICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkczsKKyAgICB2YXIgY29sb3JzID0gbWVzaC5jb2xvcnM7CisgICAgdmFyIHBzID0gbmV3IEludDMyQXJyYXkoMTYpOworICAgIHZhciBjcyA9IG5ldyBJbnQzMkFycmF5KDQpOworCisgICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CisgICAgICB2YXIgZiA9IHJlYWRlci5yZWFkRmxhZygpOworCisgICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAzKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZTcgZmxhZyIpOworICAgICAgfQorCisgICAgICB2YXIgaSwgaWk7CisgICAgICB2YXIgcGkgPSBjb29yZHMubGVuZ3RoOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IGYgIT09IDAgPyAxMiA6IDE2OyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7CisgICAgICB9CisKKyAgICAgIHZhciBjaSA9IGNvbG9ycy5sZW5ndGg7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb2xvcnMucHVzaChyZWFkZXIucmVhZENvbXBvbmVudHMoKSk7CisgICAgICB9CisKKyAgICAgIHZhciB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgICBzd2l0Y2ggKGYpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHBzWzEyXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyA1OworICAgICAgICAgIHBzWzE1XSA9IHBpICsgNjsKKyAgICAgICAgICBwc1s4XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1s5XSA9IHBpICsgMTM7CisgICAgICAgICAgcHNbMTBdID0gcGkgKyAxNDsKKyAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CisgICAgICAgICAgcHNbNF0gPSBwaSArIDE7CisgICAgICAgICAgcHNbNV0gPSBwaSArIDEyOworICAgICAgICAgIHBzWzZdID0gcGkgKyAxNTsKKyAgICAgICAgICBwc1s3XSA9IHBpICsgODsKKyAgICAgICAgICBwc1swXSA9IHBpOworICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKKyAgICAgICAgICBwc1syXSA9IHBpICsgMTA7CisgICAgICAgICAgcHNbM10gPSBwaSArIDk7CisgICAgICAgICAgY3NbMl0gPSBjaSArIDE7CisgICAgICAgICAgY3NbM10gPSBjaSArIDI7CisgICAgICAgICAgY3NbMF0gPSBjaTsKKyAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgdG1wMSA9IHBzWzEyXTsKKyAgICAgICAgICB0bXAyID0gcHNbMTNdOworICAgICAgICAgIHRtcDMgPSBwc1sxNF07CisgICAgICAgICAgdG1wNCA9IHBzWzE1XTsKKyAgICAgICAgICBwc1sxMl0gPSB0bXA0OworICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKKyAgICAgICAgICBwc1sxNF0gPSBwaSArIDE7CisgICAgICAgICAgcHNbMTVdID0gcGkgKyAyOworICAgICAgICAgIHBzWzhdID0gdG1wMzsKKyAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKKyAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHRtcDI7CisgICAgICAgICAgcHNbNV0gPSBwaSArIDg7CisgICAgICAgICAgcHNbNl0gPSBwaSArIDExOworICAgICAgICAgIHBzWzddID0gcGkgKyA0OworICAgICAgICAgIHBzWzBdID0gdG1wMTsKKyAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKKyAgICAgICAgICBwc1syXSA9IHBpICsgNjsKKyAgICAgICAgICBwc1szXSA9IHBpICsgNTsKKyAgICAgICAgICB0bXAxID0gY3NbMl07CisgICAgICAgICAgdG1wMiA9IGNzWzNdOworICAgICAgICAgIGNzWzJdID0gdG1wMjsKKyAgICAgICAgICBjc1szXSA9IGNpOworICAgICAgICAgIGNzWzBdID0gdG1wMTsKKyAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgdG1wMSA9IHBzWzE1XTsKKyAgICAgICAgICB0bXAyID0gcHNbMTFdOworICAgICAgICAgIHBzWzEyXSA9IHBzWzNdOworICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKKyAgICAgICAgICBwc1sxNF0gPSBwaSArIDE7CisgICAgICAgICAgcHNbMTVdID0gcGkgKyAyOworICAgICAgICAgIHBzWzhdID0gcHNbN107CisgICAgICAgICAgcHNbOV0gPSBwaSArIDk7CisgICAgICAgICAgcHNbMTBdID0gcGkgKyAxMDsKKyAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CisgICAgICAgICAgcHNbNF0gPSB0bXAyOworICAgICAgICAgIHBzWzVdID0gcGkgKyA4OworICAgICAgICAgIHBzWzZdID0gcGkgKyAxMTsKKyAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKKyAgICAgICAgICBwc1swXSA9IHRtcDE7CisgICAgICAgICAgcHNbMV0gPSBwaSArIDc7CisgICAgICAgICAgcHNbMl0gPSBwaSArIDY7CisgICAgICAgICAgcHNbM10gPSBwaSArIDU7CisgICAgICAgICAgdG1wMSA9IGNzWzNdOworICAgICAgICAgIGNzWzJdID0gY3NbMV07CisgICAgICAgICAgY3NbM10gPSBjaTsKKyAgICAgICAgICBjc1swXSA9IHRtcDE7CisgICAgICAgICAgY3NbMV0gPSBjaSArIDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIHBzWzEyXSA9IHBzWzBdOworICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKKyAgICAgICAgICBwc1sxNF0gPSBwaSArIDE7CisgICAgICAgICAgcHNbMTVdID0gcGkgKyAyOworICAgICAgICAgIHBzWzhdID0gcHNbMV07CisgICAgICAgICAgcHNbOV0gPSBwaSArIDk7CisgICAgICAgICAgcHNbMTBdID0gcGkgKyAxMDsKKyAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CisgICAgICAgICAgcHNbNF0gPSBwc1syXTsKKyAgICAgICAgICBwc1s1XSA9IHBpICsgODsKKyAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CisgICAgICAgICAgcHNbN10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMF0gPSBwc1szXTsKKyAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKKyAgICAgICAgICBwc1syXSA9IHBpICsgNjsKKyAgICAgICAgICBwc1szXSA9IHBpICsgNTsKKyAgICAgICAgICBjc1syXSA9IGNzWzBdOworICAgICAgICAgIGNzWzNdID0gY2k7CisgICAgICAgICAgY3NbMF0gPSBjc1sxXTsKKyAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbWVzaC5maWd1cmVzLnB1c2goeworICAgICAgICB0eXBlOiAicGF0Y2giLAorICAgICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKKyAgICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShjcykKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZUJvdW5kcyhtZXNoKSB7CisgICAgdmFyIG1pblggPSBtZXNoLmNvb3Jkc1swXVswXSwKKyAgICAgICAgbWluWSA9IG1lc2guY29vcmRzWzBdWzFdLAorICAgICAgICBtYXhYID0gbWluWCwKKyAgICAgICAgbWF4WSA9IG1pblk7CisKKyAgICBmb3IgKHZhciBpID0gMSwgaWkgPSBtZXNoLmNvb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgeCA9IG1lc2guY29vcmRzW2ldWzBdLAorICAgICAgICAgIHkgPSBtZXNoLmNvb3Jkc1tpXVsxXTsKKyAgICAgIG1pblggPSBtaW5YID4geCA/IHggOiBtaW5YOworICAgICAgbWluWSA9IG1pblkgPiB5ID8geSA6IG1pblk7CisgICAgICBtYXhYID0gbWF4WCA8IHggPyB4IDogbWF4WDsKKyAgICAgIG1heFkgPSBtYXhZIDwgeSA/IHkgOiBtYXhZOworICAgIH0KKworICAgIG1lc2guYm91bmRzID0gW21pblgsIG1pblksIG1heFgsIG1heFldOworICB9CisKKyAgZnVuY3Rpb24gcGFja0RhdGEobWVzaCkgeworICAgIHZhciBpLCBpaSwgaiwgamo7CisgICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzOworICAgIHZhciBjb29yZHNQYWNrZWQgPSBuZXcgRmxvYXQzMkFycmF5KGNvb3Jkcy5sZW5ndGggKiAyKTsKKworICAgIGZvciAoaSA9IDAsIGogPSAwLCBpaSA9IGNvb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgeHkgPSBjb29yZHNbaV07CisgICAgICBjb29yZHNQYWNrZWRbaisrXSA9IHh5WzBdOworICAgICAgY29vcmRzUGFja2VkW2orK10gPSB4eVsxXTsKKyAgICB9CisKKyAgICBtZXNoLmNvb3JkcyA9IGNvb3Jkc1BhY2tlZDsKKyAgICB2YXIgY29sb3JzID0gbWVzaC5jb2xvcnM7CisgICAgdmFyIGNvbG9yc1BhY2tlZCA9IG5ldyBVaW50OEFycmF5KGNvbG9ycy5sZW5ndGggKiAzKTsKKworICAgIGZvciAoaSA9IDAsIGogPSAwLCBpaSA9IGNvbG9ycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgYyA9IGNvbG9yc1tpXTsKKyAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1swXTsKKyAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1sxXTsKKyAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1syXTsKKyAgICB9CisKKyAgICBtZXNoLmNvbG9ycyA9IGNvbG9yc1BhY2tlZDsKKyAgICB2YXIgZmlndXJlcyA9IG1lc2guZmlndXJlczsKKworICAgIGZvciAoaSA9IDAsIGlpID0gZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgZmlndXJlID0gZmlndXJlc1tpXSwKKyAgICAgICAgICBwcyA9IGZpZ3VyZS5jb29yZHMsCisgICAgICAgICAgY3MgPSBmaWd1cmUuY29sb3JzOworCisgICAgICBmb3IgKGogPSAwLCBqaiA9IHBzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgcHNbal0gKj0gMjsKKyAgICAgICAgY3Nbal0gKj0gMzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBNZXNoKHN0cmVhbSwgbWF0cml4LCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoc3RyZWFtKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNZXNoIGRhdGEgaXMgbm90IGEgc3RyZWFtIik7CisgICAgfQorCisgICAgdmFyIGRpY3QgPSBzdHJlYW0uZGljdDsKKyAgICB0aGlzLm1hdHJpeCA9IG1hdHJpeDsKKyAgICB0aGlzLnNoYWRpbmdUeXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CisgICAgdGhpcy50eXBlID0gIlBhdHRlcm4iOworICAgIGNvbnN0IGJib3ggPSBkaWN0LmdldEFycmF5KCJCQm94Iik7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShiYm94KSAmJiBiYm94Lmxlbmd0aCA9PT0gNCkgeworICAgICAgdGhpcy5iYm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KGJib3gpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmJib3ggPSBudWxsOworICAgIH0KKworICAgIGNvbnN0IGNzID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICBjczogZGljdC5nZXRSYXcoIkNvbG9yU3BhY2UiKSB8fCBkaWN0LmdldFJhdygiQ1MiKSwKKyAgICAgIHhyZWYsCisgICAgICByZXNvdXJjZXMsCisgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgIH0pOworCisgICAgdGhpcy5jcyA9IGNzOworICAgIHRoaXMuYmFja2dyb3VuZCA9IGRpY3QuaGFzKCJCYWNrZ3JvdW5kIikgPyBjcy5nZXRSZ2IoZGljdC5nZXQoIkJhY2tncm91bmQiKSwgMCkgOiBudWxsOworICAgIHZhciBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOworICAgIHZhciBmbiA9IGZuT2JqID8gcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZUZyb21BcnJheShmbk9iaikgOiBudWxsOworICAgIHRoaXMuY29vcmRzID0gW107CisgICAgdGhpcy5jb2xvcnMgPSBbXTsKKyAgICB0aGlzLmZpZ3VyZXMgPSBbXTsKKyAgICB2YXIgZGVjb2RlQ29udGV4dCA9IHsKKyAgICAgIGJpdHNQZXJDb29yZGluYXRlOiBkaWN0LmdldCgiQml0c1BlckNvb3JkaW5hdGUiKSwKKyAgICAgIGJpdHNQZXJDb21wb25lbnQ6IGRpY3QuZ2V0KCJCaXRzUGVyQ29tcG9uZW50IiksCisgICAgICBiaXRzUGVyRmxhZzogZGljdC5nZXQoIkJpdHNQZXJGbGFnIiksCisgICAgICBkZWNvZGU6IGRpY3QuZ2V0QXJyYXkoIkRlY29kZSIpLAorICAgICAgY29sb3JGbjogZm4sCisgICAgICBjb2xvclNwYWNlOiBjcywKKyAgICAgIG51bUNvbXBzOiBmbiA/IDEgOiBjcy5udW1Db21wcworICAgIH07CisgICAgdmFyIHJlYWRlciA9IG5ldyBNZXNoU3RyZWFtUmVhZGVyKHN0cmVhbSwgZGVjb2RlQ29udGV4dCk7CisgICAgdmFyIHBhdGNoTWVzaCA9IGZhbHNlOworCisgICAgc3dpdGNoICh0aGlzLnNoYWRpbmdUeXBlKSB7CisgICAgICBjYXNlIFNoYWRpbmdUeXBlLkZSRUVfRk9STV9NRVNIOgorICAgICAgICBkZWNvZGVUeXBlNFNoYWRpbmcodGhpcywgcmVhZGVyKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6CisgICAgICAgIHZhciB2ZXJ0aWNlc1BlclJvdyA9IGRpY3QuZ2V0KCJWZXJ0aWNlc1BlclJvdyIpIHwgMDsKKworICAgICAgICBpZiAodmVydGljZXNQZXJSb3cgPCAyKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFZlcnRpY2VzUGVyUm93Iik7CisgICAgICAgIH0KKworICAgICAgICBkZWNvZGVUeXBlNVNoYWRpbmcodGhpcywgcmVhZGVyLCB2ZXJ0aWNlc1BlclJvdyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNoYWRpbmdUeXBlLkNPT05TX1BBVENIX01FU0g6CisgICAgICAgIGRlY29kZVR5cGU2U2hhZGluZyh0aGlzLCByZWFkZXIpOworICAgICAgICBwYXRjaE1lc2ggPSB0cnVlOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDoKKyAgICAgICAgZGVjb2RlVHlwZTdTaGFkaW5nKHRoaXMsIHJlYWRlcik7CisgICAgICAgIHBhdGNoTWVzaCA9IHRydWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwYXRjaE1lc2gpIHsKKyAgICAgIHVwZGF0ZUJvdW5kcyh0aGlzKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5maWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgYnVpbGRGaWd1cmVGcm9tUGF0Y2godGhpcywgaSk7CisgICAgICB9CisgICAgfQorCisgICAgdXBkYXRlQm91bmRzKHRoaXMpOworICAgIHBhY2tEYXRhKHRoaXMpOworICB9CisKKyAgTWVzaC5wcm90b3R5cGUgPSB7CisgICAgZ2V0SVI6IGZ1bmN0aW9uIE1lc2hfZ2V0SVIoKSB7CisgICAgICByZXR1cm4gWyJNZXNoIiwgdGhpcy5zaGFkaW5nVHlwZSwgdGhpcy5jb29yZHMsIHRoaXMuY29sb3JzLCB0aGlzLmZpZ3VyZXMsIHRoaXMuYm91bmRzLCB0aGlzLm1hdHJpeCwgdGhpcy5iYm94LCB0aGlzLmJhY2tncm91bmRdOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIE1lc2g7Cit9KCk7CisKK1NoYWRpbmdzLkR1bW15ID0gZnVuY3Rpb24gRHVtbXlDbG9zdXJlKCkgeworICBmdW5jdGlvbiBEdW1teSgpIHsKKyAgICB0aGlzLnR5cGUgPSAiUGF0dGVybiI7CisgIH0KKworICBEdW1teS5wcm90b3R5cGUgPSB7CisgICAgZ2V0SVI6IGZ1bmN0aW9uIER1bW15X2dldElSKCkgeworICAgICAgcmV0dXJuIFsiRHVtbXkiXTsKKyAgICB9CisgIH07CisgIHJldHVybiBEdW1teTsKK30oKTsKKworZnVuY3Rpb24gZ2V0VGlsaW5nUGF0dGVybklSKG9wZXJhdG9yTGlzdCwgZGljdCwgYXJncykgeworICBjb25zdCBtYXRyaXggPSBkaWN0LmdldEFycmF5KCJNYXRyaXgiKTsKKworICBjb25zdCBiYm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSk7CisKKyAgY29uc3QgeHN0ZXAgPSBkaWN0LmdldCgiWFN0ZXAiKTsKKyAgY29uc3QgeXN0ZXAgPSBkaWN0LmdldCgiWVN0ZXAiKTsKKyAgY29uc3QgcGFpbnRUeXBlID0gZGljdC5nZXQoIlBhaW50VHlwZSIpOworICBjb25zdCB0aWxpbmdUeXBlID0gZGljdC5nZXQoIlRpbGluZ1R5cGUiKTsKKworICBpZiAoYmJveFsyXSAtIGJib3hbMF0gPT09IDAgfHwgYmJveFszXSAtIGJib3hbMV0gPT09IDApIHsKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9CQm94IGFycmF5OiBbJHtiYm94fV0uYCk7CisgIH0KKworICByZXR1cm4gWyJUaWxpbmdQYXR0ZXJuIiwgYXJncywgb3BlcmF0b3JMaXN0LCBtYXRyaXgsIGJib3gsIHhzdGVwLCB5c3RlcCwgcGFpbnRUeXBlLCB0aWxpbmdUeXBlXTsKK30KKworLyoqKi8gfSksCisvKiA0MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmlzUERGRnVuY3Rpb24gPSBpc1BERkZ1bmN0aW9uOworZXhwb3J0cy5Qb3N0U2NyaXB0Q29tcGlsZXIgPSBleHBvcnRzLlBvc3RTY3JpcHRFdmFsdWF0b3IgPSBleHBvcnRzLlBERkZ1bmN0aW9uRmFjdG9yeSA9IHZvaWQgMDsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9wc19wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQxKTsKKwordmFyIF9pbWFnZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjQpOworCitjbGFzcyBQREZGdW5jdGlvbkZhY3RvcnkgeworICBjb25zdHJ1Y3Rvcih7CisgICAgeHJlZiwKKyAgICBpc0V2YWxTdXBwb3J0ZWQgPSB0cnVlCisgIH0pIHsKKyAgICB0aGlzLnhyZWYgPSB4cmVmOworICAgIHRoaXMuaXNFdmFsU3VwcG9ydGVkID0gaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTsKKyAgICB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUgPSBudWxsOworICB9CisKKyAgY3JlYXRlKGZuKSB7CisgICAgY29uc3QgY2FjaGVkRnVuY3Rpb24gPSB0aGlzLmdldENhY2hlZChmbik7CisKKyAgICBpZiAoY2FjaGVkRnVuY3Rpb24pIHsKKyAgICAgIHJldHVybiBjYWNoZWRGdW5jdGlvbjsKKyAgICB9CisKKyAgICBjb25zdCBwYXJzZWRGdW5jdGlvbiA9IFBERkZ1bmN0aW9uLnBhcnNlKHsKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICBmbjogZm4gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYgPyB0aGlzLnhyZWYuZmV0Y2goZm4pIDogZm4KKyAgICB9KTsKKworICAgIHRoaXMuX2NhY2hlKGZuLCBwYXJzZWRGdW5jdGlvbik7CisKKyAgICByZXR1cm4gcGFyc2VkRnVuY3Rpb247CisgIH0KKworICBjcmVhdGVGcm9tQXJyYXkoZm5PYmopIHsKKyAgICBjb25zdCBjYWNoZWRGdW5jdGlvbiA9IHRoaXMuZ2V0Q2FjaGVkKGZuT2JqKTsKKworICAgIGlmIChjYWNoZWRGdW5jdGlvbikgeworICAgICAgcmV0dXJuIGNhY2hlZEZ1bmN0aW9uOworICAgIH0KKworICAgIGNvbnN0IHBhcnNlZEZ1bmN0aW9uID0gUERGRnVuY3Rpb24ucGFyc2VBcnJheSh7CisgICAgICB4cmVmOiB0aGlzLnhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHRoaXMuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgZm5PYmo6IGZuT2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmID8gdGhpcy54cmVmLmZldGNoKGZuT2JqKSA6IGZuT2JqCisgICAgfSk7CisKKyAgICB0aGlzLl9jYWNoZShmbk9iaiwgcGFyc2VkRnVuY3Rpb24pOworCisgICAgcmV0dXJuIHBhcnNlZEZ1bmN0aW9uOworICB9CisKKyAgZ2V0Q2FjaGVkKGNhY2hlS2V5KSB7CisgICAgbGV0IGZuUmVmOworCisgICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICBmblJlZiA9IGNhY2hlS2V5OworICAgIH0gZWxzZSBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CisgICAgICBmblJlZiA9IGNhY2hlS2V5Lm9iaklkOworICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShjYWNoZUtleSkpIHsKKyAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdCAmJiBjYWNoZUtleS5kaWN0Lm9iaklkOworICAgIH0KKworICAgIGlmIChmblJlZikgeworICAgICAgaWYgKCF0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUpIHsKKyAgICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEZ1bmN0aW9uQ2FjaGUoKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgbG9jYWxGdW5jdGlvbiA9IHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5nZXRCeVJlZihmblJlZik7CisKKyAgICAgIGlmIChsb2NhbEZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBsb2NhbEZ1bmN0aW9uOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgX2NhY2hlKGNhY2hlS2V5LCBwYXJzZWRGdW5jdGlvbikgeworICAgIGlmICghcGFyc2VkRnVuY3Rpb24pIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignUERGRnVuY3Rpb25GYWN0b3J5Ll9jYWNoZSAtIGV4cGVjdGVkICJwYXJzZWRGdW5jdGlvbiIgYXJndW1lbnQuJyk7CisgICAgfQorCisgICAgbGV0IGZuUmVmOworCisgICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICBmblJlZiA9IGNhY2hlS2V5OworICAgIH0gZWxzZSBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CisgICAgICBmblJlZiA9IGNhY2hlS2V5Lm9iaklkOworICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShjYWNoZUtleSkpIHsKKyAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdCAmJiBjYWNoZUtleS5kaWN0Lm9iaklkOworICAgIH0KKworICAgIGlmIChmblJlZikgeworICAgICAgaWYgKCF0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUpIHsKKyAgICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEZ1bmN0aW9uQ2FjaGUoKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlLnNldChudWxsLCBmblJlZiwgcGFyc2VkRnVuY3Rpb24pOworICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuUERGRnVuY3Rpb25GYWN0b3J5ID0gUERGRnVuY3Rpb25GYWN0b3J5OworCitmdW5jdGlvbiB0b051bWJlckFycmF5KGFycikgeworICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgaWYgKHR5cGVvZiBhcnJbaV0gIT09ICJudW1iZXIiKSB7CisgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgICByZXN1bHRbal0gPSArYXJyW2pdOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgfQorCisgIHJldHVybiBhcnI7Cit9CisKK3ZhciBQREZGdW5jdGlvbiA9IGZ1bmN0aW9uIFBERkZ1bmN0aW9uQ2xvc3VyZSgpIHsKKyAgY29uc3QgQ09OU1RSVUNUX1NBTVBMRUQgPSAwOworICBjb25zdCBDT05TVFJVQ1RfSU5URVJQT0xBVEVEID0gMjsKKyAgY29uc3QgQ09OU1RSVUNUX1NUSUNIRUQgPSAzOworICBjb25zdCBDT05TVFJVQ1RfUE9TVFNDUklQVCA9IDQ7CisgIHJldHVybiB7CisgICAgZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBzdHJlYW0pIHsKKyAgICAgIHZhciBpLCBpaTsKKyAgICAgIHZhciBsZW5ndGggPSAxOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHNpemUubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBsZW5ndGggKj0gc2l6ZVtpXTsKKyAgICAgIH0KKworICAgICAgbGVuZ3RoICo9IG91dHB1dFNpemU7CisgICAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKyAgICAgIHZhciBjb2RlU2l6ZSA9IDA7CisgICAgICB2YXIgY29kZUJ1ZiA9IDA7CisgICAgICB2YXIgc2FtcGxlTXVsID0gMS4wIC8gKDIuMCAqKiBicHMgLSAxKTsKKyAgICAgIHZhciBzdHJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcygobGVuZ3RoICogYnBzICsgNykgLyA4KTsKKyAgICAgIHZhciBzdHJJZHggPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgd2hpbGUgKGNvZGVTaXplIDwgYnBzKSB7CisgICAgICAgICAgY29kZUJ1ZiA8PD0gODsKKyAgICAgICAgICBjb2RlQnVmIHw9IHN0ckJ5dGVzW3N0cklkeCsrXTsKKyAgICAgICAgICBjb2RlU2l6ZSArPSA4OworICAgICAgICB9CisKKyAgICAgICAgY29kZVNpemUgLT0gYnBzOworICAgICAgICBhcnJheVtpXSA9IChjb2RlQnVmID4+IGNvZGVTaXplKSAqIHNhbXBsZU11bDsKKyAgICAgICAgY29kZUJ1ZiAmPSAoMSA8PCBjb2RlU2l6ZSkgLSAxOworICAgICAgfQorCisgICAgICByZXR1cm4gYXJyYXk7CisgICAgfSwKKworICAgIGdldElSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBmbgorICAgIH0pIHsKKyAgICAgIHZhciBkaWN0ID0gZm4uZGljdDsKKworICAgICAgaWYgKCFkaWN0KSB7CisgICAgICAgIGRpY3QgPSBmbjsKKyAgICAgIH0KKworICAgICAgdmFyIHR5cGVzID0gW3RoaXMuY29uc3RydWN0U2FtcGxlZCwgbnVsbCwgdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQsIHRoaXMuY29uc3RydWN0U3RpY2hlZCwgdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0XTsKKyAgICAgIHZhciB0eXBlTnVtID0gZGljdC5nZXQoIkZ1bmN0aW9uVHlwZSIpOworICAgICAgdmFyIHR5cGVGbiA9IHR5cGVzW3R5cGVOdW1dOworCisgICAgICBpZiAoIXR5cGVGbikgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZSBvZiBmdW5jdGlvbiIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHlwZUZuLmNhbGwodGhpcywgeworICAgICAgICB4cmVmLAorICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgIGZuLAorICAgICAgICBkaWN0CisgICAgICB9KTsKKyAgICB9LAorCisgICAgZnJvbUlSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBJUgorICAgIH0pIHsKKyAgICAgIHZhciB0eXBlID0gSVJbMF07CisKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIENPTlNUUlVDVF9TQU1QTEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWRGcm9tSVIoeworICAgICAgICAgICAgeHJlZiwKKyAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICAgIElSCisgICAgICAgICAgfSk7CisKKyAgICAgICAgY2FzZSBDT05TVFJVQ1RfSU5URVJQT0xBVEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUih7CisgICAgICAgICAgICB4cmVmLAorICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgICAgSVIKKyAgICAgICAgICB9KTsKKworICAgICAgICBjYXNlIENPTlNUUlVDVF9TVElDSEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFN0aWNoZWRGcm9tSVIoeworICAgICAgICAgICAgeHJlZiwKKyAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICAgIElSCisgICAgICAgICAgfSk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSKHsKKyAgICAgICAgICAgIHhyZWYsCisgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgICBJUgorICAgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICBwYXJzZSh7CisgICAgICB4cmVmLAorICAgICAgaXNFdmFsU3VwcG9ydGVkLAorICAgICAgZm4KKyAgICB9KSB7CisgICAgICBjb25zdCBJUiA9IHRoaXMuZ2V0SVIoeworICAgICAgICB4cmVmLAorICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgIGZuCisgICAgICB9KTsKKyAgICAgIHJldHVybiB0aGlzLmZyb21JUih7CisgICAgICAgIHhyZWYsCisgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgSVIKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBwYXJzZUFycmF5KHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBmbk9iagorICAgIH0pIHsKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheShmbk9iaikpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoeworICAgICAgICAgIHhyZWYsCisgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIGZuOiBmbk9iagorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdmFyIGZuQXJyYXkgPSBbXTsKKworICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gZm5PYmoubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICBmbkFycmF5LnB1c2godGhpcy5wYXJzZSh7CisgICAgICAgICAgeHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgZm46IHhyZWYuZmV0Y2hJZlJlZihmbk9ialtqXSkKKyAgICAgICAgfSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gZnVuY3Rpb24gKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGZuQXJyYXlbaV0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQgKyBpKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9LAorCisgICAgY29uc3RydWN0U2FtcGxlZCh7CisgICAgICB4cmVmLAorICAgICAgaXNFdmFsU3VwcG9ydGVkLAorICAgICAgZm4sCisgICAgICBkaWN0CisgICAgfSkgeworICAgICAgZnVuY3Rpb24gdG9NdWx0aUFycmF5KGFycikgeworICAgICAgICB2YXIgaW5wdXRMZW5ndGggPSBhcnIubGVuZ3RoOworICAgICAgICB2YXIgb3V0ID0gW107CisgICAgICAgIHZhciBpbmRleCA9IDA7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgb3V0W2luZGV4XSA9IFthcnJbaV0sIGFycltpICsgMV1dOworICAgICAgICAgICsraW5kZXg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3V0OworICAgICAgfQorCisgICAgICB2YXIgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CisgICAgICB2YXIgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOworCisgICAgICBpZiAoIWRvbWFpbiB8fCAhcmFuZ2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBkb21haW4gb3IgcmFuZ2UiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggLyAyOworICAgICAgdmFyIG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggLyAyOworICAgICAgZG9tYWluID0gdG9NdWx0aUFycmF5KGRvbWFpbik7CisgICAgICByYW5nZSA9IHRvTXVsdGlBcnJheShyYW5nZSk7CisgICAgICB2YXIgc2l6ZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiU2l6ZSIpKTsKKyAgICAgIHZhciBicHMgPSBkaWN0LmdldCgiQml0c1BlclNhbXBsZSIpOworICAgICAgdmFyIG9yZGVyID0gZGljdC5nZXQoIk9yZGVyIikgfHwgMTsKKworICAgICAgaWYgKG9yZGVyICE9PSAxKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiTm8gc3VwcG9ydCBmb3IgY3ViaWMgc3BsaW5lIGludGVycG9sYXRpb246ICIgKyBvcmRlcik7CisgICAgICB9CisKKyAgICAgIHZhciBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKKworICAgICAgaWYgKCFlbmNvZGUpIHsKKyAgICAgICAgZW5jb2RlID0gW107CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dFNpemU7ICsraSkgeworICAgICAgICAgIGVuY29kZS5wdXNoKFswLCBzaXplW2ldIC0gMV0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBlbmNvZGUgPSB0b011bHRpQXJyYXkoZW5jb2RlKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRGVjb2RlIikpOworCisgICAgICBpZiAoIWRlY29kZSkgeworICAgICAgICBkZWNvZGUgPSByYW5nZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlY29kZSA9IHRvTXVsdGlBcnJheShkZWNvZGUpOworICAgICAgfQorCisgICAgICB2YXIgc2FtcGxlcyA9IHRoaXMuZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBmbik7CisgICAgICByZXR1cm4gW0NPTlNUUlVDVF9TQU1QTEVELCBpbnB1dFNpemUsIGRvbWFpbiwgZW5jb2RlLCBkZWNvZGUsIHNhbXBsZXMsIHNpemUsIG91dHB1dFNpemUsIDIgKiogYnBzIC0gMSwgcmFuZ2VdOworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RTYW1wbGVkRnJvbUlSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBJUgorICAgIH0pIHsKKyAgICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKHgsIHhtaW4sIHhtYXgsIHltaW4sIHltYXgpIHsKKyAgICAgICAgcmV0dXJuIHltaW4gKyAoeCAtIHhtaW4pICogKCh5bWF4IC0geW1pbikgLyAoeG1heCAtIHhtaW4pKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFNhbXBsZWRGcm9tSVJSZXN1bHQoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgICAgdmFyIG0gPSBJUlsxXTsKKyAgICAgICAgdmFyIGRvbWFpbiA9IElSWzJdOworICAgICAgICB2YXIgZW5jb2RlID0gSVJbM107CisgICAgICAgIHZhciBkZWNvZGUgPSBJUls0XTsKKyAgICAgICAgdmFyIHNhbXBsZXMgPSBJUls1XTsKKyAgICAgICAgdmFyIHNpemUgPSBJUls2XTsKKyAgICAgICAgdmFyIG4gPSBJUls3XTsKKyAgICAgICAgdmFyIHJhbmdlID0gSVJbOV07CisgICAgICAgIHZhciBjdWJlVmVydGljZXMgPSAxIDw8IG07CisgICAgICAgIHZhciBjdWJlTiA9IG5ldyBGbG9hdDY0QXJyYXkoY3ViZVZlcnRpY2VzKTsKKyAgICAgICAgdmFyIGN1YmVWZXJ0ZXggPSBuZXcgVWludDMyQXJyYXkoY3ViZVZlcnRpY2VzKTsKKyAgICAgICAgdmFyIGksIGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1YmVWZXJ0aWNlczsgaisrKSB7CisgICAgICAgICAgY3ViZU5bal0gPSAxOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGsgPSBuLAorICAgICAgICAgICAgcG9zID0gMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CisgICAgICAgICAgdmFyIGRvbWFpbl8yaSA9IGRvbWFpbltpXVswXTsKKyAgICAgICAgICB2YXIgZG9tYWluXzJpXzEgPSBkb21haW5baV1bMV07CisgICAgICAgICAgdmFyIHhpID0gTWF0aC5taW4oTWF0aC5tYXgoc3JjW3NyY09mZnNldCArIGldLCBkb21haW5fMmkpLCBkb21haW5fMmlfMSk7CisgICAgICAgICAgdmFyIGUgPSBpbnRlcnBvbGF0ZSh4aSwgZG9tYWluXzJpLCBkb21haW5fMmlfMSwgZW5jb2RlW2ldWzBdLCBlbmNvZGVbaV1bMV0pOworICAgICAgICAgIHZhciBzaXplX2kgPSBzaXplW2ldOworICAgICAgICAgIGUgPSBNYXRoLm1pbihNYXRoLm1heChlLCAwKSwgc2l6ZV9pIC0gMSk7CisgICAgICAgICAgdmFyIGUwID0gZSA8IHNpemVfaSAtIDEgPyBNYXRoLmZsb29yKGUpIDogZSAtIDE7CisgICAgICAgICAgdmFyIG4wID0gZTAgKyAxIC0gZTsKKyAgICAgICAgICB2YXIgbjEgPSBlIC0gZTA7CisgICAgICAgICAgdmFyIG9mZnNldDAgPSBlMCAqIGs7CisgICAgICAgICAgdmFyIG9mZnNldDEgPSBvZmZzZXQwICsgazsKKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWJlVmVydGljZXM7IGorKykgeworICAgICAgICAgICAgaWYgKGogJiBwb3MpIHsKKyAgICAgICAgICAgICAgY3ViZU5bal0gKj0gbjE7CisgICAgICAgICAgICAgIGN1YmVWZXJ0ZXhbal0gKz0gb2Zmc2V0MTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGN1YmVOW2pdICo9IG4wOworICAgICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgayAqPSBzaXplX2k7CisgICAgICAgICAgcG9zIDw8PSAxOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgIHZhciByaiA9IDA7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3ViZVZlcnRpY2VzOyBpKyspIHsKKyAgICAgICAgICAgIHJqICs9IHNhbXBsZXNbY3ViZVZlcnRleFtpXSArIGpdICogY3ViZU5baV07CisgICAgICAgICAgfQorCisgICAgICAgICAgcmogPSBpbnRlcnBvbGF0ZShyaiwgMCwgMSwgZGVjb2RlW2pdWzBdLCBkZWNvZGVbal1bMV0pOworICAgICAgICAgIGRlc3RbZGVzdE9mZnNldCArIGpdID0gTWF0aC5taW4oTWF0aC5tYXgocmosIHJhbmdlW2pdWzBdKSwgcmFuZ2Vbal1bMV0pOworICAgICAgICB9CisgICAgICB9OworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoeworICAgICAgeHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgIGZuLAorICAgICAgZGljdAorICAgIH0pIHsKKyAgICAgIHZhciBjMCA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiQzAiKSkgfHwgWzBdOworICAgICAgdmFyIGMxID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJDMSIpKSB8fCBbMV07CisgICAgICB2YXIgbiA9IGRpY3QuZ2V0KCJOIik7CisgICAgICB2YXIgbGVuZ3RoID0gYzAubGVuZ3RoOworICAgICAgdmFyIGRpZmYgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBkaWZmLnB1c2goYzFbaV0gLSBjMFtpXSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBbQ09OU1RSVUNUX0lOVEVSUE9MQVRFRCwgYzAsIGRpZmYsIG5dOworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVIoeworICAgICAgeHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgIElSCisgICAgfSkgeworICAgICAgdmFyIGMwID0gSVJbMV07CisgICAgICB2YXIgZGlmZiA9IElSWzJdOworICAgICAgdmFyIG4gPSBJUlszXTsKKyAgICAgIHZhciBsZW5ndGggPSBkaWZmLmxlbmd0aDsKKyAgICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVJSZXN1bHQoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgICAgdmFyIHggPSBuID09PSAxID8gc3JjW3NyY09mZnNldF0gOiBzcmNbc3JjT2Zmc2V0XSAqKiBuOworCisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKKyAgICAgICAgICBkZXN0W2Rlc3RPZmZzZXQgKyBqXSA9IGMwW2pdICsgeCAqIGRpZmZbal07CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfSwKKworICAgIGNvbnN0cnVjdFN0aWNoZWQoeworICAgICAgeHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgIGZuLAorICAgICAgZGljdAorICAgIH0pIHsKKyAgICAgIHZhciBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKKworICAgICAgaWYgKCFkb21haW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBkb21haW4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggLyAyOworCisgICAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGRvbWFpbiBmb3Igc3RpY2hlZCBmdW5jdGlvbiIpOworICAgICAgfQorCisgICAgICB2YXIgZm5SZWZzID0gZGljdC5nZXQoIkZ1bmN0aW9ucyIpOworICAgICAgdmFyIGZucyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmblJlZnMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICBmbnMucHVzaCh0aGlzLnBhcnNlKHsKKyAgICAgICAgICB4cmVmLAorICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICBmbjogeHJlZi5mZXRjaElmUmVmKGZuUmVmc1tpXSkKKyAgICAgICAgfSkpOworICAgICAgfQorCisgICAgICB2YXIgYm91bmRzID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJCb3VuZHMiKSk7CisgICAgICB2YXIgZW5jb2RlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJFbmNvZGUiKSk7CisgICAgICByZXR1cm4gW0NPTlNUUlVDVF9TVElDSEVELCBkb21haW4sIGJvdW5kcywgZW5jb2RlLCBmbnNdOworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBJUgorICAgIH0pIHsKKyAgICAgIHZhciBkb21haW4gPSBJUlsxXTsKKyAgICAgIHZhciBib3VuZHMgPSBJUlsyXTsKKyAgICAgIHZhciBlbmNvZGUgPSBJUlszXTsKKyAgICAgIHZhciBmbnMgPSBJUls0XTsKKyAgICAgIHZhciB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KDEpOworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGcm9tSVJSZXN1bHQoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgICAgdmFyIGNsaXAgPSBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSQ2xpcCh2LCBtaW4sIG1heCkgeworICAgICAgICAgIGlmICh2ID4gbWF4KSB7CisgICAgICAgICAgICB2ID0gbWF4OworICAgICAgICAgIH0gZWxzZSBpZiAodiA8IG1pbikgeworICAgICAgICAgICAgdiA9IG1pbjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfTsKKworICAgICAgICB2YXIgdiA9IGNsaXAoc3JjW3NyY09mZnNldF0sIGRvbWFpblswXSwgZG9tYWluWzFdKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBib3VuZHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIGlmICh2IDwgYm91bmRzW2ldKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgZG1pbiA9IGRvbWFpblswXTsKKworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICBkbWluID0gYm91bmRzW2kgLSAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkbWF4ID0gZG9tYWluWzFdOworCisgICAgICAgIGlmIChpIDwgYm91bmRzLmxlbmd0aCkgeworICAgICAgICAgIGRtYXggPSBib3VuZHNbaV07CisgICAgICAgIH0KKworICAgICAgICB2YXIgcm1pbiA9IGVuY29kZVsyICogaV07CisgICAgICAgIHZhciBybWF4ID0gZW5jb2RlWzIgKiBpICsgMV07CisgICAgICAgIHRtcEJ1ZlswXSA9IGRtaW4gPT09IGRtYXggPyBybWluIDogcm1pbiArICh2IC0gZG1pbikgKiAocm1heCAtIHJtaW4pIC8gKGRtYXggLSBkbWluKTsKKyAgICAgICAgZm5zW2ldKHRtcEJ1ZiwgMCwgZGVzdCwgZGVzdE9mZnNldCk7CisgICAgICB9OworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RQb3N0U2NyaXB0KHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBmbiwKKyAgICAgIGRpY3QKKyAgICB9KSB7CisgICAgICB2YXIgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CisgICAgICB2YXIgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOworCisgICAgICBpZiAoIWRvbWFpbikgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vIGRvbWFpbi4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFyYW5nZSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vIHJhbmdlLiIpOworICAgICAgfQorCisgICAgICB2YXIgbGV4ZXIgPSBuZXcgX3BzX3BhcnNlci5Qb3N0U2NyaXB0TGV4ZXIoZm4pOworICAgICAgdmFyIHBhcnNlciA9IG5ldyBfcHNfcGFyc2VyLlBvc3RTY3JpcHRQYXJzZXIobGV4ZXIpOworICAgICAgdmFyIGNvZGUgPSBwYXJzZXIucGFyc2UoKTsKKyAgICAgIHJldHVybiBbQ09OU1RSVUNUX1BPU1RTQ1JJUFQsIGRvbWFpbiwgcmFuZ2UsIGNvZGVdOworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBJUgorICAgIH0pIHsKKyAgICAgIHZhciBkb21haW4gPSBJUlsxXTsKKyAgICAgIHZhciByYW5nZSA9IElSWzJdOworICAgICAgdmFyIGNvZGUgPSBJUlszXTsKKworICAgICAgaWYgKGlzRXZhbFN1cHBvcnRlZCAmJiBfdXRpbC5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQudmFsdWUpIHsKKyAgICAgICAgY29uc3QgY29tcGlsZWQgPSBuZXcgUG9zdFNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKTsKKworICAgICAgICBpZiAoY29tcGlsZWQpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJzcmMiLCAic3JjT2Zmc2V0IiwgImRlc3QiLCAiZGVzdE9mZnNldCIsIGNvbXBpbGVkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7CisgICAgICB2YXIgbnVtT3V0cHV0cyA9IHJhbmdlLmxlbmd0aCA+PiAxOworICAgICAgdmFyIG51bUlucHV0cyA9IGRvbWFpbi5sZW5ndGggPj4gMTsKKyAgICAgIHZhciBldmFsdWF0b3IgPSBuZXcgUG9zdFNjcmlwdEV2YWx1YXRvcihjb2RlKTsKKyAgICAgIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB2YXIgTUFYX0NBQ0hFX1NJWkUgPSAyMDQ4ICogNDsKKyAgICAgIHZhciBjYWNoZV9hdmFpbGFibGUgPSBNQVhfQ0FDSEVfU0laRTsKKyAgICAgIHZhciB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUlucHV0cyk7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUlJlc3VsdChzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgICB2YXIgaSwgdmFsdWU7CisgICAgICAgIHZhciBrZXkgPSAiIjsKKyAgICAgICAgdmFyIGlucHV0ID0gdG1wQnVmOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1JbnB1dHM7IGkrKykgeworICAgICAgICAgIHZhbHVlID0gc3JjW3NyY09mZnNldCArIGldOworICAgICAgICAgIGlucHV0W2ldID0gdmFsdWU7CisgICAgICAgICAga2V5ICs9IHZhbHVlICsgIl8iOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gY2FjaGVba2V5XTsKKworICAgICAgICBpZiAoY2FjaGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGRlc3Quc2V0KGNhY2hlZFZhbHVlLCBkZXN0T2Zmc2V0KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShudW1PdXRwdXRzKTsKKyAgICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdG9yLmV4ZWN1dGUoaW5wdXQpOworICAgICAgICB2YXIgc3RhY2tJbmRleCA9IHN0YWNrLmxlbmd0aCAtIG51bU91dHB1dHM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU91dHB1dHM7IGkrKykgeworICAgICAgICAgIHZhbHVlID0gc3RhY2tbc3RhY2tJbmRleCArIGldOworICAgICAgICAgIHZhciBib3VuZCA9IHJhbmdlW2kgKiAyXTsKKworICAgICAgICAgIGlmICh2YWx1ZSA8IGJvdW5kKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGJvdW5kOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib3VuZCA9IHJhbmdlW2kgKiAyICsgMV07CisKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IGJvdW5kKSB7CisgICAgICAgICAgICAgIHZhbHVlID0gYm91bmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgb3V0cHV0W2ldID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FjaGVfYXZhaWxhYmxlID4gMCkgeworICAgICAgICAgIGNhY2hlX2F2YWlsYWJsZS0tOworICAgICAgICAgIGNhY2hlW2tleV0gPSBvdXRwdXQ7CisgICAgICAgIH0KKworICAgICAgICBkZXN0LnNldChvdXRwdXQsIGRlc3RPZmZzZXQpOworICAgICAgfTsKKyAgICB9CisKKyAgfTsKK30oKTsKKworZnVuY3Rpb24gaXNQREZGdW5jdGlvbih2KSB7CisgIHZhciBmbkRpY3Q7CisKKyAgaWYgKHR5cGVvZiB2ICE9PSAib2JqZWN0IikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh2KSkgeworICAgIGZuRGljdCA9IHY7CisgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh2KSkgeworICAgIGZuRGljdCA9IHYuZGljdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gZm5EaWN0LmhhcygiRnVuY3Rpb25UeXBlIik7Cit9CisKK3ZhciBQb3N0U2NyaXB0U3RhY2sgPSBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tDbG9zdXJlKCkgeworICB2YXIgTUFYX1NUQUNLX1NJWkUgPSAxMDA7CisKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrKGluaXRpYWxTdGFjaykgeworICAgIHRoaXMuc3RhY2sgPSAhaW5pdGlhbFN0YWNrID8gW10gOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpbml0aWFsU3RhY2ssIDApOworICB9CisKKyAgUG9zdFNjcmlwdFN0YWNrLnByb3RvdHlwZSA9IHsKKyAgICBwdXNoOiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcHVzaCh2YWx1ZSkgeworICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID49IE1BWF9TVEFDS19TSVpFKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy4iKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKKyAgICB9LAorICAgIHBvcDogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX3BvcCgpIHsKKyAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayB1bmRlcmZsb3cuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpOworICAgIH0sCisgICAgY29weTogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX2NvcHkobikgeworICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoICsgbiA+PSBNQVhfU1RBQ0tfU0laRSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7CisgICAgICB9CisKKyAgICAgIHZhciBzdGFjayA9IHRoaXMuc3RhY2s7CisKKyAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSBuLCBqID0gbiAtIDE7IGogPj0gMDsgai0tLCBpKyspIHsKKyAgICAgICAgc3RhY2sucHVzaChzdGFja1tpXSk7CisgICAgICB9CisgICAgfSwKKyAgICBpbmRleDogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX2luZGV4KG4pIHsKKyAgICAgIHRoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbiAtIDFdKTsKKyAgICB9LAorICAgIHJvbGw6IGZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19yb2xsKG4sIHApIHsKKyAgICAgIHZhciBzdGFjayA9IHRoaXMuc3RhY2s7CisgICAgICB2YXIgbCA9IHN0YWNrLmxlbmd0aCAtIG47CisgICAgICB2YXIgciA9IHN0YWNrLmxlbmd0aCAtIDEsCisgICAgICAgICAgYyA9IGwgKyAocCAtIE1hdGguZmxvb3IocCAvIG4pICogbiksCisgICAgICAgICAgaSwKKyAgICAgICAgICBqLAorICAgICAgICAgIHQ7CisKKyAgICAgIGZvciAoaSA9IGwsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHsKKyAgICAgICAgdCA9IHN0YWNrW2ldOworICAgICAgICBzdGFja1tpXSA9IHN0YWNrW2pdOworICAgICAgICBzdGFja1tqXSA9IHQ7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IGwsIGogPSBjIC0gMTsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgICAgIHQgPSBzdGFja1tpXTsKKyAgICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKKyAgICAgICAgc3RhY2tbal0gPSB0OworICAgICAgfQorCisgICAgICBmb3IgKGkgPSBjLCBqID0gcjsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgICAgIHQgPSBzdGFja1tpXTsKKyAgICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKKyAgICAgICAgc3RhY2tbal0gPSB0OworICAgICAgfQorICAgIH0KKyAgfTsKKyAgcmV0dXJuIFBvc3RTY3JpcHRTdGFjazsKK30oKTsKKwordmFyIFBvc3RTY3JpcHRFdmFsdWF0b3IgPSBmdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdEV2YWx1YXRvcihvcGVyYXRvcnMpIHsKKyAgICB0aGlzLm9wZXJhdG9ycyA9IG9wZXJhdG9yczsKKyAgfQorCisgIFBvc3RTY3JpcHRFdmFsdWF0b3IucHJvdG90eXBlID0geworICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIFBvc3RTY3JpcHRFdmFsdWF0b3JfZXhlY3V0ZShpbml0aWFsU3RhY2spIHsKKyAgICAgIHZhciBzdGFjayA9IG5ldyBQb3N0U2NyaXB0U3RhY2soaW5pdGlhbFN0YWNrKTsKKyAgICAgIHZhciBjb3VudGVyID0gMDsKKyAgICAgIHZhciBvcGVyYXRvcnMgPSB0aGlzLm9wZXJhdG9yczsKKyAgICAgIHZhciBsZW5ndGggPSBvcGVyYXRvcnMubGVuZ3RoOworICAgICAgdmFyIG9wZXJhdG9yLCBhLCBiOworCisgICAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgeworICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9yc1tjb3VudGVyKytdOworCisgICAgICAgIGlmICh0eXBlb2Ygb3BlcmF0b3IgPT09ICJudW1iZXIiKSB7CisgICAgICAgICAgc3RhY2sucHVzaChvcGVyYXRvcik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7CisgICAgICAgICAgY2FzZSAianoiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAoIWEpIHsKKyAgICAgICAgICAgICAgY291bnRlciA9IGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiaiI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBjb3VudGVyID0gYTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiYWJzIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hYnMoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJhZGQiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhICsgYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImFuZCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShhKSAmJiAoMCwgX3V0aWwuaXNCb29sKShiKSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgJiYgYik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgJiBiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJhdGFuIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hdGFuKGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiYml0c2hpZnQiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAoYSA+IDApIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhIDw8IGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhID4+IGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImNlaWxpbmciOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmNlaWwoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJjb3B5IjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLmNvcHkoYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImNvcyI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY29zKGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiY3ZpIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKSB8IDA7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJjdnIiOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJkaXYiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIC8gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImR1cCI6CisgICAgICAgICAgICBzdGFjay5jb3B5KDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJlcSI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgPT09IGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJleGNoIjoKKyAgICAgICAgICAgIHN0YWNrLnJvbGwoMiwgMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImV4cCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgKiogYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImZhbHNlIjoKKyAgICAgICAgICAgIHN0YWNrLnB1c2goZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJmbG9vciI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguZmxvb3IoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJnZSI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgPj0gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImd0IjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSA+IGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJpZGl2IjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSAvIGIgfCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiaW5kZXgiOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2suaW5kZXgoYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImxlIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSA8PSBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibG4iOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmxvZyhhKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImxvZyI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nKGEpIC8gTWF0aC5MTjEwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibHQiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIDwgYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm1vZCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgJSBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibXVsIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSAqIGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJuZSI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJuZWciOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaCgtYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm5vdCI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShhKSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKCFhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2gofmEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm9yIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc0Jvb2wpKGEpICYmICgwLCBfdXRpbC5pc0Jvb2wpKGIpKSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8IGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInBvcCI6CisgICAgICAgICAgICBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAicm9sbCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5yb2xsKGEsIGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJyb3VuZCI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGgucm91bmQoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJzaW4iOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLnNpbihhKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInNxcnQiOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLnNxcnQoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJzdWIiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIC0gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInRydWUiOgorICAgICAgICAgICAgc3RhY2sucHVzaCh0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAidHJ1bmNhdGUiOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IGEgPCAwID8gTWF0aC5jZWlsKGEpIDogTWF0aC5mbG9vcihhKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInhvciI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShhKSAmJiAoMCwgX3V0aWwuaXNCb29sKShiKSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhIF4gYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBvcGVyYXRvciAke29wZXJhdG9yfWApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBzdGFjay5zdGFjazsKKyAgICB9CisgIH07CisgIHJldHVybiBQb3N0U2NyaXB0RXZhbHVhdG9yOworfSgpOworCitleHBvcnRzLlBvc3RTY3JpcHRFdmFsdWF0b3IgPSBQb3N0U2NyaXB0RXZhbHVhdG9yOworCit2YXIgUG9zdFNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQXN0Tm9kZSh0eXBlKSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCisgIEFzdE5vZGUucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJhYnN0cmFjdCBtZXRob2QiKTsKKyAgfTsKKworICBmdW5jdGlvbiBBc3RBcmd1bWVudChpbmRleCwgbWluLCBtYXgpIHsKKyAgICBBc3ROb2RlLmNhbGwodGhpcywgImFyZ3MiKTsKKyAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgdGhpcy5taW4gPSBtaW47CisgICAgdGhpcy5tYXggPSBtYXg7CisgIH0KKworICBBc3RBcmd1bWVudC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RBcmd1bWVudC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXRBcmd1bWVudCh0aGlzKTsKKyAgfTsKKworICBmdW5jdGlvbiBBc3RMaXRlcmFsKG51bWJlcikgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAibGl0ZXJhbCIpOworICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgIHRoaXMubWluID0gbnVtYmVyOworICAgIHRoaXMubWF4ID0gbnVtYmVyOworICB9CisKKyAgQXN0TGl0ZXJhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RMaXRlcmFsLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdExpdGVyYWwodGhpcyk7CisgIH07CisKKyAgZnVuY3Rpb24gQXN0QmluYXJ5T3BlcmF0aW9uKG9wLCBhcmcxLCBhcmcyLCBtaW4sIG1heCkgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAiYmluYXJ5Iik7CisgICAgdGhpcy5vcCA9IG9wOworICAgIHRoaXMuYXJnMSA9IGFyZzE7CisgICAgdGhpcy5hcmcyID0gYXJnMjsKKyAgICB0aGlzLm1pbiA9IG1pbjsKKyAgICB0aGlzLm1heCA9IG1heDsKKyAgfQorCisgIEFzdEJpbmFyeU9wZXJhdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RCaW5hcnlPcGVyYXRpb24ucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICB2aXNpdG9yLnZpc2l0QmluYXJ5T3BlcmF0aW9uKHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIEFzdE1pbihhcmcsIG1heCkgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAibWF4Iik7CisgICAgdGhpcy5hcmcgPSBhcmc7CisgICAgdGhpcy5taW4gPSBhcmcubWluOworICAgIHRoaXMubWF4ID0gbWF4OworICB9CisKKyAgQXN0TWluLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpOworCisgIEFzdE1pbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXRNaW4odGhpcyk7CisgIH07CisKKyAgZnVuY3Rpb24gQXN0VmFyaWFibGUoaW5kZXgsIG1pbiwgbWF4KSB7CisgICAgQXN0Tm9kZS5jYWxsKHRoaXMsICJ2YXIiKTsKKyAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgdGhpcy5taW4gPSBtaW47CisgICAgdGhpcy5tYXggPSBtYXg7CisgIH0KKworICBBc3RWYXJpYWJsZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RWYXJpYWJsZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZSh0aGlzKTsKKyAgfTsKKworICBmdW5jdGlvbiBBc3RWYXJpYWJsZURlZmluaXRpb24odmFyaWFibGUsIGFyZykgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAiZGVmaW5pdGlvbiIpOworICAgIHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsKKyAgICB0aGlzLmFyZyA9IGFyZzsKKyAgfQorCisgIEFzdFZhcmlhYmxlRGVmaW5pdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RWYXJpYWJsZURlZmluaXRpb24ucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGVEZWZpbml0aW9uKHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpIHsKKyAgICB0aGlzLnBhcnRzID0gW107CisgIH0KKworICBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IucHJvdG90eXBlID0geworICAgIHZpc2l0QXJndW1lbnQoYXJnKSB7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIk1hdGgubWF4KCIsIGFyZy5taW4sICIsIE1hdGgubWluKCIsIGFyZy5tYXgsICIsIHNyY1tzcmNPZmZzZXQgKyAiLCBhcmcuaW5kZXgsICJdKSkiKTsKKyAgICB9LAorCisgICAgdmlzaXRWYXJpYWJsZSh2YXJpYWJsZSkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCJ2IiwgdmFyaWFibGUuaW5kZXgpOworICAgIH0sCisKKyAgICB2aXNpdExpdGVyYWwobGl0ZXJhbCkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKGxpdGVyYWwubnVtYmVyKTsKKyAgICB9LAorCisgICAgdmlzaXRCaW5hcnlPcGVyYXRpb24ob3BlcmF0aW9uKSB7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIigiKTsKKyAgICAgIG9wZXJhdGlvbi5hcmcxLnZpc2l0KHRoaXMpOworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCIgIiwgb3BlcmF0aW9uLm9wLCAiICIpOworICAgICAgb3BlcmF0aW9uLmFyZzIudmlzaXQodGhpcyk7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIikiKTsKKyAgICB9LAorCisgICAgdmlzaXRWYXJpYWJsZURlZmluaXRpb24oZGVmaW5pdGlvbikgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCJ2YXIgIik7CisgICAgICBkZWZpbml0aW9uLnZhcmlhYmxlLnZpc2l0KHRoaXMpOworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCIgPSAiKTsKKyAgICAgIGRlZmluaXRpb24uYXJnLnZpc2l0KHRoaXMpOworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCI7Iik7CisgICAgfSwKKworICAgIHZpc2l0TWluKG1heCkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCJNYXRoLm1pbigiKTsKKyAgICAgIG1heC5hcmcudmlzaXQodGhpcyk7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIiwgIiwgbWF4Lm1heCwgIikiKTsKKyAgICB9LAorCisgICAgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gdGhpcy5wYXJ0cy5qb2luKCIiKTsKKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSB7CisgICAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIubnVtYmVyID09PSAwKSB7CisgICAgICByZXR1cm4gbnVtMTsKKyAgICB9CisKKyAgICBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMS5udW1iZXIgPT09IDApIHsKKyAgICAgIHJldHVybiBudW0yOworICAgIH0KKworICAgIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgeworICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICsgbnVtMi5udW1iZXIpOworICAgIH0KKworICAgIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIrIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gKyBudW0yLm1pbiwgbnVtMS5tYXggKyBudW0yLm1heCk7CisgIH0KKworICBmdW5jdGlvbiBidWlsZE11bE9wZXJhdGlvbihudW0xLCBudW0yKSB7CisgICAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiKSB7CisgICAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApOworICAgICAgfSBlbHNlIGlmIChudW0yLm51bWJlciA9PT0gMSkgeworICAgICAgICByZXR1cm4gbnVtMTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICogbnVtMi5udW1iZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgeworICAgICAgaWYgKG51bTEubnVtYmVyID09PSAwKSB7CisgICAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbCgwKTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS5udW1iZXIgPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIG51bTI7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1pbiA9IE1hdGgubWluKG51bTEubWluICogbnVtMi5taW4sIG51bTEubWluICogbnVtMi5tYXgsIG51bTEubWF4ICogbnVtMi5taW4sIG51bTEubWF4ICogbnVtMi5tYXgpOworICAgIHZhciBtYXggPSBNYXRoLm1heChudW0xLm1pbiAqIG51bTIubWluLCBudW0xLm1pbiAqIG51bTIubWF4LCBudW0xLm1heCAqIG51bTIubWluLCBudW0xLm1heCAqIG51bTIubWF4KTsKKyAgICByZXR1cm4gbmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiKiIsIG51bTEsIG51bTIsIG1pbiwgbWF4KTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkU3ViT3BlcmF0aW9uKG51bTEsIG51bTIpIHsKKyAgICBpZiAobnVtMi50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgIGlmIChudW0yLm51bWJlciA9PT0gMCkgeworICAgICAgICByZXR1cm4gbnVtMTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyIC0gbnVtMi5udW1iZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChudW0yLnR5cGUgPT09ICJiaW5hcnkiICYmIG51bTIub3AgPT09ICItIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLm51bWJlciA9PT0gMSAmJiBudW0yLmFyZzEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIuYXJnMS5udW1iZXIgPT09IDEpIHsKKyAgICAgIHJldHVybiBudW0yLmFyZzI7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIi0iLCBudW0xLCBudW0yLCBudW0xLm1pbiAtIG51bTIubWF4LCBudW0xLm1heCAtIG51bTIubWluKTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIG1heCkgeworICAgIGlmIChudW0xLm1pbiA+PSBtYXgpIHsKKyAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChtYXgpOworICAgIH0gZWxzZSBpZiAobnVtMS5tYXggPD0gbWF4KSB7CisgICAgICByZXR1cm4gbnVtMTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEFzdE1pbihudW0xLCBtYXgpOworICB9CisKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyKCkge30KKworICBQb3N0U2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0geworICAgIGNvbXBpbGU6IGZ1bmN0aW9uIFBvc3RTY3JpcHRDb21waWxlcl9jb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpIHsKKyAgICAgIHZhciBzdGFjayA9IFtdOworICAgICAgdmFyIGluc3RydWN0aW9ucyA9IFtdOworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggPj4gMSwKKyAgICAgICAgICBvdXRwdXRTaXplID0gcmFuZ2UubGVuZ3RoID4+IDE7CisgICAgICB2YXIgbGFzdFJlZ2lzdGVyID0gMDsKKyAgICAgIHZhciBuLCBqOworICAgICAgdmFyIG51bTEsIG51bTIsIGFzdDEsIGFzdDIsIHRtcFZhciwgaXRlbTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNpemU7IGkrKykgeworICAgICAgICBzdGFjay5wdXNoKG5ldyBBc3RBcmd1bWVudChpLCBkb21haW5baSAqIDJdLCBkb21haW5baSAqIDIgKyAxXSkpOworICAgICAgfQorCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb2RlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IGNvZGVbaV07CisKKyAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAibnVtYmVyIikgeworICAgICAgICAgIHN0YWNrLnB1c2gobmV3IEFzdExpdGVyYWwoaXRlbSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChpdGVtKSB7CisgICAgICAgICAgY2FzZSAiYWRkIjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkQWRkT3BlcmF0aW9uKG51bTEsIG51bTIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiY3ZyIjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm11bCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChidWlsZE11bE9wZXJhdGlvbihudW0xLCBudW0yKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInN1YiI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChidWlsZFN1Yk9wZXJhdGlvbihudW0xLCBudW0yKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImV4Y2giOgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzdDEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGFzdDIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYXN0MSwgYXN0Mik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInBvcCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhY2sucG9wKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImluZGV4IjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmIChudW0xLnR5cGUgIT09ICJsaXRlcmFsIikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbiA9IG51bTEubnVtYmVyOworCisgICAgICAgICAgICBpZiAobiA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIobikgfHwgc3RhY2subGVuZ3RoIDwgbikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXN0MSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXTsKKworICAgICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTsKKyAgICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXSA9IHRtcFZhcjsKKyAgICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImR1cCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2RlW2kgKyAxXSA9PT0gIm51bWJlciIgJiYgY29kZVtpICsgMl0gPT09ICJndCIgJiYgY29kZVtpICsgM10gPT09IGkgKyA3ICYmIGNvZGVbaSArIDRdID09PSAianoiICYmIGNvZGVbaSArIDVdID09PSAicG9wIiAmJiBjb2RlW2kgKyA2XSA9PT0gY29kZVtpICsgMV0pIHsKKyAgICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIGNvZGVbaSArIDFdKSk7CisgICAgICAgICAgICAgIGkgKz0gNjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzdDEgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKKworICAgICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTsKKyAgICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID0gdG1wVmFyOworICAgICAgICAgICAgc3RhY2sucHVzaCh0bXBWYXIpOworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2gobmV3IEFzdFZhcmlhYmxlRGVmaW5pdGlvbih0bXBWYXIsIGFzdDEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAicm9sbCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAobnVtMi50eXBlICE9PSAibGl0ZXJhbCIgfHwgbnVtMS50eXBlICE9PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGogPSBudW0yLm51bWJlcjsKKyAgICAgICAgICAgIG4gPSBudW0xLm51bWJlcjsKKworICAgICAgICAgICAgaWYgKG4gPD0gMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihqKSB8fCBzdGFjay5sZW5ndGggPCBuKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBqID0gKGogJSBuICsgbikgJSBuOworCisgICAgICAgICAgICBpZiAoaiA9PT0gMCkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoc3RhY2ssIHN0YWNrLnNwbGljZShzdGFjay5sZW5ndGggLSBuLCBuIC0gaikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN0YWNrLmxlbmd0aCAhPT0gb3V0cHV0U2l6ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIHJlc3VsdCA9IFtdOworICAgICAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGluc3RydWN0aW9uKSB7CisgICAgICAgIHZhciBzdGF0ZW1lbnRCdWlsZGVyID0gbmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpOworICAgICAgICBpbnN0cnVjdGlvbi52aXNpdChzdGF0ZW1lbnRCdWlsZGVyKTsKKyAgICAgICAgcmVzdWx0LnB1c2goc3RhdGVtZW50QnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgIH0pOworICAgICAgc3RhY2suZm9yRWFjaChmdW5jdGlvbiAoZXhwciwgaSkgeworICAgICAgICB2YXIgc3RhdGVtZW50QnVpbGRlciA9IG5ldyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKTsKKyAgICAgICAgZXhwci52aXNpdChzdGF0ZW1lbnRCdWlsZGVyKTsKKyAgICAgICAgdmFyIG1pbiA9IHJhbmdlW2kgKiAyXSwKKyAgICAgICAgICAgIG1heCA9IHJhbmdlW2kgKiAyICsgMV07CisgICAgICAgIHZhciBvdXQgPSBbc3RhdGVtZW50QnVpbGRlci50b1N0cmluZygpXTsKKworICAgICAgICBpZiAobWluID4gZXhwci5taW4pIHsKKyAgICAgICAgICBvdXQudW5zaGlmdCgiTWF0aC5tYXgoIiwgbWluLCAiLCAiKTsKKyAgICAgICAgICBvdXQucHVzaCgiKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1heCA8IGV4cHIubWF4KSB7CisgICAgICAgICAgb3V0LnVuc2hpZnQoIk1hdGgubWluKCIsIG1heCwgIiwgIik7CisgICAgICAgICAgb3V0LnB1c2goIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC51bnNoaWZ0KCJkZXN0W2Rlc3RPZmZzZXQgKyAiLCBpLCAiXSA9ICIpOworICAgICAgICBvdXQucHVzaCgiOyIpOworICAgICAgICByZXN1bHQucHVzaChvdXQuam9pbigiIikpOworICAgICAgfSk7CisgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oIlxuIik7CisgICAgfQorICB9OworICByZXR1cm4gUG9zdFNjcmlwdENvbXBpbGVyOworfSgpOworCitleHBvcnRzLlBvc3RTY3JpcHRDb21waWxlciA9IFBvc3RTY3JpcHRDb21waWxlcjsKKworLyoqKi8gfSksCisvKiA0MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBvc3RTY3JpcHRQYXJzZXIgPSBleHBvcnRzLlBvc3RTY3JpcHRMZXhlciA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKworY2xhc3MgUG9zdFNjcmlwdFBhcnNlciB7CisgIGNvbnN0cnVjdG9yKGxleGVyKSB7CisgICAgdGhpcy5sZXhlciA9IGxleGVyOworICAgIHRoaXMub3BlcmF0b3JzID0gW107CisgICAgdGhpcy50b2tlbiA9IG51bGw7CisgICAgdGhpcy5wcmV2ID0gbnVsbDsKKyAgfQorCisgIG5leHRUb2tlbigpIHsKKyAgICB0aGlzLnByZXYgPSB0aGlzLnRva2VuOworICAgIHRoaXMudG9rZW4gPSB0aGlzLmxleGVyLmdldFRva2VuKCk7CisgIH0KKworICBhY2NlcHQodHlwZSkgeworICAgIGlmICh0aGlzLnRva2VuLnR5cGUgPT09IHR5cGUpIHsKKyAgICAgIHRoaXMubmV4dFRva2VuKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBleHBlY3QodHlwZSkgeworICAgIGlmICh0aGlzLmFjY2VwdCh0eXBlKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbmV4cGVjdGVkIHN5bWJvbDogZm91bmQgJHt0aGlzLnRva2VuLnR5cGV9IGV4cGVjdGVkICR7dHlwZX0uYCk7CisgIH0KKworICBwYXJzZSgpIHsKKyAgICB0aGlzLm5leHRUb2tlbigpOworICAgIHRoaXMuZXhwZWN0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSk7CisgICAgdGhpcy5wYXJzZUJsb2NrKCk7CisgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKKyAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnM7CisgIH0KKworICBwYXJzZUJsb2NrKCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuTlVNQkVSKSkgeworICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk9QRVJBVE9SKSkgeworICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSkpIHsKKyAgICAgICAgdGhpcy5wYXJzZUNvbmRpdGlvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHBhcnNlQ29uZGl0aW9uKCkgeworICAgIGNvbnN0IGNvbmRpdGlvbkxvY2F0aW9uID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOworICAgIHRoaXMub3BlcmF0b3JzLnB1c2gobnVsbCwgbnVsbCk7CisgICAgdGhpcy5wYXJzZUJsb2NrKCk7CisgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKKworICAgIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRikpIHsKKyAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKKyAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSAianoiOworICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFKSkgeworICAgICAgY29uc3QganVtcExvY2F0aW9uID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOworICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaChudWxsLCBudWxsKTsKKyAgICAgIGNvbnN0IGVuZE9mVHJ1ZSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKKyAgICAgIHRoaXMucGFyc2VCbG9jaygpOworICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKKyAgICAgIHRoaXMuZXhwZWN0KFBvc3RTY3JpcHRUb2tlblR5cGVzLklGRUxTRSk7CisgICAgICB0aGlzLm9wZXJhdG9yc1tqdW1wTG9jYXRpb25dID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOworICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uICsgMV0gPSAiaiI7CisgICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbl0gPSBlbmRPZlRydWU7CisgICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbiArIDFdID0gImp6IjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJQUyBGdW5jdGlvbjogZXJyb3IgcGFyc2luZyBjb25kaXRpb25hbC4iKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLlBvc3RTY3JpcHRQYXJzZXIgPSBQb3N0U2NyaXB0UGFyc2VyOworY29uc3QgUG9zdFNjcmlwdFRva2VuVHlwZXMgPSB7CisgIExCUkFDRTogMCwKKyAgUkJSQUNFOiAxLAorICBOVU1CRVI6IDIsCisgIE9QRVJBVE9SOiAzLAorICBJRjogNCwKKyAgSUZFTFNFOiA1Cit9OworCitjb25zdCBQb3N0U2NyaXB0VG9rZW4gPSBmdW5jdGlvbiBQb3N0U2NyaXB0VG9rZW5DbG9zdXJlKCkgeworICBjb25zdCBvcENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICBjbGFzcyBQb3N0U2NyaXB0VG9rZW4geworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKSB7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHN0YXRpYyBnZXRPcGVyYXRvcihvcCkgeworICAgICAgY29uc3Qgb3BWYWx1ZSA9IG9wQ2FjaGVbb3BdOworCisgICAgICBpZiAob3BWYWx1ZSkgeworICAgICAgICByZXR1cm4gb3BWYWx1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG9wQ2FjaGVbb3BdID0gbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5PUEVSQVRPUiwgb3ApOworICAgIH0KKworICAgIHN0YXRpYyBnZXQgTEJSQUNFKCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJMQlJBQ0UiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSwgInsiKSk7CisgICAgfQorCisgICAgc3RhdGljIGdldCBSQlJBQ0UoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIlJCUkFDRSIsIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFLCAifSIpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZ2V0IElGKCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJJRiIsIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuSUYsICJJRiIpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZ2V0IElGRUxTRSgpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiSUZFTFNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRkVMU0UsICJJRkVMU0UiKSk7CisgICAgfQorCisgIH0KKworICByZXR1cm4gUG9zdFNjcmlwdFRva2VuOworfSgpOworCitjbGFzcyBQb3N0U2NyaXB0TGV4ZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0pIHsKKyAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgdGhpcy5zdHJCdWYgPSBbXTsKKyAgfQorCisgIG5leHRDaGFyKCkgeworICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICB9CisKKyAgZ2V0VG9rZW4oKSB7CisgICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKKyAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkVPRjsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbW1lbnQpIHsKKyAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CisgICAgICAgICAgY29tbWVudCA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CisgICAgICAgIGNvbW1lbnQgPSB0cnVlOworICAgICAgfSBlbHNlIGlmICghKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNoIHwgMCkgeworICAgICAgY2FzZSAweDMwOgorICAgICAgY2FzZSAweDMxOgorICAgICAgY2FzZSAweDMyOgorICAgICAgY2FzZSAweDMzOgorICAgICAgY2FzZSAweDM0OgorICAgICAgY2FzZSAweDM1OgorICAgICAgY2FzZSAweDM2OgorICAgICAgY2FzZSAweDM3OgorICAgICAgY2FzZSAweDM4OgorICAgICAgY2FzZSAweDM5OgorICAgICAgY2FzZSAweDJiOgorICAgICAgY2FzZSAweDJkOgorICAgICAgY2FzZSAweDJlOgorICAgICAgICByZXR1cm4gbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5OVU1CRVIsIHRoaXMuZ2V0TnVtYmVyKCkpOworCisgICAgICBjYXNlIDB4N2I6CisgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5MQlJBQ0U7CisKKyAgICAgIGNhc2UgMHg3ZDoKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLlJCUkFDRTsKKyAgICB9CisKKyAgICBjb25zdCBzdHJCdWYgPSB0aGlzLnN0ckJ1ZjsKKyAgICBzdHJCdWYubGVuZ3RoID0gMDsKKyAgICBzdHJCdWZbMF0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKworICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1YSB8fCBjaCA+PSAweDYxICYmIGNoIDw9IDB4N2EpKSB7CisgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CisgICAgfQorCisgICAgY29uc3Qgc3RyID0gc3RyQnVmLmpvaW4oIiIpOworCisgICAgc3dpdGNoIChzdHIudG9Mb3dlckNhc2UoKSkgeworICAgICAgY2FzZSAiaWYiOgorICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLklGOworCisgICAgICBjYXNlICJpZmVsc2UiOgorICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLklGRUxTRTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5nZXRPcGVyYXRvcihzdHIpOworICAgIH0KKyAgfQorCisgIGdldE51bWJlcigpIHsKKyAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOworICAgIHN0ckJ1Zi5sZW5ndGggPSAwOworICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOworCisgICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgeworICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSB8fCBjaCA9PT0gMHgyZCB8fCBjaCA9PT0gMHgyZSkgeworICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3RyQnVmLmpvaW4oIiIpKTsKKworICAgIGlmIChpc05hTih2YWx1ZSkpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXI6ICR7dmFsdWV9YCk7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworICB9CisKK30KKworZXhwb3J0cy5Qb3N0U2NyaXB0TGV4ZXIgPSBQb3N0U2NyaXB0TGV4ZXI7CisKKy8qKiovIH0pLAorLyogNDIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5iaWRpID0gYmlkaTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIGJhc2VUeXBlcyA9IFsiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiUyIsICJCIiwgIlMiLCAiV1MiLCAiQiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCIiwgIkIiLCAiQiIsICJTIiwgIldTIiwgIk9OIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVUIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkVTIiwgIkNTIiwgIkVTIiwgIkNTIiwgIkNTIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkNTIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJDUyIsICJPTiIsICJFVCIsICJFVCIsICJFVCIsICJFVCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIk9OIiwgIk9OIiwgIkJOIiwgIk9OIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVOIiwgIkVOIiwgIk9OIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiRU4iLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiXTsKK3ZhciBhcmFiaWNUeXBlcyA9IFsiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiT04iLCAiT04iLCAiQUwiLCAiRVQiLCAiRVQiLCAiQUwiLCAiQ1MiLCAiQUwiLCAiT04iLCAiT04iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTCIsICJBTCIsICIiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiRVQiLCAiQU4iLCAiQU4iLCAiQUwiLCAiQUwiLCAiQUwiLCAiTlNNIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTiIsICJPTiIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTCIsICJBTCIsICJOU00iLCAiTlNNIiwgIk9OIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTCIsICJBTCIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCJdOworCitmdW5jdGlvbiBpc09kZChpKSB7CisgIHJldHVybiAoaSAmIDEpICE9PSAwOworfQorCitmdW5jdGlvbiBpc0V2ZW4oaSkgeworICByZXR1cm4gKGkgJiAxKSA9PT0gMDsKK30KKworZnVuY3Rpb24gZmluZFVuZXF1YWwoYXJyLCBzdGFydCwgdmFsdWUpIHsKKyAgZm9yICh2YXIgaiA9IHN0YXJ0LCBqaiA9IGFyci5sZW5ndGg7IGogPCBqajsgKytqKSB7CisgICAgaWYgKGFycltqXSAhPT0gdmFsdWUpIHsKKyAgICAgIHJldHVybiBqOworICAgIH0KKyAgfQorCisgIHJldHVybiBqOworfQorCitmdW5jdGlvbiBzZXRWYWx1ZXMoYXJyLCBzdGFydCwgZW5kLCB2YWx1ZSkgeworICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBlbmQ7ICsraikgeworICAgIGFycltqXSA9IHZhbHVlOworICB9Cit9CisKK2Z1bmN0aW9uIHJldmVyc2VWYWx1ZXMoYXJyLCBzdGFydCwgZW5kKSB7CisgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIDE7IGkgPCBqOyArK2ksIC0taikgeworICAgIHZhciB0ZW1wID0gYXJyW2ldOworICAgIGFycltpXSA9IGFycltqXTsKKyAgICBhcnJbal0gPSB0ZW1wOworICB9Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsID0gZmFsc2UpIHsKKyAgbGV0IGRpciA9ICJsdHIiOworCisgIGlmICh2ZXJ0aWNhbCkgeworICAgIGRpciA9ICJ0dGIiOworICB9IGVsc2UgaWYgKCFpc0xUUikgeworICAgIGRpciA9ICJydGwiOworICB9CisKKyAgcmV0dXJuIHsKKyAgICBzdHIsCisgICAgZGlyCisgIH07Cit9CisKK3ZhciBjaGFycyA9IFtdOwordmFyIHR5cGVzID0gW107CisKK2Z1bmN0aW9uIGJpZGkoc3RyLCBzdGFydExldmVsLCB2ZXJ0aWNhbCkgeworICB2YXIgaXNMVFIgPSB0cnVlOworICB2YXIgc3RyTGVuZ3RoID0gc3RyLmxlbmd0aDsKKworICBpZiAoc3RyTGVuZ3RoID09PSAwIHx8IHZlcnRpY2FsKSB7CisgICAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsKTsKKyAgfQorCisgIGNoYXJzLmxlbmd0aCA9IHN0ckxlbmd0aDsKKyAgdHlwZXMubGVuZ3RoID0gc3RyTGVuZ3RoOworICB2YXIgbnVtQmlkaSA9IDA7CisgIHZhciBpLCBpaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICBjaGFyc1tpXSA9IHN0ci5jaGFyQXQoaSk7CisgICAgdmFyIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7CisgICAgdmFyIGNoYXJUeXBlID0gIkwiOworCisgICAgaWYgKGNoYXJDb2RlIDw9IDB4MDBmZikgeworICAgICAgY2hhclR5cGUgPSBiYXNlVHlwZXNbY2hhckNvZGVdOworICAgIH0gZWxzZSBpZiAoMHgwNTkwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDVmNCkgeworICAgICAgY2hhclR5cGUgPSAiUiI7CisgICAgfSBlbHNlIGlmICgweDA2MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNmZmKSB7CisgICAgICBjaGFyVHlwZSA9IGFyYWJpY1R5cGVzW2NoYXJDb2RlICYgMHhmZl07CisKKyAgICAgIGlmICghY2hhclR5cGUpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJCaWRpOiBpbnZhbGlkIFVuaWNvZGUgY2hhcmFjdGVyICIgKyBjaGFyQ29kZS50b1N0cmluZygxNikpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoMHgwNzAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDhhYykgeworICAgICAgY2hhclR5cGUgPSAiQUwiOworICAgIH0KKworICAgIGlmIChjaGFyVHlwZSA9PT0gIlIiIHx8IGNoYXJUeXBlID09PSAiQUwiIHx8IGNoYXJUeXBlID09PSAiQU4iKSB7CisgICAgICBudW1CaWRpKys7CisgICAgfQorCisgICAgdHlwZXNbaV0gPSBjaGFyVHlwZTsKKyAgfQorCisgIGlmIChudW1CaWRpID09PSAwKSB7CisgICAgaXNMVFIgPSB0cnVlOworICAgIHJldHVybiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSKTsKKyAgfQorCisgIGlmIChzdGFydExldmVsID09PSAtMSkgeworICAgIGlmIChudW1CaWRpIC8gc3RyTGVuZ3RoIDwgMC4zKSB7CisgICAgICBpc0xUUiA9IHRydWU7CisgICAgICBzdGFydExldmVsID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaXNMVFIgPSBmYWxzZTsKKyAgICAgIHN0YXJ0TGV2ZWwgPSAxOworICAgIH0KKyAgfQorCisgIHZhciBsZXZlbHMgPSBbXTsKKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICBsZXZlbHNbaV0gPSBzdGFydExldmVsOworICB9CisKKyAgdmFyIGUgPSBpc09kZChzdGFydExldmVsKSA/ICJSIiA6ICJMIjsKKyAgdmFyIHNvciA9IGU7CisgIHZhciBlb3IgPSBzb3I7CisgIHZhciBsYXN0VHlwZSA9IHNvcjsKKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICBpZiAodHlwZXNbaV0gPT09ICJOU00iKSB7CisgICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlOworICAgIH0gZWxzZSB7CisgICAgICBsYXN0VHlwZSA9IHR5cGVzW2ldOworICAgIH0KKyAgfQorCisgIGxhc3RUeXBlID0gc29yOworICB2YXIgdDsKKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICB0ID0gdHlwZXNbaV07CisKKyAgICBpZiAodCA9PT0gIkVOIikgeworICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZSA9PT0gIkFMIiA/ICJBTiIgOiAiRU4iOworICAgIH0gZWxzZSBpZiAodCA9PT0gIlIiIHx8IHQgPT09ICJMIiB8fCB0ID09PSAiQUwiKSB7CisgICAgICBsYXN0VHlwZSA9IHQ7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgdCA9IHR5cGVzW2ldOworCisgICAgaWYgKHQgPT09ICJBTCIpIHsKKyAgICAgIHR5cGVzW2ldID0gIlIiOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDE7IGkgPCBzdHJMZW5ndGggLSAxOyArK2kpIHsKKyAgICBpZiAodHlwZXNbaV0gPT09ICJFUyIgJiYgdHlwZXNbaSAtIDFdID09PSAiRU4iICYmIHR5cGVzW2kgKyAxXSA9PT0gIkVOIikgeworICAgICAgdHlwZXNbaV0gPSAiRU4iOworICAgIH0KKworICAgIGlmICh0eXBlc1tpXSA9PT0gIkNTIiAmJiAodHlwZXNbaSAtIDFdID09PSAiRU4iIHx8IHR5cGVzW2kgLSAxXSA9PT0gIkFOIikgJiYgdHlwZXNbaSArIDFdID09PSB0eXBlc1tpIC0gMV0pIHsKKyAgICAgIHR5cGVzW2ldID0gdHlwZXNbaSAtIDFdOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIGlmICh0eXBlc1tpXSA9PT0gIkVOIikgeworICAgICAgdmFyIGo7CisKKyAgICAgIGZvciAoaiA9IGkgLSAxOyBqID49IDA7IC0taikgeworICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGVzW2pdID0gIkVOIjsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gaSArIDE7IGogPCBzdHJMZW5ndGg7ICsraikgeworICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGVzW2pdID0gIkVOIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICB0ID0gdHlwZXNbaV07CisKKyAgICBpZiAodCA9PT0gIldTIiB8fCB0ID09PSAiRVMiIHx8IHQgPT09ICJFVCIgfHwgdCA9PT0gIkNTIikgeworICAgICAgdHlwZXNbaV0gPSAiT04iOworICAgIH0KKyAgfQorCisgIGxhc3RUeXBlID0gc29yOworCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIHQgPSB0eXBlc1tpXTsKKworICAgIGlmICh0ID09PSAiRU4iKSB7CisgICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlID09PSAiTCIgPyAiTCIgOiAiRU4iOworICAgIH0gZWxzZSBpZiAodCA9PT0gIlIiIHx8IHQgPT09ICJMIikgeworICAgICAgbGFzdFR5cGUgPSB0OworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIGlmICh0eXBlc1tpXSA9PT0gIk9OIikgeworICAgICAgdmFyIGVuZCA9IGZpbmRVbmVxdWFsKHR5cGVzLCBpICsgMSwgIk9OIik7CisgICAgICB2YXIgYmVmb3JlID0gc29yOworCisgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgYmVmb3JlID0gdHlwZXNbaSAtIDFdOworICAgICAgfQorCisgICAgICB2YXIgYWZ0ZXIgPSBlb3I7CisKKyAgICAgIGlmIChlbmQgKyAxIDwgc3RyTGVuZ3RoKSB7CisgICAgICAgIGFmdGVyID0gdHlwZXNbZW5kICsgMV07CisgICAgICB9CisKKyAgICAgIGlmIChiZWZvcmUgIT09ICJMIikgeworICAgICAgICBiZWZvcmUgPSAiUiI7CisgICAgICB9CisKKyAgICAgIGlmIChhZnRlciAhPT0gIkwiKSB7CisgICAgICAgIGFmdGVyID0gIlIiOworICAgICAgfQorCisgICAgICBpZiAoYmVmb3JlID09PSBhZnRlcikgeworICAgICAgICBzZXRWYWx1ZXModHlwZXMsIGksIGVuZCwgYmVmb3JlKTsKKyAgICAgIH0KKworICAgICAgaSA9IGVuZCAtIDE7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgaWYgKHR5cGVzW2ldID09PSAiT04iKSB7CisgICAgICB0eXBlc1tpXSA9IGU7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgdCA9IHR5cGVzW2ldOworCisgICAgaWYgKGlzRXZlbihsZXZlbHNbaV0pKSB7CisgICAgICBpZiAodCA9PT0gIlIiKSB7CisgICAgICAgIGxldmVsc1tpXSArPSAxOworICAgICAgfSBlbHNlIGlmICh0ID09PSAiQU4iIHx8IHQgPT09ICJFTiIpIHsKKyAgICAgICAgbGV2ZWxzW2ldICs9IDI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh0ID09PSAiTCIgfHwgdCA9PT0gIkFOIiB8fCB0ID09PSAiRU4iKSB7CisgICAgICAgIGxldmVsc1tpXSArPSAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZhciBoaWdoZXN0TGV2ZWwgPSAtMTsKKyAgdmFyIGxvd2VzdE9kZExldmVsID0gOTk7CisgIHZhciBsZXZlbDsKKworICBmb3IgKGkgPSAwLCBpaSA9IGxldmVscy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgbGV2ZWwgPSBsZXZlbHNbaV07CisKKyAgICBpZiAoaGlnaGVzdExldmVsIDwgbGV2ZWwpIHsKKyAgICAgIGhpZ2hlc3RMZXZlbCA9IGxldmVsOworICAgIH0KKworICAgIGlmIChsb3dlc3RPZGRMZXZlbCA+IGxldmVsICYmIGlzT2RkKGxldmVsKSkgeworICAgICAgbG93ZXN0T2RkTGV2ZWwgPSBsZXZlbDsKKyAgICB9CisgIH0KKworICBmb3IgKGxldmVsID0gaGlnaGVzdExldmVsOyBsZXZlbCA+PSBsb3dlc3RPZGRMZXZlbDsgLS1sZXZlbCkgeworICAgIHZhciBzdGFydCA9IC0xOworCisgICAgZm9yIChpID0gMCwgaWkgPSBsZXZlbHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgaWYgKGxldmVsc1tpXSA8IGxldmVsKSB7CisgICAgICAgIGlmIChzdGFydCA+PSAwKSB7CisgICAgICAgICAgcmV2ZXJzZVZhbHVlcyhjaGFycywgc3RhcnQsIGkpOworICAgICAgICAgIHN0YXJ0ID0gLTE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CisgICAgICAgIHN0YXJ0ID0gaTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhcnQgPj0gMCkgeworICAgICAgcmV2ZXJzZVZhbHVlcyhjaGFycywgc3RhcnQsIGxldmVscy5sZW5ndGgpOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDAsIGlpID0gY2hhcnMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgIHZhciBjaCA9IGNoYXJzW2ldOworCisgICAgaWYgKGNoID09PSAiPCIgfHwgY2ggPT09ICI+IikgeworICAgICAgY2hhcnNbaV0gPSAiIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gY3JlYXRlQmlkaVRleHQoY2hhcnMuam9pbigiIiksIGlzTFRSKTsKK30KKworLyoqKi8gfSksCisvKiA0MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldE1ldHJpY3MgPSB2b2lkIDA7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBnZXRNZXRyaWNzID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgdC5Db3VyaWVyID0gNjAwOworICB0WyJDb3VyaWVyLUJvbGQiXSA9IDYwMDsKKyAgdFsiQ291cmllci1Cb2xkT2JsaXF1ZSJdID0gNjAwOworICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9IDYwMDsKKyAgdC5IZWx2ZXRpY2EgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNzg7CisgICAgdC5leGNsYW0gPSAyNzg7CisgICAgdC5xdW90ZWRibCA9IDM1NTsKKyAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CisgICAgdC5kb2xsYXIgPSA1NTY7CisgICAgdC5wZXJjZW50ID0gODg5OworICAgIHQuYW1wZXJzYW5kID0gNjY3OworICAgIHQucXVvdGVyaWdodCA9IDIyMjsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDM4OTsKKyAgICB0LnBsdXMgPSA1ODQ7CisgICAgdC5jb21tYSA9IDI3ODsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI3ODsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDU1NjsKKyAgICB0Lm9uZSA9IDU1NjsKKyAgICB0LnR3byA9IDU1NjsKKyAgICB0LnRocmVlID0gNTU2OworICAgIHQuZm91ciA9IDU1NjsKKyAgICB0LmZpdmUgPSA1NTY7CisgICAgdC5zaXggPSA1NTY7CisgICAgdC5zZXZlbiA9IDU1NjsKKyAgICB0LmVpZ2h0ID0gNTU2OworICAgIHQubmluZSA9IDU1NjsKKyAgICB0LmNvbG9uID0gMjc4OworICAgIHQuc2VtaWNvbG9uID0gMjc4OworICAgIHQubGVzcyA9IDU4NDsKKyAgICB0LmVxdWFsID0gNTg0OworICAgIHQuZ3JlYXRlciA9IDU4NDsKKyAgICB0LnF1ZXN0aW9uID0gNTU2OworICAgIHQuYXQgPSAxMDE1OworICAgIHQuQSA9IDY2NzsKKyAgICB0LkIgPSA2Njc7CisgICAgdC5DID0gNzIyOworICAgIHQuRCA9IDcyMjsKKyAgICB0LkUgPSA2Njc7CisgICAgdC5GID0gNjExOworICAgIHQuRyA9IDc3ODsKKyAgICB0LkggPSA3MjI7CisgICAgdC5JID0gMjc4OworICAgIHQuSiA9IDUwMDsKKyAgICB0LksgPSA2Njc7CisgICAgdC5MID0gNTU2OworICAgIHQuTSA9IDgzMzsKKyAgICB0Lk4gPSA3MjI7CisgICAgdC5PID0gNzc4OworICAgIHQuUCA9IDY2NzsKKyAgICB0LlEgPSA3Nzg7CisgICAgdC5SID0gNzIyOworICAgIHQuUyA9IDY2NzsKKyAgICB0LlQgPSA2MTE7CisgICAgdC5VID0gNzIyOworICAgIHQuViA9IDY2NzsKKyAgICB0LlcgPSA5NDQ7CisgICAgdC5YID0gNjY3OworICAgIHQuWSA9IDY2NzsKKyAgICB0LlogPSA2MTE7CisgICAgdC5icmFja2V0bGVmdCA9IDI3ODsKKyAgICB0LmJhY2tzbGFzaCA9IDI3ODsKKyAgICB0LmJyYWNrZXRyaWdodCA9IDI3ODsKKyAgICB0LmFzY2lpY2lyY3VtID0gNDY5OworICAgIHQudW5kZXJzY29yZSA9IDU1NjsKKyAgICB0LnF1b3RlbGVmdCA9IDIyMjsKKyAgICB0LmEgPSA1NTY7CisgICAgdC5iID0gNTU2OworICAgIHQuYyA9IDUwMDsKKyAgICB0LmQgPSA1NTY7CisgICAgdC5lID0gNTU2OworICAgIHQuZiA9IDI3ODsKKyAgICB0LmcgPSA1NTY7CisgICAgdC5oID0gNTU2OworICAgIHQuaSA9IDIyMjsKKyAgICB0LmogPSAyMjI7CisgICAgdC5rID0gNTAwOworICAgIHQubCA9IDIyMjsKKyAgICB0Lm0gPSA4MzM7CisgICAgdC5uID0gNTU2OworICAgIHQubyA9IDU1NjsKKyAgICB0LnAgPSA1NTY7CisgICAgdC5xID0gNTU2OworICAgIHQuciA9IDMzMzsKKyAgICB0LnMgPSA1MDA7CisgICAgdC50ID0gMjc4OworICAgIHQudSA9IDU1NjsKKyAgICB0LnYgPSA1MDA7CisgICAgdC53ID0gNzIyOworICAgIHQueCA9IDUwMDsKKyAgICB0LnkgPSA1MDA7CisgICAgdC56ID0gNTAwOworICAgIHQuYnJhY2VsZWZ0ID0gMzM0OworICAgIHQuYmFyID0gMjYwOworICAgIHQuYnJhY2VyaWdodCA9IDMzNDsKKyAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7CisgICAgdC5leGNsYW1kb3duID0gMzMzOworICAgIHQuY2VudCA9IDU1NjsKKyAgICB0LnN0ZXJsaW5nID0gNTU2OworICAgIHQuZnJhY3Rpb24gPSAxNjc7CisgICAgdC55ZW4gPSA1NTY7CisgICAgdC5mbG9yaW4gPSA1NTY7CisgICAgdC5zZWN0aW9uID0gNTU2OworICAgIHQuY3VycmVuY3kgPSA1NTY7CisgICAgdC5xdW90ZXNpbmdsZSA9IDE5MTsKKyAgICB0LnF1b3RlZGJsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7CisgICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOworICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CisgICAgdC5maSA9IDUwMDsKKyAgICB0LmZsID0gNTAwOworICAgIHQuZW5kYXNoID0gNTU2OworICAgIHQuZGFnZ2VyID0gNTU2OworICAgIHQuZGFnZ2VyZGJsID0gNTU2OworICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CisgICAgdC5wYXJhZ3JhcGggPSA1Mzc7CisgICAgdC5idWxsZXQgPSAzNTA7CisgICAgdC5xdW90ZXNpbmdsYmFzZSA9IDIyMjsKKyAgICB0LnF1b3RlZGJsYmFzZSA9IDMzMzsKKyAgICB0LnF1b3RlZGJscmlnaHQgPSAzMzM7CisgICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKKyAgICB0LmVsbGlwc2lzID0gMTAwMDsKKyAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKKyAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKKyAgICB0LmdyYXZlID0gMzMzOworICAgIHQuYWN1dGUgPSAzMzM7CisgICAgdC5jaXJjdW1mbGV4ID0gMzMzOworICAgIHQudGlsZGUgPSAzMzM7CisgICAgdC5tYWNyb24gPSAzMzM7CisgICAgdC5icmV2ZSA9IDMzMzsKKyAgICB0LmRvdGFjY2VudCA9IDMzMzsKKyAgICB0LmRpZXJlc2lzID0gMzMzOworICAgIHQucmluZyA9IDMzMzsKKyAgICB0LmNlZGlsbGEgPSAzMzM7CisgICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CisgICAgdC5vZ29uZWsgPSAzMzM7CisgICAgdC5jYXJvbiA9IDMzMzsKKyAgICB0LmVtZGFzaCA9IDEwMDA7CisgICAgdC5BRSA9IDEwMDA7CisgICAgdC5vcmRmZW1pbmluZSA9IDM3MDsKKyAgICB0LkxzbGFzaCA9IDU1NjsKKyAgICB0Lk9zbGFzaCA9IDc3ODsKKyAgICB0Lk9FID0gMTAwMDsKKyAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTsKKyAgICB0LmFlID0gODg5OworICAgIHQuZG90bGVzc2kgPSAyNzg7CisgICAgdC5sc2xhc2ggPSAyMjI7CisgICAgdC5vc2xhc2ggPSA2MTE7CisgICAgdC5vZSA9IDk0NDsKKyAgICB0Lmdlcm1hbmRibHMgPSA2MTE7CisgICAgdC5JZGllcmVzaXMgPSAyNzg7CisgICAgdC5lYWN1dGUgPSA1NTY7CisgICAgdC5hYnJldmUgPSA1NTY7CisgICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OworICAgIHQuZWNhcm9uID0gNTU2OworICAgIHQuWWRpZXJlc2lzID0gNjY3OworICAgIHQuZGl2aWRlID0gNTg0OworICAgIHQuWWFjdXRlID0gNjY3OworICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hYWN1dGUgPSA1NTY7CisgICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LnlhY3V0ZSA9IDUwMDsKKyAgICB0LnNjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0LmVjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuVXJpbmcgPSA3MjI7CisgICAgdC5VZGllcmVzaXMgPSA3MjI7CisgICAgdC5hb2dvbmVrID0gNTU2OworICAgIHQuVWFjdXRlID0gNzIyOworICAgIHQudW9nb25layA9IDU1NjsKKyAgICB0LkVkaWVyZXNpcyA9IDY2NzsKKyAgICB0LkRjcm9hdCA9IDcyMjsKKyAgICB0LmNvbW1hYWNjZW50ID0gMjUwOworICAgIHQuY29weXJpZ2h0ID0gNzM3OworICAgIHQuRW1hY3JvbiA9IDY2NzsKKyAgICB0LmNjYXJvbiA9IDUwMDsKKyAgICB0LmFyaW5nID0gNTU2OworICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOworICAgIHQubGFjdXRlID0gMjIyOworICAgIHQuYWdyYXZlID0gNTU2OworICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOworICAgIHQuQ2FjdXRlID0gNzIyOworICAgIHQuYXRpbGRlID0gNTU2OworICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKKyAgICB0LnNjYXJvbiA9IDUwMDsKKyAgICB0LnNjZWRpbGxhID0gNTAwOworICAgIHQuaWFjdXRlID0gMjc4OworICAgIHQubG96ZW5nZSA9IDQ3MTsKKyAgICB0LlJjYXJvbiA9IDcyMjsKKyAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKKyAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5BbWFjcm9uID0gNjY3OworICAgIHQucmNhcm9uID0gMzMzOworICAgIHQuY2NlZGlsbGEgPSA1MDA7CisgICAgdC5aZG90YWNjZW50ID0gNjExOworICAgIHQuVGhvcm4gPSA2Njc7CisgICAgdC5PbWFjcm9uID0gNzc4OworICAgIHQuUmFjdXRlID0gNzIyOworICAgIHQuU2FjdXRlID0gNjY3OworICAgIHQuZGNhcm9uID0gNjQzOworICAgIHQuVW1hY3JvbiA9IDcyMjsKKyAgICB0LnVyaW5nID0gNTU2OworICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMzsKKyAgICB0Lk9ncmF2ZSA9IDc3ODsKKyAgICB0LkFncmF2ZSA9IDY2NzsKKyAgICB0LkFicmV2ZSA9IDY2NzsKKyAgICB0Lm11bHRpcGx5ID0gNTg0OworICAgIHQudWFjdXRlID0gNTU2OworICAgIHQuVGNhcm9uID0gNjExOworICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CisgICAgdC55ZGllcmVzaXMgPSA1MDA7CisgICAgdC5OYWN1dGUgPSA3MjI7CisgICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKKyAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OworICAgIHQuYWRpZXJlc2lzID0gNTU2OworICAgIHQuZWRpZXJlc2lzID0gNTU2OworICAgIHQuY2FjdXRlID0gNTAwOworICAgIHQubmFjdXRlID0gNTU2OworICAgIHQudW1hY3JvbiA9IDU1NjsKKyAgICB0Lk5jYXJvbiA9IDcyMjsKKyAgICB0LklhY3V0ZSA9IDI3ODsKKyAgICB0LnBsdXNtaW51cyA9IDU4NDsKKyAgICB0LmJyb2tlbmJhciA9IDI2MDsKKyAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7CisgICAgdC5HYnJldmUgPSA3Nzg7CisgICAgdC5JZG90YWNjZW50ID0gMjc4OworICAgIHQuc3VtbWF0aW9uID0gNjAwOworICAgIHQuRWdyYXZlID0gNjY3OworICAgIHQucmFjdXRlID0gMzMzOworICAgIHQub21hY3JvbiA9IDU1NjsKKyAgICB0LlphY3V0ZSA9IDYxMTsKKyAgICB0LlpjYXJvbiA9IDYxMTsKKyAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKKyAgICB0LkV0aCA9IDcyMjsKKyAgICB0LkNjZWRpbGxhID0gNzIyOworICAgIHQubGNvbW1hYWNjZW50ID0gMjIyOworICAgIHQudGNhcm9uID0gMzE3OworICAgIHQuZW9nb25layA9IDU1NjsKKyAgICB0LlVvZ29uZWsgPSA3MjI7CisgICAgdC5BYWN1dGUgPSA2Njc7CisgICAgdC5BZGllcmVzaXMgPSA2Njc7CisgICAgdC5lZ3JhdmUgPSA1NTY7CisgICAgdC56YWN1dGUgPSA1MDA7CisgICAgdC5pb2dvbmVrID0gMjIyOworICAgIHQuT2FjdXRlID0gNzc4OworICAgIHQub2FjdXRlID0gNTU2OworICAgIHQuYW1hY3JvbiA9IDU1NjsKKyAgICB0LnNhY3V0ZSA9IDUwMDsKKyAgICB0LmlkaWVyZXNpcyA9IDI3ODsKKyAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OworICAgIHQuVWdyYXZlID0gNzIyOworICAgIHQuRGVsdGEgPSA2MTI7CisgICAgdC50aG9ybiA9IDU1NjsKKyAgICB0LnR3b3N1cGVyaW9yID0gMzMzOworICAgIHQuT2RpZXJlc2lzID0gNzc4OworICAgIHQubXUgPSA1NTY7CisgICAgdC5pZ3JhdmUgPSAyNzg7CisgICAgdC5vaHVuZ2FydW1sYXV0ID0gNTU2OworICAgIHQuRW9nb25layA9IDY2NzsKKyAgICB0LmRjcm9hdCA9IDU1NjsKKyAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7CisgICAgdC5TY2VkaWxsYSA9IDY2NzsKKyAgICB0LmxjYXJvbiA9IDI5OTsKKyAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LkxhY3V0ZSA9IDU1NjsKKyAgICB0LnRyYWRlbWFyayA9IDEwMDA7CisgICAgdC5lZG90YWNjZW50ID0gNTU2OworICAgIHQuSWdyYXZlID0gMjc4OworICAgIHQuSW1hY3JvbiA9IDI3ODsKKyAgICB0LkxjYXJvbiA9IDU1NjsKKyAgICB0Lm9uZWhhbGYgPSA4MzQ7CisgICAgdC5sZXNzZXF1YWwgPSA1NDk7CisgICAgdC5vY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0Lm50aWxkZSA9IDU1NjsKKyAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5FYWN1dGUgPSA2Njc7CisgICAgdC5lbWFjcm9uID0gNTU2OworICAgIHQuZ2JyZXZlID0gNTU2OworICAgIHQub25lcXVhcnRlciA9IDgzNDsKKyAgICB0LlNjYXJvbiA9IDY2NzsKKyAgICB0LlNjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5vZ3JhdmUgPSA1NTY7CisgICAgdC5DY2Fyb24gPSA3MjI7CisgICAgdC51Z3JhdmUgPSA1NTY7CisgICAgdC5yYWRpY2FsID0gNDUzOworICAgIHQuRGNhcm9uID0gNzIyOworICAgIHQucmNvbW1hYWNjZW50ID0gMzMzOworICAgIHQuTnRpbGRlID0gNzIyOworICAgIHQub3RpbGRlID0gNTU2OworICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OworICAgIHQuQXRpbGRlID0gNjY3OworICAgIHQuQW9nb25layA9IDY2NzsKKyAgICB0LkFyaW5nID0gNjY3OworICAgIHQuT3RpbGRlID0gNzc4OworICAgIHQuemRvdGFjY2VudCA9IDUwMDsKKyAgICB0LkVjYXJvbiA9IDY2NzsKKyAgICB0LklvZ29uZWsgPSAyNzg7CisgICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5taW51cyA9IDU4NDsKKyAgICB0LkljaXJjdW1mbGV4ID0gMjc4OworICAgIHQubmNhcm9uID0gNTU2OworICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQubG9naWNhbG5vdCA9IDU4NDsKKyAgICB0Lm9kaWVyZXNpcyA9IDU1NjsKKyAgICB0LnVkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lm5vdGVxdWFsID0gNTQ5OworICAgIHQuZ2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQuZXRoID0gNTU2OworICAgIHQuemNhcm9uID0gNTAwOworICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OworICAgIHQub25lc3VwZXJpb3IgPSAzMzM7CisgICAgdC5pbWFjcm9uID0gMjc4OworICAgIHQuRXVybyA9IDU1NjsKKyAgfSk7CisgIHRbIkhlbHZldGljYS1Cb2xkIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNzg7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC5xdW90ZWRibCA9IDQ3NDsKKyAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CisgICAgdC5kb2xsYXIgPSA1NTY7CisgICAgdC5wZXJjZW50ID0gODg5OworICAgIHQuYW1wZXJzYW5kID0gNzIyOworICAgIHQucXVvdGVyaWdodCA9IDI3ODsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDM4OTsKKyAgICB0LnBsdXMgPSA1ODQ7CisgICAgdC5jb21tYSA9IDI3ODsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI3ODsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDU1NjsKKyAgICB0Lm9uZSA9IDU1NjsKKyAgICB0LnR3byA9IDU1NjsKKyAgICB0LnRocmVlID0gNTU2OworICAgIHQuZm91ciA9IDU1NjsKKyAgICB0LmZpdmUgPSA1NTY7CisgICAgdC5zaXggPSA1NTY7CisgICAgdC5zZXZlbiA9IDU1NjsKKyAgICB0LmVpZ2h0ID0gNTU2OworICAgIHQubmluZSA9IDU1NjsKKyAgICB0LmNvbG9uID0gMzMzOworICAgIHQuc2VtaWNvbG9uID0gMzMzOworICAgIHQubGVzcyA9IDU4NDsKKyAgICB0LmVxdWFsID0gNTg0OworICAgIHQuZ3JlYXRlciA9IDU4NDsKKyAgICB0LnF1ZXN0aW9uID0gNjExOworICAgIHQuYXQgPSA5NzU7CisgICAgdC5BID0gNzIyOworICAgIHQuQiA9IDcyMjsKKyAgICB0LkMgPSA3MjI7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzc4OworICAgIHQuSCA9IDcyMjsKKyAgICB0LkkgPSAyNzg7CisgICAgdC5KID0gNTU2OworICAgIHQuSyA9IDcyMjsKKyAgICB0LkwgPSA2MTE7CisgICAgdC5NID0gODMzOworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3Nzg7CisgICAgdC5QID0gNjY3OworICAgIHQuUSA9IDc3ODsKKyAgICB0LlIgPSA3MjI7CisgICAgdC5TID0gNjY3OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDk0NDsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjY3OworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOworICAgIHQuYXNjaWljaXJjdW0gPSA1ODQ7CisgICAgdC51bmRlcnNjb3JlID0gNTU2OworICAgIHQucXVvdGVsZWZ0ID0gMjc4OworICAgIHQuYSA9IDU1NjsKKyAgICB0LmIgPSA2MTE7CisgICAgdC5jID0gNTU2OworICAgIHQuZCA9IDYxMTsKKyAgICB0LmUgPSA1NTY7CisgICAgdC5mID0gMzMzOworICAgIHQuZyA9IDYxMTsKKyAgICB0LmggPSA2MTE7CisgICAgdC5pID0gMjc4OworICAgIHQuaiA9IDI3ODsKKyAgICB0LmsgPSA1NTY7CisgICAgdC5sID0gMjc4OworICAgIHQubSA9IDg4OTsKKyAgICB0Lm4gPSA2MTE7CisgICAgdC5vID0gNjExOworICAgIHQucCA9IDYxMTsKKyAgICB0LnEgPSA2MTE7CisgICAgdC5yID0gMzg5OworICAgIHQucyA9IDU1NjsKKyAgICB0LnQgPSAzMzM7CisgICAgdC51ID0gNjExOworICAgIHQudiA9IDU1NjsKKyAgICB0LncgPSA3Nzg7CisgICAgdC54ID0gNTU2OworICAgIHQueSA9IDU1NjsKKyAgICB0LnogPSA1MDA7CisgICAgdC5icmFjZWxlZnQgPSAzODk7CisgICAgdC5iYXIgPSAyODA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzg5OworICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CisgICAgdC5jZW50ID0gNTU2OworICAgIHQuc3RlcmxpbmcgPSA1NTY7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDU1NjsKKyAgICB0LmZsb3JpbiA9IDU1NjsKKyAgICB0LnNlY3Rpb24gPSA1NTY7CisgICAgdC5jdXJyZW5jeSA9IDU1NjsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMjM4OworICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNjExOworICAgIHQuZmwgPSA2MTE7CisgICAgdC5lbmRhc2ggPSA1NTY7CisgICAgdC5kYWdnZXIgPSA1NTY7CisgICAgdC5kYWdnZXJkYmwgPSA1NTY7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKKyAgICB0LnBhcmFncmFwaCA9IDU1NjsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjc4OworICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOworICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNjExOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gMTAwMDsKKyAgICB0Lm9yZGZlbWluaW5lID0gMzcwOworICAgIHQuTHNsYXNoID0gNjExOworICAgIHQuT3NsYXNoID0gNzc4OworICAgIHQuT0UgPSAxMDAwOworICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OworICAgIHQuYWUgPSA4ODk7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDYxMTsKKyAgICB0Lm9lID0gOTQ0OworICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKKyAgICB0LklkaWVyZXNpcyA9IDI3ODsKKyAgICB0LmVhY3V0ZSA9IDU1NjsKKyAgICB0LmFicmV2ZSA9IDU1NjsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA2MTE7CisgICAgdC5lY2Fyb24gPSA1NTY7CisgICAgdC5ZZGllcmVzaXMgPSA2Njc7CisgICAgdC5kaXZpZGUgPSA1ODQ7CisgICAgdC5ZYWN1dGUgPSA2Njc7CisgICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LmFhY3V0ZSA9IDU1NjsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTU2OworICAgIHQuc2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1NTY7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNjExOworICAgIHQuRWRpZXJlc2lzID0gNjY3OworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3Mzc7CisgICAgdC5FbWFjcm9uID0gNjY3OworICAgIHQuY2Nhcm9uID0gNTU2OworICAgIHQuYXJpbmcgPSA1NTY7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA1NTY7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA3MjI7CisgICAgdC5hdGlsZGUgPSA1NTY7CisgICAgdC5FZG90YWNjZW50ID0gNjY3OworICAgIHQuc2Nhcm9uID0gNTU2OworICAgIHQuc2NlZGlsbGEgPSA1NTY7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDk0OworICAgIHQuUmNhcm9uID0gNzIyOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OworICAgIHQudWNpcmN1bWZsZXggPSA2MTE7CisgICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LkFtYWNyb24gPSA3MjI7CisgICAgdC5yY2Fyb24gPSAzODk7CisgICAgdC5jY2VkaWxsYSA9IDU1NjsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDY2NzsKKyAgICB0Lk9tYWNyb24gPSA3Nzg7CisgICAgdC5SYWN1dGUgPSA3MjI7CisgICAgdC5TYWN1dGUgPSA2Njc7CisgICAgdC5kY2Fyb24gPSA3NDM7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA2MTE7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOworICAgIHQuT2dyYXZlID0gNzc4OworICAgIHQuQWdyYXZlID0gNzIyOworICAgIHQuQWJyZXZlID0gNzIyOworICAgIHQubXVsdGlwbHkgPSA1ODQ7CisgICAgdC51YWN1dGUgPSA2MTE7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKKyAgICB0LnlkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hZGllcmVzaXMgPSA1NTY7CisgICAgdC5lZGllcmVzaXMgPSA1NTY7CisgICAgdC5jYWN1dGUgPSA1NTY7CisgICAgdC5uYWN1dGUgPSA2MTE7CisgICAgdC51bWFjcm9uID0gNjExOworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMjc4OworICAgIHQucGx1c21pbnVzID0gNTg0OworICAgIHQuYnJva2VuYmFyID0gMjgwOworICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKKyAgICB0LkdicmV2ZSA9IDc3ODsKKyAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2Njc7CisgICAgdC5yYWN1dGUgPSAzODk7CisgICAgdC5vbWFjcm9uID0gNjExOworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA3MjI7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzODk7CisgICAgdC5lb2dvbmVrID0gNTU2OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDcyMjsKKyAgICB0LkFkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmVncmF2ZSA9IDU1NjsKKyAgICB0LnphY3V0ZSA9IDUwMDsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3Nzg7CisgICAgdC5vYWN1dGUgPSA2MTE7CisgICAgdC5hbWFjcm9uID0gNTU2OworICAgIHQuc2FjdXRlID0gNTU2OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNjExOworICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZGllcmVzaXMgPSA3Nzg7CisgICAgdC5tdSA9IDYxMTsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7CisgICAgdC5Fb2dvbmVrID0gNjY3OworICAgIHQuZGNyb2F0ID0gNjExOworICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKKyAgICB0LlNjZWRpbGxhID0gNjY3OworICAgIHQubGNhcm9uID0gNDAwOworICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGFjdXRlID0gNjExOworICAgIHQudHJhZGVtYXJrID0gMTAwMDsKKyAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5JZ3JhdmUgPSAyNzg7CisgICAgdC5JbWFjcm9uID0gMjc4OworICAgIHQuTGNhcm9uID0gNjExOworICAgIHQub25laGFsZiA9IDgzNDsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0Lm9jaXJjdW1mbGV4ID0gNjExOworICAgIHQubnRpbGRlID0gNjExOworICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LkVhY3V0ZSA9IDY2NzsKKyAgICB0LmVtYWNyb24gPSA1NTY7CisgICAgdC5nYnJldmUgPSA2MTE7CisgICAgdC5vbmVxdWFydGVyID0gODM0OworICAgIHQuU2Nhcm9uID0gNjY3OworICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0Lm9ncmF2ZSA9IDYxMTsKKyAgICB0LkNjYXJvbiA9IDcyMjsKKyAgICB0LnVncmF2ZSA9IDYxMTsKKyAgICB0LnJhZGljYWwgPSA1NDk7CisgICAgdC5EY2Fyb24gPSA3MjI7CisgICAgdC5yY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5OdGlsZGUgPSA3MjI7CisgICAgdC5vdGlsZGUgPSA2MTE7CisgICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5BdGlsZGUgPSA3MjI7CisgICAgdC5Bb2dvbmVrID0gNzIyOworICAgIHQuQXJpbmcgPSA3MjI7CisgICAgdC5PdGlsZGUgPSA3Nzg7CisgICAgdC56ZG90YWNjZW50ID0gNTAwOworICAgIHQuRWNhcm9uID0gNjY3OworICAgIHQuSW9nb25layA9IDI3ODsKKyAgICB0Lmtjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lm1pbnVzID0gNTg0OworICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5uY2Fyb24gPSA2MTE7CisgICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CisgICAgdC5sb2dpY2Fsbm90ID0gNTg0OworICAgIHQub2RpZXJlc2lzID0gNjExOworICAgIHQudWRpZXJlc2lzID0gNjExOworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5nY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5ldGggPSA2MTE7CisgICAgdC56Y2Fyb24gPSA1MDA7CisgICAgdC5uY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKKyAgICB0LmltYWNyb24gPSAyNzg7CisgICAgdC5FdXJvID0gNTU2OworICB9KTsKKyAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNzg7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC5xdW90ZWRibCA9IDQ3NDsKKyAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CisgICAgdC5kb2xsYXIgPSA1NTY7CisgICAgdC5wZXJjZW50ID0gODg5OworICAgIHQuYW1wZXJzYW5kID0gNzIyOworICAgIHQucXVvdGVyaWdodCA9IDI3ODsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDM4OTsKKyAgICB0LnBsdXMgPSA1ODQ7CisgICAgdC5jb21tYSA9IDI3ODsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI3ODsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDU1NjsKKyAgICB0Lm9uZSA9IDU1NjsKKyAgICB0LnR3byA9IDU1NjsKKyAgICB0LnRocmVlID0gNTU2OworICAgIHQuZm91ciA9IDU1NjsKKyAgICB0LmZpdmUgPSA1NTY7CisgICAgdC5zaXggPSA1NTY7CisgICAgdC5zZXZlbiA9IDU1NjsKKyAgICB0LmVpZ2h0ID0gNTU2OworICAgIHQubmluZSA9IDU1NjsKKyAgICB0LmNvbG9uID0gMzMzOworICAgIHQuc2VtaWNvbG9uID0gMzMzOworICAgIHQubGVzcyA9IDU4NDsKKyAgICB0LmVxdWFsID0gNTg0OworICAgIHQuZ3JlYXRlciA9IDU4NDsKKyAgICB0LnF1ZXN0aW9uID0gNjExOworICAgIHQuYXQgPSA5NzU7CisgICAgdC5BID0gNzIyOworICAgIHQuQiA9IDcyMjsKKyAgICB0LkMgPSA3MjI7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzc4OworICAgIHQuSCA9IDcyMjsKKyAgICB0LkkgPSAyNzg7CisgICAgdC5KID0gNTU2OworICAgIHQuSyA9IDcyMjsKKyAgICB0LkwgPSA2MTE7CisgICAgdC5NID0gODMzOworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3Nzg7CisgICAgdC5QID0gNjY3OworICAgIHQuUSA9IDc3ODsKKyAgICB0LlIgPSA3MjI7CisgICAgdC5TID0gNjY3OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDk0NDsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjY3OworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOworICAgIHQuYXNjaWljaXJjdW0gPSA1ODQ7CisgICAgdC51bmRlcnNjb3JlID0gNTU2OworICAgIHQucXVvdGVsZWZ0ID0gMjc4OworICAgIHQuYSA9IDU1NjsKKyAgICB0LmIgPSA2MTE7CisgICAgdC5jID0gNTU2OworICAgIHQuZCA9IDYxMTsKKyAgICB0LmUgPSA1NTY7CisgICAgdC5mID0gMzMzOworICAgIHQuZyA9IDYxMTsKKyAgICB0LmggPSA2MTE7CisgICAgdC5pID0gMjc4OworICAgIHQuaiA9IDI3ODsKKyAgICB0LmsgPSA1NTY7CisgICAgdC5sID0gMjc4OworICAgIHQubSA9IDg4OTsKKyAgICB0Lm4gPSA2MTE7CisgICAgdC5vID0gNjExOworICAgIHQucCA9IDYxMTsKKyAgICB0LnEgPSA2MTE7CisgICAgdC5yID0gMzg5OworICAgIHQucyA9IDU1NjsKKyAgICB0LnQgPSAzMzM7CisgICAgdC51ID0gNjExOworICAgIHQudiA9IDU1NjsKKyAgICB0LncgPSA3Nzg7CisgICAgdC54ID0gNTU2OworICAgIHQueSA9IDU1NjsKKyAgICB0LnogPSA1MDA7CisgICAgdC5icmFjZWxlZnQgPSAzODk7CisgICAgdC5iYXIgPSAyODA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzg5OworICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CisgICAgdC5jZW50ID0gNTU2OworICAgIHQuc3RlcmxpbmcgPSA1NTY7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDU1NjsKKyAgICB0LmZsb3JpbiA9IDU1NjsKKyAgICB0LnNlY3Rpb24gPSA1NTY7CisgICAgdC5jdXJyZW5jeSA9IDU1NjsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMjM4OworICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNjExOworICAgIHQuZmwgPSA2MTE7CisgICAgdC5lbmRhc2ggPSA1NTY7CisgICAgdC5kYWdnZXIgPSA1NTY7CisgICAgdC5kYWdnZXJkYmwgPSA1NTY7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKKyAgICB0LnBhcmFncmFwaCA9IDU1NjsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjc4OworICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOworICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNjExOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gMTAwMDsKKyAgICB0Lm9yZGZlbWluaW5lID0gMzcwOworICAgIHQuTHNsYXNoID0gNjExOworICAgIHQuT3NsYXNoID0gNzc4OworICAgIHQuT0UgPSAxMDAwOworICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OworICAgIHQuYWUgPSA4ODk7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDYxMTsKKyAgICB0Lm9lID0gOTQ0OworICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKKyAgICB0LklkaWVyZXNpcyA9IDI3ODsKKyAgICB0LmVhY3V0ZSA9IDU1NjsKKyAgICB0LmFicmV2ZSA9IDU1NjsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA2MTE7CisgICAgdC5lY2Fyb24gPSA1NTY7CisgICAgdC5ZZGllcmVzaXMgPSA2Njc7CisgICAgdC5kaXZpZGUgPSA1ODQ7CisgICAgdC5ZYWN1dGUgPSA2Njc7CisgICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LmFhY3V0ZSA9IDU1NjsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTU2OworICAgIHQuc2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1NTY7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNjExOworICAgIHQuRWRpZXJlc2lzID0gNjY3OworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3Mzc7CisgICAgdC5FbWFjcm9uID0gNjY3OworICAgIHQuY2Nhcm9uID0gNTU2OworICAgIHQuYXJpbmcgPSA1NTY7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA1NTY7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA3MjI7CisgICAgdC5hdGlsZGUgPSA1NTY7CisgICAgdC5FZG90YWNjZW50ID0gNjY3OworICAgIHQuc2Nhcm9uID0gNTU2OworICAgIHQuc2NlZGlsbGEgPSA1NTY7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDk0OworICAgIHQuUmNhcm9uID0gNzIyOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OworICAgIHQudWNpcmN1bWZsZXggPSA2MTE7CisgICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LkFtYWNyb24gPSA3MjI7CisgICAgdC5yY2Fyb24gPSAzODk7CisgICAgdC5jY2VkaWxsYSA9IDU1NjsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDY2NzsKKyAgICB0Lk9tYWNyb24gPSA3Nzg7CisgICAgdC5SYWN1dGUgPSA3MjI7CisgICAgdC5TYWN1dGUgPSA2Njc7CisgICAgdC5kY2Fyb24gPSA3NDM7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA2MTE7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOworICAgIHQuT2dyYXZlID0gNzc4OworICAgIHQuQWdyYXZlID0gNzIyOworICAgIHQuQWJyZXZlID0gNzIyOworICAgIHQubXVsdGlwbHkgPSA1ODQ7CisgICAgdC51YWN1dGUgPSA2MTE7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKKyAgICB0LnlkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hZGllcmVzaXMgPSA1NTY7CisgICAgdC5lZGllcmVzaXMgPSA1NTY7CisgICAgdC5jYWN1dGUgPSA1NTY7CisgICAgdC5uYWN1dGUgPSA2MTE7CisgICAgdC51bWFjcm9uID0gNjExOworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMjc4OworICAgIHQucGx1c21pbnVzID0gNTg0OworICAgIHQuYnJva2VuYmFyID0gMjgwOworICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKKyAgICB0LkdicmV2ZSA9IDc3ODsKKyAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2Njc7CisgICAgdC5yYWN1dGUgPSAzODk7CisgICAgdC5vbWFjcm9uID0gNjExOworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA3MjI7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzODk7CisgICAgdC5lb2dvbmVrID0gNTU2OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDcyMjsKKyAgICB0LkFkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmVncmF2ZSA9IDU1NjsKKyAgICB0LnphY3V0ZSA9IDUwMDsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3Nzg7CisgICAgdC5vYWN1dGUgPSA2MTE7CisgICAgdC5hbWFjcm9uID0gNTU2OworICAgIHQuc2FjdXRlID0gNTU2OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNjExOworICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZGllcmVzaXMgPSA3Nzg7CisgICAgdC5tdSA9IDYxMTsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7CisgICAgdC5Fb2dvbmVrID0gNjY3OworICAgIHQuZGNyb2F0ID0gNjExOworICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKKyAgICB0LlNjZWRpbGxhID0gNjY3OworICAgIHQubGNhcm9uID0gNDAwOworICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGFjdXRlID0gNjExOworICAgIHQudHJhZGVtYXJrID0gMTAwMDsKKyAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5JZ3JhdmUgPSAyNzg7CisgICAgdC5JbWFjcm9uID0gMjc4OworICAgIHQuTGNhcm9uID0gNjExOworICAgIHQub25laGFsZiA9IDgzNDsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0Lm9jaXJjdW1mbGV4ID0gNjExOworICAgIHQubnRpbGRlID0gNjExOworICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LkVhY3V0ZSA9IDY2NzsKKyAgICB0LmVtYWNyb24gPSA1NTY7CisgICAgdC5nYnJldmUgPSA2MTE7CisgICAgdC5vbmVxdWFydGVyID0gODM0OworICAgIHQuU2Nhcm9uID0gNjY3OworICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0Lm9ncmF2ZSA9IDYxMTsKKyAgICB0LkNjYXJvbiA9IDcyMjsKKyAgICB0LnVncmF2ZSA9IDYxMTsKKyAgICB0LnJhZGljYWwgPSA1NDk7CisgICAgdC5EY2Fyb24gPSA3MjI7CisgICAgdC5yY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5OdGlsZGUgPSA3MjI7CisgICAgdC5vdGlsZGUgPSA2MTE7CisgICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5BdGlsZGUgPSA3MjI7CisgICAgdC5Bb2dvbmVrID0gNzIyOworICAgIHQuQXJpbmcgPSA3MjI7CisgICAgdC5PdGlsZGUgPSA3Nzg7CisgICAgdC56ZG90YWNjZW50ID0gNTAwOworICAgIHQuRWNhcm9uID0gNjY3OworICAgIHQuSW9nb25layA9IDI3ODsKKyAgICB0Lmtjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lm1pbnVzID0gNTg0OworICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5uY2Fyb24gPSA2MTE7CisgICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CisgICAgdC5sb2dpY2Fsbm90ID0gNTg0OworICAgIHQub2RpZXJlc2lzID0gNjExOworICAgIHQudWRpZXJlc2lzID0gNjExOworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5nY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5ldGggPSA2MTE7CisgICAgdC56Y2Fyb24gPSA1MDA7CisgICAgdC5uY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKKyAgICB0LmltYWNyb24gPSAyNzg7CisgICAgdC5FdXJvID0gNTU2OworICB9KTsKKyAgdFsiSGVsdmV0aWNhLU9ibGlxdWUiXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI3ODsKKyAgICB0LmV4Y2xhbSA9IDI3ODsKKyAgICB0LnF1b3RlZGJsID0gMzU1OworICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKKyAgICB0LmRvbGxhciA9IDU1NjsKKyAgICB0LnBlcmNlbnQgPSA4ODk7CisgICAgdC5hbXBlcnNhbmQgPSA2Njc7CisgICAgdC5xdW90ZXJpZ2h0ID0gMjIyOworICAgIHQucGFyZW5sZWZ0ID0gMzMzOworICAgIHQucGFyZW5yaWdodCA9IDMzMzsKKyAgICB0LmFzdGVyaXNrID0gMzg5OworICAgIHQucGx1cyA9IDU4NDsKKyAgICB0LmNvbW1hID0gMjc4OworICAgIHQuaHlwaGVuID0gMzMzOworICAgIHQucGVyaW9kID0gMjc4OworICAgIHQuc2xhc2ggPSAyNzg7CisgICAgdC56ZXJvID0gNTU2OworICAgIHQub25lID0gNTU2OworICAgIHQudHdvID0gNTU2OworICAgIHQudGhyZWUgPSA1NTY7CisgICAgdC5mb3VyID0gNTU2OworICAgIHQuZml2ZSA9IDU1NjsKKyAgICB0LnNpeCA9IDU1NjsKKyAgICB0LnNldmVuID0gNTU2OworICAgIHQuZWlnaHQgPSA1NTY7CisgICAgdC5uaW5lID0gNTU2OworICAgIHQuY29sb24gPSAyNzg7CisgICAgdC5zZW1pY29sb24gPSAyNzg7CisgICAgdC5sZXNzID0gNTg0OworICAgIHQuZXF1YWwgPSA1ODQ7CisgICAgdC5ncmVhdGVyID0gNTg0OworICAgIHQucXVlc3Rpb24gPSA1NTY7CisgICAgdC5hdCA9IDEwMTU7CisgICAgdC5BID0gNjY3OworICAgIHQuQiA9IDY2NzsKKyAgICB0LkMgPSA3MjI7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzc4OworICAgIHQuSCA9IDcyMjsKKyAgICB0LkkgPSAyNzg7CisgICAgdC5KID0gNTAwOworICAgIHQuSyA9IDY2NzsKKyAgICB0LkwgPSA1NTY7CisgICAgdC5NID0gODMzOworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3Nzg7CisgICAgdC5QID0gNjY3OworICAgIHQuUSA9IDc3ODsKKyAgICB0LlIgPSA3MjI7CisgICAgdC5TID0gNjY3OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDk0NDsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjY3OworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4OworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMjc4OworICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7CisgICAgdC51bmRlcnNjb3JlID0gNTU2OworICAgIHQucXVvdGVsZWZ0ID0gMjIyOworICAgIHQuYSA9IDU1NjsKKyAgICB0LmIgPSA1NTY7CisgICAgdC5jID0gNTAwOworICAgIHQuZCA9IDU1NjsKKyAgICB0LmUgPSA1NTY7CisgICAgdC5mID0gMjc4OworICAgIHQuZyA9IDU1NjsKKyAgICB0LmggPSA1NTY7CisgICAgdC5pID0gMjIyOworICAgIHQuaiA9IDIyMjsKKyAgICB0LmsgPSA1MDA7CisgICAgdC5sID0gMjIyOworICAgIHQubSA9IDgzMzsKKyAgICB0Lm4gPSA1NTY7CisgICAgdC5vID0gNTU2OworICAgIHQucCA9IDU1NjsKKyAgICB0LnEgPSA1NTY7CisgICAgdC5yID0gMzMzOworICAgIHQucyA9IDUwMDsKKyAgICB0LnQgPSAyNzg7CisgICAgdC51ID0gNTU2OworICAgIHQudiA9IDUwMDsKKyAgICB0LncgPSA3MjI7CisgICAgdC54ID0gNTAwOworICAgIHQueSA9IDUwMDsKKyAgICB0LnogPSA1MDA7CisgICAgdC5icmFjZWxlZnQgPSAzMzQ7CisgICAgdC5iYXIgPSAyNjA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzM0OworICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CisgICAgdC5jZW50ID0gNTU2OworICAgIHQuc3RlcmxpbmcgPSA1NTY7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDU1NjsKKyAgICB0LmZsb3JpbiA9IDU1NjsKKyAgICB0LnNlY3Rpb24gPSA1NTY7CisgICAgdC5jdXJyZW5jeSA9IDU1NjsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMTkxOworICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNTAwOworICAgIHQuZmwgPSA1MDA7CisgICAgdC5lbmRhc2ggPSA1NTY7CisgICAgdC5kYWdnZXIgPSA1NTY7CisgICAgdC5kYWdnZXJkYmwgPSA1NTY7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKKyAgICB0LnBhcmFncmFwaCA9IDUzNzsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyOworICAgIHQucXVvdGVkYmxiYXNlID0gMzMzOworICAgIHQucXVvdGVkYmxyaWdodCA9IDMzMzsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNjExOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gMTAwMDsKKyAgICB0Lm9yZGZlbWluaW5lID0gMzcwOworICAgIHQuTHNsYXNoID0gNTU2OworICAgIHQuT3NsYXNoID0gNzc4OworICAgIHQuT0UgPSAxMDAwOworICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OworICAgIHQuYWUgPSA4ODk7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDIyMjsKKyAgICB0Lm9zbGFzaCA9IDYxMTsKKyAgICB0Lm9lID0gOTQ0OworICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKKyAgICB0LklkaWVyZXNpcyA9IDI3ODsKKyAgICB0LmVhY3V0ZSA9IDU1NjsKKyAgICB0LmFicmV2ZSA9IDU1NjsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CisgICAgdC5lY2Fyb24gPSA1NTY7CisgICAgdC5ZZGllcmVzaXMgPSA2Njc7CisgICAgdC5kaXZpZGUgPSA1ODQ7CisgICAgdC5ZYWN1dGUgPSA2Njc7CisgICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFhY3V0ZSA9IDU1NjsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTAwOworICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1NTY7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNTU2OworICAgIHQuRWRpZXJlc2lzID0gNjY3OworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3Mzc7CisgICAgdC5FbWFjcm9uID0gNjY3OworICAgIHQuY2Nhcm9uID0gNTAwOworICAgIHQuYXJpbmcgPSA1NTY7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyMjI7CisgICAgdC5hZ3JhdmUgPSA1NTY7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA3MjI7CisgICAgdC5hdGlsZGUgPSA1NTY7CisgICAgdC5FZG90YWNjZW50ID0gNjY3OworICAgIHQuc2Nhcm9uID0gNTAwOworICAgIHQuc2NlZGlsbGEgPSA1MDA7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDcxOworICAgIHQuUmNhcm9uID0gNzIyOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OworICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LkFtYWNyb24gPSA2Njc7CisgICAgdC5yY2Fyb24gPSAzMzM7CisgICAgdC5jY2VkaWxsYSA9IDUwMDsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDY2NzsKKyAgICB0Lk9tYWNyb24gPSA3Nzg7CisgICAgdC5SYWN1dGUgPSA3MjI7CisgICAgdC5TYWN1dGUgPSA2Njc7CisgICAgdC5kY2Fyb24gPSA2NDM7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA1NTY7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOworICAgIHQuT2dyYXZlID0gNzc4OworICAgIHQuQWdyYXZlID0gNjY3OworICAgIHQuQWJyZXZlID0gNjY3OworICAgIHQubXVsdGlwbHkgPSA1ODQ7CisgICAgdC51YWN1dGUgPSA1NTY7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjsKKyAgICB0LnlkaWVyZXNpcyA9IDUwMDsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hZGllcmVzaXMgPSA1NTY7CisgICAgdC5lZGllcmVzaXMgPSA1NTY7CisgICAgdC5jYWN1dGUgPSA1MDA7CisgICAgdC5uYWN1dGUgPSA1NTY7CisgICAgdC51bWFjcm9uID0gNTU2OworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMjc4OworICAgIHQucGx1c21pbnVzID0gNTg0OworICAgIHQuYnJva2VuYmFyID0gMjYwOworICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKKyAgICB0LkdicmV2ZSA9IDc3ODsKKyAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2Njc7CisgICAgdC5yYWN1dGUgPSAzMzM7CisgICAgdC5vbWFjcm9uID0gNTU2OworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA3MjI7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7CisgICAgdC50Y2Fyb24gPSAzMTc7CisgICAgdC5lb2dvbmVrID0gNTU2OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDY2NzsKKyAgICB0LkFkaWVyZXNpcyA9IDY2NzsKKyAgICB0LmVncmF2ZSA9IDU1NjsKKyAgICB0LnphY3V0ZSA9IDUwMDsKKyAgICB0LmlvZ29uZWsgPSAyMjI7CisgICAgdC5PYWN1dGUgPSA3Nzg7CisgICAgdC5vYWN1dGUgPSA1NTY7CisgICAgdC5hbWFjcm9uID0gNTU2OworICAgIHQuc2FjdXRlID0gNTAwOworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNTU2OworICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZGllcmVzaXMgPSA3Nzg7CisgICAgdC5tdSA9IDU1NjsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1NTY7CisgICAgdC5Fb2dvbmVrID0gNjY3OworICAgIHQuZGNyb2F0ID0gNTU2OworICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKKyAgICB0LlNjZWRpbGxhID0gNjY3OworICAgIHQubGNhcm9uID0gMjk5OworICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGFjdXRlID0gNTU2OworICAgIHQudHJhZGVtYXJrID0gMTAwMDsKKyAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5JZ3JhdmUgPSAyNzg7CisgICAgdC5JbWFjcm9uID0gMjc4OworICAgIHQuTGNhcm9uID0gNTU2OworICAgIHQub25laGFsZiA9IDgzNDsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0Lm9jaXJjdW1mbGV4ID0gNTU2OworICAgIHQubnRpbGRlID0gNTU2OworICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LkVhY3V0ZSA9IDY2NzsKKyAgICB0LmVtYWNyb24gPSA1NTY7CisgICAgdC5nYnJldmUgPSA1NTY7CisgICAgdC5vbmVxdWFydGVyID0gODM0OworICAgIHQuU2Nhcm9uID0gNjY3OworICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0Lm9ncmF2ZSA9IDU1NjsKKyAgICB0LkNjYXJvbiA9IDcyMjsKKyAgICB0LnVncmF2ZSA9IDU1NjsKKyAgICB0LnJhZGljYWwgPSA0NTM7CisgICAgdC5EY2Fyb24gPSA3MjI7CisgICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7CisgICAgdC5OdGlsZGUgPSA3MjI7CisgICAgdC5vdGlsZGUgPSA1NTY7CisgICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5BdGlsZGUgPSA2Njc7CisgICAgdC5Bb2dvbmVrID0gNjY3OworICAgIHQuQXJpbmcgPSA2Njc7CisgICAgdC5PdGlsZGUgPSA3Nzg7CisgICAgdC56ZG90YWNjZW50ID0gNTAwOworICAgIHQuRWNhcm9uID0gNjY3OworICAgIHQuSW9nb25layA9IDI3ODsKKyAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lm1pbnVzID0gNTg0OworICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5uY2Fyb24gPSA1NTY7CisgICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC5sb2dpY2Fsbm90ID0gNTg0OworICAgIHQub2RpZXJlc2lzID0gNTU2OworICAgIHQudWRpZXJlc2lzID0gNTU2OworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5ldGggPSA1NTY7CisgICAgdC56Y2Fyb24gPSA1MDA7CisgICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKKyAgICB0LmltYWNyb24gPSAyNzg7CisgICAgdC5FdXJvID0gNTU2OworICB9KTsKKyAgdC5TeW1ib2wgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNTA7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC51bml2ZXJzYWwgPSA3MTM7CisgICAgdC5udW1iZXJzaWduID0gNTAwOworICAgIHQuZXhpc3RlbnRpYWwgPSA1NDk7CisgICAgdC5wZXJjZW50ID0gODMzOworICAgIHQuYW1wZXJzYW5kID0gNzc4OworICAgIHQuc3VjaHRoYXQgPSA0Mzk7CisgICAgdC5wYXJlbmxlZnQgPSAzMzM7CisgICAgdC5wYXJlbnJpZ2h0ID0gMzMzOworICAgIHQuYXN0ZXJpc2ttYXRoID0gNTAwOworICAgIHQucGx1cyA9IDU0OTsKKyAgICB0LmNvbW1hID0gMjUwOworICAgIHQubWludXMgPSA1NDk7CisgICAgdC5wZXJpb2QgPSAyNTA7CisgICAgdC5zbGFzaCA9IDI3ODsKKyAgICB0Lnplcm8gPSA1MDA7CisgICAgdC5vbmUgPSA1MDA7CisgICAgdC50d28gPSA1MDA7CisgICAgdC50aHJlZSA9IDUwMDsKKyAgICB0LmZvdXIgPSA1MDA7CisgICAgdC5maXZlID0gNTAwOworICAgIHQuc2l4ID0gNTAwOworICAgIHQuc2V2ZW4gPSA1MDA7CisgICAgdC5laWdodCA9IDUwMDsKKyAgICB0Lm5pbmUgPSA1MDA7CisgICAgdC5jb2xvbiA9IDI3ODsKKyAgICB0LnNlbWljb2xvbiA9IDI3ODsKKyAgICB0Lmxlc3MgPSA1NDk7CisgICAgdC5lcXVhbCA9IDU0OTsKKyAgICB0LmdyZWF0ZXIgPSA1NDk7CisgICAgdC5xdWVzdGlvbiA9IDQ0NDsKKyAgICB0LmNvbmdydWVudCA9IDU0OTsKKyAgICB0LkFscGhhID0gNzIyOworICAgIHQuQmV0YSA9IDY2NzsKKyAgICB0LkNoaSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQuRXBzaWxvbiA9IDYxMTsKKyAgICB0LlBoaSA9IDc2MzsKKyAgICB0LkdhbW1hID0gNjAzOworICAgIHQuRXRhID0gNzIyOworICAgIHQuSW90YSA9IDMzMzsKKyAgICB0LnRoZXRhMSA9IDYzMTsKKyAgICB0LkthcHBhID0gNzIyOworICAgIHQuTGFtYmRhID0gNjg2OworICAgIHQuTXUgPSA4ODk7CisgICAgdC5OdSA9IDcyMjsKKyAgICB0Lk9taWNyb24gPSA3MjI7CisgICAgdC5QaSA9IDc2ODsKKyAgICB0LlRoZXRhID0gNzQxOworICAgIHQuUmhvID0gNTU2OworICAgIHQuU2lnbWEgPSA1OTI7CisgICAgdC5UYXUgPSA2MTE7CisgICAgdC5VcHNpbG9uID0gNjkwOworICAgIHQuc2lnbWExID0gNDM5OworICAgIHQuT21lZ2EgPSA3Njg7CisgICAgdC5YaSA9IDY0NTsKKyAgICB0LlBzaSA9IDc5NTsKKyAgICB0LlpldGEgPSA2MTE7CisgICAgdC5icmFja2V0bGVmdCA9IDMzMzsKKyAgICB0LnRoZXJlZm9yZSA9IDg2MzsKKyAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKKyAgICB0LnBlcnBlbmRpY3VsYXIgPSA2NTg7CisgICAgdC51bmRlcnNjb3JlID0gNTAwOworICAgIHQucmFkaWNhbGV4ID0gNTAwOworICAgIHQuYWxwaGEgPSA2MzE7CisgICAgdC5iZXRhID0gNTQ5OworICAgIHQuY2hpID0gNTQ5OworICAgIHQuZGVsdGEgPSA0OTQ7CisgICAgdC5lcHNpbG9uID0gNDM5OworICAgIHQucGhpID0gNTIxOworICAgIHQuZ2FtbWEgPSA0MTE7CisgICAgdC5ldGEgPSA2MDM7CisgICAgdC5pb3RhID0gMzI5OworICAgIHQucGhpMSA9IDYwMzsKKyAgICB0LmthcHBhID0gNTQ5OworICAgIHQubGFtYmRhID0gNTQ5OworICAgIHQubXUgPSA1NzY7CisgICAgdC5udSA9IDUyMTsKKyAgICB0Lm9taWNyb24gPSA1NDk7CisgICAgdC5waSA9IDU0OTsKKyAgICB0LnRoZXRhID0gNTIxOworICAgIHQucmhvID0gNTQ5OworICAgIHQuc2lnbWEgPSA2MDM7CisgICAgdC50YXUgPSA0Mzk7CisgICAgdC51cHNpbG9uID0gNTc2OworICAgIHQub21lZ2ExID0gNzEzOworICAgIHQub21lZ2EgPSA2ODY7CisgICAgdC54aSA9IDQ5MzsKKyAgICB0LnBzaSA9IDY4NjsKKyAgICB0LnpldGEgPSA0OTQ7CisgICAgdC5icmFjZWxlZnQgPSA0ODA7CisgICAgdC5iYXIgPSAyMDA7CisgICAgdC5icmFjZXJpZ2h0ID0gNDgwOworICAgIHQuc2ltaWxhciA9IDU0OTsKKyAgICB0LkV1cm8gPSA3NTA7CisgICAgdC5VcHNpbG9uMSA9IDYyMDsKKyAgICB0Lm1pbnV0ZSA9IDI0NzsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQuaW5maW5pdHkgPSA3MTM7CisgICAgdC5mbG9yaW4gPSA1MDA7CisgICAgdC5jbHViID0gNzUzOworICAgIHQuZGlhbW9uZCA9IDc1MzsKKyAgICB0LmhlYXJ0ID0gNzUzOworICAgIHQuc3BhZGUgPSA3NTM7CisgICAgdC5hcnJvd2JvdGggPSAxMDQyOworICAgIHQuYXJyb3dsZWZ0ID0gOTg3OworICAgIHQuYXJyb3d1cCA9IDYwMzsKKyAgICB0LmFycm93cmlnaHQgPSA5ODc7CisgICAgdC5hcnJvd2Rvd24gPSA2MDM7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5wbHVzbWludXMgPSA1NDk7CisgICAgdC5zZWNvbmQgPSA0MTE7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5tdWx0aXBseSA9IDU0OTsKKyAgICB0LnByb3BvcnRpb25hbCA9IDcxMzsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDk0OworICAgIHQuYnVsbGV0ID0gNDYwOworICAgIHQuZGl2aWRlID0gNTQ5OworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5lcXVpdmFsZW5jZSA9IDU0OTsKKyAgICB0LmFwcHJveGVxdWFsID0gNTQ5OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQuYXJyb3d2ZXJ0ZXggPSA2MDM7CisgICAgdC5hcnJvd2hvcml6ZXggPSAxMDAwOworICAgIHQuY2FycmlhZ2VyZXR1cm4gPSA2NTg7CisgICAgdC5hbGVwaCA9IDgyMzsKKyAgICB0LklmcmFrdHVyID0gNjg2OworICAgIHQuUmZyYWt0dXIgPSA3OTU7CisgICAgdC53ZWllcnN0cmFzcyA9IDk4NzsKKyAgICB0LmNpcmNsZW11bHRpcGx5ID0gNzY4OworICAgIHQuY2lyY2xlcGx1cyA9IDc2ODsKKyAgICB0LmVtcHR5c2V0ID0gODIzOworICAgIHQuaW50ZXJzZWN0aW9uID0gNzY4OworICAgIHQudW5pb24gPSA3Njg7CisgICAgdC5wcm9wZXJzdXBlcnNldCA9IDcxMzsKKyAgICB0LnJlZmxleHN1cGVyc2V0ID0gNzEzOworICAgIHQubm90c3Vic2V0ID0gNzEzOworICAgIHQucHJvcGVyc3Vic2V0ID0gNzEzOworICAgIHQucmVmbGV4c3Vic2V0ID0gNzEzOworICAgIHQuZWxlbWVudCA9IDcxMzsKKyAgICB0Lm5vdGVsZW1lbnQgPSA3MTM7CisgICAgdC5hbmdsZSA9IDc2ODsKKyAgICB0LmdyYWRpZW50ID0gNzEzOworICAgIHQucmVnaXN0ZXJzZXJpZiA9IDc5MDsKKyAgICB0LmNvcHlyaWdodHNlcmlmID0gNzkwOworICAgIHQudHJhZGVtYXJrc2VyaWYgPSA4OTA7CisgICAgdC5wcm9kdWN0ID0gODIzOworICAgIHQucmFkaWNhbCA9IDU0OTsKKyAgICB0LmRvdG1hdGggPSAyNTA7CisgICAgdC5sb2dpY2Fsbm90ID0gNzEzOworICAgIHQubG9naWNhbGFuZCA9IDYwMzsKKyAgICB0LmxvZ2ljYWxvciA9IDYwMzsKKyAgICB0LmFycm93ZGJsYm90aCA9IDEwNDI7CisgICAgdC5hcnJvd2RibGxlZnQgPSA5ODc7CisgICAgdC5hcnJvd2RibHVwID0gNjAzOworICAgIHQuYXJyb3dkYmxyaWdodCA9IDk4NzsKKyAgICB0LmFycm93ZGJsZG93biA9IDYwMzsKKyAgICB0LmxvemVuZ2UgPSA0OTQ7CisgICAgdC5hbmdsZWxlZnQgPSAzMjk7CisgICAgdC5yZWdpc3RlcnNhbnMgPSA3OTA7CisgICAgdC5jb3B5cmlnaHRzYW5zID0gNzkwOworICAgIHQudHJhZGVtYXJrc2FucyA9IDc4NjsKKyAgICB0LnN1bW1hdGlvbiA9IDcxMzsKKyAgICB0LnBhcmVubGVmdHRwID0gMzg0OworICAgIHQucGFyZW5sZWZ0ZXggPSAzODQ7CisgICAgdC5wYXJlbmxlZnRidCA9IDM4NDsKKyAgICB0LmJyYWNrZXRsZWZ0dHAgPSAzODQ7CisgICAgdC5icmFja2V0bGVmdGV4ID0gMzg0OworICAgIHQuYnJhY2tldGxlZnRidCA9IDM4NDsKKyAgICB0LmJyYWNlbGVmdHRwID0gNDk0OworICAgIHQuYnJhY2VsZWZ0bWlkID0gNDk0OworICAgIHQuYnJhY2VsZWZ0YnQgPSA0OTQ7CisgICAgdC5icmFjZWV4ID0gNDk0OworICAgIHQuYW5nbGVyaWdodCA9IDMyOTsKKyAgICB0LmludGVncmFsID0gMjc0OworICAgIHQuaW50ZWdyYWx0cCA9IDY4NjsKKyAgICB0LmludGVncmFsZXggPSA2ODY7CisgICAgdC5pbnRlZ3JhbGJ0ID0gNjg2OworICAgIHQucGFyZW5yaWdodHRwID0gMzg0OworICAgIHQucGFyZW5yaWdodGV4ID0gMzg0OworICAgIHQucGFyZW5yaWdodGJ0ID0gMzg0OworICAgIHQuYnJhY2tldHJpZ2h0dHAgPSAzODQ7CisgICAgdC5icmFja2V0cmlnaHRleCA9IDM4NDsKKyAgICB0LmJyYWNrZXRyaWdodGJ0ID0gMzg0OworICAgIHQuYnJhY2VyaWdodHRwID0gNDk0OworICAgIHQuYnJhY2VyaWdodG1pZCA9IDQ5NDsKKyAgICB0LmJyYWNlcmlnaHRidCA9IDQ5NDsKKyAgICB0LmFwcGxlID0gNzkwOworICB9KTsKKyAgdFsiVGltZXMtUm9tYW4iXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI1MDsKKyAgICB0LmV4Y2xhbSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsID0gNDA4OworICAgIHQubnVtYmVyc2lnbiA9IDUwMDsKKyAgICB0LmRvbGxhciA9IDUwMDsKKyAgICB0LnBlcmNlbnQgPSA4MzM7CisgICAgdC5hbXBlcnNhbmQgPSA3Nzg7CisgICAgdC5xdW90ZXJpZ2h0ID0gMzMzOworICAgIHQucGFyZW5sZWZ0ID0gMzMzOworICAgIHQucGFyZW5yaWdodCA9IDMzMzsKKyAgICB0LmFzdGVyaXNrID0gNTAwOworICAgIHQucGx1cyA9IDU2NDsKKyAgICB0LmNvbW1hID0gMjUwOworICAgIHQuaHlwaGVuID0gMzMzOworICAgIHQucGVyaW9kID0gMjUwOworICAgIHQuc2xhc2ggPSAyNzg7CisgICAgdC56ZXJvID0gNTAwOworICAgIHQub25lID0gNTAwOworICAgIHQudHdvID0gNTAwOworICAgIHQudGhyZWUgPSA1MDA7CisgICAgdC5mb3VyID0gNTAwOworICAgIHQuZml2ZSA9IDUwMDsKKyAgICB0LnNpeCA9IDUwMDsKKyAgICB0LnNldmVuID0gNTAwOworICAgIHQuZWlnaHQgPSA1MDA7CisgICAgdC5uaW5lID0gNTAwOworICAgIHQuY29sb24gPSAyNzg7CisgICAgdC5zZW1pY29sb24gPSAyNzg7CisgICAgdC5sZXNzID0gNTY0OworICAgIHQuZXF1YWwgPSA1NjQ7CisgICAgdC5ncmVhdGVyID0gNTY0OworICAgIHQucXVlc3Rpb24gPSA0NDQ7CisgICAgdC5hdCA9IDkyMTsKKyAgICB0LkEgPSA3MjI7CisgICAgdC5CID0gNjY3OworICAgIHQuQyA9IDY2NzsKKyAgICB0LkQgPSA3MjI7CisgICAgdC5FID0gNjExOworICAgIHQuRiA9IDU1NjsKKyAgICB0LkcgPSA3MjI7CisgICAgdC5IID0gNzIyOworICAgIHQuSSA9IDMzMzsKKyAgICB0LkogPSAzODk7CisgICAgdC5LID0gNzIyOworICAgIHQuTCA9IDYxMTsKKyAgICB0Lk0gPSA4ODk7CisgICAgdC5OID0gNzIyOworICAgIHQuTyA9IDcyMjsKKyAgICB0LlAgPSA1NTY7CisgICAgdC5RID0gNzIyOworICAgIHQuUiA9IDY2NzsKKyAgICB0LlMgPSA1NTY7CisgICAgdC5UID0gNjExOworICAgIHQuVSA9IDcyMjsKKyAgICB0LlYgPSA3MjI7CisgICAgdC5XID0gOTQ0OworICAgIHQuWCA9IDcyMjsKKyAgICB0LlkgPSA3MjI7CisgICAgdC5aID0gNjExOworICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CisgICAgdC5iYWNrc2xhc2ggPSAyNzg7CisgICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CisgICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKKyAgICB0LnVuZGVyc2NvcmUgPSA1MDA7CisgICAgdC5xdW90ZWxlZnQgPSAzMzM7CisgICAgdC5hID0gNDQ0OworICAgIHQuYiA9IDUwMDsKKyAgICB0LmMgPSA0NDQ7CisgICAgdC5kID0gNTAwOworICAgIHQuZSA9IDQ0NDsKKyAgICB0LmYgPSAzMzM7CisgICAgdC5nID0gNTAwOworICAgIHQuaCA9IDUwMDsKKyAgICB0LmkgPSAyNzg7CisgICAgdC5qID0gMjc4OworICAgIHQuayA9IDUwMDsKKyAgICB0LmwgPSAyNzg7CisgICAgdC5tID0gNzc4OworICAgIHQubiA9IDUwMDsKKyAgICB0Lm8gPSA1MDA7CisgICAgdC5wID0gNTAwOworICAgIHQucSA9IDUwMDsKKyAgICB0LnIgPSAzMzM7CisgICAgdC5zID0gMzg5OworICAgIHQudCA9IDI3ODsKKyAgICB0LnUgPSA1MDA7CisgICAgdC52ID0gNTAwOworICAgIHQudyA9IDcyMjsKKyAgICB0LnggPSA1MDA7CisgICAgdC55ID0gNTAwOworICAgIHQueiA9IDQ0NDsKKyAgICB0LmJyYWNlbGVmdCA9IDQ4MDsKKyAgICB0LmJhciA9IDIwMDsKKyAgICB0LmJyYWNlcmlnaHQgPSA0ODA7CisgICAgdC5hc2NpaXRpbGRlID0gNTQxOworICAgIHQuZXhjbGFtZG93biA9IDMzMzsKKyAgICB0LmNlbnQgPSA1MDA7CisgICAgdC5zdGVybGluZyA9IDUwMDsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQueWVuID0gNTAwOworICAgIHQuZmxvcmluID0gNTAwOworICAgIHQuc2VjdGlvbiA9IDUwMDsKKyAgICB0LmN1cnJlbmN5ID0gNTAwOworICAgIHQucXVvdGVzaW5nbGUgPSAxODA7CisgICAgdC5xdW90ZWRibGxlZnQgPSA0NDQ7CisgICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwOworICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOworICAgIHQuZmkgPSA1NTY7CisgICAgdC5mbCA9IDU1NjsKKyAgICB0LmVuZGFzaCA9IDUwMDsKKyAgICB0LmRhZ2dlciA9IDUwMDsKKyAgICB0LmRhZ2dlcmRibCA9IDUwMDsKKyAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOworICAgIHQucGFyYWdyYXBoID0gNDUzOworICAgIHQuYnVsbGV0ID0gMzUwOworICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CisgICAgdC5xdW90ZWRibGJhc2UgPSA0NDQ7CisgICAgdC5xdW90ZWRibHJpZ2h0ID0gNDQ0OworICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA0NDQ7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSAxMDAwOworICAgIHQuQUUgPSA4ODk7CisgICAgdC5vcmRmZW1pbmluZSA9IDI3NjsKKyAgICB0LkxzbGFzaCA9IDYxMTsKKyAgICB0Lk9zbGFzaCA9IDcyMjsKKyAgICB0Lk9FID0gODg5OworICAgIHQub3JkbWFzY3VsaW5lID0gMzEwOworICAgIHQuYWUgPSA2Njc7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDUwMDsKKyAgICB0Lm9lID0gNzIyOworICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKKyAgICB0LklkaWVyZXNpcyA9IDMzMzsKKyAgICB0LmVhY3V0ZSA9IDQ0NDsKKyAgICB0LmFicmV2ZSA9IDQ0NDsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5lY2Fyb24gPSA0NDQ7CisgICAgdC5ZZGllcmVzaXMgPSA3MjI7CisgICAgdC5kaXZpZGUgPSA1NjQ7CisgICAgdC5ZYWN1dGUgPSA3MjI7CisgICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LmFhY3V0ZSA9IDQ0NDsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTAwOworICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OworICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA0NDQ7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNTAwOworICAgIHQuRWRpZXJlc2lzID0gNjExOworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3NjA7CisgICAgdC5FbWFjcm9uID0gNjExOworICAgIHQuY2Nhcm9uID0gNDQ0OworICAgIHQuYXJpbmcgPSA0NDQ7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA0NDQ7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA2Njc7CisgICAgdC5hdGlsZGUgPSA0NDQ7CisgICAgdC5FZG90YWNjZW50ID0gNjExOworICAgIHQuc2Nhcm9uID0gMzg5OworICAgIHQuc2NlZGlsbGEgPSAzODk7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDcxOworICAgIHQuUmNhcm9uID0gNjY3OworICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CisgICAgdC5hY2lyY3VtZmxleCA9IDQ0NDsKKyAgICB0LkFtYWNyb24gPSA3MjI7CisgICAgdC5yY2Fyb24gPSAzMzM7CisgICAgdC5jY2VkaWxsYSA9IDQ0NDsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDU1NjsKKyAgICB0Lk9tYWNyb24gPSA3MjI7CisgICAgdC5SYWN1dGUgPSA2Njc7CisgICAgdC5TYWN1dGUgPSA1NTY7CisgICAgdC5kY2Fyb24gPSA1ODg7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA1MDA7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOworICAgIHQuT2dyYXZlID0gNzIyOworICAgIHQuQWdyYXZlID0gNzIyOworICAgIHQuQWJyZXZlID0gNzIyOworICAgIHQubXVsdGlwbHkgPSA1NjQ7CisgICAgdC51YWN1dGUgPSA1MDA7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjsKKyAgICB0LnlkaWVyZXNpcyA9IDUwMDsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CisgICAgdC5hZGllcmVzaXMgPSA0NDQ7CisgICAgdC5lZGllcmVzaXMgPSA0NDQ7CisgICAgdC5jYWN1dGUgPSA0NDQ7CisgICAgdC5uYWN1dGUgPSA1MDA7CisgICAgdC51bWFjcm9uID0gNTAwOworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMzMzOworICAgIHQucGx1c21pbnVzID0gNTY0OworICAgIHQuYnJva2VuYmFyID0gMjAwOworICAgIHQucmVnaXN0ZXJlZCA9IDc2MDsKKyAgICB0LkdicmV2ZSA9IDcyMjsKKyAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2MTE7CisgICAgdC5yYWN1dGUgPSAzMzM7CisgICAgdC5vbWFjcm9uID0gNTAwOworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA2Njc7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzMjY7CisgICAgdC5lb2dvbmVrID0gNDQ0OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDcyMjsKKyAgICB0LkFkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmVncmF2ZSA9IDQ0NDsKKyAgICB0LnphY3V0ZSA9IDQ0NDsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3MjI7CisgICAgdC5vYWN1dGUgPSA1MDA7CisgICAgdC5hbWFjcm9uID0gNDQ0OworICAgIHQuc2FjdXRlID0gMzg5OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNTAwOworICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZGllcmVzaXMgPSA3MjI7CisgICAgdC5tdSA9IDUwMDsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5Fb2dvbmVrID0gNjExOworICAgIHQuZGNyb2F0ID0gNTAwOworICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKKyAgICB0LlNjZWRpbGxhID0gNTU2OworICAgIHQubGNhcm9uID0gMzQ0OworICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGFjdXRlID0gNjExOworICAgIHQudHJhZGVtYXJrID0gOTgwOworICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKKyAgICB0LklncmF2ZSA9IDMzMzsKKyAgICB0LkltYWNyb24gPSAzMzM7CisgICAgdC5MY2Fyb24gPSA2MTE7CisgICAgdC5vbmVoYWxmID0gNzUwOworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CisgICAgdC5udGlsZGUgPSA1MDA7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjExOworICAgIHQuZW1hY3JvbiA9IDQ0NDsKKyAgICB0LmdicmV2ZSA9IDUwMDsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CisgICAgdC5TY2Fyb24gPSA1NTY7CisgICAgdC5TY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNTAwOworICAgIHQuQ2Nhcm9uID0gNjY3OworICAgIHQudWdyYXZlID0gNTAwOworICAgIHQucmFkaWNhbCA9IDQ1MzsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKKyAgICB0Lk50aWxkZSA9IDcyMjsKKyAgICB0Lm90aWxkZSA9IDUwMDsKKyAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LkF0aWxkZSA9IDcyMjsKKyAgICB0LkFvZ29uZWsgPSA3MjI7CisgICAgdC5BcmluZyA9IDcyMjsKKyAgICB0Lk90aWxkZSA9IDcyMjsKKyAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CisgICAgdC5FY2Fyb24gPSA2MTE7CisgICAgdC5Jb2dvbmVrID0gMzMzOworICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQubWludXMgPSA1NjQ7CisgICAgdC5JY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0Lm5jYXJvbiA9IDUwMDsKKyAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LmxvZ2ljYWxub3QgPSA1NjQ7CisgICAgdC5vZGllcmVzaXMgPSA1MDA7CisgICAgdC51ZGllcmVzaXMgPSA1MDA7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0LmV0aCA9IDUwMDsKKyAgICB0LnpjYXJvbiA9IDQ0NDsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzAwOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1MDA7CisgIH0pOworICB0WyJUaW1lcy1Cb2xkIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNTA7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC5xdW90ZWRibCA9IDU1NTsKKyAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CisgICAgdC5kb2xsYXIgPSA1MDA7CisgICAgdC5wZXJjZW50ID0gMTAwMDsKKyAgICB0LmFtcGVyc2FuZCA9IDgzMzsKKyAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CisgICAgdC5wYXJlbmxlZnQgPSAzMzM7CisgICAgdC5wYXJlbnJpZ2h0ID0gMzMzOworICAgIHQuYXN0ZXJpc2sgPSA1MDA7CisgICAgdC5wbHVzID0gNTcwOworICAgIHQuY29tbWEgPSAyNTA7CisgICAgdC5oeXBoZW4gPSAzMzM7CisgICAgdC5wZXJpb2QgPSAyNTA7CisgICAgdC5zbGFzaCA9IDI3ODsKKyAgICB0Lnplcm8gPSA1MDA7CisgICAgdC5vbmUgPSA1MDA7CisgICAgdC50d28gPSA1MDA7CisgICAgdC50aHJlZSA9IDUwMDsKKyAgICB0LmZvdXIgPSA1MDA7CisgICAgdC5maXZlID0gNTAwOworICAgIHQuc2l4ID0gNTAwOworICAgIHQuc2V2ZW4gPSA1MDA7CisgICAgdC5laWdodCA9IDUwMDsKKyAgICB0Lm5pbmUgPSA1MDA7CisgICAgdC5jb2xvbiA9IDMzMzsKKyAgICB0LnNlbWljb2xvbiA9IDMzMzsKKyAgICB0Lmxlc3MgPSA1NzA7CisgICAgdC5lcXVhbCA9IDU3MDsKKyAgICB0LmdyZWF0ZXIgPSA1NzA7CisgICAgdC5xdWVzdGlvbiA9IDUwMDsKKyAgICB0LmF0ID0gOTMwOworICAgIHQuQSA9IDcyMjsKKyAgICB0LkIgPSA2Njc7CisgICAgdC5DID0gNzIyOworICAgIHQuRCA9IDcyMjsKKyAgICB0LkUgPSA2Njc7CisgICAgdC5GID0gNjExOworICAgIHQuRyA9IDc3ODsKKyAgICB0LkggPSA3Nzg7CisgICAgdC5JID0gMzg5OworICAgIHQuSiA9IDUwMDsKKyAgICB0LksgPSA3Nzg7CisgICAgdC5MID0gNjY3OworICAgIHQuTSA9IDk0NDsKKyAgICB0Lk4gPSA3MjI7CisgICAgdC5PID0gNzc4OworICAgIHQuUCA9IDYxMTsKKyAgICB0LlEgPSA3Nzg7CisgICAgdC5SID0gNzIyOworICAgIHQuUyA9IDU1NjsKKyAgICB0LlQgPSA2Njc7CisgICAgdC5VID0gNzIyOworICAgIHQuViA9IDcyMjsKKyAgICB0LlcgPSAxMDAwOworICAgIHQuWCA9IDcyMjsKKyAgICB0LlkgPSA3MjI7CisgICAgdC5aID0gNjY3OworICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CisgICAgdC5iYWNrc2xhc2ggPSAyNzg7CisgICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CisgICAgdC5hc2NpaWNpcmN1bSA9IDU4MTsKKyAgICB0LnVuZGVyc2NvcmUgPSA1MDA7CisgICAgdC5xdW90ZWxlZnQgPSAzMzM7CisgICAgdC5hID0gNTAwOworICAgIHQuYiA9IDU1NjsKKyAgICB0LmMgPSA0NDQ7CisgICAgdC5kID0gNTU2OworICAgIHQuZSA9IDQ0NDsKKyAgICB0LmYgPSAzMzM7CisgICAgdC5nID0gNTAwOworICAgIHQuaCA9IDU1NjsKKyAgICB0LmkgPSAyNzg7CisgICAgdC5qID0gMzMzOworICAgIHQuayA9IDU1NjsKKyAgICB0LmwgPSAyNzg7CisgICAgdC5tID0gODMzOworICAgIHQubiA9IDU1NjsKKyAgICB0Lm8gPSA1MDA7CisgICAgdC5wID0gNTU2OworICAgIHQucSA9IDU1NjsKKyAgICB0LnIgPSA0NDQ7CisgICAgdC5zID0gMzg5OworICAgIHQudCA9IDMzMzsKKyAgICB0LnUgPSA1NTY7CisgICAgdC52ID0gNTAwOworICAgIHQudyA9IDcyMjsKKyAgICB0LnggPSA1MDA7CisgICAgdC55ID0gNTAwOworICAgIHQueiA9IDQ0NDsKKyAgICB0LmJyYWNlbGVmdCA9IDM5NDsKKyAgICB0LmJhciA9IDIyMDsKKyAgICB0LmJyYWNlcmlnaHQgPSAzOTQ7CisgICAgdC5hc2NpaXRpbGRlID0gNTIwOworICAgIHQuZXhjbGFtZG93biA9IDMzMzsKKyAgICB0LmNlbnQgPSA1MDA7CisgICAgdC5zdGVybGluZyA9IDUwMDsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQueWVuID0gNTAwOworICAgIHQuZmxvcmluID0gNTAwOworICAgIHQuc2VjdGlvbiA9IDUwMDsKKyAgICB0LmN1cnJlbmN5ID0gNTAwOworICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CisgICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CisgICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwOworICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOworICAgIHQuZmkgPSA1NTY7CisgICAgdC5mbCA9IDU1NjsKKyAgICB0LmVuZGFzaCA9IDUwMDsKKyAgICB0LmRhZ2dlciA9IDUwMDsKKyAgICB0LmRhZ2dlcmRibCA9IDUwMDsKKyAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOworICAgIHQucGFyYWdyYXBoID0gNTQwOworICAgIHQuYnVsbGV0ID0gMzUwOworICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CisgICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7CisgICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSAxMDAwOworICAgIHQuQUUgPSAxMDAwOworICAgIHQub3JkZmVtaW5pbmUgPSAzMDA7CisgICAgdC5Mc2xhc2ggPSA2Njc7CisgICAgdC5Pc2xhc2ggPSA3Nzg7CisgICAgdC5PRSA9IDEwMDA7CisgICAgdC5vcmRtYXNjdWxpbmUgPSAzMzA7CisgICAgdC5hZSA9IDcyMjsKKyAgICB0LmRvdGxlc3NpID0gMjc4OworICAgIHQubHNsYXNoID0gMjc4OworICAgIHQub3NsYXNoID0gNTAwOworICAgIHQub2UgPSA3MjI7CisgICAgdC5nZXJtYW5kYmxzID0gNTU2OworICAgIHQuSWRpZXJlc2lzID0gMzg5OworICAgIHQuZWFjdXRlID0gNDQ0OworICAgIHQuYWJyZXZlID0gNTAwOworICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjsKKyAgICB0LmVjYXJvbiA9IDQ0NDsKKyAgICB0LllkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmRpdmlkZSA9IDU3MDsKKyAgICB0LllhY3V0ZSA9IDcyMjsKKyAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOworICAgIHQuYWFjdXRlID0gNTAwOworICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CisgICAgdC55YWN1dGUgPSA1MDA7CisgICAgdC5zY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKKyAgICB0LlVyaW5nID0gNzIyOworICAgIHQuVWRpZXJlc2lzID0gNzIyOworICAgIHQuYW9nb25layA9IDUwMDsKKyAgICB0LlVhY3V0ZSA9IDcyMjsKKyAgICB0LnVvZ29uZWsgPSA1NTY7CisgICAgdC5FZGllcmVzaXMgPSA2Njc7CisgICAgdC5EY3JvYXQgPSA3MjI7CisgICAgdC5jb21tYWFjY2VudCA9IDI1MDsKKyAgICB0LmNvcHlyaWdodCA9IDc0NzsKKyAgICB0LkVtYWNyb24gPSA2Njc7CisgICAgdC5jY2Fyb24gPSA0NDQ7CisgICAgdC5hcmluZyA9IDUwMDsKKyAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKKyAgICB0LmxhY3V0ZSA9IDI3ODsKKyAgICB0LmFncmF2ZSA9IDUwMDsKKyAgICB0LlRjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LkNhY3V0ZSA9IDcyMjsKKyAgICB0LmF0aWxkZSA9IDUwMDsKKyAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CisgICAgdC5zY2Fyb24gPSAzODk7CisgICAgdC5zY2VkaWxsYSA9IDM4OTsKKyAgICB0LmlhY3V0ZSA9IDI3ODsKKyAgICB0LmxvemVuZ2UgPSA0OTQ7CisgICAgdC5SY2Fyb24gPSA3MjI7CisgICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CisgICAgdC51Y2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOworICAgIHQuQW1hY3JvbiA9IDcyMjsKKyAgICB0LnJjYXJvbiA9IDQ0NDsKKyAgICB0LmNjZWRpbGxhID0gNDQ0OworICAgIHQuWmRvdGFjY2VudCA9IDY2NzsKKyAgICB0LlRob3JuID0gNjExOworICAgIHQuT21hY3JvbiA9IDc3ODsKKyAgICB0LlJhY3V0ZSA9IDcyMjsKKyAgICB0LlNhY3V0ZSA9IDU1NjsKKyAgICB0LmRjYXJvbiA9IDY3MjsKKyAgICB0LlVtYWNyb24gPSA3MjI7CisgICAgdC51cmluZyA9IDU1NjsKKyAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZ3JhdmUgPSA3Nzg7CisgICAgdC5BZ3JhdmUgPSA3MjI7CisgICAgdC5BYnJldmUgPSA3MjI7CisgICAgdC5tdWx0aXBseSA9IDU3MDsKKyAgICB0LnVhY3V0ZSA9IDU1NjsKKyAgICB0LlRjYXJvbiA9IDY2NzsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDk0OworICAgIHQueWRpZXJlc2lzID0gNTAwOworICAgIHQuTmFjdXRlID0gNzIyOworICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFkaWVyZXNpcyA9IDUwMDsKKyAgICB0LmVkaWVyZXNpcyA9IDQ0NDsKKyAgICB0LmNhY3V0ZSA9IDQ0NDsKKyAgICB0Lm5hY3V0ZSA9IDU1NjsKKyAgICB0LnVtYWNyb24gPSA1NTY7CisgICAgdC5OY2Fyb24gPSA3MjI7CisgICAgdC5JYWN1dGUgPSAzODk7CisgICAgdC5wbHVzbWludXMgPSA1NzA7CisgICAgdC5icm9rZW5iYXIgPSAyMjA7CisgICAgdC5yZWdpc3RlcmVkID0gNzQ3OworICAgIHQuR2JyZXZlID0gNzc4OworICAgIHQuSWRvdGFjY2VudCA9IDM4OTsKKyAgICB0LnN1bW1hdGlvbiA9IDYwMDsKKyAgICB0LkVncmF2ZSA9IDY2NzsKKyAgICB0LnJhY3V0ZSA9IDQ0NDsKKyAgICB0Lm9tYWNyb24gPSA1MDA7CisgICAgdC5aYWN1dGUgPSA2Njc7CisgICAgdC5aY2Fyb24gPSA2Njc7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5FdGggPSA3MjI7CisgICAgdC5DY2VkaWxsYSA9IDcyMjsKKyAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LnRjYXJvbiA9IDQxNjsKKyAgICB0LmVvZ29uZWsgPSA0NDQ7CisgICAgdC5Vb2dvbmVrID0gNzIyOworICAgIHQuQWFjdXRlID0gNzIyOworICAgIHQuQWRpZXJlc2lzID0gNzIyOworICAgIHQuZWdyYXZlID0gNDQ0OworICAgIHQuemFjdXRlID0gNDQ0OworICAgIHQuaW9nb25layA9IDI3ODsKKyAgICB0Lk9hY3V0ZSA9IDc3ODsKKyAgICB0Lm9hY3V0ZSA9IDUwMDsKKyAgICB0LmFtYWNyb24gPSA1MDA7CisgICAgdC5zYWN1dGUgPSAzODk7CisgICAgdC5pZGllcmVzaXMgPSAyNzg7CisgICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKKyAgICB0LlVncmF2ZSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQudGhvcm4gPSA1NTY7CisgICAgdC50d29zdXBlcmlvciA9IDMwMDsKKyAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKKyAgICB0Lm11ID0gNTU2OworICAgIHQuaWdyYXZlID0gMjc4OworICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDsKKyAgICB0LkVvZ29uZWsgPSA2Njc7CisgICAgdC5kY3JvYXQgPSA1NTY7CisgICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwOworICAgIHQuU2NlZGlsbGEgPSA1NTY7CisgICAgdC5sY2Fyb24gPSAzOTQ7CisgICAgdC5LY29tbWFhY2NlbnQgPSA3Nzg7CisgICAgdC5MYWN1dGUgPSA2Njc7CisgICAgdC50cmFkZW1hcmsgPSAxMDAwOworICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKKyAgICB0LklncmF2ZSA9IDM4OTsKKyAgICB0LkltYWNyb24gPSAzODk7CisgICAgdC5MY2Fyb24gPSA2Njc7CisgICAgdC5vbmVoYWxmID0gNzUwOworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CisgICAgdC5udGlsZGUgPSA1NTY7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjY3OworICAgIHQuZW1hY3JvbiA9IDQ0NDsKKyAgICB0LmdicmV2ZSA9IDUwMDsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CisgICAgdC5TY2Fyb24gPSA1NTY7CisgICAgdC5TY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNTAwOworICAgIHQuQ2Nhcm9uID0gNzIyOworICAgIHQudWdyYXZlID0gNTU2OworICAgIHQucmFkaWNhbCA9IDU0OTsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDQ0NDsKKyAgICB0Lk50aWxkZSA9IDcyMjsKKyAgICB0Lm90aWxkZSA9IDUwMDsKKyAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LkF0aWxkZSA9IDcyMjsKKyAgICB0LkFvZ29uZWsgPSA3MjI7CisgICAgdC5BcmluZyA9IDcyMjsKKyAgICB0Lk90aWxkZSA9IDc3ODsKKyAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CisgICAgdC5FY2Fyb24gPSA2Njc7CisgICAgdC5Jb2dvbmVrID0gMzg5OworICAgIHQua2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQubWludXMgPSA1NzA7CisgICAgdC5JY2lyY3VtZmxleCA9IDM4OTsKKyAgICB0Lm5jYXJvbiA9IDU1NjsKKyAgICB0LnRjb21tYWFjY2VudCA9IDMzMzsKKyAgICB0LmxvZ2ljYWxub3QgPSA1NzA7CisgICAgdC5vZGllcmVzaXMgPSA1MDA7CisgICAgdC51ZGllcmVzaXMgPSA1NTY7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0LmV0aCA9IDUwMDsKKyAgICB0LnpjYXJvbiA9IDQ0NDsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzAwOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1MDA7CisgIH0pOworICB0WyJUaW1lcy1Cb2xkSXRhbGljIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNTA7CisgICAgdC5leGNsYW0gPSAzODk7CisgICAgdC5xdW90ZWRibCA9IDU1NTsKKyAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CisgICAgdC5kb2xsYXIgPSA1MDA7CisgICAgdC5wZXJjZW50ID0gODMzOworICAgIHQuYW1wZXJzYW5kID0gNzc4OworICAgIHQucXVvdGVyaWdodCA9IDMzMzsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDUwMDsKKyAgICB0LnBsdXMgPSA1NzA7CisgICAgdC5jb21tYSA9IDI1MDsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI1MDsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDUwMDsKKyAgICB0Lm9uZSA9IDUwMDsKKyAgICB0LnR3byA9IDUwMDsKKyAgICB0LnRocmVlID0gNTAwOworICAgIHQuZm91ciA9IDUwMDsKKyAgICB0LmZpdmUgPSA1MDA7CisgICAgdC5zaXggPSA1MDA7CisgICAgdC5zZXZlbiA9IDUwMDsKKyAgICB0LmVpZ2h0ID0gNTAwOworICAgIHQubmluZSA9IDUwMDsKKyAgICB0LmNvbG9uID0gMzMzOworICAgIHQuc2VtaWNvbG9uID0gMzMzOworICAgIHQubGVzcyA9IDU3MDsKKyAgICB0LmVxdWFsID0gNTcwOworICAgIHQuZ3JlYXRlciA9IDU3MDsKKyAgICB0LnF1ZXN0aW9uID0gNTAwOworICAgIHQuYXQgPSA4MzI7CisgICAgdC5BID0gNjY3OworICAgIHQuQiA9IDY2NzsKKyAgICB0LkMgPSA2Njc7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2Njc7CisgICAgdC5HID0gNzIyOworICAgIHQuSCA9IDc3ODsKKyAgICB0LkkgPSAzODk7CisgICAgdC5KID0gNTAwOworICAgIHQuSyA9IDY2NzsKKyAgICB0LkwgPSA2MTE7CisgICAgdC5NID0gODg5OworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3MjI7CisgICAgdC5QID0gNjExOworICAgIHQuUSA9IDcyMjsKKyAgICB0LlIgPSA2Njc7CisgICAgdC5TID0gNTU2OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDg4OTsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjExOworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOworICAgIHQuYXNjaWljaXJjdW0gPSA1NzA7CisgICAgdC51bmRlcnNjb3JlID0gNTAwOworICAgIHQucXVvdGVsZWZ0ID0gMzMzOworICAgIHQuYSA9IDUwMDsKKyAgICB0LmIgPSA1MDA7CisgICAgdC5jID0gNDQ0OworICAgIHQuZCA9IDUwMDsKKyAgICB0LmUgPSA0NDQ7CisgICAgdC5mID0gMzMzOworICAgIHQuZyA9IDUwMDsKKyAgICB0LmggPSA1NTY7CisgICAgdC5pID0gMjc4OworICAgIHQuaiA9IDI3ODsKKyAgICB0LmsgPSA1MDA7CisgICAgdC5sID0gMjc4OworICAgIHQubSA9IDc3ODsKKyAgICB0Lm4gPSA1NTY7CisgICAgdC5vID0gNTAwOworICAgIHQucCA9IDUwMDsKKyAgICB0LnEgPSA1MDA7CisgICAgdC5yID0gMzg5OworICAgIHQucyA9IDM4OTsKKyAgICB0LnQgPSAyNzg7CisgICAgdC51ID0gNTU2OworICAgIHQudiA9IDQ0NDsKKyAgICB0LncgPSA2Njc7CisgICAgdC54ID0gNTAwOworICAgIHQueSA9IDQ0NDsKKyAgICB0LnogPSAzODk7CisgICAgdC5icmFjZWxlZnQgPSAzNDg7CisgICAgdC5iYXIgPSAyMjA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzQ4OworICAgIHQuYXNjaWl0aWxkZSA9IDU3MDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzODk7CisgICAgdC5jZW50ID0gNTAwOworICAgIHQuc3RlcmxpbmcgPSA1MDA7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDUwMDsKKyAgICB0LmZsb3JpbiA9IDUwMDsKKyAgICB0LnNlY3Rpb24gPSA1MDA7CisgICAgdC5jdXJyZW5jeSA9IDUwMDsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMjc4OworICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNTU2OworICAgIHQuZmwgPSA1NTY7CisgICAgdC5lbmRhc2ggPSA1MDA7CisgICAgdC5kYWdnZXIgPSA1MDA7CisgICAgdC5kYWdnZXJkYmwgPSA1MDA7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI1MDsKKyAgICB0LnBhcmFncmFwaCA9IDUwMDsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMzMzOworICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOworICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTAwOworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNTAwOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gOTQ0OworICAgIHQub3JkZmVtaW5pbmUgPSAyNjY7CisgICAgdC5Mc2xhc2ggPSA2MTE7CisgICAgdC5Pc2xhc2ggPSA3MjI7CisgICAgdC5PRSA9IDk0NDsKKyAgICB0Lm9yZG1hc2N1bGluZSA9IDMwMDsKKyAgICB0LmFlID0gNzIyOworICAgIHQuZG90bGVzc2kgPSAyNzg7CisgICAgdC5sc2xhc2ggPSAyNzg7CisgICAgdC5vc2xhc2ggPSA1MDA7CisgICAgdC5vZSA9IDcyMjsKKyAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CisgICAgdC5JZGllcmVzaXMgPSAzODk7CisgICAgdC5lYWN1dGUgPSA0NDQ7CisgICAgdC5hYnJldmUgPSA1MDA7CisgICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OworICAgIHQuZWNhcm9uID0gNDQ0OworICAgIHQuWWRpZXJlc2lzID0gNjExOworICAgIHQuZGl2aWRlID0gNTcwOworICAgIHQuWWFjdXRlID0gNjExOworICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hYWN1dGUgPSA1MDA7CisgICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LnlhY3V0ZSA9IDQ0NDsKKyAgICB0LnNjb21tYWFjY2VudCA9IDM4OTsKKyAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0OworICAgIHQuVXJpbmcgPSA3MjI7CisgICAgdC5VZGllcmVzaXMgPSA3MjI7CisgICAgdC5hb2dvbmVrID0gNTAwOworICAgIHQuVWFjdXRlID0gNzIyOworICAgIHQudW9nb25layA9IDU1NjsKKyAgICB0LkVkaWVyZXNpcyA9IDY2NzsKKyAgICB0LkRjcm9hdCA9IDcyMjsKKyAgICB0LmNvbW1hYWNjZW50ID0gMjUwOworICAgIHQuY29weXJpZ2h0ID0gNzQ3OworICAgIHQuRW1hY3JvbiA9IDY2NzsKKyAgICB0LmNjYXJvbiA9IDQ0NDsKKyAgICB0LmFyaW5nID0gNTAwOworICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOworICAgIHQubGFjdXRlID0gMjc4OworICAgIHQuYWdyYXZlID0gNTAwOworICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOworICAgIHQuQ2FjdXRlID0gNjY3OworICAgIHQuYXRpbGRlID0gNTAwOworICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKKyAgICB0LnNjYXJvbiA9IDM4OTsKKyAgICB0LnNjZWRpbGxhID0gMzg5OworICAgIHQuaWFjdXRlID0gMjc4OworICAgIHQubG96ZW5nZSA9IDQ5NDsKKyAgICB0LlJjYXJvbiA9IDY2NzsKKyAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKKyAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7CisgICAgdC5BbWFjcm9uID0gNjY3OworICAgIHQucmNhcm9uID0gMzg5OworICAgIHQuY2NlZGlsbGEgPSA0NDQ7CisgICAgdC5aZG90YWNjZW50ID0gNjExOworICAgIHQuVGhvcm4gPSA2MTE7CisgICAgdC5PbWFjcm9uID0gNzIyOworICAgIHQuUmFjdXRlID0gNjY3OworICAgIHQuU2FjdXRlID0gNTU2OworICAgIHQuZGNhcm9uID0gNjA4OworICAgIHQuVW1hY3JvbiA9IDcyMjsKKyAgICB0LnVyaW5nID0gNTU2OworICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDsKKyAgICB0Lk9ncmF2ZSA9IDcyMjsKKyAgICB0LkFncmF2ZSA9IDY2NzsKKyAgICB0LkFicmV2ZSA9IDY2NzsKKyAgICB0Lm11bHRpcGx5ID0gNTcwOworICAgIHQudWFjdXRlID0gNTU2OworICAgIHQuVGNhcm9uID0gNjExOworICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7CisgICAgdC55ZGllcmVzaXMgPSA0NDQ7CisgICAgdC5OYWN1dGUgPSA3MjI7CisgICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKKyAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OworICAgIHQuYWRpZXJlc2lzID0gNTAwOworICAgIHQuZWRpZXJlc2lzID0gNDQ0OworICAgIHQuY2FjdXRlID0gNDQ0OworICAgIHQubmFjdXRlID0gNTU2OworICAgIHQudW1hY3JvbiA9IDU1NjsKKyAgICB0Lk5jYXJvbiA9IDcyMjsKKyAgICB0LklhY3V0ZSA9IDM4OTsKKyAgICB0LnBsdXNtaW51cyA9IDU3MDsKKyAgICB0LmJyb2tlbmJhciA9IDIyMDsKKyAgICB0LnJlZ2lzdGVyZWQgPSA3NDc7CisgICAgdC5HYnJldmUgPSA3MjI7CisgICAgdC5JZG90YWNjZW50ID0gMzg5OworICAgIHQuc3VtbWF0aW9uID0gNjAwOworICAgIHQuRWdyYXZlID0gNjY3OworICAgIHQucmFjdXRlID0gMzg5OworICAgIHQub21hY3JvbiA9IDUwMDsKKyAgICB0LlphY3V0ZSA9IDYxMTsKKyAgICB0LlpjYXJvbiA9IDYxMTsKKyAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKKyAgICB0LkV0aCA9IDcyMjsKKyAgICB0LkNjZWRpbGxhID0gNjY3OworICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQudGNhcm9uID0gMzY2OworICAgIHQuZW9nb25layA9IDQ0NDsKKyAgICB0LlVvZ29uZWsgPSA3MjI7CisgICAgdC5BYWN1dGUgPSA2Njc7CisgICAgdC5BZGllcmVzaXMgPSA2Njc7CisgICAgdC5lZ3JhdmUgPSA0NDQ7CisgICAgdC56YWN1dGUgPSAzODk7CisgICAgdC5pb2dvbmVrID0gMjc4OworICAgIHQuT2FjdXRlID0gNzIyOworICAgIHQub2FjdXRlID0gNTAwOworICAgIHQuYW1hY3JvbiA9IDUwMDsKKyAgICB0LnNhY3V0ZSA9IDM4OTsKKyAgICB0LmlkaWVyZXNpcyA9IDI3ODsKKyAgICB0Lk9jaXJjdW1mbGV4ID0gNzIyOworICAgIHQuVWdyYXZlID0gNzIyOworICAgIHQuRGVsdGEgPSA2MTI7CisgICAgdC50aG9ybiA9IDUwMDsKKyAgICB0LnR3b3N1cGVyaW9yID0gMzAwOworICAgIHQuT2RpZXJlc2lzID0gNzIyOworICAgIHQubXUgPSA1NzY7CisgICAgdC5pZ3JhdmUgPSAyNzg7CisgICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOworICAgIHQuRW9nb25layA9IDY2NzsKKyAgICB0LmRjcm9hdCA9IDUwMDsKKyAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CisgICAgdC5TY2VkaWxsYSA9IDU1NjsKKyAgICB0LmxjYXJvbiA9IDM4MjsKKyAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LkxhY3V0ZSA9IDYxMTsKKyAgICB0LnRyYWRlbWFyayA9IDEwMDA7CisgICAgdC5lZG90YWNjZW50ID0gNDQ0OworICAgIHQuSWdyYXZlID0gMzg5OworICAgIHQuSW1hY3JvbiA9IDM4OTsKKyAgICB0LkxjYXJvbiA9IDYxMTsKKyAgICB0Lm9uZWhhbGYgPSA3NTA7CisgICAgdC5sZXNzZXF1YWwgPSA1NDk7CisgICAgdC5vY2lyY3VtZmxleCA9IDUwMDsKKyAgICB0Lm50aWxkZSA9IDU1NjsKKyAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5FYWN1dGUgPSA2Njc7CisgICAgdC5lbWFjcm9uID0gNDQ0OworICAgIHQuZ2JyZXZlID0gNTAwOworICAgIHQub25lcXVhcnRlciA9IDc1MDsKKyAgICB0LlNjYXJvbiA9IDU1NjsKKyAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5vZ3JhdmUgPSA1MDA7CisgICAgdC5DY2Fyb24gPSA2Njc7CisgICAgdC51Z3JhdmUgPSA1NTY7CisgICAgdC5yYWRpY2FsID0gNTQ5OworICAgIHQuRGNhcm9uID0gNzIyOworICAgIHQucmNvbW1hYWNjZW50ID0gMzg5OworICAgIHQuTnRpbGRlID0gNzIyOworICAgIHQub3RpbGRlID0gNTAwOworICAgIHQuUmNvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOworICAgIHQuQXRpbGRlID0gNjY3OworICAgIHQuQW9nb25layA9IDY2NzsKKyAgICB0LkFyaW5nID0gNjY3OworICAgIHQuT3RpbGRlID0gNzIyOworICAgIHQuemRvdGFjY2VudCA9IDM4OTsKKyAgICB0LkVjYXJvbiA9IDY2NzsKKyAgICB0LklvZ29uZWsgPSAzODk7CisgICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5taW51cyA9IDYwNjsKKyAgICB0LkljaXJjdW1mbGV4ID0gMzg5OworICAgIHQubmNhcm9uID0gNTU2OworICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQubG9naWNhbG5vdCA9IDYwNjsKKyAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKKyAgICB0LnVkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lm5vdGVxdWFsID0gNTQ5OworICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQuZXRoID0gNTAwOworICAgIHQuemNhcm9uID0gMzg5OworICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OworICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CisgICAgdC5pbWFjcm9uID0gMjc4OworICAgIHQuRXVybyA9IDUwMDsKKyAgfSk7CisgIHRbIlRpbWVzLUl0YWxpYyJdID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgICB0LnNwYWNlID0gMjUwOworICAgIHQuZXhjbGFtID0gMzMzOworICAgIHQucXVvdGVkYmwgPSA0MjA7CisgICAgdC5udW1iZXJzaWduID0gNTAwOworICAgIHQuZG9sbGFyID0gNTAwOworICAgIHQucGVyY2VudCA9IDgzMzsKKyAgICB0LmFtcGVyc2FuZCA9IDc3ODsKKyAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CisgICAgdC5wYXJlbmxlZnQgPSAzMzM7CisgICAgdC5wYXJlbnJpZ2h0ID0gMzMzOworICAgIHQuYXN0ZXJpc2sgPSA1MDA7CisgICAgdC5wbHVzID0gNjc1OworICAgIHQuY29tbWEgPSAyNTA7CisgICAgdC5oeXBoZW4gPSAzMzM7CisgICAgdC5wZXJpb2QgPSAyNTA7CisgICAgdC5zbGFzaCA9IDI3ODsKKyAgICB0Lnplcm8gPSA1MDA7CisgICAgdC5vbmUgPSA1MDA7CisgICAgdC50d28gPSA1MDA7CisgICAgdC50aHJlZSA9IDUwMDsKKyAgICB0LmZvdXIgPSA1MDA7CisgICAgdC5maXZlID0gNTAwOworICAgIHQuc2l4ID0gNTAwOworICAgIHQuc2V2ZW4gPSA1MDA7CisgICAgdC5laWdodCA9IDUwMDsKKyAgICB0Lm5pbmUgPSA1MDA7CisgICAgdC5jb2xvbiA9IDMzMzsKKyAgICB0LnNlbWljb2xvbiA9IDMzMzsKKyAgICB0Lmxlc3MgPSA2NzU7CisgICAgdC5lcXVhbCA9IDY3NTsKKyAgICB0LmdyZWF0ZXIgPSA2NzU7CisgICAgdC5xdWVzdGlvbiA9IDUwMDsKKyAgICB0LmF0ID0gOTIwOworICAgIHQuQSA9IDYxMTsKKyAgICB0LkIgPSA2MTE7CisgICAgdC5DID0gNjY3OworICAgIHQuRCA9IDcyMjsKKyAgICB0LkUgPSA2MTE7CisgICAgdC5GID0gNjExOworICAgIHQuRyA9IDcyMjsKKyAgICB0LkggPSA3MjI7CisgICAgdC5JID0gMzMzOworICAgIHQuSiA9IDQ0NDsKKyAgICB0LksgPSA2Njc7CisgICAgdC5MID0gNTU2OworICAgIHQuTSA9IDgzMzsKKyAgICB0Lk4gPSA2Njc7CisgICAgdC5PID0gNzIyOworICAgIHQuUCA9IDYxMTsKKyAgICB0LlEgPSA3MjI7CisgICAgdC5SID0gNjExOworICAgIHQuUyA9IDUwMDsKKyAgICB0LlQgPSA1NTY7CisgICAgdC5VID0gNzIyOworICAgIHQuViA9IDYxMTsKKyAgICB0LlcgPSA4MzM7CisgICAgdC5YID0gNjExOworICAgIHQuWSA9IDU1NjsKKyAgICB0LlogPSA1NTY7CisgICAgdC5icmFja2V0bGVmdCA9IDM4OTsKKyAgICB0LmJhY2tzbGFzaCA9IDI3ODsKKyAgICB0LmJyYWNrZXRyaWdodCA9IDM4OTsKKyAgICB0LmFzY2lpY2lyY3VtID0gNDIyOworICAgIHQudW5kZXJzY29yZSA9IDUwMDsKKyAgICB0LnF1b3RlbGVmdCA9IDMzMzsKKyAgICB0LmEgPSA1MDA7CisgICAgdC5iID0gNTAwOworICAgIHQuYyA9IDQ0NDsKKyAgICB0LmQgPSA1MDA7CisgICAgdC5lID0gNDQ0OworICAgIHQuZiA9IDI3ODsKKyAgICB0LmcgPSA1MDA7CisgICAgdC5oID0gNTAwOworICAgIHQuaSA9IDI3ODsKKyAgICB0LmogPSAyNzg7CisgICAgdC5rID0gNDQ0OworICAgIHQubCA9IDI3ODsKKyAgICB0Lm0gPSA3MjI7CisgICAgdC5uID0gNTAwOworICAgIHQubyA9IDUwMDsKKyAgICB0LnAgPSA1MDA7CisgICAgdC5xID0gNTAwOworICAgIHQuciA9IDM4OTsKKyAgICB0LnMgPSAzODk7CisgICAgdC50ID0gMjc4OworICAgIHQudSA9IDUwMDsKKyAgICB0LnYgPSA0NDQ7CisgICAgdC53ID0gNjY3OworICAgIHQueCA9IDQ0NDsKKyAgICB0LnkgPSA0NDQ7CisgICAgdC56ID0gMzg5OworICAgIHQuYnJhY2VsZWZ0ID0gNDAwOworICAgIHQuYmFyID0gMjc1OworICAgIHQuYnJhY2VyaWdodCA9IDQwMDsKKyAgICB0LmFzY2lpdGlsZGUgPSA1NDE7CisgICAgdC5leGNsYW1kb3duID0gMzg5OworICAgIHQuY2VudCA9IDUwMDsKKyAgICB0LnN0ZXJsaW5nID0gNTAwOworICAgIHQuZnJhY3Rpb24gPSAxNjc7CisgICAgdC55ZW4gPSA1MDA7CisgICAgdC5mbG9yaW4gPSA1MDA7CisgICAgdC5zZWN0aW9uID0gNTAwOworICAgIHQuY3VycmVuY3kgPSA1MDA7CisgICAgdC5xdW90ZXNpbmdsZSA9IDIxNDsKKyAgICB0LnF1b3RlZGJsbGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CisgICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOworICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CisgICAgdC5maSA9IDUwMDsKKyAgICB0LmZsID0gNTAwOworICAgIHQuZW5kYXNoID0gNTAwOworICAgIHQuZGFnZ2VyID0gNTAwOworICAgIHQuZGFnZ2VyZGJsID0gNTAwOworICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CisgICAgdC5wYXJhZ3JhcGggPSA1MjM7CisgICAgdC5idWxsZXQgPSAzNTA7CisgICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsYmFzZSA9IDU1NjsKKyAgICB0LnF1b3RlZGJscmlnaHQgPSA1NTY7CisgICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKKyAgICB0LmVsbGlwc2lzID0gODg5OworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNTAwOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gODg5OworICAgIHQuQUUgPSA4ODk7CisgICAgdC5vcmRmZW1pbmluZSA9IDI3NjsKKyAgICB0LkxzbGFzaCA9IDU1NjsKKyAgICB0Lk9zbGFzaCA9IDcyMjsKKyAgICB0Lk9FID0gOTQ0OworICAgIHQub3JkbWFzY3VsaW5lID0gMzEwOworICAgIHQuYWUgPSA2Njc7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDUwMDsKKyAgICB0Lm9lID0gNjY3OworICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKKyAgICB0LklkaWVyZXNpcyA9IDMzMzsKKyAgICB0LmVhY3V0ZSA9IDQ0NDsKKyAgICB0LmFicmV2ZSA9IDUwMDsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5lY2Fyb24gPSA0NDQ7CisgICAgdC5ZZGllcmVzaXMgPSA1NTY7CisgICAgdC5kaXZpZGUgPSA2NzU7CisgICAgdC5ZYWN1dGUgPSA1NTY7CisgICAgdC5BY2lyY3VtZmxleCA9IDYxMTsKKyAgICB0LmFhY3V0ZSA9IDUwMDsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNDQ0OworICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OworICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1MDA7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNTAwOworICAgIHQuRWRpZXJlc2lzID0gNjExOworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3NjA7CisgICAgdC5FbWFjcm9uID0gNjExOworICAgIHQuY2Nhcm9uID0gNDQ0OworICAgIHQuYXJpbmcgPSA1MDA7CisgICAgdC5OY29tbWFhY2NlbnQgPSA2Njc7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA1MDA7CisgICAgdC5UY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5DYWN1dGUgPSA2Njc7CisgICAgdC5hdGlsZGUgPSA1MDA7CisgICAgdC5FZG90YWNjZW50ID0gNjExOworICAgIHQuc2Nhcm9uID0gMzg5OworICAgIHQuc2NlZGlsbGEgPSAzODk7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDcxOworICAgIHQuUmNhcm9uID0gNjExOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CisgICAgdC5hY2lyY3VtZmxleCA9IDUwMDsKKyAgICB0LkFtYWNyb24gPSA2MTE7CisgICAgdC5yY2Fyb24gPSAzODk7CisgICAgdC5jY2VkaWxsYSA9IDQ0NDsKKyAgICB0Llpkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5UaG9ybiA9IDYxMTsKKyAgICB0Lk9tYWNyb24gPSA3MjI7CisgICAgdC5SYWN1dGUgPSA2MTE7CisgICAgdC5TYWN1dGUgPSA1MDA7CisgICAgdC5kY2Fyb24gPSA1NDQ7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA1MDA7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOworICAgIHQuT2dyYXZlID0gNzIyOworICAgIHQuQWdyYXZlID0gNjExOworICAgIHQuQWJyZXZlID0gNjExOworICAgIHQubXVsdGlwbHkgPSA2NzU7CisgICAgdC51YWN1dGUgPSA1MDA7CisgICAgdC5UY2Fyb24gPSA1NTY7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjsKKyAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKKyAgICB0Lk5hY3V0ZSA9IDY2NzsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CisgICAgdC5hZGllcmVzaXMgPSA1MDA7CisgICAgdC5lZGllcmVzaXMgPSA0NDQ7CisgICAgdC5jYWN1dGUgPSA0NDQ7CisgICAgdC5uYWN1dGUgPSA1MDA7CisgICAgdC51bWFjcm9uID0gNTAwOworICAgIHQuTmNhcm9uID0gNjY3OworICAgIHQuSWFjdXRlID0gMzMzOworICAgIHQucGx1c21pbnVzID0gNjc1OworICAgIHQuYnJva2VuYmFyID0gMjc1OworICAgIHQucmVnaXN0ZXJlZCA9IDc2MDsKKyAgICB0LkdicmV2ZSA9IDcyMjsKKyAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2MTE7CisgICAgdC5yYWN1dGUgPSAzODk7CisgICAgdC5vbWFjcm9uID0gNTAwOworICAgIHQuWmFjdXRlID0gNTU2OworICAgIHQuWmNhcm9uID0gNTU2OworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA2Njc7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzMDA7CisgICAgdC5lb2dvbmVrID0gNDQ0OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDYxMTsKKyAgICB0LkFkaWVyZXNpcyA9IDYxMTsKKyAgICB0LmVncmF2ZSA9IDQ0NDsKKyAgICB0LnphY3V0ZSA9IDM4OTsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3MjI7CisgICAgdC5vYWN1dGUgPSA1MDA7CisgICAgdC5hbWFjcm9uID0gNTAwOworICAgIHQuc2FjdXRlID0gMzg5OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNTAwOworICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZGllcmVzaXMgPSA3MjI7CisgICAgdC5tdSA9IDUwMDsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5Fb2dvbmVrID0gNjExOworICAgIHQuZGNyb2F0ID0gNTAwOworICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKKyAgICB0LlNjZWRpbGxhID0gNTAwOworICAgIHQubGNhcm9uID0gMzAwOworICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGFjdXRlID0gNTU2OworICAgIHQudHJhZGVtYXJrID0gOTgwOworICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKKyAgICB0LklncmF2ZSA9IDMzMzsKKyAgICB0LkltYWNyb24gPSAzMzM7CisgICAgdC5MY2Fyb24gPSA2MTE7CisgICAgdC5vbmVoYWxmID0gNzUwOworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CisgICAgdC5udGlsZGUgPSA1MDA7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjExOworICAgIHQuZW1hY3JvbiA9IDQ0NDsKKyAgICB0LmdicmV2ZSA9IDUwMDsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CisgICAgdC5TY2Fyb24gPSA1MDA7CisgICAgdC5TY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNTAwOworICAgIHQuQ2Nhcm9uID0gNjY3OworICAgIHQudWdyYXZlID0gNTAwOworICAgIHQucmFkaWNhbCA9IDQ1MzsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKKyAgICB0Lk50aWxkZSA9IDY2NzsKKyAgICB0Lm90aWxkZSA9IDUwMDsKKyAgICB0LlJjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0LkF0aWxkZSA9IDYxMTsKKyAgICB0LkFvZ29uZWsgPSA2MTE7CisgICAgdC5BcmluZyA9IDYxMTsKKyAgICB0Lk90aWxkZSA9IDcyMjsKKyAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CisgICAgdC5FY2Fyb24gPSA2MTE7CisgICAgdC5Jb2dvbmVrID0gMzMzOworICAgIHQua2NvbW1hYWNjZW50ID0gNDQ0OworICAgIHQubWludXMgPSA2NzU7CisgICAgdC5JY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0Lm5jYXJvbiA9IDUwMDsKKyAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LmxvZ2ljYWxub3QgPSA2NzU7CisgICAgdC5vZGllcmVzaXMgPSA1MDA7CisgICAgdC51ZGllcmVzaXMgPSA1MDA7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0LmV0aCA9IDUwMDsKKyAgICB0LnpjYXJvbiA9IDM4OTsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzAwOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1MDA7CisgIH0pOworICB0LlphcGZEaW5nYmF0cyA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI3ODsKKyAgICB0LmExID0gOTc0OworICAgIHQuYTIgPSA5NjE7CisgICAgdC5hMjAyID0gOTc0OworICAgIHQuYTMgPSA5ODA7CisgICAgdC5hNCA9IDcxOTsKKyAgICB0LmE1ID0gNzg5OworICAgIHQuYTExOSA9IDc5MDsKKyAgICB0LmExMTggPSA3OTE7CisgICAgdC5hMTE3ID0gNjkwOworICAgIHQuYTExID0gOTYwOworICAgIHQuYTEyID0gOTM5OworICAgIHQuYTEzID0gNTQ5OworICAgIHQuYTE0ID0gODU1OworICAgIHQuYTE1ID0gOTExOworICAgIHQuYTE2ID0gOTMzOworICAgIHQuYTEwNSA9IDkxMTsKKyAgICB0LmExNyA9IDk0NTsKKyAgICB0LmExOCA9IDk3NDsKKyAgICB0LmExOSA9IDc1NTsKKyAgICB0LmEyMCA9IDg0NjsKKyAgICB0LmEyMSA9IDc2MjsKKyAgICB0LmEyMiA9IDc2MTsKKyAgICB0LmEyMyA9IDU3MTsKKyAgICB0LmEyNCA9IDY3NzsKKyAgICB0LmEyNSA9IDc2MzsKKyAgICB0LmEyNiA9IDc2MDsKKyAgICB0LmEyNyA9IDc1OTsKKyAgICB0LmEyOCA9IDc1NDsKKyAgICB0LmE2ID0gNDk0OworICAgIHQuYTcgPSA1NTI7CisgICAgdC5hOCA9IDUzNzsKKyAgICB0LmE5ID0gNTc3OworICAgIHQuYTEwID0gNjkyOworICAgIHQuYTI5ID0gNzg2OworICAgIHQuYTMwID0gNzg4OworICAgIHQuYTMxID0gNzg4OworICAgIHQuYTMyID0gNzkwOworICAgIHQuYTMzID0gNzkzOworICAgIHQuYTM0ID0gNzk0OworICAgIHQuYTM1ID0gODE2OworICAgIHQuYTM2ID0gODIzOworICAgIHQuYTM3ID0gNzg5OworICAgIHQuYTM4ID0gODQxOworICAgIHQuYTM5ID0gODIzOworICAgIHQuYTQwID0gODMzOworICAgIHQuYTQxID0gODE2OworICAgIHQuYTQyID0gODMxOworICAgIHQuYTQzID0gOTIzOworICAgIHQuYTQ0ID0gNzQ0OworICAgIHQuYTQ1ID0gNzIzOworICAgIHQuYTQ2ID0gNzQ5OworICAgIHQuYTQ3ID0gNzkwOworICAgIHQuYTQ4ID0gNzkyOworICAgIHQuYTQ5ID0gNjk1OworICAgIHQuYTUwID0gNzc2OworICAgIHQuYTUxID0gNzY4OworICAgIHQuYTUyID0gNzkyOworICAgIHQuYTUzID0gNzU5OworICAgIHQuYTU0ID0gNzA3OworICAgIHQuYTU1ID0gNzA4OworICAgIHQuYTU2ID0gNjgyOworICAgIHQuYTU3ID0gNzAxOworICAgIHQuYTU4ID0gODI2OworICAgIHQuYTU5ID0gODE1OworICAgIHQuYTYwID0gNzg5OworICAgIHQuYTYxID0gNzg5OworICAgIHQuYTYyID0gNzA3OworICAgIHQuYTYzID0gNjg3OworICAgIHQuYTY0ID0gNjk2OworICAgIHQuYTY1ID0gNjg5OworICAgIHQuYTY2ID0gNzg2OworICAgIHQuYTY3ID0gNzg3OworICAgIHQuYTY4ID0gNzEzOworICAgIHQuYTY5ID0gNzkxOworICAgIHQuYTcwID0gNzg1OworICAgIHQuYTcxID0gNzkxOworICAgIHQuYTcyID0gODczOworICAgIHQuYTczID0gNzYxOworICAgIHQuYTc0ID0gNzYyOworICAgIHQuYTIwMyA9IDc2MjsKKyAgICB0LmE3NSA9IDc1OTsKKyAgICB0LmEyMDQgPSA3NTk7CisgICAgdC5hNzYgPSA4OTI7CisgICAgdC5hNzcgPSA4OTI7CisgICAgdC5hNzggPSA3ODg7CisgICAgdC5hNzkgPSA3ODQ7CisgICAgdC5hODEgPSA0Mzg7CisgICAgdC5hODIgPSAxMzg7CisgICAgdC5hODMgPSAyNzc7CisgICAgdC5hODQgPSA0MTU7CisgICAgdC5hOTcgPSAzOTI7CisgICAgdC5hOTggPSAzOTI7CisgICAgdC5hOTkgPSA2Njg7CisgICAgdC5hMTAwID0gNjY4OworICAgIHQuYTg5ID0gMzkwOworICAgIHQuYTkwID0gMzkwOworICAgIHQuYTkzID0gMzE3OworICAgIHQuYTk0ID0gMzE3OworICAgIHQuYTkxID0gMjc2OworICAgIHQuYTkyID0gMjc2OworICAgIHQuYTIwNSA9IDUwOTsKKyAgICB0LmE4NSA9IDUwOTsKKyAgICB0LmEyMDYgPSA0MTA7CisgICAgdC5hODYgPSA0MTA7CisgICAgdC5hODcgPSAyMzQ7CisgICAgdC5hODggPSAyMzQ7CisgICAgdC5hOTUgPSAzMzQ7CisgICAgdC5hOTYgPSAzMzQ7CisgICAgdC5hMTAxID0gNzMyOworICAgIHQuYTEwMiA9IDU0NDsKKyAgICB0LmExMDMgPSA1NDQ7CisgICAgdC5hMTA0ID0gOTEwOworICAgIHQuYTEwNiA9IDY2NzsKKyAgICB0LmExMDcgPSA3NjA7CisgICAgdC5hMTA4ID0gNzYwOworICAgIHQuYTExMiA9IDc3NjsKKyAgICB0LmExMTEgPSA1OTU7CisgICAgdC5hMTEwID0gNjk0OworICAgIHQuYTEwOSA9IDYyNjsKKyAgICB0LmExMjAgPSA3ODg7CisgICAgdC5hMTIxID0gNzg4OworICAgIHQuYTEyMiA9IDc4ODsKKyAgICB0LmExMjMgPSA3ODg7CisgICAgdC5hMTI0ID0gNzg4OworICAgIHQuYTEyNSA9IDc4ODsKKyAgICB0LmExMjYgPSA3ODg7CisgICAgdC5hMTI3ID0gNzg4OworICAgIHQuYTEyOCA9IDc4ODsKKyAgICB0LmExMjkgPSA3ODg7CisgICAgdC5hMTMwID0gNzg4OworICAgIHQuYTEzMSA9IDc4ODsKKyAgICB0LmExMzIgPSA3ODg7CisgICAgdC5hMTMzID0gNzg4OworICAgIHQuYTEzNCA9IDc4ODsKKyAgICB0LmExMzUgPSA3ODg7CisgICAgdC5hMTM2ID0gNzg4OworICAgIHQuYTEzNyA9IDc4ODsKKyAgICB0LmExMzggPSA3ODg7CisgICAgdC5hMTM5ID0gNzg4OworICAgIHQuYTE0MCA9IDc4ODsKKyAgICB0LmExNDEgPSA3ODg7CisgICAgdC5hMTQyID0gNzg4OworICAgIHQuYTE0MyA9IDc4ODsKKyAgICB0LmExNDQgPSA3ODg7CisgICAgdC5hMTQ1ID0gNzg4OworICAgIHQuYTE0NiA9IDc4ODsKKyAgICB0LmExNDcgPSA3ODg7CisgICAgdC5hMTQ4ID0gNzg4OworICAgIHQuYTE0OSA9IDc4ODsKKyAgICB0LmExNTAgPSA3ODg7CisgICAgdC5hMTUxID0gNzg4OworICAgIHQuYTE1MiA9IDc4ODsKKyAgICB0LmExNTMgPSA3ODg7CisgICAgdC5hMTU0ID0gNzg4OworICAgIHQuYTE1NSA9IDc4ODsKKyAgICB0LmExNTYgPSA3ODg7CisgICAgdC5hMTU3ID0gNzg4OworICAgIHQuYTE1OCA9IDc4ODsKKyAgICB0LmExNTkgPSA3ODg7CisgICAgdC5hMTYwID0gODk0OworICAgIHQuYTE2MSA9IDgzODsKKyAgICB0LmExNjMgPSAxMDE2OworICAgIHQuYTE2NCA9IDQ1ODsKKyAgICB0LmExOTYgPSA3NDg7CisgICAgdC5hMTY1ID0gOTI0OworICAgIHQuYTE5MiA9IDc0ODsKKyAgICB0LmExNjYgPSA5MTg7CisgICAgdC5hMTY3ID0gOTI3OworICAgIHQuYTE2OCA9IDkyODsKKyAgICB0LmExNjkgPSA5Mjg7CisgICAgdC5hMTcwID0gODM0OworICAgIHQuYTE3MSA9IDg3MzsKKyAgICB0LmExNzIgPSA4Mjg7CisgICAgdC5hMTczID0gOTI0OworICAgIHQuYTE2MiA9IDkyNDsKKyAgICB0LmExNzQgPSA5MTc7CisgICAgdC5hMTc1ID0gOTMwOworICAgIHQuYTE3NiA9IDkzMTsKKyAgICB0LmExNzcgPSA0NjM7CisgICAgdC5hMTc4ID0gODgzOworICAgIHQuYTE3OSA9IDgzNjsKKyAgICB0LmExOTMgPSA4MzY7CisgICAgdC5hMTgwID0gODY3OworICAgIHQuYTE5OSA9IDg2NzsKKyAgICB0LmExODEgPSA2OTY7CisgICAgdC5hMjAwID0gNjk2OworICAgIHQuYTE4MiA9IDg3NDsKKyAgICB0LmEyMDEgPSA4NzQ7CisgICAgdC5hMTgzID0gNzYwOworICAgIHQuYTE4NCA9IDk0NjsKKyAgICB0LmExOTcgPSA3NzE7CisgICAgdC5hMTg1ID0gODY1OworICAgIHQuYTE5NCA9IDc3MTsKKyAgICB0LmExOTggPSA4ODg7CisgICAgdC5hMTg2ID0gOTY3OworICAgIHQuYTE5NSA9IDg4ODsKKyAgICB0LmExODcgPSA4MzE7CisgICAgdC5hMTg4ID0gODczOworICAgIHQuYTE4OSA9IDkyNzsKKyAgICB0LmExOTAgPSA5NzA7CisgICAgdC5hMTkxID0gOTE4OworICB9KTsKK30pOworZXhwb3J0cy5nZXRNZXRyaWNzID0gZ2V0TWV0cmljczsKKworLyoqKi8gfSksCisvKiA0NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk11cm11ckhhc2gzXzY0ID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCitjb25zdCBTRUVEID0gMHhjM2QyZTFmMDsKK2NvbnN0IE1BU0tfSElHSCA9IDB4ZmZmZjAwMDA7Citjb25zdCBNQVNLX0xPVyA9IDB4ZmZmZjsKKworY2xhc3MgTXVybXVySGFzaDNfNjQgeworICBjb25zdHJ1Y3RvcihzZWVkKSB7CisgICAgdGhpcy5oMSA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7CisgICAgdGhpcy5oMiA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7CisgIH0KKworICB1cGRhdGUoaW5wdXQpIHsKKyAgICBsZXQgZGF0YSwgbGVuZ3RoOworCisgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykoaW5wdXQpKSB7CisgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoICogMik7CisgICAgICBsZW5ndGggPSAwOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbnB1dC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpOworCisgICAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHsKKyAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlID4+PiA4OworICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSAmIDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShpbnB1dCkpIHsKKyAgICAgIGRhdGEgPSBpbnB1dDsKKyAgICAgIGxlbmd0aCA9IGRhdGEuYnl0ZUxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBkYXRhIGZvcm1hdCBpbiBNdXJtdXJIYXNoM182NF91cGRhdGUuICIgKyAiSW5wdXQgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheS4iKTsKKyAgICB9CisKKyAgICBjb25zdCBibG9ja0NvdW50cyA9IGxlbmd0aCA+PiAyOworICAgIGNvbnN0IHRhaWxMZW5ndGggPSBsZW5ndGggLSBibG9ja0NvdW50cyAqIDQ7CisgICAgY29uc3QgZGF0YVVpbnQzMiA9IG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlciwgMCwgYmxvY2tDb3VudHMpOworICAgIGxldCBrMSA9IDAsCisgICAgICAgIGsyID0gMDsKKyAgICBsZXQgaDEgPSB0aGlzLmgxLAorICAgICAgICBoMiA9IHRoaXMuaDI7CisgICAgY29uc3QgQzEgPSAweGNjOWUyZDUxLAorICAgICAgICAgIEMyID0gMHgxYjg3MzU5MzsKKyAgICBjb25zdCBDMV9MT1cgPSBDMSAmIE1BU0tfTE9XLAorICAgICAgICAgIEMyX0xPVyA9IEMyICYgTUFTS19MT1c7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2NrQ291bnRzOyBpKyspIHsKKyAgICAgIGlmIChpICYgMSkgeworICAgICAgICBrMSA9IGRhdGFVaW50MzJbaV07CisgICAgICAgIGsxID0gazEgKiBDMSAmIE1BU0tfSElHSCB8IGsxICogQzFfTE9XICYgTUFTS19MT1c7CisgICAgICAgIGsxID0gazEgPDwgMTUgfCBrMSA+Pj4gMTc7CisgICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CisgICAgICAgIGgxIF49IGsxOworICAgICAgICBoMSA9IGgxIDw8IDEzIHwgaDEgPj4+IDE5OworICAgICAgICBoMSA9IGgxICogNSArIDB4ZTY1NDZiNjQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBrMiA9IGRhdGFVaW50MzJbaV07CisgICAgICAgIGsyID0gazIgKiBDMSAmIE1BU0tfSElHSCB8IGsyICogQzFfTE9XICYgTUFTS19MT1c7CisgICAgICAgIGsyID0gazIgPDwgMTUgfCBrMiA+Pj4gMTc7CisgICAgICAgIGsyID0gazIgKiBDMiAmIE1BU0tfSElHSCB8IGsyICogQzJfTE9XICYgTUFTS19MT1c7CisgICAgICAgIGgyIF49IGsyOworICAgICAgICBoMiA9IGgyIDw8IDEzIHwgaDIgPj4+IDE5OworICAgICAgICBoMiA9IGgyICogNSArIDB4ZTY1NDZiNjQ7CisgICAgICB9CisgICAgfQorCisgICAgazEgPSAwOworCisgICAgc3dpdGNoICh0YWlsTGVuZ3RoKSB7CisgICAgICBjYXNlIDM6CisgICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMl0gPDwgMTY7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAxXSA8PCA4OworCisgICAgICBjYXNlIDE6CisgICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0XTsKKyAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKKyAgICAgICAgazEgPSBrMSA8PCAxNSB8IGsxID4+PiAxNzsKKyAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVzsKKworICAgICAgICBpZiAoYmxvY2tDb3VudHMgJiAxKSB7CisgICAgICAgICAgaDEgXj0gazE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaDIgXj0gazE7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHRoaXMuaDEgPSBoMTsKKyAgICB0aGlzLmgyID0gaDI7CisgIH0KKworICBoZXhkaWdlc3QoKSB7CisgICAgbGV0IGgxID0gdGhpcy5oMSwKKyAgICAgICAgaDIgPSB0aGlzLmgyOworICAgIGgxIF49IGgyID4+PiAxOworICAgIGgxID0gaDEgKiAweGVkNTU4Y2NkICYgTUFTS19ISUdIIHwgaDEgKiAweDhjY2QgJiBNQVNLX0xPVzsKKyAgICBoMiA9IGgyICogMHhmZjUxYWZkNyAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhhZmQ3ZWQ1NSAmIE1BU0tfSElHSCkgPj4+IDE2OworICAgIGgxIF49IGgyID4+PiAxOworICAgIGgxID0gaDEgKiAweDFhODVlYzUzICYgTUFTS19ISUdIIHwgaDEgKiAweGVjNTMgJiBNQVNLX0xPVzsKKyAgICBoMiA9IGgyICogMHhjNGNlYjlmZSAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhiOWZlMWE4NSAmIE1BU0tfSElHSCkgPj4+IDE2OworICAgIGgxIF49IGgyID4+PiAxOworICAgIGNvbnN0IGhleDEgPSAoaDEgPj4+IDApLnRvU3RyaW5nKDE2KSwKKyAgICAgICAgICBoZXgyID0gKGgyID4+PiAwKS50b1N0cmluZygxNik7CisgICAgcmV0dXJuIGhleDEucGFkU3RhcnQoOCwgIjAiKSArIGhleDIucGFkU3RhcnQoOCwgIjAiKTsKKyAgfQorCit9CisKK2V4cG9ydHMuTXVybXVySGFzaDNfNjQgPSBNdXJtdXJIYXNoM182NDsKKworLyoqKi8gfSksCisvKiA0NSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERkltYWdlID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2NvbG9yc3BhY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKKwordmFyIF9qcGVnX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOworCit2YXIgX2pweCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjEpOworCitmdW5jdGlvbiBkZWNvZGVBbmRDbGFtcCh2YWx1ZSwgYWRkZW5kLCBjb2VmZmljaWVudCwgbWF4KSB7CisgIHZhbHVlID0gYWRkZW5kICsgdmFsdWUgKiBjb2VmZmljaWVudDsKKworICBpZiAodmFsdWUgPCAwKSB7CisgICAgdmFsdWUgPSAwOworICB9IGVsc2UgaWYgKHZhbHVlID4gbWF4KSB7CisgICAgdmFsdWUgPSBtYXg7CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKK2Z1bmN0aW9uIHJlc2l6ZUltYWdlTWFzayhzcmMsIGJwYywgdzEsIGgxLCB3MiwgaDIpIHsKKyAgdmFyIGxlbmd0aCA9IHcyICogaDI7CisgIGxldCBkZXN0OworCisgIGlmIChicGMgPD0gOCkgeworICAgIGRlc3QgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOworICB9IGVsc2UgaWYgKGJwYyA8PSAxNikgeworICAgIGRlc3QgPSBuZXcgVWludDE2QXJyYXkobGVuZ3RoKTsKKyAgfSBlbHNlIHsKKyAgICBkZXN0ID0gbmV3IFVpbnQzMkFycmF5KGxlbmd0aCk7CisgIH0KKworICB2YXIgeFJhdGlvID0gdzEgLyB3MjsKKyAgdmFyIHlSYXRpbyA9IGgxIC8gaDI7CisgIHZhciBpLAorICAgICAgaiwKKyAgICAgIHB5LAorICAgICAgbmV3SW5kZXggPSAwLAorICAgICAgb2xkSW5kZXg7CisgIHZhciB4U2NhbGVkID0gbmV3IFVpbnQxNkFycmF5KHcyKTsKKyAgdmFyIHcxU2NhbmxpbmUgPSB3MTsKKworICBmb3IgKGkgPSAwOyBpIDwgdzI7IGkrKykgeworICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGgyOyBpKyspIHsKKyAgICBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lOworCisgICAgZm9yIChqID0gMDsgaiA8IHcyOyBqKyspIHsKKyAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOworICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IHNyY1tvbGRJbmRleF07CisgICAgfQorICB9CisKKyAgcmV0dXJuIGRlc3Q7Cit9CisKK2NsYXNzIFBERkltYWdlIHsKKyAgY29uc3RydWN0b3IoeworICAgIHhyZWYsCisgICAgcmVzLAorICAgIGltYWdlLAorICAgIGlzSW5saW5lID0gZmFsc2UsCisgICAgc21hc2sgPSBudWxsLAorICAgIG1hc2sgPSBudWxsLAorICAgIGlzTWFzayA9IGZhbHNlLAorICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICB9KSB7CisgICAgdGhpcy5pbWFnZSA9IGltYWdlOworICAgIHZhciBkaWN0ID0gaW1hZ2UuZGljdDsKKyAgICBjb25zdCBmaWx0ZXIgPSBkaWN0LmdldCgiRmlsdGVyIik7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmlsdGVyKSkgeworICAgICAgc3dpdGNoIChmaWx0ZXIubmFtZSkgeworICAgICAgICBjYXNlICJKUFhEZWNvZGUiOgorICAgICAgICAgIHZhciBqcHhJbWFnZSA9IG5ldyBfanB4LkpweEltYWdlKCk7CisgICAgICAgICAganB4SW1hZ2UucGFyc2VJbWFnZVByb3BlcnRpZXMoaW1hZ2Uuc3RyZWFtKTsKKyAgICAgICAgICBpbWFnZS5zdHJlYW0ucmVzZXQoKTsKKyAgICAgICAgICBpbWFnZS53aWR0aCA9IGpweEltYWdlLndpZHRoOworICAgICAgICAgIGltYWdlLmhlaWdodCA9IGpweEltYWdlLmhlaWdodDsKKyAgICAgICAgICBpbWFnZS5iaXRzUGVyQ29tcG9uZW50ID0ganB4SW1hZ2UuYml0c1BlckNvbXBvbmVudDsKKyAgICAgICAgICBpbWFnZS5udW1Db21wcyA9IGpweEltYWdlLmNvbXBvbmVudHNDb3VudDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJKQklHMkRlY29kZSI6CisgICAgICAgICAgaW1hZ2UuYml0c1BlckNvbXBvbmVudCA9IDE7CisgICAgICAgICAgaW1hZ2UubnVtQ29tcHMgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGxldCB3aWR0aCA9IGRpY3QuZ2V0KCJXaWR0aCIsICJXIik7CisgICAgbGV0IGhlaWdodCA9IGRpY3QuZ2V0KCJIZWlnaHQiLCAiSCIpOworCisgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW1hZ2Uud2lkdGgpICYmIGltYWdlLndpZHRoID4gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGltYWdlLmhlaWdodCkgJiYgaW1hZ2UuaGVpZ2h0ID4gMCAmJiAoaW1hZ2Uud2lkdGggIT09IHdpZHRoIHx8IGltYWdlLmhlaWdodCAhPT0gaGVpZ2h0KSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJQREZJbWFnZSAtIHVzaW5nIHRoZSBXaWR0aC9IZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEsICIgKyAicmF0aGVyIHRoYW4gdGhlIGltYWdlIGRpY3Rpb25hcnkuIik7CisgICAgICB3aWR0aCA9IGltYWdlLndpZHRoOworICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0OworICAgIH0KKworICAgIGlmICh3aWR0aCA8IDEgfHwgaGVpZ2h0IDwgMSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIGltYWdlIHdpZHRoOiAke3dpZHRofSBvciBoZWlnaHQ6ICR7aGVpZ2h0fWApOworICAgIH0KKworICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKyAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKKyAgICB0aGlzLmludGVycG9sYXRlID0gZGljdC5nZXQoIkludGVycG9sYXRlIiwgIkkiKSB8fCBmYWxzZTsKKyAgICB0aGlzLmltYWdlTWFzayA9IGRpY3QuZ2V0KCJJbWFnZU1hc2siLCAiSU0iKSB8fCBmYWxzZTsKKyAgICB0aGlzLm1hdHRlID0gZGljdC5nZXQoIk1hdHRlIikgfHwgZmFsc2U7CisgICAgdmFyIGJpdHNQZXJDb21wb25lbnQgPSBpbWFnZS5iaXRzUGVyQ29tcG9uZW50OworCisgICAgaWYgKCFiaXRzUGVyQ29tcG9uZW50KSB7CisgICAgICBiaXRzUGVyQ29tcG9uZW50ID0gZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiLCAiQlBDIik7CisKKyAgICAgIGlmICghYml0c1BlckNvbXBvbmVudCkgeworICAgICAgICBpZiAodGhpcy5pbWFnZU1hc2spIHsKKyAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAke3RoaXMuaW1hZ2VNYXNrfWApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5icGMgPSBiaXRzUGVyQ29tcG9uZW50OworCisgICAgaWYgKCF0aGlzLmltYWdlTWFzaykgeworICAgICAgbGV0IGNvbG9yU3BhY2UgPSBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpIHx8IGRpY3QuZ2V0UmF3KCJDUyIpOworCisgICAgICBpZiAoIWNvbG9yU3BhY2UpIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJKUFggaW1hZ2VzICh3aGljaCBkbyBub3QgcmVxdWlyZSBjb2xvciBzcGFjZXMpIik7CisKKyAgICAgICAgc3dpdGNoIChpbWFnZS5udW1Db21wcykgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRGV2aWNlR3JheSIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjb2xvclNwYWNlID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkRldmljZVJHQiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjb2xvclNwYWNlID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkRldmljZUNNWUsiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSlBYIGltYWdlcyB3aXRoICR7aW1hZ2UubnVtQ29tcHN9IGAgKyAiY29sb3IgY29tcG9uZW50cyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuY29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2UoeworICAgICAgICBjczogY29sb3JTcGFjZSwKKyAgICAgICAgeHJlZiwKKyAgICAgICAgcmVzb3VyY2VzOiBpc0lubGluZSA/IHJlcyA6IG51bGwsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgIH0pOworICAgICAgdGhpcy5udW1Db21wcyA9IHRoaXMuY29sb3JTcGFjZS5udW1Db21wczsKKyAgICB9CisKKyAgICB0aGlzLmRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoIkRlY29kZSIsICJEIik7CisgICAgdGhpcy5uZWVkc0RlY29kZSA9IGZhbHNlOworCisgICAgaWYgKHRoaXMuZGVjb2RlICYmICh0aGlzLmNvbG9yU3BhY2UgJiYgIXRoaXMuY29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUodGhpcy5kZWNvZGUsIGJpdHNQZXJDb21wb25lbnQpIHx8IGlzTWFzayAmJiAhX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUodGhpcy5kZWNvZGUsIDEpKSkgeworICAgICAgdGhpcy5uZWVkc0RlY29kZSA9IHRydWU7CisgICAgICB2YXIgbWF4ID0gKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxOworICAgICAgdGhpcy5kZWNvZGVDb2VmZmljaWVudHMgPSBbXTsKKyAgICAgIHRoaXMuZGVjb2RlQWRkZW5kcyA9IFtdOworICAgICAgY29uc3QgaXNJbmRleGVkID0gdGhpcy5jb2xvclNwYWNlICYmIHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiSW5kZXhlZCI7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IHRoaXMuZGVjb2RlLmxlbmd0aDsgaSArPSAyLCArK2opIHsKKyAgICAgICAgdmFyIGRtaW4gPSB0aGlzLmRlY29kZVtpXTsKKyAgICAgICAgdmFyIGRtYXggPSB0aGlzLmRlY29kZVtpICsgMV07CisgICAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzW2pdID0gaXNJbmRleGVkID8gKGRtYXggLSBkbWluKSAvIG1heCA6IGRtYXggLSBkbWluOworICAgICAgICB0aGlzLmRlY29kZUFkZGVuZHNbal0gPSBpc0luZGV4ZWQgPyBkbWluIDogbWF4ICogZG1pbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc21hc2spIHsKKyAgICAgIHRoaXMuc21hc2sgPSBuZXcgUERGSW1hZ2UoeworICAgICAgICB4cmVmLAorICAgICAgICByZXMsCisgICAgICAgIGltYWdlOiBzbWFzaywKKyAgICAgICAgaXNJbmxpbmUsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgIH0pOworICAgIH0gZWxzZSBpZiAobWFzaykgeworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkobWFzaykpIHsKKyAgICAgICAgdmFyIG1hc2tEaWN0ID0gbWFzay5kaWN0LAorICAgICAgICAgICAgaW1hZ2VNYXNrID0gbWFza0RpY3QuZ2V0KCJJbWFnZU1hc2siLCAiSU0iKTsKKworICAgICAgICBpZiAoIWltYWdlTWFzaykgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSWdub3JpbmcgL01hc2sgaW4gaW1hZ2Ugd2l0aG91dCAvSW1hZ2VNYXNrLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMubWFzayA9IG5ldyBQREZJbWFnZSh7CisgICAgICAgICAgICB4cmVmLAorICAgICAgICAgICAgcmVzLAorICAgICAgICAgICAgaW1hZ2U6IG1hc2ssCisgICAgICAgICAgICBpc0lubGluZSwKKyAgICAgICAgICAgIGlzTWFzazogdHJ1ZSwKKyAgICAgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMubWFzayA9IG1hc2s7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGFzeW5jIGJ1aWxkSW1hZ2UoeworICAgIHhyZWYsCisgICAgcmVzLAorICAgIGltYWdlLAorICAgIGlzSW5saW5lID0gZmFsc2UsCisgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgIH0pIHsKKyAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZTsKKyAgICBsZXQgc21hc2tEYXRhID0gbnVsbDsKKyAgICBsZXQgbWFza0RhdGEgPSBudWxsOworICAgIGNvbnN0IHNtYXNrID0gaW1hZ2UuZGljdC5nZXQoIlNNYXNrIik7CisgICAgY29uc3QgbWFzayA9IGltYWdlLmRpY3QuZ2V0KCJNYXNrIik7CisKKyAgICBpZiAoc21hc2spIHsKKyAgICAgIHNtYXNrRGF0YSA9IHNtYXNrOworICAgIH0gZWxzZSBpZiAobWFzaykgeworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkobWFzaykgfHwgQXJyYXkuaXNBcnJheShtYXNrKSkgeworICAgICAgICBtYXNrRGF0YSA9IG1hc2s7CisgICAgICB9IGVsc2UgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuc3VwcG9ydGVkIG1hc2sgZm9ybWF0LiIpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXcgUERGSW1hZ2UoeworICAgICAgeHJlZiwKKyAgICAgIHJlcywKKyAgICAgIGltYWdlOiBpbWFnZURhdGEsCisgICAgICBpc0lubGluZSwKKyAgICAgIHNtYXNrOiBzbWFza0RhdGEsCisgICAgICBtYXNrOiBtYXNrRGF0YSwKKyAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgfSk7CisgIH0KKworICBzdGF0aWMgY3JlYXRlTWFzayh7CisgICAgaW1nQXJyYXksCisgICAgd2lkdGgsCisgICAgaGVpZ2h0LAorICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtLAorICAgIGludmVyc2VEZWNvZGUKKyAgfSkgeworICAgIHZhciBjb21wdXRlZExlbmd0aCA9ICh3aWR0aCArIDcgPj4gMykgKiBoZWlnaHQ7CisgICAgdmFyIGFjdHVhbExlbmd0aCA9IGltZ0FycmF5LmJ5dGVMZW5ndGg7CisgICAgdmFyIGhhdmVGdWxsRGF0YSA9IGNvbXB1dGVkTGVuZ3RoID09PSBhY3R1YWxMZW5ndGg7CisgICAgdmFyIGRhdGEsIGk7CisKKyAgICBpZiAoaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0gJiYgKCFpbnZlcnNlRGVjb2RlIHx8IGhhdmVGdWxsRGF0YSkpIHsKKyAgICAgIGRhdGEgPSBpbWdBcnJheTsKKyAgICB9IGVsc2UgaWYgKCFpbnZlcnNlRGVjb2RlKSB7CisgICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGFjdHVhbExlbmd0aCk7CisgICAgICBkYXRhLnNldChpbWdBcnJheSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoY29tcHV0ZWRMZW5ndGgpOworICAgICAgZGF0YS5zZXQoaW1nQXJyYXkpOworCisgICAgICBmb3IgKGkgPSBhY3R1YWxMZW5ndGg7IGkgPCBjb21wdXRlZExlbmd0aDsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gPSAweGZmOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnZlcnNlRGVjb2RlKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXSBePSAweGZmOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBkYXRhLAorICAgICAgd2lkdGgsCisgICAgICBoZWlnaHQKKyAgICB9OworICB9CisKKyAgZ2V0IGRyYXdXaWR0aCgpIHsKKyAgICByZXR1cm4gTWF0aC5tYXgodGhpcy53aWR0aCwgdGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLndpZHRoIHx8IDAsIHRoaXMubWFzayAmJiB0aGlzLm1hc2sud2lkdGggfHwgMCk7CisgIH0KKworICBnZXQgZHJhd0hlaWdodCgpIHsKKyAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5oZWlnaHQsIHRoaXMuc21hc2sgJiYgdGhpcy5zbWFzay5oZWlnaHQgfHwgMCwgdGhpcy5tYXNrICYmIHRoaXMubWFzay5oZWlnaHQgfHwgMCk7CisgIH0KKworICBkZWNvZGVCdWZmZXIoYnVmZmVyKSB7CisgICAgdmFyIGJwYyA9IHRoaXMuYnBjOworICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CisgICAgdmFyIGRlY29kZUFkZGVuZHMgPSB0aGlzLmRlY29kZUFkZGVuZHM7CisgICAgdmFyIGRlY29kZUNvZWZmaWNpZW50cyA9IHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzOworICAgIHZhciBtYXggPSAoMSA8PCBicGMpIC0gMTsKKyAgICB2YXIgaSwgaWk7CisKKyAgICBpZiAoYnBjID09PSAxKSB7CisgICAgICBmb3IgKGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGJ1ZmZlcltpXSA9ICshYnVmZmVyW2ldOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGluZGV4ID0gMDsKKworICAgIGZvciAoaSA9IDAsIGlpID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0OyBpIDwgaWk7IGkrKykgeworICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Db21wczsgaisrKSB7CisgICAgICAgIGJ1ZmZlcltpbmRleF0gPSBkZWNvZGVBbmRDbGFtcChidWZmZXJbaW5kZXhdLCBkZWNvZGVBZGRlbmRzW2pdLCBkZWNvZGVDb2VmZmljaWVudHNbal0sIG1heCk7CisgICAgICAgIGluZGV4Kys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZ2V0Q29tcG9uZW50cyhidWZmZXIpIHsKKyAgICB2YXIgYnBjID0gdGhpcy5icGM7CisKKyAgICBpZiAoYnBjID09PSA4KSB7CisgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKworICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGg7CisgICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CisgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcHM7CisgICAgdmFyIGJ1ZmZlclBvcyA9IDA7CisgICAgbGV0IG91dHB1dDsKKworICAgIGlmIChicGMgPD0gOCkgeworICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKKyAgICB9IGVsc2UgaWYgKGJwYyA8PSAxNikgeworICAgICAgb3V0cHV0ID0gbmV3IFVpbnQxNkFycmF5KGxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShsZW5ndGgpOworICAgIH0KKworICAgIHZhciByb3dDb21wcyA9IHdpZHRoICogbnVtQ29tcHM7CisgICAgdmFyIG1heCA9ICgxIDw8IGJwYykgLSAxOworICAgIHZhciBpID0gMCwKKyAgICAgICAgaWksCisgICAgICAgIGJ1ZjsKKworICAgIGlmIChicGMgPT09IDEpIHsKKyAgICAgIHZhciBtYXNrLCBsb29wMUVuZCwgbG9vcDJFbmQ7CisKKyAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgbG9vcDFFbmQgPSBpICsgKHJvd0NvbXBzICYgfjcpOworICAgICAgICBsb29wMkVuZCA9IGkgKyByb3dDb21wczsKKworICAgICAgICB3aGlsZSAoaSA8IGxvb3AxRW5kKSB7CisgICAgICAgICAgYnVmID0gYnVmZmVyW2J1ZmZlclBvcysrXTsKKyAgICAgICAgICBvdXRwdXRbaV0gPSBidWYgPj4gNyAmIDE7CisgICAgICAgICAgb3V0cHV0W2kgKyAxXSA9IGJ1ZiA+PiA2ICYgMTsKKyAgICAgICAgICBvdXRwdXRbaSArIDJdID0gYnVmID4+IDUgJiAxOworICAgICAgICAgIG91dHB1dFtpICsgM10gPSBidWYgPj4gNCAmIDE7CisgICAgICAgICAgb3V0cHV0W2kgKyA0XSA9IGJ1ZiA+PiAzICYgMTsKKyAgICAgICAgICBvdXRwdXRbaSArIDVdID0gYnVmID4+IDIgJiAxOworICAgICAgICAgIG91dHB1dFtpICsgNl0gPSBidWYgPj4gMSAmIDE7CisgICAgICAgICAgb3V0cHV0W2kgKyA3XSA9IGJ1ZiAmIDE7CisgICAgICAgICAgaSArPSA4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBsb29wMkVuZCkgeworICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcltidWZmZXJQb3MrK107CisgICAgICAgICAgbWFzayA9IDEyODsKKworICAgICAgICAgIHdoaWxlIChpIDwgbG9vcDJFbmQpIHsKKyAgICAgICAgICAgIG91dHB1dFtpKytdID0gKyEhKGJ1ZiAmIG1hc2spOworICAgICAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFyIGJpdHMgPSAwOworICAgICAgYnVmID0gMDsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSBsZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIGlmIChpICUgcm93Q29tcHMgPT09IDApIHsKKyAgICAgICAgICBidWYgPSAwOworICAgICAgICAgIGJpdHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGJpdHMgPCBicGMpIHsKKyAgICAgICAgICBidWYgPSBidWYgPDwgOCB8IGJ1ZmZlcltidWZmZXJQb3MrK107CisgICAgICAgICAgYml0cyArPSA4OworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJlbWFpbmluZ0JpdHMgPSBiaXRzIC0gYnBjOworICAgICAgICBsZXQgdmFsdWUgPSBidWYgPj4gcmVtYWluaW5nQml0czsKKworICAgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gbWF4KSB7CisgICAgICAgICAgdmFsdWUgPSBtYXg7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXRbaV0gPSB2YWx1ZTsKKyAgICAgICAgYnVmID0gYnVmICYgKDEgPDwgcmVtYWluaW5nQml0cykgLSAxOworICAgICAgICBiaXRzID0gcmVtYWluaW5nQml0czsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0OworICB9CisKKyAgZmlsbE9wYWNpdHkocmdiYUJ1Ziwgd2lkdGgsIGhlaWdodCwgYWN0dWFsSGVpZ2h0LCBpbWFnZSkgeworICAgIHZhciBzbWFzayA9IHRoaXMuc21hc2s7CisgICAgdmFyIG1hc2sgPSB0aGlzLm1hc2s7CisgICAgdmFyIGFscGhhQnVmLCBzdywgc2gsIGksIGlpLCBqOworCisgICAgaWYgKHNtYXNrKSB7CisgICAgICBzdyA9IHNtYXNrLndpZHRoOworICAgICAgc2ggPSBzbWFzay5oZWlnaHQ7CisgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzdyAqIHNoKTsKKyAgICAgIHNtYXNrLmZpbGxHcmF5QnVmZmVyKGFscGhhQnVmKTsKKworICAgICAgaWYgKHN3ICE9PSB3aWR0aCB8fCBzaCAhPT0gaGVpZ2h0KSB7CisgICAgICAgIGFscGhhQnVmID0gcmVzaXplSW1hZ2VNYXNrKGFscGhhQnVmLCBzbWFzay5icGMsIHN3LCBzaCwgd2lkdGgsIGhlaWdodCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChtYXNrKSB7CisgICAgICBpZiAobWFzayBpbnN0YW5jZW9mIFBERkltYWdlKSB7CisgICAgICAgIHN3ID0gbWFzay53aWR0aDsKKyAgICAgICAgc2ggPSBtYXNrLmhlaWdodDsKKyAgICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3cgKiBzaCk7CisgICAgICAgIG1hc2subnVtQ29tcHMgPSAxOworICAgICAgICBtYXNrLmZpbGxHcmF5QnVmZmVyKGFscGhhQnVmKTsKKworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHN3ICogc2g7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgYWxwaGFCdWZbaV0gPSAyNTUgLSBhbHBoYUJ1ZltpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdyAhPT0gd2lkdGggfHwgc2ggIT09IGhlaWdodCkgeworICAgICAgICAgIGFscGhhQnVmID0gcmVzaXplSW1hZ2VNYXNrKGFscGhhQnVmLCBtYXNrLmJwYywgc3csIHNoLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1hc2spKSB7CisgICAgICAgIGFscGhhQnVmID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTsKKyAgICAgICAgdmFyIG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKKworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRoICogaGVpZ2h0OyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIHZhciBvcGFjaXR5ID0gMDsKKyAgICAgICAgICB2YXIgaW1hZ2VPZmZzZXQgPSBpICogbnVtQ29tcHM7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7ICsraikgeworICAgICAgICAgICAgdmFyIGNvbG9yID0gaW1hZ2VbaW1hZ2VPZmZzZXQgKyBqXTsKKyAgICAgICAgICAgIHZhciBtYXNrT2Zmc2V0ID0gaiAqIDI7CisKKyAgICAgICAgICAgIGlmIChjb2xvciA8IG1hc2tbbWFza09mZnNldF0gfHwgY29sb3IgPiBtYXNrW21hc2tPZmZzZXQgKyAxXSkgeworICAgICAgICAgICAgICBvcGFjaXR5ID0gMjU1OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBhbHBoYUJ1ZltpXSA9IG9wYWNpdHk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBtYXNrIGZvcm1hdC4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWxwaGFCdWYpIHsKKyAgICAgIGZvciAoaSA9IDAsIGogPSAzLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7ICsraSwgaiArPSA0KSB7CisgICAgICAgIHJnYmFCdWZbal0gPSBhbHBoYUJ1ZltpXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMCwgaiA9IDMsIGlpID0gd2lkdGggKiBhY3R1YWxIZWlnaHQ7IGkgPCBpaTsgKytpLCBqICs9IDQpIHsKKyAgICAgICAgcmdiYUJ1ZltqXSA9IDI1NTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB1bmRvUHJlYmxlbmQoYnVmZmVyLCB3aWR0aCwgaGVpZ2h0KSB7CisgICAgdmFyIG1hdHRlID0gdGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLm1hdHRlOworCisgICAgaWYgKCFtYXR0ZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBtYXR0ZVJnYiA9IHRoaXMuY29sb3JTcGFjZS5nZXRSZ2IobWF0dGUsIDApOworICAgIHZhciBtYXR0ZVIgPSBtYXR0ZVJnYlswXTsKKyAgICB2YXIgbWF0dGVHID0gbWF0dGVSZ2JbMV07CisgICAgdmFyIG1hdHRlQiA9IG1hdHRlUmdiWzJdOworICAgIHZhciBsZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIDQ7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CisgICAgICB2YXIgYWxwaGEgPSBidWZmZXJbaSArIDNdOworCisgICAgICBpZiAoYWxwaGEgPT09IDApIHsKKyAgICAgICAgYnVmZmVyW2ldID0gMjU1OworICAgICAgICBidWZmZXJbaSArIDFdID0gMjU1OworICAgICAgICBidWZmZXJbaSArIDJdID0gMjU1OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdmFyIGsgPSAyNTUgLyBhbHBoYTsKKyAgICAgIGJ1ZmZlcltpXSA9IChidWZmZXJbaV0gLSBtYXR0ZVIpICogayArIG1hdHRlUjsKKyAgICAgIGJ1ZmZlcltpICsgMV0gPSAoYnVmZmVyW2kgKyAxXSAtIG1hdHRlRykgKiBrICsgbWF0dGVHOworICAgICAgYnVmZmVyW2kgKyAyXSA9IChidWZmZXJbaSArIDJdIC0gbWF0dGVCKSAqIGsgKyBtYXR0ZUI7CisgICAgfQorICB9CisKKyAgY3JlYXRlSW1hZ2VEYXRhKGZvcmNlUkdCQSA9IGZhbHNlKSB7CisgICAgdmFyIGRyYXdXaWR0aCA9IHRoaXMuZHJhd1dpZHRoOworICAgIHZhciBkcmF3SGVpZ2h0ID0gdGhpcy5kcmF3SGVpZ2h0OworICAgIHZhciBpbWdEYXRhID0geworICAgICAgd2lkdGg6IGRyYXdXaWR0aCwKKyAgICAgIGhlaWdodDogZHJhd0hlaWdodCwKKyAgICAgIGtpbmQ6IDAsCisgICAgICBkYXRhOiBudWxsCisgICAgfTsKKyAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOworICAgIHZhciBvcmlnaW5hbFdpZHRoID0gdGhpcy53aWR0aDsKKyAgICB2YXIgb3JpZ2luYWxIZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICB2YXIgYnBjID0gdGhpcy5icGM7CisgICAgdmFyIHJvd0J5dGVzID0gb3JpZ2luYWxXaWR0aCAqIG51bUNvbXBzICogYnBjICsgNyA+PiAzOworICAgIHZhciBpbWdBcnJheTsKKworICAgIGlmICghZm9yY2VSR0JBKSB7CisgICAgICB2YXIga2luZDsKKworICAgICAgaWYgKHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlR3JheSIgJiYgYnBjID09PSAxKSB7CisgICAgICAgIGtpbmQgPSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlUkdCIiAmJiBicGMgPT09IDggJiYgIXRoaXMubmVlZHNEZWNvZGUpIHsKKyAgICAgICAga2luZCA9IF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA7CisgICAgICB9CisKKyAgICAgIGlmIChraW5kICYmICF0aGlzLnNtYXNrICYmICF0aGlzLm1hc2sgJiYgZHJhd1dpZHRoID09PSBvcmlnaW5hbFdpZHRoICYmIGRyYXdIZWlnaHQgPT09IG9yaWdpbmFsSGVpZ2h0KSB7CisgICAgICAgIGltZ0RhdGEua2luZCA9IGtpbmQ7CisgICAgICAgIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMpOworCisgICAgICAgIGlmICh0aGlzLmltYWdlIGluc3RhbmNlb2YgX3N0cmVhbS5EZWNvZGVTdHJlYW0pIHsKKyAgICAgICAgICBpbWdEYXRhLmRhdGEgPSBpbWdBcnJheTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgbmV3QXJyYXkgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoaW1nQXJyYXkubGVuZ3RoKTsKKyAgICAgICAgICBuZXdBcnJheS5zZXQoaW1nQXJyYXkpOworICAgICAgICAgIGltZ0RhdGEuZGF0YSA9IG5ld0FycmF5OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShraW5kID09PSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAsICJQREZJbWFnZS5jcmVhdGVJbWFnZURhdGE6IFRoZSBpbWFnZSBtdXN0IGJlIGdyYXlzY2FsZS4iKTsKKyAgICAgICAgICB2YXIgYnVmZmVyID0gaW1nRGF0YS5kYXRhOworCisgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICAgIGJ1ZmZlcltpXSBePSAweGZmOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbWdEYXRhOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5pbWFnZSBpbnN0YW5jZW9mIF9qcGVnX3N0cmVhbS5KcGVnU3RyZWFtICYmICF0aGlzLnNtYXNrICYmICF0aGlzLm1hc2spIHsKKyAgICAgICAgbGV0IGltYWdlTGVuZ3RoID0gb3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlczsKKworICAgICAgICBzd2l0Y2ggKHRoaXMuY29sb3JTcGFjZS5uYW1lKSB7CisgICAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CisgICAgICAgICAgICBpbWFnZUxlbmd0aCAqPSAzOworCisgICAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKKyAgICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKKyAgICAgICAgICAgIGltZ0RhdGEua2luZCA9IF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA7CisgICAgICAgICAgICBpbWdEYXRhLmRhdGEgPSB0aGlzLmdldEltYWdlQnl0ZXMoaW1hZ2VMZW5ndGgsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgdHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gaW1nRGF0YTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMpOworICAgIHZhciBhY3R1YWxIZWlnaHQgPSAwIHwgaW1nQXJyYXkubGVuZ3RoIC8gcm93Qnl0ZXMgKiBkcmF3SGVpZ2h0IC8gb3JpZ2luYWxIZWlnaHQ7CisgICAgdmFyIGNvbXBzID0gdGhpcy5nZXRDb21wb25lbnRzKGltZ0FycmF5KTsKKyAgICB2YXIgYWxwaGEwMSwgbWF5YmVVbmRvUHJlYmxlbmQ7CisKKyAgICBpZiAoIWZvcmNlUkdCQSAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrKSB7CisgICAgICBpbWdEYXRhLmtpbmQgPSBfdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQOworICAgICAgaW1nRGF0YS5kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiAzKTsKKyAgICAgIGFscGhhMDEgPSAwOworICAgICAgbWF5YmVVbmRvUHJlYmxlbmQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaW1nRGF0YS5raW5kID0gX3V0aWwuSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CisgICAgICBpbWdEYXRhLmRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZHJhd1dpZHRoICogZHJhd0hlaWdodCAqIDQpOworICAgICAgYWxwaGEwMSA9IDE7CisgICAgICBtYXliZVVuZG9QcmVibGVuZCA9IHRydWU7CisgICAgICB0aGlzLmZpbGxPcGFjaXR5KGltZ0RhdGEuZGF0YSwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGNvbXBzKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgeworICAgICAgdGhpcy5kZWNvZGVCdWZmZXIoY29tcHMpOworICAgIH0KKworICAgIHRoaXMuY29sb3JTcGFjZS5maWxsUmdiKGltZ0RhdGEuZGF0YSwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgYWN0dWFsSGVpZ2h0LCBicGMsIGNvbXBzLCBhbHBoYTAxKTsKKworICAgIGlmIChtYXliZVVuZG9QcmVibGVuZCkgeworICAgICAgdGhpcy51bmRvUHJlYmxlbmQoaW1nRGF0YS5kYXRhLCBkcmF3V2lkdGgsIGFjdHVhbEhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIGltZ0RhdGE7CisgIH0KKworICBmaWxsR3JheUJ1ZmZlcihidWZmZXIpIHsKKyAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOworCisgICAgaWYgKG51bUNvbXBzICE9PSAxKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFJlYWRpbmcgZ3JheSBzY2FsZSBmcm9tIGEgY29sb3IgaW1hZ2U6ICR7bnVtQ29tcHN9YCk7CisgICAgfQorCisgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aDsKKyAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgdmFyIGJwYyA9IHRoaXMuYnBjOworICAgIHZhciByb3dCeXRlcyA9IHdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CisgICAgdmFyIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKGhlaWdodCAqIHJvd0J5dGVzKTsKKyAgICB2YXIgY29tcHMgPSB0aGlzLmdldENvbXBvbmVudHMoaW1nQXJyYXkpOworICAgIHZhciBpLCBsZW5ndGg7CisKKyAgICBpZiAoYnBjID09PSAxKSB7CisgICAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKKworICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgYnVmZmVyW2ldID0gY29tcHNbaV0gLSAxICYgMjU1OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICBidWZmZXJbaV0gPSAtY29tcHNbaV0gJiAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CisgICAgICB0aGlzLmRlY29kZUJ1ZmZlcihjb21wcyk7CisgICAgfQorCisgICAgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQ7CisgICAgdmFyIHNjYWxlID0gMjU1IC8gKCgxIDw8IGJwYykgLSAxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgYnVmZmVyW2ldID0gc2NhbGUgKiBjb21wc1tpXTsKKyAgICB9CisgIH0KKworICBnZXRJbWFnZUJ5dGVzKGxlbmd0aCwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCBmb3JjZVJHQiA9IGZhbHNlKSB7CisgICAgdGhpcy5pbWFnZS5yZXNldCgpOworICAgIHRoaXMuaW1hZ2UuZHJhd1dpZHRoID0gZHJhd1dpZHRoIHx8IHRoaXMud2lkdGg7CisgICAgdGhpcy5pbWFnZS5kcmF3SGVpZ2h0ID0gZHJhd0hlaWdodCB8fCB0aGlzLmhlaWdodDsKKyAgICB0aGlzLmltYWdlLmZvcmNlUkdCID0gISFmb3JjZVJHQjsKKyAgICByZXR1cm4gdGhpcy5pbWFnZS5nZXRCeXRlcyhsZW5ndGgsIHRydWUpOworICB9CisKK30KKworZXhwb3J0cy5QREZJbWFnZSA9IFBERkltYWdlOworCisvKioqLyB9KSwKKy8qIDQ2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuTWVzc2FnZUhhbmRsZXIgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK2NvbnN0IENhbGxiYWNrS2luZCA9IHsKKyAgVU5LTk9XTjogMCwKKyAgREFUQTogMSwKKyAgRVJST1I6IDIKK307Citjb25zdCBTdHJlYW1LaW5kID0geworICBVTktOT1dOOiAwLAorICBDQU5DRUw6IDEsCisgIENBTkNFTF9DT01QTEVURTogMiwKKyAgQ0xPU0U6IDMsCisgIEVOUVVFVUU6IDQsCisgIEVSUk9SOiA1LAorICBQVUxMOiA2LAorICBQVUxMX0NPTVBMRVRFOiA3LAorICBTVEFSVF9DT01QTEVURTogOAorfTsKKworZnVuY3Rpb24gd3JhcFJlYXNvbihyZWFzb24pIHsKKyAgaWYgKHR5cGVvZiByZWFzb24gIT09ICJvYmplY3QiIHx8IHJlYXNvbiA9PT0gbnVsbCkgeworICAgIHJldHVybiByZWFzb247CisgIH0KKworICBzd2l0Y2ggKHJlYXNvbi5uYW1lKSB7CisgICAgY2FzZSAiQWJvcnRFeGNlcHRpb24iOgorICAgICAgcmV0dXJuIG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7CisKKyAgICBjYXNlICJNaXNzaW5nUERGRXhjZXB0aW9uIjoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7CisKKyAgICBjYXNlICJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iOgorICAgICAgcmV0dXJuIG5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5zdGF0dXMpOworCisgICAgY2FzZSAiVW5rbm93bkVycm9yRXhjZXB0aW9uIjoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uZGV0YWlscyk7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIG5ldyBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi50b1N0cmluZygpKTsKKyAgfQorfQorCitjbGFzcyBNZXNzYWdlSGFuZGxlciB7CisgIGNvbnN0cnVjdG9yKHNvdXJjZU5hbWUsIHRhcmdldE5hbWUsIGNvbU9iaikgeworICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7CisgICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKKyAgICB0aGlzLmNvbU9iaiA9IGNvbU9iajsKKyAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOworICAgIHRoaXMuc3RyZWFtSWQgPSAxOworICAgIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSB0cnVlOworICAgIHRoaXMuc3RyZWFtU2lua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSA9IGV2ZW50ID0+IHsKKyAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhOworCisgICAgICBpZiAoZGF0YS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5zdHJlYW0pIHsKKyAgICAgICAgdGhpcy5fcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5jYWxsYmFjaykgeworICAgICAgICBjb25zdCBjYWxsYmFja0lkID0gZGF0YS5jYWxsYmFja0lkOworICAgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKKworICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGNhbGxiYWNrICR7Y2FsbGJhY2tJZH1gKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdOworCisgICAgICAgIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuREFUQSkgeworICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZShkYXRhLmRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5FUlJPUikgeworICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZSIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dOworCisgICAgICBpZiAoIWFjdGlvbikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAke2RhdGEuYWN0aW9ufWApOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5jYWxsYmFja0lkKSB7CisgICAgICAgIGNvbnN0IGNiU291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTsKKyAgICAgICAgY29uc3QgY2JUYXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lOworICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSkpOworICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLAorICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLAorICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAorICAgICAgICAgICAgZGF0YTogcmVzdWx0CisgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLAorICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5FUlJPUiwKKyAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCwKKyAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7CisgICAgICAgIHRoaXMuX2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBhY3Rpb24oZGF0YS5kYXRhKTsKKyAgICB9OworCisgICAgY29tT2JqLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7CisgIH0KKworICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7CisgICAgY29uc3QgYWggPSB0aGlzLmFjdGlvbkhhbmRsZXI7CisKKyAgICBpZiAoYWhbYWN0aW9uTmFtZV0pIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgYWxyZWFkeSBhbiBhY3Rpb25OYW1lIGNhbGxlZCAiJHthY3Rpb25OYW1lfSJgKTsKKyAgICB9CisKKyAgICBhaFthY3Rpb25OYW1lXSA9IGhhbmRsZXI7CisgIH0KKworICBzZW5kKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykgeworICAgIHRoaXMuX3Bvc3RNZXNzYWdlKHsKKyAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKKyAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSwKKyAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKKyAgICAgIGRhdGEKKyAgICB9LCB0cmFuc2ZlcnMpOworICB9CisKKyAgc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykgeworICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKKyAgICBjb25zdCBjYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF0gPSBjYXBhYmlsaXR5OworCisgICAgdHJ5IHsKKyAgICAgIHRoaXMuX3Bvc3RNZXNzYWdlKHsKKyAgICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLAorICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsCisgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKKyAgICAgICAgY2FsbGJhY2tJZCwKKyAgICAgICAgZGF0YQorICAgICAgfSwgdHJhbnNmZXJzKTsKKyAgICB9IGNhdGNoIChleCkgeworICAgICAgY2FwYWJpbGl0eS5yZWplY3QoZXgpOworICAgIH0KKworICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBzZW5kV2l0aFN0cmVhbShhY3Rpb25OYW1lLCBkYXRhLCBxdWV1ZWluZ1N0cmF0ZWd5LCB0cmFuc2ZlcnMpIHsKKyAgICBjb25zdCBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKzsKKyAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lOworICAgIGNvbnN0IHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWU7CisgICAgY29uc3QgY29tT2JqID0gdGhpcy5jb21PYmo7CisgICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7CisgICAgICBzdGFydDogY29udHJvbGxlciA9PiB7CisgICAgICAgIGNvbnN0IHN0YXJ0Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0gPSB7CisgICAgICAgICAgY29udHJvbGxlciwKKyAgICAgICAgICBzdGFydENhbGw6IHN0YXJ0Q2FwYWJpbGl0eSwKKyAgICAgICAgICBwdWxsQ2FsbDogbnVsbCwKKyAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLAorICAgICAgICAgIGlzQ2xvc2VkOiBmYWxzZQorICAgICAgICB9OworCisgICAgICAgIHRoaXMuX3Bvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAorICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgIGRhdGEsCisgICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemUKKyAgICAgICAgfSwgdHJhbnNmZXJzKTsKKworICAgICAgICByZXR1cm4gc3RhcnRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICB9LAorICAgICAgcHVsbDogY29udHJvbGxlciA9PiB7CisgICAgICAgIGNvbnN0IHB1bGxDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCA9IHB1bGxDYXBhYmlsaXR5OworICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTCwKKyAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHB1bGxDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICB9LAorICAgICAgY2FuY2VsOiByZWFzb24gPT4geworICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTsKKyAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbCA9IGNhbmNlbENhcGFiaWxpdHk7CisgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTCwKKyAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGNhbmNlbENhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIH0KKyAgICB9LCBxdWV1ZWluZ1N0cmF0ZWd5KTsKKyAgfQorCisgIF9jcmVhdGVTdHJlYW1TaW5rKGRhdGEpIHsKKyAgICBjb25zdCBzZWxmID0gdGhpczsKKyAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dOworICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZDsKKyAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lOworICAgIGNvbnN0IHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7CisgICAgY29uc3QgY29tT2JqID0gdGhpcy5jb21PYmo7CisgICAgY29uc3Qgc3RyZWFtU2luayA9IHsKKyAgICAgIGVucXVldWUoY2h1bmssIHNpemUgPSAxLCB0cmFuc2ZlcnMpIHsKKyAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBsYXN0RGVzaXJlZFNpemUgPSB0aGlzLmRlc2lyZWRTaXplOworICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7CisKKyAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7CisgICAgICAgICAgdGhpcy5zaW5rQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi5fcG9zdE1lc3NhZ2UoeworICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSwKKyAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICBjaHVuaworICAgICAgICB9LCB0cmFuc2ZlcnMpOworICAgICAgfSwKKworICAgICAgY2xvc2UoKSB7CisgICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7CisgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DTE9TRSwKKyAgICAgICAgICBzdHJlYW1JZAorICAgICAgICB9KTsKKyAgICAgICAgZGVsZXRlIHNlbGYuc3RyZWFtU2lua3Nbc3RyZWFtSWRdOworICAgICAgfSwKKworICAgICAgZXJyb3IocmVhc29uKSB7CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCAiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CisKKyAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVSUk9SLAorICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCisgICAgICAgIH0pOworICAgICAgfSwKKworICAgICAgc2lua0NhcGFiaWxpdHk6ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSwKKyAgICAgIG9uUHVsbDogbnVsbCwKKyAgICAgIG9uQ2FuY2VsOiBudWxsLAorICAgICAgaXNDYW5jZWxsZWQ6IGZhbHNlLAorICAgICAgZGVzaXJlZFNpemU6IGRhdGEuZGVzaXJlZFNpemUsCisgICAgICByZWFkeTogbnVsbAorICAgIH07CisgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgc3RyZWFtU2luay5yZWFkeSA9IHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSA9IHN0cmVhbVNpbms7CisgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSwgc3RyZWFtU2luaykpOworICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLAorICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgc3VjY2VzczogdHJ1ZQorICAgICAgfSk7CisgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLAorICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgX3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpIHsKKyAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQ7CisgICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTsKKyAgICBjb25zdCB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lOworICAgIGNvbnN0IGNvbU9iaiA9IHRoaXMuY29tT2JqOworCisgICAgc3dpdGNoIChkYXRhLnN0cmVhbSkgeworICAgICAgY2FzZSBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFOgorICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CisgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLnJlc29sdmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5zdGFydENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURToKKyAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgeworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsLnJlc29sdmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMOgorICAgICAgICBpZiAoIXRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdKSB7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsCisgICAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5kZXNpcmVkU2l6ZSA8PSAwICYmIGRhdGEuZGVzaXJlZFNpemUgPiAwKSB7CisgICAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uZGVzaXJlZFNpemUgPSBkYXRhLmRlc2lyZWRTaXplOworICAgICAgICBjb25zdCB7CisgICAgICAgICAgb25QdWxsCisgICAgICAgIH0gPSB0aGlzLnN0cmVhbVNpbmtzW2RhdGEuc3RyZWFtSWRdOworICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgICAgIHJlc29sdmUob25QdWxsICYmIG9uUHVsbCgpKTsKKyAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsCisgICAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAorICAgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOgorICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSwgImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTsKKworICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZW5xdWV1ZShkYXRhLmNodW5rKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRToKKyAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOworCisgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlOworICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jb250cm9sbGVyLmNsb3NlKCk7CisKKyAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU3RyZWFtS2luZC5FUlJPUjoKKyAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOworICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jb250cm9sbGVyLmVycm9yKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKKworICAgICAgICB0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKTsKKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURToKKyAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgeworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwucmVzb2x2ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpOworCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOgorICAgICAgICBpZiAoIXRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB7CisgICAgICAgICAgb25DYW5jZWwKKyAgICAgICAgfSA9IHRoaXMuc3RyZWFtU2lua3NbZGF0YS5zdHJlYW1JZF07CisgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgICAgcmVzb2x2ZShvbkNhbmNlbCAmJiBvbkNhbmNlbCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSkpOworICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLAorICAgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgICBzdWNjZXNzOiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLAorICAgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKKyAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uaXNDYW5jZWxsZWQgPSB0cnVlOworICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2UiKTsKKyAgICB9CisgIH0KKworICBhc3luYyBfZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCkgeworICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCwgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbF0ubWFwKGZ1bmN0aW9uIChjYXBhYmlsaXR5KSB7CisgICAgICByZXR1cm4gY2FwYWJpbGl0eSAmJiBjYXBhYmlsaXR5LnByb21pc2U7CisgICAgfSkpOworICAgIGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXTsKKyAgfQorCisgIF9wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2ZlcnMpIHsKKyAgICBpZiAodHJhbnNmZXJzICYmIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMpIHsKKyAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVycyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIGRlc3Ryb3koKSB7CisgICAgdGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTsKKyAgfQorCit9CisKK2V4cG9ydHMuTWVzc2FnZUhhbmRsZXIgPSBNZXNzYWdlSGFuZGxlcjsKKworLyoqKi8gfSksCisvKiA0NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERldvcmtlclN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworY2xhc3MgUERGV29ya2VyU3RyZWFtIHsKKyAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgeworICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOworICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDsKKyAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107CisgIH0KKworICBnZXRGdWxsUmVhZGVyKCkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERldvcmtlclN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERldvcmtlclN0cmVhbVJlYWRlcih0aGlzLl9tc2dIYW5kbGVyKTsKKyAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7CisgIH0KKworICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CisgICAgY29uc3QgcmVhZGVyID0gbmV3IFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyKGJlZ2luLCBlbmQsIHRoaXMuX21zZ0hhbmRsZXIpOworCisgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7CisKKyAgICByZXR1cm4gcmVhZGVyOworICB9CisKKyAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7CisgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7CisgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisKKyAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKTsKKworICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmVhZGVyKSB7CisgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLlBERldvcmtlclN0cmVhbSA9IFBERldvcmtlclN0cmVhbTsKKworY2xhc3MgUERGV29ya2VyU3RyZWFtUmVhZGVyIHsKKyAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgeworICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7CisgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGZhbHNlOworICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJlYWRlciIpOworCisgICAgdGhpcy5fcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CisgICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlJlYWRlckhlYWRlcnNSZWFkeSIpLnRoZW4oZGF0YSA9PiB7CisgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGRhdGEuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZGF0YS5pc1JhbmdlU3VwcG9ydGVkOworICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGRhdGEuY29udGVudExlbmd0aDsKKyAgICB9KTsKKyAgfQorCisgIGdldCBoZWFkZXJzUmVhZHkoKSB7CisgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTsKKyAgfQorCisgIGdldCBjb250ZW50TGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoOworICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgfQorCisgIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBjb25zdCB7CisgICAgICB2YWx1ZSwKKyAgICAgIGRvbmUKKyAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTsKKworICAgIGlmIChkb25lKSB7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9OworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICB2YWx1ZTogdmFsdWUuYnVmZmVyLAorICAgICAgZG9uZTogZmFsc2UKKyAgICB9OworICB9CisKKyAgY2FuY2VsKHJlYXNvbikgeworICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgfQorCit9CisKK2NsYXNzIFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyIHsKKyAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCwgbXNnSGFuZGxlcikgeworICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisKKyAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJhbmdlUmVhZGVyIiwgeworICAgICAgYmVnaW4sCisgICAgICBlbmQKKyAgICB9KTsKKworICAgIHRoaXMuX3JlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOworICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGFzeW5jIHJlYWQoKSB7CisgICAgY29uc3QgeworICAgICAgdmFsdWUsCisgICAgICBkb25lCisgICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7CisKKyAgICBpZiAoZG9uZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfTsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgdmFsdWU6IHZhbHVlLmJ1ZmZlciwKKyAgICAgIGRvbmU6IGZhbHNlCisgICAgfTsKKyAgfQorCisgIGNhbmNlbChyZWFzb24pIHsKKyAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgIH0KKworfQorCisvKioqLyB9KQorLyoqKioqKi8gXSk7Cit9KTsKKy8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZi53b3JrZXIuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvcGRmLndvcmtlci5qcy5tYXAgYi9idWlsZC9wZGYud29ya2VyLmpzLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTA4NmEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvcGRmLndvcmtlci5qcy5tYXAKQEAgLTAsMCArMSBAQAoreyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL3BkZi53b3JrZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL3dvcmtlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL3NoYXJlZC91dGlsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvc2hhcmVkL2NvbXBhdGliaWxpdHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9zaGFyZWQvaXNfbm9kZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvcHJpbWl0aXZlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvcGRmX21hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL2NodW5rZWRfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9jb3JlX3V0aWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9kb2N1bWVudC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvb2JqLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9wYXJzZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL3N0cmVhbS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvY2NpdHRfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9jY2l0dC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvamJpZzJfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9qYmlnMi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvYXJpdGhtZXRpY19kZWNvZGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9qcGVnX3N0cmVhbS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvanBnLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9qcHhfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9qcHguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL2NyeXB0by5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvY29sb3JzcGFjZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvaW1hZ2VfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL2Fubm90YXRpb24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL29wZXJhdG9yX2xpc3QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL3dyaXRlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvZXZhbHVhdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9jbWFwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9mb250cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvY2ZmX3BhcnNlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvY2hhcnNldHMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL2VuY29kaW5ncy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvZ2x5cGhsaXN0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9zdGFuZGFyZF9mb250cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvdW5pY29kZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvZm9udF9yZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvdHlwZTFfcGFyc2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9wYXR0ZXJuLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvcHNfcGFyc2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9iaWRpLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9tZXRyaWNzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9tdXJtdXJoYXNoMy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvaW1hZ2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9zaGFyZWQvbWVzc2FnZV9oYW5kbGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS93b3JrZXJfc3RyZWFtLmpzIl0sIm5hbWVzIjpbInBkZmpzVmVyc2lvbiIsInBkZmpzQnVpbGQiLCJjb25zdHJ1Y3RvciIsImZpbmlzaCIsInRlcm1pbmF0ZSIsImVuc3VyZU5vdFRlcm1pbmF0ZWQiLCJ0ZXN0TWVzc2FnZVByb2Nlc3NlZCIsImhhbmRsZXIiLCJzdXBwb3J0VHJhbnNmZXJzIiwiZGF0YSIsInNldFZlcmJvc2l0eUxldmVsIiwiV29ya2VyTWVzc2FnZUhhbmRsZXIiLCJ0ZXJtaW5hdGVkIiwiY2FuY2VsWEhScyIsIldvcmtlclRhc2tzIiwidmVyYm9zaXR5IiwiYXBpVmVyc2lvbiIsImRvY1BhcmFtcyIsIndvcmtlclZlcnNpb24iLCJlbnVtZXJhYmxlUHJvcGVydGllcyIsIlByb21pc2UiLCJkb2NJZCIsImRvY0Jhc2VVcmwiLCJ3b3JrZXJIYW5kbGVyTmFtZSIsInRhc2siLCJpIiwicGRmTWFuYWdlciIsInBkZk1hbmFnZXJDYXBhYmlsaXR5Iiwic291cmNlIiwibmV3UGRmTWFuYWdlciIsImNhY2hlZENodW5rcyIsInBkZlN0cmVhbSIsImZ1bGxSZXF1ZXN0IiwiZGlzYWJsZUF1dG9GZXRjaCIsIm1zZ0hhbmRsZXIiLCJwYXNzd29yZCIsImxlbmd0aCIsInJhbmdlQ2h1bmtTaXplIiwibG9hZGVkIiwiZmx1c2hDaHVua3MiLCJwZGZGaWxlIiwiYXJyYXlzVG9CeXRlcyIsIndhcm4iLCJyZWFkUHJvbWlzZSIsInJlYWRDaHVuayIsImFycmF5Qnl0ZUxlbmd0aCIsInRvdGFsIiwiTWF0aCIsInJlamVjdCIsInBkZkluZm8iLCJleCIsInN0YXJ0V29ya2VyVGFzayIsImZpbmlzaFdvcmtlclRhc2siLCJwZGZNYW5hZ2VyUmVhZHkiLCJsb2FkRG9jdW1lbnQiLCJvbkZhaWx1cmUiLCJldmFsdWF0b3JPcHRpb25zIiwibWF4SW1hZ2VTaXplIiwiZGlzYWJsZUZvbnRGYWNlIiwiaWdub3JlRXJyb3JzIiwiaXNFdmFsU3VwcG9ydGVkIiwiZm9udEV4dHJhUHJvcGVydGllcyIsImdldFBkZk1hbmFnZXIiLCJzdHJlYW0iLCJwYWdlUmVmIiwiUmVmIiwicmVmIiwicGFnZSIsInByb21pc2VzIiwiZG9jdW1lbnQiLCJwYWdlSW5kZXgiLCJuZXdSZWZzIiwieCIsImEiLCJ4cmVmIiwibmV3WHJlZkluZm8iLCJPYmplY3QiLCJfaW5mbyIsInhyZWZJbmZvIiwiaXNTdHJpbmciLCJzdHJpbmdUb1BERlN0cmluZyIsInJvb3RSZWYiLCJlbmNyeXB0IiwibmV3UmVmIiwiaW5mb1JlZiIsImluZm8iLCJmaWxlSWRzIiwic3RhcnRYUmVmIiwiaW5jcmVtZW50YWxVcGRhdGUiLCJzdGFydCIsIlZlcmJvc2l0eUxldmVsIiwiRGF0ZSIsImludGVudCIsInJlbmRlckludGVyYWN0aXZlRm9ybXMiLCJhbm5vdGF0aW9uU3RvcmFnZSIsIm9wZXJhdG9yTGlzdEluZm8iLCJzaW5rIiwiZmVhdHVyZUlkIiwiVU5TVVBQT1JURURfRkVBVFVSRVMiLCJub3JtYWxpemVXaGl0ZXNwYWNlIiwiY29tYmluZVRleHRJdGVtcyIsIndhaXRPbiIsImNsZWFudXBQcm9taXNlIiwic2V0dXBEb2MiLCJtYXliZVBvcnQiLCJpc01lc3NhZ2VQb3J0IiwiSURFTlRJVFlfTUFUUklYIiwiRk9OVF9JREVOVElUWV9NQVRSSVgiLCJQZXJtaXNzaW9uRmxhZyIsIlBSSU5UIiwiTU9ESUZZX0NPTlRFTlRTIiwiQ09QWSIsIk1PRElGWV9BTk5PVEFUSU9OUyIsIkZJTExfSU5URVJBQ1RJVkVfRk9STVMiLCJDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZIiwiQVNTRU1CTEUiLCJQUklOVF9ISUdIX1FVQUxJVFkiLCJUZXh0UmVuZGVyaW5nTW9kZSIsIkZJTEwiLCJTVFJPS0UiLCJGSUxMX1NUUk9LRSIsIklOVklTSUJMRSIsIkZJTExfQUREX1RPX1BBVEgiLCJTVFJPS0VfQUREX1RPX1BBVEgiLCJGSUxMX1NUUk9LRV9BRERfVE9fUEFUSCIsIkFERF9UT19QQVRIIiwiRklMTF9TVFJPS0VfTUFTSyIsIkFERF9UT19QQVRIX0ZMQUciLCJJbWFnZUtpbmQiLCJHUkFZU0NBTEVfMUJQUCIsIlJHQl8yNEJQUCIsIlJHQkFfMzJCUFAiLCJBbm5vdGF0aW9uVHlwZSIsIlRFWFQiLCJMSU5LIiwiRlJFRVRFWFQiLCJMSU5FIiwiU1FVQVJFIiwiQ0lSQ0xFIiwiUE9MWUdPTiIsIlBPTFlMSU5FIiwiSElHSExJR0hUIiwiVU5ERVJMSU5FIiwiU1FVSUdHTFkiLCJTVFJJS0VPVVQiLCJTVEFNUCIsIkNBUkVUIiwiSU5LIiwiUE9QVVAiLCJGSUxFQVRUQUNITUVOVCIsIlNPVU5EIiwiTU9WSUUiLCJXSURHRVQiLCJTQ1JFRU4iLCJQUklOVEVSTUFSSyIsIlRSQVBORVQiLCJXQVRFUk1BUksiLCJUSFJFRUQiLCJSRURBQ1QiLCJBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUiLCJNQVJLRUQiLCJSRVZJRVciLCJBbm5vdGF0aW9uTWFya2VkU3RhdGUiLCJVTk1BUktFRCIsIkFubm90YXRpb25SZXZpZXdTdGF0ZSIsIkFDQ0VQVEVEIiwiUkVKRUNURUQiLCJDQU5DRUxMRUQiLCJDT01QTEVURUQiLCJOT05FIiwiQW5ub3RhdGlvblJlcGx5VHlwZSIsIkdST1VQIiwiUkVQTFkiLCJBbm5vdGF0aW9uRmxhZyIsIkhJRERFTiIsIk5PWk9PTSIsIk5PUk9UQVRFIiwiTk9WSUVXIiwiUkVBRE9OTFkiLCJMT0NLRUQiLCJUT0dHTEVOT1ZJRVciLCJMT0NLRURDT05URU5UUyIsIkFubm90YXRpb25GaWVsZEZsYWciLCJSRVFVSVJFRCIsIk5PRVhQT1JUIiwiTVVMVElMSU5FIiwiUEFTU1dPUkQiLCJOT1RPR0dMRVRPT0ZGIiwiUkFESU8iLCJQVVNIQlVUVE9OIiwiQ09NQk8iLCJFRElUIiwiU09SVCIsIkZJTEVTRUxFQ1QiLCJNVUxUSVNFTEVDVCIsIkRPTk9UU1BFTExDSEVDSyIsIkRPTk9UU0NST0xMIiwiQ09NQiIsIlJJQ0hURVhUIiwiUkFESU9TSU5VTklTT04iLCJDT01NSVRPTlNFTENIQU5HRSIsIkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUiLCJTT0xJRCIsIkRBU0hFRCIsIkJFVkVMRUQiLCJJTlNFVCIsIlN0cmVhbVR5cGUiLCJVTktOT1dOIiwiRkxBVEUiLCJMWlciLCJEQ1QiLCJKUFgiLCJKQklHIiwiQTg1IiwiQUhYIiwiQ0NGIiwiUkxYIiwiRm9udFR5cGUiLCJUWVBFMSIsIlRZUEUxQyIsIkNJREZPTlRUWVBFMCIsIkNJREZPTlRUWVBFMEMiLCJUUlVFVFlQRSIsIkNJREZPTlRUWVBFMiIsIlRZUEUzIiwiT1BFTlRZUEUiLCJUWVBFMCIsIk1NVFlQRTEiLCJFUlJPUlMiLCJXQVJOSU5HUyIsIklORk9TIiwiQ01hcENvbXByZXNzaW9uVHlwZSIsIkJJTkFSWSIsIlNUUkVBTSIsIk9QUyIsImRlcGVuZGVuY3kiLCJzZXRMaW5lV2lkdGgiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRNaXRlckxpbWl0Iiwic2V0RGFzaCIsInNldFJlbmRlcmluZ0ludGVudCIsInNldEZsYXRuZXNzIiwic2V0R1N0YXRlIiwic2F2ZSIsInJlc3RvcmUiLCJ0cmFuc2Zvcm0iLCJtb3ZlVG8iLCJsaW5lVG8iLCJjdXJ2ZVRvIiwiY3VydmVUbzIiLCJjdXJ2ZVRvMyIsImNsb3NlUGF0aCIsInJlY3RhbmdsZSIsInN0cm9rZSIsImNsb3NlU3Ryb2tlIiwiZmlsbCIsImVvRmlsbCIsImZpbGxTdHJva2UiLCJlb0ZpbGxTdHJva2UiLCJjbG9zZUZpbGxTdHJva2UiLCJjbG9zZUVPRmlsbFN0cm9rZSIsImVuZFBhdGgiLCJjbGlwIiwiZW9DbGlwIiwiYmVnaW5UZXh0IiwiZW5kVGV4dCIsInNldENoYXJTcGFjaW5nIiwic2V0V29yZFNwYWNpbmciLCJzZXRIU2NhbGUiLCJzZXRMZWFkaW5nIiwic2V0Rm9udCIsInNldFRleHRSZW5kZXJpbmdNb2RlIiwic2V0VGV4dFJpc2UiLCJtb3ZlVGV4dCIsInNldExlYWRpbmdNb3ZlVGV4dCIsInNldFRleHRNYXRyaXgiLCJuZXh0TGluZSIsInNob3dUZXh0Iiwic2hvd1NwYWNlZFRleHQiLCJuZXh0TGluZVNob3dUZXh0IiwibmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQiLCJzZXRDaGFyV2lkdGgiLCJzZXRDaGFyV2lkdGhBbmRCb3VuZHMiLCJzZXRTdHJva2VDb2xvclNwYWNlIiwic2V0RmlsbENvbG9yU3BhY2UiLCJzZXRTdHJva2VDb2xvciIsInNldFN0cm9rZUNvbG9yTiIsInNldEZpbGxDb2xvciIsInNldEZpbGxDb2xvck4iLCJzZXRTdHJva2VHcmF5Iiwic2V0RmlsbEdyYXkiLCJzZXRTdHJva2VSR0JDb2xvciIsInNldEZpbGxSR0JDb2xvciIsInNldFN0cm9rZUNNWUtDb2xvciIsInNldEZpbGxDTVlLQ29sb3IiLCJzaGFkaW5nRmlsbCIsImJlZ2luSW5saW5lSW1hZ2UiLCJiZWdpbkltYWdlRGF0YSIsImVuZElubGluZUltYWdlIiwicGFpbnRYT2JqZWN0IiwibWFya1BvaW50IiwibWFya1BvaW50UHJvcHMiLCJiZWdpbk1hcmtlZENvbnRlbnQiLCJiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyIsImVuZE1hcmtlZENvbnRlbnQiLCJiZWdpbkNvbXBhdCIsImVuZENvbXBhdCIsInBhaW50Rm9ybVhPYmplY3RCZWdpbiIsInBhaW50Rm9ybVhPYmplY3RFbmQiLCJiZWdpbkdyb3VwIiwiZW5kR3JvdXAiLCJiZWdpbkFubm90YXRpb25zIiwiZW5kQW5ub3RhdGlvbnMiLCJiZWdpbkFubm90YXRpb24iLCJlbmRBbm5vdGF0aW9uIiwicGFpbnRKcGVnWE9iamVjdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwIiwicGFpbnRJbWFnZVhPYmplY3QiLCJwYWludElubGluZUltYWdlWE9iamVjdCIsInBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAiLCJwYWludEltYWdlWE9iamVjdFJlcGVhdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCIsInBhaW50U29saWRDb2xvckltYWdlTWFzayIsImNvbnN0cnVjdFBhdGgiLCJ1bmtub3duIiwiZm9ybXMiLCJqYXZhU2NyaXB0Iiwic21hc2siLCJzaGFkaW5nUGF0dGVybiIsImZvbnQiLCJlcnJvclRpbGluZ1BhdHRlcm4iLCJlcnJvckV4dEdTdGF0ZSIsImVycm9yWE9iamVjdCIsImVycm9yRm9udExvYWRUeXBlMyIsImVycm9yRm9udFN0YXRlIiwiZXJyb3JGb250TWlzc2luZyIsImVycm9yRm9udFRyYW5zbGF0ZSIsImVycm9yQ29sb3JTcGFjZSIsImVycm9yT3BlcmF0b3JMaXN0IiwiZXJyb3JGb250VG9Vbmljb2RlIiwiZXJyb3JGb250TG9hZE5hdGl2ZSIsImVycm9yRm9udEdldFBhdGgiLCJlcnJvck1hcmtlZENvbnRlbnQiLCJQYXNzd29yZFJlc3BvbnNlcyIsIk5FRURfUEFTU1dPUkQiLCJJTkNPUlJFQ1RfUEFTU1dPUkQiLCJOdW1iZXIiLCJjb25zb2xlIiwidW5yZWFjaGFibGUiLCJiYXNlIiwib3RoZXIiLCJ1cmwiLCJhYnNvbHV0ZVVybCIsImJhc2VVcmwiLCJfaXNWYWxpZFByb3RvY29sIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiQmFzZUV4Y2VwdGlvbiIsIk51bGxDaGFyYWN0ZXJzUmVnRXhwIiwic3RyIiwiYXNzZXJ0IiwiYnl0ZXMiLCJNQVhfQVJHVU1FTlRfQ09VTlQiLCJTdHJpbmciLCJzdHJCdWYiLCJjaHVua0VuZCIsImNodW5rIiwiYXJyIiwicmVzdWx0TGVuZ3RoIiwicG9zIiwiaXRlbSIsInN0cmluZ1RvQnl0ZXMiLCJpdGVtTGVuZ3RoIiwidmFsdWUiLCJidWZmZXI4IiwidmlldzMyIiwiSXNMaXR0bGVFbmRpYW5DYWNoZWQiLCJzaGFkb3ciLCJpc0xpdHRsZUVuZGlhbiIsIklzRXZhbFN1cHBvcnRlZENhY2hlZCIsInJnYkJ1ZiIsIm0xIiwibTIiLCJ4dCIsInAiLCJtIiwieXQiLCJkIiwicDEiLCJVdGlsIiwicDIiLCJyIiwicDMiLCJwNCIsInYiLCJ0cmFuc3Bvc2UiLCJiIiwiYyIsImZpcnN0Iiwic2Vjb25kIiwic3giLCJzeSIsInJlY3QiLCJvcmRlcmVkWCIsInJlY3QxIiwicmVjdDIiLCJvcmRlcmVkWSIsInJlc3VsdCIsIlBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlIiwiY29kZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiYXJyMSIsImFycjIiLCJlbGVtZW50IiwiZGF0ZSIsImJ1ZmZlciIsImNhcGFiaWxpdHkiLCJpc1NldHRsZWQiLCJnZXQiLCJyZXNvbHZlIiwiY3JlYXRlT2JqZWN0VVJMIiwiZGlnaXRzIiwiZm9yY2VEYXRhU2NoZW1hIiwiVVJMIiwiYmxvYiIsInR5cGUiLCJpaSIsImIxIiwiYjIiLCJiMyIsImQxIiwiZDIiLCJkMyIsImQ0IiwiaXNOb2RlSlMiLCJwcm9jZXNzIiwiRU9GIiwiTmFtZSIsIm5hbWVDYWNoZSIsIm5hbWVWYWx1ZSIsIkNtZCIsImNtZENhY2hlIiwiY21kVmFsdWUiLCJEaWN0Iiwibm9uU2VyaWFsaXphYmxlIiwiYXNzaWduWHJlZiIsImtleTIiLCJrZXkzIiwiZ2V0QXJyYXkiLCJBcnJheSIsImdldFJhdyIsImdldEtleXMiLCJnZXRSYXdWYWx1ZXMiLCJzZXQiLCJoYXMiLCJmb3JFYWNoIiwiY2FsbGJhY2siLCJtZXJnZVN1YkRpY3RzIiwibWVyZ2VkRGljdCIsImRpY3QiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJ2YWx1ZXMiLCJzdWJEaWN0IiwicmVmQ2FjaGUiLCJ0b1N0cmluZyIsImtleSIsImdlbiIsInJlZlZhbHVlIiwicHV0IiwicmVtb3ZlIiwicHV0QWxpYXMiLCJjbGVhciIsImlzTmFtZSIsInYxIiwidjIiLCJjcmVhdGVWYWxpZEFic29sdXRlVXJsIiwib25Mb2FkZWRTdHJlYW0iLCJlbnN1cmVEb2MiLCJlbnN1cmVYUmVmIiwiZW5zdXJlQ2F0YWxvZyIsImdldFBhZ2UiLCJmb250RmFsbGJhY2siLCJjbGVhbnVwIiwibWFudWFsbHlUcmlnZ2VyZWQiLCJyZXF1ZXN0UmFuZ2UiLCJyZXF1ZXN0TG9hZGVkU3RyZWFtIiwic2VuZFByb2dyZXNzaXZlRGF0YSIsInVwZGF0ZVBhc3N3b3JkIiwib2JqIiwiYXJncyIsImdldE1pc3NpbmdDaHVua3MiLCJjaHVua3MiLCJuIiwiZ2V0QmFzZVN0cmVhbXMiLCJhbGxDaHVua3NMb2FkZWQiLCJvblJlY2VpdmVEYXRhIiwiY2h1bmtTaXplIiwiYmVnaW4iLCJlbmQiLCJiZWdpbkNodW5rIiwiZW5kQ2h1bmsiLCJjdXJDaHVuayIsIm9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YSIsInBvc2l0aW9uIiwiZW5zdXJlQnl0ZSIsImVuc3VyZVJhbmdlIiwibmV4dEVtcHR5Q2h1bmsiLCJudW1DaHVua3MiLCJoYXNDaHVuayIsImdldEJ5dGUiLCJnZXRVaW50MTYiLCJiMCIsImdldEludDMyIiwiZ2V0Qnl0ZXMiLCJmb3JjZUNsYW1wZWQiLCJzdHJFbmQiLCJzdWJhcnJheSIsInBlZWtCeXRlIiwicGVla2VkQnl0ZSIsInBlZWtCeXRlcyIsImdldEJ5dGVSYW5nZSIsInNraXAiLCJyZXNldCIsIm1vdmVTdGFydCIsIm1ha2VTdWJTdHJlYW0iLCJDaHVua2VkU3RyZWFtU3Vic3RyZWFtIiwibWlzc2luZ0NodW5rcyIsInN1YlN0cmVhbSIsInNlbmRSZXF1ZXN0IiwicmFuZ2VSZWFkZXIiLCJwcm9taXNlIiwiY2h1bmtEYXRhIiwicmVxdWVzdEFsbENodW5rcyIsIl9yZXF1ZXN0Q2h1bmtzIiwicmVxdWVzdElkIiwiY2h1bmtzTmVlZGVkIiwiY2h1bmtzVG9SZXF1ZXN0IiwicmVxdWVzdElkcyIsImdyb3VwZWRDaHVua3NUb1JlcXVlc3QiLCJncm91cGVkQ2h1bmsiLCJyZWFzb24iLCJnZXRTdHJlYW0iLCJyZXF1ZXN0UmFuZ2VzIiwicmFuZ2VzIiwicmFuZ2UiLCJncm91cENodW5rcyIsImdyb3VwZWRDaHVua3MiLCJwcmV2Q2h1bmsiLCJvblByb2dyZXNzIiwiaXNQcm9ncmVzc2l2ZSIsImxvYWRlZFJlcXVlc3RzIiwibGFzdENodW5rIiwib25FcnJvciIsImdldEJlZ2luQ2h1bmsiLCJnZXRFbmRDaHVuayIsImFib3J0IiwibG9va3VwIiwiaW5pdGlhbGl6ZXIiLCJzdG9wV2hlbkZvdW5kIiwiTE9PUF9MSU1JVCIsImxvb3BDb3VudCIsIlJPTUFOX05VTUJFUl9NQVAiLCJsb3dlckNhc2UiLCJudW1iZXIiLCJyb21hbkJ1ZiIsInJvbWFuU3RyIiwib2Zmc2V0IiwiY2giLCJERUZBVUxUX1VTRVJfVU5JVCIsIkxFVFRFUl9TSVpFX01FRElBQk9YIiwiYW5ub3RhdGlvbiIsImlkQ291bnRlcnMiLCJfZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSIsImlzRGljdCIsImRpY3RBcnJheSIsIl9nZXRCb3VuZGluZ0JveCIsImJveCIsImlzTnVtIiwiY3JvcEJveCIsImlzQXJyYXlFcXVhbCIsInZpZXciLCJyb3RhdGUiLCJnZXRDb250ZW50U3RyZWFtIiwiY29udGVudCIsInN0cmVhbXMiLCJpc1N0cmVhbSIsInBhcnRpYWxFdmFsdWF0b3IiLCJpZEZhY3RvcnkiLCJmb250Q2FjaGUiLCJidWlsdEluQ01hcENhY2hlIiwiZ2xvYmFsSW1hZ2VDYWNoZSIsIm9wdGlvbnMiLCJuZXdSZWZzUHJvbWlzZXMiLCJpc0Fubm90YXRpb25SZW5kZXJhYmxlIiwibG9hZFJlc291cmNlcyIsIm9iamVjdExvYWRlciIsImdldE9wZXJhdG9yTGlzdCIsImNvbnRlbnRTdHJlYW1Qcm9taXNlIiwicmVzb3VyY2VzUHJvbWlzZSIsImRhdGFQcm9taXNlcyIsInBhZ2VMaXN0UHJvbWlzZSIsIm9wTGlzdCIsInRyYW5zcGFyZW5jeSIsInJlc291cmNlcyIsIm9wZXJhdG9yTGlzdCIsImFubm90YXRpb25zIiwicGFnZU9wTGlzdCIsIm9wTGlzdFByb21pc2VzIiwiZXh0cmFjdFRleHRDb250ZW50IiwiZ2V0QW5ub3RhdGlvbnNEYXRhIiwiYW5ub3RhdGlvbnNEYXRhIiwicGFyc2VkQW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uUHJvbWlzZXMiLCJQREZfSEVBREVSX1NJR05BVFVSRSIsIlNUQVJUWFJFRl9TSUdOQVRVUkUiLCJFTkRPQkpfU0lHTkFUVVJFIiwiRklOR0VSUFJJTlRfRklSU1RfQllURVMiLCJFTVBUWV9GSU5HRVJQUklOVCIsIlBERl9IRUFERVJfVkVSU0lPTl9SRUdFWFAiLCJsaW1pdCIsImJhY2t3YXJkcyIsInNpZ25hdHVyZUxlbmd0aCIsInNpZ25hdHVyZSIsInNjYW5CeXRlcyIsInNjYW5MZW5ndGgiLCJzaWduYXR1cmVFbmQiLCJqIiwiaXNBcnJheUJ1ZmZlciIsInBhcnNlIiwibGluZWFyaXphdGlvbiIsIkxpbmVhcml6YXRpb24iLCJlcnIiLCJmaW5kIiwic3RlcCIsInN0YXJ0WFJlZkxlbmd0aCIsImZvdW5kIiwiaXNXaGl0ZVNwYWNlIiwicGFyc2VJbnQiLCJpc05hTiIsImNoZWNrSGVhZGVyIiwiTUFYX1BERl9WRVJTSU9OX0xFTkdUSCIsInZlcnNpb24iLCJwYXJzZVN0YXJ0WFJlZiIsIm51bSIsIl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzIiwicmVjdXJzaW9uRGVwdGgiLCJSRUNVUlNJT05fTElNSVQiLCJmaWVsZCIsImlzU2lnbmF0dXJlIiwiaXNJbnZpc2libGUiLCJmb3JtSW5mbyIsImhhc0Fjcm9Gb3JtIiwiaGFzWGZhIiwiYWNyb0Zvcm0iLCJ4ZmEiLCJmaWVsZHMiLCJoYXNGaWVsZHMiLCJzaWdGbGFncyIsImhhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMiLCJEb2N1bWVudEluZm9WYWxpZGF0b3JzIiwiVGl0bGUiLCJBdXRob3IiLCJTdWJqZWN0IiwiS2V5d29yZHMiLCJDcmVhdG9yIiwiUHJvZHVjZXIiLCJDcmVhdGlvbkRhdGUiLCJNb2REYXRlIiwiVHJhcHBlZCIsImRvY0luZm8iLCJQREZGb3JtYXRWZXJzaW9uIiwiSXNMaW5lYXJpemVkIiwiSXNBY3JvRm9ybVByZXNlbnQiLCJJc1hGQVByZXNlbnQiLCJJc0NvbGxlY3Rpb25QcmVzZW50IiwiaW5mb0RpY3QiLCJjdXN0b21WYWx1ZSIsImlzQm9vbCIsImlkQXJyYXkiLCJoYXNoIiwiY2FsY3VsYXRlTUQ1IiwiZmluZ2VycHJpbnRCdWYiLCJoZXgiLCJfZ2V0TGluZWFyaXphdGlvblBhZ2UiLCJjYXRhbG9nIiwiZ2xvYmFsSWRGYWN0b3J5IiwiY2hlY2tGaXJzdFBhZ2UiLCJkZXN0IiwiY29sbGVjdGlvbiIsInN0cmVhbVJlZiIsImlzUmVmIiwic3VwcHJlc3NFbmNyeXB0aW9uIiwic3VidHlwZSIsIm1ldGFkYXRhIiwic3RyaW5nVG9VVEY4U3RyaW5nIiwiYnl0ZXNUb1N0cmluZyIsImUiLCJwYWdlc09iaiIsIl9yZWFkRG9jdW1lbnRPdXRsaW5lIiwicm9vdCIsIml0ZW1zIiwicXVldWUiLCJwYXJlbnQiLCJwcm9jZXNzZWQiLCJibGFja0NvbG9yIiwib3V0bGluZURpY3QiLCJDYXRhbG9nIiwiZGVzdERpY3QiLCJyZXN1bHRPYmoiLCJ0aXRsZSIsImZsYWdzIiwiY29sb3IiLCJjb3VudCIsInJnYkNvbG9yIiwiQ29sb3JTcGFjZSIsIm91dGxpbmVJdGVtIiwidW5zYWZlVXJsIiwibmV3V2luZG93IiwiYm9sZCIsIml0YWxpYyIsInBlcm1pc3Npb25zIiwiX3JlYWRQZXJtaXNzaW9ucyIsImNvbmZpZyIsImRlZmF1bHRDb25maWciLCJncm91cHNEYXRhIiwiZ3JvdXBzIiwiZ3JvdXBSZWZzIiwiZ3JvdXAiLCJpZCIsImdyb3VwUmVmIiwibmFtZSIsIl9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnIiwib25QYXJzZWQiLCJjb250ZW50R3JvdXBSZWZzIiwibmVzdGVkTGV2ZWxzIiwib3JkZXIiLCJwYXJzZWRPcmRlclJlZnMiLCJuZXN0ZWRPcmRlciIsInBhcnNlTmVzdGVkT3JkZXIiLCJoaWRkZW5Hcm91cHMiLCJuZXN0ZWROYW1lIiwicGFyc2VPcmRlciIsIk1BWF9ORVNURURfTEVWRUxTIiwiY3JlYXRvciIsImJhc2VTdGF0ZSIsIm9uIiwicGFyc2VPbk9mZiIsIm9mZiIsImRlc3RzIiwibmFtZXMiLCJmZXRjaERlc3RpbmF0aW9uIiwiZ2V0RGVzdGluYXRpb24iLCJfcmVhZERlc3RzIiwiX3JlYWRQYWdlTGFiZWxzIiwicGFnZUxhYmVscyIsInN0eWxlIiwicHJlZml4IiwibnVtYmVyVHJlZSIsIm51bXMiLCJjdXJyZW50TGFiZWwiLCJjdXJyZW50SW5kZXgiLCJsYWJlbERpY3QiLCJzIiwic3QiLCJ0b1JvbWFuTnVtZXJhbHMiLCJMSU1JVCIsIkFfVVBQRVJfQ0FTRSIsIkFfTE9XRVJfQ0FTRSIsImJhc2VDaGFyQ29kZSIsImxldHRlckluZGV4IiwiY2hhcmFjdGVyIiwiY2hhckJ1ZiIsImpqIiwicGFnZUxheW91dCIsInBhZ2VNb2RlIiwiVmlld2VyUHJlZmVyZW5jZXNWYWxpZGF0b3JzIiwiSGlkZVRvb2xiYXIiLCJIaWRlTWVudWJhciIsIkhpZGVXaW5kb3dVSSIsIkZpdFdpbmRvdyIsIkNlbnRlcldpbmRvdyIsIkRpc3BsYXlEb2NUaXRsZSIsIk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSIsIkRpcmVjdGlvbiIsIlZpZXdBcmVhIiwiVmlld0NsaXAiLCJQcmludEFyZWEiLCJQcmludENsaXAiLCJQcmludFNjYWxpbmciLCJEdXBsZXgiLCJQaWNrVHJheUJ5UERGU2l6ZSIsIlByaW50UGFnZVJhbmdlIiwiTnVtQ29waWVzIiwicHJlZnMiLCJwcmVmVmFsdWUiLCJpc1ZhbGlkIiwib3BlbkFjdGlvbiIsImFjdGlvbiIsImF0dGFjaG1lbnRzIiwibmFtZVRyZWUiLCJmcyIsImpzRGljdCIsImpzIiwiYXBwZW5kSWZKYXZhU2NyaXB0RGljdCIsInRyYW5zbGF0ZWRGb250cyIsInRyYW5zbGF0ZWRGb250IiwiZ2V0UGFnZURpY3QiLCJub2Rlc1RvVmlzaXQiLCJ2aXNpdGVkTm9kZXMiLCJwYWdlS2lkc0NvdW50Q2FjaGUiLCJjdXJyZW50UGFnZUluZGV4IiwiY3VycmVudE5vZGUiLCJuZXh0Iiwib2JqSWQiLCJraWRzIiwibGFzdCIsImdldFBhZ2VJbmRleCIsImlzUmVmc0VxdWFsIiwibm9kZSIsInBhcmVudFJlZiIsImtpZFByb21pc2VzIiwia2lkIiwicGFyYW1zIiwiYWN0aW9uVHlwZSIsImFjdGlvbk5hbWUiLCJhZGREZWZhdWx0UHJvdG9jb2xUb1VybCIsInVybERpY3QiLCJyZW1vdGVEZXN0IiwiSlNPTiIsIm5hbWVkQWN0aW9uIiwianNBY3Rpb24iLCJVUkxfT1BFTl9NRVRIT0RTIiwicmVnZXgiLCJqc1VybCIsInRyeUNvbnZlcnRVcmxFbmNvZGluZyIsIlhSZWYiLCJzdHJlYW1UeXBlcyIsImZvbnRUeXBlcyIsImdldE5ld1JlZiIsInJlc2V0TmV3UmVmIiwic2V0U3RhcnRYUmVmIiwidHJhaWxlckRpY3QiLCJpZHMiLCJmaWxlSWQiLCJwcm9jZXNzWFJlZlRhYmxlIiwiZW50cnlOdW0iLCJzdHJlYW1Qb3MiLCJwYXJzZXIiLCJwYXJzZXJCdWYxIiwicGFyc2VyQnVmMiIsImlzQ21kIiwicmVhZFhSZWZUYWJsZSIsInRhYmxlU3RhdGUiLCJlbnRyeSIsInByb2Nlc3NYUmVmU3RyZWFtIiwic3RyZWFtUGFyYW1ldGVycyIsImJ5dGVXaWR0aHMiLCJlbnRyeVJhbmdlcyIsInJlYWRYUmVmU3RyZWFtIiwic3RyZWFtU3RhdGUiLCJ0eXBlRmllbGRXaWR0aCIsIm9mZnNldEZpZWxkV2lkdGgiLCJnZW5lcmF0aW9uRmllbGRXaWR0aCIsImdlbmVyYXRpb24iLCJpbmRleE9iamVjdHMiLCJUQUIiLCJMRiIsIkNSIiwiU1BBQ0UiLCJQRVJDRU5UIiwiTFQiLCJ0b2tlbiIsIndoYXQiLCJkYXRhTGVuZ3RoIiwic2tpcHBlZCIsIm9ialJlZ0V4cCIsImVuZG9ialJlZ0V4cCIsIm5lc3RlZE9ialJlZ0V4cCIsIkNIRUNLX0NPTlRFTlRfTEVOR1RIIiwidHJhaWxlckJ5dGVzIiwic3RhcnR4cmVmQnl0ZXMiLCJvYmpCeXRlcyIsInhyZWZCeXRlcyIsInRyYWlsZXJzIiwieHJlZlN0bXMiLCJyZWFkVG9rZW4iLCJza2lwVW50aWwiLCJ1bmNvbXByZXNzZWQiLCJzdGFydFBvcyIsImVuZFBvcyIsImNvbnRlbnRMZW5ndGgiLCJjaGVja1BvcyIsInRva2VuU3RyIiwib2JqVG9rZW4iLCJ4cmVmVGFnT2Zmc2V0IiwibGV4ZXIiLCJhbGxvd1N0cmVhbXMiLCJyZWNvdmVyeU1vZGUiLCJyb290RGljdCIsInJlYWRYUmVmIiwic3RhcnRYUmVmUGFyc2VkQ2FjaGUiLCJnZXRFbnRyeSIsInhyZWZFbnRyeSIsImZldGNoSWZSZWYiLCJmZXRjaCIsImNhY2hlRW50cnkiLCJmZXRjaFVuY29tcHJlc3NlZCIsIm9iajEiLCJvYmoyIiwib2JqMyIsImZldGNoQ29tcHJlc3NlZCIsInRhYmxlT2Zmc2V0IiwiZW50cmllcyIsImdldENhdGFsb2dPYmoiLCJnZXRBbGwiLCJraWRzT3JFbnRyaWVzIiwiTUFYX0xFVkVMUyIsImwiLCJsaW1pdHMiLCJ0bXAiLCJjdXJyZW50S2V5IiwibW0iLCJGaWxlU3BlYyIsImZpbGVuYW1lIiwicGlja1BsYXRmb3JtSXRlbSIsImZpbGVPYmoiLCJPYmplY3RMb2FkZXIiLCJtYXlIYXZlQ2hpbGRyZW4iLCJrZXlzIiwicmF3VmFsdWUiLCJub2Rlc1RvUmV2aXNpdCIsInBlbmRpbmdSZXF1ZXN0cyIsImJhc2VTdHJlYW1zIiwiZm91bmRNaXNzaW5nRGF0YSIsImFkZENoaWxkcmVuIiwiTUFYX0xFTkdUSF9UT19DQUNIRSIsIk1BWF9BRExFUjMyX0xFTkdUSCIsImJ5dGVzTGVuZ3RoIiwicmVmaWxsIiwic2hpZnQiLCJ0cnlTaGlmdCIsImdldE9iaiIsImNpcGhlclRyYW5zZm9ybSIsImJ1ZjEiLCJhcnJheSIsImlzRU9GIiwiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQiLCJFIiwiSSIsIk5VTCIsInN0YXRlIiwibWF5YmVFSVBvcyIsImZvbGxvd2luZ0J5dGVzIiwibmV4dE9iaiIsImVuZE9mZnNldCIsImZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQiLCJmb3VuZEVPSSIsIm1hcmtlckxlbmd0aCIsImZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kIiwiVElMREUiLCJHVCIsInRpbGRlUG9zIiwibWF5YmVFSSIsImZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZCIsImlubGluZVN0cmVhbVNraXBFSSIsIm1ha2VJbmxpbmVJbWFnZSIsImRpY3RMZW5ndGgiLCJmaWx0ZXIiLCJmaWx0ZXJOYW1lIiwiZmlsdGVyWmVybyIsImltYWdlU3RyZWFtIiwiaW1hZ2VCeXRlcyIsImluaXRpYWxTdHJlYW1Qb3MiLCJkaWN0Qnl0ZXMiLCJjYWNoZUtleSIsImNvbXB1dGVBZGxlcjMyIiwiX2ZpbmRTdHJlYW1MZW5ndGgiLCJTQ0FOX0JMT0NLX0xFTkdUSCIsIm1ha2VTdHJlYW0iLCJFTkRTVFJFQU1fU0lHTkFUVVJFIiwiYWN0dWFsTGVuZ3RoIiwiTUFYX1RSVU5DQVRJT04iLCJUUlVOQ0FURURfU0lHTkFUVVJFIiwibWF5YmVMZW5ndGgiLCJsYXN0Qnl0ZSIsImZpbHRlckFycmF5IiwicGFyYW1zQXJyYXkiLCJtYWtlRmlsdGVyIiwieHJlZlN0cmVhbVN0YXRzIiwiZWFybHlDaGFuZ2UiLCJzcGVjaWFsQ2hhcnMiLCJrbm93bkNvbW1hbmRzIiwibmV4dENoYXIiLCJwZWVrQ2hhciIsImdldE51bWJlciIsImVOb3RhdGlvbiIsImRpdmlkZUJ5Iiwic2lnbiIsImJhc2VWYWx1ZSIsInBvd2VyVmFsdWUiLCJwb3dlclZhbHVlU2lnbiIsImN1cnJlbnREaWdpdCIsImdldFN0cmluZyIsIm51bVBhcmVuIiwiZG9uZSIsImNoYXJCdWZmZXJlZCIsImdldE5hbWUiLCJ0b0hleERpZ2l0IiwicHJldmlvdXNDaCIsIngyIiwiX2hleFN0cmluZ1dhcm4iLCJNQVhfSEVYX1NUUklOR19OVU1fV0FSTiIsImdldEhleFN0cmluZyIsImlzRmlyc3RIZXgiLCJmaXJzdERpZ2l0Iiwic2Vjb25kRGlnaXQiLCJjb21tZW50Iiwia25vd25Db21tYW5kRm91bmQiLCJwb3NzaWJsZUNvbW1hbmQiLCJwZWVrT2JqIiwiY3VycmVudENoYXIiLCJiZWdpbklubGluZUltYWdlUG9zIiwic2tpcFRvTmV4dExpbmUiLCJhbGxvd1plcm9WYWx1ZSIsImxpbkRpY3QiLCJoaW50cyIsImhpbnRzTGVuZ3RoIiwiaW5kZXgiLCJoaW50IiwiZ2V0SW50IiwiZ2V0SGludHMiLCJvYmplY3ROdW1iZXJGaXJzdCIsImVuZEZpcnN0IiwibnVtUGFnZXMiLCJtYWluWFJlZkVudHJpZXNPZmZzZXQiLCJwYWdlRmlyc3QiLCJTdHJlYW0iLCJhcnJheUJ1ZmZlciIsIlN0cmluZ1N0cmVhbSIsIkRlY29kZVN0cmVhbSIsImVtcHR5QnVmZmVyIiwibWF5YmVNaW5CdWZmZXJMZW5ndGgiLCJlbnN1cmVCdWZmZXIiLCJyZXF1ZXN0ZWQiLCJzaXplIiwiYnVmZmVyMiIsImJ1ZkVuZCIsIlN0cmVhbXNTZXF1ZW5jZVN0cmVhbSIsImJ1ZmZlckxlbmd0aCIsIm5ld0xlbmd0aCIsIkZsYXRlU3RyZWFtIiwiY29kZUxlbkNvZGVNYXAiLCJsZW5ndGhEZWNvZGUiLCJkaXN0RGVjb2RlIiwiZml4ZWRMaXRDb2RlVGFiIiwiZml4ZWREaXN0Q29kZVRhYiIsImNtZiIsImZsZyIsImNvZGVTaXplIiwiY29kZUJ1ZiIsImNvZGVzIiwidGFibGUiLCJtYXhMZW4iLCJjb2RlTGVuIiwiY29kZVZhbCIsImxlbmd0aHMiLCJsZW4iLCJ2YWwiLCJjb2RlMiIsInQiLCJoZHIiLCJibG9ja0xlbiIsImNoZWNrIiwiYmxvY2siLCJsaXRDb2RlVGFibGUiLCJkaXN0Q29kZVRhYmxlIiwibnVtTGl0Q29kZXMiLCJudW1EaXN0Q29kZXMiLCJudW1Db2RlTGVuQ29kZXMiLCJjb2RlTGVuQ29kZUxlbmd0aHMiLCJjb2RlTGVuQ29kZVRhYiIsImNvZGVMZW5ndGhzIiwiYml0c0xlbmd0aCIsImJpdHNPZmZzZXQiLCJyZXBlYXRMZW5ndGgiLCJjb2RlMSIsImRpc3QiLCJrIiwiUHJlZGljdG9yU3RyZWFtIiwicHJlZGljdG9yIiwiY29sb3JzIiwiYml0cyIsImNvbHVtbnMiLCJyb3dCeXRlcyIsInJhd0J5dGVzIiwiaW5idWYiLCJvdXRidWYiLCJpbmJpdHMiLCJvdXRiaXRzIiwiYnl0ZXNQZXJQaXhlbCIsInN1bSIsImNvbXBBcnJheSIsImJpdE1hc2siLCJrayIsInBpeEJ5dGVzIiwicHJldlJvdyIsInVwIiwidXBMZWZ0IiwibGVmdCIsInBhIiwicGIiLCJwYyIsIkRlY3J5cHRTdHJlYW0iLCJoYXNNb3JlRGF0YSIsImRlY3J5cHQiLCJBc2NpaTg1U3RyZWFtIiwiVElMREFfQ0hBUiIsIlpfTE9XRVJfQ0hBUiIsImlucHV0IiwiQXNjaWlIZXhTdHJlYW0iLCJVUFNUUkVBTV9CTE9DS19TSVpFIiwibWF4RGVjb2RlTGVuZ3RoIiwiZGlnaXQiLCJSdW5MZW5ndGhTdHJlYW0iLCJyZXBlYXRIZWFkZXIiLCJMWldTdHJlYW0iLCJtYXhMendEaWN0aW9uYXJ5U2l6ZSIsImx6d1N0YXRlIiwiY29kZUxlbmd0aCIsIm5leHRDb2RlIiwiZGljdGlvbmFyeVZhbHVlcyIsImRpY3Rpb25hcnlMZW5ndGhzIiwiZGljdGlvbmFyeVByZXZDb2RlcyIsImN1cnJlbnRTZXF1ZW5jZSIsImN1cnJlbnRTZXF1ZW5jZUxlbmd0aCIsImJpdHNDYWNoZWQiLCJjYWNoZWREYXRhIiwiYmxvY2tTaXplIiwiZXN0aW1hdGVkRGVjb2RlZFNpemUiLCJkZWNvZGVkU2l6ZURlbHRhIiwicHJldkNvZGUiLCJkZWNvZGVkTGVuZ3RoIiwiY3VycmVudEJ1ZmZlckxlbmd0aCIsImhhc1ByZXYiLCJxIiwiTnVsbFN0cmVhbSIsIkNDSVRURmF4U3RyZWFtIiwiSyIsIkVuZE9mTGluZSIsIkVuY29kZWRCeXRlQWxpZ24iLCJDb2x1bW5zIiwiUm93cyIsIkVuZE9mQmxvY2siLCJCbGFja0lzMSIsIkNDSVRURmF4RGVjb2RlciIsImNjaXR0RU9MIiwiY2NpdHRFT0YiLCJ0d29EaW1QYXNzIiwidHdvRGltSG9yaXoiLCJ0d29EaW1WZXJ0MCIsInR3b0RpbVZlcnRSMSIsInR3b0RpbVZlcnRMMSIsInR3b0RpbVZlcnRSMiIsInR3b0RpbVZlcnRMMiIsInR3b0RpbVZlcnRSMyIsInR3b0RpbVZlcnRMMyIsInR3b0RpbVRhYmxlIiwid2hpdGVUYWJsZTEiLCJ3aGl0ZVRhYmxlMiIsImJsYWNrVGFibGUxIiwiYmxhY2tUYWJsZTIiLCJibGFja1RhYmxlMyIsImVvYmxvY2siLCJyZWFkTmV4dENoYXIiLCJyZWZMaW5lIiwiY29kaW5nTGluZSIsInJlZlBvcyIsImJsYWNrUGl4ZWxzIiwiY29kZTMiLCJnb3RFT0wiLCJfYWRkUGl4ZWxzIiwiY29kaW5nUG9zIiwiYTEiLCJfYWRkUGl4ZWxzTmVnIiwiX2ZpbmRUYWJsZUNvZGUiLCJsaW1pdFZhbHVlIiwiX2dldFR3b0RpbUNvZGUiLCJfZ2V0V2hpdGVDb2RlIiwiX2dldEJsYWNrQ29kZSIsIl9sb29rQml0cyIsIl9lYXRCaXRzIiwiSmJpZzJTdHJlYW0iLCJqYmlnMkltYWdlIiwiZ2xvYmFsc1N0cmVhbSIsImdsb2JhbHMiLCJKYmlnMkltYWdlIiwiQ29udGV4dENhY2hlIiwiZ2V0Q29udGV4dHMiLCJEZWNvZGluZ0NvbnRleHQiLCJkZWNvZGVyIiwiY2FjaGUiLCJjb250ZXh0cyIsImNvbnRleHRDYWNoZSIsInByZXYiLCJiaXQiLCJyZWFkQml0cyIsIlNlZ21lbnRUeXBlcyIsIkNvZGluZ1RlbXBsYXRlcyIsInkiLCJSZWZpbmVtZW50VGVtcGxhdGVzIiwiY29kaW5nIiwicmVmZXJlbmNlIiwiUmV1c2VkQ29udGV4dHMiLCJSZWZpbmVtZW50UmV1c2VkQ29udGV4dHMiLCJkZWNvZGluZ0NvbnRleHQiLCJiaXRtYXAiLCJPTERfUElYRUxfTUFTSyIsInJvdyIsInJvdzEiLCJyb3cyIiwiY29udGV4dExhYmVsIiwicGl4ZWwiLCJkZWNvZGVNTVJCaXRtYXAiLCJ0ZW1wbGF0ZUluZGV4IiwiYXQiLCJkZWNvZGVCaXRtYXBUZW1wbGF0ZTAiLCJ1c2Vza2lwIiwidGVtcGxhdGUiLCJ0ZW1wbGF0ZUxlbmd0aCIsInRlbXBsYXRlWCIsInRlbXBsYXRlWSIsImNoYW5naW5nVGVtcGxhdGVFbnRyaWVzIiwicmV1c2VNYXNrIiwibWluWCIsIm1heFgiLCJtaW5ZIiwiY2hhbmdpbmdFbnRyaWVzTGVuZ3RoIiwiY2hhbmdpbmdUZW1wbGF0ZVgiLCJjaGFuZ2luZ1RlbXBsYXRlWSIsImNoYW5naW5nVGVtcGxhdGVCaXQiLCJzYmJfbGVmdCIsInNiYl90b3AiLCJzYmJfcmlnaHQiLCJ3aWR0aCIsInBzZXVkb1BpeGVsQ29udGV4dCIsImx0cCIsInNsdHAiLCJpMCIsImowIiwiY29kaW5nVGVtcGxhdGUiLCJjb2RpbmdUZW1wbGF0ZUxlbmd0aCIsImNvZGluZ1RlbXBsYXRlWCIsImNvZGluZ1RlbXBsYXRlWSIsInJlZmVyZW5jZVRlbXBsYXRlIiwicmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgiLCJyZWZlcmVuY2VUZW1wbGF0ZVgiLCJyZWZlcmVuY2VUZW1wbGF0ZVkiLCJyZWZlcmVuY2VXaWR0aCIsInJlZmVyZW5jZUJpdG1hcCIsInJlZmVyZW5jZUhlaWdodCIsImh1ZmZtYW4iLCJuZXdTeW1ib2xzIiwiY3VycmVudEhlaWdodCIsInN5bWJvbENvZGVMZW5ndGgiLCJsb2cyIiwic3ltYm9scyIsInRhYmxlQjEiLCJnZXRTdGFuZGFyZFRhYmxlIiwic3ltYm9sV2lkdGhzIiwiZGVsdGFIZWlnaHQiLCJodWZmbWFuVGFibGVzIiwiZGVjb2RlSW50ZWdlciIsImN1cnJlbnRXaWR0aCIsInRvdGFsV2lkdGgiLCJmaXJzdFN5bWJvbCIsImRlbHRhV2lkdGgiLCJudW1iZXJPZkluc3RhbmNlcyIsImRlY29kZVRleHRSZWdpb24iLCJzeW1ib2xJZCIsImRlY29kZUlBSUQiLCJyZHgiLCJyZHkiLCJzeW1ib2wiLCJkZWNvZGVSZWZpbmVtZW50IiwiZGVjb2RlQml0bWFwIiwiYml0bWFwU2l6ZSIsImh1ZmZtYW5JbnB1dCIsImNvbGxlY3RpdmVCaXRtYXAiLCJyZWFkVW5jb21wcmVzc2VkQml0bWFwIiwib3JpZ2luYWxFbmQiLCJiaXRtYXBFbmQiLCJudW1iZXJPZlN5bWJvbHNEZWNvZGVkIiwieE1pbiIsImJpdG1hcFdpZHRoIiwieE1heCIsInN5bWJvbEJpdG1hcCIsImV4cG9ydGVkU3ltYm9scyIsImN1cnJlbnRGbGFnIiwidG90YWxTeW1ib2xzTGVuZ3RoIiwicnVuTGVuZ3RoIiwic3RyaXBUIiwiZmlyc3RTIiwiZGVsdGFUIiwiZGVsdGFGaXJzdFMiLCJjdXJyZW50UyIsImN1cnJlbnRUIiwic3RyaXBTaXplIiwiYXBwbHlSZWZpbmVtZW50IiwicmVmaW5lbWVudCIsImlucHV0U3ltYm9scyIsInN5bWJvbFdpZHRoIiwic3ltYm9sSGVpZ2h0IiwicmR3IiwicmRoIiwib2Zmc2V0VCIsIm9mZnNldFMiLCJzMiIsInN5bWJvbFJvdyIsIm1heFdpZHRoIiwidDIiLCJkZWx0YVMiLCJjb2xsZWN0aXZlV2lkdGgiLCJwYXR0ZXJucyIsInBhdHRlcm5CaXRtYXAiLCJwYXR0ZXJuV2lkdGgiLCJjb21iaW5hdGlvbk9wZXJhdG9yIiwicmVnaW9uQml0bWFwIiwibnVtYmVyT2ZQYXR0ZXJucyIsInBhdHRlcm4wIiwicGF0dGVybkhlaWdodCIsImJpdHNQZXJWYWx1ZSIsImdyYXlTY2FsZUJpdFBsYW5lcyIsIm1tcklucHV0IiwibWciLCJuZyIsInBhdHRlcm5JbmRleCIsImdyaWRPZmZzZXRYIiwiZ3JpZE9mZnNldFkiLCJyZWdpb25Sb3ciLCJwYXR0ZXJuUm93IiwicmVnaW9uWSIsInJlZ2lvblgiLCJzZWdtZW50SGVhZGVyIiwicmVhZFVpbnQzMiIsInNlZ21lbnRUeXBlIiwicGFnZUFzc29jaWF0aW9uRmllbGRTaXplIiwicmVmZXJyZWRGbGFncyIsInJlZmVycmVkVG9Db3VudCIsInJldGFpbkJpdHMiLCJyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUiLCJyZWZlcnJlZFRvIiwicmVhZFVpbnQxNiIsImdlbmVyaWNSZWdpb25JbmZvIiwicmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbiIsImdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MiLCJnZW5lcmljUmVnaW9uTW1yIiwic2VhcmNoUGF0dGVybkxlbmd0aCIsInNlYXJjaFBhdHRlcm4iLCJzZWdtZW50cyIsInJlYWRTZWdtZW50SGVhZGVyIiwic2VnbWVudCIsImhlYWRlciIsImhlaWdodCIsIlJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoIiwiZGljdGlvbmFyeSIsImRpY3Rpb25hcnlGbGFncyIsImF0TGVuZ3RoIiwicmVhZEludDgiLCJ0ZXh0UmVnaW9uIiwidGV4dFJlZ2lvblNlZ21lbnRGbGFncyIsInRleHRSZWdpb25IdWZmbWFuRmxhZ3MiLCJwYXR0ZXJuRGljdGlvbmFyeSIsInBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MiLCJoYWxmdG9uZVJlZ2lvbiIsImhhbGZ0b25lUmVnaW9uRmxhZ3MiLCJnZW5lcmljUmVnaW9uIiwicGFnZUluZm8iLCJyZXNvbHV0aW9uWCIsInJlc29sdXRpb25ZIiwicGFnZVNlZ21lbnRGbGFncyIsImNhbGxiYWNrTmFtZSIsInZpc2l0b3IiLCJwcm9jZXNzU2VnbWVudCIsInJlYWRTZWdtZW50cyIsInByb2Nlc3NTZWdtZW50cyIsImJpdFBhY2tlZCIsImltZ0RhdGEiLCJtYXNrIiwiU2ltcGxlU2VnbWVudFZpc2l0b3IiLCJvblBhZ2VJbmZvcm1hdGlvbiIsInJvd1NpemUiLCJkcmF3Qml0bWFwIiwicmVnaW9uSW5mbyIsIm1hc2swIiwib2Zmc2V0MCIsIm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsInJlZ2lvbiIsIm9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uIiwib25TeW1ib2xEaWN0aW9uYXJ5IiwiZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMiLCJyZWZlcnJlZFNlZ21lbnRzIiwicmVmZXJyZWRTeW1ib2xzIiwiZGVjb2RlU3ltYm9sRGljdGlvbmFyeSIsIm9uSW1tZWRpYXRlVGV4dFJlZ2lvbiIsImdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzIiwib25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24iLCJvblBhdHRlcm5EaWN0aW9uYXJ5IiwiZGVjb2RlUGF0dGVybkRpY3Rpb25hcnkiLCJvbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwiZGVjb2RlSGFsZnRvbmVSZWdpb24iLCJvbkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24iLCJvblRhYmxlcyIsImN1c3RvbVRhYmxlcyIsImRlY29kZVRhYmxlc1NlZ21lbnQiLCJsaW5lRGF0YSIsImxpbmUiLCJIdWZmbWFuVHJlZU5vZGUiLCJidWlsZFRyZWUiLCJkZWNvZGVOb2RlIiwiaHRPZmZzZXQiLCJyZWFkZXIiLCJsaW5lcyIsIkh1ZmZtYW5UYWJsZSIsImRlY29kZSIsImFzc2lnblByZWZpeENvZGVzIiwibGluZXNMZW5ndGgiLCJwcmVmaXhMZW5ndGhNYXgiLCJoaXN0b2dyYW0iLCJjdXJyZW50TGVuZ3RoIiwiZmlyc3RDb2RlIiwiY3VycmVudENvZGUiLCJjdXJyZW50VGVtcCIsImxvd2VzdFZhbHVlIiwiaGlnaGVzdFZhbHVlIiwicHJlZml4U2l6ZUJpdHMiLCJyYW5nZVNpemVCaXRzIiwiY3VycmVudFJhbmdlTG93IiwicHJlZml4TGVuZ3RoIiwicmFuZ2VMZW5ndGgiLCJzdGFuZGFyZFRhYmxlc0NhY2hlIiwiUmVhZGVyIiwicmVhZEJpdCIsIm51bUJpdHMiLCJieXRlQWxpZ24iLCJydW5Db2Rlc1RhYmxlIiwibnVtYmVyT2ZSZXBlYXRzIiwicmVwZWF0ZWRMZW5ndGgiLCJzeW1ib2xJRFRhYmxlIiwiY3VzdG9tSW5kZXgiLCJ0YWJsZUZpcnN0UyIsImdldEN1c3RvbUh1ZmZtYW5UYWJsZSIsInRhYmxlRGVsdGFTIiwidGFibGVEZWx0YVQiLCJ0YWJsZURlbHRhSGVpZ2h0IiwidGFibGVEZWx0YVdpZHRoIiwidGFibGVCaXRtYXBTaXplIiwidGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMiLCJlb2YiLCJjdXJyZW50Qnl0ZSIsImVuZE9mQmxvY2siLCJsb29rRm9yRU9GTGltaXQiLCJwYXJzZUNodW5rcyIsInBhcnNlSmJpZzJDaHVua3MiLCJwYXJzZUpiaWcyIiwiUWVUYWJsZSIsInFlIiwibm1wcyIsIm5scHMiLCJzd2l0Y2hGbGFnIiwiYnl0ZUluIiwiYnAiLCJjeF9pbmRleCIsImN4X21wcyIsInFlVGFibGVJY3giLCJxZUljeCIsIkpwZWdTdHJlYW0iLCJqcGVnT3B0aW9ucyIsImRlY29kZVRyYW5zZm9ybSIsImNvbG9yVHJhbnNmb3JtIiwiZGVjb2RlQXJyIiwiYml0c1BlckNvbXBvbmVudCIsImRlY29kZUFyckxlbmd0aCIsInRyYW5zZm9ybU5lZWRlZCIsIm1heFZhbHVlIiwianBlZ0ltYWdlIiwiZm9yY2VSR0IiLCJpc1NvdXJjZVBERiIsIkpwZWdJbWFnZSIsImRjdFppZ1phZyIsImRjdENvczEiLCJkY3RTaW4xIiwiZGN0Q29zMyIsImRjdFNpbjMiLCJkY3RDb3M2IiwiZGN0U2luNiIsImRjdFNxcnQyIiwiZGN0U3FydDFkMiIsImNoaWxkcmVuIiwicGFyc2VETkxNYXJrZXIiLCJtY3VzUGVyTGluZSIsImZyYW1lIiwicHJvZ3Jlc3NpdmUiLCJzdGFydE9mZnNldCIsImJpdHNEYXRhIiwiYml0c0NvdW50IiwibmV4dEJ5dGUiLCJzY2FuTGluZXMiLCJtYXliZVNjYW5MaW5lcyIsImJsb2NrUm93IiwicmVjZWl2ZSIsImRlY29kZUh1ZmZtYW4iLCJjb21wb25lbnQiLCJkaWZmIiwicmVjZWl2ZUFuZEV4dGVuZCIsInJzIiwieiIsImJsb2NrT2Zmc2V0IiwiZW9icnVuIiwic3VjY2Vzc2l2ZUFDU3RhdGUiLCJvZmZzZXRaIiwic3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIiwibWN1Um93IiwibWN1IiwibWN1Q29sIiwiYmxvY2tDb2wiLCJnZXRCbG9ja0J1ZmZlck9mZnNldCIsImNvbXBvbmVudHNMZW5ndGgiLCJjb21wb25lbnRzIiwic3BlY3RyYWxTdGFydCIsImRlY29kZUZuIiwic3VjY2Vzc2l2ZVByZXYiLCJtY3VFeHBlY3RlZCIsIm1jdVRvUmVhZCIsInJlc2V0SW50ZXJ2YWwiLCJkZWNvZGVCbG9jayIsImgiLCJkZWNvZGVNY3UiLCJmaWxlTWFya2VyIiwiZmluZE5leHRGaWxlTWFya2VyIiwicGFydGlhbE1zZyIsInF0IiwiYmxvY2tEYXRhIiwicDAiLCJibG9ja0J1ZmZlck9mZnNldCIsInA1IiwicDYiLCJwNyIsInYwIiwidjMiLCJ2NCIsInY3IiwidjUiLCJ2NiIsImNvbCIsImJsb2Nrc1BlckxpbmUiLCJibG9ja3NQZXJDb2x1bW4iLCJjb21wdXRhdGlvbkJ1ZmZlciIsInF1YW50aXplQW5kSW52ZXJzZSIsIm1heFBvcyIsIm5ld1BvcyIsImN1cnJlbnRQb3MiLCJjdXJyZW50TWFya2VyIiwiaW52YWxpZCIsIm1hcmtlciIsIm5ld01hcmtlciIsImRubFNjYW5MaW5lcyIsIm1jdXNQZXJDb2x1bW4iLCJibG9ja3NQZXJMaW5lRm9yTWN1IiwiYmxvY2tzUGVyQ29sdW1uRm9yTWN1IiwiYmxvY2tzQnVmZmVyU2l6ZSIsImpmaWYiLCJhZG9iZSIsIm51bVNPU01hcmtlcnMiLCJxdWFudGl6YXRpb25UYWJsZXMiLCJodWZmbWFuVGFibGVzQUMiLCJodWZmbWFuVGFibGVzREMiLCJhcHBEYXRhIiwicmVhZERhdGFCbG9jayIsIm1ham9yIiwibWlub3IiLCJkZW5zaXR5VW5pdHMiLCJ4RGVuc2l0eSIsInlEZW5zaXR5IiwidGh1bWJXaWR0aCIsInRodW1iSGVpZ2h0IiwidGh1bWJEYXRhIiwiZmxhZ3MwIiwiZmxhZ3MxIiwidHJhbnNmb3JtQ29kZSIsInF1YW50aXphdGlvblRhYmxlc0xlbmd0aCIsInF1YW50aXphdGlvblRhYmxlc0VuZCIsInF1YW50aXphdGlvblRhYmxlU3BlYyIsInRhYmxlRGF0YSIsInNvZlNjYW5MaW5lcyIsImNvbXBvbmVudHNDb3VudCIsIm1heEgiLCJtYXhWIiwiY29tcG9uZW50SWQiLCJxSWQiLCJxdWFudGl6YXRpb25JZCIsInF1YW50aXphdGlvblRhYmxlIiwicHJlcGFyZUNvbXBvbmVudHMiLCJodWZmbWFuTGVuZ3RoIiwiaHVmZm1hblRhYmxlU3BlYyIsImNvZGVMZW5ndGhTdW0iLCJodWZmbWFuVmFsdWVzIiwiYnVpbGRIdWZmbWFuVGFibGUiLCJzZWxlY3RvcnNDb3VudCIsImNvbXBvbmVudEluZGV4IiwidGFibGVTcGVjIiwic3BlY3RyYWxFbmQiLCJzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiIsImRlY29kZVNjYW4iLCJuZXh0RmlsZU1hcmtlciIsIm91dHB1dCIsImJ1aWxkQ29tcG9uZW50RGF0YSIsInNjYWxlWCIsInNjYWxlWSIsIl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhIiwibnVtQ29tcG9uZW50cyIsInhTY2FsZUJsb2NrT2Zmc2V0IiwibWFzazNMU0IiLCJjb21wb25lbnRTY2FsZVgiLCJjb21wb25lbnRTY2FsZVkiLCJibG9ja3NQZXJTY2FubGluZSIsImxhc3RDb21wb25lbnRTY2FsZVgiLCJfY29udmVydFljY1RvUmdiIiwiWSIsIkNiIiwiQ3IiLCJfY29udmVydFljY2tUb1JnYiIsIl9jb252ZXJ0WWNja1RvQ215ayIsIl9jb252ZXJ0Q215a1RvUmdiIiwiZ2V0RGF0YSIsInJnYkRhdGEiLCJncmF5Q29sb3IiLCJKcHhTdHJlYW0iLCJqcHhJbWFnZSIsInRpbGVDb3VudCIsInRpbGVDb21wb25lbnRzIiwidGlsZVdpZHRoIiwidGlsZUhlaWdodCIsInRpbGVMZWZ0IiwidGlsZVRvcCIsInNyYyIsInNyY1Bvc2l0aW9uIiwiZGF0YVBvc2l0aW9uIiwiaW1nUm93U2l6ZSIsInRpbGVSb3dTaXplIiwiSnB4SW1hZ2UiLCJTdWJiYW5kc0dhaW5Mb2cyIiwiTEwiLCJMSCIsIkhMIiwiSEgiLCJoZWFkIiwiaGVhZGVyU2l6ZSIsImxib3giLCJ0Ym94IiwianVtcERhdGFMZW5ndGgiLCJtZXRob2QiLCJjb2xvcnNwYWNlIiwiaGVhZGVyVHlwZSIsInBhcnNlSW1hZ2VQcm9wZXJ0aWVzIiwibmV3Qnl0ZSIsIm9sZEJ5dGUiLCJYc2l6IiwiWXNpeiIsIlhPc2l6IiwiWU9zaXoiLCJDc2l6IiwicGFyc2VDb2Rlc3RyZWFtIiwiY29udGV4dCIsImRvTm90UmVjb3ZlciIsInNpeiIsInByZWNpc2lvbiIsImlzU2lnbmVkIiwiWFJzaXoiLCJZUnNpeiIsImNhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnMiLCJjYWxjdWxhdGVUaWxlR3JpZHMiLCJxY2QiLCJzcWNkIiwic3BxY2RTaXplIiwic2NhbGFyRXhwb3VuZGVkIiwic3BxY2RzIiwic3BxY2QiLCJxY2MiLCJjcWNjIiwiY29kIiwic2NvZCIsImJsb2NrU3R5bGUiLCJwcmVjaW5jdHNTaXplcyIsInByZWNpbmN0c1NpemUiLCJQUHgiLCJQUHkiLCJ1bnN1cHBvcnRlZCIsInRpbGUiLCJpbml0aWFsaXplVGlsZSIsImJ1aWxkUGFja2V0cyIsInBhcnNlVGlsZVBhY2tldHMiLCJ0cmFuc2Zvcm1Db21wb25lbnRzIiwidGlsZXMiLCJudW1YdGlsZXMiLCJudW1ZdGlsZXMiLCJ0aWxlQ29tcG9uZW50IiwiY29kT3JDb2MiLCJwcmVjaW5jdFdpZHRoIiwiZGltZW5zaW9ucyIsInByZWNpbmN0SGVpZ2h0IiwiaXNaZXJvUmVzIiwicmVzb2x1dGlvbiIsInByZWNpbmN0V2lkdGhJblN1YmJhbmQiLCJwcmVjaW5jdEhlaWdodEluU3ViYmFuZCIsIm51bXByZWNpbmN0c3dpZGUiLCJudW1wcmVjaW5jdHNoaWdoIiwibnVtcHJlY2luY3RzIiwieGNiXyIsInljYl8iLCJjb2RlYmxvY2tXaWR0aCIsImNvZGVibG9ja0hlaWdodCIsImNieDAiLCJzdWJiYW5kIiwiY2J5MCIsImNieDEiLCJjYnkxIiwicHJlY2luY3RQYXJhbWV0ZXJzIiwiY29kZWJsb2NrcyIsInByZWNpbmN0cyIsImNvZGVibG9jayIsImNieCIsImNieSIsInRieDAiLCJ0YnkwIiwidGJ4MSIsInRieTEiLCJwaSIsInBqIiwicHJlY2luY3ROdW1iZXIiLCJwcmVjaW5jdCIsImNieE1pbiIsImNieU1pbiIsImNieE1heCIsImNieU1heCIsIm51bWNvZGVibG9ja3dpZGUiLCJudW1jb2RlYmxvY2toaWdoIiwicHJlY2luY3RDb2RlYmxvY2tzIiwic3ViYmFuZHMiLCJ0aWxlSW5kZXgiLCJsYXllcnNDb3VudCIsIm1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCIsInBhY2tldCIsImNyZWF0ZVBhY2tldCIsIm1heE51bVByZWNpbmN0c0luTGV2ZWwiLCJtYXhOdW1QcmVjaW5jdHMiLCJyZXNvbHV0aW9ucyIsImdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUiLCJwcmVjaW5jdHNJdGVyYXRpb25TaXplcyIsInB4IiwicHkiLCJkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQiLCJzaXplSW5JbWFnZVNjYWxlIiwiZ2V0UHJlY2luY3RJbmRleElmRXhpc3QiLCJwb3NYIiwicHhJbmRleCIsInByZWNpbmN0SXRlcmF0aW9uU2l6ZXMiLCJwb3NZIiwicHlJbmRleCIsInN0YXJ0UHJlY2luY3RSb3dJbmRleCIsIm1pbldpZHRoIiwibWluSGVpZ2h0IiwibWF4TnVtV2lkZSIsIm1heE51bUhpZ2giLCJzaXplUGVyQ29tcG9uZW50Iiwic2l6ZVBlclJlc29sdXRpb24iLCJtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQiLCJtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50IiwibWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQiLCJtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCIsInNjYWxlIiwid2lkdGhDdXJyZW50UmVzb2x1dGlvbiIsImhlaWdodEN1cnJlbnRSZXNvbHV0aW9uIiwiYmxvY2tzRGltZW5zaW9ucyIsImdldEJsb2Nrc0RpbWVuc2lvbnMiLCJidWlsZFByZWNpbmN0cyIsImJ1aWxkQ29kZWJsb2NrcyIsImJzY2FsZSIsInJlc29sdXRpb25TdWJiYW5kcyIsInByb2dyZXNzaW9uT3JkZXIiLCJidWZmZXJTaXplIiwic2tpcE5leHRCaXQiLCJza2lwQnl0ZXMiLCJzb3BNYXJrZXJVc2VkIiwiZXBoTWFya2VyVXNlZCIsInBhY2tldHNJdGVyYXRvciIsImFsaWduVG9CeXRlIiwic2tpcE1hcmtlcklmRXF1YWwiLCJsYXllck51bWJlciIsImNvZGVibG9ja0NvbHVtbiIsImNvZGVibG9ja1JvdyIsImNvZGVibG9ja0luY2x1ZGVkIiwiZmlyc3RUaW1lSW5jbHVzaW9uIiwiaW5jbHVzaW9uVHJlZSIsInplcm9CaXRQbGFuZXNUcmVlIiwidmFsdWVSZWFkeSIsImNvZGluZ3Bhc3NlcyIsInJlYWRDb2RpbmdwYXNzZXMiLCJjb2RpbmdwYXNzZXNMb2cyIiwiY29kZWREYXRhTGVuZ3RoIiwicGFja2V0SXRlbSIsIngwIiwieTAiLCJyaWdodCIsImJvdHRvbSIsImJsb2NrV2lkdGgiLCJibG9ja0hlaWdodCIsImJpdE1vZGVsIiwiY3VycmVudENvZGluZ3Bhc3NUeXBlIiwidG90YWxMZW5ndGgiLCJkYXRhSXRlbSIsImVuY29kZWREYXRhIiwibWFnbml0dWRlIiwiYml0c0RlY29kZWQiLCJtYWduaXR1ZGVDb3JyZWN0aW9uIiwicmV2ZXJzaWJsZSIsImludGVybGVhdmUiLCJsZXZlbE9mZnNldCIsIm5iIiwiY29lZmZpY2llbnRzIiwibWIiLCJjb2RpbmdTdHlsZVBhcmFtZXRlcnMiLCJxdWFudGl6YXRpb25QYXJhbWV0ZXJzIiwiZ3VhcmRCaXRzIiwic2VnbWVudGF0aW9uU3ltYm9sVXNlZCIsInN1YmJhbmRDb2VmZmljaWVudHMiLCJtdSIsImVwc2lsb24iLCJnYWluTG9nMiIsImRlbHRhIiwiY29weUNvZWZmaWNpZW50cyIsInRvcCIsInJlc3VsdEltYWdlcyIsInRyYW5zZm9ybWVkVGlsZXMiLCJ0cmFuc2Zvcm1UaWxlIiwidGlsZTAiLCJvdXQiLCJmb3VyQ29tcG9uZW50cyIsInkwaXRlbXMiLCJ5MWl0ZW1zIiwieTJpdGVtcyIsInkzaXRlbXMiLCJjb21wb25lbnQwIiwiYWxwaGEwMSIsInkxIiwieTIiLCJnIiwicWNkT3JRY2MiLCJUYWdUcmVlIiwibGV2ZWxzTGVuZ3RoIiwibGV2ZWwiLCJjdXJyZW50TGV2ZWwiLCJpbmNyZW1lbnRWYWx1ZSIsIm5leHRMZXZlbCIsIkluY2x1c2lvblRyZWUiLCJzdG9wVmFsdWUiLCJwcm9wYWdhdGVWYWx1ZXMiLCJsZXZlbEluZGV4IiwiY3VycmVudFZhbHVlIiwiQml0TW9kZWwiLCJVTklGT1JNX0NPTlRFWFQiLCJSVU5MRU5HVEhfQ09OVEVYVCIsIkxMQW5kTEhDb250ZXh0c0xhYmVsIiwiSExDb250ZXh0TGFiZWwiLCJISENvbnRleHRMYWJlbCIsImNvbnRleHRMYWJlbFRhYmxlIiwiY29lZmZpY2llbnRDb3VudCIsImNvZWZmaWNlbnRzTWFnbml0dWRlIiwiemVyb0JpdFBsYW5lcyIsInNldERlY29kZXIiLCJzZXROZWlnaGJvcnNTaWduaWZpY2FuY2UiLCJuZWlnaGJvcnNTaWduaWZpY2FuY2UiLCJjb2x1bW4iLCJydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MiLCJjb2VmZmljZW50c1NpZ24iLCJwcm9jZXNzaW5nRmxhZ3MiLCJsYWJlbHMiLCJwcm9jZXNzZWRJbnZlcnNlTWFzayIsInByb2Nlc3NlZE1hc2siLCJmaXJzdE1hZ25pdHVkZUJpdE1hc2siLCJpMSIsImRlY2lzaW9uIiwiZGVjb2RlU2lnbkJpdCIsInNpZ25pZmljYW5jZTEiLCJzaWduMSIsInNpZ24wIiwiY29udHJpYnV0aW9uIiwiaG9yaXpvbnRhbENvbnRyaWJ1dGlvbiIsImRlY29kZWQiLCJydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzcyIsIndpZHRoNCIsImluZGV4MCIsImluZGV4TmV4dCIsInNpZ25pZmljYW5jZSIsInJ1bkNsZWFudXBQYXNzIiwib25lUm93RG93biIsInR3b1Jvd3NEb3duIiwidGhyZWVSb3dzRG93biIsImlOZXh0IiwiaW5kZXhCYXNlIiwiY2hlY2tBbGxFbXB0eSIsImFsbEVtcHR5IiwiaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50IiwiaTIiLCJjaGVja1NlZ21lbnRhdGlvblN5bWJvbCIsIlRyYW5zZm9ybSIsImxsIiwiajEiLCJqMiIsImxsV2lkdGgiLCJsbEhlaWdodCIsImxsSXRlbXMiLCJobF9saF9oaCIsImJ1ZmZlclBhZGRpbmciLCJyb3dCdWZmZXIiLCJudW1CdWZmZXJzIiwiY29sQnVmZmVycyIsImN1cnJlbnRCdWZmZXIiLCJ1IiwiSXJyZXZlcnNpYmxlVHJhbnNmb3JtIiwiYWxwaGEiLCJiZXRhIiwiZ2FtbWEiLCJLXyIsImN1cnJlbnQiLCJSZXZlcnNpYmxlVHJhbnNmb3JtIiwiQVJDRm91ckNpcGhlciIsImtleUxlbmd0aCIsImVuY3J5cHRCbG9jayIsInRtcDIiLCJoMCIsImgxIiwiaDIiLCJoMyIsInBhZGRlZExlbmd0aCIsInBhZGRlZCIsInciLCJmIiwicm90YXRlQXJnIiwiV29yZDY0IiwiaGlnaEludGVnZXIiLCJsb3dJbnRlZ2VyIiwiYW5kIiwid29yZCIsInhvciIsIm9yIiwic2hpZnRSaWdodCIsInBsYWNlcyIsInNoaWZ0TGVmdCIsInJvdGF0ZVJpZ2h0IiwiaGlnaCIsImxvdyIsIm5vdCIsImFkZCIsImxvd0FkZCIsImhpZ2hBZGQiLCJjb3B5VG8iLCJhc3NpZ24iLCJjYWxjdWxhdGVTSEEyNTYiLCJyb3RyIiwiaDQiLCJoNSIsImg2IiwiaDciLCJsaXR0bGVTaWdtYVByaW1lIiwibGl0dGxlU2lnbWEiLCJ0MSIsInNpZ21hUHJpbWUiLCJzaWdtYSIsIm1haiIsImNhbGN1bGF0ZVNIQTUxMiIsIm1vZGUzODQiLCJ0bXAxIiwidG1wMyIsImNhbGN1bGF0ZVNIQTM4NCIsIk51bGxDaXBoZXIiLCJkZWNyeXB0QmxvY2siLCJfZXhwYW5kS2V5IiwiX2RlY3J5cHQiLCJzMCIsInMxIiwiczMiLCJfZW5jcnlwdCIsIl9kZWNyeXB0QmxvY2syIiwic291cmNlTGVuZ3RoIiwiaXYiLCJwbGFpbiIsIm91dHB1dExlbmd0aCIsImxhc3RCbG9jayIsInBzTGVuIiwiY2lwaGVyIiwicmNvbiIsInQzIiwidDQiLCJQREYxNyIsImFycmF5MSIsImFycmF5MiIsImNoZWNrT3duZXJQYXNzd29yZCIsImhhc2hEYXRhIiwib3duZXJWYWxpZGF0aW9uU2FsdCIsImNvbXBhcmVCeXRlQXJyYXlzIiwiY2hlY2tVc2VyUGFzc3dvcmQiLCJnZXRPd25lcktleSIsIm93bmVyS2V5U2FsdCIsImdldFVzZXJLZXkiLCJQREYyMCIsImFycmF5TGVuZ3RoIiwidXNlckJ5dGVzIiwiazEiLCJjb25jYXRBcnJheXMiLCJyZW1haW5kZXIiLCJjYWxjdWxhdGVQREYyMEhhc2giLCJDaXBoZXJUcmFuc2Zvcm0iLCJjcmVhdGVTdHJlYW0iLCJkZWNyeXB0U3RyaW5nIiwiZW5jcnlwdFN0cmluZyIsInN0ckxlbiIsInBhZCIsImNyeXB0byIsImJ1ZiIsIkNpcGhlclRyYW5zZm9ybUZhY3RvcnkiLCJkZWZhdWx0UGFzc3dvcmRCeXRlcyIsInBhc3N3b3JkTGVuZ3RoIiwicmV2aXNpb24iLCJwZGZBbGdvcml0aG0iLCJoYXNoRGF0YVNpemUiLCJvd25lclBhc3N3b3JkIiwia2V5TGVuZ3RoSW5CeXRlcyIsImVuY3J5cHRpb25LZXkiLCJjaGVja0RhdGEiLCJkZXJpdmVkS2V5IiwidXNlclBhc3N3b3JkIiwiaWRlbnRpdHlOYW1lIiwiYWxnb3JpdGhtIiwiY2ZEaWN0Iiwic3RyZWFtQ3J5cHRvTmFtZSIsImhhbmRsZXJEaWN0IiwiZW5jcnlwdE1ldGFkYXRhIiwiZmlsZUlkQnl0ZXMiLCJ1dGY4U3RyaW5nVG9TdHJpbmciLCJwYXNzd29yZEJ5dGVzIiwicHJlcGFyZUtleURhdGEiLCJ1Qnl0ZXMiLCJ1c2VyVmFsaWRhdGlvblNhbHQiLCJ1c2VyS2V5U2FsdCIsIm93bmVyRW5jcnlwdGlvbiIsInVzZXJFbmNyeXB0aW9uIiwicGVybXMiLCJjcmVhdGVFbmNyeXB0aW9uS2V5MjAiLCJkZWNvZGVkUGFzc3dvcmQiLCJkZWNvZGVVc2VyUGFzc3dvcmQiLCJjZiIsImNyeXB0RmlsdGVyIiwiY2ZtIiwiYnVpbGRPYmplY3RLZXkiLCJjcmVhdGVDaXBoZXJUcmFuc2Zvcm0iLCJidWlsZENpcGhlckNvbnN0cnVjdG9yIiwiY2lwaGVyQ29uc3RydWN0b3IiLCJDT01QT05FTlRTIiwieFJhdGlvIiwidzEiLCJ5UmF0aW8iLCJuZXdJbmRleCIsInhTY2FsZWQiLCJ3MVNjYW5saW5lIiwib2xkSW5kZXgiLCJnZXRSZ2IiLCJyZ2IiLCJnZXRSZ2JJdGVtIiwiZ2V0UmdiQnVmZmVyIiwiZ2V0T3V0cHV0TGVuZ3RoIiwiaXNQYXNzdGhyb3VnaCIsImlzRGVmYXVsdERlY29kZSIsImZpbGxSZ2IiLCJvcmlnaW5hbFdpZHRoIiwibnVtQ29tcG9uZW50Q29sb3JzIiwibmVlZHNSZXNpemluZyIsIm9yaWdpbmFsSGVpZ2h0IiwiYWxsQ29sb3JzIiwiYnBjIiwiY29sb3JNYXAiLCJkZXN0UG9zIiwiY29tcHMiLCJyZ2JQb3MiLCJyZXNpemVSZ2JJbWFnZSIsImNzUmVmIiwiY3NOYW1lIiwibG9jYWxDb2xvclNwYWNlQ2FjaGUiLCJsb2NhbENvbG9yU3BhY2UiLCJwYXJzZWRDb2xvclNwYWNlIiwiY2FjaGVkQ29sb3JTcGFjZSIsImNzIiwiY29sb3JTcGFjZXMiLCJyZXNvdXJjZXNDUyIsIm1vZGUiLCJ3aGl0ZVBvaW50IiwiYmxhY2tQb2ludCIsIm1hdHJpeCIsIm51bUNvbXBzIiwiYWx0IiwiYWx0Q1MiLCJiYXNlQ1MiLCJoaVZhbCIsInRpbnRGbiIsInBkZkZ1bmN0aW9uRmFjdG9yeSIsInRtcEJ1ZiIsImJhc2VOdW1Db21wcyIsInVzZXNaZXJvVG9PbmVSYW5nZSIsImJhc2VCdWYiLCJzY2FsZWQiLCJ0aW50ZWQiLCJzcmNPZmZzZXQiLCJpbnB1dExlbmd0aCIsIm91dHB1dERlbHRhIiwibG9va3VwUG9zIiwiZGVzdE9mZnNldCIsImRlY29kZU1hcCIsIkRldmljZUNteWtDUyIsImNvbnZlcnRUb1JnYiIsIkNhbEdyYXlDUyIsIkEiLCJBRyIsIkwiLCJDYWxSR0JDUyIsIkJSQURGT1JEX1NDQUxFX01BVFJJWCIsIkJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYIiwiU1JHQl9ENjVfWFlaX1RPX1JHQl9NQVRSSVgiLCJGTEFUX1dISVRFUE9JTlRfTUFUUklYIiwidGVtcE5vcm1hbGl6ZU1hdHJpeCIsInRlbXBDb252ZXJ0TWF0cml4MSIsInRlbXBDb252ZXJ0TWF0cml4MiIsIkRFQ09ERV9MX0NPTlNUQU5UIiwiTE1TIiwic291cmNlV2hpdGVQb2ludCIsIkQ2NVgiLCJENjVZIiwiRDY1WiIsImFkanVzdFRvUmFuZ2UiLCJkZWNvZGVMIiwic291cmNlQmxhY2tQb2ludCIsIlhZWl9GbGF0IiwiemVyb0RlY29kZUwiLCJYX0RTVCIsIlhfU1JDIiwiWV9EU1QiLCJZX1NSQyIsIlpfRFNUIiwiWl9TUkMiLCJYX1NjYWxlIiwiWF9PZmZzZXQiLCJZX1NjYWxlIiwiWV9PZmZzZXQiLCJaX1NjYWxlIiwiWl9PZmZzZXQiLCJYWVpfSW4iLCJtYXRyaXhQcm9kdWN0IiwiTE1TX0ZsYXQiLCJjb252ZXJ0VG9GbGF0IiwiTE1TX0Q2NSIsImNvbnZlcnRUb0Q2NSIsIkIiLCJDIiwiQUdSIiwiQkdHIiwiQ0dCIiwiWCIsIloiLCJYWVoiLCJub3JtYWxpemVXaGl0ZVBvaW50VG9GbGF0IiwiWFlaX0JsYWNrIiwiY29tcGVuc2F0ZUJsYWNrUG9pbnQiLCJYWVpfRDY1Iiwibm9ybWFsaXplV2hpdGVQb2ludFRvRDY1IiwiU1JHQiIsInNSR0JUcmFuc2ZlckZ1bmN0aW9uIiwiWFciLCJZVyIsIlpXIiwiWEIiLCJZQiIsIlpCIiwiTGFiQ1MiLCJsb3cyIiwiTHMiLCJhcyIsImJzIiwibWF4VmFsIiwiTSIsIk4iLCJmbl9nIiwiZ2V0QnlOYW1lIiwiZ2V0QnlSZWYiLCJvbmx5UmVmcyIsInNob3VsZENhY2hlIiwicGFnZUluZGV4U2V0IiwiR2xvYmFsSW1hZ2VDYWNoZSIsImFkZFBhZ2VJbmRleCIsInNldERhdGEiLCJvbmx5RGF0YSIsInBhcmFtZXRlcnMiLCJmaWVsZFR5cGUiLCJxdWFkUG9pbnRzIiwicXVhZFBvaW50c0xpc3RzIiwiYW5ub3RhdGlvbkZsYWdzIiwiYm9yZGVyU3R5bGUiLCJjb250ZW50cyIsImhhc0FwcGVhcmFuY2UiLCJtb2RpZmljYXRpb25EYXRlIiwiX2hhc0ZsYWciLCJfaXNWaWV3YWJsZSIsIl9pc1ByaW50YWJsZSIsInNldENvbnRlbnRzIiwic2V0TW9kaWZpY2F0aW9uRGF0ZSIsInNldEZsYWdzIiwiaGFzRmxhZyIsInNldFJlY3RhbmdsZSIsInNldENvbG9yIiwic2V0Qm9yZGVyU3R5bGUiLCJkaWN0VHlwZSIsInNldEFwcGVhcmFuY2UiLCJhcHBlYXJhbmNlU3RhdGVzIiwibm9ybWFsQXBwZWFyYW5jZVN0YXRlIiwiYXBwZWFyYW5jZSIsImFwcGVhcmFuY2VEaWN0IiwiYmJveCIsImdldFRyYW5zZm9ybU1hdHJpeCIsInNldFdpZHRoIiwibWF4SGVpZ2h0Iiwic2V0U3R5bGUiLCJzZXREYXNoQXJyYXkiLCJkYXNoQXJyYXkiLCJhbGxaZXJvcyIsInZhbGlkTnVtYmVyIiwic2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyIsInNldFZlcnRpY2FsQ29ybmVyUmFkaXVzIiwicmF3SVJUIiwicnQiLCJzZXRDcmVhdGlvbkRhdGUiLCJmaWVsZFZhbHVlIiwiX2NvbnN0cnVjdEZpZWxkTmFtZSIsImZpZWxkTmFtZSIsImxvb3BEaWN0IiwiX2RlY29kZUZvcm1WYWx1ZSIsImZvcm1WYWx1ZSIsImhhc0ZpZWxkRmxhZyIsImV2YWx1YXRvciIsIkFQIiwib3JpZ2luYWxUcmFuc2Zvcm0iLCJuZXdUcmFuc2Zvcm0iLCJidWZmZXJPcmlnaW5hbCIsIndyaXRlRGljdCIsImJ1ZmZlck5ldyIsImlzUGFzc3dvcmQiLCJkZWZhdWx0UGFkZGluZyIsImhQYWRkaW5nIiwidG90YWxIZWlnaHQiLCJmb250SW5mbyIsImZvbnRTaXplIiwiZGVzY2VudCIsInZQYWRkaW5nIiwiZGVmYXVsdEFwcGVhcmFuY2UiLCJhbGlnbm1lbnQiLCJlc2NhcGVTdHJpbmciLCJyZW5kZXJlZFRleHQiLCJpbml0aWFsU3RhdGUiLCJmb250TmFtZSIsImNsb25lIiwiX2NvbXB1dGVGb250U2l6ZSIsImVtIiwiY2FwSGVpZ2h0IiwiZm9udFJlZ2V4IiwiX3JlbmRlclRleHQiLCJnbHlwaHMiLCJnbHlwaCIsIm1heGltdW1MZW5ndGgiLCJfZ2V0Q29tYkFwcGVhcmFuY2UiLCJjb21iV2lkdGgiLCJyZW5kZXJlZENvbWIiLCJfZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZSIsInRleHQiLCJwYWRkaW5nIiwiX3NwbGl0TGluZSIsIndoaXRlc3BhY2UiLCJsYXN0U3BhY2VQb3MiLCJzdGFydENodW5rIiwiY2hhcldpZHRoIiwic2F2ZWRBcHBlYXJhbmNlIiwiZGVmYXVsdFZhbHVlIiwicGFyZW50QnVmZmVyIiwicGFyZW50VHJhbnNmb3JtIiwiX3Byb2Nlc3NDaGVja0JveCIsImN1c3RvbUFwcGVhcmFuY2UiLCJub3JtYWxBcHBlYXJhbmNlIiwiZXhwb3J0VmFsdWVzIiwiX3Byb2Nlc3NSYWRpb0J1dHRvbiIsImZpZWxkUGFyZW50IiwiZmllbGRQYXJlbnRWYWx1ZSIsIl9wcm9jZXNzUHVzaEJ1dHRvbiIsIm9wdGlvbiIsImlzT3B0aW9uQXJyYXkiLCJleHBvcnRWYWx1ZSIsImRpc3BsYXlWYWx1ZSIsIkRFRkFVTFRfSUNPTl9TSVpFIiwiZ2V0UXVhZFBvaW50cyIsInBhcmVudEl0ZW0iLCJwYXJlbnRTdWJ0eXBlIiwicmF3UGFyZW50IiwicGFyZW50RmxhZ3MiLCJyYXdWZXJ0aWNlcyIsIm9yaWdpbmFsSW5rTGlzdHMiLCJmaWxlIiwiUXVldWVPcHRpbWl6ZXIiLCJwYXR0ZXJuIiwiaUZpcnN0UElNWE8iLCJpRmlyc3RTYXZlIiwiYXJnIiwiYXJnc0FycmF5IiwiaW1hZ2VNYXNrIiwiZm5BcnJheSIsIkluaXRpYWxTdGF0ZSIsImFkZFN0YXRlIiwiTUlOX0lNQUdFU19JTl9JTkxJTkVfSU1BR0VTX0JMT0NLIiwiTUFYX0lNQUdFU19JTl9JTkxJTkVfSU1BR0VTX0JMT0NLIiwiTUFYX1dJRFRIIiwiSU1BR0VfUEFERElORyIsImN1cnIiLCJpRmlyc3RUcmFuc2Zvcm0iLCJpRmlyc3RQSUlYTyIsIm1hcCIsIm1heExpbmVIZWlnaHQiLCJjdXJyZW50WCIsImN1cnJlbnRZIiwiaW1nIiwiaW1nV2lkdGgiLCJpbWdIZWlnaHQiLCJkYXRhT2Zmc2V0Iiwia2luZCIsIk1JTl9JTUFHRVNfSU5fTUFTS1NfQkxPQ0siLCJNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLIiwiTUFYX1NBTUVfSU1BR0VTX0lOX01BU0tTX0JMT0NLIiwiaGFuZGxlUGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrIiwiaXNTYW1lSW1hZ2UiLCJmaXJzdFBJTVhPQXJnMCIsImZpcnN0VHJhbnNmb3JtQXJnMCIsImZpcnN0VHJhbnNmb3JtQXJnMSIsImZpcnN0VHJhbnNmb3JtQXJnMiIsImZpcnN0VHJhbnNmb3JtQXJnMyIsImlUcmFuc2Zvcm0iLCJpUElNWE8iLCJ0cmFuc2Zvcm1BcmdzIiwicG9zaXRpb25zIiwiaW1hZ2VzIiwibWFza1BhcmFtcyIsImlGaXJzdFBJWE8iLCJmaXJzdFBJWE9BcmcwIiwiTUlOX0lNQUdFU19JTl9CTE9DSyIsIk1BWF9JTUFHRVNfSU5fQkxPQ0siLCJpRmlyc3RTZXRGb250IiwiZmlyc3RTZXRGb250QXJnMCIsImZpcnN0U2V0Rm9udEFyZzEiLCJNSU5fQ0hBUlNfSU5fQkxPQ0siLCJNQVhfQ0hBUlNfSU5fQkxPQ0siLCJpRmlyc3RCZWdpblRleHQiLCJpRmlyc3RTZXRUZXh0TWF0cml4IiwiaUZpcnN0U2hvd1RleHQiLCJpRmlyc3RFbmRUZXh0IiwiaUZpcnN0IiwiaUVuZFRleHQiLCJpQ3VyciIsIl9vcHRpbWl6ZSIsIm1hdGNoIiwiaXRlcmF0ZSIsInB1c2giLCJmbHVzaCIsIk51bGxPcHRpbWl6ZXIiLCJPcGVyYXRvckxpc3QiLCJDSFVOS19TSVpFIiwiQ0hVTktfU0laRV9BQk9VVCIsInN0cmVhbVNpbmsiLCJhZGRPcCIsImZuIiwiYWRkRGVwZW5kZW5jeSIsImFkZERlcGVuZGVuY2llcyIsImFkZE9wTGlzdCIsImdldElSIiwidHJhbnNmZXJzIiwid3JpdGVWYWx1ZSIsInN0cmluZyIsInJvdW5kZWRWYWx1ZSIsIndyaXRlQXJyYXkiLCJudW1iZXJUb1N0cmluZyIsIndyaXRlU3RyZWFtIiwidGltZSIsIm1kNUJ1ZmZlciIsImZpbGVzaXplIiwibWQ1QnVmZmVyTGVuIiwid3JpdGVTdHJpbmciLCJuZXdYcmVmIiwicmVmRm9yWHJlZlRhYmxlIiwib3JpZ2luYWxEYXRhIiwiYmFzZU9mZnNldCIsInhyZWZUYWJsZURhdGEiLCJpbmRleGVzIiwibWF4T2Zmc2V0IiwibWQ1IiwiY29tcHV0ZU1ENSIsIm9mZnNldFNpemUiLCJzaXplcyIsInN0cnVjdFNpemUiLCJ0YWJsZUxlbmd0aCIsImJ1ZmZlckxlbiIsImZvb3RlciIsIndyaXRlSW50IiwiRGVmYXVsdFBhcnRpYWxFdmFsdWF0b3JPcHRpb25zIiwiUGF0dGVyblR5cGUiLCJUSUxJTkciLCJTSEFESU5HIiwiZGVmZXJyZWQiLCJwYXJzaW5nQXJyYXkiLCJtYXliZUJNIiwibm9ybWFsaXplQmxlbmRNb2RlIiwiVGltZVNsb3RNYW5hZ2VyIiwibmV3T3B0aW9ucyIsIm5ld0V2YWx1YXRvciIsImhhc0JsZW5kTW9kZXMiLCJub2RlcyIsImdyYXBoaWNTdGF0ZXMiLCJncmFwaGljU3RhdGUiLCJibSIsInhPYmplY3RzIiwieE9iamVjdCIsInhSZXNvdXJjZXMiLCJyZWFkYWJsZVN0cmVhbSIsInB1bXAiLCJ4b2JqIiwib3B0aW9uYWxDb250ZW50IiwiZ3JvdXBPcHRpb25zIiwiaXNvbGF0ZWQiLCJrbm9ja291dCIsImdyb3VwU3VidHlwZSIsImNvbG9yU3BhY2UiLCJfc2VuZEltZ0RhdGEiLCJjYWNoZUdsb2JhbGx5IiwiaXNJbmxpbmUiLCJpbWFnZSIsImltYWdlUmVmIiwiYml0U3RyaWRlTGVuZ3RoIiwiaW1nQXJyYXkiLCJpbWFnZUlzRnJvbURlY29kZVN0cmVhbSIsImludmVyc2VEZWNvZGUiLCJsb2NhbEltYWdlQ2FjaGUiLCJzb2Z0TWFzayIsIlNNQUxMX0lNQUdFX0RJTUVOU0lPTlMiLCJpbWFnZU9iaiIsInJlcyIsIlBERkltYWdlIiwiaGFuZGxlU01hc2siLCJzbWFza0NvbnRlbnQiLCJzbWFza09wdGlvbnMiLCJiYWNrZHJvcCIsInRyYW5zZmVyT2JqIiwiaXNQREZGdW5jdGlvbiIsInRyYW5zZmVyRm4iLCJ0cmFuc2Zlck1hcCIsInN0YXRlTWFuYWdlciIsImhhbmRsZVRyYW5zZmVyRnVuY3Rpb24iLCJ0cmFuc2ZlckFycmF5IiwidHJhbnNmZXJNYXBzIiwibnVtRm5zIiwibnVtRWZmZWN0ZnVsRm5zIiwiaGFuZGxlVGlsaW5nVHlwZSIsInRpbGluZ09wTGlzdCIsInBhdHRlcm5SZXNvdXJjZXMiLCJwYXR0ZXJuRGljdCIsImhhbmRsZVNldEZvbnQiLCJmb250QXJncyIsInRyYW5zbGF0ZWQiLCJsb2FkZWROYW1lIiwiZXh0cmFQcm9wZXJ0aWVzIiwiaGFuZGxlVGV4dCIsImlzQWRkVG9QYXRoU2V0IiwiUGFydGlhbEV2YWx1YXRvciIsImVuc3VyZVN0YXRlRm9udCIsImdTdGF0ZVJlZiIsImdTdGF0ZSIsImlzU2ltcGxlR1N0YXRlIiwiZ1N0YXRlT2JqIiwiZ1N0YXRlS2V5cyIsImxvY2FsR1N0YXRlQ2FjaGUiLCJsb2FkRm9udCIsImVycm9yRm9udCIsImZvbnRSZWYiLCJmb250UmVzIiwiZm9udENhcGFiaWxpdHkiLCJwcmVFdmFsdWF0ZWRGb250IiwiZm9udFJlZklzUmVmIiwiZm9udElEIiwiZGVzY3JpcHRvciIsImZvbnRBbGlhc2VzIiwiYWxpYXNGb250UmVmIiwidHJhbnNsYXRlZFByb21pc2UiLCJ4cmVmRm9udFN0YXRzIiwiZm9udEZpbGUzIiwiZm9udFR5cGUiLCJnZXRGb250VHlwZSIsImJ1aWxkUGF0aCIsInBhcnNpbmdUZXh0IiwibGFzdEluZGV4Iiwib3BBcmdzIiwicGFyc2VDb2xvclNwYWNlIiwicGF0dGVybk5hbWUiLCJ0eXBlTnVtIiwic2hhZGluZyIsIlBhdHRlcm4iLCJjb250ZW50UHJvcGVydGllcyIsIm9wdGlvbmFsQ29udGVudFR5cGUiLCJvcHRpb25hbENvbnRlbnRHcm91cHMiLCJncm91cElkcyIsIm9jZyIsImV4cHJlc3Npb24iLCJwb2xpY3kiLCJzZWxmIiwieG9ianMiLCJwcmVwcm9jZXNzb3IiLCJ0aW1lU2xvdE1hbmFnZXIiLCJwcm9taXNlQm9keSIsIm9wZXJhdGlvbiIsImxvY2FsSW1hZ2UiLCJyZXNvbHZlWE9iamVjdCIsImdsb2JhbEltYWdlIiwiY29tYmluZWRHbHlwaHMiLCJhcnJMZW5ndGgiLCJhcnJJdGVtIiwic2hhZGluZ1JlcyIsInBhdHRlcm5JUiIsImxvY2FsR1N0YXRlT2JqIiwiZXh0R1N0YXRlIiwiY2xvc2VQZW5kaW5nUmVzdG9yZU9QUyIsImdldFRleHRDb250ZW50Iiwic2VlblN0eWxlcyIsIldoaXRlc3BhY2VSZWdleHAiLCJ0ZXh0Q29udGVudCIsInN0eWxlcyIsInRleHRDb250ZW50SXRlbSIsImluaXRpYWxpemVkIiwidmVydGljYWwiLCJsYXN0QWR2YW5jZVdpZHRoIiwibGFzdEFkdmFuY2VIZWlnaHQiLCJ0ZXh0QWR2YW5jZVNjYWxlIiwic3BhY2VXaWR0aCIsImZha2VTcGFjZU1pbiIsImZha2VNdWx0aVNwYWNlTWluIiwiZmFrZU11bHRpU3BhY2VNYXgiLCJ0ZXh0UnVuQnJlYWtBbGxvd2VkIiwiU1BBQ0VfRkFDVE9SIiwiTVVMVElfU1BBQ0VfRkFDVE9SIiwiTVVMVElfU1BBQ0VfRkFDVE9SX01BWCIsImVtcHR5WE9iamVjdENhY2hlIiwiZW1wdHlHU3RhdGVDYWNoZSIsInRleHRTdGF0ZSIsImZvbnRGYW1pbHkiLCJhc2NlbnQiLCJ0c20iLCJnbHlwaEhlaWdodCIsInRybSIsInNjYWxlTGluZVgiLCJzY2FsZUN0bVgiLCJ0ZXh0Q2h1bmsiLCJiaWRpUmVzdWx0IiwiYmlkaSIsInJlcGxhY2VXaGl0ZXNwYWNlIiwiZGlyIiwiZW5zdXJlVGV4dENvbnRlbnRJdGVtIiwiZ2x5cGhXaWR0aCIsImdseXBoVW5pY29kZSIsIk5vcm1hbGl6ZWRVbmljb2RlcyIsInJldmVyc2VJZlJ0bCIsImNoYXJTcGFjaW5nIiwid29yZFNwYWNpbmciLCJhZGRGYWtlU3BhY2VzIiwidHgiLCJ0eSIsIncwIiwiZmFrZVNwYWNlcyIsInJ1bkJpZGlUcmFuc2Zvcm0iLCJlbnF1ZXVlQ2h1bmsiLCJmb250TmFtZUFyZyIsImZvbnRTaXplQXJnIiwiZmx1c2hUZXh0Q29udGVudEl0ZW0iLCJpc1NhbWVUZXh0TGluZSIsImFkdmFuY2UiLCJidWlsZFRleHRDb250ZW50SXRlbSIsImJyZWFrVGV4dFJ1biIsImN1cnJlbnRTdGF0ZSIsInhPYmpTdGF0ZU1hbmFnZXIiLCJzaW5rV3JhcHBlciIsImVucXVldWVJbnZva2VkIiwiZW5xdWV1ZSIsImdTdGF0ZUZvbnQiLCJyZXNvbHZlR1N0YXRlIiwic3RvcCIsImV4dHJhY3REYXRhU3RydWN0dXJlcyIsInRvVW5pY29kZSIsImJhc2VEaWN0IiwidG9Vbmljb2RlUHJvbWlzZSIsImNpZFN5c3RlbUluZm8iLCJyZWdpc3RyeSIsIm9yZGVyaW5nIiwic3VwcGxlbWVudCIsImNpZFRvR2lkTWFwIiwiY2lkVG9HaWRCeXRlcyIsImRpZmZlcmVuY2VzIiwiYmFzZUVuY29kaW5nTmFtZSIsImVuY29kaW5nIiwiZGlmZkVuY29kaW5nIiwiZ2V0RW5jb2RpbmciLCJpc1N5bWJvbGljRm9udCIsIkZvbnRGbGFncyIsImlzTm9uc3ltYm9saWNGb250IiwicmVhZFRvVW5pY29kZSIsImJ1aWx0VG9Vbmljb2RlIiwiX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZSIsImZvcmNlR2x5cGhzIiwiZ2x5cGhOYW1lIiwiZ2x5cGhzVW5pY29kZU1hcCIsImNvZGVTdHIiLCJ1bmljb2RlIiwiZ2V0VW5pY29kZUZvckdseXBoIiwiYmFzZUVuY29kaW5nIiwiYnVpbGRUb1VuaWNvZGUiLCJ1Y3MyQ01hcE5hbWUiLCJmZXRjaEJ1aWx0SW5DTWFwIiwidXNlQ01hcCIsImNNYXAiLCJjaWQiLCJ1Y3MyIiwidWNzMkNNYXAiLCJjbWFwT2JqIiwiY21hcCIsIncyIiwicmVhZENpZFRvR2lkTWFwIiwiZ2x5cGhzRGF0YSIsImdseXBoSUQiLCJleHRyYWN0V2lkdGhzIiwiZ2x5cGhzV2lkdGhzIiwiZGVmYXVsdFdpZHRoIiwiZ2x5cGhzVk1ldHJpY3MiLCJ3aWR0aHMiLCJ2bWV0cmljcyIsImRlZmF1bHRWTWV0cmljcyIsInZtZXRyaWMiLCJmaXJzdENoYXIiLCJwYXJzZUZsb2F0IiwiYmFzZUZvbnROYW1lIiwibWV0cmljcyIsImlzTW9ub3NwYWNlIiwiZmlyc3RXaWR0aCIsImlzU2VyaWZGb250IiwiZm9udE5hbWVXb1N0eWxlIiwiZ2V0QmFzZUZvbnRNZXRyaWNzIiwibW9ub3NwYWNlIiwic3RkRm9udE1hcCIsImxvb2t1cE5hbWUiLCJNZXRyaWNzIiwiZ2x5cGhXaWR0aHMiLCJidWlsZENoYXJDb2RlVG9XaWR0aCIsImNoYXJDb2RlIiwid2lkdGhzQnlHbHlwaE5hbWUiLCJwcmVFdmFsdWF0ZUZvbnQiLCJjb21wb3NpdGUiLCJkZiIsImRpZmZMZW5ndGgiLCJkaWZmQnVmIiwiZGlmZkVudHJ5IiwibGFzdENoYXIiLCJ1aW50OGFycmF5IiwidHJhbnNsYXRlRm9udCIsIm1heENoYXJJbmRleCIsIm5ld1Byb3BlcnRpZXMiLCJiYXNlRm9udCIsImZvbnROYW1lU3RyIiwiYmFzZUZvbnRTdHIiLCJmb250RmlsZSIsImxlbmd0aDEiLCJsZW5ndGgyIiwibGVuZ3RoMyIsImZpeGVkUGl0Y2giLCJmb250TWF0cml4IiwieEhlaWdodCIsIml0YWxpY0FuZ2xlIiwiaXNUeXBlM0ZvbnQiLCJjaWRFbmNvZGluZyIsImNNYXBQcm9taXNlIiwiYWNjZW50Iiwic2VuZCIsImZhbGxiYWNrIiwibG9hZFR5cGUzRGF0YSIsInR5cGUzT3B0aW9ucyIsInR5cGUzRXZhbHVhdG9yIiwidHlwZTNEZXBlbmRlbmNpZXMiLCJsb2FkQ2hhclByb2NzUHJvbWlzZSIsImNoYXJQcm9jcyIsImZvbnRSZXNvdXJjZXMiLCJjaGFyUHJvY09wZXJhdG9yTGlzdCIsImdseXBoU3RyZWFtIiwiZHVtbXlPcGVyYXRvckxpc3QiLCJvbGQiLCJzZXRUZXh0TGluZU1hdHJpeCIsInRyYW5zbGF0ZVRleHRNYXRyaXgiLCJ0cmFuc2xhdGVUZXh0TGluZU1hdHJpeCIsImNhbGNUZXh0TGluZU1hdHJpeEFkdmFuY2UiLCJ0eERpZmYiLCJ0eURpZmYiLCJkZW5vbWluYXRvciIsImNhbGNSZW5kZXJNYXRyaXgiLCJjYXJyaWFnZVJldHVybiIsImdldE9QTWFwIiwibnVtQXJncyIsInZhcmlhYmxlQXJncyIsIkV2YWx1YXRvclByZXByb2Nlc3NvciIsInJlYWQiLCJjbWQiLCJvcFNwZWMiLCJhcmdzTGVuZ3RoIiwibm9uUHJvY2Vzc2VkQXJncyIsInByZXByb2Nlc3NDb21tYW5kIiwiQlVJTFRfSU5fQ01BUFMiLCJNQVhfTUFQX1JBTkdFIiwiYnVpbHRJbkNNYXAiLCJhZGRDb2Rlc3BhY2VSYW5nZSIsIm1hcENpZFJhbmdlIiwiZHN0TG93IiwibWFwQmZSYW5nZSIsIm1hcEJmUmFuZ2VUb0FycmF5IiwibWFwT25lIiwiY29udGFpbnMiLCJjaGFyQ29kZU9mIiwiZ2V0TWFwIiwicmVhZENoYXJDb2RlIiwiY29kZXNwYWNlUmFuZ2VzIiwibm4iLCJjb2Rlc3BhY2VSYW5nZSIsIkJpbmFyeUNNYXBSZWFkZXIiLCJNQVhfTlVNX1NJWkUiLCJNQVhfRU5DT0RFRF9OVU1fU0laRSIsIkJpbmFyeUNNYXBTdHJlYW0iLCJyZWFkQnl0ZSIsInJlYWROdW1iZXIiLCJyZWFkU2lnbmVkIiwicmVhZEhleCIsInJlYWRIZXhOdW1iZXIiLCJzdGFjayIsInNwIiwicmVhZEhleFNpZ25lZCIsInJlYWRTdHJpbmciLCJjaGFyIiwic2VxdWVuY2UiLCJkYXRhU2l6ZSIsInVjczJEYXRhU2l6ZSIsInN1Yml0ZW1zQ291bnQiLCJhZGRIZXgiLCJoZXhUb0ludCIsImluY0hleCIsImhleFRvU3RyIiwiZXh0ZW5kIiwiQ01hcEZhY3RvcnkiLCJleHBlY3RTdHJpbmciLCJzdHJUb0ludCIsImRzdCIsImV4cGVjdEludCIsInBhcnNlV01vZGUiLCJwYXJzZUNNYXBOYW1lIiwicHJldmlvdXMiLCJlbWJlZGRlZFVzZUNNYXAiLCJwYXJzZUNvZGVzcGFjZVJhbmdlIiwicGFyc2VCZkNoYXIiLCJwYXJzZUNpZENoYXIiLCJwYXJzZUJmUmFuZ2UiLCJwYXJzZUNpZFJhbmdlIiwiZXh0ZW5kQ01hcCIsInVzZUNvZGVzcGFjZVJhbmdlcyIsImNNYXBEYXRhIiwiY29tcHJlc3Npb25UeXBlIiwicGFyc2VDTWFwIiwiY3JlYXRlQnVpbHRJbkNNYXAiLCJwYXJzZWRDTWFwIiwiUFJJVkFURV9VU0VfQVJFQVMiLCJQREZfR0xZUEhfU1BBQ0VfVU5JVFMiLCJTRUFDX0FOQUxZU0lTX0VOQUJMRUQiLCJFWFBPUlRfREFUQV9QUk9QRVJUSUVTIiwiRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFUyIsIkZpeGVkUGl0Y2giLCJTZXJpZiIsIlN5bWJvbGljIiwiU2NyaXB0IiwiTm9uc3ltYm9saWMiLCJJdGFsaWMiLCJBbGxDYXAiLCJTbWFsbENhcCIsIkZvcmNlQm9sZCIsIk1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZyIsImJ1aWx0SW5FbmNvZGluZyIsIkdseXBoIiwiVG9Vbmljb2RlTWFwIiwiYW1lbmQiLCJJZGVudGl0eVRvVW5pY29kZU1hcCIsIk9wZW5UeXBlRmlsZUJ1aWxkZXIiLCJtYXhQb3dlcjIiLCJzZWFyY2hSYW5nZSIsInJhbmdlU2hpZnQiLCJlbnRyeVNpemUiLCJPVEZfSEVBREVSX1NJWkUiLCJPVEZfVEFCTEVfRU5UUllfU0laRSIsInRvQXJyYXkiLCJzZm50IiwidGFibGVzIiwidGFibGVzTmFtZXMiLCJudW1UYWJsZXMiLCJ0YWJsZU9mZnNldHMiLCJ3cml0ZURhdGEiLCJzdHJpbmczMiIsIndyaXRlSW50MTYiLCJzZWFyY2hQYXJhbXMiLCJ0YWJsZU5hbWUiLCJjaGVja3N1bSIsInF1YWQiLCJ3cml0ZUludDMyIiwiYWRkVGFibGUiLCJ0YWciLCJGb250IiwiZmFsbGJhY2tOYW1lIiwiZ2V0Rm9udEZpbGVUeXBlIiwiY2ZmIiwiYWRqdXN0V2lkdGhzIiwiaXNUcnVlVHlwZUZpbGUiLCJpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUiLCJmaWxlVHlwZSIsImlzT3BlblR5cGVGaWxlIiwiaXNUeXBlMUZpbGUiLCJpc0NGRkZpbGUiLCJmaWxlU3VidHlwZSIsInRvRm9udENoYXIiLCJuZXdNYXAiLCJwcml2YXRlVXNlQXJlYUluZGV4IiwibmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSIsInByaXZhdGVVc2VPZmZldEVuZCIsIm9yaWdpbmFsQ2hhckNvZGUiLCJnbHlwaElkIiwiY2hhckNvZGVUb0dseXBoSWQiLCJoYXNHbHlwaCIsImZvbnRDaGFyQ29kZSIsImNvZGVJbmRpY2VzIiwiZ2V0UmFuZ2VzIiwic3RyaW5nMTYiLCJibXBMZW5ndGgiLCJ0cmFpbGluZ1Jhbmdlc0NvdW50Iiwic2VnQ291bnQiLCJzdGFydENvdW50IiwiZW5kQ291bnQiLCJpZERlbHRhcyIsImlkUmFuZ2VPZmZzZXRzIiwiZ2x5cGhzSWRzIiwiYmlhcyIsImNvbnRpZ3VvdXMiLCJzdGFydENvZGUiLCJmb3JtYXQzMTQiLCJmb3JtYXQzMTAxMiIsImhlYWRlcjMxMDEyIiwib3MyIiwic2VsZWN0aW9uIiwidXNXaW5Bc2NlbnQiLCJvdmVycmlkZSIsInVuaXRzUGVyRW0iLCJ5TWF4IiwieU1pbiIsInVsVW5pY29kZVJhbmdlMSIsInVsVW5pY29kZVJhbmdlMiIsInVsVW5pY29kZVJhbmdlMyIsInVsVW5pY29kZVJhbmdlNCIsImZpcnN0Q2hhckluZGV4IiwibGFzdENoYXJJbmRleCIsImdldFVuaWNvZGVSYW5nZUZvciIsInR5cG9Bc2NlbnQiLCJ0eXBvRGVzY2VudCIsIndpbkFzY2VudCIsIndpbkRlc2NlbnQiLCJhbmdsZSIsInByb3RvIiwic3RyaW5ncyIsInN0cmluZ3NVbmljb2RlIiwic3RyQnVmVW5pY29kZSIsInBsYXRmb3JtcyIsImVuY29kaW5ncyIsImxhbmd1YWdlcyIsIm5hbWVzUmVjb3JkQ291bnQiLCJuYW1lVGFibGUiLCJzdHJPZmZzZXQiLCJzdHJzIiwibmFtZVJlY29yZCIsIm1pbWV0eXBlIiwicmVuZGVyZXIiLCJGb250UmVuZGVyZXJGYWN0b3J5IiwiZXhwb3J0RGF0YSIsImV4cG9ydERhdGFQcm9wZXJ0aWVzIiwiZmFsbGJhY2tUb1N5c3RlbUZvbnQiLCJub25TdGRGb250TWFwIiwiaXNTdGFuZGFyZEZvbnQiLCJHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMiLCJTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2siLCJTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkiLCJpc0lkZW50aXR5VW5pY29kZSIsImJ1aWxkVG9Gb250Q2hhciIsInVuaWNvZGVDaGFyQ29kZSIsImNoZWNrQW5kUmVwYWlyIiwiVkFMSURfVEFCTEVTIiwicmVhZFRhYmxlRW50cnkiLCJwcmV2aW91c1Bvc2l0aW9uIiwidHRmIiwiZW50cnlTZWxlY3RvciIsInR0Y1RhZyIsInR0YyIsIm1ham9yVmVyc2lvbiIsIm1pbm9yVmVyc2lvbiIsIm51bUZvbnRzIiwib2Zmc2V0VGFibGUiLCJyZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyIiwicG90ZW50aWFsSGVhZGVyIiwicmVhZE9wZW5UeXBlSGVhZGVyIiwicG90ZW50aWFsVGFibGVzIiwicmVhZFRhYmxlcyIsInJlYWROYW1lVGFibGUiLCJuYW1lRW50cnkiLCJwbGF0Zm9ybUlkIiwiZW5jb2RpbmdJZCIsIm1hcHBpbmdzIiwiaGFzU2hvcnRDbWFwIiwiY2FuQnJlYWsiLCJ1c2VUYWJsZSIsInBvdGVudGlhbFRhYmxlIiwiZm9ybWF0Iiwic2VnSW5kZXgiLCJvZmZzZXRzQ291bnQiLCJyYW5nZU9mZnNldCIsIm9mZnNldEluZGV4Iiwib2Zmc2V0cyIsImVudHJ5Q291bnQiLCJudW1PZk1ldHJpY3MiLCJudW1PZlNpZGViZWFyaW5ncyIsIm51bUdseXBocyIsIm51bU1pc3NpbmciLCJnbHlwaFByb2ZpbGUiLCJzaXplT2ZJbnN0cnVjdGlvbnMiLCJzb3VyY2VFbmQiLCJnbHlmIiwiY29udG91cnNDb3VudCIsInNpZ25lZEludDE2Iiwid3JpdGVTaWduZWRJbnQxNiIsImZsYWdzQ291bnQiLCJlbmRQb2ludCIsImluc3RydWN0aW9uc1N0YXJ0IiwiaW5zdHJ1Y3Rpb25zTGVuZ3RoIiwiaW5zdHJ1Y3Rpb25zRW5kIiwiY29vcmRpbmF0ZXNMZW5ndGgiLCJmbGFnIiwieExlbmd0aCIsInlMZW5ndGgiLCJ4eUxlbmd0aCIsInJlcGVhdCIsImdseXBoRGF0YUxlbmd0aCIsImRlc3RTdGFydCIsImludDMyIiwiaW5kZXhUb0xvY0Zvcm1hdCIsImludDE2IiwibnVtR2x5cGhzUGx1c09uZSIsImxvY2FMZW5ndGgiLCJpdGVtU2l6ZSIsIml0ZW1EZWNvZGUiLCJpdGVtRW5jb2RlIiwibnVtR2x5cGhzT3V0IiwiZHVwRmlyc3RFbnRyeSIsImxvY2FEYXRhU2l6ZSIsImxvY2FEYXRhIiwibG9jYSIsIm9sZEdseWZEYXRhIiwib2xkR2x5ZkRhdGFMZW5ndGgiLCJuZXdHbHlmRGF0YSIsImxvY2FFbnRyaWVzIiwibWlzc2luZ0dseXBocyIsIndyaXRlT2Zmc2V0Iiwic2FuaXRpemVHbHlwaCIsIm1heFNpemVPZkluc3RydWN0aW9ucyIsInNpbXBsZUdseXBoIiwiZmlyc3RFbnRyeUxlbmd0aCIsInBvc3QiLCJ2YWxpZCIsImdseXBoTmFtZXMiLCJnbHlwaE5hbWVJbmRleGVzIiwiY3VzdG9tTmFtZXMiLCJzdHJpbmdMZW5ndGgiLCJwcm9wZXJ0aWVzT2JqIiwiRk9STUFUXzBfSEVBREVSX0xFTkdUSCIsIm51bVJlY29yZHMiLCJzdHJpbmdzU3RhcnQiLCJyZWNvcmRzIiwiTkFNRV9SRUNPUkRfTEVOR1RIIiwicGxhdGZvcm0iLCJsYW5ndWFnZSIsInJlY29yZCIsIm5hbWVJbmRleCIsIlRUT3BzU3RhY2tEZWx0YXMiLCJsYXN0RW5kZiIsImxhc3REZWZmIiwiY2FsbHN0YWNrIiwiZnVuY3Rpb25zQ2FsbGVkIiwidG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zIiwidHRDb250ZXh0IiwiaW5GREVGIiwiaWZMZXZlbCIsImluRUxTRSIsIm9wIiwiZnVuY0lkIiwibmV3U3RhY2tMZW5ndGgiLCJzdGFja1RvcCIsInN0YWNrRGVsdGEiLCJmb2xkVFRUYWJsZSIsImZ1bmN0aW9uc0RlZmluZWQiLCJmdW5jdGlvbnNVc2VkIiwiZnVuY3Rpb25zU3RhY2tEZWx0YXMiLCJoaW50c1ZhbGlkIiwic2FuaXRpemVUVFByb2dyYW0iLCJjaGVja0ludmFsaWRGdW5jdGlvbnMiLCJjdnQiLCJjdnREYXRhIiwidHRjRGF0YSIsInJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhIiwiaXNUcnVlVHlwZSIsImlzQ29tcG9zaXRlIiwiY2ZmRmlsZSIsIm1heEZ1bmN0aW9uRGVmcyIsIm1heFpvbmVzIiwic2FuaXRpemVUVFByb2dyYW1zIiwic2FuaXRpemVNZXRyaWNzIiwic2FuaXRpemVIZWFkIiwiaXNHbHlwaExvY2F0aW9uc0xvbmciLCJnbHlwaHNJbmZvIiwic2FuaXRpemVHbHlwaExvY2F0aW9ucyIsIm1ldHJpY3NPdmVycmlkZSIsInJlYWRQb3N0U2NyaXB0VGFibGUiLCJjcmVhdGVQb3N0VGFibGUiLCJpc0NpZFRvR2lkTWFwRW1wdHkiLCJjbWFwVGFibGUiLCJyZWFkQ21hcFRhYmxlIiwiY21hcFBsYXRmb3JtSWQiLCJjbWFwRW5jb2RpbmdJZCIsImNtYXBNYXBwaW5ncyIsImNtYXBNYXBwaW5nc0xlbmd0aCIsIlN0YW5kYXJkRW5jb2RpbmciLCJzdGFuZGFyZEdseXBoTmFtZSIsInJlY292ZXJHbHlwaE5hbWUiLCJ1bmljb2RlT3JDaGFyQ29kZSIsIk1hY1JvbWFuRW5jb2RpbmciLCJnbHlwaFplcm9JZCIsIm5ld01hcHBpbmciLCJhZGp1c3RNYXBwaW5nIiwiY3JlYXRlQ21hcFRhYmxlIiwidmFsaWRhdGVPUzJUYWJsZSIsImNyZWF0ZU9TMlRhYmxlIiwiY29tcGlsZXIiLCJjcmVhdGVOYW1lVGFibGUiLCJuYW1lUHJvdG90eXBlIiwiYnVpbGRlciIsImNvbnZlcnQiLCJhZGp1c3RUb1VuaWNvZGUiLCJtYXBwaW5nIiwiY2hhckNvZGVzIiwic2VhY3MiLCJjaGFyc2V0Iiwic2VhY01hcCIsInNlYWMiLCJiYXNlR2x5cGhOYW1lIiwiYWNjZW50R2x5cGhOYW1lIiwiYmFzZUdseXBoSWQiLCJhY2NlbnRHbHlwaElkIiwiYWNjZW50T2Zmc2V0IiwiZ2V0Q2hhckNvZGVzIiwiYmFzZUZvbnRDaGFyQ29kZSIsImNyZWF0ZUNoYXJDb2RlIiwiYWNjZW50Rm9udENoYXJDb2RlIiwic2FmZVN0cmluZzE2IiwiY2hhcnN0cmluZ3MiLCJjZmZXaWR0aHMiLCJobXR4IiwiY2hhcnN0cmluZyIsInBvc3NpYmxlU3BhY2VSZXBsYWNlbWVudHMiLCJjaGFyY29kZSIsImNoYXJUb0dseXBoIiwid2lkdGhDb2RlIiwiaXNJbkZvbnQiLCJtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyIsIm9wZXJhdG9yTGlzdElkIiwiZm9udENoYXIiLCJjaGFyc1RvR2x5cGhzIiwiY2hhcnNDYWNoZSIsImNoYXJzQ2FjaGVLZXkiLCJjaGFycyIsImlzU3BhY2UiLCJFcnJvckZvbnQiLCJlcnJvciIsIlR5cGUxRm9udCIsInN0cmVhbUJ5dGVzTGVuZ3RoIiwic3RyZWFtQnl0ZXMiLCJFRVhFQ19TSUdOQVRVUkUiLCJzdHJlYW1TdGFydFBvcyIsImhlYWRlckJ5dGVzIiwiaGVhZGVyQnl0ZXNMZW5ndGgiLCJmaW5kQmxvY2siLCJzdWdnZXN0ZWRMZW5ndGgiLCJlZXhlY0J5dGVzIiwiUEZCX0hFQURFUl9TSVpFIiwiaGVhZGVyQmxvY2tMZW5ndGgiLCJlZXhlY0Jsb2NrTGVuZ3RoIiwicGZiSGVhZGVyIiwicGZiSGVhZGVyUHJlc2VudCIsImhlYWRlckJsb2NrIiwiZ2V0SGVhZGVyQmxvY2siLCJoZWFkZXJCbG9ja1BhcnNlciIsImVleGVjQmxvY2siLCJnZXRFZXhlY0Jsb2NrIiwiZWV4ZWNCbG9ja1BhcnNlciIsInR5cGUyQ2hhcnN0cmluZ3MiLCJzdWJycyIsImdldENoYXJzZXQiLCJnZXRHbHlwaE1hcHBpbmciLCJjaGFyc3RyaW5nc0xlbiIsInR5cGUxRm9udEdseXBoTWFwcGluZyIsImhhc0dseXBoSWQiLCJnZXRTZWFjcyIsImdldFR5cGUyQ2hhcnN0cmluZ3MiLCJ0eXBlMUNoYXJzdHJpbmdzIiwiZ2V0VHlwZTJTdWJycyIsInR5cGUxU3VicnMiLCJ0eXBlMlN1YnJzIiwid3JhcCIsInRvcERpY3QiLCJjaGFyc2V0QXJyYXkiLCJDRkZTdGFuZGFyZFN0cmluZ3MiLCJjaGFyU3RyaW5nc0luZGV4IiwicHJpdmF0ZURpY3QiLCJzdWJySW5kZXgiLCJDRkZGb250IiwiY2hhcnNldHMiLCJNQVhfU1VCUl9ORVNUSU5HIiwiTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIiwiQ0ZGUGFyc2VyIiwiQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhIiwibWluIiwic3RhY2tDbGVhcmluZyIsInN0ZW0iLCJyZXNldFN0YWNrIiwidW5kZWZTdGFjayIsIkNoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YTEyIiwic3RhY2tGbiIsInRvcERpY3RJbmRleCIsInN0cmluZ0luZGV4IiwiZ2xvYmFsU3VickluZGV4IiwidG9wRGljdFBhcnNlZCIsImNoYXJTdHJpbmdPZmZzZXQiLCJjaGFyU3RyaW5nSW5kZXgiLCJmb250QkJveCIsImZkQXJyYXlJbmRleCIsImRpY3RSYXciLCJmb250RGljdCIsImNoYXJTdHJpbmdzQW5kU2VhY3MiLCJjaGFyU3RyaW5ncyIsImxvY2FsU3VickluZGV4IiwiZmRTZWxlY3QiLCJmZEFycmF5IiwicGFyc2VIZWFkZXIiLCJoZHJTaXplIiwib2ZmU2l6ZSIsInBhcnNlRGljdCIsInBhcnNlRmxvYXRPcGVyYW5kIiwib3BlcmFuZHMiLCJwYXJzZU9wZXJhbmQiLCJwYXJzZUluZGV4IiwiY2ZmSW5kZXgiLCJvZmZzZXRTdGFydCIsIm9mZnNldEVuZCIsInBhcnNlTmFtZUluZGV4IiwicGFyc2VTdHJpbmdJbmRleCIsImNyZWF0ZURpY3QiLCJjZmZEaWN0IiwicGFpciIsInBhcnNlQ2hhclN0cmluZyIsInN0YWNrU2l6ZSIsInZhbGlkYXRpb25Db21tYW5kIiwic3VicnNJbmRleCIsInN1YnJOdW1iZXIiLCJwYXJzZUNoYXJTdHJpbmdzIiwiY2FsbERlcHRoIiwiZmlyc3RTdGFja0NsZWFyaW5nIiwiaGFzVlN0ZW1zIiwibG9jYWxTdWJyVG9Vc2UiLCJwcml2YXRlRGljdFRvVXNlIiwiZmRJbmRleCIsIm5vbWluYWxXaWR0aCIsImVtcHR5UHJpdmF0ZURpY3Rpb25hcnkiLCJwYXJlbnREaWN0IiwicGFyc2VQcml2YXRlRGljdCIsInByaXZhdGVPZmZzZXQiLCJwcml2YXRlRGljdEVuZCIsImRpY3REYXRhIiwic3VicnNPZmZzZXQiLCJyZWxhdGl2ZU9mZnNldCIsInBhcnNlQ2hhcnNldHMiLCJDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzIiwicmF3IiwicGFyc2VFbmNvZGluZyIsInByZWRlZmluZWQiLCJzdXBwbGVtZW50c0NvdW50Iiwic2lkIiwiZGF0YVN0YXJ0IiwiZ2x5cGhzQ291bnQiLCJyYW5nZXNDb3VudCIsImdpZCIsImRhdGFFbmQiLCJyZWFkU3VwcGxlbWVudCIsInBhcnNlRkRTZWxlY3QiLCJkdXBsaWNhdGVGaXJzdEdseXBoIiwiZ2x5cGhaZXJvIiwiZ2V0U0lEIiwic2V0QnlLZXkiLCJ2YWx1ZUxlbmd0aCIsInNldEJ5TmFtZSIsImhhc05hbWUiLCJyZW1vdmVCeU5hbWUiLCJrZXlUb05hbWVNYXAiLCJuYW1lVG9LZXlNYXAiLCJkZWZhdWx0cyIsInR5cGVzIiwib3Bjb2RlcyIsImxheW91dCIsIkNGRlRvcERpY3QiLCJDRkZEaWN0IiwiQ0ZGUHJpdmF0ZURpY3QiLCJJU09fQURPQkUiLCJFWFBFUlQiLCJFWFBFUlRfU1VCU0VUIiwiZ2V0RkRJbmRleCIsImdseXBoSW5kZXgiLCJpc1RyYWNraW5nIiwidHJhY2siLCJzZXRFbnRyeUxvY2F0aW9uIiwib2Zmc2V0MSIsIm9mZnNldDIiLCJvZmZzZXQzIiwib2Zmc2V0NCIsImNvbXBpbGUiLCJjb21waWxlZCIsInRvcERpY3RUcmFja2VyIiwiZm9udERpY3RUcmFja2VycyIsImVuY29kZU51bWJlciIsImVuY29kZUZsb2F0IiwiQ0ZGQ29tcGlsZXIiLCJuaWJibGVzIiwiZW5jb2RlSW50ZWdlciIsImNvbXBpbGVIZWFkZXIiLCJjb21waWxlTmFtZUluZGV4Iiwic2FuaXRpemVkTmFtZSIsImNvbXBpbGVUb3BEaWN0cyIsImRpY3RzIiwiZm9udERpY3RUcmFja2VyIiwiZm9udERpY3REYXRhIiwidHJhY2tlcnMiLCJjb21waWxlUHJpdmF0ZURpY3RzIiwicHJpdmF0ZURpY3RUcmFja2VyIiwicHJpdmF0ZURpY3REYXRhIiwiY29tcGlsZURpY3QiLCJvZmZzZXRUcmFja2VyIiwiY29tcGlsZVN0cmluZ0luZGV4IiwiY29tcGlsZUdsb2JhbFN1YnJJbmRleCIsImNvbXBpbGVDaGFyU3RyaW5ncyIsImNvbXBpbGVDaGFyc2V0IiwibnVtR2x5cGhzTGVzc05vdERlZiIsImNoYXJzZXRJbmRleCIsIm51bUNoYXJzZXRzIiwid2FybmVkIiwiY29tcGlsZUVuY29kaW5nIiwiY29tcGlsZUZEU2VsZWN0IiwibGFzdEZEIiwiY3VycmVudEZEIiwibnVtUmFuZ2VzIiwiY29tcGlsZVR5cGVkQXJyYXkiLCJjb21waWxlSW5kZXgiLCJvYmplY3RzIiwibGFzdE9mZnNldCIsIklTT0Fkb2JlQ2hhcnNldCIsIkV4cGVydENoYXJzZXQiLCJFeHBlcnRTdWJzZXRDaGFyc2V0IiwiRXhwZXJ0RW5jb2RpbmciLCJNYWNFeHBlcnRFbmNvZGluZyIsIldpbkFuc2lFbmNvZGluZyIsIlN5bWJvbFNldEVuY29kaW5nIiwiWmFwZkRpbmdiYXRzRW5jb2RpbmciLCJnZXRMb29rdXBUYWJsZUZhY3RvcnkiLCJyZXF1aXJlIiwiZ2V0R2x5cGhzVW5pY29kZSIsIkFFIiwiQUVhY3V0ZSIsIkFFbWFjcm9uIiwiQUVzbWFsbCIsIkFhY3V0ZSIsIkFhY3V0ZXNtYWxsIiwiQWJyZXZlIiwiQWJyZXZlYWN1dGUiLCJBYnJldmVjeXJpbGxpYyIsIkFicmV2ZWRvdGJlbG93IiwiQWJyZXZlZ3JhdmUiLCJBYnJldmVob29rYWJvdmUiLCJBYnJldmV0aWxkZSIsIkFjYXJvbiIsIkFjaXJjbGUiLCJBY2lyY3VtZmxleCIsIkFjaXJjdW1mbGV4YWN1dGUiLCJBY2lyY3VtZmxleGRvdGJlbG93IiwiQWNpcmN1bWZsZXhncmF2ZSIsIkFjaXJjdW1mbGV4aG9va2Fib3ZlIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkFjaXJjdW1mbGV4dGlsZGUiLCJBY3V0ZSIsIkFjdXRlc21hbGwiLCJBY3lyaWxsaWMiLCJBZGJsZ3JhdmUiLCJBZGllcmVzaXMiLCJBZGllcmVzaXNjeXJpbGxpYyIsIkFkaWVyZXNpc21hY3JvbiIsIkFkaWVyZXNpc3NtYWxsIiwiQWRvdGJlbG93IiwiQWRvdG1hY3JvbiIsIkFncmF2ZSIsIkFncmF2ZXNtYWxsIiwiQWhvb2thYm92ZSIsIkFpZWN5cmlsbGljIiwiQWludmVydGVkYnJldmUiLCJBbHBoYSIsIkFscGhhdG9ub3MiLCJBbWFjcm9uIiwiQW1vbm9zcGFjZSIsIkFvZ29uZWsiLCJBcmluZyIsIkFyaW5nYWN1dGUiLCJBcmluZ2JlbG93IiwiQXJpbmdzbWFsbCIsIkFzbWFsbCIsIkF0aWxkZSIsIkF0aWxkZXNtYWxsIiwiQXliYXJtZW5pYW4iLCJCY2lyY2xlIiwiQmRvdGFjY2VudCIsIkJkb3RiZWxvdyIsIkJlY3lyaWxsaWMiLCJCZW5hcm1lbmlhbiIsIkJldGEiLCJCaG9vayIsIkJsaW5lYmVsb3ciLCJCbW9ub3NwYWNlIiwiQnJldmVzbWFsbCIsIkJzbWFsbCIsIkJ0b3BiYXIiLCJDYWFybWVuaWFuIiwiQ2FjdXRlIiwiQ2Fyb24iLCJDYXJvbnNtYWxsIiwiQ2Nhcm9uIiwiQ2NlZGlsbGEiLCJDY2VkaWxsYWFjdXRlIiwiQ2NlZGlsbGFzbWFsbCIsIkNjaXJjbGUiLCJDY2lyY3VtZmxleCIsIkNkb3QiLCJDZG90YWNjZW50IiwiQ2VkaWxsYXNtYWxsIiwiQ2hhYXJtZW5pYW4iLCJDaGVhYmtoYXNpYW5jeXJpbGxpYyIsIkNoZWN5cmlsbGljIiwiQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMiLCJDaGVkZXNjZW5kZXJjeXJpbGxpYyIsIkNoZWRpZXJlc2lzY3lyaWxsaWMiLCJDaGVoYXJtZW5pYW4iLCJDaGVraGFrYXNzaWFuY3lyaWxsaWMiLCJDaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljIiwiQ2hpIiwiQ2hvb2siLCJDaXJjdW1mbGV4c21hbGwiLCJDbW9ub3NwYWNlIiwiQ29hcm1lbmlhbiIsIkNzbWFsbCIsIkQiLCJEWiIsIkRaY2Fyb24iLCJEYWFybWVuaWFuIiwiRGFmcmljYW4iLCJEY2Fyb24iLCJEY2VkaWxsYSIsIkRjaXJjbGUiLCJEY2lyY3VtZmxleGJlbG93IiwiRGNyb2F0IiwiRGRvdGFjY2VudCIsIkRkb3RiZWxvdyIsIkRlY3lyaWxsaWMiLCJEZWljb3B0aWMiLCJEZWx0YSIsIkRlbHRhZ3JlZWsiLCJEaG9vayIsIkRpZXJlc2lzIiwiRGllcmVzaXNBY3V0ZSIsIkRpZXJlc2lzR3JhdmUiLCJEaWVyZXNpc3NtYWxsIiwiRGlnYW1tYWdyZWVrIiwiRGplY3lyaWxsaWMiLCJEbGluZWJlbG93IiwiRG1vbm9zcGFjZSIsIkRvdGFjY2VudHNtYWxsIiwiRHNsYXNoIiwiRHNtYWxsIiwiRHRvcGJhciIsIkR6IiwiRHpjYXJvbiIsIkR6ZWFia2hhc2lhbmN5cmlsbGljIiwiRHplY3lyaWxsaWMiLCJEemhlY3lyaWxsaWMiLCJFYWN1dGUiLCJFYWN1dGVzbWFsbCIsIkVicmV2ZSIsIkVjYXJvbiIsIkVjZWRpbGxhYnJldmUiLCJFY2hhcm1lbmlhbiIsIkVjaXJjbGUiLCJFY2lyY3VtZmxleCIsIkVjaXJjdW1mbGV4YWN1dGUiLCJFY2lyY3VtZmxleGJlbG93IiwiRWNpcmN1bWZsZXhkb3RiZWxvdyIsIkVjaXJjdW1mbGV4Z3JhdmUiLCJFY2lyY3VtZmxleGhvb2thYm92ZSIsIkVjaXJjdW1mbGV4c21hbGwiLCJFY2lyY3VtZmxleHRpbGRlIiwiRWN5cmlsbGljIiwiRWRibGdyYXZlIiwiRWRpZXJlc2lzIiwiRWRpZXJlc2lzc21hbGwiLCJFZG90IiwiRWRvdGFjY2VudCIsIkVkb3RiZWxvdyIsIkVmY3lyaWxsaWMiLCJFZ3JhdmUiLCJFZ3JhdmVzbWFsbCIsIkVoYXJtZW5pYW4iLCJFaG9va2Fib3ZlIiwiRWlnaHRyb21hbiIsIkVpbnZlcnRlZGJyZXZlIiwiRWlvdGlmaWVkY3lyaWxsaWMiLCJFbGN5cmlsbGljIiwiRWxldmVucm9tYW4iLCJFbWFjcm9uIiwiRW1hY3JvbmFjdXRlIiwiRW1hY3JvbmdyYXZlIiwiRW1jeXJpbGxpYyIsIkVtb25vc3BhY2UiLCJFbmN5cmlsbGljIiwiRW5kZXNjZW5kZXJjeXJpbGxpYyIsIkVuZyIsIkVuZ2hlY3lyaWxsaWMiLCJFbmhvb2tjeXJpbGxpYyIsIkVvZ29uZWsiLCJFb3BlbiIsIkVwc2lsb24iLCJFcHNpbG9udG9ub3MiLCJFcmN5cmlsbGljIiwiRXJldmVyc2VkIiwiRXJldmVyc2VkY3lyaWxsaWMiLCJFc2N5cmlsbGljIiwiRXNkZXNjZW5kZXJjeXJpbGxpYyIsIkVzaCIsIkVzbWFsbCIsIkV0YSIsIkV0YXJtZW5pYW4iLCJFdGF0b25vcyIsIkV0aCIsIkV0aHNtYWxsIiwiRXRpbGRlIiwiRXRpbGRlYmVsb3ciLCJFdXJvIiwiRXpoIiwiRXpoY2Fyb24iLCJFemhyZXZlcnNlZCIsIkYiLCJGY2lyY2xlIiwiRmRvdGFjY2VudCIsIkZlaGFybWVuaWFuIiwiRmVpY29wdGljIiwiRmhvb2siLCJGaXRhY3lyaWxsaWMiLCJGaXZlcm9tYW4iLCJGbW9ub3NwYWNlIiwiRm91cnJvbWFuIiwiRnNtYWxsIiwiRyIsIkdCc3F1YXJlIiwiR2FjdXRlIiwiR2FtbWEiLCJHYW1tYWFmcmljYW4iLCJHYW5naWFjb3B0aWMiLCJHYnJldmUiLCJHY2Fyb24iLCJHY2VkaWxsYSIsIkdjaXJjbGUiLCJHY2lyY3VtZmxleCIsIkdjb21tYWFjY2VudCIsIkdkb3QiLCJHZG90YWNjZW50IiwiR2VjeXJpbGxpYyIsIkdoYWRhcm1lbmlhbiIsIkdoZW1pZGRsZWhvb2tjeXJpbGxpYyIsIkdoZXN0cm9rZWN5cmlsbGljIiwiR2hldXB0dXJuY3lyaWxsaWMiLCJHaG9vayIsIkdpbWFybWVuaWFuIiwiR2plY3lyaWxsaWMiLCJHbWFjcm9uIiwiR21vbm9zcGFjZSIsIkdyYXZlIiwiR3JhdmVzbWFsbCIsIkdzbWFsbCIsIkdzbWFsbGhvb2siLCJHc3Ryb2tlIiwiSCIsIkgxODUzMyIsIkgxODU0MyIsIkgxODU1MSIsIkgyMjA3MyIsIkhQc3F1YXJlIiwiSGFhYmtoYXNpYW5jeXJpbGxpYyIsIkhhZGVzY2VuZGVyY3lyaWxsaWMiLCJIYXJkc2lnbmN5cmlsbGljIiwiSGJhciIsIkhicmV2ZWJlbG93IiwiSGNlZGlsbGEiLCJIY2lyY2xlIiwiSGNpcmN1bWZsZXgiLCJIZGllcmVzaXMiLCJIZG90YWNjZW50IiwiSGRvdGJlbG93IiwiSG1vbm9zcGFjZSIsIkhvYXJtZW5pYW4iLCJIb3JpY29wdGljIiwiSHNtYWxsIiwiSHVuZ2FydW1sYXV0IiwiSHVuZ2FydW1sYXV0c21hbGwiLCJIenNxdWFyZSIsIklBY3lyaWxsaWMiLCJJSiIsIklVY3lyaWxsaWMiLCJJYWN1dGUiLCJJYWN1dGVzbWFsbCIsIklicmV2ZSIsIkljYXJvbiIsIkljaXJjbGUiLCJJY2lyY3VtZmxleCIsIkljaXJjdW1mbGV4c21hbGwiLCJJY3lyaWxsaWMiLCJJZGJsZ3JhdmUiLCJJZGllcmVzaXMiLCJJZGllcmVzaXNhY3V0ZSIsIklkaWVyZXNpc2N5cmlsbGljIiwiSWRpZXJlc2lzc21hbGwiLCJJZG90IiwiSWRvdGFjY2VudCIsIklkb3RiZWxvdyIsIkllYnJldmVjeXJpbGxpYyIsIkllY3lyaWxsaWMiLCJJZnJha3R1ciIsIklncmF2ZSIsIklncmF2ZXNtYWxsIiwiSWhvb2thYm92ZSIsIklpY3lyaWxsaWMiLCJJaW52ZXJ0ZWRicmV2ZSIsIklpc2hvcnRjeXJpbGxpYyIsIkltYWNyb24iLCJJbWFjcm9uY3lyaWxsaWMiLCJJbW9ub3NwYWNlIiwiSW5pYXJtZW5pYW4iLCJJb2N5cmlsbGljIiwiSW9nb25layIsIklvdGEiLCJJb3RhYWZyaWNhbiIsIklvdGFkaWVyZXNpcyIsIklvdGF0b25vcyIsIklzbWFsbCIsIklzdHJva2UiLCJJdGlsZGUiLCJJdGlsZGViZWxvdyIsIkl6aGl0c2FjeXJpbGxpYyIsIkl6aGl0c2FkYmxncmF2ZWN5cmlsbGljIiwiSiIsIkphYXJtZW5pYW4iLCJKY2lyY2xlIiwiSmNpcmN1bWZsZXgiLCJKZWN5cmlsbGljIiwiSmhlaGFybWVuaWFuIiwiSm1vbm9zcGFjZSIsIkpzbWFsbCIsIktCc3F1YXJlIiwiS0tzcXVhcmUiLCJLYWJhc2hraXJjeXJpbGxpYyIsIkthY3V0ZSIsIkthY3lyaWxsaWMiLCJLYWRlc2NlbmRlcmN5cmlsbGljIiwiS2Fob29rY3lyaWxsaWMiLCJLYXBwYSIsIkthc3Ryb2tlY3lyaWxsaWMiLCJLYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMiLCJLY2Fyb24iLCJLY2VkaWxsYSIsIktjaXJjbGUiLCJLY29tbWFhY2NlbnQiLCJLZG90YmVsb3ciLCJLZWhhcm1lbmlhbiIsIktlbmFybWVuaWFuIiwiS2hhY3lyaWxsaWMiLCJLaGVpY29wdGljIiwiS2hvb2siLCJLamVjeXJpbGxpYyIsIktsaW5lYmVsb3ciLCJLbW9ub3NwYWNlIiwiS29wcGFjeXJpbGxpYyIsIktvcHBhZ3JlZWsiLCJLc2ljeXJpbGxpYyIsIktzbWFsbCIsIkxKIiwiTGFjdXRlIiwiTGFtYmRhIiwiTGNhcm9uIiwiTGNlZGlsbGEiLCJMY2lyY2xlIiwiTGNpcmN1bWZsZXhiZWxvdyIsIkxjb21tYWFjY2VudCIsIkxkb3QiLCJMZG90YWNjZW50IiwiTGRvdGJlbG93IiwiTGRvdGJlbG93bWFjcm9uIiwiTGl3bmFybWVuaWFuIiwiTGoiLCJMamVjeXJpbGxpYyIsIkxsaW5lYmVsb3ciLCJMbW9ub3NwYWNlIiwiTHNsYXNoIiwiTHNsYXNoc21hbGwiLCJMc21hbGwiLCJNQnNxdWFyZSIsIk1hY3JvbiIsIk1hY3JvbnNtYWxsIiwiTWFjdXRlIiwiTWNpcmNsZSIsIk1kb3RhY2NlbnQiLCJNZG90YmVsb3ciLCJNZW5hcm1lbmlhbiIsIk1tb25vc3BhY2UiLCJNc21hbGwiLCJNdHVybmVkIiwiTXUiLCJOSiIsIk5hY3V0ZSIsIk5jYXJvbiIsIk5jZWRpbGxhIiwiTmNpcmNsZSIsIk5jaXJjdW1mbGV4YmVsb3ciLCJOY29tbWFhY2NlbnQiLCJOZG90YWNjZW50IiwiTmRvdGJlbG93IiwiTmhvb2tsZWZ0IiwiTmluZXJvbWFuIiwiTmoiLCJOamVjeXJpbGxpYyIsIk5saW5lYmVsb3ciLCJObW9ub3NwYWNlIiwiTm93YXJtZW5pYW4iLCJOc21hbGwiLCJOdGlsZGUiLCJOdGlsZGVzbWFsbCIsIk51IiwiTyIsIk9FIiwiT0VzbWFsbCIsIk9hY3V0ZSIsIk9hY3V0ZXNtYWxsIiwiT2JhcnJlZGN5cmlsbGljIiwiT2JhcnJlZGRpZXJlc2lzY3lyaWxsaWMiLCJPYnJldmUiLCJPY2Fyb24iLCJPY2VudGVyZWR0aWxkZSIsIk9jaXJjbGUiLCJPY2lyY3VtZmxleCIsIk9jaXJjdW1mbGV4YWN1dGUiLCJPY2lyY3VtZmxleGRvdGJlbG93IiwiT2NpcmN1bWZsZXhncmF2ZSIsIk9jaXJjdW1mbGV4aG9va2Fib3ZlIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk9jaXJjdW1mbGV4dGlsZGUiLCJPY3lyaWxsaWMiLCJPZGJsYWN1dGUiLCJPZGJsZ3JhdmUiLCJPZGllcmVzaXMiLCJPZGllcmVzaXNjeXJpbGxpYyIsIk9kaWVyZXNpc3NtYWxsIiwiT2RvdGJlbG93IiwiT2dvbmVrc21hbGwiLCJPZ3JhdmUiLCJPZ3JhdmVzbWFsbCIsIk9oYXJtZW5pYW4iLCJPaG0iLCJPaG9va2Fib3ZlIiwiT2hvcm4iLCJPaG9ybmFjdXRlIiwiT2hvcm5kb3RiZWxvdyIsIk9ob3JuZ3JhdmUiLCJPaG9ybmhvb2thYm92ZSIsIk9ob3JudGlsZGUiLCJPaHVuZ2FydW1sYXV0IiwiT2kiLCJPaW52ZXJ0ZWRicmV2ZSIsIk9tYWNyb24iLCJPbWFjcm9uYWN1dGUiLCJPbWFjcm9uZ3JhdmUiLCJPbWVnYSIsIk9tZWdhY3lyaWxsaWMiLCJPbWVnYWdyZWVrIiwiT21lZ2Fyb3VuZGN5cmlsbGljIiwiT21lZ2F0aXRsb2N5cmlsbGljIiwiT21lZ2F0b25vcyIsIk9taWNyb24iLCJPbWljcm9udG9ub3MiLCJPbW9ub3NwYWNlIiwiT25lcm9tYW4iLCJPb2dvbmVrIiwiT29nb25la21hY3JvbiIsIk9vcGVuIiwiT3NsYXNoIiwiT3NsYXNoYWN1dGUiLCJPc2xhc2hzbWFsbCIsIk9zbWFsbCIsIk9zdHJva2VhY3V0ZSIsIk90Y3lyaWxsaWMiLCJPdGlsZGUiLCJPdGlsZGVhY3V0ZSIsIk90aWxkZWRpZXJlc2lzIiwiT3RpbGRlc21hbGwiLCJQIiwiUGFjdXRlIiwiUGNpcmNsZSIsIlBkb3RhY2NlbnQiLCJQZWN5cmlsbGljIiwiUGVoYXJtZW5pYW4iLCJQZW1pZGRsZWhvb2tjeXJpbGxpYyIsIlBoaSIsIlBob29rIiwiUGkiLCJQaXdyYXJtZW5pYW4iLCJQbW9ub3NwYWNlIiwiUHNpIiwiUHNpY3lyaWxsaWMiLCJQc21hbGwiLCJRIiwiUWNpcmNsZSIsIlFtb25vc3BhY2UiLCJRc21hbGwiLCJSIiwiUmFhcm1lbmlhbiIsIlJhY3V0ZSIsIlJjYXJvbiIsIlJjZWRpbGxhIiwiUmNpcmNsZSIsIlJjb21tYWFjY2VudCIsIlJkYmxncmF2ZSIsIlJkb3RhY2NlbnQiLCJSZG90YmVsb3ciLCJSZG90YmVsb3dtYWNyb24iLCJSZWhhcm1lbmlhbiIsIlJmcmFrdHVyIiwiUmhvIiwiUmluZ3NtYWxsIiwiUmludmVydGVkYnJldmUiLCJSbGluZWJlbG93IiwiUm1vbm9zcGFjZSIsIlJzbWFsbCIsIlJzbWFsbGludmVydGVkIiwiUnNtYWxsaW52ZXJ0ZWRzdXBlcmlvciIsIlMiLCJTRjAxMDAwMCIsIlNGMDIwMDAwIiwiU0YwMzAwMDAiLCJTRjA0MDAwMCIsIlNGMDUwMDAwIiwiU0YwNjAwMDAiLCJTRjA3MDAwMCIsIlNGMDgwMDAwIiwiU0YwOTAwMDAiLCJTRjEwMDAwMCIsIlNGMTEwMDAwIiwiU0YxOTAwMDAiLCJTRjIwMDAwMCIsIlNGMjEwMDAwIiwiU0YyMjAwMDAiLCJTRjIzMDAwMCIsIlNGMjQwMDAwIiwiU0YyNTAwMDAiLCJTRjI2MDAwMCIsIlNGMjcwMDAwIiwiU0YyODAwMDAiLCJTRjM2MDAwMCIsIlNGMzcwMDAwIiwiU0YzODAwMDAiLCJTRjM5MDAwMCIsIlNGNDAwMDAwIiwiU0Y0MTAwMDAiLCJTRjQyMDAwMCIsIlNGNDMwMDAwIiwiU0Y0NDAwMDAiLCJTRjQ1MDAwMCIsIlNGNDYwMDAwIiwiU0Y0NzAwMDAiLCJTRjQ4MDAwMCIsIlNGNDkwMDAwIiwiU0Y1MDAwMDAiLCJTRjUxMDAwMCIsIlNGNTIwMDAwIiwiU0Y1MzAwMDAiLCJTRjU0MDAwMCIsIlNhY3V0ZSIsIlNhY3V0ZWRvdGFjY2VudCIsIlNhbXBpZ3JlZWsiLCJTY2Fyb24iLCJTY2Fyb25kb3RhY2NlbnQiLCJTY2Fyb25zbWFsbCIsIlNjZWRpbGxhIiwiU2Nod2EiLCJTY2h3YWN5cmlsbGljIiwiU2Nod2FkaWVyZXNpc2N5cmlsbGljIiwiU2NpcmNsZSIsIlNjaXJjdW1mbGV4IiwiU2NvbW1hYWNjZW50IiwiU2RvdGFjY2VudCIsIlNkb3RiZWxvdyIsIlNkb3RiZWxvd2RvdGFjY2VudCIsIlNlaGFybWVuaWFuIiwiU2V2ZW5yb21hbiIsIlNoYWFybWVuaWFuIiwiU2hhY3lyaWxsaWMiLCJTaGNoYWN5cmlsbGljIiwiU2hlaWNvcHRpYyIsIlNoaGFjeXJpbGxpYyIsIlNoaW1hY29wdGljIiwiU2lnbWEiLCJTaXhyb21hbiIsIlNtb25vc3BhY2UiLCJTb2Z0c2lnbmN5cmlsbGljIiwiU3NtYWxsIiwiU3RpZ21hZ3JlZWsiLCJUIiwiVGF1IiwiVGJhciIsIlRjYXJvbiIsIlRjZWRpbGxhIiwiVGNpcmNsZSIsIlRjaXJjdW1mbGV4YmVsb3ciLCJUY29tbWFhY2NlbnQiLCJUZG90YWNjZW50IiwiVGRvdGJlbG93IiwiVGVjeXJpbGxpYyIsIlRlZGVzY2VuZGVyY3lyaWxsaWMiLCJUZW5yb21hbiIsIlRldHNlY3lyaWxsaWMiLCJUaGV0YSIsIlRob29rIiwiVGhvcm4iLCJUaG9ybnNtYWxsIiwiVGhyZWVyb21hbiIsIlRpbGRlc21hbGwiLCJUaXduYXJtZW5pYW4iLCJUbGluZWJlbG93IiwiVG1vbm9zcGFjZSIsIlRvYXJtZW5pYW4iLCJUb25lZml2ZSIsIlRvbmVzaXgiLCJUb25ldHdvIiwiVHJldHJvZmxleGhvb2siLCJUc2VjeXJpbGxpYyIsIlRzaGVjeXJpbGxpYyIsIlRzbWFsbCIsIlR3ZWx2ZXJvbWFuIiwiVHdvcm9tYW4iLCJVIiwiVWFjdXRlIiwiVWFjdXRlc21hbGwiLCJVYnJldmUiLCJVY2Fyb24iLCJVY2lyY2xlIiwiVWNpcmN1bWZsZXgiLCJVY2lyY3VtZmxleGJlbG93IiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVjeXJpbGxpYyIsIlVkYmxhY3V0ZSIsIlVkYmxncmF2ZSIsIlVkaWVyZXNpcyIsIlVkaWVyZXNpc2FjdXRlIiwiVWRpZXJlc2lzYmVsb3ciLCJVZGllcmVzaXNjYXJvbiIsIlVkaWVyZXNpc2N5cmlsbGljIiwiVWRpZXJlc2lzZ3JhdmUiLCJVZGllcmVzaXNtYWNyb24iLCJVZGllcmVzaXNzbWFsbCIsIlVkb3RiZWxvdyIsIlVncmF2ZSIsIlVncmF2ZXNtYWxsIiwiVWhvb2thYm92ZSIsIlVob3JuIiwiVWhvcm5hY3V0ZSIsIlVob3JuZG90YmVsb3ciLCJVaG9ybmdyYXZlIiwiVWhvcm5ob29rYWJvdmUiLCJVaG9ybnRpbGRlIiwiVWh1bmdhcnVtbGF1dCIsIlVodW5nYXJ1bWxhdXRjeXJpbGxpYyIsIlVpbnZlcnRlZGJyZXZlIiwiVWtjeXJpbGxpYyIsIlVtYWNyb24iLCJVbWFjcm9uY3lyaWxsaWMiLCJVbWFjcm9uZGllcmVzaXMiLCJVbW9ub3NwYWNlIiwiVW9nb25layIsIlVwc2lsb24iLCJVcHNpbG9uMSIsIlVwc2lsb25hY3V0ZWhvb2tzeW1ib2xncmVlayIsIlVwc2lsb25hZnJpY2FuIiwiVXBzaWxvbmRpZXJlc2lzIiwiVXBzaWxvbmRpZXJlc2lzaG9va3N5bWJvbGdyZWVrIiwiVXBzaWxvbmhvb2tzeW1ib2wiLCJVcHNpbG9udG9ub3MiLCJVcmluZyIsIlVzaG9ydGN5cmlsbGljIiwiVXNtYWxsIiwiVXN0cmFpZ2h0Y3lyaWxsaWMiLCJVc3RyYWlnaHRzdHJva2VjeXJpbGxpYyIsIlV0aWxkZSIsIlV0aWxkZWFjdXRlIiwiVXRpbGRlYmVsb3ciLCJWIiwiVmNpcmNsZSIsIlZkb3RiZWxvdyIsIlZlY3lyaWxsaWMiLCJWZXdhcm1lbmlhbiIsIlZob29rIiwiVm1vbm9zcGFjZSIsIlZvYXJtZW5pYW4iLCJWc21hbGwiLCJWdGlsZGUiLCJXIiwiV2FjdXRlIiwiV2NpcmNsZSIsIldjaXJjdW1mbGV4IiwiV2RpZXJlc2lzIiwiV2RvdGFjY2VudCIsIldkb3RiZWxvdyIsIldncmF2ZSIsIldtb25vc3BhY2UiLCJXc21hbGwiLCJYY2lyY2xlIiwiWGRpZXJlc2lzIiwiWGRvdGFjY2VudCIsIlhlaGFybWVuaWFuIiwiWGkiLCJYbW9ub3NwYWNlIiwiWHNtYWxsIiwiWWFjdXRlIiwiWWFjdXRlc21hbGwiLCJZYXRjeXJpbGxpYyIsIlljaXJjbGUiLCJZY2lyY3VtZmxleCIsIllkaWVyZXNpcyIsIllkaWVyZXNpc3NtYWxsIiwiWWRvdGFjY2VudCIsIllkb3RiZWxvdyIsIlllcmljeXJpbGxpYyIsIlllcnVkaWVyZXNpc2N5cmlsbGljIiwiWWdyYXZlIiwiWWhvb2siLCJZaG9va2Fib3ZlIiwiWWlhcm1lbmlhbiIsIllpY3lyaWxsaWMiLCJZaXduYXJtZW5pYW4iLCJZbW9ub3NwYWNlIiwiWXNtYWxsIiwiWXRpbGRlIiwiWXVzYmlnY3lyaWxsaWMiLCJZdXNiaWdpb3RpZmllZGN5cmlsbGljIiwiWXVzbGl0dGxlY3lyaWxsaWMiLCJZdXNsaXR0bGVpb3RpZmllZGN5cmlsbGljIiwiWmFhcm1lbmlhbiIsIlphY3V0ZSIsIlpjYXJvbiIsIlpjYXJvbnNtYWxsIiwiWmNpcmNsZSIsIlpjaXJjdW1mbGV4IiwiWmRvdCIsIlpkb3RhY2NlbnQiLCJaZG90YmVsb3ciLCJaZWN5cmlsbGljIiwiWmVkZXNjZW5kZXJjeXJpbGxpYyIsIlplZGllcmVzaXNjeXJpbGxpYyIsIlpldGEiLCJaaGVhcm1lbmlhbiIsIlpoZWJyZXZlY3lyaWxsaWMiLCJaaGVjeXJpbGxpYyIsIlpoZWRlc2NlbmRlcmN5cmlsbGljIiwiWmhlZGllcmVzaXNjeXJpbGxpYyIsIlpsaW5lYmVsb3ciLCJabW9ub3NwYWNlIiwiWnNtYWxsIiwiWnN0cm9rZSIsImFhYmVuZ2FsaSIsImFhY3V0ZSIsImFhZGV2YSIsImFhZ3VqYXJhdGkiLCJhYWd1cm11a2hpIiwiYWFtYXRyYWd1cm11a2hpIiwiYWFydXNxdWFyZSIsImFhdm93ZWxzaWduYmVuZ2FsaSIsImFhdm93ZWxzaWduZGV2YSIsImFhdm93ZWxzaWduZ3VqYXJhdGkiLCJhYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4iLCJhYmJyZXZpYXRpb25zaWduZGV2YSIsImFiZW5nYWxpIiwiYWJvcG9tb2ZvIiwiYWJyZXZlIiwiYWJyZXZlYWN1dGUiLCJhYnJldmVjeXJpbGxpYyIsImFicmV2ZWRvdGJlbG93IiwiYWJyZXZlZ3JhdmUiLCJhYnJldmVob29rYWJvdmUiLCJhYnJldmV0aWxkZSIsImFjYXJvbiIsImFjaXJjbGUiLCJhY2lyY3VtZmxleCIsImFjaXJjdW1mbGV4YWN1dGUiLCJhY2lyY3VtZmxleGRvdGJlbG93IiwiYWNpcmN1bWZsZXhncmF2ZSIsImFjaXJjdW1mbGV4aG9va2Fib3ZlIiwiYWNpcmN1bWZsZXh0aWxkZSIsImFjdXRlIiwiYWN1dGViZWxvd2NtYiIsImFjdXRlY21iIiwiYWN1dGVjb21iIiwiYWN1dGVkZXZhIiwiYWN1dGVsb3dtb2QiLCJhY3V0ZXRvbmVjbWIiLCJhY3lyaWxsaWMiLCJhZGJsZ3JhdmUiLCJhZGRha2d1cm11a2hpIiwiYWRldmEiLCJhZGllcmVzaXMiLCJhZGllcmVzaXNjeXJpbGxpYyIsImFkaWVyZXNpc21hY3JvbiIsImFkb3RiZWxvdyIsImFkb3RtYWNyb24iLCJhZSIsImFlYWN1dGUiLCJhZWtvcmVhbiIsImFlbWFjcm9uIiwiYWZpaTAwMjA4IiwiYWZpaTA4OTQxIiwiYWZpaTEwMDE3IiwiYWZpaTEwMDE4IiwiYWZpaTEwMDE5IiwiYWZpaTEwMDIwIiwiYWZpaTEwMDIxIiwiYWZpaTEwMDIyIiwiYWZpaTEwMDIzIiwiYWZpaTEwMDI0IiwiYWZpaTEwMDI1IiwiYWZpaTEwMDI2IiwiYWZpaTEwMDI3IiwiYWZpaTEwMDI4IiwiYWZpaTEwMDI5IiwiYWZpaTEwMDMwIiwiYWZpaTEwMDMxIiwiYWZpaTEwMDMyIiwiYWZpaTEwMDMzIiwiYWZpaTEwMDM0IiwiYWZpaTEwMDM1IiwiYWZpaTEwMDM2IiwiYWZpaTEwMDM3IiwiYWZpaTEwMDM4IiwiYWZpaTEwMDM5IiwiYWZpaTEwMDQwIiwiYWZpaTEwMDQxIiwiYWZpaTEwMDQyIiwiYWZpaTEwMDQzIiwiYWZpaTEwMDQ0IiwiYWZpaTEwMDQ1IiwiYWZpaTEwMDQ2IiwiYWZpaTEwMDQ3IiwiYWZpaTEwMDQ4IiwiYWZpaTEwMDQ5IiwiYWZpaTEwMDUwIiwiYWZpaTEwMDUxIiwiYWZpaTEwMDUyIiwiYWZpaTEwMDUzIiwiYWZpaTEwMDU0IiwiYWZpaTEwMDU1IiwiYWZpaTEwMDU2IiwiYWZpaTEwMDU3IiwiYWZpaTEwMDU4IiwiYWZpaTEwMDU5IiwiYWZpaTEwMDYwIiwiYWZpaTEwMDYxIiwiYWZpaTEwMDYyIiwiYWZpaTEwMDYzIiwiYWZpaTEwMDY0IiwiYWZpaTEwMDY1IiwiYWZpaTEwMDY2IiwiYWZpaTEwMDY3IiwiYWZpaTEwMDY4IiwiYWZpaTEwMDY5IiwiYWZpaTEwMDcwIiwiYWZpaTEwMDcxIiwiYWZpaTEwMDcyIiwiYWZpaTEwMDczIiwiYWZpaTEwMDc0IiwiYWZpaTEwMDc1IiwiYWZpaTEwMDc2IiwiYWZpaTEwMDc3IiwiYWZpaTEwMDc4IiwiYWZpaTEwMDc5IiwiYWZpaTEwMDgwIiwiYWZpaTEwMDgxIiwiYWZpaTEwMDgyIiwiYWZpaTEwMDgzIiwiYWZpaTEwMDg0IiwiYWZpaTEwMDg1IiwiYWZpaTEwMDg2IiwiYWZpaTEwMDg3IiwiYWZpaTEwMDg4IiwiYWZpaTEwMDg5IiwiYWZpaTEwMDkwIiwiYWZpaTEwMDkxIiwiYWZpaTEwMDkyIiwiYWZpaTEwMDkzIiwiYWZpaTEwMDk0IiwiYWZpaTEwMDk1IiwiYWZpaTEwMDk2IiwiYWZpaTEwMDk3IiwiYWZpaTEwMDk4IiwiYWZpaTEwMDk5IiwiYWZpaTEwMTAwIiwiYWZpaTEwMTAxIiwiYWZpaTEwMTAyIiwiYWZpaTEwMTAzIiwiYWZpaTEwMTA0IiwiYWZpaTEwMTA1IiwiYWZpaTEwMTA2IiwiYWZpaTEwMTA3IiwiYWZpaTEwMTA4IiwiYWZpaTEwMTA5IiwiYWZpaTEwMTEwIiwiYWZpaTEwMTQ1IiwiYWZpaTEwMTQ2IiwiYWZpaTEwMTQ3IiwiYWZpaTEwMTQ4IiwiYWZpaTEwMTkyIiwiYWZpaTEwMTkzIiwiYWZpaTEwMTk0IiwiYWZpaTEwMTk1IiwiYWZpaTEwMTk2IiwiYWZpaTEwODMxIiwiYWZpaTEwODMyIiwiYWZpaTEwODQ2IiwiYWZpaTI5OSIsImFmaWkzMDAiLCJhZmlpMzAxIiwiYWZpaTU3MzgxIiwiYWZpaTU3Mzg4IiwiYWZpaTU3MzkyIiwiYWZpaTU3MzkzIiwiYWZpaTU3Mzk0IiwiYWZpaTU3Mzk1IiwiYWZpaTU3Mzk2IiwiYWZpaTU3Mzk3IiwiYWZpaTU3Mzk4IiwiYWZpaTU3Mzk5IiwiYWZpaTU3NDAwIiwiYWZpaTU3NDAxIiwiYWZpaTU3NDAzIiwiYWZpaTU3NDA3IiwiYWZpaTU3NDA5IiwiYWZpaTU3NDEwIiwiYWZpaTU3NDExIiwiYWZpaTU3NDEyIiwiYWZpaTU3NDEzIiwiYWZpaTU3NDE0IiwiYWZpaTU3NDE1IiwiYWZpaTU3NDE2IiwiYWZpaTU3NDE3IiwiYWZpaTU3NDE4IiwiYWZpaTU3NDE5IiwiYWZpaTU3NDIwIiwiYWZpaTU3NDIxIiwiYWZpaTU3NDIyIiwiYWZpaTU3NDIzIiwiYWZpaTU3NDI0IiwiYWZpaTU3NDI1IiwiYWZpaTU3NDI2IiwiYWZpaTU3NDI3IiwiYWZpaTU3NDI4IiwiYWZpaTU3NDI5IiwiYWZpaTU3NDMwIiwiYWZpaTU3NDMxIiwiYWZpaTU3NDMyIiwiYWZpaTU3NDMzIiwiYWZpaTU3NDM0IiwiYWZpaTU3NDQwIiwiYWZpaTU3NDQxIiwiYWZpaTU3NDQyIiwiYWZpaTU3NDQzIiwiYWZpaTU3NDQ0IiwiYWZpaTU3NDQ1IiwiYWZpaTU3NDQ2IiwiYWZpaTU3NDQ4IiwiYWZpaTU3NDQ5IiwiYWZpaTU3NDUwIiwiYWZpaTU3NDUxIiwiYWZpaTU3NDUyIiwiYWZpaTU3NDUzIiwiYWZpaTU3NDU0IiwiYWZpaTU3NDU1IiwiYWZpaTU3NDU2IiwiYWZpaTU3NDU3IiwiYWZpaTU3NDU4IiwiYWZpaTU3NDcwIiwiYWZpaTU3NTA1IiwiYWZpaTU3NTA2IiwiYWZpaTU3NTA3IiwiYWZpaTU3NTA4IiwiYWZpaTU3NTA5IiwiYWZpaTU3NTExIiwiYWZpaTU3NTEyIiwiYWZpaTU3NTEzIiwiYWZpaTU3NTE0IiwiYWZpaTU3NTE5IiwiYWZpaTU3NTM0IiwiYWZpaTU3NjM2IiwiYWZpaTU3NjQ1IiwiYWZpaTU3NjU4IiwiYWZpaTU3NjY0IiwiYWZpaTU3NjY1IiwiYWZpaTU3NjY2IiwiYWZpaTU3NjY3IiwiYWZpaTU3NjY4IiwiYWZpaTU3NjY5IiwiYWZpaTU3NjcwIiwiYWZpaTU3NjcxIiwiYWZpaTU3NjcyIiwiYWZpaTU3NjczIiwiYWZpaTU3Njc0IiwiYWZpaTU3Njc1IiwiYWZpaTU3Njc2IiwiYWZpaTU3Njc3IiwiYWZpaTU3Njc4IiwiYWZpaTU3Njc5IiwiYWZpaTU3NjgwIiwiYWZpaTU3NjgxIiwiYWZpaTU3NjgyIiwiYWZpaTU3NjgzIiwiYWZpaTU3Njg0IiwiYWZpaTU3Njg1IiwiYWZpaTU3Njg2IiwiYWZpaTU3Njg3IiwiYWZpaTU3Njg4IiwiYWZpaTU3Njg5IiwiYWZpaTU3NjkwIiwiYWZpaTU3Njk0IiwiYWZpaTU3Njk1IiwiYWZpaTU3NzAwIiwiYWZpaTU3NzA1IiwiYWZpaTU3NzE2IiwiYWZpaTU3NzE3IiwiYWZpaTU3NzE4IiwiYWZpaTU3NzIzIiwiYWZpaTU3NzkzIiwiYWZpaTU3Nzk0IiwiYWZpaTU3Nzk1IiwiYWZpaTU3Nzk2IiwiYWZpaTU3Nzk3IiwiYWZpaTU3Nzk4IiwiYWZpaTU3Nzk5IiwiYWZpaTU3ODAwIiwiYWZpaTU3ODAxIiwiYWZpaTU3ODAyIiwiYWZpaTU3ODAzIiwiYWZpaTU3ODA0IiwiYWZpaTU3ODA2IiwiYWZpaTU3ODA3IiwiYWZpaTU3ODM5IiwiYWZpaTU3ODQxIiwiYWZpaTU3ODQyIiwiYWZpaTU3OTI5IiwiYWZpaTYxMjQ4IiwiYWZpaTYxMjg5IiwiYWZpaTYxMzUyIiwiYWZpaTYxNTczIiwiYWZpaTYxNTc0IiwiYWZpaTYxNTc1IiwiYWZpaTYxNjY0IiwiYWZpaTYzMTY3IiwiYWZpaTY0OTM3IiwiYWdyYXZlIiwiYWd1amFyYXRpIiwiYWd1cm11a2hpIiwiYWhpcmFnYW5hIiwiYWhvb2thYm92ZSIsImFpYmVuZ2FsaSIsImFpYm9wb21vZm8iLCJhaWRldmEiLCJhaWVjeXJpbGxpYyIsImFpZ3VqYXJhdGkiLCJhaWd1cm11a2hpIiwiYWltYXRyYWd1cm11a2hpIiwiYWluYXJhYmljIiwiYWluZmluYWxhcmFiaWMiLCJhaW5pbml0aWFsYXJhYmljIiwiYWlubWVkaWFsYXJhYmljIiwiYWludmVydGVkYnJldmUiLCJhaXZvd2Vsc2lnbmJlbmdhbGkiLCJhaXZvd2Vsc2lnbmRldmEiLCJhaXZvd2Vsc2lnbmd1amFyYXRpIiwiYWthdGFrYW5hIiwiYWthdGFrYW5haGFsZndpZHRoIiwiYWtvcmVhbiIsImFsZWYiLCJhbGVmYXJhYmljIiwiYWxlZmRhZ2VzaGhlYnJldyIsImFsZWZmaW5hbGFyYWJpYyIsImFsZWZoYW16YWFib3ZlYXJhYmljIiwiYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyIsImFsZWZoYW16YWJlbG93YXJhYmljIiwiYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyIsImFsZWZoZWJyZXciLCJhbGVmbGFtZWRoZWJyZXciLCJhbGVmbWFkZGFhYm92ZWFyYWJpYyIsImFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMiLCJhbGVmbWFrc3VyYWFyYWJpYyIsImFsZWZtYWtzdXJhZmluYWxhcmFiaWMiLCJhbGVmbWFrc3VyYWluaXRpYWxhcmFiaWMiLCJhbGVmbWFrc3VyYW1lZGlhbGFyYWJpYyIsImFsZWZwYXRhaGhlYnJldyIsImFsZWZxYW1hdHNoZWJyZXciLCJhbGVwaCIsImFsbGVxdWFsIiwiYWxwaGF0b25vcyIsImFtYWNyb24iLCJhbW9ub3NwYWNlIiwiYW1wZXJzYW5kIiwiYW1wZXJzYW5kbW9ub3NwYWNlIiwiYW1wZXJzYW5kc21hbGwiLCJhbXNxdWFyZSIsImFuYm9wb21vZm8iLCJhbmdib3BvbW9mbyIsImFuZ2JyYWNrZXRsZWZ0IiwiYW5nYnJhY2tldHJpZ2h0IiwiYW5na2hhbmtodXRoYWkiLCJhbmdsZWJyYWNrZXRsZWZ0IiwiYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsIiwiYW5nbGVicmFja2V0cmlnaHQiLCJhbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsIiwiYW5nbGVsZWZ0IiwiYW5nbGVyaWdodCIsImFuZ3N0cm9tIiwiYW5vdGVsZWlhIiwiYW51ZGF0dGFkZXZhIiwiYW51c3ZhcmFiZW5nYWxpIiwiYW51c3ZhcmFkZXZhIiwiYW51c3ZhcmFndWphcmF0aSIsImFvZ29uZWsiLCJhcGFhdG9zcXVhcmUiLCJhcGFyZW4iLCJhcG9zdHJvcGhlYXJtZW5pYW4iLCJhcG9zdHJvcGhlbW9kIiwiYXBwbGUiLCJhcHByb2FjaGVzIiwiYXBwcm94ZXF1YWwiLCJhcHByb3hlcXVhbG9yaW1hZ2UiLCJhcHByb3hpbWF0ZWx5ZXF1YWwiLCJhcmFlYWVrb3JlYW4iLCJhcmFlYWtvcmVhbiIsImFyYyIsImFyaWdodGhhbGZyaW5nIiwiYXJpbmciLCJhcmluZ2FjdXRlIiwiYXJpbmdiZWxvdyIsImFycm93Ym90aCIsImFycm93ZGFzaGRvd24iLCJhcnJvd2Rhc2hsZWZ0IiwiYXJyb3dkYXNocmlnaHQiLCJhcnJvd2Rhc2h1cCIsImFycm93ZGJsYm90aCIsImFycm93ZGJsZG93biIsImFycm93ZGJsbGVmdCIsImFycm93ZGJscmlnaHQiLCJhcnJvd2RibHVwIiwiYXJyb3dkb3duIiwiYXJyb3dkb3dubGVmdCIsImFycm93ZG93bnJpZ2h0IiwiYXJyb3dkb3dud2hpdGUiLCJhcnJvd2hlYWRkb3dubW9kIiwiYXJyb3doZWFkbGVmdG1vZCIsImFycm93aGVhZHJpZ2h0bW9kIiwiYXJyb3doZWFkdXBtb2QiLCJhcnJvd2hvcml6ZXgiLCJhcnJvd2xlZnQiLCJhcnJvd2xlZnRkYmwiLCJhcnJvd2xlZnRkYmxzdHJva2UiLCJhcnJvd2xlZnRvdmVycmlnaHQiLCJhcnJvd2xlZnR3aGl0ZSIsImFycm93cmlnaHQiLCJhcnJvd3JpZ2h0ZGJsc3Ryb2tlIiwiYXJyb3dyaWdodGhlYXZ5IiwiYXJyb3dyaWdodG92ZXJsZWZ0IiwiYXJyb3dyaWdodHdoaXRlIiwiYXJyb3d0YWJsZWZ0IiwiYXJyb3d0YWJyaWdodCIsImFycm93dXAiLCJhcnJvd3VwZG4iLCJhcnJvd3VwZG5ic2UiLCJhcnJvd3VwZG93bmJhc2UiLCJhcnJvd3VwbGVmdCIsImFycm93dXBsZWZ0b2Zkb3duIiwiYXJyb3d1cHJpZ2h0IiwiYXJyb3d1cHdoaXRlIiwiYXJyb3d2ZXJ0ZXgiLCJhc2NpaWNpcmN1bSIsImFzY2lpY2lyY3VtbW9ub3NwYWNlIiwiYXNjaWl0aWxkZSIsImFzY2lpdGlsZGVtb25vc3BhY2UiLCJhc2NyaXB0IiwiYXNjcmlwdHR1cm5lZCIsImFzbWFsbGhpcmFnYW5hIiwiYXNtYWxsa2F0YWthbmEiLCJhc21hbGxrYXRha2FuYWhhbGZ3aWR0aCIsImFzdGVyaXNrIiwiYXN0ZXJpc2thbHRvbmVhcmFiaWMiLCJhc3Rlcmlza2FyYWJpYyIsImFzdGVyaXNrbWF0aCIsImFzdGVyaXNrbW9ub3NwYWNlIiwiYXN0ZXJpc2tzbWFsbCIsImFzdGVyaXNtIiwiYXN1cGVyaW9yIiwiYXN5bXB0b3RpY2FsbHllcXVhbCIsImF0aWxkZSIsImF0bW9ub3NwYWNlIiwiYXRzbWFsbCIsImF0dXJuZWQiLCJhdWJlbmdhbGkiLCJhdWJvcG9tb2ZvIiwiYXVkZXZhIiwiYXVndWphcmF0aSIsImF1Z3VybXVraGkiLCJhdWxlbmd0aG1hcmtiZW5nYWxpIiwiYXVtYXRyYWd1cm11a2hpIiwiYXV2b3dlbHNpZ25iZW5nYWxpIiwiYXV2b3dlbHNpZ25kZXZhIiwiYXV2b3dlbHNpZ25ndWphcmF0aSIsImF2YWdyYWhhZGV2YSIsImF5YmFybWVuaWFuIiwiYXlpbiIsImF5aW5hbHRvbmVoZWJyZXciLCJheWluaGVicmV3IiwiYmFiZW5nYWxpIiwiYmFja3NsYXNoIiwiYmFja3NsYXNobW9ub3NwYWNlIiwiYmFkZXZhIiwiYmFndWphcmF0aSIsImJhZ3VybXVraGkiLCJiYWhpcmFnYW5hIiwiYmFodHRoYWkiLCJiYWthdGFrYW5hIiwiYmFyIiwiYmFybW9ub3NwYWNlIiwiYmJvcG9tb2ZvIiwiYmNpcmNsZSIsImJkb3RhY2NlbnQiLCJiZG90YmVsb3ciLCJiZWFtZWRzaXh0ZWVudGhub3RlcyIsImJlY2F1c2UiLCJiZWN5cmlsbGljIiwiYmVoYXJhYmljIiwiYmVoZmluYWxhcmFiaWMiLCJiZWhpbml0aWFsYXJhYmljIiwiYmVoaXJhZ2FuYSIsImJlaG1lZGlhbGFyYWJpYyIsImJlaG1lZW1pbml0aWFsYXJhYmljIiwiYmVobWVlbWlzb2xhdGVkYXJhYmljIiwiYmVobm9vbmZpbmFsYXJhYmljIiwiYmVrYXRha2FuYSIsImJlbmFybWVuaWFuIiwiYmV0IiwiYmV0YXN5bWJvbGdyZWVrIiwiYmV0ZGFnZXNoIiwiYmV0ZGFnZXNoaGVicmV3IiwiYmV0aGVicmV3IiwiYmV0cmFmZWhlYnJldyIsImJoYWJlbmdhbGkiLCJiaGFkZXZhIiwiYmhhZ3VqYXJhdGkiLCJiaGFndXJtdWtoaSIsImJob29rIiwiYmloaXJhZ2FuYSIsImJpa2F0YWthbmEiLCJiaWxhYmlhbGNsaWNrIiwiYmluZGlndXJtdWtoaSIsImJpcnVzcXVhcmUiLCJibGFja2NpcmNsZSIsImJsYWNrZGlhbW9uZCIsImJsYWNrZG93bnBvaW50aW5ndHJpYW5nbGUiLCJibGFja2xlZnRwb2ludGluZ3BvaW50ZXIiLCJibGFja2xlZnRwb2ludGluZ3RyaWFuZ2xlIiwiYmxhY2tsZW50aWN1bGFyYnJhY2tldGxlZnQiLCJibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdHZlcnRpY2FsIiwiYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0IiwiYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0dmVydGljYWwiLCJibGFja2xvd2VybGVmdHRyaWFuZ2xlIiwiYmxhY2tsb3dlcnJpZ2h0dHJpYW5nbGUiLCJibGFja3JlY3RhbmdsZSIsImJsYWNrcmlnaHRwb2ludGluZ3BvaW50ZXIiLCJibGFja3JpZ2h0cG9pbnRpbmd0cmlhbmdsZSIsImJsYWNrc21hbGxzcXVhcmUiLCJibGFja3NtaWxpbmdmYWNlIiwiYmxhY2tzcXVhcmUiLCJibGFja3N0YXIiLCJibGFja3VwcGVybGVmdHRyaWFuZ2xlIiwiYmxhY2t1cHBlcnJpZ2h0dHJpYW5nbGUiLCJibGFja3VwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlIiwiYmxhY2t1cHBvaW50aW5ndHJpYW5nbGUiLCJibGFuayIsImJsaW5lYmVsb3ciLCJibW9ub3NwYWNlIiwiYm9iYWltYWl0aGFpIiwiYm9oaXJhZ2FuYSIsImJva2F0YWthbmEiLCJicGFyZW4iLCJicXNxdWFyZSIsImJyYWNlZXgiLCJicmFjZWxlZnQiLCJicmFjZWxlZnRidCIsImJyYWNlbGVmdG1pZCIsImJyYWNlbGVmdG1vbm9zcGFjZSIsImJyYWNlbGVmdHNtYWxsIiwiYnJhY2VsZWZ0dHAiLCJicmFjZWxlZnR2ZXJ0aWNhbCIsImJyYWNlcmlnaHQiLCJicmFjZXJpZ2h0YnQiLCJicmFjZXJpZ2h0bWlkIiwiYnJhY2VyaWdodG1vbm9zcGFjZSIsImJyYWNlcmlnaHRzbWFsbCIsImJyYWNlcmlnaHR0cCIsImJyYWNlcmlnaHR2ZXJ0aWNhbCIsImJyYWNrZXRsZWZ0IiwiYnJhY2tldGxlZnRidCIsImJyYWNrZXRsZWZ0ZXgiLCJicmFja2V0bGVmdG1vbm9zcGFjZSIsImJyYWNrZXRsZWZ0dHAiLCJicmFja2V0cmlnaHQiLCJicmFja2V0cmlnaHRidCIsImJyYWNrZXRyaWdodGV4IiwiYnJhY2tldHJpZ2h0bW9ub3NwYWNlIiwiYnJhY2tldHJpZ2h0dHAiLCJicmV2ZSIsImJyZXZlYmVsb3djbWIiLCJicmV2ZWNtYiIsImJyZXZlaW52ZXJ0ZWRiZWxvd2NtYiIsImJyZXZlaW52ZXJ0ZWRjbWIiLCJicmV2ZWludmVydGVkZG91YmxlY21iIiwiYnJpZGdlYmVsb3djbWIiLCJicmlkZ2VpbnZlcnRlZGJlbG93Y21iIiwiYnJva2VuYmFyIiwiYnN0cm9rZSIsImJzdXBlcmlvciIsImJ0b3BiYXIiLCJidWhpcmFnYW5hIiwiYnVrYXRha2FuYSIsImJ1bGxldCIsImJ1bGxldGludmVyc2UiLCJidWxsZXRvcGVyYXRvciIsImJ1bGxzZXllIiwiY2Fhcm1lbmlhbiIsImNhYmVuZ2FsaSIsImNhY3V0ZSIsImNhZGV2YSIsImNhZ3VqYXJhdGkiLCJjYWd1cm11a2hpIiwiY2Fsc3F1YXJlIiwiY2FuZHJhYmluZHViZW5nYWxpIiwiY2FuZHJhYmluZHVjbWIiLCJjYW5kcmFiaW5kdWRldmEiLCJjYW5kcmFiaW5kdWd1amFyYXRpIiwiY2Fwc2xvY2siLCJjYXJlb2YiLCJjYXJvbiIsImNhcm9uYmVsb3djbWIiLCJjYXJvbmNtYiIsImNhcnJpYWdlcmV0dXJuIiwiY2JvcG9tb2ZvIiwiY2Nhcm9uIiwiY2NlZGlsbGEiLCJjY2VkaWxsYWFjdXRlIiwiY2NpcmNsZSIsImNjaXJjdW1mbGV4IiwiY2N1cmwiLCJjZG90IiwiY2RvdGFjY2VudCIsImNkc3F1YXJlIiwiY2VkaWxsYSIsImNlZGlsbGFjbWIiLCJjZW50IiwiY2VudGlncmFkZSIsImNlbnRpbmZlcmlvciIsImNlbnRtb25vc3BhY2UiLCJjZW50b2xkc3R5bGUiLCJjZW50c3VwZXJpb3IiLCJjaGFhcm1lbmlhbiIsImNoYWJlbmdhbGkiLCJjaGFkZXZhIiwiY2hhZ3VqYXJhdGkiLCJjaGFndXJtdWtoaSIsImNoYm9wb21vZm8iLCJjaGVhYmtoYXNpYW5jeXJpbGxpYyIsImNoZWNrbWFyayIsImNoZWN5cmlsbGljIiwiY2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMiLCJjaGVkZXNjZW5kZXJjeXJpbGxpYyIsImNoZWRpZXJlc2lzY3lyaWxsaWMiLCJjaGVoYXJtZW5pYW4iLCJjaGVraGFrYXNzaWFuY3lyaWxsaWMiLCJjaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljIiwiY2hpIiwiY2hpZXVjaGFjaXJjbGVrb3JlYW4iLCJjaGlldWNoYXBhcmVua29yZWFuIiwiY2hpZXVjaGNpcmNsZWtvcmVhbiIsImNoaWV1Y2hrb3JlYW4iLCJjaGlldWNocGFyZW5rb3JlYW4iLCJjaG9jaGFuZ3RoYWkiLCJjaG9jaGFudGhhaSIsImNob2NoaW5ndGhhaSIsImNob2Nob2V0aGFpIiwiY2hvb2siLCJjaWV1Y2FjaXJjbGVrb3JlYW4iLCJjaWV1Y2FwYXJlbmtvcmVhbiIsImNpZXVjY2lyY2xla29yZWFuIiwiY2lldWNrb3JlYW4iLCJjaWV1Y3BhcmVua29yZWFuIiwiY2lldWN1cGFyZW5rb3JlYW4iLCJjaXJjbGUiLCJjaXJjbGVjb3B5cnQiLCJjaXJjbGVtdWx0aXBseSIsImNpcmNsZW90IiwiY2lyY2xlcGx1cyIsImNpcmNsZXBvc3RhbG1hcmsiLCJjaXJjbGV3aXRobGVmdGhhbGZibGFjayIsImNpcmNsZXdpdGhyaWdodGhhbGZibGFjayIsImNpcmN1bWZsZXgiLCJjaXJjdW1mbGV4YmVsb3djbWIiLCJjaXJjdW1mbGV4Y21iIiwiY2xpY2thbHZlb2xhciIsImNsaWNrZGVudGFsIiwiY2xpY2tsYXRlcmFsIiwiY2xpY2tyZXRyb2ZsZXgiLCJjbHViIiwiY2x1YnN1aXRibGFjayIsImNsdWJzdWl0d2hpdGUiLCJjbWN1YmVkc3F1YXJlIiwiY21vbm9zcGFjZSIsImNtc3F1YXJlZHNxdWFyZSIsImNvYXJtZW5pYW4iLCJjb2xvbiIsImNvbG9ubW9uZXRhcnkiLCJjb2xvbm1vbm9zcGFjZSIsImNvbG9uc2lnbiIsImNvbG9uc21hbGwiLCJjb2xvbnRyaWFuZ3VsYXJoYWxmbW9kIiwiY29sb250cmlhbmd1bGFybW9kIiwiY29tbWEiLCJjb21tYWFib3ZlY21iIiwiY29tbWFhYm92ZXJpZ2h0Y21iIiwiY29tbWFhY2NlbnQiLCJjb21tYWFyYWJpYyIsImNvbW1hYXJtZW5pYW4iLCJjb21tYWluZmVyaW9yIiwiY29tbWFtb25vc3BhY2UiLCJjb21tYXJldmVyc2VkYWJvdmVjbWIiLCJjb21tYXJldmVyc2VkbW9kIiwiY29tbWFzbWFsbCIsImNvbW1hc3VwZXJpb3IiLCJjb21tYXR1cm5lZGFib3ZlY21iIiwiY29tbWF0dXJuZWRtb2QiLCJjb21wYXNzIiwiY29uZ3J1ZW50IiwiY29udG91cmludGVncmFsIiwiY29udHJvbCIsImNvbnRyb2xBQ0siLCJjb250cm9sQkVMIiwiY29udHJvbEJTIiwiY29udHJvbENBTiIsImNvbnRyb2xDUiIsImNvbnRyb2xEQzEiLCJjb250cm9sREMyIiwiY29udHJvbERDMyIsImNvbnRyb2xEQzQiLCJjb250cm9sREVMIiwiY29udHJvbERMRSIsImNvbnRyb2xFTSIsImNvbnRyb2xFTlEiLCJjb250cm9sRU9UIiwiY29udHJvbEVTQyIsImNvbnRyb2xFVEIiLCJjb250cm9sRVRYIiwiY29udHJvbEZGIiwiY29udHJvbEZTIiwiY29udHJvbEdTIiwiY29udHJvbEhUIiwiY29udHJvbExGIiwiY29udHJvbE5BSyIsImNvbnRyb2xOVUxMIiwiY29udHJvbFJTIiwiY29udHJvbFNJIiwiY29udHJvbFNPIiwiY29udHJvbFNPVCIsImNvbnRyb2xTVFgiLCJjb250cm9sU1VCIiwiY29udHJvbFNZTiIsImNvbnRyb2xVUyIsImNvbnRyb2xWVCIsImNvcHlyaWdodCIsImNvcHlyaWdodHNhbnMiLCJjb3B5cmlnaHRzZXJpZiIsImNvcm5lcmJyYWNrZXRsZWZ0IiwiY29ybmVyYnJhY2tldGxlZnRoYWxmd2lkdGgiLCJjb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsIiwiY29ybmVyYnJhY2tldHJpZ2h0IiwiY29ybmVyYnJhY2tldHJpZ2h0aGFsZndpZHRoIiwiY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWwiLCJjb3Jwb3JhdGlvbnNxdWFyZSIsImNvc3F1YXJlIiwiY292ZXJrZ3NxdWFyZSIsImNwYXJlbiIsImNydXplaXJvIiwiY3N0cmV0Y2hlZCIsImN1cmx5YW5kIiwiY3VybHlvciIsImN1cnJlbmN5IiwiY3lyQnJldmUiLCJjeXJGbGV4IiwiY3lyYnJldmUiLCJjeXJmbGV4IiwiZGFhcm1lbmlhbiIsImRhYmVuZ2FsaSIsImRhZGFyYWJpYyIsImRhZGV2YSIsImRhZGZpbmFsYXJhYmljIiwiZGFkaW5pdGlhbGFyYWJpYyIsImRhZG1lZGlhbGFyYWJpYyIsImRhZ2VzaCIsImRhZ2VzaGhlYnJldyIsImRhZ2dlciIsImRhZ2dlcmRibCIsImRhZ3VqYXJhdGkiLCJkYWd1cm11a2hpIiwiZGFoaXJhZ2FuYSIsImRha2F0YWthbmEiLCJkYWxhcmFiaWMiLCJkYWxldCIsImRhbGV0ZGFnZXNoIiwiZGFsZXRkYWdlc2hoZWJyZXciLCJkYWxldGhlYnJldyIsImRhbGZpbmFsYXJhYmljIiwiZGFtbWFhcmFiaWMiLCJkYW1tYWxvd2FyYWJpYyIsImRhbW1hdGFuYWx0b25lYXJhYmljIiwiZGFtbWF0YW5hcmFiaWMiLCJkYW5kYSIsImRhcmdhaGVicmV3IiwiZGFyZ2FsZWZ0aGVicmV3IiwiZGFzaWFwbmV1bWF0YWN5cmlsbGljY21iIiwiZGJsR3JhdmUiLCJkYmxhbmdsZWJyYWNrZXRsZWZ0IiwiZGJsYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsIiwiZGJsYW5nbGVicmFja2V0cmlnaHQiLCJkYmxhbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsIiwiZGJsYXJjaGludmVydGVkYmVsb3djbWIiLCJkYmxhcnJvd2xlZnQiLCJkYmxhcnJvd3JpZ2h0IiwiZGJsZGFuZGEiLCJkYmxncmF2ZSIsImRibGdyYXZlY21iIiwiZGJsaW50ZWdyYWwiLCJkYmxsb3dsaW5lIiwiZGJsbG93bGluZWNtYiIsImRibG92ZXJsaW5lY21iIiwiZGJscHJpbWVtb2QiLCJkYmx2ZXJ0aWNhbGJhciIsImRibHZlcnRpY2FsbGluZWFib3ZlY21iIiwiZGJvcG9tb2ZvIiwiZGJzcXVhcmUiLCJkY2Fyb24iLCJkY2VkaWxsYSIsImRjaXJjbGUiLCJkY2lyY3VtZmxleGJlbG93IiwiZGNyb2F0IiwiZGRhYmVuZ2FsaSIsImRkYWRldmEiLCJkZGFndWphcmF0aSIsImRkYWd1cm11a2hpIiwiZGRhbGFyYWJpYyIsImRkYWxmaW5hbGFyYWJpYyIsImRkZGhhZGV2YSIsImRkaGFiZW5nYWxpIiwiZGRoYWRldmEiLCJkZGhhZ3VqYXJhdGkiLCJkZGhhZ3VybXVraGkiLCJkZG90YWNjZW50IiwiZGRvdGJlbG93IiwiZGVjaW1hbHNlcGFyYXRvcmFyYWJpYyIsImRlY2ltYWxzZXBhcmF0b3JwZXJzaWFuIiwiZGVjeXJpbGxpYyIsImRlZ3JlZSIsImRlaGloZWJyZXciLCJkZWhpcmFnYW5hIiwiZGVpY29wdGljIiwiZGVrYXRha2FuYSIsImRlbGV0ZWxlZnQiLCJkZWxldGVyaWdodCIsImRlbHRhdHVybmVkIiwiZGVub21pbmF0b3JtaW51c29uZW51bWVyYXRvcmJlbmdhbGkiLCJkZXpoIiwiZGhhYmVuZ2FsaSIsImRoYWRldmEiLCJkaGFndWphcmF0aSIsImRoYWd1cm11a2hpIiwiZGhvb2siLCJkaWFseXRpa2F0b25vcyIsImRpYWx5dGlrYXRvbm9zY21iIiwiZGlhbW9uZCIsImRpYW1vbmRzdWl0d2hpdGUiLCJkaWVyZXNpcyIsImRpZXJlc2lzYWN1dGUiLCJkaWVyZXNpc2JlbG93Y21iIiwiZGllcmVzaXNjbWIiLCJkaWVyZXNpc2dyYXZlIiwiZGllcmVzaXN0b25vcyIsImRpaGlyYWdhbmEiLCJkaWthdGFrYW5hIiwiZGl0dG9tYXJrIiwiZGl2aWRlIiwiZGl2aWRlcyIsImRpdmlzaW9uc2xhc2giLCJkamVjeXJpbGxpYyIsImRrc2hhZGUiLCJkbGluZWJlbG93IiwiZGxzcXVhcmUiLCJkbWFjcm9uIiwiZG1vbm9zcGFjZSIsImRuYmxvY2siLCJkb2NoYWRhdGhhaSIsImRvZGVrdGhhaSIsImRvaGlyYWdhbmEiLCJkb2thdGFrYW5hIiwiZG9sbGFyIiwiZG9sbGFyaW5mZXJpb3IiLCJkb2xsYXJtb25vc3BhY2UiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnNtYWxsIiwiZG9sbGFyc3VwZXJpb3IiLCJkb25nIiwiZG9ydXNxdWFyZSIsImRvdGFjY2VudCIsImRvdGFjY2VudGNtYiIsImRvdGJlbG93Y21iIiwiZG90YmVsb3djb21iIiwiZG90a2F0YWthbmEiLCJkb3RsZXNzaSIsImRvdGxlc3NqIiwiZG90bGVzc2pzdHJva2Vob29rIiwiZG90bWF0aCIsImRvdHRlZGNpcmNsZSIsImRvdWJsZXlvZHBhdGFoIiwiZG91YmxleW9kcGF0YWhoZWJyZXciLCJkb3dudGFja2JlbG93Y21iIiwiZG93bnRhY2ttb2QiLCJkcGFyZW4iLCJkc3VwZXJpb3IiLCJkdGFpbCIsImR0b3BiYXIiLCJkdWhpcmFnYW5hIiwiZHVrYXRha2FuYSIsImR6IiwiZHphbHRvbmUiLCJkemNhcm9uIiwiZHpjdXJsIiwiZHplYWJraGFzaWFuY3lyaWxsaWMiLCJkemVjeXJpbGxpYyIsImR6aGVjeXJpbGxpYyIsImVhY3V0ZSIsImVhcnRoIiwiZWJlbmdhbGkiLCJlYm9wb21vZm8iLCJlYnJldmUiLCJlY2FuZHJhZGV2YSIsImVjYW5kcmFndWphcmF0aSIsImVjYW5kcmF2b3dlbHNpZ25kZXZhIiwiZWNhbmRyYXZvd2Vsc2lnbmd1amFyYXRpIiwiZWNhcm9uIiwiZWNlZGlsbGFicmV2ZSIsImVjaGFybWVuaWFuIiwiZWNoeWl3bmFybWVuaWFuIiwiZWNpcmNsZSIsImVjaXJjdW1mbGV4IiwiZWNpcmN1bWZsZXhhY3V0ZSIsImVjaXJjdW1mbGV4YmVsb3ciLCJlY2lyY3VtZmxleGRvdGJlbG93IiwiZWNpcmN1bWZsZXhncmF2ZSIsImVjaXJjdW1mbGV4aG9va2Fib3ZlIiwiZWNpcmN1bWZsZXh0aWxkZSIsImVjeXJpbGxpYyIsImVkYmxncmF2ZSIsImVkZXZhIiwiZWRpZXJlc2lzIiwiZWRvdCIsImVkb3RhY2NlbnQiLCJlZG90YmVsb3ciLCJlZWd1cm11a2hpIiwiZWVtYXRyYWd1cm11a2hpIiwiZWZjeXJpbGxpYyIsImVncmF2ZSIsImVndWphcmF0aSIsImVoYXJtZW5pYW4iLCJlaGJvcG9tb2ZvIiwiZWhpcmFnYW5hIiwiZWhvb2thYm92ZSIsImVpYm9wb21vZm8iLCJlaWdodCIsImVpZ2h0YXJhYmljIiwiZWlnaHRiZW5nYWxpIiwiZWlnaHRjaXJjbGUiLCJlaWdodGNpcmNsZWludmVyc2VzYW5zc2VyaWYiLCJlaWdodGRldmEiLCJlaWdodGVlbmNpcmNsZSIsImVpZ2h0ZWVucGFyZW4iLCJlaWdodGVlbnBlcmlvZCIsImVpZ2h0Z3VqYXJhdGkiLCJlaWdodGd1cm11a2hpIiwiZWlnaHRoYWNrYXJhYmljIiwiZWlnaHRoYW5nemhvdSIsImVpZ2h0aG5vdGViZWFtZWQiLCJlaWdodGlkZW9ncmFwaGljcGFyZW4iLCJlaWdodGluZmVyaW9yIiwiZWlnaHRtb25vc3BhY2UiLCJlaWdodG9sZHN0eWxlIiwiZWlnaHRwYXJlbiIsImVpZ2h0cGVyaW9kIiwiZWlnaHRwZXJzaWFuIiwiZWlnaHRyb21hbiIsImVpZ2h0c3VwZXJpb3IiLCJlaWdodHRoYWkiLCJlaW52ZXJ0ZWRicmV2ZSIsImVpb3RpZmllZGN5cmlsbGljIiwiZWthdGFrYW5hIiwiZWthdGFrYW5haGFsZndpZHRoIiwiZWtvbmthcmd1cm11a2hpIiwiZWtvcmVhbiIsImVsY3lyaWxsaWMiLCJlbGV2ZW5jaXJjbGUiLCJlbGV2ZW5wYXJlbiIsImVsZXZlbnBlcmlvZCIsImVsZXZlbnJvbWFuIiwiZWxsaXBzaXMiLCJlbGxpcHNpc3ZlcnRpY2FsIiwiZW1hY3JvbiIsImVtYWNyb25hY3V0ZSIsImVtYWNyb25ncmF2ZSIsImVtY3lyaWxsaWMiLCJlbWRhc2giLCJlbWRhc2h2ZXJ0aWNhbCIsImVtb25vc3BhY2UiLCJlbXBoYXNpc21hcmthcm1lbmlhbiIsImVtcHR5c2V0IiwiZW5ib3BvbW9mbyIsImVuY3lyaWxsaWMiLCJlbmRhc2giLCJlbmRhc2h2ZXJ0aWNhbCIsImVuZGVzY2VuZGVyY3lyaWxsaWMiLCJlbmciLCJlbmdib3BvbW9mbyIsImVuZ2hlY3lyaWxsaWMiLCJlbmhvb2tjeXJpbGxpYyIsImVuc3BhY2UiLCJlb2dvbmVrIiwiZW9rb3JlYW4iLCJlb3BlbiIsImVvcGVuY2xvc2VkIiwiZW9wZW5yZXZlcnNlZCIsImVvcGVucmV2ZXJzZWRjbG9zZWQiLCJlb3BlbnJldmVyc2VkaG9vayIsImVwYXJlbiIsImVwc2lsb250b25vcyIsImVxdWFsIiwiZXF1YWxtb25vc3BhY2UiLCJlcXVhbHNtYWxsIiwiZXF1YWxzdXBlcmlvciIsImVxdWl2YWxlbmNlIiwiZXJib3BvbW9mbyIsImVyY3lyaWxsaWMiLCJlcmV2ZXJzZWQiLCJlcmV2ZXJzZWRjeXJpbGxpYyIsImVzY3lyaWxsaWMiLCJlc2Rlc2NlbmRlcmN5cmlsbGljIiwiZXNoIiwiZXNoY3VybCIsImVzaG9ydGRldmEiLCJlc2hvcnR2b3dlbHNpZ25kZXZhIiwiZXNocmV2ZXJzZWRsb29wIiwiZXNoc3F1YXRyZXZlcnNlZCIsImVzbWFsbGhpcmFnYW5hIiwiZXNtYWxsa2F0YWthbmEiLCJlc21hbGxrYXRha2FuYWhhbGZ3aWR0aCIsImVzdGltYXRlZCIsImVzdXBlcmlvciIsImV0YSIsImV0YXJtZW5pYW4iLCJldGF0b25vcyIsImV0aCIsImV0aWxkZSIsImV0aWxkZWJlbG93IiwiZXRuYWh0YWZvdWtoaGVicmV3IiwiZXRuYWh0YWZvdWtobGVmdGhlYnJldyIsImV0bmFodGFoZWJyZXciLCJldG5haHRhbGVmdGhlYnJldyIsImV0dXJuZWQiLCJldWtvcmVhbiIsImV1cm8iLCJldm93ZWxzaWduYmVuZ2FsaSIsImV2b3dlbHNpZ25kZXZhIiwiZXZvd2Vsc2lnbmd1amFyYXRpIiwiZXhjbGFtIiwiZXhjbGFtYXJtZW5pYW4iLCJleGNsYW1kYmwiLCJleGNsYW1kb3duIiwiZXhjbGFtZG93bnNtYWxsIiwiZXhjbGFtbW9ub3NwYWNlIiwiZXhjbGFtc21hbGwiLCJleGlzdGVudGlhbCIsImV6aCIsImV6aGNhcm9uIiwiZXpoY3VybCIsImV6aHJldmVyc2VkIiwiZXpodGFpbCIsImZhZGV2YSIsImZhZ3VybXVraGkiLCJmYWhyZW5oZWl0IiwiZmF0aGFhcmFiaWMiLCJmYXRoYWxvd2FyYWJpYyIsImZhdGhhdGFuYXJhYmljIiwiZmJvcG9tb2ZvIiwiZmNpcmNsZSIsImZkb3RhY2NlbnQiLCJmZWhhcmFiaWMiLCJmZWhhcm1lbmlhbiIsImZlaGZpbmFsYXJhYmljIiwiZmVoaW5pdGlhbGFyYWJpYyIsImZlaG1lZGlhbGFyYWJpYyIsImZlaWNvcHRpYyIsImZlbWFsZSIsImZmIiwiZl9mIiwiZmZpIiwiZmZsIiwiZmkiLCJmaWZ0ZWVuY2lyY2xlIiwiZmlmdGVlbnBhcmVuIiwiZmlmdGVlbnBlcmlvZCIsImZpZ3VyZWRhc2giLCJmaWxsZWRib3giLCJmaWxsZWRyZWN0IiwiZmluYWxrYWYiLCJmaW5hbGthZmRhZ2VzaCIsImZpbmFsa2FmZGFnZXNoaGVicmV3IiwiZmluYWxrYWZoZWJyZXciLCJmaW5hbG1lbSIsImZpbmFsbWVtaGVicmV3IiwiZmluYWxudW4iLCJmaW5hbG51bmhlYnJldyIsImZpbmFscGUiLCJmaW5hbHBlaGVicmV3IiwiZmluYWx0c2FkaSIsImZpbmFsdHNhZGloZWJyZXciLCJmaXJzdHRvbmVjaGluZXNlIiwiZmlzaGV5ZSIsImZpdGFjeXJpbGxpYyIsImZpdmUiLCJmaXZlYXJhYmljIiwiZml2ZWJlbmdhbGkiLCJmaXZlY2lyY2xlIiwiZml2ZWNpcmNsZWludmVyc2VzYW5zc2VyaWYiLCJmaXZlZGV2YSIsImZpdmVlaWdodGhzIiwiZml2ZWd1amFyYXRpIiwiZml2ZWd1cm11a2hpIiwiZml2ZWhhY2thcmFiaWMiLCJmaXZlaGFuZ3pob3UiLCJmaXZlaWRlb2dyYXBoaWNwYXJlbiIsImZpdmVpbmZlcmlvciIsImZpdmVtb25vc3BhY2UiLCJmaXZlb2xkc3R5bGUiLCJmaXZlcGFyZW4iLCJmaXZlcGVyaW9kIiwiZml2ZXBlcnNpYW4iLCJmaXZlcm9tYW4iLCJmaXZlc3VwZXJpb3IiLCJmaXZldGhhaSIsImZsIiwiZmxvcmluIiwiZm1vbm9zcGFjZSIsImZtc3F1YXJlIiwiZm9mYW50aGFpIiwiZm9mYXRoYWkiLCJmb25nbWFudGhhaSIsImZvcmFsbCIsImZvdXIiLCJmb3VyYXJhYmljIiwiZm91cmJlbmdhbGkiLCJmb3VyY2lyY2xlIiwiZm91cmNpcmNsZWludmVyc2VzYW5zc2VyaWYiLCJmb3VyZGV2YSIsImZvdXJndWphcmF0aSIsImZvdXJndXJtdWtoaSIsImZvdXJoYWNrYXJhYmljIiwiZm91cmhhbmd6aG91IiwiZm91cmlkZW9ncmFwaGljcGFyZW4iLCJmb3VyaW5mZXJpb3IiLCJmb3VybW9ub3NwYWNlIiwiZm91cm51bWVyYXRvcmJlbmdhbGkiLCJmb3Vyb2xkc3R5bGUiLCJmb3VycGFyZW4iLCJmb3VycGVyaW9kIiwiZm91cnBlcnNpYW4iLCJmb3Vycm9tYW4iLCJmb3Vyc3VwZXJpb3IiLCJmb3VydGVlbmNpcmNsZSIsImZvdXJ0ZWVucGFyZW4iLCJmb3VydGVlbnBlcmlvZCIsImZvdXJ0aGFpIiwiZm91cnRodG9uZWNoaW5lc2UiLCJmcGFyZW4iLCJmcmFjdGlvbiIsImZyYW5jIiwiZ2FiZW5nYWxpIiwiZ2FjdXRlIiwiZ2FkZXZhIiwiZ2FmYXJhYmljIiwiZ2FmZmluYWxhcmFiaWMiLCJnYWZpbml0aWFsYXJhYmljIiwiZ2FmbWVkaWFsYXJhYmljIiwiZ2FndWphcmF0aSIsImdhZ3VybXVraGkiLCJnYWhpcmFnYW5hIiwiZ2FrYXRha2FuYSIsImdhbW1hbGF0aW5zbWFsbCIsImdhbW1hc3VwZXJpb3IiLCJnYW5naWFjb3B0aWMiLCJnYm9wb21vZm8iLCJnYnJldmUiLCJnY2Fyb24iLCJnY2VkaWxsYSIsImdjaXJjbGUiLCJnY2lyY3VtZmxleCIsImdjb21tYWFjY2VudCIsImdkb3QiLCJnZG90YWNjZW50IiwiZ2VjeXJpbGxpYyIsImdlaGlyYWdhbmEiLCJnZWthdGFrYW5hIiwiZ2VvbWV0cmljYWxseWVxdWFsIiwiZ2VyZXNoYWNjZW50aGVicmV3IiwiZ2VyZXNoaGVicmV3IiwiZ2VyZXNobXVxZGFtaGVicmV3IiwiZ2VybWFuZGJscyIsImdlcnNoYXlpbWFjY2VudGhlYnJldyIsImdlcnNoYXlpbWhlYnJldyIsImdldGFtYXJrIiwiZ2hhYmVuZ2FsaSIsImdoYWRhcm1lbmlhbiIsImdoYWRldmEiLCJnaGFndWphcmF0aSIsImdoYWd1cm11a2hpIiwiZ2hhaW5hcmFiaWMiLCJnaGFpbmZpbmFsYXJhYmljIiwiZ2hhaW5pbml0aWFsYXJhYmljIiwiZ2hhaW5tZWRpYWxhcmFiaWMiLCJnaGVtaWRkbGVob29rY3lyaWxsaWMiLCJnaGVzdHJva2VjeXJpbGxpYyIsImdoZXVwdHVybmN5cmlsbGljIiwiZ2hoYWRldmEiLCJnaGhhZ3VybXVraGkiLCJnaG9vayIsImdoenNxdWFyZSIsImdpaGlyYWdhbmEiLCJnaWthdGFrYW5hIiwiZ2ltYXJtZW5pYW4iLCJnaW1lbCIsImdpbWVsZGFnZXNoIiwiZ2ltZWxkYWdlc2hoZWJyZXciLCJnaW1lbGhlYnJldyIsImdqZWN5cmlsbGljIiwiZ2xvdHRhbGludmVydGVkc3Ryb2tlIiwiZ2xvdHRhbHN0b3AiLCJnbG90dGFsc3RvcGludmVydGVkIiwiZ2xvdHRhbHN0b3Btb2QiLCJnbG90dGFsc3RvcHJldmVyc2VkIiwiZ2xvdHRhbHN0b3ByZXZlcnNlZG1vZCIsImdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvciIsImdsb3R0YWxzdG9wc3Ryb2tlIiwiZ2xvdHRhbHN0b3BzdHJva2VyZXZlcnNlZCIsImdtYWNyb24iLCJnbW9ub3NwYWNlIiwiZ29oaXJhZ2FuYSIsImdva2F0YWthbmEiLCJncGFyZW4iLCJncGFzcXVhcmUiLCJncmFkaWVudCIsImdyYXZlIiwiZ3JhdmViZWxvd2NtYiIsImdyYXZlY21iIiwiZ3JhdmVjb21iIiwiZ3JhdmVkZXZhIiwiZ3JhdmVsb3dtb2QiLCJncmF2ZW1vbm9zcGFjZSIsImdyYXZldG9uZWNtYiIsImdyZWF0ZXIiLCJncmVhdGVyZXF1YWwiLCJncmVhdGVyZXF1YWxvcmxlc3MiLCJncmVhdGVybW9ub3NwYWNlIiwiZ3JlYXRlcm9yZXF1aXZhbGVudCIsImdyZWF0ZXJvcmxlc3MiLCJncmVhdGVyb3ZlcmVxdWFsIiwiZ3JlYXRlcnNtYWxsIiwiZ3NjcmlwdCIsImdzdHJva2UiLCJndWhpcmFnYW5hIiwiZ3VpbGxlbW90bGVmdCIsImd1aWxsZW1vdHJpZ2h0IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZ3VrYXRha2FuYSIsImd1cmFtdXNxdWFyZSIsImd5c3F1YXJlIiwiaGFhYmtoYXNpYW5jeXJpbGxpYyIsImhhYWx0b25lYXJhYmljIiwiaGFiZW5nYWxpIiwiaGFkZXNjZW5kZXJjeXJpbGxpYyIsImhhZGV2YSIsImhhZ3VqYXJhdGkiLCJoYWd1cm11a2hpIiwiaGFoYXJhYmljIiwiaGFoZmluYWxhcmFiaWMiLCJoYWhpbml0aWFsYXJhYmljIiwiaGFoaXJhZ2FuYSIsImhhaG1lZGlhbGFyYWJpYyIsImhhaXR1c3F1YXJlIiwiaGFrYXRha2FuYSIsImhha2F0YWthbmFoYWxmd2lkdGgiLCJoYWxhbnRndXJtdWtoaSIsImhhbXphYXJhYmljIiwiaGFtemFsb3dhcmFiaWMiLCJoYW5ndWxmaWxsZXIiLCJoYXJkc2lnbmN5cmlsbGljIiwiaGFycG9vbmxlZnRiYXJidXAiLCJoYXJwb29ucmlnaHRiYXJidXAiLCJoYXNxdWFyZSIsImhhdGFmcGF0YWgiLCJoYXRhZnBhdGFoMTYiLCJoYXRhZnBhdGFoMjMiLCJoYXRhZnBhdGFoMmYiLCJoYXRhZnBhdGFoaGVicmV3IiwiaGF0YWZwYXRhaG5hcnJvd2hlYnJldyIsImhhdGFmcGF0YWhxdWFydGVyaGVicmV3IiwiaGF0YWZwYXRhaHdpZGVoZWJyZXciLCJoYXRhZnFhbWF0cyIsImhhdGFmcWFtYXRzMWIiLCJoYXRhZnFhbWF0czI4IiwiaGF0YWZxYW1hdHMzNCIsImhhdGFmcWFtYXRzaGVicmV3IiwiaGF0YWZxYW1hdHNuYXJyb3doZWJyZXciLCJoYXRhZnFhbWF0c3F1YXJ0ZXJoZWJyZXciLCJoYXRhZnFhbWF0c3dpZGVoZWJyZXciLCJoYXRhZnNlZ29sIiwiaGF0YWZzZWdvbDE3IiwiaGF0YWZzZWdvbDI0IiwiaGF0YWZzZWdvbDMwIiwiaGF0YWZzZWdvbGhlYnJldyIsImhhdGFmc2Vnb2xuYXJyb3doZWJyZXciLCJoYXRhZnNlZ29scXVhcnRlcmhlYnJldyIsImhhdGFmc2Vnb2x3aWRlaGVicmV3IiwiaGJhciIsImhib3BvbW9mbyIsImhicmV2ZWJlbG93IiwiaGNlZGlsbGEiLCJoY2lyY2xlIiwiaGNpcmN1bWZsZXgiLCJoZGllcmVzaXMiLCJoZG90YWNjZW50IiwiaGRvdGJlbG93IiwiaGUiLCJoZWFydCIsImhlYXJ0c3VpdGJsYWNrIiwiaGVhcnRzdWl0d2hpdGUiLCJoZWRhZ2VzaCIsImhlZGFnZXNoaGVicmV3IiwiaGVoYWx0b25lYXJhYmljIiwiaGVoYXJhYmljIiwiaGVoZWJyZXciLCJoZWhmaW5hbGFsdG9uZWFyYWJpYyIsImhlaGZpbmFsYWx0dHdvYXJhYmljIiwiaGVoZmluYWxhcmFiaWMiLCJoZWhoYW16YWFib3ZlZmluYWxhcmFiaWMiLCJoZWhoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWMiLCJoZWhpbml0aWFsYWx0b25lYXJhYmljIiwiaGVoaW5pdGlhbGFyYWJpYyIsImhlaGlyYWdhbmEiLCJoZWhtZWRpYWxhbHRvbmVhcmFiaWMiLCJoZWhtZWRpYWxhcmFiaWMiLCJoZWlzZWllcmFzcXVhcmUiLCJoZWthdGFrYW5hIiwiaGVrYXRha2FuYWhhbGZ3aWR0aCIsImhla3V0YWFydXNxdWFyZSIsImhlbmdob29rIiwiaGVydXR1c3F1YXJlIiwiaGV0IiwiaGV0aGVicmV3IiwiaGhvb2siLCJoaG9va3N1cGVyaW9yIiwiaGlldWhhY2lyY2xla29yZWFuIiwiaGlldWhhcGFyZW5rb3JlYW4iLCJoaWV1aGNpcmNsZWtvcmVhbiIsImhpZXVoa29yZWFuIiwiaGlldWhwYXJlbmtvcmVhbiIsImhpaGlyYWdhbmEiLCJoaWthdGFrYW5hIiwiaGlrYXRha2FuYWhhbGZ3aWR0aCIsImhpcmlxIiwiaGlyaXExNCIsImhpcmlxMjEiLCJoaXJpcTJkIiwiaGlyaXFoZWJyZXciLCJoaXJpcW5hcnJvd2hlYnJldyIsImhpcmlxcXVhcnRlcmhlYnJldyIsImhpcmlxd2lkZWhlYnJldyIsImhsaW5lYmVsb3ciLCJobW9ub3NwYWNlIiwiaG9hcm1lbmlhbiIsImhvaGlwdGhhaSIsImhvaGlyYWdhbmEiLCJob2thdGFrYW5hIiwiaG9rYXRha2FuYWhhbGZ3aWR0aCIsImhvbGFtIiwiaG9sYW0xOSIsImhvbGFtMjYiLCJob2xhbTMyIiwiaG9sYW1oZWJyZXciLCJob2xhbW5hcnJvd2hlYnJldyIsImhvbGFtcXVhcnRlcmhlYnJldyIsImhvbGFtd2lkZWhlYnJldyIsImhvbm9raHVrdGhhaSIsImhvb2thYm92ZWNvbWIiLCJob29rY21iIiwiaG9va3BhbGF0YWxpemVkYmVsb3djbWIiLCJob29rcmV0cm9mbGV4YmVsb3djbWIiLCJob29uc3F1YXJlIiwiaG9yaWNvcHRpYyIsImhvcml6b250YWxiYXIiLCJob3JuY21iIiwiaG90c3ByaW5ncyIsImhvdXNlIiwiaHBhcmVuIiwiaHN1cGVyaW9yIiwiaHR1cm5lZCIsImh1aGlyYWdhbmEiLCJodWlpdG9zcXVhcmUiLCJodWthdGFrYW5hIiwiaHVrYXRha2FuYWhhbGZ3aWR0aCIsImh1bmdhcnVtbGF1dCIsImh1bmdhcnVtbGF1dGNtYiIsImh2IiwiaHlwaGVuIiwiaHlwaGVuaW5mZXJpb3IiLCJoeXBoZW5tb25vc3BhY2UiLCJoeXBoZW5zbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiaHlwaGVudHdvIiwiaWFjdXRlIiwiaWFjeXJpbGxpYyIsImliZW5nYWxpIiwiaWJvcG9tb2ZvIiwiaWJyZXZlIiwiaWNhcm9uIiwiaWNpcmNsZSIsImljaXJjdW1mbGV4IiwiaWN5cmlsbGljIiwiaWRibGdyYXZlIiwiaWRlb2dyYXBoZWFydGhjaXJjbGUiLCJpZGVvZ3JhcGhmaXJlY2lyY2xlIiwiaWRlb2dyYXBoaWNhbGxpYW5jZXBhcmVuIiwiaWRlb2dyYXBoaWNjYWxscGFyZW4iLCJpZGVvZ3JhcGhpY2NlbnRyZWNpcmNsZSIsImlkZW9ncmFwaGljY2xvc2UiLCJpZGVvZ3JhcGhpY2NvbW1hIiwiaWRlb2dyYXBoaWNjb21tYWxlZnQiLCJpZGVvZ3JhcGhpY2NvbmdyYXR1bGF0aW9ucGFyZW4iLCJpZGVvZ3JhcGhpY2NvcnJlY3RjaXJjbGUiLCJpZGVvZ3JhcGhpY2VhcnRocGFyZW4iLCJpZGVvZ3JhcGhpY2VudGVycHJpc2VwYXJlbiIsImlkZW9ncmFwaGljZXhjZWxsZW50Y2lyY2xlIiwiaWRlb2dyYXBoaWNmZXN0aXZhbHBhcmVuIiwiaWRlb2dyYXBoaWNmaW5hbmNpYWxjaXJjbGUiLCJpZGVvZ3JhcGhpY2ZpbmFuY2lhbHBhcmVuIiwiaWRlb2dyYXBoaWNmaXJlcGFyZW4iLCJpZGVvZ3JhcGhpY2hhdmVwYXJlbiIsImlkZW9ncmFwaGljaGlnaGNpcmNsZSIsImlkZW9ncmFwaGljaXRlcmF0aW9ubWFyayIsImlkZW9ncmFwaGljbGFib3JjaXJjbGUiLCJpZGVvZ3JhcGhpY2xhYm9ycGFyZW4iLCJpZGVvZ3JhcGhpY2xlZnRjaXJjbGUiLCJpZGVvZ3JhcGhpY2xvd2NpcmNsZSIsImlkZW9ncmFwaGljbWVkaWNpbmVjaXJjbGUiLCJpZGVvZ3JhcGhpY21ldGFscGFyZW4iLCJpZGVvZ3JhcGhpY21vb25wYXJlbiIsImlkZW9ncmFwaGljbmFtZXBhcmVuIiwiaWRlb2dyYXBoaWNwZXJpb2QiLCJpZGVvZ3JhcGhpY3ByaW50Y2lyY2xlIiwiaWRlb2dyYXBoaWNyZWFjaHBhcmVuIiwiaWRlb2dyYXBoaWNyZXByZXNlbnRwYXJlbiIsImlkZW9ncmFwaGljcmVzb3VyY2VwYXJlbiIsImlkZW9ncmFwaGljcmlnaHRjaXJjbGUiLCJpZGVvZ3JhcGhpY3NlY3JldGNpcmNsZSIsImlkZW9ncmFwaGljc2VsZnBhcmVuIiwiaWRlb2dyYXBoaWNzb2NpZXR5cGFyZW4iLCJpZGVvZ3JhcGhpY3NwYWNlIiwiaWRlb2dyYXBoaWNzcGVjaWFscGFyZW4iLCJpZGVvZ3JhcGhpY3N0b2NrcGFyZW4iLCJpZGVvZ3JhcGhpY3N0dWR5cGFyZW4iLCJpZGVvZ3JhcGhpY3N1bnBhcmVuIiwiaWRlb2dyYXBoaWNzdXBlcnZpc2VwYXJlbiIsImlkZW9ncmFwaGljd2F0ZXJwYXJlbiIsImlkZW9ncmFwaGljd29vZHBhcmVuIiwiaWRlb2dyYXBoaWN6ZXJvIiwiaWRlb2dyYXBobWV0YWxjaXJjbGUiLCJpZGVvZ3JhcGhtb29uY2lyY2xlIiwiaWRlb2dyYXBobmFtZWNpcmNsZSIsImlkZW9ncmFwaHN1bmNpcmNsZSIsImlkZW9ncmFwaHdhdGVyY2lyY2xlIiwiaWRlb2dyYXBod29vZGNpcmNsZSIsImlkZXZhIiwiaWRpZXJlc2lzIiwiaWRpZXJlc2lzYWN1dGUiLCJpZGllcmVzaXNjeXJpbGxpYyIsImlkb3RiZWxvdyIsImllYnJldmVjeXJpbGxpYyIsImllY3lyaWxsaWMiLCJpZXVuZ2FjaXJjbGVrb3JlYW4iLCJpZXVuZ2FwYXJlbmtvcmVhbiIsImlldW5nY2lyY2xla29yZWFuIiwiaWV1bmdrb3JlYW4iLCJpZXVuZ3BhcmVua29yZWFuIiwiaWdyYXZlIiwiaWd1amFyYXRpIiwiaWd1cm11a2hpIiwiaWhpcmFnYW5hIiwiaWhvb2thYm92ZSIsImlpYmVuZ2FsaSIsImlpY3lyaWxsaWMiLCJpaWRldmEiLCJpaWd1amFyYXRpIiwiaWlndXJtdWtoaSIsImlpbWF0cmFndXJtdWtoaSIsImlpbnZlcnRlZGJyZXZlIiwiaWlzaG9ydGN5cmlsbGljIiwiaWl2b3dlbHNpZ25iZW5nYWxpIiwiaWl2b3dlbHNpZ25kZXZhIiwiaWl2b3dlbHNpZ25ndWphcmF0aSIsImlqIiwiaWthdGFrYW5hIiwiaWthdGFrYW5haGFsZndpZHRoIiwiaWtvcmVhbiIsImlsZGUiLCJpbHV5aGVicmV3IiwiaW1hY3JvbiIsImltYWNyb25jeXJpbGxpYyIsImltYWdlb3JhcHByb3hpbWF0ZWx5ZXF1YWwiLCJpbWF0cmFndXJtdWtoaSIsImltb25vc3BhY2UiLCJpbmNyZW1lbnQiLCJpbmZpbml0eSIsImluaWFybWVuaWFuIiwiaW50ZWdyYWwiLCJpbnRlZ3JhbGJvdHRvbSIsImludGVncmFsYnQiLCJpbnRlZ3JhbGV4IiwiaW50ZWdyYWx0b3AiLCJpbnRlZ3JhbHRwIiwiaW50ZXJzZWN0aW9uIiwiaW50aXNxdWFyZSIsImludmJ1bGxldCIsImludmNpcmNsZSIsImludnNtaWxlZmFjZSIsImlvY3lyaWxsaWMiLCJpb2dvbmVrIiwiaW90YSIsImlvdGFkaWVyZXNpcyIsImlvdGFkaWVyZXNpc3Rvbm9zIiwiaW90YWxhdGluIiwiaW90YXRvbm9zIiwiaXBhcmVuIiwiaXJpZ3VybXVraGkiLCJpc21hbGxoaXJhZ2FuYSIsImlzbWFsbGthdGFrYW5hIiwiaXNtYWxsa2F0YWthbmFoYWxmd2lkdGgiLCJpc3NoYXJiZW5nYWxpIiwiaXN0cm9rZSIsImlzdXBlcmlvciIsIml0ZXJhdGlvbmhpcmFnYW5hIiwiaXRlcmF0aW9ua2F0YWthbmEiLCJpdGlsZGUiLCJpdGlsZGViZWxvdyIsIml1Ym9wb21vZm8iLCJpdWN5cmlsbGljIiwiaXZvd2Vsc2lnbmJlbmdhbGkiLCJpdm93ZWxzaWduZGV2YSIsIml2b3dlbHNpZ25ndWphcmF0aSIsIml6aGl0c2FjeXJpbGxpYyIsIml6aGl0c2FkYmxncmF2ZWN5cmlsbGljIiwiamFhcm1lbmlhbiIsImphYmVuZ2FsaSIsImphZGV2YSIsImphZ3VqYXJhdGkiLCJqYWd1cm11a2hpIiwiamJvcG9tb2ZvIiwiamNhcm9uIiwiamNpcmNsZSIsImpjaXJjdW1mbGV4IiwiamNyb3NzZWR0YWlsIiwiamRvdGxlc3NzdHJva2UiLCJqZWN5cmlsbGljIiwiamVlbWFyYWJpYyIsImplZW1maW5hbGFyYWJpYyIsImplZW1pbml0aWFsYXJhYmljIiwiamVlbW1lZGlhbGFyYWJpYyIsImplaGFyYWJpYyIsImplaGZpbmFsYXJhYmljIiwiamhhYmVuZ2FsaSIsImpoYWRldmEiLCJqaGFndWphcmF0aSIsImpoYWd1cm11a2hpIiwiamhlaGFybWVuaWFuIiwiamlzIiwiam1vbm9zcGFjZSIsImpwYXJlbiIsImpzdXBlcmlvciIsImthYmFzaGtpcmN5cmlsbGljIiwia2FiZW5nYWxpIiwia2FjdXRlIiwia2FjeXJpbGxpYyIsImthZGVzY2VuZGVyY3lyaWxsaWMiLCJrYWRldmEiLCJrYWYiLCJrYWZhcmFiaWMiLCJrYWZkYWdlc2giLCJrYWZkYWdlc2hoZWJyZXciLCJrYWZmaW5hbGFyYWJpYyIsImthZmhlYnJldyIsImthZmluaXRpYWxhcmFiaWMiLCJrYWZtZWRpYWxhcmFiaWMiLCJrYWZyYWZlaGVicmV3Iiwia2FndWphcmF0aSIsImthZ3VybXVraGkiLCJrYWhpcmFnYW5hIiwia2Fob29rY3lyaWxsaWMiLCJrYWthdGFrYW5hIiwia2FrYXRha2FuYWhhbGZ3aWR0aCIsImthcHBhIiwia2FwcGFzeW1ib2xncmVlayIsImthcHllb3VubWlldW1rb3JlYW4iLCJrYXB5ZW91bnBoaWV1cGhrb3JlYW4iLCJrYXB5ZW91bnBpZXVwa29yZWFuIiwia2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuIiwia2Fyb3JpaXNxdWFyZSIsImthc2hpZGFhdXRvYXJhYmljIiwia2FzaGlkYWF1dG9ub3NpZGViZWFyaW5nYXJhYmljIiwia2FzbWFsbGthdGFrYW5hIiwia2FzcXVhcmUiLCJrYXNyYWFyYWJpYyIsImthc3JhdGFuYXJhYmljIiwia2FzdHJva2VjeXJpbGxpYyIsImthdGFoaXJhcHJvbG9uZ21hcmtoYWxmd2lkdGgiLCJrYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMiLCJrYm9wb21vZm8iLCJrY2Fsc3F1YXJlIiwia2Nhcm9uIiwia2NlZGlsbGEiLCJrY2lyY2xlIiwia2NvbW1hYWNjZW50Iiwia2RvdGJlbG93Iiwia2VoYXJtZW5pYW4iLCJrZWhpcmFnYW5hIiwia2VrYXRha2FuYSIsImtla2F0YWthbmFoYWxmd2lkdGgiLCJrZW5hcm1lbmlhbiIsImtlc21hbGxrYXRha2FuYSIsImtncmVlbmxhbmRpYyIsImtoYWJlbmdhbGkiLCJraGFjeXJpbGxpYyIsImtoYWRldmEiLCJraGFndWphcmF0aSIsImtoYWd1cm11a2hpIiwia2hhaGFyYWJpYyIsImtoYWhmaW5hbGFyYWJpYyIsImtoYWhpbml0aWFsYXJhYmljIiwia2hhaG1lZGlhbGFyYWJpYyIsImtoZWljb3B0aWMiLCJraGhhZGV2YSIsImtoaGFndXJtdWtoaSIsImtoaWV1a2hhY2lyY2xla29yZWFuIiwia2hpZXVraGFwYXJlbmtvcmVhbiIsImtoaWV1a2hjaXJjbGVrb3JlYW4iLCJraGlldWtoa29yZWFuIiwia2hpZXVraHBhcmVua29yZWFuIiwia2hva2hhaXRoYWkiLCJraG9raG9udGhhaSIsImtob2todWF0dGhhaSIsImtob2tod2FpdGhhaSIsImtob211dHRoYWkiLCJraG9vayIsImtob3Jha2hhbmd0aGFpIiwia2h6c3F1YXJlIiwia2loaXJhZ2FuYSIsImtpa2F0YWthbmEiLCJraWthdGFrYW5haGFsZndpZHRoIiwia2lyb2d1cmFtdXNxdWFyZSIsImtpcm9tZWV0b3J1c3F1YXJlIiwia2lyb3NxdWFyZSIsImtpeWVva2FjaXJjbGVrb3JlYW4iLCJraXllb2thcGFyZW5rb3JlYW4iLCJraXllb2tjaXJjbGVrb3JlYW4iLCJraXllb2trb3JlYW4iLCJraXllb2twYXJlbmtvcmVhbiIsImtpeWVva3Npb3Nrb3JlYW4iLCJramVjeXJpbGxpYyIsImtsaW5lYmVsb3ciLCJrbHNxdWFyZSIsImttY3ViZWRzcXVhcmUiLCJrbW9ub3NwYWNlIiwia21zcXVhcmVkc3F1YXJlIiwia29oaXJhZ2FuYSIsImtvaG1zcXVhcmUiLCJrb2thaXRoYWkiLCJrb2thdGFrYW5hIiwia29rYXRha2FuYWhhbGZ3aWR0aCIsImtvb3Bvc3F1YXJlIiwia29wcGFjeXJpbGxpYyIsImtvcmVhbnN0YW5kYXJkc3ltYm9sIiwia29yb25pc2NtYiIsImtwYXJlbiIsImtwYXNxdWFyZSIsImtzaWN5cmlsbGljIiwia3RzcXVhcmUiLCJrdHVybmVkIiwia3VoaXJhZ2FuYSIsImt1a2F0YWthbmEiLCJrdWthdGFrYW5haGFsZndpZHRoIiwia3ZzcXVhcmUiLCJrd3NxdWFyZSIsImxhYmVuZ2FsaSIsImxhY3V0ZSIsImxhZGV2YSIsImxhZ3VqYXJhdGkiLCJsYWd1cm11a2hpIiwibGFra2hhbmd5YW90aGFpIiwibGFtYWxlZmZpbmFsYXJhYmljIiwibGFtYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyIsImxhbWFsZWZoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWMiLCJsYW1hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljIiwibGFtYWxlZmhhbXphYmVsb3dpc29sYXRlZGFyYWJpYyIsImxhbWFsZWZpc29sYXRlZGFyYWJpYyIsImxhbWFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMiLCJsYW1hbGVmbWFkZGFhYm92ZWlzb2xhdGVkYXJhYmljIiwibGFtYXJhYmljIiwibGFtYmRhIiwibGFtYmRhc3Ryb2tlIiwibGFtZWQiLCJsYW1lZGRhZ2VzaCIsImxhbWVkZGFnZXNoaGVicmV3IiwibGFtZWRoZWJyZXciLCJsYW1maW5hbGFyYWJpYyIsImxhbWhhaGluaXRpYWxhcmFiaWMiLCJsYW1pbml0aWFsYXJhYmljIiwibGFtamVlbWluaXRpYWxhcmFiaWMiLCJsYW1raGFoaW5pdGlhbGFyYWJpYyIsImxhbWxhbWhlaGlzb2xhdGVkYXJhYmljIiwibGFtbWVkaWFsYXJhYmljIiwibGFtbWVlbWhhaGluaXRpYWxhcmFiaWMiLCJsYW1tZWVtaW5pdGlhbGFyYWJpYyIsImxhcmdlY2lyY2xlIiwibGJhciIsImxiZWx0IiwibGJvcG9tb2ZvIiwibGNhcm9uIiwibGNlZGlsbGEiLCJsY2lyY2xlIiwibGNpcmN1bWZsZXhiZWxvdyIsImxjb21tYWFjY2VudCIsImxkb3QiLCJsZG90YWNjZW50IiwibGRvdGJlbG93IiwibGRvdGJlbG93bWFjcm9uIiwibGVmdGFuZ2xlYWJvdmVjbWIiLCJsZWZ0dGFja2JlbG93Y21iIiwibGVzcyIsImxlc3NlcXVhbCIsImxlc3NlcXVhbG9yZ3JlYXRlciIsImxlc3Ntb25vc3BhY2UiLCJsZXNzb3JlcXVpdmFsZW50IiwibGVzc29yZ3JlYXRlciIsImxlc3NvdmVyZXF1YWwiLCJsZXNzc21hbGwiLCJsZXpoIiwibGZibG9jayIsImxob29rcmV0cm9mbGV4IiwibGlyYSIsImxpd25hcm1lbmlhbiIsImxqIiwibGplY3lyaWxsaWMiLCJsbGFkZXZhIiwibGxhZ3VqYXJhdGkiLCJsbGluZWJlbG93IiwibGxsYWRldmEiLCJsbHZvY2FsaWNiZW5nYWxpIiwibGx2b2NhbGljZGV2YSIsImxsdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkiLCJsbHZvY2FsaWN2b3dlbHNpZ25kZXZhIiwibG1pZGRsZXRpbGRlIiwibG1vbm9zcGFjZSIsImxtc3F1YXJlIiwibG9jaHVsYXRoYWkiLCJsb2dpY2FsYW5kIiwibG9naWNhbG5vdCIsImxvZ2ljYWxub3RyZXZlcnNlZCIsImxvZ2ljYWxvciIsImxvbGluZ3RoYWkiLCJsb25ncyIsImxvd2xpbmVjZW50ZXJsaW5lIiwibG93bGluZWNtYiIsImxvd2xpbmVkYXNoZWQiLCJsb3plbmdlIiwibHBhcmVuIiwibHNsYXNoIiwibHNxdWFyZSIsImxzdXBlcmlvciIsImx0c2hhZGUiLCJsdXRoYWkiLCJsdm9jYWxpY2JlbmdhbGkiLCJsdm9jYWxpY2RldmEiLCJsdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkiLCJsdm9jYWxpY3Zvd2Vsc2lnbmRldmEiLCJseHNxdWFyZSIsIm1hYmVuZ2FsaSIsIm1hY3JvbiIsIm1hY3JvbmJlbG93Y21iIiwibWFjcm9uY21iIiwibWFjcm9ubG93bW9kIiwibWFjcm9ubW9ub3NwYWNlIiwibWFjdXRlIiwibWFkZXZhIiwibWFndWphcmF0aSIsIm1hZ3VybXVraGkiLCJtYWhhcGFraGhlYnJldyIsIm1haGFwYWtobGVmdGhlYnJldyIsIm1haGlyYWdhbmEiLCJtYWljaGF0dGF3YWxvd2xlZnR0aGFpIiwibWFpY2hhdHRhd2Fsb3dyaWdodHRoYWkiLCJtYWljaGF0dGF3YXRoYWkiLCJtYWljaGF0dGF3YXVwcGVybGVmdHRoYWkiLCJtYWlla2xvd2xlZnR0aGFpIiwibWFpZWtsb3dyaWdodHRoYWkiLCJtYWlla3RoYWkiLCJtYWlla3VwcGVybGVmdHRoYWkiLCJtYWloYW5ha2F0bGVmdHRoYWkiLCJtYWloYW5ha2F0dGhhaSIsIm1haXRhaWtodWxlZnR0aGFpIiwibWFpdGFpa2h1dGhhaSIsIm1haXRob2xvd2xlZnR0aGFpIiwibWFpdGhvbG93cmlnaHR0aGFpIiwibWFpdGhvdGhhaSIsIm1haXRob3VwcGVybGVmdHRoYWkiLCJtYWl0cmlsb3dsZWZ0dGhhaSIsIm1haXRyaWxvd3JpZ2h0dGhhaSIsIm1haXRyaXRoYWkiLCJtYWl0cml1cHBlcmxlZnR0aGFpIiwibWFpeWFtb2t0aGFpIiwibWFrYXRha2FuYSIsIm1ha2F0YWthbmFoYWxmd2lkdGgiLCJtYWxlIiwibWFuc3lvbnNxdWFyZSIsIm1hcWFmaGVicmV3IiwibWFycyIsIm1hc29yYWNpcmNsZWhlYnJldyIsIm1hc3F1YXJlIiwibWJvcG9tb2ZvIiwibWJzcXVhcmUiLCJtY2lyY2xlIiwibWN1YmVkc3F1YXJlIiwibWRvdGFjY2VudCIsIm1kb3RiZWxvdyIsIm1lZW1hcmFiaWMiLCJtZWVtZmluYWxhcmFiaWMiLCJtZWVtaW5pdGlhbGFyYWJpYyIsIm1lZW1tZWRpYWxhcmFiaWMiLCJtZWVtbWVlbWluaXRpYWxhcmFiaWMiLCJtZWVtbWVlbWlzb2xhdGVkYXJhYmljIiwibWVldG9ydXNxdWFyZSIsIm1laGlyYWdhbmEiLCJtZWl6aWVyYXNxdWFyZSIsIm1la2F0YWthbmEiLCJtZWthdGFrYW5haGFsZndpZHRoIiwibWVtIiwibWVtZGFnZXNoIiwibWVtZGFnZXNoaGVicmV3IiwibWVtaGVicmV3IiwibWVuYXJtZW5pYW4iLCJtZXJraGFoZWJyZXciLCJtZXJraGFrZWZ1bGFoZWJyZXciLCJtZXJraGFrZWZ1bGFsZWZ0aGVicmV3IiwibWVya2hhbGVmdGhlYnJldyIsIm1ob29rIiwibWh6c3F1YXJlIiwibWlkZGxlZG90a2F0YWthbmFoYWxmd2lkdGgiLCJtaWRkb3QiLCJtaWV1bWFjaXJjbGVrb3JlYW4iLCJtaWV1bWFwYXJlbmtvcmVhbiIsIm1pZXVtY2lyY2xla29yZWFuIiwibWlldW1rb3JlYW4iLCJtaWV1bXBhbnNpb3Nrb3JlYW4iLCJtaWV1bXBhcmVua29yZWFuIiwibWlldW1waWV1cGtvcmVhbiIsIm1pZXVtc2lvc2tvcmVhbiIsIm1paGlyYWdhbmEiLCJtaWthdGFrYW5hIiwibWlrYXRha2FuYWhhbGZ3aWR0aCIsIm1pbnVzIiwibWludXNiZWxvd2NtYiIsIm1pbnVzY2lyY2xlIiwibWludXNtb2QiLCJtaW51c3BsdXMiLCJtaW51dGUiLCJtaXJpYmFhcnVzcXVhcmUiLCJtaXJpc3F1YXJlIiwibWxvbmdsZWd0dXJuZWQiLCJtbHNxdWFyZSIsIm1tY3ViZWRzcXVhcmUiLCJtbW9ub3NwYWNlIiwibW1zcXVhcmVkc3F1YXJlIiwibW9oaXJhZ2FuYSIsIm1vaG1zcXVhcmUiLCJtb2thdGFrYW5hIiwibW9rYXRha2FuYWhhbGZ3aWR0aCIsIm1vbHNxdWFyZSIsIm1vbWF0aGFpIiwibW92ZXJzc3F1YXJlIiwibW92ZXJzc3F1YXJlZHNxdWFyZSIsIm1wYXJlbiIsIm1wYXNxdWFyZSIsIm1zc3F1YXJlIiwibXN1cGVyaW9yIiwibXR1cm5lZCIsIm11MSIsIm11YXNxdWFyZSIsIm11Y2hncmVhdGVyIiwibXVjaGxlc3MiLCJtdWZzcXVhcmUiLCJtdWdyZWVrIiwibXVnc3F1YXJlIiwibXVoaXJhZ2FuYSIsIm11a2F0YWthbmEiLCJtdWthdGFrYW5haGFsZndpZHRoIiwibXVsc3F1YXJlIiwibXVsdGlwbHkiLCJtdW1zcXVhcmUiLCJtdW5haGhlYnJldyIsIm11bmFobGVmdGhlYnJldyIsIm11c2ljYWxub3RlIiwibXVzaWNhbG5vdGVkYmwiLCJtdXNpY2ZsYXRzaWduIiwibXVzaWNzaGFycHNpZ24iLCJtdXNzcXVhcmUiLCJtdXZzcXVhcmUiLCJtdXdzcXVhcmUiLCJtdm1lZ2FzcXVhcmUiLCJtdnNxdWFyZSIsIm13bWVnYXNxdWFyZSIsIm13c3F1YXJlIiwibmFiZW5nYWxpIiwibmFibGEiLCJuYWN1dGUiLCJuYWRldmEiLCJuYWd1amFyYXRpIiwibmFndXJtdWtoaSIsIm5haGlyYWdhbmEiLCJuYWthdGFrYW5hIiwibmFrYXRha2FuYWhhbGZ3aWR0aCIsIm5hcG9zdHJvcGhlIiwibmFzcXVhcmUiLCJuYm9wb21vZm8iLCJuYnNwYWNlIiwibmNhcm9uIiwibmNlZGlsbGEiLCJuY2lyY2xlIiwibmNpcmN1bWZsZXhiZWxvdyIsIm5jb21tYWFjY2VudCIsIm5kb3RhY2NlbnQiLCJuZG90YmVsb3ciLCJuZWhpcmFnYW5hIiwibmVrYXRha2FuYSIsIm5la2F0YWthbmFoYWxmd2lkdGgiLCJuZXdzaGVxZWxzaWduIiwibmZzcXVhcmUiLCJuZ2FiZW5nYWxpIiwibmdhZGV2YSIsIm5nYWd1amFyYXRpIiwibmdhZ3VybXVraGkiLCJuZ29uZ3V0aGFpIiwibmhpcmFnYW5hIiwibmhvb2tsZWZ0Iiwibmhvb2tyZXRyb2ZsZXgiLCJuaWV1bmFjaXJjbGVrb3JlYW4iLCJuaWV1bmFwYXJlbmtvcmVhbiIsIm5pZXVuY2lldWNrb3JlYW4iLCJuaWV1bmNpcmNsZWtvcmVhbiIsIm5pZXVuaGlldWhrb3JlYW4iLCJuaWV1bmtvcmVhbiIsIm5pZXVucGFuc2lvc2tvcmVhbiIsIm5pZXVucGFyZW5rb3JlYW4iLCJuaWV1bnNpb3Nrb3JlYW4iLCJuaWV1bnRpa2V1dGtvcmVhbiIsIm5paGlyYWdhbmEiLCJuaWthdGFrYW5hIiwibmlrYXRha2FuYWhhbGZ3aWR0aCIsIm5pa2hhaGl0bGVmdHRoYWkiLCJuaWtoYWhpdHRoYWkiLCJuaW5lIiwibmluZWFyYWJpYyIsIm5pbmViZW5nYWxpIiwibmluZWNpcmNsZSIsIm5pbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmIiwibmluZWRldmEiLCJuaW5lZ3VqYXJhdGkiLCJuaW5lZ3VybXVraGkiLCJuaW5laGFja2FyYWJpYyIsIm5pbmVoYW5nemhvdSIsIm5pbmVpZGVvZ3JhcGhpY3BhcmVuIiwibmluZWluZmVyaW9yIiwibmluZW1vbm9zcGFjZSIsIm5pbmVvbGRzdHlsZSIsIm5pbmVwYXJlbiIsIm5pbmVwZXJpb2QiLCJuaW5lcGVyc2lhbiIsIm5pbmVyb21hbiIsIm5pbmVzdXBlcmlvciIsIm5pbmV0ZWVuY2lyY2xlIiwibmluZXRlZW5wYXJlbiIsIm5pbmV0ZWVucGVyaW9kIiwibmluZXRoYWkiLCJuaiIsIm5qZWN5cmlsbGljIiwibmthdGFrYW5hIiwibmthdGFrYW5haGFsZndpZHRoIiwibmxlZ3JpZ2h0bG9uZyIsIm5saW5lYmVsb3ciLCJubW9ub3NwYWNlIiwibm1zcXVhcmUiLCJubmFiZW5nYWxpIiwibm5hZGV2YSIsIm5uYWd1amFyYXRpIiwibm5hZ3VybXVraGkiLCJubm5hZGV2YSIsIm5vaGlyYWdhbmEiLCJub2thdGFrYW5hIiwibm9rYXRha2FuYWhhbGZ3aWR0aCIsIm5vbmJyZWFraW5nc3BhY2UiLCJub25lbnRoYWkiLCJub251dGhhaSIsIm5vb25hcmFiaWMiLCJub29uZmluYWxhcmFiaWMiLCJub29uZ2h1bm5hYXJhYmljIiwibm9vbmdodW5uYWZpbmFsYXJhYmljIiwibm9vbmluaXRpYWxhcmFiaWMiLCJub29uamVlbWluaXRpYWxhcmFiaWMiLCJub29uamVlbWlzb2xhdGVkYXJhYmljIiwibm9vbm1lZGlhbGFyYWJpYyIsIm5vb25tZWVtaW5pdGlhbGFyYWJpYyIsIm5vb25tZWVtaXNvbGF0ZWRhcmFiaWMiLCJub29ubm9vbmZpbmFsYXJhYmljIiwibm90Y29udGFpbnMiLCJub3RlbGVtZW50Iiwibm90ZWxlbWVudG9mIiwibm90ZXF1YWwiLCJub3RncmVhdGVyIiwibm90Z3JlYXRlcm5vcmVxdWFsIiwibm90Z3JlYXRlcm5vcmxlc3MiLCJub3RpZGVudGljYWwiLCJub3RsZXNzIiwibm90bGVzc25vcmVxdWFsIiwibm90cGFyYWxsZWwiLCJub3RwcmVjZWRlcyIsIm5vdHN1YnNldCIsIm5vdHN1Y2NlZWRzIiwibm90c3VwZXJzZXQiLCJub3dhcm1lbmlhbiIsIm5wYXJlbiIsIm5zc3F1YXJlIiwibnN1cGVyaW9yIiwibnRpbGRlIiwibnUiLCJudWhpcmFnYW5hIiwibnVrYXRha2FuYSIsIm51a2F0YWthbmFoYWxmd2lkdGgiLCJudWt0YWJlbmdhbGkiLCJudWt0YWRldmEiLCJudWt0YWd1amFyYXRpIiwibnVrdGFndXJtdWtoaSIsIm51bWJlcnNpZ24iLCJudW1iZXJzaWdubW9ub3NwYWNlIiwibnVtYmVyc2lnbnNtYWxsIiwibnVtZXJhbHNpZ25ncmVlayIsIm51bWVyYWxzaWdubG93ZXJncmVlayIsIm51bWVybyIsIm51biIsIm51bmRhZ2VzaCIsIm51bmRhZ2VzaGhlYnJldyIsIm51bmhlYnJldyIsIm52c3F1YXJlIiwibndzcXVhcmUiLCJueWFiZW5nYWxpIiwibnlhZGV2YSIsIm55YWd1amFyYXRpIiwibnlhZ3VybXVraGkiLCJvIiwib2FjdXRlIiwib2FuZ3RoYWkiLCJvYmFycmVkIiwib2JhcnJlZGN5cmlsbGljIiwib2JhcnJlZGRpZXJlc2lzY3lyaWxsaWMiLCJvYmVuZ2FsaSIsIm9ib3BvbW9mbyIsIm9icmV2ZSIsIm9jYW5kcmFkZXZhIiwib2NhbmRyYWd1amFyYXRpIiwib2NhbmRyYXZvd2Vsc2lnbmRldmEiLCJvY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkiLCJvY2Fyb24iLCJvY2lyY2xlIiwib2NpcmN1bWZsZXgiLCJvY2lyY3VtZmxleGFjdXRlIiwib2NpcmN1bWZsZXhkb3RiZWxvdyIsIm9jaXJjdW1mbGV4Z3JhdmUiLCJvY2lyY3VtZmxleGhvb2thYm92ZSIsIm9jaXJjdW1mbGV4dGlsZGUiLCJvY3lyaWxsaWMiLCJvZGJsYWN1dGUiLCJvZGJsZ3JhdmUiLCJvZGV2YSIsIm9kaWVyZXNpcyIsIm9kaWVyZXNpc2N5cmlsbGljIiwib2RvdGJlbG93Iiwib2UiLCJvZWtvcmVhbiIsIm9nb25layIsIm9nb25la2NtYiIsIm9ncmF2ZSIsIm9ndWphcmF0aSIsIm9oYXJtZW5pYW4iLCJvaGlyYWdhbmEiLCJvaG9va2Fib3ZlIiwib2hvcm4iLCJvaG9ybmFjdXRlIiwib2hvcm5kb3RiZWxvdyIsIm9ob3JuZ3JhdmUiLCJvaG9ybmhvb2thYm92ZSIsIm9ob3JudGlsZGUiLCJvaHVuZ2FydW1sYXV0Iiwib2kiLCJvaW52ZXJ0ZWRicmV2ZSIsIm9rYXRha2FuYSIsIm9rYXRha2FuYWhhbGZ3aWR0aCIsIm9rb3JlYW4iLCJvbGVoZWJyZXciLCJvbWFjcm9uIiwib21hY3JvbmFjdXRlIiwib21hY3JvbmdyYXZlIiwib21kZXZhIiwib21lZ2EiLCJvbWVnYTEiLCJvbWVnYWN5cmlsbGljIiwib21lZ2FsYXRpbmNsb3NlZCIsIm9tZWdhcm91bmRjeXJpbGxpYyIsIm9tZWdhdGl0bG9jeXJpbGxpYyIsIm9tZWdhdG9ub3MiLCJvbWd1amFyYXRpIiwib21pY3JvbiIsIm9taWNyb250b25vcyIsIm9tb25vc3BhY2UiLCJvbmUiLCJvbmVhcmFiaWMiLCJvbmViZW5nYWxpIiwib25lY2lyY2xlIiwib25lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiIsIm9uZWRldmEiLCJvbmVkb3RlbmxlYWRlciIsIm9uZWVpZ2h0aCIsIm9uZWZpdHRlZCIsIm9uZWd1amFyYXRpIiwib25lZ3VybXVraGkiLCJvbmVoYWNrYXJhYmljIiwib25laGFsZiIsIm9uZWhhbmd6aG91Iiwib25laWRlb2dyYXBoaWNwYXJlbiIsIm9uZWluZmVyaW9yIiwib25lbW9ub3NwYWNlIiwib25lbnVtZXJhdG9yYmVuZ2FsaSIsIm9uZW9sZHN0eWxlIiwib25lcGFyZW4iLCJvbmVwZXJpb2QiLCJvbmVwZXJzaWFuIiwib25lcXVhcnRlciIsIm9uZXJvbWFuIiwib25lc3VwZXJpb3IiLCJvbmV0aGFpIiwib25ldGhpcmQiLCJvb2dvbmVrIiwib29nb25la21hY3JvbiIsIm9vZ3VybXVraGkiLCJvb21hdHJhZ3VybXVraGkiLCJvb3BlbiIsIm9wYXJlbiIsIm9wZW5idWxsZXQiLCJvcmRmZW1pbmluZSIsIm9yZG1hc2N1bGluZSIsIm9ydGhvZ29uYWwiLCJvc2hvcnRkZXZhIiwib3Nob3J0dm93ZWxzaWduZGV2YSIsIm9zbGFzaCIsIm9zbGFzaGFjdXRlIiwib3NtYWxsaGlyYWdhbmEiLCJvc21hbGxrYXRha2FuYSIsIm9zbWFsbGthdGFrYW5haGFsZndpZHRoIiwib3N0cm9rZWFjdXRlIiwib3N1cGVyaW9yIiwib3RjeXJpbGxpYyIsIm90aWxkZSIsIm90aWxkZWFjdXRlIiwib3RpbGRlZGllcmVzaXMiLCJvdWJvcG9tb2ZvIiwib3ZlcmxpbmUiLCJvdmVybGluZWNlbnRlcmxpbmUiLCJvdmVybGluZWNtYiIsIm92ZXJsaW5lZGFzaGVkIiwib3ZlcmxpbmVkYmx3YXZ5Iiwib3ZlcmxpbmV3YXZ5Iiwib3ZlcnNjb3JlIiwib3Zvd2Vsc2lnbmJlbmdhbGkiLCJvdm93ZWxzaWduZGV2YSIsIm92b3dlbHNpZ25ndWphcmF0aSIsInBhYW1wc3NxdWFyZSIsInBhYXNlbnRvc3F1YXJlIiwicGFiZW5nYWxpIiwicGFjdXRlIiwicGFkZXZhIiwicGFnZWRvd24iLCJwYWdldXAiLCJwYWd1amFyYXRpIiwicGFndXJtdWtoaSIsInBhaGlyYWdhbmEiLCJwYWl5YW5ub2l0aGFpIiwicGFrYXRha2FuYSIsInBhbGF0YWxpemF0aW9uY3lyaWxsaWNjbWIiLCJwYWxvY2hrYWN5cmlsbGljIiwicGFuc2lvc2tvcmVhbiIsInBhcmFncmFwaCIsInBhcmFsbGVsIiwicGFyZW5sZWZ0IiwicGFyZW5sZWZ0YWx0b25lYXJhYmljIiwicGFyZW5sZWZ0YnQiLCJwYXJlbmxlZnRleCIsInBhcmVubGVmdGluZmVyaW9yIiwicGFyZW5sZWZ0bW9ub3NwYWNlIiwicGFyZW5sZWZ0c21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVubGVmdHRwIiwicGFyZW5sZWZ0dmVydGljYWwiLCJwYXJlbnJpZ2h0IiwicGFyZW5yaWdodGFsdG9uZWFyYWJpYyIsInBhcmVucmlnaHRidCIsInBhcmVucmlnaHRleCIsInBhcmVucmlnaHRpbmZlcmlvciIsInBhcmVucmlnaHRtb25vc3BhY2UiLCJwYXJlbnJpZ2h0c21hbGwiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0dHAiLCJwYXJlbnJpZ2h0dmVydGljYWwiLCJwYXJ0aWFsZGlmZiIsInBhc2VxaGVicmV3IiwicGFzaHRhaGVicmV3IiwicGFzcXVhcmUiLCJwYXRhaCIsInBhdGFoMTEiLCJwYXRhaDFkIiwicGF0YWgyYSIsInBhdGFoaGVicmV3IiwicGF0YWhuYXJyb3doZWJyZXciLCJwYXRhaHF1YXJ0ZXJoZWJyZXciLCJwYXRhaHdpZGVoZWJyZXciLCJwYXplcmhlYnJldyIsInBib3BvbW9mbyIsInBjaXJjbGUiLCJwZG90YWNjZW50IiwicGUiLCJwZWN5cmlsbGljIiwicGVkYWdlc2giLCJwZWRhZ2VzaGhlYnJldyIsInBlZXppc3F1YXJlIiwicGVmaW5hbGRhZ2VzaGhlYnJldyIsInBlaGFyYWJpYyIsInBlaGFybWVuaWFuIiwicGVoZWJyZXciLCJwZWhmaW5hbGFyYWJpYyIsInBlaGluaXRpYWxhcmFiaWMiLCJwZWhpcmFnYW5hIiwicGVobWVkaWFsYXJhYmljIiwicGVrYXRha2FuYSIsInBlbWlkZGxlaG9va2N5cmlsbGljIiwicGVyYWZlaGVicmV3IiwicGVyY2VudCIsInBlcmNlbnRhcmFiaWMiLCJwZXJjZW50bW9ub3NwYWNlIiwicGVyY2VudHNtYWxsIiwicGVyaW9kIiwicGVyaW9kYXJtZW5pYW4iLCJwZXJpb2RjZW50ZXJlZCIsInBlcmlvZGhhbGZ3aWR0aCIsInBlcmlvZGluZmVyaW9yIiwicGVyaW9kbW9ub3NwYWNlIiwicGVyaW9kc21hbGwiLCJwZXJpb2RzdXBlcmlvciIsInBlcmlzcG9tZW5pZ3JlZWtjbWIiLCJwZXJwZW5kaWN1bGFyIiwicGVydGhvdXNhbmQiLCJwZXNldGEiLCJwZnNxdWFyZSIsInBoYWJlbmdhbGkiLCJwaGFkZXZhIiwicGhhZ3VqYXJhdGkiLCJwaGFndXJtdWtoaSIsInBoaSIsInBoaTEiLCJwaGlldXBoYWNpcmNsZWtvcmVhbiIsInBoaWV1cGhhcGFyZW5rb3JlYW4iLCJwaGlldXBoY2lyY2xla29yZWFuIiwicGhpZXVwaGtvcmVhbiIsInBoaWV1cGhwYXJlbmtvcmVhbiIsInBoaWxhdGluIiwicGhpbnRodXRoYWkiLCJwaGlzeW1ib2xncmVlayIsInBob29rIiwicGhvcGhhbnRoYWkiLCJwaG9waHVuZ3RoYWkiLCJwaG9zYW1waGFvdGhhaSIsInBpZXVwYWNpcmNsZWtvcmVhbiIsInBpZXVwYXBhcmVua29yZWFuIiwicGlldXBjaWV1Y2tvcmVhbiIsInBpZXVwY2lyY2xla29yZWFuIiwicGlldXBraXllb2trb3JlYW4iLCJwaWV1cGtvcmVhbiIsInBpZXVwcGFyZW5rb3JlYW4iLCJwaWV1cHNpb3NraXllb2trb3JlYW4iLCJwaWV1cHNpb3Nrb3JlYW4iLCJwaWV1cHNpb3N0aWtldXRrb3JlYW4iLCJwaWV1cHRoaWV1dGhrb3JlYW4iLCJwaWV1cHRpa2V1dGtvcmVhbiIsInBpaGlyYWdhbmEiLCJwaWthdGFrYW5hIiwicGlzeW1ib2xncmVlayIsInBpd3Jhcm1lbmlhbiIsInBsdXMiLCJwbHVzYmVsb3djbWIiLCJwbHVzY2lyY2xlIiwicGx1c21pbnVzIiwicGx1c21vZCIsInBsdXNtb25vc3BhY2UiLCJwbHVzc21hbGwiLCJwbHVzc3VwZXJpb3IiLCJwbW9ub3NwYWNlIiwicG1zcXVhcmUiLCJwb2hpcmFnYW5hIiwicG9pbnRpbmdpbmRleGRvd253aGl0ZSIsInBvaW50aW5naW5kZXhsZWZ0d2hpdGUiLCJwb2ludGluZ2luZGV4cmlnaHR3aGl0ZSIsInBvaW50aW5naW5kZXh1cHdoaXRlIiwicG9rYXRha2FuYSIsInBvcGxhdGhhaSIsInBvc3RhbG1hcmsiLCJwb3N0YWxtYXJrZmFjZSIsInBwYXJlbiIsInByZWNlZGVzIiwicHJlc2NyaXB0aW9uIiwicHJpbWVtb2QiLCJwcmltZXJldmVyc2VkIiwicHJvZHVjdCIsInByb2plY3RpdmUiLCJwcm9sb25nZWRrYW5hIiwicHJvcGVsbG9yIiwicHJvcGVyc3Vic2V0IiwicHJvcGVyc3VwZXJzZXQiLCJwcm9wb3J0aW9uIiwicHJvcG9ydGlvbmFsIiwicHNpIiwicHNpY3lyaWxsaWMiLCJwc2lsaXBuZXVtYXRhY3lyaWxsaWNjbWIiLCJwc3NxdWFyZSIsInB1aGlyYWdhbmEiLCJwdWthdGFrYW5hIiwicHZzcXVhcmUiLCJwd3NxdWFyZSIsInFhZGV2YSIsInFhZG1haGVicmV3IiwicWFmYXJhYmljIiwicWFmZmluYWxhcmFiaWMiLCJxYWZpbml0aWFsYXJhYmljIiwicWFmbWVkaWFsYXJhYmljIiwicWFtYXRzIiwicWFtYXRzMTAiLCJxYW1hdHMxYSIsInFhbWF0czFjIiwicWFtYXRzMjciLCJxYW1hdHMyOSIsInFhbWF0czMzIiwicWFtYXRzZGUiLCJxYW1hdHNoZWJyZXciLCJxYW1hdHNuYXJyb3doZWJyZXciLCJxYW1hdHNxYXRhbmhlYnJldyIsInFhbWF0c3FhdGFubmFycm93aGVicmV3IiwicWFtYXRzcWF0YW5xdWFydGVyaGVicmV3IiwicWFtYXRzcWF0YW53aWRlaGVicmV3IiwicWFtYXRzcXVhcnRlcmhlYnJldyIsInFhbWF0c3dpZGVoZWJyZXciLCJxYXJuZXlwYXJhaGVicmV3IiwicWJvcG9tb2ZvIiwicWNpcmNsZSIsInFob29rIiwicW1vbm9zcGFjZSIsInFvZiIsInFvZmRhZ2VzaCIsInFvZmRhZ2VzaGhlYnJldyIsInFvZmhlYnJldyIsInFwYXJlbiIsInF1YXJ0ZXJub3RlIiwicXVidXRzIiwicXVidXRzMTgiLCJxdWJ1dHMyNSIsInF1YnV0czMxIiwicXVidXRzaGVicmV3IiwicXVidXRzbmFycm93aGVicmV3IiwicXVidXRzcXVhcnRlcmhlYnJldyIsInF1YnV0c3dpZGVoZWJyZXciLCJxdWVzdGlvbiIsInF1ZXN0aW9uYXJhYmljIiwicXVlc3Rpb25hcm1lbmlhbiIsInF1ZXN0aW9uZG93biIsInF1ZXN0aW9uZG93bnNtYWxsIiwicXVlc3Rpb25ncmVlayIsInF1ZXN0aW9ubW9ub3NwYWNlIiwicXVlc3Rpb25zbWFsbCIsInF1b3RlZGJsIiwicXVvdGVkYmxiYXNlIiwicXVvdGVkYmxsZWZ0IiwicXVvdGVkYmxtb25vc3BhY2UiLCJxdW90ZWRibHByaW1lIiwicXVvdGVkYmxwcmltZXJldmVyc2VkIiwicXVvdGVkYmxyaWdodCIsInF1b3RlbGVmdCIsInF1b3RlbGVmdHJldmVyc2VkIiwicXVvdGVyZXZlcnNlZCIsInF1b3RlcmlnaHQiLCJxdW90ZXJpZ2h0biIsInF1b3Rlc2luZ2xiYXNlIiwicXVvdGVzaW5nbGUiLCJxdW90ZXNpbmdsZW1vbm9zcGFjZSIsInJhYXJtZW5pYW4iLCJyYWJlbmdhbGkiLCJyYWN1dGUiLCJyYWRldmEiLCJyYWRpY2FsIiwicmFkaWNhbGV4IiwicmFkb3ZlcnNzcXVhcmUiLCJyYWRvdmVyc3NxdWFyZWRzcXVhcmUiLCJyYWRzcXVhcmUiLCJyYWZlIiwicmFmZWhlYnJldyIsInJhZ3VqYXJhdGkiLCJyYWd1cm11a2hpIiwicmFoaXJhZ2FuYSIsInJha2F0YWthbmEiLCJyYWthdGFrYW5haGFsZndpZHRoIiwicmFsb3dlcmRpYWdvbmFsYmVuZ2FsaSIsInJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpIiwicmFtc2hvcm4iLCJyYXRpbyIsInJib3BvbW9mbyIsInJjYXJvbiIsInJjZWRpbGxhIiwicmNpcmNsZSIsInJjb21tYWFjY2VudCIsInJkYmxncmF2ZSIsInJkb3RhY2NlbnQiLCJyZG90YmVsb3ciLCJyZG90YmVsb3dtYWNyb24iLCJyZWZlcmVuY2VtYXJrIiwicmVmbGV4c3Vic2V0IiwicmVmbGV4c3VwZXJzZXQiLCJyZWdpc3RlcmVkIiwicmVnaXN0ZXJzYW5zIiwicmVnaXN0ZXJzZXJpZiIsInJlaGFyYWJpYyIsInJlaGFybWVuaWFuIiwicmVoZmluYWxhcmFiaWMiLCJyZWhpcmFnYW5hIiwicmVrYXRha2FuYSIsInJla2F0YWthbmFoYWxmd2lkdGgiLCJyZXNoIiwicmVzaGRhZ2VzaGhlYnJldyIsInJlc2hoZWJyZXciLCJyZXZlcnNlZHRpbGRlIiwicmV2aWFoZWJyZXciLCJyZXZpYW11Z3Jhc2hoZWJyZXciLCJyZXZsb2dpY2Fsbm90IiwicmZpc2hob29rIiwicmZpc2hob29rcmV2ZXJzZWQiLCJyaGFiZW5nYWxpIiwicmhhZGV2YSIsInJobyIsInJob29rIiwicmhvb2t0dXJuZWQiLCJyaG9va3R1cm5lZHN1cGVyaW9yIiwicmhvc3ltYm9sZ3JlZWsiLCJyaG90aWNob29rbW9kIiwicmlldWxhY2lyY2xla29yZWFuIiwicmlldWxhcGFyZW5rb3JlYW4iLCJyaWV1bGNpcmNsZWtvcmVhbiIsInJpZXVsaGlldWhrb3JlYW4iLCJyaWV1bGtpeWVva2tvcmVhbiIsInJpZXVsa2l5ZW9rc2lvc2tvcmVhbiIsInJpZXVsa29yZWFuIiwicmlldWxtaWV1bWtvcmVhbiIsInJpZXVscGFuc2lvc2tvcmVhbiIsInJpZXVscGFyZW5rb3JlYW4iLCJyaWV1bHBoaWV1cGhrb3JlYW4iLCJyaWV1bHBpZXVwa29yZWFuIiwicmlldWxwaWV1cHNpb3Nrb3JlYW4iLCJyaWV1bHNpb3Nrb3JlYW4iLCJyaWV1bHRoaWV1dGhrb3JlYW4iLCJyaWV1bHRpa2V1dGtvcmVhbiIsInJpZXVseWVvcmluaGlldWhrb3JlYW4iLCJyaWdodGFuZ2xlIiwicmlnaHR0YWNrYmVsb3djbWIiLCJyaWdodHRyaWFuZ2xlIiwicmloaXJhZ2FuYSIsInJpa2F0YWthbmEiLCJyaWthdGFrYW5haGFsZndpZHRoIiwicmluZyIsInJpbmdiZWxvd2NtYiIsInJpbmdjbWIiLCJyaW5naGFsZmxlZnQiLCJyaW5naGFsZmxlZnRhcm1lbmlhbiIsInJpbmdoYWxmbGVmdGJlbG93Y21iIiwicmluZ2hhbGZsZWZ0Y2VudGVyZWQiLCJyaW5naGFsZnJpZ2h0IiwicmluZ2hhbGZyaWdodGJlbG93Y21iIiwicmluZ2hhbGZyaWdodGNlbnRlcmVkIiwicmludmVydGVkYnJldmUiLCJyaXR0b3J1c3F1YXJlIiwicmxpbmViZWxvdyIsInJsb25nbGVnIiwicmxvbmdsZWd0dXJuZWQiLCJybW9ub3NwYWNlIiwicm9oaXJhZ2FuYSIsInJva2F0YWthbmEiLCJyb2thdGFrYW5haGFsZndpZHRoIiwicm9ydWF0aGFpIiwicnBhcmVuIiwicnJhYmVuZ2FsaSIsInJyYWRldmEiLCJycmFndXJtdWtoaSIsInJyZWhhcmFiaWMiLCJycmVoZmluYWxhcmFiaWMiLCJycnZvY2FsaWNiZW5nYWxpIiwicnJ2b2NhbGljZGV2YSIsInJydm9jYWxpY2d1amFyYXRpIiwicnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSIsInJydm9jYWxpY3Zvd2Vsc2lnbmRldmEiLCJycnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aSIsInJzdXBlcmlvciIsInJ0YmxvY2siLCJydHVybmVkIiwicnR1cm5lZHN1cGVyaW9yIiwicnVoaXJhZ2FuYSIsInJ1a2F0YWthbmEiLCJydWthdGFrYW5haGFsZndpZHRoIiwicnVwZWVtYXJrYmVuZ2FsaSIsInJ1cGVlc2lnbmJlbmdhbGkiLCJydXBpYWgiLCJydXRoYWkiLCJydm9jYWxpY2JlbmdhbGkiLCJydm9jYWxpY2RldmEiLCJydm9jYWxpY2d1amFyYXRpIiwicnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpIiwicnZvY2FsaWN2b3dlbHNpZ25kZXZhIiwicnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aSIsInNhYmVuZ2FsaSIsInNhY3V0ZSIsInNhY3V0ZWRvdGFjY2VudCIsInNhZGFyYWJpYyIsInNhZGV2YSIsInNhZGZpbmFsYXJhYmljIiwic2FkaW5pdGlhbGFyYWJpYyIsInNhZG1lZGlhbGFyYWJpYyIsInNhZ3VqYXJhdGkiLCJzYWd1cm11a2hpIiwic2FoaXJhZ2FuYSIsInNha2F0YWthbmEiLCJzYWthdGFrYW5haGFsZndpZHRoIiwic2FsbGFsbGFob3VhbGF5aGV3YXNhbGxhbWFyYWJpYyIsInNhbWVraCIsInNhbWVraGRhZ2VzaCIsInNhbWVraGRhZ2VzaGhlYnJldyIsInNhbWVraGhlYnJldyIsInNhcmFhYXRoYWkiLCJzYXJhYWV0aGFpIiwic2FyYWFpbWFpbWFsYWl0aGFpIiwic2FyYWFpbWFpbXVhbnRoYWkiLCJzYXJhYW10aGFpIiwic2FyYWF0aGFpIiwic2FyYWV0aGFpIiwic2FyYWlpbGVmdHRoYWkiLCJzYXJhaWl0aGFpIiwic2FyYWlsZWZ0dGhhaSIsInNhcmFpdGhhaSIsInNhcmFvdGhhaSIsInNhcmF1ZWVsZWZ0dGhhaSIsInNhcmF1ZWV0aGFpIiwic2FyYXVlbGVmdHRoYWkiLCJzYXJhdWV0aGFpIiwic2FyYXV0aGFpIiwic2FyYXV1dGhhaSIsInNib3BvbW9mbyIsInNjYXJvbiIsInNjYXJvbmRvdGFjY2VudCIsInNjZWRpbGxhIiwic2Nod2EiLCJzY2h3YWN5cmlsbGljIiwic2Nod2FkaWVyZXNpc2N5cmlsbGljIiwic2Nod2Fob29rIiwic2NpcmNsZSIsInNjaXJjdW1mbGV4Iiwic2NvbW1hYWNjZW50Iiwic2RvdGFjY2VudCIsInNkb3RiZWxvdyIsInNkb3RiZWxvd2RvdGFjY2VudCIsInNlYWd1bGxiZWxvd2NtYiIsInNlY29uZHRvbmVjaGluZXNlIiwic2VjdGlvbiIsInNlZW5hcmFiaWMiLCJzZWVuZmluYWxhcmFiaWMiLCJzZWVuaW5pdGlhbGFyYWJpYyIsInNlZW5tZWRpYWxhcmFiaWMiLCJzZWdvbCIsInNlZ29sMTMiLCJzZWdvbDFmIiwic2Vnb2wyYyIsInNlZ29saGVicmV3Iiwic2Vnb2xuYXJyb3doZWJyZXciLCJzZWdvbHF1YXJ0ZXJoZWJyZXciLCJzZWdvbHRhaGVicmV3Iiwic2Vnb2x3aWRlaGVicmV3Iiwic2VoYXJtZW5pYW4iLCJzZWhpcmFnYW5hIiwic2VrYXRha2FuYSIsInNla2F0YWthbmFoYWxmd2lkdGgiLCJzZW1pY29sb24iLCJzZW1pY29sb25hcmFiaWMiLCJzZW1pY29sb25tb25vc3BhY2UiLCJzZW1pY29sb25zbWFsbCIsInNlbWl2b2ljZWRtYXJra2FuYSIsInNlbWl2b2ljZWRtYXJra2FuYWhhbGZ3aWR0aCIsInNlbnRpc3F1YXJlIiwic2VudG9zcXVhcmUiLCJzZXZlbiIsInNldmVuYXJhYmljIiwic2V2ZW5iZW5nYWxpIiwic2V2ZW5jaXJjbGUiLCJzZXZlbmNpcmNsZWludmVyc2VzYW5zc2VyaWYiLCJzZXZlbmRldmEiLCJzZXZlbmVpZ2h0aHMiLCJzZXZlbmd1amFyYXRpIiwic2V2ZW5ndXJtdWtoaSIsInNldmVuaGFja2FyYWJpYyIsInNldmVuaGFuZ3pob3UiLCJzZXZlbmlkZW9ncmFwaGljcGFyZW4iLCJzZXZlbmluZmVyaW9yIiwic2V2ZW5tb25vc3BhY2UiLCJzZXZlbm9sZHN0eWxlIiwic2V2ZW5wYXJlbiIsInNldmVucGVyaW9kIiwic2V2ZW5wZXJzaWFuIiwic2V2ZW5yb21hbiIsInNldmVuc3VwZXJpb3IiLCJzZXZlbnRlZW5jaXJjbGUiLCJzZXZlbnRlZW5wYXJlbiIsInNldmVudGVlbnBlcmlvZCIsInNldmVudGhhaSIsInNmdGh5cGhlbiIsInNoYWFybWVuaWFuIiwic2hhYmVuZ2FsaSIsInNoYWN5cmlsbGljIiwic2hhZGRhYXJhYmljIiwic2hhZGRhZGFtbWFhcmFiaWMiLCJzaGFkZGFkYW1tYXRhbmFyYWJpYyIsInNoYWRkYWZhdGhhYXJhYmljIiwic2hhZGRha2FzcmFhcmFiaWMiLCJzaGFkZGFrYXNyYXRhbmFyYWJpYyIsInNoYWRlIiwic2hhZGVkYXJrIiwic2hhZGVsaWdodCIsInNoYWRlbWVkaXVtIiwic2hhZGV2YSIsInNoYWd1amFyYXRpIiwic2hhZ3VybXVraGkiLCJzaGFsc2hlbGV0aGVicmV3Iiwic2hib3BvbW9mbyIsInNoY2hhY3lyaWxsaWMiLCJzaGVlbmFyYWJpYyIsInNoZWVuZmluYWxhcmFiaWMiLCJzaGVlbmluaXRpYWxhcmFiaWMiLCJzaGVlbm1lZGlhbGFyYWJpYyIsInNoZWljb3B0aWMiLCJzaGVxZWwiLCJzaGVxZWxoZWJyZXciLCJzaGV2YSIsInNoZXZhMTE1Iiwic2hldmExNSIsInNoZXZhMjIiLCJzaGV2YTJlIiwic2hldmFoZWJyZXciLCJzaGV2YW5hcnJvd2hlYnJldyIsInNoZXZhcXVhcnRlcmhlYnJldyIsInNoZXZhd2lkZWhlYnJldyIsInNoaGFjeXJpbGxpYyIsInNoaW1hY29wdGljIiwic2hpbiIsInNoaW5kYWdlc2giLCJzaGluZGFnZXNoaGVicmV3Iiwic2hpbmRhZ2VzaHNoaW5kb3QiLCJzaGluZGFnZXNoc2hpbmRvdGhlYnJldyIsInNoaW5kYWdlc2hzaW5kb3QiLCJzaGluZGFnZXNoc2luZG90aGVicmV3Iiwic2hpbmRvdGhlYnJldyIsInNoaW5oZWJyZXciLCJzaGluc2hpbmRvdCIsInNoaW5zaGluZG90aGVicmV3Iiwic2hpbnNpbmRvdCIsInNoaW5zaW5kb3RoZWJyZXciLCJzaG9vayIsInNpZ21hMSIsInNpZ21hZmluYWwiLCJzaWdtYWx1bmF0ZXN5bWJvbGdyZWVrIiwic2loaXJhZ2FuYSIsInNpa2F0YWthbmEiLCJzaWthdGFrYW5haGFsZndpZHRoIiwic2lsdXFoZWJyZXciLCJzaWx1cWxlZnRoZWJyZXciLCJzaW1pbGFyIiwic2luZG90aGVicmV3Iiwic2lvc2FjaXJjbGVrb3JlYW4iLCJzaW9zYXBhcmVua29yZWFuIiwic2lvc2NpZXVja29yZWFuIiwic2lvc2NpcmNsZWtvcmVhbiIsInNpb3NraXllb2trb3JlYW4iLCJzaW9za29yZWFuIiwic2lvc25pZXVua29yZWFuIiwic2lvc3BhcmVua29yZWFuIiwic2lvc3BpZXVwa29yZWFuIiwic2lvc3Rpa2V1dGtvcmVhbiIsInNpeCIsInNpeGFyYWJpYyIsInNpeGJlbmdhbGkiLCJzaXhjaXJjbGUiLCJzaXhjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmIiwic2l4ZGV2YSIsInNpeGd1amFyYXRpIiwic2l4Z3VybXVraGkiLCJzaXhoYWNrYXJhYmljIiwic2l4aGFuZ3pob3UiLCJzaXhpZGVvZ3JhcGhpY3BhcmVuIiwic2l4aW5mZXJpb3IiLCJzaXhtb25vc3BhY2UiLCJzaXhvbGRzdHlsZSIsInNpeHBhcmVuIiwic2l4cGVyaW9kIiwic2l4cGVyc2lhbiIsInNpeHJvbWFuIiwic2l4c3VwZXJpb3IiLCJzaXh0ZWVuY2lyY2xlIiwic2l4dGVlbmN1cnJlbmN5ZGVub21pbmF0b3JiZW5nYWxpIiwic2l4dGVlbnBhcmVuIiwic2l4dGVlbnBlcmlvZCIsInNpeHRoYWkiLCJzbGFzaCIsInNsYXNobW9ub3NwYWNlIiwic2xvbmciLCJzbG9uZ2RvdGFjY2VudCIsInNtaWxlZmFjZSIsInNtb25vc3BhY2UiLCJzb2ZwYXN1cWhlYnJldyIsInNvZnRoeXBoZW4iLCJzb2Z0c2lnbmN5cmlsbGljIiwic29oaXJhZ2FuYSIsInNva2F0YWthbmEiLCJzb2thdGFrYW5haGFsZndpZHRoIiwic29saWR1c2xvbmdvdmVybGF5Y21iIiwic29saWR1c3Nob3J0b3ZlcmxheWNtYiIsInNvcnVzaXRoYWkiLCJzb3NhbGF0aGFpIiwic29zb3RoYWkiLCJzb3N1YXRoYWkiLCJzcGFjZSIsInNwYWNlaGFja2FyYWJpYyIsInNwYWRlIiwic3BhZGVzdWl0YmxhY2siLCJzcGFkZXN1aXR3aGl0ZSIsInNwYXJlbiIsInNxdWFyZWJlbG93Y21iIiwic3F1YXJlY2MiLCJzcXVhcmVjbSIsInNxdWFyZWRpYWdvbmFsY3Jvc3NoYXRjaGZpbGwiLCJzcXVhcmVob3Jpem9udGFsZmlsbCIsInNxdWFyZWtnIiwic3F1YXJla20iLCJzcXVhcmVrbWNhcGl0YWwiLCJzcXVhcmVsbiIsInNxdWFyZWxvZyIsInNxdWFyZW1nIiwic3F1YXJlbWlsIiwic3F1YXJlbW0iLCJzcXVhcmVtc3F1YXJlZCIsInNxdWFyZW9ydGhvZ29uYWxjcm9zc2hhdGNoZmlsbCIsInNxdWFyZXVwcGVybGVmdHRvbG93ZXJyaWdodGZpbGwiLCJzcXVhcmV1cHBlcnJpZ2h0dG9sb3dlcmxlZnRmaWxsIiwic3F1YXJldmVydGljYWxmaWxsIiwic3F1YXJld2hpdGV3aXRoc21hbGxibGFjayIsInNyc3F1YXJlIiwic3NhYmVuZ2FsaSIsInNzYWRldmEiLCJzc2FndWphcmF0aSIsInNzYW5nY2lldWNrb3JlYW4iLCJzc2FuZ2hpZXVoa29yZWFuIiwic3NhbmdpZXVuZ2tvcmVhbiIsInNzYW5na2l5ZW9ra29yZWFuIiwic3NhbmduaWV1bmtvcmVhbiIsInNzYW5ncGlldXBrb3JlYW4iLCJzc2FuZ3Npb3Nrb3JlYW4iLCJzc2FuZ3Rpa2V1dGtvcmVhbiIsInNzdXBlcmlvciIsInN0ZXJsaW5nIiwic3Rlcmxpbmdtb25vc3BhY2UiLCJzdHJva2Vsb25nb3ZlcmxheWNtYiIsInN0cm9rZXNob3J0b3ZlcmxheWNtYiIsInN1YnNldCIsInN1YnNldG5vdGVxdWFsIiwic3Vic2V0b3JlcXVhbCIsInN1Y2NlZWRzIiwic3VjaHRoYXQiLCJzdWhpcmFnYW5hIiwic3VrYXRha2FuYSIsInN1a2F0YWthbmFoYWxmd2lkdGgiLCJzdWt1bmFyYWJpYyIsInN1bW1hdGlvbiIsInN1biIsInN1cGVyc2V0Iiwic3VwZXJzZXRub3RlcXVhbCIsInN1cGVyc2V0b3JlcXVhbCIsInN2c3F1YXJlIiwic3lvdXdhZXJhc3F1YXJlIiwidGFiZW5nYWxpIiwidGFja2Rvd24iLCJ0YWNrbGVmdCIsInRhZGV2YSIsInRhZ3VqYXJhdGkiLCJ0YWd1cm11a2hpIiwidGFoYXJhYmljIiwidGFoZmluYWxhcmFiaWMiLCJ0YWhpbml0aWFsYXJhYmljIiwidGFoaXJhZ2FuYSIsInRhaG1lZGlhbGFyYWJpYyIsInRhaXN5b3VlcmFzcXVhcmUiLCJ0YWthdGFrYW5hIiwidGFrYXRha2FuYWhhbGZ3aWR0aCIsInRhdHdlZWxhcmFiaWMiLCJ0YXUiLCJ0YXYiLCJ0YXZkYWdlcyIsInRhdmRhZ2VzaCIsInRhdmRhZ2VzaGhlYnJldyIsInRhdmhlYnJldyIsInRiYXIiLCJ0Ym9wb21vZm8iLCJ0Y2Fyb24iLCJ0Y2N1cmwiLCJ0Y2VkaWxsYSIsInRjaGVoYXJhYmljIiwidGNoZWhmaW5hbGFyYWJpYyIsInRjaGVoaW5pdGlhbGFyYWJpYyIsInRjaGVobWVkaWFsYXJhYmljIiwidGNpcmNsZSIsInRjaXJjdW1mbGV4YmVsb3ciLCJ0Y29tbWFhY2NlbnQiLCJ0ZGllcmVzaXMiLCJ0ZG90YWNjZW50IiwidGRvdGJlbG93IiwidGVjeXJpbGxpYyIsInRlZGVzY2VuZGVyY3lyaWxsaWMiLCJ0ZWhhcmFiaWMiLCJ0ZWhmaW5hbGFyYWJpYyIsInRlaGhhaGluaXRpYWxhcmFiaWMiLCJ0ZWhoYWhpc29sYXRlZGFyYWJpYyIsInRlaGluaXRpYWxhcmFiaWMiLCJ0ZWhpcmFnYW5hIiwidGVoamVlbWluaXRpYWxhcmFiaWMiLCJ0ZWhqZWVtaXNvbGF0ZWRhcmFiaWMiLCJ0ZWhtYXJidXRhYXJhYmljIiwidGVobWFyYnV0YWZpbmFsYXJhYmljIiwidGVobWVkaWFsYXJhYmljIiwidGVobWVlbWluaXRpYWxhcmFiaWMiLCJ0ZWhtZWVtaXNvbGF0ZWRhcmFiaWMiLCJ0ZWhub29uZmluYWxhcmFiaWMiLCJ0ZWthdGFrYW5hIiwidGVrYXRha2FuYWhhbGZ3aWR0aCIsInRlbGVwaG9uZSIsInRlbGVwaG9uZWJsYWNrIiwidGVsaXNoYWdlZG9sYWhlYnJldyIsInRlbGlzaGFxZXRhbmFoZWJyZXciLCJ0ZW5jaXJjbGUiLCJ0ZW5pZGVvZ3JhcGhpY3BhcmVuIiwidGVucGFyZW4iLCJ0ZW5wZXJpb2QiLCJ0ZW5yb21hbiIsInRlc2giLCJ0ZXQiLCJ0ZXRkYWdlc2giLCJ0ZXRkYWdlc2hoZWJyZXciLCJ0ZXRoZWJyZXciLCJ0ZXRzZWN5cmlsbGljIiwidGV2aXJoZWJyZXciLCJ0ZXZpcmxlZnRoZWJyZXciLCJ0aGFiZW5nYWxpIiwidGhhZGV2YSIsInRoYWd1amFyYXRpIiwidGhhZ3VybXVraGkiLCJ0aGFsYXJhYmljIiwidGhhbGZpbmFsYXJhYmljIiwidGhhbnRoYWtoYXRsb3dsZWZ0dGhhaSIsInRoYW50aGFraGF0bG93cmlnaHR0aGFpIiwidGhhbnRoYWtoYXR0aGFpIiwidGhhbnRoYWtoYXR1cHBlcmxlZnR0aGFpIiwidGhlaGFyYWJpYyIsInRoZWhmaW5hbGFyYWJpYyIsInRoZWhpbml0aWFsYXJhYmljIiwidGhlaG1lZGlhbGFyYWJpYyIsInRoZXJlZXhpc3RzIiwidGhlcmVmb3JlIiwidGhldGEiLCJ0aGV0YTEiLCJ0aGV0YXN5bWJvbGdyZWVrIiwidGhpZXV0aGFjaXJjbGVrb3JlYW4iLCJ0aGlldXRoYXBhcmVua29yZWFuIiwidGhpZXV0aGNpcmNsZWtvcmVhbiIsInRoaWV1dGhrb3JlYW4iLCJ0aGlldXRocGFyZW5rb3JlYW4iLCJ0aGlydGVlbmNpcmNsZSIsInRoaXJ0ZWVucGFyZW4iLCJ0aGlydGVlbnBlcmlvZCIsInRob25hbmdtb250aG90aGFpIiwidGhvb2siLCJ0aG9waHV0aGFvdGhhaSIsInRob3JuIiwidGhvdGhhaGFudGhhaSIsInRob3RoYW50aGFpIiwidGhvdGhvbmd0aGFpIiwidGhvdGh1bmd0aGFpIiwidGhvdXNhbmRjeXJpbGxpYyIsInRob3VzYW5kc3NlcGFyYXRvcmFyYWJpYyIsInRob3VzYW5kc3NlcGFyYXRvcnBlcnNpYW4iLCJ0aHJlZSIsInRocmVlYXJhYmljIiwidGhyZWViZW5nYWxpIiwidGhyZWVjaXJjbGUiLCJ0aHJlZWNpcmNsZWludmVyc2VzYW5zc2VyaWYiLCJ0aHJlZWRldmEiLCJ0aHJlZWVpZ2h0aHMiLCJ0aHJlZWd1amFyYXRpIiwidGhyZWVndXJtdWtoaSIsInRocmVlaGFja2FyYWJpYyIsInRocmVlaGFuZ3pob3UiLCJ0aHJlZWlkZW9ncmFwaGljcGFyZW4iLCJ0aHJlZWluZmVyaW9yIiwidGhyZWVtb25vc3BhY2UiLCJ0aHJlZW51bWVyYXRvcmJlbmdhbGkiLCJ0aHJlZW9sZHN0eWxlIiwidGhyZWVwYXJlbiIsInRocmVlcGVyaW9kIiwidGhyZWVwZXJzaWFuIiwidGhyZWVxdWFydGVycyIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJ0aHJlZXJvbWFuIiwidGhyZWVzdXBlcmlvciIsInRocmVldGhhaSIsInRoenNxdWFyZSIsInRpaGlyYWdhbmEiLCJ0aWthdGFrYW5hIiwidGlrYXRha2FuYWhhbGZ3aWR0aCIsInRpa2V1dGFjaXJjbGVrb3JlYW4iLCJ0aWtldXRhcGFyZW5rb3JlYW4iLCJ0aWtldXRjaXJjbGVrb3JlYW4iLCJ0aWtldXRrb3JlYW4iLCJ0aWtldXRwYXJlbmtvcmVhbiIsInRpbGRlIiwidGlsZGViZWxvd2NtYiIsInRpbGRlY21iIiwidGlsZGVjb21iIiwidGlsZGVkb3VibGVjbWIiLCJ0aWxkZW9wZXJhdG9yIiwidGlsZGVvdmVybGF5Y21iIiwidGlsZGV2ZXJ0aWNhbGNtYiIsInRpbWVzY2lyY2xlIiwidGlwZWhhaGVicmV3IiwidGlwZWhhbGVmdGhlYnJldyIsInRpcHBpZ3VybXVraGkiLCJ0aXRsb2N5cmlsbGljY21iIiwidGl3bmFybWVuaWFuIiwidGxpbmViZWxvdyIsInRtb25vc3BhY2UiLCJ0b2FybWVuaWFuIiwidG9oaXJhZ2FuYSIsInRva2F0YWthbmEiLCJ0b2thdGFrYW5haGFsZndpZHRoIiwidG9uZWJhcmV4dHJhaGlnaG1vZCIsInRvbmViYXJleHRyYWxvd21vZCIsInRvbmViYXJoaWdobW9kIiwidG9uZWJhcmxvd21vZCIsInRvbmViYXJtaWRtb2QiLCJ0b25lZml2ZSIsInRvbmVzaXgiLCJ0b25ldHdvIiwidG9ub3MiLCJ0b25zcXVhcmUiLCJ0b3BhdGFrdGhhaSIsInRvcnRvaXNlc2hlbGxicmFja2V0bGVmdCIsInRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHNtYWxsIiwidG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0dmVydGljYWwiLCJ0b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0IiwidG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHNtYWxsIiwidG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHZlcnRpY2FsIiwidG90YW90aGFpIiwidHBhbGF0YWxob29rIiwidHBhcmVuIiwidHJhZGVtYXJrIiwidHJhZGVtYXJrc2FucyIsInRyYWRlbWFya3NlcmlmIiwidHJldHJvZmxleGhvb2siLCJ0cmlhZ2RuIiwidHJpYWdsZiIsInRyaWFncnQiLCJ0cmlhZ3VwIiwidHMiLCJ0c2FkaSIsInRzYWRpZGFnZXNoIiwidHNhZGlkYWdlc2hoZWJyZXciLCJ0c2FkaWhlYnJldyIsInRzZWN5cmlsbGljIiwidHNlcmUiLCJ0c2VyZTEyIiwidHNlcmUxZSIsInRzZXJlMmIiLCJ0c2VyZWhlYnJldyIsInRzZXJlbmFycm93aGVicmV3IiwidHNlcmVxdWFydGVyaGVicmV3IiwidHNlcmV3aWRlaGVicmV3IiwidHNoZWN5cmlsbGljIiwidHN1cGVyaW9yIiwidHRhYmVuZ2FsaSIsInR0YWRldmEiLCJ0dGFndWphcmF0aSIsInR0YWd1cm11a2hpIiwidHRlaGFyYWJpYyIsInR0ZWhmaW5hbGFyYWJpYyIsInR0ZWhpbml0aWFsYXJhYmljIiwidHRlaG1lZGlhbGFyYWJpYyIsInR0aGFiZW5nYWxpIiwidHRoYWRldmEiLCJ0dGhhZ3VqYXJhdGkiLCJ0dGhhZ3VybXVraGkiLCJ0dHVybmVkIiwidHVoaXJhZ2FuYSIsInR1a2F0YWthbmEiLCJ0dWthdGFrYW5haGFsZndpZHRoIiwidHVzbWFsbGhpcmFnYW5hIiwidHVzbWFsbGthdGFrYW5hIiwidHVzbWFsbGthdGFrYW5haGFsZndpZHRoIiwidHdlbHZlY2lyY2xlIiwidHdlbHZlcGFyZW4iLCJ0d2VsdmVwZXJpb2QiLCJ0d2VsdmVyb21hbiIsInR3ZW50eWNpcmNsZSIsInR3ZW50eWhhbmd6aG91IiwidHdlbnR5cGFyZW4iLCJ0d2VudHlwZXJpb2QiLCJ0d28iLCJ0d29hcmFiaWMiLCJ0d29iZW5nYWxpIiwidHdvY2lyY2xlIiwidHdvY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiIsInR3b2RldmEiLCJ0d29kb3RlbmxlYWRlciIsInR3b2RvdGxlYWRlciIsInR3b2RvdGxlYWRlcnZlcnRpY2FsIiwidHdvZ3VqYXJhdGkiLCJ0d29ndXJtdWtoaSIsInR3b2hhY2thcmFiaWMiLCJ0d29oYW5nemhvdSIsInR3b2lkZW9ncmFwaGljcGFyZW4iLCJ0d29pbmZlcmlvciIsInR3b21vbm9zcGFjZSIsInR3b251bWVyYXRvcmJlbmdhbGkiLCJ0d29vbGRzdHlsZSIsInR3b3BhcmVuIiwidHdvcGVyaW9kIiwidHdvcGVyc2lhbiIsInR3b3JvbWFuIiwidHdvc3Ryb2tlIiwidHdvc3VwZXJpb3IiLCJ0d290aGFpIiwidHdvdGhpcmRzIiwidWFjdXRlIiwidWJhciIsInViZW5nYWxpIiwidWJvcG9tb2ZvIiwidWJyZXZlIiwidWNhcm9uIiwidWNpcmNsZSIsInVjaXJjdW1mbGV4IiwidWNpcmN1bWZsZXhiZWxvdyIsInVjeXJpbGxpYyIsInVkYXR0YWRldmEiLCJ1ZGJsYWN1dGUiLCJ1ZGJsZ3JhdmUiLCJ1ZGV2YSIsInVkaWVyZXNpcyIsInVkaWVyZXNpc2FjdXRlIiwidWRpZXJlc2lzYmVsb3ciLCJ1ZGllcmVzaXNjYXJvbiIsInVkaWVyZXNpc2N5cmlsbGljIiwidWRpZXJlc2lzZ3JhdmUiLCJ1ZGllcmVzaXNtYWNyb24iLCJ1ZG90YmVsb3ciLCJ1Z3JhdmUiLCJ1Z3VqYXJhdGkiLCJ1Z3VybXVraGkiLCJ1aGlyYWdhbmEiLCJ1aG9va2Fib3ZlIiwidWhvcm4iLCJ1aG9ybmFjdXRlIiwidWhvcm5kb3RiZWxvdyIsInVob3JuZ3JhdmUiLCJ1aG9ybmhvb2thYm92ZSIsInVob3JudGlsZGUiLCJ1aHVuZ2FydW1sYXV0IiwidWh1bmdhcnVtbGF1dGN5cmlsbGljIiwidWludmVydGVkYnJldmUiLCJ1a2F0YWthbmEiLCJ1a2F0YWthbmFoYWxmd2lkdGgiLCJ1a2N5cmlsbGljIiwidWtvcmVhbiIsInVtYWNyb24iLCJ1bWFjcm9uY3lyaWxsaWMiLCJ1bWFjcm9uZGllcmVzaXMiLCJ1bWF0cmFndXJtdWtoaSIsInVtb25vc3BhY2UiLCJ1bmRlcnNjb3JlIiwidW5kZXJzY29yZWRibCIsInVuZGVyc2NvcmVtb25vc3BhY2UiLCJ1bmRlcnNjb3JldmVydGljYWwiLCJ1bmRlcnNjb3Jld2F2eSIsInVuaW9uIiwidW5pdmVyc2FsIiwidW9nb25layIsInVwYXJlbiIsInVwYmxvY2siLCJ1cHBlcmRvdGhlYnJldyIsInVwc2lsb24iLCJ1cHNpbG9uZGllcmVzaXMiLCJ1cHNpbG9uZGllcmVzaXN0b25vcyIsInVwc2lsb25sYXRpbiIsInVwc2lsb250b25vcyIsInVwdGFja2JlbG93Y21iIiwidXB0YWNrbW9kIiwidXJhZ3VybXVraGkiLCJ1cmluZyIsInVzaG9ydGN5cmlsbGljIiwidXNtYWxsaGlyYWdhbmEiLCJ1c21hbGxrYXRha2FuYSIsInVzbWFsbGthdGFrYW5haGFsZndpZHRoIiwidXN0cmFpZ2h0Y3lyaWxsaWMiLCJ1c3RyYWlnaHRzdHJva2VjeXJpbGxpYyIsInV0aWxkZSIsInV0aWxkZWFjdXRlIiwidXRpbGRlYmVsb3ciLCJ1dWJlbmdhbGkiLCJ1dWRldmEiLCJ1dWd1amFyYXRpIiwidXVndXJtdWtoaSIsInV1bWF0cmFndXJtdWtoaSIsInV1dm93ZWxzaWduYmVuZ2FsaSIsInV1dm93ZWxzaWduZGV2YSIsInV1dm93ZWxzaWduZ3VqYXJhdGkiLCJ1dm93ZWxzaWduYmVuZ2FsaSIsInV2b3dlbHNpZ25kZXZhIiwidXZvd2Vsc2lnbmd1amFyYXRpIiwidmFkZXZhIiwidmFndWphcmF0aSIsInZhZ3VybXVraGkiLCJ2YWthdGFrYW5hIiwidmF2IiwidmF2ZGFnZXNoIiwidmF2ZGFnZXNoNjUiLCJ2YXZkYWdlc2hoZWJyZXciLCJ2YXZoZWJyZXciLCJ2YXZob2xhbSIsInZhdmhvbGFtaGVicmV3IiwidmF2dmF2aGVicmV3IiwidmF2eW9kaGVicmV3IiwidmNpcmNsZSIsInZkb3RiZWxvdyIsInZlY3lyaWxsaWMiLCJ2ZWhhcmFiaWMiLCJ2ZWhmaW5hbGFyYWJpYyIsInZlaGluaXRpYWxhcmFiaWMiLCJ2ZWhtZWRpYWxhcmFiaWMiLCJ2ZWthdGFrYW5hIiwidmVudXMiLCJ2ZXJ0aWNhbGJhciIsInZlcnRpY2FsbGluZWFib3ZlY21iIiwidmVydGljYWxsaW5lYmVsb3djbWIiLCJ2ZXJ0aWNhbGxpbmVsb3dtb2QiLCJ2ZXJ0aWNhbGxpbmVtb2QiLCJ2ZXdhcm1lbmlhbiIsInZob29rIiwidmlrYXRha2FuYSIsInZpcmFtYWJlbmdhbGkiLCJ2aXJhbWFkZXZhIiwidmlyYW1hZ3VqYXJhdGkiLCJ2aXNhcmdhYmVuZ2FsaSIsInZpc2FyZ2FkZXZhIiwidmlzYXJnYWd1amFyYXRpIiwidm1vbm9zcGFjZSIsInZvYXJtZW5pYW4iLCJ2b2ljZWRpdGVyYXRpb25oaXJhZ2FuYSIsInZvaWNlZGl0ZXJhdGlvbmthdGFrYW5hIiwidm9pY2VkbWFya2thbmEiLCJ2b2ljZWRtYXJra2FuYWhhbGZ3aWR0aCIsInZva2F0YWthbmEiLCJ2cGFyZW4iLCJ2dGlsZGUiLCJ2dHVybmVkIiwidnVoaXJhZ2FuYSIsInZ1a2F0YWthbmEiLCJ3YWN1dGUiLCJ3YWVrb3JlYW4iLCJ3YWhpcmFnYW5hIiwid2FrYXRha2FuYSIsIndha2F0YWthbmFoYWxmd2lkdGgiLCJ3YWtvcmVhbiIsIndhc21hbGxoaXJhZ2FuYSIsIndhc21hbGxrYXRha2FuYSIsIndhdHRvc3F1YXJlIiwid2F2ZWRhc2giLCJ3YXZ5dW5kZXJzY29yZXZlcnRpY2FsIiwid2F3YXJhYmljIiwid2F3ZmluYWxhcmFiaWMiLCJ3YXdoYW16YWFib3ZlYXJhYmljIiwid2F3aGFtemFhYm92ZWZpbmFsYXJhYmljIiwid2JzcXVhcmUiLCJ3Y2lyY2xlIiwid2NpcmN1bWZsZXgiLCJ3ZGllcmVzaXMiLCJ3ZG90YWNjZW50Iiwid2RvdGJlbG93Iiwid2VoaXJhZ2FuYSIsIndlaWVyc3RyYXNzIiwid2VrYXRha2FuYSIsIndla29yZWFuIiwid2Vva29yZWFuIiwid2dyYXZlIiwid2hpdGVidWxsZXQiLCJ3aGl0ZWNpcmNsZSIsIndoaXRlY2lyY2xlaW52ZXJzZSIsIndoaXRlY29ybmVyYnJhY2tldGxlZnQiLCJ3aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWwiLCJ3aGl0ZWNvcm5lcmJyYWNrZXRyaWdodCIsIndoaXRlY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWwiLCJ3aGl0ZWRpYW1vbmQiLCJ3aGl0ZWRpYW1vbmRjb250YWluaW5nYmxhY2tzbWFsbGRpYW1vbmQiLCJ3aGl0ZWRvd25wb2ludGluZ3NtYWxsdHJpYW5nbGUiLCJ3aGl0ZWRvd25wb2ludGluZ3RyaWFuZ2xlIiwid2hpdGVsZWZ0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlIiwid2hpdGVsZWZ0cG9pbnRpbmd0cmlhbmdsZSIsIndoaXRlbGVudGljdWxhcmJyYWNrZXRsZWZ0Iiwid2hpdGVsZW50aWN1bGFyYnJhY2tldHJpZ2h0Iiwid2hpdGVyaWdodHBvaW50aW5nc21hbGx0cmlhbmdsZSIsIndoaXRlcmlnaHRwb2ludGluZ3RyaWFuZ2xlIiwid2hpdGVzbWFsbHNxdWFyZSIsIndoaXRlc21pbGluZ2ZhY2UiLCJ3aGl0ZXNxdWFyZSIsIndoaXRlc3RhciIsIndoaXRldGVsZXBob25lIiwid2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQiLCJ3aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQiLCJ3aGl0ZXVwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlIiwid2hpdGV1cHBvaW50aW5ndHJpYW5nbGUiLCJ3aWhpcmFnYW5hIiwid2lrYXRha2FuYSIsIndpa29yZWFuIiwid21vbm9zcGFjZSIsIndvaGlyYWdhbmEiLCJ3b2thdGFrYW5hIiwid29rYXRha2FuYWhhbGZ3aWR0aCIsIndvbiIsIndvbm1vbm9zcGFjZSIsIndvd2FlbnRoYWkiLCJ3cGFyZW4iLCJ3cmluZyIsIndzdXBlcmlvciIsInd0dXJuZWQiLCJ3eW5uIiwieGFib3ZlY21iIiwieGJvcG9tb2ZvIiwieGNpcmNsZSIsInhkaWVyZXNpcyIsInhkb3RhY2NlbnQiLCJ4ZWhhcm1lbmlhbiIsInhpIiwieG1vbm9zcGFjZSIsInhwYXJlbiIsInhzdXBlcmlvciIsInlhYWRvc3F1YXJlIiwieWFiZW5nYWxpIiwieWFjdXRlIiwieWFkZXZhIiwieWFla29yZWFuIiwieWFndWphcmF0aSIsInlhZ3VybXVraGkiLCJ5YWhpcmFnYW5hIiwieWFrYXRha2FuYSIsInlha2F0YWthbmFoYWxmd2lkdGgiLCJ5YWtvcmVhbiIsInlhbWFra2FudGhhaSIsInlhc21hbGxoaXJhZ2FuYSIsInlhc21hbGxrYXRha2FuYSIsInlhc21hbGxrYXRha2FuYWhhbGZ3aWR0aCIsInlhdGN5cmlsbGljIiwieWNpcmNsZSIsInljaXJjdW1mbGV4IiwieWRpZXJlc2lzIiwieWRvdGFjY2VudCIsInlkb3RiZWxvdyIsInllaGFyYWJpYyIsInllaGJhcnJlZWFyYWJpYyIsInllaGJhcnJlZWZpbmFsYXJhYmljIiwieWVoZmluYWxhcmFiaWMiLCJ5ZWhoYW16YWFib3ZlYXJhYmljIiwieWVoaGFtemFhYm92ZWZpbmFsYXJhYmljIiwieWVoaGFtemFhYm92ZWluaXRpYWxhcmFiaWMiLCJ5ZWhoYW16YWFib3ZlbWVkaWFsYXJhYmljIiwieWVoaW5pdGlhbGFyYWJpYyIsInllaG1lZGlhbGFyYWJpYyIsInllaG1lZW1pbml0aWFsYXJhYmljIiwieWVobWVlbWlzb2xhdGVkYXJhYmljIiwieWVobm9vbmZpbmFsYXJhYmljIiwieWVodGhyZWVkb3RzYmVsb3dhcmFiaWMiLCJ5ZWtvcmVhbiIsInllbiIsInllbm1vbm9zcGFjZSIsInllb2tvcmVhbiIsInllb3JpbmhpZXVoa29yZWFuIiwieWVyYWhiZW55b21vaGVicmV3IiwieWVyYWhiZW55b21vbGVmdGhlYnJldyIsInllcmljeXJpbGxpYyIsInllcnVkaWVyZXNpc2N5cmlsbGljIiwieWVzaWV1bmdrb3JlYW4iLCJ5ZXNpZXVuZ3BhbnNpb3Nrb3JlYW4iLCJ5ZXNpZXVuZ3Npb3Nrb3JlYW4iLCJ5ZXRpdmhlYnJldyIsInlncmF2ZSIsInlob29rIiwieWhvb2thYm92ZSIsInlpYXJtZW5pYW4iLCJ5aWN5cmlsbGljIiwieWlrb3JlYW4iLCJ5aW55YW5nIiwieWl3bmFybWVuaWFuIiwieW1vbm9zcGFjZSIsInlvZCIsInlvZGRhZ2VzaCIsInlvZGRhZ2VzaGhlYnJldyIsInlvZGhlYnJldyIsInlvZHlvZGhlYnJldyIsInlvZHlvZHBhdGFoaGVicmV3IiwieW9oaXJhZ2FuYSIsInlvaWtvcmVhbiIsInlva2F0YWthbmEiLCJ5b2thdGFrYW5haGFsZndpZHRoIiwieW9rb3JlYW4iLCJ5b3NtYWxsaGlyYWdhbmEiLCJ5b3NtYWxsa2F0YWthbmEiLCJ5b3NtYWxsa2F0YWthbmFoYWxmd2lkdGgiLCJ5b3RncmVlayIsInlveWFla29yZWFuIiwieW95YWtvcmVhbiIsInlveWFrdGhhaSIsInlveWluZ3RoYWkiLCJ5cGFyZW4iLCJ5cG9nZWdyYW1tZW5pIiwieXBvZ2VncmFtbWVuaWdyZWVrY21iIiwieXIiLCJ5cmluZyIsInlzdXBlcmlvciIsInl0aWxkZSIsInl0dXJuZWQiLCJ5dWhpcmFnYW5hIiwieXVpa29yZWFuIiwieXVrYXRha2FuYSIsInl1a2F0YWthbmFoYWxmd2lkdGgiLCJ5dWtvcmVhbiIsInl1c2JpZ2N5cmlsbGljIiwieXVzYmlnaW90aWZpZWRjeXJpbGxpYyIsInl1c2xpdHRsZWN5cmlsbGljIiwieXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyIsInl1c21hbGxoaXJhZ2FuYSIsInl1c21hbGxrYXRha2FuYSIsInl1c21hbGxrYXRha2FuYWhhbGZ3aWR0aCIsInl1eWVrb3JlYW4iLCJ5dXllb2tvcmVhbiIsInl5YWJlbmdhbGkiLCJ5eWFkZXZhIiwiemFhcm1lbmlhbiIsInphY3V0ZSIsInphZGV2YSIsInphZ3VybXVraGkiLCJ6YWhhcmFiaWMiLCJ6YWhmaW5hbGFyYWJpYyIsInphaGluaXRpYWxhcmFiaWMiLCJ6YWhpcmFnYW5hIiwiemFobWVkaWFsYXJhYmljIiwiemFpbmFyYWJpYyIsInphaW5maW5hbGFyYWJpYyIsInpha2F0YWthbmEiLCJ6YXFlZmdhZG9saGVicmV3IiwiemFxZWZxYXRhbmhlYnJldyIsInphcnFhaGVicmV3IiwiemF5aW4iLCJ6YXlpbmRhZ2VzaCIsInpheWluZGFnZXNoaGVicmV3IiwiemF5aW5oZWJyZXciLCJ6Ym9wb21vZm8iLCJ6Y2Fyb24iLCJ6Y2lyY2xlIiwiemNpcmN1bWZsZXgiLCJ6Y3VybCIsInpkb3QiLCJ6ZG90YWNjZW50IiwiemRvdGJlbG93IiwiemVjeXJpbGxpYyIsInplZGVzY2VuZGVyY3lyaWxsaWMiLCJ6ZWRpZXJlc2lzY3lyaWxsaWMiLCJ6ZWhpcmFnYW5hIiwiemVrYXRha2FuYSIsInplcm8iLCJ6ZXJvYXJhYmljIiwiemVyb2JlbmdhbGkiLCJ6ZXJvZGV2YSIsInplcm9ndWphcmF0aSIsInplcm9ndXJtdWtoaSIsInplcm9oYWNrYXJhYmljIiwiemVyb2luZmVyaW9yIiwiemVyb21vbm9zcGFjZSIsInplcm9vbGRzdHlsZSIsInplcm9wZXJzaWFuIiwiemVyb3N1cGVyaW9yIiwiemVyb3RoYWkiLCJ6ZXJvd2lkdGhqb2luZXIiLCJ6ZXJvd2lkdGhub25qb2luZXIiLCJ6ZXJvd2lkdGhzcGFjZSIsInpldGEiLCJ6aGJvcG9tb2ZvIiwiemhlYXJtZW5pYW4iLCJ6aGVicmV2ZWN5cmlsbGljIiwiemhlY3lyaWxsaWMiLCJ6aGVkZXNjZW5kZXJjeXJpbGxpYyIsInpoZWRpZXJlc2lzY3lyaWxsaWMiLCJ6aWhpcmFnYW5hIiwiemlrYXRha2FuYSIsInppbm9yaGVicmV3IiwiemxpbmViZWxvdyIsInptb25vc3BhY2UiLCJ6b2hpcmFnYW5hIiwiem9rYXRha2FuYSIsInpwYXJlbiIsInpyZXRyb2ZsZXhob29rIiwienN0cm9rZSIsInp1aGlyYWdhbmEiLCJ6dWthdGFrYW5hIiwiYW5nYnJhY2tldGxlZnRiaWciLCJhbmdicmFja2V0bGVmdEJpZyIsImFuZ2JyYWNrZXRsZWZ0YmlnZyIsImFuZ2JyYWNrZXRsZWZ0QmlnZyIsImFuZ2JyYWNrZXRyaWdodEJpZyIsImFuZ2JyYWNrZXRyaWdodGJpZyIsImFuZ2JyYWNrZXRyaWdodEJpZ2ciLCJhbmdicmFja2V0cmlnaHRiaWdnIiwiYXJyb3dob29rbGVmdCIsImFycm93aG9va3JpZ2h0IiwiYXJyb3dsZWZ0dG9waGFsZiIsImFycm93bGVmdGJvdGhhbGYiLCJhcnJvd25vcnRoZWFzdCIsImFycm93bm9ydGh3ZXN0IiwiYXJyb3dyaWdodHRvcGhhbGYiLCJhcnJvd3JpZ2h0Ym90aGFsZiIsImFycm93c291dGhlYXN0IiwiYXJyb3dzb3V0aHdlc3QiLCJiYWNrc2xhc2hiaWciLCJiYWNrc2xhc2hCaWciLCJiYWNrc2xhc2hCaWdnIiwiYmFja3NsYXNoYmlnZyIsImJhcmRibCIsImJyYWNlaHRpcGRvd25sZWZ0IiwiYnJhY2VodGlwZG93bnJpZ2h0IiwiYnJhY2VodGlwdXBsZWZ0IiwiYnJhY2VodGlwdXByaWdodCIsImJyYWNlbGVmdEJpZyIsImJyYWNlbGVmdGJpZyIsImJyYWNlbGVmdGJpZ2ciLCJicmFjZWxlZnRCaWdnIiwiYnJhY2VyaWdodEJpZyIsImJyYWNlcmlnaHRiaWciLCJicmFjZXJpZ2h0YmlnZyIsImJyYWNlcmlnaHRCaWdnIiwiYnJhY2tldGxlZnRiaWciLCJicmFja2V0bGVmdEJpZyIsImJyYWNrZXRsZWZ0YmlnZyIsImJyYWNrZXRsZWZ0QmlnZyIsImJyYWNrZXRyaWdodEJpZyIsImJyYWNrZXRyaWdodGJpZyIsImJyYWNrZXRyaWdodGJpZ2ciLCJicmFja2V0cmlnaHRCaWdnIiwiY2VpbGluZ2xlZnRiaWciLCJjZWlsaW5nbGVmdEJpZyIsImNlaWxpbmdsZWZ0QmlnZyIsImNlaWxpbmdsZWZ0YmlnZyIsImNlaWxpbmdyaWdodGJpZyIsImNlaWxpbmdyaWdodEJpZyIsImNlaWxpbmdyaWdodGJpZ2ciLCJjZWlsaW5ncmlnaHRCaWdnIiwiY2lyY2xlZG90ZGlzcGxheSIsImNpcmNsZWRvdHRleHQiLCJjaXJjbGVtdWx0aXBseWRpc3BsYXkiLCJjaXJjbGVtdWx0aXBseXRleHQiLCJjaXJjbGVwbHVzZGlzcGxheSIsImNpcmNsZXBsdXN0ZXh0IiwiY29udGludGVncmFsZGlzcGxheSIsImNvbnRpbnRlZ3JhbHRleHQiLCJjb3Byb2R1Y3RkaXNwbGF5IiwiY29wcm9kdWN0dGV4dCIsImZsb29ybGVmdEJpZyIsImZsb29ybGVmdGJpZyIsImZsb29ybGVmdGJpZ2ciLCJmbG9vcmxlZnRCaWdnIiwiZmxvb3JyaWdodGJpZyIsImZsb29ycmlnaHRCaWciLCJmbG9vcnJpZ2h0QmlnZyIsImZsb29ycmlnaHRiaWdnIiwiaGF0d2lkZSIsImhhdHdpZGVyIiwiaGF0d2lkZXN0IiwiaW50ZXJjYWwiLCJpbnRlZ3JhbGRpc3BsYXkiLCJpbnRlZ3JhbHRleHQiLCJpbnRlcnNlY3Rpb25kaXNwbGF5IiwiaW50ZXJzZWN0aW9udGV4dCIsImxvZ2ljYWxhbmRkaXNwbGF5IiwibG9naWNhbGFuZHRleHQiLCJsb2dpY2Fsb3JkaXNwbGF5IiwibG9naWNhbG9ydGV4dCIsInBhcmVubGVmdEJpZyIsInBhcmVubGVmdGJpZyIsInBhcmVubGVmdEJpZ2ciLCJwYXJlbmxlZnRiaWdnIiwicGFyZW5yaWdodEJpZyIsInBhcmVucmlnaHRiaWciLCJwYXJlbnJpZ2h0QmlnZyIsInBhcmVucmlnaHRiaWdnIiwicHJpbWUiLCJwcm9kdWN0ZGlzcGxheSIsInByb2R1Y3R0ZXh0IiwicmFkaWNhbGJpZyIsInJhZGljYWxCaWciLCJyYWRpY2FsQmlnZyIsInJhZGljYWxiaWdnIiwicmFkaWNhbGJ0IiwicmFkaWNhbHRwIiwicmFkaWNhbHZlcnRleCIsInNsYXNoYmlnIiwic2xhc2hCaWciLCJzbGFzaEJpZ2ciLCJzbGFzaGJpZ2ciLCJzdW1tYXRpb25kaXNwbGF5Iiwic3VtbWF0aW9udGV4dCIsInRpbGRld2lkZSIsInRpbGRld2lkZXIiLCJ0aWxkZXdpZGVzdCIsInVuaW9uZGlzcGxheSIsInVuaW9ubXVsdGlkaXNwbGF5IiwidW5pb25tdWx0aXRleHQiLCJ1bmlvbnNxZGlzcGxheSIsInVuaW9uc3F0ZXh0IiwidW5pb250ZXh0IiwidmV4dGVuZGRvdWJsZSIsInZleHRlbmRzaW5nbGUiLCJnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUiLCJhMiIsImEyMDIiLCJhMyIsImE0IiwiYTUiLCJhMTE5IiwiYTExOCIsImExMTciLCJhMTEiLCJhMTIiLCJhMTMiLCJhMTQiLCJhMTUiLCJhMTYiLCJhMTA1IiwiYTE3IiwiYTE4IiwiYTE5IiwiYTIwIiwiYTIxIiwiYTIyIiwiYTIzIiwiYTI0IiwiYTI1IiwiYTI2IiwiYTI3IiwiYTI4IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJhMTAiLCJhMjkiLCJhMzAiLCJhMzEiLCJhMzIiLCJhMzMiLCJhMzQiLCJhMzUiLCJhMzYiLCJhMzciLCJhMzgiLCJhMzkiLCJhNDAiLCJhNDEiLCJhNDIiLCJhNDMiLCJhNDQiLCJhNDUiLCJhNDYiLCJhNDciLCJhNDgiLCJhNDkiLCJhNTAiLCJhNTEiLCJhNTIiLCJhNTMiLCJhNTQiLCJhNTUiLCJhNTYiLCJhNTciLCJhNTgiLCJhNTkiLCJhNjAiLCJhNjEiLCJhNjIiLCJhNjMiLCJhNjQiLCJhNjUiLCJhNjYiLCJhNjciLCJhNjgiLCJhNjkiLCJhNzAiLCJhNzEiLCJhNzIiLCJhNzMiLCJhNzQiLCJhMjAzIiwiYTc1IiwiYTIwNCIsImE3NiIsImE3NyIsImE3OCIsImE3OSIsImE4MSIsImE4MiIsImE4MyIsImE4NCIsImE5NyIsImE5OCIsImE5OSIsImExMDAiLCJhMTAxIiwiYTEwMiIsImExMDMiLCJhMTA0IiwiYTEwNiIsImExMDciLCJhMTA4IiwiYTExMiIsImExMTEiLCJhMTEwIiwiYTEwOSIsImExMjAiLCJhMTIxIiwiYTEyMiIsImExMjMiLCJhMTI0IiwiYTEyNSIsImExMjYiLCJhMTI3IiwiYTEyOCIsImExMjkiLCJhMTMwIiwiYTEzMSIsImExMzIiLCJhMTMzIiwiYTEzNCIsImExMzUiLCJhMTM2IiwiYTEzNyIsImExMzgiLCJhMTM5IiwiYTE0MCIsImExNDEiLCJhMTQyIiwiYTE0MyIsImExNDQiLCJhMTQ1IiwiYTE0NiIsImExNDciLCJhMTQ4IiwiYTE0OSIsImExNTAiLCJhMTUxIiwiYTE1MiIsImExNTMiLCJhMTU0IiwiYTE1NSIsImExNTYiLCJhMTU3IiwiYTE1OCIsImExNTkiLCJhMTYwIiwiYTE2MSIsImExNjMiLCJhMTY0IiwiYTE5NiIsImExNjUiLCJhMTkyIiwiYTE2NiIsImExNjciLCJhMTY4IiwiYTE2OSIsImExNzAiLCJhMTcxIiwiYTE3MiIsImExNzMiLCJhMTYyIiwiYTE3NCIsImExNzUiLCJhMTc2IiwiYTE3NyIsImExNzgiLCJhMTc5IiwiYTE5MyIsImExODAiLCJhMTk5IiwiYTE4MSIsImEyMDAiLCJhMTgyIiwiYTIwMSIsImExODMiLCJhMTg0IiwiYTE5NyIsImExODUiLCJhMTk0IiwiYTE5OCIsImExODYiLCJhMTk1IiwiYTE4NyIsImExODgiLCJhMTg5IiwiYTE5MCIsImExOTEiLCJhODkiLCJhOTAiLCJhOTMiLCJhOTQiLCJhOTEiLCJhOTIiLCJhMjA1IiwiYTg1IiwiYTIwNiIsImE4NiIsImE4NyIsImE4OCIsImE5NSIsImE5NiIsImV4cG9ydHMiLCJnZXRTdGRGb250TWFwIiwiZ2V0Tm9uU3RkRm9udE1hcCIsImdldFNlcmlmRm9udHMiLCJnZXRTeW1ib2xzRm9udHMiLCJnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMiLCJnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2siLCJnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkiLCJnZXRTcGVjaWFsUFVBU3ltYm9scyIsInVuZGVmaW5lZCIsIm5hbWVMZW4iLCJoZXhTdHIiLCJzdWJzdHJpbmciLCJ0b1VwcGVyQ2FzZSIsIlVuaWNvZGVSYW5nZXMiLCJpc1JUTFJhbmdlRm9yIiwiZ2V0Tm9ybWFsaXplZFVuaWNvZGVzIiwiY2hhcnNMZW5ndGgiLCJjaGFyQ29kZUF0IiwibnVtU3VicnMiLCJnZXRVc2hvcnQiLCJnZXRMb25nIiwiaWRPZmZzZXQiLCJpZERlbHRhIiwiZ3N1YnJzIiwiaXNDRkZDSURGb250IiwiY21kcyIsIm51bWJlck9mQ29udG91cnMiLCJhcmcxIiwiYXJnMiIsInNjYWxlMDEiLCJzY2FsZTEwIiwic3ViZ2x5cGgiLCJjb21waWxlR2x5ZiIsImVuZFB0c09mQ29udG91cnMiLCJpbnN0cnVjdGlvbkxlbmd0aCIsIm51bWJlck9mUG9pbnRzIiwicG9pbnRzIiwic3RhcnRQb2ludCIsImNvbnRvdXIiLCJxdWFkcmF0aWNDdXJ2ZVRvIiwic3RlbXMiLCJzdGFja0NsZWFuIiwieGEiLCJ5YSIsInhiIiwieWIiLCJiZXppZXJDdXJ2ZVRvIiwic3VickNvZGUiLCJnZXRTdWJyb3V0aW5lQmlhcyIsInkzIiwiYWNoYXIiLCJiY2hhciIsImxvb2t1cENtYXAiLCJjb21waWxlQ2hhclN0cmluZyIsIk5PT1AiLCJnZXRQYXRoSnMiLCJjb21waWxlR2x5cGgiLCJjb21waWxlR2x5cGhJbXBsIiwiaGFzQnVpbHRQYXRoIiwiY2ZmSW5mbyIsImdseXBoTmFtZU1hcCIsImNyZWF0ZSIsInBhcnNlQ21hcCIsInBhcnNlQ2ZmIiwicGFyc2VHbHlmVGFibGUiLCJISU5USU5HX0VOQUJMRUQiLCJUeXBlMUNoYXJTdHJpbmciLCJDT01NQU5EX01BUCIsImhzdGVtIiwidnN0ZW0iLCJ2bW92ZXRvIiwicmxpbmV0byIsImhsaW5ldG8iLCJ2bGluZXRvIiwicnJjdXJ2ZXRvIiwiY2FsbHN1YnIiLCJmbGV4IiwiZHJvcCIsImVuZGNoYXIiLCJybW92ZXRvIiwiaG1vdmV0byIsInZoY3VydmV0byIsImh2Y3VydmV0byIsImVuY29kZWQiLCJkeSIsInd4Iiwic2J4IiwiYXNiIiwic2J5IiwibnVtMiIsIm51bTEiLCJmbGV4QXJncyIsImV4ZWN1dGVDb21tYW5kIiwic3RhY2tMZW5ndGgiLCJob3dNYW55QXJncyIsIlR5cGUxUGFyc2VyIiwiRUVYRUNfRU5DUllQVF9LRVkiLCJDSEFSX1NUUlNfRU5DUllQVF9LRVkiLCJkaXNjYXJkTnVtYmVyIiwiYzEiLCJjMiIsImRlY3J5cHRlZCIsImRpZ2l0MSIsImlzSGV4RGlnaXQiLCJkaWdpdDIiLCJpc0JpbmFyeSIsImRlY3J5cHRBc2NpaSIsInJlYWROdW1iZXJBcnJheSIsInJlYWRJbnQiLCJyZWFkQm9vbGVhbiIsImdldFRva2VuIiwiaXNTcGVjaWFsIiwicmVhZENoYXJTdHJpbmdzIiwibGVuSVYiLCJleHRyYWN0Rm9udFByb2dyYW0iLCJwcml2YXRlRGF0YSIsInByb2dyYW0iLCJibHVlQXJyYXkiLCJjaGFyU3RyaW5nIiwiY2hhclN0cmluZ09iamVjdCIsImxzYiIsImV4dHJhY3RGb250SGVhZGVyIiwiZW5jb2RpbmdBcmciLCJTaGFkaW5nVHlwZSIsIkZVTkNUSU9OX0JBU0VEIiwiQVhJQUwiLCJSQURJQUwiLCJGUkVFX0ZPUk1fTUVTSCIsIkxBVFRJQ0VfRk9STV9NRVNIIiwiQ09PTlNfUEFUQ0hfTUVTSCIsIlRFTlNPUl9QQVRDSF9NRVNIIiwiZ2V0UGF0dGVybiIsIlNoYWRpbmdzIiwidDAiLCJkb21haW5BcnIiLCJleHRlbmRTdGFydCIsImV4dGVuZEVuZCIsImV4dGVuZEFyciIsIngxIiwicjEiLCJyMiIsImRpc3RhbmNlIiwiZm5PYmoiLCJOVU1CRVJfT0ZfU0FNUExFUyIsImNvbG9yU3RvcHMiLCJjc3NDb2xvciIsImJhY2tncm91bmQiLCJSYWRpYWxBeGlhbCIsImNvb3Jkc0FyciIsInNoYWRpbmdUeXBlIiwicjAiLCJjc051bUNvbXBzIiwiTWVzaFN0cmVhbVJlYWRlciIsImFsaWduIiwicmVhZEZsYWciLCJyZWFkQ29vcmRpbmF0ZSIsImJpdHNQZXJDb29yZGluYXRlIiwieWkiLCJyZWFkQ29tcG9uZW50cyIsImNpIiwiY29vcmRzIiwibWVzaCIsIm9wZXJhdG9ycyIsInBzIiwidmVydGljZXNMZWZ0IiwiY29vcmQiLCJNSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCIsIk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UIiwiVFJJQU5HTEVfREVOU0lUWSIsImdldEIiLCJsdXQiLCJ0XyIsImJ1aWxkQiIsImZpZ3VyZSIsImZpZ3VyZU1pblgiLCJmaWd1cmVNaW5ZIiwiZmlndXJlTWF4WCIsImZpZ3VyZU1heFkiLCJzcGxpdFhCeSIsInNwbGl0WUJ5IiwidmVydGljZXNQZXJSb3ciLCJmaWd1cmVDb29yZHMiLCJmaWd1cmVDb2xvcnMiLCJjbCIsImNyIiwiYzAiLCJjMyIsImJSb3ciLCJiQ29sIiwibmV3Q29sb3IiLCJ0bXA0IiwibWF4WSIsImNvb3Jkc1BhY2tlZCIsInh5IiwiY29sb3JzUGFja2VkIiwiZmlndXJlcyIsImRlY29kZUNvbnRleHQiLCJiaXRzUGVyRmxhZyIsImNvbG9yRm4iLCJwYXRjaE1lc2giLCJkZWNvZGVUeXBlNFNoYWRpbmciLCJkZWNvZGVUeXBlNVNoYWRpbmciLCJkZWNvZGVUeXBlNlNoYWRpbmciLCJkZWNvZGVUeXBlN1NoYWRpbmciLCJ1cGRhdGVCb3VuZHMiLCJidWlsZEZpZ3VyZUZyb21QYXRjaCIsInBhY2tEYXRhIiwiTWVzaCIsIkR1bW15IiwieHN0ZXAiLCJ5c3RlcCIsInBhaW50VHlwZSIsInRpbGluZ1R5cGUiLCJjYWNoZWRGdW5jdGlvbiIsInBhcnNlZEZ1bmN0aW9uIiwiY3JlYXRlRnJvbUFycmF5IiwiZ2V0Q2FjaGVkIiwiZm5SZWYiLCJsb2NhbEZ1bmN0aW9uIiwiX2NhY2hlIiwiUERGRnVuY3Rpb24iLCJDT05TVFJVQ1RfU0FNUExFRCIsIkNPTlNUUlVDVF9JTlRFUlBPTEFURUQiLCJDT05TVFJVQ1RfU1RJQ0hFRCIsIkNPTlNUUlVDVF9QT1NUU0NSSVBUIiwiZ2V0U2FtcGxlQXJyYXkiLCJzYW1wbGVNdWwiLCJzdHJCeXRlcyIsInN0cklkeCIsInR5cGVGbiIsImZyb21JUiIsIklSIiwicGFyc2VBcnJheSIsImNvbnN0cnVjdFNhbXBsZWQiLCJkb21haW4iLCJ0b051bWJlckFycmF5IiwiaW5wdXRTaXplIiwib3V0cHV0U2l6ZSIsInRvTXVsdGlBcnJheSIsImJwcyIsImVuY29kZSIsInNhbXBsZXMiLCJjb25zdHJ1Y3RTYW1wbGVkRnJvbUlSIiwieW1pbiIsImN1YmVWZXJ0aWNlcyIsImN1YmVOIiwiY3ViZVZlcnRleCIsImRvbWFpbl8yaSIsImRvbWFpbl8yaV8xIiwiaW50ZXJwb2xhdGUiLCJzaXplX2kiLCJlMCIsIm4wIiwibjEiLCJyaiIsImNvbnN0cnVjdEludGVycG9sYXRlZCIsImNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUiIsImNvbnN0cnVjdFN0aWNoZWQiLCJmblJlZnMiLCJmbnMiLCJib3VuZHMiLCJjb25zdHJ1Y3RTdGljaGVkRnJvbUlSIiwiZG1pbiIsImRtYXgiLCJybWluIiwicm1heCIsImNvbnN0cnVjdFBvc3RTY3JpcHQiLCJjb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSIiwibnVtT3V0cHV0cyIsIm51bUlucHV0cyIsIk1BWF9DQUNIRV9TSVpFIiwiY2FjaGVfYXZhaWxhYmxlIiwiY2FjaGVkVmFsdWUiLCJzdGFja0luZGV4IiwiYm91bmQiLCJmbkRpY3QiLCJQb3N0U2NyaXB0U3RhY2siLCJNQVhfU1RBQ0tfU0laRSIsInBvcCIsImNvcHkiLCJyb2xsIiwiUG9zdFNjcmlwdEV2YWx1YXRvciIsImV4ZWN1dGUiLCJjb3VudGVyIiwib3BlcmF0b3IiLCJQb3N0U2NyaXB0Q29tcGlsZXIiLCJBc3ROb2RlIiwiQXN0QXJndW1lbnQiLCJBc3RMaXRlcmFsIiwiQXN0QmluYXJ5T3BlcmF0aW9uIiwiQXN0TWluIiwiQXN0VmFyaWFibGUiLCJBc3RWYXJpYWJsZURlZmluaXRpb24iLCJFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IiLCJ2aXNpdEFyZ3VtZW50IiwidmlzaXRWYXJpYWJsZSIsInZhcmlhYmxlIiwidmlzaXRMaXRlcmFsIiwibGl0ZXJhbCIsInZpc2l0QmluYXJ5T3BlcmF0aW9uIiwidmlzaXRWYXJpYWJsZURlZmluaXRpb24iLCJkZWZpbml0aW9uIiwidmlzaXRNaW4iLCJtYXgiLCJpbnN0cnVjdGlvbnMiLCJsYXN0UmVnaXN0ZXIiLCJidWlsZEFkZE9wZXJhdGlvbiIsImJ1aWxkTXVsT3BlcmF0aW9uIiwiYnVpbGRTdWJPcGVyYXRpb24iLCJhc3QxIiwiYXN0MiIsInRtcFZhciIsImJ1aWxkTWluT3BlcmF0aW9uIiwic3RhdGVtZW50QnVpbGRlciIsImluc3RydWN0aW9uIiwiZXhwciIsIm5leHRUb2tlbiIsImFjY2VwdCIsImV4cGVjdCIsIlBvc3RTY3JpcHRUb2tlblR5cGVzIiwicGFyc2VCbG9jayIsInBhcnNlQ29uZGl0aW9uIiwiY29uZGl0aW9uTG9jYXRpb24iLCJqdW1wTG9jYXRpb24iLCJlbmRPZlRydWUiLCJMQlJBQ0UiLCJSQlJBQ0UiLCJOVU1CRVIiLCJPUEVSQVRPUiIsIklGIiwiSUZFTFNFIiwiUG9zdFNjcmlwdFRva2VuIiwib3BDYWNoZSIsIm9wVmFsdWUiLCJiYXNlVHlwZXMiLCJhcmFiaWNUeXBlcyIsInRlbXAiLCJpc0xUUiIsInN0ckxlbmd0aCIsImNyZWF0ZUJpZGlUZXh0IiwibnVtQmlkaSIsImNoYXJUeXBlIiwic3RhcnRMZXZlbCIsImxldmVscyIsImlzT2RkIiwic29yIiwiZW9yIiwibGFzdFR5cGUiLCJmaW5kVW5lcXVhbCIsImJlZm9yZSIsImFmdGVyIiwic2V0VmFsdWVzIiwiaXNFdmVuIiwiaGlnaGVzdExldmVsIiwibG93ZXN0T2RkTGV2ZWwiLCJyZXZlcnNlVmFsdWVzIiwiZ2V0TWV0cmljcyIsIlNFRUQiLCJNQVNLX0hJR0giLCJNQVNLX0xPVyIsInNlZWQiLCJ1cGRhdGUiLCJibG9ja0NvdW50cyIsInRhaWxMZW5ndGgiLCJkYXRhVWludDMyIiwiazIiLCJDMSIsIkMyIiwiQzFfTE9XIiwiQzJfTE9XIiwiaGV4ZGlnZXN0IiwiaGV4MSIsImhleDIiLCJhZGRlbmQiLCJpc01hc2siLCJpc0luZGV4ZWQiLCJtYXNrRGljdCIsImltYWdlRGF0YSIsInNtYXNrRGF0YSIsIm1hc2tEYXRhIiwiY29tcHV0ZWRMZW5ndGgiLCJoYXZlRnVsbERhdGEiLCJkZWNvZGVCdWZmZXIiLCJkZWNvZGVBZGRlbmRzIiwiZGVjb2RlQ29lZmZpY2llbnRzIiwiZGVjb2RlQW5kQ2xhbXAiLCJnZXRDb21wb25lbnRzIiwiYnVmZmVyUG9zIiwicm93Q29tcHMiLCJsb29wMUVuZCIsImxvb3AyRW5kIiwicmVtYWluaW5nQml0cyIsImZpbGxPcGFjaXR5Iiwic3ciLCJzaCIsImFscGhhQnVmIiwicmVzaXplSW1hZ2VNYXNrIiwib3BhY2l0eSIsImltYWdlT2Zmc2V0IiwibWFza09mZnNldCIsInJnYmFCdWYiLCJ1bmRvUHJlYmxlbmQiLCJtYXR0ZSIsIm1hdHRlUmdiIiwibWF0dGVSIiwibWF0dGVHIiwibWF0dGVCIiwiY3JlYXRlSW1hZ2VEYXRhIiwiZm9yY2VSR0JBIiwiZHJhd1dpZHRoIiwiZHJhd0hlaWdodCIsIm5ld0FycmF5IiwiaW1hZ2VMZW5ndGgiLCJhY3R1YWxIZWlnaHQiLCJtYXliZVVuZG9QcmVibGVuZCIsImZpbGxHcmF5QnVmZmVyIiwiZ2V0SW1hZ2VCeXRlcyIsIkNhbGxiYWNrS2luZCIsIkRBVEEiLCJFUlJPUiIsIlN0cmVhbUtpbmQiLCJDQU5DRUwiLCJDQU5DRUxfQ09NUExFVEUiLCJDTE9TRSIsIkVOUVVFVUUiLCJQVUxMIiwiUFVMTF9DT01QTEVURSIsIlNUQVJUX0NPTVBMRVRFIiwiZXZlbnQiLCJjYWxsYmFja0lkIiwid3JhcFJlYXNvbiIsImNiU291cmNlTmFtZSIsImNiVGFyZ2V0TmFtZSIsImNvbU9iaiIsInNvdXJjZU5hbWUiLCJ0YXJnZXROYW1lIiwiYWgiLCJzZW5kV2l0aFByb21pc2UiLCJzZW5kV2l0aFN0cmVhbSIsInN0cmVhbUlkIiwiY29udHJvbGxlciIsInN0YXJ0Q2FwYWJpbGl0eSIsInN0YXJ0Q2FsbCIsInB1bGxDYWxsIiwiY2FuY2VsQ2FsbCIsImlzQ2xvc2VkIiwiZGVzaXJlZFNpemUiLCJwdWxsIiwicHVsbENhcGFiaWxpdHkiLCJjYW5jZWwiLCJjYW5jZWxDYXBhYmlsaXR5IiwiX2NyZWF0ZVN0cmVhbVNpbmsiLCJsYXN0RGVzaXJlZFNpemUiLCJjbG9zZSIsInNpbmtDYXBhYmlsaXR5Iiwib25QdWxsIiwib25DYW5jZWwiLCJpc0NhbmNlbGxlZCIsInJlYWR5Iiwic3VjY2VzcyIsIl9wcm9jZXNzU3RyZWFtTWVzc2FnZSIsIl9wb3N0TWVzc2FnZSIsImRlc3Ryb3kiLCJnZXRGdWxsUmVhZGVyIiwiZ2V0UmFuZ2VSZWFkZXIiLCJjYW5jZWxBbGxSZXF1ZXN0cyIsInJlYWRlcnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlD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QztBQUFBLENBRGMsRUFFZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBdUJDLFFBQXZCO0FBQWdDQyxjQUFoQztBQUFBLENBRmMsRUFHZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBdUJDLFFBQXZCO0FBQWdDQyxjQUFoQztBQUFBLENBSGMsRUFJZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBdUJDLFFBQXZCO0FBQWlDQyxjQUFqQztBQUFBLENBSmMsRUFLZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBdUJDLFFBQXZCO0FBQWlDQyxjQUFqQztBQUFBLENBTGMsRUFNZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBd0JDLFFBQXhCO0FBQWtDQyxjQUFsQztBQUFBLENBTmMsRUFPZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBdUJDLFFBQXZCO0FBQWdDQyxjQUFoQztBQUFBLENBUGMsRUFRZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBdUJDLFFBQXZCO0FBQWlDQyxjQUFqQztBQUFBLENBUmMsRUFTZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBdUJDLFFBQXZCO0FBQWlDQyxjQUFqQztBQUFBLENBVGMsRUFVZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBd0JDLFFBQXhCO0FBQWtDQyxjQUFsQztBQUFBLENBVmMsRUFXZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBd0JDLFFBQXhCO0FBQWtDQyxjQUFsQztBQUFBLENBWGMsRUFZZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBd0JDLFFBQXhCO0FBQWtDQyxjQUFsQztBQUFBLENBWmMsRUFhZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBd0JDLFFBQXhCO0FBQWtDQyxjQUFsQztBQUFBLENBYmMsRUFjZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBd0JDLFFBQXhCO0FBQWtDQyxjQUFsQztBQUFBLENBZGMsRUFlZDtBQUFFSCxNQUFGO0FBQWNDLFFBQWQ7QUFBd0JDLFFBQXhCO0FBQWtDQyxjQUFsQztBQUFBLENBZmMsRUFnQmQ7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cUUsRUEwQ3JFQTtBQUNBQSxVQTNDcUUsRUEyQ3JFQTtBQUNBQSxVQTVDcUUsRUE0Q3JFQTtBQUNBQSxVQTdDcUUsRUE2Q3JFQTtBQUNBQSxVQTlDcUUsRUE4Q3JFQTtBQUNBQSxVQS9DcUUsRUErQ3JFQTtBQUNBQSxVQWhEcUUsRUFnRHJFQTtBQUNBQSxVQWpEcUUsRUFpRHJFQTtBQUNBQSxVQWxEcUUsRUFrRHJFQTtBQUNBQSxVQW5EcUUsRUFtRHJFQTtBQUNBQSxVQXBEcUUsRUFvRHJFQTtBQUNBQSxVQXJEcUUsRUFxRHJFQTtBQUNBQSxVQXREcUUsRUFzRHJFQTtBQUNBQSxVQXZEcUUsRUF1RHJFQTtBQUNBQSxVQXhEcUUsRUF3RHJFQTtBQUNBQSxVQXpEcUUsRUF5RHJFQTtBQUNBQSxVQTFEcUUsRUEwRHJFQTtBQUNBQSxVQTNEcUUsRUEyRHJFQTtBQUNBQSxVQTVEcUUsRUE0RHJFQTtBQUNBQSxVQTdEcUUsRUE2RHJFQTtBQUNBQSxVQTlEcUUsRUE4RHJFQTtBQUNBQSxVQS9EcUUsRUErRHJFQTtBQUNBQSxVQWhFcUUsRUFnRXJFQTtBQUNBQSxVQWpFcUUsRUFpRXJFQTtBQUNBQSxVQWxFcUUsRUFrRXJFQTtBQUNBQSxVQW5FcUUsRUFtRXJFQTtBQUNBQSxVQXBFcUUsRUFvRXJFQTtBQUNBQSxVQXJFcUUsRUFxRXJFQTtBQUNBQSxVQXRFcUUsR0FzRXJFQTtBQUNBQSxVQXZFcUUsR0F1RXJFQTtBQUNBQSxVQXhFcUUsR0F3RXJFQTtBQUNBQSxVQXpFcUUsR0F5RXJFQTtBQUNBQSxVQTFFcUUsR0EwRXJFQTtBQUNBQSxVQTNFcUUsR0EyRXJFQTtBQUNBQSxVQTVFcUUsR0E0RXJFQTtBQUNBQSxVQTdFcUUsR0E2RXJFQTtBQUNBQSxVQTlFcUUsR0E4RXJFQTtBQUNBQSxVQS9FcUUsR0ErRXJFQTtBQUNBQSxVQWhGcUUsR0FnRnJFQTtBQUNBQSxVQWpGcUUsR0FpRnJFQTtBQUNBQSxVQWxGcUUsR0FrRnJFQTtBQUNBQSxVQW5GcUUsR0FtRnJFQTtBQUNBQSxVQXBGcUUsR0FvRnJFQTtBQUNBQSxVQXJGcUUsR0FxRnJFQTtBQUNBQSxVQXRGcUUsR0FzRnJFQTtBQUNBQSxVQXZGcUUsR0F1RnJFQTtBQUNBQSxVQXhGcUUsR0F3RnJFQTtBQUNBQSxVQXpGcUUsR0F5RnJFQTtBQUNBQSxVQTFGcUUsR0EwRnJFQTtBQUNBQSxVQTNGcUUsR0EyRnJFQTtBQUNBQSxVQTVGcUUsR0E0RnJFQTtBQUNBQSxVQTdGcUUsR0E2RnJFQTtBQUNBQSxVQTlGcUUsR0E4RnJFQTtBQUNBQSxVQS9GcUUsR0ErRnJFQTtBQUNBQSxVQWhHcUUsR0FnR3JFQTtBQUNBQSxVQWpHcUUsR0FpR3JFQTtBQUNBQSxVQWxHcUUsR0FrR3JFQTtBQUNBQSxXQW5HcUUsR0FtR3JFQTtBQUNBQSxXQXBHcUUsR0FvR3JFQTtBQUNBQSxXQXJHcUUsR0FxR3JFQTtBQUNBQSxXQXRHcUUsR0FzR3JFQTtBQUNBQSxXQXZHcUUsR0F1R3JFQTtBQUNBQSxXQXhHcUUsR0F3R3JFQTtBQUNBQSxXQXpHcUUsR0F5R3JFQTtBQUNBQSxXQTFHcUUsR0EwR3JFQTtBQUNBQSxXQTNHcUUsR0EyR3JFQTtBQUNBQSxXQTVHcUUsR0E0R3JFQTtBQUNBQSxXQTdHcUUsR0E2R3JFQTtBQUNBQSxXQTlHcUUsR0E4R3JFQTtBQUNBQSxXQS9HcUUsR0ErR3JFQTtBQUNBQSxXQWhIcUUsR0FnSHJFQTtBQUNBQSxXQWpIcUUsR0FpSHJFQTtBQUNBQSxXQWxIcUUsR0FrSHJFQTtBQUNBQSxXQW5IcUUsR0FtSHJFQTtBQUNBQSxXQXBIcUUsR0FvSHJFQTtBQUNBQSxXQXJIcUUsR0FxSHJFQTtBQUNBQSxXQXRIcUUsR0FzSHJFQTtBQUNBQSxXQXZIcUUsR0F1SHJFQTtBQUNBQSxXQXhIcUUsR0F3SHJFQTtBQUNBQSxXQXpIcUUsR0F5SHJFQTtBQUNBQSxXQTFIcUUsR0EwSHJFQTtBQUNBQSxXQTNIcUUsR0EySHJFQTtBQUNBQSxXQTVIcUUsR0E0SHJFQTtBQUNBQSxXQTdIcUUsR0E2SHJFQTtBQUNBQSxXQTlIcUUsR0E4SHJFQTtBQUNBQSxXQS9IcUUsR0ErSHJFQTtBQUNBQSxXQWhJcUUsR0FnSXJFQTtBQUNBQSxXQWpJcUUsSUFpSXJFQTtBQUNBQSxXQWxJcUUsR0FrSXJFQTtBQUNBQSxXQW5JcUUsR0FtSXJFQTtBQUNBQSxXQXBJcUUsR0FvSXJFQTtBQUNBQSxXQXJJcUUsR0FxSXJFQTtBQUNBQSxXQXRJcUUsSUFzSXJFQTtBQUNBQSxXQXZJcUUsR0F1SXJFQTtBQUNBQSxXQXhJcUUsR0F3SXJFQTtBQUNBQSxXQXpJcUUsR0F5SXJFQTtBQUNBQSxXQTFJcUUsR0EwSXJFQTtBQUNBQSxXQTNJcUUsSUEySXJFQTtBQUNBQSxXQTVJcUUsR0E0SXJFQTtBQUNBQSxXQTdJcUUsR0E2SXJFQTtBQUNBQSxXQTlJcUUsSUE4SXJFQTtBQUNBQSxXQS9JcUUsR0ErSXJFQTtBQUNBQSxXQWhKcUUsR0FnSnJFQTtBQUNBQSxXQWpKcUUsSUFpSnJFQTtBQUNBQSxXQWxKcUUsR0FrSnJFQTtBQUNBQSxXQW5KcUUsSUFtSnJFQTtBQUNBQSxXQXBKcUUsSUFvSnJFQTtBQUNBQSxXQXJKcUUsR0FxSnJFQTtBQUNBQSxXQXRKcUUsR0FzSnJFQTtBQUNBQSxXQXZKcUUsSUF1SnJFQTtBQUNBQSxXQXhKcUUsSUF3SnJFQTtBQUNBQSxXQXpKcUUsSUF5SnJFQTtBQUNBQSxXQTFKcUUsSUEwSnJFQTtBQUNBQSxXQTNKcUUsR0EySnJFQTtBQUNBQSxXQTVKcUUsR0E0SnJFQTtBQUNBQSxXQTdKcUUsSUE2SnJFQTtBQUNBQSxXQTlKcUUsR0E4SnJFQTtBQUNBQSxXQS9KcUUsR0ErSnJFQTtBQUNBQSxXQWhLcUUsR0FnS3JFQTtBQUNBQSxXQWpLcUUsR0FpS3JFQTtBQUNBQSxXQWxLcUUsR0FrS3JFQTtBQUNBQSxXQW5LcUUsSUFtS3JFQTtBQUNBQSxXQXBLcUUsR0FvS3JFQTtBQUNBQSxXQXJLcUUsSUFxS3JFQTtBQUNBQSxXQXRLcUUsSUFzS3JFQTtBQUNBQSxXQXZLcUUsR0F1S3JFQTtBQUNBQSxXQXhLcUUsR0F3S3JFQTtBQUNBQSxXQXpLcUUsSUF5S3JFQTtBQUNBQSxXQTFLcUUsR0EwS3JFQTtBQUNBQSxXQTNLcUUsR0EyS3JFQTtBQUNBQSxXQTVLcUUsR0E0S3JFQTtBQUNBQSxXQTdLcUUsR0E2S3JFQTtBQUNBQSxXQTlLcUUsR0E4S3JFQTtBQUNBQSxXQS9LcUUsR0ErS3JFQTtBQUNBQSxXQWhMcUUsR0FnTHJFQTtBQUNBQSxXQWpMcUUsR0FpTHJFQTtBQUNBQSxXQWxMcUUsR0FrTHJFQTtBQUNBQSxXQW5McUUsR0FtTHJFQTtBQUNBQSxXQXBMcUUsR0FvTHJFQTtBQUNBQSxXQXJMcUUsR0FxTHJFQTtBQUNBQSxXQXRMcUUsR0FzTHJFQTtBQUNBQSxXQXZMcUUsR0F1THJFQTtBQUNBQSxXQXhMcUUsR0F3THJFQTtBQUNBQSxXQXpMcUUsR0F5THJFQTtBQUNBQSxXQTFMcUUsR0EwTHJFQTtBQUNBQSxXQTNMcUUsR0EyTHJFQTtBQUNBQSxXQTVMcUUsR0E0THJFQTtBQUNBQSxXQTdMcUUsR0E2THJFQTtBQUNBQSxXQTlMcUUsR0E4THJFQTtBQUNBQSxXQS9McUUsR0ErTHJFQTtBQUNBQSxXQWhNcUUsR0FnTXJFQTtBQUNBQSxXQWpNcUUsR0FpTXJFQTtBQUNBQSxXQWxNcUUsR0FrTXJFQTtBQUNBQSxXQW5NcUUsR0FtTXJFQTtBQUNBQSxXQXBNcUUsR0FvTXJFQTtBQUNBQSxXQXJNcUUsR0FxTXJFQTtBQUNBQSxXQXRNcUUsR0FzTXJFQTtBQUNBQSxXQXZNcUUsR0F1TXJFQTtBQUNBQSxXQXhNcUUsSUF3TXJFQTtBQUNBQSxXQXpNcUUsSUF5TXJFQTtBQUNBQSxXQTFNcUUsSUEwTXJFQTtBQUNBQSxXQTNNcUUsSUEyTXJFQTtBQUNBQSxXQTVNcUUsSUE0TXJFQTtBQUNBQSxXQTdNcUUsSUE2TXJFQTtBQUNBQSxXQTlNcUUsSUE4TXJFQTtBQUNBQSxXQS9NcUUsSUErTXJFQTtBQUNBQSxXQWhOcUUsSUFnTnJFQTtBQUNBQSxXQWpOcUUsSUFpTnJFQTtBQUNBQSxXQWxOcUUsSUFrTnJFQTtBQUNBQSxXQW5OcUUsS0FtTnJFQTtBQUNBQSxXQXBOcUUsS0FvTnJFQTtBQUNBQSxXQXJOcUUsSUFxTnJFQTtBQUNBQSxXQXROcUUsSUFzTnJFQTtBQUNBQSxXQXZOcUUsSUF1TnJFQTtBQUNBQSxXQXhOcUUsSUF3TnJFQTtBQUNBQSxXQXpOcUUsSUF5TnJFQTtBQUNBQSxXQTFOcUUsSUEwTnJFQTtBQUNBQSxXQTNOcUUsSUEyTnJFQTtBQUNBQSxXQTVOcUUsSUE0TnJFQTtBQUNBQSxXQTdOcUUsR0E2TnJFQTtBQUNBQSxXQTlOcUUsS0E4TnJFQTtBQUNBQSxXQS9OcUUsSUErTnJFQTtBQUNBQSxXQWhPcUUsSUFnT3JFQTtBQUNBQSxXQWpPcUUsR0FpT3JFQTtBQUNBQSxXQWxPcUUsR0FrT3JFQTtBQUNBQSxXQW5PcUUsR0FtT3JFQTtBQUNBQSxXQXBPcUUsR0FvT3JFQTtBQUNBQSxXQXJPcUUsS0FxT3JFQTtBQUNBQSxXQXRPcUUsS0FzT3JFQTtBQUNBQSxXQXZPcUUsS0F1T3JFQTtBQUNBQSxXQXhPcUUsS0F3T3JFQTtBQUNBQSxXQXpPcUUsS0F5T3JFQTtBQUNBQSxXQTFPcUUsS0EwT3JFQTtBQUNBQSxXQTNPcUUsS0EyT3JFQTtBQUNBQSxXQTVPcUUsS0E0T3JFQTtBQUNBQSxXQTdPcUUsS0E2T3JFQTtBQUNBQSxZQTlPcUUsSUE4T3JFQTtBQUNBQSxZQS9PcUUsSUErT3JFQTtBQUNBQSxZQWhQcUUsSUFnUHJFQTtBQUNBQSxZQWpQcUUsSUFpUHJFQTtBQUNBQSxZQWxQcUUsSUFrUHJFQTtBQUNBQSxZQW5QcUUsSUFtUHJFQTtBQUNBQSxZQXBQcUUsSUFvUHJFQTtBQUNBQSxZQXJQcUUsSUFxUHJFQTtBQUNBQSxZQXRQcUUsSUFzUHJFQTtBQUNBQSxZQXZQcUUsSUF1UHJFQTtBQUNBQSxZQXhQcUUsSUF3UHJFQTtBQUNBQSxZQXpQcUUsR0F5UHJFQTtBQUNBQSxZQTFQcUUsR0EwUHJFQTtBQUNBQSxZQTNQcUUsR0EyUHJFQTtBQUNBQSxZQTVQcUUsR0E0UHJFQTtBQUNBQSxZQTdQcUUsR0E2UHJFQTtBQUNBQSxZQTlQcUUsR0E4UHJFQTtBQUNBQSxZQS9QcUUsR0ErUHJFQTtBQUNBQSxZQWhRcUUsR0FnUXJFQTtBQUNBQSxZQWpRcUUsR0FpUXJFQTtBQUNBQSxZQWxRcUUsR0FrUXJFQTtBQUNBQSxZQW5RcUUsR0FtUXJFQTtBQUNBQSxZQXBRcUUsR0FvUXJFQTtBQUNBQSxZQXJRcUUsR0FxUXJFQTtBQUNBQSxZQXRRcUUsR0FzUXJFQTtBQUNBQSxZQXZRcUUsSUF1UXJFQTtBQUNBQSxZQXhRcUUsSUF3UXJFQTtBQUNBQSxZQXpRcUUsSUF5UXJFQTtBQUNBQSxZQTFRcUUsSUEwUXJFQTtBQUNBQSxZQTNRcUUsSUEyUXJFQTtBQUNBQSxZQTVRcUUsSUE0UXJFQTtBQUNBQSxZQTdRcUUsSUE2UXJFQTtBQUNBQSxZQTlRcUUsSUE4UXJFQTtBQUNBQSxZQS9RcUUsSUErUXJFQTtBQUNBQSxZQWhScUUsSUFnUnJFQTtBQUNBQSxZQWpScUUsSUFpUnJFQTtBQUNBQSxZQWxScUUsSUFrUnJFQTtBQUNBQSxZQW5ScUUsSUFtUnJFQTtBQUNBQSxZQXBScUUsSUFvUnJFQTtBQUNBQSxZQXJScUUsSUFxUnJFQTtBQUNBQSxZQXRScUUsSUFzUnJFQTtBQUNBQSxZQXZScUUsSUF1UnJFQTtBQUNBQSxZQXhScUUsSUF3UnJFQTtBQUNBQSxZQXpScUUsSUF5UnJFQTtBQUNBQSxZQTFScUUsSUEwUnJFQTtBQUNBQSxZQTNScUUsSUEyUnJFQTtBQUNBQSxZQTVScUUsSUE0UnJFQTtBQUNBQSxZQTdScUUsSUE2UnJFQTtBQUNBQSxZQTlScUUsSUE4UnJFQTtBQUNBQSxZQS9ScUUsSUErUnJFQTtBQUNBQSxZQWhTcUUsSUFnU3JFQTtBQUNBQSxZQWpTcUUsSUFpU3JFQTtBQUNBQSxZQWxTcUUsSUFrU3JFQTtBQUNBQSxZQW5TcUUsSUFtU3JFQTtBQUNBQSxZQXBTcUUsSUFvU3JFQTtBQUNBQSxZQXJTcUUsSUFxU3JFQTtBQUNBQSxZQXRTcUUsSUFzU3JFQTtBQUNBQSxZQXZTcUUsSUF1U3JFQTtBQUNBQSxZQXhTcUUsSUF3U3JFQTtBQUNBQSxZQXpTcUUsSUF5U3JFQTtBQUNBQSxZQTFTcUUsSUEwU3JFQTtBQUNBQSxZQTNTcUUsSUEyU3JFQTtBQUNBQSxZQTVTcUUsSUE0U3JFQTtBQUNBQSxZQTdTcUUsSUE2U3JFQTtBQUNBQSxZQTlTcUUsSUE4U3JFQTtBQUNBQSxZQS9TcUUsSUErU3JFQTtBQUNBQSxZQWhUcUUsSUFnVHJFQTtBQUNBQSxZQWpUcUUsSUFpVHJFQTtBQUNBQSxZQWxUcUUsSUFrVHJFQTtBQUNBQSxZQW5UcUUsSUFtVHJFQTtBQUNBQSxZQXBUcUUsSUFvVHJFQTtBQUNBQSxZQXJUcUUsSUFxVHJFQTtBQUNBQSxZQXRUcUUsSUFzVHJFQTtBQUNBQSxZQXZUcUUsSUF1VHJFQTtBQUNBQSxZQXhUcUUsSUF3VHJFQTtBQUNBQSxZQXpUcUUsSUF5VHJFQTtBQUNBQSxZQTFUcUUsSUEwVHJFQTtBQUNBQSxZQTNUcUUsSUEyVHJFQTtBQUNBQSxZQTVUcUUsSUE0VHJFQTtBQUNBQSxZQTdUcUUsSUE2VHJFQTtBQUNBQSxZQTlUcUUsSUE4VHJFQTtBQUNBQSxZQS9UcUUsSUErVHJFQTtBQUNBQSxZQWhVcUUsSUFnVXJFQTtBQUNBQSxZQWpVcUUsSUFpVXJFQTtBQUNBQSxZQWxVcUUsSUFrVXJFQTtBQUNBQSxZQW5VcUUsSUFtVXJFQTtBQUNBQSxZQXBVcUUsSUFvVXJFQTtBQUNBQSxZQXJVcUUsSUFxVXJFQTtBQUNBQSxZQXRVcUUsSUFzVXJFQTtBQUNBQSxZQXZVcUUsSUF1VXJFQTtBQUNBQSxZQXhVcUUsS0F3VXJFQTtBQUNBQSxZQXpVcUUsS0F5VXJFQTtBQUNBQSxZQTFVcUUsS0EwVXJFQTtBQUNBQSxZQTNVcUUsS0EyVXJFQTtBQUNBQSxZQTVVcUUsS0E0VXJFQTtBQUNBQSxZQTdVcUUsS0E2VXJFQTtBQUNBQSxZQTlVcUUsSUE4VXJFQTtBQUNBQSxZQS9VcUUsSUErVXJFQTtBQUNBQSxZQWhWcUUsSUFnVnJFQTtBQUNBQSxZQWpWcUUsSUFpVnJFQTtBQUNBQSxZQWxWcUUsSUFrVnJFQTtBQUNBQSxZQW5WcUUsSUFtVnJFQTtBQUNBQSxZQXBWcUUsSUFvVnJFQTtBQUNBQSxZQXJWcUUsSUFxVnJFQTtBQUNBQSxZQXRWcUUsSUFzVnJFQTtBQUNBQSxZQXZWcUUsSUF1VnJFQTtBQUNBQSxZQXhWcUUsSUF3VnJFQTtBQUNBQSxZQXpWcUUsSUF5VnJFQTtBQUNBQSxZQTFWcUUsSUEwVnJFQTtBQUNBQSxZQTNWcUUsSUEyVnJFQTtBQUNBQSxZQTVWcUUsSUE0VnJFQTtBQUNBQSxZQTdWcUUsSUE2VnJFQTtBQUNBQSxZQTlWcUUsSUE4VnJFQTtBQUNBQSxZQS9WcUUsSUErVnJFQTtBQUNBQSxZQWhXcUUsSUFnV3JFQTtBQUNBQSxZQWpXcUUsSUFpV3JFQTtBQUNBQSxZQWxXcUUsSUFrV3JFQTtBQUNBQSxZQW5XcUUsSUFtV3JFQTtBQUNBQSxZQXBXcUUsSUFvV3JFQTtBQUNBQSxZQXJXcUUsSUFxV3JFQTtBQUNBQSxZQXRXcUUsSUFzV3JFQTtBQUNBQSxZQXZXcUUsSUF1V3JFQTtBQUNBQSxZQXhXcUUsSUF3V3JFQTtBQUNBQSxZQXpXcUUsSUF5V3JFQTtBQUNBQSxZQTFXcUUsSUEwV3JFQTtBQUNBQSxZQTNXcUUsSUEyV3JFQTtBQUNBQSxZQTVXcUUsSUE0V3JFQTtBQUNBQSxZQTdXcUUsSUE2V3JFQTtBQUNBQSxZQTlXcUUsSUE4V3JFQTtBQUNBQSxZQS9XcUUsSUErV3JFQTtBQUNBQSxZQWhYcUUsSUFnWHJFQTtBQUNBQSxZQWpYcUUsSUFpWHJFQTtBQUNBQSxZQWxYcUUsSUFrWHJFQTtBQUNBQSxZQW5YcUUsSUFtWHJFQTtBQUNBQSxZQXBYcUUsSUFvWHJFQTtBQUNBQSxZQXJYcUUsSUFxWHJFQTtBQUNBQSxZQXRYcUUsSUFzWHJFQTtBQUNBQSxZQXZYcUUsR0F1WHJFQTtBQUNBQSxZQXhYcUUsR0F3WHJFQTtBQUNBQSxZQXpYcUUsR0F5WHJFQTtBQUNBQSxZQTFYcUUsR0EwWHJFQTtBQUNBQSxZQTNYcUUsR0EyWHJFQTtBQUNBQSxZQTVYcUUsR0E0WHJFQTtBQUNBQSxZQTdYcUUsR0E2WHJFQTtBQUNBQSxZQTlYcUUsR0E4WHJFQTtBQUNBQSxZQS9YcUUsSUErWHJFQTtBQUNBQSxZQWhZcUUsSUFnWXJFQTtBQUNBQSxZQWpZcUUsSUFpWXJFQTtBQUNBQSxZQWxZcUUsSUFrWXJFQTtBQUNBQSxZQW5ZcUUsSUFtWXJFQTtBQUNBQSxZQXBZcUUsSUFvWXJFQTtBQUNBQSxZQXJZcUUsS0FxWXJFQTtBQUNBQSxZQXRZcUUsR0FzWXJFQTtBQUNBQSxZQXZZcUUsS0F1WXJFQTtBQUNBQSxZQXhZcUUsSUF3WXJFQTtBQUNBQSxZQXpZcUUsSUF5WXJFQTtBQXRwQkYsQ0E2UW9DLENBQXBDOztBQStZQSxNQUFNaWtOLHVDQUF1Qyx1Q0FBc0IsYUFFakU7QUFDQWprTixXQURBLEdBQ0FBO0FBQ0FBLFdBRkEsR0FFQUE7QUFDQUEsV0FIQSxHQUdBQTtBQWpxQkYsQ0E0cEI2QyxDQUE3Qzs7QUFXQSxNQUFNa2tOLG9DQUFvQyx1Q0FBc0IsYUFBYTtBQUMzRWxrTixTQUQyRSxFQUMzRUE7QUFDQUEsU0FGMkUsRUFFM0VBO0FBQ0FBLFVBSDJFLEVBRzNFQTtBQUNBQSxVQUoyRSxFQUkzRUE7QUFDQUEsVUFMMkUsRUFLM0VBO0FBQ0FBLFVBTjJFLEVBTTNFQTtBQUNBQSxVQVAyRSxFQU8zRUE7QUFDQUEsVUFSMkUsRUFRM0VBO0FBQ0FBLFVBVDJFLEVBUzNFQTtBQUNBQSxVQVYyRSxFQVUzRUE7QUFDQUEsVUFYMkUsRUFXM0VBO0FBQ0FBLFVBWjJFLEVBWTNFQTtBQUNBQSxVQWIyRSxFQWEzRUE7QUFDQUEsVUFkMkUsRUFjM0VBO0FBQ0FBLFVBZjJFLEVBZTNFQTtBQUNBQSxVQWhCMkUsRUFnQjNFQTtBQUNBQSxVQWpCMkUsRUFpQjNFQTtBQUNBQSxVQWxCMkUsRUFrQjNFQTtBQUNBQSxVQW5CMkUsRUFtQjNFQTtBQUNBQSxVQXBCMkUsRUFvQjNFQTtBQUNBQSxXQXJCMkUsRUFxQjNFQTtBQUNBQSxXQXRCMkUsRUFzQjNFQTtBQUNBQSxXQXZCMkUsRUF1QjNFQTtBQUNBQSxXQXhCMkUsRUF3QjNFQTtBQUNBQSxXQXpCMkUsRUF5QjNFQTtBQUNBQSxXQTFCMkUsRUEwQjNFQTtBQUNBQSxXQTNCMkUsRUEyQjNFQTtBQUNBQSxXQTVCMkUsRUE0QjNFQTtBQUNBQSxXQTdCMkUsR0E2QjNFQTtBQUNBQSxXQTlCMkUsRUE4QjNFQTtBQUNBQSxXQS9CMkUsRUErQjNFQTtBQUNBQSxXQWhDMkUsR0FnQzNFQTtBQUNBQSxXQWpDMkUsR0FpQzNFQTtBQUNBQSxXQWxDMkUsR0FrQzNFQTtBQUNBQSxXQW5DMkUsR0FtQzNFQTtBQUNBQSxXQXBDMkUsR0FvQzNFQTtBQUNBQSxXQXJDMkUsR0FxQzNFQTtBQUNBQSxXQXRDMkUsR0FzQzNFQTtBQUNBQSxXQXZDMkUsR0F1QzNFQTtBQUNBQSxXQXhDMkUsR0F3QzNFQTtBQUNBQSxXQXpDMkUsR0F5QzNFQTtBQUNBQSxXQTFDMkUsR0EwQzNFQTtBQUNBQSxXQTNDMkUsR0EyQzNFQTtBQUNBQSxXQTVDMkUsR0E0QzNFQTtBQUNBQSxXQTdDMkUsR0E2QzNFQTtBQUNBQSxXQTlDMkUsR0E4QzNFQTtBQUNBQSxXQS9DMkUsR0ErQzNFQTtBQUNBQSxXQWhEMkUsR0FnRDNFQTtBQUNBQSxXQWpEMkUsR0FpRDNFQTtBQUNBQSxXQWxEMkUsR0FrRDNFQTtBQUNBQSxXQW5EMkUsR0FtRDNFQTtBQUNBQSxXQXBEMkUsR0FvRDNFQTtBQUNBQSxXQXJEMkUsR0FxRDNFQTtBQUNBQSxXQXREMkUsR0FzRDNFQTtBQUNBQSxXQXZEMkUsR0F1RDNFQTtBQUNBQSxXQXhEMkUsR0F3RDNFQTtBQUNBQSxXQXpEMkUsR0F5RDNFQTtBQUNBQSxXQTFEMkUsR0EwRDNFQTtBQUNBQSxXQTNEMkUsR0EyRDNFQTtBQUNBQSxXQTVEMkUsR0E0RDNFQTtBQUNBQSxXQTdEMkUsRUE2RDNFQTtBQUNBQSxXQTlEMkUsRUE4RDNFQTtBQUNBQSxXQS9EMkUsRUErRDNFQTtBQUNBQSxXQWhFMkUsRUFnRTNFQTtBQUNBQSxXQWpFMkUsRUFpRTNFQTtBQUNBQSxXQWxFMkUsRUFrRTNFQTtBQUNBQSxXQW5FMkUsRUFtRTNFQTtBQUNBQSxXQXBFMkUsRUFvRTNFQTtBQUNBQSxXQXJFMkUsRUFxRTNFQTtBQUNBQSxXQXRFMkUsRUFzRTNFQTtBQUNBQSxXQXZFMkUs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QUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXJCa0I7QUFBQSxDQXNCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXRCa0I7QUFBQSxDQXVCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXZCa0I7QUFBQSxDQXdCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXhCa0I7QUFBQSxDQXlCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXpCa0I7QUFBQSxDQTBCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTFCa0I7QUFBQSxDQTJCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTNCa0I7QUFBQSxDQTRCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTVCa0I7QUFBQSxDQTZCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTdCa0I7QUFBQSxDQThCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTlCa0I7QUFBQSxDQStCbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQS9Ca0I7QUFBQSxDQWdDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWhDa0I7QUFBQSxDQWlDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWpDa0I7QUFBQSxDQWtDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWxDa0I7QUFBQSxDQW1DbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQW5Da0I7QUFBQSxDQW9DbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXBDa0I7QUFBQSxDQXFDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXJDa0I7QUFBQSxDQXNDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXRDa0I7QUFBQSxDQXVDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXZDa0I7QUFBQSxDQXdDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXhDa0I7QUFBQSxDQXlDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXpDa0I7QUFBQSxDQTBDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTFDa0I7QUFBQSxDQTJDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTNDa0I7QUFBQSxDQTRDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTVDa0I7QUFBQSxDQTZDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTdDa0I7QUFBQSxDQThDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTlDa0I7QUFBQSxDQStDbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQS9Da0I7QUFBQSxDQWdEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWhEa0I7QUFBQSxDQWlEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWpEa0I7QUFBQSxDQWtEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWxEa0I7QUFBQSxDQW1EbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQW5Ea0I7QUFBQSxDQW9EbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXBEa0I7QUFBQSxDQXFEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXJEa0I7QUFBQSxDQXNEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXREa0I7QUFBQSxDQXVEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXZEa0I7QUFBQSxDQXdEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXhEa0I7QUFBQSxDQXlEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXpEa0I7QUFBQSxDQTBEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTFEa0I7QUFBQSxDQTJEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTNEa0I7QUFBQSxDQTREbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTVEa0I7QUFBQSxDQTZEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTdEa0I7QUFBQSxDQThEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTlEa0I7QUFBQSxDQStEbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQS9Ea0I7QUFBQSxDQWdFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWhFa0I7QUFBQSxDQWlFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWpFa0I7QUFBQSxDQWtFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWxFa0I7QUFBQSxDQW1FbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQW5Fa0I7QUFBQSxDQW9FbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXBFa0I7QUFBQSxDQXFFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXJFa0I7QUFBQSxDQXNFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXRFa0I7QUFBQSxDQXVFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXZFa0I7QUFBQSxDQXdFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXhFa0I7QUFBQSxDQXlFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXpFa0I7QUFBQSxDQTBFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTFFa0I7QUFBQSxDQTJFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTNFa0I7QUFBQSxDQTRFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTVFa0I7QUFBQSxDQTZFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTdFa0I7QUFBQSxDQThFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTlFa0I7QUFBQSxDQStFbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQS9Fa0I7QUFBQSxDQWdGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWhGa0I7QUFBQSxDQWlGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWpGa0I7QUFBQSxDQWtGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWxGa0I7QUFBQSxDQW1GbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQW5Ga0I7QUFBQSxDQW9GbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXBGa0I7QUFBQSxDQXFGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXJGa0I7QUFBQSxDQXNGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQXRGa0I7QUFBQSxDQXVGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQXZGa0I7QUFBQSxDQXdGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQXhGa0I7QUFBQSxDQXlGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQXpGa0I7QUFBQSxDQTBGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTFGa0I7QUFBQSxDQTJGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTNGa0I7QUFBQSxDQTRGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTVGa0I7QUFBQSxDQTZGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTdGa0I7QUFBQSxDQThGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQTlGa0I7QUFBQSxDQStGbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQS9Ga0I7QUFBQSxDQWdHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWhHa0I7QUFBQSxDQWlHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWpHa0I7QUFBQSxDQWtHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQWxHa0I7QUFBQSxDQW1HbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQW5Ha0I7QUFBQSxDQW9HbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXBHa0I7QUFBQSxDQXFHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFBdEI7QUFBQSxFQXJHa0I7QUFBQSxDQXNHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQXRHa0I7QUFBQSxDQXVHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQXZHa0I7QUFBQSxDQXdHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQXhHa0I7QUFBQSxDQXlHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQXpHa0I7QUFBQSxDQTBHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTFHa0I7QUFBQSxDQTJHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTNHa0I7QUFBQSxDQTRHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTVHa0I7QUFBQSxDQTZHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTdHa0I7QUFBQSxDQThHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQTlHa0I7QUFBQSxDQStHbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQS9Ha0I7QUFBQSxDQWdIbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sT0FBVDtBQUFBLEVBQWtCQyxHQUFBLEVBQUssT0FBdkI7QUFBQSxFQWhIa0I7QUFBQSxDQWlIbEI7QUFBQSxFQUFFRCxLQUFBLEVBQU8sTUFBVDtBQUFBLEVBQWlCQyxHQUFBLEVBQUssTUFB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QUEsQ0F1QjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F2QjZEO0FBQUEsQ0F3QjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F4QjZEO0FBQUEsQ0F5QjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F6QjZEO0FBQUEsQ0EwQjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0ExQjZEO0FBQUEsQ0EyQjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0EzQjZEO0FBQUEsQ0E0QjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0E1QjZEO0FBQUEsQ0E2QjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0E3QjZEO0FBQUEsQ0E4QjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0E5QjZEO0FBQUEsQ0ErQjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0EvQjZEO0FBQUEsQ0FnQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoQzZEO0FBQUEsQ0FpQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqQzZEO0FBQUEsQ0FrQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsQzZEO0FBQUEsQ0FtQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuQzZEO0FBQUEsQ0FvQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwQzZEO0FBQUEsQ0FxQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyQzZEO0FBQUEsQ0FzQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0QzZEO0FBQUEsQ0F1QzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2QzZEO0FBQUEsQ0F3QzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4QzZEO0FBQUEsQ0F5QzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6QzZEO0FBQUEsQ0EwQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExQzZEO0FBQUEsQ0EyQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0EzQzZEO0FBQUEsQ0E0QzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0E1QzZEO0FBQUEsQ0E2QzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0E3QzZEO0FBQUEsQ0E4QzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0E5QzZEO0FBQUEsQ0ErQzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0EvQzZEO0FBQUEsQ0FnRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0FoRDZEO0FBQUEsQ0FpRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0FqRDZEO0FBQUEsQ0FrRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0FsRDZEO0FBQUEsQ0FtRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0FuRDZEO0FBQUEsQ0FvRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0FwRDZEO0FBQUEsQ0FxRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0FyRDZEO0FBQUEsQ0FzRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F0RDZEO0FBQUEsQ0F1RDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F2RDZEO0FBQUEsQ0F3RDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F4RDZEO0FBQUEsQ0F5RDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F6RDZEO0FBQUEsQ0EwRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0ExRDZEO0FBQUEsQ0EyRDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzRDZEO0FBQUEsQ0E0RDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1RDZEO0FBQUEsQ0E2RDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3RDZEO0FBQUEsQ0E4RDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5RDZEO0FB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LENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdONkQ7QUFBQSxDQThON0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlONkQ7QUFBQSxDQStON0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9ONkQ7QUFBQSxDQWdPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhPNkQ7QUFBQSxDQWlPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpPNkQ7QUFBQSxDQWtPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxPNkQ7QUFBQSxDQW1PN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5PNkQ7QUFBQSxDQW9PN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBPNkQ7QUFBQSxDQXFPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJPNkQ7QUFBQSxDQXNPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRPNkQ7QUFBQSxDQXVPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZPNkQ7QUFBQSxDQXdPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhPNkQ7QUFBQSxDQXlPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpPNkQ7QUFBQSxDQTBPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFPNkQ7QUFBQSxDQTJPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNPNkQ7QUFBQSxDQTRPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVPNkQ7QUFBQSxDQTZPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdPNkQ7QUFBQSxDQThPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlPNkQ7QUFBQSxDQStPN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9PNkQ7QUFBQSxDQWdQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhQNkQ7QUFBQSxDQWlQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpQNkQ7QUFBQSxDQWtQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxQNkQ7QUFBQSxDQW1QN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5QNkQ7QUFBQSxDQW9QN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBQNkQ7QUFBQSxDQXFQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJQNkQ7QUFBQSxDQXNQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRQNkQ7QUFBQSxDQXVQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZQNkQ7QUFBQSxDQXdQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhQNkQ7QUFBQSxDQXlQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpQNkQ7QUFBQSxDQTBQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFQNkQ7QUFBQSxDQTJQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNQNkQ7QUFBQSxDQTRQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVQNkQ7QUFBQSxDQTZQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdQNkQ7QUFBQSxDQThQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlQNkQ7QUFBQSxDQStQN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9QNkQ7QUFBQSxDQWdRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhRNkQ7QUFBQSxDQWlRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpRNkQ7QUFBQSxDQWtRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxRNkQ7QUFBQSxDQW1RN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5RNkQ7QUFBQSxDQW9RN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBRNkQ7QUFBQSxDQXFRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJRNkQ7QUFBQSxDQXNRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRRNkQ7QUFBQSxDQXVRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZRNkQ7QUFBQSxDQXdRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhRNkQ7QUFBQSxDQXlRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpRNkQ7QUFBQSxDQTBRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFRNkQ7QUFBQSxDQTJRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNRNkQ7QUFBQSxDQTRRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVRNkQ7QUFBQSxDQTZRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdRNkQ7QUFBQSxDQThRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlRNkQ7QUFBQSxDQStRN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9RNkQ7QUFBQSxDQWdSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhSNkQ7QUFBQSxDQWlSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpSNkQ7QUFBQSxDQWtSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxSNkQ7QUFBQSxDQW1SN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5SNkQ7QUFBQSxDQW9SN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBSNkQ7QUFBQSxDQXFSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJSNkQ7QUFBQSxDQXNSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRSNkQ7QUFBQSxDQXVSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZSNkQ7QUFBQSxDQXdSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhSNkQ7QUFBQSxDQXlSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpSNkQ7QUFBQSxDQTBSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFSNkQ7QUFBQSxDQTJSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNSNkQ7QUFBQSxDQTRSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVSNkQ7QUFBQSxDQTZSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdSNkQ7QUFBQSxDQThSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlSNkQ7QUFBQSxDQStSN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9SNkQ7QUFBQSxDQWdTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhTNkQ7QUFBQSxDQWlTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpTNkQ7QUFBQSxDQWtTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxTNkQ7QUFBQSxDQW1TN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5TNkQ7QUFBQSxDQW9TN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBTNkQ7QUFBQSxDQXFTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJTNkQ7QUFBQSxDQXNTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRTNkQ7QUFBQSxDQXVTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZTNkQ7QUFBQSxDQXdTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhTNkQ7QUFBQSxDQXlTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpTNkQ7QUFBQSxDQTBTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFTNkQ7QUFBQSxDQTJTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNTNkQ7QUFBQSxDQTRTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVTNkQ7QUFBQSxDQTZTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdTNkQ7QUFBQSxDQThTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlTNkQ7QUFBQSxDQStTN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9TNkQ7QUFBQSxDQWdUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhUNkQ7QUFBQSxDQWlUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpUNkQ7QUFBQSxDQWtUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxUNkQ7QUFBQSxDQW1UN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5UNkQ7QUFBQSxDQW9UN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBUNkQ7QUFBQSxDQXFUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJUNkQ7QUFBQSxDQXNUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRUNkQ7QUFBQSxDQXVUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZUNkQ7QUFBQSxDQXdUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhUNkQ7QUFBQSxDQXlUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpUNkQ7QUFBQSxDQTBUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFUNkQ7QUFBQSxDQTJUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNUNkQ7QUFBQSxDQTRUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVUNkQ7QUFBQSxDQTZUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdUNkQ7QUFBQSxDQThUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlUNkQ7QUFBQSxDQStUN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9UNkQ7QUFBQSxDQWdVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhVNkQ7QUFBQSxDQWlVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpVNkQ7QUFBQSxDQWtVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxVNkQ7QUFBQSxDQW1VN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5VNkQ7QUFBQSxDQW9VN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBVNkQ7QUFBQSxDQXFVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJVNkQ7QUFBQSxDQXNVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRVNkQ7QUFBQSxDQXVVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZVNkQ7QUFBQSxDQXdVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhVNkQ7QUFBQSxDQXlVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpVNkQ7QUFBQSxDQTBVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFVNkQ7QUFBQSxDQTJVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNVNkQ7QUFBQSxDQTRVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVVNkQ7QUFBQSxDQTZVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdVNkQ7QUFBQSxDQThVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlVNkQ7QUFBQSxDQStVN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9VNkQ7QUFBQSxDQWdWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhWNkQ7QUFBQSxDQWlWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpWNkQ7QUFBQSxDQWtWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxWNkQ7QUFBQSxDQW1WN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5WNkQ7QUFBQSxDQW9WN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBWNkQ7QUFBQSxDQXFWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJWNkQ7QUFBQSxDQXNWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRWNkQ7QUFBQSxDQXVWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZWNkQ7QUFBQSxDQXdWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhWNkQ7QUFBQSxDQXlWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpWNkQ7QUFBQSxDQTBWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFWNkQ7QUFBQSxDQTJWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNWNkQ7QUFBQSxDQTRWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVWNkQ7QUFBQSxDQTZWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdWNkQ7QUFBQSxDQThWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlWNkQ7QUFBQSxDQStWN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9WNkQ7QUFBQSxDQWdXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhXNkQ7QUFBQSxDQWlXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpXNkQ7QUFBQSxDQWtXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxXNkQ7QUFBQSxDQW1XN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5XNkQ7QUFBQSxDQW9XN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBXNkQ7QUFBQSxDQXFXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJXNkQ7QUFBQSxDQXNXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRXNkQ7QUFBQSxDQXVXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZXNkQ7QUFBQSxDQXdXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhXNkQ7QUFBQSxDQXlXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpXNkQ7QUFBQSxDQTBXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFXNkQ7QUFBQSxDQTJXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNXNkQ7QUFBQSxDQTRXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVXNkQ7QUFBQSxDQTZXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdXNkQ7QUFBQSxDQThXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlXNkQ7QUFBQSxDQStXN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9XNkQ7QUFBQSxDQWdYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhYNkQ7QUFBQSxDQWlYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpYNkQ7QUFBQSxDQWtYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxYNkQ7QUFBQSxDQW1YN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5YNkQ7QUFBQSxDQW9YN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBYNkQ7QUFBQSxDQXFYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJYNkQ7QUFBQSxDQXNYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRYNkQ7QUFBQSxDQXVYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZYNkQ7QUFBQSxDQXdYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhYNkQ7QUFBQSxDQXlYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpYNkQ7QUFBQSxDQTBYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFYNkQ7QUFBQSxDQTJYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNYNkQ7QUFBQSxDQTRYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVYNkQ7QUFBQSxDQTZYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdYNkQ7QUFBQSxDQThYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlYNkQ7QUFBQSxDQStYN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9YNkQ7QUFBQSxDQWdZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhZNkQ7QUFBQSxDQWlZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpZNkQ7QUFBQSxDQWtZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxZNkQ7QUFBQSxDQW1ZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5ZNkQ7QUFBQSxDQW9ZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBZNkQ7QUFBQSxDQXFZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJZNkQ7QUFBQSxDQXNZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRZNkQ7QUFBQSxDQXVZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZZNkQ7QUFBQSxDQXdZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhZNkQ7QUFBQSxDQXlZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpZNkQ7QUFBQSxDQTBZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFZNkQ7QUFBQSxDQTJZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNZNkQ7QUFBQSxDQTRZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVZNkQ7QUFBQSxDQTZZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdZNkQ7QUFBQSxDQThZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlZNkQ7QUFBQSxDQStZN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9ZNkQ7QUFBQSxDQWdaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhaNkQ7QUFBQSxDQWlaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpaNkQ7QUFBQSxDQWtaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxaNkQ7QUFBQSxDQW1aN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5aNkQ7QUFBQSxDQW9aN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBaNkQ7QUFBQSxDQXFaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJaNkQ7QUFBQSxDQXNaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRaNkQ7QUFBQSxDQXVaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZaNkQ7QUFBQSxDQXdaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhaNkQ7QUFBQSxDQXlaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpaNkQ7QUFBQSxDQTBaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFaNkQ7QUFBQSxDQTJaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNaNkQ7QUFBQSxDQTRaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVaNkQ7QUFBQSxDQTZaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdaNkQ7QUFBQSxDQThaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlaNkQ7QUFBQSxDQStaN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9aNkQ7QUFBQSxDQWdhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhhNkQ7QUFBQSxDQWlhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWphNkQ7QUFBQSxDQWthN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxhNkQ7QUFBQSxDQW1hN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5hNkQ7QUFBQSxDQW9hN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBhNkQ7QUFBQSxDQXFhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJhNkQ7QUFBQSxDQXNhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRhNkQ7QUFBQSxDQXVhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQXZhNkQ7QUFBQSxDQXdhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQXhhNkQ7QUFBQSxDQXlhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXphNkQ7QUFBQSxDQTBhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFhNkQ7QUFBQSxDQTJhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNhNkQ7QUFBQSxDQTRhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVhNkQ7QUFBQSxDQTZhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdhNkQ7QUFBQSxDQThhN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlhNkQ7QUFBQSxDQSthN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9hNkQ7QUFBQSxDQWdiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhiNkQ7QUFBQSxDQWliN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpiNkQ7QUFBQSxDQWtiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxiNkQ7QUFBQSxDQW1iN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5iNkQ7QUFBQSxDQW9iN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBiNkQ7QUFBQSxDQXFiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJiNkQ7QUFBQSxDQXNiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRiNkQ7QUFBQSxDQXViN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZiNkQ7QUFBQSxDQXdiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhiNkQ7QUFBQSxDQXliN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpiNkQ7QUFBQSxDQTBiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFiNkQ7QUFBQSxDQTJiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNiNkQ7QUFBQSxDQTRiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTViNkQ7QUFBQSxDQTZiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdiNkQ7QUFBQSxDQThiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTliNkQ7QUFBQSxDQStiN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9iNkQ7QUFBQSxDQWdjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhjNkQ7QUFBQSxDQWljN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpjNkQ7QUFBQSxDQWtjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxjNkQ7QUFBQSxDQW1jN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5jNkQ7QUFBQSxDQW9jN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBjNkQ7QUFBQSxDQXFjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJjNkQ7QUFBQSxDQXNjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRjNkQ7QUFBQSxDQXVjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZjNkQ7QUFBQSxDQXdjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhjNkQ7QUFBQSxDQXljN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpjNkQ7QUFBQSxDQTBjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFjNkQ7QUFBQSxDQTJjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNjNkQ7QUFBQSxDQTRjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVjNkQ7QUFBQSxDQTZjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdjNkQ7QUFBQSxDQThjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTljNkQ7QUFBQSxDQStjN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9jNkQ7QUFBQSxDQWdkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhkNkQ7QUFBQSxDQWlkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpkNkQ7QUFBQSxDQWtkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxkNkQ7QUFBQSxDQW1kN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5kNkQ7QUFBQSxDQW9kN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBkNkQ7QUFBQSxDQXFkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJkNkQ7QUFBQSxDQXNkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRkNkQ7QUFBQSxDQXVkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZkNkQ7QUFBQSxDQXdkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhkNkQ7QUFBQSxDQXlkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXpkNkQ7QUFBQSxDQTBkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFkNkQ7QUFBQSxDQTJkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNkNkQ7QUFBQSxDQTRkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVkNkQ7QUFBQSxDQTZkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdkNkQ7QUFBQSxDQThkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTlkNkQ7QUFBQSxDQStkN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9kNkQ7QUFBQSxDQWdlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhlNkQ7QUFBQSxDQWllN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWplNkQ7QUFBQSxDQWtlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxlNkQ7QUFBQSxDQW1lN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5lNkQ7QUFBQSxDQW9lN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBlNkQ7QUFBQSxDQXFlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXJlNkQ7QUFBQSxDQXNlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXRlNkQ7QUFBQSxDQXVlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXZlNkQ7QUFBQSxDQXdlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXhlNkQ7QUFBQSxDQXllN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXplNkQ7QUFBQSxDQTBlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFlNkQ7QUFBQSxDQTJlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTNlNkQ7QUFBQSxDQTRlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTVlNkQ7QUFBQSxDQTZlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTdlNkQ7QUFBQSxDQThlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTllNkQ7QUFBQSxDQStlN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQS9lNkQ7QUFBQSxDQWdmN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWhmNkQ7QUFBQSxDQWlmN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpmNkQ7QUFBQSxDQWtmN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWxmNkQ7QUFBQSxDQW1mN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQW5mNkQ7QUFBQSxDQW9mN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQXBmNkQ7QUFBQSxDQXFmN0RB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O0FBQ0FBLGFBVmtELEdBVWxEQTtBQUNBQSxZQVhrRCxHQVdsREE7QUFDQUEsWUFaa0QsR0FZbERBO0FBQ0FBLFlBYmtELEdBYWxEQTtBQUNBQSxZQWRrRCxHQWNsREE7QUFDQUEsWUFma0QsR0FlbERBO0FBQ0FBLFlBaEJrRCxHQWdCbERBO0FBQ0FBLGFBakJrRCxHQWlCbERBO0FBQ0FBLFlBbEJrRCxHQWtCbERBO0FBQ0FBLFlBbkJrRCxHQW1CbERBO0FBQ0FBLFlBcEJrRCxHQW9CbERBO0FBQ0FBLFlBckJrRCxHQXFCbERBO0FBQ0FBLFlBdEJrRCxHQXNCbERBO0FBQ0FBLFlBdkJrRCxHQXVCbERBO0FBQ0FBLFlBeEJrRCxHQXdCbERBO0FBQ0FBLFlBekJrRCxHQXlCbERBO0FBQ0FBLFlBMUJrRCxHQTBCbERBO0FBQ0FBLFlBM0JrRCxHQTJCbERBO0FBQ0FBLFlBNUJrRCxHQTRCbERBO0FBQ0FBLFlBN0JrRCxHQTZCbERBO0FBQ0FBLFdBOUJrRCxHQThCbERBO0FBQ0FBLFdBL0JrRCxHQStCbERBO0FBQ0FBLFdBaENrRCxHQWdDbERBO0FBQ0FBLFdBakNrRCxHQWlDbERBO0FBQ0FBLFlBbENrRCxHQWtDbERBO0FBQ0FBLFlBbkNrRCxHQW1DbERBO0FBQ0FBLFlBcENrRCxHQW9DbERBO0FBQ0FBLFlBckNrRCxHQXFDbERBO0FBQ0FBLFlBdENrRCxHQXNDbERBO0FBQ0FBLFlBdkNrRCxHQXVDbERBO0FBQ0FBLFlBeENrRCxHQXdDbERBO0FBQ0FBLFlBekNrRCxHQXlDbERBO0FBQ0FBLFlBMUNrRCxHQTBDbERBO0FBQ0FBLFlBM0NrRCxHQTJDbERBO0FBQ0FBLFlBNUNrRCxHQTRDbERBO0FBQ0FBLFlBN0NrRCxHQTZDbERBO0FBQ0FBLFlBOUNrRCxHQThDbERBO0FBQ0FBLFlBL0NrRCxHQStDbERBO0FBQ0FBLFlBaERrRCxHQWdEbERBO0FBQ0FBLFlBakRrRCxHQWlEbERBO0FBQ0FBLFlBbERrRCxHQWtEbERBO0FBQ0FBLFlBbkRrRCxHQW1EbERBO0FBQ0FBLFlBcERrRCxHQW9EbERBO0FBQ0FBLFlBckRrRCxHQXFEbERBO0FBQ0FBLFlBdERrRCxHQXNEbERBO0FBQ0FBLFlBdkRrRCxHQXVEbERBO0FBQ0FBLFlBeERrRCxHQXdEbERBO0FBQ0FBLFlBekRrRCxHQXlEbERBO0FBQ0FBLFlBMURrRCxHQTBEbERBO0FBQ0FBLFlBM0RrRCxHQTJEbERBO0FBQ0FBLFlBNURrRCxHQTREbERBO0FBQ0FBLFlBN0RrRCxHQTZEbERBO0FBQ0FBLFlBOURrRCxHQThEbERBO0FBQ0FBLFlBL0RrRCxHQStEbERBO0FBQ0FBLFlBaEVrRCxHQWdFbERBO0FBQ0FBLFlBakVrRCxHQWlFbERBO0FBQ0FBLFlBbEVrRCxHQWtFbERBO0FBQ0FBLFlBbkVrRCxHQW1FbERBO0FBQ0FBLFlBcEVrRCxHQW9FbERBO0FBQ0FBLFlBckVrRCxHQXFFbERBO0FBQ0FBLFlBdEVrRCxHQXNFbERBO0FBQ0FBLFlBdkVrRCxHQXVFbERBO0FBQ0FBLFlBeEVrRCxHQXdFbERBO0FBQ0FBLFlBekVrRCxHQXlFbERBO0FBQ0FBLFlBMUVrRCxHQTBFbERBO0FBQ0FBLFlBM0VrRCxHQTJFbERBO0FBQ0FBLFlBNUVrRCxHQTRFbERBO0FBQ0FBLFlBN0VrRCxHQTZFbERBO0FBQ0FBLFlBOUVrRCxHQThFbERBO0FBQ0FBLFlBL0VrRCxHQStFbERBO0FBQ0FBLFlBaEZrRCxHQWdGbERBO0FBQ0FBLGFBakZrRCxHQWlGbERBO0FBQ0FBLFlBbEZrRCxHQWtGbERBO0FBQ0FBLGFBbkZrRCxHQW1GbERBO0FBQ0FBLFlBcEZrRCxHQW9GbERBO0FBQ0FBLFlBckZrRCxHQXFGbERBO0FBQ0FBLFlBdEZrRCxHQXNGbERBO0FBQ0FBLFlBdkZrRCxHQXVGbERBO0FBQ0FBLFlBeEZrRCxHQXdGbERBO0FBQ0FBLFlBekZrRCxHQXlGbERBO0FBQ0FBLFlBMUZrRCxHQTBGbERBO0FBQ0FBLFlBM0ZrRCxHQTJGbERBO0FBQ0FBLFlBNUZrRCxHQTRGbERBO0FBQ0FBLFlBN0ZrRCxHQTZGbERBO0FBQ0FBLFlBOUZrRCxHQThGbERBO0FBQ0FBLGFBL0ZrRCxHQStGbERBO0FBQ0FBLFlBaEdrRCxHQWdHbERBO0FBQ0FBLFlBakdrRCxHQWlHbERBO0FBQ0FBLFlBbEdrRCxHQWtHbERBO0FBQ0FBLFlBbkdrRCxHQW1HbERBO0FBQ0FBLFlBcEdrRCxHQW9HbERBO0FBQ0FBLFlBckdrRCxHQXFHbERBO0FBQ0FBLGFBdEdrRCxHQXNHbERBO0FBQ0FBLFlBdkdrRCxHQXVHbERBO0FBQ0FBLGFBeEdrRCxHQXdHbERBO0FBQ0FBLFlBekdrRCxHQXlHbERBO0FBQ0FBLFlBMUdrRCxHQTBHbERBO0FBQ0FBLFlBM0drRCxHQTJHbERBO0FBQ0FBLFlBNUdrRCxHQTRHbERBO0FBQ0FBLFlBN0drRCxHQTZHbERBO0FBQ0FBLGFBOUdrRCxHQThHbERBO0FBQ0FBLGFBL0drRCxHQStHbERBO0FBQ0FBLGFBaEhrRCxHQWdIbERBO0FBQ0FBLGFBakhrRCxHQWlIbERBO0FBQ0FBLGFBbEhrRCxHQWtIbERBO0FBQ0FBLGFBbkhrRCxHQW1IbERBO0FBQ0FBLGFBcEhrRCxHQW9IbERBO0FBQ0FBLGFBckhrRCxHQXFIbERBO0FBQ0FBLGFBdEhrRCxHQXNIbERBO0FBQ0FBLGFBdkhrRCxHQXVIbERBO0FBQ0FBLGFBeEhrRCxHQXdIbERBO0FBQ0FBLGFBekhrRCxHQXlIbERBO0FBQ0FBLGFBMUhrRCxHQTBIbERBO0FBQ0FBLGFBM0hrRCxHQTJIbERBO0FBQ0FBLGFBNUhrRCxHQTRIbERBO0FBQ0FBLGFBN0hrRCxHQTZIbERBO0FBQ0FBLGFBOUhrRCxHQThIbERBO0FBQ0FBLGFBL0hrRCxHQStIbERBO0FBQ0FBLGFBaElrRCxHQWdJbERBO0FBQ0FBLGFBaklrRCxHQWlJbERBO0FBQ0FBLGFBbElrRCxHQWtJbERBO0FBQ0FBLGFBbklrRCxHQW1JbERBO0FBQ0FBLGFBcElrRCxHQW9JbERBO0FBQ0FBLGFBcklrRCxHQXFJbERBO0FBQ0FBLGFBdElrRCxHQXNJbERBO0FBQ0FBLGFBdklrRCxHQXVJbERBO0FBQ0FBLGFBeElrRCxHQXdJbERBO0FBQ0FBLGFBeklrRCxHQXlJbERBO0FBQ0FBLGFBMUlrRCxHQTBJbERBO0FBQ0FBLGFBM0lrRCxHQTJJbERBO0FBQ0FBLGFBNUlrRCxHQTRJbERBO0FBQ0FBLGFBN0lrRCxHQTZJbERBO0FBQ0FBLGFBOUlrRCxHQThJbERBO0FBQ0FBLGFBL0lrRCxHQStJbERBO0FBQ0FBLGFBaEprRCxHQWdKbERBO0FBQ0FBLGFBakprRCxHQWlKbERBO0FBQ0FBLGFBbEprRCxHQWtKbERBO0FBQ0FBLGFBbkprRCxHQW1KbERBO0FBQ0FBLGFBcEprRCxHQW9KbERBO0FBQ0FBLGFBckprRCxHQXFKbERBO0FBQ0FBLGFBdEprRCxHQXNKbERBO0FBQ0FBLGFBdkprRCxHQXVKbERBO0FBQ0FBLGFBeEprRCxHQXdKbERBO0FBQ0FBLGFBekprRCxHQXlKbERBO0FBQ0FBLGFBMUprRCxHQTBKbERBO0FBQ0FBLGFBM0prRCxHQTJKbERBO0FBQ0FBLGFBNUprRCxHQTRKbERBO0FBQ0FBLGFBN0prRCxHQTZKbERBO0FBQ0FBLGFBOUprRCxHQThKbERBO0FBQ0FBLGFBL0prRCxHQStKbERBO0FBQ0FBLGFBaEtrRCxHQWdLbERBO0FBQ0FBLGFBaktrRCxHQWlLbERBO0FBQ0FBLGFBbEtrRCxHQWtLbERBO0FBQ0FBLGFBbktrRCxJQW1LbERBO0FBQ0FBLGFBcEtrRCxHQW9LbERBO0FBQ0FBLGFBcktrRCxHQXFLbERBO0FBQ0FBLGFBdEtrRCxHQXNLbERBO0FBQ0FBLGFBdktrRCxHQXVLbERBO0FBQ0FBLGFBeEtrRCxHQXdLbERBO0FBQ0FBLGFBektrRCxHQXlLbERBO0FBQ0FBLGFBMUtrRCxHQTBLbERBO0FBQ0FBLGFBM0trRCxHQTJLbERBO0FBQ0FBLGFBNUtrRCxHQTRLbERBO0FBQ0FBLGFBN0trRCxHQTZLbERBO0FBQ0FBLGFBOUtrRCxHQThLbERBO0FBQ0FBLGFBL0trRCxHQStLbERBO0FBQ0FBLGFBaExrRCxHQWdMbERBO0FBQ0FBLGFBakxrRCxHQWlMbERBO0FBQ0FBLGFBbExrRCxHQWtMbERBO0FBQ0FBLGFBbkxrRCxHQW1MbERBO0FBQ0FBLGFBcExrRCxHQW9MbERBO0FBQ0FBLGFBckxrRCxHQXFMbERB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V0FBTztBQUFFM25CLGFBQU9BLE1BQVQ7QUFBdUIybkIsWUFBdkI7QUFBQSxLQUFQO0FBckI2Qjs7QUF3Qi9COGpPLGlCQUFlO0FBQ2Isd0JBRGEsTUFDYjtBQXpCNkI7O0FBQUEsQyIsImZpbGUiOiJwZGYud29ya2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXJcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlclwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd19wZGZqc19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dfcGRmanNfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193X3BkZmpzX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dfcGRmanNfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dfcGRmanNfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd19wZGZqc19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd19wZGZqc19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193X3BkZmpzX3JlcXVpcmVfXyhfX3dfcGRmanNfcmVxdWlyZV9fLnMgPSAwKTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBXb3JrZXJNZXNzYWdlSGFuZGxlciB9IGZyb20gXCIuL2NvcmUvd29ya2VyLmpzXCI7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAqL1xuY29uc3QgcGRmanNWZXJzaW9uID0gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9WRVJTSU9OXCIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzICovXG5jb25zdCBwZGZqc0J1aWxkID0gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9CVUlMRFwiKTtcblxuZXhwb3J0IHsgV29ya2VyTWVzc2FnZUhhbmRsZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBYm9ydEV4Y2VwdGlvbixcbiAgYXJyYXlCeXRlTGVuZ3RoLFxuICBhcnJheXNUb0J5dGVzLFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgZ2V0VmVyYm9zaXR5TGV2ZWwsXG4gIGluZm8sXG4gIEludmFsaWRQREZFeGNlcHRpb24sXG4gIGlzU3RyaW5nLFxuICBNaXNzaW5nUERGRXhjZXB0aW9uLFxuICBQYXNzd29yZEV4Y2VwdGlvbixcbiAgc2V0VmVyYm9zaXR5TGV2ZWwsXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sXG4gIFVua25vd25FcnJvckV4Y2VwdGlvbixcbiAgVU5TVVBQT1JURURfRkVBVFVSRVMsXG4gIFZlcmJvc2l0eUxldmVsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IGNsZWFyUHJpbWl0aXZlQ2FjaGVzLCBSZWYgfSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBMb2NhbFBkZk1hbmFnZXIsIE5ldHdvcmtQZGZNYW5hZ2VyIH0gZnJvbSBcIi4vcGRmX21hbmFnZXIuanNcIjtcbmltcG9ydCB7IGluY3JlbWVudGFsVXBkYXRlIH0gZnJvbSBcIi4vd3JpdGVyLmpzXCI7XG5pbXBvcnQgeyBpc05vZGVKUyB9IGZyb20gXCIuLi9zaGFyZWQvaXNfbm9kZS5qc1wiO1xuaW1wb3J0IHsgTWVzc2FnZUhhbmRsZXIgfSBmcm9tIFwiLi4vc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgUERGV29ya2VyU3RyZWFtIH0gZnJvbSBcIi4vd29ya2VyX3N0cmVhbS5qc1wiO1xuaW1wb3J0IHsgWFJlZlBhcnNlRXhjZXB0aW9uIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuXG5jbGFzcyBXb3JrZXJUYXNrIHtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy50ZXJtaW5hdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gIH1cblxuICBnZXQgZmluaXNoZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIGZpbmlzaCgpIHtcbiAgICB0aGlzLl9jYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIHRlcm1pbmF0ZSgpIHtcbiAgICB0aGlzLnRlcm1pbmF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgZW5zdXJlTm90VGVybWluYXRlZCgpIHtcbiAgICBpZiAodGhpcy50ZXJtaW5hdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgdGFzayB3YXMgdGVybWluYXRlZFwiKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgV29ya2VyTWVzc2FnZUhhbmRsZXIge1xuICBzdGF0aWMgc2V0dXAoaGFuZGxlciwgcG9ydCkge1xuICAgIHZhciB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IGZhbHNlO1xuICAgIGhhbmRsZXIub24oXCJ0ZXN0XCIsIGZ1bmN0aW9uIHdwaFNldHVwVGVzdChkYXRhKSB7XG4gICAgICBpZiAodGVzdE1lc3NhZ2VQcm9jZXNzZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyB3ZSBhbHJlYWR5IHByb2Nlc3NlZCAndGVzdCcgbWVzc2FnZSBvbmNlXG4gICAgICB9XG4gICAgICB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IHRydWU7XG5cbiAgICAgIC8vIGNoZWNrIGlmIFVpbnQ4QXJyYXkgY2FuIGJlIHNlbnQgdG8gd29ya2VyXG4gICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgaGFuZGxlci5zZW5kKFwidGVzdFwiLCBudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gbWFraW5nIHN1cmUgcG9zdE1lc3NhZ2UgdHJhbnNmZXJzIGFyZSB3b3JraW5nXG4gICAgICBjb25zdCBzdXBwb3J0VHJhbnNmZXJzID0gZGF0YVswXSA9PT0gMjU1O1xuICAgICAgaGFuZGxlci5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHN1cHBvcnRUcmFuc2ZlcnM7XG5cbiAgICAgIGhhbmRsZXIuc2VuZChcInRlc3RcIiwgeyBzdXBwb3J0VHJhbnNmZXJzIH0pO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcImNvbmZpZ3VyZVwiLCBmdW5jdGlvbiB3cGhDb25maWd1cmUoZGF0YSkge1xuICAgICAgc2V0VmVyYm9zaXR5TGV2ZWwoZGF0YS52ZXJib3NpdHkpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldERvY1JlcXVlc3RcIiwgZnVuY3Rpb24gd3BoU2V0dXBEb2MoZGF0YSkge1xuICAgICAgcmV0dXJuIFdvcmtlck1lc3NhZ2VIYW5kbGVyLmNyZWF0ZURvY3VtZW50SGFuZGxlcihkYXRhLCBwb3J0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEb2N1bWVudEhhbmRsZXIoZG9jUGFyYW1zLCBwb3J0KSB7XG4gICAgLy8gVGhpcyBjb250ZXh0IGlzIGFjdHVhbGx5IGhvbGRzIHJlZmVyZW5jZXMgb24gcGRmTWFuYWdlciBhbmQgaGFuZGxlcixcbiAgICAvLyB1bnRpbCB0aGUgbGF0dGVyIGlzIGRlc3Ryb3llZC5cbiAgICB2YXIgcGRmTWFuYWdlcjtcbiAgICB2YXIgdGVybWluYXRlZCA9IGZhbHNlO1xuICAgIHZhciBjYW5jZWxYSFJzID0gbnVsbDtcbiAgICB2YXIgV29ya2VyVGFza3MgPSBbXTtcbiAgICBjb25zdCB2ZXJib3NpdHkgPSBnZXRWZXJib3NpdHlMZXZlbCgpO1xuXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IGRvY1BhcmFtcy5hcGlWZXJzaW9uO1xuICAgIGNvbnN0IHdvcmtlclZlcnNpb24gPVxuICAgICAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmICFQREZKU0Rldi50ZXN0KFwiVEVTVElOR1wiKVxuICAgICAgICA/IFBERkpTRGV2LmV2YWwoXCJCVU5ETEVfVkVSU0lPTlwiKVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKGFwaVZlcnNpb24gIT09IHdvcmtlclZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBBUEkgdmVyc2lvbiBcIiR7YXBpVmVyc2lvbn1cIiBkb2VzIG5vdCBtYXRjaCBgICtcbiAgICAgICAgICBgdGhlIFdvcmtlciB2ZXJzaW9uIFwiJHt3b3JrZXJWZXJzaW9ufVwiLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkge1xuICAgICAgLy8gRmFpbCBlYXJseSwgYW5kIHByZWRpY3RhYmx5LCByYXRoZXIgdGhhbiBoYXZpbmcgKHNvbWUpIGZvbnRzIGZhaWwgdG9cbiAgICAgIC8vIGxvYWQvcmVuZGVyIHdpdGggc2xpZ2h0bHkgY3J5cHRpYyBlcnJvciBtZXNzYWdlcyBpbiBlbnZpcm9ubWVudHMgd2hlcmVcbiAgICAgIC8vIHRoZSBgQXJyYXkucHJvdG90eXBlYCBoYXMgYmVlbiAqaW5jb3JyZWN0bHkqIGV4dGVuZGVkLlxuICAgICAgLy9cbiAgICAgIC8vIFBMRUFTRSBOT1RFOiBXZSBkbyAqbm90KiB3YW50IHRvIHNsb3cgZG93biBmb250IHBhcnNpbmcgYnkgYWRkaW5nXG4gICAgICAvLyAgICAgICAgICAgICAgYGhhc093blByb3BlcnR5YCBjaGVja3MgYWxsIG92ZXIgdGhlIGNvZGUtYmFzZS5cbiAgICAgIGNvbnN0IGVudW1lcmFibGVQcm9wZXJ0aWVzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIFtdKSB7XG4gICAgICAgIGVudW1lcmFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgICAgfVxuICAgICAgaWYgKGVudW1lcmFibGVQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJUaGUgYEFycmF5LnByb3RvdHlwZWAgY29udGFpbnMgdW5leHBlY3RlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXM6IFwiICtcbiAgICAgICAgICAgIGVudW1lcmFibGVQcm9wZXJ0aWVzLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICBcIjsgdGh1cyBicmVha2luZyBlLmcuIGBmb3IuLi5pbmAgaXRlcmF0aW9uIG9mIGBBcnJheWBzLlwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB0aGF0IChwcmltYXJpbHkpIE5vZGUuanMgdXNlcnMgd29uJ3QgYWNjaWRlbnRhbGx5IGF0dGVtcHQgdG8gdXNlXG4gICAgICAvLyBhIG5vbi10cmFuc2xhdGVkL25vbi1wb2x5ZmlsbGVkIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LCBzaW5jZSB0aGF0IHdvdWxkXG4gICAgICAvLyBxdWlja2x5IGZhaWwgYW55d2F5IGJlY2F1c2Ugb2YgbWlzc2luZyBmdW5jdGlvbmFsaXR5IChzdWNoIGFzIGUuZy5cbiAgICAgIC8vIGBSZWFkYWJsZVN0cmVhbWAgYW5kIGBQcm9taXNlLmFsbFNldHRsZWRgKS5cbiAgICAgIGlmIChcbiAgICAgICAgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBQREZKU0Rldi50ZXN0KFwiU0tJUF9CQUJFTFwiKSkgJiZcbiAgICAgICAgKHR5cGVvZiBSZWFkYWJsZVN0cmVhbSA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgIHR5cGVvZiBQcm9taXNlLmFsbFNldHRsZWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiVGhlIGJyb3dzZXIvZW52aXJvbm1lbnQgbGFja3MgbmF0aXZlIHN1cHBvcnQgZm9yIGNyaXRpY2FsIFwiICtcbiAgICAgICAgICAgIFwiZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IHRoZSBQREYuanMgbGlicmFyeSAoZS5nLiBcIiArXG4gICAgICAgICAgICBcImBSZWFkYWJsZVN0cmVhbWAgYW5kL29yIGBQcm9taXNlLmFsbFNldHRsZWRgKTsgXCIgK1xuICAgICAgICAgICAgXCJwbGVhc2UgdXNlIGFuIEVTNS1jb21wYXRpYmxlIGJ1aWxkIGluc3RlYWQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZG9jSWQgPSBkb2NQYXJhbXMuZG9jSWQ7XG4gICAgdmFyIGRvY0Jhc2VVcmwgPSBkb2NQYXJhbXMuZG9jQmFzZVVybDtcbiAgICB2YXIgd29ya2VySGFuZGxlck5hbWUgPSBkb2NQYXJhbXMuZG9jSWQgKyBcIl93b3JrZXJcIjtcbiAgICB2YXIgaGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcih3b3JrZXJIYW5kbGVyTmFtZSwgZG9jSWQsIHBvcnQpO1xuXG4gICAgLy8gRW5zdXJlIHRoYXQgcG9zdE1lc3NhZ2UgdHJhbnNmZXJzIGFyZSBhbHdheXMgY29ycmVjdGx5IGVuYWJsZWQvZGlzYWJsZWQsXG4gICAgLy8gdG8gcHJldmVudCBcIkRhdGFDbG9uZUVycm9yXCIgaW4gYnJvd3NlcnMgd2l0aG91dCB0cmFuc2ZlcnMgc3VwcG9ydC5cbiAgICBoYW5kbGVyLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gZG9jUGFyYW1zLnBvc3RNZXNzYWdlVHJhbnNmZXJzO1xuXG4gICAgZnVuY3Rpb24gZW5zdXJlTm90VGVybWluYXRlZCgpIHtcbiAgICAgIGlmICh0ZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgdGVybWluYXRlZFwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGFydFdvcmtlclRhc2sodGFzaykge1xuICAgICAgV29ya2VyVGFza3MucHVzaCh0YXNrKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaW5pc2hXb3JrZXJUYXNrKHRhc2spIHtcbiAgICAgIHRhc2suZmluaXNoKCk7XG4gICAgICB2YXIgaSA9IFdvcmtlclRhc2tzLmluZGV4T2YodGFzayk7XG4gICAgICBXb3JrZXJUYXNrcy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZERvY3VtZW50KHJlY292ZXJ5TW9kZSkge1xuICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoXCJjaGVja0hlYWRlclwiKTtcbiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKFwicGFyc2VTdGFydFhSZWZcIik7XG4gICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYyhcInBhcnNlXCIsIFtyZWNvdmVyeU1vZGVdKTtcblxuICAgICAgaWYgKCFyZWNvdmVyeU1vZGUpIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCBhdCBsZWFzdCB0aGUgZmlyc3QgcGFnZSBjYW4gYmUgc3VjY2Vzc2Z1bGx5IGxvYWRlZCxcbiAgICAgICAgLy8gc2luY2Ugb3RoZXJ3aXNlIHRoZSBYUmVmIHRhYmxlIGlzIGRlZmluaXRlbHkgbm90IHZhbGlkLlxuICAgICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYyhcImNoZWNrRmlyc3RQYWdlXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbbnVtUGFnZXMsIGZpbmdlcnByaW50XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcGRmTWFuYWdlci5lbnN1cmVEb2MoXCJudW1QYWdlc1wiKSxcbiAgICAgICAgcGRmTWFuYWdlci5lbnN1cmVEb2MoXCJmaW5nZXJwcmludFwiKSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHsgbnVtUGFnZXMsIGZpbmdlcnByaW50IH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGRmTWFuYWdlcihkYXRhLCBldmFsdWF0b3JPcHRpb25zKSB7XG4gICAgICB2YXIgcGRmTWFuYWdlckNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgbGV0IG5ld1BkZk1hbmFnZXI7XG5cbiAgICAgIHZhciBzb3VyY2UgPSBkYXRhLnNvdXJjZTtcbiAgICAgIGlmIChzb3VyY2UuZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgTG9jYWxQZGZNYW5hZ2VyKFxuICAgICAgICAgICAgZG9jSWQsXG4gICAgICAgICAgICBzb3VyY2UuZGF0YSxcbiAgICAgICAgICAgIHNvdXJjZS5wYXNzd29yZCxcbiAgICAgICAgICAgIGV2YWx1YXRvck9wdGlvbnMsXG4gICAgICAgICAgICBkb2NCYXNlVXJsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBwZGZTdHJlYW0sXG4gICAgICAgIGNhY2hlZENodW5rcyA9IFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGRmU3RyZWFtID0gbmV3IFBERldvcmtlclN0cmVhbShoYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChleCk7XG4gICAgICAgIHJldHVybiBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgZnVsbFJlcXVlc3QgPSBwZGZTdHJlYW0uZ2V0RnVsbFJlYWRlcigpO1xuICAgICAgZnVsbFJlcXVlc3QuaGVhZGVyc1JlYWR5XG4gICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWZ1bGxSZXF1ZXN0LmlzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIGF1dG8tZmV0Y2ggd2hlbiBzdHJlYW1pbmcgaXMgZW5hYmxlZC5cbiAgICAgICAgICB2YXIgZGlzYWJsZUF1dG9GZXRjaCA9XG4gICAgICAgICAgICBzb3VyY2UuZGlzYWJsZUF1dG9GZXRjaCB8fCBmdWxsUmVxdWVzdC5pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgICBuZXdQZGZNYW5hZ2VyID0gbmV3IE5ldHdvcmtQZGZNYW5hZ2VyKFxuICAgICAgICAgICAgZG9jSWQsXG4gICAgICAgICAgICBwZGZTdHJlYW0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1zZ0hhbmRsZXI6IGhhbmRsZXIsXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiBzb3VyY2UucGFzc3dvcmQsXG4gICAgICAgICAgICAgIGxlbmd0aDogZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCxcbiAgICAgICAgICAgICAgZGlzYWJsZUF1dG9GZXRjaCxcbiAgICAgICAgICAgICAgcmFuZ2VDaHVua1NpemU6IHNvdXJjZS5yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldmFsdWF0b3JPcHRpb25zLFxuICAgICAgICAgICAgZG9jQmFzZVVybFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGEgY2hhbmNlIHRoYXQgYG5ld1BkZk1hbmFnZXJgIGlzIG5vdCBpbml0aWFsaXplZCBmb3JcbiAgICAgICAgICAvLyB0aGUgZmlyc3QgZmV3IHJ1bnMgb2YgYHJlYWRjaHVua2AgYmxvY2sgb2YgY29kZS4gQmUgc3VyZSB0byBzZW5kXG4gICAgICAgICAgLy8gYWxsIGNhY2hlZCBjaHVua3MsIGlmIGFueSwgdG8gY2h1bmtlZF9zdHJlYW0gdmlhIHBkZl9tYW5hZ2VyLlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVkQ2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEoY2FjaGVkQ2h1bmtzW2ldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTtcbiAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpO1xuICAgICAgICAgIGNhbmNlbFhIUnMgPSBudWxsO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgICAgICAgIGNhbmNlbFhIUnMgPSBudWxsO1xuICAgICAgICB9KTtcblxuICAgICAgdmFyIGxvYWRlZCA9IDA7XG4gICAgICB2YXIgZmx1c2hDaHVua3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwZGZGaWxlID0gYXJyYXlzVG9CeXRlcyhjYWNoZWRDaHVua3MpO1xuICAgICAgICBpZiAoc291cmNlLmxlbmd0aCAmJiBwZGZGaWxlLmxlbmd0aCAhPT0gc291cmNlLmxlbmd0aCkge1xuICAgICAgICAgIHdhcm4oXCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGRhdGEgaXMgYXJyYXksIGluc3RhbnRpYXRpbmcgZGlyZWN0bHkgZnJvbSBpdFxuICAgICAgICB0cnkge1xuICAgICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgTG9jYWxQZGZNYW5hZ2VyKFxuICAgICAgICAgICAgZG9jSWQsXG4gICAgICAgICAgICBwZGZGaWxlLFxuICAgICAgICAgICAgc291cmNlLnBhc3N3b3JkLFxuICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9ucyxcbiAgICAgICAgICAgIGRvY0Jhc2VVcmxcbiAgICAgICAgICApO1xuICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlc29sdmUobmV3UGRmTWFuYWdlcik7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTtcbiAgICAgIH07XG4gICAgICB2YXIgcmVhZFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciByZWFkQ2h1bmsgPSBmdW5jdGlvbiAoeyB2YWx1ZSwgZG9uZSB9KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIGlmICghbmV3UGRmTWFuYWdlcikge1xuICAgICAgICAgICAgICAgIGZsdXNoQ2h1bmtzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG9hZGVkICs9IGFycmF5Qnl0ZUxlbmd0aCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgIGhhbmRsZXIuc2VuZChcIkRvY1Byb2dyZXNzXCIsIHtcbiAgICAgICAgICAgICAgICBsb2FkZWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IE1hdGgubWF4KGxvYWRlZCwgZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCB8fCAwKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdQZGZNYW5hZ2VyKSB7XG4gICAgICAgICAgICAgIG5ld1BkZk1hbmFnZXIuc2VuZFByb2dyZXNzaXZlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjYWNoZWRDaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bGxSZXF1ZXN0LnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJlYWRQcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChlKTtcbiAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7XG4gICAgICB9KTtcblxuICAgICAgY2FuY2VsWEhScyA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgcGRmU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbik7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcGRmTWFuYWdlckNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXR1cERvYyhkYXRhKSB7XG4gICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoZG9jKSB7XG4gICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtcbiAgICAgICAgaGFuZGxlci5zZW5kKFwiR2V0RG9jXCIsIHsgcGRmSW5mbzogZG9jIH0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvbkZhaWx1cmUoZXgpIHtcbiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpO1xuXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFBhc3N3b3JkRXhjZXB0aW9uKSB7XG4gICAgICAgICAgdmFyIHRhc2sgPSBuZXcgV29ya2VyVGFzayhgUGFzc3dvcmRFeGNlcHRpb246IHJlc3BvbnNlICR7ZXguY29kZX1gKTtcbiAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7XG5cbiAgICAgICAgICBoYW5kbGVyXG4gICAgICAgICAgICAuc2VuZFdpdGhQcm9taXNlKFwiUGFzc3dvcmRSZXF1ZXN0XCIsIGV4KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHsgcGFzc3dvcmQgfSkge1xuICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spO1xuICAgICAgICAgICAgICBwZGZNYW5hZ2VyLnVwZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgICAgICAgICAgICAgcGRmTWFuYWdlclJlYWR5KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgaGFuZGxlci5zZW5kKFwiRG9jRXhjZXB0aW9uXCIsIGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGV4IGluc3RhbmNlb2YgSW52YWxpZFBERkV4Y2VwdGlvbiB8fFxuICAgICAgICAgIGV4IGluc3RhbmNlb2YgTWlzc2luZ1BERkV4Y2VwdGlvbiB8fFxuICAgICAgICAgIGV4IGluc3RhbmNlb2YgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIHx8XG4gICAgICAgICAgZXggaW5zdGFuY2VvZiBVbmtub3duRXJyb3JFeGNlcHRpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgaGFuZGxlci5zZW5kKFwiRG9jRXhjZXB0aW9uXCIsIGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYW5kbGVyLnNlbmQoXG4gICAgICAgICAgICBcIkRvY0V4Y2VwdGlvblwiLFxuICAgICAgICAgICAgbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC50b1N0cmluZygpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcGRmTWFuYWdlclJlYWR5KCkge1xuICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7XG5cbiAgICAgICAgbG9hZERvY3VtZW50KGZhbHNlKS50aGVuKG9uU3VjY2VzcywgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtcblxuICAgICAgICAgIC8vIFRyeSBhZ2FpbiB3aXRoIHJlY292ZXJ5TW9kZSA9PSB0cnVlXG4gICAgICAgICAgaWYgKCEocmVhc29uIGluc3RhbmNlb2YgWFJlZlBhcnNlRXhjZXB0aW9uKSkge1xuICAgICAgICAgICAgb25GYWlsdXJlKHJlYXNvbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpO1xuICAgICAgICAgIHBkZk1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtcblxuICAgICAgICAgICAgbG9hZERvY3VtZW50KHRydWUpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWx1cmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpO1xuXG4gICAgICB2YXIgZXZhbHVhdG9yT3B0aW9ucyA9IHtcbiAgICAgICAgbWF4SW1hZ2VTaXplOiBkYXRhLm1heEltYWdlU2l6ZSxcbiAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBkYXRhLmRpc2FibGVGb250RmFjZSxcbiAgICAgICAgaWdub3JlRXJyb3JzOiBkYXRhLmlnbm9yZUVycm9ycyxcbiAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBkYXRhLmlzRXZhbFN1cHBvcnRlZCxcbiAgICAgICAgZm9udEV4dHJhUHJvcGVydGllczogZGF0YS5mb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgfTtcblxuICAgICAgZ2V0UGRmTWFuYWdlcihkYXRhLCBldmFsdWF0b3JPcHRpb25zKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAobmV3UGRmTWFuYWdlcikge1xuICAgICAgICAgIGlmICh0ZXJtaW5hdGVkKSB7XG4gICAgICAgICAgICAvLyBXZSB3ZXJlIGluIGEgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIHRoZSBtYW5hZ2VyLCBidXQgaXQgZ290XG4gICAgICAgICAgICAvLyB0ZXJtaW5hdGVkIGluIHRoZSBtaWRkbGUuXG4gICAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnRlcm1pbmF0ZShcbiAgICAgICAgICAgICAgbmV3IEFib3J0RXhjZXB0aW9uKFwiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLlwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgdGVybWluYXRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGRmTWFuYWdlciA9IG5ld1BkZk1hbmFnZXI7XG5cbiAgICAgICAgICBwZGZNYW5hZ2VyLm9uTG9hZGVkU3RyZWFtKCkudGhlbihmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgICAgICBoYW5kbGVyLnNlbmQoXCJEYXRhTG9hZGVkXCIsIHsgbGVuZ3RoOiBzdHJlYW0uYnl0ZXMuYnl0ZUxlbmd0aCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocGRmTWFuYWdlclJlYWR5LCBvbkZhaWx1cmUpO1xuICAgIH1cblxuICAgIGhhbmRsZXIub24oXCJHZXRQYWdlXCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZShkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKGRhdGEucGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgXCJyb3RhdGVcIiksXG4gICAgICAgICAgcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgXCJyZWZcIiksXG4gICAgICAgICAgcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgXCJ1c2VyVW5pdFwiKSxcbiAgICAgICAgICBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCBcInZpZXdcIiksXG4gICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKFtyb3RhdGUsIHJlZiwgdXNlclVuaXQsIHZpZXddKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJvdGF0ZSxcbiAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgIHVzZXJVbml0LFxuICAgICAgICAgICAgdmlldyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldFBhZ2VJbmRleFwiLCBmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2VJbmRleCh7IHJlZiB9KSB7XG4gICAgICBjb25zdCBwYWdlUmVmID0gUmVmLmdldChyZWYubnVtLCByZWYuZ2VuKTtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJnZXRQYWdlSW5kZXhcIiwgW3BhZ2VSZWZdKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXREZXN0aW5hdGlvbnNcIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXREZXN0aW5hdGlvbnMoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcImRlc3RpbmF0aW9uc1wiKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXREZXN0aW5hdGlvblwiLCBmdW5jdGlvbiB3cGhTZXR1cEdldERlc3RpbmF0aW9uKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJnZXREZXN0aW5hdGlvblwiLCBbZGF0YS5pZF0pO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldFBhZ2VMYWJlbHNcIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlTGFiZWxzKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJwYWdlTGFiZWxzXCIpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldFBhZ2VMYXlvdXRcIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlTGF5b3V0KGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJwYWdlTGF5b3V0XCIpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldFBhZ2VNb2RlXCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZU1vZGUoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcInBhZ2VNb2RlXCIpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldFZpZXdlclByZWZlcmVuY2VzXCIsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwidmlld2VyUHJlZmVyZW5jZXNcIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0T3BlbkFjdGlvblwiLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcIm9wZW5BY3Rpb25cIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0QXR0YWNobWVudHNcIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRBdHRhY2htZW50cyhkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwiYXR0YWNobWVudHNcIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0SmF2YVNjcmlwdFwiLCBmdW5jdGlvbiB3cGhTZXR1cEdldEphdmFTY3JpcHQoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcImphdmFTY3JpcHRcIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0T3V0bGluZVwiLCBmdW5jdGlvbiB3cGhTZXR1cEdldE91dGxpbmUoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcImRvY3VtZW50T3V0bGluZVwiKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXRPcHRpb25hbENvbnRlbnRDb25maWdcIiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJvcHRpb25hbENvbnRlbnRDb25maWdcIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0UGVybWlzc2lvbnNcIiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJwZXJtaXNzaW9uc1wiKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXRNZXRhZGF0YVwiLCBmdW5jdGlvbiB3cGhTZXR1cEdldE1ldGFkYXRhKGRhdGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgIHBkZk1hbmFnZXIuZW5zdXJlRG9jKFwiZG9jdW1lbnRJbmZvXCIpLFxuICAgICAgICBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJtZXRhZGF0YVwiKSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldERhdGFcIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXREYXRhKGRhdGEpIHtcbiAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpO1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlcztcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldFN0YXRzXCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0U3RhdHMoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlWFJlZihcInN0YXRzXCIpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldEFubm90YXRpb25zXCIsIGZ1bmN0aW9uICh7IHBhZ2VJbmRleCwgaW50ZW50IH0pIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgIHJldHVybiBwYWdlLmdldEFubm90YXRpb25zRGF0YShpbnRlbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiU2F2ZURvY3VtZW50XCIsIGZ1bmN0aW9uICh7XG4gICAgICBudW1QYWdlcyxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlLFxuICAgICAgZmlsZW5hbWUsXG4gICAgfSkge1xuICAgICAgcGRmTWFuYWdlci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9IFtwZGZNYW5hZ2VyLm9uTG9hZGVkU3RyZWFtKCldO1xuICAgICAgY29uc3QgZG9jdW1lbnQgPSBwZGZNYW5hZ2VyLnBkZkRvY3VtZW50O1xuICAgICAgZm9yIChsZXQgcGFnZUluZGV4ID0gMDsgcGFnZUluZGV4IDwgbnVtUGFnZXM7IHBhZ2VJbmRleCsrKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkge1xuICAgICAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBTYXZlOiBwYWdlICR7cGFnZUluZGV4fWApO1xuICAgICAgICAgICAgcmV0dXJuIHBhZ2Uuc2F2ZShoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChbc3RyZWFtLCAuLi5yZWZzXSkgPT4ge1xuICAgICAgICBsZXQgbmV3UmVmcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiByZWZzKSB7XG4gICAgICAgICAgbmV3UmVmcyA9IHJlZlxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHggIT09IG51bGwpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgbmV3UmVmcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3UmVmcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBObyBuZXcgcmVmcyBzbyBqdXN0IHJldHVybiB0aGUgaW5pdGlhbCBieXRlc1xuICAgICAgICAgIHJldHVybiBzdHJlYW0uYnl0ZXM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4cmVmID0gZG9jdW1lbnQueHJlZjtcbiAgICAgICAgbGV0IG5ld1hyZWZJbmZvID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKHhyZWYudHJhaWxlcikge1xuICAgICAgICAgIC8vIEdldCBzdHJpbmcgaW5mbyBmcm9tIEluZm8gaW4gb3JkZXIgdG8gY29tcHV0ZSBmaWxlSWRcbiAgICAgICAgICBjb25zdCBfaW5mbyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgY29uc3QgeHJlZkluZm8gPSB4cmVmLnRyYWlsZXIuZ2V0KFwiSW5mb1wiKSB8fCBudWxsO1xuICAgICAgICAgIGlmICh4cmVmSW5mbykge1xuICAgICAgICAgICAgeHJlZkluZm8uZm9yRWFjaCgoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcoa2V5KSAmJiBpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBfaW5mb1trZXldID0gc3RyaW5nVG9QREZTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdYcmVmSW5mbyA9IHtcbiAgICAgICAgICAgIHJvb3RSZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoXCJSb290XCIpIHx8IG51bGwsXG4gICAgICAgICAgICBlbmNyeXB0OiB4cmVmLnRyYWlsZXIuZ2V0UmF3KFwiRW5jcnlwdFwiKSB8fCBudWxsLFxuICAgICAgICAgICAgbmV3UmVmOiB4cmVmLmdldE5ld1JlZigpLFxuICAgICAgICAgICAgaW5mb1JlZjogeHJlZi50cmFpbGVyLmdldFJhdyhcIkluZm9cIikgfHwgbnVsbCxcbiAgICAgICAgICAgIGluZm86IF9pbmZvLFxuICAgICAgICAgICAgZmlsZUlkczogeHJlZi50cmFpbGVyLmdldFJhdyhcIklEXCIpIHx8IG51bGwsXG4gICAgICAgICAgICBzdGFydFhSZWY6IGRvY3VtZW50LnN0YXJ0WFJlZixcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgeHJlZi5yZXNldE5ld1JlZigpO1xuXG4gICAgICAgIHJldHVybiBpbmNyZW1lbnRhbFVwZGF0ZShzdHJlYW0uYnl0ZXMsIG5ld1hyZWZJbmZvLCBuZXdSZWZzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcbiAgICAgIFwiR2V0T3BlcmF0b3JMaXN0XCIsXG4gICAgICBmdW5jdGlvbiB3cGhTZXR1cFJlbmRlclBhZ2UoZGF0YSwgc2luaykge1xuICAgICAgICB2YXIgcGFnZUluZGV4ID0gZGF0YS5wYWdlSW5kZXg7XG4gICAgICAgIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgICB2YXIgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBHZXRPcGVyYXRvckxpc3Q6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7XG4gICAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spO1xuXG4gICAgICAgICAgLy8gTk9URTogS2VlcCB0aGlzIGNvbmRpdGlvbiBpbiBzeW5jIHdpdGggdGhlIGBpbmZvYCBoZWxwZXIgZnVuY3Rpb24uXG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSB2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MgPyBEYXRlLm5vdygpIDogMDtcblxuICAgICAgICAgIC8vIFByZSBjb21waWxlIHRoZSBwZGYgcGFnZSBhbmQgZmV0Y2ggdGhlIGZvbnRzL2ltYWdlcy5cbiAgICAgICAgICBwYWdlXG4gICAgICAgICAgICAuZ2V0T3BlcmF0b3JMaXN0KHtcbiAgICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICAgICAgc2luayxcbiAgICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgICAgaW50ZW50OiBkYXRhLmludGVudCxcbiAgICAgICAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogZGF0YS5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLFxuICAgICAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogZGF0YS5hbm5vdGF0aW9uU3RvcmFnZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKG9wZXJhdG9yTGlzdEluZm8pIHtcbiAgICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICBpbmZvKFxuICAgICAgICAgICAgICAgICAgICBgcGFnZT0ke3BhZ2VJbmRleCArIDF9IC0gZ2V0T3BlcmF0b3JMaXN0OiB0aW1lPWAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAke0RhdGUubm93KCkgLSBzdGFydH1tcywgbGVuPSR7b3BlcmF0b3JMaXN0SW5mby5sZW5ndGh9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICBpZiAodGFzay50ZXJtaW5hdGVkKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGlnbm9yaW5nIGVycm9ycyBmcm9tIHRoZSB0ZXJtaW5hdGVkIHRocmVhZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGJlaGF2aW9yLCBnZW5lcmF0aW5nIHVua25vd25cbiAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBmZWF0dXJlIG5vdGlmaWNhdGlvbiBvbiBlcnJvcnMuXG4gICAgICAgICAgICAgICAgaGFuZGxlci5zZW5kKFwiVW5zdXBwb3J0ZWRGZWF0dXJlXCIsIHtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JPcGVyYXRvckxpc3QsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgYHJlYXNvbmAgYmUgcmUtdGhyb3duIGhlcmUgKGN1cnJlbnRseSB0aGF0XG4gICAgICAgICAgICAgICAgLy8gICAgICAgY2FzdWVzIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAuLi5cIiBtZXNzYWdlcyBpbiB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgICBjb25zb2xlKT9cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdGhpc1xuICAgICk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0VGV4dENvbnRlbnRcIiwgZnVuY3Rpb24gd3BoRXh0cmFjdFRleHQoZGF0YSwgc2luaykge1xuICAgICAgdmFyIHBhZ2VJbmRleCA9IGRhdGEucGFnZUluZGV4O1xuICAgICAgc2luay5vblB1bGwgPSBmdW5jdGlvbiAoZGVzaXJlZFNpemUpIHt9O1xuICAgICAgc2luay5vbkNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHt9O1xuXG4gICAgICBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgIHZhciB0YXNrID0gbmV3IFdvcmtlclRhc2soXCJHZXRUZXh0Q29udGVudDogcGFnZSBcIiArIHBhZ2VJbmRleCk7XG4gICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTtcblxuICAgICAgICAvLyBOT1RFOiBLZWVwIHRoaXMgY29uZGl0aW9uIGluIHN5bmMgd2l0aCB0aGUgYGluZm9gIGhlbHBlciBmdW5jdGlvbi5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSB2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MgPyBEYXRlLm5vdygpIDogMDtcblxuICAgICAgICBwYWdlXG4gICAgICAgICAgLmV4dHJhY3RUZXh0Q29udGVudCh7XG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgIHNpbmssXG4gICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiBkYXRhLm5vcm1hbGl6ZVdoaXRlc3BhY2UsXG4gICAgICAgICAgICBjb21iaW5lVGV4dEl0ZW1zOiBkYXRhLmNvbWJpbmVUZXh0SXRlbXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTtcblxuICAgICAgICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBpbmZvKFxuICAgICAgICAgICAgICAgICAgYHBhZ2U9JHtwYWdlSW5kZXggKyAxfSAtIGdldFRleHRDb250ZW50OiB0aW1lPWAgK1xuICAgICAgICAgICAgICAgICAgICBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spO1xuICAgICAgICAgICAgICBpZiAodGFzay50ZXJtaW5hdGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpZ25vcmluZyBlcnJvcnMgZnJvbSB0aGUgdGVybWluYXRlZCB0aHJlYWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG5cbiAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIGByZWFzb25gIGJlIHJlLXRocm93biBoZXJlIChjdXJyZW50bHkgdGhhdCBjYXN1ZXNcbiAgICAgICAgICAgICAgLy8gICAgICAgXCJVbmNhdWdodCBleGNlcHRpb246IC4uLlwiIG1lc3NhZ2VzIGluIHRoZSBjb25zb2xlKT9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiRm9udEZhbGxiYWNrXCIsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5mb250RmFsbGJhY2soZGF0YS5pZCwgaGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiQ2xlYW51cFwiLCBmdW5jdGlvbiB3cGhDbGVhbnVwKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmNsZWFudXAoLyogbWFudWFsbHlUcmlnZ2VyZWQgPSAqLyB0cnVlKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJUZXJtaW5hdGVcIiwgZnVuY3Rpb24gd3BoVGVybWluYXRlKGRhdGEpIHtcbiAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlO1xuXG4gICAgICBjb25zdCB3YWl0T24gPSBbXTtcbiAgICAgIGlmIChwZGZNYW5hZ2VyKSB7XG4gICAgICAgIHBkZk1hbmFnZXIudGVybWluYXRlKG5ldyBBYm9ydEV4Y2VwdGlvbihcIldvcmtlciB3YXMgdGVybWluYXRlZC5cIikpO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBQcm9taXNlID0gcGRmTWFuYWdlci5jbGVhbnVwKCk7XG4gICAgICAgIHdhaXRPbi5wdXNoKGNsZWFudXBQcm9taXNlKTtcblxuICAgICAgICBwZGZNYW5hZ2VyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsZWFyUHJpbWl0aXZlQ2FjaGVzKCk7XG4gICAgICB9XG4gICAgICBpZiAoY2FuY2VsWEhScykge1xuICAgICAgICBjYW5jZWxYSFJzKG5ldyBBYm9ydEV4Y2VwdGlvbihcIldvcmtlciB3YXMgdGVybWluYXRlZC5cIikpO1xuICAgICAgfVxuXG4gICAgICBXb3JrZXJUYXNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgIHdhaXRPbi5wdXNoKHRhc2suZmluaXNoZWQpO1xuICAgICAgICB0YXNrLnRlcm1pbmF0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbCh3YWl0T24pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBOb3RpY2UgdGhhdCBldmVuIGlmIHdlIGRlc3Ryb3lpbmcgaGFuZGxlciwgcmVzb2x2ZWQgcmVzcG9uc2UgcHJvbWlzZVxuICAgICAgICAvLyBtdXN0IGJlIHNlbnQgYmFjay5cbiAgICAgICAgaGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgIGhhbmRsZXIgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiUmVhZHlcIiwgZnVuY3Rpb24gd3BoUmVhZHkoZGF0YSkge1xuICAgICAgc2V0dXBEb2MoZG9jUGFyYW1zKTtcbiAgICAgIGRvY1BhcmFtcyA9IG51bGw7IC8vIHdlIGRvbid0IG5lZWQgZG9jUGFyYW1zIGFueW1vcmUgLS0gc2F2aW5nIG1lbW9yeS5cbiAgICB9KTtcbiAgICByZXR1cm4gd29ya2VySGFuZGxlck5hbWU7XG4gIH1cblxuICBzdGF0aWMgaW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpIHtcbiAgICB2YXIgaGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihcIndvcmtlclwiLCBcIm1haW5cIiwgcG9ydCk7XG4gICAgV29ya2VyTWVzc2FnZUhhbmRsZXIuc2V0dXAoaGFuZGxlciwgcG9ydCk7XG4gICAgaGFuZGxlci5zZW5kKFwicmVhZHlcIiwgbnVsbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNZXNzYWdlUG9ydChtYXliZVBvcnQpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgbWF5YmVQb3J0LnBvc3RNZXNzYWdlID09PSBcImZ1bmN0aW9uXCIgJiYgXCJvbm1lc3NhZ2VcIiBpbiBtYXliZVBvcnRcbiAgKTtcbn1cblxuLy8gV29ya2VyIHRocmVhZCAoYW5kIG5vdCBOb2RlLmpzKT9cbmlmIChcbiAgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAhaXNOb2RlSlMgJiZcbiAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgaXNNZXNzYWdlUG9ydChzZWxmKVxuKSB7XG4gIFdvcmtlck1lc3NhZ2VIYW5kbGVyLmluaXRpYWxpemVGcm9tUG9ydChzZWxmKTtcbn1cblxuZXhwb3J0IHsgV29ya2VyVGFzaywgV29ya2VyTWVzc2FnZUhhbmRsZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IFwiLi9jb21wYXRpYmlsaXR5LmpzXCI7XG5cbmNvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTtcbmNvbnN0IEZPTlRfSURFTlRJVFlfTUFUUklYID0gWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF07XG5cbi8vIFBlcm1pc3Npb24gZmxhZ3MgZnJvbSBUYWJsZSAyMiwgU2VjdGlvbiA3LjYuMy4yIG9mIHRoZSBQREYgc3BlY2lmaWNhdGlvbi5cbmNvbnN0IFBlcm1pc3Npb25GbGFnID0ge1xuICBQUklOVDogMHgwNCxcbiAgTU9ESUZZX0NPTlRFTlRTOiAweDA4LFxuICBDT1BZOiAweDEwLFxuICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsXG4gIEZJTExfSU5URVJBQ1RJVkVfRk9STVM6IDB4MTAwLFxuICBDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOiAweDIwMCxcbiAgQVNTRU1CTEU6IDB4NDAwLFxuICBQUklOVF9ISUdIX1FVQUxJVFk6IDB4ODAwLFxufTtcblxuY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7XG4gIEZJTEw6IDAsXG4gIFNUUk9LRTogMSxcbiAgRklMTF9TVFJPS0U6IDIsXG4gIElOVklTSUJMRTogMyxcbiAgRklMTF9BRERfVE9fUEFUSDogNCxcbiAgU1RST0tFX0FERF9UT19QQVRIOiA1LFxuICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNixcbiAgQUREX1RPX1BBVEg6IDcsXG4gIEZJTExfU1RST0tFX01BU0s6IDMsXG4gIEFERF9UT19QQVRIX0ZMQUc6IDQsXG59O1xuXG5jb25zdCBJbWFnZUtpbmQgPSB7XG4gIEdSQVlTQ0FMRV8xQlBQOiAxLFxuICBSR0JfMjRCUFA6IDIsXG4gIFJHQkFfMzJCUFA6IDMsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uVHlwZSA9IHtcbiAgVEVYVDogMSxcbiAgTElOSzogMixcbiAgRlJFRVRFWFQ6IDMsXG4gIExJTkU6IDQsXG4gIFNRVUFSRTogNSxcbiAgQ0lSQ0xFOiA2LFxuICBQT0xZR09OOiA3LFxuICBQT0xZTElORTogOCxcbiAgSElHSExJR0hUOiA5LFxuICBVTkRFUkxJTkU6IDEwLFxuICBTUVVJR0dMWTogMTEsXG4gIFNUUklLRU9VVDogMTIsXG4gIFNUQU1QOiAxMyxcbiAgQ0FSRVQ6IDE0LFxuICBJTks6IDE1LFxuICBQT1BVUDogMTYsXG4gIEZJTEVBVFRBQ0hNRU5UOiAxNyxcbiAgU09VTkQ6IDE4LFxuICBNT1ZJRTogMTksXG4gIFdJREdFVDogMjAsXG4gIFNDUkVFTjogMjEsXG4gIFBSSU5URVJNQVJLOiAyMixcbiAgVFJBUE5FVDogMjMsXG4gIFdBVEVSTUFSSzogMjQsXG4gIFRIUkVFRDogMjUsXG4gIFJFREFDVDogMjYsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSB7XG4gIE1BUktFRDogXCJNYXJrZWRcIixcbiAgUkVWSUVXOiBcIlJldmlld1wiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0ge1xuICBNQVJLRUQ6IFwiTWFya2VkXCIsXG4gIFVOTUFSS0VEOiBcIlVubWFya2VkXCIsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSB7XG4gIEFDQ0VQVEVEOiBcIkFjY2VwdGVkXCIsXG4gIFJFSkVDVEVEOiBcIlJlamVjdGVkXCIsXG4gIENBTkNFTExFRDogXCJDYW5jZWxsZWRcIixcbiAgQ09NUExFVEVEOiBcIkNvbXBsZXRlZFwiLFxuICBOT05FOiBcIk5vbmVcIixcbn07XG5cbmNvbnN0IEFubm90YXRpb25SZXBseVR5cGUgPSB7XG4gIEdST1VQOiBcIkdyb3VwXCIsXG4gIFJFUExZOiBcIlJcIixcbn07XG5cbmNvbnN0IEFubm90YXRpb25GbGFnID0ge1xuICBJTlZJU0lCTEU6IDB4MDEsXG4gIEhJRERFTjogMHgwMixcbiAgUFJJTlQ6IDB4MDQsXG4gIE5PWk9PTTogMHgwOCxcbiAgTk9ST1RBVEU6IDB4MTAsXG4gIE5PVklFVzogMHgyMCxcbiAgUkVBRE9OTFk6IDB4NDAsXG4gIExPQ0tFRDogMHg4MCxcbiAgVE9HR0xFTk9WSUVXOiAweDEwMCxcbiAgTE9DS0VEQ09OVEVOVFM6IDB4MjAwLFxufTtcblxuY29uc3QgQW5ub3RhdGlvbkZpZWxkRmxhZyA9IHtcbiAgUkVBRE9OTFk6IDB4MDAwMDAwMSxcbiAgUkVRVUlSRUQ6IDB4MDAwMDAwMixcbiAgTk9FWFBPUlQ6IDB4MDAwMDAwNCxcbiAgTVVMVElMSU5FOiAweDAwMDEwMDAsXG4gIFBBU1NXT1JEOiAweDAwMDIwMDAsXG4gIE5PVE9HR0xFVE9PRkY6IDB4MDAwNDAwMCxcbiAgUkFESU86IDB4MDAwODAwMCxcbiAgUFVTSEJVVFRPTjogMHgwMDEwMDAwLFxuICBDT01CTzogMHgwMDIwMDAwLFxuICBFRElUOiAweDAwNDAwMDAsXG4gIFNPUlQ6IDB4MDA4MDAwMCxcbiAgRklMRVNFTEVDVDogMHgwMTAwMDAwLFxuICBNVUxUSVNFTEVDVDogMHgwMjAwMDAwLFxuICBET05PVFNQRUxMQ0hFQ0s6IDB4MDQwMDAwMCxcbiAgRE9OT1RTQ1JPTEw6IDB4MDgwMDAwMCxcbiAgQ09NQjogMHgxMDAwMDAwLFxuICBSSUNIVEVYVDogMHgyMDAwMDAwLFxuICBSQURJT1NJTlVOSVNPTjogMHgyMDAwMDAwLFxuICBDT01NSVRPTlNFTENIQU5HRTogMHg0MDAwMDAwLFxufTtcblxuY29uc3QgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IHtcbiAgU09MSUQ6IDEsXG4gIERBU0hFRDogMixcbiAgQkVWRUxFRDogMyxcbiAgSU5TRVQ6IDQsXG4gIFVOREVSTElORTogNSxcbn07XG5cbmNvbnN0IFN0cmVhbVR5cGUgPSB7XG4gIFVOS05PV046IFwiVU5LTk9XTlwiLFxuICBGTEFURTogXCJGTEFURVwiLFxuICBMWlc6IFwiTFpXXCIsXG4gIERDVDogXCJEQ1RcIixcbiAgSlBYOiBcIkpQWFwiLFxuICBKQklHOiBcIkpCSUdcIixcbiAgQTg1OiBcIkE4NVwiLFxuICBBSFg6IFwiQUhYXCIsXG4gIENDRjogXCJDQ0ZcIixcbiAgUkxYOiBcIlJMWFwiLCAvLyBQREYgc2hvcnQgbmFtZSBpcyAnUkwnLCBidXQgdGVsZW1ldHJ5IHJlcXVpcmVzIHRocmVlIGNoYXJzLlxufTtcblxuY29uc3QgRm9udFR5cGUgPSB7XG4gIFVOS05PV046IFwiVU5LTk9XTlwiLFxuICBUWVBFMTogXCJUWVBFMVwiLFxuICBUWVBFMUM6IFwiVFlQRTFDXCIsXG4gIENJREZPTlRUWVBFMDogXCJDSURGT05UVFlQRTBcIixcbiAgQ0lERk9OVFRZUEUwQzogXCJDSURGT05UVFlQRTBDXCIsXG4gIFRSVUVUWVBFOiBcIlRSVUVUWVBFXCIsXG4gIENJREZPTlRUWVBFMjogXCJDSURGT05UVFlQRTJcIixcbiAgVFlQRTM6IFwiVFlQRTNcIixcbiAgT1BFTlRZUEU6IFwiT1BFTlRZUEVcIixcbiAgVFlQRTA6IFwiVFlQRTBcIixcbiAgTU1UWVBFMTogXCJNTVRZUEUxXCIsXG59O1xuXG5jb25zdCBWZXJib3NpdHlMZXZlbCA9IHtcbiAgRVJST1JTOiAwLFxuICBXQVJOSU5HUzogMSxcbiAgSU5GT1M6IDUsXG59O1xuXG5jb25zdCBDTWFwQ29tcHJlc3Npb25UeXBlID0ge1xuICBOT05FOiAwLFxuICBCSU5BUlk6IDEsXG4gIFNUUkVBTTogMixcbn07XG5cbi8vIEFsbCB0aGUgcG9zc2libGUgb3BlcmF0aW9ucyBmb3IgYW4gb3BlcmF0b3IgbGlzdC5cbmNvbnN0IE9QUyA9IHtcbiAgLy8gSW50ZW50aW9uYWxseSBzdGFydCBmcm9tIDEgc28gaXQgaXMgZWFzeSB0byBzcG90IGJhZCBvcGVyYXRvcnMgdGhhdCB3aWxsIGJlXG4gIC8vIDAncy5cbiAgZGVwZW5kZW5jeTogMSxcbiAgc2V0TGluZVdpZHRoOiAyLFxuICBzZXRMaW5lQ2FwOiAzLFxuICBzZXRMaW5lSm9pbjogNCxcbiAgc2V0TWl0ZXJMaW1pdDogNSxcbiAgc2V0RGFzaDogNixcbiAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LFxuICBzZXRGbGF0bmVzczogOCxcbiAgc2V0R1N0YXRlOiA5LFxuICBzYXZlOiAxMCxcbiAgcmVzdG9yZTogMTEsXG4gIHRyYW5zZm9ybTogMTIsXG4gIG1vdmVUbzogMTMsXG4gIGxpbmVUbzogMTQsXG4gIGN1cnZlVG86IDE1LFxuICBjdXJ2ZVRvMjogMTYsXG4gIGN1cnZlVG8zOiAxNyxcbiAgY2xvc2VQYXRoOiAxOCxcbiAgcmVjdGFuZ2xlOiAxOSxcbiAgc3Ryb2tlOiAyMCxcbiAgY2xvc2VTdHJva2U6IDIxLFxuICBmaWxsOiAyMixcbiAgZW9GaWxsOiAyMyxcbiAgZmlsbFN0cm9rZTogMjQsXG4gIGVvRmlsbFN0cm9rZTogMjUsXG4gIGNsb3NlRmlsbFN0cm9rZTogMjYsXG4gIGNsb3NlRU9GaWxsU3Ryb2tlOiAyNyxcbiAgZW5kUGF0aDogMjgsXG4gIGNsaXA6IDI5LFxuICBlb0NsaXA6IDMwLFxuICBiZWdpblRleHQ6IDMxLFxuICBlbmRUZXh0OiAzMixcbiAgc2V0Q2hhclNwYWNpbmc6IDMzLFxuICBzZXRXb3JkU3BhY2luZzogMzQsXG4gIHNldEhTY2FsZTogMzUsXG4gIHNldExlYWRpbmc6IDM2LFxuICBzZXRGb250OiAzNyxcbiAgc2V0VGV4dFJlbmRlcmluZ01vZGU6IDM4LFxuICBzZXRUZXh0UmlzZTogMzksXG4gIG1vdmVUZXh0OiA0MCxcbiAgc2V0TGVhZGluZ01vdmVUZXh0OiA0MSxcbiAgc2V0VGV4dE1hdHJpeDogNDIsXG4gIG5leHRMaW5lOiA0MyxcbiAgc2hvd1RleHQ6IDQ0LFxuICBzaG93U3BhY2VkVGV4dDogNDUsXG4gIG5leHRMaW5lU2hvd1RleHQ6IDQ2LFxuICBuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDogNDcsXG4gIHNldENoYXJXaWR0aDogNDgsXG4gIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksXG4gIHNldFN0cm9rZUNvbG9yU3BhY2U6IDUwLFxuICBzZXRGaWxsQ29sb3JTcGFjZTogNTEsXG4gIHNldFN0cm9rZUNvbG9yOiA1MixcbiAgc2V0U3Ryb2tlQ29sb3JOOiA1MyxcbiAgc2V0RmlsbENvbG9yOiA1NCxcbiAgc2V0RmlsbENvbG9yTjogNTUsXG4gIHNldFN0cm9rZUdyYXk6IDU2LFxuICBzZXRGaWxsR3JheTogNTcsXG4gIHNldFN0cm9rZVJHQkNvbG9yOiA1OCxcbiAgc2V0RmlsbFJHQkNvbG9yOiA1OSxcbiAgc2V0U3Ryb2tlQ01ZS0NvbG9yOiA2MCxcbiAgc2V0RmlsbENNWUtDb2xvcjogNjEsXG4gIHNoYWRpbmdGaWxsOiA2MixcbiAgYmVnaW5JbmxpbmVJbWFnZTogNjMsXG4gIGJlZ2luSW1hZ2VEYXRhOiA2NCxcbiAgZW5kSW5saW5lSW1hZ2U6IDY1LFxuICBwYWludFhPYmplY3Q6IDY2LFxuICBtYXJrUG9pbnQ6IDY3LFxuICBtYXJrUG9pbnRQcm9wczogNjgsXG4gIGJlZ2luTWFya2VkQ29udGVudDogNjksXG4gIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCxcbiAgZW5kTWFya2VkQ29udGVudDogNzEsXG4gIGJlZ2luQ29tcGF0OiA3MixcbiAgZW5kQ29tcGF0OiA3MyxcbiAgcGFpbnRGb3JtWE9iamVjdEJlZ2luOiA3NCxcbiAgcGFpbnRGb3JtWE9iamVjdEVuZDogNzUsXG4gIGJlZ2luR3JvdXA6IDc2LFxuICBlbmRHcm91cDogNzcsXG4gIGJlZ2luQW5ub3RhdGlvbnM6IDc4LFxuICBlbmRBbm5vdGF0aW9uczogNzksXG4gIGJlZ2luQW5ub3RhdGlvbjogODAsXG4gIGVuZEFubm90YXRpb246IDgxLFxuICBwYWludEpwZWdYT2JqZWN0OiA4MixcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiA4MyxcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LFxuICBwYWludEltYWdlWE9iamVjdDogODUsXG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiA4NixcbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsXG4gIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiA4OCxcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0OiA4OSxcbiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCxcbiAgY29uc3RydWN0UGF0aDogOTEsXG59O1xuXG5jb25zdCBVTlNVUFBPUlRFRF9GRUFUVVJFUyA9IHtcbiAgLyoqIEBkZXByZWNhdGVkIHVudXNlZCAqL1xuICB1bmtub3duOiBcInVua25vd25cIixcbiAgZm9ybXM6IFwiZm9ybXNcIixcbiAgamF2YVNjcmlwdDogXCJqYXZhU2NyaXB0XCIsXG4gIHNtYXNrOiBcInNtYXNrXCIsXG4gIHNoYWRpbmdQYXR0ZXJuOiBcInNoYWRpbmdQYXR0ZXJuXCIsXG4gIC8qKiBAZGVwcmVjYXRlZCB1bnVzZWQgKi9cbiAgZm9udDogXCJmb250XCIsXG4gIGVycm9yVGlsaW5nUGF0dGVybjogXCJlcnJvclRpbGluZ1BhdHRlcm5cIixcbiAgZXJyb3JFeHRHU3RhdGU6IFwiZXJyb3JFeHRHU3RhdGVcIixcbiAgZXJyb3JYT2JqZWN0OiBcImVycm9yWE9iamVjdFwiLFxuICBlcnJvckZvbnRMb2FkVHlwZTM6IFwiZXJyb3JGb250TG9hZFR5cGUzXCIsXG4gIGVycm9yRm9udFN0YXRlOiBcImVycm9yRm9udFN0YXRlXCIsXG4gIGVycm9yRm9udE1pc3Npbmc6IFwiZXJyb3JGb250TWlzc2luZ1wiLFxuICBlcnJvckZvbnRUcmFuc2xhdGU6IFwiZXJyb3JGb250VHJhbnNsYXRlXCIsXG4gIGVycm9yQ29sb3JTcGFjZTogXCJlcnJvckNvbG9yU3BhY2VcIixcbiAgZXJyb3JPcGVyYXRvckxpc3Q6IFwiZXJyb3JPcGVyYXRvckxpc3RcIixcbiAgZXJyb3JGb250VG9Vbmljb2RlOiBcImVycm9yRm9udFRvVW5pY29kZVwiLFxuICBlcnJvckZvbnRMb2FkTmF0aXZlOiBcImVycm9yRm9udExvYWROYXRpdmVcIixcbiAgZXJyb3JGb250R2V0UGF0aDogXCJlcnJvckZvbnRHZXRQYXRoXCIsXG4gIGVycm9yTWFya2VkQ29udGVudDogXCJlcnJvck1hcmtlZENvbnRlbnRcIixcbn07XG5cbmNvbnN0IFBhc3N3b3JkUmVzcG9uc2VzID0ge1xuICBORUVEX1BBU1NXT1JEOiAxLFxuICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIsXG59O1xuXG5sZXQgdmVyYm9zaXR5ID0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1M7XG5cbmZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGxldmVsKSB7XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkge1xuICAgIHZlcmJvc2l0eSA9IGxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkge1xuICByZXR1cm4gdmVyYm9zaXR5O1xufVxuXG4vLyBBIG5vdGljZSBmb3IgZGV2cy4gVGhlc2UgYXJlIGdvb2QgZm9yIHRoaW5ncyB0aGF0IGFyZSBoZWxwZnVsIHRvIGRldnMsIHN1Y2hcbi8vIGFzIHdhcm5pbmcgdGhhdCBXb3JrZXJzIHdlcmUgZGlzYWJsZWQsIHdoaWNoIGlzIGltcG9ydGFudCB0byBkZXZzIGJ1dCBub3Rcbi8vIGVuZCB1c2Vycy5cbmZ1bmN0aW9uIGluZm8obXNnKSB7XG4gIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MpIHtcbiAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7XG4gIH1cbn1cblxuLy8gTm9uLWZhdGFsIHdhcm5pbmdzLlxuZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykge1xuICAgIGNvbnNvbGUubG9nKGBXYXJuaW5nOiAke21zZ31gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnJlYWNoYWJsZShtc2cpIHtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kLCBtc2cpIHtcbiAgaWYgKCFjb25kKSB7XG4gICAgdW5yZWFjaGFibGUobXNnKTtcbiAgfVxufVxuXG4vLyBDaGVja3MgaWYgVVJMcyBoYXZlIHRoZSBzYW1lIG9yaWdpbi4gRm9yIG5vbi1IVFRQIGJhc2VkIFVSTHMsIHJldHVybnMgZmFsc2UuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW4oYmFzZVVybCwgb3RoZXJVcmwpIHtcbiAgbGV0IGJhc2U7XG4gIHRyeSB7XG4gICAgYmFzZSA9IG5ldyBVUkwoYmFzZVVybCk7XG4gICAgaWYgKCFiYXNlLm9yaWdpbiB8fCBiYXNlLm9yaWdpbiA9PT0gXCJudWxsXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gbm9uLUhUVFAgdXJsXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgb3RoZXIgPSBuZXcgVVJMKG90aGVyVXJsLCBiYXNlKTtcbiAgcmV0dXJuIGJhc2Uub3JpZ2luID09PSBvdGhlci5vcmlnaW47XG59XG5cbi8vIENoZWNrcyBpZiBVUkxzIHVzZSBvbmUgb2YgdGhlIGFsbG93ZWQgcHJvdG9jb2xzLCBlLmcuIHRvIGF2b2lkIFhTUy5cbmZ1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2wodXJsKSB7XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN3aXRjaCAodXJsLnByb3RvY29sKSB7XG4gICAgY2FzZSBcImh0dHA6XCI6XG4gICAgY2FzZSBcImh0dHBzOlwiOlxuICAgIGNhc2UgXCJmdHA6XCI6XG4gICAgY2FzZSBcIm1haWx0bzpcIjpcbiAgICBjYXNlIFwidGVsOlwiOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIHZhbGlkIGFic29sdXRlIFVSTC5cbiAqXG4gKiBAcGFyYW0ge1VSTHxzdHJpbmd9IHVybCAtIEFuIGFic29sdXRlLCBvciByZWxhdGl2ZSwgVVJMLlxuICogQHBhcmFtIHtVUkx8c3RyaW5nfSBiYXNlVXJsIC0gQW4gYWJzb2x1dGUgVVJMLlxuICogQHJldHVybnMgRWl0aGVyIGEgdmFsaWQge1VSTH0sIG9yIGBudWxsYCBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwodXJsLCBiYXNlVXJsKSB7XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCk7XG4gICAgaWYgKF9pc1ZhbGlkUHJvdG9jb2woYWJzb2x1dGVVcmwpKSB7XG4gICAgICByZXR1cm4gYWJzb2x1dGVVcmw7XG4gICAgfVxuICB9IGNhdGNoIChleCkge1xuICAgIC8qIGBuZXcgVVJMKClgIHdpbGwgdGhyb3cgb24gaW5jb3JyZWN0IGRhdGEuICovXG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHNoYWRvdyhvYmosIHByb3AsIHZhbHVlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHtcbiAgICB2YWx1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQHR5cGUge2FueX1cbiAqL1xuY29uc3QgQmFzZUV4Y2VwdGlvbiA9IChmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uKG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUV4Y2VwdGlvbikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLlwiKTtcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cbiAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbiAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247XG5cbiAgcmV0dXJuIEJhc2VFeGNlcHRpb247XG59KSgpO1xuXG5jbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHtcbiAgICBzdXBlcihtc2cpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cblxuY2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgZGV0YWlscykge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgfVxufVxuXG5jbGFzcyBJbnZhbGlkUERGRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG5jbGFzcyBNaXNzaW5nUERGRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG5jbGFzcyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBzdGF0dXMpIHtcbiAgICBzdXBlcihtc2cpO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgY2F1c2VkIGR1cmluZyBwYXJzaW5nIFBERiBkYXRhLlxuICovXG5jbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuLyoqXG4gKiBFcnJvciB1c2VkIHRvIGluZGljYXRlIHRhc2sgY2FuY2VsbGF0aW9uLlxuICovXG5jbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuY29uc3QgTnVsbENoYXJhY3RlcnNSZWdFeHAgPSAvXFx4MDAvZztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZU51bGxDaGFyYWN0ZXJzKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgIHdhcm4oXCJUaGUgYXJndW1lbnQgZm9yIHJlbW92ZU51bGxDaGFyYWN0ZXJzIG11c3QgYmUgYSBzdHJpbmcuXCIpO1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKE51bGxDaGFyYWN0ZXJzUmVnRXhwLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyhieXRlcykge1xuICBhc3NlcnQoXG4gICAgYnl0ZXMgIT09IG51bGwgJiYgdHlwZW9mIGJ5dGVzID09PSBcIm9iamVjdFwiICYmIGJ5dGVzLmxlbmd0aCAhPT0gdW5kZWZpbmVkLFxuICAgIFwiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZ1wiXG4gICk7XG4gIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgY29uc3QgTUFYX0FSR1VNRU5UX0NPVU5UID0gODE5MjtcbiAgaWYgKGxlbmd0aCA8IE1BWF9BUkdVTUVOVF9DT1VOVCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ5dGVzKTtcbiAgfVxuICBjb25zdCBzdHJCdWYgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgY29uc3QgY2h1bmtFbmQgPSBNYXRoLm1pbihpICsgTUFYX0FSR1VNRU5UX0NPVU5ULCBsZW5ndGgpO1xuICAgIGNvbnN0IGNodW5rID0gYnl0ZXMuc3ViYXJyYXkoaSwgY2h1bmtFbmQpO1xuICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTtcbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIGFzc2VydCh0eXBlb2Ygc3RyID09PSBcInN0cmluZ1wiLCBcIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXNcIik7XG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICB9XG4gIHJldHVybiBieXRlcztcbn1cblxuLyoqXG4gKiBHZXRzIGxlbmd0aCBvZiB0aGUgYXJyYXkgKEFycmF5LCBVaW50OEFycmF5LCBvciBzdHJpbmcpIGluIGJ5dGVzLlxuICogQHBhcmFtIHtBcnJheTxhbnk+fFVpbnQ4QXJyYXl8c3RyaW5nfSBhcnJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGFycmF5Qnl0ZUxlbmd0aChhcnIpIHtcbiAgaWYgKGFyci5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBhcnIubGVuZ3RoO1xuICB9XG4gIGFzc2VydChhcnIuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkLCBcImFycmF5Qnl0ZUxlbmd0aCAtIGludmFsaWQgYXJndW1lbnQuXCIpO1xuICByZXR1cm4gYXJyLmJ5dGVMZW5ndGg7XG59XG5cbi8qKlxuICogQ29tYmluZXMgYXJyYXkgaXRlbXMgKGFycmF5cykgaW50byBzaW5nbGUgVWludDhBcnJheSBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PGFueT58VWludDhBcnJheXxzdHJpbmc+fSBhcnIgLSB0aGUgYXJyYXkgb2YgdGhlIGFycmF5c1xuICogICAoQXJyYXksIFVpbnQ4QXJyYXksIG9yIHN0cmluZykuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuZnVuY3Rpb24gYXJyYXlzVG9CeXRlcyhhcnIpIHtcbiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgLy8gU2hvcnRjdXQ6IGlmIGZpcnN0IGFuZCBvbmx5IGl0ZW0gaXMgVWludDhBcnJheSwgcmV0dXJuIGl0LlxuICBpZiAobGVuZ3RoID09PSAxICYmIGFyclswXSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gYXJyWzBdO1xuICB9XG4gIGxldCByZXN1bHRMZW5ndGggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0TGVuZ3RoICs9IGFycmF5Qnl0ZUxlbmd0aChhcnJbaV0pO1xuICB9XG4gIGxldCBwb3MgPSAwO1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0TGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGxldCBpdGVtID0gYXJyW2ldO1xuICAgIGlmICghKGl0ZW0gaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGl0ZW0gPSBzdHJpbmdUb0J5dGVzKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbSA9IG5ldyBVaW50OEFycmF5KGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpdGVtTGVuZ3RoID0gaXRlbS5ieXRlTGVuZ3RoO1xuICAgIGRhdGEuc2V0KGl0ZW0sIHBvcyk7XG4gICAgcG9zICs9IGl0ZW1MZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIHN0cmluZzMyKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICh2YWx1ZSA+PiAyNCkgJiAweGZmLFxuICAgICh2YWx1ZSA+PiAxNikgJiAweGZmLFxuICAgICh2YWx1ZSA+PiA4KSAmIDB4ZmYsXG4gICAgdmFsdWUgJiAweGZmXG4gICk7XG59XG5cbi8vIENoZWNrcyB0aGUgZW5kaWFubmVzcyBvZiB0aGUgcGxhdGZvcm0uXG5mdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHtcbiAgY29uc3QgYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICBidWZmZXI4WzBdID0gMTtcbiAgY29uc3QgdmlldzMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcjguYnVmZmVyLCAwLCAxKTtcbiAgcmV0dXJuIHZpZXczMlswXSA9PT0gMTtcbn1cbmNvbnN0IElzTGl0dGxlRW5kaWFuQ2FjaGVkID0ge1xuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInZhbHVlXCIsIGlzTGl0dGxlRW5kaWFuKCkpO1xuICB9LFxufTtcblxuLy8gQ2hlY2tzIGlmIGl0J3MgcG9zc2libGUgdG8gZXZhbCBKUyBleHByZXNzaW9ucy5cbmZ1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHtcbiAgdHJ5IHtcbiAgICBuZXcgRnVuY3Rpb24oXCJcIik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LCBuby1uZXctZnVuY1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5jb25zdCBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSB7XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidmFsdWVcIiwgaXNFdmFsU3VwcG9ydGVkKCkpO1xuICB9LFxufTtcblxuY29uc3QgcmdiQnVmID0gW1wicmdiKFwiLCAwLCBcIixcIiwgMCwgXCIsXCIsIDAsIFwiKVwiXTtcblxuY2xhc3MgVXRpbCB7XG4gIC8vIG1ha2VDc3NSZ2IoKSBjYW4gYmUgY2FsbGVkIHRob3VzYW5kcyBvZiB0aW1lcy4gVXNpbmcgwrRyZ2JCdWZgIGF2b2lkc1xuICAvLyBjcmVhdGluZyBtYW55IGludGVybWVkaWF0ZSBzdHJpbmdzLlxuICBzdGF0aWMgbWFrZUNzc1JnYihyLCBnLCBiKSB7XG4gICAgcmdiQnVmWzFdID0gcjtcbiAgICByZ2JCdWZbM10gPSBnO1xuICAgIHJnYkJ1Zls1XSA9IGI7XG4gICAgcmV0dXJuIHJnYkJ1Zi5qb2luKFwiXCIpO1xuICB9XG5cbiAgLy8gQ29uY2F0ZW5hdGVzIHR3byB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcyB0b2dldGhlciBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikge1xuICAgIHJldHVybiBbXG4gICAgICBtMVswXSAqIG0yWzBdICsgbTFbMl0gKiBtMlsxXSxcbiAgICAgIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLFxuICAgICAgbTFbMF0gKiBtMlsyXSArIG0xWzJdICogbTJbM10sXG4gICAgICBtMVsxXSAqIG0yWzJdICsgbTFbM10gKiBtMlszXSxcbiAgICAgIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sXG4gICAgICBtMVsxXSAqIG0yWzRdICsgbTFbM10gKiBtMls1XSArIG0xWzVdLFxuICAgIF07XG4gIH1cblxuICAvLyBGb3IgMmQgYWZmaW5lIHRyYW5zZm9ybXNcbiAgc3RhdGljIGFwcGx5VHJhbnNmb3JtKHAsIG0pIHtcbiAgICBjb25zdCB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdO1xuICAgIGNvbnN0IHl0ID0gcFswXSAqIG1bMV0gKyBwWzFdICogbVszXSArIG1bNV07XG4gICAgcmV0dXJuIFt4dCwgeXRdO1xuICB9XG5cbiAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7XG4gICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07XG4gICAgY29uc3QgeHQgPSAocFswXSAqIG1bM10gLSBwWzFdICogbVsyXSArIG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZDtcbiAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cblxuICAvLyBBcHBsaWVzIHRoZSB0cmFuc2Zvcm0gdG8gdGhlIHJlY3RhbmdsZSBhbmQgZmluZHMgdGhlIG1pbmltdW0gYXhpYWxseVxuICAvLyBhbGlnbmVkIGJvdW5kaW5nIGJveC5cbiAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHtcbiAgICBjb25zdCBwMSA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0ociwgbSk7XG4gICAgY29uc3QgcDIgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHIuc2xpY2UoMiwgNCksIG0pO1xuICAgIGNvbnN0IHAzID0gVXRpbC5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pO1xuICAgIGNvbnN0IHA0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbclsyXSwgclsxXV0sIG0pO1xuICAgIHJldHVybiBbXG4gICAgICBNYXRoLm1pbihwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksXG4gICAgICBNYXRoLm1pbihwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksXG4gICAgICBNYXRoLm1heChwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksXG4gICAgICBNYXRoLm1heChwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksXG4gICAgXTtcbiAgfVxuXG4gIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICByZXR1cm4gW1xuICAgICAgbVszXSAvIGQsXG4gICAgICAtbVsxXSAvIGQsXG4gICAgICAtbVsyXSAvIGQsXG4gICAgICBtWzBdIC8gZCxcbiAgICAgIChtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQsXG4gICAgICAobVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkLFxuICAgIF07XG4gIH1cblxuICAvLyBBcHBseSBhIGdlbmVyaWMgM2QgbWF0cml4IE0gb24gYSAzLXZlY3RvciB2OlxuICAvLyAgIHwgYSBiIGMgfCAgIHwgWCB8XG4gIC8vICAgfCBkIGUgZiB8IHggfCBZIHxcbiAgLy8gICB8IGcgaCBpIHwgICB8IFogfFxuICAvLyBNIGlzIGFzc3VtZWQgdG8gYmUgc2VyaWFsaXplZCBhcyBbYSxiLGMsZCxlLGYsZyxoLGldLFxuICAvLyB3aXRoIHYgYXMgW1gsWSxaXVxuICBzdGF0aWMgYXBwbHkzZFRyYW5zZm9ybShtLCB2KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1bMF0gKiB2WzBdICsgbVsxXSAqIHZbMV0gKyBtWzJdICogdlsyXSxcbiAgICAgIG1bM10gKiB2WzBdICsgbVs0XSAqIHZbMV0gKyBtWzVdICogdlsyXSxcbiAgICAgIG1bNl0gKiB2WzBdICsgbVs3XSAqIHZbMV0gKyBtWzhdICogdlsyXSxcbiAgICBdO1xuICB9XG5cbiAgLy8gVGhpcyBjYWxjdWxhdGlvbiB1c2VzIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb24uXG4gIC8vIFRoZSBTVkQgY2FuIGJlIHJlcHJlc2VudGVkIHdpdGggZm9ybXVsYSBBID0gVVNWLiBXZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGVcbiAgLy8gbWF0cml4IFMgaGVyZSBiZWNhdXNlIGl0IHJlcHJlc2VudHMgdGhlIHNjYWxlIHZhbHVlcy5cbiAgc3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG0pIHtcbiAgICBjb25zdCB0cmFuc3Bvc2UgPSBbbVswXSwgbVsyXSwgbVsxXSwgbVszXV07XG5cbiAgICAvLyBNdWx0aXBseSBtYXRyaXggbSB3aXRoIGl0cyB0cmFuc3Bvc2UuXG4gICAgY29uc3QgYSA9IG1bMF0gKiB0cmFuc3Bvc2VbMF0gKyBtWzFdICogdHJhbnNwb3NlWzJdO1xuICAgIGNvbnN0IGIgPSBtWzBdICogdHJhbnNwb3NlWzFdICsgbVsxXSAqIHRyYW5zcG9zZVszXTtcbiAgICBjb25zdCBjID0gbVsyXSAqIHRyYW5zcG9zZVswXSArIG1bM10gKiB0cmFuc3Bvc2VbMl07XG4gICAgY29uc3QgZCA9IG1bMl0gKiB0cmFuc3Bvc2VbMV0gKyBtWzNdICogdHJhbnNwb3NlWzNdO1xuXG4gICAgLy8gU29sdmUgdGhlIHNlY29uZCBkZWdyZWUgcG9seW5vbWlhbCB0byBnZXQgcm9vdHMuXG4gICAgY29uc3QgZmlyc3QgPSAoYSArIGQpIC8gMjtcbiAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqIChhICsgZCkgLSA0ICogKGEgKiBkIC0gYyAqIGIpKSAvIDI7XG4gICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxO1xuICAgIGNvbnN0IHN5ID0gZmlyc3QgLSBzZWNvbmQgfHwgMTtcblxuICAgIC8vIFNjYWxlIHZhbHVlcyBhcmUgdGhlIHNxdWFyZSByb290cyBvZiB0aGUgZWlnZW52YWx1ZXMuXG4gICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSByZWN0YW5nbGUgcmVjdD1beDEsIHkxLCB4MiwgeTJdIHNvIHRoYXQgKHgxLHkxKSA8ICh4Mix5MilcbiAgLy8gRm9yIGNvb3JkaW5hdGUgc3lzdGVtcyB3aG9zZSBvcmlnaW4gbGllcyBpbiB0aGUgYm90dG9tLWxlZnQsIHRoaXNcbiAgLy8gbWVhbnMgbm9ybWFsaXphdGlvbiB0byAoQkwsVFIpIG9yZGVyaW5nLiBGb3Igc3lzdGVtcyB3aXRoIG9yaWdpbiBpbiB0aGVcbiAgLy8gdG9wLWxlZnQsIHRoaXMgbWVhbnMgKFRMLEJSKSBvcmRlcmluZy5cbiAgc3RhdGljIG5vcm1hbGl6ZVJlY3QocmVjdCkge1xuICAgIGNvbnN0IHIgPSByZWN0LnNsaWNlKDApOyAvLyBjbG9uZSByZWN0XG4gICAgaWYgKHJlY3RbMF0gPiByZWN0WzJdKSB7XG4gICAgICByWzBdID0gcmVjdFsyXTtcbiAgICAgIHJbMl0gPSByZWN0WzBdO1xuICAgIH1cbiAgICBpZiAocmVjdFsxXSA+IHJlY3RbM10pIHtcbiAgICAgIHJbMV0gPSByZWN0WzNdO1xuICAgICAgclszXSA9IHJlY3RbMV07XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHJlY3RhbmdsZSBbeDEsIHkxLCB4MiwgeTJdIGNvcnJlc3BvbmRpbmcgdG8gdGhlXG4gIC8vIGludGVyc2VjdGlvbiBvZiByZWN0MSBhbmQgcmVjdDIuIElmIG5vIGludGVyc2VjdGlvbiwgcmV0dXJucyAnZmFsc2UnXG4gIC8vIFRoZSByZWN0YW5nbGUgY29vcmRpbmF0ZXMgb2YgcmVjdDEsIHJlY3QyIHNob3VsZCBiZSBbeDEsIHkxLCB4MiwgeTJdXG4gIHN0YXRpYyBpbnRlcnNlY3QocmVjdDEsIHJlY3QyKSB7XG4gICAgZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfVxuXG4gICAgLy8gT3JkZXIgcG9pbnRzIGFsb25nIHRoZSBheGVzXG4gICAgY29uc3Qgb3JkZXJlZFggPSBbcmVjdDFbMF0sIHJlY3QxWzJdLCByZWN0MlswXSwgcmVjdDJbMl1dLnNvcnQoY29tcGFyZSk7XG4gICAgY29uc3Qgb3JkZXJlZFkgPSBbcmVjdDFbMV0sIHJlY3QxWzNdLCByZWN0MlsxXSwgcmVjdDJbM11dLnNvcnQoY29tcGFyZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICByZWN0MSA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0MSk7XG4gICAgcmVjdDIgPSBVdGlsLm5vcm1hbGl6ZVJlY3QocmVjdDIpO1xuXG4gICAgLy8gWDogZmlyc3QgYW5kIHNlY29uZCBwb2ludHMgYmVsb25nIHRvIGRpZmZlcmVudCByZWN0YW5nbGVzP1xuICAgIGlmIChcbiAgICAgIChvcmRlcmVkWFswXSA9PT0gcmVjdDFbMF0gJiYgb3JkZXJlZFhbMV0gPT09IHJlY3QyWzBdKSB8fFxuICAgICAgKG9yZGVyZWRYWzBdID09PSByZWN0MlswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDFbMF0pXG4gICAgKSB7XG4gICAgICAvLyBJbnRlcnNlY3Rpb24gbXVzdCBiZSBiZXR3ZWVuIHNlY29uZCBhbmQgdGhpcmQgcG9pbnRzXG4gICAgICByZXN1bHRbMF0gPSBvcmRlcmVkWFsxXTtcbiAgICAgIHJlc3VsdFsyXSA9IG9yZGVyZWRYWzJdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBZOiBmaXJzdCBhbmQgc2Vjb25kIHBvaW50cyBiZWxvbmcgdG8gZGlmZmVyZW50IHJlY3RhbmdsZXM/XG4gICAgaWYgKFxuICAgICAgKG9yZGVyZWRZWzBdID09PSByZWN0MVsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDJbMV0pIHx8XG4gICAgICAob3JkZXJlZFlbMF0gPT09IHJlY3QyWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MVsxXSlcbiAgICApIHtcbiAgICAgIC8vIEludGVyc2VjdGlvbiBtdXN0IGJlIGJldHdlZW4gc2Vjb25kIGFuZCB0aGlyZCBwb2ludHNcbiAgICAgIHJlc3VsdFsxXSA9IG9yZGVyZWRZWzFdO1xuICAgICAgcmVzdWx0WzNdID0gb3JkZXJlZFlbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFtcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMHgyRDgsIDB4MkM3LCAweDJDNiwgMHgyRDksIDB4MkRELCAweDJEQiwgMHgyREEsIDB4MkRDLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDIwMjIsIDB4MjAyMCwgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCxcbiAgMHgyMDEzLCAweDE5MiwgMHgyMDQ0LCAweDIwMzksIDB4MjAzQSwgMHgyMjEyLCAweDIwMzAsIDB4MjAxRSwgMHgyMDFDLFxuICAweDIwMUQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUEsIDB4MjEyMiwgMHhGQjAxLCAweEZCMDIsIDB4MTQxLCAweDE1MiwgMHgxNjAsXG4gIDB4MTc4LCAweDE3RCwgMHgxMzEsIDB4MTQyLCAweDE1MywgMHgxNjEsIDB4MTdFLCAwLCAweDIwQUNcbl07XG5cbmZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikge1xuICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoLFxuICAgIHN0ckJ1ZiA9IFtdO1xuICBpZiAoc3RyWzBdID09PSBcIlxceEZFXCIgJiYgc3RyWzFdID09PSBcIlxceEZGXCIpIHtcbiAgICAvLyBVVEYxNkJFIEJPTVxuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHN0ckJ1Zi5wdXNoKFxuICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKChzdHIuY2hhckNvZGVBdChpKSA8PCA4KSB8IHN0ci5jaGFyQ29kZUF0KGkgKyAxKSlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0clswXSA9PT0gXCJcXHhGRlwiICYmIHN0clsxXSA9PT0gXCJcXHhGRVwiKSB7XG4gICAgLy8gVVRGMTZMRSBCT01cbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IGxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBzdHJCdWYucHVzaChcbiAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgoc3RyLmNoYXJDb2RlQXQoaSArIDEpIDw8IDgpIHwgc3RyLmNoYXJDb2RlQXQoaSkpXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBjb2RlID0gUERGU3RyaW5nVHJhbnNsYXRlVGFibGVbc3RyLmNoYXJDb2RlQXQoaSldO1xuICAgICAgc3RyQnVmLnB1c2goY29kZSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgOiBzdHIuY2hhckF0KGkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0ckJ1Zi5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKSB7XG4gIC8vIHJlcGxhY2UgXCIoXCIsIFwiKVwiIGFuZCBcIlxcXCIgYnkgXCJcXChcIiwgXCJcXClcIiBhbmQgXCJcXFxcXCJcbiAgLy8gaW4gb3JkZXIgdG8gd3JpdGUgaXQgaW4gYSBQREYgZmlsZS5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW1xcKFxcKVxcXFxdKS9nLCBcIlxcXFwkMVwiKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cikge1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTtcbn1cblxuZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikge1xuICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2wodikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09IFwiYm9vbGVhblwiO1xufVxuXG5mdW5jdGlvbiBpc051bSh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJudW1iZXJcIjtcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcodikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09IFwic3RyaW5nXCI7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiB2LmJ5dGVMZW5ndGggIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycjEsIGFycjIpIHtcbiAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gYXJyMS5ldmVyeShmdW5jdGlvbiAoZWxlbWVudCwgaW5kZXgpIHtcbiAgICByZXR1cm4gZWxlbWVudCA9PT0gYXJyMltpbmRleF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpKSkge1xuICBjb25zdCBidWZmZXIgPSBbXG4gICAgZGF0ZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksXG4gICAgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIChkYXRlLmdldFVUQ0RhdGUoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSxcbiAgICBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSxcbiAgICBkYXRlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSxcbiAgXTtcblxuICByZXR1cm4gYnVmZmVyLmpvaW4oXCJcIik7XG59XG5cbi8qKlxuICogUHJvbWlzZSBDYXBhYmlsaXR5IG9iamVjdC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9taXNlQ2FwYWJpbGl0eVxuICogQHByb3BlcnR5IHtQcm9taXNlPGFueT59IHByb21pc2UgLSBBIFByb21pc2Ugb2JqZWN0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBzZXR0bGVkIC0gSWYgdGhlIFByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkL3JlamVjdGVkLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gcmVzb2x2ZSAtIEZ1bGZpbGxzIHRoZSBQcm9taXNlLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gcmVqZWN0IC0gUmVqZWN0cyB0aGUgUHJvbWlzZS5cbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9taXNlIGNhcGFiaWxpdHkgb2JqZWN0LlxuICogQGFsaWFzIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5XG4gKlxuICogQHJldHVybnMge1Byb21pc2VDYXBhYmlsaXR5fVxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpIHtcbiAgY29uc3QgY2FwYWJpbGl0eSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGxldCBpc1NldHRsZWQgPSBmYWxzZTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2FwYWJpbGl0eSwgXCJzZXR0bGVkXCIsIHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gaXNTZXR0bGVkO1xuICAgIH0sXG4gIH0pO1xuICBjYXBhYmlsaXR5LnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgY2FwYWJpbGl0eS5yZXNvbHZlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGlzU2V0dGxlZCA9IHRydWU7XG4gICAgICByZXNvbHZlKGRhdGEpO1xuICAgIH07XG4gICAgY2FwYWJpbGl0eS5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBpc1NldHRsZWQgPSB0cnVlO1xuICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBjYXBhYmlsaXR5O1xufVxuXG5jb25zdCBjcmVhdGVPYmplY3RVUkwgPSAoZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMQ2xvc3VyZSgpIHtcbiAgLy8gQmxvYi9jcmVhdGVPYmplY3RVUkwgaXMgbm90IGF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIGRhdGEgc2NoZW1hLlxuICBjb25zdCBkaWdpdHMgPVxuICAgIFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIjtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwoZGF0YSwgY29udGVudFR5cGUsIGZvcmNlRGF0YVNjaGVtYSA9IGZhbHNlKSB7XG4gICAgaWYgKCFmb3JjZURhdGFTY2hlbWEgJiYgVVJMLmNyZWF0ZU9iamVjdFVSTCkge1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcbiAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIH1cblxuICAgIGxldCBidWZmZXIgPSBgZGF0YToke2NvbnRlbnRUeXBlfTtiYXNlNjQsYDtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHtcbiAgICAgIGNvbnN0IGIxID0gZGF0YVtpXSAmIDB4ZmY7XG4gICAgICBjb25zdCBiMiA9IGRhdGFbaSArIDFdICYgMHhmZjtcbiAgICAgIGNvbnN0IGIzID0gZGF0YVtpICsgMl0gJiAweGZmO1xuICAgICAgY29uc3QgZDEgPSBiMSA+PiAyLFxuICAgICAgICBkMiA9ICgoYjEgJiAzKSA8PCA0KSB8IChiMiA+PiA0KTtcbiAgICAgIGNvbnN0IGQzID0gaSArIDEgPCBpaSA/ICgoYjIgJiAweGYpIDw8IDIpIHwgKGIzID4+IDYpIDogNjQ7XG4gICAgICBjb25zdCBkNCA9IGkgKyAyIDwgaWkgPyBiMyAmIDB4M2YgOiA2NDtcbiAgICAgIGJ1ZmZlciArPSBkaWdpdHNbZDFdICsgZGlnaXRzW2QyXSArIGRpZ2l0c1tkM10gKyBkaWdpdHNbZDRdO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9O1xufSkoKTtcblxuZXhwb3J0IHtcbiAgQmFzZUV4Y2VwdGlvbixcbiAgRk9OVF9JREVOVElUWV9NQVRSSVgsXG4gIElERU5USVRZX01BVFJJWCxcbiAgT1BTLFxuICBWZXJib3NpdHlMZXZlbCxcbiAgVU5TVVBQT1JURURfRkVBVFVSRVMsXG4gIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUsXG4gIEFubm90YXRpb25GaWVsZEZsYWcsXG4gIEFubm90YXRpb25GbGFnLFxuICBBbm5vdGF0aW9uTWFya2VkU3RhdGUsXG4gIEFubm90YXRpb25SZXBseVR5cGUsXG4gIEFubm90YXRpb25SZXZpZXdTdGF0ZSxcbiAgQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgRm9udFR5cGUsXG4gIEltYWdlS2luZCxcbiAgQ01hcENvbXByZXNzaW9uVHlwZSxcbiAgQWJvcnRFeGNlcHRpb24sXG4gIEludmFsaWRQREZFeGNlcHRpb24sXG4gIE1pc3NpbmdQREZFeGNlcHRpb24sXG4gIFBhc3N3b3JkRXhjZXB0aW9uLFxuICBQYXNzd29yZFJlc3BvbnNlcyxcbiAgUGVybWlzc2lvbkZsYWcsXG4gIFN0cmVhbVR5cGUsXG4gIFRleHRSZW5kZXJpbmdNb2RlLFxuICBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sXG4gIFVua25vd25FcnJvckV4Y2VwdGlvbixcbiAgVXRpbCxcbiAgRm9ybWF0RXJyb3IsXG4gIGFycmF5Qnl0ZUxlbmd0aCxcbiAgYXJyYXlzVG9CeXRlcyxcbiAgYXNzZXJ0LFxuICBieXRlc1RvU3RyaW5nLFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgY3JlYXRlT2JqZWN0VVJMLFxuICBlc2NhcGVTdHJpbmcsXG4gIGdldE1vZGlmaWNhdGlvbkRhdGUsXG4gIGdldFZlcmJvc2l0eUxldmVsLFxuICBpbmZvLFxuICBpc0FycmF5QnVmZmVyLFxuICBpc0FycmF5RXF1YWwsXG4gIGlzQm9vbCxcbiAgaXNOdW0sXG4gIGlzU3RyaW5nLFxuICBpc1NhbWVPcmlnaW4sXG4gIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwsXG4gIElzTGl0dGxlRW5kaWFuQ2FjaGVkLFxuICBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQsXG4gIHJlbW92ZU51bGxDaGFyYWN0ZXJzLFxuICBzZXRWZXJib3NpdHlMZXZlbCxcbiAgc2hhZG93LFxuICBzdHJpbmczMixcbiAgc3RyaW5nVG9CeXRlcyxcbiAgc3RyaW5nVG9QREZTdHJpbmcsXG4gIHN0cmluZ1RvVVRGOFN0cmluZyxcbiAgdXRmOFN0cmluZ1RvU3RyaW5nLFxuICB3YXJuLFxuICB1bnJlYWNoYWJsZSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNyBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7IGlzTm9kZUpTIH0gZnJvbSBcIi4vaXNfbm9kZS5qc1wiO1xuXG4vLyBTa2lwIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBtb2Rlcm4gYnVpbGRzIGFuZCBpZiB3ZSBhbHJlYWR5IHJhbiB0aGUgbW9kdWxlLlxuaWYgKFxuICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8ICFQREZKU0Rldi50ZXN0KFwiU0tJUF9CQUJFTFwiKSkgJiZcbiAgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcInVuZGVmaW5lZFwiIHx8ICFnbG9iYWxUaGlzLl9wZGZqc0NvbXBhdGliaWxpdHlDaGVja2VkKVxuKSB7XG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGdsb2JhbFRoaXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRTExL0VkZ2UsIE9wZXJhXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCBnbG9iYWxUaGlzLk1hdGggIT09IE1hdGgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZ2xvYmFsLWFzc2lnblxuICAgIGdsb2JhbFRoaXMgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9nbG9iYWwtdGhpc1wiKTtcbiAgfVxuICBnbG9iYWxUaGlzLl9wZGZqc0NvbXBhdGliaWxpdHlDaGVja2VkID0gdHJ1ZTtcblxuICBjb25zdCBoYXNET00gPSB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBkb2N1bWVudCA9PT0gXCJvYmplY3RcIjtcbiAgY29uc3QgdXNlckFnZW50ID1cbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBcIlwiO1xuICBjb25zdCBpc0lFID0gL1RyaWRlbnQvLnRlc3QodXNlckFnZW50KTtcblxuICAvLyBTdXBwb3J0OiBOb2RlLmpzXG4gIChmdW5jdGlvbiBjaGVja05vZGVCdG9hKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLmJ0b2EgfHwgIWlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuYnRvYSA9IGZ1bmN0aW9uIChjaGFycykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oY2hhcnMsIFwiYmluYXJ5XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogTm9kZS5qc1xuICAoZnVuY3Rpb24gY2hlY2tOb2RlQXRvYigpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5hdG9iIHx8ICFpc05vZGVKUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLmF0b2IgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGlucHV0LCBcImJhc2U2NFwiKS50b1N0cmluZyhcImJpbmFyeVwiKTtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIENoaWxkTm9kZS5yZW1vdmUgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRS5cbiAgKGZ1bmN0aW9uIGNoZWNrQ2hpbGROb2RlUmVtb3ZlKCkge1xuICAgIGlmICghaGFzRE9NKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1vemlsbGEvYXZvaWQtcmVtb3ZlQ2hpbGRcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgfVxuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS57YWRkLCByZW1vdmV9LCB3aXRoIG1vcmUgdGhhblxuICAvLyBvbmUgcGFyYW1ldGVyLCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdEFkZFJlbW92ZSgpIHtcbiAgICBpZiAoIWhhc0RPTSB8fCBpc05vZGVKUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwidGVzdE9uZVwiLCBcInRlc3RUd29cIik7XG5cbiAgICBpZiAoXG4gICAgICBkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKFwidGVzdE9uZVwiKSA9PT0gdHJ1ZSAmJlxuICAgICAgZGl2LmNsYXNzTGlzdC5jb250YWlucyhcInRlc3RUd29cIikgPT09IHRydWVcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgT3JpZ2luYWxET01Ub2tlbkxpc3RBZGQgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZDtcbiAgICBjb25zdCBPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xuXG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoLi4udG9rZW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBPcmlnaW5hbERPTVRva2VuTGlzdEFkZC5jYWxsKHRoaXMsIHRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKC4uLnRva2Vucykge1xuICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgT3JpZ2luYWxET01Ub2tlbkxpc3RSZW1vdmUuY2FsbCh0aGlzLCB0b2tlbik7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZSwgd2l0aCB0aGUgb3B0aW9uYWxcbiAgLy8gXCJmb3JjZVwiIHBhcmFtZXRlciwgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tET01Ub2tlbkxpc3RUb2dnbGUoKSB7XG4gICAgaWYgKCFoYXNET00gfHwgaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBpZiAoZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJ0ZXN0XCIsIDApID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICBjb25zdCBmb3JjZSA9XG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gISFhcmd1bWVudHNbMV0gOiAhdGhpcy5jb250YWlucyh0b2tlbik7XG4gICAgICByZXR1cm4gdGhpc1tmb3JjZSA/IFwiYWRkXCIgOiBcInJlbW92ZVwiXSh0b2tlbiksIGZvcmNlO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3Igd2luZG93Lmhpc3Rvcnkue3B1c2hTdGF0ZSwgcmVwbGFjZVN0YXRlfSwgd2l0aCB0aGVcbiAgLy8gYHVybGAgcGFyYW1ldGVyIHNldCB0byBgdW5kZWZpbmVkYCwgd2l0aG91dCBicmVha2luZyB0aGUgZG9jdW1lbnQgVVJMLlxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tXaW5kb3dIaXN0b3J5UHVzaFN0YXRlUmVwbGFjZVN0YXRlKCkge1xuICAgIGlmICghaGFzRE9NIHx8ICFpc0lFKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IE9yaWdpbmFsUHVzaFN0YXRlID0gd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlO1xuICAgIGNvbnN0IE9yaWdpbmFsUmVwbGFjZVN0YXRlID0gd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlO1xuXG4gICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7XG4gICAgICBjb25zdCBhcmdzID0gdXJsID09PSB1bmRlZmluZWQgPyBbc3RhdGUsIHRpdGxlXSA6IFtzdGF0ZSwgdGl0bGUsIHVybF07XG4gICAgICBPcmlnaW5hbFB1c2hTdGF0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCkge1xuICAgICAgY29uc3QgYXJncyA9IHVybCA9PT0gdW5kZWZpbmVkID8gW3N0YXRlLCB0aXRsZV0gOiBbc3RhdGUsIHRpdGxlLCB1cmxdO1xuICAgICAgT3JpZ2luYWxSZXBsYWNlU3RhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQxXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1N0YXJ0c1dpdGgoKSB7XG4gICAgaWYgKFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvc3RhcnRzLXdpdGguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NDFcbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nRW5kc1dpdGgoKSB7XG4gICAgaWYgKFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL2VuZHMtd2l0aC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw0MVxuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdJbmNsdWRlcygpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvaW5jbHVkZXMuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw0N1xuICAoZnVuY3Rpb24gY2hlY2tBcnJheUluY2x1ZGVzKCkge1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvYXJyYXkvaW5jbHVkZXMuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgQXJyYXkuZnJvbSBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja0FycmF5RnJvbSgpIHtcbiAgICBpZiAoQXJyYXkuZnJvbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9hcnJheS9mcm9tLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5hc3NpZ24gaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tPYmplY3RBc3NpZ24oKSB7XG4gICAgaWYgKE9iamVjdC5hc3NpZ24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbi5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBPYmplY3QuZnJvbUVudHJpZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDczXG4gIChmdW5jdGlvbiBjaGVja09iamVjdEZyb21FbnRyaWVzKCkge1xuICAgIGlmIChPYmplY3QuZnJvbUVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvb2JqZWN0L2Zyb20tZW50cmllcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBNYXRoLmxvZzIgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDM4XG4gIChmdW5jdGlvbiBjaGVja01hdGhMb2cyKCkge1xuICAgIGlmIChNYXRoLmxvZzIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTWF0aC5sb2cyID0gcmVxdWlyZShcImNvcmUtanMvZXMvbWF0aC9sb2cyLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE51bWJlci5pc05hTiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLlxuICAoZnVuY3Rpb24gY2hlY2tOdW1iZXJJc05hTigpIHtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE51bWJlci5pc05hTiA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL251bWJlci9pcy1uYW4uanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgTnVtYmVyLmlzSW50ZWdlciBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8MzRcbiAgKGZ1bmN0aW9uIGNoZWNrTnVtYmVySXNJbnRlZ2VyKCkge1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE51bWJlci5pc0ludGVnZXIgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlci5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBUeXBlZEFycmF5LnByb3RvdHlwZS5zbGljZSBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1R5cGVkQXJyYXlTbGljZSgpIHtcbiAgICBpZiAoVWludDhBcnJheS5wcm90b3R5cGUuc2xpY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvdHlwZWQtYXJyYXkvc2xpY2VcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUUsIFNhZmFyaTwxMSwgQ2hyb21lPDYzXG4gIChmdW5jdGlvbiBjaGVja1Byb21pc2UoKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiSU1BR0VfREVDT0RFUlNcIikpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IGltYWdlIGRlY29kZXJzIGFyZSBzeW5jaHJvbm91cywgaGVuY2UgYFByb21pc2VgIHNob3VsZG4ndFxuICAgICAgLy8gbmVlZCB0byBiZSBwb2x5ZmlsbGVkIGZvciB0aGUgSU1BR0VfREVDT0RFUlMgYnVpbGQgdGFyZ2V0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZ2xvYmFsVGhpcy5Qcm9taXNlICYmIGdsb2JhbFRoaXMuUHJvbWlzZS5hbGxTZXR0bGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuUHJvbWlzZSA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3Byb21pc2UvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrVVJMKCkge1xuICAgIGlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJQUk9EVUNUSU9OXCIpKSB7XG4gICAgICAvLyBQcmV2ZW50IFwicmVxdWlyZSBpcyBub3QgYSBmdW5jdGlvblwiIGVycm9ycyBpbiBkZXZlbG9wbWVudCBtb2RlLFxuICAgICAgLy8gc2luY2UgdGhlIGBVUkxgIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gbW9kZXJuIGJyb3dlcnMuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICghUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpIHtcbiAgICAgIC8vIFRoZSBgVVJMYCBjb25zdHJ1Y3RvciBpcyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGUgZXh0ZW5zaW9uXG4gICAgICAvLyBidWlsZHMuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChQREZKU0Rldi50ZXN0KFwiSU1BR0VfREVDT0RFUlNcIikpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IGltYWdlIGRlY29kZXJzIGRvbid0IHVzZSB0aGUgYFVSTGAgY29uc3RydWN0b3IsIHNvIGl0XG4gICAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgcG9seWZpbGxlZCBmb3IgdGhlIElNQUdFX0RFQ09ERVJTIGJ1aWxkIHRhcmdldC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5VUkwgPSByZXF1aXJlKFwiY29yZS1qcy93ZWIvdXJsLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFLCBOb2RlLmpzXG4gIChmdW5jdGlvbiBjaGVja1JlYWRhYmxlU3RyZWFtKCkge1xuICAgIGlmICh0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiYgUERGSlNEZXYudGVzdChcIklNQUdFX0RFQ09ERVJTXCIpKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCBpbWFnZSBkZWNvZGVycyBhcmUgc3luY2hyb25vdXMsIGhlbmNlIGBSZWFkYWJsZVN0cmVhbWBcbiAgICAgIC8vIHNob3VsZG4ndCBuZWVkIHRvIGJlIHBvbHlmaWxsZWQgZm9yIHRoZSBJTUFHRV9ERUNPREVSUyBidWlsZCB0YXJnZXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIFJlYWRhYmxlU3RyZWFtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAvLyBNUyBFZGdlIG1heSBzYXkgaXQgaGFzIFJlYWRhYmxlU3RyZWFtIGJ1dCB0aGV5IGFyZSBub3QgdXAgdG8gc3BlYyB5ZXQuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gVGhlIFJlYWRhYmxlU3RyZWFtIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSB1c2VkLlxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZShcIndlYi1zdHJlYW1zLXBvbHlmaWxsL2Rpc3QvcG9ueWZpbGwuanNcIikuUmVhZGFibGVTdHJlYW07XG4gIH0pKCk7XG5cbiAgLy8gV2Ugd2FudCB0byBzdXBwb3J0IE1hcCBpdGVyYXRpb24sIGJ1dCBpdCBkb2Vzbid0IHNlZW0gcG9zc2libGUgdG8gZWFzaWx5XG4gIC8vIHRlc3QgZm9yIHRoYXQgc3BlY2lmaWNhbGx5OyBoZW5jZSB1c2luZyBhIHNpbWlsYXJseSB1bnN1cHBvcnRlZCBwcm9wZXJ0eS5cbiAgLy8gU3VwcG9ydDogSUUxMVxuICAoZnVuY3Rpb24gY2hlY2tNYXBFbnRyaWVzKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLk1hcCAmJiBnbG9iYWxUaGlzLk1hcC5wcm90b3R5cGUuZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLk1hcCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL21hcC9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBXZSB3YW50IHRvIHN1cHBvcnQgU2V0IGl0ZXJhdGlvbiwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSBwb3NzaWJsZSB0byBlYXNpbHlcbiAgLy8gdGVzdCBmb3IgdGhhdCBzcGVjaWZpY2FsbHk7IGhlbmNlIHVzaW5nIGEgc2ltaWxhcmx5IHVuc3VwcG9ydGVkIHByb3BlcnR5LlxuICAvLyBTdXBwb3J0OiBJRTExXG4gIChmdW5jdGlvbiBjaGVja1NldEVudHJpZXMoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuU2V0ICYmIGdsb2JhbFRoaXMuU2V0LnByb3RvdHlwZS5lbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuU2V0ID0gcmVxdWlyZShcImNvcmUtanMvZXMvc2V0L2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFPDExLCBTYWZhcmk8OCwgQ2hyb21lPDM2XG4gIChmdW5jdGlvbiBjaGVja1dlYWtNYXAoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuV2Vha01hcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLldlYWtNYXAgPSByZXF1aXJlKFwiY29yZS1qcy9lcy93ZWFrLW1hcC9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRTExXG4gIChmdW5jdGlvbiBjaGVja1dlYWtTZXQoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuV2Vha1NldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLldlYWtTZXQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy93ZWFrLXNldC9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcuY29kZVBvaW50QXQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRTExLlxuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdDb2RlUG9pbnRBdCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvY29kZS1wb2ludC1hdC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcuZnJvbUNvZGVQb2ludCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEuXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0Zyb21Db2RlUG9pbnQoKSB7XG4gICAgaWYgKFN0cmluZy5mcm9tQ29kZVBvaW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFN0cmluZy5mcm9tQ29kZVBvaW50ID0gcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL2Zyb20tY29kZS1wb2ludC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tTeW1ib2woKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuU3ltYm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N5bWJvbC9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0IGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw1N1xuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdQYWRTdGFydCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvcGFkLXN0YXJ0LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUucGFkRW5kIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw1N1xuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdQYWRFbmQoKSB7XG4gICAgaWYgKFN0cmluZy5wcm90b3R5cGUucGFkRW5kKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9wYWQtZW5kLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC52YWx1ZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU0XG4gIChmdW5jdGlvbiBjaGVja09iamVjdFZhbHVlcygpIHtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBPYmplY3QudmFsdWVzID0gcmVxdWlyZShcImNvcmUtanMvZXMvb2JqZWN0L3ZhbHVlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBPYmplY3QuZW50cmllcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NTRcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0RW50cmllcygpIHtcbiAgICBpZiAoT2JqZWN0LmVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXMgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvZW50cmllcy5qc1wiKTtcbiAgfSkoKTtcbn1cbiIsIi8qIENvcHlyaWdodCAyMDE4IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFscyBwcm9jZXNzICovXG5cbi8vIE5XLmpzIC8gRWxlY3Ryb24gaXMgYSBicm93c2VyIGNvbnRleHQsIGJ1dCBjb3BpZXMgc29tZSBOb2RlLmpzIG9iamVjdHM7IHNlZVxuLy8gaHR0cDovL2RvY3Mubndqcy5pby9lbi9sYXRlc3QvRm9yJTIwVXNlcnMvQWR2YW5jZWQvSmF2YVNjcmlwdCUyMENvbnRleHRzJTIwaW4lMjBOVy5qcy8jYWNjZXNzLW5vZGVqcy1hbmQtbndqcy1hcGktaW4tYnJvd3Nlci1jb250ZXh0XG4vLyBodHRwczovL3d3dy5lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS9wcm9jZXNzI3Byb2Nlc3N2ZXJzaW9uc2VsZWN0cm9uLXJlYWRvbmx5XG4vLyBodHRwczovL3d3dy5lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS9wcm9jZXNzI3Byb2Nlc3N0eXBlLXJlYWRvbmx5XG5jb25zdCBpc05vZGVKUyA9XG4gIHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmXG4gIHByb2Nlc3MgKyBcIlwiID09PSBcIltvYmplY3QgcHJvY2Vzc11cIiAmJlxuICAhcHJvY2Vzcy52ZXJzaW9ucy5udyAmJlxuICAhKHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gJiYgcHJvY2Vzcy50eXBlICYmIHByb2Nlc3MudHlwZSAhPT0gXCJicm93c2VyXCIpO1xuXG5leHBvcnQgeyBpc05vZGVKUyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiB1c2VzIFhSZWYgKi9cblxuaW1wb3J0IHsgYXNzZXJ0LCB1bnJlYWNoYWJsZSB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG52YXIgRU9GID0ge307XG5cbnZhciBOYW1lID0gKGZ1bmN0aW9uIE5hbWVDbG9zdXJlKCkge1xuICBsZXQgbmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE5hbWUobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cblxuICBOYW1lLnByb3RvdHlwZSA9IHt9O1xuXG4gIE5hbWUuZ2V0ID0gZnVuY3Rpb24gTmFtZV9nZXQobmFtZSkge1xuICAgIHZhciBuYW1lVmFsdWUgPSBuYW1lQ2FjaGVbbmFtZV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgcmV0dXJuIG5hbWVWYWx1ZSA/IG5hbWVWYWx1ZSA6IChuYW1lQ2FjaGVbbmFtZV0gPSBuZXcgTmFtZShuYW1lKSk7XG4gIH07XG5cbiAgTmFtZS5fY2xlYXJDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBuYW1lQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9O1xuXG4gIHJldHVybiBOYW1lO1xufSkoKTtcblxudmFyIENtZCA9IChmdW5jdGlvbiBDbWRDbG9zdXJlKCkge1xuICBsZXQgY21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQ21kKGNtZCkge1xuICAgIHRoaXMuY21kID0gY21kO1xuICB9XG5cbiAgQ21kLnByb3RvdHlwZSA9IHt9O1xuXG4gIENtZC5nZXQgPSBmdW5jdGlvbiBDbWRfZ2V0KGNtZCkge1xuICAgIHZhciBjbWRWYWx1ZSA9IGNtZENhY2hlW2NtZF07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgcmV0dXJuIGNtZFZhbHVlID8gY21kVmFsdWUgOiAoY21kQ2FjaGVbY21kXSA9IG5ldyBDbWQoY21kKSk7XG4gIH07XG5cbiAgQ21kLl9jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIGNtZENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfTtcblxuICByZXR1cm4gQ21kO1xufSkoKTtcblxudmFyIERpY3QgPSAoZnVuY3Rpb24gRGljdENsb3N1cmUoKSB7XG4gIHZhciBub25TZXJpYWxpemFibGUgPSBmdW5jdGlvbiBub25TZXJpYWxpemFibGVDbG9zdXJlKCkge1xuICAgIHJldHVybiBub25TZXJpYWxpemFibGU7IC8vIGNyZWF0aW5nIGNsb3N1cmUgb24gc29tZSB2YXJpYWJsZVxuICB9O1xuXG4gIC8vIHhyZWYgaXMgb3B0aW9uYWxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBEaWN0KHhyZWYpIHtcbiAgICAvLyBNYXAgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbnRlcm5hbGx5LCB1c2UgZnVuY3Rpb25zIGJlbG93IHRvIGFjY2Vzcy5cbiAgICB0aGlzLl9tYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMueHJlZiA9IHhyZWY7XG4gICAgdGhpcy5vYmpJZCA9IG51bGw7XG4gICAgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9fbm9uU2VyaWFsaXphYmxlX18gPSBub25TZXJpYWxpemFibGU7IC8vIGRpc2FibGUgY2xvbmluZyBvZiB0aGUgRGljdFxuICB9XG5cbiAgRGljdC5wcm90b3R5cGUgPSB7XG4gICAgYXNzaWduWHJlZjogZnVuY3Rpb24gRGljdF9hc3NpZ25YcmVmKG5ld1hyZWYpIHtcbiAgICAgIHRoaXMueHJlZiA9IG5ld1hyZWY7XG4gICAgfSxcblxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21hcCkubGVuZ3RoO1xuICAgIH0sXG5cbiAgICAvLyBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlcyBSZWYgb2JqZWN0c1xuICAgIGdldChrZXkxLCBrZXkyLCBrZXkzKSB7XG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLl9tYXBba2V5MV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrZXkyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5Ml07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5fbWFwW2tleTNdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2godmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgLy8gU2FtZSBhcyBnZXQoKSwgYnV0IHJldHVybnMgYSBwcm9taXNlIGFuZCB1c2VzIGZldGNoSWZSZWZBc3luYygpLlxuICAgIGFzeW5jIGdldEFzeW5jKGtleTEsIGtleTIsIGtleTMpIHtcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX21hcFtrZXkxXTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX21hcFtrZXkyXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5M107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueHJlZi5mZXRjaEFzeW5jKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgIC8vIFNhbWUgYXMgZ2V0KCksIGJ1dCBkZXJlZmVyZW5jZXMgYWxsIGVsZW1lbnRzIGlmIHRoZSByZXN1bHQgaXMgYW4gQXJyYXkuXG4gICAgZ2V0QXJyYXkoa2V5MSwga2V5Miwga2V5Mykge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXQoa2V5MSwga2V5Miwga2V5Myk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8ICF0aGlzLnhyZWYpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgpOyAvLyBFbnN1cmUgdGhhdCB3ZSBkb24ndCBtb2RpZnkgdGhlIERpY3QgZGF0YS5cbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaWYgKCEodmFsdWVbaV0gaW5zdGFuY2VvZiBSZWYpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVbaV0gPSB0aGlzLnhyZWYuZmV0Y2godmFsdWVbaV0sIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgLy8gbm8gZGVyZWZlcmVuY2luZ1xuICAgIGdldFJhdzogZnVuY3Rpb24gRGljdF9nZXRSYXcoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwW2tleV07XG4gICAgfSxcblxuICAgIGdldEtleXM6IGZ1bmN0aW9uIERpY3RfZ2V0S2V5cygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApO1xuICAgIH0sXG5cbiAgICAvLyBubyBkZXJlZmVyZW5jaW5nXG4gICAgZ2V0UmF3VmFsdWVzOiBmdW5jdGlvbiBEaWN0X2dldFJhd1ZhbHVlcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX21hcCk7XG4gICAgfSxcblxuICAgIHNldDogZnVuY3Rpb24gRGljdF9zZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIikpICYmXG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICB1bnJlYWNoYWJsZSgnRGljdC5zZXQ6IFRoZSBcInZhbHVlXCIgY2Fubm90IGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21hcFtrZXldID0gdmFsdWU7XG4gICAgfSxcblxuICAgIGhhczogZnVuY3Rpb24gRGljdF9oYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwW2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgZm9yRWFjaDogZnVuY3Rpb24gRGljdF9mb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fbWFwKSB7XG4gICAgICAgIGNhbGxiYWNrKGtleSwgdGhpcy5nZXQoa2V5KSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBEaWN0LmVtcHR5ID0gbmV3IERpY3QobnVsbCk7XG5cbiAgRGljdC5tZXJnZSA9IGZ1bmN0aW9uICh7IHhyZWYsIGRpY3RBcnJheSwgbWVyZ2VTdWJEaWN0cyA9IGZhbHNlIH0pIHtcbiAgICBjb25zdCBtZXJnZWREaWN0ID0gbmV3IERpY3QoeHJlZik7XG5cbiAgICBpZiAoIW1lcmdlU3ViRGljdHMpIHtcbiAgICAgIGZvciAoY29uc3QgZGljdCBvZiBkaWN0QXJyYXkpIHtcbiAgICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGljdC5fbWFwKSkge1xuICAgICAgICAgIGlmIChtZXJnZWREaWN0Ll9tYXBba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtZXJnZWREaWN0Ll9tYXBba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1lcmdlZERpY3Quc2l6ZSA+IDAgPyBtZXJnZWREaWN0IDogRGljdC5lbXB0eTtcbiAgICB9XG4gICAgY29uc3QgcHJvcGVydGllcyA9IG5ldyBNYXAoKTtcblxuICAgIGZvciAoY29uc3QgZGljdCBvZiBkaWN0QXJyYXkpIHtcbiAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRpY3QuX21hcCkpIHtcbiAgICAgICAgbGV0IHByb3BlcnR5ID0gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9wZXJ0eSA9IFtdO1xuICAgICAgICAgIHByb3BlcnRpZXMuc2V0KGtleSwgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHByb3BlcnR5LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZXNdIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxIHx8ICEodmFsdWVzWzBdIGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgICAgbWVyZ2VkRGljdC5fbWFwW25hbWVdID0gdmFsdWVzWzBdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1YkRpY3QgPSBuZXcgRGljdCh4cmVmKTtcblxuICAgICAgZm9yIChjb25zdCBkaWN0IG9mIHZhbHVlcykge1xuICAgICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkaWN0Ll9tYXApKSB7XG4gICAgICAgICAgaWYgKHN1YkRpY3QuX21hcFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN1YkRpY3QuX21hcFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3ViRGljdC5zaXplID4gMCkge1xuICAgICAgICBtZXJnZWREaWN0Ll9tYXBbbmFtZV0gPSBzdWJEaWN0O1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wZXJ0aWVzLmNsZWFyKCk7XG5cbiAgICByZXR1cm4gbWVyZ2VkRGljdC5zaXplID4gMCA/IG1lcmdlZERpY3QgOiBEaWN0LmVtcHR5O1xuICB9O1xuXG4gIHJldHVybiBEaWN0O1xufSkoKTtcblxudmFyIFJlZiA9IChmdW5jdGlvbiBSZWZDbG9zdXJlKCkge1xuICBsZXQgcmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUmVmKG51bSwgZ2VuKSB7XG4gICAgdGhpcy5udW0gPSBudW07XG4gICAgdGhpcy5nZW4gPSBnZW47XG4gIH1cblxuICBSZWYucHJvdG90eXBlID0ge1xuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiBSZWZfdG9TdHJpbmcoKSB7XG4gICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGhvdCwgc28gd2UgbWFrZSB0aGUgc3RyaW5nIGFzIGNvbXBhY3QgYXMgcG9zc2libGUuXG4gICAgICAvLyB8dGhpcy5nZW58IGlzIGFsbW9zdCBhbHdheXMgemVybywgc28gd2UgdHJlYXQgdGhhdCBjYXNlIHNwZWNpYWxseS5cbiAgICAgIGlmICh0aGlzLmdlbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5udW19UmA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7dGhpcy5udW19UiR7dGhpcy5nZW59YDtcbiAgICB9LFxuICB9O1xuXG4gIFJlZi5nZXQgPSBmdW5jdGlvbiAobnVtLCBnZW4pIHtcbiAgICBjb25zdCBrZXkgPSBnZW4gPT09IDAgPyBgJHtudW19UmAgOiBgJHtudW19UiR7Z2VufWA7XG4gICAgY29uc3QgcmVmVmFsdWUgPSByZWZDYWNoZVtrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgIHJldHVybiByZWZWYWx1ZSA/IHJlZlZhbHVlIDogKHJlZkNhY2hlW2tleV0gPSBuZXcgUmVmKG51bSwgZ2VuKSk7XG4gIH07XG5cbiAgUmVmLl9jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIHJlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfTtcblxuICByZXR1cm4gUmVmO1xufSkoKTtcblxuLy8gVGhlIHJlZmVyZW5jZSBpcyBpZGVudGlmaWVkIGJ5IG51bWJlciBhbmQgZ2VuZXJhdGlvbi5cbi8vIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgcmVmZXJlbmNlLlxuY2xhc3MgUmVmU2V0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2V0ID0gbmV3IFNldCgpO1xuICB9XG5cbiAgaGFzKHJlZikge1xuICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKHJlZi50b1N0cmluZygpKTtcbiAgfVxuXG4gIHB1dChyZWYpIHtcbiAgICB0aGlzLl9zZXQuYWRkKHJlZi50b1N0cmluZygpKTtcbiAgfVxuXG4gIHJlbW92ZShyZWYpIHtcbiAgICB0aGlzLl9zZXQuZGVsZXRlKHJlZi50b1N0cmluZygpKTtcbiAgfVxufVxuXG5jbGFzcyBSZWZTZXRDYWNoZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXAuc2l6ZTtcbiAgfVxuXG4gIGdldChyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwLmdldChyZWYudG9TdHJpbmcoKSk7XG4gIH1cblxuICBoYXMocmVmKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcC5oYXMocmVmLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcHV0KHJlZiwgb2JqKSB7XG4gICAgdGhpcy5fbWFwLnNldChyZWYudG9TdHJpbmcoKSwgb2JqKTtcbiAgfVxuXG4gIHB1dEFsaWFzKHJlZiwgYWxpYXNSZWYpIHtcbiAgICB0aGlzLl9tYXAuc2V0KHJlZi50b1N0cmluZygpLCB0aGlzLmdldChhbGlhc1JlZikpO1xuICB9XG5cbiAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy5fbWFwLnZhbHVlcygpKSB7XG4gICAgICBjYWxsYmFjayh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5fbWFwLmNsZWFyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNFT0Yodikge1xuICByZXR1cm4gdiA9PT0gRU9GO1xufVxuXG5mdW5jdGlvbiBpc05hbWUodiwgbmFtZSkge1xuICByZXR1cm4gdiBpbnN0YW5jZW9mIE5hbWUgJiYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB2Lm5hbWUgPT09IG5hbWUpO1xufVxuXG5mdW5jdGlvbiBpc0NtZCh2LCBjbWQpIHtcbiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBDbWQgJiYgKGNtZCA9PT0gdW5kZWZpbmVkIHx8IHYuY21kID09PSBjbWQpO1xufVxuXG5mdW5jdGlvbiBpc0RpY3QodiwgdHlwZSkge1xuICByZXR1cm4gKFxuICAgIHYgaW5zdGFuY2VvZiBEaWN0ICYmICh0eXBlID09PSB1bmRlZmluZWQgfHwgaXNOYW1lKHYuZ2V0KFwiVHlwZVwiKSwgdHlwZSkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUmVmKHYpIHtcbiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBSZWY7XG59XG5cbmZ1bmN0aW9uIGlzUmVmc0VxdWFsKHYxLCB2Mikge1xuICBpZiAoXG4gICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgdjEgaW5zdGFuY2VvZiBSZWYgJiYgdjIgaW5zdGFuY2VvZiBSZWYsXG4gICAgICBcImlzUmVmc0VxdWFsOiBCb3RoIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGBSZWZgcy5cIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHYxLm51bSA9PT0gdjIubnVtICYmIHYxLmdlbiA9PT0gdjIuZ2VuO1xufVxuXG5mdW5jdGlvbiBpc1N0cmVhbSh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmIHYuZ2V0Qnl0ZXMgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY2xlYXJQcmltaXRpdmVDYWNoZXMoKSB7XG4gIENtZC5fY2xlYXJDYWNoZSgpO1xuICBOYW1lLl9jbGVhckNhY2hlKCk7XG4gIFJlZi5fY2xlYXJDYWNoZSgpO1xufVxuXG5leHBvcnQge1xuICBFT0YsXG4gIGNsZWFyUHJpbWl0aXZlQ2FjaGVzLFxuICBDbWQsXG4gIERpY3QsXG4gIE5hbWUsXG4gIFJlZixcbiAgUmVmU2V0LFxuICBSZWZTZXRDYWNoZSxcbiAgaXNFT0YsXG4gIGlzQ21kLFxuICBpc0RpY3QsXG4gIGlzTmFtZSxcbiAgaXNSZWYsXG4gIGlzUmVmc0VxdWFsLFxuICBpc1N0cmVhbSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCxcbiAgc2hhZG93LFxuICB1bnJlYWNoYWJsZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBDaHVua2VkU3RyZWFtTWFuYWdlciB9IGZyb20gXCIuL2NodW5rZWRfc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IFBERkRvY3VtZW50IH0gZnJvbSBcIi4vZG9jdW1lbnQuanNcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuL3N0cmVhbS5qc1wiO1xuXG5jbGFzcyBCYXNlUGRmTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlUGRmTWFuYWdlcikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlUGRmTWFuYWdlci5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRvY0lkKCkge1xuICAgIHJldHVybiB0aGlzLl9kb2NJZDtcbiAgfVxuXG4gIGdldCBwYXNzd29yZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmQ7XG4gIH1cblxuICBnZXQgZG9jQmFzZVVybCgpIHtcbiAgICBsZXQgZG9jQmFzZVVybCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX2RvY0Jhc2VVcmwpIHtcbiAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh0aGlzLl9kb2NCYXNlVXJsKTtcbiAgICAgIGlmIChhYnNvbHV0ZVVybCkge1xuICAgICAgICBkb2NCYXNlVXJsID0gYWJzb2x1dGVVcmwuaHJlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oYEludmFsaWQgYWJzb2x1dGUgZG9jQmFzZVVybDogXCIke3RoaXMuX2RvY0Jhc2VVcmx9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJkb2NCYXNlVXJsXCIsIGRvY0Jhc2VVcmwpO1xuICB9XG5cbiAgb25Mb2FkZWRTdHJlYW0oKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYG9uTG9hZGVkU3RyZWFtYCBjYWxsZWRcIik7XG4gIH1cblxuICBlbnN1cmVEb2MocHJvcCwgYXJncykge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LCBwcm9wLCBhcmdzKTtcbiAgfVxuXG4gIGVuc3VyZVhSZWYocHJvcCwgYXJncykge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LnhyZWYsIHByb3AsIGFyZ3MpO1xuICB9XG5cbiAgZW5zdXJlQ2F0YWxvZyhwcm9wLCBhcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZywgcHJvcCwgYXJncyk7XG4gIH1cblxuICBnZXRQYWdlKHBhZ2VJbmRleCkge1xuICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZUluZGV4KTtcbiAgfVxuXG4gIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikge1xuICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcik7XG4gIH1cblxuICBjbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKTtcbiAgfVxuXG4gIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWRcIik7XG4gIH1cblxuICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0UmFuZ2VgIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJlcXVlc3RMb2FkZWRTdHJlYW0oKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYHJlcXVlc3RMb2FkZWRTdHJlYW1gIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkXCIpO1xuICB9XG5cbiAgdXBkYXRlUGFzc3dvcmQocGFzc3dvcmQpIHtcbiAgICB0aGlzLl9wYXNzd29yZCA9IHBhc3N3b3JkO1xuICB9XG5cbiAgdGVybWluYXRlKHJlYXNvbikge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGB0ZXJtaW5hdGVgIGNhbGxlZFwiKTtcbiAgfVxufVxuXG5jbGFzcyBMb2NhbFBkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKGRvY0lkLCBkYXRhLCBwYXNzd29yZCwgZXZhbHVhdG9yT3B0aW9ucywgZG9jQmFzZVVybCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9kb2NJZCA9IGRvY0lkO1xuICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgdGhpcy5fZG9jQmFzZVVybCA9IGRvY0Jhc2VVcmw7XG4gICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gZXZhbHVhdG9yT3B0aW9ucztcblxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oZGF0YSk7XG4gICAgdGhpcy5wZGZEb2N1bWVudCA9IG5ldyBQREZEb2N1bWVudCh0aGlzLCBzdHJlYW0pO1xuICAgIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoc3RyZWFtKTtcbiAgfVxuXG4gIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHJlcXVlc3RMb2FkZWRTdHJlYW0oKSB7fVxuXG4gIG9uTG9hZGVkU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1Qcm9taXNlO1xuICB9XG5cbiAgdGVybWluYXRlKHJlYXNvbikge31cbn1cblxuY2xhc3MgTmV0d29ya1BkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKGRvY0lkLCBwZGZOZXR3b3JrU3RyZWFtLCBhcmdzLCBldmFsdWF0b3JPcHRpb25zLCBkb2NCYXNlVXJsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2RvY0lkID0gZG9jSWQ7XG4gICAgdGhpcy5fcGFzc3dvcmQgPSBhcmdzLnBhc3N3b3JkO1xuICAgIHRoaXMuX2RvY0Jhc2VVcmwgPSBkb2NCYXNlVXJsO1xuICAgIHRoaXMubXNnSGFuZGxlciA9IGFyZ3MubXNnSGFuZGxlcjtcbiAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBldmFsdWF0b3JPcHRpb25zO1xuXG4gICAgdGhpcy5zdHJlYW1NYW5hZ2VyID0gbmV3IENodW5rZWRTdHJlYW1NYW5hZ2VyKHBkZk5ldHdvcmtTdHJlYW0sIHtcbiAgICAgIG1zZ0hhbmRsZXI6IGFyZ3MubXNnSGFuZGxlcixcbiAgICAgIGxlbmd0aDogYXJncy5sZW5ndGgsXG4gICAgICBkaXNhYmxlQXV0b0ZldGNoOiBhcmdzLmRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICByYW5nZUNodW5rU2l6ZTogYXJncy5yYW5nZUNodW5rU2l6ZSxcbiAgICB9KTtcbiAgICB0aGlzLnBkZkRvY3VtZW50ID0gbmV3IFBERkRvY3VtZW50KHRoaXMsIHRoaXMuc3RyZWFtTWFuYWdlci5nZXRTdHJlYW0oKSk7XG4gIH1cblxuICBhc3luYyBlbnN1cmUob2JqLCBwcm9wLCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpO1xuICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlKG9iaiwgcHJvcCwgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKTtcbiAgfVxuXG4gIHJlcXVlc3RMb2FkZWRTdHJlYW0oKSB7XG4gICAgdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RBbGxDaHVua3MoKTtcbiAgfVxuXG4gIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHtcbiAgICB0aGlzLnN0cmVhbU1hbmFnZXIub25SZWNlaXZlRGF0YSh7IGNodW5rIH0pO1xuICB9XG5cbiAgb25Mb2FkZWRTdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpO1xuICB9XG5cbiAgdGVybWluYXRlKHJlYXNvbikge1xuICAgIHRoaXMuc3RyZWFtTWFuYWdlci5hYm9ydChyZWFzb24pO1xuICB9XG59XG5cbmV4cG9ydCB7IExvY2FsUGRmTWFuYWdlciwgTmV0d29ya1BkZk1hbmFnZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgYXJyYXlCeXRlTGVuZ3RoLFxuICBhcnJheXNUb0J5dGVzLFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuY2xhc3MgQ2h1bmtlZFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKGxlbmd0aCwgY2h1bmtTaXplLCBtYW5hZ2VyKSB7XG4gICAgdGhpcy5ieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMuZW5kID0gbGVuZ3RoO1xuICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplO1xuICAgIHRoaXMuX2xvYWRlZENodW5rcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLm51bUNodW5rcyA9IE1hdGguY2VpbChsZW5ndGggLyBjaHVua1NpemUpO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSAwO1xuICAgIHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmsgPSAtMTsgLy8gU2luZ2xlLWVudHJ5IGNhY2hlXG4gIH1cblxuICAvLyBJZiBhIHBhcnRpY3VsYXIgc3RyZWFtIGRvZXMgbm90IGltcGxlbWVudCBvbmUgb3IgbW9yZSBvZiB0aGVzZSBtZXRob2RzLFxuICAvLyBhbiBlcnJvciBzaG91bGQgYmUgdGhyb3duLlxuICBnZXRNaXNzaW5nQ2h1bmtzKCkge1xuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGZvciAobGV0IGNodW5rID0gMCwgbiA9IHRoaXMubnVtQ2h1bmtzOyBjaHVuayA8IG47ICsrY2h1bmspIHtcbiAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHtcbiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2h1bmtzO1xuICB9XG5cbiAgZ2V0QmFzZVN0cmVhbXMoKSB7XG4gICAgcmV0dXJuIFt0aGlzXTtcbiAgfVxuXG4gIGdldCBudW1DaHVua3NMb2FkZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5zaXplO1xuICB9XG5cbiAgYWxsQ2h1bmtzTG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3M7XG4gIH1cblxuICBvblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuaykge1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplO1xuICAgIGlmIChiZWdpbiAlIGNodW5rU2l6ZSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWQgYmVnaW4gb2Zmc2V0OiAke2JlZ2lufWApO1xuICAgIH1cblxuICAgIC8vIFVzaW5nIGB0aGlzLmxlbmd0aGAgaXMgaW5hY2N1cmF0ZSBoZXJlIHNpbmNlIGB0aGlzLnN0YXJ0YCBjYW4gYmUgbW92ZWRcbiAgICAvLyAoc2VlIHRoZSBgbW92ZVN0YXJ0YCBtZXRob2QpLlxuICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICBpZiAoZW5kICUgY2h1bmtTaXplICE9PSAwICYmIGVuZCAhPT0gdGhpcy5ieXRlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIGVuZCBvZmZzZXQ6ICR7ZW5kfWApO1xuICAgIH1cblxuICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgYmVnaW4pO1xuICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTtcbiAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gY2h1bmtTaXplKSArIDE7XG5cbiAgICBmb3IgKGxldCBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHtcbiAgICAgIC8vIFNpbmNlIGEgdmFsdWUgY2FuIG9ubHkgb2NjdXIgKm9uY2UqIGluIGEgYFNldGAsIHRoZXJlJ3Mgbm8gbmVlZCB0b1xuICAgICAgLy8gbWFudWFsbHkgY2hlY2sgYFNldC5wcm90b3R5cGUuaGFzKClgIGJlZm9yZSBhZGRpbmcgdGhlIHZhbHVlIGhlcmUuXG4gICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTtcbiAgICB9XG4gIH1cblxuICBvblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEoZGF0YSkge1xuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoO1xuICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKHBvc2l0aW9uIC8gdGhpcy5jaHVua1NpemUpO1xuXG4gICAgdGhpcy5ieXRlcy5zZXQobmV3IFVpbnQ4QXJyYXkoZGF0YSksIHBvc2l0aW9uKTtcbiAgICBwb3NpdGlvbiArPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBwb3NpdGlvbjtcbiAgICBjb25zdCBlbmRDaHVuayA9XG4gICAgICBwb3NpdGlvbiA+PSB0aGlzLmVuZFxuICAgICAgICA/IHRoaXMubnVtQ2h1bmtzXG4gICAgICAgIDogTWF0aC5mbG9vcihwb3NpdGlvbiAvIHRoaXMuY2h1bmtTaXplKTtcblxuICAgIGZvciAobGV0IGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPCBlbmRDaHVuazsgKytjdXJDaHVuaykge1xuICAgICAgLy8gU2luY2UgYSB2YWx1ZSBjYW4gb25seSBvY2N1ciAqb25jZSogaW4gYSBgU2V0YCwgdGhlcmUncyBubyBuZWVkIHRvXG4gICAgICAvLyBtYW51YWxseSBjaGVjayBgU2V0LnByb3RvdHlwZS5oYXMoKWAgYmVmb3JlIGFkZGluZyB0aGUgdmFsdWUgaGVyZS5cbiAgICAgIHRoaXMuX2xvYWRlZENodW5rcy5hZGQoY3VyQ2h1bmspO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZUJ5dGUocG9zKSB7XG4gICAgaWYgKHBvcyA8IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2h1bmsgPSBNYXRoLmZsb29yKHBvcyAvIHRoaXMuY2h1bmtTaXplKTtcbiAgICBpZiAoY2h1bmsgPT09IHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7XG4gICAgICB0aHJvdyBuZXcgTWlzc2luZ0RhdGFFeGNlcHRpb24ocG9zLCBwb3MgKyAxKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayA9IGNodW5rO1xuICB9XG5cbiAgZW5zdXJlUmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgIGlmIChiZWdpbiA+PSBlbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVuZCA8PSB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplO1xuICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTtcbiAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gY2h1bmtTaXplKSArIDE7XG4gICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7XG4gICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7XG4gICAgICAgIHRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihiZWdpbiwgZW5kKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZXh0RW1wdHlDaHVuayhiZWdpbkNodW5rKSB7XG4gICAgY29uc3QgbnVtQ2h1bmtzID0gdGhpcy5udW1DaHVua3M7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1DaHVua3M7ICsraSkge1xuICAgICAgY29uc3QgY2h1bmsgPSAoYmVnaW5DaHVuayArIGkpICUgbnVtQ2h1bmtzOyAvLyBXcmFwIGFyb3VuZCB0byBiZWdpbm5pbmcuXG4gICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7XG4gICAgICAgIHJldHVybiBjaHVuaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBoYXNDaHVuayhjaHVuaykge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5kIC0gdGhpcy5zdGFydDtcbiAgfVxuXG4gIGdldCBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldEJ5dGUoKSB7XG4gICAgY29uc3QgcG9zID0gdGhpcy5wb3M7XG4gICAgaWYgKHBvcyA+PSB0aGlzLmVuZCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAocG9zID49IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICB0aGlzLmVuc3VyZUJ5dGUocG9zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107XG4gIH1cblxuICBnZXRVaW50MTYoKSB7XG4gICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICBjb25zdCBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTtcbiAgfVxuXG4gIGdldEludDMyKCkge1xuICAgIGNvbnN0IGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgY29uc3QgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICBjb25zdCBiMiA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgIGNvbnN0IGIzID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7XG4gIH1cblxuICAvLyBSZXR1cm5zIHN1YmFycmF5IG9mIG9yaWdpbmFsIGJ1ZmZlciwgc2hvdWxkIG9ubHkgYmUgcmVhZC5cbiAgZ2V0Qnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICBjb25zdCBwb3MgPSB0aGlzLnBvcztcbiAgICBjb25zdCBzdHJFbmQgPSB0aGlzLmVuZDtcblxuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICBpZiAoc3RyRW5kID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIHN0ckVuZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdWJhcnJheSA9IGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTtcbiAgICAgIC8vIGB0aGlzLmJ5dGVzYCBpcyBhbHdheXMgYSBgVWludDhBcnJheWAgaGVyZS5cbiAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gICAgfVxuXG4gICAgbGV0IGVuZCA9IHBvcyArIGxlbmd0aDtcbiAgICBpZiAoZW5kID4gc3RyRW5kKSB7XG4gICAgICBlbmQgPSBzdHJFbmQ7XG4gICAgfVxuICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIGVuZCk7XG4gICAgfVxuXG4gICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgY29uc3Qgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7XG4gICAgLy8gYHRoaXMuYnl0ZXNgIGlzIGFsd2F5cyBhIGBVaW50OEFycmF5YCBoZXJlLlxuICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gIH1cblxuICBwZWVrQnl0ZSgpIHtcbiAgICBjb25zdCBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgaWYgKHBlZWtlZEJ5dGUgIT09IC0xKSB7XG4gICAgICB0aGlzLnBvcy0tO1xuICAgIH1cbiAgICByZXR1cm4gcGVla2VkQnl0ZTtcbiAgfVxuXG4gIHBlZWtCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTtcbiAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGJ5dGVzO1xuICB9XG5cbiAgZ2V0Qnl0ZVJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICBpZiAoYmVnaW4gPCAwKSB7XG4gICAgICBiZWdpbiA9IDA7XG4gICAgfVxuICAgIGlmIChlbmQgPiB0aGlzLmVuZCkge1xuICAgICAgZW5kID0gdGhpcy5lbmQ7XG4gICAgfVxuICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgdGhpcy5lbnN1cmVSYW5nZShiZWdpbiwgZW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gIH1cblxuICBza2lwKG4pIHtcbiAgICBpZiAoIW4pIHtcbiAgICAgIG4gPSAxO1xuICAgIH1cbiAgICB0aGlzLnBvcyArPSBuO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICB9XG5cbiAgbW92ZVN0YXJ0KCkge1xuICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvcztcbiAgfVxuXG4gIG1ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCkge1xuICAgIGlmIChsZW5ndGgpIHtcbiAgICAgIGlmIChzdGFydCArIGxlbmd0aCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2hlbiB0aGUgYGxlbmd0aGAgaXMgdW5kZWZpbmVkIHlvdSBkbyAqbm90KiwgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsXG4gICAgICAvLyB3YW50IHRvIGZhbGxiYWNrIG9uIGNhbGxpbmcgYHRoaXMuZW5zdXJlUmFuZ2Uoc3RhcnQsIHRoaXMuZW5kKWAgc2luY2VcbiAgICAgIC8vIHRoYXQgd291bGQgZm9yY2UgdGhlICplbnRpcmUqIFBERiBmaWxlIHRvIGJlIGxvYWRlZCwgdGh1cyBjb21wbGV0ZWx5XG4gICAgICAvLyBicmVha2luZyB0aGUgd2hvbGUgcHVycG9zZSBvZiB1c2luZyBzdHJlYW1pbmcgYW5kL29yIHJhbmdlIHJlcXVlc3RzLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIG5vdCBkb2luZyBhbnkgY2hlY2tpbmcgaGVyZSBjb3VsZCB2ZXJ5IGVhc2lseSBsZWFkIHRvIHdhc3RlZFxuICAgICAgLy8gdGltZS9yZXNvdXJjZXMgZHVyaW5nIGUuZy4gcGFyc2luZywgc2luY2UgYE1pc3NpbmdEYXRhRXhjZXB0aW9uYHMgd2lsbFxuICAgICAgLy8gcmVxdWlyZSBkYXRhIHRvIGJlIHJlLXBhcnNlZCwgd2hpY2ggd2UgYXR0ZW1wdCB0byBtaW5pbWl6ZSBieSBhdCBsZWFzdFxuICAgICAgLy8gY2hlY2tpbmcgdGhhdCB0aGUgKmJlZ2lubmluZyogb2YgdGhlIGRhdGEgaXMgYXZhaWxhYmxlIGhlcmUuXG4gICAgICBpZiAoc3RhcnQgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVCeXRlKHN0YXJ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDaHVua2VkU3RyZWFtU3Vic3RyZWFtKCkge31cbiAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUuZ2V0TWlzc2luZ0NodW5rcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplO1xuICAgICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IodGhpcy5zdGFydCAvIGNodW5rU2l6ZSk7XG4gICAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKHRoaXMuZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTtcbiAgICAgIGNvbnN0IG1pc3NpbmdDaHVua3MgPSBbXTtcbiAgICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7XG4gICAgICAgICAgbWlzc2luZ0NodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1pc3NpbmdDaHVua3M7XG4gICAgfTtcbiAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5hbGxDaHVua3NMb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5udW1DaHVua3NMb2FkZWQgPT09IHRoaXMubnVtQ2h1bmtzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWlzc2luZ0NodW5rcygpLmxlbmd0aCA9PT0gMDtcbiAgICB9O1xuXG4gICAgY29uc3Qgc3ViU3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKTtcbiAgICBzdWJTdHJlYW0ucG9zID0gc3ViU3RyZWFtLnN0YXJ0ID0gc3RhcnQ7XG4gICAgc3ViU3RyZWFtLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIHx8IHRoaXMuZW5kO1xuICAgIHN1YlN0cmVhbS5kaWN0ID0gZGljdDtcbiAgICByZXR1cm4gc3ViU3RyZWFtO1xuICB9XG59XG5cbmNsYXNzIENodW5rZWRTdHJlYW1NYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IocGRmTmV0d29ya1N0cmVhbSwgYXJncykge1xuICAgIHRoaXMubGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gICAgdGhpcy5jaHVua1NpemUgPSBhcmdzLnJhbmdlQ2h1bmtTaXplO1xuICAgIHRoaXMuc3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW0odGhpcy5sZW5ndGgsIHRoaXMuY2h1bmtTaXplLCB0aGlzKTtcbiAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0gPSBwZGZOZXR3b3JrU3RyZWFtO1xuICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaCA9IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaDtcbiAgICB0aGlzLm1zZ0hhbmRsZXIgPSBhcmdzLm1zZ0hhbmRsZXI7XG5cbiAgICB0aGlzLmN1cnJSZXF1ZXN0SWQgPSAwO1xuXG4gICAgdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuayA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IDA7XG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgfVxuXG4gIG9uTG9hZGVkU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBzZW5kUmVxdWVzdChiZWdpbiwgZW5kKSB7XG4gICAgY29uc3QgcmFuZ2VSZWFkZXIgPSB0aGlzLnBkZk5ldHdvcmtTdHJlYW0uZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCk7XG4gICAgaWYgKCFyYW5nZVJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCkge1xuICAgICAgcmFuZ2VSZWFkZXIub25Qcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGxldCBjaHVua3MgPSBbXSxcbiAgICAgIGxvYWRlZCA9IDA7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlYWRDaHVuayA9IGNodW5rID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIWNodW5rLmRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjaHVuay52YWx1ZTtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgbG9hZGVkICs9IGFycmF5Qnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgICAgICAgIGlmIChyYW5nZVJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCkge1xuICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeyBsb2FkZWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYW5nZVJlYWRlci5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNodW5rRGF0YSA9IGFycmF5c1RvQnl0ZXMoY2h1bmtzKTtcbiAgICAgICAgICBjaHVua3MgPSBudWxsO1xuICAgICAgICAgIHJlc29sdmUoY2h1bmtEYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTtcbiAgICB9KTtcbiAgICBwcm9taXNlLnRoZW4oZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjsgLy8gSWdub3JpbmcgYW55IGRhdGEgYWZ0ZXIgYWJvcnQuXG4gICAgICB9XG4gICAgICB0aGlzLm9uUmVjZWl2ZURhdGEoeyBjaHVuazogZGF0YSwgYmVnaW4gfSk7XG4gICAgfSk7XG4gICAgLy8gVE9ETyBjaGVjayBlcnJvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBjaHVua3MgdGhhdCBhcmUgbm90IHlldCBsb2FkZWQgYW5kIGdyb3VwIHRoZW0gaW50b1xuICAgKiBjb250aWd1b3VzIHJhbmdlcyB0byBsb2FkIGluIGFzIGZldyByZXF1ZXN0cyBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHJlcXVlc3RBbGxDaHVua3MoKSB7XG4gICAgY29uc3QgbWlzc2luZ0NodW5rcyA9IHRoaXMuc3RyZWFtLmdldE1pc3NpbmdDaHVua3MoKTtcbiAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKG1pc3NpbmdDaHVua3MpO1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBfcmVxdWVzdENodW5rcyhjaHVua3MpIHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmN1cnJSZXF1ZXN0SWQrKztcblxuICAgIGNvbnN0IGNodW5rc05lZWRlZCA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2h1bmtzTmVlZGVkKTtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgaWYgKCF0aGlzLnN0cmVhbS5oYXNDaHVuayhjaHVuaykpIHtcbiAgICAgICAgY2h1bmtzTmVlZGVkLmFkZChjaHVuayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNodW5rc05lZWRlZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2FwYWJpbGl0eSk7XG5cbiAgICBjb25zdCBjaHVua3NUb1JlcXVlc3QgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rc05lZWRlZCkge1xuICAgICAgbGV0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGNodW5rKTtcbiAgICAgIGlmICghcmVxdWVzdElkcykge1xuICAgICAgICByZXF1ZXN0SWRzID0gW107XG4gICAgICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zZXQoY2h1bmssIHJlcXVlc3RJZHMpO1xuXG4gICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RJZHMucHVzaChyZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIGlmIChjaHVua3NUb1JlcXVlc3QubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCA9IHRoaXMuZ3JvdXBDaHVua3MoY2h1bmtzVG9SZXF1ZXN0KTtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXBlZENodW5rIG9mIGdyb3VwZWRDaHVua3NUb1JlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYmVnaW4gPSBncm91cGVkQ2h1bmsuYmVnaW5DaHVuayAqIHRoaXMuY2h1bmtTaXplO1xuICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICBncm91cGVkQ2h1bmsuZW5kQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZSxcbiAgICAgICAgICB0aGlzLmxlbmd0aFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlbmRSZXF1ZXN0KGJlZ2luLCBlbmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2UuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmluZyBhbnkgcGVuZGluZyByZXF1ZXN0cyBhZnRlciBhYm9ydC5cbiAgICAgIH1cbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW07XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW55IGNodW5rcyBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlIHRoYXQgYXJlIG5vdCB5ZXQgbG9hZGVkLlxuICAgKi9cbiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICBlbmQgPSBNYXRoLm1pbihlbmQsIHRoaXMubGVuZ3RoKTtcblxuICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsoYmVnaW4pO1xuICAgIGNvbnN0IGVuZENodW5rID0gdGhpcy5nZXRFbmRDaHVuayhlbmQpO1xuXG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rcyk7XG4gIH1cblxuICByZXF1ZXN0UmFuZ2VzKHJhbmdlcyA9IFtdKSB7XG4gICAgY29uc3QgY2h1bmtzVG9SZXF1ZXN0ID0gW107XG4gICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcbiAgICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsocmFuZ2UuYmVnaW4pO1xuICAgICAgY29uc3QgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKHJhbmdlLmVuZCk7XG4gICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHtcbiAgICAgICAgaWYgKCFjaHVua3NUb1JlcXVlc3QuaW5jbHVkZXMoY2h1bmspKSB7XG4gICAgICAgICAgY2h1bmtzVG9SZXF1ZXN0LnB1c2goY2h1bmspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2h1bmtzVG9SZXF1ZXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3NUb1JlcXVlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwcyBhIHNvcnRlZCBhcnJheSBvZiBjaHVua3MgaW50byBhcyBmZXcgY29udGlndW91cyBsYXJnZXJcbiAgICogY2h1bmtzIGFzIHBvc3NpYmxlLlxuICAgKi9cbiAgZ3JvdXBDaHVua3MoY2h1bmtzKSB7XG4gICAgY29uc3QgZ3JvdXBlZENodW5rcyA9IFtdO1xuICAgIGxldCBiZWdpbkNodW5rID0gLTE7XG4gICAgbGV0IHByZXZDaHVuayA9IC0xO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgaWYgKGJlZ2luQ2h1bmsgPCAwKSB7XG4gICAgICAgIGJlZ2luQ2h1bmsgPSBjaHVuaztcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXZDaHVuayA+PSAwICYmIHByZXZDaHVuayArIDEgIT09IGNodW5rKSB7XG4gICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7IGJlZ2luQ2h1bmssIGVuZENodW5rOiBwcmV2Q2h1bmsgKyAxIH0pO1xuICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7XG4gICAgICB9XG4gICAgICBpZiAoaSArIDEgPT09IGNodW5rcy5sZW5ndGgpIHtcbiAgICAgICAgZ3JvdXBlZENodW5rcy5wdXNoKHsgYmVnaW5DaHVuaywgZW5kQ2h1bms6IGNodW5rICsgMSB9KTtcbiAgICAgIH1cblxuICAgICAgcHJldkNodW5rID0gY2h1bms7XG4gICAgfVxuICAgIHJldHVybiBncm91cGVkQ2h1bmtzO1xuICB9XG5cbiAgb25Qcm9ncmVzcyhhcmdzKSB7XG4gICAgdGhpcy5tc2dIYW5kbGVyLnNlbmQoXCJEb2NQcm9ncmVzc1wiLCB7XG4gICAgICBsb2FkZWQ6IHRoaXMuc3RyZWFtLm51bUNodW5rc0xvYWRlZCAqIHRoaXMuY2h1bmtTaXplICsgYXJncy5sb2FkZWQsXG4gICAgICB0b3RhbDogdGhpcy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICBvblJlY2VpdmVEYXRhKGFyZ3MpIHtcbiAgICBjb25zdCBjaHVuayA9IGFyZ3MuY2h1bms7XG4gICAgY29uc3QgaXNQcm9ncmVzc2l2ZSA9IGFyZ3MuYmVnaW4gPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiZWdpbiA9IGlzUHJvZ3Jlc3NpdmUgPyB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA6IGFyZ3MuYmVnaW47XG4gICAgY29uc3QgZW5kID0gYmVnaW4gKyBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7XG4gICAgY29uc3QgZW5kQ2h1bmsgPVxuICAgICAgZW5kIDwgdGhpcy5sZW5ndGhcbiAgICAgICAgPyBNYXRoLmZsb29yKGVuZCAvIHRoaXMuY2h1bmtTaXplKVxuICAgICAgICA6IE1hdGguY2VpbChlbmQgLyB0aGlzLmNodW5rU2l6ZSk7XG5cbiAgICBpZiAoaXNQcm9ncmVzc2l2ZSkge1xuICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuayk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RyZWFtLmFsbENodW5rc0xvYWRlZCgpKSB7XG4gICAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlc29sdmUodGhpcy5zdHJlYW0pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZFJlcXVlc3RzID0gW107XG4gICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7XG4gICAgICAvLyBUaGUgc2VydmVyIG1pZ2h0IHJldHVybiBtb3JlIGNodW5rcyB0aGFuIHJlcXVlc3RlZC5cbiAgICAgIGNvbnN0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGN1ckNodW5rKTtcbiAgICAgIGlmICghcmVxdWVzdElkcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5kZWxldGUoY3VyQ2h1bmspO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiByZXF1ZXN0SWRzKSB7XG4gICAgICAgIGNvbnN0IGNodW5rc05lZWRlZCA9IHRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdC5nZXQocmVxdWVzdElkKTtcbiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5oYXMoY3VyQ2h1bmspKSB7XG4gICAgICAgICAgY2h1bmtzTmVlZGVkLmRlbGV0ZShjdXJDaHVuayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2h1bmtzTmVlZGVkLnNpemUgPiAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbG9hZGVkUmVxdWVzdHMucHVzaChyZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBwZW5kaW5nIHJlcXVlc3RzLCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSBuZXh0XG4gICAgLy8gdW5mZXRjaGVkIGNodW5rIG9mIHRoZSBQREYgZmlsZS5cbiAgICBpZiAoIXRoaXMuZGlzYWJsZUF1dG9GZXRjaCAmJiB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuc2l6ZSA9PT0gMCkge1xuICAgICAgbGV0IG5leHRFbXB0eUNodW5rO1xuICAgICAgaWYgKHRoaXMuc3RyZWFtLm51bUNodW5rc0xvYWRlZCA9PT0gMSkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBvcHRpbWl6YXRpb24gc28gdGhhdCBhZnRlciBmZXRjaGluZyB0aGUgZmlyc3RcbiAgICAgICAgLy8gY2h1bmssIHJhdGhlciB0aGFuIGZldGNoaW5nIHRoZSBzZWNvbmQgY2h1bmssIHdlIGZldGNoIHRoZSBsYXN0XG4gICAgICAgIC8vIGNodW5rLlxuICAgICAgICBjb25zdCBsYXN0Q2h1bmsgPSB0aGlzLnN0cmVhbS5udW1DaHVua3MgLSAxO1xuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHtcbiAgICAgICAgICBuZXh0RW1wdHlDaHVuayA9IGxhc3RDaHVuaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEVtcHR5Q2h1bmsgPSB0aGlzLnN0cmVhbS5uZXh0RW1wdHlDaHVuayhlbmRDaHVuayk7XG4gICAgICB9XG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuZXh0RW1wdHlDaHVuaykpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdENodW5rcyhbbmV4dEVtcHR5Q2h1bmtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiBsb2FkZWRSZXF1ZXN0cykge1xuICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmdldChyZXF1ZXN0SWQpO1xuICAgICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLm1zZ0hhbmRsZXIuc2VuZChcIkRvY1Byb2dyZXNzXCIsIHtcbiAgICAgIGxvYWRlZDogdGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkICogdGhpcy5jaHVua1NpemUsXG4gICAgICB0b3RhbDogdGhpcy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICBvbkVycm9yKGVycikge1xuICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7XG4gIH1cblxuICBnZXRCZWdpbkNodW5rKGJlZ2luKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7XG4gIH1cblxuICBnZXRFbmRDaHVuayhlbmQpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyB0aGlzLmNodW5rU2l6ZSkgKyAxO1xuICB9XG5cbiAgYWJvcnQocmVhc29uKSB7XG4gICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wZGZOZXR3b3JrU3RyZWFtKSB7XG4gICAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0uY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LnZhbHVlcygpKSB7XG4gICAgICBjYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBDaHVua2VkU3RyZWFtLCBDaHVua2VkU3RyZWFtTWFuYWdlciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTkgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIEJhc2VFeGNlcHRpb24sIHdhcm4gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGluaXRpYWxpemVyKSB7XG4gIGxldCBsb29rdXA7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICBsb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgaW5pdGlhbGl6ZXIobG9va3VwKTtcbiAgICAgIGluaXRpYWxpemVyID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGxvb2t1cDtcbiAgfTtcbn1cblxuY2xhc3MgTWlzc2luZ0RhdGFFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCkge1xuICAgIHN1cGVyKGBNaXNzaW5nIGRhdGEgWyR7YmVnaW59LCAke2VuZH0pYCk7XG4gICAgdGhpcy5iZWdpbiA9IGJlZ2luO1xuICAgIHRoaXMuZW5kID0gZW5kO1xuICB9XG59XG5cbmNsYXNzIFhSZWZFbnRyeUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuY2xhc3MgWFJlZlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYW4gaW5oZXJpdGFibGUgcHJvcGVydHkuXG4gKlxuICogSWYgdGhlIFBERiBzcGVjaWZpY2F0aW9uIGV4cGxpY2l0bHkgbGlzdHMgYSBwcm9wZXJ0eSBpbiBhIGRpY3Rpb25hcnkgYXNcbiAqIGluaGVyaXRhYmxlLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRpY3Rpb25hcnlcbiAqIGl0c2VsZiBvciBpbiBvbmUgb3IgbW9yZSBwYXJlbnRzIG9mIHRoZSBkaWN0aW9uYXJ5LlxuICpcbiAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSB0cmVlLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLFxuICogdGhlIHZhbHVlIGZvciB0aGUga2V5IGlzIHJldHVybmVkIG9yLCBpZiBgc3RvcFdoZW5Gb3VuZGAgaXMgYGZhbHNlYCwgYSBsaXN0XG4gKiBvZiB2YWx1ZXMgaXMgcmV0dXJuZWQuIFRvIGF2b2lkIGluZmluaXRlIGxvb3BzLCB0aGUgdHJhdmVyc2FsIGlzIHN0b3BwZWQgd2hlblxuICogdGhlIGxvb3AgbGltaXQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAcGFyYW0ge0RpY3R9IGRpY3QgLSBEaWN0aW9uYXJ5IGZyb20gd2hlcmUgdG8gc3RhcnQgdGhlIHRyYXZlcnNhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBmaW5kIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGdldEFycmF5IC0gV2hldGhlciBvciBub3QgdGhlIHZhbHVlIHNob3VsZCBiZSBmZXRjaGVkIGFzIGFuXG4gKiAgIGFycmF5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHBhcmFtIHtib29sZWFufSBzdG9wV2hlbkZvdW5kIC0gV2hldGhlciBvciBub3QgdG8gc3RvcCB0aGUgdHJhdmVyc2FsIHdoZW5cbiAqICAgdGhlIGtleSBpcyBmb3VuZC4gSWYgc2V0IHRvIGBmYWxzZWAsIHdlIGFsd2F5cyB3YWxrIHVwIHRoZSBlbnRpcmUgcGFyZW50XG4gKiAgIGNoYWluLCBmb3IgZXhhbXBsZSB0byBiZSBhYmxlIHRvIGZpbmQgYFxcUmVzb3VyY2VzYCBwbGFjZWQgb24gbXVsdGlwbGVcbiAqICAgbGV2ZWxzIG9mIHRoZSB0cmVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gKi9cbmZ1bmN0aW9uIGdldEluaGVyaXRhYmxlUHJvcGVydHkoe1xuICBkaWN0LFxuICBrZXksXG4gIGdldEFycmF5ID0gZmFsc2UsXG4gIHN0b3BXaGVuRm91bmQgPSB0cnVlLFxufSkge1xuICBjb25zdCBMT09QX0xJTUlUID0gMTAwO1xuICBsZXQgbG9vcENvdW50ID0gMDtcbiAgbGV0IHZhbHVlcztcblxuICB3aGlsZSAoZGljdCkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoc3RvcFdoZW5Gb3VuZCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKCsrbG9vcENvdW50ID4gTE9PUF9MSU1JVCkge1xuICAgICAgd2FybihgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTogbWF4aW11bSBsb29wIGNvdW50IGV4Y2VlZGVkIGZvciBcIiR7a2V5fVwiYCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGljdCA9IGRpY3QuZ2V0KFwiUGFyZW50XCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgUk9NQU5fTlVNQkVSX01BUCA9IFtcbiAgXCJcIiwgXCJDXCIsIFwiQ0NcIiwgXCJDQ0NcIiwgXCJDRFwiLCBcIkRcIiwgXCJEQ1wiLCBcIkRDQ1wiLCBcIkRDQ0NcIiwgXCJDTVwiLFxuICBcIlwiLCBcIlhcIiwgXCJYWFwiLCBcIlhYWFwiLCBcIlhMXCIsIFwiTFwiLCBcIkxYXCIsIFwiTFhYXCIsIFwiTFhYWFwiLCBcIlhDXCIsXG4gIFwiXCIsIFwiSVwiLCBcIklJXCIsIFwiSUlJXCIsIFwiSVZcIiwgXCJWXCIsIFwiVklcIiwgXCJWSUlcIiwgXCJWSUlJXCIsIFwiSVhcIlxuXTtcblxuLyoqXG4gKiBDb252ZXJ0cyBwb3NpdGl2ZSBpbnRlZ2VycyB0byAodXBwZXIgY2FzZSkgUm9tYW4gbnVtZXJhbHMuXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIC0gVGhlIG51bWJlciB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxvd2VyQ2FzZSAtIEluZGljYXRlcyBpZiB0aGUgcmVzdWx0IHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAqICAgdG8gbG93ZXIgY2FzZSBsZXR0ZXJzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHJlc3VsdGluZyBSb21hbiBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhudW1iZXIsIGxvd2VyQ2FzZSA9IGZhbHNlKSB7XG4gIGFzc2VydChcbiAgICBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcikgJiYgbnVtYmVyID4gMCxcbiAgICBcIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cIlxuICApO1xuICBjb25zdCByb21hbkJ1ZiA9IFtdO1xuICBsZXQgcG9zO1xuICAvLyBUaG91c2FuZHNcbiAgd2hpbGUgKG51bWJlciA+PSAxMDAwKSB7XG4gICAgbnVtYmVyIC09IDEwMDA7XG4gICAgcm9tYW5CdWYucHVzaChcIk1cIik7XG4gIH1cbiAgLy8gSHVuZHJlZHNcbiAgcG9zID0gKG51bWJlciAvIDEwMCkgfCAwO1xuICBudW1iZXIgJT0gMTAwO1xuICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbcG9zXSk7XG4gIC8vIFRlbnNcbiAgcG9zID0gKG51bWJlciAvIDEwKSB8IDA7XG4gIG51bWJlciAlPSAxMDtcbiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzEwICsgcG9zXSk7XG4gIC8vIE9uZXNcbiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyXSk7XG5cbiAgY29uc3Qgcm9tYW5TdHIgPSByb21hbkJ1Zi5qb2luKFwiXCIpO1xuICByZXR1cm4gbG93ZXJDYXNlID8gcm9tYW5TdHIudG9Mb3dlckNhc2UoKSA6IHJvbWFuU3RyO1xufVxuXG4vLyBDYWxjdWxhdGUgdGhlIGJhc2UgMiBsb2dhcml0aG0gb2YgdGhlIG51bWJlciBgeGAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZVxuLy8gbmF0aXZlIGZ1bmN0aW9uIGluIHRoZSBzZW5zZSB0aGF0IGl0IHJldHVybnMgdGhlIGNlaWxpbmcgdmFsdWUgYW5kIHRoYXQgaXRcbi8vIHJldHVybnMgMCBpbnN0ZWFkIG9mIGBJbmZpbml0eWAvYE5hTmAgZm9yIGB4YCB2YWx1ZXMgc21hbGxlciB0aGFuL2VxdWFsIHRvIDAuXG5mdW5jdGlvbiBsb2cyKHgpIHtcbiAgaWYgKHggPD0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwoTWF0aC5sb2cyKHgpKTtcbn1cblxuZnVuY3Rpb24gcmVhZEludDgoZGF0YSwgb2Zmc2V0KSB7XG4gIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDI0KSA+PiAyNDtcbn1cblxuZnVuY3Rpb24gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpIHtcbiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgOCkgfCBkYXRhW29mZnNldCArIDFdO1xufVxuXG5mdW5jdGlvbiByZWFkVWludDMyKGRhdGEsIG9mZnNldCkge1xuICByZXR1cm4gKFxuICAgICgoZGF0YVtvZmZzZXRdIDw8IDI0KSB8XG4gICAgICAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICAgKGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICAgZGF0YVtvZmZzZXQgKyAzXSkgPj4+XG4gICAgMFxuICApO1xufVxuXG4vLyBDaGVja3MgaWYgY2ggaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogU1BBQ0UsIFRBQiwgQ1Igb3IgTEYuXG5mdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHtcbiAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhO1xufVxuXG5leHBvcnQge1xuICBnZXRMb29rdXBUYWJsZUZhY3RvcnksXG4gIE1pc3NpbmdEYXRhRXhjZXB0aW9uLFxuICBYUmVmRW50cnlFeGNlcHRpb24sXG4gIFhSZWZQYXJzZUV4Y2VwdGlvbixcbiAgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSxcbiAgdG9Sb21hbk51bWVyYWxzLFxuICBsb2cyLFxuICByZWFkSW50OCxcbiAgcmVhZFVpbnQxNixcbiAgcmVhZFVpbnQzMixcbiAgaXNXaGl0ZVNwYWNlLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBGb3JtYXRFcnJvcixcbiAgaW5mbyxcbiAgSW52YWxpZFBERkV4Y2VwdGlvbixcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNBcnJheUVxdWFsLFxuICBpc0Jvb2wsXG4gIGlzTnVtLFxuICBpc1N0cmluZyxcbiAgT1BTLFxuICBzaGFkb3csXG4gIHN0cmluZ1RvQnl0ZXMsXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICB1bnJlYWNoYWJsZSxcbiAgVXRpbCxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBDYXRhbG9nLCBPYmplY3RMb2FkZXIsIFhSZWYgfSBmcm9tIFwiLi9vYmouanNcIjtcbmltcG9ydCB7XG4gIGNsZWFyUHJpbWl0aXZlQ2FjaGVzLFxuICBEaWN0LFxuICBpc0RpY3QsXG4gIGlzTmFtZSxcbiAgaXNTdHJlYW0sXG4gIFJlZixcbn0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSxcbiAgaXNXaGl0ZVNwYWNlLFxuICBNaXNzaW5nRGF0YUV4Y2VwdGlvbixcbiAgWFJlZkVudHJ5RXhjZXB0aW9uLFxuICBYUmVmUGFyc2VFeGNlcHRpb24sXG59IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IE51bGxTdHJlYW0sIFN0cmVhbSwgU3RyZWFtc1NlcXVlbmNlU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uRmFjdG9yeSB9IGZyb20gXCIuL2Fubm90YXRpb24uanNcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZU1ENSB9IGZyb20gXCIuL2NyeXB0by5qc1wiO1xuaW1wb3J0IHsgTGluZWFyaXphdGlvbiB9IGZyb20gXCIuL3BhcnNlci5qc1wiO1xuaW1wb3J0IHsgT3BlcmF0b3JMaXN0IH0gZnJvbSBcIi4vb3BlcmF0b3JfbGlzdC5qc1wiO1xuaW1wb3J0IHsgUGFydGlhbEV2YWx1YXRvciB9IGZyb20gXCIuL2V2YWx1YXRvci5qc1wiO1xuXG5jb25zdCBERUZBVUxUX1VTRVJfVU5JVCA9IDEuMDtcbmNvbnN0IExFVFRFUl9TSVpFX01FRElBQk9YID0gWzAsIDAsIDYxMiwgNzkyXTtcblxuZnVuY3Rpb24gaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uLCBpbnRlbnQpIHtcbiAgcmV0dXJuIChcbiAgICAoaW50ZW50ID09PSBcImRpc3BsYXlcIiAmJiBhbm5vdGF0aW9uLnZpZXdhYmxlKSB8fFxuICAgIChpbnRlbnQgPT09IFwicHJpbnRcIiAmJiBhbm5vdGF0aW9uLnByaW50YWJsZSlcbiAgKTtcbn1cblxuY2xhc3MgUGFnZSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwZGZNYW5hZ2VyLFxuICAgIHhyZWYsXG4gICAgcGFnZUluZGV4LFxuICAgIHBhZ2VEaWN0LFxuICAgIHJlZixcbiAgICBnbG9iYWxJZEZhY3RvcnksXG4gICAgZm9udENhY2hlLFxuICAgIGJ1aWx0SW5DTWFwQ2FjaGUsXG4gICAgZ2xvYmFsSW1hZ2VDYWNoZSxcbiAgfSkge1xuICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5wYWdlRGljdCA9IHBhZ2VEaWN0O1xuICAgIHRoaXMueHJlZiA9IHhyZWY7XG4gICAgdGhpcy5yZWYgPSByZWY7XG4gICAgdGhpcy5mb250Q2FjaGUgPSBmb250Q2FjaGU7XG4gICAgdGhpcy5idWlsdEluQ01hcENhY2hlID0gYnVpbHRJbkNNYXBDYWNoZTtcbiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBnbG9iYWxJbWFnZUNhY2hlO1xuICAgIHRoaXMuZXZhbHVhdG9yT3B0aW9ucyA9IHBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9ucztcbiAgICB0aGlzLnJlc291cmNlc1Byb21pc2UgPSBudWxsO1xuXG4gICAgY29uc3QgaWRDb3VudGVycyA9IHtcbiAgICAgIG9iajogMCxcbiAgICB9O1xuICAgIHRoaXMuX2xvY2FsSWRGYWN0b3J5ID0gY2xhc3MgZXh0ZW5kcyBnbG9iYWxJZEZhY3Rvcnkge1xuICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkge1xuICAgICAgICByZXR1cm4gYHAke3BhZ2VJbmRleH1fJHsrK2lkQ291bnRlcnMub2JqfWA7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dldEluaGVyaXRhYmxlUHJvcGVydHkoa2V5LCBnZXRBcnJheSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHtcbiAgICAgIGRpY3Q6IHRoaXMucGFnZURpY3QsXG4gICAgICBrZXksXG4gICAgICBnZXRBcnJheSxcbiAgICAgIHN0b3BXaGVuRm91bmQ6IGZhbHNlLFxuICAgIH0pO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSB8fCAhaXNEaWN0KHZhbHVlWzBdKSkge1xuICAgICAgcmV0dXJuIHZhbHVlWzBdO1xuICAgIH1cbiAgICByZXR1cm4gRGljdC5tZXJnZSh7IHhyZWY6IHRoaXMueHJlZiwgZGljdEFycmF5OiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGdldCBjb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2VEaWN0LmdldChcIkNvbnRlbnRzXCIpO1xuICB9XG5cbiAgZ2V0IHJlc291cmNlcygpIHtcbiAgICAvLyBGb3Igcm9idXN0bmVzczogVGhlIHNwZWMgc3RhdGVzIHRoYXQgYSBcXFJlc291cmNlcyBlbnRyeSBoYXMgdG8gYmVcbiAgICAvLyBwcmVzZW50LCBidXQgY2FuIGJlIGVtcHR5LiBTb21lIGRvY3VtZW50cyBzdGlsbCBvbWl0IGl0OyBpbiB0aGlzIGNhc2VcbiAgICAvLyB3ZSByZXR1cm4gYW4gZW1wdHkgZGljdGlvbmFyeS5cbiAgICByZXR1cm4gc2hhZG93KFxuICAgICAgdGhpcyxcbiAgICAgIFwicmVzb3VyY2VzXCIsXG4gICAgICB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KFwiUmVzb3VyY2VzXCIpIHx8IERpY3QuZW1wdHlcbiAgICApO1xuICB9XG5cbiAgX2dldEJvdW5kaW5nQm94KG5hbWUpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KG5hbWUsIC8qIGdldEFycmF5ID0gKi8gdHJ1ZSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShib3gpICYmIGJveC5sZW5ndGggPT09IDQpIHtcbiAgICAgIGlmIChib3hbMl0gLSBib3hbMF0gIT09IDAgJiYgYm94WzNdIC0gYm94WzFdICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBib3g7XG4gICAgICB9XG4gICAgICB3YXJuKGBFbXB0eSAvJHtuYW1lfSBlbnRyeS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgbWVkaWFCb3goKSB7XG4gICAgLy8gUmVzZXQgaW52YWxpZCBtZWRpYSBib3ggdG8gbGV0dGVyIHNpemUuXG4gICAgcmV0dXJuIHNoYWRvdyhcbiAgICAgIHRoaXMsXG4gICAgICBcIm1lZGlhQm94XCIsXG4gICAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChcIk1lZGlhQm94XCIpIHx8IExFVFRFUl9TSVpFX01FRElBQk9YXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjcm9wQm94KCkge1xuICAgIC8vIFJlc2V0IGludmFsaWQgY3JvcCBib3ggdG8gbWVkaWEgYm94LlxuICAgIHJldHVybiBzaGFkb3coXG4gICAgICB0aGlzLFxuICAgICAgXCJjcm9wQm94XCIsXG4gICAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChcIkNyb3BCb3hcIikgfHwgdGhpcy5tZWRpYUJveFxuICAgICk7XG4gIH1cblxuICBnZXQgdXNlclVuaXQoKSB7XG4gICAgbGV0IG9iaiA9IHRoaXMucGFnZURpY3QuZ2V0KFwiVXNlclVuaXRcIik7XG4gICAgaWYgKCFpc051bShvYmopIHx8IG9iaiA8PSAwKSB7XG4gICAgICBvYmogPSBERUZBVUxUX1VTRVJfVU5JVDtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInVzZXJVbml0XCIsIG9iaik7XG4gIH1cblxuICBnZXQgdmlldygpIHtcbiAgICAvLyBGcm9tIHRoZSBzcGVjLCA2dGggZWQuLCBwLjk2MzpcbiAgICAvLyBcIlRoZSBjcm9wLCBibGVlZCwgdHJpbSwgYW5kIGFydCBib3hlcyBzaG91bGQgbm90IG9yZGluYXJpbHlcbiAgICAvLyBleHRlbmQgYmV5b25kIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBtZWRpYSBib3guIElmIHRoZXkgZG8sIHRoZXkgYXJlXG4gICAgLy8gZWZmZWN0aXZlbHkgcmVkdWNlZCB0byB0aGVpciBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgbWVkaWEgYm94LlwiXG4gICAgY29uc3QgeyBjcm9wQm94LCBtZWRpYUJveCB9ID0gdGhpcztcbiAgICBsZXQgdmlldztcbiAgICBpZiAoY3JvcEJveCA9PT0gbWVkaWFCb3ggfHwgaXNBcnJheUVxdWFsKGNyb3BCb3gsIG1lZGlhQm94KSkge1xuICAgICAgdmlldyA9IG1lZGlhQm94O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3ggPSBVdGlsLmludGVyc2VjdChjcm9wQm94LCBtZWRpYUJveCk7XG4gICAgICBpZiAoYm94ICYmIGJveFsyXSAtIGJveFswXSAhPT0gMCAmJiBib3hbM10gLSBib3hbMV0gIT09IDApIHtcbiAgICAgICAgdmlldyA9IGJveDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oXCJFbXB0eSAvQ3JvcEJveCBhbmQgL01lZGlhQm94IGludGVyc2VjdGlvbi5cIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2aWV3XCIsIHZpZXcgfHwgbWVkaWFCb3gpO1xuICB9XG5cbiAgZ2V0IHJvdGF0ZSgpIHtcbiAgICBsZXQgcm90YXRlID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShcIlJvdGF0ZVwiKSB8fCAwO1xuXG4gICAgLy8gTm9ybWFsaXplIHJvdGF0aW9uIHNvIGl0J3MgYSBtdWx0aXBsZSBvZiA5MCBhbmQgYmV0d2VlbiAwIGFuZCAyNzAuXG4gICAgaWYgKHJvdGF0ZSAlIDkwICE9PSAwKSB7XG4gICAgICByb3RhdGUgPSAwO1xuICAgIH0gZWxzZSBpZiAocm90YXRlID49IDM2MCkge1xuICAgICAgcm90YXRlID0gcm90YXRlICUgMzYwO1xuICAgIH0gZWxzZSBpZiAocm90YXRlIDwgMCkge1xuICAgICAgLy8gVGhlIHNwZWMgZG9lc24ndCBjb3ZlciBuZWdhdGl2ZXMuIEFzc3VtZSBpdCdzIGNvdW50ZXJjbG9ja3dpc2VcbiAgICAgIC8vIHJvdGF0aW9uLiBUaGUgZm9sbG93aW5nIGlzIHRoZSBvdGhlciBpbXBsZW1lbnRhdGlvbiBvZiBtb2R1bG8uXG4gICAgICByb3RhdGUgPSAoKHJvdGF0ZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicm90YXRlXCIsIHJvdGF0ZSk7XG4gIH1cblxuICBnZXRDb250ZW50U3RyZWFtKCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG4gICAgbGV0IHN0cmVhbTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG4gICAgICAvLyBGZXRjaGluZyB0aGUgaW5kaXZpZHVhbCBzdHJlYW1zIGZyb20gdGhlIGFycmF5LlxuICAgICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjtcbiAgICAgIGNvbnN0IHN0cmVhbXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgc3ViU3RyZWFtIG9mIGNvbnRlbnQpIHtcbiAgICAgICAgc3RyZWFtcy5wdXNoKHhyZWYuZmV0Y2hJZlJlZihzdWJTdHJlYW0pKTtcbiAgICAgIH1cbiAgICAgIHN0cmVhbSA9IG5ldyBTdHJlYW1zU2VxdWVuY2VTdHJlYW0oc3RyZWFtcyk7XG4gICAgfSBlbHNlIGlmIChpc1N0cmVhbShjb250ZW50KSkge1xuICAgICAgc3RyZWFtID0gY29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVwbGFjZSBub24tZXhpc3RlbnQgcGFnZSBjb250ZW50IHdpdGggZW1wdHkgY29udGVudC5cbiAgICAgIHN0cmVhbSA9IG5ldyBOdWxsU3RyZWFtKCk7XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG4gIH1cblxuICBzYXZlKGhhbmRsZXIsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7XG4gICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHtcbiAgICAgIHhyZWY6IHRoaXMueHJlZixcbiAgICAgIGhhbmRsZXIsXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSxcbiAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsXG4gICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsXG4gICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsXG4gICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICAvLyBGZXRjaCB0aGUgcGFnZSdzIGFubm90YXRpb25zIGFuZCBzYXZlIHRoZSBjb250ZW50XG4gICAgLy8gaW4gY2FzZSBvZiBpbnRlcmFjdGl2ZSBmb3JtIGZpZWxkcy5cbiAgICByZXR1cm4gdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHtcbiAgICAgIGNvbnN0IG5ld1JlZnNQcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7XG4gICAgICAgIGlmICghaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uLCBcInByaW50XCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbmV3UmVmc1Byb21pc2VzLnB1c2goXG4gICAgICAgICAgYW5ub3RhdGlvblxuICAgICAgICAgICAgLnNhdmUocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwic2F2ZSAtIGlnbm9yaW5nIGFubm90YXRpb24gZGF0YSBkdXJpbmcgXCIgK1xuICAgICAgICAgICAgICAgICAgYFwiJHt0YXNrLm5hbWV9XCIgdGFzazogXCIke3JlYXNvbn1cIi5gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5ld1JlZnNQcm9taXNlcyk7XG4gICAgfSk7XG4gIH1cblxuICBsb2FkUmVzb3VyY2VzKGtleXMpIHtcbiAgICBpZiAoIXRoaXMucmVzb3VyY2VzUHJvbWlzZSkge1xuICAgICAgLy8gVE9ETzogYWRkIGFzeW5jIGBfZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eWAgYW5kIHJlbW92ZSB0aGlzLlxuICAgICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCBcInJlc291cmNlc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIodGhpcy5yZXNvdXJjZXMsIGtleXMsIHRoaXMueHJlZik7XG4gICAgICByZXR1cm4gb2JqZWN0TG9hZGVyLmxvYWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE9wZXJhdG9yTGlzdCh7XG4gICAgaGFuZGxlcixcbiAgICBzaW5rLFxuICAgIHRhc2ssXG4gICAgaW50ZW50LFxuICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMsXG4gICAgYW5ub3RhdGlvblN0b3JhZ2UsXG4gIH0pIHtcbiAgICBjb25zdCBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUoXG4gICAgICB0aGlzLFxuICAgICAgXCJnZXRDb250ZW50U3RyZWFtXCJcbiAgICApO1xuICAgIGNvbnN0IHJlc291cmNlc1Byb21pc2UgPSB0aGlzLmxvYWRSZXNvdXJjZXMoW1xuICAgICAgXCJFeHRHU3RhdGVcIixcbiAgICAgIFwiQ29sb3JTcGFjZVwiLFxuICAgICAgXCJQYXR0ZXJuXCIsXG4gICAgICBcIlNoYWRpbmdcIixcbiAgICAgIFwiWE9iamVjdFwiLFxuICAgICAgXCJGb250XCIsXG4gICAgXSk7XG5cbiAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IFBhcnRpYWxFdmFsdWF0b3Ioe1xuICAgICAgeHJlZjogdGhpcy54cmVmLFxuICAgICAgaGFuZGxlcixcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LFxuICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSxcbiAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSxcbiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGFQcm9taXNlcyA9IFByb21pc2UuYWxsKFtjb250ZW50U3RyZWFtUHJvbWlzZSwgcmVzb3VyY2VzUHJvbWlzZV0pO1xuICAgIGNvbnN0IHBhZ2VMaXN0UHJvbWlzZSA9IGRhdGFQcm9taXNlcy50aGVuKChbY29udGVudFN0cmVhbV0pID0+IHtcbiAgICAgIGNvbnN0IG9wTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoaW50ZW50LCBzaW5rKTtcblxuICAgICAgaGFuZGxlci5zZW5kKFwiU3RhcnRSZW5kZXJQYWdlXCIsIHtcbiAgICAgICAgdHJhbnNwYXJlbmN5OiBwYXJ0aWFsRXZhbHVhdG9yLmhhc0JsZW5kTW9kZXModGhpcy5yZXNvdXJjZXMpLFxuICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgICBpbnRlbnQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3JcbiAgICAgICAgLmdldE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgc3RyZWFtOiBjb250ZW50U3RyZWFtLFxuICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcyxcbiAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBvcExpc3Q7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gRmV0Y2ggdGhlIHBhZ2UncyBhbm5vdGF0aW9ucyBhbmQgYWRkIHRoZWlyIG9wZXJhdG9yIGxpc3RzIHRvIHRoZVxuICAgIC8vIHBhZ2UncyBvcGVyYXRvciBsaXN0IHRvIHJlbmRlciB0aGVtLlxuICAgIHJldHVybiBQcm9taXNlLmFsbChbcGFnZUxpc3RQcm9taXNlLCB0aGlzLl9wYXJzZWRBbm5vdGF0aW9uc10pLnRoZW4oXG4gICAgICBmdW5jdGlvbiAoW3BhZ2VPcExpc3QsIGFubm90YXRpb25zXSkge1xuICAgICAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcGFnZU9wTGlzdC5mbHVzaCh0cnVlKTtcbiAgICAgICAgICByZXR1cm4geyBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGggfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbGxlY3QgdGhlIG9wZXJhdG9yIGxpc3QgcHJvbWlzZXMgZm9yIHRoZSBhbm5vdGF0aW9ucy4gRWFjaCBwcm9taXNlXG4gICAgICAgIC8vIGlzIHJlc29sdmVkIHdpdGggdGhlIGNvbXBsZXRlIG9wZXJhdG9yIGxpc3QgZm9yIGEgc2luZ2xlIGFubm90YXRpb24uXG4gICAgICAgIGNvbnN0IG9wTGlzdFByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykge1xuICAgICAgICAgIGlmIChpc0Fubm90YXRpb25SZW5kZXJhYmxlKGFubm90YXRpb24sIGludGVudCkpIHtcbiAgICAgICAgICAgIG9wTGlzdFByb21pc2VzLnB1c2goXG4gICAgICAgICAgICAgIGFubm90YXRpb25cbiAgICAgICAgICAgICAgICAuZ2V0T3BlcmF0b3JMaXN0KFxuICAgICAgICAgICAgICAgICAgcGFydGlhbEV2YWx1YXRvcixcbiAgICAgICAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLFxuICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgICAgIFwiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgYW5ub3RhdGlvbiBkYXRhIGR1cmluZyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgYFwiJHt0YXNrLm5hbWV9XCIgdGFzazogXCIke3JlYXNvbn1cIi5gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wTGlzdFByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChvcExpc3RzKSB7XG4gICAgICAgICAgcGFnZU9wTGlzdC5hZGRPcChPUFMuYmVnaW5Bbm5vdGF0aW9ucywgW10pO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3BMaXN0IG9mIG9wTGlzdHMpIHtcbiAgICAgICAgICAgIHBhZ2VPcExpc3QuYWRkT3BMaXN0KG9wTGlzdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhZ2VPcExpc3QuYWRkT3AoT1BTLmVuZEFubm90YXRpb25zLCBbXSk7XG4gICAgICAgICAgcGFnZU9wTGlzdC5mbHVzaCh0cnVlKTtcbiAgICAgICAgICByZXR1cm4geyBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGggfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGV4dHJhY3RUZXh0Q29udGVudCh7XG4gICAgaGFuZGxlcixcbiAgICB0YXNrLFxuICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UsXG4gICAgc2luayxcbiAgICBjb21iaW5lVGV4dEl0ZW1zLFxuICB9KSB7XG4gICAgY29uc3QgY29udGVudFN0cmVhbVByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiZ2V0Q29udGVudFN0cmVhbVwiXG4gICAgKTtcbiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFtcbiAgICAgIFwiRXh0R1N0YXRlXCIsXG4gICAgICBcIlhPYmplY3RcIixcbiAgICAgIFwiRm9udFwiLFxuICAgIF0pO1xuXG4gICAgY29uc3QgZGF0YVByb21pc2VzID0gUHJvbWlzZS5hbGwoW2NvbnRlbnRTdHJlYW1Qcm9taXNlLCByZXNvdXJjZXNQcm9taXNlXSk7XG4gICAgcmV0dXJuIGRhdGFQcm9taXNlcy50aGVuKChbY29udGVudFN0cmVhbV0pID0+IHtcbiAgICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7XG4gICAgICAgIHhyZWY6IHRoaXMueHJlZixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSxcbiAgICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSxcbiAgICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLFxuICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcGFydGlhbEV2YWx1YXRvci5nZXRUZXh0Q29udGVudCh7XG4gICAgICAgIHN0cmVhbTogY29udGVudFN0cmVhbSxcbiAgICAgICAgdGFzayxcbiAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcyxcbiAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZSxcbiAgICAgICAgY29tYmluZVRleHRJdGVtcyxcbiAgICAgICAgc2luayxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0QW5ub3RhdGlvbnNEYXRhKGludGVudCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucy50aGVuKGZ1bmN0aW9uIChhbm5vdGF0aW9ucykge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbnNEYXRhID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBhbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGlmICghaW50ZW50IHx8IGlzQW5ub3RhdGlvblJlbmRlcmFibGUoYW5ub3RhdGlvbnNbaV0sIGludGVudCkpIHtcbiAgICAgICAgICBhbm5vdGF0aW9uc0RhdGEucHVzaChhbm5vdGF0aW9uc1tpXS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFubm90YXRpb25zRGF0YTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBhbm5vdGF0aW9ucygpIHtcbiAgICByZXR1cm4gc2hhZG93KFxuICAgICAgdGhpcyxcbiAgICAgIFwiYW5ub3RhdGlvbnNcIixcbiAgICAgIHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoXCJBbm5vdHNcIikgfHwgW11cbiAgICApO1xuICB9XG5cbiAgZ2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpIHtcbiAgICBjb25zdCBwYXJzZWRBbm5vdGF0aW9ucyA9IHRoaXMucGRmTWFuYWdlclxuICAgICAgLmVuc3VyZSh0aGlzLCBcImFubm90YXRpb25zXCIpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGFubm90YXRpb25SZWYgb2YgdGhpcy5hbm5vdGF0aW9ucykge1xuICAgICAgICAgIGFubm90YXRpb25Qcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKFxuICAgICAgICAgICAgICB0aGlzLnhyZWYsXG4gICAgICAgICAgICAgIGFubm90YXRpb25SZWYsXG4gICAgICAgICAgICAgIHRoaXMucGRmTWFuYWdlcixcbiAgICAgICAgICAgICAgdGhpcy5fbG9jYWxJZEZhY3RvcnlcbiAgICAgICAgICAgICkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICB3YXJuKGBfcGFyc2VkQW5ub3RhdGlvbnM6IFwiJHtyZWFzb259XCIuYCk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGFubm90YXRpb25Qcm9taXNlcykudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnMuZmlsdGVyKGFubm90YXRpb24gPT4gISFhbm5vdGF0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfcGFyc2VkQW5ub3RhdGlvbnNcIiwgcGFyc2VkQW5ub3RhdGlvbnMpO1xuICB9XG59XG5cbmNvbnN0IFBERl9IRUFERVJfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4MjUsIDB4NTAsIDB4NDQsIDB4NDYsIDB4MmRdKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgU1RBUlRYUkVGX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFtcbiAgMHg3MywgMHg3NCwgMHg2MSwgMHg3MiwgMHg3NCwgMHg3OCwgMHg3MiwgMHg2NSwgMHg2Nl0pO1xuY29uc3QgRU5ET0JKX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDY1LCAweDZlLCAweDY0LCAweDZmLCAweDYyLCAweDZhXSk7XG5cbmNvbnN0IEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTID0gMTAyNDtcbmNvbnN0IEVNUFRZX0ZJTkdFUlBSSU5UID1cbiAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiO1xuXG5jb25zdCBQREZfSEVBREVSX1ZFUlNJT05fUkVHRVhQID0gL15bMS05XVxcLlswLTldJC87XG5cbmZ1bmN0aW9uIGZpbmQoc3RyZWFtLCBzaWduYXR1cmUsIGxpbWl0ID0gMTAyNCwgYmFja3dhcmRzID0gZmFsc2UpIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICkge1xuICAgIGFzc2VydChsaW1pdCA+IDAsICdUaGUgXCJsaW1pdFwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLicpO1xuICB9XG4gIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cbiAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhsaW1pdCk7XG4gIGNvbnN0IHNjYW5MZW5ndGggPSBzY2FuQnl0ZXMubGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoO1xuXG4gIGlmIChzY2FuTGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJhY2t3YXJkcykge1xuICAgIGNvbnN0IHNpZ25hdHVyZUVuZCA9IHNpZ25hdHVyZUxlbmd0aCAtIDE7XG5cbiAgICBsZXQgcG9zID0gc2NhbkJ5dGVzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKHBvcyA+PSBzaWduYXR1cmVFbmQpIHtcbiAgICAgIGxldCBqID0gMDtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgaiA8IHNpZ25hdHVyZUxlbmd0aCAmJlxuICAgICAgICBzY2FuQnl0ZXNbcG9zIC0gal0gPT09IHNpZ25hdHVyZVtzaWduYXR1cmVFbmQgLSBqXVxuICAgICAgKSB7XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICAgIGlmIChqID49IHNpZ25hdHVyZUxlbmd0aCkge1xuICAgICAgICAvLyBgc2lnbmF0dXJlYCBmb3VuZC5cbiAgICAgICAgc3RyZWFtLnBvcyArPSBwb3MgLSBzaWduYXR1cmVFbmQ7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcG9zLS07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGZvcndhcmRzXG4gICAgbGV0IHBvcyA9IDA7XG4gICAgd2hpbGUgKHBvcyA8PSBzY2FuTGVuZ3RoKSB7XG4gICAgICBsZXQgaiA9IDA7XG4gICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zICsgal0gPT09IHNpZ25hdHVyZVtqXSkge1xuICAgICAgICBqKys7XG4gICAgICB9XG4gICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHtcbiAgICAgICAgLy8gYHNpZ25hdHVyZWAgZm91bmQuXG4gICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHBvcysrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVGhlIGBQREZEb2N1bWVudGAgY2xhc3MgaG9sZHMgYWxsIHRoZSAod29ya2VyLXRocmVhZCkgZGF0YSBvZiB0aGUgUERGIGZpbGUuXG4gKi9cbmNsYXNzIFBERkRvY3VtZW50IHtcbiAgY29uc3RydWN0b3IocGRmTWFuYWdlciwgYXJnKSB7XG4gICAgbGV0IHN0cmVhbTtcbiAgICBpZiAoaXNTdHJlYW0oYXJnKSkge1xuICAgICAgc3RyZWFtID0gYXJnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihhcmcpKSB7XG4gICAgICBzdHJlYW0gPSBuZXcgU3RyZWFtKGFyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBERkRvY3VtZW50OiBVbmtub3duIGFyZ3VtZW50IHR5cGVcIik7XG4gICAgfVxuICAgIGlmIChzdHJlYW0ubGVuZ3RoIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKFxuICAgICAgICBcIlRoZSBQREYgZmlsZSBpcyBlbXB0eSwgaS5lLiBpdHMgc2l6ZSBpcyB6ZXJvIGJ5dGVzLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy54cmVmID0gbmV3IFhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKTtcbiAgICB0aGlzLl9wYWdlUHJvbWlzZXMgPSBbXTtcbiAgICB0aGlzLl92ZXJzaW9uID0gbnVsbDtcblxuICAgIGNvbnN0IGlkQ291bnRlcnMgPSB7XG4gICAgICBmb250OiAwLFxuICAgIH07XG4gICAgdGhpcy5fZ2xvYmFsSWRGYWN0b3J5ID0gY2xhc3Mge1xuICAgICAgc3RhdGljIGdldERvY0lkKCkge1xuICAgICAgICByZXR1cm4gYGdfJHtwZGZNYW5hZ2VyLmRvY0lkfWA7XG4gICAgICB9XG5cbiAgICAgIHN0YXRpYyBjcmVhdGVGb250SWQoKSB7XG4gICAgICAgIHJldHVybiBgZiR7KytpZENvdW50ZXJzLmZvbnR9YDtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkge1xuICAgICAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlT2JqSWRgIGNhbGxlZC5cIik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHBhcnNlKHJlY292ZXJ5TW9kZSkge1xuICAgIHRoaXMueHJlZi5wYXJzZShyZWNvdmVyeU1vZGUpO1xuICAgIHRoaXMuY2F0YWxvZyA9IG5ldyBDYXRhbG9nKHRoaXMucGRmTWFuYWdlciwgdGhpcy54cmVmKTtcblxuICAgIC8vIFRoZSBgY2hlY2tIZWFkZXJgIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGFuZCBwYXJzZXMgdGhlXG4gICAgLy8gdmVyc2lvbiBmcm9tIHRoZSBoZWFkZXIuIFRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyBpbiBzZWN0aW9uIDcuNS4yXG4gICAgLy8gdGhhdCB0aGUgdmVyc2lvbiBmcm9tIHRoZSBjYXRhbG9nLCBpZiBwcmVzZW50LCBzaG91bGQgb3ZlcndyaXRlIHRoZVxuICAgIC8vIHZlcnNpb24gZnJvbSB0aGUgaGVhZGVyLlxuICAgIGlmICh0aGlzLmNhdGFsb2cudmVyc2lvbikge1xuICAgICAgdGhpcy5fdmVyc2lvbiA9IHRoaXMuY2F0YWxvZy52ZXJzaW9uO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsaW5lYXJpemF0aW9uKCkge1xuICAgIGxldCBsaW5lYXJpemF0aW9uID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgbGluZWFyaXphdGlvbiA9IExpbmVhcml6YXRpb24uY3JlYXRlKHRoaXMuc3RyZWFtKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBpbmZvKGVycik7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJsaW5lYXJpemF0aW9uXCIsIGxpbmVhcml6YXRpb24pO1xuICB9XG5cbiAgZ2V0IHN0YXJ0WFJlZigpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTtcbiAgICBsZXQgc3RhcnRYUmVmID0gMDtcblxuICAgIGlmICh0aGlzLmxpbmVhcml6YXRpb24pIHtcbiAgICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgb2JqZWN0LlxuICAgICAgc3RyZWFtLnJlc2V0KCk7XG4gICAgICBpZiAoZmluZChzdHJlYW0sIEVORE9CSl9TSUdOQVRVUkUpKSB7XG4gICAgICAgIHN0YXJ0WFJlZiA9IHN0cmVhbS5wb3MgKyA2IC0gc3RyZWFtLnN0YXJ0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIGBzdGFydHhyZWZgIGJ5IGNoZWNraW5nIGJhY2t3YXJkcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gICAgICBjb25zdCBzdGVwID0gMTAyNDtcbiAgICAgIGNvbnN0IHN0YXJ0WFJlZkxlbmd0aCA9IFNUQVJUWFJFRl9TSUdOQVRVUkUubGVuZ3RoO1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2UsXG4gICAgICAgIHBvcyA9IHN0cmVhbS5lbmQ7XG5cbiAgICAgIHdoaWxlICghZm91bmQgJiYgcG9zID4gMCkge1xuICAgICAgICBwb3MgLT0gc3RlcCAtIHN0YXJ0WFJlZkxlbmd0aDtcbiAgICAgICAgaWYgKHBvcyA8IDApIHtcbiAgICAgICAgICBwb3MgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5wb3MgPSBwb3M7XG4gICAgICAgIGZvdW5kID0gZmluZChzdHJlYW0sIFNUQVJUWFJFRl9TSUdOQVRVUkUsIHN0ZXAsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgc3RyZWFtLnNraXAoOSk7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNoID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgfSB3aGlsZSAoaXNXaGl0ZVNwYWNlKGNoKSk7XG4gICAgICAgIGxldCBzdHIgPSBcIlwiO1xuICAgICAgICB3aGlsZSAoY2ggPj0gLyogU3BhY2UgPSAqLyAweDIwICYmIGNoIDw9IC8qICc5JyA9ICovIDB4MzkpIHtcbiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0WFJlZiA9IHBhcnNlSW50KHN0ciwgMTApO1xuICAgICAgICBpZiAoaXNOYU4oc3RhcnRYUmVmKSkge1xuICAgICAgICAgIHN0YXJ0WFJlZiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInN0YXJ0WFJlZlwiLCBzdGFydFhSZWYpO1xuICB9XG5cbiAgLy8gRmluZCB0aGUgaGVhZGVyLCBnZXQgdGhlIFBERiBmb3JtYXQgdmVyc2lvbiBhbmQgc2V0dXAgdGhlXG4gIC8vIHN0cmVhbSB0byBzdGFydCBmcm9tIHRoZSBoZWFkZXIuXG4gIGNoZWNrSGVhZGVyKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtO1xuICAgIHN0cmVhbS5yZXNldCgpO1xuXG4gICAgaWYgKCFmaW5kKHN0cmVhbSwgUERGX0hFQURFUl9TSUdOQVRVUkUpKSB7XG4gICAgICAvLyBNYXkgbm90IGJlIGEgUERGIGZpbGUsIGJ1dCBkb24ndCB0aHJvdyBhbiBlcnJvciBhbmQgbGV0XG4gICAgICAvLyBwYXJzaW5nIGNvbnRpbnVlLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdHJlYW0ubW92ZVN0YXJ0KCk7XG5cbiAgICAvLyBSZWFkIHRoZSBQREYgZm9ybWF0IHZlcnNpb24uXG4gICAgY29uc3QgTUFYX1BERl9WRVJTSU9OX0xFTkdUSCA9IDEyO1xuICAgIGxldCB2ZXJzaW9uID0gXCJcIixcbiAgICAgIGNoO1xuICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSA+IC8qIFNwYWNlID0gKi8gMHgyMCkge1xuICAgICAgaWYgKHZlcnNpb24ubGVuZ3RoID49IE1BWF9QREZfVkVSU0lPTl9MRU5HVEgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2ZXJzaW9uICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3ZlcnNpb24pIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgXCIlUERGLVwiIHByZWZpeC5cbiAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uLnN1YnN0cmluZyg1KTtcbiAgICB9XG4gIH1cblxuICBwYXJzZVN0YXJ0WFJlZigpIHtcbiAgICB0aGlzLnhyZWYuc2V0U3RhcnRYUmVmKHRoaXMuc3RhcnRYUmVmKTtcbiAgfVxuXG4gIGdldCBudW1QYWdlcygpIHtcbiAgICBjb25zdCBsaW5lYXJpemF0aW9uID0gdGhpcy5saW5lYXJpemF0aW9uO1xuICAgIGNvbnN0IG51bSA9IGxpbmVhcml6YXRpb24gPyBsaW5lYXJpemF0aW9uLm51bVBhZ2VzIDogdGhpcy5jYXRhbG9nLm51bVBhZ2VzO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJudW1QYWdlc1wiLCBudW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMsIHJlY3Vyc2lvbkRlcHRoID0gMCkge1xuICAgIGNvbnN0IFJFQ1VSU0lPTl9MSU1JVCA9IDEwO1xuICAgIHJldHVybiBmaWVsZHMuZXZlcnkoZmllbGQgPT4ge1xuICAgICAgZmllbGQgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWVsZCk7XG4gICAgICBpZiAoZmllbGQuaGFzKFwiS2lkc1wiKSkge1xuICAgICAgICBpZiAoKytyZWN1cnNpb25EZXB0aCA+IFJFQ1VSU0lPTl9MSU1JVCkge1xuICAgICAgICAgIHdhcm4oXCJfaGFzT25seURvY3VtZW50U2lnbmF0dXJlczogbWF4aW11bSByZWN1cnNpb24gZGVwdGggcmVhY2hlZFwiKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoXG4gICAgICAgICAgZmllbGQuZ2V0KFwiS2lkc1wiKSxcbiAgICAgICAgICByZWN1cnNpb25EZXB0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSBpc05hbWUoZmllbGQuZ2V0KFwiRlRcIiksIFwiU2lnXCIpO1xuICAgICAgY29uc3QgcmVjdGFuZ2xlID0gZmllbGQuZ2V0KFwiUmVjdFwiKTtcbiAgICAgIGNvbnN0IGlzSW52aXNpYmxlID1cbiAgICAgICAgQXJyYXkuaXNBcnJheShyZWN0YW5nbGUpICYmIHJlY3RhbmdsZS5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSA9PT0gMCk7XG4gICAgICByZXR1cm4gaXNTaWduYXR1cmUgJiYgaXNJbnZpc2libGU7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgZm9ybUluZm8oKSB7XG4gICAgY29uc3QgZm9ybUluZm8gPSB7IGhhc0Fjcm9Gb3JtOiBmYWxzZSwgaGFzWGZhOiBmYWxzZSB9O1xuICAgIGNvbnN0IGFjcm9Gb3JtID0gdGhpcy5jYXRhbG9nLmFjcm9Gb3JtO1xuICAgIGlmICghYWNyb0Zvcm0pIHtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJmb3JtSW5mb1wiLCBmb3JtSW5mbyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRoZSBkb2N1bWVudCBjb250YWlucyBYRkEgZGF0YSBpZiB0aGUgYFhGQWAgZW50cnkgaXMgYSBub24tZW1wdHlcbiAgICAgIC8vIGFycmF5IG9yIHN0cmVhbS5cbiAgICAgIGNvbnN0IHhmYSA9IGFjcm9Gb3JtLmdldChcIlhGQVwiKTtcbiAgICAgIGNvbnN0IGhhc1hmYSA9XG4gICAgICAgIChBcnJheS5pc0FycmF5KHhmYSkgJiYgeGZhLmxlbmd0aCA+IDApIHx8XG4gICAgICAgIChpc1N0cmVhbSh4ZmEpICYmICF4ZmEuaXNFbXB0eSk7XG4gICAgICBmb3JtSW5mby5oYXNYZmEgPSBoYXNYZmE7XG5cbiAgICAgIC8vIFRoZSBkb2N1bWVudCBjb250YWlucyBBY3JvRm9ybSBkYXRhIGlmIHRoZSBgRmllbGRzYCBlbnRyeSBpcyBhXG4gICAgICAvLyBub24tZW1wdHkgYXJyYXkgYW5kIGl0IGRvZXNuJ3QgY29uc2lzdCBvZiBvbmx5IGRvY3VtZW50IHNpZ25hdHVyZXMuXG4gICAgICAvLyBUaGlzIHNlY29uZCBjaGVjayBpcyByZXF1aXJlZCBmb3IgZmlsZXMgdGhhdCBkb24ndCBhY3R1YWxseSBjb250YWluXG4gICAgICAvLyBBY3JvRm9ybSBkYXRhIChvbmx5IFhGQSBkYXRhKSwgYnV0IHRoYXQgdXNlIHRoZSBgRmllbGRzYCBlbnRyeSB0b1xuICAgICAgLy8gc3RvcmUgKGludmlzaWJsZSkgZG9jdW1lbnQgc2lnbmF0dXJlcy4gVGhpcyBjYW4gYmUgZGV0ZWN0ZWQgdXNpbmdcbiAgICAgIC8vIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGBTaWdGbGFnc2AgaW50ZWdlciAoc2VlIFRhYmxlIDIxOSBpbiB0aGVcbiAgICAgIC8vIHNwZWNpZmljYXRpb24pLlxuICAgICAgY29uc3QgZmllbGRzID0gYWNyb0Zvcm0uZ2V0KFwiRmllbGRzXCIpO1xuICAgICAgY29uc3QgaGFzRmllbGRzID0gQXJyYXkuaXNBcnJheShmaWVsZHMpICYmIGZpZWxkcy5sZW5ndGggPiAwO1xuICAgICAgY29uc3Qgc2lnRmxhZ3MgPSBhY3JvRm9ybS5nZXQoXCJTaWdGbGFnc1wiKTtcbiAgICAgIGNvbnN0IGhhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMgPVxuICAgICAgICAhIShzaWdGbGFncyAmIDB4MSkgJiYgdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMpO1xuICAgICAgZm9ybUluZm8uaGFzQWNyb0Zvcm0gPSBoYXNGaWVsZHMgJiYgIWhhc09ubHlEb2N1bWVudFNpZ25hdHVyZXM7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgaW5mbyhcIkNhbm5vdCBmZXRjaCBmb3JtIGluZm9ybWF0aW9uLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImZvcm1JbmZvXCIsIGZvcm1JbmZvKTtcbiAgfVxuXG4gIGdldCBkb2N1bWVudEluZm8oKSB7XG4gICAgY29uc3QgRG9jdW1lbnRJbmZvVmFsaWRhdG9ycyA9IHtcbiAgICAgIFRpdGxlOiBpc1N0cmluZyxcbiAgICAgIEF1dGhvcjogaXNTdHJpbmcsXG4gICAgICBTdWJqZWN0OiBpc1N0cmluZyxcbiAgICAgIEtleXdvcmRzOiBpc1N0cmluZyxcbiAgICAgIENyZWF0b3I6IGlzU3RyaW5nLFxuICAgICAgUHJvZHVjZXI6IGlzU3RyaW5nLFxuICAgICAgQ3JlYXRpb25EYXRlOiBpc1N0cmluZyxcbiAgICAgIE1vZERhdGU6IGlzU3RyaW5nLFxuICAgICAgVHJhcHBlZDogaXNOYW1lLFxuICAgIH07XG5cbiAgICBsZXQgdmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZlcnNpb24gIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICFQREZfSEVBREVSX1ZFUlNJT05fUkVHRVhQLnRlc3QodmVyc2lvbilcbiAgICApIHtcbiAgICAgIHdhcm4oYEludmFsaWQgUERGIGhlYWRlciB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9ufWApO1xuICAgICAgdmVyc2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jSW5mbyA9IHtcbiAgICAgIFBERkZvcm1hdFZlcnNpb246IHZlcnNpb24sXG4gICAgICBJc0xpbmVhcml6ZWQ6ICEhdGhpcy5saW5lYXJpemF0aW9uLFxuICAgICAgSXNBY3JvRm9ybVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0sXG4gICAgICBJc1hGQVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzWGZhLFxuICAgICAgSXNDb2xsZWN0aW9uUHJlc2VudDogISF0aGlzLmNhdGFsb2cuY29sbGVjdGlvbixcbiAgICB9O1xuXG4gICAgbGV0IGluZm9EaWN0O1xuICAgIHRyeSB7XG4gICAgICBpbmZvRGljdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldChcIkluZm9cIik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgaW5mbyhcIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0RpY3QoaW5mb0RpY3QpKSB7XG4gICAgICAvLyBGaWxsIHRoZSBkb2N1bWVudCBpbmZvIHdpdGggdmFsaWQgZW50cmllcyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLFxuICAgICAgLy8gYXMgd2VsbCBhcyBhbnkgZXhpc3Rpbmcgd2VsbC1mb3JtZWQgY3VzdG9tIGVudHJpZXMuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBpbmZvRGljdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpbmZvRGljdC5nZXQoa2V5KTtcblxuICAgICAgICBpZiAoRG9jdW1lbnRJbmZvVmFsaWRhdG9yc1trZXldKSB7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSAoc3RhbmRhcmQpIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgIGlmIChEb2N1bWVudEluZm9WYWxpZGF0b3JzW2tleV0odmFsdWUpKSB7XG4gICAgICAgICAgICBkb2NJbmZvW2tleV0gPVxuICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHN0cmluZ1RvUERGU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5mbyhgQmFkIHZhbHVlIGluIGRvY3VtZW50IGluZm8gZm9yIFwiJHtrZXl9XCIuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBGb3IgY3VzdG9tIHZhbHVlcywgb25seSBhY2NlcHQgd2hpdGUtbGlzdGVkIHR5cGVzIHRvIHByZXZlbnRcbiAgICAgICAgICAvLyBlcnJvcnMgdGhhdCB3b3VsZCBvY2N1ciB3aGVuIHRyeWluZyB0byBzZW5kIG5vbi1zZXJpYWxpemFibGVcbiAgICAgICAgICAvLyBvYmplY3RzIHRvIHRoZSBtYWluLXRocmVhZCAoZm9yIGV4YW1wbGUgYERpY3RgIG9yIGBTdHJlYW1gKS5cbiAgICAgICAgICBsZXQgY3VzdG9tVmFsdWU7XG4gICAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgY3VzdG9tVmFsdWUgPSBzdHJpbmdUb1BERlN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc05hbWUodmFsdWUpIHx8IGlzTnVtKHZhbHVlKSB8fCBpc0Jvb2wodmFsdWUpKSB7XG4gICAgICAgICAgICBjdXN0b21WYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmZvKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBkb2N1bWVudCBpbmZvIGZvciAoY3VzdG9tKSBcIiR7a2V5fVwiLmApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkb2NJbmZvLkN1c3RvbSkge1xuICAgICAgICAgICAgZG9jSW5mby5DdXN0b20gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb2NJbmZvLkN1c3RvbVtrZXldID0gY3VzdG9tVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImRvY3VtZW50SW5mb1wiLCBkb2NJbmZvKTtcbiAgfVxuXG4gIGdldCBmaW5nZXJwcmludCgpIHtcbiAgICBsZXQgaGFzaDtcbiAgICBjb25zdCBpZEFycmF5ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KFwiSURcIik7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheShpZEFycmF5KSAmJlxuICAgICAgaWRBcnJheVswXSAmJlxuICAgICAgaXNTdHJpbmcoaWRBcnJheVswXSkgJiZcbiAgICAgIGlkQXJyYXlbMF0gIT09IEVNUFRZX0ZJTkdFUlBSSU5UXG4gICAgKSB7XG4gICAgICBoYXNoID0gc3RyaW5nVG9CeXRlcyhpZEFycmF5WzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaCA9IGNhbGN1bGF0ZU1ENShcbiAgICAgICAgdGhpcy5zdHJlYW0uZ2V0Qnl0ZVJhbmdlKDAsIEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTKSxcbiAgICAgICAgMCxcbiAgICAgICAgRklOR0VSUFJJTlRfRklSU1RfQllURVNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZmluZ2VycHJpbnRCdWYgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoYXNoLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IGhleCA9IGhhc2hbaV0udG9TdHJpbmcoMTYpO1xuICAgICAgZmluZ2VycHJpbnRCdWYucHVzaChoZXgucGFkU3RhcnQoMiwgXCIwXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImZpbmdlcnByaW50XCIsIGZpbmdlcnByaW50QnVmLmpvaW4oXCJcIikpO1xuICB9XG5cbiAgX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCkge1xuICAgIGNvbnN0IHsgY2F0YWxvZywgbGluZWFyaXphdGlvbiB9ID0gdGhpcztcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGxpbmVhcml6YXRpb24gJiYgbGluZWFyaXphdGlvbi5wYWdlRmlyc3QgPT09IHBhZ2VJbmRleCxcbiAgICAgICAgXCJfZ2V0TGluZWFyaXphdGlvblBhZ2UgLSBpbnZhbGlkIHBhZ2VJbmRleCBhcmd1bWVudC5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBSZWYuZ2V0KGxpbmVhcml6YXRpb24ub2JqZWN0TnVtYmVyRmlyc3QsIDApO1xuICAgIHJldHVybiB0aGlzLnhyZWZcbiAgICAgIC5mZXRjaEFzeW5jKHJlZilcbiAgICAgIC50aGVuKG9iaiA9PiB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBvYmplY3QgdGhhdCB3YXMgZm91bmQgaXMgYWN0dWFsbHkgYSBQYWdlIGRpY3Rpb25hcnkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0RpY3Qob2JqLCBcIlBhZ2VcIikgfHxcbiAgICAgICAgICAoaXNEaWN0KG9iaikgJiYgIW9iai5oYXMoXCJUeXBlXCIpICYmIG9iai5oYXMoXCJDb250ZW50c1wiKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHJlZiAmJiAhY2F0YWxvZy5wYWdlS2lkc0NvdW50Q2FjaGUuaGFzKHJlZikpIHtcbiAgICAgICAgICAgIGNhdGFsb2cucGFnZUtpZHNDb3VudENhY2hlLnB1dChyZWYsIDEpOyAvLyBDYWNoZSB0aGUgUGFnZSByZWZlcmVuY2UuXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbb2JqLCByZWZdO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgICBcIlRoZSBMaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgZG9lc24ndCBwb2ludCBcIiArXG4gICAgICAgICAgICBcInRvIGEgdmFsaWQgUGFnZSBkaWN0aW9uYXJ5LlwiXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgIGluZm8ocmVhc29uKTtcbiAgICAgICAgcmV0dXJuIGNhdGFsb2cuZ2V0UGFnZURpY3QocGFnZUluZGV4KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0UGFnZShwYWdlSW5kZXgpIHtcbiAgICBpZiAodGhpcy5fcGFnZVByb21pc2VzW3BhZ2VJbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VQcm9taXNlc1twYWdlSW5kZXhdO1xuICAgIH1cbiAgICBjb25zdCB7IGNhdGFsb2csIGxpbmVhcml6YXRpb24gfSA9IHRoaXM7XG5cbiAgICBjb25zdCBwcm9taXNlID1cbiAgICAgIGxpbmVhcml6YXRpb24gJiYgbGluZWFyaXphdGlvbi5wYWdlRmlyc3QgPT09IHBhZ2VJbmRleFxuICAgICAgICA/IHRoaXMuX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleClcbiAgICAgICAgOiBjYXRhbG9nLmdldFBhZ2VEaWN0KHBhZ2VJbmRleCk7XG5cbiAgICByZXR1cm4gKHRoaXMuX3BhZ2VQcm9taXNlc1twYWdlSW5kZXhdID0gcHJvbWlzZS50aGVuKChbcGFnZURpY3QsIHJlZl0pID0+IHtcbiAgICAgIHJldHVybiBuZXcgUGFnZSh7XG4gICAgICAgIHBkZk1hbmFnZXI6IHRoaXMucGRmTWFuYWdlcixcbiAgICAgICAgeHJlZjogdGhpcy54cmVmLFxuICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgIHBhZ2VEaWN0LFxuICAgICAgICByZWYsXG4gICAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LFxuICAgICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLFxuICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsXG4gICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSxcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfVxuXG4gIGNoZWNrRmlyc3RQYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2UoMCkuY2F0Y2goYXN5bmMgcmVhc29uID0+IHtcbiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24pIHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSB2YXJpb3VzIGNhY2hlcyB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlbid0IHN0b3JlZCBhbnlcbiAgICAgICAgLy8gaW5jb25zaXN0ZW50IGFuZC9vciBpbmNvcnJlY3Qgc3RhdGUsIHNpbmNlIHRoYXQgY291bGQgZWFzaWx5IGJyZWFrXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgYHRoaXMuZ2V0UGFnZWAgY2FsbHMuXG4gICAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5sZW5ndGggPSAwO1xuICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXAoKTtcblxuICAgICAgICB0aHJvdyBuZXcgWFJlZlBhcnNlRXhjZXB0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmb250RmFsbGJhY2soaWQsIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nLmZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcik7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nXG4gICAgICA/IHRoaXMuY2F0YWxvZy5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKVxuICAgICAgOiBjbGVhclByaW1pdGl2ZUNhY2hlcygpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhZ2UsIFBERkRvY3VtZW50IH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBieXRlc1RvU3RyaW5nLFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCxcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIEludmFsaWRQREZFeGNlcHRpb24sXG4gIGlzQm9vbCxcbiAgaXNOdW0sXG4gIGlzU3RyaW5nLFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgc2hhZG93LFxuICBzdHJpbmdUb1BERlN0cmluZyxcbiAgc3RyaW5nVG9VVEY4U3RyaW5nLFxuICB1bnJlYWNoYWJsZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBjbGVhclByaW1pdGl2ZUNhY2hlcyxcbiAgQ21kLFxuICBEaWN0LFxuICBpc0NtZCxcbiAgaXNEaWN0LFxuICBpc05hbWUsXG4gIGlzUmVmLFxuICBpc1JlZnNFcXVhbCxcbiAgaXNTdHJlYW0sXG4gIFJlZixcbiAgUmVmU2V0LFxuICBSZWZTZXRDYWNoZSxcbn0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgTGV4ZXIsIFBhcnNlciB9IGZyb20gXCIuL3BhcnNlci5qc1wiO1xuaW1wb3J0IHtcbiAgTWlzc2luZ0RhdGFFeGNlcHRpb24sXG4gIHRvUm9tYW5OdW1lcmFscyxcbiAgWFJlZkVudHJ5RXhjZXB0aW9uLFxuICBYUmVmUGFyc2VFeGNlcHRpb24sXG59IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IENpcGhlclRyYW5zZm9ybUZhY3RvcnkgfSBmcm9tIFwiLi9jcnlwdG8uanNcIjtcbmltcG9ydCB7IENvbG9yU3BhY2UgfSBmcm9tIFwiLi9jb2xvcnNwYWNlLmpzXCI7XG5pbXBvcnQgeyBHbG9iYWxJbWFnZUNhY2hlIH0gZnJvbSBcIi4vaW1hZ2VfdXRpbHMuanNcIjtcblxuZnVuY3Rpb24gZmV0Y2hEZXN0aW5hdGlvbihkZXN0KSB7XG4gIHJldHVybiBpc0RpY3QoZGVzdCkgPyBkZXN0LmdldChcIkRcIikgOiBkZXN0O1xufVxuXG5jbGFzcyBDYXRhbG9nIHtcbiAgY29uc3RydWN0b3IocGRmTWFuYWdlciwgeHJlZikge1xuICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7XG4gICAgdGhpcy54cmVmID0geHJlZjtcblxuICAgIHRoaXMuX2NhdERpY3QgPSB4cmVmLmdldENhdGFsb2dPYmooKTtcbiAgICBpZiAoIWlzRGljdCh0aGlzLl9jYXREaWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiQ2F0YWxvZyBvYmplY3QgaXMgbm90IGEgZGljdGlvbmFyeS5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5mb250Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTtcbiAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gbmV3IEdsb2JhbEltYWdlQ2FjaGUoKTtcbiAgICB0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpO1xuICB9XG5cbiAgZ2V0IHZlcnNpb24oKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiVmVyc2lvblwiKTtcbiAgICBpZiAoIWlzTmFtZSh2ZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInZlcnNpb25cIiwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2ZXJzaW9uXCIsIHZlcnNpb24ubmFtZSk7XG4gIH1cblxuICBnZXQgY29sbGVjdGlvbigpIHtcbiAgICBsZXQgY29sbGVjdGlvbiA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiQ29sbGVjdGlvblwiKTtcbiAgICAgIGlmIChpc0RpY3Qob2JqKSAmJiBvYmouc2l6ZSA+IDApIHtcbiAgICAgICAgY29sbGVjdGlvbiA9IG9iajtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICBpbmZvKFwiQ2Fubm90IGZldGNoIENvbGxlY3Rpb24gZW50cnk7IGFzc3VtaW5nIG5vIGNvbGxlY3Rpb24gaXMgcHJlc2VudC5cIik7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJjb2xsZWN0aW9uXCIsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgZ2V0IGFjcm9Gb3JtKCkge1xuICAgIGxldCBhY3JvRm9ybSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiQWNyb0Zvcm1cIik7XG4gICAgICBpZiAoaXNEaWN0KG9iaikgJiYgb2JqLnNpemUgPiAwKSB7XG4gICAgICAgIGFjcm9Gb3JtID0gb2JqO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIGluZm8oXCJDYW5ub3QgZmV0Y2ggQWNyb0Zvcm0gZW50cnk7IGFzc3VtaW5nIG5vIGZvcm1zIGFyZSBwcmVzZW50LlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImFjcm9Gb3JtXCIsIGFjcm9Gb3JtKTtcbiAgfVxuXG4gIGdldCBtZXRhZGF0YSgpIHtcbiAgICBjb25zdCBzdHJlYW1SZWYgPSB0aGlzLl9jYXREaWN0LmdldFJhdyhcIk1ldGFkYXRhXCIpO1xuICAgIGlmICghaXNSZWYoc3RyZWFtUmVmKSkge1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIm1ldGFkYXRhXCIsIG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHN1cHByZXNzRW5jcnlwdGlvbiA9ICEoXG4gICAgICB0aGlzLnhyZWYuZW5jcnlwdCAmJiB0aGlzLnhyZWYuZW5jcnlwdC5lbmNyeXB0TWV0YWRhdGFcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMueHJlZi5mZXRjaChzdHJlYW1SZWYsIHN1cHByZXNzRW5jcnlwdGlvbik7XG4gICAgbGV0IG1ldGFkYXRhO1xuXG4gICAgaWYgKHN0cmVhbSAmJiBpc0RpY3Qoc3RyZWFtLmRpY3QpKSB7XG4gICAgICBjb25zdCB0eXBlID0gc3RyZWFtLmRpY3QuZ2V0KFwiVHlwZVwiKTtcbiAgICAgIGNvbnN0IHN1YnR5cGUgPSBzdHJlYW0uZGljdC5nZXQoXCJTdWJ0eXBlXCIpO1xuXG4gICAgICBpZiAoaXNOYW1lKHR5cGUsIFwiTWV0YWRhdGFcIikgJiYgaXNOYW1lKHN1YnR5cGUsIFwiWE1MXCIpKSB7XG4gICAgICAgIC8vIFhYWDogVGhpcyBzaG91bGQgZXhhbWluZSB0aGUgY2hhcnNldCB0aGUgWE1MIGRvY3VtZW50IGRlZmluZXMsXG4gICAgICAgIC8vIGhvd2V2ZXIgc2luY2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyByZWFsIG1lYW5zIHRvIGRlY29kZVxuICAgICAgICAvLyBhcmJpdHJhcnkgY2hhcnNldHMsIGxldCdzIGp1c3QgaG9wZSB0aGF0IHRoZSBhdXRob3Igb2YgdGhlIFBERlxuICAgICAgICAvLyB3YXMgcmVhc29uYWJsZSBlbm91Z2ggdG8gc3RpY2sgd2l0aCB0aGUgWE1MIGRlZmF1bHQgY2hhcnNldCxcbiAgICAgICAgLy8gd2hpY2ggaXMgVVRGLTguXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWV0YWRhdGEgPSBzdHJpbmdUb1VURjhTdHJpbmcoYnl0ZXNUb1N0cmluZyhzdHJlYW0uZ2V0Qnl0ZXMoKSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5mbyhcIlNraXBwaW5nIGludmFsaWQgbWV0YWRhdGEuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gIH1cblxuICBnZXQgdG9wbGV2ZWxQYWdlc0RpY3QoKSB7XG4gICAgY29uc3QgcGFnZXNPYmogPSB0aGlzLl9jYXREaWN0LmdldChcIlBhZ2VzXCIpO1xuICAgIGlmICghaXNEaWN0KHBhZ2VzT2JqKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeS5cIik7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ0b3BsZXZlbFBhZ2VzRGljdFwiLCBwYWdlc09iaik7XG4gIH1cblxuICBnZXQgZG9jdW1lbnRPdXRsaW5lKCkge1xuICAgIGxldCBvYmogPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBvYmogPSB0aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgd2FybihcIlVuYWJsZSB0byByZWFkIGRvY3VtZW50IG91dGxpbmUuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiZG9jdW1lbnRPdXRsaW5lXCIsIG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZWFkRG9jdW1lbnRPdXRsaW5lKCkge1xuICAgIGxldCBvYmogPSB0aGlzLl9jYXREaWN0LmdldChcIk91dGxpbmVzXCIpO1xuICAgIGlmICghaXNEaWN0KG9iaikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBvYmogPSBvYmouZ2V0UmF3KFwiRmlyc3RcIik7XG4gICAgaWYgKCFpc1JlZihvYmopKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByb290ID0geyBpdGVtczogW10gfTtcbiAgICBjb25zdCBxdWV1ZSA9IFt7IG9iaiwgcGFyZW50OiByb290IH1dO1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiwga2VlcCB0cmFjayBvZiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgaXRlbXMuXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldCgpO1xuICAgIHByb2Nlc3NlZC5wdXQob2JqKTtcbiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmLFxuICAgICAgYmxhY2tDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGNvbnN0IG91dGxpbmVEaWN0ID0geHJlZi5mZXRjaElmUmVmKGkub2JqKTtcbiAgICAgIGlmIChvdXRsaW5lRGljdCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghb3V0bGluZURpY3QuaGFzKFwiVGl0bGVcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0geyB1cmw6IG51bGwsIGRlc3Q6IG51bGwgfTtcbiAgICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7XG4gICAgICAgIGRlc3REaWN0OiBvdXRsaW5lRGljdCxcbiAgICAgICAgcmVzdWx0T2JqOiBkYXRhLFxuICAgICAgICBkb2NCYXNlVXJsOiB0aGlzLnBkZk1hbmFnZXIuZG9jQmFzZVVybCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdGl0bGUgPSBvdXRsaW5lRGljdC5nZXQoXCJUaXRsZVwiKTtcbiAgICAgIGNvbnN0IGZsYWdzID0gb3V0bGluZURpY3QuZ2V0KFwiRlwiKSB8fCAwO1xuICAgICAgY29uc3QgY29sb3IgPSBvdXRsaW5lRGljdC5nZXRBcnJheShcIkNcIik7XG4gICAgICBjb25zdCBjb3VudCA9IG91dGxpbmVEaWN0LmdldChcIkNvdW50XCIpO1xuICAgICAgbGV0IHJnYkNvbG9yID0gYmxhY2tDb2xvcjtcblxuICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHBhcnNlIHRoZSBjb2xvciB3aGVuIGl0J3MgdmFsaWQsIGFuZCBub24tZGVmYXVsdC5cbiAgICAgIGlmIChcbiAgICAgICAgQXJyYXkuaXNBcnJheShjb2xvcikgJiZcbiAgICAgICAgY29sb3IubGVuZ3RoID09PSAzICYmXG4gICAgICAgIChjb2xvclswXSAhPT0gMCB8fCBjb2xvclsxXSAhPT0gMCB8fCBjb2xvclsyXSAhPT0gMClcbiAgICAgICkge1xuICAgICAgICByZ2JDb2xvciA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKGNvbG9yLCAwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3V0bGluZUl0ZW0gPSB7XG4gICAgICAgIGRlc3Q6IGRhdGEuZGVzdCxcbiAgICAgICAgdXJsOiBkYXRhLnVybCxcbiAgICAgICAgdW5zYWZlVXJsOiBkYXRhLnVuc2FmZVVybCxcbiAgICAgICAgbmV3V2luZG93OiBkYXRhLm5ld1dpbmRvdyxcbiAgICAgICAgdGl0bGU6IHN0cmluZ1RvUERGU3RyaW5nKHRpdGxlKSxcbiAgICAgICAgY29sb3I6IHJnYkNvbG9yLFxuICAgICAgICBjb3VudDogTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgPyBjb3VudCA6IHVuZGVmaW5lZCxcbiAgICAgICAgYm9sZDogISEoZmxhZ3MgJiAyKSxcbiAgICAgICAgaXRhbGljOiAhIShmbGFncyAmIDEpLFxuICAgICAgICBpdGVtczogW10sXG4gICAgICB9O1xuXG4gICAgICBpLnBhcmVudC5pdGVtcy5wdXNoKG91dGxpbmVJdGVtKTtcbiAgICAgIG9iaiA9IG91dGxpbmVEaWN0LmdldFJhdyhcIkZpcnN0XCIpO1xuICAgICAgaWYgKGlzUmVmKG9iaikgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkge1xuICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqLCBwYXJlbnQ6IG91dGxpbmVJdGVtIH0pO1xuICAgICAgICBwcm9jZXNzZWQucHV0KG9iaik7XG4gICAgICB9XG4gICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoXCJOZXh0XCIpO1xuICAgICAgaWYgKGlzUmVmKG9iaikgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkge1xuICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqLCBwYXJlbnQ6IGkucGFyZW50IH0pO1xuICAgICAgICBwcm9jZXNzZWQucHV0KG9iaik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290Lml0ZW1zLmxlbmd0aCA+IDAgPyByb290Lml0ZW1zIDogbnVsbDtcbiAgfVxuXG4gIGdldCBwZXJtaXNzaW9ucygpIHtcbiAgICBsZXQgcGVybWlzc2lvbnMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBwZXJtaXNzaW9ucyA9IHRoaXMuX3JlYWRQZXJtaXNzaW9ucygpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIHdhcm4oXCJVbmFibGUgdG8gcmVhZCBwZXJtaXNzaW9ucy5cIik7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJwZXJtaXNzaW9uc1wiLCBwZXJtaXNzaW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZWFkUGVybWlzc2lvbnMoKSB7XG4gICAgY29uc3QgZW5jcnlwdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldChcIkVuY3J5cHRcIik7XG4gICAgaWYgKCFpc0RpY3QoZW5jcnlwdCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBmbGFncyA9IGVuY3J5cHQuZ2V0KFwiUFwiKTtcbiAgICBpZiAoIWlzTnVtKGZsYWdzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gUERGIGludGVnZXIgb2JqZWN0cyBhcmUgcmVwcmVzZW50ZWQgaW50ZXJuYWxseSBpbiBzaWduZWQgMidzIGNvbXBsZW1lbnRcbiAgICAvLyBmb3JtLiBUaGVyZWZvcmUsIGNvbnZlcnQgdGhlIHNpZ25lZCBkZWNpbWFsIGludGVnZXIgdG8gYSBzaWduZWQgMidzXG4gICAgLy8gY29tcGxlbWVudCBiaW5hcnkgaW50ZWdlciBzbyB3ZSBjYW4gdXNlIHJlZ3VsYXIgYml0d2lzZSBvcGVyYXRpb25zIG9uIGl0LlxuICAgIGZsYWdzICs9IDIgKiogMzI7XG5cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIFBlcm1pc3Npb25GbGFnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IFBlcm1pc3Npb25GbGFnW2tleV07XG4gICAgICBpZiAoZmxhZ3MgJiB2YWx1ZSkge1xuICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG5cbiAgZ2V0IG9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICBsZXQgY29uZmlnID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiT0NQcm9wZXJ0aWVzXCIpO1xuICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJvcHRpb25hbENvbnRlbnRDb25maWdcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gcHJvcGVydGllcy5nZXQoXCJEXCIpO1xuICAgICAgaWYgKCFkZWZhdWx0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJvcHRpb25hbENvbnRlbnRDb25maWdcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cHNEYXRhID0gcHJvcGVydGllcy5nZXQoXCJPQ0dzXCIpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdyb3Vwc0RhdGEpKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJvcHRpb25hbENvbnRlbnRDb25maWdcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cHMgPSBbXTtcbiAgICAgIGNvbnN0IGdyb3VwUmVmcyA9IFtdO1xuICAgICAgLy8gRW5zdXJlIGFsbCB0aGUgb3B0aW9uYWwgY29udGVudCBncm91cHMgYXJlIHZhbGlkLlxuICAgICAgZm9yIChjb25zdCBncm91cFJlZiBvZiBncm91cHNEYXRhKSB7XG4gICAgICAgIGlmICghaXNSZWYoZ3JvdXBSZWYpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBSZWZzLnB1c2goZ3JvdXBSZWYpO1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGdyb3VwUmVmKTtcbiAgICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICAgIGlkOiBncm91cFJlZi50b1N0cmluZygpLFxuICAgICAgICAgIG5hbWU6IGlzU3RyaW5nKGdyb3VwLmdldChcIk5hbWVcIikpXG4gICAgICAgICAgICA/IHN0cmluZ1RvUERGU3RyaW5nKGdyb3VwLmdldChcIk5hbWVcIikpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgaW50ZW50OiBpc1N0cmluZyhncm91cC5nZXQoXCJJbnRlbnRcIikpXG4gICAgICAgICAgICA/IHN0cmluZ1RvUERGU3RyaW5nKGdyb3VwLmdldChcIkludGVudFwiKSlcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25maWcgPSB0aGlzLl9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKGRlZmF1bHRDb25maWcsIGdyb3VwUmVmcyk7XG4gICAgICBjb25maWcuZ3JvdXBzID0gZ3JvdXBzO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIHdhcm4oYFVuYWJsZSB0byByZWFkIG9wdGlvbmFsIGNvbnRlbnQgY29uZmlnOiAke2V4fWApO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwib3B0aW9uYWxDb250ZW50Q29uZmlnXCIsIGNvbmZpZyk7XG4gIH1cblxuICBfcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhjb25maWcsIGNvbnRlbnRHcm91cFJlZnMpIHtcbiAgICBmdW5jdGlvbiBwYXJzZU9uT2ZmKHJlZnMpIHtcbiAgICAgIGNvbnN0IG9uUGFyc2VkID0gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlZnMpIHtcbiAgICAgICAgICBpZiAoIWlzUmVmKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb250ZW50R3JvdXBSZWZzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgb25QYXJzZWQucHVzaCh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvblBhcnNlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU9yZGVyKHJlZnMsIG5lc3RlZExldmVscyA9IDApIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWZzKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yZGVyID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVmcykge1xuICAgICAgICBpZiAoaXNSZWYodmFsdWUpICYmIGNvbnRlbnRHcm91cFJlZnMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgcGFyc2VkT3JkZXJSZWZzLnB1dCh2YWx1ZSk7IC8vIEhhbmRsZSBcImhpZGRlblwiIGdyb3Vwcywgc2VlIGJlbG93LlxuXG4gICAgICAgICAgb3JkZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIC9PcmRlciBhcnJheXMgKHNlZSBlLmcuIGlzc3VlIDk0NjIgYW5kIGJ1ZyAxMjQwNjQxKS5cbiAgICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU5lc3RlZE9yZGVyKHZhbHVlLCBuZXN0ZWRMZXZlbHMpO1xuICAgICAgICBpZiAobmVzdGVkT3JkZXIpIHtcbiAgICAgICAgICBvcmRlci5wdXNoKG5lc3RlZE9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkTGV2ZWxzID4gMCkge1xuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgICB9XG4gICAgICBjb25zdCBoaWRkZW5Hcm91cHMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXBSZWYgb2YgY29udGVudEdyb3VwUmVmcykge1xuICAgICAgICBpZiAocGFyc2VkT3JkZXJSZWZzLmhhcyhncm91cFJlZikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBoaWRkZW5Hcm91cHMucHVzaChncm91cFJlZi50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICAgIGlmIChoaWRkZW5Hcm91cHMubGVuZ3RoKSB7XG4gICAgICAgIG9yZGVyLnB1c2goeyBuYW1lOiBudWxsLCBvcmRlcjogaGlkZGVuR3JvdXBzIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JkZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VOZXN0ZWRPcmRlcihyZWYsIG5lc3RlZExldmVscykge1xuICAgICAgaWYgKCsrbmVzdGVkTGV2ZWxzID4gTUFYX05FU1RFRF9MRVZFTFMpIHtcbiAgICAgICAgd2FybihcInBhcnNlTmVzdGVkT3JkZXIgLSByZWFjaGVkIE1BWF9ORVNURURfTEVWRUxTLlwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHhyZWYuZmV0Y2hJZlJlZihyZWYpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5lc3RlZE5hbWUgPSB4cmVmLmZldGNoSWZSZWYodmFsdWVbMF0pO1xuICAgICAgaWYgKHR5cGVvZiBuZXN0ZWROYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU9yZGVyKHZhbHVlLnNsaWNlKDEpLCBuZXN0ZWRMZXZlbHMpO1xuICAgICAgaWYgKCFuZXN0ZWRPcmRlciB8fCAhbmVzdGVkT3JkZXIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbmFtZTogc3RyaW5nVG9QREZTdHJpbmcobmVzdGVkTmFtZSksIG9yZGVyOiBuZXN0ZWRPcmRlciB9O1xuICAgIH1cblxuICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWYsXG4gICAgICBwYXJzZWRPcmRlclJlZnMgPSBuZXcgUmVmU2V0KCksXG4gICAgICBNQVhfTkVTVEVEX0xFVkVMUyA9IDEwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGlzU3RyaW5nKGNvbmZpZy5nZXQoXCJOYW1lXCIpKVxuICAgICAgICA/IHN0cmluZ1RvUERGU3RyaW5nKGNvbmZpZy5nZXQoXCJOYW1lXCIpKVxuICAgICAgICA6IG51bGwsXG4gICAgICBjcmVhdG9yOiBpc1N0cmluZyhjb25maWcuZ2V0KFwiQ3JlYXRvclwiKSlcbiAgICAgICAgPyBzdHJpbmdUb1BERlN0cmluZyhjb25maWcuZ2V0KFwiQ3JlYXRvclwiKSlcbiAgICAgICAgOiBudWxsLFxuICAgICAgYmFzZVN0YXRlOiBpc05hbWUoY29uZmlnLmdldChcIkJhc2VTdGF0ZVwiKSlcbiAgICAgICAgPyBjb25maWcuZ2V0KFwiQmFzZVN0YXRlXCIpLm5hbWVcbiAgICAgICAgOiBudWxsLFxuICAgICAgb246IHBhcnNlT25PZmYoY29uZmlnLmdldChcIk9OXCIpKSxcbiAgICAgIG9mZjogcGFyc2VPbk9mZihjb25maWcuZ2V0KFwiT0ZGXCIpKSxcbiAgICAgIG9yZGVyOiBwYXJzZU9yZGVyKGNvbmZpZy5nZXQoXCJPcmRlclwiKSksXG4gICAgICBncm91cHM6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGdldCBudW1QYWdlcygpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldChcIkNvdW50XCIpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgIFwiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIm51bVBhZ2VzXCIsIG9iaik7XG4gIH1cblxuICBnZXQgZGVzdGluYXRpb25zKCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX3JlYWREZXN0cygpLFxuICAgICAgZGVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lVHJlZSkge1xuICAgICAgY29uc3QgbmFtZXMgPSBvYmouZ2V0QWxsKCk7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbmFtZXMpIHtcbiAgICAgICAgZGVzdHNbbmFtZV0gPSBmZXRjaERlc3RpbmF0aW9uKG5hbWVzW25hbWVdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QpIHtcbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGRlc3RzW2tleV0gPSBmZXRjaERlc3RpbmF0aW9uKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJkZXN0aW5hdGlvbnNcIiwgZGVzdHMpO1xuICB9XG5cbiAgZ2V0RGVzdGluYXRpb24oZGVzdGluYXRpb25JZCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX3JlYWREZXN0cygpO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lVHJlZSB8fCBvYmogaW5zdGFuY2VvZiBEaWN0KSB7XG4gICAgICByZXR1cm4gZmV0Y2hEZXN0aW5hdGlvbihvYmouZ2V0KGRlc3RpbmF0aW9uSWQpIHx8IG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlYWREZXN0cygpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldChcIk5hbWVzXCIpO1xuICAgIGlmIChvYmogJiYgb2JqLmhhcyhcIkRlc3RzXCIpKSB7XG4gICAgICByZXR1cm4gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoXCJEZXN0c1wiKSwgdGhpcy54cmVmKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2NhdERpY3QuaGFzKFwiRGVzdHNcIikpIHtcbiAgICAgIC8vIFNpbXBsZSBkZXN0aW5hdGlvbiBkaWN0aW9uYXJ5LlxuICAgICAgcmV0dXJuIHRoaXMuX2NhdERpY3QuZ2V0KFwiRGVzdHNcIik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgcGFnZUxhYmVscygpIHtcbiAgICBsZXQgb2JqID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgb2JqID0gdGhpcy5fcmVhZFBhZ2VMYWJlbHMoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICB3YXJuKFwiVW5hYmxlIHRvIHJlYWQgcGFnZSBsYWJlbHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicGFnZUxhYmVsc1wiLCBvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVhZFBhZ2VMYWJlbHMoKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoXCJQYWdlTGFiZWxzXCIpO1xuICAgIGlmICghb2JqKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlTGFiZWxzID0gbmV3IEFycmF5KHRoaXMubnVtUGFnZXMpO1xuICAgIGxldCBzdHlsZSA9IG51bGwsXG4gICAgICBwcmVmaXggPSBcIlwiO1xuXG4gICAgY29uc3QgbnVtYmVyVHJlZSA9IG5ldyBOdW1iZXJUcmVlKG9iaiwgdGhpcy54cmVmKTtcbiAgICBjb25zdCBudW1zID0gbnVtYmVyVHJlZS5nZXRBbGwoKTtcbiAgICBsZXQgY3VycmVudExhYmVsID0gXCJcIixcbiAgICAgIGN1cnJlbnRJbmRleCA9IDE7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLm51bVBhZ2VzOyBpIDwgaWk7IGkrKykge1xuICAgICAgaWYgKGkgaW4gbnVtcykge1xuICAgICAgICBjb25zdCBsYWJlbERpY3QgPSBudW1zW2ldO1xuICAgICAgICBpZiAoIWlzRGljdChsYWJlbERpY3QpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiUGFnZUxhYmVsIGlzIG5vdCBhIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhYmVsRGljdC5oYXMoXCJUeXBlXCIpICYmXG4gICAgICAgICAgIWlzTmFtZShsYWJlbERpY3QuZ2V0KFwiVHlwZVwiKSwgXCJQYWdlTGFiZWxcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCB0eXBlIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYWJlbERpY3QuaGFzKFwiU1wiKSkge1xuICAgICAgICAgIGNvbnN0IHMgPSBsYWJlbERpY3QuZ2V0KFwiU1wiKTtcbiAgICAgICAgICBpZiAoIWlzTmFtZShzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBzdHlsZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0eWxlID0gcy5uYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0eWxlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYWJlbERpY3QuaGFzKFwiUFwiKSkge1xuICAgICAgICAgIGNvbnN0IHAgPSBsYWJlbERpY3QuZ2V0KFwiUFwiKTtcbiAgICAgICAgICBpZiAoIWlzU3RyaW5nKHApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByZWZpeCA9IHN0cmluZ1RvUERGU3RyaW5nKHApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZWZpeCA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFiZWxEaWN0LmhhcyhcIlN0XCIpKSB7XG4gICAgICAgICAgY29uc3Qgc3QgPSBsYWJlbERpY3QuZ2V0KFwiU3RcIik7XG4gICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihzdCkgJiYgc3QgPj0gMSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkludmFsaWQgc3RhcnQgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50SW5kZXggPSBzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50SW5kZXggPSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgICAgY2FzZSBcIkRcIjpcbiAgICAgICAgICBjdXJyZW50TGFiZWwgPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJSXCI6XG4gICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgY3VycmVudExhYmVsID0gdG9Sb21hbk51bWVyYWxzKGN1cnJlbnRJbmRleCwgc3R5bGUgPT09IFwiclwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFcIjpcbiAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICBjb25zdCBMSU1JVCA9IDI2OyAvLyBVc2Ugb25seSB0aGUgY2hhcmFjdGVycyBBLVosIG9yIGEtei5cbiAgICAgICAgICBjb25zdCBBX1VQUEVSX0NBU0UgPSAweDQxLFxuICAgICAgICAgICAgQV9MT1dFUl9DQVNFID0gMHg2MTtcblxuICAgICAgICAgIGNvbnN0IGJhc2VDaGFyQ29kZSA9IHN0eWxlID09PSBcImFcIiA/IEFfTE9XRVJfQ0FTRSA6IEFfVVBQRVJfQ0FTRTtcbiAgICAgICAgICBjb25zdCBsZXR0ZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgICAgY29uc3QgY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgIGJhc2VDaGFyQ29kZSArIChsZXR0ZXJJbmRleCAlIExJTUlUKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2hhckJ1ZiA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IChsZXR0ZXJJbmRleCAvIExJTUlUKSB8IDA7IGogPD0gamo7IGorKykge1xuICAgICAgICAgICAgY2hhckJ1Zi5wdXNoKGNoYXJhY3Rlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IGNoYXJCdWYuam9pbihcIlwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgc3R5bGUgXCIke3N0eWxlfVwiIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHBhZ2VMYWJlbHNbaV0gPSBwcmVmaXggKyBjdXJyZW50TGFiZWw7XG4gICAgICBjdXJyZW50SW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIHBhZ2VMYWJlbHM7XG4gIH1cblxuICBnZXQgcGFnZUxheW91dCgpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldChcIlBhZ2VMYXlvdXRcIik7XG4gICAgLy8gUHVycG9zZWx5IHVzZSBhIG5vbi1zdGFuZGFyZCBkZWZhdWx0IHZhbHVlLCByYXRoZXIgdGhhbiAnU2luZ2xlUGFnZScsIHRvXG4gICAgLy8gYWxsb3cgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gYHVuZGVmaW5lZGAgYW5kIC9TaW5nbGVQYWdlIHNpbmNlIHRoYXQgZG9lc1xuICAgIC8vIGFmZmVjdCB0aGUgU2Nyb2xsIG1vZGUgKGNvbnRpbnVvdXMvbm9uLWNvbnRpbnVvdXMpIHVzZWQgaW4gQWRvYmUgUmVhZGVyLlxuICAgIGxldCBwYWdlTGF5b3V0ID0gXCJcIjtcblxuICAgIGlmIChpc05hbWUob2JqKSkge1xuICAgICAgc3dpdGNoIChvYmoubmFtZSkge1xuICAgICAgICBjYXNlIFwiU2luZ2xlUGFnZVwiOlxuICAgICAgICBjYXNlIFwiT25lQ29sdW1uXCI6XG4gICAgICAgIGNhc2UgXCJUd29Db2x1bW5MZWZ0XCI6XG4gICAgICAgIGNhc2UgXCJUd29Db2x1bW5SaWdodFwiOlxuICAgICAgICBjYXNlIFwiVHdvUGFnZUxlZnRcIjpcbiAgICAgICAgY2FzZSBcIlR3b1BhZ2VSaWdodFwiOlxuICAgICAgICAgIHBhZ2VMYXlvdXQgPSBvYmoubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInBhZ2VMYXlvdXRcIiwgcGFnZUxheW91dCk7XG4gIH1cblxuICBnZXQgcGFnZU1vZGUoKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoXCJQYWdlTW9kZVwiKTtcbiAgICBsZXQgcGFnZU1vZGUgPSBcIlVzZU5vbmVcIjsgLy8gRGVmYXVsdCB2YWx1ZS5cblxuICAgIGlmIChpc05hbWUob2JqKSkge1xuICAgICAgc3dpdGNoIChvYmoubmFtZSkge1xuICAgICAgICBjYXNlIFwiVXNlTm9uZVwiOlxuICAgICAgICBjYXNlIFwiVXNlT3V0bGluZXNcIjpcbiAgICAgICAgY2FzZSBcIlVzZVRodW1ic1wiOlxuICAgICAgICBjYXNlIFwiRnVsbFNjcmVlblwiOlxuICAgICAgICBjYXNlIFwiVXNlT0NcIjpcbiAgICAgICAgY2FzZSBcIlVzZUF0dGFjaG1lbnRzXCI6XG4gICAgICAgICAgcGFnZU1vZGUgPSBvYmoubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInBhZ2VNb2RlXCIsIHBhZ2VNb2RlKTtcbiAgfVxuXG4gIGdldCB2aWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICBjb25zdCBWaWV3ZXJQcmVmZXJlbmNlc1ZhbGlkYXRvcnMgPSB7XG4gICAgICBIaWRlVG9vbGJhcjogaXNCb29sLFxuICAgICAgSGlkZU1lbnViYXI6IGlzQm9vbCxcbiAgICAgIEhpZGVXaW5kb3dVSTogaXNCb29sLFxuICAgICAgRml0V2luZG93OiBpc0Jvb2wsXG4gICAgICBDZW50ZXJXaW5kb3c6IGlzQm9vbCxcbiAgICAgIERpc3BsYXlEb2NUaXRsZTogaXNCb29sLFxuICAgICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlOiBpc05hbWUsXG4gICAgICBEaXJlY3Rpb246IGlzTmFtZSxcbiAgICAgIFZpZXdBcmVhOiBpc05hbWUsXG4gICAgICBWaWV3Q2xpcDogaXNOYW1lLFxuICAgICAgUHJpbnRBcmVhOiBpc05hbWUsXG4gICAgICBQcmludENsaXA6IGlzTmFtZSxcbiAgICAgIFByaW50U2NhbGluZzogaXNOYW1lLFxuICAgICAgRHVwbGV4OiBpc05hbWUsXG4gICAgICBQaWNrVHJheUJ5UERGU2l6ZTogaXNCb29sLFxuICAgICAgUHJpbnRQYWdlUmFuZ2U6IEFycmF5LmlzQXJyYXksXG4gICAgICBOdW1Db3BpZXM6IE51bWJlci5pc0ludGVnZXIsXG4gICAgfTtcblxuICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiVmlld2VyUHJlZmVyZW5jZXNcIik7XG4gICAgbGV0IHByZWZzID0gbnVsbDtcblxuICAgIGlmIChpc0RpY3Qob2JqKSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gVmlld2VyUHJlZmVyZW5jZXNWYWxpZGF0b3JzKSB7XG4gICAgICAgIGlmICghb2JqLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmouZ2V0KGtleSk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgKHN0YW5kYXJkKSB2YWx1ZSBjb25mb3JtcyB0byB0aGUgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgaWYgKCFWaWV3ZXJQcmVmZXJlbmNlc1ZhbGlkYXRvcnNba2V5XSh2YWx1ZSkpIHtcbiAgICAgICAgICBpbmZvKGBCYWQgdmFsdWUgaW4gVmlld2VyUHJlZmVyZW5jZXMgZm9yIFwiJHtrZXl9XCIuYCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZWYWx1ZTtcblxuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgIGNhc2UgXCJOb25GdWxsU2NyZWVuUGFnZU1vZGVcIjpcbiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiVXNlTm9uZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVXNlT3V0bGluZXNcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlVzZVRodW1ic1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiVXNlT0NcIjpcbiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IFwiVXNlTm9uZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkRpcmVjdGlvblwiOlxuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJMMlJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlIyTFwiOlxuICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gXCJMMlJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJWaWV3QXJlYVwiOlxuICAgICAgICAgIGNhc2UgXCJWaWV3Q2xpcFwiOlxuICAgICAgICAgIGNhc2UgXCJQcmludEFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwiUHJpbnRDbGlwXCI6XG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIk1lZGlhQm94XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJDcm9wQm94XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJCbGVlZEJveFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVHJpbUJveFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQXJ0Qm94XCI6XG4gICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSBcIkNyb3BCb3hcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJQcmludFNjYWxpbmdcIjpcbiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiTm9uZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQXBwRGVmYXVsdFwiOlxuICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gXCJBcHBEZWZhdWx0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiRHVwbGV4XCI6XG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIlNpbXBsZXhcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkR1cGxleEZsaXBTaG9ydEVkZ2VcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkR1cGxleEZsaXBMb25nRWRnZVwiOlxuICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gXCJOb25lXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiUHJpbnRQYWdlUmFuZ2VcIjpcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgbXVzdCBiZSBldmVuLlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZS5ldmVyeSgocGFnZSwgaSwgYXJyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJlxuICAgICAgICAgICAgICAgIHBhZ2UgPiAwICYmXG4gICAgICAgICAgICAgICAgKGkgPT09IDAgfHwgcGFnZSA+PSBhcnJbaSAtIDFdKSAmJlxuICAgICAgICAgICAgICAgIHBhZ2UgPD0gdGhpcy5udW1QYWdlc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJOdW1Db3BpZXNcIjpcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgICAgIGB2aWV3ZXJQcmVmZXJlbmNlcyAtIGV4cGVjdGVkIGEgYm9vbGVhbiB2YWx1ZSBmb3I6ICR7a2V5fWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZWZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKCFwcmVmcykge1xuICAgICAgICAgICAgcHJlZnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmVmc1trZXldID0gcHJlZlZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluZm8oYEJhZCB2YWx1ZSBpbiBWaWV3ZXJQcmVmZXJlbmNlcyBmb3IgXCIke2tleX1cIi5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidmlld2VyUHJlZmVyZW5jZXNcIiwgcHJlZnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5PVEU6IFwiSmF2YVNjcmlwdFwiIGFjdGlvbnMgYXJlLCBmb3Igbm93LCBoYW5kbGVkIGJ5IGBnZXQgamF2YVNjcmlwdGAgYmVsb3cuXG4gICAqL1xuICBnZXQgb3BlbkFjdGlvbigpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldChcIk9wZW5BY3Rpb25cIik7XG4gICAgbGV0IG9wZW5BY3Rpb24gPSBudWxsO1xuXG4gICAgaWYgKGlzRGljdChvYmopKSB7XG4gICAgICAvLyBDb252ZXJ0IHRoZSBPcGVuQWN0aW9uIGRpY3Rpb25hcnkgaW50byBhIGZvcm1hdCB0aGF0IHdvcmtzIHdpdGhcbiAgICAgIC8vIGBwYXJzZURlc3REaWN0aW9uYXJ5YCwgdG8gYXZvaWQgaGF2aW5nIHRvIHJlLWltcGxlbWVudCB0aG9zZSBjaGVja3MuXG4gICAgICBjb25zdCBkZXN0RGljdCA9IG5ldyBEaWN0KHRoaXMueHJlZik7XG4gICAgICBkZXN0RGljdC5zZXQoXCJBXCIsIG9iaik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IHsgdXJsOiBudWxsLCBkZXN0OiBudWxsLCBhY3Rpb246IG51bGwgfTtcbiAgICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7IGRlc3REaWN0LCByZXN1bHRPYmogfSk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdE9iai5kZXN0KSkge1xuICAgICAgICBpZiAoIW9wZW5BY3Rpb24pIHtcbiAgICAgICAgICBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuQWN0aW9uLmRlc3QgPSByZXN1bHRPYmouZGVzdDtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqLmFjdGlvbikge1xuICAgICAgICBpZiAoIW9wZW5BY3Rpb24pIHtcbiAgICAgICAgICBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuQWN0aW9uLmFjdGlvbiA9IHJlc3VsdE9iai5hY3Rpb247XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIGlmICghb3BlbkFjdGlvbikge1xuICAgICAgICBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIG9wZW5BY3Rpb24uZGVzdCA9IG9iajtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIm9wZW5BY3Rpb25cIiwgb3BlbkFjdGlvbik7XG4gIH1cblxuICBnZXQgYXR0YWNobWVudHMoKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoXCJOYW1lc1wiKTtcbiAgICBsZXQgYXR0YWNobWVudHMgPSBudWxsO1xuXG4gICAgaWYgKG9iaiAmJiBvYmouaGFzKFwiRW1iZWRkZWRGaWxlc1wiKSkge1xuICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdyhcIkVtYmVkZGVkRmlsZXNcIiksIHRoaXMueHJlZik7XG4gICAgICBjb25zdCBuYW1lcyA9IG5hbWVUcmVlLmdldEFsbCgpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIG5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTcGVjKG5hbWVzW25hbWVdLCB0aGlzLnhyZWYpO1xuICAgICAgICBpZiAoIWF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgYXR0YWNobWVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGF0dGFjaG1lbnRzW3N0cmluZ1RvUERGU3RyaW5nKG5hbWUpXSA9IGZzLnNlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImF0dGFjaG1lbnRzXCIsIGF0dGFjaG1lbnRzKTtcbiAgfVxuXG4gIGdldCBqYXZhU2NyaXB0KCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiTmFtZXNcIik7XG5cbiAgICBsZXQgamF2YVNjcmlwdCA9IG51bGw7XG4gICAgZnVuY3Rpb24gYXBwZW5kSWZKYXZhU2NyaXB0RGljdChqc0RpY3QpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBqc0RpY3QuZ2V0KFwiU1wiKTtcbiAgICAgIGlmICghaXNOYW1lKHR5cGUsIFwiSmF2YVNjcmlwdFwiKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBqcyA9IGpzRGljdC5nZXQoXCJKU1wiKTtcbiAgICAgIGlmIChpc1N0cmVhbShqcykpIHtcbiAgICAgICAganMgPSBieXRlc1RvU3RyaW5nKGpzLmdldEJ5dGVzKCkpO1xuICAgICAgfSBlbHNlIGlmICghaXNTdHJpbmcoanMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFqYXZhU2NyaXB0KSB7XG4gICAgICAgIGphdmFTY3JpcHQgPSBbXTtcbiAgICAgIH1cbiAgICAgIGphdmFTY3JpcHQucHVzaChzdHJpbmdUb1BERlN0cmluZyhqcykpO1xuICAgIH1cblxuICAgIGlmIChvYmogJiYgb2JqLmhhcyhcIkphdmFTY3JpcHRcIikpIHtcbiAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoXCJKYXZhU2NyaXB0XCIpLCB0aGlzLnhyZWYpO1xuICAgICAgY29uc3QgbmFtZXMgPSBuYW1lVHJlZS5nZXRBbGwoKTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lcykge1xuICAgICAgICAvLyBXZSBkb24ndCB1c2UgbW9zdCBKYXZhU2NyaXB0IGluIFBERiBkb2N1bWVudHMuIFRoaXMgY29kZSBpc1xuICAgICAgICAvLyBkZWZlbnNpdmUgc28gd2UgZG9uJ3QgY2F1c2UgZXJyb3JzIG9uIGRvY3VtZW50IGxvYWQuXG4gICAgICAgIGNvbnN0IGpzRGljdCA9IG5hbWVzW25hbWVdO1xuICAgICAgICBpZiAoaXNEaWN0KGpzRGljdCkpIHtcbiAgICAgICAgICBhcHBlbmRJZkphdmFTY3JpcHREaWN0KGpzRGljdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgT3BlbkFjdGlvbiBcIkphdmFTY3JpcHRcIiBhY3Rpb25zIHRvIHRoZSBKYXZhU2NyaXB0IGFycmF5LlxuICAgIGNvbnN0IG9wZW5BY3Rpb24gPSB0aGlzLl9jYXREaWN0LmdldChcIk9wZW5BY3Rpb25cIik7XG4gICAgaWYgKGlzRGljdChvcGVuQWN0aW9uKSAmJiBpc05hbWUob3BlbkFjdGlvbi5nZXQoXCJTXCIpLCBcIkphdmFTY3JpcHRcIikpIHtcbiAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3Qob3BlbkFjdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImphdmFTY3JpcHRcIiwgamF2YVNjcmlwdCk7XG4gIH1cblxuICBmb250RmFsbGJhY2soaWQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIHRoaXMuZm9udENhY2hlLmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odHJhbnNsYXRlZEZvbnRzID0+IHtcbiAgICAgIGZvciAoY29uc3QgdHJhbnNsYXRlZEZvbnQgb2YgdHJhbnNsYXRlZEZvbnRzKSB7XG4gICAgICAgIGlmICh0cmFuc2xhdGVkRm9udC5sb2FkZWROYW1lID09PSBpZCkge1xuICAgICAgICAgIHRyYW5zbGF0ZWRGb250LmZhbGxiYWNrKGhhbmRsZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7XG4gICAgY2xlYXJQcmltaXRpdmVDYWNoZXMoKTtcbiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIoLyogb25seURhdGEgPSAqLyBtYW51YWxseVRyaWdnZXJlZCk7XG4gICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgdGhpcy5mb250Q2FjaGUuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbih0cmFuc2xhdGVkRm9udHMgPT4ge1xuICAgICAgZm9yIChjb25zdCB7IGRpY3QgfSBvZiB0cmFuc2xhdGVkRm9udHMpIHtcbiAgICAgICAgZGVsZXRlIGRpY3QudHJhbnNsYXRlZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9udENhY2hlLmNsZWFyKCk7XG4gICAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBhZ2VEaWN0KHBhZ2VJbmRleCkge1xuICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIGNvbnN0IG5vZGVzVG9WaXNpdCA9IFt0aGlzLl9jYXREaWN0LmdldFJhdyhcIlBhZ2VzXCIpXTtcbiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7XG4gICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZixcbiAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZSA9IHRoaXMucGFnZUtpZHNDb3VudENhY2hlO1xuICAgIGxldCBjb3VudCxcbiAgICAgIGN1cnJlbnRQYWdlSW5kZXggPSAwO1xuXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpO1xuXG4gICAgICAgIGlmIChpc1JlZihjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICBjb3VudCA9IHBhZ2VLaWRzQ291bnRDYWNoZS5nZXQoY3VycmVudE5vZGUpO1xuICAgICAgICAgIC8vIFNraXAgbm9kZXMgd2hlcmUgdGhlIHBhZ2UgY2FuJ3QgYmUuXG4gICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBjdXJyZW50UGFnZUluZGV4ICsgY291bnQgPCBwYWdlSW5kZXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUHJldmVudCBjaXJjdWxhciByZWZlcmVuY2VzIGluIHRoZSAvUGFnZXMgdHJlZS5cbiAgICAgICAgICBpZiAodmlzaXRlZE5vZGVzLmhhcyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgICAgICBuZXcgRm9ybWF0RXJyb3IoXCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS5cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXQoY3VycmVudE5vZGUpO1xuXG4gICAgICAgICAgeHJlZi5mZXRjaEFzeW5jKGN1cnJlbnROb2RlKS50aGVuKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIGlmIChpc0RpY3Qob2JqLCBcIlBhZ2VcIikgfHwgKGlzRGljdChvYmopICYmICFvYmouaGFzKFwiS2lkc1wiKSkpIHtcbiAgICAgICAgICAgICAgaWYgKHBhZ2VJbmRleCA9PT0gY3VycmVudFBhZ2VJbmRleCkge1xuICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSBQYWdlIHJlZmVyZW5jZSwgc2luY2UgaXQgY2FuICpncmVhdGx5KiBpbXByb3ZlXG4gICAgICAgICAgICAgICAgLy8gcGVyZm9ybWFuY2UgYnkgcmVkdWNpbmcgcmVkdW5kYW50IGxvb2t1cHMgaW4gbG9uZyBkb2N1bWVudHNcbiAgICAgICAgICAgICAgICAvLyB3aGVyZSBhbGwgbm9kZXMgYXJlIGZvdW5kIGF0ICpvbmUqIGxldmVsIG9mIHRoZSB0cmVlLlxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSAmJiAhcGFnZUtpZHNDb3VudENhY2hlLmhhcyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQoY3VycmVudE5vZGUsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoW29iaiwgY3VycmVudE5vZGVdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKG9iaik7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgfSwgY2FwYWJpbGl0eS5yZWplY3QpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE11c3QgYmUgYSBjaGlsZCBwYWdlIGRpY3Rpb25hcnkuXG4gICAgICAgIGlmICghaXNEaWN0KGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgICAgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgICBcIlBhZ2UgZGljdGlvbmFyeSBraWQgcmVmZXJlbmNlIHBvaW50cyB0byB3cm9uZyB0eXBlIG9mIG9iamVjdC5cIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY291bnQgPSBjdXJyZW50Tm9kZS5nZXQoXCJDb3VudFwiKTtcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoY291bnQpICYmIGNvdW50ID49IDApIHtcbiAgICAgICAgICAvLyBDYWNoZSB0aGUgS2lkcyBjb3VudCwgc2luY2UgaXQgY2FuIHJlZHVjZSByZWR1bmRhbnQgbG9va3VwcyBpblxuICAgICAgICAgIC8vIGRvY3VtZW50cyB3aGVyZSBhbGwgbm9kZXMgYXJlIGZvdW5kIGF0ICpvbmUqIGxldmVsIG9mIHRoZSB0cmVlLlxuICAgICAgICAgIGNvbnN0IG9iaklkID0gY3VycmVudE5vZGUub2JqSWQ7XG4gICAgICAgICAgaWYgKG9iaklkICYmICFwYWdlS2lkc0NvdW50Q2FjaGUuaGFzKG9iaklkKSkge1xuICAgICAgICAgICAgcGFnZUtpZHNDb3VudENhY2hlLnB1dChvYmpJZCwgY291bnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTa2lwIG5vZGVzIHdoZXJlIHRoZSBwYWdlIGNhbid0IGJlLlxuICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ICsgY291bnQgPD0gcGFnZUluZGV4KSB7XG4gICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4ICs9IGNvdW50O1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2lkcyA9IGN1cnJlbnROb2RlLmdldChcIktpZHNcIik7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkge1xuICAgICAgICAgIC8vIFByZXZlbnQgZXJyb3JzIGluIGNvcnJ1cHQgUERGIGRvY3VtZW50cyB0aGF0IHZpb2xhdGUgdGhlXG4gICAgICAgICAgLy8gc3BlY2lmaWNhdGlvbiBieSAqaW5saW5pbmcqIFBhZ2UgZGljdHMgZGlyZWN0bHkgaW4gdGhlIEtpZHNcbiAgICAgICAgICAvLyBhcnJheSwgcmF0aGVyIHRoYW4gdXNpbmcgaW5kaXJlY3Qgb2JqZWN0cyAoZml4ZXMgaXNzdWU5NTQwLnBkZikuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNOYW1lKGN1cnJlbnROb2RlLmdldChcIlR5cGVcIiksIFwiUGFnZVwiKSB8fFxuICAgICAgICAgICAgKCFjdXJyZW50Tm9kZS5oYXMoXCJUeXBlXCIpICYmIGN1cnJlbnROb2RlLmhhcyhcIkNvbnRlbnRzXCIpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggPT09IHBhZ2VJbmRleCkge1xuICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoW2N1cnJlbnROb2RlLCBudWxsXSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgICAgbmV3IEZvcm1hdEVycm9yKFwiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS5cIilcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsd2F5cyBjaGVjayBhbGwgYEtpZHNgIG5vZGVzLCB0byBhdm9pZCBnZXR0aW5nIHN0dWNrIGluIGFuIGVtcHR5XG4gICAgICAgIC8vIG5vZGUgZnVydGhlciBkb3duIGluIHRoZSB0cmVlIChzZWUgaXNzdWU1NjQ0LnBkZiwgaXNzdWU4MDg4LnBkZiksXG4gICAgICAgIC8vIGFuZCB0byBlbnN1cmUgdGhhdCB3ZSBhY3R1YWxseSBmaW5kIHRoZSBjb3JyZWN0IGBQYWdlYCBkaWN0LlxuICAgICAgICBmb3IgKGxldCBsYXN0ID0ga2lkcy5sZW5ndGggLSAxOyBsYXN0ID49IDA7IGxhc3QtLSkge1xuICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKGtpZHNbbGFzdF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoYFBhZ2UgaW5kZXggJHtwYWdlSW5kZXh9IG5vdCBmb3VuZC5gKSk7XG4gICAgfVxuICAgIG5leHQoKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgZ2V0UGFnZUluZGV4KHBhZ2VSZWYpIHtcbiAgICAvLyBUaGUgcGFnZSB0cmVlIG5vZGVzIGhhdmUgdGhlIGNvdW50IG9mIGFsbCB0aGUgbGVhdmVzIGJlbG93IHRoZW0uIFRvIGdldFxuICAgIC8vIGhvdyBtYW55IHBhZ2VzIGFyZSBiZWZvcmUgd2UganVzdCBoYXZlIHRvIHdhbGsgdXAgdGhlIHRyZWUgYW5kIGtlZXBcbiAgICAvLyBhZGRpbmcgdGhlIGNvdW50IG9mIHNpYmxpbmdzIHRvIHRoZSBsZWZ0IG9mIHRoZSBub2RlLlxuICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7XG5cbiAgICBmdW5jdGlvbiBwYWdlc0JlZm9yZVJlZihraWRSZWYpIHtcbiAgICAgIGxldCB0b3RhbCA9IDAsXG4gICAgICAgIHBhcmVudFJlZjtcblxuICAgICAgcmV0dXJuIHhyZWZcbiAgICAgICAgLmZldGNoQXN5bmMoa2lkUmVmKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzUmVmc0VxdWFsKGtpZFJlZiwgcGFnZVJlZikgJiZcbiAgICAgICAgICAgICFpc0RpY3Qobm9kZSwgXCJQYWdlXCIpICYmXG4gICAgICAgICAgICAhKGlzRGljdChub2RlKSAmJiAhbm9kZS5oYXMoXCJUeXBlXCIpICYmIG5vZGUuaGFzKFwiQ29udGVudHNcIikpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICAgIFwiVGhlIHJlZmVyZW5jZSBkb2VzIG5vdCBwb2ludCB0byBhIC9QYWdlIGRpY3Rpb25hcnkuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNEaWN0KG5vZGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJOb2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50UmVmID0gbm9kZS5nZXRSYXcoXCJQYXJlbnRcIik7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXN5bmMoXCJQYXJlbnRcIik7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNEaWN0KHBhcmVudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlBhcmVudCBtdXN0IGJlIGEgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QXN5bmMoXCJLaWRzXCIpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoa2lkcykge1xuICAgICAgICAgIGlmICgha2lkcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qga2lkUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBraWRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtpZCA9IGtpZHNbaV07XG4gICAgICAgICAgICBpZiAoIWlzUmVmKGtpZCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiS2lkIG11c3QgYmUgYSByZWZlcmVuY2UuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZCwga2lkUmVmKSkge1xuICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2lkUHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgeHJlZi5mZXRjaEFzeW5jKGtpZCkudGhlbihmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0RpY3Qob2JqKSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiS2lkIG5vZGUgbXVzdCBiZSBhIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2JqLmhhcyhcIkNvdW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICB0b3RhbCArPSBvYmouZ2V0KFwiQ291bnRcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIFBhZ2UgbGVhZiBub2RlLlxuICAgICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJLaWQgcmVmZXJlbmNlIG5vdCBmb3VuZCBpbiBwYXJlbnQncyBraWRzLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGtpZFByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBbdG90YWwsIHBhcmVudFJlZl07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgZnVuY3Rpb24gbmV4dChyZWYpIHtcbiAgICAgIHJldHVybiBwYWdlc0JlZm9yZVJlZihyZWYpLnRoZW4oZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtjb3VudCwgcGFyZW50UmVmXSA9IGFyZ3M7XG4gICAgICAgIHRvdGFsICs9IGNvdW50O1xuICAgICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQocGFnZVJlZik7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYgUGFyc2VEZXN0RGljdGlvbmFyeVBhcmFtZXRlcnNcbiAgICogQHByb3BlcnR5IHtEaWN0fSBkZXN0RGljdCAtIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGRlc3RpbmF0aW9uLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcmVzdWx0T2JqIC0gVGhlIG9iamVjdCB3aGVyZSB0aGUgcGFyc2VkIGRlc3RpbmF0aW9uXG4gICAqICAgcHJvcGVydGllcyB3aWxsIGJlIHBsYWNlZC5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtkb2NCYXNlVXJsXSAtIFRoZSBkb2N1bWVudCBiYXNlIFVSTCB0aGF0IGlzIHVzZWQgd2hlblxuICAgKiAgIGF0dGVtcHRpbmcgdG8gcmVjb3ZlciB2YWxpZCBhYnNvbHV0ZSBVUkxzIGZyb20gcmVsYXRpdmUgb25lcy5cbiAgICovXG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHBhcnNlIHRoZSBjb250ZW50cyBvZiBkZXN0aW5hdGlvbiBkaWN0aW9uYXJpZXMuXG4gICAqIEBwYXJhbSB7UGFyc2VEZXN0RGljdGlvbmFyeVBhcmFtZXRlcnN9IHBhcmFtc1xuICAgKi9cbiAgc3RhdGljIHBhcnNlRGVzdERpY3Rpb25hcnkocGFyYW1zKSB7XG4gICAgLy8gTGV0cyBVUkxzIGJlZ2lubmluZyB3aXRoICd3d3cuJyBkZWZhdWx0IHRvIHVzaW5nIHRoZSAnaHR0cDovLycgcHJvdG9jb2wuXG4gICAgZnVuY3Rpb24gYWRkRGVmYXVsdFByb3RvY29sVG9VcmwodXJsKSB7XG4gICAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoXCJ3d3cuXCIpID8gYGh0dHA6Ly8ke3VybH1gIDogdXJsO1xuICAgIH1cblxuICAgIC8vIEFjY29yZGluZyB0byBJU08gMzIwMDAtMToyMDA4LCBzZWN0aW9uIDEyLjYuNC43LCBVUklzIHNob3VsZCBiZSBlbmNvZGVkXG4gICAgLy8gaW4gNy1iaXQgQVNDSUkuIFNvbWUgYmFkIFBERnMgdXNlIFVURi04IGVuY29kaW5nOyBzZWUgQnVnemlsbGEgMTEyMjI4MC5cbiAgICBmdW5jdGlvbiB0cnlDb252ZXJ0VXJsRW5jb2RpbmcodXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9VVEY4U3RyaW5nKHVybCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdERpY3QgPSBwYXJhbXMuZGVzdERpY3Q7XG4gICAgaWYgKCFpc0RpY3QoZGVzdERpY3QpKSB7XG4gICAgICB3YXJuKFwicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdE9iaiA9IHBhcmFtcy5yZXN1bHRPYmo7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRPYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHdhcm4oXCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgcmVzdWx0T2JqYCBtdXN0IGJlIGFuIG9iamVjdC5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRvY0Jhc2VVcmwgPSBwYXJhbXMuZG9jQmFzZVVybCB8fCBudWxsO1xuXG4gICAgbGV0IGFjdGlvbiA9IGRlc3REaWN0LmdldChcIkFcIiksXG4gICAgICB1cmwsXG4gICAgICBkZXN0O1xuICAgIGlmICghaXNEaWN0KGFjdGlvbikgJiYgZGVzdERpY3QuaGFzKFwiRGVzdFwiKSkge1xuICAgICAgLy8gQSAvRGVzdCBlbnRyeSBzaG91bGQgKm9ubHkqIGNvbnRhaW4gYSBOYW1lIG9yIGFuIEFycmF5LCBidXQgc29tZSBiYWRcbiAgICAgIC8vIFBERiBnZW5lcmF0b3JzIGlnbm9yZSB0aGF0IGFuZCB0cmVhdCBpdCBhcyBhbiAvQSBlbnRyeS5cbiAgICAgIGFjdGlvbiA9IGRlc3REaWN0LmdldChcIkRlc3RcIik7XG4gICAgfVxuXG4gICAgaWYgKGlzRGljdChhY3Rpb24pKSB7XG4gICAgICBjb25zdCBhY3Rpb25UeXBlID0gYWN0aW9uLmdldChcIlNcIik7XG4gICAgICBpZiAoIWlzTmFtZShhY3Rpb25UeXBlKSkge1xuICAgICAgICB3YXJuKFwicGFyc2VEZXN0RGljdGlvbmFyeTogSW52YWxpZCB0eXBlIGluIEFjdGlvbiBkaWN0aW9uYXJ5LlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYWN0aW9uTmFtZSA9IGFjdGlvblR5cGUubmFtZTtcblxuICAgICAgc3dpdGNoIChhY3Rpb25OYW1lKSB7XG4gICAgICAgIGNhc2UgXCJVUklcIjpcbiAgICAgICAgICB1cmwgPSBhY3Rpb24uZ2V0KFwiVVJJXCIpO1xuICAgICAgICAgIGlmIChpc05hbWUodXJsKSkge1xuICAgICAgICAgICAgLy8gU29tZSBiYWQgUERGcyBkbyBub3QgcHV0IHBhcmVudGhlc2VzIGFyb3VuZCByZWxhdGl2ZSBVUkxzLlxuICAgICAgICAgICAgdXJsID0gXCIvXCIgKyB1cmwubmFtZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHVybCkpIHtcbiAgICAgICAgICAgIHVybCA9IGFkZERlZmF1bHRQcm90b2NvbFRvVXJsKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRPRE86IHBkZiBzcGVjIG1lbnRpb25zIHVybHMgY2FuIGJlIHJlbGF0aXZlIHRvIGEgQmFzZVxuICAgICAgICAgIC8vIGVudHJ5IGluIHRoZSBkaWN0aW9uYXJ5LlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJHb1RvXCI6XG4gICAgICAgICAgZGVzdCA9IGFjdGlvbi5nZXQoXCJEXCIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJMYXVuY2hcIjpcbiAgICAgICAgLy8gV2UgbmVpdGhlciB3YW50LCBub3IgY2FuLCBzdXBwb3J0IGFyYml0cmFyeSAnTGF1bmNoJyBhY3Rpb25zLlxuICAgICAgICAvLyBIb3dldmVyLCBpbiBwcmFjdGljZSB0aGV5IGFyZSBtb3N0bHkgdXNlZCBmb3IgbGlua2luZyB0byBvdGhlciBQREZcbiAgICAgICAgLy8gZmlsZXMsIHdoaWNoIHdlIHRodXMgYXR0ZW1wdCB0byBzdXBwb3J0ICh1dGlsaXppbmcgYGRvY0Jhc2VVcmxgKS5cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgICAgIGNhc2UgXCJHb1RvUlwiOlxuICAgICAgICAgIGNvbnN0IHVybERpY3QgPSBhY3Rpb24uZ2V0KFwiRlwiKTtcbiAgICAgICAgICBpZiAoaXNEaWN0KHVybERpY3QpKSB7XG4gICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBmb3VuZCBhIEZpbGVTcGVjIGRpY3Rpb25hcnlcbiAgICAgICAgICAgIC8vIGFuZCBmZXRjaCB0aGUgVVJMIHdpdGhvdXQgY2hlY2tpbmcgYW55IGZ1cnRoZXIuXG4gICAgICAgICAgICB1cmwgPSB1cmxEaWN0LmdldChcIkZcIikgfHwgbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHVybERpY3QpKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmxEaWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5PVEU6IHRoZSBkZXN0aW5hdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgKnJlbW90ZSogZG9jdW1lbnQuXG4gICAgICAgICAgbGV0IHJlbW90ZURlc3QgPSBhY3Rpb24uZ2V0KFwiRFwiKTtcbiAgICAgICAgICBpZiAocmVtb3RlRGVzdCkge1xuICAgICAgICAgICAgaWYgKGlzTmFtZShyZW1vdGVEZXN0KSkge1xuICAgICAgICAgICAgICByZW1vdGVEZXN0ID0gcmVtb3RlRGVzdC5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKHVybCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHVybC5zcGxpdChcIiNcIilbMF07XG4gICAgICAgICAgICAgIGlmIChpc1N0cmluZyhyZW1vdGVEZXN0KSkge1xuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VVcmwgKyBcIiNcIiArIHJlbW90ZURlc3Q7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZW1vdGVEZXN0KSkge1xuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VVcmwgKyBcIiNcIiArIEpTT04uc3RyaW5naWZ5KHJlbW90ZURlc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSAnTmV3V2luZG93JyBwcm9wZXJ0eSwgZXF1YWwgdG8gYExpbmtUYXJnZXQuQkxBTktgLlxuICAgICAgICAgIGNvbnN0IG5ld1dpbmRvdyA9IGFjdGlvbi5nZXQoXCJOZXdXaW5kb3dcIik7XG4gICAgICAgICAgaWYgKGlzQm9vbChuZXdXaW5kb3cpKSB7XG4gICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0gbmV3V2luZG93O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiTmFtZWRcIjpcbiAgICAgICAgICBjb25zdCBuYW1lZEFjdGlvbiA9IGFjdGlvbi5nZXQoXCJOXCIpO1xuICAgICAgICAgIGlmIChpc05hbWUobmFtZWRBY3Rpb24pKSB7XG4gICAgICAgICAgICByZXN1bHRPYmouYWN0aW9uID0gbmFtZWRBY3Rpb24ubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkphdmFTY3JpcHRcIjpcbiAgICAgICAgICBjb25zdCBqc0FjdGlvbiA9IGFjdGlvbi5nZXQoXCJKU1wiKTtcbiAgICAgICAgICBsZXQganM7XG5cbiAgICAgICAgICBpZiAoaXNTdHJlYW0oanNBY3Rpb24pKSB7XG4gICAgICAgICAgICBqcyA9IGJ5dGVzVG9TdHJpbmcoanNBY3Rpb24uZ2V0Qnl0ZXMoKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyhqc0FjdGlvbikpIHtcbiAgICAgICAgICAgIGpzID0ganNBY3Rpb247XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGpzKSB7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgdmFsaWQgVVJMcyBmcm9tIGBKU2AgZW50cmllcyB3aXRoIGNlcnRhaW5cbiAgICAgICAgICAgIC8vIHdoaXRlLWxpc3RlZCBmb3JtYXRzOlxuICAgICAgICAgICAgLy8gIC0gd2luZG93Lm9wZW4oJ2h0dHA6Ly9leGFtcGxlLmNvbScpXG4gICAgICAgICAgICAvLyAgLSBhcHAubGF1bmNoVVJMKCdodHRwOi8vZXhhbXBsZS5jb20nLCB0cnVlKVxuICAgICAgICAgICAgY29uc3QgVVJMX09QRU5fTUVUSE9EUyA9IFtcImFwcC5sYXVuY2hVUkxcIiwgXCJ3aW5kb3cub3BlblwiXTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgXCJeXFxcXHMqKFwiICtcbiAgICAgICAgICAgICAgICBVUkxfT1BFTl9NRVRIT0RTLmpvaW4oXCJ8XCIpLnNwbGl0KFwiLlwiKS5qb2luKFwiXFxcXC5cIikgK1xuICAgICAgICAgICAgICAgIFwiKVxcXFwoKD86J3xcXFwiKShbXidcXFwiXSopKD86J3xcXFwiKSg/OixcXFxccyooXFxcXHcrKVxcXFwpfFxcXFwpKVwiLFxuICAgICAgICAgICAgICBcImlcIlxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QganNVcmwgPSByZWdleC5leGVjKHN0cmluZ1RvUERGU3RyaW5nKGpzKSk7XG4gICAgICAgICAgICBpZiAoanNVcmwgJiYganNVcmxbMl0pIHtcbiAgICAgICAgICAgICAgdXJsID0ganNVcmxbMl07XG5cbiAgICAgICAgICAgICAgaWYgKGpzVXJsWzNdID09PSBcInRydWVcIiAmJiBqc1VybFsxXSA9PT0gXCJhcHAubGF1bmNoVVJMXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5OiB1bnN1cHBvcnRlZCBhY3Rpb24gdHlwZSBcIiR7YWN0aW9uTmFtZX1cIi5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlc3REaWN0LmhhcyhcIkRlc3RcIikpIHtcbiAgICAgIC8vIFNpbXBsZSBkZXN0aW5hdGlvbi5cbiAgICAgIGRlc3QgPSBkZXN0RGljdC5nZXQoXCJEZXN0XCIpO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyh1cmwpKSB7XG4gICAgICB1cmwgPSB0cnlDb252ZXJ0VXJsRW5jb2RpbmcodXJsKTtcbiAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGRvY0Jhc2VVcmwpO1xuICAgICAgaWYgKGFic29sdXRlVXJsKSB7XG4gICAgICAgIHJlc3VsdE9iai51cmwgPSBhYnNvbHV0ZVVybC5ocmVmO1xuICAgICAgfVxuICAgICAgcmVzdWx0T2JqLnVuc2FmZVVybCA9IHVybDtcbiAgICB9XG4gICAgaWYgKGRlc3QpIHtcbiAgICAgIGlmIChpc05hbWUoZGVzdCkpIHtcbiAgICAgICAgZGVzdCA9IGRlc3QubmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0cmluZyhkZXN0KSB8fCBBcnJheS5pc0FycmF5KGRlc3QpKSB7XG4gICAgICAgIHJlc3VsdE9iai5kZXN0ID0gZGVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFhSZWYgPSAoZnVuY3Rpb24gWFJlZkNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gWFJlZihzdHJlYW0sIHBkZk1hbmFnZXIpIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyO1xuICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICAgIHRoaXMueHJlZnN0bXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2NhY2hlTWFwID0gbmV3IE1hcCgpOyAvLyBQcmVwYXJlIHRoZSBYUmVmIGNhY2hlLlxuICAgIHRoaXMuc3RhdHMgPSB7XG4gICAgICBzdHJlYW1UeXBlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgIGZvbnRUeXBlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICB9O1xuICAgIHRoaXMuX25ld1JlZk51bSA9IG51bGw7XG4gIH1cblxuICBYUmVmLnByb3RvdHlwZSA9IHtcbiAgICBnZXROZXdSZWY6IGZ1bmN0aW9uIFhSZWZfZ2V0TmV3UmVmKCkge1xuICAgICAgaWYgKHRoaXMuX25ld1JlZk51bSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9uZXdSZWZOdW0gPSB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlZi5nZXQodGhpcy5fbmV3UmVmTnVtKyssIDApO1xuICAgIH0sXG5cbiAgICByZXNldE5ld1JlZjogZnVuY3Rpb24gWFJlZl9yZXNldE5ld1JlZigpIHtcbiAgICAgIHRoaXMuX25ld1JlZk51bSA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN0YXJ0WFJlZjogZnVuY3Rpb24gWFJlZl9zZXRTdGFydFhSZWYoc3RhcnRYUmVmKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgc3RhcnRpbmcgcG9zaXRpb25zIG9mIHhyZWYgdGFibGVzIGFzIHdlIHByb2Nlc3MgdGhlbVxuICAgICAgLy8gc28gd2UgY2FuIHJlY292ZXIgZnJvbSBtaXNzaW5nIGRhdGEgZXJyb3JzXG4gICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlID0gW3N0YXJ0WFJlZl07XG4gICAgfSxcblxuICAgIHBhcnNlOiBmdW5jdGlvbiBYUmVmX3BhcnNlKHJlY292ZXJ5TW9kZSkge1xuICAgICAgdmFyIHRyYWlsZXJEaWN0O1xuICAgICAgaWYgKCFyZWNvdmVyeU1vZGUpIHtcbiAgICAgICAgdHJhaWxlckRpY3QgPSB0aGlzLnJlYWRYUmVmKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFwiSW5kZXhpbmcgYWxsIFBERiBvYmplY3RzXCIpO1xuICAgICAgICB0cmFpbGVyRGljdCA9IHRoaXMuaW5kZXhPYmplY3RzKCk7XG4gICAgICB9XG4gICAgICB0cmFpbGVyRGljdC5hc3NpZ25YcmVmKHRoaXMpO1xuICAgICAgdGhpcy50cmFpbGVyID0gdHJhaWxlckRpY3Q7XG5cbiAgICAgIGxldCBlbmNyeXB0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5jcnlwdCA9IHRyYWlsZXJEaWN0LmdldChcIkVuY3J5cHRcIik7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICAgIHdhcm4oYFhSZWYucGFyc2UgLSBJbnZhbGlkIFwiRW5jcnlwdFwiIHJlZmVyZW5jZTogXCIke2V4fVwiLmApO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGljdChlbmNyeXB0KSkge1xuICAgICAgICB2YXIgaWRzID0gdHJhaWxlckRpY3QuZ2V0KFwiSURcIik7XG4gICAgICAgIHZhciBmaWxlSWQgPSBpZHMgJiYgaWRzLmxlbmd0aCA/IGlkc1swXSA6IFwiXCI7XG4gICAgICAgIC8vIFRoZSAnRW5jcnlwdCcgZGljdGlvbmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBlbmNyeXB0ZWQsIGFuZCBieVxuICAgICAgICAvLyBzZXR0aW5nIGBzdXBwcmVzc0VuY3J5cHRpb25gIHdlIGNhbiBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AgaW5zaWRlXG4gICAgICAgIC8vIG9mIGBYUmVmX2ZldGNoVW5jb21wcmVzc2VkYCBpZiB0aGUgZGljdGlvbmFyeSBjb250YWlucyBpbmRpcmVjdFxuICAgICAgICAvLyBvYmplY3RzIChmaXhlcyBpc3N1ZTc2NjUucGRmKS5cbiAgICAgICAgZW5jcnlwdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLmVuY3J5cHQgPSBuZXcgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShcbiAgICAgICAgICBlbmNyeXB0LFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICB0aGlzLnBkZk1hbmFnZXIucGFzc3dvcmRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSByb290IGRpY3Rpb25hcnkgKGNhdGFsb2cpIG9iamVjdCwgYW5kIGRvIHNvbWUgYmFzaWMgdmFsaWRhdGlvbi5cbiAgICAgIGxldCByb290O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcm9vdCA9IHRyYWlsZXJEaWN0LmdldChcIlJvb3RcIik7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICAgIHdhcm4oYFhSZWYucGFyc2UgLSBJbnZhbGlkIFwiUm9vdFwiIHJlZmVyZW5jZTogXCIke2V4fVwiLmApO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGljdChyb290KSAmJiByb290LmhhcyhcIlBhZ2VzXCIpKSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXJlY292ZXJ5TW9kZSkge1xuICAgICAgICAgIHRocm93IG5ldyBYUmVmUGFyc2VFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIHJvb3QgcmVmZXJlbmNlXCIpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzWFJlZlRhYmxlOiBmdW5jdGlvbiBYUmVmX3Byb2Nlc3NYUmVmVGFibGUocGFyc2VyKSB7XG4gICAgICBpZiAoIShcInRhYmxlU3RhdGVcIiBpbiB0aGlzKSkge1xuICAgICAgICAvLyBTdG9yZXMgc3RhdGUgb2YgdGhlIHRhYmxlIGFzIHdlIHByb2Nlc3MgaXQgc28gd2UgY2FuIHJlc3VtZVxuICAgICAgICAvLyBmcm9tIG1pZGRsZSBvZiB0YWJsZSBpbiBjYXNlIG9mIG1pc3NpbmcgZGF0YSBlcnJvclxuICAgICAgICB0aGlzLnRhYmxlU3RhdGUgPSB7XG4gICAgICAgICAgZW50cnlOdW06IDAsXG4gICAgICAgICAgc3RyZWFtUG9zOiBwYXJzZXIubGV4ZXIuc3RyZWFtLnBvcyxcbiAgICAgICAgICBwYXJzZXJCdWYxOiBwYXJzZXIuYnVmMSxcbiAgICAgICAgICBwYXJzZXJCdWYyOiBwYXJzZXIuYnVmMixcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9iaiA9IHRoaXMucmVhZFhSZWZUYWJsZShwYXJzZXIpO1xuXG4gICAgICAvLyBTYW5pdHkgY2hlY2tcbiAgICAgIGlmICghaXNDbWQob2JqLCBcInRyYWlsZXJcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIFwiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgZmluZCB0cmFpbGVyIGRpY3Rpb25hcnlcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gUmVhZCB0cmFpbGVyIGRpY3Rpb25hcnksIGUuZy5cbiAgICAgIC8vIHRyYWlsZXJcbiAgICAgIC8vICAgIDw8IC9TaXplIDIyXG4gICAgICAvLyAgICAgIC9Sb290IDIwUlxuICAgICAgLy8gICAgICAvSW5mbyAxMFJcbiAgICAgIC8vICAgICAgL0lEIFsgPDgxYjE0YWFmYTMxM2RiNjNkYmQ2Zjk4MWU0OWY5NGY0PiBdXG4gICAgICAvLyAgICA+PlxuICAgICAgLy8gVGhlIHBhcnNlciBnb2VzIHRocm91Z2ggdGhlIGVudGlyZSBzdHJlYW0gPDwgLi4uID4+IGFuZCBwcm92aWRlc1xuICAgICAgLy8gYSBnZXR0ZXIgaW50ZXJmYWNlIGZvciB0aGUga2V5LXZhbHVlIHRhYmxlXG4gICAgICB2YXIgZGljdCA9IHBhcnNlci5nZXRPYmooKTtcblxuICAgICAgLy8gVGhlIHBkZmxpYiBQREYgZ2VuZXJhdG9yIGNhbiBnZW5lcmF0ZSBhIG5lc3RlZCB0cmFpbGVyIGRpY3Rpb25hcnlcbiAgICAgIGlmICghaXNEaWN0KGRpY3QpICYmIGRpY3QuZGljdCkge1xuICAgICAgICBkaWN0ID0gZGljdC5kaWN0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc0RpY3QoZGljdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIFwiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgcGFyc2UgdHJhaWxlciBkaWN0aW9uYXJ5XCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGU7XG5cbiAgICAgIHJldHVybiBkaWN0O1xuICAgIH0sXG5cbiAgICByZWFkWFJlZlRhYmxlOiBmdW5jdGlvbiBYUmVmX3JlYWRYUmVmVGFibGUocGFyc2VyKSB7XG4gICAgICAvLyBFeGFtcGxlIG9mIGNyb3NzLXJlZmVyZW5jZSB0YWJsZTpcbiAgICAgIC8vIHhyZWZcbiAgICAgIC8vIDAgMSAgICAgICAgICAgICAgICAgICAgPC0tIHN1YnNlY3Rpb24gaGVhZGVyIChmaXJzdCBvYmogIywgb2JqIGNvdW50KVxuICAgICAgLy8gMDAwMDAwMDAwMCA2NTUzNSBmICAgICA8LS0gYWN0dWFsIG9iamVjdCAob2Zmc2V0LCBnZW5lcmF0aW9uICMsIGYvbilcbiAgICAgIC8vIDIzIDIgICAgICAgICAgICAgICAgICAgPC0tIHN1YnNlY3Rpb24gaGVhZGVyIC4uLiBhbmQgc28gb24gLi4uXG4gICAgICAvLyAwMDAwMDI1NTE4IDAwMDAyIG5cbiAgICAgIC8vIDAwMDAwMjU2MzUgMDAwMDAgblxuICAgICAgLy8gdHJhaWxlclxuICAgICAgLy8gLi4uXG5cbiAgICAgIHZhciBzdHJlYW0gPSBwYXJzZXIubGV4ZXIuc3RyZWFtO1xuICAgICAgdmFyIHRhYmxlU3RhdGUgPSB0aGlzLnRhYmxlU3RhdGU7XG4gICAgICBzdHJlYW0ucG9zID0gdGFibGVTdGF0ZS5zdHJlYW1Qb3M7XG4gICAgICBwYXJzZXIuYnVmMSA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMTtcbiAgICAgIHBhcnNlci5idWYyID0gdGFibGVTdGF0ZS5wYXJzZXJCdWYyO1xuXG4gICAgICAvLyBPdXRlciBsb29wIGlzIG92ZXIgc3Vic2VjdGlvbiBoZWFkZXJzXG4gICAgICB2YXIgb2JqO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoIShcImZpcnN0RW50cnlOdW1cIiBpbiB0YWJsZVN0YXRlKSB8fCAhKFwiZW50cnlDb3VudFwiIGluIHRhYmxlU3RhdGUpKSB7XG4gICAgICAgICAgaWYgKGlzQ21kKChvYmogPSBwYXJzZXIuZ2V0T2JqKCkpLCBcInRyYWlsZXJcIikpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW0gPSBvYmo7XG4gICAgICAgICAgdGFibGVTdGF0ZS5lbnRyeUNvdW50ID0gcGFyc2VyLmdldE9iaigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0ID0gdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtO1xuICAgICAgICB2YXIgY291bnQgPSB0YWJsZVN0YXRlLmVudHJ5Q291bnQ7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIoY291bnQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIFhSZWYgdGFibGU6IHdyb25nIHR5cGVzIGluIHN1YnNlY3Rpb24gaGVhZGVyXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIElubmVyIGxvb3AgaXMgb3ZlciBvYmplY3RzIHRoZW1zZWx2ZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IHRhYmxlU3RhdGUuZW50cnlOdW07IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgICAgIHRhYmxlU3RhdGUuZW50cnlOdW0gPSBpO1xuICAgICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMSA9IHBhcnNlci5idWYxO1xuICAgICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyO1xuXG4gICAgICAgICAgdmFyIGVudHJ5ID0ge307XG4gICAgICAgICAgZW50cnkub2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpO1xuICAgICAgICAgIGVudHJ5LmdlbiA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgICAgICB2YXIgdHlwZSA9IHBhcnNlci5nZXRPYmooKTtcblxuICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ21kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuY21kKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgICAgZW50cnkuZnJlZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJuXCI6XG4gICAgICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBWYWxpZGF0ZSBlbnRyeSBvYmpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihlbnRyeS5vZmZzZXQpIHx8XG4gICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihlbnRyeS5nZW4pIHx8XG4gICAgICAgICAgICAhKGVudHJ5LmZyZWUgfHwgZW50cnkudW5jb21wcmVzc2VkKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBlbnRyeSBpbiBYUmVmIHN1YnNlY3Rpb246ICR7Zmlyc3R9LCAke2NvdW50fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGhlIGZpcnN0IHhyZWYgdGFibGUgZW50cnksIGkuZS4gb2JqIDAsIHNob3VsZCBiZSBmcmVlLiBBdHRlbXB0aW5nXG4gICAgICAgICAgLy8gdG8gYWRqdXN0IGFuIGluY29ycmVjdCBmaXJzdCBvYmogIyAoZml4ZXMgaXNzdWUgMzI0OCBhbmQgNzIyOSkuXG4gICAgICAgICAgaWYgKGkgPT09IDAgJiYgZW50cnkuZnJlZSAmJiBmaXJzdCA9PT0gMSkge1xuICAgICAgICAgICAgZmlyc3QgPSAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGhpcy5lbnRyaWVzW2kgKyBmaXJzdF0pIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1tpICsgZmlyc3RdID0gZW50cnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGFibGVTdGF0ZS5lbnRyeU51bSA9IDA7XG4gICAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvcztcbiAgICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYxID0gcGFyc2VyLmJ1ZjE7XG4gICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyO1xuICAgICAgICBkZWxldGUgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtO1xuICAgICAgICBkZWxldGUgdGFibGVTdGF0ZS5lbnRyeUNvdW50O1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdHkgY2hlY2s6IGFzIHBlciBzcGVjLCBmaXJzdCBvYmplY3QgbXVzdCBiZSBmcmVlXG4gICAgICBpZiAodGhpcy5lbnRyaWVzWzBdICYmICF0aGlzLmVudHJpZXNbMF0uZnJlZSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1hSZWZTdHJlYW06IGZ1bmN0aW9uIFhSZWZfcHJvY2Vzc1hSZWZTdHJlYW0oc3RyZWFtKSB7XG4gICAgICBpZiAoIShcInN0cmVhbVN0YXRlXCIgaW4gdGhpcykpIHtcbiAgICAgICAgLy8gU3RvcmVzIHN0YXRlIG9mIHRoZSBzdHJlYW0gYXMgd2UgcHJvY2VzcyBpdCBzbyB3ZSBjYW4gcmVzdW1lXG4gICAgICAgIC8vIGZyb20gbWlkZGxlIG9mIHN0cmVhbSBpbiBjYXNlIG9mIG1pc3NpbmcgZGF0YSBlcnJvclxuICAgICAgICB2YXIgc3RyZWFtUGFyYW1ldGVycyA9IHN0cmVhbS5kaWN0O1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHN0cmVhbVBhcmFtZXRlcnMuZ2V0KFwiV1wiKTtcbiAgICAgICAgdmFyIHJhbmdlID0gc3RyZWFtUGFyYW1ldGVycy5nZXQoXCJJbmRleFwiKTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgIHJhbmdlID0gWzAsIHN0cmVhbVBhcmFtZXRlcnMuZ2V0KFwiU2l6ZVwiKV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0cmVhbVN0YXRlID0ge1xuICAgICAgICAgIGVudHJ5UmFuZ2VzOiByYW5nZSxcbiAgICAgICAgICBieXRlV2lkdGhzLFxuICAgICAgICAgIGVudHJ5TnVtOiAwLFxuICAgICAgICAgIHN0cmVhbVBvczogc3RyZWFtLnBvcyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVhZFhSZWZTdHJlYW0oc3RyZWFtKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVN0YXRlO1xuXG4gICAgICByZXR1cm4gc3RyZWFtLmRpY3Q7XG4gICAgfSxcblxuICAgIHJlYWRYUmVmU3RyZWFtOiBmdW5jdGlvbiBYUmVmX3JlYWRYUmVmU3RyZWFtKHN0cmVhbSkge1xuICAgICAgdmFyIGksIGo7XG4gICAgICB2YXIgc3RyZWFtU3RhdGUgPSB0aGlzLnN0cmVhbVN0YXRlO1xuICAgICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXRlLnN0cmVhbVBvcztcblxuICAgICAgdmFyIGJ5dGVXaWR0aHMgPSBzdHJlYW1TdGF0ZS5ieXRlV2lkdGhzO1xuICAgICAgdmFyIHR5cGVGaWVsZFdpZHRoID0gYnl0ZVdpZHRoc1swXTtcbiAgICAgIHZhciBvZmZzZXRGaWVsZFdpZHRoID0gYnl0ZVdpZHRoc1sxXTtcbiAgICAgIHZhciBnZW5lcmF0aW9uRmllbGRXaWR0aCA9IGJ5dGVXaWR0aHNbMl07XG5cbiAgICAgIHZhciBlbnRyeVJhbmdlcyA9IHN0cmVhbVN0YXRlLmVudHJ5UmFuZ2VzO1xuICAgICAgd2hpbGUgKGVudHJ5UmFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGZpcnN0ID0gZW50cnlSYW5nZXNbMF07XG4gICAgICAgIHZhciBuID0gZW50cnlSYW5nZXNbMV07XG5cbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogJHtmaXJzdH0sICR7bn1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgIU51bWJlci5pc0ludGVnZXIodHlwZUZpZWxkV2lkdGgpIHx8XG4gICAgICAgICAgIU51bWJlci5pc0ludGVnZXIob2Zmc2V0RmllbGRXaWR0aCkgfHxcbiAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihnZW5lcmF0aW9uRmllbGRXaWR0aClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAke2ZpcnN0fSwgJHtufWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IHN0cmVhbVN0YXRlLmVudHJ5TnVtOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgc3RyZWFtU3RhdGUuZW50cnlOdW0gPSBpO1xuICAgICAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7XG5cbiAgICAgICAgICB2YXIgdHlwZSA9IDAsXG4gICAgICAgICAgICBvZmZzZXQgPSAwLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbiA9IDA7XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IHR5cGVGaWVsZFdpZHRoOyArK2opIHtcbiAgICAgICAgICAgIHR5cGUgPSAodHlwZSA8PCA4KSB8IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHR5cGUgZmllbGQgaXMgYWJzZW50LCBpdHMgZGVmYXVsdCB2YWx1ZSBpcyAxXG4gICAgICAgICAgaWYgKHR5cGVGaWVsZFdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICB0eXBlID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9mZnNldEZpZWxkV2lkdGg7ICsraikge1xuICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA8PCA4KSB8IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW5lcmF0aW9uRmllbGRXaWR0aDsgKytqKSB7XG4gICAgICAgICAgICBnZW5lcmF0aW9uID0gKGdlbmVyYXRpb24gPDwgOCkgfCBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZW50cnkgPSB7fTtcbiAgICAgICAgICBlbnRyeS5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgZW50cnkuZ2VuID0gZ2VuZXJhdGlvbjtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgZW50cnkuZnJlZSA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBlbnRyeS51bmNvbXByZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5lbnRyaWVzW2ZpcnN0ICsgaV0pIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1tmaXJzdCArIGldID0gZW50cnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtU3RhdGUuZW50cnlOdW0gPSAwO1xuICAgICAgICBzdHJlYW1TdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgICBlbnRyeVJhbmdlcy5zcGxpY2UoMCwgMik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGluZGV4T2JqZWN0czogZnVuY3Rpb24gWFJlZl9pbmRleE9iamVjdHMoKSB7XG4gICAgICAvLyBTaW1wbGUgc2NhbiB0aHJvdWdoIHRoZSBQREYgY29udGVudCB0byBmaW5kIG9iamVjdHMsXG4gICAgICAvLyB0cmFpbGVycyBhbmQgWFJlZiBzdHJlYW1zLlxuICAgICAgdmFyIFRBQiA9IDB4OSxcbiAgICAgICAgTEYgPSAweGEsXG4gICAgICAgIENSID0gMHhkLFxuICAgICAgICBTUEFDRSA9IDB4MjA7XG4gICAgICB2YXIgUEVSQ0VOVCA9IDB4MjUsXG4gICAgICAgIExUID0gMHgzYztcblxuICAgICAgZnVuY3Rpb24gcmVhZFRva2VuKGRhdGEsIG9mZnNldCkge1xuICAgICAgICB2YXIgdG9rZW4gPSBcIlwiLFxuICAgICAgICAgIGNoID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUiAmJiBjaCAhPT0gTFQpIHtcbiAgICAgICAgICBpZiAoKytvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b2tlbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICBjaCA9IGRhdGFbb2Zmc2V0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBza2lwVW50aWwoZGF0YSwgb2Zmc2V0LCB3aGF0KSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB3aGF0Lmxlbmd0aCxcbiAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHZhciBza2lwcGVkID0gMDtcbiAgICAgICAgLy8gZmluZGluZyBieXRlIHNlcXVlbmNlXG4gICAgICAgIHdoaWxlIChvZmZzZXQgPCBkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGRhdGFbb2Zmc2V0ICsgaV0gPT09IHdoYXRbaV0pIHtcbiAgICAgICAgICAgICsraTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhazsgLy8gc2VxdWVuY2UgZm91bmRcbiAgICAgICAgICB9XG4gICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgc2tpcHBlZCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBza2lwcGVkO1xuICAgICAgfVxuICAgICAgdmFyIG9ialJlZ0V4cCA9IC9eKFxcZCspXFxzKyhcXGQrKVxccytvYmpcXGIvO1xuICAgICAgY29uc3QgZW5kb2JqUmVnRXhwID0gL1xcYmVuZG9ialtcXGJcXHNdJC87XG4gICAgICBjb25zdCBuZXN0ZWRPYmpSZWdFeHAgPSAvXFxzKyhcXGQrXFxzK1xcZCtcXHMrb2JqW1xcYlxcczxdKSQvO1xuICAgICAgY29uc3QgQ0hFQ0tfQ09OVEVOVF9MRU5HVEggPSAyNTtcblxuICAgICAgdmFyIHRyYWlsZXJCeXRlcyA9IG5ldyBVaW50OEFycmF5KFsxMTYsIDExNCwgOTcsIDEwNSwgMTA4LCAxMDEsIDExNF0pO1xuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICB2YXIgc3RhcnR4cmVmQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE1LCAxMTYsIDk3LCAxMTQsIDExNiwgMTIwLCAxMTQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAxMDJdKTtcbiAgICAgIGNvbnN0IG9iakJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExMSwgOTgsIDEwNl0pO1xuICAgICAgdmFyIHhyZWZCeXRlcyA9IG5ldyBVaW50OEFycmF5KFs0NywgODgsIDgyLCAxMDEsIDEwMl0pO1xuXG4gICAgICAvLyBDbGVhciBvdXQgYW55IGV4aXN0aW5nIGVudHJpZXMsIHNpbmNlIHRoZXkgbWF5IGJlIGJvZ3VzLlxuICAgICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG5cbiAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbTtcbiAgICAgIHN0cmVhbS5wb3MgPSAwO1xuICAgICAgdmFyIGJ1ZmZlciA9IHN0cmVhbS5nZXRCeXRlcygpO1xuICAgICAgdmFyIHBvc2l0aW9uID0gc3RyZWFtLnN0YXJ0LFxuICAgICAgICBsZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICAgICAgdmFyIHRyYWlsZXJzID0gW10sXG4gICAgICAgIHhyZWZTdG1zID0gW107XG4gICAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGNoID0gYnVmZmVyW3Bvc2l0aW9uXTtcbiAgICAgICAgaWYgKGNoID09PSBUQUIgfHwgY2ggPT09IExGIHx8IGNoID09PSBDUiB8fCBjaCA9PT0gU1BBQ0UpIHtcbiAgICAgICAgICArK3Bvc2l0aW9uO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gUEVSQ0VOVCkge1xuICAgICAgICAgIC8vICUtY29tbWVudFxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICsrcG9zaXRpb247XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2ggPSBidWZmZXJbcG9zaXRpb25dO1xuICAgICAgICAgIH0gd2hpbGUgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b2tlbiA9IHJlYWRUb2tlbihidWZmZXIsIHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIG07XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0b2tlbi5zdGFydHNXaXRoKFwieHJlZlwiKSAmJlxuICAgICAgICAgICh0b2tlbi5sZW5ndGggPT09IDQgfHwgL1xccy8udGVzdCh0b2tlbls0XSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHBvc2l0aW9uICs9IHNraXBVbnRpbChidWZmZXIsIHBvc2l0aW9uLCB0cmFpbGVyQnl0ZXMpO1xuICAgICAgICAgIHRyYWlsZXJzLnB1c2gocG9zaXRpb24pO1xuICAgICAgICAgIHBvc2l0aW9uICs9IHNraXBVbnRpbChidWZmZXIsIHBvc2l0aW9uLCBzdGFydHhyZWZCeXRlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoKG0gPSBvYmpSZWdFeHAuZXhlYyh0b2tlbikpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gbVsxXSB8IDAsXG4gICAgICAgICAgICBnZW4gPSBtWzJdIHwgMDtcbiAgICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tudW1dIHx8IHRoaXMuZW50cmllc1tudW1dLmdlbiA9PT0gZ2VuKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNbbnVtXSA9IHtcbiAgICAgICAgICAgICAgb2Zmc2V0OiBwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCxcbiAgICAgICAgICAgICAgZ2VuLFxuICAgICAgICAgICAgICB1bmNvbXByZXNzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIHN0YXJ0UG9zID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGg7XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IFwib2JqXCIgc3RyaW5nLCByYXRoZXIgdGhhbiBcImVuZG9ialwiLCB0byBlbnN1cmUgdGhhdFxuICAgICAgICAgIC8vIHdlIHdvbid0IHNraXAgb3ZlciBhIG5ldyAnb2JqJyBvcGVyYXRvciBpbiBjb3JydXB0IGZpbGVzIHdoZXJlXG4gICAgICAgICAgLy8gJ2VuZG9iaicgb3BlcmF0b3JzIGFyZSBtaXNzaW5nIChmaXhlcyBpc3N1ZTkxMDVfcmVkdWNlZC5wZGYpLlxuICAgICAgICAgIHdoaWxlIChzdGFydFBvcyA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvcyA9IHN0YXJ0UG9zICsgc2tpcFVudGlsKGJ1ZmZlciwgc3RhcnRQb3MsIG9iakJ5dGVzKSArIDQ7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZW5kUG9zIC0gcG9zaXRpb247XG5cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrUG9zID0gTWF0aC5tYXgoZW5kUG9zIC0gQ0hFQ0tfQ09OVEVOVF9MRU5HVEgsIHN0YXJ0UG9zKTtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuU3RyID0gYnl0ZXNUb1N0cmluZyhidWZmZXIuc3ViYXJyYXkoY2hlY2tQb3MsIGVuZFBvcykpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBvYmplY3QgZW5kcyB3aXRoIGFuICdlbmRvYmonIG9wZXJhdG9yLlxuICAgICAgICAgICAgaWYgKGVuZG9ialJlZ0V4cC50ZXN0KHRva2VuU3RyKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuIFwib2JqXCIgb2NjdXJyZW5jZSBpcyBhY3R1YWxseSBhIG5ldyBvYmplY3QsXG4gICAgICAgICAgICAgIC8vIGkuZS4gdGhlIGN1cnJlbnQgb2JqZWN0IGlzIG1pc3NpbmcgdGhlICdlbmRvYmonIG9wZXJhdG9yLlxuICAgICAgICAgICAgICBjb25zdCBvYmpUb2tlbiA9IG5lc3RlZE9ialJlZ0V4cC5leGVjKHRva2VuU3RyKTtcblxuICAgICAgICAgICAgICBpZiAob2JqVG9rZW4gJiYgb2JqVG9rZW5bMV0pIHtcbiAgICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICAgJ2luZGV4T2JqZWN0czogRm91bmQgbmV3IFwib2JqXCIgaW5zaWRlIG9mIGFub3RoZXIgXCJvYmpcIiwgJyArXG4gICAgICAgICAgICAgICAgICAgICdjYXVzZWQgYnkgbWlzc2luZyBcImVuZG9ialwiIC0tIHRyeWluZyB0byByZWNvdmVyLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggLT0gb2JqVG9rZW5bMV0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydFBvcyA9IGVuZFBvcztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGJ1ZmZlci5zdWJhcnJheShwb3NpdGlvbiwgcG9zaXRpb24gKyBjb250ZW50TGVuZ3RoKTtcblxuICAgICAgICAgIC8vIGNoZWNraW5nIFhSZWYgc3RyZWFtIHN1c3BlY3RcbiAgICAgICAgICAvLyAoaXQgc2hhbGwgaGF2ZSAnL1hSZWYnIGFuZCBuZXh0IGNoYXIgaXMgbm90IGEgbGV0dGVyKVxuICAgICAgICAgIHZhciB4cmVmVGFnT2Zmc2V0ID0gc2tpcFVudGlsKGNvbnRlbnQsIDAsIHhyZWZCeXRlcyk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgeHJlZlRhZ09mZnNldCA8IGNvbnRlbnRMZW5ndGggJiZcbiAgICAgICAgICAgIGNvbnRlbnRbeHJlZlRhZ09mZnNldCArIDVdIDwgNjRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHhyZWZTdG1zLnB1c2gocG9zaXRpb24gLSBzdHJlYW0uc3RhcnQpO1xuICAgICAgICAgICAgdGhpcy54cmVmc3Rtc1twb3NpdGlvbiAtIHN0cmVhbS5zdGFydF0gPSAxOyAvLyBBdm9pZCByZWN1cnNpb25cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwb3NpdGlvbiArPSBjb250ZW50TGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRva2VuLnN0YXJ0c1dpdGgoXCJ0cmFpbGVyXCIpICYmXG4gICAgICAgICAgKHRva2VuLmxlbmd0aCA9PT0gNyB8fCAvXFxzLy50ZXN0KHRva2VuWzddKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHN0YXJ0eHJlZkJ5dGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwb3NpdGlvbiArPSB0b2tlbi5sZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyByZWFkaW5nIFhSZWYgc3RyZWFtc1xuICAgICAgdmFyIGksIGlpO1xuICAgICAgZm9yIChpID0gMCwgaWkgPSB4cmVmU3Rtcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaCh4cmVmU3Rtc1tpXSk7XG4gICAgICAgIHRoaXMucmVhZFhSZWYoLyogcmVjb3ZlcnlNb2RlICovIHRydWUpO1xuICAgICAgfVxuICAgICAgLy8gZmluZGluZyBtYWluIHRyYWlsZXJcbiAgICAgIGxldCB0cmFpbGVyRGljdDtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gdHJhaWxlcnMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICBzdHJlYW0ucG9zID0gdHJhaWxlcnNbaV07XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoe1xuICAgICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSxcbiAgICAgICAgICB4cmVmOiB0aGlzLFxuICAgICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSxcbiAgICAgICAgICByZWNvdmVyeU1vZGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgb2JqID0gcGFyc2VyLmdldE9iaigpO1xuICAgICAgICBpZiAoIWlzQ21kKG9iaiwgXCJ0cmFpbGVyXCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZCB0aGUgdHJhaWxlciBkaWN0aW9uYXJ5XG4gICAgICAgIGNvbnN0IGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7XG4gICAgICAgIGlmICghaXNEaWN0KGRpY3QpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gc29tZSBiYXNpYyB2YWxpZGF0aW9uIG9mIHRoZSB0cmFpbGVyL3Jvb3QgZGljdGlvbmFyeSBjYW5kaWRhdGUuXG4gICAgICAgIGxldCByb290RGljdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByb290RGljdCA9IGRpY3QuZ2V0KFwiUm9vdFwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEaWN0KHJvb3REaWN0KSB8fCAhcm9vdERpY3QuaGFzKFwiUGFnZXNcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0YWtpbmcgdGhlIGZpcnN0IG9uZSB3aXRoICdJRCdcbiAgICAgICAgaWYgKGRpY3QuaGFzKFwiSURcIikpIHtcbiAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgY3VycmVudCBkaWN0aW9uYXJ5IGlzIGEgY2FuZGlkYXRlLCBidXQgY29udGludWUgc2VhcmNoaW5nLlxuICAgICAgICB0cmFpbGVyRGljdCA9IGRpY3Q7XG4gICAgICB9XG4gICAgICAvLyBObyB0cmFpbGVyIHdpdGggJ0lEJywgdGFraW5nIGxhc3Qgb25lIChpZiBleGlzdHMpLlxuICAgICAgaWYgKHRyYWlsZXJEaWN0KSB7XG4gICAgICAgIHJldHVybiB0cmFpbGVyRGljdDtcbiAgICAgIH1cbiAgICAgIC8vIG5vdGhpbmcgaGVscHNcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKFwiSW52YWxpZCBQREYgc3RydWN0dXJlLlwiKTtcbiAgICB9LFxuXG4gICAgcmVhZFhSZWY6IGZ1bmN0aW9uIFhSZWZfcmVhZFhSZWYocmVjb3ZlcnlNb2RlKSB7XG4gICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIGFscmVhZHkgcGFyc2VkIFhSZWYgdGFibGVzLCB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3BcbiAgICAgIC8vIHdoZW4gcGFyc2luZyBjb3JydXB0IFBERiBmaWxlcyB3aGVyZSBlLmcuIHRoZSAvUHJldiBlbnRyaWVzIGNyZWF0ZSBhXG4gICAgICAvLyBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGFibGVzIChmaXhlcyBidWcxMzkzNDc2LnBkZikuXG4gICAgICBjb25zdCBzdGFydFhSZWZQYXJzZWRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YXJ0WFJlZlF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBzdGFydFhSZWYgPSB0aGlzLnN0YXJ0WFJlZlF1ZXVlWzBdO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0WFJlZlBhcnNlZENhY2hlW3N0YXJ0WFJlZl0pIHtcbiAgICAgICAgICAgIHdhcm4oXCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLlwiKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFydFhSZWZQYXJzZWRDYWNoZVtzdGFydFhSZWZdID0gdHJ1ZTtcblxuICAgICAgICAgIHN0cmVhbS5wb3MgPSBzdGFydFhSZWYgKyBzdHJlYW0uc3RhcnQ7XG5cbiAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcbiAgICAgICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSxcbiAgICAgICAgICAgIHhyZWY6IHRoaXMsXG4gICAgICAgICAgICBhbGxvd1N0cmVhbXM6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIG9iaiA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgICAgICB2YXIgZGljdDtcblxuICAgICAgICAgIC8vIEdldCBkaWN0aW9uYXJ5XG4gICAgICAgICAgaWYgKGlzQ21kKG9iaiwgXCJ4cmVmXCIpKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSBlbmQtb2YtZmlsZSBYUmVmXG4gICAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlRhYmxlKHBhcnNlcik7XG4gICAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkge1xuICAgICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBnZXQgb3RoZXIgWFJlZnMgJ1hSZWZTdG0nLCBpZiBhbnlcbiAgICAgICAgICAgIG9iaiA9IGRpY3QuZ2V0KFwiWFJlZlN0bVwiKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHtcbiAgICAgICAgICAgICAgdmFyIHBvcyA9IG9iajtcbiAgICAgICAgICAgICAgLy8gaWdub3JlIHByZXZpb3VzbHkgbG9hZGVkIHhyZWYgc3RyZWFtc1xuICAgICAgICAgICAgICAvLyAocG9zc2libGUgaW5maW5pdGUgcmVjdXJzaW9uKVxuICAgICAgICAgICAgICBpZiAoIShwb3MgaW4gdGhpcy54cmVmc3RtcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnhyZWZzdG1zW3Bvc10gPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChwb3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGluLXN0cmVhbSBYUmVmXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlci5nZXRPYmooKSkgfHxcbiAgICAgICAgICAgICAgIWlzQ21kKHBhcnNlci5nZXRPYmooKSwgXCJvYmpcIikgfHxcbiAgICAgICAgICAgICAgIWlzU3RyZWFtKChvYmogPSBwYXJzZXIuZ2V0T2JqKCkpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkludmFsaWQgWFJlZiBzdHJlYW1cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlN0cmVhbShvYmopO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRvcERpY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy50b3BEaWN0ID0gZGljdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGljdCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJGYWlsZWQgdG8gcmVhZCBYUmVmIHN0cmVhbVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBYUmVmIHN0cmVhbSBoZWFkZXJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZ2V0IHByZXZpb3VzIGRpY3Rpb25hcnksIGlmIGFueVxuICAgICAgICAgIG9iaiA9IGRpY3QuZ2V0KFwiUHJldlwiKTtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVmKG9iaikpIHtcbiAgICAgICAgICAgIC8vIFRoZSBzcGVjIHNheXMgUHJldiBtdXN0IG5vdCBiZSBhIHJlZmVyZW5jZSwgaS5lLiBcIi9QcmV2IE5OTlwiXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgZmFsbGJhY2sgZm9yIG5vbi1jb21wbGlhbnQgUERGcywgaS5lLiBcIi9QcmV2IE5OTiAwIFJcIlxuICAgICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKG9iai5udW0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRvcERpY3Q7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8oXCIod2hpbGUgcmVhZGluZyBYUmVmKTogXCIgKyBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY292ZXJ5TW9kZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpO1xuICAgIH0sXG5cbiAgICBnZXRFbnRyeTogZnVuY3Rpb24gWFJlZl9nZXRFbnRyeShpKSB7XG4gICAgICB2YXIgeHJlZkVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldO1xuICAgICAgaWYgKHhyZWZFbnRyeSAmJiAheHJlZkVudHJ5LmZyZWUgJiYgeHJlZkVudHJ5Lm9mZnNldCkge1xuICAgICAgICByZXR1cm4geHJlZkVudHJ5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIGZldGNoSWZSZWY6IGZ1bmN0aW9uIFhSZWZfZmV0Y2hJZlJlZihvYmosIHN1cHByZXNzRW5jcnlwdGlvbikge1xuICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChvYmosIHN1cHByZXNzRW5jcnlwdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICBmZXRjaDogZnVuY3Rpb24gWFJlZl9mZXRjaChyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikge1xuICAgICAgaWYgKCEocmVmIGluc3RhbmNlb2YgUmVmKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG51bSA9IHJlZi5udW07XG5cbiAgICAgIC8vIFRoZSBYUmVmIGNhY2hlIGlzIHBvcHVsYXRlZCB3aXRoIG9iamVjdHMgd2hpY2ggYXJlIG9idGFpbmVkIHRocm91Z2hcbiAgICAgIC8vIGBQYXJzZXIuZ2V0T2JqYCwgYW5kIGluZGlyZWN0bHkgdmlhIGBMZXhlci5nZXRPYmpgLiBOZWl0aGVyIG9mIHRoZXNlXG4gICAgICAvLyBtZXRob2RzIHNob3VsZCBldmVyIHJldHVybiBgdW5kZWZpbmVkYCAobm90ZSB0aGUgYGFzc2VydGAgY2FsbHMgYmVsb3cpLlxuICAgICAgY29uc3QgY2FjaGVFbnRyeSA9IHRoaXMuX2NhY2hlTWFwLmdldChudW0pO1xuICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBJbiBkb2N1bWVudHMgd2l0aCBPYmplY3QgU3RyZWFtcywgaXQncyBwb3NzaWJsZSB0aGF0IGNhY2hlZCBgRGljdGBzXG4gICAgICAgIC8vIGhhdmUgbm90IGJlZW4gYXNzaWduZWQgYW4gYG9iaklkYCB5ZXQgKHNlZSBlLmcuIGlzc3VlMzExNXIucGRmKS5cbiAgICAgICAgaWYgKGNhY2hlRW50cnkgaW5zdGFuY2VvZiBEaWN0ICYmICFjYWNoZUVudHJ5Lm9iaklkKSB7XG4gICAgICAgICAgY2FjaGVFbnRyeS5vYmpJZCA9IHJlZi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZUVudHJ5O1xuICAgICAgfVxuICAgICAgbGV0IHhyZWZFbnRyeSA9IHRoaXMuZ2V0RW50cnkobnVtKTtcblxuICAgICAgaWYgKHhyZWZFbnRyeSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgcmVmZXJlbmNlZCBlbnRyeSBjYW4gYmUgZnJlZS5cbiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgeHJlZkVudHJ5KTtcbiAgICAgICAgcmV0dXJuIHhyZWZFbnRyeTtcbiAgICAgIH1cblxuICAgICAgaWYgKHhyZWZFbnRyeS51bmNvbXByZXNzZWQpIHtcbiAgICAgICAgeHJlZkVudHJ5ID0gdGhpcy5mZXRjaFVuY29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhyZWZFbnRyeSA9IHRoaXMuZmV0Y2hDb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGljdCh4cmVmRW50cnkpKSB7XG4gICAgICAgIHhyZWZFbnRyeS5vYmpJZCA9IHJlZi50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChpc1N0cmVhbSh4cmVmRW50cnkpKSB7XG4gICAgICAgIHhyZWZFbnRyeS5kaWN0Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geHJlZkVudHJ5O1xuICAgIH0sXG5cbiAgICBmZXRjaFVuY29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHtcbiAgICAgIHZhciBnZW4gPSByZWYuZ2VuO1xuICAgICAgdmFyIG51bSA9IHJlZi5udW07XG4gICAgICBpZiAoeHJlZkVudHJ5LmdlbiAhPT0gZ2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEluY29uc2lzdGVudCBnZW5lcmF0aW9uIGluIFhSZWY6ICR7cmVmfWApO1xuICAgICAgfVxuICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0oXG4gICAgICAgIHhyZWZFbnRyeS5vZmZzZXQgKyB0aGlzLnN0cmVhbS5zdGFydFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoe1xuICAgICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksXG4gICAgICAgIHhyZWY6IHRoaXMsXG4gICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdmFyIG9iajEgPSBwYXJzZXIuZ2V0T2JqKCk7XG4gICAgICB2YXIgb2JqMiA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgIHZhciBvYmozID0gcGFyc2VyLmdldE9iaigpO1xuXG4gICAgICBpZiAob2JqMSAhPT0gbnVtIHx8IG9iajIgIT09IGdlbiB8fCAhKG9iajMgaW5zdGFuY2VvZiBDbWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChvYmozLmNtZCAhPT0gXCJvYmpcIikge1xuICAgICAgICAvLyBzb21lIGJhZCBQREZzIHVzZSBcIm9iajEyMzRcIiBhbmQgcmVhbGx5IG1lYW4gMTIzNFxuICAgICAgICBpZiAob2JqMy5jbWQuc3RhcnRzV2l0aChcIm9ialwiKSkge1xuICAgICAgICAgIG51bSA9IHBhcnNlSW50KG9iajMuY21kLnN1YnN0cmluZygzKSwgMTApO1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVuY3J5cHQgJiYgIXN1cHByZXNzRW5jcnlwdGlvbikge1xuICAgICAgICB4cmVmRW50cnkgPSBwYXJzZXIuZ2V0T2JqKHRoaXMuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhyZWZFbnRyeSA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTdHJlYW0oeHJlZkVudHJ5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgeHJlZkVudHJ5ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAnZmV0Y2hVbmNvbXByZXNzZWQ6IFRoZSBcInhyZWZFbnRyeVwiIGNhbm5vdCBiZSB1bmRlZmluZWQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgeHJlZkVudHJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4cmVmRW50cnk7XG4gICAgfSxcblxuICAgIGZldGNoQ29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHRhYmxlT2Zmc2V0ID0geHJlZkVudHJ5Lm9mZnNldDtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuZmV0Y2goUmVmLmdldCh0YWJsZU9mZnNldCwgMCkpO1xuICAgICAgaWYgKCFpc1N0cmVhbShzdHJlYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcImJhZCBPYmpTdG0gc3RyZWFtXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3QgPSBzdHJlYW0uZGljdC5nZXQoXCJGaXJzdFwiKTtcbiAgICAgIGNvbnN0IG4gPSBzdHJlYW0uZGljdC5nZXQoXCJOXCIpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgXCJpbnZhbGlkIGZpcnN0IGFuZCBuIHBhcmFtZXRlcnMgZm9yIE9ialN0bSBzdHJlYW1cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XG4gICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSxcbiAgICAgICAgeHJlZjogdGhpcyxcbiAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBudW1zID0gbmV3IEFycmF5KG4pO1xuICAgICAgLy8gcmVhZCB0aGUgb2JqZWN0IG51bWJlcnMgdG8gcG9wdWxhdGUgY2FjaGVcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICBgaW52YWxpZCBvYmplY3QgbnVtYmVyIGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke251bX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvZmZzZXQgPSBwYXJzZXIuZ2V0T2JqKCk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvZmZzZXQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgYGludmFsaWQgb2JqZWN0IG9mZnNldCBpbiB0aGUgT2JqU3RtIHN0cmVhbTogJHtvZmZzZXR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbnVtc1tpXSA9IG51bTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgQXJyYXkobik7XG4gICAgICAvLyByZWFkIHN0cmVhbSBvYmplY3RzIGZvciBjYWNoZVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gcGFyc2VyLmdldE9iaigpO1xuICAgICAgICBlbnRyaWVzW2ldID0gb2JqO1xuICAgICAgICAvLyBUaGUgT2JqU3RtIHNob3VsZCBub3QgY29udGFpbiAnZW5kb2JqJy4gSWYgaXQncyBwcmVzZW50LCBza2lwIG92ZXIgaXRcbiAgICAgICAgLy8gdG8gc3VwcG9ydCBjb3JydXB0IFBERnMgKGZpeGVzIGlzc3VlIDUyNDEsIGJ1ZyA4OTg2MTAsIGJ1ZyAxMDM3ODE2KS5cbiAgICAgICAgaWYgKHBhcnNlci5idWYxIGluc3RhbmNlb2YgQ21kICYmIHBhcnNlci5idWYxLmNtZCA9PT0gXCJlbmRvYmpcIikge1xuICAgICAgICAgIHBhcnNlci5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cmVhbShvYmopKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbnVtID0gbnVtc1tpXSxcbiAgICAgICAgICBlbnRyeSA9IHRoaXMuZW50cmllc1tudW1dO1xuICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkub2Zmc2V0ID09PSB0YWJsZU9mZnNldCAmJiBlbnRyeS5nZW4gPT09IGkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIG9iaiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAnZmV0Y2hDb21wcmVzc2VkOiBUaGUgXCJvYmpcIiBjYW5ub3QgYmUgdW5kZWZpbmVkLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIG9iaik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHhyZWZFbnRyeSA9IGVudHJpZXNbeHJlZkVudHJ5Lmdlbl07XG4gICAgICBpZiAoeHJlZkVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFhSZWZFbnRyeUV4Y2VwdGlvbihgQmFkIChjb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4cmVmRW50cnk7XG4gICAgfSxcblxuICAgIGFzeW5jIGZldGNoSWZSZWZBc3luYyhvYmosIHN1cHByZXNzRW5jcnlwdGlvbikge1xuICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEFzeW5jKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcblxuICAgIGFzeW5jIGZldGNoQXN5bmMocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pKSB7XG4gICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLnJlcXVlc3RSYW5nZShleC5iZWdpbiwgZXguZW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hBc3luYyhyZWYsIHN1cHByZXNzRW5jcnlwdGlvbik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldENhdGFsb2dPYmo6IGZ1bmN0aW9uIFhSZWZfZ2V0Q2F0YWxvZ09iaigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gWFJlZjtcbn0pKCk7XG5cbi8qKlxuICogQSBOYW1lVHJlZS9OdW1iZXJUcmVlIGlzIGxpa2UgYSBEaWN0IGJ1dCBoYXMgc29tZSBhZHZhbnRhZ2VvdXMgcHJvcGVydGllcyxcbiAqIHNlZSB0aGUgc3BlY2lmaWNhdGlvbiAoNy45LjYgYW5kIDcuOS43KSBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxuICogVE9ETzogaW1wbGVtZW50IGFsbCB0aGUgRGljdCBmdW5jdGlvbnMgYW5kIG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudC5cbiAqL1xuY2xhc3MgTmFtZU9yTnVtYmVyVHJlZSB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYsIHR5cGUpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gTmFtZU9yTnVtYmVyVHJlZSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBOYW1lT3JOdW1iZXJUcmVlLlwiKTtcbiAgICB9XG4gICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICB0aGlzLnhyZWYgPSB4cmVmO1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgZ2V0QWxsKCkge1xuICAgIGNvbnN0IGRpY3QgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICByZXR1cm4gZGljdDtcbiAgICB9XG4gICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjtcbiAgICAvLyBSZWFkaW5nIE5hbWUvTnVtYmVyIHRyZWUuXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldCgpO1xuICAgIHByb2Nlc3NlZC5wdXQodGhpcy5yb290KTtcbiAgICBjb25zdCBxdWV1ZSA9IFt0aGlzLnJvb3RdO1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvYmogPSB4cmVmLmZldGNoSWZSZWYocXVldWUuc2hpZnQoKSk7XG4gICAgICBpZiAoIWlzRGljdChvYmopKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5oYXMoXCJLaWRzXCIpKSB7XG4gICAgICAgIGNvbnN0IGtpZHMgPSBvYmouZ2V0KFwiS2lkc1wiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0ga2lkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qga2lkID0ga2lkc1tpXTtcbiAgICAgICAgICBpZiAocHJvY2Vzc2VkLmhhcyhraWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYER1cGxpY2F0ZSBlbnRyeSBpbiBcIiR7dGhpcy5fdHlwZX1cIiB0cmVlLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxdWV1ZS5wdXNoKGtpZCk7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1dChraWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZW50cmllcyA9IG9iai5nZXQodGhpcy5fdHlwZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBkaWN0W3hyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW2ldKV0gPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tpICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWN0O1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjtcbiAgICBsZXQga2lkc09yRW50cmllcyA9IHhyZWYuZmV0Y2hJZlJlZih0aGlzLnJvb3QpO1xuICAgIGxldCBsb29wQ291bnQgPSAwO1xuICAgIGNvbnN0IE1BWF9MRVZFTFMgPSAxMDtcblxuICAgIC8vIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIHRvIHF1aWNrbHkgZmluZCB0aGUgZW50cnkgdGhhdFxuICAgIC8vIGNvbnRhaW5zIHRoZSBrZXkgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgIHdoaWxlIChraWRzT3JFbnRyaWVzLmhhcyhcIktpZHNcIikpIHtcbiAgICAgIGlmICgrK2xvb3BDb3VudCA+IE1BWF9MRVZFTFMpIHtcbiAgICAgICAgd2FybihgU2VhcmNoIGRlcHRoIGxpbWl0IHJlYWNoZWQgZm9yIFwiJHt0aGlzLl90eXBlfVwiIHRyZWUuYCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBraWRzID0ga2lkc09yRW50cmllcy5nZXQoXCJLaWRzXCIpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBsZXQgbCA9IDAsXG4gICAgICAgIHIgPSBraWRzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAobCA8PSByKSB7XG4gICAgICAgIGNvbnN0IG0gPSAobCArIHIpID4+IDE7XG4gICAgICAgIGNvbnN0IGtpZCA9IHhyZWYuZmV0Y2hJZlJlZihraWRzW21dKTtcbiAgICAgICAgY29uc3QgbGltaXRzID0ga2lkLmdldChcIkxpbWl0c1wiKTtcblxuICAgICAgICBpZiAoa2V5IDwgeHJlZi5mZXRjaElmUmVmKGxpbWl0c1swXSkpIHtcbiAgICAgICAgICByID0gbSAtIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID4geHJlZi5mZXRjaElmUmVmKGxpbWl0c1sxXSkpIHtcbiAgICAgICAgICBsID0gbSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2lkc09yRW50cmllcyA9IHhyZWYuZmV0Y2hJZlJlZihraWRzW21dKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGwgPiByKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGdldCBoZXJlLCB0aGVuIHdlIGhhdmUgZm91bmQgdGhlIHJpZ2h0IGVudHJ5LiBOb3cgZ28gdGhyb3VnaCB0aGVcbiAgICAvLyBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5IHVudGlsIHdlIGZpbmQgdGhlIGtleSB3ZSdyZSBsb29raW5nIGZvci5cbiAgICBjb25zdCBlbnRyaWVzID0ga2lkc09yRW50cmllcy5nZXQodGhpcy5fdHlwZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cmllcykpIHtcbiAgICAgIC8vIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIHRvIHJlZHVjZSB0aGUgbG9va3VwIHRpbWUuXG4gICAgICBsZXQgbCA9IDAsXG4gICAgICAgIHIgPSBlbnRyaWVzLmxlbmd0aCAtIDI7XG4gICAgICB3aGlsZSAobCA8PSByKSB7XG4gICAgICAgIC8vIENoZWNrIG9ubHkgZXZlbiBpbmRpY2VzICgwLCAyLCA0LCAuLi4pIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIG9kZCBpbmRpY2VzIGNvbnRhaW4gdGhlIGFjdHVhbCBkYXRhLlxuICAgICAgICBjb25zdCB0bXAgPSAobCArIHIpID4+IDEsXG4gICAgICAgICAgbSA9IHRtcCArICh0bXAgJiAxKTtcbiAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW21dKTtcbiAgICAgICAgaWYgKGtleSA8IGN1cnJlbnRLZXkpIHtcbiAgICAgICAgICByID0gbSAtIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID4gY3VycmVudEtleSkge1xuICAgICAgICAgIGwgPSBtICsgMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geHJlZi5mZXRjaElmUmVmKGVudHJpZXNbbSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjayB0byBhbiBleGhhdXN0aXZlIHNlYXJjaCwgaW4gYW4gYXR0ZW1wdCB0byBoYW5kbGUgY29ycnVwdFxuICAgICAgLy8gUERGIGZpbGVzIHdoZXJlIGtleXMgYXJlIG5vdCBjb3JyZWN0bHkgb3JkZXJlZCAoZml4ZXMgaXNzdWUgMTAyNzIpLlxuICAgICAgaW5mbyhcbiAgICAgICAgYEZhbGxpbmcgYmFjayB0byBhbiBleGhhdXN0aXZlIHNlYXJjaCwgZm9yIGtleSBcIiR7a2V5fVwiLCBgICtcbiAgICAgICAgICBgaW4gXCIke3RoaXMuX3R5cGV9XCIgdHJlZS5gXG4gICAgICApO1xuICAgICAgZm9yIChsZXQgbSA9IDAsIG1tID0gZW50cmllcy5sZW5ndGg7IG0gPCBtbTsgbSArPSAyKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttXSk7XG4gICAgICAgIGlmIChjdXJyZW50S2V5ID09PSBrZXkpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYFRoZSBcIiR7a2V5fVwiIGtleSB3YXMgZm91bmQgYXQgYW4gaW5jb3JyZWN0LCBgICtcbiAgICAgICAgICAgICAgYGkuZS4gb3V0LW9mLW9yZGVyLCBwb3NpdGlvbiBpbiBcIiR7dGhpcy5fdHlwZX1cIiB0cmVlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmNsYXNzIE5hbWVUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZSB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYpIHtcbiAgICBzdXBlcihyb290LCB4cmVmLCBcIk5hbWVzXCIpO1xuICB9XG59XG5cbmNsYXNzIE51bWJlclRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVlIHtcbiAgY29uc3RydWN0b3Iocm9vdCwgeHJlZikge1xuICAgIHN1cGVyKHJvb3QsIHhyZWYsIFwiTnVtc1wiKTtcbiAgfVxufVxuXG4vKipcbiAqIFwiQSBQREYgZmlsZSBjYW4gcmVmZXIgdG8gdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgZmlsZSBieSB1c2luZyBhIEZpbGVcbiAqIFNwZWNpZmljYXRpb24gKFBERiAxLjEpXCIsIHNlZSB0aGUgc3BlYyAoNy4xMSkgZm9yIG1vcmUgZGV0YWlscy5cbiAqIE5PVEU6IE9ubHkgZW1iZWRkZWQgZmlsZXMgYXJlIHN1cHBvcnRlZCAoYXMgcGFydCBvZiB0aGUgYXR0YWNobWVudHMgc3VwcG9ydClcbiAqIFRPRE86IHN1cHBvcnQgdGhlICdVUkwnIGZpbGUgc3lzdGVtICh3aXRoIGNhY2hpbmcgaWYgIS9WKSwgcG9ydGFibGVcbiAqIGNvbGxlY3Rpb25zIGF0dHJpYnV0ZXMgYW5kIHJlbGF0ZWQgZmlsZXMgKC9SRilcbiAqL1xudmFyIEZpbGVTcGVjID0gKGZ1bmN0aW9uIEZpbGVTcGVjQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBGaWxlU3BlYyhyb290LCB4cmVmKSB7XG4gICAgaWYgKCFyb290IHx8ICFpc0RpY3Qocm9vdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy54cmVmID0geHJlZjtcbiAgICB0aGlzLnJvb3QgPSByb290O1xuICAgIGlmIChyb290LmhhcyhcIkZTXCIpKSB7XG4gICAgICB0aGlzLmZzID0gcm9vdC5nZXQoXCJGU1wiKTtcbiAgICB9XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHJvb3QuaGFzKFwiRGVzY1wiKVxuICAgICAgPyBzdHJpbmdUb1BERlN0cmluZyhyb290LmdldChcIkRlc2NcIikpXG4gICAgICA6IFwiXCI7XG4gICAgaWYgKHJvb3QuaGFzKFwiUkZcIikpIHtcbiAgICAgIHdhcm4oXCJSZWxhdGVkIGZpbGUgc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IHRydWU7XG4gICAgaWYgKCFyb290LmhhcyhcIkVGXCIpKSB7XG4gICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSBmYWxzZTtcbiAgICAgIHdhcm4oXCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwaWNrUGxhdGZvcm1JdGVtKGRpY3QpIHtcbiAgICAvLyBMb29rIGZvciB0aGUgZmlsZW5hbWUgaW4gdGhpcyBvcmRlcjpcbiAgICAvLyBVRiwgRiwgVW5peCwgTWFjLCBET1NcbiAgICBpZiAoZGljdC5oYXMoXCJVRlwiKSkge1xuICAgICAgcmV0dXJuIGRpY3QuZ2V0KFwiVUZcIik7XG4gICAgfSBlbHNlIGlmIChkaWN0LmhhcyhcIkZcIikpIHtcbiAgICAgIHJldHVybiBkaWN0LmdldChcIkZcIik7XG4gICAgfSBlbHNlIGlmIChkaWN0LmhhcyhcIlVuaXhcIikpIHtcbiAgICAgIHJldHVybiBkaWN0LmdldChcIlVuaXhcIik7XG4gICAgfSBlbHNlIGlmIChkaWN0LmhhcyhcIk1hY1wiKSkge1xuICAgICAgcmV0dXJuIGRpY3QuZ2V0KFwiTWFjXCIpO1xuICAgIH0gZWxzZSBpZiAoZGljdC5oYXMoXCJET1NcIikpIHtcbiAgICAgIHJldHVybiBkaWN0LmdldChcIkRPU1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBGaWxlU3BlYy5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IGZpbGVuYW1lKCkge1xuICAgICAgaWYgKCF0aGlzLl9maWxlbmFtZSAmJiB0aGlzLnJvb3QpIHtcbiAgICAgICAgdmFyIGZpbGVuYW1lID0gcGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QpIHx8IFwidW5uYW1lZFwiO1xuICAgICAgICB0aGlzLl9maWxlbmFtZSA9IHN0cmluZ1RvUERGU3RyaW5nKGZpbGVuYW1lKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXFxcXC9nLCBcIlxcXFxcIilcbiAgICAgICAgICAucmVwbGFjZSgvXFxcXFxcLy9nLCBcIi9cIilcbiAgICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgfSxcbiAgICBnZXQgY29udGVudCgpIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50QXZhaWxhYmxlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRSZWYgJiYgdGhpcy5yb290KSB7XG4gICAgICAgIHRoaXMuY29udGVudFJlZiA9IHBpY2tQbGF0Zm9ybUl0ZW0odGhpcy5yb290LmdldChcIkVGXCIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjb250ZW50ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWYpIHtcbiAgICAgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7XG4gICAgICAgIHZhciBmaWxlT2JqID0geHJlZi5mZXRjaElmUmVmKHRoaXMuY29udGVudFJlZik7XG4gICAgICAgIGlmIChmaWxlT2JqICYmIGlzU3RyZWFtKGZpbGVPYmopKSB7XG4gICAgICAgICAgY29udGVudCA9IGZpbGVPYmouZ2V0Qnl0ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gcG9pbnRzIHRvIG5vbi1leGlzdGluZy9pbnZhbGlkIFwiICtcbiAgICAgICAgICAgICAgXCJjb250ZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFwiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSxcbiAgICBnZXQgc2VyaWFsaXphYmxlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIEZpbGVTcGVjO1xufSkoKTtcblxuLyoqXG4gKiBBIGhlbHBlciBmb3IgbG9hZGluZyBtaXNzaW5nIGRhdGEgaW4gYERpY3RgIGdyYXBocy4gSXQgdHJhdmVyc2VzIHRoZSBncmFwaFxuICogZGVwdGggZmlyc3QgYW5kIHF1ZXVlcyB1cCBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgbWlzc2luZyBkYXRhLiBPbmNlIGl0IGhhc1xuICogaGFzIHRyYXZlcnNlZCBhcyBtYW55IG9iamVjdHMgdGhhdCBhcmUgYXZhaWxhYmxlIGl0IGF0dGVtcHRzIHRvIGJ1bmRsZSB0aGVcbiAqIG1pc3NpbmcgZGF0YSByZXF1ZXN0cyBhbmQgdGhlbiByZXN1bWUgZnJvbSB0aGUgbm9kZXMgdGhhdCB3ZXJlbid0IHJlYWR5LlxuICpcbiAqIE5PVEU6IEl0IHByb3ZpZGVzIHByb3RlY3Rpb24gZnJvbSBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGtlZXBpbmcgdHJhY2sgb2ZcbiAqIGxvYWRlZCByZWZlcmVuY2VzLiBIb3dldmVyLCB5b3UgbXVzdCBiZSBjYXJlZnVsIG5vdCB0byBsb2FkIGFueSBncmFwaHNcbiAqIHRoYXQgaGF2ZSByZWZlcmVuY2VzIHRvIHRoZSBjYXRhbG9nIG9yIG90aGVyIHBhZ2VzIHNpbmNlIHRoYXQgd2lsbCBjYXVzZSB0aGVcbiAqIGVudGlyZSBQREYgZG9jdW1lbnQgb2JqZWN0IGdyYXBoIHRvIGJlIHRyYXZlcnNlZC5cbiAqL1xuY29uc3QgT2JqZWN0TG9hZGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gbWF5SGF2ZUNoaWxkcmVuKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgUmVmIHx8XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIERpY3QgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8XG4gICAgICBpc1N0cmVhbSh2YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkQ2hpbGRyZW4obm9kZSwgbm9kZXNUb1Zpc2l0KSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBEaWN0KSB7XG4gICAgICBub2RlID0gbm9kZS5nZXRSYXdWYWx1ZXMoKTtcbiAgICB9IGVsc2UgaWYgKGlzU3RyZWFtKG5vZGUpKSB7XG4gICAgICBub2RlID0gbm9kZS5kaWN0LmdldFJhd1ZhbHVlcygpO1xuICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCByYXdWYWx1ZSBvZiBub2RlKSB7XG4gICAgICBpZiAobWF5SGF2ZUNoaWxkcmVuKHJhd1ZhbHVlKSkge1xuICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChyYXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBPYmplY3RMb2FkZXIoZGljdCwga2V5cywgeHJlZikge1xuICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgdGhpcy5rZXlzID0ga2V5cztcbiAgICB0aGlzLnhyZWYgPSB4cmVmO1xuICAgIHRoaXMucmVmU2V0ID0gbnVsbDtcbiAgfVxuXG4gIE9iamVjdExvYWRlci5wcm90b3R5cGUgPSB7XG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgIC8vIERvbid0IHdhbGsgdGhlIGdyYXBoIGlmIGFsbCB0aGUgZGF0YSBpcyBhbHJlYWR5IGxvYWRlZDsgbm90ZSB0aGF0IG9ubHlcbiAgICAgIC8vIGBDaHVua2VkU3RyZWFtYCBpbnN0YW5jZXMgaGF2ZSBhIGBhbGxDaHVua3NMb2FkZWRgIG1ldGhvZC5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMueHJlZi5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkIHx8XG4gICAgICAgIHRoaXMueHJlZi5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkKClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGtleXMsIGRpY3QgfSA9IHRoaXM7XG4gICAgICB0aGlzLnJlZlNldCA9IG5ldyBSZWZTZXQoKTtcbiAgICAgIC8vIFNldHVwIHRoZSBpbml0aWFsIG5vZGVzIHRvIHZpc2l0LlxuICAgICAgY29uc3Qgbm9kZXNUb1Zpc2l0ID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBrZXlzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBkaWN0LmdldFJhdyhrZXlzW2ldKTtcbiAgICAgICAgLy8gU2tpcCBub2RlcyB0aGF0IGFyZSBndWFyYW50ZWVkIHRvIGJlIGVtcHR5LlxuICAgICAgICBpZiAocmF3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKHJhd1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3dhbGsobm9kZXNUb1Zpc2l0KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgX3dhbGsobm9kZXNUb1Zpc2l0KSB7XG4gICAgICBjb25zdCBub2Rlc1RvUmV2aXNpdCA9IFtdO1xuICAgICAgY29uc3QgcGVuZGluZ1JlcXVlc3RzID0gW107XG4gICAgICAvLyBERlMgd2FsayBvZiB0aGUgb2JqZWN0IGdyYXBoLlxuICAgICAgd2hpbGUgKG5vZGVzVG9WaXNpdC5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpO1xuXG4gICAgICAgIC8vIE9ubHkgcmVmZXJlbmNlcyBvciBjaHVua2VkIHN0cmVhbXMgY2FuIGNhdXNlIG1pc3NpbmcgZGF0YSBleGNlcHRpb25zLlxuICAgICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgICAgICAvLyBTa2lwIG5vZGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gdmlzaXRlZC5cbiAgICAgICAgICBpZiAodGhpcy5yZWZTZXQuaGFzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlZlNldC5wdXQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0aGlzLnhyZWYuZmV0Y2goY3VycmVudE5vZGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkge1xuICAgICAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVzVG9SZXZpc2l0LnB1c2goY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RzLnB1c2goeyBiZWdpbjogZXguYmVnaW4sIGVuZDogZXguZW5kIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudE5vZGUgJiYgY3VycmVudE5vZGUuZ2V0QmFzZVN0cmVhbXMpIHtcbiAgICAgICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IGN1cnJlbnROb2RlLmdldEJhc2VTdHJlYW1zKCk7XG4gICAgICAgICAgbGV0IGZvdW5kTWlzc2luZ0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBiYXNlU3RyZWFtcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBiYXNlU3RyZWFtc1tpXTtcbiAgICAgICAgICAgIGlmIChzdHJlYW0uYWxsQ2h1bmtzTG9hZGVkICYmICFzdHJlYW0uYWxsQ2h1bmtzTG9hZGVkKCkpIHtcbiAgICAgICAgICAgICAgZm91bmRNaXNzaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsgYmVnaW46IHN0cmVhbS5zdGFydCwgZW5kOiBzdHJlYW0uZW5kIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZm91bmRNaXNzaW5nRGF0YSkge1xuICAgICAgICAgICAgbm9kZXNUb1JldmlzaXQucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkQ2hpbGRyZW4oY3VycmVudE5vZGUsIG5vZGVzVG9WaXNpdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwZW5kaW5nUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKHBlbmRpbmdSZXF1ZXN0cyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbm9kZXNUb1JldmlzaXQubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1RvUmV2aXNpdFtpXTtcbiAgICAgICAgICAvLyBSZW1vdmUgYW55IHJlZmVyZW5jZSBub2RlcyBmcm9tIHRoZSBjdXJyZW50IGBSZWZTZXRgIHNvIHRoZXlcbiAgICAgICAgICAvLyBhcmVuJ3Qgc2tpcHBlZCB3aGVuIHdlIHJldmlzdCB0aGVtLlxuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgUmVmKSB7XG4gICAgICAgICAgICB0aGlzLnJlZlNldC5yZW1vdmUobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrKG5vZGVzVG9SZXZpc2l0KTtcbiAgICAgIH1cbiAgICAgIC8vIEV2ZXJ5dGhpbmcgaXMgbG9hZGVkLlxuICAgICAgdGhpcy5yZWZTZXQgPSBudWxsO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBPYmplY3RMb2FkZXI7XG59KSgpO1xuXG5leHBvcnQgeyBDYXRhbG9nLCBPYmplY3RMb2FkZXIsIFhSZWYsIEZpbGVTcGVjIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7XG4gIEFzY2lpODVTdHJlYW0sXG4gIEFzY2lpSGV4U3RyZWFtLFxuICBGbGF0ZVN0cmVhbSxcbiAgTFpXU3RyZWFtLFxuICBOdWxsU3RyZWFtLFxuICBQcmVkaWN0b3JTdHJlYW0sXG4gIFJ1bkxlbmd0aFN0cmVhbSxcbn0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGJ5dGVzVG9TdHJpbmcsXG4gIEZvcm1hdEVycm9yLFxuICBpbmZvLFxuICBpc051bSxcbiAgU3RyZWFtVHlwZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBDbWQsXG4gIERpY3QsXG4gIEVPRixcbiAgaXNDbWQsXG4gIGlzRGljdCxcbiAgaXNFT0YsXG4gIGlzTmFtZSxcbiAgTmFtZSxcbiAgUmVmLFxufSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBpc1doaXRlU3BhY2UsIE1pc3NpbmdEYXRhRXhjZXB0aW9uIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgQ0NJVFRGYXhTdHJlYW0gfSBmcm9tIFwiLi9jY2l0dF9zdHJlYW0uanNcIjtcbmltcG9ydCB7IEpiaWcyU3RyZWFtIH0gZnJvbSBcIi4vamJpZzJfc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBKcGVnU3RyZWFtIH0gZnJvbSBcIi4vanBlZ19zdHJlYW0uanNcIjtcbmltcG9ydCB7IEpweFN0cmVhbSB9IGZyb20gXCIuL2pweF9zdHJlYW0uanNcIjtcblxuY29uc3QgTUFYX0xFTkdUSF9UT19DQUNIRSA9IDEwMDA7XG5jb25zdCBNQVhfQURMRVIzMl9MRU5HVEggPSA1NTUyO1xuXG5mdW5jdGlvbiBjb21wdXRlQWRsZXIzMihieXRlcykge1xuICBjb25zdCBieXRlc0xlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgaWYgKFxuICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICkge1xuICAgIGFzc2VydChcbiAgICAgIGJ5dGVzTGVuZ3RoIDwgTUFYX0FETEVSMzJfTEVOR1RILFxuICAgICAgJ2NvbXB1dGVBZGxlcjMyOiBVbnN1cHBvcnRlZCBcImJ5dGVzXCIgbGVuZ3RoLidcbiAgICApO1xuICB9XG4gIGxldCBhID0gMSxcbiAgICBiID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlc0xlbmd0aDsgKytpKSB7XG4gICAgLy8gTm8gbW9kdWxvIHJlcXVpcmVkIGluIHRoZSBsb29wIGlmIGBieXRlc0xlbmd0aCA8IDU1NTJgLlxuICAgIGEgKz0gYnl0ZXNbaV0gJiAweGZmO1xuICAgIGIgKz0gYTtcbiAgfVxuICByZXR1cm4gKGIgJSA2NTUyMSA8PCAxNikgfCBhICUgNjU1MjE7XG59XG5cbmNsYXNzIFBhcnNlciB7XG4gIGNvbnN0cnVjdG9yKHsgbGV4ZXIsIHhyZWYsIGFsbG93U3RyZWFtcyA9IGZhbHNlLCByZWNvdmVyeU1vZGUgPSBmYWxzZSB9KSB7XG4gICAgdGhpcy5sZXhlciA9IGxleGVyO1xuICAgIHRoaXMueHJlZiA9IHhyZWY7XG4gICAgdGhpcy5hbGxvd1N0cmVhbXMgPSBhbGxvd1N0cmVhbXM7XG4gICAgdGhpcy5yZWNvdmVyeU1vZGUgPSByZWNvdmVyeU1vZGU7XG5cbiAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMucmVmaWxsKCk7XG4gIH1cblxuICByZWZpbGwoKSB7XG4gICAgdGhpcy5idWYxID0gdGhpcy5sZXhlci5nZXRPYmooKTtcbiAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpO1xuICB9XG5cbiAgc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMuYnVmMiBpbnN0YW5jZW9mIENtZCAmJiB0aGlzLmJ1ZjIuY21kID09PSBcIklEXCIpIHtcbiAgICAgIHRoaXMuYnVmMSA9IHRoaXMuYnVmMjtcbiAgICAgIHRoaXMuYnVmMiA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmMSA9IHRoaXMuYnVmMjtcbiAgICAgIHRoaXMuYnVmMiA9IHRoaXMubGV4ZXIuZ2V0T2JqKCk7XG4gICAgfVxuICB9XG5cbiAgdHJ5U2hpZnQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIFVwb24gZmFpbHVyZSwgdGhlIGNhbGxlciBzaG91bGQgcmVzZXQgdGhpcy5sZXhlci5wb3MgdG8gYSBrbm93biBnb29kXG4gICAgICAvLyBzdGF0ZSBhbmQgY2FsbCB0aGlzLnNoaWZ0KCkgdHdpY2UgdG8gcmVzZXQgdGhlIGJ1ZmZlcnMuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSA9IG51bGwpIHtcbiAgICBjb25zdCBidWYxID0gdGhpcy5idWYxO1xuICAgIHRoaXMuc2hpZnQoKTtcblxuICAgIGlmIChidWYxIGluc3RhbmNlb2YgQ21kKSB7XG4gICAgICBzd2l0Y2ggKGJ1ZjEuY21kKSB7XG4gICAgICAgIGNhc2UgXCJCSVwiOiAvLyBpbmxpbmUgaW1hZ2VcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlSW5saW5lSW1hZ2UoY2lwaGVyVHJhbnNmb3JtKTtcbiAgICAgICAgY2FzZSBcIltcIjogLy8gYXJyYXlcbiAgICAgICAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgICAgICAgIHdoaWxlICghaXNDbWQodGhpcy5idWYxLCBcIl1cIikgJiYgIWlzRU9GKHRoaXMuYnVmMSkpIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2godGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0VPRih0aGlzLmJ1ZjEpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVjb3ZlcnlNb2RlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkVuZCBvZiBmaWxlIGluc2lkZSBhcnJheVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zaGlmdCgpO1xuICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgY2FzZSBcIjw8XCI6IC8vIGRpY3Rpb25hcnkgb3Igc3RyZWFtXG4gICAgICAgICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KHRoaXMueHJlZik7XG4gICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsIFwiPj5cIikgJiYgIWlzRU9GKHRoaXMuYnVmMSkpIHtcbiAgICAgICAgICAgIGlmICghaXNOYW1lKHRoaXMuYnVmMSkpIHtcbiAgICAgICAgICAgICAgaW5mbyhcIk1hbGZvcm1lZCBkaWN0aW9uYXJ5OiBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0XCIpO1xuICAgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1ZjEubmFtZTtcbiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChpc0VPRih0aGlzLmJ1ZjEpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzRU9GKHRoaXMuYnVmMSkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWNvdmVyeU1vZGUpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiRW5kIG9mIGZpbGUgaW5zaWRlIGRpY3Rpb25hcnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdHJlYW0gb2JqZWN0cyBhcmUgbm90IGFsbG93ZWQgaW5zaWRlIGNvbnRlbnQgc3RyZWFtcyBvclxuICAgICAgICAgIC8vIG9iamVjdCBzdHJlYW1zLlxuICAgICAgICAgIGlmIChpc0NtZCh0aGlzLmJ1ZjIsIFwic3RyZWFtXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxvd1N0cmVhbXNcbiAgICAgICAgICAgICAgPyB0aGlzLm1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKVxuICAgICAgICAgICAgICA6IGRpY3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBzaW1wbGUgb2JqZWN0XG4gICAgICAgICAgcmV0dXJuIGJ1ZjE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIoYnVmMSkpIHtcbiAgICAgIC8vIGluZGlyZWN0IHJlZmVyZW5jZSBvciBpbnRlZ2VyXG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih0aGlzLmJ1ZjEpICYmIGlzQ21kKHRoaXMuYnVmMiwgXCJSXCIpKSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IFJlZi5nZXQoYnVmMSwgdGhpcy5idWYxKTtcbiAgICAgICAgdGhpcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiByZWY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmMTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJ1ZjEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChjaXBoZXJUcmFuc2Zvcm0pIHtcbiAgICAgICAgcmV0dXJuIGNpcGhlclRyYW5zZm9ybS5kZWNyeXB0U3RyaW5nKGJ1ZjEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjE7XG4gICAgfVxuXG4gICAgLy8gc2ltcGxlIG9iamVjdFxuICAgIHJldHVybiBidWYxO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGJ5IHNlYXJjaGluZyBmb3IgdGhlIC9FSVxccy8uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBpbmxpbmUgc3RyZWFtIGxlbmd0aC5cbiAgICovXG4gIGZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSkge1xuICAgIGNvbnN0IEUgPSAweDQ1LFxuICAgICAgSSA9IDB4NDksXG4gICAgICBTUEFDRSA9IDB4MjAsXG4gICAgICBMRiA9IDB4YSxcbiAgICAgIENSID0gMHhkLFxuICAgICAgTlVMID0gMHgwO1xuICAgIGNvbnN0IGxleGVyID0gdGhpcy5sZXhlcixcbiAgICAgIHN0YXJ0UG9zID0gc3RyZWFtLnBvcyxcbiAgICAgIG4gPSAxMDtcbiAgICBsZXQgc3RhdGUgPSAwLFxuICAgICAgY2gsXG4gICAgICBtYXliZUVJUG9zO1xuICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gMCkge1xuICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAxKSB7XG4gICAgICAgIHN0YXRlID0gY2ggPT09IEkgPyAyIDogMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydChzdGF0ZSA9PT0gMiwgXCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCAtIGludmFsaWQgc3RhdGUuXCIpO1xuICAgICAgICBpZiAoY2ggPT09IFNQQUNFIHx8IGNoID09PSBMRiB8fCBjaCA9PT0gQ1IpIHtcbiAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvcztcbiAgICAgICAgICAvLyBMZXQncyBjaGVjayB0aGF0IHRoZSBuZXh0IGBuYCBieXRlcyBhcmUgQVNDSUkuLi4ganVzdCB0byBiZSBzdXJlLlxuICAgICAgICAgIGNvbnN0IGZvbGxvd2luZ0J5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhuKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmb2xsb3dpbmdCeXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBjaCA9IGZvbGxvd2luZ0J5dGVzW2ldO1xuICAgICAgICAgICAgaWYgKGNoID09PSBOVUwgJiYgZm9sbG93aW5nQnl0ZXNbaSArIDFdICE9PSBOVUwpIHtcbiAgICAgICAgICAgICAgLy8gTlVMIGJ5dGVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gb2NjdXIgKm91dHNpZGUqIG9mIGlubGluZVxuICAgICAgICAgICAgICAvLyBpbWFnZXMsIGJ1dCBzb21lIFBERiBnZW5lcmF0b3JzIHZpb2xhdGUgdGhhdCBhc3N1bXB0aW9uLFxuICAgICAgICAgICAgICAvLyB0aHVzIGJyZWFraW5nIHRoZSBFSSBkZXRlY3Rpb24gaGV1cmlzdGljcyB1c2VkIGJlbG93LlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBjYW4ndCB1bmNvbmRpdGlvbmFsbHkgdHJlYXQgTlVMIGJ5dGVzIGFzIFwiQVNDSUlcIixcbiAgICAgICAgICAgICAgLy8gc2luY2UgdGhhdCAqY291bGQqIHJlc3VsdCBpbiBpbmxpbmUgaW1hZ2VzIGJlaW5nIHRydW5jYXRlZC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gVG8gYXR0ZW1wdCB0byBhZGRyZXNzIHRoaXMsIHdlJ2xsIHN0aWxsIHRyZWF0IGFueSAqc2VxdWVuY2UqXG4gICAgICAgICAgICAgIC8vIG9mIE5VTCBieXRlcyBhcyBub24tQVNDSUksIGJ1dCBmb3IgYSAqc2luZ2xlKiBOVUwgYnl0ZSB3ZSdsbFxuICAgICAgICAgICAgICAvLyBjb250aW51ZSBjaGVja2luZyB0aGUgYGZvbGxvd2luZ0J5dGVzYCAoZml4ZXMgaXNzdWU4ODIzLnBkZikuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkge1xuICAgICAgICAgICAgICAvLyBOb3QgYSBMRiwgQ1IsIFNQQUNFIG9yIGFueSB2aXNpYmxlIEFTQ0lJIGNoYXJhY3RlciwgaS5lLlxuICAgICAgICAgICAgICAvLyBpdCdzIGJpbmFyeSBzdHVmZi4gUmVzZXR0aW5nIHRoZSBzdGF0ZS5cbiAgICAgICAgICAgICAgc3RhdGUgPSAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RhdGUgIT09IDIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBcIkVJXCIgc2VxdWVuY2UgaXNuJ3QgcGFydCBvZiB0aGUgaW1hZ2UgZGF0YSwgc2luY2VcbiAgICAgICAgICAvLyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBpbWFnZSB0byBiZSB0cnVuY2F0ZWQgKGZpeGVzIGlzc3VlMTExMjQucGRmKS5cbiAgICAgICAgICBpZiAobGV4ZXIua25vd25Db21tYW5kcykge1xuICAgICAgICAgICAgY29uc3QgbmV4dE9iaiA9IGxleGVyLnBlZWtPYmooKTtcbiAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgQ21kICYmICFsZXhlci5rbm93bkNvbW1hbmRzW25leHRPYmouY21kXSkge1xuICAgICAgICAgICAgICAvLyBOb3QgYSB2YWxpZCBjb21tYW5kLCBpLmUuIHRoZSBpbmxpbmUgaW1hZ2UgZGF0YSAqaXRzZWxmKlxuICAgICAgICAgICAgICAvLyBjb250YWlucyBhbiBcIkVJXCIgc2VxdWVuY2UuIFJlc2V0dGluZyB0aGUgc3RhdGUuXG4gICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgXCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCAtIGBsZXhlci5rbm93bkNvbW1hbmRzYCBpcyB1bmRlZmluZWQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlID09PSAyKSB7XG4gICAgICAgICAgICBicmVhazsgLy8gRmluaXNoZWQhXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaCA9PT0gLTEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6IFwiICtcbiAgICAgICAgICBcIlJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgZmluZGluZyBhIHZhbGlkIEVJIG1hcmtlclwiXG4gICAgICApO1xuICAgICAgaWYgKG1heWJlRUlQb3MpIHtcbiAgICAgICAgd2FybignLi4uIHRyeWluZyB0byByZWNvdmVyIGJ5IHVzaW5nIHRoZSBsYXN0IFwiRUlcIiBvY2N1cnJlbmNlLicpO1xuICAgICAgICBzdHJlYW0uc2tpcCgtKHN0cmVhbS5wb3MgLSBtYXliZUVJUG9zKSk7IC8vIFJlc2V0IHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGVuZE9mZnNldCA9IDQ7XG4gICAgc3RyZWFtLnNraXAoLWVuZE9mZnNldCk7IC8vIFNldCB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIGp1c3QgYmVmb3JlIFwiRUlcIi5cbiAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpO1xuICAgIHN0cmVhbS5za2lwKGVuZE9mZnNldCk7IC8vIC4uLiBhbmQgcmVtZW1iZXIgdG8gcmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbi5cblxuICAgIC8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IGFjY2lkZW50YWxseSB0cnVuY2F0ZSB0aGUgaW5saW5lIGltYWdlLCB3aGVuIHRoZVxuICAgIC8vIGRhdGEgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIFwiRUlcIiBtYXJrZXIgKGZpeGVzIGlzc3VlMTAzODgucGRmKS5cbiAgICBpZiAoIWlzV2hpdGVTcGFjZShjaCkpIHtcbiAgICAgIGVuZE9mZnNldC0tO1xuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtLnBvcyAtIGVuZE9mZnNldCAtIHN0YXJ0UG9zO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIEVPSSAoZW5kLW9mLWltYWdlKSBtYXJrZXIgMHhGRkQ5IG9mIHRoZSBzdHJlYW0uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBpbmxpbmUgc3RyZWFtIGxlbmd0aC5cbiAgICovXG4gIGZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7XG4gICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zO1xuICAgIGxldCBmb3VuZEVPSSA9IGZhbHNlLFxuICAgICAgYixcbiAgICAgIG1hcmtlckxlbmd0aDtcbiAgICB3aGlsZSAoKGIgPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHtcbiAgICAgIGlmIChiICE9PSAweGZmKSB7XG4gICAgICAgIC8vIE5vdCBhIHZhbGlkIG1hcmtlci5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHN0cmVhbS5nZXRCeXRlKCkpIHtcbiAgICAgICAgY2FzZSAweDAwOiAvLyBCeXRlIHN0dWZmaW5nLlxuICAgICAgICAgIC8vIDB4RkYwMCBhcHBlYXJzIHRvIGJlIGEgdmVyeSBjb21tb24gYnl0ZSBzZXF1ZW5jZSBpbiBKUEVHIGltYWdlcy5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDB4ZmY6IC8vIEZpbGwgYnl0ZS5cbiAgICAgICAgICAvLyBBdm9pZCBza2lwcGluZyBhIHZhbGlkIG1hcmtlciwgcmVzZXR0aW5nIHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICAgICAgc3RyZWFtLnNraXAoLTEpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMHhkOTogLy8gRU9JXG4gICAgICAgICAgZm91bmRFT0kgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMHhjMDogLy8gU09GMFxuICAgICAgICBjYXNlIDB4YzE6IC8vIFNPRjFcbiAgICAgICAgY2FzZSAweGMyOiAvLyBTT0YyXG4gICAgICAgIGNhc2UgMHhjMzogLy8gU09GM1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgMHhjNTogLy8gU09GNVxuICAgICAgICBjYXNlIDB4YzY6IC8vIFNPRjZcbiAgICAgICAgY2FzZSAweGM3OiAvLyBTT0Y3XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAweGM5OiAvLyBTT0Y5XG4gICAgICAgIGNhc2UgMHhjYTogLy8gU09GMTBcbiAgICAgICAgY2FzZSAweGNiOiAvLyBTT0YxMVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgMHhjZDogLy8gU09GMTNcbiAgICAgICAgY2FzZSAweGNlOiAvLyBTT0YxNFxuICAgICAgICBjYXNlIDB4Y2Y6IC8vIFNPRjE1XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAweGM0OiAvLyBESFRcbiAgICAgICAgY2FzZSAweGNjOiAvLyBEQUNcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlIDB4ZGE6IC8vIFNPU1xuICAgICAgICBjYXNlIDB4ZGI6IC8vIERRVFxuICAgICAgICBjYXNlIDB4ZGM6IC8vIEROTFxuICAgICAgICBjYXNlIDB4ZGQ6IC8vIERSSVxuICAgICAgICBjYXNlIDB4ZGU6IC8vIERIUFxuICAgICAgICBjYXNlIDB4ZGY6IC8vIEVYUFxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgMHhlMDogLy8gQVBQMFxuICAgICAgICBjYXNlIDB4ZTE6IC8vIEFQUDFcbiAgICAgICAgY2FzZSAweGUyOiAvLyBBUFAyXG4gICAgICAgIGNhc2UgMHhlMzogLy8gQVBQM1xuICAgICAgICBjYXNlIDB4ZTQ6IC8vIEFQUDRcbiAgICAgICAgY2FzZSAweGU1OiAvLyBBUFA1XG4gICAgICAgIGNhc2UgMHhlNjogLy8gQVBQNlxuICAgICAgICBjYXNlIDB4ZTc6IC8vIEFQUDdcbiAgICAgICAgY2FzZSAweGU4OiAvLyBBUFA4XG4gICAgICAgIGNhc2UgMHhlOTogLy8gQVBQOVxuICAgICAgICBjYXNlIDB4ZWE6IC8vIEFQUDEwXG4gICAgICAgIGNhc2UgMHhlYjogLy8gQVBQMTFcbiAgICAgICAgY2FzZSAweGVjOiAvLyBBUFAxMlxuICAgICAgICBjYXNlIDB4ZWQ6IC8vIEFQUDEzXG4gICAgICAgIGNhc2UgMHhlZTogLy8gQVBQMTRcbiAgICAgICAgY2FzZSAweGVmOiAvLyBBUFAxNVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgMHhmZTogLy8gQ09NXG4gICAgICAgICAgLy8gVGhlIG1hcmtlciBzaG91bGQgYmUgZm9sbG93ZWQgYnkgdGhlIGxlbmd0aCBvZiB0aGUgc2VnbWVudC5cbiAgICAgICAgICBtYXJrZXJMZW5ndGggPSBzdHJlYW0uZ2V0VWludDE2KCk7XG4gICAgICAgICAgaWYgKG1hcmtlckxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIC8vIHxtYXJrZXJMZW5ndGh8IGNvbnRhaW5zIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgbWFya2VyIHNlZ21lbnQsXG4gICAgICAgICAgICAvLyBpbmNsdWRpbmcgaXRzIG93biBsZW5ndGggKDIgYnl0ZXMpIGFuZCBleGNsdWRpbmcgdGhlIG1hcmtlci5cbiAgICAgICAgICAgIHN0cmVhbS5za2lwKG1hcmtlckxlbmd0aCAtIDIpOyAvLyBKdW1wIHRvIHRoZSBuZXh0IG1hcmtlci5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIG1hcmtlciBsZW5ndGggaXMgaW52YWxpZCwgcmVzZXR0aW5nIHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICAgICAgICBzdHJlYW0uc2tpcCgtMik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGZvdW5kRU9JKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7XG4gICAgaWYgKGIgPT09IC0xKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIklubGluZSBEQ1REZWNvZGUgaW1hZ2Ugc3RyZWFtOiBcIiArXG4gICAgICAgICAgXCJFT0kgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuXCJcbiAgICAgICk7XG4gICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsgLy8gUmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbi5cbiAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7XG4gICAgfVxuICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7XG4gICAgcmV0dXJuIGxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBFT0QgKGVuZC1vZi1kYXRhKSBtYXJrZXIgJ34+JyAoaS5lLiBUSUxERSArIEdUKSBvZiB0aGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaW5saW5lIHN0cmVhbSBsZW5ndGguXG4gICAqL1xuICBmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHtcbiAgICBjb25zdCBUSUxERSA9IDB4N2UsXG4gICAgICBHVCA9IDB4M2U7XG4gICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zO1xuICAgIGxldCBjaDtcbiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgIT09IC0xKSB7XG4gICAgICBpZiAoY2ggPT09IFRJTERFKSB7XG4gICAgICAgIGNvbnN0IHRpbGRlUG9zID0gc3RyZWFtLnBvcztcblxuICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpO1xuICAgICAgICAvLyBIYW5kbGUgY29ycnVwdCBQREYgZG9jdW1lbnRzIHdoaWNoIGNvbnRhaW5zIHdoaXRlc3BhY2UgXCJpbnNpZGVcIiBvZlxuICAgICAgICAvLyB0aGUgRU9EIG1hcmtlciAoZml4ZXMgaXNzdWUxMDYxNC5wZGYpLlxuICAgICAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGNoKSkge1xuICAgICAgICAgIHN0cmVhbS5za2lwKCk7XG4gICAgICAgICAgY2ggPSBzdHJlYW0ucGVla0J5dGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09IEdUKSB7XG4gICAgICAgICAgc3RyZWFtLnNraXAoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgY29ycnVwdCBQREYgZG9jdW1lbnRzIHdoaWNoIGNvbnRhaW5zIHRydW5jYXRlZCBFT0QgbWFya2VycyxcbiAgICAgICAgLy8gd2hlcmUgdGhlICc+JyBjaGFyYWN0ZXIgaXMgbWlzc2luZyAoZml4ZXMgaXNzdWUxMTM4NS5wZGYpLlxuICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHRpbGRlUG9zKSB7XG4gICAgICAgICAgY29uc3QgbWF5YmVFSSA9IHN0cmVhbS5wZWVrQnl0ZXMoMik7XG4gICAgICAgICAgaWYgKG1heWJlRUlbMF0gPT09IC8qIEUgPSAqLyAweDQ1ICYmIG1heWJlRUlbMV0gPT09IC8qIEkgPSAqLyAweDQ5KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zO1xuICAgIGlmIChjaCA9PT0gLTEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwiSW5saW5lIEFTQ0lJODVEZWNvZGUgaW1hZ2Ugc3RyZWFtOiBcIiArXG4gICAgICAgICAgXCJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuXCJcbiAgICAgICk7XG4gICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsgLy8gUmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbi5cbiAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7XG4gICAgfVxuICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7XG4gICAgcmV0dXJuIGxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBFT0QgKGVuZC1vZi1kYXRhKSBtYXJrZXIgJz4nIChpLmUuIEdUKSBvZiB0aGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaW5saW5lIHN0cmVhbSBsZW5ndGguXG4gICAqL1xuICBmaW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7XG4gICAgY29uc3QgR1QgPSAweDNlO1xuICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvcztcbiAgICBsZXQgY2g7XG4gICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkge1xuICAgICAgaWYgKGNoID09PSBHVCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zO1xuICAgIGlmIChjaCA9PT0gLTEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwiSW5saW5lIEFTQ0lJSGV4RGVjb2RlIGltYWdlIHN0cmVhbTogXCIgK1xuICAgICAgICAgIFwiRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLlwiXG4gICAgICApO1xuICAgICAgc3RyZWFtLnNraXAoLWxlbmd0aCk7IC8vIFJlc2V0IHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pO1xuICAgIH1cbiAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pO1xuICAgIHJldHVybiBsZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCBvdmVyIHRoZSAvRUkvIGZvciBzdHJlYW1zIHdoZXJlIHdlIHNlYXJjaCBmb3IgYW4gRU9EIG1hcmtlci5cbiAgICovXG4gIGlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pIHtcbiAgICBjb25zdCBFID0gMHg0NSxcbiAgICAgIEkgPSAweDQ5O1xuICAgIGxldCBzdGF0ZSA9IDAsXG4gICAgICBjaDtcbiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgIT09IC0xKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IDApIHtcbiAgICAgICAgc3RhdGUgPSBjaCA9PT0gRSA/IDEgOiAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gMSkge1xuICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1ha2VJbmxpbmVJbWFnZShjaXBoZXJUcmFuc2Zvcm0pIHtcbiAgICBjb25zdCBsZXhlciA9IHRoaXMubGV4ZXI7XG4gICAgY29uc3Qgc3RyZWFtID0gbGV4ZXIuc3RyZWFtO1xuXG4gICAgLy8gUGFyc2UgZGljdGlvbmFyeS5cbiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTtcbiAgICBsZXQgZGljdExlbmd0aDtcbiAgICB3aGlsZSAoIWlzQ21kKHRoaXMuYnVmMSwgXCJJRFwiKSAmJiAhaXNFT0YodGhpcy5idWYxKSkge1xuICAgICAgaWYgKCFpc05hbWUodGhpcy5idWYxKSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJEaWN0aW9uYXJ5IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3RcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1ZjEubmFtZTtcbiAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgIGlmIChpc0VPRih0aGlzLmJ1ZjEpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTtcbiAgICB9XG4gICAgaWYgKGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3MgIT09IC0xKSB7XG4gICAgICBkaWN0TGVuZ3RoID0gc3RyZWFtLnBvcyAtIGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgKGkuZS4gdGhlIGN1cnJlbnQpIGltYWdlIGZpbHRlci5cbiAgICBjb25zdCBmaWx0ZXIgPSBkaWN0LmdldChcIkZpbHRlclwiLCBcIkZcIik7XG4gICAgbGV0IGZpbHRlck5hbWU7XG4gICAgaWYgKGlzTmFtZShmaWx0ZXIpKSB7XG4gICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcbiAgICAgIGNvbnN0IGZpbHRlclplcm8gPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWx0ZXJbMF0pO1xuICAgICAgaWYgKGlzTmFtZShmaWx0ZXJaZXJvKSkge1xuICAgICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyWmVyby5uYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBhcnNlIGltYWdlIHN0cmVhbS5cbiAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3M7XG4gICAgbGV0IGxlbmd0aDtcbiAgICBpZiAoZmlsdGVyTmFtZSA9PT0gXCJEQ1REZWNvZGVcIiB8fCBmaWx0ZXJOYW1lID09PSBcIkRDVFwiKSB7XG4gICAgICBsZW5ndGggPSB0aGlzLmZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlck5hbWUgPT09IFwiQVNDSUk4NURlY29kZVwiIHx8IGZpbHRlck5hbWUgPT09IFwiQTg1XCIpIHtcbiAgICAgIGxlbmd0aCA9IHRoaXMuZmluZEFTQ0lJODVEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlck5hbWUgPT09IFwiQVNDSUlIZXhEZWNvZGVcIiB8fCBmaWx0ZXJOYW1lID09PSBcIkFIeFwiKSB7XG4gICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7XG4gICAgfVxuICAgIGxldCBpbWFnZVN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpO1xuXG4gICAgLy8gQ2FjaGUgYWxsIGltYWdlcyBiZWxvdyB0aGUgTUFYX0xFTkdUSF9UT19DQUNIRSB0aHJlc2hvbGQgYnkgdGhlaXJcbiAgICAvLyBhZGxlcjMyIGNoZWNrc3VtLlxuICAgIGxldCBjYWNoZUtleTtcbiAgICBpZiAobGVuZ3RoIDwgTUFYX0xFTkdUSF9UT19DQUNIRSAmJiBkaWN0TGVuZ3RoIDwgTUFYX0FETEVSMzJfTEVOR1RIKSB7XG4gICAgICBjb25zdCBpbWFnZUJ5dGVzID0gaW1hZ2VTdHJlYW0uZ2V0Qnl0ZXMoKTtcbiAgICAgIGltYWdlU3RyZWFtLnJlc2V0KCk7XG5cbiAgICAgIGNvbnN0IGluaXRpYWxTdHJlYW1Qb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgLy8gU2V0IHRoZSBzdHJlYW0gcG9zaXRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGljdGlvbmFyeSBkYXRhLi4uXG4gICAgICBzdHJlYW0ucG9zID0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvcztcbiAgICAgIC8vIC4uLiBhbmQgZmV0Y2ggdGhlIGJ5dGVzIG9mIHRoZSAqZW50aXJlKiBkaWN0aW9uYXJ5LlxuICAgICAgY29uc3QgZGljdEJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKGRpY3RMZW5ndGgpO1xuICAgICAgLy8gRmluYWxseSwgZG9uJ3QgZm9yZ2V0IHRvIHJlc2V0IHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICBzdHJlYW0ucG9zID0gaW5pdGlhbFN0cmVhbVBvcztcblxuICAgICAgY2FjaGVLZXkgPSBjb21wdXRlQWRsZXIzMihpbWFnZUJ5dGVzKSArIFwiX1wiICsgY29tcHV0ZUFkbGVyMzIoZGljdEJ5dGVzKTtcblxuICAgICAgY29uc3QgY2FjaGVFbnRyeSA9IHRoaXMuaW1hZ2VDYWNoZVtjYWNoZUtleV07XG4gICAgICBpZiAoY2FjaGVFbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoXCJFSVwiKTtcbiAgICAgICAgdGhpcy5zaGlmdCgpO1xuXG4gICAgICAgIGNhY2hlRW50cnkucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlRW50cnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNpcGhlclRyYW5zZm9ybSkge1xuICAgICAgaW1hZ2VTdHJlYW0gPSBjaXBoZXJUcmFuc2Zvcm0uY3JlYXRlU3RyZWFtKGltYWdlU3RyZWFtLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIGltYWdlU3RyZWFtID0gdGhpcy5maWx0ZXIoaW1hZ2VTdHJlYW0sIGRpY3QsIGxlbmd0aCk7XG4gICAgaW1hZ2VTdHJlYW0uZGljdCA9IGRpY3Q7XG4gICAgaWYgKGNhY2hlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGltYWdlU3RyZWFtLmNhY2hlS2V5ID0gYGlubGluZV8ke2xlbmd0aH1fJHtjYWNoZUtleX1gO1xuICAgICAgdGhpcy5pbWFnZUNhY2hlW2NhY2hlS2V5XSA9IGltYWdlU3RyZWFtO1xuICAgIH1cblxuICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoXCJFSVwiKTtcbiAgICB0aGlzLnNoaWZ0KCk7XG5cbiAgICByZXR1cm4gaW1hZ2VTdHJlYW07XG4gIH1cblxuICBfZmluZFN0cmVhbUxlbmd0aChzdGFydFBvcywgc2lnbmF0dXJlKSB7XG4gICAgY29uc3QgeyBzdHJlYW0gfSA9IHRoaXMubGV4ZXI7XG4gICAgc3RyZWFtLnBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgY29uc3QgU0NBTl9CTE9DS19MRU5HVEggPSAyMDQ4O1xuICAgIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IHN0cmVhbS5lbmQpIHtcbiAgICAgIGNvbnN0IHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpO1xuICAgICAgY29uc3Qgc2Nhbkxlbmd0aCA9IHNjYW5CeXRlcy5sZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7XG5cbiAgICAgIGlmIChzY2FuTGVuZ3RoIDw9IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgcG9zID0gMDtcbiAgICAgIHdoaWxlIChwb3MgPCBzY2FuTGVuZ3RoKSB7XG4gICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyArIGpdID09PSBzaWduYXR1cmVbal0pIHtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGogPj0gc2lnbmF0dXJlTGVuZ3RoKSB7XG4gICAgICAgICAgLy8gYHNpZ25hdHVyZWAgZm91bmQuXG4gICAgICAgICAgc3RyZWFtLnBvcyArPSBwb3M7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBzdGFydFBvcztcbiAgICAgICAgfVxuICAgICAgICBwb3MrKztcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5wb3MgKz0gc2Nhbkxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgbWFrZVN0cmVhbShkaWN0LCBjaXBoZXJUcmFuc2Zvcm0pIHtcbiAgICBjb25zdCBsZXhlciA9IHRoaXMubGV4ZXI7XG4gICAgbGV0IHN0cmVhbSA9IGxleGVyLnN0cmVhbTtcblxuICAgIC8vIEdldCB0aGUgc3RyZWFtJ3Mgc3RhcnQgcG9zaXRpb24uXG4gICAgbGV4ZXIuc2tpcFRvTmV4dExpbmUoKTtcbiAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3MgLSAxO1xuXG4gICAgLy8gR2V0IHRoZSBsZW5ndGguXG4gICAgbGV0IGxlbmd0aCA9IGRpY3QuZ2V0KFwiTGVuZ3RoXCIpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpKSB7XG4gICAgICBpbmZvKGBCYWQgbGVuZ3RoIFwiJHtsZW5ndGh9XCIgaW4gc3RyZWFtYCk7XG4gICAgICBsZW5ndGggPSAwO1xuICAgIH1cblxuICAgIC8vIFNraXAgb3ZlciB0aGUgc3RyZWFtIGRhdGEuXG4gICAgc3RyZWFtLnBvcyA9IHN0YXJ0UG9zICsgbGVuZ3RoO1xuICAgIGxleGVyLm5leHRDaGFyKCk7XG5cbiAgICAvLyBTaGlmdCAnPj4nIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBuZXcgb2JqZWN0IG1hcmtzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS5cbiAgICBpZiAodGhpcy50cnlTaGlmdCgpICYmIGlzQ21kKHRoaXMuYnVmMiwgXCJlbmRzdHJlYW1cIikpIHtcbiAgICAgIHRoaXMuc2hpZnQoKTsgLy8gJ3N0cmVhbSdcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQmFkIHN0cmVhbSBsZW5ndGgsIHNjYW5uaW5nIGZvciBlbmRzdHJlYW0gY29tbWFuZC5cbiAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgY29uc3QgRU5EU1RSRUFNX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgMHg2NSwgMHg2RSwgMHg2NCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2RF0pO1xuICAgICAgbGV0IGFjdHVhbExlbmd0aCA9IHRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MsIEVORFNUUkVBTV9TSUdOQVRVUkUpO1xuICAgICAgaWYgKGFjdHVhbExlbmd0aCA8IDApIHtcbiAgICAgICAgLy8gT25seSBhbGxvdyBsaW1pdGVkIHRydW5jYXRpb24gb2YgdGhlIGVuZHN0cmVhbSBzaWduYXR1cmUsXG4gICAgICAgIC8vIHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzLlxuICAgICAgICBjb25zdCBNQVhfVFJVTkNBVElPTiA9IDE7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBQREYgZ2VuZXJhdG9yIGluY2x1ZGVkIHRydW5jYXRlZCBlbmRzdHJlYW0gY29tbWFuZHMsXG4gICAgICAgIC8vIHN1Y2ggYXMgZS5nLiBcImVuZHN0cmVhXCIgKGZpeGVzIGlzc3VlMTAwMDQucGRmKS5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gTUFYX1RSVU5DQVRJT047IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVuZCA9IEVORFNUUkVBTV9TSUdOQVRVUkUubGVuZ3RoIC0gaTtcbiAgICAgICAgICBjb25zdCBUUlVOQ0FURURfU0lHTkFUVVJFID0gRU5EU1RSRUFNX1NJR05BVFVSRS5zbGljZSgwLCBlbmQpO1xuXG4gICAgICAgICAgY29uc3QgbWF5YmVMZW5ndGggPSB0aGlzLl9maW5kU3RyZWFtTGVuZ3RoKFxuICAgICAgICAgICAgc3RhcnRQb3MsXG4gICAgICAgICAgICBUUlVOQ0FURURfU0lHTkFUVVJFXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWF5YmVMZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGJ5dGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSB0cnVuY2F0ZWRcbiAgICAgICAgICAgIC8vIGVuZHN0cmVhbSBjb21tYW5kIGlzIGEgc3BhY2UsIHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzLlxuICAgICAgICAgICAgY29uc3QgbGFzdEJ5dGUgPSBzdHJlYW0ucGVla0J5dGVzKGVuZCArIDEpW2VuZF07XG4gICAgICAgICAgICBpZiAoIWlzV2hpdGVTcGFjZShsYXN0Qnl0ZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmZvKFxuICAgICAgICAgICAgICBgRm91bmQgXCIke2J5dGVzVG9TdHJpbmcoVFJVTkNBVEVEX1NJR05BVFVSRSl9XCIgd2hlbiBgICtcbiAgICAgICAgICAgICAgICBcInNlYXJjaGluZyBmb3IgZW5kc3RyZWFtIGNvbW1hbmQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhY3R1YWxMZW5ndGggPSBtYXliZUxlbmd0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3R1YWxMZW5ndGggPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTWlzc2luZyBlbmRzdHJlYW0gY29tbWFuZC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxlbmd0aCA9IGFjdHVhbExlbmd0aDtcblxuICAgICAgbGV4ZXIubmV4dENoYXIoKTtcbiAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy5zaGlmdCgpOyAvLyAnZW5kc3RyZWFtJ1xuXG4gICAgc3RyZWFtID0gc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MsIGxlbmd0aCwgZGljdCk7XG4gICAgaWYgKGNpcGhlclRyYW5zZm9ybSkge1xuICAgICAgc3RyZWFtID0gY2lwaGVyVHJhbnNmb3JtLmNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCk7XG4gICAgfVxuICAgIHN0cmVhbSA9IHRoaXMuZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKTtcbiAgICBzdHJlYW0uZGljdCA9IGRpY3Q7XG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIGZpbHRlcihzdHJlYW0sIGRpY3QsIGxlbmd0aCkge1xuICAgIGxldCBmaWx0ZXIgPSBkaWN0LmdldChcIkZpbHRlclwiLCBcIkZcIik7XG4gICAgbGV0IHBhcmFtcyA9IGRpY3QuZ2V0KFwiRGVjb2RlUGFybXNcIiwgXCJEUFwiKTtcblxuICAgIGlmIChpc05hbWUoZmlsdGVyKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwiL0RlY29kZVBhcm1zIHNob3VsZCBub3QgY29udGFpbiBhbiBBcnJheSwgXCIgK1xuICAgICAgICAgICAgXCJ3aGVuIC9GaWx0ZXIgY29udGFpbnMgYSBOYW1lLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIGxlbmd0aCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBsZXQgbWF5YmVMZW5ndGggPSBsZW5ndGg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgY29uc3QgZmlsdGVyQXJyYXkgPSBmaWx0ZXI7XG4gICAgICBjb25zdCBwYXJhbXNBcnJheSA9IHBhcmFtcztcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZpbHRlckFycmF5Lmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgZmlsdGVyID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmlsdGVyQXJyYXlbaV0pO1xuICAgICAgICBpZiAoIWlzTmFtZShmaWx0ZXIpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBCYWQgZmlsdGVyIG5hbWUgXCIke2ZpbHRlcn1cImApO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFyYW1zID0gbnVsbDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zQXJyYXkpICYmIGkgaW4gcGFyYW1zQXJyYXkpIHtcbiAgICAgICAgICBwYXJhbXMgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihwYXJhbXNBcnJheVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtID0gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIG1heWJlTGVuZ3RoLCBwYXJhbXMpO1xuICAgICAgICAvLyBBZnRlciB0aGUgZmlyc3Qgc3RyZWFtIHRoZSBgbGVuZ3RoYCB2YXJpYWJsZSBpcyBpbnZhbGlkLlxuICAgICAgICBtYXliZUxlbmd0aCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG4gIH1cblxuICBtYWtlRmlsdGVyKHN0cmVhbSwgbmFtZSwgbWF5YmVMZW5ndGgsIHBhcmFtcykge1xuICAgIC8vIFNpbmNlIHRoZSAnTGVuZ3RoJyBlbnRyeSBpbiB0aGUgc3RyZWFtIGRpY3Rpb25hcnkgY2FuIGJlIGNvbXBsZXRlbHlcbiAgICAvLyB3cm9uZywgZS5nLiB6ZXJvIGZvciBub24tZW1wdHkgc3RyZWFtcywgb25seSBza2lwIHBhcnNpbmcgdGhlIHN0cmVhbVxuICAgIC8vIHdoZW4gd2UgY2FuIGJlIGFic29sdXRlbHkgY2VydGFpbiB0aGF0IGl0IGFjdHVhbGx5IGlzIGVtcHR5LlxuICAgIGlmIChtYXliZUxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybihgRW1wdHkgXCIke25hbWV9XCIgc3RyZWFtLmApO1xuICAgICAgcmV0dXJuIG5ldyBOdWxsU3RyZWFtKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHhyZWZTdHJlYW1TdGF0cyA9IHRoaXMueHJlZi5zdGF0cy5zdHJlYW1UeXBlcztcbiAgICAgIGlmIChuYW1lID09PSBcIkZsYXRlRGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJGbFwiKSB7XG4gICAgICAgIHhyZWZTdHJlYW1TdGF0c1tTdHJlYW1UeXBlLkZMQVRFXSA9IHRydWU7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByZWRpY3RvclN0cmVhbShcbiAgICAgICAgICAgIG5ldyBGbGF0ZVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSxcbiAgICAgICAgICAgIG1heWJlTGVuZ3RoLFxuICAgICAgICAgICAgcGFyYW1zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwiTFpXRGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJMWldcIikge1xuICAgICAgICB4cmVmU3RyZWFtU3RhdHNbU3RyZWFtVHlwZS5MWlddID0gdHJ1ZTtcbiAgICAgICAgbGV0IGVhcmx5Q2hhbmdlID0gMTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgIGlmIChwYXJhbXMuaGFzKFwiRWFybHlDaGFuZ2VcIikpIHtcbiAgICAgICAgICAgIGVhcmx5Q2hhbmdlID0gcGFyYW1zLmdldChcIkVhcmx5Q2hhbmdlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByZWRpY3RvclN0cmVhbShcbiAgICAgICAgICAgIG5ldyBMWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLFxuICAgICAgICAgICAgbWF5YmVMZW5ndGgsXG4gICAgICAgICAgICBwYXJhbXNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkRDVERlY29kZVwiIHx8IG5hbWUgPT09IFwiRENUXCIpIHtcbiAgICAgICAgeHJlZlN0cmVhbVN0YXRzW1N0cmVhbVR5cGUuRENUXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgSnBlZ1N0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBzdHJlYW0uZGljdCwgcGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkpQWERlY29kZVwiIHx8IG5hbWUgPT09IFwiSlBYXCIpIHtcbiAgICAgICAgeHJlZlN0cmVhbVN0YXRzW1N0cmVhbVR5cGUuSlBYXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgSnB4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHN0cmVhbS5kaWN0LCBwYXJhbXMpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwiQVNDSUk4NURlY29kZVwiIHx8IG5hbWUgPT09IFwiQTg1XCIpIHtcbiAgICAgICAgeHJlZlN0cmVhbVN0YXRzW1N0cmVhbVR5cGUuQTg1XSA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgQXNjaWk4NVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkFTQ0lJSGV4RGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJBSHhcIikge1xuICAgICAgICB4cmVmU3RyZWFtU3RhdHNbU3RyZWFtVHlwZS5BSFhdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBBc2NpaUhleFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkNDSVRURmF4RGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJDQ0ZcIikge1xuICAgICAgICB4cmVmU3RyZWFtU3RhdHNbU3RyZWFtVHlwZS5DQ0ZdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBDQ0lUVEZheFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwiUnVuTGVuZ3RoRGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJSTFwiKSB7XG4gICAgICAgIHhyZWZTdHJlYW1TdGF0c1tTdHJlYW1UeXBlLlJMWF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFJ1bkxlbmd0aFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkpCSUcyRGVjb2RlXCIpIHtcbiAgICAgICAgeHJlZlN0cmVhbVN0YXRzW1N0cmVhbVR5cGUuSkJJR10gPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IEpiaWcyU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHN0cmVhbS5kaWN0LCBwYXJhbXMpO1xuICAgICAgfVxuICAgICAgd2FybihgRmlsdGVyIFwiJHtuYW1lfVwiIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIHdhcm4oYEludmFsaWQgc3RyZWFtOiBcIiR7ZXh9XCJgKTtcbiAgICAgIHJldHVybiBuZXcgTnVsbFN0cmVhbSgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBICcxJyBpbiB0aGlzIGFycmF5IG1lYW5zIHRoZSBjaGFyYWN0ZXIgaXMgd2hpdGUgc3BhY2UuIEEgJzEnIG9yXG4vLyAnMicgbWVhbnMgdGhlIGNoYXJhY3RlciBlbmRzIGEgbmFtZSBvciBjb21tYW5kLlxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBzcGVjaWFsQ2hhcnMgPSBbXG4gIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDAsIDAsIC8vIDB4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDF4XG4gIDEsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDIsIC8vIDJ4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIC8vIDN4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDR4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIDAsIC8vIDV4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDZ4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIDAsIC8vIDd4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDh4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDl4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGF4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGJ4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGN4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGR4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGV4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgIC8vIGZ4XG5dO1xuXG5mdW5jdGlvbiB0b0hleERpZ2l0KGNoKSB7XG4gIGlmIChjaCA+PSAvKiAnMCcgPSAqLyAweDMwICYmIGNoIC8qICc5JyA9ICovIDw9IDB4MzkpIHtcbiAgICByZXR1cm4gY2ggJiAweDBmO1xuICB9XG4gIGlmIChcbiAgICAoY2ggPj0gLyogJ0EnID0gKi8gMHg0MSAmJiBjaCA8PSAvKiAnRicgPSAqLyAweDQ2KSB8fFxuICAgIChjaCA+PSAvKiAnYScgPSAqLyAweDYxICYmIGNoIDw9IC8qICdmJyA9ICovIDB4NjYpXG4gICkge1xuICAgIHJldHVybiAoY2ggJiAweDBmKSArIDk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5jbGFzcyBMZXhlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwga25vd25Db21tYW5kcyA9IG51bGwpIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLm5leHRDaGFyKCk7XG5cbiAgICAvLyBXaGlsZSBsZXhpbmcsIHdlIGJ1aWxkIHVwIG1hbnkgc3RyaW5ncyBvbmUgY2hhciBhdCBhIHRpbWUuIFVzaW5nICs9IGZvclxuICAgIC8vIHRoaXMgY2FuIHJlc3VsdCBpbiBsb3RzIG9mIGdhcmJhZ2Ugc3RyaW5ncy4gSXQncyBiZXR0ZXIgdG8gYnVpbGQgYW5cbiAgICAvLyBhcnJheSBvZiBzaW5nbGUtY2hhciBzdHJpbmdzIGFuZCB0aGVuIGpvaW4oKSB0aGVtIHRvZ2V0aGVyIGF0IHRoZSBlbmQuXG4gICAgLy8gQW5kIHJldXNpbmcgYSBzaW5nbGUgYXJyYXkgKGkuZS4gfHRoaXMuc3RyQnVmfCkgb3ZlciBhbmQgb3ZlciBmb3IgdGhpc1xuICAgIC8vIHB1cnBvc2UgdXNlcyBsZXNzIG1lbW9yeSB0aGFuIHVzaW5nIGEgbmV3IGFycmF5IGZvciBlYWNoIHN0cmluZy5cbiAgICB0aGlzLnN0ckJ1ZiA9IFtdO1xuXG4gICAgLy8gVGhlIFBERnMgbWlnaHQgaGF2ZSBcImdsdWVkXCIgY29tbWFuZHMgd2l0aCBvdGhlciBjb21tYW5kcywgb3BlcmFuZHMgb3JcbiAgICAvLyBsaXRlcmFscywgZS5nLiBcInExXCIuIFRoZSBrbm93bkNvbW1hbmRzIGlzIGEgZGljdGlvbmFyeSBvZiB0aGUgdmFsaWRcbiAgICAvLyBjb21tYW5kcyBhbmQgdGhlaXIgcHJlZml4ZXMuIFRoZSBwcmVmaXhlcyBhcmUgYnVpbHQgdGhlIGZvbGxvd2luZyB3YXk6XG4gICAgLy8gaWYgdGhlcmUgYSBjb21tYW5kIHRoYXQgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyIHZhbGlkIGNvbW1hbmQgb3JcbiAgICAvLyBsaXRlcmFsIChlLmcuICdmJyBhbmQgJ2ZhbHNlJykgdGhlIGZvbGxvd2luZyBwcmVmaXhlcyBtdXN0IGJlIGluY2x1ZGVkLFxuICAgIC8vICdmYScsICdmYWwnLCAnZmFscycuIFRoZSBwcmVmaXhlcyBhcmUgbm90IG5lZWRlZCwgaWYgdGhlIGNvbW1hbmQgaGFzIG5vXG4gICAgLy8gb3RoZXIgY29tbWFuZHMgb3IgbGl0ZXJhbHMgYXMgYSBwcmVmaXguIFRoZSBrbm93Q29tbWFuZHMgaXMgb3B0aW9uYWwuXG4gICAgdGhpcy5rbm93bkNvbW1hbmRzID0ga25vd25Db21tYW5kcztcblxuICAgIHRoaXMuX2hleFN0cmluZ051bVdhcm4gPSAwO1xuICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IC0xO1xuICB9XG5cbiAgbmV4dENoYXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKTtcbiAgfVxuXG4gIHBlZWtDaGFyKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbS5wZWVrQnl0ZSgpO1xuICB9XG5cbiAgZ2V0TnVtYmVyKCkge1xuICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7XG4gICAgbGV0IGVOb3RhdGlvbiA9IGZhbHNlO1xuICAgIGxldCBkaXZpZGVCeSA9IDA7IC8vIERpZmZlcmVudCBmcm9tIDAgaWYgaXQncyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLlxuICAgIGxldCBzaWduID0gMDtcblxuICAgIGlmIChjaCA9PT0gLyogJy0nID0gKi8gMHgyZCkge1xuICAgICAgc2lnbiA9IC0xO1xuICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG5cbiAgICAgIGlmIChjaCA9PT0gLyogJy0nID0gKi8gMHgyZCkge1xuICAgICAgICAvLyBJZ25vcmUgZG91YmxlIG5lZ2F0aXZlICh0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBBZG9iZSBSZWFkZXIpLlxuICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAvKiAnKycgPSAqLyAweDJiKSB7XG4gICAgICBzaWduID0gMTtcbiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgIH1cbiAgICBpZiAoY2ggPT09IC8qIExGID0gKi8gMHgwYSB8fCBjaCA9PT0gLyogQ1IgPSAqLyAweDBkKSB7XG4gICAgICAvLyBJZ25vcmUgbGluZS1icmVha3MgKHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIEFkb2JlIFJlYWRlcikuXG4gICAgICBkbyB7XG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgfSB3aGlsZSAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpO1xuICAgIH1cbiAgICBpZiAoY2ggPT09IC8qICcuJyA9ICovIDB4MmUpIHtcbiAgICAgIGRpdmlkZUJ5ID0gMTA7XG4gICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICB9XG4gICAgaWYgKGNoIDwgLyogJzAnID0gKi8gMHgzMCB8fCBjaCA+IC8qICc5JyA9ICovIDB4MzkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGl2aWRlQnkgPT09IDEwICYmXG4gICAgICAgIHNpZ24gPT09IDAgJiZcbiAgICAgICAgKGlzV2hpdGVTcGFjZShjaCkgfHwgY2ggPT09IC8qIEVPRiA9ICovIC0xKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIEFkb2JlIFJlYWRlciAoZml4ZXMgaXNzdWU5MjUyLnBkZikuXG4gICAgICAgIHdhcm4oXCJMZXhlci5nZXROdW1iZXIgLSB0cmVhdGluZyBhIHNpbmdsZSBkZWNpbWFsIHBvaW50IGFzIHplcm8uXCIpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgYEludmFsaWQgbnVtYmVyOiAke1N0cmluZy5mcm9tQ2hhckNvZGUoY2gpfSAoY2hhckNvZGUgJHtjaH0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzaWduID0gc2lnbiB8fCAxO1xuICAgIGxldCBiYXNlVmFsdWUgPSBjaCAtIDB4MzA7IC8vICcwJ1xuICAgIGxldCBwb3dlclZhbHVlID0gMDtcbiAgICBsZXQgcG93ZXJWYWx1ZVNpZ24gPSAxO1xuXG4gICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkge1xuICAgICAgaWYgKGNoID49IC8qICcwJyA9ICovIDB4MzAgJiYgY2ggPD0gLyogJzknID0gKi8gMHgzOSkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGlnaXQgPSBjaCAtIDB4MzA7IC8vICcwJ1xuICAgICAgICBpZiAoZU5vdGF0aW9uKSB7XG4gICAgICAgICAgLy8gV2UgYXJlIGFmdGVyIGFuICdlJyBvciAnRScuXG4gICAgICAgICAgcG93ZXJWYWx1ZSA9IHBvd2VyVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZGl2aWRlQnkgIT09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGFyZSBhZnRlciBhIHBvaW50LlxuICAgICAgICAgICAgZGl2aWRlQnkgKj0gMTA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJhc2VWYWx1ZSA9IGJhc2VWYWx1ZSAqIDEwICsgY3VycmVudERpZ2l0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSAvKiAnLicgPSAqLyAweDJlKSB7XG4gICAgICAgIGlmIChkaXZpZGVCeSA9PT0gMCkge1xuICAgICAgICAgIGRpdmlkZUJ5ID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBIG51bWJlciBjYW4gaGF2ZSBvbmx5IG9uZSBkb3QuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IC8qICctJyA9ICovIDB4MmQpIHtcbiAgICAgICAgLy8gSWdub3JlIG1pbnVzIHNpZ25zIGluIHRoZSBtaWRkbGUgb2YgbnVtYmVycyB0byBtYXRjaFxuICAgICAgICAvLyBBZG9iZSdzIGJlaGF2aW9yLlxuICAgICAgICB3YXJuKFwiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlXCIpO1xuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gLyogJ0UnID0gKi8gMHg0NSB8fCBjaCA9PT0gLyogJ2UnID0gKi8gMHg2NSkge1xuICAgICAgICAvLyAnRScgY2FuIGJlIGVpdGhlciBhIHNjaWVudGlmaWMgbm90YXRpb24gb3IgdGhlIGJlZ2lubmluZyBvZiBhIG5ld1xuICAgICAgICAvLyBvcGVyYXRvci5cbiAgICAgICAgY2ggPSB0aGlzLnBlZWtDaGFyKCk7XG4gICAgICAgIGlmIChjaCA9PT0gLyogJysnID0gKi8gMHgyYiB8fCBjaCA9PT0gLyogJy0nID0gKi8gMHgyZCkge1xuICAgICAgICAgIHBvd2VyVmFsdWVTaWduID0gY2ggPT09IDB4MmQgPyAtMSA6IDE7XG4gICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOyAvLyBDb25zdW1lIHRoZSBzaWduIGNoYXJhY3Rlci5cbiAgICAgICAgfSBlbHNlIGlmIChjaCA8IC8qICcwJyA9ICovIDB4MzAgfHwgY2ggPiAvKiAnOScgPSAqLyAweDM5KSB7XG4gICAgICAgICAgLy8gVGhlICdFJyBtdXN0IGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgb3BlcmF0b3IuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZU5vdGF0aW9uID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBsYXN0IGNoYXJhY3RlciBkb2Vzbid0IGJlbG9uZyB0byB1cy5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7XG4gICAgICBiYXNlVmFsdWUgLz0gZGl2aWRlQnk7XG4gICAgfVxuICAgIGlmIChlTm90YXRpb24pIHtcbiAgICAgIGJhc2VWYWx1ZSAqPSAxMCAqKiAocG93ZXJWYWx1ZVNpZ24gKiBwb3dlclZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZ24gKiBiYXNlVmFsdWU7XG4gIH1cblxuICBnZXRTdHJpbmcoKSB7XG4gICAgbGV0IG51bVBhcmVuID0gMTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmO1xuICAgIHN0ckJ1Zi5sZW5ndGggPSAwO1xuXG4gICAgbGV0IGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgY2hhckJ1ZmZlcmVkID0gZmFsc2U7XG4gICAgICBzd2l0Y2ggKGNoIHwgMCkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIHdhcm4oXCJVbnRlcm1pbmF0ZWQgc3RyaW5nXCIpO1xuICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4Mjg6IC8vICcoJ1xuICAgICAgICAgICsrbnVtUGFyZW47XG4gICAgICAgICAgc3RyQnVmLnB1c2goXCIoXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4Mjk6IC8vICcpJ1xuICAgICAgICAgIGlmICgtLW51bVBhcmVuID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7IC8vIGNvbnN1bWUgc3RyaW5ncyAnKSdcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJCdWYucHVzaChcIilcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4NWM6IC8vICdcXFxcJ1xuICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICAgIHdhcm4oXCJVbnRlcm1pbmF0ZWQgc3RyaW5nXCIpO1xuICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NmU6IC8vICduJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcblwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NzI6IC8vICdyJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcclwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NzQ6IC8vICd0J1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcdFwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NjI6IC8vICdiJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcYlwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NjY6IC8vICdmJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcZlwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NWM6IC8vICdcXCdcbiAgICAgICAgICAgIGNhc2UgMHgyODogLy8gJygnXG4gICAgICAgICAgICBjYXNlIDB4Mjk6IC8vICcpJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweDMwOiAvLyAnMCdcbiAgICAgICAgICAgIGNhc2UgMHgzMTogLy8gJzEnXG4gICAgICAgICAgICBjYXNlIDB4MzI6IC8vICcyJ1xuICAgICAgICAgICAgY2FzZSAweDMzOiAvLyAnMydcbiAgICAgICAgICAgIGNhc2UgMHgzNDogLy8gJzQnXG4gICAgICAgICAgICBjYXNlIDB4MzU6IC8vICc1J1xuICAgICAgICAgICAgY2FzZSAweDM2OiAvLyAnNidcbiAgICAgICAgICAgIGNhc2UgMHgzNzogLy8gJzcnXG4gICAgICAgICAgICAgIGxldCB4ID0gY2ggJiAweDBmO1xuICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgICAgICAgY2hhckJ1ZmZlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgaWYgKGNoID49IC8qICcwJyA9ICovIDB4MzAgJiYgY2ggPD0gLyogJzcnID0gKi8gMHgzNykge1xuICAgICAgICAgICAgICAgIHggPSAoeCA8PCAzKSArIChjaCAmIDB4MGYpO1xuICAgICAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA+PSAvKiAnMCcgPSAqLyAweDMwICYmIGNoIC8qICc3JyA9ICovIDw9IDB4MzcpIHtcbiAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgeCA9ICh4IDw8IDMpICsgKGNoICYgMHgwZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoeCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHgwZDogLy8gQ1JcbiAgICAgICAgICAgICAgaWYgKHRoaXMucGVla0NoYXIoKSA9PT0gLyogTEYgPSAqLyAweDBhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweDBhOiAvLyBMRlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGFyQnVmZmVyZWQpIHtcbiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbiAgfVxuXG4gIGdldE5hbWUoKSB7XG4gICAgbGV0IGNoLCBwcmV2aW91c0NoO1xuICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmO1xuICAgIHN0ckJ1Zi5sZW5ndGggPSAwO1xuXG4gICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAhc3BlY2lhbENoYXJzW2NoXSkge1xuICAgICAgaWYgKGNoID09PSAvKiAnIycgPSAqLyAweDIzKSB7XG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICBpZiAoc3BlY2lhbENoYXJzW2NoXSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBcIkxleGVyX2dldE5hbWU6IFwiICtcbiAgICAgICAgICAgICAgXCJOVU1CRVIgU0lHTiAoIykgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgaGV4YWRlY2ltYWwgbnVtYmVyLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzdHJCdWYucHVzaChcIiNcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeCA9IHRvSGV4RGlnaXQoY2gpO1xuICAgICAgICBpZiAoeCAhPT0gLTEpIHtcbiAgICAgICAgICBwcmV2aW91c0NoID0gY2g7XG4gICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgICAgY29uc3QgeDIgPSB0b0hleERpZ2l0KGNoKTtcbiAgICAgICAgICBpZiAoeDIgPT09IC0xKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBgTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0pIGAgK1xuICAgICAgICAgICAgICAgIFwiaW4gaGV4YWRlY2ltYWwgbnVtYmVyLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RyQnVmLnB1c2goXCIjXCIsIFN0cmluZy5mcm9tQ2hhckNvZGUocHJldmlvdXNDaCkpO1xuICAgICAgICAgICAgaWYgKHNwZWNpYWxDaGFyc1tjaF0pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgoeCA8PCA0KSB8IHgyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyQnVmLnB1c2goXCIjXCIsIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RyQnVmLmxlbmd0aCA+IDEyNykge1xuICAgICAgd2FybihgTmFtZSB0b2tlbiBpcyBsb25nZXIgdGhhbiBhbGxvd2VkIGJ5IHRoZSBzcGVjOiAke3N0ckJ1Zi5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBOYW1lLmdldChzdHJCdWYuam9pbihcIlwiKSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9oZXhTdHJpbmdXYXJuKGNoKSB7XG4gICAgY29uc3QgTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4gPSA1O1xuXG4gICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4rKyA9PT0gTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4pIHtcbiAgICAgIHdhcm4oXCJnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBhZGRpdGlvbmFsIGludmFsaWQgY2hhcmFjdGVycy5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID4gTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4pIHtcbiAgICAgIC8vIExpbWl0IHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyBwcmludGVkIGZvciBhIGB0aGlzLmdldEhleFN0cmluZ2BcbiAgICAgIC8vIGludm9jYXRpb24sIHNpbmNlIGNvcnJ1cHQgUERGIGRvY3VtZW50cyBtYXkgb3RoZXJ3aXNlIHNwYW0gdGhlIGNvbnNvbGVcbiAgICAgIC8vIGVub3VnaCB0byBhZmZlY3QgZ2VuZXJhbCBwZXJmb3JtYW5jZSBuZWdhdGl2ZWx5LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuKGBnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlcjogJHtjaH1gKTtcbiAgfVxuXG4gIGdldEhleFN0cmluZygpIHtcbiAgICBjb25zdCBzdHJCdWYgPSB0aGlzLnN0ckJ1ZjtcbiAgICBzdHJCdWYubGVuZ3RoID0gMDtcbiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyO1xuICAgIGxldCBpc0ZpcnN0SGV4ID0gdHJ1ZTtcbiAgICBsZXQgZmlyc3REaWdpdCwgc2Vjb25kRGlnaXQ7XG4gICAgdGhpcy5faGV4U3RyaW5nTnVtV2FybiA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGNoIDwgMCkge1xuICAgICAgICB3YXJuKFwiVW50ZXJtaW5hdGVkIGhleCBzdHJpbmdcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gLyogJz4nID0gKi8gMHgzZSkge1xuICAgICAgICB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdID09PSAxKSB7XG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0ZpcnN0SGV4KSB7XG4gICAgICAgICAgZmlyc3REaWdpdCA9IHRvSGV4RGlnaXQoY2gpO1xuICAgICAgICAgIGlmIChmaXJzdERpZ2l0ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5faGV4U3RyaW5nV2FybihjaCk7XG4gICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWNvbmREaWdpdCA9IHRvSGV4RGlnaXQoY2gpO1xuICAgICAgICAgIGlmIChzZWNvbmREaWdpdCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2hleFN0cmluZ1dhcm4oY2gpO1xuICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgoZmlyc3REaWdpdCA8PCA0KSB8IHNlY29uZERpZ2l0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNGaXJzdEhleCA9ICFpc0ZpcnN0SGV4O1xuICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0ckJ1Zi5qb2luKFwiXCIpO1xuICB9XG5cbiAgZ2V0T2JqKCkge1xuICAgIC8vIFNraXAgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMuXG4gICAgbGV0IGNvbW1lbnQgPSBmYWxzZTtcbiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoY2ggPCAwKSB7XG4gICAgICAgIHJldHVybiBFT0Y7XG4gICAgICB9XG4gICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAoY2ggPT09IC8qIExGID0gKi8gMHgwYSB8fCBjaCA9PT0gLyogQ1IgPSAqLyAweDBkKSB7XG4gICAgICAgICAgY29tbWVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSAvKiAnJScgPSAqLyAweDI1KSB7XG4gICAgICAgIGNvbW1lbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdICE9PSAxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgcmVhZGluZyBhIHRva2VuLlxuICAgIHN3aXRjaCAoY2ggfCAwKSB7XG4gICAgICBjYXNlIDB4MzA6IC8vICcwJ1xuICAgICAgY2FzZSAweDMxOiAvLyAnMSdcbiAgICAgIGNhc2UgMHgzMjogLy8gJzInXG4gICAgICBjYXNlIDB4MzM6IC8vICczJ1xuICAgICAgY2FzZSAweDM0OiAvLyAnNCdcbiAgICAgIGNhc2UgMHgzNTogLy8gJzUnXG4gICAgICBjYXNlIDB4MzY6IC8vICc2J1xuICAgICAgY2FzZSAweDM3OiAvLyAnNydcbiAgICAgIGNhc2UgMHgzODogLy8gJzgnXG4gICAgICBjYXNlIDB4Mzk6IC8vICc5J1xuICAgICAgY2FzZSAweDJiOiAvLyAnKydcbiAgICAgIGNhc2UgMHgyZDogLy8gJy0nXG4gICAgICBjYXNlIDB4MmU6IC8vICcuJ1xuICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTtcbiAgICAgIGNhc2UgMHgyODogLy8gJygnXG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygpO1xuICAgICAgY2FzZSAweDJmOiAvLyAnLydcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpO1xuICAgICAgLy8gYXJyYXkgcHVuY3R1YXRpb25cbiAgICAgIGNhc2UgMHg1YjogLy8gJ1snXG4gICAgICAgIHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgcmV0dXJuIENtZC5nZXQoXCJbXCIpO1xuICAgICAgY2FzZSAweDVkOiAvLyAnXSdcbiAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICByZXR1cm4gQ21kLmdldChcIl1cIik7XG4gICAgICAvLyBoZXggc3RyaW5nIG9yIGRpY3QgcHVuY3R1YXRpb25cbiAgICAgIGNhc2UgMHgzYzogLy8gJzwnXG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICBpZiAoY2ggPT09IDB4M2MpIHtcbiAgICAgICAgICAvLyBkaWN0IHB1bmN0dWF0aW9uXG4gICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgIHJldHVybiBDbWQuZ2V0KFwiPDxcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGV4U3RyaW5nKCk7XG4gICAgICAvLyBkaWN0IHB1bmN0dWF0aW9uXG4gICAgICBjYXNlIDB4M2U6IC8vICc+J1xuICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgaWYgKGNoID09PSAweDNlKSB7XG4gICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgIHJldHVybiBDbWQuZ2V0KFwiPj5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENtZC5nZXQoXCI+XCIpO1xuICAgICAgY2FzZSAweDdiOiAvLyAneydcbiAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICByZXR1cm4gQ21kLmdldChcIntcIik7XG4gICAgICBjYXNlIDB4N2Q6IC8vICd9J1xuICAgICAgICB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgIHJldHVybiBDbWQuZ2V0KFwifVwiKTtcbiAgICAgIGNhc2UgMHgyOTogLy8gJyknXG4gICAgICAgIC8vIENvbnN1bWUgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGluIG9yZGVyIHRvIGF2b2lkIHBlcm1hbmVudGx5IGhhbmdpbmdcbiAgICAgICAgLy8gdGhlIHdvcmtlciB0aHJlYWQgaWYgYExleGVyLmdldE9iamVjdGAgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgbG9vcFxuICAgICAgICAvLyBjb250YWluaW5nIHRyeS1jYXRjaCBzdGF0ZW1lbnRzLCBzaW5jZSB3ZSB3b3VsZCBvdGhlcndpc2UgYXR0ZW1wdFxuICAgICAgICAvLyB0byBwYXJzZSB0aGUgKnNhbWUqIGNoYXJhY3RlciBvdmVyIGFuZCBvdmVyIChmaXhlcyBpc3N1ZTgwNjEucGRmKS5cbiAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYElsbGVnYWwgY2hhcmFjdGVyOiAke2NofWApO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHJlYWRpbmcgYSBjb21tYW5kLlxuICAgIGxldCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICBjb25zdCBrbm93bkNvbW1hbmRzID0gdGhpcy5rbm93bkNvbW1hbmRzO1xuICAgIGxldCBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHMgJiYga25vd25Db21tYW5kc1tzdHJdICE9PSB1bmRlZmluZWQ7XG4gICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAhc3BlY2lhbENoYXJzW2NoXSkge1xuICAgICAgLy8gU3RvcCBpZiBhIGtub3duIGNvbW1hbmQgaXMgZm91bmQgYW5kIG5leHQgY2hhcmFjdGVyIGRvZXMgbm90IG1ha2VcbiAgICAgIC8vIHRoZSBzdHJpbmcgYSBjb21tYW5kLlxuICAgICAgY29uc3QgcG9zc2libGVDb21tYW5kID0gc3RyICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICBpZiAoa25vd25Db21tYW5kRm91bmQgJiYga25vd25Db21tYW5kc1twb3NzaWJsZUNvbW1hbmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTI4KSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHtzdHIubGVuZ3RofWApO1xuICAgICAgfVxuICAgICAgc3RyID0gcG9zc2libGVDb21tYW5kO1xuICAgICAga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzICYmIGtub3duQ29tbWFuZHNbc3RyXSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoc3RyID09PSBcInRydWVcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdHIgPT09IFwiZmFsc2VcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RyID09PSBcIm51bGxcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHN0ciA9PT0gXCJCSVwiKSB7XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiwgc2luY2UgaXQncyBuZWVkZWQgaW4gb3JkZXJcbiAgICAgIC8vIHRvIGNvcnJlY3RseSBjYWNoZSBpbmxpbmUgaW1hZ2VzOyBzZWUgYFBhcnNlci5tYWtlSW5saW5lSW1hZ2VgLlxuICAgICAgdGhpcy5iZWdpbklubGluZUltYWdlUG9zID0gdGhpcy5zdHJlYW0ucG9zO1xuICAgIH1cblxuICAgIHJldHVybiBDbWQuZ2V0KHN0cik7XG4gIH1cblxuICBwZWVrT2JqKCkge1xuICAgIGNvbnN0IHN0cmVhbVBvcyA9IHRoaXMuc3RyZWFtLnBvcyxcbiAgICAgIGN1cnJlbnRDaGFyID0gdGhpcy5jdXJyZW50Q2hhcixcbiAgICAgIGJlZ2luSW5saW5lSW1hZ2VQb3MgPSB0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3M7XG5cbiAgICBsZXQgbmV4dE9iajtcbiAgICB0cnkge1xuICAgICAgbmV4dE9iaiA9IHRoaXMuZ2V0T2JqKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgd2FybihgcGVla09iajogJHtleH1gKTtcbiAgICB9XG4gICAgLy8gRW5zdXJlIHRoYXQgd2UgcmVzZXQgKmFsbCogcmVsZXZhbnQgYExleGVyYC1pbnN0YW5jZSBzdGF0ZS5cbiAgICB0aGlzLnN0cmVhbS5wb3MgPSBzdHJlYW1Qb3M7XG4gICAgdGhpcy5jdXJyZW50Q2hhciA9IGN1cnJlbnRDaGFyO1xuICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IGJlZ2luSW5saW5lSW1hZ2VQb3M7XG5cbiAgICByZXR1cm4gbmV4dE9iajtcbiAgfVxuXG4gIHNraXBUb05leHRMaW5lKCkge1xuICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7XG4gICAgd2hpbGUgKGNoID49IDApIHtcbiAgICAgIGlmIChjaCA9PT0gLyogQ1IgPSAqLyAweDBkKSB7XG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICBpZiAoY2ggPT09IC8qIExGID0gKi8gMHgwYSkge1xuICAgICAgICAgIHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IC8qIExGID0gKi8gMHgwYSkge1xuICAgICAgICB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIExpbmVhcml6YXRpb24ge1xuICBzdGF0aWMgY3JlYXRlKHN0cmVhbSkge1xuICAgIGZ1bmN0aW9uIGdldEludChsaW5EaWN0LCBuYW1lLCBhbGxvd1plcm9WYWx1ZSA9IGZhbHNlKSB7XG4gICAgICBjb25zdCBvYmogPSBsaW5EaWN0LmdldChuYW1lKTtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikgJiYgKGFsbG93WmVyb1ZhbHVlID8gb2JqID49IDAgOiBvYmogPiAwKSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIFwiJHtuYW1lfVwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBgICtcbiAgICAgICAgICBcImRpY3Rpb25hcnkgaXMgaW52YWxpZC5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRIaW50cyhsaW5EaWN0KSB7XG4gICAgICBjb25zdCBoaW50cyA9IGxpbkRpY3QuZ2V0KFwiSFwiKTtcbiAgICAgIGxldCBoaW50c0xlbmd0aDtcblxuICAgICAgaWYgKFxuICAgICAgICBBcnJheS5pc0FycmF5KGhpbnRzKSAmJlxuICAgICAgICAoKGhpbnRzTGVuZ3RoID0gaGludHMubGVuZ3RoKSA9PT0gMiB8fCBoaW50c0xlbmd0aCA9PT0gNClcbiAgICAgICkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaGludHNMZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBoaW50ID0gaGludHNbaW5kZXhdO1xuICAgICAgICAgIGlmICghKE51bWJlci5pc0ludGVnZXIoaGludCkgJiYgaGludCA+IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBIaW50ICgke2luZGV4fSkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaW50cztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkhpbnQgYXJyYXkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcbiAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSxcbiAgICAgIHhyZWY6IG51bGwsXG4gICAgfSk7XG4gICAgY29uc3Qgb2JqMSA9IHBhcnNlci5nZXRPYmooKTtcbiAgICBjb25zdCBvYmoyID0gcGFyc2VyLmdldE9iaigpO1xuICAgIGNvbnN0IG9iajMgPSBwYXJzZXIuZ2V0T2JqKCk7XG4gICAgY29uc3QgbGluRGljdCA9IHBhcnNlci5nZXRPYmooKTtcbiAgICBsZXQgb2JqLCBsZW5ndGg7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihvYmoxKSAmJlxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKG9iajIpICYmXG4gICAgICAgIGlzQ21kKG9iajMsIFwib2JqXCIpICYmXG4gICAgICAgIGlzRGljdChsaW5EaWN0KSAmJlxuICAgICAgICBpc051bSgob2JqID0gbGluRGljdC5nZXQoXCJMaW5lYXJpemVkXCIpKSkgJiZcbiAgICAgICAgb2JqID4gMFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIHZhbGlkIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBmb3VuZC5cbiAgICB9IGVsc2UgaWYgKChsZW5ndGggPSBnZXRJbnQobGluRGljdCwgXCJMXCIpKSAhPT0gc3RyZWFtLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIFwiTFwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5ICcgK1xuICAgICAgICAgIFwiZG9lcyBub3QgZXF1YWwgdGhlIHN0cmVhbSBsZW5ndGguXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsZW5ndGgsXG4gICAgICBoaW50czogZ2V0SGludHMobGluRGljdCksXG4gICAgICBvYmplY3ROdW1iZXJGaXJzdDogZ2V0SW50KGxpbkRpY3QsIFwiT1wiKSxcbiAgICAgIGVuZEZpcnN0OiBnZXRJbnQobGluRGljdCwgXCJFXCIpLFxuICAgICAgbnVtUGFnZXM6IGdldEludChsaW5EaWN0LCBcIk5cIiksXG4gICAgICBtYWluWFJlZkVudHJpZXNPZmZzZXQ6IGdldEludChsaW5EaWN0LCBcIlRcIiksXG4gICAgICBwYWdlRmlyc3Q6IGxpbkRpY3QuaGFzKFwiUFwiKVxuICAgICAgICA/IGdldEludChsaW5EaWN0LCBcIlBcIiwgLyogYWxsb3daZXJvVmFsdWUgPSAqLyB0cnVlKVxuICAgICAgICA6IDAsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgeyBMZXhlciwgTGluZWFyaXphdGlvbiwgUGFyc2VyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIENvcHlyaWdodCAxOTk2LTIwMDMgR2x5cGggJiBDb2csIExMQ1xuICpcbiAqIFRoZSBmbGF0ZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIEphdmFTY3JpcHQgcG9ydFxuICogb2YgWFBERidzIGltcGxlbWVudGF0aW9uLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZVxuICogbGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGb3JtYXRFcnJvciwgc3RyaW5nVG9CeXRlcywgdW5yZWFjaGFibGUgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IGlzRGljdCB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IGlzV2hpdGVTcGFjZSB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxudmFyIFN0cmVhbSA9IChmdW5jdGlvbiBTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIFN0cmVhbShhcnJheUJ1ZmZlciwgc3RhcnQsIGxlbmd0aCwgZGljdCkge1xuICAgIHRoaXMuYnl0ZXMgPVxuICAgICAgYXJyYXlCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICAgID8gYXJyYXlCdWZmZXJcbiAgICAgICAgOiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIHRoaXMuZW5kID0gc3RhcnQgKyBsZW5ndGggfHwgdGhpcy5ieXRlcy5sZW5ndGg7XG4gICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgfVxuXG4gIC8vIHJlcXVpcmVkIG1ldGhvZHMgZm9yIGEgc3RyZWFtLiBpZiBhIHBhcnRpY3VsYXIgc3RyZWFtIGRvZXMgbm90XG4gIC8vIGltcGxlbWVudCB0aGVzZSwgYW4gZXJyb3Igc2hvdWxkIGJlIHRocm93blxuICBTdHJlYW0ucHJvdG90eXBlID0ge1xuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmQgLSB0aGlzLnN0YXJ0O1xuICAgIH0sXG4gICAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7XG4gICAgfSxcbiAgICBnZXRCeXRlOiBmdW5jdGlvbiBTdHJlYW1fZ2V0Qnl0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmVuZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLnBvcysrXTtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gU3RyZWFtX2dldFVpbnQxNigpIHtcbiAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gU3RyZWFtX2dldEludDMyKCkge1xuICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIHZhciBiMiA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgdmFyIGIzID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMztcbiAgICB9LFxuICAgIC8vIFJldHVybnMgc3ViYXJyYXkgb2Ygb3JpZ2luYWwgYnVmZmVyLCBzaG91bGQgb25seSBiZSByZWFkLlxuICAgIGdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkID0gZmFsc2UpIHtcbiAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7XG4gICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICB2YXIgc3RyRW5kID0gdGhpcy5lbmQ7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpO1xuICAgICAgICAvLyBgdGhpcy5ieXRlc2AgaXMgYWx3YXlzIGEgYFVpbnQ4QXJyYXlgIGhlcmUuXG4gICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gICAgICB9XG4gICAgICB2YXIgZW5kID0gcG9zICsgbGVuZ3RoO1xuICAgICAgaWYgKGVuZCA+IHN0ckVuZCkge1xuICAgICAgICBlbmQgPSBzdHJFbmQ7XG4gICAgICB9XG4gICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgIGNvbnN0IHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpO1xuICAgICAgLy8gYHRoaXMuYnl0ZXNgIGlzIGFsd2F5cyBhIGBVaW50OEFycmF5YCBoZXJlLlxuICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTtcbiAgICB9LFxuICAgIHBlZWtCeXRlOiBmdW5jdGlvbiBTdHJlYW1fcGVla0J5dGUoKSB7XG4gICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgaWYgKHBlZWtlZEJ5dGUgIT09IC0xKSB7XG4gICAgICAgIHRoaXMucG9zLS07XG4gICAgICB9XG4gICAgICByZXR1cm4gcGVla2VkQnl0ZTtcbiAgICB9LFxuICAgIHBlZWtCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCA9IGZhbHNlKSB7XG4gICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTtcbiAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDtcbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9LFxuXG4gICAgZ2V0Qnl0ZVJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICAgIGlmIChiZWdpbiA8IDApIHtcbiAgICAgICAgYmVnaW4gPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCA+IHRoaXMuZW5kKSB7XG4gICAgICAgIGVuZCA9IHRoaXMuZW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uIFN0cmVhbV9za2lwKG4pIHtcbiAgICAgIGlmICghbikge1xuICAgICAgICBuID0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMucG9zICs9IG47XG4gICAgfSxcbiAgICByZXNldDogZnVuY3Rpb24gU3RyZWFtX3Jlc2V0KCkge1xuICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIH0sXG4gICAgbW92ZVN0YXJ0OiBmdW5jdGlvbiBTdHJlYW1fbW92ZVN0YXJ0KCkge1xuICAgICAgdGhpcy5zdGFydCA9IHRoaXMucG9zO1xuICAgIH0sXG4gICAgbWFrZVN1YlN0cmVhbTogZnVuY3Rpb24gU3RyZWFtX21ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCkge1xuICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIFN0cmVhbTtcbn0pKCk7XG5cbnZhciBTdHJpbmdTdHJlYW0gPSAoZnVuY3Rpb24gU3RyaW5nU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBTdHJpbmdTdHJlYW0oc3RyKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBzdHJpbmdUb0J5dGVzKHN0cik7XG4gICAgU3RyZWFtLmNhbGwodGhpcywgYnl0ZXMpO1xuICB9XG5cbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZSA9IFN0cmVhbS5wcm90b3R5cGU7XG5cbiAgcmV0dXJuIFN0cmluZ1N0cmVhbTtcbn0pKCk7XG5cbi8vIHN1cGVyIGNsYXNzIGZvciB0aGUgZGVjb2Rpbmcgc3RyZWFtc1xudmFyIERlY29kZVN0cmVhbSA9IChmdW5jdGlvbiBEZWNvZGVTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBMb3RzIG9mIERlY29kZVN0cmVhbXMgYXJlIGNyZWF0ZWQgd2hvc2UgYnVmZmVycyBhcmUgbmV2ZXIgdXNlZC4gIEZvciB0aGVzZVxuICAvLyB3ZSBzaGFyZSBhIHNpbmdsZSBlbXB0eSBidWZmZXIuIFRoaXMgaXMgKGEpIHNwYWNlLWVmZmljaWVudCBhbmQgKGIpIGF2b2lkc1xuICAvLyBoYXZpbmcgc3BlY2lhbCBjYXNlcyB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkIGlmIHdlIHVzZWQgfG51bGx8IGZvciBhbiBlbXB0eVxuICAvLyBidWZmZXIuXG4gIHZhciBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gRGVjb2RlU3RyZWFtKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7XG4gICAgdGhpcy5fcmF3TWluQnVmZmVyTGVuZ3RoID0gbWF5YmVNaW5CdWZmZXJMZW5ndGggfHwgMDtcblxuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgdGhpcy5lb2YgPSBmYWxzZTtcbiAgICB0aGlzLmJ1ZmZlciA9IGVtcHR5QnVmZmVyO1xuICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoID0gNTEyO1xuICAgIGlmIChtYXliZU1pbkJ1ZmZlckxlbmd0aCkge1xuICAgICAgLy8gQ29tcHV0ZSB0aGUgZmlyc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgYXMgYmlnIGFzIG1heWJlTWluQnVmZmVyTGVuZ3RoLlxuICAgICAgd2hpbGUgKHRoaXMubWluQnVmZmVyTGVuZ3RoIDwgbWF5YmVNaW5CdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggKj0gMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlID0ge1xuICAgIGdldCBpc0VtcHR5KCkge1xuICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwO1xuICAgIH0sXG4gICAgZW5zdXJlQnVmZmVyOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgaWYgKHJlcXVlc3RlZCA8PSBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgfVxuICAgICAgdmFyIHNpemUgPSB0aGlzLm1pbkJ1ZmZlckxlbmd0aDtcbiAgICAgIHdoaWxlIChzaXplIDwgcmVxdWVzdGVkKSB7XG4gICAgICAgIHNpemUgKj0gMjtcbiAgICAgIH1cbiAgICAgIHZhciBidWZmZXIyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICBidWZmZXIyLnNldChidWZmZXIpO1xuICAgICAgcmV0dXJuICh0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjIpO1xuICAgIH0sXG4gICAgZ2V0Qnl0ZTogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2dldEJ5dGUoKSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gcG9zKSB7XG4gICAgICAgIGlmICh0aGlzLmVvZikge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdO1xuICAgIH0sXG4gICAgZ2V0VWludDE2OiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0VWludDE2KCkge1xuICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTtcbiAgICB9LFxuICAgIGdldEludDMyOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0SW50MzIoKSB7XG4gICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgdmFyIGIyID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzO1xuICAgIH0sXG4gICAgZ2V0Qnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkge1xuICAgICAgdmFyIGVuZCxcbiAgICAgICAgcG9zID0gdGhpcy5wb3M7XG5cbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuZ3RoKTtcbiAgICAgICAgZW5kID0gcG9zICsgbGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPCBlbmQpIHtcbiAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA+IGJ1ZkVuZCkge1xuICAgICAgICAgIGVuZCA9IGJ1ZkVuZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmVvZikge1xuICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgY29uc3Qgc3ViYXJyYXkgPSB0aGlzLmJ1ZmZlci5zdWJhcnJheShwb3MsIGVuZCk7XG4gICAgICAvLyBgdGhpcy5idWZmZXJgIGlzIGVpdGhlciBhIGBVaW50OEFycmF5YCBvciBgVWludDhDbGFtcGVkQXJyYXlgIGhlcmUuXG4gICAgICByZXR1cm4gZm9yY2VDbGFtcGVkICYmICEoc3ViYXJyYXkgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlcbiAgICAgICAgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpXG4gICAgICAgIDogc3ViYXJyYXk7XG4gICAgfSxcbiAgICBwZWVrQnl0ZTogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3BlZWtCeXRlKCkge1xuICAgICAgdmFyIHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIGlmIChwZWVrZWRCeXRlICE9PSAtMSkge1xuICAgICAgICB0aGlzLnBvcy0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7XG4gICAgfSxcbiAgICBwZWVrQnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkge1xuICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7XG4gICAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfSxcbiAgICBtYWtlU3ViU3RyZWFtOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0KSB7XG4gICAgICB2YXIgZW5kID0gc3RhcnQgKyBsZW5ndGg7XG4gICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gZW5kICYmICF0aGlzLmVvZikge1xuICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpO1xuICAgIH0sXG5cbiAgICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgRGVjb2RlU3RyZWFtLmdldEJ5dGVSYW5nZVwiKTtcbiAgICB9LFxuXG4gICAgc2tpcDogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3NraXAobikge1xuICAgICAgaWYgKCFuKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5wb3MgKz0gbjtcbiAgICB9LFxuICAgIHJlc2V0OiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fcmVzZXQoKSB7XG4gICAgICB0aGlzLnBvcyA9IDA7XG4gICAgfSxcbiAgICBnZXRCYXNlU3RyZWFtczogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2dldEJhc2VTdHJlYW1zKCkge1xuICAgICAgaWYgKHRoaXMuc3RyICYmIHRoaXMuc3RyLmdldEJhc2VTdHJlYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIERlY29kZVN0cmVhbTtcbn0pKCk7XG5cbnZhciBTdHJlYW1zU2VxdWVuY2VTdHJlYW0gPSAoZnVuY3Rpb24gU3RyZWFtc1NlcXVlbmNlU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBTdHJlYW1zU2VxdWVuY2VTdHJlYW0oc3RyZWFtcykge1xuICAgIHRoaXMuc3RyZWFtcyA9IHN0cmVhbXM7XG5cbiAgICBsZXQgbWF5YmVMZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0cmVhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1tpXTtcbiAgICAgIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEZWNvZGVTdHJlYW0pIHtcbiAgICAgICAgbWF5YmVMZW5ndGggKz0gc3RyZWFtLl9yYXdNaW5CdWZmZXJMZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXliZUxlbmd0aCArPSBzdHJlYW0ubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7XG4gIH1cblxuICBTdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtcblxuICBTdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIHN0cmVhbVNlcXVlbmNlU3RyZWFtUmVhZEJsb2NrKCkge1xuICAgIHZhciBzdHJlYW1zID0gdGhpcy5zdHJlYW1zO1xuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpO1xuICAgIHZhciBjaHVuayA9IHN0cmVhbS5nZXRCeXRlcygpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICB2YXIgbmV3TGVuZ3RoID0gYnVmZmVyTGVuZ3RoICsgY2h1bmsubGVuZ3RoO1xuICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihuZXdMZW5ndGgpO1xuICAgIGJ1ZmZlci5zZXQoY2h1bmssIGJ1ZmZlckxlbmd0aCk7XG4gICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7XG4gIH07XG5cbiAgU3RyZWFtc1NlcXVlbmNlU3RyZWFtLnByb3RvdHlwZS5nZXRCYXNlU3RyZWFtcyA9IGZ1bmN0aW9uIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbV9nZXRCYXNlU3RyZWFtcygpIHtcbiAgICB2YXIgYmFzZVN0cmVhbXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLnN0cmVhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtc1tpXTtcbiAgICAgIGlmIChzdHJlYW0uZ2V0QmFzZVN0cmVhbXMpIHtcbiAgICAgICAgYmFzZVN0cmVhbXMucHVzaCguLi5zdHJlYW0uZ2V0QmFzZVN0cmVhbXMoKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXNlU3RyZWFtcztcbiAgfTtcblxuICByZXR1cm4gU3RyZWFtc1NlcXVlbmNlU3RyZWFtO1xufSkoKTtcblxudmFyIEZsYXRlU3RyZWFtID0gKGZ1bmN0aW9uIEZsYXRlU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBjb2RlTGVuQ29kZU1hcCA9IG5ldyBJbnQzMkFycmF5KFtcbiAgICAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1XG4gIF0pO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsXG4gICAgMHgxMDAwYiwgMHgxMDAwZCwgMHgxMDAwZiwgMHgxMDAxMSwgMHgyMDAxMywgMHgyMDAxNywgMHgyMDAxYiwgMHgyMDAxZixcbiAgICAweDMwMDIzLCAweDMwMDJiLCAweDMwMDMzLCAweDMwMDNiLCAweDQwMDQzLCAweDQwMDUzLCAweDQwMDYzLCAweDQwMDczLFxuICAgIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJcbiAgXSk7XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBkaXN0RGVjb2RlID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDB4MDAwMDEsIDB4MDAwMDIsIDB4MDAwMDMsIDB4MDAwMDQsIDB4MTAwMDUsIDB4MTAwMDcsIDB4MjAwMDksIDB4MjAwMGQsXG4gICAgMHgzMDAxMSwgMHgzMDAxOSwgMHg0MDAyMSwgMHg0MDAzMSwgMHg1MDA0MSwgMHg1MDA2MSwgMHg2MDA4MSwgMHg2MDBjMSxcbiAgICAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLFxuICAgIDB4YjEwMDEsIDB4YjE4MDEsIDB4YzIwMDEsIDB4YzMwMDEsIDB4ZDQwMDEsIDB4ZDYwMDFcbiAgXSk7XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBmaXhlZExpdENvZGVUYWIgPSBbbmV3IEludDMyQXJyYXkoW1xuICAgIDB4NzAxMDAsIDB4ODAwNTAsIDB4ODAwMTAsIDB4ODAxMTgsIDB4NzAxMTAsIDB4ODAwNzAsIDB4ODAwMzAsIDB4OTAwYzAsXG4gICAgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMCwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMCxcbiAgICAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkwLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQwLFxuICAgIDB4NzAxMGMsIDB4ODAwNjgsIDB4ODAwMjgsIDB4OTAwYjAsIDB4ODAwMDgsIDB4ODAwODgsIDB4ODAwNDgsIDB4OTAwZjAsXG4gICAgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOCxcbiAgICAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE4LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU4LFxuICAgIDB4NzAxMDYsIDB4ODAwNWMsIDB4ODAwMWMsIDB4OTAwOTgsIDB4NzAxMTYsIDB4ODAwN2MsIDB4ODAwM2MsIDB4OTAwZDgsXG4gICAgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOCwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOCxcbiAgICAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM0LFxuICAgIDB4NzAxMDksIDB4ODAwNjIsIDB4ODAwMjIsIDB4OTAwYTQsIDB4ODAwMDIsIDB4ODAwODIsIDB4ODAwNDIsIDB4OTAwZTQsXG4gICAgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NCwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNCxcbiAgICAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI0LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY0LFxuICAgIDB4NzAxMDMsIDB4ODAwNTYsIDB4ODAwMTYsIDB4ODAxMWUsIDB4NzAxMTMsIDB4ODAwNzYsIDB4ODAwMzYsIDB4OTAwY2MsXG4gICAgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhYywgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlYyxcbiAgICAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDljLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRjLFxuICAgIDB4NzAxMGYsIDB4ODAwNmUsIDB4ODAwMmUsIDB4OTAwYmMsIDB4ODAwMGUsIDB4ODAwOGUsIDB4ODAwNGUsIDB4OTAwZmMsXG4gICAgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMixcbiAgICAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEyLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUyLFxuICAgIDB4NzAxMDQsIDB4ODAwNTksIDB4ODAwMTksIDB4OTAwOTIsIDB4NzAxMTQsIDB4ODAwNzksIDB4ODAwMzksIDB4OTAwZDIsXG4gICAgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMiwgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMixcbiAgICAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNhLFxuICAgIDB4NzAxMGEsIDB4ODAwNjUsIDB4ODAwMjUsIDB4OTAwYWEsIDB4ODAwMDUsIDB4ODAwODUsIDB4ODAwNDUsIDB4OTAwZWEsXG4gICAgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YSwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYSxcbiAgICAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJhLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZhLFxuICAgIDB4NzAxMDEsIDB4ODAwNTMsIDB4ODAwMTMsIDB4ODAxMWIsIDB4NzAxMTEsIDB4ODAwNzMsIDB4ODAwMzMsIDB4OTAwYzYsXG4gICAgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNiwgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNixcbiAgICAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk2LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ2LFxuICAgIDB4NzAxMGQsIDB4ODAwNmIsIDB4ODAwMmIsIDB4OTAwYjYsIDB4ODAwMGIsIDB4ODAwOGIsIDB4ODAwNGIsIDB4OTAwZjYsXG4gICAgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZSxcbiAgICAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFlLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVlLFxuICAgIDB4NzAxMDcsIDB4ODAwNWYsIDB4ODAwMWYsIDB4OTAwOWUsIDB4NzAxMTcsIDB4ODAwN2YsIDB4ODAwM2YsIDB4OTAwZGUsXG4gICAgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZSwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZSxcbiAgICAweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMxLFxuICAgIDB4NzAxMDgsIDB4ODAwNjAsIDB4ODAwMjAsIDB4OTAwYTEsIDB4ODAwMDAsIDB4ODAwODAsIDB4ODAwNDAsIDB4OTAwZTEsXG4gICAgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MSwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMSxcbiAgICAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIxLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYxLFxuICAgIDB4NzAxMDIsIDB4ODAwNTQsIDB4ODAwMTQsIDB4ODAxMWMsIDB4NzAxMTIsIDB4ODAwNzQsIDB4ODAwMzQsIDB4OTAwYzksXG4gICAgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOSwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOSxcbiAgICAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk5LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ5LFxuICAgIDB4NzAxMGUsIDB4ODAwNmMsIDB4ODAwMmMsIDB4OTAwYjksIDB4ODAwMGMsIDB4ODAwOGMsIDB4ODAwNGMsIDB4OTAwZjksXG4gICAgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNSxcbiAgICAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE1LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU1LFxuICAgIDB4NzAxMDUsIDB4ODAwNWEsIDB4ODAwMWEsIDB4OTAwOTUsIDB4NzAxMTUsIDB4ODAwN2EsIDB4ODAwM2EsIDB4OTAwZDUsXG4gICAgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNSwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNSxcbiAgICAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNkLFxuICAgIDB4NzAxMGIsIDB4ODAwNjYsIDB4ODAwMjYsIDB4OTAwYWQsIDB4ODAwMDYsIDB4ODAwODYsIDB4ODAwNDYsIDB4OTAwZWQsXG4gICAgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5ZCwgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkZCxcbiAgICAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJkLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZkLFxuICAgIDB4NzAxMDAsIDB4ODAwNTEsIDB4ODAwMTEsIDB4ODAxMTksIDB4NzAxMTAsIDB4ODAwNzEsIDB4ODAwMzEsIDB4OTAwYzMsXG4gICAgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMywgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMyxcbiAgICAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkzLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQzLFxuICAgIDB4NzAxMGMsIDB4ODAwNjksIDB4ODAwMjksIDB4OTAwYjMsIDB4ODAwMDksIDB4ODAwODksIDB4ODAwNDksIDB4OTAwZjMsXG4gICAgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYixcbiAgICAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFiLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGViLFxuICAgIDB4NzAxMDYsIDB4ODAwNWQsIDB4ODAwMWQsIDB4OTAwOWIsIDB4NzAxMTYsIDB4ODAwN2QsIDB4ODAwM2QsIDB4OTAwZGIsXG4gICAgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYiwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYixcbiAgICAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM3LFxuICAgIDB4NzAxMDksIDB4ODAwNjMsIDB4ODAwMjMsIDB4OTAwYTcsIDB4ODAwMDMsIDB4ODAwODMsIDB4ODAwNDMsIDB4OTAwZTcsXG4gICAgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NywgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNyxcbiAgICAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI3LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY3LFxuICAgIDB4NzAxMDMsIDB4ODAwNTcsIDB4ODAwMTcsIDB4ODAxMWYsIDB4NzAxMTMsIDB4ODAwNzcsIDB4ODAwMzcsIDB4OTAwY2YsXG4gICAgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZiwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZixcbiAgICAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDlmLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRmLFxuICAgIDB4NzAxMGYsIDB4ODAwNmYsIDB4ODAwMmYsIDB4OTAwYmYsIDB4ODAwMGYsIDB4ODAwOGYsIDB4ODAwNGYsIDB4OTAwZmZcbiAgXSksIDldO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbXG4gICAgMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYyxcbiAgICAweDUwMDAyLCAweDUwMDEyLCAweDUwMDBhLCAweDUwMDFhLCAweDUwMDA2LCAweDUwMDE2LCAweDUwMDBlLCAweDAwMDAwLFxuICAgIDB4NTAwMDEsIDB4NTAwMTEsIDB4NTAwMDksIDB4NTAwMTksIDB4NTAwMDUsIDB4NTAwMTUsIDB4NTAwMGQsIDB4NTAwMWQsXG4gICAgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMFxuICBdKSwgNV07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBGbGF0ZVN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7XG5cbiAgICB2YXIgY21mID0gc3RyLmdldEJ5dGUoKTtcbiAgICB2YXIgZmxnID0gc3RyLmdldEJ5dGUoKTtcbiAgICBpZiAoY21mID09PSAtMSB8fCBmbGcgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTtcbiAgICB9XG4gICAgaWYgKChjbWYgJiAweDBmKSAhPT0gMHgwOCkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICBgVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICgoKGNtZiA8PCA4KSArIGZsZykgJSAzMSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBCYWQgRkNIRUNLIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTtcbiAgICB9XG4gICAgaWYgKGZsZyAmIDB4MjApIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlU2l6ZSA9IDA7XG4gICAgdGhpcy5jb2RlQnVmID0gMDtcblxuICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTtcbiAgfVxuXG4gIEZsYXRlU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7XG5cbiAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldEJpdHMgPSBmdW5jdGlvbiBGbGF0ZVN0cmVhbV9nZXRCaXRzKGJpdHMpIHtcbiAgICB2YXIgc3RyID0gdGhpcy5zdHI7XG4gICAgdmFyIGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTtcbiAgICB2YXIgY29kZUJ1ZiA9IHRoaXMuY29kZUJ1ZjtcblxuICAgIHZhciBiO1xuICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJpdHMpIHtcbiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtXCIpO1xuICAgICAgfVxuICAgICAgY29kZUJ1ZiB8PSBiIDw8IGNvZGVTaXplO1xuICAgICAgY29kZVNpemUgKz0gODtcbiAgICB9XG4gICAgYiA9IGNvZGVCdWYgJiAoKDEgPDwgYml0cykgLSAxKTtcbiAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGJpdHM7XG4gICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC09IGJpdHM7XG5cbiAgICByZXR1cm4gYjtcbiAgfTtcblxuICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29kZSA9IGZ1bmN0aW9uIEZsYXRlU3RyZWFtX2dldENvZGUodGFibGUpIHtcbiAgICB2YXIgc3RyID0gdGhpcy5zdHI7XG4gICAgdmFyIGNvZGVzID0gdGFibGVbMF07XG4gICAgdmFyIG1heExlbiA9IHRhYmxlWzFdO1xuICAgIHZhciBjb2RlU2l6ZSA9IHRoaXMuY29kZVNpemU7XG4gICAgdmFyIGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7XG5cbiAgICB2YXIgYjtcbiAgICB3aGlsZSAoY29kZVNpemUgPCBtYXhMZW4pIHtcbiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAvLyBwcmVtYXR1cmUgZW5kIG9mIHN0cmVhbS4gY29kZSBtaWdodCBob3dldmVyIHN0aWxsIGJlIHZhbGlkLlxuICAgICAgICAvLyBjb2RlU2l6ZSA8IGNvZGVMZW4gY2hlY2sgYmVsb3cgZ3VhcmRzIGFnYWluc3QgaW5jb21wbGV0ZSBjb2RlVmFsLlxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTtcbiAgICAgIGNvZGVTaXplICs9IDg7XG4gICAgfVxuICAgIHZhciBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgoMSA8PCBtYXhMZW4pIC0gMSldO1xuICAgIHZhciBjb2RlTGVuID0gY29kZSA+PiAxNjtcbiAgICB2YXIgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7XG4gICAgaWYgKGNvZGVMZW4gPCAxIHx8IGNvZGVTaXplIDwgY29kZUxlbikge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbVwiKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBjb2RlTGVuO1xuICAgIHRoaXMuY29kZVNpemUgPSBjb2RlU2l6ZSAtIGNvZGVMZW47XG4gICAgcmV0dXJuIGNvZGVWYWw7XG4gIH07XG5cbiAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdlbmVyYXRlSHVmZm1hblRhYmxlID0gZnVuY3Rpb24gZmxhdGVTdHJlYW1HZW5lcmF0ZUh1ZmZtYW5UYWJsZShcbiAgICBsZW5ndGhzXG4gICkge1xuICAgIHZhciBuID0gbGVuZ3Rocy5sZW5ndGg7XG5cbiAgICAvLyBmaW5kIG1heCBjb2RlIGxlbmd0aFxuICAgIHZhciBtYXhMZW4gPSAwO1xuICAgIHZhciBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChsZW5ndGhzW2ldID4gbWF4TGVuKSB7XG4gICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYnVpbGQgdGhlIHRhYmxlXG4gICAgdmFyIHNpemUgPSAxIDw8IG1heExlbjtcbiAgICB2YXIgY29kZXMgPSBuZXcgSW50MzJBcnJheShzaXplKTtcbiAgICBmb3IgKFxuICAgICAgdmFyIGxlbiA9IDEsIGNvZGUgPSAwLCBza2lwID0gMjtcbiAgICAgIGxlbiA8PSBtYXhMZW47XG4gICAgICArK2xlbiwgY29kZSA8PD0gMSwgc2tpcCA8PD0gMVxuICAgICkge1xuICAgICAgZm9yICh2YXIgdmFsID0gMDsgdmFsIDwgbjsgKyt2YWwpIHtcbiAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7XG4gICAgICAgICAgLy8gYml0LXJldmVyc2UgdGhlIGNvZGVcbiAgICAgICAgICB2YXIgY29kZTIgPSAwO1xuICAgICAgICAgIHZhciB0ID0gY29kZTtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUyID0gKGNvZGUyIDw8IDEpIHwgKHQgJiAxKTtcbiAgICAgICAgICAgIHQgPj49IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmlsbCB0aGUgdGFibGUgZW50cmllc1xuICAgICAgICAgIGZvciAoaSA9IGNvZGUyOyBpIDwgc2l6ZTsgaSArPSBza2lwKSB7XG4gICAgICAgICAgICBjb2Rlc1tpXSA9IChsZW4gPDwgMTYpIHwgdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICArK2NvZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dO1xuICB9O1xuXG4gIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBGbGF0ZVN0cmVhbV9yZWFkQmxvY2soKSB7XG4gICAgdmFyIGJ1ZmZlciwgbGVuO1xuICAgIHZhciBzdHIgPSB0aGlzLnN0cjtcbiAgICAvLyByZWFkIGJsb2NrIGhlYWRlclxuICAgIHZhciBoZHIgPSB0aGlzLmdldEJpdHMoMyk7XG4gICAgaWYgKGhkciAmIDEpIHtcbiAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICB9XG4gICAgaGRyID4+PSAxO1xuXG4gICAgaWYgKGhkciA9PT0gMCkge1xuICAgICAgLy8gdW5jb21wcmVzc2VkIGJsb2NrXG4gICAgICB2YXIgYjtcblxuICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtXCIpO1xuICAgICAgfVxuICAgICAgdmFyIGJsb2NrTGVuID0gYjtcbiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbVwiKTtcbiAgICAgIH1cbiAgICAgIGJsb2NrTGVuIHw9IGIgPDwgODtcbiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbVwiKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGVjayA9IGI7XG4gICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW1cIik7XG4gICAgICB9XG4gICAgICBjaGVjayB8PSBiIDw8IDg7XG4gICAgICBpZiAoY2hlY2sgIT09ICh+YmxvY2tMZW4gJiAweGZmZmYpICYmIChibG9ja0xlbiAhPT0gMCB8fCBjaGVjayAhPT0gMCkpIHtcbiAgICAgICAgLy8gSWdub3JpbmcgZXJyb3IgZm9yIGJhZCBcImVtcHR5XCIgYmxvY2sgKHNlZSBpc3N1ZSAxMjc3KVxuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYWQgdW5jb21wcmVzc2VkIGJsb2NrIGxlbmd0aCBpbiBmbGF0ZSBzdHJlYW1cIik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29kZUJ1ZiA9IDA7XG4gICAgICB0aGlzLmNvZGVTaXplID0gMDtcblxuICAgICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGgsXG4gICAgICAgIGVuZCA9IGJ1ZmZlckxlbmd0aCArIGJsb2NrTGVuO1xuICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoZW5kKTtcbiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gZW5kO1xuXG4gICAgICBpZiAoYmxvY2tMZW4gPT09IDApIHtcbiAgICAgICAgaWYgKHN0ci5wZWVrQnl0ZSgpID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSBzdHIuZ2V0Qnl0ZXMoYmxvY2tMZW4pO1xuICAgICAgICBidWZmZXIuc2V0KGJsb2NrLCBidWZmZXJMZW5ndGgpO1xuICAgICAgICBpZiAoYmxvY2subGVuZ3RoIDwgYmxvY2tMZW4pIHtcbiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbGl0Q29kZVRhYmxlO1xuICAgIHZhciBkaXN0Q29kZVRhYmxlO1xuICAgIGlmIChoZHIgPT09IDEpIHtcbiAgICAgIC8vIGNvbXByZXNzZWQgYmxvY2ssIGZpeGVkIGNvZGVzXG4gICAgICBsaXRDb2RlVGFibGUgPSBmaXhlZExpdENvZGVUYWI7XG4gICAgICBkaXN0Q29kZVRhYmxlID0gZml4ZWREaXN0Q29kZVRhYjtcbiAgICB9IGVsc2UgaWYgKGhkciA9PT0gMikge1xuICAgICAgLy8gY29tcHJlc3NlZCBibG9jaywgZHluYW1pYyBjb2Rlc1xuICAgICAgdmFyIG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3O1xuICAgICAgdmFyIG51bURpc3RDb2RlcyA9IHRoaXMuZ2V0Qml0cyg1KSArIDE7XG4gICAgICB2YXIgbnVtQ29kZUxlbkNvZGVzID0gdGhpcy5nZXRCaXRzKDQpICsgNDtcblxuICAgICAgLy8gYnVpbGQgdGhlIGNvZGUgbGVuZ3RocyBjb2RlIHRhYmxlXG4gICAgICB2YXIgY29kZUxlbkNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbkNvZGVNYXAubGVuZ3RoKTtcblxuICAgICAgdmFyIGk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29kZUxlbkNvZGVzOyArK2kpIHtcbiAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTtcbiAgICAgIH1cbiAgICAgIHZhciBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTtcblxuICAgICAgLy8gYnVpbGQgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGUgdGFibGVzXG4gICAgICBsZW4gPSAwO1xuICAgICAgaSA9IDA7XG4gICAgICB2YXIgY29kZXMgPSBudW1MaXRDb2RlcyArIG51bURpc3RDb2RlcztcbiAgICAgIHZhciBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGNvZGVzKTtcbiAgICAgIHZhciBiaXRzTGVuZ3RoLCBiaXRzT2Zmc2V0LCB3aGF0O1xuICAgICAgd2hpbGUgKGkgPCBjb2Rlcykge1xuICAgICAgICB2YXIgY29kZSA9IHRoaXMuZ2V0Q29kZShjb2RlTGVuQ29kZVRhYik7XG4gICAgICAgIGlmIChjb2RlID09PSAxNikge1xuICAgICAgICAgIGJpdHNMZW5ndGggPSAyO1xuICAgICAgICAgIGJpdHNPZmZzZXQgPSAzO1xuICAgICAgICAgIHdoYXQgPSBsZW47XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTcpIHtcbiAgICAgICAgICBiaXRzTGVuZ3RoID0gMztcbiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMztcbiAgICAgICAgICB3aGF0ID0gbGVuID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAxOCkge1xuICAgICAgICAgIGJpdHNMZW5ndGggPSA3O1xuICAgICAgICAgIGJpdHNPZmZzZXQgPSAxMTtcbiAgICAgICAgICB3aGF0ID0gbGVuID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gbGVuID0gY29kZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXBlYXRMZW5ndGggPSB0aGlzLmdldEJpdHMoYml0c0xlbmd0aCkgKyBiaXRzT2Zmc2V0O1xuICAgICAgICB3aGlsZSAocmVwZWF0TGVuZ3RoLS0gPiAwKSB7XG4gICAgICAgICAgY29kZUxlbmd0aHNbaSsrXSA9IHdoYXQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGl0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShcbiAgICAgICAgY29kZUxlbmd0aHMuc3ViYXJyYXkoMCwgbnVtTGl0Q29kZXMpXG4gICAgICApO1xuICAgICAgZGlzdENvZGVUYWJsZSA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoXG4gICAgICAgIGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gYmxvY2sgdHlwZSBpbiBmbGF0ZSBzdHJlYW1cIik7XG4gICAgfVxuXG4gICAgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgdmFyIGxpbWl0ID0gYnVmZmVyID8gYnVmZmVyLmxlbmd0aCA6IDA7XG4gICAgdmFyIHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgY29kZTEgPSB0aGlzLmdldENvZGUobGl0Q29kZVRhYmxlKTtcbiAgICAgIGlmIChjb2RlMSA8IDI1Nikge1xuICAgICAgICBpZiAocG9zICsgMSA+PSBsaW1pdCkge1xuICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIDEpO1xuICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJbcG9zKytdID0gY29kZTE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUxID09PSAyNTYpIHtcbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvZGUxIC09IDI1NztcbiAgICAgIGNvZGUxID0gbGVuZ3RoRGVjb2RlW2NvZGUxXTtcbiAgICAgIHZhciBjb2RlMiA9IGNvZGUxID4+IDE2O1xuICAgICAgaWYgKGNvZGUyID4gMCkge1xuICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7XG4gICAgICB9XG4gICAgICBsZW4gPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7XG4gICAgICBjb2RlMSA9IHRoaXMuZ2V0Q29kZShkaXN0Q29kZVRhYmxlKTtcbiAgICAgIGNvZGUxID0gZGlzdERlY29kZVtjb2RlMV07XG4gICAgICBjb2RlMiA9IGNvZGUxID4+IDE2O1xuICAgICAgaWYgKGNvZGUyID4gMCkge1xuICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7XG4gICAgICB9XG4gICAgICB2YXIgZGlzdCA9IChjb2RlMSAmIDB4ZmZmZikgKyBjb2RlMjtcbiAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHtcbiAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuKTtcbiAgICAgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBsZW47ICsraywgKytwb3MpIHtcbiAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gZGlzdF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGbGF0ZVN0cmVhbTtcbn0pKCk7XG5cbnZhciBQcmVkaWN0b3JTdHJlYW0gPSAoZnVuY3Rpb24gUHJlZGljdG9yU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBQcmVkaWN0b3JTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7XG4gICAgaWYgKCFpc0RpY3QocGFyYW1zKSkge1xuICAgICAgcmV0dXJuIHN0cjsgLy8gbm8gcHJlZGljdGlvblxuICAgIH1cbiAgICB2YXIgcHJlZGljdG9yID0gKHRoaXMucHJlZGljdG9yID0gcGFyYW1zLmdldChcIlByZWRpY3RvclwiKSB8fCAxKTtcblxuICAgIGlmIChwcmVkaWN0b3IgPD0gMSkge1xuICAgICAgcmV0dXJuIHN0cjsgLy8gbm8gcHJlZGljdGlvblxuICAgIH1cbiAgICBpZiAocHJlZGljdG9yICE9PSAyICYmIChwcmVkaWN0b3IgPCAxMCB8fCBwcmVkaWN0b3IgPiAxNSkpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAke3ByZWRpY3Rvcn1gKTtcbiAgICB9XG5cbiAgICBpZiAocHJlZGljdG9yID09PSAyKSB7XG4gICAgICB0aGlzLnJlYWRCbG9jayA9IHRoaXMucmVhZEJsb2NrVGlmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWFkQmxvY2sgPSB0aGlzLnJlYWRCbG9ja1BuZztcbiAgICB9XG5cbiAgICB0aGlzLnN0ciA9IHN0cjtcbiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDtcblxuICAgIHZhciBjb2xvcnMgPSAodGhpcy5jb2xvcnMgPSBwYXJhbXMuZ2V0KFwiQ29sb3JzXCIpIHx8IDEpO1xuICAgIHZhciBiaXRzID0gKHRoaXMuYml0cyA9IHBhcmFtcy5nZXQoXCJCaXRzUGVyQ29tcG9uZW50XCIpIHx8IDgpO1xuICAgIHZhciBjb2x1bW5zID0gKHRoaXMuY29sdW1ucyA9IHBhcmFtcy5nZXQoXCJDb2x1bW5zXCIpIHx8IDEpO1xuXG4gICAgdGhpcy5waXhCeXRlcyA9IChjb2xvcnMgKiBiaXRzICsgNykgPj4gMztcbiAgICB0aGlzLnJvd0J5dGVzID0gKGNvbHVtbnMgKiBjb2xvcnMgKiBiaXRzICsgNykgPj4gMztcblxuICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIFByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIFByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrVGlmZiA9IGZ1bmN0aW9uIHByZWRpY3RvclN0cmVhbVJlYWRCbG9ja1RpZmYoKSB7XG4gICAgdmFyIHJvd0J5dGVzID0gdGhpcy5yb3dCeXRlcztcblxuICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgcm93Qnl0ZXMpO1xuXG4gICAgdmFyIGJpdHMgPSB0aGlzLmJpdHM7XG4gICAgdmFyIGNvbG9ycyA9IHRoaXMuY29sb3JzO1xuXG4gICAgdmFyIHJhd0J5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMocm93Qnl0ZXMpO1xuICAgIHRoaXMuZW9mID0gIXJhd0J5dGVzLmxlbmd0aDtcbiAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5idWYgPSAwLFxuICAgICAgb3V0YnVmID0gMDtcbiAgICB2YXIgaW5iaXRzID0gMCxcbiAgICAgIG91dGJpdHMgPSAwO1xuICAgIHZhciBwb3MgPSBidWZmZXJMZW5ndGg7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoYml0cyA9PT0gMSAmJiBjb2xvcnMgPT09IDEpIHtcbiAgICAgIC8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBsb29wIGluIHRoZSBcImVsc2VcIi1icmFuY2hcbiAgICAgIC8vIGZvciAxIGJpdC1wZXItY29tcG9uZW50IGFuZCAxIGNvbG9yIFRJRkYgaW1hZ2VzLlxuICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSByYXdCeXRlc1tpXSBeIGluYnVmO1xuICAgICAgICBjIF49IGMgPj4gMTtcbiAgICAgICAgYyBePSBjID4+IDI7XG4gICAgICAgIGMgXj0gYyA+PiA0O1xuICAgICAgICBpbmJ1ZiA9IChjICYgMSkgPDwgNztcbiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChiaXRzID09PSA4KSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyArK2kpIHtcbiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHJhd0J5dGVzW2ldO1xuICAgICAgfVxuICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7XG4gICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGNvbG9yc10gKyByYXdCeXRlc1tpXTtcbiAgICAgICAgcG9zKys7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChiaXRzID09PSAxNikge1xuICAgICAgdmFyIGJ5dGVzUGVyUGl4ZWwgPSBjb2xvcnMgKiAyO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzUGVyUGl4ZWw7ICsraSkge1xuICAgICAgICBidWZmZXJbcG9zKytdID0gcmF3Qnl0ZXNbaV07XG4gICAgICB9XG4gICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyBpICs9IDIpIHtcbiAgICAgICAgdmFyIHN1bSA9XG4gICAgICAgICAgKChyYXdCeXRlc1tpXSAmIDB4ZmYpIDw8IDgpICtcbiAgICAgICAgICAocmF3Qnl0ZXNbaSArIDFdICYgMHhmZikgK1xuICAgICAgICAgICgoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWxdICYgMHhmZikgPDwgOCkgK1xuICAgICAgICAgIChidWZmZXJbcG9zIC0gYnl0ZXNQZXJQaXhlbCArIDFdICYgMHhmZik7XG4gICAgICAgIGJ1ZmZlcltwb3MrK10gPSAoc3VtID4+IDgpICYgMHhmZjtcbiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHN1bSAmIDB4ZmY7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjb21wQXJyYXkgPSBuZXcgVWludDhBcnJheShjb2xvcnMgKyAxKTtcbiAgICAgIHZhciBiaXRNYXNrID0gKDEgPDwgYml0cykgLSAxO1xuICAgICAgdmFyIGogPSAwLFxuICAgICAgICBrID0gYnVmZmVyTGVuZ3RoO1xuICAgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY29sdW1uczsgKytpKSB7XG4gICAgICAgIGZvciAodmFyIGtrID0gMDsga2sgPCBjb2xvcnM7ICsra2spIHtcbiAgICAgICAgICBpZiAoaW5iaXRzIDwgYml0cykge1xuICAgICAgICAgICAgaW5idWYgPSAoaW5idWYgPDwgOCkgfCAocmF3Qnl0ZXNbaisrXSAmIDB4ZmYpO1xuICAgICAgICAgICAgaW5iaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbXBBcnJheVtra10gPVxuICAgICAgICAgICAgKGNvbXBBcnJheVtra10gKyAoaW5idWYgPj4gKGluYml0cyAtIGJpdHMpKSkgJiBiaXRNYXNrO1xuICAgICAgICAgIGluYml0cyAtPSBiaXRzO1xuICAgICAgICAgIG91dGJ1ZiA9IChvdXRidWYgPDwgYml0cykgfCBjb21wQXJyYXlba2tdO1xuICAgICAgICAgIG91dGJpdHMgKz0gYml0cztcbiAgICAgICAgICBpZiAob3V0Yml0cyA+PSA4KSB7XG4gICAgICAgICAgICBidWZmZXJbaysrXSA9IChvdXRidWYgPj4gKG91dGJpdHMgLSA4KSkgJiAweGZmO1xuICAgICAgICAgICAgb3V0Yml0cyAtPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG91dGJpdHMgPiAwKSB7XG4gICAgICAgIGJ1ZmZlcltrKytdID1cbiAgICAgICAgICAob3V0YnVmIDw8ICg4IC0gb3V0Yml0cykpICsgKGluYnVmICYgKCgxIDw8ICg4IC0gb3V0Yml0cykpIC0gMSkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlcztcbiAgfTtcblxuICBQcmVkaWN0b3JTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9ja1BuZyA9IGZ1bmN0aW9uIHByZWRpY3RvclN0cmVhbVJlYWRCbG9ja1BuZygpIHtcbiAgICB2YXIgcm93Qnl0ZXMgPSB0aGlzLnJvd0J5dGVzO1xuICAgIHZhciBwaXhCeXRlcyA9IHRoaXMucGl4Qnl0ZXM7XG5cbiAgICB2YXIgcHJlZGljdG9yID0gdGhpcy5zdHIuZ2V0Qnl0ZSgpO1xuICAgIHZhciByYXdCeXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKHJvd0J5dGVzKTtcbiAgICB0aGlzLmVvZiA9ICFyYXdCeXRlcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyByb3dCeXRlcyk7XG5cbiAgICB2YXIgcHJldlJvdyA9IGJ1ZmZlci5zdWJhcnJheShidWZmZXJMZW5ndGggLSByb3dCeXRlcywgYnVmZmVyTGVuZ3RoKTtcbiAgICBpZiAocHJldlJvdy5sZW5ndGggPT09IDApIHtcbiAgICAgIHByZXZSb3cgPSBuZXcgVWludDhBcnJheShyb3dCeXRlcyk7XG4gICAgfVxuXG4gICAgdmFyIGksXG4gICAgICBqID0gYnVmZmVyTGVuZ3RoLFxuICAgICAgdXAsXG4gICAgICBjO1xuICAgIHN3aXRjaCAocHJlZGljdG9yKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7XG4gICAgICAgICAgYnVmZmVyW2orK10gPSByYXdCeXRlc1tpXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHtcbiAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkge1xuICAgICAgICAgIGJ1ZmZlcltqXSA9IChidWZmZXJbaiAtIHBpeEJ5dGVzXSArIHJhd0J5dGVzW2ldKSAmIDB4ZmY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Qnl0ZXM7ICsraSkge1xuICAgICAgICAgIGJ1ZmZlcltqKytdID0gKHByZXZSb3dbaV0gKyByYXdCeXRlc1tpXSkgJiAweGZmO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4Qnl0ZXM7ICsraSkge1xuICAgICAgICAgIGJ1ZmZlcltqKytdID0gKHByZXZSb3dbaV0gPj4gMSkgKyByYXdCeXRlc1tpXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHtcbiAgICAgICAgICBidWZmZXJbal0gPVxuICAgICAgICAgICAgKCgocHJldlJvd1tpXSArIGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdKSA+PiAxKSArIHJhd0J5dGVzW2ldKSAmIDB4ZmY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHNhdmUgdGhlIHVwIGxlZnQgcGl4ZWxzIHZhbHVlcy4gdGhlIHNpbXBsZXN0IHdheVxuICAgICAgICAvLyBpcyB0byBjcmVhdGUgYSBuZXcgYnVmZmVyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7XG4gICAgICAgICAgdXAgPSBwcmV2Um93W2ldO1xuICAgICAgICAgIGMgPSByYXdCeXRlc1tpXTtcbiAgICAgICAgICBidWZmZXJbaisrXSA9IHVwICsgYztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHtcbiAgICAgICAgICB1cCA9IHByZXZSb3dbaV07XG4gICAgICAgICAgdmFyIHVwTGVmdCA9IHByZXZSb3dbaSAtIHBpeEJ5dGVzXTtcbiAgICAgICAgICB2YXIgbGVmdCA9IGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdO1xuICAgICAgICAgIHZhciBwID0gbGVmdCArIHVwIC0gdXBMZWZ0O1xuXG4gICAgICAgICAgdmFyIHBhID0gcCAtIGxlZnQ7XG4gICAgICAgICAgaWYgKHBhIDwgMCkge1xuICAgICAgICAgICAgcGEgPSAtcGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwYiA9IHAgLSB1cDtcbiAgICAgICAgICBpZiAocGIgPCAwKSB7XG4gICAgICAgICAgICBwYiA9IC1wYjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHBjID0gcCAtIHVwTGVmdDtcbiAgICAgICAgICBpZiAocGMgPCAwKSB7XG4gICAgICAgICAgICBwYyA9IC1wYztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjID0gcmF3Qnl0ZXNbaV07XG4gICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKSB7XG4gICAgICAgICAgICBidWZmZXJbaisrXSA9IGxlZnQgKyBjO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGIgPD0gcGMpIHtcbiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXAgKyBjO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidWZmZXJbaisrXSA9IHVwTGVmdCArIGM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICR7cHJlZGljdG9yfWApO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlcztcbiAgfTtcblxuICByZXR1cm4gUHJlZGljdG9yU3RyZWFtO1xufSkoKTtcblxudmFyIERlY3J5cHRTdHJlYW0gPSAoZnVuY3Rpb24gRGVjcnlwdFN0cmVhbUNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gRGVjcnlwdFN0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBkZWNyeXB0KSB7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7XG4gICAgdGhpcy5kZWNyeXB0ID0gZGVjcnlwdDtcbiAgICB0aGlzLm5leHRDaHVuayA9IG51bGw7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpO1xuICB9XG5cbiAgdmFyIGNodW5rU2l6ZSA9IDUxMjtcblxuICBEZWNyeXB0U3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7XG5cbiAgRGVjcnlwdFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gRGVjcnlwdFN0cmVhbV9yZWFkQmxvY2soKSB7XG4gICAgdmFyIGNodW5rO1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICBjaHVuayA9IHRoaXMubmV4dENodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7XG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFjaHVuayB8fCBjaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uZXh0Q2h1bmsgPSB0aGlzLnN0ci5nZXRCeXRlcyhjaHVua1NpemUpO1xuICAgIHZhciBoYXNNb3JlRGF0YSA9IHRoaXMubmV4dENodW5rICYmIHRoaXMubmV4dENodW5rLmxlbmd0aCA+IDA7XG5cbiAgICB2YXIgZGVjcnlwdCA9IHRoaXMuZGVjcnlwdDtcbiAgICBjaHVuayA9IGRlY3J5cHQoY2h1bmssICFoYXNNb3JlRGF0YSk7XG5cbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgdmFyIGksXG4gICAgICBuID0gY2h1bmsubGVuZ3RoO1xuICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gY2h1bmtbaV07XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBEZWNyeXB0U3RyZWFtO1xufSkoKTtcblxudmFyIEFzY2lpODVTdHJlYW0gPSAoZnVuY3Rpb24gQXNjaWk4NVN0cmVhbUNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQXNjaWk4NVN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7XG4gICAgdGhpcy5pbnB1dCA9IG5ldyBVaW50OEFycmF5KDUpO1xuXG4gICAgLy8gTW9zdCBzdHJlYW1zIGluY3JlYXNlIGluIHNpemUgd2hlbiBkZWNvZGVkLCBidXQgQXNjaWk4NSBzdHJlYW1zXG4gICAgLy8gdHlwaWNhbGx5IHNocmluayBieSB+MjAlLlxuICAgIGlmIChtYXliZUxlbmd0aCkge1xuICAgICAgbWF5YmVMZW5ndGggPSAwLjggKiBtYXliZUxlbmd0aDtcbiAgICB9XG4gICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpO1xuICB9XG5cbiAgQXNjaWk4NVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIEFzY2lpODVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIEFzY2lpODVTdHJlYW1fcmVhZEJsb2NrKCkge1xuICAgIHZhciBUSUxEQV9DSEFSID0gMHg3ZTsgLy8gJ34nXG4gICAgdmFyIFpfTE9XRVJfQ0hBUiA9IDB4N2E7IC8vICd6J1xuICAgIHZhciBFT0YgPSAtMTtcblxuICAgIHZhciBzdHIgPSB0aGlzLnN0cjtcblxuICAgIHZhciBjID0gc3RyLmdldEJ5dGUoKTtcbiAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGMpKSB7XG4gICAgICBjID0gc3RyLmdldEJ5dGUoKTtcbiAgICB9XG5cbiAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHtcbiAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGgsXG4gICAgICBidWZmZXI7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBzcGVjaWFsIGNvZGUgZm9yIHpcbiAgICBpZiAoYyA9PT0gWl9MT1dFUl9DSEFSKSB7XG4gICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyA0KTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQ7XG4gICAgICBpbnB1dFswXSA9IGM7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSB7XG4gICAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpO1xuICAgICAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGMpKSB7XG4gICAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dFtpXSA9IGM7XG5cbiAgICAgICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIGkgLSAxKTtcbiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxO1xuXG4gICAgICAvLyBwYXJ0aWFsIGVuZGluZztcbiAgICAgIGlmIChpIDwgNSkge1xuICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgIGlucHV0W2ldID0gMHgyMSArIDg0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciB0ID0gMDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHtcbiAgICAgICAgdCA9IHQgKiA4NSArIChpbnB1dFtpXSAtIDB4MjEpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAzOyBpID49IDA7IC0taSkge1xuICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjtcbiAgICAgICAgdCA+Pj0gODtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEFzY2lpODVTdHJlYW07XG59KSgpO1xuXG52YXIgQXNjaWlIZXhTdHJlYW0gPSAoZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEFzY2lpSGV4U3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgpIHtcbiAgICB0aGlzLnN0ciA9IHN0cjtcbiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDtcblxuICAgIHRoaXMuZmlyc3REaWdpdCA9IC0xO1xuXG4gICAgLy8gTW9zdCBzdHJlYW1zIGluY3JlYXNlIGluIHNpemUgd2hlbiBkZWNvZGVkLCBidXQgQXNjaWlIZXggc3RyZWFtcyBzaHJpbmtcbiAgICAvLyBieSA1MCUuXG4gICAgaWYgKG1heWJlTGVuZ3RoKSB7XG4gICAgICBtYXliZUxlbmd0aCA9IDAuNSAqIG1heWJlTGVuZ3RoO1xuICAgIH1cbiAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7XG4gIH1cblxuICBBc2NpaUhleFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIEFzY2lpSGV4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBBc2NpaUhleFN0cmVhbV9yZWFkQmxvY2soKSB7XG4gICAgdmFyIFVQU1RSRUFNX0JMT0NLX1NJWkUgPSA4MDAwO1xuICAgIHZhciBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKFVQU1RSRUFNX0JMT0NLX1NJWkUpO1xuICAgIGlmICghYnl0ZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG1heERlY29kZUxlbmd0aCA9IChieXRlcy5sZW5ndGggKyAxKSA+PiAxO1xuICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIG1heERlY29kZUxlbmd0aCk7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuXG4gICAgdmFyIGZpcnN0RGlnaXQgPSB0aGlzLmZpcnN0RGlnaXQ7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIGNoID0gYnl0ZXNbaV0sXG4gICAgICAgIGRpZ2l0O1xuICAgICAgaWYgKGNoID49IC8qICcwJyA9ICovIDB4MzAgJiYgY2ggPD0gLyogJzknID0gKi8gMHgzOSkge1xuICAgICAgICBkaWdpdCA9IGNoICYgMHgwZjtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChjaCA+PSAvKiAnQScgPSAqLyAweDQxICYmIGNoIDw9IC8qICdaJyA9ICovIDB4NDYpIHx8XG4gICAgICAgIChjaCA+PSAvKiAnYScgPSAqLyAweDYxICYmIGNoIDw9IC8qICd6JyA9ICovIDB4NjYpXG4gICAgICApIHtcbiAgICAgICAgZGlnaXQgPSAoY2ggJiAweDBmKSArIDk7XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSAvKiAnPicgPSAqLyAweDNlKSB7XG4gICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcm9iYWJseSB3aGl0ZXNwYWNlLCBpZ25vcmluZy5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZmlyc3REaWdpdCA8IDApIHtcbiAgICAgICAgZmlyc3REaWdpdCA9IGRpZ2l0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IChmaXJzdERpZ2l0IDw8IDQpIHwgZGlnaXQ7XG4gICAgICAgIGZpcnN0RGlnaXQgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpcnN0RGlnaXQgPj0gMCAmJiB0aGlzLmVvZikge1xuICAgICAgLy8gaW5jb21wbGV0ZSBieXRlXG4gICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0O1xuICAgICAgZmlyc3REaWdpdCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLmZpcnN0RGlnaXQgPSBmaXJzdERpZ2l0O1xuICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBBc2NpaUhleFN0cmVhbTtcbn0pKCk7XG5cbnZhciBSdW5MZW5ndGhTdHJlYW0gPSAoZnVuY3Rpb24gUnVuTGVuZ3RoU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCkge1xuICAgIHRoaXMuc3RyID0gc3RyO1xuICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0O1xuXG4gICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpO1xuICB9XG5cbiAgUnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7XG5cbiAgUnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW1fcmVhZEJsb2NrKCkge1xuICAgIC8vIFRoZSByZXBlYXRIZWFkZXIgaGFzIGZvbGxvd2luZyBmb3JtYXQuIFRoZSBmaXJzdCBieXRlIGRlZmluZXMgdHlwZSBvZiBydW5cbiAgICAvLyBhbmQgYW1vdW50IG9mIGJ5dGVzIHRvIHJlcGVhdC9jb3B5OiBuID0gMCB0aHJvdWdoIDEyNyAtIGNvcHkgbmV4dCBuIGJ5dGVzXG4gICAgLy8gKGluIGFkZGl0aW9uIHRvIHRoZSBzZWNvbmQgYnl0ZSBmcm9tIHRoZSBoZWFkZXIpLCBuID0gMTI5IHRocm91Z2ggMjU1IC1cbiAgICAvLyBkdXBsaWNhdGUgdGhlIHNlY29uZCBieXRlIGZyb20gdGhlIGhlYWRlciAoMjU3IC0gbikgdGltZXMsIG4gPSAxMjggLSBlbmQuXG4gICAgdmFyIHJlcGVhdEhlYWRlciA9IHRoaXMuc3RyLmdldEJ5dGVzKDIpO1xuICAgIGlmICghcmVwZWF0SGVhZGVyIHx8IHJlcGVhdEhlYWRlci5sZW5ndGggPCAyIHx8IHJlcGVhdEhlYWRlclswXSA9PT0gMTI4KSB7XG4gICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlcjtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgdmFyIG4gPSByZXBlYXRIZWFkZXJbMF07XG4gICAgaWYgKG4gPCAxMjgpIHtcbiAgICAgIC8vIGNvcHkgbiBieXRlc1xuICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpO1xuICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IHJlcGVhdEhlYWRlclsxXTtcbiAgICAgIGlmIChuID4gMCkge1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zdHIuZ2V0Qnl0ZXMobik7XG4gICAgICAgIGJ1ZmZlci5zZXQoc291cmNlLCBidWZmZXJMZW5ndGgpO1xuICAgICAgICBidWZmZXJMZW5ndGggKz0gbjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbiA9IDI1NyAtIG47XG4gICAgICB2YXIgYiA9IHJlcGVhdEhlYWRlclsxXTtcbiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBiO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDtcbiAgfTtcblxuICByZXR1cm4gUnVuTGVuZ3RoU3RyZWFtO1xufSkoKTtcblxudmFyIExaV1N0cmVhbSA9IChmdW5jdGlvbiBMWldTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIExaV1N0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBlYXJseUNoYW5nZSkge1xuICAgIHRoaXMuc3RyID0gc3RyO1xuICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0O1xuICAgIHRoaXMuY2FjaGVkRGF0YSA9IDA7XG4gICAgdGhpcy5iaXRzQ2FjaGVkID0gMDtcblxuICAgIHZhciBtYXhMendEaWN0aW9uYXJ5U2l6ZSA9IDQwOTY7XG4gICAgdmFyIGx6d1N0YXRlID0ge1xuICAgICAgZWFybHlDaGFuZ2UsXG4gICAgICBjb2RlTGVuZ3RoOiA5LFxuICAgICAgbmV4dENvZGU6IDI1OCxcbiAgICAgIGRpY3Rpb25hcnlWYWx1ZXM6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgIGRpY3Rpb25hcnlMZW5ndGhzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgZGljdGlvbmFyeVByZXZDb2RlczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgIGN1cnJlbnRTZXF1ZW5jZTogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoOiAwLFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlc1tpXSA9IGk7XG4gICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3Roc1tpXSA9IDE7XG4gICAgfVxuICAgIHRoaXMubHp3U3RhdGUgPSBsendTdGF0ZTtcblxuICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTtcbiAgfVxuXG4gIExaV1N0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJpdHMgPSBmdW5jdGlvbiBMWldTdHJlYW1fcmVhZEJpdHMobikge1xuICAgIHZhciBiaXRzQ2FjaGVkID0gdGhpcy5iaXRzQ2FjaGVkO1xuICAgIHZhciBjYWNoZWREYXRhID0gdGhpcy5jYWNoZWREYXRhO1xuICAgIHdoaWxlIChiaXRzQ2FjaGVkIDwgbikge1xuICAgICAgdmFyIGMgPSB0aGlzLnN0ci5nZXRCeXRlKCk7XG4gICAgICBpZiAoYyA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhY2hlZERhdGEgPSAoY2FjaGVkRGF0YSA8PCA4KSB8IGM7XG4gICAgICBiaXRzQ2FjaGVkICs9IDg7XG4gICAgfVxuICAgIHRoaXMuYml0c0NhY2hlZCA9IGJpdHNDYWNoZWQgLT0gbjtcbiAgICB0aGlzLmNhY2hlZERhdGEgPSBjYWNoZWREYXRhO1xuICAgIHRoaXMubGFzdENvZGUgPSBudWxsO1xuICAgIHJldHVybiAoY2FjaGVkRGF0YSA+Pj4gYml0c0NhY2hlZCkgJiAoKDEgPDwgbikgLSAxKTtcbiAgfTtcblxuICBMWldTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIExaV1N0cmVhbV9yZWFkQmxvY2soKSB7XG4gICAgdmFyIGJsb2NrU2l6ZSA9IDUxMjtcbiAgICB2YXIgZXN0aW1hdGVkRGVjb2RlZFNpemUgPSBibG9ja1NpemUgKiAyLFxuICAgICAgZGVjb2RlZFNpemVEZWx0YSA9IGJsb2NrU2l6ZTtcbiAgICB2YXIgaSwgaiwgcTtcblxuICAgIHZhciBsendTdGF0ZSA9IHRoaXMubHp3U3RhdGU7XG4gICAgaWYgKCFsendTdGF0ZSkge1xuICAgICAgcmV0dXJuOyAvLyBlb2Ygd2FzIGZvdW5kXG4gICAgfVxuXG4gICAgdmFyIGVhcmx5Q2hhbmdlID0gbHp3U3RhdGUuZWFybHlDaGFuZ2U7XG4gICAgdmFyIG5leHRDb2RlID0gbHp3U3RhdGUubmV4dENvZGU7XG4gICAgdmFyIGRpY3Rpb25hcnlWYWx1ZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzO1xuICAgIHZhciBkaWN0aW9uYXJ5TGVuZ3RocyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzO1xuICAgIHZhciBkaWN0aW9uYXJ5UHJldkNvZGVzID0gbHp3U3RhdGUuZGljdGlvbmFyeVByZXZDb2RlcztcbiAgICB2YXIgY29kZUxlbmd0aCA9IGx6d1N0YXRlLmNvZGVMZW5ndGg7XG4gICAgdmFyIHByZXZDb2RlID0gbHp3U3RhdGUucHJldkNvZGU7XG4gICAgdmFyIGN1cnJlbnRTZXF1ZW5jZSA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZTtcbiAgICB2YXIgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuXG4gICAgdmFyIGRlY29kZWRMZW5ndGggPSAwO1xuICAgIHZhciBjdXJyZW50QnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7XG4gICAgICB2YXIgY29kZSA9IHRoaXMucmVhZEJpdHMoY29kZUxlbmd0aCk7XG4gICAgICB2YXIgaGFzUHJldiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA+IDA7XG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICBjdXJyZW50U2VxdWVuY2VbMF0gPSBjb2RlO1xuICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAxO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID49IDI1OCkge1xuICAgICAgICBpZiAoY29kZSA8IG5leHRDb2RlKSB7XG4gICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gZGljdGlvbmFyeUxlbmd0aHNbY29kZV07XG4gICAgICAgICAgZm9yIChqID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoIC0gMSwgcSA9IGNvZGU7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICBjdXJyZW50U2VxdWVuY2Vbal0gPSBkaWN0aW9uYXJ5VmFsdWVzW3FdO1xuICAgICAgICAgICAgcSA9IGRpY3Rpb25hcnlQcmV2Q29kZXNbcV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtjdXJyZW50U2VxdWVuY2VMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2VbMF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMjU2KSB7XG4gICAgICAgIGNvZGVMZW5ndGggPSA5O1xuICAgICAgICBuZXh0Q29kZSA9IDI1ODtcbiAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmx6d1N0YXRlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1ByZXYpIHtcbiAgICAgICAgZGljdGlvbmFyeVByZXZDb2Rlc1tuZXh0Q29kZV0gPSBwcmV2Q29kZTtcbiAgICAgICAgZGljdGlvbmFyeUxlbmd0aHNbbmV4dENvZGVdID0gZGljdGlvbmFyeUxlbmd0aHNbcHJldkNvZGVdICsgMTtcbiAgICAgICAgZGljdGlvbmFyeVZhbHVlc1tuZXh0Q29kZV0gPSBjdXJyZW50U2VxdWVuY2VbMF07XG4gICAgICAgIG5leHRDb2RlKys7XG4gICAgICAgIGNvZGVMZW5ndGggPVxuICAgICAgICAgIChuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAmIChuZXh0Q29kZSArIGVhcmx5Q2hhbmdlIC0gMSlcbiAgICAgICAgICAgID8gY29kZUxlbmd0aFxuICAgICAgICAgICAgOiBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBNYXRoLmxvZyhuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAvIDAuNjkzMTQ3MTgwNTU5OTQ1MyArIDEsXG4gICAgICAgICAgICAgICAgMTJcbiAgICAgICAgICAgICAgKSB8IDA7XG4gICAgICB9XG4gICAgICBwcmV2Q29kZSA9IGNvZGU7XG5cbiAgICAgIGRlY29kZWRMZW5ndGggKz0gY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuICAgICAgaWYgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgZXN0aW1hdGVkRGVjb2RlZFNpemUgKz0gZGVjb2RlZFNpemVEZWx0YTtcbiAgICAgICAgfSB3aGlsZSAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKTtcbiAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBlc3RpbWF0ZWREZWNvZGVkU2l6ZSk7XG4gICAgICB9XG4gICAgICBmb3IgKGogPSAwOyBqIDwgY3VycmVudFNlcXVlbmNlTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2Vbal07XG4gICAgICB9XG4gICAgfVxuICAgIGx6d1N0YXRlLm5leHRDb2RlID0gbmV4dENvZGU7XG4gICAgbHp3U3RhdGUuY29kZUxlbmd0aCA9IGNvZGVMZW5ndGg7XG4gICAgbHp3U3RhdGUucHJldkNvZGUgPSBwcmV2Q29kZTtcbiAgICBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGggPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7XG5cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGN1cnJlbnRCdWZmZXJMZW5ndGg7XG4gIH07XG5cbiAgcmV0dXJuIExaV1N0cmVhbTtcbn0pKCk7XG5cbnZhciBOdWxsU3RyZWFtID0gKGZ1bmN0aW9uIE51bGxTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE51bGxTdHJlYW0oKSB7XG4gICAgU3RyZWFtLmNhbGwodGhpcywgbmV3IFVpbnQ4QXJyYXkoMCkpO1xuICB9XG5cbiAgTnVsbFN0cmVhbS5wcm90b3R5cGUgPSBTdHJlYW0ucHJvdG90eXBlO1xuXG4gIHJldHVybiBOdWxsU3RyZWFtO1xufSkoKTtcblxuZXhwb3J0IHtcbiAgQXNjaWk4NVN0cmVhbSxcbiAgQXNjaWlIZXhTdHJlYW0sXG4gIERlY3J5cHRTdHJlYW0sXG4gIERlY29kZVN0cmVhbSxcbiAgRmxhdGVTdHJlYW0sXG4gIE51bGxTdHJlYW0sXG4gIFByZWRpY3RvclN0cmVhbSxcbiAgUnVuTGVuZ3RoU3RyZWFtLFxuICBTdHJlYW0sXG4gIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbSxcbiAgU3RyaW5nU3RyZWFtLFxuICBMWldTdHJlYW0sXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IERpY3QsIGlzRGljdCB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IENDSVRURmF4RGVjb2RlciB9IGZyb20gXCIuL2NjaXR0LmpzXCI7XG5pbXBvcnQgeyBEZWNvZGVTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcblxudmFyIENDSVRURmF4U3RyZWFtID0gKGZ1bmN0aW9uIENDSVRURmF4U3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBDQ0lUVEZheFN0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHtcbiAgICB0aGlzLnN0ciA9IHN0cjtcbiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDtcblxuICAgIGlmICghaXNEaWN0KHBhcmFtcykpIHtcbiAgICAgIHBhcmFtcyA9IERpY3QuZW1wdHk7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5nZXRCeXRlKCk7XG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5jY2l0dEZheERlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKHNvdXJjZSwge1xuICAgICAgSzogcGFyYW1zLmdldChcIktcIiksXG4gICAgICBFbmRPZkxpbmU6IHBhcmFtcy5nZXQoXCJFbmRPZkxpbmVcIiksXG4gICAgICBFbmNvZGVkQnl0ZUFsaWduOiBwYXJhbXMuZ2V0KFwiRW5jb2RlZEJ5dGVBbGlnblwiKSxcbiAgICAgIENvbHVtbnM6IHBhcmFtcy5nZXQoXCJDb2x1bW5zXCIpLFxuICAgICAgUm93czogcGFyYW1zLmdldChcIlJvd3NcIiksXG4gICAgICBFbmRPZkJsb2NrOiBwYXJhbXMuZ2V0KFwiRW5kT2ZCbG9ja1wiKSxcbiAgICAgIEJsYWNrSXMxOiBwYXJhbXMuZ2V0KFwiQmxhY2tJczFcIiksXG4gICAgfSk7XG5cbiAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7XG4gIH1cblxuICBDQ0lUVEZheFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIENDSVRURmF4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgd2hpbGUgKCF0aGlzLmVvZikge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY2NpdHRGYXhEZWNvZGVyLnJlYWROZXh0Q2hhcigpO1xuICAgICAgaWYgKGMgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyAxKTtcbiAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdID0gYztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENDSVRURmF4U3RyZWFtO1xufSkoKTtcblxuZXhwb3J0IHsgQ0NJVFRGYXhTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogQ29weXJpZ2h0IDE5OTYtMjAwMyBHbHlwaCAmIENvZywgTExDXG4gKlxuICogVGhlIENDSVRUIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgSmF2YVNjcmlwdCBwb3J0XG4gKiBvZiBYUERGJ3MgaW1wbGVtZW50YXRpb24sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlXG4gKiBsaWNlbnNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ0NJVFRGYXhEZWNvZGVyU291cmNlXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBuZXh0IC0gTWV0aG9kIHRoYXQgcmV0dXJuIG9uZSBieXRlIG9mIGRhdGEgZm9yIGRlY29kaW5nLFxuICogICBvciAtMSB3aGVuIEVPRiBpcyByZWFjaGVkLlxuICovXG5cbmltcG9ydCB7IGluZm8gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuY29uc3QgQ0NJVFRGYXhEZWNvZGVyID0gKGZ1bmN0aW9uIENDSVRURmF4RGVjb2RlcigpIHtcbiAgY29uc3QgY2NpdHRFT0wgPSAtMjtcbiAgY29uc3QgY2NpdHRFT0YgPSAtMTtcbiAgY29uc3QgdHdvRGltUGFzcyA9IDA7XG4gIGNvbnN0IHR3b0RpbUhvcml6ID0gMTtcbiAgY29uc3QgdHdvRGltVmVydDAgPSAyO1xuICBjb25zdCB0d29EaW1WZXJ0UjEgPSAzO1xuICBjb25zdCB0d29EaW1WZXJ0TDEgPSA0O1xuICBjb25zdCB0d29EaW1WZXJ0UjIgPSA1O1xuICBjb25zdCB0d29EaW1WZXJ0TDIgPSA2O1xuICBjb25zdCB0d29EaW1WZXJ0UjMgPSA3O1xuICBjb25zdCB0d29EaW1WZXJ0TDMgPSA4O1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCB0d29EaW1UYWJsZSA9IFtcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMHhcbiAgICBbNywgdHdvRGltVmVydEwzXSwgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTBcbiAgICBbNywgdHdvRGltVmVydFIzXSwgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTFcbiAgICBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRMMl0sIC8vIDAwMDAxMHhcbiAgICBbNiwgdHdvRGltVmVydFIyXSwgWzYsIHR3b0RpbVZlcnRSMl0sIC8vIDAwMDAxMXhcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgICAgIC8vIDAwMDF4eHhcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCAgIC8vIDAwMXh4eHhcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgLy8gMDEweHh4eFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIC8vIDAxMXh4eHhcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgICAvLyAxeHh4eHh4XG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXVxuICBdO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCB3aGl0ZVRhYmxlMSA9IFtcbiAgICBbLTEsIC0xXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDBcbiAgICBbMTIsIGNjaXR0RU9MXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDFcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMXhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDAxeHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDEweHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDExeHhcbiAgICBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCAgICAgICAgICAgICAgICAgLy8gMTAwMHhcbiAgICBbMTIsIDE5ODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAwMTBcbiAgICBbMTIsIDIwNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAwMTFcbiAgICBbMTIsIDIxMTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMDBcbiAgICBbMTIsIDIxNzZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMDFcbiAgICBbMTIsIDIyNDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMTBcbiAgICBbMTIsIDIzMDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMTFcbiAgICBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCAgICAgICAgICAgICAgICAgLy8gMTEwMHhcbiAgICBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCAgICAgICAgICAgICAgICAgLy8gMTEwMXhcbiAgICBbMTIsIDIzNjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMDBcbiAgICBbMTIsIDI0MzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMDFcbiAgICBbMTIsIDI0OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMTBcbiAgICBbMTIsIDI1NjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMTFcbiAgXTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3Qgd2hpdGVUYWJsZTIgPSBbXG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAvLyAwMDAwMDAweHhcbiAgICBbOCwgMjldLCBbOCwgMjldLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEweFxuICAgIFs4LCAzMF0sIFs4LCAzMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTF4XG4gICAgWzgsIDQ1XSwgWzgsIDQ1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMHhcbiAgICBbOCwgNDZdLCBbOCwgNDZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxeFxuICAgIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sICAgICAgICAgLy8gMDAwMDAxMXh4XG4gICAgWzcsIDIzXSwgWzcsIDIzXSwgWzcsIDIzXSwgWzcsIDIzXSwgICAgICAgICAvLyAwMDAwMTAweHhcbiAgICBbOCwgNDddLCBbOCwgNDddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMDEweFxuICAgIFs4LCA0OF0sIFs4LCA0OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDEwMTF4XG4gICAgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgICAgICAgICAvLyAwMDAwMTF4eHhcbiAgICBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLFxuICAgIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sICAgICAgICAgLy8gMDAwMTAwMHh4XG4gICAgWzgsIDMzXSwgWzgsIDMzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDAxMHhcbiAgICBbOCwgMzRdLCBbOCwgMzRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMDExeFxuICAgIFs4LCAzNV0sIFs4LCAzNV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAxMDB4XG4gICAgWzgsIDM2XSwgWzgsIDM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDEwMXhcbiAgICBbOCwgMzddLCBbOCwgMzddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMTEweFxuICAgIFs4LCAzOF0sIFs4LCAzOF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAxMTF4XG4gICAgWzcsIDE5XSwgWzcsIDE5XSwgWzcsIDE5XSwgWzcsIDE5XSwgICAgICAgICAvLyAwMDAxMTAweHhcbiAgICBbOCwgMzFdLCBbOCwgMzFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDExMDEweFxuICAgIFs4LCAzMl0sIFs4LCAzMl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTEwMTF4XG4gICAgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCAgICAgICAgICAgICAvLyAwMDAxMTF4eHhcbiAgICBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sXG4gICAgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgICAgICAgICAvLyAwMDEwMDB4eHhcbiAgICBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLFxuICAgIFs4LCA1M10sIFs4LCA1M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDAxMDB4XG4gICAgWzgsIDU0XSwgWzgsIDU0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMDEwMXhcbiAgICBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCAgICAgICAgIC8vIDAwMTAwMTF4eFxuICAgIFs4LCAzOV0sIFs4LCAzOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDEwMDB4XG4gICAgWzgsIDQwXSwgWzgsIDQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMTAwMXhcbiAgICBbOCwgNDFdLCBbOCwgNDFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAxMDEweFxuICAgIFs4LCA0Ml0sIFs4LCA0Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDEwMTF4XG4gICAgWzgsIDQzXSwgWzgsIDQzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMTEwMHhcbiAgICBbOCwgNDRdLCBbOCwgNDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAxMTAxeFxuICAgIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyMV0sICAgICAgICAgLy8gMDAxMDExMXh4XG4gICAgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgICAgICAgICAvLyAwMDExMDAweHhcbiAgICBbOCwgNjFdLCBbOCwgNjFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTEwMDEweFxuICAgIFs4LCA2Ml0sIFs4LCA2Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMTAwMTF4XG4gICAgWzgsIDYzXSwgWzgsIDYzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDExMDEwMHhcbiAgICBbOCwgMF0sIFs4LCAwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTEwMTAxeFxuICAgIFs4LCAzMjBdLCBbOCwgMzIwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMTAxMTB4XG4gICAgWzgsIDM4NF0sIFs4LCAzODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDExMDExMXhcbiAgICBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCAgICAgICAgIC8vIDAwMTExeHh4eFxuICAgIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sXG4gICAgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSxcbiAgICBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLFxuICAgIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sICAgICAgICAgLy8gMDEwMDB4eHh4XG4gICAgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSxcbiAgICBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLFxuICAgIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sXG4gICAgWzcsIDI3XSwgWzcsIDI3XSwgWzcsIDI3XSwgWzcsIDI3XSwgICAgICAgICAvLyAwMTAwMTAweHhcbiAgICBbOCwgNTldLCBbOCwgNTldLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDAxMDEweFxuICAgIFs4LCA2MF0sIFs4LCA2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMDEwMTF4XG4gICAgWzksIDE0NzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAwMTEwMDBcbiAgICBbOSwgMTUzNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDAxMTAwMVxuICAgIFs5LCAxNjAwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMDExMDEwXG4gICAgWzksIDE3MjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAwMTEwMTFcbiAgICBbNywgMThdLCBbNywgMThdLCBbNywgMThdLCBbNywgMThdLCAgICAgICAgIC8vIDAxMDAxMTF4eFxuICAgIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sICAgICAgICAgLy8gMDEwMTAwMHh4XG4gICAgWzgsIDQ5XSwgWzgsIDQ5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMDAxMHhcbiAgICBbOCwgNTBdLCBbOCwgNTBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDEwMDExeFxuICAgIFs4LCA1MV0sIFs4LCA1MV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTAxMDB4XG4gICAgWzgsIDUyXSwgWzgsIDUyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMDEwMXhcbiAgICBbNywgMjVdLCBbNywgMjVdLCBbNywgMjVdLCBbNywgMjVdLCAgICAgICAgIC8vIDAxMDEwMTF4eFxuICAgIFs4LCA1NV0sIFs4LCA1NV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTEwMDB4XG4gICAgWzgsIDU2XSwgWzgsIDU2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMTAwMXhcbiAgICBbOCwgNTddLCBbOCwgNTddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDExMDEweFxuICAgIFs4LCA1OF0sIFs4LCA1OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTEwMTF4XG4gICAgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sICAgICAvLyAwMTAxMTF4eHhcbiAgICBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSxcbiAgICBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIC8vIDAxMTAwMHh4eFxuICAgIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSxcbiAgICBbOCwgNDQ4XSwgWzgsIDQ0OF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAwMTAweFxuICAgIFs4LCA1MTJdLCBbOCwgNTEyXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDAxMDF4XG4gICAgWzksIDcwNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMDExMDBcbiAgICBbOSwgNzY4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAwMTEwMVxuICAgIFs4LCA2NDBdLCBbOCwgNjQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDAxMTF4XG4gICAgWzgsIDU3Nl0sIFs4LCA1NzZdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAwMHhcbiAgICBbOSwgODMyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMDAxMFxuICAgIFs5LCA4OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMDExXG4gICAgWzksIDk2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAxMDBcbiAgICBbOSwgMTAyNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMDEwMVxuICAgIFs5LCAxMDg4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMTEwXG4gICAgWzksIDExNTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAxMTFcbiAgICBbOSwgMTIxNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMTAwMFxuICAgIFs5LCAxMjgwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDExMDAxXG4gICAgWzksIDEzNDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTEwMTBcbiAgICBbOSwgMTQwOF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMTAxMVxuICAgIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCAgICAgLy8gMDExMDExMXh4XG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCAgICAgICAgICAgICAvLyAwMTExeHh4eHhcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSxcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSxcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCAgICAgICAgICAgICAvLyAxMDAweHh4eHhcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSxcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSxcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sICAgICAvLyAxMDAxMHh4eHhcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sICAgICAgICAgICAgIC8vIDEwMDExeHh4eFxuICAgIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSxcbiAgICBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sXG4gICAgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLFxuICAgIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgICAgICAgICAgICAgLy8gMTAxMDB4eHh4XG4gICAgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLFxuICAgIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSxcbiAgICBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sXG4gICAgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgICAgICAgICAvLyAxMDEwMTB4eHhcbiAgICBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLFxuICAgIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sICAgICAgICAgLy8gMTAxMDExeHh4XG4gICAgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sICAgICAgICAgICAgIC8vIDEwMTF4eHh4eFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sICAgICAgICAgICAgIC8vIDExMDB4eHh4eFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCAgICAgICAgIC8vIDExMDEwMHh4eFxuICAgIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sXG4gICAgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgICAgICAgICAvLyAxMTAxMDF4eHhcbiAgICBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLFxuICAgIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sICAgICAgICAgLy8gMTEwMTF4eHh4XG4gICAgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSxcbiAgICBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLFxuICAgIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCAgICAgICAgICAgICAvLyAxMTEweHh4eHhcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSxcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSxcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCAgICAgICAgICAgICAvLyAxMTExeHh4eHhcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSxcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSxcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN11cbiAgXTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3QgYmxhY2tUYWJsZTEgPSBbXG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDAwMDAweFxuICAgIFsxMiwgY2NpdHRFT0xdLCBbMTIsIGNjaXR0RU9MXSwgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAwMDAwMXhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDAwMXh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAwMTB4eFxuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgIC8vIDAwMDAwMDAwMDExeHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDEwMHh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAxMDF4eFxuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgIC8vIDAwMDAwMDAwMTEweHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDExMXh4XG4gICAgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgLy8gMDAwMDAwMDEwMDB4eFxuICAgIFsxMiwgMTk4NF0sIFsxMiwgMTk4NF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMDAxMHhcbiAgICBbMTIsIDIwNDhdLCBbMTIsIDIwNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTAwMTF4XG4gICAgWzEyLCAyMTEyXSwgWzEyLCAyMTEyXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDEwMTAweFxuICAgIFsxMiwgMjE3Nl0sIFsxMiwgMjE3Nl0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMDEwMXhcbiAgICBbMTIsIDIyNDBdLCBbMTIsIDIyNDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTAxMTB4XG4gICAgWzEyLCAyMzA0XSwgWzEyLCAyMzA0XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDEwMTExeFxuICAgIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIC8vIDAwMDAwMDAxMTAweHhcbiAgICBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCAvLyAwMDAwMDAwMTEwMXh4XG4gICAgWzEyLCAyMzY4XSwgWzEyLCAyMzY4XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDExMTAweFxuICAgIFsxMiwgMjQzMl0sIFsxMiwgMjQzMl0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMTEwMXhcbiAgICBbMTIsIDI0OTZdLCBbMTIsIDI0OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTExMTB4XG4gICAgWzEyLCAyNTYwXSwgWzEyLCAyNTYwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDExMTExeFxuICAgIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCAgICAgICAgIC8vIDAwMDAwMDEwMDB4eHhcbiAgICBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSxcbiAgICBbMTIsIDUyXSwgWzEyLCA1Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDAxMDB4XG4gICAgWzEzLCA2NDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAwMTAxMFxuICAgIFsxMywgNzA0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMDEwMTFcbiAgICBbMTMsIDc2OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDAxMTAwXG4gICAgWzEzLCA4MzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAwMTEwMVxuICAgIFsxMiwgNTVdLCBbMTIsIDU1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMDExMXhcbiAgICBbMTIsIDU2XSwgWzEyLCA1Nl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDEwMDB4XG4gICAgWzEzLCAxMjgwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMDAxMFxuICAgIFsxMywgMTM0NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTAwMTFcbiAgICBbMTMsIDE0MDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDEwMTAwXG4gICAgWzEzLCAxNDcyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMDEwMVxuICAgIFsxMiwgNTldLCBbMTIsIDU5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTAxMXhcbiAgICBbMTIsIDYwXSwgWzEyLCA2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDExMDB4XG4gICAgWzEzLCAxNTM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMTAxMFxuICAgIFsxMywgMTYwMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTEwMTFcbiAgICBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgICAgICAgICAvLyAwMDAwMDAxMDExMXh4XG4gICAgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sICAgICAgICAgLy8gMDAwMDAwMTEwMDB4eFxuICAgIFsxMywgMTY2NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDAxMDBcbiAgICBbMTMsIDE3MjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAwMTAxXG4gICAgWzEyLCAzMjBdLCBbMTIsIDMyMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMDExeFxuICAgIFsxMiwgMzg0XSwgWzEyLCAzODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDEwMHhcbiAgICBbMTIsIDQ0OF0sIFsxMiwgNDQ4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAxMDF4XG4gICAgWzEzLCA1MTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMTEwMFxuICAgIFsxMywgNTc2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDExMDFcbiAgICBbMTIsIDUzXSwgWzEyLCA1M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAxMTF4XG4gICAgWzEyLCA1NF0sIFsxMiwgNTRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDAweFxuICAgIFsxMywgODk2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAwMTBcbiAgICBbMTMsIDk2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTEwMDExXG4gICAgWzEzLCAxMDI0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDEwMFxuICAgIFsxMywgMTA4OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAxMDFcbiAgICBbMTMsIDExNTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTEwMTEwXG4gICAgWzEzLCAxMjE2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDExMVxuICAgIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCAgICAgICAgIC8vIDAwMDAwMDExMTF4eHhcbiAgICBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XVxuICBdO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBibGFja1RhYmxlMiA9IFtcbiAgICBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCAgICAgLy8gMDAwMDAxMDB4eHh4XG4gICAgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSxcbiAgICBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLFxuICAgIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sXG4gICAgWzExLCAyM10sIFsxMSwgMjNdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDAweFxuICAgIFsxMiwgNTBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAwMTBcbiAgICBbMTIsIDUxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDEwMDExXG4gICAgWzEyLCA0NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDEwMFxuICAgIFsxMiwgNDVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAxMDFcbiAgICBbMTIsIDQ2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDEwMTEwXG4gICAgWzEyLCA0N10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDExMVxuICAgIFsxMiwgNTddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTEwMDBcbiAgICBbMTIsIDU4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDExMDAxXG4gICAgWzEyLCA2MV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMTAxMFxuICAgIFsxMiwgMjU2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTEwMTFcbiAgICBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgLy8gMDAwMDAxMDExMXh4XG4gICAgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIC8vIDAwMDAwMTEwMDB4eFxuICAgIFsxMiwgNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDAxMDBcbiAgICBbMTIsIDQ5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAwMTAxXG4gICAgWzEyLCA2Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMDExMFxuICAgIFsxMiwgNjNdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDAxMTFcbiAgICBbMTIsIDMwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMDAwXG4gICAgWzEyLCAzMV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTAwMVxuICAgIFsxMiwgMzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDEwMTBcbiAgICBbMTIsIDMzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMDExXG4gICAgWzEyLCA0MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTEwMFxuICAgIFsxMiwgNDFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDExMDFcbiAgICBbMTEsIDIyXSwgWzExLCAyMl0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMTF4XG4gICAgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgICAgIC8vIDAwMDAwMTExeHh4eFxuICAgIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sXG4gICAgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSxcbiAgICBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sICAgICAvLyAwMDAwMTAweHh4eHhcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sXG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sXG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sICAgICAvLyAwMDAwMTAxeHh4eHhcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sXG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sXG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sICAgICAvLyAwMDAwMTEwMDB4eHhcbiAgICBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLFxuICAgIFsxMiwgMTI4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDEwMDBcbiAgICBbMTIsIDE5Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMDAxXG4gICAgWzEyLCAyNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAwMTAxMFxuICAgIFsxMiwgMjddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDEwMTFcbiAgICBbMTIsIDI4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMTAwXG4gICAgWzEyLCAyOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAwMTEwMVxuICAgIFsxMSwgMTldLCBbMTEsIDE5XSwgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDExMXhcbiAgICBbMTEsIDIwXSwgWzExLCAyMF0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMDB4XG4gICAgWzEyLCAzNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDAxMFxuICAgIFsxMiwgMzVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTAwMTFcbiAgICBbMTIsIDM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMTAwXG4gICAgWzEyLCAzN10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDEwMVxuICAgIFsxMiwgMzhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTAxMTBcbiAgICBbMTIsIDM5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMTExXG4gICAgWzExLCAyMV0sIFsxMSwgMjFdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMTAweFxuICAgIFsxMiwgNDJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTEwMTBcbiAgICBbMTIsIDQzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDExMDExXG4gICAgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgICAgIC8vIDAwMDAxMTAxMTF4eFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sICAgICAvLyAwMDAwMTExeHh4eHhcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sXG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSxcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sXG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSxcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXG4gIF07XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IGJsYWNrVGFibGUzID0gW1xuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAvLyAwMDAweHhcbiAgICBbNiwgOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAwXG4gICAgWzYsIDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMVxuICAgIFs1LCA3XSwgWzUsIDddLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMXhcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sICAgICAgICAgLy8gMDAxMHh4XG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCAgICAgICAgIC8vIDAwMTF4eFxuICAgIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgICAgICAgICAvLyAwMTB4eHhcbiAgICBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sXG4gICAgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCAgICAgICAgIC8vIDAxMXh4eFxuICAgIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSxcbiAgICBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sICAgICAgICAgLy8gMTB4eHh4XG4gICAgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLFxuICAgIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSxcbiAgICBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sXG4gICAgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCAgICAgICAgIC8vIDExeHh4eFxuICAgIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSxcbiAgICBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sXG4gICAgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdXG4gIF07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Q0NJVFRGYXhEZWNvZGVyU291cmNlfSBzb3VyY2UgLSBUaGUgZGF0YSB3aGljaCBzaG91bGQgYmUgZGVjb2RlZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIERlY29kaW5nIG9wdGlvbnMuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIENDSVRURmF4RGVjb2Rlcihzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UubmV4dCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgXCJzb3VyY2VcIiBwYXJhbWV0ZXIuJyk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMuZW9mID0gZmFsc2U7XG5cbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5LIHx8IDA7XG4gICAgdGhpcy5lb2xpbmUgPSBvcHRpb25zLkVuZE9mTGluZSB8fCBmYWxzZTtcbiAgICB0aGlzLmJ5dGVBbGlnbiA9IG9wdGlvbnMuRW5jb2RlZEJ5dGVBbGlnbiB8fCBmYWxzZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBvcHRpb25zLkNvbHVtbnMgfHwgMTcyODtcbiAgICB0aGlzLnJvd3MgPSBvcHRpb25zLlJvd3MgfHwgMDtcbiAgICBsZXQgZW9ibG9jayA9IG9wdGlvbnMuRW5kT2ZCbG9jaztcbiAgICBpZiAoZW9ibG9jayA9PT0gbnVsbCB8fCBlb2Jsb2NrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVvYmxvY2sgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmVvYmxvY2sgPSBlb2Jsb2NrO1xuICAgIHRoaXMuYmxhY2sgPSBvcHRpb25zLkJsYWNrSXMxIHx8IGZhbHNlO1xuXG4gICAgdGhpcy5jb2RpbmdMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDEpO1xuICAgIHRoaXMucmVmTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAyKTtcblxuICAgIHRoaXMuY29kaW5nTGluZVswXSA9IHRoaXMuY29sdW1ucztcbiAgICB0aGlzLmNvZGluZ1BvcyA9IDA7XG5cbiAgICB0aGlzLnJvdyA9IDA7XG4gICAgdGhpcy5uZXh0TGluZTJEID0gdGhpcy5lbmNvZGluZyA8IDA7XG4gICAgdGhpcy5pbnB1dEJpdHMgPSAwO1xuICAgIHRoaXMuaW5wdXRCdWYgPSAwO1xuICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7XG4gICAgdGhpcy5yb3dzRG9uZSA9IGZhbHNlO1xuXG4gICAgbGV0IGNvZGUxO1xuICAgIHdoaWxlICgoY29kZTEgPSB0aGlzLl9sb29rQml0cygxMikpID09PSAwKSB7XG4gICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgIH1cbiAgICBpZiAoY29kZTEgPT09IDEpIHtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHtcbiAgICAgIHRoaXMubmV4dExpbmUyRCA9ICF0aGlzLl9sb29rQml0cygxKTtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgfVxuICB9XG5cbiAgQ0NJVFRGYXhEZWNvZGVyLnByb3RvdHlwZSA9IHtcbiAgICByZWFkTmV4dENoYXIoKSB7XG4gICAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVmTGluZSA9IHRoaXMucmVmTGluZTtcbiAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuXG4gICAgICBsZXQgcmVmUG9zLCBibGFja1BpeGVscywgYml0cywgaTtcblxuICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA9PT0gMCkge1xuICAgICAgICBpZiAodGhpcy5yb3dzRG9uZSkge1xuICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcnIgPSBmYWxzZTtcblxuICAgICAgICBsZXQgY29kZTEsIGNvZGUyLCBjb2RlMztcbiAgICAgICAgaWYgKHRoaXMubmV4dExpbmUyRCkge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGNvZGluZ0xpbmVbaV0gPCBjb2x1bW5zOyArK2kpIHtcbiAgICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2RpbmdMaW5lW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWZMaW5lW2krK10gPSBjb2x1bW5zO1xuICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2x1bW5zO1xuICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwO1xuICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDtcbiAgICAgICAgICByZWZQb3MgPSAwO1xuICAgICAgICAgIGJsYWNrUGl4ZWxzID0gMDtcblxuICAgICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fZ2V0VHdvRGltQ29kZSgpO1xuICAgICAgICAgICAgc3dpdGNoIChjb2RlMSkge1xuICAgICAgICAgICAgICBjYXNlIHR3b0RpbVBhc3M6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zICsgMV0sIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmTGluZVtyZWZQb3MgKyAxXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1Ib3JpejpcbiAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUyID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLFxuICAgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhcbiAgICAgICAgICAgICAgICAgICAgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMixcbiAgICAgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXiAxXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjM6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDMsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjI6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDIsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjE6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDEsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0MDpcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwzOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAzLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAtLXJlZlBvcztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDI6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDIsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC0tcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgKytyZWZQb3M7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJlxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMTpcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMSwgYmxhY2tQaXhlbHMpO1xuICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgY2NpdHRFT0Y6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvbHVtbnMsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpbmZvKFwiYmFkIDJkIGNvZGVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvbHVtbnMsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29kaW5nTGluZVswXSA9IDA7XG4gICAgICAgICAgdGhpcy5jb2RpbmdQb3MgPSAwO1xuICAgICAgICAgIGJsYWNrUGl4ZWxzID0gMDtcbiAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICBjb2RlMSA9IDA7XG4gICAgICAgICAgICBpZiAoYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpO1xuICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMSwgYmxhY2tQaXhlbHMpO1xuICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZ290RU9MID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZUFsaWduKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dEJpdHMgJj0gfjc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZW9ibG9jayAmJiB0aGlzLnJvdyA9PT0gdGhpcy5yb3dzIC0gMSkge1xuICAgICAgICAgIHRoaXMucm93c0RvbmUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgIGlmICh0aGlzLmVvbGluZSkge1xuICAgICAgICAgICAgd2hpbGUgKGNvZGUxICE9PSBjY2l0dEVPRiAmJiBjb2RlMSAhPT0gMSkge1xuICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGNvZGUxID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29kZTEgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgICAgZ290RU9MID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUxID09PSBjY2l0dEVPRikge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5lb2YgJiYgdGhpcy5lbmNvZGluZyA+IDAgJiYgIXRoaXMucm93c0RvbmUpIHtcbiAgICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7XG4gICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVvYmxvY2sgJiYgZ290RU9MICYmIHRoaXMuYnl0ZUFsaWduKSB7XG4gICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7XG4gICAgICAgICAgaWYgKGNvZGUxID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTtcbiAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID49IDApIHtcbiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlMSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgaW5mbyhcImJhZCBydGMgY29kZTogXCIgKyBjb2RlMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVyciAmJiB0aGlzLmVvbGluZSkge1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEzKTtcbiAgICAgICAgICAgIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHtcbiAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZTEgPj4gMSA9PT0gMSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgICAgIHRoaXMubmV4dExpbmUyRCA9ICEoY29kZTEgJiAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kaW5nTGluZVswXSA+IDApIHtcbiAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWyh0aGlzLmNvZGluZ1BvcyA9IDApXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWyh0aGlzLmNvZGluZ1BvcyA9IDEpXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvdysrO1xuICAgICAgfVxuXG4gICAgICBsZXQgYztcbiAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPj0gOCkge1xuICAgICAgICBjID0gdGhpcy5jb2RpbmdQb3MgJiAxID8gMCA6IDB4ZmY7XG4gICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSA4O1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID09PSAwICYmIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7XG4gICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID1cbiAgICAgICAgICAgIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaXRzID0gODtcbiAgICAgICAgYyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykge1xuICAgICAgICAgICAgYyA8PD0gYml0cztcbiAgICAgICAgICAgIGlmICghKHRoaXMuY29kaW5nUG9zICYgMSkpIHtcbiAgICAgICAgICAgICAgYyB8PSAweGZmID4+ICg4IC0gYml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgLT0gYml0cztcbiAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjIDw8PSB0aGlzLm91dHB1dEJpdHM7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmNvZGluZ1BvcyAmIDEpKSB7XG4gICAgICAgICAgICAgIGMgfD0gMHhmZiA+PiAoOCAtIHRoaXMub3V0cHV0Qml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRzIC09IHRoaXMub3V0cHV0Qml0cztcbiAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7XG4gICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7XG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9XG4gICAgICAgICAgICAgICAgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gLSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zIC0gMV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJpdHMgPiAwKSB7XG4gICAgICAgICAgICAgIGMgPDw9IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYml0cyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ibGFjaykge1xuICAgICAgICBjIF49IDB4ZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYWRkUGl4ZWxzKGExLCBibGFja1BpeGVscykge1xuICAgICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTtcbiAgICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvcztcblxuICAgICAgaWYgKGExID4gY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7XG4gICAgICAgIGlmIChhMSA+IHRoaXMuY29sdW1ucykge1xuICAgICAgICAgIGluZm8oXCJyb3cgaXMgd3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTtcbiAgICAgICAgICBhMSA9IHRoaXMuY29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNvZGluZ1BvcyAmIDEpIF4gYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICArK2NvZGluZ1BvcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHtcbiAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7XG4gICAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7XG5cbiAgICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkge1xuICAgICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICBpbmZvKFwicm93IGlzIHdyb25nIGxlbmd0aFwiKTtcbiAgICAgICAgICB0aGlzLmVyciA9IHRydWU7XG4gICAgICAgICAgYTEgPSB0aGlzLmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjb2RpbmdQb3MgJiAxKSBeIGJsYWNrUGl4ZWxzKSB7XG4gICAgICAgICAgKytjb2RpbmdQb3M7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTtcbiAgICAgIH0gZWxzZSBpZiAoYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHtcbiAgICAgICAgaWYgKGExIDwgMCkge1xuICAgICAgICAgIGluZm8oXCJpbnZhbGlkIGNvZGVcIik7XG4gICAgICAgICAgdGhpcy5lcnIgPSB0cnVlO1xuICAgICAgICAgIGExID0gMDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY29kaW5nUG9zID4gMCAmJiBhMSA8IGNvZGluZ0xpbmVbY29kaW5nUG9zIC0gMV0pIHtcbiAgICAgICAgICAtLWNvZGluZ1BvcztcbiAgICAgICAgfVxuICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29kZSBmb3VuZCBmcm9tIHRoZSB0YWJsZS5cbiAgICAgKiBUaGUgc3RhcnQgYW5kIGVuZCBwYXJhbWV0ZXJzIHNldCB0aGUgYm91bmRhcmllcyBmb3Igc2VhcmNoaW5nIHRoZSB0YWJsZS5cbiAgICAgKiBUaGUgbGltaXQgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBGdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IHdpdGggdGhyZWVcbiAgICAgKiB2YWx1ZXMuIFRoZSBmaXJzdCBhcnJheSBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIGEgdmFsaWQgY29kZSBpcyBiZWluZ1xuICAgICAqIHJldHVybmVkLiBUaGUgc2Vjb25kIGFycmF5IGVsZW1lbnQgaXMgdGhlIGFjdHVhbCBjb2RlLiBUaGUgdGhpcmQgYXJyYXlcbiAgICAgKiBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIEVPRiB3YXMgcmVhY2hlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9maW5kVGFibGVDb2RlKHN0YXJ0LCBlbmQsIHRhYmxlLCBsaW1pdCkge1xuICAgICAgY29uc3QgbGltaXRWYWx1ZSA9IGxpbWl0IHx8IDA7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHtcbiAgICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7XG4gICAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCBlbmQpIHtcbiAgICAgICAgICBjb2RlIDw8PSBlbmQgLSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdO1xuICAgICAgICAgIGlmIChwWzBdID09PSBpKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXRCaXRzKGkpO1xuICAgICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0VHdvRGltQ29kZSgpIHtcbiAgICAgIGxldCBjb2RlID0gMDtcbiAgICAgIGxldCBwO1xuICAgICAgaWYgKHRoaXMuZW9ibG9jaykge1xuICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoNyk7XG4gICAgICAgIHAgPSB0d29EaW1UYWJsZVtjb2RlXTtcbiAgICAgICAgaWYgKHAgJiYgcFswXSA+IDApIHtcbiAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pO1xuICAgICAgICAgIHJldHVybiBwWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDcsIHR3b0RpbVRhYmxlKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSAmJiByZXN1bHRbMl0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmZvKFwiQmFkIHR3byBkaW0gY29kZVwiKTtcbiAgICAgIHJldHVybiBjY2l0dEVPRjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0V2hpdGVDb2RlKCkge1xuICAgICAgbGV0IGNvZGUgPSAwO1xuICAgICAgbGV0IHA7XG4gICAgICBpZiAodGhpcy5lb2Jsb2NrKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMik7XG4gICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPj4gNSA9PT0gMCkge1xuICAgICAgICAgIHAgPSB3aGl0ZVRhYmxlMVtjb2RlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwID0gd2hpdGVUYWJsZTJbY29kZSA+PiAzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwWzBdID4gMCkge1xuICAgICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7XG4gICAgICAgICAgcmV0dXJuIHBbMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDExLCAxMiwgd2hpdGVUYWJsZTEpO1xuICAgICAgICBpZiAocmVzdWx0WzBdKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5mbyhcImJhZCB3aGl0ZSBjb2RlXCIpO1xuICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRCbGFja0NvZGUoKSB7XG4gICAgICBsZXQgY29kZSwgcDtcbiAgICAgIGlmICh0aGlzLmVvYmxvY2spIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEzKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkge1xuICAgICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7XG4gICAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBbMF0gPiAwKSB7XG4gICAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTtcbiAgICAgICAgICByZXR1cm4gcFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMiwgNiwgYmxhY2tUYWJsZTMpO1xuICAgICAgICBpZiAocmVzdWx0WzBdKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoNywgMTIsIGJsYWNrVGFibGUyLCA2NCk7XG4gICAgICAgIGlmIChyZXN1bHRbMF0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluZm8oXCJiYWQgYmxhY2sgY29kZVwiKTtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfbG9va0JpdHMobikge1xuICAgICAgbGV0IGM7XG4gICAgICB3aGlsZSAodGhpcy5pbnB1dEJpdHMgPCBuKSB7XG4gICAgICAgIGlmICgoYyA9IHRoaXMuc291cmNlLm5leHQoKSkgPT09IC0xKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXRCaXRzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY2NpdHRFT0Y7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodGhpcy5pbnB1dEJ1ZiA8PCAobiAtIHRoaXMuaW5wdXRCaXRzKSkgJiAoMHhmZmZmID4+ICgxNiAtIG4pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0QnVmID0gKHRoaXMuaW5wdXRCdWYgPDwgOCkgfCBjO1xuICAgICAgICB0aGlzLmlucHV0Qml0cyArPSA4O1xuICAgICAgfVxuICAgICAgcmV0dXJuICh0aGlzLmlucHV0QnVmID4+ICh0aGlzLmlucHV0Qml0cyAtIG4pKSAmICgweGZmZmYgPj4gKDE2IC0gbikpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9lYXRCaXRzKG4pIHtcbiAgICAgIGlmICgodGhpcy5pbnB1dEJpdHMgLT0gbikgPCAwKSB7XG4gICAgICAgIHRoaXMuaW5wdXRCaXRzID0gMDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBDQ0lUVEZheERlY29kZXI7XG59KSgpO1xuXG5leHBvcnQgeyBDQ0lUVEZheERlY29kZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBpc0RpY3QsIGlzU3RyZWFtIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgRGVjb2RlU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBKYmlnMkltYWdlIH0gZnJvbSBcIi4vamJpZzIuanNcIjtcbmltcG9ydCB7IHNoYWRvdyB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG4vKipcbiAqIEZvciBKQklHMidzIHdlIHVzZSBhIGxpYnJhcnkgdG8gZGVjb2RlIHRoZXNlIGltYWdlcyBhbmRcbiAqIHRoZSBzdHJlYW0gYmVoYXZlcyBsaWtlIGFsbCB0aGUgb3RoZXIgRGVjb2RlU3RyZWFtcy5cbiAqL1xuY29uc3QgSmJpZzJTdHJlYW0gPSAoZnVuY3Rpb24gSmJpZzJTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEpiaWcyU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGRpY3QsIHBhcmFtcykge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDtcbiAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXG4gICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpO1xuICB9XG5cbiAgSmJpZzJTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSmJpZzJTdHJlYW0ucHJvdG90eXBlLCBcImJ5dGVzXCIsIHtcbiAgICBnZXQoKSB7XG4gICAgICAvLyBJZiBgdGhpcy5tYXliZUxlbmd0aGAgaXMgbnVsbCwgd2UnbGwgZ2V0IHRoZSBlbnRpcmUgc3RyZWFtLlxuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImJ5dGVzXCIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG5cbiAgSmJpZzJTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlciA9IGZ1bmN0aW9uIChyZXF1ZXN0ZWQpIHtcbiAgICAvLyBOby1vcCwgc2luY2UgYHRoaXMucmVhZEJsb2NrYCB3aWxsIGFsd2F5cyBwYXJzZSB0aGUgZW50aXJlIGltYWdlIGFuZFxuICAgIC8vIGRpcmVjdGx5IGluc2VydCBhbGwgb2YgaXRzIGRhdGEgaW50byBgdGhpcy5idWZmZXJgLlxuICB9O1xuXG4gIEpiaWcyU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGpiaWcySW1hZ2UgPSBuZXcgSmJpZzJJbWFnZSgpO1xuXG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgaWYgKGlzRGljdCh0aGlzLnBhcmFtcykpIHtcbiAgICAgIGNvbnN0IGdsb2JhbHNTdHJlYW0gPSB0aGlzLnBhcmFtcy5nZXQoXCJKQklHMkdsb2JhbHNcIik7XG4gICAgICBpZiAoaXNTdHJlYW0oZ2xvYmFsc1N0cmVhbSkpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFscyA9IGdsb2JhbHNTdHJlYW0uZ2V0Qnl0ZXMoKTtcbiAgICAgICAgY2h1bmtzLnB1c2goeyBkYXRhOiBnbG9iYWxzLCBzdGFydDogMCwgZW5kOiBnbG9iYWxzLmxlbmd0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2h1bmtzLnB1c2goeyBkYXRhOiB0aGlzLmJ5dGVzLCBzdGFydDogMCwgZW5kOiB0aGlzLmJ5dGVzLmxlbmd0aCB9KTtcbiAgICBjb25zdCBkYXRhID0gamJpZzJJbWFnZS5wYXJzZUNodW5rcyhjaHVua3MpO1xuICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAgIC8vIEpCSUcyIGhhZCBibGFjayBhcyAxIGFuZCB3aGl0ZSBhcyAwLCBpbnZlcnRpbmcgdGhlIGNvbG9yc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgaSsrKSB7XG4gICAgICBkYXRhW2ldIF49IDB4ZmY7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGFMZW5ndGg7XG4gICAgdGhpcy5lb2YgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBKYmlnMlN0cmVhbTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpiaWcyU3RyZWFtIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiwgc2hhZG93IH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBsb2cyLCByZWFkSW50OCwgcmVhZFVpbnQxNiwgcmVhZFVpbnQzMiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IEFyaXRobWV0aWNEZWNvZGVyIH0gZnJvbSBcIi4vYXJpdGhtZXRpY19kZWNvZGVyLmpzXCI7XG5pbXBvcnQgeyBDQ0lUVEZheERlY29kZXIgfSBmcm9tIFwiLi9jY2l0dC5qc1wiO1xuXG5jbGFzcyBKYmlnMkVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKGBKQklHMiBlcnJvcjogJHttc2d9YCk7XG4gIH1cbn1cblxudmFyIEpiaWcySW1hZ2UgPSAoZnVuY3Rpb24gSmJpZzJJbWFnZUNsb3N1cmUoKSB7XG4gIC8vIFV0aWxpdHkgZGF0YSBzdHJ1Y3R1cmVzXG4gIGZ1bmN0aW9uIENvbnRleHRDYWNoZSgpIHt9XG5cbiAgQ29udGV4dENhY2hlLnByb3RvdHlwZSA9IHtcbiAgICBnZXRDb250ZXh0cyhpZCkge1xuICAgICAgaWYgKGlkIGluIHRoaXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaWRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuICh0aGlzW2lkXSA9IG5ldyBJbnQ4QXJyYXkoMSA8PCAxNikpO1xuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIERlY29kaW5nQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IGRlY29kZXIoKSB7XG4gICAgICB2YXIgZGVjb2RlciA9IG5ldyBBcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMuZW5kKTtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJkZWNvZGVyXCIsIGRlY29kZXIpO1xuICAgIH0sXG4gICAgZ2V0IGNvbnRleHRDYWNoZSgpIHtcbiAgICAgIHZhciBjYWNoZSA9IG5ldyBDb250ZXh0Q2FjaGUoKTtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJjb250ZXh0Q2FjaGVcIiwgY2FjaGUpO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gQW5uZXggQS4gQXJpdGhtZXRpYyBJbnRlZ2VyIERlY29kaW5nIFByb2NlZHVyZVxuICAvLyBBLjIgUHJvY2VkdXJlIGZvciBkZWNvZGluZyB2YWx1ZXNcbiAgZnVuY3Rpb24gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIHByb2NlZHVyZSwgZGVjb2Rlcikge1xuICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpO1xuICAgIHZhciBwcmV2ID0gMTtcblxuICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGxlbmd0aCkge1xuICAgICAgdmFyIHYgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTtcbiAgICAgICAgcHJldiA9XG4gICAgICAgICAgcHJldiA8IDI1NiA/IChwcmV2IDw8IDEpIHwgYml0IDogKCgocHJldiA8PCAxKSB8IGJpdCkgJiA1MTEpIHwgMjU2O1xuICAgICAgICB2ID0gKHYgPDwgMSkgfCBiaXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdiA+Pj4gMDtcbiAgICB9XG5cbiAgICB2YXIgc2lnbiA9IHJlYWRCaXRzKDEpO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4gICAgdmFyIHZhbHVlID0gcmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgICAocmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDMyKSArIDQ0MzYpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRCaXRzKDEyKSArIDM0MCkgOlxuICAgICAgICAgICAgICAgICAgICAgIHJlYWRCaXRzKDgpICsgODQpIDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZEJpdHMoNikgKyAyMCkgOlxuICAgICAgICAgICAgICAgICAgcmVhZEJpdHMoNCkgKyA0KSA6XG4gICAgICAgICAgICAgICAgcmVhZEJpdHMoMik7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuICAgIGlmIChzaWduID09PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgIHJldHVybiAtdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQS4zIFRoZSBJQUlEIGRlY29kaW5nIHByb2NlZHVyZVxuICBmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkge1xuICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhcIklBSURcIik7XG5cbiAgICB2YXIgcHJldiA9IDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpO1xuICAgICAgcHJldiA9IChwcmV2IDw8IDEpIHwgYml0O1xuICAgIH1cbiAgICBpZiAoY29kZUxlbmd0aCA8IDMxKSB7XG4gICAgICByZXR1cm4gcHJldiAmICgoMSA8PCBjb2RlTGVuZ3RoKSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gcHJldiAmIDB4N2ZmZmZmZmY7XG4gIH1cblxuICAvLyA3LjMgU2VnbWVudCB0eXBlc1xuICB2YXIgU2VnbWVudFR5cGVzID0gW1xuICAgIFwiU3ltYm9sRGljdGlvbmFyeVwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIFwiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgXCJJbW1lZGlhdGVUZXh0UmVnaW9uXCIsXG4gICAgXCJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb25cIixcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgXCJQYXR0ZXJuRGljdGlvbmFyeVwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIFwiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb25cIixcbiAgICBudWxsLFxuICAgIFwiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb25cIixcbiAgICBcIkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb25cIixcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBcIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb25cIixcbiAgICBudWxsLFxuICAgIFwiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvblwiLFxuICAgIFwiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uXCIsXG4gICAgXCJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgXCJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIFwiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgXCJQYWdlSW5mb3JtYXRpb25cIixcbiAgICBcIkVuZE9mUGFnZVwiLFxuICAgIFwiRW5kT2ZTdHJpcGVcIixcbiAgICBcIkVuZE9mRmlsZVwiLFxuICAgIFwiUHJvZmlsZXNcIixcbiAgICBcIlRhYmxlc1wiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBcIkV4dGVuc2lvblwiLFxuICBdO1xuXG4gIHZhciBDb2RpbmdUZW1wbGF0ZXMgPSBbXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAyLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtNCwgeTogMCB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMiwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAyLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMywgeTogLTEgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtNCwgeTogMCB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gIF07XG5cbiAgdmFyIFJlZmluZW1lbnRUZW1wbGF0ZXMgPSBbXG4gICAge1xuICAgICAgY29kaW5nOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICBdLFxuICAgICAgcmVmZXJlbmNlOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMCwgeTogMCB9LFxuICAgICAgICB7IHg6IDEsIHk6IDAgfSxcbiAgICAgICAgeyB4OiAtMSwgeTogMSB9LFxuICAgICAgICB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAxIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgY29kaW5nOiBbXG4gICAgICAgIHsgeDogLTEsIHk6IC0xIH0sXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICBdLFxuICAgICAgcmVmZXJlbmNlOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgICAgICB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMCwgeTogMSB9LFxuICAgICAgICB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXTtcblxuICAvLyBTZWUgNi4yLjUuNyBEZWNvZGluZyB0aGUgYml0bWFwLlxuICB2YXIgUmV1c2VkQ29udGV4dHMgPSBbXG4gICAgMHg5YjI1LCAvLyAxMDAxMSAwMTEwMDEwIDAxMDFcbiAgICAweDA3OTUsIC8vIDAwMTEgMTEwMDEwIDEwMVxuICAgIDB4MDBlNSwgLy8gMDAxIDExMDAxIDAxXG4gICAgMHgwMTk1LCAvLyAwMTEwMDEgMDEwMVxuICBdO1xuXG4gIHZhciBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHMgPSBbXG4gICAgMHgwMDIwLCAvLyAnMDAwJyArICcwJyAoY29kaW5nKSArICcwMDAxMDAwMCcgKyAnMCcgKHJlZmVyZW5jZSlcbiAgICAweDAwMDgsIC8vICcwMDAwJyArICcwMDEwMDAnXG4gIF07XG5cbiAgZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkge1xuICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7XG4gICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhcIkdCXCIpO1xuICAgIHZhciBjb250ZXh0TGFiZWwsXG4gICAgICBpLFxuICAgICAgaixcbiAgICAgIHBpeGVsLFxuICAgICAgcm93LFxuICAgICAgcm93MSxcbiAgICAgIHJvdzIsXG4gICAgICBiaXRtYXAgPSBbXTtcblxuICAgIC8vIC4uLm9vb29vLi4uLlxuICAgIC8vIC4ub29vb29vby4uLiBDb250ZXh0IHRlbXBsYXRlIGZvciBjdXJyZW50IHBpeGVsIChYKVxuICAgIC8vIC5vb29vWC4uLi4uLiAoY29uY2F0ZW5hdGUgdmFsdWVzIG9mICdvJy1waXhlbHMgdG8gZ2V0IGNvbnRleHRMYWJlbClcbiAgICB2YXIgT0xEX1BJWEVMX01BU0sgPSAweDdiZjc7IC8vIDAxMTExIDAxMTExMTEgMDExMVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICByb3cgPSBiaXRtYXBbaV0gPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICByb3cxID0gaSA8IDEgPyByb3cgOiBiaXRtYXBbaSAtIDFdO1xuICAgICAgcm93MiA9IGkgPCAyID8gcm93IDogYml0bWFwW2kgLSAyXTtcblxuICAgICAgLy8gQXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdzpcbiAgICAgIC8vIEZpbGwgY29udGV4dExhYmVsIHdpdGggcGl4ZWxzIHRoYXQgYXJlIGFib3ZlL3JpZ2h0IG9mIChYKVxuICAgICAgY29udGV4dExhYmVsID1cbiAgICAgICAgKHJvdzJbMF0gPDwgMTMpIHxcbiAgICAgICAgKHJvdzJbMV0gPDwgMTIpIHxcbiAgICAgICAgKHJvdzJbMl0gPDwgMTEpIHxcbiAgICAgICAgKHJvdzFbMF0gPDwgNykgfFxuICAgICAgICAocm93MVsxXSA8PCA2KSB8XG4gICAgICAgIChyb3cxWzJdIDw8IDUpIHxcbiAgICAgICAgKHJvdzFbM10gPDwgNCk7XG5cbiAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpO1xuXG4gICAgICAgIC8vIEF0IGVhY2ggcGl4ZWw6IENsZWFyIGNvbnRleHRMYWJlbCBwaXhlbHMgdGhhdCBhcmUgc2hpZnRlZFxuICAgICAgICAvLyBvdXQgb2YgdGhlIGNvbnRleHQsIHRoZW4gYWRkIG5ldyBvbmVzLlxuICAgICAgICBjb250ZXh0TGFiZWwgPVxuICAgICAgICAgICgoY29udGV4dExhYmVsICYgT0xEX1BJWEVMX01BU0spIDw8IDEpIHxcbiAgICAgICAgICAoaiArIDMgPCB3aWR0aCA/IHJvdzJbaiArIDNdIDw8IDExIDogMCkgfFxuICAgICAgICAgIChqICsgNCA8IHdpZHRoID8gcm93MVtqICsgNF0gPDwgNCA6IDApIHxcbiAgICAgICAgICBwaXhlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gNi4yIEdlbmVyaWMgUmVnaW9uIERlY29kaW5nIFByb2NlZHVyZVxuICBmdW5jdGlvbiBkZWNvZGVCaXRtYXAoXG4gICAgbW1yLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB0ZW1wbGF0ZUluZGV4LFxuICAgIHByZWRpY3Rpb24sXG4gICAgc2tpcCxcbiAgICBhdCxcbiAgICBkZWNvZGluZ0NvbnRleHRcbiAgKSB7XG4gICAgaWYgKG1tcikge1xuICAgICAgY29uc3QgaW5wdXQgPSBuZXcgUmVhZGVyKFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuZGF0YSxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuZW5kXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFVzZSBvcHRpbWl6ZWQgdmVyc2lvbiBmb3IgdGhlIG1vc3QgY29tbW9uIGNhc2VcbiAgICBpZiAoXG4gICAgICB0ZW1wbGF0ZUluZGV4ID09PSAwICYmXG4gICAgICAhc2tpcCAmJlxuICAgICAgIXByZWRpY3Rpb24gJiZcbiAgICAgIGF0Lmxlbmd0aCA9PT0gNCAmJlxuICAgICAgYXRbMF0ueCA9PT0gMyAmJlxuICAgICAgYXRbMF0ueSA9PT0gLTEgJiZcbiAgICAgIGF0WzFdLnggPT09IC0zICYmXG4gICAgICBhdFsxXS55ID09PSAtMSAmJlxuICAgICAgYXRbMl0ueCA9PT0gMiAmJlxuICAgICAgYXRbMl0ueSA9PT0gLTIgJiZcbiAgICAgIGF0WzNdLnggPT09IC0yICYmXG4gICAgICBhdFszXS55ID09PSAtMlxuICAgICkge1xuICAgICAgcmV0dXJuIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpO1xuICAgIH1cblxuICAgIHZhciB1c2Vza2lwID0gISFza2lwO1xuICAgIHZhciB0ZW1wbGF0ZSA9IENvZGluZ1RlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5jb25jYXQoYXQpO1xuXG4gICAgLy8gU29ydGluZyBpcyBub24tc3RhbmRhcmQsIGFuZCBpdCBpcyBub3QgcmVxdWlyZWQuIEJ1dCBzb3J0aW5nIGluY3JlYXNlc1xuICAgIC8vIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYml0cyB0aGF0IGNhbiBiZSByZXVzZWQgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyBjb250ZXh0TGFiZWwgaW4gdGhlIG1haW4gbG9vcC5cbiAgICB0ZW1wbGF0ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS55IC0gYi55IHx8IGEueCAtIGIueDtcbiAgICB9KTtcblxuICAgIHZhciB0ZW1wbGF0ZUxlbmd0aCA9IHRlbXBsYXRlLmxlbmd0aDtcbiAgICB2YXIgdGVtcGxhdGVYID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7XG4gICAgdmFyIHRlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkodGVtcGxhdGVMZW5ndGgpO1xuICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcyA9IFtdO1xuICAgIHZhciByZXVzZU1hc2sgPSAwLFxuICAgICAgbWluWCA9IDAsXG4gICAgICBtYXhYID0gMCxcbiAgICAgIG1pblkgPSAwO1xuICAgIHZhciBjLCBrO1xuXG4gICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyspIHtcbiAgICAgIHRlbXBsYXRlWFtrXSA9IHRlbXBsYXRlW2tdLng7XG4gICAgICB0ZW1wbGF0ZVlba10gPSB0ZW1wbGF0ZVtrXS55O1xuICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHRlbXBsYXRlW2tdLngpO1xuICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHRlbXBsYXRlW2tdLngpO1xuICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHRlbXBsYXRlW2tdLnkpO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRlbXBsYXRlIHBpeGVsIGFwcGVhcnMgaW4gdHdvIGNvbnNlY3V0aXZlIGNvbnRleHQgbGFiZWxzLFxuICAgICAgLy8gc28gaXQgY2FuIGJlIHJldXNlZC4gT3RoZXJ3aXNlLCB3ZSBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgY2hhbmdpbmdcbiAgICAgIC8vIHRlbXBsYXRlIGVudHJpZXMuXG4gICAgICBpZiAoXG4gICAgICAgIGsgPCB0ZW1wbGF0ZUxlbmd0aCAtIDEgJiZcbiAgICAgICAgdGVtcGxhdGVba10ueSA9PT0gdGVtcGxhdGVbayArIDFdLnkgJiZcbiAgICAgICAgdGVtcGxhdGVba10ueCA9PT0gdGVtcGxhdGVbayArIDFdLnggLSAxXG4gICAgICApIHtcbiAgICAgICAgcmV1c2VNYXNrIHw9IDEgPDwgKHRlbXBsYXRlTGVuZ3RoIC0gMSAtIGspO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMucHVzaChrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNoYW5naW5nRW50cmllc0xlbmd0aCA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLmxlbmd0aDtcblxuICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTtcbiAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7XG4gICAgdmFyIGNoYW5naW5nVGVtcGxhdGVCaXQgPSBuZXcgVWludDE2QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTtcbiAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoOyBjKyspIHtcbiAgICAgIGsgPSBjaGFuZ2luZ1RlbXBsYXRlRW50cmllc1tjXTtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVYW2NdID0gdGVtcGxhdGVba10ueDtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVZW2NdID0gdGVtcGxhdGVba10ueTtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVCaXRbY10gPSAxIDw8ICh0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHNhZmUgYm91bmRpbmcgYm94IGVkZ2VzIGZyb20gdGhlIHdpZHRoLCBoZWlnaHQsIG1pblgsIG1heFgsIG1pbllcbiAgICB2YXIgc2JiX2xlZnQgPSAtbWluWDtcbiAgICB2YXIgc2JiX3RvcCA9IC1taW5ZO1xuICAgIHZhciBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7XG5cbiAgICB2YXIgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07XG4gICAgdmFyIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICB2YXIgYml0bWFwID0gW107XG5cbiAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyO1xuICAgIHZhciBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoXCJHQlwiKTtcblxuICAgIHZhciBsdHAgPSAwLFxuICAgICAgaixcbiAgICAgIGkwLFxuICAgICAgajAsXG4gICAgICBjb250ZXh0TGFiZWwgPSAwLFxuICAgICAgYml0LFxuICAgICAgc2hpZnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgICAgaWYgKHByZWRpY3Rpb24pIHtcbiAgICAgICAgdmFyIHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7XG4gICAgICAgIGx0cCBePSBzbHRwO1xuICAgICAgICBpZiAobHRwKSB7XG4gICAgICAgICAgYml0bWFwLnB1c2gocm93KTsgLy8gZHVwbGljYXRlIHByZXZpb3VzIHJvd1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByb3cgPSBuZXcgVWludDhBcnJheShyb3cpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHtcbiAgICAgICAgICByb3dbal0gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFyZSB3ZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2NhbmxpbmUsIHNvIHdlIGNhbiByZXVzZSBjb250ZXh0TGFiZWxcbiAgICAgICAgLy8gYml0cz9cbiAgICAgICAgaWYgKGogPj0gc2JiX2xlZnQgJiYgaiA8IHNiYl9yaWdodCAmJiBpID49IHNiYl90b3ApIHtcbiAgICAgICAgICAvLyBJZiB5ZXMsIHdlIGNhbiBqdXN0IHNoaWZ0IHRoZSBiaXRzIHRoYXQgYXJlIHJldXNhYmxlIGFuZCBvbmx5XG4gICAgICAgICAgLy8gZmV0Y2ggdGhlIHJlbWFpbmluZyBvbmVzLlxuICAgICAgICAgIGNvbnRleHRMYWJlbCA9IChjb250ZXh0TGFiZWwgPDwgMSkgJiByZXVzZU1hc2s7XG4gICAgICAgICAgZm9yIChrID0gMDsgayA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBpMCA9IGkgKyBjaGFuZ2luZ1RlbXBsYXRlWVtrXTtcbiAgICAgICAgICAgIGowID0gaiArIGNoYW5naW5nVGVtcGxhdGVYW2tdO1xuICAgICAgICAgICAgYml0ID0gYml0bWFwW2kwXVtqMF07XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107XG4gICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGNvbnRleHRMYWJlbCBmcm9tIHNjcmF0Y2hcbiAgICAgICAgICBjb250ZXh0TGFiZWwgPSAwO1xuICAgICAgICAgIHNoaWZ0ID0gdGVtcGxhdGVMZW5ndGggLSAxO1xuICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZUxlbmd0aDsgaysrLCBzaGlmdC0tKSB7XG4gICAgICAgICAgICBqMCA9IGogKyB0ZW1wbGF0ZVhba107XG4gICAgICAgICAgICBpZiAoajAgPj0gMCAmJiBqMCA8IHdpZHRoKSB7XG4gICAgICAgICAgICAgIGkwID0gaSArIHRlbXBsYXRlWVtrXTtcbiAgICAgICAgICAgICAgaWYgKGkwID49IDApIHtcbiAgICAgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTtcbiAgICAgICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0TGFiZWwgfD0gYml0IDw8IHNoaWZ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gNi4zLjIgR2VuZXJpYyBSZWZpbmVtZW50IFJlZ2lvbiBEZWNvZGluZyBQcm9jZWR1cmVcbiAgZnVuY3Rpb24gZGVjb2RlUmVmaW5lbWVudChcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgdGVtcGxhdGVJbmRleCxcbiAgICByZWZlcmVuY2VCaXRtYXAsXG4gICAgb2Zmc2V0WCxcbiAgICBvZmZzZXRZLFxuICAgIHByZWRpY3Rpb24sXG4gICAgYXQsXG4gICAgZGVjb2RpbmdDb250ZXh0XG4gICkge1xuICAgIHZhciBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nO1xuICAgIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7XG4gICAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTtcbiAgICB9XG4gICAgdmFyIGNvZGluZ1RlbXBsYXRlTGVuZ3RoID0gY29kaW5nVGVtcGxhdGUubGVuZ3RoO1xuICAgIHZhciBjb2RpbmdUZW1wbGF0ZVggPSBuZXcgSW50MzJBcnJheShjb2RpbmdUZW1wbGF0ZUxlbmd0aCk7XG4gICAgdmFyIGNvZGluZ1RlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTtcbiAgICB2YXIgaztcbiAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykge1xuICAgICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDtcbiAgICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7XG4gICAgfVxuXG4gICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlID0gUmVmaW5lbWVudFRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5yZWZlcmVuY2U7XG4gICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHtcbiAgICAgIHJlZmVyZW5jZVRlbXBsYXRlID0gcmVmZXJlbmNlVGVtcGxhdGUuY29uY2F0KFthdFsxXV0pO1xuICAgIH1cbiAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGggPSByZWZlcmVuY2VUZW1wbGF0ZS5sZW5ndGg7XG4gICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTtcbiAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVZID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpO1xuICAgIGZvciAoayA9IDA7IGsgPCByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aDsgaysrKSB7XG4gICAgICByZWZlcmVuY2VUZW1wbGF0ZVhba10gPSByZWZlcmVuY2VUZW1wbGF0ZVtrXS54O1xuICAgICAgcmVmZXJlbmNlVGVtcGxhdGVZW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueTtcbiAgICB9XG4gICAgdmFyIHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDtcbiAgICB2YXIgcmVmZXJlbmNlSGVpZ2h0ID0gcmVmZXJlbmNlQml0bWFwLmxlbmd0aDtcblxuICAgIHZhciBwc2V1ZG9QaXhlbENvbnRleHQgPSBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07XG4gICAgdmFyIGJpdG1hcCA9IFtdO1xuXG4gICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjtcbiAgICB2YXIgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKFwiR1JcIik7XG5cbiAgICB2YXIgbHRwID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICBpZiAocHJlZGljdGlvbikge1xuICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTtcbiAgICAgICAgbHRwIF49IHNsdHA7XG4gICAgICAgIGlmIChsdHApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICAgIGJpdG1hcC5wdXNoKHJvdyk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgdmFyIGkwLCBqMDtcbiAgICAgICAgdmFyIGNvbnRleHRMYWJlbCA9IDA7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBjb2RpbmdUZW1wbGF0ZUxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgaTAgPSBpICsgY29kaW5nVGVtcGxhdGVZW2tdO1xuICAgICAgICAgIGowID0gaiArIGNvZGluZ1RlbXBsYXRlWFtrXTtcbiAgICAgICAgICBpZiAoaTAgPCAwIHx8IGowIDwgMCB8fCBqMCA+PSB3aWR0aCkge1xuICAgICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOyAvLyBvdXQgb2YgYm91bmQgcGl4ZWxcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCA8PCAxKSB8IGJpdG1hcFtpMF1bajBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykge1xuICAgICAgICAgIGkwID0gaSArIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSAtIG9mZnNldFk7XG4gICAgICAgICAgajAgPSBqICsgcmVmZXJlbmNlVGVtcGxhdGVYW2tdIC0gb2Zmc2V0WDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpMCA8IDAgfHxcbiAgICAgICAgICAgIGkwID49IHJlZmVyZW5jZUhlaWdodCB8fFxuICAgICAgICAgICAgajAgPCAwIHx8XG4gICAgICAgICAgICBqMCA+PSByZWZlcmVuY2VXaWR0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOyAvLyBvdXQgb2YgYm91bmQgcGl4ZWxcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCA8PCAxKSB8IHJlZmVyZW5jZUJpdG1hcFtpMF1bajBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICAvLyA2LjUuNSBEZWNvZGluZyB0aGUgc3ltYm9sIGRpY3Rpb25hcnlcbiAgZnVuY3Rpb24gZGVjb2RlU3ltYm9sRGljdGlvbmFyeShcbiAgICBodWZmbWFuLFxuICAgIHJlZmluZW1lbnQsXG4gICAgc3ltYm9scyxcbiAgICBudW1iZXJPZk5ld1N5bWJvbHMsXG4gICAgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsXG4gICAgaHVmZm1hblRhYmxlcyxcbiAgICB0ZW1wbGF0ZUluZGV4LFxuICAgIGF0LFxuICAgIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LFxuICAgIHJlZmluZW1lbnRBdCxcbiAgICBkZWNvZGluZ0NvbnRleHQsXG4gICAgaHVmZm1hbklucHV0XG4gICkge1xuICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgdmFyIG5ld1N5bWJvbHMgPSBbXTtcbiAgICB2YXIgY3VycmVudEhlaWdodCA9IDA7XG4gICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSBsb2cyKHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzKTtcblxuICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7XG4gICAgdmFyIGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7XG4gICAgbGV0IHRhYmxlQjEsIHN5bWJvbFdpZHRocztcbiAgICBpZiAoaHVmZm1hbikge1xuICAgICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7IC8vIHN0YW5kYXJkIHRhYmxlIEIuMVxuICAgICAgc3ltYm9sV2lkdGhzID0gW107XG4gICAgICBzeW1ib2xDb2RlTGVuZ3RoID0gTWF0aC5tYXgoc3ltYm9sQ29kZUxlbmd0aCwgMSk7IC8vIDYuNS44LjIuM1xuICAgIH1cblxuICAgIHdoaWxlIChuZXdTeW1ib2xzLmxlbmd0aCA8IG51bWJlck9mTmV3U3ltYm9scykge1xuICAgICAgdmFyIGRlbHRhSGVpZ2h0ID0gaHVmZm1hblxuICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YUhlaWdodC5kZWNvZGUoaHVmZm1hbklucHV0KVxuICAgICAgICA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBREhcIiwgZGVjb2Rlcik7IC8vIDYuNS42XG4gICAgICBjdXJyZW50SGVpZ2h0ICs9IGRlbHRhSGVpZ2h0O1xuICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IDAsXG4gICAgICAgIHRvdGFsV2lkdGggPSAwO1xuICAgICAgY29uc3QgZmlyc3RTeW1ib2wgPSBodWZmbWFuID8gc3ltYm9sV2lkdGhzLmxlbmd0aCA6IDA7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsdGFXaWR0aCA9IGh1ZmZtYW5cbiAgICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVdpZHRoLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQURXXCIsIGRlY29kZXIpOyAvLyA2LjUuN1xuICAgICAgICBpZiAoZGVsdGFXaWR0aCA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrOyAvLyBPT0JcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDtcbiAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7XG4gICAgICAgIHZhciBiaXRtYXA7XG4gICAgICAgIGlmIChyZWZpbmVtZW50KSB7XG4gICAgICAgICAgLy8gNi41LjguMiBSZWZpbmVtZW50L2FnZ3JlZ2F0ZS1jb2RlZCBzeW1ib2wgYml0bWFwXG4gICAgICAgICAgdmFyIG51bWJlck9mSW5zdGFuY2VzID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFBSVwiLCBkZWNvZGVyKTtcbiAgICAgICAgICBpZiAobnVtYmVyT2ZJbnN0YW5jZXMgPiAxKSB7XG4gICAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKFxuICAgICAgICAgICAgICBodWZmbWFuLFxuICAgICAgICAgICAgICByZWZpbmVtZW50LFxuICAgICAgICAgICAgICBjdXJyZW50V2lkdGgsXG4gICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIG51bWJlck9mSW5zdGFuY2VzLFxuICAgICAgICAgICAgICAxLCAvLyBzdHJpcCBzaXplXG4gICAgICAgICAgICAgIHN5bWJvbHMuY29uY2F0KG5ld1N5bWJvbHMpLFxuICAgICAgICAgICAgICBzeW1ib2xDb2RlTGVuZ3RoLFxuICAgICAgICAgICAgICAwLCAvLyB0cmFuc3Bvc2VkXG4gICAgICAgICAgICAgIDAsIC8vIGRzIG9mZnNldFxuICAgICAgICAgICAgICAxLCAvLyB0b3AgbGVmdCA3LjQuMy4xLjFcbiAgICAgICAgICAgICAgMCwgLy8gT1Igb3BlcmF0b3JcbiAgICAgICAgICAgICAgaHVmZm1hblRhYmxlcyxcbiAgICAgICAgICAgICAgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICAgIHJlZmluZW1lbnRBdCxcbiAgICAgICAgICAgICAgZGVjb2RpbmdDb250ZXh0LFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBodWZmbWFuSW5wdXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2xJZCA9IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciByZHggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWFwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjNcbiAgICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWVwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjRcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPVxuICAgICAgICAgICAgICBzeW1ib2xJZCA8IHN5bWJvbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBzeW1ib2xzW3N5bWJvbElkXVxuICAgICAgICAgICAgICAgIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTtcbiAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoXG4gICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCxcbiAgICAgICAgICAgICAgY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgICAgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgICAgcmR4LFxuICAgICAgICAgICAgICByZHksXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICByZWZpbmVtZW50QXQsXG4gICAgICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaHVmZm1hbikge1xuICAgICAgICAgIC8vIFN0b3JlIG9ubHkgc3ltYm9sIHdpZHRoIGFuZCBkZWNvZGUgYSBjb2xsZWN0aXZlIGJpdG1hcCB3aGVuIHRoZVxuICAgICAgICAgIC8vIGhlaWdodCBjbGFzcyBpcyBkb25lLlxuICAgICAgICAgIHN5bWJvbFdpZHRocy5wdXNoKGN1cnJlbnRXaWR0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gNi41LjguMSBEaXJlY3QtY29kZWQgc3ltYm9sIGJpdG1hcFxuICAgICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgY3VycmVudFdpZHRoLFxuICAgICAgICAgICAgY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgIHRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBhdCxcbiAgICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChodWZmbWFuICYmICFyZWZpbmVtZW50KSB7XG4gICAgICAgIC8vIDYuNS45IEhlaWdodCBjbGFzcyBjb2xsZWN0aXZlIGJpdG1hcFxuICAgICAgICBjb25zdCBiaXRtYXBTaXplID0gaHVmZm1hblRhYmxlcy50YWJsZUJpdG1hcFNpemUuZGVjb2RlKGh1ZmZtYW5JbnB1dCk7XG4gICAgICAgIGh1ZmZtYW5JbnB1dC5ieXRlQWxpZ24oKTtcbiAgICAgICAgbGV0IGNvbGxlY3RpdmVCaXRtYXA7XG4gICAgICAgIGlmIChiaXRtYXBTaXplID09PSAwKSB7XG4gICAgICAgICAgLy8gVW5jb21wcmVzc2VkIGNvbGxlY3RpdmUgYml0bWFwXG4gICAgICAgICAgY29sbGVjdGl2ZUJpdG1hcCA9IHJlYWRVbmNvbXByZXNzZWRCaXRtYXAoXG4gICAgICAgICAgICBodWZmbWFuSW5wdXQsXG4gICAgICAgICAgICB0b3RhbFdpZHRoLFxuICAgICAgICAgICAgY3VycmVudEhlaWdodFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTU1SIGNvbGxlY3RpdmUgYml0bWFwXG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kO1xuICAgICAgICAgIGNvbnN0IGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7XG4gICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDtcbiAgICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKFxuICAgICAgICAgICAgaHVmZm1hbklucHV0LFxuICAgICAgICAgICAgdG90YWxXaWR0aCxcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IG9yaWdpbmFsRW5kO1xuICAgICAgICAgIGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiA9IGJpdG1hcEVuZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkID0gc3ltYm9sV2lkdGhzLmxlbmd0aDtcbiAgICAgICAgaWYgKGZpcnN0U3ltYm9sID09PSBudW1iZXJPZlN5bWJvbHNEZWNvZGVkIC0gMSkge1xuICAgICAgICAgIC8vIGNvbGxlY3RpdmVCaXRtYXAgaXMgYSBzaW5nbGUgc3ltYm9sLlxuICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChjb2xsZWN0aXZlQml0bWFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEaXZpZGUgY29sbGVjdGl2ZUJpdG1hcCBpbnRvIHN5bWJvbHMuXG4gICAgICAgICAgbGV0IGksXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgeE1pbiA9IDAsXG4gICAgICAgICAgICB4TWF4LFxuICAgICAgICAgICAgYml0bWFwV2lkdGgsXG4gICAgICAgICAgICBzeW1ib2xCaXRtYXA7XG4gICAgICAgICAgZm9yIChpID0gZmlyc3RTeW1ib2w7IGkgPCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkOyBpKyspIHtcbiAgICAgICAgICAgIGJpdG1hcFdpZHRoID0gc3ltYm9sV2lkdGhzW2ldO1xuICAgICAgICAgICAgeE1heCA9IHhNaW4gKyBiaXRtYXBXaWR0aDtcbiAgICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IFtdO1xuICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChzeW1ib2xCaXRtYXApO1xuICAgICAgICAgICAgeE1pbiA9IHhNYXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNi41LjEwIEV4cG9ydGVkIHN5bWJvbHNcbiAgICB2YXIgZXhwb3J0ZWRTeW1ib2xzID0gW107XG4gICAgdmFyIGZsYWdzID0gW10sXG4gICAgICBjdXJyZW50RmxhZyA9IGZhbHNlO1xuICAgIHZhciB0b3RhbFN5bWJvbHNMZW5ndGggPSBzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9scztcbiAgICB3aGlsZSAoZmxhZ3MubGVuZ3RoIDwgdG90YWxTeW1ib2xzTGVuZ3RoKSB7XG4gICAgICB2YXIgcnVuTGVuZ3RoID0gaHVmZm1hblxuICAgICAgICA/IHRhYmxlQjEuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQUVYXCIsIGRlY29kZXIpO1xuICAgICAgd2hpbGUgKHJ1bkxlbmd0aC0tKSB7XG4gICAgICAgIGZsYWdzLnB1c2goY3VycmVudEZsYWcpO1xuICAgICAgfVxuICAgICAgY3VycmVudEZsYWcgPSAhY3VycmVudEZsYWc7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN5bWJvbHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgaWYgKGZsYWdzW2ldKSB7XG4gICAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKHN5bWJvbHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bWJlck9mTmV3U3ltYm9sczsgaSsrLCBqKyspIHtcbiAgICAgIGlmIChmbGFnc1tpXSkge1xuICAgICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChuZXdTeW1ib2xzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cG9ydGVkU3ltYm9scztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZVRleHRSZWdpb24oXG4gICAgaHVmZm1hbixcbiAgICByZWZpbmVtZW50LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkZWZhdWx0UGl4ZWxWYWx1ZSxcbiAgICBudW1iZXJPZlN5bWJvbEluc3RhbmNlcyxcbiAgICBzdHJpcFNpemUsXG4gICAgaW5wdXRTeW1ib2xzLFxuICAgIHN5bWJvbENvZGVMZW5ndGgsXG4gICAgdHJhbnNwb3NlZCxcbiAgICBkc09mZnNldCxcbiAgICByZWZlcmVuY2VDb3JuZXIsXG4gICAgY29tYmluYXRpb25PcGVyYXRvcixcbiAgICBodWZmbWFuVGFibGVzLFxuICAgIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LFxuICAgIHJlZmluZW1lbnRBdCxcbiAgICBkZWNvZGluZ0NvbnRleHQsXG4gICAgbG9nU3RyaXBTaXplLFxuICAgIGh1ZmZtYW5JbnB1dFxuICApIHtcbiAgICBpZiAoaHVmZm1hbiAmJiByZWZpbmVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBiaXRtYXBcbiAgICB2YXIgYml0bWFwID0gW107XG4gICAgdmFyIGksIHJvdztcbiAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgICByb3dbal0gPSBkZWZhdWx0UGl4ZWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyO1xuICAgIHZhciBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlO1xuXG4gICAgdmFyIHN0cmlwVCA9IGh1ZmZtYW5cbiAgICAgID8gLWh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgIDogLWRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBRFRcIiwgZGVjb2Rlcik7IC8vIDYuNC42XG4gICAgdmFyIGZpcnN0UyA9IDA7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykge1xuICAgICAgdmFyIGRlbHRhVCA9IGh1ZmZtYW5cbiAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFEVFwiLCBkZWNvZGVyKTsgLy8gNi40LjZcbiAgICAgIHN0cmlwVCArPSBkZWx0YVQ7XG5cbiAgICAgIHZhciBkZWx0YUZpcnN0UyA9IGh1ZmZtYW5cbiAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRmlyc3RTLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFGU1wiLCBkZWNvZGVyKTsgLy8gNi40LjdcbiAgICAgIGZpcnN0UyArPSBkZWx0YUZpcnN0UztcbiAgICAgIHZhciBjdXJyZW50UyA9IGZpcnN0UztcbiAgICAgIGRvIHtcbiAgICAgICAgbGV0IGN1cnJlbnRUID0gMDsgLy8gNi40LjlcbiAgICAgICAgaWYgKHN0cmlwU2l6ZSA+IDEpIHtcbiAgICAgICAgICBjdXJyZW50VCA9IGh1ZmZtYW5cbiAgICAgICAgICAgID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSlcbiAgICAgICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFJVFwiLCBkZWNvZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdCA9IHN0cmlwU2l6ZSAqIHN0cmlwVCArIGN1cnJlbnRUO1xuICAgICAgICB2YXIgc3ltYm9sSWQgPSBodWZmbWFuXG4gICAgICAgICAgPyBodWZmbWFuVGFibGVzLnN5bWJvbElEVGFibGUuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgICA6IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTtcbiAgICAgICAgdmFyIGFwcGx5UmVmaW5lbWVudCA9XG4gICAgICAgICAgcmVmaW5lbWVudCAmJlxuICAgICAgICAgIChodWZmbWFuXG4gICAgICAgICAgICA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0KClcbiAgICAgICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFSSVwiLCBkZWNvZGVyKSk7XG4gICAgICAgIHZhciBzeW1ib2xCaXRtYXAgPSBpbnB1dFN5bWJvbHNbc3ltYm9sSWRdO1xuICAgICAgICB2YXIgc3ltYm9sV2lkdGggPSBzeW1ib2xCaXRtYXBbMF0ubGVuZ3RoO1xuICAgICAgICB2YXIgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sQml0bWFwLmxlbmd0aDtcbiAgICAgICAgaWYgKGFwcGx5UmVmaW5lbWVudCkge1xuICAgICAgICAgIHZhciByZHcgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEV1wiLCBkZWNvZGVyKTsgLy8gNi40LjExLjFcbiAgICAgICAgICB2YXIgcmRoID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFSREhcIiwgZGVjb2Rlcik7IC8vIDYuNC4xMS4yXG4gICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBUkRYXCIsIGRlY29kZXIpOyAvLyA2LjQuMTEuM1xuICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWVwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjRcbiAgICAgICAgICBzeW1ib2xXaWR0aCArPSByZHc7XG4gICAgICAgICAgc3ltYm9sSGVpZ2h0ICs9IHJkaDtcbiAgICAgICAgICBzeW1ib2xCaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KFxuICAgICAgICAgICAgc3ltYm9sV2lkdGgsXG4gICAgICAgICAgICBzeW1ib2xIZWlnaHQsXG4gICAgICAgICAgICByZWZpbmVtZW50VGVtcGxhdGVJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEJpdG1hcCxcbiAgICAgICAgICAgIChyZHcgPj4gMSkgKyByZHgsXG4gICAgICAgICAgICAocmRoID4+IDEpICsgcmR5LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICByZWZpbmVtZW50QXQsXG4gICAgICAgICAgICBkZWNvZGluZ0NvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpO1xuICAgICAgICB2YXIgb2Zmc2V0UyA9IGN1cnJlbnRTIC0gKHJlZmVyZW5jZUNvcm5lciAmIDIgPyBzeW1ib2xXaWR0aCAtIDEgOiAwKTtcbiAgICAgICAgdmFyIHMyLCB0Miwgc3ltYm9sUm93O1xuICAgICAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgICAgIC8vIFBsYWNlIFN5bWJvbCBCaXRtYXAgZnJvbSBUMSxTMVxuICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbEhlaWdodDsgczIrKykge1xuICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFMgKyBzMl07XG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFtzMl07XG4gICAgICAgICAgICAvLyBUbyBpZ25vcmUgUGFydHMgb2YgU3ltYm9sIGJpdG1hcCB3aGljaCBnb2VzXG4gICAgICAgICAgICAvLyBvdXRzaWRlIGJpdG1hcCByZWdpb25cbiAgICAgICAgICAgIHZhciBtYXhXaWR0aCA9IE1hdGgubWluKHdpZHRoIC0gb2Zmc2V0VCwgc3ltYm9sV2lkdGgpO1xuICAgICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogLy8gT1JcbiAgICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykge1xuICAgICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gfD0gc3ltYm9sUm93W3QyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgMjogLy8gWE9SXG4gICAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHtcbiAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIF49IHN5bWJvbFJvd1t0Ml07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFxuICAgICAgICAgICAgICAgICAgYG9wZXJhdG9yICR7Y29tYmluYXRpb25PcGVyYXRvcn0gaXMgbm90IHN1cHBvcnRlZGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xIZWlnaHQgLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykge1xuICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07XG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFt0Ml07XG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiAvLyBPUlxuICAgICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7XG4gICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAyOiAvLyBYT1JcbiAgICAgICAgICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xXaWR0aDsgczIrKykge1xuICAgICAgICAgICAgICAgICAgcm93W29mZnNldFMgKyBzMl0gXj0gc3ltYm9sUm93W3MyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbFdpZHRoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICAgIHZhciBkZWx0YVMgPSBodWZmbWFuXG4gICAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFTLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQURTXCIsIGRlY29kZXIpOyAvLyA2LjQuOFxuICAgICAgICBpZiAoZGVsdGFTID09PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7IC8vIE9PQlxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTICs9IGRlbHRhUyArIGRzT2Zmc2V0O1xuICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShcbiAgICBtbXIsXG4gICAgcGF0dGVybldpZHRoLFxuICAgIHBhdHRlcm5IZWlnaHQsXG4gICAgbWF4UGF0dGVybkluZGV4LFxuICAgIHRlbXBsYXRlLFxuICAgIGRlY29kaW5nQ29udGV4dFxuICApIHtcbiAgICBjb25zdCBhdCA9IFtdO1xuICAgIGlmICghbW1yKSB7XG4gICAgICBhdC5wdXNoKHtcbiAgICAgICAgeDogLXBhdHRlcm5XaWR0aCxcbiAgICAgICAgeTogMCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0zLFxuICAgICAgICAgIHk6IC0xLFxuICAgICAgICB9KTtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAtMixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0yLFxuICAgICAgICAgIHk6IC0yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29sbGVjdGl2ZVdpZHRoID0gKG1heFBhdHRlcm5JbmRleCArIDEpICogcGF0dGVybldpZHRoO1xuICAgIGNvbnN0IGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVCaXRtYXAoXG4gICAgICBtbXIsXG4gICAgICBjb2xsZWN0aXZlV2lkdGgsXG4gICAgICBwYXR0ZXJuSGVpZ2h0LFxuICAgICAgdGVtcGxhdGUsXG4gICAgICBmYWxzZSxcbiAgICAgIG51bGwsXG4gICAgICBhdCxcbiAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICk7XG4gICAgLy8gRGl2aWRlIGNvbGxlY3RpdmUgYml0bWFwIGludG8gcGF0dGVybnMuXG4gICAgY29uc3QgcGF0dGVybnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBtYXhQYXR0ZXJuSW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVybkJpdG1hcCA9IFtdO1xuICAgICAgY29uc3QgeE1pbiA9IHBhdHRlcm5XaWR0aCAqIGk7XG4gICAgICBjb25zdCB4TWF4ID0geE1pbiArIHBhdHRlcm5XaWR0aDtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcGF0dGVybkhlaWdodDsgeSsrKSB7XG4gICAgICAgIHBhdHRlcm5CaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2gocGF0dGVybkJpdG1hcCk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZUhhbGZ0b25lUmVnaW9uKFxuICAgIG1tcixcbiAgICBwYXR0ZXJucyxcbiAgICB0ZW1wbGF0ZSxcbiAgICByZWdpb25XaWR0aCxcbiAgICByZWdpb25IZWlnaHQsXG4gICAgZGVmYXVsdFBpeGVsVmFsdWUsXG4gICAgZW5hYmxlU2tpcCxcbiAgICBjb21iaW5hdGlvbk9wZXJhdG9yLFxuICAgIGdyaWRXaWR0aCxcbiAgICBncmlkSGVpZ2h0LFxuICAgIGdyaWRPZmZzZXRYLFxuICAgIGdyaWRPZmZzZXRZLFxuICAgIGdyaWRWZWN0b3JYLFxuICAgIGdyaWRWZWN0b3JZLFxuICAgIGRlY29kaW5nQ29udGV4dFxuICApIHtcbiAgICBjb25zdCBza2lwID0gbnVsbDtcbiAgICBpZiAoZW5hYmxlU2tpcCkge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJza2lwIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuICAgIGlmIChjb21iaW5hdGlvbk9wZXJhdG9yICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcbiAgICAgICAgXCJvcGVyYXRvciBcIiArXG4gICAgICAgICAgY29tYmluYXRpb25PcGVyYXRvciArXG4gICAgICAgICAgXCIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb25cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIGJpdG1hcC5cbiAgICBjb25zdCByZWdpb25CaXRtYXAgPSBbXTtcbiAgICBsZXQgaSwgaiwgcm93O1xuICAgIGZvciAoaSA9IDA7IGkgPCByZWdpb25IZWlnaHQ7IGkrKykge1xuICAgICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocmVnaW9uV2lkdGgpO1xuICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCByZWdpb25XaWR0aDsgaisrKSB7XG4gICAgICAgICAgcm93W2pdID0gZGVmYXVsdFBpeGVsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgY29uc3QgbnVtYmVyT2ZQYXR0ZXJucyA9IHBhdHRlcm5zLmxlbmd0aDtcbiAgICBjb25zdCBwYXR0ZXJuMCA9IHBhdHRlcm5zWzBdO1xuICAgIGNvbnN0IHBhdHRlcm5XaWR0aCA9IHBhdHRlcm4wWzBdLmxlbmd0aCxcbiAgICAgIHBhdHRlcm5IZWlnaHQgPSBwYXR0ZXJuMC5sZW5ndGg7XG4gICAgY29uc3QgYml0c1BlclZhbHVlID0gbG9nMihudW1iZXJPZlBhdHRlcm5zKTtcbiAgICBjb25zdCBhdCA9IFtdO1xuICAgIGlmICghbW1yKSB7XG4gICAgICBhdC5wdXNoKHtcbiAgICAgICAgeDogdGVtcGxhdGUgPD0gMSA/IDMgOiAyLFxuICAgICAgICB5OiAtMSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0zLFxuICAgICAgICAgIHk6IC0xLFxuICAgICAgICB9KTtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAtMixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0yLFxuICAgICAgICAgIHk6IC0yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQW5uZXggQy4gR3JheS1zY2FsZSBJbWFnZSBEZWNvZGluZyBQcm9jZWR1cmUuXG4gICAgY29uc3QgZ3JheVNjYWxlQml0UGxhbmVzID0gW107XG4gICAgbGV0IG1tcklucHV0LCBiaXRtYXA7XG4gICAgaWYgKG1tcikge1xuICAgICAgLy8gTU1SIGJpdCBwbGFuZXMgYXJlIGluIG9uZSBjb250aW51b3VzIHN0cmVhbS4gT25seSBFT0ZCIGNvZGVzIGluZGljYXRlXG4gICAgICAvLyB0aGUgZW5kIG9mIGVhY2ggYml0bWFwLCBzbyBFT0ZCcyBtdXN0IGJlIGRlY29kZWQuXG4gICAgICBtbXJJbnB1dCA9IG5ldyBSZWFkZXIoXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5kYXRhLFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuc3RhcnQsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5lbmRcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoaSA9IGJpdHNQZXJWYWx1ZSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAobW1yKSB7XG4gICAgICAgIGJpdG1hcCA9IGRlY29kZU1NUkJpdG1hcChtbXJJbnB1dCwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBncmlkV2lkdGgsXG4gICAgICAgICAgZ3JpZEhlaWdodCxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBza2lwLFxuICAgICAgICAgIGF0LFxuICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZ3JheVNjYWxlQml0UGxhbmVzW2ldID0gYml0bWFwO1xuICAgIH1cbiAgICAvLyA2LjYuNS4yIFJlbmRlcmluZyB0aGUgcGF0dGVybnMuXG4gICAgbGV0IG1nLCBuZywgYml0LCBwYXR0ZXJuSW5kZXgsIHBhdHRlcm5CaXRtYXAsIHgsIHksIHBhdHRlcm5Sb3csIHJlZ2lvblJvdztcbiAgICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7XG4gICAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHtcbiAgICAgICAgYml0ID0gMDtcbiAgICAgICAgcGF0dGVybkluZGV4ID0gMDtcbiAgICAgICAgZm9yIChqID0gYml0c1BlclZhbHVlIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICBiaXQgPSBncmF5U2NhbGVCaXRQbGFuZXNbal1bbWddW25nXSBeIGJpdDsgLy8gR3JheSBkZWNvZGluZ1xuICAgICAgICAgIHBhdHRlcm5JbmRleCB8PSBiaXQgPDwgajtcbiAgICAgICAgfVxuICAgICAgICBwYXR0ZXJuQml0bWFwID0gcGF0dGVybnNbcGF0dGVybkluZGV4XTtcbiAgICAgICAgeCA9IChncmlkT2Zmc2V0WCArIG1nICogZ3JpZFZlY3RvclkgKyBuZyAqIGdyaWRWZWN0b3JYKSA+PiA4O1xuICAgICAgICB5ID0gKGdyaWRPZmZzZXRZICsgbWcgKiBncmlkVmVjdG9yWCAtIG5nICogZ3JpZFZlY3RvclkpID4+IDg7XG4gICAgICAgIC8vIERyYXcgcGF0dGVybkJpdG1hcCBhdCAoeCwgeSkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB4ID49IDAgJiZcbiAgICAgICAgICB4ICsgcGF0dGVybldpZHRoIDw9IHJlZ2lvbldpZHRoICYmXG4gICAgICAgICAgeSA+PSAwICYmXG4gICAgICAgICAgeSArIHBhdHRlcm5IZWlnaHQgPD0gcmVnaW9uSGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFt5ICsgaV07XG4gICAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykge1xuICAgICAgICAgICAgICByZWdpb25Sb3dbeCArIGpdIHw9IHBhdHRlcm5Sb3dbal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZWdpb25YLCByZWdpb25ZO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTtcbiAgICAgICAgICAgIGlmIChyZWdpb25ZIDwgMCB8fCByZWdpb25ZID49IHJlZ2lvbkhlaWdodCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFtyZWdpb25ZXTtcbiAgICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajtcbiAgICAgICAgICAgICAgaWYgKHJlZ2lvblggPj0gMCAmJiByZWdpb25YIDwgcmVnaW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICByZWdpb25Sb3dbcmVnaW9uWF0gfD0gcGF0dGVyblJvd1tqXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVnaW9uQml0bWFwO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZFNlZ21lbnRIZWFkZXIoZGF0YSwgc3RhcnQpIHtcbiAgICB2YXIgc2VnbWVudEhlYWRlciA9IHt9O1xuICAgIHNlZ21lbnRIZWFkZXIubnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCk7XG4gICAgdmFyIGZsYWdzID0gZGF0YVtzdGFydCArIDRdO1xuICAgIHZhciBzZWdtZW50VHlwZSA9IGZsYWdzICYgMHgzZjtcbiAgICBpZiAoIVNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV0pIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBzZWdtZW50IHR5cGU6IFwiICsgc2VnbWVudFR5cGUpO1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLnR5cGUgPSBzZWdtZW50VHlwZTtcbiAgICBzZWdtZW50SGVhZGVyLnR5cGVOYW1lID0gU2VnbWVudFR5cGVzW3NlZ21lbnRUeXBlXTtcbiAgICBzZWdtZW50SGVhZGVyLmRlZmVycmVkTm9uUmV0YWluID0gISEoZmxhZ3MgJiAweDgwKTtcblxuICAgIHZhciBwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUgPSAhIShmbGFncyAmIDB4NDApO1xuICAgIHZhciByZWZlcnJlZEZsYWdzID0gZGF0YVtzdGFydCArIDVdO1xuICAgIHZhciByZWZlcnJlZFRvQ291bnQgPSAocmVmZXJyZWRGbGFncyA+PiA1KSAmIDc7XG4gICAgdmFyIHJldGFpbkJpdHMgPSBbcmVmZXJyZWRGbGFncyAmIDMxXTtcbiAgICB2YXIgcG9zaXRpb24gPSBzdGFydCArIDY7XG4gICAgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDcpIHtcbiAgICAgIHJlZmVycmVkVG9Db3VudCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gLSAxKSAmIDB4MWZmZmZmZmY7XG4gICAgICBwb3NpdGlvbiArPSAzO1xuICAgICAgdmFyIGJ5dGVzID0gKHJlZmVycmVkVG9Db3VudCArIDcpID4+IDM7XG4gICAgICByZXRhaW5CaXRzWzBdID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgIHdoaWxlICgtLWJ5dGVzID4gMCkge1xuICAgICAgICByZXRhaW5CaXRzLnB1c2goZGF0YVtwb3NpdGlvbisrXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWZlcnJlZEZsYWdzID09PSA1IHx8IHJlZmVycmVkRmxhZ3MgPT09IDYpIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCByZWZlcnJlZC10byBmbGFnc1wiKTtcbiAgICB9XG5cbiAgICBzZWdtZW50SGVhZGVyLnJldGFpbkJpdHMgPSByZXRhaW5CaXRzO1xuXG4gICAgbGV0IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDQ7XG4gICAgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDI1Nikge1xuICAgICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDY1NTM2KSB7XG4gICAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAyO1xuICAgIH1cbiAgICB2YXIgcmVmZXJyZWRUbyA9IFtdO1xuICAgIHZhciBpLCBpaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgcmVmZXJyZWRUb0NvdW50OyBpKyspIHtcbiAgICAgIGxldCBudW1iZXI7XG4gICAgICBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAxKSB7XG4gICAgICAgIG51bWJlciA9IGRhdGFbcG9zaXRpb25dO1xuICAgICAgfSBlbHNlIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDIpIHtcbiAgICAgICAgbnVtYmVyID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1iZXIgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJlZmVycmVkVG8ucHVzaChudW1iZXIpO1xuICAgICAgcG9zaXRpb24gKz0gcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplO1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLnJlZmVycmVkVG8gPSByZWZlcnJlZFRvO1xuICAgIGlmICghcGFnZUFzc29jaWF0aW9uRmllbGRTaXplKSB7XG4gICAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlZ21lbnRIZWFkZXIucGFnZUFzc29jaWF0aW9uID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICBwb3NpdGlvbiArPSA0O1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgIHBvc2l0aW9uICs9IDQ7XG5cbiAgICBpZiAoc2VnbWVudEhlYWRlci5sZW5ndGggPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgIC8vIDcuMi43IFNlZ21lbnQgZGF0YSBsZW5ndGgsIHVua25vd24gc2VnbWVudCBsZW5ndGhcbiAgICAgIGlmIChzZWdtZW50VHlwZSA9PT0gMzgpIHtcbiAgICAgICAgLy8gSW1tZWRpYXRlR2VuZXJpY1JlZ2lvblxuICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvbkluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPVxuICAgICAgICAgIGRhdGFbcG9zaXRpb24gKyBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aF07XG4gICAgICAgIHZhciBnZW5lcmljUmVnaW9uTW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICAvLyBzZWFyY2hpbmcgZm9yIHRoZSBzZWdtZW50IGVuZFxuICAgICAgICB2YXIgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7XG4gICAgICAgIHZhciBzZWFyY2hQYXR0ZXJuID0gbmV3IFVpbnQ4QXJyYXkoc2VhcmNoUGF0dGVybkxlbmd0aCk7XG4gICAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbk1tcikge1xuICAgICAgICAgIHNlYXJjaFBhdHRlcm5bMF0gPSAweGZmO1xuICAgICAgICAgIHNlYXJjaFBhdHRlcm5bMV0gPSAweGFjO1xuICAgICAgICB9XG4gICAgICAgIHNlYXJjaFBhdHRlcm5bMl0gPSAoZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzZWFyY2hQYXR0ZXJuWzNdID0gKGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiAxNikgJiAweGZmO1xuICAgICAgICBzZWFyY2hQYXR0ZXJuWzRdID0gKGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHNlYXJjaFBhdHRlcm5bNV0gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgJiAweGZmO1xuICAgICAgICBmb3IgKGkgPSBwb3NpdGlvbiwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICB2YXIgaiA9IDA7XG4gICAgICAgICAgd2hpbGUgKGogPCBzZWFyY2hQYXR0ZXJuTGVuZ3RoICYmIHNlYXJjaFBhdHRlcm5bal0gPT09IGRhdGFbaSArIGpdKSB7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqID09PSBzZWFyY2hQYXR0ZXJuTGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9IGkgKyBzZWFyY2hQYXR0ZXJuTGVuZ3RoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikge1xuICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwic2VnbWVudCBlbmQgd2FzIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGhcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHNlZ21lbnRIZWFkZXIuaGVhZGVyRW5kID0gcG9zaXRpb247XG4gICAgcmV0dXJuIHNlZ21lbnRIZWFkZXI7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkU2VnbWVudHMoaGVhZGVyLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHNlZ21lbnRzID0gW107XG4gICAgdmFyIHBvc2l0aW9uID0gc3RhcnQ7XG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7XG4gICAgICB2YXIgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7XG4gICAgICB2YXIgc2VnbWVudCA9IHtcbiAgICAgICAgaGVhZGVyOiBzZWdtZW50SGVhZGVyLFxuICAgICAgICBkYXRhLFxuICAgICAgfTtcbiAgICAgIGlmICghaGVhZGVyLnJhbmRvbUFjY2Vzcykge1xuICAgICAgICBzZWdtZW50LnN0YXJ0ID0gcG9zaXRpb247XG4gICAgICAgIHBvc2l0aW9uICs9IHNlZ21lbnRIZWFkZXIubGVuZ3RoO1xuICAgICAgICBzZWdtZW50LmVuZCA9IHBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgIGlmIChzZWdtZW50SGVhZGVyLnR5cGUgPT09IDUxKSB7XG4gICAgICAgIGJyZWFrOyAvLyBlbmQgb2YgZmlsZSBpcyBmb3VuZFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGVhZGVyLnJhbmRvbUFjY2Vzcykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBzZWdtZW50c1tpXS5zdGFydCA9IHBvc2l0aW9uO1xuICAgICAgICBwb3NpdGlvbiArPSBzZWdtZW50c1tpXS5oZWFkZXIubGVuZ3RoO1xuICAgICAgICBzZWdtZW50c1tpXS5lbmQgPSBwb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgLy8gNy40LjEgUmVnaW9uIHNlZ21lbnQgaW5mb3JtYXRpb24gZmllbGRcbiAgZnVuY3Rpb24gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBzdGFydCkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCksXG4gICAgICBoZWlnaHQ6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA0KSxcbiAgICAgIHg6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA4KSxcbiAgICAgIHk6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxMiksXG4gICAgICBjb21iaW5hdGlvbk9wZXJhdG9yOiBkYXRhW3N0YXJ0ICsgMTZdICYgNyxcbiAgICB9O1xuICB9XG4gIHZhciBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3O1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHNlZ21lbnQsIHZpc2l0b3IpIHtcbiAgICB2YXIgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7XG5cbiAgICB2YXIgZGF0YSA9IHNlZ21lbnQuZGF0YSxcbiAgICAgIHBvc2l0aW9uID0gc2VnbWVudC5zdGFydCxcbiAgICAgIGVuZCA9IHNlZ21lbnQuZW5kO1xuICAgIHZhciBhcmdzLCBhdCwgaSwgYXRMZW5ndGg7XG4gICAgc3dpdGNoIChoZWFkZXIudHlwZSkge1xuICAgICAgY2FzZSAwOiAvLyBTeW1ib2xEaWN0aW9uYXJ5XG4gICAgICAgIC8vIDcuNC4yIFN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgc3ludGF4XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5ID0ge307XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5RmxhZ3MgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTsgLy8gNy40LjIuMS4xXG4gICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpO1xuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTtcbiAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yID0gKGRpY3Rpb25hcnlGbGFncyA+PiA0KSAmIDM7XG4gICAgICAgIGRpY3Rpb25hcnkuYml0bWFwU2l6ZVNlbGVjdG9yID0gKGRpY3Rpb25hcnlGbGFncyA+PiA2KSAmIDE7XG4gICAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gNykgJiAxO1xuICAgICAgICBkaWN0aW9uYXJ5LmJpdG1hcENvZGluZ0NvbnRleHRVc2VkID0gISEoZGljdGlvbmFyeUZsYWdzICYgMjU2KTtcbiAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0UmV0YWluZWQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiA1MTIpO1xuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlID0gKGRpY3Rpb25hcnlGbGFncyA+PiAxMCkgJiAzO1xuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gMTIpICYgMTtcbiAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgaWYgKCFkaWN0aW9uYXJ5Lmh1ZmZtYW4pIHtcbiAgICAgICAgICBhdExlbmd0aCA9IGRpY3Rpb25hcnkudGVtcGxhdGUgPT09IDAgPyA0IDogMTtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkaWN0aW9uYXJ5LmF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpY3Rpb25hcnkucmVmaW5lbWVudCAmJiAhZGljdGlvbmFyeS5yZWZpbmVtZW50VGVtcGxhdGUpIHtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksXG4gICAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudEF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgZGljdGlvbmFyeS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mTmV3U3ltYm9scyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBhcmdzID0gW1xuICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgaGVhZGVyLm51bWJlcixcbiAgICAgICAgICBoZWFkZXIucmVmZXJyZWRUbyxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIGVuZCxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6IC8vIEltbWVkaWF0ZVRleHRSZWdpb25cbiAgICAgIGNhc2UgNzogLy8gSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uXG4gICAgICAgIHZhciB0ZXh0UmVnaW9uID0ge307XG4gICAgICAgIHRleHRSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDtcbiAgICAgICAgdmFyIHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMik7XG4gICAgICAgIHRleHRSZWdpb24ubG9nU3RyaXBTaXplID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICB0ZXh0UmVnaW9uLnN0cmlwU2l6ZSA9IDEgPDwgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemU7XG4gICAgICAgIHRleHRSZWdpb24ucmVmZXJlbmNlQ29ybmVyID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gNCkgJiAzO1xuICAgICAgICB0ZXh0UmVnaW9uLnRyYW5zcG9zZWQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgNjQpO1xuICAgICAgICB0ZXh0UmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA3KSAmIDM7XG4gICAgICAgIHRleHRSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA5KSAmIDE7XG4gICAgICAgIHRleHRSZWdpb24uZHNPZmZzZXQgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA8PCAxNykgPj4gMjc7XG4gICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMTUpICYgMTtcbiAgICAgICAgaWYgKHRleHRSZWdpb24uaHVmZm1hbikge1xuICAgICAgICAgIHZhciB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5GUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRTID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRUID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNCkgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREVyA9ICh0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDYpICYgMztcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50REggPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA4KSAmIDM7XG4gICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERYID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTApICYgMztcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFkgPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMikgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRTaXplU2VsZWN0b3IgPSAhIShcbiAgICAgICAgICAgIHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAweDQwMDBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0UmVnaW9uLnJlZmluZW1lbnQgJiYgIXRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlKSB7XG4gICAgICAgICAgYXQgPSBbXTtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRBdCA9IGF0O1xuICAgICAgICB9XG4gICAgICAgIHRleHRSZWdpb24ubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgYXJncyA9IFt0ZXh0UmVnaW9uLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNjogLy8gUGF0dGVybkRpY3Rpb25hcnlcbiAgICAgICAgLy8gNy40LjQuIFBhdHRlcm4gZGljdGlvbmFyeSBzZWdtZW50IHN5bnRheFxuICAgICAgICBjb25zdCBwYXR0ZXJuRGljdGlvbmFyeSA9IHt9O1xuICAgICAgICBjb25zdCBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubW1yID0gISEocGF0dGVybkRpY3Rpb25hcnlGbGFncyAmIDEpO1xuICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS50ZW1wbGF0ZSA9IChwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID4+IDEpICYgMztcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybldpZHRoID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybkhlaWdodCA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBhcmdzID0gW3BhdHRlcm5EaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDIyOiAvLyBJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvblxuICAgICAgY2FzZSAyMzogLy8gSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvblxuICAgICAgICAvLyA3LjQuNSBIYWxmdG9uZSByZWdpb24gc2VnbWVudCBzeW50YXhcbiAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb24gPSB7fTtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDtcbiAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb25GbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLm1tciA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiAxKTtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24udGVtcGxhdGUgPSAoaGFsZnRvbmVSZWdpb25GbGFncyA+PiAxKSAmIDM7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmVuYWJsZVNraXAgPSAhIShoYWxmdG9uZVJlZ2lvbkZsYWdzICYgOCk7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSAoaGFsZnRvbmVSZWdpb25GbGFncyA+PiA0KSAmIDc7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gKGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gNykgJiAxO1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkV2lkdGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZEhlaWdodCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFkgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7XG4gICAgICAgIHBvc2l0aW9uICs9IDQ7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JYID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JZID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgIGFyZ3MgPSBbaGFsZnRvbmVSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OiAvLyBJbW1lZGlhdGVHZW5lcmljUmVnaW9uXG4gICAgICBjYXNlIDM5OiAvLyBJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb25cbiAgICAgICAgdmFyIGdlbmVyaWNSZWdpb24gPSB7fTtcbiAgICAgICAgZ2VuZXJpY1JlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoO1xuICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIGdlbmVyaWNSZWdpb24ubW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICBnZW5lcmljUmVnaW9uLnRlbXBsYXRlID0gKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPj4gMSkgJiAzO1xuICAgICAgICBnZW5lcmljUmVnaW9uLnByZWRpY3Rpb24gPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgOCk7XG4gICAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbi5tbXIpIHtcbiAgICAgICAgICBhdExlbmd0aCA9IGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPT09IDAgPyA0IDogMTtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZW5lcmljUmVnaW9uLmF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgYXJncyA9IFtnZW5lcmljUmVnaW9uLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ4OiAvLyBQYWdlSW5mb3JtYXRpb25cbiAgICAgICAgdmFyIHBhZ2VJbmZvID0ge1xuICAgICAgICAgIHdpZHRoOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSxcbiAgICAgICAgICBoZWlnaHQ6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KSxcbiAgICAgICAgICByZXNvbHV0aW9uWDogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDgpLFxuICAgICAgICAgIHJlc29sdXRpb25ZOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMTIpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAocGFnZUluZm8uaGVpZ2h0ID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgZGVsZXRlIHBhZ2VJbmZvLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFnZVNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyAxNl07XG4gICAgICAgIHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAxNyk7IC8vIHBhZ2VTdHJpcGluZ0luZm9ybWF0aW9uXG4gICAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpO1xuICAgICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IChwYWdlU2VnbWVudEZsYWdzID4+IDIpICYgMTtcbiAgICAgICAgcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvciA9IChwYWdlU2VnbWVudEZsYWdzID4+IDMpICYgMztcbiAgICAgICAgcGFnZUluZm8ucmVxdWlyZXNCdWZmZXIgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMzIpO1xuICAgICAgICBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGUgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgNjQpO1xuICAgICAgICBhcmdzID0gW3BhZ2VJbmZvXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ5OiAvLyBFbmRPZlBhZ2VcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDUwOiAvLyBFbmRPZlN0cmlwZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTE6IC8vIEVuZE9mRmlsZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTM6IC8vIFRhYmxlc1xuICAgICAgICBhcmdzID0gW2hlYWRlci5udW1iZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmRdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vIDcuNC4xNSBkZWZpbmVzIDIgZXh0ZW5zaW9uIHR5cGVzIHdoaWNoXG4gICAgICAgIC8vIGFyZSBjb21tZW50cyBhbmQgY2FuIGJlIGlnbm9yZWQuXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgYHNlZ21lbnQgdHlwZSAke2hlYWRlci50eXBlTmFtZX0oJHtoZWFkZXIudHlwZX0pYCArXG4gICAgICAgICAgICBcIiBpcyBub3QgaW1wbGVtZW50ZWRcIlxuICAgICAgICApO1xuICAgIH1cbiAgICB2YXIgY2FsbGJhY2tOYW1lID0gXCJvblwiICsgaGVhZGVyLnR5cGVOYW1lO1xuICAgIGlmIChjYWxsYmFja05hbWUgaW4gdmlzaXRvcikge1xuICAgICAgdmlzaXRvcltjYWxsYmFja05hbWVdLmFwcGx5KHZpc2l0b3IsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcikge1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHByb2Nlc3NTZWdtZW50KHNlZ21lbnRzW2ldLCB2aXNpdG9yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcykge1xuICAgIHZhciB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHZhciBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyh7fSwgY2h1bmsuZGF0YSwgY2h1bmsuc3RhcnQsIGNodW5rLmVuZCk7XG4gICAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaXRvci5idWZmZXI7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUpiaWcyKGRhdGEpIHtcbiAgICBjb25zdCBlbmQgPSBkYXRhLmxlbmd0aDtcbiAgICBsZXQgcG9zaXRpb24gPSAwO1xuXG4gICAgaWYgKFxuICAgICAgZGF0YVtwb3NpdGlvbl0gIT09IDB4OTcgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyAxXSAhPT0gMHg0YSB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDJdICE9PSAweDQyIHx8XG4gICAgICBkYXRhW3Bvc2l0aW9uICsgM10gIT09IDB4MzIgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyA0XSAhPT0gMHgwZCB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDVdICE9PSAweDBhIHx8XG4gICAgICBkYXRhW3Bvc2l0aW9uICsgNl0gIT09IDB4MWEgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyA3XSAhPT0gMHgwYVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJwYXJzZUpiaWcyIC0gaW52YWxpZCBoZWFkZXIuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcG9zaXRpb24gKz0gODtcbiAgICBjb25zdCBmbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgaGVhZGVyLnJhbmRvbUFjY2VzcyA9ICEoZmxhZ3MgJiAxKTtcbiAgICBpZiAoIShmbGFncyAmIDIpKSB7XG4gICAgICBoZWFkZXIubnVtYmVyT2ZQYWdlcyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmQpO1xuICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgU2ltcGxlU2VnbWVudFZpc2l0b3IoKTtcbiAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpO1xuXG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB2aXNpdG9yLmN1cnJlbnRQYWdlSW5mbztcbiAgICBjb25zdCBiaXRQYWNrZWQgPSB2aXNpdG9yLmJ1ZmZlcjtcbiAgICBjb25zdCBpbWdEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTtcbiAgICBsZXQgcSA9IDAsXG4gICAgICBrID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICBsZXQgbWFzayA9IDAsXG4gICAgICAgIGJ1ZmZlcjtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgIGJ1ZmZlciA9IGJpdFBhY2tlZFtrKytdO1xuICAgICAgICB9XG4gICAgICAgIGltZ0RhdGFbcSsrXSA9IGJ1ZmZlciAmIG1hc2sgPyAwIDogMjU1O1xuICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGltZ0RhdGEsIHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yKCkge31cblxuICBTaW1wbGVTZWdtZW50VmlzaXRvci5wcm90b3R5cGUgPSB7XG4gICAgb25QYWdlSW5mb3JtYXRpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uUGFnZUluZm9ybWF0aW9uKGluZm8pIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbztcbiAgICAgIHZhciByb3dTaXplID0gKGluZm8ud2lkdGggKyA3KSA+PiAzO1xuICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OENsYW1wZWRBcnJheShyb3dTaXplICogaW5mby5oZWlnaHQpO1xuICAgICAgLy8gVGhlIGNvbnRlbnRzIG9mIEFycmF5QnVmZmVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gMC5cbiAgICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIDB4RkYgb25seSBpZiBpbmZvLmRlZmF1bHRQaXhlbFZhbHVlIGlzIHNldFxuICAgICAgaWYgKGluZm8uZGVmYXVsdFBpeGVsVmFsdWUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICBidWZmZXJbaV0gPSAweGZmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICB9LFxuICAgIGRyYXdCaXRtYXA6IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX2RyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKSB7XG4gICAgICB2YXIgcGFnZUluZm8gPSB0aGlzLmN1cnJlbnRQYWdlSW5mbztcbiAgICAgIHZhciB3aWR0aCA9IHJlZ2lvbkluZm8ud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IHJlZ2lvbkluZm8uaGVpZ2h0O1xuICAgICAgdmFyIHJvd1NpemUgPSAocGFnZUluZm8ud2lkdGggKyA3KSA+PiAzO1xuICAgICAgdmFyIGNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGVcbiAgICAgICAgPyByZWdpb25JbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JcbiAgICAgICAgOiBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yO1xuICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgdmFyIG1hc2swID0gMTI4ID4+IChyZWdpb25JbmZvLnggJiA3KTtcbiAgICAgIHZhciBvZmZzZXQwID0gcmVnaW9uSW5mby55ICogcm93U2l6ZSArIChyZWdpb25JbmZvLnggPj4gMyk7XG4gICAgICB2YXIgaSwgaiwgbWFzaywgb2Zmc2V0O1xuICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgMDogLy8gT1JcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIG1hc2sgPSBtYXNrMDtcbiAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gfD0gbWFzaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgICAgICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6IC8vIFhPUlxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgICAgICAgICAgbWFzayA9IG1hc2swO1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSBePSBtYXNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgICAgICAgIGlmICghbWFzaykge1xuICAgICAgICAgICAgICAgIG1hc2sgPSAxMjg7XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgICBgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUdlbmVyaWNSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihcbiAgICAgIHJlZ2lvbixcbiAgICAgIGRhdGEsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgICkge1xuICAgICAgdmFyIHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbztcbiAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgICAgdmFyIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgcmVnaW9uLm1tcixcbiAgICAgICAgcmVnaW9uSW5mby53aWR0aCxcbiAgICAgICAgcmVnaW9uSW5mby5oZWlnaHQsXG4gICAgICAgIHJlZ2lvbi50ZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uLnByZWRpY3Rpb24sXG4gICAgICAgIG51bGwsXG4gICAgICAgIHJlZ2lvbi5hdCxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0XG4gICAgICApO1xuICAgICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24oKSB7XG4gICAgICB0aGlzLm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgb25TeW1ib2xEaWN0aW9uYXJ5OiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vblN5bWJvbERpY3Rpb25hcnkoXG4gICAgICBkaWN0aW9uYXJ5LFxuICAgICAgY3VycmVudFNlZ21lbnQsXG4gICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgKSB7XG4gICAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0O1xuICAgICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikge1xuICAgICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoXG4gICAgICAgICAgZGljdGlvbmFyeSxcbiAgICAgICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgICAgIHRoaXMuY3VzdG9tVGFibGVzXG4gICAgICAgICk7XG4gICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbWJpbmVzIGV4cG9ydGVkIHN5bWJvbHMgZnJvbSBhbGwgcmVmZXJyZWQgc2VnbWVudHNcbiAgICAgIHZhciBzeW1ib2xzID0gdGhpcy5zeW1ib2xzO1xuICAgICAgaWYgKCFzeW1ib2xzKSB7XG4gICAgICAgIHRoaXMuc3ltYm9scyA9IHN5bWJvbHMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdmFyIGlucHV0U3ltYm9scyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVmZXJyZWRTZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50c1tpXV07XG4gICAgICAgIC8vIHJlZmVycmVkU3ltYm9scyBpcyB1bmRlZmluZWQgd2hlbiB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgVGFibGVzXG4gICAgICAgIC8vIHNlZ21lbnQgaW5zdGVhZCBvZiBhIFN5bWJvbERpY3Rpb25hcnkuXG4gICAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHtcbiAgICAgICAgICBpbnB1dFN5bWJvbHMgPSBpbnB1dFN5bWJvbHMuY29uY2F0KHJlZmVycmVkU3ltYm9scyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoXG4gICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbixcbiAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50LFxuICAgICAgICBpbnB1dFN5bWJvbHMsXG4gICAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZOZXdTeW1ib2xzLFxuICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLFxuICAgICAgICBodWZmbWFuVGFibGVzLFxuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlLFxuICAgICAgICBkaWN0aW9uYXJ5LmF0LFxuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSxcbiAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50QXQsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dCxcbiAgICAgICAgaHVmZm1hbklucHV0XG4gICAgICApO1xuICAgIH0sXG4gICAgb25JbW1lZGlhdGVUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZVRleHRSZWdpb24oXG4gICAgICByZWdpb24sXG4gICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgKSB7XG4gICAgICB2YXIgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvO1xuICAgICAgbGV0IGh1ZmZtYW5UYWJsZXMsIGh1ZmZtYW5JbnB1dDtcblxuICAgICAgLy8gQ29tYmluZXMgZXhwb3J0ZWQgc3ltYm9scyBmcm9tIGFsbCByZWZlcnJlZCBzZWdtZW50c1xuICAgICAgdmFyIHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7XG4gICAgICB2YXIgaW5wdXRTeW1ib2xzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRzW2ldXTtcbiAgICAgICAgLy8gcmVmZXJyZWRTeW1ib2xzIGlzIHVuZGVmaW5lZCB3aGVuIHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYSBUYWJsZXNcbiAgICAgICAgLy8gc2VnbWVudCBpbnN0ZWFkIG9mIGEgU3ltYm9sRGljdGlvbmFyeS5cbiAgICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykge1xuICAgICAgICAgIGlucHV0U3ltYm9scyA9IGlucHV0U3ltYm9scy5jb25jYXQocmVmZXJyZWRTeW1ib2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSBsb2cyKGlucHV0U3ltYm9scy5sZW5ndGgpO1xuICAgICAgaWYgKHJlZ2lvbi5odWZmbWFuKSB7XG4gICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgcmVmZXJyZWRTZWdtZW50cyxcbiAgICAgICAgICB0aGlzLmN1c3RvbVRhYmxlcyxcbiAgICAgICAgICBpbnB1dFN5bWJvbHMubGVuZ3RoLFxuICAgICAgICAgIGh1ZmZtYW5JbnB1dFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKFxuICAgICAgICByZWdpb24uaHVmZm1hbixcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnQsXG4gICAgICAgIHJlZ2lvbkluZm8ud2lkdGgsXG4gICAgICAgIHJlZ2lvbkluZm8uaGVpZ2h0LFxuICAgICAgICByZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUsXG4gICAgICAgIHJlZ2lvbi5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyxcbiAgICAgICAgcmVnaW9uLnN0cmlwU2l6ZSxcbiAgICAgICAgaW5wdXRTeW1ib2xzLFxuICAgICAgICBzeW1ib2xDb2RlTGVuZ3RoLFxuICAgICAgICByZWdpb24udHJhbnNwb3NlZCxcbiAgICAgICAgcmVnaW9uLmRzT2Zmc2V0LFxuICAgICAgICByZWdpb24ucmVmZXJlbmNlQ29ybmVyLFxuICAgICAgICByZWdpb24uY29tYmluYXRpb25PcGVyYXRvcixcbiAgICAgICAgaHVmZm1hblRhYmxlcyxcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnRBdCxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LFxuICAgICAgICByZWdpb24ubG9nU3RyaXBTaXplLFxuICAgICAgICBodWZmbWFuSW5wdXRcbiAgICAgICk7XG4gICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTtcbiAgICB9LFxuICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpIHtcbiAgICAgIHRoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBvblBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgICBsZXQgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zO1xuICAgICAgaWYgKCFwYXR0ZXJucykge1xuICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShcbiAgICAgICAgZGljdGlvbmFyeS5tbXIsXG4gICAgICAgIGRpY3Rpb25hcnkucGF0dGVybldpZHRoLFxuICAgICAgICBkaWN0aW9uYXJ5LnBhdHRlcm5IZWlnaHQsXG4gICAgICAgIGRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4LFxuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlLFxuICAgICAgICBkZWNvZGluZ0NvbnRleHRcbiAgICAgICk7XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uKHJlZ2lvbiwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgICAgLy8gSGFsZnRvbmVSZWdpb24gcmVmZXJzIHRvIGV4YWN0bHkgb25lIFBhdHRlcm5EaWN0aW9uYXJ5LlxuICAgICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zW3JlZmVycmVkU2VnbWVudHNbMF1dO1xuICAgICAgY29uc3QgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvO1xuICAgICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZUhhbGZ0b25lUmVnaW9uKFxuICAgICAgICByZWdpb24ubW1yLFxuICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgcmVnaW9uLnRlbXBsYXRlLFxuICAgICAgICByZWdpb25JbmZvLndpZHRoLFxuICAgICAgICByZWdpb25JbmZvLmhlaWdodCxcbiAgICAgICAgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLFxuICAgICAgICByZWdpb24uZW5hYmxlU2tpcCxcbiAgICAgICAgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsXG4gICAgICAgIHJlZ2lvbi5ncmlkV2lkdGgsXG4gICAgICAgIHJlZ2lvbi5ncmlkSGVpZ2h0LFxuICAgICAgICByZWdpb24uZ3JpZE9mZnNldFgsXG4gICAgICAgIHJlZ2lvbi5ncmlkT2Zmc2V0WSxcbiAgICAgICAgcmVnaW9uLmdyaWRWZWN0b3JYLFxuICAgICAgICByZWdpb24uZ3JpZFZlY3RvclksXG4gICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApO1xuICAgIH0sXG4gICAgb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uKCkge1xuICAgICAgdGhpcy5vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgICAgbGV0IGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzO1xuICAgICAgaWYgKCFjdXN0b21UYWJsZXMpIHtcbiAgICAgICAgdGhpcy5jdXN0b21UYWJsZXMgPSBjdXN0b21UYWJsZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGN1c3RvbVRhYmxlc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gSHVmZm1hbkxpbmUobGluZURhdGEpIHtcbiAgICBpZiAobGluZURhdGEubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBPT0IgbGluZS5cbiAgICAgIHRoaXMuaXNPT0IgPSB0cnVlO1xuICAgICAgdGhpcy5yYW5nZUxvdyA9IDA7XG4gICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzBdO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IDA7XG4gICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVsxXTtcbiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vcm1hbCwgdXBwZXIgcmFuZ2Ugb3IgbG93ZXIgcmFuZ2UgbGluZS5cbiAgICAgIC8vIFVwcGVyIHJhbmdlIGxpbmVzIGFyZSBwcm9jZXNzZWQgbGlrZSBub3JtYWwgbGluZXMuXG4gICAgICB0aGlzLmlzT09CID0gZmFsc2U7XG4gICAgICB0aGlzLnJhbmdlTG93ID0gbGluZURhdGFbMF07XG4gICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzFdO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmVEYXRhWzJdO1xuICAgICAgdGhpcy5wcmVmaXhDb2RlID0gbGluZURhdGFbM107XG4gICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmVEYXRhWzRdID09PSBcImxvd2VyXCI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gSHVmZm1hblRyZWVOb2RlKGxpbmUpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIC8vIExlYWYgbm9kZVxuICAgICAgdGhpcy5pc0xlYWYgPSB0cnVlO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmUucmFuZ2VMZW5ndGg7XG4gICAgICB0aGlzLnJhbmdlTG93ID0gbGluZS5yYW5nZUxvdztcbiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gbGluZS5pc0xvd2VyUmFuZ2U7XG4gICAgICB0aGlzLmlzT09CID0gbGluZS5pc09PQjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJtZWRpYXRlIG9yIHJvb3Qgbm9kZVxuICAgICAgdGhpcy5pc0xlYWYgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBIdWZmbWFuVHJlZU5vZGUucHJvdG90eXBlID0ge1xuICAgIGJ1aWxkVHJlZShsaW5lLCBzaGlmdCkge1xuICAgICAgY29uc3QgYml0ID0gKGxpbmUucHJlZml4Q29kZSA+PiBzaGlmdCkgJiAxO1xuICAgICAgaWYgKHNoaWZ0IDw9IDApIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbGVhZiBub2RlLlxuICAgICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBuZXcgSHVmZm1hblRyZWVOb2RlKGxpbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGludGVybWVkaWF0ZSBub2RlIGFuZCBjb250aW51ZSByZWN1cnNpdmVseS5cbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW2JpdF07XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuYnVpbGRUcmVlKGxpbmUsIHNoaWZ0IC0gMSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWNvZGVOb2RlKHJlYWRlcikge1xuICAgICAgaWYgKHRoaXMuaXNMZWFmKSB7XG4gICAgICAgIGlmICh0aGlzLmlzT09CKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHRPZmZzZXQgPSByZWFkZXIucmVhZEJpdHModGhpcy5yYW5nZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlTG93ICsgKHRoaXMuaXNMb3dlclJhbmdlID8gLWh0T2Zmc2V0IDogaHRPZmZzZXQpO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY2hpbGRyZW5bcmVhZGVyLnJlYWRCaXQoKV07XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIEh1ZmZtYW4gZGF0YVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLmRlY29kZU5vZGUocmVhZGVyKTtcbiAgICB9LFxuICB9O1xuXG4gIGZ1bmN0aW9uIEh1ZmZtYW5UYWJsZShsaW5lcywgcHJlZml4Q29kZXNEb25lKSB7XG4gICAgaWYgKCFwcmVmaXhDb2Rlc0RvbmUpIHtcbiAgICAgIHRoaXMuYXNzaWduUHJlZml4Q29kZXMobGluZXMpO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgSHVmZm1hbiB0cmVlLlxuICAgIHRoaXMucm9vdE5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yb290Tm9kZS5idWlsZFRyZWUobGluZSwgbGluZS5wcmVmaXhMZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBIdWZmbWFuVGFibGUucHJvdG90eXBlID0ge1xuICAgIGRlY29kZShyZWFkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTtcbiAgICB9LFxuICAgIGFzc2lnblByZWZpeENvZGVzKGxpbmVzKSB7XG4gICAgICAvLyBBbm5leCBCLjMgQXNzaWduaW5nIHRoZSBwcmVmaXggY29kZXMuXG4gICAgICBjb25zdCBsaW5lc0xlbmd0aCA9IGxpbmVzLmxlbmd0aDtcbiAgICAgIGxldCBwcmVmaXhMZW5ndGhNYXggPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByZWZpeExlbmd0aE1heCA9IE1hdGgubWF4KHByZWZpeExlbmd0aE1heCwgbGluZXNbaV0ucHJlZml4TGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGlzdG9ncmFtID0gbmV3IFVpbnQzMkFycmF5KHByZWZpeExlbmd0aE1heCArIDEpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhpc3RvZ3JhbVtsaW5lc1tpXS5wcmVmaXhMZW5ndGhdKys7XG4gICAgICB9XG4gICAgICBsZXQgY3VycmVudExlbmd0aCA9IDEsXG4gICAgICAgIGZpcnN0Q29kZSA9IDAsXG4gICAgICAgIGN1cnJlbnRDb2RlLFxuICAgICAgICBjdXJyZW50VGVtcCxcbiAgICAgICAgbGluZTtcbiAgICAgIGhpc3RvZ3JhbVswXSA9IDA7XG5cbiAgICAgIHdoaWxlIChjdXJyZW50TGVuZ3RoIDw9IHByZWZpeExlbmd0aE1heCkge1xuICAgICAgICBmaXJzdENvZGUgPSAoZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSkgPDwgMTtcbiAgICAgICAgY3VycmVudENvZGUgPSBmaXJzdENvZGU7XG4gICAgICAgIGN1cnJlbnRUZW1wID0gMDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRUZW1wIDwgbGluZXNMZW5ndGgpIHtcbiAgICAgICAgICBsaW5lID0gbGluZXNbY3VycmVudFRlbXBdO1xuICAgICAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA9PT0gY3VycmVudExlbmd0aCkge1xuICAgICAgICAgICAgbGluZS5wcmVmaXhDb2RlID0gY3VycmVudENvZGU7XG4gICAgICAgICAgICBjdXJyZW50Q29kZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50VGVtcCsrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRMZW5ndGgrKztcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGZ1bmN0aW9uIGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIC8vIERlY29kZXMgYSBUYWJsZXMgc2VnbWVudCwgaS5lLiwgYSBjdXN0b20gSHVmZm1hbiB0YWJsZS5cbiAgICAvLyBBbm5leCBCLjIgQ29kZSB0YWJsZSBzdHJ1Y3R1cmUuXG4gICAgY29uc3QgZmxhZ3MgPSBkYXRhW3N0YXJ0XTtcbiAgICBjb25zdCBsb3dlc3RWYWx1ZSA9IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxKSAmIDB4ZmZmZmZmZmY7XG4gICAgY29uc3QgaGlnaGVzdFZhbHVlID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDUpICYgMHhmZmZmZmZmZjtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0ICsgOSwgZW5kKTtcblxuICAgIGNvbnN0IHByZWZpeFNpemVCaXRzID0gKChmbGFncyA+PiAxKSAmIDcpICsgMTtcbiAgICBjb25zdCByYW5nZVNpemVCaXRzID0gKChmbGFncyA+PiA0KSAmIDcpICsgMTtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGxldCBwcmVmaXhMZW5ndGgsXG4gICAgICByYW5nZUxlbmd0aCxcbiAgICAgIGN1cnJlbnRSYW5nZUxvdyA9IGxvd2VzdFZhbHVlO1xuXG4gICAgLy8gTm9ybWFsIHRhYmxlIGxpbmVzXG4gICAgZG8ge1xuICAgICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTtcbiAgICAgIHJhbmdlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHJhbmdlU2l6ZUJpdHMpO1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgbmV3IEh1ZmZtYW5MaW5lKFtjdXJyZW50UmFuZ2VMb3csIHByZWZpeExlbmd0aCwgcmFuZ2VMZW5ndGgsIDBdKVxuICAgICAgKTtcbiAgICAgIGN1cnJlbnRSYW5nZUxvdyArPSAxIDw8IHJhbmdlTGVuZ3RoO1xuICAgIH0gd2hpbGUgKGN1cnJlbnRSYW5nZUxvdyA8IGhpZ2hlc3RWYWx1ZSk7XG5cbiAgICAvLyBMb3dlciByYW5nZSB0YWJsZSBsaW5lXG4gICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgbmV3IEh1ZmZtYW5MaW5lKFtsb3dlc3RWYWx1ZSAtIDEsIHByZWZpeExlbmd0aCwgMzIsIDAsIFwibG93ZXJcIl0pXG4gICAgKTtcblxuICAgIC8vIFVwcGVyIHJhbmdlIHRhYmxlIGxpbmVcbiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpO1xuICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtoaWdoZXN0VmFsdWUsIHByZWZpeExlbmd0aCwgMzIsIDBdKSk7XG5cbiAgICBpZiAoZmxhZ3MgJiAxKSB7XG4gICAgICAvLyBPdXQtb2YtYmFuZCB0YWJsZSBsaW5lXG4gICAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpO1xuICAgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgZmFsc2UpO1xuICB9XG5cbiAgY29uc3Qgc3RhbmRhcmRUYWJsZXNDYWNoZSA9IHt9O1xuXG4gIGZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7XG4gICAgLy8gQW5uZXggQi41IFN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzLlxuICAgIGxldCB0YWJsZSA9IHN0YW5kYXJkVGFibGVzQ2FjaGVbbnVtYmVyXTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gICAgbGV0IGxpbmVzO1xuICAgIHN3aXRjaCAobnVtYmVyKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFswLCAxLCA0LCAweDBdLFxuICAgICAgICAgIFsxNiwgMiwgOCwgMHgyXSxcbiAgICAgICAgICBbMjcyLCAzLCAxNiwgMHg2XSxcbiAgICAgICAgICBbNjU4MDgsIDMsIDMyLCAweDddLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWzAsIDEsIDAsIDB4MF0sXG4gICAgICAgICAgWzEsIDIsIDAsIDB4Ml0sXG4gICAgICAgICAgWzIsIDMsIDAsIDB4Nl0sXG4gICAgICAgICAgWzMsIDQsIDMsIDB4ZV0sXG4gICAgICAgICAgWzExLCA1LCA2LCAweDFlXSxcbiAgICAgICAgICBbNzUsIDYsIDMyLCAweDNlXSwgLy8gdXBwZXJcbiAgICAgICAgICBbNiwgMHgzZl0sIC8vIE9PQlxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yNTYsIDgsIDgsIDB4ZmVdLFxuICAgICAgICAgIFswLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsxLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFsyLCAzLCAwLCAweDZdLFxuICAgICAgICAgIFszLCA0LCAzLCAweGVdLFxuICAgICAgICAgIFsxMSwgNSwgNiwgMHgxZV0sXG4gICAgICAgICAgWy0yNTcsIDgsIDMyLCAweGZmLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs3NSwgNywgMzIsIDB4N2VdLCAvLyB1cHBlclxuICAgICAgICAgIFs2LCAweDNlXSwgLy8gT09CXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbMSwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMiwgMiwgMCwgMHgyXSxcbiAgICAgICAgICBbMywgMywgMCwgMHg2XSxcbiAgICAgICAgICBbNCwgNCwgMywgMHhlXSxcbiAgICAgICAgICBbMTIsIDUsIDYsIDB4MWVdLFxuICAgICAgICAgIFs3NiwgNSwgMzIsIDB4MWZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yNTUsIDcsIDgsIDB4N2VdLFxuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFszLCAzLCAwLCAweDZdLFxuICAgICAgICAgIFs0LCA0LCAzLCAweGVdLFxuICAgICAgICAgIFsxMiwgNSwgNiwgMHgxZV0sXG4gICAgICAgICAgWy0yNTYsIDcsIDMyLCAweDdmLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs3NiwgNiwgMzIsIDB4M2VdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yMDQ4LCA1LCAxMCwgMHgxY10sXG4gICAgICAgICAgWy0xMDI0LCA0LCA5LCAweDhdLFxuICAgICAgICAgIFstNTEyLCA0LCA4LCAweDldLFxuICAgICAgICAgIFstMjU2LCA0LCA3LCAweGFdLFxuICAgICAgICAgIFstMTI4LCA1LCA2LCAweDFkXSxcbiAgICAgICAgICBbLTY0LCA1LCA1LCAweDFlXSxcbiAgICAgICAgICBbLTMyLCA0LCA1LCAweGJdLFxuICAgICAgICAgIFswLCAyLCA3LCAweDBdLFxuICAgICAgICAgIFsxMjgsIDMsIDcsIDB4Ml0sXG4gICAgICAgICAgWzI1NiwgMywgOCwgMHgzXSxcbiAgICAgICAgICBbNTEyLCA0LCA5LCAweGNdLFxuICAgICAgICAgIFsxMDI0LCA0LCAxMCwgMHhkXSxcbiAgICAgICAgICBbLTIwNDksIDYsIDMyLCAweDNlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFsyMDQ4LCA2LCAzMiwgMHgzZl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA3OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTEwMjQsIDQsIDksIDB4OF0sXG4gICAgICAgICAgWy01MTIsIDMsIDgsIDB4MF0sXG4gICAgICAgICAgWy0yNTYsIDQsIDcsIDB4OV0sXG4gICAgICAgICAgWy0xMjgsIDUsIDYsIDB4MWFdLFxuICAgICAgICAgIFstNjQsIDUsIDUsIDB4MWJdLFxuICAgICAgICAgIFstMzIsIDQsIDUsIDB4YV0sXG4gICAgICAgICAgWzAsIDQsIDUsIDB4Yl0sXG4gICAgICAgICAgWzMyLCA1LCA1LCAweDFjXSxcbiAgICAgICAgICBbNjQsIDUsIDYsIDB4MWRdLFxuICAgICAgICAgIFsxMjgsIDQsIDcsIDB4Y10sXG4gICAgICAgICAgWzI1NiwgMywgOCwgMHgxXSxcbiAgICAgICAgICBbNTEyLCAzLCA5LCAweDJdLFxuICAgICAgICAgIFsxMDI0LCAzLCAxMCwgMHgzXSxcbiAgICAgICAgICBbLTEwMjUsIDUsIDMyLCAweDFlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFsyMDQ4LCA1LCAzMiwgMHgxZl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTE1LCA4LCAzLCAweGZjXSxcbiAgICAgICAgICBbLTcsIDksIDEsIDB4MWZjXSxcbiAgICAgICAgICBbLTUsIDgsIDEsIDB4ZmRdLFxuICAgICAgICAgIFstMywgOSwgMCwgMHgxZmRdLFxuICAgICAgICAgIFstMiwgNywgMCwgMHg3Y10sXG4gICAgICAgICAgWy0xLCA0LCAwLCAweGFdLFxuICAgICAgICAgIFswLCAyLCAxLCAweDBdLFxuICAgICAgICAgIFsyLCA1LCAwLCAweDFhXSxcbiAgICAgICAgICBbMywgNiwgMCwgMHgzYV0sXG4gICAgICAgICAgWzQsIDMsIDQsIDB4NF0sXG4gICAgICAgICAgWzIwLCA2LCAxLCAweDNiXSxcbiAgICAgICAgICBbMjIsIDQsIDQsIDB4Yl0sXG4gICAgICAgICAgWzM4LCA0LCA1LCAweGNdLFxuICAgICAgICAgIFs3MCwgNSwgNiwgMHgxYl0sXG4gICAgICAgICAgWzEzNCwgNSwgNywgMHgxY10sXG4gICAgICAgICAgWzI2MiwgNiwgNywgMHgzY10sXG4gICAgICAgICAgWzM5MCwgNywgOCwgMHg3ZF0sXG4gICAgICAgICAgWzY0NiwgNiwgMTAsIDB4M2RdLFxuICAgICAgICAgIFstMTYsIDksIDMyLCAweDFmZSwgXCJsb3dlclwiXSxcbiAgICAgICAgICBbMTY3MCwgOSwgMzIsIDB4MWZmXSwgLy8gdXBwZXJcbiAgICAgICAgICBbMiwgMHgxXSwgLy8gT09CXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTMxLCA4LCA0LCAweGZjXSxcbiAgICAgICAgICBbLTE1LCA5LCAyLCAweDFmY10sXG4gICAgICAgICAgWy0xMSwgOCwgMiwgMHhmZF0sXG4gICAgICAgICAgWy03LCA5LCAxLCAweDFmZF0sXG4gICAgICAgICAgWy01LCA3LCAxLCAweDdjXSxcbiAgICAgICAgICBbLTMsIDQsIDEsIDB4YV0sXG4gICAgICAgICAgWy0xLCAzLCAxLCAweDJdLFxuICAgICAgICAgIFsxLCAzLCAxLCAweDNdLFxuICAgICAgICAgIFszLCA1LCAxLCAweDFhXSxcbiAgICAgICAgICBbNSwgNiwgMSwgMHgzYV0sXG4gICAgICAgICAgWzcsIDMsIDUsIDB4NF0sXG4gICAgICAgICAgWzM5LCA2LCAyLCAweDNiXSxcbiAgICAgICAgICBbNDMsIDQsIDUsIDB4Yl0sXG4gICAgICAgICAgWzc1LCA0LCA2LCAweGNdLFxuICAgICAgICAgIFsxMzksIDUsIDcsIDB4MWJdLFxuICAgICAgICAgIFsyNjcsIDUsIDgsIDB4MWNdLFxuICAgICAgICAgIFs1MjMsIDYsIDgsIDB4M2NdLFxuICAgICAgICAgIFs3NzksIDcsIDksIDB4N2RdLFxuICAgICAgICAgIFsxMjkxLCA2LCAxMSwgMHgzZF0sXG4gICAgICAgICAgWy0zMiwgOSwgMzIsIDB4MWZlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFszMzM5LCA5LCAzMiwgMHgxZmZdLCAvLyB1cHBlclxuICAgICAgICAgIFsyLCAweDBdLCAvLyBPT0JcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTIxLCA3LCA0LCAweDdhXSxcbiAgICAgICAgICBbLTUsIDgsIDAsIDB4ZmNdLFxuICAgICAgICAgIFstNCwgNywgMCwgMHg3Yl0sXG4gICAgICAgICAgWy0zLCA1LCAwLCAweDE4XSxcbiAgICAgICAgICBbLTIsIDIsIDIsIDB4MF0sXG4gICAgICAgICAgWzIsIDUsIDAsIDB4MTldLFxuICAgICAgICAgIFszLCA2LCAwLCAweDM2XSxcbiAgICAgICAgICBbNCwgNywgMCwgMHg3Y10sXG4gICAgICAgICAgWzUsIDgsIDAsIDB4ZmRdLFxuICAgICAgICAgIFs2LCAyLCA2LCAweDFdLFxuICAgICAgICAgIFs3MCwgNSwgNSwgMHgxYV0sXG4gICAgICAgICAgWzEwMiwgNiwgNSwgMHgzN10sXG4gICAgICAgICAgWzEzNCwgNiwgNiwgMHgzOF0sXG4gICAgICAgICAgWzE5OCwgNiwgNywgMHgzOV0sXG4gICAgICAgICAgWzMyNiwgNiwgOCwgMHgzYV0sXG4gICAgICAgICAgWzU4MiwgNiwgOSwgMHgzYl0sXG4gICAgICAgICAgWzEwOTQsIDYsIDEwLCAweDNjXSxcbiAgICAgICAgICBbMjExOCwgNywgMTEsIDB4N2RdLFxuICAgICAgICAgIFstMjIsIDgsIDMyLCAweGZlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs0MTY2LCA4LCAzMiwgMHhmZl0sIC8vIHVwcGVyXG4gICAgICAgICAgWzIsIDB4Ml0sIC8vIE9PQlxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAxLCAweDJdLFxuICAgICAgICAgIFs0LCA0LCAwLCAweGNdLFxuICAgICAgICAgIFs1LCA0LCAxLCAweGRdLFxuICAgICAgICAgIFs3LCA1LCAxLCAweDFjXSxcbiAgICAgICAgICBbOSwgNSwgMiwgMHgxZF0sXG4gICAgICAgICAgWzEzLCA2LCAyLCAweDNjXSxcbiAgICAgICAgICBbMTcsIDcsIDIsIDB4N2FdLFxuICAgICAgICAgIFsyMSwgNywgMywgMHg3Yl0sXG4gICAgICAgICAgWzI5LCA3LCA0LCAweDdjXSxcbiAgICAgICAgICBbNDUsIDcsIDUsIDB4N2RdLFxuICAgICAgICAgIFs3NywgNywgNiwgMHg3ZV0sXG4gICAgICAgICAgWzE0MSwgNywgMzIsIDB4N2ZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFszLCAzLCAxLCAweDZdLFxuICAgICAgICAgIFs1LCA1LCAwLCAweDFjXSxcbiAgICAgICAgICBbNiwgNSwgMSwgMHgxZF0sXG4gICAgICAgICAgWzgsIDYsIDEsIDB4M2NdLFxuICAgICAgICAgIFsxMCwgNywgMCwgMHg3YV0sXG4gICAgICAgICAgWzExLCA3LCAxLCAweDdiXSxcbiAgICAgICAgICBbMTMsIDcsIDIsIDB4N2NdLFxuICAgICAgICAgIFsxNywgNywgMywgMHg3ZF0sXG4gICAgICAgICAgWzI1LCA3LCA0LCAweDdlXSxcbiAgICAgICAgICBbNDEsIDgsIDUsIDB4ZmVdLFxuICAgICAgICAgIFs3MywgOCwgMzIsIDB4ZmZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAzLCAwLCAweDRdLFxuICAgICAgICAgIFszLCA0LCAwLCAweGNdLFxuICAgICAgICAgIFs0LCA1LCAwLCAweDFjXSxcbiAgICAgICAgICBbNSwgNCwgMSwgMHhkXSxcbiAgICAgICAgICBbNywgMywgMywgMHg1XSxcbiAgICAgICAgICBbMTUsIDYsIDEsIDB4M2FdLFxuICAgICAgICAgIFsxNywgNiwgMiwgMHgzYl0sXG4gICAgICAgICAgWzIxLCA2LCAzLCAweDNjXSxcbiAgICAgICAgICBbMjksIDYsIDQsIDB4M2RdLFxuICAgICAgICAgIFs0NSwgNiwgNSwgMHgzZV0sXG4gICAgICAgICAgWzc3LCA3LCA2LCAweDdlXSxcbiAgICAgICAgICBbMTQxLCA3LCAzMiwgMHg3Zl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNDpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yLCAzLCAwLCAweDRdLFxuICAgICAgICAgIFstMSwgMywgMCwgMHg1XSxcbiAgICAgICAgICBbMCwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMSwgMywgMCwgMHg2XSxcbiAgICAgICAgICBbMiwgMywgMCwgMHg3XSxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE1OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTI0LCA3LCA0LCAweDdjXSxcbiAgICAgICAgICBbLTgsIDYsIDIsIDB4M2NdLFxuICAgICAgICAgIFstNCwgNSwgMSwgMHgxY10sXG4gICAgICAgICAgWy0yLCA0LCAwLCAweGNdLFxuICAgICAgICAgIFstMSwgMywgMCwgMHg0XSxcbiAgICAgICAgICBbMCwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMSwgMywgMCwgMHg1XSxcbiAgICAgICAgICBbMiwgNCwgMCwgMHhkXSxcbiAgICAgICAgICBbMywgNSwgMSwgMHgxZF0sXG4gICAgICAgICAgWzUsIDYsIDIsIDB4M2RdLFxuICAgICAgICAgIFs5LCA3LCA0LCAweDdkXSxcbiAgICAgICAgICBbLTI1LCA3LCAzMiwgMHg3ZSwgXCJsb3dlclwiXSxcbiAgICAgICAgICBbMjUsIDcsIDMyLCAweDdmXSwgLy8gdXBwZXJcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBsaW5lc1tpXSA9IG5ldyBIdWZmbWFuTGluZShsaW5lc1tpXSk7XG4gICAgfVxuICAgIHRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgdHJ1ZSk7XG4gICAgc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdID0gdGFibGU7XG4gICAgcmV0dXJuIHRhYmxlO1xuICB9XG5cbiAgZnVuY3Rpb24gUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICB0aGlzLnBvc2l0aW9uID0gc3RhcnQ7XG4gICAgdGhpcy5zaGlmdCA9IC0xO1xuICAgIHRoaXMuY3VycmVudEJ5dGUgPSAwO1xuICB9XG5cbiAgUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICByZWFkQml0KCkge1xuICAgICAgaWYgKHRoaXMuc2hpZnQgPCAwKSB7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJlbmQgb2YgZGF0YSB3aGlsZSByZWFkaW5nIGJpdFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCeXRlID0gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107XG4gICAgICAgIHRoaXMuc2hpZnQgPSA3O1xuICAgICAgfVxuICAgICAgY29uc3QgYml0ID0gKHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCkgJiAxO1xuICAgICAgdGhpcy5zaGlmdC0tO1xuICAgICAgcmV0dXJuIGJpdDtcbiAgICB9LFxuXG4gICAgcmVhZEJpdHMobnVtQml0cykge1xuICAgICAgbGV0IHJlc3VsdCA9IDAsXG4gICAgICAgIGk7XG4gICAgICBmb3IgKGkgPSBudW1CaXRzIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgcmVzdWx0IHw9IHRoaXMucmVhZEJpdCgpIDw8IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBieXRlQWxpZ24oKSB7XG4gICAgICB0aGlzLnNoaWZ0ID0gLTE7XG4gICAgfSxcblxuICAgIG5leHQoKSB7XG4gICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSB0aGlzLmVuZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBnZXRDdXN0b21IdWZmbWFuVGFibGUoaW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcykge1xuICAgIC8vIFJldHVybnMgYSBUYWJsZXMgc2VnbWVudCB0aGF0IGhhcyBiZWVuIGVhcmxpZXIgZGVjb2RlZC5cbiAgICAvLyBTZWUgNy40LjIuMS42IChzeW1ib2wgZGljdGlvbmFyeSkgb3IgNy40LjMuMS42ICh0ZXh0IHJlZ2lvbikuXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmVmZXJyZWRUby5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IGN1c3RvbVRhYmxlc1tyZWZlcnJlZFRvW2ldXTtcbiAgICAgIGlmICh0YWJsZSkge1xuICAgICAgICBpZiAoaW5kZXggPT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0YWJsZTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJjYW4ndCBmaW5kIGN1c3RvbSBIdWZmbWFuIHRhYmxlXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMoXG4gICAgdGV4dFJlZ2lvbixcbiAgICByZWZlcnJlZFRvLFxuICAgIGN1c3RvbVRhYmxlcyxcbiAgICBudW1iZXJPZlN5bWJvbHMsXG4gICAgcmVhZGVyXG4gICkge1xuICAgIC8vIDcuNC4zLjEuNyBTeW1ib2wgSUQgSHVmZm1hbiB0YWJsZSBkZWNvZGluZ1xuXG4gICAgLy8gUmVhZCBjb2RlIGxlbmd0aHMgZm9yIFJVTkNPREVzIDAuLi4zNC5cbiAgICBjb25zdCBjb2RlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDM0OyBpKyspIHtcbiAgICAgIGNvbnN0IGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7XG4gICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTtcbiAgICB9XG4gICAgLy8gQXNzaWduIEh1ZmZtYW4gY29kZXMgZm9yIFJVTkNPREVzLlxuICAgIGNvbnN0IHJ1bkNvZGVzVGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGNvZGVzLCBmYWxzZSk7XG5cbiAgICAvLyBSZWFkIGEgSHVmZm1hbiBjb2RlIHVzaW5nIHRoZSBhc3NpZ25tZW50IGFib3ZlLlxuICAgIC8vIEludGVycHJldCB0aGUgUlVOQ09ERSBjb2RlcyBhbmQgdGhlIGFkZGl0aW9uYWwgYml0cyAoaWYgYW55KS5cbiAgICBjb2Rlcy5sZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZTeW1ib2xzOyApIHtcbiAgICAgIGNvbnN0IGNvZGVMZW5ndGggPSBydW5Db2Rlc1RhYmxlLmRlY29kZShyZWFkZXIpO1xuICAgICAgaWYgKGNvZGVMZW5ndGggPj0gMzIpIHtcbiAgICAgICAgbGV0IHJlcGVhdGVkTGVuZ3RoLCBudW1iZXJPZlJlcGVhdHMsIGo7XG4gICAgICAgIHN3aXRjaCAoY29kZUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygyKSArIDM7XG4gICAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IGNvZGVzW2kgLSAxXS5wcmVmaXhMZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMztcbiAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTtcbiAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgY29kZSBsZW5ndGggaW4gc3ltYm9sIElEIHRhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZlJlcGVhdHM7IGorKykge1xuICAgICAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCByZXBlYXRlZExlbmd0aCwgMCwgMF0pKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCBjb2RlTGVuZ3RoLCAwLCAwXSkpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJlYWRlci5ieXRlQWxpZ24oKTtcbiAgICBjb25zdCBzeW1ib2xJRFRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShjb2RlcywgZmFsc2UpO1xuXG4gICAgLy8gNy40LjMuMS42IFRleHQgcmVnaW9uIHNlZ21lbnQgSHVmZm1hbiB0YWJsZSBzZWxlY3Rpb25cblxuICAgIGxldCBjdXN0b21JbmRleCA9IDAsXG4gICAgICB0YWJsZUZpcnN0UyxcbiAgICAgIHRhYmxlRGVsdGFTLFxuICAgICAgdGFibGVEZWx0YVQ7XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkZTKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRhYmxlRmlyc3RTID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5GUyArIDYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVGaXJzdFMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoXG4gICAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgICBjdXN0b21UYWJsZXNcbiAgICAgICAgKTtcbiAgICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgSHVmZm1hbiBGUyBzZWxlY3RvclwiKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkRTKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRhYmxlRGVsdGFTID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5EUyArIDgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVEZWx0YVMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoXG4gICAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgICBjdXN0b21UYWJsZXNcbiAgICAgICAgKTtcbiAgICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgSHVmZm1hbiBEUyBzZWxlY3RvclwiKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkRUKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5EVCArIDExKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICAgIGN1c3RvbUluZGV4LFxuICAgICAgICAgIHJlZmVycmVkVG8sXG4gICAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICAgICk7XG4gICAgICAgIGN1c3RvbUluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIEh1ZmZtYW4gRFQgc2VsZWN0b3JcIik7XG4gICAgfVxuXG4gICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCkge1xuICAgICAgLy8gTG9hZCB0YWJsZXMgUkRXLCBSREgsIFJEWCBhbmQgUkRZLlxuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzeW1ib2xJRFRhYmxlLFxuICAgICAgdGFibGVGaXJzdFMsXG4gICAgICB0YWJsZURlbHRhUyxcbiAgICAgIHRhYmxlRGVsdGFULFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhcbiAgICBkaWN0aW9uYXJ5LFxuICAgIHJlZmVycmVkVG8sXG4gICAgY3VzdG9tVGFibGVzXG4gICkge1xuICAgIC8vIDcuNC4yLjEuNiBTeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IEh1ZmZtYW4gdGFibGUgc2VsZWN0aW9uXG5cbiAgICBsZXQgY3VzdG9tSW5kZXggPSAwLFxuICAgICAgdGFibGVEZWx0YUhlaWdodCxcbiAgICAgIHRhYmxlRGVsdGFXaWR0aDtcbiAgICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldFN0YW5kYXJkVGFibGUoZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciArIDQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgICApO1xuICAgICAgICBjdXN0b21JbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBIdWZmbWFuIERIIHNlbGVjdG9yXCIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3Rvcikge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IgKyAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgICApO1xuICAgICAgICBjdXN0b21JbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBIdWZmbWFuIERXIHNlbGVjdG9yXCIpO1xuICAgIH1cblxuICAgIGxldCB0YWJsZUJpdG1hcFNpemUsIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzO1xuICAgIGlmIChkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3Rvcikge1xuICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICApO1xuICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTtcbiAgICB9XG5cbiAgICBpZiAoZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yKSB7XG4gICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgIHJlZmVycmVkVG8sXG4gICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMgPSBnZXRTdGFuZGFyZFRhYmxlKDEpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZURlbHRhSGVpZ2h0LFxuICAgICAgdGFibGVEZWx0YVdpZHRoLFxuICAgICAgdGFibGVCaXRtYXBTaXplLFxuICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRVbmNvbXByZXNzZWRCaXRtYXAocmVhZGVyLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgYml0bWFwID0gW107XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpO1xuICAgICAgfVxuICAgICAgcmVhZGVyLmJ5dGVBbGlnbigpO1xuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlTU1SQml0bWFwKGlucHV0LCB3aWR0aCwgaGVpZ2h0LCBlbmRPZkJsb2NrKSB7XG4gICAgLy8gTU1SIGlzIHRoZSBzYW1lIGNvbXByZXNzaW9uIGFsZ29yaXRobSBhcyB0aGUgUERGIGZpbHRlclxuICAgIC8vIENDSVRURmF4RGVjb2RlIHdpdGggL0sgLTEuXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgSzogLTEsXG4gICAgICBDb2x1bW5zOiB3aWR0aCxcbiAgICAgIFJvd3M6IGhlaWdodCxcbiAgICAgIEJsYWNrSXMxOiB0cnVlLFxuICAgICAgRW5kT2ZCbG9jazogZW5kT2ZCbG9jayxcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKGlucHV0LCBwYXJhbXMpO1xuICAgIGNvbnN0IGJpdG1hcCA9IFtdO1xuICAgIGxldCBjdXJyZW50Qnl0ZSxcbiAgICAgIGVvZiA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGxldCBzaGlmdCA9IC0xO1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIGlmIChzaGlmdCA8IDApIHtcbiAgICAgICAgICBjdXJyZW50Qnl0ZSA9IGRlY29kZXIucmVhZE5leHRDaGFyKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRCeXRlID09PSAtMSkge1xuICAgICAgICAgICAgLy8gU2V0IHRoZSByZXN0IG9mIHRoZSBiaXRzIHRvIHplcm8uXG4gICAgICAgICAgICBjdXJyZW50Qnl0ZSA9IDA7XG4gICAgICAgICAgICBlb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGlmdCA9IDc7XG4gICAgICAgIH1cbiAgICAgICAgcm93W3hdID0gKGN1cnJlbnRCeXRlID4+IHNoaWZ0KSAmIDE7XG4gICAgICAgIHNoaWZ0LS07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVuZE9mQmxvY2sgJiYgIWVvZikge1xuICAgICAgLy8gUmVhZCB1bnRpbCBFT0ZCIGhhcyBiZWVuIGNvbnN1bWVkLlxuICAgICAgY29uc3QgbG9va0ZvckVPRkxpbWl0ID0gNTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va0ZvckVPRkxpbWl0OyBpKyspIHtcbiAgICAgICAgaWYgKGRlY29kZXIucmVhZE5leHRDaGFyKCkgPT09IC0xKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBKYmlnMkltYWdlKCkge31cblxuICBKYmlnMkltYWdlLnByb3RvdHlwZSA9IHtcbiAgICBwYXJzZUNodW5rcyhjaHVua3MpIHtcbiAgICAgIHJldHVybiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcyk7XG4gICAgfSxcblxuICAgIHBhcnNlKGRhdGEpIHtcbiAgICAgIGNvbnN0IHsgaW1nRGF0YSwgd2lkdGgsIGhlaWdodCB9ID0gcGFyc2VKYmlnMihkYXRhKTtcbiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgcmV0dXJuIGltZ0RhdGE7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gSmJpZzJJbWFnZTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpiaWcySW1hZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuLy8gVGFibGUgQy0yXG5jb25zdCBRZVRhYmxlID0gW1xuICB7IHFlOiAweDU2MDEsIG5tcHM6IDEsIG5scHM6IDEsIHN3aXRjaEZsYWc6IDEgfSxcbiAgeyBxZTogMHgzNDAxLCBubXBzOiAyLCBubHBzOiA2LCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4MTgwMSwgbm1wczogMywgbmxwczogOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDBhYzEsIG5tcHM6IDQsIG5scHM6IDEyLCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4MDUyMSwgbm1wczogNSwgbmxwczogMjksIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMjIxLCBubXBzOiAzOCwgbmxwczogMzMsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg1NjAxLCBubXBzOiA3LCBubHBzOiA2LCBzd2l0Y2hGbGFnOiAxIH0sXG4gIHsgcWU6IDB4NTQwMSwgbm1wczogOCwgbmxwczogMTQsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg0ODAxLCBubXBzOiA5LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM4MDEsIG5tcHM6IDEwLCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDMwMDEsIG5tcHM6IDExLCBubHBzOiAxNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI0MDEsIG5tcHM6IDEyLCBubHBzOiAxOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDFjMDEsIG5tcHM6IDEzLCBubHBzOiAyMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE2MDEsIG5tcHM6IDI5LCBubHBzOiAyMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDU2MDEsIG5tcHM6IDE1LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMSB9LFxuICB7IHFlOiAweDU0MDEsIG5tcHM6IDE2LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDUxMDEsIG5tcHM6IDE3LCBubHBzOiAxNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDQ4MDEsIG5tcHM6IDE4LCBubHBzOiAxNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM4MDEsIG5tcHM6IDE5LCBubHBzOiAxNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM0MDEsIG5tcHM6IDIwLCBubHBzOiAxOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDMwMDEsIG5tcHM6IDIxLCBubHBzOiAxOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI4MDEsIG5tcHM6IDIyLCBubHBzOiAxOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI0MDEsIG5tcHM6IDIzLCBubHBzOiAyMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDIyMDEsIG5tcHM6IDI0LCBubHBzOiAyMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDFjMDEsIG5tcHM6IDI1LCBubHBzOiAyMiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE4MDEsIG5tcHM6IDI2LCBubHBzOiAyMywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE2MDEsIG5tcHM6IDI3LCBubHBzOiAyNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE0MDEsIG5tcHM6IDI4LCBubHBzOiAyNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDEyMDEsIG5tcHM6IDI5LCBubHBzOiAyNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDExMDEsIG5tcHM6IDMwLCBubHBzOiAyNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDBhYzEsIG5tcHM6IDMxLCBubHBzOiAyOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA5YzEsIG5tcHM6IDMyLCBubHBzOiAyOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA4YTEsIG5tcHM6IDMzLCBubHBzOiAzMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA1MjEsIG5tcHM6IDM0LCBubHBzOiAzMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA0NDEsIG5tcHM6IDM1LCBubHBzOiAzMiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAyYTEsIG5tcHM6IDM2LCBubHBzOiAzMywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAyMjEsIG5tcHM6IDM3LCBubHBzOiAzNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAxNDEsIG5tcHM6IDM4LCBubHBzOiAzNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAxMTEsIG5tcHM6IDM5LCBubHBzOiAzNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwODUsIG5tcHM6IDQwLCBubHBzOiAzNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwNDksIG5tcHM6IDQxLCBubHBzOiAzOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMjUsIG5tcHM6IDQyLCBubHBzOiAzOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMTUsIG5tcHM6IDQzLCBubHBzOiA0MCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDksIG5tcHM6IDQ0LCBubHBzOiA0MSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDUsIG5tcHM6IDQ1LCBubHBzOiA0Miwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDEsIG5tcHM6IDQ1LCBubHBzOiA0Mywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDU2MDEsIG5tcHM6IDQ2LCBubHBzOiA0Niwgc3dpdGNoRmxhZzogMCB9LFxuXTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFFNIENvZGVyIGRlY29kaW5nIGFzIGRlZmluZWQgaW5cbiAqICAgSlBFRyAyMDAwIFBhcnQgSSBGaW5hbCBDb21taXR0ZWUgRHJhZnQgVmVyc2lvbiAxLjBcbiAqICAgQW5uZXggQy4zIEFyaXRobWV0aWMgZGVjb2RpbmcgcHJvY2VkdXJlXG4gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qcGVnLm9yZy9wdWJsaWMvZmNkMTU0NDQtMS5wZGZcbiAqXG4gKiBUaGUgYXJpdGhtZXRpYyBkZWNvZGVyIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBjb250ZXh0IG1vZGVscyB0byBkZWNvZGVcbiAqIEpQRUcyMDAwIGFuZCBKQklHMiBzdHJlYW1zLlxuICovXG5jbGFzcyBBcml0aG1ldGljRGVjb2RlciB7XG4gIC8vIEMuMy41IEluaXRpYWxpc2F0aW9uIG9mIHRoZSBkZWNvZGVyIChJTklUREVDKVxuICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLmJwID0gc3RhcnQ7XG4gICAgdGhpcy5kYXRhRW5kID0gZW5kO1xuXG4gICAgdGhpcy5jaGlnaCA9IGRhdGFbc3RhcnRdO1xuICAgIHRoaXMuY2xvdyA9IDA7XG5cbiAgICB0aGlzLmJ5dGVJbigpO1xuXG4gICAgdGhpcy5jaGlnaCA9ICgodGhpcy5jaGlnaCA8PCA3KSAmIDB4ZmZmZikgfCAoKHRoaXMuY2xvdyA+PiA5KSAmIDB4N2YpO1xuICAgIHRoaXMuY2xvdyA9ICh0aGlzLmNsb3cgPDwgNykgJiAweGZmZmY7XG4gICAgdGhpcy5jdCAtPSA3O1xuICAgIHRoaXMuYSA9IDB4ODAwMDtcbiAgfVxuXG4gIC8vIEMuMy40IENvbXByZXNzZWQgZGF0YSBpbnB1dCAoQllURUlOKVxuICBieXRlSW4oKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBsZXQgYnAgPSB0aGlzLmJwO1xuXG4gICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7XG4gICAgICBpZiAoZGF0YVticCArIDFdID4gMHg4Zikge1xuICAgICAgICB0aGlzLmNsb3cgKz0gMHhmZjAwO1xuICAgICAgICB0aGlzLmN0ID0gODtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJwKys7XG4gICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5O1xuICAgICAgICB0aGlzLmN0ID0gNztcbiAgICAgICAgdGhpcy5icCA9IGJwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBicCsrO1xuICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDtcbiAgICAgIHRoaXMuY3QgPSA4O1xuICAgICAgdGhpcy5icCA9IGJwO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbG93ID4gMHhmZmZmKSB7XG4gICAgICB0aGlzLmNoaWdoICs9IHRoaXMuY2xvdyA+PiAxNjtcbiAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7XG4gICAgfVxuICB9XG5cbiAgLy8gQy4zLjIgRGVjb2RpbmcgYSBkZWNpc2lvbiAoREVDT0RFKVxuICByZWFkQml0KGNvbnRleHRzLCBwb3MpIHtcbiAgICAvLyBDb250ZXh0cyBhcmUgcGFja2VkIGludG8gMSBieXRlOlxuICAgIC8vIGhpZ2hlc3QgNyBiaXRzIGNhcnJ5IGN4LmluZGV4LCBsb3dlc3QgYml0IGNhcnJpZXMgY3gubXBzXG4gICAgbGV0IGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLFxuICAgICAgY3hfbXBzID0gY29udGV4dHNbcG9zXSAmIDE7XG4gICAgY29uc3QgcWVUYWJsZUljeCA9IFFlVGFibGVbY3hfaW5kZXhdO1xuICAgIGNvbnN0IHFlSWN4ID0gcWVUYWJsZUljeC5xZTtcbiAgICBsZXQgZDtcbiAgICBsZXQgYSA9IHRoaXMuYSAtIHFlSWN4O1xuXG4gICAgaWYgKHRoaXMuY2hpZ2ggPCBxZUljeCkge1xuICAgICAgLy8gZXhjaGFuZ2VMcHNcbiAgICAgIGlmIChhIDwgcWVJY3gpIHtcbiAgICAgICAgYSA9IHFlSWN4O1xuICAgICAgICBkID0gY3hfbXBzO1xuICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGEgPSBxZUljeDtcbiAgICAgICAgZCA9IDEgXiBjeF9tcHM7XG4gICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHtcbiAgICAgICAgICBjeF9tcHMgPSBkO1xuICAgICAgICB9XG4gICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoaWdoIC09IHFlSWN4O1xuICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkge1xuICAgICAgICB0aGlzLmEgPSBhO1xuICAgICAgICByZXR1cm4gY3hfbXBzO1xuICAgICAgfVxuICAgICAgLy8gZXhjaGFuZ2VNcHNcbiAgICAgIGlmIChhIDwgcWVJY3gpIHtcbiAgICAgICAgZCA9IDEgXiBjeF9tcHM7XG4gICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHtcbiAgICAgICAgICBjeF9tcHMgPSBkO1xuICAgICAgICB9XG4gICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZCA9IGN4X21wcztcbiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5tcHM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEMuMy4zIHJlbm9ybUQ7XG4gICAgZG8ge1xuICAgICAgaWYgKHRoaXMuY3QgPT09IDApIHtcbiAgICAgICAgdGhpcy5ieXRlSW4oKTtcbiAgICAgIH1cblxuICAgICAgYSA8PD0gMTtcbiAgICAgIHRoaXMuY2hpZ2ggPSAoKHRoaXMuY2hpZ2ggPDwgMSkgJiAweGZmZmYpIHwgKCh0aGlzLmNsb3cgPj4gMTUpICYgMSk7XG4gICAgICB0aGlzLmNsb3cgPSAodGhpcy5jbG93IDw8IDEpICYgMHhmZmZmO1xuICAgICAgdGhpcy5jdC0tO1xuICAgIH0gd2hpbGUgKChhICYgMHg4MDAwKSA9PT0gMCk7XG4gICAgdGhpcy5hID0gYTtcblxuICAgIGNvbnRleHRzW3Bvc10gPSAoY3hfaW5kZXggPDwgMSkgfCBjeF9tcHM7XG4gICAgcmV0dXJuIGQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgQXJpdGhtZXRpY0RlY29kZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBEZWNvZGVTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcbmltcG9ydCB7IGlzRGljdCB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IEpwZWdJbWFnZSB9IGZyb20gXCIuL2pwZy5qc1wiO1xuaW1wb3J0IHsgc2hhZG93IH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbi8qKlxuICogRm9yIEpQRUcncyB3ZSB1c2UgYSBsaWJyYXJ5IHRvIGRlY29kZSB0aGVzZSBpbWFnZXMgYW5kIHRoZSBzdHJlYW0gYmVoYXZlc1xuICogbGlrZSBhbGwgdGhlIG90aGVyIERlY29kZVN0cmVhbXMuXG4gKi9cbmNvbnN0IEpwZWdTdHJlYW0gPSAoZnVuY3Rpb24gSnBlZ1N0cmVhbUNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gSnBlZ1N0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBkaWN0LCBwYXJhbXMpIHtcbiAgICAvLyBTb21lIGltYWdlcyBtYXkgY29udGFpbiAnanVuaycgYmVmb3JlIHRoZSBTT0kgKHN0YXJ0LW9mLWltYWdlKSBtYXJrZXIuXG4gICAgLy8gTm90ZTogdGhpcyBzZWVtcyB0byBtYWlubHkgYWZmZWN0IGlubGluZSBpbWFnZXMuXG4gICAgbGV0IGNoO1xuICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHtcbiAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIFNPSSBtYXJrZXIgKDB4RkZEOCkuXG4gICAgICBpZiAoY2ggPT09IDB4ZmYpIHtcbiAgICAgICAgc3RyZWFtLnNraXAoLTEpOyAvLyBSZXNldCB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIHRoZSBTT0kuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7XG4gICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblxuICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTtcbiAgfVxuXG4gIEpwZWdTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSnBlZ1N0cmVhbS5wcm90b3R5cGUsIFwiYnl0ZXNcIiwge1xuICAgIGdldDogZnVuY3Rpb24gSnBlZ1N0cmVhbV9ieXRlcygpIHtcbiAgICAgIC8vIElmIGB0aGlzLm1heWJlTGVuZ3RoYCBpcyBudWxsLCB3ZSdsbCBnZXQgdGhlIGVudGlyZSBzdHJlYW0uXG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiYnl0ZXNcIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpO1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcblxuICBKcGVnU3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7XG4gICAgLy8gTm8tb3AsIHNpbmNlIGB0aGlzLnJlYWRCbG9ja2Agd2lsbCBhbHdheXMgcGFyc2UgdGhlIGVudGlyZSBpbWFnZSBhbmRcbiAgICAvLyBkaXJlY3RseSBpbnNlcnQgYWxsIG9mIGl0cyBkYXRhIGludG8gYHRoaXMuYnVmZmVyYC5cbiAgfTtcblxuICBKcGVnU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGpwZWdPcHRpb25zID0ge1xuICAgICAgZGVjb2RlVHJhbnNmb3JtOiB1bmRlZmluZWQsXG4gICAgICBjb2xvclRyYW5zZm9ybTogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICAvLyBDaGVja2luZyBpZiB2YWx1ZXMgbmVlZCB0byBiZSB0cmFuc2Zvcm1lZCBiZWZvcmUgY29udmVyc2lvbi5cbiAgICBjb25zdCBkZWNvZGVBcnIgPSB0aGlzLmRpY3QuZ2V0QXJyYXkoXCJEZWNvZGVcIiwgXCJEXCIpO1xuICAgIGlmICh0aGlzLmZvcmNlUkdCICYmIEFycmF5LmlzQXJyYXkoZGVjb2RlQXJyKSkge1xuICAgICAgY29uc3QgYml0c1BlckNvbXBvbmVudCA9IHRoaXMuZGljdC5nZXQoXCJCaXRzUGVyQ29tcG9uZW50XCIpIHx8IDg7XG4gICAgICBjb25zdCBkZWNvZGVBcnJMZW5ndGggPSBkZWNvZGVBcnIubGVuZ3RoO1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEludDMyQXJyYXkoZGVjb2RlQXJyTGVuZ3RoKTtcbiAgICAgIGxldCB0cmFuc2Zvcm1OZWVkZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG1heFZhbHVlID0gKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVBcnJMZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB0cmFuc2Zvcm1baV0gPSAoKGRlY29kZUFycltpICsgMV0gLSBkZWNvZGVBcnJbaV0pICogMjU2KSB8IDA7XG4gICAgICAgIHRyYW5zZm9ybVtpICsgMV0gPSAoZGVjb2RlQXJyW2ldICogbWF4VmFsdWUpIHwgMDtcbiAgICAgICAgaWYgKHRyYW5zZm9ybVtpXSAhPT0gMjU2IHx8IHRyYW5zZm9ybVtpICsgMV0gIT09IDApIHtcbiAgICAgICAgICB0cmFuc2Zvcm1OZWVkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNmb3JtTmVlZGVkKSB7XG4gICAgICAgIGpwZWdPcHRpb25zLmRlY29kZVRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRmV0Y2hpbmcgdGhlICdDb2xvclRyYW5zZm9ybScgZW50cnksIGlmIGl0IGV4aXN0cy5cbiAgICBpZiAoaXNEaWN0KHRoaXMucGFyYW1zKSkge1xuICAgICAgY29uc3QgY29sb3JUcmFuc2Zvcm0gPSB0aGlzLnBhcmFtcy5nZXQoXCJDb2xvclRyYW5zZm9ybVwiKTtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGNvbG9yVHJhbnNmb3JtKSkge1xuICAgICAgICBqcGVnT3B0aW9ucy5jb2xvclRyYW5zZm9ybSA9IGNvbG9yVHJhbnNmb3JtO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBqcGVnSW1hZ2UgPSBuZXcgSnBlZ0ltYWdlKGpwZWdPcHRpb25zKTtcblxuICAgIGpwZWdJbWFnZS5wYXJzZSh0aGlzLmJ5dGVzKTtcbiAgICBjb25zdCBkYXRhID0ganBlZ0ltYWdlLmdldERhdGEoe1xuICAgICAgd2lkdGg6IHRoaXMuZHJhd1dpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmRyYXdIZWlnaHQsXG4gICAgICBmb3JjZVJHQjogdGhpcy5mb3JjZVJHQixcbiAgICAgIGlzU291cmNlUERGOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgfTtcblxuICByZXR1cm4gSnBlZ1N0cmVhbTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpwZWdTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGFzc2VydCwgQmFzZUV4Y2VwdGlvbiwgd2FybiB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgcmVhZFVpbnQxNiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuY2xhc3MgSnBlZ0Vycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKGBKUEVHIGVycm9yOiAke21zZ31gKTtcbiAgfVxufVxuXG5jbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzY2FuTGluZXMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnNjYW5MaW5lcyA9IHNjYW5MaW5lcztcbiAgfVxufVxuXG5jbGFzcyBFT0lNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuLyoqXG4gKiBUaGlzIGNvZGUgd2FzIGZvcmtlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3RtYXN0ZXJ5ZXQvanBnanMuXG4gKiBUaGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgY3JlYXRlZCBieSBHaXRIdWIgdXNlciBub3RtYXN0ZXJ5ZXQuXG4gKlxuICogLSBUaGUgSlBFRyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgSVRVIENDSVRUIFJlY29tbWVuZGF0aW9uIFQuODFcbiAqICAgKHd3dy53My5vcmcvR3JhcGhpY3MvSlBFRy9pdHUtdDgxLnBkZilcbiAqIC0gVGhlIEpGSUYgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIEpQRUcgRmlsZSBJbnRlcmNoYW5nZSBGb3JtYXRcbiAqICAgKHd3dy53My5vcmcvR3JhcGhpY3MvSlBFRy9qZmlmMy5wZGYpXG4gKiAtIFRoZSBBZG9iZSBBcHBsaWNhdGlvbi1TcGVjaWZpYyBKUEVHIG1hcmtlcnMgaW4gdGhlXG4gKiAgIFN1cHBvcnRpbmcgdGhlIERDVCBGaWx0ZXJzIGluIFBvc3RTY3JpcHQgTGV2ZWwgMiwgVGVjaG5pY2FsIE5vdGUgIzUxMTZcbiAqICAgKHBhcnRuZXJzLmFkb2JlLmNvbS9wdWJsaWMvZGV2ZWxvcGVyL2VuL3BzL3Nkay81MTE2LkRDVF9GaWx0ZXIucGRmKVxuICovXG5cbnZhciBKcGVnSW1hZ2UgPSAoZnVuY3Rpb24gSnBlZ0ltYWdlQ2xvc3VyZSgpIHtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBkY3RaaWdaYWcgPSBuZXcgVWludDhBcnJheShbXG4gICAgIDAsXG4gICAgIDEsICA4LFxuICAgIDE2LCAgOSwgIDIsXG4gICAgIDMsIDEwLCAxNywgMjQsXG4gICAgMzIsIDI1LCAxOCwgMTEsIDQsXG4gICAgIDUsIDEyLCAxOSwgMjYsIDMzLCA0MCxcbiAgICA0OCwgNDEsIDM0LCAyNywgMjAsIDEzLCAgNixcbiAgICAgNywgMTQsIDIxLCAyOCwgMzUsIDQyLCA0OSwgNTYsXG4gICAgNTcsIDUwLCA0MywgMzYsIDI5LCAyMiwgMTUsXG4gICAgMjMsIDMwLCAzNywgNDQsIDUxLCA1OCxcbiAgICA1OSwgNTIsIDQ1LCAzOCwgMzEsXG4gICAgMzksIDQ2LCA1MywgNjAsXG4gICAgNjEsIDU0LCA0NyxcbiAgICA1NSwgNjIsXG4gICAgNjNcbiAgXSk7XG5cbiAgdmFyIGRjdENvczEgPSA0MDE3OyAvLyBjb3MocGkvMTYpXG4gIHZhciBkY3RTaW4xID0gNzk5OyAvLyBzaW4ocGkvMTYpXG4gIHZhciBkY3RDb3MzID0gMzQwNjsgLy8gY29zKDMqcGkvMTYpXG4gIHZhciBkY3RTaW4zID0gMjI3NjsgLy8gc2luKDMqcGkvMTYpXG4gIHZhciBkY3RDb3M2ID0gMTU2NzsgLy8gY29zKDYqcGkvMTYpXG4gIHZhciBkY3RTaW42ID0gMzc4NDsgLy8gc2luKDYqcGkvMTYpXG4gIHZhciBkY3RTcXJ0MiA9IDU3OTM7IC8vIHNxcnQoMilcbiAgdmFyIGRjdFNxcnQxZDIgPSAyODk2OyAvLyBzcXJ0KDIpIC8gMlxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gSnBlZ0ltYWdlKHsgZGVjb2RlVHJhbnNmb3JtID0gbnVsbCwgY29sb3JUcmFuc2Zvcm0gPSAtMSB9ID0ge30pIHtcbiAgICB0aGlzLl9kZWNvZGVUcmFuc2Zvcm0gPSBkZWNvZGVUcmFuc2Zvcm07XG4gICAgdGhpcy5fY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCB2YWx1ZXMpIHtcbiAgICB2YXIgayA9IDAsXG4gICAgICBjb2RlID0gW10sXG4gICAgICBpLFxuICAgICAgaixcbiAgICAgIGxlbmd0aCA9IDE2O1xuICAgIHdoaWxlIChsZW5ndGggPiAwICYmICFjb2RlTGVuZ3Roc1tsZW5ndGggLSAxXSkge1xuICAgICAgbGVuZ3RoLS07XG4gICAgfVxuICAgIGNvZGUucHVzaCh7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSk7XG4gICAgdmFyIHAgPSBjb2RlWzBdLFxuICAgICAgcTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3Roc1tpXTsgaisrKSB7XG4gICAgICAgIHAgPSBjb2RlLnBvcCgpO1xuICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gdmFsdWVzW2tdO1xuICAgICAgICB3aGlsZSAocC5pbmRleCA+IDApIHtcbiAgICAgICAgICBwID0gY29kZS5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBwLmluZGV4Kys7XG4gICAgICAgIGNvZGUucHVzaChwKTtcbiAgICAgICAgd2hpbGUgKGNvZGUubGVuZ3RoIDw9IGkpIHtcbiAgICAgICAgICBjb2RlLnB1c2goKHEgPSB7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSkpO1xuICAgICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuO1xuICAgICAgICAgIHAgPSBxO1xuICAgICAgICB9XG4gICAgICAgIGsrKztcbiAgICAgIH1cbiAgICAgIGlmIChpICsgMSA8IGxlbmd0aCkge1xuICAgICAgICAvLyBwIGhlcmUgcG9pbnRzIHRvIGxhc3QgY29kZVxuICAgICAgICBjb2RlLnB1c2goKHEgPSB7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSkpO1xuICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjtcbiAgICAgICAgcCA9IHE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2RlWzBdLmNoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkge1xuICAgIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVTY2FuKFxuICAgIGRhdGEsXG4gICAgb2Zmc2V0LFxuICAgIGZyYW1lLFxuICAgIGNvbXBvbmVudHMsXG4gICAgcmVzZXRJbnRlcnZhbCxcbiAgICBzcGVjdHJhbFN0YXJ0LFxuICAgIHNwZWN0cmFsRW5kLFxuICAgIHN1Y2Nlc3NpdmVQcmV2LFxuICAgIHN1Y2Nlc3NpdmUsXG4gICAgcGFyc2VETkxNYXJrZXIgPSBmYWxzZVxuICApIHtcbiAgICB2YXIgbWN1c1BlckxpbmUgPSBmcmFtZS5tY3VzUGVyTGluZTtcbiAgICB2YXIgcHJvZ3Jlc3NpdmUgPSBmcmFtZS5wcm9ncmVzc2l2ZTtcblxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0O1xuICAgIGxldCBiaXRzRGF0YSA9IDAsXG4gICAgICBiaXRzQ291bnQgPSAwO1xuXG4gICAgZnVuY3Rpb24gcmVhZEJpdCgpIHtcbiAgICAgIGlmIChiaXRzQ291bnQgPiAwKSB7XG4gICAgICAgIGJpdHNDb3VudC0tO1xuICAgICAgICByZXR1cm4gKGJpdHNEYXRhID4+IGJpdHNDb3VudCkgJiAxO1xuICAgICAgfVxuICAgICAgYml0c0RhdGEgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgIGlmIChiaXRzRGF0YSA9PT0gMHhmZikge1xuICAgICAgICB2YXIgbmV4dEJ5dGUgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgaWYgKG5leHRCeXRlKSB7XG4gICAgICAgICAgaWYgKG5leHRCeXRlID09PSAvKiBETkwgPSAqLyAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICBjb25zdCBzY2FuTGluZXMgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIGlmIChzY2FuTGluZXMgPiAwICYmIHNjYW5MaW5lcyAhPT0gZnJhbWUuc2NhbkxpbmVzKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgICBcIkZvdW5kIEROTCBtYXJrZXIgKDB4RkZEQykgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGFcIixcbiAgICAgICAgICAgICAgICBzY2FuTGluZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRCeXRlID09PSAvKiBFT0kgPSAqLyAweGQ5KSB7XG4gICAgICAgICAgICBpZiAocGFyc2VETkxNYXJrZXIpIHtcbiAgICAgICAgICAgICAgLy8gTk9URTogb25seSA4LWJpdCBKUEVHIGltYWdlcyBhcmUgc3VwcG9ydGVkIGluIHRoaXMgZGVjb2Rlci5cbiAgICAgICAgICAgICAgY29uc3QgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7XG4gICAgICAgICAgICAgIC8vIEhldXJpc3RpYyB0byBhdHRlbXB0IHRvIGhhbmRsZSBjb3JydXB0IEpQRUcgaW1hZ2VzIHdpdGggdG9vXG4gICAgICAgICAgICAgIC8vIGxhcmdlIGBzY2FuTGluZXNgIHBhcmFtZXRlciwgYnkgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50bHlcbiAgICAgICAgICAgICAgLy8gcGFyc2VkIG51bWJlciBvZiBzY2FuTGluZXMgd2hlbiBpdCdzIGF0IGxlYXN0IChhcHByb3hpbWF0ZWx5KVxuICAgICAgICAgICAgICAvLyBvbmUgb3JkZXIgb2YgbWFnbml0dWRlIHNtYWxsZXIgdGhhbiBleHBlY3RlZCAoZml4ZXNcbiAgICAgICAgICAgICAgLy8gaXNzdWUxMDg4MC5wZGYgYW5kIGlzc3VlMTA5ODkucGRmKS5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1heWJlU2NhbkxpbmVzID4gMCAmJlxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZnJhbWUuc2NhbkxpbmVzIC8gbWF5YmVTY2FuTGluZXMpID49IDEwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInBvc3NpYmx5IGNhdXNlZCBieSBpbmNvcnJlY3QgYHNjYW5MaW5lc2AgcGFyYW1ldGVyXCIsXG4gICAgICAgICAgICAgICAgICBtYXliZVNjYW5MaW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFT0lNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgXCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXG4gICAgICAgICAgICBgdW5leHBlY3RlZCBtYXJrZXIgJHsoKGJpdHNEYXRhIDw8IDgpIHwgbmV4dEJ5dGUpLnRvU3RyaW5nKDE2KX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1bnN0dWZmIDBcbiAgICAgIH1cbiAgICAgIGJpdHNDb3VudCA9IDc7XG4gICAgICByZXR1cm4gYml0c0RhdGEgPj4+IDc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlSHVmZm1hbih0cmVlKSB7XG4gICAgICB2YXIgbm9kZSA9IHRyZWU7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBub2RlID0gbm9kZVtyZWFkQml0KCldO1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBub2RlKSB7XG4gICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCkge1xuICAgICAgdmFyIG4gPSAwO1xuICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgbiA9IChuIDw8IDEpIHwgcmVhZEJpdCgpO1xuICAgICAgICBsZW5ndGgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQobGVuZ3RoKSB7XG4gICAgICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiByZWFkQml0KCkgPT09IDEgPyAxIDogLTE7XG4gICAgICB9XG4gICAgICB2YXIgbiA9IHJlY2VpdmUobGVuZ3RoKTtcbiAgICAgIGlmIChuID49IDEgPDwgKGxlbmd0aCAtIDEpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gKyAoLTEgPDwgbGVuZ3RoKSArIDE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7XG4gICAgICB2YXIgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KTtcbiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdID0gY29tcG9uZW50LnByZWQgKz0gZGlmZjtcbiAgICAgIHZhciBrID0gMTtcbiAgICAgIHdoaWxlIChrIDwgNjQpIHtcbiAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpO1xuICAgICAgICB2YXIgcyA9IHJzICYgMTUsXG4gICAgICAgICAgciA9IHJzID4+IDQ7XG4gICAgICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGsgKz0gMTY7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgayArPSByO1xuICAgICAgICB2YXIgeiA9IGRjdFppZ1phZ1trXTtcbiAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldCArIHpdID0gcmVjZWl2ZUFuZEV4dGVuZChzKTtcbiAgICAgICAgaysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZURDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7XG4gICAgICB2YXIgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlO1xuICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZURDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7XG4gICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSB8PSByZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZTtcbiAgICB9XG5cbiAgICB2YXIgZW9icnVuID0gMDtcbiAgICBmdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHtcbiAgICAgIGlmIChlb2JydW4gPiAwKSB7XG4gICAgICAgIGVvYnJ1bi0tO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQsXG4gICAgICAgIGUgPSBzcGVjdHJhbEVuZDtcbiAgICAgIHdoaWxlIChrIDw9IGUpIHtcbiAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpO1xuICAgICAgICB2YXIgcyA9IHJzICYgMTUsXG4gICAgICAgICAgciA9IHJzID4+IDQ7XG4gICAgICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpIC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrICs9IDE2O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGsgKz0gcjtcbiAgICAgICAgdmFyIHogPSBkY3RaaWdaYWdba107XG4gICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9XG4gICAgICAgICAgcmVjZWl2ZUFuZEV4dGVuZChzKSAqICgxIDw8IHN1Y2Nlc3NpdmUpO1xuICAgICAgICBrKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMCxcbiAgICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZTtcbiAgICBmdW5jdGlvbiBkZWNvZGVBQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIGsgPSBzcGVjdHJhbFN0YXJ0O1xuICAgICAgdmFyIGUgPSBzcGVjdHJhbEVuZDtcbiAgICAgIHZhciByID0gMDtcbiAgICAgIHZhciBzO1xuICAgICAgdmFyIHJzO1xuICAgICAgd2hpbGUgKGsgPD0gZSkge1xuICAgICAgICBjb25zdCBvZmZzZXRaID0gYmxvY2tPZmZzZXQgKyBkY3RaaWdaYWdba107XG4gICAgICAgIGNvbnN0IHNpZ24gPSBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdIDwgMCA/IC0xIDogMTtcbiAgICAgICAgc3dpdGNoIChzdWNjZXNzaXZlQUNTdGF0ZSkge1xuICAgICAgICAgIGNhc2UgMDogLy8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7XG4gICAgICAgICAgICBzID0gcnMgJiAxNTtcbiAgICAgICAgICAgIHIgPSBycyA+PiA0O1xuICAgICAgICAgICAgaWYgKHMgPT09IDApIHtcbiAgICAgICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKTtcbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgciA9IDE2O1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHMgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiaW52YWxpZCBBQ24gZW5jb2RpbmdcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTtcbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIDE6IC8vIHNraXBwaW5nIHIgemVybyBpdGVtc1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLS07XG4gICAgICAgICAgICAgIGlmIChyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSBzdWNjZXNzaXZlQUNTdGF0ZSA9PT0gMiA/IDMgOiAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6IC8vIHNldCB2YWx1ZSBmb3IgYSB6ZXJvIGl0ZW1cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID1cbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNOZXh0VmFsdWUgPDwgc3VjY2Vzc2l2ZTtcbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OiAvLyBlb2JcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBrKys7XG4gICAgICB9XG4gICAgICBpZiAoc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDQpIHtcbiAgICAgICAgZW9icnVuLS07XG4gICAgICAgIGlmIChlb2JydW4gPT09IDApIHtcbiAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgYmxvY2tSb3cgPSAwO1xuICAgIGZ1bmN0aW9uIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZSwgbWN1LCByb3csIGNvbCkge1xuICAgICAgdmFyIG1jdVJvdyA9IChtY3UgLyBtY3VzUGVyTGluZSkgfCAwO1xuICAgICAgdmFyIG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lO1xuICAgICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdztcbiAgICAgIHZhciBibG9ja0NvbCA9IG1jdUNvbCAqIGNvbXBvbmVudC5oICsgY29sO1xuICAgICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7XG4gICAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGUsIG1jdSkge1xuICAgICAgYmxvY2tSb3cgPSAobWN1IC8gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUpIHwgMDtcbiAgICAgIHZhciBibG9ja0NvbCA9IG1jdSAlIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lO1xuICAgICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7XG4gICAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDtcbiAgICB2YXIgY29tcG9uZW50LCBpLCBqLCBrLCBuO1xuICAgIHZhciBkZWNvZGVGbjtcbiAgICBpZiAocHJvZ3Jlc3NpdmUpIHtcbiAgICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7XG4gICAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7XG4gICAgfVxuXG4gICAgdmFyIG1jdSA9IDAsXG4gICAgICBmaWxlTWFya2VyO1xuICAgIHZhciBtY3VFeHBlY3RlZDtcbiAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkge1xuICAgICAgbWN1RXhwZWN0ZWQgPSBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckxpbmUgKiBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckNvbHVtbjtcbiAgICB9IGVsc2Uge1xuICAgICAgbWN1RXhwZWN0ZWQgPSBtY3VzUGVyTGluZSAqIGZyYW1lLm1jdXNQZXJDb2x1bW47XG4gICAgfVxuXG4gICAgdmFyIGgsIHY7XG4gICAgd2hpbGUgKG1jdSA8PSBtY3VFeHBlY3RlZCkge1xuICAgICAgLy8gcmVzZXQgaW50ZXJ2YWwgc3R1ZmZcbiAgICAgIHZhciBtY3VUb1JlYWQgPSByZXNldEludGVydmFsXG4gICAgICAgID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpXG4gICAgICAgIDogbWN1RXhwZWN0ZWQ7XG5cbiAgICAgIC8vIFRoZSBgbWN1VG9SZWFkID09PSAwYCBjYXNlIHNob3VsZCBvbmx5IG9jY3VyIHdoZW4gYWxsIG9mIHRoZSBleHBlY3RlZFxuICAgICAgLy8gTUNVIGRhdGEgaGFzIGJlZW4gYWxyZWFkeSBwYXJzZWQsIGkuZS4gd2hlbiBgbWN1ID09PSBtY3VFeHBlY3RlZGAsIGJ1dFxuICAgICAgLy8gc29tZSBjb3JydXB0IEpQRUcgaW1hZ2VzIGNvbnRhaW4gbW9yZSBkYXRhIHRoYW4gaW50ZW5kZWQgYW5kIHdlIHRodXNcbiAgICAgIC8vIHdhbnQgdG8gc2tpcCBvdmVyIGFueSBleHRyYSBSU1R4IG1hcmtlcnMgYmVsb3cgKGZpeGVzIGlzc3VlMTE3OTQucGRmKS5cbiAgICAgIGlmIChtY3VUb1JlYWQgPiAwKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb21wb25lbnRzW2ldLnByZWQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVvYnJ1biA9IDA7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzWzBdO1xuICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykge1xuICAgICAgICAgICAgZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1KTtcbiAgICAgICAgICAgIG1jdSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgICAgaCA9IGNvbXBvbmVudC5oO1xuICAgICAgICAgICAgICB2ID0gY29tcG9uZW50LnY7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2OyBqKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1LCBqLCBrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1jdSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaW5kIG1hcmtlclxuICAgICAgYml0c0NvdW50ID0gMDtcbiAgICAgIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgb2Zmc2V0KTtcbiAgICAgIGlmICghZmlsZU1hcmtlcikge1xuICAgICAgICBicmVhazsgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhIHdpdGhvdXQgZmluZGluZyBhbnkgbWFya2VyLlxuICAgICAgfVxuICAgICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkge1xuICAgICAgICAvLyBTb21lIGJhZCBpbWFnZXMgc2VlbSB0byBwYWQgU2NhbiBibG9ja3Mgd2l0aCBlLmcuIHplcm8gYnl0ZXMsIHNraXBcbiAgICAgICAgLy8gcGFzdCB0aG9zZSB0byBhdHRlbXB0IHRvIGZpbmQgYSB2YWxpZCBtYXJrZXIgKGZpeGVzIGlzc3VlNDA5MC5wZGYpLlxuICAgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/IFwidW5leHBlY3RlZFwiIDogXCJleGNlc3NpdmVcIjtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgZGVjb2RlU2NhbiAtICR7cGFydGlhbE1zZ30gTUNVIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAke2ZpbGVNYXJrZXIuaW52YWxpZH1gXG4gICAgICAgICk7XG4gICAgICAgIG9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0O1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNYXJrZXIubWFya2VyID49IDB4ZmZkMCAmJiBmaWxlTWFya2VyLm1hcmtlciA8PSAweGZmZDcpIHtcbiAgICAgICAgLy8gUlNUeFxuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDtcbiAgfVxuXG4gIC8vIEEgcG9ydCBvZiBwb3BwbGVyJ3MgSURDVCBtZXRob2Qgd2hpY2ggaW4gdHVybiBpcyB0YWtlbiBmcm9tOlxuICAvLyAgIENocmlzdG9waCBMb2VmZmxlciwgQWRyaWFhbiBMaWd0ZW5iZXJnLCBHZW9yZ2UgUy4gTW9zY2h5dHosXG4gIC8vICAgJ1ByYWN0aWNhbCBGYXN0IDEtRCBEQ1QgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucycsXG4gIC8vICAgSUVFRSBJbnRsLiBDb25mLiBvbiBBY291c3RpY3MsIFNwZWVjaCAmIFNpZ25hbCBQcm9jZXNzaW5nLCAxOTg5LFxuICAvLyAgIDk4OC05OTEuXG4gIGZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIGJsb2NrQnVmZmVyT2Zmc2V0LCBwKSB7XG4gICAgdmFyIHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLFxuICAgICAgYmxvY2tEYXRhID0gY29tcG9uZW50LmJsb2NrRGF0YTtcbiAgICB2YXIgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3O1xuICAgIHZhciBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDc7XG4gICAgdmFyIHQ7XG5cbiAgICBpZiAoIXF0KSB7XG4gICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuXCIpO1xuICAgIH1cblxuICAgIC8vIGludmVyc2UgRENUIG9uIHJvd3NcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCA2NDsgcm93ICs9IDgpIHtcbiAgICAgIC8vIGdhdGhlciBibG9jayBkYXRhXG4gICAgICBwMCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvd107XG4gICAgICBwMSA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDFdO1xuICAgICAgcDIgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAyXTtcbiAgICAgIHAzID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgM107XG4gICAgICBwNCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDRdO1xuICAgICAgcDUgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA1XTtcbiAgICAgIHA2ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNl07XG4gICAgICBwNyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDddO1xuXG4gICAgICAvLyBkZXF1YW50IHAwXG4gICAgICBwMCAqPSBxdFtyb3ddO1xuXG4gICAgICAvLyBjaGVjayBmb3IgYWxsLXplcm8gQUMgY29lZmZpY2llbnRzXG4gICAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkge1xuICAgICAgICB0ID0gKGRjdFNxcnQyICogcDAgKyA1MTIpID4+IDEwO1xuICAgICAgICBwW3Jvd10gPSB0O1xuICAgICAgICBwW3JvdyArIDFdID0gdDtcbiAgICAgICAgcFtyb3cgKyAyXSA9IHQ7XG4gICAgICAgIHBbcm93ICsgM10gPSB0O1xuICAgICAgICBwW3JvdyArIDRdID0gdDtcbiAgICAgICAgcFtyb3cgKyA1XSA9IHQ7XG4gICAgICAgIHBbcm93ICsgNl0gPSB0O1xuICAgICAgICBwW3JvdyArIDddID0gdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBkZXF1YW50IHAxIC4uLiBwN1xuICAgICAgcDEgKj0gcXRbcm93ICsgMV07XG4gICAgICBwMiAqPSBxdFtyb3cgKyAyXTtcbiAgICAgIHAzICo9IHF0W3JvdyArIDNdO1xuICAgICAgcDQgKj0gcXRbcm93ICsgNF07XG4gICAgICBwNSAqPSBxdFtyb3cgKyA1XTtcbiAgICAgIHA2ICo9IHF0W3JvdyArIDZdO1xuICAgICAgcDcgKj0gcXRbcm93ICsgN107XG5cbiAgICAgIC8vIHN0YWdlIDRcbiAgICAgIHYwID0gKGRjdFNxcnQyICogcDAgKyAxMjgpID4+IDg7XG4gICAgICB2MSA9IChkY3RTcXJ0MiAqIHA0ICsgMTI4KSA+PiA4O1xuICAgICAgdjIgPSBwMjtcbiAgICAgIHYzID0gcDY7XG4gICAgICB2NCA9IChkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMTI4KSA+PiA4O1xuICAgICAgdjcgPSAoZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDEyOCkgPj4gODtcbiAgICAgIHY1ID0gcDMgPDwgNDtcbiAgICAgIHY2ID0gcDUgPDwgNDtcblxuICAgICAgLy8gc3RhZ2UgM1xuICAgICAgdjAgPSAodjAgKyB2MSArIDEpID4+IDE7XG4gICAgICB2MSA9IHYwIC0gdjE7XG4gICAgICB0ID0gKHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDEyOCkgPj4gODtcbiAgICAgIHYyID0gKHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDEyOCkgPj4gODtcbiAgICAgIHYzID0gdDtcbiAgICAgIHY0ID0gKHY0ICsgdjYgKyAxKSA+PiAxO1xuICAgICAgdjYgPSB2NCAtIHY2O1xuICAgICAgdjcgPSAodjcgKyB2NSArIDEpID4+IDE7XG4gICAgICB2NSA9IHY3IC0gdjU7XG5cbiAgICAgIC8vIHN0YWdlIDJcbiAgICAgIHYwID0gKHYwICsgdjMgKyAxKSA+PiAxO1xuICAgICAgdjMgPSB2MCAtIHYzO1xuICAgICAgdjEgPSAodjEgKyB2MiArIDEpID4+IDE7XG4gICAgICB2MiA9IHYxIC0gdjI7XG4gICAgICB0ID0gKHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDgpID4+IDEyO1xuICAgICAgdjQgPSAodjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NyA9IHQ7XG4gICAgICB0ID0gKHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDgpID4+IDEyO1xuICAgICAgdjUgPSAodjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NiA9IHQ7XG5cbiAgICAgIC8vIHN0YWdlIDFcbiAgICAgIHBbcm93XSA9IHYwICsgdjc7XG4gICAgICBwW3JvdyArIDddID0gdjAgLSB2NztcbiAgICAgIHBbcm93ICsgMV0gPSB2MSArIHY2O1xuICAgICAgcFtyb3cgKyA2XSA9IHYxIC0gdjY7XG4gICAgICBwW3JvdyArIDJdID0gdjIgKyB2NTtcbiAgICAgIHBbcm93ICsgNV0gPSB2MiAtIHY1O1xuICAgICAgcFtyb3cgKyAzXSA9IHYzICsgdjQ7XG4gICAgICBwW3JvdyArIDRdID0gdjMgLSB2NDtcbiAgICB9XG5cbiAgICAvLyBpbnZlcnNlIERDVCBvbiBjb2x1bW5zXG4gICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgODsgKytjb2wpIHtcbiAgICAgIHAwID0gcFtjb2xdO1xuICAgICAgcDEgPSBwW2NvbCArIDhdO1xuICAgICAgcDIgPSBwW2NvbCArIDE2XTtcbiAgICAgIHAzID0gcFtjb2wgKyAyNF07XG4gICAgICBwNCA9IHBbY29sICsgMzJdO1xuICAgICAgcDUgPSBwW2NvbCArIDQwXTtcbiAgICAgIHA2ID0gcFtjb2wgKyA0OF07XG4gICAgICBwNyA9IHBbY29sICsgNTZdO1xuXG4gICAgICAvLyBjaGVjayBmb3IgYWxsLXplcm8gQUMgY29lZmZpY2llbnRzXG4gICAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkge1xuICAgICAgICB0ID0gKGRjdFNxcnQyICogcDAgKyA4MTkyKSA+PiAxNDtcbiAgICAgICAgLy8gQ29udmVydCB0byA4LWJpdC5cbiAgICAgICAgaWYgKHQgPCAtMjA0MCkge1xuICAgICAgICAgIHQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPj0gMjAyNCkge1xuICAgICAgICAgIHQgPSAyNTU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdCA9ICh0ICsgMjA1NikgPj4gNDtcbiAgICAgICAgfVxuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSB0O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RhZ2UgNFxuICAgICAgdjAgPSAoZGN0U3FydDIgKiBwMCArIDIwNDgpID4+IDEyO1xuICAgICAgdjEgPSAoZGN0U3FydDIgKiBwNCArIDIwNDgpID4+IDEyO1xuICAgICAgdjIgPSBwMjtcbiAgICAgIHYzID0gcDY7XG4gICAgICB2NCA9IChkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NyA9IChkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NSA9IHAzO1xuICAgICAgdjYgPSBwNTtcblxuICAgICAgLy8gc3RhZ2UgM1xuICAgICAgLy8gU2hpZnQgdjAgYnkgMTI4LjUgPDwgNSBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHNoaWZ0IHAwLi4ucDcgd2hlblxuICAgICAgLy8gY29udmVydGluZyB0byBVSW50OCByYW5nZSBsYXRlci5cbiAgICAgIHYwID0gKCh2MCArIHYxICsgMSkgPj4gMSkgKyA0MTEyO1xuICAgICAgdjEgPSB2MCAtIHYxO1xuICAgICAgdCA9ICh2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHYyID0gKHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDIwNDgpID4+IDEyO1xuICAgICAgdjMgPSB0O1xuICAgICAgdjQgPSAodjQgKyB2NiArIDEpID4+IDE7XG4gICAgICB2NiA9IHY0IC0gdjY7XG4gICAgICB2NyA9ICh2NyArIHY1ICsgMSkgPj4gMTtcbiAgICAgIHY1ID0gdjcgLSB2NTtcblxuICAgICAgLy8gc3RhZ2UgMlxuICAgICAgdjAgPSAodjAgKyB2MyArIDEpID4+IDE7XG4gICAgICB2MyA9IHYwIC0gdjM7XG4gICAgICB2MSA9ICh2MSArIHYyICsgMSkgPj4gMTtcbiAgICAgIHYyID0gdjEgLSB2MjtcbiAgICAgIHQgPSAodjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NCA9ICh2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHY3ID0gdDtcbiAgICAgIHQgPSAodjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NSA9ICh2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHY2ID0gdDtcblxuICAgICAgLy8gc3RhZ2UgMVxuICAgICAgcDAgPSB2MCArIHY3O1xuICAgICAgcDcgPSB2MCAtIHY3O1xuICAgICAgcDEgPSB2MSArIHY2O1xuICAgICAgcDYgPSB2MSAtIHY2O1xuICAgICAgcDIgPSB2MiArIHY1O1xuICAgICAgcDUgPSB2MiAtIHY1O1xuICAgICAgcDMgPSB2MyArIHY0O1xuICAgICAgcDQgPSB2MyAtIHY0O1xuXG4gICAgICAvLyBDb252ZXJ0IHRvIDgtYml0IGludGVnZXJzLlxuICAgICAgaWYgKHAwIDwgMTYpIHtcbiAgICAgICAgcDAgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwMCA+PSA0MDgwKSB7XG4gICAgICAgIHAwID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDAgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDEgPCAxNikge1xuICAgICAgICBwMSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHAxID49IDQwODApIHtcbiAgICAgICAgcDEgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwMSA+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmIChwMiA8IDE2KSB7XG4gICAgICAgIHAyID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDIgPj0gNDA4MCkge1xuICAgICAgICBwMiA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAyID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHAzIDwgMTYpIHtcbiAgICAgICAgcDMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwMyA+PSA0MDgwKSB7XG4gICAgICAgIHAzID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDMgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDQgPCAxNikge1xuICAgICAgICBwNCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHA0ID49IDQwODApIHtcbiAgICAgICAgcDQgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwNCA+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmIChwNSA8IDE2KSB7XG4gICAgICAgIHA1ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDUgPj0gNDA4MCkge1xuICAgICAgICBwNSA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHA1ID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHA2IDwgMTYpIHtcbiAgICAgICAgcDYgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwNiA+PSA0MDgwKSB7XG4gICAgICAgIHA2ID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDYgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDcgPCAxNikge1xuICAgICAgICBwNyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHA3ID49IDQwODApIHtcbiAgICAgICAgcDcgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwNyA+Pj0gNDtcbiAgICAgIH1cblxuICAgICAgLy8gc3RvcmUgYmxvY2sgZGF0YVxuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHAwO1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSBwMTtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDE2XSA9IHAyO1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gcDM7XG4gICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSBwNDtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQwXSA9IHA1O1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gcDY7XG4gICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSBwNztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCkge1xuICAgIHZhciBibG9ja3NQZXJMaW5lID0gY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7XG4gICAgdmFyIGJsb2Nrc1BlckNvbHVtbiA9IGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW47XG4gICAgdmFyIGNvbXB1dGF0aW9uQnVmZmVyID0gbmV3IEludDE2QXJyYXkoNjQpO1xuXG4gICAgZm9yICh2YXIgYmxvY2tSb3cgPSAwOyBibG9ja1JvdyA8IGJsb2Nrc1BlckNvbHVtbjsgYmxvY2tSb3crKykge1xuICAgICAgZm9yICh2YXIgYmxvY2tDb2wgPSAwOyBibG9ja0NvbCA8IGJsb2Nrc1BlckxpbmU7IGJsb2NrQ29sKyspIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTtcbiAgICAgICAgcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgb2Zmc2V0LCBjb21wdXRhdGlvbkJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGN1cnJlbnRQb3MsIHN0YXJ0UG9zID0gY3VycmVudFBvcykge1xuICAgIGNvbnN0IG1heFBvcyA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICB2YXIgbmV3UG9zID0gc3RhcnRQb3MgPCBjdXJyZW50UG9zID8gc3RhcnRQb3MgOiBjdXJyZW50UG9zO1xuXG4gICAgaWYgKGN1cnJlbnRQb3MgPj0gbWF4UG9zKSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gRG9uJ3QgYXR0ZW1wdCB0byByZWFkIG5vbi1leGlzdGVudCBkYXRhIGFuZCBqdXN0IHJldHVybi5cbiAgICB9XG4gICAgdmFyIGN1cnJlbnRNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIGN1cnJlbnRQb3MpO1xuICAgIGlmIChjdXJyZW50TWFya2VyID49IDB4ZmZjMCAmJiBjdXJyZW50TWFya2VyIDw9IDB4ZmZmZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW52YWxpZDogbnVsbCxcbiAgICAgICAgbWFya2VyOiBjdXJyZW50TWFya2VyLFxuICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQb3MsXG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgbmV3TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBuZXdQb3MpO1xuICAgIHdoaWxlICghKG5ld01hcmtlciA+PSAweGZmYzAgJiYgbmV3TWFya2VyIDw9IDB4ZmZmZSkpIHtcbiAgICAgIGlmICgrK25ld1BvcyA+PSBtYXhQb3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIERvbid0IGF0dGVtcHQgdG8gcmVhZCBub24tZXhpc3RlbnQgZGF0YSBhbmQganVzdCByZXR1cm4uXG4gICAgICB9XG4gICAgICBuZXdNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG5ld1Bvcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpbnZhbGlkOiBjdXJyZW50TWFya2VyLnRvU3RyaW5nKDE2KSxcbiAgICAgIG1hcmtlcjogbmV3TWFya2VyLFxuICAgICAgb2Zmc2V0OiBuZXdQb3MsXG4gICAgfTtcbiAgfVxuXG4gIEpwZWdJbWFnZS5wcm90b3R5cGUgPSB7XG4gICAgcGFyc2UoZGF0YSwgeyBkbmxTY2FuTGluZXMgPSBudWxsIH0gPSB7fSkge1xuICAgICAgZnVuY3Rpb24gcmVhZERhdGFCbG9jaygpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgbGV0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7XG5cbiAgICAgICAgdmFyIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgZW5kT2Zmc2V0LCBvZmZzZXQpO1xuICAgICAgICBpZiAoZmlsZU1hcmtlciAmJiBmaWxlTWFya2VyLmludmFsaWQpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJyZWFkRGF0YUJsb2NrIC0gaW5jb3JyZWN0IGxlbmd0aCwgY3VycmVudCBtYXJrZXIgaXM6IFwiICtcbiAgICAgICAgICAgICAgZmlsZU1hcmtlci5pbnZhbGlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbmRPZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhcnJheSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBlbmRPZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7XG4gICAgICAgIHZhciBtY3VzUGVyTGluZSA9IE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDggLyBmcmFtZS5tYXhIKTtcbiAgICAgICAgdmFyIG1jdXNQZXJDb2x1bW4gPSBNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCAvIGZyYW1lLm1heFYpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgIHZhciBibG9ja3NQZXJMaW5lID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDgpICogY29tcG9uZW50LmgpIC8gZnJhbWUubWF4SFxuICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbiA9IE1hdGguY2VpbChcbiAgICAgICAgICAgIChNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCkgKiBjb21wb25lbnQudikgLyBmcmFtZS5tYXhWXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgYmxvY2tzUGVyTGluZUZvck1jdSA9IG1jdXNQZXJMaW5lICogY29tcG9uZW50Lmg7XG4gICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbkZvck1jdSA9IG1jdXNQZXJDb2x1bW4gKiBjb21wb25lbnQudjtcblxuICAgICAgICAgIHZhciBibG9ja3NCdWZmZXJTaXplID1cbiAgICAgICAgICAgIDY0ICogYmxvY2tzUGVyQ29sdW1uRm9yTWN1ICogKGJsb2Nrc1BlckxpbmVGb3JNY3UgKyAxKTtcbiAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhID0gbmV3IEludDE2QXJyYXkoYmxvY2tzQnVmZmVyU2l6ZSk7XG4gICAgICAgICAgY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgPSBibG9ja3NQZXJMaW5lO1xuICAgICAgICAgIGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4gPSBibG9ja3NQZXJDb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUubWN1c1BlckxpbmUgPSBtY3VzUGVyTGluZTtcbiAgICAgICAgZnJhbWUubWN1c1BlckNvbHVtbiA9IG1jdXNQZXJDb2x1bW47XG4gICAgICB9XG5cbiAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgdmFyIGpmaWYgPSBudWxsO1xuICAgICAgdmFyIGFkb2JlID0gbnVsbDtcbiAgICAgIHZhciBmcmFtZSwgcmVzZXRJbnRlcnZhbDtcbiAgICAgIGxldCBudW1TT1NNYXJrZXJzID0gMDtcbiAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTtcbiAgICAgIHZhciBodWZmbWFuVGFibGVzQUMgPSBbXSxcbiAgICAgICAgaHVmZm1hblRhYmxlc0RDID0gW107XG5cbiAgICAgIGxldCBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICBpZiAoZmlsZU1hcmtlciAhPT0gLyogU09JIChTdGFydCBvZiBJbWFnZSkgPSAqLyAweGZmZDgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcIlNPSSBub3QgZm91bmRcIik7XG4gICAgICB9XG4gICAgICBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG5cbiAgICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAvKiBFT0kgKEVuZCBvZiBJbWFnZSkgPSAqLyAweGZmZDkpIHtcbiAgICAgICAgdmFyIGksIGosIGw7XG4gICAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikge1xuICAgICAgICAgIGNhc2UgMHhmZmUwOiAvLyBBUFAwIChBcHBsaWNhdGlvbiBTcGVjaWZpYylcbiAgICAgICAgICBjYXNlIDB4ZmZlMTogLy8gQVBQMVxuICAgICAgICAgIGNhc2UgMHhmZmUyOiAvLyBBUFAyXG4gICAgICAgICAgY2FzZSAweGZmZTM6IC8vIEFQUDNcbiAgICAgICAgICBjYXNlIDB4ZmZlNDogLy8gQVBQNFxuICAgICAgICAgIGNhc2UgMHhmZmU1OiAvLyBBUFA1XG4gICAgICAgICAgY2FzZSAweGZmZTY6IC8vIEFQUDZcbiAgICAgICAgICBjYXNlIDB4ZmZlNzogLy8gQVBQN1xuICAgICAgICAgIGNhc2UgMHhmZmU4OiAvLyBBUFA4XG4gICAgICAgICAgY2FzZSAweGZmZTk6IC8vIEFQUDlcbiAgICAgICAgICBjYXNlIDB4ZmZlYTogLy8gQVBQMTBcbiAgICAgICAgICBjYXNlIDB4ZmZlYjogLy8gQVBQMTFcbiAgICAgICAgICBjYXNlIDB4ZmZlYzogLy8gQVBQMTJcbiAgICAgICAgICBjYXNlIDB4ZmZlZDogLy8gQVBQMTNcbiAgICAgICAgICBjYXNlIDB4ZmZlZTogLy8gQVBQMTRcbiAgICAgICAgICBjYXNlIDB4ZmZlZjogLy8gQVBQMTVcbiAgICAgICAgICBjYXNlIDB4ZmZmZTogLy8gQ09NIChDb21tZW50KVxuICAgICAgICAgICAgdmFyIGFwcERhdGEgPSByZWFkRGF0YUJsb2NrKCk7XG5cbiAgICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZTApIHtcbiAgICAgICAgICAgICAgLy8gJ0pGSUZcXHgwMCdcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFwcERhdGFbMF0gPT09IDB4NGEgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzFdID09PSAweDQ2ICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVsyXSA9PT0gMHg0OSAmJlxuICAgICAgICAgICAgICAgIGFwcERhdGFbM10gPT09IDB4NDYgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzRdID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGpmaWYgPSB7XG4gICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB7IG1ham9yOiBhcHBEYXRhWzVdLCBtaW5vcjogYXBwRGF0YVs2XSB9LFxuICAgICAgICAgICAgICAgICAgZGVuc2l0eVVuaXRzOiBhcHBEYXRhWzddLFxuICAgICAgICAgICAgICAgICAgeERlbnNpdHk6IChhcHBEYXRhWzhdIDw8IDgpIHwgYXBwRGF0YVs5XSxcbiAgICAgICAgICAgICAgICAgIHlEZW5zaXR5OiAoYXBwRGF0YVsxMF0gPDwgOCkgfCBhcHBEYXRhWzExXSxcbiAgICAgICAgICAgICAgICAgIHRodW1iV2lkdGg6IGFwcERhdGFbMTJdLFxuICAgICAgICAgICAgICAgICAgdGh1bWJIZWlnaHQ6IGFwcERhdGFbMTNdLFxuICAgICAgICAgICAgICAgICAgdGh1bWJEYXRhOiBhcHBEYXRhLnN1YmFycmF5KFxuICAgICAgICAgICAgICAgICAgICAxNCxcbiAgICAgICAgICAgICAgICAgICAgMTQgKyAzICogYXBwRGF0YVsxMl0gKiBhcHBEYXRhWzEzXVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPIEFQUDEgLSBFeGlmXG4gICAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmVlKSB7XG4gICAgICAgICAgICAgIC8vICdBZG9iZSdcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFwcERhdGFbMF0gPT09IDB4NDEgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzFdID09PSAweDY0ICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVsyXSA9PT0gMHg2ZiAmJlxuICAgICAgICAgICAgICAgIGFwcERhdGFbM10gPT09IDB4NjIgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzRdID09PSAweDY1XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFkb2JlID0ge1xuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogKGFwcERhdGFbNV0gPDwgOCkgfCBhcHBEYXRhWzZdLFxuICAgICAgICAgICAgICAgICAgZmxhZ3MwOiAoYXBwRGF0YVs3XSA8PCA4KSB8IGFwcERhdGFbOF0sXG4gICAgICAgICAgICAgICAgICBmbGFnczE6IChhcHBEYXRhWzldIDw8IDgpIHwgYXBwRGF0YVsxMF0sXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1Db2RlOiBhcHBEYXRhWzExXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRiOiAvLyBEUVQgKERlZmluZSBRdWFudGl6YXRpb24gVGFibGVzKVxuICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVzRW5kID0gcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoICsgb2Zmc2V0IC0gMjtcbiAgICAgICAgICAgIHZhciB6O1xuICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHF1YW50aXphdGlvblRhYmxlc0VuZCkge1xuICAgICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciB0YWJsZURhdGEgPSBuZXcgVWludDE2QXJyYXkoNjQpO1xuICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyA4IGJpdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTtcbiAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIDE2IGJpdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTtcbiAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiRFFUIC0gaW52YWxpZCB0YWJsZSBzcGVjXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlc1txdWFudGl6YXRpb25UYWJsZVNwZWMgJiAxNV0gPSB0YWJsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmMwOiAvLyBTT0YwIChTdGFydCBvZiBGcmFtZSwgQmFzZWxpbmUgRENUKVxuICAgICAgICAgIGNhc2UgMHhmZmMxOiAvLyBTT0YxIChTdGFydCBvZiBGcmFtZSwgRXh0ZW5kZWQgRENUKVxuICAgICAgICAgIGNhc2UgMHhmZmMyOiAvLyBTT0YyIChTdGFydCBvZiBGcmFtZSwgUHJvZ3Jlc3NpdmUgRENUKVxuICAgICAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXCJPbmx5IHNpbmdsZSBmcmFtZSBKUEVHcyBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICBmcmFtZSA9IHt9O1xuICAgICAgICAgICAgZnJhbWUuZXh0ZW5kZWQgPSBmaWxlTWFya2VyID09PSAweGZmYzE7XG4gICAgICAgICAgICBmcmFtZS5wcm9ncmVzc2l2ZSA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMjtcbiAgICAgICAgICAgIGZyYW1lLnByZWNpc2lvbiA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgY29uc3Qgc29mU2NhbkxpbmVzID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBmcmFtZS5zY2FuTGluZXMgPSBkbmxTY2FuTGluZXMgfHwgc29mU2NhbkxpbmVzO1xuICAgICAgICAgICAgZnJhbWUuc2FtcGxlc1BlckxpbmUgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkcyA9IHt9O1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IGRhdGFbb2Zmc2V0KytdLFxuICAgICAgICAgICAgICBjb21wb25lbnRJZDtcbiAgICAgICAgICAgIHZhciBtYXhIID0gMCxcbiAgICAgICAgICAgICAgbWF4ViA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgIHZhciBoID0gZGF0YVtvZmZzZXQgKyAxXSA+PiA0O1xuICAgICAgICAgICAgICB2YXIgdiA9IGRhdGFbb2Zmc2V0ICsgMV0gJiAxNTtcbiAgICAgICAgICAgICAgaWYgKG1heEggPCBoKSB7XG4gICAgICAgICAgICAgICAgbWF4SCA9IGg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG1heFYgPCB2KSB7XG4gICAgICAgICAgICAgICAgbWF4ViA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07XG4gICAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGgsXG4gICAgICAgICAgICAgICAgdixcbiAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLFxuICAgICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsLCAvLyBTZWUgY29tbWVudCBiZWxvdy5cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkc1tjb21wb25lbnRJZF0gPSBsIC0gMTtcbiAgICAgICAgICAgICAgb2Zmc2V0ICs9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcmFtZS5tYXhIID0gbWF4SDtcbiAgICAgICAgICAgIGZyYW1lLm1heFYgPSBtYXhWO1xuICAgICAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZjNDogLy8gREhUIChEZWZpbmUgSHVmZm1hbiBUYWJsZXMpXG4gICAgICAgICAgICBjb25zdCBodWZmbWFuTGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgaHVmZm1hbkxlbmd0aDsgKSB7XG4gICAgICAgICAgICAgIHZhciBodWZmbWFuVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgICAgICAgdmFyIGNvZGVMZW5ndGhTdW0gPSAwO1xuICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKywgb2Zmc2V0KyspIHtcbiAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoU3VtICs9IGNvZGVMZW5ndGhzW2pdID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3RoU3VtOyBqKyssIG9mZnNldCsrKSB7XG4gICAgICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTtcblxuICAgICAgICAgICAgICAoaHVmZm1hblRhYmxlU3BlYyA+PiA0ID09PSAwID8gaHVmZm1hblRhYmxlc0RDIDogaHVmZm1hblRhYmxlc0FDKVtcbiAgICAgICAgICAgICAgICBodWZmbWFuVGFibGVTcGVjICYgMTVcbiAgICAgICAgICAgICAgXSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAweGZmZGQ6IC8vIERSSSAoRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwpXG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICByZXNldEludGVydmFsID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRhOiAvLyBTT1MgKFN0YXJ0IG9mIFNjYW4pXG4gICAgICAgICAgICAvLyBBIEROTCBtYXJrZXIgKDB4RkZEQyksIGlmIGl0IGV4aXN0cywgaXMgb25seSBhbGxvd2VkIGF0IHRoZSBlbmRcbiAgICAgICAgICAgIC8vIG9mIHRoZSBmaXJzdCBzY2FuIHNlZ21lbnQgYW5kIG1heSBvbmx5IG9jY3VyIG9uY2UgaW4gYW4gaW1hZ2UuXG4gICAgICAgICAgICAvLyBGdXJ0aGVybW9yZSwgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLCBkbyAqbm90KiBhdHRlbXB0IHRvXG4gICAgICAgICAgICAvLyBwYXJzZSBETkwgbWFya2VycyBkdXJpbmcgcmUtcGFyc2luZyBvZiB0aGUgSlBFRyBzY2FuIGRhdGEuXG4gICAgICAgICAgICBjb25zdCBwYXJzZUROTE1hcmtlciA9ICsrbnVtU09TTWFya2VycyA9PT0gMSAmJiAhZG5sU2NhbkxpbmVzO1xuXG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JzQ291bnQgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnRzID0gW10sXG4gICAgICAgICAgICAgIGNvbXBvbmVudDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciBjb21wb25lbnRJbmRleCA9IGZyYW1lLmNvbXBvbmVudElkc1tpbmRleF07XG4gICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbY29tcG9uZW50SW5kZXhdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgdmFyIHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlREMgPSBodWZmbWFuVGFibGVzRENbdGFibGVTcGVjID4+IDRdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlQUMgPSBodWZmbWFuVGFibGVzQUNbdGFibGVTcGVjICYgMTVdO1xuICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzcGVjdHJhbFN0YXJ0ID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICB2YXIgc3BlY3RyYWxFbmQgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgIHZhciBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmFyIHByb2Nlc3NlZCA9IGRlY29kZVNjYW4oXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICAgICAgZnJhbWUsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgICAgICAgICByZXNldEludGVydmFsLFxuICAgICAgICAgICAgICAgIHNwZWN0cmFsU3RhcnQsXG4gICAgICAgICAgICAgICAgc3BlY3RyYWxFbmQsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPj4gNCxcbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LFxuICAgICAgICAgICAgICAgIHBhcnNlRE5MTWFya2VyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikge1xuICAgICAgICAgICAgICAgIHdhcm4oYCR7ZXgubWVzc2FnZX0gLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShkYXRhLCB7IGRubFNjYW5MaW5lczogZXguc2NhbkxpbmVzIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRU9JTWFya2VyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB3YXJuKGAke2V4Lm1lc3NhZ2V9IC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLmApO1xuICAgICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRjOiAvLyBETkwgKERlZmluZSBOdW1iZXIgb2YgTGluZXMpXG4gICAgICAgICAgICAvLyBJZ25vcmUgdGhlIG1hcmtlciwgc2luY2UgaXQncyBiZWluZyBoYW5kbGVkIGluIGBkZWNvZGVTY2FuYC5cbiAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZmZjogLy8gRmlsbCBieXRlc1xuICAgICAgICAgICAgaWYgKGRhdGFbb2Zmc2V0XSAhPT0gMHhmZikge1xuICAgICAgICAgICAgICAvLyBBdm9pZCBza2lwcGluZyBhIHZhbGlkIG1hcmtlci5cbiAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBDb3VsZCBiZSBpbmNvcnJlY3QgZW5jb2RpbmcgLS0gdGhlIGxhc3QgMHhGRiBieXRlIG9mIHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgLy8gYmxvY2sgY291bGQgaGF2ZSBiZWVuIGVhdGVuIGJ5IHRoZSBlbmNvZGVyLCBoZW5jZSB3ZSBmYWxsYmFjayB0b1xuICAgICAgICAgICAgLy8gYHN0YXJ0UG9zID0gb2Zmc2V0IC0gM2Agd2hlbiBsb29raW5nIGZvciB0aGUgbmV4dCB2YWxpZCBtYXJrZXIuXG4gICAgICAgICAgICBjb25zdCBuZXh0RmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgLyogY3VycmVudFBvcyA9ICovIG9mZnNldCAtIDIsXG4gICAgICAgICAgICAgIC8qIHN0YXJ0UG9zID0gKi8gb2Zmc2V0IC0gM1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChuZXh0RmlsZU1hcmtlciAmJiBuZXh0RmlsZU1hcmtlci5pbnZhbGlkKSB7XG4gICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgXCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiBcIiArXG4gICAgICAgICAgICAgICAgICBuZXh0RmlsZU1hcmtlci5pbnZhbGlkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG9mZnNldCA9IG5leHRGaWxlTWFya2VyLm9mZnNldDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID49IGRhdGEubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhIFwiICtcbiAgICAgICAgICAgICAgICAgIFwid2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWsgbWFya2VyTG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXG4gICAgICAgICAgICAgIFwiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6IFwiICsgZmlsZU1hcmtlci50b1N0cmluZygxNilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2lkdGggPSBmcmFtZS5zYW1wbGVzUGVyTGluZTtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gZnJhbWUuc2NhbkxpbmVzO1xuICAgICAgdGhpcy5qZmlmID0gamZpZjtcbiAgICAgIHRoaXMuYWRvYmUgPSBhZG9iZTtcbiAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tpXTtcblxuICAgICAgICAvLyBQcmV2ZW50IGVycm9ycyB3aGVuIERRVCBtYXJrZXJzIGFyZSBwbGFjZWQgYWZ0ZXIgU09Ge259IG1hcmtlcnMsXG4gICAgICAgIC8vIGJ5IGFzc2lnbmluZyB0aGUgYHF1YW50aXphdGlvblRhYmxlYCBlbnRyeSBhZnRlciB0aGUgZW50aXJlIGltYWdlXG4gICAgICAgIC8vIGhhcyBiZWVuIHBhcnNlZCAoZml4ZXMgaXNzdWU3NDA2LnBkZikuXG4gICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlc1tjb21wb25lbnQucXVhbnRpemF0aW9uSWRdO1xuICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGUpIHtcbiAgICAgICAgICBjb21wb25lbnQucXVhbnRpemF0aW9uVGFibGUgPSBxdWFudGl6YXRpb25UYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogY29tcG9uZW50LmluZGV4LFxuICAgICAgICAgIG91dHB1dDogYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpLFxuICAgICAgICAgIHNjYWxlWDogY29tcG9uZW50LmggLyBmcmFtZS5tYXhILFxuICAgICAgICAgIHNjYWxlWTogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWLFxuICAgICAgICAgIGJsb2Nrc1BlckxpbmU6IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lLFxuICAgICAgICAgIGJsb2Nrc1BlckNvbHVtbjogY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLm51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCwgaXNTb3VyY2VQREYgPSBmYWxzZSkge1xuICAgICAgdmFyIHNjYWxlWCA9IHRoaXMud2lkdGggLyB3aWR0aCxcbiAgICAgICAgc2NhbGVZID0gdGhpcy5oZWlnaHQgLyBoZWlnaHQ7XG5cbiAgICAgIHZhciBjb21wb25lbnQsIGNvbXBvbmVudFNjYWxlWCwgY29tcG9uZW50U2NhbGVZLCBibG9ja3NQZXJTY2FubGluZTtcbiAgICAgIHZhciB4LCB5LCBpLCBqLCBrO1xuICAgICAgdmFyIGluZGV4O1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICB2YXIgb3V0cHV0O1xuICAgICAgdmFyIG51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgdmFyIGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7XG4gICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoKTtcbiAgICAgIHZhciB4U2NhbGVCbG9ja09mZnNldCA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCk7XG4gICAgICB2YXIgbWFzazNMU0IgPSAweGZmZmZmZmY4OyAvLyB1c2VkIHRvIGNsZWFyIHRoZSAzIExTQnNcbiAgICAgIGxldCBsYXN0Q29tcG9uZW50U2NhbGVYO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7XG4gICAgICAgIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpXTtcbiAgICAgICAgY29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50LnNjYWxlWCAqIHNjYWxlWDtcbiAgICAgICAgY29tcG9uZW50U2NhbGVZID0gY29tcG9uZW50LnNjYWxlWSAqIHNjYWxlWTtcbiAgICAgICAgb2Zmc2V0ID0gaTtcbiAgICAgICAgb3V0cHV0ID0gY29tcG9uZW50Lm91dHB1dDtcbiAgICAgICAgYmxvY2tzUGVyU2NhbmxpbmUgPSAoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSA8PCAzO1xuICAgICAgICAvLyBQcmVjYWxjdWxhdGUgdGhlIGB4U2NhbGVCbG9ja09mZnNldGAuIFNpbmNlIGl0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgZGF0YSwgdGhhdCdzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYGNvbXBvbmVudFNjYWxlWGAgY2hhbmdlcy5cbiAgICAgICAgaWYgKGNvbXBvbmVudFNjYWxlWCAhPT0gbGFzdENvbXBvbmVudFNjYWxlWCkge1xuICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBqID0gMCB8ICh4ICogY29tcG9uZW50U2NhbGVYKTtcbiAgICAgICAgICAgIHhTY2FsZUJsb2NrT2Zmc2V0W3hdID0gKChqICYgbWFzazNMU0IpIDw8IDMpIHwgKGogJiA3KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDtcbiAgICAgICAgfVxuICAgICAgICAvLyBsaW5lYXJpemUgdGhlIGJsb2NrcyBvZiB0aGUgY29tcG9uZW50XG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICAgIGogPSAwIHwgKHkgKiBjb21wb25lbnRTY2FsZVkpO1xuICAgICAgICAgIGluZGV4ID0gKGJsb2Nrc1BlclNjYW5saW5lICogKGogJiBtYXNrM0xTQikpIHwgKChqICYgNykgPDwgMyk7XG4gICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9IG91dHB1dFtpbmRleCArIHhTY2FsZUJsb2NrT2Zmc2V0W3hdXTtcbiAgICAgICAgICAgIG9mZnNldCArPSBudW1Db21wb25lbnRzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkZWNvZGVUcmFuc2Zvcm0gY29udGFpbnMgcGFpcnMgb2YgbXVsdGlwbGllciAoLTI1Ni4uMjU2KSBhbmQgYWRkaXRpdmVcbiAgICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07XG5cbiAgICAgIC8vIEluIFBERiBmaWxlcywgSlBFRyBpbWFnZXMgd2l0aCBDTVlLIGNvbG91ciBzcGFjZXMgYXJlIHVzdWFsbHkgaW52ZXJ0ZWRcbiAgICAgIC8vICh0aGlzIGNhbiBiZSBvYnNlcnZlZCBieSBleHRyYWN0aW5nIHRoZSByYXcgaW1hZ2UgZGF0YSkuXG4gICAgICAvLyBTaW5jZSB0aGUgY29udmVyc2lvbiBhbGdvcml0aG1zIChzZWUgYmVsb3cpIHdlcmUgd3JpdHRlbiBwcmltYXJpbHkgZm9yXG4gICAgICAvLyB0aGUgUERGIHVzZS1jYXNlcywgYXR0ZW1wdGluZyB0byB1c2UgYEpwZWdJbWFnZWAgdG8gcGFyc2Ugc3RhbmRhbG9uZVxuICAgICAgLy8gSlBFRyAoQ01ZSykgaW1hZ2VzIG1heSB0aHVzIHJlc3VsdCBpbiBpbnZlcnRlZCBpbWFnZXMgKHNlZSBpc3N1ZSA5NTEzKS5cbiAgICAgIC8vXG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0J3Mgbm90IChhbHdheXMpIHBvc3NpYmxlIHRvIHRlbGwsIGZyb20gdGhlIGltYWdlIGRhdGFcbiAgICAgIC8vIGFsb25lLCBpZiBpdCBuZWVkcyB0byBiZSBpbnZlcnRlZC4gVGh1cyBpbiBhbiBhdHRlbXB0IHRvIHByb3ZpZGUgYmV0dGVyXG4gICAgICAvLyBvdXQtb2YtYm94IGJlaGF2aW91ciB3aGVuIGBKcGVnSW1hZ2VgIGlzIHVzZWQgc3RhbmRhbG9uZSwgZGVmYXVsdCB0b1xuICAgICAgLy8gaW52ZXJ0aW5nIEpQRUcgKENNWUspIGltYWdlcyBpZiBhbmQgb25seSBpZiB0aGUgaW1hZ2UgZGF0YSBkb2VzICpub3QqXG4gICAgICAvLyBjb21lIGZyb20gYSBQREYgZmlsZSBhbmQgbm8gYGRlY29kZVRyYW5zZm9ybWAgd2FzIHBhc3NlZCBieSB0aGUgdXNlci5cbiAgICAgIGlmICghaXNTb3VyY2VQREYgJiYgbnVtQ29tcG9uZW50cyA9PT0gNCAmJiAhdHJhbnNmb3JtKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShbXG4gICAgICAgICAgLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1XSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICkge1xuICAgICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgbnVtQ29tcG9uZW50czsgaisrLCBpKyssIGsgKz0gMikge1xuICAgICAgICAgICAgZGF0YVtpXSA9ICgoZGF0YVtpXSAqIHRyYW5zZm9ybVtrXSkgPj4gOCkgKyB0cmFuc2Zvcm1bayArIDFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIGdldCBfaXNDb2xvckNvbnZlcnNpb25OZWVkZWQoKSB7XG4gICAgICBpZiAodGhpcy5hZG9iZSkge1xuICAgICAgICAvLyBUaGUgYWRvYmUgdHJhbnNmb3JtIG1hcmtlciBvdmVycmlkZXMgYW55IHByZXZpb3VzIHNldHRpbmcuXG4gICAgICAgIHJldHVybiAhIXRoaXMuYWRvYmUudHJhbnNmb3JtQ29kZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbG9yVHJhbnNmb3JtID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIEFkb2JlIHRyYW5zZm9ybSBtYXJrZXIgaXMgbm90IHByZXNlbnQgYW5kIHRoZSBpbWFnZVxuICAgICAgICAgIC8vIGRpY3Rpb25hcnkgaGFzIGEgJ0NvbG9yVHJhbnNmb3JtJyBlbnRyeSwgZXhwbGljaXRseSBzZXQgdG8gYDBgLFxuICAgICAgICAgIC8vIHRoZW4gdGhlIGNvbG91cnMgc2hvdWxkICpub3QqIGJlIHRyYW5zZm9ybWVkLlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbMF0uaW5kZXggPT09IC8qIFwiUlwiID0gKi8gMHg1MiAmJlxuICAgICAgICAgIHRoaXMuY29tcG9uZW50c1sxXS5pbmRleCA9PT0gLyogXCJHXCIgPSAqLyAweDQ3ICYmXG4gICAgICAgICAgdGhpcy5jb21wb25lbnRzWzJdLmluZGV4ID09PSAvKiBcIkJcIiA9ICovIDB4NDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHRocmVlIGNvbXBvbmVudHMgYXJlIGluZGV4ZWQgYXMgUkdCIGluIEFTQ0lJXG4gICAgICAgICAgLy8gdGhlbiB0aGUgY29sb3VycyBzaG91bGQgKm5vdCogYmUgdHJhbnNmb3JtZWQuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gYHRoaXMubnVtQ29tcG9uZW50cyAhPT0gM2BcbiAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMSkge1xuICAgICAgICAvLyBJZiB0aGUgQWRvYmUgdHJhbnNmb3JtIG1hcmtlciBpcyBub3QgcHJlc2VudCBhbmQgdGhlIGltYWdlXG4gICAgICAgIC8vIGRpY3Rpb25hcnkgaGFzIGEgJ0NvbG9yVHJhbnNmb3JtJyBlbnRyeSwgZXhwbGljaXRseSBzZXQgdG8gYDFgLFxuICAgICAgICAvLyB0aGVuIHRoZSBjb2xvdXJzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIF9jb252ZXJ0WWNjVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRZY2NUb1JnYihkYXRhKSB7XG4gICAgICB2YXIgWSwgQ2IsIENyO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGRhdGFbaV0gPSBZIC0gMTc5LjQ1NiArIDEuNDAyICogQ3I7XG4gICAgICAgIGRhdGFbaSArIDFdID0gWSArIDEzNS40NTkgLSAwLjM0NCAqIENiIC0gMC43MTQgKiBDcjtcbiAgICAgICAgZGF0YVtpICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRZY2NrVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRZY2NrVG9SZ2IoZGF0YSkge1xuICAgICAgdmFyIFksIENiLCBDciwgaztcbiAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGsgPSBkYXRhW2kgKyAzXTtcblxuICAgICAgICBkYXRhW29mZnNldCsrXSA9XG4gICAgICAgICAgLTEyMi42NzE5NTQwNjg5NCArXG4gICAgICAgICAgQ2IgKlxuICAgICAgICAgICAgKC02LjYwNjM1NjY5NDIwMzY0ZS01ICogQ2IgK1xuICAgICAgICAgICAgICAwLjAwMDQzNzEzMDQ3NTkyNjIzMiAqIENyIC1cbiAgICAgICAgICAgICAgNS40MDgwNjEwMDY0NTk5ZS01ICogWSArXG4gICAgICAgICAgICAgIDAuMDAwNDg0NDk3OTcxMjAyODEgKiBrIC1cbiAgICAgICAgICAgICAgMC4xNTQzNjIxNTE4NzExMjYpICtcbiAgICAgICAgICBDciAqXG4gICAgICAgICAgICAoLTAuMDAwOTU3OTY0Mzc4NDQ1NzczICogQ3IgK1xuICAgICAgICAgICAgICAwLjAwMDgxNzA3NjkxMTM0NjYyNSAqIFkgLVxuICAgICAgICAgICAgICAwLjAwNDc3MjcxNDA1NDA4NzQ3ICogayArXG4gICAgICAgICAgICAgIDEuNTMzODAyNTMyMjE3MzQpICtcbiAgICAgICAgICBZICpcbiAgICAgICAgICAgICgwLjAwMDk2MTI1MDE4NDEzMDY4OCAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjY2MjU3MzMyMjgzOTMzICogayArXG4gICAgICAgICAgICAgIDAuNDgzNTcwODg0NTEyNjUpICtcbiAgICAgICAgICBrICogKC0wLjAwMDMzNjE5NzE3NzYxODM5NCAqIGsgKyAwLjQ4NDc5MTU2MTQ5MDc3Nik7XG5cbiAgICAgICAgZGF0YVtvZmZzZXQrK10gPVxuICAgICAgICAgIDEwNy4yNjgwMzkzOTc3MjQgK1xuICAgICAgICAgIENiICpcbiAgICAgICAgICAgICgyLjE5OTI3MTA0NTI1NzQxZS01ICogQ2IgLVxuICAgICAgICAgICAgICAwLjAwMDY0MDk5MjAxODI5Nzk0NSAqIENyICtcbiAgICAgICAgICAgICAgMC4wMDA2NTkzOTcwMDEyNDU1NzcgKiBZICtcbiAgICAgICAgICAgICAgMC4wMDA0MjYxMDU2NTI5Mzg4MzcgKiBrIC1cbiAgICAgICAgICAgICAgMC4xNzY0OTE3OTI0NjI4NzUpICtcbiAgICAgICAgICBDciAqXG4gICAgICAgICAgICAoLTAuMDAwNzc4MjY5OTQxNTEzNjgzICogQ3IgK1xuICAgICAgICAgICAgICAwLjAwMTMwODcyMjYxNDA4Mjc1ICogWSArXG4gICAgICAgICAgICAgIDAuMDAwNzcwNDgyNjMxODAxMTMyICogayAtXG4gICAgICAgICAgICAgIDAuMTUxMDUxNDkyNzc1NTYyKSArXG4gICAgICAgICAgWSAqXG4gICAgICAgICAgICAoMC4wMDEyNjkzNTM2ODExNDg0MyAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjY1MDkwMTg5MDEwODk4ICogayArXG4gICAgICAgICAgICAgIDAuMjU4MDI5MTAyMDY4NDUpICtcbiAgICAgICAgICBrICogKC0wLjAwMDMxODkxMzExNzU4ODMyOCAqIGsgLSAwLjIxMzc0MjQwMDMyMzY2NSk7XG5cbiAgICAgICAgZGF0YVtvZmZzZXQrK10gPVxuICAgICAgICAgIC0yMC44MTAwMTI1NDY5NDcgK1xuICAgICAgICAgIENiICpcbiAgICAgICAgICAgICgtMC4wMDA1NzAxMTUxOTY5NzM2NzcgKiBDYiAtXG4gICAgICAgICAgICAgIDIuNjM0MDkwNTEwMDQ1ODllLTUgKiBDciArXG4gICAgICAgICAgICAgIDAuMDAyMDc0MTA4ODExNTAxMiAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjg4MjYwMjM2ODUzNDQyICogayArXG4gICAgICAgICAgICAgIDAuODE0MjcyOTY4MzU5Mjk1KSArXG4gICAgICAgICAgQ3IgKlxuICAgICAgICAgICAgKC0xLjUzNDk2MDU3NDQwOTc1ZS01ICogQ3IgLVxuICAgICAgICAgICAgICAwLjAwMDEzMjY4OTA0Mzk2MTQ0NiAqIFkgK1xuICAgICAgICAgICAgICAwLjAwMDU2MDgzMzY5MTI0MjgxMiAqIGsgLVxuICAgICAgICAgICAgICAwLjE5NTE1MjAyNzUzNDA0OSkgK1xuICAgICAgICAgIFkgKlxuICAgICAgICAgICAgKDAuMDAxNzQ0MTgxMzI5Mjc1ODIgKiBZIC1cbiAgICAgICAgICAgICAgMC4wMDI1NTI0MzMyMTQzOTM0NyAqIGsgK1xuICAgICAgICAgICAgICAwLjExNjkzNTAyMDQ2NTE0NSkgK1xuICAgICAgICAgIGsgKiAoLTAuMDAwMzQzNTMxOTk2NTEwNTU1ICogayArIDAuMjQxNjUyNjAyMzI0MDcpO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHRoYXQgb25seSB0aGUgY29udmVydGVkIFJHQiBkYXRhIGlzIHJldHVybmVkLlxuICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgb2Zmc2V0KTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRZY2NrVG9DbXlrOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7XG4gICAgICB2YXIgWSwgQ2IsIENyO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGRhdGFbaV0gPSA0MzQuNDU2IC0gWSAtIDEuNDAyICogQ3I7XG4gICAgICAgIGRhdGFbaSArIDFdID0gMTE5LjU0MSAtIFkgKyAwLjM0NCAqIENiICsgMC43MTQgKiBDcjtcbiAgICAgICAgZGF0YVtpICsgMl0gPSA0ODEuODE2IC0gWSAtIDEuNzcyICogQ2I7XG4gICAgICAgIC8vIEsgaW4gZGF0YVtpICsgM10gaXMgdW5jaGFuZ2VkXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRDbXlrVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRDbXlrVG9SZ2IoZGF0YSkge1xuICAgICAgdmFyIGMsIG0sIHksIGs7XG4gICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGMgPSBkYXRhW2ldO1xuICAgICAgICBtID0gZGF0YVtpICsgMV07XG4gICAgICAgIHkgPSBkYXRhW2kgKyAyXTtcbiAgICAgICAgayA9IGRhdGFbaSArIDNdO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKC0wLjAwMDA2NzQ3MTQ3MDczNjAyNDQxICogYyArXG4gICAgICAgICAgICAgIDAuMDAwODM3OTI2MjEyMTAxMzcyNyAqIG0gK1xuICAgICAgICAgICAgICAwLjAwMDI4OTQ3MTgxODg2NDMyOTQgKiB5ICtcbiAgICAgICAgICAgICAgMC4wMDMyNjQyMzEwNTc1Mzc4MDYgKiBrIC1cbiAgICAgICAgICAgICAgMS4xMTg1NjExODY3MjAzOTM3KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoMC4wMDAwMjYzNzQxMDc2MTYwODk0MDUgKiBtIC1cbiAgICAgICAgICAgICAgMC4wMDAwODYyNjk0OTE1ODYzODU3MiAqIHkgLVxuICAgICAgICAgICAgICAwLjAwMDI3NDg3NjkwNjc0OTk0OTEgKiBrIC1cbiAgICAgICAgICAgICAgMC4wMjE1NTY4ODc5NDk3ODk2NykgK1xuICAgICAgICAgIHkgKlxuICAgICAgICAgICAgKC0wLjAwMDAzODc4MDk5MjEyODY5MzYzICogeSAtXG4gICAgICAgICAgICAgIDAuMDAwMzI2NzgwODI3OTQ4NTI4NiAqIGsgK1xuICAgICAgICAgICAgICAwLjA2ODY3NDIyMzg1OTUzNDUpIC1cbiAgICAgICAgICBrICogKDAuMDAwMzM2MTk3MTc3NjE4MzkzNyAqIGsgKyAwLjc0MzA2NTkxNTEzNDIyNTQpO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKDAuMDAwMTM1OTYzNzI4MTM1ODg4NDggKiBjICtcbiAgICAgICAgICAgICAgMC4wMDA5MjQ1MzcxMzI1NzM1ODUgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDAxMDU2NzM1OTYxODY4MzU5MyAqIHkgK1xuICAgICAgICAgICAgICAwLjAwMDQ3OTE4NjQ2ODc0MzY1MTIgKiBrIC1cbiAgICAgICAgICAgICAgMC4zMTA5Njg5NTg3NTE1ODc1KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoLTAuMDAwMjM1NDUzNDYxMDgzNzAzNDQgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDAyNzAyODQ1MjUzNTM0NzE0ICogeSArXG4gICAgICAgICAgICAgIDAuMDAyMDIwMDMwODk3NzMwNzE1NiAqIGsgLVxuICAgICAgICAgICAgICAwLjc0ODgwNTIxNjcwMTU0OTQpICtcbiAgICAgICAgICB5ICpcbiAgICAgICAgICAgICgwLjAwMDA2ODM0ODE1OTk4MjM1NjYyICogeSArXG4gICAgICAgICAgICAgIDAuMDAwMTUxNjg0NTIzNjM0NjA5NzMgKiBrIC1cbiAgICAgICAgICAgICAgMC4wOTc1MTkyNzc3NDcyODkzMykgLVxuICAgICAgICAgIGsgKiAoMC4wMDAzMTg5MTMxMTc1ODgzMjgxNCAqIGsgKyAwLjczNjQ4ODM4MDc3MzMxNjgpO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKDAuMDAwMDEzNTk4NjUwNDExMzg1MzA3ICogYyArXG4gICAgICAgICAgICAgIDAuMDAwMTI0MjM5NTYxNzU0OTA4NTEgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDA0NzUxOTg1MDk3NTgzNTg5ICogeSAtXG4gICAgICAgICAgICAgIDAuMDAwMDAzNjcyOTMxNzQ3NjYzMDQyMiAqIGsgLVxuICAgICAgICAgICAgICAwLjA1NTYyMTg2OTgwMjY0MDM0KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoMC4wMDAxNjE0MTM4MDU5ODcyNDY3NiAqIG0gK1xuICAgICAgICAgICAgICAwLjAwMDk2OTIyMzkxMzA3MjUxODYgKiB5ICtcbiAgICAgICAgICAgICAgMC4wMDA3NzgyNjkyNDUwMDM2MjUzICogayAtXG4gICAgICAgICAgICAgIDAuNDQwMTUyMzIzNjc1MjY0NjMpICtcbiAgICAgICAgICB5ICpcbiAgICAgICAgICAgICg1LjA2ODg4MjkxNDA2ODc2OWUtNyAqIHkgK1xuICAgICAgICAgICAgICAwLjAwMTc3NzgzNjkwMTEzNzUwNzEgKiBrIC1cbiAgICAgICAgICAgICAgMC43NTkxNDU0NjQ5NzQ5NjA5KSAtXG4gICAgICAgICAgayAqICgwLjAwMDM0MzUzMTk5NjUxMDU1NTMgKiBrICsgMC43MDYzNzcwMTg2MTYwMTQ0KTtcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGF0IG9ubHkgdGhlIGNvbnZlcnRlZCBSR0IgZGF0YSBpcyByZXR1cm5lZC5cbiAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7XG4gICAgfSxcblxuICAgIGdldERhdGEoeyB3aWR0aCwgaGVpZ2h0LCBmb3JjZVJHQiA9IGZhbHNlLCBpc1NvdXJjZVBERiA9IGZhbHNlIH0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGlzU291cmNlUERGID09PSB0cnVlLFxuICAgICAgICAgICdKcGVnSW1hZ2UuZ2V0RGF0YTogVW5leHBlY3RlZCBcImlzU291cmNlUERGXCIgdmFsdWUgZm9yIFBERiBmaWxlcy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID4gNCkge1xuICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZVwiKTtcbiAgICAgIH1cbiAgICAgIC8vIFR5cGUgb2YgZGF0YTogVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiBudW1Db21wb25lbnRzKVxuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTtcblxuICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMSAmJiBmb3JjZVJHQikge1xuICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICB2YXIgcmdiRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoICogMyk7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBncmF5Q29sb3IgPSBkYXRhW2ldO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZ2JEYXRhO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMgJiYgdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSA0KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCkge1xuICAgICAgICAgIGlmIChmb3JjZVJHQikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2IoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JjZVJHQikge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBKcGVnSW1hZ2U7XG59KSgpO1xuXG5leHBvcnQgeyBKcGVnSW1hZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBEZWNvZGVTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcbmltcG9ydCB7IEpweEltYWdlIH0gZnJvbSBcIi4vanB4LmpzXCI7XG5pbXBvcnQgeyBzaGFkb3cgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuLyoqXG4gKiBGb3IgSlBFRyAyMDAwJ3Mgd2UgdXNlIGEgbGlicmFyeSB0byBkZWNvZGUgdGhlc2UgaW1hZ2VzIGFuZFxuICogdGhlIHN0cmVhbSBiZWhhdmVzIGxpa2UgYWxsIHRoZSBvdGhlciBEZWNvZGVTdHJlYW1zLlxuICovXG5jb25zdCBKcHhTdHJlYW0gPSAoZnVuY3Rpb24gSnB4U3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBKcHhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZGljdCwgcGFyYW1zKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5tYXliZUxlbmd0aCA9IG1heWJlTGVuZ3RoO1xuICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cbiAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7XG4gIH1cblxuICBKcHhTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSnB4U3RyZWFtLnByb3RvdHlwZSwgXCJieXRlc1wiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBKcHhTdHJlYW1fYnl0ZXMoKSB7XG4gICAgICAvLyBJZiBgdGhpcy5tYXliZUxlbmd0aGAgaXMgbnVsbCwgd2UnbGwgZ2V0IHRoZSBlbnRpcmUgc3RyZWFtLlxuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImJ5dGVzXCIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG5cbiAgSnB4U3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7XG4gICAgLy8gTm8tb3AsIHNpbmNlIGB0aGlzLnJlYWRCbG9ja2Agd2lsbCBhbHdheXMgcGFyc2UgdGhlIGVudGlyZSBpbWFnZSBhbmRcbiAgICAvLyBkaXJlY3RseSBpbnNlcnQgYWxsIG9mIGl0cyBkYXRhIGludG8gYHRoaXMuYnVmZmVyYC5cbiAgfTtcblxuICBKcHhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QganB4SW1hZ2UgPSBuZXcgSnB4SW1hZ2UoKTtcbiAgICBqcHhJbWFnZS5wYXJzZSh0aGlzLmJ5dGVzKTtcblxuICAgIGNvbnN0IHdpZHRoID0ganB4SW1hZ2Uud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0ganB4SW1hZ2UuaGVpZ2h0O1xuICAgIGNvbnN0IGNvbXBvbmVudHNDb3VudCA9IGpweEltYWdlLmNvbXBvbmVudHNDb3VudDtcbiAgICBjb25zdCB0aWxlQ291bnQgPSBqcHhJbWFnZS50aWxlcy5sZW5ndGg7XG4gICAgaWYgKHRpbGVDb3VudCA9PT0gMSkge1xuICAgICAgdGhpcy5idWZmZXIgPSBqcHhJbWFnZS50aWxlc1swXS5pdGVtcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIGNvbXBvbmVudHNDb3VudCk7XG5cbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGlsZUNvdW50OyBrKyspIHtcbiAgICAgICAgY29uc3QgdGlsZUNvbXBvbmVudHMgPSBqcHhJbWFnZS50aWxlc1trXTtcbiAgICAgICAgY29uc3QgdGlsZVdpZHRoID0gdGlsZUNvbXBvbmVudHMud2lkdGg7XG4gICAgICAgIGNvbnN0IHRpbGVIZWlnaHQgPSB0aWxlQ29tcG9uZW50cy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IHRpbGVMZWZ0ID0gdGlsZUNvbXBvbmVudHMubGVmdDtcbiAgICAgICAgY29uc3QgdGlsZVRvcCA9IHRpbGVDb21wb25lbnRzLnRvcDtcblxuICAgICAgICBjb25zdCBzcmMgPSB0aWxlQ29tcG9uZW50cy5pdGVtcztcbiAgICAgICAgbGV0IHNyY1Bvc2l0aW9uID0gMDtcbiAgICAgICAgbGV0IGRhdGFQb3NpdGlvbiA9ICh3aWR0aCAqIHRpbGVUb3AgKyB0aWxlTGVmdCkgKiBjb21wb25lbnRzQ291bnQ7XG4gICAgICAgIGNvbnN0IGltZ1Jvd1NpemUgPSB3aWR0aCAqIGNvbXBvbmVudHNDb3VudDtcbiAgICAgICAgY29uc3QgdGlsZVJvd1NpemUgPSB0aWxlV2lkdGggKiBjb21wb25lbnRzQ291bnQ7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aWxlSGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICBjb25zdCByb3dCeXRlcyA9IHNyYy5zdWJhcnJheShzcmNQb3NpdGlvbiwgc3JjUG9zaXRpb24gKyB0aWxlUm93U2l6ZSk7XG4gICAgICAgICAgZGF0YS5zZXQocm93Qnl0ZXMsIGRhdGFQb3NpdGlvbik7XG4gICAgICAgICAgc3JjUG9zaXRpb24gKz0gdGlsZVJvd1NpemU7XG4gICAgICAgICAgZGF0YVBvc2l0aW9uICs9IGltZ1Jvd1NpemU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB9XG4gICAgdGhpcy5idWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgdGhpcy5lb2YgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBKcHhTdHJlYW07XG59KSgpO1xuXG5leHBvcnQgeyBKcHhTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uLCBpbmZvLCB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBsb2cyLCByZWFkVWludDE2LCByZWFkVWludDMyIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgQXJpdGhtZXRpY0RlY29kZXIgfSBmcm9tIFwiLi9hcml0aG1ldGljX2RlY29kZXIuanNcIjtcblxuY2xhc3MgSnB4RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIoYEpQWCBlcnJvcjogJHttc2d9YCk7XG4gIH1cbn1cblxudmFyIEpweEltYWdlID0gKGZ1bmN0aW9uIEpweEltYWdlQ2xvc3VyZSgpIHtcbiAgLy8gVGFibGUgRS4xXG4gIHZhciBTdWJiYW5kc0dhaW5Mb2cyID0ge1xuICAgIExMOiAwLFxuICAgIExIOiAxLFxuICAgIEhMOiAxLFxuICAgIEhIOiAyLFxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gSnB4SW1hZ2UoKSB7XG4gICAgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSA9IGZhbHNlO1xuICB9XG4gIEpweEltYWdlLnByb3RvdHlwZSA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2UoZGF0YSkge1xuICAgICAgdmFyIGhlYWQgPSByZWFkVWludDE2KGRhdGEsIDApO1xuICAgICAgLy8gTm8gYm94IGhlYWRlciwgaW1tZWRpYXRlIHN0YXJ0IG9mIGNvZGVzdHJlYW0gKFNPQylcbiAgICAgIGlmIChoZWFkID09PSAweGZmNGYpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwb3NpdGlvbiA9IDAsXG4gICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBoZWFkZXJTaXplID0gODtcbiAgICAgICAgdmFyIGxib3ggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIHRib3ggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCk7XG4gICAgICAgIHBvc2l0aW9uICs9IGhlYWRlclNpemU7XG4gICAgICAgIGlmIChsYm94ID09PSAxKSB7XG4gICAgICAgICAgLy8gWExCb3g6IHJlYWQgVUludDY0IGFjY29yZGluZyB0byBzcGVjLlxuICAgICAgICAgIC8vIEphdmFTY3JpcHQncyBpbnQgcHJlY2lzaW9uIG9mIDUzIGJpdCBzaG91bGQgYmUgc3VmZmljaWVudCBoZXJlLlxuICAgICAgICAgIGxib3ggPVxuICAgICAgICAgICAgcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbikgKiA0Mjk0OTY3Mjk2ICtcbiAgICAgICAgICAgIHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KTtcbiAgICAgICAgICBwb3NpdGlvbiArPSA4O1xuICAgICAgICAgIGhlYWRlclNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGJveCA9PT0gMCkge1xuICAgICAgICAgIGxib3ggPSBsZW5ndGggLSBwb3NpdGlvbiArIGhlYWRlclNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxib3ggPCBoZWFkZXJTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiSW52YWxpZCBib3ggZmllbGQgc2l6ZVwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGxib3ggLSBoZWFkZXJTaXplO1xuICAgICAgICB2YXIganVtcERhdGFMZW5ndGggPSB0cnVlO1xuICAgICAgICBzd2l0Y2ggKHRib3gpIHtcbiAgICAgICAgICBjYXNlIDB4NmE3MDMyNjg6IC8vICdqcDJoJ1xuICAgICAgICAgICAganVtcERhdGFMZW5ndGggPSBmYWxzZTsgLy8gcGFyc2luZyBjaGlsZCBib3hlc1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDYzNmY2YzcyOiAvLyAnY29scidcbiAgICAgICAgICAgIC8vIENvbG9yc3BhY2VzIGFyZSBub3QgdXNlZCwgdGhlIENTIGZyb20gdGhlIFBERiBpcyB1c2VkLlxuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IGRhdGFbcG9zaXRpb25dO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gMSkge1xuICAgICAgICAgICAgICAvLyBlbnVtZXJhdGVkIGNvbG9yc3BhY2VcbiAgICAgICAgICAgICAgdmFyIGNvbG9yc3BhY2UgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMyk7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY29sb3JzcGFjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6IC8vIHRoaXMgaW5kaWNhdGVzIGEgc1JHQiBjb2xvcnNwYWNlXG4gICAgICAgICAgICAgICAgY2FzZSAxNzogLy8gdGhpcyBpbmRpY2F0ZXMgYSBncmF5c2NhbGUgY29sb3JzcGFjZVxuICAgICAgICAgICAgICAgIGNhc2UgMTg6IC8vIHRoaXMgaW5kaWNhdGVzIGEgWVVWIGNvbG9yc3BhY2VcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB3YXJuKFwiVW5rbm93biBjb2xvcnNwYWNlIFwiICsgY29sb3JzcGFjZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IDIpIHtcbiAgICAgICAgICAgICAgaW5mbyhcIklDQyBwcm9maWxlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4NmE3MDMyNjM6IC8vICdqcDJjJ1xuICAgICAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgcG9zaXRpb24sIHBvc2l0aW9uICsgZGF0YUxlbmd0aCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4NmE1MDIwMjA6IC8vICdqUFxcMDI0XFwwMjQnXG4gICAgICAgICAgICBpZiAocmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbikgIT09IDB4MGQwYTg3MGEpIHtcbiAgICAgICAgICAgICAgd2FybihcIkludmFsaWQgSlAyIHNpZ25hdHVyZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGVhZGVyIHR5cGVzIGFyZSB2YWxpZCBidXQgY3VycmVudGx5IG5vdCB1c2VkOlxuICAgICAgICAgIGNhc2UgMHg2YTUwMWExYTogLy8gJ2pQXFwwMzJcXDAzMidcbiAgICAgICAgICBjYXNlIDB4NjY3NDc5NzA6IC8vICdmdHlwJ1xuICAgICAgICAgIGNhc2UgMHg3MjcyNjU3MTogLy8gJ3JyZXEnXG4gICAgICAgICAgY2FzZSAweDcyNjU3MzIwOiAvLyAncmVzICdcbiAgICAgICAgICBjYXNlIDB4Njk2ODY0NzI6IC8vICdpaGRyJ1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciBoZWFkZXJUeXBlID0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICAgKHRib3ggPj4gMjQpICYgMHhmZixcbiAgICAgICAgICAgICAgKHRib3ggPj4gMTYpICYgMHhmZixcbiAgICAgICAgICAgICAgKHRib3ggPj4gOCkgJiAweGZmLFxuICAgICAgICAgICAgICB0Ym94ICYgMHhmZlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHdhcm4oXCJVbnN1cHBvcnRlZCBoZWFkZXIgdHlwZSBcIiArIHRib3ggKyBcIiAoXCIgKyBoZWFkZXJUeXBlICsgXCIpXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGp1bXBEYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgcG9zaXRpb24gKz0gZGF0YUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgcGFyc2VJbWFnZVByb3BlcnRpZXM6IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlSW1hZ2VQcm9wZXJ0aWVzKHN0cmVhbSkge1xuICAgICAgdmFyIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgd2hpbGUgKG5ld0J5dGUgPj0gMCkge1xuICAgICAgICB2YXIgb2xkQnl0ZSA9IG5ld0J5dGU7XG4gICAgICAgIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgY29kZSA9IChvbGRCeXRlIDw8IDgpIHwgbmV3Qnl0ZTtcbiAgICAgICAgLy8gSW1hZ2UgYW5kIHRpbGUgc2l6ZSAoU0laKVxuICAgICAgICBpZiAoY29kZSA9PT0gMHhmZjUxKSB7XG4gICAgICAgICAgc3RyZWFtLnNraXAoNCk7XG4gICAgICAgICAgdmFyIFhzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSA0XG4gICAgICAgICAgdmFyIFlzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSA4XG4gICAgICAgICAgdmFyIFhPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7IC8vIEJ5dGUgMTJcbiAgICAgICAgICB2YXIgWU9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSAxNlxuICAgICAgICAgIHN0cmVhbS5za2lwKDE2KTtcbiAgICAgICAgICB2YXIgQ3NpeiA9IHN0cmVhbS5nZXRVaW50MTYoKTsgLy8gQnl0ZSAzNlxuICAgICAgICAgIHRoaXMud2lkdGggPSBYc2l6IC0gWE9zaXo7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBZc2l6IC0gWU9zaXo7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRzQ291bnQgPSBDc2l6O1xuICAgICAgICAgIC8vIFJlc3VsdHMgYXJlIGFsd2F5cyByZXR1cm5lZCBhcyBgVWludDhDbGFtcGVkQXJyYXlgcy5cbiAgICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSA4O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbVwiKTtcbiAgICB9LFxuICAgIHBhcnNlQ29kZXN0cmVhbTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICB2YXIgZG9Ob3RSZWNvdmVyID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBzdGFydDtcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uICsgMSA8IGVuZCkge1xuICAgICAgICAgIHZhciBjb2RlID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24gKz0gMjtcblxuICAgICAgICAgIHZhciBsZW5ndGggPSAwLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIHNxY2QsXG4gICAgICAgICAgICBzcHFjZHMsXG4gICAgICAgICAgICBzcHFjZFNpemUsXG4gICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQsXG4gICAgICAgICAgICB0aWxlO1xuICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgY2FzZSAweGZmNGY6IC8vIFN0YXJ0IG9mIGNvZGVzdHJlYW0gKFNPQylcbiAgICAgICAgICAgICAgY29udGV4dC5tYWluSGVhZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmZkOTogLy8gRW5kIG9mIGNvZGVzdHJlYW0gKEVPQylcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1MTogLy8gSW1hZ2UgYW5kIHRpbGUgc2l6ZSAoU0laKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIHNpeiA9IHt9O1xuICAgICAgICAgICAgICBzaXouWHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KTtcbiAgICAgICAgICAgICAgc2l6LllzaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgOCk7XG4gICAgICAgICAgICAgIHNpei5YT3NpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxMik7XG4gICAgICAgICAgICAgIHNpei5ZT3NpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxNik7XG4gICAgICAgICAgICAgIHNpei5YVHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAyMCk7XG4gICAgICAgICAgICAgIHNpei5ZVHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAyNCk7XG4gICAgICAgICAgICAgIHNpei5YVE9zaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMjgpO1xuICAgICAgICAgICAgICBzaXouWVRPc2l6ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDMyKTtcbiAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAzNik7XG4gICAgICAgICAgICAgIHNpei5Dc2l6ID0gY29tcG9uZW50c0NvdW50O1xuICAgICAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAzODtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB7XG4gICAgICAgICAgICAgICAgICBwcmVjaXNpb246IChkYXRhW2pdICYgMHg3ZikgKyAxLFxuICAgICAgICAgICAgICAgICAgaXNTaWduZWQ6ICEhKGRhdGFbal0gJiAweDgwKSxcbiAgICAgICAgICAgICAgICAgIFhSc2l6OiBkYXRhW2ogKyAxXSxcbiAgICAgICAgICAgICAgICAgIFlSc2l6OiBkYXRhW2ogKyAyXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGogKz0gMztcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGNvbXBvbmVudCwgc2l6KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250ZXh0LlNJWiA9IHNpejtcbiAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgICAgICAgICAgICAgY2FsY3VsYXRlVGlsZUdyaWRzKGNvbnRleHQsIGNvbXBvbmVudHMpO1xuICAgICAgICAgICAgICBjb250ZXh0LlFDQyA9IFtdO1xuICAgICAgICAgICAgICBjb250ZXh0LkNPQyA9IFtdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjVjOiAvLyBRdWFudGl6YXRpb24gZGVmYXVsdCAoUUNEKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIHFjZCA9IHt9O1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyO1xuICAgICAgICAgICAgICBzcWNkID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHNxY2QgJiAweDFmKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gODtcbiAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSAxNjtcbiAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU1FjZCB2YWx1ZSBcIiArIHNxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjZC5ub1F1YW50aXphdGlvbiA9IHNwcWNkU2l6ZSA9PT0gODtcbiAgICAgICAgICAgICAgcWNkLnNjYWxhckV4cG91bmRlZCA9IHNjYWxhckV4cG91bmRlZDtcbiAgICAgICAgICAgICAgcWNkLmd1YXJkQml0cyA9IHNxY2QgPj4gNTtcbiAgICAgICAgICAgICAgc3BxY2RzID0gW107XG4gICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICsgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BxY2QgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9ICgoZGF0YVtqXSAmIDB4NykgPDwgOCkgfCBkYXRhW2ogKyAxXTtcbiAgICAgICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjZC5TUHFjZHMgPSBzcHFjZHM7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LlFDRCA9IHFjZDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRCA9IHFjZDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQyA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweGZmNWQ6IC8vIFF1YW50aXphdGlvbiBjb21wb25lbnQgKFFDQylcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHZhciBxY2MgPSB7fTtcbiAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjtcbiAgICAgICAgICAgICAgdmFyIGNxY2M7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0LlNJWi5Dc2l6IDwgMjU3KSB7XG4gICAgICAgICAgICAgICAgY3FjYyA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcWNjID0gcmVhZFVpbnQxNihkYXRhLCBqKTtcbiAgICAgICAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgc3dpdGNoIChzcWNkICYgMHgxZikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDg7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2O1xuICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNRY2QgdmFsdWUgXCIgKyBzcWNkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBxY2Mubm9RdWFudGl6YXRpb24gPSBzcHFjZFNpemUgPT09IDg7XG4gICAgICAgICAgICAgIHFjYy5zY2FsYXJFeHBvdW5kZWQgPSBzY2FsYXJFeHBvdW5kZWQ7XG4gICAgICAgICAgICAgIHFjYy5ndWFyZEJpdHMgPSBzcWNkID4+IDU7XG4gICAgICAgICAgICAgIHNwcWNkcyA9IFtdO1xuICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3BxY2QgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9ICgoZGF0YVtqXSAmIDB4NykgPDwgOCkgfCBkYXRhW2ogKyAxXTtcbiAgICAgICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjYy5TUHFjZHMgPSBzcHFjZHM7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LlFDQ1tjcWNjXSA9IHFjYztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjcWNjXSA9IHFjYztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjUyOiAvLyBDb2Rpbmcgc3R5bGUgZGVmYXVsdCAoQ09EKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIGNvZCA9IHt9O1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyO1xuICAgICAgICAgICAgICB2YXIgc2NvZCA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgY29kLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMgPSAhIShzY29kICYgMSk7XG4gICAgICAgICAgICAgIGNvZC5zb3BNYXJrZXJVc2VkID0gISEoc2NvZCAmIDIpO1xuICAgICAgICAgICAgICBjb2QuZXBoTWFya2VyVXNlZCA9ICEhKHNjb2QgJiA0KTtcbiAgICAgICAgICAgICAgY29kLnByb2dyZXNzaW9uT3JkZXIgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIGNvZC5sYXllcnNDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgaik7XG4gICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgY29kLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtID0gZGF0YVtqKytdO1xuXG4gICAgICAgICAgICAgIGNvZC5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIGNvZC54Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7XG4gICAgICAgICAgICAgIGNvZC55Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7XG4gICAgICAgICAgICAgIHZhciBibG9ja1N0eWxlID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICBjb2Quc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyA9ICEhKGJsb2NrU3R5bGUgJiAxKTtcbiAgICAgICAgICAgICAgY29kLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMgPSAhIShibG9ja1N0eWxlICYgMik7XG4gICAgICAgICAgICAgIGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MgPSAhIShibG9ja1N0eWxlICYgNCk7XG4gICAgICAgICAgICAgIGNvZC52ZXJ0aWNhbGx5U3RyaXBlID0gISEoYmxvY2tTdHlsZSAmIDgpO1xuICAgICAgICAgICAgICBjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbiA9ICEhKGJsb2NrU3R5bGUgJiAxNik7XG4gICAgICAgICAgICAgIGNvZC5zZWdtZW50YXRpb25TeW1ib2xVc2VkID0gISEoYmxvY2tTdHlsZSAmIDMyKTtcbiAgICAgICAgICAgICAgY29kLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbiA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgaWYgKGNvZC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemVzID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemUgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgICAgICBwcmVjaW5jdHNTaXplcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgUFB4OiBwcmVjaW5jdHNTaXplICYgMHhmLFxuICAgICAgICAgICAgICAgICAgICBQUHk6IHByZWNpbmN0c1NpemUgPj4gNCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2QucHJlY2luY3RzU2l6ZXMgPSBwcmVjaW5jdHNTaXplcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgdW5zdXBwb3J0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgaWYgKGNvZC5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzKSB7XG4gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaChcInNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3NcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzKSB7XG4gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaChcInJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXNcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MpIHtcbiAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKFwidGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2QudmVydGljYWxseVN0cmlwZSkge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goXCJ2ZXJ0aWNhbGx5U3RyaXBlXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbikge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goXCJwcmVkaWN0YWJsZVRlcm1pbmF0aW9uXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZG9Ob3RSZWNvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIlVuc3VwcG9ydGVkIENPRCBvcHRpb25zIChcIiArIHVuc3VwcG9ydGVkLmpvaW4oXCIsIFwiKSArIFwiKVwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5DT0QgPSBjb2Q7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0QgPSBjb2Q7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0MgPSBbXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjkwOiAvLyBTdGFydCBvZiB0aWxlLXBhcnQgKFNPVClcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHRpbGUgPSB7fTtcbiAgICAgICAgICAgICAgdGlsZS5pbmRleCA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAyKTtcbiAgICAgICAgICAgICAgdGlsZS5sZW5ndGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCk7XG4gICAgICAgICAgICAgIHRpbGUuZGF0YUVuZCA9IHRpbGUubGVuZ3RoICsgcG9zaXRpb24gLSAyO1xuICAgICAgICAgICAgICB0aWxlLnBhcnRJbmRleCA9IGRhdGFbcG9zaXRpb24gKyA4XTtcbiAgICAgICAgICAgICAgdGlsZS5wYXJ0c0NvdW50ID0gZGF0YVtwb3NpdGlvbiArIDldO1xuXG4gICAgICAgICAgICAgIGNvbnRleHQubWFpbkhlYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZXNldCBjb21wb25lbnQgc3BlY2lmaWMgc2V0dGluZ3NcbiAgICAgICAgICAgICAgICB0aWxlLkNPRCA9IGNvbnRleHQuQ09EO1xuICAgICAgICAgICAgICAgIHRpbGUuQ09DID0gY29udGV4dC5DT0Muc2xpY2UoMCk7IC8vIGNsb25lIG9mIHRoZSBnbG9iYWwgQ09DXG4gICAgICAgICAgICAgICAgdGlsZS5RQ0QgPSBjb250ZXh0LlFDRDtcbiAgICAgICAgICAgICAgICB0aWxlLlFDQyA9IGNvbnRleHQuUUNDLnNsaWNlKDApOyAvLyBjbG9uZSBvZiB0aGUgZ2xvYmFsIENPQ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUgPSB0aWxlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjkzOiAvLyBTdGFydCBvZiBkYXRhIChTT0QpXG4gICAgICAgICAgICAgIHRpbGUgPSBjb250ZXh0LmN1cnJlbnRUaWxlO1xuICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsaXplVGlsZShjb250ZXh0LCB0aWxlLmluZGV4KTtcbiAgICAgICAgICAgICAgICBidWlsZFBhY2tldHMoY29udGV4dCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBtb3ZpbmcgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YVxuICAgICAgICAgICAgICBsZW5ndGggPSB0aWxlLmRhdGFFbmQgLSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgcGFyc2VUaWxlUGFja2V0cyhjb250ZXh0LCBkYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1NTogLy8gVGlsZS1wYXJ0IGxlbmd0aHMsIG1haW4gaGVhZGVyIChUTE0pXG4gICAgICAgICAgICBjYXNlIDB4ZmY1NzogLy8gUGFja2V0IGxlbmd0aCwgbWFpbiBoZWFkZXIgKFBMTSlcbiAgICAgICAgICAgIGNhc2UgMHhmZjU4OiAvLyBQYWNrZXQgbGVuZ3RoLCB0aWxlLXBhcnQgaGVhZGVyIChQTFQpXG4gICAgICAgICAgICBjYXNlIDB4ZmY2NDogLy8gQ29tbWVudCAoQ09NKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgLy8gc2tpcHBpbmcgY29udGVudFxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjUzOiAvLyBDb2Rpbmcgc3R5bGUgY29tcG9uZW50IChDT0MpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNvZGVzdHJlYW0gY29kZSAweEZGNTMgKENPQykgaXMgbm90IGltcGxlbWVudGVkXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29kZXN0cmVhbSBjb2RlOiBcIiArIGNvZGUudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb05vdFJlY292ZXIgfHwgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJKUFg6IFRyeWluZyB0byByZWNvdmVyIGZyb206IFwiICsgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy50aWxlcyA9IHRyYW5zZm9ybUNvbXBvbmVudHMoY29udGV4dCk7XG4gICAgICB0aGlzLndpZHRoID0gY29udGV4dC5TSVouWHNpeiAtIGNvbnRleHQuU0laLlhPc2l6O1xuICAgICAgdGhpcy5oZWlnaHQgPSBjb250ZXh0LlNJWi5Zc2l6IC0gY29udGV4dC5TSVouWU9zaXo7XG4gICAgICB0aGlzLmNvbXBvbmVudHNDb3VudCA9IGNvbnRleHQuU0laLkNzaXo7XG4gICAgfSxcbiAgfTtcbiAgZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhjb21wb25lbnQsIHNpeikge1xuICAgIC8vIFNlY3Rpb24gQi4yIENvbXBvbmVudCBtYXBwaW5nXG4gICAgY29tcG9uZW50LngwID0gTWF0aC5jZWlsKHNpei5YT3NpeiAvIGNvbXBvbmVudC5YUnNpeik7XG4gICAgY29tcG9uZW50LngxID0gTWF0aC5jZWlsKHNpei5Yc2l6IC8gY29tcG9uZW50LlhSc2l6KTtcbiAgICBjb21wb25lbnQueTAgPSBNYXRoLmNlaWwoc2l6LllPc2l6IC8gY29tcG9uZW50LllSc2l6KTtcbiAgICBjb21wb25lbnQueTEgPSBNYXRoLmNlaWwoc2l6LllzaXogLyBjb21wb25lbnQuWVJzaXopO1xuICAgIGNvbXBvbmVudC53aWR0aCA9IGNvbXBvbmVudC54MSAtIGNvbXBvbmVudC54MDtcbiAgICBjb21wb25lbnQuaGVpZ2h0ID0gY29tcG9uZW50LnkxIC0gY29tcG9uZW50LnkwO1xuICB9XG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVHcmlkcyhjb250ZXh0LCBjb21wb25lbnRzKSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIC8vIFNlY3Rpb24gQi4zIERpdmlzaW9uIGludG8gdGlsZSBhbmQgdGlsZS1jb21wb25lbnRzXG4gICAgdmFyIHRpbGUsXG4gICAgICB0aWxlcyA9IFtdO1xuICAgIHZhciBudW1YdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Yc2l6IC0gc2l6LlhUT3NpeikgLyBzaXouWFRzaXopO1xuICAgIHZhciBudW1ZdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Zc2l6IC0gc2l6LllUT3NpeikgLyBzaXouWVRzaXopO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgbnVtWXRpbGVzOyBxKyspIHtcbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgbnVtWHRpbGVzOyBwKyspIHtcbiAgICAgICAgdGlsZSA9IHt9O1xuICAgICAgICB0aWxlLnR4MCA9IE1hdGgubWF4KHNpei5YVE9zaXogKyBwICogc2l6LlhUc2l6LCBzaXouWE9zaXopO1xuICAgICAgICB0aWxlLnR5MCA9IE1hdGgubWF4KHNpei5ZVE9zaXogKyBxICogc2l6LllUc2l6LCBzaXouWU9zaXopO1xuICAgICAgICB0aWxlLnR4MSA9IE1hdGgubWluKHNpei5YVE9zaXogKyAocCArIDEpICogc2l6LlhUc2l6LCBzaXouWHNpeik7XG4gICAgICAgIHRpbGUudHkxID0gTWF0aC5taW4oc2l6LllUT3NpeiArIChxICsgMSkgKiBzaXouWVRzaXosIHNpei5Zc2l6KTtcbiAgICAgICAgdGlsZS53aWR0aCA9IHRpbGUudHgxIC0gdGlsZS50eDA7XG4gICAgICAgIHRpbGUuaGVpZ2h0ID0gdGlsZS50eTEgLSB0aWxlLnR5MDtcbiAgICAgICAgdGlsZS5jb21wb25lbnRzID0gW107XG4gICAgICAgIHRpbGVzLnB1c2godGlsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQudGlsZXMgPSB0aWxlcztcblxuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjb21wb25lbnRzQ291bnQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHRpbGVzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgdmFyIHRpbGVDb21wb25lbnQgPSB7fTtcbiAgICAgICAgdGlsZSA9IHRpbGVzW2pdO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDAgPSBNYXRoLmNlaWwodGlsZS50eDAgLyBjb21wb25lbnQuWFJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTAgPSBNYXRoLmNlaWwodGlsZS50eTAgLyBjb21wb25lbnQuWVJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDEgPSBNYXRoLmNlaWwodGlsZS50eDEgLyBjb21wb25lbnQuWFJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTEgPSBNYXRoLmNlaWwodGlsZS50eTEgLyBjb21wb25lbnQuWVJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LndpZHRoID0gdGlsZUNvbXBvbmVudC50Y3gxIC0gdGlsZUNvbXBvbmVudC50Y3gwO1xuICAgICAgICB0aWxlQ29tcG9uZW50LmhlaWdodCA9IHRpbGVDb21wb25lbnQudGN5MSAtIHRpbGVDb21wb25lbnQudGN5MDtcbiAgICAgICAgdGlsZS5jb21wb25lbnRzW2ldID0gdGlsZUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpIHtcbiAgICB2YXIgY29kT3JDb2MgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAoIWNvZE9yQ29jLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpIHtcbiAgICAgIHJlc3VsdC5QUHggPSAxNTtcbiAgICAgIHJlc3VsdC5QUHkgPSAxNTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LlBQeCA9IGNvZE9yQ29jLnByZWNpbmN0c1NpemVzW3JdLlBQeDtcbiAgICAgIHJlc3VsdC5QUHkgPSBjb2RPckNvYy5wcmVjaW5jdHNTaXplc1tyXS5QUHk7XG4gICAgfVxuICAgIC8vIGNhbGN1bGF0ZSBjb2RlYmxvY2sgc2l6ZSBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiBCLjdcbiAgICByZXN1bHQueGNiXyA9XG4gICAgICByID4gMFxuICAgICAgICA/IE1hdGgubWluKGNvZE9yQ29jLnhjYiwgcmVzdWx0LlBQeCAtIDEpXG4gICAgICAgIDogTWF0aC5taW4oY29kT3JDb2MueGNiLCByZXN1bHQuUFB4KTtcbiAgICByZXN1bHQueWNiXyA9XG4gICAgICByID4gMFxuICAgICAgICA/IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSAtIDEpXG4gICAgICAgIDogTWF0aC5taW4oY29kT3JDb2MueWNiLCByZXN1bHQuUFB5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkUHJlY2luY3RzKGNvbnRleHQsIHJlc29sdXRpb24sIGRpbWVuc2lvbnMpIHtcbiAgICAvLyBTZWN0aW9uIEIuNiBEaXZpc2lvbiByZXNvbHV0aW9uIHRvIHByZWNpbmN0c1xuICAgIHZhciBwcmVjaW5jdFdpZHRoID0gMSA8PCBkaW1lbnNpb25zLlBQeDtcbiAgICB2YXIgcHJlY2luY3RIZWlnaHQgPSAxIDw8IGRpbWVuc2lvbnMuUFB5O1xuICAgIC8vIEphc3BlciBpbnRyb2R1Y2VzIGNvZGVibG9jayBncm91cHMgZm9yIG1hcHBpbmcgZWFjaCBzdWJiYW5kIGNvZGVibG9ja3NcbiAgICAvLyB0byBwcmVjaW5jdHMuIFByZWNpbmN0IHBhcnRpdGlvbiBkaXZpZGVzIGEgcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gd2lkdGhcbiAgICAvLyBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMuIFRoZSBzdWJiYW5kIHRoYXQgYmVsb25ncyB0byB0aGUgcmVzb2x1dGlvbiBsZXZlbFxuICAgIC8vIGhhcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gdGhlIGxldmVsLCB1bmxlc3MgaXQgaXMgdGhlIHplcm8gcmVzb2x1dGlvbi5cblxuICAgIC8vIEZyb20gSmFzcGVyIGRvY3VtZW50YXRpb246IGpwZWcyMDAwLnBkZiwgc2VjdGlvbiBLOiBUaWVyLTIgY29kaW5nOlxuICAgIC8vIFRoZSBwcmVjaW5jdCBwYXJ0aXRpb25pbmcgZm9yIGEgcGFydGljdWxhciBzdWJiYW5kIGlzIGRlcml2ZWQgZnJvbSBhXG4gICAgLy8gcGFydGl0aW9uaW5nIG9mIGl0cyBwYXJlbnQgTEwgYmFuZCAoaS5lLiwgdGhlIExMIGJhbmQgYXQgdGhlIG5leHQgaGlnaGVyXG4gICAgLy8gcmVzb2x1dGlvbiBsZXZlbCkuLi4gVGhlIExMIGJhbmQgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCBpc1xuICAgIC8vIGRpdmlkZWQgaW50byBwcmVjaW5jdHMuLi4gRWFjaCBvZiB0aGUgcmVzdWx0aW5nIHByZWNpbmN0IHJlZ2lvbnMgaXMgdGhlblxuICAgIC8vIG1hcHBlZCBpbnRvIGl0cyBjaGlsZCBzdWJiYW5kcyAoaWYgYW55KSBhdCB0aGUgbmV4dCBsb3dlciByZXNvbHV0aW9uXG4gICAgLy8gbGV2ZWwuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uXG4gICAgLy8gKHUsIHYpID0gKGNlaWwoeC8yKSwgY2VpbCh5LzIpKSB3aGVyZSAoeCwgeSkgYW5kICh1LCB2KSBhcmUgdGhlXG4gICAgLy8gY29vcmRpbmF0ZXMgb2YgYSBwb2ludCBpbiB0aGUgTEwgYmFuZCBhbmQgY2hpbGQgc3ViYmFuZCwgcmVzcGVjdGl2ZWx5LlxuICAgIHZhciBpc1plcm9SZXMgPSByZXNvbHV0aW9uLnJlc0xldmVsID09PSAwO1xuICAgIHZhciBwcmVjaW5jdFdpZHRoSW5TdWJiYW5kID0gMSA8PCAoZGltZW5zaW9ucy5QUHggKyAoaXNaZXJvUmVzID8gMCA6IC0xKSk7XG4gICAgdmFyIHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kID0gMSA8PCAoZGltZW5zaW9ucy5QUHkgKyAoaXNaZXJvUmVzID8gMCA6IC0xKSk7XG4gICAgdmFyIG51bXByZWNpbmN0c3dpZGUgPVxuICAgICAgcmVzb2x1dGlvbi50cngxID4gcmVzb2x1dGlvbi50cngwXG4gICAgICAgID8gTWF0aC5jZWlsKHJlc29sdXRpb24udHJ4MSAvIHByZWNpbmN0V2lkdGgpIC1cbiAgICAgICAgICBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ4MCAvIHByZWNpbmN0V2lkdGgpXG4gICAgICAgIDogMDtcbiAgICB2YXIgbnVtcHJlY2luY3RzaGlnaCA9XG4gICAgICByZXNvbHV0aW9uLnRyeTEgPiByZXNvbHV0aW9uLnRyeTBcbiAgICAgICAgPyBNYXRoLmNlaWwocmVzb2x1dGlvbi50cnkxIC8gcHJlY2luY3RIZWlnaHQpIC1cbiAgICAgICAgICBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ5MCAvIHByZWNpbmN0SGVpZ2h0KVxuICAgICAgICA6IDA7XG4gICAgdmFyIG51bXByZWNpbmN0cyA9IG51bXByZWNpbmN0c3dpZGUgKiBudW1wcmVjaW5jdHNoaWdoO1xuXG4gICAgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMgPSB7XG4gICAgICBwcmVjaW5jdFdpZHRoLFxuICAgICAgcHJlY2luY3RIZWlnaHQsXG4gICAgICBudW1wcmVjaW5jdHN3aWRlLFxuICAgICAgbnVtcHJlY2luY3RzaGlnaCxcbiAgICAgIG51bXByZWNpbmN0cyxcbiAgICAgIHByZWNpbmN0V2lkdGhJblN1YmJhbmQsXG4gICAgICBwcmVjaW5jdEhlaWdodEluU3ViYmFuZCxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBkaW1lbnNpb25zKSB7XG4gICAgLy8gU2VjdGlvbiBCLjcgRGl2aXNpb24gc3ViLWJhbmQgaW50byBjb2RlLWJsb2Nrc1xuICAgIHZhciB4Y2JfID0gZGltZW5zaW9ucy54Y2JfO1xuICAgIHZhciB5Y2JfID0gZGltZW5zaW9ucy55Y2JfO1xuICAgIHZhciBjb2RlYmxvY2tXaWR0aCA9IDEgPDwgeGNiXztcbiAgICB2YXIgY29kZWJsb2NrSGVpZ2h0ID0gMSA8PCB5Y2JfO1xuICAgIHZhciBjYngwID0gc3ViYmFuZC50YngwID4+IHhjYl87XG4gICAgdmFyIGNieTAgPSBzdWJiYW5kLnRieTAgPj4geWNiXztcbiAgICB2YXIgY2J4MSA9IChzdWJiYW5kLnRieDEgKyBjb2RlYmxvY2tXaWR0aCAtIDEpID4+IHhjYl87XG4gICAgdmFyIGNieTEgPSAoc3ViYmFuZC50YnkxICsgY29kZWJsb2NrSGVpZ2h0IC0gMSkgPj4geWNiXztcbiAgICB2YXIgcHJlY2luY3RQYXJhbWV0ZXJzID0gc3ViYmFuZC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycztcbiAgICB2YXIgY29kZWJsb2NrcyA9IFtdO1xuICAgIHZhciBwcmVjaW5jdHMgPSBbXTtcbiAgICB2YXIgaSwgaiwgY29kZWJsb2NrLCBwcmVjaW5jdE51bWJlcjtcbiAgICBmb3IgKGogPSBjYnkwOyBqIDwgY2J5MTsgaisrKSB7XG4gICAgICBmb3IgKGkgPSBjYngwOyBpIDwgY2J4MTsgaSsrKSB7XG4gICAgICAgIGNvZGVibG9jayA9IHtcbiAgICAgICAgICBjYng6IGksXG4gICAgICAgICAgY2J5OiBqLFxuICAgICAgICAgIHRieDA6IGNvZGVibG9ja1dpZHRoICogaSxcbiAgICAgICAgICB0YnkwOiBjb2RlYmxvY2tIZWlnaHQgKiBqLFxuICAgICAgICAgIHRieDE6IGNvZGVibG9ja1dpZHRoICogKGkgKyAxKSxcbiAgICAgICAgICB0YnkxOiBjb2RlYmxvY2tIZWlnaHQgKiAoaiArIDEpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvZGVibG9jay50YngwXyA9IE1hdGgubWF4KHN1YmJhbmQudGJ4MCwgY29kZWJsb2NrLnRieDApO1xuICAgICAgICBjb2RlYmxvY2sudGJ5MF8gPSBNYXRoLm1heChzdWJiYW5kLnRieTAsIGNvZGVibG9jay50YnkwKTtcbiAgICAgICAgY29kZWJsb2NrLnRieDFfID0gTWF0aC5taW4oc3ViYmFuZC50YngxLCBjb2RlYmxvY2sudGJ4MSk7XG4gICAgICAgIGNvZGVibG9jay50YnkxXyA9IE1hdGgubWluKHN1YmJhbmQudGJ5MSwgY29kZWJsb2NrLnRieTEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBwcmVjaW5jdCBudW1iZXIgZm9yIHRoaXMgY29kZWJsb2NrLCBjb2RlYmxvY2sgcG9zaXRpb25cbiAgICAgICAgLy8gc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGl0cyBzdWJiYW5kLCB1c2UgYWN0dWFsIGRpbWVuc2lvbiBhbmQgcG9zaXRpb25cbiAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdXQgY29kZWJsb2NrIGdyb3VwIHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgdmFyIHBpID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAoY29kZWJsb2NrLnRieDBfIC0gc3ViYmFuZC50YngwKSAvXG4gICAgICAgICAgICBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aEluU3ViYmFuZFxuICAgICAgICApO1xuICAgICAgICB2YXIgcGogPSBNYXRoLmZsb29yKFxuICAgICAgICAgIChjb2RlYmxvY2sudGJ5MF8gLSBzdWJiYW5kLnRieTApIC9cbiAgICAgICAgICAgIHByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdEhlaWdodEluU3ViYmFuZFxuICAgICAgICApO1xuICAgICAgICBwcmVjaW5jdE51bWJlciA9IHBpICsgcGogKiBwcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTtcblxuICAgICAgICBjb2RlYmxvY2sucHJlY2luY3ROdW1iZXIgPSBwcmVjaW5jdE51bWJlcjtcbiAgICAgICAgY29kZWJsb2NrLnN1YmJhbmRUeXBlID0gc3ViYmFuZC50eXBlO1xuICAgICAgICBjb2RlYmxvY2suTGJsb2NrID0gMztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29kZWJsb2NrLnRieDFfIDw9IGNvZGVibG9jay50YngwXyB8fFxuICAgICAgICAgIGNvZGVibG9jay50YnkxXyA8PSBjb2RlYmxvY2sudGJ5MF9cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7XG4gICAgICAgIC8vIGJ1aWxkaW5nIHByZWNpbmN0IGZvciB0aGUgc3ViLWJhbmRcbiAgICAgICAgdmFyIHByZWNpbmN0ID0gcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXTtcbiAgICAgICAgaWYgKHByZWNpbmN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoaSA8IHByZWNpbmN0LmNieE1pbikge1xuICAgICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gaTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBwcmVjaW5jdC5jYnhNYXgpIHtcbiAgICAgICAgICAgIHByZWNpbmN0LmNieE1heCA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqIDwgcHJlY2luY3QuY2J5TWluKSB7XG4gICAgICAgICAgICBwcmVjaW5jdC5jYnhNaW4gPSBqO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaiA+IHByZWNpbmN0LmNieU1heCkge1xuICAgICAgICAgICAgcHJlY2luY3QuY2J5TWF4ID0gajtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXSA9IHByZWNpbmN0ID0ge1xuICAgICAgICAgICAgY2J4TWluOiBpLFxuICAgICAgICAgICAgY2J5TWluOiBqLFxuICAgICAgICAgICAgY2J4TWF4OiBpLFxuICAgICAgICAgICAgY2J5TWF4OiBqLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0ID0gcHJlY2luY3Q7XG4gICAgICB9XG4gICAgfVxuICAgIHN1YmJhbmQuY29kZWJsb2NrUGFyYW1ldGVycyA9IHtcbiAgICAgIGNvZGVibG9ja1dpZHRoOiB4Y2JfLFxuICAgICAgY29kZWJsb2NrSGVpZ2h0OiB5Y2JfLFxuICAgICAgbnVtY29kZWJsb2Nrd2lkZTogY2J4MSAtIGNieDAgKyAxLFxuICAgICAgbnVtY29kZWJsb2NraGlnaDogY2J5MSAtIGNieTAgKyAxLFxuICAgIH07XG4gICAgc3ViYmFuZC5jb2RlYmxvY2tzID0gY29kZWJsb2NrcztcbiAgICBzdWJiYW5kLnByZWNpbmN0cyA9IHByZWNpbmN0cztcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcHJlY2luY3ROdW1iZXIsIGxheWVyTnVtYmVyKSB7XG4gICAgdmFyIHByZWNpbmN0Q29kZWJsb2NrcyA9IFtdO1xuICAgIC8vIFNlY3Rpb24gQi4xMC44IE9yZGVyIG9mIGluZm8gaW4gcGFja2V0XG4gICAgdmFyIHN1YmJhbmRzID0gcmVzb2x1dGlvbi5zdWJiYW5kcztcbiAgICAvLyBzdWItYmFuZHMgYWxyZWFkeSBvcmRlcmVkIGluICdMTCcsICdITCcsICdMSCcsIGFuZCAnSEgnIHNlcXVlbmNlXG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHN1YmJhbmQgPSBzdWJiYW5kc1tpXTtcbiAgICAgIHZhciBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gY29kZWJsb2Nrcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHZhciBjb2RlYmxvY2sgPSBjb2RlYmxvY2tzW2pdO1xuICAgICAgICBpZiAoY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyICE9PSBwcmVjaW5jdE51bWJlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHByZWNpbmN0Q29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsYXllck51bWJlcixcbiAgICAgIGNvZGVibG9ja3M6IHByZWNpbmN0Q29kZWJsb2NrcyxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHtcbiAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsXG4gICAgICAgIHRpbGUuY29tcG9uZW50c1txXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBsID0gMCxcbiAgICAgIHIgPSAwLFxuICAgICAgaSA9IDAsXG4gICAgICBrID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS4xIExheWVyLXJlc29sdXRpb24tY29tcG9uZW50LXBvc2l0aW9uXG4gICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHtcbiAgICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7ICkge1xuICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpO1xuICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgciA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHtcbiAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsXG4gICAgICAgIHRpbGUuY29tcG9uZW50c1txXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciByID0gMCxcbiAgICAgIGwgPSAwLFxuICAgICAgaSA9IDAsXG4gICAgICBrID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS4yIFJlc29sdXRpb24tbGF5ZXItY29tcG9uZW50LXBvc2l0aW9uXG4gICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykge1xuICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHtcbiAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7ICkge1xuICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpO1xuICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbCA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFJlc29sdXRpb25Qb3NpdGlvbkNvbXBvbmVudExheWVySXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBsLCByLCBjLCBwO1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgoXG4gICAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCxcbiAgICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnRcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciBtYXhOdW1QcmVjaW5jdHNJbkxldmVsID0gbmV3IEludDMyQXJyYXkoXG4gICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgKyAxXG4gICAgKTtcbiAgICBmb3IgKHIgPSAwOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgKytyKSB7XG4gICAgICB2YXIgbWF4TnVtUHJlY2luY3RzID0gMDtcbiAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7ICsrYykge1xuICAgICAgICB2YXIgcmVzb2x1dGlvbnMgPSB0aWxlLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnM7XG4gICAgICAgIGlmIChyIDwgcmVzb2x1dGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgbWF4TnVtUHJlY2luY3RzID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBtYXhOdW1QcmVjaW5jdHMsXG4gICAgICAgICAgICByZXNvbHV0aW9uc1tyXS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF4TnVtUHJlY2luY3RzSW5MZXZlbFtyXSA9IG1heE51bVByZWNpbmN0cztcbiAgICB9XG4gICAgbCA9IDA7XG4gICAgciA9IDA7XG4gICAgYyA9IDA7XG4gICAgcCA9IDA7XG5cbiAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkge1xuICAgICAgLy8gU2VjdGlvbiBCLjEyLjEuMyBSZXNvbHV0aW9uLXBvc2l0aW9uLWNvbXBvbmVudC1sYXllclxuICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgZm9yICg7IHAgPCBtYXhOdW1QcmVjaW5jdHNJbkxldmVsW3JdOyBwKyspIHtcbiAgICAgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBpZiAociA+IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgaWYgKHAgPj0gbnVtcHJlY2luY3RzKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcCwgbCk7XG4gICAgICAgICAgICAgIGwrKztcbiAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwID0gMDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBKcHhFcnJvcihcIk91dCBvZiBwYWNrZXRzXCIpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4O1xuICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdO1xuICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgdmFyIHByZWNpbmN0c1NpemVzID0gZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSh0aWxlKTtcbiAgICB2YXIgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMgPSBwcmVjaW5jdHNTaXplcztcbiAgICB2YXIgbCA9IDAsXG4gICAgICByID0gMCxcbiAgICAgIGMgPSAwLFxuICAgICAgcHggPSAwLFxuICAgICAgcHkgPSAwO1xuXG4gICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHtcbiAgICAgIC8vIFNlY3Rpb24gQi4xMi4xLjQgUG9zaXRpb24tY29tcG9uZW50LXJlc29sdXRpb24tbGF5ZXJcbiAgICAgIGZvciAoOyBweSA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bUhpZ2g7IHB5KyspIHtcbiAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykge1xuICAgICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID1cbiAgICAgICAgICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7XG4gICAgICAgICAgICBmb3IgKDsgciA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykge1xuICAgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTtcbiAgICAgICAgICAgICAgdmFyIHNpemVJbkltYWdlU2NhbGUgPVxuICAgICAgICAgICAgICAgIHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoXG4gICAgICAgICAgICAgICAgcHgsXG4gICAgICAgICAgICAgICAgcHksXG4gICAgICAgICAgICAgICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyxcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChrID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTtcbiAgICAgICAgICAgICAgICBsKys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjID0gMDtcbiAgICAgICAgfVxuICAgICAgICBweCA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7XG4gICAgdmFyIGwgPSAwLFxuICAgICAgciA9IDAsXG4gICAgICBjID0gMCxcbiAgICAgIHB4ID0gMCxcbiAgICAgIHB5ID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS41IENvbXBvbmVudC1wb3NpdGlvbi1yZXNvbHV0aW9uLWxheWVyXG4gICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgIHZhciBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY107XG4gICAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPVxuICAgICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7XG4gICAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykge1xuICAgICAgICAgICAgZm9yICg7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoXG4gICAgICAgICAgICAgICAgcHgsXG4gICAgICAgICAgICAgICAgcHksXG4gICAgICAgICAgICAgICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyxcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChrID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTtcbiAgICAgICAgICAgICAgICBsKys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBweCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHkgPSAwO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiT3V0IG9mIHBhY2tldHNcIik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcmVjaW5jdEluZGV4SWZFeGlzdChcbiAgICBweEluZGV4LFxuICAgIHB5SW5kZXgsXG4gICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICBwcmVjaW5jdEl0ZXJhdGlvblNpemVzLFxuICAgIHJlc29sdXRpb25cbiAgKSB7XG4gICAgdmFyIHBvc1ggPSBweEluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5XaWR0aDtcbiAgICB2YXIgcG9zWSA9IHB5SW5kZXggKiBwcmVjaW5jdEl0ZXJhdGlvblNpemVzLm1pbkhlaWdodDtcbiAgICBpZiAoXG4gICAgICBwb3NYICUgc2l6ZUluSW1hZ2VTY2FsZS53aWR0aCAhPT0gMCB8fFxuICAgICAgcG9zWSAlIHNpemVJbkltYWdlU2NhbGUuaGVpZ2h0ICE9PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHN0YXJ0UHJlY2luY3RSb3dJbmRleCA9XG4gICAgICAocG9zWSAvIHNpemVJbkltYWdlU2NhbGUud2lkdGgpICpcbiAgICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7XG4gICAgcmV0dXJuIHBvc1ggLyBzaXplSW5JbWFnZVNjYWxlLmhlaWdodCArIHN0YXJ0UHJlY2luY3RSb3dJbmRleDtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpIHtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gdGlsZS5jb21wb25lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIHZhciBtaW5IZWlnaHQgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIHZhciBtYXhOdW1XaWRlID0gMDtcbiAgICB2YXIgbWF4TnVtSGlnaCA9IDA7XG4gICAgdmFyIHNpemVQZXJDb21wb25lbnQgPSBuZXcgQXJyYXkoY29tcG9uZW50c0NvdW50KTtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9XG4gICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgdmFyIHNpemVQZXJSZXNvbHV0aW9uID0gbmV3IEFycmF5KGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCArIDEpO1xuICAgICAgdmFyIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB2YXIgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB2YXIgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQgPSAwO1xuICAgICAgdmFyIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50ID0gMDtcbiAgICAgIHZhciBzY2FsZSA9IDE7XG4gICAgICBmb3IgKHZhciByID0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByID49IDA7IC0tcikge1xuICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTtcbiAgICAgICAgdmFyIHdpZHRoQ3VycmVudFJlc29sdXRpb24gPVxuICAgICAgICAgIHNjYWxlICogcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aDtcbiAgICAgICAgdmFyIGhlaWdodEN1cnJlbnRSZXNvbHV0aW9uID1cbiAgICAgICAgICBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0O1xuICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1pbihcbiAgICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsXG4gICAgICAgICAgd2lkdGhDdXJyZW50UmVzb2x1dGlvblxuICAgICAgICApO1xuICAgICAgICBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4oXG4gICAgICAgICAgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCxcbiAgICAgICAgICBoZWlnaHRDdXJyZW50UmVzb2x1dGlvblxuICAgICAgICApO1xuICAgICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IE1hdGgubWF4KFxuICAgICAgICAgIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGVcbiAgICAgICAgKTtcbiAgICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChcbiAgICAgICAgICBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgICByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHNoaWdoXG4gICAgICAgICk7XG4gICAgICAgIHNpemVQZXJSZXNvbHV0aW9uW3JdID0ge1xuICAgICAgICAgIHdpZHRoOiB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0Q3VycmVudFJlc29sdXRpb24sXG4gICAgICAgIH07XG4gICAgICAgIHNjYWxlIDw8PSAxO1xuICAgICAgfVxuICAgICAgbWluV2lkdGggPSBNYXRoLm1pbihtaW5XaWR0aCwgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50KTtcbiAgICAgIG1pbkhlaWdodCA9IE1hdGgubWluKG1pbkhlaWdodCwgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCk7XG4gICAgICBtYXhOdW1XaWRlID0gTWF0aC5tYXgobWF4TnVtV2lkZSwgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQpO1xuICAgICAgbWF4TnVtSGlnaCA9IE1hdGgubWF4KG1heE51bUhpZ2gsIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50KTtcbiAgICAgIHNpemVQZXJDb21wb25lbnRbY10gPSB7XG4gICAgICAgIHJlc29sdXRpb25zOiBzaXplUGVyUmVzb2x1dGlvbixcbiAgICAgICAgbWluV2lkdGg6IG1pbldpZHRoQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgbWluSGVpZ2h0OiBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50LFxuICAgICAgICBtYXhOdW1XaWRlOiBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgbWF4TnVtSGlnaDogbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29tcG9uZW50czogc2l6ZVBlckNvbXBvbmVudCxcbiAgICAgIG1pbldpZHRoLFxuICAgICAgbWluSGVpZ2h0LFxuICAgICAgbWF4TnVtV2lkZSxcbiAgICAgIG1heE51bUhpZ2gsXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBidWlsZFBhY2tldHMoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgLy8gQ3JlYXRpbmcgcmVzb2x1dGlvbnMgYW5kIHN1Yi1iYW5kcyBmb3IgZWFjaCBjb21wb25lbnRcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9XG4gICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgLy8gU2VjdGlvbiBCLjUgUmVzb2x1dGlvbiBsZXZlbHMgYW5kIHN1Yi1iYW5kc1xuICAgICAgdmFyIHJlc29sdXRpb25zID0gW107XG4gICAgICB2YXIgc3ViYmFuZHMgPSBbXTtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7XG4gICAgICAgIHZhciBibG9ja3NEaW1lbnNpb25zID0gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpO1xuICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IHt9O1xuICAgICAgICB2YXIgc2NhbGUgPSAxIDw8IChkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByKTtcbiAgICAgICAgcmVzb2x1dGlvbi50cngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpO1xuICAgICAgICByZXNvbHV0aW9uLnRyeTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7XG4gICAgICAgIHJlc29sdXRpb24udHJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTtcbiAgICAgICAgcmVzb2x1dGlvbi50cnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpO1xuICAgICAgICByZXNvbHV0aW9uLnJlc0xldmVsID0gcjtcbiAgICAgICAgYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgYmxvY2tzRGltZW5zaW9ucyk7XG4gICAgICAgIHJlc29sdXRpb25zLnB1c2gocmVzb2x1dGlvbik7XG5cbiAgICAgICAgdmFyIHN1YmJhbmQ7XG4gICAgICAgIGlmIChyID09PSAwKSB7XG4gICAgICAgICAgLy8gb25lIHN1Yi1iYW5kIChMTCkgd2l0aCBsYXN0IGRlY29tcG9zaXRpb25cbiAgICAgICAgICBzdWJiYW5kID0ge307XG4gICAgICAgICAgc3ViYmFuZC50eXBlID0gXCJMTFwiO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIHNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gc2NhbGUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIHNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTtcbiAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuICAgICAgICAgIHJlc29sdXRpb24uc3ViYmFuZHMgPSBbc3ViYmFuZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJzY2FsZSA9IDEgPDwgKGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCAtIHIgKyAxKTtcbiAgICAgICAgICB2YXIgcmVzb2x1dGlvblN1YmJhbmRzID0gW107XG4gICAgICAgICAgLy8gdGhyZWUgc3ViLWJhbmRzIChITCwgTEggYW5kIEhIKSB3aXRoIHJlc3Qgb2YgZGVjb21wb3NpdGlvbnNcbiAgICAgICAgICBzdWJiYW5kID0ge307XG4gICAgICAgICAgc3ViYmFuZC50eXBlID0gXCJITFwiO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSAtIDAuNSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7XG4gICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTtcbiAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTtcblxuICAgICAgICAgIHN1YmJhbmQgPSB7fTtcbiAgICAgICAgICBzdWJiYW5kLnR5cGUgPSBcIkxIXCI7XG4gICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTtcbiAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuXG4gICAgICAgICAgc3ViYmFuZCA9IHt9O1xuICAgICAgICAgIHN1YmJhbmQudHlwZSA9IFwiSEhcIjtcbiAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSAtIDAuNSk7XG4gICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpO1xuICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7XG4gICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7XG5cbiAgICAgICAgICByZXNvbHV0aW9uLnN1YmJhbmRzID0gcmVzb2x1dGlvblN1YmJhbmRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wb25lbnQucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9ucztcbiAgICAgIGNvbXBvbmVudC5zdWJiYW5kcyA9IHN1YmJhbmRzO1xuICAgIH1cbiAgICAvLyBHZW5lcmF0ZSB0aGUgcGFja2V0cyBzZXF1ZW5jZVxuICAgIHZhciBwcm9ncmVzc2lvbk9yZGVyID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7XG4gICAgc3dpdGNoIChwcm9ncmVzc2lvbk9yZGVyKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvbkxheWVyQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0aWxlLnBhY2tldHNJdGVyYXRvciA9IG5ldyBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKGBVbnN1cHBvcnRlZCBwcm9ncmVzc2lvbiBvcmRlciAke3Byb2dyZXNzaW9uT3JkZXJ9YCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgb2Zmc2V0LCBkYXRhTGVuZ3RoKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICB2YXIgYnVmZmVyLFxuICAgICAgYnVmZmVyU2l6ZSA9IDAsXG4gICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGNvdW50KSB7XG4gICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IGNvdW50KSB7XG4gICAgICAgIHZhciBiID0gZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl07XG4gICAgICAgIHBvc2l0aW9uKys7XG4gICAgICAgIGlmIChza2lwTmV4dEJpdCkge1xuICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgNykgfCBiO1xuICAgICAgICAgIGJ1ZmZlclNpemUgKz0gNztcbiAgICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgOCkgfCBiO1xuICAgICAgICAgIGJ1ZmZlclNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiA9PT0gMHhmZikge1xuICAgICAgICAgIHNraXBOZXh0Qml0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVmZmVyU2l6ZSAtPSBjb3VudDtcbiAgICAgIHJldHVybiAoYnVmZmVyID4+PiBidWZmZXJTaXplKSAmICgoMSA8PCBjb3VudCkgLSAxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2tpcE1hcmtlcklmRXF1YWwodmFsdWUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbiAtIDFdID09PSAweGZmICYmXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSB2YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIHNraXBCeXRlcygxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBkYXRhW29mZnNldCArIHBvc2l0aW9uXSA9PT0gMHhmZiAmJlxuICAgICAgICBkYXRhW29mZnNldCArIHBvc2l0aW9uICsgMV0gPT09IHZhbHVlXG4gICAgICApIHtcbiAgICAgICAgc2tpcEJ5dGVzKDIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2tpcEJ5dGVzKGNvdW50KSB7XG4gICAgICBwb3NpdGlvbiArPSBjb3VudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKSB7XG4gICAgICBidWZmZXJTaXplID0gMDtcbiAgICAgIGlmIChza2lwTmV4dEJpdCkge1xuICAgICAgICBwb3NpdGlvbisrO1xuICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWFkQ29kaW5ncGFzc2VzKCkge1xuICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gcmVhZEJpdHMoMik7XG4gICAgICBpZiAodmFsdWUgPCAzKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSArIDM7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHJlYWRCaXRzKDUpO1xuICAgICAgaWYgKHZhbHVlIDwgMzEpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICsgNjtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gcmVhZEJpdHMoNyk7XG4gICAgICByZXR1cm4gdmFsdWUgKyAzNztcbiAgICB9XG4gICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgdmFyIHNvcE1hcmtlclVzZWQgPSBjb250ZXh0LkNPRC5zb3BNYXJrZXJVc2VkO1xuICAgIHZhciBlcGhNYXJrZXJVc2VkID0gY29udGV4dC5DT0QuZXBoTWFya2VyVXNlZDtcbiAgICB2YXIgcGFja2V0c0l0ZXJhdG9yID0gdGlsZS5wYWNrZXRzSXRlcmF0b3I7XG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgZGF0YUxlbmd0aCkge1xuICAgICAgYWxpZ25Ub0J5dGUoKTtcbiAgICAgIGlmIChzb3BNYXJrZXJVc2VkICYmIHNraXBNYXJrZXJJZkVxdWFsKDB4OTEpKSB7XG4gICAgICAgIC8vIFNraXAgYWxzbyBtYXJrZXIgc2VnbWVudCBsZW5ndGggYW5kIHBhY2tldCBzZXF1ZW5jZSBJRFxuICAgICAgICBza2lwQnl0ZXMoNCk7XG4gICAgICB9XG4gICAgICB2YXIgcGFja2V0ID0gcGFja2V0c0l0ZXJhdG9yLm5leHRQYWNrZXQoKTtcbiAgICAgIGlmICghcmVhZEJpdHMoMSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbGF5ZXJOdW1iZXIgPSBwYWNrZXQubGF5ZXJOdW1iZXI7XG4gICAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgY29kZWJsb2NrO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcGFja2V0LmNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXQuY29kZWJsb2Nrc1tpXTtcbiAgICAgICAgdmFyIHByZWNpbmN0ID0gY29kZWJsb2NrLnByZWNpbmN0O1xuICAgICAgICB2YXIgY29kZWJsb2NrQ29sdW1uID0gY29kZWJsb2NrLmNieCAtIHByZWNpbmN0LmNieE1pbjtcbiAgICAgICAgdmFyIGNvZGVibG9ja1JvdyA9IGNvZGVibG9jay5jYnkgLSBwcmVjaW5jdC5jYnlNaW47XG4gICAgICAgIHZhciBjb2RlYmxvY2tJbmNsdWRlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZmlyc3RUaW1lSW5jbHVzaW9uID0gZmFsc2U7XG4gICAgICAgIHZhciB2YWx1ZVJlYWR5O1xuICAgICAgICBpZiAoY29kZWJsb2NrLmluY2x1ZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb2RlYmxvY2tJbmNsdWRlZCA9ICEhcmVhZEJpdHMoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVhZGluZyBpbmNsdXNpb24gdHJlZVxuICAgICAgICAgIHByZWNpbmN0ID0gY29kZWJsb2NrLnByZWNpbmN0O1xuICAgICAgICAgIHZhciBpbmNsdXNpb25UcmVlLCB6ZXJvQml0UGxhbmVzVHJlZTtcbiAgICAgICAgICBpZiAocHJlY2luY3QuaW5jbHVzaW9uVHJlZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbmNsdXNpb25UcmVlID0gcHJlY2luY3QuaW5jbHVzaW9uVHJlZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYnVpbGRpbmcgaW5jbHVzaW9uIGFuZCB6ZXJvIGJpdC1wbGFuZXMgdHJlZXNcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHByZWNpbmN0LmNieE1heCAtIHByZWNpbmN0LmNieE1pbiArIDE7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcHJlY2luY3QuY2J5TWF4IC0gcHJlY2luY3QuY2J5TWluICsgMTtcbiAgICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBuZXcgSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBsYXllck51bWJlcik7XG4gICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IG5ldyBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgcHJlY2luY3QuaW5jbHVzaW9uVHJlZSA9IGluY2x1c2lvblRyZWU7XG4gICAgICAgICAgICBwcmVjaW5jdC56ZXJvQml0UGxhbmVzVHJlZSA9IHplcm9CaXRQbGFuZXNUcmVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbmNsdXNpb25UcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93LCBsYXllck51bWJlcikpIHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlUmVhZHkgPSAhaW5jbHVzaW9uVHJlZS5uZXh0TGV2ZWwoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgY29kZWJsb2NrLmluY2x1ZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGNvZGVibG9ja0luY2x1ZGVkID0gZmlyc3RUaW1lSW5jbHVzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmNsdXNpb25UcmVlLmluY3JlbWVudFZhbHVlKGxheWVyTnVtYmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvZGVibG9ja0luY2x1ZGVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0VGltZUluY2x1c2lvbikge1xuICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlID0gcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWU7XG4gICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUucmVzZXQoY29kZWJsb2NrQ29sdW1uLCBjb2RlYmxvY2tSb3cpO1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAocmVhZEJpdHMoMSkpIHtcbiAgICAgICAgICAgICAgdmFsdWVSZWFkeSA9ICF6ZXJvQml0UGxhbmVzVHJlZS5uZXh0TGV2ZWwoKTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlUmVhZHkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUuaW5jcmVtZW50VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMgPSB6ZXJvQml0UGxhbmVzVHJlZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kaW5ncGFzc2VzID0gcmVhZENvZGluZ3Bhc3NlcygpO1xuICAgICAgICB3aGlsZSAocmVhZEJpdHMoMSkpIHtcbiAgICAgICAgICBjb2RlYmxvY2suTGJsb2NrKys7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGluZ3Bhc3Nlc0xvZzIgPSBsb2cyKGNvZGluZ3Bhc3Nlcyk7XG4gICAgICAgIC8vIHJvdW5kaW5nIGRvd24gbG9nMlxuICAgICAgICB2YXIgYml0cyA9XG4gICAgICAgICAgKGNvZGluZ3Bhc3NlcyA8IDEgPDwgY29kaW5ncGFzc2VzTG9nMlxuICAgICAgICAgICAgPyBjb2RpbmdwYXNzZXNMb2cyIC0gMVxuICAgICAgICAgICAgOiBjb2RpbmdwYXNzZXNMb2cyKSArIGNvZGVibG9jay5MYmxvY2s7XG4gICAgICAgIHZhciBjb2RlZERhdGFMZW5ndGggPSByZWFkQml0cyhiaXRzKTtcbiAgICAgICAgcXVldWUucHVzaCh7XG4gICAgICAgICAgY29kZWJsb2NrLFxuICAgICAgICAgIGNvZGluZ3Bhc3NlcyxcbiAgICAgICAgICBkYXRhTGVuZ3RoOiBjb2RlZERhdGFMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYWxpZ25Ub0J5dGUoKTtcbiAgICAgIGlmIChlcGhNYXJrZXJVc2VkKSB7XG4gICAgICAgIHNraXBNYXJrZXJJZkVxdWFsKDB4OTIpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHBhY2tldEl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXRJdGVtLmNvZGVibG9jaztcbiAgICAgICAgaWYgKGNvZGVibG9jay5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb2RlYmxvY2suZGF0YSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVibG9jay5kYXRhLnB1c2goe1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgc3RhcnQ6IG9mZnNldCArIHBvc2l0aW9uLFxuICAgICAgICAgIGVuZDogb2Zmc2V0ICsgcG9zaXRpb24gKyBwYWNrZXRJdGVtLmRhdGFMZW5ndGgsXG4gICAgICAgICAgY29kaW5ncGFzc2VzOiBwYWNrZXRJdGVtLmNvZGluZ3Bhc3NlcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHBvc2l0aW9uICs9IHBhY2tldEl0ZW0uZGF0YUxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGNvcHlDb2VmZmljaWVudHMoXG4gICAgY29lZmZpY2llbnRzLFxuICAgIGxldmVsV2lkdGgsXG4gICAgbGV2ZWxIZWlnaHQsXG4gICAgc3ViYmFuZCxcbiAgICBkZWx0YSxcbiAgICBtYixcbiAgICByZXZlcnNpYmxlLFxuICAgIHNlZ21lbnRhdGlvblN5bWJvbFVzZWRcbiAgKSB7XG4gICAgdmFyIHgwID0gc3ViYmFuZC50YngwO1xuICAgIHZhciB5MCA9IHN1YmJhbmQudGJ5MDtcbiAgICB2YXIgd2lkdGggPSBzdWJiYW5kLnRieDEgLSBzdWJiYW5kLnRieDA7XG4gICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7XG4gICAgdmFyIHJpZ2h0ID0gc3ViYmFuZC50eXBlLmNoYXJBdCgwKSA9PT0gXCJIXCIgPyAxIDogMDtcbiAgICB2YXIgYm90dG9tID0gc3ViYmFuZC50eXBlLmNoYXJBdCgxKSA9PT0gXCJIXCIgPyBsZXZlbFdpZHRoIDogMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgdmFyIGNvZGVibG9jayA9IGNvZGVibG9ja3NbaV07XG4gICAgICB2YXIgYmxvY2tXaWR0aCA9IGNvZGVibG9jay50YngxXyAtIGNvZGVibG9jay50YngwXztcbiAgICAgIHZhciBibG9ja0hlaWdodCA9IGNvZGVibG9jay50YnkxXyAtIGNvZGVibG9jay50YnkwXztcbiAgICAgIGlmIChibG9ja1dpZHRoID09PSAwIHx8IGJsb2NrSGVpZ2h0ID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGVibG9jay5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBiaXRNb2RlbCwgY3VycmVudENvZGluZ3Bhc3NUeXBlO1xuICAgICAgYml0TW9kZWwgPSBuZXcgQml0TW9kZWwoXG4gICAgICAgIGJsb2NrV2lkdGgsXG4gICAgICAgIGJsb2NrSGVpZ2h0LFxuICAgICAgICBjb2RlYmxvY2suc3ViYmFuZFR5cGUsXG4gICAgICAgIGNvZGVibG9jay56ZXJvQml0UGxhbmVzLFxuICAgICAgICBtYlxuICAgICAgKTtcbiAgICAgIGN1cnJlbnRDb2RpbmdwYXNzVHlwZSA9IDI7IC8vIGZpcnN0IGJpdCBwbGFuZSBzdGFydHMgZnJvbSBjbGVhbnVwXG5cbiAgICAgIC8vIGNvbGxlY3QgZGF0YVxuICAgICAgdmFyIGRhdGEgPSBjb2RlYmxvY2suZGF0YSxcbiAgICAgICAgdG90YWxMZW5ndGggPSAwLFxuICAgICAgICBjb2RpbmdwYXNzZXMgPSAwO1xuICAgICAgdmFyIGosIGpqLCBkYXRhSXRlbTtcbiAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTtcbiAgICAgICAgdG90YWxMZW5ndGggKz0gZGF0YUl0ZW0uZW5kIC0gZGF0YUl0ZW0uc3RhcnQ7XG4gICAgICAgIGNvZGluZ3Bhc3NlcyArPSBkYXRhSXRlbS5jb2RpbmdwYXNzZXM7XG4gICAgICB9XG4gICAgICB2YXIgZW5jb2RlZERhdGEgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgICAgZm9yIChqID0gMCwgamogPSBkYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgZGF0YUl0ZW0gPSBkYXRhW2pdO1xuICAgICAgICB2YXIgY2h1bmsgPSBkYXRhSXRlbS5kYXRhLnN1YmFycmF5KGRhdGFJdGVtLnN0YXJ0LCBkYXRhSXRlbS5lbmQpO1xuICAgICAgICBlbmNvZGVkRGF0YS5zZXQoY2h1bmssIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gZGVjb2RpbmcgdGhlIGl0ZW1cbiAgICAgIHZhciBkZWNvZGVyID0gbmV3IEFyaXRobWV0aWNEZWNvZGVyKGVuY29kZWREYXRhLCAwLCB0b3RhbExlbmd0aCk7XG4gICAgICBiaXRNb2RlbC5zZXREZWNvZGVyKGRlY29kZXIpO1xuXG4gICAgICBmb3IgKGogPSAwOyBqIDwgY29kaW5ncGFzc2VzOyBqKyspIHtcbiAgICAgICAgc3dpdGNoIChjdXJyZW50Q29kaW5ncGFzc1R5cGUpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBiaXRNb2RlbC5ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGJpdE1vZGVsLnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBiaXRNb2RlbC5ydW5DbGVhbnVwUGFzcygpO1xuICAgICAgICAgICAgaWYgKHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpIHtcbiAgICAgICAgICAgICAgYml0TW9kZWwuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDb2RpbmdwYXNzVHlwZSA9IChjdXJyZW50Q29kaW5ncGFzc1R5cGUgKyAxKSAlIDM7XG4gICAgICB9XG5cbiAgICAgIHZhciBvZmZzZXQgPSBjb2RlYmxvY2sudGJ4MF8gLSB4MCArIChjb2RlYmxvY2sudGJ5MF8gLSB5MCkgKiB3aWR0aDtcbiAgICAgIHZhciBzaWduID0gYml0TW9kZWwuY29lZmZpY2VudHNTaWduO1xuICAgICAgdmFyIG1hZ25pdHVkZSA9IGJpdE1vZGVsLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgdmFyIGJpdHNEZWNvZGVkID0gYml0TW9kZWwuYml0c0RlY29kZWQ7XG4gICAgICB2YXIgbWFnbml0dWRlQ29ycmVjdGlvbiA9IHJldmVyc2libGUgPyAwIDogMC41O1xuICAgICAgdmFyIGssIG4sIG5iO1xuICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgLy8gRG8gdGhlIGludGVybGVhdmluZyBvZiBTZWN0aW9uIEYuMy4zIGhlcmUsIHNvIHdlIGRvIG5vdCBuZWVkXG4gICAgICAvLyB0byBjb3B5IGxhdGVyLiBMTCBsZXZlbCBpcyBub3QgaW50ZXJsZWF2ZWQsIGp1c3QgY29waWVkLlxuICAgICAgdmFyIGludGVybGVhdmUgPSBzdWJiYW5kLnR5cGUgIT09IFwiTExcIjtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBibG9ja0hlaWdodDsgaisrKSB7XG4gICAgICAgIHZhciByb3cgPSAob2Zmc2V0IC8gd2lkdGgpIHwgMDsgLy8gcm93IGluIHRoZSBub24taW50ZXJsZWF2ZWQgc3ViYmFuZFxuICAgICAgICB2YXIgbGV2ZWxPZmZzZXQgPSAyICogcm93ICogKGxldmVsV2lkdGggLSB3aWR0aCkgKyByaWdodCArIGJvdHRvbTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGJsb2NrV2lkdGg7IGsrKykge1xuICAgICAgICAgIG4gPSBtYWduaXR1ZGVbcG9zaXRpb25dO1xuICAgICAgICAgIGlmIChuICE9PSAwKSB7XG4gICAgICAgICAgICBuID0gKG4gKyBtYWduaXR1ZGVDb3JyZWN0aW9uKSAqIGRlbHRhO1xuICAgICAgICAgICAgaWYgKHNpZ25bcG9zaXRpb25dICE9PSAwKSB7XG4gICAgICAgICAgICAgIG4gPSAtbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5iID0gYml0c0RlY29kZWRbcG9zaXRpb25dO1xuICAgICAgICAgICAgdmFyIHBvcyA9IGludGVybGVhdmUgPyBsZXZlbE9mZnNldCArIChvZmZzZXQgPDwgMSkgOiBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAocmV2ZXJzaWJsZSAmJiBuYiA+PSBtYikge1xuICAgICAgICAgICAgICBjb2VmZmljaWVudHNbcG9zXSA9IG47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb2VmZmljaWVudHNbcG9zXSA9IG4gKiAoMSA8PCAobWIgLSBuYikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICBwb3NpdGlvbisrO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSB3aWR0aCAtIGJsb2NrV2lkdGg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYykge1xuICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgdmFyIGNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7XG4gICAgdmFyIHF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVycztcbiAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID1cbiAgICAgIGNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7XG4gICAgdmFyIHNwcWNkcyA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuU1BxY2RzO1xuICAgIHZhciBzY2FsYXJFeHBvdW5kZWQgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLnNjYWxhckV4cG91bmRlZDtcbiAgICB2YXIgZ3VhcmRCaXRzID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5ndWFyZEJpdHM7XG4gICAgdmFyIHNlZ21lbnRhdGlvblN5bWJvbFVzZWQgPSBjb2RpbmdTdHlsZVBhcmFtZXRlcnMuc2VnbWVudGF0aW9uU3ltYm9sVXNlZDtcbiAgICB2YXIgcHJlY2lzaW9uID0gY29udGV4dC5jb21wb25lbnRzW2NdLnByZWNpc2lvbjtcblxuICAgIHZhciByZXZlcnNpYmxlID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbjtcbiAgICB2YXIgdHJhbnNmb3JtID0gcmV2ZXJzaWJsZVxuICAgICAgPyBuZXcgUmV2ZXJzaWJsZVRyYW5zZm9ybSgpXG4gICAgICA6IG5ldyBJcnJldmVyc2libGVUcmFuc2Zvcm0oKTtcblxuICAgIHZhciBzdWJiYW5kQ29lZmZpY2llbnRzID0gW107XG4gICAgdmFyIGIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgaSsrKSB7XG4gICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tpXTtcblxuICAgICAgdmFyIHdpZHRoID0gcmVzb2x1dGlvbi50cngxIC0gcmVzb2x1dGlvbi50cngwO1xuICAgICAgdmFyIGhlaWdodCA9IHJlc29sdXRpb24udHJ5MSAtIHJlc29sdXRpb24udHJ5MDtcbiAgICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2hvbGUgc3VibGV2ZWwuXG4gICAgICB2YXIgY29lZmZpY2llbnRzID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCk7XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHJlc29sdXRpb24uc3ViYmFuZHMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICB2YXIgbXUsIGVwc2lsb247XG4gICAgICAgIGlmICghc2NhbGFyRXhwb3VuZGVkKSB7XG4gICAgICAgICAgLy8gZm9ybXVsYSBFLTVcbiAgICAgICAgICBtdSA9IHNwcWNkc1swXS5tdTtcbiAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzWzBdLmVwc2lsb24gKyAoaSA+IDAgPyAxIC0gaSA6IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11ID0gc3BxY2RzW2JdLm11O1xuICAgICAgICAgIGVwc2lsb24gPSBzcHFjZHNbYl0uZXBzaWxvbjtcbiAgICAgICAgICBiKys7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3ViYmFuZCA9IHJlc29sdXRpb24uc3ViYmFuZHNbal07XG4gICAgICAgIHZhciBnYWluTG9nMiA9IFN1YmJhbmRzR2FpbkxvZzJbc3ViYmFuZC50eXBlXTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgcXVhbnRpemF0aW9uIGNvZWZmaWNpZW50IChTZWN0aW9uIEUuMS4xLjEpXG4gICAgICAgIHZhciBkZWx0YSA9IHJldmVyc2libGVcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IDIgKiogKHByZWNpc2lvbiArIGdhaW5Mb2cyIC0gZXBzaWxvbikgKiAoMSArIG11IC8gMjA0OCk7XG4gICAgICAgIHZhciBtYiA9IGd1YXJkQml0cyArIGVwc2lsb24gLSAxO1xuXG4gICAgICAgIC8vIEluIHRoZSBmaXJzdCByZXNvbHV0aW9uIGxldmVsLCBjb3B5Q29lZmZpY2llbnRzIHdpbGwgZmlsbCB0aGVcbiAgICAgICAgLy8gd2hvbGUgYXJyYXkgd2l0aCBjb2VmZmljaWVudHMuIEluIHRoZSBzdWNjZWVkaW5nIHBhc3NlcyxcbiAgICAgICAgLy8gY29weUNvZWZmaWNpZW50cyB3aWxsIGNvbnNlY3V0aXZlbHkgZmlsbCBpbiB0aGUgdmFsdWVzIHRoYXQgYmVsb25nXG4gICAgICAgIC8vIHRvIHRoZSBpbnRlcmxlYXZlZCBwb3NpdGlvbnMgb2YgdGhlIEhMLCBMSCwgYW5kIEhIIGNvZWZmaWNpZW50cy5cbiAgICAgICAgLy8gVGhlIExMIGNvZWZmaWNpZW50cyB3aWxsIHRoZW4gYmUgaW50ZXJsZWF2ZWQgaW4gVHJhbnNmb3JtLml0ZXJhdGUoKS5cbiAgICAgICAgY29weUNvZWZmaWNpZW50cyhcbiAgICAgICAgICBjb2VmZmljaWVudHMsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHN1YmJhbmQsXG4gICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgbWIsXG4gICAgICAgICAgcmV2ZXJzaWJsZSxcbiAgICAgICAgICBzZWdtZW50YXRpb25TeW1ib2xVc2VkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLnB1c2goe1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBpdGVtczogY29lZmZpY2llbnRzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybS5jYWxjdWxhdGUoXG4gICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLFxuICAgICAgY29tcG9uZW50LnRjeDAsXG4gICAgICBjb21wb25lbnQudGN5MFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGNvbXBvbmVudC50Y3gwLFxuICAgICAgdG9wOiBjb21wb25lbnQudGN5MCxcbiAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlc3VsdC5oZWlnaHQsXG4gICAgICBpdGVtczogcmVzdWx0Lml0ZW1zLFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gdHJhbnNmb3JtQ29tcG9uZW50cyhjb250ZXh0KSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIHZhciBjb21wb25lbnRzID0gY29udGV4dC5jb21wb25lbnRzO1xuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICB2YXIgcmVzdWx0SW1hZ2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29udGV4dC50aWxlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbaV07XG4gICAgICB2YXIgdHJhbnNmb3JtZWRUaWxlcyA9IFtdO1xuICAgICAgdmFyIGM7XG4gICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHtcbiAgICAgICAgdHJhbnNmb3JtZWRUaWxlc1tjXSA9IHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYyk7XG4gICAgICB9XG4gICAgICB2YXIgdGlsZTAgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdO1xuICAgICAgdmFyIG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aWxlMC5pdGVtcy5sZW5ndGggKiBjb21wb25lbnRzQ291bnQpO1xuICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgbGVmdDogdGlsZTAubGVmdCxcbiAgICAgICAgdG9wOiB0aWxlMC50b3AsXG4gICAgICAgIHdpZHRoOiB0aWxlMC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0aWxlMC5oZWlnaHQsXG4gICAgICAgIGl0ZW1zOiBvdXQsXG4gICAgICB9O1xuXG4gICAgICAvLyBTZWN0aW9uIEcuMi4yIEludmVyc2UgbXVsdGkgY29tcG9uZW50IHRyYW5zZm9ybVxuICAgICAgdmFyIHNoaWZ0LCBvZmZzZXQ7XG4gICAgICB2YXIgcG9zID0gMCxcbiAgICAgICAgaixcbiAgICAgICAgamosXG4gICAgICAgIHkwLFxuICAgICAgICB5MSxcbiAgICAgICAgeTI7XG4gICAgICBpZiAodGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKSB7XG4gICAgICAgIHZhciBmb3VyQ29tcG9uZW50cyA9IGNvbXBvbmVudHNDb3VudCA9PT0gNDtcbiAgICAgICAgdmFyIHkwaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdLml0ZW1zO1xuICAgICAgICB2YXIgeTFpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMV0uaXRlbXM7XG4gICAgICAgIHZhciB5Mml0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1syXS5pdGVtcztcbiAgICAgICAgdmFyIHkzaXRlbXMgPSBmb3VyQ29tcG9uZW50cyA/IHRyYW5zZm9ybWVkVGlsZXNbM10uaXRlbXMgOiBudWxsO1xuXG4gICAgICAgIC8vIEhBQ0s6IFRoZSBtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtIGZvcm11bGFzIGJlbG93IGFzc3VtZSB0aGF0XG4gICAgICAgIC8vIGFsbCBjb21wb25lbnRzIGhhdmUgdGhlIHNhbWUgcHJlY2lzaW9uLiBXaXRoIHRoaXMgaW4gbWluZCwgd2VcbiAgICAgICAgLy8gY29tcHV0ZSBzaGlmdCBhbmQgb2Zmc2V0IG9ubHkgb25jZS5cbiAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzWzBdLnByZWNpc2lvbiAtIDg7XG4gICAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41O1xuXG4gICAgICAgIHZhciBjb21wb25lbnQwID0gdGlsZS5jb21wb25lbnRzWzBdO1xuICAgICAgICB2YXIgYWxwaGEwMSA9IGNvbXBvbmVudHNDb3VudCAtIDM7XG4gICAgICAgIGpqID0geTBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGlmICghY29tcG9uZW50MC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAgICAgLy8gaW52ZXJzZSBpcnJldmVyc2libGUgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybVxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqajsgaisrLCBwb3MgKz0gYWxwaGEwMSkge1xuICAgICAgICAgICAgeTAgPSB5MGl0ZW1zW2pdICsgb2Zmc2V0O1xuICAgICAgICAgICAgeTEgPSB5MWl0ZW1zW2pdO1xuICAgICAgICAgICAgeTIgPSB5Mml0ZW1zW2pdO1xuICAgICAgICAgICAgb3V0W3BvcysrXSA9ICh5MCArIDEuNDAyICogeTIpID4+IHNoaWZ0O1xuICAgICAgICAgICAgb3V0W3BvcysrXSA9ICh5MCAtIDAuMzQ0MTMgKiB5MSAtIDAuNzE0MTQgKiB5MikgPj4gc2hpZnQ7XG4gICAgICAgICAgICBvdXRbcG9zKytdID0gKHkwICsgMS43NzIgKiB5MSkgPj4gc2hpZnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGludmVyc2UgcmV2ZXJzaWJsZSBtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtXG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7XG4gICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7XG4gICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07XG4gICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07XG4gICAgICAgICAgICBjb25zdCBnID0geTAgLSAoKHkyICsgeTEpID4+IDIpO1xuXG4gICAgICAgICAgICBvdXRbcG9zKytdID0gKGcgKyB5MikgPj4gc2hpZnQ7XG4gICAgICAgICAgICBvdXRbcG9zKytdID0gZyA+PiBzaGlmdDtcbiAgICAgICAgICAgIG91dFtwb3MrK10gPSAoZyArIHkxKSA+PiBzaGlmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdXJDb21wb25lbnRzKSB7XG4gICAgICAgICAgZm9yIChqID0gMCwgcG9zID0gMzsgaiA8IGpqOyBqKyssIHBvcyArPSA0KSB7XG4gICAgICAgICAgICBvdXRbcG9zXSA9ICh5M2l0ZW1zW2pdICsgb2Zmc2V0KSA+PiBzaGlmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vIG11bHRpLWNvbXBvbmVudCB0cmFuc2Zvcm1cbiAgICAgICAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICAgICAgdmFyIGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1tjXS5pdGVtcztcbiAgICAgICAgICBzaGlmdCA9IGNvbXBvbmVudHNbY10ucHJlY2lzaW9uIC0gODtcbiAgICAgICAgICBvZmZzZXQgPSAoMTI4IDw8IHNoaWZ0KSArIDAuNTtcbiAgICAgICAgICBmb3IgKHBvcyA9IGMsIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgIG91dFtwb3NdID0gKGl0ZW1zW2pdICsgb2Zmc2V0KSA+PiBzaGlmdDtcbiAgICAgICAgICAgIHBvcyArPSBjb21wb25lbnRzQ291bnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHRJbWFnZXMucHVzaChyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0SW1hZ2VzO1xuICB9XG4gIGZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGNvbnRleHQsIHRpbGVJbmRleCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTtcbiAgICAgIHZhciBxY2RPclFjYyA9XG4gICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdXG4gICAgICAgICAgOiBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRDtcbiAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25QYXJhbWV0ZXJzID0gcWNkT3JRY2M7XG4gICAgICB2YXIgY29kT3JDb2MgPVxuICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXVxuICAgICAgICAgIDogY29udGV4dC5jdXJyZW50VGlsZS5DT0Q7XG4gICAgICBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzID0gY29kT3JDb2M7XG4gICAgfVxuICAgIHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycyA9IGNvbnRleHQuY3VycmVudFRpbGUuQ09EO1xuICB9XG5cbiAgLy8gU2VjdGlvbiBCLjEwLjIgVGFnIHRyZWVzXG4gIHZhciBUYWdUcmVlID0gKGZ1bmN0aW9uIFRhZ1RyZWVDbG9zdXJlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBmdW5jdGlvbiBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBsZXZlbHNMZW5ndGggPSBsb2cyKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7XG4gICAgICB0aGlzLmxldmVscyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGV2ZWwgPSB7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7XG4gICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7XG4gICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgVGFnVHJlZS5wcm90b3R5cGUgPSB7XG4gICAgICByZXNldDogZnVuY3Rpb24gVGFnVHJlZV9yZXNldChpLCBqKSB7XG4gICAgICAgIHZhciBjdXJyZW50TGV2ZWwgPSAwLFxuICAgICAgICAgIHZhbHVlID0gMCxcbiAgICAgICAgICBsZXZlbDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRMZXZlbCA8IHRoaXMubGV2ZWxzLmxlbmd0aCkge1xuICAgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoO1xuICAgICAgICAgIGlmIChsZXZlbC5pdGVtc1tpbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICBpID4+PSAxO1xuICAgICAgICAgIGogPj49IDE7XG4gICAgICAgICAgY3VycmVudExldmVsKys7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudExldmVsLS07XG4gICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTtcbiAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTtcbiAgICAgIH0sXG4gICAgICBpbmNyZW1lbnRWYWx1ZTogZnVuY3Rpb24gVGFnVHJlZV9pbmNyZW1lbnRWYWx1ZSgpIHtcbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxdO1xuICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0rKztcbiAgICAgIH0sXG4gICAgICBuZXh0TGV2ZWw6IGZ1bmN0aW9uIFRhZ1RyZWVfbmV4dExldmVsKCkge1xuICAgICAgICB2YXIgY3VycmVudExldmVsID0gdGhpcy5jdXJyZW50TGV2ZWw7XG4gICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTtcbiAgICAgICAgY3VycmVudExldmVsLS07XG4gICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPCAwKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gVGFnVHJlZTtcbiAgfSkoKTtcblxuICB2YXIgSW5jbHVzaW9uVHJlZSA9IChmdW5jdGlvbiBJbmNsdXNpb25UcmVlQ2xvc3VyZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciBsZXZlbHNMZW5ndGggPSBsb2cyKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7XG4gICAgICB0aGlzLmxldmVscyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbXMgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICBpdGVtc1tqXSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsZXZlbCA9IHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubGV2ZWxzLnB1c2gobGV2ZWwpO1xuXG4gICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7XG4gICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgSW5jbHVzaW9uVHJlZS5wcm90b3R5cGUgPSB7XG4gICAgICByZXNldDogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9yZXNldChpLCBqLCBzdG9wVmFsdWUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IDA7XG4gICAgICAgIHdoaWxlIChjdXJyZW50TGV2ZWwgPCB0aGlzLmxldmVscy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICAgIHZhciBpbmRleCA9IGkgKyBqICogbGV2ZWwud2lkdGg7XG4gICAgICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IDB4ZmYpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA+IHN0b3BWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7XG4gICAgICAgICAgICAvLyBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyBvbmUsIHByb3BhZ2F0aW5nIHRoZSB2YWx1ZSB0byB0b3AgbGV2ZWxzXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlcygpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgPj49IDE7XG4gICAgICAgICAgaiA+Pj0gMTtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbCAtIDE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKHN0b3BWYWx1ZSkge1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHN0b3BWYWx1ZSArIDE7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7XG4gICAgICB9LFxuICAgICAgcHJvcGFnYXRlVmFsdWVzOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Byb3BhZ2F0ZVZhbHVlcygpIHtcbiAgICAgICAgdmFyIGxldmVsSW5kZXggPSB0aGlzLmN1cnJlbnRMZXZlbDtcbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07XG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07XG4gICAgICAgIHdoaWxlICgtLWxldmVsSW5kZXggPj0gMCkge1xuICAgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07XG4gICAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbmV4dExldmVsOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX25leHRMZXZlbCgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IHRoaXMuY3VycmVudExldmVsO1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IDB4ZmY7XG4gICAgICAgIGN1cnJlbnRMZXZlbC0tO1xuICAgICAgICBpZiAoY3VycmVudExldmVsIDwgMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gSW5jbHVzaW9uVHJlZTtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIEQuIENvZWZmaWNpZW50IGJpdCBtb2RlbGluZ1xuICB2YXIgQml0TW9kZWwgPSAoZnVuY3Rpb24gQml0TW9kZWxDbG9zdXJlKCkge1xuICAgIHZhciBVTklGT1JNX0NPTlRFWFQgPSAxNztcbiAgICB2YXIgUlVOTEVOR1RIX0NPTlRFWFQgPSAxODtcbiAgICAvLyBUYWJsZSBELTFcbiAgICAvLyBUaGUgaW5kZXggaXMgYmluYXJ5IHByZXNlbnRhdGlvbjogMGRkZHZ2aGgsIGRkZCAtIHN1bSBvZiBEaSAoMC4uNCksXG4gICAgLy8gdnYgLSBzdW0gb2YgVmkgKDAuLjIpLCBhbmQgaGggLSBzdW0gb2YgSGkgKDAuLjIpXG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIExMQW5kTEhDb250ZXh0c0xhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgNSwgOCwgMCwgMywgNywgOCwgMCwgNCwgNywgOCwgMCwgMCwgMCwgMCwgMCwgMSwgNiwgOCwgMCwgMywgNywgOCwgMCwgNCxcbiAgICAgIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsXG4gICAgICA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4XG4gICAgXSk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIEhMQ29udGV4dExhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgMywgNCwgMCwgNSwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMSwgMywgNCwgMCwgNiwgNywgNywgMCwgOCxcbiAgICAgIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsXG4gICAgICA0LCAwLCA2LCA3LCA3LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAzLCA0LCAwLCA2LCA3LCA3LCAwLCA4LCA4LCA4XG4gICAgXSk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIEhIQ29udGV4dExhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgMSwgMiwgMCwgMSwgMiwgMiwgMCwgMiwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMywgNCwgNSwgMCwgNCwgNSwgNSwgMCwgNSxcbiAgICAgIDUsIDUsIDAsIDAsIDAsIDAsIDAsIDYsIDcsIDcsIDAsIDcsIDcsIDcsIDAsIDcsIDcsIDcsIDAsIDAsIDAsIDAsIDAsIDgsIDgsXG4gICAgICA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4XG4gICAgXSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gQml0TW9kZWwod2lkdGgsIGhlaWdodCwgc3ViYmFuZCwgemVyb0JpdFBsYW5lcywgbWIpIHtcbiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICBsZXQgY29udGV4dExhYmVsVGFibGU7XG4gICAgICBpZiAoc3ViYmFuZCA9PT0gXCJISFwiKSB7XG4gICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gSEhDb250ZXh0TGFiZWw7XG4gICAgICB9IGVsc2UgaWYgKHN1YmJhbmQgPT09IFwiSExcIikge1xuICAgICAgICBjb250ZXh0TGFiZWxUYWJsZSA9IEhMQ29udGV4dExhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dExhYmVsVGFibGUgPSBMTEFuZExIQ29udGV4dHNMYWJlbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGV4dExhYmVsVGFibGUgPSBjb250ZXh0TGFiZWxUYWJsZTtcblxuICAgICAgdmFyIGNvZWZmaWNpZW50Q291bnQgPSB3aWR0aCAqIGhlaWdodDtcblxuICAgICAgLy8gY29lZmZpY2llbnRzIG91dHNpZGUgdGhlIGVuY29kaW5nIHJlZ2lvbiB0cmVhdGVkIGFzIGluc2lnbmlmaWNhbnRcbiAgICAgIC8vIGFkZCBib3JkZXIgc3RhdGUgY2VsbHMgZm9yIHNpZ25pZmljYW5jZVN0YXRlXG4gICAgICB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgdGhpcy5jb2VmZmljZW50c1NpZ24gPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTtcbiAgICAgIGxldCBjb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgIGlmIChtYiA+IDE0KSB7XG4gICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQzMkFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgfSBlbHNlIGlmIChtYiA+IDYpIHtcbiAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDE2QXJyYXkoY29lZmZpY2llbnRDb3VudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgdGhpcy5wcm9jZXNzaW5nRmxhZ3MgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTtcblxuICAgICAgdmFyIGJpdHNEZWNvZGVkID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7XG4gICAgICBpZiAoemVyb0JpdFBsYW5lcyAhPT0gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZWZmaWNpZW50Q291bnQ7IGkrKykge1xuICAgICAgICAgIGJpdHNEZWNvZGVkW2ldID0gemVyb0JpdFBsYW5lcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5iaXRzRGVjb2RlZCA9IGJpdHNEZWNvZGVkO1xuXG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgQml0TW9kZWwucHJvdG90eXBlID0ge1xuICAgICAgc2V0RGVjb2RlcjogZnVuY3Rpb24gQml0TW9kZWxfc2V0RGVjb2RlcihkZWNvZGVyKSB7XG4gICAgICAgIHRoaXMuZGVjb2RlciA9IGRlY29kZXI7XG4gICAgICB9LFxuICAgICAgcmVzZXQ6IGZ1bmN0aW9uIEJpdE1vZGVsX3Jlc2V0KCkge1xuICAgICAgICAvLyBXZSBoYXZlIDE3IGNvbnRleHRzIHRoYXQgYXJlIGFjY2Vzc2VkIHZpYSBjb250ZXh0IGxhYmVscyxcbiAgICAgICAgLy8gcGx1cyB0aGUgdW5pZm9ybSBhbmQgcnVubGVuZ3RoIGNvbnRleHQuXG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXcgSW50OEFycmF5KDE5KTtcblxuICAgICAgICAvLyBDb250ZXh0cyBhcmUgcGFja2VkIGludG8gMSBieXRlOlxuICAgICAgICAvLyBoaWdoZXN0IDcgYml0cyBjYXJyeSB0aGUgaW5kZXgsIGxvd2VzdCBiaXQgY2FycmllcyBtcHNcbiAgICAgICAgdGhpcy5jb250ZXh0c1swXSA9ICg0IDw8IDEpIHwgMDtcbiAgICAgICAgdGhpcy5jb250ZXh0c1tVTklGT1JNX0NPTlRFWFRdID0gKDQ2IDw8IDEpIHwgMDtcbiAgICAgICAgdGhpcy5jb250ZXh0c1tSVU5MRU5HVEhfQ09OVEVYVF0gPSAoMyA8PCAxKSB8IDA7XG4gICAgICB9LFxuICAgICAgc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlOiBmdW5jdGlvbiBCaXRNb2RlbF9zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoXG4gICAgICAgIHJvdyxcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBpbmRleFxuICAgICAgKSB7XG4gICAgICAgIHZhciBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGxlZnQgPSBjb2x1bW4gPiAwO1xuICAgICAgICB2YXIgcmlnaHQgPSBjb2x1bW4gKyAxIDwgd2lkdGg7XG4gICAgICAgIHZhciBpO1xuXG4gICAgICAgIGlmIChyb3cgPiAwKSB7XG4gICAgICAgICAgaSA9IGluZGV4IC0gd2lkdGg7XG4gICAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaSArIDFdICs9IDB4MTA7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpXSArPSAweDA0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQpIHtcbiAgICAgICAgICBpID0gaW5kZXggKyB3aWR0aDtcbiAgICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgLSAxXSArPSAweDEwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2ldICs9IDB4MDQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleCAtIDFdICs9IDB4MDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4ICsgMV0gKz0gMHgwMTtcbiAgICAgICAgfVxuICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdIHw9IDB4ODA7XG4gICAgICB9LFxuICAgICAgcnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247XG4gICAgICAgIHZhciBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTtcbiAgICAgICAgdmFyIHByb2Nlc3NpbmdGbGFncyA9IHRoaXMucHJvY2Vzc2luZ0ZsYWdzO1xuICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzO1xuICAgICAgICB2YXIgbGFiZWxzID0gdGhpcy5jb250ZXh0TGFiZWxUYWJsZTtcbiAgICAgICAgdmFyIGJpdHNEZWNvZGVkID0gdGhpcy5iaXRzRGVjb2RlZDtcbiAgICAgICAgdmFyIHByb2Nlc3NlZEludmVyc2VNYXNrID0gfjE7XG4gICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTtcbiAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7XG5cbiAgICAgICAgZm9yICh2YXIgaTAgPSAwOyBpMCA8IGhlaWdodDsgaTAgKz0gNCkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gaTAgKiB3aWR0aCArIGo7XG4gICAgICAgICAgICBmb3IgKHZhciBpMSA9IDA7IGkxIDwgNDsgaTErKywgaW5kZXggKz0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSBpMCArIGkxO1xuICAgICAgICAgICAgICBpZiAoaSA+PSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBjbGVhciBwcm9jZXNzZWQgZmxhZyBmaXJzdFxuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICY9IHByb2Nlc3NlZEludmVyc2VNYXNrO1xuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gfHxcbiAgICAgICAgICAgICAgICAhbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSBsYWJlbHNbbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XV07XG4gICAgICAgICAgICAgIHZhciBkZWNpc2lvbiA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduO1xuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrO1xuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IHByb2Nlc3NlZE1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVjb2RlU2lnbkJpdDogZnVuY3Rpb24gQml0TW9kZWxfZGVjb2RlU2lnbkJpdChyb3csIGNvbHVtbiwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduO1xuICAgICAgICB2YXIgY29udHJpYnV0aW9uLCBzaWduMCwgc2lnbjEsIHNpZ25pZmljYW5jZTE7XG4gICAgICAgIHZhciBjb250ZXh0TGFiZWwsIGRlY29kZWQ7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGhvcml6b250YWwgY29udHJpYnV0aW9uXG4gICAgICAgIHNpZ25pZmljYW5jZTEgPSBjb2x1bW4gPiAwICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4IC0gMV0gIT09IDA7XG4gICAgICAgIGlmIChjb2x1bW4gKyAxIDwgd2lkdGggJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyAxXSAhPT0gMCkge1xuICAgICAgICAgIHNpZ24xID0gY29lZmZpY2VudHNTaWduW2luZGV4ICsgMV07XG4gICAgICAgICAgaWYgKHNpZ25pZmljYW5jZTEpIHtcbiAgICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gMV07XG4gICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNpZ25pZmljYW5jZTEpIHtcbiAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIDFdO1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMCAtIHNpZ24wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvcml6b250YWxDb250cmlidXRpb24gPSAzICogY29udHJpYnV0aW9uO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB2ZXJ0aWNhbCBjb250cmlidXRpb24gYW5kIGNvbWJpbmUgd2l0aCB0aGUgaG9yaXpvbnRhbFxuICAgICAgICBzaWduaWZpY2FuY2UxID0gcm93ID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIHdpZHRoXSAhPT0gMDtcbiAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyB3aWR0aF0gIT09IDApIHtcbiAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIHdpZHRoXTtcbiAgICAgICAgICBpZiAoc2lnbmlmaWNhbmNlMSkge1xuICAgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSB3aWR0aF07XG4gICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMCArIGhvcml6b250YWxDb250cmlidXRpb247XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24xICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkge1xuICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gd2lkdGhdO1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMCAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cmlidXRpb24gPSBob3Jpem9udGFsQ29udHJpYnV0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbiA+PSAwKSB7XG4gICAgICAgICAgY29udGV4dExhYmVsID0gOSArIGNvbnRyaWJ1dGlvbjtcbiAgICAgICAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0TGFiZWwgPSA5IC0gY29udHJpYnV0aW9uO1xuICAgICAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpIF4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgIH0sXG4gICAgICBydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzczogZnVuY3Rpb24gQml0TW9kZWxfcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7XG4gICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7XG4gICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7XG4gICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFncztcbiAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxO1xuICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgICB2YXIgd2lkdGg0ID0gd2lkdGggKiA0O1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4MCA9IDAsIGluZGV4TmV4dDsgaW5kZXgwIDwgbGVuZ3RoOyBpbmRleDAgPSBpbmRleE5leHQpIHtcbiAgICAgICAgICBpbmRleE5leHQgPSBNYXRoLm1pbihsZW5ndGgsIGluZGV4MCArIHdpZHRoNCk7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IGluZGV4MCArIGo7IGluZGV4IDwgaW5kZXhOZXh0OyBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICAvLyBzaWduaWZpY2FudCBidXQgbm90IHRob3NlIHRoYXQgaGF2ZSBqdXN0IGJlY29tZVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fFxuICAgICAgICAgICAgICAgIChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDBcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gMTY7XG4gICAgICAgICAgICAgIGlmICgocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIGZpcnN0TWFnbml0dWRlQml0TWFzaykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIF49IGZpcnN0TWFnbml0dWRlQml0TWFzaztcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZWZpbmVtZW50XG4gICAgICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gJiAxMjc7XG4gICAgICAgICAgICAgICAgY29udGV4dExhYmVsID0gc2lnbmlmaWNhbmNlID09PSAwID8gMTUgOiAxNDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA8PCAxKSB8IGJpdDtcbiAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7XG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gcHJvY2Vzc2VkTWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBydW5DbGVhbnVwUGFzczogZnVuY3Rpb24gQml0TW9kZWxfcnVuQ2xlYW51cFBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7XG4gICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7XG4gICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdmFyIGxhYmVscyA9IHRoaXMuY29udGV4dExhYmVsVGFibGU7XG4gICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7XG4gICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFncztcbiAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxO1xuICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjtcbiAgICAgICAgdmFyIG9uZVJvd0Rvd24gPSB3aWR0aDtcbiAgICAgICAgdmFyIHR3b1Jvd3NEb3duID0gd2lkdGggKiAyO1xuICAgICAgICB2YXIgdGhyZWVSb3dzRG93biA9IHdpZHRoICogMztcbiAgICAgICAgdmFyIGlOZXh0O1xuICAgICAgICBmb3IgKHZhciBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCA9IGlOZXh0KSB7XG4gICAgICAgICAgaU5leHQgPSBNYXRoLm1pbihpMCArIDQsIGhlaWdodCk7XG4gICAgICAgICAgdmFyIGluZGV4QmFzZSA9IGkwICogd2lkdGg7XG4gICAgICAgICAgdmFyIGNoZWNrQWxsRW1wdHkgPSBpMCArIDMgPCBoZWlnaHQ7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXgwID0gaW5kZXhCYXNlICsgajtcbiAgICAgICAgICAgIC8vIHVzaW5nIHRoZSBwcm9wZXJ0eTogbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dID09PSAwXG4gICAgICAgICAgICAvLyB3aGVuIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gPT09IDBcbiAgICAgICAgICAgIHZhciBhbGxFbXB0eSA9XG4gICAgICAgICAgICAgIGNoZWNrQWxsRW1wdHkgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MF0gPT09IDAgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDBdID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyBvbmVSb3dEb3duXSA9PT0gMCAmJlxuICAgICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXgwICsgdHdvUm93c0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0aHJlZVJvd3NEb3duXSA9PT0gMDtcbiAgICAgICAgICAgIHZhciBpMSA9IDAsXG4gICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwO1xuICAgICAgICAgICAgdmFyIGkgPSBpMCxcbiAgICAgICAgICAgICAgc2lnbjtcbiAgICAgICAgICAgIGlmIChhbGxFbXB0eSkge1xuICAgICAgICAgICAgICB2YXIgaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50ID0gZGVjb2Rlci5yZWFkQml0KFxuICAgICAgICAgICAgICAgIGNvbnRleHRzLFxuICAgICAgICAgICAgICAgIFJVTkxFTkdUSF9DT05URVhUXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICghaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50KSB7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwXSsrO1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIG9uZVJvd0Rvd25dKys7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgdHdvUm93c0Rvd25dKys7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgdGhyZWVSb3dzRG93bl0rKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbmV4dCBjb2x1bW5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpMSA9XG4gICAgICAgICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxKSB8XG4gICAgICAgICAgICAgICAgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpO1xuICAgICAgICAgICAgICBpZiAoaTEgIT09IDApIHtcbiAgICAgICAgICAgICAgICBpID0gaTAgKyBpMTtcbiAgICAgICAgICAgICAgICBpbmRleCArPSBpMSAqIHdpZHRoO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduO1xuICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPSAxO1xuICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrO1xuXG4gICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwO1xuICAgICAgICAgICAgICBmb3IgKHZhciBpMiA9IGkwOyBpMiA8PSBpOyBpMisrLCBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaTErKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IGkwICsgaTE7IGkgPCBpTmV4dDsgaSsrLCBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8XG4gICAgICAgICAgICAgICAgKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBwcm9jZXNzZWRNYXNrKSAhPT0gMFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSBsYWJlbHNbbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XV07XG4gICAgICAgICAgICAgIHZhciBkZWNpc2lvbiA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uID09PSAxKSB7XG4gICAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247XG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2hlY2tTZWdtZW50YXRpb25TeW1ib2w6IGZ1bmN0aW9uIEJpdE1vZGVsX2NoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCkge1xuICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdmFyIHN5bWJvbCA9XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAzKSB8XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAyKSB8XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxKSB8XG4gICAgICAgICAgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpO1xuICAgICAgICBpZiAoc3ltYm9sICE9PSAweGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJJbnZhbGlkIHNlZ21lbnRhdGlvbiBzeW1ib2xcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBCaXRNb2RlbDtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIEYsIERpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtYXRpb25cbiAgdmFyIFRyYW5zZm9ybSA9IChmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm0oKSB7fVxuXG4gICAgVHJhbnNmb3JtLnByb3RvdHlwZS5jYWxjdWxhdGUgPSBmdW5jdGlvbiB0cmFuc2Zvcm1DYWxjdWxhdGUoXG4gICAgICBzdWJiYW5kcyxcbiAgICAgIHUwLFxuICAgICAgdjBcbiAgICApIHtcbiAgICAgIHZhciBsbCA9IHN1YmJhbmRzWzBdO1xuICAgICAgZm9yICh2YXIgaSA9IDEsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBsbCA9IHRoaXMuaXRlcmF0ZShsbCwgc3ViYmFuZHNbaV0sIHUwLCB2MCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGw7XG4gICAgfTtcbiAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uIGV4dGVuZChidWZmZXIsIG9mZnNldCwgc2l6ZSkge1xuICAgICAgLy8gU2VjdGlvbiBGLjMuNyBleHRlbmRpbmcuLi4gdXNpbmcgbWF4IGV4dGVuc2lvbiBvZiA0XG4gICAgICB2YXIgaTEgPSBvZmZzZXQgLSAxLFxuICAgICAgICBqMSA9IG9mZnNldCArIDE7XG4gICAgICB2YXIgaTIgPSBvZmZzZXQgKyBzaXplIC0gMixcbiAgICAgICAgajIgPSBvZmZzZXQgKyBzaXplO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxXSA9IGJ1ZmZlcltqMV07XG4gICAgICBidWZmZXJbajJdID0gYnVmZmVyW2kyXTtcbiAgICB9O1xuICAgIFRyYW5zZm9ybS5wcm90b3R5cGUuaXRlcmF0ZSA9IGZ1bmN0aW9uIFRyYW5zZm9ybV9pdGVyYXRlKFxuICAgICAgbGwsXG4gICAgICBobF9saF9oaCxcbiAgICAgIHUwLFxuICAgICAgdjBcbiAgICApIHtcbiAgICAgIHZhciBsbFdpZHRoID0gbGwud2lkdGgsXG4gICAgICAgIGxsSGVpZ2h0ID0gbGwuaGVpZ2h0LFxuICAgICAgICBsbEl0ZW1zID0gbGwuaXRlbXM7XG4gICAgICB2YXIgd2lkdGggPSBobF9saF9oaC53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBobF9saF9oaC5oZWlnaHQ7XG4gICAgICB2YXIgaXRlbXMgPSBobF9saF9oaC5pdGVtcztcbiAgICAgIHZhciBpLCBqLCBrLCBsLCB1LCB2O1xuXG4gICAgICAvLyBJbnRlcmxlYXZlIExMIGFjY29yZGluZyB0byBTZWN0aW9uIEYuMy4zXG4gICAgICBmb3IgKGsgPSAwLCBpID0gMDsgaSA8IGxsSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgbCA9IGkgKiAyICogd2lkdGg7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsbFdpZHRoOyBqKyssIGsrKywgbCArPSAyKSB7XG4gICAgICAgICAgaXRlbXNbbF0gPSBsbEl0ZW1zW2tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgTEwgYmFuZCBpcyBub3QgbmVlZGVkIGFueW1vcmUuXG4gICAgICBsbEl0ZW1zID0gbGwuaXRlbXMgPSBudWxsO1xuXG4gICAgICB2YXIgYnVmZmVyUGFkZGluZyA9IDQ7XG4gICAgICB2YXIgcm93QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCArIDIgKiBidWZmZXJQYWRkaW5nKTtcblxuICAgICAgLy8gU2VjdGlvbiBGLjMuNCBIT1JfU1JcbiAgICAgIGlmICh3aWR0aCA9PT0gMSkge1xuICAgICAgICAvLyBpZiB3aWR0aCA9IDEsIHdoZW4gdTAgZXZlbiBrZWVwIGl0ZW1zIGFzIGlzLCB3aGVuIG9kZCBkaXZpZGUgYnkgMlxuICAgICAgICBpZiAoKHUwICYgMSkgIT09IDApIHtcbiAgICAgICAgICBmb3IgKHYgPSAwLCBrID0gMDsgdiA8IGhlaWdodDsgdisrLCBrICs9IHdpZHRoKSB7XG4gICAgICAgICAgICBpdGVtc1trXSAqPSAwLjU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHYgPSAwLCBrID0gMDsgdiA8IGhlaWdodDsgdisrLCBrICs9IHdpZHRoKSB7XG4gICAgICAgICAgcm93QnVmZmVyLnNldChpdGVtcy5zdWJhcnJheShrLCBrICsgd2lkdGgpLCBidWZmZXJQYWRkaW5nKTtcblxuICAgICAgICAgIHRoaXMuZXh0ZW5kKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpO1xuICAgICAgICAgIHRoaXMuZmlsdGVyKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpO1xuXG4gICAgICAgICAgaXRlbXMuc2V0KFxuICAgICAgICAgICAgcm93QnVmZmVyLnN1YmFycmF5KGJ1ZmZlclBhZGRpbmcsIGJ1ZmZlclBhZGRpbmcgKyB3aWR0aCksXG4gICAgICAgICAgICBrXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBY2Nlc3NlcyB0byB0aGUgaXRlbXMgYXJyYXkgY2FuIHRha2UgbG9uZywgYmVjYXVzZSBpdCBtYXkgbm90IGZpdCBpbnRvXG4gICAgICAvLyBDUFUgY2FjaGUgYW5kIGhhcyB0byBiZSBmZXRjaGVkIGZyb20gbWFpbiBtZW1vcnkuIFNpbmNlIHN1YnNlcXVlbnRcbiAgICAgIC8vIGFjY2Vzc2VzIHRvIHRoZSBpdGVtcyBhcnJheSBhcmUgbm90IGxvY2FsIHdoZW4gcmVhZGluZyBjb2x1bW5zLCB3ZVxuICAgICAgLy8gaGF2ZSBhIGNhY2hlIG1pc3MgZXZlcnkgdGltZS4gVG8gcmVkdWNlIGNhY2hlIG1pc3NlcywgZ2V0IHVwIHRvXG4gICAgICAvLyAnbnVtQnVmZmVycycgaXRlbXMgYXQgYSB0aW1lIGFuZCBzdG9yZSB0aGVtIGludG8gdGhlIGluZGl2aWR1YWxcbiAgICAgIC8vIGJ1ZmZlcnMuIFRoZSBjb2xCdWZmZXJzIHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggdG8gZml0IGludG8gQ1BVIGNhY2hlLlxuICAgICAgdmFyIG51bUJ1ZmZlcnMgPSAxNjtcbiAgICAgIHZhciBjb2xCdWZmZXJzID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKSB7XG4gICAgICAgIGNvbEJ1ZmZlcnMucHVzaChuZXcgRmxvYXQzMkFycmF5KGhlaWdodCArIDIgKiBidWZmZXJQYWRkaW5nKSk7XG4gICAgICB9XG4gICAgICB2YXIgYixcbiAgICAgICAgY3VycmVudEJ1ZmZlciA9IDA7XG4gICAgICBsbCA9IGJ1ZmZlclBhZGRpbmcgKyBoZWlnaHQ7XG5cbiAgICAgIC8vIFNlY3Rpb24gRi4zLjUgVkVSX1NSXG4gICAgICBpZiAoaGVpZ2h0ID09PSAxKSB7XG4gICAgICAgIC8vIGlmIGhlaWdodCA9IDEsIHdoZW4gdjAgZXZlbiBrZWVwIGl0ZW1zIGFzIGlzLCB3aGVuIG9kZCBkaXZpZGUgYnkgMlxuICAgICAgICBpZiAoKHYwICYgMSkgIT09IDApIHtcbiAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgd2lkdGg7IHUrKykge1xuICAgICAgICAgICAgaXRlbXNbdV0gKj0gMC41O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHtcbiAgICAgICAgICAvLyBpZiB3ZSByYW4gb3V0IG9mIGJ1ZmZlcnMsIGNvcHkgc2V2ZXJhbCBpbWFnZSBjb2x1bW5zIGF0IG9uY2VcbiAgICAgICAgICBpZiAoY3VycmVudEJ1ZmZlciA9PT0gMCkge1xuICAgICAgICAgICAgbnVtQnVmZmVycyA9IE1hdGgubWluKHdpZHRoIC0gdSwgbnVtQnVmZmVycyk7XG4gICAgICAgICAgICBmb3IgKGsgPSB1LCBsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHtcbiAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykge1xuICAgICAgICAgICAgICAgIGNvbEJ1ZmZlcnNbYl1bbF0gPSBpdGVtc1trICsgYl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBudW1CdWZmZXJzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1cnJlbnRCdWZmZXItLTtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gY29sQnVmZmVyc1tjdXJyZW50QnVmZmVyXTtcbiAgICAgICAgICB0aGlzLmV4dGVuZChidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7XG4gICAgICAgICAgdGhpcy5maWx0ZXIoYnVmZmVyLCBidWZmZXJQYWRkaW5nLCBoZWlnaHQpO1xuXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBsYXN0IGJ1ZmZlciBpbiB0aGlzIGdyb3VwIG9mIGJ1ZmZlcnMsIGZsdXNoIGFsbCBidWZmZXJzLlxuICAgICAgICAgIGlmIChjdXJyZW50QnVmZmVyID09PSAwKSB7XG4gICAgICAgICAgICBrID0gdSAtIG51bUJ1ZmZlcnMgKyAxO1xuICAgICAgICAgICAgZm9yIChsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHtcbiAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykge1xuICAgICAgICAgICAgICAgIGl0ZW1zW2sgKyBiXSA9IGNvbEJ1ZmZlcnNbYl1bbF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgaXRlbXMsXG4gICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIFRyYW5zZm9ybTtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIDMuOC4yIElycmV2ZXJzaWJsZSA5LTcgZmlsdGVyXG4gIHZhciBJcnJldmVyc2libGVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtQ2xvc3VyZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCkge1xuICAgICAgVHJhbnNmb3JtLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7XG4gICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiBpcnJldmVyc2libGVUcmFuc2Zvcm1GaWx0ZXIoXG4gICAgICB4LFxuICAgICAgb2Zmc2V0LFxuICAgICAgbGVuZ3RoXG4gICAgKSB7XG4gICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgICAgdmFyIGosIG4sIGN1cnJlbnQsIG5leHQ7XG5cbiAgICAgIHZhciBhbHBoYSA9IC0xLjU4NjEzNDM0MjA1OTkyNDtcbiAgICAgIHZhciBiZXRhID0gLTAuMDUyOTgwMTE4NTcyOTYxO1xuICAgICAgdmFyIGdhbW1hID0gMC44ODI5MTEwNzU1MzA5MzQ7XG4gICAgICB2YXIgZGVsdGEgPSAwLjQ0MzUwNjg1MjA0Mzk3MTtcbiAgICAgIHZhciBLID0gMS4yMzAxNzQxMDQ5MTQwMDE7XG4gICAgICB2YXIgS18gPSAxIC8gSztcblxuICAgICAgLy8gc3RlcCAxIGlzIGNvbWJpbmVkIHdpdGggc3RlcCAzXG5cbiAgICAgIC8vIHN0ZXAgMlxuICAgICAgaiA9IG9mZnNldCAtIDM7XG4gICAgICBmb3IgKG4gPSBsZW4gKyA0OyBuLS07IGogKz0gMikge1xuICAgICAgICB4W2pdICo9IEtfO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGVwIDEgJiAzXG4gICAgICBqID0gb2Zmc2V0IC0gMjtcbiAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiAtIDFdO1xuICAgICAgZm9yIChuID0gbGVuICsgMzsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgbmV4dCA9IGRlbHRhICogeFtqICsgMV07XG4gICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0O1xuICAgICAgICBpZiAobi0tKSB7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiArIDFdO1xuICAgICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0ZXAgNFxuICAgICAgaiA9IG9mZnNldCAtIDE7XG4gICAgICBjdXJyZW50ID0gZ2FtbWEgKiB4W2ogLSAxXTtcbiAgICAgIGZvciAobiA9IGxlbiArIDI7IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIG5leHQgPSBnYW1tYSAqIHhbaiArIDFdO1xuICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICBpZiAobi0tKSB7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIGN1cnJlbnQgPSBnYW1tYSAqIHhbaiArIDFdO1xuICAgICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc3RlcCA1XG4gICAgICBqID0gb2Zmc2V0O1xuICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogLSAxXTtcbiAgICAgIGZvciAobiA9IGxlbiArIDE7IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIG5leHQgPSBiZXRhICogeFtqICsgMV07XG4gICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7XG4gICAgICAgIGlmIChuLS0pIHtcbiAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogKyAxXTtcbiAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0ZXAgNlxuICAgICAgaWYgKGxlbiAhPT0gMCkge1xuICAgICAgICBqID0gb2Zmc2V0ICsgMTtcbiAgICAgICAgY3VycmVudCA9IGFscGhhICogeFtqIC0gMV07XG4gICAgICAgIGZvciAobiA9IGxlbjsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgICBuZXh0ID0gYWxwaGEgKiB4W2ogKyAxXTtcbiAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICAgIGlmIChuLS0pIHtcbiAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiArIDFdO1xuICAgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBJcnJldmVyc2libGVUcmFuc2Zvcm07XG4gIH0pKCk7XG5cbiAgLy8gU2VjdGlvbiAzLjguMSBSZXZlcnNpYmxlIDUtMyBmaWx0ZXJcbiAgdmFyIFJldmVyc2libGVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm0oKSB7XG4gICAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7XG4gICAgUmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gcmV2ZXJzaWJsZVRyYW5zZm9ybUZpbHRlcihcbiAgICAgIHgsXG4gICAgICBvZmZzZXQsXG4gICAgICBsZW5ndGhcbiAgICApIHtcbiAgICAgIHZhciBsZW4gPSBsZW5ndGggPj4gMTtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgICB2YXIgaiwgbjtcblxuICAgICAgZm9yIChqID0gb2Zmc2V0LCBuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgeFtqXSAtPSAoeFtqIC0gMV0gKyB4W2ogKyAxXSArIDIpID4+IDI7XG4gICAgICB9XG5cbiAgICAgIGZvciAoaiA9IG9mZnNldCArIDEsIG4gPSBsZW47IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIHhbal0gKz0gKHhbaiAtIDFdICsgeFtqICsgMV0pID4+IDE7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBSZXZlcnNpYmxlVHJhbnNmb3JtO1xuICB9KSgpO1xuXG4gIHJldHVybiBKcHhJbWFnZTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpweEltYWdlIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYnl0ZXNUb1N0cmluZyxcbiAgRm9ybWF0RXJyb3IsXG4gIFBhc3N3b3JkRXhjZXB0aW9uLFxuICBQYXNzd29yZFJlc3BvbnNlcyxcbiAgc3RyaW5nVG9CeXRlcyxcbiAgdW5yZWFjaGFibGUsXG4gIHV0ZjhTdHJpbmdUb1N0cmluZyxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBpc0RpY3QsIGlzTmFtZSwgTmFtZSB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IERlY3J5cHRTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcblxudmFyIEFSQ0ZvdXJDaXBoZXIgPSAoZnVuY3Rpb24gQVJDRm91ckNpcGhlckNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQVJDRm91ckNpcGhlcihrZXkpIHtcbiAgICB0aGlzLmEgPSAwO1xuICAgIHRoaXMuYiA9IDA7XG4gICAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICAgIHZhciBpLFxuICAgICAgaiA9IDAsXG4gICAgICB0bXAsXG4gICAgICBrZXlMZW5ndGggPSBrZXkubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgc1tpXSA9IGk7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgdG1wID0gc1tpXTtcbiAgICAgIGogPSAoaiArIHRtcCArIGtleVtpICUga2V5TGVuZ3RoXSkgJiAweGZmO1xuICAgICAgc1tpXSA9IHNbal07XG4gICAgICBzW2pdID0gdG1wO1xuICAgIH1cbiAgICB0aGlzLnMgPSBzO1xuICB9XG5cbiAgQVJDRm91ckNpcGhlci5wcm90b3R5cGUgPSB7XG4gICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiBBUkNGb3VyQ2lwaGVyX2VuY3J5cHRCbG9jayhkYXRhKSB7XG4gICAgICB2YXIgaSxcbiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLFxuICAgICAgICB0bXAsXG4gICAgICAgIHRtcDI7XG4gICAgICB2YXIgYSA9IHRoaXMuYSxcbiAgICAgICAgYiA9IHRoaXMuYixcbiAgICAgICAgcyA9IHRoaXMucztcbiAgICAgIHZhciBvdXRwdXQgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgYSA9IChhICsgMSkgJiAweGZmO1xuICAgICAgICB0bXAgPSBzW2FdO1xuICAgICAgICBiID0gKGIgKyB0bXApICYgMHhmZjtcbiAgICAgICAgdG1wMiA9IHNbYl07XG4gICAgICAgIHNbYV0gPSB0bXAyO1xuICAgICAgICBzW2JdID0gdG1wO1xuICAgICAgICBvdXRwdXRbaV0gPSBkYXRhW2ldIF4gc1sodG1wICsgdG1wMikgJiAweGZmXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYSA9IGE7XG4gICAgICB0aGlzLmIgPSBiO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9LFxuICB9O1xuICBBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5kZWNyeXB0QmxvY2sgPSBBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5lbmNyeXB0QmxvY2s7XG4gIEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHQgPSBBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5lbmNyeXB0QmxvY2s7XG5cbiAgcmV0dXJuIEFSQ0ZvdXJDaXBoZXI7XG59KSgpO1xuXG52YXIgY2FsY3VsYXRlTUQ1ID0gKGZ1bmN0aW9uIGNhbGN1bGF0ZU1ENUNsb3N1cmUoKSB7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgciA9IG5ldyBVaW50OEFycmF5KFtcbiAgICA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLFxuICAgIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCxcbiAgICA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLFxuICAgIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjFdKTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgdmFyIGsgPSBuZXcgSW50MzJBcnJheShbXG4gICAgLTY4MDg3NjkzNiwgLTM4OTU2NDU4NiwgNjA2MTA1ODE5LCAtMTA0NDUyNTMzMCwgLTE3NjQxODg5NywgMTIwMDA4MDQyNixcbiAgICAtMTQ3MzIzMTM0MSwgLTQ1NzA1OTgzLCAxNzcwMDM1NDE2LCAtMTk1ODQxNDQxNywgLTQyMDYzLCAtMTk5MDQwNDE2MixcbiAgICAxODA0NjAzNjgyLCAtNDAzNDExMDEsIC0xNTAyMDAyMjkwLCAxMjM2NTM1MzI5LCAtMTY1Nzk2NTEwLCAtMTA2OTUwMTYzMixcbiAgICA2NDM3MTc3MTMsIC0zNzM4OTczMDIsIC03MDE1NTg2OTEsIDM4MDE2MDgzLCAtNjYwNDc4MzM1LCAtNDA1NTM3ODQ4LFxuICAgIDU2ODQ0NjQzOCwgLTEwMTk4MDM2OTAsIC0xODczNjM5NjEsIDExNjM1MzE1MDEsIC0xNDQ0NjgxNDY3LCAtNTE0MDM3ODQsXG4gICAgMTczNTMyODQ3MywgLTE5MjY2MDc3MzQsIC0zNzg1NTgsIC0yMDIyNTc0NDYzLCAxODM5MDMwNTYyLCAtMzUzMDk1NTYsXG4gICAgLTE1MzA5OTIwNjAsIDEyNzI4OTMzNTMsIC0xNTU0OTc2MzIsIC0xMDk0NzMwNjQwLCA2ODEyNzkxNzQsIC0zNTg1MzcyMjIsXG4gICAgLTcyMjUyMTk3OSwgNzYwMjkxODksIC02NDAzNjQ0ODcsIC00MjE4MTU4MzUsIDUzMDc0MjUyMCwgLTk5NTMzODY1MSxcbiAgICAtMTk4NjMwODQ0LCAxMTI2ODkxNDE1LCAtMTQxNjM1NDkwNSwgLTU3NDM0MDU1LCAxNzAwNDg1NTcxLCAtMTg5NDk4NjYwNixcbiAgICAtMTA1MTUyMywgLTIwNTQ5MjI3OTksIDE4NzMzMTMzNTksIC0zMDYxMTc0NCwgLTE1NjAxOTgzODAsIDEzMDkxNTE2NDksXG4gICAgLTE0NTUyMzA3MCwgLTExMjAyMTAzNzksIDcxODc4NzI1OSwgLTM0MzQ4NTU1MV0pO1xuXG4gIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICB2YXIgaDAgPSAxNzMyNTg0MTkzLFxuICAgICAgaDEgPSAtMjcxNzMzODc5LFxuICAgICAgaDIgPSAtMTczMjU4NDE5NCxcbiAgICAgIGgzID0gMjcxNzMzODc4O1xuICAgIC8vIHByZS1wcm9jZXNzaW5nXG4gICAgdmFyIHBhZGRlZExlbmd0aCA9IChsZW5ndGggKyA3MikgJiB+NjM7IC8vIGRhdGEgKyA5IGV4dHJhIGJ5dGVzXG4gICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7XG4gICAgdmFyIGksIGosIG47XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTtcbiAgICB9XG4gICAgcGFkZGVkW2krK10gPSAweDgwO1xuICAgIG4gPSBwYWRkZWRMZW5ndGggLSA4O1xuICAgIHdoaWxlIChpIDwgbikge1xuICAgICAgcGFkZGVkW2krK10gPSAwO1xuICAgIH1cbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPDwgMykgJiAweGZmO1xuICAgIHBhZGRlZFtpKytdID0gKGxlbmd0aCA+PiA1KSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDEzKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDIxKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+PiAyOSkgJiAweGZmO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHZhciB3ID0gbmV3IEludDMyQXJyYXkoMTYpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7ICkge1xuICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2osIGkgKz0gNCkge1xuICAgICAgICB3W2pdID1cbiAgICAgICAgICBwYWRkZWRbaV0gfFxuICAgICAgICAgIChwYWRkZWRbaSArIDFdIDw8IDgpIHxcbiAgICAgICAgICAocGFkZGVkW2kgKyAyXSA8PCAxNikgfFxuICAgICAgICAgIChwYWRkZWRbaSArIDNdIDw8IDI0KTtcbiAgICAgIH1cbiAgICAgIHZhciBhID0gaDAsXG4gICAgICAgIGIgPSBoMSxcbiAgICAgICAgYyA9IGgyLFxuICAgICAgICBkID0gaDMsXG4gICAgICAgIGYsXG4gICAgICAgIGc7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICsraikge1xuICAgICAgICBpZiAoaiA8IDE2KSB7XG4gICAgICAgICAgZiA9IChiICYgYykgfCAofmIgJiBkKTtcbiAgICAgICAgICBnID0gajtcbiAgICAgICAgfSBlbHNlIGlmIChqIDwgMzIpIHtcbiAgICAgICAgICBmID0gKGQgJiBiKSB8ICh+ZCAmIGMpO1xuICAgICAgICAgIGcgPSAoNSAqIGogKyAxKSAmIDE1O1xuICAgICAgICB9IGVsc2UgaWYgKGogPCA0OCkge1xuICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICAgICAgZyA9ICgzICogaiArIDUpICYgMTU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZiA9IGMgXiAoYiB8IH5kKTtcbiAgICAgICAgICBnID0gKDcgKiBqKSAmIDE1O1xuICAgICAgICB9XG4gICAgICAgIHZhciB0bXAgPSBkLFxuICAgICAgICAgIHJvdGF0ZUFyZyA9IChhICsgZiArIGtbal0gKyB3W2ddKSB8IDAsXG4gICAgICAgICAgcm90YXRlID0gcltqXTtcbiAgICAgICAgZCA9IGM7XG4gICAgICAgIGMgPSBiO1xuICAgICAgICBiID0gKGIgKyAoKHJvdGF0ZUFyZyA8PCByb3RhdGUpIHwgKHJvdGF0ZUFyZyA+Pj4gKDMyIC0gcm90YXRlKSkpKSB8IDA7XG4gICAgICAgIGEgPSB0bXA7XG4gICAgICB9XG4gICAgICBoMCA9IChoMCArIGEpIHwgMDtcbiAgICAgIGgxID0gKGgxICsgYikgfCAwO1xuICAgICAgaDIgPSAoaDIgKyBjKSB8IDA7XG4gICAgICBoMyA9IChoMyArIGQpIHwgMDtcbiAgICB9XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtcbiAgICAgIGgwICYgMHhGRiwgKGgwID4+IDgpICYgMHhGRiwgKGgwID4+IDE2KSAmIDB4RkYsIChoMCA+Pj4gMjQpICYgMHhGRixcbiAgICAgIGgxICYgMHhGRiwgKGgxID4+IDgpICYgMHhGRiwgKGgxID4+IDE2KSAmIDB4RkYsIChoMSA+Pj4gMjQpICYgMHhGRixcbiAgICAgIGgyICYgMHhGRiwgKGgyID4+IDgpICYgMHhGRiwgKGgyID4+IDE2KSAmIDB4RkYsIChoMiA+Pj4gMjQpICYgMHhGRixcbiAgICAgIGgzICYgMHhGRiwgKGgzID4+IDgpICYgMHhGRiwgKGgzID4+IDE2KSAmIDB4RkYsIChoMyA+Pj4gMjQpICYgMHhGRlxuICAgIF0pO1xuICB9XG5cbiAgcmV0dXJuIGhhc2g7XG59KSgpO1xudmFyIFdvcmQ2NCA9IChmdW5jdGlvbiBXb3JkNjRDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIFdvcmQ2NChoaWdoSW50ZWdlciwgbG93SW50ZWdlcikge1xuICAgIHRoaXMuaGlnaCA9IGhpZ2hJbnRlZ2VyIHwgMDtcbiAgICB0aGlzLmxvdyA9IGxvd0ludGVnZXIgfCAwO1xuICB9XG4gIFdvcmQ2NC5wcm90b3R5cGUgPSB7XG4gICAgYW5kOiBmdW5jdGlvbiBXb3JkNjRfYW5kKHdvcmQpIHtcbiAgICAgIHRoaXMuaGlnaCAmPSB3b3JkLmhpZ2g7XG4gICAgICB0aGlzLmxvdyAmPSB3b3JkLmxvdztcbiAgICB9LFxuICAgIHhvcjogZnVuY3Rpb24gV29yZDY0X3hvcih3b3JkKSB7XG4gICAgICB0aGlzLmhpZ2ggXj0gd29yZC5oaWdoO1xuICAgICAgdGhpcy5sb3cgXj0gd29yZC5sb3c7XG4gICAgfSxcblxuICAgIG9yOiBmdW5jdGlvbiBXb3JkNjRfb3Iod29yZCkge1xuICAgICAgdGhpcy5oaWdoIHw9IHdvcmQuaGlnaDtcbiAgICAgIHRoaXMubG93IHw9IHdvcmQubG93O1xuICAgIH0sXG5cbiAgICBzaGlmdFJpZ2h0OiBmdW5jdGlvbiBXb3JkNjRfc2hpZnRSaWdodChwbGFjZXMpIHtcbiAgICAgIGlmIChwbGFjZXMgPj0gMzIpIHtcbiAgICAgICAgdGhpcy5sb3cgPSAodGhpcy5oaWdoID4+PiAocGxhY2VzIC0gMzIpKSB8IDA7XG4gICAgICAgIHRoaXMuaGlnaCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvdyA9ICh0aGlzLmxvdyA+Pj4gcGxhY2VzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gcGxhY2VzKSk7XG4gICAgICAgIHRoaXMuaGlnaCA9ICh0aGlzLmhpZ2ggPj4+IHBsYWNlcykgfCAwO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBzaGlmdExlZnQ6IGZ1bmN0aW9uIFdvcmQ2NF9zaGlmdExlZnQocGxhY2VzKSB7XG4gICAgICBpZiAocGxhY2VzID49IDMyKSB7XG4gICAgICAgIHRoaXMuaGlnaCA9IHRoaXMubG93IDw8IChwbGFjZXMgLSAzMik7XG4gICAgICAgIHRoaXMubG93ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlnaCA9ICh0aGlzLmhpZ2ggPDwgcGxhY2VzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gcGxhY2VzKSk7XG4gICAgICAgIHRoaXMubG93ID0gdGhpcy5sb3cgPDwgcGxhY2VzO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICByb3RhdGVSaWdodDogZnVuY3Rpb24gV29yZDY0X3JvdGF0ZVJpZ2h0KHBsYWNlcykge1xuICAgICAgdmFyIGxvdywgaGlnaDtcbiAgICAgIGlmIChwbGFjZXMgJiAzMikge1xuICAgICAgICBoaWdoID0gdGhpcy5sb3c7XG4gICAgICAgIGxvdyA9IHRoaXMuaGlnaDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvdyA9IHRoaXMubG93O1xuICAgICAgICBoaWdoID0gdGhpcy5oaWdoO1xuICAgICAgfVxuICAgICAgcGxhY2VzICY9IDMxO1xuICAgICAgdGhpcy5sb3cgPSAobG93ID4+PiBwbGFjZXMpIHwgKGhpZ2ggPDwgKDMyIC0gcGxhY2VzKSk7XG4gICAgICB0aGlzLmhpZ2ggPSAoaGlnaCA+Pj4gcGxhY2VzKSB8IChsb3cgPDwgKDMyIC0gcGxhY2VzKSk7XG4gICAgfSxcblxuICAgIG5vdDogZnVuY3Rpb24gV29yZDY0X25vdCgpIHtcbiAgICAgIHRoaXMuaGlnaCA9IH50aGlzLmhpZ2g7XG4gICAgICB0aGlzLmxvdyA9IH50aGlzLmxvdztcbiAgICB9LFxuXG4gICAgYWRkOiBmdW5jdGlvbiBXb3JkNjRfYWRkKHdvcmQpIHtcbiAgICAgIHZhciBsb3dBZGQgPSAodGhpcy5sb3cgPj4+IDApICsgKHdvcmQubG93ID4+PiAwKTtcbiAgICAgIHZhciBoaWdoQWRkID0gKHRoaXMuaGlnaCA+Pj4gMCkgKyAod29yZC5oaWdoID4+PiAwKTtcbiAgICAgIGlmIChsb3dBZGQgPiAweGZmZmZmZmZmKSB7XG4gICAgICAgIGhpZ2hBZGQgKz0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG93ID0gbG93QWRkIHwgMDtcbiAgICAgIHRoaXMuaGlnaCA9IGhpZ2hBZGQgfCAwO1xuICAgIH0sXG5cbiAgICBjb3B5VG86IGZ1bmN0aW9uIFdvcmQ2NF9jb3B5VG8oYnl0ZXMsIG9mZnNldCkge1xuICAgICAgYnl0ZXNbb2Zmc2V0XSA9ICh0aGlzLmhpZ2ggPj4+IDI0KSAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyAxXSA9ICh0aGlzLmhpZ2ggPj4gMTYpICYgMHhmZjtcbiAgICAgIGJ5dGVzW29mZnNldCArIDJdID0gKHRoaXMuaGlnaCA+PiA4KSAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyAzXSA9IHRoaXMuaGlnaCAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyA0XSA9ICh0aGlzLmxvdyA+Pj4gMjQpICYgMHhmZjtcbiAgICAgIGJ5dGVzW29mZnNldCArIDVdID0gKHRoaXMubG93ID4+IDE2KSAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyA2XSA9ICh0aGlzLmxvdyA+PiA4KSAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyA3XSA9IHRoaXMubG93ICYgMHhmZjtcbiAgICB9LFxuXG4gICAgYXNzaWduOiBmdW5jdGlvbiBXb3JkNjRfYXNzaWduKHdvcmQpIHtcbiAgICAgIHRoaXMuaGlnaCA9IHdvcmQuaGlnaDtcbiAgICAgIHRoaXMubG93ID0gd29yZC5sb3c7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIFdvcmQ2NDtcbn0pKCk7XG5cbnZhciBjYWxjdWxhdGVTSEEyNTYgPSAoZnVuY3Rpb24gY2FsY3VsYXRlU0hBMjU2Q2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gcm90cih4LCBuKSB7XG4gICAgcmV0dXJuICh4ID4+PiBuKSB8ICh4IDw8ICgzMiAtIG4pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoKHgsIHksIHopIHtcbiAgICByZXR1cm4gKHggJiB5KSBeICh+eCAmIHopO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFqKHgsIHksIHopIHtcbiAgICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbWEoeCkge1xuICAgIHJldHVybiByb3RyKHgsIDIpIF4gcm90cih4LCAxMykgXiByb3RyKHgsIDIyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZ21hUHJpbWUoeCkge1xuICAgIHJldHVybiByb3RyKHgsIDYpIF4gcm90cih4LCAxMSkgXiByb3RyKHgsIDI1KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpdHRsZVNpZ21hKHgpIHtcbiAgICByZXR1cm4gcm90cih4LCA3KSBeIHJvdHIoeCwgMTgpIF4gKHggPj4+IDMpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGl0dGxlU2lnbWFQcmltZSh4KSB7XG4gICAgcmV0dXJuIHJvdHIoeCwgMTcpIF4gcm90cih4LCAxOSkgXiAoeCA+Pj4gMTApO1xuICB9XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBrID0gWzB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gICAgICAgICAgIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gICAgICAgICAgIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gICAgICAgICAgIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gICAgICAgICAgIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gICAgICAgICAgIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gICAgICAgICAgIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gICAgICAgICAgIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gICAgICAgICAgIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gICAgICAgICAgIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gICAgICAgICAgIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gICAgICAgICAgIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gICAgICAgICAgIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gICAgICAgICAgIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gICAgICAgICAgIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gICAgICAgICAgIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJdO1xuXG4gIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAvLyBpbml0aWFsIGhhc2ggdmFsdWVzXG4gICAgdmFyIGgwID0gMHg2YTA5ZTY2NyxcbiAgICAgIGgxID0gMHhiYjY3YWU4NSxcbiAgICAgIGgyID0gMHgzYzZlZjM3MixcbiAgICAgIGgzID0gMHhhNTRmZjUzYSxcbiAgICAgIGg0ID0gMHg1MTBlNTI3ZixcbiAgICAgIGg1ID0gMHg5YjA1Njg4YyxcbiAgICAgIGg2ID0gMHgxZjgzZDlhYixcbiAgICAgIGg3ID0gMHg1YmUwY2QxOTtcbiAgICAvLyBwcmUtcHJvY2Vzc2luZ1xuICAgIHZhciBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDkpIC8gNjQpICogNjQ7XG4gICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7XG4gICAgdmFyIGksIGosIG47XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTtcbiAgICB9XG4gICAgcGFkZGVkW2krK10gPSAweDgwO1xuICAgIG4gPSBwYWRkZWRMZW5ndGggLSA4O1xuICAgIHdoaWxlIChpIDwgbikge1xuICAgICAgcGFkZGVkW2krK10gPSAwO1xuICAgIH1cbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPj4+IDI5KSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDIxKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDEzKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDUpICYgMHhmZjtcbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPDwgMykgJiAweGZmO1xuICAgIHZhciB3ID0gbmV3IFVpbnQzMkFycmF5KDY0KTtcbiAgICAvLyBmb3IgZWFjaCA1MTIgYml0IGJsb2NrXG4gICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDsgKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgICB3W2pdID1cbiAgICAgICAgICAocGFkZGVkW2ldIDw8IDI0KSB8XG4gICAgICAgICAgKHBhZGRlZFtpICsgMV0gPDwgMTYpIHxcbiAgICAgICAgICAocGFkZGVkW2kgKyAyXSA8PCA4KSB8XG4gICAgICAgICAgcGFkZGVkW2kgKyAzXTtcbiAgICAgICAgaSArPSA0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKGogPSAxNjsgaiA8IDY0OyArK2opIHtcbiAgICAgICAgd1tqXSA9XG4gICAgICAgICAgKGxpdHRsZVNpZ21hUHJpbWUod1tqIC0gMl0pICtcbiAgICAgICAgICAgIHdbaiAtIDddICtcbiAgICAgICAgICAgIGxpdHRsZVNpZ21hKHdbaiAtIDE1XSkgK1xuICAgICAgICAgICAgd1tqIC0gMTZdKSB8XG4gICAgICAgICAgMDtcbiAgICAgIH1cbiAgICAgIHZhciBhID0gaDAsXG4gICAgICAgIGIgPSBoMSxcbiAgICAgICAgYyA9IGgyLFxuICAgICAgICBkID0gaDMsXG4gICAgICAgIGUgPSBoNCxcbiAgICAgICAgZiA9IGg1LFxuICAgICAgICBnID0gaDYsXG4gICAgICAgIGggPSBoNyxcbiAgICAgICAgdDEsXG4gICAgICAgIHQyO1xuICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyArK2opIHtcbiAgICAgICAgdDEgPSBoICsgc2lnbWFQcmltZShlKSArIGNoKGUsIGYsIGcpICsga1tqXSArIHdbal07XG4gICAgICAgIHQyID0gc2lnbWEoYSkgKyBtYWooYSwgYiwgYyk7XG4gICAgICAgIGggPSBnO1xuICAgICAgICBnID0gZjtcbiAgICAgICAgZiA9IGU7XG4gICAgICAgIGUgPSAoZCArIHQxKSB8IDA7XG4gICAgICAgIGQgPSBjO1xuICAgICAgICBjID0gYjtcbiAgICAgICAgYiA9IGE7XG4gICAgICAgIGEgPSAodDEgKyB0MikgfCAwO1xuICAgICAgfVxuICAgICAgaDAgPSAoaDAgKyBhKSB8IDA7XG4gICAgICBoMSA9IChoMSArIGIpIHwgMDtcbiAgICAgIGgyID0gKGgyICsgYykgfCAwO1xuICAgICAgaDMgPSAoaDMgKyBkKSB8IDA7XG4gICAgICBoNCA9IChoNCArIGUpIHwgMDtcbiAgICAgIGg1ID0gKGg1ICsgZikgfCAwO1xuICAgICAgaDYgPSAoaDYgKyBnKSB8IDA7XG4gICAgICBoNyA9IChoNyArIGgpIHwgMDtcbiAgICB9XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtcbiAgICAgIChoMCA+PiAyNCkgJiAweEZGLCAoaDAgPj4gMTYpICYgMHhGRiwgKGgwID4+IDgpICYgMHhGRiwgKGgwKSAmIDB4RkYsXG4gICAgICAoaDEgPj4gMjQpICYgMHhGRiwgKGgxID4+IDE2KSAmIDB4RkYsIChoMSA+PiA4KSAmIDB4RkYsIChoMSkgJiAweEZGLFxuICAgICAgKGgyID4+IDI0KSAmIDB4RkYsIChoMiA+PiAxNikgJiAweEZGLCAoaDIgPj4gOCkgJiAweEZGLCAoaDIpICYgMHhGRixcbiAgICAgIChoMyA+PiAyNCkgJiAweEZGLCAoaDMgPj4gMTYpICYgMHhGRiwgKGgzID4+IDgpICYgMHhGRiwgKGgzKSAmIDB4RkYsXG4gICAgICAoaDQgPj4gMjQpICYgMHhGRiwgKGg0ID4+IDE2KSAmIDB4RkYsIChoNCA+PiA4KSAmIDB4RkYsIChoNCkgJiAweEZGLFxuICAgICAgKGg1ID4+IDI0KSAmIDB4RkYsIChoNSA+PiAxNikgJiAweEZGLCAoaDUgPj4gOCkgJiAweEZGLCAoaDUpICYgMHhGRixcbiAgICAgIChoNiA+PiAyNCkgJiAweEZGLCAoaDYgPj4gMTYpICYgMHhGRiwgKGg2ID4+IDgpICYgMHhGRiwgKGg2KSAmIDB4RkYsXG4gICAgICAoaDcgPj4gMjQpICYgMHhGRiwgKGg3ID4+IDE2KSAmIDB4RkYsIChoNyA+PiA4KSAmIDB4RkYsIChoNykgJiAweEZGXG4gICAgXSk7XG4gIH1cblxuICByZXR1cm4gaGFzaDtcbn0pKCk7XG5cbnZhciBjYWxjdWxhdGVTSEE1MTIgPSAoZnVuY3Rpb24gY2FsY3VsYXRlU0hBNTEyQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gY2gocmVzdWx0LCB4LCB5LCB6LCB0bXApIHtcbiAgICByZXN1bHQuYXNzaWduKHgpO1xuICAgIHJlc3VsdC5hbmQoeSk7XG4gICAgdG1wLmFzc2lnbih4KTtcbiAgICB0bXAubm90KCk7XG4gICAgdG1wLmFuZCh6KTtcbiAgICByZXN1bHQueG9yKHRtcCk7XG4gIH1cblxuICBmdW5jdGlvbiBtYWoocmVzdWx0LCB4LCB5LCB6LCB0bXApIHtcbiAgICByZXN1bHQuYXNzaWduKHgpO1xuICAgIHJlc3VsdC5hbmQoeSk7XG4gICAgdG1wLmFzc2lnbih4KTtcbiAgICB0bXAuYW5kKHopO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgICB0bXAuYXNzaWduKHkpO1xuICAgIHRtcC5hbmQoeik7XG4gICAgcmVzdWx0Lnhvcih0bXApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbWEocmVzdWx0LCB4LCB0bXApIHtcbiAgICByZXN1bHQuYXNzaWduKHgpO1xuICAgIHJlc3VsdC5yb3RhdGVSaWdodCgyOCk7XG4gICAgdG1wLmFzc2lnbih4KTtcbiAgICB0bXAucm90YXRlUmlnaHQoMzQpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgICB0bXAuYXNzaWduKHgpO1xuICAgIHRtcC5yb3RhdGVSaWdodCgzOSk7XG4gICAgcmVzdWx0Lnhvcih0bXApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbWFQcmltZShyZXN1bHQsIHgsIHRtcCkge1xuICAgIHJlc3VsdC5hc3NpZ24oeCk7XG4gICAgcmVzdWx0LnJvdGF0ZVJpZ2h0KDE0KTtcbiAgICB0bXAuYXNzaWduKHgpO1xuICAgIHRtcC5yb3RhdGVSaWdodCgxOCk7XG4gICAgcmVzdWx0Lnhvcih0bXApO1xuICAgIHRtcC5hc3NpZ24oeCk7XG4gICAgdG1wLnJvdGF0ZVJpZ2h0KDQxKTtcbiAgICByZXN1bHQueG9yKHRtcCk7XG4gIH1cblxuICBmdW5jdGlvbiBsaXR0bGVTaWdtYShyZXN1bHQsIHgsIHRtcCkge1xuICAgIHJlc3VsdC5hc3NpZ24oeCk7XG4gICAgcmVzdWx0LnJvdGF0ZVJpZ2h0KDEpO1xuICAgIHRtcC5hc3NpZ24oeCk7XG4gICAgdG1wLnJvdGF0ZVJpZ2h0KDgpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgICB0bXAuYXNzaWduKHgpO1xuICAgIHRtcC5zaGlmdFJpZ2h0KDcpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHtcbiAgICByZXN1bHQuYXNzaWduKHgpO1xuICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxOSk7XG4gICAgdG1wLmFzc2lnbih4KTtcbiAgICB0bXAucm90YXRlUmlnaHQoNjEpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgICB0bXAuYXNzaWduKHgpO1xuICAgIHRtcC5zaGlmdFJpZ2h0KDYpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgfVxuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgayA9IFtcbiAgICBuZXcgV29yZDY0KDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIpLCBuZXcgV29yZDY0KDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QpLFxuICAgIG5ldyBXb3JkNjQoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIG5ldyBXb3JkNjQoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksXG4gICAgbmV3IFdvcmQ2NCgweDM5NTZjMjViLCAweGYzNDhiNTM4KSwgbmV3IFdvcmQ2NCgweDU5ZjExMWYxLCAweGI2MDVkMDE5KSxcbiAgICBuZXcgV29yZDY0KDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIpLCBuZXcgV29yZDY0KDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgpLFxuICAgIG5ldyBXb3JkNjQoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIG5ldyBXb3JkNjQoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksXG4gICAgbmV3IFdvcmQ2NCgweDI0MzE4NWJlLCAweDRlZTRiMjhjKSwgbmV3IFdvcmQ2NCgweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyKSxcbiAgICBuZXcgV29yZDY0KDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYpLCBuZXcgV29yZDY0KDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEpLFxuICAgIG5ldyBXb3JkNjQoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIG5ldyBXb3JkNjQoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksXG4gICAgbmV3IFdvcmQ2NCgweGU0OWI2OWMxLCAweDllZjE0YWQyKSwgbmV3IFdvcmQ2NCgweGVmYmU0Nzg2LCAweDM4NGYyNWUzKSxcbiAgICBuZXcgV29yZDY0KDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUpLCBuZXcgV29yZDY0KDB4MjQwY2ExY2MsIDB4NzdhYzljNjUpLFxuICAgIG5ldyBXb3JkNjQoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIG5ldyBXb3JkNjQoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksXG4gICAgbmV3IFdvcmQ2NCgweDVjYjBhOWRjLCAweGJkNDFmYmQ0KSwgbmV3IFdvcmQ2NCgweDc2Zjk4OGRhLCAweDgzMTE1M2I1KSxcbiAgICBuZXcgV29yZDY0KDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIpLCBuZXcgV29yZDY0KDB4YTgzMWM2NmQsIDB4MmRiNDMyMTApLFxuICAgIG5ldyBXb3JkNjQoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIG5ldyBXb3JkNjQoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksXG4gICAgbmV3IFdvcmQ2NCgweGM2ZTAwYmYzLCAweDNkYTg4ZmMyKSwgbmV3IFdvcmQ2NCgweGQ1YTc5MTQ3LCAweDkzMGFhNzI1KSxcbiAgICBuZXcgV29yZDY0KDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYpLCBuZXcgV29yZDY0KDB4MTQyOTI5NjcsIDB4MGEwZTZlNzApLFxuICAgIG5ldyBXb3JkNjQoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIG5ldyBXb3JkNjQoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksXG4gICAgbmV3IFdvcmQ2NCgweDRkMmM2ZGZjLCAweDVhYzQyYWVkKSwgbmV3IFdvcmQ2NCgweDUzMzgwZDEzLCAweDlkOTViM2RmKSxcbiAgICBuZXcgV29yZDY0KDB4NjUwYTczNTQsIDB4OGJhZjYzZGUpLCBuZXcgV29yZDY0KDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgpLFxuICAgIG5ldyBXb3JkNjQoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIG5ldyBXb3JkNjQoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksXG4gICAgbmV3IFdvcmQ2NCgweGEyYmZlOGExLCAweDRjZjEwMzY0KSwgbmV3IFdvcmQ2NCgweGE4MWE2NjRiLCAweGJjNDIzMDAxKSxcbiAgICBuZXcgV29yZDY0KDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEpLCBuZXcgV29yZDY0KDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzApLFxuICAgIG5ldyBXb3JkNjQoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIG5ldyBXb3JkNjQoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksXG4gICAgbmV3IFdvcmQ2NCgweGY0MGUzNTg1LCAweDU3NzEyMDJhKSwgbmV3IFdvcmQ2NCgweDEwNmFhMDcwLCAweDMyYmJkMWI4KSxcbiAgICBuZXcgV29yZDY0KDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgpLCBuZXcgV29yZDY0KDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMpLFxuICAgIG5ldyBXb3JkNjQoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIG5ldyBXb3JkNjQoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksXG4gICAgbmV3IFdvcmQ2NCgweDM5MWMwY2IzLCAweGM1Yzk1YTYzKSwgbmV3IFdvcmQ2NCgweDRlZDhhYTRhLCAweGUzNDE4YWNiKSxcbiAgICBuZXcgV29yZDY0KDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMpLCBuZXcgV29yZDY0KDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMpLFxuICAgIG5ldyBXb3JkNjQoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIG5ldyBXb3JkNjQoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksXG4gICAgbmV3IFdvcmQ2NCgweDg0Yzg3ODE0LCAweGExZjBhYjcyKSwgbmV3IFdvcmQ2NCgweDhjYzcwMjA4LCAweDFhNjQzOWVjKSxcbiAgICBuZXcgV29yZDY0KDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgpLCBuZXcgV29yZDY0KDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTkpLFxuICAgIG5ldyBXb3JkNjQoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIG5ldyBXb3JkNjQoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksXG4gICAgbmV3IFdvcmQ2NCgweGNhMjczZWNlLCAweGVhMjY2MTljKSwgbmV3IFdvcmQ2NCgweGQxODZiOGM3LCAweDIxYzBjMjA3KSxcbiAgICBuZXcgV29yZDY0KDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUpLCBuZXcgV29yZDY0KDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgpLFxuICAgIG5ldyBXb3JkNjQoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIG5ldyBXb3JkNjQoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksXG4gICAgbmV3IFdvcmQ2NCgweDExM2Y5ODA0LCAweGJlZjkwZGFlKSwgbmV3IFdvcmQ2NCgweDFiNzEwYjM1LCAweDEzMWM0NzFiKSxcbiAgICBuZXcgV29yZDY0KDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQpLCBuZXcgV29yZDY0KDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMpLFxuICAgIG5ldyBXb3JkNjQoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIG5ldyBXb3JkNjQoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksXG4gICAgbmV3IFdvcmQ2NCgweDRjYzVkNGJlLCAweGNiM2U0MmI2KSwgbmV3IFdvcmQ2NCgweDU5N2YyOTljLCAweGZjNjU3ZTJhKSxcbiAgICBuZXcgV29yZDY0KDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMpLCBuZXcgV29yZDY0KDB4NmM0NDE5OGMsIDB4NGE0NzU4MTcpXTtcblxuICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCBtb2RlMzg0KSB7XG4gICAgbW9kZTM4NCA9ICEhbW9kZTM4NDtcbiAgICAvLyBpbml0aWFsIGhhc2ggdmFsdWVzXG4gICAgdmFyIGgwLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBoNztcbiAgICBpZiAoIW1vZGUzODQpIHtcbiAgICAgIGgwID0gbmV3IFdvcmQ2NCgweDZhMDllNjY3LCAweGYzYmNjOTA4KTtcbiAgICAgIGgxID0gbmV3IFdvcmQ2NCgweGJiNjdhZTg1LCAweDg0Y2FhNzNiKTtcbiAgICAgIGgyID0gbmV3IFdvcmQ2NCgweDNjNmVmMzcyLCAweGZlOTRmODJiKTtcbiAgICAgIGgzID0gbmV3IFdvcmQ2NCgweGE1NGZmNTNhLCAweDVmMWQzNmYxKTtcbiAgICAgIGg0ID0gbmV3IFdvcmQ2NCgweDUxMGU1MjdmLCAweGFkZTY4MmQxKTtcbiAgICAgIGg1ID0gbmV3IFdvcmQ2NCgweDliMDU2ODhjLCAweDJiM2U2YzFmKTtcbiAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweDFmODNkOWFiLCAweGZiNDFiZDZiKTtcbiAgICAgIGg3ID0gbmV3IFdvcmQ2NCgweDViZTBjZDE5LCAweDEzN2UyMTc5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU0hBMzg0IGlzIGV4YWN0bHkgdGhlIHNhbWVcbiAgICAgIC8vIGV4Y2VwdCB3aXRoIGRpZmZlcmVudCBzdGFydGluZyB2YWx1ZXMgYW5kIGEgdHJpbW1lZCByZXN1bHRcbiAgICAgIGgwID0gbmV3IFdvcmQ2NCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KTtcbiAgICAgIGgxID0gbmV3IFdvcmQ2NCgweDYyOWEyOTJhLCAweDM2N2NkNTA3KTtcbiAgICAgIGgyID0gbmV3IFdvcmQ2NCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KTtcbiAgICAgIGgzID0gbmV3IFdvcmQ2NCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KTtcbiAgICAgIGg0ID0gbmV3IFdvcmQ2NCgweDY3MzMyNjY3LCAweGZmYzAwYjMxKTtcbiAgICAgIGg1ID0gbmV3IFdvcmQ2NCgweDhlYjQ0YTg3LCAweDY4NTgxNTExKTtcbiAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KTtcbiAgICAgIGg3ID0gbmV3IFdvcmQ2NCgweDQ3YjU0ODFkLCAweGJlZmE0ZmE0KTtcbiAgICB9XG5cbiAgICAvLyBwcmUtcHJvY2Vzc2luZ1xuICAgIHZhciBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDE3KSAvIDEyOCkgKiAxMjg7XG4gICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7XG4gICAgdmFyIGksIGosIG47XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTtcbiAgICB9XG4gICAgcGFkZGVkW2krK10gPSAweDgwO1xuICAgIG4gPSBwYWRkZWRMZW5ndGggLSAxNjtcbiAgICB3aGlsZSAoaSA8IG4pIHtcbiAgICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICB9XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPj4+IDI5KSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDIxKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDEzKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDUpICYgMHhmZjtcbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPDwgMykgJiAweGZmO1xuXG4gICAgdmFyIHcgPSBuZXcgQXJyYXkoODApO1xuICAgIGZvciAoaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG4gICAgICB3W2ldID0gbmV3IFdvcmQ2NCgwLCAwKTtcbiAgICB9XG4gICAgdmFyIGEgPSBuZXcgV29yZDY0KDAsIDApLFxuICAgICAgYiA9IG5ldyBXb3JkNjQoMCwgMCksXG4gICAgICBjID0gbmV3IFdvcmQ2NCgwLCAwKTtcbiAgICB2YXIgZCA9IG5ldyBXb3JkNjQoMCwgMCksXG4gICAgICBlID0gbmV3IFdvcmQ2NCgwLCAwKSxcbiAgICAgIGYgPSBuZXcgV29yZDY0KDAsIDApO1xuICAgIHZhciBnID0gbmV3IFdvcmQ2NCgwLCAwKSxcbiAgICAgIGggPSBuZXcgV29yZDY0KDAsIDApO1xuICAgIHZhciB0MSA9IG5ldyBXb3JkNjQoMCwgMCksXG4gICAgICB0MiA9IG5ldyBXb3JkNjQoMCwgMCk7XG4gICAgdmFyIHRtcDEgPSBuZXcgV29yZDY0KDAsIDApLFxuICAgICAgdG1wMiA9IG5ldyBXb3JkNjQoMCwgMCksXG4gICAgICB0bXAzO1xuXG4gICAgLy8gZm9yIGVhY2ggMTAyNCBiaXQgYmxvY2tcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFkZGVkTGVuZ3RoOyApIHtcbiAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICAgIHdbal0uaGlnaCA9XG4gICAgICAgICAgKHBhZGRlZFtpXSA8PCAyNCkgfFxuICAgICAgICAgIChwYWRkZWRbaSArIDFdIDw8IDE2KSB8XG4gICAgICAgICAgKHBhZGRlZFtpICsgMl0gPDwgOCkgfFxuICAgICAgICAgIHBhZGRlZFtpICsgM107XG4gICAgICAgIHdbal0ubG93ID1cbiAgICAgICAgICAocGFkZGVkW2kgKyA0XSA8PCAyNCkgfFxuICAgICAgICAgIChwYWRkZWRbaSArIDVdIDw8IDE2KSB8XG4gICAgICAgICAgKHBhZGRlZFtpICsgNl0gPDwgOCkgfFxuICAgICAgICAgIHBhZGRlZFtpICsgN107XG4gICAgICAgIGkgKz0gODtcbiAgICAgIH1cbiAgICAgIGZvciAoaiA9IDE2OyBqIDwgODA7ICsraikge1xuICAgICAgICB0bXAzID0gd1tqXTtcbiAgICAgICAgbGl0dGxlU2lnbWFQcmltZSh0bXAzLCB3W2ogLSAyXSwgdG1wMik7XG4gICAgICAgIHRtcDMuYWRkKHdbaiAtIDddKTtcbiAgICAgICAgbGl0dGxlU2lnbWEodG1wMSwgd1tqIC0gMTVdLCB0bXAyKTtcbiAgICAgICAgdG1wMy5hZGQodG1wMSk7XG4gICAgICAgIHRtcDMuYWRkKHdbaiAtIDE2XSk7XG4gICAgICB9XG5cbiAgICAgIGEuYXNzaWduKGgwKTtcbiAgICAgIGIuYXNzaWduKGgxKTtcbiAgICAgIGMuYXNzaWduKGgyKTtcbiAgICAgIGQuYXNzaWduKGgzKTtcbiAgICAgIGUuYXNzaWduKGg0KTtcbiAgICAgIGYuYXNzaWduKGg1KTtcbiAgICAgIGcuYXNzaWduKGg2KTtcbiAgICAgIGguYXNzaWduKGg3KTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgICAgIHQxLmFzc2lnbihoKTtcbiAgICAgICAgc2lnbWFQcmltZSh0bXAxLCBlLCB0bXAyKTtcbiAgICAgICAgdDEuYWRkKHRtcDEpO1xuICAgICAgICBjaCh0bXAxLCBlLCBmLCBnLCB0bXAyKTtcbiAgICAgICAgdDEuYWRkKHRtcDEpO1xuICAgICAgICB0MS5hZGQoa1tqXSk7XG4gICAgICAgIHQxLmFkZCh3W2pdKTtcblxuICAgICAgICBzaWdtYSh0MiwgYSwgdG1wMik7XG4gICAgICAgIG1haih0bXAxLCBhLCBiLCBjLCB0bXAyKTtcbiAgICAgICAgdDIuYWRkKHRtcDEpO1xuXG4gICAgICAgIHRtcDMgPSBoO1xuICAgICAgICBoID0gZztcbiAgICAgICAgZyA9IGY7XG4gICAgICAgIGYgPSBlO1xuICAgICAgICBkLmFkZCh0MSk7XG4gICAgICAgIGUgPSBkO1xuICAgICAgICBkID0gYztcbiAgICAgICAgYyA9IGI7XG4gICAgICAgIGIgPSBhO1xuICAgICAgICB0bXAzLmFzc2lnbih0MSk7XG4gICAgICAgIHRtcDMuYWRkKHQyKTtcbiAgICAgICAgYSA9IHRtcDM7XG4gICAgICB9XG4gICAgICBoMC5hZGQoYSk7XG4gICAgICBoMS5hZGQoYik7XG4gICAgICBoMi5hZGQoYyk7XG4gICAgICBoMy5hZGQoZCk7XG4gICAgICBoNC5hZGQoZSk7XG4gICAgICBoNS5hZGQoZik7XG4gICAgICBoNi5hZGQoZyk7XG4gICAgICBoNy5hZGQoaCk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoIW1vZGUzODQpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDY0KTtcbiAgICAgIGgwLmNvcHlUbyhyZXN1bHQsIDApO1xuICAgICAgaDEuY29weVRvKHJlc3VsdCwgOCk7XG4gICAgICBoMi5jb3B5VG8ocmVzdWx0LCAxNik7XG4gICAgICBoMy5jb3B5VG8ocmVzdWx0LCAyNCk7XG4gICAgICBoNC5jb3B5VG8ocmVzdWx0LCAzMik7XG4gICAgICBoNS5jb3B5VG8ocmVzdWx0LCA0MCk7XG4gICAgICBoNi5jb3B5VG8ocmVzdWx0LCA0OCk7XG4gICAgICBoNy5jb3B5VG8ocmVzdWx0LCA1Nik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDQ4KTtcbiAgICAgIGgwLmNvcHlUbyhyZXN1bHQsIDApO1xuICAgICAgaDEuY29weVRvKHJlc3VsdCwgOCk7XG4gICAgICBoMi5jb3B5VG8ocmVzdWx0LCAxNik7XG4gICAgICBoMy5jb3B5VG8ocmVzdWx0LCAyNCk7XG4gICAgICBoNC5jb3B5VG8ocmVzdWx0LCAzMik7XG4gICAgICBoNS5jb3B5VG8ocmVzdWx0LCA0MCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gaGFzaDtcbn0pKCk7XG52YXIgY2FsY3VsYXRlU0hBMzg0ID0gKGZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTM4NENsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlU0hBNTEyKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoO1xufSkoKTtcbnZhciBOdWxsQ2lwaGVyID0gKGZ1bmN0aW9uIE51bGxDaXBoZXJDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE51bGxDaXBoZXIoKSB7fVxuXG4gIE51bGxDaXBoZXIucHJvdG90eXBlID0ge1xuICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gTnVsbENpcGhlcl9kZWNyeXB0QmxvY2soZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgICBlbmNyeXB0OiBmdW5jdGlvbiBOdWxsQ2lwaGVyX2VuY3J5cHQoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gTnVsbENpcGhlcjtcbn0pKCk7XG5cbmNsYXNzIEFFU0Jhc2VDaXBoZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQUVTQmFzZUNpcGhlcikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBBRVNCYXNlQ2lwaGVyLlwiKTtcbiAgICB9XG5cbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICB0aGlzLl9zID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYixcbiAgICAgIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsXG4gICAgICAweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLCAweGI3LCAweGZkLCAweDkzLCAweDI2LFxuICAgICAgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSxcbiAgICAgIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsXG4gICAgICAweGViLCAweDI3LCAweGIyLCAweDc1LCAweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLFxuICAgICAgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCxcbiAgICAgIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsXG4gICAgICAweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LCAweDQ1LCAweGY5LCAweDAyLCAweDdmLFxuICAgICAgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwgMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSxcbiAgICAgIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsXG4gICAgICAweDVmLCAweDk3LCAweDQ0LCAweDE3LCAweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLFxuICAgICAgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCxcbiAgICAgIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsXG4gICAgICAweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LCAweGU3LCAweGM4LCAweDM3LCAweDZkLFxuICAgICAgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCxcbiAgICAgIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsXG4gICAgICAweDRiLCAweGJkLCAweDhiLCAweDhhLCAweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLFxuICAgICAgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSxcbiAgICAgIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsXG4gICAgICAweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LCAweDQxLCAweDk5LCAweDJkLCAweDBmLFxuICAgICAgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNixcbiAgICBdKTtcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHRoaXMuX2ludl9zID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCwgMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSxcbiAgICAgIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcsXG4gICAgICAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAweDU0LCAweDdiLCAweDk0LCAweDMyLFxuICAgICAgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCwgMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSxcbiAgICAgIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksXG4gICAgICAweDZkLCAweDhiLCAweGQxLCAweDI1LCAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LFxuICAgICAgMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5MiwgMHg2YywgMHg3MCwgMHg0OCwgMHg1MCxcbiAgICAgIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQsXG4gICAgICAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LFxuICAgICAgMHhiOCwgMHhiMywgMHg0NSwgMHgwNiwgMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMixcbiAgICAgIDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIsIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsXG4gICAgICAweDRmLCAweDY3LCAweGRjLCAweGVhLCAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLFxuICAgICAgMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSwgMHhlMiwgMHhmOSwgMHgzNywgMHhlOCxcbiAgICAgIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODksXG4gICAgICAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAweGZjLCAweDU2LCAweDNlLCAweDRiLFxuICAgICAgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCwgMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCxcbiAgICAgIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksXG4gICAgICAweDI3LCAweDgwLCAweGVjLCAweDVmLCAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLFxuICAgICAgMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZiwgMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCxcbiAgICAgIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsXG4gICAgICAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLFxuICAgICAgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZCxcbiAgICBdKTtcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHRoaXMuX21peCA9IG5ldyBVaW50MzJBcnJheShbXG4gICAgICAweDAwMDAwMDAwLCAweDBlMDkwZDBiLCAweDFjMTIxYTE2LCAweDEyMWIxNzFkLCAweDM4MjQzNDJjLCAweDM2MmQzOTI3LFxuICAgICAgMHgyNDM2MmUzYSwgMHgyYTNmMjMzMSwgMHg3MDQ4Njg1OCwgMHg3ZTQxNjU1MywgMHg2YzVhNzI0ZSwgMHg2MjUzN2Y0NSxcbiAgICAgIDB4NDg2YzVjNzQsIDB4NDY2NTUxN2YsIDB4NTQ3ZTQ2NjIsIDB4NWE3NzRiNjksIDB4ZTA5MGQwYjAsIDB4ZWU5OWRkYmIsXG4gICAgICAweGZjODJjYWE2LCAweGYyOGJjN2FkLCAweGQ4YjRlNDljLCAweGQ2YmRlOTk3LCAweGM0YTZmZThhLCAweGNhYWZmMzgxLFxuICAgICAgMHg5MGQ4YjhlOCwgMHg5ZWQxYjVlMywgMHg4Y2NhYTJmZSwgMHg4MmMzYWZmNSwgMHhhOGZjOGNjNCwgMHhhNmY1ODFjZixcbiAgICAgIDB4YjRlZTk2ZDIsIDB4YmFlNzliZDksIDB4ZGIzYmJiN2IsIDB4ZDUzMmI2NzAsIDB4YzcyOWExNmQsIDB4YzkyMGFjNjYsXG4gICAgICAweGUzMWY4ZjU3LCAweGVkMTY4MjVjLCAweGZmMGQ5NTQxLCAweGYxMDQ5ODRhLCAweGFiNzNkMzIzLCAweGE1N2FkZTI4LFxuICAgICAgMHhiNzYxYzkzNSwgMHhiOTY4YzQzZSwgMHg5MzU3ZTcwZiwgMHg5ZDVlZWEwNCwgMHg4ZjQ1ZmQxOSwgMHg4MTRjZjAxMixcbiAgICAgIDB4M2JhYjZiY2IsIDB4MzVhMjY2YzAsIDB4MjdiOTcxZGQsIDB4MjliMDdjZDYsIDB4MDM4ZjVmZTcsIDB4MGQ4NjUyZWMsXG4gICAgICAweDFmOWQ0NWYxLCAweDExOTQ0OGZhLCAweDRiZTMwMzkzLCAweDQ1ZWEwZTk4LCAweDU3ZjExOTg1LCAweDU5ZjgxNDhlLFxuICAgICAgMHg3M2M3MzdiZiwgMHg3ZGNlM2FiNCwgMHg2ZmQ1MmRhOSwgMHg2MWRjMjBhMiwgMHhhZDc2NmRmNiwgMHhhMzdmNjBmZCxcbiAgICAgIDB4YjE2NDc3ZTAsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEsIDB4OWI1YjU0ZDEsIDB4ODk0MDQzY2MsIDB4ODc0OTRlYzcsXG4gICAgICAweGRkM2UwNWFlLCAweGQzMzcwOGE1LCAweGMxMmMxZmI4LCAweGNmMjUxMmIzLCAweGU1MWEzMTgyLCAweGViMTMzYzg5LFxuICAgICAgMHhmOTA4MmI5NCwgMHhmNzAxMjY5ZiwgMHg0ZGU2YmQ0NiwgMHg0M2VmYjA0ZCwgMHg1MWY0YTc1MCwgMHg1ZmZkYWE1YixcbiAgICAgIDB4NzVjMjg5NmEsIDB4N2JjYjg0NjEsIDB4NjlkMDkzN2MsIDB4NjdkOTllNzcsIDB4M2RhZWQ1MWUsIDB4MzNhN2Q4MTUsXG4gICAgICAweDIxYmNjZjA4LCAweDJmYjVjMjAzLCAweDA1OGFlMTMyLCAweDBiODNlYzM5LCAweDE5OThmYjI0LCAweDE3OTFmNjJmLFxuICAgICAgMHg3NjRkZDY4ZCwgMHg3ODQ0ZGI4NiwgMHg2YTVmY2M5YiwgMHg2NDU2YzE5MCwgMHg0ZTY5ZTJhMSwgMHg0MDYwZWZhYSxcbiAgICAgIDB4NTI3YmY4YjcsIDB4NWM3MmY1YmMsIDB4MDYwNWJlZDUsIDB4MDgwY2IzZGUsIDB4MWExN2E0YzMsIDB4MTQxZWE5YzgsXG4gICAgICAweDNlMjE4YWY5LCAweDMwMjg4N2YyLCAweDIyMzM5MGVmLCAweDJjM2E5ZGU0LCAweDk2ZGQwNjNkLCAweDk4ZDQwYjM2LFxuICAgICAgMHg4YWNmMWMyYiwgMHg4NGM2MTEyMCwgMHhhZWY5MzIxMSwgMHhhMGYwM2YxYSwgMHhiMmViMjgwNywgMHhiY2UyMjUwYyxcbiAgICAgIDB4ZTY5NTZlNjUsIDB4ZTg5YzYzNmUsIDB4ZmE4Nzc0NzMsIDB4ZjQ4ZTc5NzgsIDB4ZGViMTVhNDksIDB4ZDBiODU3NDIsXG4gICAgICAweGMyYTM0MDVmLCAweGNjYWE0ZDU0LCAweDQxZWNkYWY3LCAweDRmZTVkN2ZjLCAweDVkZmVjMGUxLCAweDUzZjdjZGVhLFxuICAgICAgMHg3OWM4ZWVkYiwgMHg3N2MxZTNkMCwgMHg2NWRhZjRjZCwgMHg2YmQzZjljNiwgMHgzMWE0YjJhZiwgMHgzZmFkYmZhNCxcbiAgICAgIDB4MmRiNmE4YjksIDB4MjNiZmE1YjIsIDB4MDk4MDg2ODMsIDB4MDc4OThiODgsIDB4MTU5MjljOTUsIDB4MWI5YjkxOWUsXG4gICAgICAweGExN2MwYTQ3LCAweGFmNzUwNzRjLCAweGJkNmUxMDUxLCAweGIzNjcxZDVhLCAweDk5NTgzZTZiLCAweDk3NTEzMzYwLFxuICAgICAgMHg4NTRhMjQ3ZCwgMHg4YjQzMjk3NiwgMHhkMTM0NjIxZiwgMHhkZjNkNmYxNCwgMHhjZDI2NzgwOSwgMHhjMzJmNzUwMixcbiAgICAgIDB4ZTkxMDU2MzMsIDB4ZTcxOTViMzgsIDB4ZjUwMjRjMjUsIDB4ZmIwYjQxMmUsIDB4OWFkNzYxOGMsIDB4OTRkZTZjODcsXG4gICAgICAweDg2YzU3YjlhLCAweDg4Y2M3NjkxLCAweGEyZjM1NWEwLCAweGFjZmE1OGFiLCAweGJlZTE0ZmI2LCAweGIwZTg0MmJkLFxuICAgICAgMHhlYTlmMDlkNCwgMHhlNDk2MDRkZiwgMHhmNjhkMTNjMiwgMHhmODg0MWVjOSwgMHhkMmJiM2RmOCwgMHhkY2IyMzBmMyxcbiAgICAgIDB4Y2VhOTI3ZWUsIDB4YzBhMDJhZTUsIDB4N2E0N2IxM2MsIDB4NzQ0ZWJjMzcsIDB4NjY1NWFiMmEsIDB4Njg1Y2E2MjEsXG4gICAgICAweDQyNjM4NTEwLCAweDRjNmE4ODFiLCAweDVlNzE5ZjA2LCAweDUwNzg5MjBkLCAweDBhMGZkOTY0LCAweDA0MDZkNDZmLFxuICAgICAgMHgxNjFkYzM3MiwgMHgxODE0Y2U3OSwgMHgzMjJiZWQ0OCwgMHgzYzIyZTA0MywgMHgyZTM5Zjc1ZSwgMHgyMDMwZmE1NSxcbiAgICAgIDB4ZWM5YWI3MDEsIDB4ZTI5M2JhMGEsIDB4ZjA4OGFkMTcsIDB4ZmU4MWEwMWMsIDB4ZDRiZTgzMmQsIDB4ZGFiNzhlMjYsXG4gICAgICAweGM4YWM5OTNiLCAweGM2YTU5NDMwLCAweDljZDJkZjU5LCAweDkyZGJkMjUyLCAweDgwYzBjNTRmLCAweDhlYzljODQ0LFxuICAgICAgMHhhNGY2ZWI3NSwgMHhhYWZmZTY3ZSwgMHhiOGU0ZjE2MywgMHhiNmVkZmM2OCwgMHgwYzBhNjdiMSwgMHgwMjAzNmFiYSxcbiAgICAgIDB4MTAxODdkYTcsIDB4MWUxMTcwYWMsIDB4MzQyZTUzOWQsIDB4M2EyNzVlOTYsIDB4MjgzYzQ5OGIsIDB4MjYzNTQ0ODAsXG4gICAgICAweDdjNDIwZmU5LCAweDcyNGIwMmUyLCAweDYwNTAxNWZmLCAweDZlNTkxOGY0LCAweDQ0NjYzYmM1LCAweDRhNmYzNmNlLFxuICAgICAgMHg1ODc0MjFkMywgMHg1NjdkMmNkOCwgMHgzN2ExMGM3YSwgMHgzOWE4MDE3MSwgMHgyYmIzMTY2YywgMHgyNWJhMWI2NyxcbiAgICAgIDB4MGY4NTM4NTYsIDB4MDE4YzM1NWQsIDB4MTM5NzIyNDAsIDB4MWQ5ZTJmNGIsIDB4NDdlOTY0MjIsIDB4NDllMDY5MjksXG4gICAgICAweDViZmI3ZTM0LCAweDU1ZjI3MzNmLCAweDdmY2Q1MDBlLCAweDcxYzQ1ZDA1LCAweDYzZGY0YTE4LCAweDZkZDY0NzEzLFxuICAgICAgMHhkNzMxZGNjYSwgMHhkOTM4ZDFjMSwgMHhjYjIzYzZkYywgMHhjNTJhY2JkNywgMHhlZjE1ZThlNiwgMHhlMTFjZTVlZCxcbiAgICAgIDB4ZjMwN2YyZjAsIDB4ZmQwZWZmZmIsIDB4YTc3OWI0OTIsIDB4YTk3MGI5OTksIDB4YmI2YmFlODQsIDB4YjU2MmEzOGYsXG4gICAgICAweDlmNWQ4MGJlLCAweDkxNTQ4ZGI1LCAweDgzNGY5YWE4LCAweDhkNDY5N2EzLFxuICAgIF0pO1xuXG4gICAgdGhpcy5fbWl4Q29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICBpZiAoaSA8IDEyOCkge1xuICAgICAgICB0aGlzLl9taXhDb2xbaV0gPSBpIDw8IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9taXhDb2xbaV0gPSAoaSA8PCAxKSBeIDB4MWI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgdGhpcy5idWZmZXJQb3NpdGlvbiA9IDA7XG4gIH1cblxuICBfZXhwYW5kS2V5KGNpcGhlcktleSkge1xuICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGNhbGwgYF9leHBhbmRLZXlgIG9uIHRoZSBiYXNlIGNsYXNzXCIpO1xuICB9XG5cbiAgX2RlY3J5cHQoaW5wdXQsIGtleSkge1xuICAgIGxldCB0LCB1LCB2O1xuICAgIGNvbnN0IHN0YXRlID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICAgIHN0YXRlLnNldChpbnB1dCk7XG5cbiAgICAvLyBBZGRSb3VuZEtleVxuICAgIGZvciAobGV0IGogPSAwLCBrID0gdGhpcy5fa2V5U2l6ZTsgaiA8IDE2OyArK2osICsraykge1xuICAgICAgc3RhdGVbal0gXj0ga2V5W2tdO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uIC0gMTsgaSA+PSAxOyAtLWkpIHtcbiAgICAgIC8vIEludlNoaWZ0Um93c1xuICAgICAgdCA9IHN0YXRlWzEzXTtcbiAgICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldO1xuICAgICAgc3RhdGVbOV0gPSBzdGF0ZVs1XTtcbiAgICAgIHN0YXRlWzVdID0gc3RhdGVbMV07XG4gICAgICBzdGF0ZVsxXSA9IHQ7XG4gICAgICB0ID0gc3RhdGVbMTRdO1xuICAgICAgdSA9IHN0YXRlWzEwXTtcbiAgICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdO1xuICAgICAgc3RhdGVbMTBdID0gc3RhdGVbMl07XG4gICAgICBzdGF0ZVs2XSA9IHQ7XG4gICAgICBzdGF0ZVsyXSA9IHU7XG4gICAgICB0ID0gc3RhdGVbMTVdO1xuICAgICAgdSA9IHN0YXRlWzExXTtcbiAgICAgIHYgPSBzdGF0ZVs3XTtcbiAgICAgIHN0YXRlWzE1XSA9IHN0YXRlWzNdO1xuICAgICAgc3RhdGVbMTFdID0gdDtcbiAgICAgIHN0YXRlWzddID0gdTtcbiAgICAgIHN0YXRlWzNdID0gdjtcbiAgICAgIC8vIEludlN1YkJ5dGVzXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgICAgc3RhdGVbal0gPSB0aGlzLl9pbnZfc1tzdGF0ZVtqXV07XG4gICAgICB9XG4gICAgICAvLyBBZGRSb3VuZEtleVxuICAgICAgZm9yIChsZXQgaiA9IDAsIGsgPSBpICogMTY7IGogPCAxNjsgKytqLCArK2spIHtcbiAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdO1xuICAgICAgfVxuICAgICAgLy8gSW52TWl4Q29sdW1uc1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgaiArPSA0KSB7XG4gICAgICAgIGNvbnN0IHMwID0gdGhpcy5fbWl4W3N0YXRlW2pdXTtcbiAgICAgICAgY29uc3QgczEgPSB0aGlzLl9taXhbc3RhdGVbaiArIDFdXTtcbiAgICAgICAgY29uc3QgczIgPSB0aGlzLl9taXhbc3RhdGVbaiArIDJdXTtcbiAgICAgICAgY29uc3QgczMgPSB0aGlzLl9taXhbc3RhdGVbaiArIDNdXTtcbiAgICAgICAgdCA9XG4gICAgICAgICAgczAgXlxuICAgICAgICAgIChzMSA+Pj4gOCkgXlxuICAgICAgICAgIChzMSA8PCAyNCkgXlxuICAgICAgICAgIChzMiA+Pj4gMTYpIF5cbiAgICAgICAgICAoczIgPDwgMTYpIF5cbiAgICAgICAgICAoczMgPj4+IDI0KSBeXG4gICAgICAgICAgKHMzIDw8IDgpO1xuICAgICAgICBzdGF0ZVtqXSA9ICh0ID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzdGF0ZVtqICsgMV0gPSAodCA+PiAxNikgJiAweGZmO1xuICAgICAgICBzdGF0ZVtqICsgMl0gPSAodCA+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlW2ogKyAzXSA9IHQgJiAweGZmO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJbnZTaGlmdFJvd3NcbiAgICB0ID0gc3RhdGVbMTNdO1xuICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldO1xuICAgIHN0YXRlWzldID0gc3RhdGVbNV07XG4gICAgc3RhdGVbNV0gPSBzdGF0ZVsxXTtcbiAgICBzdGF0ZVsxXSA9IHQ7XG4gICAgdCA9IHN0YXRlWzE0XTtcbiAgICB1ID0gc3RhdGVbMTBdO1xuICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdO1xuICAgIHN0YXRlWzEwXSA9IHN0YXRlWzJdO1xuICAgIHN0YXRlWzZdID0gdDtcbiAgICBzdGF0ZVsyXSA9IHU7XG4gICAgdCA9IHN0YXRlWzE1XTtcbiAgICB1ID0gc3RhdGVbMTFdO1xuICAgIHYgPSBzdGF0ZVs3XTtcbiAgICBzdGF0ZVsxNV0gPSBzdGF0ZVszXTtcbiAgICBzdGF0ZVsxMV0gPSB0O1xuICAgIHN0YXRlWzddID0gdTtcbiAgICBzdGF0ZVszXSA9IHY7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICAvLyBJbnZTdWJCeXRlc1xuICAgICAgc3RhdGVbal0gPSB0aGlzLl9pbnZfc1tzdGF0ZVtqXV07XG4gICAgICAvLyBBZGRSb3VuZEtleVxuICAgICAgc3RhdGVbal0gXj0ga2V5W2pdO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBfZW5jcnlwdChpbnB1dCwga2V5KSB7XG4gICAgY29uc3QgcyA9IHRoaXMuX3M7XG5cbiAgICBsZXQgdCwgdSwgdjtcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICBzdGF0ZS5zZXQoaW5wdXQpO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICAvLyBBZGRSb3VuZEtleVxuICAgICAgc3RhdGVbal0gXj0ga2V5W2pdO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uOyBpKyspIHtcbiAgICAgIC8vIFN1YkJ5dGVzXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgICAgc3RhdGVbal0gPSBzW3N0YXRlW2pdXTtcbiAgICAgIH1cbiAgICAgIC8vIFNoaWZ0Um93c1xuICAgICAgdiA9IHN0YXRlWzFdO1xuICAgICAgc3RhdGVbMV0gPSBzdGF0ZVs1XTtcbiAgICAgIHN0YXRlWzVdID0gc3RhdGVbOV07XG4gICAgICBzdGF0ZVs5XSA9IHN0YXRlWzEzXTtcbiAgICAgIHN0YXRlWzEzXSA9IHY7XG4gICAgICB2ID0gc3RhdGVbMl07XG4gICAgICB1ID0gc3RhdGVbNl07XG4gICAgICBzdGF0ZVsyXSA9IHN0YXRlWzEwXTtcbiAgICAgIHN0YXRlWzZdID0gc3RhdGVbMTRdO1xuICAgICAgc3RhdGVbMTBdID0gdjtcbiAgICAgIHN0YXRlWzE0XSA9IHU7XG4gICAgICB2ID0gc3RhdGVbM107XG4gICAgICB1ID0gc3RhdGVbN107XG4gICAgICB0ID0gc3RhdGVbMTFdO1xuICAgICAgc3RhdGVbM10gPSBzdGF0ZVsxNV07XG4gICAgICBzdGF0ZVs3XSA9IHY7XG4gICAgICBzdGF0ZVsxMV0gPSB1O1xuICAgICAgc3RhdGVbMTVdID0gdDtcbiAgICAgIC8vIE1peENvbHVtbnNcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGogKz0gNCkge1xuICAgICAgICBjb25zdCBzMCA9IHN0YXRlW2ogKyAwXTtcbiAgICAgICAgY29uc3QgczEgPSBzdGF0ZVtqICsgMV07XG4gICAgICAgIGNvbnN0IHMyID0gc3RhdGVbaiArIDJdO1xuICAgICAgICBjb25zdCBzMyA9IHN0YXRlW2ogKyAzXTtcbiAgICAgICAgdCA9IHMwIF4gczEgXiBzMiBeIHMzO1xuICAgICAgICBzdGF0ZVtqICsgMF0gXj0gdCBeIHRoaXMuX21peENvbFtzMCBeIHMxXTtcbiAgICAgICAgc3RhdGVbaiArIDFdIF49IHQgXiB0aGlzLl9taXhDb2xbczEgXiBzMl07XG4gICAgICAgIHN0YXRlW2ogKyAyXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MyIF4gczNdO1xuICAgICAgICBzdGF0ZVtqICsgM10gXj0gdCBeIHRoaXMuX21peENvbFtzMyBeIHMwXTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZFJvdW5kS2V5XG4gICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykge1xuICAgICAgICBzdGF0ZVtqXSBePSBrZXlba107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3ViQnl0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIHN0YXRlW2pdID0gc1tzdGF0ZVtqXV07XG4gICAgfVxuICAgIC8vIFNoaWZ0Um93c1xuICAgIHYgPSBzdGF0ZVsxXTtcbiAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdO1xuICAgIHN0YXRlWzVdID0gc3RhdGVbOV07XG4gICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107XG4gICAgc3RhdGVbMTNdID0gdjtcbiAgICB2ID0gc3RhdGVbMl07XG4gICAgdSA9IHN0YXRlWzZdO1xuICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdO1xuICAgIHN0YXRlWzZdID0gc3RhdGVbMTRdO1xuICAgIHN0YXRlWzEwXSA9IHY7XG4gICAgc3RhdGVbMTRdID0gdTtcbiAgICB2ID0gc3RhdGVbM107XG4gICAgdSA9IHN0YXRlWzddO1xuICAgIHQgPSBzdGF0ZVsxMV07XG4gICAgc3RhdGVbM10gPSBzdGF0ZVsxNV07XG4gICAgc3RhdGVbN10gPSB2O1xuICAgIHN0YXRlWzExXSA9IHU7XG4gICAgc3RhdGVbMTVdID0gdDtcbiAgICAvLyBBZGRSb3VuZEtleVxuICAgIGZvciAobGV0IGogPSAwLCBrID0gdGhpcy5fa2V5U2l6ZTsgaiA8IDE2OyArK2osICsraykge1xuICAgICAgc3RhdGVbal0gXj0ga2V5W2tdO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBfZGVjcnlwdEJsb2NrMihkYXRhLCBmaW5hbGl6ZSkge1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIGxldCBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcbiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGl2ID0gdGhpcy5pdjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTtcbiAgICAgICsrYnVmZmVyTGVuZ3RoO1xuICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDE2KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gYnVmZmVyIGlzIGZ1bGwsIGRlY3J5cHRpbmdcbiAgICAgIGNvbnN0IHBsYWluID0gdGhpcy5fZGVjcnlwdChidWZmZXIsIHRoaXMuX2tleSk7XG4gICAgICAvLyB4b3ItaW5nIHRoZSBJViB2ZWN0b3IgdG8gZ2V0IHBsYWluIHRleHRcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgICBwbGFpbltqXSBePSBpdltqXTtcbiAgICAgIH1cbiAgICAgIGl2ID0gYnVmZmVyO1xuICAgICAgcmVzdWx0LnB1c2gocGxhaW4pO1xuICAgICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICAgICAgYnVmZmVyTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgLy8gc2F2aW5nIGluY29tcGxldGUgYnVmZmVyXG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7XG4gICAgdGhpcy5pdiA9IGl2O1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgfVxuICAgIC8vIGNvbWJpbmluZyBwbGFpbiB0ZXh0IGJsb2NrcyBpbnRvIG9uZVxuICAgIGxldCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7XG4gICAgaWYgKGZpbmFsaXplKSB7XG4gICAgICAvLyB1bmRvIGEgcGFkZGluZyB0aGF0IGlzIGRlc2NyaWJlZCBpbiBSRkMgMjg5OFxuICAgICAgY29uc3QgbGFzdEJsb2NrID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGxldCBwc0xlbiA9IGxhc3RCbG9ja1sxNV07XG4gICAgICBpZiAocHNMZW4gPD0gMTYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE1LCBpaSA9IDE2IC0gcHNMZW47IGkgPj0gaWk7IC0taSkge1xuICAgICAgICAgIGlmIChsYXN0QmxvY2tbaV0gIT09IHBzTGVuKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIHBhZGRpbmcsIGFzc3VtZSB0aGF0IHRoZSBibG9jayBoYXMgbm8gcGFkZGluZy5cbiAgICAgICAgICAgIHBzTGVuID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRwdXRMZW5ndGggLT0gcHNMZW47XG4gICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBsYXN0QmxvY2suc3ViYXJyYXkoMCwgMTYgLSBwc0xlbik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG91dHB1dExlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7XG4gICAgICBvdXRwdXQuc2V0KHJlc3VsdFtpXSwgaik7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBkZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUsIGl2ID0gbnVsbCkge1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgIGxldCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uO1xuICAgIC8vIElmIGFuIElWIGlzIG5vdCBzdXBwbGllZCwgd2FpdCBmb3IgSVYgdmFsdWVzLiBUaGV5IGFyZSBhdCB0aGUgc3RhcnRcbiAgICAvLyBvZiB0aGUgc3RyZWFtLlxuICAgIGlmIChpdikge1xuICAgICAgdGhpcy5pdiA9IGl2O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGJ1ZmZlckxlbmd0aCA8IDE2ICYmIGkgPCBzb3VyY2VMZW5ndGg7XG4gICAgICAgICsraSwgKytidWZmZXJMZW5ndGhcbiAgICAgICkge1xuICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07XG4gICAgICB9XG4gICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgLy8gTmVlZCBtb3JlIGRhdGEuXG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICB9XG4gICAgICB0aGlzLml2ID0gYnVmZmVyO1xuICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoMTYpO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgLy8gc3RhcnRpbmcgZGVjcnlwdGlvblxuICAgIHRoaXMuZGVjcnlwdEJsb2NrID0gdGhpcy5fZGVjcnlwdEJsb2NrMjtcbiAgICByZXR1cm4gdGhpcy5kZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUpO1xuICB9XG5cbiAgZW5jcnlwdChkYXRhLCBpdikge1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIGxldCBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcbiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBpZiAoIWl2KSB7XG4gICAgICBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7ICsraSkge1xuICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aF0gPSBkYXRhW2ldO1xuICAgICAgKytidWZmZXJMZW5ndGg7XG4gICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgICBidWZmZXJbal0gXj0gaXZbal07XG4gICAgICB9XG5cbiAgICAgIC8vIGJ1ZmZlciBpcyBmdWxsLCBlbmNyeXB0aW5nXG4gICAgICBjb25zdCBjaXBoZXIgPSB0aGlzLl9lbmNyeXB0KGJ1ZmZlciwgdGhpcy5fa2V5KTtcbiAgICAgIGl2ID0gY2lwaGVyO1xuICAgICAgcmVzdWx0LnB1c2goY2lwaGVyKTtcbiAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgfVxuICAgIC8vIHNhdmluZyBpbmNvbXBsZXRlIGJ1ZmZlclxuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICAgIHRoaXMuaXYgPSBpdjtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICAvLyBjb21iaW5pbmcgcGxhaW4gdGV4dCBibG9ja3MgaW50byBvbmVcbiAgICBjb25zdCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7XG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlpID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGlpOyArK2ksIGogKz0gMTYpIHtcbiAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufVxuXG5jbGFzcyBBRVMxMjhDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHtcbiAgY29uc3RydWN0b3Ioa2V5KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbiA9IDEwO1xuICAgIHRoaXMuX2tleVNpemUgPSAxNjA7IC8vIGJpdHNcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHRoaXMuX3Jjb24gPSBuZXcgVWludDhBcnJheShbXG4gICAgICAweDhkLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2LCAweDZjLFxuICAgICAgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSxcbiAgICAgIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsXG4gICAgICAweDYxLCAweGMyLCAweDlmLCAweDI1LCAweDRhLCAweDk0LCAweDMzLCAweDY2LCAweGNjLCAweDgzLCAweDFkLCAweDNhLFxuICAgICAgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCxcbiAgICAgIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsXG4gICAgICAweDk3LCAweDM1LCAweDZhLCAweGQ0LCAweGIzLCAweDdkLCAweGZhLCAweGVmLCAweGM1LCAweDkxLCAweDM5LCAweDcyLFxuICAgICAgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYyxcbiAgICAgIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsXG4gICAgICAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2LCAweDZjLCAweGQ4LCAweGFiLCAweDRkLCAweDlhLCAweDJmLCAweDVlLFxuICAgICAgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSxcbiAgICAgIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsXG4gICAgICAweDMzLCAweDY2LCAweGNjLCAweDgzLCAweDFkLCAweDNhLCAweDc0LCAweGU4LCAweGNiLCAweDhkLCAweDAxLCAweDAyLFxuICAgICAgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCxcbiAgICAgIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsXG4gICAgICAweGZhLCAweGVmLCAweGM1LCAweDkxLCAweDM5LCAweDcyLCAweGU0LCAweGQzLCAweGJkLCAweDYxLCAweGMyLCAweDlmLFxuICAgICAgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYixcbiAgICAgIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsXG4gICAgICAweGQ4LCAweGFiLCAweDRkLCAweDlhLCAweDJmLCAweDVlLCAweGJjLCAweDYzLCAweGM2LCAweDk3LCAweDM1LCAweDZhLFxuICAgICAgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCxcbiAgICAgIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsXG4gICAgICAweDc0LCAweGU4LCAweGNiLCAweDhkLFxuICAgIF0pO1xuXG4gICAgdGhpcy5fa2V5ID0gdGhpcy5fZXhwYW5kS2V5KGtleSk7XG4gIH1cblxuICBfZXhwYW5kS2V5KGNpcGhlcktleSkge1xuICAgIGNvbnN0IGIgPSAxNzY7XG4gICAgY29uc3QgcyA9IHRoaXMuX3M7XG4gICAgY29uc3QgcmNvbiA9IHRoaXMuX3Jjb247XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShiKTtcbiAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7XG5cbiAgICBmb3IgKGxldCBqID0gMTYsIGkgPSAxOyBqIDwgYjsgKytpKSB7XG4gICAgICAvLyBSb3RXb3JkXG4gICAgICBsZXQgdDEgPSByZXN1bHRbaiAtIDNdO1xuICAgICAgbGV0IHQyID0gcmVzdWx0W2ogLSAyXTtcbiAgICAgIGxldCB0MyA9IHJlc3VsdFtqIC0gMV07XG4gICAgICBsZXQgdDQgPSByZXN1bHRbaiAtIDRdO1xuICAgICAgLy8gU3ViV29yZFxuICAgICAgdDEgPSBzW3QxXTtcbiAgICAgIHQyID0gc1t0Ml07XG4gICAgICB0MyA9IHNbdDNdO1xuICAgICAgdDQgPSBzW3Q0XTtcbiAgICAgIC8vIFJjb25cbiAgICAgIHQxID0gdDEgXiByY29uW2ldO1xuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA0OyArK24pIHtcbiAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAxNl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDIgXj0gcmVzdWx0W2ogLSAxNl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAxNl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAxNl07XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jbGFzcyBBRVMyNTZDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHtcbiAgY29uc3RydWN0b3Ioa2V5KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbiA9IDE0O1xuICAgIHRoaXMuX2tleVNpemUgPSAyMjQ7IC8vIGJpdHNcblxuICAgIHRoaXMuX2tleSA9IHRoaXMuX2V4cGFuZEtleShrZXkpO1xuICB9XG5cbiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHtcbiAgICBjb25zdCBiID0gMjQwO1xuICAgIGNvbnN0IHMgPSB0aGlzLl9zO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYik7XG4gICAgcmVzdWx0LnNldChjaXBoZXJLZXkpO1xuXG4gICAgbGV0IHIgPSAxO1xuICAgIGxldCB0MSwgdDIsIHQzLCB0NDtcbiAgICBmb3IgKGxldCBqID0gMzIsIGkgPSAxOyBqIDwgYjsgKytpKSB7XG4gICAgICBpZiAoaiAlIDMyID09PSAxNikge1xuICAgICAgICB0MSA9IHNbdDFdO1xuICAgICAgICB0MiA9IHNbdDJdO1xuICAgICAgICB0MyA9IHNbdDNdO1xuICAgICAgICB0NCA9IHNbdDRdO1xuICAgICAgfSBlbHNlIGlmIChqICUgMzIgPT09IDApIHtcbiAgICAgICAgLy8gUm90V29yZFxuICAgICAgICB0MSA9IHJlc3VsdFtqIC0gM107XG4gICAgICAgIHQyID0gcmVzdWx0W2ogLSAyXTtcbiAgICAgICAgdDMgPSByZXN1bHRbaiAtIDFdO1xuICAgICAgICB0NCA9IHJlc3VsdFtqIC0gNF07XG4gICAgICAgIC8vIFN1YldvcmRcbiAgICAgICAgdDEgPSBzW3QxXTtcbiAgICAgICAgdDIgPSBzW3QyXTtcbiAgICAgICAgdDMgPSBzW3QzXTtcbiAgICAgICAgdDQgPSBzW3Q0XTtcbiAgICAgICAgLy8gUmNvblxuICAgICAgICB0MSA9IHQxIF4gcjtcbiAgICAgICAgaWYgKChyIDw8PSAxKSA+PSAyNTYpIHtcbiAgICAgICAgICByID0gKHIgXiAweDFiKSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA0OyArK24pIHtcbiAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAzMl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDIgXj0gcmVzdWx0W2ogLSAzMl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAzMl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAzMl07XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG52YXIgUERGMTcgPSAoZnVuY3Rpb24gUERGMTdDbG9zdXJlKCkge1xuICBmdW5jdGlvbiBjb21wYXJlQnl0ZUFycmF5cyhhcnJheTEsIGFycmF5Mikge1xuICAgIGlmIChhcnJheTEubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUERGMTcoKSB7fVxuXG4gIFBERjE3LnByb3RvdHlwZSA9IHtcbiAgICBjaGVja093bmVyUGFzc3dvcmQ6IGZ1bmN0aW9uIFBERjE3X2NoZWNrT3duZXJQYXNzd29yZChcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgb3duZXJWYWxpZGF0aW9uU2FsdCxcbiAgICAgIHVzZXJCeXRlcyxcbiAgICAgIG93bmVyUGFzc3dvcmRcbiAgICApIHtcbiAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDU2KTtcbiAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7XG4gICAgICBoYXNoRGF0YS5zZXQob3duZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyVmFsaWRhdGlvblNhbHQubGVuZ3RoKTtcbiAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7XG4gICAgICByZXR1cm4gY29tcGFyZUJ5dGVBcnJheXMocmVzdWx0LCBvd25lclBhc3N3b3JkKTtcbiAgICB9LFxuICAgIGNoZWNrVXNlclBhc3N3b3JkOiBmdW5jdGlvbiBQREYxN19jaGVja1VzZXJQYXNzd29yZChcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgdXNlclZhbGlkYXRpb25TYWx0LFxuICAgICAgdXNlclBhc3N3b3JkXG4gICAgKSB7XG4gICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTtcbiAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7XG4gICAgICBoYXNoRGF0YS5zZXQodXNlclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpO1xuICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTtcbiAgICAgIHJldHVybiBjb21wYXJlQnl0ZUFycmF5cyhyZXN1bHQsIHVzZXJQYXNzd29yZCk7XG4gICAgfSxcbiAgICBnZXRPd25lcktleTogZnVuY3Rpb24gUERGMTdfZ2V0T3duZXJLZXkoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIG93bmVyS2V5U2FsdCxcbiAgICAgIHVzZXJCeXRlcyxcbiAgICAgIG93bmVyRW5jcnlwdGlvblxuICAgICkge1xuICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpO1xuICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTtcbiAgICAgIGhhc2hEYXRhLnNldChvd25lcktleVNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7XG4gICAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lcktleVNhbHQubGVuZ3RoKTtcbiAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpO1xuICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTtcbiAgICB9LFxuICAgIGdldFVzZXJLZXk6IGZ1bmN0aW9uIFBERjE3X2dldFVzZXJLZXkoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHVzZXJLZXlTYWx0LFxuICAgICAgdXNlckVuY3J5cHRpb25cbiAgICApIHtcbiAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpO1xuICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIC8vIGBrZXlgIGlzIHRoZSBkZWNyeXB0aW9uIGtleSBmb3IgdGhlIFVFIHN0cmluZy5cbiAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpO1xuICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sodXNlckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBQREYxNztcbn0pKCk7XG5cbnZhciBQREYyMCA9IChmdW5jdGlvbiBQREYyMENsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIGNvbmNhdEFycmF5cyhhcnJheTEsIGFycmF5Mikge1xuICAgIHZhciB0ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpO1xuICAgIHQuc2V0KGFycmF5MSwgMCk7XG4gICAgdC5zZXQoYXJyYXkyLCBhcnJheTEubGVuZ3RoKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykge1xuICAgIC8vIFRoaXMgcmVmZXJzIHRvIEFsZ29yaXRobSAyLkIgYXMgZGVmaW5lZCBpbiBJU08gMzIwMDAtMi5cbiAgICB2YXIgayA9IGNhbGN1bGF0ZVNIQTI1NihpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKS5zdWJhcnJheSgwLCAzMik7XG4gICAgdmFyIGUgPSBbMF07XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgNjQgfHwgZVtlLmxlbmd0aCAtIDFdID4gaSAtIDMyKSB7XG4gICAgICB2YXIgYXJyYXlMZW5ndGggPSBwYXNzd29yZC5sZW5ndGggKyBrLmxlbmd0aCArIHVzZXJCeXRlcy5sZW5ndGg7XG5cbiAgICAgIHZhciBrMSA9IG5ldyBVaW50OEFycmF5KGFycmF5TGVuZ3RoICogNjQpO1xuICAgICAgdmFyIGFycmF5ID0gY29uY2F0QXJyYXlzKHBhc3N3b3JkLCBrKTtcbiAgICAgIGFycmF5ID0gY29uY2F0QXJyYXlzKGFycmF5LCB1c2VyQnl0ZXMpO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIHBvcyA9IDA7IGogPCA2NDsgaisrLCBwb3MgKz0gYXJyYXlMZW5ndGgpIHtcbiAgICAgICAgazEuc2V0KGFycmF5LCBwb3MpO1xuICAgICAgfVxuICAgICAgLy8gQUVTMTI4IENCQyBOTyBQQURESU5HIHdpdGggZmlyc3QgMTYgYnl0ZXMgb2YgayBhcyB0aGUga2V5XG4gICAgICAvLyBhbmQgdGhlIHNlY29uZCAxNiBhcyB0aGUgaXYuXG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzEyOENpcGhlcihrLnN1YmFycmF5KDAsIDE2KSk7XG4gICAgICBlID0gY2lwaGVyLmVuY3J5cHQoazEsIGsuc3ViYXJyYXkoMTYsIDMyKSk7XG4gICAgICAvLyBOb3cgd2UgaGF2ZSB0byB0YWtlIHRoZSBmaXJzdCAxNiBieXRlcyBvZiBhbiB1bnNpZ25lZCBiaWcgZW5kaWFuXG4gICAgICAvLyBpbnRlZ2VyIGFuZCBjb21wdXRlIHRoZSByZW1haW5kZXIgbW9kdWxvIDMuIFRoYXQgaXMgYSBmYWlybHkgbGFyZ2VcbiAgICAgIC8vIG51bWJlciBhbmQgSmF2YVNjcmlwdCBpc24ndCBnb2luZyB0byBoYW5kbGUgdGhhdCB3ZWxsLCBzbyB3ZSdyZSB1c2luZ1xuICAgICAgLy8gYSB0cmljayB0aGF0IGFsbG93cyB1cyB0byBwZXJmb3JtIG1vZHVsbyBtYXRoIGJ5dGUgYnkgYnl0ZS5cbiAgICAgIHZhciByZW1haW5kZXIgPSAwO1xuICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCAxNjsgeisrKSB7XG4gICAgICAgIHJlbWFpbmRlciAqPSAyNTYgJSAzO1xuICAgICAgICByZW1haW5kZXIgJT0gMztcbiAgICAgICAgcmVtYWluZGVyICs9IChlW3pdID4+PiAwKSAlIDM7XG4gICAgICAgIHJlbWFpbmRlciAlPSAzO1xuICAgICAgfVxuICAgICAgaWYgKHJlbWFpbmRlciA9PT0gMCkge1xuICAgICAgICBrID0gY2FsY3VsYXRlU0hBMjU2KGUsIDAsIGUubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluZGVyID09PSAxKSB7XG4gICAgICAgIGsgPSBjYWxjdWxhdGVTSEEzODQoZSwgMCwgZS5sZW5ndGgpO1xuICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDIpIHtcbiAgICAgICAgayA9IGNhbGN1bGF0ZVNIQTUxMihlLCAwLCBlLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBrLnN1YmFycmF5KDAsIDMyKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUERGMjAoKSB7fVxuXG4gIGZ1bmN0aW9uIGNvbXBhcmVCeXRlQXJyYXlzKGFycmF5MSwgYXJyYXkyKSB7XG4gICAgaWYgKGFycmF5MS5sZW5ndGggIT09IGFycmF5Mi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJheTFbaV0gIT09IGFycmF5MltpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgUERGMjAucHJvdG90eXBlID0ge1xuICAgIGhhc2g6IGZ1bmN0aW9uIFBERjIwX2hhc2gocGFzc3dvcmQsIGNvbmNhdEJ5dGVzLCB1c2VyQnl0ZXMpIHtcbiAgICAgIHJldHVybiBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGNvbmNhdEJ5dGVzLCB1c2VyQnl0ZXMpO1xuICAgIH0sXG4gICAgY2hlY2tPd25lclBhc3N3b3JkOiBmdW5jdGlvbiBQREYyMF9jaGVja093bmVyUGFzc3dvcmQoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIG93bmVyVmFsaWRhdGlvblNhbHQsXG4gICAgICB1c2VyQnl0ZXMsXG4gICAgICBvd25lclBhc3N3b3JkXG4gICAgKSB7XG4gICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7XG4gICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApO1xuICAgICAgaGFzaERhdGEuc2V0KG93bmVyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7XG4gICAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lclZhbGlkYXRpb25TYWx0Lmxlbmd0aCk7XG4gICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgdXNlckJ5dGVzKTtcbiAgICAgIHJldHVybiBjb21wYXJlQnl0ZUFycmF5cyhyZXN1bHQsIG93bmVyUGFzc3dvcmQpO1xuICAgIH0sXG4gICAgY2hlY2tVc2VyUGFzc3dvcmQ6IGZ1bmN0aW9uIFBERjIwX2NoZWNrVXNlclBhc3N3b3JkKFxuICAgICAgcGFzc3dvcmQsXG4gICAgICB1c2VyVmFsaWRhdGlvblNhbHQsXG4gICAgICB1c2VyUGFzc3dvcmRcbiAgICApIHtcbiAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpO1xuICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7XG4gICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgW10pO1xuICAgICAgcmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKHJlc3VsdCwgdXNlclBhc3N3b3JkKTtcbiAgICB9LFxuICAgIGdldE93bmVyS2V5OiBmdW5jdGlvbiBQREYyMF9nZXRPd25lcktleShcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgb3duZXJLZXlTYWx0LFxuICAgICAgdXNlckJ5dGVzLFxuICAgICAgb3duZXJFbmNyeXB0aW9uXG4gICAgKSB7XG4gICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7XG4gICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApO1xuICAgICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpO1xuICAgICAgdmFyIGtleSA9IGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpO1xuICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTtcbiAgICB9LFxuICAgIGdldFVzZXJLZXk6IGZ1bmN0aW9uIFBERjIwX2dldFVzZXJLZXkoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHVzZXJLZXlTYWx0LFxuICAgICAgdXNlckVuY3J5cHRpb25cbiAgICApIHtcbiAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpO1xuICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIC8vIGBrZXlgIGlzIHRoZSBkZWNyeXB0aW9uIGtleSBmb3IgdGhlIFVFIHN0cmluZy5cbiAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCBbXSk7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpO1xuICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sodXNlckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBQREYyMDtcbn0pKCk7XG5cbnZhciBDaXBoZXJUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm0oc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IsIHN0cmVhbUNpcGhlckNvbnN0cnVjdG9yKSB7XG4gICAgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvciA9IHN0cmluZ0NpcGhlckNvbnN0cnVjdG9yO1xuICAgIHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IgPSBzdHJlYW1DaXBoZXJDb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIENpcGhlclRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gICAgY3JlYXRlU3RyZWFtOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fY3JlYXRlU3RyZWFtKHN0cmVhbSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IoKTtcbiAgICAgIHJldHVybiBuZXcgRGVjcnlwdFN0cmVhbShcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBsZW5ndGgsXG4gICAgICAgIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybURlY3J5cHRTdHJlYW0oZGF0YSwgZmluYWxpemUpIHtcbiAgICAgICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICBkZWNyeXB0U3RyaW5nOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fZGVjcnlwdFN0cmluZyhzKSB7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IoKTtcbiAgICAgIHZhciBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTtcbiAgICAgIGRhdGEgPSBjaXBoZXIuZGVjcnlwdEJsb2NrKGRhdGEsIHRydWUpO1xuICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoZGF0YSk7XG4gICAgfSxcbiAgICBlbmNyeXB0U3RyaW5nOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fZW5jcnlwdFN0cmluZyhzKSB7XG4gICAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKGNpcGhlciBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpIHtcbiAgICAgICAgLy8gQXBwZW5kIHNvbWUgY2hhcnMgZXF1YWwgdG8gXCIxNiAtIChNIG1vZCAxNilcIlxuICAgICAgICAvLyB3aGVyZSBNIGlzIHRoZSBzdHJpbmcgbGVuZ3RoIChzZWUgc2VjdGlvbiA3LjYuMiBpbiBQREYgc3BlY2lmaWNhdGlvbilcbiAgICAgICAgLy8gdG8gaGF2ZSBhIGZpbmFsIHN0cmluZyB3aGVyZSB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgMTYuXG4gICAgICAgIGNvbnN0IHN0ckxlbiA9IHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYWQgPSAxNiAtIChzdHJMZW4gJSAxNik7XG4gICAgICAgIGlmIChwYWQgIT09IDE2KSB7XG4gICAgICAgICAgcyA9IHMucGFkRW5kKDE2ICogTWF0aC5jZWlsKHN0ckxlbiAvIDE2KSwgU3RyaW5nLmZyb21DaGFyQ29kZShwYWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIGFuIGluaXRpYWxpemF0aW9uIHZlY3RvclxuICAgICAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGl2KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgIGl2W2ldID0gTWF0aC5mbG9vcigyNTYgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0YSA9IHN0cmluZ1RvQnl0ZXMocyk7XG4gICAgICAgIGRhdGEgPSBjaXBoZXIuZW5jcnlwdChkYXRhLCBpdik7XG5cbiAgICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGJ1Zi5zZXQoaXYpO1xuICAgICAgICBidWYuc2V0KGRhdGEsIDE2KTtcblxuICAgICAgICByZXR1cm4gYnl0ZXNUb1N0cmluZyhidWYpO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YSA9IHN0cmluZ1RvQnl0ZXMocyk7XG4gICAgICBkYXRhID0gY2lwaGVyLmVuY3J5cHQoZGF0YSk7XG4gICAgICByZXR1cm4gYnl0ZXNUb1N0cmluZyhkYXRhKTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gQ2lwaGVyVHJhbnNmb3JtO1xufSkoKTtcblxudmFyIENpcGhlclRyYW5zZm9ybUZhY3RvcnkgPSAoZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeUNsb3N1cmUoKSB7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgZGVmYXVsdFBhc3N3b3JkQnl0ZXMgPSBuZXcgVWludDhBcnJheShbXG4gICAgMHgyOCwgMHhCRiwgMHg0RSwgMHg1RSwgMHg0RSwgMHg3NSwgMHg4QSwgMHg0MSxcbiAgICAweDY0LCAweDAwLCAweDRFLCAweDU2LCAweEZGLCAweEZBLCAweDAxLCAweDA4LFxuICAgIDB4MkUsIDB4MkUsIDB4MDAsIDB4QjYsIDB4RDAsIDB4NjgsIDB4M0UsIDB4ODAsXG4gICAgMHgyRiwgMHgwQywgMHhBOSwgMHhGRSwgMHg2NCwgMHg1MywgMHg2OSwgMHg3QV0pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRpb25LZXkyMChcbiAgICByZXZpc2lvbixcbiAgICBwYXNzd29yZCxcbiAgICBvd25lclBhc3N3b3JkLFxuICAgIG93bmVyVmFsaWRhdGlvblNhbHQsXG4gICAgb3duZXJLZXlTYWx0LFxuICAgIHVCeXRlcyxcbiAgICB1c2VyUGFzc3dvcmQsXG4gICAgdXNlclZhbGlkYXRpb25TYWx0LFxuICAgIHVzZXJLZXlTYWx0LFxuICAgIG93bmVyRW5jcnlwdGlvbixcbiAgICB1c2VyRW5jcnlwdGlvbixcbiAgICBwZXJtc1xuICApIHtcbiAgICBpZiAocGFzc3dvcmQpIHtcbiAgICAgIHZhciBwYXNzd29yZExlbmd0aCA9IE1hdGgubWluKDEyNywgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmQuc3ViYXJyYXkoMCwgcGFzc3dvcmRMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXNzd29yZCA9IFtdO1xuICAgIH1cbiAgICB2YXIgcGRmQWxnb3JpdGhtO1xuICAgIGlmIChyZXZpc2lvbiA9PT0gNikge1xuICAgICAgcGRmQWxnb3JpdGhtID0gbmV3IFBERjIwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBkZkFsZ29yaXRobSA9IG5ldyBQREYxNygpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBkZkFsZ29yaXRobS5jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGRmQWxnb3JpdGhtLmdldFVzZXJLZXkocGFzc3dvcmQsIHVzZXJLZXlTYWx0LCB1c2VyRW5jcnlwdGlvbik7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhc3N3b3JkLmxlbmd0aCAmJlxuICAgICAgcGRmQWxnb3JpdGhtLmNoZWNrT3duZXJQYXNzd29yZChcbiAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgIG93bmVyVmFsaWRhdGlvblNhbHQsXG4gICAgICAgIHVCeXRlcyxcbiAgICAgICAgb3duZXJQYXNzd29yZFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHBkZkFsZ29yaXRobS5nZXRPd25lcktleShcbiAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgIG93bmVyS2V5U2FsdCxcbiAgICAgICAgdUJ5dGVzLFxuICAgICAgICBvd25lckVuY3J5cHRpb25cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlS2V5RGF0YShcbiAgICBmaWxlSWQsXG4gICAgcGFzc3dvcmQsXG4gICAgb3duZXJQYXNzd29yZCxcbiAgICB1c2VyUGFzc3dvcmQsXG4gICAgZmxhZ3MsXG4gICAgcmV2aXNpb24sXG4gICAga2V5TGVuZ3RoLFxuICAgIGVuY3J5cHRNZXRhZGF0YVxuICApIHtcbiAgICB2YXIgaGFzaERhdGFTaXplID0gNDAgKyBvd25lclBhc3N3b3JkLmxlbmd0aCArIGZpbGVJZC5sZW5ndGg7XG4gICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkoaGFzaERhdGFTaXplKSxcbiAgICAgIGkgPSAwLFxuICAgICAgaixcbiAgICAgIG47XG4gICAgaWYgKHBhc3N3b3JkKSB7XG4gICAgICBuID0gTWF0aC5taW4oMzIsIHBhc3N3b3JkLmxlbmd0aCk7XG4gICAgICBmb3IgKDsgaSA8IG47ICsraSkge1xuICAgICAgICBoYXNoRGF0YVtpXSA9IHBhc3N3b3JkW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICBqID0gMDtcbiAgICB3aGlsZSAoaSA8IDMyKSB7XG4gICAgICBoYXNoRGF0YVtpKytdID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTtcbiAgICB9XG4gICAgLy8gYXMgbm93IHRoZSBwYWRkZWQgcGFzc3dvcmQgaW4gdGhlIGhhc2hEYXRhWzAuLmldXG4gICAgZm9yIChqID0gMCwgbiA9IG93bmVyUGFzc3dvcmQubGVuZ3RoOyBqIDwgbjsgKytqKSB7XG4gICAgICBoYXNoRGF0YVtpKytdID0gb3duZXJQYXNzd29yZFtqXTtcbiAgICB9XG4gICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzICYgMHhmZjtcbiAgICBoYXNoRGF0YVtpKytdID0gKGZsYWdzID4+IDgpICYgMHhmZjtcbiAgICBoYXNoRGF0YVtpKytdID0gKGZsYWdzID4+IDE2KSAmIDB4ZmY7XG4gICAgaGFzaERhdGFbaSsrXSA9IChmbGFncyA+Pj4gMjQpICYgMHhmZjtcbiAgICBmb3IgKGogPSAwLCBuID0gZmlsZUlkLmxlbmd0aDsgaiA8IG47ICsraikge1xuICAgICAgaGFzaERhdGFbaSsrXSA9IGZpbGVJZFtqXTtcbiAgICB9XG4gICAgaWYgKHJldmlzaW9uID49IDQgJiYgIWVuY3J5cHRNZXRhZGF0YSkge1xuICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7XG4gICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjtcbiAgICAgIGhhc2hEYXRhW2krK10gPSAweGZmO1xuICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7XG4gICAgfVxuICAgIHZhciBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTtcbiAgICB2YXIga2V5TGVuZ3RoSW5CeXRlcyA9IGtleUxlbmd0aCA+PiAzO1xuICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikge1xuICAgICAgICBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2gsIDAsIGtleUxlbmd0aEluQnl0ZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZW5jcnlwdGlvbktleSA9IGhhc2guc3ViYXJyYXkoMCwga2V5TGVuZ3RoSW5CeXRlcyk7XG4gICAgdmFyIGNpcGhlciwgY2hlY2tEYXRhO1xuXG4gICAgaWYgKHJldmlzaW9uID49IDMpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7XG4gICAgICAgIGhhc2hEYXRhW2ldID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaV07XG4gICAgICB9XG4gICAgICBmb3IgKGogPSAwLCBuID0gZmlsZUlkLmxlbmd0aDsgaiA8IG47ICsraikge1xuICAgICAgICBoYXNoRGF0YVtpKytdID0gZmlsZUlkW2pdO1xuICAgICAgfVxuICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZW5jcnlwdGlvbktleSk7XG4gICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSkpO1xuICAgICAgbiA9IGVuY3J5cHRpb25LZXkubGVuZ3RoO1xuICAgICAgdmFyIGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShuKSxcbiAgICAgICAgaztcbiAgICAgIGZvciAoaiA9IDE7IGogPD0gMTk7ICsraikge1xuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgICAgICAgZGVyaXZlZEtleVtrXSA9IGVuY3J5cHRpb25LZXlba10gXiBqO1xuICAgICAgICB9XG4gICAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGRlcml2ZWRLZXkpO1xuICAgICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNoZWNrRGF0YSk7XG4gICAgICB9XG4gICAgICBmb3IgKGogPSAwLCBuID0gY2hlY2tEYXRhLmxlbmd0aDsgaiA8IG47ICsraikge1xuICAgICAgICBpZiAodXNlclBhc3N3b3JkW2pdICE9PSBjaGVja0RhdGFbal0pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihlbmNyeXB0aW9uS2V5KTtcbiAgICAgIGNoZWNrRGF0YSA9IGNpcGhlci5lbmNyeXB0QmxvY2soZGVmYXVsdFBhc3N3b3JkQnl0ZXMpO1xuICAgICAgZm9yIChqID0gMCwgbiA9IGNoZWNrRGF0YS5sZW5ndGg7IGogPCBuOyArK2opIHtcbiAgICAgICAgaWYgKHVzZXJQYXNzd29yZFtqXSAhPT0gY2hlY2tEYXRhW2pdKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuY3J5cHRpb25LZXk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpIHtcbiAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheSgzMiksXG4gICAgICBpID0gMCxcbiAgICAgIGosXG4gICAgICBuO1xuICAgIG4gPSBNYXRoLm1pbigzMiwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICBmb3IgKDsgaSA8IG47ICsraSkge1xuICAgICAgaGFzaERhdGFbaV0gPSBwYXNzd29yZFtpXTtcbiAgICB9XG4gICAgaiA9IDA7XG4gICAgd2hpbGUgKGkgPCAzMikge1xuICAgICAgaGFzaERhdGFbaSsrXSA9IGRlZmF1bHRQYXNzd29yZEJ5dGVzW2orK107XG4gICAgfVxuICAgIHZhciBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTtcbiAgICB2YXIga2V5TGVuZ3RoSW5CeXRlcyA9IGtleUxlbmd0aCA+PiAzO1xuICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikge1xuICAgICAgICBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2gsIDAsIGhhc2gubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2lwaGVyLCB1c2VyUGFzc3dvcmQ7XG4gICAgaWYgKHJldmlzaW9uID49IDMpIHtcbiAgICAgIHVzZXJQYXNzd29yZCA9IG93bmVyUGFzc3dvcmQ7XG4gICAgICB2YXIgZGVyaXZlZEtleSA9IG5ldyBVaW50OEFycmF5KGtleUxlbmd0aEluQnl0ZXMpLFxuICAgICAgICBrO1xuICAgICAgZm9yIChqID0gMTk7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBrZXlMZW5ndGhJbkJ5dGVzOyArK2spIHtcbiAgICAgICAgICBkZXJpdmVkS2V5W2tdID0gaGFzaFtrXSBeIGo7XG4gICAgICAgIH1cbiAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7XG4gICAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sodXNlclBhc3N3b3JkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoaGFzaC5zdWJhcnJheSgwLCBrZXlMZW5ndGhJbkJ5dGVzKSk7XG4gICAgICB1c2VyUGFzc3dvcmQgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKG93bmVyUGFzc3dvcmQpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlclBhc3N3b3JkO1xuICB9XG5cbiAgdmFyIGlkZW50aXR5TmFtZSA9IE5hbWUuZ2V0KFwiSWRlbnRpdHlcIik7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KGRpY3QsIGZpbGVJZCwgcGFzc3dvcmQpIHtcbiAgICB2YXIgZmlsdGVyID0gZGljdC5nZXQoXCJGaWx0ZXJcIik7XG4gICAgaWYgKCFpc05hbWUoZmlsdGVyLCBcIlN0YW5kYXJkXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJ1bmtub3duIGVuY3J5cHRpb24gbWV0aG9kXCIpO1xuICAgIH1cbiAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIHZhciBhbGdvcml0aG0gPSBkaWN0LmdldChcIlZcIik7XG4gICAgaWYgKFxuICAgICAgIU51bWJlci5pc0ludGVnZXIoYWxnb3JpdGhtKSB8fFxuICAgICAgKGFsZ29yaXRobSAhPT0gMSAmJiBhbGdvcml0aG0gIT09IDIgJiYgYWxnb3JpdGhtICE9PSA0ICYmIGFsZ29yaXRobSAhPT0gNSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcInVuc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnb3JpdGhtXCIpO1xuICAgIH1cbiAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTtcbiAgICB2YXIga2V5TGVuZ3RoID0gZGljdC5nZXQoXCJMZW5ndGhcIik7XG4gICAgaWYgKCFrZXlMZW5ndGgpIHtcbiAgICAgIC8vIFNwZWMgYXNrcyB0byByZWx5IG9uIGVuY3J5cHRpb24gZGljdGlvbmFyeSdzIExlbmd0aCBlbnRyeSwgaG93ZXZlclxuICAgICAgLy8gc29tZSBQREZzIGRvbid0IGhhdmUgaXQuIFRyeWluZyB0byByZWNvdmVyLlxuICAgICAgaWYgKGFsZ29yaXRobSA8PSAzKSB7XG4gICAgICAgIC8vIEZvciAxIGFuZCAyIGl0J3MgZml4ZWQgdG8gNDAtYml0LCBmb3IgMyA0MC1iaXQgaXMgYSBtaW5pbWFsIHZhbHVlLlxuICAgICAgICBrZXlMZW5ndGggPSA0MDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRyeWluZyB0byBmaW5kIGRlZmF1bHQgaGFuZGxlciAtLSBpdCB1c3VhbGx5IGhhcyBMZW5ndGguXG4gICAgICAgIHZhciBjZkRpY3QgPSBkaWN0LmdldChcIkNGXCIpO1xuICAgICAgICB2YXIgc3RyZWFtQ3J5cHRvTmFtZSA9IGRpY3QuZ2V0KFwiU3RtRlwiKTtcbiAgICAgICAgaWYgKGlzRGljdChjZkRpY3QpICYmIGlzTmFtZShzdHJlYW1DcnlwdG9OYW1lKSkge1xuICAgICAgICAgIGNmRGljdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOyAvLyBTZWUgY29tbWVudCBiZWxvdy5cbiAgICAgICAgICB2YXIgaGFuZGxlckRpY3QgPSBjZkRpY3QuZ2V0KHN0cmVhbUNyeXB0b05hbWUubmFtZSk7XG4gICAgICAgICAga2V5TGVuZ3RoID0gKGhhbmRsZXJEaWN0ICYmIGhhbmRsZXJEaWN0LmdldChcIkxlbmd0aFwiKSkgfHwgMTI4O1xuICAgICAgICAgIGlmIChrZXlMZW5ndGggPCA0MCkge1xuICAgICAgICAgICAgLy8gU29tZXRpbWVzIGl0J3MgaW5jb3JyZWN0IHZhbHVlIG9mIGJpdHMsIGdlbmVyYXRvcnMgc3BlY2lmeSBieXRlcy5cbiAgICAgICAgICAgIGtleUxlbmd0aCA8PD0gMztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtleUxlbmd0aCkgfHwga2V5TGVuZ3RoIDwgNDAgfHwga2V5TGVuZ3RoICUgOCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuICAgIH1cblxuICAgIC8vIHByZXBhcmUga2V5c1xuICAgIHZhciBvd25lclBhc3N3b3JkID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIk9cIikpLnN1YmFycmF5KDAsIDMyKTtcbiAgICB2YXIgdXNlclBhc3N3b3JkID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIlVcIikpLnN1YmFycmF5KDAsIDMyKTtcbiAgICB2YXIgZmxhZ3MgPSBkaWN0LmdldChcIlBcIik7XG4gICAgdmFyIHJldmlzaW9uID0gZGljdC5nZXQoXCJSXCIpO1xuICAgIC8vIG1lYW5pbmdmdWwgd2hlbiBWIGlzIDQgb3IgNVxuICAgIHZhciBlbmNyeXB0TWV0YWRhdGEgPVxuICAgICAgKGFsZ29yaXRobSA9PT0gNCB8fCBhbGdvcml0aG0gPT09IDUpICYmXG4gICAgICBkaWN0LmdldChcIkVuY3J5cHRNZXRhZGF0YVwiKSAhPT0gZmFsc2U7XG4gICAgdGhpcy5lbmNyeXB0TWV0YWRhdGEgPSBlbmNyeXB0TWV0YWRhdGE7XG5cbiAgICB2YXIgZmlsZUlkQnl0ZXMgPSBzdHJpbmdUb0J5dGVzKGZpbGVJZCk7XG4gICAgdmFyIHBhc3N3b3JkQnl0ZXM7XG4gICAgaWYgKHBhc3N3b3JkKSB7XG4gICAgICBpZiAocmV2aXNpb24gPT09IDYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXNzd29yZCA9IHV0ZjhTdHJpbmdUb1N0cmluZyhwYXNzd29yZCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeTogXCIgK1xuICAgICAgICAgICAgICBcIlVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhc3N3b3JkQnl0ZXMgPSBzdHJpbmdUb0J5dGVzKHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICB2YXIgZW5jcnlwdGlvbktleTtcbiAgICBpZiAoYWxnb3JpdGhtICE9PSA1KSB7XG4gICAgICBlbmNyeXB0aW9uS2V5ID0gcHJlcGFyZUtleURhdGEoXG4gICAgICAgIGZpbGVJZEJ5dGVzLFxuICAgICAgICBwYXNzd29yZEJ5dGVzLFxuICAgICAgICBvd25lclBhc3N3b3JkLFxuICAgICAgICB1c2VyUGFzc3dvcmQsXG4gICAgICAgIGZsYWdzLFxuICAgICAgICByZXZpc2lvbixcbiAgICAgICAga2V5TGVuZ3RoLFxuICAgICAgICBlbmNyeXB0TWV0YWRhdGFcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvd25lclZhbGlkYXRpb25TYWx0ID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIk9cIikpLnN1YmFycmF5KDMyLCA0MCk7XG4gICAgICB2YXIgb3duZXJLZXlTYWx0ID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIk9cIikpLnN1YmFycmF5KDQwLCA0OCk7XG4gICAgICB2YXIgdUJ5dGVzID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIlVcIikpLnN1YmFycmF5KDAsIDQ4KTtcbiAgICAgIHZhciB1c2VyVmFsaWRhdGlvblNhbHQgPSBzdHJpbmdUb0J5dGVzKGRpY3QuZ2V0KFwiVVwiKSkuc3ViYXJyYXkoMzIsIDQwKTtcbiAgICAgIHZhciB1c2VyS2V5U2FsdCA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoXCJVXCIpKS5zdWJhcnJheSg0MCwgNDgpO1xuICAgICAgdmFyIG93bmVyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoXCJPRVwiKSk7XG4gICAgICB2YXIgdXNlckVuY3J5cHRpb24gPSBzdHJpbmdUb0J5dGVzKGRpY3QuZ2V0KFwiVUVcIikpO1xuICAgICAgdmFyIHBlcm1zID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIlBlcm1zXCIpKTtcbiAgICAgIGVuY3J5cHRpb25LZXkgPSBjcmVhdGVFbmNyeXB0aW9uS2V5MjAoXG4gICAgICAgIHJldmlzaW9uLFxuICAgICAgICBwYXNzd29yZEJ5dGVzLFxuICAgICAgICBvd25lclBhc3N3b3JkLFxuICAgICAgICBvd25lclZhbGlkYXRpb25TYWx0LFxuICAgICAgICBvd25lcktleVNhbHQsXG4gICAgICAgIHVCeXRlcyxcbiAgICAgICAgdXNlclBhc3N3b3JkLFxuICAgICAgICB1c2VyVmFsaWRhdGlvblNhbHQsXG4gICAgICAgIHVzZXJLZXlTYWx0LFxuICAgICAgICBvd25lckVuY3J5cHRpb24sXG4gICAgICAgIHVzZXJFbmNyeXB0aW9uLFxuICAgICAgICBwZXJtc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFlbmNyeXB0aW9uS2V5ICYmICFwYXNzd29yZCkge1xuICAgICAgdGhyb3cgbmV3IFBhc3N3b3JkRXhjZXB0aW9uKFxuICAgICAgICBcIk5vIHBhc3N3b3JkIGdpdmVuXCIsXG4gICAgICAgIFBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghZW5jcnlwdGlvbktleSAmJiBwYXNzd29yZCkge1xuICAgICAgLy8gQXR0ZW1wdGluZyB1c2UgdGhlIHBhc3N3b3JkIGFzIGFuIG93bmVyIHBhc3N3b3JkXG4gICAgICB2YXIgZGVjb2RlZFBhc3N3b3JkID0gZGVjb2RlVXNlclBhc3N3b3JkKFxuICAgICAgICBwYXNzd29yZEJ5dGVzLFxuICAgICAgICBvd25lclBhc3N3b3JkLFxuICAgICAgICByZXZpc2lvbixcbiAgICAgICAga2V5TGVuZ3RoXG4gICAgICApO1xuICAgICAgZW5jcnlwdGlvbktleSA9IHByZXBhcmVLZXlEYXRhKFxuICAgICAgICBmaWxlSWRCeXRlcyxcbiAgICAgICAgZGVjb2RlZFBhc3N3b3JkLFxuICAgICAgICBvd25lclBhc3N3b3JkLFxuICAgICAgICB1c2VyUGFzc3dvcmQsXG4gICAgICAgIGZsYWdzLFxuICAgICAgICByZXZpc2lvbixcbiAgICAgICAga2V5TGVuZ3RoLFxuICAgICAgICBlbmNyeXB0TWV0YWRhdGFcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFlbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgUGFzc3dvcmRFeGNlcHRpb24oXG4gICAgICAgIFwiSW5jb3JyZWN0IFBhc3N3b3JkXCIsXG4gICAgICAgIFBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuXG4gICAgaWYgKGFsZ29yaXRobSA+PSA0KSB7XG4gICAgICB2YXIgY2YgPSBkaWN0LmdldChcIkNGXCIpO1xuICAgICAgaWYgKGlzRGljdChjZikpIHtcbiAgICAgICAgLy8gVGhlICdDRicgZGljdGlvbmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBlbmNyeXB0ZWQsIGFuZCBieSBzZXR0aW5nXG4gICAgICAgIC8vIGBzdXBwcmVzc0VuY3J5cHRpb25gIHdlIGNhbiBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AgaW5zaWRlIG9mXG4gICAgICAgIC8vIGBYUmVmX2ZldGNoVW5jb21wcmVzc2VkYCBpZiB0aGUgZGljdGlvbmFyeSBjb250YWlucyBpbmRpcmVjdCBvYmplY3RzXG4gICAgICAgIC8vIChmaXhlcyBpc3N1ZTc2NjUucGRmKS5cbiAgICAgICAgY2Yuc3VwcHJlc3NFbmNyeXB0aW9uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2YgPSBjZjtcbiAgICAgIHRoaXMuc3RtZiA9IGRpY3QuZ2V0KFwiU3RtRlwiKSB8fCBpZGVudGl0eU5hbWU7XG4gICAgICB0aGlzLnN0cmYgPSBkaWN0LmdldChcIlN0ckZcIikgfHwgaWRlbnRpdHlOYW1lO1xuICAgICAgdGhpcy5lZmYgPSBkaWN0LmdldChcIkVGRlwiKSB8fCB0aGlzLnN0bWY7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGVuY3J5cHRpb25LZXksIGlzQWVzKSB7XG4gICAgdmFyIGtleSA9IG5ldyBVaW50OEFycmF5KGVuY3J5cHRpb25LZXkubGVuZ3RoICsgOSksXG4gICAgICBpLFxuICAgICAgbjtcbiAgICBmb3IgKGkgPSAwLCBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGtleVtpXSA9IGVuY3J5cHRpb25LZXlbaV07XG4gICAgfVxuICAgIGtleVtpKytdID0gbnVtICYgMHhmZjtcbiAgICBrZXlbaSsrXSA9IChudW0gPj4gOCkgJiAweGZmO1xuICAgIGtleVtpKytdID0gKG51bSA+PiAxNikgJiAweGZmO1xuICAgIGtleVtpKytdID0gZ2VuICYgMHhmZjtcbiAgICBrZXlbaSsrXSA9IChnZW4gPj4gOCkgJiAweGZmO1xuICAgIGlmIChpc0Flcykge1xuICAgICAga2V5W2krK10gPSAweDczO1xuICAgICAga2V5W2krK10gPSAweDQxO1xuICAgICAga2V5W2krK10gPSAweDZjO1xuICAgICAga2V5W2krK10gPSAweDU0O1xuICAgIH1cbiAgICB2YXIgaGFzaCA9IGNhbGN1bGF0ZU1ENShrZXksIDAsIGkpO1xuICAgIHJldHVybiBoYXNoLnN1YmFycmF5KDAsIE1hdGgubWluKGVuY3J5cHRpb25LZXkubGVuZ3RoICsgNSwgMTYpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkQ2lwaGVyQ29uc3RydWN0b3IoY2YsIG5hbWUsIG51bSwgZ2VuLCBrZXkpIHtcbiAgICBpZiAoIWlzTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS5cIik7XG4gICAgfVxuICAgIHZhciBjcnlwdEZpbHRlciA9IGNmLmdldChuYW1lLm5hbWUpO1xuICAgIHZhciBjZm07XG4gICAgaWYgKGNyeXB0RmlsdGVyICE9PSBudWxsICYmIGNyeXB0RmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNmbSA9IGNyeXB0RmlsdGVyLmdldChcIkNGTVwiKTtcbiAgICB9XG4gICAgaWYgKCFjZm0gfHwgY2ZtLm5hbWUgPT09IFwiTm9uZVwiKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JOb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IE51bGxDaXBoZXIoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChjZm0ubmFtZSA9PT0gXCJWMlwiKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JWMigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIGZhbHNlKSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoY2ZtLm5hbWUgPT09IFwiQUVTVjJcIikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yQUVTVjIoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQUVTMTI4Q2lwaGVyKGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIHRydWUpKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChjZm0ubmFtZSA9PT0gXCJBRVNWM1wiKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JBRVNWMygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIoa2V5KTtcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gY3J5cHRvIG1ldGhvZFwiKTtcbiAgfVxuXG4gIENpcGhlclRyYW5zZm9ybUZhY3RvcnkucHJvdG90eXBlID0ge1xuICAgIGNyZWF0ZUNpcGhlclRyYW5zZm9ybTogZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeV9jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oXG4gICAgICBudW0sXG4gICAgICBnZW5cbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmFsZ29yaXRobSA9PT0gNCB8fCB0aGlzLmFsZ29yaXRobSA9PT0gNSkge1xuICAgICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShcbiAgICAgICAgICBidWlsZENpcGhlckNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgdGhpcy5jZixcbiAgICAgICAgICAgIHRoaXMuc3RtZixcbiAgICAgICAgICAgIG51bSxcbiAgICAgICAgICAgIGdlbixcbiAgICAgICAgICAgIHRoaXMuZW5jcnlwdGlvbktleVxuICAgICAgICAgICksXG4gICAgICAgICAgYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihcbiAgICAgICAgICAgIHRoaXMuY2YsXG4gICAgICAgICAgICB0aGlzLnN0cmYsXG4gICAgICAgICAgICBudW0sXG4gICAgICAgICAgICBnZW4sXG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRpb25LZXlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBhbGdvcml0aG1zIDEgYW5kIDJcbiAgICAgIHZhciBrZXkgPSBidWlsZE9iamVjdEtleShudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5LCBmYWxzZSk7XG4gICAgICB2YXIgY2lwaGVyQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBidWlsZENpcGhlckNpcGhlckNvbnN0cnVjdG9yKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFSQ0ZvdXJDaXBoZXIoa2V5KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShjaXBoZXJDb25zdHJ1Y3RvciwgY2lwaGVyQ29uc3RydWN0b3IpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIENpcGhlclRyYW5zZm9ybUZhY3Rvcnk7XG59KSgpO1xuXG5leHBvcnQge1xuICBBRVMxMjhDaXBoZXIsXG4gIEFFUzI1NkNpcGhlcixcbiAgQVJDRm91ckNpcGhlcixcbiAgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeSxcbiAgUERGMTcsXG4gIFBERjIwLFxuICBjYWxjdWxhdGVNRDUsXG4gIGNhbGN1bGF0ZVNIQTI1NixcbiAgY2FsY3VsYXRlU0hBMzg0LFxuICBjYWxjdWxhdGVTSEE1MTIsXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIGFzc2VydCxcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIHNoYWRvdyxcbiAgdW5yZWFjaGFibGUsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgaXNEaWN0LCBpc05hbWUsIGlzU3RyZWFtLCBOYW1lLCBSZWYgfSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuLyoqXG4gKiBSZXNpemVzIGFuIFJHQiBpbWFnZSB3aXRoIDMgY29tcG9uZW50cy5cbiAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc3JjIC0gVGhlIHNvdXJjZSBidWZmZXIuXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGRlc3QgLSBUaGUgZGVzdGluYXRpb24gYnVmZmVyLlxuICogQHBhcmFtIHtudW1iZXJ9IHcxIC0gT3JpZ2luYWwgd2lkdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaDEgLSBPcmlnaW5hbCBoZWlnaHQuXG4gKiBAcGFyYW0ge251bWJlcn0gdzIgLSBOZXcgd2lkdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaDIgLSBOZXcgaGVpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhMDEgLSBTaXplIHJlc2VydmVkIGZvciB0aGUgYWxwaGEgY2hhbm5lbC5cbiAqL1xuZnVuY3Rpb24gcmVzaXplUmdiSW1hZ2Uoc3JjLCBkZXN0LCB3MSwgaDEsIHcyLCBoMiwgYWxwaGEwMSkge1xuICBjb25zdCBDT01QT05FTlRTID0gMztcbiAgYWxwaGEwMSA9IGFscGhhMDEgIT09IDEgPyAwIDogYWxwaGEwMTtcbiAgY29uc3QgeFJhdGlvID0gdzEgLyB3MjtcbiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjtcbiAgbGV0IG5ld0luZGV4ID0gMCxcbiAgICBvbGRJbmRleDtcbiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7XG4gIGNvbnN0IHcxU2NhbmxpbmUgPSB3MSAqIENPTVBPTkVOVFM7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB3MjsgaSsrKSB7XG4gICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbykgKiBDT01QT05FTlRTO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaDI7IGkrKykge1xuICAgIGNvbnN0IHB5ID0gTWF0aC5mbG9vcihpICogeVJhdGlvKSAqIHcxU2NhbmxpbmU7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB3MjsgaisrKSB7XG4gICAgICBvbGRJbmRleCA9IHB5ICsgeFNjYWxlZFtqXTtcbiAgICAgIGRlc3RbbmV3SW5kZXgrK10gPSBzcmNbb2xkSW5kZXgrK107XG4gICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdO1xuICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IHNyY1tvbGRJbmRleCsrXTtcbiAgICAgIG5ld0luZGV4ICs9IGFscGhhMDE7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIENvbG9yU3BhY2Uge1xuICBjb25zdHJ1Y3RvcihuYW1lLCBudW1Db21wcykge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBDb2xvclNwYWNlKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIENvbG9yU3BhY2UuXCIpO1xuICAgIH1cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubnVtQ29tcHMgPSBudW1Db21wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgY29sb3IgdmFsdWUgdG8gdGhlIFJHQiBjb2xvci4gVGhlIGNvbG9yIGNvbXBvbmVudHMgYXJlXG4gICAqIGxvY2F0ZWQgaW4gdGhlIHNyYyBhcnJheSBzdGFydGluZyBmcm9tIHRoZSBzcmNPZmZzZXQuIFJldHVybnMgdGhlIGFycmF5XG4gICAqIG9mIHRoZSByZ2IgY29tcG9uZW50cywgZWFjaCB2YWx1ZSByYW5naW5nIGZyb20gWzAsMjU1XS5cbiAgICovXG4gIGdldFJnYihzcmMsIHNyY09mZnNldCkge1xuICAgIGNvbnN0IHJnYiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtcbiAgICB0aGlzLmdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIHJnYiwgMCk7XG4gICAgcmV0dXJuIHJnYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgY29sb3IgdmFsdWUgdG8gdGhlIFJHQiBjb2xvciwgc2ltaWxhciB0byB0aGUgZ2V0UmdiIG1ldGhvZC5cbiAgICogVGhlIHJlc3VsdCBwbGFjZWQgaW50byB0aGUgZGVzdCBhcnJheSBzdGFydGluZyBmcm9tIHRoZSBkZXN0T2Zmc2V0LlxuICAgKi9cbiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgIHVucmVhY2hhYmxlKFwiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0UmdiSXRlbVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aGUgY29sb3IgdmFsdWVzIHRvIHRoZSBSR0IgY29sb3JzLlxuICAgKiBUaGUgY29sb3JzIGFyZSBsb2NhdGVkIGluIHRoZSBzcmMgYXJyYXkgc3RhcnRpbmcgZnJvbSB0aGUgc3JjT2Zmc2V0LlxuICAgKiBUaGUgcmVzdWx0IGlzIHBsYWNlZCBpbnRvIHRoZSBkZXN0IGFycmF5IHN0YXJ0aW5nIGZyb20gdGhlIGRlc3RPZmZzZXQuXG4gICAqIFRoZSBzcmMgYXJyYXkgaXRlbXMgc2hhbGwgYmUgaW4gWzAsMl5iaXRzKSByYW5nZSwgdGhlIGRlc3QgYXJyYXkgaXRlbXNcbiAgICogd2lsbCBiZSBpbiBbMCwyNTVdIHJhbmdlLiBhbHBoYTAxIGluZGljYXRlcyBob3cgbWFueSBhbHBoYSBjb21wb25lbnRzXG4gICAqIHRoZXJlIGFyZSBpbiB0aGUgZGVzdCBhcnJheTsgaXQgd2lsbCBiZSBlaXRoZXIgMCAoUkdCIGFycmF5KSBvciAxIChSR0JBXG4gICAqIGFycmF5KS5cbiAgICovXG4gIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHtcbiAgICB1bnJlYWNoYWJsZShcIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkJ1ZmZlclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGVcbiAgICogY29udmVyc2lvbiBkb25lIGJ5IHRoZSBnZXRSZ2JCdWZmZXIgbWV0aG9kLiBBcyBpbiBnZXRSZ2JCdWZmZXIsXG4gICAqIHxhbHBoYTAxfCBpcyBlaXRoZXIgMCAoUkdCIG91dHB1dCkgb3IgMSAoUkdCQSBvdXRwdXQpLlxuICAgKi9cbiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGhcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHNvdXJjZSBkYXRhIHdpbGwgYmUgZXF1YWwgdGhlIHJlc3VsdC9vdXRwdXQgZGF0YS5cbiAgICovXG4gIGlzUGFzc3Rocm91Z2goYml0cykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlciB0byB0aGUgc3RhdGljIGBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZWAgbWV0aG9kIGJlbG93LlxuICAgKi9cbiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7XG4gICAgcmV0dXJuIENvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgdGhpcy5udW1Db21wcyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsbHMgaW4gdGhlIFJHQiBjb2xvcnMgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIGFscGhhMDEgaW5kaWNhdGVzXG4gICAqIGhvdyBtYW55IGFscGhhIGNvbXBvbmVudHMgdGhlcmUgYXJlIGluIHRoZSBkZXN0IGFycmF5OyBpdCB3aWxsIGJlIGVpdGhlclxuICAgKiAwIChSR0IgYXJyYXkpIG9yIDEgKFJHQkEgYXJyYXkpLlxuICAgKi9cbiAgZmlsbFJnYihcbiAgICBkZXN0LFxuICAgIG9yaWdpbmFsV2lkdGgsXG4gICAgb3JpZ2luYWxIZWlnaHQsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGFjdHVhbEhlaWdodCxcbiAgICBicGMsXG4gICAgY29tcHMsXG4gICAgYWxwaGEwMVxuICApIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ0NvbG9yU3BhY2UuZmlsbFJnYjogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsV2lkdGggKiBvcmlnaW5hbEhlaWdodDtcbiAgICBsZXQgcmdiQnVmID0gbnVsbDtcbiAgICBjb25zdCBudW1Db21wb25lbnRDb2xvcnMgPSAxIDw8IGJwYztcbiAgICBjb25zdCBuZWVkc1Jlc2l6aW5nID0gb3JpZ2luYWxIZWlnaHQgIT09IGhlaWdodCB8fCBvcmlnaW5hbFdpZHRoICE9PSB3aWR0aDtcblxuICAgIGlmICh0aGlzLmlzUGFzc3Rocm91Z2goYnBjKSkge1xuICAgICAgcmdiQnVmID0gY29tcHM7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMubnVtQ29tcHMgPT09IDEgJiZcbiAgICAgIGNvdW50ID4gbnVtQ29tcG9uZW50Q29sb3JzICYmXG4gICAgICB0aGlzLm5hbWUgIT09IFwiRGV2aWNlR3JheVwiICYmXG4gICAgICB0aGlzLm5hbWUgIT09IFwiRGV2aWNlUkdCXCJcbiAgICApIHtcbiAgICAgIC8vIE9wdGltaXphdGlvbjogY3JlYXRlIGEgY29sb3IgbWFwIHdoZW4gdGhlcmUgaXMganVzdCBvbmUgY29tcG9uZW50IGFuZFxuICAgICAgLy8gd2UgYXJlIGNvbnZlcnRpbmcgbW9yZSBjb2xvcnMgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLiBXZVxuICAgICAgLy8gZG9uJ3QgYnVpbGQgdGhlIG1hcCBpZiB0aGUgY29sb3JzcGFjZSBpcyBncmF5IG9yIHJnYiBzaW5jZSB0aG9zZVxuICAgICAgLy8gbWV0aG9kcyBhcmUgZmFzdGVyIHRoYW4gYnVpbGRpbmcgYSBtYXAuIFRoaXMgbWFpbmx5IG9mZmVycyBiaWcgc3BlZWRcbiAgICAgIC8vIHVwcyBmb3IgaW5kZXhlZCBhbmQgYWx0ZXJuYXRlIGNvbG9yc3BhY2VzLlxuICAgICAgLy9cbiAgICAgIC8vIFRPRE8gaXQgbWF5IGJlIHdvcnRoIHdoaWxlIHRvIGNhY2hlIHRoZSBjb2xvciBtYXAuIFdoaWxlIHJ1bm5pbmdcbiAgICAgIC8vIHRlc3RpbmcgSSBuZXZlciBoaXQgYSBjYWNoZSBzbyBJIHdpbGwgbGVhdmUgdGhhdCBvdXQgZm9yIG5vdyAocGVyaGFwc1xuICAgICAgLy8gd2UgYXJlIHJlcGFyc2luZyBjb2xvcnNwYWNlcyB0b28gbXVjaD8pLlxuICAgICAgY29uc3QgYWxsQ29sb3JzID1cbiAgICAgICAgYnBjIDw9IDhcbiAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KG51bUNvbXBvbmVudENvbG9ycylcbiAgICAgICAgICA6IG5ldyBVaW50MTZBcnJheShudW1Db21wb25lbnRDb2xvcnMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRDb2xvcnM7IGkrKykge1xuICAgICAgICBhbGxDb2xvcnNbaV0gPSBpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sb3JNYXAgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobnVtQ29tcG9uZW50Q29sb3JzICogMyk7XG4gICAgICB0aGlzLmdldFJnYkJ1ZmZlcihcbiAgICAgICAgYWxsQ29sb3JzLFxuICAgICAgICAwLFxuICAgICAgICBudW1Db21wb25lbnRDb2xvcnMsXG4gICAgICAgIGNvbG9yTWFwLFxuICAgICAgICAwLFxuICAgICAgICBicGMsXG4gICAgICAgIC8qIGFscGhhMDEgPSAqLyAwXG4gICAgICApO1xuXG4gICAgICBpZiAoIW5lZWRzUmVzaXppbmcpIHtcbiAgICAgICAgLy8gRmlsbCBpbiB0aGUgUkdCIHZhbHVlcyBkaXJlY3RseSBpbnRvIHxkZXN0fC5cbiAgICAgICAgbGV0IGRlc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBjb21wc1tpXSAqIDM7XG4gICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gY29sb3JNYXBba2V5XTtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAyXTtcbiAgICAgICAgICBkZXN0UG9zICs9IGFscGhhMDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OEFycmF5KGNvdW50ICogMyk7XG4gICAgICAgIGxldCByZ2JQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBjb21wc1tpXSAqIDM7XG4gICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleV07XG4gICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleSArIDFdO1xuICAgICAgICAgIHJnYkJ1ZltyZ2JQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW5lZWRzUmVzaXppbmcpIHtcbiAgICAgICAgLy8gRmlsbCBpbiB0aGUgUkdCIHZhbHVlcyBkaXJlY3RseSBpbnRvIHxkZXN0fC5cbiAgICAgICAgdGhpcy5nZXRSZ2JCdWZmZXIoXG4gICAgICAgICAgY29tcHMsXG4gICAgICAgICAgMCxcbiAgICAgICAgICB3aWR0aCAqIGFjdHVhbEhlaWdodCxcbiAgICAgICAgICBkZXN0LFxuICAgICAgICAgIDAsXG4gICAgICAgICAgYnBjLFxuICAgICAgICAgIGFscGhhMDFcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShjb3VudCAqIDMpO1xuICAgICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgY291bnQsIHJnYkJ1ZiwgMCwgYnBjLCAvKiBhbHBoYTAxID0gKi8gMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJnYkJ1Zikge1xuICAgICAgaWYgKG5lZWRzUmVzaXppbmcpIHtcbiAgICAgICAgcmVzaXplUmdiSW1hZ2UoXG4gICAgICAgICAgcmdiQnVmLFxuICAgICAgICAgIGRlc3QsXG4gICAgICAgICAgb3JpZ2luYWxXaWR0aCxcbiAgICAgICAgICBvcmlnaW5hbEhlaWdodCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgYWxwaGEwMVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGRlc3RQb3MgPSAwLFxuICAgICAgICAgIHJnYlBvcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107XG4gICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdO1xuICAgICAgICAgIGRlc3RQb3MgKz0gYWxwaGEwMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIGlmIHRoZSBjb2xvcnNwYWNlIGhhcyBjb21wb25lbnRzIGluIHRoZSBkZWZhdWx0IHJhbmdlIG9mIFswLCAxXS5cbiAgICogVGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IgYWxsIGNvbG9yc3BhY2VzIGV4Y2VwdCBmb3IgbGFiIGNvbG9yIHNwYWNlc1xuICAgKiB3aGljaCBhcmUgWzAsMTAwXSwgWy0xMjgsIDEyN10sIFstMTI4LCAxMjddLlxuICAgKi9cbiAgZ2V0IHVzZXNaZXJvVG9PbmVSYW5nZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidXNlc1plcm9Ub09uZVJhbmdlXCIsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgX2NhY2hlKGNhY2hlS2V5LCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSkge1xuICAgIGlmICghbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgXCJsb2NhbENvbG9yU3BhY2VDYWNoZVwiIGFyZ3VtZW50LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkQ29sb3JTcGFjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCBcInBhcnNlZENvbG9yU3BhY2VcIiBhcmd1bWVudC4nXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgY3NOYW1lLCBjc1JlZjtcbiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgIGNzUmVmID0gY2FjaGVLZXk7XG5cbiAgICAgIC8vIElmIHBhcnNpbmcgc3VjY2VlZGVkLCB3ZSBrbm93IHRoYXQgdGhpcyBjYWxsIGNhbm5vdCB0aHJvdy5cbiAgICAgIGNhY2hlS2V5ID0geHJlZi5mZXRjaChjYWNoZUtleSk7XG4gICAgfVxuICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIE5hbWUpIHtcbiAgICAgIGNzTmFtZSA9IGNhY2hlS2V5Lm5hbWU7XG4gICAgfVxuICAgIGlmIChjc05hbWUgfHwgY3NSZWYpIHtcbiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLnNldChjc05hbWUsIGNzUmVmLCBwYXJzZWRDb2xvclNwYWNlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0Q2FjaGVkKGNhY2hlS2V5LCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkge1xuICAgIGlmICghbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NvbG9yU3BhY2UuZ2V0Q2FjaGVkIC0gZXhwZWN0ZWQgXCJsb2NhbENvbG9yU3BhY2VDYWNoZVwiIGFyZ3VtZW50LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgY29uc3QgbG9jYWxDb2xvclNwYWNlID0gbG9jYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlSZWYoY2FjaGVLZXkpO1xuICAgICAgaWYgKGxvY2FsQ29sb3JTcGFjZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxDb2xvclNwYWNlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjYWNoZUtleSA9IHhyZWYuZmV0Y2goY2FjaGVLZXkpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbnkgZXJyb3JzIHNob3VsZCBiZSBoYW5kbGVkIGR1cmluZyBwYXJzaW5nLCByYXRoZXIgdGhhbiBoZXJlLlxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBOYW1lKSB7XG4gICAgICBjb25zdCBsb2NhbENvbG9yU3BhY2UgPSBsb2NhbENvbG9yU3BhY2VDYWNoZS5nZXRCeU5hbWUoY2FjaGVLZXkubmFtZSk7XG4gICAgICBpZiAobG9jYWxDb2xvclNwYWNlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbENvbG9yU3BhY2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBhcnNlQXN5bmMoe1xuICAgIGNzLFxuICAgIHhyZWYsXG4gICAgcmVzb3VyY2VzID0gbnVsbCxcbiAgICBwZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIH0pIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgICF0aGlzLmdldENhY2hlZChjcywgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpLFxuICAgICAgICBcIkV4cGVjdGVkIGBDb2xvclNwYWNlLmdldENhY2hlZGAgdG8gaGF2ZSBiZWVuIG1hbnVhbGx5IGNoZWNrZWQgXCIgK1xuICAgICAgICAgIFwiYmVmb3JlIGNhbGxpbmcgYENvbG9yU3BhY2UucGFyc2VBc3luY2AuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZENvbG9yU3BhY2UgPSB0aGlzLl9wYXJzZShcbiAgICAgIGNzLFxuICAgICAgeHJlZixcbiAgICAgIHJlc291cmNlcyxcbiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeVxuICAgICk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGNhY2hlIHRoZSBwYXJzZWQgQ29sb3JTcGFjZSwgYnkgbmFtZSBhbmQvb3IgcmVmZXJlbmNlLlxuICAgIHRoaXMuX2NhY2hlKGNzLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSk7XG5cbiAgICByZXR1cm4gcGFyc2VkQ29sb3JTcGFjZTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZSh7XG4gICAgY3MsXG4gICAgeHJlZixcbiAgICByZXNvdXJjZXMgPSBudWxsLFxuICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgfSkge1xuICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSB0aGlzLmdldENhY2hlZChjcywgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpO1xuICAgIGlmIChjYWNoZWRDb2xvclNwYWNlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkQ29sb3JTcGFjZTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkQ29sb3JTcGFjZSA9IHRoaXMuX3BhcnNlKFxuICAgICAgY3MsXG4gICAgICB4cmVmLFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5XG4gICAgKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gY2FjaGUgdGhlIHBhcnNlZCBDb2xvclNwYWNlLCBieSBuYW1lIGFuZC9vciByZWZlcmVuY2UuXG4gICAgdGhpcy5fY2FjaGUoY3MsIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKTtcblxuICAgIHJldHVybiBwYXJzZWRDb2xvclNwYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgX3BhcnNlKGNzLCB4cmVmLCByZXNvdXJjZXMgPSBudWxsLCBwZGZGdW5jdGlvbkZhY3RvcnkpIHtcbiAgICBjcyA9IHhyZWYuZmV0Y2hJZlJlZihjcyk7XG4gICAgaWYgKGlzTmFtZShjcykpIHtcbiAgICAgIHN3aXRjaCAoY3MubmFtZSkge1xuICAgICAgICBjYXNlIFwiRGV2aWNlR3JheVwiOlxuICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtcbiAgICAgICAgY2FzZSBcIkRldmljZVJHQlwiOlxuICAgICAgICBjYXNlIFwiUkdCXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5yZ2I7XG4gICAgICAgIGNhc2UgXCJEZXZpY2VDTVlLXCI6XG4gICAgICAgIGNhc2UgXCJDTVlLXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKC8qIGJhc2VDUyA9ICovIG51bGwpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChpc0RpY3QocmVzb3VyY2VzKSkge1xuICAgICAgICAgICAgY29uc3QgY29sb3JTcGFjZXMgPSByZXNvdXJjZXMuZ2V0KFwiQ29sb3JTcGFjZVwiKTtcbiAgICAgICAgICAgIGlmIChpc0RpY3QoY29sb3JTcGFjZXMpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlc0NTID0gY29sb3JTcGFjZXMuZ2V0KGNzLm5hbWUpO1xuICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzQ1MpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYW1lKHJlc291cmNlc0NTKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlKFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNDUyxcbiAgICAgICAgICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnlcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNzID0gcmVzb3VyY2VzQ1M7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnJlY29nbml6ZWQgQ29sb3JTcGFjZTogJHtjcy5uYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjcykpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB4cmVmLmZldGNoSWZSZWYoY3NbMF0pLm5hbWU7XG4gICAgICBsZXQgcGFyYW1zLCBudW1Db21wcywgYmFzZUNTLCB3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYTtcblxuICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgIGNhc2UgXCJEZXZpY2VHcmF5XCI6XG4gICAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5O1xuICAgICAgICBjYXNlIFwiRGV2aWNlUkdCXCI6XG4gICAgICAgIGNhc2UgXCJSR0JcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtcbiAgICAgICAgY2FzZSBcIkRldmljZUNNWUtcIjpcbiAgICAgICAgY2FzZSBcIkNNWUtcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7XG4gICAgICAgIGNhc2UgXCJDYWxHcmF5XCI6XG4gICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTtcbiAgICAgICAgICB3aGl0ZVBvaW50ID0gcGFyYW1zLmdldEFycmF5KFwiV2hpdGVQb2ludFwiKTtcbiAgICAgICAgICBibGFja1BvaW50ID0gcGFyYW1zLmdldEFycmF5KFwiQmxhY2tQb2ludFwiKTtcbiAgICAgICAgICBnYW1tYSA9IHBhcmFtcy5nZXQoXCJHYW1tYVwiKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENhbEdyYXlDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSk7XG4gICAgICAgIGNhc2UgXCJDYWxSR0JcIjpcbiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pO1xuICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoXCJXaGl0ZVBvaW50XCIpO1xuICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoXCJCbGFja1BvaW50XCIpO1xuICAgICAgICAgIGdhbW1hID0gcGFyYW1zLmdldEFycmF5KFwiR2FtbWFcIik7XG4gICAgICAgICAgY29uc3QgbWF0cml4ID0gcGFyYW1zLmdldEFycmF5KFwiTWF0cml4XCIpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ2FsUkdCQ1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEsIG1hdHJpeCk7XG4gICAgICAgIGNhc2UgXCJJQ0NCYXNlZFwiOlxuICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7XG4gICAgICAgICAgY29uc3QgZGljdCA9IHN0cmVhbS5kaWN0O1xuICAgICAgICAgIG51bUNvbXBzID0gZGljdC5nZXQoXCJOXCIpO1xuICAgICAgICAgIGNvbnN0IGFsdCA9IGRpY3QuZ2V0KFwiQWx0ZXJuYXRlXCIpO1xuICAgICAgICAgIGlmIChhbHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsdENTID0gdGhpcy5fcGFyc2UoYWx0LCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7XG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgYXJlIGNvcnJlY3QsXG4gICAgICAgICAgICAvLyBhbmQgYWxzbyAoaW5kaXJlY3RseSkgdGhhdCBpdCBpcyBub3QgYSBQYXR0ZXJuQ1MuXG4gICAgICAgICAgICBpZiAoYWx0Q1MubnVtQ29tcHMgPT09IG51bUNvbXBzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhbHRDUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhcm4oXCJJQ0NCYXNlZCBjb2xvciBzcGFjZTogSWdub3JpbmcgaW5jb3JyZWN0IC9BbHRlcm5hdGUgZW50cnkuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVtQ29tcHMgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtcbiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSA0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICAgIGJhc2VDUyA9IGNzWzFdIHx8IG51bGw7XG4gICAgICAgICAgaWYgKGJhc2VDUykge1xuICAgICAgICAgICAgYmFzZUNTID0gdGhpcy5fcGFyc2UoYmFzZUNTLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKGJhc2VDUyk7XG4gICAgICAgIGNhc2UgXCJJbmRleGVkXCI6XG4gICAgICAgIGNhc2UgXCJJXCI6XG4gICAgICAgICAgYmFzZUNTID0gdGhpcy5fcGFyc2UoY3NbMV0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTtcbiAgICAgICAgICBjb25zdCBoaVZhbCA9IHhyZWYuZmV0Y2hJZlJlZihjc1syXSkgKyAxO1xuICAgICAgICAgIGNvbnN0IGxvb2t1cCA9IHhyZWYuZmV0Y2hJZlJlZihjc1szXSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBJbmRleGVkQ1MoYmFzZUNTLCBoaVZhbCwgbG9va3VwKTtcbiAgICAgICAgY2FzZSBcIlNlcGFyYXRpb25cIjpcbiAgICAgICAgY2FzZSBcIkRldmljZU5cIjpcbiAgICAgICAgICBjb25zdCBuYW1lID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTtcbiAgICAgICAgICBudW1Db21wcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lLmxlbmd0aCA6IDE7XG4gICAgICAgICAgYmFzZUNTID0gdGhpcy5fcGFyc2UoY3NbMl0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTtcbiAgICAgICAgICBjb25zdCB0aW50Rm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGNzWzNdKTtcbiAgICAgICAgICByZXR1cm4gbmV3IEFsdGVybmF0ZUNTKG51bUNvbXBzLCBiYXNlQ1MsIHRpbnRGbik7XG4gICAgICAgIGNhc2UgXCJMYWJcIjpcbiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pO1xuICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoXCJXaGl0ZVBvaW50XCIpO1xuICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoXCJCbGFja1BvaW50XCIpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlID0gcGFyYW1zLmdldEFycmF5KFwiUmFuZ2VcIik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBMYWJDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbmltcGxlbWVudGVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke21vZGV9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke2NzfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRlY29kZSBtYXAgbWF0Y2hlcyB0aGUgZGVmYXVsdCBkZWNvZGUgbWFwIGZvciBhIGNvbG9yIHNwYWNlLlxuICAgKiBUaGlzIGhhbmRsZXMgdGhlIGdlbmVyYWwgZGVjb2RlIG1hcHMgd2hlcmUgdGhlcmUgYXJlIHR3byB2YWx1ZXMgcGVyXG4gICAqIGNvbXBvbmVudCwgZS5nLiBbMCwgMSwgMCwgMSwgMCwgMV0gZm9yIGEgUkdCIGNvbG9yLlxuICAgKiBUaGlzIGRvZXMgbm90IGhhbmRsZSBMYWIsIEluZGV4ZWQsIG9yIFBhdHRlcm4gZGVjb2RlIG1hcHMgc2luY2UgdGhleSBhcmVcbiAgICogc2xpZ2h0bHkgZGlmZmVyZW50LlxuICAgKiBAcGFyYW0ge0FycmF5fSBkZWNvZGUgLSBEZWNvZGUgbWFwICh1c3VhbGx5IGZyb20gYW4gaW1hZ2UpLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtQ29tcHMgLSBOdW1iZXIgb2YgY29tcG9uZW50cyB0aGUgY29sb3Igc3BhY2UgaGFzLlxuICAgKi9cbiAgc3RhdGljIGlzRGVmYXVsdERlY29kZShkZWNvZGUsIG51bUNvbXBzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobnVtQ29tcHMgKiAyICE9PSBkZWNvZGUubGVuZ3RoKSB7XG4gICAgICB3YXJuKFwiVGhlIGRlY29kZSBtYXAgaXMgbm90IHRoZSBjb3JyZWN0IGxlbmd0aFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkZWNvZGUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgaWYgKGRlY29kZVtpXSAhPT0gMCB8fCBkZWNvZGVbaSArIDFdICE9PSAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHNpbmdsZXRvbnMoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInNpbmdsZXRvbnNcIiwge1xuICAgICAgZ2V0IGdyYXkoKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJncmF5XCIsIG5ldyBEZXZpY2VHcmF5Q1MoKSk7XG4gICAgICB9LFxuICAgICAgZ2V0IHJnYigpIHtcbiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInJnYlwiLCBuZXcgRGV2aWNlUmdiQ1MoKSk7XG4gICAgICB9LFxuICAgICAgZ2V0IGNteWsoKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJjbXlrXCIsIG5ldyBEZXZpY2VDbXlrQ1MoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQWx0ZXJuYXRlIGNvbG9yIHNwYWNlIGhhbmRsZXMgYm90aCBTZXBhcmF0aW9uIGFuZCBEZXZpY2VOIGNvbG9yIHNwYWNlcy4gIEFcbiAqIFNlcGFyYXRpb24gY29sb3Igc3BhY2UgaXMgYWN0dWFsbHkganVzdCBhIERldmljZU4gd2l0aCBvbmUgY29sb3IgY29tcG9uZW50LlxuICogQm90aCBjb2xvciBzcGFjZXMgdXNlIGEgdGludGluZyBmdW5jdGlvbiB0byBjb252ZXJ0IGNvbG9ycyB0byBhIGJhc2UgY29sb3JcbiAqIHNwYWNlLlxuICpcbiAqIFRoZSBkZWZhdWx0IGNvbG9yIGlzIGBuZXcgRmxvYXQzMkFycmF5KG5ldyBBcnJheShudW1Db21wcykuZmlsbCgxKSlgLlxuICovXG5jbGFzcyBBbHRlcm5hdGVDUyBleHRlbmRzIENvbG9yU3BhY2Uge1xuICBjb25zdHJ1Y3RvcihudW1Db21wcywgYmFzZSwgdGludEZuKSB7XG4gICAgc3VwZXIoXCJBbHRlcm5hdGVcIiwgbnVtQ29tcHMpO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy50aW50Rm4gPSB0aW50Rm47XG4gICAgdGhpcy50bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KGJhc2UubnVtQ29tcHMpO1xuICB9XG5cbiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnQWx0ZXJuYXRlQ1MuZ2V0UmdiSXRlbTogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB0bXBCdWYgPSB0aGlzLnRtcEJ1ZjtcbiAgICB0aGlzLnRpbnRGbihzcmMsIHNyY09mZnNldCwgdG1wQnVmLCAwKTtcbiAgICB0aGlzLmJhc2UuZ2V0UmdiSXRlbSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpO1xuICB9XG5cbiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnQWx0ZXJuYXRlQ1MuZ2V0UmdiQnVmZmVyOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHRpbnRGbiA9IHRoaXMudGludEZuO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7XG4gICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7XG4gICAgY29uc3QgYmFzZU51bUNvbXBzID0gYmFzZS5udW1Db21wcztcbiAgICBjb25zdCB1c2VzWmVyb1RvT25lUmFuZ2UgPSBiYXNlLnVzZXNaZXJvVG9PbmVSYW5nZTtcbiAgICBjb25zdCBpc1Bhc3N0aHJvdWdoID1cbiAgICAgIChiYXNlLmlzUGFzc3Rocm91Z2goOCkgfHwgIXVzZXNaZXJvVG9PbmVSYW5nZSkgJiYgYWxwaGEwMSA9PT0gMDtcbiAgICBsZXQgcG9zID0gaXNQYXNzdGhyb3VnaCA/IGRlc3RPZmZzZXQgOiAwO1xuICAgIGNvbnN0IGJhc2VCdWYgPSBpc1Bhc3N0aHJvdWdoXG4gICAgICA/IGRlc3RcbiAgICAgIDogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJhc2VOdW1Db21wcyAqIGNvdW50KTtcbiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7XG5cbiAgICBjb25zdCBzY2FsZWQgPSBuZXcgRmxvYXQzMkFycmF5KG51bUNvbXBzKTtcbiAgICBjb25zdCB0aW50ZWQgPSBuZXcgRmxvYXQzMkFycmF5KGJhc2VOdW1Db21wcyk7XG4gICAgbGV0IGksIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgZm9yIChqID0gMDsgaiA8IG51bUNvbXBzOyBqKyspIHtcbiAgICAgICAgc2NhbGVkW2pdID0gc3JjW3NyY09mZnNldCsrXSAqIHNjYWxlO1xuICAgICAgfVxuICAgICAgdGludEZuKHNjYWxlZCwgMCwgdGludGVkLCAwKTtcbiAgICAgIGlmICh1c2VzWmVyb1RvT25lUmFuZ2UpIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGJhc2VOdW1Db21wczsgaisrKSB7XG4gICAgICAgICAgYmFzZUJ1Zltwb3MrK10gPSB0aW50ZWRbal0gKiAyNTU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2UuZ2V0UmdiSXRlbSh0aW50ZWQsIDAsIGJhc2VCdWYsIHBvcyk7XG4gICAgICAgIHBvcyArPSBiYXNlTnVtQ29tcHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc1Bhc3N0aHJvdWdoKSB7XG4gICAgICBiYXNlLmdldFJnYkJ1ZmZlcihiYXNlQnVmLCAwLCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoXG4gICAgICAoaW5wdXRMZW5ndGggKiB0aGlzLmJhc2UubnVtQ29tcHMpIC8gdGhpcy5udW1Db21wcyxcbiAgICAgIGFscGhhMDFcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2Uge1xuICBjb25zdHJ1Y3RvcihiYXNlQ1MpIHtcbiAgICBzdXBlcihcIlBhdHRlcm5cIiwgbnVsbCk7XG4gICAgdGhpcy5iYXNlID0gYmFzZUNTO1xuICB9XG5cbiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgUGF0dGVybkNTLmlzRGVmYXVsdERlY29kZVwiKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGNvbG9yIGlzIGBuZXcgVWludDhBcnJheShbMF0pYC5cbiAqL1xuY2xhc3MgSW5kZXhlZENTIGV4dGVuZHMgQ29sb3JTcGFjZSB7XG4gIGNvbnN0cnVjdG9yKGJhc2UsIGhpZ2hWYWwsIGxvb2t1cCkge1xuICAgIHN1cGVyKFwiSW5kZXhlZFwiLCAxKTtcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMuaGlnaFZhbCA9IGhpZ2hWYWw7XG5cbiAgICBjb25zdCBsZW5ndGggPSBiYXNlLm51bUNvbXBzICogaGlnaFZhbDtcbiAgICB0aGlzLmxvb2t1cCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG5cbiAgICBpZiAoaXNTdHJlYW0obG9va3VwKSkge1xuICAgICAgY29uc3QgYnl0ZXMgPSBsb29rdXAuZ2V0Qnl0ZXMobGVuZ3RoKTtcbiAgICAgIHRoaXMubG9va3VwLnNldChieXRlcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbG9va3VwID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIHRoaXMubG9va3VwW2ldID0gbG9va3VwLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICR7bG9va3VwfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ0luZGV4ZWRDUy5nZXRSZ2JJdGVtOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5iYXNlLm51bUNvbXBzO1xuICAgIGNvbnN0IHN0YXJ0ID0gc3JjW3NyY09mZnNldF0gKiBudW1Db21wcztcbiAgICB0aGlzLmJhc2UuZ2V0UmdiQnVmZmVyKHRoaXMubG9va3VwLCBzdGFydCwgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgMCk7XG4gIH1cblxuICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBkZXN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICdJbmRleGVkQ1MuZ2V0UmdiQnVmZmVyOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7XG4gICAgY29uc3QgbnVtQ29tcHMgPSBiYXNlLm51bUNvbXBzO1xuICAgIGNvbnN0IG91dHB1dERlbHRhID0gYmFzZS5nZXRPdXRwdXRMZW5ndGgobnVtQ29tcHMsIGFscGhhMDEpO1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBsb29rdXBQb3MgPSBzcmNbc3JjT2Zmc2V0KytdICogbnVtQ29tcHM7XG4gICAgICBiYXNlLmdldFJnYkJ1ZmZlcihsb29rdXAsIGxvb2t1cFBvcywgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7XG4gICAgICBkZXN0T2Zmc2V0ICs9IG91dHB1dERlbHRhO1xuICAgIH1cbiAgfVxuXG4gIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkge1xuICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoICogdGhpcy5iYXNlLm51bUNvbXBzLCBhbHBoYTAxKTtcbiAgfVxuXG4gIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNvZGVNYXApKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRlY29kZU1hcC5sZW5ndGggIT09IDIpIHtcbiAgICAgIHdhcm4oXCJEZWNvZGUgbWFwIGxlbmd0aCBpcyBub3QgY29ycmVjdFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYnBjKSB8fCBicGMgPCAxKSB7XG4gICAgICB3YXJuKFwiQml0cyBwZXIgY29tcG9uZW50IGlzIG5vdCBjb3JyZWN0XCIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVNYXBbMF0gPT09IDAgJiYgZGVjb2RlTWFwWzFdID09PSAoMSA8PCBicGMpIC0gMTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGNvbG9yIGlzIGBuZXcgRmxvYXQzMkFycmF5KFswXSlgLlxuICovXG5jbGFzcyBEZXZpY2VHcmF5Q1MgZXh0ZW5kcyBDb2xvclNwYWNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJEZXZpY2VHcmF5XCIsIDEpO1xuICB9XG5cbiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnRGV2aWNlR3JheUNTLmdldFJnYkl0ZW06IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYyA9IHNyY1tzcmNPZmZzZXRdICogMjU1O1xuICAgIGRlc3RbZGVzdE9mZnNldF0gPSBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IGRlc3RbZGVzdE9mZnNldCArIDJdID0gYztcbiAgfVxuXG4gIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ0RldmljZUdyYXlDUy5nZXRSZ2JCdWZmZXI6IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYml0cykgLSAxKTtcbiAgICBsZXQgaiA9IHNyY09mZnNldCxcbiAgICAgIHEgPSBkZXN0T2Zmc2V0O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgY29uc3QgYyA9IHNjYWxlICogc3JjW2orK107XG4gICAgICBkZXN0W3ErK10gPSBjO1xuICAgICAgZGVzdFtxKytdID0gYztcbiAgICAgIGRlc3RbcSsrXSA9IGM7XG4gICAgICBxICs9IGFscGhhMDE7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7XG4gICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGNvbG9yIGlzIGBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAwXSlgLlxuICovXG5jbGFzcyBEZXZpY2VSZ2JDUyBleHRlbmRzIENvbG9yU3BhY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIkRldmljZVJHQlwiLCAzKTtcbiAgfVxuXG4gIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ0RldmljZVJnYkNTLmdldFJnYkl0ZW06IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHNyY1tzcmNPZmZzZXRdICogMjU1O1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gc3JjW3NyY09mZnNldCArIDFdICogMjU1O1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc3JjW3NyY09mZnNldCArIDJdICogMjU1O1xuICB9XG5cbiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnRGV2aWNlUmdiQ1MuZ2V0UmdiQnVmZmVyOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChiaXRzID09PSA4ICYmIGFscGhhMDEgPT09IDApIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50ICogMyksIGRlc3RPZmZzZXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZSA9IDI1NSAvICgoMSA8PCBiaXRzKSAtIDEpO1xuICAgIGxldCBqID0gc3JjT2Zmc2V0LFxuICAgICAgcSA9IGRlc3RPZmZzZXQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICBkZXN0W3ErK10gPSBzY2FsZSAqIHNyY1tqKytdO1xuICAgICAgZGVzdFtxKytdID0gc2NhbGUgKiBzcmNbaisrXTtcbiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107XG4gICAgICBxICs9IGFscGhhMDE7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7XG4gICAgcmV0dXJuICgoaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpKSAvIDMpIHwgMDtcbiAgfVxuXG4gIGlzUGFzc3Rocm91Z2goYml0cykge1xuICAgIHJldHVybiBiaXRzID09PSA4O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgY29sb3IgaXMgYG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDAsIDFdKWAuXG4gKi9cbmNvbnN0IERldmljZUNteWtDUyA9IChmdW5jdGlvbiBEZXZpY2VDbXlrQ1NDbG9zdXJlKCkge1xuICAvLyBUaGUgY29lZmZpY2llbnRzIGJlbG93IHdhcyBmb3VuZCB1c2luZyBudW1lcmljYWwgYW5hbHlzaXM6IHRoZSBtZXRob2Qgb2ZcbiAgLy8gc3RlZXBlc3QgZGVzY2VudCBmb3IgdGhlIHN1bSgoZl9pIC0gY29sb3JfdmFsdWVfaSleMikgZm9yIHIvZy9iIGNvbG9ycyxcbiAgLy8gd2hlcmUgY29sb3JfdmFsdWUgaXMgdGhlIHRhYnVsYXIgdmFsdWUgZnJvbSB0aGUgdGFibGUgb2Ygc2FtcGxlZCBSR0IgY29sb3JzXG4gIC8vIGZyb20gQ01ZSyBVUyBXZWIgQ29hdGVkIChTV09QKSBjb2xvcnNwYWNlLCBhbmQgZl9pIGlzIHRoZSBjb3JyZXNwb25kaW5nXG4gIC8vIENNWUsgY29sb3IgY29udmVyc2lvbiB1c2luZyB0aGUgZXN0aW1hdGlvbiBiZWxvdzpcbiAgLy8gICBmKEEsIEIsLi4gTikgPSBBY2MrQmNtK0NjeStEY2srYytGbW0rR215K0htaytJbStKeXkrS3lrK0x5K01raytOaysyNTVcbiAgZnVuY3Rpb24gY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzcmNTY2FsZSwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgIGNvbnN0IGMgPSBzcmNbc3JjT2Zmc2V0XSAqIHNyY1NjYWxlO1xuICAgIGNvbnN0IG0gPSBzcmNbc3JjT2Zmc2V0ICsgMV0gKiBzcmNTY2FsZTtcbiAgICBjb25zdCB5ID0gc3JjW3NyY09mZnNldCArIDJdICogc3JjU2NhbGU7XG4gICAgY29uc3QgayA9IHNyY1tzcmNPZmZzZXQgKyAzXSAqIHNyY1NjYWxlO1xuXG4gICAgZGVzdFtkZXN0T2Zmc2V0XSA9XG4gICAgICAyNTUgK1xuICAgICAgYyAqXG4gICAgICAgICgtNC4zODczMzIzODQ2MDk5ODggKiBjICtcbiAgICAgICAgICA1NC40ODYxNTE5NDE4OTE3NiAqIG0gK1xuICAgICAgICAgIDE4LjgyMjkwNTAyMTY1MzAyICogeSArXG4gICAgICAgICAgMjEyLjI1NjYyNDUxNjM5NTg1ICogayArXG4gICAgICAgICAgLTI4NS4yMzMxMDI2MTM3MDA0KSArXG4gICAgICBtICpcbiAgICAgICAgKDEuNzE0OTc2MzQ3NzM2MjEzNCAqIG0gLVxuICAgICAgICAgIDUuNjA5NjczNjkwNDA0NzMxNSAqIHkgK1xuICAgICAgICAgIC0xNy44NzM4NzA4NjE0MTU0NDQgKiBrIC1cbiAgICAgICAgICA1LjQ5NzAwNjQyNzE5NjM2NikgK1xuICAgICAgeSAqXG4gICAgICAgICgtMi41MjE3MzQwMTMxNjgzMDMzICogeSAtIDIxLjI0ODkyMzMzNzM1MzA3MyAqIGsgKyAxNy41MTE5MjcwODQxODEzKSArXG4gICAgICBrICogKC0yMS44NjEyMjE0NzQ2MzYwNSAqIGsgLSAxODkuNDgxODA4MzU5MjI3NDcpO1xuXG4gICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPVxuICAgICAgMjU1ICtcbiAgICAgIGMgKlxuICAgICAgICAoOC44NDEwNDE0MjIwMzYxNDkgKiBjICtcbiAgICAgICAgICA2MC4xMTgwMjcwNDU1OTczNjYgKiBtICtcbiAgICAgICAgICA2Ljg3MTQyNTU5MjA0OTAwNyAqIHkgK1xuICAgICAgICAgIDMxLjE1OTEwMDEzMDA1NTkyMiAqIGsgK1xuICAgICAgICAgIC03OS4yOTcwODQ0ODE2NTQ4KSArXG4gICAgICBtICpcbiAgICAgICAgKC0xNS4zMTAzNjEzMDY5Njc4MTcgKiBtICtcbiAgICAgICAgICAxNy41NzUyNTEyNjExMDk0ODIgKiB5ICtcbiAgICAgICAgICAxMzEuMzUyNTA5MTI0OTM5NzYgKiBrIC1cbiAgICAgICAgICAxOTAuOTQ1MzMwMjU4ODk1MSkgK1xuICAgICAgeSAqICg0LjQ0NDMzOTEwMjg1MjczOSAqIHkgKyA5Ljg2MzI4NjE0OTM0MDUgKiBrIC0gMjQuODY3NDE1ODI1NTU4NzgpICtcbiAgICAgIGsgKiAoLTIwLjczNzMyNTQ3MTE4MTAzNCAqIGsgLSAxODcuODA0NTM3MDk3MTk1NzgpO1xuXG4gICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPVxuICAgICAgMjU1ICtcbiAgICAgIGMgKlxuICAgICAgICAoMC44ODQyNTIyNDMwMDAzMjk2ICogYyArXG4gICAgICAgICAgOC4wNzg2Nzc1MDMxMTI5MjggKiBtICtcbiAgICAgICAgICAzMC44OTk3ODMwOTcwMzcyOSAqIHkgLVxuICAgICAgICAgIDAuMjM4ODMyMzg2ODkxNzg5MzQgKiBrICtcbiAgICAgICAgICAtMTQuMTgzNTc2Nzk5NjczMjg2KSArXG4gICAgICBtICpcbiAgICAgICAgKDEwLjQ5NTkzMjczNDMyMDcyICogbSArXG4gICAgICAgICAgNjMuMDIzNzg0OTQ3NTQwNTIgKiB5ICtcbiAgICAgICAgICA1MC42MDY5NTc2NTYzNjA3MzQgKiBrIC1cbiAgICAgICAgICAxMTIuMjM4ODQyNTM3MTkyNDgpICtcbiAgICAgIHkgKlxuICAgICAgICAoMC4wMzI5NjA0MTExNDg3MzIxNyAqIHkgK1xuICAgICAgICAgIDExNS42MDM4NDQ0OTY0NjY0MSAqIGsgK1xuICAgICAgICAgIC0xOTMuNTgyMDkzNTY4NjE1MDUpICtcbiAgICAgIGsgKiAoLTIyLjMzODE2ODA3MzA5ODg2ICogayAtIDE4MC4xMjYxMzk3NDcwODM2Nyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNsYXNzIERldmljZUNteWtDUyBleHRlbmRzIENvbG9yU3BhY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoXCJEZXZpY2VDTVlLXCIsIDQpO1xuICAgIH1cblxuICAgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgICAnRGV2aWNlQ215a0NTLmdldFJnYkl0ZW06IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCAxLCBkZXN0LCBkZXN0T2Zmc2V0KTtcbiAgICB9XG5cbiAgICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBkZXN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICAgJ0RldmljZUNteWtDUy5nZXRSZ2JCdWZmZXI6IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzY2FsZSwgZGVzdCwgZGVzdE9mZnNldCk7XG4gICAgICAgIHNyY09mZnNldCArPSA0O1xuICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkge1xuICAgICAgcmV0dXJuICgoaW5wdXRMZW5ndGggLyA0KSAqICgzICsgYWxwaGEwMSkpIHwgMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERldmljZUNteWtDUztcbn0pKCk7XG5cbi8qKlxuICogQ2FsR3JheUNTOiBCYXNlZCBvbiBcIlBERiBSZWZlcmVuY2UsIFNpeHRoIEVkXCIsIHAuMjQ1XG4gKlxuICogVGhlIGRlZmF1bHQgY29sb3IgaXMgYG5ldyBGbG9hdDMyQXJyYXkoWzBdKWAuXG4gKi9cbmNvbnN0IENhbEdyYXlDUyA9IChmdW5jdGlvbiBDYWxHcmF5Q1NDbG9zdXJlKCkge1xuICBmdW5jdGlvbiBjb252ZXJ0VG9SZ2IoY3MsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSkge1xuICAgIC8vIEEgcmVwcmVzZW50cyBhIGdyYXkgY29tcG9uZW50IG9mIGEgY2FsaWJyYXRlZCBncmF5IHNwYWNlLlxuICAgIC8vIEEgPC0tLT4gQUcgaW4gdGhlIHNwZWNcbiAgICBjb25zdCBBID0gc3JjW3NyY09mZnNldF0gKiBzY2FsZTtcbiAgICBjb25zdCBBRyA9IEEgKiogY3MuRztcblxuICAgIC8vIENvbXB1dGVzIEwgYXMgcGVyIHNwZWMuICggPSBjcy5ZVyAqIEFHIClcbiAgICAvLyBFeGNlcHQgaWYgb3RoZXIgdGhhbiBkZWZhdWx0IEJsYWNrUG9pbnQgdmFsdWVzIGFyZSB1c2VkLlxuICAgIGNvbnN0IEwgPSBjcy5ZVyAqIEFHO1xuICAgIC8vIGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sLCBDaCA0LlxuICAgIC8vIENvbnZlcnQgdmFsdWVzIHRvIHJnYiByYW5nZSBbMCwgMjU1XS5cbiAgICBjb25zdCB2YWwgPSBNYXRoLm1heCgyOTUuOCAqIEwgKiogMC4zMzMzMzMzMzMzMzMzMzMzMzMgLSA0MC44LCAwKTtcbiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gdmFsO1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdmFsO1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gdmFsO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBjbGFzcyBDYWxHcmF5Q1MgZXh0ZW5kcyBDb2xvclNwYWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSkge1xuICAgICAgc3VwZXIoXCJDYWxHcmF5XCIsIDEpO1xuXG4gICAgICBpZiAoIXdoaXRlUG9pbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIFwiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXlcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQgfHwgWzAsIDAsIDBdO1xuICAgICAgZ2FtbWEgPSBnYW1tYSB8fCAxO1xuXG4gICAgICAvLyBUcmFuc2xhdGUgYXJndW1lbnRzIHRvIHNwZWMgdmFyaWFibGVzLlxuICAgICAgdGhpcy5YVyA9IHdoaXRlUG9pbnRbMF07XG4gICAgICB0aGlzLllXID0gd2hpdGVQb2ludFsxXTtcbiAgICAgIHRoaXMuWlcgPSB3aGl0ZVBvaW50WzJdO1xuXG4gICAgICB0aGlzLlhCID0gYmxhY2tQb2ludFswXTtcbiAgICAgIHRoaXMuWUIgPSBibGFja1BvaW50WzFdO1xuICAgICAgdGhpcy5aQiA9IGJsYWNrUG9pbnRbMl07XG5cbiAgICAgIHRoaXMuRyA9IGdhbW1hO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZXMgYXMgcGVyIHNwZWMuXG4gICAgICBpZiAodGhpcy5YVyA8IDAgfHwgdGhpcy5aVyA8IDAgfHwgdGhpcy5ZVyAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAgIFwiLCBubyBmYWxsYmFjayBhdmFpbGFibGVcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5YQiA8IDAgfHwgdGhpcy5ZQiA8IDAgfHwgdGhpcy5aQiA8IDApIHtcbiAgICAgICAgaW5mbyhgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApO1xuICAgICAgICB0aGlzLlhCID0gdGhpcy5ZQiA9IHRoaXMuWkIgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5YQiAhPT0gMCB8fCB0aGlzLllCICE9PSAwIHx8IHRoaXMuWkIgIT09IDApIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgJHt0aGlzLm5hbWV9LCBCbGFja1BvaW50OiBYQjogJHt0aGlzLlhCfSwgWUI6ICR7dGhpcy5ZQn0sIGAgK1xuICAgICAgICAgICAgYFpCOiAke3RoaXMuWkJ9LCBvbmx5IGRlZmF1bHQgdmFsdWVzIGFyZSBzdXBwb3J0ZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5HIDwgMSkge1xuICAgICAgICBpbmZvKFxuICAgICAgICAgIGBJbnZhbGlkIEdhbW1hOiAke3RoaXMuR30gZm9yICR7dGhpcy5uYW1lfSwgYCArXG4gICAgICAgICAgICBcImZhbGxpbmcgYmFjayB0byBkZWZhdWx0LlwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuRyA9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICAgICkge1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAgICdDYWxHcmF5Q1MuZ2V0UmdiSXRlbTogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIDEpO1xuICAgIH1cblxuICAgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgICAnQ2FsR3JheUNTLmdldFJnYkJ1ZmZlcjogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpO1xuICAgICAgICBzcmNPZmZzZXQgKz0gMTtcbiAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHtcbiAgICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBDYWxHcmF5Q1M7XG59KSgpO1xuXG4vKipcbiAqIENhbFJHQkNTOiBCYXNlZCBvbiBcIlBERiBSZWZlcmVuY2UsIFNpeHRoIEVkXCIsIHAuMjQ3XG4gKlxuICogVGhlIGRlZmF1bHQgY29sb3IgaXMgYG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDBdKWAuXG4gKi9cbmNvbnN0IENhbFJHQkNTID0gKGZ1bmN0aW9uIENhbFJHQkNTQ2xvc3VyZSgpIHtcbiAgLy8gU2VlIGh0dHA6Ly93d3cuYnJ1Y2VsaW5kYmxvb20uY29tL2luZGV4Lmh0bWw/RXFuX0Nocm9tQWRhcHQuaHRtbCBmb3IgdGhlc2VcbiAgLy8gbWF0cmljZXMuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBCUkFERk9SRF9TQ0FMRV9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAwLjg5NTEsIDAuMjY2NCwgLTAuMTYxNCxcbiAgICAtMC43NTAyLCAxLjcxMzUsIDAuMDM2NyxcbiAgICAwLjAzODksIC0wLjA2ODUsIDEuMDI5Nl0pO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBCUkFERk9SRF9TQ0FMRV9JTlZFUlNFX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgIDAuOTg2OTkyOSwgLTAuMTQ3MDU0MywgMC4xNTk5NjI3LFxuICAgIDAuNDMyMzA1MywgMC41MTgzNjAzLCAwLjA0OTI5MTIsXG4gICAgLTAuMDA4NTI4NywgMC4wNDAwNDI4LCAwLjk2ODQ4NjddKTtcblxuICAvLyBTZWUgaHR0cDovL3d3dy5icnVjZWxpbmRibG9vbS5jb20vaW5kZXguaHRtbD9FcW5fUkdCX1hZWl9NYXRyaXguaHRtbC5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IFNSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbXG4gICAgMy4yNDA0NTQyLCAtMS41MzcxMzg1LCAtMC40OTg1MzE0LFxuICAgIC0wLjk2OTI2NjAsIDEuODc2MDEwOCwgMC4wNDE1NTYwLFxuICAgIDAuMDU1NjQzNCwgLTAuMjA0MDI1OSwgMS4wNTcyMjUyXSk7XG5cbiAgY29uc3QgRkxBVF9XSElURVBPSU5UX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDFdKTtcblxuICBjb25zdCB0ZW1wTm9ybWFsaXplTWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgY29uc3QgdGVtcENvbnZlcnRNYXRyaXgxID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgY29uc3QgdGVtcENvbnZlcnRNYXRyaXgyID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcblxuICBjb25zdCBERUNPREVfTF9DT05TVEFOVCA9ICgoOCArIDE2KSAvIDExNikgKiogMyAvIDguMDtcblxuICBmdW5jdGlvbiBtYXRyaXhQcm9kdWN0KGEsIGIsIHJlc3VsdCkge1xuICAgIHJlc3VsdFswXSA9IGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbiAgICByZXN1bHRbMV0gPSBhWzNdICogYlswXSArIGFbNF0gKiBiWzFdICsgYVs1XSAqIGJbMl07XG4gICAgcmVzdWx0WzJdID0gYVs2XSAqIGJbMF0gKyBhWzddICogYlsxXSArIGFbOF0gKiBiWzJdO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFRvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIHJlc3VsdCkge1xuICAgIHJlc3VsdFswXSA9IChMTVNbMF0gKiAxKSAvIHNvdXJjZVdoaXRlUG9pbnRbMF07XG4gICAgcmVzdWx0WzFdID0gKExNU1sxXSAqIDEpIC8gc291cmNlV2hpdGVQb2ludFsxXTtcbiAgICByZXN1bHRbMl0gPSAoTE1TWzJdICogMSkgLyBzb3VyY2VXaGl0ZVBvaW50WzJdO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFRvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgcmVzdWx0KSB7XG4gICAgY29uc3QgRDY1WCA9IDAuOTUwNDc7XG4gICAgY29uc3QgRDY1WSA9IDE7XG4gICAgY29uc3QgRDY1WiA9IDEuMDg4ODM7XG5cbiAgICByZXN1bHRbMF0gPSAoTE1TWzBdICogRDY1WCkgLyBzb3VyY2VXaGl0ZVBvaW50WzBdO1xuICAgIHJlc3VsdFsxXSA9IChMTVNbMV0gKiBENjVZKSAvIHNvdXJjZVdoaXRlUG9pbnRbMV07XG4gICAgcmVzdWx0WzJdID0gKExNU1syXSAqIEQ2NVopIC8gc291cmNlV2hpdGVQb2ludFsyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNSR0JUcmFuc2ZlckZ1bmN0aW9uKGNvbG9yKSB7XG4gICAgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1JHQi5cbiAgICBpZiAoY29sb3IgPD0gMC4wMDMxMzA4KSB7XG4gICAgICByZXR1cm4gYWRqdXN0VG9SYW5nZSgwLCAxLCAxMi45MiAqIGNvbG9yKTtcbiAgICB9XG4gICAgLy8gT3B0aW1pemF0aW9uOlxuICAgIC8vIElmIGNvbG9yIGlzIGNsb3NlIGVub3VnaCB0byAxLCBza2lwIGNhbGxpbmcgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1cbiAgICAvLyBzaW5jZSBjYWxsaW5nIE1hdGgucG93IGlzIGV4cGVuc2l2ZS4gSWYgY29sb3IgaXMgbGFyZ2VyIHRoYW5cbiAgICAvLyB0aGUgdGhyZXNob2xkLCB0aGUgZmluYWwgcmVzdWx0IGlzIGxhcmdlciB0aGFuIDI1NC41IHNpbmNlXG4gICAgLy8gKCgxICsgMC4wNTUpICogMC45OTU1NDUyNSAqKiAoMSAvIDIuNCkgLSAwLjA1NSkgKiAyNTUgPT09XG4gICAgLy8gMjU0LjUwMDAwMDAzMTM0Njk5XG4gICAgaWYgKGNvbG9yID49IDAuOTk1NTQ1MjUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gYWRqdXN0VG9SYW5nZSgwLCAxLCAoMSArIDAuMDU1KSAqIGNvbG9yICoqICgxIC8gMi40KSAtIDAuMDU1KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkanVzdFRvUmFuZ2UobWluLCBtYXgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlTChMKSB7XG4gICAgaWYgKEwgPCAwKSB7XG4gICAgICByZXR1cm4gLWRlY29kZUwoLUwpO1xuICAgIH1cbiAgICBpZiAoTCA+IDguMCkge1xuICAgICAgcmV0dXJuICgoTCArIDE2KSAvIDExNikgKiogMztcbiAgICB9XG4gICAgcmV0dXJuIEwgKiBERUNPREVfTF9DT05TVEFOVDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBlbnNhdGVCbGFja1BvaW50KHNvdXJjZUJsYWNrUG9pbnQsIFhZWl9GbGF0LCByZXN1bHQpIHtcbiAgICAvLyBJbiBjYXNlIHRoZSBibGFja1BvaW50IGlzIGFscmVhZHkgdGhlIGRlZmF1bHQgYmxhY2tQb2ludCB0aGVuIHRoZXJlIGlzXG4gICAgLy8gbm8gbmVlZCB0byBkbyBjb21wZW5zYXRpb24uXG4gICAgaWYgKFxuICAgICAgc291cmNlQmxhY2tQb2ludFswXSA9PT0gMCAmJlxuICAgICAgc291cmNlQmxhY2tQb2ludFsxXSA9PT0gMCAmJlxuICAgICAgc291cmNlQmxhY2tQb2ludFsyXSA9PT0gMFxuICAgICkge1xuICAgICAgcmVzdWx0WzBdID0gWFlaX0ZsYXRbMF07XG4gICAgICByZXN1bHRbMV0gPSBYWVpfRmxhdFsxXTtcbiAgICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciB0aGUgYmxhY2tQb2ludCBjYWxjdWxhdGlvbiBkZXRhaWxzLCBwbGVhc2Ugc2VlXG4gICAgLy8gaHR0cDovL3d3dy5hZG9iZS5jb20vY29udGVudC9kYW0vQWRvYmUvZW4vZGV2bmV0L3Bob3Rvc2hvcC9zZGsvXG4gICAgLy8gQWRvYmVCUEMucGRmLlxuICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBibGFja1BvaW50IGlzIHRoZSBkZWZhdWx0IGJsYWNrUG9pbnQgWzAsIDAsIDBdLlxuICAgIGNvbnN0IHplcm9EZWNvZGVMID0gZGVjb2RlTCgwKTtcblxuICAgIGNvbnN0IFhfRFNUID0gemVyb0RlY29kZUw7XG4gICAgY29uc3QgWF9TUkMgPSBkZWNvZGVMKHNvdXJjZUJsYWNrUG9pbnRbMF0pO1xuXG4gICAgY29uc3QgWV9EU1QgPSB6ZXJvRGVjb2RlTDtcbiAgICBjb25zdCBZX1NSQyA9IGRlY29kZUwoc291cmNlQmxhY2tQb2ludFsxXSk7XG5cbiAgICBjb25zdCBaX0RTVCA9IHplcm9EZWNvZGVMO1xuICAgIGNvbnN0IFpfU1JDID0gZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzJdKTtcblxuICAgIGNvbnN0IFhfU2NhbGUgPSAoMSAtIFhfRFNUKSAvICgxIC0gWF9TUkMpO1xuICAgIGNvbnN0IFhfT2Zmc2V0ID0gMSAtIFhfU2NhbGU7XG5cbiAgICBjb25zdCBZX1NjYWxlID0gKDEgLSBZX0RTVCkgLyAoMSAtIFlfU1JDKTtcbiAgICBjb25zdCBZX09mZnNldCA9IDEgLSBZX1NjYWxlO1xuXG4gICAgY29uc3QgWl9TY2FsZSA9ICgxIC0gWl9EU1QpIC8gKDEgLSBaX1NSQyk7XG4gICAgY29uc3QgWl9PZmZzZXQgPSAxIC0gWl9TY2FsZTtcblxuICAgIHJlc3VsdFswXSA9IFhZWl9GbGF0WzBdICogWF9TY2FsZSArIFhfT2Zmc2V0O1xuICAgIHJlc3VsdFsxXSA9IFhZWl9GbGF0WzFdICogWV9TY2FsZSArIFlfT2Zmc2V0O1xuICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdICogWl9TY2FsZSArIFpfT2Zmc2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkge1xuICAgIC8vIEluIGNhc2UgdGhlIHdoaXRlUG9pbnQgaXMgYWxyZWFkeSBmbGF0IHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBkb1xuICAgIC8vIG5vcm1hbGl6YXRpb24uXG4gICAgaWYgKHNvdXJjZVdoaXRlUG9pbnRbMF0gPT09IDEgJiYgc291cmNlV2hpdGVQb2ludFsyXSA9PT0gMSkge1xuICAgICAgcmVzdWx0WzBdID0gWFlaX0luWzBdO1xuICAgICAgcmVzdWx0WzFdID0gWFlaX0luWzFdO1xuICAgICAgcmVzdWx0WzJdID0gWFlaX0luWzJdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IExNUyA9IHJlc3VsdDtcbiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpO1xuXG4gICAgY29uc3QgTE1TX0ZsYXQgPSB0ZW1wTm9ybWFsaXplTWF0cml4O1xuICAgIGNvbnZlcnRUb0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRmxhdCk7XG5cbiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRmxhdCwgcmVzdWx0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkge1xuICAgIGNvbnN0IExNUyA9IHJlc3VsdDtcbiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpO1xuXG4gICAgY29uc3QgTE1TX0Q2NSA9IHRlbXBOb3JtYWxpemVNYXRyaXg7XG4gICAgY29udmVydFRvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgTE1TX0Q2NSk7XG5cbiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRDY1LCByZXN1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFRvUmdiKGNzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpIHtcbiAgICAvLyBBLCBCIGFuZCBDIHJlcHJlc2VudCBhIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29tcG9uZW50cyBvZiBhIGNhbGlicmF0ZWRcbiAgICAvLyByZ2Igc3BhY2UuXG4gICAgY29uc3QgQSA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldF0gKiBzY2FsZSk7XG4gICAgY29uc3QgQiA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldCArIDFdICogc2NhbGUpO1xuICAgIGNvbnN0IEMgPSBhZGp1c3RUb1JhbmdlKDAsIDEsIHNyY1tzcmNPZmZzZXQgKyAyXSAqIHNjYWxlKTtcblxuICAgIC8vIEEgPC0tLT4gQUdSIGluIHRoZSBzcGVjXG4gICAgLy8gQiA8LS0tPiBCR0cgaW4gdGhlIHNwZWNcbiAgICAvLyBDIDwtLS0+IENHQiBpbiB0aGUgc3BlY1xuICAgIGNvbnN0IEFHUiA9IEEgPT09IDEgPyAxIDogQSAqKiBjcy5HUjtcbiAgICBjb25zdCBCR0cgPSBCID09PSAxID8gMSA6IEIgKiogY3MuR0c7XG4gICAgY29uc3QgQ0dCID0gQyA9PT0gMSA/IDEgOiBDICoqIGNzLkdCO1xuXG4gICAgLy8gQ29tcHV0ZXMgaW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBMLCBNLCBOIGFzIHBlciBzcGVjLlxuICAgIC8vIFRvIGRlY29kZSBYLCBZLCBaIHZhbHVlcyBtYXAgTCwgTSwgTiBkaXJlY3RseSB0byB0aGVtLlxuICAgIGNvbnN0IFggPSBjcy5NWEEgKiBBR1IgKyBjcy5NWEIgKiBCR0cgKyBjcy5NWEMgKiBDR0I7XG4gICAgY29uc3QgWSA9IGNzLk1ZQSAqIEFHUiArIGNzLk1ZQiAqIEJHRyArIGNzLk1ZQyAqIENHQjtcbiAgICBjb25zdCBaID0gY3MuTVpBICogQUdSICsgY3MuTVpCICogQkdHICsgY3MuTVpDICogQ0dCO1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoaXMgZG9jdW1lbnQ6XG4gICAgLy8gaHR0cDovL3d3dy5hZG9iZS5jb20vY29udGVudC9kYW0vQWRvYmUvZW4vZGV2bmV0L3Bob3Rvc2hvcC9zZGsvXG4gICAgLy8gQWRvYmVCUEMucGRmLlxuICAgIGNvbnN0IFhZWiA9IHRlbXBDb252ZXJ0TWF0cml4MTtcbiAgICBYWVpbMF0gPSBYO1xuICAgIFhZWlsxXSA9IFk7XG4gICAgWFlaWzJdID0gWjtcbiAgICBjb25zdCBYWVpfRmxhdCA9IHRlbXBDb252ZXJ0TWF0cml4MjtcblxuICAgIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQoY3Mud2hpdGVQb2ludCwgWFlaLCBYWVpfRmxhdCk7XG5cbiAgICBjb25zdCBYWVpfQmxhY2sgPSB0ZW1wQ29udmVydE1hdHJpeDE7XG4gICAgY29tcGVuc2F0ZUJsYWNrUG9pbnQoY3MuYmxhY2tQb2ludCwgWFlaX0ZsYXQsIFhZWl9CbGFjayk7XG5cbiAgICBjb25zdCBYWVpfRDY1ID0gdGVtcENvbnZlcnRNYXRyaXgyO1xuICAgIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShGTEFUX1dISVRFUE9JTlRfTUFUUklYLCBYWVpfQmxhY2ssIFhZWl9ENjUpO1xuXG4gICAgY29uc3QgU1JHQiA9IHRlbXBDb252ZXJ0TWF0cml4MTtcbiAgICBtYXRyaXhQcm9kdWN0KFNSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYLCBYWVpfRDY1LCBTUkdCKTtcblxuICAgIC8vIENvbnZlcnQgdGhlIHZhbHVlcyB0byByZ2IgcmFuZ2UgWzAsIDI1NV0uXG4gICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHNSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMF0pICogMjU1O1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlsxXSkgKiAyNTU7XG4gICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzJdKSAqIDI1NTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgQ2FsUkdCQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KSB7XG4gICAgICBzdXBlcihcIkNhbFJHQlwiLCAzKTtcblxuICAgICAgaWYgKCF3aGl0ZVBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgICBcIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxSR0JcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQgfHwgbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgICAgIGdhbW1hID0gZ2FtbWEgfHwgbmV3IEZsb2F0MzJBcnJheShbMSwgMSwgMV0pO1xuICAgICAgbWF0cml4ID0gbWF0cml4IHx8IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdKTtcblxuICAgICAgLy8gVHJhbnNsYXRlIGFyZ3VtZW50cyB0byBzcGVjIHZhcmlhYmxlcy5cbiAgICAgIGNvbnN0IFhXID0gd2hpdGVQb2ludFswXTtcbiAgICAgIGNvbnN0IFlXID0gd2hpdGVQb2ludFsxXTtcbiAgICAgIGNvbnN0IFpXID0gd2hpdGVQb2ludFsyXTtcbiAgICAgIHRoaXMud2hpdGVQb2ludCA9IHdoaXRlUG9pbnQ7XG5cbiAgICAgIGNvbnN0IFhCID0gYmxhY2tQb2ludFswXTtcbiAgICAgIGNvbnN0IFlCID0gYmxhY2tQb2ludFsxXTtcbiAgICAgIGNvbnN0IFpCID0gYmxhY2tQb2ludFsyXTtcbiAgICAgIHRoaXMuYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQ7XG5cbiAgICAgIHRoaXMuR1IgPSBnYW1tYVswXTtcbiAgICAgIHRoaXMuR0cgPSBnYW1tYVsxXTtcbiAgICAgIHRoaXMuR0IgPSBnYW1tYVsyXTtcblxuICAgICAgdGhpcy5NWEEgPSBtYXRyaXhbMF07XG4gICAgICB0aGlzLk1ZQSA9IG1hdHJpeFsxXTtcbiAgICAgIHRoaXMuTVpBID0gbWF0cml4WzJdO1xuICAgICAgdGhpcy5NWEIgPSBtYXRyaXhbM107XG4gICAgICB0aGlzLk1ZQiA9IG1hdHJpeFs0XTtcbiAgICAgIHRoaXMuTVpCID0gbWF0cml4WzVdO1xuICAgICAgdGhpcy5NWEMgPSBtYXRyaXhbNl07XG4gICAgICB0aGlzLk1ZQyA9IG1hdHJpeFs3XTtcbiAgICAgIHRoaXMuTVpDID0gbWF0cml4WzhdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZXMgYXMgcGVyIHNwZWMuXG4gICAgICBpZiAoWFcgPCAwIHx8IFpXIDwgMCB8fCBZVyAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAgIFwiLCBubyBmYWxsYmFjayBhdmFpbGFibGVcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoWEIgPCAwIHx8IFlCIDwgMCB8fCBaQiA8IDApIHtcbiAgICAgICAgaW5mbyhcbiAgICAgICAgICBgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0gWyR7WEJ9LCAke1lCfSwgJHtaQn1dLCBgICtcbiAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5ibGFja1BvaW50ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuR1IgPCAwIHx8IHRoaXMuR0cgPCAwIHx8IHRoaXMuR0IgPCAwKSB7XG4gICAgICAgIGluZm8oXG4gICAgICAgICAgYEludmFsaWQgR2FtbWEgWyR7dGhpcy5HUn0sICR7dGhpcy5HR30sICR7dGhpcy5HQn1dIGZvciBgICtcbiAgICAgICAgICAgIGAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5HUiA9IHRoaXMuR0cgPSB0aGlzLkdCID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBkZXN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICAgJ0NhbFJHQkNTLmdldFJnYkl0ZW06IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29udmVydFRvUmdiKHRoaXMsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCAxKTtcbiAgICB9XG5cbiAgICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBkZXN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICAgJ0NhbFJHQkNTLmdldFJnYkJ1ZmZlcjogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpO1xuICAgICAgICBzcmNPZmZzZXQgKz0gMztcbiAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHtcbiAgICAgIHJldHVybiAoKGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSkgLyAzKSB8IDA7XG4gICAgfVxuICB9XG4gIHJldHVybiBDYWxSR0JDUztcbn0pKCk7XG5cbi8qKlxuICogTGFiQ1M6IEJhc2VkIG9uIFwiUERGIFJlZmVyZW5jZSwgU2l4dGggRWRcIiwgcC4yNTBcbiAqXG4gKiBUaGUgZGVmYXVsdCBjb2xvciBpcyBgbmV3IEZsb2F0MzJBcnJheShbMCwgMCwgMF0pYC5cbiAqL1xuY29uc3QgTGFiQ1MgPSAoZnVuY3Rpb24gTGFiQ1NDbG9zdXJlKCkge1xuICAvLyBGdW5jdGlvbiBnKHgpIGZyb20gc3BlY1xuICBmdW5jdGlvbiBmbl9nKHgpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh4ID49IDYgLyAyOSkge1xuICAgICAgcmVzdWx0ID0geCAqIHggKiB4O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSAoMTA4IC8gODQxKSAqICh4IC0gNCAvIDI5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZSh2YWx1ZSwgaGlnaDEsIGxvdzIsIGhpZ2gyKSB7XG4gICAgcmV0dXJuIGxvdzIgKyAodmFsdWUgKiAoaGlnaDIgLSBsb3cyKSkgLyBoaWdoMTtcbiAgfVxuXG4gIC8vIElmIGRlY29kaW5nIGlzIG5lZWRlZCBtYXhWYWwgc2hvdWxkIGJlIDJeYml0cyBwZXIgY29tcG9uZW50IC0gMS5cbiAgZnVuY3Rpb24gY29udmVydFRvUmdiKGNzLCBzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KSB7XG4gICAgLy8gWFhYOiBMYWIgaW5wdXQgaXMgaW4gdGhlIHJhbmdlIG9mIFswLCAxMDBdLCBbYW1pbiwgYW1heF0sIFtibWluLCBibWF4XVxuICAgIC8vIG5vdCB0aGUgdXN1YWwgWzAsIDFdLiBJZiBhIGNvbW1hbmQgbGlrZSBzZXRGaWxsQ29sb3IgaXMgdXNlZCB0aGUgc3JjXG4gICAgLy8gdmFsdWVzIHdpbGwgYWxyZWFkeSBiZSB3aXRoaW4gdGhlIGNvcnJlY3QgcmFuZ2UuIEhvd2V2ZXIsIGlmIHdlIGFyZVxuICAgIC8vIGNvbnZlcnRpbmcgYW4gaW1hZ2Ugd2UgaGF2ZSB0byBtYXAgdGhlIHZhbHVlcyB0byB0aGUgY29ycmVjdCByYW5nZSBnaXZlblxuICAgIC8vIGFib3ZlLlxuICAgIC8vIExzLGFzLGJzIDwtLS0+IEwqLGEqLGIqIGluIHRoZSBzcGVjXG4gICAgbGV0IExzID0gc3JjW3NyY09mZnNldF07XG4gICAgbGV0IGFzID0gc3JjW3NyY09mZnNldCArIDFdO1xuICAgIGxldCBicyA9IHNyY1tzcmNPZmZzZXQgKyAyXTtcbiAgICBpZiAobWF4VmFsICE9PSBmYWxzZSkge1xuICAgICAgTHMgPSBkZWNvZGUoTHMsIG1heFZhbCwgMCwgMTAwKTtcbiAgICAgIGFzID0gZGVjb2RlKGFzLCBtYXhWYWwsIGNzLmFtaW4sIGNzLmFtYXgpO1xuICAgICAgYnMgPSBkZWNvZGUoYnMsIG1heFZhbCwgY3MuYm1pbiwgY3MuYm1heCk7XG4gICAgfVxuXG4gICAgLy8gQWRqdXN0IGxpbWl0cyBvZiAnYXMnIGFuZCAnYnMnXG4gICAgaWYgKGFzID4gY3MuYW1heCkge1xuICAgICAgYXMgPSBjcy5hbWF4O1xuICAgIH0gZWxzZSBpZiAoYXMgPCBjcy5hbWluKSB7XG4gICAgICBhcyA9IGNzLmFtaW47XG4gICAgfVxuICAgIGlmIChicyA+IGNzLmJtYXgpIHtcbiAgICAgIGJzID0gY3MuYm1heDtcbiAgICB9IGVsc2UgaWYgKGJzIDwgY3MuYm1pbikge1xuICAgICAgYnMgPSBjcy5ibWluO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGVzIGludGVybWVkaWF0ZSB2YXJpYWJsZXMgWCxZLFogYXMgcGVyIHNwZWNcbiAgICBjb25zdCBNID0gKExzICsgMTYpIC8gMTE2O1xuICAgIGNvbnN0IEwgPSBNICsgYXMgLyA1MDA7XG4gICAgY29uc3QgTiA9IE0gLSBicyAvIDIwMDtcblxuICAgIGNvbnN0IFggPSBjcy5YVyAqIGZuX2coTCk7XG4gICAgY29uc3QgWSA9IGNzLllXICogZm5fZyhNKTtcbiAgICBjb25zdCBaID0gY3MuWlcgKiBmbl9nKE4pO1xuXG4gICAgbGV0IHIsIGcsIGI7XG4gICAgLy8gVXNpbmcgZGlmZmVyZW50IGNvbnZlcnNpb25zIGZvciBENTAgYW5kIEQ2NSB3aGl0ZSBwb2ludHMsXG4gICAgLy8gcGVyIGh0dHA6Ly93d3cuY29sb3Iub3JnL3NyZ2IucGRmXG4gICAgaWYgKGNzLlpXIDwgMSkge1xuICAgICAgLy8gQXNzdW1pbmcgRDUwIChYPTAuOTY0MiwgWT0xLjAwLCBaPTAuODI0OSlcbiAgICAgIHIgPSBYICogMy4xMzM5ICsgWSAqIC0xLjYxNyArIFogKiAtMC40OTA2O1xuICAgICAgZyA9IFggKiAtMC45Nzg1ICsgWSAqIDEuOTE2ICsgWiAqIDAuMDMzMztcbiAgICAgIGIgPSBYICogMC4wNzIgKyBZICogLTAuMjI5ICsgWiAqIDEuNDA1NztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXNzdW1pbmcgRDY1IChYPTAuOTUwNSwgWT0xLjAwLCBaPTEuMDg4OClcbiAgICAgIHIgPSBYICogMy4yNDA2ICsgWSAqIC0xLjUzNzIgKyBaICogLTAuNDk4NjtcbiAgICAgIGcgPSBYICogLTAuOTY4OSArIFkgKiAxLjg3NTggKyBaICogMC4wNDE1O1xuICAgICAgYiA9IFggKiAwLjA1NTcgKyBZICogLTAuMjA0ICsgWiAqIDEuMDU3O1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IHRoZSBjb2xvciB2YWx1ZXMgdG8gdGhlIFswLDI1NV0gcmFuZ2UgKGNsYW1waW5nIGlzIGF1dG9tYXRpYykuXG4gICAgZGVzdFtkZXN0T2Zmc2V0XSA9IE1hdGguc3FydChyKSAqIDI1NTtcbiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IE1hdGguc3FydChnKSAqIDI1NTtcbiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IE1hdGguc3FydChiKSAqIDI1NTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgTGFiQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSkge1xuICAgICAgc3VwZXIoXCJMYWJcIiwgMyk7XG5cbiAgICAgIGlmICghd2hpdGVQb2ludCkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgXCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgTGFiXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IFswLCAwLCAwXTtcbiAgICAgIHJhbmdlID0gcmFuZ2UgfHwgWy0xMDAsIDEwMCwgLTEwMCwgMTAwXTtcblxuICAgICAgLy8gVHJhbnNsYXRlIGFyZ3MgdG8gc3BlYyB2YXJpYWJsZXNcbiAgICAgIHRoaXMuWFcgPSB3aGl0ZVBvaW50WzBdO1xuICAgICAgdGhpcy5ZVyA9IHdoaXRlUG9pbnRbMV07XG4gICAgICB0aGlzLlpXID0gd2hpdGVQb2ludFsyXTtcbiAgICAgIHRoaXMuYW1pbiA9IHJhbmdlWzBdO1xuICAgICAgdGhpcy5hbWF4ID0gcmFuZ2VbMV07XG4gICAgICB0aGlzLmJtaW4gPSByYW5nZVsyXTtcbiAgICAgIHRoaXMuYm1heCA9IHJhbmdlWzNdO1xuXG4gICAgICAvLyBUaGVzZSBhcmUgaGVyZSBqdXN0IGZvciBjb21wbGV0ZW5lc3MgLSB0aGUgc3BlYyBkb2Vzbid0IG9mZmVyIGFueVxuICAgICAgLy8gZm9ybXVsYXMgdGhhdCB1c2UgQmxhY2tQb2ludCBpbiBMYWJcbiAgICAgIHRoaXMuWEIgPSBibGFja1BvaW50WzBdO1xuICAgICAgdGhpcy5ZQiA9IGJsYWNrUG9pbnRbMV07XG4gICAgICB0aGlzLlpCID0gYmxhY2tQb2ludFsyXTtcblxuICAgICAgLy8gVmFsaWRhdGUgdmFycyBhcyBwZXIgc3BlY1xuICAgICAgaWYgKHRoaXMuWFcgPCAwIHx8IHRoaXMuWlcgPCAwIHx8IHRoaXMuWVcgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIFwiSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZVwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLlhCIDwgMCB8fCB0aGlzLllCIDwgMCB8fCB0aGlzLlpCIDwgMCkge1xuICAgICAgICBpbmZvKFwiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdFwiKTtcbiAgICAgICAgdGhpcy5YQiA9IHRoaXMuWUIgPSB0aGlzLlpCID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYW1pbiA+IHRoaXMuYW1heCB8fCB0aGlzLmJtaW4gPiB0aGlzLmJtYXgpIHtcbiAgICAgICAgaW5mbyhcIkludmFsaWQgUmFuZ2UsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0c1wiKTtcbiAgICAgICAgdGhpcy5hbWluID0gLTEwMDtcbiAgICAgICAgdGhpcy5hbWF4ID0gMTAwO1xuICAgICAgICB0aGlzLmJtaW4gPSAtMTAwO1xuICAgICAgICB0aGlzLmJtYXggPSAxMDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICAgICkge1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAgICdMYWJDUy5nZXRSZ2JJdGVtOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZmFsc2UsIGRlc3QsIGRlc3RPZmZzZXQpO1xuICAgIH1cblxuICAgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgICAnTGFiQ1MuZ2V0UmdiQnVmZmVyOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heFZhbCA9ICgxIDw8IGJpdHMpIC0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIG1heFZhbCwgZGVzdCwgZGVzdE9mZnNldCk7XG4gICAgICAgIHNyY09mZnNldCArPSAzO1xuICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkge1xuICAgICAgcmV0dXJuICgoaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpKSAvIDMpIHwgMDtcbiAgICB9XG5cbiAgICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHtcbiAgICAgIC8vIFhYWDogRGVjb2RpbmcgaXMgaGFuZGxlZCB3aXRoIHRoZSBsYWIgY29udmVyc2lvbiBiZWNhdXNlIG9mIHRoZSBzdHJhbmdlXG4gICAgICAvLyByYW5nZXMgdGhhdCBhcmUgdXNlZC5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKSB7XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidXNlc1plcm9Ub09uZVJhbmdlXCIsIGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIExhYkNTO1xufSkoKTtcblxuZXhwb3J0IHsgQ29sb3JTcGFjZSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTkgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIGluZm8sIHNoYWRvdywgdW5yZWFjaGFibGUgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IFJlZlNldENhY2hlIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuXG5jbGFzcyBCYXNlTG9jYWxDYWNoZSB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUxvY2FsQ2FjaGUpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUxvY2FsQ2FjaGUuXCIpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMub25seVJlZnMpIHtcbiAgICAgIHRoaXMuX25hbWVSZWZNYXAgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLl9pbWFnZU1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpO1xuICB9XG5cbiAgZ2V0QnlOYW1lKG5hbWUpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLl9uYW1lUmVmTWFwLmdldChuYW1lKTtcbiAgICBpZiAocmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCeVJlZihyZWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faW1hZ2VNYXAuZ2V0KG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICBnZXRCeVJlZihyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKSB8fCBudWxsO1xuICB9XG5cbiAgc2V0KG5hbWUsIHJlZiwgZGF0YSkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBzZXRgIGNhbGxlZC5cIik7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxJbWFnZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUge1xuICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEltYWdlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgXCJuYW1lXCIgYXJndW1lbnQuJyk7XG4gICAgfVxuICAgIGlmIChyZWYpIHtcbiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7XG4gICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBuYW1lXG4gICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxDb2xvclNwYWNlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7XG4gIHNldChuYW1lID0gbnVsbCwgcmVmID0gbnVsbCwgZGF0YSkge1xuICAgIGlmICghbmFtZSAmJiAhcmVmKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMb2NhbENvbG9yU3BhY2VDYWNoZS5zZXQgLSBleHBlY3RlZCBcIm5hbWVcIiBhbmQvb3IgXCJyZWZcIiBhcmd1bWVudC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocmVmKSB7XG4gICAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICAvLyBPcHRpb25hbCB3aGVuIGByZWZgIGlzIGRlZmluZWQuXG4gICAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7XG4gICAgICB9XG4gICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBuYW1lXG4gICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxGdW5jdGlvbkNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIoeyBvbmx5UmVmczogdHJ1ZSB9KTtcbiAgfVxuXG4gIGdldEJ5TmFtZShuYW1lKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgYGdldEJ5TmFtZWAgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7XG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxGdW5jdGlvbkNhY2hlLnNldCAtIGV4cGVjdGVkIFwicmVmXCIgYXJndW1lbnQuJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxHU3RhdGVDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHtcbiAgc2V0KG5hbWUsIHJlZiA9IG51bGwsIGRhdGEpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxHU3RhdGVDYWNoZS5zZXQgLSBleHBlY3RlZCBcIm5hbWVcIiBhcmd1bWVudC4nKTtcbiAgICB9XG4gICAgaWYgKHJlZikge1xuICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTtcbiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIG5hbWVcbiAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTtcbiAgfVxufVxuXG5jbGFzcyBHbG9iYWxJbWFnZUNhY2hlIHtcbiAgc3RhdGljIGdldCBOVU1fUEFHRVNfVEhSRVNIT0xEKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJOVU1fUEFHRVNfVEhSRVNIT0xEXCIsIDIpO1xuICB9XG5cbiAgc3RhdGljIGdldCBNQVhfSU1BR0VTX1RPX0NBQ0hFKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJNQVhfSU1BR0VTX1RPX0NBQ0hFXCIsIDEwKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEID4gMSxcbiAgICAgICAgXCJHbG9iYWxJbWFnZUNhY2hlIC0gaW52YWxpZCBOVU1fUEFHRVNfVEhSRVNIT0xEIGNvbnN0YW50LlwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9yZWZDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpO1xuICAgIHRoaXMuX2ltYWdlQ2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTtcbiAgfVxuXG4gIHNob3VsZENhY2hlKHJlZiwgcGFnZUluZGV4KSB7XG4gICAgY29uc3QgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7XG4gICAgY29uc3QgbnVtUGFnZXMgPSBwYWdlSW5kZXhTZXRcbiAgICAgID8gcGFnZUluZGV4U2V0LnNpemUgKyAocGFnZUluZGV4U2V0LmhhcyhwYWdlSW5kZXgpID8gMCA6IDEpXG4gICAgICA6IDE7XG5cbiAgICBpZiAobnVtUGFnZXMgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikgJiZcbiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA+PSBHbG9iYWxJbWFnZUNhY2hlLk1BWF9JTUFHRVNfVE9fQ0FDSEVcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhZGRQYWdlSW5kZXgocmVmLCBwYWdlSW5kZXgpIHtcbiAgICBsZXQgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7XG4gICAgaWYgKCFwYWdlSW5kZXhTZXQpIHtcbiAgICAgIHBhZ2VJbmRleFNldCA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMuX3JlZkNhY2hlLnB1dChyZWYsIHBhZ2VJbmRleFNldCk7XG4gICAgfVxuICAgIHBhZ2VJbmRleFNldC5hZGQocGFnZUluZGV4KTtcbiAgfVxuXG4gIGdldERhdGEocmVmLCBwYWdlSW5kZXgpIHtcbiAgICBjb25zdCBwYWdlSW5kZXhTZXQgPSB0aGlzLl9yZWZDYWNoZS5nZXQocmVmKTtcbiAgICBpZiAoIXBhZ2VJbmRleFNldCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChwYWdlSW5kZXhTZXQuc2l6ZSA8IEdsb2JhbEltYWdlQ2FjaGUuTlVNX1BBR0VTX1RIUkVTSE9MRCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICghdGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEVuc3VyZSB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgYWxsIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIGltYWdlIHJlZmVyZW5jZS5cbiAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKTtcbiAgfVxuXG4gIHNldERhdGEocmVmLCBkYXRhKSB7XG4gICAgaWYgKCF0aGlzLl9yZWZDYWNoZS5oYXMocmVmKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gZXhwZWN0ZWQgXCJhZGRQYWdlSW5kZXhcIiB0byBoYXZlIGJlZW4gY2FsbGVkLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLnNpemUgPj0gR2xvYmFsSW1hZ2VDYWNoZS5NQVhfSU1BR0VTX1RPX0NBQ0hFKSB7XG4gICAgICBpbmZvKFxuICAgICAgICBcIkdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YSAtIGlnbm9yaW5nIGltYWdlIGFib3ZlIE1BWF9JTUFHRVNfVE9fQ0FDSEUuXCJcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7XG4gIH1cblxuICBjbGVhcihvbmx5RGF0YSA9IGZhbHNlKSB7XG4gICAgaWYgKCFvbmx5RGF0YSkge1xuICAgICAgdGhpcy5fcmVmQ2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5faW1hZ2VDYWNoZS5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIExvY2FsSW1hZ2VDYWNoZSxcbiAgTG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIExvY2FsRnVuY3Rpb25DYWNoZSxcbiAgTG9jYWxHU3RhdGVDYWNoZSxcbiAgR2xvYmFsSW1hZ2VDYWNoZSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7XG4gIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUsXG4gIEFubm90YXRpb25GaWVsZEZsYWcsXG4gIEFubm90YXRpb25GbGFnLFxuICBBbm5vdGF0aW9uUmVwbHlUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgYXNzZXJ0LFxuICBlc2NhcGVTdHJpbmcsXG4gIGdldE1vZGlmaWNhdGlvbkRhdGUsXG4gIGlzU3RyaW5nLFxuICBPUFMsXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICBVdGlsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IENhdGFsb2csIEZpbGVTcGVjLCBPYmplY3RMb2FkZXIgfSBmcm9tIFwiLi9vYmouanNcIjtcbmltcG9ydCB7IERpY3QsIGlzRGljdCwgaXNOYW1lLCBpc1JlZiwgaXNTdHJlYW0sIE5hbWUgfSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBDb2xvclNwYWNlIH0gZnJvbSBcIi4vY29sb3JzcGFjZS5qc1wiO1xuaW1wb3J0IHsgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IE9wZXJhdG9yTGlzdCB9IGZyb20gXCIuL29wZXJhdG9yX2xpc3QuanNcIjtcbmltcG9ydCB7IFN0cmluZ1N0cmVhbSB9IGZyb20gXCIuL3N0cmVhbS5qc1wiO1xuaW1wb3J0IHsgd3JpdGVEaWN0IH0gZnJvbSBcIi4vd3JpdGVyLmpzXCI7XG5cbmNsYXNzIEFubm90YXRpb25GYWN0b3J5IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBgQW5ub3RhdGlvbmAgb2JqZWN0IG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHRoZSBnaXZlbiByZWZlcmVuY2VcbiAgICogdG8gYW4gYW5ub3RhdGlvbiBkaWN0aW9uYXJ5LiBUaGlzIHlpZWxkcyBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuXG4gICAqIHRoZSBgQW5ub3RhdGlvbmAgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1hSZWZ9IHhyZWZcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlZlxuICAgKiBAcGFyYW0ge1BERk1hbmFnZXJ9IHBkZk1hbmFnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGlkRmFjdG9yeVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbiB7QW5ub3RhdGlvbn1cbiAgICogICBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyLCBpZEZhY3RvcnkpIHtcbiAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwiYWNyb0Zvcm1cIikudGhlbihhY3JvRm9ybSA9PiB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmUodGhpcywgXCJfY3JlYXRlXCIsIFtcbiAgICAgICAgeHJlZixcbiAgICAgICAgcmVmLFxuICAgICAgICBwZGZNYW5hZ2VyLFxuICAgICAgICBpZEZhY3RvcnksXG4gICAgICAgIGFjcm9Gb3JtLFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRpYyBfY3JlYXRlKHhyZWYsIHJlZiwgcGRmTWFuYWdlciwgaWRGYWN0b3J5LCBhY3JvRm9ybSkge1xuICAgIGNvbnN0IGRpY3QgPSB4cmVmLmZldGNoSWZSZWYocmVmKTtcbiAgICBpZiAoIWlzRGljdChkaWN0KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IGlzUmVmKHJlZikgPyByZWYudG9TdHJpbmcoKSA6IGBhbm5vdF8ke2lkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIGFubm90YXRpb24ncyBzdWJ0eXBlLlxuICAgIGxldCBzdWJ0eXBlID0gZGljdC5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgIHN1YnR5cGUgPSBpc05hbWUoc3VidHlwZSkgPyBzdWJ0eXBlLm5hbWUgOiBudWxsO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByaWdodCBhbm5vdGF0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgc3VidHlwZSBhbmQgZmllbGQgdHlwZS5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgeHJlZixcbiAgICAgIHJlZixcbiAgICAgIGRpY3QsXG4gICAgICBzdWJ0eXBlLFxuICAgICAgaWQsXG4gICAgICBwZGZNYW5hZ2VyLFxuICAgICAgYWNyb0Zvcm06IGFjcm9Gb3JtIGluc3RhbmNlb2YgRGljdCA/IGFjcm9Gb3JtIDogRGljdC5lbXB0eSxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChzdWJ0eXBlKSB7XG4gICAgICBjYXNlIFwiTGlua1wiOlxuICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiVGV4dFwiOlxuICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiV2lkZ2V0XCI6XG4gICAgICAgIGxldCBmaWVsZFR5cGUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsgZGljdCwga2V5OiBcIkZUXCIgfSk7XG4gICAgICAgIGZpZWxkVHlwZSA9IGlzTmFtZShmaWVsZFR5cGUpID8gZmllbGRUeXBlLm5hbWUgOiBudWxsO1xuXG4gICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICAgICAgY2FzZSBcIlR4XCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuICAgICAgICAgIGNhc2UgXCJCdG5cIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiQ2hcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICB3YXJuKFxuICAgICAgICAgICdVbmltcGxlbWVudGVkIHdpZGdldCBmaWVsZCB0eXBlIFwiJyArXG4gICAgICAgICAgICBmaWVsZFR5cGUgK1xuICAgICAgICAgICAgJ1wiLCAnICtcbiAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGJhc2UgZmllbGQgdHlwZS5cIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJQb3B1cFwiOlxuICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIkZyZWVUZXh0XCI6XG4gICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiTGluZVwiOlxuICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiU3F1YXJlXCI6XG4gICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIkNpcmNsZVwiOlxuICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJQb2x5TGluZVwiOlxuICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIkNhcmV0XCI6XG4gICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiSW5rXCI6XG4gICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIkhpZ2hsaWdodFwiOlxuICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJVbmRlcmxpbmVcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiU3F1aWdnbHlcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJTdHJpa2VPdXRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiU3RhbXBcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJGaWxlQXR0YWNobWVudFwiOlxuICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKCFzdWJ0eXBlKSB7XG4gICAgICAgICAgd2FybihcIkFubm90YXRpb24gaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgL1N1YnR5cGUuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAnVW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9uIHR5cGUgXCInICtcbiAgICAgICAgICAgICAgc3VidHlwZSArXG4gICAgICAgICAgICAgICdcIiwgJyArXG4gICAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGJhc2UgYW5ub3RhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRRdWFkUG9pbnRzKGRpY3QsIHJlY3QpIHtcbiAgaWYgKCFkaWN0LmhhcyhcIlF1YWRQb2ludHNcIikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSByZWdpb24gaXMgZGVzY3JpYmVkIGFzIGEgbnVtYmVyIG9mIHF1YWRyaWxhdGVyYWxzLlxuICAvLyBFYWNoIHF1YWRyaWxhdGVyYWwgbXVzdCBjb25zaXN0IG9mIGVpZ2h0IGNvb3JkaW5hdGVzLlxuICBjb25zdCBxdWFkUG9pbnRzID0gZGljdC5nZXRBcnJheShcIlF1YWRQb2ludHNcIik7XG4gIGlmICghQXJyYXkuaXNBcnJheShxdWFkUG9pbnRzKSB8fCBxdWFkUG9pbnRzLmxlbmd0aCAlIDggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBxdWFkUG9pbnRzTGlzdHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGlpID0gcXVhZFBvaW50cy5sZW5ndGggLyA4OyBpIDwgaWk7IGkrKykge1xuICAgIC8vIEVhY2ggc2VyaWVzIG9mIGVpZ2h0IG51bWJlcnMgcmVwcmVzZW50cyB0aGUgY29vcmRpbmF0ZXMgZm9yIG9uZVxuICAgIC8vIHF1YWRyaWxhdGVyYWwgaW4gdGhlIG9yZGVyIFt4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTRdLlxuICAgIC8vIENvbnZlcnQgdGhpcyB0byBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggeCBhbmQgeSBjb29yZGluYXRlcy5cbiAgICBxdWFkUG9pbnRzTGlzdHMucHVzaChbXSk7XG4gICAgZm9yIChsZXQgaiA9IGkgKiA4LCBqaiA9IGkgKiA4ICsgODsgaiA8IGpqOyBqICs9IDIpIHtcbiAgICAgIGNvbnN0IHggPSBxdWFkUG9pbnRzW2pdO1xuICAgICAgY29uc3QgeSA9IHF1YWRQb2ludHNbaiArIDFdO1xuXG4gICAgICAvLyBUaGUgcXVhZHBvaW50cyBzaG91bGQgYmUgaWdub3JlZCBpZiBhbnkgY29vcmRpbmF0ZSBpbiB0aGUgYXJyYXlcbiAgICAgIC8vIGxpZXMgb3V0c2lkZSB0aGUgcmVnaW9uIHNwZWNpZmllZCBieSB0aGUgcmVjdGFuZ2xlLlxuICAgICAgaWYgKHggPCByZWN0WzBdIHx8IHggPiByZWN0WzJdIHx8IHkgPCByZWN0WzFdIHx8IHkgPiByZWN0WzNdKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcXVhZFBvaW50c0xpc3RzW2ldLnB1c2goeyB4LCB5IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcXVhZFBvaW50c0xpc3RzO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2Zvcm1NYXRyaXgocmVjdCwgYmJveCwgbWF0cml4KSB7XG4gIC8vIDEyLjUuNTogQWxnb3JpdGhtOiBBcHBlYXJhbmNlIHN0cmVhbXNcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChcbiAgICBiYm94LFxuICAgIG1hdHJpeFxuICApO1xuICBpZiAobWluWCA9PT0gbWF4WCB8fCBtaW5ZID09PSBtYXhZKSB7XG4gICAgLy8gRnJvbSByZWFsLWxpZmUgZmlsZSwgYmJveCB3YXMgWzAsIDAsIDAsIDBdLiBJbiB0aGlzIGNhc2UsXG4gICAgLy8ganVzdCBhcHBseSB0aGUgdHJhbnNmb3JtIGZvciByZWN0XG4gICAgcmV0dXJuIFsxLCAwLCAwLCAxLCByZWN0WzBdLCByZWN0WzFdXTtcbiAgfVxuXG4gIGNvbnN0IHhSYXRpbyA9IChyZWN0WzJdIC0gcmVjdFswXSkgLyAobWF4WCAtIG1pblgpO1xuICBjb25zdCB5UmF0aW8gPSAocmVjdFszXSAtIHJlY3RbMV0pIC8gKG1heFkgLSBtaW5ZKTtcbiAgcmV0dXJuIFtcbiAgICB4UmF0aW8sXG4gICAgMCxcbiAgICAwLFxuICAgIHlSYXRpbyxcbiAgICByZWN0WzBdIC0gbWluWCAqIHhSYXRpbyxcbiAgICByZWN0WzFdIC0gbWluWSAqIHlSYXRpbyxcbiAgXTtcbn1cblxuY2xhc3MgQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIGNvbnN0IGRpY3QgPSBwYXJhbXMuZGljdDtcblxuICAgIHRoaXMuc2V0Q29udGVudHMoZGljdC5nZXQoXCJDb250ZW50c1wiKSk7XG4gICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKGRpY3QuZ2V0KFwiTVwiKSk7XG4gICAgdGhpcy5zZXRGbGFncyhkaWN0LmdldChcIkZcIikpO1xuICAgIHRoaXMuc2V0UmVjdGFuZ2xlKGRpY3QuZ2V0QXJyYXkoXCJSZWN0XCIpKTtcbiAgICB0aGlzLnNldENvbG9yKGRpY3QuZ2V0QXJyYXkoXCJDXCIpKTtcbiAgICB0aGlzLnNldEJvcmRlclN0eWxlKGRpY3QpO1xuICAgIHRoaXMuc2V0QXBwZWFyYW5jZShkaWN0KTtcblxuICAgIC8vIEV4cG9zZSBwdWJsaWMgcHJvcGVydGllcyB1c2luZyBhIGRhdGEgb2JqZWN0LlxuICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgIGFubm90YXRpb25GbGFnczogdGhpcy5mbGFncyxcbiAgICAgIGJvcmRlclN0eWxlOiB0aGlzLmJvcmRlclN0eWxlLFxuICAgICAgY29sb3I6IHRoaXMuY29sb3IsXG4gICAgICBjb250ZW50czogdGhpcy5jb250ZW50cyxcbiAgICAgIGhhc0FwcGVhcmFuY2U6ICEhdGhpcy5hcHBlYXJhbmNlLFxuICAgICAgaWQ6IHBhcmFtcy5pZCxcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMubW9kaWZpY2F0aW9uRGF0ZSxcbiAgICAgIHJlY3Q6IHRoaXMucmVjdGFuZ2xlLFxuICAgICAgc3VidHlwZTogcGFyYW1zLnN1YnR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hhc0ZsYWcoZmxhZ3MsIGZsYWcpIHtcbiAgICByZXR1cm4gISEoZmxhZ3MgJiBmbGFnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2lzVmlld2FibGUoZmxhZ3MpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLklOVklTSUJMRSkgJiZcbiAgICAgICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBBbm5vdGF0aW9uRmxhZy5ISURERU4pICYmXG4gICAgICAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuTk9WSUVXKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pc1ByaW50YWJsZShmbGFncykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9oYXNGbGFnKGZsYWdzLCBBbm5vdGF0aW9uRmxhZy5QUklOVCkgJiZcbiAgICAgICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpICYmXG4gICAgICAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgdmlld2FibGUoKSB7XG4gICAgaWYgKHRoaXMuZmxhZ3MgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBwcmludGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZmxhZ3MgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lzUHJpbnRhYmxlKHRoaXMuZmxhZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY29udGVudHMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzIC0gVGV4dCB0byBkaXNwbGF5IGZvciB0aGUgYW5ub3RhdGlvbiBvciwgaWYgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgb2YgYW5ub3RhdGlvbiBkb2VzIG5vdCBkaXNwbGF5IHRleHQsIGFcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIGFubm90YXRpb24ncyBjb250ZW50c1xuICAgKi9cbiAgc2V0Q29udGVudHMoY29udGVudHMpIHtcbiAgICB0aGlzLmNvbnRlbnRzID0gc3RyaW5nVG9QREZTdHJpbmcoY29udGVudHMgfHwgXCJcIik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBtb2RpZmljYXRpb24gZGF0ZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kaWZpY2F0aW9uRGF0ZSAtIFBERiBkYXRlIHN0cmluZyB0aGF0IGluZGljYXRlcyB3aGVuIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24gd2FzIGxhc3QgbW9kaWZpZWRcbiAgICovXG4gIHNldE1vZGlmaWNhdGlvbkRhdGUobW9kaWZpY2F0aW9uRGF0ZSkge1xuICAgIHRoaXMubW9kaWZpY2F0aW9uRGF0ZSA9IGlzU3RyaW5nKG1vZGlmaWNhdGlvbkRhdGUpXG4gICAgICA/IG1vZGlmaWNhdGlvbkRhdGVcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZsYWdzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmbGFncyAtIFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHNwZWNpZnlpbmcgYW5ub3RhdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3NcbiAgICogQHNlZSB7QGxpbmsgc2hhcmVkL3V0aWwuanN9XG4gICAqL1xuICBzZXRGbGFncyhmbGFncykge1xuICAgIHRoaXMuZmxhZ3MgPSBOdW1iZXIuaXNJbnRlZ2VyKGZsYWdzKSAmJiBmbGFncyA+IDAgPyBmbGFncyA6IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBwcm92aWRlZCBmbGFnIGlzIHNldC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gZmxhZyAtIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBhbm5vdGF0aW9uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqIEBzZWUge0BsaW5rIHNoYXJlZC91dGlsLmpzfVxuICAgKi9cbiAgaGFzRmxhZyhmbGFnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgZmxhZyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWN0YW5nbGUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25cbiAgICogQHBhcmFtIHtBcnJheX0gcmVjdGFuZ2xlIC0gVGhlIHJlY3RhbmdsZSBhcnJheSB3aXRoIGV4YWN0bHkgZm91ciBlbnRyaWVzXG4gICAqL1xuICBzZXRSZWN0YW5nbGUocmVjdGFuZ2xlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjdGFuZ2xlKSAmJiByZWN0YW5nbGUubGVuZ3RoID09PSA0KSB7XG4gICAgICB0aGlzLnJlY3RhbmdsZSA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0YW5nbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlY3RhbmdsZSA9IFswLCAwLCAwLCAwXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb2xvciBhbmQgdGFrZSBjYXJlIG9mIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24uXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGJsYWNrLCBpbiBSR0IgY29sb3Igc3BhY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25cbiAgICogQHBhcmFtIHtBcnJheX0gY29sb3IgLSBUaGUgY29sb3IgYXJyYXkgY29udGFpbmluZyBlaXRoZXIgMFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICh0cmFuc3BhcmVudCksIDEgKGdyYXlzY2FsZSksIDMgKFJHQikgb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICA0IChDTVlLKSBlbGVtZW50c1xuICAgKi9cbiAgc2V0Q29sb3IoY29sb3IpIHtcbiAgICBjb25zdCByZ2JDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sb3IpKSB7XG4gICAgICB0aGlzLmNvbG9yID0gcmdiQ29sb3I7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2xvci5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogLy8gVHJhbnNwYXJlbnQsIHdoaWNoIHdlIGluZGljYXRlIHdpdGggYSBudWxsIHZhbHVlXG4gICAgICAgIHRoaXMuY29sb3IgPSBudWxsO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxOiAvLyBDb252ZXJ0IGdyYXlzY2FsZSB0byBSR0JcbiAgICAgICAgQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApO1xuICAgICAgICB0aGlzLmNvbG9yID0gcmdiQ29sb3I7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM6IC8vIENvbnZlcnQgUkdCIHBlcmNlbnRhZ2VzIHRvIFJHQlxuICAgICAgICBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTtcbiAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0OiAvLyBDb252ZXJ0IENNWUsgdG8gUkdCXG4gICAgICAgIENvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTtcbiAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBib3JkZXIgc3R5bGUgKGFzIEFubm90YXRpb25Cb3JkZXJTdHlsZSBvYmplY3QpLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uXG4gICAqIEBwYXJhbSB7RGljdH0gYm9yZGVyU3R5bGUgLSBUaGUgYm9yZGVyIHN0eWxlIGRpY3Rpb25hcnlcbiAgICovXG4gIHNldEJvcmRlclN0eWxlKGJvcmRlclN0eWxlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KHRoaXMucmVjdGFuZ2xlLCBcInNldFJlY3RhbmdsZSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgcHJldmlvdXNseS5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5ib3JkZXJTdHlsZSA9IG5ldyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTtcbiAgICBpZiAoIWlzRGljdChib3JkZXJTdHlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGJvcmRlclN0eWxlLmhhcyhcIkJTXCIpKSB7XG4gICAgICBjb25zdCBkaWN0ID0gYm9yZGVyU3R5bGUuZ2V0KFwiQlNcIik7XG4gICAgICBjb25zdCBkaWN0VHlwZSA9IGRpY3QuZ2V0KFwiVHlwZVwiKTtcblxuICAgICAgaWYgKCFkaWN0VHlwZSB8fCBpc05hbWUoZGljdFR5cGUsIFwiQm9yZGVyXCIpKSB7XG4gICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgoZGljdC5nZXQoXCJXXCIpLCB0aGlzLnJlY3RhbmdsZSk7XG4gICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUoZGljdC5nZXQoXCJTXCIpKTtcbiAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoZGljdC5nZXRBcnJheShcIkRcIikpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYm9yZGVyU3R5bGUuaGFzKFwiQm9yZGVyXCIpKSB7XG4gICAgICBjb25zdCBhcnJheSA9IGJvcmRlclN0eWxlLmdldEFycmF5KFwiQm9yZGVyXCIpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyhhcnJheVswXSk7XG4gICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0VmVydGljYWxDb3JuZXJSYWRpdXMoYXJyYXlbMV0pO1xuICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGFycmF5WzJdLCB0aGlzLnJlY3RhbmdsZSk7XG5cbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgIC8vIERhc2ggYXJyYXkgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoYXJyYXlbM10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBubyBib3JkZXIgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeS4gQWNjb3JkaW5nIHRvIHRoZVxuICAgICAgLy8gc3BlY2lmaWNhdGlvbiwgd2Ugc2hvdWxkIGRyYXcgYSBzb2xpZCBib3JkZXIgb2Ygd2lkdGggMSBpbiB0aGF0XG4gICAgICAvLyBjYXNlLCBidXQgQWRvYmUgUmVhZGVyIGRpZCBub3QgaW1wbGVtZW50IHRoYXQgcGFydCBvZiB0aGVcbiAgICAgIC8vIHNwZWNpZmljYXRpb24gYW5kIGluc3RlYWQgZHJhd3Mgbm8gYm9yZGVyIGF0IGFsbCwgc28gd2UgZG8gdGhlIHNhbWUuXG4gICAgICAvLyBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9wZGYuanMvaXNzdWVzLzYxNzkuXG4gICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIChub3JtYWwpIGFwcGVhcmFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25cbiAgICogQHBhcmFtIHtEaWN0fSBkaWN0IC0gVGhlIGFubm90YXRpb24ncyBkYXRhIGRpY3Rpb25hcnlcbiAgICovXG4gIHNldEFwcGVhcmFuY2UoZGljdCkge1xuICAgIHRoaXMuYXBwZWFyYW5jZSA9IG51bGw7XG5cbiAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gZGljdC5nZXQoXCJBUFwiKTtcbiAgICBpZiAoIWlzRGljdChhcHBlYXJhbmNlU3RhdGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluIGNhc2UgdGhlIG5vcm1hbCBhcHBlYXJhbmNlIGlzIGEgc3RyZWFtLCB0aGVuIGl0IGlzIHVzZWQgZGlyZWN0bHkuXG4gICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZVN0YXRlID0gYXBwZWFyYW5jZVN0YXRlcy5nZXQoXCJOXCIpO1xuICAgIGlmIChpc1N0cmVhbShub3JtYWxBcHBlYXJhbmNlU3RhdGUpKSB7XG4gICAgICB0aGlzLmFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNEaWN0KG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBjYXNlIHRoZSBub3JtYWwgYXBwZWFyYW5jZSBpcyBhIGRpY3Rpb25hcnksIHRoZSBgQVNgIGVudHJ5IHByb3ZpZGVzXG4gICAgLy8gdGhlIGtleSBvZiB0aGUgc3RyZWFtIGluIHRoaXMgZGljdGlvbmFyeS5cbiAgICBjb25zdCBhcyA9IGRpY3QuZ2V0KFwiQVNcIik7XG4gICAgaWYgKCFpc05hbWUoYXMpIHx8ICFub3JtYWxBcHBlYXJhbmNlU3RhdGUuaGFzKGFzLm5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZS5nZXQoYXMubmFtZSk7XG4gIH1cblxuICBsb2FkUmVzb3VyY2VzKGtleXMpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlYXJhbmNlLmRpY3QuZ2V0QXN5bmMoXCJSZXNvdXJjZXNcIikudGhlbihyZXNvdXJjZXMgPT4ge1xuICAgICAgaWYgKCFyZXNvdXJjZXMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcihyZXNvdXJjZXMsIGtleXMsIHJlc291cmNlcy54cmVmKTtcbiAgICAgIHJldHVybiBvYmplY3RMb2FkZXIubG9hZCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVzb3VyY2VzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgT3BlcmF0b3JMaXN0KCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSB0aGlzLmFwcGVhcmFuY2U7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCBhcHBlYXJhbmNlRGljdCA9IGFwcGVhcmFuY2UuZGljdDtcbiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFtcbiAgICAgIFwiRXh0R1N0YXRlXCIsXG4gICAgICBcIkNvbG9yU3BhY2VcIixcbiAgICAgIFwiUGF0dGVyblwiLFxuICAgICAgXCJTaGFkaW5nXCIsXG4gICAgICBcIlhPYmplY3RcIixcbiAgICAgIFwiRm9udFwiLFxuICAgIF0pO1xuICAgIGNvbnN0IGJib3ggPSBhcHBlYXJhbmNlRGljdC5nZXRBcnJheShcIkJCb3hcIikgfHwgWzAsIDAsIDEsIDFdO1xuICAgIGNvbnN0IG1hdHJpeCA9IGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KFwiTWF0cml4XCIpIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgoZGF0YS5yZWN0LCBiYm94LCBtYXRyaXgpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlc1Byb21pc2UudGhlbihyZXNvdXJjZXMgPT4ge1xuICAgICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpO1xuICAgICAgb3BMaXN0LmFkZE9wKE9QUy5iZWdpbkFubm90YXRpb24sIFtkYXRhLnJlY3QsIHRyYW5zZm9ybSwgbWF0cml4XSk7XG4gICAgICByZXR1cm4gZXZhbHVhdG9yXG4gICAgICAgIC5nZXRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgIHN0cmVhbTogYXBwZWFyYW5jZSxcbiAgICAgICAgICB0YXNrLFxuICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIG9wTGlzdC5hZGRPcChPUFMuZW5kQW5ub3RhdGlvbiwgW10pO1xuICAgICAgICAgIGFwcGVhcmFuY2UucmVzZXQoKTtcbiAgICAgICAgICByZXR1cm4gb3BMaXN0O1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgYWxsIGRhdGEgcmVnYXJkaW5nIGFuIGFubm90YXRpb24ncyBib3JkZXIgc3R5bGUuXG4gKi9cbmNsYXNzIEFubm90YXRpb25Cb3JkZXJTdHlsZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMud2lkdGggPSAxO1xuICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEO1xuICAgIHRoaXMuZGFzaEFycmF5ID0gWzNdO1xuICAgIHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cyA9IDA7XG4gICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB3aWR0aC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvbkJvcmRlclN0eWxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cbiAgICogQHBhcmFtIHtBcnJheX0gcmVjdCAtIFRoZSBhbm5vdGF0aW9uIGBSZWN0YCBlbnRyeS5cbiAgICovXG4gIHNldFdpZHRoKHdpZHRoLCByZWN0ID0gWzAsIDAsIDAsIDBdKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBBcnJheS5pc0FycmF5KHJlY3QpICYmIHJlY3QubGVuZ3RoID09PSA0LFxuICAgICAgICBcIkEgdmFsaWQgYHJlY3RgIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNvbWUgY29ycnVwdCBQREYgZ2VuZXJhdG9ycyBtYXkgcHJvdmlkZSB0aGUgd2lkdGggYXMgYSBgTmFtZWAsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXMgYSBudW1iZXIgKGZpeGVzIGlzc3VlIDEwMzg1KS5cbiAgICBpZiAoaXNOYW1lKHdpZHRoKSkge1xuICAgICAgdGhpcy53aWR0aCA9IDA7IC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBiZWhhdmlvdXIgaW4gQWRvYmUgUmVhZGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih3aWR0aCkpIHtcbiAgICAgIGlmICh3aWR0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gMjtcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7XG5cbiAgICAgICAgLy8gSWdub3JlIGxhcmdlIGB3aWR0aGBzLCBzaW5jZSB0aGV5IGxlYWQgdG8gdGhlIEFubm90YXRpb24gb3ZlcmZsb3dpbmdcbiAgICAgICAgLy8gdGhlIHNpemUgc2V0IGJ5IHRoZSBgUmVjdGAgZW50cnkgdGh1cyBjYXVzaW5nIHRoZSBgYW5ub3RhdGlvbkxheWVyYFxuICAgICAgICAvLyB0byByZW5kZXIgaXQgb3ZlciB0aGUgc3Vycm91bmRpbmcgZG9jdW1lbnQgKGZpeGVzIGJ1ZzE1NTIxMTMucGRmKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1heFdpZHRoID4gMCAmJlxuICAgICAgICAgIG1heEhlaWdodCA+IDAgJiZcbiAgICAgICAgICAod2lkdGggPiBtYXhXaWR0aCB8fCB3aWR0aCA+IG1heEhlaWdodClcbiAgICAgICAgKSB7XG4gICAgICAgICAgd2FybihgQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICR7d2lkdGh9YCk7XG4gICAgICAgICAgd2lkdGggPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3R5bGUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25Cb3JkZXJTdHlsZVxuICAgKiBAcGFyYW0ge05hbWV9IHN0eWxlIC0gVGhlIGFubm90YXRpb24gc3R5bGUuXG4gICAqIEBzZWUge0BsaW5rIHNoYXJlZC91dGlsLmpzfVxuICAgKi9cbiAgc2V0U3R5bGUoc3R5bGUpIHtcbiAgICBpZiAoIWlzTmFtZShzdHlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChzdHlsZS5uYW1lKSB7XG4gICAgICBjYXNlIFwiU1wiOlxuICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJCXCI6XG4gICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiSVwiOlxuICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJVXCI6XG4gICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRhc2ggYXJyYXkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25Cb3JkZXJTdHlsZVxuICAgKiBAcGFyYW0ge0FycmF5fSBkYXNoQXJyYXkgLSBUaGUgZGFzaCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50XG4gICAqL1xuICBzZXREYXNoQXJyYXkoZGFzaEFycmF5KSB7XG4gICAgLy8gV2UgdmFsaWRhdGUgdGhlIGRhc2ggYXJyYXksIGJ1dCB3ZSBkbyBub3QgdXNlIGl0IGJlY2F1c2UgQ1NTIGRvZXMgbm90XG4gICAgLy8gYWxsb3cgdXMgdG8gY2hhbmdlIHNwYWNpbmcgb2YgZGFzaGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdmlzaXRcbiAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWJhY2tncm91bmQvI3RoZS1ib3JkZXItc3R5bGUuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGFzaEFycmF5KSAmJiBkYXNoQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBQREYgc3BlY2lmaWNhdGlvbjogdGhlIGVsZW1lbnRzIGluIGBkYXNoQXJyYXlgXG4gICAgICAvLyBzaGFsbCBiZSBudW1iZXJzIHRoYXQgYXJlIG5vbm5lZ2F0aXZlIGFuZCBub3QgYWxsIGVxdWFsIHRvIHplcm8uXG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgICBsZXQgYWxsWmVyb3MgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGRhc2hBcnJheSkge1xuICAgICAgICBjb25zdCB2YWxpZE51bWJlciA9ICtlbGVtZW50ID49IDA7XG4gICAgICAgIGlmICghdmFsaWROdW1iZXIpIHtcbiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA+IDApIHtcbiAgICAgICAgICBhbGxaZXJvcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHtcbiAgICAgICAgdGhpcy5kYXNoQXJyYXkgPSBkYXNoQXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndpZHRoID0gMDsgLy8gQWRvYmUgYmVoYXZpb3Igd2hlbiB0aGUgYXJyYXkgaXMgaW52YWxpZC5cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhc2hBcnJheSkge1xuICAgICAgdGhpcy53aWR0aCA9IDA7IC8vIEFkb2JlIGJlaGF2aW9yIHdoZW4gdGhlIGFycmF5IGlzIGludmFsaWQuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgaG9yaXpvbnRhbCBjb3JuZXIgcmFkaXVzIChmcm9tIGEgQm9yZGVyIGRpY3Rpb25hcnkpLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uQm9yZGVyU3R5bGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSBob3Jpem9udGFsIGNvcm5lciByYWRpdXMuXG4gICAqL1xuICBzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHJhZGl1cykge1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHJhZGl1cykpIHtcbiAgICAgIHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cyA9IHJhZGl1cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2ZXJ0aWNhbCBjb3JuZXIgcmFkaXVzIChmcm9tIGEgQm9yZGVyIGRpY3Rpb25hcnkpLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uQm9yZGVyU3R5bGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSB2ZXJ0aWNhbCBjb3JuZXIgcmFkaXVzLlxuICAgKi9cbiAgc2V0VmVydGljYWxDb3JuZXJSYWRpdXMocmFkaXVzKSB7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkge1xuICAgICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IHJhZGl1cztcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgTWFya3VwQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICBjb25zdCBkaWN0ID0gcGFyYW1ldGVycy5kaWN0O1xuXG4gICAgaWYgKGRpY3QuaGFzKFwiSVJUXCIpKSB7XG4gICAgICBjb25zdCByYXdJUlQgPSBkaWN0LmdldFJhdyhcIklSVFwiKTtcbiAgICAgIHRoaXMuZGF0YS5pblJlcGx5VG8gPSBpc1JlZihyYXdJUlQpID8gcmF3SVJULnRvU3RyaW5nKCkgOiBudWxsO1xuXG4gICAgICBjb25zdCBydCA9IGRpY3QuZ2V0KFwiUlRcIik7XG4gICAgICB0aGlzLmRhdGEucmVwbHlUeXBlID0gaXNOYW1lKHJ0KSA/IHJ0Lm5hbWUgOiBBbm5vdGF0aW9uUmVwbHlUeXBlLlJFUExZO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGEucmVwbHlUeXBlID09PSBBbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSB7XG4gICAgICAvLyBTdWJvcmRpbmF0ZSBhbm5vdGF0aW9ucyBpbiBhIGdyb3VwIHNob3VsZCBpbmhlcml0XG4gICAgICAvLyB0aGUgZ3JvdXAgYXR0cmlidXRlcyBmcm9tIHRoZSBwcmltYXJ5IGFubm90YXRpb24uXG4gICAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldChcIklSVFwiKTtcblxuICAgICAgdGhpcy5kYXRhLnRpdGxlID0gc3RyaW5nVG9QREZTdHJpbmcocGFyZW50LmdldChcIlRcIikgfHwgXCJcIik7XG5cbiAgICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50LmdldChcIkNvbnRlbnRzXCIpKTtcbiAgICAgIHRoaXMuZGF0YS5jb250ZW50cyA9IHRoaXMuY29udGVudHM7XG5cbiAgICAgIGlmICghcGFyZW50LmhhcyhcIkNyZWF0aW9uRGF0ZVwiKSkge1xuICAgICAgICB0aGlzLmRhdGEuY3JlYXRpb25EYXRlID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0Q3JlYXRpb25EYXRlKHBhcmVudC5nZXQoXCJDcmVhdGlvbkRhdGVcIikpO1xuICAgICAgICB0aGlzLmRhdGEuY3JlYXRpb25EYXRlID0gdGhpcy5jcmVhdGlvbkRhdGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFyZW50LmhhcyhcIk1cIikpIHtcbiAgICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKHBhcmVudC5nZXQoXCJNXCIpKTtcbiAgICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSB0aGlzLm1vZGlmaWNhdGlvbkRhdGU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0YS5oYXNQb3B1cCA9IHBhcmVudC5oYXMoXCJQb3B1cFwiKTtcblxuICAgICAgaWYgKCFwYXJlbnQuaGFzKFwiQ1wiKSkge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50LmdldEFycmF5KFwiQ1wiKSk7XG4gICAgICAgIHRoaXMuZGF0YS5jb2xvciA9IHRoaXMuY29sb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YS50aXRsZSA9IHN0cmluZ1RvUERGU3RyaW5nKGRpY3QuZ2V0KFwiVFwiKSB8fCBcIlwiKTtcblxuICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUoZGljdC5nZXQoXCJDcmVhdGlvbkRhdGVcIikpO1xuICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IHRoaXMuY3JlYXRpb25EYXRlO1xuXG4gICAgICB0aGlzLmRhdGEuaGFzUG9wdXAgPSBkaWN0LmhhcyhcIlBvcHVwXCIpO1xuXG4gICAgICBpZiAoIWRpY3QuaGFzKFwiQ1wiKSkge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjcmVhdGlvbiBkYXRlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBNYXJrdXBBbm5vdGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcmVhdGlvbkRhdGUgLSBQREYgZGF0ZSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgd2hlbiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24gd2FzIG9yaWdpbmFsbHkgY3JlYXRlZFxuICAgKi9cbiAgc2V0Q3JlYXRpb25EYXRlKGNyZWF0aW9uRGF0ZSkge1xuICAgIHRoaXMuY3JlYXRpb25EYXRlID0gaXNTdHJpbmcoY3JlYXRpb25EYXRlKSA/IGNyZWF0aW9uRGF0ZSA6IG51bGw7XG4gIH1cbn1cblxuY2xhc3MgV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgY29uc3QgZGljdCA9IHBhcmFtcy5kaWN0O1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgdGhpcy5yZWYgPSBwYXJhbXMucmVmO1xuXG4gICAgZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLldJREdFVDtcbiAgICBkYXRhLmZpZWxkTmFtZSA9IHRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KTtcblxuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHtcbiAgICAgIGRpY3QsXG4gICAgICBrZXk6IFwiVlwiLFxuICAgICAgZ2V0QXJyYXk6IHRydWUsXG4gICAgfSk7XG4gICAgZGF0YS5maWVsZFZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGZpZWxkVmFsdWUpO1xuXG4gICAgZGF0YS5hbHRlcm5hdGl2ZVRleHQgPSBzdHJpbmdUb1BERlN0cmluZyhkaWN0LmdldChcIlRVXCIpIHx8IFwiXCIpO1xuICAgIGRhdGEuZGVmYXVsdEFwcGVhcmFuY2UgPVxuICAgICAgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7IGRpY3QsIGtleTogXCJEQVwiIH0pIHx8XG4gICAgICBwYXJhbXMuYWNyb0Zvcm0uZ2V0KFwiREFcIikgfHxcbiAgICAgIFwiXCI7XG4gICAgY29uc3QgZmllbGRUeXBlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7IGRpY3QsIGtleTogXCJGVFwiIH0pO1xuICAgIGRhdGEuZmllbGRUeXBlID0gaXNOYW1lKGZpZWxkVHlwZSkgPyBmaWVsZFR5cGUubmFtZSA6IG51bGw7XG4gICAgdGhpcy5maWVsZFJlc291cmNlcyA9XG4gICAgICBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsgZGljdCwga2V5OiBcIkRSXCIgfSkgfHxcbiAgICAgIHBhcmFtcy5hY3JvRm9ybS5nZXQoXCJEUlwiKSB8fFxuICAgICAgRGljdC5lbXB0eTtcblxuICAgIGRhdGEuZmllbGRGbGFncyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoeyBkaWN0LCBrZXk6IFwiRmZcIiB9KTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF0YS5maWVsZEZsYWdzKSB8fCBkYXRhLmZpZWxkRmxhZ3MgPCAwKSB7XG4gICAgICBkYXRhLmZpZWxkRmxhZ3MgPSAwO1xuICAgIH1cblxuICAgIGRhdGEucmVhZE9ubHkgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJFQURPTkxZKTtcblxuICAgIC8vIEhpZGUgc2lnbmF0dXJlcyBiZWNhdXNlIHdlIGNhbm5vdCB2YWxpZGF0ZSB0aGVtLCBhbmQgdW5zZXQgdGhlIGZpZWxkVmFsdWVcbiAgICAvLyBzaW5jZSBpdCdzIChtb3N0IGxpa2VseSkgYSBgRGljdGAgd2hpY2ggaXMgbm9uLXNlcmlhbGl6YWJsZSBhbmQgd2lsbCB0aHVzXG4gICAgLy8gY2F1c2UgZXJyb3JzIHdoZW4gc2VuZGluZyBhbm5vdGF0aW9ucyB0byB0aGUgbWFpbi10aHJlYWQgKGlzc3VlIDEwMzQ3KS5cbiAgICBpZiAoZGF0YS5maWVsZFR5cGUgPT09IFwiU2lnXCIpIHtcbiAgICAgIGRhdGEuZmllbGRWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnNldEZsYWdzKEFubm90YXRpb25GbGFnLkhJRERFTik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCB0aGUgKGZ1bGx5IHF1YWxpZmllZCkgZmllbGQgbmFtZSBmcm9tIHRoZSAocGFydGlhbCkgZmllbGRcbiAgICogbmFtZXMgb2YgdGhlIGZpZWxkIGFuZCBpdHMgYW5jZXN0b3JzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgV2lkZ2V0QW5ub3RhdGlvblxuICAgKiBAcGFyYW0ge0RpY3R9IGRpY3QgLSBDb21wbGV0ZSB3aWRnZXQgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBfY29uc3RydWN0RmllbGROYW1lKGRpY3QpIHtcbiAgICAvLyBCb3RoIHRoZSBgUGFyZW50YCBhbmQgYFRgIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFdoaWxlIGF0IGxlYXN0IG9uZSBvZlxuICAgIC8vIHRoZW0gc2hvdWxkIGJlIHByb3ZpZGVkLCBiYWQgUERGIGdlbmVyYXRvcnMgbWF5IGZhaWwgdG8gZG8gc28uXG4gICAgaWYgKCFkaWN0LmhhcyhcIlRcIikgJiYgIWRpY3QuaGFzKFwiUGFyZW50XCIpKSB7XG4gICAgICB3YXJuKFwiVW5rbm93biBmaWVsZCBuYW1lLCBmYWxsaW5nIGJhY2sgdG8gZW1wdHkgZmllbGQgbmFtZS5cIik7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBwYXJlbnQgZXhpc3RzLCB0aGUgcGFydGlhbCBhbmQgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIGFyZSBlcXVhbC5cbiAgICBpZiAoIWRpY3QuaGFzKFwiUGFyZW50XCIpKSB7XG4gICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGljdC5nZXQoXCJUXCIpKTtcbiAgICB9XG5cbiAgICAvLyBGb3JtIHRoZSBmdWxseSBxdWFsaWZpZWQgZmllbGQgbmFtZSBieSBhcHBlbmRpbmcgdGhlIHBhcnRpYWwgbmFtZSB0b1xuICAgIC8vIHRoZSBwYXJlbnQncyBmdWxseSBxdWFsaWZpZWQgbmFtZSwgc2VwYXJhdGVkIGJ5IGEgcGVyaW9kLlxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IFtdO1xuICAgIGlmIChkaWN0LmhhcyhcIlRcIikpIHtcbiAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGRpY3QuZ2V0KFwiVFwiKSkpO1xuICAgIH1cblxuICAgIGxldCBsb29wRGljdCA9IGRpY3Q7XG4gICAgd2hpbGUgKGxvb3BEaWN0LmhhcyhcIlBhcmVudFwiKSkge1xuICAgICAgbG9vcERpY3QgPSBsb29wRGljdC5nZXQoXCJQYXJlbnRcIik7XG4gICAgICBpZiAoIWlzRGljdChsb29wRGljdCkpIHtcbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggaXQgaXMgbm90IGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBQREYgc3BlY2lmaWNhdGlvbixcbiAgICAgICAgLy8gYmFkIFBERiBnZW5lcmF0b3JzIG1heSBwcm92aWRlIGEgYFBhcmVudGAgZW50cnkgdGhhdCBpcyBub3QgYVxuICAgICAgICAvLyBkaWN0aW9uYXJ5LCBidXQgYG51bGxgIGZvciBleGFtcGxlIChpc3N1ZSA4MTQzKS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChsb29wRGljdC5oYXMoXCJUXCIpKSB7XG4gICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGxvb3BEaWN0LmdldChcIlRcIikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkTmFtZS5qb2luKFwiLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgdGhlIGdpdmVuIGZvcm0gdmFsdWUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBXaWRnZXRBbm5vdGF0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPnxOYW1lfHN0cmluZ30gZm9ybVZhbHVlIC0gVGhlIChwb3NzaWJseSBlbmNvZGVkKVxuICAgKiAgIGZvcm0gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fHN0cmluZ3xudWxsfVxuICAgKi9cbiAgX2RlY29kZUZvcm1WYWx1ZShmb3JtVmFsdWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtVmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybVZhbHVlXG4gICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpc1N0cmluZyhpdGVtKSlcbiAgICAgICAgLm1hcChpdGVtID0+IHN0cmluZ1RvUERGU3RyaW5nKGl0ZW0pKTtcbiAgICB9IGVsc2UgaWYgKGlzTmFtZShmb3JtVmFsdWUpKSB7XG4gICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZm9ybVZhbHVlLm5hbWUpO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoZm9ybVZhbHVlKSkge1xuICAgICAgcmV0dXJuIHN0cmluZ1RvUERGU3RyaW5nKGZvcm1WYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcHJvdmlkZWQgZmllbGQgZmxhZyBpcyBzZXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFdpZGdldEFubm90YXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZsYWcgLSBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBmb3IgYW4gYW5ub3RhdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGNoYXJhY3RlcmlzdGljXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAc2VlIHtAbGluayBzaGFyZWQvdXRpbC5qc31cbiAgICovXG4gIGhhc0ZpZWxkRmxhZyhmbGFnKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuZGF0YS5maWVsZEZsYWdzICYgZmxhZyk7XG4gIH1cblxuICBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICAvLyBEbyBub3QgcmVuZGVyIGZvcm0gZWxlbWVudHMgb24gdGhlIGNhbnZhcyB3aGVuIGludGVyYWN0aXZlIGZvcm1zIGFyZVxuICAgIC8vIGVuYWJsZWQuIFRoZSBkaXNwbGF5IGxheWVyIGlzIHJlc3BvbnNpYmxlIGZvciByZW5kZXJpbmcgdGhlbSBpbnN0ZWFkLlxuICAgIGlmIChyZW5kZXJGb3Jtcykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgT3BlcmF0b3JMaXN0KCkpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faGFzVGV4dCkge1xuICAgICAgcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChcbiAgICAgICAgZXZhbHVhdG9yLFxuICAgICAgICB0YXNrLFxuICAgICAgICByZW5kZXJGb3JtcyxcbiAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkudGhlbihcbiAgICAgIGNvbnRlbnQgPT4ge1xuICAgICAgICBpZiAodGhpcy5hcHBlYXJhbmNlICYmIGNvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KFxuICAgICAgICAgICAgZXZhbHVhdG9yLFxuICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgIHJlbmRlckZvcm1zLFxuICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpO1xuXG4gICAgICAgIC8vIEV2ZW4gaWYgdGhlcmUgaXMgYW4gYXBwZWFyYW5jZSBzdHJlYW0sIGlnbm9yZSBpdC4gVGhpcyBpcyB0aGVcbiAgICAgICAgLy8gYmVoYXZpb3VyIHVzZWQgYnkgQWRvYmUgUmVhZGVyLlxuICAgICAgICBpZiAoIXRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSB8fCBjb250ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG9wZXJhdG9yTGlzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICAgICAgY29uc3QgYmJveCA9IFtcbiAgICAgICAgICAwLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXSxcbiAgICAgICAgICB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeCh0aGlzLmRhdGEucmVjdCwgYmJveCwgbWF0cml4KTtcbiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbkFubm90YXRpb24sIFtcbiAgICAgICAgICB0aGlzLmRhdGEucmVjdCxcbiAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgbWF0cml4LFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdG9yXG4gICAgICAgICAgLmdldE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLmZpZWxkUmVzb3VyY2VzLFxuICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5lbmRBbm5vdGF0aW9uLCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gb3BlcmF0b3JMaXN0O1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBpZiAodGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBhcHBlYXJhbmNlID0gYXdhaXQgdGhpcy5fZ2V0QXBwZWFyYW5jZShcbiAgICAgIGV2YWx1YXRvcixcbiAgICAgIHRhc2ssXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZVxuICAgICk7XG4gICAgaWYgKGFwcGVhcmFuY2UgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRpY3QgPSBldmFsdWF0b3IueHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTtcbiAgICBpZiAoIWlzRGljdChkaWN0KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYmJveCA9IFtcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXSxcbiAgICAgIHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0sXG4gICAgXTtcblxuICAgIGNvbnN0IG5ld1JlZiA9IGV2YWx1YXRvci54cmVmLmdldE5ld1JlZigpO1xuICAgIGNvbnN0IEFQID0gbmV3IERpY3QoZXZhbHVhdG9yLnhyZWYpO1xuICAgIEFQLnNldChcIk5cIiwgbmV3UmVmKTtcblxuICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXTtcbiAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDtcbiAgICBsZXQgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsO1xuICAgIGxldCBuZXdUcmFuc2Zvcm0gPSBudWxsO1xuICAgIGlmIChlbmNyeXB0KSB7XG4gICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnJlZi5udW0sXG4gICAgICAgIHRoaXMucmVmLmdlblxuICAgICAgKTtcbiAgICAgIG5ld1RyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKG5ld1JlZi5udW0sIG5ld1JlZi5nZW4pO1xuICAgICAgYXBwZWFyYW5jZSA9IG5ld1RyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKGFwcGVhcmFuY2UpO1xuICAgIH1cblxuICAgIGRpY3Quc2V0KFwiVlwiLCB2YWx1ZSk7XG4gICAgZGljdC5zZXQoXCJBUFwiLCBBUCk7XG4gICAgZGljdC5zZXQoXCJNXCIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApO1xuXG4gICAgY29uc3QgYXBwZWFyYW5jZURpY3QgPSBuZXcgRGljdChldmFsdWF0b3IueHJlZik7XG4gICAgYXBwZWFyYW5jZURpY3Quc2V0KFwiTGVuZ3RoXCIsIGFwcGVhcmFuY2UubGVuZ3RoKTtcbiAgICBhcHBlYXJhbmNlRGljdC5zZXQoXCJTdWJ0eXBlXCIsIE5hbWUuZ2V0KFwiRm9ybVwiKSk7XG4gICAgYXBwZWFyYW5jZURpY3Quc2V0KFwiUmVzb3VyY2VzXCIsIHRoaXMuZmllbGRSZXNvdXJjZXMpO1xuICAgIGFwcGVhcmFuY2VEaWN0LnNldChcIkJCb3hcIiwgYmJveCk7XG5cbiAgICBjb25zdCBidWZmZXJPcmlnaW5hbCA9IFtgJHt0aGlzLnJlZi5udW19ICR7dGhpcy5yZWYuZ2VufSBvYmpcXG5gXTtcbiAgICB3cml0ZURpY3QoZGljdCwgYnVmZmVyT3JpZ2luYWwsIG9yaWdpbmFsVHJhbnNmb3JtKTtcbiAgICBidWZmZXJPcmlnaW5hbC5wdXNoKFwiXFxuZW5kb2JqXFxuXCIpO1xuXG4gICAgY29uc3QgYnVmZmVyTmV3ID0gW2Ake25ld1JlZi5udW19ICR7bmV3UmVmLmdlbn0gb2JqXFxuYF07XG4gICAgd3JpdGVEaWN0KGFwcGVhcmFuY2VEaWN0LCBidWZmZXJOZXcsIG5ld1RyYW5zZm9ybSk7XG4gICAgYnVmZmVyTmV3LnB1c2goXCIgc3RyZWFtXFxuXCIpO1xuICAgIGJ1ZmZlck5ldy5wdXNoKGFwcGVhcmFuY2UpO1xuICAgIGJ1ZmZlck5ldy5wdXNoKFwiXFxuZW5kc3RyZWFtXFxuZW5kb2JqXFxuXCIpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGRhdGEgZm9yIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgIC8vIFYgZmllbGQgY2hhbmdlZCArIHJlZmVyZW5jZSBmb3IgbmV3IEFQXG4gICAgICB7IHJlZjogdGhpcy5yZWYsIGRhdGE6IGJ1ZmZlck9yaWdpbmFsLmpvaW4oXCJcIikgfSxcbiAgICAgIC8vIGRhdGEgZm9yIHRoZSBuZXcgQVBcbiAgICAgIHsgcmVmOiBuZXdSZWYsIGRhdGE6IGJ1ZmZlck5ldy5qb2luKFwiXCIpIH0sXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIF9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBjb25zdCBpc1Bhc3N3b3JkID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCk7XG4gICAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSB8fCBpc1Bhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBhbm5vdGF0aW9uU3RvcmFnZVt0aGlzLmRhdGEuaWRdO1xuICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSAyO1xuICAgIGNvbnN0IGhQYWRkaW5nID0gZGVmYXVsdFBhZGRpbmc7XG4gICAgY29uc3QgdG90YWxIZWlnaHQgPSB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdO1xuICAgIGNvbnN0IHRvdGFsV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdO1xuXG4gICAgY29uc3QgZm9udEluZm8gPSBhd2FpdCB0aGlzLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2spO1xuICAgIGNvbnN0IFtmb250LCBmb250TmFtZV0gPSBmb250SW5mbztcbiAgICBsZXQgZm9udFNpemUgPSBmb250SW5mb1syXTtcblxuICAgIGZvbnRTaXplID0gdGhpcy5fY29tcHV0ZUZvbnRTaXplKGZvbnQsIGZvbnROYW1lLCBmb250U2l6ZSwgdG90YWxIZWlnaHQpO1xuXG4gICAgbGV0IGRlc2NlbnQgPSBmb250LmRlc2NlbnQ7XG4gICAgaWYgKGlzTmFOKGRlc2NlbnQpKSB7XG4gICAgICBkZXNjZW50ID0gMDtcbiAgICB9XG5cbiAgICBjb25zdCB2UGFkZGluZyA9IGRlZmF1bHRQYWRkaW5nICsgTWF0aC5hYnMoZGVzY2VudCkgKiBmb250U2l6ZTtcbiAgICBjb25zdCBkZWZhdWx0QXBwZWFyYW5jZSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZTtcbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLmRhdGEudGV4dEFsaWdubWVudDtcblxuICAgIGlmICh0aGlzLmRhdGEuY29tYikge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKFxuICAgICAgICBkZWZhdWx0QXBwZWFyYW5jZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRvdGFsV2lkdGgsXG4gICAgICAgIGhQYWRkaW5nLFxuICAgICAgICB2UGFkZGluZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoXG4gICAgICAgIGRlZmF1bHRBcHBlYXJhbmNlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZm9udCxcbiAgICAgICAgZm9udFNpemUsXG4gICAgICAgIHRvdGFsV2lkdGgsXG4gICAgICAgIHRvdGFsSGVpZ2h0LFxuICAgICAgICBhbGlnbm1lbnQsXG4gICAgICAgIGhQYWRkaW5nLFxuICAgICAgICB2UGFkZGluZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYWxpZ25tZW50ID09PSAwIHx8IGFsaWdubWVudCA+IDIpIHtcbiAgICAgIC8vIExlZnQgYWxpZ25tZW50OiBub3RoaW5nIHRvIGRvXG4gICAgICByZXR1cm4gKFxuICAgICAgICBcIi9UeCBCTUMgcSBCVCBcIiArXG4gICAgICAgIGRlZmF1bHRBcHBlYXJhbmNlICtcbiAgICAgICAgYCAxIDAgMCAxICR7aFBhZGRpbmd9ICR7dlBhZGRpbmd9IFRtICgke2VzY2FwZVN0cmluZyh2YWx1ZSl9KSBUamAgK1xuICAgICAgICBcIiBFVCBRIEVNQ1wiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IHRoaXMuX3JlbmRlclRleHQoXG4gICAgICB2YWx1ZSxcbiAgICAgIGZvbnQsXG4gICAgICBmb250U2l6ZSxcbiAgICAgIHRvdGFsV2lkdGgsXG4gICAgICBhbGlnbm1lbnQsXG4gICAgICBoUGFkZGluZyxcbiAgICAgIHZQYWRkaW5nXG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgXCIvVHggQk1DIHEgQlQgXCIgK1xuICAgICAgZGVmYXVsdEFwcGVhcmFuY2UgK1xuICAgICAgYCAxIDAgMCAxIDAgMCBUbSAke3JlbmRlcmVkVGV4dH1gICtcbiAgICAgIFwiIEVUIFEgRU1DXCJcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaykge1xuICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICBmb250U2l6ZTogMCxcbiAgICAgIGZvbnQ6IG51bGwsXG4gICAgICBmb250TmFtZTogbnVsbCxcbiAgICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IGV2YWx1YXRvci5nZXRPcGVyYXRvckxpc3Qoe1xuICAgICAgc3RyZWFtOiBuZXcgU3RyaW5nU3RyZWFtKHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSksXG4gICAgICB0YXNrLFxuICAgICAgcmVzb3VyY2VzOiB0aGlzLmZpZWxkUmVzb3VyY2VzLFxuICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgaW5pdGlhbFN0YXRlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtpbml0aWFsU3RhdGUuZm9udCwgaW5pdGlhbFN0YXRlLmZvbnROYW1lLCBpbml0aWFsU3RhdGUuZm9udFNpemVdO1xuICB9XG5cbiAgX2NvbXB1dGVGb250U2l6ZShmb250LCBmb250TmFtZSwgZm9udFNpemUsIGhlaWdodCkge1xuICAgIGlmIChmb250U2l6ZSA9PT0gbnVsbCB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgY29uc3QgZW0gPSBmb250LmNoYXJzVG9HbHlwaHMoXCJNXCIsIHRydWUpWzBdLndpZHRoIC8gMTAwMDtcbiAgICAgIC8vIEFjY29yZGluZyB0byBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbV8odHlwb2dyYXBoeSlcbiAgICAgIC8vIGFuIGF2ZXJhZ2UgY2FwIGhlaWdodCBzaG91bGQgYmUgNzAlIG9mIDFlbVxuICAgICAgY29uc3QgY2FwSGVpZ2h0ID0gMC43ICogZW07XG4gICAgICAvLyAxLjUgKiBjYXBIZWlnaHQgKiBmb250U2l6ZSBzZWVtcyB0byBiZSBhIGdvb2QgdmFsdWUgZm9yIGxpbmVIZWlnaHRcbiAgICAgIGZvbnRTaXplID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihoZWlnaHQgLyAoMS41ICogY2FwSGVpZ2h0KSkpO1xuXG4gICAgICBsZXQgZm9udFJlZ2V4ID0gbmV3IFJlZ0V4cChgLyR7Zm9udE5hbWV9XFxcXHMrWzAtOVxcLl0rXFxcXHMrVGZgKTtcbiAgICAgIGlmICh0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2Uuc2VhcmNoKGZvbnRSZWdleCkgPT09IC0xKSB7XG4gICAgICAgIC8vIFRoZSBmb250IHNpemUgaXMgbWlzc2luZ1xuICAgICAgICBmb250UmVnZXggPSBuZXcgUmVnRXhwKGAvJHtmb250TmFtZX1cXFxccytUZmApO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlLnJlcGxhY2UoXG4gICAgICAgIGZvbnRSZWdleCxcbiAgICAgICAgYC8ke2ZvbnROYW1lfSAke2ZvbnRTaXplfSBUZmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbiAgfVxuXG4gIF9yZW5kZXJUZXh0KHRleHQsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoLCBhbGlnbm1lbnQsIGhQYWRkaW5nLCB2UGFkZGluZykge1xuICAgIC8vIFdlIG5lZWQgdG8gZ2V0IHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBpbiBvcmRlciB0byBhbGlnbiBpdCBjb3JyZWN0bHlcbiAgICBjb25zdCBnbHlwaHMgPSBmb250LmNoYXJzVG9HbHlwaHModGV4dCk7XG4gICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7XG4gICAgbGV0IHdpZHRoID0gMDtcbiAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykge1xuICAgICAgd2lkdGggKz0gZ2x5cGgud2lkdGggKiBzY2FsZTtcbiAgICB9XG5cbiAgICBsZXQgc2hpZnQ7XG4gICAgaWYgKGFsaWdubWVudCA9PT0gMSkge1xuICAgICAgLy8gQ2VudGVyXG4gICAgICBzaGlmdCA9ICh0b3RhbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWdubWVudCA9PT0gMikge1xuICAgICAgLy8gUmlnaHRcbiAgICAgIHNoaWZ0ID0gdG90YWxXaWR0aCAtIHdpZHRoIC0gaFBhZGRpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoaWZ0ID0gaFBhZGRpbmc7XG4gICAgfVxuICAgIHNoaWZ0ID0gc2hpZnQudG9GaXhlZCgyKTtcbiAgICB2UGFkZGluZyA9IHZQYWRkaW5nLnRvRml4ZWQoMik7XG5cbiAgICByZXR1cm4gYCR7c2hpZnR9ICR7dlBhZGRpbmd9IFRkICgke2VzY2FwZVN0cmluZyh0ZXh0KX0pIFRqYDtcbiAgfVxufVxuXG5jbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgdGhpcy5faGFzVGV4dCA9IHRydWU7XG5cbiAgICBjb25zdCBkaWN0ID0gcGFyYW1zLmRpY3Q7XG5cbiAgICAvLyBUaGUgZmllbGQgdmFsdWUgaXMgYWx3YXlzIGEgc3RyaW5nLlxuICAgIGlmICghaXNTdHJpbmcodGhpcy5kYXRhLmZpZWxkVmFsdWUpKSB7XG4gICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFwiXCI7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBhbGlnbm1lbnQgb2YgdGV4dCBpbiB0aGUgZmllbGQuXG4gICAgbGV0IGFsaWdubWVudCA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoeyBkaWN0LCBrZXk6IFwiUVwiIH0pO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhbGlnbm1lbnQpIHx8IGFsaWdubWVudCA8IDAgfHwgYWxpZ25tZW50ID4gMikge1xuICAgICAgYWxpZ25tZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRleHQgaW4gdGhlIGZpZWxkLlxuICAgIGxldCBtYXhpbXVtTGVuZ3RoID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7IGRpY3QsIGtleTogXCJNYXhMZW5cIiB9KTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4aW11bUxlbmd0aCkgfHwgbWF4aW11bUxlbmd0aCA8IDApIHtcbiAgICAgIG1heGltdW1MZW5ndGggPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmRhdGEubWF4TGVuID0gbWF4aW11bUxlbmd0aDtcblxuICAgIC8vIFByb2Nlc3MgZmllbGQgZmxhZ3MgZm9yIHRoZSBkaXNwbGF5IGxheWVyLlxuICAgIHRoaXMuZGF0YS5tdWx0aUxpbmUgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7XG4gICAgdGhpcy5kYXRhLmNvbWIgPVxuICAgICAgdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSAmJlxuICAgICAgIXRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuTVVMVElMSU5FKSAmJlxuICAgICAgIXRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpICYmXG4gICAgICAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSAmJlxuICAgICAgdGhpcy5kYXRhLm1heExlbiAhPT0gbnVsbDtcbiAgfVxuXG4gIF9nZXRDb21iQXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSwgdGV4dCwgd2lkdGgsIGhQYWRkaW5nLCB2UGFkZGluZykge1xuICAgIGNvbnN0IGNvbWJXaWR0aCA9ICh3aWR0aCAvIHRoaXMuZGF0YS5tYXhMZW4pLnRvRml4ZWQoMik7XG4gICAgY29uc3QgYnVmID0gW107XG4gICAgZm9yIChjb25zdCBjaGFyYWN0ZXIgb2YgdGV4dCkge1xuICAgICAgYnVmLnB1c2goYCgke2VzY2FwZVN0cmluZyhjaGFyYWN0ZXIpfSkgVGpgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZW5kZXJlZENvbWIgPSBidWYuam9pbihgICR7Y29tYldpZHRofSAwIFRkIGApO1xuICAgIHJldHVybiAoXG4gICAgICBcIi9UeCBCTUMgcSBCVCBcIiArXG4gICAgICBkZWZhdWx0QXBwZWFyYW5jZSArXG4gICAgICBgIDEgMCAwIDEgJHtoUGFkZGluZ30gJHt2UGFkZGluZ30gVG0gJHtyZW5kZXJlZENvbWJ9YCArXG4gICAgICBcIiBFVCBRIEVNQ1wiXG4gICAgKTtcbiAgfVxuXG4gIF9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKFxuICAgIGRlZmF1bHRBcHBlYXJhbmNlLFxuICAgIHRleHQsXG4gICAgZm9udCxcbiAgICBmb250U2l6ZSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYWxpZ25tZW50LFxuICAgIGhQYWRkaW5nLFxuICAgIHZQYWRkaW5nXG4gICkge1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgICBjb25zdCBidWYgPSBbXTtcbiAgICBjb25zdCB0b3RhbFdpZHRoID0gd2lkdGggLSAyICogaFBhZGRpbmc7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCBjaHVua3MgPSB0aGlzLl9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgpO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IGJ1Zi5sZW5ndGggPT09IDAgPyBoUGFkZGluZyA6IDA7XG4gICAgICAgIGJ1Zi5wdXNoKFxuICAgICAgICAgIHRoaXMuX3JlbmRlclRleHQoXG4gICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgYWxpZ25tZW50LFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIC1mb250U2l6ZSAvLyA8MCBiZWNhdXNlIGEgbGluZSBpcyBiZWxvdyB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IGJ1Zi5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiAoXG4gICAgICBcIi9UeCBCTUMgcSBCVCBcIiArXG4gICAgICBkZWZhdWx0QXBwZWFyYW5jZSArXG4gICAgICBgIDEgMCAwIDEgMCAke2hlaWdodH0gVG0gJHtyZW5kZXJlZFRleHR9YCArXG4gICAgICBcIiBFVCBRIEVNQ1wiXG4gICAgKTtcbiAgfVxuXG4gIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoIDw9IDEpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gc3BsaXRcbiAgICAgIHJldHVybiBbbGluZV07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7XG4gICAgY29uc3Qgd2hpdGVzcGFjZSA9IGZvbnQuY2hhcnNUb0dseXBocyhcIiBcIiwgdHJ1ZSlbMF0ud2lkdGggKiBzY2FsZTtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcblxuICAgIGxldCBsYXN0U3BhY2VQb3MgPSAtMSxcbiAgICAgIHN0YXJ0Q2h1bmsgPSAwLFxuICAgICAgY3VycmVudFdpZHRoID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgY2hhcmFjdGVyID0gbGluZS5jaGFyQXQoaSk7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIiBcIikge1xuICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgd2hpdGVzcGFjZSA+IHdpZHRoKSB7XG4gICAgICAgICAgLy8gV2UgY2FuIGJyZWFrIGhlcmVcbiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBpKSk7XG4gICAgICAgICAgc3RhcnRDaHVuayA9IGk7XG4gICAgICAgICAgY3VycmVudFdpZHRoID0gd2hpdGVzcGFjZTtcbiAgICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50V2lkdGggKz0gd2hpdGVzcGFjZTtcbiAgICAgICAgICBsYXN0U3BhY2VQb3MgPSBpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGFyV2lkdGggPSBmb250LmNoYXJzVG9HbHlwaHMoY2hhcmFjdGVyLCBmYWxzZSlbMF0ud2lkdGggKiBzY2FsZTtcbiAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCArIGNoYXJXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgICAgLy8gV2UgbXVzdCBicmVhayB0byB0aGUgbGFzdCB3aGl0ZSBwb3NpdGlvbiAoaWYgYXZhaWxhYmxlKVxuICAgICAgICAgIGlmIChsYXN0U3BhY2VQb3MgIT09IC0xKSB7XG4gICAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsYXN0U3BhY2VQb3MgKyAxKSk7XG4gICAgICAgICAgICBzdGFydENodW5rID0gaSA9IGxhc3RTcGFjZVBvcyArIDE7XG4gICAgICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTtcbiAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEp1c3QgYnJlYWsgaW4gdGhlIG1pZGRsZSBvZiB0aGUgd29yZFxuICAgICAgICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgaSkpO1xuICAgICAgICAgICAgc3RhcnRDaHVuayA9IGk7XG4gICAgICAgICAgICBjdXJyZW50V2lkdGggPSBjaGFyV2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRXaWR0aCArPSBjaGFyV2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhcnRDaHVuayA8IGxpbmUubGVuZ3RoKSB7XG4gICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsaW5lLmxlbmd0aCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjaHVua3M7XG4gIH1cbn1cblxuY2xhc3MgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IG51bGw7XG4gICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbnVsbDtcblxuICAgIHRoaXMuZGF0YS5jaGVja0JveCA9XG4gICAgICAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5SQURJTykgJiZcbiAgICAgICF0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO1xuICAgIHRoaXMuZGF0YS5yYWRpb0J1dHRvbiA9XG4gICAgICB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJBRElPKSAmJlxuICAgICAgIXRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7XG4gICAgdGhpcy5kYXRhLnB1c2hCdXR0b24gPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5jaGVja0JveCkge1xuICAgICAgdGhpcy5fcHJvY2Vzc0NoZWNrQm94KHBhcmFtcyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHtcbiAgICAgIHRoaXMuX3Byb2Nlc3NSYWRpb0J1dHRvbihwYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnB1c2hCdXR0b24pIHtcbiAgICAgIHRoaXMuX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oXCJJbnZhbGlkIGZpZWxkIGZsYWdzIGZvciBidXR0b24gd2lkZ2V0IGFubm90YXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KFxuICAgICAgICBldmFsdWF0b3IsXG4gICAgICAgIHRhc2ssXG4gICAgICAgIGZhbHNlLCAvLyB3ZSB1c2Ugbm9ybWFsQXBwZWFyYW5jZSB0byByZW5kZXIgdGhlIGJ1dHRvblxuICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXSB8fCBmYWxzZTtcbiAgICAgIGxldCBhcHBlYXJhbmNlO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGFwcGVhcmFuY2UgPSB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZWFyYW5jZSA9IHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWRBcHBlYXJhbmNlID0gdGhpcy5hcHBlYXJhbmNlO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlO1xuICAgICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBzdXBlci5nZXRPcGVyYXRvckxpc3QoXG4gICAgICAgICAgZXZhbHVhdG9yLFxuICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgcmVuZGVyRm9ybXMsXG4gICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlID0gc2F2ZWRBcHBlYXJhbmNlO1xuICAgICAgICByZXR1cm4gb3BlcmF0b3JMaXN0O1xuICAgICAgfVxuXG4gICAgICAvLyBObyBhcHBlYXJhbmNlXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBPcGVyYXRvckxpc3QoKSk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoXG4gICAgICBldmFsdWF0b3IsXG4gICAgICB0YXNrLFxuICAgICAgcmVuZGVyRm9ybXMsXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZVxuICAgICk7XG4gIH1cblxuICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2F2ZUNoZWNrYm94KGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHtcbiAgICAgIHJldHVybiB0aGlzLl9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7XG4gIH1cblxuICBhc3luYyBfc2F2ZUNoZWNrYm94KGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZSAmJiB0aGlzLmRhdGEuZmllbGRWYWx1ZSAhPT0gXCJPZmZcIjtcbiAgICBjb25zdCB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF07XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpO1xuICAgIGlmICghaXNEaWN0KGRpY3QpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiBcIk9mZlwiKTtcbiAgICBkaWN0LnNldChcIlZcIiwgbmFtZSk7XG4gICAgZGljdC5zZXQoXCJBU1wiLCBuYW1lKTtcbiAgICBkaWN0LnNldChcIk1cIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7XG5cbiAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDtcbiAgICBsZXQgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsO1xuICAgIGlmIChlbmNyeXB0KSB7XG4gICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnJlZi5udW0sXG4gICAgICAgIHRoaXMucmVmLmdlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBbYCR7dGhpcy5yZWYubnVtfSAke3RoaXMucmVmLmdlbn0gb2JqXFxuYF07XG4gICAgd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgb3JpZ2luYWxUcmFuc2Zvcm0pO1xuICAgIGJ1ZmZlci5wdXNoKFwiXFxuZW5kb2JqXFxuXCIpO1xuXG4gICAgcmV0dXJuIFt7IHJlZjogdGhpcy5yZWYsIGRhdGE6IGJ1ZmZlci5qb2luKFwiXCIpIH1dO1xuICB9XG5cbiAgYXN5bmMgX3NhdmVSYWRpb0J1dHRvbihldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTtcbiAgICBjb25zdCB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF07XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpO1xuICAgIGlmICghaXNEaWN0KGRpY3QpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgOiBcIk9mZlwiKTtcbiAgICBsZXQgcGFyZW50QnVmZmVyID0gbnVsbDtcbiAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKGlzUmVmKHRoaXMucGFyZW50KSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBldmFsdWF0b3IueHJlZi5mZXRjaCh0aGlzLnBhcmVudCk7XG4gICAgICAgIGxldCBwYXJlbnRUcmFuc2Zvcm0gPSBudWxsO1xuICAgICAgICBpZiAoZW5jcnlwdCkge1xuICAgICAgICAgIHBhcmVudFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKFxuICAgICAgICAgICAgdGhpcy5wYXJlbnQubnVtLFxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZ2VuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQuc2V0KFwiVlwiLCBuYW1lKTtcbiAgICAgICAgcGFyZW50QnVmZmVyID0gW2Ake3RoaXMucGFyZW50Lm51bX0gJHt0aGlzLnBhcmVudC5nZW59IG9ialxcbmBdO1xuICAgICAgICB3cml0ZURpY3QocGFyZW50LCBwYXJlbnRCdWZmZXIsIHBhcmVudFRyYW5zZm9ybSk7XG4gICAgICAgIHBhcmVudEJ1ZmZlci5wdXNoKFwiXFxuZW5kb2JqXFxuXCIpO1xuICAgICAgfSBlbHNlIGlmIChpc0RpY3QodGhpcy5wYXJlbnQpKSB7XG4gICAgICAgIHRoaXMucGFyZW50LnNldChcIlZcIiwgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGljdC5zZXQoXCJBU1wiLCBuYW1lKTtcbiAgICBkaWN0LnNldChcIk1cIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7XG5cbiAgICBsZXQgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsO1xuICAgIGlmIChlbmNyeXB0KSB7XG4gICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnJlZi5udW0sXG4gICAgICAgIHRoaXMucmVmLmdlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBbYCR7dGhpcy5yZWYubnVtfSAke3RoaXMucmVmLmdlbn0gb2JqXFxuYF07XG4gICAgd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgb3JpZ2luYWxUcmFuc2Zvcm0pO1xuICAgIGJ1ZmZlci5wdXNoKFwiXFxuZW5kb2JqXFxuXCIpO1xuXG4gICAgY29uc3QgbmV3UmVmcyA9IFt7IHJlZjogdGhpcy5yZWYsIGRhdGE6IGJ1ZmZlci5qb2luKFwiXCIpIH1dO1xuICAgIGlmIChwYXJlbnRCdWZmZXIgIT09IG51bGwpIHtcbiAgICAgIG5ld1JlZnMucHVzaCh7IHJlZjogdGhpcy5wYXJlbnQsIGRhdGE6IHBhcmVudEJ1ZmZlci5qb2luKFwiXCIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdSZWZzO1xuICB9XG5cbiAgX3Byb2Nlc3NDaGVja0JveChwYXJhbXMpIHtcbiAgICBjb25zdCBjdXN0b21BcHBlYXJhbmNlID0gcGFyYW1zLmRpY3QuZ2V0KFwiQVBcIik7XG4gICAgaWYgKCFpc0RpY3QoY3VzdG9tQXBwZWFyYW5jZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxBcHBlYXJhbmNlID0gY3VzdG9tQXBwZWFyYW5jZS5nZXQoXCJOXCIpO1xuICAgIGlmICghaXNEaWN0KG5vcm1hbEFwcGVhcmFuY2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXhwb3J0VmFsdWVzID0gbm9ybWFsQXBwZWFyYW5jZS5nZXRLZXlzKCk7XG4gICAgaWYgKCFleHBvcnRWYWx1ZXMuaW5jbHVkZXMoXCJPZmZcIikpIHtcbiAgICAgIC8vIFRoZSAvT2ZmIGFwcGVhcmFuY2UgaXMgb3B0aW9uYWwuXG4gICAgICBleHBvcnRWYWx1ZXMucHVzaChcIk9mZlwiKTtcbiAgICB9XG4gICAgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgPVxuICAgICAgZXhwb3J0VmFsdWVzWzBdID09PSBcIk9mZlwiID8gZXhwb3J0VmFsdWVzWzFdIDogZXhwb3J0VmFsdWVzWzBdO1xuXG4gICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KHRoaXMuZGF0YS5leHBvcnRWYWx1ZSk7XG4gICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQoXCJPZmZcIikgfHwgbnVsbDtcbiAgfVxuXG4gIF9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKSB7XG4gICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBudWxsO1xuXG4gICAgLy8gVGhlIHBhcmVudCBmaWVsZCdzIGBWYCBlbnRyeSBob2xkcyBhIGBOYW1lYCBvYmplY3Qgd2l0aCB0aGUgYXBwZWFyYW5jZVxuICAgIC8vIHN0YXRlIG9mIHdoaWNoZXZlciBjaGlsZCBmaWVsZCBpcyBjdXJyZW50bHkgaW4gdGhlIFwib25cIiBzdGF0ZS5cbiAgICBjb25zdCBmaWVsZFBhcmVudCA9IHBhcmFtcy5kaWN0LmdldChcIlBhcmVudFwiKTtcbiAgICBpZiAoaXNEaWN0KGZpZWxkUGFyZW50KSAmJiBmaWVsZFBhcmVudC5oYXMoXCJWXCIpKSB7XG4gICAgICBjb25zdCBmaWVsZFBhcmVudFZhbHVlID0gZmllbGRQYXJlbnQuZ2V0KFwiVlwiKTtcbiAgICAgIGlmIChpc05hbWUoZmllbGRQYXJlbnRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMuZGljdC5nZXRSYXcoXCJQYXJlbnRcIik7XG4gICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGZpZWxkUGFyZW50VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBidXR0b24ncyB2YWx1ZSBjb3JyZXNwb25kcyB0byBpdHMgYXBwZWFyYW5jZSBzdGF0ZS5cbiAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gcGFyYW1zLmRpY3QuZ2V0KFwiQVBcIik7XG4gICAgaWYgKCFpc0RpY3QoYXBwZWFyYW5jZVN0YXRlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KFwiTlwiKTtcbiAgICBpZiAoIWlzRGljdChub3JtYWxBcHBlYXJhbmNlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBub3JtYWxBcHBlYXJhbmNlLmdldEtleXMoKSkge1xuICAgICAgaWYgKGtleSAhPT0gXCJPZmZcIikge1xuICAgICAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBrZXk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuYnV0dG9uVmFsdWUpO1xuICAgIHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KFwiT2ZmXCIpIHx8IG51bGw7XG4gIH1cblxuICBfcHJvY2Vzc1B1c2hCdXR0b24ocGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMuZGljdC5oYXMoXCJBXCIpKSB7XG4gICAgICB3YXJuKFwiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe1xuICAgICAgZGVzdERpY3Q6IHBhcmFtcy5kaWN0LFxuICAgICAgcmVzdWx0T2JqOiB0aGlzLmRhdGEsXG4gICAgICBkb2NCYXNlVXJsOiBwYXJhbXMucGRmTWFuYWdlci5kb2NCYXNlVXJsLFxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgb3B0aW9ucy4gVGhlIG9wdGlvbnMgYXJyYXkgbWF5IGNvbnNpc3Qgb2Ygc3RyaW5ncyBvclxuICAgIC8vIGFycmF5cy4gSWYgdGhlIGFycmF5IGNvbnNpc3RzIG9mIGFycmF5cywgdGhlbiB0aGUgZmlyc3QgZWxlbWVudCBvZlxuICAgIC8vIGVhY2ggYXJyYXkgaXMgdGhlIGV4cG9ydCB2YWx1ZSBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIGVhY2ggYXJyYXkgaXNcbiAgICAvLyB0aGUgZGlzcGxheSB2YWx1ZS4gSWYgdGhlIGFycmF5IGNvbnNpc3RzIG9mIHN0cmluZ3MsIHRoZW4gdGhlc2VcbiAgICAvLyByZXByZXNlbnQgYm90aCB0aGUgZXhwb3J0IGFuZCBkaXNwbGF5IHZhbHVlLiBJbiB0aGlzIGNhc2UsIHdlIGNvbnZlcnRcbiAgICAvLyBpdCB0byBhbiBhcnJheSBvZiBhcnJheXMgYXMgd2VsbCBmb3IgY29udmVuaWVuY2UgaW4gdGhlIGRpc3BsYXkgbGF5ZXIuXG4gICAgLy8gTm90ZSB0aGF0IHRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHN0YXRlIHRoYXQgdGhlIGBPcHRgIGZpZWxkIGlzXG4gICAgLy8gaW5oZXJpdGFibGUsIGJ1dCBpbiBwcmFjdGljZSBQREYgZ2VuZXJhdG9ycyBkbyBtYWtlIGFubm90YXRpb25zXG4gICAgLy8gaW5oZXJpdCB0aGUgb3B0aW9ucyBmcm9tIGEgcGFyZW50IGFubm90YXRpb24gKGlzc3VlIDgwOTQpLlxuICAgIHRoaXMuZGF0YS5vcHRpb25zID0gW107XG5cbiAgICBjb25zdCBvcHRpb25zID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7IGRpY3Q6IHBhcmFtcy5kaWN0LCBrZXk6IFwiT3B0XCIgfSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIGNvbnN0IHhyZWYgPSBwYXJhbXMueHJlZjtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb25zdCBvcHRpb24gPSB4cmVmLmZldGNoSWZSZWYob3B0aW9uc1tpXSk7XG4gICAgICAgIGNvbnN0IGlzT3B0aW9uQXJyYXkgPSBBcnJheS5pc0FycmF5KG9wdGlvbik7XG5cbiAgICAgICAgdGhpcy5kYXRhLm9wdGlvbnNbaV0gPSB7XG4gICAgICAgICAgZXhwb3J0VmFsdWU6IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShcbiAgICAgICAgICAgIGlzT3B0aW9uQXJyYXkgPyB4cmVmLmZldGNoSWZSZWYob3B0aW9uWzBdKSA6IG9wdGlvblxuICAgICAgICAgICksXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoXG4gICAgICAgICAgICBpc09wdGlvbkFycmF5ID8geHJlZi5mZXRjaElmUmVmKG9wdGlvblsxXSkgOiBvcHRpb25cbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBmaWVsZCB2YWx1ZSBjYW4gYmUgYG51bGxgIGlmIG5vIGl0ZW0gaXMgc2VsZWN0ZWQsIGEgc3RyaW5nIGlmIG9uZVxuICAgIC8vIGl0ZW0gaXMgc2VsZWN0ZWQgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpZiBtdWx0aXBsZSBpdGVtcyBhcmUgc2VsZWN0ZWQuXG4gICAgLy8gRm9yIGNvbnNpc3RlbmN5IGluIHRoZSBBUEkgYW5kIGNvbnZlbmllbmNlIGluIHRoZSBkaXNwbGF5IGxheWVyLCB3ZVxuICAgIC8vIGFsd2F5cyBtYWtlIHRoZSBmaWVsZCB2YWx1ZSBhbiBhcnJheSB3aXRoIHplcm8sIG9uZSBvciBtdWx0aXBsZSBpdGVtcy5cbiAgICBpZiAoaXNTdHJpbmcodGhpcy5kYXRhLmZpZWxkVmFsdWUpKSB7XG4gICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFt0aGlzLmRhdGEuZmllbGRWYWx1ZV07XG4gICAgfSBlbHNlIGlmICghdGhpcy5kYXRhLmZpZWxkVmFsdWUpIHtcbiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBmaWVsZCBmbGFncyBmb3IgdGhlIGRpc3BsYXkgbGF5ZXIuXG4gICAgdGhpcy5kYXRhLmNvbWJvID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CTyk7XG4gICAgdGhpcy5kYXRhLm11bHRpU2VsZWN0ID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSVNFTEVDVCk7XG4gICAgdGhpcy5faGFzVGV4dCA9IHRydWU7XG4gIH1cbn1cblxuY2xhc3MgVGV4dEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IERFRkFVTFRfSUNPTl9TSVpFID0gMjI7IC8vIHB4XG5cbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIGNvbnN0IGRpY3QgPSBwYXJhbWV0ZXJzLmRpY3Q7XG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVEVYVDtcblxuICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkge1xuICAgICAgdGhpcy5kYXRhLm5hbWUgPSBcIk5vSWNvblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEucmVjdFsxXSA9IHRoaXMuZGF0YS5yZWN0WzNdIC0gREVGQVVMVF9JQ09OX1NJWkU7XG4gICAgICB0aGlzLmRhdGEucmVjdFsyXSA9IHRoaXMuZGF0YS5yZWN0WzBdICsgREVGQVVMVF9JQ09OX1NJWkU7XG4gICAgICB0aGlzLmRhdGEubmFtZSA9IGRpY3QuaGFzKFwiTmFtZVwiKSA/IGRpY3QuZ2V0KFwiTmFtZVwiKS5uYW1lIDogXCJOb3RlXCI7XG4gICAgfVxuXG4gICAgaWYgKGRpY3QuaGFzKFwiU3RhdGVcIikpIHtcbiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IGRpY3QuZ2V0KFwiU3RhdGVcIikgfHwgbnVsbDtcbiAgICAgIHRoaXMuZGF0YS5zdGF0ZU1vZGVsID0gZGljdC5nZXQoXCJTdGF0ZU1vZGVsXCIpIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLmRhdGEuc3RhdGVNb2RlbCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIExpbmtBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcyk7XG5cbiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5MSU5LO1xuXG4gICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1zLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTtcbiAgICBpZiAocXVhZFBvaW50cykge1xuICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzO1xuICAgIH1cblxuICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7XG4gICAgICBkZXN0RGljdDogcGFyYW1zLmRpY3QsXG4gICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSxcbiAgICAgIGRvY0Jhc2VVcmw6IHBhcmFtcy5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwsXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgUG9wdXBBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlBPUFVQO1xuXG4gICAgbGV0IHBhcmVudEl0ZW0gPSBwYXJhbWV0ZXJzLmRpY3QuZ2V0KFwiUGFyZW50XCIpO1xuICAgIGlmICghcGFyZW50SXRlbSkge1xuICAgICAgd2FybihcIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRTdWJ0eXBlID0gcGFyZW50SXRlbS5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgIHRoaXMuZGF0YS5wYXJlbnRUeXBlID0gaXNOYW1lKHBhcmVudFN1YnR5cGUpID8gcGFyZW50U3VidHlwZS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCByYXdQYXJlbnQgPSBwYXJhbWV0ZXJzLmRpY3QuZ2V0UmF3KFwiUGFyZW50XCIpO1xuICAgIHRoaXMuZGF0YS5wYXJlbnRJZCA9IGlzUmVmKHJhd1BhcmVudCkgPyByYXdQYXJlbnQudG9TdHJpbmcoKSA6IG51bGw7XG5cbiAgICBjb25zdCBydCA9IHBhcmVudEl0ZW0uZ2V0KFwiUlRcIik7XG4gICAgaWYgKGlzTmFtZShydCwgQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkpIHtcbiAgICAgIC8vIFN1Ym9yZGluYXRlIGFubm90YXRpb25zIGluIGEgZ3JvdXAgc2hvdWxkIGluaGVyaXRcbiAgICAgIC8vIHRoZSBncm91cCBhdHRyaWJ1dGVzIGZyb20gdGhlIHByaW1hcnkgYW5ub3RhdGlvbi5cbiAgICAgIHBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtLmdldChcIklSVFwiKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudEl0ZW0uaGFzKFwiTVwiKSkge1xuICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50SXRlbS5nZXQoXCJNXCIpKTtcbiAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gdGhpcy5tb2RpZmljYXRpb25EYXRlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50SXRlbS5oYXMoXCJDXCIpKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgIHRoaXMuZGF0YS5jb2xvciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50SXRlbS5nZXRBcnJheShcIkNcIikpO1xuICAgICAgdGhpcy5kYXRhLmNvbG9yID0gdGhpcy5jb2xvcjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgUG9wdXAgYW5ub3RhdGlvbiBpcyBub3Qgdmlld2FibGUsIGJ1dCB0aGUgcGFyZW50IGFubm90YXRpb24gaXMsXG4gICAgLy8gdGhhdCBpcyBtb3N0IGxpa2VseSBhIGJ1Zy4gRmFsbGJhY2sgdG8gaW5oZXJpdCB0aGUgZmxhZ3MgZnJvbSB0aGUgcGFyZW50XG4gICAgLy8gYW5ub3RhdGlvbiAodGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGJlaGF2aW91ciBpbiBBZG9iZSBSZWFkZXIpLlxuICAgIGlmICghdGhpcy52aWV3YWJsZSkge1xuICAgICAgY29uc3QgcGFyZW50RmxhZ3MgPSBwYXJlbnRJdGVtLmdldChcIkZcIik7XG4gICAgICBpZiAodGhpcy5faXNWaWV3YWJsZShwYXJlbnRGbGFncykpIHtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhwYXJlbnRGbGFncyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhLnRpdGxlID0gc3RyaW5nVG9QREZTdHJpbmcocGFyZW50SXRlbS5nZXQoXCJUXCIpIHx8IFwiXCIpO1xuICAgIHRoaXMuZGF0YS5jb250ZW50cyA9IHN0cmluZ1RvUERGU3RyaW5nKHBhcmVudEl0ZW0uZ2V0KFwiQ29udGVudHNcIikgfHwgXCJcIik7XG4gIH1cbn1cblxuY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkZSRUVURVhUO1xuICB9XG59XG5cbmNsYXNzIExpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkxJTkU7XG5cbiAgICB0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzID0gVXRpbC5ub3JtYWxpemVSZWN0KFxuICAgICAgcGFyYW1ldGVycy5kaWN0LmdldEFycmF5KFwiTFwiKVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgU3F1YXJlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TUVVBUkU7XG4gIH1cbn1cblxuY2xhc3MgQ2lyY2xlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5DSVJDTEU7XG4gIH1cbn1cblxuY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlBPTFlMSU5FO1xuXG4gICAgLy8gVGhlIHZlcnRpY2VzIGFycmF5IGlzIGFuIGFycmF5IG9mIG51bWJlcnMgcmVwcmVzZW50aW5nIHRoZSBhbHRlcm5hdGluZ1xuICAgIC8vIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvb3JkaW5hdGVzLCByZXNwZWN0aXZlbHksIG9mIGVhY2ggdmVydGV4LlxuICAgIC8vIENvbnZlcnQgdGhpcyB0byBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggeCBhbmQgeSBjb29yZGluYXRlcy5cbiAgICBjb25zdCByYXdWZXJ0aWNlcyA9IHBhcmFtZXRlcnMuZGljdC5nZXRBcnJheShcIlZlcnRpY2VzXCIpO1xuICAgIHRoaXMuZGF0YS52ZXJ0aWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHJhd1ZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIHRoaXMuZGF0YS52ZXJ0aWNlcy5wdXNoKHtcbiAgICAgICAgeDogcmF3VmVydGljZXNbaV0sXG4gICAgICAgIHk6IHJhd1ZlcnRpY2VzW2kgKyAxXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBQb2x5Z29uQW5ub3RhdGlvbiBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICAvLyBQb2x5Z29ucyBhcmUgc3BlY2lmaWMgZm9ybXMgb2YgcG9seWxpbmVzLCBzbyByZXVzZSB0aGVpciBsb2dpYy5cbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlBPTFlHT047XG4gIH1cbn1cblxuY2xhc3MgQ2FyZXRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkNBUkVUO1xuICB9XG59XG5cbmNsYXNzIElua0Fubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuXG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuSU5LO1xuXG4gICAgY29uc3QgeHJlZiA9IHBhcmFtZXRlcnMueHJlZjtcbiAgICBjb25zdCBvcmlnaW5hbElua0xpc3RzID0gcGFyYW1ldGVycy5kaWN0LmdldEFycmF5KFwiSW5rTGlzdFwiKTtcbiAgICB0aGlzLmRhdGEuaW5rTGlzdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcmlnaW5hbElua0xpc3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIC8vIFRoZSByYXcgaW5rIGxpc3RzIGFycmF5IGNvbnRhaW5zIGFycmF5cyBvZiBudW1iZXJzIHJlcHJlc2VudGluZ1xuICAgICAgLy8gdGhlIGFsdGVybmF0aW5nIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvb3JkaW5hdGVzLCByZXNwZWN0aXZlbHksXG4gICAgICAvLyBvZiBlYWNoIHZlcnRleC4gQ29udmVydCB0aGlzIHRvIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB4IGFuZCB5XG4gICAgICAvLyBjb29yZGluYXRlcy5cbiAgICAgIHRoaXMuZGF0YS5pbmtMaXN0cy5wdXNoKFtdKTtcbiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IG9yaWdpbmFsSW5rTGlzdHNbaV0ubGVuZ3RoOyBqIDwgamo7IGogKz0gMikge1xuICAgICAgICB0aGlzLmRhdGEuaW5rTGlzdHNbaV0ucHVzaCh7XG4gICAgICAgICAgeDogeHJlZi5mZXRjaElmUmVmKG9yaWdpbmFsSW5rTGlzdHNbaV1bal0pLFxuICAgICAgICAgIHk6IHhyZWYuZmV0Y2hJZlJlZihvcmlnaW5hbElua0xpc3RzW2ldW2ogKyAxXSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBIaWdobGlnaHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkhJR0hMSUdIVDtcblxuICAgIGNvbnN0IHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKHBhcmFtZXRlcnMuZGljdCwgdGhpcy5yZWN0YW5nbGUpO1xuICAgIGlmIChxdWFkUG9pbnRzKSB7XG4gICAgICB0aGlzLmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFVuZGVybGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuXG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FO1xuXG4gICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1ldGVycy5kaWN0LCB0aGlzLnJlY3RhbmdsZSk7XG4gICAgaWYgKHF1YWRQb2ludHMpIHtcbiAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50cztcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNRVUlHR0xZO1xuXG4gICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1ldGVycy5kaWN0LCB0aGlzLnJlY3RhbmdsZSk7XG4gICAgaWYgKHF1YWRQb2ludHMpIHtcbiAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50cztcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ7XG5cbiAgICBjb25zdCBxdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhwYXJhbWV0ZXJzLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTtcbiAgICBpZiAocXVhZFBvaW50cykge1xuICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBTdGFtcEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuXG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuU1RBTVA7XG4gIH1cbn1cblxuY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZVNwZWMocGFyYW1ldGVycy5kaWN0LmdldChcIkZTXCIpLCBwYXJhbWV0ZXJzLnhyZWYpO1xuXG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ7XG4gICAgdGhpcy5kYXRhLmZpbGUgPSBmaWxlLnNlcmlhbGl6YWJsZTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBBbm5vdGF0aW9uLFxuICBBbm5vdGF0aW9uQm9yZGVyU3R5bGUsXG4gIEFubm90YXRpb25GYWN0b3J5LFxuICBNYXJrdXBBbm5vdGF0aW9uLFxuICBnZXRRdWFkUG9pbnRzLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIEltYWdlS2luZCwgT1BTLCB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbnZhciBRdWV1ZU9wdGltaXplciA9IChmdW5jdGlvbiBRdWV1ZU9wdGltaXplckNsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIGFkZFN0YXRlKHBhcmVudFN0YXRlLCBwYXR0ZXJuLCBjaGVja0ZuLCBpdGVyYXRlRm4sIHByb2Nlc3NGbikge1xuICAgIHZhciBzdGF0ZSA9IHBhcmVudFN0YXRlO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhdHRlcm4ubGVuZ3RoIC0gMTsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gcGF0dGVybltpXTtcbiAgICAgIHN0YXRlID0gc3RhdGVbaXRlbV0gfHwgKHN0YXRlW2l0ZW1dID0gW10pO1xuICAgIH1cbiAgICBzdGF0ZVtwYXR0ZXJuW3BhdHRlcm4ubGVuZ3RoIC0gMV1dID0ge1xuICAgICAgY2hlY2tGbixcbiAgICAgIGl0ZXJhdGVGbixcbiAgICAgIHByb2Nlc3NGbixcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKFxuICAgIGlGaXJzdFNhdmUsXG4gICAgY291bnQsXG4gICAgZm5BcnJheSxcbiAgICBhcmdzQXJyYXlcbiAgKSB7XG4gICAgLy8gSGFuZGxlcyBzcGVjaWFsIGNhc2Ugb2YgbWFpbmx5IExhVGVYIGRvY3VtZW50cyB3aGljaCB1c2UgaW1hZ2UgbWFza3MgdG9cbiAgICAvLyBkcmF3IGxpbmVzIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBzdHlsZS5cbiAgICAvLyAnY291bnQnIGdyb3VwcyBvZiAoc2F2ZSwgdHJhbnNmb3JtLCBwYWludEltYWdlTWFza1hPYmplY3QsIHJlc3RvcmUpK1xuICAgIC8vIGhhdmUgYmVlbiBmb3VuZCBhdCBpRmlyc3RTYXZlLlxuICAgIHZhciBpRmlyc3RQSU1YTyA9IGlGaXJzdFNhdmUgKyAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgdmFyIGFyZyA9IGFyZ3NBcnJheVtpRmlyc3RQSU1YTyArIDQgKiBpXTtcbiAgICAgIHZhciBpbWFnZU1hc2sgPSBhcmcubGVuZ3RoID09PSAxICYmIGFyZ1swXTtcbiAgICAgIGlmIChcbiAgICAgICAgaW1hZ2VNYXNrICYmXG4gICAgICAgIGltYWdlTWFzay53aWR0aCA9PT0gMSAmJlxuICAgICAgICBpbWFnZU1hc2suaGVpZ2h0ID09PSAxICYmXG4gICAgICAgICghaW1hZ2VNYXNrLmRhdGEubGVuZ3RoIHx8XG4gICAgICAgICAgKGltYWdlTWFzay5kYXRhLmxlbmd0aCA9PT0gMSAmJiBpbWFnZU1hc2suZGF0YVswXSA9PT0gMCkpXG4gICAgICApIHtcbiAgICAgICAgZm5BcnJheVtpRmlyc3RQSU1YTyArIDQgKiBpXSA9IE9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2s7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBjb3VudCAtIGk7XG4gIH1cblxuICB2YXIgSW5pdGlhbFN0YXRlID0gW107XG5cbiAgLy8gVGhpcyByZXBsYWNlcyAoc2F2ZSwgdHJhbnNmb3JtLCBwYWludElubGluZUltYWdlWE9iamVjdCwgcmVzdG9yZSkrXG4gIC8vIHNlcXVlbmNlcyB3aXRoIG9uZSB8cGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cHwgb3BlcmF0aW9uLlxuICBhZGRTdGF0ZShcbiAgICBJbml0aWFsU3RhdGUsXG4gICAgW09QUy5zYXZlLCBPUFMudHJhbnNmb3JtLCBPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIE9QUy5yZXN0b3JlXSxcbiAgICBudWxsLFxuICAgIGZ1bmN0aW9uIGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHtcbiAgICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5O1xuICAgICAgdmFyIGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gMztcbiAgICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDtcbiAgICAgIHN3aXRjaCAocG9zKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnNhdmU7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnRyYW5zZm9ybTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnJlc3RvcmU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApO1xuICAgIH0sXG4gICAgZnVuY3Rpb24gZm91bmRJbmxpbmVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHtcbiAgICAgIHZhciBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAxMDtcbiAgICAgIHZhciBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAyMDA7XG4gICAgICB2YXIgTUFYX1dJRFRIID0gMTAwMDtcbiAgICAgIHZhciBJTUFHRV9QQURESU5HID0gMTtcblxuICAgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksXG4gICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5O1xuICAgICAgdmFyIGN1cnIgPSBjb250ZXh0LmlDdXJyO1xuICAgICAgdmFyIGlGaXJzdFNhdmUgPSBjdXJyIC0gMztcbiAgICAgIHZhciBpRmlyc3RUcmFuc2Zvcm0gPSBjdXJyIC0gMjtcbiAgICAgIHZhciBpRmlyc3RQSUlYTyA9IGN1cnIgLSAxO1xuXG4gICAgICB2YXIgY291bnQgPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCksXG4gICAgICAgIE1BWF9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DS1xuICAgICAgKTtcbiAgICAgIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSykge1xuICAgICAgICByZXR1cm4gaSAtICgoaSAtIGlGaXJzdFNhdmUpICUgNCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFzc3VtaW5nIHRoYXQgaGVpZ2h0cyBvZiB0aG9zZSBpbWFnZSBpcyB0b28gc21hbGwgKH4xIHBpeGVsKVxuICAgICAgLy8gcGFja2luZyBhcyBtdWNoIGFzIHBvc3NpYmxlIGJ5IGxpbmVzXG4gICAgICB2YXIgbWF4WCA9IDA7XG4gICAgICB2YXIgbWFwID0gW10sXG4gICAgICAgIG1heExpbmVIZWlnaHQgPSAwO1xuICAgICAgdmFyIGN1cnJlbnRYID0gSU1BR0VfUEFERElORyxcbiAgICAgICAgY3VycmVudFkgPSBJTUFHRV9QQURESU5HO1xuICAgICAgdmFyIHE7XG4gICAgICBmb3IgKHEgPSAwOyBxIDwgY291bnQ7IHErKykge1xuICAgICAgICB2YXIgdHJhbnNmb3JtID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybSArIChxIDw8IDIpXTtcbiAgICAgICAgdmFyIGltZyA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXTtcbiAgICAgICAgaWYgKGN1cnJlbnRYICsgaW1nLndpZHRoID4gTUFYX1dJRFRIKSB7XG4gICAgICAgICAgLy8gc3RhcnRpbmcgbmV3IGxpbmVcbiAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpO1xuICAgICAgICAgIGN1cnJlbnRZICs9IG1heExpbmVIZWlnaHQgKyAyICogSU1BR0VfUEFERElORztcbiAgICAgICAgICBjdXJyZW50WCA9IDA7XG4gICAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICB4OiBjdXJyZW50WCxcbiAgICAgICAgICB5OiBjdXJyZW50WSxcbiAgICAgICAgICB3OiBpbWcud2lkdGgsXG4gICAgICAgICAgaDogaW1nLmhlaWdodCxcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRYICs9IGltZy53aWR0aCArIDIgKiBJTUFHRV9QQURESU5HO1xuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgaW1nLmhlaWdodCk7XG4gICAgICB9XG4gICAgICB2YXIgaW1nV2lkdGggPSBNYXRoLm1heChtYXhYLCBjdXJyZW50WCkgKyBJTUFHRV9QQURESU5HO1xuICAgICAgdmFyIGltZ0hlaWdodCA9IGN1cnJlbnRZICsgbWF4TGluZUhlaWdodCArIElNQUdFX1BBRERJTkc7XG4gICAgICB2YXIgaW1nRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdXaWR0aCAqIGltZ0hlaWdodCAqIDQpO1xuICAgICAgdmFyIGltZ1Jvd1NpemUgPSBpbWdXaWR0aCA8PCAyO1xuICAgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyspIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF0uZGF0YTtcbiAgICAgICAgLy8gQ29weSBpbWFnZSBieSBsaW5lcyBhbmQgZXh0ZW5kcyBwaXhlbHMgaW50byBwYWRkaW5nLlxuICAgICAgICB2YXIgcm93U2l6ZSA9IG1hcFtxXS53IDw8IDI7XG4gICAgICAgIHZhciBkYXRhT2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldCA9IChtYXBbcV0ueCArIG1hcFtxXS55ICogaW1nV2lkdGgpIDw8IDI7XG4gICAgICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoMCwgcm93U2l6ZSksIG9mZnNldCAtIGltZ1Jvd1NpemUpO1xuICAgICAgICBmb3IgKHZhciBrID0gMCwga2sgPSBtYXBbcV0uaDsgayA8IGtrOyBrKyspIHtcbiAgICAgICAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KGRhdGFPZmZzZXQsIGRhdGFPZmZzZXQgKyByb3dTaXplKSwgb2Zmc2V0KTtcbiAgICAgICAgICBkYXRhT2Zmc2V0ICs9IHJvd1NpemU7XG4gICAgICAgICAgb2Zmc2V0ICs9IGltZ1Jvd1NpemU7XG4gICAgICAgIH1cbiAgICAgICAgaW1nRGF0YS5zZXQoZGF0YS5zdWJhcnJheShkYXRhT2Zmc2V0IC0gcm93U2l6ZSwgZGF0YU9mZnNldCksIG9mZnNldCk7XG4gICAgICAgIHdoaWxlIChvZmZzZXQgPj0gMCkge1xuICAgICAgICAgIGRhdGFbb2Zmc2V0IC0gNF0gPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgZGF0YVtvZmZzZXQgLSAzXSA9IGRhdGFbb2Zmc2V0ICsgMV07XG4gICAgICAgICAgZGF0YVtvZmZzZXQgLSAyXSA9IGRhdGFbb2Zmc2V0ICsgMl07XG4gICAgICAgICAgZGF0YVtvZmZzZXQgLSAxXSA9IGRhdGFbb2Zmc2V0ICsgM107XG4gICAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDRdO1xuICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSArIDFdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gM107XG4gICAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMl0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAyXTtcbiAgICAgICAgICBkYXRhW29mZnNldCArIHJvd1NpemUgKyAzXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDFdO1xuICAgICAgICAgIG9mZnNldCAtPSBpbWdSb3dTaXplO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcGxhY2UgcXVldWUgaXRlbXMuXG4gICAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKTtcbiAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aDogaW1nV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBpbWdIZWlnaHQsXG4gICAgICAgICAga2luZDogSW1hZ2VLaW5kLlJHQkFfMzJCUFAsXG4gICAgICAgICAgZGF0YTogaW1nRGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgbWFwLFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiBpRmlyc3RTYXZlICsgMTtcbiAgICB9XG4gICk7XG5cbiAgLy8gVGhpcyByZXBsYWNlcyAoc2F2ZSwgdHJhbnNmb3JtLCBwYWludEltYWdlTWFza1hPYmplY3QsIHJlc3RvcmUpK1xuICAvLyBzZXF1ZW5jZXMgd2l0aCBvbmUgfHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwfCBvciBvbmVcbiAgLy8gfHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdHwgb3BlcmF0aW9uLlxuICBhZGRTdGF0ZShcbiAgICBJbml0aWFsU3RhdGUsXG4gICAgW09QUy5zYXZlLCBPUFMudHJhbnNmb3JtLCBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBPUFMucmVzdG9yZV0sXG4gICAgbnVsbCxcbiAgICBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkge1xuICAgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXk7XG4gICAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzO1xuICAgICAgdmFyIHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0O1xuICAgICAgc3dpdGNoIChwb3MpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2F2ZTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMudHJhbnNmb3JtO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5wYWludEltYWdlTWFza1hPYmplY3Q7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnJlc3RvcmU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbWFnZU1hc2tHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uIGZvdW5kSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkge1xuICAgICAgdmFyIE1JTl9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDtcbiAgICAgIHZhciBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTAwO1xuICAgICAgdmFyIE1BWF9TQU1FX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwMDA7XG5cbiAgICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LFxuICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTtcbiAgICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjtcbiAgICAgIHZhciBpRmlyc3RTYXZlID0gY3VyciAtIDM7XG4gICAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7XG4gICAgICB2YXIgaUZpcnN0UElNWE8gPSBjdXJyIC0gMTtcblxuICAgICAgLy8gQXQgdGhpcyBwb2ludCwgaSBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9wIHBhc3QgdGhlIGxhc3QgdmFsaWRcbiAgICAgIC8vIHF1YXJ0ZXQuXG4gICAgICB2YXIgY291bnQgPSBNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KTtcbiAgICAgIGNvdW50ID0gaGFuZGxlUGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKFxuICAgICAgICBpRmlyc3RTYXZlLFxuICAgICAgICBjb3VudCxcbiAgICAgICAgZm5BcnJheSxcbiAgICAgICAgYXJnc0FycmF5XG4gICAgICApO1xuICAgICAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSykge1xuICAgICAgICByZXR1cm4gaSAtICgoaSAtIGlGaXJzdFNhdmUpICUgNCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBxO1xuICAgICAgdmFyIGlzU2FtZUltYWdlID0gZmFsc2U7XG4gICAgICB2YXIgaVRyYW5zZm9ybSwgdHJhbnNmb3JtQXJncztcbiAgICAgIHZhciBmaXJzdFBJTVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSU1YT11bMF07XG4gICAgICBjb25zdCBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXSxcbiAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmcxID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMV0sXG4gICAgICAgIGZpcnN0VHJhbnNmb3JtQXJnMiA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdLFxuICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzMgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVszXTtcblxuICAgICAgaWYgKGZpcnN0VHJhbnNmb3JtQXJnMSA9PT0gZmlyc3RUcmFuc2Zvcm1BcmcyKSB7XG4gICAgICAgIGlzU2FtZUltYWdlID0gdHJ1ZTtcbiAgICAgICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybSArIDQ7XG4gICAgICAgIHZhciBpUElNWE8gPSBpRmlyc3RQSU1YTyArIDQ7XG4gICAgICAgIGZvciAocSA9IDE7IHEgPCBjb3VudDsgcSsrLCBpVHJhbnNmb3JtICs9IDQsIGlQSU1YTyArPSA0KSB7XG4gICAgICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhcmdzQXJyYXlbaVBJTVhPXVswXSAhPT0gZmlyc3RQSU1YT0FyZzAgfHxcbiAgICAgICAgICAgIHRyYW5zZm9ybUFyZ3NbMF0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMCB8fFxuICAgICAgICAgICAgdHJhbnNmb3JtQXJnc1sxXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcxIHx8XG4gICAgICAgICAgICB0cmFuc2Zvcm1BcmdzWzJdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzIgfHxcbiAgICAgICAgICAgIHRyYW5zZm9ybUFyZ3NbM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHEgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7XG4gICAgICAgICAgICAgIGlzU2FtZUltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb3VudCA9IHE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhazsgLy8gZGlmZmVyZW50IGltYWdlIG9yIHRyYW5zZm9ybVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNTYW1lSW1hZ2UpIHtcbiAgICAgICAgY291bnQgPSBNYXRoLm1pbihjb3VudCwgTUFYX1NBTUVfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTtcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTtcbiAgICAgICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTtcbiAgICAgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCkge1xuICAgICAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaVRyYW5zZm9ybV07XG4gICAgICAgICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdO1xuICAgICAgICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcGxhY2UgcXVldWUgaXRlbXMuXG4gICAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCk7XG4gICAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbXG4gICAgICAgICAgZmlyc3RQSU1YT0FyZzAsXG4gICAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmcwLFxuICAgICAgICAgIGZpcnN0VHJhbnNmb3JtQXJnMSxcbiAgICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzIsXG4gICAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmczLFxuICAgICAgICAgIHBvc2l0aW9ucyxcbiAgICAgICAgXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTtcbiAgICAgICAgdmFyIGltYWdlcyA9IFtdO1xuICAgICAgICBmb3IgKHEgPSAwOyBxIDwgY291bnQ7IHErKykge1xuICAgICAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtICsgKHEgPDwgMildO1xuICAgICAgICAgIHZhciBtYXNrUGFyYW1zID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPICsgKHEgPDwgMildWzBdO1xuICAgICAgICAgIGltYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IG1hc2tQYXJhbXMuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiBtYXNrUGFyYW1zLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBtYXNrUGFyYW1zLmhlaWdodCxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtQXJncyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcGxhY2UgcXVldWUgaXRlbXMuXG4gICAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwKTtcbiAgICAgICAgYXJnc0FycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIFtpbWFnZXNdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxO1xuICAgIH1cbiAgKTtcblxuICAvLyBUaGlzIHJlcGxhY2VzIChzYXZlLCB0cmFuc2Zvcm0sIHBhaW50SW1hZ2VYT2JqZWN0LCByZXN0b3JlKSsgc2VxdWVuY2VzXG4gIC8vIHdpdGggb25lIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0IG9wZXJhdGlvbiwgaWYgdGhlIHx0cmFuc2Zvcm18IGFuZFxuICAvLyB8cGFpbnRJbWFnZVhPYmplY3RSZXBlYXR8IG9wcyBhcmUgYXBwcm9wcmlhdGUuXG4gIGFkZFN0YXRlKFxuICAgIEluaXRpYWxTdGF0ZSxcbiAgICBbT1BTLnNhdmUsIE9QUy50cmFuc2Zvcm0sIE9QUy5wYWludEltYWdlWE9iamVjdCwgT1BTLnJlc3RvcmVdLFxuICAgIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB2YXIgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7XG4gICAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY29udGV4dC5pQ3VyciAtIDI7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSA9PT0gMCAmJlxuICAgICAgICBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSA9PT0gMFxuICAgICAgKTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uIGl0ZXJhdGVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHtcbiAgICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LFxuICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTtcbiAgICAgIHZhciBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7XG4gICAgICB2YXIgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7XG4gICAgICBzd2l0Y2ggKHBvcykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zYXZlO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IE9QUy50cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyO1xuICAgICAgICAgIHZhciBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXTtcbiAgICAgICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYXJnc0FycmF5W2ldWzBdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzAgfHxcbiAgICAgICAgICAgIGFyZ3NBcnJheVtpXVsxXSAhPT0gMCB8fFxuICAgICAgICAgICAgYXJnc0FycmF5W2ldWzJdICE9PSAwIHx8XG4gICAgICAgICAgICBhcmdzQXJyYXlbaV1bM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB0cmFuc2Zvcm1zIGRvbid0IG1hdGNoXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IE9QUy5wYWludEltYWdlWE9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaUZpcnN0UElYTyA9IGNvbnRleHQuaUN1cnIgLSAxO1xuICAgICAgICAgIHZhciBmaXJzdFBJWE9BcmcwID0gYXJnc0FycmF5W2lGaXJzdFBJWE9dWzBdO1xuICAgICAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0UElYT0FyZzApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gaW1hZ2VzIGRvbid0IG1hdGNoXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjb250ZXh0LCBpKSB7XG4gICAgICB2YXIgTUlOX0lNQUdFU19JTl9CTE9DSyA9IDM7XG4gICAgICB2YXIgTUFYX0lNQUdFU19JTl9CTE9DSyA9IDEwMDA7XG5cbiAgICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LFxuICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTtcbiAgICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjtcbiAgICAgIHZhciBpRmlyc3RTYXZlID0gY3VyciAtIDM7XG4gICAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7XG4gICAgICB2YXIgaUZpcnN0UElYTyA9IGN1cnIgLSAxO1xuICAgICAgdmFyIGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07XG4gICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF07XG4gICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGkgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvcCBwYXN0IHRoZSBsYXN0IHZhbGlkXG4gICAgICAvLyBxdWFydGV0LlxuICAgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGguZmxvb3IoKGkgLSBpRmlyc3RTYXZlKSAvIDQpLFxuICAgICAgICBNQVhfSU1BR0VTX0lOX0JMT0NLXG4gICAgICApO1xuICAgICAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9CTE9DSykge1xuICAgICAgICByZXR1cm4gaSAtICgoaSAtIGlGaXJzdFNhdmUpICUgNCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgdGhlICh4LHkpIHBvc2l0aW9ucyBmcm9tIGFsbCBvZiB0aGUgbWF0Y2hpbmcgdHJhbnNmb3Jtcy5cbiAgICAgIHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gICAgICB2YXIgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTtcbiAgICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0KSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dO1xuICAgICAgICBwb3NpdGlvbnNbcSA8PCAxXSA9IHRyYW5zZm9ybUFyZ3NbNF07XG4gICAgICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVwbGFjZSBxdWV1ZSBpdGVtcy5cbiAgICAgIHZhciBhcmdzID0gW1xuICAgICAgICBmaXJzdFBJWE9BcmcwLFxuICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzAsXG4gICAgICAgIGZpcnN0VHJhbnNmb3JtQXJnMyxcbiAgICAgICAgcG9zaXRpb25zLFxuICAgICAgXTtcbiAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KTtcbiAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBhcmdzKTtcblxuICAgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxO1xuICAgIH1cbiAgKTtcblxuICAvLyBUaGlzIHJlcGxhY2VzIChiZWdpblRleHQsIHNldEZvbnQsIHNldFRleHRNYXRyaXgsIHNob3dUZXh0LCBlbmRUZXh0KStcbiAgLy8gc2VxdWVuY2VzIHdpdGggKGJlZ2luVGV4dCwgc2V0Rm9udCwgKHNldFRleHRNYXRyaXgsIHNob3dUZXh0KSssIGVuZFRleHQpK1xuICAvLyBzZXF1ZW5jZXMsIGlmIHRoZSBmb250IGZvciBlYWNoIG9uZSBpcyB0aGUgc2FtZS5cbiAgYWRkU3RhdGUoXG4gICAgSW5pdGlhbFN0YXRlLFxuICAgIFtPUFMuYmVnaW5UZXh0LCBPUFMuc2V0Rm9udCwgT1BTLnNldFRleHRNYXRyaXgsIE9QUy5zaG93VGV4dCwgT1BTLmVuZFRleHRdLFxuICAgIG51bGwsXG4gICAgZnVuY3Rpb24gaXRlcmF0ZVNob3dUZXh0R3JvdXAoY29udGV4dCwgaSkge1xuICAgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksXG4gICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5O1xuICAgICAgdmFyIGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gNDtcbiAgICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNTtcbiAgICAgIHN3aXRjaCAocG9zKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLmJlZ2luVGV4dDtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2V0Rm9udDtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2V0VGV4dE1hdHJpeDtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGlmIChmbkFycmF5W2ldICE9PSBPUFMuc2hvd1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGlGaXJzdFNldEZvbnQgPSBjb250ZXh0LmlDdXJyIC0gMztcbiAgICAgICAgICB2YXIgZmlyc3RTZXRGb250QXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVswXTtcbiAgICAgICAgICB2YXIgZmlyc3RTZXRGb250QXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVsxXTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0U2V0Rm9udEFyZzAgfHxcbiAgICAgICAgICAgIGFyZ3NBcnJheVtpXVsxXSAhPT0gZmlyc3RTZXRGb250QXJnMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBmb250cyBkb24ndCBtYXRjaFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuZW5kVGV4dDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZVNob3dUZXh0R3JvdXAgLSBpbnZhbGlkIHBvczogJHtwb3N9YCk7XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoY29udGV4dCwgaSkge1xuICAgICAgdmFyIE1JTl9DSEFSU19JTl9CTE9DSyA9IDM7XG4gICAgICB2YXIgTUFYX0NIQVJTX0lOX0JMT0NLID0gMTAwMDtcblxuICAgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksXG4gICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5O1xuICAgICAgdmFyIGN1cnIgPSBjb250ZXh0LmlDdXJyO1xuICAgICAgdmFyIGlGaXJzdEJlZ2luVGV4dCA9IGN1cnIgLSA0O1xuICAgICAgdmFyIGlGaXJzdFNldEZvbnQgPSBjdXJyIC0gMztcbiAgICAgIHZhciBpRmlyc3RTZXRUZXh0TWF0cml4ID0gY3VyciAtIDI7XG4gICAgICB2YXIgaUZpcnN0U2hvd1RleHQgPSBjdXJyIC0gMTtcbiAgICAgIHZhciBpRmlyc3RFbmRUZXh0ID0gY3VycjtcbiAgICAgIHZhciBmaXJzdFNldEZvbnRBcmcwID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzBdO1xuICAgICAgdmFyIGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGkgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvcCBwYXN0IHRoZSBsYXN0IHZhbGlkXG4gICAgICAvLyBxdWludGV0LlxuICAgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGguZmxvb3IoKGkgLSBpRmlyc3RCZWdpblRleHQpIC8gNSksXG4gICAgICAgIE1BWF9DSEFSU19JTl9CTE9DS1xuICAgICAgKTtcbiAgICAgIGlmIChjb3VudCA8IE1JTl9DSEFSU19JTl9CTE9DSykge1xuICAgICAgICByZXR1cm4gaSAtICgoaSAtIGlGaXJzdEJlZ2luVGV4dCkgJSA1KTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHByZWNlZGluZyBxdWludGV0IGlzICg8c29tZXRoaW5nPiwgc2V0Rm9udCwgc2V0VGV4dE1hdHJpeCxcbiAgICAgIC8vIHNob3dUZXh0LCBlbmRUZXh0KSwgaW5jbHVkZSB0aGF0IGFzIHdlbGwuIChFLmcuIDxzb21ldGhpbmc+IG1pZ2h0IGJlXG4gICAgICAvLyB8ZGVwZW5kZW5jeXwuKVxuICAgICAgdmFyIGlGaXJzdCA9IGlGaXJzdEJlZ2luVGV4dDtcbiAgICAgIGlmIChcbiAgICAgICAgaUZpcnN0QmVnaW5UZXh0ID49IDQgJiZcbiAgICAgICAgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XSA9PT0gZm5BcnJheVtpRmlyc3RTZXRGb250XSAmJlxuICAgICAgICBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDNdID09PSBmbkFycmF5W2lGaXJzdFNldFRleHRNYXRyaXhdICYmXG4gICAgICAgIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMl0gPT09IGZuQXJyYXlbaUZpcnN0U2hvd1RleHRdICYmXG4gICAgICAgIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMV0gPT09IGZuQXJyYXlbaUZpcnN0RW5kVGV4dF0gJiZcbiAgICAgICAgYXJnc0FycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdWzBdID09PSBmaXJzdFNldEZvbnRBcmcwICYmXG4gICAgICAgIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVsxXSA9PT0gZmlyc3RTZXRGb250QXJnMVxuICAgICAgKSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlGaXJzdCAtPSA1O1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgKGVuZFRleHQsIGJlZ2luVGV4dCwgc2V0Rm9udCkgdHJpb3MuXG4gICAgICB2YXIgaUVuZFRleHQgPSBpRmlyc3QgKyA0O1xuICAgICAgZm9yICh2YXIgcSA9IDE7IHEgPCBjb3VudDsgcSsrKSB7XG4gICAgICAgIGZuQXJyYXkuc3BsaWNlKGlFbmRUZXh0LCAzKTtcbiAgICAgICAgYXJnc0FycmF5LnNwbGljZShpRW5kVGV4dCwgMyk7XG4gICAgICAgIGlFbmRUZXh0ICs9IDI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpRW5kVGV4dCArIDE7XG4gICAgfVxuICApO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUXVldWVPcHRpbWl6ZXIocXVldWUpIHtcbiAgICB0aGlzLnF1ZXVlID0gcXVldWU7XG4gICAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgaUN1cnI6IDAsXG4gICAgICBmbkFycmF5OiBxdWV1ZS5mbkFycmF5LFxuICAgICAgYXJnc0FycmF5OiBxdWV1ZS5hcmdzQXJyYXksXG4gICAgfTtcbiAgICB0aGlzLm1hdGNoID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSAwO1xuICB9XG5cbiAgUXVldWVPcHRpbWl6ZXIucHJvdG90eXBlID0ge1xuICAgIF9vcHRpbWl6ZSgpIHtcbiAgICAgIC8vIFByb2Nlc3MgbmV3IGZuQXJyYXkgaXRlbShzKSBjaHVuay5cbiAgICAgIGNvbnN0IGZuQXJyYXkgPSB0aGlzLnF1ZXVlLmZuQXJyYXk7XG4gICAgICBsZXQgaSA9IHRoaXMubGFzdFByb2Nlc3NlZCxcbiAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDtcbiAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICBsZXQgbWF0Y2ggPSB0aGlzLm1hdGNoO1xuICAgICAgaWYgKCFzdGF0ZSAmJiAhbWF0Y2ggJiYgaSArIDEgPT09IGlpICYmICFJbml0aWFsU3RhdGVbZm5BcnJheVtpXV0pIHtcbiAgICAgICAgLy8gTWljcm8tb3B0aW1pemF0aW9uIGZvciB0aGUgY29tbW9uIGNhc2U6IGxhc3QgaXRlbSBpcyBub3RcbiAgICAgICAgLy8gb3B0aW1pemFibGUsIGp1c3Qgc2tpcHBpbmcgaXQuXG4gICAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGlpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICB3aGlsZSAoaSA8IGlpKSB7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIC8vIEFscmVhZHkgZmluZCBhIGJsb2NrIG9mIHBvdGVudGlhbGx5IG9wdGltaXphYmxlIGl0ZW1zLCBpdGVyYXRpbmcuLi5cbiAgICAgICAgICBjb25zdCBpdGVyYXRlID0gKDAsIG1hdGNoLml0ZXJhdGVGbikoY29udGV4dCwgaSk7XG4gICAgICAgICAgaWYgKGl0ZXJhdGUpIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGb3VuZCBsYXN0IGl0ZW1zIGZvciB0aGUgYmxvY2ssIHByb2Nlc3NpbmcuLi5cbiAgICAgICAgICBpID0gKDAsIG1hdGNoLnByb2Nlc3NGbikoY29udGV4dCwgaSArIDEpO1xuICAgICAgICAgIGlpID0gZm5BcnJheS5sZW5ndGg7XG4gICAgICAgICAgbWF0Y2ggPSBudWxsO1xuICAgICAgICAgIHN0YXRlID0gbnVsbDtcbiAgICAgICAgICBpZiAoaSA+PSBpaSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmQgdGhlIHBvdGVudGlhbGx5IG9wdGltaXphYmxlIGl0ZW1zLlxuICAgICAgICBzdGF0ZSA9IChzdGF0ZSB8fCBJbml0aWFsU3RhdGUpW2ZuQXJyYXlbaV1dO1xuICAgICAgICBpZiAoIXN0YXRlIHx8IEFycmF5LmlzQXJyYXkoc3RhdGUpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvdW5kIGEgc3RhcnQgb2YgdGhlIGJsb2NrIGJhc2VkIG9uIGFkZFN0YXRlIHJ1bGVzLlxuICAgICAgICBjb250ZXh0LmlDdXJyID0gaTtcbiAgICAgICAgaSsrO1xuICAgICAgICBpZiAoc3RhdGUuY2hlY2tGbiAmJiAhKDAsIHN0YXRlLmNoZWNrRm4pKGNvbnRleHQpKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgZmFpbGVkLCBjb250aW51ZSBzZWFyY2guLi5cbiAgICAgICAgICBzdGF0ZSA9IG51bGw7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWF0Y2ggPSBzdGF0ZTtcbiAgICAgICAgc3RhdGUgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoO1xuICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gaTtcbiAgICB9LFxuXG4gICAgcHVzaChmbiwgYXJncykge1xuICAgICAgdGhpcy5xdWV1ZS5mbkFycmF5LnB1c2goZm4pO1xuICAgICAgdGhpcy5xdWV1ZS5hcmdzQXJyYXkucHVzaChhcmdzKTtcbiAgICAgIHRoaXMuX29wdGltaXplKCk7XG4gICAgfSxcblxuICAgIGZsdXNoKCkge1xuICAgICAgd2hpbGUgKHRoaXMubWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gKDAsIHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsIGxlbmd0aCk7XG4gICAgICAgIHRoaXMubWF0Y2ggPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgICAgICAgLy8gUmVwZWF0IG9wdGltaXphdGlvbiB1bnRpbCBhbGwgY2h1bmtzIGFyZSBleGhhdXN0ZWQuXG4gICAgICAgIHRoaXMuX29wdGltaXplKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLm1hdGNoID0gbnVsbDtcbiAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIFF1ZXVlT3B0aW1pemVyO1xufSkoKTtcblxudmFyIE51bGxPcHRpbWl6ZXIgPSAoZnVuY3Rpb24gTnVsbE9wdGltaXplckNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gTnVsbE9wdGltaXplcihxdWV1ZSkge1xuICAgIHRoaXMucXVldWUgPSBxdWV1ZTtcbiAgfVxuXG4gIE51bGxPcHRpbWl6ZXIucHJvdG90eXBlID0ge1xuICAgIHB1c2goZm4sIGFyZ3MpIHtcbiAgICAgIHRoaXMucXVldWUuZm5BcnJheS5wdXNoKGZuKTtcbiAgICAgIHRoaXMucXVldWUuYXJnc0FycmF5LnB1c2goYXJncyk7XG4gICAgfSxcblxuICAgIGZsdXNoKCkge30sXG5cbiAgICByZXNldCgpIHt9LFxuICB9O1xuXG4gIHJldHVybiBOdWxsT3B0aW1pemVyO1xufSkoKTtcblxudmFyIE9wZXJhdG9yTGlzdCA9IChmdW5jdGlvbiBPcGVyYXRvckxpc3RDbG9zdXJlKCkge1xuICB2YXIgQ0hVTktfU0laRSA9IDEwMDA7XG4gIHZhciBDSFVOS19TSVpFX0FCT1VUID0gQ0hVTktfU0laRSAtIDU7IC8vIGNsb3NlIHRvIGNodW5rIHNpemVcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE9wZXJhdG9yTGlzdChpbnRlbnQsIHN0cmVhbVNpbmspIHtcbiAgICB0aGlzLl9zdHJlYW1TaW5rID0gc3RyZWFtU2luaztcbiAgICB0aGlzLmZuQXJyYXkgPSBbXTtcbiAgICB0aGlzLmFyZ3NBcnJheSA9IFtdO1xuICAgIGlmIChzdHJlYW1TaW5rICYmIGludGVudCAhPT0gXCJvcGxpc3RcIikge1xuICAgICAgdGhpcy5vcHRpbWl6ZXIgPSBuZXcgUXVldWVPcHRpbWl6ZXIodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW1pemVyID0gbmV3IE51bGxPcHRpbWl6ZXIodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB0aGlzLndlaWdodCA9IDA7XG4gICAgdGhpcy5fcmVzb2x2ZWQgPSBzdHJlYW1TaW5rID8gbnVsbCA6IFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgT3BlcmF0b3JMaXN0LnByb3RvdHlwZSA9IHtcbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJnc0FycmF5Lmxlbmd0aDtcbiAgICB9LFxuXG4gICAgZ2V0IHJlYWR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkIHx8IHRoaXMuX3N0cmVhbVNpbmsucmVhZHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9IFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGVudGlyZSBvcGVyYXRvciBsaXN0LCBzaW5jZVxuICAgICAqICAgICAgICAgICAgICAgIGB0aGlzLmxlbmd0aCA9PT0gMGAgYWZ0ZXIgZmx1c2hpbmcuXG4gICAgICovXG4gICAgZ2V0IHRvdGFsTGVuZ3RoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsTGVuZ3RoICsgdGhpcy5sZW5ndGg7XG4gICAgfSxcblxuICAgIGFkZE9wKGZuLCBhcmdzKSB7XG4gICAgICB0aGlzLm9wdGltaXplci5wdXNoKGZuLCBhcmdzKTtcbiAgICAgIHRoaXMud2VpZ2h0Kys7XG4gICAgICBpZiAodGhpcy5fc3RyZWFtU2luaykge1xuICAgICAgICBpZiAodGhpcy53ZWlnaHQgPj0gQ0hVTktfU0laRSkge1xuICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLndlaWdodCA+PSBDSFVOS19TSVpFX0FCT1VUICYmXG4gICAgICAgICAgKGZuID09PSBPUFMucmVzdG9yZSB8fCBmbiA9PT0gT1BTLmVuZFRleHQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGhldXJpc3RpYyB0byBmbHVzaCBvbiBib3VuZGFyeSBvZiByZXN0b3JlIG9yIGVuZFRleHRcbiAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KSB7XG4gICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgIHRoaXMuYWRkT3AoT1BTLmRlcGVuZGVuY3ksIFtkZXBlbmRlbmN5XSk7XG4gICAgfSxcblxuICAgIGFkZERlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgdGhpcy5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRPcExpc3Qob3BMaXN0KSB7XG4gICAgICBpZiAoIShvcExpc3QgaW5zdGFuY2VvZiBPcGVyYXRvckxpc3QpKSB7XG4gICAgICAgIHdhcm4oJ2FkZE9wTGlzdCAtIGlnbm9yaW5nIGludmFsaWQgXCJvcExpc3RcIiBwYXJhbWV0ZXIuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvcExpc3QuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG9wTGlzdC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkT3Aob3BMaXN0LmZuQXJyYXlbaV0sIG9wTGlzdC5hcmdzQXJyYXlbaV0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRJUigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZuQXJyYXk6IHRoaXMuZm5BcnJheSxcbiAgICAgICAgYXJnc0FycmF5OiB0aGlzLmFyZ3NBcnJheSxcbiAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aCxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGdldCBfdHJhbnNmZXJzKCkge1xuICAgICAgY29uc3QgdHJhbnNmZXJzID0gW107XG4gICAgICBjb25zdCB7IGZuQXJyYXksIGFyZ3NBcnJheSwgbGVuZ3RoIH0gPSB0aGlzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBzd2l0Y2ggKGZuQXJyYXlbaV0pIHtcbiAgICAgICAgICBjYXNlIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdDpcbiAgICAgICAgICBjYXNlIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOlxuICAgICAgICAgIGNhc2UgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDpcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NBcnJheVtpXVswXTsgLy8gZmlyc3QgcGFyYW0gaW4gaW1nRGF0YVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgICBhcmcuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAgICAgICAgICdPcGVyYXRvckxpc3QuX3RyYW5zZmVyczogVW5zdXBwb3J0ZWQgXCJhcmcuZGF0YVwiIHR5cGUuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhcmcuY2FjaGVkKSB7XG4gICAgICAgICAgICAgIHRyYW5zZmVycy5wdXNoKGFyZy5kYXRhLmJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRyYW5zZmVycztcbiAgICB9LFxuXG4gICAgZmx1c2gobGFzdENodW5rID0gZmFsc2UpIHtcbiAgICAgIHRoaXMub3B0aW1pemVyLmZsdXNoKCk7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IGxlbmd0aDtcblxuICAgICAgdGhpcy5fc3RyZWFtU2luay5lbnF1ZXVlKFxuICAgICAgICB7XG4gICAgICAgICAgZm5BcnJheTogdGhpcy5mbkFycmF5LFxuICAgICAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksXG4gICAgICAgICAgbGFzdENodW5rLFxuICAgICAgICAgIGxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgICAgMSxcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJzXG4gICAgICApO1xuXG4gICAgICB0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO1xuICAgICAgdGhpcy5mbkFycmF5Lmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmFyZ3NBcnJheS5sZW5ndGggPSAwO1xuICAgICAgdGhpcy53ZWlnaHQgPSAwO1xuICAgICAgdGhpcy5vcHRpbWl6ZXIucmVzZXQoKTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBPcGVyYXRvckxpc3Q7XG59KSgpO1xuXG5leHBvcnQgeyBPcGVyYXRvckxpc3QgfTtcbiIsIi8qIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgYnl0ZXNUb1N0cmluZywgZXNjYXBlU3RyaW5nIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBEaWN0LCBpc0RpY3QsIGlzTmFtZSwgaXNSZWYsIGlzU3RyZWFtLCBOYW1lIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlTUQ1IH0gZnJvbSBcIi4vY3J5cHRvLmpzXCI7XG5cbmZ1bmN0aW9uIHdyaXRlRGljdChkaWN0LCBidWZmZXIsIHRyYW5zZm9ybSkge1xuICBidWZmZXIucHVzaChcIjw8XCIpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkaWN0LmdldEtleXMoKSkge1xuICAgIGJ1ZmZlci5wdXNoKGAgLyR7a2V5fSBgKTtcbiAgICB3cml0ZVZhbHVlKGRpY3QuZ2V0UmF3KGtleSksIGJ1ZmZlciwgdHJhbnNmb3JtKTtcbiAgfVxuICBidWZmZXIucHVzaChcIj4+XCIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVN0cmVhbShzdHJlYW0sIGJ1ZmZlciwgdHJhbnNmb3JtKSB7XG4gIHdyaXRlRGljdChzdHJlYW0uZGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pO1xuICBidWZmZXIucHVzaChcIiBzdHJlYW1cXG5cIik7XG4gIGxldCBzdHJpbmcgPSBieXRlc1RvU3RyaW5nKHN0cmVhbS5nZXRCeXRlcygpKTtcbiAgaWYgKHRyYW5zZm9ybSAhPT0gbnVsbCkge1xuICAgIHN0cmluZyA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHN0cmluZyk7XG4gIH1cbiAgYnVmZmVyLnB1c2goc3RyaW5nKTtcbiAgYnVmZmVyLnB1c2goXCJcXG5lbmRzdHJlYW1cXG5cIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQXJyYXkoYXJyYXksIGJ1ZmZlciwgdHJhbnNmb3JtKSB7XG4gIGJ1ZmZlci5wdXNoKFwiW1wiKTtcbiAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgZm9yIChjb25zdCB2YWwgb2YgYXJyYXkpIHtcbiAgICBpZiAoIWZpcnN0KSB7XG4gICAgICBidWZmZXIucHVzaChcIiBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHdyaXRlVmFsdWUodmFsLCBidWZmZXIsIHRyYW5zZm9ybSk7XG4gIH1cbiAgYnVmZmVyLnB1c2goXCJdXCIpO1xufVxuXG5mdW5jdGlvbiBudW1iZXJUb1N0cmluZyh2YWx1ZSkge1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGNvbnN0IHJvdW5kZWRWYWx1ZSA9IE1hdGgucm91bmQodmFsdWUgKiAxMDApO1xuICBpZiAocm91bmRlZFZhbHVlICUgMTAwID09PSAwKSB7XG4gICAgcmV0dXJuIChyb3VuZGVkVmFsdWUgLyAxMDApLnRvU3RyaW5nKCk7XG4gIH1cblxuICBpZiAocm91bmRlZFZhbHVlICUgMTAgPT09IDApIHtcbiAgICByZXR1cm4gdmFsdWUudG9GaXhlZCgxKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS50b0ZpeGVkKDIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVZhbHVlKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSkge1xuICBpZiAoaXNOYW1lKHZhbHVlKSkge1xuICAgIGJ1ZmZlci5wdXNoKGAvJHt2YWx1ZS5uYW1lfWApO1xuICB9IGVsc2UgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgIGJ1ZmZlci5wdXNoKGAke3ZhbHVlLm51bX0gJHt2YWx1ZS5nZW59IFJgKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHdyaXRlQXJyYXkodmFsdWUsIGJ1ZmZlciwgdHJhbnNmb3JtKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAodHJhbnNmb3JtICE9PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgYnVmZmVyLnB1c2goYCgke2VzY2FwZVN0cmluZyh2YWx1ZSl9KWApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGJ1ZmZlci5wdXNoKG51bWJlclRvU3RyaW5nKHZhbHVlKSk7XG4gIH0gZWxzZSBpZiAoaXNEaWN0KHZhbHVlKSkge1xuICAgIHdyaXRlRGljdCh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pO1xuICB9IGVsc2UgaWYgKGlzU3RyZWFtKHZhbHVlKSkge1xuICAgIHdyaXRlU3RyZWFtKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVJbnQobnVtYmVyLCBzaXplLCBvZmZzZXQsIGJ1ZmZlcikge1xuICBmb3IgKGxldCBpID0gc2l6ZSArIG9mZnNldCAtIDE7IGkgPiBvZmZzZXQgLSAxOyBpLS0pIHtcbiAgICBidWZmZXJbaV0gPSBudW1iZXIgJiAweGZmO1xuICAgIG51bWJlciA+Pj0gODtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTtcbn1cblxuZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyaW5nLCBvZmZzZXQsIGJ1ZmZlcikge1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmZmVyW29mZnNldCArIGldID0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVNRDUoZmlsZXNpemUsIHhyZWZJbmZvKSB7XG4gIGNvbnN0IHRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgY29uc3QgZmlsZW5hbWUgPSB4cmVmSW5mby5maWxlbmFtZSB8fCBcIlwiO1xuICBjb25zdCBtZDVCdWZmZXIgPSBbdGltZS50b1N0cmluZygpLCBmaWxlbmFtZSwgZmlsZXNpemUudG9TdHJpbmcoKV07XG4gIGxldCBtZDVCdWZmZXJMZW4gPSBtZDVCdWZmZXIucmVkdWNlKChhLCBzdHIpID0+IGEgKyBzdHIubGVuZ3RoLCAwKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKHhyZWZJbmZvLmluZm8pKSB7XG4gICAgbWQ1QnVmZmVyLnB1c2godmFsdWUpO1xuICAgIG1kNUJ1ZmZlckxlbiArPSB2YWx1ZS5sZW5ndGg7XG4gIH1cblxuICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KG1kNUJ1ZmZlckxlbik7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IHN0ciBvZiBtZDVCdWZmZXIpIHtcbiAgICB3cml0ZVN0cmluZyhzdHIsIG9mZnNldCwgYXJyYXkpO1xuICAgIG9mZnNldCArPSBzdHIubGVuZ3RoO1xuICB9XG4gIHJldHVybiBieXRlc1RvU3RyaW5nKGNhbGN1bGF0ZU1ENShhcnJheSkpO1xufVxuXG5mdW5jdGlvbiBpbmNyZW1lbnRhbFVwZGF0ZShvcmlnaW5hbERhdGEsIHhyZWZJbmZvLCBuZXdSZWZzKSB7XG4gIGNvbnN0IG5ld1hyZWYgPSBuZXcgRGljdChudWxsKTtcbiAgY29uc3QgcmVmRm9yWHJlZlRhYmxlID0geHJlZkluZm8ubmV3UmVmO1xuXG4gIGxldCBidWZmZXIsIGJhc2VPZmZzZXQ7XG4gIGNvbnN0IGxhc3RCeXRlID0gb3JpZ2luYWxEYXRhW29yaWdpbmFsRGF0YS5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RCeXRlID09PSAvKiBcXG4gKi8gMHgwYSB8fCBsYXN0Qnl0ZSA9PT0gLyogXFxyICovIDB4MGQpIHtcbiAgICBidWZmZXIgPSBbXTtcbiAgICBiYXNlT2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICAvLyBBdm9pZCB0byBjb25jYXRlbmF0ZSAlJUVPRiB3aXRoIGFuIG9iamVjdCBkZWZpbml0aW9uXG4gICAgYnVmZmVyID0gW1wiXFxuXCJdO1xuICAgIGJhc2VPZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoICsgMTtcbiAgfVxuXG4gIG5ld1hyZWYuc2V0KFwiU2l6ZVwiLCByZWZGb3JYcmVmVGFibGUubnVtICsgMSk7XG4gIG5ld1hyZWYuc2V0KFwiUHJldlwiLCB4cmVmSW5mby5zdGFydFhSZWYpO1xuICBuZXdYcmVmLnNldChcIlR5cGVcIiwgTmFtZS5nZXQoXCJYUmVmXCIpKTtcblxuICBpZiAoeHJlZkluZm8ucm9vdFJlZiAhPT0gbnVsbCkge1xuICAgIG5ld1hyZWYuc2V0KFwiUm9vdFwiLCB4cmVmSW5mby5yb290UmVmKTtcbiAgfVxuICBpZiAoeHJlZkluZm8uaW5mb1JlZiAhPT0gbnVsbCkge1xuICAgIG5ld1hyZWYuc2V0KFwiSW5mb1wiLCB4cmVmSW5mby5pbmZvUmVmKTtcbiAgfVxuICBpZiAoeHJlZkluZm8uZW5jcnlwdCAhPT0gbnVsbCkge1xuICAgIG5ld1hyZWYuc2V0KFwiRW5jcnlwdFwiLCB4cmVmSW5mby5lbmNyeXB0KTtcbiAgfVxuXG4gIC8vIEFkZCBhIHJlZiBmb3IgdGhlIG5ldyB4cmVmIGFuZCBzb3J0IHRoZW1cbiAgbmV3UmVmcy5wdXNoKHsgcmVmOiByZWZGb3JYcmVmVGFibGUsIGRhdGE6IFwiXCIgfSk7XG4gIG5ld1JlZnMgPSBuZXdSZWZzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAvLyBjb21wYXJlIHRoZSByZWZzXG4gICAgcmV0dXJuIGEucmVmLm51bSAtIGIucmVmLm51bTtcbiAgfSk7XG5cbiAgY29uc3QgeHJlZlRhYmxlRGF0YSA9IFtbMCwgMSwgMHhmZmZmXV07XG4gIGNvbnN0IGluZGV4ZXMgPSBbMCwgMV07XG4gIGxldCBtYXhPZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IHsgcmVmLCBkYXRhIH0gb2YgbmV3UmVmcykge1xuICAgIG1heE9mZnNldCA9IE1hdGgubWF4KG1heE9mZnNldCwgYmFzZU9mZnNldCk7XG4gICAgeHJlZlRhYmxlRGF0YS5wdXNoKFsxLCBiYXNlT2Zmc2V0LCBNYXRoLm1pbihyZWYuZ2VuLCAweGZmZmYpXSk7XG4gICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgICBpbmRleGVzLnB1c2gocmVmLm51bSk7XG4gICAgaW5kZXhlcy5wdXNoKDEpO1xuICAgIGJ1ZmZlci5wdXNoKGRhdGEpO1xuICB9XG5cbiAgbmV3WHJlZi5zZXQoXCJJbmRleFwiLCBpbmRleGVzKTtcblxuICBpZiAoeHJlZkluZm8uZmlsZUlkcy5sZW5ndGggIT09IDApIHtcbiAgICBjb25zdCBtZDUgPSBjb21wdXRlTUQ1KGJhc2VPZmZzZXQsIHhyZWZJbmZvKTtcbiAgICBuZXdYcmVmLnNldChcIklEXCIsIFt4cmVmSW5mby5maWxlSWRzWzBdLCBtZDVdKTtcbiAgfVxuXG4gIGNvbnN0IG9mZnNldFNpemUgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKG1heE9mZnNldCkgLyA4KTtcbiAgY29uc3Qgc2l6ZXMgPSBbMSwgb2Zmc2V0U2l6ZSwgMl07XG4gIGNvbnN0IHN0cnVjdFNpemUgPSBzaXplc1swXSArIHNpemVzWzFdICsgc2l6ZXNbMl07XG4gIGNvbnN0IHRhYmxlTGVuZ3RoID0gc3RydWN0U2l6ZSAqIHhyZWZUYWJsZURhdGEubGVuZ3RoO1xuICBuZXdYcmVmLnNldChcIldcIiwgc2l6ZXMpO1xuICBuZXdYcmVmLnNldChcIkxlbmd0aFwiLCB0YWJsZUxlbmd0aCk7XG5cbiAgYnVmZmVyLnB1c2goYCR7cmVmRm9yWHJlZlRhYmxlLm51bX0gJHtyZWZGb3JYcmVmVGFibGUuZ2VufSBvYmpcXG5gKTtcbiAgd3JpdGVEaWN0KG5ld1hyZWYsIGJ1ZmZlciwgbnVsbCk7XG4gIGJ1ZmZlci5wdXNoKFwiIHN0cmVhbVxcblwiKTtcblxuICBjb25zdCBidWZmZXJMZW4gPSBidWZmZXIucmVkdWNlKChhLCBzdHIpID0+IGEgKyBzdHIubGVuZ3RoLCAwKTtcbiAgY29uc3QgZm9vdGVyID0gYFxcbmVuZHN0cmVhbVxcbmVuZG9ialxcbnN0YXJ0eHJlZlxcbiR7YmFzZU9mZnNldH1cXG4lJUVPRlxcbmA7XG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgb3JpZ2luYWxEYXRhLmxlbmd0aCArIGJ1ZmZlckxlbiArIHRhYmxlTGVuZ3RoICsgZm9vdGVyLmxlbmd0aFxuICApO1xuXG4gIC8vIE9yaWdpbmFsIGRhdGFcbiAgYXJyYXkuc2V0KG9yaWdpbmFsRGF0YSk7XG4gIGxldCBvZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoO1xuXG4gIC8vIE5ldyBkYXRhXG4gIGZvciAoY29uc3Qgc3RyIG9mIGJ1ZmZlcikge1xuICAgIHdyaXRlU3RyaW5nKHN0ciwgb2Zmc2V0LCBhcnJheSk7XG4gICAgb2Zmc2V0ICs9IHN0ci5sZW5ndGg7XG4gIH1cblxuICAvLyBOZXcgeHJlZiB0YWJsZVxuICBmb3IgKGNvbnN0IFt0eXBlLCBvYmpPZmZzZXQsIGdlbl0gb2YgeHJlZlRhYmxlRGF0YSkge1xuICAgIG9mZnNldCA9IHdyaXRlSW50KHR5cGUsIHNpemVzWzBdLCBvZmZzZXQsIGFycmF5KTtcbiAgICBvZmZzZXQgPSB3cml0ZUludChvYmpPZmZzZXQsIHNpemVzWzFdLCBvZmZzZXQsIGFycmF5KTtcbiAgICBvZmZzZXQgPSB3cml0ZUludChnZW4sIHNpemVzWzJdLCBvZmZzZXQsIGFycmF5KTtcbiAgfVxuXG4gIC8vIEFkZCB0aGUgZm9vdGVyXG4gIHdyaXRlU3RyaW5nKGZvb3Rlciwgb2Zmc2V0LCBhcnJheSk7XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgeyB3cml0ZURpY3QsIGluY3JlbWVudGFsVXBkYXRlIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQWJvcnRFeGNlcHRpb24sXG4gIGFzc2VydCxcbiAgQ01hcENvbXByZXNzaW9uVHlwZSxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG4gIEZPTlRfSURFTlRJVFlfTUFUUklYLFxuICBGb3JtYXRFcnJvcixcbiAgSURFTlRJVFlfTUFUUklYLFxuICBpbmZvLFxuICBpc0FycmF5RXF1YWwsXG4gIGlzTnVtLFxuICBpc1N0cmluZyxcbiAgT1BTLFxuICBzaGFkb3csXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICBUZXh0UmVuZGVyaW5nTW9kZSxcbiAgVU5TVVBQT1JURURfRkVBVFVSRVMsXG4gIFV0aWwsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgQ01hcEZhY3RvcnksIElkZW50aXR5Q01hcCB9IGZyb20gXCIuL2NtYXAuanNcIjtcbmltcG9ydCB7XG4gIENtZCxcbiAgRGljdCxcbiAgRU9GLFxuICBpc0RpY3QsXG4gIGlzTmFtZSxcbiAgaXNSZWYsXG4gIGlzU3RyZWFtLFxuICBOYW1lLFxuICBSZWYsXG4gIFJlZlNldCxcbn0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHtcbiAgRXJyb3JGb250LFxuICBGb250LFxuICBGb250RmxhZ3MsXG4gIGdldEZvbnRUeXBlLFxuICBJZGVudGl0eVRvVW5pY29kZU1hcCxcbiAgVG9Vbmljb2RlTWFwLFxufSBmcm9tIFwiLi9mb250cy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW5jb2RpbmcsXG4gIE1hY1JvbWFuRW5jb2RpbmcsXG4gIFN0YW5kYXJkRW5jb2RpbmcsXG4gIFN5bWJvbFNldEVuY29kaW5nLFxuICBXaW5BbnNpRW5jb2RpbmcsXG4gIFphcGZEaW5nYmF0c0VuY29kaW5nLFxufSBmcm9tIFwiLi9lbmNvZGluZ3MuanNcIjtcbmltcG9ydCB7IGdldExvb2t1cFRhYmxlRmFjdG9yeSwgTWlzc2luZ0RhdGFFeGNlcHRpb24gfSBmcm9tIFwiLi9jb3JlX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBnZXROb3JtYWxpemVkVW5pY29kZXMsXG4gIGdldFVuaWNvZGVGb3JHbHlwaCxcbiAgcmV2ZXJzZUlmUnRsLFxufSBmcm9tIFwiLi91bmljb2RlLmpzXCI7XG5pbXBvcnQge1xuICBnZXRTZXJpZkZvbnRzLFxuICBnZXRTdGRGb250TWFwLFxuICBnZXRTeW1ib2xzRm9udHMsXG59IGZyb20gXCIuL3N0YW5kYXJkX2ZvbnRzLmpzXCI7XG5pbXBvcnQgeyBnZXRUaWxpbmdQYXR0ZXJuSVIsIFBhdHRlcm4gfSBmcm9tIFwiLi9wYXR0ZXJuLmpzXCI7XG5pbXBvcnQgeyBpc1BERkZ1bmN0aW9uLCBQREZGdW5jdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9mdW5jdGlvbi5qc1wiO1xuaW1wb3J0IHsgTGV4ZXIsIFBhcnNlciB9IGZyb20gXCIuL3BhcnNlci5qc1wiO1xuaW1wb3J0IHtcbiAgTG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIExvY2FsR1N0YXRlQ2FjaGUsXG4gIExvY2FsSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4vaW1hZ2VfdXRpbHMuanNcIjtcbmltcG9ydCB7IGJpZGkgfSBmcm9tIFwiLi9iaWRpLmpzXCI7XG5pbXBvcnQgeyBDb2xvclNwYWNlIH0gZnJvbSBcIi4vY29sb3JzcGFjZS5qc1wiO1xuaW1wb3J0IHsgRGVjb2RlU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBnZXRHbHlwaHNVbmljb2RlIH0gZnJvbSBcIi4vZ2x5cGhsaXN0LmpzXCI7XG5pbXBvcnQgeyBnZXRNZXRyaWNzIH0gZnJvbSBcIi4vbWV0cmljcy5qc1wiO1xuaW1wb3J0IHsgTXVybXVySGFzaDNfNjQgfSBmcm9tIFwiLi9tdXJtdXJoYXNoMy5qc1wiO1xuaW1wb3J0IHsgT3BlcmF0b3JMaXN0IH0gZnJvbSBcIi4vb3BlcmF0b3JfbGlzdC5qc1wiO1xuaW1wb3J0IHsgUERGSW1hZ2UgfSBmcm9tIFwiLi9pbWFnZS5qc1wiO1xuXG5jb25zdCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgbWF4SW1hZ2VTaXplOiAtMSxcbiAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSxcbiAgaWdub3JlRXJyb3JzOiBmYWxzZSxcbiAgaXNFdmFsU3VwcG9ydGVkOiB0cnVlLFxuICBmb250RXh0cmFQcm9wZXJ0aWVzOiBmYWxzZSxcbn0pO1xuXG5jb25zdCBQYXR0ZXJuVHlwZSA9IHtcbiAgVElMSU5HOiAxLFxuICBTSEFESU5HOiAyLFxufTtcblxuY29uc3QgZGVmZXJyZWQgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuLy8gQ29udmVydCBQREYgYmxlbmQgbW9kZSBuYW1lcyB0byBIVE1MNSBibGVuZCBtb2RlIG5hbWVzLlxuZnVuY3Rpb24gbm9ybWFsaXplQmxlbmRNb2RlKHZhbHVlLCBwYXJzaW5nQXJyYXkgPSBmYWxzZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBVc2UgdGhlIGZpcnN0ICpzdXBwb3J0ZWQqIEJNIHZhbHVlIGluIHRoZSBBcnJheSAoZml4ZXMgaXNzdWUxMTI3OS5wZGYpLlxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IG1heWJlQk0gPSBub3JtYWxpemVCbGVuZE1vZGUodmFsdWVbaV0sIC8qIHBhcnNpbmdBcnJheSA9ICovIHRydWUpO1xuICAgICAgaWYgKG1heWJlQk0pIHtcbiAgICAgICAgcmV0dXJuIG1heWJlQk07XG4gICAgICB9XG4gICAgfVxuICAgIHdhcm4oYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGUgQXJyYXk6ICR7dmFsdWV9YCk7XG4gICAgcmV0dXJuIFwic291cmNlLW92ZXJcIjtcbiAgfVxuXG4gIGlmICghaXNOYW1lKHZhbHVlKSkge1xuICAgIGlmIChwYXJzaW5nQXJyYXkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gXCJzb3VyY2Utb3ZlclwiO1xuICB9XG4gIHN3aXRjaCAodmFsdWUubmFtZSkge1xuICAgIGNhc2UgXCJOb3JtYWxcIjpcbiAgICBjYXNlIFwiQ29tcGF0aWJsZVwiOlxuICAgICAgcmV0dXJuIFwic291cmNlLW92ZXJcIjtcbiAgICBjYXNlIFwiTXVsdGlwbHlcIjpcbiAgICAgIHJldHVybiBcIm11bHRpcGx5XCI7XG4gICAgY2FzZSBcIlNjcmVlblwiOlxuICAgICAgcmV0dXJuIFwic2NyZWVuXCI7XG4gICAgY2FzZSBcIk92ZXJsYXlcIjpcbiAgICAgIHJldHVybiBcIm92ZXJsYXlcIjtcbiAgICBjYXNlIFwiRGFya2VuXCI6XG4gICAgICByZXR1cm4gXCJkYXJrZW5cIjtcbiAgICBjYXNlIFwiTGlnaHRlblwiOlxuICAgICAgcmV0dXJuIFwibGlnaHRlblwiO1xuICAgIGNhc2UgXCJDb2xvckRvZGdlXCI6XG4gICAgICByZXR1cm4gXCJjb2xvci1kb2RnZVwiO1xuICAgIGNhc2UgXCJDb2xvckJ1cm5cIjpcbiAgICAgIHJldHVybiBcImNvbG9yLWJ1cm5cIjtcbiAgICBjYXNlIFwiSGFyZExpZ2h0XCI6XG4gICAgICByZXR1cm4gXCJoYXJkLWxpZ2h0XCI7XG4gICAgY2FzZSBcIlNvZnRMaWdodFwiOlxuICAgICAgcmV0dXJuIFwic29mdC1saWdodFwiO1xuICAgIGNhc2UgXCJEaWZmZXJlbmNlXCI6XG4gICAgICByZXR1cm4gXCJkaWZmZXJlbmNlXCI7XG4gICAgY2FzZSBcIkV4Y2x1c2lvblwiOlxuICAgICAgcmV0dXJuIFwiZXhjbHVzaW9uXCI7XG4gICAgY2FzZSBcIkh1ZVwiOlxuICAgICAgcmV0dXJuIFwiaHVlXCI7XG4gICAgY2FzZSBcIlNhdHVyYXRpb25cIjpcbiAgICAgIHJldHVybiBcInNhdHVyYXRpb25cIjtcbiAgICBjYXNlIFwiQ29sb3JcIjpcbiAgICAgIHJldHVybiBcImNvbG9yXCI7XG4gICAgY2FzZSBcIkx1bWlub3NpdHlcIjpcbiAgICAgIHJldHVybiBcImx1bWlub3NpdHlcIjtcbiAgfVxuICBpZiAocGFyc2luZ0FycmF5KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgd2FybihgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZTogJHt2YWx1ZS5uYW1lfWApO1xuICByZXR1cm4gXCJzb3VyY2Utb3ZlclwiO1xufVxuXG4vLyBUcnlpbmcgdG8gbWluaW1pemUgRGF0ZS5ub3coKSB1c2FnZSBhbmQgY2hlY2sgZXZlcnkgMTAwIHRpbWUuXG5jbGFzcyBUaW1lU2xvdE1hbmFnZXIge1xuICBzdGF0aWMgZ2V0IFRJTUVfU0xPVF9EVVJBVElPTl9NUygpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiVElNRV9TTE9UX0RVUkFUSU9OX01TXCIsIDIwKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQ0hFQ0tfVElNRV9FVkVSWSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiQ0hFQ0tfVElNRV9FVkVSWVwiLCAxMDApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgY2hlY2soKSB7XG4gICAgaWYgKCsrdGhpcy5jaGVja2VkIDwgVGltZVNsb3RNYW5hZ2VyLkNIRUNLX1RJTUVfRVZFUlkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jaGVja2VkID0gMDtcbiAgICByZXR1cm4gdGhpcy5lbmRUaW1lIDw9IERhdGUubm93KCk7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLmVuZFRpbWUgPSBEYXRlLm5vdygpICsgVGltZVNsb3RNYW5hZ2VyLlRJTUVfU0xPVF9EVVJBVElPTl9NUztcbiAgICB0aGlzLmNoZWNrZWQgPSAwO1xuICB9XG59XG5cbmNsYXNzIFBhcnRpYWxFdmFsdWF0b3Ige1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgeHJlZixcbiAgICBoYW5kbGVyLFxuICAgIHBhZ2VJbmRleCxcbiAgICBpZEZhY3RvcnksXG4gICAgZm9udENhY2hlLFxuICAgIGJ1aWx0SW5DTWFwQ2FjaGUsXG4gICAgZ2xvYmFsSW1hZ2VDYWNoZSxcbiAgICBvcHRpb25zID0gbnVsbCxcbiAgfSkge1xuICAgIHRoaXMueHJlZiA9IHhyZWY7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLmlkRmFjdG9yeSA9IGlkRmFjdG9yeTtcbiAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTtcbiAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBidWlsdEluQ01hcENhY2hlO1xuICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IGdsb2JhbEltYWdlQ2FjaGU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnM7XG4gICAgdGhpcy5wYXJzaW5nVHlwZTNGb250ID0gZmFsc2U7XG5cbiAgICB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQgPSB0aGlzLmZldGNoQnVpbHRJbkNNYXAuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5jZSBGdW5jdGlvbnMgYXJlIG9ubHkgY2FjaGVkIChsb2NhbGx5KSBieSByZWZlcmVuY2UsIHdlIGNhbiBzaGFyZSBvbmVcbiAgICogYFBERkZ1bmN0aW9uRmFjdG9yeWAgaW5zdGFuY2Ugd2l0aGluIHRoaXMgYFBhcnRpYWxFdmFsdWF0b3JgIGluc3RhbmNlLlxuICAgKi9cbiAgZ2V0IF9wZGZGdW5jdGlvbkZhY3RvcnkoKSB7XG4gICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IFBERkZ1bmN0aW9uRmFjdG9yeSh7XG4gICAgICB4cmVmOiB0aGlzLnhyZWYsXG4gICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc0V2YWxTdXBwb3J0ZWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9wZGZGdW5jdGlvbkZhY3RvcnlcIiwgcGRmRnVuY3Rpb25GYWN0b3J5KTtcbiAgfVxuXG4gIGNsb25lKG5ld09wdGlvbnMgPSBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnMpIHtcbiAgICB2YXIgbmV3RXZhbHVhdG9yID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICBuZXdFdmFsdWF0b3Iub3B0aW9ucyA9IG5ld09wdGlvbnM7XG4gICAgcmV0dXJuIG5ld0V2YWx1YXRvcjtcbiAgfVxuXG4gIGhhc0JsZW5kTW9kZXMocmVzb3VyY2VzKSB7XG4gICAgaWYgKCEocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgUmVmU2V0KCk7XG4gICAgaWYgKHJlc291cmNlcy5vYmpJZCkge1xuICAgICAgcHJvY2Vzc2VkLnB1dChyZXNvdXJjZXMub2JqSWQpO1xuICAgIH1cblxuICAgIHZhciBub2RlcyA9IFtyZXNvdXJjZXNdLFxuICAgICAgeHJlZiA9IHRoaXMueHJlZjtcbiAgICB3aGlsZSAobm9kZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7XG4gICAgICAvLyBGaXJzdCBjaGVjayB0aGUgY3VycmVudCByZXNvdXJjZXMgZm9yIGJsZW5kIG1vZGVzLlxuICAgICAgdmFyIGdyYXBoaWNTdGF0ZXMgPSBub2RlLmdldChcIkV4dEdTdGF0ZVwiKTtcbiAgICAgIGlmIChncmFwaGljU3RhdGVzIGluc3RhbmNlb2YgRGljdCkge1xuICAgICAgICBmb3IgKGxldCBncmFwaGljU3RhdGUgb2YgZ3JhcGhpY1N0YXRlcy5nZXRSYXdWYWx1ZXMoKSkge1xuICAgICAgICAgIGlmIChncmFwaGljU3RhdGUgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGdyYXBoaWNTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7IC8vIFRoZSBFeHRHU3RhdGUgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBncmFwaGljU3RhdGUgPSB4cmVmLmZldGNoKGdyYXBoaWNTdGF0ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIEF2b2lkIHBhcnNpbmcgYSBjb3JydXB0IEV4dEdTdGF0ZSBtb3JlIHRoYW4gb25jZS5cbiAgICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dChncmFwaGljU3RhdGUpO1xuXG4gICAgICAgICAgICAgIGluZm8oYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBFeHRHU3RhdGU6IFwiJHtleH1cIi5gKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKGdyYXBoaWNTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGdyYXBoaWNTdGF0ZS5vYmpJZCkge1xuICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dChncmFwaGljU3RhdGUub2JqSWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJtID0gZ3JhcGhpY1N0YXRlLmdldChcIkJNXCIpO1xuICAgICAgICAgIGlmIChibSBpbnN0YW5jZW9mIE5hbWUpIHtcbiAgICAgICAgICAgIGlmIChibS5uYW1lICE9PSBcIk5vcm1hbFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChibSAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkoYm0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm0pIHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lICYmIGVsZW1lbnQubmFtZSAhPT0gXCJOb3JtYWxcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEZXNjZW5kIGludG8gdGhlIFhPYmplY3RzIHRvIGxvb2sgZm9yIG1vcmUgcmVzb3VyY2VzIGFuZCBibGVuZCBtb2Rlcy5cbiAgICAgIHZhciB4T2JqZWN0cyA9IG5vZGUuZ2V0KFwiWE9iamVjdFwiKTtcbiAgICAgIGlmICghKHhPYmplY3RzIGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCB4T2JqZWN0IG9mIHhPYmplY3RzLmdldFJhd1ZhbHVlcygpKSB7XG4gICAgICAgIGlmICh4T2JqZWN0IGluc3RhbmNlb2YgUmVmKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoeE9iamVjdCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSBYT2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLCBhbmQgYnkgYXZvaWRpbmcgYVxuICAgICAgICAgICAgLy8gcmVkdW5kYW50IGB4cmVmLmZldGNoYCB3ZSBjYW4gKnNpZ25pZmljYW50bHkqIHJlZHVjZSB0aGUgbG9hZFxuICAgICAgICAgICAgLy8gdGltZSBmb3IgYmFkbHkgZ2VuZXJhdGVkIFBERiBmaWxlcyAoZml4ZXMgaXNzdWU2OTYxLnBkZikuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHhPYmplY3QgPSB4cmVmLmZldGNoKHhPYmplY3QpO1xuICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF2b2lkIHBhcnNpbmcgYSBjb3JydXB0IFhPYmplY3QgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgICAgICBwcm9jZXNzZWQucHV0KHhPYmplY3QpO1xuXG4gICAgICAgICAgICBpbmZvKGBoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgWE9iamVjdDogXCIke2V4fVwiLmApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNTdHJlYW0oeE9iamVjdCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeE9iamVjdC5kaWN0Lm9iaklkKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4T2JqZWN0LmRpY3Qub2JqSWQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4UmVzb3VyY2VzID0geE9iamVjdC5kaWN0LmdldChcIlJlc291cmNlc1wiKTtcbiAgICAgICAgaWYgKCEoeFJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2tpbmcgb2JqSWQgdG8gZGV0ZWN0IGFuIGluZmluaXRlIGxvb3AuXG4gICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkICYmIHByb2Nlc3NlZC5oYXMoeFJlc291cmNlcy5vYmpJZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGVzLnB1c2goeFJlc291cmNlcyk7XG4gICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4UmVzb3VyY2VzLm9iaklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBmZXRjaEJ1aWx0SW5DTWFwKG5hbWUpIHtcbiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5idWlsdEluQ01hcENhY2hlLmdldChuYW1lKTtcbiAgICBpZiAoY2FjaGVkRGF0YSkge1xuICAgICAgcmV0dXJuIGNhY2hlZERhdGE7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5oYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiRmV0Y2hCdWlsdEluQ01hcFwiLCB7XG4gICAgICBuYW1lLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoeyB2YWx1ZSwgZG9uZSB9KSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgcHVtcCgpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgICAgcHVtcCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKGRhdGEuY29tcHJlc3Npb25UeXBlICE9PSBDTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpIHtcbiAgICAgIC8vIEdpdmVuIHRoZSBzaXplIG9mIHVuY29tcHJlc3NlZCBDTWFwcywgb25seSBjYWNoZSBjb21wcmVzc2VkIG9uZXMuXG4gICAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuc2V0KG5hbWUsIGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRm9ybVhPYmplY3QoXG4gICAgcmVzb3VyY2VzLFxuICAgIHhvYmosXG4gICAgc21hc2ssXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIHRhc2ssXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICkge1xuICAgIHZhciBkaWN0ID0geG9iai5kaWN0O1xuICAgIHZhciBtYXRyaXggPSBkaWN0LmdldEFycmF5KFwiTWF0cml4XCIpO1xuICAgIHZhciBiYm94ID0gZGljdC5nZXRBcnJheShcIkJCb3hcIik7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHtcbiAgICAgIGJib3ggPSBVdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJib3ggPSBudWxsO1xuICAgIH1cbiAgICBsZXQgb3B0aW9uYWxDb250ZW50ID0gbnVsbDtcbiAgICBpZiAoZGljdC5oYXMoXCJPQ1wiKSkge1xuICAgICAgb3B0aW9uYWxDb250ZW50ID0gYXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhcbiAgICAgICAgZGljdC5nZXQoXCJPQ1wiKSxcbiAgICAgICAgcmVzb3VyY2VzXG4gICAgICApO1xuICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgW1wiT0NcIiwgb3B0aW9uYWxDb250ZW50XSk7XG4gICAgfVxuICAgIHZhciBncm91cCA9IGRpY3QuZ2V0KFwiR3JvdXBcIik7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICB2YXIgZ3JvdXBPcHRpb25zID0ge1xuICAgICAgICBtYXRyaXgsXG4gICAgICAgIGJib3gsXG4gICAgICAgIHNtYXNrLFxuICAgICAgICBpc29sYXRlZDogZmFsc2UsXG4gICAgICAgIGtub2Nrb3V0OiBmYWxzZSxcbiAgICAgIH07XG5cbiAgICAgIHZhciBncm91cFN1YnR5cGUgPSBncm91cC5nZXQoXCJTXCIpO1xuICAgICAgdmFyIGNvbG9yU3BhY2UgPSBudWxsO1xuICAgICAgaWYgKGlzTmFtZShncm91cFN1YnR5cGUsIFwiVHJhbnNwYXJlbmN5XCIpKSB7XG4gICAgICAgIGdyb3VwT3B0aW9ucy5pc29sYXRlZCA9IGdyb3VwLmdldChcIklcIikgfHwgZmFsc2U7XG4gICAgICAgIGdyb3VwT3B0aW9ucy5rbm9ja291dCA9IGdyb3VwLmdldChcIktcIikgfHwgZmFsc2U7XG4gICAgICAgIGlmIChncm91cC5oYXMoXCJDU1wiKSkge1xuICAgICAgICAgIGNvbnN0IGNzID0gZ3JvdXAuZ2V0UmF3KFwiQ1NcIik7XG5cbiAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5nZXRDYWNoZWQoXG4gICAgICAgICAgICBjcyxcbiAgICAgICAgICAgIHRoaXMueHJlZixcbiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkge1xuICAgICAgICAgICAgY29sb3JTcGFjZSA9IGNhY2hlZENvbG9yU3BhY2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBhd2FpdCB0aGlzLnBhcnNlQ29sb3JTcGFjZSh7XG4gICAgICAgICAgICAgIGNzLFxuICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzbWFzayAmJiBzbWFzay5iYWNrZHJvcCkge1xuICAgICAgICBjb2xvclNwYWNlID0gY29sb3JTcGFjZSB8fCBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiO1xuICAgICAgICBzbWFzay5iYWNrZHJvcCA9IGNvbG9yU3BhY2UuZ2V0UmdiKHNtYXNrLmJhY2tkcm9wLCAwKTtcbiAgICAgIH1cblxuICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbkdyb3VwLCBbZ3JvdXBPcHRpb25zXSk7XG4gICAgfVxuXG4gICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW4sIFttYXRyaXgsIGJib3hdKTtcblxuICAgIHJldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7XG4gICAgICBzdHJlYW06IHhvYmosXG4gICAgICB0YXNrLFxuICAgICAgcmVzb3VyY2VzOiBkaWN0LmdldChcIlJlc291cmNlc1wiKSB8fCByZXNvdXJjZXMsXG4gICAgICBvcGVyYXRvckxpc3QsXG4gICAgICBpbml0aWFsU3RhdGUsXG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQsIFtdKTtcblxuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuZW5kR3JvdXAsIFtncm91cE9wdGlvbnNdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbmFsQ29udGVudCkge1xuICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9zZW5kSW1nRGF0YShvYmpJZCwgaW1nRGF0YSwgY2FjaGVHbG9iYWxseSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdHJhbnNmZXJzID0gaW1nRGF0YSA/IFtpbWdEYXRhLmRhdGEuYnVmZmVyXSA6IG51bGw7XG5cbiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250IHx8IGNhY2hlR2xvYmFsbHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZChcbiAgICAgICAgXCJjb21tb25vYmpcIixcbiAgICAgICAgW29iaklkLCBcIkltYWdlXCIsIGltZ0RhdGFdLFxuICAgICAgICB0cmFuc2ZlcnNcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZChcbiAgICAgIFwib2JqXCIsXG4gICAgICBbb2JqSWQsIHRoaXMucGFnZUluZGV4LCBcIkltYWdlXCIsIGltZ0RhdGFdLFxuICAgICAgdHJhbnNmZXJzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3Qoe1xuICAgIHJlc291cmNlcyxcbiAgICBpbWFnZSxcbiAgICBpc0lubGluZSA9IGZhbHNlLFxuICAgIG9wZXJhdG9yTGlzdCxcbiAgICBjYWNoZUtleSxcbiAgICBsb2NhbEltYWdlQ2FjaGUsXG4gICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIH0pIHtcbiAgICB2YXIgZGljdCA9IGltYWdlLmRpY3Q7XG4gICAgY29uc3QgaW1hZ2VSZWYgPSBkaWN0Lm9iaklkO1xuICAgIHZhciB3ID0gZGljdC5nZXQoXCJXaWR0aFwiLCBcIldcIik7XG4gICAgdmFyIGggPSBkaWN0LmdldChcIkhlaWdodFwiLCBcIkhcIik7XG5cbiAgICBpZiAoISh3ICYmIGlzTnVtKHcpKSB8fCAhKGggJiYgaXNOdW0oaCkpKSB7XG4gICAgICB3YXJuKFwiSW1hZ2UgZGltZW5zaW9ucyBhcmUgbWlzc2luZywgb3Igbm90IG51bWJlcnMuXCIpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIG1heEltYWdlU2l6ZSA9IHRoaXMub3B0aW9ucy5tYXhJbWFnZVNpemU7XG4gICAgaWYgKG1heEltYWdlU2l6ZSAhPT0gLTEgJiYgdyAqIGggPiBtYXhJbWFnZVNpemUpIHtcbiAgICAgIHdhcm4oXCJJbWFnZSBleGNlZWRlZCBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBhbmQgd2FzIHJlbW92ZWQuXCIpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgaW1hZ2VNYXNrID0gZGljdC5nZXQoXCJJbWFnZU1hc2tcIiwgXCJJTVwiKSB8fCBmYWxzZTtcbiAgICB2YXIgaW1nRGF0YSwgYXJncztcbiAgICBpZiAoaW1hZ2VNYXNrKSB7XG4gICAgICAvLyBUaGlzIGRlcGVuZHMgb24gYSB0bXBDYW52YXMgYmVpbmcgZmlsbGVkIHdpdGggdGhlXG4gICAgICAvLyBjdXJyZW50IGZpbGxTdHlsZSwgc3VjaCB0aGF0IHByb2Nlc3NpbmcgdGhlIHBpeGVsXG4gICAgICAvLyBkYXRhIGNhbid0IGJlIGRvbmUgaGVyZS4gSW5zdGVhZCBvZiBjcmVhdGluZyBhXG4gICAgICAvLyBjb21wbGV0ZSBQREZJbWFnZSwgb25seSByZWFkIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWRcbiAgICAgIC8vIGZvciBsYXRlci5cblxuICAgICAgdmFyIHdpZHRoID0gZGljdC5nZXQoXCJXaWR0aFwiLCBcIldcIik7XG4gICAgICB2YXIgaGVpZ2h0ID0gZGljdC5nZXQoXCJIZWlnaHRcIiwgXCJIXCIpO1xuICAgICAgdmFyIGJpdFN0cmlkZUxlbmd0aCA9ICh3aWR0aCArIDcpID4+IDM7XG4gICAgICB2YXIgaW1nQXJyYXkgPSBpbWFnZS5nZXRCeXRlcyhcbiAgICAgICAgYml0U3RyaWRlTGVuZ3RoICogaGVpZ2h0LFxuICAgICAgICAvKiBmb3JjZUNsYW1wZWQgPSAqLyB0cnVlXG4gICAgICApO1xuICAgICAgdmFyIGRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoXCJEZWNvZGVcIiwgXCJEXCIpO1xuXG4gICAgICBpbWdEYXRhID0gUERGSW1hZ2UuY3JlYXRlTWFzayh7XG4gICAgICAgIGltZ0FycmF5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbTogaW1hZ2UgaW5zdGFuY2VvZiBEZWNvZGVTdHJlYW0sXG4gICAgICAgIGludmVyc2VEZWNvZGU6ICEhZGVjb2RlICYmIGRlY29kZVswXSA+IDAsXG4gICAgICB9KTtcbiAgICAgIGltZ0RhdGEuY2FjaGVkID0gISFjYWNoZUtleTtcbiAgICAgIGFyZ3MgPSBbaW1nRGF0YV07XG5cbiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBhcmdzKTtcbiAgICAgIGlmIChjYWNoZUtleSkge1xuICAgICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwge1xuICAgICAgICAgIGZuOiBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgc29mdE1hc2sgPSBkaWN0LmdldChcIlNNYXNrXCIsIFwiU01cIikgfHwgZmFsc2U7XG4gICAgdmFyIG1hc2sgPSBkaWN0LmdldChcIk1hc2tcIikgfHwgZmFsc2U7XG5cbiAgICB2YXIgU01BTExfSU1BR0VfRElNRU5TSU9OUyA9IDIwMDtcbiAgICAvLyBJbmxpbmluZyBzbWFsbCBpbWFnZXMgaW50byB0aGUgcXVldWUgYXMgUkdCIGRhdGFcbiAgICBpZiAoaXNJbmxpbmUgJiYgIXNvZnRNYXNrICYmICFtYXNrICYmIHcgKyBoIDwgU01BTExfSU1BR0VfRElNRU5TSU9OUykge1xuICAgICAgY29uc3QgaW1hZ2VPYmogPSBuZXcgUERGSW1hZ2Uoe1xuICAgICAgICB4cmVmOiB0aGlzLnhyZWYsXG4gICAgICAgIHJlczogcmVzb3VyY2VzLFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgaXNJbmxpbmUsXG4gICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgIH0pO1xuICAgICAgLy8gV2UgZm9yY2UgdGhlIHVzZSBvZiBSR0JBXzMyQlBQIGltYWdlcyBoZXJlLCBiZWNhdXNlIHdlIGNhbid0IGhhbmRsZVxuICAgICAgLy8gYW55IG90aGVyIGtpbmQuXG4gICAgICBpbWdEYXRhID0gaW1hZ2VPYmouY3JlYXRlSW1hZ2VEYXRhKC8qIGZvcmNlUkdCQSA9ICovIHRydWUpO1xuICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5wYWludElubGluZUltYWdlWE9iamVjdCwgW2ltZ0RhdGFdKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gaW1hZ2VNYXNrLCBjcmVhdGUgdGhlIFBERkltYWdlIGFuZCBhIGxvdFxuICAgIC8vIG9mIGltYWdlIHByb2Nlc3NpbmcgY2FuIGJlIGRvbmUgaGVyZS5cbiAgICBsZXQgb2JqSWQgPSBgaW1nXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gLFxuICAgICAgY2FjaGVHbG9iYWxseSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCkge1xuICAgICAgb2JqSWQgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV90eXBlM18ke29iaklkfWA7XG4gICAgfSBlbHNlIGlmIChpbWFnZVJlZikge1xuICAgICAgY2FjaGVHbG9iYWxseSA9IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zaG91bGRDYWNoZShcbiAgICAgICAgaW1hZ2VSZWYsXG4gICAgICAgIHRoaXMucGFnZUluZGV4XG4gICAgICApO1xuXG4gICAgICBpZiAoY2FjaGVHbG9iYWxseSkge1xuICAgICAgICBvYmpJZCA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9XyR7b2JqSWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZGVwZW5kZW5jeSBpcyBhZGRlZCBiZWZvcmUgdGhlIGltYWdlIGlzIGRlY29kZWQuXG4gICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kob2JqSWQpO1xuICAgIGFyZ3MgPSBbb2JqSWQsIHcsIGhdO1xuXG4gICAgUERGSW1hZ2UuYnVpbGRJbWFnZSh7XG4gICAgICB4cmVmOiB0aGlzLnhyZWYsXG4gICAgICByZXM6IHJlc291cmNlcyxcbiAgICAgIGltYWdlLFxuICAgICAgaXNJbmxpbmUsXG4gICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgIH0pXG4gICAgICAudGhlbihpbWFnZU9iaiA9PiB7XG4gICAgICAgIGltZ0RhdGEgPSBpbWFnZU9iai5jcmVhdGVJbWFnZURhdGEoLyogZm9yY2VSR0JBID0gKi8gZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgaW1nRGF0YSwgY2FjaGVHbG9iYWxseSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgIHdhcm4oYFVuYWJsZSB0byBkZWNvZGUgaW1hZ2UgXCIke29iaklkfVwiOiBcIiR7cmVhc29ufVwiLmApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgLyogaW1nRGF0YSA9ICovIG51bGwsIGNhY2hlR2xvYmFsbHkpO1xuICAgICAgfSk7XG5cbiAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnBhaW50SW1hZ2VYT2JqZWN0LCBhcmdzKTtcbiAgICBpZiAoY2FjaGVLZXkpIHtcbiAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCB7XG4gICAgICAgIGZuOiBPUFMucGFpbnRJbWFnZVhPYmplY3QsXG4gICAgICAgIGFyZ3MsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGltYWdlUmVmKSB7XG4gICAgICAgIGFzc2VydCghaXNJbmxpbmUsIFwiQ2Fubm90IGNhY2hlIGFuIGlubGluZSBpbWFnZSBnbG9iYWxseS5cIik7XG4gICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRQYWdlSW5kZXgoaW1hZ2VSZWYsIHRoaXMucGFnZUluZGV4KTtcblxuICAgICAgICBpZiAoY2FjaGVHbG9iYWxseSkge1xuICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhKGltYWdlUmVmLCB7XG4gICAgICAgICAgICBvYmpJZCxcbiAgICAgICAgICAgIGZuOiBPUFMucGFpbnRJbWFnZVhPYmplY3QsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBoYW5kbGVTTWFzayhcbiAgICBzbWFzayxcbiAgICByZXNvdXJjZXMsXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIHRhc2ssXG4gICAgc3RhdGVNYW5hZ2VyLFxuICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICkge1xuICAgIHZhciBzbWFza0NvbnRlbnQgPSBzbWFzay5nZXQoXCJHXCIpO1xuICAgIHZhciBzbWFza09wdGlvbnMgPSB7XG4gICAgICBzdWJ0eXBlOiBzbWFzay5nZXQoXCJTXCIpLm5hbWUsXG4gICAgICBiYWNrZHJvcDogc21hc2suZ2V0KFwiQkNcIiksXG4gICAgfTtcblxuICAgIC8vIFRoZSBTTWFzayBtaWdodCBoYXZlIGEgYWxwaGEvbHVtaW5vc2l0eSB2YWx1ZSB0cmFuc2ZlciBmdW5jdGlvbiAtLVxuICAgIC8vIHdlIHdpbGwgYnVpbGQgYSBtYXAgb2YgaW50ZWdlciB2YWx1ZXMgaW4gcmFuZ2UgMC4uMjU1IHRvIGJlIGZhc3QuXG4gICAgdmFyIHRyYW5zZmVyT2JqID0gc21hc2suZ2V0KFwiVFJcIik7XG4gICAgaWYgKGlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7XG4gICAgICBjb25zdCB0cmFuc2ZlckZuID0gdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZSh0cmFuc2Zlck9iaik7XG4gICAgICB2YXIgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICAgICAgdmFyIHRtcCA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIHRtcFswXSA9IGkgLyAyNTU7XG4gICAgICAgIHRyYW5zZmVyRm4odG1wLCAwLCB0bXAsIDApO1xuICAgICAgICB0cmFuc2Zlck1hcFtpXSA9ICh0bXBbMF0gKiAyNTUpIHwgMDtcbiAgICAgIH1cbiAgICAgIHNtYXNrT3B0aW9ucy50cmFuc2Zlck1hcCA9IHRyYW5zZmVyTWFwO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJ1aWxkRm9ybVhPYmplY3QoXG4gICAgICByZXNvdXJjZXMsXG4gICAgICBzbWFza0NvbnRlbnQsXG4gICAgICBzbWFza09wdGlvbnMsXG4gICAgICBvcGVyYXRvckxpc3QsXG4gICAgICB0YXNrLFxuICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCksXG4gICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICk7XG4gIH1cblxuICBoYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKHRyKSB7XG4gICAgbGV0IHRyYW5zZmVyQXJyYXk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHIpKSB7XG4gICAgICB0cmFuc2ZlckFycmF5ID0gdHI7XG4gICAgfSBlbHNlIGlmIChpc1BERkZ1bmN0aW9uKHRyKSkge1xuICAgICAgdHJhbnNmZXJBcnJheSA9IFt0cl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBOb3QgYSB2YWxpZCB0cmFuc2ZlciBmdW5jdGlvbiBlbnRyeS5cbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2Zlck1hcHMgPSBbXTtcbiAgICBsZXQgbnVtRm5zID0gMCxcbiAgICAgIG51bUVmZmVjdGZ1bEZucyA9IDA7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0cmFuc2ZlckFycmF5KSB7XG4gICAgICBjb25zdCB0cmFuc2Zlck9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGVudHJ5KTtcbiAgICAgIG51bUZucysrO1xuXG4gICAgICBpZiAoaXNOYW1lKHRyYW5zZmVyT2JqLCBcIklkZW50aXR5XCIpKSB7XG4gICAgICAgIHRyYW5zZmVyTWFwcy5wdXNoKG51bGwpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBOb3QgYSB2YWxpZCB0cmFuc2ZlciBmdW5jdGlvbiBvYmplY3QuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyRm4gPSB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHRyYW5zZmVyT2JqKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVyTWFwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KSxcbiAgICAgICAgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMjU2OyBqKyspIHtcbiAgICAgICAgdG1wWzBdID0gaiAvIDI1NTtcbiAgICAgICAgdHJhbnNmZXJGbih0bXAsIDAsIHRtcCwgMCk7XG4gICAgICAgIHRyYW5zZmVyTWFwW2pdID0gKHRtcFswXSAqIDI1NSkgfCAwO1xuICAgICAgfVxuICAgICAgdHJhbnNmZXJNYXBzLnB1c2godHJhbnNmZXJNYXApO1xuICAgICAgbnVtRWZmZWN0ZnVsRm5zKys7XG4gICAgfVxuXG4gICAgaWYgKCEobnVtRm5zID09PSAxIHx8IG51bUZucyA9PT0gNCkpIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBPbmx5IDEgb3IgNCBmdW5jdGlvbnMgYXJlIHN1cHBvcnRlZCwgYnkgdGhlIHNwZWNpZmljYXRpb24uXG4gICAgfVxuICAgIGlmIChudW1FZmZlY3RmdWxGbnMgPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBPbmx5IC9JZGVudGl0eSB0cmFuc2ZlciBmdW5jdGlvbnMgZm91bmQsIHdoaWNoIGFyZSBuby1vcHMuXG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zlck1hcHM7XG4gIH1cblxuICBoYW5kbGVUaWxpbmdUeXBlKFxuICAgIGZuLFxuICAgIGFyZ3MsXG4gICAgcmVzb3VyY2VzLFxuICAgIHBhdHRlcm4sXG4gICAgcGF0dGVybkRpY3QsXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIHRhc2tcbiAgKSB7XG4gICAgLy8gQ3JlYXRlIGFuIElSIG9mIHRoZSBwYXR0ZXJuIGNvZGUuXG4gICAgY29uc3QgdGlsaW5nT3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpO1xuICAgIC8vIE1lcmdlIHRoZSBhdmFpbGFibGUgcmVzb3VyY2VzLCB0byBwcmV2ZW50IGlzc3VlcyB3aGVuIHRoZSBwYXR0ZXJuRGljdFxuICAgIC8vIGlzIG1pc3Npbmcgc29tZSAvUmVzb3VyY2VzIGVudHJpZXMgKGZpeGVzIGlzc3VlNjU0MS5wZGYpLlxuICAgIGNvbnN0IHBhdHRlcm5SZXNvdXJjZXMgPSBEaWN0Lm1lcmdlKHtcbiAgICAgIHhyZWY6IHRoaXMueHJlZixcbiAgICAgIGRpY3RBcnJheTogW3BhdHRlcm5EaWN0LmdldChcIlJlc291cmNlc1wiKSwgcmVzb3VyY2VzXSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7XG4gICAgICBzdHJlYW06IHBhdHRlcm4sXG4gICAgICB0YXNrLFxuICAgICAgcmVzb3VyY2VzOiBwYXR0ZXJuUmVzb3VyY2VzLFxuICAgICAgb3BlcmF0b3JMaXN0OiB0aWxpbmdPcExpc3QsXG4gICAgfSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldFRpbGluZ1BhdHRlcm5JUihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmbkFycmF5OiB0aWxpbmdPcExpc3QuZm5BcnJheSxcbiAgICAgICAgICAgIGFyZ3NBcnJheTogdGlsaW5nT3BMaXN0LmFyZ3NBcnJheSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdHRlcm5EaWN0LFxuICAgICAgICAgIGFyZ3NcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihcbiAgICAgICAgZnVuY3Rpb24gKHRpbGluZ1BhdHRlcm5JUikge1xuICAgICAgICAgIC8vIEFkZCB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBwYXJlbnQgb3BlcmF0b3IgbGlzdCBzbyB0aGV5IGFyZVxuICAgICAgICAgIC8vIHJlc29sdmVkIGJlZm9yZSB0aGUgc3ViIG9wZXJhdG9yIGxpc3QgaXMgZXhlY3V0ZWQgc3luY2hyb25vdXNseS5cbiAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRpbGluZ09wTGlzdC5kZXBlbmRlbmNpZXMpO1xuICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgdGlsaW5nUGF0dGVybklSKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgIC8vIEVycm9yKHMpIGluIHRoZSBUaWxpbmdQYXR0ZXJuIC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZVxuICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGFuZCBhbGxvdyByZW5kZXJpbmcgdG8gY29udGludWUuXG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JUaWxpbmdQYXR0ZXJuLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3YXJuKGBoYW5kbGVUaWxpbmdUeXBlIC0gaWdub3JpbmcgcGF0dGVybjogXCIke3JlYXNvbn1cIi5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGZvbnRBcmdzLCBmb250UmVmLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlKSB7XG4gICAgLy8gVE9ETyhtYWNrKTogTm90IG5lZWRlZD9cbiAgICB2YXIgZm9udE5hbWUsXG4gICAgICBmb250U2l6ZSA9IDA7XG4gICAgaWYgKGZvbnRBcmdzKSB7XG4gICAgICBmb250QXJncyA9IGZvbnRBcmdzLnNsaWNlKCk7XG4gICAgICBmb250TmFtZSA9IGZvbnRBcmdzWzBdLm5hbWU7XG4gICAgICBmb250U2l6ZSA9IGZvbnRBcmdzWzFdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxvYWRGb250KGZvbnROYW1lLCBmb250UmVmLCByZXNvdXJjZXMpXG4gICAgICAudGhlbih0cmFuc2xhdGVkID0+IHtcbiAgICAgICAgaWYgKCF0cmFuc2xhdGVkLmZvbnQuaXNUeXBlM0ZvbnQpIHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlZFxuICAgICAgICAgIC5sb2FkVHlwZTNEYXRhKHRoaXMsIHJlc291cmNlcywgdGFzaylcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgcGFyZW50IG9wZXJhdG9yTGlzdCBzbyB0aGV5IGFyZVxuICAgICAgICAgICAgLy8gcmVzb2x2ZWQgYmVmb3JlIFR5cGUzIG9wZXJhdG9yTGlzdHMgYXJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkuXG4gICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRyYW5zbGF0ZWQudHlwZTNEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgICAgLy8gRXJyb3IgaW4gdGhlIGZvbnQgZGF0YSAtLSBzZW5kaW5nIHVuc3VwcG9ydGVkIGZlYXR1cmVcbiAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbi5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKFwiVW5zdXBwb3J0ZWRGZWF0dXJlXCIsIHtcbiAgICAgICAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRMb2FkVHlwZTMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNsYXRlZEZvbnQoe1xuICAgICAgICAgICAgICBsb2FkZWROYW1lOiBcImdfZm9udF9lcnJvclwiLFxuICAgICAgICAgICAgICBmb250OiBuZXcgRXJyb3JGb250KGBUeXBlMyBmb250IGxvYWQgZXJyb3I6ICR7cmVhc29ufWApLFxuICAgICAgICAgICAgICBkaWN0OiB0cmFuc2xhdGVkLmZvbnQsXG4gICAgICAgICAgICAgIGV4dHJhUHJvcGVydGllczogdGhpcy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAudGhlbih0cmFuc2xhdGVkID0+IHtcbiAgICAgICAgc3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDtcbiAgICAgICAgc3RhdGUuZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgc3RhdGUuZm9udE5hbWUgPSBmb250TmFtZTtcbiAgICAgICAgdHJhbnNsYXRlZC5zZW5kKHRoaXMuaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkLmxvYWRlZE5hbWU7XG4gICAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVRleHQoY2hhcnMsIHN0YXRlKSB7XG4gICAgY29uc3QgZm9udCA9IHN0YXRlLmZvbnQ7XG4gICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGNoYXJzKTtcblxuICAgIGlmIChmb250LmRhdGEpIHtcbiAgICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEoXG4gICAgICAgIHN0YXRlLnRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBR1xuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgaXNBZGRUb1BhdGhTZXQgfHxcbiAgICAgICAgc3RhdGUuZmlsbENvbG9yU3BhY2UubmFtZSA9PT0gXCJQYXR0ZXJuXCIgfHxcbiAgICAgICAgZm9udC5kaXNhYmxlRm9udEZhY2UgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FibGVGb250RmFjZVxuICAgICAgKSB7XG4gICAgICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCB0aGlzLmhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2x5cGhzO1xuICB9XG5cbiAgZW5zdXJlU3RhdGVGb250KHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLmZvbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVhc29uID0gbmV3IEZvcm1hdEVycm9yKFxuICAgICAgXCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuXCJcbiAgICApO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgIC8vIE1pc3Npbmcgc2V0Rm9udCBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IgLS0gc2VuZGluZ1xuICAgICAgLy8gdW5zdXBwb3J0ZWQgZmVhdHVyZSBub3RpZmljYXRpb24gYW5kIGFsbG93IHJlbmRlcmluZyB0byBjb250aW51ZS5cbiAgICAgIHRoaXMuaGFuZGxlci5zZW5kKFwiVW5zdXBwb3J0ZWRGZWF0dXJlXCIsIHtcbiAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRTdGF0ZSxcbiAgICAgIH0pO1xuICAgICAgd2FybihgZW5zdXJlU3RhdGVGb250OiBcIiR7cmVhc29ufVwiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyByZWFzb247XG4gIH1cblxuICBhc3luYyBzZXRHU3RhdGUoe1xuICAgIHJlc291cmNlcyxcbiAgICBnU3RhdGUsXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIGNhY2hlS2V5LFxuICAgIHRhc2ssXG4gICAgc3RhdGVNYW5hZ2VyLFxuICAgIGxvY2FsR1N0YXRlQ2FjaGUsXG4gICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIH0pIHtcbiAgICBjb25zdCBnU3RhdGVSZWYgPSBnU3RhdGUub2JqSWQ7XG4gICAgbGV0IGlzU2ltcGxlR1N0YXRlID0gdHJ1ZTtcbiAgICAvLyBUaGlzIGFycmF5IGhvbGRzIHRoZSBjb252ZXJ0ZWQvcHJvY2Vzc2VkIHN0YXRlIGRhdGEuXG4gICAgdmFyIGdTdGF0ZU9iaiA9IFtdO1xuICAgIHZhciBnU3RhdGVLZXlzID0gZ1N0YXRlLmdldEtleXMoKTtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGdTdGF0ZUtleXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gZ1N0YXRlS2V5c1tpXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ1N0YXRlLmdldChrZXkpO1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcIlR5cGVcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxXXCI6XG4gICAgICAgIGNhc2UgXCJMQ1wiOlxuICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgY2FzZSBcIk1MXCI6XG4gICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgIGNhc2UgXCJSSVwiOlxuICAgICAgICBjYXNlIFwiRkxcIjpcbiAgICAgICAgY2FzZSBcIkNBXCI6XG4gICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGb250XCI6XG4gICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTtcblxuICAgICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU2V0Rm9udChcbiAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICB2YWx1ZVswXSxcbiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGVcbiAgICAgICAgICAgICkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkge1xuICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTtcbiAgICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgW2xvYWRlZE5hbWUsIHZhbHVlWzFdXV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJCTVwiOlxuICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSldKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlNNYXNrXCI6XG4gICAgICAgICAgaWYgKGlzTmFtZSh2YWx1ZSwgXCJOb25lXCIpKSB7XG4gICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBmYWxzZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0RpY3QodmFsdWUpKSB7XG4gICAgICAgICAgICBpc1NpbXBsZUdTdGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU01hc2soXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCxcbiAgICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlcixcbiAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cnVlXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdhcm4oXCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlRSXCI6XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJNYXBzID0gdGhpcy5oYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKHZhbHVlKTtcbiAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cmFuc2Zlck1hcHNdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gT25seSBnZW5lcmF0ZSBpbmZvIGxvZyBtZXNzYWdlcyBmb3IgdGhlIGZvbGxvd2luZyBzaW5jZVxuICAgICAgICAvLyB0aGV5IGFyZSB1bmxpa2VseSB0byBoYXZlIGEgYmlnIGltcGFjdCBvbiB0aGUgcmVuZGVyaW5nLlxuICAgICAgICBjYXNlIFwiT1BcIjpcbiAgICAgICAgY2FzZSBcIm9wXCI6XG4gICAgICAgIGNhc2UgXCJPUE1cIjpcbiAgICAgICAgY2FzZSBcIkJHXCI6XG4gICAgICAgIGNhc2UgXCJCRzJcIjpcbiAgICAgICAgY2FzZSBcIlVDUlwiOlxuICAgICAgICBjYXNlIFwiVUNSMlwiOlxuICAgICAgICBjYXNlIFwiVFIyXCI6XG4gICAgICAgIGNhc2UgXCJIVFwiOlxuICAgICAgICBjYXNlIFwiU01cIjpcbiAgICAgICAgY2FzZSBcIlNBXCI6XG4gICAgICAgIGNhc2UgXCJBSVNcIjpcbiAgICAgICAgY2FzZSBcIlRLXCI6XG4gICAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0b3JzLlxuICAgICAgICAgIGluZm8oXCJncmFwaGljIHN0YXRlIG9wZXJhdG9yIFwiICsga2V5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbmZvKFwiVW5rbm93biBncmFwaGljIHN0YXRlIG9wZXJhdG9yIFwiICsga2V5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ1N0YXRlT2JqLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRHU3RhdGUsIFtnU3RhdGVPYmpdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU2ltcGxlR1N0YXRlKSB7XG4gICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUuc2V0KGNhY2hlS2V5LCBnU3RhdGVSZWYsIGdTdGF0ZU9iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkRm9udChmb250TmFtZSwgZm9udCwgcmVzb3VyY2VzKSB7XG4gICAgY29uc3QgZXJyb3JGb250ID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgbmV3IFRyYW5zbGF0ZWRGb250KHtcbiAgICAgICAgICBsb2FkZWROYW1lOiBcImdfZm9udF9lcnJvclwiLFxuICAgICAgICAgIGZvbnQ6IG5ldyBFcnJvckZvbnQoYEZvbnQgXCIke2ZvbnROYW1lfVwiIGlzIG5vdCBhdmFpbGFibGUuYCksXG4gICAgICAgICAgZGljdDogZm9udCxcbiAgICAgICAgICBleHRyYVByb3BlcnRpZXM6IHRoaXMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgdmFyIGZvbnRSZWYsXG4gICAgICB4cmVmID0gdGhpcy54cmVmO1xuICAgIGlmIChmb250KSB7XG4gICAgICAvLyBMb2FkaW5nIGJ5IHJlZi5cbiAgICAgIGlmICghaXNSZWYoZm9udCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdUaGUgXCJmb250XCIgb2JqZWN0IHNob3VsZCBiZSBhIHJlZmVyZW5jZS4nKTtcbiAgICAgIH1cbiAgICAgIGZvbnRSZWYgPSBmb250O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMb2FkaW5nIGJ5IG5hbWUuXG4gICAgICB2YXIgZm9udFJlcyA9IHJlc291cmNlcy5nZXQoXCJGb250XCIpO1xuICAgICAgaWYgKGZvbnRSZXMpIHtcbiAgICAgICAgZm9udFJlZiA9IGZvbnRSZXMuZ2V0UmF3KGZvbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb250UmVmKSB7XG4gICAgICBjb25zdCBwYXJ0aWFsTXNnID0gYEZvbnQgXCIke1xuICAgICAgICBmb250TmFtZSB8fCAoZm9udCAmJiBmb250LnRvU3RyaW5nKCkpXG4gICAgICB9XCIgaXMgbm90IGF2YWlsYWJsZWA7XG5cbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyAmJiAhdGhpcy5wYXJzaW5nVHlwZTNGb250KSB7XG4gICAgICAgIHdhcm4oYCR7cGFydGlhbE1zZ30uYCk7XG4gICAgICAgIHJldHVybiBlcnJvckZvbnQoKTtcbiAgICAgIH1cbiAgICAgIC8vIEZvbnQgbm90IGZvdW5kIC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZSBub3RpZmljYXRpb24uXG4gICAgICB0aGlzLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250TWlzc2luZyxcbiAgICAgIH0pO1xuICAgICAgd2FybihgJHtwYXJ0aWFsTXNnfSAtLSBhdHRlbXB0aW5nIHRvIGZhbGxiYWNrIHRvIGEgZGVmYXVsdCBmb250LmApO1xuXG4gICAgICAvLyBGYWxsaW5nIGJhY2sgdG8gYSBkZWZhdWx0IGZvbnQgdG8gYXZvaWQgY29tcGxldGVseSBicm9rZW4gcmVuZGVyaW5nLFxuICAgICAgLy8gYnV0IG5vdGUgdGhhdCB0aGVyZSdyZSBubyBndWFyYW50ZWVzIHRoYXQgdGhpbmdzIHdpbGwgbG9vayBcImNvcnJlY3RcIi5cbiAgICAgIGZvbnRSZWYgPSBQYXJ0aWFsRXZhbHVhdG9yLmZhbGxiYWNrRm9udERpY3Q7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9udENhY2hlLmhhcyhmb250UmVmKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250UmVmKTtcbiAgICB9XG5cbiAgICBmb250ID0geHJlZi5mZXRjaElmUmVmKGZvbnRSZWYpO1xuICAgIGlmICghaXNEaWN0KGZvbnQpKSB7XG4gICAgICByZXR1cm4gZXJyb3JGb250KCk7XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIGhvbGRpbmcgYGZvbnQudHJhbnNsYXRlZGAgcmVmZXJlbmNlcyBqdXN0IGZvciBgZm9udFJlZmBzIHRoYXRcbiAgICAvLyBhcmUgbm90IGFjdHVhbGx5IGBSZWZgcywgYnV0IHJhdGhlciBgRGljdGBzLiBTZWUgZXhwbGFuYXRpb24gYmVsb3cuXG4gICAgaWYgKGZvbnQudHJhbnNsYXRlZCkge1xuICAgICAgcmV0dXJuIGZvbnQudHJhbnNsYXRlZDtcbiAgICB9XG5cbiAgICB2YXIgZm9udENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuXG4gICAgdmFyIHByZUV2YWx1YXRlZEZvbnQgPSB0aGlzLnByZUV2YWx1YXRlRm9udChmb250KTtcbiAgICBjb25zdCB7IGRlc2NyaXB0b3IsIGhhc2ggfSA9IHByZUV2YWx1YXRlZEZvbnQ7XG5cbiAgICB2YXIgZm9udFJlZklzUmVmID0gaXNSZWYoZm9udFJlZiksXG4gICAgICBmb250SUQ7XG4gICAgaWYgKGZvbnRSZWZJc1JlZikge1xuICAgICAgZm9udElEID0gYGYke2ZvbnRSZWYudG9TdHJpbmcoKX1gO1xuICAgIH1cblxuICAgIGlmIChoYXNoICYmIGlzRGljdChkZXNjcmlwdG9yKSkge1xuICAgICAgaWYgKCFkZXNjcmlwdG9yLmZvbnRBbGlhc2VzKSB7XG4gICAgICAgIGRlc2NyaXB0b3IuZm9udEFsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgICAgdmFyIGZvbnRBbGlhc2VzID0gZGVzY3JpcHRvci5mb250QWxpYXNlcztcblxuICAgICAgaWYgKGZvbnRBbGlhc2VzW2hhc2hdKSB7XG4gICAgICAgIHZhciBhbGlhc0ZvbnRSZWYgPSBmb250QWxpYXNlc1toYXNoXS5hbGlhc1JlZjtcbiAgICAgICAgaWYgKGZvbnRSZWZJc1JlZiAmJiBhbGlhc0ZvbnRSZWYgJiYgdGhpcy5mb250Q2FjaGUuaGFzKGFsaWFzRm9udFJlZikpIHtcbiAgICAgICAgICB0aGlzLmZvbnRDYWNoZS5wdXRBbGlhcyhmb250UmVmLCBhbGlhc0ZvbnRSZWYpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZvbnRDYWNoZS5nZXQoZm9udFJlZik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvbnRBbGlhc2VzW2hhc2hdID0ge1xuICAgICAgICAgIGZvbnRJRDogdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb250UmVmSXNSZWYpIHtcbiAgICAgICAgZm9udEFsaWFzZXNbaGFzaF0uYWxpYXNSZWYgPSBmb250UmVmO1xuICAgICAgfVxuICAgICAgZm9udElEID0gZm9udEFsaWFzZXNbaGFzaF0uZm9udElEO1xuICAgIH1cblxuICAgIC8vIFdvcmthcm91bmQgZm9yIGJhZCBQREYgZ2VuZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSBmb250cyBpbmNvcnJlY3RseSxcbiAgICAvLyB3aGVyZSBgZm9udFJlZmAgaXMgYSBgRGljdGAgcmF0aGVyIHRoYW4gYSBgUmVmYCAoZml4ZXMgYnVnOTQ2NTA2LnBkZikuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNob3VsZCBub3QgcHV0IHRoZSBmb250IGludG8gYHRoaXMuZm9udENhY2hlYCAod2hpY2ggaXNcbiAgICAvLyBhIGBSZWZTZXRDYWNoZWApLCBzaW5jZSBpdCdzIG5vdCBtZWFuaW5nZnVsIHRvIHVzZSBhIGBEaWN0YCBhcyBhIGtleS5cbiAgICAvL1xuICAgIC8vIEhvd2V2ZXIsIGlmIHdlIGRvbid0IGNhY2hlIHRoZSBmb250IGl0J3Mgbm90IHBvc3NpYmxlIHRvIHJlbW92ZSBpdFxuICAgIC8vIHdoZW4gYGNsZWFudXBgIGlzIHRyaWdnZXJlZCBmcm9tIHRoZSBBUEksIHdoaWNoIGNhdXNlcyBpc3N1ZXMgb25cbiAgICAvLyBzdWJzZXF1ZW50IHJlbmRlcmluZyBvcGVyYXRpb25zIChzZWUgaXNzdWU3NDAzLnBkZikuXG4gICAgLy8gQSBzaW1wbGUgd29ya2Fyb3VuZCB3b3VsZCBiZSB0byBqdXN0IG5vdCBob2xkIGBmb250LnRyYW5zbGF0ZWRgXG4gICAgLy8gcmVmZXJlbmNlcyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdvdWxkIGZvcmNlIHVzIHRvIHVubmVjZXNzYXJpbHkgbG9hZFxuICAgIC8vIHRoZSBzYW1lIGZvbnRzIG92ZXIgYW5kIG92ZXIuXG4gICAgLy9cbiAgICAvLyBJbnN0ZWFkLCB3ZSBjaGVhdCBhIGJpdCBieSBhdHRlbXB0aW5nIHRvIHVzZSBhIG1vZGlmaWVkIGBmb250SURgIGFzIGFcbiAgICAvLyBrZXkgaW4gYHRoaXMuZm9udENhY2hlYCwgdG8gYWxsb3cgdGhlIGZvbnQgdG8gYmUgY2FjaGVkLlxuICAgIC8vIE5PVEU6IFRoaXMgd29ya3MgYmVjYXVzZSBgUmVmU2V0Q2FjaGVgIGNhbGxzIGB0b1N0cmluZygpYCBvbiBwcm92aWRlZFxuICAgIC8vICAgICAgIGtleXMuIEFsc28sIHNpbmNlIGBmb250UmVmYCBpcyB1c2VkIHdoZW4gZ2V0dGluZyBjYWNoZWQgZm9udHMsXG4gICAgLy8gICAgICAgd2UnbGwgbm90IGFjY2lkZW50YWxseSBtYXRjaCBmb250cyBjYWNoZWQgd2l0aCB0aGUgYGZvbnRJRGAuXG4gICAgaWYgKGZvbnRSZWZJc1JlZikge1xuICAgICAgdGhpcy5mb250Q2FjaGUucHV0KGZvbnRSZWYsIGZvbnRDYXBhYmlsaXR5LnByb21pc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWZvbnRJRCkge1xuICAgICAgICBmb250SUQgPSB0aGlzLmlkRmFjdG9yeS5jcmVhdGVGb250SWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9udENhY2hlLnB1dChgaWRfJHtmb250SUR9YCwgZm9udENhcGFiaWxpdHkucHJvbWlzZSk7XG4gICAgfVxuICAgIGFzc2VydChcbiAgICAgIGZvbnRJRCAmJiBmb250SUQuc3RhcnRzV2l0aChcImZcIiksXG4gICAgICAnVGhlIFwiZm9udElEXCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLidcbiAgICApO1xuXG4gICAgLy8gS2VlcCB0cmFjayBvZiBlYWNoIGZvbnQgd2UgdHJhbnNsYXRlZCBzbyB0aGUgY2FsbGVyIGNhblxuICAgIC8vIGxvYWQgdGhlbSBhc3luY2hyb25vdXNseSBiZWZvcmUgY2FsbGluZyBkaXNwbGF5IG9uIGEgcGFnZS5cbiAgICBmb250LmxvYWRlZE5hbWUgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke2ZvbnRJRH1gO1xuXG4gICAgZm9udC50cmFuc2xhdGVkID0gZm9udENhcGFiaWxpdHkucHJvbWlzZTtcblxuICAgIC8vIFRPRE8gbW92ZSBwcm9taXNlcyBpbnRvIHRyYW5zbGF0ZSBmb250XG4gICAgdmFyIHRyYW5zbGF0ZWRQcm9taXNlO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2xhdGVkUHJvbWlzZSA9IHRoaXMudHJhbnNsYXRlRm9udChwcmVFdmFsdWF0ZWRGb250KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0cmFuc2xhdGVkUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cblxuICAgIHRyYW5zbGF0ZWRQcm9taXNlXG4gICAgICAudGhlbih0cmFuc2xhdGVkRm9udCA9PiB7XG4gICAgICAgIGlmICh0cmFuc2xhdGVkRm9udC5mb250VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIHhyZWZGb250U3RhdHMgPSB4cmVmLnN0YXRzLmZvbnRUeXBlcztcbiAgICAgICAgICB4cmVmRm9udFN0YXRzW3RyYW5zbGF0ZWRGb250LmZvbnRUeXBlXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb250Q2FwYWJpbGl0eS5yZXNvbHZlKFxuICAgICAgICAgIG5ldyBUcmFuc2xhdGVkRm9udCh7XG4gICAgICAgICAgICBsb2FkZWROYW1lOiBmb250LmxvYWRlZE5hbWUsXG4gICAgICAgICAgICBmb250OiB0cmFuc2xhdGVkRm9udCxcbiAgICAgICAgICAgIGRpY3Q6IGZvbnQsXG4gICAgICAgICAgICBleHRyYVByb3BlcnRpZXM6IHRoaXMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgIC8vIFRPRE8gZm9udENhcGFiaWxpdHkucmVqZWN0P1xuICAgICAgICAvLyBFcnJvciBpbiB0aGUgZm9udCBkYXRhIC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZSBub3RpZmljYXRpb24uXG4gICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKFwiVW5zdXBwb3J0ZWRGZWF0dXJlXCIsIHtcbiAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udFRyYW5zbGF0ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBlcnJvciwgYnV0IGl0J3Mgc3RpbGwgbmljZSB0byBoYXZlIGZvbnQgdHlwZSByZXBvcnRlZFxuICAgICAgICAgIHZhciBmb250RmlsZTMgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZ2V0KFwiRm9udEZpbGUzXCIpO1xuICAgICAgICAgIHZhciBzdWJ0eXBlID0gZm9udEZpbGUzICYmIGZvbnRGaWxlMy5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgICAgICAgIHZhciBmb250VHlwZSA9IGdldEZvbnRUeXBlKFxuICAgICAgICAgICAgcHJlRXZhbHVhdGVkRm9udC50eXBlLFxuICAgICAgICAgICAgc3VidHlwZSAmJiBzdWJ0eXBlLm5hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIHZhciB4cmVmRm9udFN0YXRzID0geHJlZi5zdGF0cy5mb250VHlwZXM7XG4gICAgICAgICAgeHJlZkZvbnRTdGF0c1tmb250VHlwZV0gPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChleCkge31cblxuICAgICAgICBmb250Q2FwYWJpbGl0eS5yZXNvbHZlKFxuICAgICAgICAgIG5ldyBUcmFuc2xhdGVkRm9udCh7XG4gICAgICAgICAgICBsb2FkZWROYW1lOiBmb250LmxvYWRlZE5hbWUsXG4gICAgICAgICAgICBmb250OiBuZXcgRXJyb3JGb250KFxuICAgICAgICAgICAgICByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbi5tZXNzYWdlIDogcmVhc29uXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGljdDogZm9udCxcbiAgICAgICAgICAgIGV4dHJhUHJvcGVydGllczogdGhpcy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBmb250Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgYnVpbGRQYXRoKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIHBhcnNpbmdUZXh0ID0gZmFsc2UpIHtcbiAgICB2YXIgbGFzdEluZGV4ID0gb3BlcmF0b3JMaXN0Lmxlbmd0aCAtIDE7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICBhcmdzID0gW107XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGxhc3RJbmRleCA8IDAgfHxcbiAgICAgIG9wZXJhdG9yTGlzdC5mbkFycmF5W2xhc3RJbmRleF0gIT09IE9QUy5jb25zdHJ1Y3RQYXRoXG4gICAgKSB7XG4gICAgICAvLyBIYW5kbGUgY29ycnVwdCBQREYgZG9jdW1lbnRzIHRoYXQgY29udGFpbnMgcGF0aCBvcGVyYXRvcnMgaW5zaWRlIG9mXG4gICAgICAvLyB0ZXh0IG9iamVjdHMsIHdoaWNoIG1heSBzaGlmdCBzdWJzZXF1ZW50IHRleHQsIGJ5IGVuY2xvc2luZyB0aGUgcGF0aFxuICAgICAgLy8gb3BlcmF0b3IgaW4gc2F2ZS9yZXN0b3JlIG9wZXJhdG9ycyAoZml4ZXMgaXNzdWUxMDU0Ml9yZWR1Y2VkLnBkZikuXG4gICAgICAvL1xuICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBlZmZlY3RpdmVseSBkaXNhYmxlIHRoZSBvcHRpbWl6YXRpb24gaW4gdGhlXG4gICAgICAvLyBgZWxzZWAgYnJhbmNoIGJlbG93LCBidXQgZ2l2ZW4gdGhhdCB0aGlzIHR5cGUgb2YgY29ycnVwdGlvbiBpc1xuICAgICAgLy8gKmV4dHJlbWVseSogcmFyZSB0aGF0IHNob3VsZG4ndCByZWFsbHkgbWF0dGVyIG11Y2ggaW4gcHJhY3RpY2UuXG4gICAgICBpZiAocGFyc2luZ1RleHQpIHtcbiAgICAgICAgd2FybihgRW5jb3VudGVyZWQgcGF0aCBvcGVyYXRvciBcIiR7Zm59XCIgaW5zaWRlIG9mIGEgdGV4dCBvYmplY3QuYCk7XG4gICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2F2ZSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuY29uc3RydWN0UGF0aCwgW1tmbl0sIGFyZ3NdKTtcblxuICAgICAgaWYgKHBhcnNpbmdUZXh0KSB7XG4gICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucmVzdG9yZSwgbnVsbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvcEFyZ3MgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5W2xhc3RJbmRleF07XG4gICAgICBvcEFyZ3NbMF0ucHVzaChmbik7XG4gICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShvcEFyZ3NbMV0sIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlQ29sb3JTcGFjZSh7IGNzLCByZXNvdXJjZXMsIGxvY2FsQ29sb3JTcGFjZUNhY2hlIH0pIHtcbiAgICByZXR1cm4gQ29sb3JTcGFjZS5wYXJzZUFzeW5jKHtcbiAgICAgIGNzLFxuICAgICAgeHJlZjogdGhpcy54cmVmLFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgLy8gRXJyb3IocykgaW4gdGhlIENvbG9yU3BhY2UgLS0gc2VuZGluZyB1bnN1cHBvcnRlZCBmZWF0dXJlXG4gICAgICAgIC8vIG5vdGlmaWNhdGlvbiBhbmQgYWxsb3cgcmVuZGVyaW5nIHRvIGNvbnRpbnVlLlxuICAgICAgICB0aGlzLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckNvbG9yU3BhY2UsXG4gICAgICAgIH0pO1xuICAgICAgICB3YXJuKGBwYXJzZUNvbG9yU3BhY2UgLSBpZ25vcmluZyBDb2xvclNwYWNlOiBcIiR7cmVhc29ufVwiLmApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUNvbG9yTihcbiAgICBvcGVyYXRvckxpc3QsXG4gICAgZm4sXG4gICAgYXJncyxcbiAgICBjcyxcbiAgICBwYXR0ZXJucyxcbiAgICByZXNvdXJjZXMsXG4gICAgdGFzayxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICApIHtcbiAgICAvLyBjb21waWxlIHRpbGluZyBwYXR0ZXJuc1xuICAgIHZhciBwYXR0ZXJuTmFtZSA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAvLyBTQ04vc2NuIGFwcGxpZXMgcGF0dGVybnMgYWxvbmcgd2l0aCBub3JtYWwgY29sb3JzXG4gICAgdmFyIHBhdHRlcm47XG4gICAgaWYgKGlzTmFtZShwYXR0ZXJuTmFtZSkgJiYgKHBhdHRlcm4gPSBwYXR0ZXJucy5nZXQocGF0dGVybk5hbWUubmFtZSkpKSB7XG4gICAgICB2YXIgZGljdCA9IGlzU3RyZWFtKHBhdHRlcm4pID8gcGF0dGVybi5kaWN0IDogcGF0dGVybjtcbiAgICAgIHZhciB0eXBlTnVtID0gZGljdC5nZXQoXCJQYXR0ZXJuVHlwZVwiKTtcblxuICAgICAgaWYgKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlRJTElORykge1xuICAgICAgICB2YXIgY29sb3IgPSBjcy5iYXNlID8gY3MuYmFzZS5nZXRSZ2IoYXJncywgMCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVUaWxpbmdUeXBlKFxuICAgICAgICAgIGZuLFxuICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICBwYXR0ZXJuLFxuICAgICAgICAgIGRpY3QsXG4gICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgIHRhc2tcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZU51bSA9PT0gUGF0dGVyblR5cGUuU0hBRElORykge1xuICAgICAgICB2YXIgc2hhZGluZyA9IGRpY3QuZ2V0KFwiU2hhZGluZ1wiKTtcbiAgICAgICAgdmFyIG1hdHJpeCA9IGRpY3QuZ2V0QXJyYXkoXCJNYXRyaXhcIik7XG4gICAgICAgIHBhdHRlcm4gPSBQYXR0ZXJuLnBhcnNlU2hhZGluZyhcbiAgICAgICAgICBzaGFkaW5nLFxuICAgICAgICAgIG1hdHJpeCxcbiAgICAgICAgICB0aGlzLnhyZWYsXG4gICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgIHRoaXMuaGFuZGxlcixcbiAgICAgICAgICB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgICAgICAgKTtcbiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCBwYXR0ZXJuLmdldElSKCkpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbmtub3duIFBhdHRlcm5UeXBlOiAke3R5cGVOdW19YCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuTmFtZTogJHtwYXR0ZXJuTmFtZX1gKTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlTWFya2VkQ29udGVudFByb3BzKGNvbnRlbnRQcm9wZXJ0aWVzLCByZXNvdXJjZXMpIHtcbiAgICBsZXQgb3B0aW9uYWxDb250ZW50O1xuICAgIGlmIChpc05hbWUoY29udGVudFByb3BlcnRpZXMpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gcmVzb3VyY2VzLmdldChcIlByb3BlcnRpZXNcIik7XG4gICAgICBvcHRpb25hbENvbnRlbnQgPSBwcm9wZXJ0aWVzLmdldChjb250ZW50UHJvcGVydGllcy5uYW1lKTtcbiAgICB9IGVsc2UgaWYgKGlzRGljdChjb250ZW50UHJvcGVydGllcykpIHtcbiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGNvbnRlbnRQcm9wZXJ0aWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25hbENvbnRlbnRUeXBlID0gb3B0aW9uYWxDb250ZW50LmdldChcIlR5cGVcIikubmFtZTtcbiAgICBpZiAob3B0aW9uYWxDb250ZW50VHlwZSA9PT0gXCJPQ0dcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSxcbiAgICAgICAgaWQ6IG9wdGlvbmFsQ29udGVudC5vYmpJZCxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSBcIk9DTURcIikge1xuICAgICAgY29uc3Qgb3B0aW9uYWxDb250ZW50R3JvdXBzID0gb3B0aW9uYWxDb250ZW50LmdldChcIk9DR3NcIik7XG4gICAgICBpZiAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSB8fFxuICAgICAgICBpc0RpY3Qob3B0aW9uYWxDb250ZW50R3JvdXBzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwSWRzID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbmFsQ29udGVudEdyb3VwcykpIHtcbiAgICAgICAgICBvcHRpb25hbENvbnRlbnQuZ2V0KFwiT0NHc1wiKS5mb3JFYWNoKG9jZyA9PiB7XG4gICAgICAgICAgICBncm91cElkcy5wdXNoKG9jZy50b1N0cmluZygpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEaWN0aW9uYXJ5LCBqdXN0IHVzZSB0aGUgb2JqIGlkLlxuICAgICAgICAgIGdyb3VwSWRzLnB1c2gob3B0aW9uYWxDb250ZW50R3JvdXBzLm9iaklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBleHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbmFsQ29udGVudC5nZXQoXCJWRVwiKSkge1xuICAgICAgICAgIC8vIFRPRE8gc3VwcG9ydCB2aXNpYmlsaXR5IGV4cHJlc3Npb24uXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsXG4gICAgICAgICAgaWRzOiBncm91cElkcyxcbiAgICAgICAgICBwb2xpY3k6IGlzTmFtZShvcHRpb25hbENvbnRlbnQuZ2V0KFwiUFwiKSlcbiAgICAgICAgICAgID8gb3B0aW9uYWxDb250ZW50LmdldChcIlBcIikubmFtZVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVmKG9wdGlvbmFsQ29udGVudEdyb3VwcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBvcHRpb25hbENvbnRlbnRUeXBlLFxuICAgICAgICAgIGlkOiBvcHRpb25hbENvbnRlbnRHcm91cHMudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRPcGVyYXRvckxpc3Qoe1xuICAgIHN0cmVhbSxcbiAgICB0YXNrLFxuICAgIHJlc291cmNlcyxcbiAgICBvcGVyYXRvckxpc3QsXG4gICAgaW5pdGlhbFN0YXRlID0gbnVsbCxcbiAgfSkge1xuICAgIC8vIEVuc3VyZSB0aGF0IGByZXNvdXJjZXNgL2Bpbml0aWFsU3RhdGVgIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCxcbiAgICAvLyBldmVuIGlmIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIgaXMgZS5nLiBgbnVsbGAuXG4gICAgcmVzb3VyY2VzID0gcmVzb3VyY2VzIHx8IERpY3QuZW1wdHk7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlIHx8IG5ldyBFdmFsU3RhdGUoKTtcblxuICAgIGlmICghb3BlcmF0b3JMaXN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldE9wZXJhdG9yTGlzdDogbWlzc2luZyBcIm9wZXJhdG9yTGlzdFwiIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgeHJlZiA9IHRoaXMueHJlZjtcbiAgICBsZXQgcGFyc2luZ1RleHQgPSBmYWxzZTtcbiAgICBjb25zdCBsb2NhbEltYWdlQ2FjaGUgPSBuZXcgTG9jYWxJbWFnZUNhY2hlKCk7XG4gICAgY29uc3QgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTtcbiAgICBjb25zdCBsb2NhbEdTdGF0ZUNhY2hlID0gbmV3IExvY2FsR1N0YXRlQ2FjaGUoKTtcblxuICAgIHZhciB4b2JqcyA9IHJlc291cmNlcy5nZXQoXCJYT2JqZWN0XCIpIHx8IERpY3QuZW1wdHk7XG4gICAgdmFyIHBhdHRlcm5zID0gcmVzb3VyY2VzLmdldChcIlBhdHRlcm5cIikgfHwgRGljdC5lbXB0eTtcbiAgICB2YXIgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihpbml0aWFsU3RhdGUpO1xuICAgIHZhciBwcmVwcm9jZXNzb3IgPSBuZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKTtcbiAgICB2YXIgdGltZVNsb3RNYW5hZ2VyID0gbmV3IFRpbWVTbG90TWFuYWdlcigpO1xuXG4gICAgZnVuY3Rpb24gY2xvc2VQZW5kaW5nUmVzdG9yZU9QUyhhcmd1bWVudCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcHJlcHJvY2Vzc29yLnNhdmVkU3RhdGVzRGVwdGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucmVzdG9yZSwgW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlQm9keShyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBQcm9taXNlLmFsbChbcHJvbWlzZSwgb3BlcmF0b3JMaXN0LnJlYWR5XSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfTtcbiAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpO1xuICAgICAgdGltZVNsb3RNYW5hZ2VyLnJlc2V0KCk7XG4gICAgICB2YXIgc3RvcCxcbiAgICAgICAgb3BlcmF0aW9uID0ge30sXG4gICAgICAgIGksXG4gICAgICAgIGlpLFxuICAgICAgICBjcyxcbiAgICAgICAgbmFtZTtcbiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHtcbiAgICAgICAgLy8gVGhlIGFyZ3VtZW50cyBwYXJzZWQgYnkgcmVhZCgpIGFyZSB1c2VkIGJleW9uZCB0aGlzIGxvb3AsIHNvIHdlXG4gICAgICAgIC8vIGNhbm5vdCByZXVzZSB0aGUgc2FtZSBhcnJheSBvbiBlYWNoIGl0ZXJhdGlvbi4gVGhlcmVmb3JlIHdlIHBhc3NcbiAgICAgICAgLy8gaW4gfG51bGx8IGFzIHRoZSBpbml0aWFsIHZhbHVlIChzZWUgdGhlIGNvbW1lbnQgb25cbiAgICAgICAgLy8gRXZhbHVhdG9yUHJlcHJvY2Vzc29yX3JlYWQoKSBmb3Igd2h5KS5cbiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBudWxsO1xuICAgICAgICBpZiAoIXByZXByb2Nlc3Nvci5yZWFkKG9wZXJhdGlvbikpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXJncyA9IG9wZXJhdGlvbi5hcmdzO1xuICAgICAgICB2YXIgZm4gPSBvcGVyYXRpb24uZm47XG5cbiAgICAgICAgc3dpdGNoIChmbiB8IDApIHtcbiAgICAgICAgICBjYXNlIE9QUy5wYWludFhPYmplY3Q6XG4gICAgICAgICAgICAvLyBlYWdlcmx5IGNvbXBpbGUgWEZvcm0gb2JqZWN0c1xuICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpO1xuICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkge1xuICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChsb2NhbEltYWdlLmZuLCBsb2NhbEltYWdlLmFyZ3MpO1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5leHQoXG4gICAgICAgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlWE9iamVjdCwgcmVqZWN0WE9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiWE9iamVjdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB4b2JqID0geG9ianMuZ2V0UmF3KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh4b2JqIGluc3RhbmNlb2YgUmVmKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5UmVmKHhvYmopO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGxvY2FsSW1hZ2UuZm4sIGxvY2FsSW1hZ2UuYXJncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWxJbWFnZSA9IHNlbGYuZ2xvYmFsSW1hZ2VDYWNoZS5nZXREYXRhKFxuICAgICAgICAgICAgICAgICAgICB4b2JqLFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZ2VJbmRleFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxJbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShnbG9iYWxJbWFnZS5vYmpJZCk7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChnbG9iYWxJbWFnZS5mbiwgZ2xvYmFsSW1hZ2UuYXJncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzU3RyZWFtKHhvYmopKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJYT2JqZWN0IHNob3VsZCBiZSBhIHN0cmVhbVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0geG9iai5kaWN0LmdldChcIlN1YnR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hbWUodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGVcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUubmFtZSA9PT0gXCJGb3JtXCIpIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zYXZlKCk7XG4gICAgICAgICAgICAgICAgICBzZWxmXG4gICAgICAgICAgICAgICAgICAgIC5idWlsZEZvcm1YT2JqZWN0KFxuICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICB4b2JqLFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgICAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnJlc3RvcmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB9LCByZWplY3RYT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUubmFtZSA9PT0gXCJJbWFnZVwiKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmXG4gICAgICAgICAgICAgICAgICAgIC5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IHhvYmosXG4gICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSBcIlBTXCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFBvc3RTY3JpcHQgWE9iamVjdHMgYXJlIHVudXNlZCB3aGVuIHZpZXdpbmcgZG9jdW1lbnRzLlxuICAgICAgICAgICAgICAgICAgLy8gU2VlIHNlY3Rpb24gNC43LjEgb2YgQWRvYmUncyBQREYgcmVmZXJlbmNlLlxuICAgICAgICAgICAgICAgICAgaW5mbyhcIklnbm9yZWQgWE9iamVjdCBzdWJ0eXBlIFBTXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBVbmhhbmRsZWQgWE9iamVjdCBzdWJ0eXBlICR7dHlwZS5uYW1lfWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVycm9yKHMpIGluIHRoZSBYT2JqZWN0IC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGFuZCBhbGxvdyByZW5kZXJpbmcgdG8gY29udGludWUuXG4gICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JYT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBYT2JqZWN0OiBcIiR7cmVhc29ufVwiLmApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZvbnQ6XG4gICAgICAgICAgICB2YXIgZm9udFNpemUgPSBhcmdzWzFdO1xuICAgICAgICAgICAgLy8gZWFnZXJseSBjb2xsZWN0IGFsbCBmb250c1xuICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgIC5oYW5kbGVTZXRGb250KFxuICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsXG4gICAgICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChsb2FkZWROYW1lKSB7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2V0Rm9udCwgW2xvYWRlZE5hbWUsIGZvbnRTaXplXSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSBPUFMuYmVnaW5UZXh0OlxuICAgICAgICAgICAgcGFyc2luZ1RleHQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuZW5kVGV4dDpcbiAgICAgICAgICAgIHBhcnNpbmdUZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5lbmRJbmxpbmVJbWFnZTpcbiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IGFyZ3NbMF0uY2FjaGVLZXk7XG4gICAgICAgICAgICBpZiAoY2FjaGVLZXkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbG9jYWxJbWFnZSA9IGxvY2FsSW1hZ2VDYWNoZS5nZXRCeU5hbWUoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkge1xuICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChsb2NhbEltYWdlLmZuLCBsb2NhbEltYWdlLmFyZ3MpO1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0KFxuICAgICAgICAgICAgICBzZWxmLmJ1aWxkUGFpbnRJbWFnZVhPYmplY3Qoe1xuICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICBpbWFnZTogYXJnc1swXSxcbiAgICAgICAgICAgICAgICBpc0lubGluZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsXG4gICAgICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLFxuICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICBjYXNlIE9QUy5zaG93VGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXJyID0gYXJnc1swXTtcbiAgICAgICAgICAgIHZhciBjb21iaW5lZEdseXBocyA9IFtdO1xuICAgICAgICAgICAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGU7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgdmFyIGFyckl0ZW0gPSBhcnJbaV07XG4gICAgICAgICAgICAgIGlmIChpc1N0cmluZyhhcnJJdGVtKSkge1xuICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KFxuICAgICAgICAgICAgICAgICAgY29tYmluZWRHbHlwaHMsXG4gICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRleHQoYXJySXRlbSwgc3RhdGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bShhcnJJdGVtKSkge1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkR2x5cGhzLnB1c2goYXJySXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3NbMF0gPSBjb21iaW5lZEdseXBocztcbiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTaG93VGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLm5leHRMaW5lKTtcbiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6XG4gICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7XG4gICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5uZXh0TGluZSk7XG4gICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldFdvcmRTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7XG4gICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldENoYXJTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7XG4gICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7XG4gICAgICAgICAgICBmbiA9IE9QUy5zaG93VGV4dDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOlxuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnRleHRSZW5kZXJpbmdNb2RlID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yU3BhY2U6IHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSBDb2xvclNwYWNlLmdldENhY2hlZChcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkge1xuICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBjYWNoZWRDb2xvclNwYWNlO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgIC5wYXJzZUNvbG9yU3BhY2Uoe1xuICAgICAgICAgICAgICAgICAgY3M6IGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjb2xvclNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY29sb3JTcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBjb2xvclNwYWNlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvclNwYWNlOiB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5nZXRDYWNoZWQoXG4gICAgICAgICAgICAgIGFyZ3NbMF0sXG4gICAgICAgICAgICAgIHhyZWYsXG4gICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHtcbiAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBjYWNoZWRDb2xvclNwYWNlO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgIC5wYXJzZUNvbG9yU3BhY2Uoe1xuICAgICAgICAgICAgICAgICAgY3M6IGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjb2xvclNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY29sb3JTcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvcjpcbiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlO1xuICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNldEZpbGxSR0JDb2xvcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yOlxuICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZTtcbiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7XG4gICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OlxuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7XG4gICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGFyZ3MsIDApO1xuICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlR3JheTpcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7XG4gICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGFyZ3MsIDApO1xuICAgICAgICAgICAgZm4gPSBPUFMuc2V0U3Ryb2tlUkdCQ29sb3I7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ01ZS0NvbG9yOlxuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWs7XG4gICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKGFyZ3MsIDApO1xuICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOlxuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMuY215aztcbiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoYXJncywgMCk7XG4gICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjpcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7XG4gICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoYXJncywgMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VSR0JDb2xvcjpcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjtcbiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihhcmdzLCAwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvck46XG4gICAgICAgICAgICBjcyA9IHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZTtcbiAgICAgICAgICAgIGlmIChjcy5uYW1lID09PSBcIlBhdHRlcm5cIikge1xuICAgICAgICAgICAgICBuZXh0KFxuICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQ29sb3JOKFxuICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgICAgICAgICAgT1BTLnNldEZpbGxDb2xvck4sXG4gICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgY3MsXG4gICAgICAgICAgICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNldEZpbGxSR0JDb2xvcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjpcbiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7XG4gICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gXCJQYXR0ZXJuXCIpIHtcbiAgICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUNvbG9yTihcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCxcbiAgICAgICAgICAgICAgICAgIE9QUy5zZXRTdHJva2VDb2xvck4sXG4gICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgY3MsXG4gICAgICAgICAgICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDpcbiAgICAgICAgICAgIHZhciBzaGFkaW5nUmVzID0gcmVzb3VyY2VzLmdldChcIlNoYWRpbmdcIik7XG4gICAgICAgICAgICBpZiAoIXNoYWRpbmdSZXMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTm8gc2hhZGluZyByZXNvdXJjZSBmb3VuZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNoYWRpbmcgPSBzaGFkaW5nUmVzLmdldChhcmdzWzBdLm5hbWUpO1xuICAgICAgICAgICAgaWYgKCFzaGFkaW5nKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk5vIHNoYWRpbmcgb2JqZWN0IGZvdW5kXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc2hhZGluZ0ZpbGwgPSBQYXR0ZXJuLnBhcnNlU2hhZGluZyhcbiAgICAgICAgICAgICAgc2hhZGluZyxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIsXG4gICAgICAgICAgICAgIHNlbGYuX3BkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgcGF0dGVybklSID0gc2hhZGluZ0ZpbGwuZ2V0SVIoKTtcbiAgICAgICAgICAgIGFyZ3MgPSBbcGF0dGVybklSXTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNoYWRpbmdGaWxsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0R1N0YXRlOlxuICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxvY2FsR1N0YXRlT2JqID0gbG9jYWxHU3RhdGVDYWNoZS5nZXRCeU5hbWUobmFtZSk7XG4gICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iaikge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iai5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldEdTdGF0ZSwgW2xvY2FsR1N0YXRlT2JqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5leHQoXG4gICAgICAgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlR1N0YXRlLCByZWplY3RHU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IHJlc291cmNlcy5nZXQoXCJFeHRHU3RhdGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkV4dEdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBnU3RhdGUgPSBleHRHU3RhdGUuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEF0dGVtcHQgdG8gbG9va3VwIGNhY2hlZCBHU3RhdGVzIGJ5IHJlZmVyZW5jZSBhcyB3ZWxsLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGFyZSBQREYgZG9jdW1lbnRzIHdoZXJlIGRvaW5nIHNvXG4gICAgICAgICAgICAgICAgLy8gICAgICAgd291bGQgc2lnbmlmaWNhbnRseSBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICAgICAgICAgICAgICAgIGlmICghKGdTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgICAgLnNldEdTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgZ1N0YXRlLFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVycm9yKHMpIGluIHRoZSBFeHRHU3RhdGUgLS0gc2VuZGluZyB1bnN1cHBvcnRlZCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gYW5kIGFsbG93IHBhcnNpbmcvcmVuZGVyaW5nIHRvIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRXh0R1N0YXRlLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBFeHRHU3RhdGU6IFwiJHtyZWFzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSBPUFMubW92ZVRvOlxuICAgICAgICAgIGNhc2UgT1BTLmxpbmVUbzpcbiAgICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvOlxuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8yOlxuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8zOlxuICAgICAgICAgIGNhc2UgT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6XG4gICAgICAgICAgICBzZWxmLmJ1aWxkUGF0aChvcGVyYXRvckxpc3QsIGZuLCBhcmdzLCBwYXJzaW5nVGV4dCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIE9QUy5tYXJrUG9pbnQ6XG4gICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50UHJvcHM6XG4gICAgICAgICAgY2FzZSBPUFMuYmVnaW5Db21wYXQ6XG4gICAgICAgICAgY2FzZSBPUFMuZW5kQ29tcGF0OlxuICAgICAgICAgICAgLy8gSWdub3JlIG9wZXJhdG9ycyB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGVycyBhcmUga25vd24gdG9cbiAgICAgICAgICAgIC8vIGJlIG5vLW9wIGluIENhbnZhc0dyYXBoaWNzIChkaXNwbGF5L2NhbnZhcy5qcykuIFRoaXMgcHJldmVudHNcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YXRpb24gZXJyb3JzIGFuZCBpcyBhbHNvIGEgYml0IG1vcmUgZWZmaWNpZW50LlxuICAgICAgICAgICAgLy8gV2UgY291bGQgYWxzbyB0cnkgdG8gc2VyaWFsaXplIGFsbCBvYmplY3RzIGluIGEgZ2VuZXJhbCB3YXksXG4gICAgICAgICAgICAvLyBlLmcuIGFzIGRvbmUgaW4gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcGRmLmpzL3B1bGwvNjI2NixcbiAgICAgICAgICAgIC8vIGJ1dCBkb2luZyBzbyBpcyBtZWFuaW5nbGVzcyB3aXRob3V0IGtub3dpbmcgdGhlIHNlbWFudGljcy5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzOlxuICAgICAgICAgICAgaWYgKCFpc05hbWUoYXJnc1swXSkpIHtcbiAgICAgICAgICAgICAgd2FybihgRXhwZWN0ZWQgbmFtZSBmb3IgYmVnaW5NYXJrZWRDb250ZW50UHJvcHMgYXJnMD0ke2FyZ3NbMF19YCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZ3NbMF0ubmFtZSA9PT0gXCJPQ1wiKSB7XG4gICAgICAgICAgICAgIG5leHQoXG4gICAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgICAgLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcylcbiAgICAgICAgICAgICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbXG4gICAgICAgICAgICAgICAgICAgICAgXCJPQ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yTWFya2VkQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiBcIiR7cmVhc29ufVwiLmBcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlciBtYXJrZWQgY29udGVudCB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldC5cbiAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1swXS5uYW1lXTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50OlxuICAgICAgICAgIGNhc2UgT1BTLmVuZE1hcmtlZENvbnRlbnQ6XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIE5vdGU6IElnbm9yZSB0aGUgb3BlcmF0b3IgaWYgaXQgaGFzIGBEaWN0YCBhcmd1bWVudHMsIHNpbmNlXG4gICAgICAgICAgICAvLyB0aG9zZSBhcmUgbm9uLXNlcmlhbGl6YWJsZSwgb3RoZXJ3aXNlIHBvc3RNZXNzYWdlIHdpbGwgdGhyb3dcbiAgICAgICAgICAgIC8vIFwiQW4gb2JqZWN0IGNvdWxkIG5vdCBiZSBjbG9uZWQuXCIuXG4gICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldIGluc3RhbmNlb2YgRGljdCkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpIDwgaWkpIHtcbiAgICAgICAgICAgICAgICB3YXJuKFwiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3Jpbmcgb3BlcmF0b3I6IFwiICsgZm4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdG9wKSB7XG4gICAgICAgIG5leHQoZGVmZXJyZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTb21lIFBERnMgZG9uJ3QgY2xvc2UgYWxsIHJlc3RvcmVzIGluc2lkZSBvYmplY3QvZm9ybS5cbiAgICAgIC8vIENsb3NpbmcgdGhvc2UgZm9yIHRoZW0uXG4gICAgICBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICAvLyBFcnJvcihzKSBpbiB0aGUgT3BlcmF0b3JMaXN0IC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZVxuICAgICAgICAvLyBub3RpZmljYXRpb24gYW5kIGFsbG93IHJlbmRlcmluZyB0byBjb250aW51ZS5cbiAgICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JPcGVyYXRvckxpc3QsXG4gICAgICAgIH0pO1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nIFwiJHt0YXNrLm5hbWV9XCIgYCArXG4gICAgICAgICAgICBgdGFzazogXCIke3JlYXNvbn1cIi5gXG4gICAgICAgICk7XG5cbiAgICAgICAgY2xvc2VQZW5kaW5nUmVzdG9yZU9QUygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG4gIH1cblxuICBnZXRUZXh0Q29udGVudCh7XG4gICAgc3RyZWFtLFxuICAgIHRhc2ssXG4gICAgcmVzb3VyY2VzLFxuICAgIHN0YXRlTWFuYWdlciA9IG51bGwsXG4gICAgbm9ybWFsaXplV2hpdGVzcGFjZSA9IGZhbHNlLFxuICAgIGNvbWJpbmVUZXh0SXRlbXMgPSBmYWxzZSxcbiAgICBzaW5rLFxuICAgIHNlZW5TdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpLFxuICB9KSB7XG4gICAgLy8gRW5zdXJlIHRoYXQgYHJlc291cmNlc2AvYHN0YXRlTWFuYWdlcmAgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkLFxuICAgIC8vIGV2ZW4gaWYgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBpcyBlLmcuIGBudWxsYC5cbiAgICByZXNvdXJjZXMgPSByZXNvdXJjZXMgfHwgRGljdC5lbXB0eTtcbiAgICBzdGF0ZU1hbmFnZXIgPSBzdGF0ZU1hbmFnZXIgfHwgbmV3IFN0YXRlTWFuYWdlcihuZXcgVGV4dFN0YXRlKCkpO1xuXG4gICAgdmFyIFdoaXRlc3BhY2VSZWdleHAgPSAvXFxzL2c7XG5cbiAgICB2YXIgdGV4dENvbnRlbnQgPSB7XG4gICAgICBpdGVtczogW10sXG4gICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgfTtcbiAgICB2YXIgdGV4dENvbnRlbnRJdGVtID0ge1xuICAgICAgaW5pdGlhbGl6ZWQ6IGZhbHNlLFxuICAgICAgc3RyOiBbXSxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgdmVydGljYWw6IGZhbHNlLFxuICAgICAgbGFzdEFkdmFuY2VXaWR0aDogMCxcbiAgICAgIGxhc3RBZHZhbmNlSGVpZ2h0OiAwLFxuICAgICAgdGV4dEFkdmFuY2VTY2FsZTogMCxcbiAgICAgIHNwYWNlV2lkdGg6IDAsXG4gICAgICBmYWtlU3BhY2VNaW46IEluZmluaXR5LFxuICAgICAgZmFrZU11bHRpU3BhY2VNaW46IEluZmluaXR5LFxuICAgICAgZmFrZU11bHRpU3BhY2VNYXg6IC0wLFxuICAgICAgdGV4dFJ1bkJyZWFrQWxsb3dlZDogZmFsc2UsXG4gICAgICB0cmFuc2Zvcm06IG51bGwsXG4gICAgICBmb250TmFtZTogbnVsbCxcbiAgICB9O1xuICAgIHZhciBTUEFDRV9GQUNUT1IgPSAwLjM7XG4gICAgdmFyIE1VTFRJX1NQQUNFX0ZBQ1RPUiA9IDEuNTtcbiAgICB2YXIgTVVMVElfU1BBQ0VfRkFDVE9SX01BWCA9IDQ7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7XG5cbiAgICAvLyBUaGUgeG9iaiBpcyBwYXJzZWQgaWZmIGl0J3MgbmVlZGVkLCBlLmcuIGlmIHRoZXJlIGlzIGEgYERPYCBjbWQuXG4gICAgdmFyIHhvYmpzID0gbnVsbDtcbiAgICBjb25zdCBlbXB0eVhPYmplY3RDYWNoZSA9IG5ldyBMb2NhbEltYWdlQ2FjaGUoKTtcbiAgICBjb25zdCBlbXB0eUdTdGF0ZUNhY2hlID0gbmV3IExvY2FsR1N0YXRlQ2FjaGUoKTtcblxuICAgIHZhciBwcmVwcm9jZXNzb3IgPSBuZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKTtcblxuICAgIHZhciB0ZXh0U3RhdGU7XG5cbiAgICBmdW5jdGlvbiBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKSB7XG4gICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7XG4gICAgICAgIHJldHVybiB0ZXh0Q29udGVudEl0ZW07XG4gICAgICB9XG4gICAgICB2YXIgZm9udCA9IHRleHRTdGF0ZS5mb250O1xuICAgICAgaWYgKCEoZm9udC5sb2FkZWROYW1lIGluIHNlZW5TdHlsZXMpKSB7XG4gICAgICAgIHNlZW5TdHlsZXNbZm9udC5sb2FkZWROYW1lXSA9IHRydWU7XG4gICAgICAgIHRleHRDb250ZW50LnN0eWxlc1tmb250LmxvYWRlZE5hbWVdID0ge1xuICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQuZmFsbGJhY2tOYW1lLFxuICAgICAgICAgIGFzY2VudDogZm9udC5hc2NlbnQsXG4gICAgICAgICAgZGVzY2VudDogZm9udC5kZXNjZW50LFxuICAgICAgICAgIHZlcnRpY2FsOiBmb250LnZlcnRpY2FsLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGV4dENvbnRlbnRJdGVtLmZvbnROYW1lID0gZm9udC5sb2FkZWROYW1lO1xuXG4gICAgICAvLyA5LjQuNCBUZXh0IFNwYWNlIERldGFpbHNcbiAgICAgIHZhciB0c20gPSBbXG4gICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSAqIHRleHRTdGF0ZS50ZXh0SFNjYWxlLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICB0ZXh0U3RhdGUuZm9udFNpemUsXG4gICAgICAgIDAsXG4gICAgICAgIHRleHRTdGF0ZS50ZXh0UmlzZSxcbiAgICAgIF07XG5cbiAgICAgIGlmIChcbiAgICAgICAgZm9udC5pc1R5cGUzRm9udCAmJlxuICAgICAgICB0ZXh0U3RhdGUuZm9udFNpemUgPD0gMSAmJlxuICAgICAgICAhaXNBcnJheUVxdWFsKHRleHRTdGF0ZS5mb250TWF0cml4LCBGT05UX0lERU5USVRZX01BVFJJWClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBnbHlwaEhlaWdodCA9IGZvbnQuYmJveFszXSAtIGZvbnQuYmJveFsxXTtcbiAgICAgICAgaWYgKGdseXBoSGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRzbVszXSAqPSBnbHlwaEhlaWdodCAqIHRleHRTdGF0ZS5mb250TWF0cml4WzNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB0cm0gPSBVdGlsLnRyYW5zZm9ybShcbiAgICAgICAgdGV4dFN0YXRlLmN0bSxcbiAgICAgICAgVXRpbC50cmFuc2Zvcm0odGV4dFN0YXRlLnRleHRNYXRyaXgsIHRzbSlcbiAgICAgICk7XG4gICAgICB0ZXh0Q29udGVudEl0ZW0udHJhbnNmb3JtID0gdHJtO1xuICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IDA7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgPSBNYXRoLnNxcnQodHJtWzJdICogdHJtWzJdICsgdHJtWzNdICogdHJtWzNdKTtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSBNYXRoLnNxcnQodHJtWzBdICogdHJtWzBdICsgdHJtWzFdICogdHJtWzFdKTtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IDA7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBhID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzBdO1xuICAgICAgdmFyIGIgPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMV07XG4gICAgICB2YXIgc2NhbGVMaW5lWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcbiAgICAgIGEgPSB0ZXh0U3RhdGUuY3RtWzBdO1xuICAgICAgYiA9IHRleHRTdGF0ZS5jdG1bMV07XG4gICAgICB2YXIgc2NhbGVDdG1YID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUN0bVggKiBzY2FsZUxpbmVYO1xuICAgICAgdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGggPSAwO1xuICAgICAgdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0ID0gMDtcblxuICAgICAgdmFyIHNwYWNlV2lkdGggPSAoZm9udC5zcGFjZVdpZHRoIC8gMTAwMCkgKiB0ZXh0U3RhdGUuZm9udFNpemU7XG4gICAgICBpZiAoc3BhY2VXaWR0aCkge1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0uc3BhY2VXaWR0aCA9IHNwYWNlV2lkdGg7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS5mYWtlU3BhY2VNaW4gPSBzcGFjZVdpZHRoICogU1BBQ0VfRkFDVE9SO1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNaW4gPSBzcGFjZVdpZHRoICogTVVMVElfU1BBQ0VfRkFDVE9SO1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXggPSBzcGFjZVdpZHRoICogTVVMVElfU1BBQ0VfRkFDVE9SX01BWDtcbiAgICAgICAgLy8gSXQncyBva2F5IGZvciBtb25vc3BhY2UgZm9udHMgdG8gZmFrZSBhcyBtdWNoIHNwYWNlIGFzIG5lZWRlZC5cbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgPSAhZm9udC5pc01vbm9zcGFjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS5zcGFjZVdpZHRoID0gMDtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VTcGFjZU1pbiA9IEluZmluaXR5O1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNaW4gPSBJbmZpbml0eTtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4ID0gMDtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0ZXh0Q29udGVudEl0ZW07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZVdoaXRlc3BhY2Uoc3RyKSB7XG4gICAgICAvLyBSZXBsYWNlcyBhbGwgd2hpdGVzcGFjZXMgd2l0aCBzdGFuZGFyZCBzcGFjZXMgKDB4MjApLCB0byBhdm9pZFxuICAgICAgLy8gYWxpZ25tZW50IGlzc3VlcyBiZXR3ZWVuIHRoZSB0ZXh0TGF5ZXIgYW5kIHRoZSBjYW52YXMgaWYgdGhlIHRleHRcbiAgICAgIC8vIGNvbnRhaW5zIGUuZy4gdGFicyAoZml4ZXMgaXNzdWU2NjEyLnBkZikuXG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgIGlpID0gc3RyLmxlbmd0aCxcbiAgICAgICAgY29kZTtcbiAgICAgIHdoaWxlIChpIDwgaWkgJiYgKGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKSkgPj0gMHgyMCAmJiBjb2RlIDw9IDB4N2YpIHtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGkgPCBpaSA/IHN0ci5yZXBsYWNlKFdoaXRlc3BhY2VSZWdleHAsIFwiIFwiKSA6IHN0cjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5CaWRpVHJhbnNmb3JtKHRleHRDaHVuaykge1xuICAgICAgdmFyIHN0ciA9IHRleHRDaHVuay5zdHIuam9pbihcIlwiKTtcbiAgICAgIHZhciBiaWRpUmVzdWx0ID0gYmlkaShzdHIsIC0xLCB0ZXh0Q2h1bmsudmVydGljYWwpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyOiBub3JtYWxpemVXaGl0ZXNwYWNlXG4gICAgICAgICAgPyByZXBsYWNlV2hpdGVzcGFjZShiaWRpUmVzdWx0LnN0cilcbiAgICAgICAgICA6IGJpZGlSZXN1bHQuc3RyLFxuICAgICAgICBkaXI6IGJpZGlSZXN1bHQuZGlyLFxuICAgICAgICB3aWR0aDogdGV4dENodW5rLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRleHRDaHVuay5oZWlnaHQsXG4gICAgICAgIHRyYW5zZm9ybTogdGV4dENodW5rLnRyYW5zZm9ybSxcbiAgICAgICAgZm9udE5hbWU6IHRleHRDaHVuay5mb250TmFtZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU2V0Rm9udChmb250TmFtZSwgZm9udFJlZikge1xuICAgICAgcmV0dXJuIHNlbGZcbiAgICAgICAgLmxvYWRGb250KGZvbnROYW1lLCBmb250UmVmLCByZXNvdXJjZXMpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uICh0cmFuc2xhdGVkKSB7XG4gICAgICAgICAgdGV4dFN0YXRlLmZvbnQgPSB0cmFuc2xhdGVkLmZvbnQ7XG4gICAgICAgICAgdGV4dFN0YXRlLmZvbnRNYXRyaXggPVxuICAgICAgICAgICAgdHJhbnNsYXRlZC5mb250LmZvbnRNYXRyaXggfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGNoYXJzKSB7XG4gICAgICB2YXIgZm9udCA9IHRleHRTdGF0ZS5mb250O1xuICAgICAgdmFyIHRleHRDaHVuayA9IGVuc3VyZVRleHRDb250ZW50SXRlbSgpO1xuICAgICAgdmFyIHdpZHRoID0gMDtcbiAgICAgIHZhciBoZWlnaHQgPSAwO1xuICAgICAgdmFyIGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICAgIHZhciBnbHlwaFdpZHRoID0gbnVsbDtcbiAgICAgICAgaWYgKGZvbnQudmVydGljYWwgJiYgZ2x5cGgudm1ldHJpYykge1xuICAgICAgICAgIGdseXBoV2lkdGggPSBnbHlwaC52bWV0cmljWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdseXBoV2lkdGggPSBnbHlwaC53aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBnbHlwaFVuaWNvZGUgPSBnbHlwaC51bmljb2RlO1xuICAgICAgICB2YXIgTm9ybWFsaXplZFVuaWNvZGVzID0gZ2V0Tm9ybWFsaXplZFVuaWNvZGVzKCk7XG4gICAgICAgIGlmIChOb3JtYWxpemVkVW5pY29kZXNbZ2x5cGhVbmljb2RlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ2x5cGhVbmljb2RlID0gTm9ybWFsaXplZFVuaWNvZGVzW2dseXBoVW5pY29kZV07XG4gICAgICAgIH1cbiAgICAgICAgZ2x5cGhVbmljb2RlID0gcmV2ZXJzZUlmUnRsKGdseXBoVW5pY29kZSk7XG5cbiAgICAgICAgdmFyIGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nO1xuICAgICAgICBpZiAoZ2x5cGguaXNTcGFjZSkge1xuICAgICAgICAgIHZhciB3b3JkU3BhY2luZyA9IHRleHRTdGF0ZS53b3JkU3BhY2luZztcbiAgICAgICAgICBjaGFyU3BhY2luZyArPSB3b3JkU3BhY2luZztcbiAgICAgICAgICBpZiAod29yZFNwYWNpbmcgPiAwKSB7XG4gICAgICAgICAgICBhZGRGYWtlU3BhY2VzKHdvcmRTcGFjaW5nLCB0ZXh0Q2h1bmsuc3RyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHggPSAwO1xuICAgICAgICB2YXIgdHkgPSAwO1xuICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHtcbiAgICAgICAgICB2YXIgdzAgPSBnbHlwaFdpZHRoICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF07XG4gICAgICAgICAgdHggPSAodzAgKiB0ZXh0U3RhdGUuZm9udFNpemUgKyBjaGFyU3BhY2luZykgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZTtcbiAgICAgICAgICB3aWR0aCArPSB0eDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdzEgPSBnbHlwaFdpZHRoICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF07XG4gICAgICAgICAgdHkgPSB3MSAqIHRleHRTdGF0ZS5mb250U2l6ZSArIGNoYXJTcGFjaW5nO1xuICAgICAgICAgIGhlaWdodCArPSB0eTtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCh0eCwgdHkpO1xuXG4gICAgICAgIHRleHRDaHVuay5zdHIucHVzaChnbHlwaFVuaWNvZGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZvbnQudmVydGljYWwpIHtcbiAgICAgICAgdGV4dENodW5rLmxhc3RBZHZhbmNlV2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGV4dENodW5rLndpZHRoICs9IHdpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dENodW5rLmxhc3RBZHZhbmNlSGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0ZXh0Q2h1bmsuaGVpZ2h0ICs9IE1hdGguYWJzKGhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZXh0Q2h1bms7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkRmFrZVNwYWNlcyh3aWR0aCwgc3RyQnVmKSB7XG4gICAgICBpZiAod2lkdGggPCB0ZXh0Q29udGVudEl0ZW0uZmFrZVNwYWNlTWluKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh3aWR0aCA8IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1pbikge1xuICAgICAgICBzdHJCdWYucHVzaChcIiBcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBmYWtlU3BhY2VzID0gTWF0aC5yb3VuZCh3aWR0aCAvIHRleHRDb250ZW50SXRlbS5zcGFjZVdpZHRoKTtcbiAgICAgIHdoaWxlIChmYWtlU3BhY2VzLS0gPiAwKSB7XG4gICAgICAgIHN0ckJ1Zi5wdXNoKFwiIFwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmbHVzaFRleHRDb250ZW50SXRlbSgpIHtcbiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRG8gZmluYWwgdGV4dCBzY2FsaW5nLlxuICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICo9IHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCAqPSB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTtcbiAgICAgIH1cbiAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2gocnVuQmlkaVRyYW5zZm9ybSh0ZXh0Q29udGVudEl0ZW0pKTtcblxuICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB0ZXh0Q29udGVudEl0ZW0uc3RyLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZUNodW5rKCkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgc2luay5lbnF1ZXVlKHRleHRDb250ZW50LCBsZW5ndGgpO1xuICAgICAgICB0ZXh0Q29udGVudC5pdGVtcyA9IFtdO1xuICAgICAgICB0ZXh0Q29udGVudC5zdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBjb25zdCBuZXh0ID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgZW5xdWV1ZUNodW5rKCk7XG4gICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBzaW5rLnJlYWR5XSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfTtcbiAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpO1xuICAgICAgdGltZVNsb3RNYW5hZ2VyLnJlc2V0KCk7XG4gICAgICB2YXIgc3RvcCxcbiAgICAgICAgb3BlcmF0aW9uID0ge30sXG4gICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHtcbiAgICAgICAgLy8gVGhlIGFyZ3VtZW50cyBwYXJzZWQgYnkgcmVhZCgpIGFyZSBub3QgdXNlZCBiZXlvbmQgdGhpcyBsb29wLCBzb1xuICAgICAgICAvLyB3ZSBjYW4gcmV1c2UgdGhlIHNhbWUgYXJyYXkgb24gZXZlcnkgaXRlcmF0aW9uLCB0aHVzIGF2b2lkaW5nXG4gICAgICAgIC8vIHVubmVjZXNzYXJ5IGFsbG9jYXRpb25zLlxuICAgICAgICBhcmdzLmxlbmd0aCA9IDA7XG4gICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJncztcbiAgICAgICAgaWYgKCFwcmVwcm9jZXNzb3IucmVhZChvcGVyYXRpb24pKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlO1xuICAgICAgICB2YXIgZm4gPSBvcGVyYXRpb24uZm47XG4gICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJncztcbiAgICAgICAgdmFyIGFkdmFuY2UsIGRpZmY7XG5cbiAgICAgICAgc3dpdGNoIChmbiB8IDApIHtcbiAgICAgICAgICBjYXNlIE9QUy5zZXRGb250OlxuICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIHRvIGlnbm9yZSBtdWx0aXBsZSBpZGVudGljYWwgVGYgY29tbWFuZHMuXG4gICAgICAgICAgICB2YXIgZm9udE5hbWVBcmcgPSBhcmdzWzBdLm5hbWUsXG4gICAgICAgICAgICAgIGZvbnRTaXplQXJnID0gYXJnc1sxXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnQgJiZcbiAgICAgICAgICAgICAgZm9udE5hbWVBcmcgPT09IHRleHRTdGF0ZS5mb250TmFtZSAmJlxuICAgICAgICAgICAgICBmb250U2l6ZUFyZyA9PT0gdGV4dFN0YXRlLmZvbnRTaXplXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUuZm9udE5hbWUgPSBmb250TmFtZUFyZztcbiAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplQXJnO1xuICAgICAgICAgICAgbmV4dChoYW5kbGVTZXRGb250KGZvbnROYW1lQXJnLCBudWxsKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJpc2U6XG4gICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRSaXNlID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEhTY2FsZTpcbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUudGV4dEhTY2FsZSA9IGFyZ3NbMF0gLyAxMDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRMZWFkaW5nOlxuICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5sZWFkaW5nID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm1vdmVUZXh0OlxuICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIHRvIHRyZWF0IHNhbWUgbGluZSBtb3ZlbWVudCBhcyBhZHZhbmNlXG4gICAgICAgICAgICB2YXIgaXNTYW1lVGV4dExpbmUgPSAhdGV4dFN0YXRlLmZvbnRcbiAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICA6ICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCA/IGFyZ3NbMF0gOiBhcmdzWzFdKSA9PT0gMDtcbiAgICAgICAgICAgIGFkdmFuY2UgPSBhcmdzWzBdIC0gYXJnc1sxXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY29tYmluZVRleHRJdGVtcyAmJlxuICAgICAgICAgICAgICBpc1NhbWVUZXh0TGluZSAmJlxuICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQgJiZcbiAgICAgICAgICAgICAgYWR2YW5jZSA+IDAgJiZcbiAgICAgICAgICAgICAgYWR2YW5jZSA8PSB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCArPVxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aDtcbiAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPVxuICAgICAgICAgICAgICAgIGFyZ3NbMV0gLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VIZWlnaHQ7XG4gICAgICAgICAgICAgIGRpZmYgPVxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gLVxuICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZVdpZHRoIC1cbiAgICAgICAgICAgICAgICAoYXJnc1sxXSAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZUhlaWdodCk7XG4gICAgICAgICAgICAgIGFkZEZha2VTcGFjZXMoZGlmZiwgdGV4dENvbnRlbnRJdGVtLnN0cik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXguc2xpY2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldExlYWRpbmdNb3ZlVGV4dDpcbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUubGVhZGluZyA9IC1hcmdzWzFdO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXguc2xpY2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lOlxuICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dE1hdHJpeDpcbiAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbiB0byB0cmVhdCBzYW1lIGxpbmUgbW92ZW1lbnQgYXMgYWR2YW5jZS5cbiAgICAgICAgICAgIGFkdmFuY2UgPSB0ZXh0U3RhdGUuY2FsY1RleHRMaW5lTWF0cml4QWR2YW5jZShcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgYXJnc1sxXSxcbiAgICAgICAgICAgICAgYXJnc1syXSxcbiAgICAgICAgICAgICAgYXJnc1szXSxcbiAgICAgICAgICAgICAgYXJnc1s0XSxcbiAgICAgICAgICAgICAgYXJnc1s1XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY29tYmluZVRleHRJdGVtcyAmJlxuICAgICAgICAgICAgICBhZHZhbmNlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCAmJlxuICAgICAgICAgICAgICBhZHZhbmNlLnZhbHVlID4gMCAmJlxuICAgICAgICAgICAgICBhZHZhbmNlLnZhbHVlIDw9IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TGluZU1hdHJpeChhZHZhbmNlLndpZHRoLCBhZHZhbmNlLmhlaWdodCk7XG4gICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCArPVxuICAgICAgICAgICAgICAgIGFkdmFuY2Uud2lkdGggLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aDtcbiAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPVxuICAgICAgICAgICAgICAgIGFkdmFuY2UuaGVpZ2h0IC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0O1xuICAgICAgICAgICAgICBkaWZmID1cbiAgICAgICAgICAgICAgICBhZHZhbmNlLndpZHRoIC1cbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aCAtXG4gICAgICAgICAgICAgICAgKGFkdmFuY2UuaGVpZ2h0IC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0KTtcbiAgICAgICAgICAgICAgYWRkRmFrZVNwYWNlcyhkaWZmLCB0ZXh0Q29udGVudEl0ZW0uc3RyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dE1hdHJpeChcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgYXJnc1sxXSxcbiAgICAgICAgICAgICAgYXJnc1syXSxcbiAgICAgICAgICAgICAgYXJnc1szXSxcbiAgICAgICAgICAgICAgYXJnc1s0XSxcbiAgICAgICAgICAgICAgYXJnc1s1XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5zZXRUZXh0TGluZU1hdHJpeChcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgYXJnc1sxXSxcbiAgICAgICAgICAgICAgYXJnc1syXSxcbiAgICAgICAgICAgICAgYXJnc1szXSxcbiAgICAgICAgICAgICAgYXJnc1s0XSxcbiAgICAgICAgICAgICAgYXJnc1s1XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJTcGFjaW5nOlxuICAgICAgICAgICAgdGV4dFN0YXRlLmNoYXJTcGFjaW5nID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFdvcmRTcGFjaW5nOlxuICAgICAgICAgICAgdGV4dFN0YXRlLndvcmRTcGFjaW5nID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmJlZ2luVGV4dDpcbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4ID0gSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaXRlbXMgPSBhcmdzWzBdO1xuICAgICAgICAgICAgdmFyIG9mZnNldDtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtc1tqXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGl0ZW1zW2pdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bShpdGVtc1tqXSkpIHtcbiAgICAgICAgICAgICAgICBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKTtcblxuICAgICAgICAgICAgICAgIC8vIFBERiBTcGVjaWZpY2F0aW9uIDUuMy4yIHN0YXRlczpcbiAgICAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIGlzIGV4cHJlc3NlZCBpbiB0aG91c2FuZHRocyBvZiBhIHVuaXQgb2YgdGV4dFxuICAgICAgICAgICAgICAgIC8vIHNwYWNlLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgYW1vdW50IGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgY3VycmVudCBob3Jpem9udGFsIG9yXG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWwgY29vcmRpbmF0ZSwgZGVwZW5kaW5nIG9uIHRoZSB3cml0aW5nIG1vZGUuXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY29vcmRpbmF0ZSBzeXN0ZW0sIGEgcG9zaXRpdmUgYWRqdXN0bWVudFxuICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgZWZmZWN0IG9mIG1vdmluZyB0aGUgbmV4dCBnbHlwaCBwYWludGVkIGVpdGhlciB0b1xuICAgICAgICAgICAgICAgIC8vIHRoZSBsZWZ0IG9yIGRvd24gYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgICAgICAgICAgICBhZHZhbmNlID0gKGl0ZW1zW2pdICogdGV4dFN0YXRlLmZvbnRTaXplKSAvIDEwMDA7XG4gICAgICAgICAgICAgICAgdmFyIGJyZWFrVGV4dFJ1biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYWR2YW5jZTtcbiAgICAgICAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICBicmVha1RleHRSdW4gPVxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0udGV4dFJ1bkJyZWFrQWxsb3dlZCAmJlxuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID4gdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4O1xuICAgICAgICAgICAgICAgICAgaWYgKCFicmVha1RleHRSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVmFsdWUgbmVlZHMgdG8gYmUgYWRkZWQgdG8gaGVpZ2h0IHRvIHBhaW50IGRvd24uXG4gICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgKz0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBhZHZhbmNlID0gLWFkdmFuY2U7XG4gICAgICAgICAgICAgICAgICBvZmZzZXQgPSBhZHZhbmNlICogdGV4dFN0YXRlLnRleHRIU2NhbGU7XG4gICAgICAgICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeChvZmZzZXQsIDApO1xuICAgICAgICAgICAgICAgICAgYnJlYWtUZXh0UnVuID1cbiAgICAgICAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA+IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heDtcbiAgICAgICAgICAgICAgICAgIGlmICghYnJlYWtUZXh0UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIG5lZWRzIHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB3aWR0aCB0byBwYWludCBsZWZ0LlxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnJlYWtUZXh0UnVuKSB7XG4gICAgICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWR2YW5jZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGFkZEZha2VTcGFjZXMoYWR2YW5jZSwgdGV4dENvbnRlbnRJdGVtLnN0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaG93VGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbShhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2hvd1RleHQ6XG4gICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7XG4gICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpO1xuICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpO1xuICAgICAgICAgICAgdGV4dFN0YXRlLndvcmRTcGFjaW5nID0gYXJnc1swXTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5jaGFyU3BhY2luZyA9IGFyZ3NbMV07XG4gICAgICAgICAgICB0ZXh0U3RhdGUuY2FycmlhZ2VSZXR1cm4oKTtcbiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMucGFpbnRYT2JqZWN0OlxuICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgICAgIGlmICgheG9ianMpIHtcbiAgICAgICAgICAgICAgeG9ianMgPSByZXNvdXJjZXMuZ2V0KFwiWE9iamVjdFwiKSB8fCBEaWN0LmVtcHR5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmFtZSA9IGFyZ3NbMF0ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lICYmIGVtcHR5WE9iamVjdENhY2hlLmdldEJ5TmFtZShuYW1lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbXB0eVhPYmplY3RDYWNoZS5nZXRCeVJlZih4b2JqKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHhvYmogPSB4cmVmLmZldGNoKHhvYmopO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghaXNTdHJlYW0oeG9iaikpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4b2JqLmRpY3QuZ2V0KFwiU3VidHlwZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lICE9PSBcIkZvcm1cIikge1xuICAgICAgICAgICAgICAgICAgZW1wdHlYT2JqZWN0Q2FjaGUuc2V0KG5hbWUsIHhvYmouZGljdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGEgbmV3IGBTdGF0ZU1hbmFnZXJgIHRvIHByZXZlbnQgaW5jb3JyZWN0IHBvc2l0aW9uaW5nXG4gICAgICAgICAgICAgICAgLy8gb2YgdGV4dEl0ZW1zICphZnRlciogdGhlIEZvcm0gWE9iamVjdCwgc2luY2UgZXJyb3JzIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIGRhdGEgY2FuIG90aGVyd2lzZSBwcmV2ZW50IGByZXN0b3JlYCBvcGVyYXRvcnMgZnJvbVxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGluZy5cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBPbmx5IGFuIGlzc3VlIHdoZW4gYG9wdGlvbnMuaWdub3JlRXJyb3JzID09PSB0cnVlYC5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2JqU3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihjdXJyZW50U3RhdGUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0cml4ID0geG9iai5kaWN0LmdldEFycmF5KFwiTWF0cml4XCIpO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdHJpeCkgJiYgbWF0cml4Lmxlbmd0aCA9PT0gNikge1xuICAgICAgICAgICAgICAgICAgeE9ialN0YXRlTWFuYWdlci50cmFuc2Zvcm0obWF0cml4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBFbnF1ZXVlIHRoZSBgdGV4dENvbnRlbnRgIGNodW5rIGJlZm9yZSBwYXJzaW5nIHRoZSAvRm9ybVxuICAgICAgICAgICAgICAgIC8vIFhPYmplY3QuXG4gICAgICAgICAgICAgICAgZW5xdWV1ZUNodW5rKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2lua1dyYXBwZXIgPSB7XG4gICAgICAgICAgICAgICAgICBlbnF1ZXVlSW52b2tlZDogZmFsc2UsXG5cbiAgICAgICAgICAgICAgICAgIGVucXVldWUoY2h1bmssIHNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnF1ZXVlSW52b2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShjaHVuaywgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICBnZXQgZGVzaXJlZFNpemUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW5rLmRlc2lyZWRTaXplO1xuICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgZ2V0IHJlYWR5KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHNlbGZcbiAgICAgICAgICAgICAgICAgIC5nZXRUZXh0Q29udGVudCh7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbTogeG9iaixcbiAgICAgICAgICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiB4b2JqLmRpY3QuZ2V0KFwiUmVzb3VyY2VzXCIpIHx8IHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyOiB4T2JqU3RhdGVNYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlLFxuICAgICAgICAgICAgICAgICAgICBjb21iaW5lVGV4dEl0ZW1zLFxuICAgICAgICAgICAgICAgICAgICBzaW5rOiBzaW5rV3JhcHBlcixcbiAgICAgICAgICAgICAgICAgICAgc2VlblN0eWxlcyxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2lua1dyYXBwZXIuZW5xdWV1ZUludm9rZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbXB0eVhPYmplY3RDYWNoZS5zZXQobmFtZSwgeG9iai5kaWN0Lm9iaklkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVycm9yKHMpIGluIHRoZSBYT2JqZWN0IC0tIGFsbG93IHRleHQtZXh0cmFjdGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgICAgICAgICB3YXJuKGBnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIFhPYmplY3Q6IFwiJHtyZWFzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSBPUFMuc2V0R1N0YXRlOlxuICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lICYmIGVtcHR5R1N0YXRlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXh0KFxuICAgICAgICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJHU3RhdGUgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLlwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleHRHU3RhdGUgPSByZXNvdXJjZXMuZ2V0KFwiRXh0R1N0YXRlXCIpO1xuICAgICAgICAgICAgICAgIGlmICghKGV4dEdTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJFeHRHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZ1N0YXRlID0gZXh0R1N0YXRlLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBBdHRlbXB0IHRvIGxvb2t1cCBjYWNoZWQgR1N0YXRlcyBieSByZWZlcmVuY2UgYXMgd2VsbCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpZiBhbmQgb25seSBpZiB0aGVyZSBhcmUgUERGIGRvY3VtZW50cyB3aGVyZSBkb2luZyBzb1xuICAgICAgICAgICAgICAgIC8vICAgICAgIHdvdWxkIHNpZ25pZmljYW50bHkgaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAgICAgICAgICAgICAgICBpZiAoIShnU3RhdGUgaW5zdGFuY2VvZiBEaWN0KSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZUZvbnQgPSBnU3RhdGUuZ2V0KFwiRm9udFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIWdTdGF0ZUZvbnQpIHtcbiAgICAgICAgICAgICAgICAgIGVtcHR5R1N0YXRlQ2FjaGUuc2V0KG5hbWUsIGdTdGF0ZS5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgIHJlc29sdmVHU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcblxuICAgICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZ1N0YXRlRm9udFsxXTtcbiAgICAgICAgICAgICAgICBoYW5kbGVTZXRGb250KG51bGwsIGdTdGF0ZUZvbnRbMF0pLnRoZW4oXG4gICAgICAgICAgICAgICAgICByZXNvbHZlR1N0YXRlLFxuICAgICAgICAgICAgICAgICAgcmVqZWN0R1N0YXRlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICAgICAgICAgICAgLy8gRXJyb3IocykgaW4gdGhlIEV4dEdTdGF0ZSAtLSBhbGxvdyB0ZXh0LWV4dHJhY3Rpb24gdG9cbiAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6IFwiJHtyZWFzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gc3dpdGNoXG4gICAgICAgIGlmICh0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGggPj0gc2luay5kZXNpcmVkU2l6ZSkge1xuICAgICAgICAgIC8vIFdhaXQgZm9yIHJlYWR5LCBpZiB3ZSByZWFjaCBoaWdoV2F0ZXJNYXJrLlxuICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IC8vIHdoaWxlXG4gICAgICBpZiAoc3RvcCkge1xuICAgICAgICBuZXh0KGRlZmVycmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgIGVucXVldWVDaHVuaygpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgLy8gRXJyb3IocykgaW4gdGhlIFRleHRDb250ZW50IC0tIGFsbG93IHRleHQtZXh0cmFjdGlvbiB0byBjb250aW51ZS5cbiAgICAgICAgd2FybihcbiAgICAgICAgICBgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nIFwiJHt0YXNrLm5hbWV9XCIgYCArXG4gICAgICAgICAgICBgdGFzazogXCIke3JlYXNvbn1cIi5gXG4gICAgICAgICk7XG5cbiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgZW5xdWV1ZUNodW5rKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfVxuXG4gIGV4dHJhY3REYXRhU3RydWN0dXJlcyhkaWN0LCBiYXNlRGljdCwgcHJvcGVydGllcykge1xuICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7XG4gICAgbGV0IGNpZFRvR2lkQnl0ZXM7XG4gICAgLy8gOS4xMC4yXG4gICAgdmFyIHRvVW5pY29kZSA9IGRpY3QuZ2V0KFwiVG9Vbmljb2RlXCIpIHx8IGJhc2VEaWN0LmdldChcIlRvVW5pY29kZVwiKTtcbiAgICB2YXIgdG9Vbmljb2RlUHJvbWlzZSA9IHRvVW5pY29kZVxuICAgICAgPyB0aGlzLnJlYWRUb1VuaWNvZGUodG9Vbmljb2RlKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblxuICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkge1xuICAgICAgLy8gQ0lEU3lzdGVtSW5mbyBoZWxwcyB0byBtYXRjaCBDSUQgdG8gZ2x5cGhzXG4gICAgICB2YXIgY2lkU3lzdGVtSW5mbyA9IGRpY3QuZ2V0KFwiQ0lEU3lzdGVtSW5mb1wiKTtcbiAgICAgIGlmIChpc0RpY3QoY2lkU3lzdGVtSW5mbykpIHtcbiAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvID0ge1xuICAgICAgICAgIHJlZ2lzdHJ5OiBzdHJpbmdUb1BERlN0cmluZyhjaWRTeXN0ZW1JbmZvLmdldChcIlJlZ2lzdHJ5XCIpKSxcbiAgICAgICAgICBvcmRlcmluZzogc3RyaW5nVG9QREZTdHJpbmcoY2lkU3lzdGVtSW5mby5nZXQoXCJPcmRlcmluZ1wiKSksXG4gICAgICAgICAgc3VwcGxlbWVudDogY2lkU3lzdGVtSW5mby5nZXQoXCJTdXBwbGVtZW50XCIpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgY2lkVG9HaWRNYXAgPSBkaWN0LmdldChcIkNJRFRvR0lETWFwXCIpO1xuICAgICAgaWYgKGlzU3RyZWFtKGNpZFRvR2lkTWFwKSkge1xuICAgICAgICBjaWRUb0dpZEJ5dGVzID0gY2lkVG9HaWRNYXAuZ2V0Qnl0ZXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCYXNlZCBvbiA5LjYuNiBvZiB0aGUgc3BlYyB0aGUgZW5jb2RpbmcgY2FuIGNvbWUgZnJvbSBtdWx0aXBsZSBwbGFjZXNcbiAgICAvLyBhbmQgZGVwZW5kcyBvbiB0aGUgZm9udCB0eXBlLiBUaGUgYmFzZSBlbmNvZGluZyBhbmQgZGlmZmVyZW5jZXMgYXJlXG4gICAgLy8gcmVhZCBoZXJlLCBidXQgdGhlIGVuY29kaW5nIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBpcyBjaG9zZW4gZHVyaW5nXG4gICAgLy8gZ2x5cGggbWFwcGluZyBpbiB0aGUgZm9udC5cbiAgICAvLyBUT0RPOiBMb2FkaW5nIHRoZSBidWlsdCBpbiBlbmNvZGluZyBpbiB0aGUgZm9udCB3b3VsZCBhbGxvdyB0aGVcbiAgICAvLyBkaWZmZXJlbmNlcyB0byBiZSBtZXJnZWQgaW4gaGVyZSBub3QgcmVxdWlyZSB1cyB0byBob2xkIG9uIHRvIGl0LlxuICAgIHZhciBkaWZmZXJlbmNlcyA9IFtdO1xuICAgIHZhciBiYXNlRW5jb2RpbmdOYW1lID0gbnVsbDtcbiAgICB2YXIgZW5jb2Rpbmc7XG4gICAgaWYgKGRpY3QuaGFzKFwiRW5jb2RpbmdcIikpIHtcbiAgICAgIGVuY29kaW5nID0gZGljdC5nZXQoXCJFbmNvZGluZ1wiKTtcbiAgICAgIGlmIChpc0RpY3QoZW5jb2RpbmcpKSB7XG4gICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBlbmNvZGluZy5nZXQoXCJCYXNlRW5jb2RpbmdcIik7XG4gICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBpc05hbWUoYmFzZUVuY29kaW5nTmFtZSlcbiAgICAgICAgICA/IGJhc2VFbmNvZGluZ05hbWUubmFtZVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgLy8gTG9hZCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgYmFzZSBhbmQgb3JpZ2luYWxcbiAgICAgICAgaWYgKGVuY29kaW5nLmhhcyhcIkRpZmZlcmVuY2VzXCIpKSB7XG4gICAgICAgICAgdmFyIGRpZmZFbmNvZGluZyA9IGVuY29kaW5nLmdldChcIkRpZmZlcmVuY2VzXCIpO1xuICAgICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gZGlmZkVuY29kaW5nLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0geHJlZi5mZXRjaElmUmVmKGRpZmZFbmNvZGluZ1tqXSk7XG4gICAgICAgICAgICBpZiAoaXNOdW0oZGF0YSkpIHtcbiAgICAgICAgICAgICAgaW5kZXggPSBkYXRhO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc05hbWUoZGF0YSkpIHtcbiAgICAgICAgICAgICAgZGlmZmVyZW5jZXNbaW5kZXgrK10gPSBkYXRhLm5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgZW50cnkgaW4gJ0RpZmZlcmVuY2VzJyBhcnJheTogJHtkYXRhfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNOYW1lKGVuY29kaW5nKSkge1xuICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkVuY29kaW5nIGlzIG5vdCBhIE5hbWUgbm9yIGEgRGljdFwiKTtcbiAgICAgIH1cbiAgICAgIC8vIEFjY29yZGluZyB0byB0YWJsZSAxMTQgaWYgdGhlIGVuY29kaW5nIGlzIGEgbmFtZWQgZW5jb2RpbmcgaXQgbXVzdCBiZVxuICAgICAgLy8gb25lIG9mIHRoZXNlIHByZWRlZmluZWQgZW5jb2RpbmdzLlxuICAgICAgaWYgKFxuICAgICAgICBiYXNlRW5jb2RpbmdOYW1lICE9PSBcIk1hY1JvbWFuRW5jb2RpbmdcIiAmJlxuICAgICAgICBiYXNlRW5jb2RpbmdOYW1lICE9PSBcIk1hY0V4cGVydEVuY29kaW5nXCIgJiZcbiAgICAgICAgYmFzZUVuY29kaW5nTmFtZSAhPT0gXCJXaW5BbnNpRW5jb2RpbmdcIlxuICAgICAgKSB7XG4gICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYXNlRW5jb2RpbmdOYW1lKSB7XG4gICAgICBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZyA9IGdldEVuY29kaW5nKGJhc2VFbmNvZGluZ05hbWUpLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpc1N5bWJvbGljRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBGb250RmxhZ3MuU3ltYm9saWMpO1xuICAgICAgdmFyIGlzTm9uc3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5Ob25zeW1ib2xpYyk7XG4gICAgICAvLyBBY2NvcmRpbmcgdG8gXCJUYWJsZSAxMTRcIiBpbiBzZWN0aW9uIFwiOS42LjYuMSBHZW5lcmFsXCIgKHVuZGVyXG4gICAgICAvLyBcIjkuNi42IENoYXJhY3RlciBFbmNvZGluZ1wiKSBvZiB0aGUgUERGIHNwZWNpZmljYXRpb24sIGEgTm9uc3ltYm9saWNcbiAgICAgIC8vIGZvbnQgc2hvdWxkIHVzZSB0aGUgYFN0YW5kYXJkRW5jb2RpbmdgIGlmIG5vIGVuY29kaW5nIGlzIHNwZWNpZmllZC5cbiAgICAgIGVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZztcbiAgICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09IFwiVHJ1ZVR5cGVcIiAmJiAhaXNOb25zeW1ib2xpY0ZvbnQpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7XG4gICAgICB9XG4gICAgICAvLyBUaGUgU3ltYm9saWMgYXR0cmlidXRlIGNhbiBiZSBtaXN1c2VkIGZvciByZWd1bGFyIGZvbnRzXG4gICAgICAvLyBIZXVyaXN0aWM6IHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIGZvbnQgaXMgYSBzdGFuZGFyZCBvbmUgYWxzb1xuICAgICAgaWYgKGlzU3ltYm9saWNGb250KSB7XG4gICAgICAgIGVuY29kaW5nID0gTWFjUm9tYW5FbmNvZGluZztcbiAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmZpbGUpIHtcbiAgICAgICAgICBpZiAoL1N5bWJvbC9pLnRlc3QocHJvcGVydGllcy5uYW1lKSkge1xuICAgICAgICAgICAgZW5jb2RpbmcgPSBTeW1ib2xTZXRFbmNvZGluZztcbiAgICAgICAgICB9IGVsc2UgaWYgKC9EaW5nYmF0c3xXaW5nZGluZ3MvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gWmFwZkRpbmdiYXRzRW5jb2Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIH1cblxuICAgIHByb3BlcnRpZXMuZGlmZmVyZW5jZXMgPSBkaWZmZXJlbmNlcztcbiAgICBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lO1xuICAgIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcgPSAhIWJhc2VFbmNvZGluZ05hbWUgfHwgZGlmZmVyZW5jZXMubGVuZ3RoID4gMDtcbiAgICBwcm9wZXJ0aWVzLmRpY3QgPSBkaWN0O1xuICAgIHJldHVybiB0b1VuaWNvZGVQcm9taXNlXG4gICAgICAudGhlbihyZWFkVG9Vbmljb2RlID0+IHtcbiAgICAgICAgcHJvcGVydGllcy50b1VuaWNvZGUgPSByZWFkVG9Vbmljb2RlO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRvVW5pY29kZShwcm9wZXJ0aWVzKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihidWlsdFRvVW5pY29kZSA9PiB7XG4gICAgICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYnVpbHRUb1VuaWNvZGU7XG4gICAgICAgIGlmIChjaWRUb0dpZEJ5dGVzKSB7XG4gICAgICAgICAgcHJvcGVydGllcy5jaWRUb0dpZE1hcCA9IHRoaXMucmVhZENpZFRvR2lkTWFwKFxuICAgICAgICAgICAgY2lkVG9HaWRCeXRlcyxcbiAgICAgICAgICAgIGJ1aWx0VG9Vbmljb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtUb1VuaWNvZGVNYXB9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYnVpbGRTaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIGZvcmNlR2x5cGhzID0gZmFsc2UpIHtcbiAgICBhc3NlcnQoIXByb3BlcnRpZXMuY29tcG9zaXRlLCBcIk11c3QgYmUgYSBzaW1wbGUgZm9udC5cIik7XG5cbiAgICBjb25zdCB0b1VuaWNvZGUgPSBbXTtcbiAgICBjb25zdCBlbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nLnNsaWNlKCk7XG4gICAgY29uc3QgYmFzZUVuY29kaW5nTmFtZSA9IHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZTtcbiAgICAvLyBNZXJnZSBpbiB0aGUgZGlmZmVyZW5jZXMgYXJyYXkuXG4gICAgY29uc3QgZGlmZmVyZW5jZXMgPSBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzO1xuICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZGlmZmVyZW5jZXMpIHtcbiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJjb2RlXTtcbiAgICAgIGlmIChnbHlwaE5hbWUgPT09IFwiLm5vdGRlZlwiKSB7XG4gICAgICAgIC8vIFNraXAgLm5vdGRlZiB0byBwcmV2ZW50IHJlbmRlcmluZyBlcnJvcnMsIGUuZy4gYm94ZXMgYXBwZWFyaW5nXG4gICAgICAgIC8vIHdoZXJlIHRoZXJlIHNob3VsZCBiZSBzcGFjZXMgKGZpeGVzIGlzc3VlNTI1Ni5wZGYpLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGVuY29kaW5nW2NoYXJjb2RlXSA9IGdseXBoTmFtZTtcbiAgICB9XG4gICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTtcbiAgICBmb3IgKGNvbnN0IGNoYXJjb2RlIGluIGVuY29kaW5nKSB7XG4gICAgICAvLyBhKSBNYXAgdGhlIGNoYXJhY3RlciBjb2RlIHRvIGEgY2hhcmFjdGVyIG5hbWUuXG4gICAgICBsZXQgZ2x5cGhOYW1lID0gZW5jb2RpbmdbY2hhcmNvZGVdO1xuICAgICAgLy8gYikgTG9vayB1cCB0aGUgY2hhcmFjdGVyIG5hbWUgaW4gdGhlIEFkb2JlIEdseXBoIExpc3QgKHNlZSB0aGVcbiAgICAgIC8vICAgIEJpYmxpb2dyYXBoeSkgdG8gb2J0YWluIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgdmFsdWUuXG4gICAgICBpZiAoZ2x5cGhOYW1lID09PSBcIlwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmIChnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyAodW5kb2N1bWVudGVkKSBjKSBGZXcgaGV1cmlzdGljcyB0byByZWNvZ25pemUgdW5rbm93biBnbHlwaHNcbiAgICAgICAgLy8gTk9URTogQWRvYmUgUmVhZGVyIGRvZXMgbm90IGRvIHRoaXMgc3RlcCwgYnV0IE9TWCBQcmV2aWV3IGRvZXNcbiAgICAgICAgbGV0IGNvZGUgPSAwO1xuICAgICAgICBzd2l0Y2ggKGdseXBoTmFtZVswXSkge1xuICAgICAgICAgIGNhc2UgXCJHXCI6IC8vIEd4eCBnbHlwaFxuICAgICAgICAgICAgaWYgKGdseXBoTmFtZS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgICAgY29kZSA9IHBhcnNlSW50KGdseXBoTmFtZS5zdWJzdHJpbmcoMSksIDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJnXCI6IC8vIGcwMHh4IGdseXBoXG4gICAgICAgICAgICBpZiAoZ2x5cGhOYW1lLmxlbmd0aCA9PT0gNSkge1xuICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoZ2x5cGhOYW1lLnN1YnN0cmluZygxKSwgMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkNcIjogLy8gQ2Rke2R9IGdseXBoXG4gICAgICAgICAgY2FzZSBcImNcIjogLy8gY2Rke2R9IGdseXBoXG4gICAgICAgICAgICBpZiAoZ2x5cGhOYW1lLmxlbmd0aCA+PSAzICYmIGdseXBoTmFtZS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICBjb25zdCBjb2RlU3RyID0gZ2x5cGhOYW1lLnN1YnN0cmluZygxKTtcblxuICAgICAgICAgICAgICBpZiAoZm9yY2VHbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgMTYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIE5vcm1hbGx5IHRoZSBDZGR7ZH0vY2Rke2R9IGdseXBoTmFtZSBmb3JtYXQgd2lsbCBjb250YWluXG4gICAgICAgICAgICAgIC8vIHJlZ3VsYXIsIGkuZS4gYmFzZSAxMCwgY2hhckNvZGVzIChzZWUgaXNzdWU0NTUwLnBkZikuLi5cbiAgICAgICAgICAgICAgY29kZSA9ICtjb2RlU3RyO1xuXG4gICAgICAgICAgICAgIC8vIC4uLiBob3dldmVyIHNvbWUgUERGIGdlbmVyYXRvcnMgdmlvbGF0ZSB0aGF0IGFzc3VtcHRpb24gYnlcbiAgICAgICAgICAgICAgLy8gY29udGFpbmluZyBnbHlwaCwgaS5lLiBiYXNlIDE2LCBjb2RlcyBpbnN0ZWFkLlxuICAgICAgICAgICAgICAvLyBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byByZS1wYXJzZSB0aGUgKmVudGlyZSogZW5jb2RpbmcgdG9cbiAgICAgICAgICAgICAgLy8gcHJldmVudCBicm9rZW4gdGV4dC1zZWxlY3Rpb24gKGZpeGVzIGlzc3VlOTY1NV9yZWR1Y2VkLnBkZikuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNOYU4oY29kZSkgJiZcbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlSW50KGNvZGVTdHIsIDE2KSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAvKiBmb3JjZUdseXBocyAqLyB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vICd1bmlYWFhYJy8ndVhYWFh7WFh9JyBnbHlwaHNcbiAgICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSBnZXRVbmljb2RlRm9yR2x5cGgoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTtcbiAgICAgICAgICAgIGlmICh1bmljb2RlICE9PSAtMSkge1xuICAgICAgICAgICAgICBjb2RlID0gdW5pY29kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA+IDAgJiYgY29kZSA8PSAweDEwZmZmZiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7XG4gICAgICAgICAgLy8gSWYgYGJhc2VFbmNvZGluZ05hbWVgIGlzIG9uZSB0aGUgcHJlZGVmaW5lZCBlbmNvZGluZ3MsIGFuZCBgY29kZWBcbiAgICAgICAgICAvLyBlcXVhbHMgYGNoYXJjb2RlYCwgdXNpbmcgdGhlIGdseXBoIGRlZmluZWQgaW4gdGhlIGJhc2VFbmNvZGluZ1xuICAgICAgICAgIC8vIHNlZW1zIHRvIHlpZWxkIGEgYmV0dGVyIGB0b1VuaWNvZGVgIG1hcHBpbmcgKGZpeGVzIGlzc3VlIDUwNzApLlxuICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmdOYW1lICYmIGNvZGUgPT09ICtjaGFyY29kZSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZUVuY29kaW5nID0gZ2V0RW5jb2RpbmcoYmFzZUVuY29kaW5nTmFtZSk7XG4gICAgICAgICAgICBpZiAoYmFzZUVuY29kaW5nICYmIChnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbY2hhcmNvZGVdKSkge1xuICAgICAgICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICAgICBnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVG9Vbmljb2RlTWFwKHRvVW5pY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgY2hhciBjb2RlIHRvIHVuaWNvZGUgbWFwIGJhc2VkIG9uIHNlY3Rpb24gOS4xMCBvZiB0aGUgc3BlYy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgRm9udCBwcm9wZXJ0aWVzIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYVxuICAgKiAgIHtUb1VuaWNvZGVNYXB8SWRlbnRpdHlUb1VuaWNvZGVNYXB9IG9iamVjdC5cbiAgICovXG4gIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHtcbiAgICBwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwID1cbiAgICAgICEhcHJvcGVydGllcy50b1VuaWNvZGUgJiYgcHJvcGVydGllcy50b1VuaWNvZGUubGVuZ3RoID4gMDtcblxuICAgIC8vIFNlY3Rpb24gOS4xMC4yIE1hcHBpbmcgQ2hhcmFjdGVyIENvZGVzIHRvIFVuaWNvZGUgVmFsdWVzXG4gICAgaWYgKHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApIHtcbiAgICAgIC8vIFNvbWUgZm9udHMgY29udGFpbiBpbmNvbXBsZXRlIFRvVW5pY29kZSBkYXRhLCBjYXVzaW5nIGlzc3VlcyB3aXRoXG4gICAgICAvLyB0ZXh0LWV4dHJhY3Rpb24uIEZvciBzaW1wbGUgZm9udHMsIGNvbnRhaW5pbmcgZW5jb2RpbmcgaW5mb3JtYXRpb24sXG4gICAgICAvLyB1c2UgYSBmYWxsYmFjayBUb1VuaWNvZGUgbWFwIHRvIGltcHJvdmUgdGhpcyAoZml4ZXMgaXNzdWU4MjI5LnBkZikuXG4gICAgICBpZiAoIXByb3BlcnRpZXMuY29tcG9zaXRlICYmIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcpIHtcbiAgICAgICAgcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSA9IHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShcbiAgICAgICAgICBwcm9wZXJ0aWVzXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHJvcGVydGllcy50b1VuaWNvZGUpO1xuICAgIH1cblxuICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlYyBpZiB0aGUgZm9udCBpcyBhIHNpbXBsZSBmb250IHdlIHNob3VsZCBvbmx5IG1hcFxuICAgIC8vIHRvIHVuaWNvZGUgaWYgdGhlIGJhc2UgZW5jb2RpbmcgaXMgTWFjUm9tYW4sIE1hY0V4cGVydCwgb3IgV2luQW5zaSBvclxuICAgIC8vIHRoZSBkaWZmZXJlbmNlcyBhcnJheSBvbmx5IGNvbnRhaW5zIGFkb2JlIHN0YW5kYXJkIG9yIHN5bWJvbCBzZXQgbmFtZXMsXG4gICAgLy8gaW4gcHJhdGljZSBpdCBzZWVtcyBiZXR0ZXIgdG8gYWx3YXlzIHRyeSB0byBjcmVhdGUgYSB0b1VuaWNvZGUgbWFwXG4gICAgLy8gYmFzZWQgb2YgdGhlIGRlZmF1bHQgZW5jb2RpbmcuXG4gICAgaWYgKCFwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAvKiBpcyBzaW1wbGUgZm9udCAqLykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUocHJvcGVydGllcykpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBmb250IGlzIGEgY29tcG9zaXRlIGZvbnQgdGhhdCB1c2VzIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBDTWFwc1xuICAgIC8vIGxpc3RlZCBpbiBUYWJsZSAxMTggKGV4Y2VwdCBJZGVudGl0eeKAk0ggYW5kIElkZW50aXR54oCTVikgb3Igd2hvc2VcbiAgICAvLyBkZXNjZW5kYW50IENJREZvbnQgdXNlcyB0aGUgQWRvYmUtR0IxLCBBZG9iZS1DTlMxLCBBZG9iZS1KYXBhbjEsIG9yXG4gICAgLy8gQWRvYmUtS29yZWExIGNoYXJhY3RlciBjb2xsZWN0aW9uOlxuICAgIGlmIChcbiAgICAgIHByb3BlcnRpZXMuY29tcG9zaXRlICYmXG4gICAgICAoKHByb3BlcnRpZXMuY01hcC5idWlsdEluQ01hcCAmJlxuICAgICAgICAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkpIHx8XG4gICAgICAgIChwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ucmVnaXN0cnkgPT09IFwiQWRvYmVcIiAmJlxuICAgICAgICAgIChwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09IFwiR0IxXCIgfHxcbiAgICAgICAgICAgIHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gXCJDTlMxXCIgfHxcbiAgICAgICAgICAgIHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gXCJKYXBhbjFcIiB8fFxuICAgICAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSBcIktvcmVhMVwiKSkpXG4gICAgKSB7XG4gICAgICAvLyBUaGVuOlxuICAgICAgLy8gYSkgTWFwIHRoZSBjaGFyYWN0ZXIgY29kZSB0byBhIGNoYXJhY3RlciBpZGVudGlmaWVyIChDSUQpIGFjY29yZGluZ1xuICAgICAgLy8gdG8gdGhlIGZvbnTigJlzIENNYXAuXG4gICAgICAvLyBiKSBPYnRhaW4gdGhlIHJlZ2lzdHJ5IGFuZCBvcmRlcmluZyBvZiB0aGUgY2hhcmFjdGVyIGNvbGxlY3Rpb24gdXNlZFxuICAgICAgLy8gYnkgdGhlIGZvbnTigJlzIENNYXAgKGZvciBleGFtcGxlLCBBZG9iZSBhbmQgSmFwYW4xKSBmcm9tIGl0c1xuICAgICAgLy8gQ0lEU3lzdGVtSW5mbyBkaWN0aW9uYXJ5LlxuICAgICAgY29uc3QgcmVnaXN0cnkgPSBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ucmVnaXN0cnk7XG4gICAgICBjb25zdCBvcmRlcmluZyA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZztcbiAgICAgIC8vIGMpIENvbnN0cnVjdCBhIHNlY29uZCBDTWFwIG5hbWUgYnkgY29uY2F0ZW5hdGluZyB0aGUgcmVnaXN0cnkgYW5kXG4gICAgICAvLyBvcmRlcmluZyBvYnRhaW5lZCBpbiBzdGVwIChiKSBpbiB0aGUgZm9ybWF0IHJlZ2lzdHJ54oCTb3JkZXJpbmfigJNVQ1MyXG4gICAgICAvLyAoZm9yIGV4YW1wbGUsIEFkb2Jl4oCTSmFwYW4x4oCTVUNTMikuXG4gICAgICBjb25zdCB1Y3MyQ01hcE5hbWUgPSBOYW1lLmdldChyZWdpc3RyeSArIFwiLVwiICsgb3JkZXJpbmcgKyBcIi1VQ1MyXCIpO1xuICAgICAgLy8gZCkgT2J0YWluIHRoZSBDTWFwIHdpdGggdGhlIG5hbWUgY29uc3RydWN0ZWQgaW4gc3RlcCAoYykgKGF2YWlsYWJsZVxuICAgICAgLy8gZnJvbSB0aGUgQVNOIFdlYiBzaXRlOyBzZWUgdGhlIEJpYmxpb2dyYXBoeSkuXG4gICAgICByZXR1cm4gQ01hcEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgICAgZW5jb2Rpbmc6IHVjczJDTWFwTmFtZSxcbiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLFxuICAgICAgICB1c2VDTWFwOiBudWxsLFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodWNzMkNNYXApIHtcbiAgICAgICAgY29uc3QgY01hcCA9IHByb3BlcnRpZXMuY01hcDtcbiAgICAgICAgY29uc3QgdG9Vbmljb2RlID0gW107XG4gICAgICAgIGNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhcmNvZGUsIGNpZCkge1xuICAgICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzVcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGUpIE1hcCB0aGUgQ0lEIG9idGFpbmVkIGluIHN0ZXAgKGEpIGFjY29yZGluZyB0byB0aGUgQ01hcFxuICAgICAgICAgIC8vIG9idGFpbmVkIGluIHN0ZXAgKGQpLCBwcm9kdWNpbmcgYSBVbmljb2RlIHZhbHVlLlxuICAgICAgICAgIGNvbnN0IHVjczIgPSB1Y3MyQ01hcC5sb29rdXAoY2lkKTtcbiAgICAgICAgICBpZiAodWNzMikge1xuICAgICAgICAgICAgdG9Vbmljb2RlW2NoYXJjb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAgICh1Y3MyLmNoYXJDb2RlQXQoMCkgPDwgOCkgKyB1Y3MyLmNoYXJDb2RlQXQoMSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodG9Vbmljb2RlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSB2aWV3ZXIncyBjaG9pY2UsIGp1c3QgdXNlIGFuIGlkZW50aXR5IG1hcC5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKHByb3BlcnRpZXMuZmlyc3RDaGFyLCBwcm9wZXJ0aWVzLmxhc3RDaGFyKVxuICAgICk7XG4gIH1cblxuICByZWFkVG9Vbmljb2RlKHRvVW5pY29kZSkge1xuICAgIHZhciBjbWFwT2JqID0gdG9Vbmljb2RlO1xuICAgIGlmIChpc05hbWUoY21hcE9iaikpIHtcbiAgICAgIHJldHVybiBDTWFwRmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICBlbmNvZGluZzogY21hcE9iaixcbiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLFxuICAgICAgICB1c2VDTWFwOiBudWxsLFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY21hcCkge1xuICAgICAgICBpZiAoY21hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkge1xuICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpdHlUb1VuaWNvZGVNYXAoMCwgMHhmZmZmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRvVW5pY29kZU1hcChjbWFwLmdldE1hcCgpKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJlYW0oY21hcE9iaikpIHtcbiAgICAgIHJldHVybiBDTWFwRmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICBlbmNvZGluZzogY21hcE9iaixcbiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLFxuICAgICAgICB1c2VDTWFwOiBudWxsLFxuICAgICAgfSkudGhlbihcbiAgICAgICAgZnVuY3Rpb24gKGNtYXApIHtcbiAgICAgICAgICBpZiAoY21hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZGVudGl0eVRvVW5pY29kZU1hcCgwLCAweGZmZmYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbWFwID0gbmV3IEFycmF5KGNtYXAubGVuZ3RoKTtcbiAgICAgICAgICAvLyBDb252ZXJ0IFVURi0xNkJFXG4gICAgICAgICAgLy8gTk9URTogY21hcCBjYW4gYmUgYSBzcGFyc2UgYXJyYXksIHNvIHVzZSBmb3JFYWNoIGluc3RlYWQgb2ZcbiAgICAgICAgICAvLyBgZm9yKDs7KWAgdG8gaXRlcmF0ZSBvdmVyIGFsbCBrZXlzLlxuICAgICAgICAgIGNtYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHRva2VuKSB7XG4gICAgICAgICAgICB2YXIgc3RyID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRva2VuLmxlbmd0aDsgayArPSAyKSB7XG4gICAgICAgICAgICAgIHZhciB3MSA9ICh0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDgpIHwgdG9rZW4uY2hhckNvZGVBdChrICsgMSk7XG4gICAgICAgICAgICAgIGlmICgodzEgJiAweGY4MDApICE9PSAweGQ4MDApIHtcbiAgICAgICAgICAgICAgICAvLyB3MSA8IDB4RDgwMCB8fCB3MSA+IDB4REZGRlxuICAgICAgICAgICAgICAgIHN0ci5wdXNoKHcxKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBrICs9IDI7XG4gICAgICAgICAgICAgIHZhciB3MiA9ICh0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDgpIHwgdG9rZW4uY2hhckNvZGVBdChrICsgMSk7XG4gICAgICAgICAgICAgIHN0ci5wdXNoKCgodzEgJiAweDNmZikgPDwgMTApICsgKHcyICYgMHgzZmYpICsgMHgxMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXBbY2hhckNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLCBzdHIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgVG9Vbmljb2RlTWFwKG1hcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgIC8vIEVycm9yIGluIHRoZSBUb1VuaWNvZGUgZGF0YSAtLSBzZW5kaW5nIHVuc3VwcG9ydGVkIGZlYXR1cmVcbiAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBhbmQgYWxsb3cgZm9udCBwYXJzaW5nIHRvIGNvbnRpbnVlLlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udFRvVW5pY29kZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd2FybihgcmVhZFRvVW5pY29kZSAtIGlnbm9yaW5nIFRvVW5pY29kZSBkYXRhOiBcIiR7cmVhc29ufVwiLmApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHJlYWRDaWRUb0dpZE1hcChnbHlwaHNEYXRhLCB0b1VuaWNvZGUpIHtcbiAgICAvLyBFeHRyYWN0IHRoZSBlbmNvZGluZyBmcm9tIHRoZSBDSURUb0dJRE1hcFxuXG4gICAgLy8gU2V0IGVuY29kaW5nIDAgdG8gbGF0ZXIgdmVyaWZ5IHRoZSBmb250IGhhcyBhbiBlbmNvZGluZ1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBqID0gMCwgamogPSBnbHlwaHNEYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgIHZhciBnbHlwaElEID0gKGdseXBoc0RhdGFbaisrXSA8PCA4KSB8IGdseXBoc0RhdGFbal07XG4gICAgICBjb25zdCBjb2RlID0gaiA+PiAxO1xuICAgICAgaWYgKGdseXBoSUQgPT09IDAgJiYgIXRvVW5pY29kZS5oYXMoY29kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHRbY29kZV0gPSBnbHlwaElEO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZXh0cmFjdFdpZHRocyhkaWN0LCBkZXNjcmlwdG9yLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7XG4gICAgdmFyIGdseXBoc1dpZHRocyA9IFtdO1xuICAgIHZhciBkZWZhdWx0V2lkdGggPSAwO1xuICAgIHZhciBnbHlwaHNWTWV0cmljcyA9IFtdO1xuICAgIHZhciBkZWZhdWx0Vk1ldHJpY3M7XG4gICAgdmFyIGksIGlpLCBqLCBqaiwgc3RhcnQsIGNvZGUsIHdpZHRocztcbiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHtcbiAgICAgIGRlZmF1bHRXaWR0aCA9IGRpY3QuaGFzKFwiRFdcIikgPyBkaWN0LmdldChcIkRXXCIpIDogMTAwMDtcblxuICAgICAgd2lkdGhzID0gZGljdC5nZXQoXCJXXCIpO1xuICAgICAgaWYgKHdpZHRocykge1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgc3RhcnQgPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2krK10pO1xuICAgICAgICAgIGNvZGUgPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2ldKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2RlKSkge1xuICAgICAgICAgICAgZm9yIChqID0gMCwgamogPSBjb2RlLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW3N0YXJ0KytdID0geHJlZi5mZXRjaElmUmVmKGNvZGVbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzWysraV0pO1xuICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7XG4gICAgICAgICAgICAgIGdseXBoc1dpZHRoc1tqXSA9IHdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydGllcy52ZXJ0aWNhbCkge1xuICAgICAgICB2YXIgdm1ldHJpY3MgPSBkaWN0LmdldEFycmF5KFwiRFcyXCIpIHx8IFs4ODAsIC0xMDAwXTtcbiAgICAgICAgZGVmYXVsdFZNZXRyaWNzID0gW3ZtZXRyaWNzWzFdLCBkZWZhdWx0V2lkdGggKiAwLjUsIHZtZXRyaWNzWzBdXTtcbiAgICAgICAgdm1ldHJpY3MgPSBkaWN0LmdldChcIlcyXCIpO1xuICAgICAgICBpZiAodm1ldHJpY3MpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHZtZXRyaWNzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHN0YXJ0ID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2krK10pO1xuICAgICAgICAgICAgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpXSk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2RlKSkge1xuICAgICAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvZGUubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW3N0YXJ0KytdID0gW1xuICAgICAgICAgICAgICAgICAgeHJlZi5mZXRjaElmUmVmKGNvZGVbaisrXSksXG4gICAgICAgICAgICAgICAgICB4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSxcbiAgICAgICAgICAgICAgICAgIHhyZWYuZmV0Y2hJZlJlZihjb2RlW2pdKSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgdm1ldHJpYyA9IFtcbiAgICAgICAgICAgICAgICB4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSksXG4gICAgICAgICAgICAgICAgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pLFxuICAgICAgICAgICAgICAgIHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgZ2x5cGhzVk1ldHJpY3Nbal0gPSB2bWV0cmljO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdENoYXIgPSBwcm9wZXJ0aWVzLmZpcnN0Q2hhcjtcbiAgICAgIHdpZHRocyA9IGRpY3QuZ2V0KFwiV2lkdGhzXCIpO1xuICAgICAgaWYgKHdpZHRocykge1xuICAgICAgICBqID0gZmlyc3RDaGFyO1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgZ2x5cGhzV2lkdGhzW2orK10gPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0V2lkdGggPSBwYXJzZUZsb2F0KGRlc2NyaXB0b3IuZ2V0KFwiTWlzc2luZ1dpZHRoXCIpKSB8fCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVHJ5aW5nIGdldCB0aGUgQmFzZUZvbnQgbWV0cmljcyAoc2VlIGNvbW1lbnQgYWJvdmUpLlxuICAgICAgICB2YXIgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoXCJCYXNlRm9udFwiKTtcbiAgICAgICAgaWYgKGlzTmFtZShiYXNlRm9udE5hbWUpKSB7XG4gICAgICAgICAgdmFyIG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUubmFtZSk7XG5cbiAgICAgICAgICBnbHlwaHNXaWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICBkZWZhdWx0V2lkdGggPSBtZXRyaWNzLmRlZmF1bHRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhldXJpc3RpYzogZGV0ZWN0aW9uIG9mIG1vbm9zcGFjZSBmb250IGJ5IGNoZWNraW5nIGFsbCBub24temVybyB3aWR0aHNcbiAgICB2YXIgaXNNb25vc3BhY2UgPSB0cnVlO1xuICAgIHZhciBmaXJzdFdpZHRoID0gZGVmYXVsdFdpZHRoO1xuICAgIGZvciAodmFyIGdseXBoIGluIGdseXBoc1dpZHRocykge1xuICAgICAgdmFyIGdseXBoV2lkdGggPSBnbHlwaHNXaWR0aHNbZ2x5cGhdO1xuICAgICAgaWYgKCFnbHlwaFdpZHRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFmaXJzdFdpZHRoKSB7XG4gICAgICAgIGZpcnN0V2lkdGggPSBnbHlwaFdpZHRoO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXJzdFdpZHRoICE9PSBnbHlwaFdpZHRoKSB7XG4gICAgICAgIGlzTW9ub3NwYWNlID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNNb25vc3BhY2UpIHtcbiAgICAgIHByb3BlcnRpZXMuZmxhZ3MgfD0gRm9udEZsYWdzLkZpeGVkUGl0Y2g7XG4gICAgfVxuXG4gICAgcHJvcGVydGllcy5kZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGg7XG4gICAgcHJvcGVydGllcy53aWR0aHMgPSBnbHlwaHNXaWR0aHM7XG4gICAgcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3MgPSBkZWZhdWx0Vk1ldHJpY3M7XG4gICAgcHJvcGVydGllcy52bWV0cmljcyA9IGdseXBoc1ZNZXRyaWNzO1xuICB9XG5cbiAgaXNTZXJpZkZvbnQoYmFzZUZvbnROYW1lKSB7XG4gICAgLy8gU2ltdWxhdGluZyBkZXNjcmlwdG9yIGZsYWdzIGF0dHJpYnV0ZVxuICAgIHZhciBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoXCItXCIpWzBdO1xuICAgIHJldHVybiAoXG4gICAgICBmb250TmFtZVdvU3R5bGUgaW4gZ2V0U2VyaWZGb250cygpIHx8XG4gICAgICBmb250TmFtZVdvU3R5bGUuc2VhcmNoKC9zZXJpZi9naSkgIT09IC0xXG4gICAgKTtcbiAgfVxuXG4gIGdldEJhc2VGb250TWV0cmljcyhuYW1lKSB7XG4gICAgdmFyIGRlZmF1bHRXaWR0aCA9IDA7XG4gICAgdmFyIHdpZHRocyA9IFtdO1xuICAgIHZhciBtb25vc3BhY2UgPSBmYWxzZTtcbiAgICB2YXIgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTtcbiAgICB2YXIgbG9va3VwTmFtZSA9IHN0ZEZvbnRNYXBbbmFtZV0gfHwgbmFtZTtcbiAgICB2YXIgTWV0cmljcyA9IGdldE1ldHJpY3MoKTtcblxuICAgIGlmICghKGxvb2t1cE5hbWUgaW4gTWV0cmljcykpIHtcbiAgICAgIC8vIFVzZSBkZWZhdWx0IGZvbnRzIGZvciBsb29raW5nIHVwIGZvbnQgbWV0cmljcyBpZiB0aGUgcGFzc2VkXG4gICAgICAvLyBmb250IGlzIG5vdCBhIGJhc2UgZm9udFxuICAgICAgaWYgKHRoaXMuaXNTZXJpZkZvbnQobmFtZSkpIHtcbiAgICAgICAgbG9va3VwTmFtZSA9IFwiVGltZXMtUm9tYW5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvb2t1cE5hbWUgPSBcIkhlbHZldGljYVwiO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZ2x5cGhXaWR0aHMgPSBNZXRyaWNzW2xvb2t1cE5hbWVdO1xuXG4gICAgaWYgKGlzTnVtKGdseXBoV2lkdGhzKSkge1xuICAgICAgZGVmYXVsdFdpZHRoID0gZ2x5cGhXaWR0aHM7XG4gICAgICBtb25vc3BhY2UgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWR0aHMgPSBnbHlwaFdpZHRocygpOyAvLyBleHBhbmQgbGF6eSB3aWR0aHMgYXJyYXlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVmYXVsdFdpZHRoLFxuICAgICAgbW9ub3NwYWNlLFxuICAgICAgd2lkdGhzLFxuICAgIH07XG4gIH1cblxuICBidWlsZENoYXJDb2RlVG9XaWR0aCh3aWR0aHNCeUdseXBoTmFtZSwgcHJvcGVydGllcykge1xuICAgIHZhciB3aWR0aHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7XG4gICAgdmFyIGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgZm9yICh2YXIgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykge1xuICAgICAgaWYgKGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzICYmIHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV0pIHtcbiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXJDb2RlIGluIGVuY29kaW5nICYmIHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV0pIHtcbiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2lkdGhzO1xuICB9XG5cbiAgcHJlRXZhbHVhdGVGb250KGRpY3QpIHtcbiAgICB2YXIgYmFzZURpY3QgPSBkaWN0O1xuICAgIHZhciB0eXBlID0gZGljdC5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgIGlmICghaXNOYW1lKHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJpbnZhbGlkIGZvbnQgU3VidHlwZVwiKTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9zaXRlID0gZmFsc2U7XG4gICAgdmFyIHVpbnQ4YXJyYXk7XG4gICAgaWYgKHR5cGUubmFtZSA9PT0gXCJUeXBlMFwiKSB7XG4gICAgICAvLyBJZiBmb250IGlzIGEgY29tcG9zaXRlXG4gICAgICAvLyAgLSBnZXQgdGhlIGRlc2NlbmRhbnQgZm9udFxuICAgICAgLy8gIC0gc2V0IHRoZSB0eXBlIGFjY29yZGluZyB0byB0aGUgZGVzY2VuZGFudCBmb250XG4gICAgICAvLyAgLSBnZXQgdGhlIEZvbnREZXNjcmlwdG9yIGZyb20gdGhlIGRlc2NlbmRhbnQgZm9udFxuICAgICAgdmFyIGRmID0gZGljdC5nZXQoXCJEZXNjZW5kYW50Rm9udHNcIik7XG4gICAgICBpZiAoIWRmKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkRlc2NlbmRhbnQgZm9udHMgYXJlIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgICB9XG4gICAgICBkaWN0ID0gQXJyYXkuaXNBcnJheShkZikgPyB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkZlswXSkgOiBkZjtcblxuICAgICAgdHlwZSA9IGRpY3QuZ2V0KFwiU3VidHlwZVwiKTtcbiAgICAgIGlmICghaXNOYW1lKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcImludmFsaWQgZm9udCBTdWJ0eXBlXCIpO1xuICAgICAgfVxuICAgICAgY29tcG9zaXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgZGVzY3JpcHRvciA9IGRpY3QuZ2V0KFwiRm9udERlc2NyaXB0b3JcIik7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIHZhciBoYXNoID0gbmV3IE11cm11ckhhc2gzXzY0KCk7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBiYXNlRGljdC5nZXRSYXcoXCJFbmNvZGluZ1wiKTtcbiAgICAgIGlmIChpc05hbWUoZW5jb2RpbmcpKSB7XG4gICAgICAgIGhhc2gudXBkYXRlKGVuY29kaW5nLm5hbWUpO1xuICAgICAgfSBlbHNlIGlmIChpc1JlZihlbmNvZGluZykpIHtcbiAgICAgICAgaGFzaC51cGRhdGUoZW5jb2RpbmcudG9TdHJpbmcoKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGljdChlbmNvZGluZykpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbmNvZGluZy5nZXRSYXdWYWx1ZXMoKSkge1xuICAgICAgICAgIGlmIChpc05hbWUoZW50cnkpKSB7XG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShlbnRyeS5uYW1lKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVmKGVudHJ5KSkge1xuICAgICAgICAgICAgaGFzaC51cGRhdGUoZW50cnkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAgICAgLy8gJ0RpZmZlcmVuY2VzJyBhcnJheSAoZml4ZXMgYnVnMTE1NzQ5My5wZGYpLlxuICAgICAgICAgICAgdmFyIGRpZmZMZW5ndGggPSBlbnRyeS5sZW5ndGgsXG4gICAgICAgICAgICAgIGRpZmZCdWYgPSBuZXcgQXJyYXkoZGlmZkxlbmd0aCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGlmZkxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmRW50cnkgPSBlbnRyeVtqXTtcbiAgICAgICAgICAgICAgaWYgKGlzTmFtZShkaWZmRW50cnkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS5uYW1lO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTnVtKGRpZmZFbnRyeSkgfHwgaXNSZWYoZGlmZkVudHJ5KSkge1xuICAgICAgICAgICAgICAgIGRpZmZCdWZbal0gPSBkaWZmRW50cnkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFzaC51cGRhdGUoZGlmZkJ1Zi5qb2luKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdENoYXIgPSBkaWN0LmdldChcIkZpcnN0Q2hhclwiKSB8fCAwO1xuICAgICAgY29uc3QgbGFzdENoYXIgPSBkaWN0LmdldChcIkxhc3RDaGFyXCIpIHx8IChjb21wb3NpdGUgPyAweGZmZmYgOiAweGZmKTtcbiAgICAgIGhhc2gudXBkYXRlKGAke2ZpcnN0Q2hhcn0tJHtsYXN0Q2hhcn1gKTtcblxuICAgICAgdmFyIHRvVW5pY29kZSA9IGRpY3QuZ2V0KFwiVG9Vbmljb2RlXCIpIHx8IGJhc2VEaWN0LmdldChcIlRvVW5pY29kZVwiKTtcbiAgICAgIGlmIChpc1N0cmVhbSh0b1VuaWNvZGUpKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTtcbiAgICAgICAgdWludDhhcnJheSA9IHN0cmVhbS5idWZmZXJcbiAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIuYnVmZmVyLCAwLCBzdHJlYW0uYnVmZmVyTGVuZ3RoKVxuICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgICAgICAgIHN0cmVhbS5ieXRlcy5idWZmZXIsXG4gICAgICAgICAgICAgIHN0cmVhbS5zdGFydCxcbiAgICAgICAgICAgICAgc3RyZWFtLmVuZCAtIHN0cmVhbS5zdGFydFxuICAgICAgICAgICAgKTtcbiAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFtZSh0b1VuaWNvZGUpKSB7XG4gICAgICAgIGhhc2gudXBkYXRlKHRvVW5pY29kZS5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHdpZHRocyA9IGRpY3QuZ2V0KFwiV2lkdGhzXCIpIHx8IGJhc2VEaWN0LmdldChcIldpZHRoc1wiKTtcbiAgICAgIGlmICh3aWR0aHMpIHtcbiAgICAgICAgdWludDhhcnJheSA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheSh3aWR0aHMpLmJ1ZmZlcik7XG4gICAgICAgIGhhc2gudXBkYXRlKHVpbnQ4YXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgZGljdCxcbiAgICAgIGJhc2VEaWN0LFxuICAgICAgY29tcG9zaXRlLFxuICAgICAgdHlwZTogdHlwZS5uYW1lLFxuICAgICAgaGFzaDogaGFzaCA/IGhhc2guaGV4ZGlnZXN0KCkgOiBcIlwiLFxuICAgIH07XG4gIH1cblxuICB0cmFuc2xhdGVGb250KHByZUV2YWx1YXRlZEZvbnQpIHtcbiAgICB2YXIgYmFzZURpY3QgPSBwcmVFdmFsdWF0ZWRGb250LmJhc2VEaWN0O1xuICAgIHZhciBkaWN0ID0gcHJlRXZhbHVhdGVkRm9udC5kaWN0O1xuICAgIHZhciBjb21wb3NpdGUgPSBwcmVFdmFsdWF0ZWRGb250LmNvbXBvc2l0ZTtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByZUV2YWx1YXRlZEZvbnQuZGVzY3JpcHRvcjtcbiAgICB2YXIgdHlwZSA9IHByZUV2YWx1YXRlZEZvbnQudHlwZTtcbiAgICB2YXIgbWF4Q2hhckluZGV4ID0gY29tcG9zaXRlID8gMHhmZmZmIDogMHhmZjtcbiAgICB2YXIgcHJvcGVydGllcztcbiAgICBjb25zdCBmaXJzdENoYXIgPSBkaWN0LmdldChcIkZpcnN0Q2hhclwiKSB8fCAwO1xuICAgIGNvbnN0IGxhc3RDaGFyID0gZGljdC5nZXQoXCJMYXN0Q2hhclwiKSB8fCBtYXhDaGFySW5kZXg7XG5cbiAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgIGlmICh0eXBlID09PSBcIlR5cGUzXCIpIHtcbiAgICAgICAgLy8gRm9udERlc2NyaXB0b3IgaXMgb25seSByZXF1aXJlZCBmb3IgVHlwZTMgZm9udHMgd2hlbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgLy8gaXMgYSB0YWdnZWQgcGRmLiBDcmVhdGUgYSBiYXJiZWJvbmVzIG9uZSB0byBnZXQgYnkuXG4gICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgRGljdChudWxsKTtcbiAgICAgICAgZGVzY3JpcHRvci5zZXQoXCJGb250TmFtZVwiLCBOYW1lLmdldCh0eXBlKSk7XG4gICAgICAgIGRlc2NyaXB0b3Iuc2V0KFwiRm9udEJCb3hcIiwgZGljdC5nZXRBcnJheShcIkZvbnRCQm94XCIpIHx8IFswLCAwLCAwLCAwXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCZWZvcmUgUERGIDEuNSBpZiB0aGUgZm9udCB3YXMgb25lIG9mIHRoZSBiYXNlIDE0IGZvbnRzLCBoYXZpbmcgYVxuICAgICAgICAvLyBGb250RGVzY3JpcHRvciB3YXMgbm90IHJlcXVpcmVkLlxuICAgICAgICAvLyBUaGlzIGNhc2UgaXMgaGVyZSBmb3IgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgdmFyIGJhc2VGb250TmFtZSA9IGRpY3QuZ2V0KFwiQmFzZUZvbnRcIik7XG4gICAgICAgIGlmICghaXNOYW1lKGJhc2VGb250TmFtZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYXNlIGZvbnQgaXMgbm90IHNwZWNpZmllZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzaW5nIGJhc2UgZm9udCBuYW1lIGFzIGEgZm9udCBuYW1lLlxuICAgICAgICBiYXNlRm9udE5hbWUgPSBiYXNlRm9udE5hbWUubmFtZS5yZXBsYWNlKC9bLF9dL2csIFwiLVwiKTtcbiAgICAgICAgdmFyIG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUpO1xuXG4gICAgICAgIC8vIFNpbXVsYXRpbmcgZGVzY3JpcHRvciBmbGFncyBhdHRyaWJ1dGVcbiAgICAgICAgdmFyIGZvbnROYW1lV29TdHlsZSA9IGJhc2VGb250TmFtZS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIHZhciBmbGFncyA9XG4gICAgICAgICAgKHRoaXMuaXNTZXJpZkZvbnQoZm9udE5hbWVXb1N0eWxlKSA/IEZvbnRGbGFncy5TZXJpZiA6IDApIHxcbiAgICAgICAgICAobWV0cmljcy5tb25vc3BhY2UgPyBGb250RmxhZ3MuRml4ZWRQaXRjaCA6IDApIHxcbiAgICAgICAgICAoZ2V0U3ltYm9sc0ZvbnRzKClbZm9udE5hbWVXb1N0eWxlXVxuICAgICAgICAgICAgPyBGb250RmxhZ3MuU3ltYm9saWNcbiAgICAgICAgICAgIDogRm9udEZsYWdzLk5vbnN5bWJvbGljKTtcblxuICAgICAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgbmFtZTogYmFzZUZvbnROYW1lLFxuICAgICAgICAgIHdpZHRoczogbWV0cmljcy53aWR0aHMsXG4gICAgICAgICAgZGVmYXVsdFdpZHRoOiBtZXRyaWNzLmRlZmF1bHRXaWR0aCxcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBmaXJzdENoYXIsXG4gICAgICAgICAgbGFzdENoYXIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHdpZHRocyA9IGRpY3QuZ2V0KFwiV2lkdGhzXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgZGljdCwgcHJvcGVydGllcykudGhlbihcbiAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0+IHtcbiAgICAgICAgICAgIGlmICh3aWR0aHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZ2x5cGhXaWR0aHMgPSBbXTtcbiAgICAgICAgICAgICAgbGV0IGogPSBmaXJzdENoYXI7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZ2x5cGhXaWR0aHNbaisrXSA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHdpZHRoc1tpXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBnbHlwaFdpZHRocztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMud2lkdGhzID0gdGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChcbiAgICAgICAgICAgICAgICBtZXRyaWNzLndpZHRocyxcbiAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvbnQoYmFzZUZvbnROYW1lLCBudWxsLCBuZXdQcm9wZXJ0aWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjIGlmICdGb250RGVzY3JpcHRvcicgaXMgZGVjbGFyZWQsICdGaXJzdENoYXInLFxuICAgIC8vICdMYXN0Q2hhcicgYW5kICdXaWR0aHMnIHNob3VsZCBleGlzdCB0b28sIGJ1dCBzb21lIFBERiBlbmNvZGVycyBzZWVtXG4gICAgLy8gdG8gaWdub3JlIHRoaXMgcnVsZSB3aGVuIGEgdmFyaWFudCBvZiBhIHN0YW5kYXJkIGZvbnQgaXMgdXNlZC5cbiAgICAvLyBUT0RPIEZpbGwgdGhlIHdpZHRoIGFycmF5IGRlcGVuZGluZyBvbiB3aGljaCBvZiB0aGUgYmFzZSBmb250IHRoaXMgaXNcbiAgICAvLyBhIHZhcmlhbnQuXG5cbiAgICB2YXIgZm9udE5hbWUgPSBkZXNjcmlwdG9yLmdldChcIkZvbnROYW1lXCIpO1xuICAgIHZhciBiYXNlRm9udCA9IGRpY3QuZ2V0KFwiQmFzZUZvbnRcIik7XG4gICAgLy8gU29tZSBiYWQgUERGcyBoYXZlIGEgc3RyaW5nIGFzIHRoZSBmb250IG5hbWUuXG4gICAgaWYgKGlzU3RyaW5nKGZvbnROYW1lKSkge1xuICAgICAgZm9udE5hbWUgPSBOYW1lLmdldChmb250TmFtZSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhiYXNlRm9udCkpIHtcbiAgICAgIGJhc2VGb250ID0gTmFtZS5nZXQoYmFzZUZvbnQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSBcIlR5cGUzXCIpIHtcbiAgICAgIHZhciBmb250TmFtZVN0ciA9IGZvbnROYW1lICYmIGZvbnROYW1lLm5hbWU7XG4gICAgICB2YXIgYmFzZUZvbnRTdHIgPSBiYXNlRm9udCAmJiBiYXNlRm9udC5uYW1lO1xuICAgICAgaWYgKGZvbnROYW1lU3RyICE9PSBiYXNlRm9udFN0cikge1xuICAgICAgICBpbmZvKFxuICAgICAgICAgIGBUaGUgRm9udERlc2NyaXB0b3JcXCdzIEZvbnROYW1lIGlzIFwiJHtmb250TmFtZVN0cn1cIiBidXQgYCArXG4gICAgICAgICAgICBgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250XFwncyBCYXNlRm9udCBcIiR7YmFzZUZvbnRTdHJ9XCIuYFxuICAgICAgICApO1xuICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBjYXNlcyB3aGVyZSBlLmcuIGZvbnROYW1lU3RyID0gJ0FyaWFsJyBhbmRcbiAgICAgICAgLy8gYmFzZUZvbnRTdHIgPSAnQXJpYWwsQm9sZCcgKG5lZWRlZCB3aGVuIG5vIGZvbnQgZmlsZSBpcyBlbWJlZGRlZCkuXG4gICAgICAgIGlmIChmb250TmFtZVN0ciAmJiBiYXNlRm9udFN0ciAmJiBiYXNlRm9udFN0ci5zdGFydHNXaXRoKGZvbnROYW1lU3RyKSkge1xuICAgICAgICAgIGZvbnROYW1lID0gYmFzZUZvbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9udE5hbWUgPSBmb250TmFtZSB8fCBiYXNlRm9udDtcblxuICAgIGlmICghaXNOYW1lKGZvbnROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiaW52YWxpZCBmb250IG5hbWVcIik7XG4gICAgfVxuXG4gICAgdmFyIGZvbnRGaWxlID0gZGVzY3JpcHRvci5nZXQoXCJGb250RmlsZVwiLCBcIkZvbnRGaWxlMlwiLCBcIkZvbnRGaWxlM1wiKTtcbiAgICBpZiAoZm9udEZpbGUpIHtcbiAgICAgIGlmIChmb250RmlsZS5kaWN0KSB7XG4gICAgICAgIHZhciBzdWJ0eXBlID0gZm9udEZpbGUuZGljdC5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgICAgICBpZiAoc3VidHlwZSkge1xuICAgICAgICAgIHN1YnR5cGUgPSBzdWJ0eXBlLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aDEgPSBmb250RmlsZS5kaWN0LmdldChcIkxlbmd0aDFcIik7XG4gICAgICAgIHZhciBsZW5ndGgyID0gZm9udEZpbGUuZGljdC5nZXQoXCJMZW5ndGgyXCIpO1xuICAgICAgICB2YXIgbGVuZ3RoMyA9IGZvbnRGaWxlLmRpY3QuZ2V0KFwiTGVuZ3RoM1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgdHlwZSxcbiAgICAgIG5hbWU6IGZvbnROYW1lLm5hbWUsXG4gICAgICBzdWJ0eXBlLFxuICAgICAgZmlsZTogZm9udEZpbGUsXG4gICAgICBsZW5ndGgxLFxuICAgICAgbGVuZ3RoMixcbiAgICAgIGxlbmd0aDMsXG4gICAgICBsb2FkZWROYW1lOiBiYXNlRGljdC5sb2FkZWROYW1lLFxuICAgICAgY29tcG9zaXRlLFxuICAgICAgZml4ZWRQaXRjaDogZmFsc2UsXG4gICAgICBmb250TWF0cml4OiBkaWN0LmdldEFycmF5KFwiRm9udE1hdHJpeFwiKSB8fCBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgICAgIGZpcnN0Q2hhcjogZmlyc3RDaGFyIHx8IDAsXG4gICAgICBsYXN0Q2hhcjogbGFzdENoYXIgfHwgbWF4Q2hhckluZGV4LFxuICAgICAgYmJveDogZGVzY3JpcHRvci5nZXRBcnJheShcIkZvbnRCQm94XCIpLFxuICAgICAgYXNjZW50OiBkZXNjcmlwdG9yLmdldChcIkFzY2VudFwiKSxcbiAgICAgIGRlc2NlbnQ6IGRlc2NyaXB0b3IuZ2V0KFwiRGVzY2VudFwiKSxcbiAgICAgIHhIZWlnaHQ6IGRlc2NyaXB0b3IuZ2V0KFwiWEhlaWdodFwiKSxcbiAgICAgIGNhcEhlaWdodDogZGVzY3JpcHRvci5nZXQoXCJDYXBIZWlnaHRcIiksXG4gICAgICBmbGFnczogZGVzY3JpcHRvci5nZXQoXCJGbGFnc1wiKSxcbiAgICAgIGl0YWxpY0FuZ2xlOiBkZXNjcmlwdG9yLmdldChcIkl0YWxpY0FuZ2xlXCIpLFxuICAgICAgaXNUeXBlM0ZvbnQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICB2YXIgY01hcFByb21pc2U7XG4gICAgaWYgKGNvbXBvc2l0ZSkge1xuICAgICAgdmFyIGNpZEVuY29kaW5nID0gYmFzZURpY3QuZ2V0KFwiRW5jb2RpbmdcIik7XG4gICAgICBpZiAoaXNOYW1lKGNpZEVuY29kaW5nKSkge1xuICAgICAgICBwcm9wZXJ0aWVzLmNpZEVuY29kaW5nID0gY2lkRW5jb2RpbmcubmFtZTtcbiAgICAgIH1cbiAgICAgIGNNYXBQcm9taXNlID0gQ01hcEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgICAgZW5jb2Rpbmc6IGNpZEVuY29kaW5nLFxuICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsXG4gICAgICAgIHVzZUNNYXA6IG51bGwsXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjTWFwKSB7XG4gICAgICAgIHByb3BlcnRpZXMuY01hcCA9IGNNYXA7XG4gICAgICAgIHByb3BlcnRpZXMudmVydGljYWwgPSBwcm9wZXJ0aWVzLmNNYXAudmVydGljYWw7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY01hcFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY01hcFByb21pc2VcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIGJhc2VEaWN0LCBwcm9wZXJ0aWVzKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihuZXdQcm9wZXJ0aWVzID0+IHtcbiAgICAgICAgdGhpcy5leHRyYWN0V2lkdGhzKGRpY3QsIGRlc2NyaXB0b3IsIG5ld1Byb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmICh0eXBlID09PSBcIlR5cGUzXCIpIHtcbiAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmlzVHlwZTNGb250ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZvbnQoZm9udE5hbWUubmFtZSwgZm9udEZpbGUsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgfSk7XG4gIH1cblxuICBzdGF0aWMgYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCBoYW5kbGVyKSB7XG4gICAgZnVuY3Rpb24gYnVpbGRQYXRoKGZvbnRDaGFyKSB7XG4gICAgICBpZiAoZm9udC5yZW5kZXJlci5oYXNCdWlsdFBhdGgoZm9udENoYXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGhhbmRsZXIuc2VuZChcImNvbW1vbm9ialwiLCBbXG4gICAgICAgIGAke2ZvbnQubG9hZGVkTmFtZX1fcGF0aF8ke2ZvbnRDaGFyfWAsXG4gICAgICAgIFwiRm9udFBhdGhcIixcbiAgICAgICAgZm9udC5yZW5kZXJlci5nZXRQYXRoSnMoZm9udENoYXIpLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHtcbiAgICAgIGJ1aWxkUGF0aChnbHlwaC5mb250Q2hhcik7XG5cbiAgICAgIC8vIElmIHRoZSBnbHlwaCBoYXMgYW4gYWNjZW50IHdlIG5lZWQgdG8gYnVpbGQgYSBwYXRoIGZvciBpdHNcbiAgICAgIC8vIGZvbnRDaGFyIHRvbywgb3RoZXJ3aXNlIENhbnZhc0dyYXBoaWNzX3BhaW50Q2hhciB3aWxsIGZhaWwuXG4gICAgICBjb25zdCBhY2NlbnQgPSBnbHlwaC5hY2NlbnQ7XG4gICAgICBpZiAoYWNjZW50ICYmIGFjY2VudC5mb250Q2hhcikge1xuICAgICAgICBidWlsZFBhdGgoYWNjZW50LmZvbnRDaGFyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGZhbGxiYWNrRm9udERpY3QoKSB7XG4gICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KCk7XG4gICAgZGljdC5zZXQoXCJCYXNlRm9udFwiLCBOYW1lLmdldChcIlBERkpTLUZhbGxiYWNrRm9udFwiKSk7XG4gICAgZGljdC5zZXQoXCJUeXBlXCIsIE5hbWUuZ2V0KFwiRmFsbGJhY2tUeXBlXCIpKTtcbiAgICBkaWN0LnNldChcIlN1YnR5cGVcIiwgTmFtZS5nZXQoXCJGYWxsYmFja1R5cGVcIikpO1xuICAgIGRpY3Quc2V0KFwiRW5jb2RpbmdcIiwgTmFtZS5nZXQoXCJXaW5BbnNpRW5jb2RpbmdcIikpO1xuXG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImZhbGxiYWNrRm9udERpY3RcIiwgZGljdCk7XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNsYXRlZEZvbnQge1xuICBjb25zdHJ1Y3Rvcih7IGxvYWRlZE5hbWUsIGZvbnQsIGRpY3QsIGV4dHJhUHJvcGVydGllcyA9IGZhbHNlIH0pIHtcbiAgICB0aGlzLmxvYWRlZE5hbWUgPSBsb2FkZWROYW1lO1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB0aGlzLl9leHRyYVByb3BlcnRpZXMgPSBleHRyYVByb3BlcnRpZXM7XG4gICAgdGhpcy50eXBlM0xvYWRlZCA9IG51bGw7XG4gICAgdGhpcy50eXBlM0RlcGVuZGVuY2llcyA9IGZvbnQuaXNUeXBlM0ZvbnQgPyBuZXcgU2V0KCkgOiBudWxsO1xuICAgIHRoaXMuc2VudCA9IGZhbHNlO1xuICB9XG5cbiAgc2VuZChoYW5kbGVyKSB7XG4gICAgaWYgKHRoaXMuc2VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbnQgPSB0cnVlO1xuXG4gICAgaGFuZGxlci5zZW5kKFwiY29tbW9ub2JqXCIsIFtcbiAgICAgIHRoaXMubG9hZGVkTmFtZSxcbiAgICAgIFwiRm9udFwiLFxuICAgICAgdGhpcy5mb250LmV4cG9ydERhdGEodGhpcy5fZXh0cmFQcm9wZXJ0aWVzKSxcbiAgICBdKTtcbiAgfVxuXG4gIGZhbGxiYWNrKGhhbmRsZXIpIHtcbiAgICBpZiAoIXRoaXMuZm9udC5kYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFdoZW4gZm9udCBsb2FkaW5nIGZhaWxlZCwgZmFsbCBiYWNrIHRvIHRoZSBidWlsdC1pbiBmb250IHJlbmRlcmVyLlxuICAgIHRoaXMuZm9udC5kaXNhYmxlRm9udEZhY2UgPSB0cnVlO1xuICAgIC8vIEFuIGFyYml0cmFyeSBudW1iZXIgb2YgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3JzIGNvdWxkIGhhdmUgYmVlblxuICAgIC8vIGVuY291bnRlcmVkIGJldHdlZW4gdGhlIHBvaW50IGluIHRpbWUgd2hlbiB0aGUgJ0ZvbnQnIG1lc3NhZ2Ugd2FzIHNlbnRcbiAgICAvLyB0byB0aGUgbWFpbi10aHJlYWQsIGFuZCB0aGUgcG9pbnQgaW4gdGltZSB3aGVuIHRoZSAnRm9udEZhbGxiYWNrJ1xuICAgIC8vIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIG9uIHRoZSB3b3JrZXItdGhyZWFkLlxuICAgIC8vIFRvIGVuc3VyZSB0aGF0IGFsbCAnRm9udFBhdGgncyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBtYWluLXRocmVhZCwgd2hlblxuICAgIC8vIGZvbnQgbG9hZGluZyBmYWlsZWQsIGF0dGVtcHQgdG8gcmVzZW5kICphbGwqIHByZXZpb3VzbHkgcGFyc2VkIGdseXBocy5cbiAgICBjb25zdCBnbHlwaHMgPSB0aGlzLmZvbnQuZ2x5cGhDYWNoZVZhbHVlcztcbiAgICBQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKHRoaXMuZm9udCwgZ2x5cGhzLCBoYW5kbGVyKTtcbiAgfVxuXG4gIGxvYWRUeXBlM0RhdGEoZXZhbHVhdG9yLCByZXNvdXJjZXMsIHRhc2spIHtcbiAgICBpZiAodGhpcy50eXBlM0xvYWRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZTNMb2FkZWQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5mb250LmlzVHlwZTNGb250KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGJlIGEgVHlwZTMgZm9udC5cIik7XG4gICAgfVxuICAgIC8vIFdoZW4gcGFyc2luZyBUeXBlMyBnbHlwaHMsIGFsd2F5cyBpZ25vcmUgdGhlbSBpZiB0aGVyZSBhcmUgZXJyb3JzLlxuICAgIC8vIENvbXBhcmVkIHRvIHRoZSBwYXJzaW5nIG9mIGUuZy4gYW4gZW50aXJlIHBhZ2UsIGl0IGRvZXNuJ3QgcmVhbGx5XG4gICAgLy8gbWFrZSBzZW5zZSB0byBvbmx5IGJlIGFibGUgdG8gcmVuZGVyIGEgVHlwZTMgZ2x5cGggcGFydGlhbGx5LlxuICAgIHZhciB0eXBlM09wdGlvbnMgPSBPYmplY3QuY3JlYXRlKGV2YWx1YXRvci5vcHRpb25zKTtcbiAgICB0eXBlM09wdGlvbnMuaWdub3JlRXJyb3JzID0gZmFsc2U7XG4gICAgdmFyIHR5cGUzRXZhbHVhdG9yID0gZXZhbHVhdG9yLmNsb25lKHR5cGUzT3B0aW9ucyk7XG4gICAgdHlwZTNFdmFsdWF0b3IucGFyc2luZ1R5cGUzRm9udCA9IHRydWU7XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkRm9udCA9IHRoaXMuZm9udCxcbiAgICAgIHR5cGUzRGVwZW5kZW5jaWVzID0gdGhpcy50eXBlM0RlcGVuZGVuY2llcztcbiAgICB2YXIgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB2YXIgY2hhclByb2NzID0gdGhpcy5kaWN0LmdldChcIkNoYXJQcm9jc1wiKTtcbiAgICB2YXIgZm9udFJlc291cmNlcyA9IHRoaXMuZGljdC5nZXQoXCJSZXNvdXJjZXNcIikgfHwgcmVzb3VyY2VzO1xuICAgIHZhciBjaGFyUHJvY09wZXJhdG9yTGlzdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjaGFyUHJvY3MuZ2V0S2V5cygpKSB7XG4gICAgICBsb2FkQ2hhclByb2NzUHJvbWlzZSA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2x5cGhTdHJlYW0gPSBjaGFyUHJvY3MuZ2V0KGtleSk7XG4gICAgICAgIHZhciBvcGVyYXRvckxpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7XG4gICAgICAgIHJldHVybiB0eXBlM0V2YWx1YXRvclxuICAgICAgICAgIC5nZXRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgc3RyZWFtOiBnbHlwaFN0cmVhbSxcbiAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICByZXNvdXJjZXM6IGZvbnRSZXNvdXJjZXMsXG4gICAgICAgICAgICBvcGVyYXRvckxpc3QsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gb3BlcmF0b3JMaXN0LmdldElSKCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvcGVyYXRvckxpc3QuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgIHR5cGUzRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICB3YXJuKGBUeXBlMyBmb250IHJlc291cmNlIFwiJHtrZXl9XCIgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgICAgICAgICAgIGNvbnN0IGR1bW15T3BlcmF0b3JMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpO1xuICAgICAgICAgICAgY2hhclByb2NPcGVyYXRvckxpc3Rba2V5XSA9IGR1bW15T3BlcmF0b3JMaXN0LmdldElSKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy50eXBlM0xvYWRlZCA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNsYXRlZEZvbnQuY2hhclByb2NPcGVyYXRvckxpc3QgPSBjaGFyUHJvY09wZXJhdG9yTGlzdDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy50eXBlM0xvYWRlZDtcbiAgfVxufVxuXG5jbGFzcyBTdGF0ZU1hbmFnZXIge1xuICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIHRoaXMuc3RhdGVTdGFjayA9IFtdO1xuICB9XG5cbiAgc2F2ZSgpIHtcbiAgICB2YXIgb2xkID0gdGhpcy5zdGF0ZTtcbiAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLnN0YXRlID0gb2xkLmNsb25lKCk7XG4gIH1cblxuICByZXN0b3JlKCkge1xuICAgIHZhciBwcmV2ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpO1xuICAgIGlmIChwcmV2KSB7XG4gICAgICB0aGlzLnN0YXRlID0gcHJldjtcbiAgICB9XG4gIH1cblxuICB0cmFuc2Zvcm0oYXJncykge1xuICAgIHRoaXMuc3RhdGUuY3RtID0gVXRpbC50cmFuc2Zvcm0odGhpcy5zdGF0ZS5jdG0sIGFyZ3MpO1xuICB9XG59XG5cbmNsYXNzIFRleHRTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY3RtID0gbmV3IEZsb2F0MzJBcnJheShJREVOVElUWV9NQVRSSVgpO1xuICAgIHRoaXMuZm9udE5hbWUgPSBudWxsO1xuICAgIHRoaXMuZm9udFNpemUgPSAwO1xuICAgIHRoaXMuZm9udCA9IG51bGw7XG4gICAgdGhpcy5mb250TWF0cml4ID0gRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgdGhpcy50ZXh0TWF0cml4ID0gSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7XG4gICAgdGhpcy50ZXh0TGluZU1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpO1xuICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwO1xuICAgIHRoaXMud29yZFNwYWNpbmcgPSAwO1xuICAgIHRoaXMubGVhZGluZyA9IDA7XG4gICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcbiAgICB0aGlzLnRleHRSaXNlID0gMDtcbiAgfVxuXG4gIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHZhciBtID0gdGhpcy50ZXh0TWF0cml4O1xuICAgIG1bMF0gPSBhO1xuICAgIG1bMV0gPSBiO1xuICAgIG1bMl0gPSBjO1xuICAgIG1bM10gPSBkO1xuICAgIG1bNF0gPSBlO1xuICAgIG1bNV0gPSBmO1xuICB9XG5cbiAgc2V0VGV4dExpbmVNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHZhciBtID0gdGhpcy50ZXh0TGluZU1hdHJpeDtcbiAgICBtWzBdID0gYTtcbiAgICBtWzFdID0gYjtcbiAgICBtWzJdID0gYztcbiAgICBtWzNdID0gZDtcbiAgICBtWzRdID0gZTtcbiAgICBtWzVdID0gZjtcbiAgfVxuXG4gIHRyYW5zbGF0ZVRleHRNYXRyaXgoeCwgeSkge1xuICAgIHZhciBtID0gdGhpcy50ZXh0TWF0cml4O1xuICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIH1cblxuICB0cmFuc2xhdGVUZXh0TGluZU1hdHJpeCh4LCB5KSB7XG4gICAgdmFyIG0gPSB0aGlzLnRleHRMaW5lTWF0cml4O1xuICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIH1cblxuICBjYWxjVGV4dExpbmVNYXRyaXhBZHZhbmNlKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICB2YXIgZm9udCA9IHRoaXMuZm9udDtcbiAgICBpZiAoIWZvbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7XG4gICAgaWYgKCEoYSA9PT0gbVswXSAmJiBiID09PSBtWzFdICYmIGMgPT09IG1bMl0gJiYgZCA9PT0gbVszXSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgdHhEaWZmID0gZSAtIG1bNF0sXG4gICAgICB0eURpZmYgPSBmIC0gbVs1XTtcbiAgICBpZiAoKGZvbnQudmVydGljYWwgJiYgdHhEaWZmICE9PSAwKSB8fCAoIWZvbnQudmVydGljYWwgJiYgdHlEaWZmICE9PSAwKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciB0eCxcbiAgICAgIHR5LFxuICAgICAgZGVub21pbmF0b3IgPSBhICogZCAtIGIgKiBjO1xuICAgIGlmIChmb250LnZlcnRpY2FsKSB7XG4gICAgICB0eCA9ICgtdHlEaWZmICogYykgLyBkZW5vbWluYXRvcjtcbiAgICAgIHR5ID0gKHR5RGlmZiAqIGEpIC8gZGVub21pbmF0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4ID0gKHR4RGlmZiAqIGQpIC8gZGVub21pbmF0b3I7XG4gICAgICB0eSA9ICgtdHhEaWZmICogYikgLyBkZW5vbWluYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIHsgd2lkdGg6IHR4LCBoZWlnaHQ6IHR5LCB2YWx1ZTogZm9udC52ZXJ0aWNhbCA/IHR5IDogdHggfTtcbiAgfVxuXG4gIGNhbGNSZW5kZXJNYXRyaXgoY3RtKSB7XG4gICAgLy8gOS40LjQgVGV4dCBTcGFjZSBEZXRhaWxzXG4gICAgdmFyIHRzbSA9IFtcbiAgICAgIHRoaXMuZm9udFNpemUgKiB0aGlzLnRleHRIU2NhbGUsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHRoaXMuZm9udFNpemUsXG4gICAgICAwLFxuICAgICAgdGhpcy50ZXh0UmlzZSxcbiAgICBdO1xuICAgIHJldHVybiBVdGlsLnRyYW5zZm9ybShjdG0sIFV0aWwudHJhbnNmb3JtKHRoaXMudGV4dE1hdHJpeCwgdHNtKSk7XG4gIH1cblxuICBjYXJyaWFnZVJldHVybigpIHtcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KDAsIC10aGlzLmxlYWRpbmcpO1xuICAgIHRoaXMudGV4dE1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHZhciBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgY2xvbmUudGV4dE1hdHJpeCA9IHRoaXMudGV4dE1hdHJpeC5zbGljZSgpO1xuICAgIGNsb25lLnRleHRMaW5lTWF0cml4ID0gdGhpcy50ZXh0TGluZU1hdHJpeC5zbGljZSgpO1xuICAgIGNsb25lLmZvbnRNYXRyaXggPSB0aGlzLmZvbnRNYXRyaXguc2xpY2UoKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cbn1cblxuY2xhc3MgRXZhbFN0YXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jdG0gPSBuZXcgRmxvYXQzMkFycmF5KElERU5USVRZX01BVFJJWCk7XG4gICAgdGhpcy5mb250ID0gbnVsbDtcbiAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcbiAgICB0aGlzLmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7XG4gICAgdGhpcy5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgfVxufVxuXG5jbGFzcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3Ige1xuICBzdGF0aWMgZ2V0IG9wTWFwKCkge1xuICAgIC8vIFNwZWNpZmllcyBwcm9wZXJ0aWVzIGZvciBlYWNoIGNvbW1hbmRcbiAgICAvL1xuICAgIC8vIElmIHZhcmlhYmxlQXJncyA9PT0gdHJ1ZTogWzAsIGBudW1BcmdzYF0gZXhwZWN0ZWRcbiAgICAvLyBJZiB2YXJpYWJsZUFyZ3MgPT09IGZhbHNlOiBleGFjdGx5IGBudW1BcmdzYCBleHBlY3RlZFxuICAgIGNvbnN0IGdldE9QTWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgICAvLyBHcmFwaGljIHN0YXRlXG4gICAgICB0LncgPSB7IGlkOiBPUFMuc2V0TGluZVdpZHRoLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LkogPSB7IGlkOiBPUFMuc2V0TGluZUNhcCwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5qID0geyBpZDogT1BTLnNldExpbmVKb2luLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0Lk0gPSB7IGlkOiBPUFMuc2V0TWl0ZXJMaW1pdCwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5kID0geyBpZDogT1BTLnNldERhc2gsIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQucmkgPSB7IGlkOiBPUFMuc2V0UmVuZGVyaW5nSW50ZW50LCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LmkgPSB7IGlkOiBPUFMuc2V0RmxhdG5lc3MsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuZ3MgPSB7IGlkOiBPUFMuc2V0R1N0YXRlLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LnEgPSB7IGlkOiBPUFMuc2F2ZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5RID0geyBpZDogT1BTLnJlc3RvcmUsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuY20gPSB7IGlkOiBPUFMudHJhbnNmb3JtLCBudW1BcmdzOiA2LCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG5cbiAgICAgIC8vIFBhdGhcbiAgICAgIHQubSA9IHsgaWQ6IE9QUy5tb3ZlVG8sIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQubCA9IHsgaWQ6IE9QUy5saW5lVG8sIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuYyA9IHsgaWQ6IE9QUy5jdXJ2ZVRvLCBudW1BcmdzOiA2LCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LnYgPSB7IGlkOiBPUFMuY3VydmVUbzIsIG51bUFyZ3M6IDQsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQueSA9IHsgaWQ6IE9QUy5jdXJ2ZVRvMywgbnVtQXJnczogNCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5oID0geyBpZDogT1BTLmNsb3NlUGF0aCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5yZSA9IHsgaWQ6IE9QUy5yZWN0YW5nbGUsIG51bUFyZ3M6IDQsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuUyA9IHsgaWQ6IE9QUy5zdHJva2UsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQucyA9IHsgaWQ6IE9QUy5jbG9zZVN0cm9rZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5mID0geyBpZDogT1BTLmZpbGwsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuRiA9IHsgaWQ6IE9QUy5maWxsLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0W1wiZipcIl0gPSB7IGlkOiBPUFMuZW9GaWxsLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LkIgPSB7IGlkOiBPUFMuZmlsbFN0cm9rZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdFtcIkIqXCJdID0geyBpZDogT1BTLmVvRmlsbFN0cm9rZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5iID0geyBpZDogT1BTLmNsb3NlRmlsbFN0cm9rZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdFtcImIqXCJdID0geyBpZDogT1BTLmNsb3NlRU9GaWxsU3Ryb2tlLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0Lm4gPSB7IGlkOiBPUFMuZW5kUGF0aCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuXG4gICAgICAvLyBDbGlwcGluZ1xuICAgICAgdC5XID0geyBpZDogT1BTLmNsaXAsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHRbXCJXKlwiXSA9IHsgaWQ6IE9QUy5lb0NsaXAsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcblxuICAgICAgLy8gVGV4dFxuICAgICAgdC5CVCA9IHsgaWQ6IE9QUy5iZWdpblRleHQsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuRVQgPSB7IGlkOiBPUFMuZW5kVGV4dCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UYyA9IHsgaWQ6IE9QUy5zZXRDaGFyU3BhY2luZywgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UdyA9IHsgaWQ6IE9QUy5zZXRXb3JkU3BhY2luZywgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UeiA9IHsgaWQ6IE9QUy5zZXRIU2NhbGUsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuVEwgPSB7IGlkOiBPUFMuc2V0TGVhZGluZywgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UZiA9IHsgaWQ6IE9QUy5zZXRGb250LCBudW1BcmdzOiAyLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LlRyID0geyBpZDogT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LlRzID0geyBpZDogT1BTLnNldFRleHRSaXNlLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LlRkID0geyBpZDogT1BTLm1vdmVUZXh0LCBudW1BcmdzOiAyLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LlREID0geyBpZDogT1BTLnNldExlYWRpbmdNb3ZlVGV4dCwgbnVtQXJnczogMiwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UbSA9IHsgaWQ6IE9QUy5zZXRUZXh0TWF0cml4LCBudW1BcmdzOiA2LCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0W1wiVCpcIl0gPSB7IGlkOiBPUFMubmV4dExpbmUsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuVGogPSB7IGlkOiBPUFMuc2hvd1RleHQsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuVEogPSB7IGlkOiBPUFMuc2hvd1NwYWNlZFRleHQsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHRbXCInXCJdID0geyBpZDogT1BTLm5leHRMaW5lU2hvd1RleHQsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHRbJ1wiJ10gPSB7XG4gICAgICAgIGlkOiBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsXG4gICAgICAgIG51bUFyZ3M6IDMsXG4gICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICAvLyBUeXBlMyBmb250c1xuICAgICAgdC5kMCA9IHsgaWQ6IE9QUy5zZXRDaGFyV2lkdGgsIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuZDEgPSB7XG4gICAgICAgIGlkOiBPUFMuc2V0Q2hhcldpZHRoQW5kQm91bmRzLFxuICAgICAgICBudW1BcmdzOiA2LFxuICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlLFxuICAgICAgfTtcblxuICAgICAgLy8gQ29sb3JcbiAgICAgIHQuQ1MgPSB7IGlkOiBPUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZSwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5jcyA9IHsgaWQ6IE9QUy5zZXRGaWxsQ29sb3JTcGFjZSwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5TQyA9IHsgaWQ6IE9QUy5zZXRTdHJva2VDb2xvciwgbnVtQXJnczogNCwgdmFyaWFibGVBcmdzOiB0cnVlIH07XG4gICAgICB0LlNDTiA9IHsgaWQ6IE9QUy5zZXRTdHJva2VDb2xvck4sIG51bUFyZ3M6IDMzLCB2YXJpYWJsZUFyZ3M6IHRydWUgfTtcbiAgICAgIHQuc2MgPSB7IGlkOiBPUFMuc2V0RmlsbENvbG9yLCBudW1BcmdzOiA0LCB2YXJpYWJsZUFyZ3M6IHRydWUgfTtcbiAgICAgIHQuc2NuID0geyBpZDogT1BTLnNldEZpbGxDb2xvck4sIG51bUFyZ3M6IDMzLCB2YXJpYWJsZUFyZ3M6IHRydWUgfTtcbiAgICAgIHQuRyA9IHsgaWQ6IE9QUy5zZXRTdHJva2VHcmF5LCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LmcgPSB7IGlkOiBPUFMuc2V0RmlsbEdyYXksIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuUkcgPSB7IGlkOiBPUFMuc2V0U3Ryb2tlUkdCQ29sb3IsIG51bUFyZ3M6IDMsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQucmcgPSB7IGlkOiBPUFMuc2V0RmlsbFJHQkNvbG9yLCBudW1BcmdzOiAzLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LksgPSB7IGlkOiBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLCBudW1BcmdzOiA0LCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LmsgPSB7IGlkOiBPUFMuc2V0RmlsbENNWUtDb2xvciwgbnVtQXJnczogNCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuXG4gICAgICAvLyBTaGFkaW5nXG4gICAgICB0LnNoID0geyBpZDogT1BTLnNoYWRpbmdGaWxsLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG5cbiAgICAgIC8vIEltYWdlc1xuICAgICAgdC5CSSA9IHsgaWQ6IE9QUy5iZWdpbklubGluZUltYWdlLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LklEID0geyBpZDogT1BTLmJlZ2luSW1hZ2VEYXRhLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LkVJID0geyBpZDogT1BTLmVuZElubGluZUltYWdlLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG5cbiAgICAgIC8vIFhPYmplY3RzXG4gICAgICB0LkRvID0geyBpZDogT1BTLnBhaW50WE9iamVjdCwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5NUCA9IHsgaWQ6IE9QUy5tYXJrUG9pbnQsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuRFAgPSB7IGlkOiBPUFMubWFya1BvaW50UHJvcHMsIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuQk1DID0geyBpZDogT1BTLmJlZ2luTWFya2VkQ29udGVudCwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5CREMgPSB7XG4gICAgICAgIGlkOiBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsXG4gICAgICAgIG51bUFyZ3M6IDIsXG4gICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UsXG4gICAgICB9O1xuICAgICAgdC5FTUMgPSB7IGlkOiBPUFMuZW5kTWFya2VkQ29udGVudCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuXG4gICAgICAvLyBDb21wYXRpYmlsaXR5XG4gICAgICB0LkJYID0geyBpZDogT1BTLmJlZ2luQ29tcGF0LCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LkVYID0geyBpZDogT1BTLmVuZENvbXBhdCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuXG4gICAgICAvLyAocmVzZXJ2ZWQgcGFydGlhbCBjb21tYW5kcyBmb3IgdGhlIGxleGVyKVxuICAgICAgdC5CTSA9IG51bGw7XG4gICAgICB0LkJEID0gbnVsbDtcbiAgICAgIHQudHJ1ZSA9IG51bGw7XG4gICAgICB0LmZhID0gbnVsbDtcbiAgICAgIHQuZmFsID0gbnVsbDtcbiAgICAgIHQuZmFscyA9IG51bGw7XG4gICAgICB0LmZhbHNlID0gbnVsbDtcbiAgICAgIHQubnUgPSBudWxsO1xuICAgICAgdC5udWwgPSBudWxsO1xuICAgICAgdC5udWxsID0gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJvcE1hcFwiLCBnZXRPUE1hcCgpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTUFYX0lOVkFMSURfUEFUSF9PUFMoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIk1BWF9JTlZBTElEX1BBVEhfT1BTXCIsIDIwKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKSB7XG4gICAgLy8gVE9ETyhtZHVhbik6IHBhc3MgYXJyYXkgb2Yga25vd25Db21tYW5kcyByYXRoZXIgdGhhbiB0aGlzLm9wTWFwXG4gICAgLy8gZGljdGlvbmFyeVxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcih7XG4gICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSwgRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSxcbiAgICAgIHhyZWYsXG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZU1hbmFnZXIgPSBzdGF0ZU1hbmFnZXI7XG4gICAgdGhpcy5ub25Qcm9jZXNzZWRBcmdzID0gW107XG4gICAgdGhpcy5fbnVtSW52YWxpZFBhdGhPUFMgPSAwO1xuICB9XG5cbiAgZ2V0IHNhdmVkU3RhdGVzRGVwdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVNYW5hZ2VyLnN0YXRlU3RhY2subGVuZ3RoO1xuICB9XG5cbiAgLy8gfG9wZXJhdGlvbnwgaXMgYW4gb2JqZWN0IHdpdGggdHdvIGZpZWxkczpcbiAgLy9cbiAgLy8gLSB8Zm58IGlzIGFuIG91dCBwYXJhbS5cbiAgLy9cbiAgLy8gLSB8YXJnc3wgaXMgYW4gaW5vdXQgcGFyYW0uIE9uIGVudHJ5LCBpdCBzaG91bGQgaGF2ZSBvbmUgb2YgdHdvIHZhbHVlcy5cbiAgLy9cbiAgLy8gICAtIEFuIGVtcHR5IGFycmF5LiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjYWxsZXIgaXMgcHJvdmlkaW5nIHRoZVxuICAvLyAgICAgYXJyYXkgaW4gd2hpY2ggdGhlIGFyZ3Mgd2lsbCBiZSBzdG9yZWQgaW4uIFRoZSBjYWxsZXIgc2hvdWxkIHVzZVxuICAvLyAgICAgdGhpcyB2YWx1ZSBpZiBpdCBjYW4gcmV1c2UgYSBzaW5nbGUgYXJyYXkgZm9yIGVhY2ggY2FsbCB0byByZWFkKCkuXG4gIC8vXG4gIC8vICAgLSB8bnVsbHwuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxlciBuZWVkcyB0aGlzIGZ1bmN0aW9uIHRvIGNyZWF0ZVxuICAvLyAgICAgdGhlIGFycmF5IGluIHdoaWNoIGFueSBhcmdzIGFyZSBzdG9yZWQgaW4uIElmIHRoZXJlIGFyZSB6ZXJvIGFyZ3MsXG4gIC8vICAgICB0aGlzIGZ1bmN0aW9uIHdpbGwgbGVhdmUgfG9wZXJhdGlvbi5hcmdzfCBhcyB8bnVsbHwgKHRodXMgYXZvaWRpbmdcbiAgLy8gICAgIGFsbG9jYXRpb25zIHRoYXQgd291bGQgb2NjdXIgaWYgd2UgdXNlZCBhbiBlbXB0eSBhcnJheSB0byByZXByZXNlbnRcbiAgLy8gICAgIHplcm8gYXJndW1lbnRzKS4gT3RoZXJ3aXNlLCBpdCB3aWxsIHJlcGxhY2UgfG51bGx8IHdpdGggYSBuZXcgYXJyYXlcbiAgLy8gICAgIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cy4gVGhlIGNhbGxlciBzaG91bGQgdXNlIHRoaXMgdmFsdWUgaWYgaXRcbiAgLy8gICAgIGNhbm5vdCByZXVzZSBhbiBhcnJheSBmb3IgZWFjaCBjYWxsIHRvIHJlYWQoKS5cbiAgLy9cbiAgLy8gVGhlc2UgdHdvIG1vZGVzIGFyZSBwcmVzZW50IGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IGhvdCBhbmQgc29cbiAgLy8gYXZvaWRpbmcgYWxsb2NhdGlvbnMgd2hlcmUgcG9zc2libGUgaXMgd29ydGh3aGlsZS5cbiAgLy9cbiAgcmVhZChvcGVyYXRpb24pIHtcbiAgICB2YXIgYXJncyA9IG9wZXJhdGlvbi5hcmdzO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgb2JqID0gdGhpcy5wYXJzZXIuZ2V0T2JqKCk7XG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ21kKSB7XG4gICAgICAgIHZhciBjbWQgPSBvYmouY21kO1xuICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGlzIHZhbGlkXG4gICAgICAgIHZhciBvcFNwZWMgPSBFdmFsdWF0b3JQcmVwcm9jZXNzb3Iub3BNYXBbY21kXTtcbiAgICAgICAgaWYgKCFvcFNwZWMpIHtcbiAgICAgICAgICB3YXJuKGBVbmtub3duIGNvbW1hbmQgXCIke2NtZH1cIi5gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbiA9IG9wU3BlYy5pZDtcbiAgICAgICAgdmFyIG51bUFyZ3MgPSBvcFNwZWMubnVtQXJncztcbiAgICAgICAgdmFyIGFyZ3NMZW5ndGggPSBhcmdzICE9PSBudWxsID8gYXJncy5sZW5ndGggOiAwO1xuXG4gICAgICAgIGlmICghb3BTcGVjLnZhcmlhYmxlQXJncykge1xuICAgICAgICAgIC8vIFBvc3RzY3JpcHQgY29tbWFuZHMgY2FuIGJlIG5lc3RlZCwgZS5nLiAvRjIgL0dTMiBncyA1LjcxMSBUZlxuICAgICAgICAgIGlmIChhcmdzTGVuZ3RoICE9PSBudW1BcmdzKSB7XG4gICAgICAgICAgICB2YXIgbm9uUHJvY2Vzc2VkQXJncyA9IHRoaXMubm9uUHJvY2Vzc2VkQXJncztcbiAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoID4gbnVtQXJncykge1xuICAgICAgICAgICAgICBub25Qcm9jZXNzZWRBcmdzLnB1c2goYXJncy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgYXJnc0xlbmd0aC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGggPCBudW1BcmdzICYmIG5vblByb2Nlc3NlZEFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGFyZ3MudW5zaGlmdChub25Qcm9jZXNzZWRBcmdzLnBvcCgpKTtcbiAgICAgICAgICAgICAgYXJnc0xlbmd0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhcmdzTGVuZ3RoIDwgbnVtQXJncykge1xuICAgICAgICAgICAgY29uc3QgcGFydGlhbE1zZyA9XG4gICAgICAgICAgICAgIGBjb21tYW5kICR7Y21kfTogZXhwZWN0ZWQgJHtudW1BcmdzfSBhcmdzLCBgICtcbiAgICAgICAgICAgICAgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYDtcblxuICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBwYXRoIG9wZXJhdG9ycywgaW4gcGFydGljdWxhciwgY2FuIHJlc3VsdCBpbiBmYWlybHlcbiAgICAgICAgICAgIC8vIGNoYW90aWMgcmVuZGVyaW5nIGFydGlmYWN0cy4gSGVuY2UgdGhlIGZvbGxvd2luZyBoZXVyaXN0aWNzIGlzXG4gICAgICAgICAgICAvLyB1c2VkIHRvIGVycm9yLCByYXRoZXIgdGhhbiBqdXN0IHdhcm4sIG9uY2UgYSBudW1iZXIgb2YgaW52YWxpZFxuICAgICAgICAgICAgLy8gcGF0aCBvcGVyYXRvcnMgaGF2ZSBiZWVuIGVuY291bnRlcmVkIChmaXhlcyBidWcxNDQzMTQwLnBkZikuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZuID49IE9QUy5tb3ZlVG8gJiZcbiAgICAgICAgICAgICAgZm4gPD0gT1BTLmVuZFBhdGggJiYgLy8gUGF0aCBvcGVyYXRvclxuICAgICAgICAgICAgICArK3RoaXMuX251bUludmFsaWRQYXRoT1BTID5cbiAgICAgICAgICAgICAgICBFdmFsdWF0b3JQcmVwcm9jZXNzb3IuTUFYX0lOVkFMSURfUEFUSF9PUFNcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgJHtwYXJ0aWFsTXNnfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2UgcmVjZWl2ZSB0b28gZmV3IGFyZ3VtZW50cywgaXQncyBub3QgcG9zc2libGUgdG8gZXhlY3V0ZVxuICAgICAgICAgICAgLy8gdGhlIGNvbW1hbmQsIGhlbmNlIHdlIHNraXAgdGhlIGNvbW1hbmQuXG4gICAgICAgICAgICB3YXJuKGBTa2lwcGluZyAke3BhcnRpYWxNc2d9YCk7XG4gICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJnc0xlbmd0aCA+IG51bUFyZ3MpIHtcbiAgICAgICAgICBpbmZvKFxuICAgICAgICAgICAgYENvbW1hbmQgJHtjbWR9OiBleHBlY3RlZCBbMCwgJHtudW1BcmdzfV0gYXJncywgYCArXG4gICAgICAgICAgICAgIGBidXQgcmVjZWl2ZWQgJHthcmdzTGVuZ3RofSBhcmdzLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETyBmaWd1cmUgb3V0IGhvdyB0byB0eXBlLWNoZWNrIHZhcmFyZyBmdW5jdGlvbnNcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncyk7XG5cbiAgICAgICAgb3BlcmF0aW9uLmZuID0gZm47XG4gICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJncztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob2JqID09PSBFT0YpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBtb3JlIGNvbW1hbmRzXG4gICAgICB9XG4gICAgICAvLyBhcmd1bWVudFxuICAgICAgaWYgKG9iaiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoYXJncyA9PT0gbnVsbCkge1xuICAgICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBhcmdzLnB1c2gob2JqKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMzMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJUb28gbWFueSBhcmd1bWVudHNcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncykge1xuICAgIHN3aXRjaCAoZm4gfCAwKSB7XG4gICAgICBjYXNlIE9QUy5zYXZlOlxuICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPUFMucmVzdG9yZTpcbiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIucmVzdG9yZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT1BTLnRyYW5zZm9ybTpcbiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIudHJhbnNmb3JtKGFyZ3MpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGFydGlhbEV2YWx1YXRvciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIENNYXBDb21wcmVzc2lvblR5cGUsXG4gIEZvcm1hdEVycm9yLFxuICBpc1N0cmluZyxcbiAgdW5yZWFjaGFibGUsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgaXNDbWQsIGlzRU9GLCBpc05hbWUsIGlzU3RyZWFtIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgTGV4ZXIgfSBmcm9tIFwiLi9wYXJzZXIuanNcIjtcbmltcG9ydCB7IE1pc3NpbmdEYXRhRXhjZXB0aW9uIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5cbnZhciBCVUlMVF9JTl9DTUFQUyA9IFtcbiAgLy8gPDwgU3RhcnQgdW5pY29kZSBtYXBzLlxuICBcIkFkb2JlLUdCMS1VQ1MyXCIsXG4gIFwiQWRvYmUtQ05TMS1VQ1MyXCIsXG4gIFwiQWRvYmUtSmFwYW4xLVVDUzJcIixcbiAgXCJBZG9iZS1Lb3JlYTEtVUNTMlwiLFxuICAvLyA+PiBFbmQgdW5pY29kZSBtYXBzLlxuICBcIjc4LUVVQy1IXCIsXG4gIFwiNzgtRVVDLVZcIixcbiAgXCI3OC1IXCIsXG4gIFwiNzgtUktTSi1IXCIsXG4gIFwiNzgtUktTSi1WXCIsXG4gIFwiNzgtVlwiLFxuICBcIjc4bXMtUktTSi1IXCIsXG4gIFwiNzhtcy1SS1NKLVZcIixcbiAgXCI4M3B2LVJLU0otSFwiLFxuICBcIjkwbXMtUktTSi1IXCIsXG4gIFwiOTBtcy1SS1NKLVZcIixcbiAgXCI5MG1zcC1SS1NKLUhcIixcbiAgXCI5MG1zcC1SS1NKLVZcIixcbiAgXCI5MHB2LVJLU0otSFwiLFxuICBcIjkwcHYtUktTSi1WXCIsXG4gIFwiQWRkLUhcIixcbiAgXCJBZGQtUktTSi1IXCIsXG4gIFwiQWRkLVJLU0otVlwiLFxuICBcIkFkZC1WXCIsXG4gIFwiQWRvYmUtQ05TMS0wXCIsXG4gIFwiQWRvYmUtQ05TMS0xXCIsXG4gIFwiQWRvYmUtQ05TMS0yXCIsXG4gIFwiQWRvYmUtQ05TMS0zXCIsXG4gIFwiQWRvYmUtQ05TMS00XCIsXG4gIFwiQWRvYmUtQ05TMS01XCIsXG4gIFwiQWRvYmUtQ05TMS02XCIsXG4gIFwiQWRvYmUtR0IxLTBcIixcbiAgXCJBZG9iZS1HQjEtMVwiLFxuICBcIkFkb2JlLUdCMS0yXCIsXG4gIFwiQWRvYmUtR0IxLTNcIixcbiAgXCJBZG9iZS1HQjEtNFwiLFxuICBcIkFkb2JlLUdCMS01XCIsXG4gIFwiQWRvYmUtSmFwYW4xLTBcIixcbiAgXCJBZG9iZS1KYXBhbjEtMVwiLFxuICBcIkFkb2JlLUphcGFuMS0yXCIsXG4gIFwiQWRvYmUtSmFwYW4xLTNcIixcbiAgXCJBZG9iZS1KYXBhbjEtNFwiLFxuICBcIkFkb2JlLUphcGFuMS01XCIsXG4gIFwiQWRvYmUtSmFwYW4xLTZcIixcbiAgXCJBZG9iZS1Lb3JlYTEtMFwiLFxuICBcIkFkb2JlLUtvcmVhMS0xXCIsXG4gIFwiQWRvYmUtS29yZWExLTJcIixcbiAgXCJCNS1IXCIsXG4gIFwiQjUtVlwiLFxuICBcIkI1cGMtSFwiLFxuICBcIkI1cGMtVlwiLFxuICBcIkNOUy1FVUMtSFwiLFxuICBcIkNOUy1FVUMtVlwiLFxuICBcIkNOUzEtSFwiLFxuICBcIkNOUzEtVlwiLFxuICBcIkNOUzItSFwiLFxuICBcIkNOUzItVlwiLFxuICBcIkVUSEstQjUtSFwiLFxuICBcIkVUSEstQjUtVlwiLFxuICBcIkVUZW4tQjUtSFwiLFxuICBcIkVUZW4tQjUtVlwiLFxuICBcIkVUZW5tcy1CNS1IXCIsXG4gIFwiRVRlbm1zLUI1LVZcIixcbiAgXCJFVUMtSFwiLFxuICBcIkVVQy1WXCIsXG4gIFwiRXh0LUhcIixcbiAgXCJFeHQtUktTSi1IXCIsXG4gIFwiRXh0LVJLU0otVlwiLFxuICBcIkV4dC1WXCIsXG4gIFwiR0ItRVVDLUhcIixcbiAgXCJHQi1FVUMtVlwiLFxuICBcIkdCLUhcIixcbiAgXCJHQi1WXCIsXG4gIFwiR0JLLUVVQy1IXCIsXG4gIFwiR0JLLUVVQy1WXCIsXG4gIFwiR0JLMkstSFwiLFxuICBcIkdCSzJLLVZcIixcbiAgXCJHQktwLUVVQy1IXCIsXG4gIFwiR0JLcC1FVUMtVlwiLFxuICBcIkdCVC1FVUMtSFwiLFxuICBcIkdCVC1FVUMtVlwiLFxuICBcIkdCVC1IXCIsXG4gIFwiR0JULVZcIixcbiAgXCJHQlRwYy1FVUMtSFwiLFxuICBcIkdCVHBjLUVVQy1WXCIsXG4gIFwiR0JwYy1FVUMtSFwiLFxuICBcIkdCcGMtRVVDLVZcIixcbiAgXCJIXCIsXG4gIFwiSEtkbGEtQjUtSFwiLFxuICBcIkhLZGxhLUI1LVZcIixcbiAgXCJIS2RsYi1CNS1IXCIsXG4gIFwiSEtkbGItQjUtVlwiLFxuICBcIkhLZ2Njcy1CNS1IXCIsXG4gIFwiSEtnY2NzLUI1LVZcIixcbiAgXCJIS20zMTQtQjUtSFwiLFxuICBcIkhLbTMxNC1CNS1WXCIsXG4gIFwiSEttNDcxLUI1LUhcIixcbiAgXCJIS200NzEtQjUtVlwiLFxuICBcIkhLc2NzLUI1LUhcIixcbiAgXCJIS3Njcy1CNS1WXCIsXG4gIFwiSGFua2FrdVwiLFxuICBcIkhpcmFnYW5hXCIsXG4gIFwiS1NDLUVVQy1IXCIsXG4gIFwiS1NDLUVVQy1WXCIsXG4gIFwiS1NDLUhcIixcbiAgXCJLU0MtSm9oYWItSFwiLFxuICBcIktTQy1Kb2hhYi1WXCIsXG4gIFwiS1NDLVZcIixcbiAgXCJLU0Ntcy1VSEMtSFwiLFxuICBcIktTQ21zLVVIQy1IVy1IXCIsXG4gIFwiS1NDbXMtVUhDLUhXLVZcIixcbiAgXCJLU0Ntcy1VSEMtVlwiLFxuICBcIktTQ3BjLUVVQy1IXCIsXG4gIFwiS1NDcGMtRVVDLVZcIixcbiAgXCJLYXRha2FuYVwiLFxuICBcIk5XUC1IXCIsXG4gIFwiTldQLVZcIixcbiAgXCJSS1NKLUhcIixcbiAgXCJSS1NKLVZcIixcbiAgXCJSb21hblwiLFxuICBcIlVuaUNOUy1VQ1MyLUhcIixcbiAgXCJVbmlDTlMtVUNTMi1WXCIsXG4gIFwiVW5pQ05TLVVURjE2LUhcIixcbiAgXCJVbmlDTlMtVVRGMTYtVlwiLFxuICBcIlVuaUNOUy1VVEYzMi1IXCIsXG4gIFwiVW5pQ05TLVVURjMyLVZcIixcbiAgXCJVbmlDTlMtVVRGOC1IXCIsXG4gIFwiVW5pQ05TLVVURjgtVlwiLFxuICBcIlVuaUdCLVVDUzItSFwiLFxuICBcIlVuaUdCLVVDUzItVlwiLFxuICBcIlVuaUdCLVVURjE2LUhcIixcbiAgXCJVbmlHQi1VVEYxNi1WXCIsXG4gIFwiVW5pR0ItVVRGMzItSFwiLFxuICBcIlVuaUdCLVVURjMyLVZcIixcbiAgXCJVbmlHQi1VVEY4LUhcIixcbiAgXCJVbmlHQi1VVEY4LVZcIixcbiAgXCJVbmlKSVMtVUNTMi1IXCIsXG4gIFwiVW5pSklTLVVDUzItSFctSFwiLFxuICBcIlVuaUpJUy1VQ1MyLUhXLVZcIixcbiAgXCJVbmlKSVMtVUNTMi1WXCIsXG4gIFwiVW5pSklTLVVURjE2LUhcIixcbiAgXCJVbmlKSVMtVVRGMTYtVlwiLFxuICBcIlVuaUpJUy1VVEYzMi1IXCIsXG4gIFwiVW5pSklTLVVURjMyLVZcIixcbiAgXCJVbmlKSVMtVVRGOC1IXCIsXG4gIFwiVW5pSklTLVVURjgtVlwiLFxuICBcIlVuaUpJUzIwMDQtVVRGMTYtSFwiLFxuICBcIlVuaUpJUzIwMDQtVVRGMTYtVlwiLFxuICBcIlVuaUpJUzIwMDQtVVRGMzItSFwiLFxuICBcIlVuaUpJUzIwMDQtVVRGMzItVlwiLFxuICBcIlVuaUpJUzIwMDQtVVRGOC1IXCIsXG4gIFwiVW5pSklTMjAwNC1VVEY4LVZcIixcbiAgXCJVbmlKSVNQcm8tVUNTMi1IVy1WXCIsXG4gIFwiVW5pSklTUHJvLVVDUzItVlwiLFxuICBcIlVuaUpJU1Byby1VVEY4LVZcIixcbiAgXCJVbmlKSVNYMDIxMy1VVEYzMi1IXCIsXG4gIFwiVW5pSklTWDAyMTMtVVRGMzItVlwiLFxuICBcIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1IXCIsXG4gIFwiVW5pSklTWDAyMTMyMDA0LVVURjMyLVZcIixcbiAgXCJVbmlLUy1VQ1MyLUhcIixcbiAgXCJVbmlLUy1VQ1MyLVZcIixcbiAgXCJVbmlLUy1VVEYxNi1IXCIsXG4gIFwiVW5pS1MtVVRGMTYtVlwiLFxuICBcIlVuaUtTLVVURjMyLUhcIixcbiAgXCJVbmlLUy1VVEYzMi1WXCIsXG4gIFwiVW5pS1MtVVRGOC1IXCIsXG4gIFwiVW5pS1MtVVRGOC1WXCIsXG4gIFwiVlwiLFxuICBcIldQLVN5bWJvbFwiLFxuXTtcblxuLy8gSGV1cmlzdGljIHRvIGF2b2lkIGhhbmdpbmcgdGhlIHdvcmtlci10aHJlYWQgZm9yIENNYXAgZGF0YSB3aXRoIHJpZGljdWxvdXNseVxuLy8gbGFyZ2UgcmFuZ2VzLCBzdWNoIGFzIGUuZy4gMHhGRkZGRkZGRiAoZml4ZXMgaXNzdWUxMTkyMl9yZWR1Y2VkLnBkZikuXG5jb25zdCBNQVhfTUFQX1JBTkdFID0gMiAqKiAyNCAtIDE7IC8vID0gMHhGRkZGRkZcblxuLy8gQ01hcCwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggVHJ1ZVR5cGUncyBjbWFwLlxuY2xhc3MgQ01hcCB7XG4gIGNvbnN0cnVjdG9yKGJ1aWx0SW5DTWFwID0gZmFsc2UpIHtcbiAgICAvLyBDb2Rlc3BhY2UgcmFuZ2VzIGFyZSBzdG9yZWQgYXMgZm9sbG93czpcbiAgICAvLyBbWzFCeXRlUGFpcnNdLCBbMkJ5dGVQYWlyc10sIFszQnl0ZVBhaXJzXSwgWzRCeXRlUGFpcnNdXVxuICAgIC8vIHdoZXJlIG5CeXRlUGFpcnMgYXJlIHJhbmdlcyBlLmcuIFtsb3cxLCBoaWdoMSwgbG93MiwgaGlnaDIsIC4uLl1cbiAgICB0aGlzLmNvZGVzcGFjZVJhbmdlcyA9IFtbXSwgW10sIFtdLCBbXV07XG4gICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMgPSAwO1xuICAgIC8vIE1hcCBlbnRyaWVzIGhhdmUgb25lIG9mIHR3byBmb3Jtcy5cbiAgICAvLyAtIGNpZCBjaGFycyBhcmUgMTYtYml0IHVuc2lnbmVkIGludGVnZXJzLCBzdG9yZWQgYXMgaW50ZWdlcnMuXG4gICAgLy8gLSBiZiBjaGFycyBhcmUgdmFyaWFibGUtbGVuZ3RoIGJ5dGUgc2VxdWVuY2VzLCBzdG9yZWQgYXMgc3RyaW5ncywgd2l0aFxuICAgIC8vICAgb25lIGJ5dGUgcGVyIGNoYXJhY3Rlci5cbiAgICB0aGlzLl9tYXAgPSBbXTtcbiAgICB0aGlzLm5hbWUgPSBcIlwiO1xuICAgIHRoaXMudmVydGljYWwgPSBmYWxzZTtcbiAgICB0aGlzLnVzZUNNYXAgPSBudWxsO1xuICAgIHRoaXMuYnVpbHRJbkNNYXAgPSBidWlsdEluQ01hcDtcbiAgfVxuXG4gIGFkZENvZGVzcGFjZVJhbmdlKG4sIGxvdywgaGlnaCkge1xuICAgIHRoaXMuY29kZXNwYWNlUmFuZ2VzW24gLSAxXS5wdXNoKGxvdywgaGlnaCk7XG4gICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMrKztcbiAgfVxuXG4gIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7XG4gICAgaWYgKGhpZ2ggLSBsb3cgPiBNQVhfTUFQX1JBTkdFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtYXBDaWRSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS5cIik7XG4gICAgfVxuICAgIHdoaWxlIChsb3cgPD0gaGlnaCkge1xuICAgICAgdGhpcy5fbWFwW2xvdysrXSA9IGRzdExvdysrO1xuICAgIH1cbiAgfVxuXG4gIG1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHtcbiAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1hcEJmUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuXCIpO1xuICAgIH1cbiAgICB2YXIgbGFzdEJ5dGUgPSBkc3RMb3cubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3c7XG4gICAgICAvLyBPbmx5IHRoZSBsYXN0IGJ5dGUgaGFzIHRvIGJlIGluY3JlbWVudGVkLlxuICAgICAgZHN0TG93ID1cbiAgICAgICAgZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSkgK1xuICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGRzdExvdy5jaGFyQ29kZUF0KGxhc3RCeXRlKSArIDEpO1xuICAgIH1cbiAgfVxuXG4gIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHtcbiAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLlwiKTtcbiAgICB9XG4gICAgY29uc3QgaWkgPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChsb3cgPD0gaGlnaCAmJiBpIDwgaWkpIHtcbiAgICAgIHRoaXMuX21hcFtsb3ddID0gYXJyYXlbaSsrXTtcbiAgICAgICsrbG93O1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoaXMgaXMgdXNlZCBmb3IgYm90aCBiZiBhbmQgY2lkIGNoYXJzLlxuICBtYXBPbmUoc3JjLCBkc3QpIHtcbiAgICB0aGlzLl9tYXBbc3JjXSA9IGRzdDtcbiAgfVxuXG4gIGxvb2t1cChjb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcFtjb2RlXTtcbiAgfVxuXG4gIGNvbnRhaW5zKGNvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgLy8gTW9zdCBtYXBzIGhhdmUgZmV3ZXIgdGhhbiA2NTUzNiBlbnRyaWVzLCBhbmQgZm9yIHRob3NlIHdlIHVzZSBub3JtYWxcbiAgICAvLyBhcnJheSBpdGVyYXRpb24uIEJ1dCByZWFsbHkgc3BhcnNlIHRhYmxlcyBhcmUgcG9zc2libGUgLS0gZS5nLiB3aXRoXG4gICAgLy8gaW5kaWNlcyBpbiB0aGUgKmJpbGxpb25zKi4gRm9yIHN1Y2ggdGFibGVzIHdlIHVzZSBmb3IuLmluLCB3aGljaCBpc24ndFxuICAgIC8vIGlkZWFsIGJlY2F1c2UgaXQgc3RyaW5naWZpZXMgdGhlIGluZGljZXMgZm9yIGFsbCBwcmVzZW50IGVsZW1lbnRzLCBidXRcbiAgICAvLyBpdCBkb2VzIGF2b2lkIGl0ZXJhdGluZyBvdmVyIGV2ZXJ5IHVuZGVmaW5lZCBlbnRyeS5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgY29uc3QgbGVuZ3RoID0gbWFwLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDw9IDB4MTAwMDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG1hcFtpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGkgaW4gbWFwKSB7XG4gICAgICAgIGNhbGxiYWNrKGksIG1hcFtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hhckNvZGVPZih2YWx1ZSkge1xuICAgIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgaXMgKmV4dHJlbWVseSogaW5lZmZpY2llbnQgZm9yIGFycmF5cyB3aGljaFxuICAgIC8vIGFyZSBib3RoIHZlcnkgc3BhcnNlIGFuZCB2ZXJ5IGxhcmdlIChzZWUgaXNzdWU4MzcyLnBkZikuXG4gICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgIGlmIChtYXAubGVuZ3RoIDw9IDB4MTAwMDApIHtcbiAgICAgIHJldHVybiBtYXAuaW5kZXhPZih2YWx1ZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7XG4gICAgICBpZiAobWFwW2NoYXJDb2RlXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJDb2RlIHwgMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZ2V0TWFwKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXA7XG4gIH1cblxuICByZWFkQ2hhckNvZGUoc3RyLCBvZmZzZXQsIG91dCkge1xuICAgIGxldCBjID0gMDtcbiAgICBjb25zdCBjb2Rlc3BhY2VSYW5nZXMgPSB0aGlzLmNvZGVzcGFjZVJhbmdlcztcbiAgICAvLyA5LjcuNi4yIENNYXAgTWFwcGluZ1xuICAgIC8vIFRoZSBjb2RlIGxlbmd0aCBpcyBhdCBtb3N0IDQuXG4gICAgZm9yIChsZXQgbiA9IDAsIG5uID0gY29kZXNwYWNlUmFuZ2VzLmxlbmd0aDsgbiA8IG5uOyBuKyspIHtcbiAgICAgIGMgPSAoKGMgPDwgOCkgfCBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyBuKSkgPj4+IDA7XG4gICAgICAvLyBDaGVjayBlYWNoIGNvZGVzcGFjZSByYW5nZSB0byBzZWUgaWYgaXQgZmFsbHMgd2l0aGluLlxuICAgICAgY29uc3QgY29kZXNwYWNlUmFuZ2UgPSBjb2Rlc3BhY2VSYW5nZXNbbl07XG4gICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazsgKSB7XG4gICAgICAgIGNvbnN0IGxvdyA9IGNvZGVzcGFjZVJhbmdlW2srK107XG4gICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdO1xuICAgICAgICBpZiAoYyA+PSBsb3cgJiYgYyA8PSBoaWdoKSB7XG4gICAgICAgICAgb3V0LmNoYXJjb2RlID0gYztcbiAgICAgICAgICBvdXQubGVuZ3RoID0gbiArIDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG91dC5jaGFyY29kZSA9IDA7XG4gICAgb3V0Lmxlbmd0aCA9IDE7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXAubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGlzSWRlbnRpdHlDTWFwKCkge1xuICAgIGlmICghKHRoaXMubmFtZSA9PT0gXCJJZGVudGl0eS1IXCIgfHwgdGhpcy5uYW1lID09PSBcIklkZW50aXR5LVZcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21hcC5sZW5ndGggIT09IDB4MTAwMDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAweDEwMDAwOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl9tYXBbaV0gIT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBBIHNwZWNpYWwgY2FzZSBvZiBDTWFwLCB3aGVyZSB0aGUgX21hcCBhcnJheSBpbXBsaWNpdGx5IGhhcyBhIGxlbmd0aCBvZlxuLy8gNjU1MzYgYW5kIGVhY2ggZWxlbWVudCBpcyBlcXVhbCB0byBpdHMgaW5kZXguXG5jbGFzcyBJZGVudGl0eUNNYXAgZXh0ZW5kcyBDTWFwIHtcbiAgY29uc3RydWN0b3IodmVydGljYWwsIG4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy52ZXJ0aWNhbCA9IHZlcnRpY2FsO1xuICAgIHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UobiwgMCwgMHhmZmZmKTtcbiAgfVxuXG4gIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7XG4gICAgdW5yZWFjaGFibGUoXCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2VcIik7XG4gIH1cblxuICBtYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7XG4gICAgdW5yZWFjaGFibGUoXCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZVwiKTtcbiAgfVxuXG4gIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHtcbiAgICB1bnJlYWNoYWJsZShcInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlVG9BcnJheVwiKTtcbiAgfVxuXG4gIG1hcE9uZShzcmMsIGRzdCkge1xuICAgIHVucmVhY2hhYmxlKFwic2hvdWxkIG5vdCBjYWxsIG1hcENpZE9uZVwiKTtcbiAgfVxuXG4gIGxvb2t1cChjb2RlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29kZSkgJiYgY29kZSA8PSAweGZmZmYgPyBjb2RlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgY29udGFpbnMoY29kZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpICYmIGNvZGUgPD0gMHhmZmZmO1xuICB9XG5cbiAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKSB7XG4gICAgICBjYWxsYmFjayhpLCBpKTtcbiAgICB9XG4gIH1cblxuICBjaGFyQ29kZU9mKHZhbHVlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlIDw9IDB4ZmZmZiA/IHZhbHVlIDogLTE7XG4gIH1cblxuICBnZXRNYXAoKSB7XG4gICAgLy8gU29tZXRpbWVzIGlkZW50aXR5IG1hcHMgbXVzdCBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBpdCdzIHJhcmUuXG4gICAgY29uc3QgbWFwID0gbmV3IEFycmF5KDB4MTAwMDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKSB7XG4gICAgICBtYXBbaV0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gMHgxMDAwMDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnZXR0ZXItcmV0dXJuXG4gIGdldCBpc0lkZW50aXR5Q01hcCgpIHtcbiAgICB1bnJlYWNoYWJsZShcInNob3VsZCBub3QgYWNjZXNzIC5pc0lkZW50aXR5Q01hcFwiKTtcbiAgfVxufVxuXG52YXIgQmluYXJ5Q01hcFJlYWRlciA9IChmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gaGV4VG9JbnQoYSwgc2l6ZSkge1xuICAgIHZhciBuID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzaXplOyBpKyspIHtcbiAgICAgIG4gPSAobiA8PCA4KSB8IGFbaV07XG4gICAgfVxuICAgIHJldHVybiBuID4+PiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gaGV4VG9TdHIoYSwgc2l6ZSkge1xuICAgIC8vIFRoaXMgY29kZSBpcyBob3QuIFNwZWNpYWwtY2FzZSBzb21lIGNvbW1vbiB2YWx1ZXMgdG8gYXZvaWQgY3JlYXRpbmcgYW5cbiAgICAvLyBvYmplY3Qgd2l0aCBzdWJhcnJheSgpLlxuICAgIGlmIChzaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgaWYgKHNpemUgPT09IDMpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRIZXgoYSwgYiwgc2l6ZSkge1xuICAgIHZhciBjID0gMDtcbiAgICBmb3IgKHZhciBpID0gc2l6ZTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGMgKz0gYVtpXSArIGJbaV07XG4gICAgICBhW2ldID0gYyAmIDI1NTtcbiAgICAgIGMgPj49IDg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5jSGV4KGEsIHNpemUpIHtcbiAgICB2YXIgYyA9IDE7XG4gICAgZm9yICh2YXIgaSA9IHNpemU7IGkgPj0gMCAmJiBjID4gMDsgaS0tKSB7XG4gICAgICBjICs9IGFbaV07XG4gICAgICBhW2ldID0gYyAmIDI1NTtcbiAgICAgIGMgPj49IDg7XG4gICAgfVxuICB9XG5cbiAgdmFyIE1BWF9OVU1fU0laRSA9IDE2O1xuICB2YXIgTUFYX0VOQ09ERURfTlVNX1NJWkUgPSAxOTsgLy8gY2VpbChNQVhfTlVNX1NJWkUgKiA3IC8gOClcblxuICBmdW5jdGlvbiBCaW5hcnlDTWFwU3RyZWFtKGRhdGEpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMuZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgdGhpcy50bXBCdWYgPSBuZXcgVWludDhBcnJheShNQVhfRU5DT0RFRF9OVU1fU0laRSk7XG4gIH1cblxuICBCaW5hcnlDTWFwU3RyZWFtLnByb3RvdHlwZSA9IHtcbiAgICByZWFkQnl0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmVuZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107XG4gICAgfSxcbiAgICByZWFkTnVtYmVyKCkge1xuICAgICAgdmFyIG4gPSAwO1xuICAgICAgdmFyIGxhc3Q7XG4gICAgICBkbyB7XG4gICAgICAgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpO1xuICAgICAgICBpZiAoYiA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJ1bmV4cGVjdGVkIEVPRiBpbiBiY21hcFwiKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gIShiICYgMHg4MCk7XG4gICAgICAgIG4gPSAobiA8PCA3KSB8IChiICYgMHg3Zik7XG4gICAgICB9IHdoaWxlICghbGFzdCk7XG4gICAgICByZXR1cm4gbjtcbiAgICB9LFxuICAgIHJlYWRTaWduZWQoKSB7XG4gICAgICB2YXIgbiA9IHRoaXMucmVhZE51bWJlcigpO1xuICAgICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7XG4gICAgfSxcbiAgICByZWFkSGV4KG51bSwgc2l6ZSkge1xuICAgICAgbnVtLnNldCh0aGlzLmJ1ZmZlci5zdWJhcnJheSh0aGlzLnBvcywgdGhpcy5wb3MgKyBzaXplICsgMSkpO1xuICAgICAgdGhpcy5wb3MgKz0gc2l6ZSArIDE7XG4gICAgfSxcbiAgICByZWFkSGV4TnVtYmVyKG51bSwgc2l6ZSkge1xuICAgICAgdmFyIGxhc3Q7XG4gICAgICB2YXIgc3RhY2sgPSB0aGlzLnRtcEJ1ZixcbiAgICAgICAgc3AgPSAwO1xuICAgICAgZG8ge1xuICAgICAgICB2YXIgYiA9IHRoaXMucmVhZEJ5dGUoKTtcbiAgICAgICAgaWYgKGIgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwidW5leHBlY3RlZCBFT0YgaW4gYmNtYXBcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9ICEoYiAmIDB4ODApO1xuICAgICAgICBzdGFja1tzcCsrXSA9IGIgJiAweDdmO1xuICAgICAgfSB3aGlsZSAoIWxhc3QpO1xuICAgICAgdmFyIGkgPSBzaXplLFxuICAgICAgICBidWZmZXIgPSAwLFxuICAgICAgICBidWZmZXJTaXplID0gMDtcbiAgICAgIHdoaWxlIChpID49IDApIHtcbiAgICAgICAgd2hpbGUgKGJ1ZmZlclNpemUgPCA4ICYmIHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBidWZmZXIgPSAoc3RhY2tbLS1zcF0gPDwgYnVmZmVyU2l6ZSkgfCBidWZmZXI7XG4gICAgICAgICAgYnVmZmVyU2l6ZSArPSA3O1xuICAgICAgICB9XG4gICAgICAgIG51bVtpXSA9IGJ1ZmZlciAmIDI1NTtcbiAgICAgICAgaS0tO1xuICAgICAgICBidWZmZXIgPj49IDg7XG4gICAgICAgIGJ1ZmZlclNpemUgLT0gODtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlYWRIZXhTaWduZWQobnVtLCBzaXplKSB7XG4gICAgICB0aGlzLnJlYWRIZXhOdW1iZXIobnVtLCBzaXplKTtcbiAgICAgIHZhciBzaWduID0gbnVtW3NpemVdICYgMSA/IDI1NSA6IDA7XG4gICAgICB2YXIgYyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzaXplOyBpKyspIHtcbiAgICAgICAgYyA9ICgoYyAmIDEpIDw8IDgpIHwgbnVtW2ldO1xuICAgICAgICBudW1baV0gPSAoYyA+PiAxKSBeIHNpZ247XG4gICAgICB9XG4gICAgfSxcbiAgICByZWFkU3RyaW5nKCkge1xuICAgICAgdmFyIGxlbiA9IHRoaXMucmVhZE51bWJlcigpO1xuICAgICAgdmFyIHMgPSBcIlwiO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5yZWFkTnVtYmVyKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBwcm9jZXNzQmluYXJ5Q01hcChkYXRhLCBjTWFwLCBleHRlbmQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHN0cmVhbSA9IG5ldyBCaW5hcnlDTWFwU3RyZWFtKGRhdGEpO1xuICAgICAgdmFyIGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuICAgICAgY01hcC52ZXJ0aWNhbCA9ICEhKGhlYWRlciAmIDEpO1xuXG4gICAgICB2YXIgdXNlQ01hcCA9IG51bGw7XG4gICAgICB2YXIgc3RhcnQgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpO1xuICAgICAgdmFyIGVuZCA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7XG4gICAgICB2YXIgY2hhciA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7XG4gICAgICB2YXIgY2hhckNvZGUgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpO1xuICAgICAgdmFyIHRtcCA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7XG4gICAgICB2YXIgY29kZTtcblxuICAgICAgdmFyIGI7XG4gICAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZEJ5dGUoKSkgPj0gMCkge1xuICAgICAgICB2YXIgdHlwZSA9IGIgPj4gNTtcbiAgICAgICAgaWYgKHR5cGUgPT09IDcpIHtcbiAgICAgICAgICAvLyBtZXRhZGF0YSwgZS5nLiBjb21tZW50IG9yIHVzZWNtYXBcbiAgICAgICAgICBzd2l0Y2ggKGIgJiAweDFmKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHN0cmVhbS5yZWFkU3RyaW5nKCk7IC8vIHNraXBwaW5nIGNvbW1lbnRcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIHVzZUNNYXAgPSBzdHJlYW0ucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlcXVlbmNlID0gISEoYiAmIDB4MTApO1xuICAgICAgICB2YXIgZGF0YVNpemUgPSBiICYgMTU7XG5cbiAgICAgICAgaWYgKGRhdGFTaXplICsgMSA+IE1BWF9OVU1fU0laRSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInByb2Nlc3NCaW5hcnlDTWFwOiBJbnZhbGlkIGRhdGFTaXplLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1Y3MyRGF0YVNpemUgPSAxO1xuICAgICAgICB2YXIgc3ViaXRlbXNDb3VudCA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIDA6IC8vIGNvZGVzcGFjZXJhbmdlXG4gICAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShcbiAgICAgICAgICAgICAgZGF0YVNpemUgKyAxLFxuICAgICAgICAgICAgICBoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLFxuICAgICAgICAgICAgICBoZXhUb0ludChlbmQsIGRhdGFTaXplKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShcbiAgICAgICAgICAgICAgICBkYXRhU2l6ZSArIDEsXG4gICAgICAgICAgICAgICAgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSxcbiAgICAgICAgICAgICAgICBoZXhUb0ludChlbmQsIGRhdGFTaXplKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOiAvLyBub3RkZWZyYW5nZVxuICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkTnVtYmVyKCk7IC8vIGNvZGVcbiAgICAgICAgICAgIC8vIHVuZGVmaW5lZCByYW5nZSwgc2tpcHBpbmdcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsgLy8gY29kZVxuICAgICAgICAgICAgICAvLyBub3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjogLy8gY2lkY2hhclxuICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhciwgZGF0YVNpemUpO1xuICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7XG4gICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpO1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBpbmNIZXgoY2hhciwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIodG1wLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgICAgYWRkSGV4KGNoYXIsIHRtcCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZFNpZ25lZCgpICsgKGNvZGUgKyAxKTtcbiAgICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgZGF0YVNpemUpLCBjb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzogLy8gY2lkcmFuZ2VcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBjb2RlID0gc3RyZWFtLnJlYWROdW1iZXIoKTtcbiAgICAgICAgICAgIGNNYXAubWFwQ2lkUmFuZ2UoXG4gICAgICAgICAgICAgIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksXG4gICAgICAgICAgICAgIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLFxuICAgICAgICAgICAgICBjb2RlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpO1xuICAgICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKFxuICAgICAgICAgICAgICAgIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksXG4gICAgICAgICAgICAgICAgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSksXG4gICAgICAgICAgICAgICAgY29kZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OiAvLyBiZmNoYXJcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpO1xuICAgICAgICAgICAgY01hcC5tYXBPbmUoXG4gICAgICAgICAgICAgIGhleFRvSW50KGNoYXIsIHVjczJEYXRhU2l6ZSksXG4gICAgICAgICAgICAgIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGluY0hleChjaGFyLCB1Y3MyRGF0YVNpemUpO1xuICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIodG1wLCB1Y3MyRGF0YVNpemUpO1xuICAgICAgICAgICAgICAgIGFkZEhleChjaGFyLCB0bXAsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5jSGV4KGNoYXJDb2RlLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4U2lnbmVkKHRtcCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBhZGRIZXgoY2hhckNvZGUsIHRtcCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBjTWFwLm1hcE9uZShcbiAgICAgICAgICAgICAgICBoZXhUb0ludChjaGFyLCB1Y3MyRGF0YVNpemUpLFxuICAgICAgICAgICAgICAgIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTogLy8gYmZyYW5nZVxuICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgdWNzMkRhdGFTaXplKTtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXJDb2RlLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoXG4gICAgICAgICAgICAgIGhleFRvSW50KHN0YXJ0LCB1Y3MyRGF0YVNpemUpLFxuICAgICAgICAgICAgICBoZXhUb0ludChlbmQsIHVjczJEYXRhU2l6ZSksXG4gICAgICAgICAgICAgIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGluY0hleChlbmQsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgdWNzMkRhdGFTaXplKTtcbiAgICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgdWNzMkRhdGFTaXplKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoXG4gICAgICAgICAgICAgICAgaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksXG4gICAgICAgICAgICAgICAgaGV4VG9JbnQoZW5kLCB1Y3MyRGF0YVNpemUpLFxuICAgICAgICAgICAgICAgIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwicHJvY2Vzc0JpbmFyeUNNYXA6IFVua25vd24gdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHVzZUNNYXApIHtcbiAgICAgICAgcmVzb2x2ZShleHRlbmQodXNlQ01hcCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGNNYXApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyKCkge31cblxuICBCaW5hcnlDTWFwUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICBwcm9jZXNzOiBwcm9jZXNzQmluYXJ5Q01hcCxcbiAgfTtcblxuICByZXR1cm4gQmluYXJ5Q01hcFJlYWRlcjtcbn0pKCk7XG5cbnZhciBDTWFwRmFjdG9yeSA9IChmdW5jdGlvbiBDTWFwRmFjdG9yeUNsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIHN0clRvSW50KHN0cikge1xuICAgIHZhciBhID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgYSA9IChhIDw8IDgpIHwgc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBhID4+PiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwZWN0U3RyaW5nKG9iaikge1xuICAgIGlmICghaXNTdHJpbmcob2JqKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTWFsZm9ybWVkIENNYXA6IGV4cGVjdGVkIHN0cmluZy5cIik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXhwZWN0SW50KG9iaikge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgaW50LlwiKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcikge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICBpZiAoaXNFT0Yob2JqKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChpc0NtZChvYmosIFwiZW5kYmZjaGFyXCIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIHNyYyA9IHN0clRvSW50KG9iaik7XG4gICAgICBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIC8vIFRPRE8gYXJlIC9kc3ROYW1lIHVzZWQ/XG4gICAgICBleHBlY3RTdHJpbmcob2JqKTtcbiAgICAgIHZhciBkc3QgPSBvYmo7XG4gICAgICBjTWFwLm1hcE9uZShzcmMsIGRzdCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIGlmIChpc0VPRihvYmopKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGlzQ21kKG9iaiwgXCJlbmRiZnJhbmdlXCIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIGxvdyA9IHN0clRvSW50KG9iaik7XG4gICAgICBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopO1xuICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopIHx8IGlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgdmFyIGRzdExvdyA9IE51bWJlci5pc0ludGVnZXIob2JqKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUob2JqKSA6IG9iajtcbiAgICAgICAgY01hcC5tYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNDbWQob2JqLCBcIltcIikpIHtcbiAgICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICB3aGlsZSAoIWlzQ21kKG9iaiwgXCJdXCIpICYmICFpc0VPRihvYmopKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChvYmopO1xuICAgICAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgICB9XG4gICAgICAgIGNNYXAubWFwQmZSYW5nZVRvQXJyYXkobG93LCBoaWdoLCBhcnJheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBiZiByYW5nZS5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgaWYgKGlzRU9GKG9iaikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNDbWQob2JqLCBcImVuZGNpZGNoYXJcIikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXhwZWN0U3RyaW5nKG9iaik7XG4gICAgICB2YXIgc3JjID0gc3RyVG9JbnQob2JqKTtcbiAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgZXhwZWN0SW50KG9iaik7XG4gICAgICB2YXIgZHN0ID0gb2JqO1xuICAgICAgY01hcC5tYXBPbmUoc3JjLCBkc3QpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQ2lkUmFuZ2UoY01hcCwgbGV4ZXIpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgaWYgKGlzRU9GKG9iaikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNDbWQob2JqLCBcImVuZGNpZHJhbmdlXCIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIGxvdyA9IHN0clRvSW50KG9iaik7XG4gICAgICBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopO1xuICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICBleHBlY3RJbnQob2JqKTtcbiAgICAgIHZhciBkc3RMb3cgPSBvYmo7XG4gICAgICBjTWFwLm1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNvZGVzcGFjZVJhbmdlKGNNYXAsIGxleGVyKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIGlmIChpc0VPRihvYmopKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGlzQ21kKG9iaiwgXCJlbmRjb2Rlc3BhY2VyYW5nZVwiKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgbG93ID0gc3RyVG9JbnQob2JqKTtcbiAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgaWYgKCFpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopO1xuICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShvYmoubGVuZ3RoLCBsb3csIGhpZ2gpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIGNvZGVzcGFjZSByYW5nZS5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKSB7XG4gICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHtcbiAgICAgIGNNYXAudmVydGljYWwgPSAhIW9iajtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKSB7XG4gICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgIGlmIChpc05hbWUob2JqKSAmJiBpc1N0cmluZyhvYmoubmFtZSkpIHtcbiAgICAgIGNNYXAubmFtZSA9IG9iai5uYW1lO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkge1xuICAgIHZhciBwcmV2aW91cztcbiAgICB2YXIgZW1iZWRkZWRVc2VDTWFwO1xuICAgIG9iakxvb3A6IHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICAgIGlmIChpc0VPRihvYmopKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOYW1lKG9iaikpIHtcbiAgICAgICAgICBpZiAob2JqLm5hbWUgPT09IFwiV01vZGVcIikge1xuICAgICAgICAgICAgcGFyc2VXTW9kZShjTWFwLCBsZXhlcik7XG4gICAgICAgICAgfSBlbHNlIGlmIChvYmoubmFtZSA9PT0gXCJDTWFwTmFtZVwiKSB7XG4gICAgICAgICAgICBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJldmlvdXMgPSBvYmo7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDbWQob2JqKSkge1xuICAgICAgICAgIHN3aXRjaCAob2JqLmNtZCkge1xuICAgICAgICAgICAgY2FzZSBcImVuZGNtYXBcIjpcbiAgICAgICAgICAgICAgYnJlYWsgb2JqTG9vcDtcbiAgICAgICAgICAgIGNhc2UgXCJ1c2VjbWFwXCI6XG4gICAgICAgICAgICAgIGlmIChpc05hbWUocHJldmlvdXMpKSB7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWRVc2VDTWFwID0gcHJldmlvdXMubmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiZWdpbmNvZGVzcGFjZXJhbmdlXCI6XG4gICAgICAgICAgICAgIHBhcnNlQ29kZXNwYWNlUmFuZ2UoY01hcCwgbGV4ZXIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiZWdpbmJmY2hhclwiOlxuICAgICAgICAgICAgICBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImJlZ2luY2lkY2hhclwiOlxuICAgICAgICAgICAgICBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiZWdpbmJmcmFuZ2VcIjpcbiAgICAgICAgICAgICAgcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmVnaW5jaWRyYW5nZVwiOlxuICAgICAgICAgICAgICBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICAgIHdhcm4oXCJJbnZhbGlkIGNNYXAgZGF0YTogXCIgKyBleCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXNlQ01hcCAmJiBlbWJlZGRlZFVzZUNNYXApIHtcbiAgICAgIC8vIExvYWQgdGhlIHVzZUNNYXAgZGVmaW5pdGlvbiBmcm9tIHRoZSBmaWxlIG9ubHkgaWYgdGhlcmUgd2Fzbid0IG9uZVxuICAgICAgLy8gc3BlY2lmaWVkLlxuICAgICAgdXNlQ01hcCA9IGVtYmVkZGVkVXNlQ01hcDtcbiAgICB9XG4gICAgaWYgKHVzZUNNYXApIHtcbiAgICAgIHJldHVybiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNNYXApO1xuICB9XG5cbiAgZnVuY3Rpb24gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKHVzZUNNYXAsIGZldGNoQnVpbHRJbkNNYXApLnRoZW4oZnVuY3Rpb24gKFxuICAgICAgbmV3Q01hcFxuICAgICkge1xuICAgICAgY01hcC51c2VDTWFwID0gbmV3Q01hcDtcbiAgICAgIC8vIElmIHRoZXJlIGFyZW4ndCBhbnkgY29kZSBzcGFjZSByYW5nZXMgZGVmaW5lZCBjbG9uZSBhbGwgdGhlIHBhcmVudCBvbmVzXG4gICAgICAvLyBpbnRvIHRoaXMgY01hcC5cbiAgICAgIGlmIChjTWFwLm51bUNvZGVzcGFjZVJhbmdlcyA9PT0gMCkge1xuICAgICAgICB2YXIgdXNlQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLmNvZGVzcGFjZVJhbmdlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1c2VDb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjTWFwLmNvZGVzcGFjZVJhbmdlc1tpXSA9IHVzZUNvZGVzcGFjZVJhbmdlc1tpXS5zbGljZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlcztcbiAgICAgIH1cbiAgICAgIC8vIE1lcmdlIHRoZSBtYXAgaW50byB0aGUgY3VycmVudCBvbmUsIG1ha2luZyBzdXJlIG5vdCB0byBvdmVycmlkZVxuICAgICAgLy8gYW55IHByZXZpb3VzbHkgZGVmaW5lZCBlbnRyaWVzLlxuICAgICAgY01hcC51c2VDTWFwLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCFjTWFwLmNvbnRhaW5zKGtleSkpIHtcbiAgICAgICAgICBjTWFwLm1hcE9uZShrZXksIGNNYXAudXNlQ01hcC5sb29rdXAoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY01hcDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKG5hbWUsIGZldGNoQnVpbHRJbkNNYXApIHtcbiAgICBpZiAobmFtZSA9PT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IElkZW50aXR5Q01hcChmYWxzZSwgMikpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gXCJJZGVudGl0eS1WXCIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IElkZW50aXR5Q01hcCh0cnVlLCAyKSk7XG4gICAgfVxuICAgIGlmICghQlVJTFRfSU5fQ01BUFMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbmtub3duIENNYXAgbmFtZTogXCIgKyBuYW1lKSk7XG4gICAgfVxuICAgIGlmICghZmV0Y2hCdWlsdEluQ01hcCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXCJCdWlsdC1pbiBDTWFwIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm92aWRlZC5cIilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZldGNoQnVpbHRJbkNNYXAobmFtZSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIGNNYXBEYXRhID0gZGF0YS5jTWFwRGF0YSxcbiAgICAgICAgY29tcHJlc3Npb25UeXBlID0gZGF0YS5jb21wcmVzc2lvblR5cGU7XG4gICAgICB2YXIgY01hcCA9IG5ldyBDTWFwKHRydWUpO1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25UeXBlID09PSBDTWFwQ29tcHJlc3Npb25UeXBlLkJJTkFSWSkge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeUNNYXBSZWFkZXIoKS5wcm9jZXNzKGNNYXBEYXRhLCBjTWFwLCBmdW5jdGlvbiAoXG4gICAgICAgICAgdXNlQ01hcFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHJlc3Npb25UeXBlID09PSBDTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpIHtcbiAgICAgICAgdmFyIGxleGVyID0gbmV3IExleGVyKG5ldyBTdHJlYW0oY01hcERhdGEpKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgbnVsbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBcIlRPRE86IE9ubHkgQklOQVJZL05PTkUgQ01hcCBjb21wcmVzc2lvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlwiXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNyZWF0ZShwYXJhbXMpIHtcbiAgICAgIHZhciBlbmNvZGluZyA9IHBhcmFtcy5lbmNvZGluZztcbiAgICAgIHZhciBmZXRjaEJ1aWx0SW5DTWFwID0gcGFyYW1zLmZldGNoQnVpbHRJbkNNYXA7XG4gICAgICB2YXIgdXNlQ01hcCA9IHBhcmFtcy51c2VDTWFwO1xuXG4gICAgICBpZiAoaXNOYW1lKGVuY29kaW5nKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAoZW5jb2RpbmcubmFtZSwgZmV0Y2hCdWlsdEluQ01hcCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RyZWFtKGVuY29kaW5nKSkge1xuICAgICAgICB2YXIgY01hcCA9IG5ldyBDTWFwKCk7XG4gICAgICAgIHZhciBsZXhlciA9IG5ldyBMZXhlcihlbmNvZGluZyk7XG4gICAgICAgIHJldHVybiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApLnRoZW4oZnVuY3Rpb24gKFxuICAgICAgICAgIHBhcnNlZENNYXBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHBhcnNlZENNYXAuaXNJZGVudGl0eUNNYXApIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVCdWlsdEluQ01hcChwYXJzZWRDTWFwLm5hbWUsIGZldGNoQnVpbHRJbkNNYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFyc2VkQ01hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmNvZGluZyByZXF1aXJlZC5cIik7XG4gICAgfSxcbiAgfTtcbn0pKCk7XG5cbmV4cG9ydCB7IENNYXAsIElkZW50aXR5Q01hcCwgQ01hcEZhY3RvcnkgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGJ5dGVzVG9TdHJpbmcsXG4gIEZPTlRfSURFTlRJVFlfTUFUUklYLFxuICBGb250VHlwZSxcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIGlzTnVtLFxuICBzaGFkb3csXG4gIHN0cmluZzMyLFxuICB1bnJlYWNoYWJsZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBDRkYsXG4gIENGRkNoYXJzZXQsXG4gIENGRkNvbXBpbGVyLFxuICBDRkZIZWFkZXIsXG4gIENGRkluZGV4LFxuICBDRkZQYXJzZXIsXG4gIENGRlByaXZhdGVEaWN0LFxuICBDRkZTdGFuZGFyZFN0cmluZ3MsXG4gIENGRlN0cmluZ3MsXG4gIENGRlRvcERpY3QsXG59IGZyb20gXCIuL2NmZl9wYXJzZXIuanNcIjtcbmltcG9ydCB7IGdldERpbmdiYXRzR2x5cGhzVW5pY29kZSwgZ2V0R2x5cGhzVW5pY29kZSB9IGZyb20gXCIuL2dseXBobGlzdC5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW5jb2RpbmcsXG4gIE1hY1JvbWFuRW5jb2RpbmcsXG4gIFN0YW5kYXJkRW5jb2RpbmcsXG4gIFN5bWJvbFNldEVuY29kaW5nLFxuICBaYXBmRGluZ2JhdHNFbmNvZGluZyxcbn0gZnJvbSBcIi4vZW5jb2RpbmdzLmpzXCI7XG5pbXBvcnQge1xuICBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMsXG4gIGdldE5vblN0ZEZvbnRNYXAsXG4gIGdldFN0ZEZvbnRNYXAsXG4gIGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayxcbiAgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpLFxufSBmcm9tIFwiLi9zdGFuZGFyZF9mb250cy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0VW5pY29kZUZvckdseXBoLFxuICBnZXRVbmljb2RlUmFuZ2VGb3IsXG4gIG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzLFxufSBmcm9tIFwiLi91bmljb2RlLmpzXCI7XG5pbXBvcnQge1xuICBpc1doaXRlU3BhY2UsXG4gIE1pc3NpbmdEYXRhRXhjZXB0aW9uLFxuICByZWFkVWludDMyLFxufSBmcm9tIFwiLi9jb3JlX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBGb250UmVuZGVyZXJGYWN0b3J5IH0gZnJvbSBcIi4vZm9udF9yZW5kZXJlci5qc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlDTWFwIH0gZnJvbSBcIi4vY21hcC5qc1wiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBUeXBlMVBhcnNlciB9IGZyb20gXCIuL3R5cGUxX3BhcnNlci5qc1wiO1xuXG4vLyBVbmljb2RlIFByaXZhdGUgVXNlIEFyZWFzOlxuY29uc3QgUFJJVkFURV9VU0VfQVJFQVMgPSBbXG4gIFsweGUwMDAsIDB4ZjhmZl0sIC8vIEJNUCAoMClcbiAgWzB4MTAwMDAwLCAweDEwZmZmZF0sIC8vIFBVUCAoMTYpXG5dO1xuXG4vLyBQREYgR2x5cGggU3BhY2UgVW5pdHMgYXJlIG9uZSBUaG91c2FuZHRoIG9mIGEgVGV4dFNwYWNlIFVuaXRcbi8vIGV4Y2VwdCBmb3IgVHlwZSAzIGZvbnRzXG52YXIgUERGX0dMWVBIX1NQQUNFX1VOSVRTID0gMTAwMDtcblxuLy8gQWNjZW50ZWQgY2hhcmFjdGVycyBoYXZlIGlzc3VlcyBvbiBXaW5kb3dzIGFuZCBMaW51eC4gV2hlbiB0aGlzIGZsYWcgaXNcbi8vIGVuYWJsZWQgZ2x5cGhzIHRoYXQgdXNlIHNlYWMgYW5kIHNlYWMgc3R5bGUgZW5kY2hhciBvcGVyYXRvcnMgYXJlIHRydW5jYXRlZFxuLy8gYW5kIHdlIGluc3RlYWQganVzdCBzdG9yZSB0aGUgZ2x5cGggaWQncyBvZiB0aGUgYmFzZSBnbHlwaCBhbmQgaXRzIGFjY2VudCB0b1xuLy8gYmUgZHJhd24gaW5kaXZpZHVhbGx5LlxuLy8gTGludXggKGZyZWV0eXBlKSByZXF1aXJlcyB0aGF0IHdoZW4gYSBzZWFjIHN0eWxlIGVuZGNoYXIgaXMgdXNlZFxuLy8gdGhhdCB0aGUgY2hhcnNldCBtdXN0IGJlIGEgcHJlZGVmaW5lZCBvbmUsIGhvd2V2ZXIgd2UgYnVpbGQgYVxuLy8gY3VzdG9tIG9uZS4gV2luZG93cyBqdXN0IHJlZnVzZXMgdG8gZHJhdyBnbHlwaHMgd2l0aCBzZWFjIG9wZXJhdG9ycy5cbnZhciBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB0cnVlO1xuXG5jb25zdCBFWFBPUlRfREFUQV9QUk9QRVJUSUVTID0gW1xuICBcImFzY2VudFwiLFxuICBcImJib3hcIixcbiAgXCJibGFja1wiLFxuICBcImJvbGRcIixcbiAgXCJjaGFyUHJvY09wZXJhdG9yTGlzdFwiLFxuICBcImNvbXBvc2l0ZVwiLFxuICBcImRhdGFcIixcbiAgXCJkZWZhdWx0Vk1ldHJpY3NcIixcbiAgXCJkZWZhdWx0V2lkdGhcIixcbiAgXCJkZXNjZW50XCIsXG4gIFwiZmFsbGJhY2tOYW1lXCIsXG4gIFwiZm9udE1hdHJpeFwiLFxuICBcImZvbnRUeXBlXCIsXG4gIFwiaXNNb25vc3BhY2VcIixcbiAgXCJpc1NlcmlmRm9udFwiLFxuICBcImlzVHlwZTNGb250XCIsXG4gIFwiaXRhbGljXCIsXG4gIFwibG9hZGVkTmFtZVwiLFxuICBcIm1pbWV0eXBlXCIsXG4gIFwibWlzc2luZ0ZpbGVcIixcbiAgXCJuYW1lXCIsXG4gIFwicmVtZWFzdXJlXCIsXG4gIFwic3VidHlwZVwiLFxuICBcInR5cGVcIixcbiAgXCJ2ZXJ0aWNhbFwiLFxuXTtcblxuY29uc3QgRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFUyA9IFtcbiAgXCJjTWFwXCIsXG4gIFwiZGVmYXVsdEVuY29kaW5nXCIsXG4gIFwiZGlmZmVyZW5jZXNcIixcbiAgXCJpc1N5bWJvbGljRm9udFwiLFxuICBcInNlYWNNYXBcIixcbiAgXCJ0b0ZvbnRDaGFyXCIsXG4gIFwidG9Vbmljb2RlXCIsXG4gIFwidm1ldHJpY3NcIixcbiAgXCJ3aWR0aHNcIixcbl07XG5cbnZhciBGb250RmxhZ3MgPSB7XG4gIEZpeGVkUGl0Y2g6IDEsXG4gIFNlcmlmOiAyLFxuICBTeW1ib2xpYzogNCxcbiAgU2NyaXB0OiA4LFxuICBOb25zeW1ib2xpYzogMzIsXG4gIEl0YWxpYzogNjQsXG4gIEFsbENhcDogNjU1MzYsXG4gIFNtYWxsQ2FwOiAxMzEwNzIsXG4gIEZvcmNlQm9sZDogMjYyMTQ0LFxufTtcblxuLy8gcHJldHRpZXItaWdub3JlXG52YXIgTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nID0gW1xuICBcIi5ub3RkZWZcIiwgXCIubnVsbFwiLCBcIm5vbm1hcmtpbmdyZXR1cm5cIiwgXCJzcGFjZVwiLCBcImV4Y2xhbVwiLCBcInF1b3RlZGJsXCIsXG4gIFwibnVtYmVyc2lnblwiLCBcImRvbGxhclwiLCBcInBlcmNlbnRcIiwgXCJhbXBlcnNhbmRcIiwgXCJxdW90ZXNpbmdsZVwiLCBcInBhcmVubGVmdFwiLFxuICBcInBhcmVucmlnaHRcIiwgXCJhc3Rlcmlza1wiLCBcInBsdXNcIiwgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcInNsYXNoXCIsXG4gIFwiemVyb1wiLCBcIm9uZVwiLCBcInR3b1wiLCBcInRocmVlXCIsIFwiZm91clwiLCBcImZpdmVcIiwgXCJzaXhcIiwgXCJzZXZlblwiLCBcImVpZ2h0XCIsXG4gIFwibmluZVwiLCBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsIFwibGVzc1wiLCBcImVxdWFsXCIsIFwiZ3JlYXRlclwiLCBcInF1ZXN0aW9uXCIsIFwiYXRcIixcbiAgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIiwgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsIFwiTlwiLCBcIk9cIixcbiAgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIiwgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLCBcImJyYWNrZXRsZWZ0XCIsXG4gIFwiYmFja3NsYXNoXCIsIFwiYnJhY2tldHJpZ2h0XCIsIFwiYXNjaWljaXJjdW1cIiwgXCJ1bmRlcnNjb3JlXCIsIFwiZ3JhdmVcIiwgXCJhXCIsIFwiYlwiLFxuICBcImNcIiwgXCJkXCIsIFwiZVwiLCBcImZcIiwgXCJnXCIsIFwiaFwiLCBcImlcIiwgXCJqXCIsIFwia1wiLCBcImxcIiwgXCJtXCIsIFwiblwiLCBcIm9cIiwgXCJwXCIsIFwicVwiLFxuICBcInJcIiwgXCJzXCIsIFwidFwiLCBcInVcIiwgXCJ2XCIsIFwid1wiLCBcInhcIiwgXCJ5XCIsIFwielwiLCBcImJyYWNlbGVmdFwiLCBcImJhclwiLCBcImJyYWNlcmlnaHRcIixcbiAgXCJhc2NpaXRpbGRlXCIsIFwiQWRpZXJlc2lzXCIsIFwiQXJpbmdcIiwgXCJDY2VkaWxsYVwiLCBcIkVhY3V0ZVwiLCBcIk50aWxkZVwiLFxuICBcIk9kaWVyZXNpc1wiLCBcIlVkaWVyZXNpc1wiLCBcImFhY3V0ZVwiLCBcImFncmF2ZVwiLCBcImFjaXJjdW1mbGV4XCIsIFwiYWRpZXJlc2lzXCIsXG4gIFwiYXRpbGRlXCIsIFwiYXJpbmdcIiwgXCJjY2VkaWxsYVwiLCBcImVhY3V0ZVwiLCBcImVncmF2ZVwiLCBcImVjaXJjdW1mbGV4XCIsIFwiZWRpZXJlc2lzXCIsXG4gIFwiaWFjdXRlXCIsIFwiaWdyYXZlXCIsIFwiaWNpcmN1bWZsZXhcIiwgXCJpZGllcmVzaXNcIiwgXCJudGlsZGVcIiwgXCJvYWN1dGVcIiwgXCJvZ3JhdmVcIixcbiAgXCJvY2lyY3VtZmxleFwiLCBcIm9kaWVyZXNpc1wiLCBcIm90aWxkZVwiLCBcInVhY3V0ZVwiLCBcInVncmF2ZVwiLCBcInVjaXJjdW1mbGV4XCIsXG4gIFwidWRpZXJlc2lzXCIsIFwiZGFnZ2VyXCIsIFwiZGVncmVlXCIsIFwiY2VudFwiLCBcInN0ZXJsaW5nXCIsIFwic2VjdGlvblwiLCBcImJ1bGxldFwiLFxuICBcInBhcmFncmFwaFwiLCBcImdlcm1hbmRibHNcIiwgXCJyZWdpc3RlcmVkXCIsIFwiY29weXJpZ2h0XCIsIFwidHJhZGVtYXJrXCIsIFwiYWN1dGVcIixcbiAgXCJkaWVyZXNpc1wiLCBcIm5vdGVxdWFsXCIsIFwiQUVcIiwgXCJPc2xhc2hcIiwgXCJpbmZpbml0eVwiLCBcInBsdXNtaW51c1wiLCBcImxlc3NlcXVhbFwiLFxuICBcImdyZWF0ZXJlcXVhbFwiLCBcInllblwiLCBcIm11XCIsIFwicGFydGlhbGRpZmZcIiwgXCJzdW1tYXRpb25cIiwgXCJwcm9kdWN0XCIsIFwicGlcIixcbiAgXCJpbnRlZ3JhbFwiLCBcIm9yZGZlbWluaW5lXCIsIFwib3JkbWFzY3VsaW5lXCIsIFwiT21lZ2FcIiwgXCJhZVwiLCBcIm9zbGFzaFwiLFxuICBcInF1ZXN0aW9uZG93blwiLCBcImV4Y2xhbWRvd25cIiwgXCJsb2dpY2Fsbm90XCIsIFwicmFkaWNhbFwiLCBcImZsb3JpblwiLFxuICBcImFwcHJveGVxdWFsXCIsIFwiRGVsdGFcIiwgXCJndWlsbGVtb3RsZWZ0XCIsIFwiZ3VpbGxlbW90cmlnaHRcIiwgXCJlbGxpcHNpc1wiLFxuICBcIm5vbmJyZWFraW5nc3BhY2VcIiwgXCJBZ3JhdmVcIiwgXCJBdGlsZGVcIiwgXCJPdGlsZGVcIiwgXCJPRVwiLCBcIm9lXCIsIFwiZW5kYXNoXCIsXG4gIFwiZW1kYXNoXCIsIFwicXVvdGVkYmxsZWZ0XCIsIFwicXVvdGVkYmxyaWdodFwiLCBcInF1b3RlbGVmdFwiLCBcInF1b3RlcmlnaHRcIixcbiAgXCJkaXZpZGVcIiwgXCJsb3plbmdlXCIsIFwieWRpZXJlc2lzXCIsIFwiWWRpZXJlc2lzXCIsIFwiZnJhY3Rpb25cIiwgXCJjdXJyZW5jeVwiLFxuICBcImd1aWxzaW5nbGxlZnRcIiwgXCJndWlsc2luZ2xyaWdodFwiLCBcImZpXCIsIFwiZmxcIiwgXCJkYWdnZXJkYmxcIiwgXCJwZXJpb2RjZW50ZXJlZFwiLFxuICBcInF1b3Rlc2luZ2xiYXNlXCIsIFwicXVvdGVkYmxiYXNlXCIsIFwicGVydGhvdXNhbmRcIiwgXCJBY2lyY3VtZmxleFwiLFxuICBcIkVjaXJjdW1mbGV4XCIsIFwiQWFjdXRlXCIsIFwiRWRpZXJlc2lzXCIsIFwiRWdyYXZlXCIsIFwiSWFjdXRlXCIsIFwiSWNpcmN1bWZsZXhcIixcbiAgXCJJZGllcmVzaXNcIiwgXCJJZ3JhdmVcIiwgXCJPYWN1dGVcIiwgXCJPY2lyY3VtZmxleFwiLCBcImFwcGxlXCIsIFwiT2dyYXZlXCIsIFwiVWFjdXRlXCIsXG4gIFwiVWNpcmN1bWZsZXhcIiwgXCJVZ3JhdmVcIiwgXCJkb3RsZXNzaVwiLCBcImNpcmN1bWZsZXhcIiwgXCJ0aWxkZVwiLCBcIm1hY3JvblwiLFxuICBcImJyZXZlXCIsIFwiZG90YWNjZW50XCIsIFwicmluZ1wiLCBcImNlZGlsbGFcIiwgXCJodW5nYXJ1bWxhdXRcIiwgXCJvZ29uZWtcIiwgXCJjYXJvblwiLFxuICBcIkxzbGFzaFwiLCBcImxzbGFzaFwiLCBcIlNjYXJvblwiLCBcInNjYXJvblwiLCBcIlpjYXJvblwiLCBcInpjYXJvblwiLCBcImJyb2tlbmJhclwiLFxuICBcIkV0aFwiLCBcImV0aFwiLCBcIllhY3V0ZVwiLCBcInlhY3V0ZVwiLCBcIlRob3JuXCIsIFwidGhvcm5cIiwgXCJtaW51c1wiLCBcIm11bHRpcGx5XCIsXG4gIFwib25lc3VwZXJpb3JcIiwgXCJ0d29zdXBlcmlvclwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJvbmVoYWxmXCIsIFwib25lcXVhcnRlclwiLFxuICBcInRocmVlcXVhcnRlcnNcIiwgXCJmcmFuY1wiLCBcIkdicmV2ZVwiLCBcImdicmV2ZVwiLCBcIklkb3RhY2NlbnRcIiwgXCJTY2VkaWxsYVwiLFxuICBcInNjZWRpbGxhXCIsIFwiQ2FjdXRlXCIsIFwiY2FjdXRlXCIsIFwiQ2Nhcm9uXCIsIFwiY2Nhcm9uXCIsIFwiZGNyb2F0XCJdO1xuXG5mdW5jdGlvbiBhZGp1c3RXaWR0aHMocHJvcGVydGllcykge1xuICBpZiAoIXByb3BlcnRpZXMuZm9udE1hdHJpeCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvcGVydGllcy5mb250TWF0cml4WzBdID09PSBGT05UX0lERU5USVRZX01BVFJJWFswXSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBhZGp1c3Rpbmcgd2lkdGggdG8gZm9udE1hdHJpeCBzY2FsZVxuICB2YXIgc2NhbGUgPSAwLjAwMSAvIHByb3BlcnRpZXMuZm9udE1hdHJpeFswXTtcbiAgdmFyIGdseXBoc1dpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzO1xuICBmb3IgKHZhciBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHtcbiAgICBnbHlwaHNXaWR0aHNbZ2x5cGhdICo9IHNjYWxlO1xuICB9XG4gIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoICo9IHNjYWxlO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RUb1VuaWNvZGUocHJvcGVydGllcywgYnVpbHRJbkVuY29kaW5nKSB7XG4gIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7XG4gICAgcmV0dXJuOyAvLyBUaGUgZm9udCBkaWN0aW9uYXJ5IGhhcyBhIGBUb1VuaWNvZGVgIGVudHJ5LlxuICB9XG4gIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7XG4gICAgcmV0dXJuOyAvLyBUaGUgZm9udCBkaWN0aW9uYXJ5IGhhcyBhbiBgRW5jb2RpbmdgIGVudHJ5LlxuICB9XG4gIGlmIChidWlsdEluRW5jb2RpbmcgPT09IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nKSB7XG4gICAgcmV0dXJuOyAvLyBObyBwb2ludCBpbiB0cnlpbmcgdG8gYWRqdXN0IGB0b1VuaWNvZGVgIGlmIHRoZSBlbmNvZGluZ3MgbWF0Y2guXG4gIH1cbiAgaWYgKHByb3BlcnRpZXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHRvVW5pY29kZSA9IFtdLFxuICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7XG4gIGZvciAodmFyIGNoYXJDb2RlIGluIGJ1aWx0SW5FbmNvZGluZykge1xuICAgIHZhciBnbHlwaE5hbWUgPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdO1xuICAgIHZhciB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7XG4gICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7XG4gICAgICB0b1VuaWNvZGVbY2hhckNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlKTtcbiAgICB9XG4gIH1cbiAgcHJvcGVydGllcy50b1VuaWNvZGUuYW1lbmQodG9Vbmljb2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Rm9udFR5cGUodHlwZSwgc3VidHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiVHlwZTFcIjpcbiAgICAgIHJldHVybiBzdWJ0eXBlID09PSBcIlR5cGUxQ1wiID8gRm9udFR5cGUuVFlQRTFDIDogRm9udFR5cGUuVFlQRTE7XG4gICAgY2FzZSBcIkNJREZvbnRUeXBlMFwiOlxuICAgICAgcmV0dXJuIHN1YnR5cGUgPT09IFwiQ0lERm9udFR5cGUwQ1wiXG4gICAgICAgID8gRm9udFR5cGUuQ0lERk9OVFRZUEUwQ1xuICAgICAgICA6IEZvbnRUeXBlLkNJREZPTlRUWVBFMDtcbiAgICBjYXNlIFwiT3BlblR5cGVcIjpcbiAgICAgIHJldHVybiBGb250VHlwZS5PUEVOVFlQRTtcbiAgICBjYXNlIFwiVHJ1ZVR5cGVcIjpcbiAgICAgIHJldHVybiBGb250VHlwZS5UUlVFVFlQRTtcbiAgICBjYXNlIFwiQ0lERm9udFR5cGUyXCI6XG4gICAgICByZXR1cm4gRm9udFR5cGUuQ0lERk9OVFRZUEUyO1xuICAgIGNhc2UgXCJNTVR5cGUxXCI6XG4gICAgICByZXR1cm4gRm9udFR5cGUuTU1UWVBFMTtcbiAgICBjYXNlIFwiVHlwZTBcIjpcbiAgICAgIHJldHVybiBGb250VHlwZS5UWVBFMDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEZvbnRUeXBlLlVOS05PV047XG4gIH1cbn1cblxuLy8gU29tZSBiYWQgUERGIGdlbmVyYXRvcnMsIGUuZy4gU2NyaWJ1cyBQREYsIGluY2x1ZGUgZ2x5cGggbmFtZXNcbi8vIGluIGEgJ3VuaVhYWFgnIGZvcm1hdCAtLSBhdHRlbXB0aW5nIHRvIHJlY292ZXIgcHJvcGVyIG9uZXMuXG5mdW5jdGlvbiByZWNvdmVyR2x5cGhOYW1lKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApIHtcbiAgaWYgKGdseXBoc1VuaWNvZGVNYXBbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIC8vIFRoZSBnbHlwaCBuYW1lIGlzIG5vbi1zdGFuZGFyZCwgdHJ5aW5nIHRvIHJlY292ZXIuXG4gIHZhciB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApO1xuICBpZiAodW5pY29kZSAhPT0gLTEpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZ2x5cGhzVW5pY29kZU1hcCkge1xuICAgICAgaWYgKGdseXBoc1VuaWNvZGVNYXBba2V5XSA9PT0gdW5pY29kZSkge1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpbmZvKFwiVW5hYmxlIHRvIHJlY292ZXIgYSBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvcjogXCIgKyBuYW1lKTtcbiAgcmV0dXJuIG5hbWU7XG59XG5cbnZhciBHbHlwaCA9IChmdW5jdGlvbiBHbHlwaENsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gR2x5cGgoXG4gICAgZm9udENoYXIsXG4gICAgdW5pY29kZSxcbiAgICBhY2NlbnQsXG4gICAgd2lkdGgsXG4gICAgdm1ldHJpYyxcbiAgICBvcGVyYXRvckxpc3RJZCxcbiAgICBpc1NwYWNlLFxuICAgIGlzSW5Gb250XG4gICkge1xuICAgIHRoaXMuZm9udENoYXIgPSBmb250Q2hhcjtcbiAgICB0aGlzLnVuaWNvZGUgPSB1bmljb2RlO1xuICAgIHRoaXMuYWNjZW50ID0gYWNjZW50O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLnZtZXRyaWMgPSB2bWV0cmljO1xuICAgIHRoaXMub3BlcmF0b3JMaXN0SWQgPSBvcGVyYXRvckxpc3RJZDtcbiAgICB0aGlzLmlzU3BhY2UgPSBpc1NwYWNlO1xuICAgIHRoaXMuaXNJbkZvbnQgPSBpc0luRm9udDtcbiAgfVxuXG4gIEdseXBoLnByb3RvdHlwZS5tYXRjaGVzRm9yQ2FjaGUgPSBmdW5jdGlvbiAoXG4gICAgZm9udENoYXIsXG4gICAgdW5pY29kZSxcbiAgICBhY2NlbnQsXG4gICAgd2lkdGgsXG4gICAgdm1ldHJpYyxcbiAgICBvcGVyYXRvckxpc3RJZCxcbiAgICBpc1NwYWNlLFxuICAgIGlzSW5Gb250XG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmZvbnRDaGFyID09PSBmb250Q2hhciAmJlxuICAgICAgdGhpcy51bmljb2RlID09PSB1bmljb2RlICYmXG4gICAgICB0aGlzLmFjY2VudCA9PT0gYWNjZW50ICYmXG4gICAgICB0aGlzLndpZHRoID09PSB3aWR0aCAmJlxuICAgICAgdGhpcy52bWV0cmljID09PSB2bWV0cmljICYmXG4gICAgICB0aGlzLm9wZXJhdG9yTGlzdElkID09PSBvcGVyYXRvckxpc3RJZCAmJlxuICAgICAgdGhpcy5pc1NwYWNlID09PSBpc1NwYWNlICYmXG4gICAgICB0aGlzLmlzSW5Gb250ID09PSBpc0luRm9udFxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEdseXBoO1xufSkoKTtcblxudmFyIFRvVW5pY29kZU1hcCA9IChmdW5jdGlvbiBUb1VuaWNvZGVNYXBDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIFRvVW5pY29kZU1hcChjbWFwID0gW10pIHtcbiAgICAvLyBUaGUgZWxlbWVudHMgb2YgdGhpcy5fbWFwIGNhbiBiZSBpbnRlZ2VycyBvciBzdHJpbmdzLCBkZXBlbmRpbmcgb24gaG93XG4gICAgLy8gYGNtYXBgIHdhcyBjcmVhdGVkLlxuICAgIHRoaXMuX21hcCA9IGNtYXA7XG4gIH1cblxuICBUb1VuaWNvZGVNYXAucHJvdG90eXBlID0ge1xuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDtcbiAgICB9LFxuXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gdGhpcy5fbWFwKSB7XG4gICAgICAgIGNhbGxiYWNrKGNoYXJDb2RlLCB0aGlzLl9tYXBbY2hhckNvZGVdLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXMoaSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcFtpXSAhPT0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBnZXQoaSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcFtpXTtcbiAgICB9LFxuXG4gICAgY2hhckNvZGVPZih2YWx1ZSkge1xuICAgICAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBpcyAqZXh0cmVtZWx5KiBpbmVmZmljaWVudCBmb3IgYXJyYXlzIHdoaWNoXG4gICAgICAvLyBhcmUgYm90aCB2ZXJ5IHNwYXJzZSBhbmQgdmVyeSBsYXJnZSAoc2VlIGlzc3VlODM3Mi5wZGYpLlxuICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkge1xuICAgICAgICByZXR1cm4gbWFwLmluZGV4T2YodmFsdWUpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHtcbiAgICAgICAgaWYgKG1hcFtjaGFyQ29kZV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYXJDb2RlIHwgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH0sXG5cbiAgICBhbWVuZChtYXApIHtcbiAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIG1hcCkge1xuICAgICAgICB0aGlzLl9tYXBbY2hhckNvZGVdID0gbWFwW2NoYXJDb2RlXTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBUb1VuaWNvZGVNYXA7XG59KSgpO1xuXG52YXIgSWRlbnRpdHlUb1VuaWNvZGVNYXAgPSAoZnVuY3Rpb24gSWRlbnRpdHlUb1VuaWNvZGVNYXBDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIElkZW50aXR5VG9Vbmljb2RlTWFwKGZpcnN0Q2hhciwgbGFzdENoYXIpIHtcbiAgICB0aGlzLmZpcnN0Q2hhciA9IGZpcnN0Q2hhcjtcbiAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7XG4gIH1cblxuICBJZGVudGl0eVRvVW5pY29kZU1hcC5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhc3RDaGFyICsgMSAtIHRoaXMuZmlyc3RDaGFyO1xuICAgIH0sXG5cbiAgICBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5maXJzdENoYXIsIGlpID0gdGhpcy5sYXN0Q2hhcjsgaSA8PSBpaTsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrKGksIGkpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXMoaSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyO1xuICAgIH0sXG5cbiAgICBnZXQoaSkge1xuICAgICAgaWYgKHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgY2hhckNvZGVPZih2KSB7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2KSAmJiB2ID49IHRoaXMuZmlyc3RDaGFyICYmIHYgPD0gdGhpcy5sYXN0Q2hhclxuICAgICAgICA/IHZcbiAgICAgICAgOiAtMTtcbiAgICB9LFxuXG4gICAgYW1lbmQobWFwKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpXCIpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIElkZW50aXR5VG9Vbmljb2RlTWFwO1xufSkoKTtcblxudmFyIE9wZW5UeXBlRmlsZUJ1aWxkZXIgPSAoZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlckNsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIHdyaXRlSW50MTYoZGVzdCwgb2Zmc2V0LCBudW0pIHtcbiAgICBkZXN0W29mZnNldF0gPSAobnVtID4+IDgpICYgMHhmZjtcbiAgICBkZXN0W29mZnNldCArIDFdID0gbnVtICYgMHhmZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlSW50MzIoZGVzdCwgb2Zmc2V0LCBudW0pIHtcbiAgICBkZXN0W29mZnNldF0gPSAobnVtID4+IDI0KSAmIDB4ZmY7XG4gICAgZGVzdFtvZmZzZXQgKyAxXSA9IChudW0gPj4gMTYpICYgMHhmZjtcbiAgICBkZXN0W29mZnNldCArIDJdID0gKG51bSA+PiA4KSAmIDB4ZmY7XG4gICAgZGVzdFtvZmZzZXQgKyAzXSA9IG51bSAmIDB4ZmY7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZURhdGEoZGVzdCwgb2Zmc2V0LCBkYXRhKSB7XG4gICAgdmFyIGksIGlpO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgZGVzdC5zZXQoZGF0YSwgb2Zmc2V0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBkZXN0W29mZnNldCsrXSA9IGRhdGEuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRyZWF0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBhcyBhcnJheVxuICAgICAgZm9yIChpID0gMCwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgZGVzdFtvZmZzZXQrK10gPSBkYXRhW2ldICYgMHhmZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXIoc2ZudCkge1xuICAgIHRoaXMuc2ZudCA9IHNmbnQ7XG4gICAgdGhpcy50YWJsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiBPcGVuVHlwZUZpbGVCdWlsZGVyX2dldFNlYXJjaFBhcmFtcyhcbiAgICBlbnRyaWVzQ291bnQsXG4gICAgZW50cnlTaXplXG4gICkge1xuICAgIHZhciBtYXhQb3dlcjIgPSAxLFxuICAgICAgbG9nMiA9IDA7XG4gICAgd2hpbGUgKChtYXhQb3dlcjIgXiBlbnRyaWVzQ291bnQpID4gbWF4UG93ZXIyKSB7XG4gICAgICBtYXhQb3dlcjIgPDw9IDE7XG4gICAgICBsb2cyKys7XG4gICAgfVxuICAgIHZhciBzZWFyY2hSYW5nZSA9IG1heFBvd2VyMiAqIGVudHJ5U2l6ZTtcbiAgICByZXR1cm4ge1xuICAgICAgcmFuZ2U6IHNlYXJjaFJhbmdlLFxuICAgICAgZW50cnk6IGxvZzIsXG4gICAgICByYW5nZVNoaWZ0OiBlbnRyeVNpemUgKiBlbnRyaWVzQ291bnQgLSBzZWFyY2hSYW5nZSxcbiAgICB9O1xuICB9O1xuXG4gIHZhciBPVEZfSEVBREVSX1NJWkUgPSAxMjtcbiAgdmFyIE9URl9UQUJMRV9FTlRSWV9TSVpFID0gMTY7XG5cbiAgT3BlblR5cGVGaWxlQnVpbGRlci5wcm90b3R5cGUgPSB7XG4gICAgdG9BcnJheTogZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl90b0FycmF5KCkge1xuICAgICAgdmFyIHNmbnQgPSB0aGlzLnNmbnQ7XG5cbiAgICAgIC8vIFRhYmxlcyBuZWVkcyB0byBiZSB3cml0dGVuIGJ5IGFzY2VuZGFudCBhbHBoYWJldGljIG9yZGVyXG4gICAgICB2YXIgdGFibGVzID0gdGhpcy50YWJsZXM7XG4gICAgICB2YXIgdGFibGVzTmFtZXMgPSBPYmplY3Qua2V5cyh0YWJsZXMpO1xuICAgICAgdGFibGVzTmFtZXMuc29ydCgpO1xuICAgICAgdmFyIG51bVRhYmxlcyA9IHRhYmxlc05hbWVzLmxlbmd0aDtcblxuICAgICAgdmFyIGksIGosIGpqLCB0YWJsZSwgdGFibGVOYW1lO1xuICAgICAgLy8gbGF5b3V0IHRoZSB0YWJsZXMgZGF0YVxuICAgICAgdmFyIG9mZnNldCA9IE9URl9IRUFERVJfU0laRSArIG51bVRhYmxlcyAqIE9URl9UQUJMRV9FTlRSWV9TSVpFO1xuICAgICAgdmFyIHRhYmxlT2Zmc2V0cyA9IFtvZmZzZXRdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7XG4gICAgICAgIHRhYmxlID0gdGFibGVzW3RhYmxlc05hbWVzW2ldXTtcbiAgICAgICAgdmFyIHBhZGRlZExlbmd0aCA9ICgodGFibGUubGVuZ3RoICsgMykgJiB+MykgPj4+IDA7XG4gICAgICAgIG9mZnNldCArPSBwYWRkZWRMZW5ndGg7XG4gICAgICAgIHRhYmxlT2Zmc2V0cy5wdXNoKG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWxlID0gbmV3IFVpbnQ4QXJyYXkob2Zmc2V0KTtcbiAgICAgIC8vIHdyaXRlIHRoZSB0YWJsZSBkYXRhIGZpcnN0IChtb3N0bHkgZm9yIGNoZWNrc3VtKVxuICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7XG4gICAgICAgIHRhYmxlID0gdGFibGVzW3RhYmxlc05hbWVzW2ldXTtcbiAgICAgICAgd3JpdGVEYXRhKGZpbGUsIHRhYmxlT2Zmc2V0c1tpXSwgdGFibGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBzZm50IHZlcnNpb24gKDQgYnl0ZXMpXG4gICAgICBpZiAoc2ZudCA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgLy8gV2luZG93cyBoYXRlcyB0aGUgTWFjIFRydWVUeXBlIHNmbnQgdmVyc2lvbiBudW1iZXJcbiAgICAgICAgc2ZudCA9IHN0cmluZzMyKDB4MDAwMTAwMDApO1xuICAgICAgfVxuICAgICAgZmlsZVswXSA9IHNmbnQuY2hhckNvZGVBdCgwKSAmIDB4ZmY7XG4gICAgICBmaWxlWzFdID0gc2ZudC5jaGFyQ29kZUF0KDEpICYgMHhmZjtcbiAgICAgIGZpbGVbMl0gPSBzZm50LmNoYXJDb2RlQXQoMikgJiAweGZmO1xuICAgICAgZmlsZVszXSA9IHNmbnQuY2hhckNvZGVBdCgzKSAmIDB4ZmY7XG5cbiAgICAgIC8vIG51bVRhYmxlcyAoMiBieXRlcylcbiAgICAgIHdyaXRlSW50MTYoZmlsZSwgNCwgbnVtVGFibGVzKTtcblxuICAgICAgdmFyIHNlYXJjaFBhcmFtcyA9IE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKG51bVRhYmxlcywgMTYpO1xuXG4gICAgICAvLyBzZWFyY2hSYW5nZSAoMiBieXRlcylcbiAgICAgIHdyaXRlSW50MTYoZmlsZSwgNiwgc2VhcmNoUGFyYW1zLnJhbmdlKTtcbiAgICAgIC8vIGVudHJ5U2VsZWN0b3IgKDIgYnl0ZXMpXG4gICAgICB3cml0ZUludDE2KGZpbGUsIDgsIHNlYXJjaFBhcmFtcy5lbnRyeSk7XG4gICAgICAvLyByYW5nZVNoaWZ0ICgyIGJ5dGVzKVxuICAgICAgd3JpdGVJbnQxNihmaWxlLCAxMCwgc2VhcmNoUGFyYW1zLnJhbmdlU2hpZnQpO1xuXG4gICAgICBvZmZzZXQgPSBPVEZfSEVBREVSX1NJWkU7XG4gICAgICAvLyB3cml0aW5nIHRhYmxlIGVudHJpZXNcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykge1xuICAgICAgICB0YWJsZU5hbWUgPSB0YWJsZXNOYW1lc1tpXTtcbiAgICAgICAgZmlsZVtvZmZzZXRdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMCkgJiAweGZmO1xuICAgICAgICBmaWxlW29mZnNldCArIDFdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMSkgJiAweGZmO1xuICAgICAgICBmaWxlW29mZnNldCArIDJdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMikgJiAweGZmO1xuICAgICAgICBmaWxlW29mZnNldCArIDNdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMykgJiAweGZmO1xuXG4gICAgICAgIC8vIGNoZWNrc3VtXG4gICAgICAgIHZhciBjaGVja3N1bSA9IDA7XG4gICAgICAgIGZvciAoaiA9IHRhYmxlT2Zmc2V0c1tpXSwgamogPSB0YWJsZU9mZnNldHNbaSArIDFdOyBqIDwgamo7IGogKz0gNCkge1xuICAgICAgICAgIHZhciBxdWFkID0gcmVhZFVpbnQzMihmaWxlLCBqKTtcbiAgICAgICAgICBjaGVja3N1bSA9IChjaGVja3N1bSArIHF1YWQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgNCwgY2hlY2tzdW0pO1xuXG4gICAgICAgIC8vIG9mZnNldFxuICAgICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDgsIHRhYmxlT2Zmc2V0c1tpXSk7XG4gICAgICAgIC8vIGxlbmd0aFxuICAgICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDEyLCB0YWJsZXNbdGFibGVOYW1lXS5sZW5ndGgpO1xuXG4gICAgICAgIG9mZnNldCArPSBPVEZfVEFCTEVfRU5UUllfU0laRTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWxlO1xuICAgIH0sXG5cbiAgICBhZGRUYWJsZTogZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl9hZGRUYWJsZSh0YWcsIGRhdGEpIHtcbiAgICAgIGlmICh0YWcgaW4gdGhpcy50YWJsZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgXCIgKyB0YWcgKyBcIiBhbHJlYWR5IGV4aXN0c1wiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGFibGVzW3RhZ10gPSBkYXRhO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIE9wZW5UeXBlRmlsZUJ1aWxkZXI7XG59KSgpO1xuXG4vKipcbiAqICdGb250JyBpcyB0aGUgY2xhc3MgdGhlIG91dHNpZGUgd29ybGQgc2hvdWxkIHVzZSwgaXQgZW5jYXBzdWxhdGUgYWxsIHRoZSBmb250XG4gKiBkZWNvZGluZyBsb2dpY3Mgd2hhdGV2ZXIgdHlwZSBpdCBpcyAoYXNzdW1pbmcgdGhlIGZvbnQgdHlwZSBpcyBzdXBwb3J0ZWQpLlxuICpcbiAqIEZvciBleGFtcGxlIHRvIHJlYWQgYSBUeXBlMSBmb250IGFuZCB0byBhdHRhY2ggaXQgdG8gdGhlIGRvY3VtZW50OlxuICogICB2YXIgdHlwZTFGb250ID0gbmV3IEZvbnQoXCJNeUZvbnROYW1lXCIsIGJpbmFyeUZpbGUsIHByb3BlcnRpZXNPYmplY3QpO1xuICogICB0eXBlMUZvbnQuYmluZCgpO1xuICovXG52YXIgRm9udCA9IChmdW5jdGlvbiBGb250Q2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpIHtcbiAgICB2YXIgY2hhckNvZGU7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubG9hZGVkTmFtZSA9IHByb3BlcnRpZXMubG9hZGVkTmFtZTtcbiAgICB0aGlzLmlzVHlwZTNGb250ID0gcHJvcGVydGllcy5pc1R5cGUzRm9udDtcbiAgICB0aGlzLm1pc3NpbmdGaWxlID0gZmFsc2U7XG5cbiAgICB0aGlzLmdseXBoQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdGhpcy5pc1NlcmlmRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBGb250RmxhZ3MuU2VyaWYpO1xuICAgIHRoaXMuaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlN5bWJvbGljKTtcbiAgICB0aGlzLmlzTW9ub3NwYWNlID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5GaXhlZFBpdGNoKTtcblxuICAgIHZhciB0eXBlID0gcHJvcGVydGllcy50eXBlO1xuICAgIHZhciBzdWJ0eXBlID0gcHJvcGVydGllcy5zdWJ0eXBlO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zdWJ0eXBlID0gc3VidHlwZTtcblxuICAgIGxldCBmYWxsYmFja05hbWUgPSBcInNhbnMtc2VyaWZcIjtcbiAgICBpZiAodGhpcy5pc01vbm9zcGFjZSkge1xuICAgICAgZmFsbGJhY2tOYW1lID0gXCJtb25vc3BhY2VcIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZXJpZkZvbnQpIHtcbiAgICAgIGZhbGxiYWNrTmFtZSA9IFwic2VyaWZcIjtcbiAgICB9XG4gICAgdGhpcy5mYWxsYmFja05hbWUgPSBmYWxsYmFja05hbWU7XG5cbiAgICB0aGlzLmRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlcztcbiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzO1xuICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gcHJvcGVydGllcy5kZWZhdWx0V2lkdGg7XG4gICAgdGhpcy5jb21wb3NpdGUgPSBwcm9wZXJ0aWVzLmNvbXBvc2l0ZTtcbiAgICB0aGlzLmNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7XG4gICAgdGhpcy5hc2NlbnQgPSBwcm9wZXJ0aWVzLmFzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUztcbiAgICB0aGlzLmRlc2NlbnQgPSBwcm9wZXJ0aWVzLmRlc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7XG4gICAgdGhpcy5mb250TWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4O1xuICAgIHRoaXMuYmJveCA9IHByb3BlcnRpZXMuYmJveDtcbiAgICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nO1xuXG4gICAgdGhpcy50b1VuaWNvZGUgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZTtcbiAgICB0aGlzLmZhbGxiYWNrVG9Vbmljb2RlID0gcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSB8fCBuZXcgVG9Vbmljb2RlTWFwKCk7XG5cbiAgICB0aGlzLnRvRm9udENoYXIgPSBbXTtcblxuICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09IFwiVHlwZTNcIikge1xuICAgICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7XG4gICAgICAgIHRoaXMudG9Gb250Q2hhcltjaGFyQ29kZV0gPVxuICAgICAgICAgIHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdIHx8IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nW2NoYXJDb2RlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9udFR5cGUgPSBGb250VHlwZS5UWVBFMztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNpZEVuY29kaW5nID0gcHJvcGVydGllcy5jaWRFbmNvZGluZztcbiAgICB0aGlzLnZlcnRpY2FsID0gISFwcm9wZXJ0aWVzLnZlcnRpY2FsO1xuICAgIGlmICh0aGlzLnZlcnRpY2FsKSB7XG4gICAgICB0aGlzLnZtZXRyaWNzID0gcHJvcGVydGllcy52bWV0cmljcztcbiAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7XG4gICAgfVxuXG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuaXNFbXB0eSkge1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgLy8gU29tZSBiYWQgUERGIGdlbmVyYXRvcnMgd2lsbCBpbmNsdWRlIGVtcHR5IGZvbnQgZmlsZXMsXG4gICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gcmVjb3ZlciBieSBhc3N1bWluZyB0aGF0IG5vIGZpbGUgZXhpc3RzLlxuICAgICAgICB3YXJuKCdGb250IGZpbGUgaXMgZW1wdHkgaW4gXCInICsgbmFtZSArICdcIiAoJyArIHRoaXMubG9hZGVkTmFtZSArIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgZm9udCBmaWxlIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB0eXBlL3N1YnR5cGUsIHJhdGhlciB0aGFuXG4gICAgLy8gcmVseWluZyBvbiB0aGUgKG9mdGVuIGluY29ycmVjdCkgZGF0YSBpbiB0aGUgZm9udCBkaWN0aW9uYXJ5OyAoc2VlIGUuZy5cbiAgICAvLyAgaXNzdWU2NzgyLnBkZiwgaXNzdWU3NTk4LnBkZiwgYW5kIGlzc3VlOTk0OS5wZGYpLlxuICAgIFt0eXBlLCBzdWJ0eXBlXSA9IGdldEZvbnRGaWxlVHlwZShmaWxlLCBwcm9wZXJ0aWVzKTtcblxuICAgIGlmICh0eXBlICE9PSB0aGlzLnR5cGUgfHwgc3VidHlwZSAhPT0gdGhpcy5zdWJ0eXBlKSB7XG4gICAgICBpbmZvKFxuICAgICAgICBcIkluY29uc2lzdGVudCBmb250IGZpbGUgVHlwZS9TdWJUeXBlLCBleHBlY3RlZDogXCIgK1xuICAgICAgICAgIGAke3RoaXMudHlwZX0vJHt0aGlzLnN1YnR5cGV9IGJ1dCBmb3VuZDogJHt0eXBlfS8ke3N1YnR5cGV9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBkYXRhO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJNTVR5cGUxXCI6XG4gICAgICAgICAgaW5mbyhcIk1NVHlwZTEgZm9udCAoXCIgKyBuYW1lICsgXCIpLCBmYWxsaW5nIGJhY2sgdG8gVHlwZTEuXCIpO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgXCJUeXBlMVwiOlxuICAgICAgICBjYXNlIFwiQ0lERm9udFR5cGUwXCI6XG4gICAgICAgICAgdGhpcy5taW1ldHlwZSA9IFwiZm9udC9vcGVudHlwZVwiO1xuXG4gICAgICAgICAgdmFyIGNmZiA9XG4gICAgICAgICAgICBzdWJ0eXBlID09PSBcIlR5cGUxQ1wiIHx8IHN1YnR5cGUgPT09IFwiQ0lERm9udFR5cGUwQ1wiXG4gICAgICAgICAgICAgID8gbmV3IENGRkZvbnQoZmlsZSwgcHJvcGVydGllcylcbiAgICAgICAgICAgICAgOiBuZXcgVHlwZTFGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgLy8gV3JhcCB0aGUgQ0ZGIGRhdGEgaW5zaWRlIGFuIE9URiBmb250IGZpbGVcbiAgICAgICAgICBkYXRhID0gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIk9wZW5UeXBlXCI6XG4gICAgICAgIGNhc2UgXCJUcnVlVHlwZVwiOlxuICAgICAgICBjYXNlIFwiQ0lERm9udFR5cGUyXCI6XG4gICAgICAgICAgdGhpcy5taW1ldHlwZSA9IFwiZm9udC9vcGVudHlwZVwiO1xuXG4gICAgICAgICAgLy8gUmVwYWlyIHRoZSBUcnVlVHlwZSBmaWxlLiBJdCBpcyBjYW4gYmUgZGFtYWdlZCBpbiB0aGUgcG9pbnQgb2ZcbiAgICAgICAgICAvLyB2aWV3IG9mIHRoZSBzYW5pdGl6ZXJcbiAgICAgICAgICBkYXRhID0gdGhpcy5jaGVja0FuZFJlcGFpcihuYW1lLCBmaWxlLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICBpZiAodGhpcy5pc09wZW5UeXBlKSB7XG4gICAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7XG5cbiAgICAgICAgICAgIHR5cGUgPSBcIk9wZW5UeXBlXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBGb250ICR7dHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHdhcm4oZSk7XG4gICAgICB0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLmZvbnRUeXBlID0gZ2V0Rm9udFR5cGUodHlwZSwgc3VidHlwZSk7XG5cbiAgICAvLyBUcmFuc2ZlciBzb21lIHByb3BlcnRpZXMgYWdhaW4gdGhhdCBjb3VsZCBjaGFuZ2UgZHVyaW5nIGZvbnQgY29udmVyc2lvblxuICAgIHRoaXMuZm9udE1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeDtcbiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzO1xuICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gcHJvcGVydGllcy5kZWZhdWx0V2lkdGg7XG4gICAgdGhpcy50b1VuaWNvZGUgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZTtcbiAgICB0aGlzLnNlYWNNYXAgPSBwcm9wZXJ0aWVzLnNlYWNNYXA7XG4gIH1cblxuICBmdW5jdGlvbiBpbnQxNihiMCwgYjEpIHtcbiAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZVNpZ25lZEludDE2KGJ5dGVzLCBpbmRleCwgdmFsdWUpIHtcbiAgICBieXRlc1tpbmRleCArIDFdID0gdmFsdWU7XG4gICAgYnl0ZXNbaW5kZXhdID0gdmFsdWUgPj4+IDg7XG4gIH1cblxuICBmdW5jdGlvbiBzaWduZWRJbnQxNihiMCwgYjEpIHtcbiAgICB2YXIgdmFsdWUgPSAoYjAgPDwgOCkgKyBiMTtcbiAgICByZXR1cm4gdmFsdWUgJiAoMSA8PCAxNSkgPyB2YWx1ZSAtIDB4MTAwMDAgOiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludDMyKGIwLCBiMSwgYjIsIGIzKSB7XG4gICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpbmcxNih2YWx1ZSkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCh2YWx1ZSA+PiA4KSAmIDB4ZmYsIHZhbHVlICYgMHhmZik7XG4gIH1cblxuICBmdW5jdGlvbiBzYWZlU3RyaW5nMTYodmFsdWUpIHtcbiAgICAvLyBjbGFtcCB2YWx1ZSB0byB0aGUgMTYtYml0IGludCByYW5nZVxuICAgIGlmICh2YWx1ZSA+IDB4N2ZmZikge1xuICAgICAgdmFsdWUgPSAweDdmZmY7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IC0weDgwMDApIHtcbiAgICAgIHZhbHVlID0gLTB4ODAwMDtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKHZhbHVlID4+IDgpICYgMHhmZiwgdmFsdWUgJiAweGZmKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVHJ1ZVR5cGVGaWxlKGZpbGUpIHtcbiAgICB2YXIgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHJlYWRVaW50MzIoaGVhZGVyLCAwKSA9PT0gMHgwMDAxMDAwMCB8fCBieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09IFwidHJ1ZVwiXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmaWxlKSB7XG4gICAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7XG4gICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoaGVhZGVyKSA9PT0gXCJ0dGNmXCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc09wZW5UeXBlRmlsZShmaWxlKSB7XG4gICAgdmFyIGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpO1xuICAgIHJldHVybiBieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09IFwiT1RUT1wiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNUeXBlMUZpbGUoZmlsZSkge1xuICAgIHZhciBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcygyKTtcbiAgICAvLyBBbGwgVHlwZTEgZm9udCBwcm9ncmFtcyBtdXN0IGJlZ2luIHdpdGggdGhlIGNvbW1lbnQgJyUhJyAoMHgyNSArIDB4MjEpLlxuICAgIGlmIChoZWFkZXJbMF0gPT09IDB4MjUgJiYgaGVhZGVyWzFdID09PSAweDIxKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gLi4uIG9idmlvdXNseSBzb21lIGZvbnRzIHZpb2xhdGUgdGhhdCBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLFxuICAgIC8vIHBsZWFzZSByZWZlciB0byB0aGUgY29tbWVudCBpbiB8VHlwZTFGb250fCBiZWxvdyAocGZiIGZpbGUgaGVhZGVyKS5cbiAgICBpZiAoaGVhZGVyWzBdID09PSAweDgwICYmIGhlYWRlclsxXSA9PT0gMHgwMSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlZCB0byBvdGhlciBmb250IGZvcm1hdHMsIHRoZSBoZWFkZXIgaW4gQ0ZGIGZpbGVzIGlzIG5vdCBjb25zdGFudFxuICAgKiBidXQgY29udGFpbnMgdmVyc2lvbiBudW1iZXJzLiBUbyByZWR1Y2UgdGhlIHBvc3NpYmlsaXR5IG9mIG1pc2NsYXNzaWZ5aW5nXG4gICAqIGZvbnQgZmlsZXMgYXMgQ0ZGLCBpdCdzIHJlY29tbWVuZGVkIHRvIGNoZWNrIGZvciBvdGhlciBmb250IGZvcm1hdHMgZmlyc3QuXG4gICAqL1xuICBmdW5jdGlvbiBpc0NGRkZpbGUoZmlsZSkge1xuICAgIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpO1xuICAgIGlmIChcbiAgICAgIC8qIG1ham9yIHZlcnNpb24sIFsxLCAyNTVdICovIGhlYWRlclswXSA+PSAxICYmXG4gICAgICAvKiBtaW5vciB2ZXJzaW9uLCBbMCwgMjU1XTsgaGVhZGVyWzFdICovXG4gICAgICAvKiBoZWFkZXIgc2l6ZSwgWzAsIDI1NV07IGhlYWRlclsyXSAqL1xuICAgICAgLyogb2Zmc2V0KDApIHNpemUsIFsxLCA0XSAqLyBoZWFkZXJbM10gPj0gMSAmJlxuICAgICAgaGVhZGVyWzNdIDw9IDRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb250RmlsZVR5cGUoZmlsZSwgeyB0eXBlLCBzdWJ0eXBlLCBjb21wb3NpdGUgfSkge1xuICAgIGxldCBmaWxlVHlwZSwgZmlsZVN1YnR5cGU7XG5cbiAgICBpZiAoaXNUcnVlVHlwZUZpbGUoZmlsZSkgfHwgaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpKSB7XG4gICAgICBpZiAoY29tcG9zaXRlKSB7XG4gICAgICAgIGZpbGVUeXBlID0gXCJDSURGb250VHlwZTJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVUeXBlID0gXCJUcnVlVHlwZVwiO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPcGVuVHlwZUZpbGUoZmlsZSkpIHtcbiAgICAgIGlmIChjb21wb3NpdGUpIHtcbiAgICAgICAgZmlsZVR5cGUgPSBcIkNJREZvbnRUeXBlMlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZVR5cGUgPSBcIk9wZW5UeXBlXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1R5cGUxRmlsZShmaWxlKSkge1xuICAgICAgaWYgKGNvbXBvc2l0ZSkge1xuICAgICAgICBmaWxlVHlwZSA9IFwiQ0lERm9udFR5cGUwXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlVHlwZSA9IHR5cGUgPT09IFwiTU1UeXBlMVwiID8gXCJNTVR5cGUxXCIgOiBcIlR5cGUxXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0NGRkZpbGUoZmlsZSkpIHtcbiAgICAgIGlmIChjb21wb3NpdGUpIHtcbiAgICAgICAgZmlsZVR5cGUgPSBcIkNJREZvbnRUeXBlMFwiO1xuICAgICAgICBmaWxlU3VidHlwZSA9IFwiQ0lERm9udFR5cGUwQ1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSBcIk1NVHlwZTFcIiA/IFwiTU1UeXBlMVwiIDogXCJUeXBlMVwiO1xuICAgICAgICBmaWxlU3VidHlwZSA9IFwiVHlwZTFDXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oXCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLlwiKTtcbiAgICAgIGZpbGVUeXBlID0gdHlwZTtcbiAgICAgIGZpbGVTdWJ0eXBlID0gc3VidHlwZTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2ZpbGVUeXBlLCBmaWxlU3VidHlwZV07XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFRvRm9udENoYXIoZW5jb2RpbmcsIGdseXBoc1VuaWNvZGVNYXAsIGRpZmZlcmVuY2VzKSB7XG4gICAgdmFyIHRvRm9udENoYXIgPSBbXSxcbiAgICAgIHVuaWNvZGU7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZW5jb2RpbmcubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChlbmNvZGluZ1tpXSwgZ2x5cGhzVW5pY29kZU1hcCk7XG4gICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHtcbiAgICAgICAgdG9Gb250Q2hhcltpXSA9IHVuaWNvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzKSB7XG4gICAgICB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGRpZmZlcmVuY2VzW2NoYXJDb2RlXSwgZ2x5cGhzVW5pY29kZU1hcCk7XG4gICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHtcbiAgICAgICAgdG9Gb250Q2hhclsrY2hhckNvZGVdID0gdW5pY29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvRm9udENoYXI7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZHMgdGhlIGNoYXIgY29kZSB0byBnbHlwaCBJRCBtYXAgYnkgbW92aW5nIGFsbCBjaGFyIGNvZGVzIHRvIHRoZVxuICAgKiBwcml2YXRlIHVzZSBhcmVhLiBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgaXNzdWVzIHdpdGggdmFyaW91cyBwcm9ibGVtYXRpY1xuICAgKiB1bmljb2RlIGFyZWFzIHdoZXJlIGVpdGhlciBhIGdseXBoIHdvbid0IGJlIGRyYXduIG9yIGlzIGRlZm9ybWVkIGJ5IGFcbiAgICogc2hhcGVyLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUd28gcHJvcGVydGllczpcbiAgICogJ3RvRm9udENoYXInIC0gbWFwcyBvcmlnaW5hbCBjaGFyIGNvZGVzKHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgcmVhZFxuICAgKiBmcm9tIGNvbW1hbmRzIHN1Y2ggYXMgc2hvdyB0ZXh0KSB0byB0aGUgY2hhciBjb2RlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGVcbiAgICogZm9udCB0aGF0IHdlIGJ1aWxkXG4gICAqICdjaGFyQ29kZVRvR2x5cGhJZCcgLSBtYXBzIHRoZSBuZXcgZm9udCBjaGFyIGNvZGVzIHRvIGdseXBoIGlkc1xuICAgKi9cbiAgZnVuY3Rpb24gYWRqdXN0TWFwcGluZyhjaGFyQ29kZVRvR2x5cGhJZCwgaGFzR2x5cGgsIG5ld0dseXBoWmVyb0lkKSB7XG4gICAgdmFyIG5ld01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIHRvRm9udENoYXIgPSBbXTtcbiAgICB2YXIgcHJpdmF0ZVVzZUFyZWFJbmRleCA9IDA7XG4gICAgdmFyIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTtcbiAgICB2YXIgcHJpdmF0ZVVzZU9mZmV0RW5kID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMV07XG4gICAgZm9yICh2YXIgb3JpZ2luYWxDaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkge1xuICAgICAgb3JpZ2luYWxDaGFyQ29kZSB8PSAwO1xuICAgICAgdmFyIGdseXBoSWQgPSBjaGFyQ29kZVRvR2x5cGhJZFtvcmlnaW5hbENoYXJDb2RlXTtcbiAgICAgIC8vIEZvciBtaXNzaW5nIGdseXBocyBkb24ndCBjcmVhdGUgdGhlIG1hcHBpbmdzIHNvIHRoZSBnbHlwaCBpc24ndFxuICAgICAgLy8gZHJhd24uXG4gICAgICBpZiAoIWhhc0dseXBoKGdseXBoSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPiBwcml2YXRlVXNlT2ZmZXRFbmQpIHtcbiAgICAgICAgcHJpdmF0ZVVzZUFyZWFJbmRleCsrO1xuICAgICAgICBpZiAocHJpdmF0ZVVzZUFyZWFJbmRleCA+PSBQUklWQVRFX1VTRV9BUkVBUy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuKFwiUmFuIG91dCBvZiBzcGFjZSBpbiBmb250IHByaXZhdGUgdXNlIGFyZWEuXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTtcbiAgICAgICAgcHJpdmF0ZVVzZU9mZmV0RW5kID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMV07XG4gICAgICB9XG4gICAgICB2YXIgZm9udENoYXJDb2RlID0gbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrO1xuICAgICAgaWYgKGdseXBoSWQgPT09IDApIHtcbiAgICAgICAgZ2x5cGhJZCA9IG5ld0dseXBoWmVyb0lkO1xuICAgICAgfVxuXG4gICAgICBuZXdNYXBbZm9udENoYXJDb2RlXSA9IGdseXBoSWQ7XG4gICAgICB0b0ZvbnRDaGFyW29yaWdpbmFsQ2hhckNvZGVdID0gZm9udENoYXJDb2RlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdG9Gb250Q2hhcixcbiAgICAgIGNoYXJDb2RlVG9HbHlwaElkOiBuZXdNYXAsXG4gICAgICBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSYW5nZXMoZ2x5cGhzLCBudW1HbHlwaHMpIHtcbiAgICAvLyBBcnJheS5zb3J0KCkgc29ydHMgYnkgY2hhcmFjdGVycywgbm90IG51bWVyaWNhbGx5LCBzbyBjb252ZXJ0IHRvIGFuXG4gICAgLy8gYXJyYXkgb2YgY2hhcmFjdGVycy5cbiAgICB2YXIgY29kZXMgPSBbXTtcbiAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBnbHlwaHMpIHtcbiAgICAgIC8vIFJlbW92ZSBhbiBpbnZhbGlkIGdseXBoIElEIG1hcHBpbmdzIHRvIG1ha2UgT1RTIGhhcHB5LlxuICAgICAgaWYgKGdseXBoc1tjaGFyQ29kZV0gPj0gbnVtR2x5cGhzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29kZXMucHVzaCh7IGZvbnRDaGFyQ29kZTogY2hhckNvZGUgfCAwLCBnbHlwaElkOiBnbHlwaHNbY2hhckNvZGVdIH0pO1xuICAgIH1cbiAgICAvLyBTb21lIGZvbnRzIGhhdmUgemVybyBnbHlwaHMgYW5kIGFyZSB1c2VkIG9ubHkgZm9yIHRleHQgc2VsZWN0aW9uLCBidXRcbiAgICAvLyB0aGVyZSBuZWVkcyB0byBiZSBhdCBsZWFzdCBvbmUgdG8gYnVpbGQgYSB2YWxpZCBjbWFwIHRhYmxlLlxuICAgIGlmIChjb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvZGVzLnB1c2goeyBmb250Q2hhckNvZGU6IDAsIGdseXBoSWQ6IDAgfSk7XG4gICAgfVxuICAgIGNvZGVzLnNvcnQoZnVuY3Rpb24gZm9udEdldFJhbmdlc1NvcnQoYSwgYikge1xuICAgICAgcmV0dXJuIGEuZm9udENoYXJDb2RlIC0gYi5mb250Q2hhckNvZGU7XG4gICAgfSk7XG5cbiAgICAvLyBTcGxpdCB0aGUgc29ydGVkIGNvZGVzIGludG8gcmFuZ2VzLlxuICAgIHZhciByYW5nZXMgPSBbXTtcbiAgICB2YXIgbGVuZ3RoID0gY29kZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbGVuZ3RoOyApIHtcbiAgICAgIHZhciBzdGFydCA9IGNvZGVzW25dLmZvbnRDaGFyQ29kZTtcbiAgICAgIHZhciBjb2RlSW5kaWNlcyA9IFtjb2Rlc1tuXS5nbHlwaElkXTtcbiAgICAgICsrbjtcbiAgICAgIHZhciBlbmQgPSBzdGFydDtcbiAgICAgIHdoaWxlIChuIDwgbGVuZ3RoICYmIGVuZCArIDEgPT09IGNvZGVzW25dLmZvbnRDaGFyQ29kZSkge1xuICAgICAgICBjb2RlSW5kaWNlcy5wdXNoKGNvZGVzW25dLmdseXBoSWQpO1xuICAgICAgICArK2VuZDtcbiAgICAgICAgKytuO1xuICAgICAgICBpZiAoZW5kID09PSAweGZmZmYpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmFuZ2VzLnB1c2goW3N0YXJ0LCBlbmQsIGNvZGVJbmRpY2VzXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNtYXBUYWJsZShnbHlwaHMsIG51bUdseXBocykge1xuICAgIHZhciByYW5nZXMgPSBnZXRSYW5nZXMoZ2x5cGhzLCBudW1HbHlwaHMpO1xuICAgIHZhciBudW1UYWJsZXMgPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdWzFdID4gMHhmZmZmID8gMiA6IDE7XG4gICAgdmFyIGNtYXAgPVxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyB2ZXJzaW9uXG4gICAgICBzdHJpbmcxNihudW1UYWJsZXMpICsgLy8gbnVtVGFibGVzXG4gICAgICBcIlxceDAwXFx4MDNcIiArIC8vIHBsYXRmb3JtSURcbiAgICAgIFwiXFx4MDBcXHgwMVwiICsgLy8gZW5jb2RpbmdJRFxuICAgICAgc3RyaW5nMzIoNCArIG51bVRhYmxlcyAqIDgpOyAvLyBzdGFydCBvZiB0aGUgdGFibGUgcmVjb3JkXG5cbiAgICB2YXIgaSwgaWksIGosIGpqO1xuICAgIGZvciAoaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgaWYgKHJhbmdlc1tpXVswXSA8PSAweGZmZmYpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBibXBMZW5ndGggPSBpICsgMTtcblxuICAgIGlmIChyYW5nZXNbaV1bMF0gPCAweGZmZmYgJiYgcmFuZ2VzW2ldWzFdID09PSAweGZmZmYpIHtcbiAgICAgIHJhbmdlc1tpXVsxXSA9IDB4ZmZmZTtcbiAgICB9XG4gICAgdmFyIHRyYWlsaW5nUmFuZ2VzQ291bnQgPSByYW5nZXNbaV1bMV0gPCAweGZmZmYgPyAxIDogMDtcbiAgICB2YXIgc2VnQ291bnQgPSBibXBMZW5ndGggKyB0cmFpbGluZ1Jhbmdlc0NvdW50O1xuICAgIHZhciBzZWFyY2hQYXJhbXMgPSBPcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcyhzZWdDb3VudCwgMik7XG5cbiAgICAvLyBGaWxsIHVwIHRoZSA0IHBhcmFsbGVsIGFycmF5cyBkZXNjcmliaW5nIHRoZSBzZWdtZW50cy5cbiAgICB2YXIgc3RhcnRDb3VudCA9IFwiXCI7XG4gICAgdmFyIGVuZENvdW50ID0gXCJcIjtcbiAgICB2YXIgaWREZWx0YXMgPSBcIlwiO1xuICAgIHZhciBpZFJhbmdlT2Zmc2V0cyA9IFwiXCI7XG4gICAgdmFyIGdseXBoc0lkcyA9IFwiXCI7XG4gICAgdmFyIGJpYXMgPSAwO1xuXG4gICAgdmFyIHJhbmdlLCBzdGFydCwgZW5kLCBjb2RlcztcbiAgICBmb3IgKGkgPSAwLCBpaSA9IGJtcExlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgc3RhcnQgPSByYW5nZVswXTtcbiAgICAgIGVuZCA9IHJhbmdlWzFdO1xuICAgICAgc3RhcnRDb3VudCArPSBzdHJpbmcxNihzdGFydCk7XG4gICAgICBlbmRDb3VudCArPSBzdHJpbmcxNihlbmQpO1xuICAgICAgY29kZXMgPSByYW5nZVsyXTtcbiAgICAgIHZhciBjb250aWd1b3VzID0gdHJ1ZTtcbiAgICAgIGZvciAoaiA9IDEsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgICAgICBpZiAoY29kZXNbal0gIT09IGNvZGVzW2ogLSAxXSArIDEpIHtcbiAgICAgICAgICBjb250aWd1b3VzID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghY29udGlndW91cykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gKHNlZ0NvdW50IC0gaSkgKiAyICsgYmlhcyAqIDI7XG4gICAgICAgIGJpYXMgKz0gZW5kIC0gc3RhcnQgKyAxO1xuXG4gICAgICAgIGlkRGVsdGFzICs9IHN0cmluZzE2KDApO1xuICAgICAgICBpZFJhbmdlT2Zmc2V0cyArPSBzdHJpbmcxNihvZmZzZXQpO1xuXG4gICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgICAgICAgIGdseXBoc0lkcyArPSBzdHJpbmcxNihjb2Rlc1tqXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzdGFydENvZGUgPSBjb2Rlc1swXTtcblxuICAgICAgICBpZERlbHRhcyArPSBzdHJpbmcxNigoc3RhcnRDb2RlIC0gc3RhcnQpICYgMHhmZmZmKTtcbiAgICAgICAgaWRSYW5nZU9mZnNldHMgKz0gc3RyaW5nMTYoMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRyYWlsaW5nUmFuZ2VzQ291bnQgPiAwKSB7XG4gICAgICBlbmRDb3VudCArPSBcIlxceEZGXFx4RkZcIjtcbiAgICAgIHN0YXJ0Q291bnQgKz0gXCJcXHhGRlxceEZGXCI7XG4gICAgICBpZERlbHRhcyArPSBcIlxceDAwXFx4MDFcIjtcbiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IFwiXFx4MDBcXHgwMFwiO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQzMTQgPVxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyBsYW5ndWFnZVxuICAgICAgc3RyaW5nMTYoMiAqIHNlZ0NvdW50KSArXG4gICAgICBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2UpICtcbiAgICAgIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5lbnRyeSkgK1xuICAgICAgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLnJhbmdlU2hpZnQpICtcbiAgICAgIGVuZENvdW50ICtcbiAgICAgIFwiXFx4MDBcXHgwMFwiICtcbiAgICAgIHN0YXJ0Q291bnQgK1xuICAgICAgaWREZWx0YXMgK1xuICAgICAgaWRSYW5nZU9mZnNldHMgK1xuICAgICAgZ2x5cGhzSWRzO1xuXG4gICAgdmFyIGZvcm1hdDMxMDEyID0gXCJcIjtcbiAgICB2YXIgaGVhZGVyMzEwMTIgPSBcIlwiO1xuICAgIGlmIChudW1UYWJsZXMgPiAxKSB7XG4gICAgICBjbWFwICs9XG4gICAgICAgIFwiXFx4MDBcXHgwM1wiICsgLy8gcGxhdGZvcm1JRFxuICAgICAgICBcIlxceDAwXFx4MEFcIiArIC8vIGVuY29kaW5nSURcbiAgICAgICAgc3RyaW5nMzIoNCArIG51bVRhYmxlcyAqIDggKyA0ICsgZm9ybWF0MzE0Lmxlbmd0aCk7IC8vIHN0YXJ0IG9mIHRoZSB0YWJsZSByZWNvcmRcbiAgICAgIGZvcm1hdDMxMDEyID0gXCJcIjtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gcmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgIHN0YXJ0ID0gcmFuZ2VbMF07XG4gICAgICAgIGNvZGVzID0gcmFuZ2VbMl07XG4gICAgICAgIHZhciBjb2RlID0gY29kZXNbMF07XG4gICAgICAgIGZvciAoaiA9IDEsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgICAgICAgIGlmIChjb2Rlc1tqXSAhPT0gY29kZXNbaiAtIDFdICsgMSkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2VbMF0gKyBqIC0gMTtcbiAgICAgICAgICAgIGZvcm1hdDMxMDEyICs9XG4gICAgICAgICAgICAgIHN0cmluZzMyKHN0YXJ0KSArIC8vIHN0YXJ0Q2hhckNvZGVcbiAgICAgICAgICAgICAgc3RyaW5nMzIoZW5kKSArIC8vIGVuZENoYXJDb2RlXG4gICAgICAgICAgICAgIHN0cmluZzMyKGNvZGUpOyAvLyBzdGFydEdseXBoSURcbiAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTtcbiAgICAgICAgICAgIGNvZGUgPSBjb2Rlc1tqXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9ybWF0MzEwMTIgKz1cbiAgICAgICAgICBzdHJpbmczMihzdGFydCkgKyAvLyBzdGFydENoYXJDb2RlXG4gICAgICAgICAgc3RyaW5nMzIocmFuZ2VbMV0pICsgLy8gZW5kQ2hhckNvZGVcbiAgICAgICAgICBzdHJpbmczMihjb2RlKTsgLy8gc3RhcnRHbHlwaElEXG4gICAgICB9XG4gICAgICBoZWFkZXIzMTAxMiA9XG4gICAgICAgIFwiXFx4MDBcXHgwQ1wiICsgLy8gZm9ybWF0XG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gcmVzZXJ2ZWRcbiAgICAgICAgc3RyaW5nMzIoZm9ybWF0MzEwMTIubGVuZ3RoICsgMTYpICsgLy8gbGVuZ3RoXG4gICAgICAgIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcIiArIC8vIGxhbmd1YWdlXG4gICAgICAgIHN0cmluZzMyKGZvcm1hdDMxMDEyLmxlbmd0aCAvIDEyKTsgLy8gbkdyb3Vwc1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjbWFwICtcbiAgICAgIFwiXFx4MDBcXHgwNFwiICsgLy8gZm9ybWF0XG4gICAgICBzdHJpbmcxNihmb3JtYXQzMTQubGVuZ3RoICsgNCkgKyAvLyBsZW5ndGhcbiAgICAgIGZvcm1hdDMxNCArXG4gICAgICBoZWFkZXIzMTAxMiArXG4gICAgICBmb3JtYXQzMTAxMlxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZU9TMlRhYmxlKG9zMiwgZmlsZSkge1xuICAgIGZpbGUucG9zID0gKGZpbGUuc3RhcnQgfHwgMCkgKyBvczIub2Zmc2V0O1xuICAgIHZhciB2ZXJzaW9uID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAvLyBUT0RPIHZlcmlmeSBhbGwgT1MvMiB0YWJsZXMgZmllbGRzLCBidXQgY3VycmVudGx5IHdlIHZhbGlkYXRlIG9ubHkgdGhvc2VcbiAgICAvLyB0aGF0IGdpdmUgdXMgaXNzdWVzXG4gICAgZmlsZS5za2lwKDYwKTsgLy8gc2tpcHBpbmcgdHlwZSwgbWlzYyBzaXplcywgcGFub3NlLCB1bmljb2RlIHJhbmdlc1xuICAgIHZhciBzZWxlY3Rpb24gPSBmaWxlLmdldFVpbnQxNigpO1xuICAgIGlmICh2ZXJzaW9uIDwgNCAmJiBzZWxlY3Rpb24gJiAweDAzMDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGZpcnN0Q2hhciA9IGZpbGUuZ2V0VWludDE2KCk7XG4gICAgdmFyIGxhc3RDaGFyID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICBpZiAoZmlyc3RDaGFyID4gbGFzdENoYXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZmlsZS5za2lwKDYpOyAvLyBza2lwcGluZyBzVHlwb0FzY2VuZGVyL0Rlc2NlbmRlci9MaW5lR2FwXG4gICAgdmFyIHVzV2luQXNjZW50ID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICBpZiAodXNXaW5Bc2NlbnQgPT09IDApIHtcbiAgICAgIC8vIG1ha2VzIGZvbnQgdW5yZWFkYWJsZSBieSB3aW5kb3dzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT1MvMiBhcHBlYXJzIHRvIGJlIHZhbGlkLCByZXNldHRpbmcgc29tZSBmaWVsZHNcbiAgICBvczIuZGF0YVs4XSA9IG9zMi5kYXRhWzldID0gMDsgLy8gSUUgcmVqZWN0cyBmb250cyBpZiBmc1R5cGUgIT0gMFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgY2hhcnN0cmluZ3MsIG92ZXJyaWRlKSB7XG4gICAgb3ZlcnJpZGUgPSBvdmVycmlkZSB8fCB7XG4gICAgICB1bml0c1BlckVtOiAwLFxuICAgICAgeU1heDogMCxcbiAgICAgIHlNaW46IDAsXG4gICAgICBhc2NlbnQ6IDAsXG4gICAgICBkZXNjZW50OiAwLFxuICAgIH07XG5cbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UxID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UyID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UzID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2U0ID0gMDtcblxuICAgIHZhciBmaXJzdENoYXJJbmRleCA9IG51bGw7XG4gICAgdmFyIGxhc3RDaGFySW5kZXggPSAwO1xuXG4gICAgaWYgKGNoYXJzdHJpbmdzKSB7XG4gICAgICBmb3IgKHZhciBjb2RlIGluIGNoYXJzdHJpbmdzKSB7XG4gICAgICAgIGNvZGUgfD0gMDtcbiAgICAgICAgaWYgKGZpcnN0Q2hhckluZGV4ID4gY29kZSB8fCAhZmlyc3RDaGFySW5kZXgpIHtcbiAgICAgICAgICBmaXJzdENoYXJJbmRleCA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RDaGFySW5kZXggPCBjb2RlKSB7XG4gICAgICAgICAgbGFzdENoYXJJbmRleCA9IGNvZGU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9zaXRpb24gPSBnZXRVbmljb2RlUmFuZ2VGb3IoY29kZSk7XG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDMyKSB7XG4gICAgICAgICAgdWxVbmljb2RlUmFuZ2UxIHw9IDEgPDwgcG9zaXRpb247XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCA2NCkge1xuICAgICAgICAgIHVsVW5pY29kZVJhbmdlMiB8PSAxIDw8IChwb3NpdGlvbiAtIDMyKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDk2KSB7XG4gICAgICAgICAgdWxVbmljb2RlUmFuZ2UzIHw9IDEgPDwgKHBvc2l0aW9uIC0gNjQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgMTIzKSB7XG4gICAgICAgICAgdWxVbmljb2RlUmFuZ2U0IHw9IDEgPDwgKHBvc2l0aW9uIC0gOTYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgICAgIFwiVW5pY29kZSByYW5nZXMgQml0cyA+IDEyMyBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobGFzdENoYXJJbmRleCA+IDB4ZmZmZikge1xuICAgICAgICAvLyBPUzIgb25seSBzdXBwb3J0cyBhIDE2IGJpdCBpbnQuIFRoZSBzcGVjIHNheXMgaWYgc3VwcGxlbWVudGFyeVxuICAgICAgICAvLyBjaGFyYWN0ZXJzIGFyZSB1c2VkIHRoZSBmaWVsZCBzaG91bGQganVzdCBiZSBzZXQgdG8gMHhGRkZGLlxuICAgICAgICBsYXN0Q2hhckluZGV4ID0gMHhmZmZmO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPXG4gICAgICBmaXJzdENoYXJJbmRleCA9IDA7XG4gICAgICBsYXN0Q2hhckluZGV4ID0gMjU1O1xuICAgIH1cblxuICAgIHZhciBiYm94ID0gcHJvcGVydGllcy5iYm94IHx8IFswLCAwLCAwLCAwXTtcbiAgICB2YXIgdW5pdHNQZXJFbSA9XG4gICAgICBvdmVycmlkZS51bml0c1BlckVtIHx8XG4gICAgICAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWClbMF07XG5cbiAgICAvLyBpZiB0aGUgZm9udCB1bml0cyBkaWZmZXIgdG8gdGhlIFBERiBnbHlwaCBzcGFjZSB1bml0c1xuICAgIC8vIHRoZW4gc2NhbGUgdXAgdGhlIHZhbHVlc1xuICAgIHZhciBzY2FsZSA9IHByb3BlcnRpZXMuYXNjZW50U2NhbGVkXG4gICAgICA/IDEuMFxuICAgICAgOiB1bml0c1BlckVtIC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTO1xuXG4gICAgdmFyIHR5cG9Bc2NlbnQgPVxuICAgICAgb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpO1xuICAgIHZhciB0eXBvRGVzY2VudCA9XG4gICAgICBvdmVycmlkZS5kZXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5kZXNjZW50IHx8IGJib3hbMV0pKTtcbiAgICBpZiAodHlwb0Rlc2NlbnQgPiAwICYmIHByb3BlcnRpZXMuZGVzY2VudCA+IDAgJiYgYmJveFsxXSA8IDApIHtcbiAgICAgIHR5cG9EZXNjZW50ID0gLXR5cG9EZXNjZW50OyAvLyBmaXhpbmcgaW5jb3JyZWN0IGRlc2NlbnRcbiAgICB9XG4gICAgdmFyIHdpbkFzY2VudCA9IG92ZXJyaWRlLnlNYXggfHwgdHlwb0FzY2VudDtcbiAgICB2YXIgd2luRGVzY2VudCA9IC1vdmVycmlkZS55TWluIHx8IC10eXBvRGVzY2VudDtcblxuICAgIHJldHVybiAoXG4gICAgICBcIlxceDAwXFx4MDNcIiArIC8vIHZlcnNpb25cbiAgICAgIFwiXFx4MDJcXHgyNFwiICsgLy8geEF2Z0NoYXJXaWR0aFxuICAgICAgXCJcXHgwMVxceEY0XCIgKyAvLyB1c1dlaWdodENsYXNzXG4gICAgICBcIlxceDAwXFx4MDVcIiArIC8vIHVzV2lkdGhDbGFzc1xuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyBmc3R5cGUgKDAgdG8gbGV0IHRoZSBmb250IGxvYWRzIHZpYSBmb250LWZhY2Ugb24gSUUpXG4gICAgICBcIlxceDAyXFx4OEFcIiArIC8vIHlTdWJzY3JpcHRYU2l6ZVxuICAgICAgXCJcXHgwMlxceEJCXCIgKyAvLyB5U3Vic2NyaXB0WVNpemVcbiAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8geVN1YnNjcmlwdFhPZmZzZXRcbiAgICAgIFwiXFx4MDBcXHg4Q1wiICsgLy8geVN1YnNjcmlwdFlPZmZzZXRcbiAgICAgIFwiXFx4MDJcXHg4QVwiICsgLy8geVN1cGVyU2NyaXB0WFNpemVcbiAgICAgIFwiXFx4MDJcXHhCQlwiICsgLy8geVN1cGVyU2NyaXB0WVNpemVcbiAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8geVN1cGVyU2NyaXB0WE9mZnNldFxuICAgICAgXCJcXHgwMVxceERGXCIgKyAvLyB5U3VwZXJTY3JpcHRZT2Zmc2V0XG4gICAgICBcIlxceDAwXFx4MzFcIiArIC8vIHlTdHJpa2VPdXRTaXplXG4gICAgICBcIlxceDAxXFx4MDJcIiArIC8vIHlTdHJpa2VPdXRQb3NpdGlvblxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyBzRmFtaWx5Q2xhc3NcbiAgICAgIFwiXFx4MDBcXHgwMFxceDA2XCIgK1xuICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZShwcm9wZXJ0aWVzLmZpeGVkUGl0Y2ggPyAweDA5IDogMHgwMCkgK1xuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcIiArIC8vIFBhbm9zZVxuICAgICAgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2UxKSArIC8vIHVsVW5pY29kZVJhbmdlMSAoQml0cyAwLTMxKVxuICAgICAgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2UyKSArIC8vIHVsVW5pY29kZVJhbmdlMiAoQml0cyAzMi02MylcbiAgICAgIHN0cmluZzMyKHVsVW5pY29kZVJhbmdlMykgKyAvLyB1bFVuaWNvZGVSYW5nZTMgKEJpdHMgNjQtOTUpXG4gICAgICBzdHJpbmczMih1bFVuaWNvZGVSYW5nZTQpICsgLy8gdWxVbmljb2RlUmFuZ2U0IChCaXRzIDk2LTEyNylcbiAgICAgIFwiXFx4MkFcXHgzMlxceDMxXFx4MkFcIiArIC8vIGFjaFZlbmRJRFxuICAgICAgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDEgOiAwKSArIC8vIGZzU2VsZWN0aW9uXG4gICAgICBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyAvLyB1c0ZpcnN0Q2hhckluZGV4XG4gICAgICBzdHJpbmcxNihsYXN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMubGFzdENoYXIpICsgLy8gdXNMYXN0Q2hhckluZGV4XG4gICAgICBzdHJpbmcxNih0eXBvQXNjZW50KSArIC8vIHNUeXBvQXNjZW5kZXJcbiAgICAgIHN0cmluZzE2KHR5cG9EZXNjZW50KSArIC8vIHNUeXBvRGVzY2VuZGVyXG4gICAgICBcIlxceDAwXFx4NjRcIiArIC8vIHNUeXBvTGluZUdhcCAoNyUtMTAlIG9mIHRoZSB1bml0c1BlckVNIHZhbHVlKVxuICAgICAgc3RyaW5nMTYod2luQXNjZW50KSArIC8vIHVzV2luQXNjZW50XG4gICAgICBzdHJpbmcxNih3aW5EZXNjZW50KSArIC8vIHVzV2luRGVzY2VudFxuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiICsgLy8gdWxDb2RlUGFnZVJhbmdlMSAoQml0cyAwLTMxKVxuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiICsgLy8gdWxDb2RlUGFnZVJhbmdlMiAoQml0cyAzMi02MylcbiAgICAgIHN0cmluZzE2KHByb3BlcnRpZXMueEhlaWdodCkgKyAvLyBzeEhlaWdodFxuICAgICAgc3RyaW5nMTYocHJvcGVydGllcy5jYXBIZWlnaHQpICsgLy8gc0NhcEhlaWdodFxuICAgICAgc3RyaW5nMTYoMCkgKyAvLyB1c0RlZmF1bHRDaGFyXG4gICAgICBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyAvLyB1c0JyZWFrQ2hhclxuICAgICAgXCJcXHgwMFxceDAzXCJcbiAgICApOyAvLyB1c01heENvbnRleHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBvc3RUYWJsZShwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGFuZ2xlID0gTWF0aC5mbG9vcihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlICogMiAqKiAxNik7XG4gICAgcmV0dXJuIChcbiAgICAgIFwiXFx4MDBcXHgwM1xceDAwXFx4MDBcIiArIC8vIFZlcnNpb24gbnVtYmVyXG4gICAgICBzdHJpbmczMihhbmdsZSkgKyAvLyBpdGFsaWNBbmdsZVxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyB1bmRlcmxpbmVQb3NpdGlvblxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyB1bmRlcmxpbmVUaGlja25lc3NcbiAgICAgIHN0cmluZzMyKHByb3BlcnRpZXMuZml4ZWRQaXRjaCkgKyAvLyBpc0ZpeGVkUGl0Y2hcbiAgICAgIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcIiArIC8vIG1pbk1lbVR5cGU0MlxuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiICsgLy8gbWF4TWVtVHlwZTQyXG4gICAgICBcIlxceDAwXFx4MDBcXHgwMFxceDAwXCIgKyAvLyBtaW5NZW1UeXBlMVxuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiXG4gICAgKTsgLy8gbWF4TWVtVHlwZTFcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykge1xuICAgIGlmICghcHJvdG8pIHtcbiAgICAgIHByb3RvID0gW1tdLCBbXV07IC8vIG5vIHN0cmluZ3MgYW5kIHVuaWNvZGUgc3RyaW5nc1xuICAgIH1cblxuICAgIHZhciBzdHJpbmdzID0gW1xuICAgICAgcHJvdG9bMF1bMF0gfHwgXCJPcmlnaW5hbCBsaWNlbmNlXCIsIC8vIDAuQ29weXJpZ2h0XG4gICAgICBwcm90b1swXVsxXSB8fCBuYW1lLCAvLyAxLkZvbnQgZmFtaWx5XG4gICAgICBwcm90b1swXVsyXSB8fCBcIlVua25vd25cIiwgLy8gMi5Gb250IHN1YmZhbWlseSAoZm9udCB3ZWlnaHQpXG4gICAgICBwcm90b1swXVszXSB8fCBcInVuaXF1ZUlEXCIsIC8vIDMuVW5pcXVlIElEXG4gICAgICBwcm90b1swXVs0XSB8fCBuYW1lLCAvLyA0LkZ1bGwgZm9udCBuYW1lXG4gICAgICBwcm90b1swXVs1XSB8fCBcIlZlcnNpb24gMC4xMVwiLCAvLyA1LlZlcnNpb25cbiAgICAgIHByb3RvWzBdWzZdIHx8IFwiXCIsIC8vIDYuUG9zdHNjcmlwdCBuYW1lXG4gICAgICBwcm90b1swXVs3XSB8fCBcIlVua25vd25cIiwgLy8gNy5UcmFkZW1hcmtcbiAgICAgIHByb3RvWzBdWzhdIHx8IFwiVW5rbm93blwiLCAvLyA4Lk1hbnVmYWN0dXJlclxuICAgICAgcHJvdG9bMF1bOV0gfHwgXCJVbmtub3duXCIsIC8vIDkuRGVzaWduZXJcbiAgICBdO1xuXG4gICAgLy8gTWFjIHdhbnQgMS1ieXRlIHBlciBjaGFyYWN0ZXIgc3RyaW5ncyB3aGlsZSBXaW5kb3dzIHdhbnRcbiAgICAvLyAyLWJ5dGVzIHBlciBjaGFyYWN0ZXIsIHNvIGR1cGxpY2F0ZSB0aGUgbmFtZXMgdGFibGVcbiAgICB2YXIgc3RyaW5nc1VuaWNvZGUgPSBbXTtcbiAgICB2YXIgaSwgaWksIGosIGpqLCBzdHI7XG4gICAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07XG5cbiAgICAgIHZhciBzdHJCdWZVbmljb2RlID0gW107XG4gICAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpO1xuICAgICAgfVxuICAgICAgc3RyaW5nc1VuaWNvZGUucHVzaChzdHJCdWZVbmljb2RlLmpvaW4oXCJcIikpO1xuICAgIH1cblxuICAgIHZhciBuYW1lcyA9IFtzdHJpbmdzLCBzdHJpbmdzVW5pY29kZV07XG4gICAgdmFyIHBsYXRmb3JtcyA9IFtcIlxceDAwXFx4MDFcIiwgXCJcXHgwMFxceDAzXCJdO1xuICAgIHZhciBlbmNvZGluZ3MgPSBbXCJcXHgwMFxceDAwXCIsIFwiXFx4MDBcXHgwMVwiXTtcbiAgICB2YXIgbGFuZ3VhZ2VzID0gW1wiXFx4MDBcXHgwMFwiLCBcIlxceDA0XFx4MDlcIl07XG5cbiAgICB2YXIgbmFtZXNSZWNvcmRDb3VudCA9IHN0cmluZ3MubGVuZ3RoICogcGxhdGZvcm1zLmxlbmd0aDtcbiAgICB2YXIgbmFtZVRhYmxlID1cbiAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gZm9ybWF0XG4gICAgICBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIC8vIE51bWJlciBvZiBuYW1lcyBSZWNvcmRcbiAgICAgIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOyAvLyBTdG9yYWdlXG5cbiAgICAvLyBCdWlsZCB0aGUgbmFtZSByZWNvcmRzIGZpZWxkXG4gICAgdmFyIHN0ck9mZnNldCA9IDA7XG4gICAgZm9yIChpID0gMCwgaWkgPSBwbGF0Zm9ybXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHN0cnMgPSBuYW1lc1tpXTtcbiAgICAgIGZvciAoaiA9IDAsIGpqID0gc3Rycy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHN0ciA9IHN0cnNbal07XG4gICAgICAgIHZhciBuYW1lUmVjb3JkID1cbiAgICAgICAgICBwbGF0Zm9ybXNbaV0gKyAvLyBwbGF0Zm9ybSBJRFxuICAgICAgICAgIGVuY29kaW5nc1tpXSArIC8vIGVuY29kaW5nIElEXG4gICAgICAgICAgbGFuZ3VhZ2VzW2ldICsgLy8gbGFuZ3VhZ2UgSURcbiAgICAgICAgICBzdHJpbmcxNihqKSArIC8vIG5hbWUgSURcbiAgICAgICAgICBzdHJpbmcxNihzdHIubGVuZ3RoKSArXG4gICAgICAgICAgc3RyaW5nMTYoc3RyT2Zmc2V0KTtcbiAgICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7XG4gICAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5hbWVUYWJsZSArPSBzdHJpbmdzLmpvaW4oXCJcIikgKyBzdHJpbmdzVW5pY29kZS5qb2luKFwiXCIpO1xuICAgIHJldHVybiBuYW1lVGFibGU7XG4gIH1cblxuICBGb250LnByb3RvdHlwZSA9IHtcbiAgICBuYW1lOiBudWxsLFxuICAgIGZvbnQ6IG51bGwsXG4gICAgbWltZXR5cGU6IG51bGwsXG4gICAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSxcblxuICAgIGdldCByZW5kZXJlcigpIHtcbiAgICAgIHZhciByZW5kZXJlciA9IEZvbnRSZW5kZXJlckZhY3RvcnkuY3JlYXRlKHRoaXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicmVuZGVyZXJcIiwgcmVuZGVyZXIpO1xuICAgIH0sXG5cbiAgICBleHBvcnREYXRhKGV4dHJhUHJvcGVydGllcyA9IGZhbHNlKSB7XG4gICAgICBjb25zdCBleHBvcnREYXRhUHJvcGVydGllcyA9IGV4dHJhUHJvcGVydGllc1xuICAgICAgICA/IFsuLi5FWFBPUlRfREFUQV9QUk9QRVJUSUVTLCAuLi5FWFBPUlRfREFUQV9FWFRSQV9QUk9QRVJUSUVTXVxuICAgICAgICA6IEVYUE9SVF9EQVRBX1BST1BFUlRJRVM7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgbGV0IHByb3BlcnR5LCB2YWx1ZTtcbiAgICAgIGZvciAocHJvcGVydHkgb2YgZXhwb3J0RGF0YVByb3BlcnRpZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzW3Byb3BlcnR5XTtcbiAgICAgICAgLy8gSWdub3JlIHByb3BlcnRpZXMgdGhhdCBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBzZXQuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIGZhbGxiYWNrVG9TeXN0ZW1Gb250OiBmdW5jdGlvbiBGb250X2ZhbGxiYWNrVG9TeXN0ZW1Gb250KCkge1xuICAgICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7XG4gICAgICAvLyBUaGUgZmlsZSBkYXRhIGlzIG5vdCBzcGVjaWZpZWQuIFRyeWluZyB0byBmaXggdGhlIGZvbnQgbmFtZVxuICAgICAgLy8gdG8gYmUgdXNlZCB3aXRoIHRoZSBjYW52YXMuZm9udC5cbiAgICAgIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICB2YXIgc3VidHlwZSA9IHRoaXMuc3VidHlwZTtcbiAgICAgIGxldCBmb250TmFtZSA9IG5hbWUucmVwbGFjZSgvWyxfXS9nLCBcIi1cIikucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xuICAgICAgdmFyIHN0ZEZvbnRNYXAgPSBnZXRTdGRGb250TWFwKCksXG4gICAgICAgIG5vblN0ZEZvbnRNYXAgPSBnZXROb25TdGRGb250TWFwKCk7XG4gICAgICB2YXIgaXNTdGFuZGFyZEZvbnQgPVxuICAgICAgICAhIXN0ZEZvbnRNYXBbZm9udE5hbWVdIHx8XG4gICAgICAgICEhKG5vblN0ZEZvbnRNYXBbZm9udE5hbWVdICYmIHN0ZEZvbnRNYXBbbm9uU3RkRm9udE1hcFtmb250TmFtZV1dKTtcbiAgICAgIGZvbnROYW1lID0gc3RkRm9udE1hcFtmb250TmFtZV0gfHwgbm9uU3RkRm9udE1hcFtmb250TmFtZV0gfHwgZm9udE5hbWU7XG5cbiAgICAgIHRoaXMuYm9sZCA9IGZvbnROYW1lLnNlYXJjaCgvYm9sZC9naSkgIT09IC0xO1xuICAgICAgdGhpcy5pdGFsaWMgPVxuICAgICAgICBmb250TmFtZS5zZWFyY2goL29ibGlxdWUvZ2kpICE9PSAtMSB8fFxuICAgICAgICBmb250TmFtZS5zZWFyY2goL2l0YWxpYy9naSkgIT09IC0xO1xuXG4gICAgICAvLyBVc2UgJ25hbWUnIGluc3RlYWQgb2YgJ2ZvbnROYW1lJyBoZXJlIGJlY2F1c2UgdGhlIG9yaWdpbmFsXG4gICAgICAvLyBuYW1lIEFyaWFsQmxhY2sgZm9yIGV4YW1wbGUgd2lsbCBiZSByZXBsYWNlZCBieSBIZWx2ZXRpY2EuXG4gICAgICB0aGlzLmJsYWNrID0gbmFtZS5zZWFyY2goL0JsYWNrL2cpICE9PSAtMTtcblxuICAgICAgLy8gaWYgYXQgbGVhc3Qgb25lIHdpZHRoIGlzIHByZXNlbnQsIHJlbWVhc3VyZSBhbGwgY2hhcnMgd2hlbiBleGlzdHNcbiAgICAgIHRoaXMucmVtZWFzdXJlID0gT2JqZWN0LmtleXModGhpcy53aWR0aHMpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoXG4gICAgICAgIGlzU3RhbmRhcmRGb250ICYmXG4gICAgICAgIHR5cGUgPT09IFwiQ0lERm9udFR5cGUyXCIgJiZcbiAgICAgICAgdGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKFwiSWRlbnRpdHktXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgR2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzID0gZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzKCk7XG4gICAgICAgIC8vIFN0YW5kYXJkIGZvbnRzIG1pZ2h0IGJlIGVtYmVkZGVkIGFzIENJRCBmb250IHdpdGhvdXQgZ2x5cGggbWFwcGluZy5cbiAgICAgICAgLy8gQnVpbGRpbmcgb25lIGJhc2VkIG9uIEdseXBoTWFwRm9yU3RhbmRhcmRGb250cy5cbiAgICAgICAgY29uc3QgbWFwID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gR2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzKSB7XG4gICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHNbY2hhckNvZGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvQXJpYWwtP0JsYWNrL2kudGVzdChuYW1lKSkge1xuICAgICAgICAgIHZhciBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2soKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaykge1xuICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2tbY2hhckNvZGVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgvQ2FsaWJyaS9pLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSkge1xuICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmlbY2hhckNvZGVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpc0lkZW50aXR5VW5pY29kZSA9IHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXA7XG4gICAgICAgIGlmICghaXNJZGVudGl0eVVuaWNvZGUpIHtcbiAgICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSB7XG4gICAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBtYXA7XG4gICAgICAgIHRoaXMudG9Vbmljb2RlID0gbmV3IFRvVW5pY29kZU1hcChtYXApO1xuICAgICAgfSBlbHNlIGlmICgvU3ltYm9sL2kudGVzdChmb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKFxuICAgICAgICAgIFN5bWJvbFNldEVuY29kaW5nLFxuICAgICAgICAgIGdldEdseXBoc1VuaWNvZGUoKSxcbiAgICAgICAgICB0aGlzLmRpZmZlcmVuY2VzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKC9EaW5nYmF0cy9pLnRlc3QoZm9udE5hbWUpKSB7XG4gICAgICAgIGlmICgvV2luZ2RpbmdzL2kudGVzdChuYW1lKSkge1xuICAgICAgICAgIHdhcm4oXCJOb24tZW1iZWRkZWQgV2luZ2RpbmdzIGZvbnQsIGZhbGxpbmcgYmFjayB0byBaYXBmRGluZ2JhdHMuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihcbiAgICAgICAgICBaYXBmRGluZ2JhdHNFbmNvZGluZyxcbiAgICAgICAgICBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUoKSxcbiAgICAgICAgICB0aGlzLmRpZmZlcmVuY2VzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RhbmRhcmRGb250KSB7XG4gICAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihcbiAgICAgICAgICB0aGlzLmRlZmF1bHRFbmNvZGluZyxcbiAgICAgICAgICBnZXRHbHlwaHNVbmljb2RlKCksXG4gICAgICAgICAgdGhpcy5kaWZmZXJlbmNlc1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTtcbiAgICAgICAgY29uc3QgbWFwID0gW107XG4gICAgICAgIHRoaXMudG9Vbmljb2RlLmZvckVhY2goKGNoYXJDb2RlLCB1bmljb2RlQ2hhckNvZGUpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29tcG9zaXRlKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGhOYW1lID1cbiAgICAgICAgICAgICAgdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhckNvZGVdO1xuICAgICAgICAgICAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApO1xuICAgICAgICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7XG4gICAgICAgICAgICAgIHVuaWNvZGVDaGFyQ29kZSA9IHVuaWNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGltcHJvdmUgdGhlIGdseXBoIG1hcHBpbmcgZm9yIChzb21lKSBjb21wb3NpdGUgZm9udHMgdGhhdFxuICAgICAgICAvLyBhcHBlYXIgdG8gbGFjayBtZWFuaW5nZnVsIFRvVW5pY29kZSBkYXRhLlxuICAgICAgICBpZiAodGhpcy5jb21wb3NpdGUgJiYgdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkge1xuICAgICAgICAgIGlmICgvVmVyZGFuYS9pLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEZpeGVzIGlzc3VlMTEyNDJfcmVkdWNlZC5wZGZcbiAgICAgICAgICAgIGNvbnN0IEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cygpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMpIHtcbiAgICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHNbY2hhckNvZGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBtYXA7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRlZE5hbWUgPSBmb250TmFtZS5zcGxpdChcIi1cIilbMF07XG4gICAgICB0aGlzLmZvbnRUeXBlID0gZ2V0Rm9udFR5cGUodHlwZSwgc3VidHlwZSk7XG4gICAgfSxcblxuICAgIGNoZWNrQW5kUmVwYWlyOiBmdW5jdGlvbiBGb250X2NoZWNrQW5kUmVwYWlyKG5hbWUsIGZvbnQsIHByb3BlcnRpZXMpIHtcbiAgICAgIGNvbnN0IFZBTElEX1RBQkxFUyA9IFtcbiAgICAgICAgXCJPUy8yXCIsXG4gICAgICAgIFwiY21hcFwiLFxuICAgICAgICBcImhlYWRcIixcbiAgICAgICAgXCJoaGVhXCIsXG4gICAgICAgIFwiaG10eFwiLFxuICAgICAgICBcIm1heHBcIixcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgIFwicG9zdFwiLFxuICAgICAgICBcImxvY2FcIixcbiAgICAgICAgXCJnbHlmXCIsXG4gICAgICAgIFwiZnBnbVwiLFxuICAgICAgICBcInByZXBcIixcbiAgICAgICAgXCJjdnQgXCIsXG4gICAgICAgIFwiQ0ZGIFwiLFxuICAgICAgXTtcblxuICAgICAgZnVuY3Rpb24gcmVhZFRhYmxlcyhmaWxlLCBudW1UYWJsZXMpIHtcbiAgICAgICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGFibGVzW1wiT1MvMlwiXSA9IG51bGw7XG4gICAgICAgIHRhYmxlcy5jbWFwID0gbnVsbDtcbiAgICAgICAgdGFibGVzLmhlYWQgPSBudWxsO1xuICAgICAgICB0YWJsZXMuaGhlYSA9IG51bGw7XG4gICAgICAgIHRhYmxlcy5obXR4ID0gbnVsbDtcbiAgICAgICAgdGFibGVzLm1heHAgPSBudWxsO1xuICAgICAgICB0YWJsZXMubmFtZSA9IG51bGw7XG4gICAgICAgIHRhYmxlcy5wb3N0ID0gbnVsbDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdGFibGUgPSByZWFkVGFibGVFbnRyeShmaWxlKTtcbiAgICAgICAgICBpZiAoIVZBTElEX1RBQkxFUy5pbmNsdWRlcyh0YWJsZS50YWcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcHBpbmcgdGFibGUgaWYgaXQncyBub3QgYSByZXF1aXJlZCBvciBvcHRpb25hbCB0YWJsZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGFibGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcHBpbmcgZW1wdHkgdGFibGVzXG4gICAgICAgICAgfVxuICAgICAgICAgIHRhYmxlc1t0YWJsZS50YWddID0gdGFibGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhYmxlcztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVhZFRhYmxlRW50cnkoZmlsZSkge1xuICAgICAgICB2YXIgdGFnID0gYnl0ZXNUb1N0cmluZyhmaWxlLmdldEJ5dGVzKDQpKTtcblxuICAgICAgICB2YXIgY2hlY2tzdW0gPSBmaWxlLmdldEludDMyKCkgPj4+IDA7XG4gICAgICAgIHZhciBvZmZzZXQgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7XG4gICAgICAgIHZhciBsZW5ndGggPSBmaWxlLmdldEludDMyKCkgPj4+IDA7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgdGFibGUgYXNzb2NpYXRlZCBkYXRhXG4gICAgICAgIHZhciBwcmV2aW91c1Bvc2l0aW9uID0gZmlsZS5wb3M7XG4gICAgICAgIGZpbGUucG9zID0gZmlsZS5zdGFydCA/IGZpbGUuc3RhcnQgOiAwO1xuICAgICAgICBmaWxlLnNraXAob2Zmc2V0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBmaWxlLmdldEJ5dGVzKGxlbmd0aCk7XG4gICAgICAgIGZpbGUucG9zID0gcHJldmlvdXNQb3NpdGlvbjtcblxuICAgICAgICBpZiAodGFnID09PSBcImhlYWRcIikge1xuICAgICAgICAgIC8vIGNsZWFyaW5nIGNoZWNrc3VtIGFkanVzdG1lbnRcbiAgICAgICAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPSAwO1xuICAgICAgICAgIGRhdGFbMTddIHw9IDB4MjA7IC8vIFNldCBmb250IG9wdGltaXplZCBmb3IgY2xlYXJ0eXBlIGZsYWcuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRhZyxcbiAgICAgICAgICBjaGVja3N1bSxcbiAgICAgICAgICBsZW5ndGgsXG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0dGYpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJzaW9uOiBieXRlc1RvU3RyaW5nKHR0Zi5nZXRCeXRlcyg0KSksXG4gICAgICAgICAgbnVtVGFibGVzOiB0dGYuZ2V0VWludDE2KCksXG4gICAgICAgICAgc2VhcmNoUmFuZ2U6IHR0Zi5nZXRVaW50MTYoKSxcbiAgICAgICAgICBlbnRyeVNlbGVjdG9yOiB0dGYuZ2V0VWludDE2KCksXG4gICAgICAgICAgcmFuZ2VTaGlmdDogdHRmLmdldFVpbnQxNigpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yykge1xuICAgICAgICBjb25zdCB0dGNUYWcgPSBieXRlc1RvU3RyaW5nKHR0Yy5nZXRCeXRlcyg0KSk7XG4gICAgICAgIGFzc2VydCh0dGNUYWcgPT09IFwidHRjZlwiLCBcIk11c3QgYmUgYSBUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQuXCIpO1xuXG4gICAgICAgIGNvbnN0IG1ham9yVmVyc2lvbiA9IHR0Yy5nZXRVaW50MTYoKTtcbiAgICAgICAgY29uc3QgbWlub3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpO1xuICAgICAgICBjb25zdCBudW1Gb250cyA9IHR0Yy5nZXRJbnQzMigpID4+PiAwO1xuICAgICAgICBjb25zdCBvZmZzZXRUYWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZvbnRzOyBpKyspIHtcbiAgICAgICAgICBvZmZzZXRUYWJsZS5wdXNoKHR0Yy5nZXRJbnQzMigpID4+PiAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHtcbiAgICAgICAgICB0dGNUYWcsXG4gICAgICAgICAgbWFqb3JWZXJzaW9uLFxuICAgICAgICAgIG1pbm9yVmVyc2lvbixcbiAgICAgICAgICBudW1Gb250cyxcbiAgICAgICAgICBvZmZzZXRUYWJsZSxcbiAgICAgICAgfTtcbiAgICAgICAgc3dpdGNoIChtYWpvclZlcnNpb24pIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGhlYWRlci5kc2lnVGFnID0gdHRjLmdldEludDMyKCkgPj4+IDA7XG4gICAgICAgICAgICBoZWFkZXIuZHNpZ0xlbmd0aCA9IHR0Yy5nZXRJbnQzMigpID4+PiAwO1xuICAgICAgICAgICAgaGVhZGVyLmRzaWdPZmZzZXQgPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDtcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIFRydWVUeXBlIENvbGxlY3Rpb24gbWFqb3JWZXJzaW9uOiAke21ham9yVmVyc2lvbn0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uRGF0YSh0dGMsIGZvbnROYW1lKSB7XG4gICAgICAgIGNvbnN0IHsgbnVtRm9udHMsIG9mZnNldFRhYmxlIH0gPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Gb250czsgaSsrKSB7XG4gICAgICAgICAgdHRjLnBvcyA9ICh0dGMuc3RhcnQgfHwgMCkgKyBvZmZzZXRUYWJsZVtpXTtcbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWxIZWFkZXIgPSByZWFkT3BlblR5cGVIZWFkZXIodHRjKTtcbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWxUYWJsZXMgPSByZWFkVGFibGVzKHR0YywgcG90ZW50aWFsSGVhZGVyLm51bVRhYmxlcyk7XG5cbiAgICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlcy5uYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICAgICdUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQgbXVzdCBjb250YWluIGEgXCJuYW1lXCIgdGFibGUuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmFtZVRhYmxlID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7XG5cbiAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamogPSBuYW1lVGFibGUubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDAsIGtrID0gbmFtZVRhYmxlW2pdLmxlbmd0aDsgayA8IGtrOyBrKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZUVudHJ5ID0gbmFtZVRhYmxlW2pdW2tdO1xuICAgICAgICAgICAgICBpZiAobmFtZUVudHJ5ICYmIG5hbWVFbnRyeS5yZXBsYWNlKC9cXHMvZywgXCJcIikgPT09IGZvbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGhlYWRlcjogcG90ZW50aWFsSGVhZGVyLFxuICAgICAgICAgICAgICAgICAgdGFibGVzOiBwb3RlbnRpYWxUYWJsZXMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgYFRydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiBcIiR7Zm9udE5hbWV9XCIgZm9udC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVhZCB0aGUgYXBwcm9wcmlhdGUgc3VidGFibGUgZnJvbSB0aGUgY21hcCBhY2NvcmRpbmcgdG8gOS42LjYuNCBmcm9tXG4gICAgICAgKiBQREYgc3BlY1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiByZWFkQ21hcFRhYmxlKGNtYXAsIGZpbGUsIGlzU3ltYm9saWNGb250LCBoYXNFbmNvZGluZykge1xuICAgICAgICBpZiAoIWNtYXApIHtcbiAgICAgICAgICB3YXJuKFwiTm8gY21hcCB0YWJsZSBhdmFpbGFibGUuXCIpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSxcbiAgICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLFxuICAgICAgICAgICAgbWFwcGluZ3M6IFtdLFxuICAgICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBzZWdtZW50O1xuICAgICAgICB2YXIgc3RhcnQgPSAoZmlsZS5zdGFydCA/IGZpbGUuc3RhcnQgOiAwKSArIGNtYXAub2Zmc2V0O1xuICAgICAgICBmaWxlLnBvcyA9IHN0YXJ0O1xuXG4gICAgICAgIGZpbGUuc2tpcCgyKTsgLy8gdmVyc2lvblxuICAgICAgICB2YXIgbnVtVGFibGVzID0gZmlsZS5nZXRVaW50MTYoKTtcblxuICAgICAgICB2YXIgcG90ZW50aWFsVGFibGU7XG4gICAgICAgIHZhciBjYW5CcmVhayA9IGZhbHNlO1xuICAgICAgICAvLyBUaGVyZSdzIGFuIG9yZGVyIG9mIHByZWZlcmVuY2UgaW4gdGVybXMgb2Ygd2hpY2ggY21hcCBzdWJ0YWJsZSB0b1xuICAgICAgICAvLyB1c2U6XG4gICAgICAgIC8vIC0gbm9uLXN5bWJvbGljIGZvbnRzIHRoZSBwcmVmZXJlbmNlIGlzIGEgMywxIHRhYmxlIHRoZW4gYSAxLDAgdGFibGVcbiAgICAgICAgLy8gLSBzeW1ib2xpYyBmb250cyB0aGUgcHJlZmVyZW5jZSBpcyBhIDMsMCB0YWJsZSB0aGVuIGEgMSwwIHRhYmxlXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIHRhYmxlcyBhcmUgc29ydGVkXG4gICAgICAgIC8vIHRvIHdvcmsuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHtcbiAgICAgICAgICB2YXIgcGxhdGZvcm1JZCA9IGZpbGUuZ2V0VWludDE2KCk7XG4gICAgICAgICAgdmFyIGVuY29kaW5nSWQgPSBmaWxlLmdldFVpbnQxNigpO1xuICAgICAgICAgIHZhciBvZmZzZXQgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7XG4gICAgICAgICAgdmFyIHVzZVRhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBTb21ldGltZXMgdGhlcmUgYXJlIG11bHRpcGxlIG9mIHRoZSBzYW1lIHR5cGUgb2YgdGFibGUuIERlZmF1bHRcbiAgICAgICAgICAvLyB0byBjaG9vc2luZyB0aGUgZmlyc3QgdGFibGUgYW5kIHNraXAgdGhlIHJlc3QuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcG90ZW50aWFsVGFibGUgJiZcbiAgICAgICAgICAgIHBvdGVudGlhbFRhYmxlLnBsYXRmb3JtSWQgPT09IHBsYXRmb3JtSWQgJiZcbiAgICAgICAgICAgIHBvdGVudGlhbFRhYmxlLmVuY29kaW5nSWQgPT09IGVuY29kaW5nSWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBsYXRmb3JtSWQgPT09IDAgJiZcbiAgICAgICAgICAgIChlbmNvZGluZ0lkID09PSAvKiBVbmljb2RlIERlZmF1bHQgKi8gMCB8fFxuICAgICAgICAgICAgICBlbmNvZGluZ0lkID09PSAvKiBVbmljb2RlIDEuMSAqLyAxIHx8XG4gICAgICAgICAgICAgIGVuY29kaW5nSWQgPT09IC8qIFVuaWNvZGUgQk1QICovIDMpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBDb250aW51ZSB0aGUgbG9vcCBzaW5jZSB0aGVyZSBzdGlsbCBtYXkgYmUgYSBoaWdoZXIgcHJpb3JpdHlcbiAgICAgICAgICAgIC8vIHRhYmxlLlxuICAgICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1JZCA9PT0gMSAmJiBlbmNvZGluZ0lkID09PSAwKSB7XG4gICAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBDb250aW51ZSB0aGUgbG9vcCBzaW5jZSB0aGVyZSBzdGlsbCBtYXkgYmUgYSBoaWdoZXIgcHJpb3JpdHlcbiAgICAgICAgICAgIC8vIHRhYmxlLlxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBwbGF0Zm9ybUlkID09PSAzICYmXG4gICAgICAgICAgICBlbmNvZGluZ0lkID09PSAxICYmXG4gICAgICAgICAgICAoaGFzRW5jb2RpbmcgfHwgIXBvdGVudGlhbFRhYmxlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdXNlVGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFpc1N5bWJvbGljRm9udCkge1xuICAgICAgICAgICAgICBjYW5CcmVhayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCAmJiBwbGF0Zm9ybUlkID09PSAzICYmIGVuY29kaW5nSWQgPT09IDApIHtcbiAgICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbkJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXNlVGFibGUpIHtcbiAgICAgICAgICAgIHBvdGVudGlhbFRhYmxlID0ge1xuICAgICAgICAgICAgICBwbGF0Zm9ybUlkLFxuICAgICAgICAgICAgICBlbmNvZGluZ0lkLFxuICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2FuQnJlYWspIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3RlbnRpYWxUYWJsZSkge1xuICAgICAgICAgIGZpbGUucG9zID0gc3RhcnQgKyBwb3RlbnRpYWxUYWJsZS5vZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwb3RlbnRpYWxUYWJsZSB8fCBmaWxlLnBlZWtCeXRlKCkgPT09IC0xKSB7XG4gICAgICAgICAgd2FybihcIkNvdWxkIG5vdCBmaW5kIGEgcHJlZmVycmVkIGNtYXAgdGFibGUuXCIpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSxcbiAgICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLFxuICAgICAgICAgICAgbWFwcGluZ3M6IFtdLFxuICAgICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZvcm1hdCA9IGZpbGUuZ2V0VWludDE2KCk7XG4gICAgICAgIGZpbGUuc2tpcCgyICsgMik7IC8vIGxlbmd0aCArIGxhbmd1YWdlXG5cbiAgICAgICAgdmFyIGhhc1Nob3J0Q21hcCA9IGZhbHNlO1xuICAgICAgICB2YXIgbWFwcGluZ3MgPSBbXTtcbiAgICAgICAgdmFyIGosIGdseXBoSWQ7XG5cbiAgICAgICAgLy8gVE9ETyhtYWNrKTogcmVmYWN0b3IgdGhpcyBjbWFwIHN1YnRhYmxlIHJlYWRpbmcgbG9naWMgb3V0XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDApIHtcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGZpbGUuZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgaWYgKCFpbmRleCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgICBjaGFyQ29kZTogaixcbiAgICAgICAgICAgICAgZ2x5cGhJZDogaW5kZXgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFzU2hvcnRDbWFwID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDQpIHtcbiAgICAgICAgICAvLyByZS1jcmVhdGluZyB0aGUgdGFibGUgaW4gZm9ybWF0IDQgc2luY2UgdGhlIGVuY29kaW5nXG4gICAgICAgICAgLy8gbWlnaHQgYmUgY2hhbmdlZFxuICAgICAgICAgIHZhciBzZWdDb3VudCA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMTtcbiAgICAgICAgICBmaWxlLnNraXAoNik7IC8vIHNraXBwaW5nIHJhbmdlIGZpZWxkc1xuICAgICAgICAgIHZhciBzZWdJbmRleCxcbiAgICAgICAgICAgIHNlZ21lbnRzID0gW107XG4gICAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHtcbiAgICAgICAgICAgIHNlZ21lbnRzLnB1c2goeyBlbmQ6IGZpbGUuZ2V0VWludDE2KCkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpbGUuc2tpcCgyKTtcbiAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykge1xuICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLnN0YXJ0ID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykge1xuICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLmRlbHRhID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgb2Zmc2V0c0NvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykge1xuICAgICAgICAgICAgc2VnbWVudCA9IHNlZ21lbnRzW3NlZ0luZGV4XTtcbiAgICAgICAgICAgIHZhciByYW5nZU9mZnNldCA9IGZpbGUuZ2V0VWludDE2KCk7XG4gICAgICAgICAgICBpZiAoIXJhbmdlT2Zmc2V0KSB7XG4gICAgICAgICAgICAgIHNlZ21lbnQub2Zmc2V0SW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvZmZzZXRJbmRleCA9IChyYW5nZU9mZnNldCA+PiAxKSAtIChzZWdDb3VudCAtIHNlZ0luZGV4KTtcbiAgICAgICAgICAgIHNlZ21lbnQub2Zmc2V0SW5kZXggPSBvZmZzZXRJbmRleDtcbiAgICAgICAgICAgIG9mZnNldHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICBvZmZzZXRzQ291bnQsXG4gICAgICAgICAgICAgIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgb2Zmc2V0cyA9IFtdO1xuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvZmZzZXRzQ291bnQ7IGorKykge1xuICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKGZpbGUuZ2V0VWludDE2KCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7XG4gICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdO1xuICAgICAgICAgICAgc3RhcnQgPSBzZWdtZW50LnN0YXJ0O1xuICAgICAgICAgICAgdmFyIGVuZCA9IHNlZ21lbnQuZW5kO1xuICAgICAgICAgICAgdmFyIGRlbHRhID0gc2VnbWVudC5kZWx0YTtcbiAgICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDtcblxuICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKGogPT09IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ2x5cGhJZCA9IG9mZnNldEluZGV4IDwgMCA/IGogOiBvZmZzZXRzW29mZnNldEluZGV4ICsgaiAtIHN0YXJ0XTtcbiAgICAgICAgICAgICAgZ2x5cGhJZCA9IChnbHlwaElkICsgZGVsdGEpICYgMHhmZmZmO1xuICAgICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjaGFyQ29kZTogaixcbiAgICAgICAgICAgICAgICBnbHlwaElkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA2KSB7XG4gICAgICAgICAgLy8gRm9ybWF0IDYgaXMgYSAyLWJ5dGVzIGRlbnNlIG1hcHBpbmcsIHdoaWNoIG1lYW5zIHRoZSBmb250IGRhdGFcbiAgICAgICAgICAvLyBsaXZlcyBnbHVlIHRvZ2V0aGVyIGV2ZW4gaWYgdGhleSBhcmUgcHJldHR5IGZhciBpbiB0aGUgdW5pY29kZVxuICAgICAgICAgIC8vIHRhYmxlLiAoVGhpcyBsb29rcyB3ZWlyZCwgc28gSSBjYW4gaGF2ZSBtaXNzZWQgc29tZXRoaW5nKSwgdGhpc1xuICAgICAgICAgIC8vIHdvcmtzIG9uIExpbnV4IGJ1dCBzZWVtcyB0byBmYWlscyBvbiBNYWMgc28gbGV0J3MgcmV3cml0ZSB0aGVcbiAgICAgICAgICAvLyBjbWFwIHRhYmxlIHRvIGEgMy0xLTQgc3R5bGVcbiAgICAgICAgICB2YXIgZmlyc3RDb2RlID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAgICAgICB2YXIgZW50cnlDb3VudCA9IGZpbGUuZ2V0VWludDE2KCk7XG5cbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZW50cnlDb3VudDsgaisrKSB7XG4gICAgICAgICAgICBnbHlwaElkID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAgICAgICAgIHZhciBjaGFyQ29kZSA9IGZpcnN0Q29kZSArIGo7XG5cbiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgICBjaGFyQ29kZSxcbiAgICAgICAgICAgICAgZ2x5cGhJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuKFwiY21hcCB0YWJsZSBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0OiBcIiArIGZvcm1hdCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLFxuICAgICAgICAgICAgZW5jb2RpbmdJZDogLTEsXG4gICAgICAgICAgICBtYXBwaW5nczogW10sXG4gICAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmluZyBkdXBsaWNhdGUgZW50cmllc1xuICAgICAgICBtYXBwaW5ncy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGEuY2hhckNvZGUgLSBiLmNoYXJDb2RlO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKG1hcHBpbmdzW2kgLSAxXS5jaGFyQ29kZSA9PT0gbWFwcGluZ3NbaV0uY2hhckNvZGUpIHtcbiAgICAgICAgICAgIG1hcHBpbmdzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBsYXRmb3JtSWQ6IHBvdGVudGlhbFRhYmxlLnBsYXRmb3JtSWQsXG4gICAgICAgICAgZW5jb2RpbmdJZDogcG90ZW50aWFsVGFibGUuZW5jb2RpbmdJZCxcbiAgICAgICAgICBtYXBwaW5ncyxcbiAgICAgICAgICBoYXNTaG9ydENtYXAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNhbml0aXplTWV0cmljcyhcbiAgICAgICAgZmlsZSxcbiAgICAgICAgaGVhZGVyLFxuICAgICAgICBtZXRyaWNzLFxuICAgICAgICBudW1HbHlwaHMsXG4gICAgICAgIGR1cEZpcnN0RW50cnlcbiAgICAgICkge1xuICAgICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICAgIGlmIChtZXRyaWNzKSB7XG4gICAgICAgICAgICBtZXRyaWNzLmRhdGEgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0ID8gZmlsZS5zdGFydCA6IDApICsgaGVhZGVyLm9mZnNldDtcbiAgICAgICAgZmlsZS5wb3MgKz0gNDsgLy8gdmVyc2lvblxuICAgICAgICBmaWxlLnBvcyArPSAyOyAvLyBhc2NlbnRcbiAgICAgICAgZmlsZS5wb3MgKz0gMjsgLy8gZGVzY2VudFxuICAgICAgICBmaWxlLnBvcyArPSAyOyAvLyBsaW5lZ2FwXG4gICAgICAgIGZpbGUucG9zICs9IDI7IC8vIGFkdl93aWR0aF9tYXhcbiAgICAgICAgZmlsZS5wb3MgKz0gMjsgLy8gbWluX3NiMVxuICAgICAgICBmaWxlLnBvcyArPSAyOyAvLyBtaW5fc2IyXG4gICAgICAgIGZpbGUucG9zICs9IDI7IC8vIG1heF9leHRlbnRcbiAgICAgICAgZmlsZS5wb3MgKz0gMjsgLy8gY2FyZXRfc2xvcGVfcmlzZVxuICAgICAgICBmaWxlLnBvcyArPSAyOyAvLyBjYXJldF9zbG9wZV9ydW5cbiAgICAgICAgZmlsZS5wb3MgKz0gMjsgLy8gY2FyZXRfb2Zmc2V0XG4gICAgICAgIGZpbGUucG9zICs9IDg7IC8vIHJlc2VydmVkXG4gICAgICAgIGZpbGUucG9zICs9IDI7IC8vIGZvcm1hdFxuICAgICAgICB2YXIgbnVtT2ZNZXRyaWNzID0gZmlsZS5nZXRVaW50MTYoKTtcblxuICAgICAgICBpZiAobnVtT2ZNZXRyaWNzID4gbnVtR2x5cGhzKSB7XG4gICAgICAgICAgaW5mbyhcbiAgICAgICAgICAgIFwiVGhlIG51bU9mTWV0cmljcyAoXCIgK1xuICAgICAgICAgICAgICBudW1PZk1ldHJpY3MgK1xuICAgICAgICAgICAgICBcIikgc2hvdWxkIG5vdCBiZSBcIiArXG4gICAgICAgICAgICAgIFwiZ3JlYXRlciB0aGFuIHRoZSBudW1HbHlwaHMgKFwiICtcbiAgICAgICAgICAgICAgbnVtR2x5cGhzICtcbiAgICAgICAgICAgICAgXCIpXCJcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFJlZHVjZSBudW1PZk1ldHJpY3MgaWYgaXQgaXMgZ3JlYXRlciB0aGFuIG51bUdseXBoc1xuICAgICAgICAgIG51bU9mTWV0cmljcyA9IG51bUdseXBocztcbiAgICAgICAgICBoZWFkZXIuZGF0YVszNF0gPSAobnVtT2ZNZXRyaWNzICYgMHhmZjAwKSA+PiA4O1xuICAgICAgICAgIGhlYWRlci5kYXRhWzM1XSA9IG51bU9mTWV0cmljcyAmIDB4MDBmZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBudW1PZlNpZGViZWFyaW5ncyA9IG51bUdseXBocyAtIG51bU9mTWV0cmljcztcbiAgICAgICAgdmFyIG51bU1pc3NpbmcgPVxuICAgICAgICAgIG51bU9mU2lkZWJlYXJpbmdzIC0gKChtZXRyaWNzLmxlbmd0aCAtIG51bU9mTWV0cmljcyAqIDQpID4+IDEpO1xuXG4gICAgICAgIGlmIChudW1NaXNzaW5nID4gMCkge1xuICAgICAgICAgIC8vIEZvciBlYWNoIG1pc3NpbmcgZ2x5cGgsIHdlIHNldCBib3RoIHRoZSB3aWR0aCBhbmQgbHNiIHRvIDAgKHplcm8pLlxuICAgICAgICAgIC8vIFNpbmNlIHdlIG5lZWQgdG8gYWRkIHR3byBwcm9wZXJ0aWVzIGZvciBlYWNoIGdseXBoLCB0aGlzIGV4cGxhaW5zXG4gICAgICAgICAgLy8gdGhlIHVzZSBvZiB8bnVtTWlzc2luZyAqIDJ8IHdoZW4gaW5pdGlhbGl6aW5nIHRoZSB0eXBlZCBhcnJheS5cbiAgICAgICAgICB2YXIgZW50cmllcyA9IG5ldyBVaW50OEFycmF5KG1ldHJpY3MubGVuZ3RoICsgbnVtTWlzc2luZyAqIDIpO1xuICAgICAgICAgIGVudHJpZXMuc2V0KG1ldHJpY3MuZGF0YSk7XG4gICAgICAgICAgaWYgKGR1cEZpcnN0RW50cnkpIHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgc2lkZWJlYXJpbmcgdmFsdWUgb2YgdGhlIGR1cGxpY2F0ZWQgZ2x5cGguXG4gICAgICAgICAgICBlbnRyaWVzW21ldHJpY3MubGVuZ3RoXSA9IG1ldHJpY3MuZGF0YVsyXTtcbiAgICAgICAgICAgIGVudHJpZXNbbWV0cmljcy5sZW5ndGggKyAxXSA9IG1ldHJpY3MuZGF0YVszXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWV0cmljcy5kYXRhID0gZW50cmllcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoKFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHNvdXJjZVN0YXJ0LFxuICAgICAgICBzb3VyY2VFbmQsXG4gICAgICAgIGRlc3QsXG4gICAgICAgIGRlc3RTdGFydCxcbiAgICAgICAgaGludHNWYWxpZFxuICAgICAgKSB7XG4gICAgICAgIHZhciBnbHlwaFByb2ZpbGUgPSB7XG4gICAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICAgIHNpemVPZkluc3RydWN0aW9uczogMCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0IDw9IDEyKSB7XG4gICAgICAgICAgLy8gZ2x5cGggd2l0aCBkYXRhIGxlc3MgdGhhbiAxMiBpcyBpbnZhbGlkIG9uZVxuICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdseWYgPSBzb3VyY2Uuc3ViYXJyYXkoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7XG4gICAgICAgIHZhciBjb250b3Vyc0NvdW50ID0gc2lnbmVkSW50MTYoZ2x5ZlswXSwgZ2x5ZlsxXSk7XG4gICAgICAgIGlmIChjb250b3Vyc0NvdW50IDwgMCkge1xuICAgICAgICAgIC8vIE9UUyBkb2Vzbid0IGxpa2UgY29udG91ciBjb3VudCB0byBiZSBsZXNzIHRoYW4gLTEuXG4gICAgICAgICAgY29udG91cnNDb3VudCA9IC0xO1xuICAgICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgMCwgY29udG91cnNDb3VudCk7XG4gICAgICAgICAgLy8gY29tcGxleCBnbHlwaCwgd3JpdGluZyBhcyBpc1xuICAgICAgICAgIGRlc3Quc2V0KGdseWYsIGRlc3RTdGFydCk7XG4gICAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoO1xuICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSxcbiAgICAgICAgICBqID0gMTAsXG4gICAgICAgICAgZmxhZ3NDb3VudCA9IDA7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250b3Vyc0NvdW50OyBpKyspIHtcbiAgICAgICAgICB2YXIgZW5kUG9pbnQgPSAoZ2x5ZltqXSA8PCA4KSB8IGdseWZbaiArIDFdO1xuICAgICAgICAgIGZsYWdzQ291bnQgPSBlbmRQb2ludCArIDE7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNraXBwaW5nIGluc3RydWN0aW9uc1xuICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zU3RhcnQgPSBqO1xuICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gKGdseWZbal0gPDwgOCkgfCBnbHlmW2ogKyAxXTtcbiAgICAgICAgZ2x5cGhQcm9maWxlLnNpemVPZkluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uc0xlbmd0aDtcbiAgICAgICAgaiArPSAyICsgaW5zdHJ1Y3Rpb25zTGVuZ3RoO1xuICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zRW5kID0gajtcbiAgICAgICAgLy8gdmFsaWRhdGluZyBmbGFnc1xuICAgICAgICB2YXIgY29vcmRpbmF0ZXNMZW5ndGggPSAwO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmxhZ3NDb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZsYWcgPSBnbHlmW2orK107XG4gICAgICAgICAgaWYgKGZsYWcgJiAweGMwKSB7XG4gICAgICAgICAgICAvLyByZXNlcnZlZCBmbGFncyBtdXN0IGJlIHplcm8sIGNsZWFuaW5nIHVwXG4gICAgICAgICAgICBnbHlmW2ogLSAxXSA9IGZsYWcgJiAweDNmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgeExlbmd0aCA9IDI7XG4gICAgICAgICAgaWYgKGZsYWcgJiAyKSB7XG4gICAgICAgICAgICB4TGVuZ3RoID0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZsYWcgJiAxNikge1xuICAgICAgICAgICAgeExlbmd0aCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB5TGVuZ3RoID0gMjtcbiAgICAgICAgICBpZiAoZmxhZyAmIDQpIHtcbiAgICAgICAgICAgIHlMZW5ndGggPSAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIDMyKSB7XG4gICAgICAgICAgICB5TGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeHlMZW5ndGggPSB4TGVuZ3RoICsgeUxlbmd0aDtcbiAgICAgICAgICBjb29yZGluYXRlc0xlbmd0aCArPSB4eUxlbmd0aDtcbiAgICAgICAgICBpZiAoZmxhZyAmIDgpIHtcbiAgICAgICAgICAgIHZhciByZXBlYXQgPSBnbHlmW2orK107XG4gICAgICAgICAgICBpICs9IHJlcGVhdDtcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHJlcGVhdCAqIHh5TGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBnbHlwaCB3aXRob3V0IGNvb3JkaW5hdGVzIHdpbGwgYmUgcmVqZWN0ZWRcbiAgICAgICAgaWYgKGNvb3JkaW5hdGVzTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2x5cGhEYXRhTGVuZ3RoID0gaiArIGNvb3JkaW5hdGVzTGVuZ3RoO1xuICAgICAgICBpZiAoZ2x5cGhEYXRhTGVuZ3RoID4gZ2x5Zi5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEgZm9yIGNvb3JkaW5hdGVzXG4gICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhpbnRzVmFsaWQgJiYgaW5zdHJ1Y3Rpb25zTGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoMCwgaW5zdHJ1Y3Rpb25zU3RhcnQpLCBkZXN0U3RhcnQpO1xuICAgICAgICAgIGRlc3Quc2V0KFswLCAwXSwgZGVzdFN0YXJ0ICsgaW5zdHJ1Y3Rpb25zU3RhcnQpO1xuICAgICAgICAgIGRlc3Quc2V0KFxuICAgICAgICAgICAgZ2x5Zi5zdWJhcnJheShpbnN0cnVjdGlvbnNFbmQsIGdseXBoRGF0YUxlbmd0aCksXG4gICAgICAgICAgICBkZXN0U3RhcnQgKyBpbnN0cnVjdGlvbnNTdGFydCArIDJcbiAgICAgICAgICApO1xuICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCAtPSBpbnN0cnVjdGlvbnNMZW5ndGg7XG4gICAgICAgICAgaWYgKGdseWYubGVuZ3RoIC0gZ2x5cGhEYXRhTGVuZ3RoID4gMykge1xuICAgICAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoID0gKGdseXBoRGF0YUxlbmd0aCArIDMpICYgfjM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7XG4gICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7XG4gICAgICAgICAgLy8gdHJ1bmNhdGluZyBhbmQgYWxpZ25pbmcgdG8gNCBieXRlcyB0aGUgbG9uZyBnbHlwaCBkYXRhXG4gICAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoID0gKGdseXBoRGF0YUxlbmd0aCArIDMpICYgfjM7XG4gICAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheSgwLCBnbHlwaERhdGFMZW5ndGgpLCBkZXN0U3RhcnQpO1xuICAgICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7XG4gICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnbHlwaCBkYXRhIGlzIGZpbmVcbiAgICAgICAgZGVzdC5zZXQoZ2x5ZiwgZGVzdFN0YXJ0KTtcbiAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYW5pdGl6ZUhlYWQoaGVhZCwgbnVtR2x5cGhzLCBsb2NhTGVuZ3RoKSB7XG4gICAgICAgIHZhciBkYXRhID0gaGVhZC5kYXRhO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHZlcnNpb246XG4gICAgICAgIC8vIFNob3VsZCBhbHdheXMgYmUgMHgwMDAxMDAwMFxuICAgICAgICB2YXIgdmVyc2lvbiA9IGludDMyKGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pO1xuICAgICAgICBpZiAodmVyc2lvbiA+PiAxNiAhPT0gMSkge1xuICAgICAgICAgIGluZm8oXCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogXCIgKyB2ZXJzaW9uKTtcbiAgICAgICAgICBkYXRhWzBdID0gMDtcbiAgICAgICAgICBkYXRhWzFdID0gMTtcbiAgICAgICAgICBkYXRhWzJdID0gMDtcbiAgICAgICAgICBkYXRhWzNdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRleFRvTG9jRm9ybWF0ID0gaW50MTYoZGF0YVs1MF0sIGRhdGFbNTFdKTtcbiAgICAgICAgaWYgKGluZGV4VG9Mb2NGb3JtYXQgPCAwIHx8IGluZGV4VG9Mb2NGb3JtYXQgPiAxKSB7XG4gICAgICAgICAgaW5mbyhcbiAgICAgICAgICAgIFwiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCBpbmRleFRvTG9jRm9ybWF0IGluIGhlYWQgdGFibGU6IFwiICtcbiAgICAgICAgICAgICAgaW5kZXhUb0xvY0Zvcm1hdFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBUaGUgdmFsdWUgb2YgaW5kZXhUb0xvY0Zvcm1hdCBzaG91bGQgYmUgMCBpZiB0aGUgbG9jYSB0YWJsZVxuICAgICAgICAgIC8vIGNvbnNpc3RzIG9mIHNob3J0IG9mZnNldHMsIGFuZCBzaG91bGQgYmUgMSBpZiB0aGUgbG9jYSB0YWJsZVxuICAgICAgICAgIC8vIGNvbnNpc3RzIG9mIGxvbmcgb2Zmc2V0cy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbG9jYSB0YWJsZSBzaG91bGQgYmUgbnVtR2x5cGhzICsgMS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFVzaW5nIHRoaXMgaW5mb3JtYXRpb24sIHdlIGNhbiB3b3JrIGJhY2t3YXJkcyB0byBkZWR1Y2UgaWYgdGhlXG4gICAgICAgICAgLy8gc2l6ZSBvZiBlYWNoIG9mZnNldCBpbiB0aGUgbG9jYSB0YWJsZSwgYW5kIHRodXMgZmlndXJlIG91dCB0aGVcbiAgICAgICAgICAvLyBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgaW5kZXhUb0xvY0Zvcm1hdC5cblxuICAgICAgICAgIHZhciBudW1HbHlwaHNQbHVzT25lID0gbnVtR2x5cGhzICsgMTtcbiAgICAgICAgICBpZiAobG9jYUxlbmd0aCA9PT0gbnVtR2x5cGhzUGx1c09uZSA8PCAxKSB7XG4gICAgICAgICAgICAvLyAweDAwMDAgaW5kaWNhdGVzIHRoZSBsb2NhIHRhYmxlIGNvbnNpc3RzIG9mIHNob3J0IG9mZnNldHNcbiAgICAgICAgICAgIGRhdGFbNTBdID0gMDtcbiAgICAgICAgICAgIGRhdGFbNTFdID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FMZW5ndGggPT09IG51bUdseXBoc1BsdXNPbmUgPDwgMikge1xuICAgICAgICAgICAgLy8gMHgwMDAxIGluZGljYXRlcyB0aGUgbG9jYSB0YWJsZSBjb25zaXN0cyBvZiBsb25nIG9mZnNldHNcbiAgICAgICAgICAgIGRhdGFbNTBdID0gMDtcbiAgICAgICAgICAgIGRhdGFbNTFdID0gMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgICBcIkNvdWxkIG5vdCBmaXggaW5kZXhUb0xvY0Zvcm1hdDogXCIgKyBpbmRleFRvTG9jRm9ybWF0XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoTG9jYXRpb25zKFxuICAgICAgICBsb2NhLFxuICAgICAgICBnbHlmLFxuICAgICAgICBudW1HbHlwaHMsXG4gICAgICAgIGlzR2x5cGhMb2NhdGlvbnNMb25nLFxuICAgICAgICBoaW50c1ZhbGlkLFxuICAgICAgICBkdXBGaXJzdEVudHJ5LFxuICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnNcbiAgICAgICkge1xuICAgICAgICB2YXIgaXRlbVNpemUsIGl0ZW1EZWNvZGUsIGl0ZW1FbmNvZGU7XG4gICAgICAgIGlmIChpc0dseXBoTG9jYXRpb25zTG9uZykge1xuICAgICAgICAgIGl0ZW1TaXplID0gNDtcbiAgICAgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGVMb25nKGRhdGEsIG9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICAgICAgICAgICAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICAgICAgICAgICAoZGF0YVtvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgM11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVtRW5jb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGVMb25nKGRhdGEsIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4gOCkgJiAweGZmO1xuICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZjtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1TaXplID0gMjtcbiAgICAgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGUoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gKGRhdGFbb2Zmc2V0XSA8PCA5KSB8IChkYXRhW29mZnNldCArIDFdIDw8IDEpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaXRlbUVuY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRW5jb2RlKGRhdGEsIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9ICh2YWx1ZSA+PiA5KSAmIDB4ZmY7XG4gICAgICAgICAgICBkYXRhW29mZnNldCArIDFdID0gKHZhbHVlID4+IDEpICYgMHhmZjtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBmaXJzdCBnbHlwaCBpcyBkdXBsaWNhdGVkLlxuICAgICAgICB2YXIgbnVtR2x5cGhzT3V0ID0gZHVwRmlyc3RFbnRyeSA/IG51bUdseXBocyArIDEgOiBudW1HbHlwaHM7XG4gICAgICAgIHZhciBsb2NhRGF0YVNpemUgPSBpdGVtU2l6ZSAqICgxICsgbnVtR2x5cGhzT3V0KTtcbiAgICAgICAgLy8gUmVzaXplIGxvY2EgdGFibGUgdG8gYWNjb3VudCBmb3IgZHVwbGljYXRlZCBnbHlwaC5cbiAgICAgICAgdmFyIGxvY2FEYXRhID0gbmV3IFVpbnQ4QXJyYXkobG9jYURhdGFTaXplKTtcbiAgICAgICAgbG9jYURhdGEuc2V0KGxvY2EuZGF0YS5zdWJhcnJheSgwLCBsb2NhRGF0YVNpemUpKTtcbiAgICAgICAgbG9jYS5kYXRhID0gbG9jYURhdGE7XG4gICAgICAgIC8vIHJlbW92aW5nIHRoZSBpbnZhbGlkIGdseXBoc1xuICAgICAgICB2YXIgb2xkR2x5ZkRhdGEgPSBnbHlmLmRhdGE7XG4gICAgICAgIHZhciBvbGRHbHlmRGF0YUxlbmd0aCA9IG9sZEdseWZEYXRhLmxlbmd0aDtcbiAgICAgICAgdmFyIG5ld0dseWZEYXRhID0gbmV3IFVpbnQ4QXJyYXkob2xkR2x5ZkRhdGFMZW5ndGgpO1xuXG4gICAgICAgIC8vIFRoZSBzcGVjIHNheXMgdGhlIG9mZnNldHMgc2hvdWxkIGJlIGluIGFzY2VuZGluZyBvcmRlciwgaG93ZXZlclxuICAgICAgICAvLyB0aGlzIGlzIG5vdCB0cnVlIGZvciBzb21lIGZvbnRzIG9yIHRoZXkgdXNlIHRoZSBvZmZzZXQgb2YgMCB0byBtYXJrIGFcbiAgICAgICAgLy8gZ2x5cGggYXMgbWlzc2luZy4gT1RTIHJlcXVpcmVzIHRoZSBvZmZzZXRzIHRvIGJlIGluIG9yZGVyIGFuZCBub3QgdG9cbiAgICAgICAgLy8gYmUgemVybywgc28gd2UgbXVzdCBzb3J0IGFuZCByZWJ1aWxkIHRoZSBsb2NhIHRhYmxlIGFuZCBwb3RlbnRpYWxseVxuICAgICAgICAvLyByZS1hcnJhbmdlIHRoZSBnbHlmIGRhdGEuXG4gICAgICAgIHZhciBpLCBqO1xuICAgICAgICBjb25zdCBsb2NhRW50cmllcyA9IFtdO1xuICAgICAgICAvLyBUaGVyZSBhcmUgbnVtR2x5cGhzICsgMSBsb2NhIHRhYmxlIGVudHJpZXMuXG4gICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbnVtR2x5cGhzICsgMTsgaSsrLCBqICs9IGl0ZW1TaXplKSB7XG4gICAgICAgICAgbGV0IG9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYURhdGEsIGopO1xuICAgICAgICAgIGlmIChvZmZzZXQgPiBvbGRHbHlmRGF0YUxlbmd0aCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2xkR2x5ZkRhdGFMZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvY2FFbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBlbmRPZmZzZXQ6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYUVudHJpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIHJldHVybiBhLm9mZnNldCAtIGIub2Zmc2V0O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTm93IHRoZSBvZmZzZXRzIGFyZSBzb3J0ZWQsIGNhbGN1bGF0ZSB0aGUgZW5kIG9mZnNldCBvZiBlYWNoIGdseXBoLlxuICAgICAgICAvLyBUaGUgbGFzdCBsb2NhIGVudHJ5J3MgZW5kT2Zmc2V0IGlzIG5vdCBjYWxjdWxhdGVkIHNpbmNlIGl0J3MgdGhlIGVuZFxuICAgICAgICAvLyBvZiB0aGUgZGF0YSBhbmQgd2lsbCBiZSBzdG9yZWQgb24gdGhlIHByZXZpb3VzIGVudHJ5J3MgZW5kT2Zmc2V0LlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHtcbiAgICAgICAgICBsb2NhRW50cmllc1tpXS5lbmRPZmZzZXQgPSBsb2NhRW50cmllc1tpICsgMV0ub2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlLXNvcnQgc28gZ2x5cGhzIGFyZW4ndCBvdXQgb2Ygb3JkZXIuXG4gICAgICAgIGxvY2FFbnRyaWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBtaXNzaW5nR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIHdyaXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgMCwgd3JpdGVPZmZzZXQpO1xuICAgICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHM7IGkrKywgaiArPSBpdGVtU2l6ZSkge1xuICAgICAgICAgIHZhciBnbHlwaFByb2ZpbGUgPSBzYW5pdGl6ZUdseXBoKFxuICAgICAgICAgICAgb2xkR2x5ZkRhdGEsXG4gICAgICAgICAgICBsb2NhRW50cmllc1tpXS5vZmZzZXQsXG4gICAgICAgICAgICBsb2NhRW50cmllc1tpXS5lbmRPZmZzZXQsXG4gICAgICAgICAgICBuZXdHbHlmRGF0YSxcbiAgICAgICAgICAgIHdyaXRlT2Zmc2V0LFxuICAgICAgICAgICAgaGludHNWYWxpZFxuICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIG5ld0xlbmd0aCA9IGdseXBoUHJvZmlsZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKG5ld0xlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbWlzc2luZ0dseXBoc1tpXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID4gbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3cml0ZU9mZnNldCArPSBuZXdMZW5ndGg7XG4gICAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgaiwgd3JpdGVPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdyaXRlT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgLy8gZ2x5ZiB0YWJsZSBjYW5ub3QgYmUgZW1wdHkgLS0gcmVkb2luZyB0aGUgZ2x5ZiBhbmQgbG9jYSB0YWJsZXNcbiAgICAgICAgICAvLyB0byBoYXZlIHNpbmdsZSBnbHlwaCB3aXRoIG9uZSBwb2ludFxuICAgICAgICAgIHZhciBzaW1wbGVHbHlwaCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgNDksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGZvciAoaSA9IDAsIGogPSBpdGVtU2l6ZTsgaSA8IG51bUdseXBoc091dDsgaSsrLCBqICs9IGl0ZW1TaXplKSB7XG4gICAgICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCBzaW1wbGVHbHlwaC5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnbHlmLmRhdGEgPSBzaW1wbGVHbHlwaDtcbiAgICAgICAgfSBlbHNlIGlmIChkdXBGaXJzdEVudHJ5KSB7XG4gICAgICAgICAgLy8gQnJvd3NlcnMgd2lsbCBub3QgZGlzcGxheSBhIGdseXBoIGF0IHBvc2l0aW9uIDAuIFR5cGljYWxseSBnbHlwaCAwXG4gICAgICAgICAgLy8gaXMgbm90ZGVmLCBidXQgYSBudW1iZXIgb2YgZm9udHMgcHV0IGEgdmFsaWQgZ2x5cGggdGhlcmUgc28gaXQgbXVzdFxuICAgICAgICAgIC8vIGJlIGR1cGxpY2F0ZWQgYW5kIGFwcGVuZGVkLlxuICAgICAgICAgIHZhciBmaXJzdEVudHJ5TGVuZ3RoID0gaXRlbURlY29kZShsb2NhRGF0YSwgaXRlbVNpemUpO1xuICAgICAgICAgIGlmIChuZXdHbHlmRGF0YS5sZW5ndGggPiBmaXJzdEVudHJ5TGVuZ3RoICsgd3JpdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdseWYuZGF0YSA9IG5ldyBVaW50OEFycmF5KGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7XG4gICAgICAgICAgICBnbHlmLmRhdGEuc2V0KG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdseWYuZGF0YS5zZXQobmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgZmlyc3RFbnRyeUxlbmd0aCksIHdyaXRlT2Zmc2V0KTtcbiAgICAgICAgICBpdGVtRW5jb2RlKFxuICAgICAgICAgICAgbG9jYS5kYXRhLFxuICAgICAgICAgICAgbG9jYURhdGEubGVuZ3RoIC0gaXRlbVNpemUsXG4gICAgICAgICAgICB3cml0ZU9mZnNldCArIGZpcnN0RW50cnlMZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1pc3NpbmdHbHlwaHMsXG4gICAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWFkUG9zdFNjcmlwdFRhYmxlKHBvc3QsIHByb3BlcnRpZXNPYmosIG1heHBOdW1HbHlwaHMpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gKGZvbnQuc3RhcnQgPyBmb250LnN0YXJ0IDogMCkgKyBwb3N0Lm9mZnNldDtcbiAgICAgICAgZm9udC5wb3MgPSBzdGFydDtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gcG9zdC5sZW5ndGgsXG4gICAgICAgICAgZW5kID0gc3RhcnQgKyBsZW5ndGg7XG4gICAgICAgIHZhciB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpO1xuICAgICAgICAvLyBza2lwIHJlc3QgdG8gdGhlIHRhYmxlc1xuICAgICAgICBmb250LnNraXAoMjgpO1xuXG4gICAgICAgIHZhciBnbHlwaE5hbWVzO1xuICAgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuICAgICAgICB2YXIgaTtcblxuICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICBjYXNlIDB4MDAwMTAwMDA6XG4gICAgICAgICAgICBnbHlwaE5hbWVzID0gTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDAwMDIwMDAwOlxuICAgICAgICAgICAgdmFyIG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7XG4gICAgICAgICAgICBpZiAobnVtR2x5cGhzICE9PSBtYXhwTnVtR2x5cGhzKSB7XG4gICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGdseXBoTmFtZUluZGV4ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkge1xuICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmb250LmdldFVpbnQxNigpO1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMzI3NjgpIHtcbiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGdseXBoTmFtZUluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGN1c3RvbU5hbWVzID0gW107XG4gICAgICAgICAgICB2YXIgc3RyQnVmID0gW107XG4gICAgICAgICAgICB3aGlsZSAoZm9udC5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgICAgdmFyIHN0cmluZ0xlbmd0aCA9IGZvbnQuZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgICBzdHJCdWYubGVuZ3RoID0gc3RyaW5nTGVuZ3RoO1xuICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBzdHJCdWZbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0Qnl0ZSgpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjdXN0b21OYW1lcy5wdXNoKHN0ckJ1Zi5qb2luKFwiXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdseXBoTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkge1xuICAgICAgICAgICAgICB2YXIgaiA9IGdseXBoTmFtZUluZGV4ZXNbaV07XG4gICAgICAgICAgICAgIGlmIChqIDwgMjU4KSB7XG4gICAgICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tqXSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKGN1c3RvbU5hbWVzW2ogLSAyNThdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgwMDAzMDAwMDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB3YXJuKFwiVW5rbm93bi91bnN1cHBvcnRlZCBwb3N0IHRhYmxlIHZlcnNpb24gXCIgKyB2ZXJzaW9uKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllc09iai5kZWZhdWx0RW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgZ2x5cGhOYW1lcyA9IHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcHJvcGVydGllc09iai5nbHlwaE5hbWVzID0gZ2x5cGhOYW1lcztcbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWFkTmFtZVRhYmxlKG5hbWVUYWJsZSkge1xuICAgICAgICB2YXIgc3RhcnQgPSAoZm9udC5zdGFydCA/IGZvbnQuc3RhcnQgOiAwKSArIG5hbWVUYWJsZS5vZmZzZXQ7XG4gICAgICAgIGZvbnQucG9zID0gc3RhcnQ7XG5cbiAgICAgICAgdmFyIG5hbWVzID0gW1tdLCBbXV07XG4gICAgICAgIHZhciBsZW5ndGggPSBuYW1lVGFibGUubGVuZ3RoLFxuICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoO1xuICAgICAgICB2YXIgZm9ybWF0ID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgICAgdmFyIEZPUk1BVF8wX0hFQURFUl9MRU5HVEggPSA2O1xuICAgICAgICBpZiAoZm9ybWF0ICE9PSAwIHx8IGxlbmd0aCA8IEZPUk1BVF8wX0hFQURFUl9MRU5HVEgpIHtcbiAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBuYW1lIHRhYmxlIGZvcm1hdCBvciB0YWJsZSBcInRvb1wiIHNtYWxsXG4gICAgICAgICAgcmV0dXJuIG5hbWVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBudW1SZWNvcmRzID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgICAgdmFyIHN0cmluZ3NTdGFydCA9IGZvbnQuZ2V0VWludDE2KCk7XG4gICAgICAgIHZhciByZWNvcmRzID0gW107XG4gICAgICAgIHZhciBOQU1FX1JFQ09SRF9MRU5HVEggPSAxMjtcbiAgICAgICAgdmFyIGksIGlpO1xuXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgaSA8IG51bVJlY29yZHMgJiYgZm9udC5wb3MgKyBOQU1FX1JFQ09SRF9MRU5HVEggPD0gZW5kO1xuICAgICAgICAgIGkrK1xuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgciA9IHtcbiAgICAgICAgICAgIHBsYXRmb3JtOiBmb250LmdldFVpbnQxNigpLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IGZvbnQuZ2V0VWludDE2KCksXG4gICAgICAgICAgICBsYW5ndWFnZTogZm9udC5nZXRVaW50MTYoKSxcbiAgICAgICAgICAgIG5hbWU6IGZvbnQuZ2V0VWludDE2KCksXG4gICAgICAgICAgICBsZW5ndGg6IGZvbnQuZ2V0VWludDE2KCksXG4gICAgICAgICAgICBvZmZzZXQ6IGZvbnQuZ2V0VWludDE2KCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyB1c2luZyBvbmx5IE1hY2ludG9zaCBhbmQgV2luZG93cyBwbGF0Zm9ybS9lbmNvZGluZyBuYW1lc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChyLnBsYXRmb3JtID09PSAxICYmIHIuZW5jb2RpbmcgPT09IDAgJiYgci5sYW5ndWFnZSA9PT0gMCkgfHxcbiAgICAgICAgICAgIChyLnBsYXRmb3JtID09PSAzICYmIHIuZW5jb2RpbmcgPT09IDEgJiYgci5sYW5ndWFnZSA9PT0gMHg0MDkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZWNvcmRzLnB1c2gocik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gcmVjb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IHJlY29yZHNbaV07XG4gICAgICAgICAgaWYgKHJlY29yZC5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIE5vdGhpbmcgdG8gcHJvY2VzcywgaWdub3JpbmcuXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwb3MgPSBzdGFydCArIHN0cmluZ3NTdGFydCArIHJlY29yZC5vZmZzZXQ7XG4gICAgICAgICAgaWYgKHBvcyArIHJlY29yZC5sZW5ndGggPiBlbmQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBvdXRzaWRlIG9mIG5hbWUgdGFibGUsIGlnbm9yaW5nXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvbnQucG9zID0gcG9zO1xuICAgICAgICAgIHZhciBuYW1lSW5kZXggPSByZWNvcmQubmFtZTtcbiAgICAgICAgICBpZiAocmVjb3JkLmVuY29kaW5nKSB7XG4gICAgICAgICAgICAvLyB1bmljb2RlXG4gICAgICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHJlY29yZC5sZW5ndGg7IGogPCBqajsgaiArPSAyKSB7XG4gICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0VWludDE2KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFtZXNbMV1bbmFtZUluZGV4XSA9IHN0cjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmFtZXNbMF1bbmFtZUluZGV4XSA9IGJ5dGVzVG9TdHJpbmcoZm9udC5nZXRCeXRlcyhyZWNvcmQubGVuZ3RoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lcztcbiAgICAgIH1cblxuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICB2YXIgVFRPcHNTdGFja0RlbHRhcyA9IFtcbiAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTIsIC0yLCAtMiwgLTIsIDAsIDAsIC0yLCAtNSxcbiAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAtMSwgMCwgLTEsIC0xLCAtMSwgLTEsXG4gICAgICAgIDEsIC0xLCAtOTk5LCAwLCAxLCAwLCAtMSwgLTIsIDAsIC0xLCAtMiwgLTEsIC0xLCAwLCAtMSwgLTEsXG4gICAgICAgIDAsIDAsIC05OTksIC05OTksIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTk5OSwgLTIsIC0yLCAtOTk5LCAwLCAtMiwgLTIsXG4gICAgICAgIDAsIDAsIC0yLCAwLCAtMiwgMCwgMCwgMCwgLTIsIC0xLCAtMSwgMSwgMSwgMCwgMCwgLTEsXG4gICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgLTEsIDAsIC05OTksIC0xLCAtMSxcbiAgICAgICAgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gICAgICAgIC0yLCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtMSwgLTEsIC0yLCAtMiwgMCwgMCwgMCwgMCwgLTEsIC0xLFxuICAgICAgICAtOTk5LCAtMiwgLTIsIDAsIDAsIC0xLCAtMiwgLTIsIDAsIDAsIDAsIC0xLCAtMSwgLTEsIC0yXTtcbiAgICAgIC8vIDB4QzAtREYgPT0gLTEgYW5kIDB4RTAtRkYgPT0gLTJcblxuICAgICAgZnVuY3Rpb24gc2FuaXRpemVUVFByb2dyYW0odGFibGUsIHR0Q29udGV4dCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRhYmxlLmRhdGE7XG4gICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICBqLFxuICAgICAgICAgIG4sXG4gICAgICAgICAgYixcbiAgICAgICAgICBmdW5jSWQsXG4gICAgICAgICAgcGMsXG4gICAgICAgICAgbGFzdEVuZGYgPSAwLFxuICAgICAgICAgIGxhc3REZWZmID0gMDtcbiAgICAgICAgdmFyIHN0YWNrID0gW107XG4gICAgICAgIHZhciBjYWxsc3RhY2sgPSBbXTtcbiAgICAgICAgdmFyIGZ1bmN0aW9uc0NhbGxlZCA9IFtdO1xuICAgICAgICB2YXIgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucztcbiAgICAgICAgdmFyIGluRkRFRiA9IGZhbHNlLFxuICAgICAgICAgIGlmTGV2ZWwgPSAwLFxuICAgICAgICAgIGluRUxTRSA9IDA7XG4gICAgICAgIGZvciAodmFyIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgKSB7XG4gICAgICAgICAgdmFyIG9wID0gZGF0YVtpKytdO1xuICAgICAgICAgIC8vIFRoZSBUcnVlVHlwZSBpbnN0cnVjdGlvbiBzZXQgZG9jcyBjYW4gYmUgZm91bmQgYXRcbiAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVFRSZWZNYW4vUk0wNS9DaGFwNS5odG1sXG4gICAgICAgICAgaWYgKG9wID09PSAweDQwKSB7XG4gICAgICAgICAgICAvLyBOUFVTSEIgLSBwdXNoZXMgbiBieXRlc1xuICAgICAgICAgICAgbiA9IGRhdGFbaSsrXTtcbiAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7XG4gICAgICAgICAgICAgIGkgKz0gbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDQxKSB7XG4gICAgICAgICAgICAvLyBOUFVTSFcgLSBwdXNoZXMgbiB3b3Jkc1xuICAgICAgICAgICAgbiA9IGRhdGFbaSsrXTtcbiAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7XG4gICAgICAgICAgICAgIGkgKz0gbiAqIDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICAgICAgICAgICAgYiA9IGRhdGFbaSsrXTtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKChiIDw8IDgpIHwgZGF0YVtpKytdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmOCkgPT09IDB4YjApIHtcbiAgICAgICAgICAgIC8vIFBVU0hCIC0gcHVzaGVzIGJ5dGVzXG4gICAgICAgICAgICBuID0gb3AgLSAweGIwICsgMTtcbiAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7XG4gICAgICAgICAgICAgIGkgKz0gbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZjgpID09PSAweGI4KSB7XG4gICAgICAgICAgICAvLyBQVVNIVyAtIHB1c2hlcyB3b3Jkc1xuICAgICAgICAgICAgbiA9IG9wIC0gMHhiOCArIDE7XG4gICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkge1xuICAgICAgICAgICAgICBpICs9IG4gKiAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgICAgICAgICAgIGIgPSBkYXRhW2krK107XG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaCgoYiA8PCA4KSB8IGRhdGFbaSsrXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJiICYmICF0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIENBTExcbiAgICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHtcbiAgICAgICAgICAgICAgLy8gY29sbGVjdGluZyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBmdW5jdGlvbnMgYXJlIHVzZWRcbiAgICAgICAgICAgICAgZnVuY0lkID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgIGlmIChpc05hTihmdW5jSWQpKSB7XG4gICAgICAgICAgICAgICAgaW5mbyhcIlRUOiBDQUxMIGVtcHR5IHN0YWNrIChvciBpbnZhbGlkIGVudHJ5KS5cIik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc1VzZWRbZnVuY0lkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNJZCBpbiB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YWNrTGVuZ3RoID1cbiAgICAgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoICsgdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW2Z1bmNJZF07XG4gICAgICAgICAgICAgICAgICBpZiAobmV3U3RhY2tMZW5ndGggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oXCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS5cIik7XG4gICAgICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IG5ld1N0YWNrTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICFmdW5jdGlvbnNDYWxsZWQuaW5jbHVkZXMoZnVuY0lkKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2FsbHN0YWNrLnB1c2goeyBkYXRhLCBpLCBzdGFja1RvcDogc3RhY2subGVuZ3RoIC0gMSB9KTtcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uc0NhbGxlZC5wdXNoKGZ1bmNJZCk7XG4gICAgICAgICAgICAgICAgICBwYyA9IHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkW2Z1bmNJZF07XG4gICAgICAgICAgICAgICAgICBpZiAoIXBjKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oXCJUVDogQ0FMTCBub24tZXhpc3RlbnQgZnVuY3Rpb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYy5kYXRhO1xuICAgICAgICAgICAgICAgICAgaSA9IHBjLmk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgyYyAmJiAhdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7XG4gICAgICAgICAgICAvLyBGREVGXG4gICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkge1xuICAgICAgICAgICAgICB3YXJuKFwiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZFwiKTtcbiAgICAgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluRkRFRiA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb2xsZWN0aW5nIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZFxuICAgICAgICAgICAgbGFzdERlZmYgPSBpO1xuICAgICAgICAgICAgZnVuY0lkID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtmdW5jSWRdID0geyBkYXRhLCBpIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgyZCkge1xuICAgICAgICAgICAgLy8gRU5ERiAtIGVuZCBvZiBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKGluRkRFRikge1xuICAgICAgICAgICAgICBpbkZERUYgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbGFzdEVuZGYgPSBpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGMgPSBjYWxsc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIGlmICghcGMpIHtcbiAgICAgICAgICAgICAgICB3YXJuKFwiVFQ6IEVOREYgYmFkIHN0YWNrXCIpO1xuICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZ1bmNJZCA9IGZ1bmN0aW9uc0NhbGxlZC5wb3AoKTtcbiAgICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7XG4gICAgICAgICAgICAgIGkgPSBwYy5pO1xuICAgICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXSA9XG4gICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoIC0gcGMuc3RhY2tUb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg4OSkge1xuICAgICAgICAgICAgLy8gSURFRiAtIGluc3RydWN0aW9uIGRlZmluaXRpb25cbiAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7XG4gICAgICAgICAgICAgIHdhcm4oXCJUVDogbmVzdGVkIElERUZzIG5vdCBhbGxvd2VkXCIpO1xuICAgICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5GREVGID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHJlY29yZGluZyBpdCBhcyBhIGZ1bmN0aW9uIHRvIHRyYWNrIEVOREZcbiAgICAgICAgICAgIGxhc3REZWZmID0gaTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDU4KSB7XG4gICAgICAgICAgICAvLyBJRlxuICAgICAgICAgICAgKytpZkxldmVsO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWIpIHtcbiAgICAgICAgICAgIC8vIEVMU0VcbiAgICAgICAgICAgIGluRUxTRSA9IGlmTGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OSkge1xuICAgICAgICAgICAgLy8gRUlGXG4gICAgICAgICAgICBpZiAoaW5FTFNFID09PSBpZkxldmVsKSB7XG4gICAgICAgICAgICAgIGluRUxTRSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAtLWlmTGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgxYykge1xuICAgICAgICAgICAgLy8gSk1QUlxuICAgICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkge1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgIC8vIG9ubHkganVtcGluZyBmb3J3YXJkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgICAgIGkgKz0gb2Zmc2V0IC0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBZGp1c3Rpbmcgc3RhY2sgbm90IGV4dGFjdGx5LCBidXQganVzdCBlbm91Z2ggdG8gZ2V0IGZ1bmN0aW9uIGlkXG4gICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkge1xuICAgICAgICAgICAgbGV0IHN0YWNrRGVsdGEgPSAwO1xuICAgICAgICAgICAgaWYgKG9wIDw9IDB4OGUpIHtcbiAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IFRUT3BzU3RhY2tEZWx0YXNbb3BdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA+PSAweGMwICYmIG9wIDw9IDB4ZGYpIHtcbiAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA+PSAweGUwKSB7XG4gICAgICAgICAgICAgIHN0YWNrRGVsdGEgPSAtMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcCA+PSAweDcxICYmIG9wIDw9IDB4NzUpIHtcbiAgICAgICAgICAgICAgbiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICBpZiAoIWlzTmFOKG4pKSB7XG4gICAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC1uICogMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHN0YWNrRGVsdGEgPCAwICYmIHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHN0YWNrRGVsdGErKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChzdGFja0RlbHRhID4gMCkge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKE5hTik7IC8vIHB1c2hpbmcgYW55IG51bWJlciBpbnRvIHN0YWNrXG4gICAgICAgICAgICAgIHN0YWNrRGVsdGEtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucztcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBbZGF0YV07XG4gICAgICAgIGlmIChpID4gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICBjb250ZW50LnB1c2gobmV3IFVpbnQ4QXJyYXkoaSAtIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3REZWZmID4gbGFzdEVuZGYpIHtcbiAgICAgICAgICB3YXJuKFwiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWxcIik7XG4gICAgICAgICAgLy8gbmV3IGZ1bmN0aW9uIGRlZmluaXRpb24gc3RhcnRlZCwgYnV0IG5vdCBmaW5pc2hlZFxuICAgICAgICAgIC8vIGNvbXBsZXRlIGZ1bmN0aW9uIGJ5IFtDTEVBUiwgRU5ERl1cbiAgICAgICAgICBjb250ZW50LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzB4MjIsIDB4MmRdKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjaGVja0ludmFsaWRGdW5jdGlvbnModHRDb250ZXh0LCBtYXhGdW5jdGlvbkRlZnMpIHtcbiAgICAgICAgaWYgKHR0Q29udGV4dC50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkLmxlbmd0aCA+IG1heEZ1bmN0aW9uRGVmcykge1xuICAgICAgICAgIHdhcm4oXCJUVDogbW9yZSBmdW5jdGlvbnMgZGVmaW5lZCB0aGFuIGV4cGVjdGVkXCIpO1xuICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICBpZiAoaiA+IG1heEZ1bmN0aW9uRGVmcykge1xuICAgICAgICAgICAgd2FybihcIlRUOiBpbnZhbGlkIGZ1bmN0aW9uIGlkOiBcIiArIGopO1xuICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2pdICYmICF0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtqXSkge1xuICAgICAgICAgICAgd2FybihcIlRUOiB1bmRlZmluZWQgZnVuY3Rpb246IFwiICsgaik7XG4gICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmb2xkVFRUYWJsZSh0YWJsZSwgY29udGVudCkge1xuICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gY29uY2F0ZW5hdGluZyB0aGUgY29udGVudCBpdGVtc1xuICAgICAgICAgIHZhciBuZXdMZW5ndGggPSAwO1xuICAgICAgICAgIHZhciBqLCBqajtcbiAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvbnRlbnQubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgbmV3TGVuZ3RoICs9IGNvbnRlbnRbal0ubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdMZW5ndGggPSAobmV3TGVuZ3RoICsgMykgJiB+MztcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobmV3TGVuZ3RoKTtcbiAgICAgICAgICB2YXIgcG9zID0gMDtcbiAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvbnRlbnQubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgcmVzdWx0LnNldChjb250ZW50W2pdLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IGNvbnRlbnRbal0ubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0YWJsZS5kYXRhID0gcmVzdWx0O1xuICAgICAgICAgIHRhYmxlLmxlbmd0aCA9IG5ld0xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbXMoZnBnbSwgcHJlcCwgY3Z0LCBtYXhGdW5jdGlvbkRlZnMpIHtcbiAgICAgICAgdmFyIHR0Q29udGV4dCA9IHtcbiAgICAgICAgICBmdW5jdGlvbnNEZWZpbmVkOiBbXSxcbiAgICAgICAgICBmdW5jdGlvbnNVc2VkOiBbXSxcbiAgICAgICAgICBmdW5jdGlvbnNTdGFja0RlbHRhczogW10sXG4gICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOiBmYWxzZSxcbiAgICAgICAgICBoaW50c1ZhbGlkOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoZnBnbSkge1xuICAgICAgICAgIHNhbml0aXplVFRQcm9ncmFtKGZwZ20sIHR0Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXApIHtcbiAgICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShwcmVwLCB0dENvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcGdtKSB7XG4gICAgICAgICAgY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3Z0ICYmIGN2dC5sZW5ndGggJiAxKSB7XG4gICAgICAgICAgdmFyIGN2dERhdGEgPSBuZXcgVWludDhBcnJheShjdnQubGVuZ3RoICsgMSk7XG4gICAgICAgICAgY3Z0RGF0YS5zZXQoY3Z0LmRhdGEpO1xuICAgICAgICAgIGN2dC5kYXRhID0gY3Z0RGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHRDb250ZXh0LmhpbnRzVmFsaWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc3RlcHMgbW9kaWZ5IHRoZSBvcmlnaW5hbCBmb250IGRhdGEsIG1ha2luZyBjb3B5XG4gICAgICBmb250ID0gbmV3IFN0cmVhbShuZXcgVWludDhBcnJheShmb250LmdldEJ5dGVzKCkpKTtcblxuICAgICAgbGV0IGhlYWRlciwgdGFibGVzO1xuICAgICAgaWYgKGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmb250KSkge1xuICAgICAgICBjb25zdCB0dGNEYXRhID0gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkRhdGEoZm9udCwgdGhpcy5uYW1lKTtcbiAgICAgICAgaGVhZGVyID0gdHRjRGF0YS5oZWFkZXI7XG4gICAgICAgIHRhYmxlcyA9IHR0Y0RhdGEudGFibGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZGVyID0gcmVhZE9wZW5UeXBlSGVhZGVyKGZvbnQpO1xuICAgICAgICB0YWJsZXMgPSByZWFkVGFibGVzKGZvbnQsIGhlYWRlci5udW1UYWJsZXMpO1xuICAgICAgfVxuICAgICAgbGV0IGNmZiwgY2ZmRmlsZTtcblxuICAgICAgdmFyIGlzVHJ1ZVR5cGUgPSAhdGFibGVzW1wiQ0ZGIFwiXTtcbiAgICAgIGlmICghaXNUcnVlVHlwZSkge1xuICAgICAgICBjb25zdCBpc0NvbXBvc2l0ZSA9XG4gICAgICAgICAgcHJvcGVydGllcy5jb21wb3NpdGUgJiZcbiAgICAgICAgICAoKHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW10pLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICEocHJvcGVydGllcy5jTWFwIGluc3RhbmNlb2YgSWRlbnRpdHlDTWFwKSk7XG4gICAgICAgIC8vIE9wZW5UeXBlIGZvbnQgKHNraXAgY29tcG9zaXRlIGZvbnRzIHdpdGggbm9uLWRlZmF1bHQgZ2x5cGggbWFwcGluZykuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoaGVhZGVyLnZlcnNpb24gPT09IFwiT1RUT1wiICYmICFpc0NvbXBvc2l0ZSkgfHxcbiAgICAgICAgICAhdGFibGVzLmhlYWQgfHxcbiAgICAgICAgICAhdGFibGVzLmhoZWEgfHxcbiAgICAgICAgICAhdGFibGVzLm1heHAgfHxcbiAgICAgICAgICAhdGFibGVzLnBvc3RcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTm8gbWFqb3IgdGFibGVzOiB0aHJvd2luZyBldmVyeXRoaW5nIGF0IGBDRkZGb250YC5cbiAgICAgICAgICBjZmZGaWxlID0gbmV3IFN0cmVhbSh0YWJsZXNbXCJDRkYgXCJdLmRhdGEpO1xuICAgICAgICAgIGNmZiA9IG5ldyBDRkZGb250KGNmZkZpbGUsIHByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydChuYW1lLCBjZmYsIHByb3BlcnRpZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRhYmxlcy5nbHlmO1xuICAgICAgICBkZWxldGUgdGFibGVzLmxvY2E7XG4gICAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTtcbiAgICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwO1xuICAgICAgICBkZWxldGUgdGFibGVzW1wiY3Z0IFwiXTtcbiAgICAgICAgdGhpcy5pc09wZW5UeXBlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGFibGVzLmxvY2EpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1JlcXVpcmVkIFwibG9jYVwiIHRhYmxlIGlzIG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFibGVzLmdseWYpIHtcbiAgICAgICAgICB3YXJuKCdSZXF1aXJlZCBcImdseWZcIiB0YWJsZSBpcyBub3QgZm91bmQgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7XG4gICAgICAgICAgLy8gTm90ZTogV2UgdXNlIGBzYW5pdGl6ZUdseXBoTG9jYXRpb25zYCB0byBhZGQgZHVtbXkgZ2x5ZiBkYXRhIGJlbG93LlxuICAgICAgICAgIHRhYmxlcy5nbHlmID0ge1xuICAgICAgICAgICAgdGFnOiBcImdseWZcIixcbiAgICAgICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc09wZW5UeXBlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGFibGVzLm1heHApIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCBcIm1heHBcIiB0YWJsZSBpcyBub3QgZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgZm9udC5wb3MgPSAoZm9udC5zdGFydCB8fCAwKSArIHRhYmxlcy5tYXhwLm9mZnNldDtcbiAgICAgIHZhciB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpO1xuICAgICAgY29uc3QgbnVtR2x5cGhzID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgIC8vIEdseXBoIDAgaXMgZHVwbGljYXRlZCBhbmQgYXBwZW5kZWQuXG4gICAgICBsZXQgbnVtR2x5cGhzT3V0ID0gbnVtR2x5cGhzICsgMTtcbiAgICAgIGxldCBkdXBGaXJzdEVudHJ5ID0gdHJ1ZTtcbiAgICAgIGlmIChudW1HbHlwaHNPdXQgPiAweGZmZmYpIHtcbiAgICAgICAgZHVwRmlyc3RFbnRyeSA9IGZhbHNlO1xuICAgICAgICBudW1HbHlwaHNPdXQgPSBudW1HbHlwaHM7XG4gICAgICAgIHdhcm4oXCJOb3QgZW5vdWdoIHNwYWNlIGluIGdseWZzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC5cIik7XG4gICAgICB9XG4gICAgICB2YXIgbWF4RnVuY3Rpb25EZWZzID0gMDtcbiAgICAgIHZhciBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSAwO1xuICAgICAgaWYgKHZlcnNpb24gPj0gMHgwMDAxMDAwMCAmJiB0YWJsZXMubWF4cC5sZW5ndGggPj0gMjIpIHtcbiAgICAgICAgLy8gbWF4Wm9uZXMgY2FuIGJlIGludmFsaWRcbiAgICAgICAgZm9udC5wb3MgKz0gODtcbiAgICAgICAgdmFyIG1heFpvbmVzID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgICAgaWYgKG1heFpvbmVzID4gMikge1xuICAgICAgICAgIC8vIHJlc2V0IHRvIDIgaWYgZm9udCBoYXMgaW52YWxpZCBtYXhab25lc1xuICAgICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMTRdID0gMDtcbiAgICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE1XSA9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZm9udC5wb3MgKz0gNDtcbiAgICAgICAgbWF4RnVuY3Rpb25EZWZzID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgICAgZm9udC5wb3MgKz0gNDtcbiAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgIH1cblxuICAgICAgdGFibGVzLm1heHAuZGF0YVs0XSA9IG51bUdseXBoc091dCA+PiA4O1xuICAgICAgdGFibGVzLm1heHAuZGF0YVs1XSA9IG51bUdseXBoc091dCAmIDI1NTtcblxuICAgICAgdmFyIGhpbnRzVmFsaWQgPSBzYW5pdGl6ZVRUUHJvZ3JhbXMoXG4gICAgICAgIHRhYmxlcy5mcGdtLFxuICAgICAgICB0YWJsZXMucHJlcCxcbiAgICAgICAgdGFibGVzW1wiY3Z0IFwiXSxcbiAgICAgICAgbWF4RnVuY3Rpb25EZWZzXG4gICAgICApO1xuICAgICAgaWYgKCFoaW50c1ZhbGlkKSB7XG4gICAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTtcbiAgICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwO1xuICAgICAgICBkZWxldGUgdGFibGVzW1wiY3Z0IFwiXTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHRoZSBobXR4IHRhYmxlIGNvbnRhaW5zIHRoZSBhZHZhbmNlIHdpZHRoIGFuZFxuICAgICAgLy8gc2lkZWJlYXJpbmdzIGluZm9ybWF0aW9uIGZvciBudW1HbHlwaHMgaW4gdGhlIG1heHAgdGFibGVcbiAgICAgIHNhbml0aXplTWV0cmljcyhcbiAgICAgICAgZm9udCxcbiAgICAgICAgdGFibGVzLmhoZWEsXG4gICAgICAgIHRhYmxlcy5obXR4LFxuICAgICAgICBudW1HbHlwaHNPdXQsXG4gICAgICAgIGR1cEZpcnN0RW50cnlcbiAgICAgICk7XG5cbiAgICAgIGlmICghdGFibGVzLmhlYWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCBcImhlYWRcIiB0YWJsZSBpcyBub3QgZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgc2FuaXRpemVIZWFkKHRhYmxlcy5oZWFkLCBudW1HbHlwaHMsIGlzVHJ1ZVR5cGUgPyB0YWJsZXMubG9jYS5sZW5ndGggOiAwKTtcblxuICAgICAgdmFyIG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgaWYgKGlzVHJ1ZVR5cGUpIHtcbiAgICAgICAgdmFyIGlzR2x5cGhMb2NhdGlvbnNMb25nID0gaW50MTYoXG4gICAgICAgICAgdGFibGVzLmhlYWQuZGF0YVs1MF0sXG4gICAgICAgICAgdGFibGVzLmhlYWQuZGF0YVs1MV1cbiAgICAgICAgKTtcbiAgICAgICAgdmFyIGdseXBoc0luZm8gPSBzYW5pdGl6ZUdseXBoTG9jYXRpb25zKFxuICAgICAgICAgIHRhYmxlcy5sb2NhLFxuICAgICAgICAgIHRhYmxlcy5nbHlmLFxuICAgICAgICAgIG51bUdseXBocyxcbiAgICAgICAgICBpc0dseXBoTG9jYXRpb25zTG9uZyxcbiAgICAgICAgICBoaW50c1ZhbGlkLFxuICAgICAgICAgIGR1cEZpcnN0RW50cnksXG4gICAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zXG4gICAgICAgICk7XG4gICAgICAgIG1pc3NpbmdHbHlwaHMgPSBnbHlwaHNJbmZvLm1pc3NpbmdHbHlwaHM7XG5cbiAgICAgICAgLy8gU29tZSBmb250cyBoYXZlIGluY29ycmVjdCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWVzLCBzbyB3ZSB1c2VcbiAgICAgICAgLy8gdGhlIGNvbXB1dGVkIHZhbHVlIGluc3RlYWQuXG4gICAgICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDIyKSB7XG4gICAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyNl0gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyA+PiA4O1xuICAgICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMjddID0gZ2x5cGhzSW5mby5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgJiAyNTU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGFibGVzLmhoZWEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCBcImhoZWFcIiB0YWJsZSBpcyBub3QgZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemVyIHJlZHVjZXMgdGhlIGdseXBoIGFkdmFuY2VXaWR0aCB0byB0aGUgbWF4QWR2YW5jZVdpZHRoXG4gICAgICAvLyBTb21ldGltZXMgaXQncyAwLiBUaGF0IG5lZWRzIHRvIGJlIGZpeGVkXG4gICAgICBpZiAodGFibGVzLmhoZWEuZGF0YVsxMF0gPT09IDAgJiYgdGFibGVzLmhoZWEuZGF0YVsxMV0gPT09IDApIHtcbiAgICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMF0gPSAweGZmO1xuICAgICAgICB0YWJsZXMuaGhlYS5kYXRhWzExXSA9IDB4ZmY7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3Qgc29tZSBtb3JlIGZvbnQgcHJvcGVydGllcyBmcm9tIHRoZSBPcGVuVHlwZSBoZWFkIGFuZFxuICAgICAgLy8gaGhlYSB0YWJsZXM7IHlNaW4gYW5kIGRlc2NlbnQgdmFsdWUgYXJlIGFsd2F5cyBuZWdhdGl2ZS5cbiAgICAgIHZhciBtZXRyaWNzT3ZlcnJpZGUgPSB7XG4gICAgICAgIHVuaXRzUGVyRW06IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbMThdLCB0YWJsZXMuaGVhZC5kYXRhWzE5XSksXG4gICAgICAgIHlNYXg6IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbNDJdLCB0YWJsZXMuaGVhZC5kYXRhWzQzXSksXG4gICAgICAgIHlNaW46IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbMzhdLCB0YWJsZXMuaGVhZC5kYXRhWzM5XSksXG4gICAgICAgIGFzY2VudDogaW50MTYodGFibGVzLmhoZWEuZGF0YVs0XSwgdGFibGVzLmhoZWEuZGF0YVs1XSksXG4gICAgICAgIGRlc2NlbnQ6IHNpZ25lZEludDE2KHRhYmxlcy5oaGVhLmRhdGFbNl0sIHRhYmxlcy5oaGVhLmRhdGFbN10pLFxuICAgICAgfTtcblxuICAgICAgLy8gUERGIEZvbnREZXNjcmlwdG9yIG1ldHJpY3MgbGllIC0tIHVzaW5nIGRhdGEgZnJvbSBhY3R1YWwgZm9udC5cbiAgICAgIHRoaXMuYXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmFzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtO1xuICAgICAgdGhpcy5kZXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmRlc2NlbnQgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTtcblxuICAgICAgLy8gVGhlICdwb3N0JyB0YWJsZSBoYXMgZ2x5cGhzIG5hbWVzLlxuICAgICAgaWYgKHRhYmxlcy5wb3N0KSB7XG4gICAgICAgIHJlYWRQb3N0U2NyaXB0VGFibGUodGFibGVzLnBvc3QsIHByb3BlcnRpZXMsIG51bUdseXBocyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBvcmlnaW5hbCAncG9zdCcgdGFibGUgaXMgbm90IG5lZWRlZCwgcmVwbGFjZSBpdC5cbiAgICAgIHRhYmxlcy5wb3N0ID0ge1xuICAgICAgICB0YWc6IFwicG9zdFwiLFxuICAgICAgICBkYXRhOiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcyksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IFtdO1xuXG4gICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gdHJ5IHRvIHNraXAgbWFwcGluZyBvZiBlbXB0eSBnbHlwaHMuXG4gICAgICBmdW5jdGlvbiBoYXNHbHlwaChnbHlwaElkKSB7XG4gICAgICAgIHJldHVybiAhbWlzc2luZ0dseXBoc1tnbHlwaElkXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7XG4gICAgICAgIHZhciBjaWRUb0dpZE1hcCA9IHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW107XG4gICAgICAgIHZhciBpc0NpZFRvR2lkTWFwRW1wdHkgPSBjaWRUb0dpZE1hcC5sZW5ndGggPT09IDA7XG5cbiAgICAgICAgcHJvcGVydGllcy5jTWFwLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCBjaWQpIHtcbiAgICAgICAgICBpZiAoY2lkID4gMHhmZmZmKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJNYXggc2l6ZSBvZiBDSUQgaXMgNjUsNTM1XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZ2x5cGhJZCA9IC0xO1xuICAgICAgICAgIGlmIChpc0NpZFRvR2lkTWFwRW1wdHkpIHtcbiAgICAgICAgICAgIGdseXBoSWQgPSBjaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGdseXBoSWQgPSBjaWRUb0dpZE1hcFtjaWRdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChnbHlwaElkID49IDAgJiYgZ2x5cGhJZCA8IG51bUdseXBocyAmJiBoYXNHbHlwaChnbHlwaElkKSkge1xuICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTW9zdCBvZiB0aGUgZm9sbG93aW5nIGxvZ2ljIGluIHRoaXMgY29kZSBicmFuY2ggaXMgYmFzZWQgb24gdGhlXG4gICAgICAgIC8vIDkuNi42LjQgb2YgdGhlIFBERiBzcGVjLlxuICAgICAgICB2YXIgY21hcFRhYmxlID0gcmVhZENtYXBUYWJsZShcbiAgICAgICAgICB0YWJsZXMuY21hcCxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIHRoaXMuaXNTeW1ib2xpY0ZvbnQsXG4gICAgICAgICAgcHJvcGVydGllcy5oYXNFbmNvZGluZ1xuICAgICAgICApO1xuICAgICAgICB2YXIgY21hcFBsYXRmb3JtSWQgPSBjbWFwVGFibGUucGxhdGZvcm1JZDtcbiAgICAgICAgdmFyIGNtYXBFbmNvZGluZ0lkID0gY21hcFRhYmxlLmVuY29kaW5nSWQ7XG4gICAgICAgIHZhciBjbWFwTWFwcGluZ3MgPSBjbWFwVGFibGUubWFwcGluZ3M7XG4gICAgICAgIHZhciBjbWFwTWFwcGluZ3NMZW5ndGggPSBjbWFwTWFwcGluZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgYmFzZUVuY29kaW5nID0gW107XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nICYmXG4gICAgICAgICAgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSA9PT0gXCJNYWNSb21hbkVuY29kaW5nXCIgfHxcbiAgICAgICAgICAgIHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSA9PT0gXCJXaW5BbnNpRW5jb2RpbmdcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmFzZUVuY29kaW5nID0gZ2V0RW5jb2RpbmcocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBmb250IGhhcyBhbiBlbmNvZGluZyBhbmQgaXMgbm90IHN5bWJvbGljIHRoZW4gZm9sbG93IHRoZVxuICAgICAgICAvLyBydWxlcyBpbiBzZWN0aW9uIDkuNi42LjQgb2YgdGhlIHNwZWMgb24gaG93IHRvIG1hcCAzLDEgYW5kIDEsMFxuICAgICAgICAvLyBjbWFwcy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcgJiZcbiAgICAgICAgICAhdGhpcy5pc1N5bWJvbGljRm9udCAmJlxuICAgICAgICAgICgoY21hcFBsYXRmb3JtSWQgPT09IDMgJiYgY21hcEVuY29kaW5nSWQgPT09IDEpIHx8XG4gICAgICAgICAgICAoY21hcFBsYXRmb3JtSWQgPT09IDEgJiYgY21hcEVuY29kaW5nSWQgPT09IDApKVxuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTtcbiAgICAgICAgICBmb3IgKGxldCBjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGhOYW1lLCBzdGFuZGFyZEdseXBoTmFtZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpZmZlcmVuY2VzICYmIGNoYXJDb2RlIGluIHRoaXMuZGlmZmVyZW5jZXMpIHtcbiAgICAgICAgICAgICAgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBjaGFyQ29kZSBpbiBiYXNlRW5jb2RpbmcgJiZcbiAgICAgICAgICAgICAgYmFzZUVuY29kaW5nW2NoYXJDb2RlXSAhPT0gXCJcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyQ29kZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBnbHlwaE5hbWUgPSBTdGFuZGFyZEVuY29kaW5nW2NoYXJDb2RlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZ2x5cGhOYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm9uLXN0YW5kYXJkIGdseXBoIG5hbWVzIGFyZSByZXNvbHZlZCB0byB2YWxpZCBvbmVzLlxuICAgICAgICAgICAgc3RhbmRhcmRHbHlwaE5hbWUgPSByZWNvdmVyR2x5cGhOYW1lKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7XG5cbiAgICAgICAgICAgIHZhciB1bmljb2RlT3JDaGFyQ29kZTtcbiAgICAgICAgICAgIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMSkge1xuICAgICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IGdseXBoc1VuaWNvZGVNYXBbc3RhbmRhcmRHbHlwaE5hbWVdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMSAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiB0aGUgZW5jb2RpbmcgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIG1hYyBvcyB0YWJsZS5cbiAgICAgICAgICAgICAgdW5pY29kZU9yQ2hhckNvZGUgPSBNYWNSb21hbkVuY29kaW5nLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGlmIChjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGUgIT09IHVuaWNvZGVPckNoYXJDb2RlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gY21hcE1hcHBpbmdzW2ldLmdseXBoSWQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMCkge1xuICAgICAgICAgIC8vIERlZmF1bHQgVW5pY29kZSBzZW1hbnRpY3MsIHVzZSB0aGUgY2hhcmNvZGVzIGFzIGlzLlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY21hcE1hcHBpbmdzTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NtYXBNYXBwaW5nc1tpXS5jaGFyQ29kZV0gPVxuICAgICAgICAgICAgICBjbWFwTWFwcGluZ3NbaV0uZ2x5cGhJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBvbmx5IGEgKDEsIDApIGNtYXAgdGFibGUsIHRoZSBjaGFyIGNvZGUgaXMgYSBzaW5nbGVcbiAgICAgICAgICAvLyBieXRlIGFuZCBpdCBpcyB1c2VkIGRpcmVjdGx5IGFzIHRoZSBjaGFyIGNvZGUuXG5cbiAgICAgICAgICAvLyBXaGVuIGEgKDMsIDApIGNtYXAgdGFibGUgaXMgcHJlc2VudCwgaXQgaXMgdXNlZCBpbnN0ZWFkIGJ1dCB0aGVcbiAgICAgICAgICAvLyBzcGVjIGhhcyBzcGVjaWFsIHJ1bGVzIGZvciBjaGFyIGNvZGVzIGluIHRoZSByYW5nZSBvZiAweEYwMDAgdG9cbiAgICAgICAgICAvLyAweEYwRkYgYW5kIGl0IHNheXMgdGhlICgzLCAwKSB0YWJsZSBzaG91bGQgbWFwIHRoZSB2YWx1ZXMgZnJvbVxuICAgICAgICAgIC8vIHRoZSAoMSwgMCkgdGFibGUgYnkgcHJlcGVuZGluZyAweEYwIHRvIHRoZSBjaGFyIGNvZGVzLiBUbyByZXZlcnNlXG4gICAgICAgICAgLy8gdGhpcywgdGhlIHVwcGVyIGJpdHMgb2YgdGhlIGNoYXIgY29kZSBhcmUgY2xlYXJlZCwgYnV0IG9ubHkgZm9yIHRoZVxuICAgICAgICAgIC8vIHNwZWNpYWwgcmFuZ2Ugc2luY2Ugc29tZSBQREZzIGhhdmUgY2hhciBjb2RlcyBvdXRzaWRlIG9mIHRoaXMgcmFuZ2VcbiAgICAgICAgICAvLyAoZS5nLiAweDIwMTMpIHdoaWNoIHdoZW4gbWFza2VkIHdvdWxkIG92ZXJ3cml0ZSBvdGhlciB2YWx1ZXMgaW4gdGhlXG4gICAgICAgICAgLy8gY21hcC5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY2hhckNvZGUgPSBjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGU7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGNtYXBQbGF0Zm9ybUlkID09PSAzICYmXG4gICAgICAgICAgICAgIGNoYXJDb2RlID49IDB4ZjAwMCAmJlxuICAgICAgICAgICAgICBjaGFyQ29kZSA8PSAweGYwZmZcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjaGFyQ29kZSAmPSAweGZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gY21hcE1hcHBpbmdzW2ldLmdseXBoSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGFzdCwgdHJ5IHRvIG1hcCBhbnkgbWlzc2luZyBjaGFyY29kZXMgdXNpbmcgdGhlIHBvc3QgdGFibGUuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzLmdseXBoTmFtZXMgJiYgYmFzZUVuY29kaW5nLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjaGFyQ29kZVRvR2x5cGhJZFtpXSA9PT0gdW5kZWZpbmVkICYmIGJhc2VFbmNvZGluZ1tpXSkge1xuICAgICAgICAgICAgICBnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbaV07XG4gICAgICAgICAgICAgIGNvbnN0IGdseXBoSWQgPSBwcm9wZXJ0aWVzLmdseXBoTmFtZXMuaW5kZXhPZihnbHlwaE5hbWUpO1xuICAgICAgICAgICAgICBpZiAoZ2x5cGhJZCA+IDAgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHtcbiAgICAgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtpXSA9IGdseXBoSWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXJDb2RlVG9HbHlwaElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBkZWZpbmVzIGF0IGxlYXN0IG9uZSBnbHlwaFxuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFswXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGljYWxseSBnbHlwaCAwIGlzIGR1cGxpY2F0ZWQgYW5kIHRoZSBtYXBwaW5nIG11c3QgYmUgdXBkYXRlZCwgYnV0IGlmXG4gICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSB0byBkdXBsaWNhdGUsIHRoZSBnbHlwaCBpZCBpcyBsZWZ0IHRoZSBzYW1lLiBJblxuICAgICAgLy8gdGhpcyBjYXNlLCBnbHlwaCAwIG1heSBub3Qgd29yayBjb3JyZWN0bHksIGJ1dCB0aGF0IGlzIGJldHRlciB0aGFuXG4gICAgICAvLyBoYXZpbmcgdGhlIHdob2xlIGZvbnQgZmFpbC5cbiAgICAgIGxldCBnbHlwaFplcm9JZCA9IG51bUdseXBoc091dCAtIDE7XG4gICAgICBpZiAoIWR1cEZpcnN0RW50cnkpIHtcbiAgICAgICAgZ2x5cGhaZXJvSWQgPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0aW5nIGdseXBocyBhbmQgaWRzIGludG8gZm9udCdzIGNtYXAgdGFibGVcbiAgICAgIHZhciBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhjaGFyQ29kZVRvR2x5cGhJZCwgaGFzR2x5cGgsIGdseXBoWmVyb0lkKTtcbiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG5ld01hcHBpbmcudG9Gb250Q2hhcjtcbiAgICAgIHRhYmxlcy5jbWFwID0ge1xuICAgICAgICB0YWc6IFwiY21hcFwiLFxuICAgICAgICBkYXRhOiBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbnVtR2x5cGhzT3V0KSxcbiAgICAgIH07XG5cbiAgICAgIGlmICghdGFibGVzW1wiT1MvMlwiXSB8fCAhdmFsaWRhdGVPUzJUYWJsZSh0YWJsZXNbXCJPUy8yXCJdLCBmb250KSkge1xuICAgICAgICB0YWJsZXNbXCJPUy8yXCJdID0ge1xuICAgICAgICAgIHRhZzogXCJPUy8yXCIsXG4gICAgICAgICAgZGF0YTogY3JlYXRlT1MyVGFibGUoXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCxcbiAgICAgICAgICAgIG1ldHJpY3NPdmVycmlkZVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNUcnVlVHlwZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRyeWluZyB0byByZXBhaXIgQ0ZGIGZpbGVcbiAgICAgICAgICBjZmZGaWxlID0gbmV3IFN0cmVhbSh0YWJsZXNbXCJDRkYgXCJdLmRhdGEpO1xuICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgQ0ZGUGFyc2VyKFxuICAgICAgICAgICAgY2ZmRmlsZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICBTRUFDX0FOQUxZU0lTX0VOQUJMRURcbiAgICAgICAgICApO1xuICAgICAgICAgIGNmZiA9IHBhcnNlci5wYXJzZSgpO1xuICAgICAgICAgIGNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7XG4gICAgICAgICAgdmFyIGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKGNmZik7XG4gICAgICAgICAgdGFibGVzW1wiQ0ZGIFwiXS5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2FybihcIkZhaWxlZCB0byBjb21waWxlIGZvbnQgXCIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLWNyZWF0aW5nICduYW1lJyB0YWJsZVxuICAgICAgaWYgKCF0YWJsZXMubmFtZSkge1xuICAgICAgICB0YWJsZXMubmFtZSA9IHtcbiAgICAgICAgICB0YWc6IFwibmFtZVwiLFxuICAgICAgICAgIGRhdGE6IGNyZWF0ZU5hbWVUYWJsZSh0aGlzLm5hbWUpLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gLi4uIHVzaW5nIGV4aXN0aW5nICduYW1lJyB0YWJsZSBhcyBwcm90b3R5cGVcbiAgICAgICAgdmFyIG5hbWVQcm90b3R5cGUgPSByZWFkTmFtZVRhYmxlKHRhYmxlcy5uYW1lKTtcbiAgICAgICAgdGFibGVzLm5hbWUuZGF0YSA9IGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBuYW1lUHJvdG90eXBlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgT3BlblR5cGVGaWxlQnVpbGRlcihoZWFkZXIudmVyc2lvbik7XG4gICAgICBmb3IgKHZhciB0YWJsZVRhZyBpbiB0YWJsZXMpIHtcbiAgICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTtcbiAgICB9LFxuXG4gICAgY29udmVydDogZnVuY3Rpb24gRm9udF9jb252ZXJ0KGZvbnROYW1lLCBmb250LCBwcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBUT0RPOiBDaGVjayB0aGUgY2hhcnN0cmluZyB3aWR0aHMgdG8gZGV0ZXJtaW5lIHRoaXMuXG4gICAgICBwcm9wZXJ0aWVzLmZpeGVkUGl0Y2ggPSBmYWxzZTtcblxuICAgICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7XG4gICAgICAgIC8vIEZvciBUeXBlMSBmb250cyB0aGF0IGRvIG5vdCBpbmNsdWRlIGVpdGhlciBgVG9Vbmljb2RlYCBvciBgRW5jb2RpbmdgXG4gICAgICAgIC8vIGRhdGEsIGF0dGVtcHQgdG8gdXNlIHRoZSBgYnVpbHRJbkVuY29kaW5nYCB0byBpbXByb3ZlIHRleHQgc2VsZWN0aW9uLlxuICAgICAgICBhZGp1c3RUb1VuaWNvZGUocHJvcGVydGllcywgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpO1xuICAgICAgfVxuXG4gICAgICAvLyBUeXBlIDEgZm9udHMgaGF2ZSBhIG5vdGRlZiBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nLCBzbyBnbHlwaCAwXG4gICAgICAvLyBiZWNvbWVzIGdseXBoIDEuIEluIGEgQ0ZGIGZvbnQgZ2x5cGggMCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZVxuICAgICAgLy8gY2hhciBzdHJpbmdzLlxuICAgICAgbGV0IGdseXBoWmVyb0lkID0gMTtcbiAgICAgIGlmIChmb250IGluc3RhbmNlb2YgQ0ZGRm9udCkge1xuICAgICAgICBnbHlwaFplcm9JZCA9IGZvbnQubnVtR2x5cGhzIC0gMTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXBwaW5nID0gZm9udC5nZXRHbHlwaE1hcHBpbmcocHJvcGVydGllcyk7XG4gICAgICB2YXIgbmV3TWFwcGluZyA9IGFkanVzdE1hcHBpbmcoXG4gICAgICAgIG1hcHBpbmcsXG4gICAgICAgIGZvbnQuaGFzR2x5cGhJZC5iaW5kKGZvbnQpLFxuICAgICAgICBnbHlwaFplcm9JZFxuICAgICAgKTtcbiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG5ld01hcHBpbmcudG9Gb250Q2hhcjtcbiAgICAgIHZhciBudW1HbHlwaHMgPSBmb250Lm51bUdseXBocztcblxuICAgICAgZnVuY3Rpb24gZ2V0Q2hhckNvZGVzKGNoYXJDb2RlVG9HbHlwaElkLCBnbHlwaElkKSB7XG4gICAgICAgIHZhciBjaGFyQ29kZXMgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkge1xuICAgICAgICAgIGlmIChnbHlwaElkID09PSBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0pIHtcbiAgICAgICAgICAgIGlmICghY2hhckNvZGVzKSB7XG4gICAgICAgICAgICAgIGNoYXJDb2RlcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hhckNvZGVzLnB1c2goY2hhckNvZGUgfCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYXJDb2RlcztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHtcbiAgICAgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHtcbiAgICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkW1xuICAgICAgICAgIG5ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZVxuICAgICAgICBdID0gZ2x5cGhJZDtcbiAgICAgICAgcmV0dXJuIG5ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VhY3MgPSBmb250LnNlYWNzO1xuICAgICAgaWYgKFNFQUNfQU5BTFlTSVNfRU5BQkxFRCAmJiBzZWFjcyAmJiBzZWFjcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgICAgdmFyIGNoYXJzZXQgPSBmb250LmdldENoYXJzZXQoKTtcbiAgICAgICAgdmFyIHNlYWNNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKHZhciBnbHlwaElkIGluIHNlYWNzKSB7XG4gICAgICAgICAgZ2x5cGhJZCB8PSAwO1xuICAgICAgICAgIHZhciBzZWFjID0gc2VhY3NbZ2x5cGhJZF07XG4gICAgICAgICAgdmFyIGJhc2VHbHlwaE5hbWUgPSBTdGFuZGFyZEVuY29kaW5nW3NlYWNbMl1dO1xuICAgICAgICAgIHZhciBhY2NlbnRHbHlwaE5hbWUgPSBTdGFuZGFyZEVuY29kaW5nW3NlYWNbM11dO1xuICAgICAgICAgIHZhciBiYXNlR2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihiYXNlR2x5cGhOYW1lKTtcbiAgICAgICAgICB2YXIgYWNjZW50R2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihhY2NlbnRHbHlwaE5hbWUpO1xuICAgICAgICAgIGlmIChiYXNlR2x5cGhJZCA8IDAgfHwgYWNjZW50R2x5cGhJZCA8IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYWNjZW50T2Zmc2V0ID0ge1xuICAgICAgICAgICAgeDogc2VhY1swXSAqIG1hdHJpeFswXSArIHNlYWNbMV0gKiBtYXRyaXhbMl0gKyBtYXRyaXhbNF0sXG4gICAgICAgICAgICB5OiBzZWFjWzBdICogbWF0cml4WzFdICsgc2VhY1sxXSAqIG1hdHJpeFszXSArIG1hdHJpeFs1XSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdmFyIGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTtcbiAgICAgICAgICBpZiAoIWNoYXJDb2Rlcykge1xuICAgICAgICAgICAgLy8gVGhlcmUncyBubyBwb2ludCBpbiBtYXBwaW5nIGl0IGlmIHRoZSBjaGFyIGNvZGUgd2FzIG5ldmVyIG1hcHBlZFxuICAgICAgICAgICAgLy8gdG8gYmVnaW4gd2l0aC5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGFyQ29kZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gY2hhckNvZGVzW2ldO1xuICAgICAgICAgICAgLy8gRmluZCBhIGZvbnRDaGFyQ29kZSB0aGF0IG1hcHMgdG8gdGhlIGJhc2UgYW5kIGFjY2VudCBnbHlwaHMuXG4gICAgICAgICAgICAvLyBJZiBvbmUgZG9lc24ndCBleGlzdHMsIGNyZWF0ZSBpdC5cbiAgICAgICAgICAgIHZhciBjaGFyQ29kZVRvR2x5cGhJZCA9IG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQ7XG4gICAgICAgICAgICB2YXIgYmFzZUZvbnRDaGFyQ29kZSA9IGNyZWF0ZUNoYXJDb2RlKFxuICAgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZCxcbiAgICAgICAgICAgICAgYmFzZUdseXBoSWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgYWNjZW50Rm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoXG4gICAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkLFxuICAgICAgICAgICAgICBhY2NlbnRHbHlwaElkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2VhY01hcFtjaGFyQ29kZV0gPSB7XG4gICAgICAgICAgICAgIGJhc2VGb250Q2hhckNvZGUsXG4gICAgICAgICAgICAgIGFjY2VudEZvbnRDaGFyQ29kZSxcbiAgICAgICAgICAgICAgYWNjZW50T2Zmc2V0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvcGVydGllcy5zZWFjTWFwID0gc2VhY01hcDtcbiAgICAgIH1cblxuICAgICAgdmFyIHVuaXRzUGVyRW0gPSAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWClbMF07XG5cbiAgICAgIHZhciBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoXCJcXHg0RlxceDU0XFx4NTRcXHg0RlwiKTtcbiAgICAgIC8vIFBvc3RTY3JpcHQgRm9udCBQcm9ncmFtXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFwiQ0ZGIFwiLCBmb250LmRhdGEpO1xuICAgICAgLy8gT1MvMiBhbmQgV2luZG93cyBTcGVjaWZpYyBtZXRyaWNzXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFxuICAgICAgICBcIk9TLzJcIixcbiAgICAgICAgY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZClcbiAgICAgICk7XG4gICAgICAvLyBDaGFyYWN0ZXIgdG8gZ2x5cGhzIG1hcHBpbmdcbiAgICAgIGJ1aWxkZXIuYWRkVGFibGUoXG4gICAgICAgIFwiY21hcFwiLFxuICAgICAgICBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbnVtR2x5cGhzKVxuICAgICAgKTtcbiAgICAgIC8vIEZvbnQgaGVhZGVyXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFxuICAgICAgICBcImhlYWRcIixcbiAgICAgICAgXCJcXHgwMFxceDAxXFx4MDBcXHgwMFwiICsgLy8gVmVyc2lvbiBudW1iZXJcbiAgICAgICAgXCJcXHgwMFxceDAwXFx4MTBcXHgwMFwiICsgLy8gZm9udFJldmlzaW9uXG4gICAgICAgIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcIiArIC8vIGNoZWNrc3VtQWRqdXN0ZW1lbnRcbiAgICAgICAgXCJcXHg1RlxceDBGXFx4M0NcXHhGNVwiICsgLy8gbWFnaWNOdW1iZXJcbiAgICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyBGbGFnc1xuICAgICAgICBzYWZlU3RyaW5nMTYodW5pdHNQZXJFbSkgKyAvLyB1bml0c1BlckVNXG4gICAgICAgIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHg5ZVxceDBiXFx4N2VcXHgyN1wiICsgLy8gY3JlYXRpb24gZGF0ZVxuICAgICAgICBcIlxceDAwXFx4MDBcXHgwMFxceDAwXFx4OWVcXHgwYlxceDdlXFx4MjdcIiArIC8vIG1vZGlmaWZpY2F0aW9uIGRhdGVcbiAgICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyB4TWluXG4gICAgICAgIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmRlc2NlbnQpICsgLy8geU1pblxuICAgICAgICBcIlxceDBGXFx4RkZcIiArIC8vIHhNYXhcbiAgICAgICAgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuYXNjZW50KSArIC8vIHlNYXhcbiAgICAgICAgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDIgOiAwKSArIC8vIG1hY1N0eWxlXG4gICAgICAgIFwiXFx4MDBcXHgxMVwiICsgLy8gbG93ZXN0UmVjUFBFTVxuICAgICAgICBcIlxceDAwXFx4MDBcIiArIC8vIGZvbnREaXJlY3Rpb25IaW50XG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gaW5kZXhUb0xvY0Zvcm1hdFxuICAgICAgICAgIFwiXFx4MDBcXHgwMFwiXG4gICAgICApOyAvLyBnbHlwaERhdGFGb3JtYXRcblxuICAgICAgLy8gSG9yaXpvbnRhbCBoZWFkZXJcbiAgICAgIGJ1aWxkZXIuYWRkVGFibGUoXG4gICAgICAgIFwiaGhlYVwiLFxuICAgICAgICBcIlxceDAwXFx4MDFcXHgwMFxceDAwXCIgKyAvLyBWZXJzaW9uIG51bWJlclxuICAgICAgICBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgLy8gVHlwb2dyYXBoaWMgQXNjZW50XG4gICAgICAgIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmRlc2NlbnQpICsgLy8gVHlwb2dyYXBoaWMgRGVzY2VudFxuICAgICAgICBcIlxceDAwXFx4MDBcIiArIC8vIExpbmUgR2FwXG4gICAgICAgIFwiXFx4RkZcXHhGRlwiICsgLy8gYWR2YW5jZVdpZHRoTWF4XG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gbWluTGVmdFNpZGViZWFyaW5nXG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gbWluUmlnaHRTaWRlYmVhcmluZ1xuICAgICAgICBcIlxceDAwXFx4MDBcIiArIC8vIHhNYXhFeHRlbnRcbiAgICAgICAgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuY2FwSGVpZ2h0KSArIC8vIGNhcmV0U2xvcGVSaXNlXG4gICAgICAgIHNhZmVTdHJpbmcxNihNYXRoLnRhbihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlKSAqIHByb3BlcnRpZXMueEhlaWdodCkgKyAvLyBjYXJldFNsb3BlUnVuXG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gY2FyZXRPZmZzZXRcbiAgICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyAtcmVzZXJ2ZWQtXG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gLXJlc2VydmVkLVxuICAgICAgICBcIlxceDAwXFx4MDBcIiArIC8vIC1yZXNlcnZlZC1cbiAgICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyAtcmVzZXJ2ZWQtXG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gbWV0cmljRGF0YUZvcm1hdFxuICAgICAgICAgIHN0cmluZzE2KG51bUdseXBocylcbiAgICAgICk7IC8vIE51bWJlciBvZiBITWV0cmljc1xuXG4gICAgICAvLyBIb3Jpem9udGFsIG1ldHJpY3NcbiAgICAgIGJ1aWxkZXIuYWRkVGFibGUoXG4gICAgICAgIFwiaG10eFwiLFxuICAgICAgICAoZnVuY3Rpb24gZm9udEZpZWxkc0htdHgoKSB7XG4gICAgICAgICAgdmFyIGNoYXJzdHJpbmdzID0gZm9udC5jaGFyc3RyaW5ncztcbiAgICAgICAgICB2YXIgY2ZmV2lkdGhzID0gZm9udC5jZmYgPyBmb250LmNmZi53aWR0aHMgOiBudWxsO1xuICAgICAgICAgIHZhciBobXR4ID0gXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiOyAvLyBGYWtlIC5ub3RkZWZcbiAgICAgICAgICBmb3IgKGxldCBpID0gMSwgaWkgPSBudW1HbHlwaHM7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSAwO1xuICAgICAgICAgICAgaWYgKGNoYXJzdHJpbmdzKSB7XG4gICAgICAgICAgICAgIHZhciBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbaSAtIDFdO1xuICAgICAgICAgICAgICB3aWR0aCA9IFwid2lkdGhcIiBpbiBjaGFyc3RyaW5nID8gY2hhcnN0cmluZy53aWR0aCA6IDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNmZldpZHRocykge1xuICAgICAgICAgICAgICB3aWR0aCA9IE1hdGguY2VpbChjZmZXaWR0aHNbaV0gfHwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBobXR4ICs9IHN0cmluZzE2KHdpZHRoKSArIHN0cmluZzE2KDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaG10eDtcbiAgICAgICAgfSkoKVxuICAgICAgKTtcblxuICAgICAgLy8gTWF4aW11bSBwcm9maWxlXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFxuICAgICAgICBcIm1heHBcIixcbiAgICAgICAgXCJcXHgwMFxceDAwXFx4NTBcXHgwMFwiICsgc3RyaW5nMTYobnVtR2x5cGhzKSAvLyBWZXJzaW9uIG51bWJlclxuICAgICAgKTsgLy8gTnVtIG9mIGdseXBoc1xuXG4gICAgICAvLyBOYW1pbmcgdGFibGVzXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFwibmFtZVwiLCBjcmVhdGVOYW1lVGFibGUoZm9udE5hbWUpKTtcblxuICAgICAgLy8gUG9zdFNjcmlwdCBpbmZvcm1hdGlvblxuICAgICAgYnVpbGRlci5hZGRUYWJsZShcInBvc3RcIiwgY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpKTtcblxuICAgICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpO1xuICAgIH0sXG5cbiAgICBnZXQgc3BhY2VXaWR0aCgpIHtcbiAgICAgIC8vIHRyeWluZyB0byBlc3RpbWF0ZSBzcGFjZSBjaGFyYWN0ZXIgd2lkdGhcbiAgICAgIHZhciBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzID0gW1wic3BhY2VcIiwgXCJtaW51c1wiLCBcIm9uZVwiLCBcImlcIiwgXCJJXCJdO1xuICAgICAgdmFyIHdpZHRoO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcG9zc2libGVTcGFjZVJlcGxhY2VtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHZhciBnbHlwaE5hbWUgPSBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzW2ldO1xuICAgICAgICAvLyBpZiBwb3NzaWJsZSwgZ2V0dGluZyB3aWR0aCBieSBnbHlwaCBuYW1lXG4gICAgICAgIGlmIChnbHlwaE5hbWUgaW4gdGhpcy53aWR0aHMpIHtcbiAgICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2dseXBoTmFtZV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7XG4gICAgICAgIHZhciBnbHlwaFVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV07XG4gICAgICAgIC8vIGZpbmRpbmcgdGhlIGNoYXJjb2RlIHZpYSB1bmljb2RlVG9DSUQgbWFwXG4gICAgICAgIHZhciBjaGFyY29kZSA9IDA7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvc2l0ZSAmJiB0aGlzLmNNYXAuY29udGFpbnMoZ2x5cGhVbmljb2RlKSkge1xuICAgICAgICAgIGNoYXJjb2RlID0gdGhpcy5jTWFwLmxvb2t1cChnbHlwaFVuaWNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIC4uLiB2aWEgdG9Vbmljb2RlIG1hcFxuICAgICAgICBpZiAoIWNoYXJjb2RlICYmIHRoaXMudG9Vbmljb2RlKSB7XG4gICAgICAgICAgY2hhcmNvZGUgPSB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGdseXBoVW5pY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0dGluZyBpdCB0byB1bmljb2RlIGlmIG5lZ2F0aXZlIG9yIHVuZGVmaW5lZFxuICAgICAgICBpZiAoY2hhcmNvZGUgPD0gMCkge1xuICAgICAgICAgIGNoYXJjb2RlID0gZ2x5cGhVbmljb2RlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRyeWluZyB0byBnZXQgd2lkdGggdmlhIGNoYXJjb2RlXG4gICAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbY2hhcmNvZGVdO1xuICAgICAgICBpZiAod2lkdGgpIHtcbiAgICAgICAgICBicmVhazsgLy8gdGhlIG5vbi16ZXJvIHdpZHRoIGZvdW5kXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdpZHRoID0gd2lkdGggfHwgdGhpcy5kZWZhdWx0V2lkdGg7XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwic3BhY2VXaWR0aFwiLCB3aWR0aCk7XG4gICAgfSxcblxuICAgIGNoYXJUb0dseXBoOiBmdW5jdGlvbiBGb250X2NoYXJUb0dseXBoKGNoYXJjb2RlLCBpc1NwYWNlKSB7XG4gICAgICB2YXIgZm9udENoYXJDb2RlLCB3aWR0aCwgb3BlcmF0b3JMaXN0SWQ7XG5cbiAgICAgIHZhciB3aWR0aENvZGUgPSBjaGFyY29kZTtcbiAgICAgIGlmICh0aGlzLmNNYXAgJiYgdGhpcy5jTWFwLmNvbnRhaW5zKGNoYXJjb2RlKSkge1xuICAgICAgICB3aWR0aENvZGUgPSB0aGlzLmNNYXAubG9va3VwKGNoYXJjb2RlKTtcbiAgICAgIH1cbiAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbd2lkdGhDb2RlXTtcbiAgICAgIHdpZHRoID0gaXNOdW0od2lkdGgpID8gd2lkdGggOiB0aGlzLmRlZmF1bHRXaWR0aDtcbiAgICAgIHZhciB2bWV0cmljID0gdGhpcy52bWV0cmljcyAmJiB0aGlzLnZtZXRyaWNzW3dpZHRoQ29kZV07XG5cbiAgICAgIGxldCB1bmljb2RlID1cbiAgICAgICAgdGhpcy50b1VuaWNvZGUuZ2V0KGNoYXJjb2RlKSB8fFxuICAgICAgICB0aGlzLmZhbGxiYWNrVG9Vbmljb2RlLmdldChjaGFyY29kZSkgfHxcbiAgICAgICAgY2hhcmNvZGU7XG4gICAgICBpZiAodHlwZW9mIHVuaWNvZGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgdW5pY29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc0luRm9udCA9IGNoYXJjb2RlIGluIHRoaXMudG9Gb250Q2hhcjtcbiAgICAgIC8vIEZpcnN0IHRyeSB0aGUgdG9Gb250Q2hhciBtYXAsIGlmIGl0J3Mgbm90IHRoZXJlIHRoZW4gdHJ5IGZhbGxpbmdcbiAgICAgIC8vIGJhY2sgdG8gdGhlIGNoYXIgY29kZS5cbiAgICAgIGZvbnRDaGFyQ29kZSA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gfHwgY2hhcmNvZGU7XG4gICAgICBpZiAodGhpcy5taXNzaW5nRmlsZSkge1xuICAgICAgICBjb25zdCBnbHlwaE5hbWUgPVxuICAgICAgICAgIHRoaXMuZGlmZmVyZW5jZXNbY2hhcmNvZGVdIHx8IHRoaXMuZGVmYXVsdEVuY29kaW5nW2NoYXJjb2RlXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChnbHlwaE5hbWUgPT09IFwiLm5vdGRlZlwiIHx8IGdseXBoTmFtZSA9PT0gXCJcIikgJiZcbiAgICAgICAgICB0aGlzLnR5cGUgPT09IFwiVHlwZTFcIlxuICAgICAgICApIHtcbiAgICAgICAgICAvLyAubm90ZGVmIGdseXBocyBzaG91bGQgYmUgaW52aXNpYmxlIGluIG5vbi1lbWJlZGRlZCBUeXBlMSBmb250cywgc29cbiAgICAgICAgICAvLyByZXBsYWNlIHRoZW0gd2l0aCBzcGFjZXMuXG4gICAgICAgICAgZm9udENoYXJDb2RlID0gMHgyMDtcbiAgICAgICAgfVxuICAgICAgICBmb250Q2hhckNvZGUgPSBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhmb250Q2hhckNvZGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1R5cGUzRm9udCkge1xuICAgICAgICAvLyBGb250IGNoYXIgY29kZSBpbiB0aGlzIGNhc2UgaXMgYWN0dWFsbHkgYSBnbHlwaCBuYW1lLlxuICAgICAgICBvcGVyYXRvckxpc3RJZCA9IGZvbnRDaGFyQ29kZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjY2VudCA9IG51bGw7XG4gICAgICBpZiAodGhpcy5zZWFjTWFwICYmIHRoaXMuc2VhY01hcFtjaGFyY29kZV0pIHtcbiAgICAgICAgaXNJbkZvbnQgPSB0cnVlO1xuICAgICAgICB2YXIgc2VhYyA9IHRoaXMuc2VhY01hcFtjaGFyY29kZV07XG4gICAgICAgIGZvbnRDaGFyQ29kZSA9IHNlYWMuYmFzZUZvbnRDaGFyQ29kZTtcbiAgICAgICAgYWNjZW50ID0ge1xuICAgICAgICAgIGZvbnRDaGFyOiBTdHJpbmcuZnJvbUNvZGVQb2ludChzZWFjLmFjY2VudEZvbnRDaGFyQ29kZSksXG4gICAgICAgICAgb2Zmc2V0OiBzZWFjLmFjY2VudE9mZnNldCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZvbnRDaGFyID0gXCJcIjtcbiAgICAgIGlmICh0eXBlb2YgZm9udENoYXJDb2RlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGlmIChmb250Q2hhckNvZGUgPD0gMHgxMGZmZmYpIHtcbiAgICAgICAgICBmb250Q2hhciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGZvbnRDaGFyQ29kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybihgY2hhclRvR2x5cGggLSBpbnZhbGlkIGZvbnRDaGFyQ29kZTogJHtmb250Q2hhckNvZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGdseXBoID0gdGhpcy5nbHlwaENhY2hlW2NoYXJjb2RlXTtcbiAgICAgIGlmIChcbiAgICAgICAgIWdseXBoIHx8XG4gICAgICAgICFnbHlwaC5tYXRjaGVzRm9yQ2FjaGUoXG4gICAgICAgICAgZm9udENoYXIsXG4gICAgICAgICAgdW5pY29kZSxcbiAgICAgICAgICBhY2NlbnQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgdm1ldHJpYyxcbiAgICAgICAgICBvcGVyYXRvckxpc3RJZCxcbiAgICAgICAgICBpc1NwYWNlLFxuICAgICAgICAgIGlzSW5Gb250XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBnbHlwaCA9IG5ldyBHbHlwaChcbiAgICAgICAgICBmb250Q2hhcixcbiAgICAgICAgICB1bmljb2RlLFxuICAgICAgICAgIGFjY2VudCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB2bWV0cmljLFxuICAgICAgICAgIG9wZXJhdG9yTGlzdElkLFxuICAgICAgICAgIGlzU3BhY2UsXG4gICAgICAgICAgaXNJbkZvbnRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5nbHlwaENhY2hlW2NoYXJjb2RlXSA9IGdseXBoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdseXBoO1xuICAgIH0sXG5cbiAgICBjaGFyc1RvR2x5cGhzOiBmdW5jdGlvbiBGb250X2NoYXJzVG9HbHlwaHMoY2hhcnMpIHtcbiAgICAgIHZhciBjaGFyc0NhY2hlID0gdGhpcy5jaGFyc0NhY2hlO1xuICAgICAgdmFyIGdseXBocywgZ2x5cGgsIGNoYXJjb2RlO1xuXG4gICAgICAvLyBpZiB3ZSB0cmFuc2xhdGVkIHRoaXMgc3RyaW5nIGJlZm9yZSwganVzdCBncmFiIGl0IGZyb20gdGhlIGNhY2hlXG4gICAgICBpZiAoY2hhcnNDYWNoZSkge1xuICAgICAgICBnbHlwaHMgPSBjaGFyc0NhY2hlW2NoYXJzXTtcbiAgICAgICAgaWYgKGdseXBocykge1xuICAgICAgICAgIHJldHVybiBnbHlwaHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbGF6aWx5IGNyZWF0ZSB0aGUgdHJhbnNsYXRpb24gY2FjaGVcbiAgICAgIGlmICghY2hhcnNDYWNoZSkge1xuICAgICAgICBjaGFyc0NhY2hlID0gdGhpcy5jaGFyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cblxuICAgICAgZ2x5cGhzID0gW107XG4gICAgICB2YXIgY2hhcnNDYWNoZUtleSA9IGNoYXJzO1xuICAgICAgdmFyIGkgPSAwLFxuICAgICAgICBpaTtcblxuICAgICAgaWYgKHRoaXMuY01hcCkge1xuICAgICAgICAvLyBjb21wb3NpdGUgZm9udHMgaGF2ZSBtdWx0aS1ieXRlIHN0cmluZ3MgY29udmVydCB0aGUgc3RyaW5nIGZyb21cbiAgICAgICAgLy8gc2luZ2xlLWJ5dGUgdG8gbXVsdGktYnl0ZVxuICAgICAgICB2YXIgYyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHdoaWxlIChpIDwgY2hhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5jTWFwLnJlYWRDaGFyQ29kZShjaGFycywgaSwgYyk7XG4gICAgICAgICAgY2hhcmNvZGUgPSBjLmNoYXJjb2RlO1xuICAgICAgICAgIHZhciBsZW5ndGggPSBjLmxlbmd0aDtcbiAgICAgICAgICBpICs9IGxlbmd0aDtcbiAgICAgICAgICAvLyBTcGFjZSBpcyBjaGFyIHdpdGggY29kZSAweDIwIGFuZCBsZW5ndGggMSBpbiBtdWx0aXBsZS1ieXRlIGNvZGVzLlxuICAgICAgICAgIHZhciBpc1NwYWNlID0gbGVuZ3RoID09PSAxICYmIGNoYXJzLmNoYXJDb2RlQXQoaSAtIDEpID09PSAweDIwO1xuICAgICAgICAgIGdseXBoID0gdGhpcy5jaGFyVG9HbHlwaChjaGFyY29kZSwgaXNTcGFjZSk7XG4gICAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICBjaGFyY29kZSA9IGNoYXJzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgZ2x5cGggPSB0aGlzLmNoYXJUb0dseXBoKGNoYXJjb2RlLCBjaGFyY29kZSA9PT0gMHgyMCk7XG4gICAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVudGVyIHRoZSB0cmFuc2xhdGVkIHN0cmluZyBpbnRvIHRoZSBjYWNoZVxuICAgICAgcmV0dXJuIChjaGFyc0NhY2hlW2NoYXJzQ2FjaGVLZXldID0gZ2x5cGhzKTtcbiAgICB9LFxuXG4gICAgZ2V0IGdseXBoQ2FjaGVWYWx1ZXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmdseXBoQ2FjaGUpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIEZvbnQ7XG59KSgpO1xuXG52YXIgRXJyb3JGb250ID0gKGZ1bmN0aW9uIEVycm9yRm9udENsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gRXJyb3JGb250KGVycm9yKSB7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgIHRoaXMubG9hZGVkTmFtZSA9IFwiZ19mb250X2Vycm9yXCI7XG4gICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7XG4gIH1cblxuICBFcnJvckZvbnQucHJvdG90eXBlID0ge1xuICAgIGNoYXJzVG9HbHlwaHM6IGZ1bmN0aW9uIEVycm9yRm9udF9jaGFyc1RvR2x5cGhzKCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgZXhwb3J0RGF0YShleHRyYVByb3BlcnRpZXMgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IHRoaXMuZXJyb3IgfTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBFcnJvckZvbnQ7XG59KSgpO1xuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgYnVpbGRpbmcgYSBjaGFyIGNvZGUgdG8gZ2x5cGggaWQgbWFwcGluZyBmb3IgVHlwZTEgYW5kXG4gKiBzaW1wbGUgQ0ZGIGZvbnRzLiBTZWUgc2VjdGlvbiA5LjYuNi4yIG9mIHRoZSBzcGVjLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgRm9udCBwcm9wZXJ0aWVzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBidWlsdEluRW5jb2RpbmcgVGhlIGVuY29kaW5nIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGFjdHVhbCBmb250XG4gKiBkYXRhLlxuICogQHBhcmFtIHtBcnJheX0gZ2x5cGhOYW1lcyBBcnJheSBvZiBnbHlwaCBuYW1lcyB3aGVyZSB0aGUgaW5kZXggaXMgdGhlXG4gKiBnbHlwaCBJRC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IEEgY2hhciBjb2RlIHRvIGdseXBoIElEIG1hcC5cbiAqL1xuZnVuY3Rpb24gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhOYW1lcykge1xuICB2YXIgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgZ2x5cGhJZCwgY2hhckNvZGUsIGJhc2VFbmNvZGluZztcbiAgdmFyIGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7XG5cbiAgaWYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSkge1xuICAgIC8vIElmIGEgdmFsaWQgYmFzZSBlbmNvZGluZyBuYW1lIHdhcyB1c2VkLCB0aGUgbWFwcGluZyBpcyBpbml0aWFsaXplZCB3aXRoXG4gICAgLy8gdGhhdC5cbiAgICBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpO1xuICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHtcbiAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoYmFzZUVuY29kaW5nW2NoYXJDb2RlXSk7XG4gICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7XG4gICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOyAvLyBub3RkZWZcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTeW1ib2xpY0ZvbnQpIHtcbiAgICAvLyBGb3IgYSBzeW1ib2xpYyBmb250IHRoZSBlbmNvZGluZyBzaG91bGQgYmUgdGhlIGZvbnRzIGJ1aWx0LWluIGVuY29kaW5nLlxuICAgIGZvciAoY2hhckNvZGUgaW4gYnVpbHRJbkVuY29kaW5nKSB7XG4gICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGb3Igbm9uLXN5bWJvbGljIGZvbnRzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJhc2UgZW5jb2RpbmcgdGhlIHN0YW5kYXJkXG4gICAgLy8gZW5jb2Rpbmcgc2hvdWxkIGJlIHVzZWQuXG4gICAgYmFzZUVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZztcbiAgICBmb3IgKGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCBiYXNlRW5jb2RpbmcubGVuZ3RoOyBjaGFyQ29kZSsrKSB7XG4gICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0pO1xuICAgICAgaWYgKGdseXBoSWQgPj0gMCkge1xuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gMDsgLy8gbm90ZGVmXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTGFzdGx5LCBtZXJnZSBpbiB0aGUgZGlmZmVyZW5jZXMuXG4gIHZhciBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXMsXG4gICAgZ2x5cGhzVW5pY29kZU1hcDtcbiAgaWYgKGRpZmZlcmVuY2VzKSB7XG4gICAgZm9yIChjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcykge1xuICAgICAgdmFyIGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJDb2RlXTtcbiAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoZ2x5cGhOYW1lKTtcblxuICAgICAgaWYgKGdseXBoSWQgPT09IC0xKSB7XG4gICAgICAgIGlmICghZ2x5cGhzVW5pY29kZU1hcCkge1xuICAgICAgICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YW5kYXJkR2x5cGhOYW1lID0gcmVjb3ZlckdseXBoTmFtZShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApO1xuICAgICAgICBpZiAoc3RhbmRhcmRHbHlwaE5hbWUgIT09IGdseXBoTmFtZSkge1xuICAgICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7XG4gICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOyAvLyBub3RkZWZcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkO1xufVxuXG4vLyBUeXBlMUZvbnQgaXMgYWxzbyBhIENJREZvbnRUeXBlMC5cbnZhciBUeXBlMUZvbnQgPSAoZnVuY3Rpb24gVHlwZTFGb250Q2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gZmluZEJsb2NrKHN0cmVhbUJ5dGVzLCBzaWduYXR1cmUsIHN0YXJ0SW5kZXgpIHtcbiAgICB2YXIgc3RyZWFtQnl0ZXNMZW5ndGggPSBzdHJlYW1CeXRlcy5sZW5ndGg7XG4gICAgdmFyIHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG4gICAgdmFyIHNjYW5MZW5ndGggPSBzdHJlYW1CeXRlc0xlbmd0aCAtIHNpZ25hdHVyZUxlbmd0aDtcblxuICAgIHZhciBpID0gc3RhcnRJbmRleCxcbiAgICAgIGosXG4gICAgICBmb3VuZCA9IGZhbHNlO1xuICAgIHdoaWxlIChpIDwgc2Nhbkxlbmd0aCkge1xuICAgICAgaiA9IDA7XG4gICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzdHJlYW1CeXRlc1tpICsgal0gPT09IHNpZ25hdHVyZVtqXSkge1xuICAgICAgICBqKys7XG4gICAgICB9XG4gICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHtcbiAgICAgICAgLy8gYHNpZ25hdHVyZWAgZm91bmQsIHNraXAgb3ZlciB3aGl0ZXNwYWNlLlxuICAgICAgICBpICs9IGo7XG4gICAgICAgIHdoaWxlIChpIDwgc3RyZWFtQnl0ZXNMZW5ndGggJiYgaXNXaGl0ZVNwYWNlKHN0cmVhbUJ5dGVzW2ldKSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZm91bmQsXG4gICAgICBsZW5ndGg6IGksXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEhlYWRlckJsb2NrKHN0cmVhbSwgc3VnZ2VzdGVkTGVuZ3RoKSB7XG4gICAgdmFyIEVFWEVDX1NJR05BVFVSRSA9IFsweDY1LCAweDY1LCAweDc4LCAweDY1LCAweDYzXTtcblxuICAgIHZhciBzdHJlYW1TdGFydFBvcyA9IHN0cmVhbS5wb3M7IC8vIFNhdmUgdGhlIGluaXRpYWwgc3RyZWFtIHBvc2l0aW9uLlxuICAgIHZhciBoZWFkZXJCeXRlcywgaGVhZGVyQnl0ZXNMZW5ndGgsIGJsb2NrO1xuICAgIHRyeSB7XG4gICAgICBoZWFkZXJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcyhzdWdnZXN0ZWRMZW5ndGgpO1xuICAgICAgaGVhZGVyQnl0ZXNMZW5ndGggPSBoZWFkZXJCeXRlcy5sZW5ndGg7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiB0aGUgYHN1Z2dlc3RlZExlbmd0aGAgaXMgaHVnZSBlbm91Z2ggdGhhdCBhIFVpbnQ4QXJyYXlcbiAgICAgIC8vIGNhbm5vdCBob2xkIHRoZSByZXN1bHQgb2YgYGdldEJ5dGVzYCwgYW5kIGZhbGxiYWNrIHRvIHNpbXBseSBjaGVja2luZ1xuICAgICAgLy8gdGhlIGVudGlyZSBzdHJlYW0gKGZpeGVzIGlzc3VlMzkyOC5wZGYpLlxuICAgIH1cblxuICAgIGlmIChoZWFkZXJCeXRlc0xlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7XG4gICAgICAvLyBNb3N0IG9mIHRoZSB0aW1lIGBzdWdnZXN0ZWRMZW5ndGhgIGlzIGNvcnJlY3QsIHNvIHRvIHNwZWVkIHRoaW5ncyB1cCB3ZVxuICAgICAgLy8gaW5pdGlhbGx5IG9ubHkgY2hlY2sgdGhlIGxhc3QgZmV3IGJ5dGVzIHRvIHNlZSBpZiB0aGUgaGVhZGVyIHdhcyBmb3VuZC5cbiAgICAgIC8vIE90aGVyd2lzZSB3ZSAocG90ZW50aWFsbHkpIGNoZWNrIHRoZSBlbnRpcmUgc3RyZWFtIHRvIHByZXZlbnQgZXJyb3JzIGluXG4gICAgICAvLyBgVHlwZTFQYXJzZXJgIChmaXhlcyBpc3N1ZTU2ODYucGRmKS5cbiAgICAgIGJsb2NrID0gZmluZEJsb2NrKFxuICAgICAgICBoZWFkZXJCeXRlcyxcbiAgICAgICAgRUVYRUNfU0lHTkFUVVJFLFxuICAgICAgICBzdWdnZXN0ZWRMZW5ndGggLSAyICogRUVYRUNfU0lHTkFUVVJFLmxlbmd0aFxuICAgICAgKTtcblxuICAgICAgaWYgKGJsb2NrLmZvdW5kICYmIGJsb2NrLmxlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RyZWFtOiBuZXcgU3RyZWFtKGhlYWRlckJ5dGVzKSxcbiAgICAgICAgICBsZW5ndGg6IHN1Z2dlc3RlZExlbmd0aCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2FybignSW52YWxpZCBcIkxlbmd0aDFcIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHRyeWluZyB0byByZWNvdmVyLicpO1xuICAgIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsgLy8gUmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbi5cblxuICAgIHZhciBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7XG4gICAgdmFyIGFjdHVhbExlbmd0aDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpO1xuICAgICAgYmxvY2sgPSBmaW5kQmxvY2soc2NhbkJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIDApO1xuXG4gICAgICBpZiAoYmxvY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RyZWFtLnBvcyArPSBibG9jay5sZW5ndGg7IC8vIFVwZGF0ZSB0aGUgc3RyZWFtIHBvc2l0aW9uLlxuXG4gICAgICBpZiAoYmxvY2suZm91bmQpIHtcbiAgICAgICAgYWN0dWFsTGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0cmVhbVN0YXJ0UG9zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXJ0UG9zOyAvLyBSZXNldCB0aGUgc3RyZWFtIHBvc2l0aW9uLlxuXG4gICAgaWYgKGFjdHVhbExlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyZWFtOiBuZXcgU3RyZWFtKHN0cmVhbS5nZXRCeXRlcyhhY3R1YWxMZW5ndGgpKSxcbiAgICAgICAgbGVuZ3RoOiBhY3R1YWxMZW5ndGgsXG4gICAgICB9O1xuICAgIH1cbiAgICB3YXJuKCdVbmFibGUgdG8gcmVjb3ZlciBcIkxlbmd0aDFcIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHVzaW5nIGFzIGlzLicpO1xuICAgIHJldHVybiB7XG4gICAgICBzdHJlYW06IG5ldyBTdHJlYW0oc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCkpLFxuICAgICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVleGVjQmxvY2soc3RyZWFtLCBzdWdnZXN0ZWRMZW5ndGgpIHtcbiAgICAvLyBXZSBzaG91bGQgaWRlYWxseSBwYXJzZSB0aGUgZWV4ZWMgYmxvY2sgdG8gZW5zdXJlIHRoYXQgYHN1Z2dlc3RlZExlbmd0aGBcbiAgICAvLyBpcyBjb3JyZWN0LCBzbyB3ZSBkb24ndCB0cnVuY2F0ZSB0aGUgYmxvY2sgZGF0YSBpZiBpdCdzIHRvbyBzbWFsbC5cbiAgICAvLyBIb3dldmVyLCB0aGlzIHdvdWxkIGFsc28gcmVxdWlyZSBjaGVja2luZyBpZiB0aGUgZml4ZWQtY29udGVudCBwb3J0aW9uXG4gICAgLy8gZXhpc3RzICh1c2luZyB0aGUgJ0xlbmd0aDMnIHByb3BlcnR5KSwgYW5kIGVuc3VyaW5nIHRoYXQgaXQncyB2YWxpZC5cbiAgICAvL1xuICAgIC8vIEdpdmVuIHRoYXQgYHN1Z2dlc3RlZExlbmd0aGAgYWxtb3N0IGFsd2F5cyBpcyBjb3JyZWN0LCBhbGwgdGhlIHZhbGlkYXRpb25cbiAgICAvLyB3b3VsZCByZXF1aXJlIGEgZ3JlYXQgZGVhbCBvZiB1bm5lY2Vzc2FyeSBwYXJzaW5nIGZvciBtb3N0IGZvbnRzLlxuICAgIC8vIFRvIHNhdmUgdGltZSwgd2UgYWx3YXlzIGZldGNoIHRoZSBlbnRpcmUgc3RyZWFtIGluc3RlYWQsIHdoaWNoIGFsc28gYXZvaWRcbiAgICAvLyBpc3N1ZXMgaWYgYHN1Z2dlc3RlZExlbmd0aGAgaXMgaHVnZSAoc2VlIGNvbW1lbnQgaW4gYGdldEhlYWRlckJsb2NrYCkuXG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbiBpbmNsdWRlIHRoZSBmaXhlZC1jb250ZW50IHBvcnRpb25cbiAgICAvLyBpbiB0aGUgcmV0dXJuZWQgZWV4ZWMgYmxvY2suIEluIHByYWN0aWNlIHRoaXMgZG9lcyAqbm90KiBzZWVtIHRvIG1hdHRlcixcbiAgICAvLyBzaW5jZSBgVHlwZTFQYXJzZXJfZXh0cmFjdEZvbnRQcm9ncmFtYCB3aWxsIHNraXAgb3ZlciBhbnkgbm9uLWNvbW1hbmRzLlxuICAgIHZhciBlZXhlY0J5dGVzID0gc3RyZWFtLmdldEJ5dGVzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbTogbmV3IFN0cmVhbShlZXhlY0J5dGVzKSxcbiAgICAgIGxlbmd0aDogZWV4ZWNCeXRlcy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gVHlwZTFGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpIHtcbiAgICAvLyBTb21lIGJhZCBnZW5lcmF0b3JzIGVtYmVkIHBmYiBmaWxlIGFzIGlzLCB3ZSBoYXZlIHRvIHN0cmlwIDYtYnl0ZSBoZWFkZXIuXG4gICAgLy8gQWxzbywgbGVuZ3RoMSBhbmQgbGVuZ3RoMiBtaWdodCBiZSBvZmYgYnkgNiBieXRlcyBhcyB3ZWxsLlxuICAgIC8vIGh0dHA6Ly93d3cubWF0aC51YmMuY2EvfmNhc3MvcGlzY3JpcHQvdHlwZTEucGRmXG4gICAgdmFyIFBGQl9IRUFERVJfU0laRSA9IDY7XG4gICAgdmFyIGhlYWRlckJsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgxO1xuICAgIHZhciBlZXhlY0Jsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgyO1xuICAgIHZhciBwZmJIZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyhQRkJfSEVBREVSX1NJWkUpO1xuICAgIHZhciBwZmJIZWFkZXJQcmVzZW50ID0gcGZiSGVhZGVyWzBdID09PSAweDgwICYmIHBmYkhlYWRlclsxXSA9PT0gMHgwMTtcbiAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkge1xuICAgICAgZmlsZS5za2lwKFBGQl9IRUFERVJfU0laRSk7XG4gICAgICBoZWFkZXJCbG9ja0xlbmd0aCA9XG4gICAgICAgIChwZmJIZWFkZXJbNV0gPDwgMjQpIHxcbiAgICAgICAgKHBmYkhlYWRlcls0XSA8PCAxNikgfFxuICAgICAgICAocGZiSGVhZGVyWzNdIDw8IDgpIHxcbiAgICAgICAgcGZiSGVhZGVyWzJdO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGF0YSBibG9jayBjb250YWluaW5nIGdseXBocyBhbmQgc3VicnMgaW5mb3JtYXRpb25cbiAgICB2YXIgaGVhZGVyQmxvY2sgPSBnZXRIZWFkZXJCbG9jayhmaWxlLCBoZWFkZXJCbG9ja0xlbmd0aCk7XG4gICAgdmFyIGhlYWRlckJsb2NrUGFyc2VyID0gbmV3IFR5cGUxUGFyc2VyKFxuICAgICAgaGVhZGVyQmxvY2suc3RyZWFtLFxuICAgICAgZmFsc2UsXG4gICAgICBTRUFDX0FOQUxZU0lTX0VOQUJMRURcbiAgICApO1xuICAgIGhlYWRlckJsb2NrUGFyc2VyLmV4dHJhY3RGb250SGVhZGVyKHByb3BlcnRpZXMpO1xuXG4gICAgaWYgKHBmYkhlYWRlclByZXNlbnQpIHtcbiAgICAgIHBmYkhlYWRlciA9IGZpbGUuZ2V0Qnl0ZXMoUEZCX0hFQURFUl9TSVpFKTtcbiAgICAgIGVleGVjQmxvY2tMZW5ndGggPVxuICAgICAgICAocGZiSGVhZGVyWzVdIDw8IDI0KSB8XG4gICAgICAgIChwZmJIZWFkZXJbNF0gPDwgMTYpIHxcbiAgICAgICAgKHBmYkhlYWRlclszXSA8PCA4KSB8XG4gICAgICAgIHBmYkhlYWRlclsyXTtcbiAgICB9XG5cbiAgICAvLyBEZWNyeXB0IHRoZSBkYXRhIGJsb2NrcyBhbmQgcmV0cmlldmUgaXQncyBjb250ZW50XG4gICAgdmFyIGVleGVjQmxvY2sgPSBnZXRFZXhlY0Jsb2NrKGZpbGUsIGVleGVjQmxvY2tMZW5ndGgpO1xuICAgIHZhciBlZXhlY0Jsb2NrUGFyc2VyID0gbmV3IFR5cGUxUGFyc2VyKFxuICAgICAgZWV4ZWNCbG9jay5zdHJlYW0sXG4gICAgICB0cnVlLFxuICAgICAgU0VBQ19BTkFMWVNJU19FTkFCTEVEXG4gICAgKTtcbiAgICB2YXIgZGF0YSA9IGVleGVjQmxvY2tQYXJzZXIuZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEucHJvcGVydGllcykge1xuICAgICAgcHJvcGVydGllc1trZXldID0gZGF0YS5wcm9wZXJ0aWVzW2tleV07XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzdHJpbmdzID0gZGF0YS5jaGFyc3RyaW5ncztcbiAgICB2YXIgdHlwZTJDaGFyc3RyaW5ncyA9IHRoaXMuZ2V0VHlwZTJDaGFyc3RyaW5ncyhjaGFyc3RyaW5ncyk7XG4gICAgdmFyIHN1YnJzID0gdGhpcy5nZXRUeXBlMlN1YnJzKGRhdGEuc3VicnMpO1xuXG4gICAgdGhpcy5jaGFyc3RyaW5ncyA9IGNoYXJzdHJpbmdzO1xuICAgIHRoaXMuZGF0YSA9IHRoaXMud3JhcChcbiAgICAgIG5hbWUsXG4gICAgICB0eXBlMkNoYXJzdHJpbmdzLFxuICAgICAgdGhpcy5jaGFyc3RyaW5ncyxcbiAgICAgIHN1YnJzLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gICAgdGhpcy5zZWFjcyA9IHRoaXMuZ2V0U2VhY3MoZGF0YS5jaGFyc3RyaW5ncyk7XG4gIH1cblxuICBUeXBlMUZvbnQucHJvdG90eXBlID0ge1xuICAgIGdldCBudW1HbHlwaHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggKyAxO1xuICAgIH0sXG5cbiAgICBnZXRDaGFyc2V0OiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0Q2hhcnNldCgpIHtcbiAgICAgIHZhciBjaGFyc2V0ID0gW1wiLm5vdGRlZlwiXTtcbiAgICAgIHZhciBjaGFyc3RyaW5ncyA9IHRoaXMuY2hhcnN0cmluZ3M7XG4gICAgICBmb3IgKHZhciBnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7XG4gICAgICAgIGNoYXJzZXQucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoYXJzZXQ7XG4gICAgfSxcblxuICAgIGdldEdseXBoTWFwcGluZzogZnVuY3Rpb24gVHlwZTFGb250X2dldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzO1xuXG4gICAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBNYXAgQ0lEcyBkaXJlY3RseSB0byBHSURzLlxuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBnbHlwaElkID0gMCwgY2hhcnN0cmluZ3NMZW4gPSBjaGFyc3RyaW5ncy5sZW5ndGg7XG4gICAgICAgICAgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzTGVuO1xuICAgICAgICAgIGdseXBoSWQrK1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGdseXBoSWQpO1xuICAgICAgICAgIC8vIEFkZCAxIGJlY2F1c2UgZ2x5cGggMCBpcyBkdXBsaWNhdGVkLlxuICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGdseXBoTmFtZXMgPSBbXCIubm90ZGVmXCJdLFxuICAgICAgICBnbHlwaElkO1xuICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7XG4gICAgICAgIGdseXBoTmFtZXMucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpO1xuICAgICAgfVxuICAgICAgdmFyIGVuY29kaW5nID0gcHJvcGVydGllcy5idWlsdEluRW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcpIHtcbiAgICAgICAgdmFyIGJ1aWx0SW5FbmNvZGluZyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIGVuY29kaW5nKSB7XG4gICAgICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihlbmNvZGluZ1tjaGFyQ29kZV0pO1xuICAgICAgICAgIGlmIChnbHlwaElkID49IDApIHtcbiAgICAgICAgICAgIGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV0gPSBnbHlwaElkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhOYW1lcyk7XG4gICAgfSxcblxuICAgIGhhc0dseXBoSWQ6IGZ1bmN0aW9uIFR5cGUxRm9udF9oYXNHbHlwaElEKGlkKSB7XG4gICAgICBpZiAoaWQgPCAwIHx8IGlkID49IHRoaXMubnVtR2x5cGhzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpZCA9PT0gMCkge1xuICAgICAgICAvLyBub3RkZWYgaXMgYWx3YXlzIGRlZmluZWQuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdseXBoID0gdGhpcy5jaGFyc3RyaW5nc1tpZCAtIDFdO1xuICAgICAgcmV0dXJuIGdseXBoLmNoYXJzdHJpbmcubGVuZ3RoID4gMDtcbiAgICB9LFxuXG4gICAgZ2V0U2VhY3M6IGZ1bmN0aW9uIFR5cGUxRm9udF9nZXRTZWFjcyhjaGFyc3RyaW5ncykge1xuICAgICAgdmFyIGksIGlpO1xuICAgICAgdmFyIHNlYWNNYXAgPSBbXTtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gY2hhcnN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICB2YXIgY2hhcnN0cmluZyA9IGNoYXJzdHJpbmdzW2ldO1xuICAgICAgICBpZiAoY2hhcnN0cmluZy5zZWFjKSB7XG4gICAgICAgICAgLy8gT2Zmc2V0IGJ5IDEgZm9yIC5ub3RkZWZcbiAgICAgICAgICBzZWFjTWFwW2kgKyAxXSA9IGNoYXJzdHJpbmcuc2VhYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNlYWNNYXA7XG4gICAgfSxcblxuICAgIGdldFR5cGUyQ2hhcnN0cmluZ3M6IGZ1bmN0aW9uIFR5cGUxRm9udF9nZXRUeXBlMkNoYXJzdHJpbmdzKFxuICAgICAgdHlwZTFDaGFyc3RyaW5nc1xuICAgICkge1xuICAgICAgdmFyIHR5cGUyQ2hhcnN0cmluZ3MgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHR5cGUxQ2hhcnN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICB0eXBlMkNoYXJzdHJpbmdzLnB1c2godHlwZTFDaGFyc3RyaW5nc1tpXS5jaGFyc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlMkNoYXJzdHJpbmdzO1xuICAgIH0sXG5cbiAgICBnZXRUeXBlMlN1YnJzOiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0VHlwZTJTdWJycyh0eXBlMVN1YnJzKSB7XG4gICAgICB2YXIgYmlhcyA9IDA7XG4gICAgICB2YXIgY291bnQgPSB0eXBlMVN1YnJzLmxlbmd0aDtcbiAgICAgIGlmIChjb3VudCA8IDExMzMpIHtcbiAgICAgICAgYmlhcyA9IDEwNztcbiAgICAgIH0gZWxzZSBpZiAoY291bnQgPCAzMzc2OSkge1xuICAgICAgICBiaWFzID0gMTEzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpYXMgPSAzMjc2ODtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGEgYnVuY2ggb2YgZW1wdHkgc3VicnMgdG8gZGVhbCB3aXRoIHRoZSBUeXBlMiBiaWFzXG4gICAgICB2YXIgdHlwZTJTdWJycyA9IFtdO1xuICAgICAgdmFyIGk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYmlhczsgaSsrKSB7XG4gICAgICAgIHR5cGUyU3VicnMucHVzaChbMHgwYl0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICB0eXBlMlN1YnJzLnB1c2godHlwZTFTdWJyc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlMlN1YnJzO1xuICAgIH0sXG5cbiAgICB3cmFwOiBmdW5jdGlvbiBUeXBlMUZvbnRfd3JhcChcbiAgICAgIG5hbWUsXG4gICAgICBnbHlwaHMsXG4gICAgICBjaGFyc3RyaW5ncyxcbiAgICAgIHN1YnJzLFxuICAgICAgcHJvcGVydGllc1xuICAgICkge1xuICAgICAgdmFyIGNmZiA9IG5ldyBDRkYoKTtcbiAgICAgIGNmZi5oZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKDEsIDAsIDQsIDQpO1xuXG4gICAgICBjZmYubmFtZXMgPSBbbmFtZV07XG5cbiAgICAgIHZhciB0b3BEaWN0ID0gbmV3IENGRlRvcERpY3QoKTtcbiAgICAgIC8vIENGRiBzdHJpbmdzIElEcyAwLi4uMzkwIGFyZSBwcmVkZWZpbmVkIG5hbWVzLCBzbyByZWZlcmluZ1xuICAgICAgLy8gdG8gZW50cmllcyBpbiBvdXIgb3duIFN0cmluZyBJTkRFWCBzdGFydHMgYXQgU0lEIDM5MS5cbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwidmVyc2lvblwiLCAzOTEpO1xuICAgICAgdG9wRGljdC5zZXRCeU5hbWUoXCJOb3RpY2VcIiwgMzkyKTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiRnVsbE5hbWVcIiwgMzkzKTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiRmFtaWx5TmFtZVwiLCAzOTQpO1xuICAgICAgdG9wRGljdC5zZXRCeU5hbWUoXCJXZWlnaHRcIiwgMzk1KTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiRW5jb2RpbmdcIiwgbnVsbCk7IC8vIHBsYWNlaG9sZGVyXG4gICAgICB0b3BEaWN0LnNldEJ5TmFtZShcIkZvbnRNYXRyaXhcIiwgcHJvcGVydGllcy5mb250TWF0cml4KTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiRm9udEJCb3hcIiwgcHJvcGVydGllcy5iYm94KTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiY2hhcnNldFwiLCBudWxsKTsgLy8gcGxhY2Vob2xkZXJcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiQ2hhclN0cmluZ3NcIiwgbnVsbCk7IC8vIHBsYWNlaG9sZGVyXG4gICAgICB0b3BEaWN0LnNldEJ5TmFtZShcIlByaXZhdGVcIiwgbnVsbCk7IC8vIHBsYWNlaG9sZGVyXG4gICAgICBjZmYudG9wRGljdCA9IHRvcERpY3Q7XG5cbiAgICAgIHZhciBzdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTtcbiAgICAgIHN0cmluZ3MuYWRkKFwiVmVyc2lvbiAwLjExXCIpOyAvLyBWZXJzaW9uXG4gICAgICBzdHJpbmdzLmFkZChcIlNlZSBvcmlnaW5hbCBub3RpY2VcIik7IC8vIE5vdGljZVxuICAgICAgc3RyaW5ncy5hZGQobmFtZSk7IC8vIEZ1bGxOYW1lXG4gICAgICBzdHJpbmdzLmFkZChuYW1lKTsgLy8gRmFtaWx5TmFtZVxuICAgICAgc3RyaW5ncy5hZGQoXCJNZWRpdW1cIik7IC8vIFdlaWdodFxuICAgICAgY2ZmLnN0cmluZ3MgPSBzdHJpbmdzO1xuXG4gICAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7XG5cbiAgICAgIHZhciBjb3VudCA9IGdseXBocy5sZW5ndGg7XG4gICAgICB2YXIgY2hhcnNldEFycmF5ID0gW1wiLm5vdGRlZlwiXTtcbiAgICAgIHZhciBpLCBpaTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGNoYXJzdHJpbmdzW2ldLmdseXBoTmFtZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihnbHlwaE5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgc3RyaW5ncy5hZGQoZ2x5cGhOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjaGFyc2V0QXJyYXkucHVzaChnbHlwaE5hbWUpO1xuICAgICAgfVxuICAgICAgY2ZmLmNoYXJzZXQgPSBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgMCwgY2hhcnNldEFycmF5KTtcblxuICAgICAgdmFyIGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTtcbiAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKFsweDhiLCAweDBlXSk7IC8vIC5ub3RkZWZcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoc1tpXSk7XG4gICAgICB9XG4gICAgICBjZmYuY2hhclN0cmluZ3MgPSBjaGFyU3RyaW5nc0luZGV4O1xuXG4gICAgICB2YXIgcHJpdmF0ZURpY3QgPSBuZXcgQ0ZGUHJpdmF0ZURpY3QoKTtcbiAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZShcIlN1YnJzXCIsIG51bGwpOyAvLyBwbGFjZWhvbGRlclxuICAgICAgdmFyIGZpZWxkcyA9IFtcbiAgICAgICAgXCJCbHVlVmFsdWVzXCIsXG4gICAgICAgIFwiT3RoZXJCbHVlc1wiLFxuICAgICAgICBcIkZhbWlseUJsdWVzXCIsXG4gICAgICAgIFwiRmFtaWx5T3RoZXJCbHVlc1wiLFxuICAgICAgICBcIlN0ZW1TbmFwSFwiLFxuICAgICAgICBcIlN0ZW1TbmFwVlwiLFxuICAgICAgICBcIkJsdWVTaGlmdFwiLFxuICAgICAgICBcIkJsdWVGdXp6XCIsXG4gICAgICAgIFwiQmx1ZVNjYWxlXCIsXG4gICAgICAgIFwiTGFuZ3VhZ2VHcm91cFwiLFxuICAgICAgICBcIkV4cGFuc2lvbkZhY3RvclwiLFxuICAgICAgICBcIkZvcmNlQm9sZFwiLFxuICAgICAgICBcIlN0ZEhXXCIsXG4gICAgICAgIFwiU3RkVldcIixcbiAgICAgIF07XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZWxkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgaWYgKCEoZmllbGQgaW4gcHJvcGVydGllcy5wcml2YXRlRGF0YSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2ZpZWxkXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgLy8gQWxsIG9mIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgYXJyYXkgZGF0YSBpbiBDRkYgbXVzdCBiZSBzdG9yZWQgYXNcbiAgICAgICAgICAvLyBcImRlbHRhLWVuY29kZWRcIiBudW1iZXJzLlxuICAgICAgICAgIGZvciAodmFyIGogPSB2YWx1ZS5sZW5ndGggLSAxOyBqID4gMDsgai0tKSB7XG4gICAgICAgICAgICB2YWx1ZVtqXSAtPSB2YWx1ZVtqIC0gMV07IC8vIC4uLiBkaWZmZXJlbmNlIGZyb20gcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJpdmF0ZURpY3Quc2V0QnlOYW1lKGZpZWxkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0O1xuXG4gICAgICB2YXIgc3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IHN1YnJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgc3VickluZGV4LmFkZChzdWJyc1tpXSk7XG4gICAgICB9XG4gICAgICBwcml2YXRlRGljdC5zdWJyc0luZGV4ID0gc3VickluZGV4O1xuXG4gICAgICB2YXIgY29tcGlsZXIgPSBuZXcgQ0ZGQ29tcGlsZXIoY2ZmKTtcbiAgICAgIHJldHVybiBjb21waWxlci5jb21waWxlKCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gVHlwZTFGb250O1xufSkoKTtcblxudmFyIENGRkZvbnQgPSAoZnVuY3Rpb24gQ0ZGRm9udENsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQ0ZGRm9udChmaWxlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblxuICAgIHZhciBwYXJzZXIgPSBuZXcgQ0ZGUGFyc2VyKGZpbGUsIHByb3BlcnRpZXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7XG4gICAgdGhpcy5jZmYgPSBwYXJzZXIucGFyc2UoKTtcbiAgICB0aGlzLmNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7XG4gICAgdmFyIGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKHRoaXMuY2ZmKTtcbiAgICB0aGlzLnNlYWNzID0gdGhpcy5jZmYuc2VhY3M7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZGF0YSA9IGNvbXBpbGVyLmNvbXBpbGUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB3YXJuKFwiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCBcIiArIHByb3BlcnRpZXMubG9hZGVkTmFtZSk7XG4gICAgICAvLyBUaGVyZSBtYXkgaGF2ZSBqdXN0IGJlZW4gYW4gaXNzdWUgd2l0aCB0aGUgY29tcGlsZXIsIHNldCB0aGUgZGF0YVxuICAgICAgLy8gYW55d2F5IGFuZCBob3BlIHRoZSBmb250IGxvYWRlZC5cbiAgICAgIHRoaXMuZGF0YSA9IGZpbGU7XG4gICAgfVxuICB9XG5cbiAgQ0ZGRm9udC5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IG51bUdseXBocygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNmZi5jaGFyU3RyaW5ncy5jb3VudDtcbiAgICB9LFxuICAgIGdldENoYXJzZXQ6IGZ1bmN0aW9uIENGRkZvbnRfZ2V0Q2hhcnNldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNmZi5jaGFyc2V0LmNoYXJzZXQ7XG4gICAgfSxcbiAgICBnZXRHbHlwaE1hcHBpbmc6IGZ1bmN0aW9uIENGRkZvbnRfZ2V0R2x5cGhNYXBwaW5nKCkge1xuICAgICAgdmFyIGNmZiA9IHRoaXMuY2ZmO1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7XG4gICAgICB2YXIgY2hhcnNldHMgPSBjZmYuY2hhcnNldC5jaGFyc2V0O1xuICAgICAgdmFyIGNoYXJDb2RlVG9HbHlwaElkO1xuICAgICAgdmFyIGdseXBoSWQ7XG5cbiAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkge1xuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBjaGFyQ29kZTtcbiAgICAgICAgaWYgKGNmZi5pc0NJREZvbnQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZm9udCBpcyBhY3R1YWxseSBhIENJRCBmb250IHRoZW4gd2Ugc2hvdWxkIHVzZSB0aGUgY2hhcnNldFxuICAgICAgICAgIC8vIHRvIG1hcCBDSURzIHRvIEdJRHMuXG4gICAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzZXRzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7XG4gICAgICAgICAgICB2YXIgY2lkID0gY2hhcnNldHNbZ2x5cGhJZF07XG4gICAgICAgICAgICBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGNpZCk7XG4gICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBpdCBpcyBOT1QgYWN0dWFsbHkgYSBDSUQgZm9udCB0aGVuIENJRHMgc2hvdWxkIGJlIG1hcHBlZFxuICAgICAgICAgIC8vIGRpcmVjdGx5IHRvIEdJRHMuXG4gICAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNmZi5jaGFyU3RyaW5ncy5jb3VudDsgZ2x5cGhJZCsrKSB7XG4gICAgICAgICAgICBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGdseXBoSWQpO1xuICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW5jb2RpbmcgPSBjZmYuZW5jb2RpbmcgPyBjZmYuZW5jb2RpbmcuZW5jb2RpbmcgOiBudWxsO1xuICAgICAgY2hhckNvZGVUb0dseXBoSWQgPSB0eXBlMUZvbnRHbHlwaE1hcHBpbmcocHJvcGVydGllcywgZW5jb2RpbmcsIGNoYXJzZXRzKTtcbiAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDtcbiAgICB9LFxuICAgIGhhc0dseXBoSWQ6IGZ1bmN0aW9uIENGRkZvbnRfaGFzR2x5cGhJRChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2ZmLmhhc0dseXBoSWQoaWQpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIENGRkZvbnQ7XG59KSgpO1xuXG5leHBvcnQge1xuICBTRUFDX0FOQUxZU0lTX0VOQUJMRUQsXG4gIEVycm9yRm9udCxcbiAgRm9udCxcbiAgRm9udEZsYWdzLFxuICBUb1VuaWNvZGVNYXAsXG4gIElkZW50aXR5VG9Vbmljb2RlTWFwLFxuICBnZXRGb250VHlwZSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYnl0ZXNUb1N0cmluZyxcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIHNoYWRvdyxcbiAgc3RyaW5nVG9CeXRlcyxcbiAgVXRpbCxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBFeHBlcnRDaGFyc2V0LFxuICBFeHBlcnRTdWJzZXRDaGFyc2V0LFxuICBJU09BZG9iZUNoYXJzZXQsXG59IGZyb20gXCIuL2NoYXJzZXRzLmpzXCI7XG5pbXBvcnQgeyBFeHBlcnRFbmNvZGluZywgU3RhbmRhcmRFbmNvZGluZyB9IGZyb20gXCIuL2VuY29kaW5ncy5qc1wiO1xuXG4vLyBNYXhpbXVtIHN1YnJvdXRpbmUgY2FsbCBkZXB0aCBvZiB0eXBlIDIgY2hhcnRyaW5ncy4gTWF0Y2hlcyBPVFMuXG52YXIgTUFYX1NVQlJfTkVTVElORyA9IDEwO1xuXG4vKipcbiAqIFRoZSBDRkYgY2xhc3MgdGFrZXMgYSBUeXBlMSBmaWxlIGFuZCB3cmFwIGl0IGludG8gYVxuICogJ0NvbXBhY3QgRm9udCBGb3JtYXQnIHdoaWNoIGl0c2VsZiBlbWJlZCBUeXBlMiBjaGFyc3RyaW5ncy5cbiAqL1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgQ0ZGU3RhbmRhcmRTdHJpbmdzID0gW1xuICBcIi5ub3RkZWZcIiwgXCJzcGFjZVwiLCBcImV4Y2xhbVwiLCBcInF1b3RlZGJsXCIsIFwibnVtYmVyc2lnblwiLCBcImRvbGxhclwiLCBcInBlcmNlbnRcIixcbiAgXCJhbXBlcnNhbmRcIiwgXCJxdW90ZXJpZ2h0XCIsIFwicGFyZW5sZWZ0XCIsIFwicGFyZW5yaWdodFwiLCBcImFzdGVyaXNrXCIsIFwicGx1c1wiLFxuICBcImNvbW1hXCIsIFwiaHlwaGVuXCIsIFwicGVyaW9kXCIsIFwic2xhc2hcIiwgXCJ6ZXJvXCIsIFwib25lXCIsIFwidHdvXCIsIFwidGhyZWVcIiwgXCJmb3VyXCIsXG4gIFwiZml2ZVwiLCBcInNpeFwiLCBcInNldmVuXCIsIFwiZWlnaHRcIiwgXCJuaW5lXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIiwgXCJsZXNzXCIsXG4gIFwiZXF1YWxcIiwgXCJncmVhdGVyXCIsIFwicXVlc3Rpb25cIiwgXCJhdFwiLCBcIkFcIiwgXCJCXCIsIFwiQ1wiLCBcIkRcIiwgXCJFXCIsIFwiRlwiLCBcIkdcIiwgXCJIXCIsXG4gIFwiSVwiLCBcIkpcIiwgXCJLXCIsIFwiTFwiLCBcIk1cIiwgXCJOXCIsIFwiT1wiLCBcIlBcIiwgXCJRXCIsIFwiUlwiLCBcIlNcIiwgXCJUXCIsIFwiVVwiLCBcIlZcIiwgXCJXXCIsXG4gIFwiWFwiLCBcIllcIiwgXCJaXCIsIFwiYnJhY2tldGxlZnRcIiwgXCJiYWNrc2xhc2hcIiwgXCJicmFja2V0cmlnaHRcIiwgXCJhc2NpaWNpcmN1bVwiLFxuICBcInVuZGVyc2NvcmVcIiwgXCJxdW90ZWxlZnRcIiwgXCJhXCIsIFwiYlwiLCBcImNcIiwgXCJkXCIsIFwiZVwiLCBcImZcIiwgXCJnXCIsIFwiaFwiLCBcImlcIiwgXCJqXCIsXG4gIFwia1wiLCBcImxcIiwgXCJtXCIsIFwiblwiLCBcIm9cIiwgXCJwXCIsIFwicVwiLCBcInJcIiwgXCJzXCIsIFwidFwiLCBcInVcIiwgXCJ2XCIsIFwid1wiLCBcInhcIiwgXCJ5XCIsXG4gIFwielwiLCBcImJyYWNlbGVmdFwiLCBcImJhclwiLCBcImJyYWNlcmlnaHRcIiwgXCJhc2NpaXRpbGRlXCIsIFwiZXhjbGFtZG93blwiLCBcImNlbnRcIixcbiAgXCJzdGVybGluZ1wiLCBcImZyYWN0aW9uXCIsIFwieWVuXCIsIFwiZmxvcmluXCIsIFwic2VjdGlvblwiLCBcImN1cnJlbmN5XCIsXG4gIFwicXVvdGVzaW5nbGVcIiwgXCJxdW90ZWRibGxlZnRcIiwgXCJndWlsbGVtb3RsZWZ0XCIsIFwiZ3VpbHNpbmdsbGVmdFwiLFxuICBcImd1aWxzaW5nbHJpZ2h0XCIsIFwiZmlcIiwgXCJmbFwiLCBcImVuZGFzaFwiLCBcImRhZ2dlclwiLCBcImRhZ2dlcmRibFwiLFxuICBcInBlcmlvZGNlbnRlcmVkXCIsIFwicGFyYWdyYXBoXCIsIFwiYnVsbGV0XCIsIFwicXVvdGVzaW5nbGJhc2VcIiwgXCJxdW90ZWRibGJhc2VcIixcbiAgXCJxdW90ZWRibHJpZ2h0XCIsIFwiZ3VpbGxlbW90cmlnaHRcIiwgXCJlbGxpcHNpc1wiLCBcInBlcnRob3VzYW5kXCIsIFwicXVlc3Rpb25kb3duXCIsXG4gIFwiZ3JhdmVcIiwgXCJhY3V0ZVwiLCBcImNpcmN1bWZsZXhcIiwgXCJ0aWxkZVwiLCBcIm1hY3JvblwiLCBcImJyZXZlXCIsIFwiZG90YWNjZW50XCIsXG4gIFwiZGllcmVzaXNcIiwgXCJyaW5nXCIsIFwiY2VkaWxsYVwiLCBcImh1bmdhcnVtbGF1dFwiLCBcIm9nb25la1wiLCBcImNhcm9uXCIsIFwiZW1kYXNoXCIsXG4gIFwiQUVcIiwgXCJvcmRmZW1pbmluZVwiLCBcIkxzbGFzaFwiLCBcIk9zbGFzaFwiLCBcIk9FXCIsIFwib3JkbWFzY3VsaW5lXCIsIFwiYWVcIixcbiAgXCJkb3RsZXNzaVwiLCBcImxzbGFzaFwiLCBcIm9zbGFzaFwiLCBcIm9lXCIsIFwiZ2VybWFuZGJsc1wiLCBcIm9uZXN1cGVyaW9yXCIsXG4gIFwibG9naWNhbG5vdFwiLCBcIm11XCIsIFwidHJhZGVtYXJrXCIsIFwiRXRoXCIsIFwib25laGFsZlwiLCBcInBsdXNtaW51c1wiLCBcIlRob3JuXCIsXG4gIFwib25lcXVhcnRlclwiLCBcImRpdmlkZVwiLCBcImJyb2tlbmJhclwiLCBcImRlZ3JlZVwiLCBcInRob3JuXCIsIFwidGhyZWVxdWFydGVyc1wiLFxuICBcInR3b3N1cGVyaW9yXCIsIFwicmVnaXN0ZXJlZFwiLCBcIm1pbnVzXCIsIFwiZXRoXCIsIFwibXVsdGlwbHlcIiwgXCJ0aHJlZXN1cGVyaW9yXCIsXG4gIFwiY29weXJpZ2h0XCIsIFwiQWFjdXRlXCIsIFwiQWNpcmN1bWZsZXhcIiwgXCJBZGllcmVzaXNcIiwgXCJBZ3JhdmVcIiwgXCJBcmluZ1wiLFxuICBcIkF0aWxkZVwiLCBcIkNjZWRpbGxhXCIsIFwiRWFjdXRlXCIsIFwiRWNpcmN1bWZsZXhcIiwgXCJFZGllcmVzaXNcIiwgXCJFZ3JhdmVcIixcbiAgXCJJYWN1dGVcIiwgXCJJY2lyY3VtZmxleFwiLCBcIklkaWVyZXNpc1wiLCBcIklncmF2ZVwiLCBcIk50aWxkZVwiLCBcIk9hY3V0ZVwiLFxuICBcIk9jaXJjdW1mbGV4XCIsIFwiT2RpZXJlc2lzXCIsIFwiT2dyYXZlXCIsIFwiT3RpbGRlXCIsIFwiU2Nhcm9uXCIsIFwiVWFjdXRlXCIsXG4gIFwiVWNpcmN1bWZsZXhcIiwgXCJVZGllcmVzaXNcIiwgXCJVZ3JhdmVcIiwgXCJZYWN1dGVcIiwgXCJZZGllcmVzaXNcIiwgXCJaY2Fyb25cIixcbiAgXCJhYWN1dGVcIiwgXCJhY2lyY3VtZmxleFwiLCBcImFkaWVyZXNpc1wiLCBcImFncmF2ZVwiLCBcImFyaW5nXCIsIFwiYXRpbGRlXCIsXG4gIFwiY2NlZGlsbGFcIiwgXCJlYWN1dGVcIiwgXCJlY2lyY3VtZmxleFwiLCBcImVkaWVyZXNpc1wiLCBcImVncmF2ZVwiLCBcImlhY3V0ZVwiLFxuICBcImljaXJjdW1mbGV4XCIsIFwiaWRpZXJlc2lzXCIsIFwiaWdyYXZlXCIsIFwibnRpbGRlXCIsIFwib2FjdXRlXCIsIFwib2NpcmN1bWZsZXhcIixcbiAgXCJvZGllcmVzaXNcIiwgXCJvZ3JhdmVcIiwgXCJvdGlsZGVcIiwgXCJzY2Fyb25cIiwgXCJ1YWN1dGVcIiwgXCJ1Y2lyY3VtZmxleFwiLFxuICBcInVkaWVyZXNpc1wiLCBcInVncmF2ZVwiLCBcInlhY3V0ZVwiLCBcInlkaWVyZXNpc1wiLCBcInpjYXJvblwiLCBcImV4Y2xhbXNtYWxsXCIsXG4gIFwiSHVuZ2FydW1sYXV0c21hbGxcIiwgXCJkb2xsYXJvbGRzdHlsZVwiLCBcImRvbGxhcnN1cGVyaW9yXCIsIFwiYW1wZXJzYW5kc21hbGxcIixcbiAgXCJBY3V0ZXNtYWxsXCIsIFwicGFyZW5sZWZ0c3VwZXJpb3JcIiwgXCJwYXJlbnJpZ2h0c3VwZXJpb3JcIiwgXCJ0d29kb3RlbmxlYWRlclwiLFxuICBcIm9uZWRvdGVubGVhZGVyXCIsIFwiemVyb29sZHN0eWxlXCIsIFwib25lb2xkc3R5bGVcIiwgXCJ0d29vbGRzdHlsZVwiLFxuICBcInRocmVlb2xkc3R5bGVcIiwgXCJmb3Vyb2xkc3R5bGVcIiwgXCJmaXZlb2xkc3R5bGVcIiwgXCJzaXhvbGRzdHlsZVwiLFxuICBcInNldmVub2xkc3R5bGVcIiwgXCJlaWdodG9sZHN0eWxlXCIsIFwibmluZW9sZHN0eWxlXCIsIFwiY29tbWFzdXBlcmlvclwiLFxuICBcInRocmVlcXVhcnRlcnNlbWRhc2hcIiwgXCJwZXJpb2RzdXBlcmlvclwiLCBcInF1ZXN0aW9uc21hbGxcIiwgXCJhc3VwZXJpb3JcIixcbiAgXCJic3VwZXJpb3JcIiwgXCJjZW50c3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIiwgXCJlc3VwZXJpb3JcIiwgXCJpc3VwZXJpb3JcIixcbiAgXCJsc3VwZXJpb3JcIiwgXCJtc3VwZXJpb3JcIiwgXCJuc3VwZXJpb3JcIiwgXCJvc3VwZXJpb3JcIiwgXCJyc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIixcbiAgXCJ0c3VwZXJpb3JcIiwgXCJmZlwiLCBcImZmaVwiLCBcImZmbFwiLCBcInBhcmVubGVmdGluZmVyaW9yXCIsIFwicGFyZW5yaWdodGluZmVyaW9yXCIsXG4gIFwiQ2lyY3VtZmxleHNtYWxsXCIsIFwiaHlwaGVuc3VwZXJpb3JcIiwgXCJHcmF2ZXNtYWxsXCIsIFwiQXNtYWxsXCIsIFwiQnNtYWxsXCIsXG4gIFwiQ3NtYWxsXCIsIFwiRHNtYWxsXCIsIFwiRXNtYWxsXCIsIFwiRnNtYWxsXCIsIFwiR3NtYWxsXCIsIFwiSHNtYWxsXCIsIFwiSXNtYWxsXCIsXG4gIFwiSnNtYWxsXCIsIFwiS3NtYWxsXCIsIFwiTHNtYWxsXCIsIFwiTXNtYWxsXCIsIFwiTnNtYWxsXCIsIFwiT3NtYWxsXCIsIFwiUHNtYWxsXCIsXG4gIFwiUXNtYWxsXCIsIFwiUnNtYWxsXCIsIFwiU3NtYWxsXCIsIFwiVHNtYWxsXCIsIFwiVXNtYWxsXCIsIFwiVnNtYWxsXCIsIFwiV3NtYWxsXCIsXG4gIFwiWHNtYWxsXCIsIFwiWXNtYWxsXCIsIFwiWnNtYWxsXCIsIFwiY29sb25tb25ldGFyeVwiLCBcIm9uZWZpdHRlZFwiLCBcInJ1cGlhaFwiLFxuICBcIlRpbGRlc21hbGxcIiwgXCJleGNsYW1kb3duc21hbGxcIiwgXCJjZW50b2xkc3R5bGVcIiwgXCJMc2xhc2hzbWFsbFwiLFxuICBcIlNjYXJvbnNtYWxsXCIsIFwiWmNhcm9uc21hbGxcIiwgXCJEaWVyZXNpc3NtYWxsXCIsIFwiQnJldmVzbWFsbFwiLCBcIkNhcm9uc21hbGxcIixcbiAgXCJEb3RhY2NlbnRzbWFsbFwiLCBcIk1hY3JvbnNtYWxsXCIsIFwiZmlndXJlZGFzaFwiLCBcImh5cGhlbmluZmVyaW9yXCIsXG4gIFwiT2dvbmVrc21hbGxcIiwgXCJSaW5nc21hbGxcIiwgXCJDZWRpbGxhc21hbGxcIiwgXCJxdWVzdGlvbmRvd25zbWFsbFwiLCBcIm9uZWVpZ2h0aFwiLFxuICBcInRocmVlZWlnaHRoc1wiLCBcImZpdmVlaWdodGhzXCIsIFwic2V2ZW5laWdodGhzXCIsIFwib25ldGhpcmRcIiwgXCJ0d290aGlyZHNcIixcbiAgXCJ6ZXJvc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIiwgXCJzaXhzdXBlcmlvclwiLFxuICBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsIFwibmluZXN1cGVyaW9yXCIsIFwiemVyb2luZmVyaW9yXCIsXG4gIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLCBcInRocmVlaW5mZXJpb3JcIiwgXCJmb3VyaW5mZXJpb3JcIixcbiAgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIiwgXCJlaWdodGluZmVyaW9yXCIsXG4gIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsIFwiZG9sbGFyaW5mZXJpb3JcIiwgXCJwZXJpb2RpbmZlcmlvclwiLFxuICBcImNvbW1haW5mZXJpb3JcIiwgXCJBZ3JhdmVzbWFsbFwiLCBcIkFhY3V0ZXNtYWxsXCIsIFwiQWNpcmN1bWZsZXhzbWFsbFwiLFxuICBcIkF0aWxkZXNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIiwgXCJBcmluZ3NtYWxsXCIsIFwiQUVzbWFsbFwiLCBcIkNjZWRpbGxhc21hbGxcIixcbiAgXCJFZ3JhdmVzbWFsbFwiLCBcIkVhY3V0ZXNtYWxsXCIsIFwiRWNpcmN1bWZsZXhzbWFsbFwiLCBcIkVkaWVyZXNpc3NtYWxsXCIsXG4gIFwiSWdyYXZlc21hbGxcIiwgXCJJYWN1dGVzbWFsbFwiLCBcIkljaXJjdW1mbGV4c21hbGxcIiwgXCJJZGllcmVzaXNzbWFsbFwiLFxuICBcIkV0aHNtYWxsXCIsIFwiTnRpbGRlc21hbGxcIiwgXCJPZ3JhdmVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsIFwiT2NpcmN1bWZsZXhzbWFsbFwiLFxuICBcIk90aWxkZXNtYWxsXCIsIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPRXNtYWxsXCIsIFwiT3NsYXNoc21hbGxcIiwgXCJVZ3JhdmVzbWFsbFwiLFxuICBcIlVhY3V0ZXNtYWxsXCIsIFwiVWNpcmN1bWZsZXhzbWFsbFwiLCBcIlVkaWVyZXNpc3NtYWxsXCIsIFwiWWFjdXRlc21hbGxcIixcbiAgXCJUaG9ybnNtYWxsXCIsIFwiWWRpZXJlc2lzc21hbGxcIiwgXCIwMDEuMDAwXCIsIFwiMDAxLjAwMVwiLCBcIjAwMS4wMDJcIiwgXCIwMDEuMDAzXCIsXG4gIFwiQmxhY2tcIiwgXCJCb2xkXCIsIFwiQm9va1wiLCBcIkxpZ2h0XCIsIFwiTWVkaXVtXCIsIFwiUmVndWxhclwiLCBcIlJvbWFuXCIsIFwiU2VtaWJvbGRcIlxuXTtcblxuY29uc3QgTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTID0gMzkxO1xuXG52YXIgQ0ZGUGFyc2VyID0gKGZ1bmN0aW9uIENGRlBhcnNlckNsb3N1cmUoKSB7XG4gIHZhciBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGEgPSBbXG4gICAgbnVsbCxcbiAgICB7IGlkOiBcImhzdGVtXCIsIG1pbjogMiwgc3RhY2tDbGVhcmluZzogdHJ1ZSwgc3RlbTogdHJ1ZSB9LFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJ2c3RlbVwiLCBtaW46IDIsIHN0YWNrQ2xlYXJpbmc6IHRydWUsIHN0ZW06IHRydWUgfSxcbiAgICB7IGlkOiBcInZtb3ZldG9cIiwgbWluOiAxLCBzdGFja0NsZWFyaW5nOiB0cnVlIH0sXG4gICAgeyBpZDogXCJybGluZXRvXCIsIG1pbjogMiwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiaGxpbmV0b1wiLCBtaW46IDEsIHJlc2V0U3RhY2s6IHRydWUgfSxcbiAgICB7IGlkOiBcInZsaW5ldG9cIiwgbWluOiAxLCByZXNldFN0YWNrOiB0cnVlIH0sXG4gICAgeyBpZDogXCJycmN1cnZldG9cIiwgbWluOiA2LCByZXNldFN0YWNrOiB0cnVlIH0sXG4gICAgbnVsbCxcbiAgICB7IGlkOiBcImNhbGxzdWJyXCIsIG1pbjogMSwgdW5kZWZTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwicmV0dXJuXCIsIG1pbjogMCwgdW5kZWZTdGFjazogdHJ1ZSB9LFxuICAgIG51bGwsIC8vIDEyXG4gICAgbnVsbCxcbiAgICB7IGlkOiBcImVuZGNoYXJcIiwgbWluOiAwLCBzdGFja0NsZWFyaW5nOiB0cnVlIH0sXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJoc3RlbWhtXCIsIG1pbjogMiwgc3RhY2tDbGVhcmluZzogdHJ1ZSwgc3RlbTogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiaGludG1hc2tcIiwgbWluOiAwLCBzdGFja0NsZWFyaW5nOiB0cnVlIH0sXG4gICAgeyBpZDogXCJjbnRybWFza1wiLCBtaW46IDAsIHN0YWNrQ2xlYXJpbmc6IHRydWUgfSxcbiAgICB7IGlkOiBcInJtb3ZldG9cIiwgbWluOiAyLCBzdGFja0NsZWFyaW5nOiB0cnVlIH0sXG4gICAgeyBpZDogXCJobW92ZXRvXCIsIG1pbjogMSwgc3RhY2tDbGVhcmluZzogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwidnN0ZW1obVwiLCBtaW46IDIsIHN0YWNrQ2xlYXJpbmc6IHRydWUsIHN0ZW06IHRydWUgfSxcbiAgICB7IGlkOiBcInJjdXJ2ZWxpbmVcIiwgbWluOiA4LCByZXNldFN0YWNrOiB0cnVlIH0sXG4gICAgeyBpZDogXCJybGluZWN1cnZlXCIsIG1pbjogOCwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwidnZjdXJ2ZXRvXCIsIG1pbjogNCwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiaGhjdXJ2ZXRvXCIsIG1pbjogNCwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIG51bGwsIC8vIHNob3J0aW50XG4gICAgeyBpZDogXCJjYWxsZ3N1YnJcIiwgbWluOiAxLCB1bmRlZlN0YWNrOiB0cnVlIH0sXG4gICAgeyBpZDogXCJ2aGN1cnZldG9cIiwgbWluOiA0LCByZXNldFN0YWNrOiB0cnVlIH0sXG4gICAgeyBpZDogXCJodmN1cnZldG9cIiwgbWluOiA0LCByZXNldFN0YWNrOiB0cnVlIH0sXG4gIF07XG4gIHZhciBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGExMiA9IFtcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICB7IGlkOiBcImFuZFwiLCBtaW46IDIsIHN0YWNrRGVsdGE6IC0xIH0sXG4gICAgeyBpZDogXCJvclwiLCBtaW46IDIsIHN0YWNrRGVsdGE6IC0xIH0sXG4gICAgeyBpZDogXCJub3RcIiwgbWluOiAxLCBzdGFja0RlbHRhOiAwIH0sXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJhYnNcIiwgbWluOiAxLCBzdGFja0RlbHRhOiAwIH0sXG4gICAge1xuICAgICAgaWQ6IFwiYWRkXCIsXG4gICAgICBtaW46IDIsXG4gICAgICBzdGFja0RlbHRhOiAtMSxcbiAgICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHtcbiAgICAgICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKyBzdGFja1tpbmRleCAtIDFdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBcInN1YlwiLFxuICAgICAgbWluOiAyLFxuICAgICAgc3RhY2tEZWx0YTogLTEsXG4gICAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7XG4gICAgICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdIC0gc3RhY2tbaW5kZXggLSAxXTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogXCJkaXZcIixcbiAgICAgIG1pbjogMixcbiAgICAgIHN0YWNrRGVsdGE6IC0xLFxuICAgICAgc3RhY2tGbjogZnVuY3Rpb24gc3RhY2tfZGl2KHN0YWNrLCBpbmRleCkge1xuICAgICAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAvIHN0YWNrW2luZGV4IC0gMV07XG4gICAgICB9LFxuICAgIH0sXG4gICAgbnVsbCxcbiAgICB7XG4gICAgICBpZDogXCJuZWdcIixcbiAgICAgIG1pbjogMSxcbiAgICAgIHN0YWNrRGVsdGE6IDAsXG4gICAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7XG4gICAgICAgIHN0YWNrW2luZGV4IC0gMV0gPSAtc3RhY2tbaW5kZXggLSAxXTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiBcImVxXCIsIG1pbjogMiwgc3RhY2tEZWx0YTogLTEgfSxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJkcm9wXCIsIG1pbjogMSwgc3RhY2tEZWx0YTogLTEgfSxcbiAgICBudWxsLFxuICAgIHsgaWQ6IFwicHV0XCIsIG1pbjogMiwgc3RhY2tEZWx0YTogLTIgfSxcbiAgICB7IGlkOiBcImdldFwiLCBtaW46IDEsIHN0YWNrRGVsdGE6IDAgfSxcbiAgICB7IGlkOiBcImlmZWxzZVwiLCBtaW46IDQsIHN0YWNrRGVsdGE6IC0zIH0sXG4gICAgeyBpZDogXCJyYW5kb21cIiwgbWluOiAwLCBzdGFja0RlbHRhOiAxIH0sXG4gICAge1xuICAgICAgaWQ6IFwibXVsXCIsXG4gICAgICBtaW46IDIsXG4gICAgICBzdGFja0RlbHRhOiAtMSxcbiAgICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHtcbiAgICAgICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKiBzdGFja1tpbmRleCAtIDFdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJzcXJ0XCIsIG1pbjogMSwgc3RhY2tEZWx0YTogMCB9LFxuICAgIHsgaWQ6IFwiZHVwXCIsIG1pbjogMSwgc3RhY2tEZWx0YTogMSB9LFxuICAgIHsgaWQ6IFwiZXhjaFwiLCBtaW46IDIsIHN0YWNrRGVsdGE6IDAgfSxcbiAgICB7IGlkOiBcImluZGV4XCIsIG1pbjogMiwgc3RhY2tEZWx0YTogMCB9LFxuICAgIHsgaWQ6IFwicm9sbFwiLCBtaW46IDMsIHN0YWNrRGVsdGE6IC0yIH0sXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJoZmxleFwiLCBtaW46IDcsIHJlc2V0U3RhY2s6IHRydWUgfSxcbiAgICB7IGlkOiBcImZsZXhcIiwgbWluOiAxMywgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiaGZsZXgxXCIsIG1pbjogOSwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiZmxleDFcIiwgbWluOiAxMSwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICBdO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgQ0ZGUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihmaWxlLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7XG4gICAgICB0aGlzLmJ5dGVzID0gZmlsZS5nZXRCeXRlcygpO1xuICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDtcbiAgICB9XG5cbiAgICBwYXJzZSgpIHtcbiAgICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgdmFyIGNmZiA9IG5ldyBDRkYoKTtcbiAgICAgIHRoaXMuY2ZmID0gY2ZmO1xuXG4gICAgICAvLyBUaGUgZmlyc3QgZml2ZSBzZWN0aW9ucyBtdXN0IGJlIGluIG9yZGVyLCBhbGwgdGhlIG90aGVycyBhcmUgcmVhY2hlZFxuICAgICAgLy8gdmlhIG9mZnNldHMgY29udGFpbmVkIGluIG9uZSBvZiB0aGUgYmVsb3cuXG4gICAgICB2YXIgaGVhZGVyID0gdGhpcy5wYXJzZUhlYWRlcigpO1xuICAgICAgdmFyIG5hbWVJbmRleCA9IHRoaXMucGFyc2VJbmRleChoZWFkZXIuZW5kUG9zKTtcbiAgICAgIHZhciB0b3BEaWN0SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgobmFtZUluZGV4LmVuZFBvcyk7XG4gICAgICB2YXIgc3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdEluZGV4LmVuZFBvcyk7XG4gICAgICB2YXIgZ2xvYmFsU3VickluZGV4ID0gdGhpcy5wYXJzZUluZGV4KHN0cmluZ0luZGV4LmVuZFBvcyk7XG5cbiAgICAgIHZhciB0b3BEaWN0UGFyc2VkID0gdGhpcy5wYXJzZURpY3QodG9wRGljdEluZGV4Lm9iai5nZXQoMCkpO1xuICAgICAgdmFyIHRvcERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdG9wRGljdFBhcnNlZCwgY2ZmLnN0cmluZ3MpO1xuXG4gICAgICBjZmYuaGVhZGVyID0gaGVhZGVyLm9iajtcbiAgICAgIGNmZi5uYW1lcyA9IHRoaXMucGFyc2VOYW1lSW5kZXgobmFtZUluZGV4Lm9iaik7XG4gICAgICBjZmYuc3RyaW5ncyA9IHRoaXMucGFyc2VTdHJpbmdJbmRleChzdHJpbmdJbmRleC5vYmopO1xuICAgICAgY2ZmLnRvcERpY3QgPSB0b3BEaWN0O1xuICAgICAgY2ZmLmdsb2JhbFN1YnJJbmRleCA9IGdsb2JhbFN1YnJJbmRleC5vYmo7XG5cbiAgICAgIHRoaXMucGFyc2VQcml2YXRlRGljdChjZmYudG9wRGljdCk7XG5cbiAgICAgIGNmZi5pc0NJREZvbnQgPSB0b3BEaWN0Lmhhc05hbWUoXCJST1NcIik7XG5cbiAgICAgIHZhciBjaGFyU3RyaW5nT2Zmc2V0ID0gdG9wRGljdC5nZXRCeU5hbWUoXCJDaGFyU3RyaW5nc1wiKTtcbiAgICAgIHZhciBjaGFyU3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoY2hhclN0cmluZ09mZnNldCkub2JqO1xuXG4gICAgICB2YXIgZm9udE1hdHJpeCA9IHRvcERpY3QuZ2V0QnlOYW1lKFwiRm9udE1hdHJpeFwiKTtcbiAgICAgIGlmIChmb250TWF0cml4KSB7XG4gICAgICAgIHByb3BlcnRpZXMuZm9udE1hdHJpeCA9IGZvbnRNYXRyaXg7XG4gICAgICB9XG5cbiAgICAgIHZhciBmb250QkJveCA9IHRvcERpY3QuZ2V0QnlOYW1lKFwiRm9udEJCb3hcIik7XG4gICAgICBpZiAoZm9udEJCb3gpIHtcbiAgICAgICAgLy8gYWRqdXN0aW5nIGFzY2VudC9kZXNjZW50XG4gICAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTtcbiAgICAgICAgcHJvcGVydGllcy5kZXNjZW50ID0gTWF0aC5taW4oZm9udEJCb3hbMV0sIGZvbnRCQm94WzNdKTtcbiAgICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hhcnNldCwgZW5jb2Rpbmc7XG4gICAgICBpZiAoY2ZmLmlzQ0lERm9udCkge1xuICAgICAgICB2YXIgZmRBcnJheUluZGV4ID0gdGhpcy5wYXJzZUluZGV4KHRvcERpY3QuZ2V0QnlOYW1lKFwiRkRBcnJheVwiKSkub2JqO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmZEFycmF5SW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgdmFyIGRpY3RSYXcgPSBmZEFycmF5SW5kZXguZ2V0KGkpO1xuICAgICAgICAgIHZhciBmb250RGljdCA9IHRoaXMuY3JlYXRlRGljdChcbiAgICAgICAgICAgIENGRlRvcERpY3QsXG4gICAgICAgICAgICB0aGlzLnBhcnNlRGljdChkaWN0UmF3KSxcbiAgICAgICAgICAgIGNmZi5zdHJpbmdzXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnBhcnNlUHJpdmF0ZURpY3QoZm9udERpY3QpO1xuICAgICAgICAgIGNmZi5mZEFycmF5LnB1c2goZm9udERpY3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNpZCBmb250cyBkb24ndCBoYXZlIGFuIGVuY29kaW5nXG4gICAgICAgIGVuY29kaW5nID0gbnVsbDtcbiAgICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyhcbiAgICAgICAgICB0b3BEaWN0LmdldEJ5TmFtZShcImNoYXJzZXRcIiksXG4gICAgICAgICAgY2hhclN0cmluZ0luZGV4LmNvdW50LFxuICAgICAgICAgIGNmZi5zdHJpbmdzLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgY2ZmLmZkU2VsZWN0ID0gdGhpcy5wYXJzZUZEU2VsZWN0KFxuICAgICAgICAgIHRvcERpY3QuZ2V0QnlOYW1lKFwiRkRTZWxlY3RcIiksXG4gICAgICAgICAgY2hhclN0cmluZ0luZGV4LmNvdW50XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFyc2V0ID0gdGhpcy5wYXJzZUNoYXJzZXRzKFxuICAgICAgICAgIHRvcERpY3QuZ2V0QnlOYW1lKFwiY2hhcnNldFwiKSxcbiAgICAgICAgICBjaGFyU3RyaW5nSW5kZXguY291bnQsXG4gICAgICAgICAgY2ZmLnN0cmluZ3MsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgICAgZW5jb2RpbmcgPSB0aGlzLnBhcnNlRW5jb2RpbmcoXG4gICAgICAgICAgdG9wRGljdC5nZXRCeU5hbWUoXCJFbmNvZGluZ1wiKSxcbiAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgIGNmZi5zdHJpbmdzLFxuICAgICAgICAgIGNoYXJzZXQuY2hhcnNldFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjZmYuY2hhcnNldCA9IGNoYXJzZXQ7XG4gICAgICBjZmYuZW5jb2RpbmcgPSBlbmNvZGluZztcblxuICAgICAgdmFyIGNoYXJTdHJpbmdzQW5kU2VhY3MgPSB0aGlzLnBhcnNlQ2hhclN0cmluZ3Moe1xuICAgICAgICBjaGFyU3RyaW5nczogY2hhclN0cmluZ0luZGV4LFxuICAgICAgICBsb2NhbFN1YnJJbmRleDogdG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4LFxuICAgICAgICBnbG9iYWxTdWJySW5kZXg6IGdsb2JhbFN1YnJJbmRleC5vYmosXG4gICAgICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsXG4gICAgICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5LFxuICAgICAgICBwcml2YXRlRGljdDogdG9wRGljdC5wcml2YXRlRGljdCxcbiAgICAgIH0pO1xuICAgICAgY2ZmLmNoYXJTdHJpbmdzID0gY2hhclN0cmluZ3NBbmRTZWFjcy5jaGFyU3RyaW5ncztcbiAgICAgIGNmZi5zZWFjcyA9IGNoYXJTdHJpbmdzQW5kU2VhY3Muc2VhY3M7XG4gICAgICBjZmYud2lkdGhzID0gY2hhclN0cmluZ3NBbmRTZWFjcy53aWR0aHM7XG5cbiAgICAgIHJldHVybiBjZmY7XG4gICAgfVxuXG4gICAgcGFyc2VIZWFkZXIoKSB7XG4gICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzO1xuICAgICAgdmFyIGJ5dGVzTGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICAgIC8vIFByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCwgYnkgY2hlY2tpbmcgdGhhdCB0aGUgb2Zmc2V0IGlzIHdpdGhpbiB0aGVcbiAgICAgIC8vIGJvdW5kcyBvZiB0aGUgYnl0ZXMgYXJyYXkuIE5lY2Vzc2FyeSBpbiBlbXB0eSwgb3IgaW52YWxpZCwgZm9udCBmaWxlcy5cbiAgICAgIHdoaWxlIChvZmZzZXQgPCBieXRlc0xlbmd0aCAmJiBieXRlc1tvZmZzZXRdICE9PSAxKSB7XG4gICAgICAgICsrb2Zmc2V0O1xuICAgICAgfVxuICAgICAgaWYgKG9mZnNldCA+PSBieXRlc0xlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIENGRiBoZWFkZXJcIik7XG4gICAgICB9XG4gICAgICBpZiAob2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgIGluZm8oXCJjZmYgZGF0YSBpcyBzaGlmdGVkXCIpO1xuICAgICAgICBieXRlcyA9IGJ5dGVzLnN1YmFycmF5KG9mZnNldCk7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlcztcbiAgICAgIH1cbiAgICAgIHZhciBtYWpvciA9IGJ5dGVzWzBdO1xuICAgICAgdmFyIG1pbm9yID0gYnl0ZXNbMV07XG4gICAgICB2YXIgaGRyU2l6ZSA9IGJ5dGVzWzJdO1xuICAgICAgdmFyIG9mZlNpemUgPSBieXRlc1szXTtcbiAgICAgIHZhciBoZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSk7XG4gICAgICByZXR1cm4geyBvYmo6IGhlYWRlciwgZW5kUG9zOiBoZHJTaXplIH07XG4gICAgfVxuXG4gICAgcGFyc2VEaWN0KGRpY3QpIHtcbiAgICAgIHZhciBwb3MgPSAwO1xuXG4gICAgICBmdW5jdGlvbiBwYXJzZU9wZXJhbmQoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRpY3RbcG9zKytdO1xuICAgICAgICBpZiAodmFsdWUgPT09IDMwKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXRPcGVyYW5kKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7XG4gICAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTtcbiAgICAgICAgICB2YWx1ZSA9ICgodmFsdWUgPDwgMjQpIHwgKGRpY3RbcG9zKytdIDw8IDE2KSkgPj4gMTY7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOSkge1xuICAgICAgICAgIHZhbHVlID0gZGljdFtwb3MrK107XG4gICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBkaWN0W3BvcysrXTtcbiAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IGRpY3RbcG9zKytdO1xuICAgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgZGljdFtwb3MrK107XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDMyICYmIHZhbHVlIDw9IDI0Nikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZSAtIDEzOTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNDcgJiYgdmFsdWUgPD0gMjUwKSB7XG4gICAgICAgICAgcmV0dXJuICh2YWx1ZSAtIDI0NykgKiAyNTYgKyBkaWN0W3BvcysrXSArIDEwODtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNTEgJiYgdmFsdWUgPD0gMjU0KSB7XG4gICAgICAgICAgcmV0dXJuIC0oKHZhbHVlIC0gMjUxKSAqIDI1NikgLSBkaWN0W3BvcysrXSAtIDEwODtcbiAgICAgICAgfVxuICAgICAgICB3YXJuKCdDRkZQYXJzZXJfcGFyc2VEaWN0OiBcIicgKyB2YWx1ZSArICdcIiBpcyBhIHJlc2VydmVkIGNvbW1hbmQuJyk7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBhcnNlRmxvYXRPcGVyYW5kKCkge1xuICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgdmFyIGVvZiA9IDE1O1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY29uc3QgbG9va3VwID0gW1wiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjlcIiwgXCIuXCIsIFwiRVwiLCBcIkUtXCIsIG51bGwsIFwiLVwiXTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGRpY3QubGVuZ3RoO1xuICAgICAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGIgPSBkaWN0W3BvcysrXTtcbiAgICAgICAgICB2YXIgYjEgPSBiID4+IDQ7XG4gICAgICAgICAgdmFyIGIyID0gYiAmIDE1O1xuXG4gICAgICAgICAgaWYgKGIxID09PSBlb2YpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdHIgKz0gbG9va3VwW2IxXTtcblxuICAgICAgICAgIGlmIChiMiA9PT0gZW9mKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyICs9IGxvb2t1cFtiMl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9wZXJhbmRzID0gW107XG4gICAgICB2YXIgZW50cmllcyA9IFtdO1xuXG4gICAgICBwb3MgPSAwO1xuICAgICAgdmFyIGVuZCA9IGRpY3QubGVuZ3RoO1xuICAgICAgd2hpbGUgKHBvcyA8IGVuZCkge1xuICAgICAgICB2YXIgYiA9IGRpY3RbcG9zXTtcbiAgICAgICAgaWYgKGIgPD0gMjEpIHtcbiAgICAgICAgICBpZiAoYiA9PT0gMTIpIHtcbiAgICAgICAgICAgIGIgPSAoYiA8PCA4KSB8IGRpY3RbKytwb3NdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyaWVzLnB1c2goW2IsIG9wZXJhbmRzXSk7XG4gICAgICAgICAgb3BlcmFuZHMgPSBbXTtcbiAgICAgICAgICArK3BvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKHBhcnNlT3BlcmFuZCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfVxuXG4gICAgcGFyc2VJbmRleChwb3MpIHtcbiAgICAgIHZhciBjZmZJbmRleCA9IG5ldyBDRkZJbmRleCgpO1xuICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICAgIHZhciBjb3VudCA9IChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107XG4gICAgICB2YXIgb2Zmc2V0cyA9IFtdO1xuICAgICAgdmFyIGVuZCA9IHBvcztcbiAgICAgIHZhciBpLCBpaTtcblxuICAgICAgaWYgKGNvdW50ICE9PSAwKSB7XG4gICAgICAgIHZhciBvZmZzZXRTaXplID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICAvLyBhZGQgMSBmb3Igb2Zmc2V0IHRvIGRldGVybWluZSBzaXplIG9mIGxhc3Qgb2JqZWN0XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHBvcyArIChjb3VudCArIDEpICogb2Zmc2V0U2l6ZSAtIDE7XG5cbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBjb3VudCArIDE7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvZmZzZXRTaXplOyArK2opIHtcbiAgICAgICAgICAgIG9mZnNldCA8PD0gODtcbiAgICAgICAgICAgIG9mZnNldCArPSBieXRlc1twb3MrK107XG4gICAgICAgICAgfVxuICAgICAgICAgIG9mZnNldHMucHVzaChzdGFydFBvcyArIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kID0gb2Zmc2V0c1tjb3VudF07XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IG9mZnNldHMubGVuZ3RoIC0gMTsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgdmFyIG9mZnNldFN0YXJ0ID0gb2Zmc2V0c1tpXTtcbiAgICAgICAgdmFyIG9mZnNldEVuZCA9IG9mZnNldHNbaSArIDFdO1xuICAgICAgICBjZmZJbmRleC5hZGQoYnl0ZXMuc3ViYXJyYXkob2Zmc2V0U3RhcnQsIG9mZnNldEVuZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgb2JqOiBjZmZJbmRleCwgZW5kUG9zOiBlbmQgfTtcbiAgICB9XG5cbiAgICBwYXJzZU5hbWVJbmRleChpbmRleCkge1xuICAgICAgdmFyIG5hbWVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbmRleC5jb3VudDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBpbmRleC5nZXQoaSk7XG4gICAgICAgIG5hbWVzLnB1c2goYnl0ZXNUb1N0cmluZyhuYW1lKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmFtZXM7XG4gICAgfVxuXG4gICAgcGFyc2VTdHJpbmdJbmRleChpbmRleCkge1xuICAgICAgdmFyIHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgIHZhciBkYXRhID0gaW5kZXguZ2V0KGkpO1xuICAgICAgICBzdHJpbmdzLmFkZChieXRlc1RvU3RyaW5nKGRhdGEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzO1xuICAgIH1cblxuICAgIGNyZWF0ZURpY3QoVHlwZSwgZGljdCwgc3RyaW5ncykge1xuICAgICAgdmFyIGNmZkRpY3QgPSBuZXcgVHlwZShzdHJpbmdzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3QubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICB2YXIgcGFpciA9IGRpY3RbaV07XG4gICAgICAgIHZhciBrZXkgPSBwYWlyWzBdO1xuICAgICAgICB2YXIgdmFsdWUgPSBwYWlyWzFdO1xuICAgICAgICBjZmZEaWN0LnNldEJ5S2V5KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNmZkRpY3Q7XG4gICAgfVxuXG4gICAgcGFyc2VDaGFyU3RyaW5nKHN0YXRlLCBkYXRhLCBsb2NhbFN1YnJJbmRleCwgZ2xvYmFsU3VickluZGV4KSB7XG4gICAgICBpZiAoIWRhdGEgfHwgc3RhdGUuY2FsbERlcHRoID4gTUFYX1NVQlJfTkVTVElORykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplO1xuICAgICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG5cbiAgICAgIHZhciBsZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7ICkge1xuICAgICAgICB2YXIgdmFsdWUgPSBkYXRhW2orK107XG4gICAgICAgIHZhciB2YWxpZGF0aW9uQ29tbWFuZCA9IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHtcbiAgICAgICAgICB2YXIgcSA9IGRhdGFbaisrXTtcbiAgICAgICAgICBpZiAocSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhlIENGRiBzcGVjaWZpY2F0aW9uIHN0YXRlIHRoYXQgdGhlICdkb3RzZWN0aW9uJyBjb21tYW5kXG4gICAgICAgICAgICAvLyAoMTIsIDApIGlzIGRlcHJlY2F0ZWQgYW5kIHRyZWF0ZWQgYXMgYSBuby1vcCwgYnV0IGFsbCBUeXBlMlxuICAgICAgICAgICAgLy8gY2hhcnN0cmluZ3MgcHJvY2Vzc29ycyBzaG91bGQgc3VwcG9ydCB0aGVtLiBVbmZvcnR1bmF0ZWx5XG4gICAgICAgICAgICAvLyB0aGUgZm9udCBzYW5pdGl6ZXIgZG9uJ3QuIEFzIGEgd29ya2Fyb3VuZCB0aGUgc2VxdWVuY2UgKDEyLCAwKVxuICAgICAgICAgICAgLy8gaXMgcmVwbGFjZWQgYnkgYSB1c2VsZXNzICgwLCBobW92ZXRvKS5cbiAgICAgICAgICAgIGRhdGFbaiAtIDJdID0gMTM5O1xuICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSAyMjtcbiAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhMTJbcV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOCkge1xuICAgICAgICAgIC8vIG51bWJlciAoMTYgYml0KVxuICAgICAgICAgIHN0YWNrW3N0YWNrU2l6ZV0gPSAoKGRhdGFbal0gPDwgMjQpIHwgKGRhdGFbaiArIDFdIDw8IDE2KSkgPj4gMTY7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIHN0YWNrU2l6ZSsrO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxNCkge1xuICAgICAgICAgIGlmIChzdGFja1NpemUgPj0gNCkge1xuICAgICAgICAgICAgc3RhY2tTaXplIC09IDQ7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlYWMgPSBzdGFjay5zbGljZShzdGFja1NpemUsIHN0YWNrU2l6ZSArIDQpO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAzMiAmJiB2YWx1ZSA8PSAyNDYpIHtcbiAgICAgICAgICAvLyBudW1iZXJcbiAgICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgLSAxMzk7XG4gICAgICAgICAgc3RhY2tTaXplKys7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMjQ3ICYmIHZhbHVlIDw9IDI1NCkge1xuICAgICAgICAgIC8vIG51bWJlciAoKzEgYnl0ZXMpXG4gICAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9XG4gICAgICAgICAgICB2YWx1ZSA8IDI1MVxuICAgICAgICAgICAgICA/ICgodmFsdWUgLSAyNDcpIDw8IDgpICsgZGF0YVtqXSArIDEwOFxuICAgICAgICAgICAgICA6IC0oKHZhbHVlIC0gMjUxKSA8PCA4KSAtIGRhdGFbal0gLSAxMDg7XG4gICAgICAgICAgaisrO1xuICAgICAgICAgIHN0YWNrU2l6ZSsrO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyNTUpIHtcbiAgICAgICAgICAvLyBudW1iZXIgKDMyIGJpdClcbiAgICAgICAgICBzdGFja1tzdGFja1NpemVdID1cbiAgICAgICAgICAgICgoZGF0YVtqXSA8PCAyNCkgfFxuICAgICAgICAgICAgICAoZGF0YVtqICsgMV0gPDwgMTYpIHxcbiAgICAgICAgICAgICAgKGRhdGFbaiArIDJdIDw8IDgpIHxcbiAgICAgICAgICAgICAgZGF0YVtqICsgM10pIC9cbiAgICAgICAgICAgIDY1NTM2O1xuICAgICAgICAgIGogKz0gNDtcbiAgICAgICAgICBzdGFja1NpemUrKztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTkgfHwgdmFsdWUgPT09IDIwKSB7XG4gICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7XG4gICAgICAgICAgLy8gc2tpcHBpbmcgcmlnaHQgYW1vdW50IG9mIGhpbnRzIGZsYWcgZGF0YVxuICAgICAgICAgIGogKz0gKHN0YXRlLmhpbnRzICsgNykgPj4gMztcbiAgICAgICAgICBzdGFja1NpemUgJT0gMjtcbiAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDEwIHx8IHZhbHVlID09PSAyOSkge1xuICAgICAgICAgIHZhciBzdWJyc0luZGV4O1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMTApIHtcbiAgICAgICAgICAgIHN1YnJzSW5kZXggPSBsb2NhbFN1YnJJbmRleDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VicnNJbmRleCA9IGdsb2JhbFN1YnJJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJyc0luZGV4KSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07XG4gICAgICAgICAgICB3YXJuKFwiTWlzc2luZyBzdWJyc0luZGV4IGZvciBcIiArIHZhbGlkYXRpb25Db21tYW5kLmlkKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGJpYXMgPSAzMjc2ODtcbiAgICAgICAgICBpZiAoc3VicnNJbmRleC5jb3VudCA8IDEyNDApIHtcbiAgICAgICAgICAgIGJpYXMgPSAxMDc7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMzM5MDApIHtcbiAgICAgICAgICAgIGJpYXMgPSAxMTMxO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc3Vick51bWJlciA9IHN0YWNrWy0tc3RhY2tTaXplXSArIGJpYXM7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3Vick51bWJlciA8IDAgfHxcbiAgICAgICAgICAgIHN1YnJOdW1iZXIgPj0gc3VicnNJbmRleC5jb3VudCB8fFxuICAgICAgICAgICAgaXNOYU4oc3Vick51bWJlcilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTtcbiAgICAgICAgICAgIHdhcm4oXCJPdXQgb2YgYm91bmRzIHN1YnJJbmRleCBmb3IgXCIgKyB2YWxpZGF0aW9uQ29tbWFuZC5pZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTtcbiAgICAgICAgICBzdGF0ZS5jYWxsRGVwdGgrKztcbiAgICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgc3VicnNJbmRleC5nZXQoc3Vick51bWJlciksXG4gICAgICAgICAgICBsb2NhbFN1YnJJbmRleCxcbiAgICAgICAgICAgIGdsb2JhbFN1YnJJbmRleFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5jYWxsRGVwdGgtLTtcbiAgICAgICAgICBzdGFja1NpemUgPSBzdGF0ZS5zdGFja1NpemU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDExKSB7XG4gICAgICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQpIHtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkge1xuICAgICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IDMgfHwgdmFsdWUgPT09IDIzKSB7XG4gICAgICAgICAgICAgIC8vIHZzdGVtIG9yIHZzdGVtaG0uXG4gICAgICAgICAgICAgIHN0YXRlLmhhc1ZTdGVtcyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhhc1ZTdGVtcyAmJiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDE4KSkge1xuICAgICAgICAgICAgICAvLyBTb21lIGJyb3dzZXJzIGRvbid0IGRyYXcgZ2x5cGhzIHRoYXQgc3BlY2lmeSB2c3RlbXMgYmVmb3JlXG4gICAgICAgICAgICAgIC8vIGhzdGVtcy4gQXMgYSB3b3JrYXJvdW5kLCByZXBsYWNlIGhzdGVtICgxKSBhbmQgaHN0ZW1obSAoMTgpXG4gICAgICAgICAgICAgIC8vIHdpdGggYSBwb2ludGxlc3MgdnN0ZW0gKDMpIG9yIHZzdGVtaG0gKDIzKS5cbiAgICAgICAgICAgICAgd2FybihcIkNGRiBzdGVtIGhpbnRzIGFyZSBpbiB3cm9uZyBvcmRlclwiKTtcbiAgICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFwibWluXCIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHtcbiAgICAgICAgICAgIGlmICghc3RhdGUudW5kZWZTdGFjayAmJiBzdGFja1NpemUgPCB2YWxpZGF0aW9uQ29tbWFuZC5taW4pIHtcbiAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICBcIk5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgXCIgK1xuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQuaWQgK1xuICAgICAgICAgICAgICAgICAgXCI7IGFjdHVhbDogXCIgK1xuICAgICAgICAgICAgICAgICAgc3RhY2tTaXplICtcbiAgICAgICAgICAgICAgICAgIFwiLCBleHBlY3RlZDogXCIgK1xuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQubWluXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyAmJiB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0NsZWFyaW5nKSB7XG4gICAgICAgICAgICBzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHRoZSBvcHRpb25hbCBjaGFyYWN0ZXIgd2lkdGggY2FuIGJlIGZvdW5kIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAgICAgICAgIC8vIHN0YWNrLWNsZWFyaW5nIGNvbW1hbmQgYXJndW1lbnRzXG4gICAgICAgICAgICBzdGFja1NpemUgLT0gdmFsaWRhdGlvbkNvbW1hbmQubWluO1xuICAgICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+PSAyICYmIHZhbGlkYXRpb25Db21tYW5kLnN0ZW0pIHtcbiAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGV2ZW4gYW1vdW50IG9mIGFyZ3VtZW50cyBmb3Igc3RlbSBjb21tYW5kc1xuICAgICAgICAgICAgICBzdGFja1NpemUgJT0gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tTaXplID4gMSkge1xuICAgICAgICAgICAgICB3YXJuKFwiRm91bmQgdG9vIG1hbnkgcGFyYW1ldGVycyBmb3Igc3RhY2stY2xlYXJpbmcgY29tbWFuZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGFja1NpemUgPiAwICYmIHN0YWNrW3N0YWNrU2l6ZSAtIDFdID49IDApIHtcbiAgICAgICAgICAgICAgc3RhdGUud2lkdGggPSBzdGFja1tzdGFja1NpemUgLSAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFwic3RhY2tEZWx0YVwiIGluIHZhbGlkYXRpb25Db21tYW5kKSB7XG4gICAgICAgICAgICBpZiAoXCJzdGFja0ZuXCIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tGbihzdGFjaywgc3RhY2tTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YWNrU2l6ZSArPSB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0RlbHRhO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykge1xuICAgICAgICAgICAgc3RhY2tTaXplID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnJlc2V0U3RhY2spIHtcbiAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7XG4gICAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC51bmRlZlN0YWNrKSB7XG4gICAgICAgICAgICBzdGFja1NpemUgPSAwO1xuICAgICAgICAgICAgc3RhdGUudW5kZWZTdGFjayA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHBhcnNlQ2hhclN0cmluZ3Moe1xuICAgICAgY2hhclN0cmluZ3MsXG4gICAgICBsb2NhbFN1YnJJbmRleCxcbiAgICAgIGdsb2JhbFN1YnJJbmRleCxcbiAgICAgIGZkU2VsZWN0LFxuICAgICAgZmRBcnJheSxcbiAgICAgIHByaXZhdGVEaWN0LFxuICAgIH0pIHtcbiAgICAgIHZhciBzZWFjcyA9IFtdO1xuICAgICAgdmFyIHdpZHRocyA9IFtdO1xuICAgICAgdmFyIGNvdW50ID0gY2hhclN0cmluZ3MuY291bnQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgdmFyIGNoYXJzdHJpbmcgPSBjaGFyU3RyaW5ncy5nZXQoaSk7XG4gICAgICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgICAgICBjYWxsRGVwdGg6IDAsXG4gICAgICAgICAgc3RhY2tTaXplOiAwLFxuICAgICAgICAgIHN0YWNrOiBbXSxcbiAgICAgICAgICB1bmRlZlN0YWNrOiB0cnVlLFxuICAgICAgICAgIGhpbnRzOiAwLFxuICAgICAgICAgIGZpcnN0U3RhY2tDbGVhcmluZzogdHJ1ZSxcbiAgICAgICAgICBzZWFjOiBudWxsLFxuICAgICAgICAgIHdpZHRoOiBudWxsLFxuICAgICAgICAgIGhhc1ZTdGVtczogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHZhciB2YWxpZCA9IHRydWU7XG4gICAgICAgIHZhciBsb2NhbFN1YnJUb1VzZSA9IG51bGw7XG4gICAgICAgIHZhciBwcml2YXRlRGljdFRvVXNlID0gcHJpdmF0ZURpY3Q7XG4gICAgICAgIGlmIChmZFNlbGVjdCAmJiBmZEFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIHZhciBmZEluZGV4ID0gZmRTZWxlY3QuZ2V0RkRJbmRleChpKTtcbiAgICAgICAgICBpZiAoZmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHdhcm4oXCJHbHlwaCBpbmRleCBpcyBub3QgaW4gZmQgc2VsZWN0LlwiKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmZEluZGV4ID49IGZkQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICB3YXJuKFwiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguXCIpO1xuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICBwcml2YXRlRGljdFRvVXNlID0gZmRBcnJheVtmZEluZGV4XS5wcml2YXRlRGljdDtcbiAgICAgICAgICAgIGxvY2FsU3ViclRvVXNlID0gcHJpdmF0ZURpY3RUb1VzZS5zdWJyc0luZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbFN1YnJJbmRleCkge1xuICAgICAgICAgIGxvY2FsU3ViclRvVXNlID0gbG9jYWxTdWJySW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgY2hhcnN0cmluZyxcbiAgICAgICAgICAgIGxvY2FsU3ViclRvVXNlLFxuICAgICAgICAgICAgZ2xvYmFsU3VickluZGV4XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBub21pbmFsV2lkdGggPSBwcml2YXRlRGljdFRvVXNlLmdldEJ5TmFtZShcIm5vbWluYWxXaWR0aFhcIik7XG4gICAgICAgICAgd2lkdGhzW2ldID0gbm9taW5hbFdpZHRoICsgc3RhdGUud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoXCJkZWZhdWx0V2lkdGhYXCIpO1xuICAgICAgICAgIHdpZHRoc1tpXSA9IGRlZmF1bHRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuc2VhYyAhPT0gbnVsbCkge1xuICAgICAgICAgIHNlYWNzW2ldID0gc3RhdGUuc2VhYztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgLy8gcmVzZXR0aW5nIGludmFsaWQgY2hhcnN0cmluZyB0byBzaW5nbGUgJ2VuZGNoYXInXG4gICAgICAgICAgY2hhclN0cmluZ3Muc2V0KGksIG5ldyBVaW50OEFycmF5KFsxNF0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2hhclN0cmluZ3MsIHNlYWNzLCB3aWR0aHMgfTtcbiAgICB9XG5cbiAgICBlbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpIHtcbiAgICAgIHZhciBwcml2YXRlRGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZQcml2YXRlRGljdCwgW10sIHBhcmVudERpY3Quc3RyaW5ncyk7XG4gICAgICBwYXJlbnREaWN0LnNldEJ5S2V5KDE4LCBbMCwgMF0pO1xuICAgICAgcGFyZW50RGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0O1xuICAgIH1cblxuICAgIHBhcnNlUHJpdmF0ZURpY3QocGFyZW50RGljdCkge1xuICAgICAgLy8gbm8gcHJpdmF0ZSBkaWN0LCBkbyBub3RoaW5nXG4gICAgICBpZiAoIXBhcmVudERpY3QuaGFzTmFtZShcIlByaXZhdGVcIikpIHtcbiAgICAgICAgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcHJpdmF0ZU9mZnNldCA9IHBhcmVudERpY3QuZ2V0QnlOYW1lKFwiUHJpdmF0ZVwiKTtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1zIGFyZSBmb3JtYXR0ZWQgY29ycmVjdGx5XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJpdmF0ZU9mZnNldCkgfHwgcHJpdmF0ZU9mZnNldC5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgcGFyZW50RGljdC5yZW1vdmVCeU5hbWUoXCJQcml2YXRlXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgc2l6ZSA9IHByaXZhdGVPZmZzZXRbMF07XG4gICAgICB2YXIgb2Zmc2V0ID0gcHJpdmF0ZU9mZnNldFsxXTtcbiAgICAgIC8vIHJlbW92ZSBlbXB0eSBkaWN0cyBvciBvbmVzIHRoYXQgcmVmZXIgdG8gaW52YWxpZCBsb2NhdGlvblxuICAgICAgaWYgKHNpemUgPT09IDAgfHwgb2Zmc2V0ID49IHRoaXMuYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJpdmF0ZURpY3RFbmQgPSBvZmZzZXQgKyBzaXplO1xuICAgICAgdmFyIGRpY3REYXRhID0gdGhpcy5ieXRlcy5zdWJhcnJheShvZmZzZXQsIHByaXZhdGVEaWN0RW5kKTtcbiAgICAgIHZhciBkaWN0ID0gdGhpcy5wYXJzZURpY3QoZGljdERhdGEpO1xuICAgICAgdmFyIHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KFxuICAgICAgICBDRkZQcml2YXRlRGljdCxcbiAgICAgICAgZGljdCxcbiAgICAgICAgcGFyZW50RGljdC5zdHJpbmdzXG4gICAgICApO1xuICAgICAgcGFyZW50RGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0O1xuXG4gICAgICAvLyBQYXJzZSB0aGUgU3VicnMgaW5kZXggYWxzbyBzaW5jZSBpdCdzIHJlbGF0aXZlIHRvIHRoZSBwcml2YXRlIGRpY3QuXG4gICAgICBpZiAoIXByaXZhdGVEaWN0LmdldEJ5TmFtZShcIlN1YnJzXCIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBzdWJyc09mZnNldCA9IHByaXZhdGVEaWN0LmdldEJ5TmFtZShcIlN1YnJzXCIpO1xuICAgICAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gb2Zmc2V0ICsgc3VicnNPZmZzZXQ7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgb2Zmc2V0LlxuICAgICAgaWYgKHN1YnJzT2Zmc2V0ID09PSAwIHx8IHJlbGF0aXZlT2Zmc2V0ID49IHRoaXMuYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHN1YnJzSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgocmVsYXRpdmVPZmZzZXQpO1xuICAgICAgcHJpdmF0ZURpY3Quc3VicnNJbmRleCA9IHN1YnJzSW5kZXgub2JqO1xuICAgIH1cblxuICAgIHBhcnNlQ2hhcnNldHMocG9zLCBsZW5ndGgsIHN0cmluZ3MsIGNpZCkge1xuICAgICAgaWYgKHBvcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQoXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLklTT19BRE9CRSxcbiAgICAgICAgICBJU09BZG9iZUNoYXJzZXRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJULFxuICAgICAgICAgIEV4cGVydENoYXJzZXRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocG9zID09PSAyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJUX1NVQlNFVCxcbiAgICAgICAgICBFeHBlcnRTdWJzZXRDaGFyc2V0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7XG4gICAgICB2YXIgc3RhcnQgPSBwb3M7XG4gICAgICB2YXIgZm9ybWF0ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgY29uc3QgY2hhcnNldCA9IFtjaWQgPyAwIDogXCIubm90ZGVmXCJdO1xuICAgICAgdmFyIGlkLCBjb3VudCwgaTtcblxuICAgICAgLy8gc3VidHJhY3QgMSBmb3IgdGhlIC5ub3RkZWYgZ2x5cGhcbiAgICAgIGxlbmd0aCAtPSAxO1xuXG4gICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZCA9IChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107XG4gICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQgOiBzdHJpbmdzLmdldChpZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSB8IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGNvdW50ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCsrIDogc3RyaW5ncy5nZXQoaWQrKykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSB8IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGNvdW50ID0gKGJ5dGVzW3BvcysrXSA8PCA4KSB8IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiVW5rbm93biBjaGFyc2V0IGZvcm1hdFwiKTtcbiAgICAgIH1cbiAgICAgIC8vIFJhdyB3b24ndCBiZSBuZWVkZWQgaWYgd2UgYWN0dWFsbHkgY29tcGlsZSB0aGUgY2hhcnNldC5cbiAgICAgIHZhciBlbmQgPSBwb3M7XG4gICAgICB2YXIgcmF3ID0gYnl0ZXMuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG5cbiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgZm9ybWF0LCBjaGFyc2V0LCByYXcpO1xuICAgIH1cblxuICAgIHBhcnNlRW5jb2RpbmcocG9zLCBwcm9wZXJ0aWVzLCBzdHJpbmdzLCBjaGFyc2V0KSB7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICAgIHZhciBwcmVkZWZpbmVkID0gZmFsc2U7XG4gICAgICB2YXIgZm9ybWF0LCBpLCBpaTtcbiAgICAgIHZhciByYXcgPSBudWxsO1xuXG4gICAgICBmdW5jdGlvbiByZWFkU3VwcGxlbWVudCgpIHtcbiAgICAgICAgdmFyIHN1cHBsZW1lbnRzQ291bnQgPSBieXRlc1twb3MrK107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdXBwbGVtZW50c0NvdW50OyBpKyspIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICB2YXIgc2lkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSArIChieXRlc1twb3MrK10gJiAweGZmKTtcbiAgICAgICAgICBlbmNvZGluZ1tjb2RlXSA9IGNoYXJzZXQuaW5kZXhPZihzdHJpbmdzLmdldChzaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9zID09PSAwIHx8IHBvcyA9PT0gMSkge1xuICAgICAgICBwcmVkZWZpbmVkID0gdHJ1ZTtcbiAgICAgICAgZm9ybWF0ID0gcG9zO1xuICAgICAgICB2YXIgYmFzZUVuY29kaW5nID0gcG9zID8gRXhwZXJ0RW5jb2RpbmcgOiBTdGFuZGFyZEVuY29kaW5nO1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIHZhciBpbmRleCA9IGJhc2VFbmNvZGluZy5pbmRleE9mKGNoYXJzZXRbaV0pO1xuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZGF0YVN0YXJ0ID0gcG9zO1xuICAgICAgICBmb3JtYXQgPSBieXRlc1twb3MrK107XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0ICYgMHg3Zikge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHZhciBnbHlwaHNDb3VudCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBlbmNvZGluZ1tieXRlc1twb3MrK11dID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdmFyIHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICAgICAgdmFyIGdpZCA9IDE7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBieXRlc1twb3MrK107XG4gICAgICAgICAgICAgIHZhciBsZWZ0ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPD0gc3RhcnQgKyBsZWZ0OyBqKyspIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZ1tqXSA9IGdpZCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVua25vd24gZW5jb2RpbmcgZm9ybWF0OiAke2Zvcm1hdH0gaW4gQ0ZGYCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGFFbmQgPSBwb3M7XG4gICAgICAgIGlmIChmb3JtYXQgJiAweDgwKSB7XG4gICAgICAgICAgLy8gaGFzU3VwcGxlbWVudFxuICAgICAgICAgIC8vIFRoZSBmb250IHNhbml0aXplciBkb2VzIG5vdCBzdXBwb3J0IENGRiBlbmNvZGluZyB3aXRoIGFcbiAgICAgICAgICAvLyBzdXBwbGVtZW50LCBzaW5jZSB0aGUgZW5jb2RpbmcgaXMgbm90IHJlYWxseSB1c2VkIHRvIG1hcFxuICAgICAgICAgIC8vIGJldHdlZW4gZ2lkIHRvIGdseXBoLCBsZXQncyBvdmVyd3JpdGUgd2hhdCBpcyBkZWNsYXJlZCBpblxuICAgICAgICAgIC8vIHRoZSB0b3AgZGljdGlvbmFyeSB0byBsZXQgdGhlIHNhbml0aXplciB0aGluayB0aGUgZm9udCB1c2VcbiAgICAgICAgICAvLyBTdGFuZGFyZEVuY29kaW5nLCB0aGF0J3MgYSBsaWUgYnV0IHRoYXQncyBvay5cbiAgICAgICAgICBieXRlc1tkYXRhU3RhcnRdICY9IDB4N2Y7XG4gICAgICAgICAgcmVhZFN1cHBsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICByYXcgPSBieXRlcy5zdWJhcnJheShkYXRhU3RhcnQsIGRhdGFFbmQpO1xuICAgICAgfVxuICAgICAgZm9ybWF0ID0gZm9ybWF0ICYgMHg3ZjtcbiAgICAgIHJldHVybiBuZXcgQ0ZGRW5jb2RpbmcocHJlZGVmaW5lZCwgZm9ybWF0LCBlbmNvZGluZywgcmF3KTtcbiAgICB9XG5cbiAgICBwYXJzZUZEU2VsZWN0KHBvcywgbGVuZ3RoKSB7XG4gICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzO1xuICAgICAgdmFyIGZvcm1hdCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgIHZhciBmZFNlbGVjdCA9IFtdO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHZhciByYW5nZXNDb3VudCA9IChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhbmdlc0NvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdCA9IChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBmaXJzdCAhPT0gMCkge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwicGFyc2VGRFNlbGVjdDogVGhlIGZpcnN0IHJhbmdlIG11c3QgaGF2ZSBhIGZpcnN0IEdJRCBvZiAwXCIgK1xuICAgICAgICAgICAgICAgICAgXCIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgZmlyc3QgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGZkSW5kZXggPSBieXRlc1twb3MrK107XG4gICAgICAgICAgICB2YXIgbmV4dCA9IChieXRlc1twb3NdIDw8IDgpIHwgYnl0ZXNbcG9zICsgMV07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gZmlyc3Q7IGogPCBuZXh0OyArK2opIHtcbiAgICAgICAgICAgICAgZmRTZWxlY3QucHVzaChmZEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWR2YW5jZSBwYXN0IHRoZSBzZW50aW5lbChuZXh0KS5cbiAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYHBhcnNlRkRTZWxlY3Q6IFVua25vd24gZm9ybWF0IFwiJHtmb3JtYXR9XCIuYCk7XG4gICAgICB9XG4gICAgICBpZiAoZmRTZWxlY3QubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwicGFyc2VGRFNlbGVjdDogSW52YWxpZCBmb250IGRhdGEuXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IENGRkZEU2VsZWN0KGZvcm1hdCwgZmRTZWxlY3QpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQ0ZGUGFyc2VyO1xufSkoKTtcblxuLy8gQ29tcGFjdCBGb250IEZvcm1hdFxuY2xhc3MgQ0ZGIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWFkZXIgPSBudWxsO1xuICAgIHRoaXMubmFtZXMgPSBbXTtcbiAgICB0aGlzLnRvcERpY3QgPSBudWxsO1xuICAgIHRoaXMuc3RyaW5ncyA9IG5ldyBDRkZTdHJpbmdzKCk7XG4gICAgdGhpcy5nbG9iYWxTdWJySW5kZXggPSBudWxsO1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb3VsZCByZWFsbHkgYmUgcGVyIGZvbnQsIGJ1dCBzaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGZvbnRcbiAgICAvLyBzdG9yZSB0aGVtIGhlcmUuXG4gICAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gICAgdGhpcy5jaGFyc2V0ID0gbnVsbDtcbiAgICB0aGlzLmNoYXJTdHJpbmdzID0gbnVsbDtcbiAgICB0aGlzLmZkQXJyYXkgPSBbXTtcbiAgICB0aGlzLmZkU2VsZWN0ID0gbnVsbDtcblxuICAgIHRoaXMuaXNDSURGb250ID0gZmFsc2U7XG4gIH1cblxuICBkdXBsaWNhdGVGaXJzdEdseXBoKCkge1xuICAgIC8vIEJyb3dzZXJzIHdpbGwgbm90IGRpc3BsYXkgYSBnbHlwaCBhdCBwb3NpdGlvbiAwLiBUeXBpY2FsbHkgZ2x5cGggMCBpc1xuICAgIC8vIG5vdGRlZiwgYnV0IGEgbnVtYmVyIG9mIGZvbnRzIHB1dCBhIHZhbGlkIGdseXBoIHRoZXJlIHNvIGl0IG11c3QgYmVcbiAgICAvLyBkdXBsaWNhdGVkIGFuZCBhcHBlbmRlZC5cbiAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkge1xuICAgICAgd2FybihcIk5vdCBlbm91Z2ggc3BhY2UgaW4gY2hhcnN0cmluZ3MgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGdseXBoWmVybyA9IHRoaXMuY2hhclN0cmluZ3MuZ2V0KDApO1xuICAgIHRoaXMuY2hhclN0cmluZ3MuYWRkKGdseXBoWmVybyk7XG4gICAgaWYgKHRoaXMuaXNDSURGb250KSB7XG4gICAgICB0aGlzLmZkU2VsZWN0LmZkU2VsZWN0LnB1c2godGhpcy5mZFNlbGVjdC5mZFNlbGVjdFswXSk7XG4gICAgfVxuICB9XG5cbiAgaGFzR2x5cGhJZChpZCkge1xuICAgIGlmIChpZCA8IDAgfHwgaWQgPj0gdGhpcy5jaGFyU3RyaW5ncy5jb3VudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZ2x5cGggPSB0aGlzLmNoYXJTdHJpbmdzLmdldChpZCk7XG4gICAgcmV0dXJuIGdseXBoLmxlbmd0aCA+IDA7XG4gIH1cbn1cblxuY2xhc3MgQ0ZGSGVhZGVyIHtcbiAgY29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKSB7XG4gICAgdGhpcy5tYWpvciA9IG1ham9yO1xuICAgIHRoaXMubWlub3IgPSBtaW5vcjtcbiAgICB0aGlzLmhkclNpemUgPSBoZHJTaXplO1xuICAgIHRoaXMub2ZmU2l6ZSA9IG9mZlNpemU7XG4gIH1cbn1cblxuY2xhc3MgQ0ZGU3RyaW5ncyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RyaW5ncyA9IFtdO1xuICB9XG5cbiAgZ2V0KGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIC0gMSkge1xuICAgICAgcmV0dXJuIENGRlN0YW5kYXJkU3RyaW5nc1tpbmRleF07XG4gICAgfVxuICAgIGlmIChpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA8PSB0aGlzLnN0cmluZ3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdzW2luZGV4IC0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTXTtcbiAgICB9XG4gICAgcmV0dXJuIENGRlN0YW5kYXJkU3RyaW5nc1swXTtcbiAgfVxuXG4gIGdldFNJRChzdHIpIHtcbiAgICBsZXQgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihzdHIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgaW5kZXggPSB0aGlzLnN0cmluZ3MuaW5kZXhPZihzdHIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBpbmRleCArIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgYWRkKHZhbHVlKSB7XG4gICAgdGhpcy5zdHJpbmdzLnB1c2godmFsdWUpO1xuICB9XG5cbiAgZ2V0IGNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnN0cmluZ3MubGVuZ3RoO1xuICB9XG59XG5cbmNsYXNzIENGRkluZGV4IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vYmplY3RzID0gW107XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgYWRkKGRhdGEpIHtcbiAgICB0aGlzLmxlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICB0aGlzLm9iamVjdHMucHVzaChkYXRhKTtcbiAgfVxuXG4gIHNldChpbmRleCwgZGF0YSkge1xuICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoIC0gdGhpcy5vYmplY3RzW2luZGV4XS5sZW5ndGg7XG4gICAgdGhpcy5vYmplY3RzW2luZGV4XSA9IGRhdGE7XG4gIH1cblxuICBnZXQoaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3RzW2luZGV4XTtcbiAgfVxuXG4gIGdldCBjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDtcbiAgfVxufVxuXG5jbGFzcyBDRkZEaWN0IHtcbiAgY29uc3RydWN0b3IodGFibGVzLCBzdHJpbmdzKSB7XG4gICAgdGhpcy5rZXlUb05hbWVNYXAgPSB0YWJsZXMua2V5VG9OYW1lTWFwO1xuICAgIHRoaXMubmFtZVRvS2V5TWFwID0gdGFibGVzLm5hbWVUb0tleU1hcDtcbiAgICB0aGlzLmRlZmF1bHRzID0gdGFibGVzLmRlZmF1bHRzO1xuICAgIHRoaXMudHlwZXMgPSB0YWJsZXMudHlwZXM7XG4gICAgdGhpcy5vcGNvZGVzID0gdGFibGVzLm9wY29kZXM7XG4gICAgdGhpcy5vcmRlciA9IHRhYmxlcy5vcmRlcjtcbiAgICB0aGlzLnN0cmluZ3MgPSBzdHJpbmdzO1xuICAgIHRoaXMudmFsdWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIHZhbHVlIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXlcbiAgc2V0QnlLZXkoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmtleVRvTmFtZU1hcCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIC8vIGlnbm9yZSBlbXB0eSB2YWx1ZXNcbiAgICBpZiAodmFsdWVMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBJZ25vcmUgaW52YWxpZCB2YWx1ZXMgKGZpeGVzIGJ1ZzEwNjg0MzIucGRmIGFuZCBidWcxMzA4NTM2LnBkZikuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZUxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWVbaV0pKSB7XG4gICAgICAgIHdhcm4oJ0ludmFsaWQgQ0ZGRGljdCB2YWx1ZTogXCInICsgdmFsdWUgKyAnXCIgZm9yIGtleSBcIicgKyBrZXkgKyAnXCIuJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdHlwZSA9IHRoaXMudHlwZXNba2V5XTtcbiAgICAvLyByZW1vdmUgdGhlIGFycmF5IHdyYXBwaW5nIHRoZXNlIHR5cGVzIG9mIHZhbHVlc1xuICAgIGlmICh0eXBlID09PSBcIm51bVwiIHx8IHR5cGUgPT09IFwic2lkXCIgfHwgdHlwZSA9PT0gXCJvZmZzZXRcIikge1xuICAgICAgdmFsdWUgPSB2YWx1ZVswXTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2V0QnlOYW1lKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLm5hbWVUb0tleU1hcCkpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXNbdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV1dID0gdmFsdWU7XG4gIH1cblxuICBoYXNOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV0gaW4gdGhpcy52YWx1ZXM7XG4gIH1cblxuICBnZXRCeU5hbWUobmFtZSkge1xuICAgIGlmICghKG5hbWUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZGljdGlvbmFyeSBuYW1lICR7bmFtZX1cImApO1xuICAgIH1cbiAgICB2YXIga2V5ID0gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV07XG4gICAgaWYgKCEoa2V5IGluIHRoaXMudmFsdWVzKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdHNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2tleV07XG4gIH1cblxuICByZW1vdmVCeU5hbWUobmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtuYW1lXV07XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGFibGVzKGxheW91dCkge1xuICAgIHZhciB0YWJsZXMgPSB7XG4gICAgICBrZXlUb05hbWVNYXA6IHt9LFxuICAgICAgbmFtZVRvS2V5TWFwOiB7fSxcbiAgICAgIGRlZmF1bHRzOiB7fSxcbiAgICAgIHR5cGVzOiB7fSxcbiAgICAgIG9wY29kZXM6IHt9LFxuICAgICAgb3JkZXI6IFtdLFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbGF5b3V0Lmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIHZhciBlbnRyeSA9IGxheW91dFtpXTtcbiAgICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KGVudHJ5WzBdKVxuICAgICAgICA/IChlbnRyeVswXVswXSA8PCA4KSArIGVudHJ5WzBdWzFdXG4gICAgICAgIDogZW50cnlbMF07XG4gICAgICB0YWJsZXMua2V5VG9OYW1lTWFwW2tleV0gPSBlbnRyeVsxXTtcbiAgICAgIHRhYmxlcy5uYW1lVG9LZXlNYXBbZW50cnlbMV1dID0ga2V5O1xuICAgICAgdGFibGVzLnR5cGVzW2tleV0gPSBlbnRyeVsyXTtcbiAgICAgIHRhYmxlcy5kZWZhdWx0c1trZXldID0gZW50cnlbM107XG4gICAgICB0YWJsZXMub3Bjb2Rlc1trZXldID0gQXJyYXkuaXNBcnJheShlbnRyeVswXSkgPyBlbnRyeVswXSA6IFtlbnRyeVswXV07XG4gICAgICB0YWJsZXMub3JkZXIucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdGFibGVzO1xuICB9XG59XG5cbnZhciBDRkZUb3BEaWN0ID0gKGZ1bmN0aW9uIENGRlRvcERpY3RDbG9zdXJlKCkge1xuICB2YXIgbGF5b3V0ID0gW1xuICAgIFtbMTIsIDMwXSwgXCJST1NcIiwgW1wic2lkXCIsIFwic2lkXCIsIFwibnVtXCJdLCBudWxsXSxcbiAgICBbWzEyLCAyMF0sIFwiU3ludGhldGljQmFzZVwiLCBcIm51bVwiLCBudWxsXSxcbiAgICBbMCwgXCJ2ZXJzaW9uXCIsIFwic2lkXCIsIG51bGxdLFxuICAgIFsxLCBcIk5vdGljZVwiLCBcInNpZFwiLCBudWxsXSxcbiAgICBbWzEyLCAwXSwgXCJDb3B5cmlnaHRcIiwgXCJzaWRcIiwgbnVsbF0sXG4gICAgWzIsIFwiRnVsbE5hbWVcIiwgXCJzaWRcIiwgbnVsbF0sXG4gICAgWzMsIFwiRmFtaWx5TmFtZVwiLCBcInNpZFwiLCBudWxsXSxcbiAgICBbNCwgXCJXZWlnaHRcIiwgXCJzaWRcIiwgbnVsbF0sXG4gICAgW1sxMiwgMV0sIFwiaXNGaXhlZFBpdGNoXCIsIFwibnVtXCIsIDBdLFxuICAgIFtbMTIsIDJdLCBcIkl0YWxpY0FuZ2xlXCIsIFwibnVtXCIsIDBdLFxuICAgIFtbMTIsIDNdLCBcIlVuZGVybGluZVBvc2l0aW9uXCIsIFwibnVtXCIsIC0xMDBdLFxuICAgIFtbMTIsIDRdLCBcIlVuZGVybGluZVRoaWNrbmVzc1wiLCBcIm51bVwiLCA1MF0sXG4gICAgW1sxMiwgNV0sIFwiUGFpbnRUeXBlXCIsIFwibnVtXCIsIDBdLFxuICAgIFtbMTIsIDZdLCBcIkNoYXJzdHJpbmdUeXBlXCIsIFwibnVtXCIsIDJdLFxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIFtbMTIsIDddLCBcIkZvbnRNYXRyaXhcIiwgW1wibnVtXCIsIFwibnVtXCIsIFwibnVtXCIsIFwibnVtXCIsIFwibnVtXCIsIFwibnVtXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdXSxcbiAgICBbMTMsIFwiVW5pcXVlSURcIiwgXCJudW1cIiwgbnVsbF0sXG4gICAgWzUsIFwiRm9udEJCb3hcIiwgW1wibnVtXCIsIFwibnVtXCIsIFwibnVtXCIsIFwibnVtXCJdLCBbMCwgMCwgMCwgMF1dLFxuICAgIFtbMTIsIDhdLCBcIlN0cm9rZVdpZHRoXCIsIFwibnVtXCIsIDBdLFxuICAgIFsxNCwgXCJYVUlEXCIsIFwiYXJyYXlcIiwgbnVsbF0sXG4gICAgWzE1LCBcImNoYXJzZXRcIiwgXCJvZmZzZXRcIiwgMF0sXG4gICAgWzE2LCBcIkVuY29kaW5nXCIsIFwib2Zmc2V0XCIsIDBdLFxuICAgIFsxNywgXCJDaGFyU3RyaW5nc1wiLCBcIm9mZnNldFwiLCAwXSxcbiAgICBbMTgsIFwiUHJpdmF0ZVwiLCBbXCJvZmZzZXRcIiwgXCJvZmZzZXRcIl0sIG51bGxdLFxuICAgIFtbMTIsIDIxXSwgXCJQb3N0U2NyaXB0XCIsIFwic2lkXCIsIG51bGxdLFxuICAgIFtbMTIsIDIyXSwgXCJCYXNlRm9udE5hbWVcIiwgXCJzaWRcIiwgbnVsbF0sXG4gICAgW1sxMiwgMjNdLCBcIkJhc2VGb250QmxlbmRcIiwgXCJkZWx0YVwiLCBudWxsXSxcbiAgICBbWzEyLCAzMV0sIFwiQ0lERm9udFZlcnNpb25cIiwgXCJudW1cIiwgMF0sXG4gICAgW1sxMiwgMzJdLCBcIkNJREZvbnRSZXZpc2lvblwiLCBcIm51bVwiLCAwXSxcbiAgICBbWzEyLCAzM10sIFwiQ0lERm9udFR5cGVcIiwgXCJudW1cIiwgMF0sXG4gICAgW1sxMiwgMzRdLCBcIkNJRENvdW50XCIsIFwibnVtXCIsIDg3MjBdLFxuICAgIFtbMTIsIDM1XSwgXCJVSURCYXNlXCIsIFwibnVtXCIsIG51bGxdLFxuICAgIC8vIFhYWDogQ0lEIEZvbnRzIG9uIERpcmVjdFdyaXRlIDYuMSBvbmx5IHNlZW0gdG8gd29yayBpZiBGRFNlbGVjdCBjb21lc1xuICAgIC8vIGJlZm9yZSBGREFycmF5LlxuICAgIFtbMTIsIDM3XSwgXCJGRFNlbGVjdFwiLCBcIm9mZnNldFwiLCBudWxsXSxcbiAgICBbWzEyLCAzNl0sIFwiRkRBcnJheVwiLCBcIm9mZnNldFwiLCBudWxsXSxcbiAgICBbWzEyLCAzOF0sIFwiRm9udE5hbWVcIiwgXCJzaWRcIiwgbnVsbF0sXG4gIF07XG4gIHZhciB0YWJsZXMgPSBudWxsO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgQ0ZGVG9wRGljdCBleHRlbmRzIENGRkRpY3Qge1xuICAgIGNvbnN0cnVjdG9yKHN0cmluZ3MpIHtcbiAgICAgIGlmICh0YWJsZXMgPT09IG51bGwpIHtcbiAgICAgICAgdGFibGVzID0gQ0ZGRGljdC5jcmVhdGVUYWJsZXMobGF5b3V0KTtcbiAgICAgIH1cbiAgICAgIHN1cGVyKHRhYmxlcywgc3RyaW5ncyk7XG4gICAgICB0aGlzLnByaXZhdGVEaWN0ID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENGRlRvcERpY3Q7XG59KSgpO1xuXG52YXIgQ0ZGUHJpdmF0ZURpY3QgPSAoZnVuY3Rpb24gQ0ZGUHJpdmF0ZURpY3RDbG9zdXJlKCkge1xuICB2YXIgbGF5b3V0ID0gW1xuICAgIFs2LCBcIkJsdWVWYWx1ZXNcIiwgXCJkZWx0YVwiLCBudWxsXSxcbiAgICBbNywgXCJPdGhlckJsdWVzXCIsIFwiZGVsdGFcIiwgbnVsbF0sXG4gICAgWzgsIFwiRmFtaWx5Qmx1ZXNcIiwgXCJkZWx0YVwiLCBudWxsXSxcbiAgICBbOSwgXCJGYW1pbHlPdGhlckJsdWVzXCIsIFwiZGVsdGFcIiwgbnVsbF0sXG4gICAgW1sxMiwgOV0sIFwiQmx1ZVNjYWxlXCIsIFwibnVtXCIsIDAuMDM5NjI1XSxcbiAgICBbWzEyLCAxMF0sIFwiQmx1ZVNoaWZ0XCIsIFwibnVtXCIsIDddLFxuICAgIFtbMTIsIDExXSwgXCJCbHVlRnV6elwiLCBcIm51bVwiLCAxXSxcbiAgICBbMTAsIFwiU3RkSFdcIiwgXCJudW1cIiwgbnVsbF0sXG4gICAgWzExLCBcIlN0ZFZXXCIsIFwibnVtXCIsIG51bGxdLFxuICAgIFtbMTIsIDEyXSwgXCJTdGVtU25hcEhcIiwgXCJkZWx0YVwiLCBudWxsXSxcbiAgICBbWzEyLCAxM10sIFwiU3RlbVNuYXBWXCIsIFwiZGVsdGFcIiwgbnVsbF0sXG4gICAgW1sxMiwgMTRdLCBcIkZvcmNlQm9sZFwiLCBcIm51bVwiLCAwXSxcbiAgICBbWzEyLCAxN10sIFwiTGFuZ3VhZ2VHcm91cFwiLCBcIm51bVwiLCAwXSxcbiAgICBbWzEyLCAxOF0sIFwiRXhwYW5zaW9uRmFjdG9yXCIsIFwibnVtXCIsIDAuMDZdLFxuICAgIFtbMTIsIDE5XSwgXCJpbml0aWFsUmFuZG9tU2VlZFwiLCBcIm51bVwiLCAwXSxcbiAgICBbMjAsIFwiZGVmYXVsdFdpZHRoWFwiLCBcIm51bVwiLCAwXSxcbiAgICBbMjEsIFwibm9taW5hbFdpZHRoWFwiLCBcIm51bVwiLCAwXSxcbiAgICBbMTksIFwiU3VicnNcIiwgXCJvZmZzZXRcIiwgbnVsbF0sXG4gIF07XG4gIHZhciB0YWJsZXMgPSBudWxsO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgQ0ZGUHJpdmF0ZURpY3QgZXh0ZW5kcyBDRkZEaWN0IHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpbmdzKSB7XG4gICAgICBpZiAodGFibGVzID09PSBudWxsKSB7XG4gICAgICAgIHRhYmxlcyA9IENGRkRpY3QuY3JlYXRlVGFibGVzKGxheW91dCk7XG4gICAgICB9XG4gICAgICBzdXBlcih0YWJsZXMsIHN0cmluZ3MpO1xuICAgICAgdGhpcy5zdWJyc0luZGV4ID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENGRlByaXZhdGVEaWN0O1xufSkoKTtcblxudmFyIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMgPSB7XG4gIElTT19BRE9CRTogMCxcbiAgRVhQRVJUOiAxLFxuICBFWFBFUlRfU1VCU0VUOiAyLFxufTtcbmNsYXNzIENGRkNoYXJzZXQge1xuICBjb25zdHJ1Y3RvcihwcmVkZWZpbmVkLCBmb3JtYXQsIGNoYXJzZXQsIHJhdykge1xuICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7XG4gICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgdGhpcy5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICB0aGlzLnJhdyA9IHJhdztcbiAgfVxufVxuXG5jbGFzcyBDRkZFbmNvZGluZyB7XG4gIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgZW5jb2RpbmcsIHJhdykge1xuICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7XG4gICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIHRoaXMucmF3ID0gcmF3O1xuICB9XG59XG5cbmNsYXNzIENGRkZEU2VsZWN0IHtcbiAgY29uc3RydWN0b3IoZm9ybWF0LCBmZFNlbGVjdCkge1xuICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIHRoaXMuZmRTZWxlY3QgPSBmZFNlbGVjdDtcbiAgfVxuXG4gIGdldEZESW5kZXgoZ2x5cGhJbmRleCkge1xuICAgIGlmIChnbHlwaEluZGV4IDwgMCB8fCBnbHlwaEluZGV4ID49IHRoaXMuZmRTZWxlY3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZkU2VsZWN0W2dseXBoSW5kZXhdO1xuICB9XG59XG5cbi8vIEhlbHBlciBjbGFzcyB0byBrZWVwIHRyYWNrIG9mIHdoZXJlIGFuIG9mZnNldCBpcyB3aXRoaW4gdGhlIGRhdGEgYW5kIGhlbHBzXG4vLyBmaWxsaW5nIGluIHRoYXQgb2Zmc2V0IG9uY2UgaXQncyBrbm93bi5cbmNsYXNzIENGRk9mZnNldFRyYWNrZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9mZnNldHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgaXNUcmFja2luZyhrZXkpIHtcbiAgICByZXR1cm4ga2V5IGluIHRoaXMub2Zmc2V0cztcbiAgfVxuXG4gIHRyYWNrKGtleSwgbG9jYXRpb24pIHtcbiAgICBpZiAoa2V5IGluIHRoaXMub2Zmc2V0cykge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBBbHJlYWR5IHRyYWNraW5nIGxvY2F0aW9uIG9mICR7a2V5fWApO1xuICAgIH1cbiAgICB0aGlzLm9mZnNldHNba2V5XSA9IGxvY2F0aW9uO1xuICB9XG5cbiAgb2Zmc2V0KHZhbHVlKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMub2Zmc2V0cykge1xuICAgICAgdGhpcy5vZmZzZXRzW2tleV0gKz0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc2V0RW50cnlMb2NhdGlvbihrZXksIHZhbHVlcywgb3V0cHV0KSB7XG4gICAgaWYgKCEoa2V5IGluIHRoaXMub2Zmc2V0cykpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgTm90IHRyYWNraW5nIGxvY2F0aW9uIG9mICR7a2V5fWApO1xuICAgIH1cbiAgICB2YXIgZGF0YSA9IG91dHB1dC5kYXRhO1xuICAgIHZhciBkYXRhT2Zmc2V0ID0gdGhpcy5vZmZzZXRzW2tleV07XG4gICAgdmFyIHNpemUgPSA1O1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHZhbHVlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICB2YXIgb2Zmc2V0MCA9IGkgKiBzaXplICsgZGF0YU9mZnNldDtcbiAgICAgIHZhciBvZmZzZXQxID0gb2Zmc2V0MCArIDE7XG4gICAgICB2YXIgb2Zmc2V0MiA9IG9mZnNldDAgKyAyO1xuICAgICAgdmFyIG9mZnNldDMgPSBvZmZzZXQwICsgMztcbiAgICAgIHZhciBvZmZzZXQ0ID0gb2Zmc2V0MCArIDQ7XG4gICAgICAvLyBJdCdzIGVhc3kgdG8gc2NyZXcgdXAgb2Zmc2V0cyBzbyBwZXJmb3JtIHRoaXMgc2FuaXR5IGNoZWNrLlxuICAgICAgaWYgKFxuICAgICAgICBkYXRhW29mZnNldDBdICE9PSAweDFkIHx8XG4gICAgICAgIGRhdGFbb2Zmc2V0MV0gIT09IDAgfHxcbiAgICAgICAgZGF0YVtvZmZzZXQyXSAhPT0gMCB8fFxuICAgICAgICBkYXRhW29mZnNldDNdICE9PSAwIHx8XG4gICAgICAgIGRhdGFbb2Zmc2V0NF0gIT09IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJ3cml0aW5nIHRvIGFuIG9mZnNldCB0aGF0IGlzIG5vdCBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgIGRhdGFbb2Zmc2V0MF0gPSAweDFkO1xuICAgICAgZGF0YVtvZmZzZXQxXSA9ICh2YWx1ZSA+PiAyNCkgJiAweGZmO1xuICAgICAgZGF0YVtvZmZzZXQyXSA9ICh2YWx1ZSA+PiAxNikgJiAweGZmO1xuICAgICAgZGF0YVtvZmZzZXQzXSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7XG4gICAgICBkYXRhW29mZnNldDRdID0gdmFsdWUgJiAweGZmO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUYWtlcyBhIENGRiBhbmQgY29udmVydHMgaXQgdG8gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbi5cbmNsYXNzIENGRkNvbXBpbGVyIHtcbiAgY29uc3RydWN0b3IoY2ZmKSB7XG4gICAgdGhpcy5jZmYgPSBjZmY7XG4gIH1cblxuICBjb21waWxlKCkge1xuICAgIHZhciBjZmYgPSB0aGlzLmNmZjtcbiAgICB2YXIgb3V0cHV0ID0ge1xuICAgICAgZGF0YTogW10sXG4gICAgICBsZW5ndGg6IDAsXG4gICAgICBhZGQ6IGZ1bmN0aW9uIENGRkNvbXBpbGVyX2FkZChkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZGF0YSk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIENvbXBpbGUgdGhlIGZpdmUgZW50cmllcyB0aGF0IG11c3QgYmUgaW4gb3JkZXIuXG4gICAgdmFyIGhlYWRlciA9IHRoaXMuY29tcGlsZUhlYWRlcihjZmYuaGVhZGVyKTtcbiAgICBvdXRwdXQuYWRkKGhlYWRlcik7XG5cbiAgICB2YXIgbmFtZUluZGV4ID0gdGhpcy5jb21waWxlTmFtZUluZGV4KGNmZi5uYW1lcyk7XG4gICAgb3V0cHV0LmFkZChuYW1lSW5kZXgpO1xuXG4gICAgaWYgKGNmZi5pc0NJREZvbnQpIHtcbiAgICAgIC8vIFRoZSBzcGVjIGlzIHVuY2xlYXIgb24gaG93IGZvbnQgbWF0cmljZXMgc2hvdWxkIHJlbGF0ZSB0byBlYWNoIG90aGVyXG4gICAgICAvLyB3aGVuIHRoZXJlIGlzIG9uZSBpbiB0aGUgbWFpbiB0b3AgZGljdCBhbmQgdGhlIHN1YiB0b3AgZGljdHMuXG4gICAgICAvLyBXaW5kb3dzIGhhbmRsZXMgdGhpcyBkaWZmZXJlbnRseSB0aGFuIGxpbnV4IGFuZCBvc3ggc28gd2UgaGF2ZSB0b1xuICAgICAgLy8gbm9ybWFsaXplIHRvIHdvcmsgb24gYWxsLlxuICAgICAgLy8gUnVsZXMgYmFzZWQgb2ZmIG9mIHNvbWUgbWFpbGluZyBsaXN0IGRpc2N1c3Npb25zOlxuICAgICAgLy8gLSBJZiBtYWluIGZvbnQgaGFzIGEgbWF0cml4IGFuZCBzdWJmb250IGRvZXNuJ3QsIHVzZSB0aGUgbWFpbiBtYXRyaXguXG4gICAgICAvLyAtIElmIG5vIG1haW4gZm9udCBtYXRyaXggYW5kIHRoZXJlIGlzIGEgc3ViZm9udCBtYXRyaXgsIHVzZSB0aGVcbiAgICAgIC8vICAgc3ViZm9udCBtYXRyaXguXG4gICAgICAvLyAtIElmIGJvdGggaGF2ZSBtYXRyaWNlcywgY29uY2F0IHRvZ2V0aGVyLlxuICAgICAgLy8gLSBJZiBuZWl0aGVyIGhhdmUgbWF0cmljZXMsIHVzZSBkZWZhdWx0LlxuICAgICAgLy8gVG8gbWFrZSB0aGlzIHdvcmsgb24gYWxsIHBsYXRmb3JtcyB3ZSBtb3ZlIHRoZSB0b3AgbWF0cml4IGludG8gZWFjaFxuICAgICAgLy8gc3ViIHRvcCBkaWN0IGFuZCBjb25jYXQgaWYgbmVjZXNzYXJ5LlxuICAgICAgaWYgKGNmZi50b3BEaWN0Lmhhc05hbWUoXCJGb250TWF0cml4XCIpKSB7XG4gICAgICAgIHZhciBiYXNlID0gY2ZmLnRvcERpY3QuZ2V0QnlOYW1lKFwiRm9udE1hdHJpeFwiKTtcbiAgICAgICAgY2ZmLnRvcERpY3QucmVtb3ZlQnlOYW1lKFwiRm9udE1hdHJpeFwiKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2ZmLmZkQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIHZhciBzdWJEaWN0ID0gY2ZmLmZkQXJyYXlbaV07XG4gICAgICAgICAgdmFyIG1hdHJpeCA9IGJhc2Uuc2xpY2UoMCk7XG4gICAgICAgICAgaWYgKHN1YkRpY3QuaGFzTmFtZShcIkZvbnRNYXRyaXhcIikpIHtcbiAgICAgICAgICAgIG1hdHJpeCA9IFV0aWwudHJhbnNmb3JtKG1hdHJpeCwgc3ViRGljdC5nZXRCeU5hbWUoXCJGb250TWF0cml4XCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3ViRGljdC5zZXRCeU5hbWUoXCJGb250TWF0cml4XCIsIG1hdHJpeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjZmYudG9wRGljdC5zZXRCeU5hbWUoXCJjaGFyc2V0XCIsIDApO1xuICAgIHZhciBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKFxuICAgICAgW2NmZi50b3BEaWN0XSxcbiAgICAgIG91dHB1dC5sZW5ndGgsXG4gICAgICBjZmYuaXNDSURGb250XG4gICAgKTtcbiAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7XG4gICAgdmFyIHRvcERpY3RUcmFja2VyID0gY29tcGlsZWQudHJhY2tlcnNbMF07XG5cbiAgICB2YXIgc3RyaW5nSW5kZXggPSB0aGlzLmNvbXBpbGVTdHJpbmdJbmRleChjZmYuc3RyaW5ncy5zdHJpbmdzKTtcbiAgICBvdXRwdXQuYWRkKHN0cmluZ0luZGV4KTtcblxuICAgIHZhciBnbG9iYWxTdWJySW5kZXggPSB0aGlzLmNvbXBpbGVJbmRleChjZmYuZ2xvYmFsU3VickluZGV4KTtcbiAgICBvdXRwdXQuYWRkKGdsb2JhbFN1YnJJbmRleCk7XG5cbiAgICAvLyBOb3cgc3RhcnQgb24gdGhlIG90aGVyIGVudHJpZXMgdGhhdCBoYXZlIG5vIHNwZWNpZmljIG9yZGVyLlxuICAgIGlmIChjZmYuZW5jb2RpbmcgJiYgY2ZmLnRvcERpY3QuaGFzTmFtZShcIkVuY29kaW5nXCIpKSB7XG4gICAgICBpZiAoY2ZmLmVuY29kaW5nLnByZWRlZmluZWQpIHtcbiAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbihcbiAgICAgICAgICBcIkVuY29kaW5nXCIsXG4gICAgICAgICAgW2NmZi5lbmNvZGluZy5mb3JtYXRdLFxuICAgICAgICAgIG91dHB1dFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVuY29kaW5nID0gdGhpcy5jb21waWxlRW5jb2RpbmcoY2ZmLmVuY29kaW5nKTtcbiAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbihcIkVuY29kaW5nXCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTtcbiAgICAgICAgb3V0cHV0LmFkZChlbmNvZGluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjaGFyc2V0ID0gdGhpcy5jb21waWxlQ2hhcnNldChcbiAgICAgIGNmZi5jaGFyc2V0LFxuICAgICAgY2ZmLmNoYXJTdHJpbmdzLmNvdW50LFxuICAgICAgY2ZmLnN0cmluZ3MsXG4gICAgICBjZmYuaXNDSURGb250XG4gICAgKTtcbiAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKFwiY2hhcnNldFwiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7XG4gICAgb3V0cHV0LmFkZChjaGFyc2V0KTtcblxuICAgIHZhciBjaGFyU3RyaW5ncyA9IHRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGNmZi5jaGFyU3RyaW5ncyk7XG4gICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbihcIkNoYXJTdHJpbmdzXCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTtcbiAgICBvdXRwdXQuYWRkKGNoYXJTdHJpbmdzKTtcblxuICAgIGlmIChjZmYuaXNDSURGb250KSB7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gRkRTZWxlY3QgbXVzdCBiZSBpbiBmcm9udCBvZiBGREFycmF5IG9uIHdpbmRvd3MuIE9TWFxuICAgICAgLy8gYW5kIGxpbnV4IGRvbid0IHNlZW0gdG8gY2FyZS5cbiAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oXCJGRFNlbGVjdFwiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7XG4gICAgICB2YXIgZmRTZWxlY3QgPSB0aGlzLmNvbXBpbGVGRFNlbGVjdChjZmYuZmRTZWxlY3QpO1xuICAgICAgb3V0cHV0LmFkZChmZFNlbGVjdCk7XG4gICAgICAvLyBJdCBpcyB1bmNsZWFyIGlmIHRoZSBzdWIgZm9udCBkaWN0aW9uYXJ5IGNhbiBoYXZlIENJRCByZWxhdGVkXG4gICAgICAvLyBkaWN0aW9uYXJ5IGtleXMsIGJ1dCB0aGUgc2FuaXRpemVyIGRvZXNuJ3QgbGlrZSB0aGVtIHNvIHJlbW92ZSB0aGVtLlxuICAgICAgY29tcGlsZWQgPSB0aGlzLmNvbXBpbGVUb3BEaWN0cyhjZmYuZmRBcnJheSwgb3V0cHV0Lmxlbmd0aCwgdHJ1ZSk7XG4gICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKFwiRkRBcnJheVwiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7XG4gICAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7XG4gICAgICB2YXIgZm9udERpY3RUcmFja2VycyA9IGNvbXBpbGVkLnRyYWNrZXJzO1xuXG4gICAgICB0aGlzLmNvbXBpbGVQcml2YXRlRGljdHMoY2ZmLmZkQXJyYXksIGZvbnREaWN0VHJhY2tlcnMsIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKFtjZmYudG9wRGljdF0sIFt0b3BEaWN0VHJhY2tlcl0sIG91dHB1dCk7XG5cbiAgICAvLyBJZiB0aGUgZm9udCBkYXRhIGVuZHMgd2l0aCBJTkRFWCB3aG9zZSBvYmplY3QgZGF0YSBpcyB6ZXJvLWxlbmd0aCxcbiAgICAvLyB0aGUgc2FuaXRpemVyIHdpbGwgYmFpbCBvdXQuIEFkZCBhIGR1bW15IGJ5dGUgdG8gYXZvaWQgdGhhdC5cbiAgICBvdXRwdXQuYWRkKFswXSk7XG5cbiAgICByZXR1cm4gb3V0cHV0LmRhdGE7XG4gIH1cblxuICBlbmNvZGVOdW1iZXIodmFsdWUpIHtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuY29kZUludGVnZXIodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmNvZGVGbG9hdCh2YWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCkge1xuICAgIHJldHVybiBzaGFkb3coXG4gICAgICB0aGlzLFxuICAgICAgXCJFbmNvZGVGbG9hdFJlZ0V4cFwiLFxuICAgICAgL1xcLihcXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXFxkezAsMn0oPzplKC4rKXwkKS9cbiAgICApO1xuICB9XG5cbiAgZW5jb2RlRmxvYXQobnVtKSB7XG4gICAgdmFyIHZhbHVlID0gbnVtLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBSb3VuZGluZyBpbmFjY3VyYXRlIGRvdWJsZXMuXG4gICAgdmFyIG0gPSBDRkZDb21waWxlci5FbmNvZGVGbG9hdFJlZ0V4cC5leGVjKHZhbHVlKTtcbiAgICBpZiAobSkge1xuICAgICAgdmFyIGVwc2lsb24gPSBwYXJzZUZsb2F0KFwiMWVcIiArICgobVsyXSA/ICttWzJdIDogMCkgKyBtWzFdLmxlbmd0aCkpO1xuICAgICAgdmFsdWUgPSAoTWF0aC5yb3VuZChudW0gKiBlcHNpbG9uKSAvIGVwc2lsb24pLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgdmFyIG5pYmJsZXMgPSBcIlwiO1xuICAgIHZhciBpLCBpaTtcbiAgICBmb3IgKGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIHZhciBhID0gdmFsdWVbaV07XG4gICAgICBpZiAoYSA9PT0gXCJlXCIpIHtcbiAgICAgICAgbmliYmxlcyArPSB2YWx1ZVsrK2ldID09PSBcIi1cIiA/IFwiY1wiIDogXCJiXCI7XG4gICAgICB9IGVsc2UgaWYgKGEgPT09IFwiLlwiKSB7XG4gICAgICAgIG5pYmJsZXMgKz0gXCJhXCI7XG4gICAgICB9IGVsc2UgaWYgKGEgPT09IFwiLVwiKSB7XG4gICAgICAgIG5pYmJsZXMgKz0gXCJlXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuaWJibGVzICs9IGE7XG4gICAgICB9XG4gICAgfVxuICAgIG5pYmJsZXMgKz0gbmliYmxlcy5sZW5ndGggJiAxID8gXCJmXCIgOiBcImZmXCI7XG4gICAgdmFyIG91dCA9IFszMF07XG4gICAgZm9yIChpID0gMCwgaWkgPSBuaWJibGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIG91dC5wdXNoKHBhcnNlSW50KG5pYmJsZXMuc3Vic3RyaW5nKGksIGkgKyAyKSwgMTYpKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGVuY29kZUludGVnZXIodmFsdWUpIHtcbiAgICB2YXIgY29kZTtcbiAgICBpZiAodmFsdWUgPj0gLTEwNyAmJiB2YWx1ZSA8PSAxMDcpIHtcbiAgICAgIGNvZGUgPSBbdmFsdWUgKyAxMzldO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgLSAxMDg7XG4gICAgICBjb2RlID0gWyh2YWx1ZSA+PiA4KSArIDI0NywgdmFsdWUgJiAweGZmXTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0xMTMxICYmIHZhbHVlIDw9IC0xMDgpIHtcbiAgICAgIHZhbHVlID0gLXZhbHVlIC0gMTA4O1xuICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNTEsIHZhbHVlICYgMHhmZl07XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAtMzI3NjggJiYgdmFsdWUgPD0gMzI3NjcpIHtcbiAgICAgIGNvZGUgPSBbMHgxYywgKHZhbHVlID4+IDgpICYgMHhmZiwgdmFsdWUgJiAweGZmXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9IFtcbiAgICAgICAgMHgxZCxcbiAgICAgICAgKHZhbHVlID4+IDI0KSAmIDB4ZmYsXG4gICAgICAgICh2YWx1ZSA+PiAxNikgJiAweGZmLFxuICAgICAgICAodmFsdWUgPj4gOCkgJiAweGZmLFxuICAgICAgICB2YWx1ZSAmIDB4ZmYsXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIGNvbXBpbGVIZWFkZXIoaGVhZGVyKSB7XG4gICAgcmV0dXJuIFtoZWFkZXIubWFqb3IsIGhlYWRlci5taW5vciwgaGVhZGVyLmhkclNpemUsIGhlYWRlci5vZmZTaXplXTtcbiAgfVxuXG4gIGNvbXBpbGVOYW1lSW5kZXgobmFtZXMpIHtcbiAgICB2YXIgbmFtZUluZGV4ID0gbmV3IENGRkluZGV4KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIC8vIE9UUyBkb2Vzbid0IGFsbG93IG5hbWVzIHRvIGJlIG92ZXIgMTI3IGNoYXJhY3RlcnMuXG4gICAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7XG4gICAgICB2YXIgc2FuaXRpemVkTmFtZSA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7IGorKykge1xuICAgICAgICAvLyBPVFMgcmVxdWlyZXMgY2hhcnMgdG8gYmUgYmV0d2VlbiBhIHJhbmdlIGFuZCBub3QgY2VydGFpbiBvdGhlclxuICAgICAgICAvLyBjaGFycy5cbiAgICAgICAgdmFyIGNoYXIgPSBuYW1lW2pdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hhciA8IFwiIVwiIHx8XG4gICAgICAgICAgY2hhciA+IFwiflwiIHx8XG4gICAgICAgICAgY2hhciA9PT0gXCJbXCIgfHxcbiAgICAgICAgICBjaGFyID09PSBcIl1cIiB8fFxuICAgICAgICAgIGNoYXIgPT09IFwiKFwiIHx8XG4gICAgICAgICAgY2hhciA9PT0gXCIpXCIgfHxcbiAgICAgICAgICBjaGFyID09PSBcIntcIiB8fFxuICAgICAgICAgIGNoYXIgPT09IFwifVwiIHx8XG4gICAgICAgICAgY2hhciA9PT0gXCI8XCIgfHxcbiAgICAgICAgICBjaGFyID09PSBcIj5cIiB8fFxuICAgICAgICAgIGNoYXIgPT09IFwiL1wiIHx8XG4gICAgICAgICAgY2hhciA9PT0gXCIlXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY2hhciA9IFwiX1wiO1xuICAgICAgICB9XG4gICAgICAgIHNhbml0aXplZE5hbWVbal0gPSBjaGFyO1xuICAgICAgfVxuICAgICAgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplZE5hbWUuam9pbihcIlwiKTtcblxuICAgICAgaWYgKHNhbml0aXplZE5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgc2FuaXRpemVkTmFtZSA9IFwiQmFkX0ZvbnRfTmFtZVwiO1xuICAgICAgfVxuICAgICAgbmFtZUluZGV4LmFkZChzdHJpbmdUb0J5dGVzKHNhbml0aXplZE5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KG5hbWVJbmRleCk7XG4gIH1cblxuICBjb21waWxlVG9wRGljdHMoZGljdHMsIGxlbmd0aCwgcmVtb3ZlQ2lkS2V5cykge1xuICAgIHZhciBmb250RGljdFRyYWNrZXJzID0gW107XG4gICAgdmFyIGZkQXJyYXlJbmRleCA9IG5ldyBDRkZJbmRleCgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIHZhciBmb250RGljdCA9IGRpY3RzW2ldO1xuICAgICAgaWYgKHJlbW92ZUNpZEtleXMpIHtcbiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKFwiQ0lERm9udFZlcnNpb25cIik7XG4gICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZShcIkNJREZvbnRSZXZpc2lvblwiKTtcbiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKFwiQ0lERm9udFR5cGVcIik7XG4gICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZShcIkNJRENvdW50XCIpO1xuICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoXCJVSURCYXNlXCIpO1xuICAgICAgfVxuICAgICAgdmFyIGZvbnREaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7XG4gICAgICB2YXIgZm9udERpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChmb250RGljdCwgZm9udERpY3RUcmFja2VyKTtcbiAgICAgIGZvbnREaWN0VHJhY2tlcnMucHVzaChmb250RGljdFRyYWNrZXIpO1xuICAgICAgZmRBcnJheUluZGV4LmFkZChmb250RGljdERhdGEpO1xuICAgICAgZm9udERpY3RUcmFja2VyLm9mZnNldChsZW5ndGgpO1xuICAgIH1cbiAgICBmZEFycmF5SW5kZXggPSB0aGlzLmNvbXBpbGVJbmRleChmZEFycmF5SW5kZXgsIGZvbnREaWN0VHJhY2tlcnMpO1xuICAgIHJldHVybiB7XG4gICAgICB0cmFja2VyczogZm9udERpY3RUcmFja2VycyxcbiAgICAgIG91dHB1dDogZmRBcnJheUluZGV4LFxuICAgIH07XG4gIH1cblxuICBjb21waWxlUHJpdmF0ZURpY3RzKGRpY3RzLCB0cmFja2Vycywgb3V0cHV0KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGljdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgdmFyIGZvbnREaWN0ID0gZGljdHNbaV07XG4gICAgICB2YXIgcHJpdmF0ZURpY3QgPSBmb250RGljdC5wcml2YXRlRGljdDtcbiAgICAgIGlmICghcHJpdmF0ZURpY3QgfHwgIWZvbnREaWN0Lmhhc05hbWUoXCJQcml2YXRlXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlRoZXJlIG11c3QgYmUgYSBwcml2YXRlIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgfVxuICAgICAgdmFyIHByaXZhdGVEaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7XG4gICAgICB2YXIgcHJpdmF0ZURpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChwcml2YXRlRGljdCwgcHJpdmF0ZURpY3RUcmFja2VyKTtcblxuICAgICAgdmFyIG91dHB1dExlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG4gICAgICBwcml2YXRlRGljdFRyYWNrZXIub2Zmc2V0KG91dHB1dExlbmd0aCk7XG4gICAgICBpZiAoIXByaXZhdGVEaWN0RGF0YS5sZW5ndGgpIHtcbiAgICAgICAgLy8gVGhlIHByaXZhdGUgZGljdGlvbmFyeSB3YXMgZW1wdHksIHNldCB0aGUgb3V0cHV0IGxlbmd0aCB0byB6ZXJvIHRvXG4gICAgICAgIC8vIGVuc3VyZSB0aGUgb2Zmc2V0IGxlbmd0aCBpc24ndCBvdXQgb2YgYm91bmRzIGluIHRoZSBleWVzIG9mIHRoZVxuICAgICAgICAvLyBzYW5pdGl6ZXIuXG4gICAgICAgIG91dHB1dExlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRyYWNrZXJzW2ldLnNldEVudHJ5TG9jYXRpb24oXG4gICAgICAgIFwiUHJpdmF0ZVwiLFxuICAgICAgICBbcHJpdmF0ZURpY3REYXRhLmxlbmd0aCwgb3V0cHV0TGVuZ3RoXSxcbiAgICAgICAgb3V0cHV0XG4gICAgICApO1xuICAgICAgb3V0cHV0LmFkZChwcml2YXRlRGljdERhdGEpO1xuXG4gICAgICBpZiAocHJpdmF0ZURpY3Quc3VicnNJbmRleCAmJiBwcml2YXRlRGljdC5oYXNOYW1lKFwiU3VicnNcIikpIHtcbiAgICAgICAgdmFyIHN1YnJzID0gdGhpcy5jb21waWxlSW5kZXgocHJpdmF0ZURpY3Quc3VicnNJbmRleCk7XG4gICAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKFxuICAgICAgICAgIFwiU3VicnNcIixcbiAgICAgICAgICBbcHJpdmF0ZURpY3REYXRhLmxlbmd0aF0sXG4gICAgICAgICAgb3V0cHV0XG4gICAgICAgICk7XG4gICAgICAgIG91dHB1dC5hZGQoc3VicnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbXBpbGVEaWN0KGRpY3QsIG9mZnNldFRyYWNrZXIpIHtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgLy8gVGhlIGRpY3Rpb25hcnkga2V5cyBtdXN0IGJlIGluIGEgY2VydGFpbiBvcmRlci5cbiAgICB2YXIgb3JkZXIgPSBkaWN0Lm9yZGVyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBvcmRlcltpXTtcbiAgICAgIGlmICghKGtleSBpbiBkaWN0LnZhbHVlcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWVzID0gZGljdC52YWx1ZXNba2V5XTtcbiAgICAgIHZhciB0eXBlcyA9IGRpY3QudHlwZXNba2V5XTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlcykpIHtcbiAgICAgICAgdHlwZXMgPSBbdHlwZXNdO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBhbnkgZW1wdHkgZGljdCB2YWx1ZXMuXG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gdHlwZXMubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2pdO1xuICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbal07XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJudW1cIjpcbiAgICAgICAgICBjYXNlIFwic2lkXCI6XG4gICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwib2Zmc2V0XCI6XG4gICAgICAgICAgICAvLyBGb3Igb2Zmc2V0cyB3ZSBqdXN0IGluc2VydCBhIDMyYml0IGludGVnZXIgc28gd2UgZG9uJ3QgaGF2ZSB0b1xuICAgICAgICAgICAgLy8gZGVhbCB3aXRoIGZpZ3VyaW5nIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBvZmZzZXQgd2hlbiBpdCBnZXRzXG4gICAgICAgICAgICAvLyByZXBsYWNlZCBsYXRlciBvbiBieSB0aGUgY29tcGlsZXIuXG4gICAgICAgICAgICB2YXIgbmFtZSA9IGRpY3Qua2V5VG9OYW1lTWFwW2tleV07XG4gICAgICAgICAgICAvLyBTb21lIG9mZnNldHMgaGF2ZSB0aGUgb2Zmc2V0IGFuZCB0aGUgbGVuZ3RoLCBzbyBqdXN0IHJlY29yZCB0aGVcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvbmUuXG4gICAgICAgICAgICBpZiAoIW9mZnNldFRyYWNrZXIuaXNUcmFja2luZyhuYW1lKSkge1xuICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLnRyYWNrKG5hbWUsIG91dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdChbMHgxZCwgMCwgMCwgMCwgMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgY2FzZSBcImRlbHRhXCI6XG4gICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMSwga2sgPSB2YWx1ZXMubGVuZ3RoOyBrIDwga2s7ICsraykge1xuICAgICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlc1trXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgb2YgJHt0eXBlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvdXQgPSBvdXQuY29uY2F0KGRpY3Qub3Bjb2Rlc1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGNvbXBpbGVTdHJpbmdJbmRleChzdHJpbmdzKSB7XG4gICAgdmFyIHN0cmluZ0luZGV4ID0gbmV3IENGRkluZGV4KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3RyaW5ncy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICBzdHJpbmdJbmRleC5hZGQoc3RyaW5nVG9CeXRlcyhzdHJpbmdzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChzdHJpbmdJbmRleCk7XG4gIH1cblxuICBjb21waWxlR2xvYmFsU3VickluZGV4KCkge1xuICAgIHZhciBnbG9iYWxTdWJySW5kZXggPSB0aGlzLmNmZi5nbG9iYWxTdWJySW5kZXg7XG4gICAgdGhpcy5vdXQud3JpdGVCeXRlQXJyYXkodGhpcy5jb21waWxlSW5kZXgoZ2xvYmFsU3VickluZGV4KSk7XG4gIH1cblxuICBjb21waWxlQ2hhclN0cmluZ3MoY2hhclN0cmluZ3MpIHtcbiAgICB2YXIgY2hhclN0cmluZ3NJbmRleCA9IG5ldyBDRkZJbmRleCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhclN0cmluZ3MuY291bnQ7IGkrKykge1xuICAgICAgdmFyIGdseXBoID0gY2hhclN0cmluZ3MuZ2V0KGkpO1xuICAgICAgLy8gSWYgdGhlIENoYXJTdHJpbmcgb3V0bGluZSBpcyBlbXB0eSwgcmVwbGFjZSBpdCB3aXRoIC5ub3RkZWYgdG9cbiAgICAgIC8vIHByZXZlbnQgT1RTIGZyb20gcmVqZWN0aW5nIHRoZSBmb250IChmaXhlcyBidWcxMjUyNDIwLnBkZikuXG4gICAgICBpZiAoZ2x5cGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKG5ldyBVaW50OEFycmF5KFsweDhiLCAweDBlXSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KGNoYXJTdHJpbmdzSW5kZXgpO1xuICB9XG5cbiAgY29tcGlsZUNoYXJzZXQoY2hhcnNldCwgbnVtR2x5cGhzLCBzdHJpbmdzLCBpc0NJREZvbnQpIHtcbiAgICAvLyBGcmVldHlwZSByZXF1aXJlcyB0aGUgbnVtYmVyIG9mIGNoYXJzZXQgc3RyaW5ncyBiZSBjb3JyZWN0IGFuZCBNYWNPU1xuICAgIC8vIHJlcXVpcmVzIGEgdmFsaWQgbWFwcGluZyBmb3IgcHJpbnRpbmcuXG4gICAgbGV0IG91dDtcbiAgICBjb25zdCBudW1HbHlwaHNMZXNzTm90RGVmID0gbnVtR2x5cGhzIC0gMTtcbiAgICBpZiAoaXNDSURGb250KSB7XG4gICAgICAvLyBJbiBhIENJRCBmb250LCB0aGUgY2hhcnNldCBpcyBhIG1hcHBpbmcgb2YgQ0lEcyBub3QgU0lEcyBzbyBqdXN0XG4gICAgICAvLyBjcmVhdGUgYW4gaWRlbnRpdHkgbWFwcGluZy5cbiAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgMiwgLy8gZm9ybWF0XG4gICAgICAgIDAsIC8vIGZpcnN0IENJRCB1cHBlciBieXRlXG4gICAgICAgIDAsIC8vIGZpcnN0IENJRCBsb3dlciBieXRlXG4gICAgICAgIChudW1HbHlwaHNMZXNzTm90RGVmID4+IDgpICYgMHhmZixcbiAgICAgICAgbnVtR2x5cGhzTGVzc05vdERlZiAmIDB4ZmYsXG4gICAgICBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGVuZ3RoID0gMSArIG51bUdseXBoc0xlc3NOb3REZWYgKiAyO1xuICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICAgIG91dFswXSA9IDA7IC8vIGZvcm1hdCAwXG4gICAgICBsZXQgY2hhcnNldEluZGV4ID0gMDtcbiAgICAgIGNvbnN0IG51bUNoYXJzZXRzID0gY2hhcnNldC5jaGFyc2V0Lmxlbmd0aDtcbiAgICAgIGxldCB3YXJuZWQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGxldCBzaWQgPSAwO1xuICAgICAgICBpZiAoY2hhcnNldEluZGV4IDwgbnVtQ2hhcnNldHMpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gY2hhcnNldC5jaGFyc2V0W2NoYXJzZXRJbmRleCsrXTtcbiAgICAgICAgICBzaWQgPSBzdHJpbmdzLmdldFNJRChuYW1lKTtcbiAgICAgICAgICBpZiAoc2lkID09PSAtMSkge1xuICAgICAgICAgICAgc2lkID0gMDtcbiAgICAgICAgICAgIGlmICghd2FybmVkKSB7XG4gICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgIHdhcm4oYENvdWxkbid0IGZpbmQgJHtuYW1lfSBpbiBDRkYgc3RyaW5nc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRbaV0gPSAoc2lkID4+IDgpICYgMHhmZjtcbiAgICAgICAgb3V0W2kgKyAxXSA9IHNpZCAmIDB4ZmY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KG91dCk7XG4gIH1cblxuICBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShlbmNvZGluZy5yYXcpO1xuICB9XG5cbiAgY29tcGlsZUZEU2VsZWN0KGZkU2VsZWN0KSB7XG4gICAgY29uc3QgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0O1xuICAgIGxldCBvdXQsIGk7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoMSArIGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aCk7XG4gICAgICAgIG91dFswXSA9IGZvcm1hdDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb3V0W2kgKyAxXSA9IGZkU2VsZWN0LmZkU2VsZWN0W2ldO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBjb25zdCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTtcbiAgICAgICAgY29uc3QgcmFuZ2VzID0gW1xuICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAwLCAvLyBuUmFuZ2VzIHBsYWNlIGhvbGRlclxuICAgICAgICAgIDAsIC8vIG5SYW5nZXMgcGxhY2UgaG9sZGVyXG4gICAgICAgICAgKHN0YXJ0ID4+IDgpICYgMHhmZixcbiAgICAgICAgICBzdGFydCAmIDB4ZmYsXG4gICAgICAgICAgbGFzdEZELFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFtpXTtcbiAgICAgICAgICBpZiAoY3VycmVudEZEICE9PSBsYXN0RkQpIHtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKChpID4+IDgpICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7XG4gICAgICAgICAgICBsYXN0RkQgPSBjdXJyZW50RkQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDMgYnl0ZXMgYXJlIHB1c2hlZCBmb3IgZXZlcnkgcmFuZ2UgYW5kIHRoZXJlIGFyZSAzIGhlYWRlciBieXRlcy5cbiAgICAgICAgY29uc3QgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7XG4gICAgICAgIHJhbmdlc1sxXSA9IChudW1SYW5nZXMgPj4gOCkgJiAweGZmO1xuICAgICAgICByYW5nZXNbMl0gPSBudW1SYW5nZXMgJiAweGZmO1xuICAgICAgICAvLyBzZW50aW5lbFxuICAgICAgICByYW5nZXMucHVzaCgoaSA+PiA4KSAmIDB4ZmYsIGkgJiAweGZmKTtcbiAgICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkocmFuZ2VzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KG91dCk7XG4gIH1cblxuICBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgb3V0W2ldID0gZGF0YVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGNvbXBpbGVJbmRleChpbmRleCwgdHJhY2tlcnMgPSBbXSkge1xuICAgIHZhciBvYmplY3RzID0gaW5kZXgub2JqZWN0cztcbiAgICAvLyBGaXJzdCAyIGJ5dGVzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBjb250YWluZWQgaW50byB0aGlzIGluZGV4XG4gICAgdmFyIGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBvYmplY3QsIGp1c3QgY3JlYXRlIGFuIGluZGV4LiBUaGlzIHRlY2huaWNhbGx5XG4gICAgLy8gc2hvdWxkIGp1c3QgYmUgWzAsIDBdIGJ1dCBPVFMgaGFzIGFuIGlzc3VlIHdpdGggdGhhdC5cbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBbMCwgMCwgMF07XG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSBbKGNvdW50ID4+IDgpICYgMHhmZiwgY291bnQgJiAweGZmXTtcblxuICAgIHZhciBsYXN0T2Zmc2V0ID0gMSxcbiAgICAgIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgIGxhc3RPZmZzZXQgKz0gb2JqZWN0c1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldFNpemU7XG4gICAgaWYgKGxhc3RPZmZzZXQgPCAweDEwMCkge1xuICAgICAgb2Zmc2V0U2l6ZSA9IDE7XG4gICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMCkge1xuICAgICAgb2Zmc2V0U2l6ZSA9IDI7XG4gICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMDAwKSB7XG4gICAgICBvZmZzZXRTaXplID0gMztcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0U2l6ZSA9IDQ7XG4gICAgfVxuXG4gICAgLy8gTmV4dCBieXRlIGNvbnRhaW5zIHRoZSBvZmZzZXQgc2l6ZSB1c2UgdG8gcmVmZXJlbmNlIG9iamVjdCBpbiB0aGUgZmlsZVxuICAgIGRhdGEucHVzaChvZmZzZXRTaXplKTtcblxuICAgIC8vIEFkZCBhbm90aGVyIG9mZnNldCBhZnRlciB0aGlzIG9uZSBiZWNhdXNlIHdlIG5lZWQgYSBuZXcgb2Zmc2V0XG4gICAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gMTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgKyAxOyBpKyspIHtcbiAgICAgIGlmIChvZmZzZXRTaXplID09PSAxKSB7XG4gICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpO1xuICAgICAgfSBlbHNlIGlmIChvZmZzZXRTaXplID09PSAyKSB7XG4gICAgICAgIGRhdGEucHVzaCgocmVsYXRpdmVPZmZzZXQgPj4gOCkgJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpO1xuICAgICAgfSBlbHNlIGlmIChvZmZzZXRTaXplID09PSAzKSB7XG4gICAgICAgIGRhdGEucHVzaChcbiAgICAgICAgICAocmVsYXRpdmVPZmZzZXQgPj4gMTYpICYgMHhmZixcbiAgICAgICAgICAocmVsYXRpdmVPZmZzZXQgPj4gOCkgJiAweGZmLFxuICAgICAgICAgIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5wdXNoKFxuICAgICAgICAgIChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQpICYgMHhmZixcbiAgICAgICAgICAocmVsYXRpdmVPZmZzZXQgPj4gMTYpICYgMHhmZixcbiAgICAgICAgICAocmVsYXRpdmVPZmZzZXQgPj4gOCkgJiAweGZmLFxuICAgICAgICAgIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAob2JqZWN0c1tpXSkge1xuICAgICAgICByZWxhdGl2ZU9mZnNldCArPSBvYmplY3RzW2ldLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgLy8gTm90aWZ5IHRoZSB0cmFja2VyIHdoZXJlIHRoZSBvYmplY3Qgd2lsbCBiZSBvZmZzZXQgaW4gdGhlIGRhdGEuXG4gICAgICBpZiAodHJhY2tlcnNbaV0pIHtcbiAgICAgICAgdHJhY2tlcnNbaV0ub2Zmc2V0KGRhdGEubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IG9iamVjdHNbaV0ubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBkYXRhLnB1c2gob2JqZWN0c1tpXVtqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIENGRlN0YW5kYXJkU3RyaW5ncyxcbiAgQ0ZGUGFyc2VyLFxuICBDRkYsXG4gIENGRkhlYWRlcixcbiAgQ0ZGU3RyaW5ncyxcbiAgQ0ZGSW5kZXgsXG4gIENGRkNoYXJzZXQsXG4gIENGRlRvcERpY3QsXG4gIENGRlByaXZhdGVEaWN0LFxuICBDRkZDb21waWxlcixcbiAgQ0ZGRkRTZWxlY3QsXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IElTT0Fkb2JlQ2hhcnNldCA9IFtcbiAgXCIubm90ZGVmXCIsIFwic3BhY2VcIiwgXCJleGNsYW1cIiwgXCJxdW90ZWRibFwiLCBcIm51bWJlcnNpZ25cIiwgXCJkb2xsYXJcIixcbiAgXCJwZXJjZW50XCIsIFwiYW1wZXJzYW5kXCIsIFwicXVvdGVyaWdodFwiLCBcInBhcmVubGVmdFwiLCBcInBhcmVucmlnaHRcIixcbiAgXCJhc3Rlcmlza1wiLCBcInBsdXNcIiwgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcInNsYXNoXCIsIFwiemVyb1wiLFxuICBcIm9uZVwiLCBcInR3b1wiLCBcInRocmVlXCIsIFwiZm91clwiLCBcImZpdmVcIiwgXCJzaXhcIiwgXCJzZXZlblwiLCBcImVpZ2h0XCIsXG4gIFwibmluZVwiLCBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsIFwibGVzc1wiLCBcImVxdWFsXCIsIFwiZ3JlYXRlclwiLCBcInF1ZXN0aW9uXCIsXG4gIFwiYXRcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIiwgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsXG4gIFwiTlwiLCBcIk9cIiwgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIiwgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLFxuICBcImJyYWNrZXRsZWZ0XCIsIFwiYmFja3NsYXNoXCIsIFwiYnJhY2tldHJpZ2h0XCIsIFwiYXNjaWljaXJjdW1cIiwgXCJ1bmRlcnNjb3JlXCIsXG4gIFwicXVvdGVsZWZ0XCIsIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiwgXCJmXCIsIFwiZ1wiLCBcImhcIiwgXCJpXCIsIFwialwiLCBcImtcIiwgXCJsXCIsXG4gIFwibVwiLCBcIm5cIiwgXCJvXCIsIFwicFwiLCBcInFcIiwgXCJyXCIsIFwic1wiLCBcInRcIiwgXCJ1XCIsIFwidlwiLCBcIndcIiwgXCJ4XCIsIFwieVwiLCBcInpcIixcbiAgXCJicmFjZWxlZnRcIiwgXCJiYXJcIiwgXCJicmFjZXJpZ2h0XCIsIFwiYXNjaWl0aWxkZVwiLCBcImV4Y2xhbWRvd25cIiwgXCJjZW50XCIsXG4gIFwic3RlcmxpbmdcIiwgXCJmcmFjdGlvblwiLCBcInllblwiLCBcImZsb3JpblwiLCBcInNlY3Rpb25cIiwgXCJjdXJyZW5jeVwiLFxuICBcInF1b3Rlc2luZ2xlXCIsIFwicXVvdGVkYmxsZWZ0XCIsIFwiZ3VpbGxlbW90bGVmdFwiLCBcImd1aWxzaW5nbGxlZnRcIixcbiAgXCJndWlsc2luZ2xyaWdodFwiLCBcImZpXCIsIFwiZmxcIiwgXCJlbmRhc2hcIiwgXCJkYWdnZXJcIiwgXCJkYWdnZXJkYmxcIixcbiAgXCJwZXJpb2RjZW50ZXJlZFwiLCBcInBhcmFncmFwaFwiLCBcImJ1bGxldFwiLCBcInF1b3Rlc2luZ2xiYXNlXCIsXG4gIFwicXVvdGVkYmxiYXNlXCIsIFwicXVvdGVkYmxyaWdodFwiLCBcImd1aWxsZW1vdHJpZ2h0XCIsIFwiZWxsaXBzaXNcIixcbiAgXCJwZXJ0aG91c2FuZFwiLCBcInF1ZXN0aW9uZG93blwiLCBcImdyYXZlXCIsIFwiYWN1dGVcIiwgXCJjaXJjdW1mbGV4XCIsIFwidGlsZGVcIixcbiAgXCJtYWNyb25cIiwgXCJicmV2ZVwiLCBcImRvdGFjY2VudFwiLCBcImRpZXJlc2lzXCIsIFwicmluZ1wiLCBcImNlZGlsbGFcIixcbiAgXCJodW5nYXJ1bWxhdXRcIiwgXCJvZ29uZWtcIiwgXCJjYXJvblwiLCBcImVtZGFzaFwiLCBcIkFFXCIsIFwib3JkZmVtaW5pbmVcIixcbiAgXCJMc2xhc2hcIiwgXCJPc2xhc2hcIiwgXCJPRVwiLCBcIm9yZG1hc2N1bGluZVwiLCBcImFlXCIsIFwiZG90bGVzc2lcIiwgXCJsc2xhc2hcIixcbiAgXCJvc2xhc2hcIiwgXCJvZVwiLCBcImdlcm1hbmRibHNcIiwgXCJvbmVzdXBlcmlvclwiLCBcImxvZ2ljYWxub3RcIiwgXCJtdVwiLFxuICBcInRyYWRlbWFya1wiLCBcIkV0aFwiLCBcIm9uZWhhbGZcIiwgXCJwbHVzbWludXNcIiwgXCJUaG9yblwiLCBcIm9uZXF1YXJ0ZXJcIixcbiAgXCJkaXZpZGVcIiwgXCJicm9rZW5iYXJcIiwgXCJkZWdyZWVcIiwgXCJ0aG9yblwiLCBcInRocmVlcXVhcnRlcnNcIiwgXCJ0d29zdXBlcmlvclwiLFxuICBcInJlZ2lzdGVyZWRcIiwgXCJtaW51c1wiLCBcImV0aFwiLCBcIm11bHRpcGx5XCIsIFwidGhyZWVzdXBlcmlvclwiLCBcImNvcHlyaWdodFwiLFxuICBcIkFhY3V0ZVwiLCBcIkFjaXJjdW1mbGV4XCIsIFwiQWRpZXJlc2lzXCIsIFwiQWdyYXZlXCIsIFwiQXJpbmdcIiwgXCJBdGlsZGVcIixcbiAgXCJDY2VkaWxsYVwiLCBcIkVhY3V0ZVwiLCBcIkVjaXJjdW1mbGV4XCIsIFwiRWRpZXJlc2lzXCIsIFwiRWdyYXZlXCIsIFwiSWFjdXRlXCIsXG4gIFwiSWNpcmN1bWZsZXhcIiwgXCJJZGllcmVzaXNcIiwgXCJJZ3JhdmVcIiwgXCJOdGlsZGVcIiwgXCJPYWN1dGVcIiwgXCJPY2lyY3VtZmxleFwiLFxuICBcIk9kaWVyZXNpc1wiLCBcIk9ncmF2ZVwiLCBcIk90aWxkZVwiLCBcIlNjYXJvblwiLCBcIlVhY3V0ZVwiLCBcIlVjaXJjdW1mbGV4XCIsXG4gIFwiVWRpZXJlc2lzXCIsIFwiVWdyYXZlXCIsIFwiWWFjdXRlXCIsIFwiWWRpZXJlc2lzXCIsIFwiWmNhcm9uXCIsIFwiYWFjdXRlXCIsXG4gIFwiYWNpcmN1bWZsZXhcIiwgXCJhZGllcmVzaXNcIiwgXCJhZ3JhdmVcIiwgXCJhcmluZ1wiLCBcImF0aWxkZVwiLCBcImNjZWRpbGxhXCIsXG4gIFwiZWFjdXRlXCIsIFwiZWNpcmN1bWZsZXhcIiwgXCJlZGllcmVzaXNcIiwgXCJlZ3JhdmVcIiwgXCJpYWN1dGVcIiwgXCJpY2lyY3VtZmxleFwiLFxuICBcImlkaWVyZXNpc1wiLCBcImlncmF2ZVwiLCBcIm50aWxkZVwiLCBcIm9hY3V0ZVwiLCBcIm9jaXJjdW1mbGV4XCIsIFwib2RpZXJlc2lzXCIsXG4gIFwib2dyYXZlXCIsIFwib3RpbGRlXCIsIFwic2Nhcm9uXCIsIFwidWFjdXRlXCIsIFwidWNpcmN1bWZsZXhcIiwgXCJ1ZGllcmVzaXNcIixcbiAgXCJ1Z3JhdmVcIiwgXCJ5YWN1dGVcIiwgXCJ5ZGllcmVzaXNcIiwgXCJ6Y2Fyb25cIlxuXTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBFeHBlcnRDaGFyc2V0ID0gW1xuICBcIi5ub3RkZWZcIiwgXCJzcGFjZVwiLCBcImV4Y2xhbXNtYWxsXCIsIFwiSHVuZ2FydW1sYXV0c21hbGxcIiwgXCJkb2xsYXJvbGRzdHlsZVwiLFxuICBcImRvbGxhcnN1cGVyaW9yXCIsIFwiYW1wZXJzYW5kc21hbGxcIiwgXCJBY3V0ZXNtYWxsXCIsIFwicGFyZW5sZWZ0c3VwZXJpb3JcIixcbiAgXCJwYXJlbnJpZ2h0c3VwZXJpb3JcIiwgXCJ0d29kb3RlbmxlYWRlclwiLCBcIm9uZWRvdGVubGVhZGVyXCIsIFwiY29tbWFcIixcbiAgXCJoeXBoZW5cIiwgXCJwZXJpb2RcIiwgXCJmcmFjdGlvblwiLCBcInplcm9vbGRzdHlsZVwiLCBcIm9uZW9sZHN0eWxlXCIsXG4gIFwidHdvb2xkc3R5bGVcIiwgXCJ0aHJlZW9sZHN0eWxlXCIsIFwiZm91cm9sZHN0eWxlXCIsIFwiZml2ZW9sZHN0eWxlXCIsXG4gIFwic2l4b2xkc3R5bGVcIiwgXCJzZXZlbm9sZHN0eWxlXCIsIFwiZWlnaHRvbGRzdHlsZVwiLCBcIm5pbmVvbGRzdHlsZVwiLFxuICBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsIFwiY29tbWFzdXBlcmlvclwiLCBcInRocmVlcXVhcnRlcnNlbWRhc2hcIixcbiAgXCJwZXJpb2RzdXBlcmlvclwiLCBcInF1ZXN0aW9uc21hbGxcIiwgXCJhc3VwZXJpb3JcIiwgXCJic3VwZXJpb3JcIixcbiAgXCJjZW50c3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIiwgXCJlc3VwZXJpb3JcIiwgXCJpc3VwZXJpb3JcIiwgXCJsc3VwZXJpb3JcIixcbiAgXCJtc3VwZXJpb3JcIiwgXCJuc3VwZXJpb3JcIiwgXCJvc3VwZXJpb3JcIiwgXCJyc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIixcbiAgXCJ0c3VwZXJpb3JcIiwgXCJmZlwiLCBcImZpXCIsIFwiZmxcIiwgXCJmZmlcIiwgXCJmZmxcIiwgXCJwYXJlbmxlZnRpbmZlcmlvclwiLFxuICBcInBhcmVucmlnaHRpbmZlcmlvclwiLCBcIkNpcmN1bWZsZXhzbWFsbFwiLCBcImh5cGhlbnN1cGVyaW9yXCIsIFwiR3JhdmVzbWFsbFwiLFxuICBcIkFzbWFsbFwiLCBcIkJzbWFsbFwiLCBcIkNzbWFsbFwiLCBcIkRzbWFsbFwiLCBcIkVzbWFsbFwiLCBcIkZzbWFsbFwiLCBcIkdzbWFsbFwiLFxuICBcIkhzbWFsbFwiLCBcIklzbWFsbFwiLCBcIkpzbWFsbFwiLCBcIktzbWFsbFwiLCBcIkxzbWFsbFwiLCBcIk1zbWFsbFwiLCBcIk5zbWFsbFwiLFxuICBcIk9zbWFsbFwiLCBcIlBzbWFsbFwiLCBcIlFzbWFsbFwiLCBcIlJzbWFsbFwiLCBcIlNzbWFsbFwiLCBcIlRzbWFsbFwiLCBcIlVzbWFsbFwiLFxuICBcIlZzbWFsbFwiLCBcIldzbWFsbFwiLCBcIlhzbWFsbFwiLCBcIllzbWFsbFwiLCBcIlpzbWFsbFwiLCBcImNvbG9ubW9uZXRhcnlcIixcbiAgXCJvbmVmaXR0ZWRcIiwgXCJydXBpYWhcIiwgXCJUaWxkZXNtYWxsXCIsIFwiZXhjbGFtZG93bnNtYWxsXCIsIFwiY2VudG9sZHN0eWxlXCIsXG4gIFwiTHNsYXNoc21hbGxcIiwgXCJTY2Fyb25zbWFsbFwiLCBcIlpjYXJvbnNtYWxsXCIsIFwiRGllcmVzaXNzbWFsbFwiLFxuICBcIkJyZXZlc21hbGxcIiwgXCJDYXJvbnNtYWxsXCIsIFwiRG90YWNjZW50c21hbGxcIiwgXCJNYWNyb25zbWFsbFwiLFxuICBcImZpZ3VyZWRhc2hcIiwgXCJoeXBoZW5pbmZlcmlvclwiLCBcIk9nb25la3NtYWxsXCIsIFwiUmluZ3NtYWxsXCIsXG4gIFwiQ2VkaWxsYXNtYWxsXCIsIFwib25lcXVhcnRlclwiLCBcIm9uZWhhbGZcIiwgXCJ0aHJlZXF1YXJ0ZXJzXCIsXG4gIFwicXVlc3Rpb25kb3duc21hbGxcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLFxuICBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiemVyb3N1cGVyaW9yXCIsIFwib25lc3VwZXJpb3JcIixcbiAgXCJ0d29zdXBlcmlvclwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIixcbiAgXCJzaXhzdXBlcmlvclwiLCBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsIFwibmluZXN1cGVyaW9yXCIsXG4gIFwiemVyb2luZmVyaW9yXCIsIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLCBcInRocmVlaW5mZXJpb3JcIixcbiAgXCJmb3VyaW5mZXJpb3JcIiwgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIixcbiAgXCJlaWdodGluZmVyaW9yXCIsIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsIFwiZG9sbGFyaW5mZXJpb3JcIixcbiAgXCJwZXJpb2RpbmZlcmlvclwiLCBcImNvbW1haW5mZXJpb3JcIiwgXCJBZ3JhdmVzbWFsbFwiLCBcIkFhY3V0ZXNtYWxsXCIsXG4gIFwiQWNpcmN1bWZsZXhzbWFsbFwiLCBcIkF0aWxkZXNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIiwgXCJBcmluZ3NtYWxsXCIsXG4gIFwiQUVzbWFsbFwiLCBcIkNjZWRpbGxhc21hbGxcIiwgXCJFZ3JhdmVzbWFsbFwiLCBcIkVhY3V0ZXNtYWxsXCIsXG4gIFwiRWNpcmN1bWZsZXhzbWFsbFwiLCBcIkVkaWVyZXNpc3NtYWxsXCIsIFwiSWdyYXZlc21hbGxcIiwgXCJJYWN1dGVzbWFsbFwiLFxuICBcIkljaXJjdW1mbGV4c21hbGxcIiwgXCJJZGllcmVzaXNzbWFsbFwiLCBcIkV0aHNtYWxsXCIsIFwiTnRpbGRlc21hbGxcIixcbiAgXCJPZ3JhdmVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsIFwiT2NpcmN1bWZsZXhzbWFsbFwiLCBcIk90aWxkZXNtYWxsXCIsXG4gIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPRXNtYWxsXCIsIFwiT3NsYXNoc21hbGxcIiwgXCJVZ3JhdmVzbWFsbFwiLCBcIlVhY3V0ZXNtYWxsXCIsXG4gIFwiVWNpcmN1bWZsZXhzbWFsbFwiLCBcIlVkaWVyZXNpc3NtYWxsXCIsIFwiWWFjdXRlc21hbGxcIiwgXCJUaG9ybnNtYWxsXCIsXG4gIFwiWWRpZXJlc2lzc21hbGxcIlxuXTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBFeHBlcnRTdWJzZXRDaGFyc2V0ID0gW1xuICBcIi5ub3RkZWZcIiwgXCJzcGFjZVwiLCBcImRvbGxhcm9sZHN0eWxlXCIsIFwiZG9sbGFyc3VwZXJpb3JcIixcbiAgXCJwYXJlbmxlZnRzdXBlcmlvclwiLCBcInBhcmVucmlnaHRzdXBlcmlvclwiLCBcInR3b2RvdGVubGVhZGVyXCIsXG4gIFwib25lZG90ZW5sZWFkZXJcIiwgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcImZyYWN0aW9uXCIsXG4gIFwiemVyb29sZHN0eWxlXCIsIFwib25lb2xkc3R5bGVcIiwgXCJ0d29vbGRzdHlsZVwiLCBcInRocmVlb2xkc3R5bGVcIixcbiAgXCJmb3Vyb2xkc3R5bGVcIiwgXCJmaXZlb2xkc3R5bGVcIiwgXCJzaXhvbGRzdHlsZVwiLCBcInNldmVub2xkc3R5bGVcIixcbiAgXCJlaWdodG9sZHN0eWxlXCIsIFwibmluZW9sZHN0eWxlXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIiwgXCJjb21tYXN1cGVyaW9yXCIsXG4gIFwidGhyZWVxdWFydGVyc2VtZGFzaFwiLCBcInBlcmlvZHN1cGVyaW9yXCIsIFwiYXN1cGVyaW9yXCIsIFwiYnN1cGVyaW9yXCIsXG4gIFwiY2VudHN1cGVyaW9yXCIsIFwiZHN1cGVyaW9yXCIsIFwiZXN1cGVyaW9yXCIsIFwiaXN1cGVyaW9yXCIsIFwibHN1cGVyaW9yXCIsXG4gIFwibXN1cGVyaW9yXCIsIFwibnN1cGVyaW9yXCIsIFwib3N1cGVyaW9yXCIsIFwicnN1cGVyaW9yXCIsIFwic3N1cGVyaW9yXCIsXG4gIFwidHN1cGVyaW9yXCIsIFwiZmZcIiwgXCJmaVwiLCBcImZsXCIsIFwiZmZpXCIsIFwiZmZsXCIsIFwicGFyZW5sZWZ0aW5mZXJpb3JcIixcbiAgXCJwYXJlbnJpZ2h0aW5mZXJpb3JcIiwgXCJoeXBoZW5zdXBlcmlvclwiLCBcImNvbG9ubW9uZXRhcnlcIiwgXCJvbmVmaXR0ZWRcIixcbiAgXCJydXBpYWhcIiwgXCJjZW50b2xkc3R5bGVcIiwgXCJmaWd1cmVkYXNoXCIsIFwiaHlwaGVuaW5mZXJpb3JcIiwgXCJvbmVxdWFydGVyXCIsXG4gIFwib25laGFsZlwiLCBcInRocmVlcXVhcnRlcnNcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLFxuICBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiemVyb3N1cGVyaW9yXCIsIFwib25lc3VwZXJpb3JcIixcbiAgXCJ0d29zdXBlcmlvclwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIixcbiAgXCJzaXhzdXBlcmlvclwiLCBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsIFwibmluZXN1cGVyaW9yXCIsXG4gIFwiemVyb2luZmVyaW9yXCIsIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLCBcInRocmVlaW5mZXJpb3JcIixcbiAgXCJmb3VyaW5mZXJpb3JcIiwgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIixcbiAgXCJlaWdodGluZmVyaW9yXCIsIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsIFwiZG9sbGFyaW5mZXJpb3JcIixcbiAgXCJwZXJpb2RpbmZlcmlvclwiLCBcImNvbW1haW5mZXJpb3JcIlxuXTtcblxuZXhwb3J0IHsgSVNPQWRvYmVDaGFyc2V0LCBFeHBlcnRDaGFyc2V0LCBFeHBlcnRTdWJzZXRDaGFyc2V0IH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBFeHBlcnRFbmNvZGluZyA9IFtcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJzcGFjZVwiLCBcImV4Y2xhbXNtYWxsXCIsIFwiSHVuZ2FydW1sYXV0c21hbGxcIiwgXCJcIiwgXCJkb2xsYXJvbGRzdHlsZVwiLFxuICBcImRvbGxhcnN1cGVyaW9yXCIsIFwiYW1wZXJzYW5kc21hbGxcIiwgXCJBY3V0ZXNtYWxsXCIsIFwicGFyZW5sZWZ0c3VwZXJpb3JcIixcbiAgXCJwYXJlbnJpZ2h0c3VwZXJpb3JcIiwgXCJ0d29kb3RlbmxlYWRlclwiLCBcIm9uZWRvdGVubGVhZGVyXCIsIFwiY29tbWFcIixcbiAgXCJoeXBoZW5cIiwgXCJwZXJpb2RcIiwgXCJmcmFjdGlvblwiLCBcInplcm9vbGRzdHlsZVwiLCBcIm9uZW9sZHN0eWxlXCIsXG4gIFwidHdvb2xkc3R5bGVcIiwgXCJ0aHJlZW9sZHN0eWxlXCIsIFwiZm91cm9sZHN0eWxlXCIsIFwiZml2ZW9sZHN0eWxlXCIsXG4gIFwic2l4b2xkc3R5bGVcIiwgXCJzZXZlbm9sZHN0eWxlXCIsIFwiZWlnaHRvbGRzdHlsZVwiLCBcIm5pbmVvbGRzdHlsZVwiLCBcImNvbG9uXCIsXG4gIFwic2VtaWNvbG9uXCIsIFwiY29tbWFzdXBlcmlvclwiLCBcInRocmVlcXVhcnRlcnNlbWRhc2hcIiwgXCJwZXJpb2RzdXBlcmlvclwiLFxuICBcInF1ZXN0aW9uc21hbGxcIiwgXCJcIiwgXCJhc3VwZXJpb3JcIiwgXCJic3VwZXJpb3JcIiwgXCJjZW50c3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIixcbiAgXCJlc3VwZXJpb3JcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJpc3VwZXJpb3JcIiwgXCJcIiwgXCJcIiwgXCJsc3VwZXJpb3JcIiwgXCJtc3VwZXJpb3JcIixcbiAgXCJuc3VwZXJpb3JcIiwgXCJvc3VwZXJpb3JcIiwgXCJcIiwgXCJcIiwgXCJyc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIiwgXCJ0c3VwZXJpb3JcIixcbiAgXCJcIiwgXCJmZlwiLCBcImZpXCIsIFwiZmxcIiwgXCJmZmlcIiwgXCJmZmxcIiwgXCJwYXJlbmxlZnRpbmZlcmlvclwiLCBcIlwiLFxuICBcInBhcmVucmlnaHRpbmZlcmlvclwiLCBcIkNpcmN1bWZsZXhzbWFsbFwiLCBcImh5cGhlbnN1cGVyaW9yXCIsIFwiR3JhdmVzbWFsbFwiLFxuICBcIkFzbWFsbFwiLCBcIkJzbWFsbFwiLCBcIkNzbWFsbFwiLCBcIkRzbWFsbFwiLCBcIkVzbWFsbFwiLCBcIkZzbWFsbFwiLCBcIkdzbWFsbFwiLFxuICBcIkhzbWFsbFwiLCBcIklzbWFsbFwiLCBcIkpzbWFsbFwiLCBcIktzbWFsbFwiLCBcIkxzbWFsbFwiLCBcIk1zbWFsbFwiLCBcIk5zbWFsbFwiLFxuICBcIk9zbWFsbFwiLCBcIlBzbWFsbFwiLCBcIlFzbWFsbFwiLCBcIlJzbWFsbFwiLCBcIlNzbWFsbFwiLCBcIlRzbWFsbFwiLCBcIlVzbWFsbFwiLFxuICBcIlZzbWFsbFwiLCBcIldzbWFsbFwiLCBcIlhzbWFsbFwiLCBcIllzbWFsbFwiLCBcIlpzbWFsbFwiLCBcImNvbG9ubW9uZXRhcnlcIixcbiAgXCJvbmVmaXR0ZWRcIiwgXCJydXBpYWhcIiwgXCJUaWxkZXNtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiZXhjbGFtZG93bnNtYWxsXCIsIFwiY2VudG9sZHN0eWxlXCIsIFwiTHNsYXNoc21hbGxcIixcbiAgXCJcIiwgXCJcIiwgXCJTY2Fyb25zbWFsbFwiLCBcIlpjYXJvbnNtYWxsXCIsIFwiRGllcmVzaXNzbWFsbFwiLCBcIkJyZXZlc21hbGxcIixcbiAgXCJDYXJvbnNtYWxsXCIsIFwiXCIsIFwiRG90YWNjZW50c21hbGxcIiwgXCJcIiwgXCJcIiwgXCJNYWNyb25zbWFsbFwiLCBcIlwiLCBcIlwiLFxuICBcImZpZ3VyZWRhc2hcIiwgXCJoeXBoZW5pbmZlcmlvclwiLCBcIlwiLCBcIlwiLCBcIk9nb25la3NtYWxsXCIsIFwiUmluZ3NtYWxsXCIsXG4gIFwiQ2VkaWxsYXNtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwib25lcXVhcnRlclwiLCBcIm9uZWhhbGZcIiwgXCJ0aHJlZXF1YXJ0ZXJzXCIsXG4gIFwicXVlc3Rpb25kb3duc21hbGxcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLFxuICBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiXCIsIFwiXCIsIFwiemVyb3N1cGVyaW9yXCIsXG4gIFwib25lc3VwZXJpb3JcIiwgXCJ0d29zdXBlcmlvclwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIixcbiAgXCJmaXZlc3VwZXJpb3JcIiwgXCJzaXhzdXBlcmlvclwiLCBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsXG4gIFwibmluZXN1cGVyaW9yXCIsIFwiemVyb2luZmVyaW9yXCIsIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLFxuICBcInRocmVlaW5mZXJpb3JcIiwgXCJmb3VyaW5mZXJpb3JcIiwgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLFxuICBcInNldmVuaW5mZXJpb3JcIiwgXCJlaWdodGluZmVyaW9yXCIsIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsXG4gIFwiZG9sbGFyaW5mZXJpb3JcIiwgXCJwZXJpb2RpbmZlcmlvclwiLCBcImNvbW1haW5mZXJpb3JcIiwgXCJBZ3JhdmVzbWFsbFwiLFxuICBcIkFhY3V0ZXNtYWxsXCIsIFwiQWNpcmN1bWZsZXhzbWFsbFwiLCBcIkF0aWxkZXNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIixcbiAgXCJBcmluZ3NtYWxsXCIsIFwiQUVzbWFsbFwiLCBcIkNjZWRpbGxhc21hbGxcIiwgXCJFZ3JhdmVzbWFsbFwiLCBcIkVhY3V0ZXNtYWxsXCIsXG4gIFwiRWNpcmN1bWZsZXhzbWFsbFwiLCBcIkVkaWVyZXNpc3NtYWxsXCIsIFwiSWdyYXZlc21hbGxcIiwgXCJJYWN1dGVzbWFsbFwiLFxuICBcIkljaXJjdW1mbGV4c21hbGxcIiwgXCJJZGllcmVzaXNzbWFsbFwiLCBcIkV0aHNtYWxsXCIsIFwiTnRpbGRlc21hbGxcIixcbiAgXCJPZ3JhdmVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsIFwiT2NpcmN1bWZsZXhzbWFsbFwiLCBcIk90aWxkZXNtYWxsXCIsXG4gIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPRXNtYWxsXCIsIFwiT3NsYXNoc21hbGxcIiwgXCJVZ3JhdmVzbWFsbFwiLCBcIlVhY3V0ZXNtYWxsXCIsXG4gIFwiVWNpcmN1bWZsZXhzbWFsbFwiLCBcIlVkaWVyZXNpc3NtYWxsXCIsIFwiWWFjdXRlc21hbGxcIiwgXCJUaG9ybnNtYWxsXCIsXG4gIFwiWWRpZXJlc2lzc21hbGxcIl07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgTWFjRXhwZXJ0RW5jb2RpbmcgPSBbXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwic3BhY2VcIiwgXCJleGNsYW1zbWFsbFwiLCBcIkh1bmdhcnVtbGF1dHNtYWxsXCIsIFwiY2VudG9sZHN0eWxlXCIsXG4gIFwiZG9sbGFyb2xkc3R5bGVcIiwgXCJkb2xsYXJzdXBlcmlvclwiLCBcImFtcGVyc2FuZHNtYWxsXCIsIFwiQWN1dGVzbWFsbFwiLFxuICBcInBhcmVubGVmdHN1cGVyaW9yXCIsIFwicGFyZW5yaWdodHN1cGVyaW9yXCIsIFwidHdvZG90ZW5sZWFkZXJcIixcbiAgXCJvbmVkb3RlbmxlYWRlclwiLCBcImNvbW1hXCIsIFwiaHlwaGVuXCIsIFwicGVyaW9kXCIsIFwiZnJhY3Rpb25cIiwgXCJ6ZXJvb2xkc3R5bGVcIixcbiAgXCJvbmVvbGRzdHlsZVwiLCBcInR3b29sZHN0eWxlXCIsIFwidGhyZWVvbGRzdHlsZVwiLCBcImZvdXJvbGRzdHlsZVwiLFxuICBcImZpdmVvbGRzdHlsZVwiLCBcInNpeG9sZHN0eWxlXCIsIFwic2V2ZW5vbGRzdHlsZVwiLCBcImVpZ2h0b2xkc3R5bGVcIixcbiAgXCJuaW5lb2xkc3R5bGVcIiwgXCJjb2xvblwiLCBcInNlbWljb2xvblwiLCBcIlwiLCBcInRocmVlcXVhcnRlcnNlbWRhc2hcIiwgXCJcIixcbiAgXCJxdWVzdGlvbnNtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiRXRoc21hbGxcIiwgXCJcIiwgXCJcIiwgXCJvbmVxdWFydGVyXCIsXG4gIFwib25laGFsZlwiLCBcInRocmVlcXVhcnRlcnNcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLFxuICBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiZmZcIixcbiAgXCJmaVwiLCBcImZsXCIsIFwiZmZpXCIsIFwiZmZsXCIsIFwicGFyZW5sZWZ0aW5mZXJpb3JcIiwgXCJcIiwgXCJwYXJlbnJpZ2h0aW5mZXJpb3JcIixcbiAgXCJDaXJjdW1mbGV4c21hbGxcIiwgXCJoeXBoZW5pbmZlcmlvclwiLCBcIkdyYXZlc21hbGxcIiwgXCJBc21hbGxcIiwgXCJCc21hbGxcIixcbiAgXCJDc21hbGxcIiwgXCJEc21hbGxcIiwgXCJFc21hbGxcIiwgXCJGc21hbGxcIiwgXCJHc21hbGxcIiwgXCJIc21hbGxcIiwgXCJJc21hbGxcIixcbiAgXCJKc21hbGxcIiwgXCJLc21hbGxcIiwgXCJMc21hbGxcIiwgXCJNc21hbGxcIiwgXCJOc21hbGxcIiwgXCJPc21hbGxcIiwgXCJQc21hbGxcIixcbiAgXCJRc21hbGxcIiwgXCJSc21hbGxcIiwgXCJTc21hbGxcIiwgXCJUc21hbGxcIiwgXCJVc21hbGxcIiwgXCJWc21hbGxcIiwgXCJXc21hbGxcIixcbiAgXCJYc21hbGxcIiwgXCJZc21hbGxcIiwgXCJac21hbGxcIiwgXCJjb2xvbm1vbmV0YXJ5XCIsIFwib25lZml0dGVkXCIsIFwicnVwaWFoXCIsXG4gIFwiVGlsZGVzbWFsbFwiLCBcIlwiLCBcIlwiLCBcImFzdXBlcmlvclwiLCBcImNlbnRzdXBlcmlvclwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIkFhY3V0ZXNtYWxsXCIsIFwiQWdyYXZlc21hbGxcIiwgXCJBY2lyY3VtZmxleHNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIixcbiAgXCJBdGlsZGVzbWFsbFwiLCBcIkFyaW5nc21hbGxcIiwgXCJDY2VkaWxsYXNtYWxsXCIsIFwiRWFjdXRlc21hbGxcIiwgXCJFZ3JhdmVzbWFsbFwiLFxuICBcIkVjaXJjdW1mbGV4c21hbGxcIiwgXCJFZGllcmVzaXNzbWFsbFwiLCBcIklhY3V0ZXNtYWxsXCIsIFwiSWdyYXZlc21hbGxcIixcbiAgXCJJY2lyY3VtZmxleHNtYWxsXCIsIFwiSWRpZXJlc2lzc21hbGxcIiwgXCJOdGlsZGVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsXG4gIFwiT2dyYXZlc21hbGxcIiwgXCJPY2lyY3VtZmxleHNtYWxsXCIsIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPdGlsZGVzbWFsbFwiLFxuICBcIlVhY3V0ZXNtYWxsXCIsIFwiVWdyYXZlc21hbGxcIiwgXCJVY2lyY3VtZmxleHNtYWxsXCIsIFwiVWRpZXJlc2lzc21hbGxcIiwgXCJcIixcbiAgXCJlaWdodHN1cGVyaW9yXCIsIFwiZm91cmluZmVyaW9yXCIsIFwidGhyZWVpbmZlcmlvclwiLCBcInNpeGluZmVyaW9yXCIsXG4gIFwiZWlnaHRpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIiwgXCJTY2Fyb25zbWFsbFwiLCBcIlwiLCBcImNlbnRpbmZlcmlvclwiLFxuICBcInR3b2luZmVyaW9yXCIsIFwiXCIsIFwiRGllcmVzaXNzbWFsbFwiLCBcIlwiLCBcIkNhcm9uc21hbGxcIiwgXCJvc3VwZXJpb3JcIixcbiAgXCJmaXZlaW5mZXJpb3JcIiwgXCJcIiwgXCJjb21tYWluZmVyaW9yXCIsIFwicGVyaW9kaW5mZXJpb3JcIiwgXCJZYWN1dGVzbWFsbFwiLCBcIlwiLFxuICBcImRvbGxhcmluZmVyaW9yXCIsIFwiXCIsIFwiXCIsIFwiVGhvcm5zbWFsbFwiLCBcIlwiLCBcIm5pbmVpbmZlcmlvclwiLCBcInplcm9pbmZlcmlvclwiLFxuICBcIlpjYXJvbnNtYWxsXCIsIFwiQUVzbWFsbFwiLCBcIk9zbGFzaHNtYWxsXCIsIFwicXVlc3Rpb25kb3duc21hbGxcIixcbiAgXCJvbmVpbmZlcmlvclwiLCBcIkxzbGFzaHNtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiQ2VkaWxsYXNtYWxsXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiT0VzbWFsbFwiLCBcImZpZ3VyZWRhc2hcIiwgXCJoeXBoZW5zdXBlcmlvclwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcImV4Y2xhbWRvd25zbWFsbFwiLCBcIlwiLCBcIllkaWVyZXNpc3NtYWxsXCIsIFwiXCIsIFwib25lc3VwZXJpb3JcIiwgXCJ0d29zdXBlcmlvclwiLFxuICBcInRocmVlc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIiwgXCJzaXhzdXBlcmlvclwiLFxuICBcInNldmVuc3VwZXJpb3JcIiwgXCJuaW5lc3VwZXJpb3JcIiwgXCJ6ZXJvc3VwZXJpb3JcIiwgXCJcIiwgXCJlc3VwZXJpb3JcIixcbiAgXCJyc3VwZXJpb3JcIiwgXCJ0c3VwZXJpb3JcIiwgXCJcIiwgXCJcIiwgXCJpc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJsc3VwZXJpb3JcIiwgXCJPZ29uZWtzbWFsbFwiLCBcIkJyZXZlc21hbGxcIixcbiAgXCJNYWNyb25zbWFsbFwiLCBcImJzdXBlcmlvclwiLCBcIm5zdXBlcmlvclwiLCBcIm1zdXBlcmlvclwiLCBcImNvbW1hc3VwZXJpb3JcIixcbiAgXCJwZXJpb2RzdXBlcmlvclwiLCBcIkRvdGFjY2VudHNtYWxsXCIsIFwiUmluZ3NtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCJdO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IE1hY1JvbWFuRW5jb2RpbmcgPSBbXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwic3BhY2VcIiwgXCJleGNsYW1cIiwgXCJxdW90ZWRibFwiLCBcIm51bWJlcnNpZ25cIiwgXCJkb2xsYXJcIiwgXCJwZXJjZW50XCIsXG4gIFwiYW1wZXJzYW5kXCIsIFwicXVvdGVzaW5nbGVcIiwgXCJwYXJlbmxlZnRcIiwgXCJwYXJlbnJpZ2h0XCIsIFwiYXN0ZXJpc2tcIiwgXCJwbHVzXCIsXG4gIFwiY29tbWFcIiwgXCJoeXBoZW5cIiwgXCJwZXJpb2RcIiwgXCJzbGFzaFwiLCBcInplcm9cIiwgXCJvbmVcIiwgXCJ0d29cIiwgXCJ0aHJlZVwiLFxuICBcImZvdXJcIiwgXCJmaXZlXCIsIFwic2l4XCIsIFwic2V2ZW5cIiwgXCJlaWdodFwiLCBcIm5pbmVcIiwgXCJjb2xvblwiLCBcInNlbWljb2xvblwiLFxuICBcImxlc3NcIiwgXCJlcXVhbFwiLCBcImdyZWF0ZXJcIiwgXCJxdWVzdGlvblwiLCBcImF0XCIsIFwiQVwiLCBcIkJcIiwgXCJDXCIsIFwiRFwiLCBcIkVcIiwgXCJGXCIsXG4gIFwiR1wiLCBcIkhcIiwgXCJJXCIsIFwiSlwiLCBcIktcIiwgXCJMXCIsIFwiTVwiLCBcIk5cIiwgXCJPXCIsIFwiUFwiLCBcIlFcIiwgXCJSXCIsIFwiU1wiLCBcIlRcIiwgXCJVXCIsXG4gIFwiVlwiLCBcIldcIiwgXCJYXCIsIFwiWVwiLCBcIlpcIiwgXCJicmFja2V0bGVmdFwiLCBcImJhY2tzbGFzaFwiLCBcImJyYWNrZXRyaWdodFwiLFxuICBcImFzY2lpY2lyY3VtXCIsIFwidW5kZXJzY29yZVwiLCBcImdyYXZlXCIsIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiwgXCJmXCIsIFwiZ1wiLFxuICBcImhcIiwgXCJpXCIsIFwialwiLCBcImtcIiwgXCJsXCIsIFwibVwiLCBcIm5cIiwgXCJvXCIsIFwicFwiLCBcInFcIiwgXCJyXCIsIFwic1wiLCBcInRcIiwgXCJ1XCIsIFwidlwiLFxuICBcIndcIiwgXCJ4XCIsIFwieVwiLCBcInpcIiwgXCJicmFjZWxlZnRcIiwgXCJiYXJcIiwgXCJicmFjZXJpZ2h0XCIsIFwiYXNjaWl0aWxkZVwiLCBcIlwiLFxuICBcIkFkaWVyZXNpc1wiLCBcIkFyaW5nXCIsIFwiQ2NlZGlsbGFcIiwgXCJFYWN1dGVcIiwgXCJOdGlsZGVcIiwgXCJPZGllcmVzaXNcIixcbiAgXCJVZGllcmVzaXNcIiwgXCJhYWN1dGVcIiwgXCJhZ3JhdmVcIiwgXCJhY2lyY3VtZmxleFwiLCBcImFkaWVyZXNpc1wiLCBcImF0aWxkZVwiLFxuICBcImFyaW5nXCIsIFwiY2NlZGlsbGFcIiwgXCJlYWN1dGVcIiwgXCJlZ3JhdmVcIiwgXCJlY2lyY3VtZmxleFwiLCBcImVkaWVyZXNpc1wiLFxuICBcImlhY3V0ZVwiLCBcImlncmF2ZVwiLCBcImljaXJjdW1mbGV4XCIsIFwiaWRpZXJlc2lzXCIsIFwibnRpbGRlXCIsIFwib2FjdXRlXCIsXG4gIFwib2dyYXZlXCIsIFwib2NpcmN1bWZsZXhcIiwgXCJvZGllcmVzaXNcIiwgXCJvdGlsZGVcIiwgXCJ1YWN1dGVcIiwgXCJ1Z3JhdmVcIixcbiAgXCJ1Y2lyY3VtZmxleFwiLCBcInVkaWVyZXNpc1wiLCBcImRhZ2dlclwiLCBcImRlZ3JlZVwiLCBcImNlbnRcIiwgXCJzdGVybGluZ1wiLFxuICBcInNlY3Rpb25cIiwgXCJidWxsZXRcIiwgXCJwYXJhZ3JhcGhcIiwgXCJnZXJtYW5kYmxzXCIsIFwicmVnaXN0ZXJlZFwiLCBcImNvcHlyaWdodFwiLFxuICBcInRyYWRlbWFya1wiLCBcImFjdXRlXCIsIFwiZGllcmVzaXNcIiwgXCJub3RlcXVhbFwiLCBcIkFFXCIsIFwiT3NsYXNoXCIsIFwiaW5maW5pdHlcIixcbiAgXCJwbHVzbWludXNcIiwgXCJsZXNzZXF1YWxcIiwgXCJncmVhdGVyZXF1YWxcIiwgXCJ5ZW5cIiwgXCJtdVwiLCBcInBhcnRpYWxkaWZmXCIsXG4gIFwic3VtbWF0aW9uXCIsIFwicHJvZHVjdFwiLCBcInBpXCIsIFwiaW50ZWdyYWxcIiwgXCJvcmRmZW1pbmluZVwiLCBcIm9yZG1hc2N1bGluZVwiLFxuICBcIk9tZWdhXCIsIFwiYWVcIiwgXCJvc2xhc2hcIiwgXCJxdWVzdGlvbmRvd25cIiwgXCJleGNsYW1kb3duXCIsIFwibG9naWNhbG5vdFwiLFxuICBcInJhZGljYWxcIiwgXCJmbG9yaW5cIiwgXCJhcHByb3hlcXVhbFwiLCBcIkRlbHRhXCIsIFwiZ3VpbGxlbW90bGVmdFwiLFxuICBcImd1aWxsZW1vdHJpZ2h0XCIsIFwiZWxsaXBzaXNcIiwgXCJzcGFjZVwiLCBcIkFncmF2ZVwiLCBcIkF0aWxkZVwiLCBcIk90aWxkZVwiLCBcIk9FXCIsXG4gIFwib2VcIiwgXCJlbmRhc2hcIiwgXCJlbWRhc2hcIiwgXCJxdW90ZWRibGxlZnRcIiwgXCJxdW90ZWRibHJpZ2h0XCIsIFwicXVvdGVsZWZ0XCIsXG4gIFwicXVvdGVyaWdodFwiLCBcImRpdmlkZVwiLCBcImxvemVuZ2VcIiwgXCJ5ZGllcmVzaXNcIiwgXCJZZGllcmVzaXNcIiwgXCJmcmFjdGlvblwiLFxuICBcImN1cnJlbmN5XCIsIFwiZ3VpbHNpbmdsbGVmdFwiLCBcImd1aWxzaW5nbHJpZ2h0XCIsIFwiZmlcIiwgXCJmbFwiLCBcImRhZ2dlcmRibFwiLFxuICBcInBlcmlvZGNlbnRlcmVkXCIsIFwicXVvdGVzaW5nbGJhc2VcIiwgXCJxdW90ZWRibGJhc2VcIiwgXCJwZXJ0aG91c2FuZFwiLFxuICBcIkFjaXJjdW1mbGV4XCIsIFwiRWNpcmN1bWZsZXhcIiwgXCJBYWN1dGVcIiwgXCJFZGllcmVzaXNcIiwgXCJFZ3JhdmVcIiwgXCJJYWN1dGVcIixcbiAgXCJJY2lyY3VtZmxleFwiLCBcIklkaWVyZXNpc1wiLCBcIklncmF2ZVwiLCBcIk9hY3V0ZVwiLCBcIk9jaXJjdW1mbGV4XCIsIFwiYXBwbGVcIixcbiAgXCJPZ3JhdmVcIiwgXCJVYWN1dGVcIiwgXCJVY2lyY3VtZmxleFwiLCBcIlVncmF2ZVwiLCBcImRvdGxlc3NpXCIsIFwiY2lyY3VtZmxleFwiLFxuICBcInRpbGRlXCIsIFwibWFjcm9uXCIsIFwiYnJldmVcIiwgXCJkb3RhY2NlbnRcIiwgXCJyaW5nXCIsIFwiY2VkaWxsYVwiLCBcImh1bmdhcnVtbGF1dFwiLFxuICBcIm9nb25la1wiLCBcImNhcm9uXCJdO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFN0YW5kYXJkRW5jb2RpbmcgPSBbXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwic3BhY2VcIiwgXCJleGNsYW1cIiwgXCJxdW90ZWRibFwiLCBcIm51bWJlcnNpZ25cIiwgXCJkb2xsYXJcIiwgXCJwZXJjZW50XCIsXG4gIFwiYW1wZXJzYW5kXCIsIFwicXVvdGVyaWdodFwiLCBcInBhcmVubGVmdFwiLCBcInBhcmVucmlnaHRcIiwgXCJhc3Rlcmlza1wiLCBcInBsdXNcIixcbiAgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcInNsYXNoXCIsIFwiemVyb1wiLCBcIm9uZVwiLCBcInR3b1wiLCBcInRocmVlXCIsXG4gIFwiZm91clwiLCBcImZpdmVcIiwgXCJzaXhcIiwgXCJzZXZlblwiLCBcImVpZ2h0XCIsIFwibmluZVwiLCBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsXG4gIFwibGVzc1wiLCBcImVxdWFsXCIsIFwiZ3JlYXRlclwiLCBcInF1ZXN0aW9uXCIsIFwiYXRcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIixcbiAgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsIFwiTlwiLCBcIk9cIiwgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIixcbiAgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLCBcImJyYWNrZXRsZWZ0XCIsIFwiYmFja3NsYXNoXCIsIFwiYnJhY2tldHJpZ2h0XCIsXG4gIFwiYXNjaWljaXJjdW1cIiwgXCJ1bmRlcnNjb3JlXCIsIFwicXVvdGVsZWZ0XCIsIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiwgXCJmXCIsXG4gIFwiZ1wiLCBcImhcIiwgXCJpXCIsIFwialwiLCBcImtcIiwgXCJsXCIsIFwibVwiLCBcIm5cIiwgXCJvXCIsIFwicFwiLCBcInFcIiwgXCJyXCIsIFwic1wiLCBcInRcIiwgXCJ1XCIsXG4gIFwidlwiLCBcIndcIiwgXCJ4XCIsIFwieVwiLCBcInpcIiwgXCJicmFjZWxlZnRcIiwgXCJiYXJcIiwgXCJicmFjZXJpZ2h0XCIsIFwiYXNjaWl0aWxkZVwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcImV4Y2xhbWRvd25cIixcbiAgXCJjZW50XCIsIFwic3RlcmxpbmdcIiwgXCJmcmFjdGlvblwiLCBcInllblwiLCBcImZsb3JpblwiLCBcInNlY3Rpb25cIiwgXCJjdXJyZW5jeVwiLFxuICBcInF1b3Rlc2luZ2xlXCIsIFwicXVvdGVkYmxsZWZ0XCIsIFwiZ3VpbGxlbW90bGVmdFwiLCBcImd1aWxzaW5nbGxlZnRcIixcbiAgXCJndWlsc2luZ2xyaWdodFwiLCBcImZpXCIsIFwiZmxcIiwgXCJcIiwgXCJlbmRhc2hcIiwgXCJkYWdnZXJcIiwgXCJkYWdnZXJkYmxcIixcbiAgXCJwZXJpb2RjZW50ZXJlZFwiLCBcIlwiLCBcInBhcmFncmFwaFwiLCBcImJ1bGxldFwiLCBcInF1b3Rlc2luZ2xiYXNlXCIsXG4gIFwicXVvdGVkYmxiYXNlXCIsIFwicXVvdGVkYmxyaWdodFwiLCBcImd1aWxsZW1vdHJpZ2h0XCIsIFwiZWxsaXBzaXNcIixcbiAgXCJwZXJ0aG91c2FuZFwiLCBcIlwiLCBcInF1ZXN0aW9uZG93blwiLCBcIlwiLCBcImdyYXZlXCIsIFwiYWN1dGVcIiwgXCJjaXJjdW1mbGV4XCIsXG4gIFwidGlsZGVcIiwgXCJtYWNyb25cIiwgXCJicmV2ZVwiLCBcImRvdGFjY2VudFwiLCBcImRpZXJlc2lzXCIsIFwiXCIsIFwicmluZ1wiLCBcImNlZGlsbGFcIixcbiAgXCJcIiwgXCJodW5nYXJ1bWxhdXRcIiwgXCJvZ29uZWtcIiwgXCJjYXJvblwiLCBcImVtZGFzaFwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIkFFXCIsIFwiXCIsIFwib3JkZmVtaW5pbmVcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJMc2xhc2hcIiwgXCJPc2xhc2hcIiwgXCJPRVwiLCBcIm9yZG1hc2N1bGluZVwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcImFlXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiZG90bGVzc2lcIiwgXCJcIiwgXCJcIiwgXCJsc2xhc2hcIiwgXCJvc2xhc2hcIiwgXCJvZVwiLCBcImdlcm1hbmRibHNcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIl07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgV2luQW5zaUVuY29kaW5nID0gW1xuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcInNwYWNlXCIsIFwiZXhjbGFtXCIsIFwicXVvdGVkYmxcIiwgXCJudW1iZXJzaWduXCIsIFwiZG9sbGFyXCIsIFwicGVyY2VudFwiLFxuICBcImFtcGVyc2FuZFwiLCBcInF1b3Rlc2luZ2xlXCIsIFwicGFyZW5sZWZ0XCIsIFwicGFyZW5yaWdodFwiLCBcImFzdGVyaXNrXCIsIFwicGx1c1wiLFxuICBcImNvbW1hXCIsIFwiaHlwaGVuXCIsIFwicGVyaW9kXCIsIFwic2xhc2hcIiwgXCJ6ZXJvXCIsIFwib25lXCIsIFwidHdvXCIsIFwidGhyZWVcIixcbiAgXCJmb3VyXCIsIFwiZml2ZVwiLCBcInNpeFwiLCBcInNldmVuXCIsIFwiZWlnaHRcIiwgXCJuaW5lXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIixcbiAgXCJsZXNzXCIsIFwiZXF1YWxcIiwgXCJncmVhdGVyXCIsIFwicXVlc3Rpb25cIiwgXCJhdFwiLCBcIkFcIiwgXCJCXCIsIFwiQ1wiLCBcIkRcIiwgXCJFXCIsIFwiRlwiLFxuICBcIkdcIiwgXCJIXCIsIFwiSVwiLCBcIkpcIiwgXCJLXCIsIFwiTFwiLCBcIk1cIiwgXCJOXCIsIFwiT1wiLCBcIlBcIiwgXCJRXCIsIFwiUlwiLCBcIlNcIiwgXCJUXCIsIFwiVVwiLFxuICBcIlZcIiwgXCJXXCIsIFwiWFwiLCBcIllcIiwgXCJaXCIsIFwiYnJhY2tldGxlZnRcIiwgXCJiYWNrc2xhc2hcIiwgXCJicmFja2V0cmlnaHRcIixcbiAgXCJhc2NpaWNpcmN1bVwiLCBcInVuZGVyc2NvcmVcIiwgXCJncmF2ZVwiLCBcImFcIiwgXCJiXCIsIFwiY1wiLCBcImRcIiwgXCJlXCIsIFwiZlwiLCBcImdcIixcbiAgXCJoXCIsIFwiaVwiLCBcImpcIiwgXCJrXCIsIFwibFwiLCBcIm1cIiwgXCJuXCIsIFwib1wiLCBcInBcIiwgXCJxXCIsIFwiclwiLCBcInNcIiwgXCJ0XCIsIFwidVwiLCBcInZcIixcbiAgXCJ3XCIsIFwieFwiLCBcInlcIiwgXCJ6XCIsIFwiYnJhY2VsZWZ0XCIsIFwiYmFyXCIsIFwiYnJhY2VyaWdodFwiLCBcImFzY2lpdGlsZGVcIixcbiAgXCJidWxsZXRcIiwgXCJFdXJvXCIsIFwiYnVsbGV0XCIsIFwicXVvdGVzaW5nbGJhc2VcIiwgXCJmbG9yaW5cIiwgXCJxdW90ZWRibGJhc2VcIixcbiAgXCJlbGxpcHNpc1wiLCBcImRhZ2dlclwiLCBcImRhZ2dlcmRibFwiLCBcImNpcmN1bWZsZXhcIiwgXCJwZXJ0aG91c2FuZFwiLCBcIlNjYXJvblwiLFxuICBcImd1aWxzaW5nbGxlZnRcIiwgXCJPRVwiLCBcImJ1bGxldFwiLCBcIlpjYXJvblwiLCBcImJ1bGxldFwiLCBcImJ1bGxldFwiLCBcInF1b3RlbGVmdFwiLFxuICBcInF1b3RlcmlnaHRcIiwgXCJxdW90ZWRibGxlZnRcIiwgXCJxdW90ZWRibHJpZ2h0XCIsIFwiYnVsbGV0XCIsIFwiZW5kYXNoXCIsXG4gIFwiZW1kYXNoXCIsIFwidGlsZGVcIiwgXCJ0cmFkZW1hcmtcIiwgXCJzY2Fyb25cIiwgXCJndWlsc2luZ2xyaWdodFwiLCBcIm9lXCIsIFwiYnVsbGV0XCIsXG4gIFwiemNhcm9uXCIsIFwiWWRpZXJlc2lzXCIsIFwic3BhY2VcIiwgXCJleGNsYW1kb3duXCIsIFwiY2VudFwiLCBcInN0ZXJsaW5nXCIsXG4gIFwiY3VycmVuY3lcIiwgXCJ5ZW5cIiwgXCJicm9rZW5iYXJcIiwgXCJzZWN0aW9uXCIsIFwiZGllcmVzaXNcIiwgXCJjb3B5cmlnaHRcIixcbiAgXCJvcmRmZW1pbmluZVwiLCBcImd1aWxsZW1vdGxlZnRcIiwgXCJsb2dpY2Fsbm90XCIsIFwiaHlwaGVuXCIsIFwicmVnaXN0ZXJlZFwiLFxuICBcIm1hY3JvblwiLCBcImRlZ3JlZVwiLCBcInBsdXNtaW51c1wiLCBcInR3b3N1cGVyaW9yXCIsIFwidGhyZWVzdXBlcmlvclwiLCBcImFjdXRlXCIsXG4gIFwibXVcIiwgXCJwYXJhZ3JhcGhcIiwgXCJwZXJpb2RjZW50ZXJlZFwiLCBcImNlZGlsbGFcIiwgXCJvbmVzdXBlcmlvclwiLFxuICBcIm9yZG1hc2N1bGluZVwiLCBcImd1aWxsZW1vdHJpZ2h0XCIsIFwib25lcXVhcnRlclwiLCBcIm9uZWhhbGZcIiwgXCJ0aHJlZXF1YXJ0ZXJzXCIsXG4gIFwicXVlc3Rpb25kb3duXCIsIFwiQWdyYXZlXCIsIFwiQWFjdXRlXCIsIFwiQWNpcmN1bWZsZXhcIiwgXCJBdGlsZGVcIiwgXCJBZGllcmVzaXNcIixcbiAgXCJBcmluZ1wiLCBcIkFFXCIsIFwiQ2NlZGlsbGFcIiwgXCJFZ3JhdmVcIiwgXCJFYWN1dGVcIiwgXCJFY2lyY3VtZmxleFwiLCBcIkVkaWVyZXNpc1wiLFxuICBcIklncmF2ZVwiLCBcIklhY3V0ZVwiLCBcIkljaXJjdW1mbGV4XCIsIFwiSWRpZXJlc2lzXCIsIFwiRXRoXCIsIFwiTnRpbGRlXCIsIFwiT2dyYXZlXCIsXG4gIFwiT2FjdXRlXCIsIFwiT2NpcmN1bWZsZXhcIiwgXCJPdGlsZGVcIiwgXCJPZGllcmVzaXNcIiwgXCJtdWx0aXBseVwiLCBcIk9zbGFzaFwiLFxuICBcIlVncmF2ZVwiLCBcIlVhY3V0ZVwiLCBcIlVjaXJjdW1mbGV4XCIsIFwiVWRpZXJlc2lzXCIsIFwiWWFjdXRlXCIsIFwiVGhvcm5cIixcbiAgXCJnZXJtYW5kYmxzXCIsIFwiYWdyYXZlXCIsIFwiYWFjdXRlXCIsIFwiYWNpcmN1bWZsZXhcIiwgXCJhdGlsZGVcIiwgXCJhZGllcmVzaXNcIixcbiAgXCJhcmluZ1wiLCBcImFlXCIsIFwiY2NlZGlsbGFcIiwgXCJlZ3JhdmVcIiwgXCJlYWN1dGVcIiwgXCJlY2lyY3VtZmxleFwiLCBcImVkaWVyZXNpc1wiLFxuICBcImlncmF2ZVwiLCBcImlhY3V0ZVwiLCBcImljaXJjdW1mbGV4XCIsIFwiaWRpZXJlc2lzXCIsIFwiZXRoXCIsIFwibnRpbGRlXCIsIFwib2dyYXZlXCIsXG4gIFwib2FjdXRlXCIsIFwib2NpcmN1bWZsZXhcIiwgXCJvdGlsZGVcIiwgXCJvZGllcmVzaXNcIiwgXCJkaXZpZGVcIiwgXCJvc2xhc2hcIixcbiAgXCJ1Z3JhdmVcIiwgXCJ1YWN1dGVcIiwgXCJ1Y2lyY3VtZmxleFwiLCBcInVkaWVyZXNpc1wiLCBcInlhY3V0ZVwiLCBcInRob3JuXCIsXG4gIFwieWRpZXJlc2lzXCJdO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFN5bWJvbFNldEVuY29kaW5nID0gW1xuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcInNwYWNlXCIsIFwiZXhjbGFtXCIsIFwidW5pdmVyc2FsXCIsIFwibnVtYmVyc2lnblwiLCBcImV4aXN0ZW50aWFsXCIsIFwicGVyY2VudFwiLFxuICBcImFtcGVyc2FuZFwiLCBcInN1Y2h0aGF0XCIsIFwicGFyZW5sZWZ0XCIsIFwicGFyZW5yaWdodFwiLCBcImFzdGVyaXNrbWF0aFwiLCBcInBsdXNcIixcbiAgXCJjb21tYVwiLCBcIm1pbnVzXCIsIFwicGVyaW9kXCIsIFwic2xhc2hcIiwgXCJ6ZXJvXCIsIFwib25lXCIsIFwidHdvXCIsIFwidGhyZWVcIiwgXCJmb3VyXCIsXG4gIFwiZml2ZVwiLCBcInNpeFwiLCBcInNldmVuXCIsIFwiZWlnaHRcIiwgXCJuaW5lXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIiwgXCJsZXNzXCIsXG4gIFwiZXF1YWxcIiwgXCJncmVhdGVyXCIsIFwicXVlc3Rpb25cIiwgXCJjb25ncnVlbnRcIiwgXCJBbHBoYVwiLCBcIkJldGFcIiwgXCJDaGlcIixcbiAgXCJEZWx0YVwiLCBcIkVwc2lsb25cIiwgXCJQaGlcIiwgXCJHYW1tYVwiLCBcIkV0YVwiLCBcIklvdGFcIiwgXCJ0aGV0YTFcIiwgXCJLYXBwYVwiLFxuICBcIkxhbWJkYVwiLCBcIk11XCIsIFwiTnVcIiwgXCJPbWljcm9uXCIsIFwiUGlcIiwgXCJUaGV0YVwiLCBcIlJob1wiLCBcIlNpZ21hXCIsIFwiVGF1XCIsXG4gIFwiVXBzaWxvblwiLCBcInNpZ21hMVwiLCBcIk9tZWdhXCIsIFwiWGlcIiwgXCJQc2lcIiwgXCJaZXRhXCIsIFwiYnJhY2tldGxlZnRcIixcbiAgXCJ0aGVyZWZvcmVcIiwgXCJicmFja2V0cmlnaHRcIiwgXCJwZXJwZW5kaWN1bGFyXCIsIFwidW5kZXJzY29yZVwiLCBcInJhZGljYWxleFwiLFxuICBcImFscGhhXCIsIFwiYmV0YVwiLCBcImNoaVwiLCBcImRlbHRhXCIsIFwiZXBzaWxvblwiLCBcInBoaVwiLCBcImdhbW1hXCIsIFwiZXRhXCIsIFwiaW90YVwiLFxuICBcInBoaTFcIiwgXCJrYXBwYVwiLCBcImxhbWJkYVwiLCBcIm11XCIsIFwibnVcIiwgXCJvbWljcm9uXCIsIFwicGlcIiwgXCJ0aGV0YVwiLCBcInJob1wiLFxuICBcInNpZ21hXCIsIFwidGF1XCIsIFwidXBzaWxvblwiLCBcIm9tZWdhMVwiLCBcIm9tZWdhXCIsIFwieGlcIiwgXCJwc2lcIiwgXCJ6ZXRhXCIsXG4gIFwiYnJhY2VsZWZ0XCIsIFwiYmFyXCIsIFwiYnJhY2VyaWdodFwiLCBcInNpbWlsYXJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJFdXJvXCIsIFwiVXBzaWxvbjFcIiwgXCJtaW51dGVcIiwgXCJsZXNzZXF1YWxcIixcbiAgXCJmcmFjdGlvblwiLCBcImluZmluaXR5XCIsIFwiZmxvcmluXCIsIFwiY2x1YlwiLCBcImRpYW1vbmRcIiwgXCJoZWFydFwiLCBcInNwYWRlXCIsXG4gIFwiYXJyb3dib3RoXCIsIFwiYXJyb3dsZWZ0XCIsIFwiYXJyb3d1cFwiLCBcImFycm93cmlnaHRcIiwgXCJhcnJvd2Rvd25cIiwgXCJkZWdyZWVcIixcbiAgXCJwbHVzbWludXNcIiwgXCJzZWNvbmRcIiwgXCJncmVhdGVyZXF1YWxcIiwgXCJtdWx0aXBseVwiLCBcInByb3BvcnRpb25hbFwiLFxuICBcInBhcnRpYWxkaWZmXCIsIFwiYnVsbGV0XCIsIFwiZGl2aWRlXCIsIFwibm90ZXF1YWxcIiwgXCJlcXVpdmFsZW5jZVwiLFxuICBcImFwcHJveGVxdWFsXCIsIFwiZWxsaXBzaXNcIiwgXCJhcnJvd3ZlcnRleFwiLCBcImFycm93aG9yaXpleFwiLCBcImNhcnJpYWdlcmV0dXJuXCIsXG4gIFwiYWxlcGhcIiwgXCJJZnJha3R1clwiLCBcIlJmcmFrdHVyXCIsIFwid2VpZXJzdHJhc3NcIiwgXCJjaXJjbGVtdWx0aXBseVwiLFxuICBcImNpcmNsZXBsdXNcIiwgXCJlbXB0eXNldFwiLCBcImludGVyc2VjdGlvblwiLCBcInVuaW9uXCIsIFwicHJvcGVyc3VwZXJzZXRcIixcbiAgXCJyZWZsZXhzdXBlcnNldFwiLCBcIm5vdHN1YnNldFwiLCBcInByb3BlcnN1YnNldFwiLCBcInJlZmxleHN1YnNldFwiLCBcImVsZW1lbnRcIixcbiAgXCJub3RlbGVtZW50XCIsIFwiYW5nbGVcIiwgXCJncmFkaWVudFwiLCBcInJlZ2lzdGVyc2VyaWZcIiwgXCJjb3B5cmlnaHRzZXJpZlwiLFxuICBcInRyYWRlbWFya3NlcmlmXCIsIFwicHJvZHVjdFwiLCBcInJhZGljYWxcIiwgXCJkb3RtYXRoXCIsIFwibG9naWNhbG5vdFwiLFxuICBcImxvZ2ljYWxhbmRcIiwgXCJsb2dpY2Fsb3JcIiwgXCJhcnJvd2RibGJvdGhcIiwgXCJhcnJvd2RibGxlZnRcIiwgXCJhcnJvd2RibHVwXCIsXG4gIFwiYXJyb3dkYmxyaWdodFwiLCBcImFycm93ZGJsZG93blwiLCBcImxvemVuZ2VcIiwgXCJhbmdsZWxlZnRcIiwgXCJyZWdpc3RlcnNhbnNcIixcbiAgXCJjb3B5cmlnaHRzYW5zXCIsIFwidHJhZGVtYXJrc2Fuc1wiLCBcInN1bW1hdGlvblwiLCBcInBhcmVubGVmdHRwXCIsXG4gIFwicGFyZW5sZWZ0ZXhcIiwgXCJwYXJlbmxlZnRidFwiLCBcImJyYWNrZXRsZWZ0dHBcIiwgXCJicmFja2V0bGVmdGV4XCIsXG4gIFwiYnJhY2tldGxlZnRidFwiLCBcImJyYWNlbGVmdHRwXCIsIFwiYnJhY2VsZWZ0bWlkXCIsIFwiYnJhY2VsZWZ0YnRcIiwgXCJicmFjZWV4XCIsXG4gIFwiXCIsIFwiYW5nbGVyaWdodFwiLCBcImludGVncmFsXCIsIFwiaW50ZWdyYWx0cFwiLCBcImludGVncmFsZXhcIiwgXCJpbnRlZ3JhbGJ0XCIsXG4gIFwicGFyZW5yaWdodHRwXCIsIFwicGFyZW5yaWdodGV4XCIsIFwicGFyZW5yaWdodGJ0XCIsIFwiYnJhY2tldHJpZ2h0dHBcIixcbiAgXCJicmFja2V0cmlnaHRleFwiLCBcImJyYWNrZXRyaWdodGJ0XCIsIFwiYnJhY2VyaWdodHRwXCIsIFwiYnJhY2VyaWdodG1pZFwiLFxuICBcImJyYWNlcmlnaHRidFwiLCBcIlwiXTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBaYXBmRGluZ2JhdHNFbmNvZGluZyA9IFtcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJzcGFjZVwiLCBcImExXCIsIFwiYTJcIiwgXCJhMjAyXCIsIFwiYTNcIiwgXCJhNFwiLCBcImE1XCIsIFwiYTExOVwiLCBcImExMThcIiwgXCJhMTE3XCIsXG4gIFwiYTExXCIsIFwiYTEyXCIsIFwiYTEzXCIsIFwiYTE0XCIsIFwiYTE1XCIsIFwiYTE2XCIsIFwiYTEwNVwiLCBcImExN1wiLCBcImExOFwiLCBcImExOVwiLFxuICBcImEyMFwiLCBcImEyMVwiLCBcImEyMlwiLCBcImEyM1wiLCBcImEyNFwiLCBcImEyNVwiLCBcImEyNlwiLCBcImEyN1wiLCBcImEyOFwiLCBcImE2XCIsIFwiYTdcIixcbiAgXCJhOFwiLCBcImE5XCIsIFwiYTEwXCIsIFwiYTI5XCIsIFwiYTMwXCIsIFwiYTMxXCIsIFwiYTMyXCIsIFwiYTMzXCIsIFwiYTM0XCIsIFwiYTM1XCIsIFwiYTM2XCIsXG4gIFwiYTM3XCIsIFwiYTM4XCIsIFwiYTM5XCIsIFwiYTQwXCIsIFwiYTQxXCIsIFwiYTQyXCIsIFwiYTQzXCIsIFwiYTQ0XCIsIFwiYTQ1XCIsIFwiYTQ2XCIsXG4gIFwiYTQ3XCIsIFwiYTQ4XCIsIFwiYTQ5XCIsIFwiYTUwXCIsIFwiYTUxXCIsIFwiYTUyXCIsIFwiYTUzXCIsIFwiYTU0XCIsIFwiYTU1XCIsIFwiYTU2XCIsXG4gIFwiYTU3XCIsIFwiYTU4XCIsIFwiYTU5XCIsIFwiYTYwXCIsIFwiYTYxXCIsIFwiYTYyXCIsIFwiYTYzXCIsIFwiYTY0XCIsIFwiYTY1XCIsIFwiYTY2XCIsXG4gIFwiYTY3XCIsIFwiYTY4XCIsIFwiYTY5XCIsIFwiYTcwXCIsIFwiYTcxXCIsIFwiYTcyXCIsIFwiYTczXCIsIFwiYTc0XCIsIFwiYTIwM1wiLCBcImE3NVwiLFxuICBcImEyMDRcIiwgXCJhNzZcIiwgXCJhNzdcIiwgXCJhNzhcIiwgXCJhNzlcIiwgXCJhODFcIiwgXCJhODJcIiwgXCJhODNcIiwgXCJhODRcIiwgXCJhOTdcIixcbiAgXCJhOThcIiwgXCJhOTlcIiwgXCJhMTAwXCIsIFwiXCIsIFwiYTg5XCIsIFwiYTkwXCIsIFwiYTkzXCIsIFwiYTk0XCIsIFwiYTkxXCIsIFwiYTkyXCIsIFwiYTIwNVwiLFxuICBcImE4NVwiLCBcImEyMDZcIiwgXCJhODZcIiwgXCJhODdcIiwgXCJhODhcIiwgXCJhOTVcIiwgXCJhOTZcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJhMTAxXCIsIFwiYTEwMlwiLCBcImExMDNcIixcbiAgXCJhMTA0XCIsIFwiYTEwNlwiLCBcImExMDdcIiwgXCJhMTA4XCIsIFwiYTExMlwiLCBcImExMTFcIiwgXCJhMTEwXCIsIFwiYTEwOVwiLCBcImExMjBcIixcbiAgXCJhMTIxXCIsIFwiYTEyMlwiLCBcImExMjNcIiwgXCJhMTI0XCIsIFwiYTEyNVwiLCBcImExMjZcIiwgXCJhMTI3XCIsIFwiYTEyOFwiLCBcImExMjlcIixcbiAgXCJhMTMwXCIsIFwiYTEzMVwiLCBcImExMzJcIiwgXCJhMTMzXCIsIFwiYTEzNFwiLCBcImExMzVcIiwgXCJhMTM2XCIsIFwiYTEzN1wiLCBcImExMzhcIixcbiAgXCJhMTM5XCIsIFwiYTE0MFwiLCBcImExNDFcIiwgXCJhMTQyXCIsIFwiYTE0M1wiLCBcImExNDRcIiwgXCJhMTQ1XCIsIFwiYTE0NlwiLCBcImExNDdcIixcbiAgXCJhMTQ4XCIsIFwiYTE0OVwiLCBcImExNTBcIiwgXCJhMTUxXCIsIFwiYTE1MlwiLCBcImExNTNcIiwgXCJhMTU0XCIsIFwiYTE1NVwiLCBcImExNTZcIixcbiAgXCJhMTU3XCIsIFwiYTE1OFwiLCBcImExNTlcIiwgXCJhMTYwXCIsIFwiYTE2MVwiLCBcImExNjNcIiwgXCJhMTY0XCIsIFwiYTE5NlwiLCBcImExNjVcIixcbiAgXCJhMTkyXCIsIFwiYTE2NlwiLCBcImExNjdcIiwgXCJhMTY4XCIsIFwiYTE2OVwiLCBcImExNzBcIiwgXCJhMTcxXCIsIFwiYTE3MlwiLCBcImExNzNcIixcbiAgXCJhMTYyXCIsIFwiYTE3NFwiLCBcImExNzVcIiwgXCJhMTc2XCIsIFwiYTE3N1wiLCBcImExNzhcIiwgXCJhMTc5XCIsIFwiYTE5M1wiLCBcImExODBcIixcbiAgXCJhMTk5XCIsIFwiYTE4MVwiLCBcImEyMDBcIiwgXCJhMTgyXCIsIFwiXCIsIFwiYTIwMVwiLCBcImExODNcIiwgXCJhMTg0XCIsIFwiYTE5N1wiLCBcImExODVcIixcbiAgXCJhMTk0XCIsIFwiYTE5OFwiLCBcImExODZcIiwgXCJhMTk1XCIsIFwiYTE4N1wiLCBcImExODhcIiwgXCJhMTg5XCIsIFwiYTE5MFwiLCBcImExOTFcIiwgXCJcIl07XG5cbmZ1bmN0aW9uIGdldEVuY29kaW5nKGVuY29kaW5nTmFtZSkge1xuICBzd2l0Y2ggKGVuY29kaW5nTmFtZSkge1xuICAgIGNhc2UgXCJXaW5BbnNpRW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBXaW5BbnNpRW5jb2Rpbmc7XG4gICAgY2FzZSBcIlN0YW5kYXJkRW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBTdGFuZGFyZEVuY29kaW5nO1xuICAgIGNhc2UgXCJNYWNSb21hbkVuY29kaW5nXCI6XG4gICAgICByZXR1cm4gTWFjUm9tYW5FbmNvZGluZztcbiAgICBjYXNlIFwiU3ltYm9sU2V0RW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBTeW1ib2xTZXRFbmNvZGluZztcbiAgICBjYXNlIFwiWmFwZkRpbmdiYXRzRW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBaYXBmRGluZ2JhdHNFbmNvZGluZztcbiAgICBjYXNlIFwiRXhwZXJ0RW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBFeHBlcnRFbmNvZGluZztcbiAgICBjYXNlIFwiTWFjRXhwZXJ0RW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBNYWNFeHBlcnRFbmNvZGluZztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgV2luQW5zaUVuY29kaW5nLFxuICBTdGFuZGFyZEVuY29kaW5nLFxuICBNYWNSb21hbkVuY29kaW5nLFxuICBTeW1ib2xTZXRFbmNvZGluZyxcbiAgWmFwZkRpbmdiYXRzRW5jb2RpbmcsXG4gIEV4cGVydEVuY29kaW5nLFxuICBnZXRFbmNvZGluZyxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIG5vLWJhYmVsLXByZXNldCAqL1xuXG52YXIgZ2V0TG9va3VwVGFibGVGYWN0b3J5ID0gcmVxdWlyZShcIi4vY29yZV91dGlscy5qc1wiKS5nZXRMb29rdXBUYWJsZUZhY3Rvcnk7XG5cbnZhciBnZXRHbHlwaHNVbmljb2RlID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gIHQuQSA9IDB4MDA0MTtcbiAgdC5BRSA9IDB4MDBjNjtcbiAgdC5BRWFjdXRlID0gMHgwMWZjO1xuICB0LkFFbWFjcm9uID0gMHgwMWUyO1xuICB0LkFFc21hbGwgPSAweGY3ZTY7XG4gIHQuQWFjdXRlID0gMHgwMGMxO1xuICB0LkFhY3V0ZXNtYWxsID0gMHhmN2UxO1xuICB0LkFicmV2ZSA9IDB4MDEwMjtcbiAgdC5BYnJldmVhY3V0ZSA9IDB4MWVhZTtcbiAgdC5BYnJldmVjeXJpbGxpYyA9IDB4MDRkMDtcbiAgdC5BYnJldmVkb3RiZWxvdyA9IDB4MWViNjtcbiAgdC5BYnJldmVncmF2ZSA9IDB4MWViMDtcbiAgdC5BYnJldmVob29rYWJvdmUgPSAweDFlYjI7XG4gIHQuQWJyZXZldGlsZGUgPSAweDFlYjQ7XG4gIHQuQWNhcm9uID0gMHgwMWNkO1xuICB0LkFjaXJjbGUgPSAweDI0YjY7XG4gIHQuQWNpcmN1bWZsZXggPSAweDAwYzI7XG4gIHQuQWNpcmN1bWZsZXhhY3V0ZSA9IDB4MWVhNDtcbiAgdC5BY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFjO1xuICB0LkFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTY7XG4gIHQuQWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYTg7XG4gIHQuQWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlMjtcbiAgdC5BY2lyY3VtZmxleHRpbGRlID0gMHgxZWFhO1xuICB0LkFjdXRlID0gMHhmNmM5O1xuICB0LkFjdXRlc21hbGwgPSAweGY3YjQ7XG4gIHQuQWN5cmlsbGljID0gMHgwNDEwO1xuICB0LkFkYmxncmF2ZSA9IDB4MDIwMDtcbiAgdC5BZGllcmVzaXMgPSAweDAwYzQ7XG4gIHQuQWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDI7XG4gIHQuQWRpZXJlc2lzbWFjcm9uID0gMHgwMWRlO1xuICB0LkFkaWVyZXNpc3NtYWxsID0gMHhmN2U0O1xuICB0LkFkb3RiZWxvdyA9IDB4MWVhMDtcbiAgdC5BZG90bWFjcm9uID0gMHgwMWUwO1xuICB0LkFncmF2ZSA9IDB4MDBjMDtcbiAgdC5BZ3JhdmVzbWFsbCA9IDB4ZjdlMDtcbiAgdC5BaG9va2Fib3ZlID0gMHgxZWEyO1xuICB0LkFpZWN5cmlsbGljID0gMHgwNGQ0O1xuICB0LkFpbnZlcnRlZGJyZXZlID0gMHgwMjAyO1xuICB0LkFscGhhID0gMHgwMzkxO1xuICB0LkFscGhhdG9ub3MgPSAweDAzODY7XG4gIHQuQW1hY3JvbiA9IDB4MDEwMDtcbiAgdC5BbW9ub3NwYWNlID0gMHhmZjIxO1xuICB0LkFvZ29uZWsgPSAweDAxMDQ7XG4gIHQuQXJpbmcgPSAweDAwYzU7XG4gIHQuQXJpbmdhY3V0ZSA9IDB4MDFmYTtcbiAgdC5BcmluZ2JlbG93ID0gMHgxZTAwO1xuICB0LkFyaW5nc21hbGwgPSAweGY3ZTU7XG4gIHQuQXNtYWxsID0gMHhmNzYxO1xuICB0LkF0aWxkZSA9IDB4MDBjMztcbiAgdC5BdGlsZGVzbWFsbCA9IDB4ZjdlMztcbiAgdC5BeWJhcm1lbmlhbiA9IDB4MDUzMTtcbiAgdC5CID0gMHgwMDQyO1xuICB0LkJjaXJjbGUgPSAweDI0Yjc7XG4gIHQuQmRvdGFjY2VudCA9IDB4MWUwMjtcbiAgdC5CZG90YmVsb3cgPSAweDFlMDQ7XG4gIHQuQmVjeXJpbGxpYyA9IDB4MDQxMTtcbiAgdC5CZW5hcm1lbmlhbiA9IDB4MDUzMjtcbiAgdC5CZXRhID0gMHgwMzkyO1xuICB0LkJob29rID0gMHgwMTgxO1xuICB0LkJsaW5lYmVsb3cgPSAweDFlMDY7XG4gIHQuQm1vbm9zcGFjZSA9IDB4ZmYyMjtcbiAgdC5CcmV2ZXNtYWxsID0gMHhmNmY0O1xuICB0LkJzbWFsbCA9IDB4Zjc2MjtcbiAgdC5CdG9wYmFyID0gMHgwMTgyO1xuICB0LkMgPSAweDAwNDM7XG4gIHQuQ2Fhcm1lbmlhbiA9IDB4MDUzZTtcbiAgdC5DYWN1dGUgPSAweDAxMDY7XG4gIHQuQ2Fyb24gPSAweGY2Y2E7XG4gIHQuQ2Fyb25zbWFsbCA9IDB4ZjZmNTtcbiAgdC5DY2Fyb24gPSAweDAxMGM7XG4gIHQuQ2NlZGlsbGEgPSAweDAwYzc7XG4gIHQuQ2NlZGlsbGFhY3V0ZSA9IDB4MWUwODtcbiAgdC5DY2VkaWxsYXNtYWxsID0gMHhmN2U3O1xuICB0LkNjaXJjbGUgPSAweDI0Yjg7XG4gIHQuQ2NpcmN1bWZsZXggPSAweDAxMDg7XG4gIHQuQ2RvdCA9IDB4MDEwYTtcbiAgdC5DZG90YWNjZW50ID0gMHgwMTBhO1xuICB0LkNlZGlsbGFzbWFsbCA9IDB4ZjdiODtcbiAgdC5DaGFhcm1lbmlhbiA9IDB4MDU0OTtcbiAgdC5DaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiYztcbiAgdC5DaGVjeXJpbGxpYyA9IDB4MDQyNztcbiAgdC5DaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZTtcbiAgdC5DaGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiNjtcbiAgdC5DaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY0O1xuICB0LkNoZWhhcm1lbmlhbiA9IDB4MDU0MztcbiAgdC5DaGVraGFrYXNzaWFuY3lyaWxsaWMgPSAweDA0Y2I7XG4gIHQuQ2hldmVydGljYWxzdHJva2VjeXJpbGxpYyA9IDB4MDRiODtcbiAgdC5DaGkgPSAweDAzYTc7XG4gIHQuQ2hvb2sgPSAweDAxODc7XG4gIHQuQ2lyY3VtZmxleHNtYWxsID0gMHhmNmY2O1xuICB0LkNtb25vc3BhY2UgPSAweGZmMjM7XG4gIHQuQ29hcm1lbmlhbiA9IDB4MDU1MTtcbiAgdC5Dc21hbGwgPSAweGY3NjM7XG4gIHQuRCA9IDB4MDA0NDtcbiAgdC5EWiA9IDB4MDFmMTtcbiAgdC5EWmNhcm9uID0gMHgwMWM0O1xuICB0LkRhYXJtZW5pYW4gPSAweDA1MzQ7XG4gIHQuRGFmcmljYW4gPSAweDAxODk7XG4gIHQuRGNhcm9uID0gMHgwMTBlO1xuICB0LkRjZWRpbGxhID0gMHgxZTEwO1xuICB0LkRjaXJjbGUgPSAweDI0Yjk7XG4gIHQuRGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxMjtcbiAgdC5EY3JvYXQgPSAweDAxMTA7XG4gIHQuRGRvdGFjY2VudCA9IDB4MWUwYTtcbiAgdC5EZG90YmVsb3cgPSAweDFlMGM7XG4gIHQuRGVjeXJpbGxpYyA9IDB4MDQxNDtcbiAgdC5EZWljb3B0aWMgPSAweDAzZWU7XG4gIHQuRGVsdGEgPSAweDIyMDY7XG4gIHQuRGVsdGFncmVlayA9IDB4MDM5NDtcbiAgdC5EaG9vayA9IDB4MDE4YTtcbiAgdC5EaWVyZXNpcyA9IDB4ZjZjYjtcbiAgdC5EaWVyZXNpc0FjdXRlID0gMHhmNmNjO1xuICB0LkRpZXJlc2lzR3JhdmUgPSAweGY2Y2Q7XG4gIHQuRGllcmVzaXNzbWFsbCA9IDB4ZjdhODtcbiAgdC5EaWdhbW1hZ3JlZWsgPSAweDAzZGM7XG4gIHQuRGplY3lyaWxsaWMgPSAweDA0MDI7XG4gIHQuRGxpbmViZWxvdyA9IDB4MWUwZTtcbiAgdC5EbW9ub3NwYWNlID0gMHhmZjI0O1xuICB0LkRvdGFjY2VudHNtYWxsID0gMHhmNmY3O1xuICB0LkRzbGFzaCA9IDB4MDExMDtcbiAgdC5Ec21hbGwgPSAweGY3NjQ7XG4gIHQuRHRvcGJhciA9IDB4MDE4YjtcbiAgdC5EeiA9IDB4MDFmMjtcbiAgdC5EemNhcm9uID0gMHgwMWM1O1xuICB0LkR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUwO1xuICB0LkR6ZWN5cmlsbGljID0gMHgwNDA1O1xuICB0LkR6aGVjeXJpbGxpYyA9IDB4MDQwZjtcbiAgdC5FID0gMHgwMDQ1O1xuICB0LkVhY3V0ZSA9IDB4MDBjOTtcbiAgdC5FYWN1dGVzbWFsbCA9IDB4ZjdlOTtcbiAgdC5FYnJldmUgPSAweDAxMTQ7XG4gIHQuRWNhcm9uID0gMHgwMTFhO1xuICB0LkVjZWRpbGxhYnJldmUgPSAweDFlMWM7XG4gIHQuRWNoYXJtZW5pYW4gPSAweDA1MzU7XG4gIHQuRWNpcmNsZSA9IDB4MjRiYTtcbiAgdC5FY2lyY3VtZmxleCA9IDB4MDBjYTtcbiAgdC5FY2lyY3VtZmxleGFjdXRlID0gMHgxZWJlO1xuICB0LkVjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTg7XG4gIHQuRWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVjNjtcbiAgdC5FY2lyY3VtZmxleGdyYXZlID0gMHgxZWMwO1xuICB0LkVjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWMyO1xuICB0LkVjaXJjdW1mbGV4c21hbGwgPSAweGY3ZWE7XG4gIHQuRWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNDtcbiAgdC5FY3lyaWxsaWMgPSAweDA0MDQ7XG4gIHQuRWRibGdyYXZlID0gMHgwMjA0O1xuICB0LkVkaWVyZXNpcyA9IDB4MDBjYjtcbiAgdC5FZGllcmVzaXNzbWFsbCA9IDB4ZjdlYjtcbiAgdC5FZG90ID0gMHgwMTE2O1xuICB0LkVkb3RhY2NlbnQgPSAweDAxMTY7XG4gIHQuRWRvdGJlbG93ID0gMHgxZWI4O1xuICB0LkVmY3lyaWxsaWMgPSAweDA0MjQ7XG4gIHQuRWdyYXZlID0gMHgwMGM4O1xuICB0LkVncmF2ZXNtYWxsID0gMHhmN2U4O1xuICB0LkVoYXJtZW5pYW4gPSAweDA1Mzc7XG4gIHQuRWhvb2thYm92ZSA9IDB4MWViYTtcbiAgdC5FaWdodHJvbWFuID0gMHgyMTY3O1xuICB0LkVpbnZlcnRlZGJyZXZlID0gMHgwMjA2O1xuICB0LkVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY0O1xuICB0LkVsY3lyaWxsaWMgPSAweDA0MWI7XG4gIHQuRWxldmVucm9tYW4gPSAweDIxNmE7XG4gIHQuRW1hY3JvbiA9IDB4MDExMjtcbiAgdC5FbWFjcm9uYWN1dGUgPSAweDFlMTY7XG4gIHQuRW1hY3JvbmdyYXZlID0gMHgxZTE0O1xuICB0LkVtY3lyaWxsaWMgPSAweDA0MWM7XG4gIHQuRW1vbm9zcGFjZSA9IDB4ZmYyNTtcbiAgdC5FbmN5cmlsbGljID0gMHgwNDFkO1xuICB0LkVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTI7XG4gIHQuRW5nID0gMHgwMTRhO1xuICB0LkVuZ2hlY3lyaWxsaWMgPSAweDA0YTQ7XG4gIHQuRW5ob29rY3lyaWxsaWMgPSAweDA0Yzc7XG4gIHQuRW9nb25layA9IDB4MDExODtcbiAgdC5Fb3BlbiA9IDB4MDE5MDtcbiAgdC5FcHNpbG9uID0gMHgwMzk1O1xuICB0LkVwc2lsb250b25vcyA9IDB4MDM4ODtcbiAgdC5FcmN5cmlsbGljID0gMHgwNDIwO1xuICB0LkVyZXZlcnNlZCA9IDB4MDE4ZTtcbiAgdC5FcmV2ZXJzZWRjeXJpbGxpYyA9IDB4MDQyZDtcbiAgdC5Fc2N5cmlsbGljID0gMHgwNDIxO1xuICB0LkVzZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWE7XG4gIHQuRXNoID0gMHgwMWE5O1xuICB0LkVzbWFsbCA9IDB4Zjc2NTtcbiAgdC5FdGEgPSAweDAzOTc7XG4gIHQuRXRhcm1lbmlhbiA9IDB4MDUzODtcbiAgdC5FdGF0b25vcyA9IDB4MDM4OTtcbiAgdC5FdGggPSAweDAwZDA7XG4gIHQuRXRoc21hbGwgPSAweGY3ZjA7XG4gIHQuRXRpbGRlID0gMHgxZWJjO1xuICB0LkV0aWxkZWJlbG93ID0gMHgxZTFhO1xuICB0LkV1cm8gPSAweDIwYWM7XG4gIHQuRXpoID0gMHgwMWI3O1xuICB0LkV6aGNhcm9uID0gMHgwMWVlO1xuICB0LkV6aHJldmVyc2VkID0gMHgwMWI4O1xuICB0LkYgPSAweDAwNDY7XG4gIHQuRmNpcmNsZSA9IDB4MjRiYjtcbiAgdC5GZG90YWNjZW50ID0gMHgxZTFlO1xuICB0LkZlaGFybWVuaWFuID0gMHgwNTU2O1xuICB0LkZlaWNvcHRpYyA9IDB4MDNlNDtcbiAgdC5GaG9vayA9IDB4MDE5MTtcbiAgdC5GaXRhY3lyaWxsaWMgPSAweDA0NzI7XG4gIHQuRml2ZXJvbWFuID0gMHgyMTY0O1xuICB0LkZtb25vc3BhY2UgPSAweGZmMjY7XG4gIHQuRm91cnJvbWFuID0gMHgyMTYzO1xuICB0LkZzbWFsbCA9IDB4Zjc2NjtcbiAgdC5HID0gMHgwMDQ3O1xuICB0LkdCc3F1YXJlID0gMHgzMzg3O1xuICB0LkdhY3V0ZSA9IDB4MDFmNDtcbiAgdC5HYW1tYSA9IDB4MDM5MztcbiAgdC5HYW1tYWFmcmljYW4gPSAweDAxOTQ7XG4gIHQuR2FuZ2lhY29wdGljID0gMHgwM2VhO1xuICB0LkdicmV2ZSA9IDB4MDExZTtcbiAgdC5HY2Fyb24gPSAweDAxZTY7XG4gIHQuR2NlZGlsbGEgPSAweDAxMjI7XG4gIHQuR2NpcmNsZSA9IDB4MjRiYztcbiAgdC5HY2lyY3VtZmxleCA9IDB4MDExYztcbiAgdC5HY29tbWFhY2NlbnQgPSAweDAxMjI7XG4gIHQuR2RvdCA9IDB4MDEyMDtcbiAgdC5HZG90YWNjZW50ID0gMHgwMTIwO1xuICB0LkdlY3lyaWxsaWMgPSAweDA0MTM7XG4gIHQuR2hhZGFybWVuaWFuID0gMHgwNTQyO1xuICB0LkdoZW1pZGRsZWhvb2tjeXJpbGxpYyA9IDB4MDQ5NDtcbiAgdC5HaGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MjtcbiAgdC5HaGV1cHR1cm5jeXJpbGxpYyA9IDB4MDQ5MDtcbiAgdC5HaG9vayA9IDB4MDE5MztcbiAgdC5HaW1hcm1lbmlhbiA9IDB4MDUzMztcbiAgdC5HamVjeXJpbGxpYyA9IDB4MDQwMztcbiAgdC5HbWFjcm9uID0gMHgxZTIwO1xuICB0Lkdtb25vc3BhY2UgPSAweGZmMjc7XG4gIHQuR3JhdmUgPSAweGY2Y2U7XG4gIHQuR3JhdmVzbWFsbCA9IDB4Zjc2MDtcbiAgdC5Hc21hbGwgPSAweGY3Njc7XG4gIHQuR3NtYWxsaG9vayA9IDB4MDI5YjtcbiAgdC5Hc3Ryb2tlID0gMHgwMWU0O1xuICB0LkggPSAweDAwNDg7XG4gIHQuSDE4NTMzID0gMHgyNWNmO1xuICB0LkgxODU0MyA9IDB4MjVhYTtcbiAgdC5IMTg1NTEgPSAweDI1YWI7XG4gIHQuSDIyMDczID0gMHgyNWExO1xuICB0LkhQc3F1YXJlID0gMHgzM2NiO1xuICB0LkhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTg7XG4gIHQuSGFkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiMjtcbiAgdC5IYXJkc2lnbmN5cmlsbGljID0gMHgwNDJhO1xuICB0LkhiYXIgPSAweDAxMjY7XG4gIHQuSGJyZXZlYmVsb3cgPSAweDFlMmE7XG4gIHQuSGNlZGlsbGEgPSAweDFlMjg7XG4gIHQuSGNpcmNsZSA9IDB4MjRiZDtcbiAgdC5IY2lyY3VtZmxleCA9IDB4MDEyNDtcbiAgdC5IZGllcmVzaXMgPSAweDFlMjY7XG4gIHQuSGRvdGFjY2VudCA9IDB4MWUyMjtcbiAgdC5IZG90YmVsb3cgPSAweDFlMjQ7XG4gIHQuSG1vbm9zcGFjZSA9IDB4ZmYyODtcbiAgdC5Ib2FybWVuaWFuID0gMHgwNTQwO1xuICB0Lkhvcmljb3B0aWMgPSAweDAzZTg7XG4gIHQuSHNtYWxsID0gMHhmNzY4O1xuICB0Lkh1bmdhcnVtbGF1dCA9IDB4ZjZjZjtcbiAgdC5IdW5nYXJ1bWxhdXRzbWFsbCA9IDB4ZjZmODtcbiAgdC5IenNxdWFyZSA9IDB4MzM5MDtcbiAgdC5JID0gMHgwMDQ5O1xuICB0LklBY3lyaWxsaWMgPSAweDA0MmY7XG4gIHQuSUogPSAweDAxMzI7XG4gIHQuSVVjeXJpbGxpYyA9IDB4MDQyZTtcbiAgdC5JYWN1dGUgPSAweDAwY2Q7XG4gIHQuSWFjdXRlc21hbGwgPSAweGY3ZWQ7XG4gIHQuSWJyZXZlID0gMHgwMTJjO1xuICB0LkljYXJvbiA9IDB4MDFjZjtcbiAgdC5JY2lyY2xlID0gMHgyNGJlO1xuICB0LkljaXJjdW1mbGV4ID0gMHgwMGNlO1xuICB0LkljaXJjdW1mbGV4c21hbGwgPSAweGY3ZWU7XG4gIHQuSWN5cmlsbGljID0gMHgwNDA2O1xuICB0LklkYmxncmF2ZSA9IDB4MDIwODtcbiAgdC5JZGllcmVzaXMgPSAweDAwY2Y7XG4gIHQuSWRpZXJlc2lzYWN1dGUgPSAweDFlMmU7XG4gIHQuSWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTQ7XG4gIHQuSWRpZXJlc2lzc21hbGwgPSAweGY3ZWY7XG4gIHQuSWRvdCA9IDB4MDEzMDtcbiAgdC5JZG90YWNjZW50ID0gMHgwMTMwO1xuICB0Lklkb3RiZWxvdyA9IDB4MWVjYTtcbiAgdC5JZWJyZXZlY3lyaWxsaWMgPSAweDA0ZDY7XG4gIHQuSWVjeXJpbGxpYyA9IDB4MDQxNTtcbiAgdC5JZnJha3R1ciA9IDB4MjExMTtcbiAgdC5JZ3JhdmUgPSAweDAwY2M7XG4gIHQuSWdyYXZlc21hbGwgPSAweGY3ZWM7XG4gIHQuSWhvb2thYm92ZSA9IDB4MWVjODtcbiAgdC5JaWN5cmlsbGljID0gMHgwNDE4O1xuICB0LklpbnZlcnRlZGJyZXZlID0gMHgwMjBhO1xuICB0Lklpc2hvcnRjeXJpbGxpYyA9IDB4MDQxOTtcbiAgdC5JbWFjcm9uID0gMHgwMTJhO1xuICB0LkltYWNyb25jeXJpbGxpYyA9IDB4MDRlMjtcbiAgdC5JbW9ub3NwYWNlID0gMHhmZjI5O1xuICB0LkluaWFybWVuaWFuID0gMHgwNTNiO1xuICB0LklvY3lyaWxsaWMgPSAweDA0MDE7XG4gIHQuSW9nb25layA9IDB4MDEyZTtcbiAgdC5Jb3RhID0gMHgwMzk5O1xuICB0LklvdGFhZnJpY2FuID0gMHgwMTk2O1xuICB0LklvdGFkaWVyZXNpcyA9IDB4MDNhYTtcbiAgdC5Jb3RhdG9ub3MgPSAweDAzOGE7XG4gIHQuSXNtYWxsID0gMHhmNzY5O1xuICB0LklzdHJva2UgPSAweDAxOTc7XG4gIHQuSXRpbGRlID0gMHgwMTI4O1xuICB0Lkl0aWxkZWJlbG93ID0gMHgxZTJjO1xuICB0Lkl6aGl0c2FjeXJpbGxpYyA9IDB4MDQ3NDtcbiAgdC5JemhpdHNhZGJsZ3JhdmVjeXJpbGxpYyA9IDB4MDQ3NjtcbiAgdC5KID0gMHgwMDRhO1xuICB0LkphYXJtZW5pYW4gPSAweDA1NDE7XG4gIHQuSmNpcmNsZSA9IDB4MjRiZjtcbiAgdC5KY2lyY3VtZmxleCA9IDB4MDEzNDtcbiAgdC5KZWN5cmlsbGljID0gMHgwNDA4O1xuICB0LkpoZWhhcm1lbmlhbiA9IDB4MDU0YjtcbiAgdC5KbW9ub3NwYWNlID0gMHhmZjJhO1xuICB0LkpzbWFsbCA9IDB4Zjc2YTtcbiAgdC5LID0gMHgwMDRiO1xuICB0LktCc3F1YXJlID0gMHgzMzg1O1xuICB0LktLc3F1YXJlID0gMHgzM2NkO1xuICB0LkthYmFzaGtpcmN5cmlsbGljID0gMHgwNGEwO1xuICB0LkthY3V0ZSA9IDB4MWUzMDtcbiAgdC5LYWN5cmlsbGljID0gMHgwNDFhO1xuICB0LkthZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OWE7XG4gIHQuS2Fob29rY3lyaWxsaWMgPSAweDA0YzM7XG4gIHQuS2FwcGEgPSAweDAzOWE7XG4gIHQuS2FzdHJva2VjeXJpbGxpYyA9IDB4MDQ5ZTtcbiAgdC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWM7XG4gIHQuS2Nhcm9uID0gMHgwMWU4O1xuICB0LktjZWRpbGxhID0gMHgwMTM2O1xuICB0LktjaXJjbGUgPSAweDI0YzA7XG4gIHQuS2NvbW1hYWNjZW50ID0gMHgwMTM2O1xuICB0Lktkb3RiZWxvdyA9IDB4MWUzMjtcbiAgdC5LZWhhcm1lbmlhbiA9IDB4MDU1NDtcbiAgdC5LZW5hcm1lbmlhbiA9IDB4MDUzZjtcbiAgdC5LaGFjeXJpbGxpYyA9IDB4MDQyNTtcbiAgdC5LaGVpY29wdGljID0gMHgwM2U2O1xuICB0Lktob29rID0gMHgwMTk4O1xuICB0LktqZWN5cmlsbGljID0gMHgwNDBjO1xuICB0LktsaW5lYmVsb3cgPSAweDFlMzQ7XG4gIHQuS21vbm9zcGFjZSA9IDB4ZmYyYjtcbiAgdC5Lb3BwYWN5cmlsbGljID0gMHgwNDgwO1xuICB0LktvcHBhZ3JlZWsgPSAweDAzZGU7XG4gIHQuS3NpY3lyaWxsaWMgPSAweDA0NmU7XG4gIHQuS3NtYWxsID0gMHhmNzZiO1xuICB0LkwgPSAweDAwNGM7XG4gIHQuTEogPSAweDAxYzc7XG4gIHQuTEwgPSAweGY2YmY7XG4gIHQuTGFjdXRlID0gMHgwMTM5O1xuICB0LkxhbWJkYSA9IDB4MDM5YjtcbiAgdC5MY2Fyb24gPSAweDAxM2Q7XG4gIHQuTGNlZGlsbGEgPSAweDAxM2I7XG4gIHQuTGNpcmNsZSA9IDB4MjRjMTtcbiAgdC5MY2lyY3VtZmxleGJlbG93ID0gMHgxZTNjO1xuICB0Lkxjb21tYWFjY2VudCA9IDB4MDEzYjtcbiAgdC5MZG90ID0gMHgwMTNmO1xuICB0Lkxkb3RhY2NlbnQgPSAweDAxM2Y7XG4gIHQuTGRvdGJlbG93ID0gMHgxZTM2O1xuICB0Lkxkb3RiZWxvd21hY3JvbiA9IDB4MWUzODtcbiAgdC5MaXduYXJtZW5pYW4gPSAweDA1M2M7XG4gIHQuTGogPSAweDAxYzg7XG4gIHQuTGplY3lyaWxsaWMgPSAweDA0MDk7XG4gIHQuTGxpbmViZWxvdyA9IDB4MWUzYTtcbiAgdC5MbW9ub3NwYWNlID0gMHhmZjJjO1xuICB0LkxzbGFzaCA9IDB4MDE0MTtcbiAgdC5Mc2xhc2hzbWFsbCA9IDB4ZjZmOTtcbiAgdC5Mc21hbGwgPSAweGY3NmM7XG4gIHQuTSA9IDB4MDA0ZDtcbiAgdC5NQnNxdWFyZSA9IDB4MzM4NjtcbiAgdC5NYWNyb24gPSAweGY2ZDA7XG4gIHQuTWFjcm9uc21hbGwgPSAweGY3YWY7XG4gIHQuTWFjdXRlID0gMHgxZTNlO1xuICB0Lk1jaXJjbGUgPSAweDI0YzI7XG4gIHQuTWRvdGFjY2VudCA9IDB4MWU0MDtcbiAgdC5NZG90YmVsb3cgPSAweDFlNDI7XG4gIHQuTWVuYXJtZW5pYW4gPSAweDA1NDQ7XG4gIHQuTW1vbm9zcGFjZSA9IDB4ZmYyZDtcbiAgdC5Nc21hbGwgPSAweGY3NmQ7XG4gIHQuTXR1cm5lZCA9IDB4MDE5YztcbiAgdC5NdSA9IDB4MDM5YztcbiAgdC5OID0gMHgwMDRlO1xuICB0Lk5KID0gMHgwMWNhO1xuICB0Lk5hY3V0ZSA9IDB4MDE0MztcbiAgdC5OY2Fyb24gPSAweDAxNDc7XG4gIHQuTmNlZGlsbGEgPSAweDAxNDU7XG4gIHQuTmNpcmNsZSA9IDB4MjRjMztcbiAgdC5OY2lyY3VtZmxleGJlbG93ID0gMHgxZTRhO1xuICB0Lk5jb21tYWFjY2VudCA9IDB4MDE0NTtcbiAgdC5OZG90YWNjZW50ID0gMHgxZTQ0O1xuICB0Lk5kb3RiZWxvdyA9IDB4MWU0NjtcbiAgdC5OaG9va2xlZnQgPSAweDAxOWQ7XG4gIHQuTmluZXJvbWFuID0gMHgyMTY4O1xuICB0Lk5qID0gMHgwMWNiO1xuICB0Lk5qZWN5cmlsbGljID0gMHgwNDBhO1xuICB0Lk5saW5lYmVsb3cgPSAweDFlNDg7XG4gIHQuTm1vbm9zcGFjZSA9IDB4ZmYyZTtcbiAgdC5Ob3dhcm1lbmlhbiA9IDB4MDU0NjtcbiAgdC5Oc21hbGwgPSAweGY3NmU7XG4gIHQuTnRpbGRlID0gMHgwMGQxO1xuICB0Lk50aWxkZXNtYWxsID0gMHhmN2YxO1xuICB0Lk51ID0gMHgwMzlkO1xuICB0Lk8gPSAweDAwNGY7XG4gIHQuT0UgPSAweDAxNTI7XG4gIHQuT0VzbWFsbCA9IDB4ZjZmYTtcbiAgdC5PYWN1dGUgPSAweDAwZDM7XG4gIHQuT2FjdXRlc21hbGwgPSAweGY3ZjM7XG4gIHQuT2JhcnJlZGN5cmlsbGljID0gMHgwNGU4O1xuICB0Lk9iYXJyZWRkaWVyZXNpc2N5cmlsbGljID0gMHgwNGVhO1xuICB0Lk9icmV2ZSA9IDB4MDE0ZTtcbiAgdC5PY2Fyb24gPSAweDAxZDE7XG4gIHQuT2NlbnRlcmVkdGlsZGUgPSAweDAxOWY7XG4gIHQuT2NpcmNsZSA9IDB4MjRjNDtcbiAgdC5PY2lyY3VtZmxleCA9IDB4MDBkNDtcbiAgdC5PY2lyY3VtZmxleGFjdXRlID0gMHgxZWQwO1xuICB0Lk9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDg7XG4gIHQuT2NpcmN1bWZsZXhncmF2ZSA9IDB4MWVkMjtcbiAgdC5PY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVkNDtcbiAgdC5PY2lyY3VtZmxleHNtYWxsID0gMHhmN2Y0O1xuICB0Lk9jaXJjdW1mbGV4dGlsZGUgPSAweDFlZDY7XG4gIHQuT2N5cmlsbGljID0gMHgwNDFlO1xuICB0Lk9kYmxhY3V0ZSA9IDB4MDE1MDtcbiAgdC5PZGJsZ3JhdmUgPSAweDAyMGM7XG4gIHQuT2RpZXJlc2lzID0gMHgwMGQ2O1xuICB0Lk9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU2O1xuICB0Lk9kaWVyZXNpc3NtYWxsID0gMHhmN2Y2O1xuICB0Lk9kb3RiZWxvdyA9IDB4MWVjYztcbiAgdC5PZ29uZWtzbWFsbCA9IDB4ZjZmYjtcbiAgdC5PZ3JhdmUgPSAweDAwZDI7XG4gIHQuT2dyYXZlc21hbGwgPSAweGY3ZjI7XG4gIHQuT2hhcm1lbmlhbiA9IDB4MDU1NTtcbiAgdC5PaG0gPSAweDIxMjY7XG4gIHQuT2hvb2thYm92ZSA9IDB4MWVjZTtcbiAgdC5PaG9ybiA9IDB4MDFhMDtcbiAgdC5PaG9ybmFjdXRlID0gMHgxZWRhO1xuICB0Lk9ob3JuZG90YmVsb3cgPSAweDFlZTI7XG4gIHQuT2hvcm5ncmF2ZSA9IDB4MWVkYztcbiAgdC5PaG9ybmhvb2thYm92ZSA9IDB4MWVkZTtcbiAgdC5PaG9ybnRpbGRlID0gMHgxZWUwO1xuICB0Lk9odW5nYXJ1bWxhdXQgPSAweDAxNTA7XG4gIHQuT2kgPSAweDAxYTI7XG4gIHQuT2ludmVydGVkYnJldmUgPSAweDAyMGU7XG4gIHQuT21hY3JvbiA9IDB4MDE0YztcbiAgdC5PbWFjcm9uYWN1dGUgPSAweDFlNTI7XG4gIHQuT21hY3JvbmdyYXZlID0gMHgxZTUwO1xuICB0Lk9tZWdhID0gMHgyMTI2O1xuICB0Lk9tZWdhY3lyaWxsaWMgPSAweDA0NjA7XG4gIHQuT21lZ2FncmVlayA9IDB4MDNhOTtcbiAgdC5PbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2E7XG4gIHQuT21lZ2F0aXRsb2N5cmlsbGljID0gMHgwNDdjO1xuICB0Lk9tZWdhdG9ub3MgPSAweDAzOGY7XG4gIHQuT21pY3JvbiA9IDB4MDM5ZjtcbiAgdC5PbWljcm9udG9ub3MgPSAweDAzOGM7XG4gIHQuT21vbm9zcGFjZSA9IDB4ZmYyZjtcbiAgdC5PbmVyb21hbiA9IDB4MjE2MDtcbiAgdC5Pb2dvbmVrID0gMHgwMWVhO1xuICB0Lk9vZ29uZWttYWNyb24gPSAweDAxZWM7XG4gIHQuT29wZW4gPSAweDAxODY7XG4gIHQuT3NsYXNoID0gMHgwMGQ4O1xuICB0Lk9zbGFzaGFjdXRlID0gMHgwMWZlO1xuICB0Lk9zbGFzaHNtYWxsID0gMHhmN2Y4O1xuICB0Lk9zbWFsbCA9IDB4Zjc2ZjtcbiAgdC5Pc3Ryb2tlYWN1dGUgPSAweDAxZmU7XG4gIHQuT3RjeXJpbGxpYyA9IDB4MDQ3ZTtcbiAgdC5PdGlsZGUgPSAweDAwZDU7XG4gIHQuT3RpbGRlYWN1dGUgPSAweDFlNGM7XG4gIHQuT3RpbGRlZGllcmVzaXMgPSAweDFlNGU7XG4gIHQuT3RpbGRlc21hbGwgPSAweGY3ZjU7XG4gIHQuUCA9IDB4MDA1MDtcbiAgdC5QYWN1dGUgPSAweDFlNTQ7XG4gIHQuUGNpcmNsZSA9IDB4MjRjNTtcbiAgdC5QZG90YWNjZW50ID0gMHgxZTU2O1xuICB0LlBlY3lyaWxsaWMgPSAweDA0MWY7XG4gIHQuUGVoYXJtZW5pYW4gPSAweDA1NGE7XG4gIHQuUGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0YTY7XG4gIHQuUGhpID0gMHgwM2E2O1xuICB0LlBob29rID0gMHgwMWE0O1xuICB0LlBpID0gMHgwM2EwO1xuICB0LlBpd3Jhcm1lbmlhbiA9IDB4MDU1MztcbiAgdC5QbW9ub3NwYWNlID0gMHhmZjMwO1xuICB0LlBzaSA9IDB4MDNhODtcbiAgdC5Qc2ljeXJpbGxpYyA9IDB4MDQ3MDtcbiAgdC5Qc21hbGwgPSAweGY3NzA7XG4gIHQuUSA9IDB4MDA1MTtcbiAgdC5RY2lyY2xlID0gMHgyNGM2O1xuICB0LlFtb25vc3BhY2UgPSAweGZmMzE7XG4gIHQuUXNtYWxsID0gMHhmNzcxO1xuICB0LlIgPSAweDAwNTI7XG4gIHQuUmFhcm1lbmlhbiA9IDB4MDU0YztcbiAgdC5SYWN1dGUgPSAweDAxNTQ7XG4gIHQuUmNhcm9uID0gMHgwMTU4O1xuICB0LlJjZWRpbGxhID0gMHgwMTU2O1xuICB0LlJjaXJjbGUgPSAweDI0Yzc7XG4gIHQuUmNvbW1hYWNjZW50ID0gMHgwMTU2O1xuICB0LlJkYmxncmF2ZSA9IDB4MDIxMDtcbiAgdC5SZG90YWNjZW50ID0gMHgxZTU4O1xuICB0LlJkb3RiZWxvdyA9IDB4MWU1YTtcbiAgdC5SZG90YmVsb3dtYWNyb24gPSAweDFlNWM7XG4gIHQuUmVoYXJtZW5pYW4gPSAweDA1NTA7XG4gIHQuUmZyYWt0dXIgPSAweDIxMWM7XG4gIHQuUmhvID0gMHgwM2ExO1xuICB0LlJpbmdzbWFsbCA9IDB4ZjZmYztcbiAgdC5SaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMjtcbiAgdC5SbGluZWJlbG93ID0gMHgxZTVlO1xuICB0LlJtb25vc3BhY2UgPSAweGZmMzI7XG4gIHQuUnNtYWxsID0gMHhmNzcyO1xuICB0LlJzbWFsbGludmVydGVkID0gMHgwMjgxO1xuICB0LlJzbWFsbGludmVydGVkc3VwZXJpb3IgPSAweDAyYjY7XG4gIHQuUyA9IDB4MDA1MztcbiAgdC5TRjAxMDAwMCA9IDB4MjUwYztcbiAgdC5TRjAyMDAwMCA9IDB4MjUxNDtcbiAgdC5TRjAzMDAwMCA9IDB4MjUxMDtcbiAgdC5TRjA0MDAwMCA9IDB4MjUxODtcbiAgdC5TRjA1MDAwMCA9IDB4MjUzYztcbiAgdC5TRjA2MDAwMCA9IDB4MjUyYztcbiAgdC5TRjA3MDAwMCA9IDB4MjUzNDtcbiAgdC5TRjA4MDAwMCA9IDB4MjUxYztcbiAgdC5TRjA5MDAwMCA9IDB4MjUyNDtcbiAgdC5TRjEwMDAwMCA9IDB4MjUwMDtcbiAgdC5TRjExMDAwMCA9IDB4MjUwMjtcbiAgdC5TRjE5MDAwMCA9IDB4MjU2MTtcbiAgdC5TRjIwMDAwMCA9IDB4MjU2MjtcbiAgdC5TRjIxMDAwMCA9IDB4MjU1NjtcbiAgdC5TRjIyMDAwMCA9IDB4MjU1NTtcbiAgdC5TRjIzMDAwMCA9IDB4MjU2MztcbiAgdC5TRjI0MDAwMCA9IDB4MjU1MTtcbiAgdC5TRjI1MDAwMCA9IDB4MjU1NztcbiAgdC5TRjI2MDAwMCA9IDB4MjU1ZDtcbiAgdC5TRjI3MDAwMCA9IDB4MjU1YztcbiAgdC5TRjI4MDAwMCA9IDB4MjU1YjtcbiAgdC5TRjM2MDAwMCA9IDB4MjU1ZTtcbiAgdC5TRjM3MDAwMCA9IDB4MjU1ZjtcbiAgdC5TRjM4MDAwMCA9IDB4MjU1YTtcbiAgdC5TRjM5MDAwMCA9IDB4MjU1NDtcbiAgdC5TRjQwMDAwMCA9IDB4MjU2OTtcbiAgdC5TRjQxMDAwMCA9IDB4MjU2NjtcbiAgdC5TRjQyMDAwMCA9IDB4MjU2MDtcbiAgdC5TRjQzMDAwMCA9IDB4MjU1MDtcbiAgdC5TRjQ0MDAwMCA9IDB4MjU2YztcbiAgdC5TRjQ1MDAwMCA9IDB4MjU2NztcbiAgdC5TRjQ2MDAwMCA9IDB4MjU2ODtcbiAgdC5TRjQ3MDAwMCA9IDB4MjU2NDtcbiAgdC5TRjQ4MDAwMCA9IDB4MjU2NTtcbiAgdC5TRjQ5MDAwMCA9IDB4MjU1OTtcbiAgdC5TRjUwMDAwMCA9IDB4MjU1ODtcbiAgdC5TRjUxMDAwMCA9IDB4MjU1MjtcbiAgdC5TRjUyMDAwMCA9IDB4MjU1MztcbiAgdC5TRjUzMDAwMCA9IDB4MjU2YjtcbiAgdC5TRjU0MDAwMCA9IDB4MjU2YTtcbiAgdC5TYWN1dGUgPSAweDAxNWE7XG4gIHQuU2FjdXRlZG90YWNjZW50ID0gMHgxZTY0O1xuICB0LlNhbXBpZ3JlZWsgPSAweDAzZTA7XG4gIHQuU2Nhcm9uID0gMHgwMTYwO1xuICB0LlNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NjtcbiAgdC5TY2Fyb25zbWFsbCA9IDB4ZjZmZDtcbiAgdC5TY2VkaWxsYSA9IDB4MDE1ZTtcbiAgdC5TY2h3YSA9IDB4MDE4ZjtcbiAgdC5TY2h3YWN5cmlsbGljID0gMHgwNGQ4O1xuICB0LlNjaHdhZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkYTtcbiAgdC5TY2lyY2xlID0gMHgyNGM4O1xuICB0LlNjaXJjdW1mbGV4ID0gMHgwMTVjO1xuICB0LlNjb21tYWFjY2VudCA9IDB4MDIxODtcbiAgdC5TZG90YWNjZW50ID0gMHgxZTYwO1xuICB0LlNkb3RiZWxvdyA9IDB4MWU2MjtcbiAgdC5TZG90YmVsb3dkb3RhY2NlbnQgPSAweDFlNjg7XG4gIHQuU2VoYXJtZW5pYW4gPSAweDA1NGQ7XG4gIHQuU2V2ZW5yb21hbiA9IDB4MjE2NjtcbiAgdC5TaGFhcm1lbmlhbiA9IDB4MDU0NztcbiAgdC5TaGFjeXJpbGxpYyA9IDB4MDQyODtcbiAgdC5TaGNoYWN5cmlsbGljID0gMHgwNDI5O1xuICB0LlNoZWljb3B0aWMgPSAweDAzZTI7XG4gIHQuU2hoYWN5cmlsbGljID0gMHgwNGJhO1xuICB0LlNoaW1hY29wdGljID0gMHgwM2VjO1xuICB0LlNpZ21hID0gMHgwM2EzO1xuICB0LlNpeHJvbWFuID0gMHgyMTY1O1xuICB0LlNtb25vc3BhY2UgPSAweGZmMzM7XG4gIHQuU29mdHNpZ25jeXJpbGxpYyA9IDB4MDQyYztcbiAgdC5Tc21hbGwgPSAweGY3NzM7XG4gIHQuU3RpZ21hZ3JlZWsgPSAweDAzZGE7XG4gIHQuVCA9IDB4MDA1NDtcbiAgdC5UYXUgPSAweDAzYTQ7XG4gIHQuVGJhciA9IDB4MDE2NjtcbiAgdC5UY2Fyb24gPSAweDAxNjQ7XG4gIHQuVGNlZGlsbGEgPSAweDAxNjI7XG4gIHQuVGNpcmNsZSA9IDB4MjRjOTtcbiAgdC5UY2lyY3VtZmxleGJlbG93ID0gMHgxZTcwO1xuICB0LlRjb21tYWFjY2VudCA9IDB4MDE2MjtcbiAgdC5UZG90YWNjZW50ID0gMHgxZTZhO1xuICB0LlRkb3RiZWxvdyA9IDB4MWU2YztcbiAgdC5UZWN5cmlsbGljID0gMHgwNDIyO1xuICB0LlRlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWM7XG4gIHQuVGVucm9tYW4gPSAweDIxNjk7XG4gIHQuVGV0c2VjeXJpbGxpYyA9IDB4MDRiNDtcbiAgdC5UaGV0YSA9IDB4MDM5ODtcbiAgdC5UaG9vayA9IDB4MDFhYztcbiAgdC5UaG9ybiA9IDB4MDBkZTtcbiAgdC5UaG9ybnNtYWxsID0gMHhmN2ZlO1xuICB0LlRocmVlcm9tYW4gPSAweDIxNjI7XG4gIHQuVGlsZGVzbWFsbCA9IDB4ZjZmZTtcbiAgdC5UaXduYXJtZW5pYW4gPSAweDA1NGY7XG4gIHQuVGxpbmViZWxvdyA9IDB4MWU2ZTtcbiAgdC5UbW9ub3NwYWNlID0gMHhmZjM0O1xuICB0LlRvYXJtZW5pYW4gPSAweDA1Mzk7XG4gIHQuVG9uZWZpdmUgPSAweDAxYmM7XG4gIHQuVG9uZXNpeCA9IDB4MDE4NDtcbiAgdC5Ub25ldHdvID0gMHgwMWE3O1xuICB0LlRyZXRyb2ZsZXhob29rID0gMHgwMWFlO1xuICB0LlRzZWN5cmlsbGljID0gMHgwNDI2O1xuICB0LlRzaGVjeXJpbGxpYyA9IDB4MDQwYjtcbiAgdC5Uc21hbGwgPSAweGY3NzQ7XG4gIHQuVHdlbHZlcm9tYW4gPSAweDIxNmI7XG4gIHQuVHdvcm9tYW4gPSAweDIxNjE7XG4gIHQuVSA9IDB4MDA1NTtcbiAgdC5VYWN1dGUgPSAweDAwZGE7XG4gIHQuVWFjdXRlc21hbGwgPSAweGY3ZmE7XG4gIHQuVWJyZXZlID0gMHgwMTZjO1xuICB0LlVjYXJvbiA9IDB4MDFkMztcbiAgdC5VY2lyY2xlID0gMHgyNGNhO1xuICB0LlVjaXJjdW1mbGV4ID0gMHgwMGRiO1xuICB0LlVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzY7XG4gIHQuVWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdmYjtcbiAgdC5VY3lyaWxsaWMgPSAweDA0MjM7XG4gIHQuVWRibGFjdXRlID0gMHgwMTcwO1xuICB0LlVkYmxncmF2ZSA9IDB4MDIxNDtcbiAgdC5VZGllcmVzaXMgPSAweDAwZGM7XG4gIHQuVWRpZXJlc2lzYWN1dGUgPSAweDAxZDc7XG4gIHQuVWRpZXJlc2lzYmVsb3cgPSAweDFlNzI7XG4gIHQuVWRpZXJlc2lzY2Fyb24gPSAweDAxZDk7XG4gIHQuVWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjA7XG4gIHQuVWRpZXJlc2lzZ3JhdmUgPSAweDAxZGI7XG4gIHQuVWRpZXJlc2lzbWFjcm9uID0gMHgwMWQ1O1xuICB0LlVkaWVyZXNpc3NtYWxsID0gMHhmN2ZjO1xuICB0LlVkb3RiZWxvdyA9IDB4MWVlNDtcbiAgdC5VZ3JhdmUgPSAweDAwZDk7XG4gIHQuVWdyYXZlc21hbGwgPSAweGY3Zjk7XG4gIHQuVWhvb2thYm92ZSA9IDB4MWVlNjtcbiAgdC5VaG9ybiA9IDB4MDFhZjtcbiAgdC5VaG9ybmFjdXRlID0gMHgxZWU4O1xuICB0LlVob3JuZG90YmVsb3cgPSAweDFlZjA7XG4gIHQuVWhvcm5ncmF2ZSA9IDB4MWVlYTtcbiAgdC5VaG9ybmhvb2thYm92ZSA9IDB4MWVlYztcbiAgdC5VaG9ybnRpbGRlID0gMHgxZWVlO1xuICB0LlVodW5nYXJ1bWxhdXQgPSAweDAxNzA7XG4gIHQuVWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYyO1xuICB0LlVpbnZlcnRlZGJyZXZlID0gMHgwMjE2O1xuICB0LlVrY3lyaWxsaWMgPSAweDA0Nzg7XG4gIHQuVW1hY3JvbiA9IDB4MDE2YTtcbiAgdC5VbWFjcm9uY3lyaWxsaWMgPSAweDA0ZWU7XG4gIHQuVW1hY3JvbmRpZXJlc2lzID0gMHgxZTdhO1xuICB0LlVtb25vc3BhY2UgPSAweGZmMzU7XG4gIHQuVW9nb25layA9IDB4MDE3MjtcbiAgdC5VcHNpbG9uID0gMHgwM2E1O1xuICB0LlVwc2lsb24xID0gMHgwM2QyO1xuICB0LlVwc2lsb25hY3V0ZWhvb2tzeW1ib2xncmVlayA9IDB4MDNkMztcbiAgdC5VcHNpbG9uYWZyaWNhbiA9IDB4MDFiMTtcbiAgdC5VcHNpbG9uZGllcmVzaXMgPSAweDAzYWI7XG4gIHQuVXBzaWxvbmRpZXJlc2lzaG9va3N5bWJvbGdyZWVrID0gMHgwM2Q0O1xuICB0LlVwc2lsb25ob29rc3ltYm9sID0gMHgwM2QyO1xuICB0LlVwc2lsb250b25vcyA9IDB4MDM4ZTtcbiAgdC5VcmluZyA9IDB4MDE2ZTtcbiAgdC5Vc2hvcnRjeXJpbGxpYyA9IDB4MDQwZTtcbiAgdC5Vc21hbGwgPSAweGY3NzU7XG4gIHQuVXN0cmFpZ2h0Y3lyaWxsaWMgPSAweDA0YWU7XG4gIHQuVXN0cmFpZ2h0c3Ryb2tlY3lyaWxsaWMgPSAweDA0YjA7XG4gIHQuVXRpbGRlID0gMHgwMTY4O1xuICB0LlV0aWxkZWFjdXRlID0gMHgxZTc4O1xuICB0LlV0aWxkZWJlbG93ID0gMHgxZTc0O1xuICB0LlYgPSAweDAwNTY7XG4gIHQuVmNpcmNsZSA9IDB4MjRjYjtcbiAgdC5WZG90YmVsb3cgPSAweDFlN2U7XG4gIHQuVmVjeXJpbGxpYyA9IDB4MDQxMjtcbiAgdC5WZXdhcm1lbmlhbiA9IDB4MDU0ZTtcbiAgdC5WaG9vayA9IDB4MDFiMjtcbiAgdC5WbW9ub3NwYWNlID0gMHhmZjM2O1xuICB0LlZvYXJtZW5pYW4gPSAweDA1NDg7XG4gIHQuVnNtYWxsID0gMHhmNzc2O1xuICB0LlZ0aWxkZSA9IDB4MWU3YztcbiAgdC5XID0gMHgwMDU3O1xuICB0LldhY3V0ZSA9IDB4MWU4MjtcbiAgdC5XY2lyY2xlID0gMHgyNGNjO1xuICB0LldjaXJjdW1mbGV4ID0gMHgwMTc0O1xuICB0LldkaWVyZXNpcyA9IDB4MWU4NDtcbiAgdC5XZG90YWNjZW50ID0gMHgxZTg2O1xuICB0Lldkb3RiZWxvdyA9IDB4MWU4ODtcbiAgdC5XZ3JhdmUgPSAweDFlODA7XG4gIHQuV21vbm9zcGFjZSA9IDB4ZmYzNztcbiAgdC5Xc21hbGwgPSAweGY3Nzc7XG4gIHQuWCA9IDB4MDA1ODtcbiAgdC5YY2lyY2xlID0gMHgyNGNkO1xuICB0LlhkaWVyZXNpcyA9IDB4MWU4YztcbiAgdC5YZG90YWNjZW50ID0gMHgxZThhO1xuICB0LlhlaGFybWVuaWFuID0gMHgwNTNkO1xuICB0LlhpID0gMHgwMzllO1xuICB0Llhtb25vc3BhY2UgPSAweGZmMzg7XG4gIHQuWHNtYWxsID0gMHhmNzc4O1xuICB0LlkgPSAweDAwNTk7XG4gIHQuWWFjdXRlID0gMHgwMGRkO1xuICB0LllhY3V0ZXNtYWxsID0gMHhmN2ZkO1xuICB0LllhdGN5cmlsbGljID0gMHgwNDYyO1xuICB0LlljaXJjbGUgPSAweDI0Y2U7XG4gIHQuWWNpcmN1bWZsZXggPSAweDAxNzY7XG4gIHQuWWRpZXJlc2lzID0gMHgwMTc4O1xuICB0LllkaWVyZXNpc3NtYWxsID0gMHhmN2ZmO1xuICB0Lllkb3RhY2NlbnQgPSAweDFlOGU7XG4gIHQuWWRvdGJlbG93ID0gMHgxZWY0O1xuICB0LlllcmljeXJpbGxpYyA9IDB4MDQyYjtcbiAgdC5ZZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmODtcbiAgdC5ZZ3JhdmUgPSAweDFlZjI7XG4gIHQuWWhvb2sgPSAweDAxYjM7XG4gIHQuWWhvb2thYm92ZSA9IDB4MWVmNjtcbiAgdC5ZaWFybWVuaWFuID0gMHgwNTQ1O1xuICB0LllpY3lyaWxsaWMgPSAweDA0MDc7XG4gIHQuWWl3bmFybWVuaWFuID0gMHgwNTUyO1xuICB0Llltb25vc3BhY2UgPSAweGZmMzk7XG4gIHQuWXNtYWxsID0gMHhmNzc5O1xuICB0Lll0aWxkZSA9IDB4MWVmODtcbiAgdC5ZdXNiaWdjeXJpbGxpYyA9IDB4MDQ2YTtcbiAgdC5ZdXNiaWdpb3RpZmllZGN5cmlsbGljID0gMHgwNDZjO1xuICB0Lll1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY2O1xuICB0Lll1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njg7XG4gIHQuWiA9IDB4MDA1YTtcbiAgdC5aYWFybWVuaWFuID0gMHgwNTM2O1xuICB0LlphY3V0ZSA9IDB4MDE3OTtcbiAgdC5aY2Fyb24gPSAweDAxN2Q7XG4gIHQuWmNhcm9uc21hbGwgPSAweGY2ZmY7XG4gIHQuWmNpcmNsZSA9IDB4MjRjZjtcbiAgdC5aY2lyY3VtZmxleCA9IDB4MWU5MDtcbiAgdC5aZG90ID0gMHgwMTdiO1xuICB0Llpkb3RhY2NlbnQgPSAweDAxN2I7XG4gIHQuWmRvdGJlbG93ID0gMHgxZTkyO1xuICB0LlplY3lyaWxsaWMgPSAweDA0MTc7XG4gIHQuWmVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5ODtcbiAgdC5aZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGU7XG4gIHQuWmV0YSA9IDB4MDM5NjtcbiAgdC5aaGVhcm1lbmlhbiA9IDB4MDUzYTtcbiAgdC5aaGVicmV2ZWN5cmlsbGljID0gMHgwNGMxO1xuICB0LlpoZWN5cmlsbGljID0gMHgwNDE2O1xuICB0LlpoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk2O1xuICB0LlpoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGM7XG4gIHQuWmxpbmViZWxvdyA9IDB4MWU5NDtcbiAgdC5abW9ub3NwYWNlID0gMHhmZjNhO1xuICB0LlpzbWFsbCA9IDB4Zjc3YTtcbiAgdC5ac3Ryb2tlID0gMHgwMWI1O1xuICB0LmEgPSAweDAwNjE7XG4gIHQuYWFiZW5nYWxpID0gMHgwOTg2O1xuICB0LmFhY3V0ZSA9IDB4MDBlMTtcbiAgdC5hYWRldmEgPSAweDA5MDY7XG4gIHQuYWFndWphcmF0aSA9IDB4MGE4NjtcbiAgdC5hYWd1cm11a2hpID0gMHgwYTA2O1xuICB0LmFhbWF0cmFndXJtdWtoaSA9IDB4MGEzZTtcbiAgdC5hYXJ1c3F1YXJlID0gMHgzMzAzO1xuICB0LmFhdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZTtcbiAgdC5hYXZvd2Vsc2lnbmRldmEgPSAweDA5M2U7XG4gIHQuYWF2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFiZTtcbiAgdC5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4gPSAweDA1NWY7XG4gIHQuYWJicmV2aWF0aW9uc2lnbmRldmEgPSAweDA5NzA7XG4gIHQuYWJlbmdhbGkgPSAweDA5ODU7XG4gIHQuYWJvcG9tb2ZvID0gMHgzMTFhO1xuICB0LmFicmV2ZSA9IDB4MDEwMztcbiAgdC5hYnJldmVhY3V0ZSA9IDB4MWVhZjtcbiAgdC5hYnJldmVjeXJpbGxpYyA9IDB4MDRkMTtcbiAgdC5hYnJldmVkb3RiZWxvdyA9IDB4MWViNztcbiAgdC5hYnJldmVncmF2ZSA9IDB4MWViMTtcbiAgdC5hYnJldmVob29rYWJvdmUgPSAweDFlYjM7XG4gIHQuYWJyZXZldGlsZGUgPSAweDFlYjU7XG4gIHQuYWNhcm9uID0gMHgwMWNlO1xuICB0LmFjaXJjbGUgPSAweDI0ZDA7XG4gIHQuYWNpcmN1bWZsZXggPSAweDAwZTI7XG4gIHQuYWNpcmN1bWZsZXhhY3V0ZSA9IDB4MWVhNTtcbiAgdC5hY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFkO1xuICB0LmFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTc7XG4gIHQuYWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYTk7XG4gIHQuYWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVhYjtcbiAgdC5hY3V0ZSA9IDB4MDBiNDtcbiAgdC5hY3V0ZWJlbG93Y21iID0gMHgwMzE3O1xuICB0LmFjdXRlY21iID0gMHgwMzAxO1xuICB0LmFjdXRlY29tYiA9IDB4MDMwMTtcbiAgdC5hY3V0ZWRldmEgPSAweDA5NTQ7XG4gIHQuYWN1dGVsb3dtb2QgPSAweDAyY2Y7XG4gIHQuYWN1dGV0b25lY21iID0gMHgwMzQxO1xuICB0LmFjeXJpbGxpYyA9IDB4MDQzMDtcbiAgdC5hZGJsZ3JhdmUgPSAweDAyMDE7XG4gIHQuYWRkYWtndXJtdWtoaSA9IDB4MGE3MTtcbiAgdC5hZGV2YSA9IDB4MDkwNTtcbiAgdC5hZGllcmVzaXMgPSAweDAwZTQ7XG4gIHQuYWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDM7XG4gIHQuYWRpZXJlc2lzbWFjcm9uID0gMHgwMWRmO1xuICB0LmFkb3RiZWxvdyA9IDB4MWVhMTtcbiAgdC5hZG90bWFjcm9uID0gMHgwMWUxO1xuICB0LmFlID0gMHgwMGU2O1xuICB0LmFlYWN1dGUgPSAweDAxZmQ7XG4gIHQuYWVrb3JlYW4gPSAweDMxNTA7XG4gIHQuYWVtYWNyb24gPSAweDAxZTM7XG4gIHQuYWZpaTAwMjA4ID0gMHgyMDE1O1xuICB0LmFmaWkwODk0MSA9IDB4MjBhNDtcbiAgdC5hZmlpMTAwMTcgPSAweDA0MTA7XG4gIHQuYWZpaTEwMDE4ID0gMHgwNDExO1xuICB0LmFmaWkxMDAxOSA9IDB4MDQxMjtcbiAgdC5hZmlpMTAwMjAgPSAweDA0MTM7XG4gIHQuYWZpaTEwMDIxID0gMHgwNDE0O1xuICB0LmFmaWkxMDAyMiA9IDB4MDQxNTtcbiAgdC5hZmlpMTAwMjMgPSAweDA0MDE7XG4gIHQuYWZpaTEwMDI0ID0gMHgwNDE2O1xuICB0LmFmaWkxMDAyNSA9IDB4MDQxNztcbiAgdC5hZmlpMTAwMjYgPSAweDA0MTg7XG4gIHQuYWZpaTEwMDI3ID0gMHgwNDE5O1xuICB0LmFmaWkxMDAyOCA9IDB4MDQxYTtcbiAgdC5hZmlpMTAwMjkgPSAweDA0MWI7XG4gIHQuYWZpaTEwMDMwID0gMHgwNDFjO1xuICB0LmFmaWkxMDAzMSA9IDB4MDQxZDtcbiAgdC5hZmlpMTAwMzIgPSAweDA0MWU7XG4gIHQuYWZpaTEwMDMzID0gMHgwNDFmO1xuICB0LmFmaWkxMDAzNCA9IDB4MDQyMDtcbiAgdC5hZmlpMTAwMzUgPSAweDA0MjE7XG4gIHQuYWZpaTEwMDM2ID0gMHgwNDIyO1xuICB0LmFmaWkxMDAzNyA9IDB4MDQyMztcbiAgdC5hZmlpMTAwMzggPSAweDA0MjQ7XG4gIHQuYWZpaTEwMDM5ID0gMHgwNDI1O1xuICB0LmFmaWkxMDA0MCA9IDB4MDQyNjtcbiAgdC5hZmlpMTAwNDEgPSAweDA0Mjc7XG4gIHQuYWZpaTEwMDQyID0gMHgwNDI4O1xuICB0LmFmaWkxMDA0MyA9IDB4MDQyOTtcbiAgdC5hZmlpMTAwNDQgPSAweDA0MmE7XG4gIHQuYWZpaTEwMDQ1ID0gMHgwNDJiO1xuICB0LmFmaWkxMDA0NiA9IDB4MDQyYztcbiAgdC5hZmlpMTAwNDcgPSAweDA0MmQ7XG4gIHQuYWZpaTEwMDQ4ID0gMHgwNDJlO1xuICB0LmFmaWkxMDA0OSA9IDB4MDQyZjtcbiAgdC5hZmlpMTAwNTAgPSAweDA0OTA7XG4gIHQuYWZpaTEwMDUxID0gMHgwNDAyO1xuICB0LmFmaWkxMDA1MiA9IDB4MDQwMztcbiAgdC5hZmlpMTAwNTMgPSAweDA0MDQ7XG4gIHQuYWZpaTEwMDU0ID0gMHgwNDA1O1xuICB0LmFmaWkxMDA1NSA9IDB4MDQwNjtcbiAgdC5hZmlpMTAwNTYgPSAweDA0MDc7XG4gIHQuYWZpaTEwMDU3ID0gMHgwNDA4O1xuICB0LmFmaWkxMDA1OCA9IDB4MDQwOTtcbiAgdC5hZmlpMTAwNTkgPSAweDA0MGE7XG4gIHQuYWZpaTEwMDYwID0gMHgwNDBiO1xuICB0LmFmaWkxMDA2MSA9IDB4MDQwYztcbiAgdC5hZmlpMTAwNjIgPSAweDA0MGU7XG4gIHQuYWZpaTEwMDYzID0gMHhmNmM0O1xuICB0LmFmaWkxMDA2NCA9IDB4ZjZjNTtcbiAgdC5hZmlpMTAwNjUgPSAweDA0MzA7XG4gIHQuYWZpaTEwMDY2ID0gMHgwNDMxO1xuICB0LmFmaWkxMDA2NyA9IDB4MDQzMjtcbiAgdC5hZmlpMTAwNjggPSAweDA0MzM7XG4gIHQuYWZpaTEwMDY5ID0gMHgwNDM0O1xuICB0LmFmaWkxMDA3MCA9IDB4MDQzNTtcbiAgdC5hZmlpMTAwNzEgPSAweDA0NTE7XG4gIHQuYWZpaTEwMDcyID0gMHgwNDM2O1xuICB0LmFmaWkxMDA3MyA9IDB4MDQzNztcbiAgdC5hZmlpMTAwNzQgPSAweDA0Mzg7XG4gIHQuYWZpaTEwMDc1ID0gMHgwNDM5O1xuICB0LmFmaWkxMDA3NiA9IDB4MDQzYTtcbiAgdC5hZmlpMTAwNzcgPSAweDA0M2I7XG4gIHQuYWZpaTEwMDc4ID0gMHgwNDNjO1xuICB0LmFmaWkxMDA3OSA9IDB4MDQzZDtcbiAgdC5hZmlpMTAwODAgPSAweDA0M2U7XG4gIHQuYWZpaTEwMDgxID0gMHgwNDNmO1xuICB0LmFmaWkxMDA4MiA9IDB4MDQ0MDtcbiAgdC5hZmlpMTAwODMgPSAweDA0NDE7XG4gIHQuYWZpaTEwMDg0ID0gMHgwNDQyO1xuICB0LmFmaWkxMDA4NSA9IDB4MDQ0MztcbiAgdC5hZmlpMTAwODYgPSAweDA0NDQ7XG4gIHQuYWZpaTEwMDg3ID0gMHgwNDQ1O1xuICB0LmFmaWkxMDA4OCA9IDB4MDQ0NjtcbiAgdC5hZmlpMTAwODkgPSAweDA0NDc7XG4gIHQuYWZpaTEwMDkwID0gMHgwNDQ4O1xuICB0LmFmaWkxMDA5MSA9IDB4MDQ0OTtcbiAgdC5hZmlpMTAwOTIgPSAweDA0NGE7XG4gIHQuYWZpaTEwMDkzID0gMHgwNDRiO1xuICB0LmFmaWkxMDA5NCA9IDB4MDQ0YztcbiAgdC5hZmlpMTAwOTUgPSAweDA0NGQ7XG4gIHQuYWZpaTEwMDk2ID0gMHgwNDRlO1xuICB0LmFmaWkxMDA5NyA9IDB4MDQ0ZjtcbiAgdC5hZmlpMTAwOTggPSAweDA0OTE7XG4gIHQuYWZpaTEwMDk5ID0gMHgwNDUyO1xuICB0LmFmaWkxMDEwMCA9IDB4MDQ1MztcbiAgdC5hZmlpMTAxMDEgPSAweDA0NTQ7XG4gIHQuYWZpaTEwMTAyID0gMHgwNDU1O1xuICB0LmFmaWkxMDEwMyA9IDB4MDQ1NjtcbiAgdC5hZmlpMTAxMDQgPSAweDA0NTc7XG4gIHQuYWZpaTEwMTA1ID0gMHgwNDU4O1xuICB0LmFmaWkxMDEwNiA9IDB4MDQ1OTtcbiAgdC5hZmlpMTAxMDcgPSAweDA0NWE7XG4gIHQuYWZpaTEwMTA4ID0gMHgwNDViO1xuICB0LmFmaWkxMDEwOSA9IDB4MDQ1YztcbiAgdC5hZmlpMTAxMTAgPSAweDA0NWU7XG4gIHQuYWZpaTEwMTQ1ID0gMHgwNDBmO1xuICB0LmFmaWkxMDE0NiA9IDB4MDQ2MjtcbiAgdC5hZmlpMTAxNDcgPSAweDA0NzI7XG4gIHQuYWZpaTEwMTQ4ID0gMHgwNDc0O1xuICB0LmFmaWkxMDE5MiA9IDB4ZjZjNjtcbiAgdC5hZmlpMTAxOTMgPSAweDA0NWY7XG4gIHQuYWZpaTEwMTk0ID0gMHgwNDYzO1xuICB0LmFmaWkxMDE5NSA9IDB4MDQ3MztcbiAgdC5hZmlpMTAxOTYgPSAweDA0NzU7XG4gIHQuYWZpaTEwODMxID0gMHhmNmM3O1xuICB0LmFmaWkxMDgzMiA9IDB4ZjZjODtcbiAgdC5hZmlpMTA4NDYgPSAweDA0ZDk7XG4gIHQuYWZpaTI5OSA9IDB4MjAwZTtcbiAgdC5hZmlpMzAwID0gMHgyMDBmO1xuICB0LmFmaWkzMDEgPSAweDIwMGQ7XG4gIHQuYWZpaTU3MzgxID0gMHgwNjZhO1xuICB0LmFmaWk1NzM4OCA9IDB4MDYwYztcbiAgdC5hZmlpNTczOTIgPSAweDA2NjA7XG4gIHQuYWZpaTU3MzkzID0gMHgwNjYxO1xuICB0LmFmaWk1NzM5NCA9IDB4MDY2MjtcbiAgdC5hZmlpNTczOTUgPSAweDA2NjM7XG4gIHQuYWZpaTU3Mzk2ID0gMHgwNjY0O1xuICB0LmFmaWk1NzM5NyA9IDB4MDY2NTtcbiAgdC5hZmlpNTczOTggPSAweDA2NjY7XG4gIHQuYWZpaTU3Mzk5ID0gMHgwNjY3O1xuICB0LmFmaWk1NzQwMCA9IDB4MDY2ODtcbiAgdC5hZmlpNTc0MDEgPSAweDA2Njk7XG4gIHQuYWZpaTU3NDAzID0gMHgwNjFiO1xuICB0LmFmaWk1NzQwNyA9IDB4MDYxZjtcbiAgdC5hZmlpNTc0MDkgPSAweDA2MjE7XG4gIHQuYWZpaTU3NDEwID0gMHgwNjIyO1xuICB0LmFmaWk1NzQxMSA9IDB4MDYyMztcbiAgdC5hZmlpNTc0MTIgPSAweDA2MjQ7XG4gIHQuYWZpaTU3NDEzID0gMHgwNjI1O1xuICB0LmFmaWk1NzQxNCA9IDB4MDYyNjtcbiAgdC5hZmlpNTc0MTUgPSAweDA2Mjc7XG4gIHQuYWZpaTU3NDE2ID0gMHgwNjI4O1xuICB0LmFmaWk1NzQxNyA9IDB4MDYyOTtcbiAgdC5hZmlpNTc0MTggPSAweDA2MmE7XG4gIHQuYWZpaTU3NDE5ID0gMHgwNjJiO1xuICB0LmFmaWk1NzQyMCA9IDB4MDYyYztcbiAgdC5hZmlpNTc0MjEgPSAweDA2MmQ7XG4gIHQuYWZpaTU3NDIyID0gMHgwNjJlO1xuICB0LmFmaWk1NzQyMyA9IDB4MDYyZjtcbiAgdC5hZmlpNTc0MjQgPSAweDA2MzA7XG4gIHQuYWZpaTU3NDI1ID0gMHgwNjMxO1xuICB0LmFmaWk1NzQyNiA9IDB4MDYzMjtcbiAgdC5hZmlpNTc0MjcgPSAweDA2MzM7XG4gIHQuYWZpaTU3NDI4ID0gMHgwNjM0O1xuICB0LmFmaWk1NzQyOSA9IDB4MDYzNTtcbiAgdC5hZmlpNTc0MzAgPSAweDA2MzY7XG4gIHQuYWZpaTU3NDMxID0gMHgwNjM3O1xuICB0LmFmaWk1NzQzMiA9IDB4MDYzODtcbiAgdC5hZmlpNTc0MzMgPSAweDA2Mzk7XG4gIHQuYWZpaTU3NDM0ID0gMHgwNjNhO1xuICB0LmFmaWk1NzQ0MCA9IDB4MDY0MDtcbiAgdC5hZmlpNTc0NDEgPSAweDA2NDE7XG4gIHQuYWZpaTU3NDQyID0gMHgwNjQyO1xuICB0LmFmaWk1NzQ0MyA9IDB4MDY0MztcbiAgdC5hZmlpNTc0NDQgPSAweDA2NDQ7XG4gIHQuYWZpaTU3NDQ1ID0gMHgwNjQ1O1xuICB0LmFmaWk1NzQ0NiA9IDB4MDY0NjtcbiAgdC5hZmlpNTc0NDggPSAweDA2NDg7XG4gIHQuYWZpaTU3NDQ5ID0gMHgwNjQ5O1xuICB0LmFmaWk1NzQ1MCA9IDB4MDY0YTtcbiAgdC5hZmlpNTc0NTEgPSAweDA2NGI7XG4gIHQuYWZpaTU3NDUyID0gMHgwNjRjO1xuICB0LmFmaWk1NzQ1MyA9IDB4MDY0ZDtcbiAgdC5hZmlpNTc0NTQgPSAweDA2NGU7XG4gIHQuYWZpaTU3NDU1ID0gMHgwNjRmO1xuICB0LmFmaWk1NzQ1NiA9IDB4MDY1MDtcbiAgdC5hZmlpNTc0NTcgPSAweDA2NTE7XG4gIHQuYWZpaTU3NDU4ID0gMHgwNjUyO1xuICB0LmFmaWk1NzQ3MCA9IDB4MDY0NztcbiAgdC5hZmlpNTc1MDUgPSAweDA2YTQ7XG4gIHQuYWZpaTU3NTA2ID0gMHgwNjdlO1xuICB0LmFmaWk1NzUwNyA9IDB4MDY4NjtcbiAgdC5hZmlpNTc1MDggPSAweDA2OTg7XG4gIHQuYWZpaTU3NTA5ID0gMHgwNmFmO1xuICB0LmFmaWk1NzUxMSA9IDB4MDY3OTtcbiAgdC5hZmlpNTc1MTIgPSAweDA2ODg7XG4gIHQuYWZpaTU3NTEzID0gMHgwNjkxO1xuICB0LmFmaWk1NzUxNCA9IDB4MDZiYTtcbiAgdC5hZmlpNTc1MTkgPSAweDA2ZDI7XG4gIHQuYWZpaTU3NTM0ID0gMHgwNmQ1O1xuICB0LmFmaWk1NzYzNiA9IDB4MjBhYTtcbiAgdC5hZmlpNTc2NDUgPSAweDA1YmU7XG4gIHQuYWZpaTU3NjU4ID0gMHgwNWMzO1xuICB0LmFmaWk1NzY2NCA9IDB4MDVkMDtcbiAgdC5hZmlpNTc2NjUgPSAweDA1ZDE7XG4gIHQuYWZpaTU3NjY2ID0gMHgwNWQyO1xuICB0LmFmaWk1NzY2NyA9IDB4MDVkMztcbiAgdC5hZmlpNTc2NjggPSAweDA1ZDQ7XG4gIHQuYWZpaTU3NjY5ID0gMHgwNWQ1O1xuICB0LmFmaWk1NzY3MCA9IDB4MDVkNjtcbiAgdC5hZmlpNTc2NzEgPSAweDA1ZDc7XG4gIHQuYWZpaTU3NjcyID0gMHgwNWQ4O1xuICB0LmFmaWk1NzY3MyA9IDB4MDVkOTtcbiAgdC5hZmlpNTc2NzQgPSAweDA1ZGE7XG4gIHQuYWZpaTU3Njc1ID0gMHgwNWRiO1xuICB0LmFmaWk1NzY3NiA9IDB4MDVkYztcbiAgdC5hZmlpNTc2NzcgPSAweDA1ZGQ7XG4gIHQuYWZpaTU3Njc4ID0gMHgwNWRlO1xuICB0LmFmaWk1NzY3OSA9IDB4MDVkZjtcbiAgdC5hZmlpNTc2ODAgPSAweDA1ZTA7XG4gIHQuYWZpaTU3NjgxID0gMHgwNWUxO1xuICB0LmFmaWk1NzY4MiA9IDB4MDVlMjtcbiAgdC5hZmlpNTc2ODMgPSAweDA1ZTM7XG4gIHQuYWZpaTU3Njg0ID0gMHgwNWU0O1xuICB0LmFmaWk1NzY4NSA9IDB4MDVlNTtcbiAgdC5hZmlpNTc2ODYgPSAweDA1ZTY7XG4gIHQuYWZpaTU3Njg3ID0gMHgwNWU3O1xuICB0LmFmaWk1NzY4OCA9IDB4MDVlODtcbiAgdC5hZmlpNTc2ODkgPSAweDA1ZTk7XG4gIHQuYWZpaTU3NjkwID0gMHgwNWVhO1xuICB0LmFmaWk1NzY5NCA9IDB4ZmIyYTtcbiAgdC5hZmlpNTc2OTUgPSAweGZiMmI7XG4gIHQuYWZpaTU3NzAwID0gMHhmYjRiO1xuICB0LmFmaWk1NzcwNSA9IDB4ZmIxZjtcbiAgdC5hZmlpNTc3MTYgPSAweDA1ZjA7XG4gIHQuYWZpaTU3NzE3ID0gMHgwNWYxO1xuICB0LmFmaWk1NzcxOCA9IDB4MDVmMjtcbiAgdC5hZmlpNTc3MjMgPSAweGZiMzU7XG4gIHQuYWZpaTU3NzkzID0gMHgwNWI0O1xuICB0LmFmaWk1Nzc5NCA9IDB4MDViNTtcbiAgdC5hZmlpNTc3OTUgPSAweDA1YjY7XG4gIHQuYWZpaTU3Nzk2ID0gMHgwNWJiO1xuICB0LmFmaWk1Nzc5NyA9IDB4MDViODtcbiAgdC5hZmlpNTc3OTggPSAweDA1Yjc7XG4gIHQuYWZpaTU3Nzk5ID0gMHgwNWIwO1xuICB0LmFmaWk1NzgwMCA9IDB4MDViMjtcbiAgdC5hZmlpNTc4MDEgPSAweDA1YjE7XG4gIHQuYWZpaTU3ODAyID0gMHgwNWIzO1xuICB0LmFmaWk1NzgwMyA9IDB4MDVjMjtcbiAgdC5hZmlpNTc4MDQgPSAweDA1YzE7XG4gIHQuYWZpaTU3ODA2ID0gMHgwNWI5O1xuICB0LmFmaWk1NzgwNyA9IDB4MDViYztcbiAgdC5hZmlpNTc4MzkgPSAweDA1YmQ7XG4gIHQuYWZpaTU3ODQxID0gMHgwNWJmO1xuICB0LmFmaWk1Nzg0MiA9IDB4MDVjMDtcbiAgdC5hZmlpNTc5MjkgPSAweDAyYmM7XG4gIHQuYWZpaTYxMjQ4ID0gMHgyMTA1O1xuICB0LmFmaWk2MTI4OSA9IDB4MjExMztcbiAgdC5hZmlpNjEzNTIgPSAweDIxMTY7XG4gIHQuYWZpaTYxNTczID0gMHgyMDJjO1xuICB0LmFmaWk2MTU3NCA9IDB4MjAyZDtcbiAgdC5hZmlpNjE1NzUgPSAweDIwMmU7XG4gIHQuYWZpaTYxNjY0ID0gMHgyMDBjO1xuICB0LmFmaWk2MzE2NyA9IDB4MDY2ZDtcbiAgdC5hZmlpNjQ5MzcgPSAweDAyYmQ7XG4gIHQuYWdyYXZlID0gMHgwMGUwO1xuICB0LmFndWphcmF0aSA9IDB4MGE4NTtcbiAgdC5hZ3VybXVraGkgPSAweDBhMDU7XG4gIHQuYWhpcmFnYW5hID0gMHgzMDQyO1xuICB0LmFob29rYWJvdmUgPSAweDFlYTM7XG4gIHQuYWliZW5nYWxpID0gMHgwOTkwO1xuICB0LmFpYm9wb21vZm8gPSAweDMxMWU7XG4gIHQuYWlkZXZhID0gMHgwOTEwO1xuICB0LmFpZWN5cmlsbGljID0gMHgwNGQ1O1xuICB0LmFpZ3VqYXJhdGkgPSAweDBhOTA7XG4gIHQuYWlndXJtdWtoaSA9IDB4MGExMDtcbiAgdC5haW1hdHJhZ3VybXVraGkgPSAweDBhNDg7XG4gIHQuYWluYXJhYmljID0gMHgwNjM5O1xuICB0LmFpbmZpbmFsYXJhYmljID0gMHhmZWNhO1xuICB0LmFpbmluaXRpYWxhcmFiaWMgPSAweGZlY2I7XG4gIHQuYWlubWVkaWFsYXJhYmljID0gMHhmZWNjO1xuICB0LmFpbnZlcnRlZGJyZXZlID0gMHgwMjAzO1xuICB0LmFpdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljODtcbiAgdC5haXZvd2Vsc2lnbmRldmEgPSAweDA5NDg7XG4gIHQuYWl2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjODtcbiAgdC5ha2F0YWthbmEgPSAweDMwYTI7XG4gIHQuYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcxO1xuICB0LmFrb3JlYW4gPSAweDMxNGY7XG4gIHQuYWxlZiA9IDB4MDVkMDtcbiAgdC5hbGVmYXJhYmljID0gMHgwNjI3O1xuICB0LmFsZWZkYWdlc2hoZWJyZXcgPSAweGZiMzA7XG4gIHQuYWxlZmZpbmFsYXJhYmljID0gMHhmZThlO1xuICB0LmFsZWZoYW16YWFib3ZlYXJhYmljID0gMHgwNjIzO1xuICB0LmFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODQ7XG4gIHQuYWxlZmhhbXphYmVsb3dhcmFiaWMgPSAweDA2MjU7XG4gIHQuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmU4ODtcbiAgdC5hbGVmaGVicmV3ID0gMHgwNWQwO1xuICB0LmFsZWZsYW1lZGhlYnJldyA9IDB4ZmI0ZjtcbiAgdC5hbGVmbWFkZGFhYm92ZWFyYWJpYyA9IDB4MDYyMjtcbiAgdC5hbGVmbWFkZGFhYm92ZWZpbmFsYXJhYmljID0gMHhmZTgyO1xuICB0LmFsZWZtYWtzdXJhYXJhYmljID0gMHgwNjQ5O1xuICB0LmFsZWZtYWtzdXJhZmluYWxhcmFiaWMgPSAweGZlZjA7XG4gIHQuYWxlZm1ha3N1cmFpbml0aWFsYXJhYmljID0gMHhmZWYzO1xuICB0LmFsZWZtYWtzdXJhbWVkaWFsYXJhYmljID0gMHhmZWY0O1xuICB0LmFsZWZwYXRhaGhlYnJldyA9IDB4ZmIyZTtcbiAgdC5hbGVmcWFtYXRzaGVicmV3ID0gMHhmYjJmO1xuICB0LmFsZXBoID0gMHgyMTM1O1xuICB0LmFsbGVxdWFsID0gMHgyMjRjO1xuICB0LmFscGhhID0gMHgwM2IxO1xuICB0LmFscGhhdG9ub3MgPSAweDAzYWM7XG4gIHQuYW1hY3JvbiA9IDB4MDEwMTtcbiAgdC5hbW9ub3NwYWNlID0gMHhmZjQxO1xuICB0LmFtcGVyc2FuZCA9IDB4MDAyNjtcbiAgdC5hbXBlcnNhbmRtb25vc3BhY2UgPSAweGZmMDY7XG4gIHQuYW1wZXJzYW5kc21hbGwgPSAweGY3MjY7XG4gIHQuYW1zcXVhcmUgPSAweDMzYzI7XG4gIHQuYW5ib3BvbW9mbyA9IDB4MzEyMjtcbiAgdC5hbmdib3BvbW9mbyA9IDB4MzEyNDtcbiAgdC5hbmdicmFja2V0bGVmdCA9IDB4MzAwODsgLy8gR2x5cGggaXMgbWlzc2luZyBmcm9tIEFkb2JlJ3Mgb3JpZ2luYWwgbGlzdC5cbiAgdC5hbmdicmFja2V0cmlnaHQgPSAweDMwMDk7IC8vIEdseXBoIGlzIG1pc3NpbmcgZnJvbSBBZG9iZSdzIG9yaWdpbmFsIGxpc3QuXG4gIHQuYW5na2hhbmtodXRoYWkgPSAweDBlNWE7XG4gIHQuYW5nbGUgPSAweDIyMjA7XG4gIHQuYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwODtcbiAgdC5hbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Y7XG4gIHQuYW5nbGVicmFja2V0cmlnaHQgPSAweDMwMDk7XG4gIHQuYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0MDtcbiAgdC5hbmdsZWxlZnQgPSAweDIzMjk7XG4gIHQuYW5nbGVyaWdodCA9IDB4MjMyYTtcbiAgdC5hbmdzdHJvbSA9IDB4MjEyYjtcbiAgdC5hbm90ZWxlaWEgPSAweDAzODc7XG4gIHQuYW51ZGF0dGFkZXZhID0gMHgwOTUyO1xuICB0LmFudXN2YXJhYmVuZ2FsaSA9IDB4MDk4MjtcbiAgdC5hbnVzdmFyYWRldmEgPSAweDA5MDI7XG4gIHQuYW51c3ZhcmFndWphcmF0aSA9IDB4MGE4MjtcbiAgdC5hb2dvbmVrID0gMHgwMTA1O1xuICB0LmFwYWF0b3NxdWFyZSA9IDB4MzMwMDtcbiAgdC5hcGFyZW4gPSAweDI0OWM7XG4gIHQuYXBvc3Ryb3BoZWFybWVuaWFuID0gMHgwNTVhO1xuICB0LmFwb3N0cm9waGVtb2QgPSAweDAyYmM7XG4gIHQuYXBwbGUgPSAweGY4ZmY7XG4gIHQuYXBwcm9hY2hlcyA9IDB4MjI1MDtcbiAgdC5hcHByb3hlcXVhbCA9IDB4MjI0ODtcbiAgdC5hcHByb3hlcXVhbG9yaW1hZ2UgPSAweDIyNTI7XG4gIHQuYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjQ1O1xuICB0LmFyYWVhZWtvcmVhbiA9IDB4MzE4ZTtcbiAgdC5hcmFlYWtvcmVhbiA9IDB4MzE4ZDtcbiAgdC5hcmMgPSAweDIzMTI7XG4gIHQuYXJpZ2h0aGFsZnJpbmcgPSAweDFlOWE7XG4gIHQuYXJpbmcgPSAweDAwZTU7XG4gIHQuYXJpbmdhY3V0ZSA9IDB4MDFmYjtcbiAgdC5hcmluZ2JlbG93ID0gMHgxZTAxO1xuICB0LmFycm93Ym90aCA9IDB4MjE5NDtcbiAgdC5hcnJvd2Rhc2hkb3duID0gMHgyMWUzO1xuICB0LmFycm93ZGFzaGxlZnQgPSAweDIxZTA7XG4gIHQuYXJyb3dkYXNocmlnaHQgPSAweDIxZTI7XG4gIHQuYXJyb3dkYXNodXAgPSAweDIxZTE7XG4gIHQuYXJyb3dkYmxib3RoID0gMHgyMWQ0O1xuICB0LmFycm93ZGJsZG93biA9IDB4MjFkMztcbiAgdC5hcnJvd2RibGxlZnQgPSAweDIxZDA7XG4gIHQuYXJyb3dkYmxyaWdodCA9IDB4MjFkMjtcbiAgdC5hcnJvd2RibHVwID0gMHgyMWQxO1xuICB0LmFycm93ZG93biA9IDB4MjE5MztcbiAgdC5hcnJvd2Rvd25sZWZ0ID0gMHgyMTk5O1xuICB0LmFycm93ZG93bnJpZ2h0ID0gMHgyMTk4O1xuICB0LmFycm93ZG93bndoaXRlID0gMHgyMWU5O1xuICB0LmFycm93aGVhZGRvd25tb2QgPSAweDAyYzU7XG4gIHQuYXJyb3doZWFkbGVmdG1vZCA9IDB4MDJjMjtcbiAgdC5hcnJvd2hlYWRyaWdodG1vZCA9IDB4MDJjMztcbiAgdC5hcnJvd2hlYWR1cG1vZCA9IDB4MDJjNDtcbiAgdC5hcnJvd2hvcml6ZXggPSAweGY4ZTc7XG4gIHQuYXJyb3dsZWZ0ID0gMHgyMTkwO1xuICB0LmFycm93bGVmdGRibCA9IDB4MjFkMDtcbiAgdC5hcnJvd2xlZnRkYmxzdHJva2UgPSAweDIxY2Q7XG4gIHQuYXJyb3dsZWZ0b3ZlcnJpZ2h0ID0gMHgyMWM2O1xuICB0LmFycm93bGVmdHdoaXRlID0gMHgyMWU2O1xuICB0LmFycm93cmlnaHQgPSAweDIxOTI7XG4gIHQuYXJyb3dyaWdodGRibHN0cm9rZSA9IDB4MjFjZjtcbiAgdC5hcnJvd3JpZ2h0aGVhdnkgPSAweDI3OWU7XG4gIHQuYXJyb3dyaWdodG92ZXJsZWZ0ID0gMHgyMWM0O1xuICB0LmFycm93cmlnaHR3aGl0ZSA9IDB4MjFlODtcbiAgdC5hcnJvd3RhYmxlZnQgPSAweDIxZTQ7XG4gIHQuYXJyb3d0YWJyaWdodCA9IDB4MjFlNTtcbiAgdC5hcnJvd3VwID0gMHgyMTkxO1xuICB0LmFycm93dXBkbiA9IDB4MjE5NTtcbiAgdC5hcnJvd3VwZG5ic2UgPSAweDIxYTg7XG4gIHQuYXJyb3d1cGRvd25iYXNlID0gMHgyMWE4O1xuICB0LmFycm93dXBsZWZ0ID0gMHgyMTk2O1xuICB0LmFycm93dXBsZWZ0b2Zkb3duID0gMHgyMWM1O1xuICB0LmFycm93dXByaWdodCA9IDB4MjE5NztcbiAgdC5hcnJvd3Vwd2hpdGUgPSAweDIxZTc7XG4gIHQuYXJyb3d2ZXJ0ZXggPSAweGY4ZTY7XG4gIHQuYXNjaWljaXJjdW0gPSAweDAwNWU7XG4gIHQuYXNjaWljaXJjdW1tb25vc3BhY2UgPSAweGZmM2U7XG4gIHQuYXNjaWl0aWxkZSA9IDB4MDA3ZTtcbiAgdC5hc2NpaXRpbGRlbW9ub3NwYWNlID0gMHhmZjVlO1xuICB0LmFzY3JpcHQgPSAweDAyNTE7XG4gIHQuYXNjcmlwdHR1cm5lZCA9IDB4MDI1MjtcbiAgdC5hc21hbGxoaXJhZ2FuYSA9IDB4MzA0MTtcbiAgdC5hc21hbGxrYXRha2FuYSA9IDB4MzBhMTtcbiAgdC5hc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NztcbiAgdC5hc3RlcmlzayA9IDB4MDAyYTtcbiAgdC5hc3Rlcmlza2FsdG9uZWFyYWJpYyA9IDB4MDY2ZDtcbiAgdC5hc3Rlcmlza2FyYWJpYyA9IDB4MDY2ZDtcbiAgdC5hc3Rlcmlza21hdGggPSAweDIyMTc7XG4gIHQuYXN0ZXJpc2ttb25vc3BhY2UgPSAweGZmMGE7XG4gIHQuYXN0ZXJpc2tzbWFsbCA9IDB4ZmU2MTtcbiAgdC5hc3RlcmlzbSA9IDB4MjA0MjtcbiAgdC5hc3VwZXJpb3IgPSAweGY2ZTk7XG4gIHQuYXN5bXB0b3RpY2FsbHllcXVhbCA9IDB4MjI0MztcbiAgdC5hdCA9IDB4MDA0MDtcbiAgdC5hdGlsZGUgPSAweDAwZTM7XG4gIHQuYXRtb25vc3BhY2UgPSAweGZmMjA7XG4gIHQuYXRzbWFsbCA9IDB4ZmU2YjtcbiAgdC5hdHVybmVkID0gMHgwMjUwO1xuICB0LmF1YmVuZ2FsaSA9IDB4MDk5NDtcbiAgdC5hdWJvcG9tb2ZvID0gMHgzMTIwO1xuICB0LmF1ZGV2YSA9IDB4MDkxNDtcbiAgdC5hdWd1amFyYXRpID0gMHgwYTk0O1xuICB0LmF1Z3VybXVraGkgPSAweDBhMTQ7XG4gIHQuYXVsZW5ndGhtYXJrYmVuZ2FsaSA9IDB4MDlkNztcbiAgdC5hdW1hdHJhZ3VybXVraGkgPSAweDBhNGM7XG4gIHQuYXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNjO1xuICB0LmF1dm93ZWxzaWduZGV2YSA9IDB4MDk0YztcbiAgdC5hdXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWNjO1xuICB0LmF2YWdyYWhhZGV2YSA9IDB4MDkzZDtcbiAgdC5heWJhcm1lbmlhbiA9IDB4MDU2MTtcbiAgdC5heWluID0gMHgwNWUyO1xuICB0LmF5aW5hbHRvbmVoZWJyZXcgPSAweGZiMjA7XG4gIHQuYXlpbmhlYnJldyA9IDB4MDVlMjtcbiAgdC5iID0gMHgwMDYyO1xuICB0LmJhYmVuZ2FsaSA9IDB4MDlhYztcbiAgdC5iYWNrc2xhc2ggPSAweDAwNWM7XG4gIHQuYmFja3NsYXNobW9ub3NwYWNlID0gMHhmZjNjO1xuICB0LmJhZGV2YSA9IDB4MDkyYztcbiAgdC5iYWd1amFyYXRpID0gMHgwYWFjO1xuICB0LmJhZ3VybXVraGkgPSAweDBhMmM7XG4gIHQuYmFoaXJhZ2FuYSA9IDB4MzA3MDtcbiAgdC5iYWh0dGhhaSA9IDB4MGUzZjtcbiAgdC5iYWthdGFrYW5hID0gMHgzMGQwO1xuICB0LmJhciA9IDB4MDA3YztcbiAgdC5iYXJtb25vc3BhY2UgPSAweGZmNWM7XG4gIHQuYmJvcG9tb2ZvID0gMHgzMTA1O1xuICB0LmJjaXJjbGUgPSAweDI0ZDE7XG4gIHQuYmRvdGFjY2VudCA9IDB4MWUwMztcbiAgdC5iZG90YmVsb3cgPSAweDFlMDU7XG4gIHQuYmVhbWVkc2l4dGVlbnRobm90ZXMgPSAweDI2NmM7XG4gIHQuYmVjYXVzZSA9IDB4MjIzNTtcbiAgdC5iZWN5cmlsbGljID0gMHgwNDMxO1xuICB0LmJlaGFyYWJpYyA9IDB4MDYyODtcbiAgdC5iZWhmaW5hbGFyYWJpYyA9IDB4ZmU5MDtcbiAgdC5iZWhpbml0aWFsYXJhYmljID0gMHhmZTkxO1xuICB0LmJlaGlyYWdhbmEgPSAweDMwNzk7XG4gIHQuYmVobWVkaWFsYXJhYmljID0gMHhmZTkyO1xuICB0LmJlaG1lZW1pbml0aWFsYXJhYmljID0gMHhmYzlmO1xuICB0LmJlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwODtcbiAgdC5iZWhub29uZmluYWxhcmFiaWMgPSAweGZjNmQ7XG4gIHQuYmVrYXRha2FuYSA9IDB4MzBkOTtcbiAgdC5iZW5hcm1lbmlhbiA9IDB4MDU2MjtcbiAgdC5iZXQgPSAweDA1ZDE7XG4gIHQuYmV0YSA9IDB4MDNiMjtcbiAgdC5iZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDA7XG4gIHQuYmV0ZGFnZXNoID0gMHhmYjMxO1xuICB0LmJldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMTtcbiAgdC5iZXRoZWJyZXcgPSAweDA1ZDE7XG4gIHQuYmV0cmFmZWhlYnJldyA9IDB4ZmI0YztcbiAgdC5iaGFiZW5nYWxpID0gMHgwOWFkO1xuICB0LmJoYWRldmEgPSAweDA5MmQ7XG4gIHQuYmhhZ3VqYXJhdGkgPSAweDBhYWQ7XG4gIHQuYmhhZ3VybXVraGkgPSAweDBhMmQ7XG4gIHQuYmhvb2sgPSAweDAyNTM7XG4gIHQuYmloaXJhZ2FuYSA9IDB4MzA3MztcbiAgdC5iaWthdGFrYW5hID0gMHgzMGQzO1xuICB0LmJpbGFiaWFsY2xpY2sgPSAweDAyOTg7XG4gIHQuYmluZGlndXJtdWtoaSA9IDB4MGEwMjtcbiAgdC5iaXJ1c3F1YXJlID0gMHgzMzMxO1xuICB0LmJsYWNrY2lyY2xlID0gMHgyNWNmO1xuICB0LmJsYWNrZGlhbW9uZCA9IDB4MjVjNjtcbiAgdC5ibGFja2Rvd25wb2ludGluZ3RyaWFuZ2xlID0gMHgyNWJjO1xuICB0LmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciA9IDB4MjVjNDtcbiAgdC5ibGFja2xlZnRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWMwO1xuICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0ID0gMHgzMDEwO1xuICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2I7XG4gIHQuYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0ID0gMHgzMDExO1xuICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTNjO1xuICB0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTM7XG4gIHQuYmxhY2tsb3dlcnJpZ2h0dHJpYW5nbGUgPSAweDI1ZTI7XG4gIHQuYmxhY2tyZWN0YW5nbGUgPSAweDI1YWM7XG4gIHQuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciA9IDB4MjViYTtcbiAgdC5ibGFja3JpZ2h0cG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViNjtcbiAgdC5ibGFja3NtYWxsc3F1YXJlID0gMHgyNWFhO1xuICB0LmJsYWNrc21pbGluZ2ZhY2UgPSAweDI2M2I7XG4gIHQuYmxhY2tzcXVhcmUgPSAweDI1YTA7XG4gIHQuYmxhY2tzdGFyID0gMHgyNjA1O1xuICB0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTQ7XG4gIHQuYmxhY2t1cHBlcnJpZ2h0dHJpYW5nbGUgPSAweDI1ZTU7XG4gIHQuYmxhY2t1cHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViNDtcbiAgdC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMjtcbiAgdC5ibGFuayA9IDB4MjQyMztcbiAgdC5ibGluZWJlbG93ID0gMHgxZTA3O1xuICB0LmJsb2NrID0gMHgyNTg4O1xuICB0LmJtb25vc3BhY2UgPSAweGZmNDI7XG4gIHQuYm9iYWltYWl0aGFpID0gMHgwZTFhO1xuICB0LmJvaGlyYWdhbmEgPSAweDMwN2M7XG4gIHQuYm9rYXRha2FuYSA9IDB4MzBkYztcbiAgdC5icGFyZW4gPSAweDI0OWQ7XG4gIHQuYnFzcXVhcmUgPSAweDMzYzM7XG4gIHQuYnJhY2VleCA9IDB4ZjhmNDtcbiAgdC5icmFjZWxlZnQgPSAweDAwN2I7XG4gIHQuYnJhY2VsZWZ0YnQgPSAweGY4ZjM7XG4gIHQuYnJhY2VsZWZ0bWlkID0gMHhmOGYyO1xuICB0LmJyYWNlbGVmdG1vbm9zcGFjZSA9IDB4ZmY1YjtcbiAgdC5icmFjZWxlZnRzbWFsbCA9IDB4ZmU1YjtcbiAgdC5icmFjZWxlZnR0cCA9IDB4ZjhmMTtcbiAgdC5icmFjZWxlZnR2ZXJ0aWNhbCA9IDB4ZmUzNztcbiAgdC5icmFjZXJpZ2h0ID0gMHgwMDdkO1xuICB0LmJyYWNlcmlnaHRidCA9IDB4ZjhmZTtcbiAgdC5icmFjZXJpZ2h0bWlkID0gMHhmOGZkO1xuICB0LmJyYWNlcmlnaHRtb25vc3BhY2UgPSAweGZmNWQ7XG4gIHQuYnJhY2VyaWdodHNtYWxsID0gMHhmZTVjO1xuICB0LmJyYWNlcmlnaHR0cCA9IDB4ZjhmYztcbiAgdC5icmFjZXJpZ2h0dmVydGljYWwgPSAweGZlMzg7XG4gIHQuYnJhY2tldGxlZnQgPSAweDAwNWI7XG4gIHQuYnJhY2tldGxlZnRidCA9IDB4ZjhmMDtcbiAgdC5icmFja2V0bGVmdGV4ID0gMHhmOGVmO1xuICB0LmJyYWNrZXRsZWZ0bW9ub3NwYWNlID0gMHhmZjNiO1xuICB0LmJyYWNrZXRsZWZ0dHAgPSAweGY4ZWU7XG4gIHQuYnJhY2tldHJpZ2h0ID0gMHgwMDVkO1xuICB0LmJyYWNrZXRyaWdodGJ0ID0gMHhmOGZiO1xuICB0LmJyYWNrZXRyaWdodGV4ID0gMHhmOGZhO1xuICB0LmJyYWNrZXRyaWdodG1vbm9zcGFjZSA9IDB4ZmYzZDtcbiAgdC5icmFja2V0cmlnaHR0cCA9IDB4ZjhmOTtcbiAgdC5icmV2ZSA9IDB4MDJkODtcbiAgdC5icmV2ZWJlbG93Y21iID0gMHgwMzJlO1xuICB0LmJyZXZlY21iID0gMHgwMzA2O1xuICB0LmJyZXZlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyZjtcbiAgdC5icmV2ZWludmVydGVkY21iID0gMHgwMzExO1xuICB0LmJyZXZlaW52ZXJ0ZWRkb3VibGVjbWIgPSAweDAzNjE7XG4gIHQuYnJpZGdlYmVsb3djbWIgPSAweDAzMmE7XG4gIHQuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMzYTtcbiAgdC5icm9rZW5iYXIgPSAweDAwYTY7XG4gIHQuYnN0cm9rZSA9IDB4MDE4MDtcbiAgdC5ic3VwZXJpb3IgPSAweGY2ZWE7XG4gIHQuYnRvcGJhciA9IDB4MDE4MztcbiAgdC5idWhpcmFnYW5hID0gMHgzMDc2O1xuICB0LmJ1a2F0YWthbmEgPSAweDMwZDY7XG4gIHQuYnVsbGV0ID0gMHgyMDIyO1xuICB0LmJ1bGxldGludmVyc2UgPSAweDI1ZDg7XG4gIHQuYnVsbGV0b3BlcmF0b3IgPSAweDIyMTk7XG4gIHQuYnVsbHNleWUgPSAweDI1Y2U7XG4gIHQuYyA9IDB4MDA2MztcbiAgdC5jYWFybWVuaWFuID0gMHgwNTZlO1xuICB0LmNhYmVuZ2FsaSA9IDB4MDk5YTtcbiAgdC5jYWN1dGUgPSAweDAxMDc7XG4gIHQuY2FkZXZhID0gMHgwOTFhO1xuICB0LmNhZ3VqYXJhdGkgPSAweDBhOWE7XG4gIHQuY2FndXJtdWtoaSA9IDB4MGExYTtcbiAgdC5jYWxzcXVhcmUgPSAweDMzODg7XG4gIHQuY2FuZHJhYmluZHViZW5nYWxpID0gMHgwOTgxO1xuICB0LmNhbmRyYWJpbmR1Y21iID0gMHgwMzEwO1xuICB0LmNhbmRyYWJpbmR1ZGV2YSA9IDB4MDkwMTtcbiAgdC5jYW5kcmFiaW5kdWd1amFyYXRpID0gMHgwYTgxO1xuICB0LmNhcHNsb2NrID0gMHgyMWVhO1xuICB0LmNhcmVvZiA9IDB4MjEwNTtcbiAgdC5jYXJvbiA9IDB4MDJjNztcbiAgdC5jYXJvbmJlbG93Y21iID0gMHgwMzJjO1xuICB0LmNhcm9uY21iID0gMHgwMzBjO1xuICB0LmNhcnJpYWdlcmV0dXJuID0gMHgyMWI1O1xuICB0LmNib3BvbW9mbyA9IDB4MzExODtcbiAgdC5jY2Fyb24gPSAweDAxMGQ7XG4gIHQuY2NlZGlsbGEgPSAweDAwZTc7XG4gIHQuY2NlZGlsbGFhY3V0ZSA9IDB4MWUwOTtcbiAgdC5jY2lyY2xlID0gMHgyNGQyO1xuICB0LmNjaXJjdW1mbGV4ID0gMHgwMTA5O1xuICB0LmNjdXJsID0gMHgwMjU1O1xuICB0LmNkb3QgPSAweDAxMGI7XG4gIHQuY2RvdGFjY2VudCA9IDB4MDEwYjtcbiAgdC5jZHNxdWFyZSA9IDB4MzNjNTtcbiAgdC5jZWRpbGxhID0gMHgwMGI4O1xuICB0LmNlZGlsbGFjbWIgPSAweDAzMjc7XG4gIHQuY2VudCA9IDB4MDBhMjtcbiAgdC5jZW50aWdyYWRlID0gMHgyMTAzO1xuICB0LmNlbnRpbmZlcmlvciA9IDB4ZjZkZjtcbiAgdC5jZW50bW9ub3NwYWNlID0gMHhmZmUwO1xuICB0LmNlbnRvbGRzdHlsZSA9IDB4ZjdhMjtcbiAgdC5jZW50c3VwZXJpb3IgPSAweGY2ZTA7XG4gIHQuY2hhYXJtZW5pYW4gPSAweDA1Nzk7XG4gIHQuY2hhYmVuZ2FsaSA9IDB4MDk5YjtcbiAgdC5jaGFkZXZhID0gMHgwOTFiO1xuICB0LmNoYWd1amFyYXRpID0gMHgwYTliO1xuICB0LmNoYWd1cm11a2hpID0gMHgwYTFiO1xuICB0LmNoYm9wb21vZm8gPSAweDMxMTQ7XG4gIHQuY2hlYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmQ7XG4gIHQuY2hlY2ttYXJrID0gMHgyNzEzO1xuICB0LmNoZWN5cmlsbGljID0gMHgwNDQ3O1xuICB0LmNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJmO1xuICB0LmNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI3O1xuICB0LmNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjU7XG4gIHQuY2hlaGFybWVuaWFuID0gMHgwNTczO1xuICB0LmNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYztcbiAgdC5jaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI5O1xuICB0LmNoaSA9IDB4MDNjNztcbiAgdC5jaGlldWNoYWNpcmNsZWtvcmVhbiA9IDB4MzI3NztcbiAgdC5jaGlldWNoYXBhcmVua29yZWFuID0gMHgzMjE3O1xuICB0LmNoaWV1Y2hjaXJjbGVrb3JlYW4gPSAweDMyNjk7XG4gIHQuY2hpZXVjaGtvcmVhbiA9IDB4MzE0YTtcbiAgdC5jaGlldWNocGFyZW5rb3JlYW4gPSAweDMyMDk7XG4gIHQuY2hvY2hhbmd0aGFpID0gMHgwZTBhO1xuICB0LmNob2NoYW50aGFpID0gMHgwZTA4O1xuICB0LmNob2NoaW5ndGhhaSA9IDB4MGUwOTtcbiAgdC5jaG9jaG9ldGhhaSA9IDB4MGUwYztcbiAgdC5jaG9vayA9IDB4MDE4ODtcbiAgdC5jaWV1Y2FjaXJjbGVrb3JlYW4gPSAweDMyNzY7XG4gIHQuY2lldWNhcGFyZW5rb3JlYW4gPSAweDMyMTY7XG4gIHQuY2lldWNjaXJjbGVrb3JlYW4gPSAweDMyNjg7XG4gIHQuY2lldWNrb3JlYW4gPSAweDMxNDg7XG4gIHQuY2lldWNwYXJlbmtvcmVhbiA9IDB4MzIwODtcbiAgdC5jaWV1Y3VwYXJlbmtvcmVhbiA9IDB4MzIxYztcbiAgdC5jaXJjbGUgPSAweDI1Y2I7XG4gIHQuY2lyY2xlY29weXJ0ID0gMHgwMGE5OyAvLyBHbHlwaCBpcyBtaXNzaW5nIGZyb20gQWRvYmUncyBvcmlnaW5hbCBsaXN0LlxuICB0LmNpcmNsZW11bHRpcGx5ID0gMHgyMjk3O1xuICB0LmNpcmNsZW90ID0gMHgyMjk5O1xuICB0LmNpcmNsZXBsdXMgPSAweDIyOTU7XG4gIHQuY2lyY2xlcG9zdGFsbWFyayA9IDB4MzAzNjtcbiAgdC5jaXJjbGV3aXRobGVmdGhhbGZibGFjayA9IDB4MjVkMDtcbiAgdC5jaXJjbGV3aXRocmlnaHRoYWxmYmxhY2sgPSAweDI1ZDE7XG4gIHQuY2lyY3VtZmxleCA9IDB4MDJjNjtcbiAgdC5jaXJjdW1mbGV4YmVsb3djbWIgPSAweDAzMmQ7XG4gIHQuY2lyY3VtZmxleGNtYiA9IDB4MDMwMjtcbiAgdC5jbGVhciA9IDB4MjMyNztcbiAgdC5jbGlja2FsdmVvbGFyID0gMHgwMWMyO1xuICB0LmNsaWNrZGVudGFsID0gMHgwMWMwO1xuICB0LmNsaWNrbGF0ZXJhbCA9IDB4MDFjMTtcbiAgdC5jbGlja3JldHJvZmxleCA9IDB4MDFjMztcbiAgdC5jbHViID0gMHgyNjYzO1xuICB0LmNsdWJzdWl0YmxhY2sgPSAweDI2NjM7XG4gIHQuY2x1YnN1aXR3aGl0ZSA9IDB4MjY2NztcbiAgdC5jbWN1YmVkc3F1YXJlID0gMHgzM2E0O1xuICB0LmNtb25vc3BhY2UgPSAweGZmNDM7XG4gIHQuY21zcXVhcmVkc3F1YXJlID0gMHgzM2EwO1xuICB0LmNvYXJtZW5pYW4gPSAweDA1ODE7XG4gIHQuY29sb24gPSAweDAwM2E7XG4gIHQuY29sb25tb25ldGFyeSA9IDB4MjBhMTtcbiAgdC5jb2xvbm1vbm9zcGFjZSA9IDB4ZmYxYTtcbiAgdC5jb2xvbnNpZ24gPSAweDIwYTE7XG4gIHQuY29sb25zbWFsbCA9IDB4ZmU1NTtcbiAgdC5jb2xvbnRyaWFuZ3VsYXJoYWxmbW9kID0gMHgwMmQxO1xuICB0LmNvbG9udHJpYW5ndWxhcm1vZCA9IDB4MDJkMDtcbiAgdC5jb21tYSA9IDB4MDAyYztcbiAgdC5jb21tYWFib3ZlY21iID0gMHgwMzEzO1xuICB0LmNvbW1hYWJvdmVyaWdodGNtYiA9IDB4MDMxNTtcbiAgdC5jb21tYWFjY2VudCA9IDB4ZjZjMztcbiAgdC5jb21tYWFyYWJpYyA9IDB4MDYwYztcbiAgdC5jb21tYWFybWVuaWFuID0gMHgwNTVkO1xuICB0LmNvbW1haW5mZXJpb3IgPSAweGY2ZTE7XG4gIHQuY29tbWFtb25vc3BhY2UgPSAweGZmMGM7XG4gIHQuY29tbWFyZXZlcnNlZGFib3ZlY21iID0gMHgwMzE0O1xuICB0LmNvbW1hcmV2ZXJzZWRtb2QgPSAweDAyYmQ7XG4gIHQuY29tbWFzbWFsbCA9IDB4ZmU1MDtcbiAgdC5jb21tYXN1cGVyaW9yID0gMHhmNmUyO1xuICB0LmNvbW1hdHVybmVkYWJvdmVjbWIgPSAweDAzMTI7XG4gIHQuY29tbWF0dXJuZWRtb2QgPSAweDAyYmI7XG4gIHQuY29tcGFzcyA9IDB4MjYzYztcbiAgdC5jb25ncnVlbnQgPSAweDIyNDU7XG4gIHQuY29udG91cmludGVncmFsID0gMHgyMjJlO1xuICB0LmNvbnRyb2wgPSAweDIzMDM7XG4gIHQuY29udHJvbEFDSyA9IDB4MDAwNjtcbiAgdC5jb250cm9sQkVMID0gMHgwMDA3O1xuICB0LmNvbnRyb2xCUyA9IDB4MDAwODtcbiAgdC5jb250cm9sQ0FOID0gMHgwMDE4O1xuICB0LmNvbnRyb2xDUiA9IDB4MDAwZDtcbiAgdC5jb250cm9sREMxID0gMHgwMDExO1xuICB0LmNvbnRyb2xEQzIgPSAweDAwMTI7XG4gIHQuY29udHJvbERDMyA9IDB4MDAxMztcbiAgdC5jb250cm9sREM0ID0gMHgwMDE0O1xuICB0LmNvbnRyb2xERUwgPSAweDAwN2Y7XG4gIHQuY29udHJvbERMRSA9IDB4MDAxMDtcbiAgdC5jb250cm9sRU0gPSAweDAwMTk7XG4gIHQuY29udHJvbEVOUSA9IDB4MDAwNTtcbiAgdC5jb250cm9sRU9UID0gMHgwMDA0O1xuICB0LmNvbnRyb2xFU0MgPSAweDAwMWI7XG4gIHQuY29udHJvbEVUQiA9IDB4MDAxNztcbiAgdC5jb250cm9sRVRYID0gMHgwMDAzO1xuICB0LmNvbnRyb2xGRiA9IDB4MDAwYztcbiAgdC5jb250cm9sRlMgPSAweDAwMWM7XG4gIHQuY29udHJvbEdTID0gMHgwMDFkO1xuICB0LmNvbnRyb2xIVCA9IDB4MDAwOTtcbiAgdC5jb250cm9sTEYgPSAweDAwMGE7XG4gIHQuY29udHJvbE5BSyA9IDB4MDAxNTtcbiAgdC5jb250cm9sTlVMTCA9IDB4MDAwMDsgLy8gR2x5cGggaXMgbWlzc2luZyBmcm9tIEFkb2JlJ3Mgb3JpZ2luYWwgbGlzdC5cbiAgdC5jb250cm9sUlMgPSAweDAwMWU7XG4gIHQuY29udHJvbFNJID0gMHgwMDBmO1xuICB0LmNvbnRyb2xTTyA9IDB4MDAwZTtcbiAgdC5jb250cm9sU09UID0gMHgwMDAyO1xuICB0LmNvbnRyb2xTVFggPSAweDAwMDE7XG4gIHQuY29udHJvbFNVQiA9IDB4MDAxYTtcbiAgdC5jb250cm9sU1lOID0gMHgwMDE2O1xuICB0LmNvbnRyb2xVUyA9IDB4MDAxZjtcbiAgdC5jb250cm9sVlQgPSAweDAwMGI7XG4gIHQuY29weXJpZ2h0ID0gMHgwMGE5O1xuICB0LmNvcHlyaWdodHNhbnMgPSAweGY4ZTk7XG4gIHQuY29weXJpZ2h0c2VyaWYgPSAweGY2ZDk7XG4gIHQuY29ybmVyYnJhY2tldGxlZnQgPSAweDMwMGM7XG4gIHQuY29ybmVyYnJhY2tldGxlZnRoYWxmd2lkdGggPSAweGZmNjI7XG4gIHQuY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MTtcbiAgdC5jb3JuZXJicmFja2V0cmlnaHQgPSAweDMwMGQ7XG4gIHQuY29ybmVyYnJhY2tldHJpZ2h0aGFsZndpZHRoID0gMHhmZjYzO1xuICB0LmNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQyO1xuICB0LmNvcnBvcmF0aW9uc3F1YXJlID0gMHgzMzdmO1xuICB0LmNvc3F1YXJlID0gMHgzM2M3O1xuICB0LmNvdmVya2dzcXVhcmUgPSAweDMzYzY7XG4gIHQuY3BhcmVuID0gMHgyNDllO1xuICB0LmNydXplaXJvID0gMHgyMGEyO1xuICB0LmNzdHJldGNoZWQgPSAweDAyOTc7XG4gIHQuY3VybHlhbmQgPSAweDIyY2Y7XG4gIHQuY3VybHlvciA9IDB4MjJjZTtcbiAgdC5jdXJyZW5jeSA9IDB4MDBhNDtcbiAgdC5jeXJCcmV2ZSA9IDB4ZjZkMTtcbiAgdC5jeXJGbGV4ID0gMHhmNmQyO1xuICB0LmN5cmJyZXZlID0gMHhmNmQ0O1xuICB0LmN5cmZsZXggPSAweGY2ZDU7XG4gIHQuZCA9IDB4MDA2NDtcbiAgdC5kYWFybWVuaWFuID0gMHgwNTY0O1xuICB0LmRhYmVuZ2FsaSA9IDB4MDlhNjtcbiAgdC5kYWRhcmFiaWMgPSAweDA2MzY7XG4gIHQuZGFkZXZhID0gMHgwOTI2O1xuICB0LmRhZGZpbmFsYXJhYmljID0gMHhmZWJlO1xuICB0LmRhZGluaXRpYWxhcmFiaWMgPSAweGZlYmY7XG4gIHQuZGFkbWVkaWFsYXJhYmljID0gMHhmZWMwO1xuICB0LmRhZ2VzaCA9IDB4MDViYztcbiAgdC5kYWdlc2hoZWJyZXcgPSAweDA1YmM7XG4gIHQuZGFnZ2VyID0gMHgyMDIwO1xuICB0LmRhZ2dlcmRibCA9IDB4MjAyMTtcbiAgdC5kYWd1amFyYXRpID0gMHgwYWE2O1xuICB0LmRhZ3VybXVraGkgPSAweDBhMjY7XG4gIHQuZGFoaXJhZ2FuYSA9IDB4MzA2MDtcbiAgdC5kYWthdGFrYW5hID0gMHgzMGMwO1xuICB0LmRhbGFyYWJpYyA9IDB4MDYyZjtcbiAgdC5kYWxldCA9IDB4MDVkMztcbiAgdC5kYWxldGRhZ2VzaCA9IDB4ZmIzMztcbiAgdC5kYWxldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMztcbiAgdC5kYWxldGhlYnJldyA9IDB4MDVkMztcbiAgdC5kYWxmaW5hbGFyYWJpYyA9IDB4ZmVhYTtcbiAgdC5kYW1tYWFyYWJpYyA9IDB4MDY0ZjtcbiAgdC5kYW1tYWxvd2FyYWJpYyA9IDB4MDY0ZjtcbiAgdC5kYW1tYXRhbmFsdG9uZWFyYWJpYyA9IDB4MDY0YztcbiAgdC5kYW1tYXRhbmFyYWJpYyA9IDB4MDY0YztcbiAgdC5kYW5kYSA9IDB4MDk2NDtcbiAgdC5kYXJnYWhlYnJldyA9IDB4MDVhNztcbiAgdC5kYXJnYWxlZnRoZWJyZXcgPSAweDA1YTc7XG4gIHQuZGFzaWFwbmV1bWF0YWN5cmlsbGljY21iID0gMHgwNDg1O1xuICB0LmRibEdyYXZlID0gMHhmNmQzO1xuICB0LmRibGFuZ2xlYnJhY2tldGxlZnQgPSAweDMwMGE7XG4gIHQuZGJsYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTNkO1xuICB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDBiO1xuICB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2U7XG4gIHQuZGJsYXJjaGludmVydGVkYmVsb3djbWIgPSAweDAzMmI7XG4gIHQuZGJsYXJyb3dsZWZ0ID0gMHgyMWQ0O1xuICB0LmRibGFycm93cmlnaHQgPSAweDIxZDI7XG4gIHQuZGJsZGFuZGEgPSAweDA5NjU7XG4gIHQuZGJsZ3JhdmUgPSAweGY2ZDY7XG4gIHQuZGJsZ3JhdmVjbWIgPSAweDAzMGY7XG4gIHQuZGJsaW50ZWdyYWwgPSAweDIyMmM7XG4gIHQuZGJsbG93bGluZSA9IDB4MjAxNztcbiAgdC5kYmxsb3dsaW5lY21iID0gMHgwMzMzO1xuICB0LmRibG92ZXJsaW5lY21iID0gMHgwMzNmO1xuICB0LmRibHByaW1lbW9kID0gMHgwMmJhO1xuICB0LmRibHZlcnRpY2FsYmFyID0gMHgyMDE2O1xuICB0LmRibHZlcnRpY2FsbGluZWFib3ZlY21iID0gMHgwMzBlO1xuICB0LmRib3BvbW9mbyA9IDB4MzEwOTtcbiAgdC5kYnNxdWFyZSA9IDB4MzNjODtcbiAgdC5kY2Fyb24gPSAweDAxMGY7XG4gIHQuZGNlZGlsbGEgPSAweDFlMTE7XG4gIHQuZGNpcmNsZSA9IDB4MjRkMztcbiAgdC5kY2lyY3VtZmxleGJlbG93ID0gMHgxZTEzO1xuICB0LmRjcm9hdCA9IDB4MDExMTtcbiAgdC5kZGFiZW5nYWxpID0gMHgwOWExO1xuICB0LmRkYWRldmEgPSAweDA5MjE7XG4gIHQuZGRhZ3VqYXJhdGkgPSAweDBhYTE7XG4gIHQuZGRhZ3VybXVraGkgPSAweDBhMjE7XG4gIHQuZGRhbGFyYWJpYyA9IDB4MDY4ODtcbiAgdC5kZGFsZmluYWxhcmFiaWMgPSAweGZiODk7XG4gIHQuZGRkaGFkZXZhID0gMHgwOTVjO1xuICB0LmRkaGFiZW5nYWxpID0gMHgwOWEyO1xuICB0LmRkaGFkZXZhID0gMHgwOTIyO1xuICB0LmRkaGFndWphcmF0aSA9IDB4MGFhMjtcbiAgdC5kZGhhZ3VybXVraGkgPSAweDBhMjI7XG4gIHQuZGRvdGFjY2VudCA9IDB4MWUwYjtcbiAgdC5kZG90YmVsb3cgPSAweDFlMGQ7XG4gIHQuZGVjaW1hbHNlcGFyYXRvcmFyYWJpYyA9IDB4MDY2YjtcbiAgdC5kZWNpbWFsc2VwYXJhdG9ycGVyc2lhbiA9IDB4MDY2YjtcbiAgdC5kZWN5cmlsbGljID0gMHgwNDM0O1xuICB0LmRlZ3JlZSA9IDB4MDBiMDtcbiAgdC5kZWhpaGVicmV3ID0gMHgwNWFkO1xuICB0LmRlaGlyYWdhbmEgPSAweDMwNjc7XG4gIHQuZGVpY29wdGljID0gMHgwM2VmO1xuICB0LmRla2F0YWthbmEgPSAweDMwYzc7XG4gIHQuZGVsZXRlbGVmdCA9IDB4MjMyYjtcbiAgdC5kZWxldGVyaWdodCA9IDB4MjMyNjtcbiAgdC5kZWx0YSA9IDB4MDNiNDtcbiAgdC5kZWx0YXR1cm5lZCA9IDB4MDE4ZDtcbiAgdC5kZW5vbWluYXRvcm1pbnVzb25lbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmODtcbiAgdC5kZXpoID0gMHgwMmE0O1xuICB0LmRoYWJlbmdhbGkgPSAweDA5YTc7XG4gIHQuZGhhZGV2YSA9IDB4MDkyNztcbiAgdC5kaGFndWphcmF0aSA9IDB4MGFhNztcbiAgdC5kaGFndXJtdWtoaSA9IDB4MGEyNztcbiAgdC5kaG9vayA9IDB4MDI1NztcbiAgdC5kaWFseXRpa2F0b25vcyA9IDB4MDM4NTtcbiAgdC5kaWFseXRpa2F0b25vc2NtYiA9IDB4MDM0NDtcbiAgdC5kaWFtb25kID0gMHgyNjY2O1xuICB0LmRpYW1vbmRzdWl0d2hpdGUgPSAweDI2NjI7XG4gIHQuZGllcmVzaXMgPSAweDAwYTg7XG4gIHQuZGllcmVzaXNhY3V0ZSA9IDB4ZjZkNztcbiAgdC5kaWVyZXNpc2JlbG93Y21iID0gMHgwMzI0O1xuICB0LmRpZXJlc2lzY21iID0gMHgwMzA4O1xuICB0LmRpZXJlc2lzZ3JhdmUgPSAweGY2ZDg7XG4gIHQuZGllcmVzaXN0b25vcyA9IDB4MDM4NTtcbiAgdC5kaWhpcmFnYW5hID0gMHgzMDYyO1xuICB0LmRpa2F0YWthbmEgPSAweDMwYzI7XG4gIHQuZGl0dG9tYXJrID0gMHgzMDAzO1xuICB0LmRpdmlkZSA9IDB4MDBmNztcbiAgdC5kaXZpZGVzID0gMHgyMjIzO1xuICB0LmRpdmlzaW9uc2xhc2ggPSAweDIyMTU7XG4gIHQuZGplY3lyaWxsaWMgPSAweDA0NTI7XG4gIHQuZGtzaGFkZSA9IDB4MjU5MztcbiAgdC5kbGluZWJlbG93ID0gMHgxZTBmO1xuICB0LmRsc3F1YXJlID0gMHgzMzk3O1xuICB0LmRtYWNyb24gPSAweDAxMTE7XG4gIHQuZG1vbm9zcGFjZSA9IDB4ZmY0NDtcbiAgdC5kbmJsb2NrID0gMHgyNTg0O1xuICB0LmRvY2hhZGF0aGFpID0gMHgwZTBlO1xuICB0LmRvZGVrdGhhaSA9IDB4MGUxNDtcbiAgdC5kb2hpcmFnYW5hID0gMHgzMDY5O1xuICB0LmRva2F0YWthbmEgPSAweDMwYzk7XG4gIHQuZG9sbGFyID0gMHgwMDI0O1xuICB0LmRvbGxhcmluZmVyaW9yID0gMHhmNmUzO1xuICB0LmRvbGxhcm1vbm9zcGFjZSA9IDB4ZmYwNDtcbiAgdC5kb2xsYXJvbGRzdHlsZSA9IDB4ZjcyNDtcbiAgdC5kb2xsYXJzbWFsbCA9IDB4ZmU2OTtcbiAgdC5kb2xsYXJzdXBlcmlvciA9IDB4ZjZlNDtcbiAgdC5kb25nID0gMHgyMGFiO1xuICB0LmRvcnVzcXVhcmUgPSAweDMzMjY7XG4gIHQuZG90YWNjZW50ID0gMHgwMmQ5O1xuICB0LmRvdGFjY2VudGNtYiA9IDB4MDMwNztcbiAgdC5kb3RiZWxvd2NtYiA9IDB4MDMyMztcbiAgdC5kb3RiZWxvd2NvbWIgPSAweDAzMjM7XG4gIHQuZG90a2F0YWthbmEgPSAweDMwZmI7XG4gIHQuZG90bGVzc2kgPSAweDAxMzE7XG4gIHQuZG90bGVzc2ogPSAweGY2YmU7XG4gIHQuZG90bGVzc2pzdHJva2Vob29rID0gMHgwMjg0O1xuICB0LmRvdG1hdGggPSAweDIyYzU7XG4gIHQuZG90dGVkY2lyY2xlID0gMHgyNWNjO1xuICB0LmRvdWJsZXlvZHBhdGFoID0gMHhmYjFmO1xuICB0LmRvdWJsZXlvZHBhdGFoaGVicmV3ID0gMHhmYjFmO1xuICB0LmRvd250YWNrYmVsb3djbWIgPSAweDAzMWU7XG4gIHQuZG93bnRhY2ttb2QgPSAweDAyZDU7XG4gIHQuZHBhcmVuID0gMHgyNDlmO1xuICB0LmRzdXBlcmlvciA9IDB4ZjZlYjtcbiAgdC5kdGFpbCA9IDB4MDI1NjtcbiAgdC5kdG9wYmFyID0gMHgwMThjO1xuICB0LmR1aGlyYWdhbmEgPSAweDMwNjU7XG4gIHQuZHVrYXRha2FuYSA9IDB4MzBjNTtcbiAgdC5keiA9IDB4MDFmMztcbiAgdC5kemFsdG9uZSA9IDB4MDJhMztcbiAgdC5kemNhcm9uID0gMHgwMWM2O1xuICB0LmR6Y3VybCA9IDB4MDJhNTtcbiAgdC5kemVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRlMTtcbiAgdC5kemVjeXJpbGxpYyA9IDB4MDQ1NTtcbiAgdC5kemhlY3lyaWxsaWMgPSAweDA0NWY7XG4gIHQuZSA9IDB4MDA2NTtcbiAgdC5lYWN1dGUgPSAweDAwZTk7XG4gIHQuZWFydGggPSAweDI2NDE7XG4gIHQuZWJlbmdhbGkgPSAweDA5OGY7XG4gIHQuZWJvcG9tb2ZvID0gMHgzMTFjO1xuICB0LmVicmV2ZSA9IDB4MDExNTtcbiAgdC5lY2FuZHJhZGV2YSA9IDB4MDkwZDtcbiAgdC5lY2FuZHJhZ3VqYXJhdGkgPSAweDBhOGQ7XG4gIHQuZWNhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDU7XG4gIHQuZWNhbmRyYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM1O1xuICB0LmVjYXJvbiA9IDB4MDExYjtcbiAgdC5lY2VkaWxsYWJyZXZlID0gMHgxZTFkO1xuICB0LmVjaGFybWVuaWFuID0gMHgwNTY1O1xuICB0LmVjaHlpd25hcm1lbmlhbiA9IDB4MDU4NztcbiAgdC5lY2lyY2xlID0gMHgyNGQ0O1xuICB0LmVjaXJjdW1mbGV4ID0gMHgwMGVhO1xuICB0LmVjaXJjdW1mbGV4YWN1dGUgPSAweDFlYmY7XG4gIHQuZWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxOTtcbiAgdC5lY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWM3O1xuICB0LmVjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYzE7XG4gIHQuZWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzM7XG4gIHQuZWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNTtcbiAgdC5lY3lyaWxsaWMgPSAweDA0NTQ7XG4gIHQuZWRibGdyYXZlID0gMHgwMjA1O1xuICB0LmVkZXZhID0gMHgwOTBmO1xuICB0LmVkaWVyZXNpcyA9IDB4MDBlYjtcbiAgdC5lZG90ID0gMHgwMTE3O1xuICB0LmVkb3RhY2NlbnQgPSAweDAxMTc7XG4gIHQuZWRvdGJlbG93ID0gMHgxZWI5O1xuICB0LmVlZ3VybXVraGkgPSAweDBhMGY7XG4gIHQuZWVtYXRyYWd1cm11a2hpID0gMHgwYTQ3O1xuICB0LmVmY3lyaWxsaWMgPSAweDA0NDQ7XG4gIHQuZWdyYXZlID0gMHgwMGU4O1xuICB0LmVndWphcmF0aSA9IDB4MGE4ZjtcbiAgdC5laGFybWVuaWFuID0gMHgwNTY3O1xuICB0LmVoYm9wb21vZm8gPSAweDMxMWQ7XG4gIHQuZWhpcmFnYW5hID0gMHgzMDQ4O1xuICB0LmVob29rYWJvdmUgPSAweDFlYmI7XG4gIHQuZWlib3BvbW9mbyA9IDB4MzExZjtcbiAgdC5laWdodCA9IDB4MDAzODtcbiAgdC5laWdodGFyYWJpYyA9IDB4MDY2ODtcbiAgdC5laWdodGJlbmdhbGkgPSAweDA5ZWU7XG4gIHQuZWlnaHRjaXJjbGUgPSAweDI0Njc7XG4gIHQuZWlnaHRjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzkxO1xuICB0LmVpZ2h0ZGV2YSA9IDB4MDk2ZTtcbiAgdC5laWdodGVlbmNpcmNsZSA9IDB4MjQ3MTtcbiAgdC5laWdodGVlbnBhcmVuID0gMHgyNDg1O1xuICB0LmVpZ2h0ZWVucGVyaW9kID0gMHgyNDk5O1xuICB0LmVpZ2h0Z3VqYXJhdGkgPSAweDBhZWU7XG4gIHQuZWlnaHRndXJtdWtoaSA9IDB4MGE2ZTtcbiAgdC5laWdodGhhY2thcmFiaWMgPSAweDA2Njg7XG4gIHQuZWlnaHRoYW5nemhvdSA9IDB4MzAyODtcbiAgdC5laWdodGhub3RlYmVhbWVkID0gMHgyNjZiO1xuICB0LmVpZ2h0aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNztcbiAgdC5laWdodGluZmVyaW9yID0gMHgyMDg4O1xuICB0LmVpZ2h0bW9ub3NwYWNlID0gMHhmZjE4O1xuICB0LmVpZ2h0b2xkc3R5bGUgPSAweGY3Mzg7XG4gIHQuZWlnaHRwYXJlbiA9IDB4MjQ3YjtcbiAgdC5laWdodHBlcmlvZCA9IDB4MjQ4ZjtcbiAgdC5laWdodHBlcnNpYW4gPSAweDA2Zjg7XG4gIHQuZWlnaHRyb21hbiA9IDB4MjE3NztcbiAgdC5laWdodHN1cGVyaW9yID0gMHgyMDc4O1xuICB0LmVpZ2h0dGhhaSA9IDB4MGU1ODtcbiAgdC5laW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNztcbiAgdC5laW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2NTtcbiAgdC5la2F0YWthbmEgPSAweDMwYTg7XG4gIHQuZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc0O1xuICB0LmVrb25rYXJndXJtdWtoaSA9IDB4MGE3NDtcbiAgdC5la29yZWFuID0gMHgzMTU0O1xuICB0LmVsY3lyaWxsaWMgPSAweDA0M2I7XG4gIHQuZWxlbWVudCA9IDB4MjIwODtcbiAgdC5lbGV2ZW5jaXJjbGUgPSAweDI0NmE7XG4gIHQuZWxldmVucGFyZW4gPSAweDI0N2U7XG4gIHQuZWxldmVucGVyaW9kID0gMHgyNDkyO1xuICB0LmVsZXZlbnJvbWFuID0gMHgyMTdhO1xuICB0LmVsbGlwc2lzID0gMHgyMDI2O1xuICB0LmVsbGlwc2lzdmVydGljYWwgPSAweDIyZWU7XG4gIHQuZW1hY3JvbiA9IDB4MDExMztcbiAgdC5lbWFjcm9uYWN1dGUgPSAweDFlMTc7XG4gIHQuZW1hY3JvbmdyYXZlID0gMHgxZTE1O1xuICB0LmVtY3lyaWxsaWMgPSAweDA0M2M7XG4gIHQuZW1kYXNoID0gMHgyMDE0O1xuICB0LmVtZGFzaHZlcnRpY2FsID0gMHhmZTMxO1xuICB0LmVtb25vc3BhY2UgPSAweGZmNDU7XG4gIHQuZW1waGFzaXNtYXJrYXJtZW5pYW4gPSAweDA1NWI7XG4gIHQuZW1wdHlzZXQgPSAweDIyMDU7XG4gIHQuZW5ib3BvbW9mbyA9IDB4MzEyMztcbiAgdC5lbmN5cmlsbGljID0gMHgwNDNkO1xuICB0LmVuZGFzaCA9IDB4MjAxMztcbiAgdC5lbmRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMjtcbiAgdC5lbmRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGEzO1xuICB0LmVuZyA9IDB4MDE0YjtcbiAgdC5lbmdib3BvbW9mbyA9IDB4MzEyNTtcbiAgdC5lbmdoZWN5cmlsbGljID0gMHgwNGE1O1xuICB0LmVuaG9va2N5cmlsbGljID0gMHgwNGM4O1xuICB0LmVuc3BhY2UgPSAweDIwMDI7XG4gIHQuZW9nb25layA9IDB4MDExOTtcbiAgdC5lb2tvcmVhbiA9IDB4MzE1MztcbiAgdC5lb3BlbiA9IDB4MDI1YjtcbiAgdC5lb3BlbmNsb3NlZCA9IDB4MDI5YTtcbiAgdC5lb3BlbnJldmVyc2VkID0gMHgwMjVjO1xuICB0LmVvcGVucmV2ZXJzZWRjbG9zZWQgPSAweDAyNWU7XG4gIHQuZW9wZW5yZXZlcnNlZGhvb2sgPSAweDAyNWQ7XG4gIHQuZXBhcmVuID0gMHgyNGEwO1xuICB0LmVwc2lsb24gPSAweDAzYjU7XG4gIHQuZXBzaWxvbnRvbm9zID0gMHgwM2FkO1xuICB0LmVxdWFsID0gMHgwMDNkO1xuICB0LmVxdWFsbW9ub3NwYWNlID0gMHhmZjFkO1xuICB0LmVxdWFsc21hbGwgPSAweGZlNjY7XG4gIHQuZXF1YWxzdXBlcmlvciA9IDB4MjA3YztcbiAgdC5lcXVpdmFsZW5jZSA9IDB4MjI2MTtcbiAgdC5lcmJvcG9tb2ZvID0gMHgzMTI2O1xuICB0LmVyY3lyaWxsaWMgPSAweDA0NDA7XG4gIHQuZXJldmVyc2VkID0gMHgwMjU4O1xuICB0LmVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDRkO1xuICB0LmVzY3lyaWxsaWMgPSAweDA0NDE7XG4gIHQuZXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYjtcbiAgdC5lc2ggPSAweDAyODM7XG4gIHQuZXNoY3VybCA9IDB4MDI4NjtcbiAgdC5lc2hvcnRkZXZhID0gMHgwOTBlO1xuICB0LmVzaG9ydHZvd2Vsc2lnbmRldmEgPSAweDA5NDY7XG4gIHQuZXNocmV2ZXJzZWRsb29wID0gMHgwMWFhO1xuICB0LmVzaHNxdWF0cmV2ZXJzZWQgPSAweDAyODU7XG4gIHQuZXNtYWxsaGlyYWdhbmEgPSAweDMwNDc7XG4gIHQuZXNtYWxsa2F0YWthbmEgPSAweDMwYTc7XG4gIHQuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmE7XG4gIHQuZXN0aW1hdGVkID0gMHgyMTJlO1xuICB0LmVzdXBlcmlvciA9IDB4ZjZlYztcbiAgdC5ldGEgPSAweDAzYjc7XG4gIHQuZXRhcm1lbmlhbiA9IDB4MDU2ODtcbiAgdC5ldGF0b25vcyA9IDB4MDNhZTtcbiAgdC5ldGggPSAweDAwZjA7XG4gIHQuZXRpbGRlID0gMHgxZWJkO1xuICB0LmV0aWxkZWJlbG93ID0gMHgxZTFiO1xuICB0LmV0bmFodGFmb3VraGhlYnJldyA9IDB4MDU5MTtcbiAgdC5ldG5haHRhZm91a2hsZWZ0aGVicmV3ID0gMHgwNTkxO1xuICB0LmV0bmFodGFoZWJyZXcgPSAweDA1OTE7XG4gIHQuZXRuYWh0YWxlZnRoZWJyZXcgPSAweDA1OTE7XG4gIHQuZXR1cm5lZCA9IDB4MDFkZDtcbiAgdC5ldWtvcmVhbiA9IDB4MzE2MTtcbiAgdC5ldXJvID0gMHgyMGFjO1xuICB0LmV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWM3O1xuICB0LmV2b3dlbHNpZ25kZXZhID0gMHgwOTQ3O1xuICB0LmV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNztcbiAgdC5leGNsYW0gPSAweDAwMjE7XG4gIHQuZXhjbGFtYXJtZW5pYW4gPSAweDA1NWM7XG4gIHQuZXhjbGFtZGJsID0gMHgyMDNjO1xuICB0LmV4Y2xhbWRvd24gPSAweDAwYTE7XG4gIHQuZXhjbGFtZG93bnNtYWxsID0gMHhmN2ExO1xuICB0LmV4Y2xhbW1vbm9zcGFjZSA9IDB4ZmYwMTtcbiAgdC5leGNsYW1zbWFsbCA9IDB4ZjcyMTtcbiAgdC5leGlzdGVudGlhbCA9IDB4MjIwMztcbiAgdC5lemggPSAweDAyOTI7XG4gIHQuZXpoY2Fyb24gPSAweDAxZWY7XG4gIHQuZXpoY3VybCA9IDB4MDI5MztcbiAgdC5lemhyZXZlcnNlZCA9IDB4MDFiOTtcbiAgdC5lemh0YWlsID0gMHgwMWJhO1xuICB0LmYgPSAweDAwNjY7XG4gIHQuZmFkZXZhID0gMHgwOTVlO1xuICB0LmZhZ3VybXVraGkgPSAweDBhNWU7XG4gIHQuZmFocmVuaGVpdCA9IDB4MjEwOTtcbiAgdC5mYXRoYWFyYWJpYyA9IDB4MDY0ZTtcbiAgdC5mYXRoYWxvd2FyYWJpYyA9IDB4MDY0ZTtcbiAgdC5mYXRoYXRhbmFyYWJpYyA9IDB4MDY0YjtcbiAgdC5mYm9wb21vZm8gPSAweDMxMDg7XG4gIHQuZmNpcmNsZSA9IDB4MjRkNTtcbiAgdC5mZG90YWNjZW50ID0gMHgxZTFmO1xuICB0LmZlaGFyYWJpYyA9IDB4MDY0MTtcbiAgdC5mZWhhcm1lbmlhbiA9IDB4MDU4NjtcbiAgdC5mZWhmaW5hbGFyYWJpYyA9IDB4ZmVkMjtcbiAgdC5mZWhpbml0aWFsYXJhYmljID0gMHhmZWQzO1xuICB0LmZlaG1lZGlhbGFyYWJpYyA9IDB4ZmVkNDtcbiAgdC5mZWljb3B0aWMgPSAweDAzZTU7XG4gIHQuZmVtYWxlID0gMHgyNjQwO1xuICB0LmZmID0gMHhmYjAwO1xuICB0LmZfZiA9IDB4ZmIwMDsgLy8gRml4ZXMgaXNzdWUgMTEwMTYuXG4gIHQuZmZpID0gMHhmYjAzO1xuICB0LmZmbCA9IDB4ZmIwNDtcbiAgdC5maSA9IDB4ZmIwMTtcbiAgdC5maWZ0ZWVuY2lyY2xlID0gMHgyNDZlO1xuICB0LmZpZnRlZW5wYXJlbiA9IDB4MjQ4MjtcbiAgdC5maWZ0ZWVucGVyaW9kID0gMHgyNDk2O1xuICB0LmZpZ3VyZWRhc2ggPSAweDIwMTI7XG4gIHQuZmlsbGVkYm94ID0gMHgyNWEwO1xuICB0LmZpbGxlZHJlY3QgPSAweDI1YWM7XG4gIHQuZmluYWxrYWYgPSAweDA1ZGE7XG4gIHQuZmluYWxrYWZkYWdlc2ggPSAweGZiM2E7XG4gIHQuZmluYWxrYWZkYWdlc2hoZWJyZXcgPSAweGZiM2E7XG4gIHQuZmluYWxrYWZoZWJyZXcgPSAweDA1ZGE7XG4gIHQuZmluYWxtZW0gPSAweDA1ZGQ7XG4gIHQuZmluYWxtZW1oZWJyZXcgPSAweDA1ZGQ7XG4gIHQuZmluYWxudW4gPSAweDA1ZGY7XG4gIHQuZmluYWxudW5oZWJyZXcgPSAweDA1ZGY7XG4gIHQuZmluYWxwZSA9IDB4MDVlMztcbiAgdC5maW5hbHBlaGVicmV3ID0gMHgwNWUzO1xuICB0LmZpbmFsdHNhZGkgPSAweDA1ZTU7XG4gIHQuZmluYWx0c2FkaWhlYnJldyA9IDB4MDVlNTtcbiAgdC5maXJzdHRvbmVjaGluZXNlID0gMHgwMmM5O1xuICB0LmZpc2hleWUgPSAweDI1Yzk7XG4gIHQuZml0YWN5cmlsbGljID0gMHgwNDczO1xuICB0LmZpdmUgPSAweDAwMzU7XG4gIHQuZml2ZWFyYWJpYyA9IDB4MDY2NTtcbiAgdC5maXZlYmVuZ2FsaSA9IDB4MDllYjtcbiAgdC5maXZlY2lyY2xlID0gMHgyNDY0O1xuICB0LmZpdmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhlO1xuICB0LmZpdmVkZXZhID0gMHgwOTZiO1xuICB0LmZpdmVlaWdodGhzID0gMHgyMTVkO1xuICB0LmZpdmVndWphcmF0aSA9IDB4MGFlYjtcbiAgdC5maXZlZ3VybXVraGkgPSAweDBhNmI7XG4gIHQuZml2ZWhhY2thcmFiaWMgPSAweDA2NjU7XG4gIHQuZml2ZWhhbmd6aG91ID0gMHgzMDI1O1xuICB0LmZpdmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI0O1xuICB0LmZpdmVpbmZlcmlvciA9IDB4MjA4NTtcbiAgdC5maXZlbW9ub3NwYWNlID0gMHhmZjE1O1xuICB0LmZpdmVvbGRzdHlsZSA9IDB4ZjczNTtcbiAgdC5maXZlcGFyZW4gPSAweDI0Nzg7XG4gIHQuZml2ZXBlcmlvZCA9IDB4MjQ4YztcbiAgdC5maXZlcGVyc2lhbiA9IDB4MDZmNTtcbiAgdC5maXZlcm9tYW4gPSAweDIxNzQ7XG4gIHQuZml2ZXN1cGVyaW9yID0gMHgyMDc1O1xuICB0LmZpdmV0aGFpID0gMHgwZTU1O1xuICB0LmZsID0gMHhmYjAyO1xuICB0LmZsb3JpbiA9IDB4MDE5MjtcbiAgdC5mbW9ub3NwYWNlID0gMHhmZjQ2O1xuICB0LmZtc3F1YXJlID0gMHgzMzk5O1xuICB0LmZvZmFudGhhaSA9IDB4MGUxZjtcbiAgdC5mb2ZhdGhhaSA9IDB4MGUxZDtcbiAgdC5mb25nbWFudGhhaSA9IDB4MGU0ZjtcbiAgdC5mb3JhbGwgPSAweDIyMDA7XG4gIHQuZm91ciA9IDB4MDAzNDtcbiAgdC5mb3VyYXJhYmljID0gMHgwNjY0O1xuICB0LmZvdXJiZW5nYWxpID0gMHgwOWVhO1xuICB0LmZvdXJjaXJjbGUgPSAweDI0NjM7XG4gIHQuZm91cmNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGQ7XG4gIHQuZm91cmRldmEgPSAweDA5NmE7XG4gIHQuZm91cmd1amFyYXRpID0gMHgwYWVhO1xuICB0LmZvdXJndXJtdWtoaSA9IDB4MGE2YTtcbiAgdC5mb3VyaGFja2FyYWJpYyA9IDB4MDY2NDtcbiAgdC5mb3VyaGFuZ3pob3UgPSAweDMwMjQ7XG4gIHQuZm91cmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjM7XG4gIHQuZm91cmluZmVyaW9yID0gMHgyMDg0O1xuICB0LmZvdXJtb25vc3BhY2UgPSAweGZmMTQ7XG4gIHQuZm91cm51bWVyYXRvcmJlbmdhbGkgPSAweDA5Zjc7XG4gIHQuZm91cm9sZHN0eWxlID0gMHhmNzM0O1xuICB0LmZvdXJwYXJlbiA9IDB4MjQ3NztcbiAgdC5mb3VycGVyaW9kID0gMHgyNDhiO1xuICB0LmZvdXJwZXJzaWFuID0gMHgwNmY0O1xuICB0LmZvdXJyb21hbiA9IDB4MjE3MztcbiAgdC5mb3Vyc3VwZXJpb3IgPSAweDIwNzQ7XG4gIHQuZm91cnRlZW5jaXJjbGUgPSAweDI0NmQ7XG4gIHQuZm91cnRlZW5wYXJlbiA9IDB4MjQ4MTtcbiAgdC5mb3VydGVlbnBlcmlvZCA9IDB4MjQ5NTtcbiAgdC5mb3VydGhhaSA9IDB4MGU1NDtcbiAgdC5mb3VydGh0b25lY2hpbmVzZSA9IDB4MDJjYjtcbiAgdC5mcGFyZW4gPSAweDI0YTE7XG4gIHQuZnJhY3Rpb24gPSAweDIwNDQ7XG4gIHQuZnJhbmMgPSAweDIwYTM7XG4gIHQuZyA9IDB4MDA2NztcbiAgdC5nYWJlbmdhbGkgPSAweDA5OTc7XG4gIHQuZ2FjdXRlID0gMHgwMWY1O1xuICB0LmdhZGV2YSA9IDB4MDkxNztcbiAgdC5nYWZhcmFiaWMgPSAweDA2YWY7XG4gIHQuZ2FmZmluYWxhcmFiaWMgPSAweGZiOTM7XG4gIHQuZ2FmaW5pdGlhbGFyYWJpYyA9IDB4ZmI5NDtcbiAgdC5nYWZtZWRpYWxhcmFiaWMgPSAweGZiOTU7XG4gIHQuZ2FndWphcmF0aSA9IDB4MGE5NztcbiAgdC5nYWd1cm11a2hpID0gMHgwYTE3O1xuICB0LmdhaGlyYWdhbmEgPSAweDMwNGM7XG4gIHQuZ2FrYXRha2FuYSA9IDB4MzBhYztcbiAgdC5nYW1tYSA9IDB4MDNiMztcbiAgdC5nYW1tYWxhdGluc21hbGwgPSAweDAyNjM7XG4gIHQuZ2FtbWFzdXBlcmlvciA9IDB4MDJlMDtcbiAgdC5nYW5naWFjb3B0aWMgPSAweDAzZWI7XG4gIHQuZ2JvcG9tb2ZvID0gMHgzMTBkO1xuICB0LmdicmV2ZSA9IDB4MDExZjtcbiAgdC5nY2Fyb24gPSAweDAxZTc7XG4gIHQuZ2NlZGlsbGEgPSAweDAxMjM7XG4gIHQuZ2NpcmNsZSA9IDB4MjRkNjtcbiAgdC5nY2lyY3VtZmxleCA9IDB4MDExZDtcbiAgdC5nY29tbWFhY2NlbnQgPSAweDAxMjM7XG4gIHQuZ2RvdCA9IDB4MDEyMTtcbiAgdC5nZG90YWNjZW50ID0gMHgwMTIxO1xuICB0LmdlY3lyaWxsaWMgPSAweDA0MzM7XG4gIHQuZ2VoaXJhZ2FuYSA9IDB4MzA1MjtcbiAgdC5nZWthdGFrYW5hID0gMHgzMGIyO1xuICB0Lmdlb21ldHJpY2FsbHllcXVhbCA9IDB4MjI1MTtcbiAgdC5nZXJlc2hhY2NlbnRoZWJyZXcgPSAweDA1OWM7XG4gIHQuZ2VyZXNoaGVicmV3ID0gMHgwNWYzO1xuICB0LmdlcmVzaG11cWRhbWhlYnJldyA9IDB4MDU5ZDtcbiAgdC5nZXJtYW5kYmxzID0gMHgwMGRmO1xuICB0LmdlcnNoYXlpbWFjY2VudGhlYnJldyA9IDB4MDU5ZTtcbiAgdC5nZXJzaGF5aW1oZWJyZXcgPSAweDA1ZjQ7XG4gIHQuZ2V0YW1hcmsgPSAweDMwMTM7XG4gIHQuZ2hhYmVuZ2FsaSA9IDB4MDk5ODtcbiAgdC5naGFkYXJtZW5pYW4gPSAweDA1NzI7XG4gIHQuZ2hhZGV2YSA9IDB4MDkxODtcbiAgdC5naGFndWphcmF0aSA9IDB4MGE5ODtcbiAgdC5naGFndXJtdWtoaSA9IDB4MGExODtcbiAgdC5naGFpbmFyYWJpYyA9IDB4MDYzYTtcbiAgdC5naGFpbmZpbmFsYXJhYmljID0gMHhmZWNlO1xuICB0LmdoYWluaW5pdGlhbGFyYWJpYyA9IDB4ZmVjZjtcbiAgdC5naGFpbm1lZGlhbGFyYWJpYyA9IDB4ZmVkMDtcbiAgdC5naGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTU7XG4gIHQuZ2hlc3Ryb2tlY3lyaWxsaWMgPSAweDA0OTM7XG4gIHQuZ2hldXB0dXJuY3lyaWxsaWMgPSAweDA0OTE7XG4gIHQuZ2hoYWRldmEgPSAweDA5NWE7XG4gIHQuZ2hoYWd1cm11a2hpID0gMHgwYTVhO1xuICB0Lmdob29rID0gMHgwMjYwO1xuICB0LmdoenNxdWFyZSA9IDB4MzM5MztcbiAgdC5naWhpcmFnYW5hID0gMHgzMDRlO1xuICB0Lmdpa2F0YWthbmEgPSAweDMwYWU7XG4gIHQuZ2ltYXJtZW5pYW4gPSAweDA1NjM7XG4gIHQuZ2ltZWwgPSAweDA1ZDI7XG4gIHQuZ2ltZWxkYWdlc2ggPSAweGZiMzI7XG4gIHQuZ2ltZWxkYWdlc2hoZWJyZXcgPSAweGZiMzI7XG4gIHQuZ2ltZWxoZWJyZXcgPSAweDA1ZDI7XG4gIHQuZ2plY3lyaWxsaWMgPSAweDA0NTM7XG4gIHQuZ2xvdHRhbGludmVydGVkc3Ryb2tlID0gMHgwMWJlO1xuICB0Lmdsb3R0YWxzdG9wID0gMHgwMjk0O1xuICB0Lmdsb3R0YWxzdG9waW52ZXJ0ZWQgPSAweDAyOTY7XG4gIHQuZ2xvdHRhbHN0b3Btb2QgPSAweDAyYzA7XG4gIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZCA9IDB4MDI5NTtcbiAgdC5nbG90dGFsc3RvcHJldmVyc2VkbW9kID0gMHgwMmMxO1xuICB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvciA9IDB4MDJlNDtcbiAgdC5nbG90dGFsc3RvcHN0cm9rZSA9IDB4MDJhMTtcbiAgdC5nbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkID0gMHgwMmEyO1xuICB0LmdtYWNyb24gPSAweDFlMjE7XG4gIHQuZ21vbm9zcGFjZSA9IDB4ZmY0NztcbiAgdC5nb2hpcmFnYW5hID0gMHgzMDU0O1xuICB0Lmdva2F0YWthbmEgPSAweDMwYjQ7XG4gIHQuZ3BhcmVuID0gMHgyNGEyO1xuICB0LmdwYXNxdWFyZSA9IDB4MzNhYztcbiAgdC5ncmFkaWVudCA9IDB4MjIwNztcbiAgdC5ncmF2ZSA9IDB4MDA2MDtcbiAgdC5ncmF2ZWJlbG93Y21iID0gMHgwMzE2O1xuICB0LmdyYXZlY21iID0gMHgwMzAwO1xuICB0LmdyYXZlY29tYiA9IDB4MDMwMDtcbiAgdC5ncmF2ZWRldmEgPSAweDA5NTM7XG4gIHQuZ3JhdmVsb3dtb2QgPSAweDAyY2U7XG4gIHQuZ3JhdmVtb25vc3BhY2UgPSAweGZmNDA7XG4gIHQuZ3JhdmV0b25lY21iID0gMHgwMzQwO1xuICB0LmdyZWF0ZXIgPSAweDAwM2U7XG4gIHQuZ3JlYXRlcmVxdWFsID0gMHgyMjY1O1xuICB0LmdyZWF0ZXJlcXVhbG9ybGVzcyA9IDB4MjJkYjtcbiAgdC5ncmVhdGVybW9ub3NwYWNlID0gMHhmZjFlO1xuICB0LmdyZWF0ZXJvcmVxdWl2YWxlbnQgPSAweDIyNzM7XG4gIHQuZ3JlYXRlcm9ybGVzcyA9IDB4MjI3NztcbiAgdC5ncmVhdGVyb3ZlcmVxdWFsID0gMHgyMjY3O1xuICB0LmdyZWF0ZXJzbWFsbCA9IDB4ZmU2NTtcbiAgdC5nc2NyaXB0ID0gMHgwMjYxO1xuICB0LmdzdHJva2UgPSAweDAxZTU7XG4gIHQuZ3VoaXJhZ2FuYSA9IDB4MzA1MDtcbiAgdC5ndWlsbGVtb3RsZWZ0ID0gMHgwMGFiO1xuICB0Lmd1aWxsZW1vdHJpZ2h0ID0gMHgwMGJiO1xuICB0Lmd1aWxzaW5nbGxlZnQgPSAweDIwMzk7XG4gIHQuZ3VpbHNpbmdscmlnaHQgPSAweDIwM2E7XG4gIHQuZ3VrYXRha2FuYSA9IDB4MzBiMDtcbiAgdC5ndXJhbXVzcXVhcmUgPSAweDMzMTg7XG4gIHQuZ3lzcXVhcmUgPSAweDMzYzk7XG4gIHQuaCA9IDB4MDA2ODtcbiAgdC5oYWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGE5O1xuICB0LmhhYWx0b25lYXJhYmljID0gMHgwNmMxO1xuICB0LmhhYmVuZ2FsaSA9IDB4MDliOTtcbiAgdC5oYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGIzO1xuICB0LmhhZGV2YSA9IDB4MDkzOTtcbiAgdC5oYWd1amFyYXRpID0gMHgwYWI5O1xuICB0LmhhZ3VybXVraGkgPSAweDBhMzk7XG4gIHQuaGFoYXJhYmljID0gMHgwNjJkO1xuICB0LmhhaGZpbmFsYXJhYmljID0gMHhmZWEyO1xuICB0LmhhaGluaXRpYWxhcmFiaWMgPSAweGZlYTM7XG4gIHQuaGFoaXJhZ2FuYSA9IDB4MzA2ZjtcbiAgdC5oYWhtZWRpYWxhcmFiaWMgPSAweGZlYTQ7XG4gIHQuaGFpdHVzcXVhcmUgPSAweDMzMmE7XG4gIHQuaGFrYXRha2FuYSA9IDB4MzBjZjtcbiAgdC5oYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhhO1xuICB0LmhhbGFudGd1cm11a2hpID0gMHgwYTRkO1xuICB0LmhhbXphYXJhYmljID0gMHgwNjIxO1xuICB0LmhhbXphbG93YXJhYmljID0gMHgwNjIxO1xuICB0Lmhhbmd1bGZpbGxlciA9IDB4MzE2NDtcbiAgdC5oYXJkc2lnbmN5cmlsbGljID0gMHgwNDRhO1xuICB0LmhhcnBvb25sZWZ0YmFyYnVwID0gMHgyMWJjO1xuICB0LmhhcnBvb25yaWdodGJhcmJ1cCA9IDB4MjFjMDtcbiAgdC5oYXNxdWFyZSA9IDB4MzNjYTtcbiAgdC5oYXRhZnBhdGFoID0gMHgwNWIyO1xuICB0LmhhdGFmcGF0YWgxNiA9IDB4MDViMjtcbiAgdC5oYXRhZnBhdGFoMjMgPSAweDA1YjI7XG4gIHQuaGF0YWZwYXRhaDJmID0gMHgwNWIyO1xuICB0LmhhdGFmcGF0YWhoZWJyZXcgPSAweDA1YjI7XG4gIHQuaGF0YWZwYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViMjtcbiAgdC5oYXRhZnBhdGFocXVhcnRlcmhlYnJldyA9IDB4MDViMjtcbiAgdC5oYXRhZnBhdGFod2lkZWhlYnJldyA9IDB4MDViMjtcbiAgdC5oYXRhZnFhbWF0cyA9IDB4MDViMztcbiAgdC5oYXRhZnFhbWF0czFiID0gMHgwNWIzO1xuICB0LmhhdGFmcWFtYXRzMjggPSAweDA1YjM7XG4gIHQuaGF0YWZxYW1hdHMzNCA9IDB4MDViMztcbiAgdC5oYXRhZnFhbWF0c2hlYnJldyA9IDB4MDViMztcbiAgdC5oYXRhZnFhbWF0c25hcnJvd2hlYnJldyA9IDB4MDViMztcbiAgdC5oYXRhZnFhbWF0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1YjM7XG4gIHQuaGF0YWZxYW1hdHN3aWRlaGVicmV3ID0gMHgwNWIzO1xuICB0LmhhdGFmc2Vnb2wgPSAweDA1YjE7XG4gIHQuaGF0YWZzZWdvbDE3ID0gMHgwNWIxO1xuICB0LmhhdGFmc2Vnb2wyNCA9IDB4MDViMTtcbiAgdC5oYXRhZnNlZ29sMzAgPSAweDA1YjE7XG4gIHQuaGF0YWZzZWdvbGhlYnJldyA9IDB4MDViMTtcbiAgdC5oYXRhZnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWIxO1xuICB0LmhhdGFmc2Vnb2xxdWFydGVyaGVicmV3ID0gMHgwNWIxO1xuICB0LmhhdGFmc2Vnb2x3aWRlaGVicmV3ID0gMHgwNWIxO1xuICB0LmhiYXIgPSAweDAxMjc7XG4gIHQuaGJvcG9tb2ZvID0gMHgzMTBmO1xuICB0LmhicmV2ZWJlbG93ID0gMHgxZTJiO1xuICB0LmhjZWRpbGxhID0gMHgxZTI5O1xuICB0LmhjaXJjbGUgPSAweDI0ZDc7XG4gIHQuaGNpcmN1bWZsZXggPSAweDAxMjU7XG4gIHQuaGRpZXJlc2lzID0gMHgxZTI3O1xuICB0Lmhkb3RhY2NlbnQgPSAweDFlMjM7XG4gIHQuaGRvdGJlbG93ID0gMHgxZTI1O1xuICB0LmhlID0gMHgwNWQ0O1xuICB0LmhlYXJ0ID0gMHgyNjY1O1xuICB0LmhlYXJ0c3VpdGJsYWNrID0gMHgyNjY1O1xuICB0LmhlYXJ0c3VpdHdoaXRlID0gMHgyNjYxO1xuICB0LmhlZGFnZXNoID0gMHhmYjM0O1xuICB0LmhlZGFnZXNoaGVicmV3ID0gMHhmYjM0O1xuICB0LmhlaGFsdG9uZWFyYWJpYyA9IDB4MDZjMTtcbiAgdC5oZWhhcmFiaWMgPSAweDA2NDc7XG4gIHQuaGVoZWJyZXcgPSAweDA1ZDQ7XG4gIHQuaGVoZmluYWxhbHRvbmVhcmFiaWMgPSAweGZiYTc7XG4gIHQuaGVoZmluYWxhbHR0d29hcmFiaWMgPSAweGZlZWE7XG4gIHQuaGVoZmluYWxhcmFiaWMgPSAweGZlZWE7XG4gIHQuaGVoaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmYmE1O1xuICB0LmhlaGhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmJhNDtcbiAgdC5oZWhpbml0aWFsYWx0b25lYXJhYmljID0gMHhmYmE4O1xuICB0LmhlaGluaXRpYWxhcmFiaWMgPSAweGZlZWI7XG4gIHQuaGVoaXJhZ2FuYSA9IDB4MzA3ODtcbiAgdC5oZWhtZWRpYWxhbHRvbmVhcmFiaWMgPSAweGZiYTk7XG4gIHQuaGVobWVkaWFsYXJhYmljID0gMHhmZWVjO1xuICB0LmhlaXNlaWVyYXNxdWFyZSA9IDB4MzM3YjtcbiAgdC5oZWthdGFrYW5hID0gMHgzMGQ4O1xuICB0Lmhla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGQ7XG4gIHQuaGVrdXRhYXJ1c3F1YXJlID0gMHgzMzM2O1xuICB0Lmhlbmdob29rID0gMHgwMjY3O1xuICB0LmhlcnV0dXNxdWFyZSA9IDB4MzMzOTtcbiAgdC5oZXQgPSAweDA1ZDc7XG4gIHQuaGV0aGVicmV3ID0gMHgwNWQ3O1xuICB0Lmhob29rID0gMHgwMjY2O1xuICB0Lmhob29rc3VwZXJpb3IgPSAweDAyYjE7XG4gIHQuaGlldWhhY2lyY2xla29yZWFuID0gMHgzMjdiO1xuICB0LmhpZXVoYXBhcmVua29yZWFuID0gMHgzMjFiO1xuICB0LmhpZXVoY2lyY2xla29yZWFuID0gMHgzMjZkO1xuICB0LmhpZXVoa29yZWFuID0gMHgzMTRlO1xuICB0LmhpZXVocGFyZW5rb3JlYW4gPSAweDMyMGQ7XG4gIHQuaGloaXJhZ2FuYSA9IDB4MzA3MjtcbiAgdC5oaWthdGFrYW5hID0gMHgzMGQyO1xuICB0Lmhpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGI7XG4gIHQuaGlyaXEgPSAweDA1YjQ7XG4gIHQuaGlyaXExNCA9IDB4MDViNDtcbiAgdC5oaXJpcTIxID0gMHgwNWI0O1xuICB0LmhpcmlxMmQgPSAweDA1YjQ7XG4gIHQuaGlyaXFoZWJyZXcgPSAweDA1YjQ7XG4gIHQuaGlyaXFuYXJyb3doZWJyZXcgPSAweDA1YjQ7XG4gIHQuaGlyaXFxdWFydGVyaGVicmV3ID0gMHgwNWI0O1xuICB0Lmhpcmlxd2lkZWhlYnJldyA9IDB4MDViNDtcbiAgdC5obGluZWJlbG93ID0gMHgxZTk2O1xuICB0Lmhtb25vc3BhY2UgPSAweGZmNDg7XG4gIHQuaG9hcm1lbmlhbiA9IDB4MDU3MDtcbiAgdC5ob2hpcHRoYWkgPSAweDBlMmI7XG4gIHQuaG9oaXJhZ2FuYSA9IDB4MzA3YjtcbiAgdC5ob2thdGFrYW5hID0gMHgzMGRiO1xuICB0Lmhva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGU7XG4gIHQuaG9sYW0gPSAweDA1Yjk7XG4gIHQuaG9sYW0xOSA9IDB4MDViOTtcbiAgdC5ob2xhbTI2ID0gMHgwNWI5O1xuICB0LmhvbGFtMzIgPSAweDA1Yjk7XG4gIHQuaG9sYW1oZWJyZXcgPSAweDA1Yjk7XG4gIHQuaG9sYW1uYXJyb3doZWJyZXcgPSAweDA1Yjk7XG4gIHQuaG9sYW1xdWFydGVyaGVicmV3ID0gMHgwNWI5O1xuICB0LmhvbGFtd2lkZWhlYnJldyA9IDB4MDViOTtcbiAgdC5ob25va2h1a3RoYWkgPSAweDBlMmU7XG4gIHQuaG9va2Fib3ZlY29tYiA9IDB4MDMwOTtcbiAgdC5ob29rY21iID0gMHgwMzA5O1xuICB0Lmhvb2twYWxhdGFsaXplZGJlbG93Y21iID0gMHgwMzIxO1xuICB0Lmhvb2tyZXRyb2ZsZXhiZWxvd2NtYiA9IDB4MDMyMjtcbiAgdC5ob29uc3F1YXJlID0gMHgzMzQyO1xuICB0Lmhvcmljb3B0aWMgPSAweDAzZTk7XG4gIHQuaG9yaXpvbnRhbGJhciA9IDB4MjAxNTtcbiAgdC5ob3JuY21iID0gMHgwMzFiO1xuICB0LmhvdHNwcmluZ3MgPSAweDI2Njg7XG4gIHQuaG91c2UgPSAweDIzMDI7XG4gIHQuaHBhcmVuID0gMHgyNGEzO1xuICB0LmhzdXBlcmlvciA9IDB4MDJiMDtcbiAgdC5odHVybmVkID0gMHgwMjY1O1xuICB0Lmh1aGlyYWdhbmEgPSAweDMwNzU7XG4gIHQuaHVpaXRvc3F1YXJlID0gMHgzMzMzO1xuICB0Lmh1a2F0YWthbmEgPSAweDMwZDU7XG4gIHQuaHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YztcbiAgdC5odW5nYXJ1bWxhdXQgPSAweDAyZGQ7XG4gIHQuaHVuZ2FydW1sYXV0Y21iID0gMHgwMzBiO1xuICB0Lmh2ID0gMHgwMTk1O1xuICB0Lmh5cGhlbiA9IDB4MDAyZDtcbiAgdC5oeXBoZW5pbmZlcmlvciA9IDB4ZjZlNTtcbiAgdC5oeXBoZW5tb25vc3BhY2UgPSAweGZmMGQ7XG4gIHQuaHlwaGVuc21hbGwgPSAweGZlNjM7XG4gIHQuaHlwaGVuc3VwZXJpb3IgPSAweGY2ZTY7XG4gIHQuaHlwaGVudHdvID0gMHgyMDEwO1xuICB0LmkgPSAweDAwNjk7XG4gIHQuaWFjdXRlID0gMHgwMGVkO1xuICB0LmlhY3lyaWxsaWMgPSAweDA0NGY7XG4gIHQuaWJlbmdhbGkgPSAweDA5ODc7XG4gIHQuaWJvcG9tb2ZvID0gMHgzMTI3O1xuICB0LmlicmV2ZSA9IDB4MDEyZDtcbiAgdC5pY2Fyb24gPSAweDAxZDA7XG4gIHQuaWNpcmNsZSA9IDB4MjRkODtcbiAgdC5pY2lyY3VtZmxleCA9IDB4MDBlZTtcbiAgdC5pY3lyaWxsaWMgPSAweDA0NTY7XG4gIHQuaWRibGdyYXZlID0gMHgwMjA5O1xuICB0LmlkZW9ncmFwaGVhcnRoY2lyY2xlID0gMHgzMjhmO1xuICB0LmlkZW9ncmFwaGZpcmVjaXJjbGUgPSAweDMyOGI7XG4gIHQuaWRlb2dyYXBoaWNhbGxpYW5jZXBhcmVuID0gMHgzMjNmO1xuICB0LmlkZW9ncmFwaGljY2FsbHBhcmVuID0gMHgzMjNhO1xuICB0LmlkZW9ncmFwaGljY2VudHJlY2lyY2xlID0gMHgzMmE1O1xuICB0LmlkZW9ncmFwaGljY2xvc2UgPSAweDMwMDY7XG4gIHQuaWRlb2dyYXBoaWNjb21tYSA9IDB4MzAwMTtcbiAgdC5pZGVvZ3JhcGhpY2NvbW1hbGVmdCA9IDB4ZmY2NDtcbiAgdC5pZGVvZ3JhcGhpY2NvbmdyYXR1bGF0aW9ucGFyZW4gPSAweDMyMzc7XG4gIHQuaWRlb2dyYXBoaWNjb3JyZWN0Y2lyY2xlID0gMHgzMmEzO1xuICB0LmlkZW9ncmFwaGljZWFydGhwYXJlbiA9IDB4MzIyZjtcbiAgdC5pZGVvZ3JhcGhpY2VudGVycHJpc2VwYXJlbiA9IDB4MzIzZDtcbiAgdC5pZGVvZ3JhcGhpY2V4Y2VsbGVudGNpcmNsZSA9IDB4MzI5ZDtcbiAgdC5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW4gPSAweDMyNDA7XG4gIHQuaWRlb2dyYXBoaWNmaW5hbmNpYWxjaXJjbGUgPSAweDMyOTY7XG4gIHQuaWRlb2dyYXBoaWNmaW5hbmNpYWxwYXJlbiA9IDB4MzIzNjtcbiAgdC5pZGVvZ3JhcGhpY2ZpcmVwYXJlbiA9IDB4MzIyYjtcbiAgdC5pZGVvZ3JhcGhpY2hhdmVwYXJlbiA9IDB4MzIzMjtcbiAgdC5pZGVvZ3JhcGhpY2hpZ2hjaXJjbGUgPSAweDMyYTQ7XG4gIHQuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrID0gMHgzMDA1O1xuICB0LmlkZW9ncmFwaGljbGFib3JjaXJjbGUgPSAweDMyOTg7XG4gIHQuaWRlb2dyYXBoaWNsYWJvcnBhcmVuID0gMHgzMjM4O1xuICB0LmlkZW9ncmFwaGljbGVmdGNpcmNsZSA9IDB4MzJhNztcbiAgdC5pZGVvZ3JhcGhpY2xvd2NpcmNsZSA9IDB4MzJhNjtcbiAgdC5pZGVvZ3JhcGhpY21lZGljaW5lY2lyY2xlID0gMHgzMmE5O1xuICB0LmlkZW9ncmFwaGljbWV0YWxwYXJlbiA9IDB4MzIyZTtcbiAgdC5pZGVvZ3JhcGhpY21vb25wYXJlbiA9IDB4MzIyYTtcbiAgdC5pZGVvZ3JhcGhpY25hbWVwYXJlbiA9IDB4MzIzNDtcbiAgdC5pZGVvZ3JhcGhpY3BlcmlvZCA9IDB4MzAwMjtcbiAgdC5pZGVvZ3JhcGhpY3ByaW50Y2lyY2xlID0gMHgzMjllO1xuICB0LmlkZW9ncmFwaGljcmVhY2hwYXJlbiA9IDB4MzI0MztcbiAgdC5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuID0gMHgzMjM5O1xuICB0LmlkZW9ncmFwaGljcmVzb3VyY2VwYXJlbiA9IDB4MzIzZTtcbiAgdC5pZGVvZ3JhcGhpY3JpZ2h0Y2lyY2xlID0gMHgzMmE4O1xuICB0LmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlID0gMHgzMjk5O1xuICB0LmlkZW9ncmFwaGljc2VsZnBhcmVuID0gMHgzMjQyO1xuICB0LmlkZW9ncmFwaGljc29jaWV0eXBhcmVuID0gMHgzMjMzO1xuICB0LmlkZW9ncmFwaGljc3BhY2UgPSAweDMwMDA7XG4gIHQuaWRlb2dyYXBoaWNzcGVjaWFscGFyZW4gPSAweDMyMzU7XG4gIHQuaWRlb2dyYXBoaWNzdG9ja3BhcmVuID0gMHgzMjMxO1xuICB0LmlkZW9ncmFwaGljc3R1ZHlwYXJlbiA9IDB4MzIzYjtcbiAgdC5pZGVvZ3JhcGhpY3N1bnBhcmVuID0gMHgzMjMwO1xuICB0LmlkZW9ncmFwaGljc3VwZXJ2aXNlcGFyZW4gPSAweDMyM2M7XG4gIHQuaWRlb2dyYXBoaWN3YXRlcnBhcmVuID0gMHgzMjJjO1xuICB0LmlkZW9ncmFwaGljd29vZHBhcmVuID0gMHgzMjJkO1xuICB0LmlkZW9ncmFwaGljemVybyA9IDB4MzAwNztcbiAgdC5pZGVvZ3JhcGhtZXRhbGNpcmNsZSA9IDB4MzI4ZTtcbiAgdC5pZGVvZ3JhcGhtb29uY2lyY2xlID0gMHgzMjhhO1xuICB0LmlkZW9ncmFwaG5hbWVjaXJjbGUgPSAweDMyOTQ7XG4gIHQuaWRlb2dyYXBoc3VuY2lyY2xlID0gMHgzMjkwO1xuICB0LmlkZW9ncmFwaHdhdGVyY2lyY2xlID0gMHgzMjhjO1xuICB0LmlkZW9ncmFwaHdvb2RjaXJjbGUgPSAweDMyOGQ7XG4gIHQuaWRldmEgPSAweDA5MDc7XG4gIHQuaWRpZXJlc2lzID0gMHgwMGVmO1xuICB0LmlkaWVyZXNpc2FjdXRlID0gMHgxZTJmO1xuICB0LmlkaWVyZXNpc2N5cmlsbGljID0gMHgwNGU1O1xuICB0Lmlkb3RiZWxvdyA9IDB4MWVjYjtcbiAgdC5pZWJyZXZlY3lyaWxsaWMgPSAweDA0ZDc7XG4gIHQuaWVjeXJpbGxpYyA9IDB4MDQzNTtcbiAgdC5pZXVuZ2FjaXJjbGVrb3JlYW4gPSAweDMyNzU7XG4gIHQuaWV1bmdhcGFyZW5rb3JlYW4gPSAweDMyMTU7XG4gIHQuaWV1bmdjaXJjbGVrb3JlYW4gPSAweDMyNjc7XG4gIHQuaWV1bmdrb3JlYW4gPSAweDMxNDc7XG4gIHQuaWV1bmdwYXJlbmtvcmVhbiA9IDB4MzIwNztcbiAgdC5pZ3JhdmUgPSAweDAwZWM7XG4gIHQuaWd1amFyYXRpID0gMHgwYTg3O1xuICB0LmlndXJtdWtoaSA9IDB4MGEwNztcbiAgdC5paGlyYWdhbmEgPSAweDMwNDQ7XG4gIHQuaWhvb2thYm92ZSA9IDB4MWVjOTtcbiAgdC5paWJlbmdhbGkgPSAweDA5ODg7XG4gIHQuaWljeXJpbGxpYyA9IDB4MDQzODtcbiAgdC5paWRldmEgPSAweDA5MDg7XG4gIHQuaWlndWphcmF0aSA9IDB4MGE4ODtcbiAgdC5paWd1cm11a2hpID0gMHgwYTA4O1xuICB0LmlpbWF0cmFndXJtdWtoaSA9IDB4MGE0MDtcbiAgdC5paW52ZXJ0ZWRicmV2ZSA9IDB4MDIwYjtcbiAgdC5paXNob3J0Y3lyaWxsaWMgPSAweDA0Mzk7XG4gIHQuaWl2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMwO1xuICB0Lmlpdm93ZWxzaWduZGV2YSA9IDB4MDk0MDtcbiAgdC5paXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMwO1xuICB0LmlqID0gMHgwMTMzO1xuICB0LmlrYXRha2FuYSA9IDB4MzBhNDtcbiAgdC5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzI7XG4gIHQuaWtvcmVhbiA9IDB4MzE2MztcbiAgdC5pbGRlID0gMHgwMmRjO1xuICB0LmlsdXloZWJyZXcgPSAweDA1YWM7XG4gIHQuaW1hY3JvbiA9IDB4MDEyYjtcbiAgdC5pbWFjcm9uY3lyaWxsaWMgPSAweDA0ZTM7XG4gIHQuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbCA9IDB4MjI1MztcbiAgdC5pbWF0cmFndXJtdWtoaSA9IDB4MGEzZjtcbiAgdC5pbW9ub3NwYWNlID0gMHhmZjQ5O1xuICB0LmluY3JlbWVudCA9IDB4MjIwNjtcbiAgdC5pbmZpbml0eSA9IDB4MjIxZTtcbiAgdC5pbmlhcm1lbmlhbiA9IDB4MDU2YjtcbiAgdC5pbnRlZ3JhbCA9IDB4MjIyYjtcbiAgdC5pbnRlZ3JhbGJvdHRvbSA9IDB4MjMyMTtcbiAgdC5pbnRlZ3JhbGJ0ID0gMHgyMzIxO1xuICB0LmludGVncmFsZXggPSAweGY4ZjU7XG4gIHQuaW50ZWdyYWx0b3AgPSAweDIzMjA7XG4gIHQuaW50ZWdyYWx0cCA9IDB4MjMyMDtcbiAgdC5pbnRlcnNlY3Rpb24gPSAweDIyMjk7XG4gIHQuaW50aXNxdWFyZSA9IDB4MzMwNTtcbiAgdC5pbnZidWxsZXQgPSAweDI1ZDg7XG4gIHQuaW52Y2lyY2xlID0gMHgyNWQ5O1xuICB0LmludnNtaWxlZmFjZSA9IDB4MjYzYjtcbiAgdC5pb2N5cmlsbGljID0gMHgwNDUxO1xuICB0LmlvZ29uZWsgPSAweDAxMmY7XG4gIHQuaW90YSA9IDB4MDNiOTtcbiAgdC5pb3RhZGllcmVzaXMgPSAweDAzY2E7XG4gIHQuaW90YWRpZXJlc2lzdG9ub3MgPSAweDAzOTA7XG4gIHQuaW90YWxhdGluID0gMHgwMjY5O1xuICB0LmlvdGF0b25vcyA9IDB4MDNhZjtcbiAgdC5pcGFyZW4gPSAweDI0YTQ7XG4gIHQuaXJpZ3VybXVraGkgPSAweDBhNzI7XG4gIHQuaXNtYWxsaGlyYWdhbmEgPSAweDMwNDM7XG4gIHQuaXNtYWxsa2F0YWthbmEgPSAweDMwYTM7XG4gIHQuaXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjg7XG4gIHQuaXNzaGFyYmVuZ2FsaSA9IDB4MDlmYTtcbiAgdC5pc3Ryb2tlID0gMHgwMjY4O1xuICB0LmlzdXBlcmlvciA9IDB4ZjZlZDtcbiAgdC5pdGVyYXRpb25oaXJhZ2FuYSA9IDB4MzA5ZDtcbiAgdC5pdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZDtcbiAgdC5pdGlsZGUgPSAweDAxMjk7XG4gIHQuaXRpbGRlYmVsb3cgPSAweDFlMmQ7XG4gIHQuaXVib3BvbW9mbyA9IDB4MzEyOTtcbiAgdC5pdWN5cmlsbGljID0gMHgwNDRlO1xuICB0Lml2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWJmO1xuICB0Lml2b3dlbHNpZ25kZXZhID0gMHgwOTNmO1xuICB0Lml2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFiZjtcbiAgdC5pemhpdHNhY3lyaWxsaWMgPSAweDA0NzU7XG4gIHQuaXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0Nzc7XG4gIHQuaiA9IDB4MDA2YTtcbiAgdC5qYWFybWVuaWFuID0gMHgwNTcxO1xuICB0LmphYmVuZ2FsaSA9IDB4MDk5YztcbiAgdC5qYWRldmEgPSAweDA5MWM7XG4gIHQuamFndWphcmF0aSA9IDB4MGE5YztcbiAgdC5qYWd1cm11a2hpID0gMHgwYTFjO1xuICB0Lmpib3BvbW9mbyA9IDB4MzExMDtcbiAgdC5qY2Fyb24gPSAweDAxZjA7XG4gIHQuamNpcmNsZSA9IDB4MjRkOTtcbiAgdC5qY2lyY3VtZmxleCA9IDB4MDEzNTtcbiAgdC5qY3Jvc3NlZHRhaWwgPSAweDAyOWQ7XG4gIHQuamRvdGxlc3NzdHJva2UgPSAweDAyNWY7XG4gIHQuamVjeXJpbGxpYyA9IDB4MDQ1ODtcbiAgdC5qZWVtYXJhYmljID0gMHgwNjJjO1xuICB0LmplZW1maW5hbGFyYWJpYyA9IDB4ZmU5ZTtcbiAgdC5qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmU5ZjtcbiAgdC5qZWVtbWVkaWFsYXJhYmljID0gMHhmZWEwO1xuICB0LmplaGFyYWJpYyA9IDB4MDY5ODtcbiAgdC5qZWhmaW5hbGFyYWJpYyA9IDB4ZmI4YjtcbiAgdC5qaGFiZW5nYWxpID0gMHgwOTlkO1xuICB0LmpoYWRldmEgPSAweDA5MWQ7XG4gIHQuamhhZ3VqYXJhdGkgPSAweDBhOWQ7XG4gIHQuamhhZ3VybXVraGkgPSAweDBhMWQ7XG4gIHQuamhlaGFybWVuaWFuID0gMHgwNTdiO1xuICB0LmppcyA9IDB4MzAwNDtcbiAgdC5qbW9ub3NwYWNlID0gMHhmZjRhO1xuICB0LmpwYXJlbiA9IDB4MjRhNTtcbiAgdC5qc3VwZXJpb3IgPSAweDAyYjI7XG4gIHQuayA9IDB4MDA2YjtcbiAgdC5rYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMTtcbiAgdC5rYWJlbmdhbGkgPSAweDA5OTU7XG4gIHQua2FjdXRlID0gMHgxZTMxO1xuICB0LmthY3lyaWxsaWMgPSAweDA0M2E7XG4gIHQua2FkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5YjtcbiAgdC5rYWRldmEgPSAweDA5MTU7XG4gIHQua2FmID0gMHgwNWRiO1xuICB0LmthZmFyYWJpYyA9IDB4MDY0MztcbiAgdC5rYWZkYWdlc2ggPSAweGZiM2I7XG4gIHQua2FmZGFnZXNoaGVicmV3ID0gMHhmYjNiO1xuICB0LmthZmZpbmFsYXJhYmljID0gMHhmZWRhO1xuICB0LmthZmhlYnJldyA9IDB4MDVkYjtcbiAgdC5rYWZpbml0aWFsYXJhYmljID0gMHhmZWRiO1xuICB0LmthZm1lZGlhbGFyYWJpYyA9IDB4ZmVkYztcbiAgdC5rYWZyYWZlaGVicmV3ID0gMHhmYjRkO1xuICB0LmthZ3VqYXJhdGkgPSAweDBhOTU7XG4gIHQua2FndXJtdWtoaSA9IDB4MGExNTtcbiAgdC5rYWhpcmFnYW5hID0gMHgzMDRiO1xuICB0LmthaG9va2N5cmlsbGljID0gMHgwNGM0O1xuICB0Lmtha2F0YWthbmEgPSAweDMwYWI7XG4gIHQua2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NjtcbiAgdC5rYXBwYSA9IDB4MDNiYTtcbiAgdC5rYXBwYXN5bWJvbGdyZWVrID0gMHgwM2YwO1xuICB0LmthcHllb3VubWlldW1rb3JlYW4gPSAweDMxNzE7XG4gIHQua2FweWVvdW5waGlldXBoa29yZWFuID0gMHgzMTg0O1xuICB0LmthcHllb3VucGlldXBrb3JlYW4gPSAweDMxNzg7XG4gIHQua2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTc5O1xuICB0Lmthcm9yaWlzcXVhcmUgPSAweDMzMGQ7XG4gIHQua2FzaGlkYWF1dG9hcmFiaWMgPSAweDA2NDA7XG4gIHQua2FzaGlkYWF1dG9ub3NpZGViZWFyaW5nYXJhYmljID0gMHgwNjQwO1xuICB0Lmthc21hbGxrYXRha2FuYSA9IDB4MzBmNTtcbiAgdC5rYXNxdWFyZSA9IDB4MzM4NDtcbiAgdC5rYXNyYWFyYWJpYyA9IDB4MDY1MDtcbiAgdC5rYXNyYXRhbmFyYWJpYyA9IDB4MDY0ZDtcbiAgdC5rYXN0cm9rZWN5cmlsbGljID0gMHgwNDlmO1xuICB0LmthdGFoaXJhcHJvbG9uZ21hcmtoYWxmd2lkdGggPSAweGZmNzA7XG4gIHQua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNDlkO1xuICB0Lmtib3BvbW9mbyA9IDB4MzEwZTtcbiAgdC5rY2Fsc3F1YXJlID0gMHgzMzg5O1xuICB0LmtjYXJvbiA9IDB4MDFlOTtcbiAgdC5rY2VkaWxsYSA9IDB4MDEzNztcbiAgdC5rY2lyY2xlID0gMHgyNGRhO1xuICB0Lmtjb21tYWFjY2VudCA9IDB4MDEzNztcbiAgdC5rZG90YmVsb3cgPSAweDFlMzM7XG4gIHQua2VoYXJtZW5pYW4gPSAweDA1ODQ7XG4gIHQua2VoaXJhZ2FuYSA9IDB4MzA1MTtcbiAgdC5rZWthdGFrYW5hID0gMHgzMGIxO1xuICB0Lmtla2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzk7XG4gIHQua2VuYXJtZW5pYW4gPSAweDA1NmY7XG4gIHQua2VzbWFsbGthdGFrYW5hID0gMHgzMGY2O1xuICB0LmtncmVlbmxhbmRpYyA9IDB4MDEzODtcbiAgdC5raGFiZW5nYWxpID0gMHgwOTk2O1xuICB0LmtoYWN5cmlsbGljID0gMHgwNDQ1O1xuICB0LmtoYWRldmEgPSAweDA5MTY7XG4gIHQua2hhZ3VqYXJhdGkgPSAweDBhOTY7XG4gIHQua2hhZ3VybXVraGkgPSAweDBhMTY7XG4gIHQua2hhaGFyYWJpYyA9IDB4MDYyZTtcbiAgdC5raGFoZmluYWxhcmFiaWMgPSAweGZlYTY7XG4gIHQua2hhaGluaXRpYWxhcmFiaWMgPSAweGZlYTc7XG4gIHQua2hhaG1lZGlhbGFyYWJpYyA9IDB4ZmVhODtcbiAgdC5raGVpY29wdGljID0gMHgwM2U3O1xuICB0LmtoaGFkZXZhID0gMHgwOTU5O1xuICB0LmtoaGFndXJtdWtoaSA9IDB4MGE1OTtcbiAgdC5raGlldWtoYWNpcmNsZWtvcmVhbiA9IDB4MzI3ODtcbiAgdC5raGlldWtoYXBhcmVua29yZWFuID0gMHgzMjE4O1xuICB0LmtoaWV1a2hjaXJjbGVrb3JlYW4gPSAweDMyNmE7XG4gIHQua2hpZXVraGtvcmVhbiA9IDB4MzE0YjtcbiAgdC5raGlldWtocGFyZW5rb3JlYW4gPSAweDMyMGE7XG4gIHQua2hva2hhaXRoYWkgPSAweDBlMDI7XG4gIHQua2hva2hvbnRoYWkgPSAweDBlMDU7XG4gIHQua2hva2h1YXR0aGFpID0gMHgwZTAzO1xuICB0Lmtob2tod2FpdGhhaSA9IDB4MGUwNDtcbiAgdC5raG9tdXR0aGFpID0gMHgwZTViO1xuICB0Lmtob29rID0gMHgwMTk5O1xuICB0Lmtob3Jha2hhbmd0aGFpID0gMHgwZTA2O1xuICB0LmtoenNxdWFyZSA9IDB4MzM5MTtcbiAgdC5raWhpcmFnYW5hID0gMHgzMDRkO1xuICB0Lmtpa2F0YWthbmEgPSAweDMwYWQ7XG4gIHQua2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NztcbiAgdC5raXJvZ3VyYW11c3F1YXJlID0gMHgzMzE1O1xuICB0Lmtpcm9tZWV0b3J1c3F1YXJlID0gMHgzMzE2O1xuICB0Lmtpcm9zcXVhcmUgPSAweDMzMTQ7XG4gIHQua2l5ZW9rYWNpcmNsZWtvcmVhbiA9IDB4MzI2ZTtcbiAgdC5raXllb2thcGFyZW5rb3JlYW4gPSAweDMyMGU7XG4gIHQua2l5ZW9rY2lyY2xla29yZWFuID0gMHgzMjYwO1xuICB0LmtpeWVva2tvcmVhbiA9IDB4MzEzMTtcbiAgdC5raXllb2twYXJlbmtvcmVhbiA9IDB4MzIwMDtcbiAgdC5raXllb2tzaW9za29yZWFuID0gMHgzMTMzO1xuICB0LmtqZWN5cmlsbGljID0gMHgwNDVjO1xuICB0LmtsaW5lYmVsb3cgPSAweDFlMzU7XG4gIHQua2xzcXVhcmUgPSAweDMzOTg7XG4gIHQua21jdWJlZHNxdWFyZSA9IDB4MzNhNjtcbiAgdC5rbW9ub3NwYWNlID0gMHhmZjRiO1xuICB0Lmttc3F1YXJlZHNxdWFyZSA9IDB4MzNhMjtcbiAgdC5rb2hpcmFnYW5hID0gMHgzMDUzO1xuICB0LmtvaG1zcXVhcmUgPSAweDMzYzA7XG4gIHQua29rYWl0aGFpID0gMHgwZTAxO1xuICB0Lmtva2F0YWthbmEgPSAweDMwYjM7XG4gIHQua29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YTtcbiAgdC5rb29wb3NxdWFyZSA9IDB4MzMxZTtcbiAgdC5rb3BwYWN5cmlsbGljID0gMHgwNDgxO1xuICB0LmtvcmVhbnN0YW5kYXJkc3ltYm9sID0gMHgzMjdmO1xuICB0Lmtvcm9uaXNjbWIgPSAweDAzNDM7XG4gIHQua3BhcmVuID0gMHgyNGE2O1xuICB0LmtwYXNxdWFyZSA9IDB4MzNhYTtcbiAgdC5rc2ljeXJpbGxpYyA9IDB4MDQ2ZjtcbiAgdC5rdHNxdWFyZSA9IDB4MzNjZjtcbiAgdC5rdHVybmVkID0gMHgwMjllO1xuICB0Lmt1aGlyYWdhbmEgPSAweDMwNGY7XG4gIHQua3VrYXRha2FuYSA9IDB4MzBhZjtcbiAgdC5rdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc4O1xuICB0Lmt2c3F1YXJlID0gMHgzM2I4O1xuICB0Lmt3c3F1YXJlID0gMHgzM2JlO1xuICB0LmwgPSAweDAwNmM7XG4gIHQubGFiZW5nYWxpID0gMHgwOWIyO1xuICB0LmxhY3V0ZSA9IDB4MDEzYTtcbiAgdC5sYWRldmEgPSAweDA5MzI7XG4gIHQubGFndWphcmF0aSA9IDB4MGFiMjtcbiAgdC5sYWd1cm11a2hpID0gMHgwYTMyO1xuICB0Lmxha2toYW5neWFvdGhhaSA9IDB4MGU0NTtcbiAgdC5sYW1hbGVmZmluYWxhcmFiaWMgPSAweGZlZmM7XG4gIHQubGFtYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmVmODtcbiAgdC5sYW1hbGVmaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmZWY3O1xuICB0LmxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWMgPSAweGZlZmE7XG4gIHQubGFtYWxlZmhhbXphYmVsb3dpc29sYXRlZGFyYWJpYyA9IDB4ZmVmOTtcbiAgdC5sYW1hbGVmaXNvbGF0ZWRhcmFiaWMgPSAweGZlZmI7XG4gIHQubGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmVmNjtcbiAgdC5sYW1hbGVmbWFkZGFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmZWY1O1xuICB0LmxhbWFyYWJpYyA9IDB4MDY0NDtcbiAgdC5sYW1iZGEgPSAweDAzYmI7XG4gIHQubGFtYmRhc3Ryb2tlID0gMHgwMTliO1xuICB0LmxhbWVkID0gMHgwNWRjO1xuICB0LmxhbWVkZGFnZXNoID0gMHhmYjNjO1xuICB0LmxhbWVkZGFnZXNoaGVicmV3ID0gMHhmYjNjO1xuICB0LmxhbWVkaGVicmV3ID0gMHgwNWRjO1xuICB0LmxhbWZpbmFsYXJhYmljID0gMHhmZWRlO1xuICB0LmxhbWhhaGluaXRpYWxhcmFiaWMgPSAweGZjY2E7XG4gIHQubGFtaW5pdGlhbGFyYWJpYyA9IDB4ZmVkZjtcbiAgdC5sYW1qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNjOTtcbiAgdC5sYW1raGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNjYjtcbiAgdC5sYW1sYW1oZWhpc29sYXRlZGFyYWJpYyA9IDB4ZmRmMjtcbiAgdC5sYW1tZWRpYWxhcmFiaWMgPSAweGZlZTA7XG4gIHQubGFtbWVlbWhhaGluaXRpYWxhcmFiaWMgPSAweGZkODg7XG4gIHQubGFtbWVlbWluaXRpYWxhcmFiaWMgPSAweGZjY2M7XG4gIHQubGFyZ2VjaXJjbGUgPSAweDI1ZWY7XG4gIHQubGJhciA9IDB4MDE5YTtcbiAgdC5sYmVsdCA9IDB4MDI2YztcbiAgdC5sYm9wb21vZm8gPSAweDMxMGM7XG4gIHQubGNhcm9uID0gMHgwMTNlO1xuICB0LmxjZWRpbGxhID0gMHgwMTNjO1xuICB0LmxjaXJjbGUgPSAweDI0ZGI7XG4gIHQubGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzZDtcbiAgdC5sY29tbWFhY2NlbnQgPSAweDAxM2M7XG4gIHQubGRvdCA9IDB4MDE0MDtcbiAgdC5sZG90YWNjZW50ID0gMHgwMTQwO1xuICB0Lmxkb3RiZWxvdyA9IDB4MWUzNztcbiAgdC5sZG90YmVsb3dtYWNyb24gPSAweDFlMzk7XG4gIHQubGVmdGFuZ2xlYWJvdmVjbWIgPSAweDAzMWE7XG4gIHQubGVmdHRhY2tiZWxvd2NtYiA9IDB4MDMxODtcbiAgdC5sZXNzID0gMHgwMDNjO1xuICB0Lmxlc3NlcXVhbCA9IDB4MjI2NDtcbiAgdC5sZXNzZXF1YWxvcmdyZWF0ZXIgPSAweDIyZGE7XG4gIHQubGVzc21vbm9zcGFjZSA9IDB4ZmYxYztcbiAgdC5sZXNzb3JlcXVpdmFsZW50ID0gMHgyMjcyO1xuICB0Lmxlc3NvcmdyZWF0ZXIgPSAweDIyNzY7XG4gIHQubGVzc292ZXJlcXVhbCA9IDB4MjI2NjtcbiAgdC5sZXNzc21hbGwgPSAweGZlNjQ7XG4gIHQubGV6aCA9IDB4MDI2ZTtcbiAgdC5sZmJsb2NrID0gMHgyNThjO1xuICB0Lmxob29rcmV0cm9mbGV4ID0gMHgwMjZkO1xuICB0LmxpcmEgPSAweDIwYTQ7XG4gIHQubGl3bmFybWVuaWFuID0gMHgwNTZjO1xuICB0LmxqID0gMHgwMWM5O1xuICB0LmxqZWN5cmlsbGljID0gMHgwNDU5O1xuICB0LmxsID0gMHhmNmMwO1xuICB0LmxsYWRldmEgPSAweDA5MzM7XG4gIHQubGxhZ3VqYXJhdGkgPSAweDBhYjM7XG4gIHQubGxpbmViZWxvdyA9IDB4MWUzYjtcbiAgdC5sbGxhZGV2YSA9IDB4MDkzNDtcbiAgdC5sbHZvY2FsaWNiZW5nYWxpID0gMHgwOWUxO1xuICB0Lmxsdm9jYWxpY2RldmEgPSAweDA5NjE7XG4gIHQubGx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDllMztcbiAgdC5sbHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYzO1xuICB0LmxtaWRkbGV0aWxkZSA9IDB4MDI2YjtcbiAgdC5sbW9ub3NwYWNlID0gMHhmZjRjO1xuICB0Lmxtc3F1YXJlID0gMHgzM2QwO1xuICB0LmxvY2h1bGF0aGFpID0gMHgwZTJjO1xuICB0LmxvZ2ljYWxhbmQgPSAweDIyMjc7XG4gIHQubG9naWNhbG5vdCA9IDB4MDBhYztcbiAgdC5sb2dpY2Fsbm90cmV2ZXJzZWQgPSAweDIzMTA7XG4gIHQubG9naWNhbG9yID0gMHgyMjI4O1xuICB0LmxvbGluZ3RoYWkgPSAweDBlMjU7XG4gIHQubG9uZ3MgPSAweDAxN2Y7XG4gIHQubG93bGluZWNlbnRlcmxpbmUgPSAweGZlNGU7XG4gIHQubG93bGluZWNtYiA9IDB4MDMzMjtcbiAgdC5sb3dsaW5lZGFzaGVkID0gMHhmZTRkO1xuICB0LmxvemVuZ2UgPSAweDI1Y2E7XG4gIHQubHBhcmVuID0gMHgyNGE3O1xuICB0LmxzbGFzaCA9IDB4MDE0MjtcbiAgdC5sc3F1YXJlID0gMHgyMTEzO1xuICB0LmxzdXBlcmlvciA9IDB4ZjZlZTtcbiAgdC5sdHNoYWRlID0gMHgyNTkxO1xuICB0Lmx1dGhhaSA9IDB4MGUyNjtcbiAgdC5sdm9jYWxpY2JlbmdhbGkgPSAweDA5OGM7XG4gIHQubHZvY2FsaWNkZXZhID0gMHgwOTBjO1xuICB0Lmx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDllMjtcbiAgdC5sdm9jYWxpY3Zvd2Vsc2lnbmRldmEgPSAweDA5NjI7XG4gIHQubHhzcXVhcmUgPSAweDMzZDM7XG4gIHQubSA9IDB4MDA2ZDtcbiAgdC5tYWJlbmdhbGkgPSAweDA5YWU7XG4gIHQubWFjcm9uID0gMHgwMGFmO1xuICB0Lm1hY3JvbmJlbG93Y21iID0gMHgwMzMxO1xuICB0Lm1hY3JvbmNtYiA9IDB4MDMwNDtcbiAgdC5tYWNyb25sb3dtb2QgPSAweDAyY2Q7XG4gIHQubWFjcm9ubW9ub3NwYWNlID0gMHhmZmUzO1xuICB0Lm1hY3V0ZSA9IDB4MWUzZjtcbiAgdC5tYWRldmEgPSAweDA5MmU7XG4gIHQubWFndWphcmF0aSA9IDB4MGFhZTtcbiAgdC5tYWd1cm11a2hpID0gMHgwYTJlO1xuICB0Lm1haGFwYWtoaGVicmV3ID0gMHgwNWE0O1xuICB0Lm1haGFwYWtobGVmdGhlYnJldyA9IDB4MDVhNDtcbiAgdC5tYWhpcmFnYW5hID0gMHgzMDdlO1xuICB0Lm1haWNoYXR0YXdhbG93bGVmdHRoYWkgPSAweGY4OTU7XG4gIHQubWFpY2hhdHRhd2Fsb3dyaWdodHRoYWkgPSAweGY4OTQ7XG4gIHQubWFpY2hhdHRhd2F0aGFpID0gMHgwZTRiO1xuICB0Lm1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MztcbiAgdC5tYWlla2xvd2xlZnR0aGFpID0gMHhmODhjO1xuICB0Lm1haWVrbG93cmlnaHR0aGFpID0gMHhmODhiO1xuICB0Lm1haWVrdGhhaSA9IDB4MGU0ODtcbiAgdC5tYWlla3VwcGVybGVmdHRoYWkgPSAweGY4OGE7XG4gIHQubWFpaGFuYWthdGxlZnR0aGFpID0gMHhmODg0O1xuICB0Lm1haWhhbmFrYXR0aGFpID0gMHgwZTMxO1xuICB0Lm1haXRhaWtodWxlZnR0aGFpID0gMHhmODg5O1xuICB0Lm1haXRhaWtodXRoYWkgPSAweDBlNDc7XG4gIHQubWFpdGhvbG93bGVmdHRoYWkgPSAweGY4OGY7XG4gIHQubWFpdGhvbG93cmlnaHR0aGFpID0gMHhmODhlO1xuICB0Lm1haXRob3RoYWkgPSAweDBlNDk7XG4gIHQubWFpdGhvdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4ZDtcbiAgdC5tYWl0cmlsb3dsZWZ0dGhhaSA9IDB4Zjg5MjtcbiAgdC5tYWl0cmlsb3dyaWdodHRoYWkgPSAweGY4OTE7XG4gIHQubWFpdHJpdGhhaSA9IDB4MGU0YTtcbiAgdC5tYWl0cml1cHBlcmxlZnR0aGFpID0gMHhmODkwO1xuICB0Lm1haXlhbW9rdGhhaSA9IDB4MGU0NjtcbiAgdC5tYWthdGFrYW5hID0gMHgzMGRlO1xuICB0Lm1ha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGY7XG4gIHQubWFsZSA9IDB4MjY0MjtcbiAgdC5tYW5zeW9uc3F1YXJlID0gMHgzMzQ3O1xuICB0Lm1hcWFmaGVicmV3ID0gMHgwNWJlO1xuICB0Lm1hcnMgPSAweDI2NDI7XG4gIHQubWFzb3JhY2lyY2xlaGVicmV3ID0gMHgwNWFmO1xuICB0Lm1hc3F1YXJlID0gMHgzMzgzO1xuICB0Lm1ib3BvbW9mbyA9IDB4MzEwNztcbiAgdC5tYnNxdWFyZSA9IDB4MzNkNDtcbiAgdC5tY2lyY2xlID0gMHgyNGRjO1xuICB0Lm1jdWJlZHNxdWFyZSA9IDB4MzNhNTtcbiAgdC5tZG90YWNjZW50ID0gMHgxZTQxO1xuICB0Lm1kb3RiZWxvdyA9IDB4MWU0MztcbiAgdC5tZWVtYXJhYmljID0gMHgwNjQ1O1xuICB0Lm1lZW1maW5hbGFyYWJpYyA9IDB4ZmVlMjtcbiAgdC5tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmVlMztcbiAgdC5tZWVtbWVkaWFsYXJhYmljID0gMHhmZWU0O1xuICB0Lm1lZW1tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMTtcbiAgdC5tZWVtbWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzQ4O1xuICB0Lm1lZXRvcnVzcXVhcmUgPSAweDMzNGQ7XG4gIHQubWVoaXJhZ2FuYSA9IDB4MzA4MTtcbiAgdC5tZWl6aWVyYXNxdWFyZSA9IDB4MzM3ZTtcbiAgdC5tZWthdGFrYW5hID0gMHgzMGUxO1xuICB0Lm1la2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTI7XG4gIHQubWVtID0gMHgwNWRlO1xuICB0Lm1lbWRhZ2VzaCA9IDB4ZmIzZTtcbiAgdC5tZW1kYWdlc2hoZWJyZXcgPSAweGZiM2U7XG4gIHQubWVtaGVicmV3ID0gMHgwNWRlO1xuICB0Lm1lbmFybWVuaWFuID0gMHgwNTc0O1xuICB0Lm1lcmtoYWhlYnJldyA9IDB4MDVhNTtcbiAgdC5tZXJraGFrZWZ1bGFoZWJyZXcgPSAweDA1YTY7XG4gIHQubWVya2hha2VmdWxhbGVmdGhlYnJldyA9IDB4MDVhNjtcbiAgdC5tZXJraGFsZWZ0aGVicmV3ID0gMHgwNWE1O1xuICB0Lm1ob29rID0gMHgwMjcxO1xuICB0Lm1oenNxdWFyZSA9IDB4MzM5MjtcbiAgdC5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NTtcbiAgdC5taWRkb3QgPSAweDAwYjc7XG4gIHQubWlldW1hY2lyY2xla29yZWFuID0gMHgzMjcyO1xuICB0Lm1pZXVtYXBhcmVua29yZWFuID0gMHgzMjEyO1xuICB0Lm1pZXVtY2lyY2xla29yZWFuID0gMHgzMjY0O1xuICB0Lm1pZXVta29yZWFuID0gMHgzMTQxO1xuICB0Lm1pZXVtcGFuc2lvc2tvcmVhbiA9IDB4MzE3MDtcbiAgdC5taWV1bXBhcmVua29yZWFuID0gMHgzMjA0O1xuICB0Lm1pZXVtcGlldXBrb3JlYW4gPSAweDMxNmU7XG4gIHQubWlldW1zaW9za29yZWFuID0gMHgzMTZmO1xuICB0Lm1paGlyYWdhbmEgPSAweDMwN2Y7XG4gIHQubWlrYXRha2FuYSA9IDB4MzBkZjtcbiAgdC5taWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkwO1xuICB0Lm1pbnVzID0gMHgyMjEyO1xuICB0Lm1pbnVzYmVsb3djbWIgPSAweDAzMjA7XG4gIHQubWludXNjaXJjbGUgPSAweDIyOTY7XG4gIHQubWludXNtb2QgPSAweDAyZDc7XG4gIHQubWludXNwbHVzID0gMHgyMjEzO1xuICB0Lm1pbnV0ZSA9IDB4MjAzMjtcbiAgdC5taXJpYmFhcnVzcXVhcmUgPSAweDMzNGE7XG4gIHQubWlyaXNxdWFyZSA9IDB4MzM0OTtcbiAgdC5tbG9uZ2xlZ3R1cm5lZCA9IDB4MDI3MDtcbiAgdC5tbHNxdWFyZSA9IDB4MzM5NjtcbiAgdC5tbWN1YmVkc3F1YXJlID0gMHgzM2EzO1xuICB0Lm1tb25vc3BhY2UgPSAweGZmNGQ7XG4gIHQubW1zcXVhcmVkc3F1YXJlID0gMHgzMzlmO1xuICB0Lm1vaGlyYWdhbmEgPSAweDMwODI7XG4gIHQubW9obXNxdWFyZSA9IDB4MzNjMTtcbiAgdC5tb2thdGFrYW5hID0gMHgzMGUyO1xuICB0Lm1va2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTM7XG4gIHQubW9sc3F1YXJlID0gMHgzM2Q2O1xuICB0Lm1vbWF0aGFpID0gMHgwZTIxO1xuICB0Lm1vdmVyc3NxdWFyZSA9IDB4MzNhNztcbiAgdC5tb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2E4O1xuICB0Lm1wYXJlbiA9IDB4MjRhODtcbiAgdC5tcGFzcXVhcmUgPSAweDMzYWI7XG4gIHQubXNzcXVhcmUgPSAweDMzYjM7XG4gIHQubXN1cGVyaW9yID0gMHhmNmVmO1xuICB0Lm10dXJuZWQgPSAweDAyNmY7XG4gIHQubXUgPSAweDAwYjU7XG4gIHQubXUxID0gMHgwMGI1O1xuICB0Lm11YXNxdWFyZSA9IDB4MzM4MjtcbiAgdC5tdWNoZ3JlYXRlciA9IDB4MjI2YjtcbiAgdC5tdWNobGVzcyA9IDB4MjI2YTtcbiAgdC5tdWZzcXVhcmUgPSAweDMzOGM7XG4gIHQubXVncmVlayA9IDB4MDNiYztcbiAgdC5tdWdzcXVhcmUgPSAweDMzOGQ7XG4gIHQubXVoaXJhZ2FuYSA9IDB4MzA4MDtcbiAgdC5tdWthdGFrYW5hID0gMHgzMGUwO1xuICB0Lm11a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTE7XG4gIHQubXVsc3F1YXJlID0gMHgzMzk1O1xuICB0Lm11bHRpcGx5ID0gMHgwMGQ3O1xuICB0Lm11bXNxdWFyZSA9IDB4MzM5YjtcbiAgdC5tdW5haGhlYnJldyA9IDB4MDVhMztcbiAgdC5tdW5haGxlZnRoZWJyZXcgPSAweDA1YTM7XG4gIHQubXVzaWNhbG5vdGUgPSAweDI2NmE7XG4gIHQubXVzaWNhbG5vdGVkYmwgPSAweDI2NmI7XG4gIHQubXVzaWNmbGF0c2lnbiA9IDB4MjY2ZDtcbiAgdC5tdXNpY3NoYXJwc2lnbiA9IDB4MjY2ZjtcbiAgdC5tdXNzcXVhcmUgPSAweDMzYjI7XG4gIHQubXV2c3F1YXJlID0gMHgzM2I2O1xuICB0Lm11d3NxdWFyZSA9IDB4MzNiYztcbiAgdC5tdm1lZ2FzcXVhcmUgPSAweDMzYjk7XG4gIHQubXZzcXVhcmUgPSAweDMzYjc7XG4gIHQubXdtZWdhc3F1YXJlID0gMHgzM2JmO1xuICB0Lm13c3F1YXJlID0gMHgzM2JkO1xuICB0Lm4gPSAweDAwNmU7XG4gIHQubmFiZW5nYWxpID0gMHgwOWE4O1xuICB0Lm5hYmxhID0gMHgyMjA3O1xuICB0Lm5hY3V0ZSA9IDB4MDE0NDtcbiAgdC5uYWRldmEgPSAweDA5Mjg7XG4gIHQubmFndWphcmF0aSA9IDB4MGFhODtcbiAgdC5uYWd1cm11a2hpID0gMHgwYTI4O1xuICB0Lm5haGlyYWdhbmEgPSAweDMwNmE7XG4gIHQubmFrYXRha2FuYSA9IDB4MzBjYTtcbiAgdC5uYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg1O1xuICB0Lm5hcG9zdHJvcGhlID0gMHgwMTQ5O1xuICB0Lm5hc3F1YXJlID0gMHgzMzgxO1xuICB0Lm5ib3BvbW9mbyA9IDB4MzEwYjtcbiAgdC5uYnNwYWNlID0gMHgwMGEwO1xuICB0Lm5jYXJvbiA9IDB4MDE0ODtcbiAgdC5uY2VkaWxsYSA9IDB4MDE0NjtcbiAgdC5uY2lyY2xlID0gMHgyNGRkO1xuICB0Lm5jaXJjdW1mbGV4YmVsb3cgPSAweDFlNGI7XG4gIHQubmNvbW1hYWNjZW50ID0gMHgwMTQ2O1xuICB0Lm5kb3RhY2NlbnQgPSAweDFlNDU7XG4gIHQubmRvdGJlbG93ID0gMHgxZTQ3O1xuICB0Lm5laGlyYWdhbmEgPSAweDMwNmQ7XG4gIHQubmVrYXRha2FuYSA9IDB4MzBjZDtcbiAgdC5uZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg4O1xuICB0Lm5ld3NoZXFlbHNpZ24gPSAweDIwYWE7XG4gIHQubmZzcXVhcmUgPSAweDMzOGI7XG4gIHQubmdhYmVuZ2FsaSA9IDB4MDk5OTtcbiAgdC5uZ2FkZXZhID0gMHgwOTE5O1xuICB0Lm5nYWd1amFyYXRpID0gMHgwYTk5O1xuICB0Lm5nYWd1cm11a2hpID0gMHgwYTE5O1xuICB0Lm5nb25ndXRoYWkgPSAweDBlMDc7XG4gIHQubmhpcmFnYW5hID0gMHgzMDkzO1xuICB0Lm5ob29rbGVmdCA9IDB4MDI3MjtcbiAgdC5uaG9va3JldHJvZmxleCA9IDB4MDI3MztcbiAgdC5uaWV1bmFjaXJjbGVrb3JlYW4gPSAweDMyNmY7XG4gIHQubmlldW5hcGFyZW5rb3JlYW4gPSAweDMyMGY7XG4gIHQubmlldW5jaWV1Y2tvcmVhbiA9IDB4MzEzNTtcbiAgdC5uaWV1bmNpcmNsZWtvcmVhbiA9IDB4MzI2MTtcbiAgdC5uaWV1bmhpZXVoa29yZWFuID0gMHgzMTM2O1xuICB0Lm5pZXVua29yZWFuID0gMHgzMTM0O1xuICB0Lm5pZXVucGFuc2lvc2tvcmVhbiA9IDB4MzE2ODtcbiAgdC5uaWV1bnBhcmVua29yZWFuID0gMHgzMjAxO1xuICB0Lm5pZXVuc2lvc2tvcmVhbiA9IDB4MzE2NztcbiAgdC5uaWV1bnRpa2V1dGtvcmVhbiA9IDB4MzE2NjtcbiAgdC5uaWhpcmFnYW5hID0gMHgzMDZiO1xuICB0Lm5pa2F0YWthbmEgPSAweDMwY2I7XG4gIHQubmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NjtcbiAgdC5uaWtoYWhpdGxlZnR0aGFpID0gMHhmODk5O1xuICB0Lm5pa2hhaGl0dGhhaSA9IDB4MGU0ZDtcbiAgdC5uaW5lID0gMHgwMDM5O1xuICB0Lm5pbmVhcmFiaWMgPSAweDA2Njk7XG4gIHQubmluZWJlbmdhbGkgPSAweDA5ZWY7XG4gIHQubmluZWNpcmNsZSA9IDB4MjQ2ODtcbiAgdC5uaW5lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MjtcbiAgdC5uaW5lZGV2YSA9IDB4MDk2ZjtcbiAgdC5uaW5lZ3VqYXJhdGkgPSAweDBhZWY7XG4gIHQubmluZWd1cm11a2hpID0gMHgwYTZmO1xuICB0Lm5pbmVoYWNrYXJhYmljID0gMHgwNjY5O1xuICB0Lm5pbmVoYW5nemhvdSA9IDB4MzAyOTtcbiAgdC5uaW5laWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyODtcbiAgdC5uaW5laW5mZXJpb3IgPSAweDIwODk7XG4gIHQubmluZW1vbm9zcGFjZSA9IDB4ZmYxOTtcbiAgdC5uaW5lb2xkc3R5bGUgPSAweGY3Mzk7XG4gIHQubmluZXBhcmVuID0gMHgyNDdjO1xuICB0Lm5pbmVwZXJpb2QgPSAweDI0OTA7XG4gIHQubmluZXBlcnNpYW4gPSAweDA2Zjk7XG4gIHQubmluZXJvbWFuID0gMHgyMTc4O1xuICB0Lm5pbmVzdXBlcmlvciA9IDB4MjA3OTtcbiAgdC5uaW5ldGVlbmNpcmNsZSA9IDB4MjQ3MjtcbiAgdC5uaW5ldGVlbnBhcmVuID0gMHgyNDg2O1xuICB0Lm5pbmV0ZWVucGVyaW9kID0gMHgyNDlhO1xuICB0Lm5pbmV0aGFpID0gMHgwZTU5O1xuICB0Lm5qID0gMHgwMWNjO1xuICB0Lm5qZWN5cmlsbGljID0gMHgwNDVhO1xuICB0Lm5rYXRha2FuYSA9IDB4MzBmMztcbiAgdC5ua2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWQ7XG4gIHQubmxlZ3JpZ2h0bG9uZyA9IDB4MDE5ZTtcbiAgdC5ubGluZWJlbG93ID0gMHgxZTQ5O1xuICB0Lm5tb25vc3BhY2UgPSAweGZmNGU7XG4gIHQubm1zcXVhcmUgPSAweDMzOWE7XG4gIHQubm5hYmVuZ2FsaSA9IDB4MDlhMztcbiAgdC5ubmFkZXZhID0gMHgwOTIzO1xuICB0Lm5uYWd1amFyYXRpID0gMHgwYWEzO1xuICB0Lm5uYWd1cm11a2hpID0gMHgwYTIzO1xuICB0Lm5ubmFkZXZhID0gMHgwOTI5O1xuICB0Lm5vaGlyYWdhbmEgPSAweDMwNmU7XG4gIHQubm9rYXRha2FuYSA9IDB4MzBjZTtcbiAgdC5ub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjg5O1xuICB0Lm5vbmJyZWFraW5nc3BhY2UgPSAweDAwYTA7XG4gIHQubm9uZW50aGFpID0gMHgwZTEzO1xuICB0Lm5vbnV0aGFpID0gMHgwZTE5O1xuICB0Lm5vb25hcmFiaWMgPSAweDA2NDY7XG4gIHQubm9vbmZpbmFsYXJhYmljID0gMHhmZWU2O1xuICB0Lm5vb25naHVubmFhcmFiaWMgPSAweDA2YmE7XG4gIHQubm9vbmdodW5uYWZpbmFsYXJhYmljID0gMHhmYjlmO1xuICB0Lm5vb25pbml0aWFsYXJhYmljID0gMHhmZWU3O1xuICB0Lm5vb25qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMjtcbiAgdC5ub29uamVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzRiO1xuICB0Lm5vb25tZWRpYWxhcmFiaWMgPSAweGZlZTg7XG4gIHQubm9vbm1lZW1pbml0aWFsYXJhYmljID0gMHhmY2Q1O1xuICB0Lm5vb25tZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNGU7XG4gIHQubm9vbm5vb25maW5hbGFyYWJpYyA9IDB4ZmM4ZDtcbiAgdC5ub3Rjb250YWlucyA9IDB4MjIwYztcbiAgdC5ub3RlbGVtZW50ID0gMHgyMjA5O1xuICB0Lm5vdGVsZW1lbnRvZiA9IDB4MjIwOTtcbiAgdC5ub3RlcXVhbCA9IDB4MjI2MDtcbiAgdC5ub3RncmVhdGVyID0gMHgyMjZmO1xuICB0Lm5vdGdyZWF0ZXJub3JlcXVhbCA9IDB4MjI3MTtcbiAgdC5ub3RncmVhdGVybm9ybGVzcyA9IDB4MjI3OTtcbiAgdC5ub3RpZGVudGljYWwgPSAweDIyNjI7XG4gIHQubm90bGVzcyA9IDB4MjI2ZTtcbiAgdC5ub3RsZXNzbm9yZXF1YWwgPSAweDIyNzA7XG4gIHQubm90cGFyYWxsZWwgPSAweDIyMjY7XG4gIHQubm90cHJlY2VkZXMgPSAweDIyODA7XG4gIHQubm90c3Vic2V0ID0gMHgyMjg0O1xuICB0Lm5vdHN1Y2NlZWRzID0gMHgyMjgxO1xuICB0Lm5vdHN1cGVyc2V0ID0gMHgyMjg1O1xuICB0Lm5vd2FybWVuaWFuID0gMHgwNTc2O1xuICB0Lm5wYXJlbiA9IDB4MjRhOTtcbiAgdC5uc3NxdWFyZSA9IDB4MzNiMTtcbiAgdC5uc3VwZXJpb3IgPSAweDIwN2Y7XG4gIHQubnRpbGRlID0gMHgwMGYxO1xuICB0Lm51ID0gMHgwM2JkO1xuICB0Lm51aGlyYWdhbmEgPSAweDMwNmM7XG4gIHQubnVrYXRha2FuYSA9IDB4MzBjYztcbiAgdC5udWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg3O1xuICB0Lm51a3RhYmVuZ2FsaSA9IDB4MDliYztcbiAgdC5udWt0YWRldmEgPSAweDA5M2M7XG4gIHQubnVrdGFndWphcmF0aSA9IDB4MGFiYztcbiAgdC5udWt0YWd1cm11a2hpID0gMHgwYTNjO1xuICB0Lm51bWJlcnNpZ24gPSAweDAwMjM7XG4gIHQubnVtYmVyc2lnbm1vbm9zcGFjZSA9IDB4ZmYwMztcbiAgdC5udW1iZXJzaWduc21hbGwgPSAweGZlNWY7XG4gIHQubnVtZXJhbHNpZ25ncmVlayA9IDB4MDM3NDtcbiAgdC5udW1lcmFsc2lnbmxvd2VyZ3JlZWsgPSAweDAzNzU7XG4gIHQubnVtZXJvID0gMHgyMTE2O1xuICB0Lm51biA9IDB4MDVlMDtcbiAgdC5udW5kYWdlc2ggPSAweGZiNDA7XG4gIHQubnVuZGFnZXNoaGVicmV3ID0gMHhmYjQwO1xuICB0Lm51bmhlYnJldyA9IDB4MDVlMDtcbiAgdC5udnNxdWFyZSA9IDB4MzNiNTtcbiAgdC5ud3NxdWFyZSA9IDB4MzNiYjtcbiAgdC5ueWFiZW5nYWxpID0gMHgwOTllO1xuICB0Lm55YWRldmEgPSAweDA5MWU7XG4gIHQubnlhZ3VqYXJhdGkgPSAweDBhOWU7XG4gIHQubnlhZ3VybXVraGkgPSAweDBhMWU7XG4gIHQubyA9IDB4MDA2ZjtcbiAgdC5vYWN1dGUgPSAweDAwZjM7XG4gIHQub2FuZ3RoYWkgPSAweDBlMmQ7XG4gIHQub2JhcnJlZCA9IDB4MDI3NTtcbiAgdC5vYmFycmVkY3lyaWxsaWMgPSAweDA0ZTk7XG4gIHQub2JhcnJlZGRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZWI7XG4gIHQub2JlbmdhbGkgPSAweDA5OTM7XG4gIHQub2JvcG9tb2ZvID0gMHgzMTFiO1xuICB0Lm9icmV2ZSA9IDB4MDE0ZjtcbiAgdC5vY2FuZHJhZGV2YSA9IDB4MDkxMTtcbiAgdC5vY2FuZHJhZ3VqYXJhdGkgPSAweDBhOTE7XG4gIHQub2NhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDk7XG4gIHQub2NhbmRyYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM5O1xuICB0Lm9jYXJvbiA9IDB4MDFkMjtcbiAgdC5vY2lyY2xlID0gMHgyNGRlO1xuICB0Lm9jaXJjdW1mbGV4ID0gMHgwMGY0O1xuICB0Lm9jaXJjdW1mbGV4YWN1dGUgPSAweDFlZDE7XG4gIHQub2NpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVkOTtcbiAgdC5vY2lyY3VtZmxleGdyYXZlID0gMHgxZWQzO1xuICB0Lm9jaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWQ1O1xuICB0Lm9jaXJjdW1mbGV4dGlsZGUgPSAweDFlZDc7XG4gIHQub2N5cmlsbGljID0gMHgwNDNlO1xuICB0Lm9kYmxhY3V0ZSA9IDB4MDE1MTtcbiAgdC5vZGJsZ3JhdmUgPSAweDAyMGQ7XG4gIHQub2RldmEgPSAweDA5MTM7XG4gIHQub2RpZXJlc2lzID0gMHgwMGY2O1xuICB0Lm9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU3O1xuICB0Lm9kb3RiZWxvdyA9IDB4MWVjZDtcbiAgdC5vZSA9IDB4MDE1MztcbiAgdC5vZWtvcmVhbiA9IDB4MzE1YTtcbiAgdC5vZ29uZWsgPSAweDAyZGI7XG4gIHQub2dvbmVrY21iID0gMHgwMzI4O1xuICB0Lm9ncmF2ZSA9IDB4MDBmMjtcbiAgdC5vZ3VqYXJhdGkgPSAweDBhOTM7XG4gIHQub2hhcm1lbmlhbiA9IDB4MDU4NTtcbiAgdC5vaGlyYWdhbmEgPSAweDMwNGE7XG4gIHQub2hvb2thYm92ZSA9IDB4MWVjZjtcbiAgdC5vaG9ybiA9IDB4MDFhMTtcbiAgdC5vaG9ybmFjdXRlID0gMHgxZWRiO1xuICB0Lm9ob3JuZG90YmVsb3cgPSAweDFlZTM7XG4gIHQub2hvcm5ncmF2ZSA9IDB4MWVkZDtcbiAgdC5vaG9ybmhvb2thYm92ZSA9IDB4MWVkZjtcbiAgdC5vaG9ybnRpbGRlID0gMHgxZWUxO1xuICB0Lm9odW5nYXJ1bWxhdXQgPSAweDAxNTE7XG4gIHQub2kgPSAweDAxYTM7XG4gIHQub2ludmVydGVkYnJldmUgPSAweDAyMGY7XG4gIHQub2thdGFrYW5hID0gMHgzMGFhO1xuICB0Lm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NTtcbiAgdC5va29yZWFuID0gMHgzMTU3O1xuICB0Lm9sZWhlYnJldyA9IDB4MDVhYjtcbiAgdC5vbWFjcm9uID0gMHgwMTRkO1xuICB0Lm9tYWNyb25hY3V0ZSA9IDB4MWU1MztcbiAgdC5vbWFjcm9uZ3JhdmUgPSAweDFlNTE7XG4gIHQub21kZXZhID0gMHgwOTUwO1xuICB0Lm9tZWdhID0gMHgwM2M5O1xuICB0Lm9tZWdhMSA9IDB4MDNkNjtcbiAgdC5vbWVnYWN5cmlsbGljID0gMHgwNDYxO1xuICB0Lm9tZWdhbGF0aW5jbG9zZWQgPSAweDAyNzc7XG4gIHQub21lZ2Fyb3VuZGN5cmlsbGljID0gMHgwNDdiO1xuICB0Lm9tZWdhdGl0bG9jeXJpbGxpYyA9IDB4MDQ3ZDtcbiAgdC5vbWVnYXRvbm9zID0gMHgwM2NlO1xuICB0Lm9tZ3VqYXJhdGkgPSAweDBhZDA7XG4gIHQub21pY3JvbiA9IDB4MDNiZjtcbiAgdC5vbWljcm9udG9ub3MgPSAweDAzY2M7XG4gIHQub21vbm9zcGFjZSA9IDB4ZmY0ZjtcbiAgdC5vbmUgPSAweDAwMzE7XG4gIHQub25lYXJhYmljID0gMHgwNjYxO1xuICB0Lm9uZWJlbmdhbGkgPSAweDA5ZTc7XG4gIHQub25lY2lyY2xlID0gMHgyNDYwO1xuICB0Lm9uZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGE7XG4gIHQub25lZGV2YSA9IDB4MDk2NztcbiAgdC5vbmVkb3RlbmxlYWRlciA9IDB4MjAyNDtcbiAgdC5vbmVlaWdodGggPSAweDIxNWI7XG4gIHQub25lZml0dGVkID0gMHhmNmRjO1xuICB0Lm9uZWd1amFyYXRpID0gMHgwYWU3O1xuICB0Lm9uZWd1cm11a2hpID0gMHgwYTY3O1xuICB0Lm9uZWhhY2thcmFiaWMgPSAweDA2NjE7XG4gIHQub25laGFsZiA9IDB4MDBiZDtcbiAgdC5vbmVoYW5nemhvdSA9IDB4MzAyMTtcbiAgdC5vbmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIwO1xuICB0Lm9uZWluZmVyaW9yID0gMHgyMDgxO1xuICB0Lm9uZW1vbm9zcGFjZSA9IDB4ZmYxMTtcbiAgdC5vbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY0O1xuICB0Lm9uZW9sZHN0eWxlID0gMHhmNzMxO1xuICB0Lm9uZXBhcmVuID0gMHgyNDc0O1xuICB0Lm9uZXBlcmlvZCA9IDB4MjQ4ODtcbiAgdC5vbmVwZXJzaWFuID0gMHgwNmYxO1xuICB0Lm9uZXF1YXJ0ZXIgPSAweDAwYmM7XG4gIHQub25lcm9tYW4gPSAweDIxNzA7XG4gIHQub25lc3VwZXJpb3IgPSAweDAwYjk7XG4gIHQub25ldGhhaSA9IDB4MGU1MTtcbiAgdC5vbmV0aGlyZCA9IDB4MjE1MztcbiAgdC5vb2dvbmVrID0gMHgwMWViO1xuICB0Lm9vZ29uZWttYWNyb24gPSAweDAxZWQ7XG4gIHQub29ndXJtdWtoaSA9IDB4MGExMztcbiAgdC5vb21hdHJhZ3VybXVraGkgPSAweDBhNGI7XG4gIHQub29wZW4gPSAweDAyNTQ7XG4gIHQub3BhcmVuID0gMHgyNGFhO1xuICB0Lm9wZW5idWxsZXQgPSAweDI1ZTY7XG4gIHQub3B0aW9uID0gMHgyMzI1O1xuICB0Lm9yZGZlbWluaW5lID0gMHgwMGFhO1xuICB0Lm9yZG1hc2N1bGluZSA9IDB4MDBiYTtcbiAgdC5vcnRob2dvbmFsID0gMHgyMjFmO1xuICB0Lm9zaG9ydGRldmEgPSAweDA5MTI7XG4gIHQub3Nob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0YTtcbiAgdC5vc2xhc2ggPSAweDAwZjg7XG4gIHQub3NsYXNoYWN1dGUgPSAweDAxZmY7XG4gIHQub3NtYWxsaGlyYWdhbmEgPSAweDMwNDk7XG4gIHQub3NtYWxsa2F0YWthbmEgPSAweDMwYTk7XG4gIHQub3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmI7XG4gIHQub3N0cm9rZWFjdXRlID0gMHgwMWZmO1xuICB0Lm9zdXBlcmlvciA9IDB4ZjZmMDtcbiAgdC5vdGN5cmlsbGljID0gMHgwNDdmO1xuICB0Lm90aWxkZSA9IDB4MDBmNTtcbiAgdC5vdGlsZGVhY3V0ZSA9IDB4MWU0ZDtcbiAgdC5vdGlsZGVkaWVyZXNpcyA9IDB4MWU0ZjtcbiAgdC5vdWJvcG9tb2ZvID0gMHgzMTIxO1xuICB0Lm92ZXJsaW5lID0gMHgyMDNlO1xuICB0Lm92ZXJsaW5lY2VudGVybGluZSA9IDB4ZmU0YTtcbiAgdC5vdmVybGluZWNtYiA9IDB4MDMwNTtcbiAgdC5vdmVybGluZWRhc2hlZCA9IDB4ZmU0OTtcbiAgdC5vdmVybGluZWRibHdhdnkgPSAweGZlNGM7XG4gIHQub3ZlcmxpbmV3YXZ5ID0gMHhmZTRiO1xuICB0Lm92ZXJzY29yZSA9IDB4MDBhZjtcbiAgdC5vdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljYjtcbiAgdC5vdm93ZWxzaWduZGV2YSA9IDB4MDk0YjtcbiAgdC5vdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhY2I7XG4gIHQucCA9IDB4MDA3MDtcbiAgdC5wYWFtcHNzcXVhcmUgPSAweDMzODA7XG4gIHQucGFhc2VudG9zcXVhcmUgPSAweDMzMmI7XG4gIHQucGFiZW5nYWxpID0gMHgwOWFhO1xuICB0LnBhY3V0ZSA9IDB4MWU1NTtcbiAgdC5wYWRldmEgPSAweDA5MmE7XG4gIHQucGFnZWRvd24gPSAweDIxZGY7XG4gIHQucGFnZXVwID0gMHgyMWRlO1xuICB0LnBhZ3VqYXJhdGkgPSAweDBhYWE7XG4gIHQucGFndXJtdWtoaSA9IDB4MGEyYTtcbiAgdC5wYWhpcmFnYW5hID0gMHgzMDcxO1xuICB0LnBhaXlhbm5vaXRoYWkgPSAweDBlMmY7XG4gIHQucGFrYXRha2FuYSA9IDB4MzBkMTtcbiAgdC5wYWxhdGFsaXphdGlvbmN5cmlsbGljY21iID0gMHgwNDg0O1xuICB0LnBhbG9jaGthY3lyaWxsaWMgPSAweDA0YzA7XG4gIHQucGFuc2lvc2tvcmVhbiA9IDB4MzE3ZjtcbiAgdC5wYXJhZ3JhcGggPSAweDAwYjY7XG4gIHQucGFyYWxsZWwgPSAweDIyMjU7XG4gIHQucGFyZW5sZWZ0ID0gMHgwMDI4O1xuICB0LnBhcmVubGVmdGFsdG9uZWFyYWJpYyA9IDB4ZmQzZTtcbiAgdC5wYXJlbmxlZnRidCA9IDB4ZjhlZDtcbiAgdC5wYXJlbmxlZnRleCA9IDB4ZjhlYztcbiAgdC5wYXJlbmxlZnRpbmZlcmlvciA9IDB4MjA4ZDtcbiAgdC5wYXJlbmxlZnRtb25vc3BhY2UgPSAweGZmMDg7XG4gIHQucGFyZW5sZWZ0c21hbGwgPSAweGZlNTk7XG4gIHQucGFyZW5sZWZ0c3VwZXJpb3IgPSAweDIwN2Q7XG4gIHQucGFyZW5sZWZ0dHAgPSAweGY4ZWI7XG4gIHQucGFyZW5sZWZ0dmVydGljYWwgPSAweGZlMzU7XG4gIHQucGFyZW5yaWdodCA9IDB4MDAyOTtcbiAgdC5wYXJlbnJpZ2h0YWx0b25lYXJhYmljID0gMHhmZDNmO1xuICB0LnBhcmVucmlnaHRidCA9IDB4ZjhmODtcbiAgdC5wYXJlbnJpZ2h0ZXggPSAweGY4Zjc7XG4gIHQucGFyZW5yaWdodGluZmVyaW9yID0gMHgyMDhlO1xuICB0LnBhcmVucmlnaHRtb25vc3BhY2UgPSAweGZmMDk7XG4gIHQucGFyZW5yaWdodHNtYWxsID0gMHhmZTVhO1xuICB0LnBhcmVucmlnaHRzdXBlcmlvciA9IDB4MjA3ZTtcbiAgdC5wYXJlbnJpZ2h0dHAgPSAweGY4ZjY7XG4gIHQucGFyZW5yaWdodHZlcnRpY2FsID0gMHhmZTM2O1xuICB0LnBhcnRpYWxkaWZmID0gMHgyMjAyO1xuICB0LnBhc2VxaGVicmV3ID0gMHgwNWMwO1xuICB0LnBhc2h0YWhlYnJldyA9IDB4MDU5OTtcbiAgdC5wYXNxdWFyZSA9IDB4MzNhOTtcbiAgdC5wYXRhaCA9IDB4MDViNztcbiAgdC5wYXRhaDExID0gMHgwNWI3O1xuICB0LnBhdGFoMWQgPSAweDA1Yjc7XG4gIHQucGF0YWgyYSA9IDB4MDViNztcbiAgdC5wYXRhaGhlYnJldyA9IDB4MDViNztcbiAgdC5wYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViNztcbiAgdC5wYXRhaHF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjc7XG4gIHQucGF0YWh3aWRlaGVicmV3ID0gMHgwNWI3O1xuICB0LnBhemVyaGVicmV3ID0gMHgwNWExO1xuICB0LnBib3BvbW9mbyA9IDB4MzEwNjtcbiAgdC5wY2lyY2xlID0gMHgyNGRmO1xuICB0LnBkb3RhY2NlbnQgPSAweDFlNTc7XG4gIHQucGUgPSAweDA1ZTQ7XG4gIHQucGVjeXJpbGxpYyA9IDB4MDQzZjtcbiAgdC5wZWRhZ2VzaCA9IDB4ZmI0NDtcbiAgdC5wZWRhZ2VzaGhlYnJldyA9IDB4ZmI0NDtcbiAgdC5wZWV6aXNxdWFyZSA9IDB4MzMzYjtcbiAgdC5wZWZpbmFsZGFnZXNoaGVicmV3ID0gMHhmYjQzO1xuICB0LnBlaGFyYWJpYyA9IDB4MDY3ZTtcbiAgdC5wZWhhcm1lbmlhbiA9IDB4MDU3YTtcbiAgdC5wZWhlYnJldyA9IDB4MDVlNDtcbiAgdC5wZWhmaW5hbGFyYWJpYyA9IDB4ZmI1NztcbiAgdC5wZWhpbml0aWFsYXJhYmljID0gMHhmYjU4O1xuICB0LnBlaGlyYWdhbmEgPSAweDMwN2E7XG4gIHQucGVobWVkaWFsYXJhYmljID0gMHhmYjU5O1xuICB0LnBla2F0YWthbmEgPSAweDMwZGE7XG4gIHQucGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0YTc7XG4gIHQucGVyYWZlaGVicmV3ID0gMHhmYjRlO1xuICB0LnBlcmNlbnQgPSAweDAwMjU7XG4gIHQucGVyY2VudGFyYWJpYyA9IDB4MDY2YTtcbiAgdC5wZXJjZW50bW9ub3NwYWNlID0gMHhmZjA1O1xuICB0LnBlcmNlbnRzbWFsbCA9IDB4ZmU2YTtcbiAgdC5wZXJpb2QgPSAweDAwMmU7XG4gIHQucGVyaW9kYXJtZW5pYW4gPSAweDA1ODk7XG4gIHQucGVyaW9kY2VudGVyZWQgPSAweDAwYjc7XG4gIHQucGVyaW9kaGFsZndpZHRoID0gMHhmZjYxO1xuICB0LnBlcmlvZGluZmVyaW9yID0gMHhmNmU3O1xuICB0LnBlcmlvZG1vbm9zcGFjZSA9IDB4ZmYwZTtcbiAgdC5wZXJpb2RzbWFsbCA9IDB4ZmU1MjtcbiAgdC5wZXJpb2RzdXBlcmlvciA9IDB4ZjZlODtcbiAgdC5wZXJpc3BvbWVuaWdyZWVrY21iID0gMHgwMzQyO1xuICB0LnBlcnBlbmRpY3VsYXIgPSAweDIyYTU7XG4gIHQucGVydGhvdXNhbmQgPSAweDIwMzA7XG4gIHQucGVzZXRhID0gMHgyMGE3O1xuICB0LnBmc3F1YXJlID0gMHgzMzhhO1xuICB0LnBoYWJlbmdhbGkgPSAweDA5YWI7XG4gIHQucGhhZGV2YSA9IDB4MDkyYjtcbiAgdC5waGFndWphcmF0aSA9IDB4MGFhYjtcbiAgdC5waGFndXJtdWtoaSA9IDB4MGEyYjtcbiAgdC5waGkgPSAweDAzYzY7XG4gIHQucGhpMSA9IDB4MDNkNTtcbiAgdC5waGlldXBoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YTtcbiAgdC5waGlldXBoYXBhcmVua29yZWFuID0gMHgzMjFhO1xuICB0LnBoaWV1cGhjaXJjbGVrb3JlYW4gPSAweDMyNmM7XG4gIHQucGhpZXVwaGtvcmVhbiA9IDB4MzE0ZDtcbiAgdC5waGlldXBocGFyZW5rb3JlYW4gPSAweDMyMGM7XG4gIHQucGhpbGF0aW4gPSAweDAyNzg7XG4gIHQucGhpbnRodXRoYWkgPSAweDBlM2E7XG4gIHQucGhpc3ltYm9sZ3JlZWsgPSAweDAzZDU7XG4gIHQucGhvb2sgPSAweDAxYTU7XG4gIHQucGhvcGhhbnRoYWkgPSAweDBlMWU7XG4gIHQucGhvcGh1bmd0aGFpID0gMHgwZTFjO1xuICB0LnBob3NhbXBoYW90aGFpID0gMHgwZTIwO1xuICB0LnBpID0gMHgwM2MwO1xuICB0LnBpZXVwYWNpcmNsZWtvcmVhbiA9IDB4MzI3MztcbiAgdC5waWV1cGFwYXJlbmtvcmVhbiA9IDB4MzIxMztcbiAgdC5waWV1cGNpZXVja29yZWFuID0gMHgzMTc2O1xuICB0LnBpZXVwY2lyY2xla29yZWFuID0gMHgzMjY1O1xuICB0LnBpZXVwa2l5ZW9ra29yZWFuID0gMHgzMTcyO1xuICB0LnBpZXVwa29yZWFuID0gMHgzMTQyO1xuICB0LnBpZXVwcGFyZW5rb3JlYW4gPSAweDMyMDU7XG4gIHQucGlldXBzaW9za2l5ZW9ra29yZWFuID0gMHgzMTc0O1xuICB0LnBpZXVwc2lvc2tvcmVhbiA9IDB4MzE0NDtcbiAgdC5waWV1cHNpb3N0aWtldXRrb3JlYW4gPSAweDMxNzU7XG4gIHQucGlldXB0aGlldXRoa29yZWFuID0gMHgzMTc3O1xuICB0LnBpZXVwdGlrZXV0a29yZWFuID0gMHgzMTczO1xuICB0LnBpaGlyYWdhbmEgPSAweDMwNzQ7XG4gIHQucGlrYXRha2FuYSA9IDB4MzBkNDtcbiAgdC5waXN5bWJvbGdyZWVrID0gMHgwM2Q2O1xuICB0LnBpd3Jhcm1lbmlhbiA9IDB4MDU4MztcbiAgdC5wbHVzID0gMHgwMDJiO1xuICB0LnBsdXNiZWxvd2NtYiA9IDB4MDMxZjtcbiAgdC5wbHVzY2lyY2xlID0gMHgyMjk1O1xuICB0LnBsdXNtaW51cyA9IDB4MDBiMTtcbiAgdC5wbHVzbW9kID0gMHgwMmQ2O1xuICB0LnBsdXNtb25vc3BhY2UgPSAweGZmMGI7XG4gIHQucGx1c3NtYWxsID0gMHhmZTYyO1xuICB0LnBsdXNzdXBlcmlvciA9IDB4MjA3YTtcbiAgdC5wbW9ub3NwYWNlID0gMHhmZjUwO1xuICB0LnBtc3F1YXJlID0gMHgzM2Q4O1xuICB0LnBvaGlyYWdhbmEgPSAweDMwN2Q7XG4gIHQucG9pbnRpbmdpbmRleGRvd253aGl0ZSA9IDB4MjYxZjtcbiAgdC5wb2ludGluZ2luZGV4bGVmdHdoaXRlID0gMHgyNjFjO1xuICB0LnBvaW50aW5naW5kZXhyaWdodHdoaXRlID0gMHgyNjFlO1xuICB0LnBvaW50aW5naW5kZXh1cHdoaXRlID0gMHgyNjFkO1xuICB0LnBva2F0YWthbmEgPSAweDMwZGQ7XG4gIHQucG9wbGF0aGFpID0gMHgwZTFiO1xuICB0LnBvc3RhbG1hcmsgPSAweDMwMTI7XG4gIHQucG9zdGFsbWFya2ZhY2UgPSAweDMwMjA7XG4gIHQucHBhcmVuID0gMHgyNGFiO1xuICB0LnByZWNlZGVzID0gMHgyMjdhO1xuICB0LnByZXNjcmlwdGlvbiA9IDB4MjExZTtcbiAgdC5wcmltZW1vZCA9IDB4MDJiOTtcbiAgdC5wcmltZXJldmVyc2VkID0gMHgyMDM1O1xuICB0LnByb2R1Y3QgPSAweDIyMGY7XG4gIHQucHJvamVjdGl2ZSA9IDB4MjMwNTtcbiAgdC5wcm9sb25nZWRrYW5hID0gMHgzMGZjO1xuICB0LnByb3BlbGxvciA9IDB4MjMxODtcbiAgdC5wcm9wZXJzdWJzZXQgPSAweDIyODI7XG4gIHQucHJvcGVyc3VwZXJzZXQgPSAweDIyODM7XG4gIHQucHJvcG9ydGlvbiA9IDB4MjIzNztcbiAgdC5wcm9wb3J0aW9uYWwgPSAweDIyMWQ7XG4gIHQucHNpID0gMHgwM2M4O1xuICB0LnBzaWN5cmlsbGljID0gMHgwNDcxO1xuICB0LnBzaWxpcG5ldW1hdGFjeXJpbGxpY2NtYiA9IDB4MDQ4NjtcbiAgdC5wc3NxdWFyZSA9IDB4MzNiMDtcbiAgdC5wdWhpcmFnYW5hID0gMHgzMDc3O1xuICB0LnB1a2F0YWthbmEgPSAweDMwZDc7XG4gIHQucHZzcXVhcmUgPSAweDMzYjQ7XG4gIHQucHdzcXVhcmUgPSAweDMzYmE7XG4gIHQucSA9IDB4MDA3MTtcbiAgdC5xYWRldmEgPSAweDA5NTg7XG4gIHQucWFkbWFoZWJyZXcgPSAweDA1YTg7XG4gIHQucWFmYXJhYmljID0gMHgwNjQyO1xuICB0LnFhZmZpbmFsYXJhYmljID0gMHhmZWQ2O1xuICB0LnFhZmluaXRpYWxhcmFiaWMgPSAweGZlZDc7XG4gIHQucWFmbWVkaWFsYXJhYmljID0gMHhmZWQ4O1xuICB0LnFhbWF0cyA9IDB4MDViODtcbiAgdC5xYW1hdHMxMCA9IDB4MDViODtcbiAgdC5xYW1hdHMxYSA9IDB4MDViODtcbiAgdC5xYW1hdHMxYyA9IDB4MDViODtcbiAgdC5xYW1hdHMyNyA9IDB4MDViODtcbiAgdC5xYW1hdHMyOSA9IDB4MDViODtcbiAgdC5xYW1hdHMzMyA9IDB4MDViODtcbiAgdC5xYW1hdHNkZSA9IDB4MDViODtcbiAgdC5xYW1hdHNoZWJyZXcgPSAweDA1Yjg7XG4gIHQucWFtYXRzbmFycm93aGVicmV3ID0gMHgwNWI4O1xuICB0LnFhbWF0c3FhdGFuaGVicmV3ID0gMHgwNWI4O1xuICB0LnFhbWF0c3FhdGFubmFycm93aGVicmV3ID0gMHgwNWI4O1xuICB0LnFhbWF0c3FhdGFucXVhcnRlcmhlYnJldyA9IDB4MDViODtcbiAgdC5xYW1hdHNxYXRhbndpZGVoZWJyZXcgPSAweDA1Yjg7XG4gIHQucWFtYXRzcXVhcnRlcmhlYnJldyA9IDB4MDViODtcbiAgdC5xYW1hdHN3aWRlaGVicmV3ID0gMHgwNWI4O1xuICB0LnFhcm5leXBhcmFoZWJyZXcgPSAweDA1OWY7XG4gIHQucWJvcG9tb2ZvID0gMHgzMTExO1xuICB0LnFjaXJjbGUgPSAweDI0ZTA7XG4gIHQucWhvb2sgPSAweDAyYTA7XG4gIHQucW1vbm9zcGFjZSA9IDB4ZmY1MTtcbiAgdC5xb2YgPSAweDA1ZTc7XG4gIHQucW9mZGFnZXNoID0gMHhmYjQ3O1xuICB0LnFvZmRhZ2VzaGhlYnJldyA9IDB4ZmI0NztcbiAgdC5xb2ZoZWJyZXcgPSAweDA1ZTc7XG4gIHQucXBhcmVuID0gMHgyNGFjO1xuICB0LnF1YXJ0ZXJub3RlID0gMHgyNjY5O1xuICB0LnF1YnV0cyA9IDB4MDViYjtcbiAgdC5xdWJ1dHMxOCA9IDB4MDViYjtcbiAgdC5xdWJ1dHMyNSA9IDB4MDViYjtcbiAgdC5xdWJ1dHMzMSA9IDB4MDViYjtcbiAgdC5xdWJ1dHNoZWJyZXcgPSAweDA1YmI7XG4gIHQucXVidXRzbmFycm93aGVicmV3ID0gMHgwNWJiO1xuICB0LnF1YnV0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1YmI7XG4gIHQucXVidXRzd2lkZWhlYnJldyA9IDB4MDViYjtcbiAgdC5xdWVzdGlvbiA9IDB4MDAzZjtcbiAgdC5xdWVzdGlvbmFyYWJpYyA9IDB4MDYxZjtcbiAgdC5xdWVzdGlvbmFybWVuaWFuID0gMHgwNTVlO1xuICB0LnF1ZXN0aW9uZG93biA9IDB4MDBiZjtcbiAgdC5xdWVzdGlvbmRvd25zbWFsbCA9IDB4ZjdiZjtcbiAgdC5xdWVzdGlvbmdyZWVrID0gMHgwMzdlO1xuICB0LnF1ZXN0aW9ubW9ub3NwYWNlID0gMHhmZjFmO1xuICB0LnF1ZXN0aW9uc21hbGwgPSAweGY3M2Y7XG4gIHQucXVvdGVkYmwgPSAweDAwMjI7XG4gIHQucXVvdGVkYmxiYXNlID0gMHgyMDFlO1xuICB0LnF1b3RlZGJsbGVmdCA9IDB4MjAxYztcbiAgdC5xdW90ZWRibG1vbm9zcGFjZSA9IDB4ZmYwMjtcbiAgdC5xdW90ZWRibHByaW1lID0gMHgzMDFlO1xuICB0LnF1b3RlZGJscHJpbWVyZXZlcnNlZCA9IDB4MzAxZDtcbiAgdC5xdW90ZWRibHJpZ2h0ID0gMHgyMDFkO1xuICB0LnF1b3RlbGVmdCA9IDB4MjAxODtcbiAgdC5xdW90ZWxlZnRyZXZlcnNlZCA9IDB4MjAxYjtcbiAgdC5xdW90ZXJldmVyc2VkID0gMHgyMDFiO1xuICB0LnF1b3RlcmlnaHQgPSAweDIwMTk7XG4gIHQucXVvdGVyaWdodG4gPSAweDAxNDk7XG4gIHQucXVvdGVzaW5nbGJhc2UgPSAweDIwMWE7XG4gIHQucXVvdGVzaW5nbGUgPSAweDAwMjc7XG4gIHQucXVvdGVzaW5nbGVtb25vc3BhY2UgPSAweGZmMDc7XG4gIHQuciA9IDB4MDA3MjtcbiAgdC5yYWFybWVuaWFuID0gMHgwNTdjO1xuICB0LnJhYmVuZ2FsaSA9IDB4MDliMDtcbiAgdC5yYWN1dGUgPSAweDAxNTU7XG4gIHQucmFkZXZhID0gMHgwOTMwO1xuICB0LnJhZGljYWwgPSAweDIyMWE7XG4gIHQucmFkaWNhbGV4ID0gMHhmOGU1O1xuICB0LnJhZG92ZXJzc3F1YXJlID0gMHgzM2FlO1xuICB0LnJhZG92ZXJzc3F1YXJlZHNxdWFyZSA9IDB4MzNhZjtcbiAgdC5yYWRzcXVhcmUgPSAweDMzYWQ7XG4gIHQucmFmZSA9IDB4MDViZjtcbiAgdC5yYWZlaGVicmV3ID0gMHgwNWJmO1xuICB0LnJhZ3VqYXJhdGkgPSAweDBhYjA7XG4gIHQucmFndXJtdWtoaSA9IDB4MGEzMDtcbiAgdC5yYWhpcmFnYW5hID0gMHgzMDg5O1xuICB0LnJha2F0YWthbmEgPSAweDMwZTk7XG4gIHQucmFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NztcbiAgdC5yYWxvd2VyZGlhZ29uYWxiZW5nYWxpID0gMHgwOWYxO1xuICB0LnJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpID0gMHgwOWYwO1xuICB0LnJhbXNob3JuID0gMHgwMjY0O1xuICB0LnJhdGlvID0gMHgyMjM2O1xuICB0LnJib3BvbW9mbyA9IDB4MzExNjtcbiAgdC5yY2Fyb24gPSAweDAxNTk7XG4gIHQucmNlZGlsbGEgPSAweDAxNTc7XG4gIHQucmNpcmNsZSA9IDB4MjRlMTtcbiAgdC5yY29tbWFhY2NlbnQgPSAweDAxNTc7XG4gIHQucmRibGdyYXZlID0gMHgwMjExO1xuICB0LnJkb3RhY2NlbnQgPSAweDFlNTk7XG4gIHQucmRvdGJlbG93ID0gMHgxZTViO1xuICB0LnJkb3RiZWxvd21hY3JvbiA9IDB4MWU1ZDtcbiAgdC5yZWZlcmVuY2VtYXJrID0gMHgyMDNiO1xuICB0LnJlZmxleHN1YnNldCA9IDB4MjI4NjtcbiAgdC5yZWZsZXhzdXBlcnNldCA9IDB4MjI4NztcbiAgdC5yZWdpc3RlcmVkID0gMHgwMGFlO1xuICB0LnJlZ2lzdGVyc2FucyA9IDB4ZjhlODtcbiAgdC5yZWdpc3RlcnNlcmlmID0gMHhmNmRhO1xuICB0LnJlaGFyYWJpYyA9IDB4MDYzMTtcbiAgdC5yZWhhcm1lbmlhbiA9IDB4MDU4MDtcbiAgdC5yZWhmaW5hbGFyYWJpYyA9IDB4ZmVhZTtcbiAgdC5yZWhpcmFnYW5hID0gMHgzMDhjO1xuICB0LnJla2F0YWthbmEgPSAweDMwZWM7XG4gIHQucmVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YTtcbiAgdC5yZXNoID0gMHgwNWU4O1xuICB0LnJlc2hkYWdlc2hoZWJyZXcgPSAweGZiNDg7XG4gIHQucmVzaGhlYnJldyA9IDB4MDVlODtcbiAgdC5yZXZlcnNlZHRpbGRlID0gMHgyMjNkO1xuICB0LnJldmlhaGVicmV3ID0gMHgwNTk3O1xuICB0LnJldmlhbXVncmFzaGhlYnJldyA9IDB4MDU5NztcbiAgdC5yZXZsb2dpY2Fsbm90ID0gMHgyMzEwO1xuICB0LnJmaXNoaG9vayA9IDB4MDI3ZTtcbiAgdC5yZmlzaGhvb2tyZXZlcnNlZCA9IDB4MDI3ZjtcbiAgdC5yaGFiZW5nYWxpID0gMHgwOWRkO1xuICB0LnJoYWRldmEgPSAweDA5NWQ7XG4gIHQucmhvID0gMHgwM2MxO1xuICB0LnJob29rID0gMHgwMjdkO1xuICB0LnJob29rdHVybmVkID0gMHgwMjdiO1xuICB0LnJob29rdHVybmVkc3VwZXJpb3IgPSAweDAyYjU7XG4gIHQucmhvc3ltYm9sZ3JlZWsgPSAweDAzZjE7XG4gIHQucmhvdGljaG9va21vZCA9IDB4MDJkZTtcbiAgdC5yaWV1bGFjaXJjbGVrb3JlYW4gPSAweDMyNzE7XG4gIHQucmlldWxhcGFyZW5rb3JlYW4gPSAweDMyMTE7XG4gIHQucmlldWxjaXJjbGVrb3JlYW4gPSAweDMyNjM7XG4gIHQucmlldWxoaWV1aGtvcmVhbiA9IDB4MzE0MDtcbiAgdC5yaWV1bGtpeWVva2tvcmVhbiA9IDB4MzEzYTtcbiAgdC5yaWV1bGtpeWVva3Npb3Nrb3JlYW4gPSAweDMxNjk7XG4gIHQucmlldWxrb3JlYW4gPSAweDMxMzk7XG4gIHQucmlldWxtaWV1bWtvcmVhbiA9IDB4MzEzYjtcbiAgdC5yaWV1bHBhbnNpb3Nrb3JlYW4gPSAweDMxNmM7XG4gIHQucmlldWxwYXJlbmtvcmVhbiA9IDB4MzIwMztcbiAgdC5yaWV1bHBoaWV1cGhrb3JlYW4gPSAweDMxM2Y7XG4gIHQucmlldWxwaWV1cGtvcmVhbiA9IDB4MzEzYztcbiAgdC5yaWV1bHBpZXVwc2lvc2tvcmVhbiA9IDB4MzE2YjtcbiAgdC5yaWV1bHNpb3Nrb3JlYW4gPSAweDMxM2Q7XG4gIHQucmlldWx0aGlldXRoa29yZWFuID0gMHgzMTNlO1xuICB0LnJpZXVsdGlrZXV0a29yZWFuID0gMHgzMTZhO1xuICB0LnJpZXVseWVvcmluaGlldWhrb3JlYW4gPSAweDMxNmQ7XG4gIHQucmlnaHRhbmdsZSA9IDB4MjIxZjtcbiAgdC5yaWdodHRhY2tiZWxvd2NtYiA9IDB4MDMxOTtcbiAgdC5yaWdodHRyaWFuZ2xlID0gMHgyMmJmO1xuICB0LnJpaGlyYWdhbmEgPSAweDMwOGE7XG4gIHQucmlrYXRha2FuYSA9IDB4MzBlYTtcbiAgdC5yaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk4O1xuICB0LnJpbmcgPSAweDAyZGE7XG4gIHQucmluZ2JlbG93Y21iID0gMHgwMzI1O1xuICB0LnJpbmdjbWIgPSAweDAzMGE7XG4gIHQucmluZ2hhbGZsZWZ0ID0gMHgwMmJmO1xuICB0LnJpbmdoYWxmbGVmdGFybWVuaWFuID0gMHgwNTU5O1xuICB0LnJpbmdoYWxmbGVmdGJlbG93Y21iID0gMHgwMzFjO1xuICB0LnJpbmdoYWxmbGVmdGNlbnRlcmVkID0gMHgwMmQzO1xuICB0LnJpbmdoYWxmcmlnaHQgPSAweDAyYmU7XG4gIHQucmluZ2hhbGZyaWdodGJlbG93Y21iID0gMHgwMzM5O1xuICB0LnJpbmdoYWxmcmlnaHRjZW50ZXJlZCA9IDB4MDJkMjtcbiAgdC5yaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMztcbiAgdC5yaXR0b3J1c3F1YXJlID0gMHgzMzUxO1xuICB0LnJsaW5lYmVsb3cgPSAweDFlNWY7XG4gIHQucmxvbmdsZWcgPSAweDAyN2M7XG4gIHQucmxvbmdsZWd0dXJuZWQgPSAweDAyN2E7XG4gIHQucm1vbm9zcGFjZSA9IDB4ZmY1MjtcbiAgdC5yb2hpcmFnYW5hID0gMHgzMDhkO1xuICB0LnJva2F0YWthbmEgPSAweDMwZWQ7XG4gIHQucm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YjtcbiAgdC5yb3J1YXRoYWkgPSAweDBlMjM7XG4gIHQucnBhcmVuID0gMHgyNGFkO1xuICB0LnJyYWJlbmdhbGkgPSAweDA5ZGM7XG4gIHQucnJhZGV2YSA9IDB4MDkzMTtcbiAgdC5ycmFndXJtdWtoaSA9IDB4MGE1YztcbiAgdC5ycmVoYXJhYmljID0gMHgwNjkxO1xuICB0LnJyZWhmaW5hbGFyYWJpYyA9IDB4ZmI4ZDtcbiAgdC5ycnZvY2FsaWNiZW5nYWxpID0gMHgwOWUwO1xuICB0LnJydm9jYWxpY2RldmEgPSAweDA5NjA7XG4gIHQucnJ2b2NhbGljZ3VqYXJhdGkgPSAweDBhZTA7XG4gIHQucnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljNDtcbiAgdC5ycnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQ0O1xuICB0LnJydm9jYWxpY3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM0O1xuICB0LnJzdXBlcmlvciA9IDB4ZjZmMTtcbiAgdC5ydGJsb2NrID0gMHgyNTkwO1xuICB0LnJ0dXJuZWQgPSAweDAyNzk7XG4gIHQucnR1cm5lZHN1cGVyaW9yID0gMHgwMmI0O1xuICB0LnJ1aGlyYWdhbmEgPSAweDMwOGI7XG4gIHQucnVrYXRha2FuYSA9IDB4MzBlYjtcbiAgdC5ydWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk5O1xuICB0LnJ1cGVlbWFya2JlbmdhbGkgPSAweDA5ZjI7XG4gIHQucnVwZWVzaWduYmVuZ2FsaSA9IDB4MDlmMztcbiAgdC5ydXBpYWggPSAweGY2ZGQ7XG4gIHQucnV0aGFpID0gMHgwZTI0O1xuICB0LnJ2b2NhbGljYmVuZ2FsaSA9IDB4MDk4YjtcbiAgdC5ydm9jYWxpY2RldmEgPSAweDA5MGI7XG4gIHQucnZvY2FsaWNndWphcmF0aSA9IDB4MGE4YjtcbiAgdC5ydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzM7XG4gIHQucnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQzO1xuICB0LnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzM7XG4gIHQucyA9IDB4MDA3MztcbiAgdC5zYWJlbmdhbGkgPSAweDA5Yjg7XG4gIHQuc2FjdXRlID0gMHgwMTViO1xuICB0LnNhY3V0ZWRvdGFjY2VudCA9IDB4MWU2NTtcbiAgdC5zYWRhcmFiaWMgPSAweDA2MzU7XG4gIHQuc2FkZXZhID0gMHgwOTM4O1xuICB0LnNhZGZpbmFsYXJhYmljID0gMHhmZWJhO1xuICB0LnNhZGluaXRpYWxhcmFiaWMgPSAweGZlYmI7XG4gIHQuc2FkbWVkaWFsYXJhYmljID0gMHhmZWJjO1xuICB0LnNhZ3VqYXJhdGkgPSAweDBhYjg7XG4gIHQuc2FndXJtdWtoaSA9IDB4MGEzODtcbiAgdC5zYWhpcmFnYW5hID0gMHgzMDU1O1xuICB0LnNha2F0YWthbmEgPSAweDMwYjU7XG4gIHQuc2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YjtcbiAgdC5zYWxsYWxsYWhvdWFsYXloZXdhc2FsbGFtYXJhYmljID0gMHhmZGZhO1xuICB0LnNhbWVraCA9IDB4MDVlMTtcbiAgdC5zYW1la2hkYWdlc2ggPSAweGZiNDE7XG4gIHQuc2FtZWtoZGFnZXNoaGVicmV3ID0gMHhmYjQxO1xuICB0LnNhbWVraGhlYnJldyA9IDB4MDVlMTtcbiAgdC5zYXJhYWF0aGFpID0gMHgwZTMyO1xuICB0LnNhcmFhZXRoYWkgPSAweDBlNDE7XG4gIHQuc2FyYWFpbWFpbWFsYWl0aGFpID0gMHgwZTQ0O1xuICB0LnNhcmFhaW1haW11YW50aGFpID0gMHgwZTQzO1xuICB0LnNhcmFhbXRoYWkgPSAweDBlMzM7XG4gIHQuc2FyYWF0aGFpID0gMHgwZTMwO1xuICB0LnNhcmFldGhhaSA9IDB4MGU0MDtcbiAgdC5zYXJhaWlsZWZ0dGhhaSA9IDB4Zjg4NjtcbiAgdC5zYXJhaWl0aGFpID0gMHgwZTM1O1xuICB0LnNhcmFpbGVmdHRoYWkgPSAweGY4ODU7XG4gIHQuc2FyYWl0aGFpID0gMHgwZTM0O1xuICB0LnNhcmFvdGhhaSA9IDB4MGU0MjtcbiAgdC5zYXJhdWVlbGVmdHRoYWkgPSAweGY4ODg7XG4gIHQuc2FyYXVlZXRoYWkgPSAweDBlMzc7XG4gIHQuc2FyYXVlbGVmdHRoYWkgPSAweGY4ODc7XG4gIHQuc2FyYXVldGhhaSA9IDB4MGUzNjtcbiAgdC5zYXJhdXRoYWkgPSAweDBlMzg7XG4gIHQuc2FyYXV1dGhhaSA9IDB4MGUzOTtcbiAgdC5zYm9wb21vZm8gPSAweDMxMTk7XG4gIHQuc2Nhcm9uID0gMHgwMTYxO1xuICB0LnNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NztcbiAgdC5zY2VkaWxsYSA9IDB4MDE1ZjtcbiAgdC5zY2h3YSA9IDB4MDI1OTtcbiAgdC5zY2h3YWN5cmlsbGljID0gMHgwNGQ5O1xuICB0LnNjaHdhZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkYjtcbiAgdC5zY2h3YWhvb2sgPSAweDAyNWE7XG4gIHQuc2NpcmNsZSA9IDB4MjRlMjtcbiAgdC5zY2lyY3VtZmxleCA9IDB4MDE1ZDtcbiAgdC5zY29tbWFhY2NlbnQgPSAweDAyMTk7XG4gIHQuc2RvdGFjY2VudCA9IDB4MWU2MTtcbiAgdC5zZG90YmVsb3cgPSAweDFlNjM7XG4gIHQuc2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY5O1xuICB0LnNlYWd1bGxiZWxvd2NtYiA9IDB4MDMzYztcbiAgdC5zZWNvbmQgPSAweDIwMzM7XG4gIHQuc2Vjb25kdG9uZWNoaW5lc2UgPSAweDAyY2E7XG4gIHQuc2VjdGlvbiA9IDB4MDBhNztcbiAgdC5zZWVuYXJhYmljID0gMHgwNjMzO1xuICB0LnNlZW5maW5hbGFyYWJpYyA9IDB4ZmViMjtcbiAgdC5zZWVuaW5pdGlhbGFyYWJpYyA9IDB4ZmViMztcbiAgdC5zZWVubWVkaWFsYXJhYmljID0gMHhmZWI0O1xuICB0LnNlZ29sID0gMHgwNWI2O1xuICB0LnNlZ29sMTMgPSAweDA1YjY7XG4gIHQuc2Vnb2wxZiA9IDB4MDViNjtcbiAgdC5zZWdvbDJjID0gMHgwNWI2O1xuICB0LnNlZ29saGVicmV3ID0gMHgwNWI2O1xuICB0LnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWI2O1xuICB0LnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViNjtcbiAgdC5zZWdvbHRhaGVicmV3ID0gMHgwNTkyO1xuICB0LnNlZ29sd2lkZWhlYnJldyA9IDB4MDViNjtcbiAgdC5zZWhhcm1lbmlhbiA9IDB4MDU3ZDtcbiAgdC5zZWhpcmFnYW5hID0gMHgzMDViO1xuICB0LnNla2F0YWthbmEgPSAweDMwYmI7XG4gIHQuc2VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZTtcbiAgdC5zZW1pY29sb24gPSAweDAwM2I7XG4gIHQuc2VtaWNvbG9uYXJhYmljID0gMHgwNjFiO1xuICB0LnNlbWljb2xvbm1vbm9zcGFjZSA9IDB4ZmYxYjtcbiAgdC5zZW1pY29sb25zbWFsbCA9IDB4ZmU1NDtcbiAgdC5zZW1pdm9pY2VkbWFya2thbmEgPSAweDMwOWM7XG4gIHQuc2VtaXZvaWNlZG1hcmtrYW5haGFsZndpZHRoID0gMHhmZjlmO1xuICB0LnNlbnRpc3F1YXJlID0gMHgzMzIyO1xuICB0LnNlbnRvc3F1YXJlID0gMHgzMzIzO1xuICB0LnNldmVuID0gMHgwMDM3O1xuICB0LnNldmVuYXJhYmljID0gMHgwNjY3O1xuICB0LnNldmVuYmVuZ2FsaSA9IDB4MDllZDtcbiAgdC5zZXZlbmNpcmNsZSA9IDB4MjQ2NjtcbiAgdC5zZXZlbmNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OTA7XG4gIHQuc2V2ZW5kZXZhID0gMHgwOTZkO1xuICB0LnNldmVuZWlnaHRocyA9IDB4MjE1ZTtcbiAgdC5zZXZlbmd1amFyYXRpID0gMHgwYWVkO1xuICB0LnNldmVuZ3VybXVraGkgPSAweDBhNmQ7XG4gIHQuc2V2ZW5oYWNrYXJhYmljID0gMHgwNjY3O1xuICB0LnNldmVuaGFuZ3pob3UgPSAweDMwMjc7XG4gIHQuc2V2ZW5pZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI2O1xuICB0LnNldmVuaW5mZXJpb3IgPSAweDIwODc7XG4gIHQuc2V2ZW5tb25vc3BhY2UgPSAweGZmMTc7XG4gIHQuc2V2ZW5vbGRzdHlsZSA9IDB4ZjczNztcbiAgdC5zZXZlbnBhcmVuID0gMHgyNDdhO1xuICB0LnNldmVucGVyaW9kID0gMHgyNDhlO1xuICB0LnNldmVucGVyc2lhbiA9IDB4MDZmNztcbiAgdC5zZXZlbnJvbWFuID0gMHgyMTc2O1xuICB0LnNldmVuc3VwZXJpb3IgPSAweDIwNzc7XG4gIHQuc2V2ZW50ZWVuY2lyY2xlID0gMHgyNDcwO1xuICB0LnNldmVudGVlbnBhcmVuID0gMHgyNDg0O1xuICB0LnNldmVudGVlbnBlcmlvZCA9IDB4MjQ5ODtcbiAgdC5zZXZlbnRoYWkgPSAweDBlNTc7XG4gIHQuc2Z0aHlwaGVuID0gMHgwMGFkO1xuICB0LnNoYWFybWVuaWFuID0gMHgwNTc3O1xuICB0LnNoYWJlbmdhbGkgPSAweDA5YjY7XG4gIHQuc2hhY3lyaWxsaWMgPSAweDA0NDg7XG4gIHQuc2hhZGRhYXJhYmljID0gMHgwNjUxO1xuICB0LnNoYWRkYWRhbW1hYXJhYmljID0gMHhmYzYxO1xuICB0LnNoYWRkYWRhbW1hdGFuYXJhYmljID0gMHhmYzVlO1xuICB0LnNoYWRkYWZhdGhhYXJhYmljID0gMHhmYzYwO1xuICB0LnNoYWRkYWthc3JhYXJhYmljID0gMHhmYzYyO1xuICB0LnNoYWRkYWthc3JhdGFuYXJhYmljID0gMHhmYzVmO1xuICB0LnNoYWRlID0gMHgyNTkyO1xuICB0LnNoYWRlZGFyayA9IDB4MjU5MztcbiAgdC5zaGFkZWxpZ2h0ID0gMHgyNTkxO1xuICB0LnNoYWRlbWVkaXVtID0gMHgyNTkyO1xuICB0LnNoYWRldmEgPSAweDA5MzY7XG4gIHQuc2hhZ3VqYXJhdGkgPSAweDBhYjY7XG4gIHQuc2hhZ3VybXVraGkgPSAweDBhMzY7XG4gIHQuc2hhbHNoZWxldGhlYnJldyA9IDB4MDU5MztcbiAgdC5zaGJvcG9tb2ZvID0gMHgzMTE1O1xuICB0LnNoY2hhY3lyaWxsaWMgPSAweDA0NDk7XG4gIHQuc2hlZW5hcmFiaWMgPSAweDA2MzQ7XG4gIHQuc2hlZW5maW5hbGFyYWJpYyA9IDB4ZmViNjtcbiAgdC5zaGVlbmluaXRpYWxhcmFiaWMgPSAweGZlYjc7XG4gIHQuc2hlZW5tZWRpYWxhcmFiaWMgPSAweGZlYjg7XG4gIHQuc2hlaWNvcHRpYyA9IDB4MDNlMztcbiAgdC5zaGVxZWwgPSAweDIwYWE7XG4gIHQuc2hlcWVsaGVicmV3ID0gMHgyMGFhO1xuICB0LnNoZXZhID0gMHgwNWIwO1xuICB0LnNoZXZhMTE1ID0gMHgwNWIwO1xuICB0LnNoZXZhMTUgPSAweDA1YjA7XG4gIHQuc2hldmEyMiA9IDB4MDViMDtcbiAgdC5zaGV2YTJlID0gMHgwNWIwO1xuICB0LnNoZXZhaGVicmV3ID0gMHgwNWIwO1xuICB0LnNoZXZhbmFycm93aGVicmV3ID0gMHgwNWIwO1xuICB0LnNoZXZhcXVhcnRlcmhlYnJldyA9IDB4MDViMDtcbiAgdC5zaGV2YXdpZGVoZWJyZXcgPSAweDA1YjA7XG4gIHQuc2hoYWN5cmlsbGljID0gMHgwNGJiO1xuICB0LnNoaW1hY29wdGljID0gMHgwM2VkO1xuICB0LnNoaW4gPSAweDA1ZTk7XG4gIHQuc2hpbmRhZ2VzaCA9IDB4ZmI0OTtcbiAgdC5zaGluZGFnZXNoaGVicmV3ID0gMHhmYjQ5O1xuICB0LnNoaW5kYWdlc2hzaGluZG90ID0gMHhmYjJjO1xuICB0LnNoaW5kYWdlc2hzaGluZG90aGVicmV3ID0gMHhmYjJjO1xuICB0LnNoaW5kYWdlc2hzaW5kb3QgPSAweGZiMmQ7XG4gIHQuc2hpbmRhZ2VzaHNpbmRvdGhlYnJldyA9IDB4ZmIyZDtcbiAgdC5zaGluZG90aGVicmV3ID0gMHgwNWMxO1xuICB0LnNoaW5oZWJyZXcgPSAweDA1ZTk7XG4gIHQuc2hpbnNoaW5kb3QgPSAweGZiMmE7XG4gIHQuc2hpbnNoaW5kb3RoZWJyZXcgPSAweGZiMmE7XG4gIHQuc2hpbnNpbmRvdCA9IDB4ZmIyYjtcbiAgdC5zaGluc2luZG90aGVicmV3ID0gMHhmYjJiO1xuICB0LnNob29rID0gMHgwMjgyO1xuICB0LnNpZ21hID0gMHgwM2MzO1xuICB0LnNpZ21hMSA9IDB4MDNjMjtcbiAgdC5zaWdtYWZpbmFsID0gMHgwM2MyO1xuICB0LnNpZ21hbHVuYXRlc3ltYm9sZ3JlZWsgPSAweDAzZjI7XG4gIHQuc2loaXJhZ2FuYSA9IDB4MzA1NztcbiAgdC5zaWthdGFrYW5hID0gMHgzMGI3O1xuICB0LnNpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2M7XG4gIHQuc2lsdXFoZWJyZXcgPSAweDA1YmQ7XG4gIHQuc2lsdXFsZWZ0aGVicmV3ID0gMHgwNWJkO1xuICB0LnNpbWlsYXIgPSAweDIyM2M7XG4gIHQuc2luZG90aGVicmV3ID0gMHgwNWMyO1xuICB0LnNpb3NhY2lyY2xla29yZWFuID0gMHgzMjc0O1xuICB0LnNpb3NhcGFyZW5rb3JlYW4gPSAweDMyMTQ7XG4gIHQuc2lvc2NpZXVja29yZWFuID0gMHgzMTdlO1xuICB0LnNpb3NjaXJjbGVrb3JlYW4gPSAweDMyNjY7XG4gIHQuc2lvc2tpeWVva2tvcmVhbiA9IDB4MzE3YTtcbiAgdC5zaW9za29yZWFuID0gMHgzMTQ1O1xuICB0LnNpb3NuaWV1bmtvcmVhbiA9IDB4MzE3YjtcbiAgdC5zaW9zcGFyZW5rb3JlYW4gPSAweDMyMDY7XG4gIHQuc2lvc3BpZXVwa29yZWFuID0gMHgzMTdkO1xuICB0LnNpb3N0aWtldXRrb3JlYW4gPSAweDMxN2M7XG4gIHQuc2l4ID0gMHgwMDM2O1xuICB0LnNpeGFyYWJpYyA9IDB4MDY2NjtcbiAgdC5zaXhiZW5nYWxpID0gMHgwOWVjO1xuICB0LnNpeGNpcmNsZSA9IDB4MjQ2NTtcbiAgdC5zaXhjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhmO1xuICB0LnNpeGRldmEgPSAweDA5NmM7XG4gIHQuc2l4Z3VqYXJhdGkgPSAweDBhZWM7XG4gIHQuc2l4Z3VybXVraGkgPSAweDBhNmM7XG4gIHQuc2l4aGFja2FyYWJpYyA9IDB4MDY2NjtcbiAgdC5zaXhoYW5nemhvdSA9IDB4MzAyNjtcbiAgdC5zaXhpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI1O1xuICB0LnNpeGluZmVyaW9yID0gMHgyMDg2O1xuICB0LnNpeG1vbm9zcGFjZSA9IDB4ZmYxNjtcbiAgdC5zaXhvbGRzdHlsZSA9IDB4ZjczNjtcbiAgdC5zaXhwYXJlbiA9IDB4MjQ3OTtcbiAgdC5zaXhwZXJpb2QgPSAweDI0OGQ7XG4gIHQuc2l4cGVyc2lhbiA9IDB4MDZmNjtcbiAgdC5zaXhyb21hbiA9IDB4MjE3NTtcbiAgdC5zaXhzdXBlcmlvciA9IDB4MjA3NjtcbiAgdC5zaXh0ZWVuY2lyY2xlID0gMHgyNDZmO1xuICB0LnNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaSA9IDB4MDlmOTtcbiAgdC5zaXh0ZWVucGFyZW4gPSAweDI0ODM7XG4gIHQuc2l4dGVlbnBlcmlvZCA9IDB4MjQ5NztcbiAgdC5zaXh0aGFpID0gMHgwZTU2O1xuICB0LnNsYXNoID0gMHgwMDJmO1xuICB0LnNsYXNobW9ub3NwYWNlID0gMHhmZjBmO1xuICB0LnNsb25nID0gMHgwMTdmO1xuICB0LnNsb25nZG90YWNjZW50ID0gMHgxZTliO1xuICB0LnNtaWxlZmFjZSA9IDB4MjYzYTtcbiAgdC5zbW9ub3NwYWNlID0gMHhmZjUzO1xuICB0LnNvZnBhc3VxaGVicmV3ID0gMHgwNWMzO1xuICB0LnNvZnRoeXBoZW4gPSAweDAwYWQ7XG4gIHQuc29mdHNpZ25jeXJpbGxpYyA9IDB4MDQ0YztcbiAgdC5zb2hpcmFnYW5hID0gMHgzMDVkO1xuICB0LnNva2F0YWthbmEgPSAweDMwYmQ7XG4gIHQuc29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZjtcbiAgdC5zb2xpZHVzbG9uZ292ZXJsYXljbWIgPSAweDAzMzg7XG4gIHQuc29saWR1c3Nob3J0b3ZlcmxheWNtYiA9IDB4MDMzNztcbiAgdC5zb3J1c2l0aGFpID0gMHgwZTI5O1xuICB0LnNvc2FsYXRoYWkgPSAweDBlMjg7XG4gIHQuc29zb3RoYWkgPSAweDBlMGI7XG4gIHQuc29zdWF0aGFpID0gMHgwZTJhO1xuICB0LnNwYWNlID0gMHgwMDIwO1xuICB0LnNwYWNlaGFja2FyYWJpYyA9IDB4MDAyMDtcbiAgdC5zcGFkZSA9IDB4MjY2MDtcbiAgdC5zcGFkZXN1aXRibGFjayA9IDB4MjY2MDtcbiAgdC5zcGFkZXN1aXR3aGl0ZSA9IDB4MjY2NDtcbiAgdC5zcGFyZW4gPSAweDI0YWU7XG4gIHQuc3F1YXJlYmVsb3djbWIgPSAweDAzM2I7XG4gIHQuc3F1YXJlY2MgPSAweDMzYzQ7XG4gIHQuc3F1YXJlY20gPSAweDMzOWQ7XG4gIHQuc3F1YXJlZGlhZ29uYWxjcm9zc2hhdGNoZmlsbCA9IDB4MjVhOTtcbiAgdC5zcXVhcmVob3Jpem9udGFsZmlsbCA9IDB4MjVhNDtcbiAgdC5zcXVhcmVrZyA9IDB4MzM4ZjtcbiAgdC5zcXVhcmVrbSA9IDB4MzM5ZTtcbiAgdC5zcXVhcmVrbWNhcGl0YWwgPSAweDMzY2U7XG4gIHQuc3F1YXJlbG4gPSAweDMzZDE7XG4gIHQuc3F1YXJlbG9nID0gMHgzM2QyO1xuICB0LnNxdWFyZW1nID0gMHgzMzhlO1xuICB0LnNxdWFyZW1pbCA9IDB4MzNkNTtcbiAgdC5zcXVhcmVtbSA9IDB4MzM5YztcbiAgdC5zcXVhcmVtc3F1YXJlZCA9IDB4MzNhMTtcbiAgdC5zcXVhcmVvcnRob2dvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTY7XG4gIHQuc3F1YXJldXBwZXJsZWZ0dG9sb3dlcnJpZ2h0ZmlsbCA9IDB4MjVhNztcbiAgdC5zcXVhcmV1cHBlcnJpZ2h0dG9sb3dlcmxlZnRmaWxsID0gMHgyNWE4O1xuICB0LnNxdWFyZXZlcnRpY2FsZmlsbCA9IDB4MjVhNTtcbiAgdC5zcXVhcmV3aGl0ZXdpdGhzbWFsbGJsYWNrID0gMHgyNWEzO1xuICB0LnNyc3F1YXJlID0gMHgzM2RiO1xuICB0LnNzYWJlbmdhbGkgPSAweDA5Yjc7XG4gIHQuc3NhZGV2YSA9IDB4MDkzNztcbiAgdC5zc2FndWphcmF0aSA9IDB4MGFiNztcbiAgdC5zc2FuZ2NpZXVja29yZWFuID0gMHgzMTQ5O1xuICB0LnNzYW5naGlldWhrb3JlYW4gPSAweDMxODU7XG4gIHQuc3NhbmdpZXVuZ2tvcmVhbiA9IDB4MzE4MDtcbiAgdC5zc2FuZ2tpeWVva2tvcmVhbiA9IDB4MzEzMjtcbiAgdC5zc2FuZ25pZXVua29yZWFuID0gMHgzMTY1O1xuICB0LnNzYW5ncGlldXBrb3JlYW4gPSAweDMxNDM7XG4gIHQuc3NhbmdzaW9za29yZWFuID0gMHgzMTQ2O1xuICB0LnNzYW5ndGlrZXV0a29yZWFuID0gMHgzMTM4O1xuICB0LnNzdXBlcmlvciA9IDB4ZjZmMjtcbiAgdC5zdGVybGluZyA9IDB4MDBhMztcbiAgdC5zdGVybGluZ21vbm9zcGFjZSA9IDB4ZmZlMTtcbiAgdC5zdHJva2Vsb25nb3ZlcmxheWNtYiA9IDB4MDMzNjtcbiAgdC5zdHJva2VzaG9ydG92ZXJsYXljbWIgPSAweDAzMzU7XG4gIHQuc3Vic2V0ID0gMHgyMjgyO1xuICB0LnN1YnNldG5vdGVxdWFsID0gMHgyMjhhO1xuICB0LnN1YnNldG9yZXF1YWwgPSAweDIyODY7XG4gIHQuc3VjY2VlZHMgPSAweDIyN2I7XG4gIHQuc3VjaHRoYXQgPSAweDIyMGI7XG4gIHQuc3VoaXJhZ2FuYSA9IDB4MzA1OTtcbiAgdC5zdWthdGFrYW5hID0gMHgzMGI5O1xuICB0LnN1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2Q7XG4gIHQuc3VrdW5hcmFiaWMgPSAweDA2NTI7XG4gIHQuc3VtbWF0aW9uID0gMHgyMjExO1xuICB0LnN1biA9IDB4MjYzYztcbiAgdC5zdXBlcnNldCA9IDB4MjI4MztcbiAgdC5zdXBlcnNldG5vdGVxdWFsID0gMHgyMjhiO1xuICB0LnN1cGVyc2V0b3JlcXVhbCA9IDB4MjI4NztcbiAgdC5zdnNxdWFyZSA9IDB4MzNkYztcbiAgdC5zeW91d2FlcmFzcXVhcmUgPSAweDMzN2M7XG4gIHQudCA9IDB4MDA3NDtcbiAgdC50YWJlbmdhbGkgPSAweDA5YTQ7XG4gIHQudGFja2Rvd24gPSAweDIyYTQ7XG4gIHQudGFja2xlZnQgPSAweDIyYTM7XG4gIHQudGFkZXZhID0gMHgwOTI0O1xuICB0LnRhZ3VqYXJhdGkgPSAweDBhYTQ7XG4gIHQudGFndXJtdWtoaSA9IDB4MGEyNDtcbiAgdC50YWhhcmFiaWMgPSAweDA2Mzc7XG4gIHQudGFoZmluYWxhcmFiaWMgPSAweGZlYzI7XG4gIHQudGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjMztcbiAgdC50YWhpcmFnYW5hID0gMHgzMDVmO1xuICB0LnRhaG1lZGlhbGFyYWJpYyA9IDB4ZmVjNDtcbiAgdC50YWlzeW91ZXJhc3F1YXJlID0gMHgzMzdkO1xuICB0LnRha2F0YWthbmEgPSAweDMwYmY7XG4gIHQudGFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MDtcbiAgdC50YXR3ZWVsYXJhYmljID0gMHgwNjQwO1xuICB0LnRhdSA9IDB4MDNjNDtcbiAgdC50YXYgPSAweDA1ZWE7XG4gIHQudGF2ZGFnZXMgPSAweGZiNGE7XG4gIHQudGF2ZGFnZXNoID0gMHhmYjRhO1xuICB0LnRhdmRhZ2VzaGhlYnJldyA9IDB4ZmI0YTtcbiAgdC50YXZoZWJyZXcgPSAweDA1ZWE7XG4gIHQudGJhciA9IDB4MDE2NztcbiAgdC50Ym9wb21vZm8gPSAweDMxMGE7XG4gIHQudGNhcm9uID0gMHgwMTY1O1xuICB0LnRjY3VybCA9IDB4MDJhODtcbiAgdC50Y2VkaWxsYSA9IDB4MDE2MztcbiAgdC50Y2hlaGFyYWJpYyA9IDB4MDY4NjtcbiAgdC50Y2hlaGZpbmFsYXJhYmljID0gMHhmYjdiO1xuICB0LnRjaGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI3YztcbiAgdC50Y2hlaG1lZGlhbGFyYWJpYyA9IDB4ZmI3ZDtcbiAgdC50Y2lyY2xlID0gMHgyNGUzO1xuICB0LnRjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzE7XG4gIHQudGNvbW1hYWNjZW50ID0gMHgwMTYzO1xuICB0LnRkaWVyZXNpcyA9IDB4MWU5NztcbiAgdC50ZG90YWNjZW50ID0gMHgxZTZiO1xuICB0LnRkb3RiZWxvdyA9IDB4MWU2ZDtcbiAgdC50ZWN5cmlsbGljID0gMHgwNDQyO1xuICB0LnRlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWQ7XG4gIHQudGVoYXJhYmljID0gMHgwNjJhO1xuICB0LnRlaGZpbmFsYXJhYmljID0gMHhmZTk2O1xuICB0LnRlaGhhaGluaXRpYWxhcmFiaWMgPSAweGZjYTI7XG4gIHQudGVoaGFoaXNvbGF0ZWRhcmFiaWMgPSAweGZjMGM7XG4gIHQudGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5NztcbiAgdC50ZWhpcmFnYW5hID0gMHgzMDY2O1xuICB0LnRlaGplZW1pbml0aWFsYXJhYmljID0gMHhmY2ExO1xuICB0LnRlaGplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwYjtcbiAgdC50ZWhtYXJidXRhYXJhYmljID0gMHgwNjI5O1xuICB0LnRlaG1hcmJ1dGFmaW5hbGFyYWJpYyA9IDB4ZmU5NDtcbiAgdC50ZWhtZWRpYWxhcmFiaWMgPSAweGZlOTg7XG4gIHQudGVobWVlbWluaXRpYWxhcmFiaWMgPSAweGZjYTQ7XG4gIHQudGVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzBlO1xuICB0LnRlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM3MztcbiAgdC50ZWthdGFrYW5hID0gMHgzMGM2O1xuICB0LnRla2F0YWthbmFoYWxmd2lkdGggPSAweGZmODM7XG4gIHQudGVsZXBob25lID0gMHgyMTIxO1xuICB0LnRlbGVwaG9uZWJsYWNrID0gMHgyNjBlO1xuICB0LnRlbGlzaGFnZWRvbGFoZWJyZXcgPSAweDA1YTA7XG4gIHQudGVsaXNoYXFldGFuYWhlYnJldyA9IDB4MDVhOTtcbiAgdC50ZW5jaXJjbGUgPSAweDI0Njk7XG4gIHQudGVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyOTtcbiAgdC50ZW5wYXJlbiA9IDB4MjQ3ZDtcbiAgdC50ZW5wZXJpb2QgPSAweDI0OTE7XG4gIHQudGVucm9tYW4gPSAweDIxNzk7XG4gIHQudGVzaCA9IDB4MDJhNztcbiAgdC50ZXQgPSAweDA1ZDg7XG4gIHQudGV0ZGFnZXNoID0gMHhmYjM4O1xuICB0LnRldGRhZ2VzaGhlYnJldyA9IDB4ZmIzODtcbiAgdC50ZXRoZWJyZXcgPSAweDA1ZDg7XG4gIHQudGV0c2VjeXJpbGxpYyA9IDB4MDRiNTtcbiAgdC50ZXZpcmhlYnJldyA9IDB4MDU5YjtcbiAgdC50ZXZpcmxlZnRoZWJyZXcgPSAweDA1OWI7XG4gIHQudGhhYmVuZ2FsaSA9IDB4MDlhNTtcbiAgdC50aGFkZXZhID0gMHgwOTI1O1xuICB0LnRoYWd1amFyYXRpID0gMHgwYWE1O1xuICB0LnRoYWd1cm11a2hpID0gMHgwYTI1O1xuICB0LnRoYWxhcmFiaWMgPSAweDA2MzA7XG4gIHQudGhhbGZpbmFsYXJhYmljID0gMHhmZWFjO1xuICB0LnRoYW50aGFraGF0bG93bGVmdHRoYWkgPSAweGY4OTg7XG4gIHQudGhhbnRoYWtoYXRsb3dyaWdodHRoYWkgPSAweGY4OTc7XG4gIHQudGhhbnRoYWtoYXR0aGFpID0gMHgwZTRjO1xuICB0LnRoYW50aGFraGF0dXBwZXJsZWZ0dGhhaSA9IDB4Zjg5NjtcbiAgdC50aGVoYXJhYmljID0gMHgwNjJiO1xuICB0LnRoZWhmaW5hbGFyYWJpYyA9IDB4ZmU5YTtcbiAgdC50aGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5YjtcbiAgdC50aGVobWVkaWFsYXJhYmljID0gMHhmZTljO1xuICB0LnRoZXJlZXhpc3RzID0gMHgyMjAzO1xuICB0LnRoZXJlZm9yZSA9IDB4MjIzNDtcbiAgdC50aGV0YSA9IDB4MDNiODtcbiAgdC50aGV0YTEgPSAweDAzZDE7XG4gIHQudGhldGFzeW1ib2xncmVlayA9IDB4MDNkMTtcbiAgdC50aGlldXRoYWNpcmNsZWtvcmVhbiA9IDB4MzI3OTtcbiAgdC50aGlldXRoYXBhcmVua29yZWFuID0gMHgzMjE5O1xuICB0LnRoaWV1dGhjaXJjbGVrb3JlYW4gPSAweDMyNmI7XG4gIHQudGhpZXV0aGtvcmVhbiA9IDB4MzE0YztcbiAgdC50aGlldXRocGFyZW5rb3JlYW4gPSAweDMyMGI7XG4gIHQudGhpcnRlZW5jaXJjbGUgPSAweDI0NmM7XG4gIHQudGhpcnRlZW5wYXJlbiA9IDB4MjQ4MDtcbiAgdC50aGlydGVlbnBlcmlvZCA9IDB4MjQ5NDtcbiAgdC50aG9uYW5nbW9udGhvdGhhaSA9IDB4MGUxMTtcbiAgdC50aG9vayA9IDB4MDFhZDtcbiAgdC50aG9waHV0aGFvdGhhaSA9IDB4MGUxMjtcbiAgdC50aG9ybiA9IDB4MDBmZTtcbiAgdC50aG90aGFoYW50aGFpID0gMHgwZTE3O1xuICB0LnRob3RoYW50aGFpID0gMHgwZTEwO1xuICB0LnRob3Rob25ndGhhaSA9IDB4MGUxODtcbiAgdC50aG90aHVuZ3RoYWkgPSAweDBlMTY7XG4gIHQudGhvdXNhbmRjeXJpbGxpYyA9IDB4MDQ4MjtcbiAgdC50aG91c2FuZHNzZXBhcmF0b3JhcmFiaWMgPSAweDA2NmM7XG4gIHQudGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbiA9IDB4MDY2YztcbiAgdC50aHJlZSA9IDB4MDAzMztcbiAgdC50aHJlZWFyYWJpYyA9IDB4MDY2MztcbiAgdC50aHJlZWJlbmdhbGkgPSAweDA5ZTk7XG4gIHQudGhyZWVjaXJjbGUgPSAweDI0NjI7XG4gIHQudGhyZWVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhjO1xuICB0LnRocmVlZGV2YSA9IDB4MDk2OTtcbiAgdC50aHJlZWVpZ2h0aHMgPSAweDIxNWM7XG4gIHQudGhyZWVndWphcmF0aSA9IDB4MGFlOTtcbiAgdC50aHJlZWd1cm11a2hpID0gMHgwYTY5O1xuICB0LnRocmVlaGFja2FyYWJpYyA9IDB4MDY2MztcbiAgdC50aHJlZWhhbmd6aG91ID0gMHgzMDIzO1xuICB0LnRocmVlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMjtcbiAgdC50aHJlZWluZmVyaW9yID0gMHgyMDgzO1xuICB0LnRocmVlbW9ub3NwYWNlID0gMHhmZjEzO1xuICB0LnRocmVlbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNjtcbiAgdC50aHJlZW9sZHN0eWxlID0gMHhmNzMzO1xuICB0LnRocmVlcGFyZW4gPSAweDI0NzY7XG4gIHQudGhyZWVwZXJpb2QgPSAweDI0OGE7XG4gIHQudGhyZWVwZXJzaWFuID0gMHgwNmYzO1xuICB0LnRocmVlcXVhcnRlcnMgPSAweDAwYmU7XG4gIHQudGhyZWVxdWFydGVyc2VtZGFzaCA9IDB4ZjZkZTtcbiAgdC50aHJlZXJvbWFuID0gMHgyMTcyO1xuICB0LnRocmVlc3VwZXJpb3IgPSAweDAwYjM7XG4gIHQudGhyZWV0aGFpID0gMHgwZTUzO1xuICB0LnRoenNxdWFyZSA9IDB4MzM5NDtcbiAgdC50aWhpcmFnYW5hID0gMHgzMDYxO1xuICB0LnRpa2F0YWthbmEgPSAweDMwYzE7XG4gIHQudGlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MTtcbiAgdC50aWtldXRhY2lyY2xla29yZWFuID0gMHgzMjcwO1xuICB0LnRpa2V1dGFwYXJlbmtvcmVhbiA9IDB4MzIxMDtcbiAgdC50aWtldXRjaXJjbGVrb3JlYW4gPSAweDMyNjI7XG4gIHQudGlrZXV0a29yZWFuID0gMHgzMTM3O1xuICB0LnRpa2V1dHBhcmVua29yZWFuID0gMHgzMjAyO1xuICB0LnRpbGRlID0gMHgwMmRjO1xuICB0LnRpbGRlYmVsb3djbWIgPSAweDAzMzA7XG4gIHQudGlsZGVjbWIgPSAweDAzMDM7XG4gIHQudGlsZGVjb21iID0gMHgwMzAzO1xuICB0LnRpbGRlZG91YmxlY21iID0gMHgwMzYwO1xuICB0LnRpbGRlb3BlcmF0b3IgPSAweDIyM2M7XG4gIHQudGlsZGVvdmVybGF5Y21iID0gMHgwMzM0O1xuICB0LnRpbGRldmVydGljYWxjbWIgPSAweDAzM2U7XG4gIHQudGltZXNjaXJjbGUgPSAweDIyOTc7XG4gIHQudGlwZWhhaGVicmV3ID0gMHgwNTk2O1xuICB0LnRpcGVoYWxlZnRoZWJyZXcgPSAweDA1OTY7XG4gIHQudGlwcGlndXJtdWtoaSA9IDB4MGE3MDtcbiAgdC50aXRsb2N5cmlsbGljY21iID0gMHgwNDgzO1xuICB0LnRpd25hcm1lbmlhbiA9IDB4MDU3ZjtcbiAgdC50bGluZWJlbG93ID0gMHgxZTZmO1xuICB0LnRtb25vc3BhY2UgPSAweGZmNTQ7XG4gIHQudG9hcm1lbmlhbiA9IDB4MDU2OTtcbiAgdC50b2hpcmFnYW5hID0gMHgzMDY4O1xuICB0LnRva2F0YWthbmEgPSAweDMwYzg7XG4gIHQudG9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NDtcbiAgdC50b25lYmFyZXh0cmFoaWdobW9kID0gMHgwMmU1O1xuICB0LnRvbmViYXJleHRyYWxvd21vZCA9IDB4MDJlOTtcbiAgdC50b25lYmFyaGlnaG1vZCA9IDB4MDJlNjtcbiAgdC50b25lYmFybG93bW9kID0gMHgwMmU4O1xuICB0LnRvbmViYXJtaWRtb2QgPSAweDAyZTc7XG4gIHQudG9uZWZpdmUgPSAweDAxYmQ7XG4gIHQudG9uZXNpeCA9IDB4MDE4NTtcbiAgdC50b25ldHdvID0gMHgwMWE4O1xuICB0LnRvbm9zID0gMHgwMzg0O1xuICB0LnRvbnNxdWFyZSA9IDB4MzMyNztcbiAgdC50b3BhdGFrdGhhaSA9IDB4MGUwZjtcbiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQgPSAweDMwMTQ7XG4gIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0c21hbGwgPSAweGZlNWQ7XG4gIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlMzk7XG4gIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxNTtcbiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0c21hbGwgPSAweGZlNWU7XG4gIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTNhO1xuICB0LnRvdGFvdGhhaSA9IDB4MGUxNTtcbiAgdC50cGFsYXRhbGhvb2sgPSAweDAxYWI7XG4gIHQudHBhcmVuID0gMHgyNGFmO1xuICB0LnRyYWRlbWFyayA9IDB4MjEyMjtcbiAgdC50cmFkZW1hcmtzYW5zID0gMHhmOGVhO1xuICB0LnRyYWRlbWFya3NlcmlmID0gMHhmNmRiO1xuICB0LnRyZXRyb2ZsZXhob29rID0gMHgwMjg4O1xuICB0LnRyaWFnZG4gPSAweDI1YmM7XG4gIHQudHJpYWdsZiA9IDB4MjVjNDtcbiAgdC50cmlhZ3J0ID0gMHgyNWJhO1xuICB0LnRyaWFndXAgPSAweDI1YjI7XG4gIHQudHMgPSAweDAyYTY7XG4gIHQudHNhZGkgPSAweDA1ZTY7XG4gIHQudHNhZGlkYWdlc2ggPSAweGZiNDY7XG4gIHQudHNhZGlkYWdlc2hoZWJyZXcgPSAweGZiNDY7XG4gIHQudHNhZGloZWJyZXcgPSAweDA1ZTY7XG4gIHQudHNlY3lyaWxsaWMgPSAweDA0NDY7XG4gIHQudHNlcmUgPSAweDA1YjU7XG4gIHQudHNlcmUxMiA9IDB4MDViNTtcbiAgdC50c2VyZTFlID0gMHgwNWI1O1xuICB0LnRzZXJlMmIgPSAweDA1YjU7XG4gIHQudHNlcmVoZWJyZXcgPSAweDA1YjU7XG4gIHQudHNlcmVuYXJyb3doZWJyZXcgPSAweDA1YjU7XG4gIHQudHNlcmVxdWFydGVyaGVicmV3ID0gMHgwNWI1O1xuICB0LnRzZXJld2lkZWhlYnJldyA9IDB4MDViNTtcbiAgdC50c2hlY3lyaWxsaWMgPSAweDA0NWI7XG4gIHQudHN1cGVyaW9yID0gMHhmNmYzO1xuICB0LnR0YWJlbmdhbGkgPSAweDA5OWY7XG4gIHQudHRhZGV2YSA9IDB4MDkxZjtcbiAgdC50dGFndWphcmF0aSA9IDB4MGE5ZjtcbiAgdC50dGFndXJtdWtoaSA9IDB4MGExZjtcbiAgdC50dGVoYXJhYmljID0gMHgwNjc5O1xuICB0LnR0ZWhmaW5hbGFyYWJpYyA9IDB4ZmI2NztcbiAgdC50dGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI2ODtcbiAgdC50dGVobWVkaWFsYXJhYmljID0gMHhmYjY5O1xuICB0LnR0aGFiZW5nYWxpID0gMHgwOWEwO1xuICB0LnR0aGFkZXZhID0gMHgwOTIwO1xuICB0LnR0aGFndWphcmF0aSA9IDB4MGFhMDtcbiAgdC50dGhhZ3VybXVraGkgPSAweDBhMjA7XG4gIHQudHR1cm5lZCA9IDB4MDI4NztcbiAgdC50dWhpcmFnYW5hID0gMHgzMDY0O1xuICB0LnR1a2F0YWthbmEgPSAweDMwYzQ7XG4gIHQudHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MjtcbiAgdC50dXNtYWxsaGlyYWdhbmEgPSAweDMwNjM7XG4gIHQudHVzbWFsbGthdGFrYW5hID0gMHgzMGMzO1xuICB0LnR1c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ZjtcbiAgdC50d2VsdmVjaXJjbGUgPSAweDI0NmI7XG4gIHQudHdlbHZlcGFyZW4gPSAweDI0N2Y7XG4gIHQudHdlbHZlcGVyaW9kID0gMHgyNDkzO1xuICB0LnR3ZWx2ZXJvbWFuID0gMHgyMTdiO1xuICB0LnR3ZW50eWNpcmNsZSA9IDB4MjQ3MztcbiAgdC50d2VudHloYW5nemhvdSA9IDB4NTM0NDtcbiAgdC50d2VudHlwYXJlbiA9IDB4MjQ4NztcbiAgdC50d2VudHlwZXJpb2QgPSAweDI0OWI7XG4gIHQudHdvID0gMHgwMDMyO1xuICB0LnR3b2FyYWJpYyA9IDB4MDY2MjtcbiAgdC50d29iZW5nYWxpID0gMHgwOWU4O1xuICB0LnR3b2NpcmNsZSA9IDB4MjQ2MTtcbiAgdC50d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhiO1xuICB0LnR3b2RldmEgPSAweDA5Njg7XG4gIHQudHdvZG90ZW5sZWFkZXIgPSAweDIwMjU7XG4gIHQudHdvZG90bGVhZGVyID0gMHgyMDI1O1xuICB0LnR3b2RvdGxlYWRlcnZlcnRpY2FsID0gMHhmZTMwO1xuICB0LnR3b2d1amFyYXRpID0gMHgwYWU4O1xuICB0LnR3b2d1cm11a2hpID0gMHgwYTY4O1xuICB0LnR3b2hhY2thcmFiaWMgPSAweDA2NjI7XG4gIHQudHdvaGFuZ3pob3UgPSAweDMwMjI7XG4gIHQudHdvaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMTtcbiAgdC50d29pbmZlcmlvciA9IDB4MjA4MjtcbiAgdC50d29tb25vc3BhY2UgPSAweGZmMTI7XG4gIHQudHdvbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNTtcbiAgdC50d29vbGRzdHlsZSA9IDB4ZjczMjtcbiAgdC50d29wYXJlbiA9IDB4MjQ3NTtcbiAgdC50d29wZXJpb2QgPSAweDI0ODk7XG4gIHQudHdvcGVyc2lhbiA9IDB4MDZmMjtcbiAgdC50d29yb21hbiA9IDB4MjE3MTtcbiAgdC50d29zdHJva2UgPSAweDAxYmI7XG4gIHQudHdvc3VwZXJpb3IgPSAweDAwYjI7XG4gIHQudHdvdGhhaSA9IDB4MGU1MjtcbiAgdC50d290aGlyZHMgPSAweDIxNTQ7XG4gIHQudSA9IDB4MDA3NTtcbiAgdC51YWN1dGUgPSAweDAwZmE7XG4gIHQudWJhciA9IDB4MDI4OTtcbiAgdC51YmVuZ2FsaSA9IDB4MDk4OTtcbiAgdC51Ym9wb21vZm8gPSAweDMxMjg7XG4gIHQudWJyZXZlID0gMHgwMTZkO1xuICB0LnVjYXJvbiA9IDB4MDFkNDtcbiAgdC51Y2lyY2xlID0gMHgyNGU0O1xuICB0LnVjaXJjdW1mbGV4ID0gMHgwMGZiO1xuICB0LnVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzc7XG4gIHQudWN5cmlsbGljID0gMHgwNDQzO1xuICB0LnVkYXR0YWRldmEgPSAweDA5NTE7XG4gIHQudWRibGFjdXRlID0gMHgwMTcxO1xuICB0LnVkYmxncmF2ZSA9IDB4MDIxNTtcbiAgdC51ZGV2YSA9IDB4MDkwOTtcbiAgdC51ZGllcmVzaXMgPSAweDAwZmM7XG4gIHQudWRpZXJlc2lzYWN1dGUgPSAweDAxZDg7XG4gIHQudWRpZXJlc2lzYmVsb3cgPSAweDFlNzM7XG4gIHQudWRpZXJlc2lzY2Fyb24gPSAweDAxZGE7XG4gIHQudWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjE7XG4gIHQudWRpZXJlc2lzZ3JhdmUgPSAweDAxZGM7XG4gIHQudWRpZXJlc2lzbWFjcm9uID0gMHgwMWQ2O1xuICB0LnVkb3RiZWxvdyA9IDB4MWVlNTtcbiAgdC51Z3JhdmUgPSAweDAwZjk7XG4gIHQudWd1amFyYXRpID0gMHgwYTg5O1xuICB0LnVndXJtdWtoaSA9IDB4MGEwOTtcbiAgdC51aGlyYWdhbmEgPSAweDMwNDY7XG4gIHQudWhvb2thYm92ZSA9IDB4MWVlNztcbiAgdC51aG9ybiA9IDB4MDFiMDtcbiAgdC51aG9ybmFjdXRlID0gMHgxZWU5O1xuICB0LnVob3JuZG90YmVsb3cgPSAweDFlZjE7XG4gIHQudWhvcm5ncmF2ZSA9IDB4MWVlYjtcbiAgdC51aG9ybmhvb2thYm92ZSA9IDB4MWVlZDtcbiAgdC51aG9ybnRpbGRlID0gMHgxZWVmO1xuICB0LnVodW5nYXJ1bWxhdXQgPSAweDAxNzE7XG4gIHQudWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYzO1xuICB0LnVpbnZlcnRlZGJyZXZlID0gMHgwMjE3O1xuICB0LnVrYXRha2FuYSA9IDB4MzBhNjtcbiAgdC51a2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzM7XG4gIHQudWtjeXJpbGxpYyA9IDB4MDQ3OTtcbiAgdC51a29yZWFuID0gMHgzMTVjO1xuICB0LnVtYWNyb24gPSAweDAxNmI7XG4gIHQudW1hY3JvbmN5cmlsbGljID0gMHgwNGVmO1xuICB0LnVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YjtcbiAgdC51bWF0cmFndXJtdWtoaSA9IDB4MGE0MTtcbiAgdC51bW9ub3NwYWNlID0gMHhmZjU1O1xuICB0LnVuZGVyc2NvcmUgPSAweDAwNWY7XG4gIHQudW5kZXJzY29yZWRibCA9IDB4MjAxNztcbiAgdC51bmRlcnNjb3JlbW9ub3NwYWNlID0gMHhmZjNmO1xuICB0LnVuZGVyc2NvcmV2ZXJ0aWNhbCA9IDB4ZmUzMztcbiAgdC51bmRlcnNjb3Jld2F2eSA9IDB4ZmU0ZjtcbiAgdC51bmlvbiA9IDB4MjIyYTtcbiAgdC51bml2ZXJzYWwgPSAweDIyMDA7XG4gIHQudW9nb25layA9IDB4MDE3MztcbiAgdC51cGFyZW4gPSAweDI0YjA7XG4gIHQudXBibG9jayA9IDB4MjU4MDtcbiAgdC51cHBlcmRvdGhlYnJldyA9IDB4MDVjNDtcbiAgdC51cHNpbG9uID0gMHgwM2M1O1xuICB0LnVwc2lsb25kaWVyZXNpcyA9IDB4MDNjYjtcbiAgdC51cHNpbG9uZGllcmVzaXN0b25vcyA9IDB4MDNiMDtcbiAgdC51cHNpbG9ubGF0aW4gPSAweDAyOGE7XG4gIHQudXBzaWxvbnRvbm9zID0gMHgwM2NkO1xuICB0LnVwdGFja2JlbG93Y21iID0gMHgwMzFkO1xuICB0LnVwdGFja21vZCA9IDB4MDJkNDtcbiAgdC51cmFndXJtdWtoaSA9IDB4MGE3MztcbiAgdC51cmluZyA9IDB4MDE2ZjtcbiAgdC51c2hvcnRjeXJpbGxpYyA9IDB4MDQ1ZTtcbiAgdC51c21hbGxoaXJhZ2FuYSA9IDB4MzA0NTtcbiAgdC51c21hbGxrYXRha2FuYSA9IDB4MzBhNTtcbiAgdC51c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2OTtcbiAgdC51c3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZjtcbiAgdC51c3RyYWlnaHRzdHJva2VjeXJpbGxpYyA9IDB4MDRiMTtcbiAgdC51dGlsZGUgPSAweDAxNjk7XG4gIHQudXRpbGRlYWN1dGUgPSAweDFlNzk7XG4gIHQudXRpbGRlYmVsb3cgPSAweDFlNzU7XG4gIHQudXViZW5nYWxpID0gMHgwOThhO1xuICB0LnV1ZGV2YSA9IDB4MDkwYTtcbiAgdC51dWd1amFyYXRpID0gMHgwYThhO1xuICB0LnV1Z3VybXVraGkgPSAweDBhMGE7XG4gIHQudXVtYXRyYWd1cm11a2hpID0gMHgwYTQyO1xuICB0LnV1dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMjtcbiAgdC51dXZvd2Vsc2lnbmRldmEgPSAweDA5NDI7XG4gIHQudXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMjtcbiAgdC51dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMTtcbiAgdC51dm93ZWxzaWduZGV2YSA9IDB4MDk0MTtcbiAgdC51dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzE7XG4gIHQudiA9IDB4MDA3NjtcbiAgdC52YWRldmEgPSAweDA5MzU7XG4gIHQudmFndWphcmF0aSA9IDB4MGFiNTtcbiAgdC52YWd1cm11a2hpID0gMHgwYTM1O1xuICB0LnZha2F0YWthbmEgPSAweDMwZjc7XG4gIHQudmF2ID0gMHgwNWQ1O1xuICB0LnZhdmRhZ2VzaCA9IDB4ZmIzNTtcbiAgdC52YXZkYWdlc2g2NSA9IDB4ZmIzNTtcbiAgdC52YXZkYWdlc2hoZWJyZXcgPSAweGZiMzU7XG4gIHQudmF2aGVicmV3ID0gMHgwNWQ1O1xuICB0LnZhdmhvbGFtID0gMHhmYjRiO1xuICB0LnZhdmhvbGFtaGVicmV3ID0gMHhmYjRiO1xuICB0LnZhdnZhdmhlYnJldyA9IDB4MDVmMDtcbiAgdC52YXZ5b2RoZWJyZXcgPSAweDA1ZjE7XG4gIHQudmNpcmNsZSA9IDB4MjRlNTtcbiAgdC52ZG90YmVsb3cgPSAweDFlN2Y7XG4gIHQudmVjeXJpbGxpYyA9IDB4MDQzMjtcbiAgdC52ZWhhcmFiaWMgPSAweDA2YTQ7XG4gIHQudmVoZmluYWxhcmFiaWMgPSAweGZiNmI7XG4gIHQudmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI2YztcbiAgdC52ZWhtZWRpYWxhcmFiaWMgPSAweGZiNmQ7XG4gIHQudmVrYXRha2FuYSA9IDB4MzBmOTtcbiAgdC52ZW51cyA9IDB4MjY0MDtcbiAgdC52ZXJ0aWNhbGJhciA9IDB4MDA3YztcbiAgdC52ZXJ0aWNhbGxpbmVhYm92ZWNtYiA9IDB4MDMwZDtcbiAgdC52ZXJ0aWNhbGxpbmViZWxvd2NtYiA9IDB4MDMyOTtcbiAgdC52ZXJ0aWNhbGxpbmVsb3dtb2QgPSAweDAyY2M7XG4gIHQudmVydGljYWxsaW5lbW9kID0gMHgwMmM4O1xuICB0LnZld2FybWVuaWFuID0gMHgwNTdlO1xuICB0LnZob29rID0gMHgwMjhiO1xuICB0LnZpa2F0YWthbmEgPSAweDMwZjg7XG4gIHQudmlyYW1hYmVuZ2FsaSA9IDB4MDljZDtcbiAgdC52aXJhbWFkZXZhID0gMHgwOTRkO1xuICB0LnZpcmFtYWd1amFyYXRpID0gMHgwYWNkO1xuICB0LnZpc2FyZ2FiZW5nYWxpID0gMHgwOTgzO1xuICB0LnZpc2FyZ2FkZXZhID0gMHgwOTAzO1xuICB0LnZpc2FyZ2FndWphcmF0aSA9IDB4MGE4MztcbiAgdC52bW9ub3NwYWNlID0gMHhmZjU2O1xuICB0LnZvYXJtZW5pYW4gPSAweDA1Nzg7XG4gIHQudm9pY2VkaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWU7XG4gIHQudm9pY2VkaXRlcmF0aW9ua2F0YWthbmEgPSAweDMwZmU7XG4gIHQudm9pY2VkbWFya2thbmEgPSAweDMwOWI7XG4gIHQudm9pY2VkbWFya2thbmFoYWxmd2lkdGggPSAweGZmOWU7XG4gIHQudm9rYXRha2FuYSA9IDB4MzBmYTtcbiAgdC52cGFyZW4gPSAweDI0YjE7XG4gIHQudnRpbGRlID0gMHgxZTdkO1xuICB0LnZ0dXJuZWQgPSAweDAyOGM7XG4gIHQudnVoaXJhZ2FuYSA9IDB4MzA5NDtcbiAgdC52dWthdGFrYW5hID0gMHgzMGY0O1xuICB0LncgPSAweDAwNzc7XG4gIHQud2FjdXRlID0gMHgxZTgzO1xuICB0LndhZWtvcmVhbiA9IDB4MzE1OTtcbiAgdC53YWhpcmFnYW5hID0gMHgzMDhmO1xuICB0Lndha2F0YWthbmEgPSAweDMwZWY7XG4gIHQud2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YztcbiAgdC53YWtvcmVhbiA9IDB4MzE1ODtcbiAgdC53YXNtYWxsaGlyYWdhbmEgPSAweDMwOGU7XG4gIHQud2FzbWFsbGthdGFrYW5hID0gMHgzMGVlO1xuICB0LndhdHRvc3F1YXJlID0gMHgzMzU3O1xuICB0LndhdmVkYXNoID0gMHgzMDFjO1xuICB0Lndhdnl1bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzQ7XG4gIHQud2F3YXJhYmljID0gMHgwNjQ4O1xuICB0Lndhd2ZpbmFsYXJhYmljID0gMHhmZWVlO1xuICB0Lndhd2hhbXphYWJvdmVhcmFiaWMgPSAweDA2MjQ7XG4gIHQud2F3aGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZTg2O1xuICB0Lndic3F1YXJlID0gMHgzM2RkO1xuICB0LndjaXJjbGUgPSAweDI0ZTY7XG4gIHQud2NpcmN1bWZsZXggPSAweDAxNzU7XG4gIHQud2RpZXJlc2lzID0gMHgxZTg1O1xuICB0Lndkb3RhY2NlbnQgPSAweDFlODc7XG4gIHQud2RvdGJlbG93ID0gMHgxZTg5O1xuICB0LndlaGlyYWdhbmEgPSAweDMwOTE7XG4gIHQud2VpZXJzdHJhc3MgPSAweDIxMTg7XG4gIHQud2VrYXRha2FuYSA9IDB4MzBmMTtcbiAgdC53ZWtvcmVhbiA9IDB4MzE1ZTtcbiAgdC53ZW9rb3JlYW4gPSAweDMxNWQ7XG4gIHQud2dyYXZlID0gMHgxZTgxO1xuICB0LndoaXRlYnVsbGV0ID0gMHgyNWU2O1xuICB0LndoaXRlY2lyY2xlID0gMHgyNWNiO1xuICB0LndoaXRlY2lyY2xlaW52ZXJzZSA9IDB4MjVkOTtcbiAgdC53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0ID0gMHgzMDBlO1xuICB0LndoaXRlY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MztcbiAgdC53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZjtcbiAgdC53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQ0O1xuICB0LndoaXRlZGlhbW9uZCA9IDB4MjVjNztcbiAgdC53aGl0ZWRpYW1vbmRjb250YWluaW5nYmxhY2tzbWFsbGRpYW1vbmQgPSAweDI1Yzg7XG4gIHQud2hpdGVkb3ducG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWJmO1xuICB0LndoaXRlZG93bnBvaW50aW5ndHJpYW5nbGUgPSAweDI1YmQ7XG4gIHQud2hpdGVsZWZ0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWMzO1xuICB0LndoaXRlbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzE7XG4gIHQud2hpdGVsZW50aWN1bGFyYnJhY2tldGxlZnQgPSAweDMwMTY7XG4gIHQud2hpdGVsZW50aWN1bGFyYnJhY2tldHJpZ2h0ID0gMHgzMDE3O1xuICB0LndoaXRlcmlnaHRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1Yjk7XG4gIHQud2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGUgPSAweDI1Yjc7XG4gIHQud2hpdGVzbWFsbHNxdWFyZSA9IDB4MjVhYjtcbiAgdC53aGl0ZXNtaWxpbmdmYWNlID0gMHgyNjNhO1xuICB0LndoaXRlc3F1YXJlID0gMHgyNWExO1xuICB0LndoaXRlc3RhciA9IDB4MjYwNjtcbiAgdC53aGl0ZXRlbGVwaG9uZSA9IDB4MjYwZjtcbiAgdC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdCA9IDB4MzAxODtcbiAgdC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQgPSAweDMwMTk7XG4gIHQud2hpdGV1cHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViNTtcbiAgdC53aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMztcbiAgdC53aWhpcmFnYW5hID0gMHgzMDkwO1xuICB0Lndpa2F0YWthbmEgPSAweDMwZjA7XG4gIHQud2lrb3JlYW4gPSAweDMxNWY7XG4gIHQud21vbm9zcGFjZSA9IDB4ZmY1NztcbiAgdC53b2hpcmFnYW5hID0gMHgzMDkyO1xuICB0Lndva2F0YWthbmEgPSAweDMwZjI7XG4gIHQud29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NjtcbiAgdC53b24gPSAweDIwYTk7XG4gIHQud29ubW9ub3NwYWNlID0gMHhmZmU2O1xuICB0Lndvd2FlbnRoYWkgPSAweDBlMjc7XG4gIHQud3BhcmVuID0gMHgyNGIyO1xuICB0LndyaW5nID0gMHgxZTk4O1xuICB0LndzdXBlcmlvciA9IDB4MDJiNztcbiAgdC53dHVybmVkID0gMHgwMjhkO1xuICB0Lnd5bm4gPSAweDAxYmY7XG4gIHQueCA9IDB4MDA3ODtcbiAgdC54YWJvdmVjbWIgPSAweDAzM2Q7XG4gIHQueGJvcG9tb2ZvID0gMHgzMTEyO1xuICB0LnhjaXJjbGUgPSAweDI0ZTc7XG4gIHQueGRpZXJlc2lzID0gMHgxZThkO1xuICB0Lnhkb3RhY2NlbnQgPSAweDFlOGI7XG4gIHQueGVoYXJtZW5pYW4gPSAweDA1NmQ7XG4gIHQueGkgPSAweDAzYmU7XG4gIHQueG1vbm9zcGFjZSA9IDB4ZmY1ODtcbiAgdC54cGFyZW4gPSAweDI0YjM7XG4gIHQueHN1cGVyaW9yID0gMHgwMmUzO1xuICB0LnkgPSAweDAwNzk7XG4gIHQueWFhZG9zcXVhcmUgPSAweDMzNGU7XG4gIHQueWFiZW5nYWxpID0gMHgwOWFmO1xuICB0LnlhY3V0ZSA9IDB4MDBmZDtcbiAgdC55YWRldmEgPSAweDA5MmY7XG4gIHQueWFla29yZWFuID0gMHgzMTUyO1xuICB0LnlhZ3VqYXJhdGkgPSAweDBhYWY7XG4gIHQueWFndXJtdWtoaSA9IDB4MGEyZjtcbiAgdC55YWhpcmFnYW5hID0gMHgzMDg0O1xuICB0Lnlha2F0YWthbmEgPSAweDMwZTQ7XG4gIHQueWFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NDtcbiAgdC55YWtvcmVhbiA9IDB4MzE1MTtcbiAgdC55YW1ha2thbnRoYWkgPSAweDBlNGU7XG4gIHQueWFzbWFsbGhpcmFnYW5hID0gMHgzMDgzO1xuICB0Lnlhc21hbGxrYXRha2FuYSA9IDB4MzBlMztcbiAgdC55YXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmM7XG4gIHQueWF0Y3lyaWxsaWMgPSAweDA0NjM7XG4gIHQueWNpcmNsZSA9IDB4MjRlODtcbiAgdC55Y2lyY3VtZmxleCA9IDB4MDE3NztcbiAgdC55ZGllcmVzaXMgPSAweDAwZmY7XG4gIHQueWRvdGFjY2VudCA9IDB4MWU4ZjtcbiAgdC55ZG90YmVsb3cgPSAweDFlZjU7XG4gIHQueWVoYXJhYmljID0gMHgwNjRhO1xuICB0LnllaGJhcnJlZWFyYWJpYyA9IDB4MDZkMjtcbiAgdC55ZWhiYXJyZWVmaW5hbGFyYWJpYyA9IDB4ZmJhZjtcbiAgdC55ZWhmaW5hbGFyYWJpYyA9IDB4ZmVmMjtcbiAgdC55ZWhoYW16YWFib3ZlYXJhYmljID0gMHgwNjI2O1xuICB0LnllaGhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4YTtcbiAgdC55ZWhoYW16YWFib3ZlaW5pdGlhbGFyYWJpYyA9IDB4ZmU4YjtcbiAgdC55ZWhoYW16YWFib3ZlbWVkaWFsYXJhYmljID0gMHhmZThjO1xuICB0LnllaGluaXRpYWxhcmFiaWMgPSAweGZlZjM7XG4gIHQueWVobWVkaWFsYXJhYmljID0gMHhmZWY0O1xuICB0LnllaG1lZW1pbml0aWFsYXJhYmljID0gMHhmY2RkO1xuICB0LnllaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM1ODtcbiAgdC55ZWhub29uZmluYWxhcmFiaWMgPSAweGZjOTQ7XG4gIHQueWVodGhyZWVkb3RzYmVsb3dhcmFiaWMgPSAweDA2ZDE7XG4gIHQueWVrb3JlYW4gPSAweDMxNTY7XG4gIHQueWVuID0gMHgwMGE1O1xuICB0Lnllbm1vbm9zcGFjZSA9IDB4ZmZlNTtcbiAgdC55ZW9rb3JlYW4gPSAweDMxNTU7XG4gIHQueWVvcmluaGlldWhrb3JlYW4gPSAweDMxODY7XG4gIHQueWVyYWhiZW55b21vaGVicmV3ID0gMHgwNWFhO1xuICB0LnllcmFoYmVueW9tb2xlZnRoZWJyZXcgPSAweDA1YWE7XG4gIHQueWVyaWN5cmlsbGljID0gMHgwNDRiO1xuICB0LnllcnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY5O1xuICB0Lnllc2lldW5na29yZWFuID0gMHgzMTgxO1xuICB0Lnllc2lldW5ncGFuc2lvc2tvcmVhbiA9IDB4MzE4MztcbiAgdC55ZXNpZXVuZ3Npb3Nrb3JlYW4gPSAweDMxODI7XG4gIHQueWV0aXZoZWJyZXcgPSAweDA1OWE7XG4gIHQueWdyYXZlID0gMHgxZWYzO1xuICB0Lnlob29rID0gMHgwMWI0O1xuICB0Lnlob29rYWJvdmUgPSAweDFlZjc7XG4gIHQueWlhcm1lbmlhbiA9IDB4MDU3NTtcbiAgdC55aWN5cmlsbGljID0gMHgwNDU3O1xuICB0Lnlpa29yZWFuID0gMHgzMTYyO1xuICB0LnlpbnlhbmcgPSAweDI2MmY7XG4gIHQueWl3bmFybWVuaWFuID0gMHgwNTgyO1xuICB0Lnltb25vc3BhY2UgPSAweGZmNTk7XG4gIHQueW9kID0gMHgwNWQ5O1xuICB0LnlvZGRhZ2VzaCA9IDB4ZmIzOTtcbiAgdC55b2RkYWdlc2hoZWJyZXcgPSAweGZiMzk7XG4gIHQueW9kaGVicmV3ID0gMHgwNWQ5O1xuICB0LnlvZHlvZGhlYnJldyA9IDB4MDVmMjtcbiAgdC55b2R5b2RwYXRhaGhlYnJldyA9IDB4ZmIxZjtcbiAgdC55b2hpcmFnYW5hID0gMHgzMDg4O1xuICB0LnlvaWtvcmVhbiA9IDB4MzE4OTtcbiAgdC55b2thdGFrYW5hID0gMHgzMGU4O1xuICB0Lnlva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTY7XG4gIHQueW9rb3JlYW4gPSAweDMxNWI7XG4gIHQueW9zbWFsbGhpcmFnYW5hID0gMHgzMDg3O1xuICB0Lnlvc21hbGxrYXRha2FuYSA9IDB4MzBlNztcbiAgdC55b3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmU7XG4gIHQueW90Z3JlZWsgPSAweDAzZjM7XG4gIHQueW95YWVrb3JlYW4gPSAweDMxODg7XG4gIHQueW95YWtvcmVhbiA9IDB4MzE4NztcbiAgdC55b3lha3RoYWkgPSAweDBlMjI7XG4gIHQueW95aW5ndGhhaSA9IDB4MGUwZDtcbiAgdC55cGFyZW4gPSAweDI0YjQ7XG4gIHQueXBvZ2VncmFtbWVuaSA9IDB4MDM3YTtcbiAgdC55cG9nZWdyYW1tZW5pZ3JlZWtjbWIgPSAweDAzNDU7XG4gIHQueXIgPSAweDAxYTY7XG4gIHQueXJpbmcgPSAweDFlOTk7XG4gIHQueXN1cGVyaW9yID0gMHgwMmI4O1xuICB0Lnl0aWxkZSA9IDB4MWVmOTtcbiAgdC55dHVybmVkID0gMHgwMjhlO1xuICB0Lnl1aGlyYWdhbmEgPSAweDMwODY7XG4gIHQueXVpa29yZWFuID0gMHgzMThjO1xuICB0Lnl1a2F0YWthbmEgPSAweDMwZTY7XG4gIHQueXVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NTtcbiAgdC55dWtvcmVhbiA9IDB4MzE2MDtcbiAgdC55dXNiaWdjeXJpbGxpYyA9IDB4MDQ2YjtcbiAgdC55dXNiaWdpb3RpZmllZGN5cmlsbGljID0gMHgwNDZkO1xuICB0Lnl1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY3O1xuICB0Lnl1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njk7XG4gIHQueXVzbWFsbGhpcmFnYW5hID0gMHgzMDg1O1xuICB0Lnl1c21hbGxrYXRha2FuYSA9IDB4MzBlNTtcbiAgdC55dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmQ7XG4gIHQueXV5ZWtvcmVhbiA9IDB4MzE4YjtcbiAgdC55dXllb2tvcmVhbiA9IDB4MzE4YTtcbiAgdC55eWFiZW5nYWxpID0gMHgwOWRmO1xuICB0Lnl5YWRldmEgPSAweDA5NWY7XG4gIHQueiA9IDB4MDA3YTtcbiAgdC56YWFybWVuaWFuID0gMHgwNTY2O1xuICB0LnphY3V0ZSA9IDB4MDE3YTtcbiAgdC56YWRldmEgPSAweDA5NWI7XG4gIHQuemFndXJtdWtoaSA9IDB4MGE1YjtcbiAgdC56YWhhcmFiaWMgPSAweDA2Mzg7XG4gIHQuemFoZmluYWxhcmFiaWMgPSAweGZlYzY7XG4gIHQuemFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjNztcbiAgdC56YWhpcmFnYW5hID0gMHgzMDU2O1xuICB0LnphaG1lZGlhbGFyYWJpYyA9IDB4ZmVjODtcbiAgdC56YWluYXJhYmljID0gMHgwNjMyO1xuICB0LnphaW5maW5hbGFyYWJpYyA9IDB4ZmViMDtcbiAgdC56YWthdGFrYW5hID0gMHgzMGI2O1xuICB0LnphcWVmZ2Fkb2xoZWJyZXcgPSAweDA1OTU7XG4gIHQuemFxZWZxYXRhbmhlYnJldyA9IDB4MDU5NDtcbiAgdC56YXJxYWhlYnJldyA9IDB4MDU5ODtcbiAgdC56YXlpbiA9IDB4MDVkNjtcbiAgdC56YXlpbmRhZ2VzaCA9IDB4ZmIzNjtcbiAgdC56YXlpbmRhZ2VzaGhlYnJldyA9IDB4ZmIzNjtcbiAgdC56YXlpbmhlYnJldyA9IDB4MDVkNjtcbiAgdC56Ym9wb21vZm8gPSAweDMxMTc7XG4gIHQuemNhcm9uID0gMHgwMTdlO1xuICB0LnpjaXJjbGUgPSAweDI0ZTk7XG4gIHQuemNpcmN1bWZsZXggPSAweDFlOTE7XG4gIHQuemN1cmwgPSAweDAyOTE7XG4gIHQuemRvdCA9IDB4MDE3YztcbiAgdC56ZG90YWNjZW50ID0gMHgwMTdjO1xuICB0Lnpkb3RiZWxvdyA9IDB4MWU5MztcbiAgdC56ZWN5cmlsbGljID0gMHgwNDM3O1xuICB0LnplZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTk7XG4gIHQuemVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRmO1xuICB0LnplaGlyYWdhbmEgPSAweDMwNWM7XG4gIHQuemVrYXRha2FuYSA9IDB4MzBiYztcbiAgdC56ZXJvID0gMHgwMDMwO1xuICB0Lnplcm9hcmFiaWMgPSAweDA2NjA7XG4gIHQuemVyb2JlbmdhbGkgPSAweDA5ZTY7XG4gIHQuemVyb2RldmEgPSAweDA5NjY7XG4gIHQuemVyb2d1amFyYXRpID0gMHgwYWU2O1xuICB0Lnplcm9ndXJtdWtoaSA9IDB4MGE2NjtcbiAgdC56ZXJvaGFja2FyYWJpYyA9IDB4MDY2MDtcbiAgdC56ZXJvaW5mZXJpb3IgPSAweDIwODA7XG4gIHQuemVyb21vbm9zcGFjZSA9IDB4ZmYxMDtcbiAgdC56ZXJvb2xkc3R5bGUgPSAweGY3MzA7XG4gIHQuemVyb3BlcnNpYW4gPSAweDA2ZjA7XG4gIHQuemVyb3N1cGVyaW9yID0gMHgyMDcwO1xuICB0Lnplcm90aGFpID0gMHgwZTUwO1xuICB0Lnplcm93aWR0aGpvaW5lciA9IDB4ZmVmZjtcbiAgdC56ZXJvd2lkdGhub25qb2luZXIgPSAweDIwMGM7XG4gIHQuemVyb3dpZHRoc3BhY2UgPSAweDIwMGI7XG4gIHQuemV0YSA9IDB4MDNiNjtcbiAgdC56aGJvcG9tb2ZvID0gMHgzMTEzO1xuICB0LnpoZWFybWVuaWFuID0gMHgwNTZhO1xuICB0LnpoZWJyZXZlY3lyaWxsaWMgPSAweDA0YzI7XG4gIHQuemhlY3lyaWxsaWMgPSAweDA0MzY7XG4gIHQuemhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTc7XG4gIHQuemhlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZDtcbiAgdC56aWhpcmFnYW5hID0gMHgzMDU4O1xuICB0Lnppa2F0YWthbmEgPSAweDMwYjg7XG4gIHQuemlub3JoZWJyZXcgPSAweDA1YWU7XG4gIHQuemxpbmViZWxvdyA9IDB4MWU5NTtcbiAgdC56bW9ub3NwYWNlID0gMHhmZjVhO1xuICB0LnpvaGlyYWdhbmEgPSAweDMwNWU7XG4gIHQuem9rYXRha2FuYSA9IDB4MzBiZTtcbiAgdC56cGFyZW4gPSAweDI0YjU7XG4gIHQuenJldHJvZmxleGhvb2sgPSAweDAyOTA7XG4gIHQuenN0cm9rZSA9IDB4MDFiNjtcbiAgdC56dWhpcmFnYW5hID0gMHgzMDVhO1xuICB0Lnp1a2F0YWthbmEgPSAweDMwYmE7XG4gIHRbXCIubm90ZGVmXCJdID0gMHgwMDAwO1xuXG4gIC8vIFRlWC1zcGVjaWZpYyBnbHlwaCBuYW1lcy5cbiAgdC5hbmdicmFja2V0bGVmdGJpZyA9IDB4MjMyOTtcbiAgdC5hbmdicmFja2V0bGVmdEJpZyA9IDB4MjMyOTtcbiAgdC5hbmdicmFja2V0bGVmdGJpZ2cgPSAweDIzMjk7XG4gIHQuYW5nYnJhY2tldGxlZnRCaWdnID0gMHgyMzI5O1xuICB0LmFuZ2JyYWNrZXRyaWdodEJpZyA9IDB4MjMyYTtcbiAgdC5hbmdicmFja2V0cmlnaHRiaWcgPSAweDIzMmE7XG4gIHQuYW5nYnJhY2tldHJpZ2h0QmlnZyA9IDB4MjMyYTtcbiAgdC5hbmdicmFja2V0cmlnaHRiaWdnID0gMHgyMzJhO1xuICB0LmFycm93aG9va2xlZnQgPSAweDIxYWE7XG4gIHQuYXJyb3dob29rcmlnaHQgPSAweDIxYTk7XG4gIHQuYXJyb3dsZWZ0dG9waGFsZiA9IDB4MjFiYztcbiAgdC5hcnJvd2xlZnRib3RoYWxmID0gMHgyMWJkO1xuICB0LmFycm93bm9ydGhlYXN0ID0gMHgyMTk3O1xuICB0LmFycm93bm9ydGh3ZXN0ID0gMHgyMTk2O1xuICB0LmFycm93cmlnaHR0b3BoYWxmID0gMHgyMWMwO1xuICB0LmFycm93cmlnaHRib3RoYWxmID0gMHgyMWMxO1xuICB0LmFycm93c291dGhlYXN0ID0gMHgyMTk4O1xuICB0LmFycm93c291dGh3ZXN0ID0gMHgyMTk5O1xuICB0LmJhY2tzbGFzaGJpZyA9IDB4MjIxNjtcbiAgdC5iYWNrc2xhc2hCaWcgPSAweDIyMTY7XG4gIHQuYmFja3NsYXNoQmlnZyA9IDB4MjIxNjtcbiAgdC5iYWNrc2xhc2hiaWdnID0gMHgyMjE2O1xuICB0LmJhcmRibCA9IDB4MjAxNjtcbiAgdC5icmFjZWh0aXBkb3dubGVmdCA9IDB4ZmUzNztcbiAgdC5icmFjZWh0aXBkb3ducmlnaHQgPSAweGZlMzc7XG4gIHQuYnJhY2VodGlwdXBsZWZ0ID0gMHhmZTM4O1xuICB0LmJyYWNlaHRpcHVwcmlnaHQgPSAweGZlMzg7XG4gIHQuYnJhY2VsZWZ0QmlnID0gMHgwMDdiO1xuICB0LmJyYWNlbGVmdGJpZyA9IDB4MDA3YjtcbiAgdC5icmFjZWxlZnRiaWdnID0gMHgwMDdiO1xuICB0LmJyYWNlbGVmdEJpZ2cgPSAweDAwN2I7XG4gIHQuYnJhY2VyaWdodEJpZyA9IDB4MDA3ZDtcbiAgdC5icmFjZXJpZ2h0YmlnID0gMHgwMDdkO1xuICB0LmJyYWNlcmlnaHRiaWdnID0gMHgwMDdkO1xuICB0LmJyYWNlcmlnaHRCaWdnID0gMHgwMDdkO1xuICB0LmJyYWNrZXRsZWZ0YmlnID0gMHgwMDViO1xuICB0LmJyYWNrZXRsZWZ0QmlnID0gMHgwMDViO1xuICB0LmJyYWNrZXRsZWZ0YmlnZyA9IDB4MDA1YjtcbiAgdC5icmFja2V0bGVmdEJpZ2cgPSAweDAwNWI7XG4gIHQuYnJhY2tldHJpZ2h0QmlnID0gMHgwMDVkO1xuICB0LmJyYWNrZXRyaWdodGJpZyA9IDB4MDA1ZDtcbiAgdC5icmFja2V0cmlnaHRiaWdnID0gMHgwMDVkO1xuICB0LmJyYWNrZXRyaWdodEJpZ2cgPSAweDAwNWQ7XG4gIHQuY2VpbGluZ2xlZnRiaWcgPSAweDIzMDg7XG4gIHQuY2VpbGluZ2xlZnRCaWcgPSAweDIzMDg7XG4gIHQuY2VpbGluZ2xlZnRCaWdnID0gMHgyMzA4O1xuICB0LmNlaWxpbmdsZWZ0YmlnZyA9IDB4MjMwODtcbiAgdC5jZWlsaW5ncmlnaHRiaWcgPSAweDIzMDk7XG4gIHQuY2VpbGluZ3JpZ2h0QmlnID0gMHgyMzA5O1xuICB0LmNlaWxpbmdyaWdodGJpZ2cgPSAweDIzMDk7XG4gIHQuY2VpbGluZ3JpZ2h0QmlnZyA9IDB4MjMwOTtcbiAgdC5jaXJjbGVkb3RkaXNwbGF5ID0gMHgyMjk5O1xuICB0LmNpcmNsZWRvdHRleHQgPSAweDIyOTk7XG4gIHQuY2lyY2xlbXVsdGlwbHlkaXNwbGF5ID0gMHgyMjk3O1xuICB0LmNpcmNsZW11bHRpcGx5dGV4dCA9IDB4MjI5NztcbiAgdC5jaXJjbGVwbHVzZGlzcGxheSA9IDB4MjI5NTtcbiAgdC5jaXJjbGVwbHVzdGV4dCA9IDB4MjI5NTtcbiAgdC5jb250aW50ZWdyYWxkaXNwbGF5ID0gMHgyMjJlO1xuICB0LmNvbnRpbnRlZ3JhbHRleHQgPSAweDIyMmU7XG4gIHQuY29wcm9kdWN0ZGlzcGxheSA9IDB4MjIxMDtcbiAgdC5jb3Byb2R1Y3R0ZXh0ID0gMHgyMjEwO1xuICB0LmZsb29ybGVmdEJpZyA9IDB4MjMwYTtcbiAgdC5mbG9vcmxlZnRiaWcgPSAweDIzMGE7XG4gIHQuZmxvb3JsZWZ0YmlnZyA9IDB4MjMwYTtcbiAgdC5mbG9vcmxlZnRCaWdnID0gMHgyMzBhO1xuICB0LmZsb29ycmlnaHRiaWcgPSAweDIzMGI7XG4gIHQuZmxvb3JyaWdodEJpZyA9IDB4MjMwYjtcbiAgdC5mbG9vcnJpZ2h0QmlnZyA9IDB4MjMwYjtcbiAgdC5mbG9vcnJpZ2h0YmlnZyA9IDB4MjMwYjtcbiAgdC5oYXR3aWRlID0gMHgwMzAyO1xuICB0LmhhdHdpZGVyID0gMHgwMzAyO1xuICB0LmhhdHdpZGVzdCA9IDB4MDMwMjtcbiAgdC5pbnRlcmNhbCA9IDB4MWQ0MDtcbiAgdC5pbnRlZ3JhbGRpc3BsYXkgPSAweDIyMmI7XG4gIHQuaW50ZWdyYWx0ZXh0ID0gMHgyMjJiO1xuICB0LmludGVyc2VjdGlvbmRpc3BsYXkgPSAweDIyYzI7XG4gIHQuaW50ZXJzZWN0aW9udGV4dCA9IDB4MjJjMjtcbiAgdC5sb2dpY2FsYW5kZGlzcGxheSA9IDB4MjIyNztcbiAgdC5sb2dpY2FsYW5kdGV4dCA9IDB4MjIyNztcbiAgdC5sb2dpY2Fsb3JkaXNwbGF5ID0gMHgyMjI4O1xuICB0LmxvZ2ljYWxvcnRleHQgPSAweDIyMjg7XG4gIHQucGFyZW5sZWZ0QmlnID0gMHgwMDI4O1xuICB0LnBhcmVubGVmdGJpZyA9IDB4MDAyODtcbiAgdC5wYXJlbmxlZnRCaWdnID0gMHgwMDI4O1xuICB0LnBhcmVubGVmdGJpZ2cgPSAweDAwMjg7XG4gIHQucGFyZW5yaWdodEJpZyA9IDB4MDAyOTtcbiAgdC5wYXJlbnJpZ2h0YmlnID0gMHgwMDI5O1xuICB0LnBhcmVucmlnaHRCaWdnID0gMHgwMDI5O1xuICB0LnBhcmVucmlnaHRiaWdnID0gMHgwMDI5O1xuICB0LnByaW1lID0gMHgyMDMyO1xuICB0LnByb2R1Y3RkaXNwbGF5ID0gMHgyMjBmO1xuICB0LnByb2R1Y3R0ZXh0ID0gMHgyMjBmO1xuICB0LnJhZGljYWxiaWcgPSAweDIyMWE7XG4gIHQucmFkaWNhbEJpZyA9IDB4MjIxYTtcbiAgdC5yYWRpY2FsQmlnZyA9IDB4MjIxYTtcbiAgdC5yYWRpY2FsYmlnZyA9IDB4MjIxYTtcbiAgdC5yYWRpY2FsYnQgPSAweDIyMWE7XG4gIHQucmFkaWNhbHRwID0gMHgyMjFhO1xuICB0LnJhZGljYWx2ZXJ0ZXggPSAweDIyMWE7XG4gIHQuc2xhc2hiaWcgPSAweDAwMmY7XG4gIHQuc2xhc2hCaWcgPSAweDAwMmY7XG4gIHQuc2xhc2hCaWdnID0gMHgwMDJmO1xuICB0LnNsYXNoYmlnZyA9IDB4MDAyZjtcbiAgdC5zdW1tYXRpb25kaXNwbGF5ID0gMHgyMjExO1xuICB0LnN1bW1hdGlvbnRleHQgPSAweDIyMTE7XG4gIHQudGlsZGV3aWRlID0gMHgwMmRjO1xuICB0LnRpbGRld2lkZXIgPSAweDAyZGM7XG4gIHQudGlsZGV3aWRlc3QgPSAweDAyZGM7XG4gIHQudW5pb25kaXNwbGF5ID0gMHgyMmMzO1xuICB0LnVuaW9ubXVsdGlkaXNwbGF5ID0gMHgyMjhlO1xuICB0LnVuaW9ubXVsdGl0ZXh0ID0gMHgyMjhlO1xuICB0LnVuaW9uc3FkaXNwbGF5ID0gMHgyMjk0O1xuICB0LnVuaW9uc3F0ZXh0ID0gMHgyMjk0O1xuICB0LnVuaW9udGV4dCA9IDB4MjJjMztcbiAgdC52ZXh0ZW5kZG91YmxlID0gMHgyMjI1O1xuICB0LnZleHRlbmRzaW5nbGUgPSAweDIyMjM7XG59KTtcblxudmFyIGdldERpbmdiYXRzR2x5cGhzVW5pY29kZSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0LnNwYWNlID0gMHgwMDIwO1xuICB0LmExID0gMHgyNzAxO1xuICB0LmEyID0gMHgyNzAyO1xuICB0LmEyMDIgPSAweDI3MDM7XG4gIHQuYTMgPSAweDI3MDQ7XG4gIHQuYTQgPSAweDI2MGU7XG4gIHQuYTUgPSAweDI3MDY7XG4gIHQuYTExOSA9IDB4MjcwNztcbiAgdC5hMTE4ID0gMHgyNzA4O1xuICB0LmExMTcgPSAweDI3MDk7XG4gIHQuYTExID0gMHgyNjFiO1xuICB0LmExMiA9IDB4MjYxZTtcbiAgdC5hMTMgPSAweDI3MGM7XG4gIHQuYTE0ID0gMHgyNzBkO1xuICB0LmExNSA9IDB4MjcwZTtcbiAgdC5hMTYgPSAweDI3MGY7XG4gIHQuYTEwNSA9IDB4MjcxMDtcbiAgdC5hMTcgPSAweDI3MTE7XG4gIHQuYTE4ID0gMHgyNzEyO1xuICB0LmExOSA9IDB4MjcxMztcbiAgdC5hMjAgPSAweDI3MTQ7XG4gIHQuYTIxID0gMHgyNzE1O1xuICB0LmEyMiA9IDB4MjcxNjtcbiAgdC5hMjMgPSAweDI3MTc7XG4gIHQuYTI0ID0gMHgyNzE4O1xuICB0LmEyNSA9IDB4MjcxOTtcbiAgdC5hMjYgPSAweDI3MWE7XG4gIHQuYTI3ID0gMHgyNzFiO1xuICB0LmEyOCA9IDB4MjcxYztcbiAgdC5hNiA9IDB4MjcxZDtcbiAgdC5hNyA9IDB4MjcxZTtcbiAgdC5hOCA9IDB4MjcxZjtcbiAgdC5hOSA9IDB4MjcyMDtcbiAgdC5hMTAgPSAweDI3MjE7XG4gIHQuYTI5ID0gMHgyNzIyO1xuICB0LmEzMCA9IDB4MjcyMztcbiAgdC5hMzEgPSAweDI3MjQ7XG4gIHQuYTMyID0gMHgyNzI1O1xuICB0LmEzMyA9IDB4MjcyNjtcbiAgdC5hMzQgPSAweDI3Mjc7XG4gIHQuYTM1ID0gMHgyNjA1O1xuICB0LmEzNiA9IDB4MjcyOTtcbiAgdC5hMzcgPSAweDI3MmE7XG4gIHQuYTM4ID0gMHgyNzJiO1xuICB0LmEzOSA9IDB4MjcyYztcbiAgdC5hNDAgPSAweDI3MmQ7XG4gIHQuYTQxID0gMHgyNzJlO1xuICB0LmE0MiA9IDB4MjcyZjtcbiAgdC5hNDMgPSAweDI3MzA7XG4gIHQuYTQ0ID0gMHgyNzMxO1xuICB0LmE0NSA9IDB4MjczMjtcbiAgdC5hNDYgPSAweDI3MzM7XG4gIHQuYTQ3ID0gMHgyNzM0O1xuICB0LmE0OCA9IDB4MjczNTtcbiAgdC5hNDkgPSAweDI3MzY7XG4gIHQuYTUwID0gMHgyNzM3O1xuICB0LmE1MSA9IDB4MjczODtcbiAgdC5hNTIgPSAweDI3Mzk7XG4gIHQuYTUzID0gMHgyNzNhO1xuICB0LmE1NCA9IDB4MjczYjtcbiAgdC5hNTUgPSAweDI3M2M7XG4gIHQuYTU2ID0gMHgyNzNkO1xuICB0LmE1NyA9IDB4MjczZTtcbiAgdC5hNTggPSAweDI3M2Y7XG4gIHQuYTU5ID0gMHgyNzQwO1xuICB0LmE2MCA9IDB4Mjc0MTtcbiAgdC5hNjEgPSAweDI3NDI7XG4gIHQuYTYyID0gMHgyNzQzO1xuICB0LmE2MyA9IDB4Mjc0NDtcbiAgdC5hNjQgPSAweDI3NDU7XG4gIHQuYTY1ID0gMHgyNzQ2O1xuICB0LmE2NiA9IDB4Mjc0NztcbiAgdC5hNjcgPSAweDI3NDg7XG4gIHQuYTY4ID0gMHgyNzQ5O1xuICB0LmE2OSA9IDB4Mjc0YTtcbiAgdC5hNzAgPSAweDI3NGI7XG4gIHQuYTcxID0gMHgyNWNmO1xuICB0LmE3MiA9IDB4Mjc0ZDtcbiAgdC5hNzMgPSAweDI1YTA7XG4gIHQuYTc0ID0gMHgyNzRmO1xuICB0LmEyMDMgPSAweDI3NTA7XG4gIHQuYTc1ID0gMHgyNzUxO1xuICB0LmEyMDQgPSAweDI3NTI7XG4gIHQuYTc2ID0gMHgyNWIyO1xuICB0LmE3NyA9IDB4MjViYztcbiAgdC5hNzggPSAweDI1YzY7XG4gIHQuYTc5ID0gMHgyNzU2O1xuICB0LmE4MSA9IDB4MjVkNztcbiAgdC5hODIgPSAweDI3NTg7XG4gIHQuYTgzID0gMHgyNzU5O1xuICB0LmE4NCA9IDB4Mjc1YTtcbiAgdC5hOTcgPSAweDI3NWI7XG4gIHQuYTk4ID0gMHgyNzVjO1xuICB0LmE5OSA9IDB4Mjc1ZDtcbiAgdC5hMTAwID0gMHgyNzVlO1xuICB0LmExMDEgPSAweDI3NjE7XG4gIHQuYTEwMiA9IDB4Mjc2MjtcbiAgdC5hMTAzID0gMHgyNzYzO1xuICB0LmExMDQgPSAweDI3NjQ7XG4gIHQuYTEwNiA9IDB4Mjc2NTtcbiAgdC5hMTA3ID0gMHgyNzY2O1xuICB0LmExMDggPSAweDI3Njc7XG4gIHQuYTExMiA9IDB4MjY2MztcbiAgdC5hMTExID0gMHgyNjY2O1xuICB0LmExMTAgPSAweDI2NjU7XG4gIHQuYTEwOSA9IDB4MjY2MDtcbiAgdC5hMTIwID0gMHgyNDYwO1xuICB0LmExMjEgPSAweDI0NjE7XG4gIHQuYTEyMiA9IDB4MjQ2MjtcbiAgdC5hMTIzID0gMHgyNDYzO1xuICB0LmExMjQgPSAweDI0NjQ7XG4gIHQuYTEyNSA9IDB4MjQ2NTtcbiAgdC5hMTI2ID0gMHgyNDY2O1xuICB0LmExMjcgPSAweDI0Njc7XG4gIHQuYTEyOCA9IDB4MjQ2ODtcbiAgdC5hMTI5ID0gMHgyNDY5O1xuICB0LmExMzAgPSAweDI3NzY7XG4gIHQuYTEzMSA9IDB4Mjc3NztcbiAgdC5hMTMyID0gMHgyNzc4O1xuICB0LmExMzMgPSAweDI3Nzk7XG4gIHQuYTEzNCA9IDB4Mjc3YTtcbiAgdC5hMTM1ID0gMHgyNzdiO1xuICB0LmExMzYgPSAweDI3N2M7XG4gIHQuYTEzNyA9IDB4Mjc3ZDtcbiAgdC5hMTM4ID0gMHgyNzdlO1xuICB0LmExMzkgPSAweDI3N2Y7XG4gIHQuYTE0MCA9IDB4Mjc4MDtcbiAgdC5hMTQxID0gMHgyNzgxO1xuICB0LmExNDIgPSAweDI3ODI7XG4gIHQuYTE0MyA9IDB4Mjc4MztcbiAgdC5hMTQ0ID0gMHgyNzg0O1xuICB0LmExNDUgPSAweDI3ODU7XG4gIHQuYTE0NiA9IDB4Mjc4NjtcbiAgdC5hMTQ3ID0gMHgyNzg3O1xuICB0LmExNDggPSAweDI3ODg7XG4gIHQuYTE0OSA9IDB4Mjc4OTtcbiAgdC5hMTUwID0gMHgyNzhhO1xuICB0LmExNTEgPSAweDI3OGI7XG4gIHQuYTE1MiA9IDB4Mjc4YztcbiAgdC5hMTUzID0gMHgyNzhkO1xuICB0LmExNTQgPSAweDI3OGU7XG4gIHQuYTE1NSA9IDB4Mjc4ZjtcbiAgdC5hMTU2ID0gMHgyNzkwO1xuICB0LmExNTcgPSAweDI3OTE7XG4gIHQuYTE1OCA9IDB4Mjc5MjtcbiAgdC5hMTU5ID0gMHgyNzkzO1xuICB0LmExNjAgPSAweDI3OTQ7XG4gIHQuYTE2MSA9IDB4MjE5MjtcbiAgdC5hMTYzID0gMHgyMTk0O1xuICB0LmExNjQgPSAweDIxOTU7XG4gIHQuYTE5NiA9IDB4Mjc5ODtcbiAgdC5hMTY1ID0gMHgyNzk5O1xuICB0LmExOTIgPSAweDI3OWE7XG4gIHQuYTE2NiA9IDB4Mjc5YjtcbiAgdC5hMTY3ID0gMHgyNzljO1xuICB0LmExNjggPSAweDI3OWQ7XG4gIHQuYTE2OSA9IDB4Mjc5ZTtcbiAgdC5hMTcwID0gMHgyNzlmO1xuICB0LmExNzEgPSAweDI3YTA7XG4gIHQuYTE3MiA9IDB4MjdhMTtcbiAgdC5hMTczID0gMHgyN2EyO1xuICB0LmExNjIgPSAweDI3YTM7XG4gIHQuYTE3NCA9IDB4MjdhNDtcbiAgdC5hMTc1ID0gMHgyN2E1O1xuICB0LmExNzYgPSAweDI3YTY7XG4gIHQuYTE3NyA9IDB4MjdhNztcbiAgdC5hMTc4ID0gMHgyN2E4O1xuICB0LmExNzkgPSAweDI3YTk7XG4gIHQuYTE5MyA9IDB4MjdhYTtcbiAgdC5hMTgwID0gMHgyN2FiO1xuICB0LmExOTkgPSAweDI3YWM7XG4gIHQuYTE4MSA9IDB4MjdhZDtcbiAgdC5hMjAwID0gMHgyN2FlO1xuICB0LmExODIgPSAweDI3YWY7XG4gIHQuYTIwMSA9IDB4MjdiMTtcbiAgdC5hMTgzID0gMHgyN2IyO1xuICB0LmExODQgPSAweDI3YjM7XG4gIHQuYTE5NyA9IDB4MjdiNDtcbiAgdC5hMTg1ID0gMHgyN2I1O1xuICB0LmExOTQgPSAweDI3YjY7XG4gIHQuYTE5OCA9IDB4MjdiNztcbiAgdC5hMTg2ID0gMHgyN2I4O1xuICB0LmExOTUgPSAweDI3Yjk7XG4gIHQuYTE4NyA9IDB4MjdiYTtcbiAgdC5hMTg4ID0gMHgyN2JiO1xuICB0LmExODkgPSAweDI3YmM7XG4gIHQuYTE5MCA9IDB4MjdiZDtcbiAgdC5hMTkxID0gMHgyN2JlO1xuICB0LmE4OSA9IDB4Mjc2ODsgLy8gMHhGOEQ3XG4gIHQuYTkwID0gMHgyNzY5OyAvLyAweEY4RDhcbiAgdC5hOTMgPSAweDI3NmE7IC8vIDB4RjhEOVxuICB0LmE5NCA9IDB4Mjc2YjsgLy8gMHhGOERBXG4gIHQuYTkxID0gMHgyNzZjOyAvLyAweEY4REJcbiAgdC5hOTIgPSAweDI3NmQ7IC8vIDB4RjhEQ1xuICB0LmEyMDUgPSAweDI3NmU7IC8vIDB4RjhERFxuICB0LmE4NSA9IDB4Mjc2ZjsgLy8gMHhGOERFXG4gIHQuYTIwNiA9IDB4Mjc3MDsgLy8gMHhGOERGXG4gIHQuYTg2ID0gMHgyNzcxOyAvLyAweEY4RTBcbiAgdC5hODcgPSAweDI3NzI7IC8vIDB4RjhFMVxuICB0LmE4OCA9IDB4Mjc3MzsgLy8gMHhGOEUyXG4gIHQuYTk1ID0gMHgyNzc0OyAvLyAweEY4RTNcbiAgdC5hOTYgPSAweDI3NzU7IC8vIDB4RjhFNFxuICB0W1wiLm5vdGRlZlwiXSA9IDB4MDAwMDtcbn0pO1xuXG5leHBvcnRzLmdldEdseXBoc1VuaWNvZGUgPSBnZXRHbHlwaHNVbmljb2RlO1xuZXhwb3J0cy5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGUgPSBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGU7XG4iLCIvKiBDb3B5cmlnaHQgMjAxNSBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7IGdldExvb2t1cFRhYmxlRmFjdG9yeSB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuLyoqXG4gKiBIb2xkIGEgbWFwIG9mIGRlY29kZWQgZm9udHMgYW5kIG9mIHRoZSBzdGFuZGFyZCBmb3VydGVlbiBUeXBlMVxuICogZm9udHMgYW5kIHRoZWlyIGFjcm9ueW1zLlxuICovXG5jb25zdCBnZXRTdGRGb250TWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gIHQuQXJpYWxOYXJyb3cgPSBcIkhlbHZldGljYVwiO1xuICB0W1wiQXJpYWxOYXJyb3ctQm9sZFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRcIjtcbiAgdFtcIkFyaWFsTmFycm93LUJvbGRJdGFsaWNcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiQXJpYWxOYXJyb3ctSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICB0LkFyaWFsQmxhY2sgPSBcIkhlbHZldGljYVwiO1xuICB0W1wiQXJpYWxCbGFjay1Cb2xkXCJdID0gXCJIZWx2ZXRpY2EtQm9sZFwiO1xuICB0W1wiQXJpYWxCbGFjay1Cb2xkSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIjtcbiAgdFtcIkFyaWFsQmxhY2stSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICB0W1wiQXJpYWwtQmxhY2tcIl0gPSBcIkhlbHZldGljYVwiO1xuICB0W1wiQXJpYWwtQmxhY2stQm9sZFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRcIjtcbiAgdFtcIkFyaWFsLUJsYWNrLUJvbGRJdGFsaWNcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiQXJpYWwtQmxhY2stSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICB0LkFyaWFsID0gXCJIZWx2ZXRpY2FcIjtcbiAgdFtcIkFyaWFsLUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJBcmlhbC1Cb2xkSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIjtcbiAgdFtcIkFyaWFsLUl0YWxpY1wiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgdFtcIkFyaWFsLUJvbGRJdGFsaWNNVFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI7XG4gIHRbXCJBcmlhbC1Cb2xkTVRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJBcmlhbC1JdGFsaWNNVFwiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgdC5BcmlhbE1UID0gXCJIZWx2ZXRpY2FcIjtcbiAgdFtcIkNvdXJpZXItQm9sZFwiXSA9IFwiQ291cmllci1Cb2xkXCI7XG4gIHRbXCJDb3VyaWVyLUJvbGRJdGFsaWNcIl0gPSBcIkNvdXJpZXItQm9sZE9ibGlxdWVcIjtcbiAgdFtcIkNvdXJpZXItSXRhbGljXCJdID0gXCJDb3VyaWVyLU9ibGlxdWVcIjtcbiAgdC5Db3VyaWVyTmV3ID0gXCJDb3VyaWVyXCI7XG4gIHRbXCJDb3VyaWVyTmV3LUJvbGRcIl0gPSBcIkNvdXJpZXItQm9sZFwiO1xuICB0W1wiQ291cmllck5ldy1Cb2xkSXRhbGljXCJdID0gXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCI7XG4gIHRbXCJDb3VyaWVyTmV3LUl0YWxpY1wiXSA9IFwiQ291cmllci1PYmxpcXVlXCI7XG4gIHRbXCJDb3VyaWVyTmV3UFMtQm9sZEl0YWxpY01UXCJdID0gXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCI7XG4gIHRbXCJDb3VyaWVyTmV3UFMtQm9sZE1UXCJdID0gXCJDb3VyaWVyLUJvbGRcIjtcbiAgdFtcIkNvdXJpZXJOZXdQUy1JdGFsaWNNVFwiXSA9IFwiQ291cmllci1PYmxpcXVlXCI7XG4gIHQuQ291cmllck5ld1BTTVQgPSBcIkNvdXJpZXJcIjtcbiAgdC5IZWx2ZXRpY2EgPSBcIkhlbHZldGljYVwiO1xuICB0W1wiSGVsdmV0aWNhLUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJIZWx2ZXRpY2EtQm9sZEl0YWxpY1wiXSA9IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI7XG4gIHRbXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiSGVsdmV0aWNhLUl0YWxpY1wiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgdFtcIkhlbHZldGljYS1PYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICB0W1wiU3ltYm9sLUJvbGRcIl0gPSBcIlN5bWJvbFwiO1xuICB0W1wiU3ltYm9sLUJvbGRJdGFsaWNcIl0gPSBcIlN5bWJvbFwiO1xuICB0W1wiU3ltYm9sLUl0YWxpY1wiXSA9IFwiU3ltYm9sXCI7XG4gIHQuVGltZXNOZXdSb21hbiA9IFwiVGltZXMtUm9tYW5cIjtcbiAgdFtcIlRpbWVzTmV3Um9tYW4tQm9sZFwiXSA9IFwiVGltZXMtQm9sZFwiO1xuICB0W1wiVGltZXNOZXdSb21hbi1Cb2xkSXRhbGljXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuLUl0YWxpY1wiXSA9IFwiVGltZXMtSXRhbGljXCI7XG4gIHQuVGltZXNOZXdSb21hblBTID0gXCJUaW1lcy1Sb21hblwiO1xuICB0W1wiVGltZXNOZXdSb21hblBTLUJvbGRcIl0gPSBcIlRpbWVzLUJvbGRcIjtcbiAgdFtcIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpY01UXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFMtQm9sZE1UXCJdID0gXCJUaW1lcy1Cb2xkXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFMtSXRhbGljXCJdID0gXCJUaW1lcy1JdGFsaWNcIjtcbiAgdFtcIlRpbWVzTmV3Um9tYW5QUy1JdGFsaWNNVFwiXSA9IFwiVGltZXMtSXRhbGljXCI7XG4gIHQuVGltZXNOZXdSb21hblBTTVQgPSBcIlRpbWVzLVJvbWFuXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkXCJdID0gXCJUaW1lcy1Cb2xkXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkSXRhbGljXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFNNVC1JdGFsaWNcIl0gPSBcIlRpbWVzLUl0YWxpY1wiO1xufSk7XG5cbi8qKlxuICogSG9sZHMgdGhlIG1hcCBvZiB0aGUgbm9uLXN0YW5kYXJkIGZvbnRzIHRoYXQgbWlnaHQgYmUgaW5jbHVkZWQgYXNcbiAqIGEgc3RhbmRhcmQgZm9udHMgd2l0aG91dCBnbHlwaCBkYXRhLlxuICovXG5jb25zdCBnZXROb25TdGRGb250TWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gIHQuQ2FsaWJyaSA9IFwiSGVsdmV0aWNhXCI7XG4gIHRbXCJDYWxpYnJpLUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJDYWxpYnJpLUJvbGRJdGFsaWNcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiQ2FsaWJyaS1JdGFsaWNcIl0gPSBcIkhlbHZldGljYS1PYmxpcXVlXCI7XG4gIHQuQ2VudHVyeUdvdGhpYyA9IFwiSGVsdmV0aWNhXCI7XG4gIHRbXCJDZW50dXJ5R290aGljLUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJDZW50dXJ5R290aGljLUJvbGRJdGFsaWNcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiQ2VudHVyeUdvdGhpYy1JdGFsaWNcIl0gPSBcIkhlbHZldGljYS1PYmxpcXVlXCI7XG4gIHQuQ29taWNTYW5zTVMgPSBcIkNvbWljIFNhbnMgTVNcIjtcbiAgdFtcIkNvbWljU2Fuc01TLUJvbGRcIl0gPSBcIkNvbWljIFNhbnMgTVMtQm9sZFwiO1xuICB0W1wiQ29taWNTYW5zTVMtQm9sZEl0YWxpY1wiXSA9IFwiQ29taWMgU2FucyBNUy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJDb21pY1NhbnNNUy1JdGFsaWNcIl0gPSBcIkNvbWljIFNhbnMgTVMtSXRhbGljXCI7XG4gIHQuTHVjaWRhQ29uc29sZSA9IFwiQ291cmllclwiO1xuICB0W1wiTHVjaWRhQ29uc29sZS1Cb2xkXCJdID0gXCJDb3VyaWVyLUJvbGRcIjtcbiAgdFtcIkx1Y2lkYUNvbnNvbGUtQm9sZEl0YWxpY1wiXSA9IFwiQ291cmllci1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiTHVjaWRhQ29uc29sZS1JdGFsaWNcIl0gPSBcIkNvdXJpZXItT2JsaXF1ZVwiO1xuICB0W1wiTHVjaWRhU2Fucy1EZW1pXCJdID0gXCJIZWx2ZXRpY2EtQm9sZFwiO1xuICB0W1wiTVMtR290aGljXCJdID0gXCJNUyBHb3RoaWNcIjtcbiAgdFtcIk1TLUdvdGhpYy1Cb2xkXCJdID0gXCJNUyBHb3RoaWMtQm9sZFwiO1xuICB0W1wiTVMtR290aGljLUJvbGRJdGFsaWNcIl0gPSBcIk1TIEdvdGhpYy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJNUy1Hb3RoaWMtSXRhbGljXCJdID0gXCJNUyBHb3RoaWMtSXRhbGljXCI7XG4gIHRbXCJNUy1NaW5jaG9cIl0gPSBcIk1TIE1pbmNob1wiO1xuICB0W1wiTVMtTWluY2hvLUJvbGRcIl0gPSBcIk1TIE1pbmNoby1Cb2xkXCI7XG4gIHRbXCJNUy1NaW5jaG8tQm9sZEl0YWxpY1wiXSA9IFwiTVMgTWluY2hvLUJvbGRJdGFsaWNcIjtcbiAgdFtcIk1TLU1pbmNoby1JdGFsaWNcIl0gPSBcIk1TIE1pbmNoby1JdGFsaWNcIjtcbiAgdFtcIk1TLVBHb3RoaWNcIl0gPSBcIk1TIFBHb3RoaWNcIjtcbiAgdFtcIk1TLVBHb3RoaWMtQm9sZFwiXSA9IFwiTVMgUEdvdGhpYy1Cb2xkXCI7XG4gIHRbXCJNUy1QR290aGljLUJvbGRJdGFsaWNcIl0gPSBcIk1TIFBHb3RoaWMtQm9sZEl0YWxpY1wiO1xuICB0W1wiTVMtUEdvdGhpYy1JdGFsaWNcIl0gPSBcIk1TIFBHb3RoaWMtSXRhbGljXCI7XG4gIHRbXCJNUy1QTWluY2hvXCJdID0gXCJNUyBQTWluY2hvXCI7XG4gIHRbXCJNUy1QTWluY2hvLUJvbGRcIl0gPSBcIk1TIFBNaW5jaG8tQm9sZFwiO1xuICB0W1wiTVMtUE1pbmNoby1Cb2xkSXRhbGljXCJdID0gXCJNUyBQTWluY2hvLUJvbGRJdGFsaWNcIjtcbiAgdFtcIk1TLVBNaW5jaG8tSXRhbGljXCJdID0gXCJNUyBQTWluY2hvLUl0YWxpY1wiO1xuICB0Lk51cHRpYWxTY3JpcHQgPSBcIlRpbWVzLUl0YWxpY1wiO1xuICB0LlNlZ29lVUlTeW1ib2wgPSBcIkhlbHZldGljYVwiO1xuICB0LldpbmdkaW5ncyA9IFwiWmFwZkRpbmdiYXRzXCI7XG4gIHRbXCJXaW5nZGluZ3MtUmVndWxhclwiXSA9IFwiWmFwZkRpbmdiYXRzXCI7XG59KTtcblxuY29uc3QgZ2V0U2VyaWZGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0W1wiQWRvYmUgSmVuc29uXCJdID0gdHJ1ZTtcbiAgdFtcIkFkb2JlIFRleHRcIl0gPSB0cnVlO1xuICB0LkFsYmVydHVzID0gdHJ1ZTtcbiAgdC5BbGR1cyA9IHRydWU7XG4gIHQuQWxleGFuZHJpYSA9IHRydWU7XG4gIHQuQWxnZXJpYW4gPSB0cnVlO1xuICB0W1wiQW1lcmljYW4gVHlwZXdyaXRlclwiXSA9IHRydWU7XG4gIHQuQW50aXF1YSA9IHRydWU7XG4gIHQuQXBleCA9IHRydWU7XG4gIHQuQXJubyA9IHRydWU7XG4gIHQuQXN0ZXIgPSB0cnVlO1xuICB0LkF1cm9yYSA9IHRydWU7XG4gIHQuQmFza2VydmlsbGUgPSB0cnVlO1xuICB0LkJlbGwgPSB0cnVlO1xuICB0LkJlbWJvID0gdHJ1ZTtcbiAgdFtcIkJlbWJvIFNjaG9vbGJvb2tcIl0gPSB0cnVlO1xuICB0LkJlbmd1aWF0ID0gdHJ1ZTtcbiAgdFtcIkJlcmtlbGV5IE9sZCBTdHlsZVwiXSA9IHRydWU7XG4gIHRbXCJCZXJuaGFyZCBNb2Rlcm5cIl0gPSB0cnVlO1xuICB0W1wiQmVydGhvbGQgQ2l0eVwiXSA9IHRydWU7XG4gIHQuQm9kb25pID0gdHJ1ZTtcbiAgdFtcIkJhdWVyIEJvZG9uaVwiXSA9IHRydWU7XG4gIHRbXCJCb29rIEFudGlxdWFcIl0gPSB0cnVlO1xuICB0LkJvb2ttYW4gPSB0cnVlO1xuICB0W1wiQm9yZGVhdXggUm9tYW5cIl0gPSB0cnVlO1xuICB0W1wiQ2FsaWZvcm5pYW4gRkJcIl0gPSB0cnVlO1xuICB0LkNhbGlzdG8gPSB0cnVlO1xuICB0LkNhbHZlcnQgPSB0cnVlO1xuICB0LkNhcGl0YWxzID0gdHJ1ZTtcbiAgdC5DYW1icmlhID0gdHJ1ZTtcbiAgdC5DYXJ0aWVyID0gdHJ1ZTtcbiAgdC5DYXNsb24gPSB0cnVlO1xuICB0LkNhdHVsbCA9IHRydWU7XG4gIHQuQ2VudGF1ciA9IHRydWU7XG4gIHRbXCJDZW50dXJ5IE9sZCBTdHlsZVwiXSA9IHRydWU7XG4gIHRbXCJDZW50dXJ5IFNjaG9vbGJvb2tcIl0gPSB0cnVlO1xuICB0LkNoYXBhcnJhbCA9IHRydWU7XG4gIHRbXCJDaGFyaXMgU0lMXCJdID0gdHJ1ZTtcbiAgdC5DaGVsdGVuaGFtID0gdHJ1ZTtcbiAgdFtcIkNob2xsYSBTbGFiXCJdID0gdHJ1ZTtcbiAgdC5DbGFyZW5kb24gPSB0cnVlO1xuICB0LkNsZWFyZmFjZSA9IHRydWU7XG4gIHQuQ29jaGluID0gdHJ1ZTtcbiAgdC5Db2xvbm5hID0gdHJ1ZTtcbiAgdFtcIkNvbXB1dGVyIE1vZGVyblwiXSA9IHRydWU7XG4gIHRbXCJDb25jcmV0ZSBSb21hblwiXSA9IHRydWU7XG4gIHQuQ29uc3RhbnRpYSA9IHRydWU7XG4gIHRbXCJDb29wZXIgQmxhY2tcIl0gPSB0cnVlO1xuICB0LkNvcm9uYSA9IHRydWU7XG4gIHQuRWNvdHlwZSA9IHRydWU7XG4gIHQuRWd5cHRpZW5uZSA9IHRydWU7XG4gIHQuRWxlcGhhbnQgPSB0cnVlO1xuICB0LkV4Y2Vsc2lvciA9IHRydWU7XG4gIHQuRmFpcmZpZWxkID0gdHJ1ZTtcbiAgdFtcIkZGIFNjYWxhXCJdID0gdHJ1ZTtcbiAgdC5Gb2xrYXJkID0gdHJ1ZTtcbiAgdC5Gb290bGlnaHQgPSB0cnVlO1xuICB0LkZyZWVTZXJpZiA9IHRydWU7XG4gIHRbXCJGcml6IFF1YWRyYXRhXCJdID0gdHJ1ZTtcbiAgdC5HYXJhbW9uZCA9IHRydWU7XG4gIHQuR2VudGl1bSA9IHRydWU7XG4gIHQuR2VvcmdpYSA9IHRydWU7XG4gIHQuR2xvdWNlc3RlciA9IHRydWU7XG4gIHRbXCJHb3VkeSBPbGQgU3R5bGVcIl0gPSB0cnVlO1xuICB0W1wiR291ZHkgU2Nob29sYm9va1wiXSA9IHRydWU7XG4gIHRbXCJHb3VkeSBQcm8gRm9udFwiXSA9IHRydWU7XG4gIHQuR3JhbmpvbiA9IHRydWU7XG4gIHRbXCJHdWFyZGlhbiBFZ3lwdGlhblwiXSA9IHRydWU7XG4gIHQuSGVhdGhlciA9IHRydWU7XG4gIHQuSGVyY3VsZXMgPSB0cnVlO1xuICB0W1wiSGlnaCBUb3dlciBUZXh0XCJdID0gdHJ1ZTtcbiAgdC5IaXJvc2hpZ2UgPSB0cnVlO1xuICB0W1wiSG9lZmxlciBUZXh0XCJdID0gdHJ1ZTtcbiAgdFtcIkh1bWFuYSBTZXJpZlwiXSA9IHRydWU7XG4gIHQuSW1wcmludCA9IHRydWU7XG4gIHRbXCJJb25pYyBOby4gNVwiXSA9IHRydWU7XG4gIHQuSmFuc29uID0gdHJ1ZTtcbiAgdC5Kb2FubmEgPSB0cnVlO1xuICB0LktvcmlubmEgPSB0cnVlO1xuICB0LkxleGljb24gPSB0cnVlO1xuICB0W1wiTGliZXJhdGlvbiBTZXJpZlwiXSA9IHRydWU7XG4gIHRbXCJMaW51eCBMaWJlcnRpbmVcIl0gPSB0cnVlO1xuICB0LkxpdGVyYXR1cm5heWEgPSB0cnVlO1xuICB0Lkx1Y2lkYSA9IHRydWU7XG4gIHRbXCJMdWNpZGEgQnJpZ2h0XCJdID0gdHJ1ZTtcbiAgdC5NZWxpb3IgPSB0cnVlO1xuICB0Lk1lbXBoaXMgPSB0cnVlO1xuICB0Lk1pbGxlciA9IHRydWU7XG4gIHQuTWluaW9uID0gdHJ1ZTtcbiAgdC5Nb2Rlcm4gPSB0cnVlO1xuICB0W1wiTW9uYSBMaXNhXCJdID0gdHJ1ZTtcbiAgdFtcIk1ycyBFYXZlc1wiXSA9IHRydWU7XG4gIHRbXCJNUyBTZXJpZlwiXSA9IHRydWU7XG4gIHRbXCJNdXNlbyBTbGFiXCJdID0gdHJ1ZTtcbiAgdFtcIk5ldyBZb3JrXCJdID0gdHJ1ZTtcbiAgdFtcIk5pbWJ1cyBSb21hblwiXSA9IHRydWU7XG4gIHRbXCJOUFMgUmF3bGluc29uIFJvYWR3YXlcIl0gPSB0cnVlO1xuICB0Lk51cHRpYWxTY3JpcHQgPSB0cnVlO1xuICB0LlBhbGF0aW5vID0gdHJ1ZTtcbiAgdC5QZXJwZXR1YSA9IHRydWU7XG4gIHQuUGxhbnRpbiA9IHRydWU7XG4gIHRbXCJQbGFudGluIFNjaG9vbGJvb2tcIl0gPSB0cnVlO1xuICB0LlBsYXliaWxsID0gdHJ1ZTtcbiAgdFtcIlBvb3IgUmljaGFyZFwiXSA9IHRydWU7XG4gIHRbXCJSYXdsaW5zb24gUm9hZHdheVwiXSA9IHRydWU7XG4gIHQuUmVuYXVsdCA9IHRydWU7XG4gIHQuUmVxdWllbSA9IHRydWU7XG4gIHQuUm9ja3dlbGwgPSB0cnVlO1xuICB0LlJvbWFuID0gdHJ1ZTtcbiAgdFtcIlJvdGlzIFNlcmlmXCJdID0gdHJ1ZTtcbiAgdC5TYWJvbiA9IHRydWU7XG4gIHQuU2NhbGEgPSB0cnVlO1xuICB0LlNlYWd1bGwgPSB0cnVlO1xuICB0LlNpc3RpbmEgPSB0cnVlO1xuICB0LlNvdXZlbmlyID0gdHJ1ZTtcbiAgdC5TVElYID0gdHJ1ZTtcbiAgdFtcIlN0b25lIEluZm9ybWFsXCJdID0gdHJ1ZTtcbiAgdFtcIlN0b25lIFNlcmlmXCJdID0gdHJ1ZTtcbiAgdC5TeWxmYWVuID0gdHJ1ZTtcbiAgdC5UaW1lcyA9IHRydWU7XG4gIHQuVHJhamFuID0gdHJ1ZTtcbiAgdFtcIlRyaW5pdMOpXCJdID0gdHJ1ZTtcbiAgdFtcIlRydW1wIE1lZGlhZXZhbFwiXSA9IHRydWU7XG4gIHQuVXRvcGlhID0gdHJ1ZTtcbiAgdFtcIlZhbGUgVHlwZVwiXSA9IHRydWU7XG4gIHRbXCJCaXRzdHJlYW0gVmVyYVwiXSA9IHRydWU7XG4gIHRbXCJWZXJhIFNlcmlmXCJdID0gdHJ1ZTtcbiAgdC5WZXJzYWlsbGVzID0gdHJ1ZTtcbiAgdC5XYW50ZWQgPSB0cnVlO1xuICB0LldlaXNzID0gdHJ1ZTtcbiAgdFtcIldpZGUgTGF0aW5cIl0gPSB0cnVlO1xuICB0LldpbmRzb3IgPSB0cnVlO1xuICB0LlhJVFMgPSB0cnVlO1xufSk7XG5cbmNvbnN0IGdldFN5bWJvbHNGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0LkRpbmdiYXRzID0gdHJ1ZTtcbiAgdC5TeW1ib2wgPSB0cnVlO1xuICB0LlphcGZEaW5nYmF0cyA9IHRydWU7XG59KTtcblxuLy8gR2x5cGggbWFwIGZvciB3ZWxsLWtub3duIHN0YW5kYXJkIGZvbnRzLiBTb21ldGltZXMgR2hvc3RzY3JpcHQgdXNlcyBDSURcbi8vIGZvbnRzLCBidXQgZG9lcyBub3QgZW1iZWQgdGhlIENJRCB0byBHSUQgbWFwcGluZy4gVGhlIG1hcHBpbmcgaXMgaW5jb21wbGV0ZVxuLy8gZm9yIGFsbCBnbHlwaHMsIGJ1dCBjb21tb24gZm9yIHNvbWUgc2V0IG9mIHRoZSBzdGFuZGFyZCBmb250cy5cbmNvbnN0IGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0WzJdID0gMTA7XG4gIHRbM10gPSAzMjtcbiAgdFs0XSA9IDMzO1xuICB0WzVdID0gMzQ7XG4gIHRbNl0gPSAzNTtcbiAgdFs3XSA9IDM2O1xuICB0WzhdID0gMzc7XG4gIHRbOV0gPSAzODtcbiAgdFsxMF0gPSAzOTtcbiAgdFsxMV0gPSA0MDtcbiAgdFsxMl0gPSA0MTtcbiAgdFsxM10gPSA0MjtcbiAgdFsxNF0gPSA0MztcbiAgdFsxNV0gPSA0NDtcbiAgdFsxNl0gPSA0NTtcbiAgdFsxN10gPSA0NjtcbiAgdFsxOF0gPSA0NztcbiAgdFsxOV0gPSA0ODtcbiAgdFsyMF0gPSA0OTtcbiAgdFsyMV0gPSA1MDtcbiAgdFsyMl0gPSA1MTtcbiAgdFsyM10gPSA1MjtcbiAgdFsyNF0gPSA1MztcbiAgdFsyNV0gPSA1NDtcbiAgdFsyNl0gPSA1NTtcbiAgdFsyN10gPSA1NjtcbiAgdFsyOF0gPSA1NztcbiAgdFsyOV0gPSA1ODtcbiAgdFszMF0gPSA4OTQ7XG4gIHRbMzFdID0gNjA7XG4gIHRbMzJdID0gNjE7XG4gIHRbMzNdID0gNjI7XG4gIHRbMzRdID0gNjM7XG4gIHRbMzVdID0gNjQ7XG4gIHRbMzZdID0gNjU7XG4gIHRbMzddID0gNjY7XG4gIHRbMzhdID0gNjc7XG4gIHRbMzldID0gNjg7XG4gIHRbNDBdID0gNjk7XG4gIHRbNDFdID0gNzA7XG4gIHRbNDJdID0gNzE7XG4gIHRbNDNdID0gNzI7XG4gIHRbNDRdID0gNzM7XG4gIHRbNDVdID0gNzQ7XG4gIHRbNDZdID0gNzU7XG4gIHRbNDddID0gNzY7XG4gIHRbNDhdID0gNzc7XG4gIHRbNDldID0gNzg7XG4gIHRbNTBdID0gNzk7XG4gIHRbNTFdID0gODA7XG4gIHRbNTJdID0gODE7XG4gIHRbNTNdID0gODI7XG4gIHRbNTRdID0gODM7XG4gIHRbNTVdID0gODQ7XG4gIHRbNTZdID0gODU7XG4gIHRbNTddID0gODY7XG4gIHRbNThdID0gODc7XG4gIHRbNTldID0gODg7XG4gIHRbNjBdID0gODk7XG4gIHRbNjFdID0gOTA7XG4gIHRbNjJdID0gOTE7XG4gIHRbNjNdID0gOTI7XG4gIHRbNjRdID0gOTM7XG4gIHRbNjVdID0gOTQ7XG4gIHRbNjZdID0gOTU7XG4gIHRbNjddID0gOTY7XG4gIHRbNjhdID0gOTc7XG4gIHRbNjldID0gOTg7XG4gIHRbNzBdID0gOTk7XG4gIHRbNzFdID0gMTAwO1xuICB0WzcyXSA9IDEwMTtcbiAgdFs3M10gPSAxMDI7XG4gIHRbNzRdID0gMTAzO1xuICB0Wzc1XSA9IDEwNDtcbiAgdFs3Nl0gPSAxMDU7XG4gIHRbNzddID0gMTA2O1xuICB0Wzc4XSA9IDEwNztcbiAgdFs3OV0gPSAxMDg7XG4gIHRbODBdID0gMTA5O1xuICB0WzgxXSA9IDExMDtcbiAgdFs4Ml0gPSAxMTE7XG4gIHRbODNdID0gMTEyO1xuICB0Wzg0XSA9IDExMztcbiAgdFs4NV0gPSAxMTQ7XG4gIHRbODZdID0gMTE1O1xuICB0Wzg3XSA9IDExNjtcbiAgdFs4OF0gPSAxMTc7XG4gIHRbODldID0gMTE4O1xuICB0WzkwXSA9IDExOTtcbiAgdFs5MV0gPSAxMjA7XG4gIHRbOTJdID0gMTIxO1xuICB0WzkzXSA9IDEyMjtcbiAgdFs5NF0gPSAxMjM7XG4gIHRbOTVdID0gMTI0O1xuICB0Wzk2XSA9IDEyNTtcbiAgdFs5N10gPSAxMjY7XG4gIHRbOThdID0gMTk2O1xuICB0Wzk5XSA9IDE5NztcbiAgdFsxMDBdID0gMTk5O1xuICB0WzEwMV0gPSAyMDE7XG4gIHRbMTAyXSA9IDIwOTtcbiAgdFsxMDNdID0gMjE0O1xuICB0WzEwNF0gPSAyMjA7XG4gIHRbMTA1XSA9IDIyNTtcbiAgdFsxMDZdID0gMjI0O1xuICB0WzEwN10gPSAyMjY7XG4gIHRbMTA4XSA9IDIyODtcbiAgdFsxMDldID0gMjI3O1xuICB0WzExMF0gPSAyMjk7XG4gIHRbMTExXSA9IDIzMTtcbiAgdFsxMTJdID0gMjMzO1xuICB0WzExM10gPSAyMzI7XG4gIHRbMTE0XSA9IDIzNDtcbiAgdFsxMTVdID0gMjM1O1xuICB0WzExNl0gPSAyMzc7XG4gIHRbMTE3XSA9IDIzNjtcbiAgdFsxMThdID0gMjM4O1xuICB0WzExOV0gPSAyMzk7XG4gIHRbMTIwXSA9IDI0MTtcbiAgdFsxMjFdID0gMjQzO1xuICB0WzEyMl0gPSAyNDI7XG4gIHRbMTIzXSA9IDI0NDtcbiAgdFsxMjRdID0gMjQ2O1xuICB0WzEyNV0gPSAyNDU7XG4gIHRbMTI2XSA9IDI1MDtcbiAgdFsxMjddID0gMjQ5O1xuICB0WzEyOF0gPSAyNTE7XG4gIHRbMTI5XSA9IDI1MjtcbiAgdFsxMzBdID0gODIyNDtcbiAgdFsxMzFdID0gMTc2O1xuICB0WzEzMl0gPSAxNjI7XG4gIHRbMTMzXSA9IDE2MztcbiAgdFsxMzRdID0gMTY3O1xuICB0WzEzNV0gPSA4MjI2O1xuICB0WzEzNl0gPSAxODI7XG4gIHRbMTM3XSA9IDIyMztcbiAgdFsxMzhdID0gMTc0O1xuICB0WzEzOV0gPSAxNjk7XG4gIHRbMTQwXSA9IDg0ODI7XG4gIHRbMTQxXSA9IDE4MDtcbiAgdFsxNDJdID0gMTY4O1xuICB0WzE0M10gPSA4ODAwO1xuICB0WzE0NF0gPSAxOTg7XG4gIHRbMTQ1XSA9IDIxNjtcbiAgdFsxNDZdID0gODczNDtcbiAgdFsxNDddID0gMTc3O1xuICB0WzE0OF0gPSA4ODA0O1xuICB0WzE0OV0gPSA4ODA1O1xuICB0WzE1MF0gPSAxNjU7XG4gIHRbMTUxXSA9IDE4MTtcbiAgdFsxNTJdID0gODcwNjtcbiAgdFsxNTNdID0gODcyMTtcbiAgdFsxNTRdID0gODcxOTtcbiAgdFsxNTZdID0gODc0NztcbiAgdFsxNTddID0gMTcwO1xuICB0WzE1OF0gPSAxODY7XG4gIHRbMTU5XSA9IDg0ODY7XG4gIHRbMTYwXSA9IDIzMDtcbiAgdFsxNjFdID0gMjQ4O1xuICB0WzE2Ml0gPSAxOTE7XG4gIHRbMTYzXSA9IDE2MTtcbiAgdFsxNjRdID0gMTcyO1xuICB0WzE2NV0gPSA4NzMwO1xuICB0WzE2Nl0gPSA0MDI7XG4gIHRbMTY3XSA9IDg3NzY7XG4gIHRbMTY4XSA9IDg3MTA7XG4gIHRbMTY5XSA9IDE3MTtcbiAgdFsxNzBdID0gMTg3O1xuICB0WzE3MV0gPSA4MjMwO1xuICB0WzIxMF0gPSAyMTg7XG4gIHRbMjIzXSA9IDcxMTtcbiAgdFsyMjRdID0gMzIxO1xuICB0WzIyNV0gPSAzMjI7XG4gIHRbMjI3XSA9IDM1MztcbiAgdFsyMjldID0gMzgyO1xuICB0WzIzNF0gPSAyNTM7XG4gIHRbMjUyXSA9IDI2MztcbiAgdFsyNTNdID0gMjY4O1xuICB0WzI1NF0gPSAyNjk7XG4gIHRbMjU4XSA9IDI1ODtcbiAgdFsyNjBdID0gMjYwO1xuICB0WzI2MV0gPSAyNjE7XG4gIHRbMjY1XSA9IDI4MDtcbiAgdFsyNjZdID0gMjgxO1xuICB0WzI2OF0gPSAyODM7XG4gIHRbMjY5XSA9IDMxMztcbiAgdFsyNzVdID0gMzIzO1xuICB0WzI3Nl0gPSAzMjQ7XG4gIHRbMjc4XSA9IDMyODtcbiAgdFsyODRdID0gMzQ1O1xuICB0WzI4NV0gPSAzNDY7XG4gIHRbMjg2XSA9IDM0NztcbiAgdFsyOTJdID0gMzY3O1xuICB0WzI5NV0gPSAzNzc7XG4gIHRbMjk2XSA9IDM3ODtcbiAgdFsyOThdID0gMzgwO1xuICB0WzMwNV0gPSA5NjM7XG4gIHRbMzA2XSA9IDk2NDtcbiAgdFszMDddID0gOTY2O1xuICB0WzMwOF0gPSA4MjE1O1xuICB0WzMwOV0gPSA4MjUyO1xuICB0WzMxMF0gPSA4MzE5O1xuICB0WzMxMV0gPSA4MzU5O1xuICB0WzMxMl0gPSA4NTkyO1xuICB0WzMxM10gPSA4NTkzO1xuICB0WzMzN10gPSA5NTUyO1xuICB0WzQ5M10gPSAxMDM5O1xuICB0WzQ5NF0gPSAxMDQwO1xuICB0WzcwNV0gPSAxNTI0O1xuICB0WzcwNl0gPSA4MzYyO1xuICB0WzcxMF0gPSA2NDI4ODtcbiAgdFs3MTFdID0gNjQyOTg7XG4gIHRbNzU5XSA9IDE2MTc7XG4gIHRbNzYxXSA9IDE3NzY7XG4gIHRbNzYzXSA9IDE3Nzg7XG4gIHRbNzc1XSA9IDE2NTI7XG4gIHRbNzc3XSA9IDE3NjQ7XG4gIHRbNzc4XSA9IDE3ODA7XG4gIHRbNzc5XSA9IDE3ODE7XG4gIHRbNzgwXSA9IDE3ODI7XG4gIHRbNzgyXSA9IDc3MTtcbiAgdFs3ODNdID0gNjQ3MjY7XG4gIHRbNzg2XSA9IDgzNjM7XG4gIHRbNzg4XSA9IDg1MzI7XG4gIHRbNzkwXSA9IDc2ODtcbiAgdFs3OTFdID0gNzY5O1xuICB0Wzc5Ml0gPSA3Njg7XG4gIHRbNzk1XSA9IDgwMztcbiAgdFs3OTddID0gNjQzMzY7XG4gIHRbNzk4XSA9IDY0MzM3O1xuICB0Wzc5OV0gPSA2NDM0MjtcbiAgdFs4MDBdID0gNjQzNDM7XG4gIHRbODAxXSA9IDY0MzQ0O1xuICB0WzgwMl0gPSA2NDM0NTtcbiAgdFs4MDNdID0gNjQzNjI7XG4gIHRbODA0XSA9IDY0MzYzO1xuICB0WzgwNV0gPSA2NDM2NDtcbiAgdFsyNDI0XSA9IDc4MjE7XG4gIHRbMjQyNV0gPSA3ODIyO1xuICB0WzI0MjZdID0gNzgyMztcbiAgdFsyNDI3XSA9IDc4MjQ7XG4gIHRbMjQyOF0gPSA3ODI1O1xuICB0WzI0MjldID0gNzgyNjtcbiAgdFsyNDMwXSA9IDc4Mjc7XG4gIHRbMjQzM10gPSA3NjgyO1xuICB0WzI2NzhdID0gODA0NTtcbiAgdFsyNjc5XSA9IDgwNDY7XG4gIHRbMjgzMF0gPSAxNTUyO1xuICB0WzI4MzhdID0gNjg2O1xuICB0WzI4NDBdID0gNzUxO1xuICB0WzI4NDJdID0gNzUzO1xuICB0WzI4NDNdID0gNzU0O1xuICB0WzI4NDRdID0gNzU1O1xuICB0WzI4NDZdID0gNzU3O1xuICB0WzI4NTZdID0gNzY3O1xuICB0WzI4NTddID0gODQ4O1xuICB0WzI4NThdID0gODQ5O1xuICB0WzI4NjJdID0gODUzO1xuICB0WzI4NjNdID0gODU0O1xuICB0WzI4NjRdID0gODU1O1xuICB0WzI4NjVdID0gODYxO1xuICB0WzI4NjZdID0gODYyO1xuICB0WzI5MDZdID0gNzQ2MDtcbiAgdFsyOTA4XSA9IDc0NjI7XG4gIHRbMjkwOV0gPSA3NDYzO1xuICB0WzI5MTBdID0gNzQ2NDtcbiAgdFsyOTEyXSA9IDc0NjY7XG4gIHRbMjkxM10gPSA3NDY3O1xuICB0WzI5MTRdID0gNzQ2ODtcbiAgdFsyOTE2XSA9IDc0NzA7XG4gIHRbMjkxN10gPSA3NDcxO1xuICB0WzI5MThdID0gNzQ3MjtcbiAgdFsyOTIwXSA9IDc0NzQ7XG4gIHRbMjkyMV0gPSA3NDc1O1xuICB0WzI5MjJdID0gNzQ3NjtcbiAgdFsyOTI0XSA9IDc0Nzg7XG4gIHRbMjkyNV0gPSA3NDc5O1xuICB0WzI5MjZdID0gNzQ4MDtcbiAgdFsyOTI4XSA9IDc0ODI7XG4gIHRbMjkyOV0gPSA3NDgzO1xuICB0WzI5MzBdID0gNzQ4NDtcbiAgdFsyOTMyXSA9IDc0ODY7XG4gIHRbMjkzM10gPSA3NDg3O1xuICB0WzI5MzRdID0gNzQ4ODtcbiAgdFsyOTM2XSA9IDc0OTA7XG4gIHRbMjkzN10gPSA3NDkxO1xuICB0WzI5MzhdID0gNzQ5MjtcbiAgdFsyOTQwXSA9IDc0OTQ7XG4gIHRbMjk0MV0gPSA3NDk1O1xuICB0WzI5NDJdID0gNzQ5NjtcbiAgdFsyOTQ0XSA9IDc0OTg7XG4gIHRbMjk0Nl0gPSA3NTAwO1xuICB0WzI5NDhdID0gNzUwMjtcbiAgdFsyOTUwXSA9IDc1MDQ7XG4gIHRbMjk1MV0gPSA3NTA1O1xuICB0WzI5NTJdID0gNzUwNjtcbiAgdFsyOTU0XSA9IDc1MDg7XG4gIHRbMjk1NV0gPSA3NTA5O1xuICB0WzI5NTZdID0gNzUxMDtcbiAgdFsyOTU4XSA9IDc1MTI7XG4gIHRbMjk1OV0gPSA3NTEzO1xuICB0WzI5NjBdID0gNzUxNDtcbiAgdFsyOTYyXSA9IDc1MTY7XG4gIHRbMjk2M10gPSA3NTE3O1xuICB0WzI5NjRdID0gNzUxODtcbiAgdFsyOTY2XSA9IDc1MjA7XG4gIHRbMjk2N10gPSA3NTIxO1xuICB0WzI5NjhdID0gNzUyMjtcbiAgdFsyOTcwXSA9IDc1MjQ7XG4gIHRbMjk3MV0gPSA3NTI1O1xuICB0WzI5NzJdID0gNzUyNjtcbiAgdFsyOTc0XSA9IDc1Mjg7XG4gIHRbMjk3NV0gPSA3NTI5O1xuICB0WzI5NzZdID0gNzUzMDtcbiAgdFsyOTc4XSA9IDE1Mzc7XG4gIHRbMjk3OV0gPSAxNTM4O1xuICB0WzI5ODBdID0gMTUzOTtcbiAgdFsyOTgyXSA9IDE1NDk7XG4gIHRbMjk4M10gPSAxNTUxO1xuICB0WzI5ODRdID0gMTU1MjtcbiAgdFsyOTg2XSA9IDE1NTQ7XG4gIHRbMjk4N10gPSAxNTU1O1xuICB0WzI5ODhdID0gMTU1NjtcbiAgdFsyOTkwXSA9IDE2MjM7XG4gIHRbMjk5MV0gPSAxNjI0O1xuICB0WzI5OTVdID0gMTc3NTtcbiAgdFsyOTk5XSA9IDE3OTE7XG4gIHRbMzAwMl0gPSA2NDI5MDtcbiAgdFszMDAzXSA9IDY0MjkxO1xuICB0WzMwMDRdID0gNjQyOTI7XG4gIHRbMzAwNl0gPSA2NDI5NDtcbiAgdFszMDA3XSA9IDY0Mjk1O1xuICB0WzMwMDhdID0gNjQyOTY7XG4gIHRbMzAxMV0gPSAxOTAwO1xuICB0WzMwMTRdID0gODIyMztcbiAgdFszMDE1XSA9IDgyNDQ7XG4gIHRbMzAxN10gPSA3NTMyO1xuICB0WzMwMThdID0gNzUzMztcbiAgdFszMDE5XSA9IDc1MzQ7XG4gIHRbMzA3NV0gPSA3NTkwO1xuICB0WzMwNzZdID0gNzU5MTtcbiAgdFszMDc5XSA9IDc1OTQ7XG4gIHRbMzA4MF0gPSA3NTk1O1xuICB0WzMwODNdID0gNzU5ODtcbiAgdFszMDg0XSA9IDc1OTk7XG4gIHRbMzA4N10gPSA3NjAyO1xuICB0WzMwODhdID0gNzYwMztcbiAgdFszMDkxXSA9IDc2MDY7XG4gIHRbMzA5Ml0gPSA3NjA3O1xuICB0WzMwOTVdID0gNzYxMDtcbiAgdFszMDk2XSA9IDc2MTE7XG4gIHRbMzA5OV0gPSA3NjE0O1xuICB0WzMxMDBdID0gNzYxNTtcbiAgdFszMTAzXSA9IDc2MTg7XG4gIHRbMzEwNF0gPSA3NjE5O1xuICB0WzMxMDddID0gODMzNztcbiAgdFszMTA4XSA9IDgzMzg7XG4gIHRbMzExNl0gPSAxODg0O1xuICB0WzMxMTldID0gMTg4NTtcbiAgdFszMTIwXSA9IDE4ODU7XG4gIHRbMzEyM10gPSAxODg2O1xuICB0WzMxMjRdID0gMTg4NjtcbiAgdFszMTI3XSA9IDE4ODc7XG4gIHRbMzEyOF0gPSAxODg3O1xuICB0WzMxMzFdID0gMTg4ODtcbiAgdFszMTMyXSA9IDE4ODg7XG4gIHRbMzEzNV0gPSAxODg5O1xuICB0WzMxMzZdID0gMTg4OTtcbiAgdFszMTM5XSA9IDE4OTA7XG4gIHRbMzE0MF0gPSAxODkwO1xuICB0WzMxNDNdID0gMTg5MTtcbiAgdFszMTQ0XSA9IDE4OTE7XG4gIHRbMzE0N10gPSAxODkyO1xuICB0WzMxNDhdID0gMTg5MjtcbiAgdFszMTUzXSA9IDU4MDtcbiAgdFszMTU0XSA9IDU4MTtcbiAgdFszMTU3XSA9IDU4NDtcbiAgdFszMTU4XSA9IDU4NTtcbiAgdFszMTYxXSA9IDU4ODtcbiAgdFszMTYyXSA9IDU4OTtcbiAgdFszMTY1XSA9IDg5MTtcbiAgdFszMTY2XSA9IDg5MjtcbiAgdFszMTY5XSA9IDEyNzQ7XG4gIHRbMzE3MF0gPSAxMjc1O1xuICB0WzMxNzNdID0gMTI3ODtcbiAgdFszMTc0XSA9IDEyNzk7XG4gIHRbMzE4MV0gPSA3NjIyO1xuICB0WzMxODJdID0gNzYyMztcbiAgdFszMjgyXSA9IDExNzk5O1xuICB0WzMzMTZdID0gNTc4O1xuICB0WzMzNzldID0gNDI3ODU7XG4gIHRbMzM5M10gPSAxMTU5O1xuICB0WzM0MTZdID0gODM3Nztcbn0pO1xuXG4vLyBUaGUgZ2x5cGggbWFwIGZvciBBcmlhbEJsYWNrIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aGUgZ2x5cGggbWFwIHVzZWQgZm9yXG4vLyBvdGhlciB3ZWxsLWtub3duIHN0YW5kYXJkIGZvbnRzLiBIZW5jZSB3ZSB1c2UgdGhpcyAoaW5jb21wbGV0ZSkgQ0lEIHRvIEdJRFxuLy8gbWFwcGluZyB0byBhZGp1c3QgdGhlIGdseXBoIG1hcCBmb3Igbm9uLWVtYmVkZGVkIEFyaWFsQmxhY2sgZm9udHMuXG5jb25zdCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKFxuICB0XG4pIHtcbiAgdFsyMjddID0gMzIyO1xuICB0WzI2NF0gPSAyNjE7XG4gIHRbMjkxXSA9IDM0Njtcbn0pO1xuXG4vLyBUaGUgZ2x5cGggbWFwIGZvciBDYWxpYnJpIChhIFdpbmRvd3MgZm9udCkgZGlmZmVycyBmcm9tIHRoZSBnbHlwaCBtYXAgdXNlZFxuLy8gaW4gdGhlIHN0YW5kYXJkIGZvbnRzLiBIZW5jZSB3ZSB1c2UgdGhpcyAoaW5jb21wbGV0ZSkgQ0lEIHRvIEdJRCBtYXBwaW5nIHRvXG4vLyBhZGp1c3QgdGhlIGdseXBoIG1hcCBmb3Igbm9uLWVtYmVkZGVkIENhbGlicmkgZm9udHMuXG5jb25zdCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHtcbiAgdFsxXSA9IDMyO1xuICB0WzRdID0gNjU7XG4gIHRbMTddID0gNjY7XG4gIHRbMThdID0gNjc7XG4gIHRbMjRdID0gNjg7XG4gIHRbMjhdID0gNjk7XG4gIHRbMzhdID0gNzA7XG4gIHRbMzldID0gNzE7XG4gIHRbNDRdID0gNzI7XG4gIHRbNDddID0gNzM7XG4gIHRbNThdID0gNzQ7XG4gIHRbNjBdID0gNzU7XG4gIHRbNjJdID0gNzY7XG4gIHRbNjhdID0gNzc7XG4gIHRbNjldID0gNzg7XG4gIHRbNzVdID0gNzk7XG4gIHRbODddID0gODA7XG4gIHRbODldID0gODE7XG4gIHRbOTBdID0gODI7XG4gIHRbOTRdID0gODM7XG4gIHRbMTAwXSA9IDg0O1xuICB0WzEwNF0gPSA4NTtcbiAgdFsxMTVdID0gODY7XG4gIHRbMTE2XSA9IDg3O1xuICB0WzEyMV0gPSA4ODtcbiAgdFsxMjJdID0gODk7XG4gIHRbMTI3XSA9IDkwO1xuICB0WzI1OF0gPSA5NztcbiAgdFsyNjhdID0gMjYxO1xuICB0WzI3MV0gPSA5ODtcbiAgdFsyNzJdID0gOTk7XG4gIHRbMjczXSA9IDI2MztcbiAgdFsyODJdID0gMTAwO1xuICB0WzI4Nl0gPSAxMDE7XG4gIHRbMjk1XSA9IDI4MTtcbiAgdFsyOTZdID0gMTAyO1xuICB0WzMzNl0gPSAxMDM7XG4gIHRbMzQ2XSA9IDEwNDtcbiAgdFszNDldID0gMTA1O1xuICB0WzM2MV0gPSAxMDY7XG4gIHRbMzY0XSA9IDEwNztcbiAgdFszNjddID0gMTA4O1xuICB0WzM3MV0gPSAzMjI7XG4gIHRbMzczXSA9IDEwOTtcbiAgdFszNzRdID0gMTEwO1xuICB0WzM4MV0gPSAxMTE7XG4gIHRbMzgzXSA9IDI0MztcbiAgdFszOTNdID0gMTEyO1xuICB0WzM5NV0gPSAxMTM7XG4gIHRbMzk2XSA9IDExNDtcbiAgdFs0MDBdID0gMTE1O1xuICB0WzQwMV0gPSAzNDc7XG4gIHRbNDEwXSA9IDExNjtcbiAgdFs0MzddID0gMTE3O1xuICB0WzQ0OF0gPSAxMTg7XG4gIHRbNDQ5XSA9IDExOTtcbiAgdFs0NTRdID0gMTIwO1xuICB0WzQ1NV0gPSAxMjE7XG4gIHRbNDYwXSA9IDEyMjtcbiAgdFs0NjNdID0gMzgwO1xuICB0Wzg1M10gPSA0NDtcbiAgdFs4NTVdID0gNTg7XG4gIHRbODU2XSA9IDQ2O1xuICB0Wzg3Nl0gPSA0NztcbiAgdFs4NzhdID0gNDU7XG4gIHRbODgyXSA9IDQ1O1xuICB0Wzg5NF0gPSA0MDtcbiAgdFs4OTVdID0gNDE7XG4gIHRbODk2XSA9IDkxO1xuICB0Wzg5N10gPSA5MztcbiAgdFs5MjNdID0gNjQ7XG4gIHRbMTAwNF0gPSA0ODtcbiAgdFsxMDA1XSA9IDQ5O1xuICB0WzEwMDZdID0gNTA7XG4gIHRbMTAwN10gPSA1MTtcbiAgdFsxMDA4XSA9IDUyO1xuICB0WzEwMDldID0gNTM7XG4gIHRbMTAxMF0gPSA1NDtcbiAgdFsxMDExXSA9IDU1O1xuICB0WzEwMTJdID0gNTY7XG4gIHRbMTAxM10gPSA1NztcbiAgdFsxMDgxXSA9IDM3O1xuICB0WzEwODVdID0gNDM7XG4gIHRbMTA4Nl0gPSA0NTtcbn0pO1xuXG5leHBvcnQge1xuICBnZXRTdGRGb250TWFwLFxuICBnZXROb25TdGRGb250TWFwLFxuICBnZXRTZXJpZkZvbnRzLFxuICBnZXRTeW1ib2xzRm9udHMsXG4gIGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyxcbiAgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrLFxuICBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmksXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTYgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBuby1iYWJlbC1wcmVzZXQgKi9cblxudmFyIGdldExvb2t1cFRhYmxlRmFjdG9yeSA9IHJlcXVpcmUoXCIuL2NvcmVfdXRpbHMuanNcIikuZ2V0TG9va3VwVGFibGVGYWN0b3J5O1xuXG4vLyBTb21lIGNoYXJhY3RlcnMsIGUuZy4gY29weXJpZ2h0c2VyaWYsIGFyZSBtYXBwZWQgdG8gdGhlIHByaXZhdGUgdXNlIGFyZWFcbi8vIGFuZCBtaWdodCBub3QgYmUgZGlzcGxheWVkIHVzaW5nIHN0YW5kYXJkIGZvbnRzLiBNYXBwaW5nL2hhY2tpbmcgd2VsbC1rbm93blxuLy8gY2hhcnMgdG8gdGhlIHNpbWlsYXIgZXF1aXZhbGVudHMgaW4gdGhlIG5vcm1hbCBjaGFyYWN0ZXJzIHJhbmdlLlxudmFyIGdldFNwZWNpYWxQVUFTeW1ib2xzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gIHRbNjM3MjFdID0gMHgwMGE5OyAvLyBjb3B5cmlnaHRzYW5zICgweEY4RTkpID0+IGNvcHlyaWdodFxuICB0WzYzMTkzXSA9IDB4MDBhOTsgLy8gY29weXJpZ2h0c2VyaWYgKDB4RjZEOSkgPT4gY29weXJpZ2h0XG4gIHRbNjM3MjBdID0gMHgwMGFlOyAvLyByZWdpc3RlcnNhbnMgKDB4RjhFOCkgPT4gcmVnaXN0ZXJlZFxuICB0WzYzMTk0XSA9IDB4MDBhZTsgLy8gcmVnaXN0ZXJzZXJpZiAoMHhGNkRBKSA9PiByZWdpc3RlcmVkXG4gIHRbNjM3MjJdID0gMHgyMTIyOyAvLyB0cmFkZW1hcmtzYW5zICgweEY4RUEpID0+IHRyYWRlbWFya1xuICB0WzYzMTk1XSA9IDB4MjEyMjsgLy8gdHJhZGVtYXJrc2VyaWYgKDB4RjZEQikgPT4gdHJhZGVtYXJrXG4gIHRbNjM3MjldID0gMHgyM2E3OyAvLyBicmFjZWxlZnR0cCAoMHhGOEYxKVxuICB0WzYzNzMwXSA9IDB4MjNhODsgLy8gYnJhY2VsZWZ0bWlkICgweEY4RjIpXG4gIHRbNjM3MzFdID0gMHgyM2E5OyAvLyBicmFjZWxlZnRidCAoMHhGOEYzKVxuICB0WzYzNzQwXSA9IDB4MjNhYjsgLy8gYnJhY2VyaWdodHRwICgweEY4RkMpXG4gIHRbNjM3NDFdID0gMHgyM2FjOyAvLyBicmFjZXJpZ2h0bWlkICgweEY4RkQpXG4gIHRbNjM3NDJdID0gMHgyM2FkOyAvLyBicmFjZXJpZ2h0YnQgKDB4RjhGRSlcbiAgdFs2MzcyNl0gPSAweDIzYTE7IC8vIGJyYWNrZXRsZWZ0dHAgKDB4RjhFRSlcbiAgdFs2MzcyN10gPSAweDIzYTI7IC8vIGJyYWNrZXRsZWZ0ZXggKDB4RjhFRilcbiAgdFs2MzcyOF0gPSAweDIzYTM7IC8vIGJyYWNrZXRsZWZ0YnQgKDB4RjhGMClcbiAgdFs2MzczN10gPSAweDIzYTQ7IC8vIGJyYWNrZXRyaWdodHRwICgweEY4RjkpXG4gIHRbNjM3MzhdID0gMHgyM2E1OyAvLyBicmFja2V0cmlnaHRleCAoMHhGOEZBKVxuICB0WzYzNzM5XSA9IDB4MjNhNjsgLy8gYnJhY2tldHJpZ2h0YnQgKDB4RjhGQilcbiAgdFs2MzcyM10gPSAweDIzOWI7IC8vIHBhcmVubGVmdHRwICgweEY4RUIpXG4gIHRbNjM3MjRdID0gMHgyMzljOyAvLyBwYXJlbmxlZnRleCAoMHhGOEVDKVxuICB0WzYzNzI1XSA9IDB4MjM5ZDsgLy8gcGFyZW5sZWZ0YnQgKDB4RjhFRClcbiAgdFs2MzczNF0gPSAweDIzOWU7IC8vIHBhcmVucmlnaHR0cCAoMHhGOEY2KVxuICB0WzYzNzM1XSA9IDB4MjM5ZjsgLy8gcGFyZW5yaWdodGV4ICgweEY4RjcpXG4gIHRbNjM3MzZdID0gMHgyM2EwOyAvLyBwYXJlbnJpZ2h0YnQgKDB4RjhGOClcbn0pO1xuXG5mdW5jdGlvbiBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhjb2RlKSB7XG4gIGlmIChjb2RlID49IDB4ZmZmMCAmJiBjb2RlIDw9IDB4ZmZmZikge1xuICAgIC8vIFNwZWNpYWxzIHVuaWNvZGUgYmxvY2suXG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAoY29kZSA+PSAweGY2MDAgJiYgY29kZSA8PSAweGY4ZmYpIHtcbiAgICByZXR1cm4gZ2V0U3BlY2lhbFBVQVN5bWJvbHMoKVtjb2RlXSB8fCBjb2RlO1xuICB9IGVsc2UgaWYgKGNvZGUgPT09IC8qIHNvZnRoeXBoZW4gPSAqLyAweDAwYWQpIHtcbiAgICByZXR1cm4gMHgwMDJkOyAvLyBoeXBoZW5cbiAgfVxuICByZXR1cm4gY29kZTtcbn1cblxuZnVuY3Rpb24gZ2V0VW5pY29kZUZvckdseXBoKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApIHtcbiAgdmFyIHVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW25hbWVdO1xuICBpZiAodW5pY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuaWNvZGU7XG4gIH1cbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8vIFRyeSB0byByZWNvdmVyIHZhbGlkIFVuaWNvZGUgdmFsdWVzIGZyb20gJ3VuaVhYWFgnLyd1WFhYWHtYWH0nIGdseXBocy5cbiAgaWYgKG5hbWVbMF0gPT09IFwidVwiKSB7XG4gICAgdmFyIG5hbWVMZW4gPSBuYW1lLmxlbmd0aCxcbiAgICAgIGhleFN0cjtcblxuICAgIGlmIChuYW1lTGVuID09PSA3ICYmIG5hbWVbMV0gPT09IFwiblwiICYmIG5hbWVbMl0gPT09IFwiaVwiKSB7XG4gICAgICAvLyAndW5pWFhYWCdcbiAgICAgIGhleFN0ciA9IG5hbWUuc3Vic3RyaW5nKDMpO1xuICAgIH0gZWxzZSBpZiAobmFtZUxlbiA+PSA1ICYmIG5hbWVMZW4gPD0gNykge1xuICAgICAgLy8gJ3VYWFhYe1hYfSdcbiAgICAgIGhleFN0ciA9IG5hbWUuc3Vic3RyaW5nKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciB1cHBlci1jYXNlIGhleGFkZWNpbWFsIGNoYXJhY3RlcnMsIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcy5cbiAgICBpZiAoaGV4U3RyID09PSBoZXhTdHIudG9VcHBlckNhc2UoKSkge1xuICAgICAgdW5pY29kZSA9IHBhcnNlSW50KGhleFN0ciwgMTYpO1xuICAgICAgaWYgKHVuaWNvZGUgPj0gMCkge1xuICAgICAgICByZXR1cm4gdW5pY29kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG52YXIgVW5pY29kZVJhbmdlcyA9IFtcbiAgeyBiZWdpbjogMHgwMDAwLCBlbmQ6IDB4MDA3ZiB9LCAvLyBCYXNpYyBMYXRpblxuICB7IGJlZ2luOiAweDAwODAsIGVuZDogMHgwMGZmIH0sIC8vIExhdGluLTEgU3VwcGxlbWVudFxuICB7IGJlZ2luOiAweDAxMDAsIGVuZDogMHgwMTdmIH0sIC8vIExhdGluIEV4dGVuZGVkLUFcbiAgeyBiZWdpbjogMHgwMTgwLCBlbmQ6IDB4MDI0ZiB9LCAvLyBMYXRpbiBFeHRlbmRlZC1CXG4gIHsgYmVnaW46IDB4MDI1MCwgZW5kOiAweDAyYWYgfSwgLy8gSVBBIEV4dGVuc2lvbnNcbiAgeyBiZWdpbjogMHgwMmIwLCBlbmQ6IDB4MDJmZiB9LCAvLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnNcbiAgeyBiZWdpbjogMHgwMzAwLCBlbmQ6IDB4MDM2ZiB9LCAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3NcbiAgeyBiZWdpbjogMHgwMzcwLCBlbmQ6IDB4MDNmZiB9LCAvLyBHcmVlayBhbmQgQ29wdGljXG4gIHsgYmVnaW46IDB4MmM4MCwgZW5kOiAweDJjZmYgfSwgLy8gQ29wdGljXG4gIHsgYmVnaW46IDB4MDQwMCwgZW5kOiAweDA0ZmYgfSwgLy8gQ3lyaWxsaWNcbiAgeyBiZWdpbjogMHgwNTMwLCBlbmQ6IDB4MDU4ZiB9LCAvLyBBcm1lbmlhblxuICB7IGJlZ2luOiAweDA1OTAsIGVuZDogMHgwNWZmIH0sIC8vIEhlYnJld1xuICB7IGJlZ2luOiAweGE1MDAsIGVuZDogMHhhNjNmIH0sIC8vIFZhaVxuICB7IGJlZ2luOiAweDA2MDAsIGVuZDogMHgwNmZmIH0sIC8vIEFyYWJpY1xuICB7IGJlZ2luOiAweDA3YzAsIGVuZDogMHgwN2ZmIH0sIC8vIE5Lb1xuICB7IGJlZ2luOiAweDA5MDAsIGVuZDogMHgwOTdmIH0sIC8vIERldmFuYWdhcmlcbiAgeyBiZWdpbjogMHgwOTgwLCBlbmQ6IDB4MDlmZiB9LCAvLyBCZW5nYWxpXG4gIHsgYmVnaW46IDB4MGEwMCwgZW5kOiAweDBhN2YgfSwgLy8gR3VybXVraGlcbiAgeyBiZWdpbjogMHgwYTgwLCBlbmQ6IDB4MGFmZiB9LCAvLyBHdWphcmF0aVxuICB7IGJlZ2luOiAweDBiMDAsIGVuZDogMHgwYjdmIH0sIC8vIE9yaXlhXG4gIHsgYmVnaW46IDB4MGI4MCwgZW5kOiAweDBiZmYgfSwgLy8gVGFtaWxcbiAgeyBiZWdpbjogMHgwYzAwLCBlbmQ6IDB4MGM3ZiB9LCAvLyBUZWx1Z3VcbiAgeyBiZWdpbjogMHgwYzgwLCBlbmQ6IDB4MGNmZiB9LCAvLyBLYW5uYWRhXG4gIHsgYmVnaW46IDB4MGQwMCwgZW5kOiAweDBkN2YgfSwgLy8gTWFsYXlhbGFtXG4gIHsgYmVnaW46IDB4MGUwMCwgZW5kOiAweDBlN2YgfSwgLy8gVGhhaVxuICB7IGJlZ2luOiAweDBlODAsIGVuZDogMHgwZWZmIH0sIC8vIExhb1xuICB7IGJlZ2luOiAweDEwYTAsIGVuZDogMHgxMGZmIH0sIC8vIEdlb3JnaWFuXG4gIHsgYmVnaW46IDB4MWIwMCwgZW5kOiAweDFiN2YgfSwgLy8gQmFsaW5lc2VcbiAgeyBiZWdpbjogMHgxMTAwLCBlbmQ6IDB4MTFmZiB9LCAvLyBIYW5ndWwgSmFtb1xuICB7IGJlZ2luOiAweDFlMDAsIGVuZDogMHgxZWZmIH0sIC8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWxcbiAgeyBiZWdpbjogMHgxZjAwLCBlbmQ6IDB4MWZmZiB9LCAvLyBHcmVlayBFeHRlbmRlZFxuICB7IGJlZ2luOiAweDIwMDAsIGVuZDogMHgyMDZmIH0sIC8vIEdlbmVyYWwgUHVuY3R1YXRpb25cbiAgeyBiZWdpbjogMHgyMDcwLCBlbmQ6IDB4MjA5ZiB9LCAvLyBTdXBlcnNjcmlwdHMgQW5kIFN1YnNjcmlwdHNcbiAgeyBiZWdpbjogMHgyMGEwLCBlbmQ6IDB4MjBjZiB9LCAvLyBDdXJyZW5jeSBTeW1ib2xcbiAgeyBiZWdpbjogMHgyMGQwLCBlbmQ6IDB4MjBmZiB9LCAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3NcbiAgeyBiZWdpbjogMHgyMTAwLCBlbmQ6IDB4MjE0ZiB9LCAvLyBMZXR0ZXJsaWtlIFN5bWJvbHNcbiAgeyBiZWdpbjogMHgyMTUwLCBlbmQ6IDB4MjE4ZiB9LCAvLyBOdW1iZXIgRm9ybXNcbiAgeyBiZWdpbjogMHgyMTkwLCBlbmQ6IDB4MjFmZiB9LCAvLyBBcnJvd3NcbiAgeyBiZWdpbjogMHgyMjAwLCBlbmQ6IDB4MjJmZiB9LCAvLyBNYXRoZW1hdGljYWwgT3BlcmF0b3JzXG4gIHsgYmVnaW46IDB4MjMwMCwgZW5kOiAweDIzZmYgfSwgLy8gTWlzY2VsbGFuZW91cyBUZWNobmljYWxcbiAgeyBiZWdpbjogMHgyNDAwLCBlbmQ6IDB4MjQzZiB9LCAvLyBDb250cm9sIFBpY3R1cmVzXG4gIHsgYmVnaW46IDB4MjQ0MCwgZW5kOiAweDI0NWYgfSwgLy8gT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb25cbiAgeyBiZWdpbjogMHgyNDYwLCBlbmQ6IDB4MjRmZiB9LCAvLyBFbmNsb3NlZCBBbHBoYW51bWVyaWNzXG4gIHsgYmVnaW46IDB4MjUwMCwgZW5kOiAweDI1N2YgfSwgLy8gQm94IERyYXdpbmdcbiAgeyBiZWdpbjogMHgyNTgwLCBlbmQ6IDB4MjU5ZiB9LCAvLyBCbG9jayBFbGVtZW50c1xuICB7IGJlZ2luOiAweDI1YTAsIGVuZDogMHgyNWZmIH0sIC8vIEdlb21ldHJpYyBTaGFwZXNcbiAgeyBiZWdpbjogMHgyNjAwLCBlbmQ6IDB4MjZmZiB9LCAvLyBNaXNjZWxsYW5lb3VzIFN5bWJvbHNcbiAgeyBiZWdpbjogMHgyNzAwLCBlbmQ6IDB4MjdiZiB9LCAvLyBEaW5nYmF0c1xuICB7IGJlZ2luOiAweDMwMDAsIGVuZDogMHgzMDNmIH0sIC8vIENKSyBTeW1ib2xzIEFuZCBQdW5jdHVhdGlvblxuICB7IGJlZ2luOiAweDMwNDAsIGVuZDogMHgzMDlmIH0sIC8vIEhpcmFnYW5hXG4gIHsgYmVnaW46IDB4MzBhMCwgZW5kOiAweDMwZmYgfSwgLy8gS2F0YWthbmFcbiAgeyBiZWdpbjogMHgzMTAwLCBlbmQ6IDB4MzEyZiB9LCAvLyBCb3BvbW9mb1xuICB7IGJlZ2luOiAweDMxMzAsIGVuZDogMHgzMThmIH0sIC8vIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW9cbiAgeyBiZWdpbjogMHhhODQwLCBlbmQ6IDB4YTg3ZiB9LCAvLyBQaGFncy1wYVxuICB7IGJlZ2luOiAweDMyMDAsIGVuZDogMHgzMmZmIH0sIC8vIEVuY2xvc2VkIENKSyBMZXR0ZXJzIEFuZCBNb250aHNcbiAgeyBiZWdpbjogMHgzMzAwLCBlbmQ6IDB4MzNmZiB9LCAvLyBDSksgQ29tcGF0aWJpbGl0eVxuICB7IGJlZ2luOiAweGFjMDAsIGVuZDogMHhkN2FmIH0sIC8vIEhhbmd1bCBTeWxsYWJsZXNcbiAgeyBiZWdpbjogMHhkODAwLCBlbmQ6IDB4ZGZmZiB9LCAvLyBOb24tUGxhbmUgMCAqXG4gIHsgYmVnaW46IDB4MTA5MDAsIGVuZDogMHgxMDkxZiB9LCAvLyBQaG9lbmljaWFcbiAgeyBiZWdpbjogMHg0ZTAwLCBlbmQ6IDB4OWZmZiB9LCAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzXG4gIHsgYmVnaW46IDB4ZTAwMCwgZW5kOiAweGY4ZmYgfSwgLy8gUHJpdmF0ZSBVc2UgQXJlYSAocGxhbmUgMClcbiAgeyBiZWdpbjogMHgzMWMwLCBlbmQ6IDB4MzFlZiB9LCAvLyBDSksgU3Ryb2tlc1xuICB7IGJlZ2luOiAweGZiMDAsIGVuZDogMHhmYjRmIH0sIC8vIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zXG4gIHsgYmVnaW46IDB4ZmI1MCwgZW5kOiAweGZkZmYgfSwgLy8gQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BXG4gIHsgYmVnaW46IDB4ZmUyMCwgZW5kOiAweGZlMmYgfSwgLy8gQ29tYmluaW5nIEhhbGYgTWFya3NcbiAgeyBiZWdpbjogMHhmZTEwLCBlbmQ6IDB4ZmUxZiB9LCAvLyBWZXJ0aWNhbCBGb3Jtc1xuICB7IGJlZ2luOiAweGZlNTAsIGVuZDogMHhmZTZmIH0sIC8vIFNtYWxsIEZvcm0gVmFyaWFudHNcbiAgeyBiZWdpbjogMHhmZTcwLCBlbmQ6IDB4ZmVmZiB9LCAvLyBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUJcbiAgeyBiZWdpbjogMHhmZjAwLCBlbmQ6IDB4ZmZlZiB9LCAvLyBIYWxmd2lkdGggQW5kIEZ1bGx3aWR0aCBGb3Jtc1xuICB7IGJlZ2luOiAweGZmZjAsIGVuZDogMHhmZmZmIH0sIC8vIFNwZWNpYWxzXG4gIHsgYmVnaW46IDB4MGYwMCwgZW5kOiAweDBmZmYgfSwgLy8gVGliZXRhblxuICB7IGJlZ2luOiAweDA3MDAsIGVuZDogMHgwNzRmIH0sIC8vIFN5cmlhY1xuICB7IGJlZ2luOiAweDA3ODAsIGVuZDogMHgwN2JmIH0sIC8vIFRoYWFuYVxuICB7IGJlZ2luOiAweDBkODAsIGVuZDogMHgwZGZmIH0sIC8vIFNpbmhhbGFcbiAgeyBiZWdpbjogMHgxMDAwLCBlbmQ6IDB4MTA5ZiB9LCAvLyBNeWFubWFyXG4gIHsgYmVnaW46IDB4MTIwMCwgZW5kOiAweDEzN2YgfSwgLy8gRXRoaW9waWNcbiAgeyBiZWdpbjogMHgxM2EwLCBlbmQ6IDB4MTNmZiB9LCAvLyBDaGVyb2tlZVxuICB7IGJlZ2luOiAweDE0MDAsIGVuZDogMHgxNjdmIH0sIC8vIFVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3NcbiAgeyBiZWdpbjogMHgxNjgwLCBlbmQ6IDB4MTY5ZiB9LCAvLyBPZ2hhbVxuICB7IGJlZ2luOiAweDE2YTAsIGVuZDogMHgxNmZmIH0sIC8vIFJ1bmljXG4gIHsgYmVnaW46IDB4MTc4MCwgZW5kOiAweDE3ZmYgfSwgLy8gS2htZXJcbiAgeyBiZWdpbjogMHgxODAwLCBlbmQ6IDB4MThhZiB9LCAvLyBNb25nb2xpYW5cbiAgeyBiZWdpbjogMHgyODAwLCBlbmQ6IDB4MjhmZiB9LCAvLyBCcmFpbGxlIFBhdHRlcm5zXG4gIHsgYmVnaW46IDB4YTAwMCwgZW5kOiAweGE0OGYgfSwgLy8gWWkgU3lsbGFibGVzXG4gIHsgYmVnaW46IDB4MTcwMCwgZW5kOiAweDE3MWYgfSwgLy8gVGFnYWxvZ1xuICB7IGJlZ2luOiAweDEwMzAwLCBlbmQ6IDB4MTAzMmYgfSwgLy8gT2xkIEl0YWxpY1xuICB7IGJlZ2luOiAweDEwMzMwLCBlbmQ6IDB4MTAzNGYgfSwgLy8gR290aGljXG4gIHsgYmVnaW46IDB4MTA0MDAsIGVuZDogMHgxMDQ0ZiB9LCAvLyBEZXNlcmV0XG4gIHsgYmVnaW46IDB4MWQwMDAsIGVuZDogMHgxZDBmZiB9LCAvLyBCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzXG4gIHsgYmVnaW46IDB4MWQ0MDAsIGVuZDogMHgxZDdmZiB9LCAvLyBNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHNcbiAgeyBiZWdpbjogMHhmZjAwMCwgZW5kOiAweGZmZmZkIH0sIC8vIFByaXZhdGUgVXNlIChwbGFuZSAxNSlcbiAgeyBiZWdpbjogMHhmZTAwLCBlbmQ6IDB4ZmUwZiB9LCAvLyBWYXJpYXRpb24gU2VsZWN0b3JzXG4gIHsgYmVnaW46IDB4ZTAwMDAsIGVuZDogMHhlMDA3ZiB9LCAvLyBUYWdzXG4gIHsgYmVnaW46IDB4MTkwMCwgZW5kOiAweDE5NGYgfSwgLy8gTGltYnVcbiAgeyBiZWdpbjogMHgxOTUwLCBlbmQ6IDB4MTk3ZiB9LCAvLyBUYWkgTGVcbiAgeyBiZWdpbjogMHgxOTgwLCBlbmQ6IDB4MTlkZiB9LCAvLyBOZXcgVGFpIEx1ZVxuICB7IGJlZ2luOiAweDFhMDAsIGVuZDogMHgxYTFmIH0sIC8vIEJ1Z2luZXNlXG4gIHsgYmVnaW46IDB4MmMwMCwgZW5kOiAweDJjNWYgfSwgLy8gR2xhZ29saXRpY1xuICB7IGJlZ2luOiAweDJkMzAsIGVuZDogMHgyZDdmIH0sIC8vIFRpZmluYWdoXG4gIHsgYmVnaW46IDB4NGRjMCwgZW5kOiAweDRkZmYgfSwgLy8gWWlqaW5nIEhleGFncmFtIFN5bWJvbHNcbiAgeyBiZWdpbjogMHhhODAwLCBlbmQ6IDB4YTgyZiB9LCAvLyBTeWxvdGkgTmFncmlcbiAgeyBiZWdpbjogMHgxMDAwMCwgZW5kOiAweDEwMDdmIH0sIC8vIExpbmVhciBCIFN5bGxhYmFyeVxuICB7IGJlZ2luOiAweDEwMTQwLCBlbmQ6IDB4MTAxOGYgfSwgLy8gQW5jaWVudCBHcmVlayBOdW1iZXJzXG4gIHsgYmVnaW46IDB4MTAzODAsIGVuZDogMHgxMDM5ZiB9LCAvLyBVZ2FyaXRpY1xuICB7IGJlZ2luOiAweDEwM2EwLCBlbmQ6IDB4MTAzZGYgfSwgLy8gT2xkIFBlcnNpYW5cbiAgeyBiZWdpbjogMHgxMDQ1MCwgZW5kOiAweDEwNDdmIH0sIC8vIFNoYXZpYW5cbiAgeyBiZWdpbjogMHgxMDQ4MCwgZW5kOiAweDEwNGFmIH0sIC8vIE9zbWFueWFcbiAgeyBiZWdpbjogMHgxMDgwMCwgZW5kOiAweDEwODNmIH0sIC8vIEN5cHJpb3QgU3lsbGFiYXJ5XG4gIHsgYmVnaW46IDB4MTBhMDAsIGVuZDogMHgxMGE1ZiB9LCAvLyBLaGFyb3NodGhpXG4gIHsgYmVnaW46IDB4MWQzMDAsIGVuZDogMHgxZDM1ZiB9LCAvLyBUYWkgWHVhbiBKaW5nIFN5bWJvbHNcbiAgeyBiZWdpbjogMHgxMjAwMCwgZW5kOiAweDEyM2ZmIH0sIC8vIEN1bmVpZm9ybVxuICB7IGJlZ2luOiAweDFkMzYwLCBlbmQ6IDB4MWQzN2YgfSwgLy8gQ291bnRpbmcgUm9kIE51bWVyYWxzXG4gIHsgYmVnaW46IDB4MWI4MCwgZW5kOiAweDFiYmYgfSwgLy8gU3VuZGFuZXNlXG4gIHsgYmVnaW46IDB4MWMwMCwgZW5kOiAweDFjNGYgfSwgLy8gTGVwY2hhXG4gIHsgYmVnaW46IDB4MWM1MCwgZW5kOiAweDFjN2YgfSwgLy8gT2wgQ2hpa2lcbiAgeyBiZWdpbjogMHhhODgwLCBlbmQ6IDB4YThkZiB9LCAvLyBTYXVyYXNodHJhXG4gIHsgYmVnaW46IDB4YTkwMCwgZW5kOiAweGE5MmYgfSwgLy8gS2F5YWggTGlcbiAgeyBiZWdpbjogMHhhOTMwLCBlbmQ6IDB4YTk1ZiB9LCAvLyBSZWphbmdcbiAgeyBiZWdpbjogMHhhYTAwLCBlbmQ6IDB4YWE1ZiB9LCAvLyBDaGFtXG4gIHsgYmVnaW46IDB4MTAxOTAsIGVuZDogMHgxMDFjZiB9LCAvLyBBbmNpZW50IFN5bWJvbHNcbiAgeyBiZWdpbjogMHgxMDFkMCwgZW5kOiAweDEwMWZmIH0sIC8vIFBoYWlzdG9zIERpc2NcbiAgeyBiZWdpbjogMHgxMDJhMCwgZW5kOiAweDEwMmRmIH0sIC8vIENhcmlhblxuICB7IGJlZ2luOiAweDFmMDMwLCBlbmQ6IDB4MWYwOWYgfSwgLy8gRG9taW5vIFRpbGVzXG5dO1xuXG5mdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodmFsdWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGlpID0gVW5pY29kZVJhbmdlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgdmFyIHJhbmdlID0gVW5pY29kZVJhbmdlc1tpXTtcbiAgICBpZiAodmFsdWUgPj0gcmFuZ2UuYmVnaW4gJiYgdmFsdWUgPCByYW5nZS5lbmQpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzUlRMUmFuZ2VGb3IodmFsdWUpIHtcbiAgdmFyIHJhbmdlID0gVW5pY29kZVJhbmdlc1sxM107XG4gIGlmICh2YWx1ZSA+PSByYW5nZS5iZWdpbiAmJiB2YWx1ZSA8IHJhbmdlLmVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJhbmdlID0gVW5pY29kZVJhbmdlc1sxMV07XG4gIGlmICh2YWx1ZSA+PSByYW5nZS5iZWdpbiAmJiB2YWx1ZSA8IHJhbmdlLmVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gVGhlIG5vcm1hbGl6YXRpb24gdGFibGUgaXMgb2J0YWluZWQgYnkgZmlsdGVyaW5nIHRoZSBVbmljb2RlIGNoYXJhY3RlcnNcbi8vIGRhdGFiYXNlIHdpdGggPGNvbXBhdD4gZW50cmllcy5cbnZhciBnZXROb3JtYWxpemVkVW5pY29kZXMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHtcbiAgdFtcIlxcdTAwQThcIl0gPSBcIlxcdTAwMjBcXHUwMzA4XCI7XG4gIHRbXCJcXHUwMEFGXCJdID0gXCJcXHUwMDIwXFx1MDMwNFwiO1xuICB0W1wiXFx1MDBCNFwiXSA9IFwiXFx1MDAyMFxcdTAzMDFcIjtcbiAgdFtcIlxcdTAwQjVcIl0gPSBcIlxcdTAzQkNcIjtcbiAgdFtcIlxcdTAwQjhcIl0gPSBcIlxcdTAwMjBcXHUwMzI3XCI7XG4gIHRbXCJcXHUwMTMyXCJdID0gXCJcXHUwMDQ5XFx1MDA0QVwiO1xuICB0W1wiXFx1MDEzM1wiXSA9IFwiXFx1MDA2OVxcdTAwNkFcIjtcbiAgdFtcIlxcdTAxM0ZcIl0gPSBcIlxcdTAwNENcXHUwMEI3XCI7XG4gIHRbXCJcXHUwMTQwXCJdID0gXCJcXHUwMDZDXFx1MDBCN1wiO1xuICB0W1wiXFx1MDE0OVwiXSA9IFwiXFx1MDJCQ1xcdTAwNkVcIjtcbiAgdFtcIlxcdTAxN0ZcIl0gPSBcIlxcdTAwNzNcIjtcbiAgdFtcIlxcdTAxQzRcIl0gPSBcIlxcdTAwNDRcXHUwMTdEXCI7XG4gIHRbXCJcXHUwMUM1XCJdID0gXCJcXHUwMDQ0XFx1MDE3RVwiO1xuICB0W1wiXFx1MDFDNlwiXSA9IFwiXFx1MDA2NFxcdTAxN0VcIjtcbiAgdFtcIlxcdTAxQzdcIl0gPSBcIlxcdTAwNENcXHUwMDRBXCI7XG4gIHRbXCJcXHUwMUM4XCJdID0gXCJcXHUwMDRDXFx1MDA2QVwiO1xuICB0W1wiXFx1MDFDOVwiXSA9IFwiXFx1MDA2Q1xcdTAwNkFcIjtcbiAgdFtcIlxcdTAxQ0FcIl0gPSBcIlxcdTAwNEVcXHUwMDRBXCI7XG4gIHRbXCJcXHUwMUNCXCJdID0gXCJcXHUwMDRFXFx1MDA2QVwiO1xuICB0W1wiXFx1MDFDQ1wiXSA9IFwiXFx1MDA2RVxcdTAwNkFcIjtcbiAgdFtcIlxcdTAxRjFcIl0gPSBcIlxcdTAwNDRcXHUwMDVBXCI7XG4gIHRbXCJcXHUwMUYyXCJdID0gXCJcXHUwMDQ0XFx1MDA3QVwiO1xuICB0W1wiXFx1MDFGM1wiXSA9IFwiXFx1MDA2NFxcdTAwN0FcIjtcbiAgdFtcIlxcdTAyRDhcIl0gPSBcIlxcdTAwMjBcXHUwMzA2XCI7XG4gIHRbXCJcXHUwMkQ5XCJdID0gXCJcXHUwMDIwXFx1MDMwN1wiO1xuICB0W1wiXFx1MDJEQVwiXSA9IFwiXFx1MDAyMFxcdTAzMEFcIjtcbiAgdFtcIlxcdTAyREJcIl0gPSBcIlxcdTAwMjBcXHUwMzI4XCI7XG4gIHRbXCJcXHUwMkRDXCJdID0gXCJcXHUwMDIwXFx1MDMwM1wiO1xuICB0W1wiXFx1MDJERFwiXSA9IFwiXFx1MDAyMFxcdTAzMEJcIjtcbiAgdFtcIlxcdTAzN0FcIl0gPSBcIlxcdTAwMjBcXHUwMzQ1XCI7XG4gIHRbXCJcXHUwMzg0XCJdID0gXCJcXHUwMDIwXFx1MDMwMVwiO1xuICB0W1wiXFx1MDNEMFwiXSA9IFwiXFx1MDNCMlwiO1xuICB0W1wiXFx1MDNEMVwiXSA9IFwiXFx1MDNCOFwiO1xuICB0W1wiXFx1MDNEMlwiXSA9IFwiXFx1MDNBNVwiO1xuICB0W1wiXFx1MDNENVwiXSA9IFwiXFx1MDNDNlwiO1xuICB0W1wiXFx1MDNENlwiXSA9IFwiXFx1MDNDMFwiO1xuICB0W1wiXFx1MDNGMFwiXSA9IFwiXFx1MDNCQVwiO1xuICB0W1wiXFx1MDNGMVwiXSA9IFwiXFx1MDNDMVwiO1xuICB0W1wiXFx1MDNGMlwiXSA9IFwiXFx1MDNDMlwiO1xuICB0W1wiXFx1MDNGNFwiXSA9IFwiXFx1MDM5OFwiO1xuICB0W1wiXFx1MDNGNVwiXSA9IFwiXFx1MDNCNVwiO1xuICB0W1wiXFx1MDNGOVwiXSA9IFwiXFx1MDNBM1wiO1xuICB0W1wiXFx1MDU4N1wiXSA9IFwiXFx1MDU2NVxcdTA1ODJcIjtcbiAgdFtcIlxcdTA2NzVcIl0gPSBcIlxcdTA2MjdcXHUwNjc0XCI7XG4gIHRbXCJcXHUwNjc2XCJdID0gXCJcXHUwNjQ4XFx1MDY3NFwiO1xuICB0W1wiXFx1MDY3N1wiXSA9IFwiXFx1MDZDN1xcdTA2NzRcIjtcbiAgdFtcIlxcdTA2NzhcIl0gPSBcIlxcdTA2NEFcXHUwNjc0XCI7XG4gIHRbXCJcXHUwRTMzXCJdID0gXCJcXHUwRTREXFx1MEUzMlwiO1xuICB0W1wiXFx1MEVCM1wiXSA9IFwiXFx1MEVDRFxcdTBFQjJcIjtcbiAgdFtcIlxcdTBFRENcIl0gPSBcIlxcdTBFQUJcXHUwRTk5XCI7XG4gIHRbXCJcXHUwRUREXCJdID0gXCJcXHUwRUFCXFx1MEVBMVwiO1xuICB0W1wiXFx1MEY3N1wiXSA9IFwiXFx1MEZCMlxcdTBGODFcIjtcbiAgdFtcIlxcdTBGNzlcIl0gPSBcIlxcdTBGQjNcXHUwRjgxXCI7XG4gIHRbXCJcXHUxRTlBXCJdID0gXCJcXHUwMDYxXFx1MDJCRVwiO1xuICB0W1wiXFx1MUZCRFwiXSA9IFwiXFx1MDAyMFxcdTAzMTNcIjtcbiAgdFtcIlxcdTFGQkZcIl0gPSBcIlxcdTAwMjBcXHUwMzEzXCI7XG4gIHRbXCJcXHUxRkMwXCJdID0gXCJcXHUwMDIwXFx1MDM0MlwiO1xuICB0W1wiXFx1MUZGRVwiXSA9IFwiXFx1MDAyMFxcdTAzMTRcIjtcbiAgdFtcIlxcdTIwMDJcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDNcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDRcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDVcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDZcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDhcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDlcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMEFcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMTdcIl0gPSBcIlxcdTAwMjBcXHUwMzMzXCI7XG4gIHRbXCJcXHUyMDI0XCJdID0gXCJcXHUwMDJFXCI7XG4gIHRbXCJcXHUyMDI1XCJdID0gXCJcXHUwMDJFXFx1MDAyRVwiO1xuICB0W1wiXFx1MjAyNlwiXSA9IFwiXFx1MDAyRVxcdTAwMkVcXHUwMDJFXCI7XG4gIHRbXCJcXHUyMDMzXCJdID0gXCJcXHUyMDMyXFx1MjAzMlwiO1xuICB0W1wiXFx1MjAzNFwiXSA9IFwiXFx1MjAzMlxcdTIwMzJcXHUyMDMyXCI7XG4gIHRbXCJcXHUyMDM2XCJdID0gXCJcXHUyMDM1XFx1MjAzNVwiO1xuICB0W1wiXFx1MjAzN1wiXSA9IFwiXFx1MjAzNVxcdTIwMzVcXHUyMDM1XCI7XG4gIHRbXCJcXHUyMDNDXCJdID0gXCJcXHUwMDIxXFx1MDAyMVwiO1xuICB0W1wiXFx1MjAzRVwiXSA9IFwiXFx1MDAyMFxcdTAzMDVcIjtcbiAgdFtcIlxcdTIwNDdcIl0gPSBcIlxcdTAwM0ZcXHUwMDNGXCI7XG4gIHRbXCJcXHUyMDQ4XCJdID0gXCJcXHUwMDNGXFx1MDAyMVwiO1xuICB0W1wiXFx1MjA0OVwiXSA9IFwiXFx1MDAyMVxcdTAwM0ZcIjtcbiAgdFtcIlxcdTIwNTdcIl0gPSBcIlxcdTIwMzJcXHUyMDMyXFx1MjAzMlxcdTIwMzJcIjtcbiAgdFtcIlxcdTIwNUZcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwQThcIl0gPSBcIlxcdTAwNTJcXHUwMDczXCI7XG4gIHRbXCJcXHUyMTAwXCJdID0gXCJcXHUwMDYxXFx1MDAyRlxcdTAwNjNcIjtcbiAgdFtcIlxcdTIxMDFcIl0gPSBcIlxcdTAwNjFcXHUwMDJGXFx1MDA3M1wiO1xuICB0W1wiXFx1MjEwM1wiXSA9IFwiXFx1MDBCMFxcdTAwNDNcIjtcbiAgdFtcIlxcdTIxMDVcIl0gPSBcIlxcdTAwNjNcXHUwMDJGXFx1MDA2RlwiO1xuICB0W1wiXFx1MjEwNlwiXSA9IFwiXFx1MDA2M1xcdTAwMkZcXHUwMDc1XCI7XG4gIHRbXCJcXHUyMTA3XCJdID0gXCJcXHUwMTkwXCI7XG4gIHRbXCJcXHUyMTA5XCJdID0gXCJcXHUwMEIwXFx1MDA0NlwiO1xuICB0W1wiXFx1MjExNlwiXSA9IFwiXFx1MDA0RVxcdTAwNkZcIjtcbiAgdFtcIlxcdTIxMjFcIl0gPSBcIlxcdTAwNTRcXHUwMDQ1XFx1MDA0Q1wiO1xuICB0W1wiXFx1MjEzNVwiXSA9IFwiXFx1MDVEMFwiO1xuICB0W1wiXFx1MjEzNlwiXSA9IFwiXFx1MDVEMVwiO1xuICB0W1wiXFx1MjEzN1wiXSA9IFwiXFx1MDVEMlwiO1xuICB0W1wiXFx1MjEzOFwiXSA9IFwiXFx1MDVEM1wiO1xuICB0W1wiXFx1MjEzQlwiXSA9IFwiXFx1MDA0NlxcdTAwNDFcXHUwMDU4XCI7XG4gIHRbXCJcXHUyMTYwXCJdID0gXCJcXHUwMDQ5XCI7XG4gIHRbXCJcXHUyMTYxXCJdID0gXCJcXHUwMDQ5XFx1MDA0OVwiO1xuICB0W1wiXFx1MjE2MlwiXSA9IFwiXFx1MDA0OVxcdTAwNDlcXHUwMDQ5XCI7XG4gIHRbXCJcXHUyMTYzXCJdID0gXCJcXHUwMDQ5XFx1MDA1NlwiO1xuICB0W1wiXFx1MjE2NFwiXSA9IFwiXFx1MDA1NlwiO1xuICB0W1wiXFx1MjE2NVwiXSA9IFwiXFx1MDA1NlxcdTAwNDlcIjtcbiAgdFtcIlxcdTIxNjZcIl0gPSBcIlxcdTAwNTZcXHUwMDQ5XFx1MDA0OVwiO1xuICB0W1wiXFx1MjE2N1wiXSA9IFwiXFx1MDA1NlxcdTAwNDlcXHUwMDQ5XFx1MDA0OVwiO1xuICB0W1wiXFx1MjE2OFwiXSA9IFwiXFx1MDA0OVxcdTAwNThcIjtcbiAgdFtcIlxcdTIxNjlcIl0gPSBcIlxcdTAwNThcIjtcbiAgdFtcIlxcdTIxNkFcIl0gPSBcIlxcdTAwNThcXHUwMDQ5XCI7XG4gIHRbXCJcXHUyMTZCXCJdID0gXCJcXHUwMDU4XFx1MDA0OVxcdTAwNDlcIjtcbiAgdFtcIlxcdTIxNkNcIl0gPSBcIlxcdTAwNENcIjtcbiAgdFtcIlxcdTIxNkRcIl0gPSBcIlxcdTAwNDNcIjtcbiAgdFtcIlxcdTIxNkVcIl0gPSBcIlxcdTAwNDRcIjtcbiAgdFtcIlxcdTIxNkZcIl0gPSBcIlxcdTAwNERcIjtcbiAgdFtcIlxcdTIxNzBcIl0gPSBcIlxcdTAwNjlcIjtcbiAgdFtcIlxcdTIxNzFcIl0gPSBcIlxcdTAwNjlcXHUwMDY5XCI7XG4gIHRbXCJcXHUyMTcyXCJdID0gXCJcXHUwMDY5XFx1MDA2OVxcdTAwNjlcIjtcbiAgdFtcIlxcdTIxNzNcIl0gPSBcIlxcdTAwNjlcXHUwMDc2XCI7XG4gIHRbXCJcXHUyMTc0XCJdID0gXCJcXHUwMDc2XCI7XG4gIHRbXCJcXHUyMTc1XCJdID0gXCJcXHUwMDc2XFx1MDA2OVwiO1xuICB0W1wiXFx1MjE3NlwiXSA9IFwiXFx1MDA3NlxcdTAwNjlcXHUwMDY5XCI7XG4gIHRbXCJcXHUyMTc3XCJdID0gXCJcXHUwMDc2XFx1MDA2OVxcdTAwNjlcXHUwMDY5XCI7XG4gIHRbXCJcXHUyMTc4XCJdID0gXCJcXHUwMDY5XFx1MDA3OFwiO1xuICB0W1wiXFx1MjE3OVwiXSA9IFwiXFx1MDA3OFwiO1xuICB0W1wiXFx1MjE3QVwiXSA9IFwiXFx1MDA3OFxcdTAwNjlcIjtcbiAgdFtcIlxcdTIxN0JcIl0gPSBcIlxcdTAwNzhcXHUwMDY5XFx1MDA2OVwiO1xuICB0W1wiXFx1MjE3Q1wiXSA9IFwiXFx1MDA2Q1wiO1xuICB0W1wiXFx1MjE3RFwiXSA9IFwiXFx1MDA2M1wiO1xuICB0W1wiXFx1MjE3RVwiXSA9IFwiXFx1MDA2NFwiO1xuICB0W1wiXFx1MjE3RlwiXSA9IFwiXFx1MDA2RFwiO1xuICB0W1wiXFx1MjIyQ1wiXSA9IFwiXFx1MjIyQlxcdTIyMkJcIjtcbiAgdFtcIlxcdTIyMkRcIl0gPSBcIlxcdTIyMkJcXHUyMjJCXFx1MjIyQlwiO1xuICB0W1wiXFx1MjIyRlwiXSA9IFwiXFx1MjIyRVxcdTIyMkVcIjtcbiAgdFtcIlxcdTIyMzBcIl0gPSBcIlxcdTIyMkVcXHUyMjJFXFx1MjIyRVwiO1xuICB0W1wiXFx1MjQ3NFwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNDc1XCJdID0gXCJcXHUwMDI4XFx1MDAzMlxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0NzZcIl0gPSBcIlxcdTAwMjhcXHUwMDMzXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3N1wiXSA9IFwiXFx1MDAyOFxcdTAwMzRcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNDc4XCJdID0gXCJcXHUwMDI4XFx1MDAzNVxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0NzlcIl0gPSBcIlxcdTAwMjhcXHUwMDM2XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3QVwiXSA9IFwiXFx1MDAyOFxcdTAwMzdcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNDdCXCJdID0gXCJcXHUwMDI4XFx1MDAzOFxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0N0NcIl0gPSBcIlxcdTAwMjhcXHUwMDM5XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3RFwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDMwXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3RVwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDMxXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3RlwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDMyXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4MFwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDMzXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4MVwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM0XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4MlwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM1XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4M1wiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM2XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4NFwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM3XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4NVwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM4XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4NlwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM5XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4N1wiXSA9IFwiXFx1MDAyOFxcdTAwMzJcXHUwMDMwXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4OFwiXSA9IFwiXFx1MDAzMVxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0ODlcIl0gPSBcIlxcdTAwMzJcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDhBXCJdID0gXCJcXHUwMDMzXFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ4QlwiXSA9IFwiXFx1MDAzNFxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OENcIl0gPSBcIlxcdTAwMzVcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDhEXCJdID0gXCJcXHUwMDM2XFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ4RVwiXSA9IFwiXFx1MDAzN1xcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OEZcIl0gPSBcIlxcdTAwMzhcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDkwXCJdID0gXCJcXHUwMDM5XFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ5MVwiXSA9IFwiXFx1MDAzMVxcdTAwMzBcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDkyXCJdID0gXCJcXHUwMDMxXFx1MDAzMVxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OTNcIl0gPSBcIlxcdTAwMzFcXHUwMDMyXFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ5NFwiXSA9IFwiXFx1MDAzMVxcdTAwMzNcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDk1XCJdID0gXCJcXHUwMDMxXFx1MDAzNFxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OTZcIl0gPSBcIlxcdTAwMzFcXHUwMDM1XFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ5N1wiXSA9IFwiXFx1MDAzMVxcdTAwMzZcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDk4XCJdID0gXCJcXHUwMDMxXFx1MDAzN1xcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OTlcIl0gPSBcIlxcdTAwMzFcXHUwMDM4XFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ5QVwiXSA9IFwiXFx1MDAzMVxcdTAwMzlcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDlCXCJdID0gXCJcXHUwMDMyXFx1MDAzMFxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OUNcIl0gPSBcIlxcdTAwMjhcXHUwMDYxXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ5RFwiXSA9IFwiXFx1MDAyOFxcdTAwNjJcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNDlFXCJdID0gXCJcXHUwMDI4XFx1MDA2M1xcdTAwMjlcIjtcbiAgdFtcIlxcdTI0OUZcIl0gPSBcIlxcdTAwMjhcXHUwMDY0XFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBMFwiXSA9IFwiXFx1MDAyOFxcdTAwNjVcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEExXCJdID0gXCJcXHUwMDI4XFx1MDA2NlxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QTJcIl0gPSBcIlxcdTAwMjhcXHUwMDY3XFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBM1wiXSA9IFwiXFx1MDAyOFxcdTAwNjhcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEE0XCJdID0gXCJcXHUwMDI4XFx1MDA2OVxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QTVcIl0gPSBcIlxcdTAwMjhcXHUwMDZBXFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBNlwiXSA9IFwiXFx1MDAyOFxcdTAwNkJcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEE3XCJdID0gXCJcXHUwMDI4XFx1MDA2Q1xcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QThcIl0gPSBcIlxcdTAwMjhcXHUwMDZEXFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBOVwiXSA9IFwiXFx1MDAyOFxcdTAwNkVcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEFBXCJdID0gXCJcXHUwMDI4XFx1MDA2RlxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QUJcIl0gPSBcIlxcdTAwMjhcXHUwMDcwXFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBQ1wiXSA9IFwiXFx1MDAyOFxcdTAwNzFcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEFEXCJdID0gXCJcXHUwMDI4XFx1MDA3MlxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QUVcIl0gPSBcIlxcdTAwMjhcXHUwMDczXFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBRlwiXSA9IFwiXFx1MDAyOFxcdTAwNzRcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEIwXCJdID0gXCJcXHUwMDI4XFx1MDA3NVxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QjFcIl0gPSBcIlxcdTAwMjhcXHUwMDc2XFx1MDAyOVwiO1xuICB0W1wiXFx1MjRCMlwiXSA9IFwiXFx1MDAyOFxcdTAwNzdcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEIzXCJdID0gXCJcXHUwMDI4XFx1MDA3OFxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QjRcIl0gPSBcIlxcdTAwMjhcXHUwMDc5XFx1MDAyOVwiO1xuICB0W1wiXFx1MjRCNVwiXSA9IFwiXFx1MDAyOFxcdTAwN0FcXHUwMDI5XCI7XG4gIHRbXCJcXHUyQTBDXCJdID0gXCJcXHUyMjJCXFx1MjIyQlxcdTIyMkJcXHUyMjJCXCI7XG4gIHRbXCJcXHUyQTc0XCJdID0gXCJcXHUwMDNBXFx1MDAzQVxcdTAwM0RcIjtcbiAgdFtcIlxcdTJBNzVcIl0gPSBcIlxcdTAwM0RcXHUwMDNEXCI7XG4gIHRbXCJcXHUyQTc2XCJdID0gXCJcXHUwMDNEXFx1MDAzRFxcdTAwM0RcIjtcbiAgdFtcIlxcdTJFOUZcIl0gPSBcIlxcdTZCQ0RcIjtcbiAgdFtcIlxcdTJFRjNcIl0gPSBcIlxcdTlGOUZcIjtcbiAgdFtcIlxcdTJGMDBcIl0gPSBcIlxcdTRFMDBcIjtcbiAgdFtcIlxcdTJGMDFcIl0gPSBcIlxcdTRFMjhcIjtcbiAgdFtcIlxcdTJGMDJcIl0gPSBcIlxcdTRFMzZcIjtcbiAgdFtcIlxcdTJGMDNcIl0gPSBcIlxcdTRFM0ZcIjtcbiAgdFtcIlxcdTJGMDRcIl0gPSBcIlxcdTRFNTlcIjtcbiAgdFtcIlxcdTJGMDVcIl0gPSBcIlxcdTRFODVcIjtcbiAgdFtcIlxcdTJGMDZcIl0gPSBcIlxcdTRFOENcIjtcbiAgdFtcIlxcdTJGMDdcIl0gPSBcIlxcdTRFQTBcIjtcbiAgdFtcIlxcdTJGMDhcIl0gPSBcIlxcdTRFQkFcIjtcbiAgdFtcIlxcdTJGMDlcIl0gPSBcIlxcdTUxM0ZcIjtcbiAgdFtcIlxcdTJGMEFcIl0gPSBcIlxcdTUxNjVcIjtcbiAgdFtcIlxcdTJGMEJcIl0gPSBcIlxcdTUxNkJcIjtcbiAgdFtcIlxcdTJGMENcIl0gPSBcIlxcdTUxODJcIjtcbiAgdFtcIlxcdTJGMERcIl0gPSBcIlxcdTUxOTZcIjtcbiAgdFtcIlxcdTJGMEVcIl0gPSBcIlxcdTUxQUJcIjtcbiAgdFtcIlxcdTJGMEZcIl0gPSBcIlxcdTUxRTBcIjtcbiAgdFtcIlxcdTJGMTBcIl0gPSBcIlxcdTUxRjVcIjtcbiAgdFtcIlxcdTJGMTFcIl0gPSBcIlxcdTUyMDBcIjtcbiAgdFtcIlxcdTJGMTJcIl0gPSBcIlxcdTUyOUJcIjtcbiAgdFtcIlxcdTJGMTNcIl0gPSBcIlxcdTUyRjlcIjtcbiAgdFtcIlxcdTJGMTRcIl0gPSBcIlxcdTUzMTVcIjtcbiAgdFtcIlxcdTJGMTVcIl0gPSBcIlxcdTUzMUFcIjtcbiAgdFtcIlxcdTJGMTZcIl0gPSBcIlxcdTUzMzhcIjtcbiAgdFtcIlxcdTJGMTdcIl0gPSBcIlxcdTUzNDFcIjtcbiAgdFtcIlxcdTJGMThcIl0gPSBcIlxcdTUzNUNcIjtcbiAgdFtcIlxcdTJGMTlcIl0gPSBcIlxcdTUzNjlcIjtcbiAgdFtcIlxcdTJGMUFcIl0gPSBcIlxcdTUzODJcIjtcbiAgdFtcIlxcdTJGMUJcIl0gPSBcIlxcdTUzQjZcIjtcbiAgdFtcIlxcdTJGMUNcIl0gPSBcIlxcdTUzQzhcIjtcbiAgdFtcIlxcdTJGMURcIl0gPSBcIlxcdTUzRTNcIjtcbiAgdFtcIlxcdTJGMUVcIl0gPSBcIlxcdTU2RDdcIjtcbiAgdFtcIlxcdTJGMUZcIl0gPSBcIlxcdTU3MUZcIjtcbiAgdFtcIlxcdTJGMjBcIl0gPSBcIlxcdTU4RUJcIjtcbiAgdFtcIlxcdTJGMjFcIl0gPSBcIlxcdTU5MDJcIjtcbiAgdFtcIlxcdTJGMjJcIl0gPSBcIlxcdTU5MEFcIjtcbiAgdFtcIlxcdTJGMjNcIl0gPSBcIlxcdTU5MTVcIjtcbiAgdFtcIlxcdTJGMjRcIl0gPSBcIlxcdTU5MjdcIjtcbiAgdFtcIlxcdTJGMjVcIl0gPSBcIlxcdTU5NzNcIjtcbiAgdFtcIlxcdTJGMjZcIl0gPSBcIlxcdTVCNTBcIjtcbiAgdFtcIlxcdTJGMjdcIl0gPSBcIlxcdTVCODBcIjtcbiAgdFtcIlxcdTJGMjhcIl0gPSBcIlxcdTVCRjhcIjtcbiAgdFtcIlxcdTJGMjlcIl0gPSBcIlxcdTVDMEZcIjtcbiAgdFtcIlxcdTJGMkFcIl0gPSBcIlxcdTVDMjJcIjtcbiAgdFtcIlxcdTJGMkJcIl0gPSBcIlxcdTVDMzhcIjtcbiAgdFtcIlxcdTJGMkNcIl0gPSBcIlxcdTVDNkVcIjtcbiAgdFtcIlxcdTJGMkRcIl0gPSBcIlxcdTVDNzFcIjtcbiAgdFtcIlxcdTJGMkVcIl0gPSBcIlxcdTVEREJcIjtcbiAgdFtcIlxcdTJGMkZcIl0gPSBcIlxcdTVERTVcIjtcbiAgdFtcIlxcdTJGMzBcIl0gPSBcIlxcdTVERjFcIjtcbiAgdFtcIlxcdTJGMzFcIl0gPSBcIlxcdTVERkVcIjtcbiAgdFtcIlxcdTJGMzJcIl0gPSBcIlxcdTVFNzJcIjtcbiAgdFtcIlxcdTJGMzNcIl0gPSBcIlxcdTVFN0FcIjtcbiAgdFtcIlxcdTJGMzRcIl0gPSBcIlxcdTVFN0ZcIjtcbiAgdFtcIlxcdTJGMzVcIl0gPSBcIlxcdTVFRjRcIjtcbiAgdFtcIlxcdTJGMzZcIl0gPSBcIlxcdTVFRkVcIjtcbiAgdFtcIlxcdTJGMzdcIl0gPSBcIlxcdTVGMEJcIjtcbiAgdFtcIlxcdTJGMzhcIl0gPSBcIlxcdTVGMTNcIjtcbiAgdFtcIlxcdTJGMzlcIl0gPSBcIlxcdTVGNTBcIjtcbiAgdFtcIlxcdTJGM0FcIl0gPSBcIlxcdTVGNjFcIjtcbiAgdFtcIlxcdTJGM0JcIl0gPSBcIlxcdTVGNzNcIjtcbiAgdFtcIlxcdTJGM0NcIl0gPSBcIlxcdTVGQzNcIjtcbiAgdFtcIlxcdTJGM0RcIl0gPSBcIlxcdTYyMDhcIjtcbiAgdFtcIlxcdTJGM0VcIl0gPSBcIlxcdTYyMzZcIjtcbiAgdFtcIlxcdTJGM0ZcIl0gPSBcIlxcdTYyNEJcIjtcbiAgdFtcIlxcdTJGNDBcIl0gPSBcIlxcdTY1MkZcIjtcbiAgdFtcIlxcdTJGNDFcIl0gPSBcIlxcdTY1MzRcIjtcbiAgdFtcIlxcdTJGNDJcIl0gPSBcIlxcdTY1ODdcIjtcbiAgdFtcIlxcdTJGNDNcIl0gPSBcIlxcdTY1OTdcIjtcbiAgdFtcIlxcdTJGNDRcIl0gPSBcIlxcdTY1QTRcIjtcbiAgdFtcIlxcdTJGNDVcIl0gPSBcIlxcdTY1QjlcIjtcbiAgdFtcIlxcdTJGNDZcIl0gPSBcIlxcdTY1RTBcIjtcbiAgdFtcIlxcdTJGNDdcIl0gPSBcIlxcdTY1RTVcIjtcbiAgdFtcIlxcdTJGNDhcIl0gPSBcIlxcdTY2RjBcIjtcbiAgdFtcIlxcdTJGNDlcIl0gPSBcIlxcdTY3MDhcIjtcbiAgdFtcIlxcdTJGNEFcIl0gPSBcIlxcdTY3MjhcIjtcbiAgdFtcIlxcdTJGNEJcIl0gPSBcIlxcdTZCMjBcIjtcbiAgdFtcIlxcdTJGNENcIl0gPSBcIlxcdTZCNjJcIjtcbiAgdFtcIlxcdTJGNERcIl0gPSBcIlxcdTZCNzlcIjtcbiAgdFtcIlxcdTJGNEVcIl0gPSBcIlxcdTZCQjNcIjtcbiAgdFtcIlxcdTJGNEZcIl0gPSBcIlxcdTZCQ0JcIjtcbiAgdFtcIlxcdTJGNTBcIl0gPSBcIlxcdTZCRDRcIjtcbiAgdFtcIlxcdTJGNTFcIl0gPSBcIlxcdTZCREJcIjtcbiAgdFtcIlxcdTJGNTJcIl0gPSBcIlxcdTZDMEZcIjtcbiAgdFtcIlxcdTJGNTNcIl0gPSBcIlxcdTZDMTRcIjtcbiAgdFtcIlxcdTJGNTRcIl0gPSBcIlxcdTZDMzRcIjtcbiAgdFtcIlxcdTJGNTVcIl0gPSBcIlxcdTcwNkJcIjtcbiAgdFtcIlxcdTJGNTZcIl0gPSBcIlxcdTcyMkFcIjtcbiAgdFtcIlxcdTJGNTdcIl0gPSBcIlxcdTcyMzZcIjtcbiAgdFtcIlxcdTJGNThcIl0gPSBcIlxcdTcyM0JcIjtcbiAgdFtcIlxcdTJGNTlcIl0gPSBcIlxcdTcyM0ZcIjtcbiAgdFtcIlxcdTJGNUFcIl0gPSBcIlxcdTcyNDdcIjtcbiAgdFtcIlxcdTJGNUJcIl0gPSBcIlxcdTcyNTlcIjtcbiAgdFtcIlxcdTJGNUNcIl0gPSBcIlxcdTcyNUJcIjtcbiAgdFtcIlxcdTJGNURcIl0gPSBcIlxcdTcyQUNcIjtcbiAgdFtcIlxcdTJGNUVcIl0gPSBcIlxcdTczODRcIjtcbiAgdFtcIlxcdTJGNUZcIl0gPSBcIlxcdTczODlcIjtcbiAgdFtcIlxcdTJGNjBcIl0gPSBcIlxcdTc0RENcIjtcbiAgdFtcIlxcdTJGNjFcIl0gPSBcIlxcdTc0RTZcIjtcbiAgdFtcIlxcdTJGNjJcIl0gPSBcIlxcdTc1MThcIjtcbiAgdFtcIlxcdTJGNjNcIl0gPSBcIlxcdTc1MUZcIjtcbiAgdFtcIlxcdTJGNjRcIl0gPSBcIlxcdTc1MjhcIjtcbiAgdFtcIlxcdTJGNjVcIl0gPSBcIlxcdTc1MzBcIjtcbiAgdFtcIlxcdTJGNjZcIl0gPSBcIlxcdTc1OEJcIjtcbiAgdFtcIlxcdTJGNjdcIl0gPSBcIlxcdTc1OTJcIjtcbiAgdFtcIlxcdTJGNjhcIl0gPSBcIlxcdTc2NzZcIjtcbiAgdFtcIlxcdTJGNjlcIl0gPSBcIlxcdTc2N0RcIjtcbiAgdFtcIlxcdTJGNkFcIl0gPSBcIlxcdTc2QUVcIjtcbiAgdFtcIlxcdTJGNkJcIl0gPSBcIlxcdTc2QkZcIjtcbiAgdFtcIlxcdTJGNkNcIl0gPSBcIlxcdTc2RUVcIjtcbiAgdFtcIlxcdTJGNkRcIl0gPSBcIlxcdTc3REJcIjtcbiAgdFtcIlxcdTJGNkVcIl0gPSBcIlxcdTc3RTJcIjtcbiAgdFtcIlxcdTJGNkZcIl0gPSBcIlxcdTc3RjNcIjtcbiAgdFtcIlxcdTJGNzBcIl0gPSBcIlxcdTc5M0FcIjtcbiAgdFtcIlxcdTJGNzFcIl0gPSBcIlxcdTc5QjhcIjtcbiAgdFtcIlxcdTJGNzJcIl0gPSBcIlxcdTc5QkVcIjtcbiAgdFtcIlxcdTJGNzNcIl0gPSBcIlxcdTdBNzRcIjtcbiAgdFtcIlxcdTJGNzRcIl0gPSBcIlxcdTdBQ0JcIjtcbiAgdFtcIlxcdTJGNzVcIl0gPSBcIlxcdTdBRjlcIjtcbiAgdFtcIlxcdTJGNzZcIl0gPSBcIlxcdTdDNzNcIjtcbiAgdFtcIlxcdTJGNzdcIl0gPSBcIlxcdTdDRjhcIjtcbiAgdFtcIlxcdTJGNzhcIl0gPSBcIlxcdTdGMzZcIjtcbiAgdFtcIlxcdTJGNzlcIl0gPSBcIlxcdTdGNTFcIjtcbiAgdFtcIlxcdTJGN0FcIl0gPSBcIlxcdTdGOEFcIjtcbiAgdFtcIlxcdTJGN0JcIl0gPSBcIlxcdTdGQkRcIjtcbiAgdFtcIlxcdTJGN0NcIl0gPSBcIlxcdTgwMDFcIjtcbiAgdFtcIlxcdTJGN0RcIl0gPSBcIlxcdTgwMENcIjtcbiAgdFtcIlxcdTJGN0VcIl0gPSBcIlxcdTgwMTJcIjtcbiAgdFtcIlxcdTJGN0ZcIl0gPSBcIlxcdTgwMzNcIjtcbiAgdFtcIlxcdTJGODBcIl0gPSBcIlxcdTgwN0ZcIjtcbiAgdFtcIlxcdTJGODFcIl0gPSBcIlxcdTgwODlcIjtcbiAgdFtcIlxcdTJGODJcIl0gPSBcIlxcdTgxRTNcIjtcbiAgdFtcIlxcdTJGODNcIl0gPSBcIlxcdTgxRUFcIjtcbiAgdFtcIlxcdTJGODRcIl0gPSBcIlxcdTgxRjNcIjtcbiAgdFtcIlxcdTJGODVcIl0gPSBcIlxcdTgxRkNcIjtcbiAgdFtcIlxcdTJGODZcIl0gPSBcIlxcdTgyMENcIjtcbiAgdFtcIlxcdTJGODdcIl0gPSBcIlxcdTgyMUJcIjtcbiAgdFtcIlxcdTJGODhcIl0gPSBcIlxcdTgyMUZcIjtcbiAgdFtcIlxcdTJGODlcIl0gPSBcIlxcdTgyNkVcIjtcbiAgdFtcIlxcdTJGOEFcIl0gPSBcIlxcdTgyNzJcIjtcbiAgdFtcIlxcdTJGOEJcIl0gPSBcIlxcdTgyNzhcIjtcbiAgdFtcIlxcdTJGOENcIl0gPSBcIlxcdTg2NERcIjtcbiAgdFtcIlxcdTJGOERcIl0gPSBcIlxcdTg2NkJcIjtcbiAgdFtcIlxcdTJGOEVcIl0gPSBcIlxcdTg4NDBcIjtcbiAgdFtcIlxcdTJGOEZcIl0gPSBcIlxcdTg4NENcIjtcbiAgdFtcIlxcdTJGOTBcIl0gPSBcIlxcdTg4NjNcIjtcbiAgdFtcIlxcdTJGOTFcIl0gPSBcIlxcdTg5N0VcIjtcbiAgdFtcIlxcdTJGOTJcIl0gPSBcIlxcdTg5OEJcIjtcbiAgdFtcIlxcdTJGOTNcIl0gPSBcIlxcdTg5RDJcIjtcbiAgdFtcIlxcdTJGOTRcIl0gPSBcIlxcdThBMDBcIjtcbiAgdFtcIlxcdTJGOTVcIl0gPSBcIlxcdThDMzdcIjtcbiAgdFtcIlxcdTJGOTZcIl0gPSBcIlxcdThDNDZcIjtcbiAgdFtcIlxcdTJGOTdcIl0gPSBcIlxcdThDNTVcIjtcbiAgdFtcIlxcdTJGOThcIl0gPSBcIlxcdThDNzhcIjtcbiAgdFtcIlxcdTJGOTlcIl0gPSBcIlxcdThDOURcIjtcbiAgdFtcIlxcdTJGOUFcIl0gPSBcIlxcdThENjRcIjtcbiAgdFtcIlxcdTJGOUJcIl0gPSBcIlxcdThENzBcIjtcbiAgdFtcIlxcdTJGOUNcIl0gPSBcIlxcdThEQjNcIjtcbiAgdFtcIlxcdTJGOURcIl0gPSBcIlxcdThFQUJcIjtcbiAgdFtcIlxcdTJGOUVcIl0gPSBcIlxcdThFQ0FcIjtcbiAgdFtcIlxcdTJGOUZcIl0gPSBcIlxcdThGOUJcIjtcbiAgdFtcIlxcdTJGQTBcIl0gPSBcIlxcdThGQjBcIjtcbiAgdFtcIlxcdTJGQTFcIl0gPSBcIlxcdThGQjVcIjtcbiAgdFtcIlxcdTJGQTJcIl0gPSBcIlxcdTkwOTFcIjtcbiAgdFtcIlxcdTJGQTNcIl0gPSBcIlxcdTkxNDlcIjtcbiAgdFtcIlxcdTJGQTRcIl0gPSBcIlxcdTkxQzZcIjtcbiAgdFtcIlxcdTJGQTVcIl0gPSBcIlxcdTkxQ0NcIjtcbiAgdFtcIlxcdTJGQTZcIl0gPSBcIlxcdTkxRDFcIjtcbiAgdFtcIlxcdTJGQTdcIl0gPSBcIlxcdTk1NzdcIjtcbiAgdFtcIlxcdTJGQThcIl0gPSBcIlxcdTk1ODBcIjtcbiAgdFtcIlxcdTJGQTlcIl0gPSBcIlxcdTk2MUNcIjtcbiAgdFtcIlxcdTJGQUFcIl0gPSBcIlxcdTk2QjZcIjtcbiAgdFtcIlxcdTJGQUJcIl0gPSBcIlxcdTk2QjlcIjtcbiAgdFtcIlxcdTJGQUNcIl0gPSBcIlxcdTk2RThcIjtcbiAgdFtcIlxcdTJGQURcIl0gPSBcIlxcdTk3NTFcIjtcbiAgdFtcIlxcdTJGQUVcIl0gPSBcIlxcdTk3NUVcIjtcbiAgdFtcIlxcdTJGQUZcIl0gPSBcIlxcdTk3NjJcIjtcbiAgdFtcIlxcdTJGQjBcIl0gPSBcIlxcdTk3NjlcIjtcbiAgdFtcIlxcdTJGQjFcIl0gPSBcIlxcdTk3Q0JcIjtcbiAgdFtcIlxcdTJGQjJcIl0gPSBcIlxcdTk3RURcIjtcbiAgdFtcIlxcdTJGQjNcIl0gPSBcIlxcdTk3RjNcIjtcbiAgdFtcIlxcdTJGQjRcIl0gPSBcIlxcdTk4MDFcIjtcbiAgdFtcIlxcdTJGQjVcIl0gPSBcIlxcdTk4QThcIjtcbiAgdFtcIlxcdTJGQjZcIl0gPSBcIlxcdTk4REJcIjtcbiAgdFtcIlxcdTJGQjdcIl0gPSBcIlxcdTk4REZcIjtcbiAgdFtcIlxcdTJGQjhcIl0gPSBcIlxcdTk5OTZcIjtcbiAgdFtcIlxcdTJGQjlcIl0gPSBcIlxcdTk5OTlcIjtcbiAgdFtcIlxcdTJGQkFcIl0gPSBcIlxcdTk5QUNcIjtcbiAgdFtcIlxcdTJGQkJcIl0gPSBcIlxcdTlBQThcIjtcbiAgdFtcIlxcdTJGQkNcIl0gPSBcIlxcdTlBRDhcIjtcbiAgdFtcIlxcdTJGQkRcIl0gPSBcIlxcdTlBREZcIjtcbiAgdFtcIlxcdTJGQkVcIl0gPSBcIlxcdTlCMjVcIjtcbiAgdFtcIlxcdTJGQkZcIl0gPSBcIlxcdTlCMkZcIjtcbiAgdFtcIlxcdTJGQzBcIl0gPSBcIlxcdTlCMzJcIjtcbiAgdFtcIlxcdTJGQzFcIl0gPSBcIlxcdTlCM0NcIjtcbiAgdFtcIlxcdTJGQzJcIl0gPSBcIlxcdTlCNUFcIjtcbiAgdFtcIlxcdTJGQzNcIl0gPSBcIlxcdTlDRTVcIjtcbiAgdFtcIlxcdTJGQzRcIl0gPSBcIlxcdTlFNzVcIjtcbiAgdFtcIlxcdTJGQzVcIl0gPSBcIlxcdTlFN0ZcIjtcbiAgdFtcIlxcdTJGQzZcIl0gPSBcIlxcdTlFQTVcIjtcbiAgdFtcIlxcdTJGQzdcIl0gPSBcIlxcdTlFQkJcIjtcbiAgdFtcIlxcdTJGQzhcIl0gPSBcIlxcdTlFQzNcIjtcbiAgdFtcIlxcdTJGQzlcIl0gPSBcIlxcdTlFQ0RcIjtcbiAgdFtcIlxcdTJGQ0FcIl0gPSBcIlxcdTlFRDFcIjtcbiAgdFtcIlxcdTJGQ0JcIl0gPSBcIlxcdTlFRjlcIjtcbiAgdFtcIlxcdTJGQ0NcIl0gPSBcIlxcdTlFRkRcIjtcbiAgdFtcIlxcdTJGQ0RcIl0gPSBcIlxcdTlGMEVcIjtcbiAgdFtcIlxcdTJGQ0VcIl0gPSBcIlxcdTlGMTNcIjtcbiAgdFtcIlxcdTJGQ0ZcIl0gPSBcIlxcdTlGMjBcIjtcbiAgdFtcIlxcdTJGRDBcIl0gPSBcIlxcdTlGM0JcIjtcbiAgdFtcIlxcdTJGRDFcIl0gPSBcIlxcdTlGNEFcIjtcbiAgdFtcIlxcdTJGRDJcIl0gPSBcIlxcdTlGNTJcIjtcbiAgdFtcIlxcdTJGRDNcIl0gPSBcIlxcdTlGOERcIjtcbiAgdFtcIlxcdTJGRDRcIl0gPSBcIlxcdTlGOUNcIjtcbiAgdFtcIlxcdTJGRDVcIl0gPSBcIlxcdTlGQTBcIjtcbiAgdFtcIlxcdTMwMzZcIl0gPSBcIlxcdTMwMTJcIjtcbiAgdFtcIlxcdTMwMzhcIl0gPSBcIlxcdTUzNDFcIjtcbiAgdFtcIlxcdTMwMzlcIl0gPSBcIlxcdTUzNDRcIjtcbiAgdFtcIlxcdTMwM0FcIl0gPSBcIlxcdTUzNDVcIjtcbiAgdFtcIlxcdTMwOUJcIl0gPSBcIlxcdTAwMjBcXHUzMDk5XCI7XG4gIHRbXCJcXHUzMDlDXCJdID0gXCJcXHUwMDIwXFx1MzA5QVwiO1xuICB0W1wiXFx1MzEzMVwiXSA9IFwiXFx1MTEwMFwiO1xuICB0W1wiXFx1MzEzMlwiXSA9IFwiXFx1MTEwMVwiO1xuICB0W1wiXFx1MzEzM1wiXSA9IFwiXFx1MTFBQVwiO1xuICB0W1wiXFx1MzEzNFwiXSA9IFwiXFx1MTEwMlwiO1xuICB0W1wiXFx1MzEzNVwiXSA9IFwiXFx1MTFBQ1wiO1xuICB0W1wiXFx1MzEzNlwiXSA9IFwiXFx1MTFBRFwiO1xuICB0W1wiXFx1MzEzN1wiXSA9IFwiXFx1MTEwM1wiO1xuICB0W1wiXFx1MzEzOFwiXSA9IFwiXFx1MTEwNFwiO1xuICB0W1wiXFx1MzEzOVwiXSA9IFwiXFx1MTEwNVwiO1xuICB0W1wiXFx1MzEzQVwiXSA9IFwiXFx1MTFCMFwiO1xuICB0W1wiXFx1MzEzQlwiXSA9IFwiXFx1MTFCMVwiO1xuICB0W1wiXFx1MzEzQ1wiXSA9IFwiXFx1MTFCMlwiO1xuICB0W1wiXFx1MzEzRFwiXSA9IFwiXFx1MTFCM1wiO1xuICB0W1wiXFx1MzEzRVwiXSA9IFwiXFx1MTFCNFwiO1xuICB0W1wiXFx1MzEzRlwiXSA9IFwiXFx1MTFCNVwiO1xuICB0W1wiXFx1MzE0MFwiXSA9IFwiXFx1MTExQVwiO1xuICB0W1wiXFx1MzE0MVwiXSA9IFwiXFx1MTEwNlwiO1xuICB0W1wiXFx1MzE0MlwiXSA9IFwiXFx1MTEwN1wiO1xuICB0W1wiXFx1MzE0M1wiXSA9IFwiXFx1MTEwOFwiO1xuICB0W1wiXFx1MzE0NFwiXSA9IFwiXFx1MTEyMVwiO1xuICB0W1wiXFx1MzE0NVwiXSA9IFwiXFx1MTEwOVwiO1xuICB0W1wiXFx1MzE0NlwiXSA9IFwiXFx1MTEwQVwiO1xuICB0W1wiXFx1MzE0N1wiXSA9IFwiXFx1MTEwQlwiO1xuICB0W1wiXFx1MzE0OFwiXSA9IFwiXFx1MTEwQ1wiO1xuICB0W1wiXFx1MzE0OVwiXSA9IFwiXFx1MTEwRFwiO1xuICB0W1wiXFx1MzE0QVwiXSA9IFwiXFx1MTEwRVwiO1xuICB0W1wiXFx1MzE0QlwiXSA9IFwiXFx1MTEwRlwiO1xuICB0W1wiXFx1MzE0Q1wiXSA9IFwiXFx1MTExMFwiO1xuICB0W1wiXFx1MzE0RFwiXSA9IFwiXFx1MTExMVwiO1xuICB0W1wiXFx1MzE0RVwiXSA9IFwiXFx1MTExMlwiO1xuICB0W1wiXFx1MzE0RlwiXSA9IFwiXFx1MTE2MVwiO1xuICB0W1wiXFx1MzE1MFwiXSA9IFwiXFx1MTE2MlwiO1xuICB0W1wiXFx1MzE1MVwiXSA9IFwiXFx1MTE2M1wiO1xuICB0W1wiXFx1MzE1MlwiXSA9IFwiXFx1MTE2NFwiO1xuICB0W1wiXFx1MzE1M1wiXSA9IFwiXFx1MTE2NVwiO1xuICB0W1wiXFx1MzE1NFwiXSA9IFwiXFx1MTE2NlwiO1xuICB0W1wiXFx1MzE1NVwiXSA9IFwiXFx1MTE2N1wiO1xuICB0W1wiXFx1MzE1NlwiXSA9IFwiXFx1MTE2OFwiO1xuICB0W1wiXFx1MzE1N1wiXSA9IFwiXFx1MTE2OVwiO1xuICB0W1wiXFx1MzE1OFwiXSA9IFwiXFx1MTE2QVwiO1xuICB0W1wiXFx1MzE1OVwiXSA9IFwiXFx1MTE2QlwiO1xuICB0W1wiXFx1MzE1QVwiXSA9IFwiXFx1MTE2Q1wiO1xuICB0W1wiXFx1MzE1QlwiXSA9IFwiXFx1MTE2RFwiO1xuICB0W1wiXFx1MzE1Q1wiXSA9IFwiXFx1MTE2RVwiO1xuICB0W1wiXFx1MzE1RFwiXSA9IFwiXFx1MTE2RlwiO1xuICB0W1wiXFx1MzE1RVwiXSA9IFwiXFx1MTE3MFwiO1xuICB0W1wiXFx1MzE1RlwiXSA9IFwiXFx1MTE3MVwiO1xuICB0W1wiXFx1MzE2MFwiXSA9IFwiXFx1MTE3MlwiO1xuICB0W1wiXFx1MzE2MVwiXSA9IFwiXFx1MTE3M1wiO1xuICB0W1wiXFx1MzE2MlwiXSA9IFwiXFx1MTE3NFwiO1xuICB0W1wiXFx1MzE2M1wiXSA9IFwiXFx1MTE3NVwiO1xuICB0W1wiXFx1MzE2NFwiXSA9IFwiXFx1MTE2MFwiO1xuICB0W1wiXFx1MzE2NVwiXSA9IFwiXFx1MTExNFwiO1xuICB0W1wiXFx1MzE2NlwiXSA9IFwiXFx1MTExNVwiO1xuICB0W1wiXFx1MzE2N1wiXSA9IFwiXFx1MTFDN1wiO1xuICB0W1wiXFx1MzE2OFwiXSA9IFwiXFx1MTFDOFwiO1xuICB0W1wiXFx1MzE2OVwiXSA9IFwiXFx1MTFDQ1wiO1xuICB0W1wiXFx1MzE2QVwiXSA9IFwiXFx1MTFDRVwiO1xuICB0W1wiXFx1MzE2QlwiXSA9IFwiXFx1MTFEM1wiO1xuICB0W1wiXFx1MzE2Q1wiXSA9IFwiXFx1MTFEN1wiO1xuICB0W1wiXFx1MzE2RFwiXSA9IFwiXFx1MTFEOVwiO1xuICB0W1wiXFx1MzE2RVwiXSA9IFwiXFx1MTExQ1wiO1xuICB0W1wiXFx1MzE2RlwiXSA9IFwiXFx1MTFERFwiO1xuICB0W1wiXFx1MzE3MFwiXSA9IFwiXFx1MTFERlwiO1xuICB0W1wiXFx1MzE3MVwiXSA9IFwiXFx1MTExRFwiO1xuICB0W1wiXFx1MzE3MlwiXSA9IFwiXFx1MTExRVwiO1xuICB0W1wiXFx1MzE3M1wiXSA9IFwiXFx1MTEyMFwiO1xuICB0W1wiXFx1MzE3NFwiXSA9IFwiXFx1MTEyMlwiO1xuICB0W1wiXFx1MzE3NVwiXSA9IFwiXFx1MTEyM1wiO1xuICB0W1wiXFx1MzE3NlwiXSA9IFwiXFx1MTEyN1wiO1xuICB0W1wiXFx1MzE3N1wiXSA9IFwiXFx1MTEyOVwiO1xuICB0W1wiXFx1MzE3OFwiXSA9IFwiXFx1MTEyQlwiO1xuICB0W1wiXFx1MzE3OVwiXSA9IFwiXFx1MTEyQ1wiO1xuICB0W1wiXFx1MzE3QVwiXSA9IFwiXFx1MTEyRFwiO1xuICB0W1wiXFx1MzE3QlwiXSA9IFwiXFx1MTEyRVwiO1xuICB0W1wiXFx1MzE3Q1wiXSA9IFwiXFx1MTEyRlwiO1xuICB0W1wiXFx1MzE3RFwiXSA9IFwiXFx1MTEzMlwiO1xuICB0W1wiXFx1MzE3RVwiXSA9IFwiXFx1MTEzNlwiO1xuICB0W1wiXFx1MzE3RlwiXSA9IFwiXFx1MTE0MFwiO1xuICB0W1wiXFx1MzE4MFwiXSA9IFwiXFx1MTE0N1wiO1xuICB0W1wiXFx1MzE4MVwiXSA9IFwiXFx1MTE0Q1wiO1xuICB0W1wiXFx1MzE4MlwiXSA9IFwiXFx1MTFGMVwiO1xuICB0W1wiXFx1MzE4M1wiXSA9IFwiXFx1MTFGMlwiO1xuICB0W1wiXFx1MzE4NFwiXSA9IFwiXFx1MTE1N1wiO1xuICB0W1wiXFx1MzE4NVwiXSA9IFwiXFx1MTE1OFwiO1xuICB0W1wiXFx1MzE4NlwiXSA9IFwiXFx1MTE1OVwiO1xuICB0W1wiXFx1MzE4N1wiXSA9IFwiXFx1MTE4NFwiO1xuICB0W1wiXFx1MzE4OFwiXSA9IFwiXFx1MTE4NVwiO1xuICB0W1wiXFx1MzE4OVwiXSA9IFwiXFx1MTE4OFwiO1xuICB0W1wiXFx1MzE4QVwiXSA9IFwiXFx1MTE5MVwiO1xuICB0W1wiXFx1MzE4QlwiXSA9IFwiXFx1MTE5MlwiO1xuICB0W1wiXFx1MzE4Q1wiXSA9IFwiXFx1MTE5NFwiO1xuICB0W1wiXFx1MzE4RFwiXSA9IFwiXFx1MTE5RVwiO1xuICB0W1wiXFx1MzE4RVwiXSA9IFwiXFx1MTFBMVwiO1xuICB0W1wiXFx1MzIwMFwiXSA9IFwiXFx1MDAyOFxcdTExMDBcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjAxXCJdID0gXCJcXHUwMDI4XFx1MTEwMlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMDJcIl0gPSBcIlxcdTAwMjhcXHUxMTAzXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIwM1wiXSA9IFwiXFx1MDAyOFxcdTExMDVcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjA0XCJdID0gXCJcXHUwMDI4XFx1MTEwNlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMDVcIl0gPSBcIlxcdTAwMjhcXHUxMTA3XFx1MDAyOVwiO1xuICB0W1wiXFx1MzIwNlwiXSA9IFwiXFx1MDAyOFxcdTExMDlcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjA3XCJdID0gXCJcXHUwMDI4XFx1MTEwQlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMDhcIl0gPSBcIlxcdTAwMjhcXHUxMTBDXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIwOVwiXSA9IFwiXFx1MDAyOFxcdTExMEVcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjBBXCJdID0gXCJcXHUwMDI4XFx1MTEwRlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMEJcIl0gPSBcIlxcdTAwMjhcXHUxMTEwXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIwQ1wiXSA9IFwiXFx1MDAyOFxcdTExMTFcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjBEXCJdID0gXCJcXHUwMDI4XFx1MTExMlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMEVcIl0gPSBcIlxcdTAwMjhcXHUxMTAwXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMEZcIl0gPSBcIlxcdTAwMjhcXHUxMTAyXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTBcIl0gPSBcIlxcdTAwMjhcXHUxMTAzXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTFcIl0gPSBcIlxcdTAwMjhcXHUxMTA1XFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTJcIl0gPSBcIlxcdTAwMjhcXHUxMTA2XFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTNcIl0gPSBcIlxcdTAwMjhcXHUxMTA3XFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTRcIl0gPSBcIlxcdTAwMjhcXHUxMTA5XFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTVcIl0gPSBcIlxcdTAwMjhcXHUxMTBCXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTZcIl0gPSBcIlxcdTAwMjhcXHUxMTBDXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTdcIl0gPSBcIlxcdTAwMjhcXHUxMTBFXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMThcIl0gPSBcIlxcdTAwMjhcXHUxMTBGXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTlcIl0gPSBcIlxcdTAwMjhcXHUxMTEwXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMUFcIl0gPSBcIlxcdTAwMjhcXHUxMTExXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMUJcIl0gPSBcIlxcdTAwMjhcXHUxMTEyXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMUNcIl0gPSBcIlxcdTAwMjhcXHUxMTBDXFx1MTE2RVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMURcIl0gPSBcIlxcdTAwMjhcXHUxMTBCXFx1MTE2OVxcdTExMENcXHUxMTY1XFx1MTFBQlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMUVcIl0gPSBcIlxcdTAwMjhcXHUxMTBCXFx1MTE2OVxcdTExMTJcXHUxMTZFXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyMFwiXSA9IFwiXFx1MDAyOFxcdTRFMDBcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjIxXCJdID0gXCJcXHUwMDI4XFx1NEU4Q1xcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMjJcIl0gPSBcIlxcdTAwMjhcXHU0RTA5XFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyM1wiXSA9IFwiXFx1MDAyOFxcdTU2REJcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjI0XCJdID0gXCJcXHUwMDI4XFx1NEU5NFxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMjVcIl0gPSBcIlxcdTAwMjhcXHU1MTZEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyNlwiXSA9IFwiXFx1MDAyOFxcdTRFMDNcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjI3XCJdID0gXCJcXHUwMDI4XFx1NTE2QlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMjhcIl0gPSBcIlxcdTAwMjhcXHU0RTVEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyOVwiXSA9IFwiXFx1MDAyOFxcdTUzNDFcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjJBXCJdID0gXCJcXHUwMDI4XFx1NjcwOFxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMkJcIl0gPSBcIlxcdTAwMjhcXHU3MDZCXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyQ1wiXSA9IFwiXFx1MDAyOFxcdTZDMzRcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjJEXCJdID0gXCJcXHUwMDI4XFx1NjcyOFxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMkVcIl0gPSBcIlxcdTAwMjhcXHU5MUQxXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyRlwiXSA9IFwiXFx1MDAyOFxcdTU3MUZcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjMwXCJdID0gXCJcXHUwMDI4XFx1NjVFNVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMzFcIl0gPSBcIlxcdTAwMjhcXHU2ODJBXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzMlwiXSA9IFwiXFx1MDAyOFxcdTY3MDlcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjMzXCJdID0gXCJcXHUwMDI4XFx1NzkzRVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMzRcIl0gPSBcIlxcdTAwMjhcXHU1NDBEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzNVwiXSA9IFwiXFx1MDAyOFxcdTcyNzlcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjM2XCJdID0gXCJcXHUwMDI4XFx1OENBMVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMzdcIl0gPSBcIlxcdTAwMjhcXHU3OTVEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzOFwiXSA9IFwiXFx1MDAyOFxcdTUyQjRcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjM5XCJdID0gXCJcXHUwMDI4XFx1NEVFM1xcdTAwMjlcIjtcbiAgdFtcIlxcdTMyM0FcIl0gPSBcIlxcdTAwMjhcXHU1NDdDXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzQlwiXSA9IFwiXFx1MDAyOFxcdTVCNjZcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjNDXCJdID0gXCJcXHUwMDI4XFx1NzZFM1xcdTAwMjlcIjtcbiAgdFtcIlxcdTMyM0RcIl0gPSBcIlxcdTAwMjhcXHU0RjAxXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzRVwiXSA9IFwiXFx1MDAyOFxcdThDQzdcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjNGXCJdID0gXCJcXHUwMDI4XFx1NTM1NFxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyNDBcIl0gPSBcIlxcdTAwMjhcXHU3OTZEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzI0MVwiXSA9IFwiXFx1MDAyOFxcdTRGMTFcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjQyXCJdID0gXCJcXHUwMDI4XFx1ODFFQVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyNDNcIl0gPSBcIlxcdTAwMjhcXHU4MUYzXFx1MDAyOVwiO1xuICB0W1wiXFx1MzJDMFwiXSA9IFwiXFx1MDAzMVxcdTY3MDhcIjtcbiAgdFtcIlxcdTMyQzFcIl0gPSBcIlxcdTAwMzJcXHU2NzA4XCI7XG4gIHRbXCJcXHUzMkMyXCJdID0gXCJcXHUwMDMzXFx1NjcwOFwiO1xuICB0W1wiXFx1MzJDM1wiXSA9IFwiXFx1MDAzNFxcdTY3MDhcIjtcbiAgdFtcIlxcdTMyQzRcIl0gPSBcIlxcdTAwMzVcXHU2NzA4XCI7XG4gIHRbXCJcXHUzMkM1XCJdID0gXCJcXHUwMDM2XFx1NjcwOFwiO1xuICB0W1wiXFx1MzJDNlwiXSA9IFwiXFx1MDAzN1xcdTY3MDhcIjtcbiAgdFtcIlxcdTMyQzdcIl0gPSBcIlxcdTAwMzhcXHU2NzA4XCI7XG4gIHRbXCJcXHUzMkM4XCJdID0gXCJcXHUwMDM5XFx1NjcwOFwiO1xuICB0W1wiXFx1MzJDOVwiXSA9IFwiXFx1MDAzMVxcdTAwMzBcXHU2NzA4XCI7XG4gIHRbXCJcXHUzMkNBXCJdID0gXCJcXHUwMDMxXFx1MDAzMVxcdTY3MDhcIjtcbiAgdFtcIlxcdTMyQ0JcIl0gPSBcIlxcdTAwMzFcXHUwMDMyXFx1NjcwOFwiO1xuICB0W1wiXFx1MzM1OFwiXSA9IFwiXFx1MDAzMFxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNTlcIl0gPSBcIlxcdTAwMzFcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzVBXCJdID0gXCJcXHUwMDMyXFx1NzBCOVwiO1xuICB0W1wiXFx1MzM1QlwiXSA9IFwiXFx1MDAzM1xcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNUNcIl0gPSBcIlxcdTAwMzRcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzVEXCJdID0gXCJcXHUwMDM1XFx1NzBCOVwiO1xuICB0W1wiXFx1MzM1RVwiXSA9IFwiXFx1MDAzNlxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNUZcIl0gPSBcIlxcdTAwMzdcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzYwXCJdID0gXCJcXHUwMDM4XFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2MVwiXSA9IFwiXFx1MDAzOVxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNjJcIl0gPSBcIlxcdTAwMzFcXHUwMDMwXFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2M1wiXSA9IFwiXFx1MDAzMVxcdTAwMzFcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzY0XCJdID0gXCJcXHUwMDMxXFx1MDAzMlxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNjVcIl0gPSBcIlxcdTAwMzFcXHUwMDMzXFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2NlwiXSA9IFwiXFx1MDAzMVxcdTAwMzRcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzY3XCJdID0gXCJcXHUwMDMxXFx1MDAzNVxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNjhcIl0gPSBcIlxcdTAwMzFcXHUwMDM2XFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2OVwiXSA9IFwiXFx1MDAzMVxcdTAwMzdcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzZBXCJdID0gXCJcXHUwMDMxXFx1MDAzOFxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNkJcIl0gPSBcIlxcdTAwMzFcXHUwMDM5XFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2Q1wiXSA9IFwiXFx1MDAzMlxcdTAwMzBcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzZEXCJdID0gXCJcXHUwMDMyXFx1MDAzMVxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNkVcIl0gPSBcIlxcdTAwMzJcXHUwMDMyXFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2RlwiXSA9IFwiXFx1MDAzMlxcdTAwMzNcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzcwXCJdID0gXCJcXHUwMDMyXFx1MDAzNFxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzRTBcIl0gPSBcIlxcdTAwMzFcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0UxXCJdID0gXCJcXHUwMDMyXFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFMlwiXSA9IFwiXFx1MDAzM1xcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRTNcIl0gPSBcIlxcdTAwMzRcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0U0XCJdID0gXCJcXHUwMDM1XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFNVwiXSA9IFwiXFx1MDAzNlxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRTZcIl0gPSBcIlxcdTAwMzdcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0U3XCJdID0gXCJcXHUwMDM4XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFOFwiXSA9IFwiXFx1MDAzOVxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRTlcIl0gPSBcIlxcdTAwMzFcXHUwMDMwXFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFQVwiXSA9IFwiXFx1MDAzMVxcdTAwMzFcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0VCXCJdID0gXCJcXHUwMDMxXFx1MDAzMlxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRUNcIl0gPSBcIlxcdTAwMzFcXHUwMDMzXFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFRFwiXSA9IFwiXFx1MDAzMVxcdTAwMzRcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0VFXCJdID0gXCJcXHUwMDMxXFx1MDAzNVxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRUZcIl0gPSBcIlxcdTAwMzFcXHUwMDM2XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGMFwiXSA9IFwiXFx1MDAzMVxcdTAwMzdcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0YxXCJdID0gXCJcXHUwMDMxXFx1MDAzOFxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRjJcIl0gPSBcIlxcdTAwMzFcXHUwMDM5XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGM1wiXSA9IFwiXFx1MDAzMlxcdTAwMzBcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0Y0XCJdID0gXCJcXHUwMDMyXFx1MDAzMVxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRjVcIl0gPSBcIlxcdTAwMzJcXHUwMDMyXFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGNlwiXSA9IFwiXFx1MDAzMlxcdTAwMzNcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0Y3XCJdID0gXCJcXHUwMDMyXFx1MDAzNFxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRjhcIl0gPSBcIlxcdTAwMzJcXHUwMDM1XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGOVwiXSA9IFwiXFx1MDAzMlxcdTAwMzZcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0ZBXCJdID0gXCJcXHUwMDMyXFx1MDAzN1xcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRkJcIl0gPSBcIlxcdTAwMzJcXHUwMDM4XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGQ1wiXSA9IFwiXFx1MDAzMlxcdTAwMzlcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0ZEXCJdID0gXCJcXHUwMDMzXFx1MDAzMFxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRkVcIl0gPSBcIlxcdTAwMzNcXHUwMDMxXFx1NjVFNVwiO1xuICB0W1wiXFx1RkIwMFwiXSA9IFwiXFx1MDA2NlxcdTAwNjZcIjtcbiAgdFtcIlxcdUZCMDFcIl0gPSBcIlxcdTAwNjZcXHUwMDY5XCI7XG4gIHRbXCJcXHVGQjAyXCJdID0gXCJcXHUwMDY2XFx1MDA2Q1wiO1xuICB0W1wiXFx1RkIwM1wiXSA9IFwiXFx1MDA2NlxcdTAwNjZcXHUwMDY5XCI7XG4gIHRbXCJcXHVGQjA0XCJdID0gXCJcXHUwMDY2XFx1MDA2NlxcdTAwNkNcIjtcbiAgdFtcIlxcdUZCMDVcIl0gPSBcIlxcdTAxN0ZcXHUwMDc0XCI7XG4gIHRbXCJcXHVGQjA2XCJdID0gXCJcXHUwMDczXFx1MDA3NFwiO1xuICB0W1wiXFx1RkIxM1wiXSA9IFwiXFx1MDU3NFxcdTA1NzZcIjtcbiAgdFtcIlxcdUZCMTRcIl0gPSBcIlxcdTA1NzRcXHUwNTY1XCI7XG4gIHRbXCJcXHVGQjE1XCJdID0gXCJcXHUwNTc0XFx1MDU2QlwiO1xuICB0W1wiXFx1RkIxNlwiXSA9IFwiXFx1MDU3RVxcdTA1NzZcIjtcbiAgdFtcIlxcdUZCMTdcIl0gPSBcIlxcdTA1NzRcXHUwNTZEXCI7XG4gIHRbXCJcXHVGQjRGXCJdID0gXCJcXHUwNUQwXFx1MDVEQ1wiO1xuICB0W1wiXFx1RkI1MFwiXSA9IFwiXFx1MDY3MVwiO1xuICB0W1wiXFx1RkI1MVwiXSA9IFwiXFx1MDY3MVwiO1xuICB0W1wiXFx1RkI1MlwiXSA9IFwiXFx1MDY3QlwiO1xuICB0W1wiXFx1RkI1M1wiXSA9IFwiXFx1MDY3QlwiO1xuICB0W1wiXFx1RkI1NFwiXSA9IFwiXFx1MDY3QlwiO1xuICB0W1wiXFx1RkI1NVwiXSA9IFwiXFx1MDY3QlwiO1xuICB0W1wiXFx1RkI1NlwiXSA9IFwiXFx1MDY3RVwiO1xuICB0W1wiXFx1RkI1N1wiXSA9IFwiXFx1MDY3RVwiO1xuICB0W1wiXFx1RkI1OFwiXSA9IFwiXFx1MDY3RVwiO1xuICB0W1wiXFx1RkI1OVwiXSA9IFwiXFx1MDY3RVwiO1xuICB0W1wiXFx1RkI1QVwiXSA9IFwiXFx1MDY4MFwiO1xuICB0W1wiXFx1RkI1QlwiXSA9IFwiXFx1MDY4MFwiO1xuICB0W1wiXFx1RkI1Q1wiXSA9IFwiXFx1MDY4MFwiO1xuICB0W1wiXFx1RkI1RFwiXSA9IFwiXFx1MDY4MFwiO1xuICB0W1wiXFx1RkI1RVwiXSA9IFwiXFx1MDY3QVwiO1xuICB0W1wiXFx1RkI1RlwiXSA9IFwiXFx1MDY3QVwiO1xuICB0W1wiXFx1RkI2MFwiXSA9IFwiXFx1MDY3QVwiO1xuICB0W1wiXFx1RkI2MVwiXSA9IFwiXFx1MDY3QVwiO1xuICB0W1wiXFx1RkI2MlwiXSA9IFwiXFx1MDY3RlwiO1xuICB0W1wiXFx1RkI2M1wiXSA9IFwiXFx1MDY3RlwiO1xuICB0W1wiXFx1RkI2NFwiXSA9IFwiXFx1MDY3RlwiO1xuICB0W1wiXFx1RkI2NVwiXSA9IFwiXFx1MDY3RlwiO1xuICB0W1wiXFx1RkI2NlwiXSA9IFwiXFx1MDY3OVwiO1xuICB0W1wiXFx1RkI2N1wiXSA9IFwiXFx1MDY3OVwiO1xuICB0W1wiXFx1RkI2OFwiXSA9IFwiXFx1MDY3OVwiO1xuICB0W1wiXFx1RkI2OVwiXSA9IFwiXFx1MDY3OVwiO1xuICB0W1wiXFx1RkI2QVwiXSA9IFwiXFx1MDZBNFwiO1xuICB0W1wiXFx1RkI2QlwiXSA9IFwiXFx1MDZBNFwiO1xuICB0W1wiXFx1RkI2Q1wiXSA9IFwiXFx1MDZBNFwiO1xuICB0W1wiXFx1RkI2RFwiXSA9IFwiXFx1MDZBNFwiO1xuICB0W1wiXFx1RkI2RVwiXSA9IFwiXFx1MDZBNlwiO1xuICB0W1wiXFx1RkI2RlwiXSA9IFwiXFx1MDZBNlwiO1xuICB0W1wiXFx1RkI3MFwiXSA9IFwiXFx1MDZBNlwiO1xuICB0W1wiXFx1RkI3MVwiXSA9IFwiXFx1MDZBNlwiO1xuICB0W1wiXFx1RkI3MlwiXSA9IFwiXFx1MDY4NFwiO1xuICB0W1wiXFx1RkI3M1wiXSA9IFwiXFx1MDY4NFwiO1xuICB0W1wiXFx1RkI3NFwiXSA9IFwiXFx1MDY4NFwiO1xuICB0W1wiXFx1RkI3NVwiXSA9IFwiXFx1MDY4NFwiO1xuICB0W1wiXFx1RkI3NlwiXSA9IFwiXFx1MDY4M1wiO1xuICB0W1wiXFx1RkI3N1wiXSA9IFwiXFx1MDY4M1wiO1xuICB0W1wiXFx1RkI3OFwiXSA9IFwiXFx1MDY4M1wiO1xuICB0W1wiXFx1RkI3OVwiXSA9IFwiXFx1MDY4M1wiO1xuICB0W1wiXFx1RkI3QVwiXSA9IFwiXFx1MDY4NlwiO1xuICB0W1wiXFx1RkI3QlwiXSA9IFwiXFx1MDY4NlwiO1xuICB0W1wiXFx1RkI3Q1wiXSA9IFwiXFx1MDY4NlwiO1xuICB0W1wiXFx1RkI3RFwiXSA9IFwiXFx1MDY4NlwiO1xuICB0W1wiXFx1RkI3RVwiXSA9IFwiXFx1MDY4N1wiO1xuICB0W1wiXFx1RkI3RlwiXSA9IFwiXFx1MDY4N1wiO1xuICB0W1wiXFx1RkI4MFwiXSA9IFwiXFx1MDY4N1wiO1xuICB0W1wiXFx1RkI4MVwiXSA9IFwiXFx1MDY4N1wiO1xuICB0W1wiXFx1RkI4MlwiXSA9IFwiXFx1MDY4RFwiO1xuICB0W1wiXFx1RkI4M1wiXSA9IFwiXFx1MDY4RFwiO1xuICB0W1wiXFx1RkI4NFwiXSA9IFwiXFx1MDY4Q1wiO1xuICB0W1wiXFx1RkI4NVwiXSA9IFwiXFx1MDY4Q1wiO1xuICB0W1wiXFx1RkI4NlwiXSA9IFwiXFx1MDY4RVwiO1xuICB0W1wiXFx1RkI4N1wiXSA9IFwiXFx1MDY4RVwiO1xuICB0W1wiXFx1RkI4OFwiXSA9IFwiXFx1MDY4OFwiO1xuICB0W1wiXFx1RkI4OVwiXSA9IFwiXFx1MDY4OFwiO1xuICB0W1wiXFx1RkI4QVwiXSA9IFwiXFx1MDY5OFwiO1xuICB0W1wiXFx1RkI4QlwiXSA9IFwiXFx1MDY5OFwiO1xuICB0W1wiXFx1RkI4Q1wiXSA9IFwiXFx1MDY5MVwiO1xuICB0W1wiXFx1RkI4RFwiXSA9IFwiXFx1MDY5MVwiO1xuICB0W1wiXFx1RkI4RVwiXSA9IFwiXFx1MDZBOVwiO1xuICB0W1wiXFx1RkI4RlwiXSA9IFwiXFx1MDZBOVwiO1xuICB0W1wiXFx1RkI5MFwiXSA9IFwiXFx1MDZBOVwiO1xuICB0W1wiXFx1RkI5MVwiXSA9IFwiXFx1MDZBOVwiO1xuICB0W1wiXFx1RkI5MlwiXSA9IFwiXFx1MDZBRlwiO1xuICB0W1wiXFx1RkI5M1wiXSA9IFwiXFx1MDZBRlwiO1xuICB0W1wiXFx1RkI5NFwiXSA9IFwiXFx1MDZBRlwiO1xuICB0W1wiXFx1RkI5NVwiXSA9IFwiXFx1MDZBRlwiO1xuICB0W1wiXFx1RkI5NlwiXSA9IFwiXFx1MDZCM1wiO1xuICB0W1wiXFx1RkI5N1wiXSA9IFwiXFx1MDZCM1wiO1xuICB0W1wiXFx1RkI5OFwiXSA9IFwiXFx1MDZCM1wiO1xuICB0W1wiXFx1RkI5OVwiXSA9IFwiXFx1MDZCM1wiO1xuICB0W1wiXFx1RkI5QVwiXSA9IFwiXFx1MDZCMVwiO1xuICB0W1wiXFx1RkI5QlwiXSA9IFwiXFx1MDZCMVwiO1xuICB0W1wiXFx1RkI5Q1wiXSA9IFwiXFx1MDZCMVwiO1xuICB0W1wiXFx1RkI5RFwiXSA9IFwiXFx1MDZCMVwiO1xuICB0W1wiXFx1RkI5RVwiXSA9IFwiXFx1MDZCQVwiO1xuICB0W1wiXFx1RkI5RlwiXSA9IFwiXFx1MDZCQVwiO1xuICB0W1wiXFx1RkJBMFwiXSA9IFwiXFx1MDZCQlwiO1xuICB0W1wiXFx1RkJBMVwiXSA9IFwiXFx1MDZCQlwiO1xuICB0W1wiXFx1RkJBMlwiXSA9IFwiXFx1MDZCQlwiO1xuICB0W1wiXFx1RkJBM1wiXSA9IFwiXFx1MDZCQlwiO1xuICB0W1wiXFx1RkJBNFwiXSA9IFwiXFx1MDZDMFwiO1xuICB0W1wiXFx1RkJBNVwiXSA9IFwiXFx1MDZDMFwiO1xuICB0W1wiXFx1RkJBNlwiXSA9IFwiXFx1MDZDMVwiO1xuICB0W1wiXFx1RkJBN1wiXSA9IFwiXFx1MDZDMVwiO1xuICB0W1wiXFx1RkJBOFwiXSA9IFwiXFx1MDZDMVwiO1xuICB0W1wiXFx1RkJBOVwiXSA9IFwiXFx1MDZDMVwiO1xuICB0W1wiXFx1RkJBQVwiXSA9IFwiXFx1MDZCRVwiO1xuICB0W1wiXFx1RkJBQlwiXSA9IFwiXFx1MDZCRVwiO1xuICB0W1wiXFx1RkJBQ1wiXSA9IFwiXFx1MDZCRVwiO1xuICB0W1wiXFx1RkJBRFwiXSA9IFwiXFx1MDZCRVwiO1xuICB0W1wiXFx1RkJBRVwiXSA9IFwiXFx1MDZEMlwiO1xuICB0W1wiXFx1RkJBRlwiXSA9IFwiXFx1MDZEMlwiO1xuICB0W1wiXFx1RkJCMFwiXSA9IFwiXFx1MDZEM1wiO1xuICB0W1wiXFx1RkJCMVwiXSA9IFwiXFx1MDZEM1wiO1xuICB0W1wiXFx1RkJEM1wiXSA9IFwiXFx1MDZBRFwiO1xuICB0W1wiXFx1RkJENFwiXSA9IFwiXFx1MDZBRFwiO1xuICB0W1wiXFx1RkJENVwiXSA9IFwiXFx1MDZBRFwiO1xuICB0W1wiXFx1RkJENlwiXSA9IFwiXFx1MDZBRFwiO1xuICB0W1wiXFx1RkJEN1wiXSA9IFwiXFx1MDZDN1wiO1xuICB0W1wiXFx1RkJEOFwiXSA9IFwiXFx1MDZDN1wiO1xuICB0W1wiXFx1RkJEOVwiXSA9IFwiXFx1MDZDNlwiO1xuICB0W1wiXFx1RkJEQVwiXSA9IFwiXFx1MDZDNlwiO1xuICB0W1wiXFx1RkJEQlwiXSA9IFwiXFx1MDZDOFwiO1xuICB0W1wiXFx1RkJEQ1wiXSA9IFwiXFx1MDZDOFwiO1xuICB0W1wiXFx1RkJERFwiXSA9IFwiXFx1MDY3N1wiO1xuICB0W1wiXFx1RkJERVwiXSA9IFwiXFx1MDZDQlwiO1xuICB0W1wiXFx1RkJERlwiXSA9IFwiXFx1MDZDQlwiO1xuICB0W1wiXFx1RkJFMFwiXSA9IFwiXFx1MDZDNVwiO1xuICB0W1wiXFx1RkJFMVwiXSA9IFwiXFx1MDZDNVwiO1xuICB0W1wiXFx1RkJFMlwiXSA9IFwiXFx1MDZDOVwiO1xuICB0W1wiXFx1RkJFM1wiXSA9IFwiXFx1MDZDOVwiO1xuICB0W1wiXFx1RkJFNFwiXSA9IFwiXFx1MDZEMFwiO1xuICB0W1wiXFx1RkJFNVwiXSA9IFwiXFx1MDZEMFwiO1xuICB0W1wiXFx1RkJFNlwiXSA9IFwiXFx1MDZEMFwiO1xuICB0W1wiXFx1RkJFN1wiXSA9IFwiXFx1MDZEMFwiO1xuICB0W1wiXFx1RkJFOFwiXSA9IFwiXFx1MDY0OVwiO1xuICB0W1wiXFx1RkJFOVwiXSA9IFwiXFx1MDY0OVwiO1xuICB0W1wiXFx1RkJFQVwiXSA9IFwiXFx1MDYyNlxcdTA2MjdcIjtcbiAgdFtcIlxcdUZCRUJcIl0gPSBcIlxcdTA2MjZcXHUwNjI3XCI7XG4gIHRbXCJcXHVGQkVDXCJdID0gXCJcXHUwNjI2XFx1MDZENVwiO1xuICB0W1wiXFx1RkJFRFwiXSA9IFwiXFx1MDYyNlxcdTA2RDVcIjtcbiAgdFtcIlxcdUZCRUVcIl0gPSBcIlxcdTA2MjZcXHUwNjQ4XCI7XG4gIHRbXCJcXHVGQkVGXCJdID0gXCJcXHUwNjI2XFx1MDY0OFwiO1xuICB0W1wiXFx1RkJGMFwiXSA9IFwiXFx1MDYyNlxcdTA2QzdcIjtcbiAgdFtcIlxcdUZCRjFcIl0gPSBcIlxcdTA2MjZcXHUwNkM3XCI7XG4gIHRbXCJcXHVGQkYyXCJdID0gXCJcXHUwNjI2XFx1MDZDNlwiO1xuICB0W1wiXFx1RkJGM1wiXSA9IFwiXFx1MDYyNlxcdTA2QzZcIjtcbiAgdFtcIlxcdUZCRjRcIl0gPSBcIlxcdTA2MjZcXHUwNkM4XCI7XG4gIHRbXCJcXHVGQkY1XCJdID0gXCJcXHUwNjI2XFx1MDZDOFwiO1xuICB0W1wiXFx1RkJGNlwiXSA9IFwiXFx1MDYyNlxcdTA2RDBcIjtcbiAgdFtcIlxcdUZCRjdcIl0gPSBcIlxcdTA2MjZcXHUwNkQwXCI7XG4gIHRbXCJcXHVGQkY4XCJdID0gXCJcXHUwNjI2XFx1MDZEMFwiO1xuICB0W1wiXFx1RkJGOVwiXSA9IFwiXFx1MDYyNlxcdTA2NDlcIjtcbiAgdFtcIlxcdUZCRkFcIl0gPSBcIlxcdTA2MjZcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQkZCXCJdID0gXCJcXHUwNjI2XFx1MDY0OVwiO1xuICB0W1wiXFx1RkJGQ1wiXSA9IFwiXFx1MDZDQ1wiO1xuICB0W1wiXFx1RkJGRFwiXSA9IFwiXFx1MDZDQ1wiO1xuICB0W1wiXFx1RkJGRVwiXSA9IFwiXFx1MDZDQ1wiO1xuICB0W1wiXFx1RkJGRlwiXSA9IFwiXFx1MDZDQ1wiO1xuICB0W1wiXFx1RkMwMFwiXSA9IFwiXFx1MDYyNlxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDMDFcIl0gPSBcIlxcdTA2MjZcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzAyXCJdID0gXCJcXHUwNjI2XFx1MDY0NVwiO1xuICB0W1wiXFx1RkMwM1wiXSA9IFwiXFx1MDYyNlxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDMDRcIl0gPSBcIlxcdTA2MjZcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQzA1XCJdID0gXCJcXHUwNjI4XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMwNlwiXSA9IFwiXFx1MDYyOFxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDMDdcIl0gPSBcIlxcdTA2MjhcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQzA4XCJdID0gXCJcXHUwNjI4XFx1MDY0NVwiO1xuICB0W1wiXFx1RkMwOVwiXSA9IFwiXFx1MDYyOFxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDMEFcIl0gPSBcIlxcdTA2MjhcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQzBCXCJdID0gXCJcXHUwNjJBXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMwQ1wiXSA9IFwiXFx1MDYyQVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDMERcIl0gPSBcIlxcdTA2MkFcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQzBFXCJdID0gXCJcXHUwNjJBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkMwRlwiXSA9IFwiXFx1MDYyQVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDMTBcIl0gPSBcIlxcdTA2MkFcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQzExXCJdID0gXCJcXHUwNjJCXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMxMlwiXSA9IFwiXFx1MDYyQlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMTNcIl0gPSBcIlxcdTA2MkJcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzE0XCJdID0gXCJcXHUwNjJCXFx1MDY0QVwiO1xuICB0W1wiXFx1RkMxNVwiXSA9IFwiXFx1MDYyQ1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZDMTZcIl0gPSBcIlxcdTA2MkNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzE3XCJdID0gXCJcXHUwNjJEXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMxOFwiXSA9IFwiXFx1MDYyRFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMTlcIl0gPSBcIlxcdTA2MkVcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzFBXCJdID0gXCJcXHUwNjJFXFx1MDYyRFwiO1xuICB0W1wiXFx1RkMxQlwiXSA9IFwiXFx1MDYyRVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMUNcIl0gPSBcIlxcdTA2MzNcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzFEXCJdID0gXCJcXHUwNjMzXFx1MDYyRFwiO1xuICB0W1wiXFx1RkMxRVwiXSA9IFwiXFx1MDYzM1xcdTA2MkVcIjtcbiAgdFtcIlxcdUZDMUZcIl0gPSBcIlxcdTA2MzNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzIwXCJdID0gXCJcXHUwNjM1XFx1MDYyRFwiO1xuICB0W1wiXFx1RkMyMVwiXSA9IFwiXFx1MDYzNVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMjJcIl0gPSBcIlxcdTA2MzZcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzIzXCJdID0gXCJcXHUwNjM2XFx1MDYyRFwiO1xuICB0W1wiXFx1RkMyNFwiXSA9IFwiXFx1MDYzNlxcdTA2MkVcIjtcbiAgdFtcIlxcdUZDMjVcIl0gPSBcIlxcdTA2MzZcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzI2XCJdID0gXCJcXHUwNjM3XFx1MDYyRFwiO1xuICB0W1wiXFx1RkMyN1wiXSA9IFwiXFx1MDYzN1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMjhcIl0gPSBcIlxcdTA2MzhcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzI5XCJdID0gXCJcXHUwNjM5XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMyQVwiXSA9IFwiXFx1MDYzOVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMkJcIl0gPSBcIlxcdTA2M0FcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzJDXCJdID0gXCJcXHUwNjNBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkMyRFwiXSA9IFwiXFx1MDY0MVxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDMkVcIl0gPSBcIlxcdTA2NDFcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzJGXCJdID0gXCJcXHUwNjQxXFx1MDYyRVwiO1xuICB0W1wiXFx1RkMzMFwiXSA9IFwiXFx1MDY0MVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMzFcIl0gPSBcIlxcdTA2NDFcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzMyXCJdID0gXCJcXHUwNjQxXFx1MDY0QVwiO1xuICB0W1wiXFx1RkMzM1wiXSA9IFwiXFx1MDY0MlxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDMzRcIl0gPSBcIlxcdTA2NDJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzM1XCJdID0gXCJcXHUwNjQyXFx1MDY0OVwiO1xuICB0W1wiXFx1RkMzNlwiXSA9IFwiXFx1MDY0MlxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDMzdcIl0gPSBcIlxcdTA2NDNcXHUwNjI3XCI7XG4gIHRbXCJcXHVGQzM4XCJdID0gXCJcXHUwNjQzXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMzOVwiXSA9IFwiXFx1MDY0M1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZDM0FcIl0gPSBcIlxcdTA2NDNcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQzNCXCJdID0gXCJcXHUwNjQzXFx1MDY0NFwiO1xuICB0W1wiXFx1RkMzQ1wiXSA9IFwiXFx1MDY0M1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDM0RcIl0gPSBcIlxcdTA2NDNcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzNFXCJdID0gXCJcXHUwNjQzXFx1MDY0QVwiO1xuICB0W1wiXFx1RkMzRlwiXSA9IFwiXFx1MDY0NFxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDNDBcIl0gPSBcIlxcdTA2NDRcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzQxXCJdID0gXCJcXHUwNjQ0XFx1MDYyRVwiO1xuICB0W1wiXFx1RkM0MlwiXSA9IFwiXFx1MDY0NFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNDNcIl0gPSBcIlxcdTA2NDRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzQ0XCJdID0gXCJcXHUwNjQ0XFx1MDY0QVwiO1xuICB0W1wiXFx1RkM0NVwiXSA9IFwiXFx1MDY0NVxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDNDZcIl0gPSBcIlxcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzQ3XCJdID0gXCJcXHUwNjQ1XFx1MDYyRVwiO1xuICB0W1wiXFx1RkM0OFwiXSA9IFwiXFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNDlcIl0gPSBcIlxcdTA2NDVcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzRBXCJdID0gXCJcXHUwNjQ1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkM0QlwiXSA9IFwiXFx1MDY0NlxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDNENcIl0gPSBcIlxcdTA2NDZcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzREXCJdID0gXCJcXHUwNjQ2XFx1MDYyRVwiO1xuICB0W1wiXFx1RkM0RVwiXSA9IFwiXFx1MDY0NlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNEZcIl0gPSBcIlxcdTA2NDZcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzUwXCJdID0gXCJcXHUwNjQ2XFx1MDY0QVwiO1xuICB0W1wiXFx1RkM1MVwiXSA9IFwiXFx1MDY0N1xcdTA2MkNcIjtcbiAgdFtcIlxcdUZDNTJcIl0gPSBcIlxcdTA2NDdcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzUzXCJdID0gXCJcXHUwNjQ3XFx1MDY0OVwiO1xuICB0W1wiXFx1RkM1NFwiXSA9IFwiXFx1MDY0N1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNTVcIl0gPSBcIlxcdTA2NEFcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzU2XCJdID0gXCJcXHUwNjRBXFx1MDYyRFwiO1xuICB0W1wiXFx1RkM1N1wiXSA9IFwiXFx1MDY0QVxcdTA2MkVcIjtcbiAgdFtcIlxcdUZDNThcIl0gPSBcIlxcdTA2NEFcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzU5XCJdID0gXCJcXHUwNjRBXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM1QVwiXSA9IFwiXFx1MDY0QVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNUJcIl0gPSBcIlxcdTA2MzBcXHUwNjcwXCI7XG4gIHRbXCJcXHVGQzVDXCJdID0gXCJcXHUwNjMxXFx1MDY3MFwiO1xuICB0W1wiXFx1RkM1RFwiXSA9IFwiXFx1MDY0OVxcdTA2NzBcIjtcbiAgdFtcIlxcdUZDNUVcIl0gPSBcIlxcdTAwMjBcXHUwNjRDXFx1MDY1MVwiO1xuICB0W1wiXFx1RkM1RlwiXSA9IFwiXFx1MDAyMFxcdTA2NERcXHUwNjUxXCI7XG4gIHRbXCJcXHVGQzYwXCJdID0gXCJcXHUwMDIwXFx1MDY0RVxcdTA2NTFcIjtcbiAgdFtcIlxcdUZDNjFcIl0gPSBcIlxcdTAwMjBcXHUwNjRGXFx1MDY1MVwiO1xuICB0W1wiXFx1RkM2MlwiXSA9IFwiXFx1MDAyMFxcdTA2NTBcXHUwNjUxXCI7XG4gIHRbXCJcXHVGQzYzXCJdID0gXCJcXHUwMDIwXFx1MDY1MVxcdTA2NzBcIjtcbiAgdFtcIlxcdUZDNjRcIl0gPSBcIlxcdTA2MjZcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzY1XCJdID0gXCJcXHUwNjI2XFx1MDYzMlwiO1xuICB0W1wiXFx1RkM2NlwiXSA9IFwiXFx1MDYyNlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNjdcIl0gPSBcIlxcdTA2MjZcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzY4XCJdID0gXCJcXHUwNjI2XFx1MDY0OVwiO1xuICB0W1wiXFx1RkM2OVwiXSA9IFwiXFx1MDYyNlxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNkFcIl0gPSBcIlxcdTA2MjhcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzZCXCJdID0gXCJcXHUwNjI4XFx1MDYzMlwiO1xuICB0W1wiXFx1RkM2Q1wiXSA9IFwiXFx1MDYyOFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNkRcIl0gPSBcIlxcdTA2MjhcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzZFXCJdID0gXCJcXHUwNjI4XFx1MDY0OVwiO1xuICB0W1wiXFx1RkM2RlwiXSA9IFwiXFx1MDYyOFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNzBcIl0gPSBcIlxcdTA2MkFcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzcxXCJdID0gXCJcXHUwNjJBXFx1MDYzMlwiO1xuICB0W1wiXFx1RkM3MlwiXSA9IFwiXFx1MDYyQVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNzNcIl0gPSBcIlxcdTA2MkFcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzc0XCJdID0gXCJcXHUwNjJBXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM3NVwiXSA9IFwiXFx1MDYyQVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNzZcIl0gPSBcIlxcdTA2MkJcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzc3XCJdID0gXCJcXHUwNjJCXFx1MDYzMlwiO1xuICB0W1wiXFx1RkM3OFwiXSA9IFwiXFx1MDYyQlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNzlcIl0gPSBcIlxcdTA2MkJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzdBXCJdID0gXCJcXHUwNjJCXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM3QlwiXSA9IFwiXFx1MDYyQlxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDN0NcIl0gPSBcIlxcdTA2NDFcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzdEXCJdID0gXCJcXHUwNjQxXFx1MDY0QVwiO1xuICB0W1wiXFx1RkM3RVwiXSA9IFwiXFx1MDY0MlxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDN0ZcIl0gPSBcIlxcdTA2NDJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQzgwXCJdID0gXCJcXHUwNjQzXFx1MDYyN1wiO1xuICB0W1wiXFx1RkM4MVwiXSA9IFwiXFx1MDY0M1xcdTA2NDRcIjtcbiAgdFtcIlxcdUZDODJcIl0gPSBcIlxcdTA2NDNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzgzXCJdID0gXCJcXHUwNjQzXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM4NFwiXSA9IFwiXFx1MDY0M1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZDODVcIl0gPSBcIlxcdTA2NDRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzg2XCJdID0gXCJcXHUwNjQ0XFx1MDY0OVwiO1xuICB0W1wiXFx1RkM4N1wiXSA9IFwiXFx1MDY0NFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDODhcIl0gPSBcIlxcdTA2NDVcXHUwNjI3XCI7XG4gIHRbXCJcXHVGQzg5XCJdID0gXCJcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkM4QVwiXSA9IFwiXFx1MDY0NlxcdTA2MzFcIjtcbiAgdFtcIlxcdUZDOEJcIl0gPSBcIlxcdTA2NDZcXHUwNjMyXCI7XG4gIHRbXCJcXHVGQzhDXCJdID0gXCJcXHUwNjQ2XFx1MDY0NVwiO1xuICB0W1wiXFx1RkM4RFwiXSA9IFwiXFx1MDY0NlxcdTA2NDZcIjtcbiAgdFtcIlxcdUZDOEVcIl0gPSBcIlxcdTA2NDZcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzhGXCJdID0gXCJcXHUwNjQ2XFx1MDY0QVwiO1xuICB0W1wiXFx1RkM5MFwiXSA9IFwiXFx1MDY0OVxcdTA2NzBcIjtcbiAgdFtcIlxcdUZDOTFcIl0gPSBcIlxcdTA2NEFcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzkyXCJdID0gXCJcXHUwNjRBXFx1MDYzMlwiO1xuICB0W1wiXFx1RkM5M1wiXSA9IFwiXFx1MDY0QVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDOTRcIl0gPSBcIlxcdTA2NEFcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzk1XCJdID0gXCJcXHUwNjRBXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM5NlwiXSA9IFwiXFx1MDY0QVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDOTdcIl0gPSBcIlxcdTA2MjZcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzk4XCJdID0gXCJcXHUwNjI2XFx1MDYyRFwiO1xuICB0W1wiXFx1RkM5OVwiXSA9IFwiXFx1MDYyNlxcdTA2MkVcIjtcbiAgdFtcIlxcdUZDOUFcIl0gPSBcIlxcdTA2MjZcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzlCXCJdID0gXCJcXHUwNjI2XFx1MDY0N1wiO1xuICB0W1wiXFx1RkM5Q1wiXSA9IFwiXFx1MDYyOFxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDOURcIl0gPSBcIlxcdTA2MjhcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzlFXCJdID0gXCJcXHUwNjI4XFx1MDYyRVwiO1xuICB0W1wiXFx1RkM5RlwiXSA9IFwiXFx1MDYyOFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQTBcIl0gPSBcIlxcdTA2MjhcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0ExXCJdID0gXCJcXHUwNjJBXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNBMlwiXSA9IFwiXFx1MDYyQVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDQTNcIl0gPSBcIlxcdTA2MkFcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0E0XCJdID0gXCJcXHUwNjJBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNBNVwiXSA9IFwiXFx1MDYyQVxcdTA2NDdcIjtcbiAgdFtcIlxcdUZDQTZcIl0gPSBcIlxcdTA2MkJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0E3XCJdID0gXCJcXHUwNjJDXFx1MDYyRFwiO1xuICB0W1wiXFx1RkNBOFwiXSA9IFwiXFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQTlcIl0gPSBcIlxcdTA2MkRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQ0FBXCJdID0gXCJcXHUwNjJEXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNBQlwiXSA9IFwiXFx1MDYyRVxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDQUNcIl0gPSBcIlxcdTA2MkVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0FEXCJdID0gXCJcXHUwNjMzXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNBRVwiXSA9IFwiXFx1MDYzM1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZDQUZcIl0gPSBcIlxcdTA2MzNcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0IwXCJdID0gXCJcXHUwNjMzXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNCMVwiXSA9IFwiXFx1MDYzNVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDQjJcIl0gPSBcIlxcdTA2MzVcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0IzXCJdID0gXCJcXHUwNjM1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkNCNFwiXSA9IFwiXFx1MDYzNlxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDQjVcIl0gPSBcIlxcdTA2MzZcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQ0I2XCJdID0gXCJcXHUwNjM2XFx1MDYyRVwiO1xuICB0W1wiXFx1RkNCN1wiXSA9IFwiXFx1MDYzNlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQjhcIl0gPSBcIlxcdTA2MzdcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQ0I5XCJdID0gXCJcXHUwNjM4XFx1MDY0NVwiO1xuICB0W1wiXFx1RkNCQVwiXSA9IFwiXFx1MDYzOVxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDQkJcIl0gPSBcIlxcdTA2MzlcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0JDXCJdID0gXCJcXHUwNjNBXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNCRFwiXSA9IFwiXFx1MDYzQVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQkVcIl0gPSBcIlxcdTA2NDFcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQ0JGXCJdID0gXCJcXHUwNjQxXFx1MDYyRFwiO1xuICB0W1wiXFx1RkNDMFwiXSA9IFwiXFx1MDY0MVxcdTA2MkVcIjtcbiAgdFtcIlxcdUZDQzFcIl0gPSBcIlxcdTA2NDFcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0MyXCJdID0gXCJcXHUwNjQyXFx1MDYyRFwiO1xuICB0W1wiXFx1RkNDM1wiXSA9IFwiXFx1MDY0MlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQzRcIl0gPSBcIlxcdTA2NDNcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQ0M1XCJdID0gXCJcXHUwNjQzXFx1MDYyRFwiO1xuICB0W1wiXFx1RkNDNlwiXSA9IFwiXFx1MDY0M1xcdTA2MkVcIjtcbiAgdFtcIlxcdUZDQzdcIl0gPSBcIlxcdTA2NDNcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGQ0M4XCJdID0gXCJcXHUwNjQzXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNDOVwiXSA9IFwiXFx1MDY0NFxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDQ0FcIl0gPSBcIlxcdTA2NDRcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQ0NCXCJdID0gXCJcXHUwNjQ0XFx1MDYyRVwiO1xuICB0W1wiXFx1RkNDQ1wiXSA9IFwiXFx1MDY0NFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQ0RcIl0gPSBcIlxcdTA2NDRcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0NFXCJdID0gXCJcXHUwNjQ1XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNDRlwiXSA9IFwiXFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDRDBcIl0gPSBcIlxcdTA2NDVcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0QxXCJdID0gXCJcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkNEMlwiXSA9IFwiXFx1MDY0NlxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDRDNcIl0gPSBcIlxcdTA2NDZcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQ0Q0XCJdID0gXCJcXHUwNjQ2XFx1MDYyRVwiO1xuICB0W1wiXFx1RkNENVwiXSA9IFwiXFx1MDY0NlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRDZcIl0gPSBcIlxcdTA2NDZcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0Q3XCJdID0gXCJcXHUwNjQ3XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNEOFwiXSA9IFwiXFx1MDY0N1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRDlcIl0gPSBcIlxcdTA2NDdcXHUwNjcwXCI7XG4gIHRbXCJcXHVGQ0RBXCJdID0gXCJcXHUwNjRBXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNEQlwiXSA9IFwiXFx1MDY0QVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDRENcIl0gPSBcIlxcdTA2NEFcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0REXCJdID0gXCJcXHUwNjRBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNERVwiXSA9IFwiXFx1MDY0QVxcdTA2NDdcIjtcbiAgdFtcIlxcdUZDREZcIl0gPSBcIlxcdTA2MjZcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0UwXCJdID0gXCJcXHUwNjI2XFx1MDY0N1wiO1xuICB0W1wiXFx1RkNFMVwiXSA9IFwiXFx1MDYyOFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRTJcIl0gPSBcIlxcdTA2MjhcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0UzXCJdID0gXCJcXHUwNjJBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNFNFwiXSA9IFwiXFx1MDYyQVxcdTA2NDdcIjtcbiAgdFtcIlxcdUZDRTVcIl0gPSBcIlxcdTA2MkJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0U2XCJdID0gXCJcXHUwNjJCXFx1MDY0N1wiO1xuICB0W1wiXFx1RkNFN1wiXSA9IFwiXFx1MDYzM1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRThcIl0gPSBcIlxcdTA2MzNcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0U5XCJdID0gXCJcXHUwNjM0XFx1MDY0NVwiO1xuICB0W1wiXFx1RkNFQVwiXSA9IFwiXFx1MDYzNFxcdTA2NDdcIjtcbiAgdFtcIlxcdUZDRUJcIl0gPSBcIlxcdTA2NDNcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGQ0VDXCJdID0gXCJcXHUwNjQzXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNFRFwiXSA9IFwiXFx1MDY0NFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRUVcIl0gPSBcIlxcdTA2NDZcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0VGXCJdID0gXCJcXHUwNjQ2XFx1MDY0N1wiO1xuICB0W1wiXFx1RkNGMFwiXSA9IFwiXFx1MDY0QVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRjFcIl0gPSBcIlxcdTA2NEFcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0YyXCJdID0gXCJcXHUwNjQwXFx1MDY0RVxcdTA2NTFcIjtcbiAgdFtcIlxcdUZDRjNcIl0gPSBcIlxcdTA2NDBcXHUwNjRGXFx1MDY1MVwiO1xuICB0W1wiXFx1RkNGNFwiXSA9IFwiXFx1MDY0MFxcdTA2NTBcXHUwNjUxXCI7XG4gIHRbXCJcXHVGQ0Y1XCJdID0gXCJcXHUwNjM3XFx1MDY0OVwiO1xuICB0W1wiXFx1RkNGNlwiXSA9IFwiXFx1MDYzN1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZDRjdcIl0gPSBcIlxcdTA2MzlcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQ0Y4XCJdID0gXCJcXHUwNjM5XFx1MDY0QVwiO1xuICB0W1wiXFx1RkNGOVwiXSA9IFwiXFx1MDYzQVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDRkFcIl0gPSBcIlxcdTA2M0FcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQ0ZCXCJdID0gXCJcXHUwNjMzXFx1MDY0OVwiO1xuICB0W1wiXFx1RkNGQ1wiXSA9IFwiXFx1MDYzM1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZDRkRcIl0gPSBcIlxcdTA2MzRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQ0ZFXCJdID0gXCJcXHUwNjM0XFx1MDY0QVwiO1xuICB0W1wiXFx1RkNGRlwiXSA9IFwiXFx1MDYyRFxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMDBcIl0gPSBcIlxcdTA2MkRcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDAxXCJdID0gXCJcXHUwNjJDXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQwMlwiXSA9IFwiXFx1MDYyQ1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMDNcIl0gPSBcIlxcdTA2MkVcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDA0XCJdID0gXCJcXHUwNjJFXFx1MDY0QVwiO1xuICB0W1wiXFx1RkQwNVwiXSA9IFwiXFx1MDYzNVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMDZcIl0gPSBcIlxcdTA2MzVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDA3XCJdID0gXCJcXHUwNjM2XFx1MDY0OVwiO1xuICB0W1wiXFx1RkQwOFwiXSA9IFwiXFx1MDYzNlxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMDlcIl0gPSBcIlxcdTA2MzRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDBBXCJdID0gXCJcXHUwNjM0XFx1MDYyRFwiO1xuICB0W1wiXFx1RkQwQlwiXSA9IFwiXFx1MDYzNFxcdTA2MkVcIjtcbiAgdFtcIlxcdUZEMENcIl0gPSBcIlxcdTA2MzRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDBEXCJdID0gXCJcXHUwNjM0XFx1MDYzMVwiO1xuICB0W1wiXFx1RkQwRVwiXSA9IFwiXFx1MDYzM1xcdTA2MzFcIjtcbiAgdFtcIlxcdUZEMEZcIl0gPSBcIlxcdTA2MzVcXHUwNjMxXCI7XG4gIHRbXCJcXHVGRDEwXCJdID0gXCJcXHUwNjM2XFx1MDYzMVwiO1xuICB0W1wiXFx1RkQxMVwiXSA9IFwiXFx1MDYzN1xcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMTJcIl0gPSBcIlxcdTA2MzdcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDEzXCJdID0gXCJcXHUwNjM5XFx1MDY0OVwiO1xuICB0W1wiXFx1RkQxNFwiXSA9IFwiXFx1MDYzOVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMTVcIl0gPSBcIlxcdTA2M0FcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDE2XCJdID0gXCJcXHUwNjNBXFx1MDY0QVwiO1xuICB0W1wiXFx1RkQxN1wiXSA9IFwiXFx1MDYzM1xcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMThcIl0gPSBcIlxcdTA2MzNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDE5XCJdID0gXCJcXHUwNjM0XFx1MDY0OVwiO1xuICB0W1wiXFx1RkQxQVwiXSA9IFwiXFx1MDYzNFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMUJcIl0gPSBcIlxcdTA2MkRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDFDXCJdID0gXCJcXHUwNjJEXFx1MDY0QVwiO1xuICB0W1wiXFx1RkQxRFwiXSA9IFwiXFx1MDYyQ1xcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMUVcIl0gPSBcIlxcdTA2MkNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDFGXCJdID0gXCJcXHUwNjJFXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQyMFwiXSA9IFwiXFx1MDYyRVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMjFcIl0gPSBcIlxcdTA2MzVcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDIyXCJdID0gXCJcXHUwNjM1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkQyM1wiXSA9IFwiXFx1MDYzNlxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMjRcIl0gPSBcIlxcdTA2MzZcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDI1XCJdID0gXCJcXHUwNjM0XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQyNlwiXSA9IFwiXFx1MDYzNFxcdTA2MkRcIjtcbiAgdFtcIlxcdUZEMjdcIl0gPSBcIlxcdTA2MzRcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRDI4XCJdID0gXCJcXHUwNjM0XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQyOVwiXSA9IFwiXFx1MDYzNFxcdTA2MzFcIjtcbiAgdFtcIlxcdUZEMkFcIl0gPSBcIlxcdTA2MzNcXHUwNjMxXCI7XG4gIHRbXCJcXHVGRDJCXCJdID0gXCJcXHUwNjM1XFx1MDYzMVwiO1xuICB0W1wiXFx1RkQyQ1wiXSA9IFwiXFx1MDYzNlxcdTA2MzFcIjtcbiAgdFtcIlxcdUZEMkRcIl0gPSBcIlxcdTA2MzRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDJFXCJdID0gXCJcXHUwNjM0XFx1MDYyRFwiO1xuICB0W1wiXFx1RkQyRlwiXSA9IFwiXFx1MDYzNFxcdTA2MkVcIjtcbiAgdFtcIlxcdUZEMzBcIl0gPSBcIlxcdTA2MzRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDMxXCJdID0gXCJcXHUwNjMzXFx1MDY0N1wiO1xuICB0W1wiXFx1RkQzMlwiXSA9IFwiXFx1MDYzNFxcdTA2NDdcIjtcbiAgdFtcIlxcdUZEMzNcIl0gPSBcIlxcdTA2MzdcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDM0XCJdID0gXCJcXHUwNjMzXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQzNVwiXSA9IFwiXFx1MDYzM1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZEMzZcIl0gPSBcIlxcdTA2MzNcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRDM3XCJdID0gXCJcXHUwNjM0XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQzOFwiXSA9IFwiXFx1MDYzNFxcdTA2MkRcIjtcbiAgdFtcIlxcdUZEMzlcIl0gPSBcIlxcdTA2MzRcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRDNBXCJdID0gXCJcXHUwNjM3XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQzQlwiXSA9IFwiXFx1MDYzOFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZEM0NcIl0gPSBcIlxcdTA2MjdcXHUwNjRCXCI7XG4gIHRbXCJcXHVGRDNEXCJdID0gXCJcXHUwNjI3XFx1MDY0QlwiO1xuICB0W1wiXFx1RkQ1MFwiXSA9IFwiXFx1MDYyQVxcdTA2MkNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDUxXCJdID0gXCJcXHUwNjJBXFx1MDYyRFxcdTA2MkNcIjtcbiAgdFtcIlxcdUZENTJcIl0gPSBcIlxcdTA2MkFcXHUwNjJEXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ1M1wiXSA9IFwiXFx1MDYyQVxcdTA2MkRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDU0XCJdID0gXCJcXHUwNjJBXFx1MDYyRVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENTVcIl0gPSBcIlxcdTA2MkFcXHUwNjQ1XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ1NlwiXSA9IFwiXFx1MDYyQVxcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDU3XCJdID0gXCJcXHUwNjJBXFx1MDY0NVxcdTA2MkVcIjtcbiAgdFtcIlxcdUZENThcIl0gPSBcIlxcdTA2MkNcXHUwNjQ1XFx1MDYyRFwiO1xuICB0W1wiXFx1RkQ1OVwiXSA9IFwiXFx1MDYyQ1xcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDVBXCJdID0gXCJcXHUwNjJEXFx1MDY0NVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZENUJcIl0gPSBcIlxcdTA2MkRcXHUwNjQ1XFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ1Q1wiXSA9IFwiXFx1MDYzM1xcdTA2MkRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDVEXCJdID0gXCJcXHUwNjMzXFx1MDYyQ1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZENUVcIl0gPSBcIlxcdTA2MzNcXHUwNjJDXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ1RlwiXSA9IFwiXFx1MDYzM1xcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDYwXCJdID0gXCJcXHUwNjMzXFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZENjFcIl0gPSBcIlxcdTA2MzNcXHUwNjQ1XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ2MlwiXSA9IFwiXFx1MDYzM1xcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDYzXCJdID0gXCJcXHUwNjMzXFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENjRcIl0gPSBcIlxcdTA2MzVcXHUwNjJEXFx1MDYyRFwiO1xuICB0W1wiXFx1RkQ2NVwiXSA9IFwiXFx1MDYzNVxcdTA2MkRcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDY2XCJdID0gXCJcXHUwNjM1XFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENjdcIl0gPSBcIlxcdTA2MzRcXHUwNjJEXFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ2OFwiXSA9IFwiXFx1MDYzNFxcdTA2MkRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDY5XCJdID0gXCJcXHUwNjM0XFx1MDYyQ1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZENkFcIl0gPSBcIlxcdTA2MzRcXHUwNjQ1XFx1MDYyRVwiO1xuICB0W1wiXFx1RkQ2QlwiXSA9IFwiXFx1MDYzNFxcdTA2NDVcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRDZDXCJdID0gXCJcXHUwNjM0XFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENkRcIl0gPSBcIlxcdTA2MzRcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ2RVwiXSA9IFwiXFx1MDYzNlxcdTA2MkRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDZGXCJdID0gXCJcXHUwNjM2XFx1MDYyRVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENzBcIl0gPSBcIlxcdTA2MzZcXHUwNjJFXFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3MVwiXSA9IFwiXFx1MDYzN1xcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDcyXCJdID0gXCJcXHUwNjM3XFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZENzNcIl0gPSBcIlxcdTA2MzdcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3NFwiXSA9IFwiXFx1MDYzN1xcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDc1XCJdID0gXCJcXHUwNjM5XFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZENzZcIl0gPSBcIlxcdTA2MzlcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3N1wiXSA9IFwiXFx1MDYzOVxcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDc4XCJdID0gXCJcXHUwNjM5XFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZENzlcIl0gPSBcIlxcdTA2M0FcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3QVwiXSA9IFwiXFx1MDYzQVxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDdCXCJdID0gXCJcXHUwNjNBXFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEN0NcIl0gPSBcIlxcdTA2NDFcXHUwNjJFXFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3RFwiXSA9IFwiXFx1MDY0MVxcdTA2MkVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDdFXCJdID0gXCJcXHUwNjQyXFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZEN0ZcIl0gPSBcIlxcdTA2NDJcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ4MFwiXSA9IFwiXFx1MDY0NFxcdTA2MkRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDgxXCJdID0gXCJcXHUwNjQ0XFx1MDYyRFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEODJcIl0gPSBcIlxcdTA2NDRcXHUwNjJEXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ4M1wiXSA9IFwiXFx1MDY0NFxcdTA2MkNcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDg0XCJdID0gXCJcXHUwNjQ0XFx1MDYyQ1xcdTA2MkNcIjtcbiAgdFtcIlxcdUZEODVcIl0gPSBcIlxcdTA2NDRcXHUwNjJFXFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ4NlwiXSA9IFwiXFx1MDY0NFxcdTA2MkVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDg3XCJdID0gXCJcXHUwNjQ0XFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZEODhcIl0gPSBcIlxcdTA2NDRcXHUwNjQ1XFx1MDYyRFwiO1xuICB0W1wiXFx1RkQ4OVwiXSA9IFwiXFx1MDY0NVxcdTA2MkRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDhBXCJdID0gXCJcXHUwNjQ1XFx1MDYyRFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZEOEJcIl0gPSBcIlxcdTA2NDVcXHUwNjJEXFx1MDY0QVwiO1xuICB0W1wiXFx1RkQ4Q1wiXSA9IFwiXFx1MDY0NVxcdTA2MkNcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDhEXCJdID0gXCJcXHUwNjQ1XFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZEOEVcIl0gPSBcIlxcdTA2NDVcXHUwNjJFXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ4RlwiXSA9IFwiXFx1MDY0NVxcdTA2MkVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDkyXCJdID0gXCJcXHUwNjQ1XFx1MDYyQ1xcdTA2MkVcIjtcbiAgdFtcIlxcdUZEOTNcIl0gPSBcIlxcdTA2NDdcXHUwNjQ1XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ5NFwiXSA9IFwiXFx1MDY0N1xcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDk1XCJdID0gXCJcXHUwNjQ2XFx1MDYyRFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZEOTZcIl0gPSBcIlxcdTA2NDZcXHUwNjJEXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ5N1wiXSA9IFwiXFx1MDY0NlxcdTA2MkNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDk4XCJdID0gXCJcXHUwNjQ2XFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZEOTlcIl0gPSBcIlxcdTA2NDZcXHUwNjJDXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ5QVwiXSA9IFwiXFx1MDY0NlxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDlCXCJdID0gXCJcXHUwNjQ2XFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEOUNcIl0gPSBcIlxcdTA2NEFcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ5RFwiXSA9IFwiXFx1MDY0QVxcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDlFXCJdID0gXCJcXHUwNjI4XFx1MDYyRVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEOUZcIl0gPSBcIlxcdTA2MkFcXHUwNjJDXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRBMFwiXSA9IFwiXFx1MDYyQVxcdTA2MkNcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGREExXCJdID0gXCJcXHUwNjJBXFx1MDYyRVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQTJcIl0gPSBcIlxcdTA2MkFcXHUwNjJFXFx1MDY0OVwiO1xuICB0W1wiXFx1RkRBM1wiXSA9IFwiXFx1MDYyQVxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREE0XCJdID0gXCJcXHUwNjJBXFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEQTVcIl0gPSBcIlxcdTA2MkNcXHUwNjQ1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkRBNlwiXSA9IFwiXFx1MDYyQ1xcdTA2MkRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGREE3XCJdID0gXCJcXHUwNjJDXFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEQThcIl0gPSBcIlxcdTA2MzNcXHUwNjJFXFx1MDY0OVwiO1xuICB0W1wiXFx1RkRBOVwiXSA9IFwiXFx1MDYzNVxcdTA2MkRcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREFBXCJdID0gXCJcXHUwNjM0XFx1MDYyRFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQUJcIl0gPSBcIlxcdTA2MzZcXHUwNjJEXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRBQ1wiXSA9IFwiXFx1MDY0NFxcdTA2MkNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREFEXCJdID0gXCJcXHUwNjQ0XFx1MDY0NVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQUVcIl0gPSBcIlxcdTA2NEFcXHUwNjJEXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRBRlwiXSA9IFwiXFx1MDY0QVxcdTA2MkNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREIwXCJdID0gXCJcXHUwNjRBXFx1MDY0NVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQjFcIl0gPSBcIlxcdTA2NDVcXHUwNjQ1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkRCMlwiXSA9IFwiXFx1MDY0MlxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREIzXCJdID0gXCJcXHUwNjQ2XFx1MDYyRFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQjRcIl0gPSBcIlxcdTA2NDJcXHUwNjQ1XFx1MDYyRFwiO1xuICB0W1wiXFx1RkRCNVwiXSA9IFwiXFx1MDY0NFxcdTA2MkRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGREI2XCJdID0gXCJcXHUwNjM5XFx1MDY0NVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQjdcIl0gPSBcIlxcdTA2NDNcXHUwNjQ1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkRCOFwiXSA9IFwiXFx1MDY0NlxcdTA2MkNcXHUwNjJEXCI7XG4gIHRbXCJcXHVGREI5XCJdID0gXCJcXHUwNjQ1XFx1MDYyRVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQkFcIl0gPSBcIlxcdTA2NDRcXHUwNjJDXFx1MDY0NVwiO1xuICB0W1wiXFx1RkRCQlwiXSA9IFwiXFx1MDY0M1xcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGREJDXCJdID0gXCJcXHUwNjQ0XFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZEQkRcIl0gPSBcIlxcdTA2NDZcXHUwNjJDXFx1MDYyRFwiO1xuICB0W1wiXFx1RkRCRVwiXSA9IFwiXFx1MDYyQ1xcdTA2MkRcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREJGXCJdID0gXCJcXHUwNjJEXFx1MDYyQ1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQzBcIl0gPSBcIlxcdTA2NDVcXHUwNjJDXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRDMVwiXSA9IFwiXFx1MDY0MVxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREMyXCJdID0gXCJcXHUwNjI4XFx1MDYyRFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQzNcIl0gPSBcIlxcdTA2NDNcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkRDNFwiXSA9IFwiXFx1MDYzOVxcdTA2MkNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGREM1XCJdID0gXCJcXHUwNjM1XFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZEQzZcIl0gPSBcIlxcdTA2MzNcXHUwNjJFXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRDN1wiXSA9IFwiXFx1MDY0NlxcdTA2MkNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRTQ5XCJdID0gXCJcXHUyMDNFXCI7XG4gIHRbXCJcXHVGRTRBXCJdID0gXCJcXHUyMDNFXCI7XG4gIHRbXCJcXHVGRTRCXCJdID0gXCJcXHUyMDNFXCI7XG4gIHRbXCJcXHVGRTRDXCJdID0gXCJcXHUyMDNFXCI7XG4gIHRbXCJcXHVGRTREXCJdID0gXCJcXHUwMDVGXCI7XG4gIHRbXCJcXHVGRTRFXCJdID0gXCJcXHUwMDVGXCI7XG4gIHRbXCJcXHVGRTRGXCJdID0gXCJcXHUwMDVGXCI7XG4gIHRbXCJcXHVGRTgwXCJdID0gXCJcXHUwNjIxXCI7XG4gIHRbXCJcXHVGRTgxXCJdID0gXCJcXHUwNjIyXCI7XG4gIHRbXCJcXHVGRTgyXCJdID0gXCJcXHUwNjIyXCI7XG4gIHRbXCJcXHVGRTgzXCJdID0gXCJcXHUwNjIzXCI7XG4gIHRbXCJcXHVGRTg0XCJdID0gXCJcXHUwNjIzXCI7XG4gIHRbXCJcXHVGRTg1XCJdID0gXCJcXHUwNjI0XCI7XG4gIHRbXCJcXHVGRTg2XCJdID0gXCJcXHUwNjI0XCI7XG4gIHRbXCJcXHVGRTg3XCJdID0gXCJcXHUwNjI1XCI7XG4gIHRbXCJcXHVGRTg4XCJdID0gXCJcXHUwNjI1XCI7XG4gIHRbXCJcXHVGRTg5XCJdID0gXCJcXHUwNjI2XCI7XG4gIHRbXCJcXHVGRThBXCJdID0gXCJcXHUwNjI2XCI7XG4gIHRbXCJcXHVGRThCXCJdID0gXCJcXHUwNjI2XCI7XG4gIHRbXCJcXHVGRThDXCJdID0gXCJcXHUwNjI2XCI7XG4gIHRbXCJcXHVGRThEXCJdID0gXCJcXHUwNjI3XCI7XG4gIHRbXCJcXHVGRThFXCJdID0gXCJcXHUwNjI3XCI7XG4gIHRbXCJcXHVGRThGXCJdID0gXCJcXHUwNjI4XCI7XG4gIHRbXCJcXHVGRTkwXCJdID0gXCJcXHUwNjI4XCI7XG4gIHRbXCJcXHVGRTkxXCJdID0gXCJcXHUwNjI4XCI7XG4gIHRbXCJcXHVGRTkyXCJdID0gXCJcXHUwNjI4XCI7XG4gIHRbXCJcXHVGRTkzXCJdID0gXCJcXHUwNjI5XCI7XG4gIHRbXCJcXHVGRTk0XCJdID0gXCJcXHUwNjI5XCI7XG4gIHRbXCJcXHVGRTk1XCJdID0gXCJcXHUwNjJBXCI7XG4gIHRbXCJcXHVGRTk2XCJdID0gXCJcXHUwNjJBXCI7XG4gIHRbXCJcXHVGRTk3XCJdID0gXCJcXHUwNjJBXCI7XG4gIHRbXCJcXHVGRTk4XCJdID0gXCJcXHUwNjJBXCI7XG4gIHRbXCJcXHVGRTk5XCJdID0gXCJcXHUwNjJCXCI7XG4gIHRbXCJcXHVGRTlBXCJdID0gXCJcXHUwNjJCXCI7XG4gIHRbXCJcXHVGRTlCXCJdID0gXCJcXHUwNjJCXCI7XG4gIHRbXCJcXHVGRTlDXCJdID0gXCJcXHUwNjJCXCI7XG4gIHRbXCJcXHVGRTlEXCJdID0gXCJcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRTlFXCJdID0gXCJcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRTlGXCJdID0gXCJcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRUEwXCJdID0gXCJcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRUExXCJdID0gXCJcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRUEyXCJdID0gXCJcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRUEzXCJdID0gXCJcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRUE0XCJdID0gXCJcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRUE1XCJdID0gXCJcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRUE2XCJdID0gXCJcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRUE3XCJdID0gXCJcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRUE4XCJdID0gXCJcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRUE5XCJdID0gXCJcXHUwNjJGXCI7XG4gIHRbXCJcXHVGRUFBXCJdID0gXCJcXHUwNjJGXCI7XG4gIHRbXCJcXHVGRUFCXCJdID0gXCJcXHUwNjMwXCI7XG4gIHRbXCJcXHVGRUFDXCJdID0gXCJcXHUwNjMwXCI7XG4gIHRbXCJcXHVGRUFEXCJdID0gXCJcXHUwNjMxXCI7XG4gIHRbXCJcXHVGRUFFXCJdID0gXCJcXHUwNjMxXCI7XG4gIHRbXCJcXHVGRUFGXCJdID0gXCJcXHUwNjMyXCI7XG4gIHRbXCJcXHVGRUIwXCJdID0gXCJcXHUwNjMyXCI7XG4gIHRbXCJcXHVGRUIxXCJdID0gXCJcXHUwNjMzXCI7XG4gIHRbXCJcXHVGRUIyXCJdID0gXCJcXHUwNjMzXCI7XG4gIHRbXCJcXHVGRUIzXCJdID0gXCJcXHUwNjMzXCI7XG4gIHRbXCJcXHVGRUI0XCJdID0gXCJcXHUwNjMzXCI7XG4gIHRbXCJcXHVGRUI1XCJdID0gXCJcXHUwNjM0XCI7XG4gIHRbXCJcXHVGRUI2XCJdID0gXCJcXHUwNjM0XCI7XG4gIHRbXCJcXHVGRUI3XCJdID0gXCJcXHUwNjM0XCI7XG4gIHRbXCJcXHVGRUI4XCJdID0gXCJcXHUwNjM0XCI7XG4gIHRbXCJcXHVGRUI5XCJdID0gXCJcXHUwNjM1XCI7XG4gIHRbXCJcXHVGRUJBXCJdID0gXCJcXHUwNjM1XCI7XG4gIHRbXCJcXHVGRUJCXCJdID0gXCJcXHUwNjM1XCI7XG4gIHRbXCJcXHVGRUJDXCJdID0gXCJcXHUwNjM1XCI7XG4gIHRbXCJcXHVGRUJEXCJdID0gXCJcXHUwNjM2XCI7XG4gIHRbXCJcXHVGRUJFXCJdID0gXCJcXHUwNjM2XCI7XG4gIHRbXCJcXHVGRUJGXCJdID0gXCJcXHUwNjM2XCI7XG4gIHRbXCJcXHVGRUMwXCJdID0gXCJcXHUwNjM2XCI7XG4gIHRbXCJcXHVGRUMxXCJdID0gXCJcXHUwNjM3XCI7XG4gIHRbXCJcXHVGRUMyXCJdID0gXCJcXHUwNjM3XCI7XG4gIHRbXCJcXHVGRUMzXCJdID0gXCJcXHUwNjM3XCI7XG4gIHRbXCJcXHVGRUM0XCJdID0gXCJcXHUwNjM3XCI7XG4gIHRbXCJcXHVGRUM1XCJdID0gXCJcXHUwNjM4XCI7XG4gIHRbXCJcXHVGRUM2XCJdID0gXCJcXHUwNjM4XCI7XG4gIHRbXCJcXHVGRUM3XCJdID0gXCJcXHUwNjM4XCI7XG4gIHRbXCJcXHVGRUM4XCJdID0gXCJcXHUwNjM4XCI7XG4gIHRbXCJcXHVGRUM5XCJdID0gXCJcXHUwNjM5XCI7XG4gIHRbXCJcXHVGRUNBXCJdID0gXCJcXHUwNjM5XCI7XG4gIHRbXCJcXHVGRUNCXCJdID0gXCJcXHUwNjM5XCI7XG4gIHRbXCJcXHVGRUNDXCJdID0gXCJcXHUwNjM5XCI7XG4gIHRbXCJcXHVGRUNEXCJdID0gXCJcXHUwNjNBXCI7XG4gIHRbXCJcXHVGRUNFXCJdID0gXCJcXHUwNjNBXCI7XG4gIHRbXCJcXHVGRUNGXCJdID0gXCJcXHUwNjNBXCI7XG4gIHRbXCJcXHVGRUQwXCJdID0gXCJcXHUwNjNBXCI7XG4gIHRbXCJcXHVGRUQxXCJdID0gXCJcXHUwNjQxXCI7XG4gIHRbXCJcXHVGRUQyXCJdID0gXCJcXHUwNjQxXCI7XG4gIHRbXCJcXHVGRUQzXCJdID0gXCJcXHUwNjQxXCI7XG4gIHRbXCJcXHVGRUQ0XCJdID0gXCJcXHUwNjQxXCI7XG4gIHRbXCJcXHVGRUQ1XCJdID0gXCJcXHUwNjQyXCI7XG4gIHRbXCJcXHVGRUQ2XCJdID0gXCJcXHUwNjQyXCI7XG4gIHRbXCJcXHVGRUQ3XCJdID0gXCJcXHUwNjQyXCI7XG4gIHRbXCJcXHVGRUQ4XCJdID0gXCJcXHUwNjQyXCI7XG4gIHRbXCJcXHVGRUQ5XCJdID0gXCJcXHUwNjQzXCI7XG4gIHRbXCJcXHVGRURBXCJdID0gXCJcXHUwNjQzXCI7XG4gIHRbXCJcXHVGRURCXCJdID0gXCJcXHUwNjQzXCI7XG4gIHRbXCJcXHVGRURDXCJdID0gXCJcXHUwNjQzXCI7XG4gIHRbXCJcXHVGRUREXCJdID0gXCJcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGRURFXCJdID0gXCJcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGRURGXCJdID0gXCJcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGRUUwXCJdID0gXCJcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGRUUxXCJdID0gXCJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRUUyXCJdID0gXCJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRUUzXCJdID0gXCJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRUU0XCJdID0gXCJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRUU1XCJdID0gXCJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGRUU2XCJdID0gXCJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGRUU3XCJdID0gXCJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGRUU4XCJdID0gXCJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGRUU5XCJdID0gXCJcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGRUVBXCJdID0gXCJcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGRUVCXCJdID0gXCJcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGRUVDXCJdID0gXCJcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGRUVEXCJdID0gXCJcXHUwNjQ4XCI7XG4gIHRbXCJcXHVGRUVFXCJdID0gXCJcXHUwNjQ4XCI7XG4gIHRbXCJcXHVGRUVGXCJdID0gXCJcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRUYwXCJdID0gXCJcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRUYxXCJdID0gXCJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRUYyXCJdID0gXCJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRUYzXCJdID0gXCJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRUY0XCJdID0gXCJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRUY1XCJdID0gXCJcXHUwNjQ0XFx1MDYyMlwiO1xuICB0W1wiXFx1RkVGNlwiXSA9IFwiXFx1MDY0NFxcdTA2MjJcIjtcbiAgdFtcIlxcdUZFRjdcIl0gPSBcIlxcdTA2NDRcXHUwNjIzXCI7XG4gIHRbXCJcXHVGRUY4XCJdID0gXCJcXHUwNjQ0XFx1MDYyM1wiO1xuICB0W1wiXFx1RkVGOVwiXSA9IFwiXFx1MDY0NFxcdTA2MjVcIjtcbiAgdFtcIlxcdUZFRkFcIl0gPSBcIlxcdTA2NDRcXHUwNjI1XCI7XG4gIHRbXCJcXHVGRUZCXCJdID0gXCJcXHUwNjQ0XFx1MDYyN1wiO1xuICB0W1wiXFx1RkVGQ1wiXSA9IFwiXFx1MDY0NFxcdTA2MjdcIjtcbn0pO1xuXG5mdW5jdGlvbiByZXZlcnNlSWZSdGwoY2hhcnMpIHtcbiAgdmFyIGNoYXJzTGVuZ3RoID0gY2hhcnMubGVuZ3RoO1xuICAvLyBSZXZlcnNlIGFuIGFyYWJpYyBsaWdhdHVyZS5cbiAgaWYgKGNoYXJzTGVuZ3RoIDw9IDEgfHwgIWlzUlRMUmFuZ2VGb3IoY2hhcnMuY2hhckNvZGVBdCgwKSkpIHtcbiAgICByZXR1cm4gY2hhcnM7XG4gIH1cbiAgdmFyIHMgPSBcIlwiO1xuICBmb3IgKHZhciBpaSA9IGNoYXJzTGVuZ3RoIC0gMTsgaWkgPj0gMDsgaWktLSkge1xuICAgIHMgKz0gY2hhcnNbaWldO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG5leHBvcnRzLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzID0gbWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXM7XG5leHBvcnRzLnJldmVyc2VJZlJ0bCA9IHJldmVyc2VJZlJ0bDtcbmV4cG9ydHMuZ2V0VW5pY29kZVJhbmdlRm9yID0gZ2V0VW5pY29kZVJhbmdlRm9yO1xuZXhwb3J0cy5nZXROb3JtYWxpemVkVW5pY29kZXMgPSBnZXROb3JtYWxpemVkVW5pY29kZXM7XG5leHBvcnRzLmdldFVuaWNvZGVGb3JHbHlwaCA9IGdldFVuaWNvZGVGb3JHbHlwaDtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBieXRlc1RvU3RyaW5nLFxuICBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgRm9ybWF0RXJyb3IsXG4gIHVucmVhY2hhYmxlLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IENGRlBhcnNlciB9IGZyb20gXCIuL2NmZl9wYXJzZXIuanNcIjtcbmltcG9ydCB7IGdldEdseXBoc1VuaWNvZGUgfSBmcm9tIFwiLi9nbHlwaGxpc3QuanNcIjtcbmltcG9ydCB7IFN0YW5kYXJkRW5jb2RpbmcgfSBmcm9tIFwiLi9lbmNvZGluZ3MuanNcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuL3N0cmVhbS5qc1wiO1xuXG52YXIgRm9udFJlbmRlcmVyRmFjdG9yeSA9IChmdW5jdGlvbiBGb250UmVuZGVyZXJGYWN0b3J5Q2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gZ2V0TG9uZyhkYXRhLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICAgKGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAgIChkYXRhW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAgIGRhdGFbb2Zmc2V0ICsgM11cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VXNob3J0KGRhdGEsIG9mZnNldCkge1xuICAgIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDgpIHwgZGF0YVtvZmZzZXQgKyAxXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFN1YnJvdXRpbmVCaWFzKHN1YnJzKSB7XG4gICAgY29uc3QgbnVtU3VicnMgPSBzdWJycy5sZW5ndGg7XG4gICAgbGV0IGJpYXMgPSAzMjc2ODtcbiAgICBpZiAobnVtU3VicnMgPCAxMjQwKSB7XG4gICAgICBiaWFzID0gMTA3O1xuICAgIH0gZWxzZSBpZiAobnVtU3VicnMgPCAzMzkwMCkge1xuICAgICAgYmlhcyA9IDExMzE7XG4gICAgfVxuICAgIHJldHVybiBiaWFzO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VDbWFwKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgb2Zmc2V0ID1cbiAgICAgIGdldFVzaG9ydChkYXRhLCBzdGFydCArIDIpID09PSAxXG4gICAgICAgID8gZ2V0TG9uZyhkYXRhLCBzdGFydCArIDgpXG4gICAgICAgIDogZ2V0TG9uZyhkYXRhLCBzdGFydCArIDE2KTtcbiAgICB2YXIgZm9ybWF0ID0gZ2V0VXNob3J0KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0KTtcbiAgICB2YXIgcmFuZ2VzLCBwLCBpO1xuICAgIGlmIChmb3JtYXQgPT09IDQpIHtcbiAgICAgIGdldFVzaG9ydChkYXRhLCBzdGFydCArIG9mZnNldCArIDIpOyAvLyBsZW5ndGhcbiAgICAgIHZhciBzZWdDb3VudCA9IGdldFVzaG9ydChkYXRhLCBzdGFydCArIG9mZnNldCArIDYpID4+IDE7XG4gICAgICBwID0gc3RhcnQgKyBvZmZzZXQgKyAxNDtcbiAgICAgIHJhbmdlcyA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikge1xuICAgICAgICByYW5nZXNbaV0gPSB7IGVuZDogZ2V0VXNob3J0KGRhdGEsIHApIH07XG4gICAgICB9XG4gICAgICBwICs9IDI7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7XG4gICAgICAgIHJhbmdlc1tpXS5zdGFydCA9IGdldFVzaG9ydChkYXRhLCBwKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHtcbiAgICAgICAgcmFuZ2VzW2ldLmlkRGVsdGEgPSBnZXRVc2hvcnQoZGF0YSwgcCk7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7XG4gICAgICAgIHZhciBpZE9mZnNldCA9IGdldFVzaG9ydChkYXRhLCBwKTtcbiAgICAgICAgaWYgKGlkT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmFuZ2VzW2ldLmlkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSByYW5nZXNbaV0uZW5kIC0gcmFuZ2VzW2ldLnN0YXJ0ICsgMTsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICByYW5nZXNbaV0uaWRzW2pdID0gZ2V0VXNob3J0KGRhdGEsIHAgKyBpZE9mZnNldCk7XG4gICAgICAgICAgaWRPZmZzZXQgKz0gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMTIpIHtcbiAgICAgIGdldExvbmcoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA0KTsgLy8gbGVuZ3RoXG4gICAgICB2YXIgZ3JvdXBzID0gZ2V0TG9uZyhkYXRhLCBzdGFydCArIG9mZnNldCArIDEyKTtcbiAgICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE2O1xuICAgICAgcmFuZ2VzID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0OiBnZXRMb25nKGRhdGEsIHApLFxuICAgICAgICAgIGVuZDogZ2V0TG9uZyhkYXRhLCBwICsgNCksXG4gICAgICAgICAgaWREZWx0YTogZ2V0TG9uZyhkYXRhLCBwICsgOCkgLSBnZXRMb25nKGRhdGEsIHApLFxuICAgICAgICB9KTtcbiAgICAgICAgcCArPSAxMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByYW5nZXM7XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5zdXBwb3J0ZWQgY21hcDogJHtmb3JtYXR9YCk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNmZihkYXRhLCBzdGFydCwgZW5kLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB7fTtcbiAgICB2YXIgcGFyc2VyID0gbmV3IENGRlBhcnNlcihcbiAgICAgIG5ldyBTdHJlYW0oZGF0YSwgc3RhcnQsIGVuZCAtIHN0YXJ0KSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBzZWFjQW5hbHlzaXNFbmFibGVkXG4gICAgKTtcbiAgICB2YXIgY2ZmID0gcGFyc2VyLnBhcnNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdseXBoczogY2ZmLmNoYXJTdHJpbmdzLm9iamVjdHMsXG4gICAgICBzdWJyczpcbiAgICAgICAgY2ZmLnRvcERpY3QucHJpdmF0ZURpY3QgJiZcbiAgICAgICAgY2ZmLnRvcERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleCAmJlxuICAgICAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHMsXG4gICAgICBnc3VicnM6IGNmZi5nbG9iYWxTdWJySW5kZXggJiYgY2ZmLmdsb2JhbFN1YnJJbmRleC5vYmplY3RzLFxuICAgICAgaXNDRkZDSURGb250OiBjZmYuaXNDSURGb250LFxuICAgICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCxcbiAgICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUdseWZUYWJsZShnbHlmLCBsb2NhLCBpc0dseXBoTG9jYXRpb25zTG9uZykge1xuICAgIHZhciBpdGVtU2l6ZSwgaXRlbURlY29kZTtcbiAgICBpZiAoaXNHbHlwaExvY2F0aW9uc0xvbmcpIHtcbiAgICAgIGl0ZW1TaXplID0gNDtcbiAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZUxvbmcoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICAgICAgIChkYXRhW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgICAgICAgKGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgM11cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1TaXplID0gMjtcbiAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZShkYXRhLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgOSkgfCAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBnbHlwaHMgPSBbXTtcbiAgICB2YXIgc3RhcnRPZmZzZXQgPSBpdGVtRGVjb2RlKGxvY2EsIDApO1xuICAgIGZvciAodmFyIGogPSBpdGVtU2l6ZTsgaiA8IGxvY2EubGVuZ3RoOyBqICs9IGl0ZW1TaXplKSB7XG4gICAgICB2YXIgZW5kT2Zmc2V0ID0gaXRlbURlY29kZShsb2NhLCBqKTtcbiAgICAgIGdseXBocy5wdXNoKGdseWYuc3ViYXJyYXkoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCkpO1xuICAgICAgc3RhcnRPZmZzZXQgPSBlbmRPZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiBnbHlwaHM7XG4gIH1cblxuICBmdW5jdGlvbiBsb29rdXBDbWFwKHJhbmdlcywgdW5pY29kZSkge1xuICAgIHZhciBjb2RlID0gdW5pY29kZS5jb2RlUG9pbnRBdCgwKSxcbiAgICAgIGdpZCA9IDA7XG4gICAgdmFyIGwgPSAwLFxuICAgICAgciA9IHJhbmdlcy5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChsIDwgcikge1xuICAgICAgdmFyIGMgPSAobCArIHIgKyAxKSA+PiAxO1xuICAgICAgaWYgKGNvZGUgPCByYW5nZXNbY10uc3RhcnQpIHtcbiAgICAgICAgciA9IGMgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbCA9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyYW5nZXNbbF0uc3RhcnQgPD0gY29kZSAmJiBjb2RlIDw9IHJhbmdlc1tsXS5lbmQpIHtcbiAgICAgIGdpZCA9XG4gICAgICAgIChyYW5nZXNbbF0uaWREZWx0YSArXG4gICAgICAgICAgKHJhbmdlc1tsXS5pZHMgPyByYW5nZXNbbF0uaWRzW2NvZGUgLSByYW5nZXNbbF0uc3RhcnRdIDogY29kZSkpICZcbiAgICAgICAgMHhmZmZmO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY2hhckNvZGU6IGNvZGUsXG4gICAgICBnbHlwaElkOiBnaWQsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIGZvbnQpIHtcbiAgICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkge1xuICAgICAgY21kcy5wdXNoKHsgY21kOiBcIm1vdmVUb1wiLCBhcmdzOiBbeCwgeV0gfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7XG4gICAgICBjbWRzLnB1c2goeyBjbWQ6IFwibGluZVRvXCIsIGFyZ3M6IFt4LCB5XSB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVhZHJhdGljQ3VydmVUbyh4YSwgeWEsIHgsIHkpIHtcbiAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJxdWFkcmF0aWNDdXJ2ZVRvXCIsIGFyZ3M6IFt4YSwgeWEsIHgsIHldIH0pO1xuICAgIH1cblxuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbnVtYmVyT2ZDb250b3VycyA9ICgoY29kZVtpXSA8PCAyNCkgfCAoY29kZVtpICsgMV0gPDwgMTYpKSA+PiAxNjtcbiAgICB2YXIgZmxhZ3M7XG4gICAgdmFyIHggPSAwLFxuICAgICAgeSA9IDA7XG4gICAgaSArPSAxMDtcbiAgICBpZiAobnVtYmVyT2ZDb250b3VycyA8IDApIHtcbiAgICAgIC8vIGNvbXBvc2l0ZSBnbHlwaFxuICAgICAgZG8ge1xuICAgICAgICBmbGFncyA9IChjb2RlW2ldIDw8IDgpIHwgY29kZVtpICsgMV07XG4gICAgICAgIHZhciBnbHlwaEluZGV4ID0gKGNvZGVbaSArIDJdIDw8IDgpIHwgY29kZVtpICsgM107XG4gICAgICAgIGkgKz0gNDtcbiAgICAgICAgdmFyIGFyZzEsIGFyZzI7XG4gICAgICAgIGlmIChmbGFncyAmIDB4MDEpIHtcbiAgICAgICAgICBhcmcxID0gKChjb2RlW2ldIDw8IDI0KSB8IChjb2RlW2kgKyAxXSA8PCAxNikpID4+IDE2O1xuICAgICAgICAgIGFyZzIgPSAoKGNvZGVbaSArIDJdIDw8IDI0KSB8IChjb2RlW2kgKyAzXSA8PCAxNikpID4+IDE2O1xuICAgICAgICAgIGkgKz0gNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmcxID0gY29kZVtpKytdO1xuICAgICAgICAgIGFyZzIgPSBjb2RlW2krK107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsYWdzICYgMHgwMikge1xuICAgICAgICAgIHggPSBhcmcxO1xuICAgICAgICAgIHkgPSBhcmcyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHggPSAwO1xuICAgICAgICAgIHkgPSAwOyAvLyBUT0RPIFwidGhleSBhcmUgcG9pbnRzXCIgP1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY2FsZVggPSAxLFxuICAgICAgICAgIHNjYWxlWSA9IDEsXG4gICAgICAgICAgc2NhbGUwMSA9IDAsXG4gICAgICAgICAgc2NhbGUxMCA9IDA7XG4gICAgICAgIGlmIChmbGFncyAmIDB4MDgpIHtcbiAgICAgICAgICBzY2FsZVggPSBzY2FsZVkgPVxuICAgICAgICAgICAgKChjb2RlW2ldIDw8IDI0KSB8IChjb2RlW2kgKyAxXSA8PCAxNikpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgICBpICs9IDI7XG4gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDQwKSB7XG4gICAgICAgICAgc2NhbGVYID0gKChjb2RlW2ldIDw8IDI0KSB8IChjb2RlW2kgKyAxXSA8PCAxNikpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgICBzY2FsZVkgPSAoKGNvZGVbaSArIDJdIDw8IDI0KSB8IChjb2RlW2kgKyAzXSA8PCAxNikpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgICBpICs9IDQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDgwKSB7XG4gICAgICAgICAgc2NhbGVYID0gKChjb2RlW2ldIDw8IDI0KSB8IChjb2RlW2kgKyAxXSA8PCAxNikpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgICBzY2FsZTAxID0gKChjb2RlW2kgKyAyXSA8PCAyNCkgfCAoY29kZVtpICsgM10gPDwgMTYpKSAvIDEwNzM3NDE4MjQ7XG4gICAgICAgICAgc2NhbGUxMCA9ICgoY29kZVtpICsgNF0gPDwgMjQpIHwgKGNvZGVbaSArIDVdIDw8IDE2KSkgLyAxMDczNzQxODI0O1xuICAgICAgICAgIHNjYWxlWSA9ICgoY29kZVtpICsgNl0gPDwgMjQpIHwgKGNvZGVbaSArIDddIDw8IDE2KSkgLyAxMDczNzQxODI0O1xuICAgICAgICAgIGkgKz0gODtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3ViZ2x5cGggPSBmb250LmdseXBoc1tnbHlwaEluZGV4XTtcbiAgICAgICAgaWYgKHN1YmdseXBoKSB7XG4gICAgICAgICAgY21kcy5wdXNoKHsgY21kOiBcInNhdmVcIiB9KTtcbiAgICAgICAgICBjbWRzLnB1c2goe1xuICAgICAgICAgICAgY21kOiBcInRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgYXJnczogW3NjYWxlWCwgc2NhbGUwMSwgc2NhbGUxMCwgc2NhbGVZLCB4LCB5XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb21waWxlR2x5ZihzdWJnbHlwaCwgY21kcywgZm9udCk7XG4gICAgICAgICAgY21kcy5wdXNoKHsgY21kOiBcInJlc3RvcmVcIiB9KTtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoZmxhZ3MgJiAweDIwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2ltcGxlIGdseXBoXG4gICAgICB2YXIgZW5kUHRzT2ZDb250b3VycyA9IFtdO1xuICAgICAgdmFyIGosIGpqO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mQ29udG91cnM7IGorKykge1xuICAgICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2goKGNvZGVbaV0gPDwgOCkgfCBjb2RlW2kgKyAxXSk7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgIH1cbiAgICAgIHZhciBpbnN0cnVjdGlvbkxlbmd0aCA9IChjb2RlW2ldIDw8IDgpIHwgY29kZVtpICsgMV07XG4gICAgICBpICs9IDIgKyBpbnN0cnVjdGlvbkxlbmd0aDsgLy8gc2tpcHBpbmcgdGhlIGluc3RydWN0aW9uc1xuICAgICAgdmFyIG51bWJlck9mUG9pbnRzID0gZW5kUHRzT2ZDb250b3Vyc1tlbmRQdHNPZkNvbnRvdXJzLmxlbmd0aCAtIDFdICsgMTtcbiAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgIHdoaWxlIChwb2ludHMubGVuZ3RoIDwgbnVtYmVyT2ZQb2ludHMpIHtcbiAgICAgICAgZmxhZ3MgPSBjb2RlW2krK107XG4gICAgICAgIHZhciByZXBlYXQgPSAxO1xuICAgICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7XG4gICAgICAgICAgcmVwZWF0ICs9IGNvZGVbaSsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSB7XG4gICAgICAgICAgcG9pbnRzLnB1c2goeyBmbGFncyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHtcbiAgICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDEyKSB7XG4gICAgICAgICAgY2FzZSAweDAwOlxuICAgICAgICAgICAgeCArPSAoKGNvZGVbaV0gPDwgMjQpIHwgKGNvZGVbaSArIDFdIDw8IDE2KSkgPj4gMTY7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDI6XG4gICAgICAgICAgICB4IC09IGNvZGVbaSsrXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgxMjpcbiAgICAgICAgICAgIHggKz0gY29kZVtpKytdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzW2pdLnggPSB4O1xuICAgICAgfVxuICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHtcbiAgICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDI0KSB7XG4gICAgICAgICAgY2FzZSAweDAwOlxuICAgICAgICAgICAgeSArPSAoKGNvZGVbaV0gPDwgMjQpIHwgKGNvZGVbaSArIDFdIDw8IDE2KSkgPj4gMTY7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDQ6XG4gICAgICAgICAgICB5IC09IGNvZGVbaSsrXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgyNDpcbiAgICAgICAgICAgIHkgKz0gY29kZVtpKytdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzW2pdLnkgPSB5O1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhcnRQb2ludCA9IDA7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyT2ZDb250b3VyczsgaSsrKSB7XG4gICAgICAgIHZhciBlbmRQb2ludCA9IGVuZFB0c09mQ29udG91cnNbaV07XG4gICAgICAgIC8vIGNvbnRvdXJzIG1pZ2h0IGhhdmUgaW1wbGljaXQgcG9pbnRzLCB3aGljaCBpcyBsb2NhdGVkIGluIHRoZSBtaWRkbGVcbiAgICAgICAgLy8gYmV0d2VlbiB0d28gbmVpZ2hib3Jpbmcgb2ZmLWN1cnZlIHBvaW50c1xuICAgICAgICB2YXIgY29udG91ciA9IHBvaW50cy5zbGljZShzdGFydFBvaW50LCBlbmRQb2ludCArIDEpO1xuICAgICAgICBpZiAoY29udG91clswXS5mbGFncyAmIDEpIHtcbiAgICAgICAgICBjb250b3VyLnB1c2goY29udG91clswXSk7IC8vIHVzaW5nIHN0YXJ0IHBvaW50IGF0IHRoZSBjb250b3VyIGVuZFxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRvdXJbY29udG91ci5sZW5ndGggLSAxXS5mbGFncyAmIDEpIHtcbiAgICAgICAgICAvLyBmaXJzdCBpcyBvZmYtY3VydmUgcG9pbnQsIHRyeWluZyB0byB1c2Ugb25lIGZyb20gdGhlIGVuZFxuICAgICAgICAgIGNvbnRvdXIudW5zaGlmdChjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN0YXJ0IGFuZCBlbmQgYXJlIG9mZi1jdXJ2ZSBwb2ludHMsIGNyZWF0aW5nIGltcGxpY2l0IG9uZVxuICAgICAgICAgIHZhciBwID0ge1xuICAgICAgICAgICAgZmxhZ3M6IDEsXG4gICAgICAgICAgICB4OiAoY29udG91clswXS54ICsgY29udG91cltjb250b3VyLmxlbmd0aCAtIDFdLngpIC8gMixcbiAgICAgICAgICAgIHk6IChjb250b3VyWzBdLnkgKyBjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0ueSkgLyAyLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29udG91ci51bnNoaWZ0KHApO1xuICAgICAgICAgIGNvbnRvdXIucHVzaChwKTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlVG8oY29udG91clswXS54LCBjb250b3VyWzBdLnkpO1xuICAgICAgICBmb3IgKGogPSAxLCBqaiA9IGNvbnRvdXIubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgIGlmIChjb250b3VyW2pdLmZsYWdzICYgMSkge1xuICAgICAgICAgICAgbGluZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRvdXJbaiArIDFdLmZsYWdzICYgMSkge1xuICAgICAgICAgICAgcXVhZHJhdGljQ3VydmVUbyhcbiAgICAgICAgICAgICAgY29udG91cltqXS54LFxuICAgICAgICAgICAgICBjb250b3VyW2pdLnksXG4gICAgICAgICAgICAgIGNvbnRvdXJbaiArIDFdLngsXG4gICAgICAgICAgICAgIGNvbnRvdXJbaiArIDFdLnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1YWRyYXRpY0N1cnZlVG8oXG4gICAgICAgICAgICAgIGNvbnRvdXJbal0ueCxcbiAgICAgICAgICAgICAgY29udG91cltqXS55LFxuICAgICAgICAgICAgICAoY29udG91cltqXS54ICsgY29udG91cltqICsgMV0ueCkgLyAyLFxuICAgICAgICAgICAgICAoY29udG91cltqXS55ICsgY29udG91cltqICsgMV0ueSkgLyAyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGFydFBvaW50ID0gZW5kUG9pbnQgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBpbGVDaGFyU3RyaW5nKGNoYXJTdHJpbmdDb2RlLCBjbWRzLCBmb250LCBnbHlwaElkKSB7XG4gICAgZnVuY3Rpb24gbW92ZVRvKHgsIHkpIHtcbiAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJtb3ZlVG9cIiwgYXJnczogW3gsIHldIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lVG8oeCwgeSkge1xuICAgICAgY21kcy5wdXNoKHsgY21kOiBcImxpbmVUb1wiLCBhcmdzOiBbeCwgeV0gfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJlemllckN1cnZlVG8oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHtcbiAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJiZXppZXJDdXJ2ZVRvXCIsIGFyZ3M6IFt4MSwgeTEsIHgyLCB5MiwgeCwgeV0gfSk7XG4gICAgfVxuXG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIHggPSAwLFxuICAgICAgeSA9IDA7XG4gICAgdmFyIHN0ZW1zID0gMDtcblxuICAgIGZ1bmN0aW9uIHBhcnNlKGNvZGUpIHtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHN0YWNrQ2xlYW4gPSBmYWxzZTtcbiAgICAgICAgdmFyIHYgPSBjb2RlW2krK107XG4gICAgICAgIHZhciB4YSwgeGIsIHlhLCB5YiwgeTEsIHkyLCB5Mywgbiwgc3VickNvZGU7XG4gICAgICAgIHN3aXRjaCAodikge1xuICAgICAgICAgIGNhc2UgMTogLy8gaHN0ZW1cbiAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6IC8vIHZzdGVtXG4gICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTtcbiAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OiAvLyB2bW92ZXRvXG4gICAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDU6IC8vIHJsaW5ldG9cbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDY6IC8vIGhsaW5ldG9cbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgbGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDc6IC8vIHZsaW5ldG9cbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgbGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDg6IC8vIHJyY3VydmV0b1xuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTA6IC8vIGNhbGxzdWJyXG4gICAgICAgICAgICBuID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdWJyQ29kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZm9udC5pc0NGRkNJREZvbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgZmRJbmRleCA9IGZvbnQuZmRTZWxlY3QuZ2V0RkRJbmRleChnbHlwaElkKTtcbiAgICAgICAgICAgICAgaWYgKGZkSW5kZXggPj0gMCAmJiBmZEluZGV4IDwgZm9udC5mZEFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnREaWN0ID0gZm9udC5mZEFycmF5W2ZkSW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBzdWJycztcbiAgICAgICAgICAgICAgICBpZiAoZm9udERpY3QucHJpdmF0ZURpY3QgJiYgZm9udERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleCkge1xuICAgICAgICAgICAgICAgICAgc3VicnMgPSBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdWJycykge1xuICAgICAgICAgICAgICAgICAgLy8gQWRkIHN1YnJvdXRpbmUgYmlhcy5cbiAgICAgICAgICAgICAgICAgIG4gKz0gZ2V0U3Vicm91dGluZUJpYXMoc3VicnMpO1xuICAgICAgICAgICAgICAgICAgc3VickNvZGUgPSBzdWJyc1tuXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2FybihcIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LlwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3VickNvZGUgPSBmb250LnN1YnJzW24gKyBmb250LnN1YnJzQmlhc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VickNvZGUpIHtcbiAgICAgICAgICAgICAgcGFyc2Uoc3VickNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxMTogLy8gcmV0dXJuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIHYgPSBjb2RlW2krK107XG4gICAgICAgICAgICBzd2l0Y2ggKHYpIHtcbiAgICAgICAgICAgICAgY2FzZSAzNDogLy8gZmxleFxuICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHksIHhiLCB5MSwgeCwgeTEpO1xuICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHksIHgsIHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDM1OiAvLyBmbGV4XG4gICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpO1xuICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpOyAvLyBmZFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDM2OiAvLyBoZmxleDFcbiAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHkxID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeTIgPSB5MSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHkyLCB4LCB5Mik7XG4gICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5MyA9IHkyICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkyLCB4YiwgeTMsIHgsIHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDM3OiAvLyBmbGV4MVxuICAgICAgICAgICAgICAgIHZhciB4MCA9IHgsXG4gICAgICAgICAgICAgICAgICB5MCA9IHk7XG4gICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IHhiO1xuICAgICAgICAgICAgICAgIHkgPSB5YjtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoeCAtIHgwKSA+IE1hdGguYWJzKHkgLSB5MCkpIHtcbiAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYHVua25vd24gb3BlcmF0b3I6IDEyICR7dn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTQ6IC8vIGVuZGNoYXJcbiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPj0gNCkge1xuICAgICAgICAgICAgICB2YXIgYWNoYXIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgdmFyIGJjaGFyID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICBjbWRzLnB1c2goeyBjbWQ6IFwic2F2ZVwiIH0pO1xuICAgICAgICAgICAgICBjbWRzLnB1c2goeyBjbWQ6IFwidHJhbnNsYXRlXCIsIGFyZ3M6IFt4LCB5XSB9KTtcbiAgICAgICAgICAgICAgdmFyIGNtYXAgPSBsb29rdXBDbWFwKFxuICAgICAgICAgICAgICAgIGZvbnQuY21hcCxcbiAgICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYWNoYXJdXSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29tcGlsZUNoYXJTdHJpbmcoXG4gICAgICAgICAgICAgICAgZm9udC5nbHlwaHNbY21hcC5nbHlwaElkXSxcbiAgICAgICAgICAgICAgICBjbWRzLFxuICAgICAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICAgICAgY21hcC5nbHlwaElkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJyZXN0b3JlXCIgfSk7XG5cbiAgICAgICAgICAgICAgY21hcCA9IGxvb2t1cENtYXAoXG4gICAgICAgICAgICAgICAgZm9udC5jbWFwLFxuICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nbHlwaE5hbWVNYXBbU3RhbmRhcmRFbmNvZGluZ1tiY2hhcl1dKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhcbiAgICAgICAgICAgICAgICBmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLFxuICAgICAgICAgICAgICAgIGNtZHMsXG4gICAgICAgICAgICAgICAgZm9udCxcbiAgICAgICAgICAgICAgICBjbWFwLmdseXBoSWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICBjYXNlIDE4OiAvLyBoc3RlbWhtXG4gICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTtcbiAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOTogLy8gaGludG1hc2tcbiAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgICAgICAgaSArPSAoc3RlbXMgKyA3KSA+PiAzO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIwOiAvLyBjbnRybWFza1xuICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7XG4gICAgICAgICAgICBpICs9IChzdGVtcyArIDcpID4+IDM7XG4gICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjE6IC8vIHJtb3ZldG9cbiAgICAgICAgICAgIHkgKz0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIyOiAvLyBobW92ZXRvXG4gICAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIzOiAvLyB2c3RlbWhtXG4gICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTtcbiAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyNDogLy8gcmN1cnZlbGluZVxuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgIGxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjU6IC8vIHJsaW5lY3VydmVcbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiA2KSB7XG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyNjogLy8gdnZjdXJ2ZXRvXG4gICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikge1xuICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB4YSA9IHg7XG4gICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeCA9IHhiO1xuICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjc6IC8vIGhoY3VydmV0b1xuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWEgPSB5O1xuICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgPSB5YjtcbiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgc3RhY2sucHVzaCgoKGNvZGVbaV0gPDwgMjQpIHwgKGNvZGVbaSArIDFdIDw8IDE2KSkgPj4gMTYpO1xuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOTogLy8gY2FsbGdzdWJyXG4gICAgICAgICAgICBuID0gc3RhY2sucG9wKCkgKyBmb250LmdzdWJyc0JpYXM7XG4gICAgICAgICAgICBzdWJyQ29kZSA9IGZvbnQuZ3N1YnJzW25dO1xuICAgICAgICAgICAgaWYgKHN1YnJDb2RlKSB7XG4gICAgICAgICAgICAgIHBhcnNlKHN1YnJDb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzA6IC8vIHZoY3VydmV0b1xuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgeGEgPSB4O1xuICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7XG4gICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpO1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5YSA9IHk7XG4gICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeCA9IHhiICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTtcbiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDMxOiAvLyBodmN1cnZldG9cbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHlhID0geTtcbiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4ID0geGIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApO1xuICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgeGEgPSB4O1xuICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7XG4gICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICh2IDwgMzIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAke3Z9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodiA8IDI0Nykge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKHYgLSAxMzkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2IDwgMjUxKSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goKHYgLSAyNDcpICogMjU2ICsgY29kZVtpKytdICsgMTA4KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1NSkge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKC0odiAtIDI1MSkgKiAyNTYgLSBjb2RlW2krK10gLSAxMDgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaChcbiAgICAgICAgICAgICAgICAoKGNvZGVbaV0gPDwgMjQpIHxcbiAgICAgICAgICAgICAgICAgIChjb2RlW2kgKyAxXSA8PCAxNikgfFxuICAgICAgICAgICAgICAgICAgKGNvZGVbaSArIDJdIDw8IDgpIHxcbiAgICAgICAgICAgICAgICAgIGNvZGVbaSArIDNdKSAvXG4gICAgICAgICAgICAgICAgICA2NTUzNlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpICs9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhY2tDbGVhbikge1xuICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2UoY2hhclN0cmluZ0NvZGUpO1xuICB9XG5cbiAgY29uc3QgTk9PUCA9IFtdO1xuXG4gIGNsYXNzIENvbXBpbGVkRm9udCB7XG4gICAgY29uc3RydWN0b3IoZm9udE1hdHJpeCkge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IENvbXBpbGVkRm9udCkge1xuICAgICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIENvbXBpbGVkRm9udC5cIik7XG4gICAgICB9XG4gICAgICB0aGlzLmZvbnRNYXRyaXggPSBmb250TWF0cml4O1xuXG4gICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuXG4gICAgZ2V0UGF0aEpzKHVuaWNvZGUpIHtcbiAgICAgIGNvbnN0IGNtYXAgPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7XG4gICAgICBsZXQgZm4gPSB0aGlzLmNvbXBpbGVkR2x5cGhzW2NtYXAuZ2x5cGhJZF07XG4gICAgICBpZiAoIWZuKSB7XG4gICAgICAgIGZuID0gdGhpcy5jb21waWxlR2x5cGgodGhpcy5nbHlwaHNbY21hcC5nbHlwaElkXSwgY21hcC5nbHlwaElkKTtcbiAgICAgICAgdGhpcy5jb21waWxlZEdseXBoc1tjbWFwLmdseXBoSWRdID0gZm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NtYXAuY2hhckNvZGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NtYXAuY2hhckNvZGVdID0gY21hcC5nbHlwaElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZuO1xuICAgIH1cblxuICAgIGNvbXBpbGVHbHlwaChjb2RlLCBnbHlwaElkKSB7XG4gICAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggPT09IDAgfHwgY29kZVswXSA9PT0gMTQpIHtcbiAgICAgICAgcmV0dXJuIE5PT1A7XG4gICAgICB9XG5cbiAgICAgIGxldCBmb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4O1xuICAgICAgaWYgKHRoaXMuaXNDRkZDSURGb250KSB7XG4gICAgICAgIC8vIFRvcCBESUNUJ3MgRm9udE1hdHJpeCBjYW4gYmUgaWdub3JlZCBiZWNhdXNlIENGRkNvbXBpbGVyIGFsd2F5c1xuICAgICAgICAvLyByZW1vdmVzIGl0IGFuZCBjb3BpZXMgdG8gRkRBcnJheSBESUNUcy5cbiAgICAgICAgY29uc3QgZmRJbmRleCA9IHRoaXMuZmRTZWxlY3QuZ2V0RkRJbmRleChnbHlwaElkKTtcbiAgICAgICAgaWYgKGZkSW5kZXggPj0gMCAmJiBmZEluZGV4IDwgdGhpcy5mZEFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGZvbnREaWN0ID0gdGhpcy5mZEFycmF5W2ZkSW5kZXhdO1xuICAgICAgICAgIGZvbnRNYXRyaXggPSBmb250RGljdC5nZXRCeU5hbWUoXCJGb250TWF0cml4XCIpIHx8IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY21kcyA9IFtdO1xuICAgICAgY21kcy5wdXNoKHsgY21kOiBcInNhdmVcIiB9KTtcbiAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJ0cmFuc2Zvcm1cIiwgYXJnczogZm9udE1hdHJpeC5zbGljZSgpIH0pO1xuICAgICAgY21kcy5wdXNoKHsgY21kOiBcInNjYWxlXCIsIGFyZ3M6IFtcInNpemVcIiwgXCItc2l6ZVwiXSB9KTtcblxuICAgICAgdGhpcy5jb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMsIGdseXBoSWQpO1xuXG4gICAgICBjbWRzLnB1c2goeyBjbWQ6IFwicmVzdG9yZVwiIH0pO1xuXG4gICAgICByZXR1cm4gY21kcztcbiAgICB9XG5cbiAgICBjb21waWxlR2x5cGhJbXBsKCkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDaGlsZHJlbiBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcy5cIik7XG4gICAgfVxuXG4gICAgaGFzQnVpbHRQYXRoKHVuaWNvZGUpIHtcbiAgICAgIGNvbnN0IGNtYXAgPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzW2NtYXAuZ2x5cGhJZF0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY21hcC5jaGFyQ29kZV0gIT09IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBUcnVlVHlwZUNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHtcbiAgICBjb25zdHJ1Y3RvcihnbHlwaHMsIGNtYXAsIGZvbnRNYXRyaXgpIHtcbiAgICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAwNDg4LCAwLCAwLCAwLjAwMDQ4OCwgMCwgMF0pO1xuXG4gICAgICB0aGlzLmdseXBocyA9IGdseXBocztcbiAgICAgIHRoaXMuY21hcCA9IGNtYXA7XG4gICAgfVxuXG4gICAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzKSB7XG4gICAgICBjb21waWxlR2x5Zihjb2RlLCBjbWRzLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBUeXBlMkNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHtcbiAgICBjb25zdHJ1Y3RvcihjZmZJbmZvLCBjbWFwLCBmb250TWF0cml4LCBnbHlwaE5hbWVNYXApIHtcbiAgICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF0pO1xuXG4gICAgICB0aGlzLmdseXBocyA9IGNmZkluZm8uZ2x5cGhzO1xuICAgICAgdGhpcy5nc3VicnMgPSBjZmZJbmZvLmdzdWJycyB8fCBbXTtcbiAgICAgIHRoaXMuc3VicnMgPSBjZmZJbmZvLnN1YnJzIHx8IFtdO1xuICAgICAgdGhpcy5jbWFwID0gY21hcDtcbiAgICAgIHRoaXMuZ2x5cGhOYW1lTWFwID0gZ2x5cGhOYW1lTWFwIHx8IGdldEdseXBoc1VuaWNvZGUoKTtcblxuICAgICAgdGhpcy5nc3VicnNCaWFzID0gZ2V0U3Vicm91dGluZUJpYXModGhpcy5nc3VicnMpO1xuICAgICAgdGhpcy5zdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyh0aGlzLnN1YnJzKTtcblxuICAgICAgdGhpcy5pc0NGRkNJREZvbnQgPSBjZmZJbmZvLmlzQ0ZGQ0lERm9udDtcbiAgICAgIHRoaXMuZmRTZWxlY3QgPSBjZmZJbmZvLmZkU2VsZWN0O1xuICAgICAgdGhpcy5mZEFycmF5ID0gY2ZmSW5mby5mZEFycmF5O1xuICAgIH1cblxuICAgIGNvbXBpbGVHbHlwaEltcGwoY29kZSwgY21kcywgZ2x5cGhJZCkge1xuICAgICAgY29tcGlsZUNoYXJTdHJpbmcoY29kZSwgY21kcywgdGhpcywgZ2x5cGhJZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIEZvbnRSZW5kZXJlckZhY3RvcnlfY3JlYXRlKGZvbnQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHtcbiAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZm9udC5kYXRhKTtcbiAgICAgIHZhciBjbWFwLCBnbHlmLCBsb2NhLCBjZmYsIGluZGV4VG9Mb2NGb3JtYXQsIHVuaXRzUGVyRW07XG4gICAgICB2YXIgbnVtVGFibGVzID0gZ2V0VXNob3J0KGRhdGEsIDQpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSAxMjsgaSA8IG51bVRhYmxlczsgaSsrLCBwICs9IDE2KSB7XG4gICAgICAgIHZhciB0YWcgPSBieXRlc1RvU3RyaW5nKGRhdGEuc3ViYXJyYXkocCwgcCArIDQpKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IGdldExvbmcoZGF0YSwgcCArIDgpO1xuICAgICAgICB2YXIgbGVuZ3RoID0gZ2V0TG9uZyhkYXRhLCBwICsgMTIpO1xuICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgIGNhc2UgXCJjbWFwXCI6XG4gICAgICAgICAgICBjbWFwID0gcGFyc2VDbWFwKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJnbHlmXCI6XG4gICAgICAgICAgICBnbHlmID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibG9jYVwiOlxuICAgICAgICAgICAgbG9jYSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImhlYWRcIjpcbiAgICAgICAgICAgIHVuaXRzUGVyRW0gPSBnZXRVc2hvcnQoZGF0YSwgb2Zmc2V0ICsgMTgpO1xuICAgICAgICAgICAgaW5kZXhUb0xvY0Zvcm1hdCA9IGdldFVzaG9ydChkYXRhLCBvZmZzZXQgKyA1MCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQ0ZGIFwiOlxuICAgICAgICAgICAgY2ZmID0gcGFyc2VDZmYoZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgsIHNlYWNBbmFseXNpc0VuYWJsZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGdseWYpIHtcbiAgICAgICAgdmFyIGZvbnRNYXRyaXggPSAhdW5pdHNQZXJFbVxuICAgICAgICAgID8gZm9udC5mb250TWF0cml4XG4gICAgICAgICAgOiBbMSAvIHVuaXRzUGVyRW0sIDAsIDAsIDEgLyB1bml0c1BlckVtLCAwLCAwXTtcbiAgICAgICAgcmV0dXJuIG5ldyBUcnVlVHlwZUNvbXBpbGVkKFxuICAgICAgICAgIHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGluZGV4VG9Mb2NGb3JtYXQpLFxuICAgICAgICAgIGNtYXAsXG4gICAgICAgICAgZm9udE1hdHJpeFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBUeXBlMkNvbXBpbGVkKGNmZiwgY21hcCwgZm9udC5mb250TWF0cml4LCBmb250LmdseXBoTmFtZU1hcCk7XG4gICAgfSxcbiAgfTtcbn0pKCk7XG5cbmV4cG9ydCB7IEZvbnRSZW5kZXJlckZhY3RvcnkgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRFbmNvZGluZyB9IGZyb20gXCIuL2VuY29kaW5ncy5qc1wiO1xuaW1wb3J0IHsgaXNXaGl0ZVNwYWNlIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbi8vIEhpbnRpbmcgaXMgY3VycmVudGx5IGRpc2FibGVkIGR1ZSB0byB1bmtub3duIHByb2JsZW1zIG9uIHdpbmRvd3Ncbi8vIGluIHRyYWNlbW9ua2V5IGFuZCB2YXJpb3VzIG90aGVyIHBkZnMgd2l0aCB0eXBlMSBmb250cy5cbnZhciBISU5USU5HX0VOQUJMRUQgPSBmYWxzZTtcblxuLypcbiAqIENoYXJTdHJpbmdzIGFyZSBlbmNvZGVkIGZvbGxvd2luZyB0aGUgdGhlIENoYXJTdHJpbmcgRW5jb2Rpbmcgc2VxdWVuY2VcbiAqIGRlc2NyaWJlIGluIENoYXB0ZXIgNiBvZiB0aGUgXCJBZG9iZSBUeXBlMSBGb250IEZvcm1hdFwiIHNwZWNpZmljYXRpb24uXG4gKiBUaGUgdmFsdWUgaW4gYSBieXRlIGluZGljYXRlcyBhIGNvbW1hbmQsIGEgbnVtYmVyLCBvciBzdWJzZXF1ZW50IGJ5dGVzXG4gKiB0aGF0IGFyZSB0byBiZSBpbnRlcnByZXRlZCBpbiBhIHNwZWNpYWwgd2F5LlxuICpcbiAqIENoYXJTdHJpbmcgTnVtYmVyIEVuY29kaW5nOlxuICogIEEgQ2hhclN0cmluZyBieXRlIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmcm9tIDMyIHRocm91Z2ggMjU1IGluY2x1c2l2ZVxuICogIGluZGljYXRlIGFuIGludGVnZXIuIFRoZXNlIHZhbHVlcyBhcmUgZGVjb2RlZCBpbiBmb3VyIHJhbmdlcy5cbiAqXG4gKiAxLiBBIENoYXJTdHJpbmcgYnl0ZSBjb250YWluaW5nIGEgdmFsdWUsIHYsIGJldHdlZW4gMzIgYW5kIDI0NiBpbmNsdXNpdmUsXG4gKiBpbmRpY2F0ZSB0aGUgaW50ZWdlciB2IC0gMTM5LiBUaHVzLCB0aGUgaW50ZWdlciB2YWx1ZXMgZnJvbSAtMTA3IHRocm91Z2hcbiAqIDEwNyBpbmNsdXNpdmUgbWF5IGJlIGVuY29kZWQgaW4gc2luZ2xlIGJ5dGUuXG4gKlxuICogMi4gQSBDaGFyU3RyaW5nIGJ5dGUgY29udGFpbmluZyBhIHZhbHVlLCB2LCBiZXR3ZWVuIDI0NyBhbmQgMjUwIGluY2x1c2l2ZSxcbiAqIGluZGljYXRlcyBhbiBpbnRlZ2VyIGludm9sdmluZyB0aGUgbmV4dCBieXRlLCB3LCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6XG4gKiBbKHYgLSAyNDcpIHggMjU2XSArIHcgKyAxMDhcbiAqXG4gKiAzLiBBIENoYXJTdHJpbmcgYnl0ZSBjb250YWluaW5nIGEgdmFsdWUsIHYsIGJldHdlZW4gMjUxIGFuZCAyNTQgaW5jbHVzaXZlLFxuICogaW5kaWNhdGVzIGFuIGludGVnZXIgaW52b2x2aW5nIHRoZSBuZXh0IGJ5dGUsIHcsIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYTpcbiAqIC1bKHYgLSAyNTEpICogMjU2XSAtIHcgLSAxMDhcbiAqXG4gKiA0LiBBIENoYXJTdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUgMjU1IGluZGljYXRlcyB0aGF0IHRoZSBuZXh0IDQgYnl0ZXNcbiAqIGFyZSBhIHR3byBjb21wbGVtZW50IHNpZ25lZCBpbnRlZ2VyLiBUaGUgZmlyc3Qgb2YgdGhlc2UgYnl0ZXMgY29udGFpbnMgdGhlXG4gKiBoaWdoZXN0IG9yZGVyIGJpdHMsIHRoZSBzZWNvbmQgYnl0ZSBjb250YWlucyB0aGUgbmV4dCBoaWdoZXIgb3JkZXIgYml0c1xuICogYW5kIHRoZSBmb3VydGggYnl0ZSBjb250YWluIHRoZSBsb3dlc3Qgb3JkZXIgYml0cy5cbiAqXG4gKlxuICogQ2hhclN0cmluZyBDb21tYW5kIEVuY29kaW5nOlxuICogIENoYXJTdHJpbmdzIGNvbW1hbmRzIGFyZSBlbmNvZGVkIGluIDEgb3IgMiBieXRlcy5cbiAqXG4gKiAgU2luZ2xlIGJ5dGUgY29tbWFuZHMgYXJlIGVuY29kZWQgaW4gMSBieXRlIHRoYXQgY29udGFpbnMgYSB2YWx1ZSBiZXR3ZWVuXG4gKiAgMCBhbmQgMzEgaW5jbHVzaXZlLlxuICogIElmIGEgY29tbWFuZCBieXRlIGNvbnRhaW5zIHRoZSB2YWx1ZSAxMiwgdGhlbiB0aGUgdmFsdWUgaW4gdGhlIG5leHQgYnl0ZVxuICogIGluZGljYXRlcyBhIGNvbW1hbmQuIFRoaXMgXCJlc2NhcGVcIiBtZWNoYW5pc20gYWxsb3dzIG1hbnkgZXh0cmEgY29tbWFuZHNcbiAqIHRvIGJlIGVuY29kZWQgYW5kIHRoaXMgZW5jb2RpbmcgdGVjaG5pcXVlIGhlbHBzIHRvIG1pbmltaXplIHRoZSBsZW5ndGggb2ZcbiAqIHRoZSBjaGFyU3RyaW5ncy5cbiAqL1xudmFyIFR5cGUxQ2hhclN0cmluZyA9IChmdW5jdGlvbiBUeXBlMUNoYXJTdHJpbmdDbG9zdXJlKCkge1xuICB2YXIgQ09NTUFORF9NQVAgPSB7XG4gICAgaHN0ZW06IFsxXSxcbiAgICB2c3RlbTogWzNdLFxuICAgIHZtb3ZldG86IFs0XSxcbiAgICBybGluZXRvOiBbNV0sXG4gICAgaGxpbmV0bzogWzZdLFxuICAgIHZsaW5ldG86IFs3XSxcbiAgICBycmN1cnZldG86IFs4XSxcbiAgICBjYWxsc3VicjogWzEwXSxcbiAgICBmbGV4OiBbMTIsIDM1XSxcbiAgICBkcm9wOiBbMTIsIDE4XSxcbiAgICBlbmRjaGFyOiBbMTRdLFxuICAgIHJtb3ZldG86IFsyMV0sXG4gICAgaG1vdmV0bzogWzIyXSxcbiAgICB2aGN1cnZldG86IFszMF0sXG4gICAgaHZjdXJ2ZXRvOiBbMzFdLFxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gVHlwZTFDaGFyU3RyaW5nKCkge1xuICAgIHRoaXMud2lkdGggPSAwO1xuICAgIHRoaXMubHNiID0gMDtcbiAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm91dHB1dCA9IFtdO1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgfVxuXG4gIFR5cGUxQ2hhclN0cmluZy5wcm90b3R5cGUgPSB7XG4gICAgY29udmVydDogZnVuY3Rpb24gVHlwZTFDaGFyU3RyaW5nX2NvbnZlcnQoXG4gICAgICBlbmNvZGVkLFxuICAgICAgc3VicnMsXG4gICAgICBzZWFjQW5hbHlzaXNFbmFibGVkXG4gICAgKSB7XG4gICAgICB2YXIgY291bnQgPSBlbmNvZGVkLmxlbmd0aDtcbiAgICAgIHZhciBlcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIHd4LCBzYngsIHN1YnJOdW1iZXI7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZW5jb2RlZFtpXTtcbiAgICAgICAgaWYgKHZhbHVlIDwgMzIpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IDEyKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSArIGVuY29kZWRbKytpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAxOiAvLyBoc3RlbVxuICAgICAgICAgICAgICBpZiAoIUhJTlRJTkdfRU5BQkxFRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaHN0ZW0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzogLy8gdnN0ZW1cbiAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6IC8vIHZtb3ZldG9cbiAgICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGR4IGZvciBmbGV4IGFuZCBidXQgYWxzbyBzd2FwIHRoZSB2YWx1ZXMgc28gdGhleSBhcmVcbiAgICAgICAgICAgICAgICAvLyB0aGUgcmlnaHQgb3JkZXIuXG4gICAgICAgICAgICAgICAgdmFyIGR5ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCwgZHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bW92ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDU6IC8vIHJsaW5ldG9cbiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnJsaW5ldG8pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNjogLy8gaGxpbmV0b1xuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAuaGxpbmV0byk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA3OiAvLyB2bGluZXRvXG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bGluZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDg6IC8vIHJyY3VydmV0b1xuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNiwgQ09NTUFORF9NQVAucnJjdXJ2ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDk6IC8vIGNsb3NlcGF0aFxuICAgICAgICAgICAgICAvLyBjbG9zZXBhdGggaXMgYSBUeXBlMSBjb21tYW5kIHRoYXQgZG9lcyBub3QgdGFrZSBhcmd1bWVudCBhbmQgaXNcbiAgICAgICAgICAgICAgLy8gdXNlbGVzcyBpbiBUeXBlMiBhbmQgaXQgY2FuIHNpbXBseSBiZSBpZ25vcmVkLlxuICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMDogLy8gY2FsbHN1YnJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdWJyTnVtYmVyID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgaWYgKCFzdWJyc1tzdWJyTnVtYmVyXSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuY29udmVydChcbiAgICAgICAgICAgICAgICBzdWJyc1tzdWJyTnVtYmVyXSxcbiAgICAgICAgICAgICAgICBzdWJycyxcbiAgICAgICAgICAgICAgICBzZWFjQW5hbHlzaXNFbmFibGVkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMTogLy8gcmV0dXJuXG4gICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIGNhc2UgMTM6IC8vIGhzYndcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUbyBjb252ZXJ0IHRvIHR5cGUyIHdlIGhhdmUgdG8gbW92ZSB0aGUgd2lkdGggdmFsdWUgdG8gdGhlXG4gICAgICAgICAgICAgIC8vIGZpcnN0IHBhcnQgb2YgdGhlIGNoYXJzdHJpbmcgYW5kIHRoZW4gdXNlIGhtb3ZldG8gd2l0aCBsc2IuXG4gICAgICAgICAgICAgIHd4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7XG4gICAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDtcbiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngpO1xuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaG1vdmV0byk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxNDogLy8gZW5kY2hhclxuICAgICAgICAgICAgICB0aGlzLm91dHB1dC5wdXNoKENPTU1BTkRfTUFQLmVuZGNoYXJbMF0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjE6IC8vIHJtb3ZldG9cbiAgICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybW92ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDIyOiAvLyBobW92ZXRvXG4gICAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGR5IGZvciBmbGV4LlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCgwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAuaG1vdmV0byk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzMDogLy8gdmhjdXJ2ZXRvXG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC52aGN1cnZldG8pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzE6IC8vIGh2Y3VydmV0b1xuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNCwgQ09NTUFORF9NQVAuaHZjdXJ2ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDA6IC8vIGRvdHNlY3Rpb25cbiAgICAgICAgICAgICAgLy8gZG90c2VjdGlvbiBpcyBhIFR5cGUxIGNvbW1hbmQgdG8gc3BlY2lmeSBzb21lIGhpbnRpbmcgZmVhdHVyZVxuICAgICAgICAgICAgICAvLyBmb3IgZG90cyB0aGF0IGRvIG5vdCB0YWtlIGEgcGFyYW1ldGVyIGFuZCBpdCBjYW4gc2FmZWx5IGJlXG4gICAgICAgICAgICAgIC8vIGlnbm9yZWQgZm9yIFR5cGUyLlxuICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxOiAvLyB2c3RlbTNcbiAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gW3ZoXXN0ZW0zIGFyZSBUeXBlMSBvbmx5IGFuZCBUeXBlMiBzdXBwb3J0cyBbdmhdc3RlbSB3aXRoXG4gICAgICAgICAgICAgIC8vIG11bHRpcGxlIHBhcmFtZXRlcnMsIHNvIGluc3RlYWQgb2YgcmV0dXJuaW5nIFt2aF1zdGVtMyB0YWtlIGFcbiAgICAgICAgICAgICAgLy8gc2hvcnRjdXQgYW5kIHJldHVybiBbdmhzdGVtXSBpbnN0ZWFkLlxuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAudnN0ZW0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMjogLy8gaHN0ZW0zXG4gICAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNlZSB2c3RlbTMuXG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA2OiAvLyBzZWFjXG4gICAgICAgICAgICAgIC8vIHNlYWMgaXMgbGlrZSB0eXBlIDIncyBzcGVjaWFsIGVuZGNoYXIgYnV0IGl0IGRvZXNuJ3QgdXNlIHRoZVxuICAgICAgICAgICAgICAvLyBmaXJzdCBhcmd1bWVudCBhc2IsIHNvIHJlbW92ZSBpdC5cbiAgICAgICAgICAgICAgaWYgKHNlYWNBbmFseXNpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhc2IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gNV07XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFjID0gdGhpcy5zdGFjay5zcGxpY2UoLTQsIDQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhY1swXSArPSB0aGlzLmxzYiAtIGFzYjtcbiAgICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMCwgQ09NTUFORF9NQVAuZW5kY2hhcik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDQsIENPTU1BTkRfTUFQLmVuZGNoYXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA3OiAvLyBzYndcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgNCkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUbyBjb252ZXJ0IHRvIHR5cGUyIHdlIGhhdmUgdG8gbW92ZSB0aGUgd2lkdGggdmFsdWUgdG8gdGhlXG4gICAgICAgICAgICAgIC8vIGZpcnN0IHBhcnQgb2YgdGhlIGNoYXJzdHJpbmcgYW5kIHRoZW4gdXNlIHJtb3ZldG8gd2l0aFxuICAgICAgICAgICAgICAvLyAoZHgsIGR5KS4gVGhlIGhlaWdodCBhcmd1bWVudCB3aWxsIG5vdCBiZSB1c2VkIGZvciB2bXR4IGFuZFxuICAgICAgICAgICAgICAvLyB2aGVhIHRhYmxlcyByZWNvbnN0cnVjdGlvbiAtLSBpZ25vcmluZyBpdC5cbiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsgLy8gd3lcbiAgICAgICAgICAgICAgd3ggPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICB2YXIgc2J5ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7XG4gICAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDtcbiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngsIHNieSk7XG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgzLCBDT01NQU5EX01BUC5ybW92ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDEyOiAvLyBkaXZcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgbnVtMiA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHZhciBudW0xID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKG51bTEgLyBudW0yKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE2OiAvLyBjYWxsb3RoZXJzdWJyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHZhciBudW1BcmdzID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgaWYgKHN1YnJOdW1iZXIgPT09IDAgJiYgbnVtQXJncyA9PT0gMykge1xuICAgICAgICAgICAgICAgIHZhciBmbGV4QXJncyA9IHRoaXMuc3RhY2suc3BsaWNlKHRoaXMuc3RhY2subGVuZ3RoIC0gMTcsIDE3KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goXG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1syXSArIGZsZXhBcmdzWzBdLCAvLyBiY3AxeCArIHJweFxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbM10gKyBmbGV4QXJnc1sxXSwgLy8gYmNwMXkgKyBycHlcbiAgICAgICAgICAgICAgICAgIGZsZXhBcmdzWzRdLCAvLyBiY3AyeFxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbNV0sIC8vIGJjcDJ5XG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1s2XSwgLy8gcDJ4XG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1s3XSwgLy8gcDJ5XG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1s4XSwgLy8gYmNwM3hcbiAgICAgICAgICAgICAgICAgIGZsZXhBcmdzWzldLCAvLyBiY3AzeVxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbMTBdLCAvLyBiY3A0eFxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbMTFdLCAvLyBiY3A0eVxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbMTJdLCAvLyBwM3hcbiAgICAgICAgICAgICAgICAgIGZsZXhBcmdzWzEzXSwgLy8gcDN5XG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1sxNF0gLy8gZmxleERlcHRoXG4gICAgICAgICAgICAgICAgICAvLyAxNSA9IGZpbmFseCB1bnVzZWQgYnkgZmxleFxuICAgICAgICAgICAgICAgICAgLy8gMTYgPSBmaW5hbHkgdW51c2VkIGJ5IGZsZXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxMywgQ09NTUFORF9NQVAuZmxleCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbGV4aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGZsZXhBcmdzWzE1XSwgZmxleEFyZ3NbMTZdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJyTnVtYmVyID09PSAxICYmIG51bUFyZ3MgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNzogLy8gcG9wXG4gICAgICAgICAgICAgIC8vIElnbm9yZSB0aGlzIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCB3aXRoIG90aGVyc3Vici5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDMzOiAvLyBzZXRjdXJyZW50cG9pbnRcbiAgICAgICAgICAgICAgLy8gSWdub3JlIGZvciBub3cuXG4gICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB3YXJuKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgXCInICsgdmFsdWUgKyAnXCInKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI0Nikge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUgLSAxMzk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjUwKSB7XG4gICAgICAgICAgdmFsdWUgPSAodmFsdWUgLSAyNDcpICogMjU2ICsgZW5jb2RlZFsrK2ldICsgMTA4O1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1NCkge1xuICAgICAgICAgIHZhbHVlID0gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGVuY29kZWRbKytpXSAtIDEwODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9XG4gICAgICAgICAgICAoKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDI0KSB8XG4gICAgICAgICAgICAoKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDE2KSB8XG4gICAgICAgICAgICAoKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDgpIHxcbiAgICAgICAgICAgICgoZW5jb2RlZFsrK2ldICYgMHhmZikgPDwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuXG4gICAgZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykge1xuICAgICAgdmFyIHN0YWNrTGVuZ3RoID0gdGhpcy5zdGFjay5sZW5ndGg7XG4gICAgICBpZiAoaG93TWFueUFyZ3MgPiBzdGFja0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdGFydCA9IHN0YWNrTGVuZ3RoIC0gaG93TWFueUFyZ3M7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBzdGFja0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc3RhY2tbaV07XG4gICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgIHRoaXMub3V0cHV0LnB1c2goMjgsICh2YWx1ZSA+PiA4KSAmIDB4ZmYsIHZhbHVlICYgMHhmZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZml4ZWQgcG9pbnRcbiAgICAgICAgICB2YWx1ZSA9ICg2NTUzNiAqIHZhbHVlKSB8IDA7XG4gICAgICAgICAgdGhpcy5vdXRwdXQucHVzaChcbiAgICAgICAgICAgIDI1NSxcbiAgICAgICAgICAgICh2YWx1ZSA+PiAyNCkgJiAweGZmLFxuICAgICAgICAgICAgKHZhbHVlID4+IDE2KSAmIDB4ZmYsXG4gICAgICAgICAgICAodmFsdWUgPj4gOCkgJiAweGZmLFxuICAgICAgICAgICAgdmFsdWUgJiAweGZmXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5vdXRwdXQucHVzaC5hcHBseSh0aGlzLm91dHB1dCwgY29tbWFuZCk7XG4gICAgICBpZiAoa2VlcFN0YWNrKSB7XG4gICAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gVHlwZTFDaGFyU3RyaW5nO1xufSkoKTtcblxuLypcbiAqIFR5cGUxUGFyc2VyIGVuY2Fwc3VsYXRlIHRoZSBuZWVkZWQgY29kZSBmb3IgcGFyc2luZyBhIFR5cGUxIGZvbnRcbiAqIHByb2dyYW0uIFNvbWUgb2YgaXRzIGxvZ2ljIGRlcGVuZHMgb24gdGhlIFR5cGUyIGNoYXJzdHJpbmdzXG4gKiBzdHJ1Y3R1cmUuXG4gKiBOb3RlOiB0aGlzIGRvZXNuJ3QgcmVhbGx5IHBhcnNlIHRoZSBmb250IHNpbmNlIHRoYXQgd291bGQgcmVxdWlyZSBldmFsdWF0aW9uXG4gKiBvZiBQb3N0U2NyaXB0LCBidXQgaXQgaXMgcG9zc2libGUgaW4gbW9zdCBjYXNlcyB0byBleHRyYWN0IHdoYXQgd2UgbmVlZFxuICogd2l0aG91dCBhIGZ1bGwgcGFyc2UuXG4gKi9cbnZhciBUeXBlMVBhcnNlciA9IChmdW5jdGlvbiBUeXBlMVBhcnNlckNsb3N1cmUoKSB7XG4gIC8qXG4gICAqIERlY3J5cHQgYSBTZXF1ZW5jZSBvZiBDaXBoZXJ0ZXh0IEJ5dGVzIHRvIFByb2R1Y2UgdGhlIE9yaWdpbmFsIFNlcXVlbmNlXG4gICAqIG9mIFBsYWludGV4dCBCeXRlcy4gVGhlIGZ1bmN0aW9uIHRvb2sgYSBrZXkgYXMgYSBwYXJhbWV0ZXIgd2hpY2ggY2FuIGJlXG4gICAqIGZvciBkZWNyeXB0aW5nIHRoZSBlZXhlYyBibG9jayBvZiBmb3IgZGVjb2RpbmcgY2hhclN0cmluZ3MuXG4gICAqL1xuICB2YXIgRUVYRUNfRU5DUllQVF9LRVkgPSA1NTY2NTtcbiAgdmFyIENIQVJfU1RSU19FTkNSWVBUX0tFWSA9IDQzMzA7XG5cbiAgZnVuY3Rpb24gaXNIZXhEaWdpdChjb2RlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHx8IC8vICcwJy0nOSdcbiAgICAgIChjb2RlID49IDY1ICYmIGNvZGUgPD0gNzApIHx8IC8vICdBJy0nRidcbiAgICAgIChjb2RlID49IDk3ICYmIGNvZGUgPD0gMTAyKSAvLyAnYSctJ2YnXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY3J5cHQoZGF0YSwga2V5LCBkaXNjYXJkTnVtYmVyKSB7XG4gICAgaWYgKGRpc2NhcmROdW1iZXIgPj0gZGF0YS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgdmFyIHIgPSBrZXkgfCAwLFxuICAgICAgYzEgPSA1Mjg0NSxcbiAgICAgIGMyID0gMjI3MTksXG4gICAgICBpLFxuICAgICAgajtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZGlzY2FyZE51bWJlcjsgaSsrKSB7XG4gICAgICByID0gKChkYXRhW2ldICsgcikgKiBjMSArIGMyKSAmICgoMSA8PCAxNikgLSAxKTtcbiAgICB9XG4gICAgdmFyIGNvdW50ID0gZGF0YS5sZW5ndGggLSBkaXNjYXJkTnVtYmVyO1xuICAgIHZhciBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShjb3VudCk7XG4gICAgZm9yIChpID0gZGlzY2FyZE51bWJlciwgaiA9IDA7IGogPCBjb3VudDsgaSsrLCBqKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGRhdGFbaV07XG4gICAgICBkZWNyeXB0ZWRbal0gPSB2YWx1ZSBeIChyID4+IDgpO1xuICAgICAgciA9ICgodmFsdWUgKyByKSAqIGMxICsgYzIpICYgKCgxIDw8IDE2KSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVjcnlwdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikge1xuICAgIHZhciByID0ga2V5IHwgMCxcbiAgICAgIGMxID0gNTI4NDUsXG4gICAgICBjMiA9IDIyNzE5O1xuICAgIHZhciBjb3VudCA9IGRhdGEubGVuZ3RoLFxuICAgICAgbWF5YmVMZW5ndGggPSBjb3VudCA+Pj4gMTtcbiAgICB2YXIgZGVjcnlwdGVkID0gbmV3IFVpbnQ4QXJyYXkobWF5YmVMZW5ndGgpO1xuICAgIHZhciBpLCBqO1xuICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgdmFyIGRpZ2l0MSA9IGRhdGFbaV07XG4gICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQxKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICAgIHZhciBkaWdpdDI7XG4gICAgICB3aGlsZSAoaSA8IGNvdW50ICYmICFpc0hleERpZ2l0KChkaWdpdDIgPSBkYXRhW2ldKSkpIHtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgaWYgKGkgPCBjb3VudCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZUludChTdHJpbmcuZnJvbUNoYXJDb2RlKGRpZ2l0MSwgZGlnaXQyKSwgMTYpO1xuICAgICAgICBkZWNyeXB0ZWRbaisrXSA9IHZhbHVlIF4gKHIgPj4gOCk7XG4gICAgICAgIHIgPSAoKHZhbHVlICsgcikgKiBjMSArIGMyKSAmICgoMSA8PCAxNikgLSAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlY3J5cHRlZC5zbGljZShkaXNjYXJkTnVtYmVyLCBqKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3BlY2lhbChjKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGMgPT09IC8qICcvJyA9ICovIDB4MmYgfHxcbiAgICAgIGMgPT09IC8qICdbJyA9ICovIDB4NWIgfHxcbiAgICAgIGMgPT09IC8qICddJyA9ICovIDB4NWQgfHxcbiAgICAgIGMgPT09IC8qICd7JyA9ICovIDB4N2IgfHxcbiAgICAgIGMgPT09IC8qICd9JyA9ICovIDB4N2QgfHxcbiAgICAgIGMgPT09IC8qICcoJyA9ICovIDB4MjggfHxcbiAgICAgIGMgPT09IC8qICcpJyA9ICovIDB4MjlcbiAgICApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBUeXBlMVBhcnNlcihzdHJlYW0sIGVuY3J5cHRlZCwgc2VhY0FuYWx5c2lzRW5hYmxlZCkge1xuICAgIGlmIChlbmNyeXB0ZWQpIHtcbiAgICAgIHZhciBkYXRhID0gc3RyZWFtLmdldEJ5dGVzKCk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSAhKFxuICAgICAgICAoaXNIZXhEaWdpdChkYXRhWzBdKSB8fCBpc1doaXRlU3BhY2UoZGF0YVswXSkpICYmXG4gICAgICAgIGlzSGV4RGlnaXQoZGF0YVsxXSkgJiZcbiAgICAgICAgaXNIZXhEaWdpdChkYXRhWzJdKSAmJlxuICAgICAgICBpc0hleERpZ2l0KGRhdGFbM10pICYmXG4gICAgICAgIGlzSGV4RGlnaXQoZGF0YVs0XSkgJiZcbiAgICAgICAgaXNIZXhEaWdpdChkYXRhWzVdKSAmJlxuICAgICAgICBpc0hleERpZ2l0KGRhdGFbNl0pICYmXG4gICAgICAgIGlzSGV4RGlnaXQoZGF0YVs3XSlcbiAgICAgICk7XG4gICAgICBzdHJlYW0gPSBuZXcgU3RyZWFtKFxuICAgICAgICBpc0JpbmFyeVxuICAgICAgICAgID8gZGVjcnlwdChkYXRhLCBFRVhFQ19FTkNSWVBUX0tFWSwgNClcbiAgICAgICAgICA6IGRlY3J5cHRBc2NpaShkYXRhLCBFRVhFQ19FTkNSWVBUX0tFWSwgNClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDtcblxuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMubmV4dENoYXIoKTtcbiAgfVxuXG4gIFR5cGUxUGFyc2VyLnByb3RvdHlwZSA9IHtcbiAgICByZWFkTnVtYmVyQXJyYXk6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWROdW1iZXJBcnJheSgpIHtcbiAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCAnWycgb3IgJ3snIChhcnJheXMgY2FuIHN0YXJ0IHdpdGggZWl0aGVyKVxuICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gXCJdXCIgfHwgdG9rZW4gPT09IFwifVwiKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXkucHVzaChwYXJzZUZsb2F0KHRva2VuIHx8IDApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9LFxuXG4gICAgcmVhZE51bWJlcjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZE51bWJlcigpIHtcbiAgICAgIHZhciB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRva2VuIHx8IDApO1xuICAgIH0sXG5cbiAgICByZWFkSW50OiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkSW50KCkge1xuICAgICAgLy8gVXNlICd8IDAnIHRvIHByZXZlbnQgc2V0dGluZyBhIGRvdWJsZSBpbnRvIGxlbmd0aCBzdWNoIGFzIHRoZSBkb3VibGVcbiAgICAgIC8vIGRvZXMgbm90IGZsb3cgaW50byB0aGUgbG9vcCB2YXJpYWJsZS5cbiAgICAgIHZhciB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgIHJldHVybiBwYXJzZUludCh0b2tlbiB8fCAwLCAxMCkgfCAwO1xuICAgIH0sXG5cbiAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZEJvb2xlYW4oKSB7XG4gICAgICB2YXIgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG5cbiAgICAgIC8vIFVzZSAxIGFuZCAwIHNpbmNlIHRoYXQncyB3aGF0IHR5cGUyIGNoYXJzdHJpbmdzIHVzZS5cbiAgICAgIHJldHVybiB0b2tlbiA9PT0gXCJ0cnVlXCIgPyAxIDogMDtcbiAgICB9LFxuXG4gICAgbmV4dENoYXI6IGZ1bmN0aW9uIFR5cGUxX25leHRDaGFyKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKTtcbiAgICB9LFxuXG4gICAgZ2V0VG9rZW46IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX2dldFRva2VuKCkge1xuICAgICAgLy8gRWF0IHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLlxuICAgICAgdmFyIGNvbW1lbnQgPSBmYWxzZTtcbiAgICAgIHZhciBjaCA9IHRoaXMuY3VycmVudENoYXI7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoY2ggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkge1xuICAgICAgICAgICAgY29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gLyogJyUnID0gKi8gMHgyNSkge1xuICAgICAgICAgIGNvbW1lbnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTcGVjaWFsKGNoKSkge1xuICAgICAgICB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgIH1cbiAgICAgIHZhciB0b2tlbiA9IFwiXCI7XG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgIH0gd2hpbGUgKGNoID49IDAgJiYgIWlzV2hpdGVTcGFjZShjaCkgJiYgIWlzU3BlY2lhbChjaCkpO1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH0sXG5cbiAgICByZWFkQ2hhclN0cmluZ3M6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWRDaGFyU3RyaW5ncyhieXRlcywgbGVuSVYpIHtcbiAgICAgIGlmIChsZW5JViA9PT0gLTEpIHtcbiAgICAgICAgLy8gVGhpcyBpc24ndCBpbiB0aGUgc3BlYywgYnV0IEFkb2JlJ3MgdHggcHJvZ3JhbSBoYW5kbGVzIC0xXG4gICAgICAgIC8vIGFzIHBsYWluIHRleHQuXG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWNyeXB0KGJ5dGVzLCBDSEFSX1NUUlNfRU5DUllQVF9LRVksIGxlbklWKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIGEgU3VicnMgYXJyYXkgYW5kIGEgQ2hhclN0cmluZ3NcbiAgICAgKiBhcnJheSBleHRyYWN0ZWQgZnJvbSBhbmQgZWV4ZWMgZW5jcnlwdGVkIGJsb2NrIG9mIGRhdGFcbiAgICAgKi9cbiAgICBleHRyYWN0Rm9udFByb2dyYW06IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX2V4dHJhY3RGb250UHJvZ3JhbShwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07XG5cbiAgICAgIHZhciBzdWJycyA9IFtdLFxuICAgICAgICBjaGFyc3RyaW5ncyA9IFtdO1xuICAgICAgdmFyIHByaXZhdGVEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHByaXZhdGVEYXRhLmxlbklWID0gNDtcbiAgICAgIHZhciBwcm9ncmFtID0ge1xuICAgICAgICBzdWJyczogW10sXG4gICAgICAgIGNoYXJzdHJpbmdzOiBbXSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHByaXZhdGVEYXRhLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHZhciB0b2tlbiwgbGVuZ3RoLCBkYXRhLCBsZW5JViwgZW5jb2RlZDtcbiAgICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmdldFRva2VuKCkpICE9PSBudWxsKSB7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gXCIvXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICAgIGNhc2UgXCJDaGFyU3RyaW5nc1wiOlxuICAgICAgICAgICAgLy8gVGhlIG51bWJlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgQ2hhclN0cmluZ3MgbXVzdCBiZSBncmVhdGVyIG9yXG4gICAgICAgICAgICAvLyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIENoYXJTdHJpbmdzLlxuICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIGluICdkaWN0J1xuICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIGluICdkdXAnXG4gICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7IC8vIHJlYWQgaW4gJ2JlZ2luJ1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gXCJlbmRcIikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHRva2VuICE9PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBnbHlwaCA9IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5yZWFkSW50KCk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnUkQnIG9yICctfCdcbiAgICAgICAgICAgICAgZGF0YSA9IGxlbmd0aCA+IDAgPyBzdHJlYW0uZ2V0Qnl0ZXMobGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICAgICAgICBsZW5JViA9IHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjtcbiAgICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMucmVhZENoYXJTdHJpbmdzKGRhdGEsIGxlbklWKTtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnTkQnIG9yICd8LSdcbiAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBcIm5vYWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7IC8vIHJlYWQgaW4gJ2RlZidcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaGFyc3RyaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgICBnbHlwaCxcbiAgICAgICAgICAgICAgICBlbmNvZGVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJTdWJyc1wiOlxuICAgICAgICAgICAgdGhpcy5yZWFkSW50KCk7IC8vIG51bVxuICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIGluICdhcnJheSdcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmdldFRva2VuKCkgPT09IFwiZHVwXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlYWRJbnQoKTtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5yZWFkSW50KCk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnUkQnIG9yICctfCdcbiAgICAgICAgICAgICAgZGF0YSA9IGxlbmd0aCA+IDAgPyBzdHJlYW0uZ2V0Qnl0ZXMobGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICAgICAgICBsZW5JViA9IHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjtcbiAgICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMucmVhZENoYXJTdHJpbmdzKGRhdGEsIGxlbklWKTtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnTlAnIG9yICd8J1xuICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IFwibm9hY2Nlc3NcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAncHV0J1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN1YnJzW2luZGV4XSA9IGVuY29kZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQmx1ZVZhbHVlc1wiOlxuICAgICAgICAgIGNhc2UgXCJPdGhlckJsdWVzXCI6XG4gICAgICAgICAgY2FzZSBcIkZhbWlseUJsdWVzXCI6XG4gICAgICAgICAgY2FzZSBcIkZhbWlseU90aGVyQmx1ZXNcIjpcbiAgICAgICAgICAgIHZhciBibHVlQXJyYXkgPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpO1xuICAgICAgICAgICAgLy8gKkJsdWUqIHZhbHVlcyBtYXkgY29udGFpbiBpbnZhbGlkIGRhdGE6IGRpc2FibGVzIHJlYWRpbmcgb2ZcbiAgICAgICAgICAgIC8vIHRob3NlIHZhbHVlcyB3aGVuIGhpbnRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGJsdWVBcnJheS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGJsdWVBcnJheS5sZW5ndGggJSAyID09PSAwICYmXG4gICAgICAgICAgICAgIEhJTlRJTkdfRU5BQkxFRFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSBibHVlQXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiU3RlbVNuYXBIXCI6XG4gICAgICAgICAgY2FzZSBcIlN0ZW1TbmFwVlwiOlxuICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlckFycmF5KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiU3RkSFdcIjpcbiAgICAgICAgICBjYXNlIFwiU3RkVldcIjpcbiAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkJsdWVTaGlmdFwiOlxuICAgICAgICAgIGNhc2UgXCJsZW5JVlwiOlxuICAgICAgICAgIGNhc2UgXCJCbHVlRnV6elwiOlxuICAgICAgICAgIGNhc2UgXCJCbHVlU2NhbGVcIjpcbiAgICAgICAgICBjYXNlIFwiTGFuZ3VhZ2VHcm91cFwiOlxuICAgICAgICAgIGNhc2UgXCJFeHBhbnNpb25GYWN0b3JcIjpcbiAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXIoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJGb3JjZUJvbGRcIjpcbiAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWRCb29sZWFuKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGdseXBoID0gY2hhcnN0cmluZ3NbaV0uZ2x5cGg7XG4gICAgICAgIGVuY29kZWQgPSBjaGFyc3RyaW5nc1tpXS5lbmNvZGVkO1xuICAgICAgICB2YXIgY2hhclN0cmluZyA9IG5ldyBUeXBlMUNoYXJTdHJpbmcoKTtcbiAgICAgICAgdmFyIGVycm9yID0gY2hhclN0cmluZy5jb252ZXJ0KFxuICAgICAgICAgIGVuY29kZWQsXG4gICAgICAgICAgc3VicnMsXG4gICAgICAgICAgdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkXG4gICAgICAgICk7XG4gICAgICAgIHZhciBvdXRwdXQgPSBjaGFyU3RyaW5nLm91dHB1dDtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgLy8gSXQgc2VlbXMgd2hlbiBGcmVlVHlwZSBlbmNvdW50ZXJzIGFuIGVycm9yIHdoaWxlIGV2YWx1YXRpbmcgYSBnbHlwaFxuICAgICAgICAgIC8vIHRoYXQgaXQgY29tcGxldGVseSBpZ25vcmVzIHRoZSBnbHlwaCBzbyB3ZSdsbCBtaW1pYyB0aGF0IGJlaGF2aW91clxuICAgICAgICAgIC8vIGhlcmUgYW5kIHB1dCBhbiBlbmRjaGFyIHRvIG1ha2UgdGhlIHZhbGlkYXRvciBoYXBweS5cbiAgICAgICAgICBvdXRwdXQgPSBbMTRdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYXJTdHJpbmdPYmplY3QgPSB7XG4gICAgICAgICAgZ2x5cGhOYW1lOiBnbHlwaCxcbiAgICAgICAgICBjaGFyc3RyaW5nOiBvdXRwdXQsXG4gICAgICAgICAgd2lkdGg6IGNoYXJTdHJpbmcud2lkdGgsXG4gICAgICAgICAgbHNiOiBjaGFyU3RyaW5nLmxzYixcbiAgICAgICAgICBzZWFjOiBjaGFyU3RyaW5nLnNlYWMsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChnbHlwaCA9PT0gXCIubm90ZGVmXCIpIHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgLm5vdGRlZiBpcyBhdCBpbmRleCB6ZXJvIChpc3N1ZSAjMTE0NzcpLlxuICAgICAgICAgIHByb2dyYW0uY2hhcnN0cmluZ3MudW5zaGlmdChjaGFyU3RyaW5nT2JqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9ncmFtLmNoYXJzdHJpbmdzLnB1c2goY2hhclN0cmluZ09iamVjdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRlbXB0IHRvIHJlcGxhY2UgbWlzc2luZyB3aWR0aHMsIGZyb20gdGhlIGZvbnQgZGljdGlvbmFyeSAvV2lkdGhzXG4gICAgICAgIC8vIGVudHJ5LCB3aXRoIG9uZXMgZnJvbSB0aGUgZm9udCBkYXRhIChmaXhlcyBpc3N1ZTExMTUwX3JlZHVjZWQucGRmKS5cbiAgICAgICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZy5pbmRleE9mKGdseXBoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbmRleCA+IC0xICYmXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLndpZHRoc1tpbmRleF0gPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgaW5kZXggPj0gcHJvcGVydGllcy5maXJzdENoYXIgJiZcbiAgICAgICAgICAgIGluZGV4IDw9IHByb3BlcnRpZXMubGFzdENoYXJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9IGNoYXJTdHJpbmcud2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH0sXG5cbiAgICBleHRyYWN0Rm9udEhlYWRlcjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcykge1xuICAgICAgdmFyIHRva2VuO1xuICAgICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHRva2VuICE9PSBcIi9cIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpO1xuICAgICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgICAgY2FzZSBcIkZvbnRNYXRyaXhcIjpcbiAgICAgICAgICAgIHZhciBtYXRyaXggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpO1xuICAgICAgICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gbWF0cml4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkVuY29kaW5nXCI6XG4gICAgICAgICAgICB2YXIgZW5jb2RpbmdBcmcgPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICB2YXIgZW5jb2Rpbmc7XG4gICAgICAgICAgICBpZiAoIS9eXFxkKyQvLnRlc3QoZW5jb2RpbmdBcmcpKSB7XG4gICAgICAgICAgICAgIC8vIGVuY29kaW5nIG5hbWUgaXMgc3BlY2lmaWVkXG4gICAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoZW5jb2RpbmdBcmcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW5jb2RpbmcgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIHNpemUgPSBwYXJzZUludChlbmNvZGluZ0FyZywgMTApIHwgMDtcbiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIGluICdhcnJheSdcblxuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNpemU7IGorKykge1xuICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpO1xuICAgICAgICAgICAgICAgIC8vIHNraXBwaW5nIHRpbGwgZmlyc3QgZHVwIG9yIGRlZiAoZS5nLiBpZ25vcmluZyBmb3Igc3RhdGVtZW50KVxuICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbiAhPT0gXCJkdXBcIiAmJiB0b2tlbiAhPT0gXCJkZWZcIikge1xuICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpbnZhbGlkIGhlYWRlclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IFwiZGVmXCIpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyByZWFkIGFsbCBhcnJheSBkYXRhXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMucmVhZEludCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnLydcbiAgICAgICAgICAgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gZ2x5cGg7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIHRoZSBpbiAncHV0J1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkZvbnRCQm94XCI6XG4gICAgICAgICAgICB2YXIgZm9udEJCb3ggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpO1xuICAgICAgICAgICAgLy8gYWRqdXN0aW5nIGFzY2VudC9kZXNjZW50XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudCA9IE1hdGgubWF4KGZvbnRCQm94WzNdLCBmb250QkJveFsxXSk7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmRlc2NlbnQgPSBNYXRoLm1pbihmb250QkJveFsxXSwgZm9udEJCb3hbM10pO1xuICAgICAgICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBUeXBlMVBhcnNlcjtcbn0pKCk7XG5cbmV4cG9ydCB7IFR5cGUxUGFyc2VyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBGb3JtYXRFcnJvcixcbiAgaW5mbyxcbiAgdW5yZWFjaGFibGUsXG4gIFVOU1VQUE9SVEVEX0ZFQVRVUkVTLFxuICBVdGlsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IENvbG9yU3BhY2UgfSBmcm9tIFwiLi9jb2xvcnNwYWNlLmpzXCI7XG5pbXBvcnQgeyBpc1N0cmVhbSB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IE1pc3NpbmdEYXRhRXhjZXB0aW9uIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuXG52YXIgU2hhZGluZ1R5cGUgPSB7XG4gIEZVTkNUSU9OX0JBU0VEOiAxLFxuICBBWElBTDogMixcbiAgUkFESUFMOiAzLFxuICBGUkVFX0ZPUk1fTUVTSDogNCxcbiAgTEFUVElDRV9GT1JNX01FU0g6IDUsXG4gIENPT05TX1BBVENIX01FU0g6IDYsXG4gIFRFTlNPUl9QQVRDSF9NRVNIOiA3LFxufTtcblxudmFyIFBhdHRlcm4gPSAoZnVuY3Rpb24gUGF0dGVybkNsb3N1cmUoKSB7XG4gIC8vIENvbnN0cnVjdG9yIHNob3VsZCBkZWZpbmUgdGhpcy5nZXRQYXR0ZXJuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUGF0dGVybigpIHtcbiAgICB1bnJlYWNoYWJsZShcInNob3VsZCBub3QgY2FsbCBQYXR0ZXJuIGNvbnN0cnVjdG9yXCIpO1xuICB9XG5cbiAgUGF0dGVybi5wcm90b3R5cGUgPSB7XG4gICAgLy8gSW5wdXQ6IGN1cnJlbnQgQ2FudmFzIGNvbnRleHRcbiAgICAvLyBPdXRwdXQ6IHRoZSBhcHByb3ByaWF0ZSBmaWxsU3R5bGUgb3Igc3Ryb2tlU3R5bGVcbiAgICBnZXRQYXR0ZXJuOiBmdW5jdGlvbiBQYXR0ZXJuX2dldFBhdHRlcm4oY3R4KSB7XG4gICAgICB1bnJlYWNoYWJsZShgU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm4uZ2V0U3R5bGU6ICR7Y3R4fWApO1xuICAgIH0sXG4gIH07XG5cbiAgUGF0dGVybi5wYXJzZVNoYWRpbmcgPSBmdW5jdGlvbiAoXG4gICAgc2hhZGluZyxcbiAgICBtYXRyaXgsXG4gICAgeHJlZixcbiAgICByZXMsXG4gICAgaGFuZGxlcixcbiAgICBwZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgKSB7XG4gICAgdmFyIGRpY3QgPSBpc1N0cmVhbShzaGFkaW5nKSA/IHNoYWRpbmcuZGljdCA6IHNoYWRpbmc7XG4gICAgdmFyIHR5cGUgPSBkaWN0LmdldChcIlNoYWRpbmdUeXBlXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLkFYSUFMOlxuICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLlJBRElBTDpcbiAgICAgICAgICAvLyBCb3RoIHJhZGlhbCBhbmQgYXhpYWwgc2hhZGluZ3MgYXJlIGhhbmRsZWQgYnkgUmFkaWFsQXhpYWwgc2hhZGluZy5cbiAgICAgICAgICByZXR1cm4gbmV3IFNoYWRpbmdzLlJhZGlhbEF4aWFsKFxuICAgICAgICAgICAgZGljdCxcbiAgICAgICAgICAgIG1hdHJpeCxcbiAgICAgICAgICAgIHhyZWYsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6XG4gICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6XG4gICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDpcbiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDpcbiAgICAgICAgICByZXR1cm4gbmV3IFNoYWRpbmdzLk1lc2goXG4gICAgICAgICAgICBzaGFkaW5nLFxuICAgICAgICAgICAgbWF0cml4LFxuICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJVbnN1cHBvcnRlZCBTaGFkaW5nVHlwZTogXCIgKyB0eXBlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICBoYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLnNoYWRpbmdQYXR0ZXJuLFxuICAgICAgfSk7XG4gICAgICB3YXJuKGV4KTtcbiAgICAgIHJldHVybiBuZXcgU2hhZGluZ3MuRHVtbXkoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBQYXR0ZXJuO1xufSkoKTtcblxudmFyIFNoYWRpbmdzID0ge307XG5cbi8vIEEgc21hbGwgbnVtYmVyIHRvIG9mZnNldCB0aGUgZmlyc3QvbGFzdCBjb2xvciBzdG9wcyBzbyB3ZSBjYW4gaW5zZXJ0IG9uZXMgdG9cbi8vIHN1cHBvcnQgZXh0ZW5kLiBOdW1iZXIuTUlOX1ZBTFVFIGlzIHRvbyBzbWFsbCBhbmQgYnJlYWtzIHRoZSBleHRlbmQuXG5TaGFkaW5ncy5TTUFMTF9OVU1CRVIgPSAxZS02O1xuXG4vLyBSYWRpYWwgYW5kIGF4aWFsIHNoYWRpbmcgaGF2ZSB2ZXJ5IHNpbWlsYXIgaW1wbGVtZW50YXRpb25zXG4vLyBJZiBuZWVkZWQsIHRoZSBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIGJyb2tlbiBpbnRvIHR3byBjbGFzc2VzXG5TaGFkaW5ncy5SYWRpYWxBeGlhbCA9IChmdW5jdGlvbiBSYWRpYWxBeGlhbENsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIFJhZGlhbEF4aWFsKFxuICAgIGRpY3QsXG4gICAgbWF0cml4LFxuICAgIHhyZWYsXG4gICAgcmVzb3VyY2VzLFxuICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICApIHtcbiAgICB0aGlzLm1hdHJpeCA9IG1hdHJpeDtcbiAgICB0aGlzLmNvb3Jkc0FyciA9IGRpY3QuZ2V0QXJyYXkoXCJDb29yZHNcIik7XG4gICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KFwiU2hhZGluZ1R5cGVcIik7XG4gICAgdGhpcy50eXBlID0gXCJQYXR0ZXJuXCI7XG4gICAgY29uc3QgY3MgPSBDb2xvclNwYWNlLnBhcnNlKHtcbiAgICAgIGNzOiBkaWN0LmdldFJhdyhcIkNvbG9yU3BhY2VcIikgfHwgZGljdC5nZXRSYXcoXCJDU1wiKSxcbiAgICAgIHhyZWYsXG4gICAgICByZXNvdXJjZXMsXG4gICAgICBwZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICB9KTtcbiAgICB0aGlzLmNzID0gY3M7XG4gICAgY29uc3QgYmJveCA9IGRpY3QuZ2V0QXJyYXkoXCJCQm94XCIpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7XG4gICAgICB0aGlzLmJib3ggPSBVdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmJveCA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHQwID0gMC4wLFxuICAgICAgdDEgPSAxLjA7XG4gICAgaWYgKGRpY3QuaGFzKFwiRG9tYWluXCIpKSB7XG4gICAgICB2YXIgZG9tYWluQXJyID0gZGljdC5nZXRBcnJheShcIkRvbWFpblwiKTtcbiAgICAgIHQwID0gZG9tYWluQXJyWzBdO1xuICAgICAgdDEgPSBkb21haW5BcnJbMV07XG4gICAgfVxuXG4gICAgdmFyIGV4dGVuZFN0YXJ0ID0gZmFsc2UsXG4gICAgICBleHRlbmRFbmQgPSBmYWxzZTtcbiAgICBpZiAoZGljdC5oYXMoXCJFeHRlbmRcIikpIHtcbiAgICAgIHZhciBleHRlbmRBcnIgPSBkaWN0LmdldEFycmF5KFwiRXh0ZW5kXCIpO1xuICAgICAgZXh0ZW5kU3RhcnQgPSBleHRlbmRBcnJbMF07XG4gICAgICBleHRlbmRFbmQgPSBleHRlbmRBcnJbMV07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMICYmXG4gICAgICAoIWV4dGVuZFN0YXJ0IHx8ICFleHRlbmRFbmQpXG4gICAgKSB7XG4gICAgICAvLyBSYWRpYWwgZ3JhZGllbnQgb25seSBjdXJyZW50bHkgd29ya3MgaWYgZWl0aGVyIGNpcmNsZSBpcyBmdWxseSB3aXRoaW5cbiAgICAgIC8vIHRoZSBvdGhlciBjaXJjbGUuXG4gICAgICB2YXIgeDEgPSB0aGlzLmNvb3Jkc0FyclswXTtcbiAgICAgIHZhciB5MSA9IHRoaXMuY29vcmRzQXJyWzFdO1xuICAgICAgdmFyIHIxID0gdGhpcy5jb29yZHNBcnJbMl07XG4gICAgICB2YXIgeDIgPSB0aGlzLmNvb3Jkc0FyclszXTtcbiAgICAgIHZhciB5MiA9IHRoaXMuY29vcmRzQXJyWzRdO1xuICAgICAgdmFyIHIyID0gdGhpcy5jb29yZHNBcnJbNV07XG4gICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoKHgxIC0geDIpICogKHgxIC0geDIpICsgKHkxIC0geTIpICogKHkxIC0geTIpKTtcbiAgICAgIGlmIChyMSA8PSByMiArIGRpc3RhbmNlICYmIHIyIDw9IHIxICsgZGlzdGFuY2UpIHtcbiAgICAgICAgd2FybihcIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5leHRlbmRTdGFydCA9IGV4dGVuZFN0YXJ0O1xuICAgIHRoaXMuZXh0ZW5kRW5kID0gZXh0ZW5kRW5kO1xuXG4gICAgdmFyIGZuT2JqID0gZGljdC5nZXRSYXcoXCJGdW5jdGlvblwiKTtcbiAgICB2YXIgZm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlRnJvbUFycmF5KGZuT2JqKTtcblxuICAgIC8vIDEwIHNhbXBsZXMgc2VlbXMgZ29vZCBlbm91Z2ggZm9yIG5vdywgYnV0IHByb2JhYmx5IHdvbid0IHdvcmtcbiAgICAvLyBpZiB0aGVyZSBhcmUgc2hhcnAgY29sb3IgY2hhbmdlcy4gSWRlYWxseSwgd2Ugd291bGQgaW1wbGVtZW50XG4gICAgLy8gdGhlIHNwZWMgZmFpdGhmdWxseSBhbmQgYWRkIGxvc3NsZXNzIG9wdGltaXphdGlvbnMuXG4gICAgY29uc3QgTlVNQkVSX09GX1NBTVBMRVMgPSAxMDtcbiAgICBjb25zdCBzdGVwID0gKHQxIC0gdDApIC8gTlVNQkVSX09GX1NBTVBMRVM7XG5cbiAgICB2YXIgY29sb3JTdG9wcyA9ICh0aGlzLmNvbG9yU3RvcHMgPSBbXSk7XG5cbiAgICAvLyBQcm90ZWN0IGFnYWluc3QgYmFkIGRvbWFpbnMuXG4gICAgaWYgKHQwID49IHQxIHx8IHN0ZXAgPD0gMCkge1xuICAgICAgLy8gQWNyb2JhdCBkb2Vzbid0IHNlZW0gdG8gaGFuZGxlIHRoZXNlIGNhc2VzIHNvIHdlJ2xsIGlnbm9yZSBmb3JcbiAgICAgIC8vIG5vdy5cbiAgICAgIGluZm8oXCJCYWQgc2hhZGluZyBkb21haW4uXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjb2xvciA9IG5ldyBGbG9hdDMyQXJyYXkoY3MubnVtQ29tcHMpLFxuICAgICAgcmF0aW8gPSBuZXcgRmxvYXQzMkFycmF5KDEpO1xuICAgIHZhciByZ2JDb2xvcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBOVU1CRVJfT0ZfU0FNUExFUzsgaSsrKSB7XG4gICAgICByYXRpb1swXSA9IHQwICsgaSAqIHN0ZXA7XG4gICAgICBmbihyYXRpbywgMCwgY29sb3IsIDApO1xuICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoY29sb3IsIDApO1xuICAgICAgdmFyIGNzc0NvbG9yID0gVXRpbC5tYWtlQ3NzUmdiKHJnYkNvbG9yWzBdLCByZ2JDb2xvclsxXSwgcmdiQ29sb3JbMl0pO1xuICAgICAgY29sb3JTdG9wcy5wdXNoKFtpIC8gTlVNQkVSX09GX1NBTVBMRVMsIGNzc0NvbG9yXSk7XG4gICAgfVxuXG4gICAgdmFyIGJhY2tncm91bmQgPSBcInRyYW5zcGFyZW50XCI7XG4gICAgaWYgKGRpY3QuaGFzKFwiQmFja2dyb3VuZFwiKSkge1xuICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoZGljdC5nZXQoXCJCYWNrZ3JvdW5kXCIpLCAwKTtcbiAgICAgIGJhY2tncm91bmQgPSBVdGlsLm1ha2VDc3NSZ2IocmdiQ29sb3JbMF0sIHJnYkNvbG9yWzFdLCByZ2JDb2xvclsyXSk7XG4gICAgfVxuXG4gICAgaWYgKCFleHRlbmRTdGFydCkge1xuICAgICAgLy8gSW5zZXJ0IGEgY29sb3Igc3RvcCBhdCB0aGUgZnJvbnQgYW5kIG9mZnNldCB0aGUgZmlyc3QgcmVhbCBjb2xvciBzdG9wXG4gICAgICAvLyBzbyBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggdGhlIG9uZSB3ZSBpbnNlcnQuXG4gICAgICBjb2xvclN0b3BzLnVuc2hpZnQoWzAsIGJhY2tncm91bmRdKTtcbiAgICAgIGNvbG9yU3RvcHNbMV1bMF0gKz0gU2hhZGluZ3MuU01BTExfTlVNQkVSO1xuICAgIH1cbiAgICBpZiAoIWV4dGVuZEVuZCkge1xuICAgICAgLy8gU2FtZSBpZGVhIGFzIGFib3ZlIGluIGV4dGVuZFN0YXJ0IGJ1dCBmb3IgdGhlIGVuZC5cbiAgICAgIGNvbG9yU3RvcHNbY29sb3JTdG9wcy5sZW5ndGggLSAxXVswXSAtPSBTaGFkaW5ncy5TTUFMTF9OVU1CRVI7XG4gICAgICBjb2xvclN0b3BzLnB1c2goWzEsIGJhY2tncm91bmRdKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbG9yU3RvcHMgPSBjb2xvclN0b3BzO1xuICB9XG5cbiAgUmFkaWFsQXhpYWwucHJvdG90eXBlID0ge1xuICAgIGdldElSOiBmdW5jdGlvbiBSYWRpYWxBeGlhbF9nZXRJUigpIHtcbiAgICAgIHZhciBjb29yZHNBcnIgPSB0aGlzLmNvb3Jkc0FycjtcbiAgICAgIHZhciBzaGFkaW5nVHlwZSA9IHRoaXMuc2hhZGluZ1R5cGU7XG4gICAgICB2YXIgdHlwZSwgcDAsIHAxLCByMCwgcjE7XG4gICAgICBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLkFYSUFMKSB7XG4gICAgICAgIHAwID0gW2Nvb3Jkc0FyclswXSwgY29vcmRzQXJyWzFdXTtcbiAgICAgICAgcDEgPSBbY29vcmRzQXJyWzJdLCBjb29yZHNBcnJbM11dO1xuICAgICAgICByMCA9IG51bGw7XG4gICAgICAgIHIxID0gbnVsbDtcbiAgICAgICAgdHlwZSA9IFwiYXhpYWxcIjtcbiAgICAgIH0gZWxzZSBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkge1xuICAgICAgICBwMCA9IFtjb29yZHNBcnJbMF0sIGNvb3Jkc0FyclsxXV07XG4gICAgICAgIHAxID0gW2Nvb3Jkc0FyclszXSwgY29vcmRzQXJyWzRdXTtcbiAgICAgICAgcjAgPSBjb29yZHNBcnJbMl07XG4gICAgICAgIHIxID0gY29vcmRzQXJyWzVdO1xuICAgICAgICB0eXBlID0gXCJyYWRpYWxcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVucmVhY2hhYmxlKGBnZXRQYXR0ZXJuIHR5cGUgdW5rbm93bjogJHtzaGFkaW5nVHlwZX1gKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xuICAgICAgaWYgKG1hdHJpeCkge1xuICAgICAgICBwMCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0ocDAsIG1hdHJpeCk7XG4gICAgICAgIHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShwMSwgbWF0cml4KTtcbiAgICAgICAgaWYgKHNoYWRpbmdUeXBlID09PSBTaGFkaW5nVHlwZS5SQURJQUwpIHtcbiAgICAgICAgICB2YXIgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG1hdHJpeCk7XG4gICAgICAgICAgcjAgKj0gc2NhbGVbMF07XG4gICAgICAgICAgcjEgKj0gc2NhbGVbMV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtcIlJhZGlhbEF4aWFsXCIsIHR5cGUsIHRoaXMuYmJveCwgdGhpcy5jb2xvclN0b3BzLCBwMCwgcDEsIHIwLCByMV07XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gUmFkaWFsQXhpYWw7XG59KSgpO1xuXG4vLyBBbGwgbWVzaCBzaGFkaW5nLiBGb3Igbm93LCB0aGV5IHdpbGwgYmUgcHJlc2VudGVkIGFzIHNldCBvZiB0aGUgdHJpYW5nbGVzXG4vLyB0byBiZSBkcmF3biBvbiB0aGUgY2FudmFzIGFuZCByZ2IgY29sb3IgZm9yIGVhY2ggdmVydGV4LlxuU2hhZGluZ3MuTWVzaCA9IChmdW5jdGlvbiBNZXNoQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcihzdHJlYW0sIGNvbnRleHQpIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuYnVmZmVyID0gMDtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7XG5cbiAgICB2YXIgbnVtQ29tcHMgPSBjb250ZXh0Lm51bUNvbXBzO1xuICAgIHRoaXMudG1wQ29tcHNCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUNvbXBzKTtcbiAgICB2YXIgY3NOdW1Db21wcyA9IGNvbnRleHQuY29sb3JTcGFjZS5udW1Db21wcztcbiAgICB0aGlzLnRtcENzQ29tcHNCdWYgPSBjb250ZXh0LmNvbG9yRm5cbiAgICAgID8gbmV3IEZsb2F0MzJBcnJheShjc051bUNvbXBzKVxuICAgICAgOiB0aGlzLnRtcENvbXBzQnVmO1xuICB9XG4gIE1lc2hTdHJlYW1SZWFkZXIucHJvdG90eXBlID0ge1xuICAgIGdldCBoYXNEYXRhKCkge1xuICAgICAgaWYgKHRoaXMuc3RyZWFtLmVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucG9zIDwgdGhpcy5zdHJlYW0uZW5kO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYnVmZmVyTGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgIGlmIChuZXh0Qnl0ZSA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5idWZmZXIgPSBuZXh0Qnl0ZTtcbiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gODtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgcmVhZEJpdHM6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZEJpdHMobikge1xuICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgaWYgKG4gPT09IDMyKSB7XG4gICAgICAgIGlmIChidWZmZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKCh0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgMjQpIHxcbiAgICAgICAgICAgICAgKHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAxNikgfFxuICAgICAgICAgICAgICAodGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDgpIHxcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKSA+Pj5cbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlciA9XG4gICAgICAgICAgKGJ1ZmZlciA8PCAyNCkgfFxuICAgICAgICAgICh0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgMTYpIHxcbiAgICAgICAgICAodGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDgpIHxcbiAgICAgICAgICB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXh0Qnl0ZSAmICgoMSA8PCBidWZmZXJMZW5ndGgpIC0gMSk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKChidWZmZXIgPDwgKDggLSBidWZmZXJMZW5ndGgpKSB8XG4gICAgICAgICAgICAoKG5leHRCeXRlICYgMHhmZikgPj4gYnVmZmVyTGVuZ3RoKSkgPj4+XG4gICAgICAgICAgMFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG4gPT09IDggJiYgYnVmZmVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoYnVmZmVyTGVuZ3RoIDwgbikge1xuICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDgpIHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICBidWZmZXJMZW5ndGggKz0gODtcbiAgICAgIH1cbiAgICAgIGJ1ZmZlckxlbmd0aCAtPSBuO1xuICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7XG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciAmICgoMSA8PCBidWZmZXJMZW5ndGgpIC0gMSk7XG4gICAgICByZXR1cm4gYnVmZmVyID4+IGJ1ZmZlckxlbmd0aDtcbiAgICB9LFxuICAgIGFsaWduOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX2FsaWduKCkge1xuICAgICAgdGhpcy5idWZmZXIgPSAwO1xuICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSAwO1xuICAgIH0sXG4gICAgcmVhZEZsYWc6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZEZsYWcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQml0cyh0aGlzLmNvbnRleHQuYml0c1BlckZsYWcpO1xuICAgIH0sXG4gICAgcmVhZENvb3JkaW5hdGU6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZENvb3JkaW5hdGUoKSB7XG4gICAgICB2YXIgYml0c1BlckNvb3JkaW5hdGUgPSB0aGlzLmNvbnRleHQuYml0c1BlckNvb3JkaW5hdGU7XG4gICAgICB2YXIgeGkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTtcbiAgICAgIHZhciB5aSA9IHRoaXMucmVhZEJpdHMoYml0c1BlckNvb3JkaW5hdGUpO1xuICAgICAgdmFyIGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7XG4gICAgICB2YXIgc2NhbGUgPVxuICAgICAgICBiaXRzUGVyQ29vcmRpbmF0ZSA8IDMyXG4gICAgICAgICAgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb29yZGluYXRlKSAtIDEpXG4gICAgICAgICAgOiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyIF4gLTMyXG4gICAgICByZXR1cm4gW1xuICAgICAgICB4aSAqIHNjYWxlICogKGRlY29kZVsxXSAtIGRlY29kZVswXSkgKyBkZWNvZGVbMF0sXG4gICAgICAgIHlpICogc2NhbGUgKiAoZGVjb2RlWzNdIC0gZGVjb2RlWzJdKSArIGRlY29kZVsyXSxcbiAgICAgIF07XG4gICAgfSxcbiAgICByZWFkQ29tcG9uZW50czogZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9yZWFkQ29tcG9uZW50cygpIHtcbiAgICAgIHZhciBudW1Db21wcyA9IHRoaXMuY29udGV4dC5udW1Db21wcztcbiAgICAgIHZhciBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5jb250ZXh0LmJpdHNQZXJDb21wb25lbnQ7XG4gICAgICB2YXIgc2NhbGUgPVxuICAgICAgICBiaXRzUGVyQ29tcG9uZW50IDwgMzJcbiAgICAgICAgICA/IDEgLyAoKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxKVxuICAgICAgICAgIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMiBeIC0zMlxuICAgICAgdmFyIGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7XG4gICAgICB2YXIgY29tcG9uZW50cyA9IHRoaXMudG1wQ29tcHNCdWY7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDQ7IGkgPCBudW1Db21wczsgaSsrLCBqICs9IDIpIHtcbiAgICAgICAgdmFyIGNpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29tcG9uZW50KTtcbiAgICAgICAgY29tcG9uZW50c1tpXSA9IGNpICogc2NhbGUgKiAoZGVjb2RlW2ogKyAxXSAtIGRlY29kZVtqXSkgKyBkZWNvZGVbal07XG4gICAgICB9XG4gICAgICB2YXIgY29sb3IgPSB0aGlzLnRtcENzQ29tcHNCdWY7XG4gICAgICBpZiAodGhpcy5jb250ZXh0LmNvbG9yRm4pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNvbG9yRm4oY29tcG9uZW50cywgMCwgY29sb3IsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb2xvclNwYWNlLmdldFJnYihjb2xvciwgMCk7XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBkZWNvZGVUeXBlNFNoYWRpbmcobWVzaCwgcmVhZGVyKSB7XG4gICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzO1xuICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9ycztcbiAgICB2YXIgb3BlcmF0b3JzID0gW107XG4gICAgdmFyIHBzID0gW107IC8vIG5vdCBtYWludGFpbmluZyBjcyBzaW5jZSB0aGF0IHdpbGwgbWF0Y2ggcHNcbiAgICB2YXIgdmVydGljZXNMZWZ0ID0gMDsgLy8gYXNzdW1pbmcgd2UgaGF2ZSBhbGwgZGF0YSB0byBzdGFydCBhIG5ldyB0cmlhbmdsZVxuICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkge1xuICAgICAgdmFyIGYgPSByZWFkZXIucmVhZEZsYWcoKTtcbiAgICAgIHZhciBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpO1xuICAgICAgdmFyIGNvbG9yID0gcmVhZGVyLnJlYWRDb21wb25lbnRzKCk7XG4gICAgICBpZiAodmVydGljZXNMZWZ0ID09PSAwKSB7XG4gICAgICAgIC8vIGlnbm9yaW5nIGZsYWdzIGlmIHdlIHN0YXJ0ZWQgYSB0cmlhbmdsZVxuICAgICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gdHlwZTQgZmxhZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGYpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcHMucHVzaChwc1twcy5sZW5ndGggLSAyXSwgcHNbcHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgdmVydGljZXNMZWZ0ID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHBzLnB1c2gocHNbcHMubGVuZ3RoIC0gM10sIHBzW3BzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBvcGVyYXRvcnMucHVzaChmKTtcbiAgICAgIH1cbiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7XG4gICAgICBjb29yZHMucHVzaChjb29yZCk7XG4gICAgICBjb2xvcnMucHVzaChjb2xvcik7XG4gICAgICB2ZXJ0aWNlc0xlZnQtLTtcblxuICAgICAgcmVhZGVyLmFsaWduKCk7XG4gICAgfVxuICAgIG1lc2guZmlndXJlcy5wdXNoKHtcbiAgICAgIHR5cGU6IFwidHJpYW5nbGVzXCIsXG4gICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSxcbiAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkocHMpLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlVHlwZTVTaGFkaW5nKG1lc2gsIHJlYWRlciwgdmVydGljZXNQZXJSb3cpIHtcbiAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHM7XG4gICAgdmFyIGNvbG9ycyA9IG1lc2guY29sb3JzO1xuICAgIHZhciBwcyA9IFtdOyAvLyBub3QgbWFpbnRhaW5pbmcgY3Mgc2luY2UgdGhhdCB3aWxsIG1hdGNoIHBzXG4gICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7XG4gICAgICB2YXIgY29vcmQgPSByZWFkZXIucmVhZENvb3JkaW5hdGUoKTtcbiAgICAgIHZhciBjb2xvciA9IHJlYWRlci5yZWFkQ29tcG9uZW50cygpO1xuICAgICAgcHMucHVzaChjb29yZHMubGVuZ3RoKTtcbiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICAgIGNvbG9ycy5wdXNoKGNvbG9yKTtcbiAgICB9XG4gICAgbWVzaC5maWd1cmVzLnB1c2goe1xuICAgICAgdHlwZTogXCJsYXR0aWNlXCIsXG4gICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSxcbiAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkocHMpLFxuICAgICAgdmVydGljZXNQZXJSb3csXG4gICAgfSk7XG4gIH1cblxuICB2YXIgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQgPSAzO1xuICB2YXIgTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQgPSAyMDtcblxuICB2YXIgVFJJQU5HTEVfREVOU0lUWSA9IDIwOyAvLyBjb3VudCBvZiB0cmlhbmdsZXMgcGVyIGVudGlyZSBtZXNoIGJvdW5kc1xuXG4gIHZhciBnZXRCID0gKGZ1bmN0aW9uIGdldEJDbG9zdXJlKCkge1xuICAgIGZ1bmN0aW9uIGJ1aWxkQihjb3VudCkge1xuICAgICAgdmFyIGx1dCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgICB2YXIgdCA9IGkgLyBjb3VudCxcbiAgICAgICAgICB0XyA9IDEgLSB0O1xuICAgICAgICBsdXQucHVzaChcbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICAgICAgIHRfICogdF8gKiB0XyxcbiAgICAgICAgICAgIDMgKiB0ICogdF8gKiB0XyxcbiAgICAgICAgICAgIDMgKiB0ICogdCAqIHRfLFxuICAgICAgICAgICAgdCAqIHQgKiB0LFxuICAgICAgICAgIF0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbHV0O1xuICAgIH1cbiAgICB2YXIgY2FjaGUgPSBbXTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICByZXR1cm4gZnVuY3Rpb24gZ2V0Qihjb3VudCkge1xuICAgICAgaWYgKCFjYWNoZVtjb3VudF0pIHtcbiAgICAgICAgY2FjaGVbY291bnRdID0gYnVpbGRCKGNvdW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWNoZVtjb3VudF07XG4gICAgfTtcbiAgfSkoKTtcblxuICBmdW5jdGlvbiBidWlsZEZpZ3VyZUZyb21QYXRjaChtZXNoLCBpbmRleCkge1xuICAgIHZhciBmaWd1cmUgPSBtZXNoLmZpZ3VyZXNbaW5kZXhdO1xuICAgIGFzc2VydChmaWd1cmUudHlwZSA9PT0gXCJwYXRjaFwiLCBcIlVuZXhwZWN0ZWQgcGF0Y2ggbWVzaCBmaWd1cmVcIik7XG5cbiAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHMsXG4gICAgICBjb2xvcnMgPSBtZXNoLmNvbG9ycztcbiAgICB2YXIgcGkgPSBmaWd1cmUuY29vcmRzO1xuICAgIHZhciBjaSA9IGZpZ3VyZS5jb2xvcnM7XG5cbiAgICB2YXIgZmlndXJlTWluWCA9IE1hdGgubWluKFxuICAgICAgY29vcmRzW3BpWzBdXVswXSxcbiAgICAgIGNvb3Jkc1twaVszXV1bMF0sXG4gICAgICBjb29yZHNbcGlbMTJdXVswXSxcbiAgICAgIGNvb3Jkc1twaVsxNV1dWzBdXG4gICAgKTtcbiAgICB2YXIgZmlndXJlTWluWSA9IE1hdGgubWluKFxuICAgICAgY29vcmRzW3BpWzBdXVsxXSxcbiAgICAgIGNvb3Jkc1twaVszXV1bMV0sXG4gICAgICBjb29yZHNbcGlbMTJdXVsxXSxcbiAgICAgIGNvb3Jkc1twaVsxNV1dWzFdXG4gICAgKTtcbiAgICB2YXIgZmlndXJlTWF4WCA9IE1hdGgubWF4KFxuICAgICAgY29vcmRzW3BpWzBdXVswXSxcbiAgICAgIGNvb3Jkc1twaVszXV1bMF0sXG4gICAgICBjb29yZHNbcGlbMTJdXVswXSxcbiAgICAgIGNvb3Jkc1twaVsxNV1dWzBdXG4gICAgKTtcbiAgICB2YXIgZmlndXJlTWF4WSA9IE1hdGgubWF4KFxuICAgICAgY29vcmRzW3BpWzBdXVsxXSxcbiAgICAgIGNvb3Jkc1twaVszXV1bMV0sXG4gICAgICBjb29yZHNbcGlbMTJdXVsxXSxcbiAgICAgIGNvb3Jkc1twaVsxNV1dWzFdXG4gICAgKTtcbiAgICB2YXIgc3BsaXRYQnkgPSBNYXRoLmNlaWwoXG4gICAgICAoKGZpZ3VyZU1heFggLSBmaWd1cmVNaW5YKSAqIFRSSUFOR0xFX0RFTlNJVFkpIC9cbiAgICAgICAgKG1lc2guYm91bmRzWzJdIC0gbWVzaC5ib3VuZHNbMF0pXG4gICAgKTtcbiAgICBzcGxpdFhCeSA9IE1hdGgubWF4KFxuICAgICAgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsXG4gICAgICBNYXRoLm1pbihNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgc3BsaXRYQnkpXG4gICAgKTtcbiAgICB2YXIgc3BsaXRZQnkgPSBNYXRoLmNlaWwoXG4gICAgICAoKGZpZ3VyZU1heFkgLSBmaWd1cmVNaW5ZKSAqIFRSSUFOR0xFX0RFTlNJVFkpIC9cbiAgICAgICAgKG1lc2guYm91bmRzWzNdIC0gbWVzaC5ib3VuZHNbMV0pXG4gICAgKTtcbiAgICBzcGxpdFlCeSA9IE1hdGgubWF4KFxuICAgICAgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsXG4gICAgICBNYXRoLm1pbihNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgc3BsaXRZQnkpXG4gICAgKTtcblxuICAgIHZhciB2ZXJ0aWNlc1BlclJvdyA9IHNwbGl0WEJ5ICsgMTtcbiAgICB2YXIgZmlndXJlQ29vcmRzID0gbmV3IEludDMyQXJyYXkoKHNwbGl0WUJ5ICsgMSkgKiB2ZXJ0aWNlc1BlclJvdyk7XG4gICAgdmFyIGZpZ3VyZUNvbG9ycyA9IG5ldyBJbnQzMkFycmF5KChzcGxpdFlCeSArIDEpICogdmVydGljZXNQZXJSb3cpO1xuICAgIHZhciBrID0gMDtcbiAgICB2YXIgY2wgPSBuZXcgVWludDhBcnJheSgzKSxcbiAgICAgIGNyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgdmFyIGMwID0gY29sb3JzW2NpWzBdXSxcbiAgICAgIGMxID0gY29sb3JzW2NpWzFdXSxcbiAgICAgIGMyID0gY29sb3JzW2NpWzJdXSxcbiAgICAgIGMzID0gY29sb3JzW2NpWzNdXTtcbiAgICB2YXIgYlJvdyA9IGdldEIoc3BsaXRZQnkpLFxuICAgICAgYkNvbCA9IGdldEIoc3BsaXRYQnkpO1xuICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8PSBzcGxpdFlCeTsgcm93KyspIHtcbiAgICAgIGNsWzBdID0gKChjMFswXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlswXSAqIHJvdykgLyBzcGxpdFlCeSkgfCAwO1xuICAgICAgY2xbMV0gPSAoKGMwWzFdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzFdICogcm93KSAvIHNwbGl0WUJ5KSB8IDA7XG4gICAgICBjbFsyXSA9ICgoYzBbMl0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMl0gKiByb3cpIC8gc3BsaXRZQnkpIHwgMDtcblxuICAgICAgY3JbMF0gPSAoKGMxWzBdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzBdICogcm93KSAvIHNwbGl0WUJ5KSB8IDA7XG4gICAgICBjclsxXSA9ICgoYzFbMV0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMV0gKiByb3cpIC8gc3BsaXRZQnkpIHwgMDtcbiAgICAgIGNyWzJdID0gKChjMVsyXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1syXSAqIHJvdykgLyBzcGxpdFlCeSkgfCAwO1xuXG4gICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPD0gc3BsaXRYQnk7IGNvbCsrLCBrKyspIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChyb3cgPT09IDAgfHwgcm93ID09PSBzcGxpdFlCeSkgJiZcbiAgICAgICAgICAoY29sID09PSAwIHx8IGNvbCA9PT0gc3BsaXRYQnkpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4ID0gMCxcbiAgICAgICAgICB5ID0gMDtcbiAgICAgICAgdmFyIHEgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSAzOyBpKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAzOyBqKyssIHErKykge1xuICAgICAgICAgICAgdmFyIG0gPSBiUm93W3Jvd11baV0gKiBiQ29sW2NvbF1bal07XG4gICAgICAgICAgICB4ICs9IGNvb3Jkc1twaVtxXV1bMF0gKiBtO1xuICAgICAgICAgICAgeSArPSBjb29yZHNbcGlbcV1dWzFdICogbTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlndXJlQ29vcmRzW2tdID0gY29vcmRzLmxlbmd0aDtcbiAgICAgICAgY29vcmRzLnB1c2goW3gsIHldKTtcbiAgICAgICAgZmlndXJlQ29sb3JzW2tdID0gY29sb3JzLmxlbmd0aDtcbiAgICAgICAgdmFyIG5ld0NvbG9yID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgICAgIG5ld0NvbG9yWzBdID0gKChjbFswXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclswXSAqIGNvbCkgLyBzcGxpdFhCeSkgfCAwO1xuICAgICAgICBuZXdDb2xvclsxXSA9ICgoY2xbMV0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMV0gKiBjb2wpIC8gc3BsaXRYQnkpIHwgMDtcbiAgICAgICAgbmV3Q29sb3JbMl0gPSAoKGNsWzJdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzJdICogY29sKSAvIHNwbGl0WEJ5KSB8IDA7XG4gICAgICAgIGNvbG9ycy5wdXNoKG5ld0NvbG9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmlndXJlQ29vcmRzWzBdID0gcGlbMF07XG4gICAgZmlndXJlQ29sb3JzWzBdID0gY2lbMF07XG4gICAgZmlndXJlQ29vcmRzW3NwbGl0WEJ5XSA9IHBpWzNdO1xuICAgIGZpZ3VyZUNvbG9yc1tzcGxpdFhCeV0gPSBjaVsxXTtcbiAgICBmaWd1cmVDb29yZHNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeV0gPSBwaVsxMl07XG4gICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gY2lbMl07XG4gICAgZmlndXJlQ29vcmRzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnkgKyBzcGxpdFhCeV0gPSBwaVsxNV07XG4gICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnkgKyBzcGxpdFhCeV0gPSBjaVszXTtcblxuICAgIG1lc2guZmlndXJlc1tpbmRleF0gPSB7XG4gICAgICB0eXBlOiBcImxhdHRpY2VcIixcbiAgICAgIGNvb3JkczogZmlndXJlQ29vcmRzLFxuICAgICAgY29sb3JzOiBmaWd1cmVDb2xvcnMsXG4gICAgICB2ZXJ0aWNlc1BlclJvdyxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlVHlwZTZTaGFkaW5nKG1lc2gsIHJlYWRlcikge1xuICAgIC8vIEEgc3BlY2lhbCBjYXNlIG9mIFR5cGUgNy4gVGhlIHAxMSwgcDEyLCBwMjEsIHAyMiBhdXRvbWF0aWNhbGx5IGZpbGxlZFxuICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkcztcbiAgICB2YXIgY29sb3JzID0gbWVzaC5jb2xvcnM7XG4gICAgdmFyIHBzID0gbmV3IEludDMyQXJyYXkoMTYpOyAvLyBwMDAsIHAxMCwgLi4uLCBwMzAsIHAwMSwgLi4uLCBwMzNcbiAgICB2YXIgY3MgPSBuZXcgSW50MzJBcnJheSg0KTsgLy8gYzAwLCBjMzAsIGMwMywgYzMzXG4gICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7XG4gICAgICB2YXIgZiA9IHJlYWRlci5yZWFkRmxhZygpO1xuICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiVW5rbm93biB0eXBlNiBmbGFnXCIpO1xuICAgICAgfVxuICAgICAgdmFyIGksIGlpO1xuICAgICAgdmFyIHBpID0gY29vcmRzLmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDggOiAxMjsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29vcmRzLnB1c2gocmVhZGVyLnJlYWRDb29yZGluYXRlKCkpO1xuICAgICAgfVxuICAgICAgdmFyIGNpID0gY29sb3JzLmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb2xvcnMucHVzaChyZWFkZXIucmVhZENvbXBvbmVudHMoKSk7XG4gICAgICB9XG4gICAgICB2YXIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDtcbiAgICAgIHN3aXRjaCAoZikge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHBzWzEyXSA9IHBpICsgMzsgcHNbMTNdID0gcGkgKyA0OyAgcHNbMTRdID0gcGkgKyA1OyAgcHNbMTVdID0gcGkgKyA2O1xuICAgICAgICAgIHBzWyA4XSA9IHBpICsgMjsgLyogdmFsdWVzIGZvciA1LCA2LCA5LCAxMCBhcmUgICAgKi8gcHNbMTFdID0gcGkgKyA3O1xuICAgICAgICAgIHBzWyA0XSA9IHBpICsgMTsgLyogY2FsY3VsYXRlZCBiZWxvdyAgICAgICAgICAgICAgKi8gcHNbIDddID0gcGkgKyA4O1xuICAgICAgICAgIHBzWyAwXSA9IHBpOyAgICAgcHNbIDFdID0gcGkgKyAxMTsgcHNbIDJdID0gcGkgKyAxMDsgcHNbIDNdID0gcGkgKyA5O1xuICAgICAgICAgIGNzWzJdID0gY2kgKyAxOyBjc1szXSA9IGNpICsgMjtcbiAgICAgICAgICBjc1swXSA9IGNpOyAgICAgY3NbMV0gPSBjaSArIDM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdG1wMSA9IHBzWzEyXTsgdG1wMiA9IHBzWzEzXTsgdG1wMyA9IHBzWzE0XTsgdG1wNCA9IHBzWzE1XTtcbiAgICAgICAgICBwc1sxMl0gPSB0bXA0OyBwc1sxM10gPSBwaSArIDA7ICBwc1sxNF0gPSBwaSArIDE7ICBwc1sxNV0gPSBwaSArIDI7XG4gICAgICAgICAgcHNbIDhdID0gdG1wMzsgLyogdmFsdWVzIGZvciA1LCA2LCA5LCAxMCBhcmUgICAgKi8gcHNbMTFdID0gcGkgKyAzO1xuICAgICAgICAgIHBzWyA0XSA9IHRtcDI7IC8qIGNhbGN1bGF0ZWQgYmVsb3cgICAgICAgICAgICAgICovIHBzWyA3XSA9IHBpICsgNDtcbiAgICAgICAgICBwc1sgMF0gPSB0bXAxOyBwc1sgMV0gPSBwaSArIDc7ICAgcHNbIDJdID0gcGkgKyA2OyBwc1sgM10gPSBwaSArIDU7XG4gICAgICAgICAgdG1wMSA9IGNzWzJdOyB0bXAyID0gY3NbM107XG4gICAgICAgICAgY3NbMl0gPSB0bXAyOyAgIGNzWzNdID0gY2k7XG4gICAgICAgICAgY3NbMF0gPSB0bXAxOyAgIGNzWzFdID0gY2kgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRtcDEgPSBwc1sxNV07XG4gICAgICAgICAgdG1wMiA9IHBzWzExXTtcbiAgICAgICAgICBwc1sxMl0gPSBwc1szXTsgIHBzWzEzXSA9IHBpICsgMDsgcHNbMTRdID0gcGkgKyAxOyAgIHBzWzE1XSA9IHBpICsgMjtcbiAgICAgICAgICBwc1sgOF0gPSBwc1s3XTsgIC8qIHZhbHVlcyBmb3IgNSwgNiwgOSwgMTAgYXJlICAgICovIHBzWzExXSA9IHBpICsgMztcbiAgICAgICAgICBwc1sgNF0gPSB0bXAyOyAgIC8qIGNhbGN1bGF0ZWQgYmVsb3cgICAgICAgICAgICAgICovIHBzWyA3XSA9IHBpICsgNDtcbiAgICAgICAgICBwc1sgMF0gPSB0bXAxOyAgcHNbIDFdID0gcGkgKyA3OyAgIHBzWyAyXSA9IHBpICsgNjsgIHBzWyAzXSA9IHBpICsgNTtcbiAgICAgICAgICB0bXAxID0gY3NbM107XG4gICAgICAgICAgY3NbMl0gPSBjc1sxXTsgY3NbM10gPSBjaTtcbiAgICAgICAgICBjc1swXSA9IHRtcDE7ICBjc1sxXSA9IGNpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBwc1sxMl0gPSBwc1swXTsgIHBzWzEzXSA9IHBpICsgMDsgICBwc1sxNF0gPSBwaSArIDE7IHBzWzE1XSA9IHBpICsgMjtcbiAgICAgICAgICBwc1sgOF0gPSBwc1sxXTsgIC8qIHZhbHVlcyBmb3IgNSwgNiwgOSwgMTAgYXJlICAgICovIHBzWzExXSA9IHBpICsgMztcbiAgICAgICAgICBwc1sgNF0gPSBwc1syXTsgIC8qIGNhbGN1bGF0ZWQgYmVsb3cgICAgICAgICAgICAgICovIHBzWyA3XSA9IHBpICsgNDtcbiAgICAgICAgICBwc1sgMF0gPSBwc1szXTsgIHBzWyAxXSA9IHBpICsgNzsgICBwc1sgMl0gPSBwaSArIDY7IHBzWyAzXSA9IHBpICsgNTtcbiAgICAgICAgICBjc1syXSA9IGNzWzBdOyBjc1szXSA9IGNpO1xuICAgICAgICAgIGNzWzBdID0gY3NbMV07IGNzWzFdID0gY2kgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gc2V0IHAxMSwgcDEyLCBwMjEsIHAyMlxuICAgICAgcHNbNV0gPSBjb29yZHMubGVuZ3RoO1xuICAgICAgY29vcmRzLnB1c2goW1xuICAgICAgICAoLTQgKiBjb29yZHNbcHNbMF1dWzBdIC1cbiAgICAgICAgICBjb29yZHNbcHNbMTVdXVswXSArXG4gICAgICAgICAgNiAqIChjb29yZHNbcHNbNF1dWzBdICsgY29vcmRzW3BzWzFdXVswXSkgLVxuICAgICAgICAgIDIgKiAoY29vcmRzW3BzWzEyXV1bMF0gKyBjb29yZHNbcHNbM11dWzBdKSArXG4gICAgICAgICAgMyAqIChjb29yZHNbcHNbMTNdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pKSAvXG4gICAgICAgICAgOSxcbiAgICAgICAgKC00ICogY29vcmRzW3BzWzBdXVsxXSAtXG4gICAgICAgICAgY29vcmRzW3BzWzE1XV1bMV0gK1xuICAgICAgICAgIDYgKiAoY29vcmRzW3BzWzRdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pIC1cbiAgICAgICAgICAyICogKGNvb3Jkc1twc1sxMl1dWzFdICsgY29vcmRzW3BzWzNdXVsxXSkgK1xuICAgICAgICAgIDMgKiAoY29vcmRzW3BzWzEzXV1bMV0gKyBjb29yZHNbcHNbN11dWzFdKSkgL1xuICAgICAgICAgIDksXG4gICAgICBdKTtcbiAgICAgIHBzWzZdID0gY29vcmRzLmxlbmd0aDtcbiAgICAgIGNvb3Jkcy5wdXNoKFtcbiAgICAgICAgKC00ICogY29vcmRzW3BzWzNdXVswXSAtXG4gICAgICAgICAgY29vcmRzW3BzWzEyXV1bMF0gK1xuICAgICAgICAgIDYgKiAoY29vcmRzW3BzWzJdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pIC1cbiAgICAgICAgICAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgK1xuICAgICAgICAgIDMgKiAoY29vcmRzW3BzWzRdXVswXSArIGNvb3Jkc1twc1sxNF1dWzBdKSkgL1xuICAgICAgICAgIDksXG4gICAgICAgICgtNCAqIGNvb3Jkc1twc1szXV1bMV0gLVxuICAgICAgICAgIGNvb3Jkc1twc1sxMl1dWzFdICtcbiAgICAgICAgICA2ICogKGNvb3Jkc1twc1syXV1bMV0gKyBjb29yZHNbcHNbN11dWzFdKSAtXG4gICAgICAgICAgMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICtcbiAgICAgICAgICAzICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkpIC9cbiAgICAgICAgICA5LFxuICAgICAgXSk7XG4gICAgICBwc1s5XSA9IGNvb3Jkcy5sZW5ndGg7XG4gICAgICBjb29yZHMucHVzaChbXG4gICAgICAgICgtNCAqIGNvb3Jkc1twc1sxMl1dWzBdIC1cbiAgICAgICAgICBjb29yZHNbcHNbM11dWzBdICtcbiAgICAgICAgICA2ICogKGNvb3Jkc1twc1s4XV1bMF0gKyBjb29yZHNbcHNbMTNdXVswXSkgLVxuICAgICAgICAgIDIgKiAoY29vcmRzW3BzWzBdXVswXSArIGNvb3Jkc1twc1sxNV1dWzBdKSArXG4gICAgICAgICAgMyAqIChjb29yZHNbcHNbMTFdXVswXSArIGNvb3Jkc1twc1sxXV1bMF0pKSAvXG4gICAgICAgICAgOSxcbiAgICAgICAgKC00ICogY29vcmRzW3BzWzEyXV1bMV0gLVxuICAgICAgICAgIGNvb3Jkc1twc1szXV1bMV0gK1xuICAgICAgICAgIDYgKiAoY29vcmRzW3BzWzhdXVsxXSArIGNvb3Jkc1twc1sxM11dWzFdKSAtXG4gICAgICAgICAgMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICtcbiAgICAgICAgICAzICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzFdXVsxXSkpIC9cbiAgICAgICAgICA5LFxuICAgICAgXSk7XG4gICAgICBwc1sxMF0gPSBjb29yZHMubGVuZ3RoO1xuICAgICAgY29vcmRzLnB1c2goW1xuICAgICAgICAoLTQgKiBjb29yZHNbcHNbMTVdXVswXSAtXG4gICAgICAgICAgY29vcmRzW3BzWzBdXVswXSArXG4gICAgICAgICAgNiAqIChjb29yZHNbcHNbMTFdXVswXSArIGNvb3Jkc1twc1sxNF1dWzBdKSAtXG4gICAgICAgICAgMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICtcbiAgICAgICAgICAzICogKGNvb3Jkc1twc1syXV1bMF0gKyBjb29yZHNbcHNbOF1dWzBdKSkgL1xuICAgICAgICAgIDksXG4gICAgICAgICgtNCAqIGNvb3Jkc1twc1sxNV1dWzFdIC1cbiAgICAgICAgICBjb29yZHNbcHNbMF1dWzFdICtcbiAgICAgICAgICA2ICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzE0XV1bMV0pIC1cbiAgICAgICAgICAyICogKGNvb3Jkc1twc1sxMl1dWzFdICsgY29vcmRzW3BzWzNdXVsxXSkgK1xuICAgICAgICAgIDMgKiAoY29vcmRzW3BzWzJdXVsxXSArIGNvb3Jkc1twc1s4XV1bMV0pKSAvXG4gICAgICAgICAgOSxcbiAgICAgIF0pO1xuICAgICAgbWVzaC5maWd1cmVzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInBhdGNoXCIsXG4gICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLCAvLyBtYWtpbmcgY29waWVzIG9mIHBzIGFuZCBjc1xuICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZVR5cGU3U2hhZGluZyhtZXNoLCByZWFkZXIpIHtcbiAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHM7XG4gICAgdmFyIGNvbG9ycyA9IG1lc2guY29sb3JzO1xuICAgIHZhciBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsgLy8gcDAwLCBwMTAsIC4uLiwgcDMwLCBwMDEsIC4uLiwgcDMzXG4gICAgdmFyIGNzID0gbmV3IEludDMyQXJyYXkoNCk7IC8vIGMwMCwgYzMwLCBjMDMsIGMzM1xuICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkge1xuICAgICAgdmFyIGYgPSByZWFkZXIucmVhZEZsYWcoKTtcbiAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gdHlwZTcgZmxhZ1wiKTtcbiAgICAgIH1cbiAgICAgIHZhciBpLCBpaTtcbiAgICAgIHZhciBwaSA9IGNvb3Jkcy5sZW5ndGg7XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IGYgIT09IDAgPyAxMiA6IDE2OyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgY2kgPSBjb2xvcnMubGVuZ3RoO1xuICAgICAgZm9yIChpID0gMCwgaWkgPSBmICE9PSAwID8gMiA6IDQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTtcbiAgICAgIH1cbiAgICAgIHZhciB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0O1xuICAgICAgc3dpdGNoIChmKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcHNbMTJdID0gcGkgKyAzOyBwc1sxM10gPSBwaSArIDQ7ICBwc1sxNF0gPSBwaSArIDU7ICBwc1sxNV0gPSBwaSArIDY7XG4gICAgICAgICAgcHNbIDhdID0gcGkgKyAyOyBwc1sgOV0gPSBwaSArIDEzOyBwc1sxMF0gPSBwaSArIDE0OyBwc1sxMV0gPSBwaSArIDc7XG4gICAgICAgICAgcHNbIDRdID0gcGkgKyAxOyBwc1sgNV0gPSBwaSArIDEyOyBwc1sgNl0gPSBwaSArIDE1OyBwc1sgN10gPSBwaSArIDg7XG4gICAgICAgICAgcHNbIDBdID0gcGk7ICAgICBwc1sgMV0gPSBwaSArIDExOyBwc1sgMl0gPSBwaSArIDEwOyBwc1sgM10gPSBwaSArIDk7XG4gICAgICAgICAgY3NbMl0gPSBjaSArIDE7IGNzWzNdID0gY2kgKyAyO1xuICAgICAgICAgIGNzWzBdID0gY2k7ICAgICBjc1sxXSA9IGNpICsgMztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0bXAxID0gcHNbMTJdOyB0bXAyID0gcHNbMTNdOyB0bXAzID0gcHNbMTRdOyB0bXA0ID0gcHNbMTVdO1xuICAgICAgICAgIHBzWzEyXSA9IHRtcDQ7ICAgcHNbMTNdID0gcGkgKyAwOyAgcHNbMTRdID0gcGkgKyAxOyAgcHNbMTVdID0gcGkgKyAyO1xuICAgICAgICAgIHBzWyA4XSA9IHRtcDM7ICAgcHNbIDldID0gcGkgKyA5OyAgcHNbMTBdID0gcGkgKyAxMDsgcHNbMTFdID0gcGkgKyAzO1xuICAgICAgICAgIHBzWyA0XSA9IHRtcDI7ICAgcHNbIDVdID0gcGkgKyA4OyAgcHNbIDZdID0gcGkgKyAxMTsgcHNbIDddID0gcGkgKyA0O1xuICAgICAgICAgIHBzWyAwXSA9IHRtcDE7ICAgcHNbIDFdID0gcGkgKyA3OyAgcHNbIDJdID0gcGkgKyA2OyAgcHNbIDNdID0gcGkgKyA1O1xuICAgICAgICAgIHRtcDEgPSBjc1syXTsgdG1wMiA9IGNzWzNdO1xuICAgICAgICAgIGNzWzJdID0gdG1wMjsgICBjc1szXSA9IGNpO1xuICAgICAgICAgIGNzWzBdID0gdG1wMTsgICBjc1sxXSA9IGNpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0bXAxID0gcHNbMTVdO1xuICAgICAgICAgIHRtcDIgPSBwc1sxMV07XG4gICAgICAgICAgcHNbMTJdID0gcHNbM107IHBzWzEzXSA9IHBpICsgMDsgcHNbMTRdID0gcGkgKyAxOyAgcHNbMTVdID0gcGkgKyAyO1xuICAgICAgICAgIHBzWyA4XSA9IHBzWzddOyBwc1sgOV0gPSBwaSArIDk7IHBzWzEwXSA9IHBpICsgMTA7IHBzWzExXSA9IHBpICsgMztcbiAgICAgICAgICBwc1sgNF0gPSB0bXAyOyAgcHNbIDVdID0gcGkgKyA4OyBwc1sgNl0gPSBwaSArIDExOyBwc1sgN10gPSBwaSArIDQ7XG4gICAgICAgICAgcHNbIDBdID0gdG1wMTsgIHBzWyAxXSA9IHBpICsgNzsgcHNbIDJdID0gcGkgKyA2OyAgcHNbIDNdID0gcGkgKyA1O1xuICAgICAgICAgIHRtcDEgPSBjc1szXTtcbiAgICAgICAgICBjc1syXSA9IGNzWzFdOyBjc1szXSA9IGNpO1xuICAgICAgICAgIGNzWzBdID0gdG1wMTsgIGNzWzFdID0gY2kgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHBzWzEyXSA9IHBzWzBdOyAgcHNbMTNdID0gcGkgKyAwOyAgcHNbMTRdID0gcGkgKyAxOyAgcHNbMTVdID0gcGkgKyAyO1xuICAgICAgICAgIHBzWyA4XSA9IHBzWzFdOyAgcHNbIDldID0gcGkgKyA5OyAgcHNbMTBdID0gcGkgKyAxMDsgcHNbMTFdID0gcGkgKyAzO1xuICAgICAgICAgIHBzWyA0XSA9IHBzWzJdOyAgcHNbIDVdID0gcGkgKyA4OyAgcHNbIDZdID0gcGkgKyAxMTsgcHNbIDddID0gcGkgKyA0O1xuICAgICAgICAgIHBzWyAwXSA9IHBzWzNdOyAgcHNbIDFdID0gcGkgKyA3OyAgcHNbIDJdID0gcGkgKyA2OyAgcHNbIDNdID0gcGkgKyA1O1xuICAgICAgICAgIGNzWzJdID0gY3NbMF07IGNzWzNdID0gY2k7XG4gICAgICAgICAgY3NbMF0gPSBjc1sxXTsgY3NbMV0gPSBjaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBtZXNoLmZpZ3VyZXMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgY29vcmRzOiBuZXcgSW50MzJBcnJheShwcyksIC8vIG1ha2luZyBjb3BpZXMgb2YgcHMgYW5kIGNzXG4gICAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkoY3MpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQm91bmRzKG1lc2gpIHtcbiAgICB2YXIgbWluWCA9IG1lc2guY29vcmRzWzBdWzBdLFxuICAgICAgbWluWSA9IG1lc2guY29vcmRzWzBdWzFdLFxuICAgICAgbWF4WCA9IG1pblgsXG4gICAgICBtYXhZID0gbWluWTtcbiAgICBmb3IgKHZhciBpID0gMSwgaWkgPSBtZXNoLmNvb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgeCA9IG1lc2guY29vcmRzW2ldWzBdLFxuICAgICAgICB5ID0gbWVzaC5jb29yZHNbaV1bMV07XG4gICAgICBtaW5YID0gbWluWCA+IHggPyB4IDogbWluWDtcbiAgICAgIG1pblkgPSBtaW5ZID4geSA/IHkgOiBtaW5ZO1xuICAgICAgbWF4WCA9IG1heFggPCB4ID8geCA6IG1heFg7XG4gICAgICBtYXhZID0gbWF4WSA8IHkgPyB5IDogbWF4WTtcbiAgICB9XG4gICAgbWVzaC5ib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gIH1cblxuICBmdW5jdGlvbiBwYWNrRGF0YShtZXNoKSB7XG4gICAgdmFyIGksIGlpLCBqLCBqajtcblxuICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkcztcbiAgICB2YXIgY29vcmRzUGFja2VkID0gbmV3IEZsb2F0MzJBcnJheShjb29yZHMubGVuZ3RoICogMik7XG4gICAgZm9yIChpID0gMCwgaiA9IDAsIGlpID0gY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciB4eSA9IGNvb3Jkc1tpXTtcbiAgICAgIGNvb3Jkc1BhY2tlZFtqKytdID0geHlbMF07XG4gICAgICBjb29yZHNQYWNrZWRbaisrXSA9IHh5WzFdO1xuICAgIH1cbiAgICBtZXNoLmNvb3JkcyA9IGNvb3Jkc1BhY2tlZDtcblxuICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9ycztcbiAgICB2YXIgY29sb3JzUGFja2VkID0gbmV3IFVpbnQ4QXJyYXkoY29sb3JzLmxlbmd0aCAqIDMpO1xuICAgIGZvciAoaSA9IDAsIGogPSAwLCBpaSA9IGNvbG9ycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgYyA9IGNvbG9yc1tpXTtcbiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1swXTtcbiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1sxXTtcbiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1syXTtcbiAgICB9XG4gICAgbWVzaC5jb2xvcnMgPSBjb2xvcnNQYWNrZWQ7XG5cbiAgICB2YXIgZmlndXJlcyA9IG1lc2guZmlndXJlcztcbiAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIGZpZ3VyZSA9IGZpZ3VyZXNbaV0sXG4gICAgICAgIHBzID0gZmlndXJlLmNvb3JkcyxcbiAgICAgICAgY3MgPSBmaWd1cmUuY29sb3JzO1xuICAgICAgZm9yIChqID0gMCwgamogPSBwcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHBzW2pdICo9IDI7XG4gICAgICAgIGNzW2pdICo9IDM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gTWVzaChcbiAgICBzdHJlYW0sXG4gICAgbWF0cml4LFxuICAgIHhyZWYsXG4gICAgcmVzb3VyY2VzLFxuICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICApIHtcbiAgICBpZiAoIWlzU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk1lc2ggZGF0YSBpcyBub3QgYSBzdHJlYW1cIik7XG4gICAgfVxuICAgIHZhciBkaWN0ID0gc3RyZWFtLmRpY3Q7XG4gICAgdGhpcy5tYXRyaXggPSBtYXRyaXg7XG4gICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KFwiU2hhZGluZ1R5cGVcIik7XG4gICAgdGhpcy50eXBlID0gXCJQYXR0ZXJuXCI7XG4gICAgY29uc3QgYmJveCA9IGRpY3QuZ2V0QXJyYXkoXCJCQm94XCIpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7XG4gICAgICB0aGlzLmJib3ggPSBVdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmJveCA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNzID0gQ29sb3JTcGFjZS5wYXJzZSh7XG4gICAgICBjczogZGljdC5nZXRSYXcoXCJDb2xvclNwYWNlXCIpIHx8IGRpY3QuZ2V0UmF3KFwiQ1NcIiksXG4gICAgICB4cmVmLFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gICAgfSk7XG4gICAgdGhpcy5jcyA9IGNzO1xuICAgIHRoaXMuYmFja2dyb3VuZCA9IGRpY3QuaGFzKFwiQmFja2dyb3VuZFwiKVxuICAgICAgPyBjcy5nZXRSZ2IoZGljdC5nZXQoXCJCYWNrZ3JvdW5kXCIpLCAwKVxuICAgICAgOiBudWxsO1xuXG4gICAgdmFyIGZuT2JqID0gZGljdC5nZXRSYXcoXCJGdW5jdGlvblwiKTtcbiAgICB2YXIgZm4gPSBmbk9iaiA/IHBkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGVGcm9tQXJyYXkoZm5PYmopIDogbnVsbDtcblxuICAgIHRoaXMuY29vcmRzID0gW107XG4gICAgdGhpcy5jb2xvcnMgPSBbXTtcbiAgICB0aGlzLmZpZ3VyZXMgPSBbXTtcblxuICAgIHZhciBkZWNvZGVDb250ZXh0ID0ge1xuICAgICAgYml0c1BlckNvb3JkaW5hdGU6IGRpY3QuZ2V0KFwiQml0c1BlckNvb3JkaW5hdGVcIiksXG4gICAgICBiaXRzUGVyQ29tcG9uZW50OiBkaWN0LmdldChcIkJpdHNQZXJDb21wb25lbnRcIiksXG4gICAgICBiaXRzUGVyRmxhZzogZGljdC5nZXQoXCJCaXRzUGVyRmxhZ1wiKSxcbiAgICAgIGRlY29kZTogZGljdC5nZXRBcnJheShcIkRlY29kZVwiKSxcbiAgICAgIGNvbG9yRm46IGZuLFxuICAgICAgY29sb3JTcGFjZTogY3MsXG4gICAgICBudW1Db21wczogZm4gPyAxIDogY3MubnVtQ29tcHMsXG4gICAgfTtcbiAgICB2YXIgcmVhZGVyID0gbmV3IE1lc2hTdHJlYW1SZWFkZXIoc3RyZWFtLCBkZWNvZGVDb250ZXh0KTtcblxuICAgIHZhciBwYXRjaE1lc2ggPSBmYWxzZTtcbiAgICBzd2l0Y2ggKHRoaXMuc2hhZGluZ1R5cGUpIHtcbiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6XG4gICAgICAgIGRlY29kZVR5cGU0U2hhZGluZyh0aGlzLCByZWFkZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6XG4gICAgICAgIHZhciB2ZXJ0aWNlc1BlclJvdyA9IGRpY3QuZ2V0KFwiVmVydGljZXNQZXJSb3dcIikgfCAwO1xuICAgICAgICBpZiAodmVydGljZXNQZXJSb3cgPCAyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBWZXJ0aWNlc1BlclJvd1wiKTtcbiAgICAgICAgfVxuICAgICAgICBkZWNvZGVUeXBlNVNoYWRpbmcodGhpcywgcmVhZGVyLCB2ZXJ0aWNlc1BlclJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTaGFkaW5nVHlwZS5DT09OU19QQVRDSF9NRVNIOlxuICAgICAgICBkZWNvZGVUeXBlNlNoYWRpbmcodGhpcywgcmVhZGVyKTtcbiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNoYWRpbmdUeXBlLlRFTlNPUl9QQVRDSF9NRVNIOlxuICAgICAgICBkZWNvZGVUeXBlN1NoYWRpbmcodGhpcywgcmVhZGVyKTtcbiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB1bnJlYWNoYWJsZShcIlVuc3VwcG9ydGVkIG1lc2ggdHlwZS5cIik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwYXRjaE1lc2gpIHtcbiAgICAgIC8vIGRpcnR5IGJvdW5kcyBjYWxjdWxhdGlvbiBmb3IgZGV0ZXJtaW5pbmcsIGhvdyBkZW5zZSBzaGFsbCBiZSB0cmlhbmdsZXNcbiAgICAgIHVwZGF0ZUJvdW5kcyh0aGlzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGJ1aWxkRmlndXJlRnJvbVBhdGNoKHRoaXMsIGkpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgYm91bmRzXG4gICAgdXBkYXRlQm91bmRzKHRoaXMpO1xuXG4gICAgcGFja0RhdGEodGhpcyk7XG4gIH1cblxuICBNZXNoLnByb3RvdHlwZSA9IHtcbiAgICBnZXRJUjogZnVuY3Rpb24gTWVzaF9nZXRJUigpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiTWVzaFwiLFxuICAgICAgICB0aGlzLnNoYWRpbmdUeXBlLFxuICAgICAgICB0aGlzLmNvb3JkcyxcbiAgICAgICAgdGhpcy5jb2xvcnMsXG4gICAgICAgIHRoaXMuZmlndXJlcyxcbiAgICAgICAgdGhpcy5ib3VuZHMsXG4gICAgICAgIHRoaXMubWF0cml4LFxuICAgICAgICB0aGlzLmJib3gsXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCxcbiAgICAgIF07XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gTWVzaDtcbn0pKCk7XG5cblNoYWRpbmdzLkR1bW15ID0gKGZ1bmN0aW9uIER1bW15Q2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gRHVtbXkoKSB7XG4gICAgdGhpcy50eXBlID0gXCJQYXR0ZXJuXCI7XG4gIH1cblxuICBEdW1teS5wcm90b3R5cGUgPSB7XG4gICAgZ2V0SVI6IGZ1bmN0aW9uIER1bW15X2dldElSKCkge1xuICAgICAgcmV0dXJuIFtcIkR1bW15XCJdO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBEdW1teTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGdldFRpbGluZ1BhdHRlcm5JUihvcGVyYXRvckxpc3QsIGRpY3QsIGFyZ3MpIHtcbiAgY29uc3QgbWF0cml4ID0gZGljdC5nZXRBcnJheShcIk1hdHJpeFwiKTtcbiAgY29uc3QgYmJveCA9IFV0aWwubm9ybWFsaXplUmVjdChkaWN0LmdldEFycmF5KFwiQkJveFwiKSk7XG4gIGNvbnN0IHhzdGVwID0gZGljdC5nZXQoXCJYU3RlcFwiKTtcbiAgY29uc3QgeXN0ZXAgPSBkaWN0LmdldChcIllTdGVwXCIpO1xuICBjb25zdCBwYWludFR5cGUgPSBkaWN0LmdldChcIlBhaW50VHlwZVwiKTtcbiAgY29uc3QgdGlsaW5nVHlwZSA9IGRpY3QuZ2V0KFwiVGlsaW5nVHlwZVwiKTtcblxuICAvLyBFbnN1cmUgdGhhdCB0aGUgcGF0dGVybiBoYXMgYSBub24temVybyB3aWR0aCBhbmQgaGVpZ2h0LCB0byBwcmV2ZW50IGVycm9yc1xuICAvLyBpbiBgcGF0dGVybl9oZWxwZXIuanNgIChmaXhlcyBpc3N1ZTgzMzAucGRmKS5cbiAgaWYgKGJib3hbMl0gLSBiYm94WzBdID09PSAwIHx8IGJib3hbM10gLSBiYm94WzFdID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvQkJveCBhcnJheTogWyR7YmJveH1dLmApO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBcIlRpbGluZ1BhdHRlcm5cIixcbiAgICBhcmdzLFxuICAgIG9wZXJhdG9yTGlzdCxcbiAgICBtYXRyaXgsXG4gICAgYmJveCxcbiAgICB4c3RlcCxcbiAgICB5c3RlcCxcbiAgICBwYWludFR5cGUsXG4gICAgdGlsaW5nVHlwZSxcbiAgXTtcbn1cblxuZXhwb3J0IHsgUGF0dGVybiwgZ2V0VGlsaW5nUGF0dGVybklSIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRGljdCwgaXNEaWN0LCBpc1N0cmVhbSwgUmVmIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHtcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIGlzQm9vbCxcbiAgSXNFdmFsU3VwcG9ydGVkQ2FjaGVkLFxuICB1bnJlYWNoYWJsZSxcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBQb3N0U2NyaXB0TGV4ZXIsIFBvc3RTY3JpcHRQYXJzZXIgfSBmcm9tIFwiLi9wc19wYXJzZXIuanNcIjtcbmltcG9ydCB7IExvY2FsRnVuY3Rpb25DYWNoZSB9IGZyb20gXCIuL2ltYWdlX3V0aWxzLmpzXCI7XG5cbmNsYXNzIFBERkZ1bmN0aW9uRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkID0gdHJ1ZSB9KSB7XG4gICAgdGhpcy54cmVmID0geHJlZjtcbiAgICB0aGlzLmlzRXZhbFN1cHBvcnRlZCA9IGlzRXZhbFN1cHBvcnRlZCAhPT0gZmFsc2U7XG4gICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlID0gbnVsbDsgLy8gSW5pdGlhbGl6ZWQgbGF6aWx5LlxuICB9XG5cbiAgY3JlYXRlKGZuKSB7XG4gICAgY29uc3QgY2FjaGVkRnVuY3Rpb24gPSB0aGlzLmdldENhY2hlZChmbik7XG4gICAgaWYgKGNhY2hlZEZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gY2FjaGVkRnVuY3Rpb247XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZEZ1bmN0aW9uID0gUERGRnVuY3Rpb24ucGFyc2Uoe1xuICAgICAgeHJlZjogdGhpcy54cmVmLFxuICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLmlzRXZhbFN1cHBvcnRlZCxcbiAgICAgIGZuOiBmbiBpbnN0YW5jZW9mIFJlZiA/IHRoaXMueHJlZi5mZXRjaChmbikgOiBmbixcbiAgICB9KTtcblxuICAgIC8vIEF0dGVtcHQgdG8gY2FjaGUgdGhlIHBhcnNlZCBGdW5jdGlvbiwgYnkgcmVmZXJlbmNlLlxuICAgIHRoaXMuX2NhY2hlKGZuLCBwYXJzZWRGdW5jdGlvbik7XG5cbiAgICByZXR1cm4gcGFyc2VkRnVuY3Rpb247XG4gIH1cblxuICBjcmVhdGVGcm9tQXJyYXkoZm5PYmopIHtcbiAgICBjb25zdCBjYWNoZWRGdW5jdGlvbiA9IHRoaXMuZ2V0Q2FjaGVkKGZuT2JqKTtcbiAgICBpZiAoY2FjaGVkRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiBjYWNoZWRGdW5jdGlvbjtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkRnVuY3Rpb24gPSBQREZGdW5jdGlvbi5wYXJzZUFycmF5KHtcbiAgICAgIHhyZWY6IHRoaXMueHJlZixcbiAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5pc0V2YWxTdXBwb3J0ZWQsXG4gICAgICBmbk9iajogZm5PYmogaW5zdGFuY2VvZiBSZWYgPyB0aGlzLnhyZWYuZmV0Y2goZm5PYmopIDogZm5PYmosXG4gICAgfSk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGNhY2hlIHRoZSBwYXJzZWQgRnVuY3Rpb24sIGJ5IHJlZmVyZW5jZS5cbiAgICB0aGlzLl9jYWNoZShmbk9iaiwgcGFyc2VkRnVuY3Rpb24pO1xuXG4gICAgcmV0dXJuIHBhcnNlZEZ1bmN0aW9uO1xuICB9XG5cbiAgZ2V0Q2FjaGVkKGNhY2hlS2V5KSB7XG4gICAgbGV0IGZuUmVmO1xuICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgZm5SZWYgPSBjYWNoZUtleTtcbiAgICB9IGVsc2UgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgRGljdCkge1xuICAgICAgZm5SZWYgPSBjYWNoZUtleS5vYmpJZDtcbiAgICB9IGVsc2UgaWYgKGlzU3RyZWFtKGNhY2hlS2V5KSkge1xuICAgICAgZm5SZWYgPSBjYWNoZUtleS5kaWN0ICYmIGNhY2hlS2V5LmRpY3Qub2JqSWQ7XG4gICAgfVxuICAgIGlmIChmblJlZikge1xuICAgICAgaWYgKCF0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlID0gbmV3IExvY2FsRnVuY3Rpb25DYWNoZSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgbG9jYWxGdW5jdGlvbiA9IHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5nZXRCeVJlZihmblJlZik7XG4gICAgICBpZiAobG9jYWxGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gbG9jYWxGdW5jdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jYWNoZShjYWNoZUtleSwgcGFyc2VkRnVuY3Rpb24pIHtcbiAgICBpZiAoIXBhcnNlZEZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdQREZGdW5jdGlvbkZhY3RvcnkuX2NhY2hlIC0gZXhwZWN0ZWQgXCJwYXJzZWRGdW5jdGlvblwiIGFyZ3VtZW50LidcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBmblJlZjtcbiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgIGZuUmVmID0gY2FjaGVLZXk7XG4gICAgfSBlbHNlIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIERpY3QpIHtcbiAgICAgIGZuUmVmID0gY2FjaGVLZXkub2JqSWQ7XG4gICAgfSBlbHNlIGlmIChpc1N0cmVhbShjYWNoZUtleSkpIHtcbiAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdCAmJiBjYWNoZUtleS5kaWN0Lm9iaklkO1xuICAgIH1cbiAgICBpZiAoZm5SZWYpIHtcbiAgICAgIGlmICghdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZSA9IG5ldyBMb2NhbEZ1bmN0aW9uQ2FjaGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5zZXQoLyogbmFtZSA9ICovIG51bGwsIGZuUmVmLCBwYXJzZWRGdW5jdGlvbik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvTnVtYmVyQXJyYXkoYXJyKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICh0eXBlb2YgYXJyW2ldICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAvLyBOb24tbnVtYmVyIGlzIGZvdW5kIC0tIGNvbnZlcnQgYWxsIGl0ZW1zIHRvIG51bWJlcnMuXG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcmVzdWx0W2pdID0gK2FycltqXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcnI7XG59XG5cbnZhciBQREZGdW5jdGlvbiA9IChmdW5jdGlvbiBQREZGdW5jdGlvbkNsb3N1cmUoKSB7XG4gIGNvbnN0IENPTlNUUlVDVF9TQU1QTEVEID0gMDtcbiAgY29uc3QgQ09OU1RSVUNUX0lOVEVSUE9MQVRFRCA9IDI7XG4gIGNvbnN0IENPTlNUUlVDVF9TVElDSEVEID0gMztcbiAgY29uc3QgQ09OU1RSVUNUX1BPU1RTQ1JJUFQgPSA0O1xuXG4gIHJldHVybiB7XG4gICAgZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBzdHJlYW0pIHtcbiAgICAgIHZhciBpLCBpaTtcbiAgICAgIHZhciBsZW5ndGggPSAxO1xuICAgICAgZm9yIChpID0gMCwgaWkgPSBzaXplLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgbGVuZ3RoICo9IHNpemVbaV07XG4gICAgICB9XG4gICAgICBsZW5ndGggKj0gb3V0cHV0U2l6ZTtcblxuICAgICAgdmFyIGFycmF5ID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICB2YXIgY29kZVNpemUgPSAwO1xuICAgICAgdmFyIGNvZGVCdWYgPSAwO1xuICAgICAgLy8gMzIgaXMgYSB2YWxpZCBicHMgc28gc2hpZnRpbmcgd29uJ3Qgd29ya1xuICAgICAgdmFyIHNhbXBsZU11bCA9IDEuMCAvICgyLjAgKiogYnBzIC0gMSk7XG5cbiAgICAgIHZhciBzdHJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcygobGVuZ3RoICogYnBzICsgNykgLyA4KTtcbiAgICAgIHZhciBzdHJJZHggPSAwO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJwcykge1xuICAgICAgICAgIGNvZGVCdWYgPDw9IDg7XG4gICAgICAgICAgY29kZUJ1ZiB8PSBzdHJCeXRlc1tzdHJJZHgrK107XG4gICAgICAgICAgY29kZVNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBjb2RlU2l6ZSAtPSBicHM7XG4gICAgICAgIGFycmF5W2ldID0gKGNvZGVCdWYgPj4gY29kZVNpemUpICogc2FtcGxlTXVsO1xuICAgICAgICBjb2RlQnVmICY9ICgxIDw8IGNvZGVTaXplKSAtIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfSxcblxuICAgIGdldElSKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiB9KSB7XG4gICAgICB2YXIgZGljdCA9IGZuLmRpY3Q7XG4gICAgICBpZiAoIWRpY3QpIHtcbiAgICAgICAgZGljdCA9IGZuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHlwZXMgPSBbXG4gICAgICAgIHRoaXMuY29uc3RydWN0U2FtcGxlZCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQsXG4gICAgICAgIHRoaXMuY29uc3RydWN0U3RpY2hlZCxcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0LFxuICAgICAgXTtcblxuICAgICAgdmFyIHR5cGVOdW0gPSBkaWN0LmdldChcIkZ1bmN0aW9uVHlwZVwiKTtcbiAgICAgIHZhciB0eXBlRm4gPSB0eXBlc1t0eXBlTnVtXTtcbiAgICAgIGlmICghdHlwZUZuKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gdHlwZSBvZiBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHR5cGVGbi5jYWxsKHRoaXMsIHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiwgZGljdCB9KTtcbiAgICB9LFxuXG4gICAgZnJvbUlSKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBJUiB9KSB7XG4gICAgICB2YXIgdHlwZSA9IElSWzBdO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgQ09OU1RSVUNUX1NBTVBMRUQ6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0U2FtcGxlZEZyb21JUih7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgSVIgfSk7XG4gICAgICAgIGNhc2UgQ09OU1RSVUNUX0lOVEVSUE9MQVRFRDpcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVIoe1xuICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCxcbiAgICAgICAgICAgIElSLFxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIENPTlNUUlVDVF9TVElDSEVEOlxuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFN0aWNoZWRGcm9tSVIoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIElSIH0pO1xuICAgICAgICAvLyBjYXNlIENPTlNUUlVDVF9QT1NUU0NSSVBUOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFBvc3RTY3JpcHRGcm9tSVIoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIElSIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZSh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm4gfSkge1xuICAgICAgY29uc3QgSVIgPSB0aGlzLmdldElSKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiB9KTtcbiAgICAgIHJldHVybiB0aGlzLmZyb21JUih7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgSVIgfSk7XG4gICAgfSxcblxuICAgIHBhcnNlQXJyYXkoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIGZuT2JqIH0pIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmbk9iaikpIHtcbiAgICAgICAgLy8gbm90IGFuIGFycmF5IC0tIHBhcnNpbmcgYXMgcmVndWxhciBmdW5jdGlvblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZSh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm46IGZuT2JqIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgZm5BcnJheSA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gZm5PYmoubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBmbkFycmF5LnB1c2goXG4gICAgICAgICAgdGhpcy5wYXJzZSh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm46IHhyZWYuZmV0Y2hJZlJlZihmbk9ialtqXSkgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZm5BcnJheS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgZm5BcnJheVtpXShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCArIGkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb25zdHJ1Y3RTYW1wbGVkKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiwgZGljdCB9KSB7XG4gICAgICBmdW5jdGlvbiB0b011bHRpQXJyYXkoYXJyKSB7XG4gICAgICAgIHZhciBpbnB1dExlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgb3V0W2luZGV4XSA9IFthcnJbaV0sIGFycltpICsgMV1dO1xuICAgICAgICAgICsraW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH1cbiAgICAgIHZhciBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoXCJEb21haW5cIikpO1xuICAgICAgdmFyIHJhbmdlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiUmFuZ2VcIikpO1xuXG4gICAgICBpZiAoIWRvbWFpbiB8fCAhcmFuZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTm8gZG9tYWluIG9yIHJhbmdlXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgb3V0cHV0U2l6ZSA9IHJhbmdlLmxlbmd0aCAvIDI7XG5cbiAgICAgIGRvbWFpbiA9IHRvTXVsdGlBcnJheShkb21haW4pO1xuICAgICAgcmFuZ2UgPSB0b011bHRpQXJyYXkocmFuZ2UpO1xuXG4gICAgICB2YXIgc2l6ZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheShcIlNpemVcIikpO1xuICAgICAgdmFyIGJwcyA9IGRpY3QuZ2V0KFwiQml0c1BlclNhbXBsZVwiKTtcbiAgICAgIHZhciBvcmRlciA9IGRpY3QuZ2V0KFwiT3JkZXJcIikgfHwgMTtcbiAgICAgIGlmIChvcmRlciAhPT0gMSkge1xuICAgICAgICAvLyBObyBkZXNjcmlwdGlvbiBob3cgY3ViaWMgc3BsaW5lIGludGVycG9sYXRpb24gd29ya3MgaW4gUERGMzIwMDA6MjAwOFxuICAgICAgICAvLyBBcyBpbiBwb3BwbGVyLCBpZ25vcmluZyBvcmRlciwgbGluZWFyIGludGVycG9sYXRpb24gbWF5IHdvcmsgYXMgZ29vZFxuICAgICAgICBpbmZvKFwiTm8gc3VwcG9ydCBmb3IgY3ViaWMgc3BsaW5lIGludGVycG9sYXRpb246IFwiICsgb3JkZXIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW5jb2RlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiRW5jb2RlXCIpKTtcbiAgICAgIGlmICghZW5jb2RlKSB7XG4gICAgICAgIGVuY29kZSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0U2l6ZTsgKytpKSB7XG4gICAgICAgICAgZW5jb2RlLnB1c2goWzAsIHNpemVbaV0gLSAxXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuY29kZSA9IHRvTXVsdGlBcnJheShlbmNvZGUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVjb2RlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiRGVjb2RlXCIpKTtcbiAgICAgIGlmICghZGVjb2RlKSB7XG4gICAgICAgIGRlY29kZSA9IHJhbmdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlID0gdG9NdWx0aUFycmF5KGRlY29kZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzYW1wbGVzID0gdGhpcy5nZXRTYW1wbGVBcnJheShzaXplLCBvdXRwdXRTaXplLCBicHMsIGZuKTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgQ09OU1RSVUNUX1NBTVBMRUQsXG4gICAgICAgIGlucHV0U2l6ZSxcbiAgICAgICAgZG9tYWluLFxuICAgICAgICBlbmNvZGUsXG4gICAgICAgIGRlY29kZSxcbiAgICAgICAgc2FtcGxlcyxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgb3V0cHV0U2l6ZSxcbiAgICAgICAgMiAqKiBicHMgLSAxLFxuICAgICAgICByYW5nZSxcbiAgICAgIF07XG4gICAgfSxcblxuICAgIGNvbnN0cnVjdFNhbXBsZWRGcm9tSVIoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIElSIH0pIHtcbiAgICAgIC8vIFNlZSBjaGFwdGVyIDMsIHBhZ2UgMTA5IG9mIHRoZSBQREYgcmVmZXJlbmNlXG4gICAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh4LCB4bWluLCB4bWF4LCB5bWluLCB5bWF4KSB7XG4gICAgICAgIHJldHVybiB5bWluICsgKHggLSB4bWluKSAqICgoeW1heCAtIHltaW4pIC8gKHhtYXggLSB4bWluKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTYW1wbGVkRnJvbUlSUmVzdWx0KFxuICAgICAgICBzcmMsXG4gICAgICAgIHNyY09mZnNldCxcbiAgICAgICAgZGVzdCxcbiAgICAgICAgZGVzdE9mZnNldFxuICAgICAgKSB7XG4gICAgICAgIC8vIFNlZSBjaGFwdGVyIDMsIHBhZ2UgMTEwIG9mIHRoZSBQREYgcmVmZXJlbmNlLlxuICAgICAgICB2YXIgbSA9IElSWzFdO1xuICAgICAgICB2YXIgZG9tYWluID0gSVJbMl07XG4gICAgICAgIHZhciBlbmNvZGUgPSBJUlszXTtcbiAgICAgICAgdmFyIGRlY29kZSA9IElSWzRdO1xuICAgICAgICB2YXIgc2FtcGxlcyA9IElSWzVdO1xuICAgICAgICB2YXIgc2l6ZSA9IElSWzZdO1xuICAgICAgICB2YXIgbiA9IElSWzddO1xuICAgICAgICAvLyB2YXIgbWFzayA9IElSWzhdO1xuICAgICAgICB2YXIgcmFuZ2UgPSBJUls5XTtcblxuICAgICAgICAvLyBCdWlsZGluZyB0aGUgY3ViZSB2ZXJ0aWNlczogaXRzIHBhcnQgYW5kIHNhbXBsZSBpbmRleFxuICAgICAgICAvLyBodHRwOi8vcmp3YWduZXI0OS5jb20vTWF0aGVtYXRpY3MvSW50ZXJwb2xhdGlvbi5wZGZcbiAgICAgICAgdmFyIGN1YmVWZXJ0aWNlcyA9IDEgPDwgbTtcbiAgICAgICAgdmFyIGN1YmVOID0gbmV3IEZsb2F0NjRBcnJheShjdWJlVmVydGljZXMpO1xuICAgICAgICB2YXIgY3ViZVZlcnRleCA9IG5ldyBVaW50MzJBcnJheShjdWJlVmVydGljZXMpO1xuICAgICAgICB2YXIgaSwgajtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1YmVWZXJ0aWNlczsgaisrKSB7XG4gICAgICAgICAgY3ViZU5bal0gPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGsgPSBuLFxuICAgICAgICAgIHBvcyA9IDE7XG4gICAgICAgIC8vIE1hcCB4X2kgdG8geV9qIGZvciAwIDw9IGkgPCBtIHVzaW5nIHRoZSBzYW1wbGVkIGZ1bmN0aW9uLlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7XG4gICAgICAgICAgLy8geF9pJyA9IG1pbihtYXgoeF9pLCBEb21haW5fMmkpLCBEb21haW5fMmkrMSlcbiAgICAgICAgICB2YXIgZG9tYWluXzJpID0gZG9tYWluW2ldWzBdO1xuICAgICAgICAgIHZhciBkb21haW5fMmlfMSA9IGRvbWFpbltpXVsxXTtcbiAgICAgICAgICB2YXIgeGkgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGgubWF4KHNyY1tzcmNPZmZzZXQgKyBpXSwgZG9tYWluXzJpKSxcbiAgICAgICAgICAgIGRvbWFpbl8yaV8xXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIGVfaSA9IEludGVycG9sYXRlKHhfaScsIERvbWFpbl8yaSwgRG9tYWluXzJpKzEsXG4gICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgRW5jb2RlXzJpLCBFbmNvZGVfMmkrMSlcbiAgICAgICAgICB2YXIgZSA9IGludGVycG9sYXRlKFxuICAgICAgICAgICAgeGksXG4gICAgICAgICAgICBkb21haW5fMmksXG4gICAgICAgICAgICBkb21haW5fMmlfMSxcbiAgICAgICAgICAgIGVuY29kZVtpXVswXSxcbiAgICAgICAgICAgIGVuY29kZVtpXVsxXVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBlX2knID0gbWluKG1heChlX2ksIDApLCBTaXplX2kgLSAxKVxuICAgICAgICAgIHZhciBzaXplX2kgPSBzaXplW2ldO1xuICAgICAgICAgIGUgPSBNYXRoLm1pbihNYXRoLm1heChlLCAwKSwgc2l6ZV9pIC0gMSk7XG5cbiAgICAgICAgICAvLyBBZGp1c3RpbmcgdGhlIGN1YmU6IE4gYW5kIHZlcnRleCBzYW1wbGUgaW5kZXhcbiAgICAgICAgICB2YXIgZTAgPSBlIDwgc2l6ZV9pIC0gMSA/IE1hdGguZmxvb3IoZSkgOiBlIC0gMTsgLy8gZTEgPSBlMCArIDE7XG4gICAgICAgICAgdmFyIG4wID0gZTAgKyAxIC0gZTsgLy8gKGUxIC0gZSkgLyAoZTEgLSBlMCk7XG4gICAgICAgICAgdmFyIG4xID0gZSAtIGUwOyAvLyAoZSAtIGUwKSAvIChlMSAtIGUwKTtcbiAgICAgICAgICB2YXIgb2Zmc2V0MCA9IGUwICogaztcbiAgICAgICAgICB2YXIgb2Zmc2V0MSA9IG9mZnNldDAgKyBrOyAvLyBlMSAqIGtcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3ViZVZlcnRpY2VzOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChqICYgcG9zKSB7XG4gICAgICAgICAgICAgIGN1YmVOW2pdICo9IG4xO1xuICAgICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjdWJlTltqXSAqPSBuMDtcbiAgICAgICAgICAgICAgY3ViZVZlcnRleFtqXSArPSBvZmZzZXQwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGsgKj0gc2l6ZV9pO1xuICAgICAgICAgIHBvcyA8PD0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHtcbiAgICAgICAgICAvLyBTdW0gYWxsIGN1YmUgdmVydGljZXMnIHNhbXBsZXMgcG9ydGlvbnNcbiAgICAgICAgICB2YXIgcmogPSAwO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdWJlVmVydGljZXM7IGkrKykge1xuICAgICAgICAgICAgcmogKz0gc2FtcGxlc1tjdWJlVmVydGV4W2ldICsgal0gKiBjdWJlTltpXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyByX2onID0gSW50ZXJwb2xhdGUocl9qLCAwLCAyXkJpdHNQZXJTYW1wbGUgLSAxLFxuICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBEZWNvZGVfMmosIERlY29kZV8yaisxKVxuICAgICAgICAgIHJqID0gaW50ZXJwb2xhdGUocmosIDAsIDEsIGRlY29kZVtqXVswXSwgZGVjb2RlW2pdWzFdKTtcblxuICAgICAgICAgIC8vIHlfaiA9IG1pbihtYXgocl9qLCByYW5nZV8yaiksIHJhbmdlXzJqKzEpXG4gICAgICAgICAgZGVzdFtkZXN0T2Zmc2V0ICsgal0gPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGgubWF4KHJqLCByYW5nZVtqXVswXSksXG4gICAgICAgICAgICByYW5nZVtqXVsxXVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcblxuICAgIGNvbnN0cnVjdEludGVycG9sYXRlZCh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm4sIGRpY3QgfSkge1xuICAgICAgdmFyIGMwID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiQzBcIikpIHx8IFswXTtcbiAgICAgIHZhciBjMSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheShcIkMxXCIpKSB8fCBbMV07XG4gICAgICB2YXIgbiA9IGRpY3QuZ2V0KFwiTlwiKTtcblxuICAgICAgdmFyIGxlbmd0aCA9IGMwLmxlbmd0aDtcbiAgICAgIHZhciBkaWZmID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGRpZmYucHVzaChjMVtpXSAtIGMwW2ldKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtDT05TVFJVQ1RfSU5URVJQT0xBVEVELCBjMCwgZGlmZiwgbl07XG4gICAgfSxcblxuICAgIGNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUih7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgSVIgfSkge1xuICAgICAgdmFyIGMwID0gSVJbMV07XG4gICAgICB2YXIgZGlmZiA9IElSWzJdO1xuICAgICAgdmFyIG4gPSBJUlszXTtcblxuICAgICAgdmFyIGxlbmd0aCA9IGRpZmYubGVuZ3RoO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0SW50ZXJwb2xhdGVkRnJvbUlSUmVzdWx0KFxuICAgICAgICBzcmMsXG4gICAgICAgIHNyY09mZnNldCxcbiAgICAgICAgZGVzdCxcbiAgICAgICAgZGVzdE9mZnNldFxuICAgICAgKSB7XG4gICAgICAgIHZhciB4ID0gbiA9PT0gMSA/IHNyY1tzcmNPZmZzZXRdIDogc3JjW3NyY09mZnNldF0gKiogbjtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgZGVzdFtkZXN0T2Zmc2V0ICsgal0gPSBjMFtqXSArIHggKiBkaWZmW2pdO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb25zdHJ1Y3RTdGljaGVkKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiwgZGljdCB9KSB7XG4gICAgICB2YXIgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiRG9tYWluXCIpKTtcblxuICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTm8gZG9tYWluXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7XG4gICAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkJhZCBkb21haW4gZm9yIHN0aWNoZWQgZnVuY3Rpb25cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBmblJlZnMgPSBkaWN0LmdldChcIkZ1bmN0aW9uc1wiKTtcbiAgICAgIHZhciBmbnMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGZuUmVmcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgIGZucy5wdXNoKFxuICAgICAgICAgIHRoaXMucGFyc2UoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIGZuOiB4cmVmLmZldGNoSWZSZWYoZm5SZWZzW2ldKSB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB2YXIgYm91bmRzID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiQm91bmRzXCIpKTtcbiAgICAgIHZhciBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoXCJFbmNvZGVcIikpO1xuXG4gICAgICByZXR1cm4gW0NPTlNUUlVDVF9TVElDSEVELCBkb21haW4sIGJvdW5kcywgZW5jb2RlLCBmbnNdO1xuICAgIH0sXG5cbiAgICBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBJUiB9KSB7XG4gICAgICB2YXIgZG9tYWluID0gSVJbMV07XG4gICAgICB2YXIgYm91bmRzID0gSVJbMl07XG4gICAgICB2YXIgZW5jb2RlID0gSVJbM107XG4gICAgICB2YXIgZm5zID0gSVJbNF07XG4gICAgICB2YXIgdG1wQnVmID0gbmV3IEZsb2F0MzJBcnJheSgxKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGcm9tSVJSZXN1bHQoXG4gICAgICAgIHNyYyxcbiAgICAgICAgc3JjT2Zmc2V0LFxuICAgICAgICBkZXN0LFxuICAgICAgICBkZXN0T2Zmc2V0XG4gICAgICApIHtcbiAgICAgICAgdmFyIGNsaXAgPSBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSQ2xpcCh2LCBtaW4sIG1heCkge1xuICAgICAgICAgIGlmICh2ID4gbWF4KSB7XG4gICAgICAgICAgICB2ID0gbWF4O1xuICAgICAgICAgIH0gZWxzZSBpZiAodiA8IG1pbikge1xuICAgICAgICAgICAgdiA9IG1pbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gY2xpcCB0byBkb21haW5cbiAgICAgICAgdmFyIHYgPSBjbGlwKHNyY1tzcmNPZmZzZXRdLCBkb21haW5bMF0sIGRvbWFpblsxXSk7XG4gICAgICAgIC8vIGNhbGN1bGF0ZSB3aGljaCBib3VuZCB0aGUgdmFsdWUgaXMgaW5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYm91bmRzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICBpZiAodiA8IGJvdW5kc1tpXSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5jb2RlIHZhbHVlIGludG8gZG9tYWluIG9mIGZ1bmN0aW9uXG4gICAgICAgIHZhciBkbWluID0gZG9tYWluWzBdO1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBkbWluID0gYm91bmRzW2kgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZG1heCA9IGRvbWFpblsxXTtcbiAgICAgICAgaWYgKGkgPCBib3VuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgZG1heCA9IGJvdW5kc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBybWluID0gZW5jb2RlWzIgKiBpXTtcbiAgICAgICAgdmFyIHJtYXggPSBlbmNvZGVbMiAqIGkgKyAxXTtcblxuICAgICAgICAvLyBQcmV2ZW50IHRoZSB2YWx1ZSBmcm9tIGJlY29taW5nIE5hTiBhcyBhIHJlc3VsdFxuICAgICAgICAvLyBvZiBkaXZpc2lvbiBieSB6ZXJvIChmaXhlcyBpc3N1ZTYxMTMucGRmKS5cbiAgICAgICAgdG1wQnVmWzBdID1cbiAgICAgICAgICBkbWluID09PSBkbWF4XG4gICAgICAgICAgICA/IHJtaW5cbiAgICAgICAgICAgIDogcm1pbiArICgodiAtIGRtaW4pICogKHJtYXggLSBybWluKSkgLyAoZG1heCAtIGRtaW4pO1xuXG4gICAgICAgIC8vIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uXG4gICAgICAgIGZuc1tpXSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpO1xuICAgICAgfTtcbiAgICB9LFxuXG4gICAgY29uc3RydWN0UG9zdFNjcmlwdCh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm4sIGRpY3QgfSkge1xuICAgICAgdmFyIGRvbWFpbiA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheShcIkRvbWFpblwiKSk7XG4gICAgICB2YXIgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoXCJSYW5nZVwiKSk7XG5cbiAgICAgIGlmICghZG9tYWluKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk5vIGRvbWFpbi5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTm8gcmFuZ2UuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGV4ZXIgPSBuZXcgUG9zdFNjcmlwdExleGVyKGZuKTtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgUG9zdFNjcmlwdFBhcnNlcihsZXhlcik7XG4gICAgICB2YXIgY29kZSA9IHBhcnNlci5wYXJzZSgpO1xuXG4gICAgICByZXR1cm4gW0NPTlNUUlVDVF9QT1NUU0NSSVBULCBkb21haW4sIHJhbmdlLCBjb2RlXTtcbiAgICB9LFxuXG4gICAgY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUih7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgSVIgfSkge1xuICAgICAgdmFyIGRvbWFpbiA9IElSWzFdO1xuICAgICAgdmFyIHJhbmdlID0gSVJbMl07XG4gICAgICB2YXIgY29kZSA9IElSWzNdO1xuXG4gICAgICBpZiAoaXNFdmFsU3VwcG9ydGVkICYmIElzRXZhbFN1cHBvcnRlZENhY2hlZC52YWx1ZSkge1xuICAgICAgICBjb25zdCBjb21waWxlZCA9IG5ldyBQb3N0U2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpO1xuICAgICAgICBpZiAoY29tcGlsZWQpIHtcbiAgICAgICAgICAvLyBDb21waWxlZCBmdW5jdGlvbiBjb25zaXN0cyBvZiBzaW1wbGUgZXhwcmVzc2lvbnMgc3VjaCBhcyBhZGRpdGlvbixcbiAgICAgICAgICAvLyBzdWJ0cmFjdGlvbiwgTWF0aC5tYXgsIGFuZCBhbHNvIGNvbnRhaW5zICd2YXInIGFuZCAncmV0dXJuJ1xuICAgICAgICAgIC8vIHN0YXRlbWVudHMuIFNlZSB0aGUgZ2VuZXJhdGlvbiBpbiB0aGUgUG9zdFNjcmlwdENvbXBpbGVyIGJlbG93LlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oXG4gICAgICAgICAgICBcInNyY1wiLFxuICAgICAgICAgICAgXCJzcmNPZmZzZXRcIixcbiAgICAgICAgICAgIFwiZGVzdFwiLFxuICAgICAgICAgICAgXCJkZXN0T2Zmc2V0XCIsXG4gICAgICAgICAgICBjb21waWxlZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluZm8oXCJVbmFibGUgdG8gY29tcGlsZSBQUyBmdW5jdGlvblwiKTtcblxuICAgICAgdmFyIG51bU91dHB1dHMgPSByYW5nZS5sZW5ndGggPj4gMTtcbiAgICAgIHZhciBudW1JbnB1dHMgPSBkb21haW4ubGVuZ3RoID4+IDE7XG4gICAgICB2YXIgZXZhbHVhdG9yID0gbmV3IFBvc3RTY3JpcHRFdmFsdWF0b3IoY29kZSk7XG4gICAgICAvLyBDYWNoZSB0aGUgdmFsdWVzIGZvciBhIGJpZyBzcGVlZCB1cCwgdGhlIGNhY2hlIHNpemUgaXMgbGltaXRlZCB0aG91Z2hcbiAgICAgIC8vIHNpbmNlIHRoZSBudW1iZXIgb2YgcG9zc2libGUgdmFsdWVzIGNhbiBiZSBodWdlIGZyb20gYSBQUyBmdW5jdGlvbi5cbiAgICAgIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAvLyBUaGUgTUFYX0NBQ0hFX1NJWkUgaXMgc2V0IHRvIH40eCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzXG4gICAgICAvLyBzZWVuIGluIG91ciB0ZXN0cy5cbiAgICAgIHZhciBNQVhfQ0FDSEVfU0laRSA9IDIwNDggKiA0O1xuICAgICAgdmFyIGNhY2hlX2F2YWlsYWJsZSA9IE1BWF9DQUNIRV9TSVpFO1xuICAgICAgdmFyIHRtcEJ1ZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtSW5wdXRzKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFBvc3RTY3JpcHRGcm9tSVJSZXN1bHQoXG4gICAgICAgIHNyYyxcbiAgICAgICAgc3JjT2Zmc2V0LFxuICAgICAgICBkZXN0LFxuICAgICAgICBkZXN0T2Zmc2V0XG4gICAgICApIHtcbiAgICAgICAgdmFyIGksIHZhbHVlO1xuICAgICAgICB2YXIga2V5ID0gXCJcIjtcbiAgICAgICAgdmFyIGlucHV0ID0gdG1wQnVmO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtSW5wdXRzOyBpKyspIHtcbiAgICAgICAgICB2YWx1ZSA9IHNyY1tzcmNPZmZzZXQgKyBpXTtcbiAgICAgICAgICBpbnB1dFtpXSA9IHZhbHVlO1xuICAgICAgICAgIGtleSArPSB2YWx1ZSArIFwiX1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gY2FjaGVba2V5XTtcbiAgICAgICAgaWYgKGNhY2hlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZXN0LnNldChjYWNoZWRWYWx1ZSwgZGVzdE9mZnNldCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkobnVtT3V0cHV0cyk7XG4gICAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRvci5leGVjdXRlKGlucHV0KTtcbiAgICAgICAgdmFyIHN0YWNrSW5kZXggPSBzdGFjay5sZW5ndGggLSBudW1PdXRwdXRzO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgaSsrKSB7XG4gICAgICAgICAgdmFsdWUgPSBzdGFja1tzdGFja0luZGV4ICsgaV07XG4gICAgICAgICAgdmFyIGJvdW5kID0gcmFuZ2VbaSAqIDJdO1xuICAgICAgICAgIGlmICh2YWx1ZSA8IGJvdW5kKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJvdW5kO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib3VuZCA9IHJhbmdlW2kgKiAyICsgMV07XG4gICAgICAgICAgICBpZiAodmFsdWUgPiBib3VuZCkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGJvdW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXRbaV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FjaGVfYXZhaWxhYmxlID4gMCkge1xuICAgICAgICAgIGNhY2hlX2F2YWlsYWJsZS0tO1xuICAgICAgICAgIGNhY2hlW2tleV0gPSBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdC5zZXQob3V0cHV0LCBkZXN0T2Zmc2V0KTtcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGlzUERGRnVuY3Rpb24odikge1xuICB2YXIgZm5EaWN0O1xuICBpZiAodHlwZW9mIHYgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNEaWN0KHYpKSB7XG4gICAgZm5EaWN0ID0gdjtcbiAgfSBlbHNlIGlmIChpc1N0cmVhbSh2KSkge1xuICAgIGZuRGljdCA9IHYuZGljdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGZuRGljdC5oYXMoXCJGdW5jdGlvblR5cGVcIik7XG59XG5cbnZhciBQb3N0U2NyaXB0U3RhY2sgPSAoZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrQ2xvc3VyZSgpIHtcbiAgdmFyIE1BWF9TVEFDS19TSVpFID0gMTAwO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrKGluaXRpYWxTdGFjaykge1xuICAgIHRoaXMuc3RhY2sgPSAhaW5pdGlhbFN0YWNrXG4gICAgICA/IFtdXG4gICAgICA6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGluaXRpYWxTdGFjaywgMCk7XG4gIH1cblxuICBQb3N0U2NyaXB0U3RhY2sucHJvdG90eXBlID0ge1xuICAgIHB1c2g6IGZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19wdXNoKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPj0gTUFYX1NUQUNLX1NJWkUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy5cIik7XG4gICAgICB9XG4gICAgICB0aGlzLnN0YWNrLnB1c2godmFsdWUpO1xuICAgIH0sXG4gICAgcG9wOiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcG9wKCkge1xuICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayB1bmRlcmZsb3cuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RhY2sucG9wKCk7XG4gICAgfSxcbiAgICBjb3B5OiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfY29weShuKSB7XG4gICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggKyBuID49IE1BWF9TVEFDS19TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuXCIpO1xuICAgICAgfVxuICAgICAgdmFyIHN0YWNrID0gdGhpcy5zdGFjaztcbiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSBuLCBqID0gbiAtIDE7IGogPj0gMDsgai0tLCBpKyspIHtcbiAgICAgICAgc3RhY2sucHVzaChzdGFja1tpXSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpbmRleDogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX2luZGV4KG4pIHtcbiAgICAgIHRoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbiAtIDFdKTtcbiAgICB9LFxuICAgIC8vIHJvdGF0ZSB0aGUgbGFzdCBuIHN0YWNrIGVsZW1lbnRzIHAgdGltZXNcbiAgICByb2xsOiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcm9sbChuLCBwKSB7XG4gICAgICB2YXIgc3RhY2sgPSB0aGlzLnN0YWNrO1xuICAgICAgdmFyIGwgPSBzdGFjay5sZW5ndGggLSBuO1xuICAgICAgdmFyIHIgPSBzdGFjay5sZW5ndGggLSAxLFxuICAgICAgICBjID0gbCArIChwIC0gTWF0aC5mbG9vcihwIC8gbikgKiBuKSxcbiAgICAgICAgaSxcbiAgICAgICAgaixcbiAgICAgICAgdDtcbiAgICAgIGZvciAoaSA9IGwsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHtcbiAgICAgICAgdCA9IHN0YWNrW2ldO1xuICAgICAgICBzdGFja1tpXSA9IHN0YWNrW2pdO1xuICAgICAgICBzdGFja1tqXSA9IHQ7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSBsLCBqID0gYyAtIDE7IGkgPCBqOyBpKyssIGotLSkge1xuICAgICAgICB0ID0gc3RhY2tbaV07XG4gICAgICAgIHN0YWNrW2ldID0gc3RhY2tbal07XG4gICAgICAgIHN0YWNrW2pdID0gdDtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IGMsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHtcbiAgICAgICAgdCA9IHN0YWNrW2ldO1xuICAgICAgICBzdGFja1tpXSA9IHN0YWNrW2pdO1xuICAgICAgICBzdGFja1tqXSA9IHQ7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIFBvc3RTY3JpcHRTdGFjaztcbn0pKCk7XG52YXIgUG9zdFNjcmlwdEV2YWx1YXRvciA9IChmdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yKG9wZXJhdG9ycykge1xuICAgIHRoaXMub3BlcmF0b3JzID0gb3BlcmF0b3JzO1xuICB9XG4gIFBvc3RTY3JpcHRFdmFsdWF0b3IucHJvdG90eXBlID0ge1xuICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIFBvc3RTY3JpcHRFdmFsdWF0b3JfZXhlY3V0ZShpbml0aWFsU3RhY2spIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBQb3N0U2NyaXB0U3RhY2soaW5pdGlhbFN0YWNrKTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciBvcGVyYXRvcnMgPSB0aGlzLm9wZXJhdG9ycztcbiAgICAgIHZhciBsZW5ndGggPSBvcGVyYXRvcnMubGVuZ3RoO1xuICAgICAgdmFyIG9wZXJhdG9yLCBhLCBiO1xuICAgICAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICAgICAgb3BlcmF0b3IgPSBvcGVyYXRvcnNbY291bnRlcisrXTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcGVyYXRvciA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIC8vIE9wZXJhdG9yIGlzIHJlYWxseSBhbiBvcGVyYW5kIGFuZCBzaG91bGQgYmUgcHVzaGVkIHRvIHRoZSBzdGFjay5cbiAgICAgICAgICBzdGFjay5wdXNoKG9wZXJhdG9yKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgLy8gbm9uIHN0YW5kYXJkIHBzIG9wZXJhdG9yc1xuICAgICAgICAgIGNhc2UgXCJqelwiOiAvLyBqdW1wIGlmIGZhbHNlXG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWEpIHtcbiAgICAgICAgICAgICAgY291bnRlciA9IGI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwialwiOiAvLyBqdW1wXG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBjb3VudGVyID0gYTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgLy8gYWxsIHBzIG9wZXJhdG9ycyBpbiBhbHBoYWJldGljYWwgb3JkZXIgKGV4Y2x1ZGluZyBpZi9pZmVsc2UpXG4gICAgICAgICAgY2FzZSBcImFic1wiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmFicyhhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgKyBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhbmRcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGlmIChpc0Jvb2woYSkgJiYgaXNCb29sKGIpKSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmJiBiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmIGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImF0YW5cIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hdGFuKGEpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJiaXRzaGlmdFwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKGEgPiAwKSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA8PCBiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA+PiBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjZWlsaW5nXCI6XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY2VpbChhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiY29weVwiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2suY29weShhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjb3NcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5jb3MoYSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImN2aVwiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpIHwgMDtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiY3ZyXCI6XG4gICAgICAgICAgICAvLyBub29wXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZGl2XCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgLyBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJkdXBcIjpcbiAgICAgICAgICAgIHN0YWNrLmNvcHkoMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSA9PT0gYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZXhjaFwiOlxuICAgICAgICAgICAgc3RhY2sucm9sbCgyLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJleHBcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSAqKiBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmYWxzZVwiOlxuICAgICAgICAgICAgc3RhY2sucHVzaChmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZmxvb3JcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5mbG9vcihhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZ2VcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSA+PSBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhID4gYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiaWRpdlwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaCgoYSAvIGIpIHwgMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiaW5kZXhcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLmluZGV4KGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImxlXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgPD0gYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibG5cIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5sb2coYSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImxvZ1wiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmxvZyhhKSAvIE1hdGguTE4xMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibHRcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSA8IGIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm1vZFwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhICUgYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibXVsXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgKiBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJuZVwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhICE9PSBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJuZWdcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goLWEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5vdFwiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKGlzQm9vbChhKSkge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKCFhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2gofmEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm9yXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAoaXNCb29sKGEpICYmIGlzQm9vbChiKSkge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgfHwgYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgfCBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJwb3BcIjpcbiAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInJvbGxcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnJvbGwoYSwgYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwicm91bmRcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5yb3VuZChhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic2luXCI6XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc2luKGEpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJzcXJ0XCI6XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc3FydChhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3ViXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgLSBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ0cnVlXCI6XG4gICAgICAgICAgICBzdGFjay5wdXNoKHRydWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInRydW5jYXRlXCI6XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gYSA8IDAgPyBNYXRoLmNlaWwoYSkgOiBNYXRoLmZsb29yKGEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ4b3JcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGlmIChpc0Jvb2woYSkgJiYgaXNCb29sKGIpKSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAhPT0gYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgXiBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVua25vd24gb3BlcmF0b3IgJHtvcGVyYXRvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YWNrLnN0YWNrO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBQb3N0U2NyaXB0RXZhbHVhdG9yO1xufSkoKTtcblxuLy8gTW9zdCBvZiB0aGUgUERGcyBmdW5jdGlvbnMgY29uc2lzdCBvZiBzaW1wbGUgb3BlcmF0aW9ucyBzdWNoIGFzOlxuLy8gICByb2xsLCBleGNoLCBzdWIsIGN2ciwgcG9wLCBpbmRleCwgZHVwLCBtdWwsIGlmLCBndCwgYWRkLlxuLy9cbi8vIFdlIGNhbiBjb21waWxlIG1vc3Qgb2Ygc3VjaCBwcm9ncmFtcywgYW5kIGF0IHRoZSBzYW1lIG1vbWVudCwgd2UgY2FuXG4vLyBvcHRpbWl6ZSBzb21lIGV4cHJlc3Npb25zIHVzaW5nIGJhc2ljIG1hdGggcHJvcGVydGllcy4gS2VlcGluZyB0cmFjayBvZlxuLy8gbWluL21heCB2YWx1ZXMgd2lsbCBhbGxvdyB1cyB0byBhdm9pZCBleHRyYSBNYXRoLm1pbi9NYXRoLm1heCBjYWxscy5cbnZhciBQb3N0U2NyaXB0Q29tcGlsZXIgPSAoZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gQXN0Tm9kZSh0eXBlKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuICBBc3ROb2RlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdW5yZWFjaGFibGUoXCJhYnN0cmFjdCBtZXRob2RcIik7XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN0QXJndW1lbnQoaW5kZXgsIG1pbiwgbWF4KSB7XG4gICAgQXN0Tm9kZS5jYWxsKHRoaXMsIFwiYXJnc1wiKTtcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gIH1cbiAgQXN0QXJndW1lbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBc3ROb2RlLnByb3RvdHlwZSk7XG4gIEFzdEFyZ3VtZW50LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdEFyZ3VtZW50KHRoaXMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzdExpdGVyYWwobnVtYmVyKSB7XG4gICAgQXN0Tm9kZS5jYWxsKHRoaXMsIFwibGl0ZXJhbFwiKTtcbiAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICB0aGlzLm1pbiA9IG51bWJlcjtcbiAgICB0aGlzLm1heCA9IG51bWJlcjtcbiAgfVxuICBBc3RMaXRlcmFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpO1xuICBBc3RMaXRlcmFsLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdExpdGVyYWwodGhpcyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN0QmluYXJ5T3BlcmF0aW9uKG9wLCBhcmcxLCBhcmcyLCBtaW4sIG1heCkge1xuICAgIEFzdE5vZGUuY2FsbCh0aGlzLCBcImJpbmFyeVwiKTtcbiAgICB0aGlzLm9wID0gb3A7XG4gICAgdGhpcy5hcmcxID0gYXJnMTtcbiAgICB0aGlzLmFyZzIgPSBhcmcyO1xuICAgIHRoaXMubWluID0gbWluO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG4gIEFzdEJpbmFyeU9wZXJhdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtcbiAgQXN0QmluYXJ5T3BlcmF0aW9uLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdEJpbmFyeU9wZXJhdGlvbih0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3RNaW4oYXJnLCBtYXgpIHtcbiAgICBBc3ROb2RlLmNhbGwodGhpcywgXCJtYXhcIik7XG4gICAgdGhpcy5hcmcgPSBhcmc7XG4gICAgdGhpcy5taW4gPSBhcmcubWluO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG4gIEFzdE1pbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtcbiAgQXN0TWluLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdE1pbih0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3RWYXJpYWJsZShpbmRleCwgbWluLCBtYXgpIHtcbiAgICBBc3ROb2RlLmNhbGwodGhpcywgXCJ2YXJcIik7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIHRoaXMubWluID0gbWluO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG4gIEFzdFZhcmlhYmxlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpO1xuICBBc3RWYXJpYWJsZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikge1xuICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZSh0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3RWYXJpYWJsZURlZmluaXRpb24odmFyaWFibGUsIGFyZykge1xuICAgIEFzdE5vZGUuY2FsbCh0aGlzLCBcImRlZmluaXRpb25cIik7XG4gICAgdGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlO1xuICAgIHRoaXMuYXJnID0gYXJnO1xuICB9XG4gIEFzdFZhcmlhYmxlRGVmaW5pdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtcbiAgQXN0VmFyaWFibGVEZWZpbml0aW9uLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdFZhcmlhYmxlRGVmaW5pdGlvbih0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKSB7XG4gICAgdGhpcy5wYXJ0cyA9IFtdO1xuICB9XG4gIEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvci5wcm90b3R5cGUgPSB7XG4gICAgdmlzaXRBcmd1bWVudChhcmcpIHtcbiAgICAgIHRoaXMucGFydHMucHVzaChcbiAgICAgICAgXCJNYXRoLm1heChcIixcbiAgICAgICAgYXJnLm1pbixcbiAgICAgICAgXCIsIE1hdGgubWluKFwiLFxuICAgICAgICBhcmcubWF4LFxuICAgICAgICBcIiwgc3JjW3NyY09mZnNldCArIFwiLFxuICAgICAgICBhcmcuaW5kZXgsXG4gICAgICAgIFwiXSkpXCJcbiAgICAgICk7XG4gICAgfSxcbiAgICB2aXNpdFZhcmlhYmxlKHZhcmlhYmxlKSB7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCJ2XCIsIHZhcmlhYmxlLmluZGV4KTtcbiAgICB9LFxuICAgIHZpc2l0TGl0ZXJhbChsaXRlcmFsKSB7XG4gICAgICB0aGlzLnBhcnRzLnB1c2gobGl0ZXJhbC5udW1iZXIpO1xuICAgIH0sXG4gICAgdmlzaXRCaW5hcnlPcGVyYXRpb24ob3BlcmF0aW9uKSB7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIoXCIpO1xuICAgICAgb3BlcmF0aW9uLmFyZzEudmlzaXQodGhpcyk7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIgXCIsIG9wZXJhdGlvbi5vcCwgXCIgXCIpO1xuICAgICAgb3BlcmF0aW9uLmFyZzIudmlzaXQodGhpcyk7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIpXCIpO1xuICAgIH0sXG4gICAgdmlzaXRWYXJpYWJsZURlZmluaXRpb24oZGVmaW5pdGlvbikge1xuICAgICAgdGhpcy5wYXJ0cy5wdXNoKFwidmFyIFwiKTtcbiAgICAgIGRlZmluaXRpb24udmFyaWFibGUudmlzaXQodGhpcyk7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIgPSBcIik7XG4gICAgICBkZWZpbml0aW9uLmFyZy52aXNpdCh0aGlzKTtcbiAgICAgIHRoaXMucGFydHMucHVzaChcIjtcIik7XG4gICAgfSxcbiAgICB2aXNpdE1pbihtYXgpIHtcbiAgICAgIHRoaXMucGFydHMucHVzaChcIk1hdGgubWluKFwiKTtcbiAgICAgIG1heC5hcmcudmlzaXQodGhpcyk7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIsIFwiLCBtYXgubWF4LCBcIilcIik7XG4gICAgfSxcbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIik7XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSB7XG4gICAgaWYgKG51bTIudHlwZSA9PT0gXCJsaXRlcmFsXCIgJiYgbnVtMi5udW1iZXIgPT09IDApIHtcbiAgICAgIC8vIG9wdGltaXphdGlvbjogc2Vjb25kIG9wZXJhbmQgaXMgMFxuICAgICAgcmV0dXJuIG51bTE7XG4gICAgfVxuICAgIGlmIChudW0xLnR5cGUgPT09IFwibGl0ZXJhbFwiICYmIG51bTEubnVtYmVyID09PSAwKSB7XG4gICAgICAvLyBvcHRpbWl6YXRpb246IGZpcnN0IG9wZXJhbmQgaXMgMFxuICAgICAgcmV0dXJuIG51bTI7XG4gICAgfVxuICAgIGlmIChudW0yLnR5cGUgPT09IFwibGl0ZXJhbFwiICYmIG51bTEudHlwZSA9PT0gXCJsaXRlcmFsXCIpIHtcbiAgICAgIC8vIG9wdGltaXphdGlvbjogb3BlcmFuZHMgb3BlcmFuZCBhcmUgbGl0ZXJhbHNcbiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciArIG51bTIubnVtYmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oXG4gICAgICBcIitcIixcbiAgICAgIG51bTEsXG4gICAgICBudW0yLFxuICAgICAgbnVtMS5taW4gKyBudW0yLm1pbixcbiAgICAgIG51bTEubWF4ICsgbnVtMi5tYXhcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRNdWxPcGVyYXRpb24obnVtMSwgbnVtMikge1xuICAgIGlmIChudW0yLnR5cGUgPT09IFwibGl0ZXJhbFwiKSB7XG4gICAgICAvLyBvcHRpbWl6YXRpb246IHNlY29uZCBvcGVyYW5kcyBpcyBhIGxpdGVyYWwuLi5cbiAgICAgIGlmIChudW0yLm51bWJlciA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwoMCk7IC8vIGFuZCBpdCdzIDBcbiAgICAgIH0gZWxzZSBpZiAobnVtMi5udW1iZXIgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG51bTE7IC8vIGFuZCBpdCdzIDFcbiAgICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSBcImxpdGVyYWxcIikge1xuICAgICAgICAvLyAuLi4gYW5kIGZpcnN0IG9wZXJhbmRzIGlzIGEgbGl0ZXJhbCB0b29cbiAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICogbnVtMi5udW1iZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVtMS50eXBlID09PSBcImxpdGVyYWxcIikge1xuICAgICAgLy8gb3B0aW1pemF0aW9uOiBmaXJzdCBvcGVyYW5kcyBpcyBhIGxpdGVyYWwuLi5cbiAgICAgIGlmIChudW0xLm51bWJlciA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwoMCk7IC8vIGFuZCBpdCdzIDBcbiAgICAgIH0gZWxzZSBpZiAobnVtMS5udW1iZXIgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG51bTI7IC8vIGFuZCBpdCdzIDFcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1pbiA9IE1hdGgubWluKFxuICAgICAgbnVtMS5taW4gKiBudW0yLm1pbixcbiAgICAgIG51bTEubWluICogbnVtMi5tYXgsXG4gICAgICBudW0xLm1heCAqIG51bTIubWluLFxuICAgICAgbnVtMS5tYXggKiBudW0yLm1heFxuICAgICk7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KFxuICAgICAgbnVtMS5taW4gKiBudW0yLm1pbixcbiAgICAgIG51bTEubWluICogbnVtMi5tYXgsXG4gICAgICBudW0xLm1heCAqIG51bTIubWluLFxuICAgICAgbnVtMS5tYXggKiBudW0yLm1heFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oXCIqXCIsIG51bTEsIG51bTIsIG1pbiwgbWF4KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkU3ViT3BlcmF0aW9uKG51bTEsIG51bTIpIHtcbiAgICBpZiAobnVtMi50eXBlID09PSBcImxpdGVyYWxcIikge1xuICAgICAgLy8gb3B0aW1pemF0aW9uOiBzZWNvbmQgb3BlcmFuZHMgaXMgYSBsaXRlcmFsLi4uXG4gICAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bTE7IC8vIC4uLiBhbmQgaXQncyAwXG4gICAgICB9IGVsc2UgaWYgKG51bTEudHlwZSA9PT0gXCJsaXRlcmFsXCIpIHtcbiAgICAgICAgLy8gLi4uIGFuZCBmaXJzdCBvcGVyYW5kcyBpcyBhIGxpdGVyYWwgdG9vXG4gICAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciAtIG51bTIubnVtYmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgbnVtMi50eXBlID09PSBcImJpbmFyeVwiICYmXG4gICAgICBudW0yLm9wID09PSBcIi1cIiAmJlxuICAgICAgbnVtMS50eXBlID09PSBcImxpdGVyYWxcIiAmJlxuICAgICAgbnVtMS5udW1iZXIgPT09IDEgJiZcbiAgICAgIG51bTIuYXJnMS50eXBlID09PSBcImxpdGVyYWxcIiAmJlxuICAgICAgbnVtMi5hcmcxLm51bWJlciA9PT0gMVxuICAgICkge1xuICAgICAgLy8gb3B0aW1pemF0aW9uIGZvciBjYXNlOiAxIC0gKDEgLSB4KVxuICAgICAgcmV0dXJuIG51bTIuYXJnMjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oXG4gICAgICBcIi1cIixcbiAgICAgIG51bTEsXG4gICAgICBudW0yLFxuICAgICAgbnVtMS5taW4gLSBudW0yLm1heCxcbiAgICAgIG51bTEubWF4IC0gbnVtMi5taW5cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRNaW5PcGVyYXRpb24obnVtMSwgbWF4KSB7XG4gICAgaWYgKG51bTEubWluID49IG1heCkge1xuICAgICAgLy8gb3B0aW1pemF0aW9uOiBudW0xIG1pbiB2YWx1ZSBpcyBub3QgbGVzcyB0aGFuIHJlcXVpcmVkIG1heFxuICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG1heCk7IC8vIGp1c3QgcmV0dXJuaW5nIG1heFxuICAgIH0gZWxzZSBpZiAobnVtMS5tYXggPD0gbWF4KSB7XG4gICAgICAvLyBvcHRpbWl6YXRpb246IG51bTEgbWF4IHZhbHVlIGlzIG5vdCBncmVhdGVyIHRoYW4gcmVxdWlyZWQgbWF4XG4gICAgICByZXR1cm4gbnVtMTsgLy8ganVzdCByZXR1cm5pbmcgYW4gYXJndW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBc3RNaW4obnVtMSwgbWF4KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyKCkge31cbiAgUG9zdFNjcmlwdENvbXBpbGVyLnByb3RvdHlwZSA9IHtcbiAgICBjb21waWxlOiBmdW5jdGlvbiBQb3N0U2NyaXB0Q29tcGlsZXJfY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKSB7XG4gICAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICAgIHZhciBpbnN0cnVjdGlvbnMgPSBbXTtcbiAgICAgIHZhciBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoID4+IDEsXG4gICAgICAgIG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggPj4gMTtcbiAgICAgIHZhciBsYXN0UmVnaXN0ZXIgPSAwO1xuICAgICAgdmFyIG4sIGo7XG4gICAgICB2YXIgbnVtMSwgbnVtMiwgYXN0MSwgYXN0MiwgdG1wVmFyLCBpdGVtO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNpemU7IGkrKykge1xuICAgICAgICBzdGFjay5wdXNoKG5ldyBBc3RBcmd1bWVudChpLCBkb21haW5baSAqIDJdLCBkb21haW5baSAqIDIgKyAxXSkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb2RlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaXRlbSA9IGNvZGVbaV07XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHN0YWNrLnB1c2gobmV3IEFzdExpdGVyYWwoaXRlbSkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChpdGVtKSB7XG4gICAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkQWRkT3BlcmF0aW9uKG51bTEsIG51bTIpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjdnJcIjpcbiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm11bFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTXVsT3BlcmF0aW9uKG51bTEsIG51bTIpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJzdWJcIjpcbiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChidWlsZFN1Yk9wZXJhdGlvbihudW0xLCBudW0yKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZXhjaFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3QxID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhc3QyID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEsIGFzdDIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInBvcFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJpbmRleFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAobnVtMS50eXBlICE9PSBcImxpdGVyYWxcIikge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG4gPSBudW0xLm51bWJlcjtcbiAgICAgICAgICAgIGlmIChuIDwgMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCBzdGFjay5sZW5ndGggPCBuKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXN0MSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXTtcbiAgICAgICAgICAgIGlmIChhc3QxLnR5cGUgPT09IFwibGl0ZXJhbFwiIHx8IGFzdDEudHlwZSA9PT0gXCJ2YXJcIikge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTtcbiAgICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXSA9IHRtcFZhcjtcbiAgICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZHVwXCI6XG4gICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdHlwZW9mIGNvZGVbaSArIDFdID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICAgIGNvZGVbaSArIDJdID09PSBcImd0XCIgJiZcbiAgICAgICAgICAgICAgY29kZVtpICsgM10gPT09IGkgKyA3ICYmXG4gICAgICAgICAgICAgIGNvZGVbaSArIDRdID09PSBcImp6XCIgJiZcbiAgICAgICAgICAgICAgY29kZVtpICsgNV0gPT09IFwicG9wXCIgJiZcbiAgICAgICAgICAgICAgY29kZVtpICsgNl0gPT09IGNvZGVbaSArIDFdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIG9mIHRoZSBjb21tYW5kcyBzZXF1ZW5jZSBmb3IgdGhlIG1pbiBvcGVyYXRpb25cbiAgICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIGNvZGVbaSArIDFdKSk7XG4gICAgICAgICAgICAgIGkgKz0gNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3QxID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAoYXN0MS50eXBlID09PSBcImxpdGVyYWxcIiB8fCBhc3QxLnR5cGUgPT09IFwidmFyXCIpIHtcbiAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSB0byBzYXZlIGludG8gaW50ZXJtZWRpYXRlIHZhcmlhYmxlIGEgbGl0ZXJhbCBvclxuICAgICAgICAgICAgICAvLyB2YXJpYWJsZS5cbiAgICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7XG4gICAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9IHRtcFZhcjtcbiAgICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwicm9sbFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAobnVtMi50eXBlICE9PSBcImxpdGVyYWxcIiB8fCBudW0xLnR5cGUgIT09IFwibGl0ZXJhbFwiKSB7XG4gICAgICAgICAgICAgIC8vIGJvdGggcm9sbCBvcGVyYW5kcyBtdXN0IGJlIG51bWJlcnNcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqID0gbnVtMi5udW1iZXI7XG4gICAgICAgICAgICBuID0gbnVtMS5udW1iZXI7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG4gPD0gMCB8fFxuICAgICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fFxuICAgICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihqKSB8fFxuICAgICAgICAgICAgICBzdGFjay5sZW5ndGggPCBuXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gLi4uIGFuZCBpbnRlZ2Vyc1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGogPSAoKGogJSBuKSArIG4pICUgbjtcbiAgICAgICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrOyAvLyBqdXN0IHNraXBwaW5nIC0tIHRoZXJlIGFyZSBub3RoaW5nIHRvIHJvdGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoXG4gICAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgICBzdGFjay5zcGxpY2Uoc3RhY2subGVuZ3RoIC0gbiwgbiAtIGopXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyB1bnN1cHBvcnRlZCBvcGVyYXRvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFjay5sZW5ndGggIT09IG91dHB1dFNpemUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGluc3RydWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnN0cnVjdGlvbikge1xuICAgICAgICB2YXIgc3RhdGVtZW50QnVpbGRlciA9IG5ldyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24udmlzaXQoc3RhdGVtZW50QnVpbGRlcik7XG4gICAgICAgIHJlc3VsdC5wdXNoKHN0YXRlbWVudEJ1aWxkZXIudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICAgIHN0YWNrLmZvckVhY2goZnVuY3Rpb24gKGV4cHIsIGkpIHtcbiAgICAgICAgdmFyIHN0YXRlbWVudEJ1aWxkZXIgPSBuZXcgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yKCk7XG4gICAgICAgIGV4cHIudmlzaXQoc3RhdGVtZW50QnVpbGRlcik7XG4gICAgICAgIHZhciBtaW4gPSByYW5nZVtpICogMl0sXG4gICAgICAgICAgbWF4ID0gcmFuZ2VbaSAqIDIgKyAxXTtcbiAgICAgICAgdmFyIG91dCA9IFtzdGF0ZW1lbnRCdWlsZGVyLnRvU3RyaW5nKCldO1xuICAgICAgICBpZiAobWluID4gZXhwci5taW4pIHtcbiAgICAgICAgICBvdXQudW5zaGlmdChcIk1hdGgubWF4KFwiLCBtaW4sIFwiLCBcIik7XG4gICAgICAgICAgb3V0LnB1c2goXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggPCBleHByLm1heCkge1xuICAgICAgICAgIG91dC51bnNoaWZ0KFwiTWF0aC5taW4oXCIsIG1heCwgXCIsIFwiKTtcbiAgICAgICAgICBvdXQucHVzaChcIilcIik7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LnVuc2hpZnQoXCJkZXN0W2Rlc3RPZmZzZXQgKyBcIiwgaSwgXCJdID0gXCIpO1xuICAgICAgICBvdXQucHVzaChcIjtcIik7XG4gICAgICAgIHJlc3VsdC5wdXNoKG91dC5qb2luKFwiXCIpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXFxuXCIpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIFBvc3RTY3JpcHRDb21waWxlcjtcbn0pKCk7XG5cbmV4cG9ydCB7XG4gIGlzUERGRnVuY3Rpb24sXG4gIFBERkZ1bmN0aW9uRmFjdG9yeSxcbiAgUG9zdFNjcmlwdEV2YWx1YXRvcixcbiAgUG9zdFNjcmlwdENvbXBpbGVyLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgRm9ybWF0RXJyb3IsIHNoYWRvdyB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgRU9GIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgaXNXaGl0ZVNwYWNlIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuXG5jbGFzcyBQb3N0U2NyaXB0UGFyc2VyIHtcbiAgY29uc3RydWN0b3IobGV4ZXIpIHtcbiAgICB0aGlzLmxleGVyID0gbGV4ZXI7XG4gICAgdGhpcy5vcGVyYXRvcnMgPSBbXTtcbiAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICB9XG5cbiAgbmV4dFRva2VuKCkge1xuICAgIHRoaXMucHJldiA9IHRoaXMudG9rZW47XG4gICAgdGhpcy50b2tlbiA9IHRoaXMubGV4ZXIuZ2V0VG9rZW4oKTtcbiAgfVxuXG4gIGFjY2VwdCh0eXBlKSB7XG4gICAgaWYgKHRoaXMudG9rZW4udHlwZSA9PT0gdHlwZSkge1xuICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBleHBlY3QodHlwZSkge1xuICAgIGlmICh0aGlzLmFjY2VwdCh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgIGBVbmV4cGVjdGVkIHN5bWJvbDogZm91bmQgJHt0aGlzLnRva2VuLnR5cGV9IGV4cGVjdGVkICR7dHlwZX0uYFxuICAgICk7XG4gIH1cblxuICBwYXJzZSgpIHtcbiAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgIHRoaXMuZXhwZWN0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSk7XG4gICAgdGhpcy5wYXJzZUJsb2NrKCk7XG4gICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnM7XG4gIH1cblxuICBwYXJzZUJsb2NrKCkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuTlVNQkVSKSkge1xuICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk9QRVJBVE9SKSkge1xuICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSkpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNvbmRpdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlQ29uZGl0aW9uKCkge1xuICAgIC8vIEFkZCB0d28gcGxhY2UgaG9sZGVycyB0aGF0IHdpbGwgYmUgdXBkYXRlZCBsYXRlclxuICAgIGNvbnN0IGNvbmRpdGlvbkxvY2F0aW9uID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoO1xuICAgIHRoaXMub3BlcmF0b3JzLnB1c2gobnVsbCwgbnVsbCk7XG5cbiAgICB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpO1xuICAgIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRikpIHtcbiAgICAgIC8vIFRoZSB0cnVlIGJsb2NrIGlzIHJpZ2h0IGFmdGVyIHRoZSAnaWYnIHNvIGl0IGp1c3QgZmFsbHMgdGhyb3VnaCBvbiB0cnVlXG4gICAgICAvLyBlbHNlIGl0IGp1bXBzIGFuZCBza2lwcyB0aGUgdHJ1ZSBibG9jay5cbiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDtcbiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSBcImp6XCI7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7XG4gICAgICBjb25zdCBqdW1wTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7XG4gICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsIG51bGwpO1xuICAgICAgY29uc3QgZW5kT2ZUcnVlID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoO1xuICAgICAgdGhpcy5wYXJzZUJsb2NrKCk7XG4gICAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpO1xuICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFKTtcbiAgICAgIC8vIFRoZSBqdW1wIGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHRydWUgYmxvY2sgdG8gc2tpcCB0aGUgZmFsc2UgYmxvY2suXG4gICAgICB0aGlzLm9wZXJhdG9yc1tqdW1wTG9jYXRpb25dID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoO1xuICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uICsgMV0gPSBcImpcIjtcblxuICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb25dID0gZW5kT2ZUcnVlO1xuICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb24gKyAxXSA9IFwianpcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiUFMgRnVuY3Rpb246IGVycm9yIHBhcnNpbmcgY29uZGl0aW9uYWwuXCIpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBQb3N0U2NyaXB0VG9rZW5UeXBlcyA9IHtcbiAgTEJSQUNFOiAwLFxuICBSQlJBQ0U6IDEsXG4gIE5VTUJFUjogMixcbiAgT1BFUkFUT1I6IDMsXG4gIElGOiA0LFxuICBJRkVMU0U6IDUsXG59O1xuXG5jb25zdCBQb3N0U2NyaXB0VG9rZW4gPSAoZnVuY3Rpb24gUG9zdFNjcmlwdFRva2VuQ2xvc3VyZSgpIHtcbiAgY29uc3Qgb3BDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBjbGFzcyBQb3N0U2NyaXB0VG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRPcGVyYXRvcihvcCkge1xuICAgICAgY29uc3Qgb3BWYWx1ZSA9IG9wQ2FjaGVbb3BdO1xuICAgICAgaWYgKG9wVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG9wQ2FjaGVbb3BdID0gbmV3IFBvc3RTY3JpcHRUb2tlbihcbiAgICAgICAgUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IsXG4gICAgICAgIG9wXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IExCUkFDRSgpIHtcbiAgICAgIHJldHVybiBzaGFkb3coXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiTEJSQUNFXCIsXG4gICAgICAgIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFLCBcIntcIilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBSQlJBQ0UoKSB7XG4gICAgICByZXR1cm4gc2hhZG93KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlJCUkFDRVwiLFxuICAgICAgICBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLlJCUkFDRSwgXCJ9XCIpXG4gICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgSUYoKSB7XG4gICAgICByZXR1cm4gc2hhZG93KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIklGXCIsXG4gICAgICAgIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuSUYsIFwiSUZcIilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBJRkVMU0UoKSB7XG4gICAgICByZXR1cm4gc2hhZG93KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIklGRUxTRVwiLFxuICAgICAgICBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLklGRUxTRSwgXCJJRkVMU0VcIilcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBQb3N0U2NyaXB0VG9rZW47XG59KSgpO1xuXG5jbGFzcyBQb3N0U2NyaXB0TGV4ZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLm5leHRDaGFyKCk7XG5cbiAgICB0aGlzLnN0ckJ1ZiA9IFtdO1xuICB9XG5cbiAgbmV4dENoYXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKTtcbiAgfVxuXG4gIGdldFRva2VuKCkge1xuICAgIGxldCBjb21tZW50ID0gZmFsc2U7XG4gICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjtcblxuICAgIC8vIHNraXAgY29tbWVudHNcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGNoIDwgMCkge1xuICAgICAgICByZXR1cm4gRU9GO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHtcbiAgICAgICAgICBjb21tZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IC8qICclJyA9ICovIDB4MjUpIHtcbiAgICAgICAgY29tbWVudCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgfVxuICAgIHN3aXRjaCAoY2ggfCAwKSB7XG4gICAgICBjYXNlIDB4MzA6IC8vICcwJ1xuICAgICAgY2FzZSAweDMxOiAvLyAnMSdcbiAgICAgIGNhc2UgMHgzMjogLy8gJzInXG4gICAgICBjYXNlIDB4MzM6IC8vICczJ1xuICAgICAgY2FzZSAweDM0OiAvLyAnNCdcbiAgICAgIGNhc2UgMHgzNTogLy8gJzUnXG4gICAgICBjYXNlIDB4MzY6IC8vICc2J1xuICAgICAgY2FzZSAweDM3OiAvLyAnNydcbiAgICAgIGNhc2UgMHgzODogLy8gJzgnXG4gICAgICBjYXNlIDB4Mzk6IC8vICc5J1xuICAgICAgY2FzZSAweDJiOiAvLyAnKydcbiAgICAgIGNhc2UgMHgyZDogLy8gJy0nXG4gICAgICBjYXNlIDB4MmU6IC8vICcuJ1xuICAgICAgICByZXR1cm4gbmV3IFBvc3RTY3JpcHRUb2tlbihcbiAgICAgICAgICBQb3N0U2NyaXB0VG9rZW5UeXBlcy5OVU1CRVIsXG4gICAgICAgICAgdGhpcy5nZXROdW1iZXIoKVxuICAgICAgICApO1xuICAgICAgY2FzZSAweDdiOiAvLyAneydcbiAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTtcbiAgICAgIGNhc2UgMHg3ZDogLy8gJ30nXG4gICAgICAgIHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5SQlJBQ0U7XG4gICAgfVxuICAgIC8vIG9wZXJhdG9yXG4gICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7XG4gICAgc3RyQnVmLmxlbmd0aCA9IDA7XG4gICAgc3RyQnVmWzBdID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG5cbiAgICB3aGlsZSAoXG4gICAgICAoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiZcbiAgICAgICgoY2ggPj0gLyogJ0EnID0gKi8gMHg0MSAmJiBjaCA8PSAvKiAnWicgPSAqLyAweDVhKSB8fFxuICAgICAgICAoY2ggPj0gLyogJ2EnID0gKi8gMHg2MSAmJiBjaCA8PSAvKiAneicgPSAqLyAweDdhKSlcbiAgICApIHtcbiAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyID0gc3RyQnVmLmpvaW4oXCJcIik7XG4gICAgc3dpdGNoIChzdHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImlmXCI6XG4gICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7XG4gICAgICBjYXNlIFwiaWZlbHNlXCI6XG4gICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUZFTFNFO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5nZXRPcGVyYXRvcihzdHIpO1xuICAgIH1cbiAgfVxuXG4gIGdldE51bWJlcigpIHtcbiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyO1xuICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmO1xuICAgIHN0ckJ1Zi5sZW5ndGggPSAwO1xuICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuXG4gICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkge1xuICAgICAgaWYgKFxuICAgICAgICAoY2ggPj0gLyogJzAnID0gKi8gMHgzMCAmJiBjaCA8PSAvKiAnOScgPSAqLyAweDM5KSB8fFxuICAgICAgICBjaCA9PT0gLyogJy0nID0gKi8gMHgyZCB8fFxuICAgICAgICBjaCA9PT0gLyogJy4nID0gKi8gMHgyZVxuICAgICAgKSB7XG4gICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3RyQnVmLmpvaW4oXCJcIikpO1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXI6ICR7dmFsdWV9YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgeyBQb3N0U2NyaXB0TGV4ZXIsIFBvc3RTY3JpcHRQYXJzZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbi8vIENoYXJhY3RlciB0eXBlcyBmb3Igc3ltYm9scyBmcm9tIDAwMDAgdG8gMDBGRi5cbi8vIFNvdXJjZTogZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1VuaWNvZGVEYXRhLnR4dFxuLy8gcHJldHRpZXItaWdub3JlXG52YXIgYmFzZVR5cGVzID0gW1xuICBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIlNcIiwgXCJCXCIsIFwiU1wiLFxuICBcIldTXCIsIFwiQlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsXG4gIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCXCIsIFwiQlwiLCBcIkJcIiwgXCJTXCIsIFwiV1NcIiwgXCJPTlwiLCBcIk9OXCIsIFwiRVRcIixcbiAgXCJFVFwiLCBcIkVUXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIkVTXCIsIFwiQ1NcIiwgXCJFU1wiLCBcIkNTXCIsIFwiQ1NcIixcbiAgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkNTXCIsIFwiT05cIixcbiAgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIixcbiAgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLFxuICBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJMXCIsIFwiTFwiLCBcIkxcIixcbiAgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLFxuICBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsXG4gIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIixcbiAgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIixcbiAgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJDU1wiLCBcIk9OXCIsIFwiRVRcIixcbiAgXCJFVFwiLCBcIkVUXCIsIFwiRVRcIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIkxcIiwgXCJPTlwiLCBcIk9OXCIsIFwiQk5cIiwgXCJPTlwiLFxuICBcIk9OXCIsIFwiRVRcIiwgXCJFVFwiLCBcIkVOXCIsIFwiRU5cIiwgXCJPTlwiLCBcIkxcIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJFTlwiLCBcIkxcIixcbiAgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIixcbiAgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLFxuICBcIkxcIiwgXCJPTlwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLFxuICBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsXG4gIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJPTlwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCJcbl07XG5cbi8vIENoYXJhY3RlciB0eXBlcyBmb3Igc3ltYm9scyBmcm9tIDA2MDAgdG8gMDZGRi5cbi8vIFNvdXJjZTogZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1VuaWNvZGVEYXRhLnR4dFxuLy8gTm90ZSB0aGF0IDA2MUQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIFVuaWNvZGUgc3RhbmRhcmQgKHNlZVxuLy8gaHR0cDovL3VuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTA2MDAucGRmKSwgc28gd2UgcmVwbGFjZSBpdCB3aXRoIGFuXG4vLyBlbXB0eSBzdHJpbmcgYW5kIGlzc3VlIGEgd2FybmluZyBpZiB3ZSBlbmNvdW50ZXIgdGhpcyBjaGFyYWN0ZXIuIFRoZVxuLy8gZW1wdHkgc3RyaW5nIGlzIHJlcXVpcmVkIHRvIHByb3Blcmx5IGluZGV4IHRoZSBpdGVtcyBhZnRlciBpdC5cbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGFyYWJpY1R5cGVzID0gW1xuICBcIkFOXCIsIFwiQU5cIiwgXCJBTlwiLCBcIkFOXCIsIFwiQU5cIiwgXCJBTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJBTFwiLCBcIkVUXCIsIFwiRVRcIiwgXCJBTFwiLFxuICBcIkNTXCIsIFwiQUxcIiwgXCJPTlwiLCBcIk9OXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsXG4gIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiQUxcIiwgXCJBTFwiLCBcIlwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIixcbiAgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIixcbiAgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIixcbiAgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIixcbiAgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLFxuICBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLFxuICBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIkFOXCIsIFwiQU5cIiwgXCJBTlwiLCBcIkFOXCIsIFwiQU5cIiwgXCJBTlwiLCBcIkFOXCIsXG4gIFwiQU5cIiwgXCJBTlwiLCBcIkFOXCIsIFwiRVRcIiwgXCJBTlwiLCBcIkFOXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiTlNNXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIkFOXCIsXG4gIFwiT05cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJBTFwiLCBcIkFMXCIsIFwiTlNNXCIsIFwiTlNNXCIsXG4gIFwiT05cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJBTFwiLCBcIkFMXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIixcbiAgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIlxuXTtcblxuZnVuY3Rpb24gaXNPZGQoaSkge1xuICByZXR1cm4gKGkgJiAxKSAhPT0gMDtcbn1cblxuZnVuY3Rpb24gaXNFdmVuKGkpIHtcbiAgcmV0dXJuIChpICYgMSkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRVbmVxdWFsKGFyciwgc3RhcnQsIHZhbHVlKSB7XG4gIGZvciAodmFyIGogPSBzdGFydCwgamogPSBhcnIubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgIGlmIChhcnJbal0gIT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gajtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGo7XG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlcyhhcnIsIHN0YXJ0LCBlbmQsIHZhbHVlKSB7XG4gIGZvciAodmFyIGogPSBzdGFydDsgaiA8IGVuZDsgKytqKSB7XG4gICAgYXJyW2pdID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVZhbHVlcyhhcnIsIHN0YXJ0LCBlbmQpIHtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gMTsgaSA8IGo7ICsraSwgLS1qKSB7XG4gICAgdmFyIHRlbXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRlbXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUiwgdmVydGljYWwgPSBmYWxzZSkge1xuICBsZXQgZGlyID0gXCJsdHJcIjtcbiAgaWYgKHZlcnRpY2FsKSB7XG4gICAgZGlyID0gXCJ0dGJcIjtcbiAgfSBlbHNlIGlmICghaXNMVFIpIHtcbiAgICBkaXIgPSBcInJ0bFwiO1xuICB9XG4gIHJldHVybiB7IHN0ciwgZGlyIH07XG59XG5cbi8vIFRoZXNlIGFyZSB1c2VkIGluIGJpZGkoKSwgd2hpY2ggaXMgY2FsbGVkIGZyZXF1ZW50bHkuIFdlIHJlLXVzZSB0aGVtIG9uXG4vLyBlYWNoIGNhbGwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYWxsb2NhdGlvbnMuXG52YXIgY2hhcnMgPSBbXTtcbnZhciB0eXBlcyA9IFtdO1xuXG5mdW5jdGlvbiBiaWRpKHN0ciwgc3RhcnRMZXZlbCwgdmVydGljYWwpIHtcbiAgdmFyIGlzTFRSID0gdHJ1ZTtcbiAgdmFyIHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIGlmIChzdHJMZW5ndGggPT09IDAgfHwgdmVydGljYWwpIHtcbiAgICByZXR1cm4gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUiwgdmVydGljYWwpO1xuICB9XG5cbiAgLy8gR2V0IHR5cGVzIGFuZCBmaWxsIGFycmF5c1xuICBjaGFycy5sZW5ndGggPSBzdHJMZW5ndGg7XG4gIHR5cGVzLmxlbmd0aCA9IHN0ckxlbmd0aDtcbiAgdmFyIG51bUJpZGkgPSAwO1xuXG4gIHZhciBpLCBpaTtcbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgY2hhcnNbaV0gPSBzdHIuY2hhckF0KGkpO1xuXG4gICAgdmFyIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgdmFyIGNoYXJUeXBlID0gXCJMXCI7XG4gICAgaWYgKGNoYXJDb2RlIDw9IDB4MDBmZikge1xuICAgICAgY2hhclR5cGUgPSBiYXNlVHlwZXNbY2hhckNvZGVdO1xuICAgIH0gZWxzZSBpZiAoMHgwNTkwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDVmNCkge1xuICAgICAgY2hhclR5cGUgPSBcIlJcIjtcbiAgICB9IGVsc2UgaWYgKDB4MDYwMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDA2ZmYpIHtcbiAgICAgIGNoYXJUeXBlID0gYXJhYmljVHlwZXNbY2hhckNvZGUgJiAweGZmXTtcbiAgICAgIGlmICghY2hhclR5cGUpIHtcbiAgICAgICAgd2FybihcIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgXCIgKyBjaGFyQ29kZS50b1N0cmluZygxNikpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoMHgwNzAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDhhYykge1xuICAgICAgY2hhclR5cGUgPSBcIkFMXCI7XG4gICAgfVxuICAgIGlmIChjaGFyVHlwZSA9PT0gXCJSXCIgfHwgY2hhclR5cGUgPT09IFwiQUxcIiB8fCBjaGFyVHlwZSA9PT0gXCJBTlwiKSB7XG4gICAgICBudW1CaWRpKys7XG4gICAgfVxuICAgIHR5cGVzW2ldID0gY2hhclR5cGU7XG4gIH1cblxuICAvLyBEZXRlY3QgdGhlIGJpZGkgbWV0aG9kXG4gIC8vIC0gSWYgdGhlcmUgYXJlIG5vIHJ0bCBjaGFyYWN0ZXJzIHRoZW4gbm8gYmlkaSBuZWVkZWRcbiAgLy8gLSBJZiBsZXNzIHRoYW4gMzAlIGNoYXJzIGFyZSBydGwgdGhlbiBzdHJpbmcgaXMgcHJpbWFyaWx5IGx0clxuICAvLyAtIElmIG1vcmUgdGhhbiAzMCUgY2hhcnMgYXJlIHJ0bCB0aGVuIHN0cmluZyBpcyBwcmltYXJpbHkgcnRsXG4gIGlmIChudW1CaWRpID09PSAwKSB7XG4gICAgaXNMVFIgPSB0cnVlO1xuICAgIHJldHVybiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSKTtcbiAgfVxuXG4gIGlmIChzdGFydExldmVsID09PSAtMSkge1xuICAgIGlmIChudW1CaWRpIC8gc3RyTGVuZ3RoIDwgMC4zKSB7XG4gICAgICBpc0xUUiA9IHRydWU7XG4gICAgICBzdGFydExldmVsID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNMVFIgPSBmYWxzZTtcbiAgICAgIHN0YXJ0TGV2ZWwgPSAxO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsZXZlbHMgPSBbXTtcbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgbGV2ZWxzW2ldID0gc3RhcnRMZXZlbDtcbiAgfVxuXG4gIC8qXG4gICBYMS1YMTA6IHNraXAgbW9zdCBvZiB0aGlzLCBzaW5jZSB3ZSBhcmUgTk9UIGRvaW5nIHRoZSBlbWJlZGRpbmdzLlxuICAgKi9cbiAgdmFyIGUgPSBpc09kZChzdGFydExldmVsKSA/IFwiUlwiIDogXCJMXCI7XG4gIHZhciBzb3IgPSBlO1xuICB2YXIgZW9yID0gc29yO1xuXG4gIC8qXG4gICBXMS4gRXhhbWluZSBlYWNoIG5vbi1zcGFjaW5nIG1hcmsgKE5TTSkgaW4gdGhlIGxldmVsIHJ1biwgYW5kIGNoYW5nZSB0aGVcbiAgIHR5cGUgb2YgdGhlIE5TTSB0byB0aGUgdHlwZSBvZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZVxuICAgc3RhcnQgb2YgdGhlIGxldmVsIHJ1biwgaXQgd2lsbCBnZXQgdGhlIHR5cGUgb2Ygc29yLlxuICAgKi9cbiAgdmFyIGxhc3RUeXBlID0gc29yO1xuICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodHlwZXNbaV0gPT09IFwiTlNNXCIpIHtcbiAgICAgIHR5cGVzW2ldID0gbGFzdFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RUeXBlID0gdHlwZXNbaV07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlciB1bnRpbCB0aGVcbiAgIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBBTCwgb3Igc29yKSBpcyBmb3VuZC4gIElmIGFuIEFMIGlzIGZvdW5kLCBjaGFuZ2VcbiAgIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljIG51bWJlci5cbiAgICovXG4gIGxhc3RUeXBlID0gc29yO1xuICB2YXIgdDtcbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgdCA9IHR5cGVzW2ldO1xuICAgIGlmICh0ID09PSBcIkVOXCIpIHtcbiAgICAgIHR5cGVzW2ldID0gbGFzdFR5cGUgPT09IFwiQUxcIiA/IFwiQU5cIiA6IFwiRU5cIjtcbiAgICB9IGVsc2UgaWYgKHQgPT09IFwiUlwiIHx8IHQgPT09IFwiTFwiIHx8IHQgPT09IFwiQUxcIikge1xuICAgICAgbGFzdFR5cGUgPSB0O1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBXMy4gQ2hhbmdlIGFsbCBBTHMgdG8gUi5cbiAgICovXG4gIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkge1xuICAgIHQgPSB0eXBlc1tpXTtcbiAgICBpZiAodCA9PT0gXCJBTFwiKSB7XG4gICAgICB0eXBlc1tpXSA9IFwiUlwiO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBXNC4gQSBzaW5nbGUgRXVyb3BlYW4gc2VwYXJhdG9yIGJldHdlZW4gdHdvIEV1cm9wZWFuIG51bWJlcnMgY2hhbmdlcyB0byBhXG4gICBFdXJvcGVhbiBudW1iZXIuIEEgc2luZ2xlIGNvbW1vbiBzZXBhcmF0b3IgYmV0d2VlbiB0d28gbnVtYmVycyBvZiB0aGUgc2FtZVxuICAgdHlwZSBjaGFuZ2VzIHRvIHRoYXQgdHlwZTpcbiAgICovXG4gIGZvciAoaSA9IDE7IGkgPCBzdHJMZW5ndGggLSAxOyArK2kpIHtcbiAgICBpZiAodHlwZXNbaV0gPT09IFwiRVNcIiAmJiB0eXBlc1tpIC0gMV0gPT09IFwiRU5cIiAmJiB0eXBlc1tpICsgMV0gPT09IFwiRU5cIikge1xuICAgICAgdHlwZXNbaV0gPSBcIkVOXCI7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVzW2ldID09PSBcIkNTXCIgJiZcbiAgICAgICh0eXBlc1tpIC0gMV0gPT09IFwiRU5cIiB8fCB0eXBlc1tpIC0gMV0gPT09IFwiQU5cIikgJiZcbiAgICAgIHR5cGVzW2kgKyAxXSA9PT0gdHlwZXNbaSAtIDFdXG4gICAgKSB7XG4gICAgICB0eXBlc1tpXSA9IHR5cGVzW2kgLSAxXTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgVzUuIEEgc2VxdWVuY2Ugb2YgRXVyb3BlYW4gdGVybWluYXRvcnMgYWRqYWNlbnQgdG8gRXVyb3BlYW4gbnVtYmVycyBjaGFuZ2VzXG4gICB0byBhbGwgRXVyb3BlYW4gbnVtYmVyczpcbiAgICovXG4gIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkge1xuICAgIGlmICh0eXBlc1tpXSA9PT0gXCJFTlwiKSB7XG4gICAgICAvLyBkbyBiZWZvcmVcbiAgICAgIHZhciBqO1xuICAgICAgZm9yIChqID0gaSAtIDE7IGogPj0gMDsgLS1qKSB7XG4gICAgICAgIGlmICh0eXBlc1tqXSAhPT0gXCJFVFwiKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdHlwZXNbal0gPSBcIkVOXCI7XG4gICAgICB9XG4gICAgICAvLyBkbyBhZnRlclxuICAgICAgZm9yIChqID0gaSArIDE7IGogPCBzdHJMZW5ndGg7ICsraikge1xuICAgICAgICBpZiAodHlwZXNbal0gIT09IFwiRVRcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHR5cGVzW2pdID0gXCJFTlwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXIgTmV1dHJhbDpcbiAgICovXG4gIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkge1xuICAgIHQgPSB0eXBlc1tpXTtcbiAgICBpZiAodCA9PT0gXCJXU1wiIHx8IHQgPT09IFwiRVNcIiB8fCB0ID09PSBcIkVUXCIgfHwgdCA9PT0gXCJDU1wiKSB7XG4gICAgICB0eXBlc1tpXSA9IFwiT05cIjtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgVzcuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyIHVudGlsIHRoZVxuICAgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuIEwgaXMgZm91bmQsICB0aGVuIGNoYW5nZVxuICAgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBMLlxuICAgKi9cbiAgbGFzdFR5cGUgPSBzb3I7XG4gIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkge1xuICAgIHQgPSB0eXBlc1tpXTtcbiAgICBpZiAodCA9PT0gXCJFTlwiKSB7XG4gICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlID09PSBcIkxcIiA/IFwiTFwiIDogXCJFTlwiO1xuICAgIH0gZWxzZSBpZiAodCA9PT0gXCJSXCIgfHwgdCA9PT0gXCJMXCIpIHtcbiAgICAgIGxhc3RUeXBlID0gdDtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgTjEuIEEgc2VxdWVuY2Ugb2YgbmV1dHJhbHMgdGFrZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3Vycm91bmRpbmcgc3Ryb25nXG4gICB0ZXh0IGlmIHRoZSB0ZXh0IG9uIGJvdGggc2lkZXMgaGFzIHRoZSBzYW1lIGRpcmVjdGlvbi4gRXVyb3BlYW4gYW5kIEFyYWJpY1xuICAgbnVtYmVycyBhcmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIFIuIFN0YXJ0LW9mLWxldmVsLXJ1biAoc29yKSBhbmRcbiAgIGVuZC1vZi1sZXZlbC1ydW4gKGVvcikgYXJlIHVzZWQgYXQgbGV2ZWwgcnVuIGJvdW5kYXJpZXMuXG4gICAqL1xuICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodHlwZXNbaV0gPT09IFwiT05cIikge1xuICAgICAgdmFyIGVuZCA9IGZpbmRVbmVxdWFsKHR5cGVzLCBpICsgMSwgXCJPTlwiKTtcbiAgICAgIHZhciBiZWZvcmUgPSBzb3I7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgYmVmb3JlID0gdHlwZXNbaSAtIDFdO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWZ0ZXIgPSBlb3I7XG4gICAgICBpZiAoZW5kICsgMSA8IHN0ckxlbmd0aCkge1xuICAgICAgICBhZnRlciA9IHR5cGVzW2VuZCArIDFdO1xuICAgICAgfVxuICAgICAgaWYgKGJlZm9yZSAhPT0gXCJMXCIpIHtcbiAgICAgICAgYmVmb3JlID0gXCJSXCI7XG4gICAgICB9XG4gICAgICBpZiAoYWZ0ZXIgIT09IFwiTFwiKSB7XG4gICAgICAgIGFmdGVyID0gXCJSXCI7XG4gICAgICB9XG4gICAgICBpZiAoYmVmb3JlID09PSBhZnRlcikge1xuICAgICAgICBzZXRWYWx1ZXModHlwZXMsIGksIGVuZCwgYmVmb3JlKTtcbiAgICAgIH1cbiAgICAgIGkgPSBlbmQgLSAxOyAvLyByZXNldCB0byBlbmQgKC0xIHNvIG5leHQgaXRlcmF0aW9uIGlzIG9rKVxuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBOMi4gQW55IHJlbWFpbmluZyBuZXV0cmFscyB0YWtlIHRoZSBlbWJlZGRpbmcgZGlyZWN0aW9uLlxuICAgKi9cbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHR5cGVzW2ldID09PSBcIk9OXCIpIHtcbiAgICAgIHR5cGVzW2ldID0gZTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgSTEuIEZvciBhbGwgY2hhcmFjdGVycyB3aXRoIGFuIGV2ZW4gKGxlZnQtdG8tcmlnaHQpIGVtYmVkZGluZyBkaXJlY3Rpb24sXG4gICB0aG9zZSBvZiB0eXBlIFIgZ28gdXAgb25lIGxldmVsIGFuZCB0aG9zZSBvZiB0eXBlIEFOIG9yIEVOIGdvIHVwIHR3b1xuICAgbGV2ZWxzLlxuICAgSTIuIEZvciBhbGwgY2hhcmFjdGVycyB3aXRoIGFuIG9kZCAocmlnaHQtdG8tbGVmdCkgZW1iZWRkaW5nIGRpcmVjdGlvbixcbiAgIHRob3NlIG9mIHR5cGUgTCwgRU4gb3IgQU4gZ28gdXAgb25lIGxldmVsLlxuICAgKi9cbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgdCA9IHR5cGVzW2ldO1xuICAgIGlmIChpc0V2ZW4obGV2ZWxzW2ldKSkge1xuICAgICAgaWYgKHQgPT09IFwiUlwiKSB7XG4gICAgICAgIGxldmVsc1tpXSArPSAxO1xuICAgICAgfSBlbHNlIGlmICh0ID09PSBcIkFOXCIgfHwgdCA9PT0gXCJFTlwiKSB7XG4gICAgICAgIGxldmVsc1tpXSArPSAyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpc09kZFxuICAgICAgaWYgKHQgPT09IFwiTFwiIHx8IHQgPT09IFwiQU5cIiB8fCB0ID09PSBcIkVOXCIpIHtcbiAgICAgICAgbGV2ZWxzW2ldICs9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIEwxLiBPbiBlYWNoIGxpbmUsIHJlc2V0IHRoZSBlbWJlZGRpbmcgbGV2ZWwgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIHRvXG4gICB0aGUgcGFyYWdyYXBoIGVtYmVkZGluZyBsZXZlbDpcblxuICAgc2VnbWVudCBzZXBhcmF0b3JzLFxuICAgcGFyYWdyYXBoIHNlcGFyYXRvcnMsXG4gICBhbnkgc2VxdWVuY2Ugb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyBhIHNlZ21lbnQgc2VwYXJhdG9yIG9yXG4gICBwYXJhZ3JhcGggc2VwYXJhdG9yLCBhbmQgYW55IHNlcXVlbmNlIG9mIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgYXQgdGhlIGVuZFxuICAgb2YgdGhlIGxpbmUuXG4gICAqL1xuXG4gIC8vIGRvbid0IGJvdGhlciBhcyB0ZXh0IGlzIG9ubHkgc2luZ2xlIGxpbmVcblxuICAvKlxuICAgTDIuIEZyb20gdGhlIGhpZ2hlc3QgbGV2ZWwgZm91bmQgaW4gdGhlIHRleHQgdG8gdGhlIGxvd2VzdCBvZGQgbGV2ZWwgb25cbiAgIGVhY2ggbGluZSwgcmV2ZXJzZSBhbnkgY29udGlndW91cyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGF0IHRoYXRcbiAgIGxldmVsIG9yIGhpZ2hlci5cbiAgICovXG5cbiAgLy8gZmluZCBoaWdoZXN0IGxldmVsICYgbG93ZXN0IG9kZCBsZXZlbFxuICB2YXIgaGlnaGVzdExldmVsID0gLTE7XG4gIHZhciBsb3dlc3RPZGRMZXZlbCA9IDk5O1xuICB2YXIgbGV2ZWw7XG4gIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICBsZXZlbCA9IGxldmVsc1tpXTtcbiAgICBpZiAoaGlnaGVzdExldmVsIDwgbGV2ZWwpIHtcbiAgICAgIGhpZ2hlc3RMZXZlbCA9IGxldmVsO1xuICAgIH1cbiAgICBpZiAobG93ZXN0T2RkTGV2ZWwgPiBsZXZlbCAmJiBpc09kZChsZXZlbCkpIHtcbiAgICAgIGxvd2VzdE9kZExldmVsID0gbGV2ZWw7XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJldmVyc2UgYmV0d2VlbiB0aG9zZSBsaW1pdHNcbiAgZm9yIChsZXZlbCA9IGhpZ2hlc3RMZXZlbDsgbGV2ZWwgPj0gbG93ZXN0T2RkTGV2ZWw7IC0tbGV2ZWwpIHtcbiAgICAvLyBmaW5kIHNlZ21lbnRzIHRvIHJldmVyc2VcbiAgICB2YXIgc3RhcnQgPSAtMTtcbiAgICBmb3IgKGkgPSAwLCBpaSA9IGxldmVscy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICBpZiAobGV2ZWxzW2ldIDwgbGV2ZWwpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICByZXZlcnNlVmFsdWVzKGNoYXJzLCBzdGFydCwgaSk7XG4gICAgICAgICAgc3RhcnQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgcmV2ZXJzZVZhbHVlcyhjaGFycywgc3RhcnQsIGxldmVscy5sZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBMMy4gQ29tYmluaW5nIG1hcmtzIGFwcGxpZWQgdG8gYSByaWdodC10by1sZWZ0IGJhc2UgY2hhcmFjdGVyIHdpbGwgYXQgdGhpc1xuICAgcG9pbnQgcHJlY2VkZSB0aGVpciBiYXNlIGNoYXJhY3Rlci4gSWYgdGhlIHJlbmRlcmluZyBlbmdpbmUgZXhwZWN0cyB0aGVtIHRvXG4gICBmb2xsb3cgdGhlIGJhc2UgY2hhcmFjdGVycyBpbiB0aGUgZmluYWwgZGlzcGxheSBwcm9jZXNzLCB0aGVuIHRoZSBvcmRlcmluZ1xuICAgb2YgdGhlIG1hcmtzIGFuZCB0aGUgYmFzZSBjaGFyYWN0ZXIgbXVzdCBiZSByZXZlcnNlZC5cbiAgICovXG5cbiAgLy8gZG9uJ3QgYm90aGVyIGZvciBub3dcblxuICAvKlxuICAgTDQuIEEgY2hhcmFjdGVyIHRoYXQgcG9zc2Vzc2VzIHRoZSBtaXJyb3JlZCBwcm9wZXJ0eSBhcyBzcGVjaWZpZWQgYnlcbiAgIFNlY3Rpb24gNC43LCBNaXJyb3JlZCwgbXVzdCBiZSBkZXBpY3RlZCBieSBhIG1pcnJvcmVkIGdseXBoIGlmIHRoZSByZXNvbHZlZFxuICAgZGlyZWN0aW9uYWxpdHkgb2YgdGhhdCBjaGFyYWN0ZXIgaXMgUi5cbiAgICovXG5cbiAgLy8gZG9uJ3QgbWlycm9yIGFzIGNoYXJhY3RlcnMgYXJlIGFscmVhZHkgbWlycm9yZWQgaW4gdGhlIHBkZlxuXG4gIC8vIEZpbmFsbHksIHJldHVybiBzdHJpbmdcbiAgZm9yIChpID0gMCwgaWkgPSBjaGFycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgdmFyIGNoID0gY2hhcnNbaV07XG4gICAgaWYgKGNoID09PSBcIjxcIiB8fCBjaCA9PT0gXCI+XCIpIHtcbiAgICAgIGNoYXJzW2ldID0gXCJcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KGNoYXJzLmpvaW4oXCJcIiksIGlzTFRSKTtcbn1cblxuZXhwb3J0IHsgYmlkaSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldExvb2t1cFRhYmxlRmFjdG9yeSB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuLy8gVGhlIE1ldHJpY3Mgb2JqZWN0IGNvbnRhaW5zIGdseXBoIHdpZHRocyAoaW4gZ2x5cGggc3BhY2UgdW5pdHMpLlxuLy8gQXMgcGVyIFBERiBzcGVjLCBmb3IgbW9zdCBmb250cyAoVHlwZSAzIGJlaW5nIGFuIGV4Y2VwdGlvbikgYSBnbHlwaFxuLy8gc3BhY2UgdW5pdCBjb3JyZXNwb25kcyB0byAxLzEwMDB0aCBvZiB0ZXh0IHNwYWNlIHVuaXQuXG52YXIgZ2V0TWV0cmljcyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0LkNvdXJpZXIgPSA2MDA7XG4gIHRbXCJDb3VyaWVyLUJvbGRcIl0gPSA2MDA7XG4gIHRbXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCJdID0gNjAwO1xuICB0W1wiQ291cmllci1PYmxpcXVlXCJdID0gNjAwO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHQuSGVsdmV0aWNhID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgdC5zcGFjZSA9IDI3ODtcbiAgICB0LmV4Y2xhbSA9IDI3ODtcbiAgICB0LnF1b3RlZGJsID0gMzU1O1xuICAgIHQubnVtYmVyc2lnbiA9IDU1NjtcbiAgICB0LmRvbGxhciA9IDU1NjtcbiAgICB0LnBlcmNlbnQgPSA4ODk7XG4gICAgdC5hbXBlcnNhbmQgPSA2Njc7XG4gICAgdC5xdW90ZXJpZ2h0ID0gMjIyO1xuICAgIHQucGFyZW5sZWZ0ID0gMzMzO1xuICAgIHQucGFyZW5yaWdodCA9IDMzMztcbiAgICB0LmFzdGVyaXNrID0gMzg5O1xuICAgIHQucGx1cyA9IDU4NDtcbiAgICB0LmNvbW1hID0gMjc4O1xuICAgIHQuaHlwaGVuID0gMzMzO1xuICAgIHQucGVyaW9kID0gMjc4O1xuICAgIHQuc2xhc2ggPSAyNzg7XG4gICAgdC56ZXJvID0gNTU2O1xuICAgIHQub25lID0gNTU2O1xuICAgIHQudHdvID0gNTU2O1xuICAgIHQudGhyZWUgPSA1NTY7XG4gICAgdC5mb3VyID0gNTU2O1xuICAgIHQuZml2ZSA9IDU1NjtcbiAgICB0LnNpeCA9IDU1NjtcbiAgICB0LnNldmVuID0gNTU2O1xuICAgIHQuZWlnaHQgPSA1NTY7XG4gICAgdC5uaW5lID0gNTU2O1xuICAgIHQuY29sb24gPSAyNzg7XG4gICAgdC5zZW1pY29sb24gPSAyNzg7XG4gICAgdC5sZXNzID0gNTg0O1xuICAgIHQuZXF1YWwgPSA1ODQ7XG4gICAgdC5ncmVhdGVyID0gNTg0O1xuICAgIHQucXVlc3Rpb24gPSA1NTY7XG4gICAgdC5hdCA9IDEwMTU7XG4gICAgdC5BID0gNjY3O1xuICAgIHQuQiA9IDY2NztcbiAgICB0LkMgPSA3MjI7XG4gICAgdC5EID0gNzIyO1xuICAgIHQuRSA9IDY2NztcbiAgICB0LkYgPSA2MTE7XG4gICAgdC5HID0gNzc4O1xuICAgIHQuSCA9IDcyMjtcbiAgICB0LkkgPSAyNzg7XG4gICAgdC5KID0gNTAwO1xuICAgIHQuSyA9IDY2NztcbiAgICB0LkwgPSA1NTY7XG4gICAgdC5NID0gODMzO1xuICAgIHQuTiA9IDcyMjtcbiAgICB0Lk8gPSA3Nzg7XG4gICAgdC5QID0gNjY3O1xuICAgIHQuUSA9IDc3ODtcbiAgICB0LlIgPSA3MjI7XG4gICAgdC5TID0gNjY3O1xuICAgIHQuVCA9IDYxMTtcbiAgICB0LlUgPSA3MjI7XG4gICAgdC5WID0gNjY3O1xuICAgIHQuVyA9IDk0NDtcbiAgICB0LlggPSA2Njc7XG4gICAgdC5ZID0gNjY3O1xuICAgIHQuWiA9IDYxMTtcbiAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4O1xuICAgIHQuYmFja3NsYXNoID0gMjc4O1xuICAgIHQuYnJhY2tldHJpZ2h0ID0gMjc4O1xuICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7XG4gICAgdC51bmRlcnNjb3JlID0gNTU2O1xuICAgIHQucXVvdGVsZWZ0ID0gMjIyO1xuICAgIHQuYSA9IDU1NjtcbiAgICB0LmIgPSA1NTY7XG4gICAgdC5jID0gNTAwO1xuICAgIHQuZCA9IDU1NjtcbiAgICB0LmUgPSA1NTY7XG4gICAgdC5mID0gMjc4O1xuICAgIHQuZyA9IDU1NjtcbiAgICB0LmggPSA1NTY7XG4gICAgdC5pID0gMjIyO1xuICAgIHQuaiA9IDIyMjtcbiAgICB0LmsgPSA1MDA7XG4gICAgdC5sID0gMjIyO1xuICAgIHQubSA9IDgzMztcbiAgICB0Lm4gPSA1NTY7XG4gICAgdC5vID0gNTU2O1xuICAgIHQucCA9IDU1NjtcbiAgICB0LnEgPSA1NTY7XG4gICAgdC5yID0gMzMzO1xuICAgIHQucyA9IDUwMDtcbiAgICB0LnQgPSAyNzg7XG4gICAgdC51ID0gNTU2O1xuICAgIHQudiA9IDUwMDtcbiAgICB0LncgPSA3MjI7XG4gICAgdC54ID0gNTAwO1xuICAgIHQueSA9IDUwMDtcbiAgICB0LnogPSA1MDA7XG4gICAgdC5icmFjZWxlZnQgPSAzMzQ7XG4gICAgdC5iYXIgPSAyNjA7XG4gICAgdC5icmFjZXJpZ2h0ID0gMzM0O1xuICAgIHQuYXNjaWl0aWxkZSA9IDU4NDtcbiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7XG4gICAgdC5jZW50ID0gNTU2O1xuICAgIHQuc3RlcmxpbmcgPSA1NTY7XG4gICAgdC5mcmFjdGlvbiA9IDE2NztcbiAgICB0LnllbiA9IDU1NjtcbiAgICB0LmZsb3JpbiA9IDU1NjtcbiAgICB0LnNlY3Rpb24gPSA1NTY7XG4gICAgdC5jdXJyZW5jeSA9IDU1NjtcbiAgICB0LnF1b3Rlc2luZ2xlID0gMTkxO1xuICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzO1xuICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjtcbiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7XG4gICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMztcbiAgICB0LmZpID0gNTAwO1xuICAgIHQuZmwgPSA1MDA7XG4gICAgdC5lbmRhc2ggPSA1NTY7XG4gICAgdC5kYWdnZXIgPSA1NTY7XG4gICAgdC5kYWdnZXJkYmwgPSA1NTY7XG4gICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODtcbiAgICB0LnBhcmFncmFwaCA9IDUzNztcbiAgICB0LmJ1bGxldCA9IDM1MDtcbiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyO1xuICAgIHQucXVvdGVkYmxiYXNlID0gMzMzO1xuICAgIHQucXVvdGVkYmxyaWdodCA9IDMzMztcbiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2O1xuICAgIHQuZWxsaXBzaXMgPSAxMDAwO1xuICAgIHQucGVydGhvdXNhbmQgPSAxMDAwO1xuICAgIHQucXVlc3Rpb25kb3duID0gNjExO1xuICAgIHQuZ3JhdmUgPSAzMzM7XG4gICAgdC5hY3V0ZSA9IDMzMztcbiAgICB0LmNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC50aWxkZSA9IDMzMztcbiAgICB0Lm1hY3JvbiA9IDMzMztcbiAgICB0LmJyZXZlID0gMzMzO1xuICAgIHQuZG90YWNjZW50ID0gMzMzO1xuICAgIHQuZGllcmVzaXMgPSAzMzM7XG4gICAgdC5yaW5nID0gMzMzO1xuICAgIHQuY2VkaWxsYSA9IDMzMztcbiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMztcbiAgICB0Lm9nb25layA9IDMzMztcbiAgICB0LmNhcm9uID0gMzMzO1xuICAgIHQuZW1kYXNoID0gMTAwMDtcbiAgICB0LkFFID0gMTAwMDtcbiAgICB0Lm9yZGZlbWluaW5lID0gMzcwO1xuICAgIHQuTHNsYXNoID0gNTU2O1xuICAgIHQuT3NsYXNoID0gNzc4O1xuICAgIHQuT0UgPSAxMDAwO1xuICAgIHQub3JkbWFzY3VsaW5lID0gMzY1O1xuICAgIHQuYWUgPSA4ODk7XG4gICAgdC5kb3RsZXNzaSA9IDI3ODtcbiAgICB0LmxzbGFzaCA9IDIyMjtcbiAgICB0Lm9zbGFzaCA9IDYxMTtcbiAgICB0Lm9lID0gOTQ0O1xuICAgIHQuZ2VybWFuZGJscyA9IDYxMTtcbiAgICB0LklkaWVyZXNpcyA9IDI3ODtcbiAgICB0LmVhY3V0ZSA9IDU1NjtcbiAgICB0LmFicmV2ZSA9IDU1NjtcbiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7XG4gICAgdC5lY2Fyb24gPSA1NTY7XG4gICAgdC5ZZGllcmVzaXMgPSA2Njc7XG4gICAgdC5kaXZpZGUgPSA1ODQ7XG4gICAgdC5ZYWN1dGUgPSA2Njc7XG4gICAgdC5BY2lyY3VtZmxleCA9IDY2NztcbiAgICB0LmFhY3V0ZSA9IDU1NjtcbiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQueWFjdXRlID0gNTAwO1xuICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwO1xuICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5VcmluZyA9IDcyMjtcbiAgICB0LlVkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmFvZ29uZWsgPSA1NTY7XG4gICAgdC5VYWN1dGUgPSA3MjI7XG4gICAgdC51b2dvbmVrID0gNTU2O1xuICAgIHQuRWRpZXJlc2lzID0gNjY3O1xuICAgIHQuRGNyb2F0ID0gNzIyO1xuICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7XG4gICAgdC5jb3B5cmlnaHQgPSA3Mzc7XG4gICAgdC5FbWFjcm9uID0gNjY3O1xuICAgIHQuY2Nhcm9uID0gNTAwO1xuICAgIHQuYXJpbmcgPSA1NTY7XG4gICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5sYWN1dGUgPSAyMjI7XG4gICAgdC5hZ3JhdmUgPSA1NTY7XG4gICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5DYWN1dGUgPSA3MjI7XG4gICAgdC5hdGlsZGUgPSA1NTY7XG4gICAgdC5FZG90YWNjZW50ID0gNjY3O1xuICAgIHQuc2Nhcm9uID0gNTAwO1xuICAgIHQuc2NlZGlsbGEgPSA1MDA7XG4gICAgdC5pYWN1dGUgPSAyNzg7XG4gICAgdC5sb3plbmdlID0gNDcxO1xuICAgIHQuUmNhcm9uID0gNzIyO1xuICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4O1xuICAgIHQudWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5hY2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LkFtYWNyb24gPSA2Njc7XG4gICAgdC5yY2Fyb24gPSAzMzM7XG4gICAgdC5jY2VkaWxsYSA9IDUwMDtcbiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7XG4gICAgdC5UaG9ybiA9IDY2NztcbiAgICB0Lk9tYWNyb24gPSA3Nzg7XG4gICAgdC5SYWN1dGUgPSA3MjI7XG4gICAgdC5TYWN1dGUgPSA2Njc7XG4gICAgdC5kY2Fyb24gPSA2NDM7XG4gICAgdC5VbWFjcm9uID0gNzIyO1xuICAgIHQudXJpbmcgPSA1NTY7XG4gICAgdC50aHJlZXN1cGVyaW9yID0gMzMzO1xuICAgIHQuT2dyYXZlID0gNzc4O1xuICAgIHQuQWdyYXZlID0gNjY3O1xuICAgIHQuQWJyZXZlID0gNjY3O1xuICAgIHQubXVsdGlwbHkgPSA1ODQ7XG4gICAgdC51YWN1dGUgPSA1NTY7XG4gICAgdC5UY2Fyb24gPSA2MTE7XG4gICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjtcbiAgICB0LnlkaWVyZXNpcyA9IDUwMDtcbiAgICB0Lk5hY3V0ZSA9IDcyMjtcbiAgICB0LmljaXJjdW1mbGV4ID0gMjc4O1xuICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7XG4gICAgdC5hZGllcmVzaXMgPSA1NTY7XG4gICAgdC5lZGllcmVzaXMgPSA1NTY7XG4gICAgdC5jYWN1dGUgPSA1MDA7XG4gICAgdC5uYWN1dGUgPSA1NTY7XG4gICAgdC51bWFjcm9uID0gNTU2O1xuICAgIHQuTmNhcm9uID0gNzIyO1xuICAgIHQuSWFjdXRlID0gMjc4O1xuICAgIHQucGx1c21pbnVzID0gNTg0O1xuICAgIHQuYnJva2VuYmFyID0gMjYwO1xuICAgIHQucmVnaXN0ZXJlZCA9IDczNztcbiAgICB0LkdicmV2ZSA9IDc3ODtcbiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7XG4gICAgdC5zdW1tYXRpb24gPSA2MDA7XG4gICAgdC5FZ3JhdmUgPSA2Njc7XG4gICAgdC5yYWN1dGUgPSAzMzM7XG4gICAgdC5vbWFjcm9uID0gNTU2O1xuICAgIHQuWmFjdXRlID0gNjExO1xuICAgIHQuWmNhcm9uID0gNjExO1xuICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5O1xuICAgIHQuRXRoID0gNzIyO1xuICAgIHQuQ2NlZGlsbGEgPSA3MjI7XG4gICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7XG4gICAgdC50Y2Fyb24gPSAzMTc7XG4gICAgdC5lb2dvbmVrID0gNTU2O1xuICAgIHQuVW9nb25layA9IDcyMjtcbiAgICB0LkFhY3V0ZSA9IDY2NztcbiAgICB0LkFkaWVyZXNpcyA9IDY2NztcbiAgICB0LmVncmF2ZSA9IDU1NjtcbiAgICB0LnphY3V0ZSA9IDUwMDtcbiAgICB0LmlvZ29uZWsgPSAyMjI7XG4gICAgdC5PYWN1dGUgPSA3Nzg7XG4gICAgdC5vYWN1dGUgPSA1NTY7XG4gICAgdC5hbWFjcm9uID0gNTU2O1xuICAgIHQuc2FjdXRlID0gNTAwO1xuICAgIHQuaWRpZXJlc2lzID0gMjc4O1xuICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7XG4gICAgdC5VZ3JhdmUgPSA3MjI7XG4gICAgdC5EZWx0YSA9IDYxMjtcbiAgICB0LnRob3JuID0gNTU2O1xuICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7XG4gICAgdC5PZGllcmVzaXMgPSA3Nzg7XG4gICAgdC5tdSA9IDU1NjtcbiAgICB0LmlncmF2ZSA9IDI3ODtcbiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1NTY7XG4gICAgdC5Fb2dvbmVrID0gNjY3O1xuICAgIHQuZGNyb2F0ID0gNTU2O1xuICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDtcbiAgICB0LlNjZWRpbGxhID0gNjY3O1xuICAgIHQubGNhcm9uID0gMjk5O1xuICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQuTGFjdXRlID0gNTU2O1xuICAgIHQudHJhZGVtYXJrID0gMTAwMDtcbiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7XG4gICAgdC5JZ3JhdmUgPSAyNzg7XG4gICAgdC5JbWFjcm9uID0gMjc4O1xuICAgIHQuTGNhcm9uID0gNTU2O1xuICAgIHQub25laGFsZiA9IDgzNDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNTU2O1xuICAgIHQubnRpbGRlID0gNTU2O1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDY2NztcbiAgICB0LmVtYWNyb24gPSA1NTY7XG4gICAgdC5nYnJldmUgPSA1NTY7XG4gICAgdC5vbmVxdWFydGVyID0gODM0O1xuICAgIHQuU2Nhcm9uID0gNjY3O1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDU1NjtcbiAgICB0LkNjYXJvbiA9IDcyMjtcbiAgICB0LnVncmF2ZSA9IDU1NjtcbiAgICB0LnJhZGljYWwgPSA0NTM7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7XG4gICAgdC5OdGlsZGUgPSA3MjI7XG4gICAgdC5vdGlsZGUgPSA1NTY7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5BdGlsZGUgPSA2Njc7XG4gICAgdC5Bb2dvbmVrID0gNjY3O1xuICAgIHQuQXJpbmcgPSA2Njc7XG4gICAgdC5PdGlsZGUgPSA3Nzg7XG4gICAgdC56ZG90YWNjZW50ID0gNTAwO1xuICAgIHQuRWNhcm9uID0gNjY3O1xuICAgIHQuSW9nb25layA9IDI3ODtcbiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDtcbiAgICB0Lm1pbnVzID0gNTg0O1xuICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7XG4gICAgdC5uY2Fyb24gPSA1NTY7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC5sb2dpY2Fsbm90ID0gNTg0O1xuICAgIHQub2RpZXJlc2lzID0gNTU2O1xuICAgIHQudWRpZXJlc2lzID0gNTU2O1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5ldGggPSA1NTY7XG4gICAgdC56Y2Fyb24gPSA1MDA7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMzMztcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTU2O1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0W1wiSGVsdmV0aWNhLUJvbGRcIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHtcbiAgICB0LnNwYWNlID0gMjc4O1xuICAgIHQuZXhjbGFtID0gMzMzO1xuICAgIHQucXVvdGVkYmwgPSA0NzQ7XG4gICAgdC5udW1iZXJzaWduID0gNTU2O1xuICAgIHQuZG9sbGFyID0gNTU2O1xuICAgIHQucGVyY2VudCA9IDg4OTtcbiAgICB0LmFtcGVyc2FuZCA9IDcyMjtcbiAgICB0LnF1b3RlcmlnaHQgPSAyNzg7XG4gICAgdC5wYXJlbmxlZnQgPSAzMzM7XG4gICAgdC5wYXJlbnJpZ2h0ID0gMzMzO1xuICAgIHQuYXN0ZXJpc2sgPSAzODk7XG4gICAgdC5wbHVzID0gNTg0O1xuICAgIHQuY29tbWEgPSAyNzg7XG4gICAgdC5oeXBoZW4gPSAzMzM7XG4gICAgdC5wZXJpb2QgPSAyNzg7XG4gICAgdC5zbGFzaCA9IDI3ODtcbiAgICB0Lnplcm8gPSA1NTY7XG4gICAgdC5vbmUgPSA1NTY7XG4gICAgdC50d28gPSA1NTY7XG4gICAgdC50aHJlZSA9IDU1NjtcbiAgICB0LmZvdXIgPSA1NTY7XG4gICAgdC5maXZlID0gNTU2O1xuICAgIHQuc2l4ID0gNTU2O1xuICAgIHQuc2V2ZW4gPSA1NTY7XG4gICAgdC5laWdodCA9IDU1NjtcbiAgICB0Lm5pbmUgPSA1NTY7XG4gICAgdC5jb2xvbiA9IDMzMztcbiAgICB0LnNlbWljb2xvbiA9IDMzMztcbiAgICB0Lmxlc3MgPSA1ODQ7XG4gICAgdC5lcXVhbCA9IDU4NDtcbiAgICB0LmdyZWF0ZXIgPSA1ODQ7XG4gICAgdC5xdWVzdGlvbiA9IDYxMTtcbiAgICB0LmF0ID0gOTc1O1xuICAgIHQuQSA9IDcyMjtcbiAgICB0LkIgPSA3MjI7XG4gICAgdC5DID0gNzIyO1xuICAgIHQuRCA9IDcyMjtcbiAgICB0LkUgPSA2Njc7XG4gICAgdC5GID0gNjExO1xuICAgIHQuRyA9IDc3ODtcbiAgICB0LkggPSA3MjI7XG4gICAgdC5JID0gMjc4O1xuICAgIHQuSiA9IDU1NjtcbiAgICB0LksgPSA3MjI7XG4gICAgdC5MID0gNjExO1xuICAgIHQuTSA9IDgzMztcbiAgICB0Lk4gPSA3MjI7XG4gICAgdC5PID0gNzc4O1xuICAgIHQuUCA9IDY2NztcbiAgICB0LlEgPSA3Nzg7XG4gICAgdC5SID0gNzIyO1xuICAgIHQuUyA9IDY2NztcbiAgICB0LlQgPSA2MTE7XG4gICAgdC5VID0gNzIyO1xuICAgIHQuViA9IDY2NztcbiAgICB0LlcgPSA5NDQ7XG4gICAgdC5YID0gNjY3O1xuICAgIHQuWSA9IDY2NztcbiAgICB0LlogPSA2MTE7XG4gICAgdC5icmFja2V0bGVmdCA9IDMzMztcbiAgICB0LmJhY2tzbGFzaCA9IDI3ODtcbiAgICB0LmJyYWNrZXRyaWdodCA9IDMzMztcbiAgICB0LmFzY2lpY2lyY3VtID0gNTg0O1xuICAgIHQudW5kZXJzY29yZSA9IDU1NjtcbiAgICB0LnF1b3RlbGVmdCA9IDI3ODtcbiAgICB0LmEgPSA1NTY7XG4gICAgdC5iID0gNjExO1xuICAgIHQuYyA9IDU1NjtcbiAgICB0LmQgPSA2MTE7XG4gICAgdC5lID0gNTU2O1xuICAgIHQuZiA9IDMzMztcbiAgICB0LmcgPSA2MTE7XG4gICAgdC5oID0gNjExO1xuICAgIHQuaSA9IDI3ODtcbiAgICB0LmogPSAyNzg7XG4gICAgdC5rID0gNTU2O1xuICAgIHQubCA9IDI3ODtcbiAgICB0Lm0gPSA4ODk7XG4gICAgdC5uID0gNjExO1xuICAgIHQubyA9IDYxMTtcbiAgICB0LnAgPSA2MTE7XG4gICAgdC5xID0gNjExO1xuICAgIHQuciA9IDM4OTtcbiAgICB0LnMgPSA1NTY7XG4gICAgdC50ID0gMzMzO1xuICAgIHQudSA9IDYxMTtcbiAgICB0LnYgPSA1NTY7XG4gICAgdC53ID0gNzc4O1xuICAgIHQueCA9IDU1NjtcbiAgICB0LnkgPSA1NTY7XG4gICAgdC56ID0gNTAwO1xuICAgIHQuYnJhY2VsZWZ0ID0gMzg5O1xuICAgIHQuYmFyID0gMjgwO1xuICAgIHQuYnJhY2VyaWdodCA9IDM4OTtcbiAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7XG4gICAgdC5leGNsYW1kb3duID0gMzMzO1xuICAgIHQuY2VudCA9IDU1NjtcbiAgICB0LnN0ZXJsaW5nID0gNTU2O1xuICAgIHQuZnJhY3Rpb24gPSAxNjc7XG4gICAgdC55ZW4gPSA1NTY7XG4gICAgdC5mbG9yaW4gPSA1NTY7XG4gICAgdC5zZWN0aW9uID0gNTU2O1xuICAgIHQuY3VycmVuY3kgPSA1NTY7XG4gICAgdC5xdW90ZXNpbmdsZSA9IDIzODtcbiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDtcbiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7XG4gICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzO1xuICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7XG4gICAgdC5maSA9IDYxMTtcbiAgICB0LmZsID0gNjExO1xuICAgIHQuZW5kYXNoID0gNTU2O1xuICAgIHQuZGFnZ2VyID0gNTU2O1xuICAgIHQuZGFnZ2VyZGJsID0gNTU2O1xuICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7XG4gICAgdC5wYXJhZ3JhcGggPSA1NTY7XG4gICAgdC5idWxsZXQgPSAzNTA7XG4gICAgdC5xdW90ZXNpbmdsYmFzZSA9IDI3ODtcbiAgICB0LnF1b3RlZGJsYmFzZSA9IDUwMDtcbiAgICB0LnF1b3RlZGJscmlnaHQgPSA1MDA7XG4gICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjtcbiAgICB0LmVsbGlwc2lzID0gMTAwMDtcbiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDtcbiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTtcbiAgICB0LmdyYXZlID0gMzMzO1xuICAgIHQuYWN1dGUgPSAzMzM7XG4gICAgdC5jaXJjdW1mbGV4ID0gMzMzO1xuICAgIHQudGlsZGUgPSAzMzM7XG4gICAgdC5tYWNyb24gPSAzMzM7XG4gICAgdC5icmV2ZSA9IDMzMztcbiAgICB0LmRvdGFjY2VudCA9IDMzMztcbiAgICB0LmRpZXJlc2lzID0gMzMzO1xuICAgIHQucmluZyA9IDMzMztcbiAgICB0LmNlZGlsbGEgPSAzMzM7XG4gICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7XG4gICAgdC5vZ29uZWsgPSAzMzM7XG4gICAgdC5jYXJvbiA9IDMzMztcbiAgICB0LmVtZGFzaCA9IDEwMDA7XG4gICAgdC5BRSA9IDEwMDA7XG4gICAgdC5vcmRmZW1pbmluZSA9IDM3MDtcbiAgICB0LkxzbGFzaCA9IDYxMTtcbiAgICB0Lk9zbGFzaCA9IDc3ODtcbiAgICB0Lk9FID0gMTAwMDtcbiAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTtcbiAgICB0LmFlID0gODg5O1xuICAgIHQuZG90bGVzc2kgPSAyNzg7XG4gICAgdC5sc2xhc2ggPSAyNzg7XG4gICAgdC5vc2xhc2ggPSA2MTE7XG4gICAgdC5vZSA9IDk0NDtcbiAgICB0Lmdlcm1hbmRibHMgPSA2MTE7XG4gICAgdC5JZGllcmVzaXMgPSAyNzg7XG4gICAgdC5lYWN1dGUgPSA1NTY7XG4gICAgdC5hYnJldmUgPSA1NTY7XG4gICAgdC51aHVuZ2FydW1sYXV0ID0gNjExO1xuICAgIHQuZWNhcm9uID0gNTU2O1xuICAgIHQuWWRpZXJlc2lzID0gNjY3O1xuICAgIHQuZGl2aWRlID0gNTg0O1xuICAgIHQuWWFjdXRlID0gNjY3O1xuICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7XG4gICAgdC5hYWN1dGUgPSA1NTY7XG4gICAgdC5VY2lyY3VtZmxleCA9IDcyMjtcbiAgICB0LnlhY3V0ZSA9IDU1NjtcbiAgICB0LnNjb21tYWFjY2VudCA9IDU1NjtcbiAgICB0LmVjaXJjdW1mbGV4ID0gNTU2O1xuICAgIHQuVXJpbmcgPSA3MjI7XG4gICAgdC5VZGllcmVzaXMgPSA3MjI7XG4gICAgdC5hb2dvbmVrID0gNTU2O1xuICAgIHQuVWFjdXRlID0gNzIyO1xuICAgIHQudW9nb25layA9IDYxMTtcbiAgICB0LkVkaWVyZXNpcyA9IDY2NztcbiAgICB0LkRjcm9hdCA9IDcyMjtcbiAgICB0LmNvbW1hYWNjZW50ID0gMjUwO1xuICAgIHQuY29weXJpZ2h0ID0gNzM3O1xuICAgIHQuRW1hY3JvbiA9IDY2NztcbiAgICB0LmNjYXJvbiA9IDU1NjtcbiAgICB0LmFyaW5nID0gNTU2O1xuICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQubGFjdXRlID0gMjc4O1xuICAgIHQuYWdyYXZlID0gNTU2O1xuICAgIHQuVGNvbW1hYWNjZW50ID0gNjExO1xuICAgIHQuQ2FjdXRlID0gNzIyO1xuICAgIHQuYXRpbGRlID0gNTU2O1xuICAgIHQuRWRvdGFjY2VudCA9IDY2NztcbiAgICB0LnNjYXJvbiA9IDU1NjtcbiAgICB0LnNjZWRpbGxhID0gNTU2O1xuICAgIHQuaWFjdXRlID0gMjc4O1xuICAgIHQubG96ZW5nZSA9IDQ5NDtcbiAgICB0LlJjYXJvbiA9IDcyMjtcbiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODtcbiAgICB0LnVjaXJjdW1mbGV4ID0gNjExO1xuICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5BbWFjcm9uID0gNzIyO1xuICAgIHQucmNhcm9uID0gMzg5O1xuICAgIHQuY2NlZGlsbGEgPSA1NTY7XG4gICAgdC5aZG90YWNjZW50ID0gNjExO1xuICAgIHQuVGhvcm4gPSA2Njc7XG4gICAgdC5PbWFjcm9uID0gNzc4O1xuICAgIHQuUmFjdXRlID0gNzIyO1xuICAgIHQuU2FjdXRlID0gNjY3O1xuICAgIHQuZGNhcm9uID0gNzQzO1xuICAgIHQuVW1hY3JvbiA9IDcyMjtcbiAgICB0LnVyaW5nID0gNjExO1xuICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMztcbiAgICB0Lk9ncmF2ZSA9IDc3ODtcbiAgICB0LkFncmF2ZSA9IDcyMjtcbiAgICB0LkFicmV2ZSA9IDcyMjtcbiAgICB0Lm11bHRpcGx5ID0gNTg0O1xuICAgIHQudWFjdXRlID0gNjExO1xuICAgIHQuVGNhcm9uID0gNjExO1xuICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7XG4gICAgdC55ZGllcmVzaXMgPSA1NTY7XG4gICAgdC5OYWN1dGUgPSA3MjI7XG4gICAgdC5pY2lyY3VtZmxleCA9IDI3ODtcbiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3O1xuICAgIHQuYWRpZXJlc2lzID0gNTU2O1xuICAgIHQuZWRpZXJlc2lzID0gNTU2O1xuICAgIHQuY2FjdXRlID0gNTU2O1xuICAgIHQubmFjdXRlID0gNjExO1xuICAgIHQudW1hY3JvbiA9IDYxMTtcbiAgICB0Lk5jYXJvbiA9IDcyMjtcbiAgICB0LklhY3V0ZSA9IDI3ODtcbiAgICB0LnBsdXNtaW51cyA9IDU4NDtcbiAgICB0LmJyb2tlbmJhciA9IDI4MDtcbiAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7XG4gICAgdC5HYnJldmUgPSA3Nzg7XG4gICAgdC5JZG90YWNjZW50ID0gMjc4O1xuICAgIHQuc3VtbWF0aW9uID0gNjAwO1xuICAgIHQuRWdyYXZlID0gNjY3O1xuICAgIHQucmFjdXRlID0gMzg5O1xuICAgIHQub21hY3JvbiA9IDYxMTtcbiAgICB0LlphY3V0ZSA9IDYxMTtcbiAgICB0LlpjYXJvbiA9IDYxMTtcbiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTtcbiAgICB0LkV0aCA9IDcyMjtcbiAgICB0LkNjZWRpbGxhID0gNzIyO1xuICAgIHQubGNvbW1hYWNjZW50ID0gMjc4O1xuICAgIHQudGNhcm9uID0gMzg5O1xuICAgIHQuZW9nb25layA9IDU1NjtcbiAgICB0LlVvZ29uZWsgPSA3MjI7XG4gICAgdC5BYWN1dGUgPSA3MjI7XG4gICAgdC5BZGllcmVzaXMgPSA3MjI7XG4gICAgdC5lZ3JhdmUgPSA1NTY7XG4gICAgdC56YWN1dGUgPSA1MDA7XG4gICAgdC5pb2dvbmVrID0gMjc4O1xuICAgIHQuT2FjdXRlID0gNzc4O1xuICAgIHQub2FjdXRlID0gNjExO1xuICAgIHQuYW1hY3JvbiA9IDU1NjtcbiAgICB0LnNhY3V0ZSA9IDU1NjtcbiAgICB0LmlkaWVyZXNpcyA9IDI3ODtcbiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4O1xuICAgIHQuVWdyYXZlID0gNzIyO1xuICAgIHQuRGVsdGEgPSA2MTI7XG4gICAgdC50aG9ybiA9IDYxMTtcbiAgICB0LnR3b3N1cGVyaW9yID0gMzMzO1xuICAgIHQuT2RpZXJlc2lzID0gNzc4O1xuICAgIHQubXUgPSA2MTE7XG4gICAgdC5pZ3JhdmUgPSAyNzg7XG4gICAgdC5vaHVuZ2FydW1sYXV0ID0gNjExO1xuICAgIHQuRW9nb25layA9IDY2NztcbiAgICB0LmRjcm9hdCA9IDYxMTtcbiAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7XG4gICAgdC5TY2VkaWxsYSA9IDY2NztcbiAgICB0LmxjYXJvbiA9IDQwMDtcbiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LkxhY3V0ZSA9IDYxMTtcbiAgICB0LnRyYWRlbWFyayA9IDEwMDA7XG4gICAgdC5lZG90YWNjZW50ID0gNTU2O1xuICAgIHQuSWdyYXZlID0gMjc4O1xuICAgIHQuSW1hY3JvbiA9IDI3ODtcbiAgICB0LkxjYXJvbiA9IDYxMTtcbiAgICB0Lm9uZWhhbGYgPSA4MzQ7XG4gICAgdC5sZXNzZXF1YWwgPSA1NDk7XG4gICAgdC5vY2lyY3VtZmxleCA9IDYxMTtcbiAgICB0Lm50aWxkZSA9IDYxMTtcbiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7XG4gICAgdC5FYWN1dGUgPSA2Njc7XG4gICAgdC5lbWFjcm9uID0gNTU2O1xuICAgIHQuZ2JyZXZlID0gNjExO1xuICAgIHQub25lcXVhcnRlciA9IDgzNDtcbiAgICB0LlNjYXJvbiA9IDY2NztcbiAgICB0LlNjb21tYWFjY2VudCA9IDY2NztcbiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7XG4gICAgdC5kZWdyZWUgPSA0MDA7XG4gICAgdC5vZ3JhdmUgPSA2MTE7XG4gICAgdC5DY2Fyb24gPSA3MjI7XG4gICAgdC51Z3JhdmUgPSA2MTE7XG4gICAgdC5yYWRpY2FsID0gNTQ5O1xuICAgIHQuRGNhcm9uID0gNzIyO1xuICAgIHQucmNvbW1hYWNjZW50ID0gMzg5O1xuICAgIHQuTnRpbGRlID0gNzIyO1xuICAgIHQub3RpbGRlID0gNjExO1xuICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQuTGNvbW1hYWNjZW50ID0gNjExO1xuICAgIHQuQXRpbGRlID0gNzIyO1xuICAgIHQuQW9nb25layA9IDcyMjtcbiAgICB0LkFyaW5nID0gNzIyO1xuICAgIHQuT3RpbGRlID0gNzc4O1xuICAgIHQuemRvdGFjY2VudCA9IDUwMDtcbiAgICB0LkVjYXJvbiA9IDY2NztcbiAgICB0LklvZ29uZWsgPSAyNzg7XG4gICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5taW51cyA9IDU4NDtcbiAgICB0LkljaXJjdW1mbGV4ID0gMjc4O1xuICAgIHQubmNhcm9uID0gNjExO1xuICAgIHQudGNvbW1hYWNjZW50ID0gMzMzO1xuICAgIHQubG9naWNhbG5vdCA9IDU4NDtcbiAgICB0Lm9kaWVyZXNpcyA9IDYxMTtcbiAgICB0LnVkaWVyZXNpcyA9IDYxMTtcbiAgICB0Lm5vdGVxdWFsID0gNTQ5O1xuICAgIHQuZ2NvbW1hYWNjZW50ID0gNjExO1xuICAgIHQuZXRoID0gNjExO1xuICAgIHQuemNhcm9uID0gNTAwO1xuICAgIHQubmNvbW1hYWNjZW50ID0gNjExO1xuICAgIHQub25lc3VwZXJpb3IgPSAzMzM7XG4gICAgdC5pbWFjcm9uID0gMjc4O1xuICAgIHQuRXVybyA9IDU1NjtcbiAgfSk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgdFtcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiXSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICAgIHQuc3BhY2UgPSAyNzg7XG4gICAgdC5leGNsYW0gPSAzMzM7XG4gICAgdC5xdW90ZWRibCA9IDQ3NDtcbiAgICB0Lm51bWJlcnNpZ24gPSA1NTY7XG4gICAgdC5kb2xsYXIgPSA1NTY7XG4gICAgdC5wZXJjZW50ID0gODg5O1xuICAgIHQuYW1wZXJzYW5kID0gNzIyO1xuICAgIHQucXVvdGVyaWdodCA9IDI3ODtcbiAgICB0LnBhcmVubGVmdCA9IDMzMztcbiAgICB0LnBhcmVucmlnaHQgPSAzMzM7XG4gICAgdC5hc3RlcmlzayA9IDM4OTtcbiAgICB0LnBsdXMgPSA1ODQ7XG4gICAgdC5jb21tYSA9IDI3ODtcbiAgICB0Lmh5cGhlbiA9IDMzMztcbiAgICB0LnBlcmlvZCA9IDI3ODtcbiAgICB0LnNsYXNoID0gMjc4O1xuICAgIHQuemVybyA9IDU1NjtcbiAgICB0Lm9uZSA9IDU1NjtcbiAgICB0LnR3byA9IDU1NjtcbiAgICB0LnRocmVlID0gNTU2O1xuICAgIHQuZm91ciA9IDU1NjtcbiAgICB0LmZpdmUgPSA1NTY7XG4gICAgdC5zaXggPSA1NTY7XG4gICAgdC5zZXZlbiA9IDU1NjtcbiAgICB0LmVpZ2h0ID0gNTU2O1xuICAgIHQubmluZSA9IDU1NjtcbiAgICB0LmNvbG9uID0gMzMzO1xuICAgIHQuc2VtaWNvbG9uID0gMzMzO1xuICAgIHQubGVzcyA9IDU4NDtcbiAgICB0LmVxdWFsID0gNTg0O1xuICAgIHQuZ3JlYXRlciA9IDU4NDtcbiAgICB0LnF1ZXN0aW9uID0gNjExO1xuICAgIHQuYXQgPSA5NzU7XG4gICAgdC5BID0gNzIyO1xuICAgIHQuQiA9IDcyMjtcbiAgICB0LkMgPSA3MjI7XG4gICAgdC5EID0gNzIyO1xuICAgIHQuRSA9IDY2NztcbiAgICB0LkYgPSA2MTE7XG4gICAgdC5HID0gNzc4O1xuICAgIHQuSCA9IDcyMjtcbiAgICB0LkkgPSAyNzg7XG4gICAgdC5KID0gNTU2O1xuICAgIHQuSyA9IDcyMjtcbiAgICB0LkwgPSA2MTE7XG4gICAgdC5NID0gODMzO1xuICAgIHQuTiA9IDcyMjtcbiAgICB0Lk8gPSA3Nzg7XG4gICAgdC5QID0gNjY3O1xuICAgIHQuUSA9IDc3ODtcbiAgICB0LlIgPSA3MjI7XG4gICAgdC5TID0gNjY3O1xuICAgIHQuVCA9IDYxMTtcbiAgICB0LlUgPSA3MjI7XG4gICAgdC5WID0gNjY3O1xuICAgIHQuVyA9IDk0NDtcbiAgICB0LlggPSA2Njc7XG4gICAgdC5ZID0gNjY3O1xuICAgIHQuWiA9IDYxMTtcbiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzO1xuICAgIHQuYmFja3NsYXNoID0gMjc4O1xuICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzO1xuICAgIHQuYXNjaWljaXJjdW0gPSA1ODQ7XG4gICAgdC51bmRlcnNjb3JlID0gNTU2O1xuICAgIHQucXVvdGVsZWZ0ID0gMjc4O1xuICAgIHQuYSA9IDU1NjtcbiAgICB0LmIgPSA2MTE7XG4gICAgdC5jID0gNTU2O1xuICAgIHQuZCA9IDYxMTtcbiAgICB0LmUgPSA1NTY7XG4gICAgdC5mID0gMzMzO1xuICAgIHQuZyA9IDYxMTtcbiAgICB0LmggPSA2MTE7XG4gICAgdC5pID0gMjc4O1xuICAgIHQuaiA9IDI3ODtcbiAgICB0LmsgPSA1NTY7XG4gICAgdC5sID0gMjc4O1xuICAgIHQubSA9IDg4OTtcbiAgICB0Lm4gPSA2MTE7XG4gICAgdC5vID0gNjExO1xuICAgIHQucCA9IDYxMTtcbiAgICB0LnEgPSA2MTE7XG4gICAgdC5yID0gMzg5O1xuICAgIHQucyA9IDU1NjtcbiAgICB0LnQgPSAzMzM7XG4gICAgdC51ID0gNjExO1xuICAgIHQudiA9IDU1NjtcbiAgICB0LncgPSA3Nzg7XG4gICAgdC54ID0gNTU2O1xuICAgIHQueSA9IDU1NjtcbiAgICB0LnogPSA1MDA7XG4gICAgdC5icmFjZWxlZnQgPSAzODk7XG4gICAgdC5iYXIgPSAyODA7XG4gICAgdC5icmFjZXJpZ2h0ID0gMzg5O1xuICAgIHQuYXNjaWl0aWxkZSA9IDU4NDtcbiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7XG4gICAgdC5jZW50ID0gNTU2O1xuICAgIHQuc3RlcmxpbmcgPSA1NTY7XG4gICAgdC5mcmFjdGlvbiA9IDE2NztcbiAgICB0LnllbiA9IDU1NjtcbiAgICB0LmZsb3JpbiA9IDU1NjtcbiAgICB0LnNlY3Rpb24gPSA1NTY7XG4gICAgdC5jdXJyZW5jeSA9IDU1NjtcbiAgICB0LnF1b3Rlc2luZ2xlID0gMjM4O1xuICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwO1xuICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjtcbiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7XG4gICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMztcbiAgICB0LmZpID0gNjExO1xuICAgIHQuZmwgPSA2MTE7XG4gICAgdC5lbmRhc2ggPSA1NTY7XG4gICAgdC5kYWdnZXIgPSA1NTY7XG4gICAgdC5kYWdnZXJkYmwgPSA1NTY7XG4gICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODtcbiAgICB0LnBhcmFncmFwaCA9IDU1NjtcbiAgICB0LmJ1bGxldCA9IDM1MDtcbiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjc4O1xuICAgIHQucXVvdGVkYmxiYXNlID0gNTAwO1xuICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDtcbiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2O1xuICAgIHQuZWxsaXBzaXMgPSAxMDAwO1xuICAgIHQucGVydGhvdXNhbmQgPSAxMDAwO1xuICAgIHQucXVlc3Rpb25kb3duID0gNjExO1xuICAgIHQuZ3JhdmUgPSAzMzM7XG4gICAgdC5hY3V0ZSA9IDMzMztcbiAgICB0LmNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC50aWxkZSA9IDMzMztcbiAgICB0Lm1hY3JvbiA9IDMzMztcbiAgICB0LmJyZXZlID0gMzMzO1xuICAgIHQuZG90YWNjZW50ID0gMzMzO1xuICAgIHQuZGllcmVzaXMgPSAzMzM7XG4gICAgdC5yaW5nID0gMzMzO1xuICAgIHQuY2VkaWxsYSA9IDMzMztcbiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMztcbiAgICB0Lm9nb25layA9IDMzMztcbiAgICB0LmNhcm9uID0gMzMzO1xuICAgIHQuZW1kYXNoID0gMTAwMDtcbiAgICB0LkFFID0gMTAwMDtcbiAgICB0Lm9yZGZlbWluaW5lID0gMzcwO1xuICAgIHQuTHNsYXNoID0gNjExO1xuICAgIHQuT3NsYXNoID0gNzc4O1xuICAgIHQuT0UgPSAxMDAwO1xuICAgIHQub3JkbWFzY3VsaW5lID0gMzY1O1xuICAgIHQuYWUgPSA4ODk7XG4gICAgdC5kb3RsZXNzaSA9IDI3ODtcbiAgICB0LmxzbGFzaCA9IDI3ODtcbiAgICB0Lm9zbGFzaCA9IDYxMTtcbiAgICB0Lm9lID0gOTQ0O1xuICAgIHQuZ2VybWFuZGJscyA9IDYxMTtcbiAgICB0LklkaWVyZXNpcyA9IDI3ODtcbiAgICB0LmVhY3V0ZSA9IDU1NjtcbiAgICB0LmFicmV2ZSA9IDU1NjtcbiAgICB0LnVodW5nYXJ1bWxhdXQgPSA2MTE7XG4gICAgdC5lY2Fyb24gPSA1NTY7XG4gICAgdC5ZZGllcmVzaXMgPSA2Njc7XG4gICAgdC5kaXZpZGUgPSA1ODQ7XG4gICAgdC5ZYWN1dGUgPSA2Njc7XG4gICAgdC5BY2lyY3VtZmxleCA9IDcyMjtcbiAgICB0LmFhY3V0ZSA9IDU1NjtcbiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQueWFjdXRlID0gNTU2O1xuICAgIHQuc2NvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5VcmluZyA9IDcyMjtcbiAgICB0LlVkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmFvZ29uZWsgPSA1NTY7XG4gICAgdC5VYWN1dGUgPSA3MjI7XG4gICAgdC51b2dvbmVrID0gNjExO1xuICAgIHQuRWRpZXJlc2lzID0gNjY3O1xuICAgIHQuRGNyb2F0ID0gNzIyO1xuICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7XG4gICAgdC5jb3B5cmlnaHQgPSA3Mzc7XG4gICAgdC5FbWFjcm9uID0gNjY3O1xuICAgIHQuY2Nhcm9uID0gNTU2O1xuICAgIHQuYXJpbmcgPSA1NTY7XG4gICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5sYWN1dGUgPSAyNzg7XG4gICAgdC5hZ3JhdmUgPSA1NTY7XG4gICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5DYWN1dGUgPSA3MjI7XG4gICAgdC5hdGlsZGUgPSA1NTY7XG4gICAgdC5FZG90YWNjZW50ID0gNjY3O1xuICAgIHQuc2Nhcm9uID0gNTU2O1xuICAgIHQuc2NlZGlsbGEgPSA1NTY7XG4gICAgdC5pYWN1dGUgPSAyNzg7XG4gICAgdC5sb3plbmdlID0gNDk0O1xuICAgIHQuUmNhcm9uID0gNzIyO1xuICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4O1xuICAgIHQudWNpcmN1bWZsZXggPSA2MTE7XG4gICAgdC5hY2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LkFtYWNyb24gPSA3MjI7XG4gICAgdC5yY2Fyb24gPSAzODk7XG4gICAgdC5jY2VkaWxsYSA9IDU1NjtcbiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7XG4gICAgdC5UaG9ybiA9IDY2NztcbiAgICB0Lk9tYWNyb24gPSA3Nzg7XG4gICAgdC5SYWN1dGUgPSA3MjI7XG4gICAgdC5TYWN1dGUgPSA2Njc7XG4gICAgdC5kY2Fyb24gPSA3NDM7XG4gICAgdC5VbWFjcm9uID0gNzIyO1xuICAgIHQudXJpbmcgPSA2MTE7XG4gICAgdC50aHJlZXN1cGVyaW9yID0gMzMzO1xuICAgIHQuT2dyYXZlID0gNzc4O1xuICAgIHQuQWdyYXZlID0gNzIyO1xuICAgIHQuQWJyZXZlID0gNzIyO1xuICAgIHQubXVsdGlwbHkgPSA1ODQ7XG4gICAgdC51YWN1dGUgPSA2MTE7XG4gICAgdC5UY2Fyb24gPSA2MTE7XG4gICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDtcbiAgICB0LnlkaWVyZXNpcyA9IDU1NjtcbiAgICB0Lk5hY3V0ZSA9IDcyMjtcbiAgICB0LmljaXJjdW1mbGV4ID0gMjc4O1xuICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7XG4gICAgdC5hZGllcmVzaXMgPSA1NTY7XG4gICAgdC5lZGllcmVzaXMgPSA1NTY7XG4gICAgdC5jYWN1dGUgPSA1NTY7XG4gICAgdC5uYWN1dGUgPSA2MTE7XG4gICAgdC51bWFjcm9uID0gNjExO1xuICAgIHQuTmNhcm9uID0gNzIyO1xuICAgIHQuSWFjdXRlID0gMjc4O1xuICAgIHQucGx1c21pbnVzID0gNTg0O1xuICAgIHQuYnJva2VuYmFyID0gMjgwO1xuICAgIHQucmVnaXN0ZXJlZCA9IDczNztcbiAgICB0LkdicmV2ZSA9IDc3ODtcbiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7XG4gICAgdC5zdW1tYXRpb24gPSA2MDA7XG4gICAgdC5FZ3JhdmUgPSA2Njc7XG4gICAgdC5yYWN1dGUgPSAzODk7XG4gICAgdC5vbWFjcm9uID0gNjExO1xuICAgIHQuWmFjdXRlID0gNjExO1xuICAgIHQuWmNhcm9uID0gNjExO1xuICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5O1xuICAgIHQuRXRoID0gNzIyO1xuICAgIHQuQ2NlZGlsbGEgPSA3MjI7XG4gICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC50Y2Fyb24gPSAzODk7XG4gICAgdC5lb2dvbmVrID0gNTU2O1xuICAgIHQuVW9nb25layA9IDcyMjtcbiAgICB0LkFhY3V0ZSA9IDcyMjtcbiAgICB0LkFkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmVncmF2ZSA9IDU1NjtcbiAgICB0LnphY3V0ZSA9IDUwMDtcbiAgICB0LmlvZ29uZWsgPSAyNzg7XG4gICAgdC5PYWN1dGUgPSA3Nzg7XG4gICAgdC5vYWN1dGUgPSA2MTE7XG4gICAgdC5hbWFjcm9uID0gNTU2O1xuICAgIHQuc2FjdXRlID0gNTU2O1xuICAgIHQuaWRpZXJlc2lzID0gMjc4O1xuICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7XG4gICAgdC5VZ3JhdmUgPSA3MjI7XG4gICAgdC5EZWx0YSA9IDYxMjtcbiAgICB0LnRob3JuID0gNjExO1xuICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7XG4gICAgdC5PZGllcmVzaXMgPSA3Nzg7XG4gICAgdC5tdSA9IDYxMTtcbiAgICB0LmlncmF2ZSA9IDI3ODtcbiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7XG4gICAgdC5Fb2dvbmVrID0gNjY3O1xuICAgIHQuZGNyb2F0ID0gNjExO1xuICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDtcbiAgICB0LlNjZWRpbGxhID0gNjY3O1xuICAgIHQubGNhcm9uID0gNDAwO1xuICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQuTGFjdXRlID0gNjExO1xuICAgIHQudHJhZGVtYXJrID0gMTAwMDtcbiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7XG4gICAgdC5JZ3JhdmUgPSAyNzg7XG4gICAgdC5JbWFjcm9uID0gMjc4O1xuICAgIHQuTGNhcm9uID0gNjExO1xuICAgIHQub25laGFsZiA9IDgzNDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNjExO1xuICAgIHQubnRpbGRlID0gNjExO1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDY2NztcbiAgICB0LmVtYWNyb24gPSA1NTY7XG4gICAgdC5nYnJldmUgPSA2MTE7XG4gICAgdC5vbmVxdWFydGVyID0gODM0O1xuICAgIHQuU2Nhcm9uID0gNjY3O1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDYxMTtcbiAgICB0LkNjYXJvbiA9IDcyMjtcbiAgICB0LnVncmF2ZSA9IDYxMTtcbiAgICB0LnJhZGljYWwgPSA1NDk7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzODk7XG4gICAgdC5OdGlsZGUgPSA3MjI7XG4gICAgdC5vdGlsZGUgPSA2MTE7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5BdGlsZGUgPSA3MjI7XG4gICAgdC5Bb2dvbmVrID0gNzIyO1xuICAgIHQuQXJpbmcgPSA3MjI7XG4gICAgdC5PdGlsZGUgPSA3Nzg7XG4gICAgdC56ZG90YWNjZW50ID0gNTAwO1xuICAgIHQuRWNhcm9uID0gNjY3O1xuICAgIHQuSW9nb25layA9IDI3ODtcbiAgICB0Lmtjb21tYWFjY2VudCA9IDU1NjtcbiAgICB0Lm1pbnVzID0gNTg0O1xuICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7XG4gICAgdC5uY2Fyb24gPSA2MTE7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7XG4gICAgdC5sb2dpY2Fsbm90ID0gNTg0O1xuICAgIHQub2RpZXJlc2lzID0gNjExO1xuICAgIHQudWRpZXJlc2lzID0gNjExO1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5ldGggPSA2MTE7XG4gICAgdC56Y2Fyb24gPSA1MDA7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMzMztcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTU2O1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0W1wiSGVsdmV0aWNhLU9ibGlxdWVcIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHtcbiAgICB0LnNwYWNlID0gMjc4O1xuICAgIHQuZXhjbGFtID0gMjc4O1xuICAgIHQucXVvdGVkYmwgPSAzNTU7XG4gICAgdC5udW1iZXJzaWduID0gNTU2O1xuICAgIHQuZG9sbGFyID0gNTU2O1xuICAgIHQucGVyY2VudCA9IDg4OTtcbiAgICB0LmFtcGVyc2FuZCA9IDY2NztcbiAgICB0LnF1b3RlcmlnaHQgPSAyMjI7XG4gICAgdC5wYXJlbmxlZnQgPSAzMzM7XG4gICAgdC5wYXJlbnJpZ2h0ID0gMzMzO1xuICAgIHQuYXN0ZXJpc2sgPSAzODk7XG4gICAgdC5wbHVzID0gNTg0O1xuICAgIHQuY29tbWEgPSAyNzg7XG4gICAgdC5oeXBoZW4gPSAzMzM7XG4gICAgdC5wZXJpb2QgPSAyNzg7XG4gICAgdC5zbGFzaCA9IDI3ODtcbiAgICB0Lnplcm8gPSA1NTY7XG4gICAgdC5vbmUgPSA1NTY7XG4gICAgdC50d28gPSA1NTY7XG4gICAgdC50aHJlZSA9IDU1NjtcbiAgICB0LmZvdXIgPSA1NTY7XG4gICAgdC5maXZlID0gNTU2O1xuICAgIHQuc2l4ID0gNTU2O1xuICAgIHQuc2V2ZW4gPSA1NTY7XG4gICAgdC5laWdodCA9IDU1NjtcbiAgICB0Lm5pbmUgPSA1NTY7XG4gICAgdC5jb2xvbiA9IDI3ODtcbiAgICB0LnNlbWljb2xvbiA9IDI3ODtcbiAgICB0Lmxlc3MgPSA1ODQ7XG4gICAgdC5lcXVhbCA9IDU4NDtcbiAgICB0LmdyZWF0ZXIgPSA1ODQ7XG4gICAgdC5xdWVzdGlvbiA9IDU1NjtcbiAgICB0LmF0ID0gMTAxNTtcbiAgICB0LkEgPSA2Njc7XG4gICAgdC5CID0gNjY3O1xuICAgIHQuQyA9IDcyMjtcbiAgICB0LkQgPSA3MjI7XG4gICAgdC5FID0gNjY3O1xuICAgIHQuRiA9IDYxMTtcbiAgICB0LkcgPSA3Nzg7XG4gICAgdC5IID0gNzIyO1xuICAgIHQuSSA9IDI3ODtcbiAgICB0LkogPSA1MDA7XG4gICAgdC5LID0gNjY3O1xuICAgIHQuTCA9IDU1NjtcbiAgICB0Lk0gPSA4MzM7XG4gICAgdC5OID0gNzIyO1xuICAgIHQuTyA9IDc3ODtcbiAgICB0LlAgPSA2Njc7XG4gICAgdC5RID0gNzc4O1xuICAgIHQuUiA9IDcyMjtcbiAgICB0LlMgPSA2Njc7XG4gICAgdC5UID0gNjExO1xuICAgIHQuVSA9IDcyMjtcbiAgICB0LlYgPSA2Njc7XG4gICAgdC5XID0gOTQ0O1xuICAgIHQuWCA9IDY2NztcbiAgICB0LlkgPSA2Njc7XG4gICAgdC5aID0gNjExO1xuICAgIHQuYnJhY2tldGxlZnQgPSAyNzg7XG4gICAgdC5iYWNrc2xhc2ggPSAyNzg7XG4gICAgdC5icmFja2V0cmlnaHQgPSAyNzg7XG4gICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTtcbiAgICB0LnVuZGVyc2NvcmUgPSA1NTY7XG4gICAgdC5xdW90ZWxlZnQgPSAyMjI7XG4gICAgdC5hID0gNTU2O1xuICAgIHQuYiA9IDU1NjtcbiAgICB0LmMgPSA1MDA7XG4gICAgdC5kID0gNTU2O1xuICAgIHQuZSA9IDU1NjtcbiAgICB0LmYgPSAyNzg7XG4gICAgdC5nID0gNTU2O1xuICAgIHQuaCA9IDU1NjtcbiAgICB0LmkgPSAyMjI7XG4gICAgdC5qID0gMjIyO1xuICAgIHQuayA9IDUwMDtcbiAgICB0LmwgPSAyMjI7XG4gICAgdC5tID0gODMzO1xuICAgIHQubiA9IDU1NjtcbiAgICB0Lm8gPSA1NTY7XG4gICAgdC5wID0gNTU2O1xuICAgIHQucSA9IDU1NjtcbiAgICB0LnIgPSAzMzM7XG4gICAgdC5zID0gNTAwO1xuICAgIHQudCA9IDI3ODtcbiAgICB0LnUgPSA1NTY7XG4gICAgdC52ID0gNTAwO1xuICAgIHQudyA9IDcyMjtcbiAgICB0LnggPSA1MDA7XG4gICAgdC55ID0gNTAwO1xuICAgIHQueiA9IDUwMDtcbiAgICB0LmJyYWNlbGVmdCA9IDMzNDtcbiAgICB0LmJhciA9IDI2MDtcbiAgICB0LmJyYWNlcmlnaHQgPSAzMzQ7XG4gICAgdC5hc2NpaXRpbGRlID0gNTg0O1xuICAgIHQuZXhjbGFtZG93biA9IDMzMztcbiAgICB0LmNlbnQgPSA1NTY7XG4gICAgdC5zdGVybGluZyA9IDU1NjtcbiAgICB0LmZyYWN0aW9uID0gMTY3O1xuICAgIHQueWVuID0gNTU2O1xuICAgIHQuZmxvcmluID0gNTU2O1xuICAgIHQuc2VjdGlvbiA9IDU1NjtcbiAgICB0LmN1cnJlbmN5ID0gNTU2O1xuICAgIHQucXVvdGVzaW5nbGUgPSAxOTE7XG4gICAgdC5xdW90ZWRibGxlZnQgPSAzMzM7XG4gICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2O1xuICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMztcbiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzO1xuICAgIHQuZmkgPSA1MDA7XG4gICAgdC5mbCA9IDUwMDtcbiAgICB0LmVuZGFzaCA9IDU1NjtcbiAgICB0LmRhZ2dlciA9IDU1NjtcbiAgICB0LmRhZ2dlcmRibCA9IDU1NjtcbiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4O1xuICAgIHQucGFyYWdyYXBoID0gNTM3O1xuICAgIHQuYnVsbGV0ID0gMzUwO1xuICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyMjI7XG4gICAgdC5xdW90ZWRibGJhc2UgPSAzMzM7XG4gICAgdC5xdW90ZWRibHJpZ2h0ID0gMzMzO1xuICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7XG4gICAgdC5lbGxpcHNpcyA9IDEwMDA7XG4gICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7XG4gICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7XG4gICAgdC5ncmF2ZSA9IDMzMztcbiAgICB0LmFjdXRlID0gMzMzO1xuICAgIHQuY2lyY3VtZmxleCA9IDMzMztcbiAgICB0LnRpbGRlID0gMzMzO1xuICAgIHQubWFjcm9uID0gMzMzO1xuICAgIHQuYnJldmUgPSAzMzM7XG4gICAgdC5kb3RhY2NlbnQgPSAzMzM7XG4gICAgdC5kaWVyZXNpcyA9IDMzMztcbiAgICB0LnJpbmcgPSAzMzM7XG4gICAgdC5jZWRpbGxhID0gMzMzO1xuICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzO1xuICAgIHQub2dvbmVrID0gMzMzO1xuICAgIHQuY2Fyb24gPSAzMzM7XG4gICAgdC5lbWRhc2ggPSAxMDAwO1xuICAgIHQuQUUgPSAxMDAwO1xuICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7XG4gICAgdC5Mc2xhc2ggPSA1NTY7XG4gICAgdC5Pc2xhc2ggPSA3Nzg7XG4gICAgdC5PRSA9IDEwMDA7XG4gICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7XG4gICAgdC5hZSA9IDg4OTtcbiAgICB0LmRvdGxlc3NpID0gMjc4O1xuICAgIHQubHNsYXNoID0gMjIyO1xuICAgIHQub3NsYXNoID0gNjExO1xuICAgIHQub2UgPSA5NDQ7XG4gICAgdC5nZXJtYW5kYmxzID0gNjExO1xuICAgIHQuSWRpZXJlc2lzID0gMjc4O1xuICAgIHQuZWFjdXRlID0gNTU2O1xuICAgIHQuYWJyZXZlID0gNTU2O1xuICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjtcbiAgICB0LmVjYXJvbiA9IDU1NjtcbiAgICB0LllkaWVyZXNpcyA9IDY2NztcbiAgICB0LmRpdmlkZSA9IDU4NDtcbiAgICB0LllhY3V0ZSA9IDY2NztcbiAgICB0LkFjaXJjdW1mbGV4ID0gNjY3O1xuICAgIHQuYWFjdXRlID0gNTU2O1xuICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7XG4gICAgdC55YWN1dGUgPSA1MDA7XG4gICAgdC5zY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5lY2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LlVyaW5nID0gNzIyO1xuICAgIHQuVWRpZXJlc2lzID0gNzIyO1xuICAgIHQuYW9nb25layA9IDU1NjtcbiAgICB0LlVhY3V0ZSA9IDcyMjtcbiAgICB0LnVvZ29uZWsgPSA1NTY7XG4gICAgdC5FZGllcmVzaXMgPSA2Njc7XG4gICAgdC5EY3JvYXQgPSA3MjI7XG4gICAgdC5jb21tYWFjY2VudCA9IDI1MDtcbiAgICB0LmNvcHlyaWdodCA9IDczNztcbiAgICB0LkVtYWNyb24gPSA2Njc7XG4gICAgdC5jY2Fyb24gPSA1MDA7XG4gICAgdC5hcmluZyA9IDU1NjtcbiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LmxhY3V0ZSA9IDIyMjtcbiAgICB0LmFncmF2ZSA9IDU1NjtcbiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTtcbiAgICB0LkNhY3V0ZSA9IDcyMjtcbiAgICB0LmF0aWxkZSA9IDU1NjtcbiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7XG4gICAgdC5zY2Fyb24gPSA1MDA7XG4gICAgdC5zY2VkaWxsYSA9IDUwMDtcbiAgICB0LmlhY3V0ZSA9IDI3ODtcbiAgICB0LmxvemVuZ2UgPSA0NzE7XG4gICAgdC5SY2Fyb24gPSA3MjI7XG4gICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7XG4gICAgdC51Y2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LmFjaXJjdW1mbGV4ID0gNTU2O1xuICAgIHQuQW1hY3JvbiA9IDY2NztcbiAgICB0LnJjYXJvbiA9IDMzMztcbiAgICB0LmNjZWRpbGxhID0gNTAwO1xuICAgIHQuWmRvdGFjY2VudCA9IDYxMTtcbiAgICB0LlRob3JuID0gNjY3O1xuICAgIHQuT21hY3JvbiA9IDc3ODtcbiAgICB0LlJhY3V0ZSA9IDcyMjtcbiAgICB0LlNhY3V0ZSA9IDY2NztcbiAgICB0LmRjYXJvbiA9IDY0MztcbiAgICB0LlVtYWNyb24gPSA3MjI7XG4gICAgdC51cmluZyA9IDU1NjtcbiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7XG4gICAgdC5PZ3JhdmUgPSA3Nzg7XG4gICAgdC5BZ3JhdmUgPSA2Njc7XG4gICAgdC5BYnJldmUgPSA2Njc7XG4gICAgdC5tdWx0aXBseSA9IDU4NDtcbiAgICB0LnVhY3V0ZSA9IDU1NjtcbiAgICB0LlRjYXJvbiA9IDYxMTtcbiAgICB0LnBhcnRpYWxkaWZmID0gNDc2O1xuICAgIHQueWRpZXJlc2lzID0gNTAwO1xuICAgIHQuTmFjdXRlID0gNzIyO1xuICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7XG4gICAgdC5FY2lyY3VtZmxleCA9IDY2NztcbiAgICB0LmFkaWVyZXNpcyA9IDU1NjtcbiAgICB0LmVkaWVyZXNpcyA9IDU1NjtcbiAgICB0LmNhY3V0ZSA9IDUwMDtcbiAgICB0Lm5hY3V0ZSA9IDU1NjtcbiAgICB0LnVtYWNyb24gPSA1NTY7XG4gICAgdC5OY2Fyb24gPSA3MjI7XG4gICAgdC5JYWN1dGUgPSAyNzg7XG4gICAgdC5wbHVzbWludXMgPSA1ODQ7XG4gICAgdC5icm9rZW5iYXIgPSAyNjA7XG4gICAgdC5yZWdpc3RlcmVkID0gNzM3O1xuICAgIHQuR2JyZXZlID0gNzc4O1xuICAgIHQuSWRvdGFjY2VudCA9IDI3ODtcbiAgICB0LnN1bW1hdGlvbiA9IDYwMDtcbiAgICB0LkVncmF2ZSA9IDY2NztcbiAgICB0LnJhY3V0ZSA9IDMzMztcbiAgICB0Lm9tYWNyb24gPSA1NTY7XG4gICAgdC5aYWN1dGUgPSA2MTE7XG4gICAgdC5aY2Fyb24gPSA2MTE7XG4gICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7XG4gICAgdC5FdGggPSA3MjI7XG4gICAgdC5DY2VkaWxsYSA9IDcyMjtcbiAgICB0Lmxjb21tYWFjY2VudCA9IDIyMjtcbiAgICB0LnRjYXJvbiA9IDMxNztcbiAgICB0LmVvZ29uZWsgPSA1NTY7XG4gICAgdC5Vb2dvbmVrID0gNzIyO1xuICAgIHQuQWFjdXRlID0gNjY3O1xuICAgIHQuQWRpZXJlc2lzID0gNjY3O1xuICAgIHQuZWdyYXZlID0gNTU2O1xuICAgIHQuemFjdXRlID0gNTAwO1xuICAgIHQuaW9nb25layA9IDIyMjtcbiAgICB0Lk9hY3V0ZSA9IDc3ODtcbiAgICB0Lm9hY3V0ZSA9IDU1NjtcbiAgICB0LmFtYWNyb24gPSA1NTY7XG4gICAgdC5zYWN1dGUgPSA1MDA7XG4gICAgdC5pZGllcmVzaXMgPSAyNzg7XG4gICAgdC5PY2lyY3VtZmxleCA9IDc3ODtcbiAgICB0LlVncmF2ZSA9IDcyMjtcbiAgICB0LkRlbHRhID0gNjEyO1xuICAgIHQudGhvcm4gPSA1NTY7XG4gICAgdC50d29zdXBlcmlvciA9IDMzMztcbiAgICB0Lk9kaWVyZXNpcyA9IDc3ODtcbiAgICB0Lm11ID0gNTU2O1xuICAgIHQuaWdyYXZlID0gMjc4O1xuICAgIHQub2h1bmdhcnVtbGF1dCA9IDU1NjtcbiAgICB0LkVvZ29uZWsgPSA2Njc7XG4gICAgdC5kY3JvYXQgPSA1NTY7XG4gICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0O1xuICAgIHQuU2NlZGlsbGEgPSA2Njc7XG4gICAgdC5sY2Fyb24gPSAyOTk7XG4gICAgdC5LY29tbWFhY2NlbnQgPSA2Njc7XG4gICAgdC5MYWN1dGUgPSA1NTY7XG4gICAgdC50cmFkZW1hcmsgPSAxMDAwO1xuICAgIHQuZWRvdGFjY2VudCA9IDU1NjtcbiAgICB0LklncmF2ZSA9IDI3ODtcbiAgICB0LkltYWNyb24gPSAyNzg7XG4gICAgdC5MY2Fyb24gPSA1NTY7XG4gICAgdC5vbmVoYWxmID0gODM0O1xuICAgIHQubGVzc2VxdWFsID0gNTQ5O1xuICAgIHQub2NpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5udGlsZGUgPSA1NTY7XG4gICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyO1xuICAgIHQuRWFjdXRlID0gNjY3O1xuICAgIHQuZW1hY3JvbiA9IDU1NjtcbiAgICB0LmdicmV2ZSA9IDU1NjtcbiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7XG4gICAgdC5TY2Fyb24gPSA2Njc7XG4gICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7XG4gICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4O1xuICAgIHQuZGVncmVlID0gNDAwO1xuICAgIHQub2dyYXZlID0gNTU2O1xuICAgIHQuQ2Nhcm9uID0gNzIyO1xuICAgIHQudWdyYXZlID0gNTU2O1xuICAgIHQucmFkaWNhbCA9IDQ1MztcbiAgICB0LkRjYXJvbiA9IDcyMjtcbiAgICB0LnJjb21tYWFjY2VudCA9IDMzMztcbiAgICB0Lk50aWxkZSA9IDcyMjtcbiAgICB0Lm90aWxkZSA9IDU1NjtcbiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjtcbiAgICB0LkF0aWxkZSA9IDY2NztcbiAgICB0LkFvZ29uZWsgPSA2Njc7XG4gICAgdC5BcmluZyA9IDY2NztcbiAgICB0Lk90aWxkZSA9IDc3ODtcbiAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7XG4gICAgdC5FY2Fyb24gPSA2Njc7XG4gICAgdC5Jb2dvbmVrID0gMjc4O1xuICAgIHQua2NvbW1hYWNjZW50ID0gNTAwO1xuICAgIHQubWludXMgPSA1ODQ7XG4gICAgdC5JY2lyY3VtZmxleCA9IDI3ODtcbiAgICB0Lm5jYXJvbiA9IDU1NjtcbiAgICB0LnRjb21tYWFjY2VudCA9IDI3ODtcbiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7XG4gICAgdC5vZGllcmVzaXMgPSA1NTY7XG4gICAgdC51ZGllcmVzaXMgPSA1NTY7XG4gICAgdC5ub3RlcXVhbCA9IDU0OTtcbiAgICB0Lmdjb21tYWFjY2VudCA9IDU1NjtcbiAgICB0LmV0aCA9IDU1NjtcbiAgICB0LnpjYXJvbiA9IDUwMDtcbiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjtcbiAgICB0Lm9uZXN1cGVyaW9yID0gMzMzO1xuICAgIHQuaW1hY3JvbiA9IDI3ODtcbiAgICB0LkV1cm8gPSA1NTY7XG4gIH0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHQuU3ltYm9sID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgdC5zcGFjZSA9IDI1MDtcbiAgICB0LmV4Y2xhbSA9IDMzMztcbiAgICB0LnVuaXZlcnNhbCA9IDcxMztcbiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7XG4gICAgdC5leGlzdGVudGlhbCA9IDU0OTtcbiAgICB0LnBlcmNlbnQgPSA4MzM7XG4gICAgdC5hbXBlcnNhbmQgPSA3Nzg7XG4gICAgdC5zdWNodGhhdCA9IDQzOTtcbiAgICB0LnBhcmVubGVmdCA9IDMzMztcbiAgICB0LnBhcmVucmlnaHQgPSAzMzM7XG4gICAgdC5hc3Rlcmlza21hdGggPSA1MDA7XG4gICAgdC5wbHVzID0gNTQ5O1xuICAgIHQuY29tbWEgPSAyNTA7XG4gICAgdC5taW51cyA9IDU0OTtcbiAgICB0LnBlcmlvZCA9IDI1MDtcbiAgICB0LnNsYXNoID0gMjc4O1xuICAgIHQuemVybyA9IDUwMDtcbiAgICB0Lm9uZSA9IDUwMDtcbiAgICB0LnR3byA9IDUwMDtcbiAgICB0LnRocmVlID0gNTAwO1xuICAgIHQuZm91ciA9IDUwMDtcbiAgICB0LmZpdmUgPSA1MDA7XG4gICAgdC5zaXggPSA1MDA7XG4gICAgdC5zZXZlbiA9IDUwMDtcbiAgICB0LmVpZ2h0ID0gNTAwO1xuICAgIHQubmluZSA9IDUwMDtcbiAgICB0LmNvbG9uID0gMjc4O1xuICAgIHQuc2VtaWNvbG9uID0gMjc4O1xuICAgIHQubGVzcyA9IDU0OTtcbiAgICB0LmVxdWFsID0gNTQ5O1xuICAgIHQuZ3JlYXRlciA9IDU0OTtcbiAgICB0LnF1ZXN0aW9uID0gNDQ0O1xuICAgIHQuY29uZ3J1ZW50ID0gNTQ5O1xuICAgIHQuQWxwaGEgPSA3MjI7XG4gICAgdC5CZXRhID0gNjY3O1xuICAgIHQuQ2hpID0gNzIyO1xuICAgIHQuRGVsdGEgPSA2MTI7XG4gICAgdC5FcHNpbG9uID0gNjExO1xuICAgIHQuUGhpID0gNzYzO1xuICAgIHQuR2FtbWEgPSA2MDM7XG4gICAgdC5FdGEgPSA3MjI7XG4gICAgdC5Jb3RhID0gMzMzO1xuICAgIHQudGhldGExID0gNjMxO1xuICAgIHQuS2FwcGEgPSA3MjI7XG4gICAgdC5MYW1iZGEgPSA2ODY7XG4gICAgdC5NdSA9IDg4OTtcbiAgICB0Lk51ID0gNzIyO1xuICAgIHQuT21pY3JvbiA9IDcyMjtcbiAgICB0LlBpID0gNzY4O1xuICAgIHQuVGhldGEgPSA3NDE7XG4gICAgdC5SaG8gPSA1NTY7XG4gICAgdC5TaWdtYSA9IDU5MjtcbiAgICB0LlRhdSA9IDYxMTtcbiAgICB0LlVwc2lsb24gPSA2OTA7XG4gICAgdC5zaWdtYTEgPSA0Mzk7XG4gICAgdC5PbWVnYSA9IDc2ODtcbiAgICB0LlhpID0gNjQ1O1xuICAgIHQuUHNpID0gNzk1O1xuICAgIHQuWmV0YSA9IDYxMTtcbiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzO1xuICAgIHQudGhlcmVmb3JlID0gODYzO1xuICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzO1xuICAgIHQucGVycGVuZGljdWxhciA9IDY1ODtcbiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7XG4gICAgdC5yYWRpY2FsZXggPSA1MDA7XG4gICAgdC5hbHBoYSA9IDYzMTtcbiAgICB0LmJldGEgPSA1NDk7XG4gICAgdC5jaGkgPSA1NDk7XG4gICAgdC5kZWx0YSA9IDQ5NDtcbiAgICB0LmVwc2lsb24gPSA0Mzk7XG4gICAgdC5waGkgPSA1MjE7XG4gICAgdC5nYW1tYSA9IDQxMTtcbiAgICB0LmV0YSA9IDYwMztcbiAgICB0LmlvdGEgPSAzMjk7XG4gICAgdC5waGkxID0gNjAzO1xuICAgIHQua2FwcGEgPSA1NDk7XG4gICAgdC5sYW1iZGEgPSA1NDk7XG4gICAgdC5tdSA9IDU3NjtcbiAgICB0Lm51ID0gNTIxO1xuICAgIHQub21pY3JvbiA9IDU0OTtcbiAgICB0LnBpID0gNTQ5O1xuICAgIHQudGhldGEgPSA1MjE7XG4gICAgdC5yaG8gPSA1NDk7XG4gICAgdC5zaWdtYSA9IDYwMztcbiAgICB0LnRhdSA9IDQzOTtcbiAgICB0LnVwc2lsb24gPSA1NzY7XG4gICAgdC5vbWVnYTEgPSA3MTM7XG4gICAgdC5vbWVnYSA9IDY4NjtcbiAgICB0LnhpID0gNDkzO1xuICAgIHQucHNpID0gNjg2O1xuICAgIHQuemV0YSA9IDQ5NDtcbiAgICB0LmJyYWNlbGVmdCA9IDQ4MDtcbiAgICB0LmJhciA9IDIwMDtcbiAgICB0LmJyYWNlcmlnaHQgPSA0ODA7XG4gICAgdC5zaW1pbGFyID0gNTQ5O1xuICAgIHQuRXVybyA9IDc1MDtcbiAgICB0LlVwc2lsb24xID0gNjIwO1xuICAgIHQubWludXRlID0gMjQ3O1xuICAgIHQubGVzc2VxdWFsID0gNTQ5O1xuICAgIHQuZnJhY3Rpb24gPSAxNjc7XG4gICAgdC5pbmZpbml0eSA9IDcxMztcbiAgICB0LmZsb3JpbiA9IDUwMDtcbiAgICB0LmNsdWIgPSA3NTM7XG4gICAgdC5kaWFtb25kID0gNzUzO1xuICAgIHQuaGVhcnQgPSA3NTM7XG4gICAgdC5zcGFkZSA9IDc1MztcbiAgICB0LmFycm93Ym90aCA9IDEwNDI7XG4gICAgdC5hcnJvd2xlZnQgPSA5ODc7XG4gICAgdC5hcnJvd3VwID0gNjAzO1xuICAgIHQuYXJyb3dyaWdodCA9IDk4NztcbiAgICB0LmFycm93ZG93biA9IDYwMztcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0LnBsdXNtaW51cyA9IDU0OTtcbiAgICB0LnNlY29uZCA9IDQxMTtcbiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTtcbiAgICB0Lm11bHRpcGx5ID0gNTQ5O1xuICAgIHQucHJvcG9ydGlvbmFsID0gNzEzO1xuICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7XG4gICAgdC5idWxsZXQgPSA0NjA7XG4gICAgdC5kaXZpZGUgPSA1NDk7XG4gICAgdC5ub3RlcXVhbCA9IDU0OTtcbiAgICB0LmVxdWl2YWxlbmNlID0gNTQ5O1xuICAgIHQuYXBwcm94ZXF1YWwgPSA1NDk7XG4gICAgdC5lbGxpcHNpcyA9IDEwMDA7XG4gICAgdC5hcnJvd3ZlcnRleCA9IDYwMztcbiAgICB0LmFycm93aG9yaXpleCA9IDEwMDA7XG4gICAgdC5jYXJyaWFnZXJldHVybiA9IDY1ODtcbiAgICB0LmFsZXBoID0gODIzO1xuICAgIHQuSWZyYWt0dXIgPSA2ODY7XG4gICAgdC5SZnJha3R1ciA9IDc5NTtcbiAgICB0LndlaWVyc3RyYXNzID0gOTg3O1xuICAgIHQuY2lyY2xlbXVsdGlwbHkgPSA3Njg7XG4gICAgdC5jaXJjbGVwbHVzID0gNzY4O1xuICAgIHQuZW1wdHlzZXQgPSA4MjM7XG4gICAgdC5pbnRlcnNlY3Rpb24gPSA3Njg7XG4gICAgdC51bmlvbiA9IDc2ODtcbiAgICB0LnByb3BlcnN1cGVyc2V0ID0gNzEzO1xuICAgIHQucmVmbGV4c3VwZXJzZXQgPSA3MTM7XG4gICAgdC5ub3RzdWJzZXQgPSA3MTM7XG4gICAgdC5wcm9wZXJzdWJzZXQgPSA3MTM7XG4gICAgdC5yZWZsZXhzdWJzZXQgPSA3MTM7XG4gICAgdC5lbGVtZW50ID0gNzEzO1xuICAgIHQubm90ZWxlbWVudCA9IDcxMztcbiAgICB0LmFuZ2xlID0gNzY4O1xuICAgIHQuZ3JhZGllbnQgPSA3MTM7XG4gICAgdC5yZWdpc3RlcnNlcmlmID0gNzkwO1xuICAgIHQuY29weXJpZ2h0c2VyaWYgPSA3OTA7XG4gICAgdC50cmFkZW1hcmtzZXJpZiA9IDg5MDtcbiAgICB0LnByb2R1Y3QgPSA4MjM7XG4gICAgdC5yYWRpY2FsID0gNTQ5O1xuICAgIHQuZG90bWF0aCA9IDI1MDtcbiAgICB0LmxvZ2ljYWxub3QgPSA3MTM7XG4gICAgdC5sb2dpY2FsYW5kID0gNjAzO1xuICAgIHQubG9naWNhbG9yID0gNjAzO1xuICAgIHQuYXJyb3dkYmxib3RoID0gMTA0MjtcbiAgICB0LmFycm93ZGJsbGVmdCA9IDk4NztcbiAgICB0LmFycm93ZGJsdXAgPSA2MDM7XG4gICAgdC5hcnJvd2RibHJpZ2h0ID0gOTg3O1xuICAgIHQuYXJyb3dkYmxkb3duID0gNjAzO1xuICAgIHQubG96ZW5nZSA9IDQ5NDtcbiAgICB0LmFuZ2xlbGVmdCA9IDMyOTtcbiAgICB0LnJlZ2lzdGVyc2FucyA9IDc5MDtcbiAgICB0LmNvcHlyaWdodHNhbnMgPSA3OTA7XG4gICAgdC50cmFkZW1hcmtzYW5zID0gNzg2O1xuICAgIHQuc3VtbWF0aW9uID0gNzEzO1xuICAgIHQucGFyZW5sZWZ0dHAgPSAzODQ7XG4gICAgdC5wYXJlbmxlZnRleCA9IDM4NDtcbiAgICB0LnBhcmVubGVmdGJ0ID0gMzg0O1xuICAgIHQuYnJhY2tldGxlZnR0cCA9IDM4NDtcbiAgICB0LmJyYWNrZXRsZWZ0ZXggPSAzODQ7XG4gICAgdC5icmFja2V0bGVmdGJ0ID0gMzg0O1xuICAgIHQuYnJhY2VsZWZ0dHAgPSA0OTQ7XG4gICAgdC5icmFjZWxlZnRtaWQgPSA0OTQ7XG4gICAgdC5icmFjZWxlZnRidCA9IDQ5NDtcbiAgICB0LmJyYWNlZXggPSA0OTQ7XG4gICAgdC5hbmdsZXJpZ2h0ID0gMzI5O1xuICAgIHQuaW50ZWdyYWwgPSAyNzQ7XG4gICAgdC5pbnRlZ3JhbHRwID0gNjg2O1xuICAgIHQuaW50ZWdyYWxleCA9IDY4NjtcbiAgICB0LmludGVncmFsYnQgPSA2ODY7XG4gICAgdC5wYXJlbnJpZ2h0dHAgPSAzODQ7XG4gICAgdC5wYXJlbnJpZ2h0ZXggPSAzODQ7XG4gICAgdC5wYXJlbnJpZ2h0YnQgPSAzODQ7XG4gICAgdC5icmFja2V0cmlnaHR0cCA9IDM4NDtcbiAgICB0LmJyYWNrZXRyaWdodGV4ID0gMzg0O1xuICAgIHQuYnJhY2tldHJpZ2h0YnQgPSAzODQ7XG4gICAgdC5icmFjZXJpZ2h0dHAgPSA0OTQ7XG4gICAgdC5icmFjZXJpZ2h0bWlkID0gNDk0O1xuICAgIHQuYnJhY2VyaWdodGJ0ID0gNDk0O1xuICAgIHQuYXBwbGUgPSA3OTA7XG4gIH0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRbXCJUaW1lcy1Sb21hblwiXSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICAgIHQuc3BhY2UgPSAyNTA7XG4gICAgdC5leGNsYW0gPSAzMzM7XG4gICAgdC5xdW90ZWRibCA9IDQwODtcbiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7XG4gICAgdC5kb2xsYXIgPSA1MDA7XG4gICAgdC5wZXJjZW50ID0gODMzO1xuICAgIHQuYW1wZXJzYW5kID0gNzc4O1xuICAgIHQucXVvdGVyaWdodCA9IDMzMztcbiAgICB0LnBhcmVubGVmdCA9IDMzMztcbiAgICB0LnBhcmVucmlnaHQgPSAzMzM7XG4gICAgdC5hc3RlcmlzayA9IDUwMDtcbiAgICB0LnBsdXMgPSA1NjQ7XG4gICAgdC5jb21tYSA9IDI1MDtcbiAgICB0Lmh5cGhlbiA9IDMzMztcbiAgICB0LnBlcmlvZCA9IDI1MDtcbiAgICB0LnNsYXNoID0gMjc4O1xuICAgIHQuemVybyA9IDUwMDtcbiAgICB0Lm9uZSA9IDUwMDtcbiAgICB0LnR3byA9IDUwMDtcbiAgICB0LnRocmVlID0gNTAwO1xuICAgIHQuZm91ciA9IDUwMDtcbiAgICB0LmZpdmUgPSA1MDA7XG4gICAgdC5zaXggPSA1MDA7XG4gICAgdC5zZXZlbiA9IDUwMDtcbiAgICB0LmVpZ2h0ID0gNTAwO1xuICAgIHQubmluZSA9IDUwMDtcbiAgICB0LmNvbG9uID0gMjc4O1xuICAgIHQuc2VtaWNvbG9uID0gMjc4O1xuICAgIHQubGVzcyA9IDU2NDtcbiAgICB0LmVxdWFsID0gNTY0O1xuICAgIHQuZ3JlYXRlciA9IDU2NDtcbiAgICB0LnF1ZXN0aW9uID0gNDQ0O1xuICAgIHQuYXQgPSA5MjE7XG4gICAgdC5BID0gNzIyO1xuICAgIHQuQiA9IDY2NztcbiAgICB0LkMgPSA2Njc7XG4gICAgdC5EID0gNzIyO1xuICAgIHQuRSA9IDYxMTtcbiAgICB0LkYgPSA1NTY7XG4gICAgdC5HID0gNzIyO1xuICAgIHQuSCA9IDcyMjtcbiAgICB0LkkgPSAzMzM7XG4gICAgdC5KID0gMzg5O1xuICAgIHQuSyA9IDcyMjtcbiAgICB0LkwgPSA2MTE7XG4gICAgdC5NID0gODg5O1xuICAgIHQuTiA9IDcyMjtcbiAgICB0Lk8gPSA3MjI7XG4gICAgdC5QID0gNTU2O1xuICAgIHQuUSA9IDcyMjtcbiAgICB0LlIgPSA2Njc7XG4gICAgdC5TID0gNTU2O1xuICAgIHQuVCA9IDYxMTtcbiAgICB0LlUgPSA3MjI7XG4gICAgdC5WID0gNzIyO1xuICAgIHQuVyA9IDk0NDtcbiAgICB0LlggPSA3MjI7XG4gICAgdC5ZID0gNzIyO1xuICAgIHQuWiA9IDYxMTtcbiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzO1xuICAgIHQuYmFja3NsYXNoID0gMjc4O1xuICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzO1xuICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7XG4gICAgdC51bmRlcnNjb3JlID0gNTAwO1xuICAgIHQucXVvdGVsZWZ0ID0gMzMzO1xuICAgIHQuYSA9IDQ0NDtcbiAgICB0LmIgPSA1MDA7XG4gICAgdC5jID0gNDQ0O1xuICAgIHQuZCA9IDUwMDtcbiAgICB0LmUgPSA0NDQ7XG4gICAgdC5mID0gMzMzO1xuICAgIHQuZyA9IDUwMDtcbiAgICB0LmggPSA1MDA7XG4gICAgdC5pID0gMjc4O1xuICAgIHQuaiA9IDI3ODtcbiAgICB0LmsgPSA1MDA7XG4gICAgdC5sID0gMjc4O1xuICAgIHQubSA9IDc3ODtcbiAgICB0Lm4gPSA1MDA7XG4gICAgdC5vID0gNTAwO1xuICAgIHQucCA9IDUwMDtcbiAgICB0LnEgPSA1MDA7XG4gICAgdC5yID0gMzMzO1xuICAgIHQucyA9IDM4OTtcbiAgICB0LnQgPSAyNzg7XG4gICAgdC51ID0gNTAwO1xuICAgIHQudiA9IDUwMDtcbiAgICB0LncgPSA3MjI7XG4gICAgdC54ID0gNTAwO1xuICAgIHQueSA9IDUwMDtcbiAgICB0LnogPSA0NDQ7XG4gICAgdC5icmFjZWxlZnQgPSA0ODA7XG4gICAgdC5iYXIgPSAyMDA7XG4gICAgdC5icmFjZXJpZ2h0ID0gNDgwO1xuICAgIHQuYXNjaWl0aWxkZSA9IDU0MTtcbiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7XG4gICAgdC5jZW50ID0gNTAwO1xuICAgIHQuc3RlcmxpbmcgPSA1MDA7XG4gICAgdC5mcmFjdGlvbiA9IDE2NztcbiAgICB0LnllbiA9IDUwMDtcbiAgICB0LmZsb3JpbiA9IDUwMDtcbiAgICB0LnNlY3Rpb24gPSA1MDA7XG4gICAgdC5jdXJyZW5jeSA9IDUwMDtcbiAgICB0LnF1b3Rlc2luZ2xlID0gMTgwO1xuICAgIHQucXVvdGVkYmxsZWZ0ID0gNDQ0O1xuICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDtcbiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7XG4gICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMztcbiAgICB0LmZpID0gNTU2O1xuICAgIHQuZmwgPSA1NTY7XG4gICAgdC5lbmRhc2ggPSA1MDA7XG4gICAgdC5kYWdnZXIgPSA1MDA7XG4gICAgdC5kYWdnZXJkYmwgPSA1MDA7XG4gICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI1MDtcbiAgICB0LnBhcmFncmFwaCA9IDQ1MztcbiAgICB0LmJ1bGxldCA9IDM1MDtcbiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMzMzO1xuICAgIHQucXVvdGVkYmxiYXNlID0gNDQ0O1xuICAgIHQucXVvdGVkYmxyaWdodCA9IDQ0NDtcbiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTAwO1xuICAgIHQuZWxsaXBzaXMgPSAxMDAwO1xuICAgIHQucGVydGhvdXNhbmQgPSAxMDAwO1xuICAgIHQucXVlc3Rpb25kb3duID0gNDQ0O1xuICAgIHQuZ3JhdmUgPSAzMzM7XG4gICAgdC5hY3V0ZSA9IDMzMztcbiAgICB0LmNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC50aWxkZSA9IDMzMztcbiAgICB0Lm1hY3JvbiA9IDMzMztcbiAgICB0LmJyZXZlID0gMzMzO1xuICAgIHQuZG90YWNjZW50ID0gMzMzO1xuICAgIHQuZGllcmVzaXMgPSAzMzM7XG4gICAgdC5yaW5nID0gMzMzO1xuICAgIHQuY2VkaWxsYSA9IDMzMztcbiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMztcbiAgICB0Lm9nb25layA9IDMzMztcbiAgICB0LmNhcm9uID0gMzMzO1xuICAgIHQuZW1kYXNoID0gMTAwMDtcbiAgICB0LkFFID0gODg5O1xuICAgIHQub3JkZmVtaW5pbmUgPSAyNzY7XG4gICAgdC5Mc2xhc2ggPSA2MTE7XG4gICAgdC5Pc2xhc2ggPSA3MjI7XG4gICAgdC5PRSA9IDg4OTtcbiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDtcbiAgICB0LmFlID0gNjY3O1xuICAgIHQuZG90bGVzc2kgPSAyNzg7XG4gICAgdC5sc2xhc2ggPSAyNzg7XG4gICAgdC5vc2xhc2ggPSA1MDA7XG4gICAgdC5vZSA9IDcyMjtcbiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7XG4gICAgdC5JZGllcmVzaXMgPSAzMzM7XG4gICAgdC5lYWN1dGUgPSA0NDQ7XG4gICAgdC5hYnJldmUgPSA0NDQ7XG4gICAgdC51aHVuZ2FydW1sYXV0ID0gNTAwO1xuICAgIHQuZWNhcm9uID0gNDQ0O1xuICAgIHQuWWRpZXJlc2lzID0gNzIyO1xuICAgIHQuZGl2aWRlID0gNTY0O1xuICAgIHQuWWFjdXRlID0gNzIyO1xuICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7XG4gICAgdC5hYWN1dGUgPSA0NDQ7XG4gICAgdC5VY2lyY3VtZmxleCA9IDcyMjtcbiAgICB0LnlhY3V0ZSA9IDUwMDtcbiAgICB0LnNjb21tYWFjY2VudCA9IDM4OTtcbiAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0O1xuICAgIHQuVXJpbmcgPSA3MjI7XG4gICAgdC5VZGllcmVzaXMgPSA3MjI7XG4gICAgdC5hb2dvbmVrID0gNDQ0O1xuICAgIHQuVWFjdXRlID0gNzIyO1xuICAgIHQudW9nb25layA9IDUwMDtcbiAgICB0LkVkaWVyZXNpcyA9IDYxMTtcbiAgICB0LkRjcm9hdCA9IDcyMjtcbiAgICB0LmNvbW1hYWNjZW50ID0gMjUwO1xuICAgIHQuY29weXJpZ2h0ID0gNzYwO1xuICAgIHQuRW1hY3JvbiA9IDYxMTtcbiAgICB0LmNjYXJvbiA9IDQ0NDtcbiAgICB0LmFyaW5nID0gNDQ0O1xuICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQubGFjdXRlID0gMjc4O1xuICAgIHQuYWdyYXZlID0gNDQ0O1xuICAgIHQuVGNvbW1hYWNjZW50ID0gNjExO1xuICAgIHQuQ2FjdXRlID0gNjY3O1xuICAgIHQuYXRpbGRlID0gNDQ0O1xuICAgIHQuRWRvdGFjY2VudCA9IDYxMTtcbiAgICB0LnNjYXJvbiA9IDM4OTtcbiAgICB0LnNjZWRpbGxhID0gMzg5O1xuICAgIHQuaWFjdXRlID0gMjc4O1xuICAgIHQubG96ZW5nZSA9IDQ3MTtcbiAgICB0LlJjYXJvbiA9IDY2NztcbiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LnVjaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQuYWNpcmN1bWZsZXggPSA0NDQ7XG4gICAgdC5BbWFjcm9uID0gNzIyO1xuICAgIHQucmNhcm9uID0gMzMzO1xuICAgIHQuY2NlZGlsbGEgPSA0NDQ7XG4gICAgdC5aZG90YWNjZW50ID0gNjExO1xuICAgIHQuVGhvcm4gPSA1NTY7XG4gICAgdC5PbWFjcm9uID0gNzIyO1xuICAgIHQuUmFjdXRlID0gNjY3O1xuICAgIHQuU2FjdXRlID0gNTU2O1xuICAgIHQuZGNhcm9uID0gNTg4O1xuICAgIHQuVW1hY3JvbiA9IDcyMjtcbiAgICB0LnVyaW5nID0gNTAwO1xuICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDtcbiAgICB0Lk9ncmF2ZSA9IDcyMjtcbiAgICB0LkFncmF2ZSA9IDcyMjtcbiAgICB0LkFicmV2ZSA9IDcyMjtcbiAgICB0Lm11bHRpcGx5ID0gNTY0O1xuICAgIHQudWFjdXRlID0gNTAwO1xuICAgIHQuVGNhcm9uID0gNjExO1xuICAgIHQucGFydGlhbGRpZmYgPSA0NzY7XG4gICAgdC55ZGllcmVzaXMgPSA1MDA7XG4gICAgdC5OYWN1dGUgPSA3MjI7XG4gICAgdC5pY2lyY3VtZmxleCA9IDI3ODtcbiAgICB0LkVjaXJjdW1mbGV4ID0gNjExO1xuICAgIHQuYWRpZXJlc2lzID0gNDQ0O1xuICAgIHQuZWRpZXJlc2lzID0gNDQ0O1xuICAgIHQuY2FjdXRlID0gNDQ0O1xuICAgIHQubmFjdXRlID0gNTAwO1xuICAgIHQudW1hY3JvbiA9IDUwMDtcbiAgICB0Lk5jYXJvbiA9IDcyMjtcbiAgICB0LklhY3V0ZSA9IDMzMztcbiAgICB0LnBsdXNtaW51cyA9IDU2NDtcbiAgICB0LmJyb2tlbmJhciA9IDIwMDtcbiAgICB0LnJlZ2lzdGVyZWQgPSA3NjA7XG4gICAgdC5HYnJldmUgPSA3MjI7XG4gICAgdC5JZG90YWNjZW50ID0gMzMzO1xuICAgIHQuc3VtbWF0aW9uID0gNjAwO1xuICAgIHQuRWdyYXZlID0gNjExO1xuICAgIHQucmFjdXRlID0gMzMzO1xuICAgIHQub21hY3JvbiA9IDUwMDtcbiAgICB0LlphY3V0ZSA9IDYxMTtcbiAgICB0LlpjYXJvbiA9IDYxMTtcbiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTtcbiAgICB0LkV0aCA9IDcyMjtcbiAgICB0LkNjZWRpbGxhID0gNjY3O1xuICAgIHQubGNvbW1hYWNjZW50ID0gMjc4O1xuICAgIHQudGNhcm9uID0gMzI2O1xuICAgIHQuZW9nb25layA9IDQ0NDtcbiAgICB0LlVvZ29uZWsgPSA3MjI7XG4gICAgdC5BYWN1dGUgPSA3MjI7XG4gICAgdC5BZGllcmVzaXMgPSA3MjI7XG4gICAgdC5lZ3JhdmUgPSA0NDQ7XG4gICAgdC56YWN1dGUgPSA0NDQ7XG4gICAgdC5pb2dvbmVrID0gMjc4O1xuICAgIHQuT2FjdXRlID0gNzIyO1xuICAgIHQub2FjdXRlID0gNTAwO1xuICAgIHQuYW1hY3JvbiA9IDQ0NDtcbiAgICB0LnNhY3V0ZSA9IDM4OTtcbiAgICB0LmlkaWVyZXNpcyA9IDI3ODtcbiAgICB0Lk9jaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQuVWdyYXZlID0gNzIyO1xuICAgIHQuRGVsdGEgPSA2MTI7XG4gICAgdC50aG9ybiA9IDUwMDtcbiAgICB0LnR3b3N1cGVyaW9yID0gMzAwO1xuICAgIHQuT2RpZXJlc2lzID0gNzIyO1xuICAgIHQubXUgPSA1MDA7XG4gICAgdC5pZ3JhdmUgPSAyNzg7XG4gICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwO1xuICAgIHQuRW9nb25layA9IDYxMTtcbiAgICB0LmRjcm9hdCA9IDUwMDtcbiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7XG4gICAgdC5TY2VkaWxsYSA9IDU1NjtcbiAgICB0LmxjYXJvbiA9IDM0NDtcbiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LkxhY3V0ZSA9IDYxMTtcbiAgICB0LnRyYWRlbWFyayA9IDk4MDtcbiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7XG4gICAgdC5JZ3JhdmUgPSAzMzM7XG4gICAgdC5JbWFjcm9uID0gMzMzO1xuICAgIHQuTGNhcm9uID0gNjExO1xuICAgIHQub25laGFsZiA9IDc1MDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQubnRpbGRlID0gNTAwO1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDYxMTtcbiAgICB0LmVtYWNyb24gPSA0NDQ7XG4gICAgdC5nYnJldmUgPSA1MDA7XG4gICAgdC5vbmVxdWFydGVyID0gNzUwO1xuICAgIHQuU2Nhcm9uID0gNTU2O1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDUwMDtcbiAgICB0LkNjYXJvbiA9IDY2NztcbiAgICB0LnVncmF2ZSA9IDUwMDtcbiAgICB0LnJhZGljYWwgPSA0NTM7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7XG4gICAgdC5OdGlsZGUgPSA3MjI7XG4gICAgdC5vdGlsZGUgPSA1MDA7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA2Njc7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5BdGlsZGUgPSA3MjI7XG4gICAgdC5Bb2dvbmVrID0gNzIyO1xuICAgIHQuQXJpbmcgPSA3MjI7XG4gICAgdC5PdGlsZGUgPSA3MjI7XG4gICAgdC56ZG90YWNjZW50ID0gNDQ0O1xuICAgIHQuRWNhcm9uID0gNjExO1xuICAgIHQuSW9nb25layA9IDMzMztcbiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDtcbiAgICB0Lm1pbnVzID0gNTY0O1xuICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC5uY2Fyb24gPSA1MDA7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC5sb2dpY2Fsbm90ID0gNTY0O1xuICAgIHQub2RpZXJlc2lzID0gNTAwO1xuICAgIHQudWRpZXJlc2lzID0gNTAwO1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5ldGggPSA1MDA7XG4gICAgdC56Y2Fyb24gPSA0NDQ7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMwMDtcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTAwO1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0W1wiVGltZXMtQm9sZFwiXSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICAgIHQuc3BhY2UgPSAyNTA7XG4gICAgdC5leGNsYW0gPSAzMzM7XG4gICAgdC5xdW90ZWRibCA9IDU1NTtcbiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7XG4gICAgdC5kb2xsYXIgPSA1MDA7XG4gICAgdC5wZXJjZW50ID0gMTAwMDtcbiAgICB0LmFtcGVyc2FuZCA9IDgzMztcbiAgICB0LnF1b3RlcmlnaHQgPSAzMzM7XG4gICAgdC5wYXJlbmxlZnQgPSAzMzM7XG4gICAgdC5wYXJlbnJpZ2h0ID0gMzMzO1xuICAgIHQuYXN0ZXJpc2sgPSA1MDA7XG4gICAgdC5wbHVzID0gNTcwO1xuICAgIHQuY29tbWEgPSAyNTA7XG4gICAgdC5oeXBoZW4gPSAzMzM7XG4gICAgdC5wZXJpb2QgPSAyNTA7XG4gICAgdC5zbGFzaCA9IDI3ODtcbiAgICB0Lnplcm8gPSA1MDA7XG4gICAgdC5vbmUgPSA1MDA7XG4gICAgdC50d28gPSA1MDA7XG4gICAgdC50aHJlZSA9IDUwMDtcbiAgICB0LmZvdXIgPSA1MDA7XG4gICAgdC5maXZlID0gNTAwO1xuICAgIHQuc2l4ID0gNTAwO1xuICAgIHQuc2V2ZW4gPSA1MDA7XG4gICAgdC5laWdodCA9IDUwMDtcbiAgICB0Lm5pbmUgPSA1MDA7XG4gICAgdC5jb2xvbiA9IDMzMztcbiAgICB0LnNlbWljb2xvbiA9IDMzMztcbiAgICB0Lmxlc3MgPSA1NzA7XG4gICAgdC5lcXVhbCA9IDU3MDtcbiAgICB0LmdyZWF0ZXIgPSA1NzA7XG4gICAgdC5xdWVzdGlvbiA9IDUwMDtcbiAgICB0LmF0ID0gOTMwO1xuICAgIHQuQSA9IDcyMjtcbiAgICB0LkIgPSA2Njc7XG4gICAgdC5DID0gNzIyO1xuICAgIHQuRCA9IDcyMjtcbiAgICB0LkUgPSA2Njc7XG4gICAgdC5GID0gNjExO1xuICAgIHQuRyA9IDc3ODtcbiAgICB0LkggPSA3Nzg7XG4gICAgdC5JID0gMzg5O1xuICAgIHQuSiA9IDUwMDtcbiAgICB0LksgPSA3Nzg7XG4gICAgdC5MID0gNjY3O1xuICAgIHQuTSA9IDk0NDtcbiAgICB0Lk4gPSA3MjI7XG4gICAgdC5PID0gNzc4O1xuICAgIHQuUCA9IDYxMTtcbiAgICB0LlEgPSA3Nzg7XG4gICAgdC5SID0gNzIyO1xuICAgIHQuUyA9IDU1NjtcbiAgICB0LlQgPSA2Njc7XG4gICAgdC5VID0gNzIyO1xuICAgIHQuViA9IDcyMjtcbiAgICB0LlcgPSAxMDAwO1xuICAgIHQuWCA9IDcyMjtcbiAgICB0LlkgPSA3MjI7XG4gICAgdC5aID0gNjY3O1xuICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7XG4gICAgdC5iYWNrc2xhc2ggPSAyNzg7XG4gICAgdC5icmFja2V0cmlnaHQgPSAzMzM7XG4gICAgdC5hc2NpaWNpcmN1bSA9IDU4MTtcbiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7XG4gICAgdC5xdW90ZWxlZnQgPSAzMzM7XG4gICAgdC5hID0gNTAwO1xuICAgIHQuYiA9IDU1NjtcbiAgICB0LmMgPSA0NDQ7XG4gICAgdC5kID0gNTU2O1xuICAgIHQuZSA9IDQ0NDtcbiAgICB0LmYgPSAzMzM7XG4gICAgdC5nID0gNTAwO1xuICAgIHQuaCA9IDU1NjtcbiAgICB0LmkgPSAyNzg7XG4gICAgdC5qID0gMzMzO1xuICAgIHQuayA9IDU1NjtcbiAgICB0LmwgPSAyNzg7XG4gICAgdC5tID0gODMzO1xuICAgIHQubiA9IDU1NjtcbiAgICB0Lm8gPSA1MDA7XG4gICAgdC5wID0gNTU2O1xuICAgIHQucSA9IDU1NjtcbiAgICB0LnIgPSA0NDQ7XG4gICAgdC5zID0gMzg5O1xuICAgIHQudCA9IDMzMztcbiAgICB0LnUgPSA1NTY7XG4gICAgdC52ID0gNTAwO1xuICAgIHQudyA9IDcyMjtcbiAgICB0LnggPSA1MDA7XG4gICAgdC55ID0gNTAwO1xuICAgIHQueiA9IDQ0NDtcbiAgICB0LmJyYWNlbGVmdCA9IDM5NDtcbiAgICB0LmJhciA9IDIyMDtcbiAgICB0LmJyYWNlcmlnaHQgPSAzOTQ7XG4gICAgdC5hc2NpaXRpbGRlID0gNTIwO1xuICAgIHQuZXhjbGFtZG93biA9IDMzMztcbiAgICB0LmNlbnQgPSA1MDA7XG4gICAgdC5zdGVybGluZyA9IDUwMDtcbiAgICB0LmZyYWN0aW9uID0gMTY3O1xuICAgIHQueWVuID0gNTAwO1xuICAgIHQuZmxvcmluID0gNTAwO1xuICAgIHQuc2VjdGlvbiA9IDUwMDtcbiAgICB0LmN1cnJlbmN5ID0gNTAwO1xuICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7XG4gICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7XG4gICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwO1xuICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMztcbiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzO1xuICAgIHQuZmkgPSA1NTY7XG4gICAgdC5mbCA9IDU1NjtcbiAgICB0LmVuZGFzaCA9IDUwMDtcbiAgICB0LmRhZ2dlciA9IDUwMDtcbiAgICB0LmRhZ2dlcmRibCA9IDUwMDtcbiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwO1xuICAgIHQucGFyYWdyYXBoID0gNTQwO1xuICAgIHQuYnVsbGV0ID0gMzUwO1xuICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7XG4gICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7XG4gICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwO1xuICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7XG4gICAgdC5lbGxpcHNpcyA9IDEwMDA7XG4gICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7XG4gICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7XG4gICAgdC5ncmF2ZSA9IDMzMztcbiAgICB0LmFjdXRlID0gMzMzO1xuICAgIHQuY2lyY3VtZmxleCA9IDMzMztcbiAgICB0LnRpbGRlID0gMzMzO1xuICAgIHQubWFjcm9uID0gMzMzO1xuICAgIHQuYnJldmUgPSAzMzM7XG4gICAgdC5kb3RhY2NlbnQgPSAzMzM7XG4gICAgdC5kaWVyZXNpcyA9IDMzMztcbiAgICB0LnJpbmcgPSAzMzM7XG4gICAgdC5jZWRpbGxhID0gMzMzO1xuICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzO1xuICAgIHQub2dvbmVrID0gMzMzO1xuICAgIHQuY2Fyb24gPSAzMzM7XG4gICAgdC5lbWRhc2ggPSAxMDAwO1xuICAgIHQuQUUgPSAxMDAwO1xuICAgIHQub3JkZmVtaW5pbmUgPSAzMDA7XG4gICAgdC5Mc2xhc2ggPSA2Njc7XG4gICAgdC5Pc2xhc2ggPSA3Nzg7XG4gICAgdC5PRSA9IDEwMDA7XG4gICAgdC5vcmRtYXNjdWxpbmUgPSAzMzA7XG4gICAgdC5hZSA9IDcyMjtcbiAgICB0LmRvdGxlc3NpID0gMjc4O1xuICAgIHQubHNsYXNoID0gMjc4O1xuICAgIHQub3NsYXNoID0gNTAwO1xuICAgIHQub2UgPSA3MjI7XG4gICAgdC5nZXJtYW5kYmxzID0gNTU2O1xuICAgIHQuSWRpZXJlc2lzID0gMzg5O1xuICAgIHQuZWFjdXRlID0gNDQ0O1xuICAgIHQuYWJyZXZlID0gNTAwO1xuICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjtcbiAgICB0LmVjYXJvbiA9IDQ0NDtcbiAgICB0LllkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmRpdmlkZSA9IDU3MDtcbiAgICB0LllhY3V0ZSA9IDcyMjtcbiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQuYWFjdXRlID0gNTAwO1xuICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7XG4gICAgdC55YWN1dGUgPSA1MDA7XG4gICAgdC5zY29tbWFhY2NlbnQgPSAzODk7XG4gICAgdC5lY2lyY3VtZmxleCA9IDQ0NDtcbiAgICB0LlVyaW5nID0gNzIyO1xuICAgIHQuVWRpZXJlc2lzID0gNzIyO1xuICAgIHQuYW9nb25layA9IDUwMDtcbiAgICB0LlVhY3V0ZSA9IDcyMjtcbiAgICB0LnVvZ29uZWsgPSA1NTY7XG4gICAgdC5FZGllcmVzaXMgPSA2Njc7XG4gICAgdC5EY3JvYXQgPSA3MjI7XG4gICAgdC5jb21tYWFjY2VudCA9IDI1MDtcbiAgICB0LmNvcHlyaWdodCA9IDc0NztcbiAgICB0LkVtYWNyb24gPSA2Njc7XG4gICAgdC5jY2Fyb24gPSA0NDQ7XG4gICAgdC5hcmluZyA9IDUwMDtcbiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LmxhY3V0ZSA9IDI3ODtcbiAgICB0LmFncmF2ZSA9IDUwMDtcbiAgICB0LlRjb21tYWFjY2VudCA9IDY2NztcbiAgICB0LkNhY3V0ZSA9IDcyMjtcbiAgICB0LmF0aWxkZSA9IDUwMDtcbiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7XG4gICAgdC5zY2Fyb24gPSAzODk7XG4gICAgdC5zY2VkaWxsYSA9IDM4OTtcbiAgICB0LmlhY3V0ZSA9IDI3ODtcbiAgICB0LmxvemVuZ2UgPSA0OTQ7XG4gICAgdC5SY2Fyb24gPSA3MjI7XG4gICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7XG4gICAgdC51Y2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQuQW1hY3JvbiA9IDcyMjtcbiAgICB0LnJjYXJvbiA9IDQ0NDtcbiAgICB0LmNjZWRpbGxhID0gNDQ0O1xuICAgIHQuWmRvdGFjY2VudCA9IDY2NztcbiAgICB0LlRob3JuID0gNjExO1xuICAgIHQuT21hY3JvbiA9IDc3ODtcbiAgICB0LlJhY3V0ZSA9IDcyMjtcbiAgICB0LlNhY3V0ZSA9IDU1NjtcbiAgICB0LmRjYXJvbiA9IDY3MjtcbiAgICB0LlVtYWNyb24gPSA3MjI7XG4gICAgdC51cmluZyA9IDU1NjtcbiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7XG4gICAgdC5PZ3JhdmUgPSA3Nzg7XG4gICAgdC5BZ3JhdmUgPSA3MjI7XG4gICAgdC5BYnJldmUgPSA3MjI7XG4gICAgdC5tdWx0aXBseSA9IDU3MDtcbiAgICB0LnVhY3V0ZSA9IDU1NjtcbiAgICB0LlRjYXJvbiA9IDY2NztcbiAgICB0LnBhcnRpYWxkaWZmID0gNDk0O1xuICAgIHQueWRpZXJlc2lzID0gNTAwO1xuICAgIHQuTmFjdXRlID0gNzIyO1xuICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7XG4gICAgdC5FY2lyY3VtZmxleCA9IDY2NztcbiAgICB0LmFkaWVyZXNpcyA9IDUwMDtcbiAgICB0LmVkaWVyZXNpcyA9IDQ0NDtcbiAgICB0LmNhY3V0ZSA9IDQ0NDtcbiAgICB0Lm5hY3V0ZSA9IDU1NjtcbiAgICB0LnVtYWNyb24gPSA1NTY7XG4gICAgdC5OY2Fyb24gPSA3MjI7XG4gICAgdC5JYWN1dGUgPSAzODk7XG4gICAgdC5wbHVzbWludXMgPSA1NzA7XG4gICAgdC5icm9rZW5iYXIgPSAyMjA7XG4gICAgdC5yZWdpc3RlcmVkID0gNzQ3O1xuICAgIHQuR2JyZXZlID0gNzc4O1xuICAgIHQuSWRvdGFjY2VudCA9IDM4OTtcbiAgICB0LnN1bW1hdGlvbiA9IDYwMDtcbiAgICB0LkVncmF2ZSA9IDY2NztcbiAgICB0LnJhY3V0ZSA9IDQ0NDtcbiAgICB0Lm9tYWNyb24gPSA1MDA7XG4gICAgdC5aYWN1dGUgPSA2Njc7XG4gICAgdC5aY2Fyb24gPSA2Njc7XG4gICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7XG4gICAgdC5FdGggPSA3MjI7XG4gICAgdC5DY2VkaWxsYSA9IDcyMjtcbiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODtcbiAgICB0LnRjYXJvbiA9IDQxNjtcbiAgICB0LmVvZ29uZWsgPSA0NDQ7XG4gICAgdC5Vb2dvbmVrID0gNzIyO1xuICAgIHQuQWFjdXRlID0gNzIyO1xuICAgIHQuQWRpZXJlc2lzID0gNzIyO1xuICAgIHQuZWdyYXZlID0gNDQ0O1xuICAgIHQuemFjdXRlID0gNDQ0O1xuICAgIHQuaW9nb25layA9IDI3ODtcbiAgICB0Lk9hY3V0ZSA9IDc3ODtcbiAgICB0Lm9hY3V0ZSA9IDUwMDtcbiAgICB0LmFtYWNyb24gPSA1MDA7XG4gICAgdC5zYWN1dGUgPSAzODk7XG4gICAgdC5pZGllcmVzaXMgPSAyNzg7XG4gICAgdC5PY2lyY3VtZmxleCA9IDc3ODtcbiAgICB0LlVncmF2ZSA9IDcyMjtcbiAgICB0LkRlbHRhID0gNjEyO1xuICAgIHQudGhvcm4gPSA1NTY7XG4gICAgdC50d29zdXBlcmlvciA9IDMwMDtcbiAgICB0Lk9kaWVyZXNpcyA9IDc3ODtcbiAgICB0Lm11ID0gNTU2O1xuICAgIHQuaWdyYXZlID0gMjc4O1xuICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDtcbiAgICB0LkVvZ29uZWsgPSA2Njc7XG4gICAgdC5kY3JvYXQgPSA1NTY7XG4gICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwO1xuICAgIHQuU2NlZGlsbGEgPSA1NTY7XG4gICAgdC5sY2Fyb24gPSAzOTQ7XG4gICAgdC5LY29tbWFhY2NlbnQgPSA3Nzg7XG4gICAgdC5MYWN1dGUgPSA2Njc7XG4gICAgdC50cmFkZW1hcmsgPSAxMDAwO1xuICAgIHQuZWRvdGFjY2VudCA9IDQ0NDtcbiAgICB0LklncmF2ZSA9IDM4OTtcbiAgICB0LkltYWNyb24gPSAzODk7XG4gICAgdC5MY2Fyb24gPSA2Njc7XG4gICAgdC5vbmVoYWxmID0gNzUwO1xuICAgIHQubGVzc2VxdWFsID0gNTQ5O1xuICAgIHQub2NpcmN1bWZsZXggPSA1MDA7XG4gICAgdC5udGlsZGUgPSA1NTY7XG4gICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyO1xuICAgIHQuRWFjdXRlID0gNjY3O1xuICAgIHQuZW1hY3JvbiA9IDQ0NDtcbiAgICB0LmdicmV2ZSA9IDUwMDtcbiAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7XG4gICAgdC5TY2Fyb24gPSA1NTY7XG4gICAgdC5TY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4O1xuICAgIHQuZGVncmVlID0gNDAwO1xuICAgIHQub2dyYXZlID0gNTAwO1xuICAgIHQuQ2Nhcm9uID0gNzIyO1xuICAgIHQudWdyYXZlID0gNTU2O1xuICAgIHQucmFkaWNhbCA9IDU0OTtcbiAgICB0LkRjYXJvbiA9IDcyMjtcbiAgICB0LnJjb21tYWFjY2VudCA9IDQ0NDtcbiAgICB0Lk50aWxkZSA9IDcyMjtcbiAgICB0Lm90aWxkZSA9IDUwMDtcbiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0Lkxjb21tYWFjY2VudCA9IDY2NztcbiAgICB0LkF0aWxkZSA9IDcyMjtcbiAgICB0LkFvZ29uZWsgPSA3MjI7XG4gICAgdC5BcmluZyA9IDcyMjtcbiAgICB0Lk90aWxkZSA9IDc3ODtcbiAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7XG4gICAgdC5FY2Fyb24gPSA2Njc7XG4gICAgdC5Jb2dvbmVrID0gMzg5O1xuICAgIHQua2NvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQubWludXMgPSA1NzA7XG4gICAgdC5JY2lyY3VtZmxleCA9IDM4OTtcbiAgICB0Lm5jYXJvbiA9IDU1NjtcbiAgICB0LnRjb21tYWFjY2VudCA9IDMzMztcbiAgICB0LmxvZ2ljYWxub3QgPSA1NzA7XG4gICAgdC5vZGllcmVzaXMgPSA1MDA7XG4gICAgdC51ZGllcmVzaXMgPSA1NTY7XG4gICAgdC5ub3RlcXVhbCA9IDU0OTtcbiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDtcbiAgICB0LmV0aCA9IDUwMDtcbiAgICB0LnpjYXJvbiA9IDQ0NDtcbiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjtcbiAgICB0Lm9uZXN1cGVyaW9yID0gMzAwO1xuICAgIHQuaW1hY3JvbiA9IDI3ODtcbiAgICB0LkV1cm8gPSA1MDA7XG4gIH0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRbXCJUaW1lcy1Cb2xkSXRhbGljXCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgdC5zcGFjZSA9IDI1MDtcbiAgICB0LmV4Y2xhbSA9IDM4OTtcbiAgICB0LnF1b3RlZGJsID0gNTU1O1xuICAgIHQubnVtYmVyc2lnbiA9IDUwMDtcbiAgICB0LmRvbGxhciA9IDUwMDtcbiAgICB0LnBlcmNlbnQgPSA4MzM7XG4gICAgdC5hbXBlcnNhbmQgPSA3Nzg7XG4gICAgdC5xdW90ZXJpZ2h0ID0gMzMzO1xuICAgIHQucGFyZW5sZWZ0ID0gMzMzO1xuICAgIHQucGFyZW5yaWdodCA9IDMzMztcbiAgICB0LmFzdGVyaXNrID0gNTAwO1xuICAgIHQucGx1cyA9IDU3MDtcbiAgICB0LmNvbW1hID0gMjUwO1xuICAgIHQuaHlwaGVuID0gMzMzO1xuICAgIHQucGVyaW9kID0gMjUwO1xuICAgIHQuc2xhc2ggPSAyNzg7XG4gICAgdC56ZXJvID0gNTAwO1xuICAgIHQub25lID0gNTAwO1xuICAgIHQudHdvID0gNTAwO1xuICAgIHQudGhyZWUgPSA1MDA7XG4gICAgdC5mb3VyID0gNTAwO1xuICAgIHQuZml2ZSA9IDUwMDtcbiAgICB0LnNpeCA9IDUwMDtcbiAgICB0LnNldmVuID0gNTAwO1xuICAgIHQuZWlnaHQgPSA1MDA7XG4gICAgdC5uaW5lID0gNTAwO1xuICAgIHQuY29sb24gPSAzMzM7XG4gICAgdC5zZW1pY29sb24gPSAzMzM7XG4gICAgdC5sZXNzID0gNTcwO1xuICAgIHQuZXF1YWwgPSA1NzA7XG4gICAgdC5ncmVhdGVyID0gNTcwO1xuICAgIHQucXVlc3Rpb24gPSA1MDA7XG4gICAgdC5hdCA9IDgzMjtcbiAgICB0LkEgPSA2Njc7XG4gICAgdC5CID0gNjY3O1xuICAgIHQuQyA9IDY2NztcbiAgICB0LkQgPSA3MjI7XG4gICAgdC5FID0gNjY3O1xuICAgIHQuRiA9IDY2NztcbiAgICB0LkcgPSA3MjI7XG4gICAgdC5IID0gNzc4O1xuICAgIHQuSSA9IDM4OTtcbiAgICB0LkogPSA1MDA7XG4gICAgdC5LID0gNjY3O1xuICAgIHQuTCA9IDYxMTtcbiAgICB0Lk0gPSA4ODk7XG4gICAgdC5OID0gNzIyO1xuICAgIHQuTyA9IDcyMjtcbiAgICB0LlAgPSA2MTE7XG4gICAgdC5RID0gNzIyO1xuICAgIHQuUiA9IDY2NztcbiAgICB0LlMgPSA1NTY7XG4gICAgdC5UID0gNjExO1xuICAgIHQuVSA9IDcyMjtcbiAgICB0LlYgPSA2Njc7XG4gICAgdC5XID0gODg5O1xuICAgIHQuWCA9IDY2NztcbiAgICB0LlkgPSA2MTE7XG4gICAgdC5aID0gNjExO1xuICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7XG4gICAgdC5iYWNrc2xhc2ggPSAyNzg7XG4gICAgdC5icmFja2V0cmlnaHQgPSAzMzM7XG4gICAgdC5hc2NpaWNpcmN1bSA9IDU3MDtcbiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7XG4gICAgdC5xdW90ZWxlZnQgPSAzMzM7XG4gICAgdC5hID0gNTAwO1xuICAgIHQuYiA9IDUwMDtcbiAgICB0LmMgPSA0NDQ7XG4gICAgdC5kID0gNTAwO1xuICAgIHQuZSA9IDQ0NDtcbiAgICB0LmYgPSAzMzM7XG4gICAgdC5nID0gNTAwO1xuICAgIHQuaCA9IDU1NjtcbiAgICB0LmkgPSAyNzg7XG4gICAgdC5qID0gMjc4O1xuICAgIHQuayA9IDUwMDtcbiAgICB0LmwgPSAyNzg7XG4gICAgdC5tID0gNzc4O1xuICAgIHQubiA9IDU1NjtcbiAgICB0Lm8gPSA1MDA7XG4gICAgdC5wID0gNTAwO1xuICAgIHQucSA9IDUwMDtcbiAgICB0LnIgPSAzODk7XG4gICAgdC5zID0gMzg5O1xuICAgIHQudCA9IDI3ODtcbiAgICB0LnUgPSA1NTY7XG4gICAgdC52ID0gNDQ0O1xuICAgIHQudyA9IDY2NztcbiAgICB0LnggPSA1MDA7XG4gICAgdC55ID0gNDQ0O1xuICAgIHQueiA9IDM4OTtcbiAgICB0LmJyYWNlbGVmdCA9IDM0ODtcbiAgICB0LmJhciA9IDIyMDtcbiAgICB0LmJyYWNlcmlnaHQgPSAzNDg7XG4gICAgdC5hc2NpaXRpbGRlID0gNTcwO1xuICAgIHQuZXhjbGFtZG93biA9IDM4OTtcbiAgICB0LmNlbnQgPSA1MDA7XG4gICAgdC5zdGVybGluZyA9IDUwMDtcbiAgICB0LmZyYWN0aW9uID0gMTY3O1xuICAgIHQueWVuID0gNTAwO1xuICAgIHQuZmxvcmluID0gNTAwO1xuICAgIHQuc2VjdGlvbiA9IDUwMDtcbiAgICB0LmN1cnJlbmN5ID0gNTAwO1xuICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7XG4gICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7XG4gICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwO1xuICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMztcbiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzO1xuICAgIHQuZmkgPSA1NTY7XG4gICAgdC5mbCA9IDU1NjtcbiAgICB0LmVuZGFzaCA9IDUwMDtcbiAgICB0LmRhZ2dlciA9IDUwMDtcbiAgICB0LmRhZ2dlcmRibCA9IDUwMDtcbiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwO1xuICAgIHQucGFyYWdyYXBoID0gNTAwO1xuICAgIHQuYnVsbGV0ID0gMzUwO1xuICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7XG4gICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7XG4gICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwO1xuICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7XG4gICAgdC5lbGxpcHNpcyA9IDEwMDA7XG4gICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7XG4gICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7XG4gICAgdC5ncmF2ZSA9IDMzMztcbiAgICB0LmFjdXRlID0gMzMzO1xuICAgIHQuY2lyY3VtZmxleCA9IDMzMztcbiAgICB0LnRpbGRlID0gMzMzO1xuICAgIHQubWFjcm9uID0gMzMzO1xuICAgIHQuYnJldmUgPSAzMzM7XG4gICAgdC5kb3RhY2NlbnQgPSAzMzM7XG4gICAgdC5kaWVyZXNpcyA9IDMzMztcbiAgICB0LnJpbmcgPSAzMzM7XG4gICAgdC5jZWRpbGxhID0gMzMzO1xuICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzO1xuICAgIHQub2dvbmVrID0gMzMzO1xuICAgIHQuY2Fyb24gPSAzMzM7XG4gICAgdC5lbWRhc2ggPSAxMDAwO1xuICAgIHQuQUUgPSA5NDQ7XG4gICAgdC5vcmRmZW1pbmluZSA9IDI2NjtcbiAgICB0LkxzbGFzaCA9IDYxMTtcbiAgICB0Lk9zbGFzaCA9IDcyMjtcbiAgICB0Lk9FID0gOTQ0O1xuICAgIHQub3JkbWFzY3VsaW5lID0gMzAwO1xuICAgIHQuYWUgPSA3MjI7XG4gICAgdC5kb3RsZXNzaSA9IDI3ODtcbiAgICB0LmxzbGFzaCA9IDI3ODtcbiAgICB0Lm9zbGFzaCA9IDUwMDtcbiAgICB0Lm9lID0gNzIyO1xuICAgIHQuZ2VybWFuZGJscyA9IDUwMDtcbiAgICB0LklkaWVyZXNpcyA9IDM4OTtcbiAgICB0LmVhY3V0ZSA9IDQ0NDtcbiAgICB0LmFicmV2ZSA9IDUwMDtcbiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7XG4gICAgdC5lY2Fyb24gPSA0NDQ7XG4gICAgdC5ZZGllcmVzaXMgPSA2MTE7XG4gICAgdC5kaXZpZGUgPSA1NzA7XG4gICAgdC5ZYWN1dGUgPSA2MTE7XG4gICAgdC5BY2lyY3VtZmxleCA9IDY2NztcbiAgICB0LmFhY3V0ZSA9IDUwMDtcbiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQueWFjdXRlID0gNDQ0O1xuICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5O1xuICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7XG4gICAgdC5VcmluZyA9IDcyMjtcbiAgICB0LlVkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmFvZ29uZWsgPSA1MDA7XG4gICAgdC5VYWN1dGUgPSA3MjI7XG4gICAgdC51b2dvbmVrID0gNTU2O1xuICAgIHQuRWRpZXJlc2lzID0gNjY3O1xuICAgIHQuRGNyb2F0ID0gNzIyO1xuICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7XG4gICAgdC5jb3B5cmlnaHQgPSA3NDc7XG4gICAgdC5FbWFjcm9uID0gNjY3O1xuICAgIHQuY2Nhcm9uID0gNDQ0O1xuICAgIHQuYXJpbmcgPSA1MDA7XG4gICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5sYWN1dGUgPSAyNzg7XG4gICAgdC5hZ3JhdmUgPSA1MDA7XG4gICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5DYWN1dGUgPSA2Njc7XG4gICAgdC5hdGlsZGUgPSA1MDA7XG4gICAgdC5FZG90YWNjZW50ID0gNjY3O1xuICAgIHQuc2Nhcm9uID0gMzg5O1xuICAgIHQuc2NlZGlsbGEgPSAzODk7XG4gICAgdC5pYWN1dGUgPSAyNzg7XG4gICAgdC5sb3plbmdlID0gNDk0O1xuICAgIHQuUmNhcm9uID0gNjY3O1xuICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQudWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5hY2lyY3VtZmxleCA9IDUwMDtcbiAgICB0LkFtYWNyb24gPSA2Njc7XG4gICAgdC5yY2Fyb24gPSAzODk7XG4gICAgdC5jY2VkaWxsYSA9IDQ0NDtcbiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7XG4gICAgdC5UaG9ybiA9IDYxMTtcbiAgICB0Lk9tYWNyb24gPSA3MjI7XG4gICAgdC5SYWN1dGUgPSA2Njc7XG4gICAgdC5TYWN1dGUgPSA1NTY7XG4gICAgdC5kY2Fyb24gPSA2MDg7XG4gICAgdC5VbWFjcm9uID0gNzIyO1xuICAgIHQudXJpbmcgPSA1NTY7XG4gICAgdC50aHJlZXN1cGVyaW9yID0gMzAwO1xuICAgIHQuT2dyYXZlID0gNzIyO1xuICAgIHQuQWdyYXZlID0gNjY3O1xuICAgIHQuQWJyZXZlID0gNjY3O1xuICAgIHQubXVsdGlwbHkgPSA1NzA7XG4gICAgdC51YWN1dGUgPSA1NTY7XG4gICAgdC5UY2Fyb24gPSA2MTE7XG4gICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDtcbiAgICB0LnlkaWVyZXNpcyA9IDQ0NDtcbiAgICB0Lk5hY3V0ZSA9IDcyMjtcbiAgICB0LmljaXJjdW1mbGV4ID0gMjc4O1xuICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7XG4gICAgdC5hZGllcmVzaXMgPSA1MDA7XG4gICAgdC5lZGllcmVzaXMgPSA0NDQ7XG4gICAgdC5jYWN1dGUgPSA0NDQ7XG4gICAgdC5uYWN1dGUgPSA1NTY7XG4gICAgdC51bWFjcm9uID0gNTU2O1xuICAgIHQuTmNhcm9uID0gNzIyO1xuICAgIHQuSWFjdXRlID0gMzg5O1xuICAgIHQucGx1c21pbnVzID0gNTcwO1xuICAgIHQuYnJva2VuYmFyID0gMjIwO1xuICAgIHQucmVnaXN0ZXJlZCA9IDc0NztcbiAgICB0LkdicmV2ZSA9IDcyMjtcbiAgICB0Lklkb3RhY2NlbnQgPSAzODk7XG4gICAgdC5zdW1tYXRpb24gPSA2MDA7XG4gICAgdC5FZ3JhdmUgPSA2Njc7XG4gICAgdC5yYWN1dGUgPSAzODk7XG4gICAgdC5vbWFjcm9uID0gNTAwO1xuICAgIHQuWmFjdXRlID0gNjExO1xuICAgIHQuWmNhcm9uID0gNjExO1xuICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5O1xuICAgIHQuRXRoID0gNzIyO1xuICAgIHQuQ2NlZGlsbGEgPSA2Njc7XG4gICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC50Y2Fyb24gPSAzNjY7XG4gICAgdC5lb2dvbmVrID0gNDQ0O1xuICAgIHQuVW9nb25layA9IDcyMjtcbiAgICB0LkFhY3V0ZSA9IDY2NztcbiAgICB0LkFkaWVyZXNpcyA9IDY2NztcbiAgICB0LmVncmF2ZSA9IDQ0NDtcbiAgICB0LnphY3V0ZSA9IDM4OTtcbiAgICB0LmlvZ29uZWsgPSAyNzg7XG4gICAgdC5PYWN1dGUgPSA3MjI7XG4gICAgdC5vYWN1dGUgPSA1MDA7XG4gICAgdC5hbWFjcm9uID0gNTAwO1xuICAgIHQuc2FjdXRlID0gMzg5O1xuICAgIHQuaWRpZXJlc2lzID0gMjc4O1xuICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7XG4gICAgdC5VZ3JhdmUgPSA3MjI7XG4gICAgdC5EZWx0YSA9IDYxMjtcbiAgICB0LnRob3JuID0gNTAwO1xuICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7XG4gICAgdC5PZGllcmVzaXMgPSA3MjI7XG4gICAgdC5tdSA9IDU3NjtcbiAgICB0LmlncmF2ZSA9IDI3ODtcbiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7XG4gICAgdC5Fb2dvbmVrID0gNjY3O1xuICAgIHQuZGNyb2F0ID0gNTAwO1xuICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDtcbiAgICB0LlNjZWRpbGxhID0gNTU2O1xuICAgIHQubGNhcm9uID0gMzgyO1xuICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQuTGFjdXRlID0gNjExO1xuICAgIHQudHJhZGVtYXJrID0gMTAwMDtcbiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7XG4gICAgdC5JZ3JhdmUgPSAzODk7XG4gICAgdC5JbWFjcm9uID0gMzg5O1xuICAgIHQuTGNhcm9uID0gNjExO1xuICAgIHQub25laGFsZiA9IDc1MDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQubnRpbGRlID0gNTU2O1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDY2NztcbiAgICB0LmVtYWNyb24gPSA0NDQ7XG4gICAgdC5nYnJldmUgPSA1MDA7XG4gICAgdC5vbmVxdWFydGVyID0gNzUwO1xuICAgIHQuU2Nhcm9uID0gNTU2O1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDUwMDtcbiAgICB0LkNjYXJvbiA9IDY2NztcbiAgICB0LnVncmF2ZSA9IDU1NjtcbiAgICB0LnJhZGljYWwgPSA1NDk7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzODk7XG4gICAgdC5OdGlsZGUgPSA3MjI7XG4gICAgdC5vdGlsZGUgPSA1MDA7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA2Njc7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5BdGlsZGUgPSA2Njc7XG4gICAgdC5Bb2dvbmVrID0gNjY3O1xuICAgIHQuQXJpbmcgPSA2Njc7XG4gICAgdC5PdGlsZGUgPSA3MjI7XG4gICAgdC56ZG90YWNjZW50ID0gMzg5O1xuICAgIHQuRWNhcm9uID0gNjY3O1xuICAgIHQuSW9nb25layA9IDM4OTtcbiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDtcbiAgICB0Lm1pbnVzID0gNjA2O1xuICAgIHQuSWNpcmN1bWZsZXggPSAzODk7XG4gICAgdC5uY2Fyb24gPSA1NTY7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC5sb2dpY2Fsbm90ID0gNjA2O1xuICAgIHQub2RpZXJlc2lzID0gNTAwO1xuICAgIHQudWRpZXJlc2lzID0gNTU2O1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5ldGggPSA1MDA7XG4gICAgdC56Y2Fyb24gPSAzODk7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMwMDtcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTAwO1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0W1wiVGltZXMtSXRhbGljXCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgdC5zcGFjZSA9IDI1MDtcbiAgICB0LmV4Y2xhbSA9IDMzMztcbiAgICB0LnF1b3RlZGJsID0gNDIwO1xuICAgIHQubnVtYmVyc2lnbiA9IDUwMDtcbiAgICB0LmRvbGxhciA9IDUwMDtcbiAgICB0LnBlcmNlbnQgPSA4MzM7XG4gICAgdC5hbXBlcnNhbmQgPSA3Nzg7XG4gICAgdC5xdW90ZXJpZ2h0ID0gMzMzO1xuICAgIHQucGFyZW5sZWZ0ID0gMzMzO1xuICAgIHQucGFyZW5yaWdodCA9IDMzMztcbiAgICB0LmFzdGVyaXNrID0gNTAwO1xuICAgIHQucGx1cyA9IDY3NTtcbiAgICB0LmNvbW1hID0gMjUwO1xuICAgIHQuaHlwaGVuID0gMzMzO1xuICAgIHQucGVyaW9kID0gMjUwO1xuICAgIHQuc2xhc2ggPSAyNzg7XG4gICAgdC56ZXJvID0gNTAwO1xuICAgIHQub25lID0gNTAwO1xuICAgIHQudHdvID0gNTAwO1xuICAgIHQudGhyZWUgPSA1MDA7XG4gICAgdC5mb3VyID0gNTAwO1xuICAgIHQuZml2ZSA9IDUwMDtcbiAgICB0LnNpeCA9IDUwMDtcbiAgICB0LnNldmVuID0gNTAwO1xuICAgIHQuZWlnaHQgPSA1MDA7XG4gICAgdC5uaW5lID0gNTAwO1xuICAgIHQuY29sb24gPSAzMzM7XG4gICAgdC5zZW1pY29sb24gPSAzMzM7XG4gICAgdC5sZXNzID0gNjc1O1xuICAgIHQuZXF1YWwgPSA2NzU7XG4gICAgdC5ncmVhdGVyID0gNjc1O1xuICAgIHQucXVlc3Rpb24gPSA1MDA7XG4gICAgdC5hdCA9IDkyMDtcbiAgICB0LkEgPSA2MTE7XG4gICAgdC5CID0gNjExO1xuICAgIHQuQyA9IDY2NztcbiAgICB0LkQgPSA3MjI7XG4gICAgdC5FID0gNjExO1xuICAgIHQuRiA9IDYxMTtcbiAgICB0LkcgPSA3MjI7XG4gICAgdC5IID0gNzIyO1xuICAgIHQuSSA9IDMzMztcbiAgICB0LkogPSA0NDQ7XG4gICAgdC5LID0gNjY3O1xuICAgIHQuTCA9IDU1NjtcbiAgICB0Lk0gPSA4MzM7XG4gICAgdC5OID0gNjY3O1xuICAgIHQuTyA9IDcyMjtcbiAgICB0LlAgPSA2MTE7XG4gICAgdC5RID0gNzIyO1xuICAgIHQuUiA9IDYxMTtcbiAgICB0LlMgPSA1MDA7XG4gICAgdC5UID0gNTU2O1xuICAgIHQuVSA9IDcyMjtcbiAgICB0LlYgPSA2MTE7XG4gICAgdC5XID0gODMzO1xuICAgIHQuWCA9IDYxMTtcbiAgICB0LlkgPSA1NTY7XG4gICAgdC5aID0gNTU2O1xuICAgIHQuYnJhY2tldGxlZnQgPSAzODk7XG4gICAgdC5iYWNrc2xhc2ggPSAyNzg7XG4gICAgdC5icmFja2V0cmlnaHQgPSAzODk7XG4gICAgdC5hc2NpaWNpcmN1bSA9IDQyMjtcbiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7XG4gICAgdC5xdW90ZWxlZnQgPSAzMzM7XG4gICAgdC5hID0gNTAwO1xuICAgIHQuYiA9IDUwMDtcbiAgICB0LmMgPSA0NDQ7XG4gICAgdC5kID0gNTAwO1xuICAgIHQuZSA9IDQ0NDtcbiAgICB0LmYgPSAyNzg7XG4gICAgdC5nID0gNTAwO1xuICAgIHQuaCA9IDUwMDtcbiAgICB0LmkgPSAyNzg7XG4gICAgdC5qID0gMjc4O1xuICAgIHQuayA9IDQ0NDtcbiAgICB0LmwgPSAyNzg7XG4gICAgdC5tID0gNzIyO1xuICAgIHQubiA9IDUwMDtcbiAgICB0Lm8gPSA1MDA7XG4gICAgdC5wID0gNTAwO1xuICAgIHQucSA9IDUwMDtcbiAgICB0LnIgPSAzODk7XG4gICAgdC5zID0gMzg5O1xuICAgIHQudCA9IDI3ODtcbiAgICB0LnUgPSA1MDA7XG4gICAgdC52ID0gNDQ0O1xuICAgIHQudyA9IDY2NztcbiAgICB0LnggPSA0NDQ7XG4gICAgdC55ID0gNDQ0O1xuICAgIHQueiA9IDM4OTtcbiAgICB0LmJyYWNlbGVmdCA9IDQwMDtcbiAgICB0LmJhciA9IDI3NTtcbiAgICB0LmJyYWNlcmlnaHQgPSA0MDA7XG4gICAgdC5hc2NpaXRpbGRlID0gNTQxO1xuICAgIHQuZXhjbGFtZG93biA9IDM4OTtcbiAgICB0LmNlbnQgPSA1MDA7XG4gICAgdC5zdGVybGluZyA9IDUwMDtcbiAgICB0LmZyYWN0aW9uID0gMTY3O1xuICAgIHQueWVuID0gNTAwO1xuICAgIHQuZmxvcmluID0gNTAwO1xuICAgIHQuc2VjdGlvbiA9IDUwMDtcbiAgICB0LmN1cnJlbmN5ID0gNTAwO1xuICAgIHQucXVvdGVzaW5nbGUgPSAyMTQ7XG4gICAgdC5xdW90ZWRibGxlZnQgPSA1NTY7XG4gICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwO1xuICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMztcbiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzO1xuICAgIHQuZmkgPSA1MDA7XG4gICAgdC5mbCA9IDUwMDtcbiAgICB0LmVuZGFzaCA9IDUwMDtcbiAgICB0LmRhZ2dlciA9IDUwMDtcbiAgICB0LmRhZ2dlcmRibCA9IDUwMDtcbiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwO1xuICAgIHQucGFyYWdyYXBoID0gNTIzO1xuICAgIHQuYnVsbGV0ID0gMzUwO1xuICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7XG4gICAgdC5xdW90ZWRibGJhc2UgPSA1NTY7XG4gICAgdC5xdW90ZWRibHJpZ2h0ID0gNTU2O1xuICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7XG4gICAgdC5lbGxpcHNpcyA9IDg4OTtcbiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDtcbiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDtcbiAgICB0LmdyYXZlID0gMzMzO1xuICAgIHQuYWN1dGUgPSAzMzM7XG4gICAgdC5jaXJjdW1mbGV4ID0gMzMzO1xuICAgIHQudGlsZGUgPSAzMzM7XG4gICAgdC5tYWNyb24gPSAzMzM7XG4gICAgdC5icmV2ZSA9IDMzMztcbiAgICB0LmRvdGFjY2VudCA9IDMzMztcbiAgICB0LmRpZXJlc2lzID0gMzMzO1xuICAgIHQucmluZyA9IDMzMztcbiAgICB0LmNlZGlsbGEgPSAzMzM7XG4gICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7XG4gICAgdC5vZ29uZWsgPSAzMzM7XG4gICAgdC5jYXJvbiA9IDMzMztcbiAgICB0LmVtZGFzaCA9IDg4OTtcbiAgICB0LkFFID0gODg5O1xuICAgIHQub3JkZmVtaW5pbmUgPSAyNzY7XG4gICAgdC5Mc2xhc2ggPSA1NTY7XG4gICAgdC5Pc2xhc2ggPSA3MjI7XG4gICAgdC5PRSA9IDk0NDtcbiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDtcbiAgICB0LmFlID0gNjY3O1xuICAgIHQuZG90bGVzc2kgPSAyNzg7XG4gICAgdC5sc2xhc2ggPSAyNzg7XG4gICAgdC5vc2xhc2ggPSA1MDA7XG4gICAgdC5vZSA9IDY2NztcbiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7XG4gICAgdC5JZGllcmVzaXMgPSAzMzM7XG4gICAgdC5lYWN1dGUgPSA0NDQ7XG4gICAgdC5hYnJldmUgPSA1MDA7XG4gICAgdC51aHVuZ2FydW1sYXV0ID0gNTAwO1xuICAgIHQuZWNhcm9uID0gNDQ0O1xuICAgIHQuWWRpZXJlc2lzID0gNTU2O1xuICAgIHQuZGl2aWRlID0gNjc1O1xuICAgIHQuWWFjdXRlID0gNTU2O1xuICAgIHQuQWNpcmN1bWZsZXggPSA2MTE7XG4gICAgdC5hYWN1dGUgPSA1MDA7XG4gICAgdC5VY2lyY3VtZmxleCA9IDcyMjtcbiAgICB0LnlhY3V0ZSA9IDQ0NDtcbiAgICB0LnNjb21tYWFjY2VudCA9IDM4OTtcbiAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0O1xuICAgIHQuVXJpbmcgPSA3MjI7XG4gICAgdC5VZGllcmVzaXMgPSA3MjI7XG4gICAgdC5hb2dvbmVrID0gNTAwO1xuICAgIHQuVWFjdXRlID0gNzIyO1xuICAgIHQudW9nb25layA9IDUwMDtcbiAgICB0LkVkaWVyZXNpcyA9IDYxMTtcbiAgICB0LkRjcm9hdCA9IDcyMjtcbiAgICB0LmNvbW1hYWNjZW50ID0gMjUwO1xuICAgIHQuY29weXJpZ2h0ID0gNzYwO1xuICAgIHQuRW1hY3JvbiA9IDYxMTtcbiAgICB0LmNjYXJvbiA9IDQ0NDtcbiAgICB0LmFyaW5nID0gNTAwO1xuICAgIHQuTmNvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQubGFjdXRlID0gMjc4O1xuICAgIHQuYWdyYXZlID0gNTAwO1xuICAgIHQuVGNvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQuQ2FjdXRlID0gNjY3O1xuICAgIHQuYXRpbGRlID0gNTAwO1xuICAgIHQuRWRvdGFjY2VudCA9IDYxMTtcbiAgICB0LnNjYXJvbiA9IDM4OTtcbiAgICB0LnNjZWRpbGxhID0gMzg5O1xuICAgIHQuaWFjdXRlID0gMjc4O1xuICAgIHQubG96ZW5nZSA9IDQ3MTtcbiAgICB0LlJjYXJvbiA9IDYxMTtcbiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LnVjaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7XG4gICAgdC5BbWFjcm9uID0gNjExO1xuICAgIHQucmNhcm9uID0gMzg5O1xuICAgIHQuY2NlZGlsbGEgPSA0NDQ7XG4gICAgdC5aZG90YWNjZW50ID0gNTU2O1xuICAgIHQuVGhvcm4gPSA2MTE7XG4gICAgdC5PbWFjcm9uID0gNzIyO1xuICAgIHQuUmFjdXRlID0gNjExO1xuICAgIHQuU2FjdXRlID0gNTAwO1xuICAgIHQuZGNhcm9uID0gNTQ0O1xuICAgIHQuVW1hY3JvbiA9IDcyMjtcbiAgICB0LnVyaW5nID0gNTAwO1xuICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDtcbiAgICB0Lk9ncmF2ZSA9IDcyMjtcbiAgICB0LkFncmF2ZSA9IDYxMTtcbiAgICB0LkFicmV2ZSA9IDYxMTtcbiAgICB0Lm11bHRpcGx5ID0gNjc1O1xuICAgIHQudWFjdXRlID0gNTAwO1xuICAgIHQuVGNhcm9uID0gNTU2O1xuICAgIHQucGFydGlhbGRpZmYgPSA0NzY7XG4gICAgdC55ZGllcmVzaXMgPSA0NDQ7XG4gICAgdC5OYWN1dGUgPSA2Njc7XG4gICAgdC5pY2lyY3VtZmxleCA9IDI3ODtcbiAgICB0LkVjaXJjdW1mbGV4ID0gNjExO1xuICAgIHQuYWRpZXJlc2lzID0gNTAwO1xuICAgIHQuZWRpZXJlc2lzID0gNDQ0O1xuICAgIHQuY2FjdXRlID0gNDQ0O1xuICAgIHQubmFjdXRlID0gNTAwO1xuICAgIHQudW1hY3JvbiA9IDUwMDtcbiAgICB0Lk5jYXJvbiA9IDY2NztcbiAgICB0LklhY3V0ZSA9IDMzMztcbiAgICB0LnBsdXNtaW51cyA9IDY3NTtcbiAgICB0LmJyb2tlbmJhciA9IDI3NTtcbiAgICB0LnJlZ2lzdGVyZWQgPSA3NjA7XG4gICAgdC5HYnJldmUgPSA3MjI7XG4gICAgdC5JZG90YWNjZW50ID0gMzMzO1xuICAgIHQuc3VtbWF0aW9uID0gNjAwO1xuICAgIHQuRWdyYXZlID0gNjExO1xuICAgIHQucmFjdXRlID0gMzg5O1xuICAgIHQub21hY3JvbiA9IDUwMDtcbiAgICB0LlphY3V0ZSA9IDU1NjtcbiAgICB0LlpjYXJvbiA9IDU1NjtcbiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTtcbiAgICB0LkV0aCA9IDcyMjtcbiAgICB0LkNjZWRpbGxhID0gNjY3O1xuICAgIHQubGNvbW1hYWNjZW50ID0gMjc4O1xuICAgIHQudGNhcm9uID0gMzAwO1xuICAgIHQuZW9nb25layA9IDQ0NDtcbiAgICB0LlVvZ29uZWsgPSA3MjI7XG4gICAgdC5BYWN1dGUgPSA2MTE7XG4gICAgdC5BZGllcmVzaXMgPSA2MTE7XG4gICAgdC5lZ3JhdmUgPSA0NDQ7XG4gICAgdC56YWN1dGUgPSAzODk7XG4gICAgdC5pb2dvbmVrID0gMjc4O1xuICAgIHQuT2FjdXRlID0gNzIyO1xuICAgIHQub2FjdXRlID0gNTAwO1xuICAgIHQuYW1hY3JvbiA9IDUwMDtcbiAgICB0LnNhY3V0ZSA9IDM4OTtcbiAgICB0LmlkaWVyZXNpcyA9IDI3ODtcbiAgICB0Lk9jaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQuVWdyYXZlID0gNzIyO1xuICAgIHQuRGVsdGEgPSA2MTI7XG4gICAgdC50aG9ybiA9IDUwMDtcbiAgICB0LnR3b3N1cGVyaW9yID0gMzAwO1xuICAgIHQuT2RpZXJlc2lzID0gNzIyO1xuICAgIHQubXUgPSA1MDA7XG4gICAgdC5pZ3JhdmUgPSAyNzg7XG4gICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwO1xuICAgIHQuRW9nb25layA9IDYxMTtcbiAgICB0LmRjcm9hdCA9IDUwMDtcbiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7XG4gICAgdC5TY2VkaWxsYSA9IDUwMDtcbiAgICB0LmxjYXJvbiA9IDMwMDtcbiAgICB0Lktjb21tYWFjY2VudCA9IDY2NztcbiAgICB0LkxhY3V0ZSA9IDU1NjtcbiAgICB0LnRyYWRlbWFyayA9IDk4MDtcbiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7XG4gICAgdC5JZ3JhdmUgPSAzMzM7XG4gICAgdC5JbWFjcm9uID0gMzMzO1xuICAgIHQuTGNhcm9uID0gNjExO1xuICAgIHQub25laGFsZiA9IDc1MDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQubnRpbGRlID0gNTAwO1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDYxMTtcbiAgICB0LmVtYWNyb24gPSA0NDQ7XG4gICAgdC5nYnJldmUgPSA1MDA7XG4gICAgdC5vbmVxdWFydGVyID0gNzUwO1xuICAgIHQuU2Nhcm9uID0gNTAwO1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNTAwO1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDUwMDtcbiAgICB0LkNjYXJvbiA9IDY2NztcbiAgICB0LnVncmF2ZSA9IDUwMDtcbiAgICB0LnJhZGljYWwgPSA0NTM7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzODk7XG4gICAgdC5OdGlsZGUgPSA2Njc7XG4gICAgdC5vdGlsZGUgPSA1MDA7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5BdGlsZGUgPSA2MTE7XG4gICAgdC5Bb2dvbmVrID0gNjExO1xuICAgIHQuQXJpbmcgPSA2MTE7XG4gICAgdC5PdGlsZGUgPSA3MjI7XG4gICAgdC56ZG90YWNjZW50ID0gMzg5O1xuICAgIHQuRWNhcm9uID0gNjExO1xuICAgIHQuSW9nb25layA9IDMzMztcbiAgICB0Lmtjb21tYWFjY2VudCA9IDQ0NDtcbiAgICB0Lm1pbnVzID0gNjc1O1xuICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC5uY2Fyb24gPSA1MDA7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC5sb2dpY2Fsbm90ID0gNjc1O1xuICAgIHQub2RpZXJlc2lzID0gNTAwO1xuICAgIHQudWRpZXJlc2lzID0gNTAwO1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5ldGggPSA1MDA7XG4gICAgdC56Y2Fyb24gPSAzODk7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMwMDtcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTAwO1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0LlphcGZEaW5nYmF0cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICAgIHQuc3BhY2UgPSAyNzg7XG4gICAgdC5hMSA9IDk3NDtcbiAgICB0LmEyID0gOTYxO1xuICAgIHQuYTIwMiA9IDk3NDtcbiAgICB0LmEzID0gOTgwO1xuICAgIHQuYTQgPSA3MTk7XG4gICAgdC5hNSA9IDc4OTtcbiAgICB0LmExMTkgPSA3OTA7XG4gICAgdC5hMTE4ID0gNzkxO1xuICAgIHQuYTExNyA9IDY5MDtcbiAgICB0LmExMSA9IDk2MDtcbiAgICB0LmExMiA9IDkzOTtcbiAgICB0LmExMyA9IDU0OTtcbiAgICB0LmExNCA9IDg1NTtcbiAgICB0LmExNSA9IDkxMTtcbiAgICB0LmExNiA9IDkzMztcbiAgICB0LmExMDUgPSA5MTE7XG4gICAgdC5hMTcgPSA5NDU7XG4gICAgdC5hMTggPSA5NzQ7XG4gICAgdC5hMTkgPSA3NTU7XG4gICAgdC5hMjAgPSA4NDY7XG4gICAgdC5hMjEgPSA3NjI7XG4gICAgdC5hMjIgPSA3NjE7XG4gICAgdC5hMjMgPSA1NzE7XG4gICAgdC5hMjQgPSA2Nzc7XG4gICAgdC5hMjUgPSA3NjM7XG4gICAgdC5hMjYgPSA3NjA7XG4gICAgdC5hMjcgPSA3NTk7XG4gICAgdC5hMjggPSA3NTQ7XG4gICAgdC5hNiA9IDQ5NDtcbiAgICB0LmE3ID0gNTUyO1xuICAgIHQuYTggPSA1Mzc7XG4gICAgdC5hOSA9IDU3NztcbiAgICB0LmExMCA9IDY5MjtcbiAgICB0LmEyOSA9IDc4NjtcbiAgICB0LmEzMCA9IDc4ODtcbiAgICB0LmEzMSA9IDc4ODtcbiAgICB0LmEzMiA9IDc5MDtcbiAgICB0LmEzMyA9IDc5MztcbiAgICB0LmEzNCA9IDc5NDtcbiAgICB0LmEzNSA9IDgxNjtcbiAgICB0LmEzNiA9IDgyMztcbiAgICB0LmEzNyA9IDc4OTtcbiAgICB0LmEzOCA9IDg0MTtcbiAgICB0LmEzOSA9IDgyMztcbiAgICB0LmE0MCA9IDgzMztcbiAgICB0LmE0MSA9IDgxNjtcbiAgICB0LmE0MiA9IDgzMTtcbiAgICB0LmE0MyA9IDkyMztcbiAgICB0LmE0NCA9IDc0NDtcbiAgICB0LmE0NSA9IDcyMztcbiAgICB0LmE0NiA9IDc0OTtcbiAgICB0LmE0NyA9IDc5MDtcbiAgICB0LmE0OCA9IDc5MjtcbiAgICB0LmE0OSA9IDY5NTtcbiAgICB0LmE1MCA9IDc3NjtcbiAgICB0LmE1MSA9IDc2ODtcbiAgICB0LmE1MiA9IDc5MjtcbiAgICB0LmE1MyA9IDc1OTtcbiAgICB0LmE1NCA9IDcwNztcbiAgICB0LmE1NSA9IDcwODtcbiAgICB0LmE1NiA9IDY4MjtcbiAgICB0LmE1NyA9IDcwMTtcbiAgICB0LmE1OCA9IDgyNjtcbiAgICB0LmE1OSA9IDgxNTtcbiAgICB0LmE2MCA9IDc4OTtcbiAgICB0LmE2MSA9IDc4OTtcbiAgICB0LmE2MiA9IDcwNztcbiAgICB0LmE2MyA9IDY4NztcbiAgICB0LmE2NCA9IDY5NjtcbiAgICB0LmE2NSA9IDY4OTtcbiAgICB0LmE2NiA9IDc4NjtcbiAgICB0LmE2NyA9IDc4NztcbiAgICB0LmE2OCA9IDcxMztcbiAgICB0LmE2OSA9IDc5MTtcbiAgICB0LmE3MCA9IDc4NTtcbiAgICB0LmE3MSA9IDc5MTtcbiAgICB0LmE3MiA9IDg3MztcbiAgICB0LmE3MyA9IDc2MTtcbiAgICB0LmE3NCA9IDc2MjtcbiAgICB0LmEyMDMgPSA3NjI7XG4gICAgdC5hNzUgPSA3NTk7XG4gICAgdC5hMjA0ID0gNzU5O1xuICAgIHQuYTc2ID0gODkyO1xuICAgIHQuYTc3ID0gODkyO1xuICAgIHQuYTc4ID0gNzg4O1xuICAgIHQuYTc5ID0gNzg0O1xuICAgIHQuYTgxID0gNDM4O1xuICAgIHQuYTgyID0gMTM4O1xuICAgIHQuYTgzID0gMjc3O1xuICAgIHQuYTg0ID0gNDE1O1xuICAgIHQuYTk3ID0gMzkyO1xuICAgIHQuYTk4ID0gMzkyO1xuICAgIHQuYTk5ID0gNjY4O1xuICAgIHQuYTEwMCA9IDY2ODtcbiAgICB0LmE4OSA9IDM5MDtcbiAgICB0LmE5MCA9IDM5MDtcbiAgICB0LmE5MyA9IDMxNztcbiAgICB0LmE5NCA9IDMxNztcbiAgICB0LmE5MSA9IDI3NjtcbiAgICB0LmE5MiA9IDI3NjtcbiAgICB0LmEyMDUgPSA1MDk7XG4gICAgdC5hODUgPSA1MDk7XG4gICAgdC5hMjA2ID0gNDEwO1xuICAgIHQuYTg2ID0gNDEwO1xuICAgIHQuYTg3ID0gMjM0O1xuICAgIHQuYTg4ID0gMjM0O1xuICAgIHQuYTk1ID0gMzM0O1xuICAgIHQuYTk2ID0gMzM0O1xuICAgIHQuYTEwMSA9IDczMjtcbiAgICB0LmExMDIgPSA1NDQ7XG4gICAgdC5hMTAzID0gNTQ0O1xuICAgIHQuYTEwNCA9IDkxMDtcbiAgICB0LmExMDYgPSA2Njc7XG4gICAgdC5hMTA3ID0gNzYwO1xuICAgIHQuYTEwOCA9IDc2MDtcbiAgICB0LmExMTIgPSA3NzY7XG4gICAgdC5hMTExID0gNTk1O1xuICAgIHQuYTExMCA9IDY5NDtcbiAgICB0LmExMDkgPSA2MjY7XG4gICAgdC5hMTIwID0gNzg4O1xuICAgIHQuYTEyMSA9IDc4ODtcbiAgICB0LmExMjIgPSA3ODg7XG4gICAgdC5hMTIzID0gNzg4O1xuICAgIHQuYTEyNCA9IDc4ODtcbiAgICB0LmExMjUgPSA3ODg7XG4gICAgdC5hMTI2ID0gNzg4O1xuICAgIHQuYTEyNyA9IDc4ODtcbiAgICB0LmExMjggPSA3ODg7XG4gICAgdC5hMTI5ID0gNzg4O1xuICAgIHQuYTEzMCA9IDc4ODtcbiAgICB0LmExMzEgPSA3ODg7XG4gICAgdC5hMTMyID0gNzg4O1xuICAgIHQuYTEzMyA9IDc4ODtcbiAgICB0LmExMzQgPSA3ODg7XG4gICAgdC5hMTM1ID0gNzg4O1xuICAgIHQuYTEzNiA9IDc4ODtcbiAgICB0LmExMzcgPSA3ODg7XG4gICAgdC5hMTM4ID0gNzg4O1xuICAgIHQuYTEzOSA9IDc4ODtcbiAgICB0LmExNDAgPSA3ODg7XG4gICAgdC5hMTQxID0gNzg4O1xuICAgIHQuYTE0MiA9IDc4ODtcbiAgICB0LmExNDMgPSA3ODg7XG4gICAgdC5hMTQ0ID0gNzg4O1xuICAgIHQuYTE0NSA9IDc4ODtcbiAgICB0LmExNDYgPSA3ODg7XG4gICAgdC5hMTQ3ID0gNzg4O1xuICAgIHQuYTE0OCA9IDc4ODtcbiAgICB0LmExNDkgPSA3ODg7XG4gICAgdC5hMTUwID0gNzg4O1xuICAgIHQuYTE1MSA9IDc4ODtcbiAgICB0LmExNTIgPSA3ODg7XG4gICAgdC5hMTUzID0gNzg4O1xuICAgIHQuYTE1NCA9IDc4ODtcbiAgICB0LmExNTUgPSA3ODg7XG4gICAgdC5hMTU2ID0gNzg4O1xuICAgIHQuYTE1NyA9IDc4ODtcbiAgICB0LmExNTggPSA3ODg7XG4gICAgdC5hMTU5ID0gNzg4O1xuICAgIHQuYTE2MCA9IDg5NDtcbiAgICB0LmExNjEgPSA4Mzg7XG4gICAgdC5hMTYzID0gMTAxNjtcbiAgICB0LmExNjQgPSA0NTg7XG4gICAgdC5hMTk2ID0gNzQ4O1xuICAgIHQuYTE2NSA9IDkyNDtcbiAgICB0LmExOTIgPSA3NDg7XG4gICAgdC5hMTY2ID0gOTE4O1xuICAgIHQuYTE2NyA9IDkyNztcbiAgICB0LmExNjggPSA5Mjg7XG4gICAgdC5hMTY5ID0gOTI4O1xuICAgIHQuYTE3MCA9IDgzNDtcbiAgICB0LmExNzEgPSA4NzM7XG4gICAgdC5hMTcyID0gODI4O1xuICAgIHQuYTE3MyA9IDkyNDtcbiAgICB0LmExNjIgPSA5MjQ7XG4gICAgdC5hMTc0ID0gOTE3O1xuICAgIHQuYTE3NSA9IDkzMDtcbiAgICB0LmExNzYgPSA5MzE7XG4gICAgdC5hMTc3ID0gNDYzO1xuICAgIHQuYTE3OCA9IDg4MztcbiAgICB0LmExNzkgPSA4MzY7XG4gICAgdC5hMTkzID0gODM2O1xuICAgIHQuYTE4MCA9IDg2NztcbiAgICB0LmExOTkgPSA4Njc7XG4gICAgdC5hMTgxID0gNjk2O1xuICAgIHQuYTIwMCA9IDY5NjtcbiAgICB0LmExODIgPSA4NzQ7XG4gICAgdC5hMjAxID0gODc0O1xuICAgIHQuYTE4MyA9IDc2MDtcbiAgICB0LmExODQgPSA5NDY7XG4gICAgdC5hMTk3ID0gNzcxO1xuICAgIHQuYTE4NSA9IDg2NTtcbiAgICB0LmExOTQgPSA3NzE7XG4gICAgdC5hMTk4ID0gODg4O1xuICAgIHQuYTE4NiA9IDk2NztcbiAgICB0LmExOTUgPSA4ODg7XG4gICAgdC5hMTg3ID0gODMxO1xuICAgIHQuYTE4OCA9IDg3MztcbiAgICB0LmExODkgPSA5Mjc7XG4gICAgdC5hMTkwID0gOTcwO1xuICAgIHQuYTE5MSA9IDkxODtcbiAgfSk7XG59KTtcblxuZXhwb3J0IHsgZ2V0TWV0cmljcyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTQgT3BlcmEgU29mdHdhcmUgQVNBXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqXG4gKiBCYXNlZCBvbiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3NtaGFzaGVyL3dpa2kvTXVybXVySGFzaDMuXG4gKiBIYXNoZXMgcm91Z2hseSAxMDAgS0IgcGVyIG1pbGxpc2Vjb25kIG9uIGk3IDMuNCBHSHouXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7IGlzQXJyYXlCdWZmZXIsIGlzU3RyaW5nIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbmNvbnN0IFNFRUQgPSAweGMzZDJlMWYwO1xuLy8gV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBtYXRoIHByZWNpc2lvbiBpbiBKUy5cbmNvbnN0IE1BU0tfSElHSCA9IDB4ZmZmZjAwMDA7XG5jb25zdCBNQVNLX0xPVyA9IDB4ZmZmZjtcblxuY2xhc3MgTXVybXVySGFzaDNfNjQge1xuICBjb25zdHJ1Y3RvcihzZWVkKSB7XG4gICAgdGhpcy5oMSA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7XG4gICAgdGhpcy5oMiA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7XG4gIH1cblxuICB1cGRhdGUoaW5wdXQpIHtcbiAgICBsZXQgZGF0YSwgbGVuZ3RoO1xuICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTtcbiAgICAgIGxlbmd0aCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbnB1dC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY29kZSA8PSAweGZmKSB7XG4gICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSA+Pj4gODtcbiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGUgJiAweGZmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5QnVmZmVyKGlucHV0KSkge1xuICAgICAgZGF0YSA9IGlucHV0O1xuICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiBcIiArXG4gICAgICAgICAgXCJJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2NrQ291bnRzID0gbGVuZ3RoID4+IDI7XG4gICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDtcbiAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IGVuZGlhbm5lc3MgaGVyZS5cbiAgICBjb25zdCBkYXRhVWludDMyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyLCAwLCBibG9ja0NvdW50cyk7XG4gICAgbGV0IGsxID0gMCxcbiAgICAgIGsyID0gMDtcbiAgICBsZXQgaDEgPSB0aGlzLmgxLFxuICAgICAgaDIgPSB0aGlzLmgyO1xuICAgIGNvbnN0IEMxID0gMHhjYzllMmQ1MSxcbiAgICAgIEMyID0gMHgxYjg3MzU5MztcbiAgICBjb25zdCBDMV9MT1cgPSBDMSAmIE1BU0tfTE9XLFxuICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykge1xuICAgICAgaWYgKGkgJiAxKSB7XG4gICAgICAgIGsxID0gZGF0YVVpbnQzMltpXTtcbiAgICAgICAgazEgPSAoKGsxICogQzEpICYgTUFTS19ISUdIKSB8ICgoazEgKiBDMV9MT1cpICYgTUFTS19MT1cpO1xuICAgICAgICBrMSA9IChrMSA8PCAxNSkgfCAoazEgPj4+IDE3KTtcbiAgICAgICAgazEgPSAoKGsxICogQzIpICYgTUFTS19ISUdIKSB8ICgoazEgKiBDMl9MT1cpICYgTUFTS19MT1cpO1xuICAgICAgICBoMSBePSBrMTtcbiAgICAgICAgaDEgPSAoaDEgPDwgMTMpIHwgKGgxID4+PiAxOSk7XG4gICAgICAgIGgxID0gaDEgKiA1ICsgMHhlNjU0NmI2NDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsyID0gZGF0YVVpbnQzMltpXTtcbiAgICAgICAgazIgPSAoKGsyICogQzEpICYgTUFTS19ISUdIKSB8ICgoazIgKiBDMV9MT1cpICYgTUFTS19MT1cpO1xuICAgICAgICBrMiA9IChrMiA8PCAxNSkgfCAoazIgPj4+IDE3KTtcbiAgICAgICAgazIgPSAoKGsyICogQzIpICYgTUFTS19ISUdIKSB8ICgoazIgKiBDMl9MT1cpICYgTUFTS19MT1cpO1xuICAgICAgICBoMiBePSBrMjtcbiAgICAgICAgaDIgPSAoaDIgPDwgMTMpIHwgKGgyID4+PiAxOSk7XG4gICAgICAgIGgyID0gaDIgKiA1ICsgMHhlNjU0NmI2NDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBrMSA9IDA7XG5cbiAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAyXSA8PCAxNjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAxXSA8PCA4O1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAxOlxuICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNF07XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgICAgICBrMSA9ICgoazEgKiBDMSkgJiBNQVNLX0hJR0gpIHwgKChrMSAqIEMxX0xPVykgJiBNQVNLX0xPVyk7XG4gICAgICAgIGsxID0gKGsxIDw8IDE1KSB8IChrMSA+Pj4gMTcpO1xuICAgICAgICBrMSA9ICgoazEgKiBDMikgJiBNQVNLX0hJR0gpIHwgKChrMSAqIEMyX0xPVykgJiBNQVNLX0xPVyk7XG4gICAgICAgIGlmIChibG9ja0NvdW50cyAmIDEpIHtcbiAgICAgICAgICBoMSBePSBrMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoMiBePSBrMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaDEgPSBoMTtcbiAgICB0aGlzLmgyID0gaDI7XG4gIH1cblxuICBoZXhkaWdlc3QoKSB7XG4gICAgbGV0IGgxID0gdGhpcy5oMSxcbiAgICAgIGgyID0gdGhpcy5oMjtcblxuICAgIGgxIF49IGgyID4+PiAxO1xuICAgIGgxID0gKChoMSAqIDB4ZWQ1NThjY2QpICYgTUFTS19ISUdIKSB8ICgoaDEgKiAweDhjY2QpICYgTUFTS19MT1cpO1xuICAgIGgyID1cbiAgICAgICgoaDIgKiAweGZmNTFhZmQ3KSAmIE1BU0tfSElHSCkgfFxuICAgICAgKCgoKChoMiA8PCAxNikgfCAoaDEgPj4+IDE2KSkgKiAweGFmZDdlZDU1KSAmIE1BU0tfSElHSCkgPj4+IDE2KTtcbiAgICBoMSBePSBoMiA+Pj4gMTtcbiAgICBoMSA9ICgoaDEgKiAweDFhODVlYzUzKSAmIE1BU0tfSElHSCkgfCAoKGgxICogMHhlYzUzKSAmIE1BU0tfTE9XKTtcbiAgICBoMiA9XG4gICAgICAoKGgyICogMHhjNGNlYjlmZSkgJiBNQVNLX0hJR0gpIHxcbiAgICAgICgoKCgoaDIgPDwgMTYpIHwgKGgxID4+PiAxNikpICogMHhiOWZlMWE4NSkgJiBNQVNLX0hJR0gpID4+PiAxNik7XG4gICAgaDEgXj0gaDIgPj4+IDE7XG5cbiAgICBjb25zdCBoZXgxID0gKGgxID4+PiAwKS50b1N0cmluZygxNiksXG4gICAgICBoZXgyID0gKGgyID4+PiAwKS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIGhleDEucGFkU3RhcnQoOCwgXCIwXCIpICsgaGV4Mi5wYWRTdGFydCg4LCBcIjBcIik7XG4gIH1cbn1cblxuZXhwb3J0IHsgTXVybXVySGFzaDNfNjQgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIEZvcm1hdEVycm9yLCBJbWFnZUtpbmQsIGluZm8sIHdhcm4gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IGlzTmFtZSwgaXNTdHJlYW0sIE5hbWUgfSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBDb2xvclNwYWNlIH0gZnJvbSBcIi4vY29sb3JzcGFjZS5qc1wiO1xuaW1wb3J0IHsgRGVjb2RlU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBKcGVnU3RyZWFtIH0gZnJvbSBcIi4vanBlZ19zdHJlYW0uanNcIjtcbmltcG9ydCB7IEpweEltYWdlIH0gZnJvbSBcIi4vanB4LmpzXCI7XG5cbi8qKlxuICogRGVjb2RlIGFuZCBjbGFtcCBhIHZhbHVlLiBUaGUgZm9ybXVsYSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3BlYyBiZWNhdXNlIHdlXG4gKiBkb24ndCBkZWNvZGUgdG8gZmxvYXQgcmFuZ2UgWzAsMV0sIHdlIGRlY29kZSBpdCBpbiB0aGUgWzAsbWF4XSByYW5nZS5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlQW5kQ2xhbXAodmFsdWUsIGFkZGVuZCwgY29lZmZpY2llbnQsIG1heCkge1xuICB2YWx1ZSA9IGFkZGVuZCArIHZhbHVlICogY29lZmZpY2llbnQ7XG4gIC8vIENsYW1wIHRoZSB2YWx1ZSB0byB0aGUgcmFuZ2VcbiAgaWYgKHZhbHVlIDwgMCkge1xuICAgIHZhbHVlID0gMDtcbiAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkge1xuICAgIHZhbHVlID0gbWF4O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXNpemVzIGFuIGltYWdlIG1hc2sgd2l0aCAxIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc3JjIC0gVGhlIHNvdXJjZSBidWZmZXIuXG4gKiBAcGFyYW0ge251bWJlcn0gYnBjIC0gTnVtYmVyIG9mIGJpdHMgcGVyIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3MSAtIE9yaWdpbmFsIHdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGgxIC0gT3JpZ2luYWwgaGVpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IHcyIC0gTmV3IHdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGgyIC0gTmV3IGhlaWdodC5cbiAqIEByZXR1cm5zIHtUeXBlZEFycmF5fSBUaGUgcmVzaXplZCBpbWFnZSBtYXNrIGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gcmVzaXplSW1hZ2VNYXNrKHNyYywgYnBjLCB3MSwgaDEsIHcyLCBoMikge1xuICB2YXIgbGVuZ3RoID0gdzIgKiBoMjtcbiAgbGV0IGRlc3Q7XG4gIGlmIChicGMgPD0gOCkge1xuICAgIGRlc3QgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICB9IGVsc2UgaWYgKGJwYyA8PSAxNikge1xuICAgIGRlc3QgPSBuZXcgVWludDE2QXJyYXkobGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBkZXN0ID0gbmV3IFVpbnQzMkFycmF5KGxlbmd0aCk7XG4gIH1cbiAgdmFyIHhSYXRpbyA9IHcxIC8gdzI7XG4gIHZhciB5UmF0aW8gPSBoMSAvIGgyO1xuICB2YXIgaSxcbiAgICBqLFxuICAgIHB5LFxuICAgIG5ld0luZGV4ID0gMCxcbiAgICBvbGRJbmRleDtcbiAgdmFyIHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpO1xuICB2YXIgdzFTY2FubGluZSA9IHcxO1xuXG4gIGZvciAoaSA9IDA7IGkgPCB3MjsgaSsrKSB7XG4gICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbyk7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IGgyOyBpKyspIHtcbiAgICBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lO1xuICAgIGZvciAoaiA9IDA7IGogPCB3MjsgaisrKSB7XG4gICAgICBvbGRJbmRleCA9IHB5ICsgeFNjYWxlZFtqXTtcbiAgICAgIGRlc3RbbmV3SW5kZXgrK10gPSBzcmNbb2xkSW5kZXhdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdDtcbn1cblxuY2xhc3MgUERGSW1hZ2Uge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgeHJlZixcbiAgICByZXMsXG4gICAgaW1hZ2UsXG4gICAgaXNJbmxpbmUgPSBmYWxzZSxcbiAgICBzbWFzayA9IG51bGwsXG4gICAgbWFzayA9IG51bGwsXG4gICAgaXNNYXNrID0gZmFsc2UsXG4gICAgcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICB9KSB7XG4gICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgIHZhciBkaWN0ID0gaW1hZ2UuZGljdDtcblxuICAgIGNvbnN0IGZpbHRlciA9IGRpY3QuZ2V0KFwiRmlsdGVyXCIpO1xuICAgIGlmIChpc05hbWUoZmlsdGVyKSkge1xuICAgICAgc3dpdGNoIChmaWx0ZXIubmFtZSkge1xuICAgICAgICBjYXNlIFwiSlBYRGVjb2RlXCI6XG4gICAgICAgICAgdmFyIGpweEltYWdlID0gbmV3IEpweEltYWdlKCk7XG4gICAgICAgICAganB4SW1hZ2UucGFyc2VJbWFnZVByb3BlcnRpZXMoaW1hZ2Uuc3RyZWFtKTtcbiAgICAgICAgICBpbWFnZS5zdHJlYW0ucmVzZXQoKTtcblxuICAgICAgICAgIGltYWdlLndpZHRoID0ganB4SW1hZ2Uud2lkdGg7XG4gICAgICAgICAgaW1hZ2UuaGVpZ2h0ID0ganB4SW1hZ2UuaGVpZ2h0O1xuICAgICAgICAgIGltYWdlLmJpdHNQZXJDb21wb25lbnQgPSBqcHhJbWFnZS5iaXRzUGVyQ29tcG9uZW50O1xuICAgICAgICAgIGltYWdlLm51bUNvbXBzID0ganB4SW1hZ2UuY29tcG9uZW50c0NvdW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiSkJJRzJEZWNvZGVcIjpcbiAgICAgICAgICBpbWFnZS5iaXRzUGVyQ29tcG9uZW50ID0gMTtcbiAgICAgICAgICBpbWFnZS5udW1Db21wcyA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE8gY2FjaGUgcmVuZGVyZWQgaW1hZ2VzP1xuXG4gICAgbGV0IHdpZHRoID0gZGljdC5nZXQoXCJXaWR0aFwiLCBcIldcIik7XG4gICAgbGV0IGhlaWdodCA9IGRpY3QuZ2V0KFwiSGVpZ2h0XCIsIFwiSFwiKTtcblxuICAgIGlmIChcbiAgICAgIE51bWJlci5pc0ludGVnZXIoaW1hZ2Uud2lkdGgpICYmXG4gICAgICBpbWFnZS53aWR0aCA+IDAgJiZcbiAgICAgIE51bWJlci5pc0ludGVnZXIoaW1hZ2UuaGVpZ2h0KSAmJlxuICAgICAgaW1hZ2UuaGVpZ2h0ID4gMCAmJlxuICAgICAgKGltYWdlLndpZHRoICE9PSB3aWR0aCB8fCBpbWFnZS5oZWlnaHQgIT09IGhlaWdodClcbiAgICApIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwiUERGSW1hZ2UgLSB1c2luZyB0aGUgV2lkdGgvSGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLCBcIiArXG4gICAgICAgICAgXCJyYXRoZXIgdGhhbiB0aGUgaW1hZ2UgZGljdGlvbmFyeS5cIlxuICAgICAgKTtcbiAgICAgIHdpZHRoID0gaW1hZ2Uud2lkdGg7XG4gICAgICBoZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XG4gICAgfVxuICAgIGlmICh3aWR0aCA8IDEgfHwgaGVpZ2h0IDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICBgSW52YWxpZCBpbWFnZSB3aWR0aDogJHt3aWR0aH0gb3IgaGVpZ2h0OiAke2hlaWdodH1gXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICB0aGlzLmludGVycG9sYXRlID0gZGljdC5nZXQoXCJJbnRlcnBvbGF0ZVwiLCBcIklcIikgfHwgZmFsc2U7XG4gICAgdGhpcy5pbWFnZU1hc2sgPSBkaWN0LmdldChcIkltYWdlTWFza1wiLCBcIklNXCIpIHx8IGZhbHNlO1xuICAgIHRoaXMubWF0dGUgPSBkaWN0LmdldChcIk1hdHRlXCIpIHx8IGZhbHNlO1xuXG4gICAgdmFyIGJpdHNQZXJDb21wb25lbnQgPSBpbWFnZS5iaXRzUGVyQ29tcG9uZW50O1xuICAgIGlmICghYml0c1BlckNvbXBvbmVudCkge1xuICAgICAgYml0c1BlckNvbXBvbmVudCA9IGRpY3QuZ2V0KFwiQml0c1BlckNvbXBvbmVudFwiLCBcIkJQQ1wiKTtcbiAgICAgIGlmICghYml0c1BlckNvbXBvbmVudCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZU1hc2spIHtcbiAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50ID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICBgQml0cyBwZXIgY29tcG9uZW50IG1pc3NpbmcgaW4gaW1hZ2U6ICR7dGhpcy5pbWFnZU1hc2t9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5icGMgPSBiaXRzUGVyQ29tcG9uZW50O1xuXG4gICAgaWYgKCF0aGlzLmltYWdlTWFzaykge1xuICAgICAgbGV0IGNvbG9yU3BhY2UgPSBkaWN0LmdldFJhdyhcIkNvbG9yU3BhY2VcIikgfHwgZGljdC5nZXRSYXcoXCJDU1wiKTtcbiAgICAgIGlmICghY29sb3JTcGFjZSkge1xuICAgICAgICBpbmZvKFwiSlBYIGltYWdlcyAod2hpY2ggZG8gbm90IHJlcXVpcmUgY29sb3Igc3BhY2VzKVwiKTtcbiAgICAgICAgc3dpdGNoIChpbWFnZS5udW1Db21wcykge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBOYW1lLmdldChcIkRldmljZUdyYXlcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoXCJEZXZpY2VSR0JcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoXCJEZXZpY2VDTVlLXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEpQWCBpbWFnZXMgd2l0aCAke2ltYWdlLm51bUNvbXBzfSBgICtcbiAgICAgICAgICAgICAgICBcImNvbG9yIGNvbXBvbmVudHMgbm90IHN1cHBvcnRlZC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jb2xvclNwYWNlID0gQ29sb3JTcGFjZS5wYXJzZSh7XG4gICAgICAgIGNzOiBjb2xvclNwYWNlLFxuICAgICAgICB4cmVmLFxuICAgICAgICByZXNvdXJjZXM6IGlzSW5saW5lID8gcmVzIDogbnVsbCxcbiAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5udW1Db21wcyA9IHRoaXMuY29sb3JTcGFjZS5udW1Db21wcztcbiAgICB9XG5cbiAgICB0aGlzLmRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoXCJEZWNvZGVcIiwgXCJEXCIpO1xuICAgIHRoaXMubmVlZHNEZWNvZGUgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmRlY29kZSAmJlxuICAgICAgKCh0aGlzLmNvbG9yU3BhY2UgJiZcbiAgICAgICAgIXRoaXMuY29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUodGhpcy5kZWNvZGUsIGJpdHNQZXJDb21wb25lbnQpKSB8fFxuICAgICAgICAoaXNNYXNrICYmXG4gICAgICAgICAgIUNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLCAvKiBudW1Db21wcyA9ICovIDEpKSlcbiAgICApIHtcbiAgICAgIHRoaXMubmVlZHNEZWNvZGUgPSB0cnVlO1xuICAgICAgLy8gRG8gc29tZSBwcmVwcm9jZXNzaW5nIHRvIGF2b2lkIG1vcmUgbWF0aC5cbiAgICAgIHZhciBtYXggPSAoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDE7XG4gICAgICB0aGlzLmRlY29kZUNvZWZmaWNpZW50cyA9IFtdO1xuICAgICAgdGhpcy5kZWNvZGVBZGRlbmRzID0gW107XG4gICAgICBjb25zdCBpc0luZGV4ZWQgPSB0aGlzLmNvbG9yU3BhY2UgJiYgdGhpcy5jb2xvclNwYWNlLm5hbWUgPT09IFwiSW5kZXhlZFwiO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kZWNvZGUubGVuZ3RoOyBpICs9IDIsICsraikge1xuICAgICAgICB2YXIgZG1pbiA9IHRoaXMuZGVjb2RlW2ldO1xuICAgICAgICB2YXIgZG1heCA9IHRoaXMuZGVjb2RlW2kgKyAxXTtcbiAgICAgICAgdGhpcy5kZWNvZGVDb2VmZmljaWVudHNbal0gPSBpc0luZGV4ZWRcbiAgICAgICAgICA/IChkbWF4IC0gZG1pbikgLyBtYXhcbiAgICAgICAgICA6IGRtYXggLSBkbWluO1xuICAgICAgICB0aGlzLmRlY29kZUFkZGVuZHNbal0gPSBpc0luZGV4ZWQgPyBkbWluIDogbWF4ICogZG1pbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc21hc2spIHtcbiAgICAgIHRoaXMuc21hc2sgPSBuZXcgUERGSW1hZ2Uoe1xuICAgICAgICB4cmVmLFxuICAgICAgICByZXMsXG4gICAgICAgIGltYWdlOiBzbWFzayxcbiAgICAgICAgaXNJbmxpbmUsXG4gICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hc2spIHtcbiAgICAgIGlmIChpc1N0cmVhbShtYXNrKSkge1xuICAgICAgICB2YXIgbWFza0RpY3QgPSBtYXNrLmRpY3QsXG4gICAgICAgICAgaW1hZ2VNYXNrID0gbWFza0RpY3QuZ2V0KFwiSW1hZ2VNYXNrXCIsIFwiSU1cIik7XG4gICAgICAgIGlmICghaW1hZ2VNYXNrKSB7XG4gICAgICAgICAgd2FybihcIklnbm9yaW5nIC9NYXNrIGluIGltYWdlIHdpdGhvdXQgL0ltYWdlTWFzay5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tYXNrID0gbmV3IFBERkltYWdlKHtcbiAgICAgICAgICAgIHhyZWYsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICBpbWFnZTogbWFzayxcbiAgICAgICAgICAgIGlzSW5saW5lLFxuICAgICAgICAgICAgaXNNYXNrOiB0cnVlLFxuICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENvbG9yIGtleSBtYXNrIChqdXN0IGFuIGFycmF5KS5cbiAgICAgICAgdGhpcy5tYXNrID0gbWFzaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBwcm9jZXNzaW5nIG9mIGltYWdlIGRhdGEgYW5kIHJldHVybnMgdGhlIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZFxuICAgKiB3aXRoIGEgUERGSW1hZ2Ugd2hlbiB0aGUgaW1hZ2UgaXMgcmVhZHkgdG8gYmUgdXNlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBidWlsZEltYWdlKHtcbiAgICB4cmVmLFxuICAgIHJlcyxcbiAgICBpbWFnZSxcbiAgICBpc0lubGluZSA9IGZhbHNlLFxuICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgfSkge1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlO1xuICAgIGxldCBzbWFza0RhdGEgPSBudWxsO1xuICAgIGxldCBtYXNrRGF0YSA9IG51bGw7XG5cbiAgICBjb25zdCBzbWFzayA9IGltYWdlLmRpY3QuZ2V0KFwiU01hc2tcIik7XG4gICAgY29uc3QgbWFzayA9IGltYWdlLmRpY3QuZ2V0KFwiTWFza1wiKTtcblxuICAgIGlmIChzbWFzaykge1xuICAgICAgc21hc2tEYXRhID0gc21hc2s7XG4gICAgfSBlbHNlIGlmIChtYXNrKSB7XG4gICAgICBpZiAoaXNTdHJlYW0obWFzaykgfHwgQXJyYXkuaXNBcnJheShtYXNrKSkge1xuICAgICAgICBtYXNrRGF0YSA9IG1hc2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFwiVW5zdXBwb3J0ZWQgbWFzayBmb3JtYXQuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUERGSW1hZ2Uoe1xuICAgICAgeHJlZixcbiAgICAgIHJlcyxcbiAgICAgIGltYWdlOiBpbWFnZURhdGEsXG4gICAgICBpc0lubGluZSxcbiAgICAgIHNtYXNrOiBzbWFza0RhdGEsXG4gICAgICBtYXNrOiBtYXNrRGF0YSxcbiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1hc2soe1xuICAgIGltZ0FycmF5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbSxcbiAgICBpbnZlcnNlRGVjb2RlLFxuICB9KSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBpbWdBcnJheSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnUERGSW1hZ2UuY3JlYXRlTWFzazogVW5zdXBwb3J0ZWQgXCJpbWdBcnJheVwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgLy8gfGltZ0FycmF5fCBtaWdodCBub3QgY29udGFpbiBmdWxsIGRhdGEgZm9yIGV2ZXJ5IHBpeGVsIG9mIHRoZSBtYXNrLCBzb1xuICAgIC8vIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB8Y29tcHV0ZWRMZW5ndGh8IGFuZCB8YWN0dWFsTGVuZ3RofC5cbiAgICAvLyBJbiBwYXJ0aWN1bGFyLCBpZiBpbnZlcnNlRGVjb2RlIGlzIHRydWUsIHRoZW4gdGhlIGFycmF5IHdlIHJldHVybiBtdXN0XG4gICAgLy8gaGF2ZSBhIGxlbmd0aCBvZiB8Y29tcHV0ZWRMZW5ndGh8LlxuXG4gICAgdmFyIGNvbXB1dGVkTGVuZ3RoID0gKCh3aWR0aCArIDcpID4+IDMpICogaGVpZ2h0O1xuICAgIHZhciBhY3R1YWxMZW5ndGggPSBpbWdBcnJheS5ieXRlTGVuZ3RoO1xuICAgIHZhciBoYXZlRnVsbERhdGEgPSBjb21wdXRlZExlbmd0aCA9PT0gYWN0dWFsTGVuZ3RoO1xuICAgIHZhciBkYXRhLCBpO1xuXG4gICAgaWYgKGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtICYmICghaW52ZXJzZURlY29kZSB8fCBoYXZlRnVsbERhdGEpKSB7XG4gICAgICAvLyBpbWdBcnJheSBjYW1lIGZyb20gYSBEZWNvZGVTdHJlYW0gYW5kIGl0cyBkYXRhIGlzIGluIGFuIGFwcHJvcHJpYXRlXG4gICAgICAvLyBmb3JtLCBzbyB3ZSBjYW4ganVzdCB0cmFuc2ZlciBpdC5cbiAgICAgIGRhdGEgPSBpbWdBcnJheTtcbiAgICB9IGVsc2UgaWYgKCFpbnZlcnNlRGVjb2RlKSB7XG4gICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGFjdHVhbExlbmd0aCk7XG4gICAgICBkYXRhLnNldChpbWdBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoY29tcHV0ZWRMZW5ndGgpO1xuICAgICAgZGF0YS5zZXQoaW1nQXJyYXkpO1xuICAgICAgZm9yIChpID0gYWN0dWFsTGVuZ3RoOyBpIDwgY29tcHV0ZWRMZW5ndGg7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBuZWNlc3NhcnksIGludmVydCB0aGUgb3JpZ2luYWwgbWFzayBkYXRhIChidXQgbm90IGFueSBleHRyYSB3ZSBtaWdodFxuICAgIC8vIGhhdmUgYWRkZWQgYWJvdmUpLiBJdCdzIHNhZmUgdG8gbW9kaWZ5IHRoZSBhcnJheSAtLSB3aGV0aGVyIGl0J3MgdGhlXG4gICAgLy8gb3JpZ2luYWwgb3IgYSBjb3B5LCB3ZSdyZSBhYm91dCB0byB0cmFuc2ZlciBpdCBhbnl3YXksIHNvIG5vdGhpbmcgZWxzZVxuICAgIC8vIGluIHRoaXMgdGhyZWFkIGNhbiBiZSByZWx5aW5nIG9uIGl0cyBjb250ZW50cy5cbiAgICBpZiAoaW52ZXJzZURlY29kZSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gXj0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH07XG4gIH1cblxuICBnZXQgZHJhd1dpZHRoKCkge1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgIHRoaXMud2lkdGgsXG4gICAgICAodGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLndpZHRoKSB8fCAwLFxuICAgICAgKHRoaXMubWFzayAmJiB0aGlzLm1hc2sud2lkdGgpIHx8IDBcbiAgICApO1xuICB9XG5cbiAgZ2V0IGRyYXdIZWlnaHQoKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgdGhpcy5oZWlnaHQsXG4gICAgICAodGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLmhlaWdodCkgfHwgMCxcbiAgICAgICh0aGlzLm1hc2sgJiYgdGhpcy5tYXNrLmhlaWdodCkgfHwgMFxuICAgICk7XG4gIH1cblxuICBkZWNvZGVCdWZmZXIoYnVmZmVyKSB7XG4gICAgdmFyIGJwYyA9IHRoaXMuYnBjO1xuICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7XG5cbiAgICB2YXIgZGVjb2RlQWRkZW5kcyA9IHRoaXMuZGVjb2RlQWRkZW5kcztcbiAgICB2YXIgZGVjb2RlQ29lZmZpY2llbnRzID0gdGhpcy5kZWNvZGVDb2VmZmljaWVudHM7XG4gICAgdmFyIG1heCA9ICgxIDw8IGJwYykgLSAxO1xuICAgIHZhciBpLCBpaTtcblxuICAgIGlmIChicGMgPT09IDEpIHtcbiAgICAgIC8vIElmIHRoZSBidWZmZXIgbmVlZGVkIGRlY29kZSB0aGF0IG1lYW5zIGl0IGp1c3QgbmVlZHMgdG8gYmUgaW52ZXJ0ZWQuXG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9ICshYnVmZmVyW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAoaSA9IDAsIGlpID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0OyBpIDwgaWk7IGkrKykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Db21wczsgaisrKSB7XG4gICAgICAgIGJ1ZmZlcltpbmRleF0gPSBkZWNvZGVBbmRDbGFtcChcbiAgICAgICAgICBidWZmZXJbaW5kZXhdLFxuICAgICAgICAgIGRlY29kZUFkZGVuZHNbal0sXG4gICAgICAgICAgZGVjb2RlQ29lZmZpY2llbnRzW2pdLFxuICAgICAgICAgIG1heFxuICAgICAgICApO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudHMoYnVmZmVyKSB7XG4gICAgdmFyIGJwYyA9IHRoaXMuYnBjO1xuXG4gICAgLy8gVGhpcyBpbWFnZSBkb2Vzbid0IHJlcXVpcmUgYW55IGV4dHJhIHdvcmsuXG4gICAgaWYgKGJwYyA9PT0gOCkge1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzO1xuXG4gICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcHM7XG4gICAgdmFyIGJ1ZmZlclBvcyA9IDA7XG4gICAgbGV0IG91dHB1dDtcbiAgICBpZiAoYnBjIDw9IDgpIHtcbiAgICAgIG91dHB1dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgfSBlbHNlIGlmIChicGMgPD0gMTYpIHtcbiAgICAgIG91dHB1dCA9IG5ldyBVaW50MTZBcnJheShsZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIHJvd0NvbXBzID0gd2lkdGggKiBudW1Db21wcztcblxuICAgIHZhciBtYXggPSAoMSA8PCBicGMpIC0gMTtcbiAgICB2YXIgaSA9IDAsXG4gICAgICBpaSxcbiAgICAgIGJ1ZjtcblxuICAgIGlmIChicGMgPT09IDEpIHtcbiAgICAgIC8vIE9wdGltaXphdGlvbiBmb3IgcmVhZGluZyAxIGJwYyBpbWFnZXMuXG4gICAgICB2YXIgbWFzaywgbG9vcDFFbmQsIGxvb3AyRW5kO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykge1xuICAgICAgICBsb29wMUVuZCA9IGkgKyAocm93Q29tcHMgJiB+Nyk7XG4gICAgICAgIGxvb3AyRW5kID0gaSArIHJvd0NvbXBzO1xuXG4gICAgICAgIC8vIHVucm9sbCBsb29wIGZvciBhbGwgZnVsbCBieXRlc1xuICAgICAgICB3aGlsZSAoaSA8IGxvb3AxRW5kKSB7XG4gICAgICAgICAgYnVmID0gYnVmZmVyW2J1ZmZlclBvcysrXTtcbiAgICAgICAgICBvdXRwdXRbaV0gPSAoYnVmID4+IDcpICYgMTtcbiAgICAgICAgICBvdXRwdXRbaSArIDFdID0gKGJ1ZiA+PiA2KSAmIDE7XG4gICAgICAgICAgb3V0cHV0W2kgKyAyXSA9IChidWYgPj4gNSkgJiAxO1xuICAgICAgICAgIG91dHB1dFtpICsgM10gPSAoYnVmID4+IDQpICYgMTtcbiAgICAgICAgICBvdXRwdXRbaSArIDRdID0gKGJ1ZiA+PiAzKSAmIDE7XG4gICAgICAgICAgb3V0cHV0W2kgKyA1XSA9IChidWYgPj4gMikgJiAxO1xuICAgICAgICAgIG91dHB1dFtpICsgNl0gPSAoYnVmID4+IDEpICYgMTtcbiAgICAgICAgICBvdXRwdXRbaSArIDddID0gYnVmICYgMTtcbiAgICAgICAgICBpICs9IDg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgcmVtYWluaW5nIGJpdHNcbiAgICAgICAgaWYgKGkgPCBsb29wMkVuZCkge1xuICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcltidWZmZXJQb3MrK107XG4gICAgICAgICAgbWFzayA9IDEyODtcbiAgICAgICAgICB3aGlsZSAoaSA8IGxvb3AyRW5kKSB7XG4gICAgICAgICAgICBvdXRwdXRbaSsrXSA9ICshIShidWYgJiBtYXNrKTtcbiAgICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBnZW5lcmFsIGNhc2UgdGhhdCBoYW5kbGVzIGFsbCBvdGhlciBicGMgdmFsdWVzLlxuICAgICAgdmFyIGJpdHMgPSAwO1xuICAgICAgYnVmID0gMDtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gbGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICBpZiAoaSAlIHJvd0NvbXBzID09PSAwKSB7XG4gICAgICAgICAgYnVmID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChiaXRzIDwgYnBjKSB7XG4gICAgICAgICAgYnVmID0gKGJ1ZiA8PCA4KSB8IGJ1ZmZlcltidWZmZXJQb3MrK107XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlbWFpbmluZ0JpdHMgPSBiaXRzIC0gYnBjO1xuICAgICAgICBsZXQgdmFsdWUgPSBidWYgPj4gcmVtYWluaW5nQml0cztcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkge1xuICAgICAgICAgIHZhbHVlID0gbWF4O1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFtpXSA9IHZhbHVlO1xuICAgICAgICBidWYgPSBidWYgJiAoKDEgPDwgcmVtYWluaW5nQml0cykgLSAxKTtcbiAgICAgICAgYml0cyA9IHJlbWFpbmluZ0JpdHM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBmaWxsT3BhY2l0eShyZ2JhQnVmLCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGltYWdlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICByZ2JhQnVmIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICdQREZJbWFnZS5maWxsT3BhY2l0eTogVW5zdXBwb3J0ZWQgXCJyZ2JhQnVmXCIgdHlwZS4nXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgc21hc2sgPSB0aGlzLnNtYXNrO1xuICAgIHZhciBtYXNrID0gdGhpcy5tYXNrO1xuICAgIHZhciBhbHBoYUJ1Ziwgc3csIHNoLCBpLCBpaSwgajtcblxuICAgIGlmIChzbWFzaykge1xuICAgICAgc3cgPSBzbWFzay53aWR0aDtcbiAgICAgIHNoID0gc21hc2suaGVpZ2h0O1xuICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3cgKiBzaCk7XG4gICAgICBzbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7XG4gICAgICBpZiAoc3cgIT09IHdpZHRoIHx8IHNoICE9PSBoZWlnaHQpIHtcbiAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIHNtYXNrLmJwYywgc3csIHNoLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1hc2spIHtcbiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgUERGSW1hZ2UpIHtcbiAgICAgICAgc3cgPSBtYXNrLndpZHRoO1xuICAgICAgICBzaCA9IG1hc2suaGVpZ2h0O1xuICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzdyAqIHNoKTtcbiAgICAgICAgbWFzay5udW1Db21wcyA9IDE7XG4gICAgICAgIG1hc2suZmlsbEdyYXlCdWZmZXIoYWxwaGFCdWYpO1xuXG4gICAgICAgIC8vIE5lZWQgdG8gaW52ZXJ0IHZhbHVlcyBpbiByZ2JhQnVmXG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gc3cgKiBzaDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICBhbHBoYUJ1ZltpXSA9IDI1NSAtIGFscGhhQnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN3ICE9PSB3aWR0aCB8fCBzaCAhPT0gaGVpZ2h0KSB7XG4gICAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIG1hc2suYnBjLCBzdywgc2gsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWFzaykpIHtcbiAgICAgICAgLy8gQ29sb3Iga2V5IG1hc2s6IGlmIGFueSBvZiB0aGUgY29tcG9uZW50cyBhcmUgb3V0c2lkZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gdGhlbiB0aGV5IHNob3VsZCBiZSBwYWludGVkLlxuICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gICAgICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGggKiBoZWlnaHQ7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgdmFyIG9wYWNpdHkgPSAwO1xuICAgICAgICAgIHZhciBpbWFnZU9mZnNldCA9IGkgKiBudW1Db21wcztcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7ICsraikge1xuICAgICAgICAgICAgdmFyIGNvbG9yID0gaW1hZ2VbaW1hZ2VPZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIHZhciBtYXNrT2Zmc2V0ID0gaiAqIDI7XG4gICAgICAgICAgICBpZiAoY29sb3IgPCBtYXNrW21hc2tPZmZzZXRdIHx8IGNvbG9yID4gbWFza1ttYXNrT2Zmc2V0ICsgMV0pIHtcbiAgICAgICAgICAgICAgb3BhY2l0eSA9IDI1NTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFscGhhQnVmW2ldID0gb3BhY2l0eTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiVW5rbm93biBtYXNrIGZvcm1hdC5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFscGhhQnVmKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkge1xuICAgICAgICByZ2JhQnVmW2pdID0gYWxwaGFCdWZbaV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG1hc2suXG4gICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkge1xuICAgICAgICByZ2JhQnVmW2pdID0gMjU1O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVuZG9QcmVibGVuZChidWZmZXIsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnUERGSW1hZ2UudW5kb1ByZWJsZW5kOiBVbnN1cHBvcnRlZCBcImJ1ZmZlclwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIG1hdHRlID0gdGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLm1hdHRlO1xuICAgIGlmICghbWF0dGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG1hdHRlUmdiID0gdGhpcy5jb2xvclNwYWNlLmdldFJnYihtYXR0ZSwgMCk7XG4gICAgdmFyIG1hdHRlUiA9IG1hdHRlUmdiWzBdO1xuICAgIHZhciBtYXR0ZUcgPSBtYXR0ZVJnYlsxXTtcbiAgICB2YXIgbWF0dGVCID0gbWF0dGVSZ2JbMl07XG4gICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgYWxwaGEgPSBidWZmZXJbaSArIDNdO1xuICAgICAgaWYgKGFscGhhID09PSAwKSB7XG4gICAgICAgIC8vIGFjY29yZGluZyBmb3JtdWxhIHdlIGhhdmUgdG8gZ2V0IEluZmluaXR5IGluIGFsbCBjb21wb25lbnRzXG4gICAgICAgIC8vIG1ha2luZyBpdCB3aGl0ZSAodHlwaWNhbCBwYXBlciBjb2xvcikgc2hvdWxkIGJlIG9rYXlcbiAgICAgICAgYnVmZmVyW2ldID0gMjU1O1xuICAgICAgICBidWZmZXJbaSArIDFdID0gMjU1O1xuICAgICAgICBidWZmZXJbaSArIDJdID0gMjU1O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBrID0gMjU1IC8gYWxwaGE7XG4gICAgICBidWZmZXJbaV0gPSAoYnVmZmVyW2ldIC0gbWF0dGVSKSAqIGsgKyBtYXR0ZVI7XG4gICAgICBidWZmZXJbaSArIDFdID0gKGJ1ZmZlcltpICsgMV0gLSBtYXR0ZUcpICogayArIG1hdHRlRztcbiAgICAgIGJ1ZmZlcltpICsgMl0gPSAoYnVmZmVyW2kgKyAyXSAtIG1hdHRlQikgKiBrICsgbWF0dGVCO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUltYWdlRGF0YShmb3JjZVJHQkEgPSBmYWxzZSkge1xuICAgIHZhciBkcmF3V2lkdGggPSB0aGlzLmRyYXdXaWR0aDtcbiAgICB2YXIgZHJhd0hlaWdodCA9IHRoaXMuZHJhd0hlaWdodDtcbiAgICB2YXIgaW1nRGF0YSA9IHtcbiAgICAgIHdpZHRoOiBkcmF3V2lkdGgsXG4gICAgICBoZWlnaHQ6IGRyYXdIZWlnaHQsXG4gICAgICBraW5kOiAwLFxuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIC8vIE90aGVyIGZpZWxkcyBhcmUgZmlsbGVkIGluIGJlbG93LlxuICAgIH07XG5cbiAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzO1xuICAgIHZhciBvcmlnaW5hbFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICB2YXIgb3JpZ2luYWxIZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICB2YXIgYnBjID0gdGhpcy5icGM7XG5cbiAgICAvLyBSb3dzIHN0YXJ0IGF0IGJ5dGUgYm91bmRhcnkuXG4gICAgdmFyIHJvd0J5dGVzID0gKG9yaWdpbmFsV2lkdGggKiBudW1Db21wcyAqIGJwYyArIDcpID4+IDM7XG4gICAgdmFyIGltZ0FycmF5O1xuXG4gICAgaWYgKCFmb3JjZVJHQkEpIHtcbiAgICAgIC8vIElmIGl0IGlzIGEgMS1iaXQtcGVyLXBpeGVsIGdyYXlzY2FsZSAoaS5lLiBibGFjay1hbmQtd2hpdGUpIGltYWdlXG4gICAgICAvLyB3aXRob3V0IGFueSBjb21wbGljYXRpb25zLCB3ZSBwYXNzIGEgc2FtZS1zaXplZCBjb3B5IHRvIHRoZSBtYWluXG4gICAgICAvLyB0aHJlYWQgcmF0aGVyIHRoYW4gZXhwYW5kaW5nIGJ5IDMyeCB0byBSR0JBIGZvcm0uIFRoaXMgc2F2ZXMgKmxvdHMqXG4gICAgICAvLyBvZiBtZW1vcnkgZm9yIG1hbnkgc2Nhbm5lZCBkb2N1bWVudHMuIEl0J3MgYWxzbyBtdWNoIGZhc3Rlci5cbiAgICAgIC8vXG4gICAgICAvLyBTaW1pbGFybHksIGlmIGl0IGlzIGEgMjQtYml0LXBlciBwaXhlbCBSR0IgaW1hZ2Ugd2l0aG91dCBhbnlcbiAgICAgIC8vIGNvbXBsaWNhdGlvbnMsIHdlIGF2b2lkIGV4cGFuZGluZyBieSAxLjMzM3ggdG8gUkdCQSBmb3JtLlxuICAgICAgdmFyIGtpbmQ7XG4gICAgICBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09IFwiRGV2aWNlR3JheVwiICYmIGJwYyA9PT0gMSkge1xuICAgICAgICBraW5kID0gSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5jb2xvclNwYWNlLm5hbWUgPT09IFwiRGV2aWNlUkdCXCIgJiZcbiAgICAgICAgYnBjID09PSA4ICYmXG4gICAgICAgICF0aGlzLm5lZWRzRGVjb2RlXG4gICAgICApIHtcbiAgICAgICAga2luZCA9IEltYWdlS2luZC5SR0JfMjRCUFA7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGtpbmQgJiZcbiAgICAgICAgIXRoaXMuc21hc2sgJiZcbiAgICAgICAgIXRoaXMubWFzayAmJlxuICAgICAgICBkcmF3V2lkdGggPT09IG9yaWdpbmFsV2lkdGggJiZcbiAgICAgICAgZHJhd0hlaWdodCA9PT0gb3JpZ2luYWxIZWlnaHRcbiAgICAgICkge1xuICAgICAgICBpbWdEYXRhLmtpbmQgPSBraW5kO1xuXG4gICAgICAgIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMpO1xuICAgICAgICAvLyBJZiBpbWdBcnJheSBjYW1lIGZyb20gYSBEZWNvZGVTdHJlYW0sIHdlJ3JlIHNhZmUgdG8gdHJhbnNmZXIgaXRcbiAgICAgICAgLy8gKGFuZCB0aHVzIGRldGFjaCBpdHMgdW5kZXJseWluZyBidWZmZXIpIGJlY2F1c2UgaXQgd2lsbCBjb25zdGl0dXRlXG4gICAgICAgIC8vIHRoZSBlbnRpcmUgRGVjb2RlU3RyZWFtJ3MgZGF0YS4gIEJ1dCBpZiBpdCBjYW1lIGZyb20gYSBTdHJlYW0sIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gY29weSBpdCBiZWNhdXNlIGl0J2xsIG9ubHkgYmUgYSBwb3J0aW9uIG9mIHRoZSBTdHJlYW0nc1xuICAgICAgICAvLyBkYXRhLCBhbmQgdGhlIHJlc3Qgd2lsbCBiZSByZWFkIGxhdGVyIG9uLlxuICAgICAgICBpZiAodGhpcy5pbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSkge1xuICAgICAgICAgIGltZ0RhdGEuZGF0YSA9IGltZ0FycmF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuZXdBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdBcnJheS5sZW5ndGgpO1xuICAgICAgICAgIG5ld0FycmF5LnNldChpbWdBcnJheSk7XG4gICAgICAgICAgaW1nRGF0YS5kYXRhID0gbmV3QXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHtcbiAgICAgICAgICAvLyBJbnZlcnQgdGhlIGJ1ZmZlciAod2hpY2ggbXVzdCBiZSBncmF5c2NhbGUgaWYgd2UgcmVhY2hlZCBoZXJlKS5cbiAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICBraW5kID09PSBJbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAsXG4gICAgICAgICAgICBcIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gaW1nRGF0YS5kYXRhO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBidWZmZXJbaV0gXj0gMHhmZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGltZ0RhdGE7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pbWFnZSBpbnN0YW5jZW9mIEpwZWdTdHJlYW0gJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzaykge1xuICAgICAgICBsZXQgaW1hZ2VMZW5ndGggPSBvcmlnaW5hbEhlaWdodCAqIHJvd0J5dGVzO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY29sb3JTcGFjZS5uYW1lKSB7XG4gICAgICAgICAgY2FzZSBcIkRldmljZUdyYXlcIjpcbiAgICAgICAgICAgIC8vIEF2b2lkIHRydW5jYXRpbmcgdGhlIGltYWdlLCBzaW5jZSBgSnBlZ0ltYWdlLmdldERhdGFgXG4gICAgICAgICAgICAvLyB3aWxsIGV4cGFuZCB0aGUgaW1hZ2UgZGF0YSB3aGVuIGBmb3JjZVJHQiA9PT0gdHJ1ZWAuXG4gICAgICAgICAgICBpbWFnZUxlbmd0aCAqPSAzO1xuICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICBjYXNlIFwiRGV2aWNlUkdCXCI6XG4gICAgICAgICAgY2FzZSBcIkRldmljZUNNWUtcIjpcbiAgICAgICAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JfMjRCUFA7XG4gICAgICAgICAgICBpbWdEYXRhLmRhdGEgPSB0aGlzLmdldEltYWdlQnl0ZXMoXG4gICAgICAgICAgICAgIGltYWdlTGVuZ3RoLFxuICAgICAgICAgICAgICBkcmF3V2lkdGgsXG4gICAgICAgICAgICAgIGRyYXdIZWlnaHQsXG4gICAgICAgICAgICAgIC8qIGZvcmNlUkdCID0gKi8gdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBpbWdEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW1nQXJyYXkgPSB0aGlzLmdldEltYWdlQnl0ZXMob3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlcyk7XG4gICAgLy8gaW1nQXJyYXkgY2FuIGJlIGluY29tcGxldGUgKGUuZy4gYWZ0ZXIgQ0NJVFQgZmF4IGVuY29kaW5nKS5cbiAgICB2YXIgYWN0dWFsSGVpZ2h0ID1cbiAgICAgIDAgfCAoKChpbWdBcnJheS5sZW5ndGggLyByb3dCeXRlcykgKiBkcmF3SGVpZ2h0KSAvIG9yaWdpbmFsSGVpZ2h0KTtcblxuICAgIHZhciBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7XG5cbiAgICAvLyBJZiBvcGFjaXR5IGRhdGEgaXMgcHJlc2VudCwgdXNlIFJHQkFfMzJCUFAgZm9ybS4gT3RoZXJ3aXNlLCB1c2UgdGhlXG4gICAgLy8gbW9yZSBjb21wYWN0IFJHQl8yNEJQUCBmb3JtIGlmIGFsbG93YWJsZS5cbiAgICB2YXIgYWxwaGEwMSwgbWF5YmVVbmRvUHJlYmxlbmQ7XG4gICAgaWYgKCFmb3JjZVJHQkEgJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzaykge1xuICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDtcbiAgICAgIGltZ0RhdGEuZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkcmF3V2lkdGggKiBkcmF3SGVpZ2h0ICogMyk7XG4gICAgICBhbHBoYTAxID0gMDtcbiAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JBXzMyQlBQO1xuICAgICAgaW1nRGF0YS5kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiA0KTtcbiAgICAgIGFscGhhMDEgPSAxO1xuICAgICAgbWF5YmVVbmRvUHJlYmxlbmQgPSB0cnVlO1xuXG4gICAgICAvLyBDb2xvciBrZXkgbWFza2luZyAob3BhY2l0eSkgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGRlY29kaW5nLlxuICAgICAgdGhpcy5maWxsT3BhY2l0eShcbiAgICAgICAgaW1nRGF0YS5kYXRhLFxuICAgICAgICBkcmF3V2lkdGgsXG4gICAgICAgIGRyYXdIZWlnaHQsXG4gICAgICAgIGFjdHVhbEhlaWdodCxcbiAgICAgICAgY29tcHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHtcbiAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTtcbiAgICB9XG4gICAgdGhpcy5jb2xvclNwYWNlLmZpbGxSZ2IoXG4gICAgICBpbWdEYXRhLmRhdGEsXG4gICAgICBvcmlnaW5hbFdpZHRoLFxuICAgICAgb3JpZ2luYWxIZWlnaHQsXG4gICAgICBkcmF3V2lkdGgsXG4gICAgICBkcmF3SGVpZ2h0LFxuICAgICAgYWN0dWFsSGVpZ2h0LFxuICAgICAgYnBjLFxuICAgICAgY29tcHMsXG4gICAgICBhbHBoYTAxXG4gICAgKTtcbiAgICBpZiAobWF5YmVVbmRvUHJlYmxlbmQpIHtcbiAgICAgIHRoaXMudW5kb1ByZWJsZW5kKGltZ0RhdGEuZGF0YSwgZHJhd1dpZHRoLCBhY3R1YWxIZWlnaHQpO1xuICAgIH1cblxuICAgIHJldHVybiBpbWdEYXRhO1xuICB9XG5cbiAgZmlsbEdyYXlCdWZmZXIoYnVmZmVyKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBidWZmZXIgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ1BERkltYWdlLmZpbGxHcmF5QnVmZmVyOiBVbnN1cHBvcnRlZCBcImJ1ZmZlclwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIG51bUNvbXBzID0gdGhpcy5udW1Db21wcztcbiAgICBpZiAobnVtQ29tcHMgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgYFJlYWRpbmcgZ3JheSBzY2FsZSBmcm9tIGEgY29sb3IgaW1hZ2U6ICR7bnVtQ29tcHN9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICB2YXIgYnBjID0gdGhpcy5icGM7XG5cbiAgICAvLyByb3dzIHN0YXJ0IGF0IGJ5dGUgYm91bmRhcnlcbiAgICB2YXIgcm93Qnl0ZXMgPSAod2lkdGggKiBudW1Db21wcyAqIGJwYyArIDcpID4+IDM7XG4gICAgdmFyIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKGhlaWdodCAqIHJvd0J5dGVzKTtcblxuICAgIHZhciBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7XG4gICAgdmFyIGksIGxlbmd0aDtcblxuICAgIGlmIChicGMgPT09IDEpIHtcbiAgICAgIC8vIGlubGluZSBkZWNvZGluZyAoPSBpbnZlcnNpb24pIGZvciAxIGJwYyBpbWFnZXNcbiAgICAgIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHtcbiAgICAgICAgLy8gaW52ZXJ0IGFuZCBzY2FsZSB0byB7MCwgMjU1fVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBidWZmZXJbaV0gPSAoY29tcHNbaV0gLSAxKSAmIDI1NTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2NhbGUgdG8gezAsIDI1NX1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgYnVmZmVyW2ldID0gLWNvbXBzW2ldICYgMjU1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHtcbiAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTtcbiAgICB9XG4gICAgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQ7XG4gICAgLy8gd2UgYXJlbid0IHVzaW5nIGEgY29sb3JzcGFjZSBzbyB3ZSBuZWVkIHRvIHNjYWxlIHRoZSB2YWx1ZVxuICAgIHZhciBzY2FsZSA9IDI1NSAvICgoMSA8PCBicGMpIC0gMSk7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBidWZmZXJbaV0gPSBzY2FsZSAqIGNvbXBzW2ldO1xuICAgIH1cbiAgfVxuXG4gIGdldEltYWdlQnl0ZXMobGVuZ3RoLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIGZvcmNlUkdCID0gZmFsc2UpIHtcbiAgICB0aGlzLmltYWdlLnJlc2V0KCk7XG4gICAgdGhpcy5pbWFnZS5kcmF3V2lkdGggPSBkcmF3V2lkdGggfHwgdGhpcy53aWR0aDtcbiAgICB0aGlzLmltYWdlLmRyYXdIZWlnaHQgPSBkcmF3SGVpZ2h0IHx8IHRoaXMuaGVpZ2h0O1xuICAgIHRoaXMuaW1hZ2UuZm9yY2VSR0IgPSAhIWZvcmNlUkdCO1xuICAgIHJldHVybiB0aGlzLmltYWdlLmdldEJ5dGVzKGxlbmd0aCwgLyogZm9yY2VDbGFtcGVkID0gKi8gdHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGSW1hZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE4IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IsIHByZWZlci1jb25zdDogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgQWJvcnRFeGNlcHRpb24sXG4gIGFzc2VydCxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG4gIE1pc3NpbmdQREZFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbiAgVW5rbm93bkVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwiLi91dGlsLmpzXCI7XG5cbmNvbnN0IENhbGxiYWNrS2luZCA9IHtcbiAgVU5LTk9XTjogMCxcbiAgREFUQTogMSxcbiAgRVJST1I6IDIsXG59O1xuXG5jb25zdCBTdHJlYW1LaW5kID0ge1xuICBVTktOT1dOOiAwLFxuICBDQU5DRUw6IDEsXG4gIENBTkNFTF9DT01QTEVURTogMixcbiAgQ0xPU0U6IDMsXG4gIEVOUVVFVUU6IDQsXG4gIEVSUk9SOiA1LFxuICBQVUxMOiA2LFxuICBQVUxMX0NPTVBMRVRFOiA3LFxuICBTVEFSVF9DT01QTEVURTogOCxcbn07XG5cbmZ1bmN0aW9uIHdyYXBSZWFzb24ocmVhc29uKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICApIHtcbiAgICBhc3NlcnQoXG4gICAgICByZWFzb24gaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgICAgICAodHlwZW9mIHJlYXNvbiA9PT0gXCJvYmplY3RcIiAmJiByZWFzb24gIT09IG51bGwpLFxuICAgICAgJ3dyYXBSZWFzb246IEV4cGVjdGVkIFwicmVhc29uXCIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbiAhPT0gXCJvYmplY3RcIiB8fCByZWFzb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiByZWFzb247XG4gICAgfVxuICB9XG4gIHN3aXRjaCAocmVhc29uLm5hbWUpIHtcbiAgICBjYXNlIFwiQWJvcnRFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uc3RhdHVzKTtcbiAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmRldGFpbHMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnRvU3RyaW5nKCkpO1xuICB9XG59XG5cbmNsYXNzIE1lc3NhZ2VIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Ioc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7XG4gICAgdGhpcy5zb3VyY2VOYW1lID0gc291cmNlTmFtZTtcbiAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lO1xuICAgIHRoaXMuY29tT2JqID0gY29tT2JqO1xuICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7XG4gICAgdGhpcy5zdHJlYW1JZCA9IDE7XG4gICAgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHRydWU7XG4gICAgdGhpcy5zdHJlYW1TaW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zdHJlYW1Db250cm9sbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGE7XG4gICAgICBpZiAoZGF0YS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuc3RyZWFtKSB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5jYWxsYmFjaykge1xuICAgICAgICBjb25zdCBjYWxsYmFja0lkID0gZGF0YS5jYWxsYmFja0lkO1xuICAgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXR5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayAke2NhbGxiYWNrSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07XG5cbiAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5EQVRBKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEuZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkVSUk9SKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuICAgICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHtcbiAgICAgICAgY29uc3QgY2JTb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgICAgICBjb25zdCBjYlRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhKSk7XG4gICAgICAgIH0pLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuREFUQSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLFxuICAgICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLFxuICAgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLFxuICAgICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5zdHJlYW1JZCkge1xuICAgICAgICB0aGlzLl9jcmVhdGVTdHJlYW1TaW5rKGRhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhY3Rpb24oZGF0YS5kYXRhKTtcbiAgICB9O1xuICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7XG4gIH1cblxuICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICB0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiLFxuICAgICAgICAnTWVzc2FnZUhhbmRsZXIub246IEV4cGVjdGVkIFwiaGFuZGxlclwiIHRvIGJlIGEgZnVuY3Rpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYWggPSB0aGlzLmFjdGlvbkhhbmRsZXI7XG4gICAgaWYgKGFoW2FjdGlvbk5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgXCIke2FjdGlvbk5hbWV9XCJgKTtcbiAgICB9XG4gICAgYWhbYWN0aW9uTmFtZV0gPSBoYW5kbGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY29tT2JqIHRvIGludm9rZSB0aGUgYWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gQWN0aW9uIHRvIGNhbGwuXG4gICAqIEBwYXJhbSB7SlNPTn0gZGF0YSAtIEpTT04gZGF0YSB0byBzZW5kLlxuICAgKiBAcGFyYW0ge0FycmF5fSBbdHJhbnNmZXJzXSAtIExpc3Qgb2YgdHJhbnNmZXJzL0FycmF5QnVmZmVycy5cbiAgICovXG4gIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG4gICAgdGhpcy5fcG9zdE1lc3NhZ2UoXG4gICAgICB7XG4gICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLFxuICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICAgdHJhbnNmZXJzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGNvbU9iaiB0byBpbnZva2UgdGhlIGFjdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBkYXRhLlxuICAgKiBFeHBlY3RzIHRoYXQgdGhlIG90aGVyIHNpZGUgd2lsbCBjYWxsYmFjayB3aXRoIHRoZSByZXNwb25zZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gdG8gY2FsbC5cbiAgICogQHBhcmFtIHtKU09OfSBkYXRhIC0gSlNPTiBkYXRhIHRvIHNlbmQuXG4gICAqIEBwYXJhbSB7QXJyYXl9IFt0cmFuc2ZlcnNdIC0gTGlzdCBvZiB0cmFuc2ZlcnMvQXJyYXlCdWZmZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0byBiZSByZXNvbHZlZCB3aXRoIHJlc3BvbnNlIGRhdGEuXG4gICAqL1xuICBzZW5kV2l0aFByb21pc2UoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG4gICAgY29uc3QgY2FsbGJhY2tJZCA9IHRoaXMuY2FsbGJhY2tJZCsrO1xuICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF0gPSBjYXBhYmlsaXR5O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9wb3N0TWVzc2FnZShcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgICAgIGNhbGxiYWNrSWQsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmZXJzXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjYXBhYmlsaXR5LnJlamVjdChleCk7XG4gICAgfVxuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBjb21PYmogdG8gaW52b2tlIHRoZSBhY3Rpb24gd2l0aCB0aGUgc3VwcGxpZWQgZGF0YS5cbiAgICogRXhwZWN0IHRoYXQgdGhlIG90aGVyIHNpZGUgd2lsbCBjYWxsYmFjayB0byBzaWduYWwgJ3N0YXJ0X2NvbXBsZXRlJy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gdG8gY2FsbC5cbiAgICogQHBhcmFtIHtKU09OfSBkYXRhIC0gSlNPTiBkYXRhIHRvIHNlbmQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBxdWV1ZWluZ1N0cmF0ZWd5IC0gU3RyYXRlZ3kgdG8gc2lnbmFsIGJhY2twcmVzc3VyZSBiYXNlZCBvblxuICAgKiAgICAgICAgICAgICAgICAgaW50ZXJuYWwgcXVldWUuXG4gICAqIEBwYXJhbSB7QXJyYXl9IFt0cmFuc2ZlcnNdIC0gTGlzdCBvZiB0cmFuc2ZlcnMvQXJyYXlCdWZmZXJzLlxuICAgKiBAcmV0dXJucyB7UmVhZGFibGVTdHJlYW19IFJlYWRhYmxlU3RyZWFtIHRvIHJlYWQgZGF0YSBpbiBjaHVua3MuXG4gICAqL1xuICBzZW5kV2l0aFN0cmVhbShhY3Rpb25OYW1lLCBkYXRhLCBxdWV1ZWluZ1N0cmF0ZWd5LCB0cmFuc2ZlcnMpIHtcbiAgICBjb25zdCBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKztcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgIGNvbnN0IHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWU7XG4gICAgY29uc3QgY29tT2JqID0gdGhpcy5jb21PYmo7XG5cbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgICAge1xuICAgICAgICBzdGFydDogY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSA9IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICBzdGFydENhbGw6IHN0YXJ0Q2FwYWJpbGl0eSxcbiAgICAgICAgICAgIHB1bGxDYWxsOiBudWxsLFxuICAgICAgICAgICAgY2FuY2VsQ2FsbDogbnVsbCxcbiAgICAgICAgICAgIGlzQ2xvc2VkOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX3Bvc3RNZXNzYWdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG4gICAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFuc2ZlcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFJldHVybiBQcm9taXNlIGZvciBBc3luYyBwcm9jZXNzLCB0byBzaWduYWwgc3VjY2Vzcy9mYWlsdXJlLlxuICAgICAgICAgIHJldHVybiBzdGFydENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBwdWxsOiBjb250cm9sbGVyID0+IHtcbiAgICAgICAgICBjb25zdCBwdWxsQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwgPSBwdWxsQ2FwYWJpbGl0eTtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTCxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gUmV0dXJuaW5nIFByb21pc2Ugd2lsbCBub3QgY2FsbCBcInB1bGxcIlxuICAgICAgICAgIC8vIGFnYWluIHVudGlsIGN1cnJlbnQgcHVsbCBpcyByZXNvbHZlZC5cbiAgICAgICAgICByZXR1cm4gcHVsbENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBjYW5jZWw6IHJlYXNvbiA9PiB7XG4gICAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCBcImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbCA9IGNhbmNlbENhcGFiaWxpdHk7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFJldHVybiBQcm9taXNlIHRvIHNpZ25hbCBzdWNjZXNzIG9yIGZhaWx1cmUuXG4gICAgICAgICAgcmV0dXJuIGNhbmNlbENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBxdWV1ZWluZ1N0cmF0ZWd5XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkO1xuICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7XG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTtcbiAgICBjb25zdCBjb21PYmogPSB0aGlzLmNvbU9iajtcblxuICAgIGNvbnN0IHN0cmVhbVNpbmsgPSB7XG4gICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3REZXNpcmVkU2l6ZSA9IHRoaXMuZGVzaXJlZFNpemU7XG4gICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gc2l6ZTtcbiAgICAgICAgLy8gRW5xdWV1ZSBkZWNyZWFzZXMgdGhlIGRlc2lyZWRTaXplIHByb3BlcnR5IG9mIHNpbmssXG4gICAgICAgIC8vIHNvIHdoZW4gaXQgY2hhbmdlcyBmcm9tIHBvc2l0aXZlIHRvIG5lZ2F0aXZlLFxuICAgICAgICAvLyBzZXQgcmVhZHkgYXMgdW5yZXNvbHZlZCBwcm9taXNlLlxuICAgICAgICBpZiAobGFzdERlc2lyZWRTaXplID4gMCAmJiB0aGlzLmRlc2lyZWRTaXplIDw9IDApIHtcbiAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuX3Bvc3RNZXNzYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVOUVVFVUUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJhbnNmZXJzXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DTE9TRSxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKHJlYXNvbikge1xuICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVSUk9SLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbmtDYXBhYmlsaXR5OiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpLFxuICAgICAgb25QdWxsOiBudWxsLFxuICAgICAgb25DYW5jZWw6IG51bGwsXG4gICAgICBpc0NhbmNlbGxlZDogZmFsc2UsXG4gICAgICBkZXNpcmVkU2l6ZTogZGF0YS5kZXNpcmVkU2l6ZSxcbiAgICAgIHJlYWR5OiBudWxsLFxuICAgIH07XG5cbiAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICBzdHJlYW1TaW5rLnJlYWR5ID0gc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdID0gc3RyZWFtU2luaztcbiAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhLCBzdHJlYW1TaW5rKSk7XG4gICAgfSkudGhlbihcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZDtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgIGNvbnN0IHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG4gICAgY29uc3QgY29tT2JqID0gdGhpcy5jb21PYmo7XG5cbiAgICBzd2l0Y2ggKGRhdGEuc3RyZWFtKSB7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5zdGFydENhbGwucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnN0YXJ0Q2FsbC5yZWplY3QoXG4gICAgICAgICAgICB3cmFwUmVhc29uKGRhdGEucmVhc29uKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbC5yZWplY3QoXG4gICAgICAgICAgICB3cmFwUmVhc29uKGRhdGEucmVhc29uKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTDpcbiAgICAgICAgLy8gSWdub3JlIGFueSBwdWxsIGFmdGVyIGNsb3NlIGlzIGNhbGxlZC5cbiAgICAgICAgaWYgKCF0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFB1bGwgaW5jcmVhc2VzIHRoZSBkZXNpcmVkU2l6ZSBwcm9wZXJ0eSBvZiBzaW5rLFxuICAgICAgICAvLyBzbyB3aGVuIGl0IGNoYW5nZXMgZnJvbSBuZWdhdGl2ZSB0byBwb3NpdGl2ZSxcbiAgICAgICAgLy8gc2V0IHJlYWR5IHByb3BlcnR5IGFzIHJlc29sdmVkIHByb21pc2UuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5kZXNpcmVkU2l6ZSA8PSAwICYmXG4gICAgICAgICAgZGF0YS5kZXNpcmVkU2l6ZSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IGRlc2lyZWRTaXplIHByb3BlcnR5IG9mIHNpbmsgb24gZXZlcnkgcHVsbC5cbiAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uZGVzaXJlZFNpemUgPSBkYXRhLmRlc2lyZWRTaXplO1xuICAgICAgICBjb25zdCB7IG9uUHVsbCB9ID0gdGhpcy5zdHJlYW1TaW5rc1tkYXRhLnN0cmVhbUlkXTtcbiAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKG9uUHVsbCAmJiBvblB1bGwoKSk7XG4gICAgICAgIH0pLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOlxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sXG4gICAgICAgICAgXCJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5lbnF1ZXVlKGRhdGEuY2h1bmspO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRTpcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLFxuICAgICAgICAgIFwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIlxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOlxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sXG4gICAgICAgICAgXCJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgd3JhcFJlYXNvbihkYXRhLnJlYXNvbilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwucmVqZWN0KFxuICAgICAgICAgICAgd3JhcFJlYXNvbihkYXRhLnJlYXNvbilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUw6XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG9uQ2FuY2VsIH0gPSB0aGlzLnN0cmVhbVNpbmtzW2RhdGEuc3RyZWFtSWRdO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUob25DYW5jZWwgJiYgb25DYW5jZWwod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpKTtcbiAgICAgICAgfSkudGhlbihcbiAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLFxuICAgICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSxcbiAgICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5zaW5rQ2FwYWJpbGl0eS5yZWplY3QoXG4gICAgICAgICAgd3JhcFJlYXNvbihkYXRhLnJlYXNvbilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBzdHJlYW0gY2FzZVwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIF9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKSB7XG4gICAgLy8gRGVsZXRlIHRoZSBgc3RyZWFtQ29udHJvbGxlcmAgb25seSB3aGVuIHRoZSBzdGFydCwgcHVsbCwgYW5kIGNhbmNlbFxuICAgIC8vIGNhcGFiaWxpdGllcyBoYXZlIHNldHRsZWQsIHRvIHByZXZlbnQgYFR5cGVFcnJvcmBzLlxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIFtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLFxuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCxcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbCxcbiAgICAgIF0ubWFwKGZ1bmN0aW9uIChjYXBhYmlsaXR5KSB7XG4gICAgICAgIHJldHVybiBjYXBhYmlsaXR5ICYmIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgcmF3IG1lc3NhZ2UgdG8gdGhlIGNvbU9iai5cbiAgICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2UgLSBSYXcgbWVzc2FnZS5cbiAgICogQHBhcmFtIHRyYW5zZmVycyBMaXN0IG9mIHRyYW5zZmVycy9BcnJheUJ1ZmZlcnMsIG9yIHVuZGVmaW5lZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2ZlcnMpIHtcbiAgICBpZiAodHJhbnNmZXJzICYmIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMpIHtcbiAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCB7IE1lc3NhZ2VIYW5kbGVyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxOSBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW19ICovXG5jbGFzcyBQREZXb3JrZXJTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihtc2dIYW5kbGVyKSB7XG4gICAgdGhpcy5fbXNnSGFuZGxlciA9IG1zZ0hhbmRsZXI7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuXG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLFxuICAgICAgXCJQREZXb3JrZXJTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIlxuICAgICk7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmVhZGVyKHRoaXMuX21zZ0hhbmRsZXIpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuXG4gIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCwgdGhpcy5fbXNnSGFuZGxlcik7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfVxuXG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikge1xuICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlcnMgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApO1xuICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmVhZGVyKSB7XG4gICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmVhZGVyfSAqL1xuY2xhc3MgUERGV29ya2VyU3RyZWFtUmVhZGVyIHtcbiAgY29uc3RydWN0b3IobXNnSGFuZGxlcikge1xuICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gbnVsbDtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbShcIkdldFJlYWRlclwiKTtcbiAgICB0aGlzLl9yZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcblxuICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IHRoaXMuX21zZ0hhbmRsZXJcbiAgICAgIC5zZW5kV2l0aFByb21pc2UoXCJSZWFkZXJIZWFkZXJzUmVhZHlcIilcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGRhdGEuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gICAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBkYXRhLmlzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBkYXRhLmNvbnRlbnRMZW5ndGg7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTtcbiAgfVxuXG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuXG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG5cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgfVxuICAgIC8vIGB2YWx1ZWAgaXMgd3JhcHBlZCBpbnRvIFVpbnQ4QXJyYXksIHdlIG5lZWQgdG9cbiAgICAvLyB1bndyYXAgaXQgdG8gQXJyYXlCdWZmZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy5cbiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUuYnVmZmVyLCBkb25lOiBmYWxzZSB9O1xuICB9XG5cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgfVxufVxuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW1SYW5nZVJlYWRlcn0gKi9cbmNsYXNzIFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCwgbXNnSGFuZGxlcikge1xuICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cbiAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRSYW5nZVJlYWRlclwiLCB7XG4gICAgICBiZWdpbixcbiAgICAgIGVuZCxcbiAgICB9KTtcbiAgICB0aGlzLl9yZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgfVxuXG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZWFkKCkge1xuICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLmJ1ZmZlciwgZG9uZTogZmFsc2UgfTtcbiAgfVxuXG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGV29ya2VyU3RyZWFtIH07XG4iXSwic291cmNlUm9vdCI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvcGRmLndvcmtlci5taW4uanMgYi9idWlsZC9wZGYud29ya2VyLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAzZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvcGRmLndvcmtlci5taW4uanMKQEAgLTAsMCArMSwyMiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworIWZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciIsW10sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHNbInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciJdPXQoKTplWyJwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIiXT1lLnBkZmpzV29ya2VyPXQoKX0odGhpcywoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhyKXtpZih0W3JdKXJldHVybiB0W3JdLmV4cG9ydHM7dmFyIGE9dFtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07ZVtyXS5jYWxsKGEuZXhwb3J0cyxhLGEuZXhwb3J0cyxfX3dfcGRmanNfcmVxdWlyZV9fKTthLmw9ITA7cmV0dXJuIGEuZXhwb3J0c31fX3dfcGRmanNfcmVxdWlyZV9fLm09ZTtfX3dfcGRmanNfcmVxdWlyZV9fLmM9dDtfX3dfcGRmanNfcmVxdWlyZV9fLmQ9ZnVuY3Rpb24oZSx0LHIpe19fd19wZGZqc19yZXF1aXJlX18ubyhlLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGdldDpyfSl9O19fd19wZGZqc19yZXF1aXJlX18ucj1mdW5jdGlvbihlKXsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfTtfX3dfcGRmanNfcmVxdWlyZV9fLnQ9ZnVuY3Rpb24oZSx0KXsxJnQmJihlPV9fd19wZGZqc19yZXF1aXJlX18oZSkpO2lmKDgmdClyZXR1cm4gZTtpZig0JnQmJiJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7X193X3BkZmpzX3JlcXVpcmVfXy5yKHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSk7aWYoMiZ0JiYic3RyaW5nIiE9dHlwZW9mIGUpZm9yKHZhciBhIGluIGUpX193X3BkZmpzX3JlcXVpcmVfXy5kKHIsYSxmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0uYmluZChudWxsLGEpKTtyZXR1cm4gcn07X193X3BkZmpzX3JlcXVpcmVfXy5uPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbiBnZXREZWZhdWx0KCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpe3JldHVybiBlfTtfX3dfcGRmanNfcmVxdWlyZV9fLmQodCwiYSIsdCk7cmV0dXJuIHR9O19fd19wZGZqc19yZXF1aXJlX18ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX07X193X3BkZmpzX3JlcXVpcmVfXy5wPSIiO3JldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucz0wKX0oW2Z1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJXb3JrZXJNZXNzYWdlSGFuZGxlciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuV29ya2VyTWVzc2FnZUhhbmRsZXJ9fSk7dmFyIGE9cigxKX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Xb3JrZXJNZXNzYWdlSGFuZGxlcj10LldvcmtlclRhc2s9dm9pZCAwO3ZhciBhPXIoMiksaT1yKDUpLG49cig2KSxzPXIoMjcpLG89cig0KSxjPXIoNDYpLGw9cig0NyksaD1yKDgpO2NsYXNzIFdvcmtlclRhc2t7Y29uc3RydWN0b3IoZSl7dGhpcy5uYW1lPWU7dGhpcy50ZXJtaW5hdGVkPSExO3RoaXMuX2NhcGFiaWxpdHk9KDAsYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKX1nZXQgZmluaXNoZWQoKXtyZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlfWZpbmlzaCgpe3RoaXMuX2NhcGFiaWxpdHkucmVzb2x2ZSgpfXRlcm1pbmF0ZSgpe3RoaXMudGVybWluYXRlZD0hMH1lbnN1cmVOb3RUZXJtaW5hdGVkKCl7aWYodGhpcy50ZXJtaW5hdGVkKXRocm93IG5ldyBFcnJvcigiV29ya2VyIHRhc2sgd2FzIHRlcm1pbmF0ZWQiKX19dC5Xb3JrZXJUYXNrPVdvcmtlclRhc2s7Y2xhc3MgV29ya2VyTWVzc2FnZUhhbmRsZXJ7c3RhdGljIHNldHVwKGUsdCl7dmFyIHI9ITE7ZS5vbigidGVzdCIsKGZ1bmN0aW9uIHdwaFNldHVwVGVzdCh0KXtpZihyKXJldHVybjtyPSEwO2lmKCEodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXtlLnNlbmQoInRlc3QiLG51bGwpO3JldHVybn1jb25zdCBhPTI1NT09PXRbMF07ZS5wb3N0TWVzc2FnZVRyYW5zZmVycz1hO2Uuc2VuZCgidGVzdCIse3N1cHBvcnRUcmFuc2ZlcnM6YX0pfSkpO2Uub24oImNvbmZpZ3VyZSIsKGZ1bmN0aW9uIHdwaENvbmZpZ3VyZShlKXsoMCxhLnNldFZlcmJvc2l0eUxldmVsKShlLnZlcmJvc2l0eSl9KSk7ZS5vbigiR2V0RG9jUmVxdWVzdCIsKGZ1bmN0aW9uIHdwaFNldHVwRG9jKGUpe3JldHVybiBXb3JrZXJNZXNzYWdlSGFuZGxlci5jcmVhdGVEb2N1bWVudEhhbmRsZXIoZSx0KX0pKX1zdGF0aWMgY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGUsdCl7dmFyIHIsbz0hMSx1PW51bGwsZD1bXTtjb25zdCBmPSgwLGEuZ2V0VmVyYm9zaXR5TGV2ZWwpKCksZz1lLmFwaVZlcnNpb247aWYoIjIuNi4zNDciIT09Zyl0aHJvdyBuZXcgRXJyb3IoYFRoZSBBUEkgdmVyc2lvbiAiJHtnfSIgZG9lcyBub3QgbWF0Y2ggdGhlIFdvcmtlciB2ZXJzaW9uICIyLjYuMzQ3Ii5gKTtjb25zdCBtPVtdO2Zvcihjb25zdCBlIGluW10pbS5wdXNoKGUpO2lmKG0ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVGhlIGBBcnJheS5wcm90b3R5cGVgIGNvbnRhaW5zIHVuZXhwZWN0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzOiAiK20uam9pbigiLCAiKSsiOyB0aHVzIGJyZWFraW5nIGUuZy4gYGZvci4uLmluYCBpdGVyYXRpb24gb2YgYEFycmF5YHMuIik7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWFkYWJsZVN0cmVhbXx8dm9pZCAwPT09UHJvbWlzZS5hbGxTZXR0bGVkKXRocm93IG5ldyBFcnJvcigiVGhlIGJyb3dzZXIvZW52aXJvbm1lbnQgbGFja3MgbmF0aXZlIHN1cHBvcnQgZm9yIGNyaXRpY2FsIGZ1bmN0aW9uYWxpdHkgdXNlZCBieSB0aGUgUERGLmpzIGxpYnJhcnkgKGUuZy4gYFJlYWRhYmxlU3RyZWFtYCBhbmQvb3IgYFByb21pc2UuYWxsU2V0dGxlZGApOyBwbGVhc2UgdXNlIGFuIEVTNS1jb21wYXRpYmxlIGJ1aWxkIGluc3RlYWQuIik7dmFyIHA9ZS5kb2NJZCxiPWUuZG9jQmFzZVVybCx5PWUuZG9jSWQrIl93b3JrZXIiLHY9bmV3IGMuTWVzc2FnZUhhbmRsZXIoeSxwLHQpO3YucG9zdE1lc3NhZ2VUcmFuc2ZlcnM9ZS5wb3N0TWVzc2FnZVRyYW5zZmVycztmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCl7aWYobyl0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpfWZ1bmN0aW9uIHN0YXJ0V29ya2VyVGFzayhlKXtkLnB1c2goZSl9ZnVuY3Rpb24gZmluaXNoV29ya2VyVGFzayhlKXtlLmZpbmlzaCgpO3ZhciB0PWQuaW5kZXhPZihlKTtkLnNwbGljZSh0LDEpfWFzeW5jIGZ1bmN0aW9uIGxvYWREb2N1bWVudChlKXthd2FpdCByLmVuc3VyZURvYygiY2hlY2tIZWFkZXIiKTthd2FpdCByLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKTthd2FpdCByLmVuc3VyZURvYygicGFyc2UiLFtlXSk7ZXx8YXdhaXQgci5lbnN1cmVEb2MoImNoZWNrRmlyc3RQYWdlIik7Y29uc3RbdCxhXT1hd2FpdCBQcm9taXNlLmFsbChbci5lbnN1cmVEb2MoIm51bVBhZ2VzIiksci5lbnN1cmVEb2MoImZpbmdlcnByaW50IildKTtyZXR1cm57bnVtUGFnZXM6dCxmaW5nZXJwcmludDphfX1mdW5jdGlvbiBnZXRQZGZNYW5hZ2VyKGUsdCl7dmFyIHI9KDAsYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtsZXQgaTt2YXIgcz1lLnNvdXJjZTtpZihzLmRhdGEpe3RyeXtpPW5ldyBuLkxvY2FsUGRmTWFuYWdlcihwLHMuZGF0YSxzLnBhc3N3b3JkLHQsYik7ci5yZXNvbHZlKGkpfWNhdGNoKGUpe3IucmVqZWN0KGUpfXJldHVybiByLnByb21pc2V9dmFyIG8sYz1bXTt0cnl7bz1uZXcgbC5QREZXb3JrZXJTdHJlYW0odil9Y2F0Y2goZSl7ci5yZWplY3QoZSk7cmV0dXJuIHIucHJvbWlzZX12YXIgaD1vLmdldEZ1bGxSZWFkZXIoKTtoLmhlYWRlcnNSZWFkeS50aGVuKChmdW5jdGlvbigpe2lmKGguaXNSYW5nZVN1cHBvcnRlZCl7dmFyIGU9cy5kaXNhYmxlQXV0b0ZldGNofHxoLmlzU3RyZWFtaW5nU3VwcG9ydGVkO2k9bmV3IG4uTmV0d29ya1BkZk1hbmFnZXIocCxvLHttc2dIYW5kbGVyOnYscGFzc3dvcmQ6cy5wYXNzd29yZCxsZW5ndGg6aC5jb250ZW50TGVuZ3RoLGRpc2FibGVBdXRvRmV0Y2g6ZSxyYW5nZUNodW5rU2l6ZTpzLnJhbmdlQ2h1bmtTaXplfSx0LGIpO2ZvcihsZXQgZT0wO2U8Yy5sZW5ndGg7ZSsrKWkuc2VuZFByb2dyZXNzaXZlRGF0YShjW2VdKTtjPVtdO3IucmVzb2x2ZShpKTt1PW51bGx9fSkpLmNhdGNoKChmdW5jdGlvbihlKXtyLnJlamVjdChlKTt1PW51bGx9KSk7dmFyIGQ9MDtuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxvKXt2YXIgcmVhZENodW5rPWZ1bmN0aW9uKHt2YWx1ZTplLGRvbmU6bH0pe3RyeXtlbnN1cmVOb3RUZXJtaW5hdGVkKCk7aWYobCl7aXx8ZnVuY3Rpb24oKXt2YXIgZT0oMCxhLmFycmF5c1RvQnl0ZXMpKGMpO3MubGVuZ3RoJiZlLmxlbmd0aCE9PXMubGVuZ3RoJiYoMCxhLndhcm4pKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTt0cnl7aT1uZXcgbi5Mb2NhbFBkZk1hbmFnZXIocCxlLHMucGFzc3dvcmQsdCxiKTtyLnJlc29sdmUoaSl9Y2F0Y2goZSl7ci5yZWplY3QoZSl9Yz1bXX0oKTt1PW51bGw7cmV0dXJufWQrPSgwLGEuYXJyYXlCeXRlTGVuZ3RoKShlKTtoLmlzU3RyZWFtaW5nU3VwcG9ydGVkfHx2LnNlbmQoIkRvY1Byb2dyZXNzIix7bG9hZGVkOmQsdG90YWw6TWF0aC5tYXgoZCxoLmNvbnRlbnRMZW5ndGh8fDApfSk7aT9pLnNlbmRQcm9ncmVzc2l2ZURhdGEoZSk6Yy5wdXNoKGUpO2gucmVhZCgpLnRoZW4ocmVhZENodW5rLG8pfWNhdGNoKGUpe28oZSl9fTtoLnJlYWQoKS50aGVuKHJlYWRDaHVuayxvKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7ci5yZWplY3QoZSk7dT1udWxsfSkpO3U9ZnVuY3Rpb24oZSl7by5jYW5jZWxBbGxSZXF1ZXN0cyhlKX07cmV0dXJuIHIucHJvbWlzZX12Lm9uKCJHZXRQYWdlIiwoZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlKGUpe3JldHVybiByLmdldFBhZ2UoZS5wYWdlSW5kZXgpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChbci5lbnN1cmUoZSwicm90YXRlIiksci5lbnN1cmUoZSwicmVmIiksci5lbnN1cmUoZSwidXNlclVuaXQiKSxyLmVuc3VyZShlLCJ2aWV3IildKS50aGVuKChmdW5jdGlvbihbZSx0LHIsYV0pe3JldHVybntyb3RhdGU6ZSxyZWY6dCx1c2VyVW5pdDpyLHZpZXc6YX19KSl9KSl9KSk7di5vbigiR2V0UGFnZUluZGV4IiwoZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlSW5kZXgoe3JlZjplfSl7Y29uc3QgdD1pLlJlZi5nZXQoZS5udW0sZS5nZW4pO3JldHVybiByLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsW3RdKX0pKTt2Lm9uKCJHZXREZXN0aW5hdGlvbnMiLChmdW5jdGlvbiB3cGhTZXR1cEdldERlc3RpbmF0aW9ucyhlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJkZXN0aW5hdGlvbnMiKX0pKTt2Lm9uKCJHZXREZXN0aW5hdGlvbiIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0RGVzdGluYXRpb24oZSl7cmV0dXJuIHIuZW5zdXJlQ2F0YWxvZygiZ2V0RGVzdGluYXRpb24iLFtlLmlkXSl9KSk7di5vbigiR2V0UGFnZUxhYmVscyIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUxhYmVscyhlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJwYWdlTGFiZWxzIil9KSk7di5vbigiR2V0UGFnZUxheW91dCIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUxheW91dChlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJwYWdlTGF5b3V0Iil9KSk7di5vbigiR2V0UGFnZU1vZGUiLChmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2VNb2RlKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coInBhZ2VNb2RlIil9KSk7di5vbigiR2V0Vmlld2VyUHJlZmVyZW5jZXMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJ2aWV3ZXJQcmVmZXJlbmNlcyIpfSkpO3Yub24oIkdldE9wZW5BY3Rpb24iLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJvcGVuQWN0aW9uIil9KSk7di5vbigiR2V0QXR0YWNobWVudHMiLChmdW5jdGlvbiB3cGhTZXR1cEdldEF0dGFjaG1lbnRzKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIil9KSk7di5vbigiR2V0SmF2YVNjcmlwdCIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0SmF2YVNjcmlwdChlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJqYXZhU2NyaXB0Iil9KSk7di5vbigiR2V0T3V0bGluZSIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0T3V0bGluZShlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJkb2N1bWVudE91dGxpbmUiKX0pKTt2Lm9uKCJHZXRPcHRpb25hbENvbnRlbnRDb25maWciLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJvcHRpb25hbENvbnRlbnRDb25maWciKX0pKTt2Lm9uKCJHZXRQZXJtaXNzaW9ucyIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coInBlcm1pc3Npb25zIil9KSk7di5vbigiR2V0TWV0YWRhdGEiLChmdW5jdGlvbiB3cGhTZXR1cEdldE1ldGFkYXRhKGUpe3JldHVybiBQcm9taXNlLmFsbChbci5lbnN1cmVEb2MoImRvY3VtZW50SW5mbyIpLHIuZW5zdXJlQ2F0YWxvZygibWV0YWRhdGEiKV0pfSkpO3Yub24oIkdldERhdGEiLChmdW5jdGlvbiB3cGhTZXR1cEdldERhdGEoZSl7ci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCk7cmV0dXJuIHIub25Mb2FkZWRTdHJlYW0oKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gZS5ieXRlc30pKX0pKTt2Lm9uKCJHZXRTdGF0cyIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0U3RhdHMoZSl7cmV0dXJuIHIuZW5zdXJlWFJlZigic3RhdHMiKX0pKTt2Lm9uKCJHZXRBbm5vdGF0aW9ucyIsKGZ1bmN0aW9uKHtwYWdlSW5kZXg6ZSxpbnRlbnQ6dH0pe3JldHVybiByLmdldFBhZ2UoZSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QW5ub3RhdGlvbnNEYXRhKHQpfSkpfSkpO3Yub24oIlNhdmVEb2N1bWVudCIsKGZ1bmN0aW9uKHtudW1QYWdlczplLGFubm90YXRpb25TdG9yYWdlOnQsZmlsZW5hbWU6aX0pe3IucmVxdWVzdExvYWRlZFN0cmVhbSgpO2NvbnN0IG49W3Iub25Mb2FkZWRTdHJlYW0oKV0sbz1yLnBkZkRvY3VtZW50O2ZvcihsZXQgYT0wO2E8ZTthKyspbi5wdXNoKHIuZ2V0UGFnZShhKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCByPW5ldyBXb3JrZXJUYXNrKCJTYXZlOiBwYWdlICIrYSk7cmV0dXJuIGUuc2F2ZSh2LHIsdCl9KSkpO3JldHVybiBQcm9taXNlLmFsbChuKS50aGVuKChbZSwuLi50XSk9PntsZXQgcj1bXTtmb3IoY29uc3QgZSBvZiB0KXI9ZS5maWx0ZXIoZT0+bnVsbCE9PWUpLnJlZHVjZSgoZSx0KT0+ZS5jb25jYXQodCkscik7aWYoMD09PXIubGVuZ3RoKXJldHVybiBlLmJ5dGVzO2NvbnN0IG49by54cmVmO2xldCBjPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi50cmFpbGVyKXtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCksdD1uLnRyYWlsZXIuZ2V0KCJJbmZvIil8fG51bGw7dCYmdC5mb3JFYWNoKCh0LHIpPT57KDAsYS5pc1N0cmluZykodCkmJigwLGEuaXNTdHJpbmcpKHIpJiYoZVt0XT0oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShyKSl9KTtjPXtyb290UmVmOm4udHJhaWxlci5nZXRSYXcoIlJvb3QiKXx8bnVsbCxlbmNyeXB0Om4udHJhaWxlci5nZXRSYXcoIkVuY3J5cHQiKXx8bnVsbCxuZXdSZWY6bi5nZXROZXdSZWYoKSxpbmZvUmVmOm4udHJhaWxlci5nZXRSYXcoIkluZm8iKXx8bnVsbCxpbmZvOmUsZmlsZUlkczpuLnRyYWlsZXIuZ2V0UmF3KCJJRCIpfHxudWxsLHN0YXJ0WFJlZjpvLnN0YXJ0WFJlZixmaWxlbmFtZTppfX1uLnJlc2V0TmV3UmVmKCk7cmV0dXJuKDAscy5pbmNyZW1lbnRhbFVwZGF0ZSkoZS5ieXRlcyxjLHIpfSl9KSk7di5vbigiR2V0T3BlcmF0b3JMaXN0IiwoZnVuY3Rpb24gd3BoU2V0dXBSZW5kZXJQYWdlKGUsdCl7dmFyIGk9ZS5wYWdlSW5kZXg7ci5nZXRQYWdlKGkpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBuPW5ldyBXb3JrZXJUYXNrKCJHZXRPcGVyYXRvckxpc3Q6IHBhZ2UgIitpKTtzdGFydFdvcmtlclRhc2sobik7Y29uc3Qgcz1mPj1hLlZlcmJvc2l0eUxldmVsLklORk9TP0RhdGUubm93KCk6MDtyLmdldE9wZXJhdG9yTGlzdCh7aGFuZGxlcjp2LHNpbms6dCx0YXNrOm4saW50ZW50OmUuaW50ZW50LHJlbmRlckludGVyYWN0aXZlRm9ybXM6ZS5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLGFubm90YXRpb25TdG9yYWdlOmUuYW5ub3RhdGlvblN0b3JhZ2V9KS50aGVuKChmdW5jdGlvbihlKXtmaW5pc2hXb3JrZXJUYXNrKG4pO3MmJigwLGEuaW5mbykoYHBhZ2U9JHtpKzF9IC0gZ2V0T3BlcmF0b3JMaXN0OiB0aW1lPSR7RGF0ZS5ub3coKS1zfW1zLCBsZW49JHtlLmxlbmd0aH1gKTt0LmNsb3NlKCl9KSwoZnVuY3Rpb24oZSl7ZmluaXNoV29ya2VyVGFzayhuKTtpZighbi50ZXJtaW5hdGVkKXt2LnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIse2ZlYXR1cmVJZDphLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yT3BlcmF0b3JMaXN0fSk7dC5lcnJvcihlKX19KSl9KSl9KSx0aGlzKTt2Lm9uKCJHZXRUZXh0Q29udGVudCIsKGZ1bmN0aW9uIHdwaEV4dHJhY3RUZXh0KGUsdCl7dmFyIGk9ZS5wYWdlSW5kZXg7dC5vblB1bGw9ZnVuY3Rpb24oZSl7fTt0Lm9uQ2FuY2VsPWZ1bmN0aW9uKGUpe307ci5nZXRQYWdlKGkpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBuPW5ldyBXb3JrZXJUYXNrKCJHZXRUZXh0Q29udGVudDogcGFnZSAiK2kpO3N0YXJ0V29ya2VyVGFzayhuKTtjb25zdCBzPWY+PWEuVmVyYm9zaXR5TGV2ZWwuSU5GT1M/RGF0ZS5ub3coKTowO3IuZXh0cmFjdFRleHRDb250ZW50KHtoYW5kbGVyOnYsdGFzazpuLHNpbms6dCxub3JtYWxpemVXaGl0ZXNwYWNlOmUubm9ybWFsaXplV2hpdGVzcGFjZSxjb21iaW5lVGV4dEl0ZW1zOmUuY29tYmluZVRleHRJdGVtc30pLnRoZW4oKGZ1bmN0aW9uKCl7ZmluaXNoV29ya2VyVGFzayhuKTtzJiYoMCxhLmluZm8pKGBwYWdlPSR7aSsxfSAtIGdldFRleHRDb250ZW50OiB0aW1lPWArKERhdGUubm93KCktcykrIm1zIik7dC5jbG9zZSgpfSksKGZ1bmN0aW9uKGUpe2ZpbmlzaFdvcmtlclRhc2sobik7bi50ZXJtaW5hdGVkfHx0LmVycm9yKGUpfSkpfSkpfSkpO3Yub24oIkZvbnRGYWxsYmFjayIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmZvbnRGYWxsYmFjayhlLmlkLHYpfSkpO3Yub24oIkNsZWFudXAiLChmdW5jdGlvbiB3cGhDbGVhbnVwKGUpe3JldHVybiByLmNsZWFudXAoITApfSkpO3Yub24oIlRlcm1pbmF0ZSIsKGZ1bmN0aW9uIHdwaFRlcm1pbmF0ZShlKXtvPSEwO2NvbnN0IHQ9W107aWYocil7ci50ZXJtaW5hdGUobmV3IGEuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7Y29uc3QgZT1yLmNsZWFudXAoKTt0LnB1c2goZSk7cj1udWxsfWVsc2UoMCxpLmNsZWFyUHJpbWl0aXZlQ2FjaGVzKSgpO3UmJnUobmV3IGEuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7ZC5mb3JFYWNoKChmdW5jdGlvbihlKXt0LnB1c2goZS5maW5pc2hlZCk7ZS50ZXJtaW5hdGUoKX0pKTtyZXR1cm4gUHJvbWlzZS5hbGwodCkudGhlbigoZnVuY3Rpb24oKXt2LmRlc3Ryb3koKTt2PW51bGx9KSl9KSk7di5vbigiUmVhZHkiLChmdW5jdGlvbiB3cGhSZWFkeSh0KXshZnVuY3Rpb24gc2V0dXBEb2MoZSl7ZnVuY3Rpb24gb25TdWNjZXNzKGUpe2Vuc3VyZU5vdFRlcm1pbmF0ZWQoKTt2LnNlbmQoIkdldERvYyIse3BkZkluZm86ZX0pfWZ1bmN0aW9uIG9uRmFpbHVyZShlKXtlbnN1cmVOb3RUZXJtaW5hdGVkKCk7aWYoZSBpbnN0YW5jZW9mIGEuUGFzc3dvcmRFeGNlcHRpb24pe3ZhciB0PW5ldyBXb3JrZXJUYXNrKCJQYXNzd29yZEV4Y2VwdGlvbjogcmVzcG9uc2UgIitlLmNvZGUpO3N0YXJ0V29ya2VyVGFzayh0KTt2LnNlbmRXaXRoUHJvbWlzZSgiUGFzc3dvcmRSZXF1ZXN0IixlKS50aGVuKChmdW5jdGlvbih7cGFzc3dvcmQ6ZX0pe2ZpbmlzaFdvcmtlclRhc2sodCk7ci51cGRhdGVQYXNzd29yZChlKTtwZGZNYW5hZ2VyUmVhZHkoKX0pKS5jYXRjaCgoZnVuY3Rpb24oKXtmaW5pc2hXb3JrZXJUYXNrKHQpO3Yuc2VuZCgiRG9jRXhjZXB0aW9uIixlKX0pKX1lbHNlIGUgaW5zdGFuY2VvZiBhLkludmFsaWRQREZFeGNlcHRpb258fGUgaW5zdGFuY2VvZiBhLk1pc3NpbmdQREZFeGNlcHRpb258fGUgaW5zdGFuY2VvZiBhLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbnx8ZSBpbnN0YW5jZW9mIGEuVW5rbm93bkVycm9yRXhjZXB0aW9uP3Yuc2VuZCgiRG9jRXhjZXB0aW9uIixlKTp2LnNlbmQoIkRvY0V4Y2VwdGlvbiIsbmV3IGEuVW5rbm93bkVycm9yRXhjZXB0aW9uKGUubWVzc2FnZSxlLnRvU3RyaW5nKCkpKX1mdW5jdGlvbiBwZGZNYW5hZ2VyUmVhZHkoKXtlbnN1cmVOb3RUZXJtaW5hdGVkKCk7bG9hZERvY3VtZW50KCExKS50aGVuKG9uU3VjY2VzcywoZnVuY3Rpb24oZSl7ZW5zdXJlTm90VGVybWluYXRlZCgpO2lmKGUgaW5zdGFuY2VvZiBoLlhSZWZQYXJzZUV4Y2VwdGlvbil7ci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCk7ci5vbkxvYWRlZFN0cmVhbSgpLnRoZW4oKGZ1bmN0aW9uKCl7ZW5zdXJlTm90VGVybWluYXRlZCgpO2xvYWREb2N1bWVudCghMCkudGhlbihvblN1Y2Nlc3Msb25GYWlsdXJlKX0pKX1lbHNlIG9uRmFpbHVyZShlKX0pKX1lbnN1cmVOb3RUZXJtaW5hdGVkKCk7Z2V0UGRmTWFuYWdlcihlLHttYXhJbWFnZVNpemU6ZS5tYXhJbWFnZVNpemUsZGlzYWJsZUZvbnRGYWNlOmUuZGlzYWJsZUZvbnRGYWNlLGlnbm9yZUVycm9yczplLmlnbm9yZUVycm9ycyxpc0V2YWxTdXBwb3J0ZWQ6ZS5pc0V2YWxTdXBwb3J0ZWQsZm9udEV4dHJhUHJvcGVydGllczplLmZvbnRFeHRyYVByb3BlcnRpZXN9KS50aGVuKChmdW5jdGlvbihlKXtpZihvKXtlLnRlcm1pbmF0ZShuZXcgYS5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTt0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpfShyPWUpLm9uTG9hZGVkU3RyZWFtKCkudGhlbigoZnVuY3Rpb24oZSl7di5zZW5kKCJEYXRhTG9hZGVkIix7bGVuZ3RoOmUuYnl0ZXMuYnl0ZUxlbmd0aH0pfSkpfSkpLnRoZW4ocGRmTWFuYWdlclJlYWR5LG9uRmFpbHVyZSl9KGUpO2U9bnVsbH0pKTtyZXR1cm4geX1zdGF0aWMgaW5pdGlhbGl6ZUZyb21Qb3J0KGUpe3ZhciB0PW5ldyBjLk1lc3NhZ2VIYW5kbGVyKCJ3b3JrZXIiLCJtYWluIixlKTtXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cCh0LGUpO3Quc2VuZCgicmVhZHkiLG51bGwpfX10Lldvcmtlck1lc3NhZ2VIYW5kbGVyPVdvcmtlck1lc3NhZ2VIYW5kbGVyOyJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93JiYhby5pc05vZGVKUyYmInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZmdW5jdGlvbiBpc01lc3NhZ2VQb3J0KGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnBvc3RNZXNzYWdlJiYib25tZXNzYWdlImluIGV9KHNlbGYpJiZXb3JrZXJNZXNzYWdlSGFuZGxlci5pbml0aWFsaXplRnJvbVBvcnQoc2VsZil9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuYXJyYXlCeXRlTGVuZ3RoPWFycmF5Qnl0ZUxlbmd0aDt0LmFycmF5c1RvQnl0ZXM9ZnVuY3Rpb24gYXJyYXlzVG9CeXRlcyhlKXtjb25zdCB0PWUubGVuZ3RoO2lmKDE9PT10JiZlWzBdaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlWzBdO2xldCByPTA7Zm9yKGxldCBhPTA7YTx0O2ErKylyKz1hcnJheUJ5dGVMZW5ndGgoZVthXSk7bGV0IGE9MDtjb25zdCBpPW5ldyBVaW50OEFycmF5KHIpO2ZvcihsZXQgcj0wO3I8dDtyKyspe2xldCB0PWVbcl07dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCh0PSJzdHJpbmciPT10eXBlb2YgdD9zdHJpbmdUb0J5dGVzKHQpOm5ldyBVaW50OEFycmF5KHQpKTtjb25zdCBuPXQuYnl0ZUxlbmd0aDtpLnNldCh0LGEpO2ErPW59cmV0dXJuIGl9O3QuYXNzZXJ0PWFzc2VydDt0LmJ5dGVzVG9TdHJpbmc9ZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyhlKXthc3NlcnQobnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZSYmdm9pZCAwIT09ZS5sZW5ndGgsIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmciKTtjb25zdCB0PWUubGVuZ3RoO2lmKHQ8ODE5MilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGUpO2NvbnN0IHI9W107Zm9yKGxldCBhPTA7YTx0O2ErPTgxOTIpe2NvbnN0IGk9TWF0aC5taW4oYSs4MTkyLHQpLG49ZS5zdWJhcnJheShhLGkpO3IucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbikpfXJldHVybiByLmpvaW4oIiIpfTt0LmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCl7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpO2xldCB0PSExO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzZXR0bGVkIix7Z2V0OigpPT50fSk7ZS5wcm9taXNlPW5ldyBQcm9taXNlKChmdW5jdGlvbihyLGEpe2UucmVzb2x2ZT1mdW5jdGlvbihlKXt0PSEwO3IoZSl9O2UucmVqZWN0PWZ1bmN0aW9uKGUpe3Q9ITA7YShlKX19KSk7cmV0dXJuIGV9O3QuZXNjYXBlU3RyaW5nPWZ1bmN0aW9uIGVzY2FwZVN0cmluZyhlKXtyZXR1cm4gZS5yZXBsYWNlKC8oW1woXClcXF0pL2csIlxcJDEiKX07dC5nZXRNb2RpZmljYXRpb25EYXRlPWZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoZT1uZXcgRGF0ZShEYXRlLm5vdygpKSl7cmV0dXJuW2UuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLChlLmdldFVUQ01vbnRoKCkrMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksKGUuZ2V0VVRDRGF0ZSgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKV0uam9pbigiIil9O3QuZ2V0VmVyYm9zaXR5TGV2ZWw9ZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKXtyZXR1cm4gaX07dC5pbmZvPWZ1bmN0aW9uIGluZm8oZSl7aT49YS5JTkZPUyYmY29uc29sZS5sb2coIkluZm86ICIrZSl9O3QuaXNBcnJheUJ1ZmZlcj1mdW5jdGlvbiBpc0FycmF5QnVmZmVyKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUmJnZvaWQgMCE9PWUuYnl0ZUxlbmd0aH07dC5pc0FycmF5RXF1YWw9ZnVuY3Rpb24gaXNBcnJheUVxdWFsKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtyZXR1cm4gZS5ldmVyeSgoZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT09PXRbcl19KSl9O3QuaXNCb29sPWZ1bmN0aW9uIGlzQm9vbChlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlfTt0LmlzTnVtPWZ1bmN0aW9uIGlzTnVtKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX07dC5pc1N0cmluZz1mdW5jdGlvbiBpc1N0cmluZyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9O3QuaXNTYW1lT3JpZ2luPWZ1bmN0aW9uIGlzU2FtZU9yaWdpbihlLHQpe2xldCByO3RyeXtyPW5ldyBVUkwoZSk7aWYoIXIub3JpZ2lufHwibnVsbCI9PT1yLm9yaWdpbilyZXR1cm4hMX1jYXRjaChlKXtyZXR1cm4hMX1jb25zdCBhPW5ldyBVUkwodCxyKTtyZXR1cm4gci5vcmlnaW49PT1hLm9yaWdpbn07dC5jcmVhdGVWYWxpZEFic29sdXRlVXJsPWZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwoZSx0KXtpZighZSlyZXR1cm4gbnVsbDt0cnl7Y29uc3Qgcj10P25ldyBVUkwoZSx0KTpuZXcgVVJMKGUpO2lmKGZ1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2woZSl7aWYoIWUpcmV0dXJuITE7c3dpdGNoKGUucHJvdG9jb2wpe2Nhc2UiaHR0cDoiOmNhc2UiaHR0cHM6IjpjYXNlImZ0cDoiOmNhc2UibWFpbHRvOiI6Y2FzZSJ0ZWw6IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0ocikpcmV0dXJuIHJ9Y2F0Y2goZSl7fXJldHVybiBudWxsfTt0LnJlbW92ZU51bGxDaGFyYWN0ZXJzPWZ1bmN0aW9uIHJlbW92ZU51bGxDaGFyYWN0ZXJzKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl7d2FybigiVGhlIGFyZ3VtZW50IGZvciByZW1vdmVOdWxsQ2hhcmFjdGVycyBtdXN0IGJlIGEgc3RyaW5nLiIpO3JldHVybiBlfXJldHVybiBlLnJlcGxhY2UocywiIil9O3Quc2V0VmVyYm9zaXR5TGV2ZWw9ZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwoZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKGk9ZSl9O3Quc2hhZG93PXNoYWRvdzt0LnN0cmluZzMyPWZ1bmN0aW9uIHN0cmluZzMyKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmUpfTt0LnN0cmluZ1RvQnl0ZXM9c3RyaW5nVG9CeXRlczt0LnN0cmluZ1RvUERGU3RyaW5nPWZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKGUpe2NvbnN0IHQ9ZS5sZW5ndGgscj1bXTtpZigiw74iPT09ZVswXSYmIsO/Ij09PWVbMV0pZm9yKGxldCBhPTI7YTx0O2ErPTIpci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZUF0KGEpPDw4fGUuY2hhckNvZGVBdChhKzEpKSk7ZWxzZSBpZigiw78iPT09ZVswXSYmIsO+Ij09PWVbMV0pZm9yKGxldCBhPTI7YTx0O2ErPTIpci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZUF0KGErMSk8PDh8ZS5jaGFyQ29kZUF0KGEpKSk7ZWxzZSBmb3IobGV0IGE9MDthPHQ7KythKXtjb25zdCB0PWhbZS5jaGFyQ29kZUF0KGEpXTtyLnB1c2godD9TdHJpbmcuZnJvbUNoYXJDb2RlKHQpOmUuY2hhckF0KGEpKX1yZXR1cm4gci5qb2luKCIiKX07dC5zdHJpbmdUb1VURjhTdHJpbmc9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGUpKX07dC51dGY4U3RyaW5nVG9TdHJpbmc9ZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKGUpe3JldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpfTt0Lndhcm49d2Fybjt0LnVucmVhY2hhYmxlPXVucmVhY2hhYmxlO3QuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkPXQuSXNMaXR0bGVFbmRpYW5DYWNoZWQ9dC5jcmVhdGVPYmplY3RVUkw9dC5Gb3JtYXRFcnJvcj10LlV0aWw9dC5Vbmtub3duRXJyb3JFeGNlcHRpb249dC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249dC5UZXh0UmVuZGVyaW5nTW9kZT10LlN0cmVhbVR5cGU9dC5QZXJtaXNzaW9uRmxhZz10LlBhc3N3b3JkUmVzcG9uc2VzPXQuUGFzc3dvcmRFeGNlcHRpb249dC5NaXNzaW5nUERGRXhjZXB0aW9uPXQuSW52YWxpZFBERkV4Y2VwdGlvbj10LkFib3J0RXhjZXB0aW9uPXQuQ01hcENvbXByZXNzaW9uVHlwZT10LkltYWdlS2luZD10LkZvbnRUeXBlPXQuQW5ub3RhdGlvblR5cGU9dC5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGU9dC5Bbm5vdGF0aW9uUmV2aWV3U3RhdGU9dC5Bbm5vdGF0aW9uUmVwbHlUeXBlPXQuQW5ub3RhdGlvbk1hcmtlZFN0YXRlPXQuQW5ub3RhdGlvbkZsYWc9dC5Bbm5vdGF0aW9uRmllbGRGbGFnPXQuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZT10LlVOU1VQUE9SVEVEX0ZFQVRVUkVTPXQuVmVyYm9zaXR5TGV2ZWw9dC5PUFM9dC5JREVOVElUWV9NQVRSSVg9dC5GT05UX0lERU5USVRZX01BVFJJWD10LkJhc2VFeGNlcHRpb249dm9pZCAwO3IoMyk7dC5JREVOVElUWV9NQVRSSVg9WzEsMCwwLDEsMCwwXTt0LkZPTlRfSURFTlRJVFlfTUFUUklYPVsuMDAxLDAsMCwuMDAxLDAsMF07dC5QZXJtaXNzaW9uRmxhZz17UFJJTlQ6NCxNT0RJRllfQ09OVEVOVFM6OCxDT1BZOjE2LE1PRElGWV9BTk5PVEFUSU9OUzozMixGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOjI1NixDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOjUxMixBU1NFTUJMRToxMDI0LFBSSU5UX0hJR0hfUVVBTElUWToyMDQ4fTt0LlRleHRSZW5kZXJpbmdNb2RlPXtGSUxMOjAsU1RST0tFOjEsRklMTF9TVFJPS0U6MixJTlZJU0lCTEU6MyxGSUxMX0FERF9UT19QQVRIOjQsU1RST0tFX0FERF9UT19QQVRIOjUsRklMTF9TVFJPS0VfQUREX1RPX1BBVEg6NixBRERfVE9fUEFUSDo3LEZJTExfU1RST0tFX01BU0s6MyxBRERfVE9fUEFUSF9GTEFHOjR9O3QuSW1hZ2VLaW5kPXtHUkFZU0NBTEVfMUJQUDoxLFJHQl8yNEJQUDoyLFJHQkFfMzJCUFA6M307dC5Bbm5vdGF0aW9uVHlwZT17VEVYVDoxLExJTks6MixGUkVFVEVYVDozLExJTkU6NCxTUVVBUkU6NSxDSVJDTEU6NixQT0xZR09OOjcsUE9MWUxJTkU6OCxISUdITElHSFQ6OSxVTkRFUkxJTkU6MTAsU1FVSUdHTFk6MTEsU1RSSUtFT1VUOjEyLFNUQU1QOjEzLENBUkVUOjE0LElOSzoxNSxQT1BVUDoxNixGSUxFQVRUQUNITUVOVDoxNyxTT1VORDoxOCxNT1ZJRToxOSxXSURHRVQ6MjAsU0NSRUVOOjIxLFBSSU5URVJNQVJLOjIyLFRSQVBORVQ6MjMsV0FURVJNQVJLOjI0LFRIUkVFRDoyNSxSRURBQ1Q6MjZ9O3QuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlPXtNQVJLRUQ6Ik1hcmtlZCIsUkVWSUVXOiJSZXZpZXcifTt0LkFubm90YXRpb25NYXJrZWRTdGF0ZT17TUFSS0VEOiJNYXJrZWQiLFVOTUFSS0VEOiJVbm1hcmtlZCJ9O3QuQW5ub3RhdGlvblJldmlld1N0YXRlPXtBQ0NFUFRFRDoiQWNjZXB0ZWQiLFJFSkVDVEVEOiJSZWplY3RlZCIsQ0FOQ0VMTEVEOiJDYW5jZWxsZWQiLENPTVBMRVRFRDoiQ29tcGxldGVkIixOT05FOiJOb25lIn07dC5Bbm5vdGF0aW9uUmVwbHlUeXBlPXtHUk9VUDoiR3JvdXAiLFJFUExZOiJSIn07dC5Bbm5vdGF0aW9uRmxhZz17SU5WSVNJQkxFOjEsSElEREVOOjIsUFJJTlQ6NCxOT1pPT006OCxOT1JPVEFURToxNixOT1ZJRVc6MzIsUkVBRE9OTFk6NjQsTE9DS0VEOjEyOCxUT0dHTEVOT1ZJRVc6MjU2LExPQ0tFRENPTlRFTlRTOjUxMn07dC5Bbm5vdGF0aW9uRmllbGRGbGFnPXtSRUFET05MWToxLFJFUVVJUkVEOjIsTk9FWFBPUlQ6NCxNVUxUSUxJTkU6NDA5NixQQVNTV09SRDo4MTkyLE5PVE9HR0xFVE9PRkY6MTYzODQsUkFESU86MzI3NjgsUFVTSEJVVFRPTjo2NTUzNixDT01CTzoxMzEwNzIsRURJVDoyNjIxNDQsU09SVDo1MjQyODgsRklMRVNFTEVDVDoxMDQ4NTc2LE1VTFRJU0VMRUNUOjIwOTcxNTIsRE9OT1RTUEVMTENIRUNLOjQxOTQzMDQsRE9OT1RTQ1JPTEw6ODM4ODYwOCxDT01COjE2Nzc3MjE2LFJJQ0hURVhUOjMzNTU0NDMyLFJBRElPU0lOVU5JU09OOjMzNTU0NDMyLENPTU1JVE9OU0VMQ0hBTkdFOjY3MTA4ODY0fTt0LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9e1NPTElEOjEsREFTSEVEOjIsQkVWRUxFRDozLElOU0VUOjQsVU5ERVJMSU5FOjV9O3QuU3RyZWFtVHlwZT17VU5LTk9XTjoiVU5LTk9XTiIsRkxBVEU6IkZMQVRFIixMWlc6IkxaVyIsRENUOiJEQ1QiLEpQWDoiSlBYIixKQklHOiJKQklHIixBODU6IkE4NSIsQUhYOiJBSFgiLENDRjoiQ0NGIixSTFg6IlJMWCJ9O3QuRm9udFR5cGU9e1VOS05PV046IlVOS05PV04iLFRZUEUxOiJUWVBFMSIsVFlQRTFDOiJUWVBFMUMiLENJREZPTlRUWVBFMDoiQ0lERk9OVFRZUEUwIixDSURGT05UVFlQRTBDOiJDSURGT05UVFlQRTBDIixUUlVFVFlQRToiVFJVRVRZUEUiLENJREZPTlRUWVBFMjoiQ0lERk9OVFRZUEUyIixUWVBFMzoiVFlQRTMiLE9QRU5UWVBFOiJPUEVOVFlQRSIsVFlQRTA6IlRZUEUwIixNTVRZUEUxOiJNTVRZUEUxIn07Y29uc3QgYT17RVJST1JTOjAsV0FSTklOR1M6MSxJTkZPUzo1fTt0LlZlcmJvc2l0eUxldmVsPWE7dC5DTWFwQ29tcHJlc3Npb25UeXBlPXtOT05FOjAsQklOQVJZOjEsU1RSRUFNOjJ9O3QuT1BTPXtkZXBlbmRlbmN5OjEsc2V0TGluZVdpZHRoOjIsc2V0TGluZUNhcDozLHNldExpbmVKb2luOjQsc2V0TWl0ZXJMaW1pdDo1LHNldERhc2g6NixzZXRSZW5kZXJpbmdJbnRlbnQ6NyxzZXRGbGF0bmVzczo4LHNldEdTdGF0ZTo5LHNhdmU6MTAscmVzdG9yZToxMSx0cmFuc2Zvcm06MTIsbW92ZVRvOjEzLGxpbmVUbzoxNCxjdXJ2ZVRvOjE1LGN1cnZlVG8yOjE2LGN1cnZlVG8zOjE3LGNsb3NlUGF0aDoxOCxyZWN0YW5nbGU6MTksc3Ryb2tlOjIwLGNsb3NlU3Ryb2tlOjIxLGZpbGw6MjIsZW9GaWxsOjIzLGZpbGxTdHJva2U6MjQsZW9GaWxsU3Ryb2tlOjI1LGNsb3NlRmlsbFN0cm9rZToyNixjbG9zZUVPRmlsbFN0cm9rZToyNyxlbmRQYXRoOjI4LGNsaXA6MjksZW9DbGlwOjMwLGJlZ2luVGV4dDozMSxlbmRUZXh0OjMyLHNldENoYXJTcGFjaW5nOjMzLHNldFdvcmRTcGFjaW5nOjM0LHNldEhTY2FsZTozNSxzZXRMZWFkaW5nOjM2LHNldEZvbnQ6Mzcsc2V0VGV4dFJlbmRlcmluZ01vZGU6Mzgsc2V0VGV4dFJpc2U6MzksbW92ZVRleHQ6NDAsc2V0TGVhZGluZ01vdmVUZXh0OjQxLHNldFRleHRNYXRyaXg6NDIsbmV4dExpbmU6NDMsc2hvd1RleHQ6NDQsc2hvd1NwYWNlZFRleHQ6NDUsbmV4dExpbmVTaG93VGV4dDo0NixuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDo0NyxzZXRDaGFyV2lkdGg6NDgsc2V0Q2hhcldpZHRoQW5kQm91bmRzOjQ5LHNldFN0cm9rZUNvbG9yU3BhY2U6NTAsc2V0RmlsbENvbG9yU3BhY2U6NTEsc2V0U3Ryb2tlQ29sb3I6NTIsc2V0U3Ryb2tlQ29sb3JOOjUzLHNldEZpbGxDb2xvcjo1NCxzZXRGaWxsQ29sb3JOOjU1LHNldFN0cm9rZUdyYXk6NTYsc2V0RmlsbEdyYXk6NTcsc2V0U3Ryb2tlUkdCQ29sb3I6NTgsc2V0RmlsbFJHQkNvbG9yOjU5LHNldFN0cm9rZUNNWUtDb2xvcjo2MCxzZXRGaWxsQ01ZS0NvbG9yOjYxLHNoYWRpbmdGaWxsOjYyLGJlZ2luSW5saW5lSW1hZ2U6NjMsYmVnaW5JbWFnZURhdGE6NjQsZW5kSW5saW5lSW1hZ2U6NjUscGFpbnRYT2JqZWN0OjY2LG1hcmtQb2ludDo2NyxtYXJrUG9pbnRQcm9wczo2OCxiZWdpbk1hcmtlZENvbnRlbnQ6NjksYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6NzAsZW5kTWFya2VkQ29udGVudDo3MSxiZWdpbkNvbXBhdDo3MixlbmRDb21wYXQ6NzMscGFpbnRGb3JtWE9iamVjdEJlZ2luOjc0LHBhaW50Rm9ybVhPYmplY3RFbmQ6NzUsYmVnaW5Hcm91cDo3NixlbmRHcm91cDo3NyxiZWdpbkFubm90YXRpb25zOjc4LGVuZEFubm90YXRpb25zOjc5LGJlZ2luQW5ub3RhdGlvbjo4MCxlbmRBbm5vdGF0aW9uOjgxLHBhaW50SnBlZ1hPYmplY3Q6ODIscGFpbnRJbWFnZU1hc2tYT2JqZWN0OjgzLHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOjg0LHBhaW50SW1hZ2VYT2JqZWN0Ojg1LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0Ojg2LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6ODcscGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6ODgscGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0Ojg5LHBhaW50U29saWRDb2xvckltYWdlTWFzazo5MCxjb25zdHJ1Y3RQYXRoOjkxfTt0LlVOU1VQUE9SVEVEX0ZFQVRVUkVTPXt1bmtub3duOiJ1bmtub3duIixmb3JtczoiZm9ybXMiLGphdmFTY3JpcHQ6ImphdmFTY3JpcHQiLHNtYXNrOiJzbWFzayIsc2hhZGluZ1BhdHRlcm46InNoYWRpbmdQYXR0ZXJuIixmb250OiJmb250IixlcnJvclRpbGluZ1BhdHRlcm46ImVycm9yVGlsaW5nUGF0dGVybiIsZXJyb3JFeHRHU3RhdGU6ImVycm9yRXh0R1N0YXRlIixlcnJvclhPYmplY3Q6ImVycm9yWE9iamVjdCIsZXJyb3JGb250TG9hZFR5cGUzOiJlcnJvckZvbnRMb2FkVHlwZTMiLGVycm9yRm9udFN0YXRlOiJlcnJvckZvbnRTdGF0ZSIsZXJyb3JGb250TWlzc2luZzoiZXJyb3JGb250TWlzc2luZyIsZXJyb3JGb250VHJhbnNsYXRlOiJlcnJvckZvbnRUcmFuc2xhdGUiLGVycm9yQ29sb3JTcGFjZToiZXJyb3JDb2xvclNwYWNlIixlcnJvck9wZXJhdG9yTGlzdDoiZXJyb3JPcGVyYXRvckxpc3QiLGVycm9yRm9udFRvVW5pY29kZToiZXJyb3JGb250VG9Vbmljb2RlIixlcnJvckZvbnRMb2FkTmF0aXZlOiJlcnJvckZvbnRMb2FkTmF0aXZlIixlcnJvckZvbnRHZXRQYXRoOiJlcnJvckZvbnRHZXRQYXRoIixlcnJvck1hcmtlZENvbnRlbnQ6ImVycm9yTWFya2VkQ29udGVudCJ9O3QuUGFzc3dvcmRSZXNwb25zZXM9e05FRURfUEFTU1dPUkQ6MSxJTkNPUlJFQ1RfUEFTU1dPUkQ6Mn07bGV0IGk9YS5XQVJOSU5HUztmdW5jdGlvbiB3YXJuKGUpe2k+PWEuV0FSTklOR1MmJmNvbnNvbGUubG9nKCJXYXJuaW5nOiAiK2UpfWZ1bmN0aW9uIHVucmVhY2hhYmxlKGUpe3Rocm93IG5ldyBFcnJvcihlKX1mdW5jdGlvbiBhc3NlcnQoZSx0KXtlfHx1bnJlYWNoYWJsZSh0KX1mdW5jdGlvbiBzaGFkb3coZSx0LHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITF9KTtyZXR1cm4gcn1jb25zdCBuPWZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCl7ZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihlKXt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZUV4Y2VwdGlvbiYmdW5yZWFjaGFibGUoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uIik7dGhpcy5tZXNzYWdlPWU7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZX1CYXNlRXhjZXB0aW9uLnByb3RvdHlwZT1uZXcgRXJyb3I7QmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3Rvcj1CYXNlRXhjZXB0aW9uO3JldHVybiBCYXNlRXhjZXB0aW9ufSgpO3QuQmFzZUV4Y2VwdGlvbj1uO3QuUGFzc3dvcmRFeGNlcHRpb249Y2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSk7dGhpcy5jb2RlPXR9fTt0LlVua25vd25FcnJvckV4Y2VwdGlvbj1jbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSk7dGhpcy5kZXRhaWxzPXR9fTt0LkludmFsaWRQREZFeGNlcHRpb249Y2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIG57fTt0Lk1pc3NpbmdQREZFeGNlcHRpb249Y2xhc3MgTWlzc2luZ1BERkV4Y2VwdGlvbiBleHRlbmRzIG57fTt0LlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbj1jbGFzcyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gZXh0ZW5kcyBue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSk7dGhpcy5zdGF0dXM9dH19O3QuRm9ybWF0RXJyb3I9Y2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBue307dC5BYm9ydEV4Y2VwdGlvbj1jbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIG57fTtjb25zdCBzPS9ceDAwL2c7ZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhlKXthc3NlcnQoInN0cmluZyI9PXR5cGVvZiBlLCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzIik7Y29uc3QgdD1lLmxlbmd0aCxyPW5ldyBVaW50OEFycmF5KHQpO2ZvcihsZXQgYT0wO2E8dDsrK2EpclthXT0yNTUmZS5jaGFyQ29kZUF0KGEpO3JldHVybiByfWZ1bmN0aW9uIGFycmF5Qnl0ZUxlbmd0aChlKXtpZih2b2lkIDAhPT1lLmxlbmd0aClyZXR1cm4gZS5sZW5ndGg7YXNzZXJ0KHZvaWQgMCE9PWUuYnl0ZUxlbmd0aCwiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC4iKTtyZXR1cm4gZS5ieXRlTGVuZ3RofWNvbnN0IG89e2dldCB2YWx1ZSgpe3JldHVybiBzaGFkb3codGhpcywidmFsdWUiLGZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSg0KTtlWzBdPTE7cmV0dXJuIDE9PT1uZXcgVWludDMyQXJyYXkoZS5idWZmZXIsMCwxKVswXX0oKSl9fTt0LklzTGl0dGxlRW5kaWFuQ2FjaGVkPW87Y29uc3QgYz17Z2V0IHZhbHVlKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJ2YWx1ZSIsZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCl7dHJ5e25ldyBGdW5jdGlvbigiIik7cmV0dXJuITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpKX19O3QuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkPWM7Y29uc3QgbD1bInJnYigiLDAsIiwiLDAsIiwiLDAsIikiXTtjbGFzcyBVdGlse3N0YXRpYyBtYWtlQ3NzUmdiKGUsdCxyKXtsWzFdPWU7bFszXT10O2xbNV09cjtyZXR1cm4gbC5qb2luKCIiKX1zdGF0aWMgdHJhbnNmb3JtKGUsdCl7cmV0dXJuW2VbMF0qdFswXStlWzJdKnRbMV0sZVsxXSp0WzBdK2VbM10qdFsxXSxlWzBdKnRbMl0rZVsyXSp0WzNdLGVbMV0qdFsyXStlWzNdKnRbM10sZVswXSp0WzRdK2VbMl0qdFs1XStlWzRdLGVbMV0qdFs0XStlWzNdKnRbNV0rZVs1XV19c3RhdGljIGFwcGx5VHJhbnNmb3JtKGUsdCl7cmV0dXJuW2VbMF0qdFswXStlWzFdKnRbMl0rdFs0XSxlWzBdKnRbMV0rZVsxXSp0WzNdK3RbNV1dfXN0YXRpYyBhcHBseUludmVyc2VUcmFuc2Zvcm0oZSx0KXtjb25zdCByPXRbMF0qdFszXS10WzFdKnRbMl07cmV0dXJuWyhlWzBdKnRbM10tZVsxXSp0WzJdK3RbMl0qdFs1XS10WzRdKnRbM10pL3IsKC1lWzBdKnRbMV0rZVsxXSp0WzBdK3RbNF0qdFsxXS10WzVdKnRbMF0pL3JdfXN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChlLHQpe2NvbnN0IHI9VXRpbC5hcHBseVRyYW5zZm9ybShlLHQpLGE9VXRpbC5hcHBseVRyYW5zZm9ybShlLnNsaWNlKDIsNCksdCksaT1VdGlsLmFwcGx5VHJhbnNmb3JtKFtlWzBdLGVbM11dLHQpLG49VXRpbC5hcHBseVRyYW5zZm9ybShbZVsyXSxlWzFdXSx0KTtyZXR1cm5bTWF0aC5taW4oclswXSxhWzBdLGlbMF0sblswXSksTWF0aC5taW4oclsxXSxhWzFdLGlbMV0sblsxXSksTWF0aC5tYXgoclswXSxhWzBdLGlbMF0sblswXSksTWF0aC5tYXgoclsxXSxhWzFdLGlbMV0sblsxXSldfXN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKGUpe2NvbnN0IHQ9ZVswXSplWzNdLWVbMV0qZVsyXTtyZXR1cm5bZVszXS90LC1lWzFdL3QsLWVbMl0vdCxlWzBdL3QsKGVbMl0qZVs1XS1lWzRdKmVbM10pL3QsKGVbNF0qZVsxXS1lWzVdKmVbMF0pL3RdfXN0YXRpYyBhcHBseTNkVHJhbnNmb3JtKGUsdCl7cmV0dXJuW2VbMF0qdFswXStlWzFdKnRbMV0rZVsyXSp0WzJdLGVbM10qdFswXStlWzRdKnRbMV0rZVs1XSp0WzJdLGVbNl0qdFswXStlWzddKnRbMV0rZVs4XSp0WzJdXX1zdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoZSl7Y29uc3QgdD1bZVswXSxlWzJdLGVbMV0sZVszXV0scj1lWzBdKnRbMF0rZVsxXSp0WzJdLGE9ZVswXSp0WzFdK2VbMV0qdFszXSxpPWVbMl0qdFswXStlWzNdKnRbMl0sbj1lWzJdKnRbMV0rZVszXSp0WzNdLHM9KHIrbikvMixvPU1hdGguc3FydCgocituKSoocituKS00KihyKm4taSphKSkvMixjPXMrb3x8MSxsPXMtb3x8MTtyZXR1cm5bTWF0aC5zcXJ0KGMpLE1hdGguc3FydChsKV19c3RhdGljIG5vcm1hbGl6ZVJlY3QoZSl7Y29uc3QgdD1lLnNsaWNlKDApO2lmKGVbMF0+ZVsyXSl7dFswXT1lWzJdO3RbMl09ZVswXX1pZihlWzFdPmVbM10pe3RbMV09ZVszXTt0WzNdPWVbMV19cmV0dXJuIHR9c3RhdGljIGludGVyc2VjdChlLHQpe2Z1bmN0aW9uIGNvbXBhcmUoZSx0KXtyZXR1cm4gZS10fWNvbnN0IHI9W2VbMF0sZVsyXSx0WzBdLHRbMl1dLnNvcnQoY29tcGFyZSksYT1bZVsxXSxlWzNdLHRbMV0sdFszXV0uc29ydChjb21wYXJlKSxpPVtdO2U9VXRpbC5ub3JtYWxpemVSZWN0KGUpO3Q9VXRpbC5ub3JtYWxpemVSZWN0KHQpO2lmKCEoclswXT09PWVbMF0mJnJbMV09PT10WzBdfHxyWzBdPT09dFswXSYmclsxXT09PWVbMF0pKXJldHVybiBudWxsO2lbMF09clsxXTtpWzJdPXJbMl07aWYoIShhWzBdPT09ZVsxXSYmYVsxXT09PXRbMV18fGFbMF09PT10WzFdJiZhWzFdPT09ZVsxXSkpcmV0dXJuIG51bGw7aVsxXT1hWzFdO2lbM109YVsyXTtyZXR1cm4gaX19dC5VdGlsPVV0aWw7Y29uc3QgaD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzI4LDcxMSw3MTAsNzI5LDczMyw3MzEsNzMwLDczMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MjI2LDgyMjQsODIyNSw4MjMwLDgyMTIsODIxMSw0MDIsODI2MCw4MjQ5LDgyNTAsODcyMiw4MjQwLDgyMjIsODIyMCw4MjIxLDgyMTYsODIxNyw4MjE4LDg0ODIsNjQyNTcsNjQyNTgsMzIxLDMzOCwzNTIsMzc2LDM4MSwzMDUsMzIyLDMzOSwzNTMsMzgyLDAsODM2NF07Y29uc3QgdT1mdW5jdGlvbiBjcmVhdGVPYmplY3RVUkxDbG9zdXJlKCl7Y29uc3QgZT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iO3JldHVybiBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwodCxyLGE9ITEpe2lmKCFhJiZVUkwuY3JlYXRlT2JqZWN0VVJMKXtjb25zdCBlPW5ldyBCbG9iKFt0XSx7dHlwZTpyfSk7cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoZSl9bGV0IGk9YGRhdGE6JHtyfTtiYXNlNjQsYDtmb3IobGV0IHI9MCxhPXQubGVuZ3RoO3I8YTtyKz0zKXtjb25zdCBuPTI1NSZ0W3JdLHM9MjU1JnRbcisxXSxvPTI1NSZ0W3IrMl07aSs9ZVtuPj4yXStlWygzJm4pPDw0fHM+PjRdK2VbcisxPGE/KDE1JnMpPDwyfG8+PjY6NjRdK2VbcisyPGE/NjMmbzo2NF19cmV0dXJuIGl9fSgpO3QuY3JlYXRlT2JqZWN0VVJMPXV9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7cig0KX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5pc05vZGVKUz12b2lkIDA7Y29uc3QgYT0hKCJvYmplY3QiIT10eXBlb2YgcHJvY2Vzc3x8cHJvY2VzcysiIiE9IltvYmplY3QgcHJvY2Vzc10ifHxwcm9jZXNzLnZlcnNpb25zLm53fHxwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uJiZwcm9jZXNzLnR5cGUmJiJicm93c2VyIiE9PXByb2Nlc3MudHlwZSk7dC5pc05vZGVKUz1hfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmNsZWFyUHJpbWl0aXZlQ2FjaGVzPWZ1bmN0aW9uIGNsZWFyUHJpbWl0aXZlQ2FjaGVzKCl7bi5fY2xlYXJDYWNoZSgpO2kuX2NsZWFyQ2FjaGUoKTtvLl9jbGVhckNhY2hlKCl9O3QuaXNFT0Y9ZnVuY3Rpb24gaXNFT0YoZSl7cmV0dXJuIGU9PT1hfTt0LmlzQ21kPWZ1bmN0aW9uIGlzQ21kKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBuJiYodm9pZCAwPT09dHx8ZS5jbWQ9PT10KX07dC5pc0RpY3Q9ZnVuY3Rpb24gaXNEaWN0KGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBzJiYodm9pZCAwPT09dHx8aXNOYW1lKGUuZ2V0KCJUeXBlIiksdCkpfTt0LmlzTmFtZT1pc05hbWU7dC5pc1JlZj1mdW5jdGlvbiBpc1JlZihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG99O3QuaXNSZWZzRXF1YWw9ZnVuY3Rpb24gaXNSZWZzRXF1YWwoZSx0KXtyZXR1cm4gZS5udW09PT10Lm51bSYmZS5nZW49PT10Lmdlbn07dC5pc1N0cmVhbT1mdW5jdGlvbiBpc1N0cmVhbShlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lJiZ2b2lkIDAhPT1lLmdldEJ5dGVzfTt0LlJlZlNldENhY2hlPXQuUmVmU2V0PXQuUmVmPXQuTmFtZT10LkRpY3Q9dC5DbWQ9dC5FT0Y9dm9pZCAwO3IoMik7dmFyIGE9e307dC5FT0Y9YTt2YXIgaT1mdW5jdGlvbiBOYW1lQ2xvc3VyZSgpe2xldCBlPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gTmFtZShlKXt0aGlzLm5hbWU9ZX1OYW1lLnByb3RvdHlwZT17fTtOYW1lLmdldD1mdW5jdGlvbiBOYW1lX2dldCh0KXt2YXIgcj1lW3RdO3JldHVybiByfHwoZVt0XT1uZXcgTmFtZSh0KSl9O05hbWUuX2NsZWFyQ2FjaGU9ZnVuY3Rpb24oKXtlPU9iamVjdC5jcmVhdGUobnVsbCl9O3JldHVybiBOYW1lfSgpO3QuTmFtZT1pO3ZhciBuPWZ1bmN0aW9uIENtZENsb3N1cmUoKXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIENtZChlKXt0aGlzLmNtZD1lfUNtZC5wcm90b3R5cGU9e307Q21kLmdldD1mdW5jdGlvbiBDbWRfZ2V0KHQpe3ZhciByPWVbdF07cmV0dXJuIHJ8fChlW3RdPW5ldyBDbWQodCkpfTtDbWQuX2NsZWFyQ2FjaGU9ZnVuY3Rpb24oKXtlPU9iamVjdC5jcmVhdGUobnVsbCl9O3JldHVybiBDbWR9KCk7dC5DbWQ9bjt2YXIgcz1mdW5jdGlvbiBEaWN0Q2xvc3VyZSgpe3ZhciBlPWZ1bmN0aW9uIG5vblNlcmlhbGl6YWJsZUNsb3N1cmUoKXtyZXR1cm4gZX07ZnVuY3Rpb24gRGljdCh0KXt0aGlzLl9tYXA9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLnhyZWY9dDt0aGlzLm9iaklkPW51bGw7dGhpcy5zdXBwcmVzc0VuY3J5cHRpb249ITE7dGhpcy5fX25vblNlcmlhbGl6YWJsZV9fPWV9RGljdC5wcm90b3R5cGU9e2Fzc2lnblhyZWY6ZnVuY3Rpb24gRGljdF9hc3NpZ25YcmVmKGUpe3RoaXMueHJlZj1lfSxnZXQgc2l6ZSgpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApLmxlbmd0aH0sZ2V0KGUsdCxyKXtsZXQgYT10aGlzLl9tYXBbZV07aWYodm9pZCAwPT09YSYmdm9pZCAwIT09dCl7YT10aGlzLl9tYXBbdF07dm9pZCAwPT09YSYmdm9pZCAwIT09ciYmKGE9dGhpcy5fbWFwW3JdKX1yZXR1cm4gYSBpbnN0YW5jZW9mIG8mJnRoaXMueHJlZj90aGlzLnhyZWYuZmV0Y2goYSx0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik6YX0sYXN5bmMgZ2V0QXN5bmMoZSx0LHIpe2xldCBhPXRoaXMuX21hcFtlXTtpZih2b2lkIDA9PT1hJiZ2b2lkIDAhPT10KXthPXRoaXMuX21hcFt0XTt2b2lkIDA9PT1hJiZ2b2lkIDAhPT1yJiYoYT10aGlzLl9tYXBbcl0pfXJldHVybiBhIGluc3RhbmNlb2YgbyYmdGhpcy54cmVmP3RoaXMueHJlZi5mZXRjaEFzeW5jKGEsdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOmF9LGdldEFycmF5KGUsdCxyKXtsZXQgYT10aGlzLmdldChlLHQscik7aWYoIUFycmF5LmlzQXJyYXkoYSl8fCF0aGlzLnhyZWYpcmV0dXJuIGE7YT1hLnNsaWNlKCk7Zm9yKGxldCBlPTAsdD1hLmxlbmd0aDtlPHQ7ZSsrKWFbZV1pbnN0YW5jZW9mIG8mJihhW2VdPXRoaXMueHJlZi5mZXRjaChhW2VdLHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKSk7cmV0dXJuIGF9LGdldFJhdzpmdW5jdGlvbiBEaWN0X2dldFJhdyhlKXtyZXR1cm4gdGhpcy5fbWFwW2VdfSxnZXRLZXlzOmZ1bmN0aW9uIERpY3RfZ2V0S2V5cygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApfSxnZXRSYXdWYWx1ZXM6ZnVuY3Rpb24gRGljdF9nZXRSYXdWYWx1ZXMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9tYXApfSxzZXQ6ZnVuY3Rpb24gRGljdF9zZXQoZSx0KXt0aGlzLl9tYXBbZV09dH0saGFzOmZ1bmN0aW9uIERpY3RfaGFzKGUpe3JldHVybiB2b2lkIDAhPT10aGlzLl9tYXBbZV19LGZvckVhY2g6ZnVuY3Rpb24gRGljdF9mb3JFYWNoKGUpe2Zvcih2YXIgdCBpbiB0aGlzLl9tYXApZSh0LHRoaXMuZ2V0KHQpKX19O0RpY3QuZW1wdHk9bmV3IERpY3QobnVsbCk7RGljdC5tZXJnZT1mdW5jdGlvbih7eHJlZjplLGRpY3RBcnJheTp0LG1lcmdlU3ViRGljdHM6cj0hMX0pe2NvbnN0IGE9bmV3IERpY3QoZSk7aWYoIXIpe2Zvcihjb25zdCBlIG9mIHQpaWYoZSBpbnN0YW5jZW9mIERpY3QpZm9yKGNvbnN0W3Qscl1vZiBPYmplY3QuZW50cmllcyhlLl9tYXApKXZvaWQgMD09PWEuX21hcFt0XSYmKGEuX21hcFt0XT1yKTtyZXR1cm4gYS5zaXplPjA/YTpEaWN0LmVtcHR5fWNvbnN0IGk9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiB0KWlmKGUgaW5zdGFuY2VvZiBEaWN0KWZvcihjb25zdFt0LHJdb2YgT2JqZWN0LmVudHJpZXMoZS5fbWFwKSl7bGV0IGU9aS5nZXQodCk7aWYodm9pZCAwPT09ZSl7ZT1bXTtpLnNldCh0LGUpfWUucHVzaChyKX1mb3IoY29uc3RbdCxyXW9mIGkpe2lmKDE9PT1yLmxlbmd0aHx8IShyWzBdaW5zdGFuY2VvZiBEaWN0KSl7YS5fbWFwW3RdPXJbMF07Y29udGludWV9Y29uc3QgaT1uZXcgRGljdChlKTtmb3IoY29uc3QgZSBvZiByKWlmKGUgaW5zdGFuY2VvZiBEaWN0KWZvcihjb25zdFt0LHJdb2YgT2JqZWN0LmVudHJpZXMoZS5fbWFwKSl2b2lkIDA9PT1pLl9tYXBbdF0mJihpLl9tYXBbdF09cik7aS5zaXplPjAmJihhLl9tYXBbdF09aSl9aS5jbGVhcigpO3JldHVybiBhLnNpemU+MD9hOkRpY3QuZW1wdHl9O3JldHVybiBEaWN0fSgpO3QuRGljdD1zO3ZhciBvPWZ1bmN0aW9uIFJlZkNsb3N1cmUoKXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIFJlZihlLHQpe3RoaXMubnVtPWU7dGhpcy5nZW49dH1SZWYucHJvdG90eXBlPXt0b1N0cmluZzpmdW5jdGlvbiBSZWZfdG9TdHJpbmcoKXtyZXR1cm4gMD09PXRoaXMuZ2VuP3RoaXMubnVtKyJSIjpgJHt0aGlzLm51bX1SJHt0aGlzLmdlbn1gfX07UmVmLmdldD1mdW5jdGlvbih0LHIpe2NvbnN0IGE9MD09PXI/dCsiUiI6YCR7dH1SJHtyfWAsaT1lW2FdO3JldHVybiBpfHwoZVthXT1uZXcgUmVmKHQscikpfTtSZWYuX2NsZWFyQ2FjaGU9ZnVuY3Rpb24oKXtlPU9iamVjdC5jcmVhdGUobnVsbCl9O3JldHVybiBSZWZ9KCk7dC5SZWY9bzt0LlJlZlNldD1jbGFzcyBSZWZTZXR7Y29uc3RydWN0b3IoKXt0aGlzLl9zZXQ9bmV3IFNldH1oYXMoZSl7cmV0dXJuIHRoaXMuX3NldC5oYXMoZS50b1N0cmluZygpKX1wdXQoZSl7dGhpcy5fc2V0LmFkZChlLnRvU3RyaW5nKCkpfXJlbW92ZShlKXt0aGlzLl9zZXQuZGVsZXRlKGUudG9TdHJpbmcoKSl9fTt0LlJlZlNldENhY2hlPWNsYXNzIFJlZlNldENhY2hle2NvbnN0cnVjdG9yKCl7dGhpcy5fbWFwPW5ldyBNYXB9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fbWFwLnNpemV9Z2V0KGUpe3JldHVybiB0aGlzLl9tYXAuZ2V0KGUudG9TdHJpbmcoKSl9aGFzKGUpe3JldHVybiB0aGlzLl9tYXAuaGFzKGUudG9TdHJpbmcoKSl9cHV0KGUsdCl7dGhpcy5fbWFwLnNldChlLnRvU3RyaW5nKCksdCl9cHV0QWxpYXMoZSx0KXt0aGlzLl9tYXAuc2V0KGUudG9TdHJpbmcoKSx0aGlzLmdldCh0KSl9Zm9yRWFjaChlKXtmb3IoY29uc3QgdCBvZiB0aGlzLl9tYXAudmFsdWVzKCkpZSh0KX1jbGVhcigpe3RoaXMuX21hcC5jbGVhcigpfX07ZnVuY3Rpb24gaXNOYW1lKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBpJiYodm9pZCAwPT09dHx8ZS5uYW1lPT09dCl9fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lk5ldHdvcmtQZGZNYW5hZ2VyPXQuTG9jYWxQZGZNYW5hZ2VyPXZvaWQgMDt2YXIgYT1yKDIpLGk9cig3KSxuPXIoOCkscz1yKDkpLG89cigxMik7Y2xhc3MgQmFzZVBkZk1hbmFnZXJ7Y29uc3RydWN0b3IoKXt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZVBkZk1hbmFnZXImJigwLGEudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlUGRmTWFuYWdlci4iKX1nZXQgZG9jSWQoKXtyZXR1cm4gdGhpcy5fZG9jSWR9Z2V0IHBhc3N3b3JkKCl7cmV0dXJuIHRoaXMuX3Bhc3N3b3JkfWdldCBkb2NCYXNlVXJsKCl7bGV0IGU9bnVsbDtpZih0aGlzLl9kb2NCYXNlVXJsKXtjb25zdCB0PSgwLGEuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodGhpcy5fZG9jQmFzZVVybCk7dD9lPXQuaHJlZjooMCxhLndhcm4pKGBJbnZhbGlkIGFic29sdXRlIGRvY0Jhc2VVcmw6ICIke3RoaXMuX2RvY0Jhc2VVcmx9Ii5gKX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywiZG9jQmFzZVVybCIsZSl9b25Mb2FkZWRTdHJlYW0oKXsoMCxhLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBvbkxvYWRlZFN0cmVhbWAgY2FsbGVkIil9ZW5zdXJlRG9jKGUsdCl7cmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQsZSx0KX1lbnN1cmVYUmVmKGUsdCl7cmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQueHJlZixlLHQpfWVuc3VyZUNhdGFsb2coZSx0KXtyZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC5jYXRhbG9nLGUsdCl9Z2V0UGFnZShlKXtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKGUpfWZvbnRGYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLnBkZkRvY3VtZW50LmZvbnRGYWxsYmFjayhlLHQpfWNsZWFudXAoZT0hMSl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuY2xlYW51cChlKX1hc3luYyBlbnN1cmUoZSx0LHIpeygwLGEudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGVuc3VyZWAgY2FsbGVkIil9cmVxdWVzdFJhbmdlKGUsdCl7KDAsYS51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdFJhbmdlYCBjYWxsZWQiKX1yZXF1ZXN0TG9hZGVkU3RyZWFtKCl7KDAsYS51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdExvYWRlZFN0cmVhbWAgY2FsbGVkIil9c2VuZFByb2dyZXNzaXZlRGF0YShlKXsoMCxhLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBzZW5kUHJvZ3Jlc3NpdmVEYXRhYCBjYWxsZWQiKX11cGRhdGVQYXNzd29yZChlKXt0aGlzLl9wYXNzd29yZD1lfXRlcm1pbmF0ZShlKXsoMCxhLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGB0ZXJtaW5hdGVgIGNhbGxlZCIpfX10LkxvY2FsUGRmTWFuYWdlcj1jbGFzcyBMb2NhbFBkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlcntjb25zdHJ1Y3RvcihlLHQscixhLGkpe3N1cGVyKCk7dGhpcy5fZG9jSWQ9ZTt0aGlzLl9wYXNzd29yZD1yO3RoaXMuX2RvY0Jhc2VVcmw9aTt0aGlzLmV2YWx1YXRvck9wdGlvbnM9YTtjb25zdCBuPW5ldyBvLlN0cmVhbSh0KTt0aGlzLnBkZkRvY3VtZW50PW5ldyBzLlBERkRvY3VtZW50KHRoaXMsbik7dGhpcy5fbG9hZGVkU3RyZWFtUHJvbWlzZT1Qcm9taXNlLnJlc29sdmUobil9YXN5bmMgZW5zdXJlKGUsdCxyKXtjb25zdCBhPWVbdF07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGE/YS5hcHBseShlLHIpOmF9cmVxdWVzdFJhbmdlKGUsdCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfXJlcXVlc3RMb2FkZWRTdHJlYW0oKXt9b25Mb2FkZWRTdHJlYW0oKXtyZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtUHJvbWlzZX10ZXJtaW5hdGUoZSl7fX07dC5OZXR3b3JrUGRmTWFuYWdlcj1jbGFzcyBOZXR3b3JrUGRmTWFuYWdlciBleHRlbmRzIEJhc2VQZGZNYW5hZ2Vye2NvbnN0cnVjdG9yKGUsdCxyLGEsbil7c3VwZXIoKTt0aGlzLl9kb2NJZD1lO3RoaXMuX3Bhc3N3b3JkPXIucGFzc3dvcmQ7dGhpcy5fZG9jQmFzZVVybD1uO3RoaXMubXNnSGFuZGxlcj1yLm1zZ0hhbmRsZXI7dGhpcy5ldmFsdWF0b3JPcHRpb25zPWE7dGhpcy5zdHJlYW1NYW5hZ2VyPW5ldyBpLkNodW5rZWRTdHJlYW1NYW5hZ2VyKHQse21zZ0hhbmRsZXI6ci5tc2dIYW5kbGVyLGxlbmd0aDpyLmxlbmd0aCxkaXNhYmxlQXV0b0ZldGNoOnIuZGlzYWJsZUF1dG9GZXRjaCxyYW5nZUNodW5rU2l6ZTpyLnJhbmdlQ2h1bmtTaXplfSk7dGhpcy5wZGZEb2N1bWVudD1uZXcgcy5QREZEb2N1bWVudCh0aGlzLHRoaXMuc3RyZWFtTWFuYWdlci5nZXRTdHJlYW0oKSl9YXN5bmMgZW5zdXJlKGUsdCxyKXt0cnl7Y29uc3QgYT1lW3RdO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBhP2EuYXBwbHkoZSxyKTphfWNhdGNoKGEpe2lmKCEoYSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pKXRocm93IGE7YXdhaXQgdGhpcy5yZXF1ZXN0UmFuZ2UoYS5iZWdpbixhLmVuZCk7cmV0dXJuIHRoaXMuZW5zdXJlKGUsdCxyKX19cmVxdWVzdFJhbmdlKGUsdCl7cmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5yZXF1ZXN0UmFuZ2UoZSx0KX1yZXF1ZXN0TG9hZGVkU3RyZWFtKCl7dGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RBbGxDaHVua3MoKX1zZW5kUHJvZ3Jlc3NpdmVEYXRhKGUpe3RoaXMuc3RyZWFtTWFuYWdlci5vblJlY2VpdmVEYXRhKHtjaHVuazplfSl9b25Mb2FkZWRTdHJlYW0oKXtyZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLm9uTG9hZGVkU3RyZWFtKCl9dGVybWluYXRlKGUpe3RoaXMuc3RyZWFtTWFuYWdlci5hYm9ydChlKX19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkNodW5rZWRTdHJlYW1NYW5hZ2VyPXQuQ2h1bmtlZFN0cmVhbT12b2lkIDA7dmFyIGE9cigyKSxpPXIoOCk7Y2xhc3MgQ2h1bmtlZFN0cmVhbXtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5ieXRlcz1uZXcgVWludDhBcnJheShlKTt0aGlzLnN0YXJ0PTA7dGhpcy5wb3M9MDt0aGlzLmVuZD1lO3RoaXMuY2h1bmtTaXplPXQ7dGhpcy5fbG9hZGVkQ2h1bmtzPW5ldyBTZXQ7dGhpcy5udW1DaHVua3M9TWF0aC5jZWlsKGUvdCk7dGhpcy5tYW5hZ2VyPXI7dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg9MDt0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rPS0xfWdldE1pc3NpbmdDaHVua3MoKXtjb25zdCBlPVtdO2ZvcihsZXQgdD0wLHI9dGhpcy5udW1DaHVua3M7dDxyOysrdCl0aGlzLl9sb2FkZWRDaHVua3MuaGFzKHQpfHxlLnB1c2godCk7cmV0dXJuIGV9Z2V0QmFzZVN0cmVhbXMoKXtyZXR1cm5bdGhpc119Z2V0IG51bUNodW5rc0xvYWRlZCgpe3JldHVybiB0aGlzLl9sb2FkZWRDaHVua3Muc2l6ZX1hbGxDaHVua3NMb2FkZWQoKXtyZXR1cm4gdGhpcy5udW1DaHVua3NMb2FkZWQ9PT10aGlzLm51bUNodW5rc31vblJlY2VpdmVEYXRhKGUsdCl7Y29uc3Qgcj10aGlzLmNodW5rU2l6ZTtpZihlJXIhPTApdGhyb3cgbmV3IEVycm9yKCJCYWQgYmVnaW4gb2Zmc2V0OiAiK2UpO2NvbnN0IGE9ZSt0LmJ5dGVMZW5ndGg7aWYoYSVyIT0wJiZhIT09dGhpcy5ieXRlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJCYWQgZW5kIG9mZnNldDogIithKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheSh0KSxlKTtjb25zdCBpPU1hdGguZmxvb3IoZS9yKSxuPU1hdGguZmxvb3IoKGEtMSkvcikrMTtmb3IobGV0IGU9aTtlPG47KytlKXRoaXMuX2xvYWRlZENodW5rcy5hZGQoZSl9b25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGUpe2xldCB0PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoO2NvbnN0IHI9TWF0aC5mbG9vcih0L3RoaXMuY2h1bmtTaXplKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShlKSx0KTt0Kz1lLmJ5dGVMZW5ndGg7dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg9dDtjb25zdCBhPXQ+PXRoaXMuZW5kP3RoaXMubnVtQ2h1bmtzOk1hdGguZmxvb3IodC90aGlzLmNodW5rU2l6ZSk7Zm9yKGxldCBlPXI7ZTxhOysrZSl0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGUpfWVuc3VyZUJ5dGUoZSl7aWYoZTx0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aClyZXR1cm47Y29uc3QgdD1NYXRoLmZsb29yKGUvdGhpcy5jaHVua1NpemUpO2lmKHQhPT10aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rKXtpZighdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyh0KSl0aHJvdyBuZXcgaS5NaXNzaW5nRGF0YUV4Y2VwdGlvbihlLGUrMSk7dGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaz10fX1lbnN1cmVSYW5nZShlLHQpe2lmKGU+PXQpcmV0dXJuO2lmKHQ8PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKXJldHVybjtjb25zdCByPXRoaXMuY2h1bmtTaXplLGE9TWF0aC5mbG9vcihlL3IpLG49TWF0aC5mbG9vcigodC0xKS9yKSsxO2ZvcihsZXQgcj1hO3I8bjsrK3IpaWYoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMocikpdGhyb3cgbmV3IGkuTWlzc2luZ0RhdGFFeGNlcHRpb24oZSx0KX1uZXh0RW1wdHlDaHVuayhlKXtjb25zdCB0PXRoaXMubnVtQ2h1bmtzO2ZvcihsZXQgcj0wO3I8dDsrK3Ipe2NvbnN0IGE9KGUrcikldDtpZighdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhhKSlyZXR1cm4gYX1yZXR1cm4gbnVsbH1oYXNDaHVuayhlKXtyZXR1cm4gdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhlKX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZW5kLXRoaXMuc3RhcnR9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMubGVuZ3RofWdldEJ5dGUoKXtjb25zdCBlPXRoaXMucG9zO2lmKGU+PXRoaXMuZW5kKXJldHVybi0xO2U+PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZUJ5dGUoZSk7cmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK119Z2V0VWludDE2KCl7Y29uc3QgZT10aGlzLmdldEJ5dGUoKSx0PXRoaXMuZ2V0Qnl0ZSgpO3JldHVybi0xPT09ZXx8LTE9PT10Py0xOihlPDw4KSt0fWdldEludDMyKCl7cmV0dXJuKHRoaXMuZ2V0Qnl0ZSgpPDwyNCkrKHRoaXMuZ2V0Qnl0ZSgpPDwxNikrKHRoaXMuZ2V0Qnl0ZSgpPDw4KSt0aGlzLmdldEJ5dGUoKX1nZXRCeXRlcyhlLHQ9ITEpe2NvbnN0IHI9dGhpcy5ieXRlcyxhPXRoaXMucG9zLGk9dGhpcy5lbmQ7aWYoIWUpe2k+dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlUmFuZ2UoYSxpKTtjb25zdCBlPXIuc3ViYXJyYXkoYSxpKTtyZXR1cm4gdD9uZXcgVWludDhDbGFtcGVkQXJyYXkoZSk6ZX1sZXQgbj1hK2U7bj5pJiYobj1pKTtuPnRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZVJhbmdlKGEsbik7dGhpcy5wb3M9bjtjb25zdCBzPXIuc3ViYXJyYXkoYSxuKTtyZXR1cm4gdD9uZXcgVWludDhDbGFtcGVkQXJyYXkocyk6c31wZWVrQnl0ZSgpe2NvbnN0IGU9dGhpcy5nZXRCeXRlKCk7LTEhPT1lJiZ0aGlzLnBvcy0tO3JldHVybiBlfXBlZWtCeXRlcyhlLHQ9ITEpe2NvbnN0IHI9dGhpcy5nZXRCeXRlcyhlLHQpO3RoaXMucG9zLT1yLmxlbmd0aDtyZXR1cm4gcn1nZXRCeXRlUmFuZ2UoZSx0KXtlPDAmJihlPTApO3Q+dGhpcy5lbmQmJih0PXRoaXMuZW5kKTt0PnRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZVJhbmdlKGUsdCk7cmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoZSx0KX1za2lwKGUpe2V8fChlPTEpO3RoaXMucG9zKz1lfXJlc2V0KCl7dGhpcy5wb3M9dGhpcy5zdGFydH1tb3ZlU3RhcnQoKXt0aGlzLnN0YXJ0PXRoaXMucG9zfW1ha2VTdWJTdHJlYW0oZSx0LHIpe3Q/ZSt0PnRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZVJhbmdlKGUsZSt0KTplPj10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVCeXRlKGUpO2Z1bmN0aW9uIENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKXt9Q2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0aGlzKTtDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5nZXRNaXNzaW5nQ2h1bmtzPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLmNodW5rU2l6ZSx0PU1hdGguZmxvb3IodGhpcy5zdGFydC9lKSxyPU1hdGguZmxvb3IoKHRoaXMuZW5kLTEpL2UpKzEsYT1bXTtmb3IobGV0IGU9dDtlPHI7KytlKXRoaXMuX2xvYWRlZENodW5rcy5oYXMoZSl8fGEucHVzaChlKTtyZXR1cm4gYX07Q2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUuYWxsQ2h1bmtzTG9hZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtQ2h1bmtzTG9hZGVkPT09dGhpcy5udW1DaHVua3N8fDA9PT10aGlzLmdldE1pc3NpbmdDaHVua3MoKS5sZW5ndGh9O2NvbnN0IGE9bmV3IENodW5rZWRTdHJlYW1TdWJzdHJlYW07YS5wb3M9YS5zdGFydD1lO2EuZW5kPWUrdHx8dGhpcy5lbmQ7YS5kaWN0PXI7cmV0dXJuIGF9fXQuQ2h1bmtlZFN0cmVhbT1DaHVua2VkU3RyZWFtO3QuQ2h1bmtlZFN0cmVhbU1hbmFnZXI9Y2xhc3MgQ2h1bmtlZFN0cmVhbU1hbmFnZXJ7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmxlbmd0aD10Lmxlbmd0aDt0aGlzLmNodW5rU2l6ZT10LnJhbmdlQ2h1bmtTaXplO3RoaXMuc3RyZWFtPW5ldyBDaHVua2VkU3RyZWFtKHRoaXMubGVuZ3RoLHRoaXMuY2h1bmtTaXplLHRoaXMpO3RoaXMucGRmTmV0d29ya1N0cmVhbT1lO3RoaXMuZGlzYWJsZUF1dG9GZXRjaD10LmRpc2FibGVBdXRvRmV0Y2g7dGhpcy5tc2dIYW5kbGVyPXQubXNnSGFuZGxlcjt0aGlzLmN1cnJSZXF1ZXN0SWQ9MDt0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Q9bmV3IE1hcDt0aGlzLl9yZXF1ZXN0c0J5Q2h1bms9bmV3IE1hcDt0aGlzLl9wcm9taXNlc0J5UmVxdWVzdD1uZXcgTWFwO3RoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoPTA7dGhpcy5hYm9ydGVkPSExO3RoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHk9KDAsYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKX1vbkxvYWRlZFN0cmVhbSgpe3JldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2V9c2VuZFJlcXVlc3QoZSx0KXtjb25zdCByPXRoaXMucGRmTmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihlLHQpO3IuaXNTdHJlYW1pbmdTdXBwb3J0ZWR8fChyLm9uUHJvZ3Jlc3M9dGhpcy5vblByb2dyZXNzLmJpbmQodGhpcykpO2xldCBpPVtdLG49MDtuZXcgUHJvbWlzZSgoZSx0KT0+e2NvbnN0IHJlYWRDaHVuaz1zPT57dHJ5e2lmKCFzLmRvbmUpe2NvbnN0IGU9cy52YWx1ZTtpLnB1c2goZSk7bis9KDAsYS5hcnJheUJ5dGVMZW5ndGgpKGUpO3IuaXNTdHJlYW1pbmdTdXBwb3J0ZWQmJnRoaXMub25Qcm9ncmVzcyh7bG9hZGVkOm59KTtyLnJlYWQoKS50aGVuKHJlYWRDaHVuayx0KTtyZXR1cm59Y29uc3Qgbz0oMCxhLmFycmF5c1RvQnl0ZXMpKGkpO2k9bnVsbDtlKG8pfWNhdGNoKGUpe3QoZSl9fTtyLnJlYWQoKS50aGVuKHJlYWRDaHVuayx0KX0pLnRoZW4odD0+e3RoaXMuYWJvcnRlZHx8dGhpcy5vblJlY2VpdmVEYXRhKHtjaHVuazp0LGJlZ2luOmV9KX0pfXJlcXVlc3RBbGxDaHVua3MoKXtjb25zdCBlPXRoaXMuc3RyZWFtLmdldE1pc3NpbmdDaHVua3MoKTt0aGlzLl9yZXF1ZXN0Q2h1bmtzKGUpO3JldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2V9X3JlcXVlc3RDaHVua3MoZSl7Y29uc3QgdD10aGlzLmN1cnJSZXF1ZXN0SWQrKyxyPW5ldyBTZXQ7dGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0LnNldCh0LHIpO2Zvcihjb25zdCB0IG9mIGUpdGhpcy5zdHJlYW0uaGFzQ2h1bmsodCl8fHIuYWRkKHQpO2lmKDA9PT1yLnNpemUpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2NvbnN0IGk9KDAsYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5zZXQodCxpKTtjb25zdCBuPVtdO2Zvcihjb25zdCBlIG9mIHIpe2xldCByPXRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoZSk7aWYoIXIpe3I9W107dGhpcy5fcmVxdWVzdHNCeUNodW5rLnNldChlLHIpO24ucHVzaChlKX1yLnB1c2godCl9aWYobi5sZW5ndGg+MCl7Y29uc3QgZT10aGlzLmdyb3VwQ2h1bmtzKG4pO2Zvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9dC5iZWdpbkNodW5rKnRoaXMuY2h1bmtTaXplLHI9TWF0aC5taW4odC5lbmRDaHVuayp0aGlzLmNodW5rU2l6ZSx0aGlzLmxlbmd0aCk7dGhpcy5zZW5kUmVxdWVzdChlLHIpfX1yZXR1cm4gaS5wcm9taXNlLmNhdGNoKGU9PntpZighdGhpcy5hYm9ydGVkKXRocm93IGV9KX1nZXRTdHJlYW0oKXtyZXR1cm4gdGhpcy5zdHJlYW19cmVxdWVzdFJhbmdlKGUsdCl7dD1NYXRoLm1pbih0LHRoaXMubGVuZ3RoKTtjb25zdCByPXRoaXMuZ2V0QmVnaW5DaHVuayhlKSxhPXRoaXMuZ2V0RW5kQ2h1bmsodCksaT1bXTtmb3IobGV0IGU9cjtlPGE7KytlKWkucHVzaChlKTtyZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhpKX1yZXF1ZXN0UmFuZ2VzKGU9W10pe2NvbnN0IHQ9W107Zm9yKGNvbnN0IHIgb2YgZSl7Y29uc3QgZT10aGlzLmdldEJlZ2luQ2h1bmsoci5iZWdpbiksYT10aGlzLmdldEVuZENodW5rKHIuZW5kKTtmb3IobGV0IHI9ZTtyPGE7KytyKXQuaW5jbHVkZXMocil8fHQucHVzaChyKX10LnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0pKTtyZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyh0KX1ncm91cENodW5rcyhlKXtjb25zdCB0PVtdO2xldCByPS0xLGE9LTE7Zm9yKGxldCBpPTAsbj1lLmxlbmd0aDtpPG47KytpKXtjb25zdCBuPWVbaV07cjwwJiYocj1uKTtpZihhPj0wJiZhKzEhPT1uKXt0LnB1c2goe2JlZ2luQ2h1bms6cixlbmRDaHVuazphKzF9KTtyPW59aSsxPT09ZS5sZW5ndGgmJnQucHVzaCh7YmVnaW5DaHVuazpyLGVuZENodW5rOm4rMX0pO2E9bn1yZXR1cm4gdH1vblByb2dyZXNzKGUpe3RoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIse2xvYWRlZDp0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQqdGhpcy5jaHVua1NpemUrZS5sb2FkZWQsdG90YWw6dGhpcy5sZW5ndGh9KX1vblJlY2VpdmVEYXRhKGUpe2NvbnN0IHQ9ZS5jaHVuayxyPXZvaWQgMD09PWUuYmVnaW4sYT1yP3RoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoOmUuYmVnaW4saT1hK3QuYnl0ZUxlbmd0aCxuPU1hdGguZmxvb3IoYS90aGlzLmNodW5rU2l6ZSkscz1pPHRoaXMubGVuZ3RoP01hdGguZmxvb3IoaS90aGlzLmNodW5rU2l6ZSk6TWF0aC5jZWlsKGkvdGhpcy5jaHVua1NpemUpO2lmKHIpe3RoaXMuc3RyZWFtLm9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YSh0KTt0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aD1pfWVsc2UgdGhpcy5zdHJlYW0ub25SZWNlaXZlRGF0YShhLHQpO3RoaXMuc3RyZWFtLmFsbENodW5rc0xvYWRlZCgpJiZ0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlc29sdmUodGhpcy5zdHJlYW0pO2NvbnN0IG89W107Zm9yKGxldCBlPW47ZTxzOysrZSl7Y29uc3QgdD10aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGUpO2lmKHQpe3RoaXMuX3JlcXVlc3RzQnlDaHVuay5kZWxldGUoZSk7Zm9yKGNvbnN0IHIgb2YgdCl7Y29uc3QgdD10aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QuZ2V0KHIpO3QuaGFzKGUpJiZ0LmRlbGV0ZShlKTt0LnNpemU+MHx8by5wdXNoKHIpfX19aWYoIXRoaXMuZGlzYWJsZUF1dG9GZXRjaCYmMD09PXRoaXMuX3JlcXVlc3RzQnlDaHVuay5zaXplKXtsZXQgZTtpZigxPT09dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKXtjb25zdCB0PXRoaXMuc3RyZWFtLm51bUNodW5rcy0xO3RoaXMuc3RyZWFtLmhhc0NodW5rKHQpfHwoZT10KX1lbHNlIGU9dGhpcy5zdHJlYW0ubmV4dEVtcHR5Q2h1bmsocyk7TnVtYmVyLmlzSW50ZWdlcihlKSYmdGhpcy5fcmVxdWVzdENodW5rcyhbZV0pfWZvcihjb25zdCBlIG9mIG8pe2NvbnN0IHQ9dGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KGUpO3RoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShlKTt0LnJlc29sdmUoKX10aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLHtsb2FkZWQ6dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKnRoaXMuY2h1bmtTaXplLHRvdGFsOnRoaXMubGVuZ3RofSl9b25FcnJvcihlKXt0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlamVjdChlKX1nZXRCZWdpbkNodW5rKGUpe3JldHVybiBNYXRoLmZsb29yKGUvdGhpcy5jaHVua1NpemUpfWdldEVuZENodW5rKGUpe3JldHVybiBNYXRoLmZsb29yKChlLTEpL3RoaXMuY2h1bmtTaXplKSsxfWFib3J0KGUpe3RoaXMuYWJvcnRlZD0hMDt0aGlzLnBkZk5ldHdvcmtTdHJlYW0mJnRoaXMucGRmTmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhlKTtmb3IoY29uc3QgdCBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSl0LnJlamVjdChlKX19fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmdldExvb2t1cFRhYmxlRmFjdG9yeT1mdW5jdGlvbiBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZSl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoZSl7dD1PYmplY3QuY3JlYXRlKG51bGwpO2UodCk7ZT1udWxsfXJldHVybiB0fX07dC5nZXRJbmhlcml0YWJsZVByb3BlcnR5PWZ1bmN0aW9uIGdldEluaGVyaXRhYmxlUHJvcGVydHkoe2RpY3Q6ZSxrZXk6dCxnZXRBcnJheTpyPSExLHN0b3BXaGVuRm91bmQ6aT0hMH0pe2xldCBuLHM9MDtmb3IoO2U7KXtjb25zdCBvPXI/ZS5nZXRBcnJheSh0KTplLmdldCh0KTtpZih2b2lkIDAhPT1vKXtpZihpKXJldHVybiBvO258fChuPVtdKTtuLnB1c2gobyl9aWYoKytzPjEwMCl7KDAsYS53YXJuKShgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTogbWF4aW11bSBsb29wIGNvdW50IGV4Y2VlZGVkIGZvciAiJHt0fSJgKTticmVha31lPWUuZ2V0KCJQYXJlbnQiKX1yZXR1cm4gbn07dC50b1JvbWFuTnVtZXJhbHM9ZnVuY3Rpb24gdG9Sb21hbk51bWVyYWxzKGUsdD0hMSl7KDAsYS5hc3NlcnQpKE51bWJlci5pc0ludGVnZXIoZSkmJmU+MCwiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpO2NvbnN0IHI9W107bGV0IG47Zm9yKDtlPj0xZTM7KXtlLT0xZTM7ci5wdXNoKCJNIil9bj1lLzEwMHwwO2UlPTEwMDtyLnB1c2goaVtuXSk7bj1lLzEwfDA7ZSU9MTA7ci5wdXNoKGlbMTArbl0pO3IucHVzaChpWzIwK2VdKTtjb25zdCBzPXIuam9pbigiIik7cmV0dXJuIHQ/cy50b0xvd2VyQ2FzZSgpOnN9O3QubG9nMj1mdW5jdGlvbiBsb2cyKGUpe2lmKGU8PTApcmV0dXJuIDA7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZzIoZSkpfTt0LnJlYWRJbnQ4PWZ1bmN0aW9uIHJlYWRJbnQ4KGUsdCl7cmV0dXJuIGVbdF08PDI0Pj4yNH07dC5yZWFkVWludDE2PWZ1bmN0aW9uIHJlYWRVaW50MTYoZSx0KXtyZXR1cm4gZVt0XTw8OHxlW3QrMV19O3QucmVhZFVpbnQzMj1mdW5jdGlvbiByZWFkVWludDMyKGUsdCl7cmV0dXJuKGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXSk+Pj4wfTt0LmlzV2hpdGVTcGFjZT1mdW5jdGlvbiBpc1doaXRlU3BhY2UoZSl7cmV0dXJuIDMyPT09ZXx8OT09PWV8fDEzPT09ZXx8MTA9PT1lfTt0LlhSZWZQYXJzZUV4Y2VwdGlvbj10LlhSZWZFbnRyeUV4Y2VwdGlvbj10Lk1pc3NpbmdEYXRhRXhjZXB0aW9uPXZvaWQgMDt2YXIgYT1yKDIpO2NsYXNzIE1pc3NpbmdEYXRhRXhjZXB0aW9uIGV4dGVuZHMgYS5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoYE1pc3NpbmcgZGF0YSBbJHtlfSwgJHt0fSlgKTt0aGlzLmJlZ2luPWU7dGhpcy5lbmQ9dH19dC5NaXNzaW5nRGF0YUV4Y2VwdGlvbj1NaXNzaW5nRGF0YUV4Y2VwdGlvbjtjbGFzcyBYUmVmRW50cnlFeGNlcHRpb24gZXh0ZW5kcyBhLkJhc2VFeGNlcHRpb257fXQuWFJlZkVudHJ5RXhjZXB0aW9uPVhSZWZFbnRyeUV4Y2VwdGlvbjtjbGFzcyBYUmVmUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBhLkJhc2VFeGNlcHRpb257fXQuWFJlZlBhcnNlRXhjZXB0aW9uPVhSZWZQYXJzZUV4Y2VwdGlvbjtjb25zdCBpPVsiIiwiQyIsIkNDIiwiQ0NDIiwiQ0QiLCJEIiwiREMiLCJEQ0MiLCJEQ0NDIiwiQ00iLCIiLCJYIiwiWFgiLCJYWFgiLCJYTCIsIkwiLCJMWCIsIkxYWCIsIkxYWFgiLCJYQyIsIiIsIkkiLCJJSSIsIklJSSIsIklWIiwiViIsIlZJIiwiVklJIiwiVklJSSIsIklYIl19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuUERGRG9jdW1lbnQ9dC5QYWdlPXZvaWQgMDt2YXIgYT1yKDIpLGk9cigxMCksbj1yKDUpLHM9cig4KSxvPXIoMTIpLGM9cigyNSksbD1yKDIyKSxoPXIoMTEpLHU9cigyNiksZD1yKDI4KTtjb25zdCBmPVswLDAsNjEyLDc5Ml07ZnVuY3Rpb24gaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShlLHQpe3JldHVybiJkaXNwbGF5Ij09PXQmJmUudmlld2FibGV8fCJwcmludCI9PT10JiZlLnByaW50YWJsZX1jbGFzcyBQYWdle2NvbnN0cnVjdG9yKHtwZGZNYW5hZ2VyOmUseHJlZjp0LHBhZ2VJbmRleDpyLHBhZ2VEaWN0OmEscmVmOmksZ2xvYmFsSWRGYWN0b3J5Om4sZm9udENhY2hlOnMsYnVpbHRJbkNNYXBDYWNoZTpvLGdsb2JhbEltYWdlQ2FjaGU6Y30pe3RoaXMucGRmTWFuYWdlcj1lO3RoaXMucGFnZUluZGV4PXI7dGhpcy5wYWdlRGljdD1hO3RoaXMueHJlZj10O3RoaXMucmVmPWk7dGhpcy5mb250Q2FjaGU9czt0aGlzLmJ1aWx0SW5DTWFwQ2FjaGU9bzt0aGlzLmdsb2JhbEltYWdlQ2FjaGU9Yzt0aGlzLmV2YWx1YXRvck9wdGlvbnM9ZS5ldmFsdWF0b3JPcHRpb25zO3RoaXMucmVzb3VyY2VzUHJvbWlzZT1udWxsO2NvbnN0IGw9e29iajowfTt0aGlzLl9sb2NhbElkRmFjdG9yeT1jbGFzcyBleHRlbmRzIG57c3RhdGljIGNyZWF0ZU9iaklkKCl7cmV0dXJuYHAke3J9XyR7KytsLm9ian1gfX19X2dldEluaGVyaXRhYmxlUHJvcGVydHkoZSx0PSExKXtjb25zdCByPSgwLHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dGhpcy5wYWdlRGljdCxrZXk6ZSxnZXRBcnJheTp0LHN0b3BXaGVuRm91bmQ6ITF9KTtyZXR1cm4gQXJyYXkuaXNBcnJheShyKT8xIT09ci5sZW5ndGgmJigwLG4uaXNEaWN0KShyWzBdKT9uLkRpY3QubWVyZ2Uoe3hyZWY6dGhpcy54cmVmLGRpY3RBcnJheTpyfSk6clswXTpyfWdldCBjb250ZW50KCl7cmV0dXJuIHRoaXMucGFnZURpY3QuZ2V0KCJDb250ZW50cyIpfWdldCByZXNvdXJjZXMoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywicmVzb3VyY2VzIix0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJSZXNvdXJjZXMiKXx8bi5EaWN0LmVtcHR5KX1fZ2V0Qm91bmRpbmdCb3goZSl7Y29uc3QgdD10aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KGUsITApO2lmKEFycmF5LmlzQXJyYXkodCkmJjQ9PT10Lmxlbmd0aCl7aWYodFsyXS10WzBdIT0wJiZ0WzNdLXRbMV0hPTApcmV0dXJuIHQ7KDAsYS53YXJuKShgRW1wdHkgLyR7ZX0gZW50cnkuYCl9cmV0dXJuIG51bGx9Z2V0IG1lZGlhQm94KCl7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm1lZGlhQm94Iix0aGlzLl9nZXRCb3VuZGluZ0JveCgiTWVkaWFCb3giKXx8Zil9Z2V0IGNyb3BCb3goKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiY3JvcEJveCIsdGhpcy5fZ2V0Qm91bmRpbmdCb3goIkNyb3BCb3giKXx8dGhpcy5tZWRpYUJveCl9Z2V0IHVzZXJVbml0KCl7bGV0IGU9dGhpcy5wYWdlRGljdC5nZXQoIlVzZXJVbml0Iik7KCEoMCxhLmlzTnVtKShlKXx8ZTw9MCkmJihlPTEpO3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJ1c2VyVW5pdCIsZSl9Z2V0IHZpZXcoKXtjb25zdHtjcm9wQm94OmUsbWVkaWFCb3g6dH09dGhpcztsZXQgcjtpZihlPT09dHx8KDAsYS5pc0FycmF5RXF1YWwpKGUsdCkpcj10O2Vsc2V7Y29uc3QgaT1hLlV0aWwuaW50ZXJzZWN0KGUsdCk7aSYmaVsyXS1pWzBdIT0wJiZpWzNdLWlbMV0hPTA/cj1pOigwLGEud2FybikoIkVtcHR5IC9Dcm9wQm94IGFuZCAvTWVkaWFCb3ggaW50ZXJzZWN0aW9uLiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJ2aWV3IixyfHx0KX1nZXQgcm90YXRlKCl7bGV0IGU9dGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiUm90YXRlIil8fDA7ZSU5MCE9MD9lPTA6ZT49MzYwP2UlPTM2MDplPDAmJihlPShlJTM2MCszNjApJTM2MCk7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInJvdGF0ZSIsZSl9Z2V0Q29udGVudFN0cmVhbSgpe2NvbnN0IGU9dGhpcy5jb250ZW50O2xldCB0O2lmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IHI9dGhpcy54cmVmLGE9W107Zm9yKGNvbnN0IHQgb2YgZSlhLnB1c2goci5mZXRjaElmUmVmKHQpKTt0PW5ldyBvLlN0cmVhbXNTZXF1ZW5jZVN0cmVhbShhKX1lbHNlIHQ9KDAsbi5pc1N0cmVhbSkoZSk/ZTpuZXcgby5OdWxsU3RyZWFtO3JldHVybiB0fXNhdmUoZSx0LHIpe2NvbnN0IGk9bmV3IGQuUGFydGlhbEV2YWx1YXRvcih7eHJlZjp0aGlzLnhyZWYsaGFuZGxlcjplLHBhZ2VJbmRleDp0aGlzLnBhZ2VJbmRleCxpZEZhY3Rvcnk6dGhpcy5fbG9jYWxJZEZhY3RvcnksZm9udENhY2hlOnRoaXMuZm9udENhY2hlLGJ1aWx0SW5DTWFwQ2FjaGU6dGhpcy5idWlsdEluQ01hcENhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLG9wdGlvbnM6dGhpcy5ldmFsdWF0b3JPcHRpb25zfSk7cmV0dXJuIHRoaXMuX3BhcnNlZEFubm90YXRpb25zLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgZSlpc0Fubm90YXRpb25SZW5kZXJhYmxlKHMsInByaW50IikmJm4ucHVzaChzLnNhdmUoaSx0LHIpLmNhdGNoKChmdW5jdGlvbihlKXsoMCxhLndhcm4pKGBzYXZlIC0gaWdub3JpbmcgYW5ub3RhdGlvbiBkYXRhIGR1cmluZyAiJHt0Lm5hbWV9IiB0YXNrOiAiJHtlfSIuYCk7cmV0dXJuIG51bGx9KSkpO3JldHVybiBQcm9taXNlLmFsbChuKX0pKX1sb2FkUmVzb3VyY2VzKGUpe3RoaXMucmVzb3VyY2VzUHJvbWlzZXx8KHRoaXMucmVzb3VyY2VzUHJvbWlzZT10aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsInJlc291cmNlcyIpKTtyZXR1cm4gdGhpcy5yZXNvdXJjZXNQcm9taXNlLnRoZW4oKCk9Pm5ldyBpLk9iamVjdExvYWRlcih0aGlzLnJlc291cmNlcyxlLHRoaXMueHJlZikubG9hZCgpKX1nZXRPcGVyYXRvckxpc3Qoe2hhbmRsZXI6ZSxzaW5rOnQsdGFzazpyLGludGVudDppLHJlbmRlckludGVyYWN0aXZlRm9ybXM6bixhbm5vdGF0aW9uU3RvcmFnZTpzfSl7Y29uc3Qgbz10aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsImdldENvbnRlbnRTdHJlYW0iKSxjPXRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsIkNvbG9yU3BhY2UiLCJQYXR0ZXJuIiwiU2hhZGluZyIsIlhPYmplY3QiLCJGb250Il0pLGw9bmV3IGQuUGFydGlhbEV2YWx1YXRvcih7eHJlZjp0aGlzLnhyZWYsaGFuZGxlcjplLHBhZ2VJbmRleDp0aGlzLnBhZ2VJbmRleCxpZEZhY3Rvcnk6dGhpcy5fbG9jYWxJZEZhY3RvcnksZm9udENhY2hlOnRoaXMuZm9udENhY2hlLGJ1aWx0SW5DTWFwQ2FjaGU6dGhpcy5idWlsdEluQ01hcENhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLG9wdGlvbnM6dGhpcy5ldmFsdWF0b3JPcHRpb25zfSksaD1Qcm9taXNlLmFsbChbbyxjXSkudGhlbigoW2FdKT0+e2NvbnN0IG49bmV3IHUuT3BlcmF0b3JMaXN0KGksdCk7ZS5zZW5kKCJTdGFydFJlbmRlclBhZ2UiLHt0cmFuc3BhcmVuY3k6bC5oYXNCbGVuZE1vZGVzKHRoaXMucmVzb3VyY2VzKSxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgsaW50ZW50Oml9KTtyZXR1cm4gbC5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTphLHRhc2s6cixyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMsb3BlcmF0b3JMaXN0Om59KS50aGVuKChmdW5jdGlvbigpe3JldHVybiBufSkpfSk7cmV0dXJuIFByb21pc2UuYWxsKFtoLHRoaXMuX3BhcnNlZEFubm90YXRpb25zXSkudGhlbigoZnVuY3Rpb24oW2UsdF0pe2lmKDA9PT10Lmxlbmd0aCl7ZS5mbHVzaCghMCk7cmV0dXJue2xlbmd0aDplLnRvdGFsTGVuZ3RofX1jb25zdCBvPVtdO2Zvcihjb25zdCBlIG9mIHQpaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShlLGkpJiZvLnB1c2goZS5nZXRPcGVyYXRvckxpc3QobCxyLG4scykuY2F0Y2goKGZ1bmN0aW9uKGUpeygwLGEud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGFubm90YXRpb24gZGF0YSBkdXJpbmcgIiR7ci5uYW1lfSIgdGFzazogIiR7ZX0iLmApO3JldHVybiBudWxsfSkpKTtyZXR1cm4gUHJvbWlzZS5hbGwobykudGhlbigoZnVuY3Rpb24odCl7ZS5hZGRPcChhLk9QUy5iZWdpbkFubm90YXRpb25zLFtdKTtmb3IoY29uc3QgciBvZiB0KWUuYWRkT3BMaXN0KHIpO2UuYWRkT3AoYS5PUFMuZW5kQW5ub3RhdGlvbnMsW10pO2UuZmx1c2goITApO3JldHVybntsZW5ndGg6ZS50b3RhbExlbmd0aH19KSl9KSl9ZXh0cmFjdFRleHRDb250ZW50KHtoYW5kbGVyOmUsdGFzazp0LG5vcm1hbGl6ZVdoaXRlc3BhY2U6cixzaW5rOmEsY29tYmluZVRleHRJdGVtczppfSl7Y29uc3Qgbj10aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsImdldENvbnRlbnRTdHJlYW0iKSxzPXRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsIlhPYmplY3QiLCJGb250Il0pO3JldHVybiBQcm9taXNlLmFsbChbbixzXSkudGhlbigoW25dKT0+bmV3IGQuUGFydGlhbEV2YWx1YXRvcih7eHJlZjp0aGlzLnhyZWYsaGFuZGxlcjplLHBhZ2VJbmRleDp0aGlzLnBhZ2VJbmRleCxpZEZhY3Rvcnk6dGhpcy5fbG9jYWxJZEZhY3RvcnksZm9udENhY2hlOnRoaXMuZm9udENhY2hlLGJ1aWx0SW5DTWFwQ2FjaGU6dGhpcy5idWlsdEluQ01hcENhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLG9wdGlvbnM6dGhpcy5ldmFsdWF0b3JPcHRpb25zfSkuZ2V0VGV4dENvbnRlbnQoe3N0cmVhbTpuLHRhc2s6dCxyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMsbm9ybWFsaXplV2hpdGVzcGFjZTpyLGNvbWJpbmVUZXh0SXRlbXM6aSxzaW5rOmF9KSl9Z2V0QW5ub3RhdGlvbnNEYXRhKGUpe3JldHVybiB0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucy50aGVuKChmdW5jdGlvbih0KXtjb25zdCByPVtdO2ZvcihsZXQgYT0wLGk9dC5sZW5ndGg7YTxpO2ErKyllJiYhaXNBbm5vdGF0aW9uUmVuZGVyYWJsZSh0W2FdLGUpfHxyLnB1c2godFthXS5kYXRhKTtyZXR1cm4gcn0pKX1nZXQgYW5ub3RhdGlvbnMoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiYW5ub3RhdGlvbnMiLHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIkFubm90cyIpfHxbXSl9Z2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpe2NvbnN0IGU9dGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCJhbm5vdGF0aW9ucyIpLnRoZW4oKCk9Pntjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIHRoaXMuYW5ub3RhdGlvbnMpZS5wdXNoKGMuQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHRoaXMueHJlZix0LHRoaXMucGRmTWFuYWdlcix0aGlzLl9sb2NhbElkRmFjdG9yeSkuY2F0Y2goKGZ1bmN0aW9uKGUpeygwLGEud2FybikoYF9wYXJzZWRBbm5vdGF0aW9uczogIiR7ZX0iLmApO3JldHVybiBudWxsfSkpKTtyZXR1cm4gUHJvbWlzZS5hbGwoZSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZmlsdGVyKGU9PiEhZSl9KSl9KTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiX3BhcnNlZEFubm90YXRpb25zIixlKX19dC5QYWdlPVBhZ2U7Y29uc3QgZz1uZXcgVWludDhBcnJheShbMzcsODAsNjgsNzAsNDVdKSxtPW5ldyBVaW50OEFycmF5KFsxMTUsMTE2LDk3LDExNCwxMTYsMTIwLDExNCwxMDEsMTAyXSkscD1uZXcgVWludDhBcnJheShbMTAxLDExMCwxMDAsMTExLDk4LDEwNl0pLGI9L15bMS05XVwuWzAtOV0kLztmdW5jdGlvbiBmaW5kKGUsdCxyPTEwMjQsYT0hMSl7Y29uc3QgaT10Lmxlbmd0aCxuPWUucGVla0J5dGVzKHIpLHM9bi5sZW5ndGgtaTtpZihzPD0wKXJldHVybiExO2lmKGEpe2NvbnN0IHI9aS0xO2xldCBhPW4ubGVuZ3RoLTE7Zm9yKDthPj1yOyl7bGV0IHM9MDtmb3IoO3M8aSYmblthLXNdPT09dFtyLXNdOylzKys7aWYocz49aSl7ZS5wb3MrPWEtcjtyZXR1cm4hMH1hLS19fWVsc2V7bGV0IHI9MDtmb3IoO3I8PXM7KXtsZXQgYT0wO2Zvcig7YTxpJiZuW3IrYV09PT10W2FdOylhKys7aWYoYT49aSl7ZS5wb3MrPXI7cmV0dXJuITB9cisrfX1yZXR1cm4hMX10LlBERkRvY3VtZW50PWNsYXNzIFBERkRvY3VtZW50e2NvbnN0cnVjdG9yKGUsdCl7bGV0IHI7aWYoKDAsbi5pc1N0cmVhbSkodCkpcj10O2Vsc2V7aWYoISgwLGEuaXNBcnJheUJ1ZmZlcikodCkpdGhyb3cgbmV3IEVycm9yKCJQREZEb2N1bWVudDogVW5rbm93biBhcmd1bWVudCB0eXBlIik7cj1uZXcgby5TdHJlYW0odCl9aWYoci5sZW5ndGg8PTApdGhyb3cgbmV3IGEuSW52YWxpZFBERkV4Y2VwdGlvbigiVGhlIFBERiBmaWxlIGlzIGVtcHR5LCBpLmUuIGl0cyBzaXplIGlzIHplcm8gYnl0ZXMuIik7dGhpcy5wZGZNYW5hZ2VyPWU7dGhpcy5zdHJlYW09cjt0aGlzLnhyZWY9bmV3IGkuWFJlZihyLGUpO3RoaXMuX3BhZ2VQcm9taXNlcz1bXTt0aGlzLl92ZXJzaW9uPW51bGw7Y29uc3Qgcz17Zm9udDowfTt0aGlzLl9nbG9iYWxJZEZhY3Rvcnk9Y2xhc3N7c3RhdGljIGdldERvY0lkKCl7cmV0dXJuImdfIitlLmRvY0lkfXN0YXRpYyBjcmVhdGVGb250SWQoKXtyZXR1cm4iZiIrICsrcy5mb250fXN0YXRpYyBjcmVhdGVPYmpJZCgpeygwLGEudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGNyZWF0ZU9iaklkYCBjYWxsZWQuIil9fX1wYXJzZShlKXt0aGlzLnhyZWYucGFyc2UoZSk7dGhpcy5jYXRhbG9nPW5ldyBpLkNhdGFsb2codGhpcy5wZGZNYW5hZ2VyLHRoaXMueHJlZik7dGhpcy5jYXRhbG9nLnZlcnNpb24mJih0aGlzLl92ZXJzaW9uPXRoaXMuY2F0YWxvZy52ZXJzaW9uKX1nZXQgbGluZWFyaXphdGlvbigpe2xldCBlPW51bGw7dHJ5e2U9aC5MaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLmluZm8pKGUpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJsaW5lYXJpemF0aW9uIixlKX1nZXQgc3RhcnRYUmVmKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtsZXQgdD0wO2lmKHRoaXMubGluZWFyaXphdGlvbil7ZS5yZXNldCgpO2ZpbmQoZSxwKSYmKHQ9ZS5wb3MrNi1lLnN0YXJ0KX1lbHNle2NvbnN0IHI9MTAyNCxhPW0ubGVuZ3RoO2xldCBpPSExLG49ZS5lbmQ7Zm9yKDshaSYmbj4wOyl7bi09ci1hO248MCYmKG49MCk7ZS5wb3M9bjtpPWZpbmQoZSxtLHIsITApfWlmKGkpe2Uuc2tpcCg5KTtsZXQgcjtkb3tyPWUuZ2V0Qnl0ZSgpfXdoaWxlKCgwLHMuaXNXaGl0ZVNwYWNlKShyKSk7bGV0IGE9IiI7Zm9yKDtyPj0zMiYmcjw9NTc7KXthKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpO3I9ZS5nZXRCeXRlKCl9dD1wYXJzZUludChhLDEwKTtpc05hTih0KSYmKHQ9MCl9fXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJzdGFydFhSZWYiLHQpfWNoZWNrSGVhZGVyKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtlLnJlc2V0KCk7aWYoIWZpbmQoZSxnKSlyZXR1cm47ZS5tb3ZlU3RhcnQoKTtsZXQgdCxyPSIiO2Zvcig7KHQ9ZS5nZXRCeXRlKCkpPjMyJiYhKHIubGVuZ3RoPj0xMik7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUodCk7dGhpcy5fdmVyc2lvbnx8KHRoaXMuX3ZlcnNpb249ci5zdWJzdHJpbmcoNSkpfXBhcnNlU3RhcnRYUmVmKCl7dGhpcy54cmVmLnNldFN0YXJ0WFJlZih0aGlzLnN0YXJ0WFJlZil9Z2V0IG51bVBhZ2VzKCl7Y29uc3QgZT10aGlzLmxpbmVhcml6YXRpb24sdD1lP2UubnVtUGFnZXM6dGhpcy5jYXRhbG9nLm51bVBhZ2VzO3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJudW1QYWdlcyIsdCl9X2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoZSx0PTApe3JldHVybiBlLmV2ZXJ5KGU9PntpZigoZT10aGlzLnhyZWYuZmV0Y2hJZlJlZihlKSkuaGFzKCJLaWRzIikpe2lmKCsrdD4xMCl7KDAsYS53YXJuKSgiX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXM6IG1heGltdW0gcmVjdXJzaW9uIGRlcHRoIHJlYWNoZWQiKTtyZXR1cm4hMX1yZXR1cm4gdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhlLmdldCgiS2lkcyIpLHQpfWNvbnN0IHI9KDAsbi5pc05hbWUpKGUuZ2V0KCJGVCIpLCJTaWciKSxpPWUuZ2V0KCJSZWN0Iikscz1BcnJheS5pc0FycmF5KGkpJiZpLmV2ZXJ5KGU9PjA9PT1lKTtyZXR1cm4gciYmc30pfWdldCBmb3JtSW5mbygpe2NvbnN0IGU9e2hhc0Fjcm9Gb3JtOiExLGhhc1hmYTohMX0sdD10aGlzLmNhdGFsb2cuYWNyb0Zvcm07aWYoIXQpcmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImZvcm1JbmZvIixlKTt0cnl7Y29uc3Qgcj10LmdldCgiWEZBIiksYT1BcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aD4wfHwoMCxuLmlzU3RyZWFtKShyKSYmIXIuaXNFbXB0eTtlLmhhc1hmYT1hO2NvbnN0IGk9dC5nZXQoIkZpZWxkcyIpLHM9QXJyYXkuaXNBcnJheShpKSYmaS5sZW5ndGg+MCxvPSEhKDEmdC5nZXQoIlNpZ0ZsYWdzIikpJiZ0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGkpO2UuaGFzQWNyb0Zvcm09cyYmIW99Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLmluZm8pKCJDYW5ub3QgZmV0Y2ggZm9ybSBpbmZvcm1hdGlvbi4iKX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywiZm9ybUluZm8iLGUpfWdldCBkb2N1bWVudEluZm8oKXtjb25zdCBlPXtUaXRsZTphLmlzU3RyaW5nLEF1dGhvcjphLmlzU3RyaW5nLFN1YmplY3Q6YS5pc1N0cmluZyxLZXl3b3JkczphLmlzU3RyaW5nLENyZWF0b3I6YS5pc1N0cmluZyxQcm9kdWNlcjphLmlzU3RyaW5nLENyZWF0aW9uRGF0ZTphLmlzU3RyaW5nLE1vZERhdGU6YS5pc1N0cmluZyxUcmFwcGVkOm4uaXNOYW1lfTtsZXQgdD10aGlzLl92ZXJzaW9uO2lmKCJzdHJpbmciIT10eXBlb2YgdHx8IWIudGVzdCh0KSl7KDAsYS53YXJuKSgiSW52YWxpZCBQREYgaGVhZGVyIHZlcnNpb24gbnVtYmVyOiAiK3QpO3Q9bnVsbH1jb25zdCByPXtQREZGb3JtYXRWZXJzaW9uOnQsSXNMaW5lYXJpemVkOiEhdGhpcy5saW5lYXJpemF0aW9uLElzQWNyb0Zvcm1QcmVzZW50OnRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0sSXNYRkFQcmVzZW50OnRoaXMuZm9ybUluZm8uaGFzWGZhLElzQ29sbGVjdGlvblByZXNlbnQ6ISF0aGlzLmNhdGFsb2cuY29sbGVjdGlvbn07bGV0IGk7dHJ5e2k9dGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLmluZm8pKCJUaGUgZG9jdW1lbnQgaW5mb3JtYXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpfWlmKCgwLG4uaXNEaWN0KShpKSlmb3IoY29uc3QgdCBvZiBpLmdldEtleXMoKSl7Y29uc3Qgcz1pLmdldCh0KTtpZihlW3RdKWVbdF0ocyk/clt0XT0ic3RyaW5nIiE9dHlwZW9mIHM/czooMCxhLnN0cmluZ1RvUERGU3RyaW5nKShzKTooMCxhLmluZm8pKGBCYWQgdmFsdWUgaW4gZG9jdW1lbnQgaW5mbyBmb3IgIiR7dH0iLmApO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB0KXtsZXQgZTtpZigoMCxhLmlzU3RyaW5nKShzKSllPSgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHMpO2Vsc2V7aWYoISgoMCxuLmlzTmFtZSkocyl8fCgwLGEuaXNOdW0pKHMpfHwoMCxhLmlzQm9vbCkocykpKXsoMCxhLmluZm8pKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBkb2N1bWVudCBpbmZvIGZvciAoY3VzdG9tKSAiJHt0fSIuYCk7Y29udGludWV9ZT1zfXIuQ3VzdG9tfHwoci5DdXN0b209T2JqZWN0LmNyZWF0ZShudWxsKSk7ci5DdXN0b21bdF09ZX19cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImRvY3VtZW50SW5mbyIscil9Z2V0IGZpbmdlcnByaW50KCl7bGV0IGU7Y29uc3QgdD10aGlzLnhyZWYudHJhaWxlci5nZXQoIklEIik7ZT1BcnJheS5pc0FycmF5KHQpJiZ0WzBdJiYoMCxhLmlzU3RyaW5nKSh0WzBdKSYmIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiE9PXRbMF0/KDAsYS5zdHJpbmdUb0J5dGVzKSh0WzBdKTooMCxsLmNhbGN1bGF0ZU1ENSkodGhpcy5zdHJlYW0uZ2V0Qnl0ZVJhbmdlKDAsMTAyNCksMCwxMDI0KTtjb25zdCByPVtdO2ZvcihsZXQgdD0wLGE9ZS5sZW5ndGg7dDxhO3QrKyl7Y29uc3QgYT1lW3RdLnRvU3RyaW5nKDE2KTtyLnB1c2goYS5wYWRTdGFydCgyLCIwIikpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJmaW5nZXJwcmludCIsci5qb2luKCIiKSl9X2dldExpbmVhcml6YXRpb25QYWdlKGUpe2NvbnN0e2NhdGFsb2c6dCxsaW5lYXJpemF0aW9uOnJ9PXRoaXMsaT1uLlJlZi5nZXQoci5vYmplY3ROdW1iZXJGaXJzdCwwKTtyZXR1cm4gdGhpcy54cmVmLmZldGNoQXN5bmMoaSkudGhlbihlPT57aWYoKDAsbi5pc0RpY3QpKGUsIlBhZ2UiKXx8KDAsbi5pc0RpY3QpKGUpJiYhZS5oYXMoIlR5cGUiKSYmZS5oYXMoIkNvbnRlbnRzIikpe2kmJiF0LnBhZ2VLaWRzQ291bnRDYWNoZS5oYXMoaSkmJnQucGFnZUtpZHNDb3VudENhY2hlLnB1dChpLDEpO3JldHVybltlLGldfXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJUaGUgTGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgcG9pbnQgdG8gYSB2YWxpZCBQYWdlIGRpY3Rpb25hcnkuIil9KS5jYXRjaChyPT57KDAsYS5pbmZvKShyKTtyZXR1cm4gdC5nZXRQYWdlRGljdChlKX0pfWdldFBhZ2UoZSl7aWYodm9pZCAwIT09dGhpcy5fcGFnZVByb21pc2VzW2VdKXJldHVybiB0aGlzLl9wYWdlUHJvbWlzZXNbZV07Y29uc3R7Y2F0YWxvZzp0LGxpbmVhcml6YXRpb246cn09dGhpcyxhPXImJnIucGFnZUZpcnN0PT09ZT90aGlzLl9nZXRMaW5lYXJpemF0aW9uUGFnZShlKTp0LmdldFBhZ2VEaWN0KGUpO3JldHVybiB0aGlzLl9wYWdlUHJvbWlzZXNbZV09YS50aGVuKChbcixhXSk9Pm5ldyBQYWdlKHtwZGZNYW5hZ2VyOnRoaXMucGRmTWFuYWdlcix4cmVmOnRoaXMueHJlZixwYWdlSW5kZXg6ZSxwYWdlRGljdDpyLHJlZjphLGdsb2JhbElkRmFjdG9yeTp0aGlzLl9nbG9iYWxJZEZhY3RvcnksZm9udENhY2hlOnQuZm9udENhY2hlLGJ1aWx0SW5DTWFwQ2FjaGU6dC5idWlsdEluQ01hcENhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dC5nbG9iYWxJbWFnZUNhY2hlfSkpfWNoZWNrRmlyc3RQYWdlKCl7cmV0dXJuIHRoaXMuZ2V0UGFnZSgwKS5jYXRjaChhc3luYyBlPT57aWYoZSBpbnN0YW5jZW9mIHMuWFJlZkVudHJ5RXhjZXB0aW9uKXt0aGlzLl9wYWdlUHJvbWlzZXMubGVuZ3RoPTA7YXdhaXQgdGhpcy5jbGVhbnVwKCk7dGhyb3cgbmV3IHMuWFJlZlBhcnNlRXhjZXB0aW9ufX0pfWZvbnRGYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmNhdGFsb2cuZm9udEZhbGxiYWNrKGUsdCl9YXN5bmMgY2xlYW51cChlPSExKXtyZXR1cm4gdGhpcy5jYXRhbG9nP3RoaXMuY2F0YWxvZy5jbGVhbnVwKGUpOigwLG4uY2xlYXJQcmltaXRpdmVDYWNoZXMpKCl9fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5GaWxlU3BlYz10LlhSZWY9dC5PYmplY3RMb2FkZXI9dC5DYXRhbG9nPXZvaWQgMDt2YXIgYT1yKDIpLGk9cig1KSxuPXIoMTEpLHM9cig4KSxvPXIoMjIpLGM9cigyMyksbD1yKDI0KTtmdW5jdGlvbiBmZXRjaERlc3RpbmF0aW9uKGUpe3JldHVybigwLGkuaXNEaWN0KShlKT9lLmdldCgiRCIpOmV9Y2xhc3MgQ2F0YWxvZ3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMucGRmTWFuYWdlcj1lO3RoaXMueHJlZj10O3RoaXMuX2NhdERpY3Q9dC5nZXRDYXRhbG9nT2JqKCk7aWYoISgwLGkuaXNEaWN0KSh0aGlzLl9jYXREaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQ2F0YWxvZyBvYmplY3QgaXMgbm90IGEgZGljdGlvbmFyeS4iKTt0aGlzLmZvbnRDYWNoZT1uZXcgaS5SZWZTZXRDYWNoZTt0aGlzLmJ1aWx0SW5DTWFwQ2FjaGU9bmV3IE1hcDt0aGlzLmdsb2JhbEltYWdlQ2FjaGU9bmV3IGwuR2xvYmFsSW1hZ2VDYWNoZTt0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZT1uZXcgaS5SZWZTZXRDYWNoZX1nZXQgdmVyc2lvbigpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlZlcnNpb24iKTtyZXR1cm4oMCxpLmlzTmFtZSkoZSk/KDAsYS5zaGFkb3cpKHRoaXMsInZlcnNpb24iLGUubmFtZSk6KDAsYS5zaGFkb3cpKHRoaXMsInZlcnNpb24iLG51bGwpfWdldCBjb2xsZWN0aW9uKCl7bGV0IGU9bnVsbDt0cnl7Y29uc3QgdD10aGlzLl9jYXREaWN0LmdldCgiQ29sbGVjdGlvbiIpOygwLGkuaXNEaWN0KSh0KSYmdC5zaXplPjAmJihlPXQpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS5pbmZvKSgiQ2Fubm90IGZldGNoIENvbGxlY3Rpb24gZW50cnk7IGFzc3VtaW5nIG5vIGNvbGxlY3Rpb24gaXMgcHJlc2VudC4iKX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywiY29sbGVjdGlvbiIsZSl9Z2V0IGFjcm9Gb3JtKCl7bGV0IGU9bnVsbDt0cnl7Y29uc3QgdD10aGlzLl9jYXREaWN0LmdldCgiQWNyb0Zvcm0iKTsoMCxpLmlzRGljdCkodCkmJnQuc2l6ZT4wJiYoZT10KX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEuaW5mbykoIkNhbm5vdCBmZXRjaCBBY3JvRm9ybSBlbnRyeTsgYXNzdW1pbmcgbm8gZm9ybXMgYXJlIHByZXNlbnQuIil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImFjcm9Gb3JtIixlKX1nZXQgbWV0YWRhdGEoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0UmF3KCJNZXRhZGF0YSIpO2lmKCEoMCxpLmlzUmVmKShlKSlyZXR1cm4oMCxhLnNoYWRvdykodGhpcywibWV0YWRhdGEiLG51bGwpO2NvbnN0IHQ9ISh0aGlzLnhyZWYuZW5jcnlwdCYmdGhpcy54cmVmLmVuY3J5cHQuZW5jcnlwdE1ldGFkYXRhKSxyPXRoaXMueHJlZi5mZXRjaChlLHQpO2xldCBuO2lmKHImJigwLGkuaXNEaWN0KShyLmRpY3QpKXtjb25zdCBlPXIuZGljdC5nZXQoIlR5cGUiKSx0PXIuZGljdC5nZXQoIlN1YnR5cGUiKTtpZigoMCxpLmlzTmFtZSkoZSwiTWV0YWRhdGEiKSYmKDAsaS5pc05hbWUpKHQsIlhNTCIpKXRyeXtuPSgwLGEuc3RyaW5nVG9VVEY4U3RyaW5nKSgoMCxhLmJ5dGVzVG9TdHJpbmcpKHIuZ2V0Qnl0ZXMoKSkpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS5pbmZvKSgiU2tpcHBpbmcgaW52YWxpZCBtZXRhZGF0YS4iKX19cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm1ldGFkYXRhIixuKX1nZXQgdG9wbGV2ZWxQYWdlc0RpY3QoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlcyIpO2lmKCEoMCxpLmlzRGljdCkoZSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkuIik7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInRvcGxldmVsUGFnZXNEaWN0IixlKX1nZXQgZG9jdW1lbnRPdXRsaW5lKCl7bGV0IGU9bnVsbDt0cnl7ZT10aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCJVbmFibGUgdG8gcmVhZCBkb2N1bWVudCBvdXRsaW5lLiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJkb2N1bWVudE91dGxpbmUiLGUpfV9yZWFkRG9jdW1lbnRPdXRsaW5lKCl7bGV0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7aWYoISgwLGkuaXNEaWN0KShlKSlyZXR1cm4gbnVsbDtlPWUuZ2V0UmF3KCJGaXJzdCIpO2lmKCEoMCxpLmlzUmVmKShlKSlyZXR1cm4gbnVsbDtjb25zdCB0PXtpdGVtczpbXX0scj1be29iajplLHBhcmVudDp0fV0sbj1uZXcgaS5SZWZTZXQ7bi5wdXQoZSk7Y29uc3Qgcz10aGlzLnhyZWYsbz1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7Zm9yKDtyLmxlbmd0aD4wOyl7Y29uc3QgdD1yLnNoaWZ0KCksbD1zLmZldGNoSWZSZWYodC5vYmopO2lmKG51bGw9PT1sKWNvbnRpbnVlO2lmKCFsLmhhcygiVGl0bGUiKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7Y29uc3QgaD17dXJsOm51bGwsZGVzdDpudWxsfTtDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OmwscmVzdWx0T2JqOmgsZG9jQmFzZVVybDp0aGlzLnBkZk1hbmFnZXIuZG9jQmFzZVVybH0pO2NvbnN0IHU9bC5nZXQoIlRpdGxlIiksZD1sLmdldCgiRiIpfHwwLGY9bC5nZXRBcnJheSgiQyIpLGc9bC5nZXQoIkNvdW50Iik7bGV0IG09bzshQXJyYXkuaXNBcnJheShmKXx8MyE9PWYubGVuZ3RofHwwPT09ZlswXSYmMD09PWZbMV0mJjA9PT1mWzJdfHwobT1jLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKGYsMCkpO2NvbnN0IHA9e2Rlc3Q6aC5kZXN0LHVybDpoLnVybCx1bnNhZmVVcmw6aC51bnNhZmVVcmwsbmV3V2luZG93OmgubmV3V2luZG93LHRpdGxlOigwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHUpLGNvbG9yOm0sY291bnQ6TnVtYmVyLmlzSW50ZWdlcihnKT9nOnZvaWQgMCxib2xkOiEhKDImZCksaXRhbGljOiEhKDEmZCksaXRlbXM6W119O3QucGFyZW50Lml0ZW1zLnB1c2gocCk7ZT1sLmdldFJhdygiRmlyc3QiKTtpZigoMCxpLmlzUmVmKShlKSYmIW4uaGFzKGUpKXtyLnB1c2goe29iajplLHBhcmVudDpwfSk7bi5wdXQoZSl9ZT1sLmdldFJhdygiTmV4dCIpO2lmKCgwLGkuaXNSZWYpKGUpJiYhbi5oYXMoZSkpe3IucHVzaCh7b2JqOmUscGFyZW50OnQucGFyZW50fSk7bi5wdXQoZSl9fXJldHVybiB0Lml0ZW1zLmxlbmd0aD4wP3QuaXRlbXM6bnVsbH1nZXQgcGVybWlzc2lvbnMoKXtsZXQgZT1udWxsO3RyeXtlPXRoaXMuX3JlYWRQZXJtaXNzaW9ucygpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS53YXJuKSgiVW5hYmxlIHRvIHJlYWQgcGVybWlzc2lvbnMuIil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInBlcm1pc3Npb25zIixlKX1fcmVhZFBlcm1pc3Npb25zKCl7Y29uc3QgZT10aGlzLnhyZWYudHJhaWxlci5nZXQoIkVuY3J5cHQiKTtpZighKDAsaS5pc0RpY3QpKGUpKXJldHVybiBudWxsO2xldCB0PWUuZ2V0KCJQIik7aWYoISgwLGEuaXNOdW0pKHQpKXJldHVybiBudWxsO3QrPTIqKjMyO2NvbnN0IHI9W107Zm9yKGNvbnN0IGUgaW4gYS5QZXJtaXNzaW9uRmxhZyl7Y29uc3QgaT1hLlBlcm1pc3Npb25GbGFnW2VdO3QmaSYmci5wdXNoKGkpfXJldHVybiByfWdldCBvcHRpb25hbENvbnRlbnRDb25maWcoKXtsZXQgZT1udWxsO3RyeXtjb25zdCB0PXRoaXMuX2NhdERpY3QuZ2V0KCJPQ1Byb3BlcnRpZXMiKTtpZighdClyZXR1cm4oMCxhLnNoYWRvdykodGhpcywib3B0aW9uYWxDb250ZW50Q29uZmlnIixudWxsKTtjb25zdCByPXQuZ2V0KCJEIik7aWYoIXIpcmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm9wdGlvbmFsQ29udGVudENvbmZpZyIsbnVsbCk7Y29uc3Qgbj10LmdldCgiT0NHcyIpO2lmKCFBcnJheS5pc0FycmF5KG4pKXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJvcHRpb25hbENvbnRlbnRDb25maWciLG51bGwpO2NvbnN0IHM9W10sbz1bXTtmb3IoY29uc3QgZSBvZiBuKXtpZighKDAsaS5pc1JlZikoZSkpY29udGludWU7by5wdXNoKGUpO2NvbnN0IHQ9dGhpcy54cmVmLmZldGNoSWZSZWYoZSk7cy5wdXNoKHtpZDplLnRvU3RyaW5nKCksbmFtZTooMCxhLmlzU3RyaW5nKSh0LmdldCgiTmFtZSIpKT8oMCxhLnN0cmluZ1RvUERGU3RyaW5nKSh0LmdldCgiTmFtZSIpKTpudWxsLGludGVudDooMCxhLmlzU3RyaW5nKSh0LmdldCgiSW50ZW50IikpPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJJbnRlbnQiKSk6bnVsbH0pfWU9dGhpcy5fcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhyLG8pO2UuZ3JvdXBzPXN9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCJVbmFibGUgdG8gcmVhZCBvcHRpb25hbCBjb250ZW50IGNvbmZpZzogIitlKX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywib3B0aW9uYWxDb250ZW50Q29uZmlnIixlKX1fcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhlLHQpe2Z1bmN0aW9uIHBhcnNlT25PZmYoZSl7Y29uc3Qgcj1bXTtpZihBcnJheS5pc0FycmF5KGUpKWZvcihjb25zdCBhIG9mIGUpKDAsaS5pc1JlZikoYSkmJnQuaW5jbHVkZXMoYSkmJnIucHVzaChhLnRvU3RyaW5nKCkpO3JldHVybiByfWZ1bmN0aW9uIHBhcnNlT3JkZXIoZSxyPTApe2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiBudWxsO2NvbnN0IGE9W107Zm9yKGNvbnN0IHMgb2YgZSl7aWYoKDAsaS5pc1JlZikocykmJnQuaW5jbHVkZXMocykpe24ucHV0KHMpO2EucHVzaChzLnRvU3RyaW5nKCkpO2NvbnRpbnVlfWNvbnN0IGU9cGFyc2VOZXN0ZWRPcmRlcihzLHIpO2UmJmEucHVzaChlKX1pZihyPjApcmV0dXJuIGE7Y29uc3Qgcz1bXTtmb3IoY29uc3QgZSBvZiB0KW4uaGFzKGUpfHxzLnB1c2goZS50b1N0cmluZygpKTtzLmxlbmd0aCYmYS5wdXNoKHtuYW1lOm51bGwsb3JkZXI6c30pO3JldHVybiBhfWZ1bmN0aW9uIHBhcnNlTmVzdGVkT3JkZXIoZSx0KXtpZigrK3Q+cyl7KDAsYS53YXJuKSgicGFyc2VOZXN0ZWRPcmRlciAtIHJlYWNoZWQgTUFYX05FU1RFRF9MRVZFTFMuIik7cmV0dXJuIG51bGx9Y29uc3QgaT1yLmZldGNoSWZSZWYoZSk7aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIG51bGw7Y29uc3Qgbj1yLmZldGNoSWZSZWYoaVswXSk7aWYoInN0cmluZyIhPXR5cGVvZiBuKXJldHVybiBudWxsO2NvbnN0IG89cGFyc2VPcmRlcihpLnNsaWNlKDEpLHQpO3JldHVybiBvJiZvLmxlbmd0aD97bmFtZTooMCxhLnN0cmluZ1RvUERGU3RyaW5nKShuKSxvcmRlcjpvfTpudWxsfWNvbnN0IHI9dGhpcy54cmVmLG49bmV3IGkuUmVmU2V0LHM9MTA7cmV0dXJue25hbWU6KDAsYS5pc1N0cmluZykoZS5nZXQoIk5hbWUiKSk/KDAsYS5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIk5hbWUiKSk6bnVsbCxjcmVhdG9yOigwLGEuaXNTdHJpbmcpKGUuZ2V0KCJDcmVhdG9yIikpPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUuZ2V0KCJDcmVhdG9yIikpOm51bGwsYmFzZVN0YXRlOigwLGkuaXNOYW1lKShlLmdldCgiQmFzZVN0YXRlIikpP2UuZ2V0KCJCYXNlU3RhdGUiKS5uYW1lOm51bGwsb246cGFyc2VPbk9mZihlLmdldCgiT04iKSksb2ZmOnBhcnNlT25PZmYoZS5nZXQoIk9GRiIpKSxvcmRlcjpwYXJzZU9yZGVyKGUuZ2V0KCJPcmRlciIpKSxncm91cHM6bnVsbH19Z2V0IG51bVBhZ2VzKCl7Y29uc3QgZT10aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldCgiQ291bnQiKTtpZighTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci4iKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywibnVtUGFnZXMiLGUpfWdldCBkZXN0aW5hdGlvbnMoKXtjb25zdCBlPXRoaXMuX3JlYWREZXN0cygpLHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihlIGluc3RhbmNlb2YgTmFtZVRyZWUpe2NvbnN0IHI9ZS5nZXRBbGwoKTtmb3IoY29uc3QgZSBpbiByKXRbZV09ZmV0Y2hEZXN0aW5hdGlvbihyW2VdKX1lbHNlIGUgaW5zdGFuY2VvZiBpLkRpY3QmJmUuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtyJiYodFtlXT1mZXRjaERlc3RpbmF0aW9uKHIpKX0pKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiZGVzdGluYXRpb25zIix0KX1nZXREZXN0aW5hdGlvbihlKXtjb25zdCB0PXRoaXMuX3JlYWREZXN0cygpO3JldHVybiB0IGluc3RhbmNlb2YgTmFtZVRyZWV8fHQgaW5zdGFuY2VvZiBpLkRpY3Q/ZmV0Y2hEZXN0aW5hdGlvbih0LmdldChlKXx8bnVsbCk6bnVsbH1fcmVhZERlc3RzKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTtyZXR1cm4gZSYmZS5oYXMoIkRlc3RzIik/bmV3IE5hbWVUcmVlKGUuZ2V0UmF3KCJEZXN0cyIpLHRoaXMueHJlZik6dGhpcy5fY2F0RGljdC5oYXMoIkRlc3RzIik/dGhpcy5fY2F0RGljdC5nZXQoIkRlc3RzIik6dm9pZCAwfWdldCBwYWdlTGFiZWxzKCl7bGV0IGU9bnVsbDt0cnl7ZT10aGlzLl9yZWFkUGFnZUxhYmVscygpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS53YXJuKSgiVW5hYmxlIHRvIHJlYWQgcGFnZSBsYWJlbHMuIil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInBhZ2VMYWJlbHMiLGUpfV9yZWFkUGFnZUxhYmVscygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXRSYXcoIlBhZ2VMYWJlbHMiKTtpZighZSlyZXR1cm4gbnVsbDtjb25zdCB0PW5ldyBBcnJheSh0aGlzLm51bVBhZ2VzKTtsZXQgcj1udWxsLG49IiI7Y29uc3Qgbz1uZXcgTnVtYmVyVHJlZShlLHRoaXMueHJlZikuZ2V0QWxsKCk7bGV0IGM9IiIsbD0xO2ZvcihsZXQgZT0wLGg9dGhpcy5udW1QYWdlcztlPGg7ZSsrKXtpZihlIGluIG8pe2NvbnN0IHQ9b1tlXTtpZighKDAsaS5pc0RpY3QpKHQpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlTGFiZWwgaXMgbm90IGEgZGljdGlvbmFyeS4iKTtpZih0LmhhcygiVHlwZSIpJiYhKDAsaS5pc05hbWUpKHQuZ2V0KCJUeXBlIiksIlBhZ2VMYWJlbCIpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIHR5cGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7aWYodC5oYXMoIlMiKSl7Y29uc3QgZT10LmdldCgiUyIpO2lmKCEoMCxpLmlzTmFtZSkoZSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgc3R5bGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7cj1lLm5hbWV9ZWxzZSByPW51bGw7aWYodC5oYXMoIlAiKSl7Y29uc3QgZT10LmdldCgiUCIpO2lmKCEoMCxhLmlzU3RyaW5nKShlKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBwcmVmaXggaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7bj0oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlKX1lbHNlIG49IiI7aWYodC5oYXMoIlN0Iikpe2NvbnN0IGU9dC5nZXQoIlN0Iik7aWYoIShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0xKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBzdGFydCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtsPWV9ZWxzZSBsPTF9c3dpdGNoKHIpe2Nhc2UiRCI6Yz1sO2JyZWFrO2Nhc2UiUiI6Y2FzZSJyIjpjPSgwLHMudG9Sb21hbk51bWVyYWxzKShsLCJyIj09PXIpO2JyZWFrO2Nhc2UiQSI6Y2FzZSJhIjpjb25zdCBlPTI2LHQ9NjUsaT05NyxuPSJhIj09PXI/aTp0LG89bC0xLGg9U3RyaW5nLmZyb21DaGFyQ29kZShuK28lZSksdT1bXTtmb3IobGV0IHQ9MCxyPW8vZXwwO3Q8PXI7dCsrKXUucHVzaChoKTtjPXUuam9pbigiIik7YnJlYWs7ZGVmYXVsdDppZihyKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKGBJbnZhbGlkIHN0eWxlICIke3J9IiBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS5gKTtjPSIifXRbZV09bitjO2wrK31yZXR1cm4gdH1nZXQgcGFnZUxheW91dCgpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VMYXlvdXQiKTtsZXQgdD0iIjtpZigoMCxpLmlzTmFtZSkoZSkpc3dpdGNoKGUubmFtZSl7Y2FzZSJTaW5nbGVQYWdlIjpjYXNlIk9uZUNvbHVtbiI6Y2FzZSJUd29Db2x1bW5MZWZ0IjpjYXNlIlR3b0NvbHVtblJpZ2h0IjpjYXNlIlR3b1BhZ2VMZWZ0IjpjYXNlIlR3b1BhZ2VSaWdodCI6dD1lLm5hbWV9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInBhZ2VMYXlvdXQiLHQpfWdldCBwYWdlTW9kZSgpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VNb2RlIik7bGV0IHQ9IlVzZU5vbmUiO2lmKCgwLGkuaXNOYW1lKShlKSlzd2l0Y2goZS5uYW1lKXtjYXNlIlVzZU5vbmUiOmNhc2UiVXNlT3V0bGluZXMiOmNhc2UiVXNlVGh1bWJzIjpjYXNlIkZ1bGxTY3JlZW4iOmNhc2UiVXNlT0MiOmNhc2UiVXNlQXR0YWNobWVudHMiOnQ9ZS5uYW1lfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJwYWdlTW9kZSIsdCl9Z2V0IHZpZXdlclByZWZlcmVuY2VzKCl7Y29uc3QgZT17SGlkZVRvb2xiYXI6YS5pc0Jvb2wsSGlkZU1lbnViYXI6YS5pc0Jvb2wsSGlkZVdpbmRvd1VJOmEuaXNCb29sLEZpdFdpbmRvdzphLmlzQm9vbCxDZW50ZXJXaW5kb3c6YS5pc0Jvb2wsRGlzcGxheURvY1RpdGxlOmEuaXNCb29sLE5vbkZ1bGxTY3JlZW5QYWdlTW9kZTppLmlzTmFtZSxEaXJlY3Rpb246aS5pc05hbWUsVmlld0FyZWE6aS5pc05hbWUsVmlld0NsaXA6aS5pc05hbWUsUHJpbnRBcmVhOmkuaXNOYW1lLFByaW50Q2xpcDppLmlzTmFtZSxQcmludFNjYWxpbmc6aS5pc05hbWUsRHVwbGV4OmkuaXNOYW1lLFBpY2tUcmF5QnlQREZTaXplOmEuaXNCb29sLFByaW50UGFnZVJhbmdlOkFycmF5LmlzQXJyYXksTnVtQ29waWVzOk51bWJlci5pc0ludGVnZXJ9LHQ9dGhpcy5fY2F0RGljdC5nZXQoIlZpZXdlclByZWZlcmVuY2VzIik7bGV0IHI9bnVsbDtpZigoMCxpLmlzRGljdCkodCkpZm9yKGNvbnN0IGkgaW4gZSl7aWYoIXQuaGFzKGkpKWNvbnRpbnVlO2NvbnN0IG49dC5nZXQoaSk7aWYoIWVbaV0obikpeygwLGEuaW5mbykoYEJhZCB2YWx1ZSBpbiBWaWV3ZXJQcmVmZXJlbmNlcyBmb3IgIiR7aX0iLmApO2NvbnRpbnVlfWxldCBzO3N3aXRjaChpKXtjYXNlIk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSI6c3dpdGNoKG4ubmFtZSl7Y2FzZSJVc2VOb25lIjpjYXNlIlVzZU91dGxpbmVzIjpjYXNlIlVzZVRodW1icyI6Y2FzZSJVc2VPQyI6cz1uLm5hbWU7YnJlYWs7ZGVmYXVsdDpzPSJVc2VOb25lIn1icmVhaztjYXNlIkRpcmVjdGlvbiI6c3dpdGNoKG4ubmFtZSl7Y2FzZSJMMlIiOmNhc2UiUjJMIjpzPW4ubmFtZTticmVhaztkZWZhdWx0OnM9IkwyUiJ9YnJlYWs7Y2FzZSJWaWV3QXJlYSI6Y2FzZSJWaWV3Q2xpcCI6Y2FzZSJQcmludEFyZWEiOmNhc2UiUHJpbnRDbGlwIjpzd2l0Y2gobi5uYW1lKXtjYXNlIk1lZGlhQm94IjpjYXNlIkNyb3BCb3giOmNhc2UiQmxlZWRCb3giOmNhc2UiVHJpbUJveCI6Y2FzZSJBcnRCb3giOnM9bi5uYW1lO2JyZWFrO2RlZmF1bHQ6cz0iQ3JvcEJveCJ9YnJlYWs7Y2FzZSJQcmludFNjYWxpbmciOnN3aXRjaChuLm5hbWUpe2Nhc2UiTm9uZSI6Y2FzZSJBcHBEZWZhdWx0IjpzPW4ubmFtZTticmVhaztkZWZhdWx0OnM9IkFwcERlZmF1bHQifWJyZWFrO2Nhc2UiRHVwbGV4Ijpzd2l0Y2gobi5uYW1lKXtjYXNlIlNpbXBsZXgiOmNhc2UiRHVwbGV4RmxpcFNob3J0RWRnZSI6Y2FzZSJEdXBsZXhGbGlwTG9uZ0VkZ2UiOnM9bi5uYW1lO2JyZWFrO2RlZmF1bHQ6cz0iTm9uZSJ9YnJlYWs7Y2FzZSJQcmludFBhZ2VSYW5nZSI6aWYobi5sZW5ndGglMiE9MClicmVhaztuLmV2ZXJ5KChlLHQscik9Pk51bWJlci5pc0ludGVnZXIoZSkmJmU+MCYmKDA9PT10fHxlPj1yW3QtMV0pJiZlPD10aGlzLm51bVBhZ2VzKSYmKHM9bik7YnJlYWs7Y2FzZSJOdW1Db3BpZXMiOm4+MCYmKHM9bik7YnJlYWs7ZGVmYXVsdDppZigiYm9vbGVhbiIhPXR5cGVvZiBuKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJ2aWV3ZXJQcmVmZXJlbmNlcyAtIGV4cGVjdGVkIGEgYm9vbGVhbiB2YWx1ZSBmb3I6ICIraSk7cz1ufWlmKHZvaWQgMCE9PXMpe3J8fChyPU9iamVjdC5jcmVhdGUobnVsbCkpO3JbaV09c31lbHNlKDAsYS5pbmZvKShgQmFkIHZhbHVlIGluIFZpZXdlclByZWZlcmVuY2VzIGZvciAiJHtpfSIuYCl9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInZpZXdlclByZWZlcmVuY2VzIixyKX1nZXQgb3BlbkFjdGlvbigpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTtsZXQgdD1udWxsO2lmKCgwLGkuaXNEaWN0KShlKSl7Y29uc3Qgcj1uZXcgaS5EaWN0KHRoaXMueHJlZik7ci5zZXQoIkEiLGUpO2NvbnN0IGE9e3VybDpudWxsLGRlc3Q6bnVsbCxhY3Rpb246bnVsbH07Q2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHtkZXN0RGljdDpyLHJlc3VsdE9iajphfSk7aWYoQXJyYXkuaXNBcnJheShhLmRlc3QpKXt0fHwodD1PYmplY3QuY3JlYXRlKG51bGwpKTt0LmRlc3Q9YS5kZXN0fWVsc2UgaWYoYS5hY3Rpb24pe3R8fCh0PU9iamVjdC5jcmVhdGUobnVsbCkpO3QuYWN0aW9uPWEuYWN0aW9ufX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpe3R8fCh0PU9iamVjdC5jcmVhdGUobnVsbCkpO3QuZGVzdD1lfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJvcGVuQWN0aW9uIix0KX1nZXQgYXR0YWNobWVudHMoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpO2xldCB0PW51bGw7aWYoZSYmZS5oYXMoIkVtYmVkZGVkRmlsZXMiKSl7Y29uc3Qgcj1uZXcgTmFtZVRyZWUoZS5nZXRSYXcoIkVtYmVkZGVkRmlsZXMiKSx0aGlzLnhyZWYpLmdldEFsbCgpO2Zvcihjb25zdCBlIGluIHIpe2NvbnN0IGk9bmV3IHUocltlXSx0aGlzLnhyZWYpO3R8fCh0PU9iamVjdC5jcmVhdGUobnVsbCkpO3RbKDAsYS5zdHJpbmdUb1BERlN0cmluZykoZSldPWkuc2VyaWFsaXphYmxlfX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywiYXR0YWNobWVudHMiLHQpfWdldCBqYXZhU2NyaXB0KCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTtsZXQgdD1udWxsO2Z1bmN0aW9uIGFwcGVuZElmSmF2YVNjcmlwdERpY3QoZSl7Y29uc3Qgcj1lLmdldCgiUyIpO2lmKCEoMCxpLmlzTmFtZSkociwiSmF2YVNjcmlwdCIpKXJldHVybjtsZXQgbj1lLmdldCgiSlMiKTtpZigoMCxpLmlzU3RyZWFtKShuKSluPSgwLGEuYnl0ZXNUb1N0cmluZykobi5nZXRCeXRlcygpKTtlbHNlIGlmKCEoMCxhLmlzU3RyaW5nKShuKSlyZXR1cm47dHx8KHQ9W10pO3QucHVzaCgoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShuKSl9aWYoZSYmZS5oYXMoIkphdmFTY3JpcHQiKSl7Y29uc3QgdD1uZXcgTmFtZVRyZWUoZS5nZXRSYXcoIkphdmFTY3JpcHQiKSx0aGlzLnhyZWYpLmdldEFsbCgpO2Zvcihjb25zdCBlIGluIHQpe2NvbnN0IHI9dFtlXTsoMCxpLmlzRGljdCkocikmJmFwcGVuZElmSmF2YVNjcmlwdERpY3Qocil9fWNvbnN0IHI9dGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTsoMCxpLmlzRGljdCkocikmJigwLGkuaXNOYW1lKShyLmdldCgiUyIpLCJKYXZhU2NyaXB0IikmJmFwcGVuZElmSmF2YVNjcmlwdERpY3Qocik7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImphdmFTY3JpcHQiLHQpfWZvbnRGYWxsYmFjayhlLHQpe2NvbnN0IHI9W107dGhpcy5mb250Q2FjaGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ci5wdXNoKGUpfSkpO3JldHVybiBQcm9taXNlLmFsbChyKS50aGVuKHI9Pntmb3IoY29uc3QgYSBvZiByKWlmKGEubG9hZGVkTmFtZT09PWUpe2EuZmFsbGJhY2sodCk7cmV0dXJufX0pfWNsZWFudXAoZT0hMSl7KDAsaS5jbGVhclByaW1pdGl2ZUNhY2hlcykoKTt0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIoZSk7dGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTtjb25zdCB0PVtdO3RoaXMuZm9udENhY2hlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QucHVzaChlKX0pKTtyZXR1cm4gUHJvbWlzZS5hbGwodCkudGhlbihlPT57Zm9yKGNvbnN0e2RpY3Q6dH1vZiBlKWRlbGV0ZSB0LnRyYW5zbGF0ZWQ7dGhpcy5mb250Q2FjaGUuY2xlYXIoKTt0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuY2xlYXIoKX0pfWdldFBhZ2VEaWN0KGUpe2NvbnN0IHQ9KDAsYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSxyPVt0aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZXMiKV0sbj1uZXcgaS5SZWZTZXQscz10aGlzLnhyZWYsbz10aGlzLnBhZ2VLaWRzQ291bnRDYWNoZTtsZXQgYyxsPTA7IWZ1bmN0aW9uIG5leHQoKXtmb3IoO3IubGVuZ3RoOyl7Y29uc3QgaD1yLnBvcCgpO2lmKCgwLGkuaXNSZWYpKGgpKXtjPW8uZ2V0KGgpO2lmKGM+MCYmbCtjPGUpe2wrPWM7Y29udGludWV9aWYobi5oYXMoaCkpe3QucmVqZWN0KG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS4iKSk7cmV0dXJufW4ucHV0KGgpO3MuZmV0Y2hBc3luYyhoKS50aGVuKChmdW5jdGlvbihhKXtpZigoMCxpLmlzRGljdCkoYSwiUGFnZSIpfHwoMCxpLmlzRGljdCkoYSkmJiFhLmhhcygiS2lkcyIpKWlmKGU9PT1sKXtoJiYhby5oYXMoaCkmJm8ucHV0KGgsMSk7dC5yZXNvbHZlKFthLGhdKX1lbHNle2wrKztuZXh0KCl9ZWxzZXtyLnB1c2goYSk7bmV4dCgpfX0pLHQucmVqZWN0KTtyZXR1cm59aWYoISgwLGkuaXNEaWN0KShoKSl7dC5yZWplY3QobmV3IGEuRm9ybWF0RXJyb3IoIlBhZ2UgZGljdGlvbmFyeSBraWQgcmVmZXJlbmNlIHBvaW50cyB0byB3cm9uZyB0eXBlIG9mIG9iamVjdC4iKSk7cmV0dXJufWM9aC5nZXQoIkNvdW50Iik7aWYoTnVtYmVyLmlzSW50ZWdlcihjKSYmYz49MCl7Y29uc3QgdD1oLm9iaklkO3QmJiFvLmhhcyh0KSYmby5wdXQodCxjKTtpZihsK2M8PWUpe2wrPWM7Y29udGludWV9fWNvbnN0IHU9aC5nZXQoIktpZHMiKTtpZighQXJyYXkuaXNBcnJheSh1KSl7aWYoKDAsaS5pc05hbWUpKGguZ2V0KCJUeXBlIiksIlBhZ2UiKXx8IWguaGFzKCJUeXBlIikmJmguaGFzKCJDb250ZW50cyIpKXtpZihsPT09ZSl7dC5yZXNvbHZlKFtoLG51bGxdKTtyZXR1cm59bCsrO2NvbnRpbnVlfXQucmVqZWN0KG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTtyZXR1cm59Zm9yKGxldCBlPXUubGVuZ3RoLTE7ZT49MDtlLS0pci5wdXNoKHVbZV0pfXQucmVqZWN0KG5ldyBFcnJvcihgUGFnZSBpbmRleCAke2V9IG5vdCBmb3VuZC5gKSl9KCk7cmV0dXJuIHQucHJvbWlzZX1nZXRQYWdlSW5kZXgoZSl7Y29uc3QgdD10aGlzLnhyZWY7bGV0IHI9MDtyZXR1cm4gZnVuY3Rpb24gbmV4dChuKXtyZXR1cm4gZnVuY3Rpb24gcGFnZXNCZWZvcmVSZWYocil7bGV0IG4scz0wO3JldHVybiB0LmZldGNoQXN5bmMocikudGhlbigoZnVuY3Rpb24odCl7aWYoKDAsaS5pc1JlZnNFcXVhbCkocixlKSYmISgwLGkuaXNEaWN0KSh0LCJQYWdlIikmJighKDAsaS5pc0RpY3QpKHQpfHx0LmhhcygiVHlwZSIpfHwhdC5oYXMoIkNvbnRlbnRzIikpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJUaGUgcmVmZXJlbmNlIGRvZXMgbm90IHBvaW50IHRvIGEgL1BhZ2UgZGljdGlvbmFyeS4iKTtpZighdClyZXR1cm4gbnVsbDtpZighKDAsaS5pc0RpY3QpKHQpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJOb2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpO249dC5nZXRSYXcoIlBhcmVudCIpO3JldHVybiB0LmdldEFzeW5jKCJQYXJlbnQiKX0pKS50aGVuKChmdW5jdGlvbihlKXtpZighZSlyZXR1cm4gbnVsbDtpZighKDAsaS5pc0RpY3QpKGUpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJQYXJlbnQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7cmV0dXJuIGUuZ2V0QXN5bmMoIktpZHMiKX0pKS50aGVuKChmdW5jdGlvbihlKXtpZighZSlyZXR1cm4gbnVsbDtjb25zdCBvPVtdO2xldCBjPSExO2ZvcihsZXQgbj0wLGw9ZS5sZW5ndGg7bjxsO24rKyl7Y29uc3QgbD1lW25dO2lmKCEoMCxpLmlzUmVmKShsKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiS2lkIG11c3QgYmUgYSByZWZlcmVuY2UuIik7aWYoKDAsaS5pc1JlZnNFcXVhbCkobCxyKSl7Yz0hMDticmVha31vLnB1c2godC5mZXRjaEFzeW5jKGwpLnRoZW4oKGZ1bmN0aW9uKGUpe2lmKCEoMCxpLmlzRGljdCkoZSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIktpZCBub2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpO2UuaGFzKCJDb3VudCIpP3MrPWUuZ2V0KCJDb3VudCIpOnMrK30pKSl9aWYoIWMpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIktpZCByZWZlcmVuY2Ugbm90IGZvdW5kIGluIHBhcmVudCdzIGtpZHMuIik7cmV0dXJuIFByb21pc2UuYWxsKG8pLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuW3Msbl19KSl9KSl9KG4pLnRoZW4oKGZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiByO2NvbnN0W3QsYV09ZTtyKz10O3JldHVybiBuZXh0KGEpfSkpfShlKX1zdGF0aWMgcGFyc2VEZXN0RGljdGlvbmFyeShlKXtjb25zdCB0PWUuZGVzdERpY3Q7aWYoISgwLGkuaXNEaWN0KSh0KSl7KDAsYS53YXJuKSgicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTtyZXR1cm59Y29uc3Qgcj1lLnJlc3VsdE9iajtpZigib2JqZWN0IiE9dHlwZW9mIHIpeygwLGEud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IGByZXN1bHRPYmpgIG11c3QgYmUgYW4gb2JqZWN0LiIpO3JldHVybn1jb25zdCBuPWUuZG9jQmFzZVVybHx8bnVsbDtsZXQgcyxvLGM9dC5nZXQoIkEiKTshKDAsaS5pc0RpY3QpKGMpJiZ0LmhhcygiRGVzdCIpJiYoYz10LmdldCgiRGVzdCIpKTtpZigoMCxpLmlzRGljdCkoYykpe2NvbnN0IGU9Yy5nZXQoIlMiKTtpZighKDAsaS5pc05hbWUpKGUpKXsoMCxhLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBJbnZhbGlkIHR5cGUgaW4gQWN0aW9uIGRpY3Rpb25hcnkuIik7cmV0dXJufWNvbnN0IHQ9ZS5uYW1lO3N3aXRjaCh0KXtjYXNlIlVSSSI6cz1jLmdldCgiVVJJIik7KDAsaS5pc05hbWUpKHMpP3M9Ii8iK3MubmFtZTooMCxhLmlzU3RyaW5nKShzKSYmKHM9ZnVuY3Rpb24gYWRkRGVmYXVsdFByb3RvY29sVG9VcmwoZSl7cmV0dXJuIGUuc3RhcnRzV2l0aCgid3d3LiIpPyJodHRwOi8vIitlOmV9KHMpKTticmVhaztjYXNlIkdvVG8iOm89Yy5nZXQoIkQiKTticmVhaztjYXNlIkxhdW5jaCI6Y2FzZSJHb1RvUiI6Y29uc3QgZT1jLmdldCgiRiIpOygwLGkuaXNEaWN0KShlKT9zPWUuZ2V0KCJGIil8fG51bGw6KDAsYS5pc1N0cmluZykoZSkmJihzPWUpO2xldCBuPWMuZ2V0KCJEIik7aWYobil7KDAsaS5pc05hbWUpKG4pJiYobj1uLm5hbWUpO2lmKCgwLGEuaXNTdHJpbmcpKHMpKXtjb25zdCBlPXMuc3BsaXQoIiMiKVswXTsoMCxhLmlzU3RyaW5nKShuKT9zPWUrIiMiK246QXJyYXkuaXNBcnJheShuKSYmKHM9ZSsiIyIrSlNPTi5zdHJpbmdpZnkobikpfX1jb25zdCBsPWMuZ2V0KCJOZXdXaW5kb3ciKTsoMCxhLmlzQm9vbCkobCkmJihyLm5ld1dpbmRvdz1sKTticmVhaztjYXNlIk5hbWVkIjpjb25zdCBoPWMuZ2V0KCJOIik7KDAsaS5pc05hbWUpKGgpJiYoci5hY3Rpb249aC5uYW1lKTticmVhaztjYXNlIkphdmFTY3JpcHQiOmNvbnN0IHU9Yy5nZXQoIkpTIik7bGV0IGQ7KDAsaS5pc1N0cmVhbSkodSk/ZD0oMCxhLmJ5dGVzVG9TdHJpbmcpKHUuZ2V0Qnl0ZXMoKSk6KDAsYS5pc1N0cmluZykodSkmJihkPXUpO2lmKGQpe2NvbnN0IGU9bmV3IFJlZ0V4cCgiXlxccyooIitbImFwcC5sYXVuY2hVUkwiLCJ3aW5kb3cub3BlbiJdLmpvaW4oInwiKS5zcGxpdCgiLiIpLmpvaW4oIlxcLiIpKyIpXFwoKD86J3xcIikoW14nXCJdKikoPzonfFwiKSg/OixcXHMqKFxcdyspXFwpfFxcKSkiLCJpIikuZXhlYygoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShkKSk7aWYoZSYmZVsyXSl7cz1lWzJdOyJ0cnVlIj09PWVbM10mJiJhcHAubGF1bmNoVVJMIj09PWVbMV0mJihyLm5ld1dpbmRvdz0hMCk7YnJlYWt9fWRlZmF1bHQ6KDAsYS53YXJuKShgcGFyc2VEZXN0RGljdGlvbmFyeTogdW5zdXBwb3J0ZWQgYWN0aW9uIHR5cGUgIiR7dH0iLmApfX1lbHNlIHQuaGFzKCJEZXN0IikmJihvPXQuZ2V0KCJEZXN0IikpO2lmKCgwLGEuaXNTdHJpbmcpKHMpKXtzPWZ1bmN0aW9uIHRyeUNvbnZlcnRVcmxFbmNvZGluZyhlKXt0cnl7cmV0dXJuKDAsYS5zdHJpbmdUb1VURjhTdHJpbmcpKGUpfWNhdGNoKHQpe3JldHVybiBlfX0ocyk7Y29uc3QgZT0oMCxhLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKHMsbik7ZSYmKHIudXJsPWUuaHJlZik7ci51bnNhZmVVcmw9c31pZihvKXsoMCxpLmlzTmFtZSkobykmJihvPW8ubmFtZSk7KCgwLGEuaXNTdHJpbmcpKG8pfHxBcnJheS5pc0FycmF5KG8pKSYmKHIuZGVzdD1vKX19fXQuQ2F0YWxvZz1DYXRhbG9nO3ZhciBoPWZ1bmN0aW9uIFhSZWZDbG9zdXJlKCl7ZnVuY3Rpb24gWFJlZihlLHQpe3RoaXMuc3RyZWFtPWU7dGhpcy5wZGZNYW5hZ2VyPXQ7dGhpcy5lbnRyaWVzPVtdO3RoaXMueHJlZnN0bXM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLl9jYWNoZU1hcD1uZXcgTWFwO3RoaXMuc3RhdHM9e3N0cmVhbVR5cGVzOk9iamVjdC5jcmVhdGUobnVsbCksZm9udFR5cGVzOk9iamVjdC5jcmVhdGUobnVsbCl9O3RoaXMuX25ld1JlZk51bT1udWxsfVhSZWYucHJvdG90eXBlPXtnZXROZXdSZWY6ZnVuY3Rpb24gWFJlZl9nZXROZXdSZWYoKXtudWxsPT09dGhpcy5fbmV3UmVmTnVtJiYodGhpcy5fbmV3UmVmTnVtPXRoaXMuZW50cmllcy5sZW5ndGgpO3JldHVybiBpLlJlZi5nZXQodGhpcy5fbmV3UmVmTnVtKyssMCl9LHJlc2V0TmV3UmVmOmZ1bmN0aW9uIFhSZWZfcmVzZXROZXdSZWYoKXt0aGlzLl9uZXdSZWZOdW09bnVsbH0sc2V0U3RhcnRYUmVmOmZ1bmN0aW9uIFhSZWZfc2V0U3RhcnRYUmVmKGUpe3RoaXMuc3RhcnRYUmVmUXVldWU9W2VdfSxwYXJzZTpmdW5jdGlvbiBYUmVmX3BhcnNlKGUpe3ZhciB0O2lmKGUpeygwLGEud2FybikoIkluZGV4aW5nIGFsbCBQREYgb2JqZWN0cyIpO3Q9dGhpcy5pbmRleE9iamVjdHMoKX1lbHNlIHQ9dGhpcy5yZWFkWFJlZigpO3QuYXNzaWduWHJlZih0aGlzKTt0aGlzLnRyYWlsZXI9dDtsZXQgcixuO3RyeXtyPXQuZ2V0KCJFbmNyeXB0Iil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiRW5jcnlwdCIgcmVmZXJlbmNlOiAiJHtlfSIuYCl9aWYoKDAsaS5pc0RpY3QpKHIpKXt2YXIgYz10LmdldCgiSUQiKSxsPWMmJmMubGVuZ3RoP2NbMF06IiI7ci5zdXBwcmVzc0VuY3J5cHRpb249ITA7dGhpcy5lbmNyeXB0PW5ldyBvLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkocixsLHRoaXMucGRmTWFuYWdlci5wYXNzd29yZCl9dHJ5e249dC5nZXQoIlJvb3QiKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEud2FybikoYFhSZWYucGFyc2UgLSBJbnZhbGlkICJSb290IiByZWZlcmVuY2U6ICIke2V9Ii5gKX1pZighKDAsaS5pc0RpY3QpKG4pfHwhbi5oYXMoIlBhZ2VzIikpe2lmKCFlKXRocm93IG5ldyBzLlhSZWZQYXJzZUV4Y2VwdGlvbjt0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCByb290IHJlZmVyZW5jZSIpfXRoaXMucm9vdD1ufSxwcm9jZXNzWFJlZlRhYmxlOmZ1bmN0aW9uIFhSZWZfcHJvY2Vzc1hSZWZUYWJsZShlKXsidGFibGVTdGF0ZSJpbiB0aGlzfHwodGhpcy50YWJsZVN0YXRlPXtlbnRyeU51bTowLHN0cmVhbVBvczplLmxleGVyLnN0cmVhbS5wb3MscGFyc2VyQnVmMTplLmJ1ZjEscGFyc2VyQnVmMjplLmJ1ZjJ9KTt2YXIgdD10aGlzLnJlYWRYUmVmVGFibGUoZSk7aWYoISgwLGkuaXNDbWQpKHQsInRyYWlsZXIiKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgZmluZCB0cmFpbGVyIGRpY3Rpb25hcnkiKTt2YXIgcj1lLmdldE9iaigpOyEoMCxpLmlzRGljdCkocikmJnIuZGljdCYmKHI9ci5kaWN0KTtpZighKDAsaS5pc0RpY3QpKHIpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBwYXJzZSB0cmFpbGVyIGRpY3Rpb25hcnkiKTtkZWxldGUgdGhpcy50YWJsZVN0YXRlO3JldHVybiByfSxyZWFkWFJlZlRhYmxlOmZ1bmN0aW9uIFhSZWZfcmVhZFhSZWZUYWJsZShlKXt2YXIgdCxyPWUubGV4ZXIuc3RyZWFtLG49dGhpcy50YWJsZVN0YXRlO3IucG9zPW4uc3RyZWFtUG9zO2UuYnVmMT1uLnBhcnNlckJ1ZjE7ZS5idWYyPW4ucGFyc2VyQnVmMjtmb3IoOzspe2lmKCEoImZpcnN0RW50cnlOdW0iaW4gbil8fCEoImVudHJ5Q291bnQiaW4gbikpe2lmKCgwLGkuaXNDbWQpKHQ9ZS5nZXRPYmooKSwidHJhaWxlciIpKWJyZWFrO24uZmlyc3RFbnRyeU51bT10O24uZW50cnlDb3VudD1lLmdldE9iaigpfXZhciBzPW4uZmlyc3RFbnRyeU51bSxvPW4uZW50cnlDb3VudDtpZighTnVtYmVyLmlzSW50ZWdlcihzKXx8IU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogd3JvbmcgdHlwZXMgaW4gc3Vic2VjdGlvbiBoZWFkZXIiKTtmb3IodmFyIGM9bi5lbnRyeU51bTtjPG87YysrKXtuLnN0cmVhbVBvcz1yLnBvcztuLmVudHJ5TnVtPWM7bi5wYXJzZXJCdWYxPWUuYnVmMTtuLnBhcnNlckJ1ZjI9ZS5idWYyO3ZhciBsPXt9O2wub2Zmc2V0PWUuZ2V0T2JqKCk7bC5nZW49ZS5nZXRPYmooKTt2YXIgaD1lLmdldE9iaigpO2lmKGggaW5zdGFuY2VvZiBpLkNtZClzd2l0Y2goaC5jbWQpe2Nhc2UiZiI6bC5mcmVlPSEwO2JyZWFrO2Nhc2UibiI6bC51bmNvbXByZXNzZWQ9ITB9aWYoIU51bWJlci5pc0ludGVnZXIobC5vZmZzZXQpfHwhTnVtYmVyLmlzSW50ZWdlcihsLmdlbil8fCFsLmZyZWUmJiFsLnVuY29tcHJlc3NlZCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcihgSW52YWxpZCBlbnRyeSBpbiBYUmVmIHN1YnNlY3Rpb246ICR7c30sICR7b31gKTswPT09YyYmbC5mcmVlJiYxPT09cyYmKHM9MCk7dGhpcy5lbnRyaWVzW2Mrc118fCh0aGlzLmVudHJpZXNbYytzXT1sKX1uLmVudHJ5TnVtPTA7bi5zdHJlYW1Qb3M9ci5wb3M7bi5wYXJzZXJCdWYxPWUuYnVmMTtuLnBhcnNlckJ1ZjI9ZS5idWYyO2RlbGV0ZSBuLmZpcnN0RW50cnlOdW07ZGVsZXRlIG4uZW50cnlDb3VudH1pZih0aGlzLmVudHJpZXNbMF0mJiF0aGlzLmVudHJpZXNbMF0uZnJlZSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiB1bmV4cGVjdGVkIGZpcnN0IG9iamVjdCIpO3JldHVybiB0fSxwcm9jZXNzWFJlZlN0cmVhbTpmdW5jdGlvbiBYUmVmX3Byb2Nlc3NYUmVmU3RyZWFtKGUpe2lmKCEoInN0cmVhbVN0YXRlImluIHRoaXMpKXt2YXIgdD1lLmRpY3Qscj10LmdldCgiVyIpLGE9dC5nZXQoIkluZGV4Iik7YXx8KGE9WzAsdC5nZXQoIlNpemUiKV0pO3RoaXMuc3RyZWFtU3RhdGU9e2VudHJ5UmFuZ2VzOmEsYnl0ZVdpZHRoczpyLGVudHJ5TnVtOjAsc3RyZWFtUG9zOmUucG9zfX10aGlzLnJlYWRYUmVmU3RyZWFtKGUpO2RlbGV0ZSB0aGlzLnN0cmVhbVN0YXRlO3JldHVybiBlLmRpY3R9LHJlYWRYUmVmU3RyZWFtOmZ1bmN0aW9uIFhSZWZfcmVhZFhSZWZTdHJlYW0oZSl7dmFyIHQscixpPXRoaXMuc3RyZWFtU3RhdGU7ZS5wb3M9aS5zdHJlYW1Qb3M7Zm9yKHZhciBuPWkuYnl0ZVdpZHRocyxzPW5bMF0sbz1uWzFdLGM9blsyXSxsPWkuZW50cnlSYW5nZXM7bC5sZW5ndGg+MDspe3ZhciBoPWxbMF0sdT1sWzFdO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGgpfHwhTnVtYmVyLmlzSW50ZWdlcih1KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogJHtofSwgJHt1fWApO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHMpfHwhTnVtYmVyLmlzSW50ZWdlcihvKXx8IU51bWJlci5pc0ludGVnZXIoYykpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAke2h9LCAke3V9YCk7Zm9yKHQ9aS5lbnRyeU51bTt0PHU7Kyt0KXtpLmVudHJ5TnVtPXQ7aS5zdHJlYW1Qb3M9ZS5wb3M7dmFyIGQ9MCxmPTAsZz0wO2ZvcihyPTA7cjxzOysrcilkPWQ8PDh8ZS5nZXRCeXRlKCk7MD09PXMmJihkPTEpO2ZvcihyPTA7cjxvOysrcilmPWY8PDh8ZS5nZXRCeXRlKCk7Zm9yKHI9MDtyPGM7KytyKWc9Zzw8OHxlLmdldEJ5dGUoKTt2YXIgbT17fTttLm9mZnNldD1mO20uZ2VuPWc7c3dpdGNoKGQpe2Nhc2UgMDptLmZyZWU9ITA7YnJlYWs7Y2FzZSAxOm0udW5jb21wcmVzc2VkPSEwO2JyZWFrO2Nhc2UgMjpicmVhaztkZWZhdWx0OnRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgZW50cnkgdHlwZTogIitkKX10aGlzLmVudHJpZXNbaCt0XXx8KHRoaXMuZW50cmllc1toK3RdPW0pfWkuZW50cnlOdW09MDtpLnN0cmVhbVBvcz1lLnBvcztsLnNwbGljZSgwLDIpfX0saW5kZXhPYmplY3RzOmZ1bmN0aW9uIFhSZWZfaW5kZXhPYmplY3RzKCl7ZnVuY3Rpb24gcmVhZFRva2VuKGUsdCl7Zm9yKHZhciByPSIiLGE9ZVt0XTsxMCE9PWEmJjEzIT09YSYmNjAhPT1hJiYhKCsrdD49ZS5sZW5ndGgpOyl7cis9U3RyaW5nLmZyb21DaGFyQ29kZShhKTthPWVbdF19cmV0dXJuIHJ9ZnVuY3Rpb24gc2tpcFVudGlsKGUsdCxyKXtmb3IodmFyIGE9ci5sZW5ndGgsaT1lLmxlbmd0aCxuPTA7dDxpOyl7Zm9yKHZhciBzPTA7czxhJiZlW3Qrc109PT1yW3NdOykrK3M7aWYocz49YSlicmVhazt0Kys7bisrfXJldHVybiBufXZhciBlPS9eKFxkKylccysoXGQrKVxzK29ialxiLztjb25zdCB0PS9cYmVuZG9ialtcYlxzXSQvLHI9L1xzKyhcZCtccytcZCtccytvYmpbXGJcczxdKSQvO3ZhciBvPW5ldyBVaW50OEFycmF5KFsxMTYsMTE0LDk3LDEwNSwxMDgsMTAxLDExNF0pLGM9bmV3IFVpbnQ4QXJyYXkoWzExNSwxMTYsOTcsMTE0LDExNiwxMjAsMTE0LDEwMSwxMDJdKTtjb25zdCBsPW5ldyBVaW50OEFycmF5KFsxMTEsOTgsMTA2XSk7dmFyIGg9bmV3IFVpbnQ4QXJyYXkoWzQ3LDg4LDgyLDEwMSwxMDJdKTt0aGlzLmVudHJpZXMubGVuZ3RoPTA7dmFyIHU9dGhpcy5zdHJlYW07dS5wb3M9MDtmb3IodmFyIGQsZixnPXUuZ2V0Qnl0ZXMoKSxtPXUuc3RhcnQscD1nLmxlbmd0aCxiPVtdLHk9W107bTxwOyl7dmFyIHY9Z1ttXTtpZig5IT09diYmMTAhPT12JiYxMyE9PXYmJjMyIT09dilpZigzNyE9PXYpe3ZhciB3LGs9cmVhZFRva2VuKGcsbSk7aWYoay5zdGFydHNXaXRoKCJ4cmVmIikmJig0PT09ay5sZW5ndGh8fC9ccy8udGVzdChrWzRdKSkpe20rPXNraXBVbnRpbChnLG0sbyk7Yi5wdXNoKG0pO20rPXNraXBVbnRpbChnLG0sYyl9ZWxzZSBpZih3PWUuZXhlYyhrKSl7Y29uc3QgZT0wfHdbMV0saT0wfHdbMl07dGhpcy5lbnRyaWVzW2VdJiZ0aGlzLmVudHJpZXNbZV0uZ2VuIT09aXx8KHRoaXMuZW50cmllc1tlXT17b2Zmc2V0Om0tdS5zdGFydCxnZW46aSx1bmNvbXByZXNzZWQ6ITB9KTtsZXQgbixzPW0ray5sZW5ndGg7Zm9yKDtzPGcubGVuZ3RoOyl7Y29uc3QgZT1zK3NraXBVbnRpbChnLHMsbCkrNDtuPWUtbTtjb25zdCBpPU1hdGgubWF4KGUtMjUscyksbz0oMCxhLmJ5dGVzVG9TdHJpbmcpKGcuc3ViYXJyYXkoaSxlKSk7aWYodC50ZXN0KG8pKWJyZWFrO3tjb25zdCBlPXIuZXhlYyhvKTtpZihlJiZlWzFdKXsoMCxhLndhcm4pKCdpbmRleE9iamVjdHM6IEZvdW5kIG5ldyAib2JqIiBpbnNpZGUgb2YgYW5vdGhlciAib2JqIiwgY2F1c2VkIGJ5IG1pc3NpbmcgImVuZG9iaiIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7bi09ZVsxXS5sZW5ndGg7YnJlYWt9fXM9ZX1jb25zdCBvPWcuc3ViYXJyYXkobSxtK24pO3ZhciBTPXNraXBVbnRpbChvLDAsaCk7aWYoUzxuJiZvW1MrNV08NjQpe3kucHVzaChtLXUuc3RhcnQpO3RoaXMueHJlZnN0bXNbbS11LnN0YXJ0XT0xfW0rPW59ZWxzZSBpZihrLnN0YXJ0c1dpdGgoInRyYWlsZXIiKSYmKDc9PT1rLmxlbmd0aHx8L1xzLy50ZXN0KGtbN10pKSl7Yi5wdXNoKG0pO20rPXNraXBVbnRpbChnLG0sYyl9ZWxzZSBtKz1rLmxlbmd0aCsxfWVsc2UgZG97aWYoKyttPj1wKWJyZWFrO3Y9Z1ttXX13aGlsZSgxMCE9PXYmJjEzIT09dik7ZWxzZSsrbX1mb3IoZD0wLGY9eS5sZW5ndGg7ZDxmOysrZCl7dGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKHlbZF0pO3RoaXMucmVhZFhSZWYoITApfWxldCBDO2ZvcihkPTAsZj1iLmxlbmd0aDtkPGY7KytkKXt1LnBvcz1iW2RdO2NvbnN0IGU9bmV3IG4uUGFyc2VyKHtsZXhlcjpuZXcgbi5MZXhlcih1KSx4cmVmOnRoaXMsYWxsb3dTdHJlYW1zOiEwLHJlY292ZXJ5TW9kZTohMH0pO3ZhciB4PWUuZ2V0T2JqKCk7aWYoISgwLGkuaXNDbWQpKHgsInRyYWlsZXIiKSljb250aW51ZTtjb25zdCB0PWUuZ2V0T2JqKCk7aWYoISgwLGkuaXNEaWN0KSh0KSljb250aW51ZTtsZXQgcjt0cnl7cj10LmdldCgiUm9vdCIpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7Y29udGludWV9aWYoKDAsaS5pc0RpY3QpKHIpJiZyLmhhcygiUGFnZXMiKSl7aWYodC5oYXMoIklEIikpcmV0dXJuIHQ7Qz10fX1pZihDKXJldHVybiBDO3Rocm93IG5ldyBhLkludmFsaWRQREZFeGNlcHRpb24oIkludmFsaWQgUERGIHN0cnVjdHVyZS4iKX0scmVhZFhSZWY6ZnVuY3Rpb24gWFJlZl9yZWFkWFJlZihlKXt2YXIgdD10aGlzLnN0cmVhbTtjb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCk7dHJ5e2Zvcig7dGhpcy5zdGFydFhSZWZRdWV1ZS5sZW5ndGg7KXt2YXIgbz10aGlzLnN0YXJ0WFJlZlF1ZXVlWzBdO2lmKHJbb10peygwLGEud2FybikoInJlYWRYUmVmIC0gc2tpcHBpbmcgWFJlZiB0YWJsZSBzaW5jZSBpdCB3YXMgYWxyZWFkeSBwYXJzZWQuIik7dGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpO2NvbnRpbnVlfXJbb109ITA7dC5wb3M9byt0LnN0YXJ0O2NvbnN0IGU9bmV3IG4uUGFyc2VyKHtsZXhlcjpuZXcgbi5MZXhlcih0KSx4cmVmOnRoaXMsYWxsb3dTdHJlYW1zOiEwfSk7dmFyIGMsbD1lLmdldE9iaigpO2lmKCgwLGkuaXNDbWQpKGwsInhyZWYiKSl7Yz10aGlzLnByb2Nlc3NYUmVmVGFibGUoZSk7dGhpcy50b3BEaWN0fHwodGhpcy50b3BEaWN0PWMpO2w9Yy5nZXQoIlhSZWZTdG0iKTtpZihOdW1iZXIuaXNJbnRlZ2VyKGwpKXt2YXIgaD1sO2lmKCEoaCBpbiB0aGlzLnhyZWZzdG1zKSl7dGhpcy54cmVmc3Rtc1toXT0xO3RoaXMuc3RhcnRYUmVmUXVldWUucHVzaChoKX19fWVsc2V7aWYoIU51bWJlci5pc0ludGVnZXIobCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBzdHJlYW0gaGVhZGVyIik7aWYoIU51bWJlci5pc0ludGVnZXIoZS5nZXRPYmooKSl8fCEoMCxpLmlzQ21kKShlLmdldE9iaigpLCJvYmoiKXx8ISgwLGkuaXNTdHJlYW0pKGw9ZS5nZXRPYmooKSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBzdHJlYW0iKTtjPXRoaXMucHJvY2Vzc1hSZWZTdHJlYW0obCk7dGhpcy50b3BEaWN0fHwodGhpcy50b3BEaWN0PWMpO2lmKCFjKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJGYWlsZWQgdG8gcmVhZCBYUmVmIHN0cmVhbSIpfWw9Yy5nZXQoIlByZXYiKTtOdW1iZXIuaXNJbnRlZ2VyKGwpP3RoaXMuc3RhcnRYUmVmUXVldWUucHVzaChsKTooMCxpLmlzUmVmKShsKSYmdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKGwubnVtKTt0aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCl9cmV0dXJuIHRoaXMudG9wRGljdH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEuaW5mbykoIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiK2UpfWlmKCFlKXRocm93IG5ldyBzLlhSZWZQYXJzZUV4Y2VwdGlvbn0sZ2V0RW50cnk6ZnVuY3Rpb24gWFJlZl9nZXRFbnRyeShlKXt2YXIgdD10aGlzLmVudHJpZXNbZV07cmV0dXJuIHQmJiF0LmZyZWUmJnQub2Zmc2V0P3Q6bnVsbH0sZmV0Y2hJZlJlZjpmdW5jdGlvbiBYUmVmX2ZldGNoSWZSZWYoZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIGkuUmVmP3RoaXMuZmV0Y2goZSx0KTplfSxmZXRjaDpmdW5jdGlvbiBYUmVmX2ZldGNoKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgaS5SZWYpKXRocm93IG5ldyBFcnJvcigicmVmIG9iamVjdCBpcyBub3QgYSByZWZlcmVuY2UiKTtjb25zdCByPWUubnVtLGE9dGhpcy5fY2FjaGVNYXAuZ2V0KHIpO2lmKHZvaWQgMCE9PWEpe2EgaW5zdGFuY2VvZiBpLkRpY3QmJiFhLm9iaklkJiYoYS5vYmpJZD1lLnRvU3RyaW5nKCkpO3JldHVybiBhfWxldCBuPXRoaXMuZ2V0RW50cnkocik7aWYobnVsbD09PW4pe3RoaXMuX2NhY2hlTWFwLnNldChyLG4pO3JldHVybiBufW49bi51bmNvbXByZXNzZWQ/dGhpcy5mZXRjaFVuY29tcHJlc3NlZChlLG4sdCk6dGhpcy5mZXRjaENvbXByZXNzZWQoZSxuLHQpOygwLGkuaXNEaWN0KShuKT9uLm9iaklkPWUudG9TdHJpbmcoKTooMCxpLmlzU3RyZWFtKShuKSYmKG4uZGljdC5vYmpJZD1lLnRvU3RyaW5nKCkpO3JldHVybiBufSxmZXRjaFVuY29tcHJlc3NlZChlLHQscj0hMSl7dmFyIGE9ZS5nZW4sbz1lLm51bTtpZih0LmdlbiE9PWEpdGhyb3cgbmV3IHMuWFJlZkVudHJ5RXhjZXB0aW9uKCJJbmNvbnNpc3RlbnQgZ2VuZXJhdGlvbiBpbiBYUmVmOiAiK2UpO3ZhciBjPXRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0odC5vZmZzZXQrdGhpcy5zdHJlYW0uc3RhcnQpO2NvbnN0IGw9bmV3IG4uUGFyc2VyKHtsZXhlcjpuZXcgbi5MZXhlcihjKSx4cmVmOnRoaXMsYWxsb3dTdHJlYW1zOiEwfSk7dmFyIGg9bC5nZXRPYmooKSx1PWwuZ2V0T2JqKCksZD1sLmdldE9iaigpO2lmKGghPT1vfHx1IT09YXx8IShkIGluc3RhbmNlb2YgaS5DbWQpKXRocm93IG5ldyBzLlhSZWZFbnRyeUV4Y2VwdGlvbigiQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICIrZSk7aWYoIm9iaiIhPT1kLmNtZCl7aWYoZC5jbWQuc3RhcnRzV2l0aCgib2JqIikpe289cGFyc2VJbnQoZC5jbWQuc3Vic3RyaW5nKDMpLDEwKTtpZighTnVtYmVyLmlzTmFOKG8pKXJldHVybiBvfXRocm93IG5ldyBzLlhSZWZFbnRyeUV4Y2VwdGlvbigiQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICIrZSl9dD10aGlzLmVuY3J5cHQmJiFyP2wuZ2V0T2JqKHRoaXMuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obyxhKSk6bC5nZXRPYmooKTsoMCxpLmlzU3RyZWFtKSh0KXx8dGhpcy5fY2FjaGVNYXAuc2V0KG8sdCk7cmV0dXJuIHR9LGZldGNoQ29tcHJlc3NlZChlLHQscj0hMSl7Y29uc3Qgbz10Lm9mZnNldCxjPXRoaXMuZmV0Y2goaS5SZWYuZ2V0KG8sMCkpO2lmKCEoMCxpLmlzU3RyZWFtKShjKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiYmFkIE9ialN0bSBzdHJlYW0iKTtjb25zdCBsPWMuZGljdC5nZXQoIkZpcnN0IiksaD1jLmRpY3QuZ2V0KCJOIik7aWYoIU51bWJlci5pc0ludGVnZXIobCl8fCFOdW1iZXIuaXNJbnRlZ2VyKGgpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZpcnN0IGFuZCBuIHBhcmFtZXRlcnMgZm9yIE9ialN0bSBzdHJlYW0iKTtjb25zdCB1PW5ldyBuLlBhcnNlcih7bGV4ZXI6bmV3IG4uTGV4ZXIoYykseHJlZjp0aGlzLGFsbG93U3RyZWFtczohMH0pLGQ9bmV3IEFycmF5KGgpO2ZvcihsZXQgZT0wO2U8aDsrK2Upe2NvbnN0IHQ9dS5nZXRPYmooKTtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiaW52YWxpZCBvYmplY3QgbnVtYmVyIGluIHRoZSBPYmpTdG0gc3RyZWFtOiAiK3QpO2NvbnN0IHI9dS5nZXRPYmooKTtpZighTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiaW52YWxpZCBvYmplY3Qgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtOiAiK3IpO2RbZV09dH1jb25zdCBmPW5ldyBBcnJheShoKTtmb3IobGV0IGU9MDtlPGg7KytlKXtjb25zdCB0PXUuZ2V0T2JqKCk7ZltlXT10O3UuYnVmMSBpbnN0YW5jZW9mIGkuQ21kJiYiZW5kb2JqIj09PXUuYnVmMS5jbWQmJnUuc2hpZnQoKTtpZigoMCxpLmlzU3RyZWFtKSh0KSljb250aW51ZTtjb25zdCByPWRbZV0sYT10aGlzLmVudHJpZXNbcl07YSYmYS5vZmZzZXQ9PT1vJiZhLmdlbj09PWUmJnRoaXMuX2NhY2hlTWFwLnNldChyLHQpfWlmKHZvaWQgMD09PSh0PWZbdC5nZW5dKSl0aHJvdyBuZXcgcy5YUmVmRW50cnlFeGNlcHRpb24oIkJhZCAoY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogIitlKTtyZXR1cm4gdH0sYXN5bmMgZmV0Y2hJZlJlZkFzeW5jKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBpLlJlZj90aGlzLmZldGNoQXN5bmMoZSx0KTplfSxhc3luYyBmZXRjaEFzeW5jKGUsdCl7dHJ5e3JldHVybiB0aGlzLmZldGNoKGUsdCl9Y2F0Y2gocil7aWYoIShyIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikpdGhyb3cgcjthd2FpdCB0aGlzLnBkZk1hbmFnZXIucmVxdWVzdFJhbmdlKHIuYmVnaW4sci5lbmQpO3JldHVybiB0aGlzLmZldGNoQXN5bmMoZSx0KX19LGdldENhdGFsb2dPYmo6ZnVuY3Rpb24gWFJlZl9nZXRDYXRhbG9nT2JqKCl7cmV0dXJuIHRoaXMucm9vdH19O3JldHVybiBYUmVmfSgpO3QuWFJlZj1oO2NsYXNzIE5hbWVPck51bWJlclRyZWV7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuY29uc3RydWN0b3I9PT1OYW1lT3JOdW1iZXJUcmVlJiYoMCxhLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgTmFtZU9yTnVtYmVyVHJlZS4iKTt0aGlzLnJvb3Q9ZTt0aGlzLnhyZWY9dDt0aGlzLl90eXBlPXJ9Z2V0QWxsKCl7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKCF0aGlzLnJvb3QpcmV0dXJuIGU7Y29uc3QgdD10aGlzLnhyZWYscj1uZXcgaS5SZWZTZXQ7ci5wdXQodGhpcy5yb290KTtjb25zdCBuPVt0aGlzLnJvb3RdO2Zvcig7bi5sZW5ndGg+MDspe2NvbnN0IHM9dC5mZXRjaElmUmVmKG4uc2hpZnQoKSk7aWYoISgwLGkuaXNEaWN0KShzKSljb250aW51ZTtpZihzLmhhcygiS2lkcyIpKXtjb25zdCBlPXMuZ2V0KCJLaWRzIik7Zm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWVbdF07aWYoci5oYXMoaSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoYER1cGxpY2F0ZSBlbnRyeSBpbiAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTtuLnB1c2goaSk7ci5wdXQoaSl9Y29udGludWV9Y29uc3Qgbz1zLmdldCh0aGlzLl90eXBlKTtpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgcj0wLGE9by5sZW5ndGg7cjxhO3IrPTIpZVt0LmZldGNoSWZSZWYob1tyXSldPXQuZmV0Y2hJZlJlZihvW3IrMV0pfXJldHVybiBlfWdldChlKXtpZighdGhpcy5yb290KXJldHVybiBudWxsO2NvbnN0IHQ9dGhpcy54cmVmO2xldCByPXQuZmV0Y2hJZlJlZih0aGlzLnJvb3QpLGk9MDtmb3IoO3IuaGFzKCJLaWRzIik7KXtpZigrK2k+MTApeygwLGEud2FybikoYFNlYXJjaCBkZXB0aCBsaW1pdCByZWFjaGVkIGZvciAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTtyZXR1cm4gbnVsbH1jb25zdCBuPXIuZ2V0KCJLaWRzIik7aWYoIUFycmF5LmlzQXJyYXkobikpcmV0dXJuIG51bGw7bGV0IHM9MCxvPW4ubGVuZ3RoLTE7Zm9yKDtzPD1vOyl7Y29uc3QgYT1zK28+PjEsaT10LmZldGNoSWZSZWYoblthXSkuZ2V0KCJMaW1pdHMiKTtpZihlPHQuZmV0Y2hJZlJlZihpWzBdKSlvPWEtMTtlbHNle2lmKCEoZT50LmZldGNoSWZSZWYoaVsxXSkpKXtyPXQuZmV0Y2hJZlJlZihuW2FdKTticmVha31zPWErMX19aWYocz5vKXJldHVybiBudWxsfWNvbnN0IG49ci5nZXQodGhpcy5fdHlwZSk7aWYoQXJyYXkuaXNBcnJheShuKSl7bGV0IHI9MCxpPW4ubGVuZ3RoLTI7Zm9yKDtyPD1pOyl7Y29uc3QgYT1yK2k+PjEscz1hKygxJmEpLG89dC5mZXRjaElmUmVmKG5bc10pO2lmKGU8bylpPXMtMjtlbHNle2lmKCEoZT5vKSlyZXR1cm4gdC5mZXRjaElmUmVmKG5bcysxXSk7cj1zKzJ9fSgwLGEuaW5mbykoYEZhbGxpbmcgYmFjayB0byBhbiBleGhhdXN0aXZlIHNlYXJjaCwgZm9yIGtleSAiJHtlfSIsIGluICIke3RoaXMuX3R5cGV9IiB0cmVlLmApO2ZvcihsZXQgcj0wLGk9bi5sZW5ndGg7cjxpO3IrPTIpe2lmKHQuZmV0Y2hJZlJlZihuW3JdKT09PWUpeygwLGEud2FybikoYFRoZSAiJHtlfSIga2V5IHdhcyBmb3VuZCBhdCBhbiBpbmNvcnJlY3QsIGkuZS4gb3V0LW9mLW9yZGVyLCBwb3NpdGlvbiBpbiAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTtyZXR1cm4gdC5mZXRjaElmUmVmKG5bcisxXSl9fX1yZXR1cm4gbnVsbH19Y2xhc3MgTmFtZVRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVle2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0LCJOYW1lcyIpfX1jbGFzcyBOdW1iZXJUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCwiTnVtcyIpfX12YXIgdT1mdW5jdGlvbiBGaWxlU3BlY0Nsb3N1cmUoKXtmdW5jdGlvbiBGaWxlU3BlYyhlLHQpe2lmKGUmJigwLGkuaXNEaWN0KShlKSl7dGhpcy54cmVmPXQ7dGhpcy5yb290PWU7ZS5oYXMoIkZTIikmJih0aGlzLmZzPWUuZ2V0KCJGUyIpKTt0aGlzLmRlc2NyaXB0aW9uPWUuaGFzKCJEZXNjIik/KDAsYS5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIkRlc2MiKSk6IiI7ZS5oYXMoIlJGIikmJigwLGEud2FybikoIlJlbGF0ZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpO3RoaXMuY29udGVudEF2YWlsYWJsZT0hMDtpZighZS5oYXMoIkVGIikpe3RoaXMuY29udGVudEF2YWlsYWJsZT0hMTsoMCxhLndhcm4pKCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpfX19ZnVuY3Rpb24gcGlja1BsYXRmb3JtSXRlbShlKXtyZXR1cm4gZS5oYXMoIlVGIik/ZS5nZXQoIlVGIik6ZS5oYXMoIkYiKT9lLmdldCgiRiIpOmUuaGFzKCJVbml4Iik/ZS5nZXQoIlVuaXgiKTplLmhhcygiTWFjIik/ZS5nZXQoIk1hYyIpOmUuaGFzKCJET1MiKT9lLmdldCgiRE9TIik6bnVsbH1GaWxlU3BlYy5wcm90b3R5cGU9e2dldCBmaWxlbmFtZSgpe2lmKCF0aGlzLl9maWxlbmFtZSYmdGhpcy5yb290KXt2YXIgZT1waWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdCl8fCJ1bm5hbWVkIjt0aGlzLl9maWxlbmFtZT0oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlKS5yZXBsYWNlKC9cXFxcL2csIlxcIikucmVwbGFjZSgvXFxcLy9nLCIvIikucmVwbGFjZSgvXFwvZywiLyIpfXJldHVybiB0aGlzLl9maWxlbmFtZX0sZ2V0IGNvbnRlbnQoKXtpZighdGhpcy5jb250ZW50QXZhaWxhYmxlKXJldHVybiBudWxsOyF0aGlzLmNvbnRlbnRSZWYmJnRoaXMucm9vdCYmKHRoaXMuY29udGVudFJlZj1waWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdC5nZXQoIkVGIikpKTt2YXIgZT1udWxsO2lmKHRoaXMuY29udGVudFJlZil7dmFyIHQ9dGhpcy54cmVmLmZldGNoSWZSZWYodGhpcy5jb250ZW50UmVmKTt0JiYoMCxpLmlzU3RyZWFtKSh0KT9lPXQuZ2V0Qnl0ZXMoKTooMCxhLndhcm4pKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gcG9pbnRzIHRvIG5vbi1leGlzdGluZy9pbnZhbGlkIGNvbnRlbnQiKX1lbHNlKDAsYS53YXJuKSgiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50Iik7cmV0dXJuIGV9LGdldCBzZXJpYWxpemFibGUoKXtyZXR1cm57ZmlsZW5hbWU6dGhpcy5maWxlbmFtZSxjb250ZW50OnRoaXMuY29udGVudH19fTtyZXR1cm4gRmlsZVNwZWN9KCk7dC5GaWxlU3BlYz11O2NvbnN0IGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhZGRDaGlsZHJlbihlLHQpe2lmKGUgaW5zdGFuY2VvZiBpLkRpY3QpZT1lLmdldFJhd1ZhbHVlcygpO2Vsc2UgaWYoKDAsaS5pc1N0cmVhbSkoZSkpZT1lLmRpY3QuZ2V0UmF3VmFsdWVzKCk7ZWxzZSBpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm47Zm9yKGNvbnN0IGEgb2YgZSkoKHI9YSlpbnN0YW5jZW9mIGkuUmVmfHxyIGluc3RhbmNlb2YgaS5EaWN0fHxBcnJheS5pc0FycmF5KHIpfHwoMCxpLmlzU3RyZWFtKShyKSkmJnQucHVzaChhKTt2YXIgcn1mdW5jdGlvbiBPYmplY3RMb2FkZXIoZSx0LHIpe3RoaXMuZGljdD1lO3RoaXMua2V5cz10O3RoaXMueHJlZj1yO3RoaXMucmVmU2V0PW51bGx9T2JqZWN0TG9hZGVyLnByb3RvdHlwZT17YXN5bmMgbG9hZCgpe2lmKCF0aGlzLnhyZWYuc3RyZWFtLmFsbENodW5rc0xvYWRlZHx8dGhpcy54cmVmLnN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSlyZXR1cm47Y29uc3R7a2V5czplLGRpY3Q6dH09dGhpczt0aGlzLnJlZlNldD1uZXcgaS5SZWZTZXQ7Y29uc3Qgcj1bXTtmb3IobGV0IGE9MCxpPWUubGVuZ3RoO2E8aTthKyspe2NvbnN0IGk9dC5nZXRSYXcoZVthXSk7dm9pZCAwIT09aSYmci5wdXNoKGkpfXJldHVybiB0aGlzLl93YWxrKHIpfSxhc3luYyBfd2FsayhlKXtjb25zdCB0PVtdLHI9W107Zm9yKDtlLmxlbmd0aDspe2xldCBhPWUucG9wKCk7aWYoYSBpbnN0YW5jZW9mIGkuUmVmKXtpZih0aGlzLnJlZlNldC5oYXMoYSkpY29udGludWU7dHJ5e3RoaXMucmVmU2V0LnB1dChhKTthPXRoaXMueHJlZi5mZXRjaChhKX1jYXRjaChlKXtpZighKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSl0aHJvdyBlO3QucHVzaChhKTtyLnB1c2goe2JlZ2luOmUuYmVnaW4sZW5kOmUuZW5kfSl9fWlmKGEmJmEuZ2V0QmFzZVN0cmVhbXMpe2NvbnN0IGU9YS5nZXRCYXNlU3RyZWFtcygpO2xldCBpPSExO2ZvcihsZXQgdD0wLGE9ZS5sZW5ndGg7dDxhO3QrKyl7Y29uc3QgYT1lW3RdO2lmKGEuYWxsQ2h1bmtzTG9hZGVkJiYhYS5hbGxDaHVua3NMb2FkZWQoKSl7aT0hMDtyLnB1c2goe2JlZ2luOmEuc3RhcnQsZW5kOmEuZW5kfSl9fWkmJnQucHVzaChhKX1hZGRDaGlsZHJlbihhLGUpfWlmKHIubGVuZ3RoKXthd2FpdCB0aGlzLnhyZWYuc3RyZWFtLm1hbmFnZXIucmVxdWVzdFJhbmdlcyhyKTtmb3IobGV0IGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspe2NvbnN0IHI9dFtlXTtyIGluc3RhbmNlb2YgaS5SZWYmJnRoaXMucmVmU2V0LnJlbW92ZShyKX1yZXR1cm4gdGhpcy5fd2Fsayh0KX10aGlzLnJlZlNldD1udWxsfX07cmV0dXJuIE9iamVjdExvYWRlcn0oKTt0Lk9iamVjdExvYWRlcj1kfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlBhcnNlcj10LkxpbmVhcml6YXRpb249dC5MZXhlcj12b2lkIDA7dmFyIGE9cigxMiksaT1yKDIpLG49cig1KSxzPXIoOCksbz1yKDEzKSxjPXIoMTUpLGw9cigxOCksaD1yKDIwKTtmdW5jdGlvbiBjb21wdXRlQWRsZXIzMihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCByPTEsYT0wO2ZvcihsZXQgaT0wO2k8dDsrK2kpe3IrPTI1NSZlW2ldO2ErPXJ9cmV0dXJuIGElNjU1MjE8PDE2fHIlNjU1MjF9Y2xhc3MgUGFyc2Vye2NvbnN0cnVjdG9yKHtsZXhlcjplLHhyZWY6dCxhbGxvd1N0cmVhbXM6cj0hMSxyZWNvdmVyeU1vZGU6YT0hMX0pe3RoaXMubGV4ZXI9ZTt0aGlzLnhyZWY9dDt0aGlzLmFsbG93U3RyZWFtcz1yO3RoaXMucmVjb3ZlcnlNb2RlPWE7dGhpcy5pbWFnZUNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5yZWZpbGwoKX1yZWZpbGwoKXt0aGlzLmJ1ZjE9dGhpcy5sZXhlci5nZXRPYmooKTt0aGlzLmJ1ZjI9dGhpcy5sZXhlci5nZXRPYmooKX1zaGlmdCgpe2lmKHRoaXMuYnVmMiBpbnN0YW5jZW9mIG4uQ21kJiYiSUQiPT09dGhpcy5idWYyLmNtZCl7dGhpcy5idWYxPXRoaXMuYnVmMjt0aGlzLmJ1ZjI9bnVsbH1lbHNle3RoaXMuYnVmMT10aGlzLmJ1ZjI7dGhpcy5idWYyPXRoaXMubGV4ZXIuZ2V0T2JqKCl9fXRyeVNoaWZ0KCl7dHJ5e3RoaXMuc2hpZnQoKTtyZXR1cm4hMH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlO3JldHVybiExfX1nZXRPYmooZT1udWxsKXtjb25zdCB0PXRoaXMuYnVmMTt0aGlzLnNoaWZ0KCk7aWYodCBpbnN0YW5jZW9mIG4uQ21kKXN3aXRjaCh0LmNtZCl7Y2FzZSJCSSI6cmV0dXJuIHRoaXMubWFrZUlubGluZUltYWdlKGUpO2Nhc2UiWyI6Y29uc3Qgcj1bXTtmb3IoOyEoMCxuLmlzQ21kKSh0aGlzLmJ1ZjEsIl0iKSYmISgwLG4uaXNFT0YpKHRoaXMuYnVmMSk7KXIucHVzaCh0aGlzLmdldE9iaihlKSk7aWYoKDAsbi5pc0VPRikodGhpcy5idWYxKSl7aWYoIXRoaXMucmVjb3ZlcnlNb2RlKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJFbmQgb2YgZmlsZSBpbnNpZGUgYXJyYXkiKTtyZXR1cm4gcn10aGlzLnNoaWZ0KCk7cmV0dXJuIHI7Y2FzZSI8PCI6Y29uc3QgYT1uZXcgbi5EaWN0KHRoaXMueHJlZik7Zm9yKDshKDAsbi5pc0NtZCkodGhpcy5idWYxLCI+PiIpJiYhKDAsbi5pc0VPRikodGhpcy5idWYxKTspe2lmKCEoMCxuLmlzTmFtZSkodGhpcy5idWYxKSl7KDAsaS5pbmZvKSgiTWFsZm9ybWVkIGRpY3Rpb25hcnk6IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTt0aGlzLnNoaWZ0KCk7Y29udGludWV9Y29uc3QgdD10aGlzLmJ1ZjEubmFtZTt0aGlzLnNoaWZ0KCk7aWYoKDAsbi5pc0VPRikodGhpcy5idWYxKSlicmVhazthLnNldCh0LHRoaXMuZ2V0T2JqKGUpKX1pZigoMCxuLmlzRU9GKSh0aGlzLmJ1ZjEpKXtpZighdGhpcy5yZWNvdmVyeU1vZGUpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkVuZCBvZiBmaWxlIGluc2lkZSBkaWN0aW9uYXJ5Iik7cmV0dXJuIGF9aWYoKDAsbi5pc0NtZCkodGhpcy5idWYyLCJzdHJlYW0iKSlyZXR1cm4gdGhpcy5hbGxvd1N0cmVhbXM/dGhpcy5tYWtlU3RyZWFtKGEsZSk6YTt0aGlzLnNoaWZ0KCk7cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdH1pZihOdW1iZXIuaXNJbnRlZ2VyKHQpKXtpZihOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuYnVmMSkmJigwLG4uaXNDbWQpKHRoaXMuYnVmMiwiUiIpKXtjb25zdCBlPW4uUmVmLmdldCh0LHRoaXMuYnVmMSk7dGhpcy5zaGlmdCgpO3RoaXMuc2hpZnQoKTtyZXR1cm4gZX1yZXR1cm4gdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJmU/ZS5kZWNyeXB0U3RyaW5nKHQpOnR9ZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoZSl7Y29uc3QgdD10aGlzLmxleGVyLHI9ZS5wb3M7bGV0IGEsbyxjPTA7Zm9yKDstMSE9PShhPWUuZ2V0Qnl0ZSgpKTspaWYoMD09PWMpYz02OT09PWE/MTowO2Vsc2UgaWYoMT09PWMpYz03Mz09PWE/MjowO2Vsc2V7KDAsaS5hc3NlcnQpKDI9PT1jLCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCAtIGludmFsaWQgc3RhdGUuIik7aWYoMzI9PT1hfHwxMD09PWF8fDEzPT09YSl7bz1lLnBvcztjb25zdCByPWUucGVla0J5dGVzKDEwKTtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspe2E9cltlXTtpZigoMCE9PWF8fDA9PT1yW2UrMV0pJiYoMTAhPT1hJiYxMyE9PWEmJihhPDMyfHxhPjEyNykpKXtjPTA7YnJlYWt9fWlmKDIhPT1jKWNvbnRpbnVlO2lmKHQua25vd25Db21tYW5kcyl7Y29uc3QgZT10LnBlZWtPYmooKTtlIGluc3RhbmNlb2Ygbi5DbWQmJiF0Lmtub3duQ29tbWFuZHNbZS5jbWRdJiYoYz0wKX1lbHNlKDAsaS53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQgLSBgbGV4ZXIua25vd25Db21tYW5kc2AgaXMgdW5kZWZpbmVkLiIpO2lmKDI9PT1jKWJyZWFrfWVsc2UgYz0wfWlmKC0xPT09YSl7KDAsaS53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6IFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgZmluZGluZyBhIHZhbGlkIEVJIG1hcmtlciIpO2lmKG8peygwLGkud2FybikoJy4uLiB0cnlpbmcgdG8gcmVjb3ZlciBieSB1c2luZyB0aGUgbGFzdCAiRUkiIG9jY3VycmVuY2UuJyk7ZS5za2lwKC0oZS5wb3MtbykpfX1sZXQgbD00O2Uuc2tpcCgtbCk7YT1lLnBlZWtCeXRlKCk7ZS5za2lwKGwpOygwLHMuaXNXaGl0ZVNwYWNlKShhKXx8bC0tO3JldHVybiBlLnBvcy1sLXJ9ZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChlKXtjb25zdCB0PWUucG9zO2xldCByLGEsbj0hMTtmb3IoOy0xIT09KHI9ZS5nZXRCeXRlKCkpOylpZigyNTU9PT1yKXtzd2l0Y2goZS5nZXRCeXRlKCkpe2Nhc2UgMDpicmVhaztjYXNlIDI1NTplLnNraXAoLTEpO2JyZWFrO2Nhc2UgMjE3Om49ITA7YnJlYWs7Y2FzZSAxOTI6Y2FzZSAxOTM6Y2FzZSAxOTQ6Y2FzZSAxOTU6Y2FzZSAxOTc6Y2FzZSAxOTg6Y2FzZSAxOTk6Y2FzZSAyMDE6Y2FzZSAyMDI6Y2FzZSAyMDM6Y2FzZSAyMDU6Y2FzZSAyMDY6Y2FzZSAyMDc6Y2FzZSAxOTY6Y2FzZSAyMDQ6Y2FzZSAyMTg6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAyMjI6Y2FzZSAyMjM6Y2FzZSAyMjQ6Y2FzZSAyMjU6Y2FzZSAyMjY6Y2FzZSAyMjc6Y2FzZSAyMjg6Y2FzZSAyMjk6Y2FzZSAyMzA6Y2FzZSAyMzE6Y2FzZSAyMzI6Y2FzZSAyMzM6Y2FzZSAyMzQ6Y2FzZSAyMzU6Y2FzZSAyMzY6Y2FzZSAyMzc6Y2FzZSAyMzg6Y2FzZSAyMzk6Y2FzZSAyNTQ6YT1lLmdldFVpbnQxNigpO2E+Mj9lLnNraXAoYS0yKTplLnNraXAoLTIpfWlmKG4pYnJlYWt9Y29uc3Qgcz1lLnBvcy10O2lmKC0xPT09cil7KDAsaS53YXJuKSgiSW5saW5lIERDVERlY29kZSBpbWFnZSBzdHJlYW06IEVPSSBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTtlLnNraXAoLXMpO3JldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKGUpfXRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKGUpO3JldHVybiBzfWZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKGUpe2NvbnN0IHQ9ZS5wb3M7bGV0IHI7Zm9yKDstMSE9PShyPWUuZ2V0Qnl0ZSgpKTspaWYoMTI2PT09cil7Y29uc3QgdD1lLnBvcztyPWUucGVla0J5dGUoKTtmb3IoOygwLHMuaXNXaGl0ZVNwYWNlKShyKTspe2Uuc2tpcCgpO3I9ZS5wZWVrQnl0ZSgpfWlmKDYyPT09cil7ZS5za2lwKCk7YnJlYWt9aWYoZS5wb3M+dCl7Y29uc3QgdD1lLnBlZWtCeXRlcygyKTtpZig2OT09PXRbMF0mJjczPT09dFsxXSlicmVha319Y29uc3QgYT1lLnBvcy10O2lmKC0xPT09cil7KDAsaS53YXJuKSgiSW5saW5lIEFTQ0lJODVEZWNvZGUgaW1hZ2Ugc3RyZWFtOiBFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7ZS5za2lwKC1hKTtyZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKX10aGlzLmlubGluZVN0cmVhbVNraXBFSShlKTtyZXR1cm4gYX1maW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQoZSl7Y29uc3QgdD1lLnBvcztsZXQgcjtmb3IoOy0xIT09KHI9ZS5nZXRCeXRlKCkpJiY2MiE9PXI7KTtjb25zdCBhPWUucG9zLXQ7aWYoLTE9PT1yKXsoMCxpLndhcm4pKCJJbmxpbmUgQVNDSUlIZXhEZWNvZGUgaW1hZ2Ugc3RyZWFtOiBFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7ZS5za2lwKC1hKTtyZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKX10aGlzLmlubGluZVN0cmVhbVNraXBFSShlKTtyZXR1cm4gYX1pbmxpbmVTdHJlYW1Ta2lwRUkoZSl7bGV0IHQscj0wO2Zvcig7LTEhPT0odD1lLmdldEJ5dGUoKSk7KWlmKDA9PT1yKXI9Njk9PT10PzE6MDtlbHNlIGlmKDE9PT1yKXI9NzM9PT10PzI6MDtlbHNlIGlmKDI9PT1yKWJyZWFrfW1ha2VJbmxpbmVJbWFnZShlKXtjb25zdCB0PXRoaXMubGV4ZXIscj10LnN0cmVhbSxhPW5ldyBuLkRpY3QodGhpcy54cmVmKTtsZXQgcztmb3IoOyEoMCxuLmlzQ21kKSh0aGlzLmJ1ZjEsIklEIikmJiEoMCxuLmlzRU9GKSh0aGlzLmJ1ZjEpOyl7aWYoISgwLG4uaXNOYW1lKSh0aGlzLmJ1ZjEpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJEaWN0aW9uYXJ5IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTtjb25zdCB0PXRoaXMuYnVmMS5uYW1lO3RoaXMuc2hpZnQoKTtpZigoMCxuLmlzRU9GKSh0aGlzLmJ1ZjEpKWJyZWFrO2Euc2V0KHQsdGhpcy5nZXRPYmooZSkpfS0xIT09dC5iZWdpbklubGluZUltYWdlUG9zJiYocz1yLnBvcy10LmJlZ2luSW5saW5lSW1hZ2VQb3MpO2NvbnN0IG89YS5nZXQoIkZpbHRlciIsIkYiKTtsZXQgYztpZigoMCxuLmlzTmFtZSkobykpYz1vLm5hbWU7ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pKXtjb25zdCBlPXRoaXMueHJlZi5mZXRjaElmUmVmKG9bMF0pOygwLG4uaXNOYW1lKShlKSYmKGM9ZS5uYW1lKX1jb25zdCBsPXIucG9zO2xldCBoO2g9IkRDVERlY29kZSI9PT1jfHwiRENUIj09PWM/dGhpcy5maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKHIpOiJBU0NJSTg1RGVjb2RlIj09PWN8fCJBODUiPT09Yz90aGlzLmZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKHIpOiJBU0NJSUhleERlY29kZSI9PT1jfHwiQUh4Ij09PWM/dGhpcy5maW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQocik6dGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChyKTtsZXQgdSxkPXIubWFrZVN1YlN0cmVhbShsLGgsYSk7aWYoaDwxZTMmJnM8NTU1Mil7Y29uc3QgZT1kLmdldEJ5dGVzKCk7ZC5yZXNldCgpO2NvbnN0IGE9ci5wb3M7ci5wb3M9dC5iZWdpbklubGluZUltYWdlUG9zO2NvbnN0IGk9ci5nZXRCeXRlcyhzKTtyLnBvcz1hO3U9Y29tcHV0ZUFkbGVyMzIoZSkrIl8iK2NvbXB1dGVBZGxlcjMyKGkpO2NvbnN0IG89dGhpcy5pbWFnZUNhY2hlW3VdO2lmKHZvaWQgMCE9PW8pe3RoaXMuYnVmMj1uLkNtZC5nZXQoIkVJIik7dGhpcy5zaGlmdCgpO28ucmVzZXQoKTtyZXR1cm4gb319ZSYmKGQ9ZS5jcmVhdGVTdHJlYW0oZCxoKSk7ZD10aGlzLmZpbHRlcihkLGEsaCk7ZC5kaWN0PWE7aWYodm9pZCAwIT09dSl7ZC5jYWNoZUtleT1gaW5saW5lXyR7aH1fJHt1fWA7dGhpcy5pbWFnZUNhY2hlW3VdPWR9dGhpcy5idWYyPW4uQ21kLmdldCgiRUkiKTt0aGlzLnNoaWZ0KCk7cmV0dXJuIGR9X2ZpbmRTdHJlYW1MZW5ndGgoZSx0KXtjb25zdHtzdHJlYW06cn09dGhpcy5sZXhlcjtyLnBvcz1lO2NvbnN0IGE9dC5sZW5ndGg7Zm9yKDtyLnBvczxyLmVuZDspe2NvbnN0IGk9ci5wZWVrQnl0ZXMoMjA0OCksbj1pLmxlbmd0aC1hO2lmKG48PTApYnJlYWs7bGV0IHM9MDtmb3IoO3M8bjspe2xldCBuPTA7Zm9yKDtuPGEmJmlbcytuXT09PXRbbl07KW4rKztpZihuPj1hKXtyLnBvcys9cztyZXR1cm4gci5wb3MtZX1zKyt9ci5wb3MrPW59cmV0dXJuLTF9bWFrZVN0cmVhbShlLHQpe2NvbnN0IHI9dGhpcy5sZXhlcjtsZXQgYT1yLnN0cmVhbTtyLnNraXBUb05leHRMaW5lKCk7Y29uc3Qgbz1hLnBvcy0xO2xldCBjPWUuZ2V0KCJMZW5ndGgiKTtpZighTnVtYmVyLmlzSW50ZWdlcihjKSl7KDAsaS5pbmZvKShgQmFkIGxlbmd0aCAiJHtjfSIgaW4gc3RyZWFtYCk7Yz0wfWEucG9zPW8rYztyLm5leHRDaGFyKCk7aWYodGhpcy50cnlTaGlmdCgpJiYoMCxuLmlzQ21kKSh0aGlzLmJ1ZjIsImVuZHN0cmVhbSIpKXRoaXMuc2hpZnQoKTtlbHNle2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoWzEwMSwxMTAsMTAwLDExNSwxMTYsMTE0LDEwMSw5NywxMDldKTtsZXQgdD10aGlzLl9maW5kU3RyZWFtTGVuZ3RoKG8sZSk7aWYodDwwKXtjb25zdCByPTE7Zm9yKGxldCBuPTE7bjw9cjtuKyspe2NvbnN0IHI9ZS5sZW5ndGgtbixjPWUuc2xpY2UoMCxyKSxsPXRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgobyxjKTtpZihsPj0wKXtjb25zdCBlPWEucGVla0J5dGVzKHIrMSlbcl07aWYoISgwLHMuaXNXaGl0ZVNwYWNlKShlKSlicmVhazsoMCxpLmluZm8pKGBGb3VuZCAiJHsoMCxpLmJ5dGVzVG9TdHJpbmcpKGMpfSIgd2hlbiBzZWFyY2hpbmcgZm9yIGVuZHN0cmVhbSBjb21tYW5kLmApO3Q9bDticmVha319aWYodDwwKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJNaXNzaW5nIGVuZHN0cmVhbSBjb21tYW5kLiIpfWM9dDtyLm5leHRDaGFyKCk7dGhpcy5zaGlmdCgpO3RoaXMuc2hpZnQoKX10aGlzLnNoaWZ0KCk7YT1hLm1ha2VTdWJTdHJlYW0obyxjLGUpO3QmJihhPXQuY3JlYXRlU3RyZWFtKGEsYykpO2E9dGhpcy5maWx0ZXIoYSxlLGMpO2EuZGljdD1lO3JldHVybiBhfWZpbHRlcihlLHQscil7bGV0IGE9dC5nZXQoIkZpbHRlciIsIkYiKSxzPXQuZ2V0KCJEZWNvZGVQYXJtcyIsIkRQIik7aWYoKDAsbi5pc05hbWUpKGEpKXtBcnJheS5pc0FycmF5KHMpJiYoMCxpLndhcm4pKCIvRGVjb2RlUGFybXMgc2hvdWxkIG5vdCBjb250YWluIGFuIEFycmF5LCB3aGVuIC9GaWx0ZXIgY29udGFpbnMgYSBOYW1lLiIpO3JldHVybiB0aGlzLm1ha2VGaWx0ZXIoZSxhLm5hbWUscixzKX1sZXQgbz1yO2lmKEFycmF5LmlzQXJyYXkoYSkpe2NvbnN0IHQ9YSxyPXM7Zm9yKGxldCBjPTAsbD10Lmxlbmd0aDtjPGw7KytjKXthPXRoaXMueHJlZi5mZXRjaElmUmVmKHRbY10pO2lmKCEoMCxuLmlzTmFtZSkoYSkpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoYEJhZCBmaWx0ZXIgbmFtZSAiJHthfSJgKTtzPW51bGw7QXJyYXkuaXNBcnJheShyKSYmYyBpbiByJiYocz10aGlzLnhyZWYuZmV0Y2hJZlJlZihyW2NdKSk7ZT10aGlzLm1ha2VGaWx0ZXIoZSxhLm5hbWUsbyxzKTtvPW51bGx9fXJldHVybiBlfW1ha2VGaWx0ZXIoZSx0LHIsbil7aWYoMD09PXIpeygwLGkud2FybikoYEVtcHR5ICIke3R9IiBzdHJlYW0uYCk7cmV0dXJuIG5ldyBhLk51bGxTdHJlYW19dHJ5e2NvbnN0IHM9dGhpcy54cmVmLnN0YXRzLnN0cmVhbVR5cGVzO2lmKCJGbGF0ZURlY29kZSI9PT10fHwiRmwiPT09dCl7c1tpLlN0cmVhbVR5cGUuRkxBVEVdPSEwO3JldHVybiBuP25ldyBhLlByZWRpY3RvclN0cmVhbShuZXcgYS5GbGF0ZVN0cmVhbShlLHIpLHIsbik6bmV3IGEuRmxhdGVTdHJlYW0oZSxyKX1pZigiTFpXRGVjb2RlIj09PXR8fCJMWlciPT09dCl7c1tpLlN0cmVhbVR5cGUuTFpXXT0hMDtsZXQgdD0xO2lmKG4pe24uaGFzKCJFYXJseUNoYW5nZSIpJiYodD1uLmdldCgiRWFybHlDaGFuZ2UiKSk7cmV0dXJuIG5ldyBhLlByZWRpY3RvclN0cmVhbShuZXcgYS5MWldTdHJlYW0oZSxyLHQpLHIsbil9cmV0dXJuIG5ldyBhLkxaV1N0cmVhbShlLHIsdCl9aWYoIkRDVERlY29kZSI9PT10fHwiRENUIj09PXQpe3NbaS5TdHJlYW1UeXBlLkRDVF09ITA7cmV0dXJuIG5ldyBsLkpwZWdTdHJlYW0oZSxyLGUuZGljdCxuKX1pZigiSlBYRGVjb2RlIj09PXR8fCJKUFgiPT09dCl7c1tpLlN0cmVhbVR5cGUuSlBYXT0hMDtyZXR1cm4gbmV3IGguSnB4U3RyZWFtKGUscixlLmRpY3Qsbil9aWYoIkFTQ0lJODVEZWNvZGUiPT09dHx8IkE4NSI9PT10KXtzW2kuU3RyZWFtVHlwZS5BODVdPSEwO3JldHVybiBuZXcgYS5Bc2NpaTg1U3RyZWFtKGUscil9aWYoIkFTQ0lJSGV4RGVjb2RlIj09PXR8fCJBSHgiPT09dCl7c1tpLlN0cmVhbVR5cGUuQUhYXT0hMDtyZXR1cm4gbmV3IGEuQXNjaWlIZXhTdHJlYW0oZSxyKX1pZigiQ0NJVFRGYXhEZWNvZGUiPT09dHx8IkNDRiI9PT10KXtzW2kuU3RyZWFtVHlwZS5DQ0ZdPSEwO3JldHVybiBuZXcgby5DQ0lUVEZheFN0cmVhbShlLHIsbil9aWYoIlJ1bkxlbmd0aERlY29kZSI9PT10fHwiUkwiPT09dCl7c1tpLlN0cmVhbVR5cGUuUkxYXT0hMDtyZXR1cm4gbmV3IGEuUnVuTGVuZ3RoU3RyZWFtKGUscil9aWYoIkpCSUcyRGVjb2RlIj09PXQpe3NbaS5TdHJlYW1UeXBlLkpCSUddPSEwO3JldHVybiBuZXcgYy5KYmlnMlN0cmVhbShlLHIsZS5kaWN0LG4pfSgwLGkud2FybikoYEZpbHRlciAiJHt0fSIgaXMgbm90IHN1cHBvcnRlZC5gKTtyZXR1cm4gZX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGkud2FybikoYEludmFsaWQgc3RyZWFtOiAiJHtlfSJgKTtyZXR1cm4gbmV3IGEuTnVsbFN0cmVhbX19fXQuUGFyc2VyPVBhcnNlcjtjb25zdCB1PVsxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDIsMCwwLDIsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTtmdW5jdGlvbiB0b0hleERpZ2l0KGUpe3JldHVybiBlPj00OCYmZTw9NTc/MTUmZTplPj02NSYmZTw9NzB8fGU+PTk3JiZlPD0xMDI/OSsoMTUmZSk6LTF9Y2xhc3MgTGV4ZXJ7Y29uc3RydWN0b3IoZSx0PW51bGwpe3RoaXMuc3RyZWFtPWU7dGhpcy5uZXh0Q2hhcigpO3RoaXMuc3RyQnVmPVtdO3RoaXMua25vd25Db21tYW5kcz10O3RoaXMuX2hleFN0cmluZ051bVdhcm49MDt0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3M9LTF9bmV4dENoYXIoKXtyZXR1cm4gdGhpcy5jdXJyZW50Q2hhcj10aGlzLnN0cmVhbS5nZXRCeXRlKCl9cGVla0NoYXIoKXtyZXR1cm4gdGhpcy5zdHJlYW0ucGVla0J5dGUoKX1nZXROdW1iZXIoKXtsZXQgZT10aGlzLmN1cnJlbnRDaGFyLHQ9ITEscj0wLGE9MDtpZig0NT09PWUpe2E9LTE7ZT10aGlzLm5leHRDaGFyKCk7NDU9PT1lJiYoZT10aGlzLm5leHRDaGFyKCkpfWVsc2UgaWYoNDM9PT1lKXthPTE7ZT10aGlzLm5leHRDaGFyKCl9aWYoMTA9PT1lfHwxMz09PWUpZG97ZT10aGlzLm5leHRDaGFyKCl9d2hpbGUoMTA9PT1lfHwxMz09PWUpO2lmKDQ2PT09ZSl7cj0xMDtlPXRoaXMubmV4dENoYXIoKX1pZihlPDQ4fHxlPjU3KXtpZigxMD09PXImJjA9PT1hJiYoKDAscy5pc1doaXRlU3BhY2UpKGUpfHwtMT09PWUpKXsoMCxpLndhcm4pKCJMZXhlci5nZXROdW1iZXIgLSB0cmVhdGluZyBhIHNpbmdsZSBkZWNpbWFsIHBvaW50IGFzIHplcm8uIik7cmV0dXJuIDB9dGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoYEludmFsaWQgbnVtYmVyOiAke1N0cmluZy5mcm9tQ2hhckNvZGUoZSl9IChjaGFyQ29kZSAke2V9KWApfWE9YXx8MTtsZXQgbj1lLTQ4LG89MCxjPTE7Zm9yKDsoZT10aGlzLm5leHRDaGFyKCkpPj0wOylpZihlPj00OCYmZTw9NTcpe2NvbnN0IGE9ZS00ODtpZih0KW89MTAqbythO2Vsc2V7MCE9PXImJihyKj0xMCk7bj0xMCpuK2F9fWVsc2UgaWYoNDY9PT1lKXtpZigwIT09cilicmVhaztyPTF9ZWxzZSBpZig0NT09PWUpKDAsaS53YXJuKSgiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlIik7ZWxzZXtpZig2OSE9PWUmJjEwMSE9PWUpYnJlYWs7ZT10aGlzLnBlZWtDaGFyKCk7aWYoNDM9PT1lfHw0NT09PWUpe2M9NDU9PT1lPy0xOjE7dGhpcy5uZXh0Q2hhcigpfWVsc2UgaWYoZTw0OHx8ZT41NylicmVhazt0PSEwfTAhPT1yJiYobi89cik7dCYmKG4qPTEwKiooYypvKSk7cmV0dXJuIGEqbn1nZXRTdHJpbmcoKXtsZXQgZT0xLHQ9ITE7Y29uc3Qgcj10aGlzLnN0ckJ1ZjtyLmxlbmd0aD0wO2xldCBhPXRoaXMubmV4dENoYXIoKTtmb3IoOzspe2xldCBuPSExO3N3aXRjaCgwfGEpe2Nhc2UtMTooMCxpLndhcm4pKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7dD0hMDticmVhaztjYXNlIDQwOisrZTtyLnB1c2goIigiKTticmVhaztjYXNlIDQxOmlmKDA9PS0tZSl7dGhpcy5uZXh0Q2hhcigpO3Q9ITB9ZWxzZSByLnB1c2goIikiKTticmVhaztjYXNlIDkyOmE9dGhpcy5uZXh0Q2hhcigpO3N3aXRjaChhKXtjYXNlLTE6KDAsaS53YXJuKSgiVW50ZXJtaW5hdGVkIHN0cmluZyIpO3Q9ITA7YnJlYWs7Y2FzZSAxMTA6ci5wdXNoKCJcbiIpO2JyZWFrO2Nhc2UgMTE0OnIucHVzaCgiXHIiKTticmVhaztjYXNlIDExNjpyLnB1c2goIlx0Iik7YnJlYWs7Y2FzZSA5ODpyLnB1c2goIlxiIik7YnJlYWs7Y2FzZSAxMDI6ci5wdXNoKCJcZiIpO2JyZWFrO2Nhc2UgOTI6Y2FzZSA0MDpjYXNlIDQxOnIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKTticmVhaztjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6bGV0IGU9MTUmYTthPXRoaXMubmV4dENoYXIoKTtuPSEwO2lmKGE+PTQ4JiZhPD01NSl7ZT0oZTw8MykrKDE1JmEpO2E9dGhpcy5uZXh0Q2hhcigpO2lmKGE+PTQ4JiZhPD01NSl7bj0hMTtlPShlPDwzKSsoMTUmYSl9fXIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTticmVhaztjYXNlIDEzOjEwPT09dGhpcy5wZWVrQ2hhcigpJiZ0aGlzLm5leHRDaGFyKCk7YnJlYWs7Y2FzZSAxMDpicmVhaztkZWZhdWx0OnIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKX1icmVhaztkZWZhdWx0OnIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKX1pZih0KWJyZWFrO258fChhPXRoaXMubmV4dENoYXIoKSl9cmV0dXJuIHIuam9pbigiIil9Z2V0TmFtZSgpe2xldCBlLHQ7Y29uc3Qgcj10aGlzLnN0ckJ1ZjtyLmxlbmd0aD0wO2Zvcig7KGU9dGhpcy5uZXh0Q2hhcigpKT49MCYmIXVbZV07KWlmKDM1PT09ZSl7ZT10aGlzLm5leHRDaGFyKCk7aWYodVtlXSl7KDAsaS53YXJuKSgiTGV4ZXJfZ2V0TmFtZTogTlVNQkVSIFNJR04gKCMpIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsIG51bWJlci4iKTtyLnB1c2goIiMiKTticmVha31jb25zdCBhPXRvSGV4RGlnaXQoZSk7aWYoLTEhPT1hKXt0PWU7ZT10aGlzLm5leHRDaGFyKCk7Y29uc3Qgbj10b0hleERpZ2l0KGUpO2lmKC0xPT09bil7KDAsaS53YXJuKShgTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSkgaW4gaGV4YWRlY2ltYWwgbnVtYmVyLmApO3IucHVzaCgiIyIsU3RyaW5nLmZyb21DaGFyQ29kZSh0KSk7aWYodVtlXSlicmVhaztyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7Y29udGludWV9ci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYTw8NHxuKSl9ZWxzZSByLnB1c2goIiMiLFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfWVsc2Ugci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpO3IubGVuZ3RoPjEyNyYmKDAsaS53YXJuKSgiTmFtZSB0b2tlbiBpcyBsb25nZXIgdGhhbiBhbGxvd2VkIGJ5IHRoZSBzcGVjOiAiK3IubGVuZ3RoKTtyZXR1cm4gbi5OYW1lLmdldChyLmpvaW4oIiIpKX1faGV4U3RyaW5nV2FybihlKXs1IT10aGlzLl9oZXhTdHJpbmdOdW1XYXJuKys/dGhpcy5faGV4U3RyaW5nTnVtV2Fybj41fHwoMCxpLndhcm4pKCJnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlcjogIitlKTooMCxpLndhcm4pKCJnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBhZGRpdGlvbmFsIGludmFsaWQgY2hhcmFjdGVycy4iKX1nZXRIZXhTdHJpbmcoKXtjb25zdCBlPXRoaXMuc3RyQnVmO2UubGVuZ3RoPTA7bGV0IHQscixhPXRoaXMuY3VycmVudENoYXIsbj0hMDt0aGlzLl9oZXhTdHJpbmdOdW1XYXJuPTA7Zm9yKDs7KXtpZihhPDApeygwLGkud2FybikoIlVudGVybWluYXRlZCBoZXggc3RyaW5nIik7YnJlYWt9aWYoNjI9PT1hKXt0aGlzLm5leHRDaGFyKCk7YnJlYWt9aWYoMSE9PXVbYV0pe2lmKG4pe3Q9dG9IZXhEaWdpdChhKTtpZigtMT09PXQpe3RoaXMuX2hleFN0cmluZ1dhcm4oYSk7YT10aGlzLm5leHRDaGFyKCk7Y29udGludWV9fWVsc2V7cj10b0hleERpZ2l0KGEpO2lmKC0xPT09cil7dGhpcy5faGV4U3RyaW5nV2FybihhKTthPXRoaXMubmV4dENoYXIoKTtjb250aW51ZX1lLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0PDw0fHIpKX1uPSFuO2E9dGhpcy5uZXh0Q2hhcigpfWVsc2UgYT10aGlzLm5leHRDaGFyKCl9cmV0dXJuIGUuam9pbigiIil9Z2V0T2JqKCl7bGV0IGU9ITEsdD10aGlzLmN1cnJlbnRDaGFyO2Zvcig7Oyl7aWYodDwwKXJldHVybiBuLkVPRjtpZihlKTEwIT09dCYmMTMhPT10fHwoZT0hMSk7ZWxzZSBpZigzNz09PXQpZT0hMDtlbHNlIGlmKDEhPT11W3RdKWJyZWFrO3Q9dGhpcy5uZXh0Q2hhcigpfXN3aXRjaCgwfHQpe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0MzpjYXNlIDQ1OmNhc2UgNDY6cmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCk7Y2FzZSA0MDpyZXR1cm4gdGhpcy5nZXRTdHJpbmcoKTtjYXNlIDQ3OnJldHVybiB0aGlzLmdldE5hbWUoKTtjYXNlIDkxOnRoaXMubmV4dENoYXIoKTtyZXR1cm4gbi5DbWQuZ2V0KCJbIik7Y2FzZSA5Mzp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIG4uQ21kLmdldCgiXSIpO2Nhc2UgNjA6dD10aGlzLm5leHRDaGFyKCk7aWYoNjA9PT10KXt0aGlzLm5leHRDaGFyKCk7cmV0dXJuIG4uQ21kLmdldCgiPDwiKX1yZXR1cm4gdGhpcy5nZXRIZXhTdHJpbmcoKTtjYXNlIDYyOnQ9dGhpcy5uZXh0Q2hhcigpO2lmKDYyPT09dCl7dGhpcy5uZXh0Q2hhcigpO3JldHVybiBuLkNtZC5nZXQoIj4+Iil9cmV0dXJuIG4uQ21kLmdldCgiPiIpO2Nhc2UgMTIzOnRoaXMubmV4dENoYXIoKTtyZXR1cm4gbi5DbWQuZ2V0KCJ7Iik7Y2FzZSAxMjU6dGhpcy5uZXh0Q2hhcigpO3JldHVybiBuLkNtZC5nZXQoIn0iKTtjYXNlIDQxOnRoaXMubmV4dENoYXIoKTt0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiSWxsZWdhbCBjaGFyYWN0ZXI6ICIrdCl9bGV0IHI9U3RyaW5nLmZyb21DaGFyQ29kZSh0KTtjb25zdCBhPXRoaXMua25vd25Db21tYW5kcztsZXQgcz1hJiZ2b2lkIDAhPT1hW3JdO2Zvcig7KHQ9dGhpcy5uZXh0Q2hhcigpKT49MCYmIXVbdF07KXtjb25zdCBlPXIrU3RyaW5nLmZyb21DaGFyQ29kZSh0KTtpZihzJiZ2b2lkIDA9PT1hW2VdKWJyZWFrO2lmKDEyOD09PXIubGVuZ3RoKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJDb21tYW5kIHRva2VuIHRvbyBsb25nOiAiK3IubGVuZ3RoKTtyPWU7cz1hJiZ2b2lkIDAhPT1hW3JdfWlmKCJ0cnVlIj09PXIpcmV0dXJuITA7aWYoImZhbHNlIj09PXIpcmV0dXJuITE7aWYoIm51bGwiPT09cilyZXR1cm4gbnVsbDsiQkkiPT09ciYmKHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcz10aGlzLnN0cmVhbS5wb3MpO3JldHVybiBuLkNtZC5nZXQocil9cGVla09iaigpe2NvbnN0IGU9dGhpcy5zdHJlYW0ucG9zLHQ9dGhpcy5jdXJyZW50Q2hhcixyPXRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcztsZXQgYTt0cnl7YT10aGlzLmdldE9iaigpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsaS53YXJuKSgicGVla09iajogIitlKX10aGlzLnN0cmVhbS5wb3M9ZTt0aGlzLmN1cnJlbnRDaGFyPXQ7dGhpcy5iZWdpbklubGluZUltYWdlUG9zPXI7cmV0dXJuIGF9c2tpcFRvTmV4dExpbmUoKXtsZXQgZT10aGlzLmN1cnJlbnRDaGFyO2Zvcig7ZT49MDspe2lmKDEzPT09ZSl7ZT10aGlzLm5leHRDaGFyKCk7MTA9PT1lJiZ0aGlzLm5leHRDaGFyKCk7YnJlYWt9aWYoMTA9PT1lKXt0aGlzLm5leHRDaGFyKCk7YnJlYWt9ZT10aGlzLm5leHRDaGFyKCl9fX10LkxleGVyPUxleGVyO3QuTGluZWFyaXphdGlvbj1jbGFzcyBMaW5lYXJpemF0aW9ue3N0YXRpYyBjcmVhdGUoZSl7ZnVuY3Rpb24gZ2V0SW50KGUsdCxyPSExKXtjb25zdCBhPWUuZ2V0KHQpO2lmKE51bWJlci5pc0ludGVnZXIoYSkmJihyP2E+PTA6YT4wKSlyZXR1cm4gYTt0aHJvdyBuZXcgRXJyb3IoYFRoZSAiJHt0fSIgcGFyYW1ldGVyIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC5gKX1jb25zdCB0PW5ldyBQYXJzZXIoe2xleGVyOm5ldyBMZXhlcihlKSx4cmVmOm51bGx9KSxyPXQuZ2V0T2JqKCksYT10LmdldE9iaigpLHM9dC5nZXRPYmooKSxvPXQuZ2V0T2JqKCk7bGV0IGMsbDtpZighKE51bWJlci5pc0ludGVnZXIocikmJk51bWJlci5pc0ludGVnZXIoYSkmJigwLG4uaXNDbWQpKHMsIm9iaiIpJiYoMCxuLmlzRGljdCkobykmJigwLGkuaXNOdW0pKGM9by5nZXQoIkxpbmVhcml6ZWQiKSkmJmM+MCkpcmV0dXJuIG51bGw7aWYoKGw9Z2V0SW50KG8sIkwiKSkhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoJ1RoZSAiTCIgcGFyYW1ldGVyIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgZG9lcyBub3QgZXF1YWwgdGhlIHN0cmVhbSBsZW5ndGguJyk7cmV0dXJue2xlbmd0aDpsLGhpbnRzOmZ1bmN0aW9uIGdldEhpbnRzKGUpe2NvbnN0IHQ9ZS5nZXQoIkgiKTtsZXQgcjtpZihBcnJheS5pc0FycmF5KHQpJiYoMj09PShyPXQubGVuZ3RoKXx8ND09PXIpKXtmb3IobGV0IGU9MDtlPHI7ZSsrKXtjb25zdCByPXRbZV07aWYoIShOdW1iZXIuaXNJbnRlZ2VyKHIpJiZyPjApKXRocm93IG5ldyBFcnJvcihgSGludCAoJHtlfSkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmApfXJldHVybiB0fXRocm93IG5ldyBFcnJvcigiSGludCBhcnJheSBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIil9KG8pLG9iamVjdE51bWJlckZpcnN0OmdldEludChvLCJPIiksZW5kRmlyc3Q6Z2V0SW50KG8sIkUiKSxudW1QYWdlczpnZXRJbnQobywiTiIpLG1haW5YUmVmRW50cmllc09mZnNldDpnZXRJbnQobywiVCIpLHBhZ2VGaXJzdDpvLmhhcygiUCIpP2dldEludChvLCJQIiwhMCk6MH19fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5MWldTdHJlYW09dC5TdHJpbmdTdHJlYW09dC5TdHJlYW1zU2VxdWVuY2VTdHJlYW09dC5TdHJlYW09dC5SdW5MZW5ndGhTdHJlYW09dC5QcmVkaWN0b3JTdHJlYW09dC5OdWxsU3RyZWFtPXQuRmxhdGVTdHJlYW09dC5EZWNvZGVTdHJlYW09dC5EZWNyeXB0U3RyZWFtPXQuQXNjaWlIZXhTdHJlYW09dC5Bc2NpaTg1U3RyZWFtPXZvaWQgMDt2YXIgYT1yKDIpLGk9cig1KSxuPXIoOCkscz1mdW5jdGlvbiBTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gU3RyZWFtKGUsdCxyLGEpe3RoaXMuYnl0ZXM9ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZTpuZXcgVWludDhBcnJheShlKTt0aGlzLnN0YXJ0PXR8fDA7dGhpcy5wb3M9dGhpcy5zdGFydDt0aGlzLmVuZD10K3J8fHRoaXMuYnl0ZXMubGVuZ3RoO3RoaXMuZGljdD1hfVN0cmVhbS5wcm90b3R5cGU9e2dldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbmQtdGhpcy5zdGFydH0sZ2V0IGlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMubGVuZ3RofSxnZXRCeXRlOmZ1bmN0aW9uIFN0cmVhbV9nZXRCeXRlKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLmVuZD8tMTp0aGlzLmJ5dGVzW3RoaXMucG9zKytdfSxnZXRVaW50MTY6ZnVuY3Rpb24gU3RyZWFtX2dldFVpbnQxNigpe3ZhciBlPXRoaXMuZ2V0Qnl0ZSgpLHQ9dGhpcy5nZXRCeXRlKCk7cmV0dXJuLTE9PT1lfHwtMT09PXQ/LTE6KGU8PDgpK3R9LGdldEludDMyOmZ1bmN0aW9uIFN0cmVhbV9nZXRJbnQzMigpe3JldHVybih0aGlzLmdldEJ5dGUoKTw8MjQpKyh0aGlzLmdldEJ5dGUoKTw8MTYpKyh0aGlzLmdldEJ5dGUoKTw8OCkrdGhpcy5nZXRCeXRlKCl9LGdldEJ5dGVzKGUsdD0hMSl7dmFyIHI9dGhpcy5ieXRlcyxhPXRoaXMucG9zLGk9dGhpcy5lbmQ7aWYoIWUpe2NvbnN0IGU9ci5zdWJhcnJheShhLGkpO3JldHVybiB0P25ldyBVaW50OENsYW1wZWRBcnJheShlKTplfXZhciBuPWErZTtuPmkmJihuPWkpO3RoaXMucG9zPW47Y29uc3Qgcz1yLnN1YmFycmF5KGEsbik7cmV0dXJuIHQ/bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHMpOnN9LHBlZWtCeXRlOmZ1bmN0aW9uIFN0cmVhbV9wZWVrQnl0ZSgpe3ZhciBlPXRoaXMuZ2V0Qnl0ZSgpOy0xIT09ZSYmdGhpcy5wb3MtLTtyZXR1cm4gZX0scGVla0J5dGVzKGUsdD0hMSl7dmFyIHI9dGhpcy5nZXRCeXRlcyhlLHQpO3RoaXMucG9zLT1yLmxlbmd0aDtyZXR1cm4gcn0sZ2V0Qnl0ZVJhbmdlKGUsdCl7ZTwwJiYoZT0wKTt0PnRoaXMuZW5kJiYodD10aGlzLmVuZCk7cmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoZSx0KX0sc2tpcDpmdW5jdGlvbiBTdHJlYW1fc2tpcChlKXtlfHwoZT0xKTt0aGlzLnBvcys9ZX0scmVzZXQ6ZnVuY3Rpb24gU3RyZWFtX3Jlc2V0KCl7dGhpcy5wb3M9dGhpcy5zdGFydH0sbW92ZVN0YXJ0OmZ1bmN0aW9uIFN0cmVhbV9tb3ZlU3RhcnQoKXt0aGlzLnN0YXJ0PXRoaXMucG9zfSxtYWtlU3ViU3RyZWFtOmZ1bmN0aW9uIFN0cmVhbV9tYWtlU3ViU3RyZWFtKGUsdCxyKXtyZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ5dGVzLmJ1ZmZlcixlLHQscil9fTtyZXR1cm4gU3RyZWFtfSgpO3QuU3RyZWFtPXM7dmFyIG89ZnVuY3Rpb24gU3RyaW5nU3RyZWFtQ2xvc3VyZSgpe2Z1bmN0aW9uIFN0cmluZ1N0cmVhbShlKXtjb25zdCB0PSgwLGEuc3RyaW5nVG9CeXRlcykoZSk7cy5jYWxsKHRoaXMsdCl9U3RyaW5nU3RyZWFtLnByb3RvdHlwZT1zLnByb3RvdHlwZTtyZXR1cm4gU3RyaW5nU3RyZWFtfSgpO3QuU3RyaW5nU3RyZWFtPW87dmFyIGM9ZnVuY3Rpb24gRGVjb2RlU3RyZWFtQ2xvc3VyZSgpe3ZhciBlPW5ldyBVaW50OEFycmF5KDApO2Z1bmN0aW9uIERlY29kZVN0cmVhbSh0KXt0aGlzLl9yYXdNaW5CdWZmZXJMZW5ndGg9dHx8MDt0aGlzLnBvcz0wO3RoaXMuYnVmZmVyTGVuZ3RoPTA7dGhpcy5lb2Y9ITE7dGhpcy5idWZmZXI9ZTt0aGlzLm1pbkJ1ZmZlckxlbmd0aD01MTI7aWYodClmb3IoO3RoaXMubWluQnVmZmVyTGVuZ3RoPHQ7KXRoaXMubWluQnVmZmVyTGVuZ3RoKj0yfURlY29kZVN0cmVhbS5wcm90b3R5cGU9e2dldCBpc0VtcHR5KCl7Zm9yKDshdGhpcy5lb2YmJjA9PT10aGlzLmJ1ZmZlckxlbmd0aDspdGhpcy5yZWFkQmxvY2soKTtyZXR1cm4gMD09PXRoaXMuYnVmZmVyTGVuZ3RofSxlbnN1cmVCdWZmZXI6ZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2Vuc3VyZUJ1ZmZlcihlKXt2YXIgdD10aGlzLmJ1ZmZlcjtpZihlPD10LmJ5dGVMZW5ndGgpcmV0dXJuIHQ7Zm9yKHZhciByPXRoaXMubWluQnVmZmVyTGVuZ3RoO3I8ZTspcio9Mjt2YXIgYT1uZXcgVWludDhBcnJheShyKTthLnNldCh0KTtyZXR1cm4gdGhpcy5idWZmZXI9YX0sZ2V0Qnl0ZTpmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0Qnl0ZSgpe2Zvcih2YXIgZT10aGlzLnBvczt0aGlzLmJ1ZmZlckxlbmd0aDw9ZTspe2lmKHRoaXMuZW9mKXJldHVybi0xO3RoaXMucmVhZEJsb2NrKCl9cmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdfSxnZXRVaW50MTY6ZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2dldFVpbnQxNigpe3ZhciBlPXRoaXMuZ2V0Qnl0ZSgpLHQ9dGhpcy5nZXRCeXRlKCk7cmV0dXJuLTE9PT1lfHwtMT09PXQ/LTE6KGU8PDgpK3R9LGdldEludDMyOmZ1bmN0aW9uIERlY29kZVN0cmVhbV9nZXRJbnQzMigpe3JldHVybih0aGlzLmdldEJ5dGUoKTw8MjQpKyh0aGlzLmdldEJ5dGUoKTw8MTYpKyh0aGlzLmdldEJ5dGUoKTw8OCkrdGhpcy5nZXRCeXRlKCl9LGdldEJ5dGVzKGUsdD0hMSl7dmFyIHIsYT10aGlzLnBvcztpZihlKXt0aGlzLmVuc3VyZUJ1ZmZlcihhK2UpO3I9YStlO2Zvcig7IXRoaXMuZW9mJiZ0aGlzLmJ1ZmZlckxlbmd0aDxyOyl0aGlzLnJlYWRCbG9jaygpO3ZhciBpPXRoaXMuYnVmZmVyTGVuZ3RoO3I+aSYmKHI9aSl9ZWxzZXtmb3IoOyF0aGlzLmVvZjspdGhpcy5yZWFkQmxvY2soKTtyPXRoaXMuYnVmZmVyTGVuZ3RofXRoaXMucG9zPXI7Y29uc3Qgbj10aGlzLmJ1ZmZlci5zdWJhcnJheShhLHIpO3JldHVybiF0fHxuIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/bjpuZXcgVWludDhDbGFtcGVkQXJyYXkobil9LHBlZWtCeXRlOmZ1bmN0aW9uIERlY29kZVN0cmVhbV9wZWVrQnl0ZSgpe3ZhciBlPXRoaXMuZ2V0Qnl0ZSgpOy0xIT09ZSYmdGhpcy5wb3MtLTtyZXR1cm4gZX0scGVla0J5dGVzKGUsdD0hMSl7dmFyIHI9dGhpcy5nZXRCeXRlcyhlLHQpO3RoaXMucG9zLT1yLmxlbmd0aDtyZXR1cm4gcn0sbWFrZVN1YlN0cmVhbTpmdW5jdGlvbiBEZWNvZGVTdHJlYW1fbWFrZVN1YlN0cmVhbShlLHQscil7Zm9yKHZhciBhPWUrdDt0aGlzLmJ1ZmZlckxlbmd0aDw9YSYmIXRoaXMuZW9mOyl0aGlzLnJlYWRCbG9jaygpO3JldHVybiBuZXcgcyh0aGlzLmJ1ZmZlcixlLHQscil9LGdldEJ5dGVSYW5nZShlLHQpeygwLGEudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgRGVjb2RlU3RyZWFtLmdldEJ5dGVSYW5nZSIpfSxza2lwOmZ1bmN0aW9uIERlY29kZVN0cmVhbV9za2lwKGUpe2V8fChlPTEpO3RoaXMucG9zKz1lfSxyZXNldDpmdW5jdGlvbiBEZWNvZGVTdHJlYW1fcmVzZXQoKXt0aGlzLnBvcz0wfSxnZXRCYXNlU3RyZWFtczpmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0QmFzZVN0cmVhbXMoKXtyZXR1cm4gdGhpcy5zdHImJnRoaXMuc3RyLmdldEJhc2VTdHJlYW1zP3RoaXMuc3RyLmdldEJhc2VTdHJlYW1zKCk6W119fTtyZXR1cm4gRGVjb2RlU3RyZWFtfSgpO3QuRGVjb2RlU3RyZWFtPWM7dmFyIGw9ZnVuY3Rpb24gU3RyZWFtc1NlcXVlbmNlU3RyZWFtQ2xvc3VyZSgpe2Z1bmN0aW9uIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbShlKXt0aGlzLnN0cmVhbXM9ZTtsZXQgdD0wO2ZvcihsZXQgcj0wLGE9ZS5sZW5ndGg7cjxhO3IrKyl7Y29uc3QgYT1lW3JdO3QrPWEgaW5zdGFuY2VvZiBjP2EuX3Jhd01pbkJ1ZmZlckxlbmd0aDphLmxlbmd0aH1jLmNhbGwodGhpcyx0KX1TdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpO1N0cmVhbXNTZXF1ZW5jZVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uIHN0cmVhbVNlcXVlbmNlU3RyZWFtUmVhZEJsb2NrKCl7dmFyIGU9dGhpcy5zdHJlYW1zO2lmKDAhPT1lLmxlbmd0aCl7dmFyIHQ9ZS5zaGlmdCgpLmdldEJ5dGVzKCkscj10aGlzLmJ1ZmZlckxlbmd0aCxhPXIrdC5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXIoYSkuc2V0KHQscik7dGhpcy5idWZmZXJMZW5ndGg9YX1lbHNlIHRoaXMuZW9mPSEwfTtTdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlLmdldEJhc2VTdHJlYW1zPWZ1bmN0aW9uIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbV9nZXRCYXNlU3RyZWFtcygpe2Zvcih2YXIgZT1bXSx0PTAscj10aGlzLnN0cmVhbXMubGVuZ3RoO3Q8cjt0Kyspe3ZhciBhPXRoaXMuc3RyZWFtc1t0XTthLmdldEJhc2VTdHJlYW1zJiZlLnB1c2goLi4uYS5nZXRCYXNlU3RyZWFtcygpKX1yZXR1cm4gZX07cmV0dXJuIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbX0oKTt0LlN0cmVhbXNTZXF1ZW5jZVN0cmVhbT1sO3ZhciBoPWZ1bmN0aW9uIEZsYXRlU3RyZWFtQ2xvc3VyZSgpe3ZhciBlPW5ldyBJbnQzMkFycmF5KFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSksdD1uZXcgSW50MzJBcnJheShbMyw0LDUsNiw3LDgsOSwxMCw2NTU0Nyw2NTU0OSw2NTU1MSw2NTU1MywxMzEwOTEsMTMxMDk1LDEzMTA5OSwxMzExMDMsMTk2NjQzLDE5NjY1MSwxOTY2NTksMTk2NjY3LDI2MjIxMSwyNjIyMjcsMjYyMjQzLDI2MjI1OSwzMjc4MTEsMzI3ODQzLDMyNzg3NSwzMjc5MDcsMjU4LDI1OCwyNThdKSxyPW5ldyBJbnQzMkFycmF5KFsxLDIsMyw0LDY1NTQxLDY1NTQzLDEzMTA4MSwxMzEwODUsMTk2NjI1LDE5NjYzMywyNjIxNzcsMjYyMTkzLDMyNzc0NSwzMjc3NzcsMzkzMzQ1LDM5MzQwOSw0NTkwMDksNDU5MTM3LDUyNDgwMSw1MjUwNTcsNTkwODQ5LDU5MTM2MSw2NTc0MDksNjU4NDMzLDcyNDk5Myw3MjcwNDEsNzk0NjI1LDc5ODcyMSw4NjgzNTMsODc2NTQ1XSksaT1bbmV3IEludDMyQXJyYXkoWzQ1OTAwOCw1MjQzNjgsNTI0MzA0LDUyNDU2OCw0NTkwMjQsNTI0NDAwLDUyNDMzNiw1OTAwMTYsNDU5MDE2LDUyNDM4NCw1MjQzMjAsNTg5OTg0LDUyNDI4OCw1MjQ0MTYsNTI0MzUyLDU5MDA0OCw0NTkwMTIsNTI0Mzc2LDUyNDMxMiw1ODk5NjgsNDU5MDI4LDUyNDQwOCw1MjQzNDQsNTkwMDMyLDQ1OTAyMCw1MjQzOTIsNTI0MzI4LDU5ZTQsNTI0Mjk2LDUyNDQyNCw1MjQzNjAsNTkwMDY0LDQ1OTAxMCw1MjQzNzIsNTI0MzA4LDUyNDU3Miw0NTkwMjYsNTI0NDA0LDUyNDM0MCw1OTAwMjQsNDU5MDE4LDUyNDM4OCw1MjQzMjQsNTg5OTkyLDUyNDI5Miw1MjQ0MjAsNTI0MzU2LDU5MDA1Niw0NTkwMTQsNTI0MzgwLDUyNDMxNiw1ODk5NzYsNDU5MDMwLDUyNDQxMiw1MjQzNDgsNTkwMDQwLDQ1OTAyMiw1MjQzOTYsNTI0MzMyLDU5MDAwOCw1MjQzMDAsNTI0NDI4LDUyNDM2NCw1OTAwNzIsNDU5MDA5LDUyNDM3MCw1MjQzMDYsNTI0NTcwLDQ1OTAyNSw1MjQ0MDIsNTI0MzM4LDU5MDAyMCw0NTkwMTcsNTI0Mzg2LDUyNDMyMiw1ODk5ODgsNTI0MjkwLDUyNDQxOCw1MjQzNTQsNTkwMDUyLDQ1OTAxMyw1MjQzNzgsNTI0MzE0LDU4OTk3Miw0NTkwMjksNTI0NDEwLDUyNDM0Niw1OTAwMzYsNDU5MDIxLDUyNDM5NCw1MjQzMzAsNTkwMDA0LDUyNDI5OCw1MjQ0MjYsNTI0MzYyLDU5MDA2OCw0NTkwMTEsNTI0Mzc0LDUyNDMxMCw1MjQ1NzQsNDU5MDI3LDUyNDQwNiw1MjQzNDIsNTkwMDI4LDQ1OTAxOSw1MjQzOTAsNTI0MzI2LDU4OTk5Niw1MjQyOTQsNTI0NDIyLDUyNDM1OCw1OTAwNjAsNDU5MDE1LDUyNDM4Miw1MjQzMTgsNTg5OTgwLDQ1OTAzMSw1MjQ0MTQsNTI0MzUwLDU5MDA0NCw0NTkwMjMsNTI0Mzk4LDUyNDMzNCw1OTAwMTIsNTI0MzAyLDUyNDQzMCw1MjQzNjYsNTkwMDc2LDQ1OTAwOCw1MjQzNjksNTI0MzA1LDUyNDU2OSw0NTkwMjQsNTI0NDAxLDUyNDMzNyw1OTAwMTgsNDU5MDE2LDUyNDM4NSw1MjQzMjEsNTg5OTg2LDUyNDI4OSw1MjQ0MTcsNTI0MzUzLDU5MDA1MCw0NTkwMTIsNTI0Mzc3LDUyNDMxMyw1ODk5NzAsNDU5MDI4LDUyNDQwOSw1MjQzNDUsNTkwMDM0LDQ1OTAyMCw1MjQzOTMsNTI0MzI5LDU5MDAwMiw1MjQyOTcsNTI0NDI1LDUyNDM2MSw1OTAwNjYsNDU5MDEwLDUyNDM3Myw1MjQzMDksNTI0NTczLDQ1OTAyNiw1MjQ0MDUsNTI0MzQxLDU5MDAyNiw0NTkwMTgsNTI0Mzg5LDUyNDMyNSw1ODk5OTQsNTI0MjkzLDUyNDQyMSw1MjQzNTcsNTkwMDU4LDQ1OTAxNCw1MjQzODEsNTI0MzE3LDU4OTk3OCw0NTkwMzAsNTI0NDEzLDUyNDM0OSw1OTAwNDIsNDU5MDIyLDUyNDM5Nyw1MjQzMzMsNTkwMDEwLDUyNDMwMSw1MjQ0MjksNTI0MzY1LDU5MDA3NCw0NTkwMDksNTI0MzcxLDUyNDMwNyw1MjQ1NzEsNDU5MDI1LDUyNDQwMyw1MjQzMzksNTkwMDIyLDQ1OTAxNyw1MjQzODcsNTI0MzIzLDU4OTk5MCw1MjQyOTEsNTI0NDE5LDUyNDM1NSw1OTAwNTQsNDU5MDEzLDUyNDM3OSw1MjQzMTUsNTg5OTc0LDQ1OTAyOSw1MjQ0MTEsNTI0MzQ3LDU5MDAzOCw0NTkwMjEsNTI0Mzk1LDUyNDMzMSw1OTAwMDYsNTI0Mjk5LDUyNDQyNyw1MjQzNjMsNTkwMDcwLDQ1OTAxMSw1MjQzNzUsNTI0MzExLDUyNDU3NSw0NTkwMjcsNTI0NDA3LDUyNDM0Myw1OTAwMzAsNDU5MDE5LDUyNDM5MSw1MjQzMjcsNTg5OTk4LDUyNDI5NSw1MjQ0MjMsNTI0MzU5LDU5MDA2Miw0NTkwMTUsNTI0MzgzLDUyNDMxOSw1ODk5ODIsNDU5MDMxLDUyNDQxNSw1MjQzNTEsNTkwMDQ2LDQ1OTAyMyw1MjQzOTksNTI0MzM1LDU5MDAxNCw1MjQzMDMsNTI0NDMxLDUyNDM2Nyw1OTAwNzgsNDU5MDA4LDUyNDM2OCw1MjQzMDQsNTI0NTY4LDQ1OTAyNCw1MjQ0MDAsNTI0MzM2LDU5MDAxNyw0NTkwMTYsNTI0Mzg0LDUyNDMyMCw1ODk5ODUsNTI0Mjg4LDUyNDQxNiw1MjQzNTIsNTkwMDQ5LDQ1OTAxMiw1MjQzNzYsNTI0MzEyLDU4OTk2OSw0NTkwMjgsNTI0NDA4LDUyNDM0NCw1OTAwMzMsNDU5MDIwLDUyNDM5Miw1MjQzMjgsNTkwMDAxLDUyNDI5Niw1MjQ0MjQsNTI0MzYwLDU5MDA2NSw0NTkwMTAsNTI0MzcyLDUyNDMwOCw1MjQ1NzIsNDU5MDI2LDUyNDQwNCw1MjQzNDAsNTkwMDI1LDQ1OTAxOCw1MjQzODgsNTI0MzI0LDU4OTk5Myw1MjQyOTIsNTI0NDIwLDUyNDM1Niw1OTAwNTcsNDU5MDE0LDUyNDM4MCw1MjQzMTYsNTg5OTc3LDQ1OTAzMCw1MjQ0MTIsNTI0MzQ4LDU5MDA0MSw0NTkwMjIsNTI0Mzk2LDUyNDMzMiw1OTAwMDksNTI0MzAwLDUyNDQyOCw1MjQzNjQsNTkwMDczLDQ1OTAwOSw1MjQzNzAsNTI0MzA2LDUyNDU3MCw0NTkwMjUsNTI0NDAyLDUyNDMzOCw1OTAwMjEsNDU5MDE3LDUyNDM4Niw1MjQzMjIsNTg5OTg5LDUyNDI5MCw1MjQ0MTgsNTI0MzU0LDU5MDA1Myw0NTkwMTMsNTI0Mzc4LDUyNDMxNCw1ODk5NzMsNDU5MDI5LDUyNDQxMCw1MjQzNDYsNTkwMDM3LDQ1OTAyMSw1MjQzOTQsNTI0MzMwLDU5MDAwNSw1MjQyOTgsNTI0NDI2LDUyNDM2Miw1OTAwNjksNDU5MDExLDUyNDM3NCw1MjQzMTAsNTI0NTc0LDQ1OTAyNyw1MjQ0MDYsNTI0MzQyLDU5MDAyOSw0NTkwMTksNTI0MzkwLDUyNDMyNiw1ODk5OTcsNTI0Mjk0LDUyNDQyMiw1MjQzNTgsNTkwMDYxLDQ1OTAxNSw1MjQzODIsNTI0MzE4LDU4OTk4MSw0NTkwMzEsNTI0NDE0LDUyNDM1MCw1OTAwNDUsNDU5MDIzLDUyNDM5OCw1MjQzMzQsNTkwMDEzLDUyNDMwMiw1MjQ0MzAsNTI0MzY2LDU5MDA3Nyw0NTkwMDgsNTI0MzY5LDUyNDMwNSw1MjQ1NjksNDU5MDI0LDUyNDQwMSw1MjQzMzcsNTkwMDE5LDQ1OTAxNiw1MjQzODUsNTI0MzIxLDU4OTk4Nyw1MjQyODksNTI0NDE3LDUyNDM1Myw1OTAwNTEsNDU5MDEyLDUyNDM3Nyw1MjQzMTMsNTg5OTcxLDQ1OTAyOCw1MjQ0MDksNTI0MzQ1LDU5MDAzNSw0NTkwMjAsNTI0MzkzLDUyNDMyOSw1OTAwMDMsNTI0Mjk3LDUyNDQyNSw1MjQzNjEsNTkwMDY3LDQ1OTAxMCw1MjQzNzMsNTI0MzA5LDUyNDU3Myw0NTkwMjYsNTI0NDA1LDUyNDM0MSw1OTAwMjcsNDU5MDE4LDUyNDM4OSw1MjQzMjUsNTg5OTk1LDUyNDI5Myw1MjQ0MjEsNTI0MzU3LDU5MDA1OSw0NTkwMTQsNTI0MzgxLDUyNDMxNyw1ODk5NzksNDU5MDMwLDUyNDQxMyw1MjQzNDksNTkwMDQzLDQ1OTAyMiw1MjQzOTcsNTI0MzMzLDU5MDAxMSw1MjQzMDEsNTI0NDI5LDUyNDM2NSw1OTAwNzUsNDU5MDA5LDUyNDM3MSw1MjQzMDcsNTI0NTcxLDQ1OTAyNSw1MjQ0MDMsNTI0MzM5LDU5MDAyMyw0NTkwMTcsNTI0Mzg3LDUyNDMyMyw1ODk5OTEsNTI0MjkxLDUyNDQxOSw1MjQzNTUsNTkwMDU1LDQ1OTAxMyw1MjQzNzksNTI0MzE1LDU4OTk3NSw0NTkwMjksNTI0NDExLDUyNDM0Nyw1OTAwMzksNDU5MDIxLDUyNDM5NSw1MjQzMzEsNTkwMDA3LDUyNDI5OSw1MjQ0MjcsNTI0MzYzLDU5MDA3MSw0NTkwMTEsNTI0Mzc1LDUyNDMxMSw1MjQ1NzUsNDU5MDI3LDUyNDQwNyw1MjQzNDMsNTkwMDMxLDQ1OTAxOSw1MjQzOTEsNTI0MzI3LDU4OTk5OSw1MjQyOTUsNTI0NDIzLDUyNDM1OSw1OTAwNjMsNDU5MDE1LDUyNDM4Myw1MjQzMTksNTg5OTgzLDQ1OTAzMSw1MjQ0MTUsNTI0MzUxLDU5MDA0Nyw0NTkwMjMsNTI0Mzk5LDUyNDMzNSw1OTAwMTUsNTI0MzAzLDUyNDQzMSw1MjQzNjcsNTkwMDc5XSksOV0sbj1bbmV3IEludDMyQXJyYXkoWzMyNzY4MCwzMjc2OTYsMzI3Njg4LDMyNzcwNCwzMjc2ODQsMzI3NzAwLDMyNzY5MiwzMjc3MDgsMzI3NjgyLDMyNzY5OCwzMjc2OTAsMzI3NzA2LDMyNzY4NiwzMjc3MDIsMzI3Njk0LDAsMzI3NjgxLDMyNzY5NywzMjc2ODksMzI3NzA1LDMyNzY4NSwzMjc3MDEsMzI3NjkzLDMyNzcwOSwzMjc2ODMsMzI3Njk5LDMyNzY5MSwzMjc3MDcsMzI3Njg3LDMyNzcwMywzMjc2OTUsMF0pLDVdO2Z1bmN0aW9uIEZsYXRlU3RyZWFtKGUsdCl7dGhpcy5zdHI9ZTt0aGlzLmRpY3Q9ZS5kaWN0O3ZhciByPWUuZ2V0Qnl0ZSgpLGk9ZS5nZXRCeXRlKCk7aWYoLTE9PT1yfHwtMT09PWkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoYEludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogJHtyfSwgJHtpfWApO2lmKDghPSgxNSZyKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcihgVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAke3J9LCAke2l9YCk7aWYoKChyPDw4KStpKSUzMSE9MCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcihgQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06ICR7cn0sICR7aX1gKTtpZigzMiZpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKGBGRElDVCBiaXQgc2V0IGluIGZsYXRlIHN0cmVhbTogJHtyfSwgJHtpfWApO3RoaXMuY29kZVNpemU9MDt0aGlzLmNvZGVCdWY9MDtjLmNhbGwodGhpcyx0KX1GbGF0ZVN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSk7RmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldEJpdHM9ZnVuY3Rpb24gRmxhdGVTdHJlYW1fZ2V0Qml0cyhlKXtmb3IodmFyIHQscj10aGlzLnN0cixpPXRoaXMuY29kZVNpemUsbj10aGlzLmNvZGVCdWY7aTxlOyl7aWYoLTE9PT0odD1yLmdldEJ5dGUoKSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTtufD10PDxpO2krPTh9dD1uJigxPDxlKS0xO3RoaXMuY29kZUJ1Zj1uPj5lO3RoaXMuY29kZVNpemU9aS09ZTtyZXR1cm4gdH07RmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldENvZGU9ZnVuY3Rpb24gRmxhdGVTdHJlYW1fZ2V0Q29kZShlKXtmb3IodmFyIHQscj10aGlzLnN0cixpPWVbMF0sbj1lWzFdLHM9dGhpcy5jb2RlU2l6ZSxvPXRoaXMuY29kZUJ1ZjtzPG4mJi0xIT09KHQ9ci5nZXRCeXRlKCkpOyl7b3w9dDw8cztzKz04fXZhciBjPWlbbyYoMTw8biktMV0sbD1jPj4xNixoPTY1NTM1JmM7aWYobDwxfHxzPGwpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTt0aGlzLmNvZGVCdWY9bz4+bDt0aGlzLmNvZGVTaXplPXMtbDtyZXR1cm4gaH07RmxhdGVTdHJlYW0ucHJvdG90eXBlLmdlbmVyYXRlSHVmZm1hblRhYmxlPWZ1bmN0aW9uIGZsYXRlU3RyZWFtR2VuZXJhdGVIdWZmbWFuVGFibGUoZSl7dmFyIHQscj1lLmxlbmd0aCxhPTA7Zm9yKHQ9MDt0PHI7Kyt0KWVbdF0+YSYmKGE9ZVt0XSk7Zm9yKHZhciBpPTE8PGEsbj1uZXcgSW50MzJBcnJheShpKSxzPTEsbz0wLGM9MjtzPD1hOysrcyxvPDw9MSxjPDw9MSlmb3IodmFyIGw9MDtsPHI7KytsKWlmKGVbbF09PT1zKXt2YXIgaD0wLHU9bztmb3IodD0wO3Q8czsrK3Qpe2g9aDw8MXwxJnU7dT4+PTF9Zm9yKHQ9aDt0PGk7dCs9YyluW3RdPXM8PDE2fGw7KytvfXJldHVybltuLGFdfTtGbGF0ZVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uIEZsYXRlU3RyZWFtX3JlYWRCbG9jaygpe3ZhciBzLG8sYz10aGlzLnN0cixsPXRoaXMuZ2V0Qml0cygzKTsxJmwmJih0aGlzLmVvZj0hMCk7aWYoMCE9PShsPj49MSkpe3ZhciBoLHU7aWYoMT09PWwpe2g9aTt1PW59ZWxzZXtpZigyIT09bCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5rbm93biBibG9jayB0eXBlIGluIGZsYXRlIHN0cmVhbSIpO3ZhciBkLGY9dGhpcy5nZXRCaXRzKDUpKzI1NyxnPXRoaXMuZ2V0Qml0cyg1KSsxLG09dGhpcy5nZXRCaXRzKDQpKzQscD1uZXcgVWludDhBcnJheShlLmxlbmd0aCk7Zm9yKGQ9MDtkPG07KytkKXBbZVtkXV09dGhpcy5nZXRCaXRzKDMpO3ZhciBiPXRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUocCk7bz0wO2Q9MDtmb3IodmFyIHksdix3LGs9ZitnLFM9bmV3IFVpbnQ4QXJyYXkoayk7ZDxrOyl7dmFyIEM9dGhpcy5nZXRDb2RlKGIpO2lmKDE2PT09Qyl7eT0yO3Y9Mzt3PW99ZWxzZSBpZigxNz09PUMpe3k9Mzt2PTM7dz1vPTB9ZWxzZXtpZigxOCE9PUMpe1NbZCsrXT1vPUM7Y29udGludWV9eT03O3Y9MTE7dz1vPTB9Zm9yKHZhciB4PXRoaXMuZ2V0Qml0cyh5KSt2O3gtLSA+MDspU1tkKytdPXd9aD10aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKFMuc3ViYXJyYXkoMCxmKSk7dT10aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKFMuc3ViYXJyYXkoZixrKSl9Zm9yKHZhciBBPShzPXRoaXMuYnVmZmVyKT9zLmxlbmd0aDowLFQ9dGhpcy5idWZmZXJMZW5ndGg7Oyl7dmFyIEk9dGhpcy5nZXRDb2RlKGgpO2lmKEk8MjU2KXtUKzE+PUEmJihBPShzPXRoaXMuZW5zdXJlQnVmZmVyKFQrMSkpLmxlbmd0aCk7c1tUKytdPUl9ZWxzZXtpZigyNTY9PT1JKXt0aGlzLmJ1ZmZlckxlbmd0aD1UO3JldHVybn12YXIgRj0oST10W0ktPTI1N10pPj4xNjtGPjAmJihGPXRoaXMuZ2V0Qml0cyhGKSk7bz0oNjU1MzUmSSkrRjtJPXRoaXMuZ2V0Q29kZSh1KTsoRj0oST1yW0ldKT4+MTYpPjAmJihGPXRoaXMuZ2V0Qml0cyhGKSk7dmFyIFA9KDY1NTM1JkkpK0Y7VCtvPj1BJiYoQT0ocz10aGlzLmVuc3VyZUJ1ZmZlcihUK28pKS5sZW5ndGgpO2Zvcih2YXIgRT0wO0U8bzsrK0UsKytUKXNbVF09c1tULVBdfX19ZWxzZXt2YXIgQjtpZigtMT09PShCPWMuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTt2YXIgTz1CO2lmKC0xPT09KEI9Yy5nZXRCeXRlKCkpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO098PUI8PDg7aWYoLTE9PT0oQj1jLmdldEJ5dGUoKSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7dmFyIE09QjtpZigtMT09PShCPWMuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTtpZigoTXw9Qjw8OCkhPT0oNjU1MzUmfk8pJiYoMCE9PU98fDAhPT1NKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIHVuY29tcHJlc3NlZCBibG9jayBsZW5ndGggaW4gZmxhdGUgc3RyZWFtIik7dGhpcy5jb2RlQnVmPTA7dGhpcy5jb2RlU2l6ZT0wO2NvbnN0IGU9dGhpcy5idWZmZXJMZW5ndGgsdD1lK087cz10aGlzLmVuc3VyZUJ1ZmZlcih0KTt0aGlzLmJ1ZmZlckxlbmd0aD10O2lmKDA9PT1PKS0xPT09Yy5wZWVrQnl0ZSgpJiYodGhpcy5lb2Y9ITApO2Vsc2V7Y29uc3QgdD1jLmdldEJ5dGVzKE8pO3Muc2V0KHQsZSk7dC5sZW5ndGg8TyYmKHRoaXMuZW9mPSEwKX19fTtyZXR1cm4gRmxhdGVTdHJlYW19KCk7dC5GbGF0ZVN0cmVhbT1oO3ZhciB1PWZ1bmN0aW9uIFByZWRpY3RvclN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBQcmVkaWN0b3JTdHJlYW0oZSx0LHIpe2lmKCEoMCxpLmlzRGljdCkocikpcmV0dXJuIGU7dmFyIG49dGhpcy5wcmVkaWN0b3I9ci5nZXQoIlByZWRpY3RvciIpfHwxO2lmKG48PTEpcmV0dXJuIGU7aWYoMiE9PW4mJihuPDEwfHxuPjE1KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAiK24pO3RoaXMucmVhZEJsb2NrPTI9PT1uP3RoaXMucmVhZEJsb2NrVGlmZjp0aGlzLnJlYWRCbG9ja1BuZzt0aGlzLnN0cj1lO3RoaXMuZGljdD1lLmRpY3Q7dmFyIHM9dGhpcy5jb2xvcnM9ci5nZXQoIkNvbG9ycyIpfHwxLG89dGhpcy5iaXRzPXIuZ2V0KCJCaXRzUGVyQ29tcG9uZW50Iil8fDgsbD10aGlzLmNvbHVtbnM9ci5nZXQoIkNvbHVtbnMiKXx8MTt0aGlzLnBpeEJ5dGVzPXMqbys3Pj4zO3RoaXMucm93Qnl0ZXM9bCpzKm8rNz4+MztjLmNhbGwodGhpcyx0KTtyZXR1cm4gdGhpc31QcmVkaWN0b3JTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpO1ByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrVGlmZj1mdW5jdGlvbiBwcmVkaWN0b3JTdHJlYW1SZWFkQmxvY2tUaWZmKCl7dmFyIGU9dGhpcy5yb3dCeXRlcyx0PXRoaXMuYnVmZmVyTGVuZ3RoLHI9dGhpcy5lbnN1cmVCdWZmZXIodCtlKSxhPXRoaXMuYml0cyxpPXRoaXMuY29sb3JzLG49dGhpcy5zdHIuZ2V0Qnl0ZXMoZSk7dGhpcy5lb2Y9IW4ubGVuZ3RoO2lmKCF0aGlzLmVvZil7dmFyIHMsbz0wLGM9MCxsPTAsaD0wLHU9dDtpZigxPT09YSYmMT09PWkpZm9yKHM9MDtzPGU7KytzKXt2YXIgZD1uW3NdXm87ZF49ZD4+MTtkXj1kPj4yO289KDEmKGRePWQ+PjQpKTw8NztyW3UrK109ZH1lbHNlIGlmKDg9PT1hKXtmb3Iocz0wO3M8aTsrK3Mpclt1KytdPW5bc107Zm9yKDtzPGU7KytzKXtyW3VdPXJbdS1pXStuW3NdO3UrK319ZWxzZSBpZigxNj09PWEpe3ZhciBmPTIqaTtmb3Iocz0wO3M8ZjsrK3Mpclt1KytdPW5bc107Zm9yKDtzPGU7cys9Mil7dmFyIGc9KCgyNTUmbltzXSk8PDgpKygyNTUmbltzKzFdKSsoKDI1NSZyW3UtZl0pPDw4KSsoMjU1JnJbdS1mKzFdKTtyW3UrK109Zz4+OCYyNTU7clt1KytdPTI1NSZnfX1lbHNle3ZhciBtPW5ldyBVaW50OEFycmF5KGkrMSkscD0oMTw8YSktMSxiPTAseT10LHY9dGhpcy5jb2x1bW5zO2ZvcihzPTA7czx2Oysrcylmb3IodmFyIHc9MDt3PGk7Kyt3KXtpZihsPGEpe289bzw8OHwyNTUmbltiKytdO2wrPTh9bVt3XT1tW3ddKyhvPj5sLWEpJnA7bC09YTtjPWM8PGF8bVt3XTtpZigoaCs9YSk+PTgpe3JbeSsrXT1jPj5oLTgmMjU1O2gtPTh9fWg+MCYmKHJbeSsrXT0oYzw8OC1oKSsobyYoMTw8OC1oKS0xKSl9dGhpcy5idWZmZXJMZW5ndGgrPWV9fTtQcmVkaWN0b3JTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9ja1BuZz1mdW5jdGlvbiBwcmVkaWN0b3JTdHJlYW1SZWFkQmxvY2tQbmcoKXt2YXIgZT10aGlzLnJvd0J5dGVzLHQ9dGhpcy5waXhCeXRlcyxyPXRoaXMuc3RyLmdldEJ5dGUoKSxpPXRoaXMuc3RyLmdldEJ5dGVzKGUpO3RoaXMuZW9mPSFpLmxlbmd0aDtpZighdGhpcy5lb2Ype3ZhciBuPXRoaXMuYnVmZmVyTGVuZ3RoLHM9dGhpcy5lbnN1cmVCdWZmZXIobitlKSxvPXMuc3ViYXJyYXkobi1lLG4pOzA9PT1vLmxlbmd0aCYmKG89bmV3IFVpbnQ4QXJyYXkoZSkpO3ZhciBjLGwsaCx1PW47c3dpdGNoKHIpe2Nhc2UgMDpmb3IoYz0wO2M8ZTsrK2Mpc1t1KytdPWlbY107YnJlYWs7Y2FzZSAxOmZvcihjPTA7Yzx0OysrYylzW3UrK109aVtjXTtmb3IoO2M8ZTsrK2Mpe3NbdV09c1t1LXRdK2lbY10mMjU1O3UrK31icmVhaztjYXNlIDI6Zm9yKGM9MDtjPGU7KytjKXNbdSsrXT1vW2NdK2lbY10mMjU1O2JyZWFrO2Nhc2UgMzpmb3IoYz0wO2M8dDsrK2Mpc1t1KytdPShvW2NdPj4xKStpW2NdO2Zvcig7YzxlOysrYyl7c1t1XT0ob1tjXStzW3UtdF0+PjEpK2lbY10mMjU1O3UrK31icmVhaztjYXNlIDQ6Zm9yKGM9MDtjPHQ7KytjKXtsPW9bY107aD1pW2NdO3NbdSsrXT1sK2h9Zm9yKDtjPGU7KytjKXtsPW9bY107dmFyIGQ9b1tjLXRdLGY9c1t1LXRdLGc9ZitsLWQsbT1nLWY7bTwwJiYobT0tbSk7dmFyIHA9Zy1sO3A8MCYmKHA9LXApO3ZhciBiPWctZDtiPDAmJihiPS1iKTtoPWlbY107c1t1KytdPW08PXAmJm08PWI/ZitoOnA8PWI/bCtoOmQraH1icmVhaztkZWZhdWx0OnRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICIrcil9dGhpcy5idWZmZXJMZW5ndGgrPWV9fTtyZXR1cm4gUHJlZGljdG9yU3RyZWFtfSgpO3QuUHJlZGljdG9yU3RyZWFtPXU7dmFyIGQ9ZnVuY3Rpb24gRGVjcnlwdFN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBEZWNyeXB0U3RyZWFtKGUsdCxyKXt0aGlzLnN0cj1lO3RoaXMuZGljdD1lLmRpY3Q7dGhpcy5kZWNyeXB0PXI7dGhpcy5uZXh0Q2h1bms9bnVsbDt0aGlzLmluaXRpYWxpemVkPSExO2MuY2FsbCh0aGlzLHQpfURlY3J5cHRTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpO0RlY3J5cHRTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbiBEZWNyeXB0U3RyZWFtX3JlYWRCbG9jaygpe3ZhciBlO2lmKHRoaXMuaW5pdGlhbGl6ZWQpZT10aGlzLm5leHRDaHVuaztlbHNle2U9dGhpcy5zdHIuZ2V0Qnl0ZXMoNTEyKTt0aGlzLmluaXRpYWxpemVkPSEwfWlmKGUmJjAhPT1lLmxlbmd0aCl7dGhpcy5uZXh0Q2h1bms9dGhpcy5zdHIuZ2V0Qnl0ZXMoNTEyKTt2YXIgdD10aGlzLm5leHRDaHVuayYmdGhpcy5uZXh0Q2h1bmsubGVuZ3RoPjA7ZT0oMCx0aGlzLmRlY3J5cHQpKGUsIXQpO3ZhciByLGE9dGhpcy5idWZmZXJMZW5ndGgsaT1lLmxlbmd0aCxuPXRoaXMuZW5zdXJlQnVmZmVyKGEraSk7Zm9yKHI9MDtyPGk7cisrKW5bYSsrXT1lW3JdO3RoaXMuYnVmZmVyTGVuZ3RoPWF9ZWxzZSB0aGlzLmVvZj0hMH07cmV0dXJuIERlY3J5cHRTdHJlYW19KCk7dC5EZWNyeXB0U3RyZWFtPWQ7dmFyIGY9ZnVuY3Rpb24gQXNjaWk4NVN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBBc2NpaTg1U3RyZWFtKGUsdCl7dGhpcy5zdHI9ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoNSk7dCYmKHQqPS44KTtjLmNhbGwodGhpcyx0KX1Bc2NpaTg1U3RyZWFtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKTtBc2NpaTg1U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2s9ZnVuY3Rpb24gQXNjaWk4NVN0cmVhbV9yZWFkQmxvY2soKXtmb3IodmFyIGU9dGhpcy5zdHIsdD1lLmdldEJ5dGUoKTsoMCxuLmlzV2hpdGVTcGFjZSkodCk7KXQ9ZS5nZXRCeXRlKCk7aWYoLTEhPT10JiYxMjYhPT10KXt2YXIgcixhLGk9dGhpcy5idWZmZXJMZW5ndGg7aWYoMTIyPT09dCl7cj10aGlzLmVuc3VyZUJ1ZmZlcihpKzQpO2ZvcihhPTA7YTw0OysrYSlyW2krYV09MDt0aGlzLmJ1ZmZlckxlbmd0aCs9NH1lbHNle3ZhciBzPXRoaXMuaW5wdXQ7c1swXT10O2ZvcihhPTE7YTw1OysrYSl7dD1lLmdldEJ5dGUoKTtmb3IoOygwLG4uaXNXaGl0ZVNwYWNlKSh0KTspdD1lLmdldEJ5dGUoKTtzW2FdPXQ7aWYoLTE9PT10fHwxMjY9PT10KWJyZWFrfXI9dGhpcy5lbnN1cmVCdWZmZXIoaSthLTEpO3RoaXMuYnVmZmVyTGVuZ3RoKz1hLTE7aWYoYTw1KXtmb3IoO2E8NTsrK2Epc1thXT0xMTc7dGhpcy5lb2Y9ITB9dmFyIG89MDtmb3IoYT0wO2E8NTsrK2Epbz04NSpvKyhzW2FdLTMzKTtmb3IoYT0zO2E+PTA7LS1hKXtyW2krYV09MjU1Jm87bz4+PTh9fX1lbHNlIHRoaXMuZW9mPSEwfTtyZXR1cm4gQXNjaWk4NVN0cmVhbX0oKTt0LkFzY2lpODVTdHJlYW09Zjt2YXIgZz1mdW5jdGlvbiBBc2NpaUhleFN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBBc2NpaUhleFN0cmVhbShlLHQpe3RoaXMuc3RyPWU7dGhpcy5kaWN0PWUuZGljdDt0aGlzLmZpcnN0RGlnaXQ9LTE7dCYmKHQqPS41KTtjLmNhbGwodGhpcyx0KX1Bc2NpaUhleFN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSk7QXNjaWlIZXhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbiBBc2NpaUhleFN0cmVhbV9yZWFkQmxvY2soKXt2YXIgZT10aGlzLnN0ci5nZXRCeXRlcyg4ZTMpO2lmKGUubGVuZ3RoKXtmb3IodmFyIHQ9ZS5sZW5ndGgrMT4+MSxyPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK3QpLGE9dGhpcy5idWZmZXJMZW5ndGgsaT10aGlzLmZpcnN0RGlnaXQsbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyl7dmFyIG8sYz1lW25dO2lmKGM+PTQ4JiZjPD01NylvPTE1JmM7ZWxzZXtpZighKGM+PTY1JiZjPD03MHx8Yz49OTcmJmM8PTEwMikpe2lmKDYyPT09Yyl7dGhpcy5lb2Y9ITA7YnJlYWt9Y29udGludWV9bz05KygxNSZjKX1pZihpPDApaT1vO2Vsc2V7clthKytdPWk8PDR8bztpPS0xfX1pZihpPj0wJiZ0aGlzLmVvZil7clthKytdPWk8PDQ7aT0tMX10aGlzLmZpcnN0RGlnaXQ9aTt0aGlzLmJ1ZmZlckxlbmd0aD1hfWVsc2UgdGhpcy5lb2Y9ITB9O3JldHVybiBBc2NpaUhleFN0cmVhbX0oKTt0LkFzY2lpSGV4U3RyZWFtPWc7dmFyIG09ZnVuY3Rpb24gUnVuTGVuZ3RoU3RyZWFtQ2xvc3VyZSgpe2Z1bmN0aW9uIFJ1bkxlbmd0aFN0cmVhbShlLHQpe3RoaXMuc3RyPWU7dGhpcy5kaWN0PWUuZGljdDtjLmNhbGwodGhpcyx0KX1SdW5MZW5ndGhTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpO1J1bkxlbmd0aFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uIFJ1bkxlbmd0aFN0cmVhbV9yZWFkQmxvY2soKXt2YXIgZT10aGlzLnN0ci5nZXRCeXRlcygyKTtpZighZXx8ZS5sZW5ndGg8Mnx8MTI4PT09ZVswXSl0aGlzLmVvZj0hMDtlbHNle3ZhciB0LHI9dGhpcy5idWZmZXJMZW5ndGgsYT1lWzBdO2lmKGE8MTI4KXsodD10aGlzLmVuc3VyZUJ1ZmZlcihyK2ErMSkpW3IrK109ZVsxXTtpZihhPjApe3ZhciBpPXRoaXMuc3RyLmdldEJ5dGVzKGEpO3Quc2V0KGkscik7cis9YX19ZWxzZXthPTI1Ny1hO3ZhciBuPWVbMV07dD10aGlzLmVuc3VyZUJ1ZmZlcihyK2ErMSk7Zm9yKHZhciBzPTA7czxhO3MrKyl0W3IrK109bn10aGlzLmJ1ZmZlckxlbmd0aD1yfX07cmV0dXJuIFJ1bkxlbmd0aFN0cmVhbX0oKTt0LlJ1bkxlbmd0aFN0cmVhbT1tO3ZhciBwPWZ1bmN0aW9uIExaV1N0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBMWldTdHJlYW0oZSx0LHIpe3RoaXMuc3RyPWU7dGhpcy5kaWN0PWUuZGljdDt0aGlzLmNhY2hlZERhdGE9MDt0aGlzLmJpdHNDYWNoZWQ9MDtmb3IodmFyIGE9e2Vhcmx5Q2hhbmdlOnIsY29kZUxlbmd0aDo5LG5leHRDb2RlOjI1OCxkaWN0aW9uYXJ5VmFsdWVzOm5ldyBVaW50OEFycmF5KDQwOTYpLGRpY3Rpb25hcnlMZW5ndGhzOm5ldyBVaW50MTZBcnJheSg0MDk2KSxkaWN0aW9uYXJ5UHJldkNvZGVzOm5ldyBVaW50MTZBcnJheSg0MDk2KSxjdXJyZW50U2VxdWVuY2U6bmV3IFVpbnQ4QXJyYXkoNDA5NiksY3VycmVudFNlcXVlbmNlTGVuZ3RoOjB9LGk9MDtpPDI1NjsrK2kpe2EuZGljdGlvbmFyeVZhbHVlc1tpXT1pO2EuZGljdGlvbmFyeUxlbmd0aHNbaV09MX10aGlzLmx6d1N0YXRlPWE7Yy5jYWxsKHRoaXMsdCl9TFpXU3RyZWFtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKTtMWldTdHJlYW0ucHJvdG90eXBlLnJlYWRCaXRzPWZ1bmN0aW9uIExaV1N0cmVhbV9yZWFkQml0cyhlKXtmb3IodmFyIHQ9dGhpcy5iaXRzQ2FjaGVkLHI9dGhpcy5jYWNoZWREYXRhO3Q8ZTspe3ZhciBhPXRoaXMuc3RyLmdldEJ5dGUoKTtpZigtMT09PWEpe3RoaXMuZW9mPSEwO3JldHVybiBudWxsfXI9cjw8OHxhO3QrPTh9dGhpcy5iaXRzQ2FjaGVkPXQtPWU7dGhpcy5jYWNoZWREYXRhPXI7dGhpcy5sYXN0Q29kZT1udWxsO3JldHVybiByPj4+dCYoMTw8ZSktMX07TFpXU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2s9ZnVuY3Rpb24gTFpXU3RyZWFtX3JlYWRCbG9jaygpe3ZhciBlLHQscixhPTEwMjQsaT10aGlzLmx6d1N0YXRlO2lmKGkpe3ZhciBuPWkuZWFybHlDaGFuZ2Uscz1pLm5leHRDb2RlLG89aS5kaWN0aW9uYXJ5VmFsdWVzLGM9aS5kaWN0aW9uYXJ5TGVuZ3RocyxsPWkuZGljdGlvbmFyeVByZXZDb2RlcyxoPWkuY29kZUxlbmd0aCx1PWkucHJldkNvZGUsZD1pLmN1cnJlbnRTZXF1ZW5jZSxmPWkuY3VycmVudFNlcXVlbmNlTGVuZ3RoLGc9MCxtPXRoaXMuYnVmZmVyTGVuZ3RoLHA9dGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGgrYSk7Zm9yKGU9MDtlPDUxMjtlKyspe3ZhciBiPXRoaXMucmVhZEJpdHMoaCkseT1mPjA7aWYoYjwyNTYpe2RbMF09YjtmPTF9ZWxzZXtpZighKGI+PTI1OCkpe2lmKDI1Nj09PWIpe2g9OTtzPTI1ODtmPTA7Y29udGludWV9dGhpcy5lb2Y9ITA7ZGVsZXRlIHRoaXMubHp3U3RhdGU7YnJlYWt9aWYoYjxzKWZvcih0PShmPWNbYl0pLTEscj1iO3Q+PTA7dC0tKXtkW3RdPW9bcl07cj1sW3JdfWVsc2UgZFtmKytdPWRbMF19aWYoeSl7bFtzXT11O2Nbc109Y1t1XSsxO29bc109ZFswXTtoPSsrcytuJnMrbi0xP2g6MHxNYXRoLm1pbihNYXRoLmxvZyhzK24pLy42OTMxNDcxODA1NTk5NDUzKzEsMTIpfXU9YjtpZihhPChnKz1mKSl7ZG97YSs9NTEyfXdoaWxlKGE8Zyk7cD10aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCthKX1mb3IodD0wO3Q8Zjt0KyspcFttKytdPWRbdF19aS5uZXh0Q29kZT1zO2kuY29kZUxlbmd0aD1oO2kucHJldkNvZGU9dTtpLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aD1mO3RoaXMuYnVmZmVyTGVuZ3RoPW19fTtyZXR1cm4gTFpXU3RyZWFtfSgpO3QuTFpXU3RyZWFtPXA7dmFyIGI9ZnVuY3Rpb24gTnVsbFN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBOdWxsU3RyZWFtKCl7cy5jYWxsKHRoaXMsbmV3IFVpbnQ4QXJyYXkoMCkpfU51bGxTdHJlYW0ucHJvdG90eXBlPXMucHJvdG90eXBlO3JldHVybiBOdWxsU3RyZWFtfSgpO3QuTnVsbFN0cmVhbT1ifSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkNDSVRURmF4U3RyZWFtPXZvaWQgMDt2YXIgYT1yKDUpLGk9cigxNCksbj1yKDEyKSxzPWZ1bmN0aW9uIENDSVRURmF4U3RyZWFtQ2xvc3VyZSgpe2Z1bmN0aW9uIENDSVRURmF4U3RyZWFtKGUsdCxyKXt0aGlzLnN0cj1lO3RoaXMuZGljdD1lLmRpY3Q7KDAsYS5pc0RpY3QpKHIpfHwocj1hLkRpY3QuZW1wdHkpO2NvbnN0IHM9e25leHQ6KCk9PmUuZ2V0Qnl0ZSgpfTt0aGlzLmNjaXR0RmF4RGVjb2Rlcj1uZXcgaS5DQ0lUVEZheERlY29kZXIocyx7SzpyLmdldCgiSyIpLEVuZE9mTGluZTpyLmdldCgiRW5kT2ZMaW5lIiksRW5jb2RlZEJ5dGVBbGlnbjpyLmdldCgiRW5jb2RlZEJ5dGVBbGlnbiIpLENvbHVtbnM6ci5nZXQoIkNvbHVtbnMiKSxSb3dzOnIuZ2V0KCJSb3dzIiksRW5kT2ZCbG9jazpyLmdldCgiRW5kT2ZCbG9jayIpLEJsYWNrSXMxOnIuZ2V0KCJCbGFja0lzMSIpfSk7bi5EZWNvZGVTdHJlYW0uY2FsbCh0aGlzLHQpfUNDSVRURmF4U3RyZWFtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4uRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7Q0NJVFRGYXhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbigpe2Zvcig7IXRoaXMuZW9mOyl7Y29uc3QgZT10aGlzLmNjaXR0RmF4RGVjb2Rlci5yZWFkTmV4dENoYXIoKTtpZigtMT09PWUpe3RoaXMuZW9mPSEwO3JldHVybn10aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCsxKTt0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lfX07cmV0dXJuIENDSVRURmF4U3RyZWFtfSgpO3QuQ0NJVFRGYXhTdHJlYW09c30sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5DQ0lUVEZheERlY29kZXI9dm9pZCAwO3ZhciBhPXIoMik7Y29uc3QgaT1mdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoKXtjb25zdCBlPVtbLTEsLTFdLFstMSwtMV0sWzcsOF0sWzcsN10sWzYsNl0sWzYsNl0sWzYsNV0sWzYsNV0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl1dLHQ9W1stMSwtMV0sWzEyLC0yXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTIsMTk4NF0sWzEyLDIwNDhdLFsxMiwyMTEyXSxbMTIsMjE3Nl0sWzEyLDIyNDBdLFsxMiwyMzA0XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzEyLDIzNjhdLFsxMiwyNDMyXSxbMTIsMjQ5Nl0sWzEyLDI1NjBdXSxyPVtbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFs4LDI5XSxbOCwyOV0sWzgsMzBdLFs4LDMwXSxbOCw0NV0sWzgsNDVdLFs4LDQ2XSxbOCw0Nl0sWzcsMjJdLFs3LDIyXSxbNywyMl0sWzcsMjJdLFs3LDIzXSxbNywyM10sWzcsMjNdLFs3LDIzXSxbOCw0N10sWzgsNDddLFs4LDQ4XSxbOCw0OF0sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNywyMF0sWzcsMjBdLFs3LDIwXSxbNywyMF0sWzgsMzNdLFs4LDMzXSxbOCwzNF0sWzgsMzRdLFs4LDM1XSxbOCwzNV0sWzgsMzZdLFs4LDM2XSxbOCwzN10sWzgsMzddLFs4LDM4XSxbOCwzOF0sWzcsMTldLFs3LDE5XSxbNywxOV0sWzcsMTldLFs4LDMxXSxbOCwzMV0sWzgsMzJdLFs4LDMyXSxbNiwxXSxbNiwxXSxbNiwxXSxbNiwxXSxbNiwxXSxbNiwxXSxbNiwxXSxbNiwxXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs4LDUzXSxbOCw1M10sWzgsNTRdLFs4LDU0XSxbNywyNl0sWzcsMjZdLFs3LDI2XSxbNywyNl0sWzgsMzldLFs4LDM5XSxbOCw0MF0sWzgsNDBdLFs4LDQxXSxbOCw0MV0sWzgsNDJdLFs4LDQyXSxbOCw0M10sWzgsNDNdLFs4LDQ0XSxbOCw0NF0sWzcsMjFdLFs3LDIxXSxbNywyMV0sWzcsMjFdLFs3LDI4XSxbNywyOF0sWzcsMjhdLFs3LDI4XSxbOCw2MV0sWzgsNjFdLFs4LDYyXSxbOCw2Ml0sWzgsNjNdLFs4LDYzXSxbOCwwXSxbOCwwXSxbOCwzMjBdLFs4LDMyMF0sWzgsMzg0XSxbOCwzODRdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzcsMjddLFs3LDI3XSxbNywyN10sWzcsMjddLFs4LDU5XSxbOCw1OV0sWzgsNjBdLFs4LDYwXSxbOSwxNDcyXSxbOSwxNTM2XSxbOSwxNjAwXSxbOSwxNzI4XSxbNywxOF0sWzcsMThdLFs3LDE4XSxbNywxOF0sWzcsMjRdLFs3LDI0XSxbNywyNF0sWzcsMjRdLFs4LDQ5XSxbOCw0OV0sWzgsNTBdLFs4LDUwXSxbOCw1MV0sWzgsNTFdLFs4LDUyXSxbOCw1Ml0sWzcsMjVdLFs3LDI1XSxbNywyNV0sWzcsMjVdLFs4LDU1XSxbOCw1NV0sWzgsNTZdLFs4LDU2XSxbOCw1N10sWzgsNTddLFs4LDU4XSxbOCw1OF0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE2NjRdLFs2LDE2NjRdLFs2LDE2NjRdLFs2LDE2NjRdLFs2LDE2NjRdLFs2LDE2NjRdLFs2LDE2NjRdLFs2LDE2NjRdLFs4LDQ0OF0sWzgsNDQ4XSxbOCw1MTJdLFs4LDUxMl0sWzksNzA0XSxbOSw3NjhdLFs4LDY0MF0sWzgsNjQwXSxbOCw1NzZdLFs4LDU3Nl0sWzksODMyXSxbOSw4OTZdLFs5LDk2MF0sWzksMTAyNF0sWzksMTA4OF0sWzksMTE1Ml0sWzksMTIxNl0sWzksMTI4MF0sWzksMTM0NF0sWzksMTQwOF0sWzcsMjU2XSxbNywyNTZdLFs3LDI1Nl0sWzcsMjU2XSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwyXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNCwzXSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDhdLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs1LDldLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw0XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddLFs0LDddXSxpPVtbLTEsLTFdLFstMSwtMV0sWzEyLC0yXSxbMTIsLTJdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzExLDE3OTJdLFsxMiwxOTg0XSxbMTIsMTk4NF0sWzEyLDIwNDhdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxMTJdLFsxMiwyMTc2XSxbMTIsMjE3Nl0sWzEyLDIyNDBdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzEyLDIzMDRdLFsxMSwxODU2XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzEyLDIzNjhdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0MzJdLFsxMiwyNDk2XSxbMTIsMjQ5Nl0sWzEyLDI1NjBdLFsxMiwyNTYwXSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEyLDUyXSxbMTIsNTJdLFsxMyw2NDBdLFsxMyw3MDRdLFsxMyw3NjhdLFsxMyw4MzJdLFsxMiw1NV0sWzEyLDU1XSxbMTIsNTZdLFsxMiw1Nl0sWzEzLDEyODBdLFsxMywxMzQ0XSxbMTMsMTQwOF0sWzEzLDE0NzJdLFsxMiw1OV0sWzEyLDU5XSxbMTIsNjBdLFsxMiw2MF0sWzEzLDE1MzZdLFsxMywxNjAwXSxbMTEsMjRdLFsxMSwyNF0sWzExLDI0XSxbMTEsMjRdLFsxMSwyNV0sWzExLDI1XSxbMTEsMjVdLFsxMSwyNV0sWzEzLDE2NjRdLFsxMywxNzI4XSxbMTIsMzIwXSxbMTIsMzIwXSxbMTIsMzg0XSxbMTIsMzg0XSxbMTIsNDQ4XSxbMTIsNDQ4XSxbMTMsNTEyXSxbMTMsNTc2XSxbMTIsNTNdLFsxMiw1M10sWzEyLDU0XSxbMTIsNTRdLFsxMyw4OTZdLFsxMyw5NjBdLFsxMywxMDI0XSxbMTMsMTA4OF0sWzEzLDExNTJdLFsxMywxMjE2XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF1dLG49W1s4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbMTEsMjNdLFsxMSwyM10sWzEyLDUwXSxbMTIsNTFdLFsxMiw0NF0sWzEyLDQ1XSxbMTIsNDZdLFsxMiw0N10sWzEyLDU3XSxbMTIsNThdLFsxMiw2MV0sWzEyLDI1Nl0sWzEwLDE2XSxbMTAsMTZdLFsxMCwxNl0sWzEwLDE2XSxbMTAsMTddLFsxMCwxN10sWzEwLDE3XSxbMTAsMTddLFsxMiw0OF0sWzEyLDQ5XSxbMTIsNjJdLFsxMiw2M10sWzEyLDMwXSxbMTIsMzFdLFsxMiwzMl0sWzEyLDMzXSxbMTIsNDBdLFsxMiw0MV0sWzExLDIyXSxbMTEsMjJdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbMTIsMTI4XSxbMTIsMTkyXSxbMTIsMjZdLFsxMiwyN10sWzEyLDI4XSxbMTIsMjldLFsxMSwxOV0sWzExLDE5XSxbMTEsMjBdLFsxMSwyMF0sWzEyLDM0XSxbMTIsMzVdLFsxMiwzNl0sWzEyLDM3XSxbMTIsMzhdLFsxMiwzOV0sWzExLDIxXSxbMTEsMjFdLFsxMiw0Ml0sWzEyLDQzXSxbMTAsMF0sWzEwLDBdLFsxMCwwXSxbMTAsMF0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXV0scz1bWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbNiw5XSxbNiw4XSxbNSw3XSxbNSw3XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw1XSxbNCw1XSxbNCw1XSxbNCw1XSxbMywxXSxbMywxXSxbMywxXSxbMywxXSxbMywxXSxbMywxXSxbMywxXSxbMywxXSxbMyw0XSxbMyw0XSxbMyw0XSxbMyw0XSxbMyw0XSxbMyw0XSxbMyw0XSxbMyw0XSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwzXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXSxbMiwyXV07ZnVuY3Rpb24gQ0NJVFRGYXhEZWNvZGVyKGUsdD17fSl7aWYoIWV8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLm5leHQpdGhyb3cgbmV3IEVycm9yKCdDQ0lUVEZheERlY29kZXIgLSBpbnZhbGlkICJzb3VyY2UiIHBhcmFtZXRlci4nKTt0aGlzLnNvdXJjZT1lO3RoaXMuZW9mPSExO3RoaXMuZW5jb2Rpbmc9dC5LfHwwO3RoaXMuZW9saW5lPXQuRW5kT2ZMaW5lfHwhMTt0aGlzLmJ5dGVBbGlnbj10LkVuY29kZWRCeXRlQWxpZ258fCExO3RoaXMuY29sdW1ucz10LkNvbHVtbnN8fDE3Mjg7dGhpcy5yb3dzPXQuUm93c3x8MDtsZXQgcixhPXQuRW5kT2ZCbG9jaztudWxsPT1hJiYoYT0hMCk7dGhpcy5lb2Jsb2NrPWE7dGhpcy5ibGFjaz10LkJsYWNrSXMxfHwhMTt0aGlzLmNvZGluZ0xpbmU9bmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucysxKTt0aGlzLnJlZkxpbmU9bmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucysyKTt0aGlzLmNvZGluZ0xpbmVbMF09dGhpcy5jb2x1bW5zO3RoaXMuY29kaW5nUG9zPTA7dGhpcy5yb3c9MDt0aGlzLm5leHRMaW5lMkQ9dGhpcy5lbmNvZGluZzwwO3RoaXMuaW5wdXRCaXRzPTA7dGhpcy5pbnB1dEJ1Zj0wO3RoaXMub3V0cHV0Qml0cz0wO3RoaXMucm93c0RvbmU9ITE7Zm9yKDswPT09KHI9dGhpcy5fbG9va0JpdHMoMTIpKTspdGhpcy5fZWF0Qml0cygxKTsxPT09ciYmdGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLm5leHRMaW5lMkQ9IXRoaXMuX2xvb2tCaXRzKDEpO3RoaXMuX2VhdEJpdHMoMSl9fUNDSVRURmF4RGVjb2Rlci5wcm90b3R5cGU9e3JlYWROZXh0Q2hhcigpe2lmKHRoaXMuZW9mKXJldHVybi0xO2NvbnN0IGU9dGhpcy5yZWZMaW5lLHQ9dGhpcy5jb2RpbmdMaW5lLHI9dGhpcy5jb2x1bW5zO2xldCBpLG4scyxvLGM7aWYoMD09PXRoaXMub3V0cHV0Qml0cyl7dGhpcy5yb3dzRG9uZSYmKHRoaXMuZW9mPSEwKTtpZih0aGlzLmVvZilyZXR1cm4tMTt0aGlzLmVycj0hMTtsZXQgcyxjLGw7aWYodGhpcy5uZXh0TGluZTJEKXtmb3Iobz0wO3Rbb108cjsrK28pZVtvXT10W29dO2VbbysrXT1yO2Vbb109cjt0WzBdPTA7dGhpcy5jb2RpbmdQb3M9MDtpPTA7bj0wO2Zvcig7dFt0aGlzLmNvZGluZ1Bvc108cjspe3M9dGhpcy5fZ2V0VHdvRGltQ29kZSgpO3N3aXRjaChzKXtjYXNlIDA6dGhpcy5fYWRkUGl4ZWxzKGVbaSsxXSxuKTtlW2krMV08ciYmKGkrPTIpO2JyZWFrO2Nhc2UgMTpzPWM9MDtpZihuKXtkb3tzKz1sPXRoaXMuX2dldEJsYWNrQ29kZSgpfXdoaWxlKGw+PTY0KTtkb3tjKz1sPXRoaXMuX2dldFdoaXRlQ29kZSgpfXdoaWxlKGw+PTY0KX1lbHNle2Rve3MrPWw9dGhpcy5fZ2V0V2hpdGVDb2RlKCl9d2hpbGUobD49NjQpO2Rve2MrPWw9dGhpcy5fZ2V0QmxhY2tDb2RlKCl9d2hpbGUobD49NjQpfXRoaXMuX2FkZFBpeGVscyh0W3RoaXMuY29kaW5nUG9zXStzLG4pO3RbdGhpcy5jb2RpbmdQb3NdPHImJnRoaXMuX2FkZFBpeGVscyh0W3RoaXMuY29kaW5nUG9zXStjLDFebik7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yO2JyZWFrO2Nhc2UgNzp0aGlzLl9hZGRQaXhlbHMoZVtpXSszLG4pO25ePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108cil7KytpO2Zvcig7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9Mn1icmVhaztjYXNlIDU6dGhpcy5fYWRkUGl4ZWxzKGVbaV0rMixuKTtuXj0xO2lmKHRbdGhpcy5jb2RpbmdQb3NdPHIpeysraTtmb3IoO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTJ9YnJlYWs7Y2FzZSAzOnRoaXMuX2FkZFBpeGVscyhlW2ldKzEsbik7bl49MTtpZih0W3RoaXMuY29kaW5nUG9zXTxyKXsrK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yfWJyZWFrO2Nhc2UgMjp0aGlzLl9hZGRQaXhlbHMoZVtpXSxuKTtuXj0xO2lmKHRbdGhpcy5jb2RpbmdQb3NdPHIpeysraTtmb3IoO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTJ9YnJlYWs7Y2FzZSA4OnRoaXMuX2FkZFBpeGVsc05lZyhlW2ldLTMsbik7bl49MTtpZih0W3RoaXMuY29kaW5nUG9zXTxyKXtpPjA/LS1pOisraTtmb3IoO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTJ9YnJlYWs7Y2FzZSA2OnRoaXMuX2FkZFBpeGVsc05lZyhlW2ldLTIsbik7bl49MTtpZih0W3RoaXMuY29kaW5nUG9zXTxyKXtpPjA/LS1pOisraTtmb3IoO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTJ9YnJlYWs7Y2FzZSA0OnRoaXMuX2FkZFBpeGVsc05lZyhlW2ldLTEsbik7bl49MTtpZih0W3RoaXMuY29kaW5nUG9zXTxyKXtpPjA/LS1pOisraTtmb3IoO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTJ9YnJlYWs7Y2FzZS0xOnRoaXMuX2FkZFBpeGVscyhyLDApO3RoaXMuZW9mPSEwO2JyZWFrO2RlZmF1bHQ6KDAsYS5pbmZvKSgiYmFkIDJkIGNvZGUiKTt0aGlzLl9hZGRQaXhlbHMociwwKTt0aGlzLmVycj0hMH19fWVsc2V7dFswXT0wO3RoaXMuY29kaW5nUG9zPTA7bj0wO2Zvcig7dFt0aGlzLmNvZGluZ1Bvc108cjspe3M9MDtpZihuKWRve3MrPWw9dGhpcy5fZ2V0QmxhY2tDb2RlKCl9d2hpbGUobD49NjQpO2Vsc2UgZG97cys9bD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShsPj02NCk7dGhpcy5fYWRkUGl4ZWxzKHRbdGhpcy5jb2RpbmdQb3NdK3Msbik7bl49MX19bGV0IGg9ITE7dGhpcy5ieXRlQWxpZ24mJih0aGlzLmlucHV0Qml0cyY9LTgpO2lmKHRoaXMuZW9ibG9ja3x8dGhpcy5yb3chPT10aGlzLnJvd3MtMSl7cz10aGlzLl9sb29rQml0cygxMik7aWYodGhpcy5lb2xpbmUpZm9yKDstMSE9PXMmJjEhPT1zOyl7dGhpcy5fZWF0Qml0cygxKTtzPXRoaXMuX2xvb2tCaXRzKDEyKX1lbHNlIGZvcig7MD09PXM7KXt0aGlzLl9lYXRCaXRzKDEpO3M9dGhpcy5fbG9va0JpdHMoMTIpfWlmKDE9PT1zKXt0aGlzLl9lYXRCaXRzKDEyKTtoPSEwfWVsc2UtMT09PXMmJih0aGlzLmVvZj0hMCl9ZWxzZSB0aGlzLnJvd3NEb25lPSEwO2lmKCF0aGlzLmVvZiYmdGhpcy5lbmNvZGluZz4wJiYhdGhpcy5yb3dzRG9uZSl7dGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfWlmKHRoaXMuZW9ibG9jayYmaCYmdGhpcy5ieXRlQWxpZ24pe3M9dGhpcy5fbG9va0JpdHMoMTIpO2lmKDE9PT1zKXt0aGlzLl9lYXRCaXRzKDEyKTtpZih0aGlzLmVuY29kaW5nPjApe3RoaXMuX2xvb2tCaXRzKDEpO3RoaXMuX2VhdEJpdHMoMSl9aWYodGhpcy5lbmNvZGluZz49MClmb3Iobz0wO288NDsrK28pe3M9dGhpcy5fbG9va0JpdHMoMTIpOzEhPT1zJiYoMCxhLmluZm8pKCJiYWQgcnRjIGNvZGU6ICIrcyk7dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfX10aGlzLmVvZj0hMH19ZWxzZSBpZih0aGlzLmVyciYmdGhpcy5lb2xpbmUpe2Zvcig7Oyl7cz10aGlzLl9sb29rQml0cygxMyk7aWYoLTE9PT1zKXt0aGlzLmVvZj0hMDtyZXR1cm4tMX1pZihzPj4xPT0xKWJyZWFrO3RoaXMuX2VhdEJpdHMoMSl9dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9lYXRCaXRzKDEpO3RoaXMubmV4dExpbmUyRD0hKDEmcyl9fXRbMF0+MD90aGlzLm91dHB1dEJpdHM9dFt0aGlzLmNvZGluZ1Bvcz0wXTp0aGlzLm91dHB1dEJpdHM9dFt0aGlzLmNvZGluZ1Bvcz0xXTt0aGlzLnJvdysrfWlmKHRoaXMub3V0cHV0Qml0cz49OCl7Yz0xJnRoaXMuY29kaW5nUG9zPzA6MjU1O3RoaXMub3V0cHV0Qml0cy09ODtpZigwPT09dGhpcy5vdXRwdXRCaXRzJiZ0W3RoaXMuY29kaW5nUG9zXTxyKXt0aGlzLmNvZGluZ1BvcysrO3RoaXMub3V0cHV0Qml0cz10W3RoaXMuY29kaW5nUG9zXS10W3RoaXMuY29kaW5nUG9zLTFdfX1lbHNle3M9ODtjPTA7ZG97aWYodGhpcy5vdXRwdXRCaXRzPnMpe2M8PD1zOzEmdGhpcy5jb2RpbmdQb3N8fChjfD0yNTU+Pjgtcyk7dGhpcy5vdXRwdXRCaXRzLT1zO3M9MH1lbHNle2M8PD10aGlzLm91dHB1dEJpdHM7MSZ0aGlzLmNvZGluZ1Bvc3x8KGN8PTI1NT4+OC10aGlzLm91dHB1dEJpdHMpO3MtPXRoaXMub3V0cHV0Qml0czt0aGlzLm91dHB1dEJpdHM9MDtpZih0W3RoaXMuY29kaW5nUG9zXTxyKXt0aGlzLmNvZGluZ1BvcysrO3RoaXMub3V0cHV0Qml0cz10W3RoaXMuY29kaW5nUG9zXS10W3RoaXMuY29kaW5nUG9zLTFdfWVsc2UgaWYocz4wKXtjPDw9cztzPTB9fX13aGlsZShzKX10aGlzLmJsYWNrJiYoY149MjU1KTtyZXR1cm4gY30sX2FkZFBpeGVscyhlLHQpe2NvbnN0IHI9dGhpcy5jb2RpbmdMaW5lO2xldCBpPXRoaXMuY29kaW5nUG9zO2lmKGU+cltpXSl7aWYoZT50aGlzLmNvbHVtbnMpeygwLGEuaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKTt0aGlzLmVycj0hMDtlPXRoaXMuY29sdW1uc30xJmledCYmKytpO3JbaV09ZX10aGlzLmNvZGluZ1Bvcz1pfSxfYWRkUGl4ZWxzTmVnKGUsdCl7Y29uc3Qgcj10aGlzLmNvZGluZ0xpbmU7bGV0IGk9dGhpcy5jb2RpbmdQb3M7aWYoZT5yW2ldKXtpZihlPnRoaXMuY29sdW1ucyl7KDAsYS5pbmZvKSgicm93IGlzIHdyb25nIGxlbmd0aCIpO3RoaXMuZXJyPSEwO2U9dGhpcy5jb2x1bW5zfTEmaV50JiYrK2k7cltpXT1lfWVsc2UgaWYoZTxyW2ldKXtpZihlPDApeygwLGEuaW5mbykoImludmFsaWQgY29kZSIpO3RoaXMuZXJyPSEwO2U9MH1mb3IoO2k+MCYmZTxyW2ktMV07KS0taTtyW2ldPWV9dGhpcy5jb2RpbmdQb3M9aX0sX2ZpbmRUYWJsZUNvZGUoZSx0LHIsYSl7Y29uc3QgaT1hfHwwO2ZvcihsZXQgYT1lO2E8PXQ7KythKXtsZXQgZT10aGlzLl9sb29rQml0cyhhKTtpZigtMT09PWUpcmV0dXJuWyEwLDEsITFdO2E8dCYmKGU8PD10LWEpO2lmKCFpfHxlPj1pKXtjb25zdCB0PXJbZS1pXTtpZih0WzBdPT09YSl7dGhpcy5fZWF0Qml0cyhhKTtyZXR1cm5bITAsdFsxXSwhMF19fX1yZXR1cm5bITEsMCwhMV19LF9nZXRUd29EaW1Db2RlKCl7bGV0IHQscj0wO2lmKHRoaXMuZW9ibG9jayl7cj10aGlzLl9sb29rQml0cyg3KTt0PWVbcl07aWYodCYmdFswXT4wKXt0aGlzLl9lYXRCaXRzKHRbMF0pO3JldHVybiB0WzFdfX1lbHNle2NvbnN0IHQ9dGhpcy5fZmluZFRhYmxlQ29kZSgxLDcsZSk7aWYodFswXSYmdFsyXSlyZXR1cm4gdFsxXX0oMCxhLmluZm8pKCJCYWQgdHdvIGRpbSBjb2RlIik7cmV0dXJuLTF9LF9nZXRXaGl0ZUNvZGUoKXtsZXQgZSxpPTA7aWYodGhpcy5lb2Jsb2NrKXtpPXRoaXMuX2xvb2tCaXRzKDEyKTtpZigtMT09PWkpcmV0dXJuIDE7ZT1pPj41PT0wP3RbaV06cltpPj4zXTtpZihlWzBdPjApe3RoaXMuX2VhdEJpdHMoZVswXSk7cmV0dXJuIGVbMV19fWVsc2V7bGV0IGU9dGhpcy5fZmluZFRhYmxlQ29kZSgxLDkscik7aWYoZVswXSlyZXR1cm4gZVsxXTtlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsMTIsdCk7aWYoZVswXSlyZXR1cm4gZVsxXX0oMCxhLmluZm8pKCJiYWQgd2hpdGUgY29kZSIpO3RoaXMuX2VhdEJpdHMoMSk7cmV0dXJuIDF9LF9nZXRCbGFja0NvZGUoKXtsZXQgZSx0O2lmKHRoaXMuZW9ibG9jayl7ZT10aGlzLl9sb29rQml0cygxMyk7aWYoLTE9PT1lKXJldHVybiAxO3Q9ZT4+Nz09MD9pW2VdOmU+Pjk9PTAmJmU+PjchPTA/blsoZT4+MSktNjRdOnNbZT4+N107aWYodFswXT4wKXt0aGlzLl9lYXRCaXRzKHRbMF0pO3JldHVybiB0WzFdfX1lbHNle2xldCBlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMiw2LHMpO2lmKGVbMF0pcmV0dXJuIGVbMV07ZT10aGlzLl9maW5kVGFibGVDb2RlKDcsMTIsbiw2NCk7aWYoZVswXSlyZXR1cm4gZVsxXTtlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMTAsMTMsaSk7aWYoZVswXSlyZXR1cm4gZVsxXX0oMCxhLmluZm8pKCJiYWQgYmxhY2sgY29kZSIpO3RoaXMuX2VhdEJpdHMoMSk7cmV0dXJuIDF9LF9sb29rQml0cyhlKXtsZXQgdDtmb3IoO3RoaXMuaW5wdXRCaXRzPGU7KXtpZigtMT09PSh0PXRoaXMuc291cmNlLm5leHQoKSkpcmV0dXJuIDA9PT10aGlzLmlucHV0Qml0cz8tMTp0aGlzLmlucHV0QnVmPDxlLXRoaXMuaW5wdXRCaXRzJjY1NTM1Pj4xNi1lO3RoaXMuaW5wdXRCdWY9dGhpcy5pbnB1dEJ1Zjw8OHx0O3RoaXMuaW5wdXRCaXRzKz04fXJldHVybiB0aGlzLmlucHV0QnVmPj50aGlzLmlucHV0Qml0cy1lJjY1NTM1Pj4xNi1lfSxfZWF0Qml0cyhlKXsodGhpcy5pbnB1dEJpdHMtPWUpPDAmJih0aGlzLmlucHV0Qml0cz0wKX19O3JldHVybiBDQ0lUVEZheERlY29kZXJ9KCk7dC5DQ0lUVEZheERlY29kZXI9aX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5KYmlnMlN0cmVhbT12b2lkIDA7dmFyIGE9cig1KSxpPXIoMTIpLG49cigxNikscz1yKDIpO2NvbnN0IG89ZnVuY3Rpb24gSmJpZzJTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gSmJpZzJTdHJlYW0oZSx0LHIsYSl7dGhpcy5zdHJlYW09ZTt0aGlzLm1heWJlTGVuZ3RoPXQ7dGhpcy5kaWN0PXI7dGhpcy5wYXJhbXM9YTtpLkRlY29kZVN0cmVhbS5jYWxsKHRoaXMsdCl9SmJpZzJTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaS5EZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSmJpZzJTdHJlYW0ucHJvdG90eXBlLCJieXRlcyIse2dldCgpe3JldHVybigwLHMuc2hhZG93KSh0aGlzLCJieXRlcyIsdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpfSxjb25maWd1cmFibGU6ITB9KTtKYmlnMlN0cmVhbS5wcm90b3R5cGUuZW5zdXJlQnVmZmVyPWZ1bmN0aW9uKGUpe307SmJpZzJTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbigpe2lmKHRoaXMuZW9mKXJldHVybjtjb25zdCBlPW5ldyBuLkpiaWcySW1hZ2UsdD1bXTtpZigoMCxhLmlzRGljdCkodGhpcy5wYXJhbXMpKXtjb25zdCBlPXRoaXMucGFyYW1zLmdldCgiSkJJRzJHbG9iYWxzIik7aWYoKDAsYS5pc1N0cmVhbSkoZSkpe2NvbnN0IHI9ZS5nZXRCeXRlcygpO3QucHVzaCh7ZGF0YTpyLHN0YXJ0OjAsZW5kOnIubGVuZ3RofSl9fXQucHVzaCh7ZGF0YTp0aGlzLmJ5dGVzLHN0YXJ0OjAsZW5kOnRoaXMuYnl0ZXMubGVuZ3RofSk7Y29uc3Qgcj1lLnBhcnNlQ2h1bmtzKHQpLGk9ci5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxpO2UrKylyW2VdXj0yNTU7dGhpcy5idWZmZXI9cjt0aGlzLmJ1ZmZlckxlbmd0aD1pO3RoaXMuZW9mPSEwfTtyZXR1cm4gSmJpZzJTdHJlYW19KCk7dC5KYmlnMlN0cmVhbT1vfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkpiaWcySW1hZ2U9dm9pZCAwO3ZhciBhPXIoMiksaT1yKDgpLG49cigxNykscz1yKDE0KTtjbGFzcyBKYmlnMkVycm9yIGV4dGVuZHMgYS5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKCJKQklHMiBlcnJvcjogIitlKX19dmFyIG89ZnVuY3Rpb24gSmJpZzJJbWFnZUNsb3N1cmUoKXtmdW5jdGlvbiBDb250ZXh0Q2FjaGUoKXt9Q29udGV4dENhY2hlLnByb3RvdHlwZT17Z2V0Q29udGV4dHMoZSl7cmV0dXJuIGUgaW4gdGhpcz90aGlzW2VdOnRoaXNbZV09bmV3IEludDhBcnJheSg2NTUzNil9fTtmdW5jdGlvbiBEZWNvZGluZ0NvbnRleHQoZSx0LHIpe3RoaXMuZGF0YT1lO3RoaXMuc3RhcnQ9dDt0aGlzLmVuZD1yfURlY29kaW5nQ29udGV4dC5wcm90b3R5cGU9e2dldCBkZWNvZGVyKCl7dmFyIGU9bmV3IG4uQXJpdGhtZXRpY0RlY29kZXIodGhpcy5kYXRhLHRoaXMuc3RhcnQsdGhpcy5lbmQpO3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJkZWNvZGVyIixlKX0sZ2V0IGNvbnRleHRDYWNoZSgpe3ZhciBlPW5ldyBDb250ZXh0Q2FjaGU7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImNvbnRleHRDYWNoZSIsZSl9fTtmdW5jdGlvbiBkZWNvZGVJbnRlZ2VyKGUsdCxyKXt2YXIgYT1lLmdldENvbnRleHRzKHQpLGk9MTtmdW5jdGlvbiByZWFkQml0cyhlKXtmb3IodmFyIHQ9MCxuPTA7bjxlO24rKyl7dmFyIHM9ci5yZWFkQml0KGEsaSk7aT1pPDI1Nj9pPDwxfHM6NTExJihpPDwxfHMpfDI1Njt0PXQ8PDF8c31yZXR1cm4gdD4+PjB9dmFyIG49cmVhZEJpdHMoMSkscz1yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygzMikrNDQzNjpyZWFkQml0cygxMikrMzQwOnJlYWRCaXRzKDgpKzg0OnJlYWRCaXRzKDYpKzIwOnJlYWRCaXRzKDQpKzQ6cmVhZEJpdHMoMik7cmV0dXJuIDA9PT1uP3M6cz4wPy1zOm51bGx9ZnVuY3Rpb24gZGVjb2RlSUFJRChlLHQscil7Zm9yKHZhciBhPWUuZ2V0Q29udGV4dHMoIklBSUQiKSxpPTEsbj0wO248cjtuKyspe2k9aTw8MXx0LnJlYWRCaXQoYSxpKX1yZXR1cm4gcjwzMT9pJigxPDxyKS0xOjIxNDc0ODM2NDcmaX12YXIgZT1bIlN5bWJvbERpY3Rpb25hcnkiLG51bGwsbnVsbCxudWxsLCJJbnRlcm1lZGlhdGVUZXh0UmVnaW9uIixudWxsLCJJbW1lZGlhdGVUZXh0UmVnaW9uIiwiSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIlBhdHRlcm5EaWN0aW9uYXJ5IixudWxsLG51bGwsbnVsbCwiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb24iLG51bGwsIkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwiSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLG51bGwsIkltbWVkaWF0ZUdlbmVyaWNSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWZpbmVtZW50UmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLCJQYWdlSW5mb3JtYXRpb24iLCJFbmRPZlBhZ2UiLCJFbmRPZlN0cmlwZSIsIkVuZE9mRmlsZSIsIlByb2ZpbGVzIiwiVGFibGVzIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkV4dGVuc2lvbiJdLHQ9W1t7eDotMSx5Oi0yfSx7eDowLHk6LTJ9LHt4OjEseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4OjIseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV0sW3t4Oi0xLHk6LTJ9LHt4OjAseTotMn0se3g6MSx5Oi0yfSx7eDoyLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDoyLHk6LTF9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XSxbe3g6LTEseTotMn0se3g6MCx5Oi0yfSx7eDoxLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMix5OjB9LHt4Oi0xLHk6MH1dLFt7eDotMyx5Oi0xfSx7eDotMix5Oi0xfSx7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV1dLHI9W3tjb2Rpbmc6W3t4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9XSxyZWZlcmVuY2U6W3t4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9LHt4OjAseTowfSx7eDoxLHk6MH0se3g6LTEseToxfSx7eDowLHk6MX0se3g6MSx5OjF9XX0se2NvZGluZzpbe3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH1dLHJlZmVyZW5jZTpbe3g6MCx5Oi0xfSx7eDotMSx5OjB9LHt4OjAseTowfSx7eDoxLHk6MH0se3g6MCx5OjF9LHt4OjEseToxfV19XSxvPVszOTcxNywxOTQxLDIyOSw0MDVdLGM9WzMyLDhdO2Z1bmN0aW9uIGRlY29kZUJpdG1hcChlLHIsYSxpLG4scyxjLGwpe2lmKGUpe3JldHVybiBkZWNvZGVNTVJCaXRtYXAobmV3IFJlYWRlcihsLmRhdGEsbC5zdGFydCxsLmVuZCkscixhLCExKX1pZigwPT09aSYmIXMmJiFuJiY0PT09Yy5sZW5ndGgmJjM9PT1jWzBdLngmJi0xPT09Y1swXS55JiYtMz09PWNbMV0ueCYmLTE9PT1jWzFdLnkmJjI9PT1jWzJdLngmJi0yPT09Y1syXS55JiYtMj09PWNbM10ueCYmLTI9PT1jWzNdLnkpcmV0dXJuIGZ1bmN0aW9uIGRlY29kZUJpdG1hcFRlbXBsYXRlMChlLHQscil7dmFyIGEsaSxuLHMsbyxjLGwsaD1yLmRlY29kZXIsdT1yLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxkPVtdO2ZvcihpPTA7aTx0O2krKyl7bz1kW2ldPW5ldyBVaW50OEFycmF5KGUpO2M9aTwxP286ZFtpLTFdO2E9KGw9aTwyP286ZFtpLTJdKVswXTw8MTN8bFsxXTw8MTJ8bFsyXTw8MTF8Y1swXTw8N3xjWzFdPDw2fGNbMl08PDV8Y1szXTw8NDtmb3Iobj0wO248ZTtuKyspe29bbl09cz1oLnJlYWRCaXQodSxhKTthPSgzMTczNSZhKTw8MXwobiszPGU/bFtuKzNdPDwxMTowKXwobis0PGU/Y1tuKzRdPDw0OjApfHN9fXJldHVybiBkfShyLGEsbCk7dmFyIGg9ISFzLHU9dFtpXS5jb25jYXQoYyk7dS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLnktdC55fHxlLngtdC54fSkpO3ZhciBkLGYsZz11Lmxlbmd0aCxtPW5ldyBJbnQ4QXJyYXkoZykscD1uZXcgSW50OEFycmF5KGcpLGI9W10seT0wLHY9MCx3PTAsaz0wO2ZvcihmPTA7ZjxnO2YrKyl7bVtmXT11W2ZdLng7cFtmXT11W2ZdLnk7dj1NYXRoLm1pbih2LHVbZl0ueCk7dz1NYXRoLm1heCh3LHVbZl0ueCk7az1NYXRoLm1pbihrLHVbZl0ueSk7ZjxnLTEmJnVbZl0ueT09PXVbZisxXS55JiZ1W2ZdLng9PT11W2YrMV0ueC0xP3l8PTE8PGctMS1mOmIucHVzaChmKX12YXIgUz1iLmxlbmd0aCxDPW5ldyBJbnQ4QXJyYXkoUykseD1uZXcgSW50OEFycmF5KFMpLEE9bmV3IFVpbnQxNkFycmF5KFMpO2ZvcihkPTA7ZDxTO2QrKyl7Zj1iW2RdO0NbZF09dVtmXS54O3hbZF09dVtmXS55O0FbZF09MTw8Zy0xLWZ9Zm9yKHZhciBULEksRixQLEUsQj0tdixPPS1rLE09ci13LEQ9b1tpXSxSPW5ldyBVaW50OEFycmF5KHIpLE49W10sTD1sLmRlY29kZXIsXz1sLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxVPTAscT0wLGo9MDtqPGE7aisrKXtpZihuKXtpZihVXj1MLnJlYWRCaXQoXyxEKSl7Ti5wdXNoKFIpO2NvbnRpbnVlfX1SPW5ldyBVaW50OEFycmF5KFIpO04ucHVzaChSKTtmb3IoVD0wO1Q8cjtUKyspaWYoaCYmc1tqXVtUXSlSW1RdPTA7ZWxzZXtpZihUPj1CJiZUPE0mJmo+PU8pe3E9cTw8MSZ5O2ZvcihmPTA7ZjxTO2YrKyl7ST1qK3hbZl07Rj1UK0NbZl07KFA9TltJXVtGXSkmJihxfD1QPUFbZl0pfX1lbHNle3E9MDtFPWctMTtmb3IoZj0wO2Y8ZztmKyssRS0tKShGPVQrbVtmXSk+PTAmJkY8ciYmKEk9aitwW2ZdKT49MCYmKFA9TltJXVtGXSkmJihxfD1QPDxFKX12YXIgSD1MLnJlYWRCaXQoXyxxKTtSW1RdPUh9fXJldHVybiBOfWZ1bmN0aW9uIGRlY29kZVJlZmluZW1lbnQoZSx0LGEsaSxuLHMsbyxsLGgpe3ZhciB1PXJbYV0uY29kaW5nOzA9PT1hJiYodT11LmNvbmNhdChbbFswXV0pKTt2YXIgZCxmPXUubGVuZ3RoLGc9bmV3IEludDMyQXJyYXkoZiksbT1uZXcgSW50MzJBcnJheShmKTtmb3IoZD0wO2Q8ZjtkKyspe2dbZF09dVtkXS54O21bZF09dVtkXS55fXZhciBwPXJbYV0ucmVmZXJlbmNlOzA9PT1hJiYocD1wLmNvbmNhdChbbFsxXV0pKTt2YXIgYj1wLmxlbmd0aCx5PW5ldyBJbnQzMkFycmF5KGIpLHY9bmV3IEludDMyQXJyYXkoYik7Zm9yKGQ9MDtkPGI7ZCsrKXt5W2RdPXBbZF0ueDt2W2RdPXBbZF0ueX1mb3IodmFyIHc9aVswXS5sZW5ndGgsaz1pLmxlbmd0aCxTPWNbYV0sQz1bXSx4PWguZGVjb2RlcixBPWguY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpLFQ9MCxJPTA7STx0O0krKyl7aWYobyl7aWYoVF49eC5yZWFkQml0KEEsUykpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpfXZhciBGPW5ldyBVaW50OEFycmF5KGUpO0MucHVzaChGKTtmb3IodmFyIFA9MDtQPGU7UCsrKXt2YXIgRSxCLE89MDtmb3IoZD0wO2Q8ZjtkKyspe0U9SSttW2RdO0I9UCtnW2RdO0U8MHx8QjwwfHxCPj1lP088PD0xOk89Tzw8MXxDW0VdW0JdfWZvcihkPTA7ZDxiO2QrKyl7RT1JK3ZbZF0tcztCPVAreVtkXS1uO0U8MHx8RT49a3x8QjwwfHxCPj13P088PD0xOk89Tzw8MXxpW0VdW0JdfXZhciBNPXgucmVhZEJpdChBLE8pO0ZbUF09TX19cmV0dXJuIEN9ZnVuY3Rpb24gZGVjb2RlVGV4dFJlZ2lvbihlLHQscixhLGksbixzLG8sYyxsLGgsdSxkLGYsZyxtLHAsYix5KXtpZihlJiZ0KXRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7dmFyIHYsdyxrPVtdO2Zvcih2PTA7djxhO3YrKyl7dz1uZXcgVWludDhBcnJheShyKTtpZihpKWZvcih2YXIgUz0wO1M8cjtTKyspd1tTXT1pO2sucHVzaCh3KX12YXIgQz1wLmRlY29kZXIseD1wLmNvbnRleHRDYWNoZSxBPWU/LWYudGFibGVEZWx0YVQuZGVjb2RlKHkpOi1kZWNvZGVJbnRlZ2VyKHgsIklBRFQiLEMpLFQ9MDt2PTA7Zm9yKDt2PG47KXtBKz1lP2YudGFibGVEZWx0YVQuZGVjb2RlKHkpOmRlY29kZUludGVnZXIoeCwiSUFEVCIsQyk7Zm9yKHZhciBJPVQrPWU/Zi50YWJsZUZpcnN0Uy5kZWNvZGUoeSk6ZGVjb2RlSW50ZWdlcih4LCJJQUZTIixDKTs7KXtsZXQgYT0wO3M+MSYmKGE9ZT95LnJlYWRCaXRzKGIpOmRlY29kZUludGVnZXIoeCwiSUFJVCIsQykpO3ZhciBGPXMqQSthLFA9ZT9mLnN5bWJvbElEVGFibGUuZGVjb2RlKHkpOmRlY29kZUlBSUQoeCxDLGMpLEU9dCYmKGU/eS5yZWFkQml0KCk6ZGVjb2RlSW50ZWdlcih4LCJJQVJJIixDKSksQj1vW1BdLE89QlswXS5sZW5ndGgsTT1CLmxlbmd0aDtpZihFKXt2YXIgRD1kZWNvZGVJbnRlZ2VyKHgsIklBUkRXIixDKSxSPWRlY29kZUludGVnZXIoeCwiSUFSREgiLEMpO0I9ZGVjb2RlUmVmaW5lbWVudChPKz1ELE0rPVIsZyxCLChEPj4xKStkZWNvZGVJbnRlZ2VyKHgsIklBUkRYIixDKSwoUj4+MSkrZGVjb2RlSW50ZWdlcih4LCJJQVJEWSIsQyksITEsbSxwKX12YXIgTixMLF8sVT1GLSgxJnU/MDpNLTEpLHE9SS0oMiZ1P08tMTowKTtpZihsKXtmb3IoTj0wO048TTtOKyspaWYodz1rW3ErTl0pe189QltOXTt2YXIgaj1NYXRoLm1pbihyLVUsTyk7c3dpdGNoKGQpe2Nhc2UgMDpmb3IoTD0wO0w8ajtMKyspd1tVK0xdfD1fW0xdO2JyZWFrO2Nhc2UgMjpmb3IoTD0wO0w8ajtMKyspd1tVK0xdXj1fW0xdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICR7ZH0gaXMgbm90IHN1cHBvcnRlZGApfX1JKz1NLTF9ZWxzZXtmb3IoTD0wO0w8TTtMKyspaWYodz1rW1UrTF0pe189QltMXTtzd2l0Y2goZCl7Y2FzZSAwOmZvcihOPTA7TjxPO04rKyl3W3ErTl18PV9bTl07YnJlYWs7Y2FzZSAyOmZvcihOPTA7TjxPO04rKyl3W3ErTl1ePV9bTl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtkfSBpcyBub3Qgc3VwcG9ydGVkYCl9fUkrPU8tMX12Kys7dmFyIEg9ZT9mLnRhYmxlRGVsdGFTLmRlY29kZSh5KTpkZWNvZGVJbnRlZ2VyKHgsIklBRFMiLEMpO2lmKG51bGw9PT1IKWJyZWFrO0krPUgraH19cmV0dXJuIGt9ZnVuY3Rpb24gcmVhZFNlZ21lbnRIZWFkZXIodCxyKXt2YXIgYT17fTthLm51bWJlcj0oMCxpLnJlYWRVaW50MzIpKHQscik7dmFyIG49dFtyKzRdLHM9NjMmbjtpZighZVtzXSl0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIrcyk7YS50eXBlPXM7YS50eXBlTmFtZT1lW3NdO2EuZGVmZXJyZWROb25SZXRhaW49ISEoMTI4Jm4pO3ZhciBvPSEhKDY0Jm4pLGM9dFtyKzVdLGg9Yz4+NSY3LHU9WzMxJmNdLGQ9cis2O2lmKDc9PT1jKXtoPTUzNjg3MDkxMSYoMCxpLnJlYWRVaW50MzIpKHQsZC0xKTtkKz0zO3ZhciBmPWgrNz4+Mzt1WzBdPXRbZCsrXTtmb3IoOy0tZj4wOyl1LnB1c2godFtkKytdKX1lbHNlIGlmKDU9PT1jfHw2PT09Yyl0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCByZWZlcnJlZC10byBmbGFncyIpO2EucmV0YWluQml0cz11O2xldCBnPTQ7YS5udW1iZXI8PTI1Nj9nPTE6YS5udW1iZXI8PTY1NTM2JiYoZz0yKTt2YXIgbSxwLGI9W107Zm9yKG09MDttPGg7bSsrKXtsZXQgZTtlPTE9PT1nP3RbZF06Mj09PWc/KDAsaS5yZWFkVWludDE2KSh0LGQpOigwLGkucmVhZFVpbnQzMikodCxkKTtiLnB1c2goZSk7ZCs9Z31hLnJlZmVycmVkVG89YjtpZihvKXthLnBhZ2VBc3NvY2lhdGlvbj0oMCxpLnJlYWRVaW50MzIpKHQsZCk7ZCs9NH1lbHNlIGEucGFnZUFzc29jaWF0aW9uPXRbZCsrXTthLmxlbmd0aD0oMCxpLnJlYWRVaW50MzIpKHQsZCk7ZCs9NDtpZig0Mjk0OTY3Mjk1PT09YS5sZW5ndGgpe2lmKDM4IT09cyl0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCB1bmtub3duIHNlZ21lbnQgbGVuZ3RoIik7dmFyIHk9cmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbih0LGQpLHY9ISEoMSZ0W2QrbF0pLHc9bmV3IFVpbnQ4QXJyYXkoNik7aWYoIXYpe3dbMF09MjU1O3dbMV09MTcyfXdbMl09eS5oZWlnaHQ+Pj4yNCYyNTU7d1szXT15LmhlaWdodD4+MTYmMjU1O3dbNF09eS5oZWlnaHQ+PjgmMjU1O3dbNV09MjU1JnkuaGVpZ2h0O2ZvcihtPWQscD10Lmxlbmd0aDttPHA7bSsrKXtmb3IodmFyIGs9MDtrPDYmJndba109PT10W20ra107KWsrKztpZig2PT09ayl7YS5sZW5ndGg9bSs2O2JyZWFrfX1pZig0Mjk0OTY3Mjk1PT09YS5sZW5ndGgpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNlZ21lbnQgZW5kIHdhcyBub3QgZm91bmQiKX1hLmhlYWRlckVuZD1kO3JldHVybiBhfWZ1bmN0aW9uIHJlYWRTZWdtZW50cyhlLHQscixhKXtmb3IodmFyIGk9W10sbj1yO248YTspe3ZhciBzPXJlYWRTZWdtZW50SGVhZGVyKHQsbik7bj1zLmhlYWRlckVuZDt2YXIgbz17aGVhZGVyOnMsZGF0YTp0fTtpZighZS5yYW5kb21BY2Nlc3Mpe28uc3RhcnQ9bjtuKz1zLmxlbmd0aDtvLmVuZD1ufWkucHVzaChvKTtpZig1MT09PXMudHlwZSlicmVha31pZihlLnJhbmRvbUFjY2Vzcylmb3IodmFyIGM9MCxsPWkubGVuZ3RoO2M8bDtjKyspe2lbY10uc3RhcnQ9bjtuKz1pW2NdLmhlYWRlci5sZW5ndGg7aVtjXS5lbmQ9bn1yZXR1cm4gaX1mdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGUsdCl7cmV0dXJue3dpZHRoOigwLGkucmVhZFVpbnQzMikoZSx0KSxoZWlnaHQ6KDAsaS5yZWFkVWludDMyKShlLHQrNCkseDooMCxpLnJlYWRVaW50MzIpKGUsdCs4KSx5OigwLGkucmVhZFVpbnQzMikoZSx0KzEyKSxjb21iaW5hdGlvbk9wZXJhdG9yOjcmZVt0KzE2XX19dmFyIGw9MTc7ZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnQoZSx0KXt2YXIgcixhLG4scyxvPWUuaGVhZGVyLGM9ZS5kYXRhLGg9ZS5zdGFydCx1PWUuZW5kO3N3aXRjaChvLnR5cGUpe2Nhc2UgMDp2YXIgZD17fSxmPSgwLGkucmVhZFVpbnQxNikoYyxoKTtkLmh1ZmZtYW49ISEoMSZmKTtkLnJlZmluZW1lbnQ9ISEoMiZmKTtkLmh1ZmZtYW5ESFNlbGVjdG9yPWY+PjImMztkLmh1ZmZtYW5EV1NlbGVjdG9yPWY+PjQmMztkLmJpdG1hcFNpemVTZWxlY3Rvcj1mPj42JjE7ZC5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yPWY+PjcmMTtkLmJpdG1hcENvZGluZ0NvbnRleHRVc2VkPSEhKDI1NiZmKTtkLmJpdG1hcENvZGluZ0NvbnRleHRSZXRhaW5lZD0hISg1MTImZik7ZC50ZW1wbGF0ZT1mPj4xMCYzO2QucmVmaW5lbWVudFRlbXBsYXRlPWY+PjEyJjE7aCs9MjtpZighZC5odWZmbWFuKXtzPTA9PT1kLnRlbXBsYXRlPzQ6MTthPVtdO2ZvcihuPTA7bjxzO24rKyl7YS5wdXNoKHt4OigwLGkucmVhZEludDgpKGMsaCkseTooMCxpLnJlYWRJbnQ4KShjLGgrMSl9KTtoKz0yfWQuYXQ9YX1pZihkLnJlZmluZW1lbnQmJiFkLnJlZmluZW1lbnRUZW1wbGF0ZSl7YT1bXTtmb3Iobj0wO248MjtuKyspe2EucHVzaCh7eDooMCxpLnJlYWRJbnQ4KShjLGgpLHk6KDAsaS5yZWFkSW50OCkoYyxoKzEpfSk7aCs9Mn1kLnJlZmluZW1lbnRBdD1hfWQubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHM9KDAsaS5yZWFkVWludDMyKShjLGgpO2grPTQ7ZC5udW1iZXJPZk5ld1N5bWJvbHM9KDAsaS5yZWFkVWludDMyKShjLGgpO2grPTQ7cj1bZCxvLm51bWJlcixvLnJlZmVycmVkVG8sYyxoLHVdO2JyZWFrO2Nhc2UgNjpjYXNlIDc6dmFyIGc9e307Zy5pbmZvPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oYyxoKTtoKz1sO3ZhciBtPSgwLGkucmVhZFVpbnQxNikoYyxoKTtoKz0yO2cuaHVmZm1hbj0hISgxJm0pO2cucmVmaW5lbWVudD0hISgyJm0pO2cubG9nU3RyaXBTaXplPW0+PjImMztnLnN0cmlwU2l6ZT0xPDxnLmxvZ1N0cmlwU2l6ZTtnLnJlZmVyZW5jZUNvcm5lcj1tPj40JjM7Zy50cmFuc3Bvc2VkPSEhKDY0Jm0pO2cuY29tYmluYXRpb25PcGVyYXRvcj1tPj43JjM7Zy5kZWZhdWx0UGl4ZWxWYWx1ZT1tPj45JjE7Zy5kc09mZnNldD1tPDwxNz4+Mjc7Zy5yZWZpbmVtZW50VGVtcGxhdGU9bT4+MTUmMTtpZihnLmh1ZmZtYW4pe3ZhciBwPSgwLGkucmVhZFVpbnQxNikoYyxoKTtoKz0yO2cuaHVmZm1hbkZTPTMmcDtnLmh1ZmZtYW5EUz1wPj4yJjM7Zy5odWZmbWFuRFQ9cD4+NCYzO2cuaHVmZm1hblJlZmluZW1lbnREVz1wPj42JjM7Zy5odWZmbWFuUmVmaW5lbWVudERIPXA+PjgmMztnLmh1ZmZtYW5SZWZpbmVtZW50RFg9cD4+MTAmMztnLmh1ZmZtYW5SZWZpbmVtZW50RFk9cD4+MTImMztnLmh1ZmZtYW5SZWZpbmVtZW50U2l6ZVNlbGVjdG9yPSEhKDE2Mzg0JnApfWlmKGcucmVmaW5lbWVudCYmIWcucmVmaW5lbWVudFRlbXBsYXRlKXthPVtdO2ZvcihuPTA7bjwyO24rKyl7YS5wdXNoKHt4OigwLGkucmVhZEludDgpKGMsaCkseTooMCxpLnJlYWRJbnQ4KShjLGgrMSl9KTtoKz0yfWcucmVmaW5lbWVudEF0PWF9Zy5udW1iZXJPZlN5bWJvbEluc3RhbmNlcz0oMCxpLnJlYWRVaW50MzIpKGMsaCk7aCs9NDtyPVtnLG8ucmVmZXJyZWRUbyxjLGgsdV07YnJlYWs7Y2FzZSAxNjpjb25zdCBlPXt9LHQ9Y1toKytdO2UubW1yPSEhKDEmdCk7ZS50ZW1wbGF0ZT10Pj4xJjM7ZS5wYXR0ZXJuV2lkdGg9Y1toKytdO2UucGF0dGVybkhlaWdodD1jW2grK107ZS5tYXhQYXR0ZXJuSW5kZXg9KDAsaS5yZWFkVWludDMyKShjLGgpO2grPTQ7cj1bZSxvLm51bWJlcixjLGgsdV07YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOmNvbnN0IGs9e307ay5pbmZvPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oYyxoKTtoKz1sO2NvbnN0IFM9Y1toKytdO2subW1yPSEhKDEmUyk7ay50ZW1wbGF0ZT1TPj4xJjM7ay5lbmFibGVTa2lwPSEhKDgmUyk7ay5jb21iaW5hdGlvbk9wZXJhdG9yPVM+PjQmNztrLmRlZmF1bHRQaXhlbFZhbHVlPVM+PjcmMTtrLmdyaWRXaWR0aD0oMCxpLnJlYWRVaW50MzIpKGMsaCk7aCs9NDtrLmdyaWRIZWlnaHQ9KDAsaS5yZWFkVWludDMyKShjLGgpO2grPTQ7ay5ncmlkT2Zmc2V0WD00Mjk0OTY3Mjk1JigwLGkucmVhZFVpbnQzMikoYyxoKTtoKz00O2suZ3JpZE9mZnNldFk9NDI5NDk2NzI5NSYoMCxpLnJlYWRVaW50MzIpKGMsaCk7aCs9NDtrLmdyaWRWZWN0b3JYPSgwLGkucmVhZFVpbnQxNikoYyxoKTtoKz0yO2suZ3JpZFZlY3Rvclk9KDAsaS5yZWFkVWludDE2KShjLGgpO2grPTI7cj1bayxvLnJlZmVycmVkVG8sYyxoLHVdO2JyZWFrO2Nhc2UgMzg6Y2FzZSAzOTp2YXIgYj17fTtiLmluZm89cmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihjLGgpO2grPWw7dmFyIHk9Y1toKytdO2IubW1yPSEhKDEmeSk7Yi50ZW1wbGF0ZT15Pj4xJjM7Yi5wcmVkaWN0aW9uPSEhKDgmeSk7aWYoIWIubW1yKXtzPTA9PT1iLnRlbXBsYXRlPzQ6MTthPVtdO2ZvcihuPTA7bjxzO24rKyl7YS5wdXNoKHt4OigwLGkucmVhZEludDgpKGMsaCkseTooMCxpLnJlYWRJbnQ4KShjLGgrMSl9KTtoKz0yfWIuYXQ9YX1yPVtiLGMsaCx1XTticmVhaztjYXNlIDQ4OnZhciB2PXt3aWR0aDooMCxpLnJlYWRVaW50MzIpKGMsaCksaGVpZ2h0OigwLGkucmVhZFVpbnQzMikoYyxoKzQpLHJlc29sdXRpb25YOigwLGkucmVhZFVpbnQzMikoYyxoKzgpLHJlc29sdXRpb25ZOigwLGkucmVhZFVpbnQzMikoYyxoKzEyKX07NDI5NDk2NzI5NT09PXYuaGVpZ2h0JiZkZWxldGUgdi5oZWlnaHQ7dmFyIHc9Y1toKzE2XTsoMCxpLnJlYWRVaW50MTYpKGMsaCsxNyk7di5sb3NzbGVzcz0hISgxJncpO3YucmVmaW5lbWVudD0hISgyJncpO3YuZGVmYXVsdFBpeGVsVmFsdWU9dz4+MiYxO3YuY29tYmluYXRpb25PcGVyYXRvcj13Pj4zJjM7di5yZXF1aXJlc0J1ZmZlcj0hISgzMiZ3KTt2LmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZT0hISg2NCZ3KTtyPVt2XTticmVhaztjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpicmVhaztjYXNlIDUzOnI9W28ubnVtYmVyLGMsaCx1XTticmVhaztjYXNlIDYyOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYHNlZ21lbnQgdHlwZSAke28udHlwZU5hbWV9KCR7by50eXBlfSkgaXMgbm90IGltcGxlbWVudGVkYCl9dmFyIGs9Im9uIitvLnR5cGVOYW1lO2sgaW4gdCYmdFtrXS5hcHBseSh0LHIpfWZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhlLHQpe2Zvcih2YXIgcj0wLGE9ZS5sZW5ndGg7cjxhO3IrKylwcm9jZXNzU2VnbWVudChlW3JdLHQpfWZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yKCl7fVNpbXBsZVNlZ21lbnRWaXNpdG9yLnByb3RvdHlwZT17b25QYWdlSW5mb3JtYXRpb246ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25QYWdlSW5mb3JtYXRpb24oZSl7dGhpcy5jdXJyZW50UGFnZUluZm89ZTt2YXIgdD1lLndpZHRoKzc+PjMscj1uZXcgVWludDhDbGFtcGVkQXJyYXkodCplLmhlaWdodCk7aWYoZS5kZWZhdWx0UGl4ZWxWYWx1ZSlmb3IodmFyIGE9MCxpPXIubGVuZ3RoO2E8aTthKyspclthXT0yNTU7dGhpcy5idWZmZXI9cn0sZHJhd0JpdG1hcDpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9kcmF3Qml0bWFwKGUsdCl7dmFyIHIsYSxpLG4scz10aGlzLmN1cnJlbnRQYWdlSW5mbyxvPWUud2lkdGgsYz1lLmhlaWdodCxsPXMud2lkdGgrNz4+MyxoPXMuY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlP2UuY29tYmluYXRpb25PcGVyYXRvcjpzLmNvbWJpbmF0aW9uT3BlcmF0b3IsdT10aGlzLmJ1ZmZlcixkPTEyOD4+KDcmZS54KSxmPWUueSpsKyhlLng+PjMpO3N3aXRjaChoKXtjYXNlIDA6Zm9yKHI9MDtyPGM7cisrKXtpPWQ7bj1mO2ZvcihhPTA7YTxvO2ErKyl7dFtyXVthXSYmKHVbbl18PWkpO2lmKCEoaT4+PTEpKXtpPTEyODtuKyt9fWYrPWx9YnJlYWs7Y2FzZSAyOmZvcihyPTA7cjxjO3IrKyl7aT1kO249Zjtmb3IoYT0wO2E8bzthKyspe3Rbcl1bYV0mJih1W25dXj1pKTtpZighKGk+Pj0xKSl7aT0xMjg7bisrfX1mKz1sfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICR7aH0gaXMgbm90IHN1cHBvcnRlZGApfX0sb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uOmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihlLHQscixhKXt2YXIgaT1lLmluZm8sbj1uZXcgRGVjb2RpbmdDb250ZXh0KHQscixhKSxzPWRlY29kZUJpdG1hcChlLm1tcixpLndpZHRoLGkuaGVpZ2h0LGUudGVtcGxhdGUsZS5wcmVkaWN0aW9uLG51bGwsZS5hdCxuKTt0aGlzLmRyYXdCaXRtYXAoaSxzKX0sb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb246ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG9uU3ltYm9sRGljdGlvbmFyeTpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vblN5bWJvbERpY3Rpb25hcnkoZSx0LHIsYSxuLHMpe2xldCBvLGM7aWYoZS5odWZmbWFuKXtvPWZ1bmN0aW9uIGdldFN5bWJvbERpY3Rpb25hcnlIdWZmbWFuVGFibGVzKGUsdCxyKXtsZXQgYSxpLG4scyxvPTA7c3dpdGNoKGUuaHVmZm1hbkRIU2VsZWN0b3Ipe2Nhc2UgMDpjYXNlIDE6YT1nZXRTdGFuZGFyZFRhYmxlKGUuaHVmZm1hbkRIU2VsZWN0b3IrNCk7YnJlYWs7Y2FzZSAzOmE9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKG8sdCxyKTtvKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERIIHNlbGVjdG9yIil9c3dpdGNoKGUuaHVmZm1hbkRXU2VsZWN0b3Ipe2Nhc2UgMDpjYXNlIDE6aT1nZXRTdGFuZGFyZFRhYmxlKGUuaHVmZm1hbkRXU2VsZWN0b3IrMik7YnJlYWs7Y2FzZSAzOmk9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKG8sdCxyKTtvKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERXIHNlbGVjdG9yIil9aWYoZS5iaXRtYXBTaXplU2VsZWN0b3Ipe249Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKG8sdCxyKTtvKyt9ZWxzZSBuPWdldFN0YW5kYXJkVGFibGUoMSk7cz1lLmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3I/Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKG8sdCxyKTpnZXRTdGFuZGFyZFRhYmxlKDEpO3JldHVybnt0YWJsZURlbHRhSGVpZ2h0OmEsdGFibGVEZWx0YVdpZHRoOmksdGFibGVCaXRtYXBTaXplOm4sdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXM6c319KGUscix0aGlzLmN1c3RvbVRhYmxlcyk7Yz1uZXcgUmVhZGVyKGEsbixzKX12YXIgbD10aGlzLnN5bWJvbHM7bHx8KHRoaXMuc3ltYm9scz1sPXt9KTtmb3IodmFyIGg9W10sdT0wLGQ9ci5sZW5ndGg7dTxkO3UrKyl7Y29uc3QgZT1sW3JbdV1dO2UmJihoPWguY29uY2F0KGUpKX12YXIgZj1uZXcgRGVjb2RpbmdDb250ZXh0KGEsbixzKTtsW3RdPWZ1bmN0aW9uIGRlY29kZVN5bWJvbERpY3Rpb25hcnkoZSx0LHIsYSxuLHMsbyxjLGwsaCx1LGQpe2lmKGUmJnQpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInN5bWJvbCByZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7dmFyIGY9W10sZz0wLG09KDAsaS5sb2cyKShyLmxlbmd0aCthKSxwPXUuZGVjb2RlcixiPXUuY29udGV4dENhY2hlO2xldCB5LHY7aWYoZSl7eT1nZXRTdGFuZGFyZFRhYmxlKDEpO3Y9W107bT1NYXRoLm1heChtLDEpfWZvcig7Zi5sZW5ndGg8YTspe2crPWU/cy50YWJsZURlbHRhSGVpZ2h0LmRlY29kZShkKTpkZWNvZGVJbnRlZ2VyKGIsIklBREgiLHApO2xldCBhPTAsaT0wO2NvbnN0IG49ZT92Lmxlbmd0aDowO2Zvcig7Oyl7dmFyIHcsaz1lP3MudGFibGVEZWx0YVdpZHRoLmRlY29kZShkKTpkZWNvZGVJbnRlZ2VyKGIsIklBRFciLHApO2lmKG51bGw9PT1rKWJyZWFrO2ErPWs7aSs9YTtpZih0KXt2YXIgUz1kZWNvZGVJbnRlZ2VyKGIsIklBQUkiLHApO2lmKFM+MSl3PWRlY29kZVRleHRSZWdpb24oZSx0LGEsZywwLFMsMSxyLmNvbmNhdChmKSxtLDAsMCwxLDAscyxsLGgsdSwwLGQpO2Vsc2V7dmFyIEM9ZGVjb2RlSUFJRChiLHAsbSkseD1kZWNvZGVJbnRlZ2VyKGIsIklBUkRYIixwKSxBPWRlY29kZUludGVnZXIoYiwiSUFSRFkiLHApO3c9ZGVjb2RlUmVmaW5lbWVudChhLGcsbCxDPHIubGVuZ3RoP3JbQ106ZltDLXIubGVuZ3RoXSx4LEEsITEsaCx1KX1mLnB1c2godyl9ZWxzZSBpZihlKXYucHVzaChhKTtlbHNle3c9ZGVjb2RlQml0bWFwKCExLGEsZyxvLCExLG51bGwsYyx1KTtmLnB1c2godyl9fWlmKGUmJiF0KXtjb25zdCBlPXMudGFibGVCaXRtYXBTaXplLmRlY29kZShkKTtkLmJ5dGVBbGlnbigpO2xldCB0O2lmKDA9PT1lKXQ9cmVhZFVuY29tcHJlc3NlZEJpdG1hcChkLGksZyk7ZWxzZXtjb25zdCByPWQuZW5kLGE9ZC5wb3NpdGlvbitlO2QuZW5kPWE7dD1kZWNvZGVNTVJCaXRtYXAoZCxpLGcsITEpO2QuZW5kPXI7ZC5wb3NpdGlvbj1hfWNvbnN0IHI9di5sZW5ndGg7aWYobj09PXItMSlmLnB1c2godCk7ZWxzZXtsZXQgZSxhLGkscyxvLGM9MDtmb3IoZT1uO2U8cjtlKyspe3M9dltlXTtpPWMrcztvPVtdO2ZvcihhPTA7YTxnO2ErKylvLnB1c2godFthXS5zdWJhcnJheShjLGkpKTtmLnB1c2gobyk7Yz1pfX19fWZvcih2YXIgVD1bXSxJPVtdLEY9ITEsUD1yLmxlbmd0aCthO0kubGVuZ3RoPFA7KXtmb3IodmFyIEU9ZT95LmRlY29kZShkKTpkZWNvZGVJbnRlZ2VyKGIsIklBRVgiLHApO0UtLTspSS5wdXNoKEYpO0Y9IUZ9Zm9yKHZhciBCPTAsTz1yLmxlbmd0aDtCPE87QisrKUlbQl0mJlQucHVzaChyW0JdKTtmb3IodmFyIE09MDtNPGE7QisrLE0rKylJW0JdJiZULnB1c2goZltNXSk7cmV0dXJuIFR9KGUuaHVmZm1hbixlLnJlZmluZW1lbnQsaCxlLm51bWJlck9mTmV3U3ltYm9scyxlLm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLG8sZS50ZW1wbGF0ZSxlLmF0LGUucmVmaW5lbWVudFRlbXBsYXRlLGUucmVmaW5lbWVudEF0LGYsYyl9LG9uSW1tZWRpYXRlVGV4dFJlZ2lvbjpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZVRleHRSZWdpb24oZSx0LHIsYSxuKXt2YXIgcz1lLmluZm87bGV0IG8sYztmb3IodmFyIGw9dGhpcy5zeW1ib2xzLGg9W10sdT0wLGQ9dC5sZW5ndGg7dTxkO3UrKyl7Y29uc3QgZT1sW3RbdV1dO2UmJihoPWguY29uY2F0KGUpKX12YXIgZj0oMCxpLmxvZzIpKGgubGVuZ3RoKTtpZihlLmh1ZmZtYW4pe2M9bmV3IFJlYWRlcihyLGEsbik7bz1mdW5jdGlvbiBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhlLHQscixhLGkpe2NvbnN0IG49W107Zm9yKGxldCBlPTA7ZTw9MzQ7ZSsrKXtjb25zdCB0PWkucmVhZEJpdHMoNCk7bi5wdXNoKG5ldyBIdWZmbWFuTGluZShbZSx0LDAsMF0pKX1jb25zdCBzPW5ldyBIdWZmbWFuVGFibGUobiwhMSk7bi5sZW5ndGg9MDtmb3IobGV0IGU9MDtlPGE7KXtjb25zdCB0PXMuZGVjb2RlKGkpO2lmKHQ+PTMyKXtsZXQgcixhLHM7c3dpdGNoKHQpe2Nhc2UgMzI6aWYoMD09PWUpdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZSIpO2E9aS5yZWFkQml0cygyKSszO3I9bltlLTFdLnByZWZpeExlbmd0aDticmVhaztjYXNlIDMzOmE9aS5yZWFkQml0cygzKSszO3I9MDticmVhaztjYXNlIDM0OmE9aS5yZWFkQml0cyg3KSsxMTtyPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGUiKX1mb3Iocz0wO3M8YTtzKyspe24ucHVzaChuZXcgSHVmZm1hbkxpbmUoW2UsciwwLDBdKSk7ZSsrfX1lbHNle24ucHVzaChuZXcgSHVmZm1hbkxpbmUoW2UsdCwwLDBdKSk7ZSsrfX1pLmJ5dGVBbGlnbigpO2NvbnN0IG89bmV3IEh1ZmZtYW5UYWJsZShuLCExKTtsZXQgYyxsLGgsdT0wO3N3aXRjaChlLmh1ZmZtYW5GUyl7Y2FzZSAwOmNhc2UgMTpjPWdldFN0YW5kYXJkVGFibGUoZS5odWZmbWFuRlMrNik7YnJlYWs7Y2FzZSAzOmM9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKHUsdCxyKTt1Kys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIil9c3dpdGNoKGUuaHVmZm1hbkRTKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpsPWdldFN0YW5kYXJkVGFibGUoZS5odWZmbWFuRFMrOCk7YnJlYWs7Y2FzZSAzOmw9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKHUsdCxyKTt1Kys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIil9c3dpdGNoKGUuaHVmZm1hbkRUKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpoPWdldFN0YW5kYXJkVGFibGUoZS5odWZmbWFuRFQrMTEpO2JyZWFrO2Nhc2UgMzpoPWdldEN1c3RvbUh1ZmZtYW5UYWJsZSh1LHQscik7dSsrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpfWlmKGUucmVmaW5lbWVudCl0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybntzeW1ib2xJRFRhYmxlOm8sdGFibGVGaXJzdFM6Yyx0YWJsZURlbHRhUzpsLHRhYmxlRGVsdGFUOmh9fShlLHQsdGhpcy5jdXN0b21UYWJsZXMsaC5sZW5ndGgsYyl9dmFyIGc9bmV3IERlY29kaW5nQ29udGV4dChyLGEsbiksbT1kZWNvZGVUZXh0UmVnaW9uKGUuaHVmZm1hbixlLnJlZmluZW1lbnQscy53aWR0aCxzLmhlaWdodCxlLmRlZmF1bHRQaXhlbFZhbHVlLGUubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsZS5zdHJpcFNpemUsaCxmLGUudHJhbnNwb3NlZCxlLmRzT2Zmc2V0LGUucmVmZXJlbmNlQ29ybmVyLGUuY29tYmluYXRpb25PcGVyYXRvcixvLGUucmVmaW5lbWVudFRlbXBsYXRlLGUucmVmaW5lbWVudEF0LGcsZS5sb2dTdHJpcFNpemUsYyk7dGhpcy5kcmF3Qml0bWFwKHMsbSl9LG9uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uOmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uKCl7dGhpcy5vbkltbWVkaWF0ZVRleHRSZWdpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvblBhdHRlcm5EaWN0aW9uYXJ5KGUsdCxyLGEsaSl7bGV0IG49dGhpcy5wYXR0ZXJucztufHwodGhpcy5wYXR0ZXJucz1uPXt9KTtjb25zdCBzPW5ldyBEZWNvZGluZ0NvbnRleHQocixhLGkpO25bdF09ZnVuY3Rpb24gZGVjb2RlUGF0dGVybkRpY3Rpb25hcnkoZSx0LHIsYSxpLG4pe2NvbnN0IHM9W107aWYoIWUpe3MucHVzaCh7eDotdCx5OjB9KTtpZigwPT09aSl7cy5wdXNoKHt4Oi0zLHk6LTF9KTtzLnB1c2goe3g6Mix5Oi0yfSk7cy5wdXNoKHt4Oi0yLHk6LTJ9KX19Y29uc3Qgbz1kZWNvZGVCaXRtYXAoZSwoYSsxKSp0LHIsaSwhMSxudWxsLHMsbiksYz1bXTtmb3IobGV0IGU9MDtlPD1hO2UrKyl7Y29uc3QgYT1bXSxpPXQqZSxuPWkrdDtmb3IobGV0IGU9MDtlPHI7ZSsrKWEucHVzaChvW2VdLnN1YmFycmF5KGksbikpO2MucHVzaChhKX1yZXR1cm4gY30oZS5tbXIsZS5wYXR0ZXJuV2lkdGgsZS5wYXR0ZXJuSGVpZ2h0LGUubWF4UGF0dGVybkluZGV4LGUudGVtcGxhdGUscyl9LG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24oZSx0LHIsYSxuKXtjb25zdCBzPXRoaXMucGF0dGVybnNbdFswXV0sbz1lLmluZm8sYz1uZXcgRGVjb2RpbmdDb250ZXh0KHIsYSxuKSxsPWZ1bmN0aW9uIGRlY29kZUhhbGZ0b25lUmVnaW9uKGUsdCxyLGEsbixzLG8sYyxsLGgsdSxkLGYsZyxtKXtpZihvKXRocm93IG5ldyBKYmlnMkVycm9yKCJza2lwIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZigwIT09Yyl0aHJvdyBuZXcgSmJpZzJFcnJvcigib3BlcmF0b3IgIitjKyIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb24iKTtjb25zdCBwPVtdO2xldCBiLHksdjtmb3IoYj0wO2I8bjtiKyspe3Y9bmV3IFVpbnQ4QXJyYXkoYSk7aWYocylmb3IoeT0wO3k8YTt5Kyspdlt5XT1zO3AucHVzaCh2KX1jb25zdCB3PXQubGVuZ3RoLGs9dFswXSxTPWtbMF0ubGVuZ3RoLEM9ay5sZW5ndGgseD0oMCxpLmxvZzIpKHcpLEE9W107aWYoIWUpe0EucHVzaCh7eDpyPD0xPzM6Mix5Oi0xfSk7aWYoMD09PXIpe0EucHVzaCh7eDotMyx5Oi0xfSk7QS5wdXNoKHt4OjIseTotMn0pO0EucHVzaCh7eDotMix5Oi0yfSl9fWNvbnN0IFQ9W107bGV0IEksRixQLEUsQixPLE0sRCxSLE4sTDtlJiYoST1uZXcgUmVhZGVyKG0uZGF0YSxtLnN0YXJ0LG0uZW5kKSk7Zm9yKGI9eC0xO2I+PTA7Yi0tKXtGPWU/ZGVjb2RlTU1SQml0bWFwKEksbCxoLCEwKTpkZWNvZGVCaXRtYXAoITEsbCxoLHIsITEsbnVsbCxBLG0pO1RbYl09Rn1mb3IoUD0wO1A8aDtQKyspZm9yKEU9MDtFPGw7RSsrKXtCPTA7Tz0wO2Zvcih5PXgtMTt5Pj0wO3ktLSl7Qj1UW3ldW1BdW0VdXkI7T3w9Qjw8eX1NPXRbT107RD11K1AqZytFKmY+Pjg7Uj1kK1AqZi1FKmc+Pjg7aWYoRD49MCYmRCtTPD1hJiZSPj0wJiZSK0M8PW4pZm9yKGI9MDtiPEM7YisrKXtMPXBbUitiXTtOPU1bYl07Zm9yKHk9MDt5PFM7eSsrKUxbRCt5XXw9Tlt5XX1lbHNle2xldCBlLHQ7Zm9yKGI9MDtiPEM7YisrKXt0PVIrYjtpZighKHQ8MHx8dD49bikpe0w9cFt0XTtOPU1bYl07Zm9yKHk9MDt5PFM7eSsrKXtlPUQreTtlPj0wJiZlPGEmJihMW2VdfD1OW3ldKX19fX19cmV0dXJuIHB9KGUubW1yLHMsZS50ZW1wbGF0ZSxvLndpZHRoLG8uaGVpZ2h0LGUuZGVmYXVsdFBpeGVsVmFsdWUsZS5lbmFibGVTa2lwLGUuY29tYmluYXRpb25PcGVyYXRvcixlLmdyaWRXaWR0aCxlLmdyaWRIZWlnaHQsZS5ncmlkT2Zmc2V0WCxlLmdyaWRPZmZzZXRZLGUuZ3JpZFZlY3RvclgsZS5ncmlkVmVjdG9yWSxjKTt0aGlzLmRyYXdCaXRtYXAobyxsKX0sb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uKCl7dGhpcy5vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sb25UYWJsZXMoZSx0LHIsYSl7bGV0IG49dGhpcy5jdXN0b21UYWJsZXM7bnx8KHRoaXMuY3VzdG9tVGFibGVzPW49e30pO25bZV09ZnVuY3Rpb24gZGVjb2RlVGFibGVzU2VnbWVudChlLHQscil7Y29uc3QgYT1lW3RdLG49NDI5NDk2NzI5NSYoMCxpLnJlYWRVaW50MzIpKGUsdCsxKSxzPTQyOTQ5NjcyOTUmKDAsaS5yZWFkVWludDMyKShlLHQrNSksbz1uZXcgUmVhZGVyKGUsdCs5LHIpLGM9MSsoYT4+MSY3KSxsPTErKGE+PjQmNyksaD1bXTtsZXQgdSxkLGY9bjtkb3t1PW8ucmVhZEJpdHMoYyk7ZD1vLnJlYWRCaXRzKGwpO2gucHVzaChuZXcgSHVmZm1hbkxpbmUoW2YsdSxkLDBdKSk7Zis9MTw8ZH13aGlsZShmPHMpO3U9by5yZWFkQml0cyhjKTtoLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtuLTEsdSwzMiwwLCJsb3dlciJdKSk7dT1vLnJlYWRCaXRzKGMpO2gucHVzaChuZXcgSHVmZm1hbkxpbmUoW3MsdSwzMiwwXSkpO2lmKDEmYSl7dT1vLnJlYWRCaXRzKGMpO2gucHVzaChuZXcgSHVmZm1hbkxpbmUoW3UsMF0pKX1yZXR1cm4gbmV3IEh1ZmZtYW5UYWJsZShoLCExKX0odCxyLGEpfX07ZnVuY3Rpb24gSHVmZm1hbkxpbmUoZSl7aWYoMj09PWUubGVuZ3RoKXt0aGlzLmlzT09CPSEwO3RoaXMucmFuZ2VMb3c9MDt0aGlzLnByZWZpeExlbmd0aD1lWzBdO3RoaXMucmFuZ2VMZW5ndGg9MDt0aGlzLnByZWZpeENvZGU9ZVsxXTt0aGlzLmlzTG93ZXJSYW5nZT0hMX1lbHNle3RoaXMuaXNPT0I9ITE7dGhpcy5yYW5nZUxvdz1lWzBdO3RoaXMucHJlZml4TGVuZ3RoPWVbMV07dGhpcy5yYW5nZUxlbmd0aD1lWzJdO3RoaXMucHJlZml4Q29kZT1lWzNdO3RoaXMuaXNMb3dlclJhbmdlPSJsb3dlciI9PT1lWzRdfX1mdW5jdGlvbiBIdWZmbWFuVHJlZU5vZGUoZSl7dGhpcy5jaGlsZHJlbj1bXTtpZihlKXt0aGlzLmlzTGVhZj0hMDt0aGlzLnJhbmdlTGVuZ3RoPWUucmFuZ2VMZW5ndGg7dGhpcy5yYW5nZUxvdz1lLnJhbmdlTG93O3RoaXMuaXNMb3dlclJhbmdlPWUuaXNMb3dlclJhbmdlO3RoaXMuaXNPT0I9ZS5pc09PQn1lbHNlIHRoaXMuaXNMZWFmPSExfUh1ZmZtYW5UcmVlTm9kZS5wcm90b3R5cGU9e2J1aWxkVHJlZShlLHQpe2NvbnN0IHI9ZS5wcmVmaXhDb2RlPj50JjE7aWYodDw9MCl0aGlzLmNoaWxkcmVuW3JdPW5ldyBIdWZmbWFuVHJlZU5vZGUoZSk7ZWxzZXtsZXQgYT10aGlzLmNoaWxkcmVuW3JdO2F8fCh0aGlzLmNoaWxkcmVuW3JdPWE9bmV3IEh1ZmZtYW5UcmVlTm9kZShudWxsKSk7YS5idWlsZFRyZWUoZSx0LTEpfX0sZGVjb2RlTm9kZShlKXtpZih0aGlzLmlzTGVhZil7aWYodGhpcy5pc09PQilyZXR1cm4gbnVsbDtjb25zdCB0PWUucmVhZEJpdHModGhpcy5yYW5nZUxlbmd0aCk7cmV0dXJuIHRoaXMucmFuZ2VMb3crKHRoaXMuaXNMb3dlclJhbmdlPy10OnQpfWNvbnN0IHQ9dGhpcy5jaGlsZHJlbltlLnJlYWRCaXQoKV07aWYoIXQpdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBkYXRhIik7cmV0dXJuIHQuZGVjb2RlTm9kZShlKX19O2Z1bmN0aW9uIEh1ZmZtYW5UYWJsZShlLHQpe3R8fHRoaXMuYXNzaWduUHJlZml4Q29kZXMoZSk7dGhpcy5yb290Tm9kZT1uZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpO2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7Y29uc3Qgcj1lW3RdO3IucHJlZml4TGVuZ3RoPjAmJnRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKHIsci5wcmVmaXhMZW5ndGgtMSl9fUh1ZmZtYW5UYWJsZS5wcm90b3R5cGU9e2RlY29kZShlKXtyZXR1cm4gdGhpcy5yb290Tm9kZS5kZWNvZGVOb2RlKGUpfSxhc3NpZ25QcmVmaXhDb2RlcyhlKXtjb25zdCB0PWUubGVuZ3RoO2xldCByPTA7Zm9yKGxldCBhPTA7YTx0O2ErKylyPU1hdGgubWF4KHIsZVthXS5wcmVmaXhMZW5ndGgpO2NvbnN0IGE9bmV3IFVpbnQzMkFycmF5KHIrMSk7Zm9yKGxldCByPTA7cjx0O3IrKylhW2Vbcl0ucHJlZml4TGVuZ3RoXSsrO2xldCBpLG4scyxvPTEsYz0wO2FbMF09MDtmb3IoO288PXI7KXtjPWMrYVtvLTFdPDwxO2k9YztuPTA7Zm9yKDtuPHQ7KXtzPWVbbl07aWYocy5wcmVmaXhMZW5ndGg9PT1vKXtzLnByZWZpeENvZGU9aTtpKyt9bisrfW8rK319fTtjb25zdCBoPXt9O2Z1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUoZSl7bGV0IHQscj1oW2VdO2lmKHIpcmV0dXJuIHI7c3dpdGNoKGUpe2Nhc2UgMTp0PVtbMCwxLDQsMF0sWzE2LDIsOCwyXSxbMjcyLDMsMTYsNl0sWzY1ODA4LDMsMzIsN11dO2JyZWFrO2Nhc2UgMjp0PVtbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFs3NSw2LDMyLDYyXSxbNiw2M11dO2JyZWFrO2Nhc2UgMzp0PVtbLTI1Niw4LDgsMjU0XSxbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFstMjU3LDgsMzIsMjU1LCJsb3dlciJdLFs3NSw3LDMyLDEyNl0sWzYsNjJdXTticmVhaztjYXNlIDQ6dD1bWzEsMSwwLDBdLFsyLDIsMCwyXSxbMywzLDAsNl0sWzQsNCwzLDE0XSxbMTIsNSw2LDMwXSxbNzYsNSwzMiwzMV1dO2JyZWFrO2Nhc2UgNTp0PVtbLTI1NSw3LDgsMTI2XSxbMSwxLDAsMF0sWzIsMiwwLDJdLFszLDMsMCw2XSxbNCw0LDMsMTRdLFsxMiw1LDYsMzBdLFstMjU2LDcsMzIsMTI3LCJsb3dlciJdLFs3Niw2LDMyLDYyXV07YnJlYWs7Y2FzZSA2OnQ9W1stMjA0OCw1LDEwLDI4XSxbLTEwMjQsNCw5LDhdLFstNTEyLDQsOCw5XSxbLTI1Niw0LDcsMTBdLFstMTI4LDUsNiwyOV0sWy02NCw1LDUsMzBdLFstMzIsNCw1LDExXSxbMCwyLDcsMF0sWzEyOCwzLDcsMl0sWzI1NiwzLDgsM10sWzUxMiw0LDksMTJdLFsxMDI0LDQsMTAsMTNdLFstMjA0OSw2LDMyLDYyLCJsb3dlciJdLFsyMDQ4LDYsMzIsNjNdXTticmVhaztjYXNlIDc6dD1bWy0xMDI0LDQsOSw4XSxbLTUxMiwzLDgsMF0sWy0yNTYsNCw3LDldLFstMTI4LDUsNiwyNl0sWy02NCw1LDUsMjddLFstMzIsNCw1LDEwXSxbMCw0LDUsMTFdLFszMiw1LDUsMjhdLFs2NCw1LDYsMjldLFsxMjgsNCw3LDEyXSxbMjU2LDMsOCwxXSxbNTEyLDMsOSwyXSxbMTAyNCwzLDEwLDNdLFstMTAyNSw1LDMyLDMwLCJsb3dlciJdLFsyMDQ4LDUsMzIsMzFdXTticmVhaztjYXNlIDg6dD1bWy0xNSw4LDMsMjUyXSxbLTcsOSwxLDUwOF0sWy01LDgsMSwyNTNdLFstMyw5LDAsNTA5XSxbLTIsNywwLDEyNF0sWy0xLDQsMCwxMF0sWzAsMiwxLDBdLFsyLDUsMCwyNl0sWzMsNiwwLDU4XSxbNCwzLDQsNF0sWzIwLDYsMSw1OV0sWzIyLDQsNCwxMV0sWzM4LDQsNSwxMl0sWzcwLDUsNiwyN10sWzEzNCw1LDcsMjhdLFsyNjIsNiw3LDYwXSxbMzkwLDcsOCwxMjVdLFs2NDYsNiwxMCw2MV0sWy0xNiw5LDMyLDUxMCwibG93ZXIiXSxbMTY3MCw5LDMyLDUxMV0sWzIsMV1dO2JyZWFrO2Nhc2UgOTp0PVtbLTMxLDgsNCwyNTJdLFstMTUsOSwyLDUwOF0sWy0xMSw4LDIsMjUzXSxbLTcsOSwxLDUwOV0sWy01LDcsMSwxMjRdLFstMyw0LDEsMTBdLFstMSwzLDEsMl0sWzEsMywxLDNdLFszLDUsMSwyNl0sWzUsNiwxLDU4XSxbNywzLDUsNF0sWzM5LDYsMiw1OV0sWzQzLDQsNSwxMV0sWzc1LDQsNiwxMl0sWzEzOSw1LDcsMjddLFsyNjcsNSw4LDI4XSxbNTIzLDYsOCw2MF0sWzc3OSw3LDksMTI1XSxbMTI5MSw2LDExLDYxXSxbLTMyLDksMzIsNTEwLCJsb3dlciJdLFszMzM5LDksMzIsNTExXSxbMiwwXV07YnJlYWs7Y2FzZSAxMDp0PVtbLTIxLDcsNCwxMjJdLFstNSw4LDAsMjUyXSxbLTQsNywwLDEyM10sWy0zLDUsMCwyNF0sWy0yLDIsMiwwXSxbMiw1LDAsMjVdLFszLDYsMCw1NF0sWzQsNywwLDEyNF0sWzUsOCwwLDI1M10sWzYsMiw2LDFdLFs3MCw1LDUsMjZdLFsxMDIsNiw1LDU1XSxbMTM0LDYsNiw1Nl0sWzE5OCw2LDcsNTddLFszMjYsNiw4LDU4XSxbNTgyLDYsOSw1OV0sWzEwOTQsNiwxMCw2MF0sWzIxMTgsNywxMSwxMjVdLFstMjIsOCwzMiwyNTQsImxvd2VyIl0sWzQxNjYsOCwzMiwyNTVdLFsyLDJdXTticmVhaztjYXNlIDExOnQ9W1sxLDEsMCwwXSxbMiwyLDEsMl0sWzQsNCwwLDEyXSxbNSw0LDEsMTNdLFs3LDUsMSwyOF0sWzksNSwyLDI5XSxbMTMsNiwyLDYwXSxbMTcsNywyLDEyMl0sWzIxLDcsMywxMjNdLFsyOSw3LDQsMTI0XSxbNDUsNyw1LDEyNV0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDEyOnQ9W1sxLDEsMCwwXSxbMiwyLDAsMl0sWzMsMywxLDZdLFs1LDUsMCwyOF0sWzYsNSwxLDI5XSxbOCw2LDEsNjBdLFsxMCw3LDAsMTIyXSxbMTEsNywxLDEyM10sWzEzLDcsMiwxMjRdLFsxNyw3LDMsMTI1XSxbMjUsNyw0LDEyNl0sWzQxLDgsNSwyNTRdLFs3Myw4LDMyLDI1NV1dO2JyZWFrO2Nhc2UgMTM6dD1bWzEsMSwwLDBdLFsyLDMsMCw0XSxbMyw0LDAsMTJdLFs0LDUsMCwyOF0sWzUsNCwxLDEzXSxbNywzLDMsNV0sWzE1LDYsMSw1OF0sWzE3LDYsMiw1OV0sWzIxLDYsMyw2MF0sWzI5LDYsNCw2MV0sWzQ1LDYsNSw2Ml0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDE0OnQ9W1stMiwzLDAsNF0sWy0xLDMsMCw1XSxbMCwxLDAsMF0sWzEsMywwLDZdLFsyLDMsMCw3XV07YnJlYWs7Y2FzZSAxNTp0PVtbLTI0LDcsNCwxMjRdLFstOCw2LDIsNjBdLFstNCw1LDEsMjhdLFstMiw0LDAsMTJdLFstMSwzLDAsNF0sWzAsMSwwLDBdLFsxLDMsMCw1XSxbMiw0LDAsMTNdLFszLDUsMSwyOV0sWzUsNiwyLDYxXSxbOSw3LDQsMTI1XSxbLTI1LDcsMzIsMTI2LCJsb3dlciJdLFsyNSw3LDMyLDEyN11dO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYHN0YW5kYXJkIHRhYmxlIEIuJHtlfSBkb2VzIG5vdCBleGlzdGApfWZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyl0W2VdPW5ldyBIdWZmbWFuTGluZSh0W2VdKTtyPW5ldyBIdWZmbWFuVGFibGUodCwhMCk7aFtlXT1yO3JldHVybiByfWZ1bmN0aW9uIFJlYWRlcihlLHQscil7dGhpcy5kYXRhPWU7dGhpcy5zdGFydD10O3RoaXMuZW5kPXI7dGhpcy5wb3NpdGlvbj10O3RoaXMuc2hpZnQ9LTE7dGhpcy5jdXJyZW50Qnl0ZT0wfVJlYWRlci5wcm90b3R5cGU9e3JlYWRCaXQoKXtpZih0aGlzLnNoaWZ0PDApe2lmKHRoaXMucG9zaXRpb24+PXRoaXMuZW5kKXRocm93IG5ldyBKYmlnMkVycm9yKCJlbmQgb2YgZGF0YSB3aGlsZSByZWFkaW5nIGJpdCIpO3RoaXMuY3VycmVudEJ5dGU9dGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107dGhpcy5zaGlmdD03fWNvbnN0IGU9dGhpcy5jdXJyZW50Qnl0ZT4+dGhpcy5zaGlmdCYxO3RoaXMuc2hpZnQtLTtyZXR1cm4gZX0scmVhZEJpdHMoZSl7bGV0IHQscj0wO2Zvcih0PWUtMTt0Pj0wO3QtLSlyfD10aGlzLnJlYWRCaXQoKTw8dDtyZXR1cm4gcn0sYnl0ZUFsaWduKCl7dGhpcy5zaGlmdD0tMX0sbmV4dCgpe3JldHVybiB0aGlzLnBvc2l0aW9uPj10aGlzLmVuZD8tMTp0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXX19O2Z1bmN0aW9uIGdldEN1c3RvbUh1ZmZtYW5UYWJsZShlLHQscil7bGV0IGE9MDtmb3IobGV0IGk9MCxuPXQubGVuZ3RoO2k8bjtpKyspe2NvbnN0IG49clt0W2ldXTtpZihuKXtpZihlPT09YSlyZXR1cm4gbjthKyt9fXRocm93IG5ldyBKYmlnMkVycm9yKCJjYW4ndCBmaW5kIGN1c3RvbSBIdWZmbWFuIHRhYmxlIil9ZnVuY3Rpb24gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChlLHQscil7Y29uc3QgYT1bXTtmb3IobGV0IGk9MDtpPHI7aSsrKXtjb25zdCByPW5ldyBVaW50OEFycmF5KHQpO2EucHVzaChyKTtmb3IobGV0IGE9MDthPHQ7YSsrKXJbYV09ZS5yZWFkQml0KCk7ZS5ieXRlQWxpZ24oKX1yZXR1cm4gYX1mdW5jdGlvbiBkZWNvZGVNTVJCaXRtYXAoZSx0LHIsYSl7Y29uc3QgaT17SzotMSxDb2x1bW5zOnQsUm93czpyLEJsYWNrSXMxOiEwLEVuZE9mQmxvY2s6YX0sbj1uZXcgcy5DQ0lUVEZheERlY29kZXIoZSxpKSxvPVtdO2xldCBjLGw9ITE7Zm9yKGxldCBlPTA7ZTxyO2UrKyl7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0KTtvLnB1c2goZSk7bGV0IHI9LTE7Zm9yKGxldCBhPTA7YTx0O2ErKyl7aWYocjwwKXtjPW4ucmVhZE5leHRDaGFyKCk7aWYoLTE9PT1jKXtjPTA7bD0hMH1yPTd9ZVthXT1jPj5yJjE7ci0tfX1pZihhJiYhbCl7Y29uc3QgZT01O2ZvcihsZXQgdD0wO3Q8ZSYmLTEhPT1uLnJlYWROZXh0Q2hhcigpO3QrKyk7fXJldHVybiBvfWZ1bmN0aW9uIEpiaWcySW1hZ2UoKXt9SmJpZzJJbWFnZS5wcm90b3R5cGU9e3BhcnNlQ2h1bmtzOmU9PmZ1bmN0aW9uIHBhcnNlSmJpZzJDaHVua3MoZSl7Zm9yKHZhciB0PW5ldyBTaW1wbGVTZWdtZW50VmlzaXRvcixyPTAsYT1lLmxlbmd0aDtyPGE7cisrKXt2YXIgaT1lW3JdO3Byb2Nlc3NTZWdtZW50cyhyZWFkU2VnbWVudHMoe30saS5kYXRhLGkuc3RhcnQsaS5lbmQpLHQpfXJldHVybiB0LmJ1ZmZlcn0oZSkscGFyc2UoZSl7Y29uc3R7aW1nRGF0YTp0LHdpZHRoOnIsaGVpZ2h0OmF9PWZ1bmN0aW9uIHBhcnNlSmJpZzIoZSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgcj0wO2lmKDE1MSE9PWVbcl18fDc0IT09ZVtyKzFdfHw2NiE9PWVbcisyXXx8NTAhPT1lW3IrM118fDEzIT09ZVtyKzRdfHwxMCE9PWVbcis1XXx8MjYhPT1lW3IrNl18fDEwIT09ZVtyKzddKXRocm93IG5ldyBKYmlnMkVycm9yKCJwYXJzZUpiaWcyIC0gaW52YWxpZCBoZWFkZXIuIik7Y29uc3QgYT1PYmplY3QuY3JlYXRlKG51bGwpO3IrPTg7Y29uc3Qgbj1lW3IrK107YS5yYW5kb21BY2Nlc3M9ISgxJm4pO2lmKCEoMiZuKSl7YS5udW1iZXJPZlBhZ2VzPSgwLGkucmVhZFVpbnQzMikoZSxyKTtyKz00fWNvbnN0IHM9cmVhZFNlZ21lbnRzKGEsZSxyLHQpLG89bmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yO3Byb2Nlc3NTZWdtZW50cyhzLG8pO2NvbnN0e3dpZHRoOmMsaGVpZ2h0Omx9PW8uY3VycmVudFBhZ2VJbmZvLGg9by5idWZmZXIsdT1uZXcgVWludDhDbGFtcGVkQXJyYXkoYypsKTtsZXQgZD0wLGY9MDtmb3IobGV0IGU9MDtlPGw7ZSsrKXtsZXQgZSx0PTA7Zm9yKGxldCByPTA7cjxjO3IrKyl7aWYoIXQpe3Q9MTI4O2U9aFtmKytdfXVbZCsrXT1lJnQ/MDoyNTU7dD4+PTF9fXJldHVybntpbWdEYXRhOnUsd2lkdGg6YyxoZWlnaHQ6bH19KGUpO3RoaXMud2lkdGg9cjt0aGlzLmhlaWdodD1hO3JldHVybiB0fX07cmV0dXJuIEpiaWcySW1hZ2V9KCk7dC5KYmlnMkltYWdlPW99LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQXJpdGhtZXRpY0RlY29kZXI9dm9pZCAwO2NvbnN0IGE9W3txZToyMjAxNyxubXBzOjEsbmxwczoxLHN3aXRjaEZsYWc6MX0se3FlOjEzMzEzLG5tcHM6MixubHBzOjYsc3dpdGNoRmxhZzowfSx7cWU6NjE0NSxubXBzOjMsbmxwczo5LHN3aXRjaEZsYWc6MH0se3FlOjI3NTMsbm1wczo0LG5scHM6MTIsc3dpdGNoRmxhZzowfSx7cWU6MTMxMyxubXBzOjUsbmxwczoyOSxzd2l0Y2hGbGFnOjB9LHtxZTo1NDUsbm1wczozOCxubHBzOjMzLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6NyxubHBzOjYsc3dpdGNoRmxhZzoxfSx7cWU6MjE1MDUsbm1wczo4LG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MTg0MzMsbm1wczo5LG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MTQzMzcsbm1wczoxMCxubHBzOjE0LHN3aXRjaEZsYWc6MH0se3FlOjEyMjg5LG5tcHM6MTEsbmxwczoxNyxzd2l0Y2hGbGFnOjB9LHtxZTo5MjE3LG5tcHM6MTIsbmxwczoxOCxzd2l0Y2hGbGFnOjB9LHtxZTo3MTY5LG5tcHM6MTMsbmxwczoyMCxzd2l0Y2hGbGFnOjB9LHtxZTo1NjMzLG5tcHM6MjksbmxwczoyMSxzd2l0Y2hGbGFnOjB9LHtxZToyMjAxNyxubXBzOjE1LG5scHM6MTQsc3dpdGNoRmxhZzoxfSx7cWU6MjE1MDUsbm1wczoxNixubHBzOjE0LHN3aXRjaEZsYWc6MH0se3FlOjIwNzM3LG5tcHM6MTcsbmxwczoxNSxzd2l0Y2hGbGFnOjB9LHtxZToxODQzMyxubXBzOjE4LG5scHM6MTYsc3dpdGNoRmxhZzowfSx7cWU6MTQzMzcsbm1wczoxOSxubHBzOjE3LHN3aXRjaEZsYWc6MH0se3FlOjEzMzEzLG5tcHM6MjAsbmxwczoxOCxzd2l0Y2hGbGFnOjB9LHtxZToxMjI4OSxubXBzOjIxLG5scHM6MTksc3dpdGNoRmxhZzowfSx7cWU6MTAyNDEsbm1wczoyMixubHBzOjE5LHN3aXRjaEZsYWc6MH0se3FlOjkyMTcsbm1wczoyMyxubHBzOjIwLHN3aXRjaEZsYWc6MH0se3FlOjg3MDUsbm1wczoyNCxubHBzOjIxLHN3aXRjaEZsYWc6MH0se3FlOjcxNjksbm1wczoyNSxubHBzOjIyLHN3aXRjaEZsYWc6MH0se3FlOjYxNDUsbm1wczoyNixubHBzOjIzLHN3aXRjaEZsYWc6MH0se3FlOjU2MzMsbm1wczoyNyxubHBzOjI0LHN3aXRjaEZsYWc6MH0se3FlOjUxMjEsbm1wczoyOCxubHBzOjI1LHN3aXRjaEZsYWc6MH0se3FlOjQ2MDksbm1wczoyOSxubHBzOjI2LHN3aXRjaEZsYWc6MH0se3FlOjQzNTMsbm1wczozMCxubHBzOjI3LHN3aXRjaEZsYWc6MH0se3FlOjI3NTMsbm1wczozMSxubHBzOjI4LHN3aXRjaEZsYWc6MH0se3FlOjI0OTcsbm1wczozMixubHBzOjI5LHN3aXRjaEZsYWc6MH0se3FlOjIyMDksbm1wczozMyxubHBzOjMwLHN3aXRjaEZsYWc6MH0se3FlOjEzMTMsbm1wczozNCxubHBzOjMxLHN3aXRjaEZsYWc6MH0se3FlOjEwODksbm1wczozNSxubHBzOjMyLHN3aXRjaEZsYWc6MH0se3FlOjY3MyxubXBzOjM2LG5scHM6MzMsc3dpdGNoRmxhZzowfSx7cWU6NTQ1LG5tcHM6MzcsbmxwczozNCxzd2l0Y2hGbGFnOjB9LHtxZTozMjEsbm1wczozOCxubHBzOjM1LHN3aXRjaEZsYWc6MH0se3FlOjI3MyxubXBzOjM5LG5scHM6MzYsc3dpdGNoRmxhZzowfSx7cWU6MTMzLG5tcHM6NDAsbmxwczozNyxzd2l0Y2hGbGFnOjB9LHtxZTo3MyxubXBzOjQxLG5scHM6Mzgsc3dpdGNoRmxhZzowfSx7cWU6Mzcsbm1wczo0MixubHBzOjM5LHN3aXRjaEZsYWc6MH0se3FlOjIxLG5tcHM6NDMsbmxwczo0MCxzd2l0Y2hGbGFnOjB9LHtxZTo5LG5tcHM6NDQsbmxwczo0MSxzd2l0Y2hGbGFnOjB9LHtxZTo1LG5tcHM6NDUsbmxwczo0Mixzd2l0Y2hGbGFnOjB9LHtxZToxLG5tcHM6NDUsbmxwczo0Myxzd2l0Y2hGbGFnOjB9LHtxZToyMjAxNyxubXBzOjQ2LG5scHM6NDYsc3dpdGNoRmxhZzowfV07dC5Bcml0aG1ldGljRGVjb2Rlcj1jbGFzcyBBcml0aG1ldGljRGVjb2Rlcntjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5kYXRhPWU7dGhpcy5icD10O3RoaXMuZGF0YUVuZD1yO3RoaXMuY2hpZ2g9ZVt0XTt0aGlzLmNsb3c9MDt0aGlzLmJ5dGVJbigpO3RoaXMuY2hpZ2g9dGhpcy5jaGlnaDw8NyY2NTUzNXx0aGlzLmNsb3c+PjkmMTI3O3RoaXMuY2xvdz10aGlzLmNsb3c8PDcmNjU1MzU7dGhpcy5jdC09Nzt0aGlzLmE9MzI3Njh9Ynl0ZUluKCl7Y29uc3QgZT10aGlzLmRhdGE7bGV0IHQ9dGhpcy5icDtpZigyNTU9PT1lW3RdKWlmKGVbdCsxXT4xNDMpe3RoaXMuY2xvdys9NjUyODA7dGhpcy5jdD04fWVsc2V7dCsrO3RoaXMuY2xvdys9ZVt0XTw8OTt0aGlzLmN0PTc7dGhpcy5icD10fWVsc2V7dCsrO3RoaXMuY2xvdys9dDx0aGlzLmRhdGFFbmQ/ZVt0XTw8ODo2NTI4MDt0aGlzLmN0PTg7dGhpcy5icD10fWlmKHRoaXMuY2xvdz42NTUzNSl7dGhpcy5jaGlnaCs9dGhpcy5jbG93Pj4xNjt0aGlzLmNsb3cmPTY1NTM1fX1yZWFkQml0KGUsdCl7bGV0IHI9ZVt0XT4+MSxpPTEmZVt0XTtjb25zdCBuPWFbcl0scz1uLnFlO2xldCBvLGM9dGhpcy5hLXM7aWYodGhpcy5jaGlnaDxzKWlmKGM8cyl7Yz1zO289aTtyPW4ubm1wc31lbHNle2M9cztvPTFeaTsxPT09bi5zd2l0Y2hGbGFnJiYoaT1vKTtyPW4ubmxwc31lbHNle3RoaXMuY2hpZ2gtPXM7aWYoMCE9KDMyNzY4JmMpKXt0aGlzLmE9YztyZXR1cm4gaX1pZihjPHMpe289MV5pOzE9PT1uLnN3aXRjaEZsYWcmJihpPW8pO3I9bi5ubHBzfWVsc2V7bz1pO3I9bi5ubXBzfX1kb3swPT09dGhpcy5jdCYmdGhpcy5ieXRlSW4oKTtjPDw9MTt0aGlzLmNoaWdoPXRoaXMuY2hpZ2g8PDEmNjU1MzV8dGhpcy5jbG93Pj4xNSYxO3RoaXMuY2xvdz10aGlzLmNsb3c8PDEmNjU1MzU7dGhpcy5jdC0tfXdoaWxlKDA9PSgzMjc2OCZjKSk7dGhpcy5hPWM7ZVt0XT1yPDwxfGk7cmV0dXJuIG99fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5KcGVnU3RyZWFtPXZvaWQgMDt2YXIgYT1yKDEyKSxpPXIoNSksbj1yKDE5KSxzPXIoMik7Y29uc3Qgbz1mdW5jdGlvbiBKcGVnU3RyZWFtQ2xvc3VyZSgpe2Z1bmN0aW9uIEpwZWdTdHJlYW0oZSx0LHIsaSl7bGV0IG47Zm9yKDstMSE9PShuPWUuZ2V0Qnl0ZSgpKTspaWYoMjU1PT09bil7ZS5za2lwKC0xKTticmVha310aGlzLnN0cmVhbT1lO3RoaXMubWF5YmVMZW5ndGg9dDt0aGlzLmRpY3Q9cjt0aGlzLnBhcmFtcz1pO2EuRGVjb2RlU3RyZWFtLmNhbGwodGhpcyx0KX1KcGVnU3RyZWFtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGEuRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEpwZWdTdHJlYW0ucHJvdG90eXBlLCJieXRlcyIse2dldDpmdW5jdGlvbiBKcGVnU3RyZWFtX2J5dGVzKCl7cmV0dXJuKDAscy5zaGFkb3cpKHRoaXMsImJ5dGVzIix0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSl9LGNvbmZpZ3VyYWJsZTohMH0pO0pwZWdTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlcj1mdW5jdGlvbihlKXt9O0pwZWdTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbigpe2lmKHRoaXMuZW9mKXJldHVybjtjb25zdCBlPXtkZWNvZGVUcmFuc2Zvcm06dm9pZCAwLGNvbG9yVHJhbnNmb3JtOnZvaWQgMH0sdD10aGlzLmRpY3QuZ2V0QXJyYXkoIkRlY29kZSIsIkQiKTtpZih0aGlzLmZvcmNlUkdCJiZBcnJheS5pc0FycmF5KHQpKXtjb25zdCByPXRoaXMuZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiKXx8OCxhPXQubGVuZ3RoLGk9bmV3IEludDMyQXJyYXkoYSk7bGV0IG49ITE7Y29uc3Qgcz0oMTw8ciktMTtmb3IobGV0IGU9MDtlPGE7ZSs9Mil7aVtlXT0yNTYqKHRbZSsxXS10W2VdKXwwO2lbZSsxXT10W2VdKnN8MDsyNTY9PT1pW2VdJiYwPT09aVtlKzFdfHwobj0hMCl9biYmKGUuZGVjb2RlVHJhbnNmb3JtPWkpfWlmKCgwLGkuaXNEaWN0KSh0aGlzLnBhcmFtcykpe2NvbnN0IHQ9dGhpcy5wYXJhbXMuZ2V0KCJDb2xvclRyYW5zZm9ybSIpO051bWJlci5pc0ludGVnZXIodCkmJihlLmNvbG9yVHJhbnNmb3JtPXQpfWNvbnN0IHI9bmV3IG4uSnBlZ0ltYWdlKGUpO3IucGFyc2UodGhpcy5ieXRlcyk7Y29uc3QgYT1yLmdldERhdGEoe3dpZHRoOnRoaXMuZHJhd1dpZHRoLGhlaWdodDp0aGlzLmRyYXdIZWlnaHQsZm9yY2VSR0I6dGhpcy5mb3JjZVJHQixpc1NvdXJjZVBERjohMH0pO3RoaXMuYnVmZmVyPWE7dGhpcy5idWZmZXJMZW5ndGg9YS5sZW5ndGg7dGhpcy5lb2Y9ITB9O3JldHVybiBKcGVnU3RyZWFtfSgpO3QuSnBlZ1N0cmVhbT1vfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkpwZWdJbWFnZT12b2lkIDA7dmFyIGE9cigyKSxpPXIoOCk7Y2xhc3MgSnBlZ0Vycm9yIGV4dGVuZHMgYS5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKCJKUEVHIGVycm9yOiAiK2UpfX1jbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIGEuQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpO3RoaXMuc2NhbkxpbmVzPXR9fWNsYXNzIEVPSU1hcmtlckVycm9yIGV4dGVuZHMgYS5CYXNlRXhjZXB0aW9ue312YXIgbj1mdW5jdGlvbiBKcGVnSW1hZ2VDbG9zdXJlKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoWzAsMSw4LDE2LDksMiwzLDEwLDE3LDI0LDMyLDI1LDE4LDExLDQsNSwxMiwxOSwyNiwzMyw0MCw0OCw0MSwzNCwyNywyMCwxMyw2LDcsMTQsMjEsMjgsMzUsNDIsNDksNTYsNTcsNTAsNDMsMzYsMjksMjIsMTUsMjMsMzAsMzcsNDQsNTEsNTgsNTksNTIsNDUsMzgsMzEsMzksNDYsNTMsNjAsNjEsNTQsNDcsNTUsNjIsNjNdKTtmdW5jdGlvbiBKcGVnSW1hZ2Uoe2RlY29kZVRyYW5zZm9ybTplPW51bGwsY29sb3JUcmFuc2Zvcm06dD0tMX09e30pe3RoaXMuX2RlY29kZVRyYW5zZm9ybT1lO3RoaXMuX2NvbG9yVHJhbnNmb3JtPXR9ZnVuY3Rpb24gYnVpbGRIdWZmbWFuVGFibGUoZSx0KXtmb3IodmFyIHIsYSxpPTAsbj1bXSxzPTE2O3M+MCYmIWVbcy0xXTspcy0tO24ucHVzaCh7Y2hpbGRyZW46W10saW5kZXg6MH0pO3ZhciBvLGM9blswXTtmb3Iocj0wO3I8cztyKyspe2ZvcihhPTA7YTxlW3JdO2ErKyl7KGM9bi5wb3AoKSkuY2hpbGRyZW5bYy5pbmRleF09dFtpXTtmb3IoO2MuaW5kZXg+MDspYz1uLnBvcCgpO2MuaW5kZXgrKztuLnB1c2goYyk7Zm9yKDtuLmxlbmd0aDw9cjspe24ucHVzaChvPXtjaGlsZHJlbjpbXSxpbmRleDowfSk7Yy5jaGlsZHJlbltjLmluZGV4XT1vLmNoaWxkcmVuO2M9b31pKyt9aWYocisxPHMpe24ucHVzaChvPXtjaGlsZHJlbjpbXSxpbmRleDowfSk7Yy5jaGlsZHJlbltjLmluZGV4XT1vLmNoaWxkcmVuO2M9b319cmV0dXJuIG5bMF0uY2hpbGRyZW59ZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoZSx0LHIpe3JldHVybiA2NCooKGUuYmxvY2tzUGVyTGluZSsxKSp0K3IpfWZ1bmN0aW9uIGRlY29kZVNjYW4odCxyLG4scyxvLGMsbCxoLHUsZD0hMSl7dmFyIGY9bi5tY3VzUGVyTGluZSxnPW4ucHJvZ3Jlc3NpdmU7Y29uc3QgbT1yO2xldCBwPTAsYj0wO2Z1bmN0aW9uIHJlYWRCaXQoKXtpZihiPjApe2ItLTtyZXR1cm4gcD4+YiYxfXA9dFtyKytdO2lmKDI1NT09PXApe3ZhciBlPXRbcisrXTtpZihlKXtpZigyMjA9PT1lJiZkKXtyKz0yO2NvbnN0IGU9KDAsaS5yZWFkVWludDE2KSh0LHIpO3IrPTI7aWYoZT4wJiZlIT09bi5zY2FuTGluZXMpdGhyb3cgbmV3IEROTE1hcmtlckVycm9yKCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIixlKX1lbHNlIGlmKDIxNz09PWUpe2lmKGQpe2NvbnN0IGU9ayooOD09PW4ucHJlY2lzaW9uPzg6MCk7aWYoZT4wJiZNYXRoLnJvdW5kKG4uc2NhbkxpbmVzL2UpPj0xMCl0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEsIHBvc3NpYmx5IGNhdXNlZCBieSBpbmNvcnJlY3QgYHNjYW5MaW5lc2AgcGFyYW1ldGVyIixlKX10aHJvdyBuZXcgRU9JTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiKX10aHJvdyBuZXcgSnBlZ0Vycm9yKCJ1bmV4cGVjdGVkIG1hcmtlciAiKyhwPDw4fGUpLnRvU3RyaW5nKDE2KSl9fWI9NztyZXR1cm4gcD4+Pjd9ZnVuY3Rpb24gZGVjb2RlSHVmZm1hbihlKXtmb3IodmFyIHQ9ZTs7KXtzd2l0Y2godHlwZW9mKHQ9dFtyZWFkQml0KCldKSl7Y2FzZSJudW1iZXIiOnJldHVybiB0O2Nhc2Uib2JqZWN0Ijpjb250aW51ZX10aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIGh1ZmZtYW4gc2VxdWVuY2UiKX19ZnVuY3Rpb24gcmVjZWl2ZShlKXtmb3IodmFyIHQ9MDtlPjA7KXt0PXQ8PDF8cmVhZEJpdCgpO2UtLX1yZXR1cm4gdH1mdW5jdGlvbiByZWNlaXZlQW5kRXh0ZW5kKGUpe2lmKDE9PT1lKXJldHVybiAxPT09cmVhZEJpdCgpPzE6LTE7dmFyIHQ9cmVjZWl2ZShlKTtyZXR1cm4gdD49MTw8ZS0xP3Q6dCsoLTE8PGUpKzF9dmFyIHk9MDt2YXIgdix3PTA7bGV0IGs9MDtmdW5jdGlvbiBkZWNvZGVNY3UoZSx0LHIsYSxpKXt2YXIgbj1yJWY7az0oci9mfDApKmUudithO3ZhciBzPW4qZS5oK2k7dChlLGdldEJsb2NrQnVmZmVyT2Zmc2V0KGUsayxzKSl9ZnVuY3Rpb24gZGVjb2RlQmxvY2soZSx0LHIpe2s9ci9lLmJsb2Nrc1BlckxpbmV8MDt2YXIgYT1yJWUuYmxvY2tzUGVyTGluZTt0KGUsZ2V0QmxvY2tCdWZmZXJPZmZzZXQoZSxrLGEpKX12YXIgUyxDLHgsQSxULEksRj1zLmxlbmd0aDtJPWc/MD09PWM/MD09PWg/ZnVuY3Rpb24gZGVjb2RlRENGaXJzdChlLHQpe3ZhciByPWRlY29kZUh1ZmZtYW4oZS5odWZmbWFuVGFibGVEQyksYT0wPT09cj8wOnJlY2VpdmVBbmRFeHRlbmQocik8PHU7ZS5ibG9ja0RhdGFbdF09ZS5wcmVkKz1hfTpmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoZSx0KXtlLmJsb2NrRGF0YVt0XXw9cmVhZEJpdCgpPDx1fTowPT09aD9mdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KHQscil7aWYoeT4wKXktLTtlbHNlIGZvcih2YXIgYT1jLGk9bDthPD1pOyl7dmFyIG49ZGVjb2RlSHVmZm1hbih0Lmh1ZmZtYW5UYWJsZUFDKSxzPTE1Jm4sbz1uPj40O2lmKDAhPT1zKXt2YXIgaD1lW2ErPW9dO3QuYmxvY2tEYXRhW3IraF09cmVjZWl2ZUFuZEV4dGVuZChzKSooMTw8dSk7YSsrfWVsc2V7aWYobzwxNSl7eT1yZWNlaXZlKG8pKygxPDxvKS0xO2JyZWFrfWErPTE2fX19OmZ1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZSh0LHIpe2Zvcih2YXIgYSxpLG49YyxzPWwsbz0wO248PXM7KXtjb25zdCBzPXIrZVtuXSxjPXQuYmxvY2tEYXRhW3NdPDA/LTE6MTtzd2l0Y2godyl7Y2FzZSAwOm89KGk9ZGVjb2RlSHVmZm1hbih0Lmh1ZmZtYW5UYWJsZUFDKSk+PjQ7aWYoMD09PShhPTE1JmkpKWlmKG88MTUpe3k9cmVjZWl2ZShvKSsoMTw8byk7dz00fWVsc2V7bz0xNjt3PTF9ZWxzZXtpZigxIT09YSl0aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIEFDbiBlbmNvZGluZyIpO3Y9cmVjZWl2ZUFuZEV4dGVuZChhKTt3PW8/MjozfWNvbnRpbnVlO2Nhc2UgMTpjYXNlIDI6dC5ibG9ja0RhdGFbc10/dC5ibG9ja0RhdGFbc10rPWMqKHJlYWRCaXQoKTw8dSk6MD09PS0tbyYmKHc9Mj09PXc/MzowKTticmVhaztjYXNlIDM6aWYodC5ibG9ja0RhdGFbc10pdC5ibG9ja0RhdGFbc10rPWMqKHJlYWRCaXQoKTw8dSk7ZWxzZXt0LmJsb2NrRGF0YVtzXT12PDx1O3c9MH1icmVhaztjYXNlIDQ6dC5ibG9ja0RhdGFbc10mJih0LmJsb2NrRGF0YVtzXSs9YyoocmVhZEJpdCgpPDx1KSl9bisrfTQ9PT13JiYwPT09LS15JiYodz0wKX06ZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUodCxyKXt2YXIgYT1kZWNvZGVIdWZmbWFuKHQuaHVmZm1hblRhYmxlREMpLGk9MD09PWE/MDpyZWNlaXZlQW5kRXh0ZW5kKGEpO3QuYmxvY2tEYXRhW3JdPXQucHJlZCs9aTtmb3IodmFyIG49MTtuPDY0Oyl7dmFyIHM9ZGVjb2RlSHVmZm1hbih0Lmh1ZmZtYW5UYWJsZUFDKSxvPTE1JnMsYz1zPj40O2lmKDAhPT1vKXt2YXIgbD1lW24rPWNdO3QuYmxvY2tEYXRhW3IrbF09cmVjZWl2ZUFuZEV4dGVuZChvKTtuKyt9ZWxzZXtpZihjPDE1KWJyZWFrO24rPTE2fX19O3ZhciBQLEUsQixPLE09MDtFPTE9PT1GP3NbMF0uYmxvY2tzUGVyTGluZSpzWzBdLmJsb2Nrc1BlckNvbHVtbjpmKm4ubWN1c1BlckNvbHVtbjtmb3IoO008PUU7KXt2YXIgRD1vP01hdGgubWluKEUtTSxvKTpFO2lmKEQ+MCl7Zm9yKEM9MDtDPEY7QysrKXNbQ10ucHJlZD0wO3k9MDtpZigxPT09Ril7Uz1zWzBdO2ZvcihUPTA7VDxEO1QrKyl7ZGVjb2RlQmxvY2soUyxJLE0pO00rK319ZWxzZSBmb3IoVD0wO1Q8RDtUKyspe2ZvcihDPTA7QzxGO0MrKyl7Qj0oUz1zW0NdKS5oO089Uy52O2Zvcih4PTA7eDxPO3grKylmb3IoQT0wO0E8QjtBKyspZGVjb2RlTWN1KFMsSSxNLHgsQSl9TSsrfX1iPTA7aWYoIShQPWZpbmROZXh0RmlsZU1hcmtlcih0LHIpKSlicmVhaztpZihQLmludmFsaWQpe2NvbnN0IGU9RD4wPyJ1bmV4cGVjdGVkIjoiZXhjZXNzaXZlIjsoMCxhLndhcm4pKGBkZWNvZGVTY2FuIC0gJHtlfSBNQ1UgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICR7UC5pbnZhbGlkfWApO3I9UC5vZmZzZXR9aWYoIShQLm1hcmtlcj49NjU0ODgmJlAubWFya2VyPD02NTQ5NSkpYnJlYWs7cis9Mn1yZXR1cm4gci1tfWZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZShlLHQscil7dmFyIGEsaSxuLHMsbyxjLGwsaCx1LGQsZixnLG0scCxiLHksdix3PWUucXVhbnRpemF0aW9uVGFibGUsaz1lLmJsb2NrRGF0YTtpZighdyl0aHJvdyBuZXcgSnBlZ0Vycm9yKCJtaXNzaW5nIHJlcXVpcmVkIFF1YW50aXphdGlvbiBUYWJsZS4iKTtmb3IodmFyIFM9MDtTPDY0O1MrPTgpe3U9a1t0K1NdO2Q9a1t0K1MrMV07Zj1rW3QrUysyXTtnPWtbdCtTKzNdO209a1t0K1MrNF07cD1rW3QrUys1XTtiPWtbdCtTKzZdO3k9a1t0K1MrN107dSo9d1tTXTtpZigwIT0oZHxmfGd8bXxwfGJ8eSkpe2QqPXdbUysxXTtmKj13W1MrMl07Zyo9d1tTKzNdO20qPXdbUys0XTtwKj13W1MrNV07aT0oYT0oYT01NzkzKnUrMTI4Pj44KSsoaT01NzkzKm0rMTI4Pj44KSsxPj4xKS1pO3Y9Mzc4NCoobj1mKSsxNTY3KihzPWIqPXdbUys2XSkrMTI4Pj44O249MTU2NypuLTM3ODQqcysxMjg+Pjg7bD0obz0obz0yODk2KihkLSh5Kj13W1MrN10pKSsxMjg+PjgpKyhsPXA8PDQpKzE+PjEpLWw7Yz0oaD0oaD0yODk2KihkK3kpKzEyOD4+OCkrKGM9Zzw8NCkrMT4+MSktYztzPShhPWErKHM9dikrMT4+MSktcztuPShpPWkrbisxPj4xKS1uO3Y9MjI3NipvKzM0MDYqaCsyMDQ4Pj4xMjtvPTM0MDYqby0yMjc2KmgrMjA0OD4+MTI7aD12O3Y9Nzk5KmMrNDAxNypsKzIwNDg+PjEyO2M9NDAxNypjLTc5OSpsKzIwNDg+PjEyO2w9djtyW1NdPWEraDtyW1MrN109YS1oO3JbUysxXT1pK2w7cltTKzZdPWktbDtyW1MrMl09bitjO3JbUys1XT1uLWM7cltTKzNdPXMrbztyW1MrNF09cy1vfWVsc2V7dj01NzkzKnUrNTEyPj4xMDtyW1NdPXY7cltTKzFdPXY7cltTKzJdPXY7cltTKzNdPXY7cltTKzRdPXY7cltTKzVdPXY7cltTKzZdPXY7cltTKzddPXZ9fWZvcih2YXIgQz0wO0M8ODsrK0Mpe3U9cltDXTtpZigwIT0oKGQ9cltDKzhdKXwoZj1yW0MrMTZdKXwoZz1yW0MrMjRdKXwobT1yW0MrMzJdKXwocD1yW0MrNDBdKXwoYj1yW0MrNDhdKXwoeT1yW0MrNTZdKSkpe2k9KGE9NDExMisoKGE9NTc5Myp1KzIwNDg+PjEyKSsoaT01NzkzKm0rMjA0OD4+MTIpKzE+PjEpKS1pO3Y9Mzc4NCoobj1mKSsxNTY3KihzPWIpKzIwNDg+PjEyO249MTU2NypuLTM3ODQqcysyMDQ4Pj4xMjtzPXY7bD0obz0obz0yODk2KihkLXkpKzIwNDg+PjEyKSsobD1wKSsxPj4xKS1sO2M9KGg9KGg9Mjg5NiooZCt5KSsyMDQ4Pj4xMikrKGM9ZykrMT4+MSktYzt2PTIyNzYqbyszNDA2KmgrMjA0OD4+MTI7bz0zNDA2Km8tMjI3NipoKzIwNDg+PjEyO2g9djt2PTc5OSpjKzQwMTcqbCsyMDQ4Pj4xMjtjPTQwMTcqYy03OTkqbCsyMDQ4Pj4xMjsodT0oYT1hK3MrMT4+MSkraCk8MTY/dT0wOnU+PTQwODA/dT0yNTU6dT4+PTQ7KGQ9KGk9aStuKzE+PjEpKyhsPXYpKTwxNj9kPTA6ZD49NDA4MD9kPTI1NTpkPj49NDsoZj0obj1pLW4pK2MpPDE2P2Y9MDpmPj00MDgwP2Y9MjU1OmY+Pj00OyhnPShzPWEtcykrbyk8MTY/Zz0wOmc+PTQwODA/Zz0yNTU6Zz4+PTQ7KG09cy1vKTwxNj9tPTA6bT49NDA4MD9tPTI1NTptPj49NDsocD1uLWMpPDE2P3A9MDpwPj00MDgwP3A9MjU1OnA+Pj00OyhiPWktbCk8MTY/Yj0wOmI+PTQwODA/Yj0yNTU6Yj4+PTQ7KHk9YS1oKTwxNj95PTA6eT49NDA4MD95PTI1NTp5Pj49NDtrW3QrQ109dTtrW3QrQys4XT1kO2tbdCtDKzE2XT1mO2tbdCtDKzI0XT1nO2tbdCtDKzMyXT1tO2tbdCtDKzQwXT1wO2tbdCtDKzQ4XT1iO2tbdCtDKzU2XT15fWVsc2V7dj0odj01NzkzKnUrODE5Mj4+MTQpPC0yMDQwPzA6dj49MjAyND8yNTU6disyMDU2Pj40O2tbdCtDXT12O2tbdCtDKzhdPXY7a1t0K0MrMTZdPXY7a1t0K0MrMjRdPXY7a1t0K0MrMzJdPXY7a1t0K0MrNDBdPXY7a1t0K0MrNDhdPXY7a1t0K0MrNTZdPXZ9fX1mdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoZSx0KXtmb3IodmFyIHI9dC5ibG9ja3NQZXJMaW5lLGE9dC5ibG9ja3NQZXJDb2x1bW4saT1uZXcgSW50MTZBcnJheSg2NCksbj0wO248YTtuKyspZm9yKHZhciBzPTA7czxyO3MrKyl7cXVhbnRpemVBbmRJbnZlcnNlKHQsZ2V0QmxvY2tCdWZmZXJPZmZzZXQodCxuLHMpLGkpfXJldHVybiB0LmJsb2NrRGF0YX1mdW5jdGlvbiBmaW5kTmV4dEZpbGVNYXJrZXIoZSx0LHI9dCl7Y29uc3QgYT1lLmxlbmd0aC0xO3ZhciBuPXI8dD9yOnQ7aWYodD49YSlyZXR1cm4gbnVsbDt2YXIgcz0oMCxpLnJlYWRVaW50MTYpKGUsdCk7aWYocz49NjU0NzImJnM8PTY1NTM0KXJldHVybntpbnZhbGlkOm51bGwsbWFya2VyOnMsb2Zmc2V0OnR9O2Zvcih2YXIgbz0oMCxpLnJlYWRVaW50MTYpKGUsbik7IShvPj02NTQ3MiYmbzw9NjU1MzQpOyl7aWYoKytuPj1hKXJldHVybiBudWxsO289KDAsaS5yZWFkVWludDE2KShlLG4pfXJldHVybntpbnZhbGlkOnMudG9TdHJpbmcoMTYpLG1hcmtlcjpvLG9mZnNldDpufX1KcGVnSW1hZ2UucHJvdG90eXBlPXtwYXJzZSh0LHtkbmxTY2FuTGluZXM6cj1udWxsfT17fSl7ZnVuY3Rpb24gcmVhZERhdGFCbG9jaygpe2NvbnN0IGU9KDAsaS5yZWFkVWludDE2KSh0LG8pO2xldCByPShvKz0yKStlLTI7dmFyIG49ZmluZE5leHRGaWxlTWFya2VyKHQscixvKTtpZihuJiZuLmludmFsaWQpeygwLGEud2FybikoInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIituLmludmFsaWQpO3I9bi5vZmZzZXR9dmFyIHM9dC5zdWJhcnJheShvLHIpO28rPXMubGVuZ3RoO3JldHVybiBzfWZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGUpe2Zvcih2YXIgdD1NYXRoLmNlaWwoZS5zYW1wbGVzUGVyTGluZS84L2UubWF4SCkscj1NYXRoLmNlaWwoZS5zY2FuTGluZXMvOC9lLm1heFYpLGE9MDthPGUuY29tcG9uZW50cy5sZW5ndGg7YSsrKXtNPWUuY29tcG9uZW50c1thXTt2YXIgaT1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2FtcGxlc1BlckxpbmUvOCkqTS5oL2UubWF4SCksbj1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2NhbkxpbmVzLzgpKk0udi9lLm1heFYpLHM9dCpNLmgsbz02NCoocipNLnYpKihzKzEpO00uYmxvY2tEYXRhPW5ldyBJbnQxNkFycmF5KG8pO00uYmxvY2tzUGVyTGluZT1pO00uYmxvY2tzUGVyQ29sdW1uPW59ZS5tY3VzUGVyTGluZT10O2UubWN1c1BlckNvbHVtbj1yfXZhciBuLHMsbz0wLGM9bnVsbCxsPW51bGw7bGV0IGg9MDt2YXIgdT1bXSxkPVtdLGY9W107bGV0IGc9KDAsaS5yZWFkVWludDE2KSh0LG8pO28rPTI7aWYoNjU0OTYhPT1nKXRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTtnPSgwLGkucmVhZFVpbnQxNikodCxvKTtvKz0yO2U6Zm9yKDs2NTQ5NyE9PWc7KXt2YXIgbSxwLGI7c3dpdGNoKGcpe2Nhc2UgNjU1MDQ6Y2FzZSA2NTUwNTpjYXNlIDY1NTA2OmNhc2UgNjU1MDc6Y2FzZSA2NTUwODpjYXNlIDY1NTA5OmNhc2UgNjU1MTA6Y2FzZSA2NTUxMTpjYXNlIDY1NTEyOmNhc2UgNjU1MTM6Y2FzZSA2NTUxNDpjYXNlIDY1NTE1OmNhc2UgNjU1MTY6Y2FzZSA2NTUxNzpjYXNlIDY1NTE4OmNhc2UgNjU1MTk6Y2FzZSA2NTUzNDp2YXIgeT1yZWFkRGF0YUJsb2NrKCk7NjU1MDQ9PT1nJiY3ND09PXlbMF0mJjcwPT09eVsxXSYmNzM9PT15WzJdJiY3MD09PXlbM10mJjA9PT15WzRdJiYoYz17dmVyc2lvbjp7bWFqb3I6eVs1XSxtaW5vcjp5WzZdfSxkZW5zaXR5VW5pdHM6eVs3XSx4RGVuc2l0eTp5WzhdPDw4fHlbOV0seURlbnNpdHk6eVsxMF08PDh8eVsxMV0sdGh1bWJXaWR0aDp5WzEyXSx0aHVtYkhlaWdodDp5WzEzXSx0aHVtYkRhdGE6eS5zdWJhcnJheSgxNCwxNCszKnlbMTJdKnlbMTNdKX0pOzY1NTE4PT09ZyYmNjU9PT15WzBdJiYxMDA9PT15WzFdJiYxMTE9PT15WzJdJiY5OD09PXlbM10mJjEwMT09PXlbNF0mJihsPXt2ZXJzaW9uOnlbNV08PDh8eVs2XSxmbGFnczA6eVs3XTw8OHx5WzhdLGZsYWdzMTp5WzldPDw4fHlbMTBdLHRyYW5zZm9ybUNvZGU6eVsxMV19KTticmVhaztjYXNlIDY1NDk5OmZvcih2YXIgdj0oMCxpLnJlYWRVaW50MTYpKHQsbykrKG8rPTIpLTI7bzx2Oyl7dmFyIHc9dFtvKytdLGs9bmV3IFVpbnQxNkFycmF5KDY0KTtpZih3Pj40PT0wKWZvcihwPTA7cDw2NDtwKyspa1tlW3BdXT10W28rK107ZWxzZXtpZih3Pj40IT0xKXRocm93IG5ldyBKcGVnRXJyb3IoIkRRVCAtIGludmFsaWQgdGFibGUgc3BlYyIpO2ZvcihwPTA7cDw2NDtwKyspe2tbZVtwXV09KDAsaS5yZWFkVWludDE2KSh0LG8pO28rPTJ9fXVbMTUmd109a31icmVhaztjYXNlIDY1NDcyOmNhc2UgNjU0NzM6Y2FzZSA2NTQ3NDppZihuKXRocm93IG5ldyBKcGVnRXJyb3IoIk9ubHkgc2luZ2xlIGZyYW1lIEpQRUdzIHN1cHBvcnRlZCIpO28rPTI7KG49e30pLmV4dGVuZGVkPTY1NDczPT09ZztuLnByb2dyZXNzaXZlPTY1NDc0PT09ZztuLnByZWNpc2lvbj10W28rK107Y29uc3QgSD0oMCxpLnJlYWRVaW50MTYpKHQsbyk7bys9MjtuLnNjYW5MaW5lcz1yfHxIO24uc2FtcGxlc1BlckxpbmU9KDAsaS5yZWFkVWludDE2KSh0LG8pO28rPTI7bi5jb21wb25lbnRzPVtdO24uY29tcG9uZW50SWRzPXt9O3ZhciBTLEM9dFtvKytdLHg9MCxBPTA7Zm9yKG09MDttPEM7bSsrKXtTPXRbb107dmFyIFQ9dFtvKzFdPj40LEk9MTUmdFtvKzFdO3g8VCYmKHg9VCk7QTxJJiYoQT1JKTt2YXIgRj10W28rMl07Yj1uLmNvbXBvbmVudHMucHVzaCh7aDpULHY6SSxxdWFudGl6YXRpb25JZDpGLHF1YW50aXphdGlvblRhYmxlOm51bGx9KTtuLmNvbXBvbmVudElkc1tTXT1iLTE7bys9M31uLm1heEg9eDtuLm1heFY9QTtwcmVwYXJlQ29tcG9uZW50cyhuKTticmVhaztjYXNlIDY1NDc2OmNvbnN0IHo9KDAsaS5yZWFkVWludDE2KSh0LG8pO28rPTI7Zm9yKG09MjttPHo7KXt2YXIgUD10W28rK10sRT1uZXcgVWludDhBcnJheSgxNiksQj0wO2ZvcihwPTA7cDwxNjtwKyssbysrKUIrPUVbcF09dFtvXTt2YXIgTz1uZXcgVWludDhBcnJheShCKTtmb3IocD0wO3A8QjtwKyssbysrKU9bcF09dFtvXTttKz0xNytCOyhQPj40PT0wP2Y6ZClbMTUmUF09YnVpbGRIdWZmbWFuVGFibGUoRSxPKX1icmVhaztjYXNlIDY1NTAxOm8rPTI7cz0oMCxpLnJlYWRVaW50MTYpKHQsbyk7bys9MjticmVhaztjYXNlIDY1NDk4OmNvbnN0IEc9MT09KytoJiYhcjtvKz0yO3ZhciBNLEQ9dFtvKytdLFI9W107Zm9yKG09MDttPEQ7bSsrKXtjb25zdCBlPXRbbysrXTt2YXIgTj1uLmNvbXBvbmVudElkc1tlXTsoTT1uLmNvbXBvbmVudHNbTl0pLmluZGV4PWU7dmFyIEw9dFtvKytdO00uaHVmZm1hblRhYmxlREM9ZltMPj40XTtNLmh1ZmZtYW5UYWJsZUFDPWRbMTUmTF07Ui5wdXNoKE0pfXZhciBfPXRbbysrXSxVPXRbbysrXSxxPXRbbysrXTt0cnl7dmFyIGo9ZGVjb2RlU2Nhbih0LG8sbixSLHMsXyxVLHE+PjQsMTUmcSxHKTtvKz1qfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcil7KDAsYS53YXJuKShlLm1lc3NhZ2UrIiAtLSBhdHRlbXB0aW5nIHRvIHJlLXBhcnNlIHRoZSBKUEVHIGltYWdlLiIpO3JldHVybiB0aGlzLnBhcnNlKHQse2RubFNjYW5MaW5lczplLnNjYW5MaW5lc30pfWlmKGUgaW5zdGFuY2VvZiBFT0lNYXJrZXJFcnJvcil7KDAsYS53YXJuKShlLm1lc3NhZ2UrIiAtLSBpZ25vcmluZyB0aGUgcmVzdCBvZiB0aGUgaW1hZ2UgZGF0YS4iKTticmVhayBlfXRocm93IGV9YnJlYWs7Y2FzZSA2NTUwMDpvKz00O2JyZWFrO2Nhc2UgNjU1MzU6MjU1IT09dFtvXSYmby0tO2JyZWFrO2RlZmF1bHQ6Y29uc3QgVz1maW5kTmV4dEZpbGVNYXJrZXIodCxvLTIsby0zKTtpZihXJiZXLmludmFsaWQpeygwLGEud2FybikoIkpwZWdJbWFnZS5wYXJzZSAtIHVuZXhwZWN0ZWQgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICIrVy5pbnZhbGlkKTtvPVcub2Zmc2V0O2JyZWFrfWlmKG8+PXQubGVuZ3RoLTEpeygwLGEud2FybikoIkpwZWdJbWFnZS5wYXJzZSAtIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UgZGF0YSB3aXRob3V0IGZpbmRpbmcgYW4gRU9JIG1hcmtlciAoMHhGRkQ5KS4iKTticmVhayBlfXRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiAiK2cudG9TdHJpbmcoMTYpKX1nPSgwLGkucmVhZFVpbnQxNikodCxvKTtvKz0yfXRoaXMud2lkdGg9bi5zYW1wbGVzUGVyTGluZTt0aGlzLmhlaWdodD1uLnNjYW5MaW5lczt0aGlzLmpmaWY9Yzt0aGlzLmFkb2JlPWw7dGhpcy5jb21wb25lbnRzPVtdO2ZvcihtPTA7bTxuLmNvbXBvbmVudHMubGVuZ3RoO20rKyl7dmFyIEg9dVsoTT1uLmNvbXBvbmVudHNbbV0pLnF1YW50aXphdGlvbklkXTtIJiYoTS5xdWFudGl6YXRpb25UYWJsZT1IKTt0aGlzLmNvbXBvbmVudHMucHVzaCh7aW5kZXg6TS5pbmRleCxvdXRwdXQ6YnVpbGRDb21wb25lbnREYXRhKDAsTSksc2NhbGVYOk0uaC9uLm1heEgsc2NhbGVZOk0udi9uLm1heFYsYmxvY2tzUGVyTGluZTpNLmJsb2Nrc1BlckxpbmUsYmxvY2tzUGVyQ29sdW1uOk0uYmxvY2tzUGVyQ29sdW1ufSl9dGhpcy5udW1Db21wb25lbnRzPXRoaXMuY29tcG9uZW50cy5sZW5ndGh9LF9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKGUsdCxyPSExKXt2YXIgYSxpLG4scyxvLGMsbCxoLHUsZCxmLGc9dGhpcy53aWR0aC9lLG09dGhpcy5oZWlnaHQvdCxwPTAsYj10aGlzLmNvbXBvbmVudHMubGVuZ3RoLHk9ZSp0KmIsdj1uZXcgVWludDhDbGFtcGVkQXJyYXkoeSksdz1uZXcgVWludDMyQXJyYXkoZSk7bGV0IGs7Zm9yKGw9MDtsPGI7bCsrKXtpPShhPXRoaXMuY29tcG9uZW50c1tsXSkuc2NhbGVYKmc7bj1hLnNjYWxlWSptO3A9bDtmPWEub3V0cHV0O3M9YS5ibG9ja3NQZXJMaW5lKzE8PDM7aWYoaSE9PWspe2ZvcihvPTA7bzxlO28rKyl7aD0wfG8qaTt3W29dPSg0Mjk0OTY3Mjg4JmgpPDwzfDcmaH1rPWl9Zm9yKGM9MDtjPHQ7YysrKXtkPXMqKDQyOTQ5NjcyODgmKGg9MHxjKm4pKXwoNyZoKTw8Mztmb3Iobz0wO288ZTtvKyspe3ZbcF09ZltkK3dbb11dO3ArPWJ9fX1sZXQgUz10aGlzLl9kZWNvZGVUcmFuc2Zvcm07cnx8NCE9PWJ8fFN8fChTPW5ldyBJbnQzMkFycmF5KFstMjU2LDI1NSwtMjU2LDI1NSwtMjU2LDI1NSwtMjU2LDI1NV0pKTtpZihTKWZvcihsPTA7bDx5Oylmb3IoaD0wLHU9MDtoPGI7aCsrLGwrKyx1Kz0yKXZbbF09KHZbbF0qU1t1XT4+OCkrU1t1KzFdO3JldHVybiB2fSxnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCl7cmV0dXJuIHRoaXMuYWRvYmU/ISF0aGlzLmFkb2JlLnRyYW5zZm9ybUNvZGU6Mz09PXRoaXMubnVtQ29tcG9uZW50cz8wIT09dGhpcy5fY29sb3JUcmFuc2Zvcm0mJig4MiE9PXRoaXMuY29tcG9uZW50c1swXS5pbmRleHx8NzEhPT10aGlzLmNvbXBvbmVudHNbMV0uaW5kZXh8fDY2IT09dGhpcy5jb21wb25lbnRzWzJdLmluZGV4KToxPT09dGhpcy5fY29sb3JUcmFuc2Zvcm19LF9jb252ZXJ0WWNjVG9SZ2I6ZnVuY3Rpb24gY29udmVydFljY1RvUmdiKGUpe2Zvcih2YXIgdCxyLGEsaT0wLG49ZS5sZW5ndGg7aTxuO2krPTMpe3Q9ZVtpXTtyPWVbaSsxXTthPWVbaSsyXTtlW2ldPXQtMTc5LjQ1NisxLjQwMiphO2VbaSsxXT10KzEzNS40NTktLjM0NCpyLS43MTQqYTtlW2krMl09dC0yMjYuODE2KzEuNzcyKnJ9cmV0dXJuIGV9LF9jb252ZXJ0WWNja1RvUmdiOmZ1bmN0aW9uIGNvbnZlcnRZY2NrVG9SZ2IoZSl7Zm9yKHZhciB0LHIsYSxpLG49MCxzPTAsbz1lLmxlbmd0aDtzPG87cys9NCl7dD1lW3NdO3I9ZVtzKzFdO2E9ZVtzKzJdO2k9ZVtzKzNdO2VbbisrXT1yKigtNjYwNjM1NjY5NDIwMzY0ZS0xOSpyKy4wMDA0MzcxMzA0NzU5MjYyMzIqYS01NDA4MDYxMDA2NDU5OWUtMTgqdCsuMDAwNDg0NDk3OTcxMjAyODEqaS0uMTU0MzYyMTUxODcxMTI2KS0xMjIuNjcxOTU0MDY4OTQrYSooLS4wMDA5NTc5NjQzNzg0NDU3NzMqYSsuMDAwODE3MDc2OTExMzQ2NjI1KnQtLjAwNDc3MjcxNDA1NDA4NzQ3KmkrMS41MzM4MDI1MzIyMTczNCkrdCooLjAwMDk2MTI1MDE4NDEzMDY4OCp0LS4wMDI2NjI1NzMzMjI4MzkzMyppKy40ODM1NzA4ODQ1MTI2NSkraSooLS4wMDAzMzYxOTcxNzc2MTgzOTQqaSsuNDg0NzkxNTYxNDkwNzc2KTtlW24rK109MTA3LjI2ODAzOTM5NzcyNCtyKigyMTk5MjcxMDQ1MjU3NDFlLTE5KnItLjAwMDY0MDk5MjAxODI5Nzk0NSphKy4wMDA2NTkzOTcwMDEyNDU1NzcqdCsuMDAwNDI2MTA1NjUyOTM4ODM3KmktLjE3NjQ5MTc5MjQ2Mjg3NSkrYSooLS4wMDA3NzgyNjk5NDE1MTM2ODMqYSsuMDAxMzA4NzIyNjE0MDgyNzUqdCsuMDAwNzcwNDgyNjMxODAxMTMyKmktLjE1MTA1MTQ5Mjc3NTU2MikrdCooLjAwMTI2OTM1MzY4MTE0ODQzKnQtLjAwMjY1MDkwMTg5MDEwODk4KmkrLjI1ODAyOTEwMjA2ODQ1KStpKigtLjAwMDMxODkxMzExNzU4ODMyOCppLS4yMTM3NDI0MDAzMjM2NjUpO2VbbisrXT1yKigtLjAwMDU3MDExNTE5Njk3MzY3NypyLTI2MzQwOTA1MTAwNDU4OWUtMTkqYSsuMDAyMDc0MTA4ODExNTAxMip0LS4wMDI4ODI2MDIzNjg1MzQ0MippKy44MTQyNzI5NjgzNTkyOTUpLTIwLjgxMDAxMjU0Njk0NythKigtMTUzNDk2MDU3NDQwOTc1ZS0xOSphLS4wMDAxMzI2ODkwNDM5NjE0NDYqdCsuMDAwNTYwODMzNjkxMjQyODEyKmktLjE5NTE1MjAyNzUzNDA0OSkrdCooLjAwMTc0NDE4MTMyOTI3NTgyKnQtLjAwMjU1MjQzMzIxNDM5MzQ3KmkrLjExNjkzNTAyMDQ2NTE0NSkraSooLS4wMDAzNDM1MzE5OTY1MTA1NTUqaSsuMjQxNjUyNjAyMzI0MDcpfXJldHVybiBlLnN1YmFycmF5KDAsbil9LF9jb252ZXJ0WWNja1RvQ215azpmdW5jdGlvbiBjb252ZXJ0WWNja1RvQ215ayhlKXtmb3IodmFyIHQscixhLGk9MCxuPWUubGVuZ3RoO2k8bjtpKz00KXt0PWVbaV07cj1lW2krMV07YT1lW2krMl07ZVtpXT00MzQuNDU2LXQtMS40MDIqYTtlW2krMV09MTE5LjU0MS10Ky4zNDQqcisuNzE0KmE7ZVtpKzJdPTQ4MS44MTYtdC0xLjc3MipyfXJldHVybiBlfSxfY29udmVydENteWtUb1JnYjpmdW5jdGlvbiBjb252ZXJ0Q215a1RvUmdiKGUpe2Zvcih2YXIgdCxyLGEsaSxuPTAscz0wLG89ZS5sZW5ndGg7czxvO3MrPTQpe3Q9ZVtzXTtyPWVbcysxXTthPWVbcysyXTtpPWVbcyszXTtlW24rK109MjU1K3QqKC02NzQ3MTQ3MDczNjAyNDQxZS0yMCp0Ky4wMDA4Mzc5MjYyMTIxMDEzNzI3KnIrLjAwMDI4OTQ3MTgxODg2NDMyOTQqYSsuMDAzMjY0MjMxMDU3NTM3ODA2KmktMS4xMTg1NjExODY3MjAzOTM3KStyKigyNjM3NDEwNzYxNjA4OTQwNWUtMjEqci04NjI2OTQ5MTU4NjM4NTcyZS0yMCphLS4wMDAyNzQ4NzY5MDY3NDk5NDkxKmktLjAyMTU1Njg4Nzk0OTc4OTY3KSthKigtMzg3ODA5OTIxMjg2OTM2M2UtMjAqYS0uMDAwMzI2NzgwODI3OTQ4NTI4NippKy4wNjg2NzQyMjM4NTk1MzQ1KS1pKiguMDAwMzM2MTk3MTc3NjE4MzkzNyppKy43NDMwNjU5MTUxMzQyMjU0KTtlW24rK109MjU1K3QqKC4wMDAxMzU5NjM3MjgxMzU4ODg0OCp0Ky4wMDA5MjQ1MzcxMzI1NzM1ODUqcisuMDAwMTA1NjczNTk2MTg2ODM1OTMqYSsuMDAwNDc5MTg2NDY4NzQzNjUxMippLS4zMTA5Njg5NTg3NTE1ODc1KStyKigtLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0KnIrLjAwMDI3MDI4NDUyNTM1MzQ3MTQqYSsuMDAyMDIwMDMwODk3NzMwNzE1NippLS43NDg4MDUyMTY3MDE1NDk0KSthKig2ODM0ODE1OTk4MjM1NjYyZS0yMCphKy4wMDAxNTE2ODQ1MjM2MzQ2MDk3MyppLS4wOTc1MTkyNzc3NDcyODkzMyktaSooLjAwMDMxODkxMzExNzU4ODMyODEqaSsuNzM2NDg4MzgwNzczMzE2OCk7ZVtuKytdPTI1NSt0KigxMzU5ODY1MDQxMTM4NTMwN2UtMjEqdCsuMDAwMTI0MjM5NTYxNzU0OTA4NTEqcisuMDAwNDc1MTk4NTA5NzU4MzU4OSphLTM2NzI5MzE3NDc2NjMwNDIyZS0yMippLS4wNTU2MjE4Njk4MDI2NDAzNCkrciooLjAwMDE2MTQxMzgwNTk4NzI0Njc2KnIrLjAwMDk2OTIyMzkxMzA3MjUxODYqYSsuMDAwNzc4MjY5MjQ1MDAzNjI1MyppLS40NDAxNTIzMjM2NzUyNjQ2MykrYSooNS4wNjg4ODI5MTQwNjg3NjllLTcqYSsuMDAxNzc3ODM2OTAxMTM3NTA3MSppLS43NTkxNDU0NjQ5NzQ5NjA5KS1pKiguMDAwMzQzNTMxOTk2NTEwNTU1MyppKy43MDYzNzcwMTg2MTYwMTQ0KX1yZXR1cm4gZS5zdWJhcnJheSgwLG4pfSxnZXREYXRhKHt3aWR0aDplLGhlaWdodDp0LGZvcmNlUkdCOnI9ITEsaXNTb3VyY2VQREY6YT0hMX0pe2lmKHRoaXMubnVtQ29tcG9uZW50cz40KXRocm93IG5ldyBKcGVnRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiKTt2YXIgaT10aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKGUsdCxhKTtpZigxPT09dGhpcy5udW1Db21wb25lbnRzJiZyKXtmb3IodmFyIG49aS5sZW5ndGgscz1uZXcgVWludDhDbGFtcGVkQXJyYXkoMypuKSxvPTAsYz0wO2M8bjtjKyspe3ZhciBsPWlbY107c1tvKytdPWw7c1tvKytdPWw7c1tvKytdPWx9cmV0dXJuIHN9aWYoMz09PXRoaXMubnVtQ29tcG9uZW50cyYmdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihpKTtpZig0PT09dGhpcy5udW1Db21wb25lbnRzKXtpZih0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZClyZXR1cm4gcj90aGlzLl9jb252ZXJ0WWNja1RvUmdiKGkpOnRoaXMuX2NvbnZlcnRZY2NrVG9DbXlrKGkpO2lmKHIpcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoaSl9cmV0dXJuIGl9fTtyZXR1cm4gSnBlZ0ltYWdlfSgpO3QuSnBlZ0ltYWdlPW59LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSnB4U3RyZWFtPXZvaWQgMDt2YXIgYT1yKDEyKSxpPXIoMjEpLG49cigyKTtjb25zdCBzPWZ1bmN0aW9uIEpweFN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBKcHhTdHJlYW0oZSx0LHIsaSl7dGhpcy5zdHJlYW09ZTt0aGlzLm1heWJlTGVuZ3RoPXQ7dGhpcy5kaWN0PXI7dGhpcy5wYXJhbXM9aTthLkRlY29kZVN0cmVhbS5jYWxsKHRoaXMsdCl9SnB4U3RyZWFtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGEuRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEpweFN0cmVhbS5wcm90b3R5cGUsImJ5dGVzIix7Z2V0OmZ1bmN0aW9uIEpweFN0cmVhbV9ieXRlcygpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJieXRlcyIsdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpfSxjb25maWd1cmFibGU6ITB9KTtKcHhTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlcj1mdW5jdGlvbihlKXt9O0pweFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uKCl7aWYodGhpcy5lb2YpcmV0dXJuO2NvbnN0IGU9bmV3IGkuSnB4SW1hZ2U7ZS5wYXJzZSh0aGlzLmJ5dGVzKTtjb25zdCB0PWUud2lkdGgscj1lLmhlaWdodCxhPWUuY29tcG9uZW50c0NvdW50LG49ZS50aWxlcy5sZW5ndGg7aWYoMT09PW4pdGhpcy5idWZmZXI9ZS50aWxlc1swXS5pdGVtcztlbHNle2NvbnN0IGk9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQqciphKTtmb3IobGV0IHI9MDtyPG47cisrKXtjb25zdCBuPWUudGlsZXNbcl0scz1uLndpZHRoLG89bi5oZWlnaHQsYz1uLmxlZnQsbD1uLnRvcCxoPW4uaXRlbXM7bGV0IHU9MCxkPSh0KmwrYykqYTtjb25zdCBmPXQqYSxnPXMqYTtmb3IobGV0IGU9MDtlPG87ZSsrKXtjb25zdCBlPWguc3ViYXJyYXkodSx1K2cpO2kuc2V0KGUsZCk7dSs9ZztkKz1mfX10aGlzLmJ1ZmZlcj1pfXRoaXMuYnVmZmVyTGVuZ3RoPXRoaXMuYnVmZmVyLmxlbmd0aDt0aGlzLmVvZj0hMH07cmV0dXJuIEpweFN0cmVhbX0oKTt0LkpweFN0cmVhbT1zfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkpweEltYWdlPXZvaWQgMDt2YXIgYT1yKDIpLGk9cig4KSxuPXIoMTcpO2NsYXNzIEpweEVycm9yIGV4dGVuZHMgYS5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKCJKUFggZXJyb3I6ICIrZSl9fXZhciBzPWZ1bmN0aW9uIEpweEltYWdlQ2xvc3VyZSgpe3ZhciBlPXtMTDowLExIOjEsSEw6MSxISDoyfTtmdW5jdGlvbiBKcHhJbWFnZSgpe3RoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2U9ITF9SnB4SW1hZ2UucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZShlKXtpZig2NTM1OSE9PSgwLGkucmVhZFVpbnQxNikoZSwwKSlmb3IodmFyIHQ9MCxyPWUubGVuZ3RoO3Q8cjspe3ZhciBuPTgscz0oMCxpLnJlYWRVaW50MzIpKGUsdCksbz0oMCxpLnJlYWRVaW50MzIpKGUsdCs0KTt0Kz1uO2lmKDE9PT1zKXtzPTQyOTQ5NjcyOTYqKDAsaS5yZWFkVWludDMyKShlLHQpKygwLGkucmVhZFVpbnQzMikoZSx0KzQpO3QrPTg7bis9OH0wPT09cyYmKHM9ci10K24pO2lmKHM8bil0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgYm94IGZpZWxkIHNpemUiKTt2YXIgYz1zLW4sbD0hMDtzd2l0Y2gobyl7Y2FzZSAxNzg1NzM3ODMyOmw9ITE7YnJlYWs7Y2FzZSAxNjY4MjQ2NjQyOnZhciBoPWVbdF07aWYoMT09PWgpe3ZhciB1PSgwLGkucmVhZFVpbnQzMikoZSx0KzMpO3N3aXRjaCh1KXtjYXNlIDE2OmNhc2UgMTc6Y2FzZSAxODpicmVhaztkZWZhdWx0OigwLGEud2FybikoIlVua25vd24gY29sb3JzcGFjZSAiK3UpfX1lbHNlIDI9PT1oJiYoMCxhLmluZm8pKCJJQ0MgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIik7YnJlYWs7Y2FzZSAxNzg1NzM3ODI3OnRoaXMucGFyc2VDb2Rlc3RyZWFtKGUsdCx0K2MpO2JyZWFrO2Nhc2UgMTc4MzYzNmUzOjIxODc5MzczOCE9PSgwLGkucmVhZFVpbnQzMikoZSx0KSYmKDAsYS53YXJuKSgiSW52YWxpZCBKUDIgc2lnbmF0dXJlIik7YnJlYWs7Y2FzZSAxNzgzNjM0NDU4OmNhc2UgMTcxODkwOTI5NjpjYXNlIDE5MjAwOTk2OTc6Y2FzZSAxOTE5MjUxMjMyOmNhc2UgMTc2ODQ0OTEzODpicmVhaztkZWZhdWx0OnZhciBkPVN0cmluZy5mcm9tQ2hhckNvZGUobz4+MjQmMjU1LG8+PjE2JjI1NSxvPj44JjI1NSwyNTUmbyk7KDAsYS53YXJuKSgiVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgIitvKyIgKCIrZCsiKSIpfWwmJih0Kz1jKX1lbHNlIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGUsMCxlLmxlbmd0aCl9LHBhcnNlSW1hZ2VQcm9wZXJ0aWVzOmZ1bmN0aW9uIEpweEltYWdlX3BhcnNlSW1hZ2VQcm9wZXJ0aWVzKGUpe2Zvcih2YXIgdD1lLmdldEJ5dGUoKTt0Pj0wOyl7aWYoNjUzNjE9PT0odDw8OHwodD1lLmdldEJ5dGUoKSkpKXtlLnNraXAoNCk7dmFyIHI9ZS5nZXRJbnQzMigpPj4+MCxhPWUuZ2V0SW50MzIoKT4+PjAsaT1lLmdldEludDMyKCk+Pj4wLG49ZS5nZXRJbnQzMigpPj4+MDtlLnNraXAoMTYpO3ZhciBzPWUuZ2V0VWludDE2KCk7dGhpcy53aWR0aD1yLWk7dGhpcy5oZWlnaHQ9YS1uO3RoaXMuY29tcG9uZW50c0NvdW50PXM7dGhpcy5iaXRzUGVyQ29tcG9uZW50PTg7cmV0dXJufX10aHJvdyBuZXcgSnB4RXJyb3IoIk5vIHNpemUgbWFya2VyIGZvdW5kIGluIEpQWCBzdHJlYW0iKX0scGFyc2VDb2Rlc3RyZWFtOmZ1bmN0aW9uIEpweEltYWdlX3BhcnNlQ29kZXN0cmVhbShlLHQscil7dmFyIG49e30scz0hMTt0cnl7Zm9yKHZhciBvPXQ7bysxPHI7KXt2YXIgYz0oMCxpLnJlYWRVaW50MTYpKGUsbyk7bys9Mjt2YXIgbCxoLHUsZCxmLGcsbT0wO3N3aXRjaChjKXtjYXNlIDY1MzU5Om4ubWFpbkhlYWRlcj0hMDticmVhaztjYXNlIDY1NDk3OmJyZWFrO2Nhc2UgNjUzNjE6bT0oMCxpLnJlYWRVaW50MTYpKGUsbyk7dmFyIHA9e307cC5Yc2l6PSgwLGkucmVhZFVpbnQzMikoZSxvKzQpO3AuWXNpej0oMCxpLnJlYWRVaW50MzIpKGUsbys4KTtwLlhPc2l6PSgwLGkucmVhZFVpbnQzMikoZSxvKzEyKTtwLllPc2l6PSgwLGkucmVhZFVpbnQzMikoZSxvKzE2KTtwLlhUc2l6PSgwLGkucmVhZFVpbnQzMikoZSxvKzIwKTtwLllUc2l6PSgwLGkucmVhZFVpbnQzMikoZSxvKzI0KTtwLlhUT3Npej0oMCxpLnJlYWRVaW50MzIpKGUsbysyOCk7cC5ZVE9zaXo9KDAsaS5yZWFkVWludDMyKShlLG8rMzIpO3ZhciBiPSgwLGkucmVhZFVpbnQxNikoZSxvKzM2KTtwLkNzaXo9Yjt2YXIgeT1bXTtsPW8rMzg7Zm9yKHZhciB2PTA7djxiO3YrKyl7dmFyIHc9e3ByZWNpc2lvbjoxKygxMjcmZVtsXSksaXNTaWduZWQ6ISEoMTI4JmVbbF0pLFhSc2l6OmVbbCsxXSxZUnNpejplW2wrMl19O2wrPTM7Y2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyh3LHApO3kucHVzaCh3KX1uLlNJWj1wO24uY29tcG9uZW50cz15O2NhbGN1bGF0ZVRpbGVHcmlkcyhuLHkpO24uUUNDPVtdO24uQ09DPVtdO2JyZWFrO2Nhc2UgNjUzNzI6bT0oMCxpLnJlYWRVaW50MTYpKGUsbyk7dmFyIGs9e307bD1vKzI7c3dpdGNoKDMxJihoPWVbbCsrXSkpe2Nhc2UgMDpkPTg7Zj0hMDticmVhaztjYXNlIDE6ZD0xNjtmPSExO2JyZWFrO2Nhc2UgMjpkPTE2O2Y9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiK2gpfWsubm9RdWFudGl6YXRpb249OD09PWQ7ay5zY2FsYXJFeHBvdW5kZWQ9ZjtrLmd1YXJkQml0cz1oPj41O3U9W107Zm9yKDtsPG0rbzspe3ZhciBTPXt9O2lmKDg9PT1kKXtTLmVwc2lsb249ZVtsKytdPj4zO1MubXU9MH1lbHNle1MuZXBzaWxvbj1lW2xdPj4zO1MubXU9KDcmZVtsXSk8PDh8ZVtsKzFdO2wrPTJ9dS5wdXNoKFMpfWsuU1BxY2RzPXU7aWYobi5tYWluSGVhZGVyKW4uUUNEPWs7ZWxzZXtuLmN1cnJlbnRUaWxlLlFDRD1rO24uY3VycmVudFRpbGUuUUNDPVtdfWJyZWFrO2Nhc2UgNjUzNzM6bT0oMCxpLnJlYWRVaW50MTYpKGUsbyk7dmFyIEMseD17fTtsPW8rMjtpZihuLlNJWi5Dc2l6PDI1NylDPWVbbCsrXTtlbHNle0M9KDAsaS5yZWFkVWludDE2KShlLGwpO2wrPTJ9c3dpdGNoKDMxJihoPWVbbCsrXSkpe2Nhc2UgMDpkPTg7Zj0hMDticmVhaztjYXNlIDE6ZD0xNjtmPSExO2JyZWFrO2Nhc2UgMjpkPTE2O2Y9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiK2gpfXgubm9RdWFudGl6YXRpb249OD09PWQ7eC5zY2FsYXJFeHBvdW5kZWQ9Zjt4Lmd1YXJkQml0cz1oPj41O3U9W107Zm9yKDtsPG0rbzspe1M9e307aWYoOD09PWQpe1MuZXBzaWxvbj1lW2wrK10+PjM7Uy5tdT0wfWVsc2V7Uy5lcHNpbG9uPWVbbF0+PjM7Uy5tdT0oNyZlW2xdKTw8OHxlW2wrMV07bCs9Mn11LnB1c2goUyl9eC5TUHFjZHM9dTtuLm1haW5IZWFkZXI/bi5RQ0NbQ109eDpuLmN1cnJlbnRUaWxlLlFDQ1tDXT14O2JyZWFrO2Nhc2UgNjUzNjI6bT0oMCxpLnJlYWRVaW50MTYpKGUsbyk7dmFyIEE9e307bD1vKzI7dmFyIFQ9ZVtsKytdO0EuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cz0hISgxJlQpO0Euc29wTWFya2VyVXNlZD0hISgyJlQpO0EuZXBoTWFya2VyVXNlZD0hISg0JlQpO0EucHJvZ3Jlc3Npb25PcmRlcj1lW2wrK107QS5sYXllcnNDb3VudD0oMCxpLnJlYWRVaW50MTYpKGUsbCk7bCs9MjtBLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtPWVbbCsrXTtBLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudD1lW2wrK107QS54Y2I9MisoMTUmZVtsKytdKTtBLnljYj0yKygxNSZlW2wrK10pO3ZhciBJPWVbbCsrXTtBLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3M9ISEoMSZJKTtBLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXM9ISEoMiZJKTtBLnRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcz0hISg0JkkpO0EudmVydGljYWxseVN0cmlwZT0hISg4JkkpO0EucHJlZGljdGFibGVUZXJtaW5hdGlvbj0hISgxNiZJKTtBLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQ9ISEoMzImSSk7QS5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb249ZVtsKytdO2lmKEEuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cyl7Zm9yKHZhciBGPVtdO2w8bStvOyl7dmFyIFA9ZVtsKytdO0YucHVzaCh7UFB4OjE1JlAsUFB5OlA+PjR9KX1BLnByZWNpbmN0c1NpemVzPUZ9dmFyIEU9W107QS5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzJiZFLnB1c2goInNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MiKTtBLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMmJkUucHVzaCgicmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcyIpO0EudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzJiZFLnB1c2goInRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcyIpO0EudmVydGljYWxseVN0cmlwZSYmRS5wdXNoKCJ2ZXJ0aWNhbGx5U3RyaXBlIik7QS5wcmVkaWN0YWJsZVRlcm1pbmF0aW9uJiZFLnB1c2goInByZWRpY3RhYmxlVGVybWluYXRpb24iKTtpZihFLmxlbmd0aD4wKXtzPSEwO3Rocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgQ09EIG9wdGlvbnMgKCIrRS5qb2luKCIsICIpKyIpIil9aWYobi5tYWluSGVhZGVyKW4uQ09EPUE7ZWxzZXtuLmN1cnJlbnRUaWxlLkNPRD1BO24uY3VycmVudFRpbGUuQ09DPVtdfWJyZWFrO2Nhc2UgNjU0MjQ6bT0oMCxpLnJlYWRVaW50MTYpKGUsbyk7KGc9e30pLmluZGV4PSgwLGkucmVhZFVpbnQxNikoZSxvKzIpO2cubGVuZ3RoPSgwLGkucmVhZFVpbnQzMikoZSxvKzQpO2cuZGF0YUVuZD1nLmxlbmd0aCtvLTI7Zy5wYXJ0SW5kZXg9ZVtvKzhdO2cucGFydHNDb3VudD1lW28rOV07bi5tYWluSGVhZGVyPSExO2lmKDA9PT1nLnBhcnRJbmRleCl7Zy5DT0Q9bi5DT0Q7Zy5DT0M9bi5DT0Muc2xpY2UoMCk7Zy5RQ0Q9bi5RQ0Q7Zy5RQ0M9bi5RQ0Muc2xpY2UoMCl9bi5jdXJyZW50VGlsZT1nO2JyZWFrO2Nhc2UgNjU0Mjc6aWYoMD09PShnPW4uY3VycmVudFRpbGUpLnBhcnRJbmRleCl7aW5pdGlhbGl6ZVRpbGUobixnLmluZGV4KTtidWlsZFBhY2tldHMobil9cGFyc2VUaWxlUGFja2V0cyhuLGUsbyxtPWcuZGF0YUVuZC1vKTticmVhaztjYXNlIDY1MzY1OmNhc2UgNjUzNjc6Y2FzZSA2NTM2ODpjYXNlIDY1MzgwOm09KDAsaS5yZWFkVWludDE2KShlLG8pO2JyZWFrO2Nhc2UgNjUzNjM6dGhyb3cgbmV3IEVycm9yKCJDb2Rlc3RyZWFtIGNvZGUgMHhGRjUzIChDT0MpIGlzIG5vdCBpbXBsZW1lbnRlZCIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvZGVzdHJlYW0gY29kZTogIitjLnRvU3RyaW5nKDE2KSl9bys9bX19Y2F0Y2goZSl7aWYoc3x8dGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSl0aHJvdyBuZXcgSnB4RXJyb3IoZS5tZXNzYWdlKTsoMCxhLndhcm4pKCJKUFg6IFRyeWluZyB0byByZWNvdmVyIGZyb206ICIrZS5tZXNzYWdlKX10aGlzLnRpbGVzPWZ1bmN0aW9uIHRyYW5zZm9ybUNvbXBvbmVudHMoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jb21wb25lbnRzLGE9dC5Dc2l6LGk9W10sbj0wLHM9ZS50aWxlcy5sZW5ndGg7bjxzO24rKyl7dmFyIG8sYz1lLnRpbGVzW25dLGw9W107Zm9yKG89MDtvPGE7bysrKWxbb109dHJhbnNmb3JtVGlsZShlLGMsbyk7dmFyIGgsdSxkLGYsZyxtLHAsYj1sWzBdLHk9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGIuaXRlbXMubGVuZ3RoKmEpLHY9e2xlZnQ6Yi5sZWZ0LHRvcDpiLnRvcCx3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodCxpdGVtczp5fSx3PTA7aWYoYy5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKXt2YXIgaz00PT09YSxTPWxbMF0uaXRlbXMsQz1sWzFdLml0ZW1zLHg9bFsyXS5pdGVtcyxBPWs/bFszXS5pdGVtczpudWxsO2g9clswXS5wcmVjaXNpb24tODt1PS41KygxMjg8PGgpO3ZhciBUPWMuY29tcG9uZW50c1swXSxJPWEtMztmPVMubGVuZ3RoO2lmKFQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbilmb3IoZD0wO2Q8ZjtkKyssdys9SSl7Zz1TW2RdK3U7bT1DW2RdO3A9eFtkXTtjb25zdCBlPWctKHArbT4+Mik7eVt3KytdPWUrcD4+aDt5W3crK109ZT4+aDt5W3crK109ZSttPj5ofWVsc2UgZm9yKGQ9MDtkPGY7ZCsrLHcrPUkpe2c9U1tkXSt1O209Q1tkXTtwPXhbZF07eVt3KytdPWcrMS40MDIqcD4+aDt5W3crK109Zy0uMzQ0MTMqbS0uNzE0MTQqcD4+aDt5W3crK109ZysxLjc3MiptPj5ofWlmKGspZm9yKGQ9MCx3PTM7ZDxmO2QrKyx3Kz00KXlbd109QVtkXSt1Pj5ofWVsc2UgZm9yKG89MDtvPGE7bysrKXt2YXIgRj1sW29dLml0ZW1zO2g9cltvXS5wcmVjaXNpb24tODt1PS41KygxMjg8PGgpO2Zvcih3PW8sZD0wLGY9Ri5sZW5ndGg7ZDxmO2QrKyl7eVt3XT1GW2RdK3U+Pmg7dys9YX19aS5wdXNoKHYpfXJldHVybiBpfShuKTt0aGlzLndpZHRoPW4uU0laLlhzaXotbi5TSVouWE9zaXo7dGhpcy5oZWlnaHQ9bi5TSVouWXNpei1uLlNJWi5ZT3Npejt0aGlzLmNvbXBvbmVudHNDb3VudD1uLlNJWi5Dc2l6fX07ZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhlLHQpe2UueDA9TWF0aC5jZWlsKHQuWE9zaXovZS5YUnNpeik7ZS54MT1NYXRoLmNlaWwodC5Yc2l6L2UuWFJzaXopO2UueTA9TWF0aC5jZWlsKHQuWU9zaXovZS5ZUnNpeik7ZS55MT1NYXRoLmNlaWwodC5Zc2l6L2UuWVJzaXopO2Uud2lkdGg9ZS54MS1lLngwO2UuaGVpZ2h0PWUueTEtZS55MH1mdW5jdGlvbiBjYWxjdWxhdGVUaWxlR3JpZHMoZSx0KXtmb3IodmFyIHIsYT1lLlNJWixpPVtdLG49TWF0aC5jZWlsKChhLlhzaXotYS5YVE9zaXopL2EuWFRzaXopLHM9TWF0aC5jZWlsKChhLllzaXotYS5ZVE9zaXopL2EuWVRzaXopLG89MDtvPHM7bysrKWZvcih2YXIgYz0wO2M8bjtjKyspeyhyPXt9KS50eDA9TWF0aC5tYXgoYS5YVE9zaXorYyphLlhUc2l6LGEuWE9zaXopO3IudHkwPU1hdGgubWF4KGEuWVRPc2l6K28qYS5ZVHNpeixhLllPc2l6KTtyLnR4MT1NYXRoLm1pbihhLlhUT3NpeisoYysxKSphLlhUc2l6LGEuWHNpeik7ci50eTE9TWF0aC5taW4oYS5ZVE9zaXorKG8rMSkqYS5ZVHNpeixhLllzaXopO3Iud2lkdGg9ci50eDEtci50eDA7ci5oZWlnaHQ9ci50eTEtci50eTA7ci5jb21wb25lbnRzPVtdO2kucHVzaChyKX1lLnRpbGVzPWk7Zm9yKHZhciBsPTAsaD1hLkNzaXo7bDxoO2wrKylmb3IodmFyIHU9dFtsXSxkPTAsZj1pLmxlbmd0aDtkPGY7ZCsrKXt2YXIgZz17fTtyPWlbZF07Zy50Y3gwPU1hdGguY2VpbChyLnR4MC91LlhSc2l6KTtnLnRjeTA9TWF0aC5jZWlsKHIudHkwL3UuWVJzaXopO2cudGN4MT1NYXRoLmNlaWwoci50eDEvdS5YUnNpeik7Zy50Y3kxPU1hdGguY2VpbChyLnR5MS91LllSc2l6KTtnLndpZHRoPWcudGN4MS1nLnRjeDA7Zy5oZWlnaHQ9Zy50Y3kxLWcudGN5MDtyLmNvbXBvbmVudHNbbF09Z319ZnVuY3Rpb24gZ2V0QmxvY2tzRGltZW5zaW9ucyhlLHQscil7dmFyIGE9dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMsaT17fTtpZihhLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpe2kuUFB4PWEucHJlY2luY3RzU2l6ZXNbcl0uUFB4O2kuUFB5PWEucHJlY2luY3RzU2l6ZXNbcl0uUFB5fWVsc2V7aS5QUHg9MTU7aS5QUHk9MTV9aS54Y2JfPXI+MD9NYXRoLm1pbihhLnhjYixpLlBQeC0xKTpNYXRoLm1pbihhLnhjYixpLlBQeCk7aS55Y2JfPXI+MD9NYXRoLm1pbihhLnljYixpLlBQeS0xKTpNYXRoLm1pbihhLnljYixpLlBQeSk7cmV0dXJuIGl9ZnVuY3Rpb24gYnVpbGRQcmVjaW5jdHMoZSx0LHIpe3ZhciBhPTE8PHIuUFB4LGk9MTw8ci5QUHksbj0wPT09dC5yZXNMZXZlbCxzPTE8PHIuUFB4KyhuPzA6LTEpLG89MTw8ci5QUHkrKG4/MDotMSksYz10LnRyeDE+dC50cngwP01hdGguY2VpbCh0LnRyeDEvYSktTWF0aC5mbG9vcih0LnRyeDAvYSk6MCxsPXQudHJ5MT50LnRyeTA/TWF0aC5jZWlsKHQudHJ5MS9pKS1NYXRoLmZsb29yKHQudHJ5MC9pKTowLGg9YypsO3QucHJlY2luY3RQYXJhbWV0ZXJzPXtwcmVjaW5jdFdpZHRoOmEscHJlY2luY3RIZWlnaHQ6aSxudW1wcmVjaW5jdHN3aWRlOmMsbnVtcHJlY2luY3RzaGlnaDpsLG51bXByZWNpbmN0czpoLHByZWNpbmN0V2lkdGhJblN1YmJhbmQ6cyxwcmVjaW5jdEhlaWdodEluU3ViYmFuZDpvfX1mdW5jdGlvbiBidWlsZENvZGVibG9ja3MoZSx0LHIpe3ZhciBhLGksbixzLG89ci54Y2JfLGM9ci55Y2JfLGw9MTw8byxoPTE8PGMsdT10LnRieDA+Pm8sZD10LnRieTA+PmMsZj10LnRieDErbC0xPj5vLGc9dC50YnkxK2gtMT4+YyxtPXQucmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMscD1bXSxiPVtdO2ZvcihpPWQ7aTxnO2krKylmb3IoYT11O2E8ZjthKyspeyhuPXtjYng6YSxjYnk6aSx0YngwOmwqYSx0YnkwOmgqaSx0YngxOmwqKGErMSksdGJ5MTpoKihpKzEpfSkudGJ4MF89TWF0aC5tYXgodC50YngwLG4udGJ4MCk7bi50YnkwXz1NYXRoLm1heCh0LnRieTAsbi50YnkwKTtuLnRieDFfPU1hdGgubWluKHQudGJ4MSxuLnRieDEpO24udGJ5MV89TWF0aC5taW4odC50YnkxLG4udGJ5MSk7cz1NYXRoLmZsb29yKChuLnRieDBfLXQudGJ4MCkvbS5wcmVjaW5jdFdpZHRoSW5TdWJiYW5kKStNYXRoLmZsb29yKChuLnRieTBfLXQudGJ5MCkvbS5wcmVjaW5jdEhlaWdodEluU3ViYmFuZCkqbS5udW1wcmVjaW5jdHN3aWRlO24ucHJlY2luY3ROdW1iZXI9cztuLnN1YmJhbmRUeXBlPXQudHlwZTtuLkxibG9jaz0zO2lmKCEobi50YngxXzw9bi50YngwX3x8bi50YnkxXzw9bi50YnkwXykpe3AucHVzaChuKTt2YXIgeT1iW3NdO2lmKHZvaWQgMCE9PXkpe2E8eS5jYnhNaW4/eS5jYnhNaW49YTphPnkuY2J4TWF4JiYoeS5jYnhNYXg9YSk7aTx5LmNieU1pbj95LmNieE1pbj1pOmk+eS5jYnlNYXgmJih5LmNieU1heD1pKX1lbHNlIGJbc109eT17Y2J4TWluOmEsY2J5TWluOmksY2J4TWF4OmEsY2J5TWF4Oml9O24ucHJlY2luY3Q9eX19dC5jb2RlYmxvY2tQYXJhbWV0ZXJzPXtjb2RlYmxvY2tXaWR0aDpvLGNvZGVibG9ja0hlaWdodDpjLG51bWNvZGVibG9ja3dpZGU6Zi11KzEsbnVtY29kZWJsb2NraGlnaDpnLWQrMX07dC5jb2RlYmxvY2tzPXA7dC5wcmVjaW5jdHM9Yn1mdW5jdGlvbiBjcmVhdGVQYWNrZXQoZSx0LHIpe2Zvcih2YXIgYT1bXSxpPWUuc3ViYmFuZHMsbj0wLHM9aS5sZW5ndGg7bjxzO24rKylmb3IodmFyIG89aVtuXS5jb2RlYmxvY2tzLGM9MCxsPW8ubGVuZ3RoO2M8bDtjKyspe3ZhciBoPW9bY107aC5wcmVjaW5jdE51bWJlcj09PXQmJmEucHVzaChoKX1yZXR1cm57bGF5ZXJOdW1iZXI6cixjb2RlYmxvY2tzOmF9fWZ1bmN0aW9uIExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxhPWUudGlsZXNbcl0saT1hLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsbj10LkNzaXoscz0wLG89MDtvPG47bysrKXM9TWF0aC5tYXgocyxhLmNvbXBvbmVudHNbb10uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7dmFyIGM9MCxsPTAsaD0wLHU9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7YzxpO2MrKyl7Zm9yKDtsPD1zO2wrKyl7Zm9yKDtoPG47aCsrKXt2YXIgZT1hLmNvbXBvbmVudHNbaF07aWYoIShsPmUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkpe2Zvcih2YXIgdD1lLnJlc29sdXRpb25zW2xdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO3U8cjspe3ZhciBvPWNyZWF0ZVBhY2tldCh0LHUsYyk7dSsrO3JldHVybiBvfXU9MH19aD0wfWw9MH10aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxhPWUudGlsZXNbcl0saT1hLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsbj10LkNzaXoscz0wLG89MDtvPG47bysrKXM9TWF0aC5tYXgocyxhLmNvbXBvbmVudHNbb10uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7dmFyIGM9MCxsPTAsaD0wLHU9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7Yzw9cztjKyspe2Zvcig7bDxpO2wrKyl7Zm9yKDtoPG47aCsrKXt2YXIgZT1hLmNvbXBvbmVudHNbaF07aWYoIShjPmUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkpe2Zvcih2YXIgdD1lLnJlc29sdXRpb25zW2NdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO3U8cjspe3ZhciBvPWNyZWF0ZVBhY2tldCh0LHUsbCk7dSsrO3JldHVybiBvfXU9MH19aD0wfWw9MH10aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIFJlc29sdXRpb25Qb3NpdGlvbkNvbXBvbmVudExheWVySXRlcmF0b3IoZSl7dmFyIHQscixhLGksbj1lLlNJWixzPWUuY3VycmVudFRpbGUuaW5kZXgsbz1lLnRpbGVzW3NdLGM9by5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LGw9bi5Dc2l6LGg9MDtmb3IoYT0wO2E8bDthKyspe2NvbnN0IGU9by5jb21wb25lbnRzW2FdO2g9TWF0aC5tYXgoaCxlLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpfXZhciB1PW5ldyBJbnQzMkFycmF5KGgrMSk7Zm9yKHI9MDtyPD1oOysrcil7dmFyIGQ9MDtmb3IoYT0wO2E8bDsrK2Epe3ZhciBmPW8uY29tcG9uZW50c1thXS5yZXNvbHV0aW9ucztyPGYubGVuZ3RoJiYoZD1NYXRoLm1heChkLGZbcl0ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cykpfXVbcl09ZH10PTA7cj0wO2E9MDtpPTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO3I8PWg7cisrKXtmb3IoO2k8dVtyXTtpKyspe2Zvcig7YTxsO2ErKyl7Y29uc3QgbD1vLmNvbXBvbmVudHNbYV07aWYoIShyPmwuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkpe3ZhciBlPWwucmVzb2x1dGlvbnNbcl0sbj1lLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7aWYoIShpPj1uKSl7Zm9yKDt0PGM7KXt2YXIgcz1jcmVhdGVQYWNrZXQoZSxpLHQpO3QrKztyZXR1cm4gc310PTB9fX1hPTB9aT0wfXRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihlKXt2YXIgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsYT1lLnRpbGVzW3JdLGk9YS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LG49dC5Dc2l6LHM9Z2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZShhKSxvPXMsYz0wLGw9MCxoPTAsdT0wLGQ9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7ZDxvLm1heE51bUhpZ2g7ZCsrKXtmb3IoO3U8by5tYXhOdW1XaWRlO3UrKyl7Zm9yKDtoPG47aCsrKXtmb3IodmFyIGU9YS5jb21wb25lbnRzW2hdLHQ9ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O2w8PXQ7bCsrKXt2YXIgcj1lLnJlc29sdXRpb25zW2xdLGY9cy5jb21wb25lbnRzW2hdLnJlc29sdXRpb25zW2xdLGc9Z2V0UHJlY2luY3RJbmRleElmRXhpc3QodSxkLGYsbyxyKTtpZihudWxsIT09Zyl7Zm9yKDtjPGk7KXt2YXIgbT1jcmVhdGVQYWNrZXQocixnLGMpO2MrKztyZXR1cm4gbX1jPTB9fWw9MH1oPTB9dT0wfXRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihlKXt2YXIgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsYT1lLnRpbGVzW3JdLGk9YS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LG49dC5Dc2l6LHM9Z2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZShhKSxvPTAsYz0wLGw9MCxoPTAsdT0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCl7Zm9yKDtsPG47KytsKXtmb3IodmFyIGU9YS5jb21wb25lbnRzW2xdLHQ9cy5jb21wb25lbnRzW2xdLHI9ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O3U8dC5tYXhOdW1IaWdoO3UrKyl7Zm9yKDtoPHQubWF4TnVtV2lkZTtoKyspe2Zvcig7Yzw9cjtjKyspe3ZhciBkPWUucmVzb2x1dGlvbnNbY10sZj10LnJlc29sdXRpb25zW2NdLGc9Z2V0UHJlY2luY3RJbmRleElmRXhpc3QoaCx1LGYsdCxkKTtpZihudWxsIT09Zyl7Zm9yKDtvPGk7KXt2YXIgbT1jcmVhdGVQYWNrZXQoZCxnLG8pO28rKztyZXR1cm4gbX1vPTB9fWM9MH1oPTB9dT0wfXRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoZSx0LHIsYSxpKXt2YXIgbj1lKmEubWluV2lkdGgscz10KmEubWluSGVpZ2h0O2lmKG4lci53aWR0aCE9MHx8cyVyLmhlaWdodCE9MClyZXR1cm4gbnVsbDt2YXIgbz1zL3Iud2lkdGgqaS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTtyZXR1cm4gbi9yLmhlaWdodCtvfWZ1bmN0aW9uIGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUoZSl7Zm9yKHZhciB0PWUuY29tcG9uZW50cy5sZW5ndGgscj1OdW1iZXIuTUFYX1ZBTFVFLGE9TnVtYmVyLk1BWF9WQUxVRSxpPTAsbj0wLHM9bmV3IEFycmF5KHQpLG89MDtvPHQ7bysrKXtmb3IodmFyIGM9ZS5jb21wb25lbnRzW29dLGw9Yy5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LGg9bmV3IEFycmF5KGwrMSksdT1OdW1iZXIuTUFYX1ZBTFVFLGQ9TnVtYmVyLk1BWF9WQUxVRSxmPTAsZz0wLG09MSxwPWw7cD49MDstLXApe3ZhciBiPWMucmVzb2x1dGlvbnNbcF0seT1tKmIucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0V2lkdGgsdj1tKmIucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0O3U9TWF0aC5taW4odSx5KTtkPU1hdGgubWluKGQsdik7Zj1NYXRoLm1heChmLGIucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGUpO2c9TWF0aC5tYXgoZyxiLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHNoaWdoKTtoW3BdPXt3aWR0aDp5LGhlaWdodDp2fTttPDw9MX1yPU1hdGgubWluKHIsdSk7YT1NYXRoLm1pbihhLGQpO2k9TWF0aC5tYXgoaSxmKTtuPU1hdGgubWF4KG4sZyk7c1tvXT17cmVzb2x1dGlvbnM6aCxtaW5XaWR0aDp1LG1pbkhlaWdodDpkLG1heE51bVdpZGU6ZixtYXhOdW1IaWdoOmd9fXJldHVybntjb21wb25lbnRzOnMsbWluV2lkdGg6cixtaW5IZWlnaHQ6YSxtYXhOdW1XaWRlOmksbWF4TnVtSGlnaDpufX1mdW5jdGlvbiBidWlsZFBhY2tldHMoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxhPWUudGlsZXNbcl0saT10LkNzaXosbj0wO248aTtuKyspe2Zvcih2YXIgcz1hLmNvbXBvbmVudHNbbl0sbz1zLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsYz1bXSxsPVtdLGg9MDtoPD1vO2grKyl7dmFyIHUsZD1nZXRCbG9ja3NEaW1lbnNpb25zKDAscyxoKSxmPXt9LGc9MTw8by1oO2YudHJ4MD1NYXRoLmNlaWwocy50Y3gwL2cpO2YudHJ5MD1NYXRoLmNlaWwocy50Y3kwL2cpO2YudHJ4MT1NYXRoLmNlaWwocy50Y3gxL2cpO2YudHJ5MT1NYXRoLmNlaWwocy50Y3kxL2cpO2YucmVzTGV2ZWw9aDtidWlsZFByZWNpbmN0cygwLGYsZCk7Yy5wdXNoKGYpO2lmKDA9PT1oKXsodT17fSkudHlwZT0iTEwiO3UudGJ4MD1NYXRoLmNlaWwocy50Y3gwL2cpO3UudGJ5MD1NYXRoLmNlaWwocy50Y3kwL2cpO3UudGJ4MT1NYXRoLmNlaWwocy50Y3gxL2cpO3UudGJ5MT1NYXRoLmNlaWwocy50Y3kxL2cpO3UucmVzb2x1dGlvbj1mO2J1aWxkQ29kZWJsb2NrcygwLHUsZCk7bC5wdXNoKHUpO2Yuc3ViYmFuZHM9W3VdfWVsc2V7dmFyIG09MTw8by1oKzEscD1bXTsodT17fSkudHlwZT0iSEwiO3UudGJ4MD1NYXRoLmNlaWwocy50Y3gwL20tLjUpO3UudGJ5MD1NYXRoLmNlaWwocy50Y3kwL20pO3UudGJ4MT1NYXRoLmNlaWwocy50Y3gxL20tLjUpO3UudGJ5MT1NYXRoLmNlaWwocy50Y3kxL20pO3UucmVzb2x1dGlvbj1mO2J1aWxkQ29kZWJsb2NrcygwLHUsZCk7bC5wdXNoKHUpO3AucHVzaCh1KTsodT17fSkudHlwZT0iTEgiO3UudGJ4MD1NYXRoLmNlaWwocy50Y3gwL20pO3UudGJ5MD1NYXRoLmNlaWwocy50Y3kwL20tLjUpO3UudGJ4MT1NYXRoLmNlaWwocy50Y3gxL20pO3UudGJ5MT1NYXRoLmNlaWwocy50Y3kxL20tLjUpO3UucmVzb2x1dGlvbj1mO2J1aWxkQ29kZWJsb2NrcygwLHUsZCk7bC5wdXNoKHUpO3AucHVzaCh1KTsodT17fSkudHlwZT0iSEgiO3UudGJ4MD1NYXRoLmNlaWwocy50Y3gwL20tLjUpO3UudGJ5MD1NYXRoLmNlaWwocy50Y3kwL20tLjUpO3UudGJ4MT1NYXRoLmNlaWwocy50Y3gxL20tLjUpO3UudGJ5MT1NYXRoLmNlaWwocy50Y3kxL20tLjUpO3UucmVzb2x1dGlvbj1mO2J1aWxkQ29kZWJsb2NrcygwLHUsZCk7bC5wdXNoKHUpO3AucHVzaCh1KTtmLnN1YmJhbmRzPXB9fXMucmVzb2x1dGlvbnM9YztzLnN1YmJhbmRzPWx9dmFyIGI9YS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7c3dpdGNoKGIpe2Nhc2UgMDphLnBhY2tldHNJdGVyYXRvcj1uZXcgTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihlKTticmVhaztjYXNlIDE6YS5wYWNrZXRzSXRlcmF0b3I9bmV3IFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSk7YnJlYWs7Y2FzZSAyOmEucGFja2V0c0l0ZXJhdG9yPW5ldyBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKGUpO2JyZWFrO2Nhc2UgMzphLnBhY2tldHNJdGVyYXRvcj1uZXcgUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihlKTticmVhaztjYXNlIDQ6YS5wYWNrZXRzSXRlcmF0b3I9bmV3IENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSnB4RXJyb3IoIlVuc3VwcG9ydGVkIHByb2dyZXNzaW9uIG9yZGVyICIrYil9fWZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoZSxhLG4scyl7dmFyIG8sYz0wLGw9MCxoPSExO2Z1bmN0aW9uIHJlYWRCaXRzKGUpe2Zvcig7bDxlOyl7dmFyIHQ9YVtuK2NdO2MrKztpZihoKXtvPW88PDd8dDtsKz03O2g9ITF9ZWxzZXtvPW88PDh8dDtsKz04fTI1NT09PXQmJihoPSEwKX1yZXR1cm4gbz4+PihsLT1lKSYoMTw8ZSktMX1mdW5jdGlvbiBza2lwTWFya2VySWZFcXVhbChlKXtpZigyNTU9PT1hW24rYy0xXSYmYVtuK2NdPT09ZSl7c2tpcEJ5dGVzKDEpO3JldHVybiEwfWlmKDI1NT09PWFbbitjXSYmYVtuK2MrMV09PT1lKXtza2lwQnl0ZXMoMik7cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gc2tpcEJ5dGVzKGUpe2MrPWV9ZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKXtsPTA7aWYoaCl7YysrO2g9ITF9fWZ1bmN0aW9uIHJlYWRDb2RpbmdwYXNzZXMoKXtpZigwPT09cmVhZEJpdHMoMSkpcmV0dXJuIDE7aWYoMD09PXJlYWRCaXRzKDEpKXJldHVybiAyO3ZhciBlPXJlYWRCaXRzKDIpO3JldHVybiBlPDM/ZSszOihlPXJlYWRCaXRzKDUpKTwzMT9lKzY6KGU9cmVhZEJpdHMoNykpKzM3fWZvcih2YXIgdT1lLmN1cnJlbnRUaWxlLmluZGV4LGQ9ZS50aWxlc1t1XSxmPWUuQ09ELnNvcE1hcmtlclVzZWQsZz1lLkNPRC5lcGhNYXJrZXJVc2VkLG09ZC5wYWNrZXRzSXRlcmF0b3I7YzxzOyl7YWxpZ25Ub0J5dGUoKTtmJiZza2lwTWFya2VySWZFcXVhbCgxNDUpJiZza2lwQnl0ZXMoNCk7dmFyIHA9bS5uZXh0UGFja2V0KCk7aWYocmVhZEJpdHMoMSkpe2Zvcih2YXIgYix5PXAubGF5ZXJOdW1iZXIsdj1bXSx3PTAsaz1wLmNvZGVibG9ja3MubGVuZ3RoO3c8azt3Kyspe3ZhciBTPShiPXAuY29kZWJsb2Nrc1t3XSkucHJlY2luY3QsQz1iLmNieC1TLmNieE1pbix4PWIuY2J5LVMuY2J5TWluLEE9ITEsVD0hMTtpZih2b2lkIDAhPT1iLmluY2x1ZGVkKUE9ISFyZWFkQml0cygxKTtlbHNle3ZhciBJLEY7aWYodm9pZCAwIT09KFM9Yi5wcmVjaW5jdCkuaW5jbHVzaW9uVHJlZSlJPVMuaW5jbHVzaW9uVHJlZTtlbHNle3ZhciBQPVMuY2J4TWF4LVMuY2J4TWluKzEsRT1TLmNieU1heC1TLmNieU1pbisxO0k9bmV3IHIoUCxFLHkpO0Y9bmV3IHQoUCxFKTtTLmluY2x1c2lvblRyZWU9STtTLnplcm9CaXRQbGFuZXNUcmVlPUZ9aWYoSS5yZXNldChDLHgseSkpZm9yKDs7KXtpZighcmVhZEJpdHMoMSkpe0kuaW5jcmVtZW50VmFsdWUoeSk7YnJlYWt9aWYoIUkubmV4dExldmVsKCkpe2IuaW5jbHVkZWQ9ITA7QT1UPSEwO2JyZWFrfX19aWYoQSl7aWYoVCl7KEY9Uy56ZXJvQml0UGxhbmVzVHJlZSkucmVzZXQoQyx4KTtmb3IoOzspaWYocmVhZEJpdHMoMSkpe2lmKCFGLm5leHRMZXZlbCgpKWJyZWFrfWVsc2UgRi5pbmNyZW1lbnRWYWx1ZSgpO2IuemVyb0JpdFBsYW5lcz1GLnZhbHVlfWZvcih2YXIgQj1yZWFkQ29kaW5ncGFzc2VzKCk7cmVhZEJpdHMoMSk7KWIuTGJsb2NrKys7dmFyIE89KDAsaS5sb2cyKShCKSxNPXJlYWRCaXRzKChCPDE8PE8/Ty0xOk8pK2IuTGJsb2NrKTt2LnB1c2goe2NvZGVibG9jazpiLGNvZGluZ3Bhc3NlczpCLGRhdGFMZW5ndGg6TX0pfX1hbGlnblRvQnl0ZSgpO2cmJnNraXBNYXJrZXJJZkVxdWFsKDE0Nik7Zm9yKDt2Lmxlbmd0aD4wOyl7dmFyIEQ9di5zaGlmdCgpO3ZvaWQgMD09PShiPUQuY29kZWJsb2NrKS5kYXRhJiYoYi5kYXRhPVtdKTtiLmRhdGEucHVzaCh7ZGF0YTphLHN0YXJ0Om4rYyxlbmQ6bitjK0QuZGF0YUxlbmd0aCxjb2RpbmdwYXNzZXM6RC5jb2RpbmdwYXNzZXN9KTtjKz1ELmRhdGFMZW5ndGh9fX1yZXR1cm4gY31mdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKGUsdCxyLGEsaSxvLGMsbCl7Zm9yKHZhciBoPWEudGJ4MCx1PWEudGJ5MCxkPWEudGJ4MS1hLnRieDAsZj1hLmNvZGVibG9ja3MsZz0iSCI9PT1hLnR5cGUuY2hhckF0KDApPzE6MCxtPSJIIj09PWEudHlwZS5jaGFyQXQoMSk/dDowLHA9MCxiPWYubGVuZ3RoO3A8YjsrK3Ape3ZhciB5PWZbcF0sdj15LnRieDFfLXkudGJ4MF8sdz15LnRieTFfLXkudGJ5MF87aWYoMCE9PXYmJjAhPT13JiZ2b2lkIDAhPT15LmRhdGEpe3ZhciBrLFM7az1uZXcgcyh2LHcseS5zdWJiYW5kVHlwZSx5Lnplcm9CaXRQbGFuZXMsbyk7Uz0yO3ZhciBDLHgsQSxUPXkuZGF0YSxJPTAsRj0wO2ZvcihDPTAseD1ULmxlbmd0aDtDPHg7QysrKXtJKz0oQT1UW0NdKS5lbmQtQS5zdGFydDtGKz1BLmNvZGluZ3Bhc3Nlc312YXIgUD1uZXcgVWludDhBcnJheShJKSxFPTA7Zm9yKEM9MCx4PVQubGVuZ3RoO0M8eDtDKyspe3ZhciBCPShBPVRbQ10pLmRhdGEuc3ViYXJyYXkoQS5zdGFydCxBLmVuZCk7UC5zZXQoQixFKTtFKz1CLmxlbmd0aH12YXIgTz1uZXcgbi5Bcml0aG1ldGljRGVjb2RlcihQLDAsSSk7ay5zZXREZWNvZGVyKE8pO2ZvcihDPTA7QzxGO0MrKyl7c3dpdGNoKFMpe2Nhc2UgMDprLnJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpO2JyZWFrO2Nhc2UgMTprLnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7YnJlYWs7Y2FzZSAyOmsucnVuQ2xlYW51cFBhc3MoKTtsJiZrLmNoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCl9Uz0oUysxKSUzfXZhciBNLEQsUixOPXkudGJ4MF8taCsoeS50YnkwXy11KSpkLEw9ay5jb2VmZmljZW50c1NpZ24sXz1rLmNvZWZmaWNlbnRzTWFnbml0dWRlLFU9ay5iaXRzRGVjb2RlZCxxPWM/MDouNTtFPTA7dmFyIGo9IkxMIiE9PWEudHlwZTtmb3IoQz0wO0M8dztDKyspe3ZhciBIPTIqKE4vZHwwKSoodC1kKStnK207Zm9yKE09MDtNPHY7TSsrKXtpZigwIT09KEQ9X1tFXSkpe0Q9KEQrcSkqaTswIT09TFtFXSYmKEQ9LUQpO1I9VVtFXTt2YXIgej1qP0grKE48PDEpOk47ZVt6XT1jJiZSPj1vP0Q6RCooMTw8by1SKX1OKys7RSsrfU4rPWQtdn19fX1mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHQscixhKXtmb3IodmFyIGk9ci5jb21wb25lbnRzW2FdLG49aS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMscz1pLnF1YW50aXphdGlvblBhcmFtZXRlcnMsbz1uLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCxoPXMuU1BxY2RzLHU9cy5zY2FsYXJFeHBvdW5kZWQsZD1zLmd1YXJkQml0cyxmPW4uc2VnbWVudGF0aW9uU3ltYm9sVXNlZCxnPXQuY29tcG9uZW50c1thXS5wcmVjaXNpb24sbT1uLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbixwPW0/bmV3IGw6bmV3IGMsYj1bXSx5PTAsdj0wO3Y8PW87disrKXtmb3IodmFyIHc9aS5yZXNvbHV0aW9uc1t2XSxrPXcudHJ4MS13LnRyeDAsUz13LnRyeTEtdy50cnkwLEM9bmV3IEZsb2F0MzJBcnJheShrKlMpLHg9MCxBPXcuc3ViYmFuZHMubGVuZ3RoO3g8QTt4Kyspe3ZhciBULEk7aWYodSl7VD1oW3ldLm11O0k9aFt5XS5lcHNpbG9uO3krK31lbHNle1Q9aFswXS5tdTtJPWhbMF0uZXBzaWxvbisodj4wPzEtdjowKX12YXIgRj13LnN1YmJhbmRzW3hdLFA9ZVtGLnR5cGVdO2NvcHlDb2VmZmljaWVudHMoQyxrLDAsRixtPzE6MioqKGcrUC1JKSooMStULzIwNDgpLGQrSS0xLG0sZil9Yi5wdXNoKHt3aWR0aDprLGhlaWdodDpTLGl0ZW1zOkN9KX12YXIgRT1wLmNhbGN1bGF0ZShiLGkudGN4MCxpLnRjeTApO3JldHVybntsZWZ0OmkudGN4MCx0b3A6aS50Y3kwLHdpZHRoOkUud2lkdGgsaGVpZ2h0OkUuaGVpZ2h0LGl0ZW1zOkUuaXRlbXN9fWZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGUsdCl7Zm9yKHZhciByPWUuU0laLkNzaXosYT1lLnRpbGVzW3RdLGk9MDtpPHI7aSsrKXt2YXIgbj1hLmNvbXBvbmVudHNbaV0scz12b2lkIDAhPT1lLmN1cnJlbnRUaWxlLlFDQ1tpXT9lLmN1cnJlbnRUaWxlLlFDQ1tpXTplLmN1cnJlbnRUaWxlLlFDRDtuLnF1YW50aXphdGlvblBhcmFtZXRlcnM9czt2YXIgbz12b2lkIDAhPT1lLmN1cnJlbnRUaWxlLkNPQ1tpXT9lLmN1cnJlbnRUaWxlLkNPQ1tpXTplLmN1cnJlbnRUaWxlLkNPRDtuLmNvZGluZ1N0eWxlUGFyYW1ldGVycz1vfWEuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycz1lLmN1cnJlbnRUaWxlLkNPRH12YXIgdD1mdW5jdGlvbiBUYWdUcmVlQ2xvc3VyZSgpe2Z1bmN0aW9uIFRhZ1RyZWUoZSx0KXt2YXIgcj0oMCxpLmxvZzIpKE1hdGgubWF4KGUsdCkpKzE7dGhpcy5sZXZlbHM9W107Zm9yKHZhciBhPTA7YTxyO2ErKyl7dmFyIG49e3dpZHRoOmUsaGVpZ2h0OnQsaXRlbXM6W119O3RoaXMubGV2ZWxzLnB1c2gobik7ZT1NYXRoLmNlaWwoZS8yKTt0PU1hdGguY2VpbCh0LzIpfX1UYWdUcmVlLnByb3RvdHlwZT17cmVzZXQ6ZnVuY3Rpb24gVGFnVHJlZV9yZXNldChlLHQpe2Zvcih2YXIgcixhPTAsaT0wO2E8dGhpcy5sZXZlbHMubGVuZ3RoOyl7dmFyIG49ZSt0KihyPXRoaXMubGV2ZWxzW2FdKS53aWR0aDtpZih2b2lkIDAhPT1yLml0ZW1zW25dKXtpPXIuaXRlbXNbbl07YnJlYWt9ci5pbmRleD1uO2U+Pj0xO3Q+Pj0xO2ErK31hLS07KHI9dGhpcy5sZXZlbHNbYV0pLml0ZW1zW3IuaW5kZXhdPWk7dGhpcy5jdXJyZW50TGV2ZWw9YTtkZWxldGUgdGhpcy52YWx1ZX0saW5jcmVtZW50VmFsdWU6ZnVuY3Rpb24gVGFnVHJlZV9pbmNyZW1lbnRWYWx1ZSgpe3ZhciBlPXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTtlLml0ZW1zW2UuaW5kZXhdKyt9LG5leHRMZXZlbDpmdW5jdGlvbiBUYWdUcmVlX25leHRMZXZlbCgpe3ZhciBlPXRoaXMuY3VycmVudExldmVsLHQ9dGhpcy5sZXZlbHNbZV0scj10Lml0ZW1zW3QuaW5kZXhdO2lmKC0tZTwwKXt0aGlzLnZhbHVlPXI7cmV0dXJuITF9dGhpcy5jdXJyZW50TGV2ZWw9ZTsodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cjtyZXR1cm4hMH19O3JldHVybiBUYWdUcmVlfSgpLHI9ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZUNsb3N1cmUoKXtmdW5jdGlvbiBJbmNsdXNpb25UcmVlKGUsdCxyKXt2YXIgYT0oMCxpLmxvZzIpKE1hdGgubWF4KGUsdCkpKzE7dGhpcy5sZXZlbHM9W107Zm9yKHZhciBuPTA7bjxhO24rKyl7Zm9yKHZhciBzPW5ldyBVaW50OEFycmF5KGUqdCksbz0wLGM9cy5sZW5ndGg7bzxjO28rKylzW29dPXI7dmFyIGw9e3dpZHRoOmUsaGVpZ2h0OnQsaXRlbXM6c307dGhpcy5sZXZlbHMucHVzaChsKTtlPU1hdGguY2VpbChlLzIpO3Q9TWF0aC5jZWlsKHQvMil9fUluY2x1c2lvblRyZWUucHJvdG90eXBlPXtyZXNldDpmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Jlc2V0KGUsdCxyKXtmb3IodmFyIGE9MDthPHRoaXMubGV2ZWxzLmxlbmd0aDspe3ZhciBpPXRoaXMubGV2ZWxzW2FdLG49ZSt0Kmkud2lkdGg7aS5pbmRleD1uO3ZhciBzPWkuaXRlbXNbbl07aWYoMjU1PT09cylicmVhaztpZihzPnIpe3RoaXMuY3VycmVudExldmVsPWE7dGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTtyZXR1cm4hMX1lPj49MTt0Pj49MTthKyt9dGhpcy5jdXJyZW50TGV2ZWw9YS0xO3JldHVybiEwfSxpbmNyZW1lbnRWYWx1ZTpmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKGUpe3ZhciB0PXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTt0Lml0ZW1zW3QuaW5kZXhdPWUrMTt0aGlzLnByb3BhZ2F0ZVZhbHVlcygpfSxwcm9wYWdhdGVWYWx1ZXM6ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9wcm9wYWdhdGVWYWx1ZXMoKXtmb3IodmFyIGU9dGhpcy5jdXJyZW50TGV2ZWwsdD10aGlzLmxldmVsc1tlXSxyPXQuaXRlbXNbdC5pbmRleF07LS1lPj0wOykodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cn0sbmV4dExldmVsOmZ1bmN0aW9uIEluY2x1c2lvblRyZWVfbmV4dExldmVsKCl7dmFyIGU9dGhpcy5jdXJyZW50TGV2ZWwsdD10aGlzLmxldmVsc1tlXSxyPXQuaXRlbXNbdC5pbmRleF07dC5pdGVtc1t0LmluZGV4XT0yNTU7aWYoLS1lPDApcmV0dXJuITE7dGhpcy5jdXJyZW50TGV2ZWw9ZTsodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cjtyZXR1cm4hMH19O3JldHVybiBJbmNsdXNpb25UcmVlfSgpLHM9ZnVuY3Rpb24gQml0TW9kZWxDbG9zdXJlKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoWzAsNSw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMSw2LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwyLDYsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDIsNiw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMiw2LDgsMCwzLDcsOCwwLDQsNyw4XSksdD1uZXcgVWludDhBcnJheShbMCwzLDQsMCw1LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwxLDMsNCwwLDYsNyw3LDAsOCw4LDgsMCwwLDAsMCwwLDIsMyw0LDAsNiw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMiwzLDQsMCw2LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwyLDMsNCwwLDYsNyw3LDAsOCw4LDhdKSxyPW5ldyBVaW50OEFycmF5KFswLDEsMiwwLDEsMiwyLDAsMiwyLDIsMCwwLDAsMCwwLDMsNCw1LDAsNCw1LDUsMCw1LDUsNSwwLDAsMCwwLDAsNiw3LDcsMCw3LDcsNywwLDcsNyw3LDAsMCwwLDAsMCw4LDgsOCwwLDgsOCw4LDAsOCw4LDgsMCwwLDAsMCwwLDgsOCw4LDAsOCw4LDgsMCw4LDgsOF0pO2Z1bmN0aW9uIEJpdE1vZGVsKGEsaSxuLHMsbyl7dGhpcy53aWR0aD1hO3RoaXMuaGVpZ2h0PWk7bGV0IGM7Yz0iSEgiPT09bj9yOiJITCI9PT1uP3Q6ZTt0aGlzLmNvbnRleHRMYWJlbFRhYmxlPWM7dmFyIGw9YSppO3RoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlPW5ldyBVaW50OEFycmF5KGwpO3RoaXMuY29lZmZpY2VudHNTaWduPW5ldyBVaW50OEFycmF5KGwpO2xldCBoO2g9bz4xND9uZXcgVWludDMyQXJyYXkobCk6bz42P25ldyBVaW50MTZBcnJheShsKTpuZXcgVWludDhBcnJheShsKTt0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlPWg7dGhpcy5wcm9jZXNzaW5nRmxhZ3M9bmV3IFVpbnQ4QXJyYXkobCk7dmFyIHU9bmV3IFVpbnQ4QXJyYXkobCk7aWYoMCE9PXMpZm9yKHZhciBkPTA7ZDxsO2QrKyl1W2RdPXM7dGhpcy5iaXRzRGVjb2RlZD11O3RoaXMucmVzZXQoKX1CaXRNb2RlbC5wcm90b3R5cGU9e3NldERlY29kZXI6ZnVuY3Rpb24gQml0TW9kZWxfc2V0RGVjb2RlcihlKXt0aGlzLmRlY29kZXI9ZX0scmVzZXQ6ZnVuY3Rpb24gQml0TW9kZWxfcmVzZXQoKXt0aGlzLmNvbnRleHRzPW5ldyBJbnQ4QXJyYXkoMTkpO3RoaXMuY29udGV4dHNbMF09ODt0aGlzLmNvbnRleHRzWzE3XT05Mjt0aGlzLmNvbnRleHRzWzE4XT02fSxzZXROZWlnaGJvcnNTaWduaWZpY2FuY2U6ZnVuY3Rpb24gQml0TW9kZWxfc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGUsdCxyKXt2YXIgYSxpPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLG49dGhpcy53aWR0aCxzPXRoaXMuaGVpZ2h0LG89dD4wLGM9dCsxPG47aWYoZT4wKXthPXItbjtvJiYoaVthLTFdKz0xNik7YyYmKGlbYSsxXSs9MTYpO2lbYV0rPTR9aWYoZSsxPHMpe2E9cituO28mJihpW2EtMV0rPTE2KTtjJiYoaVthKzFdKz0xNik7aVthXSs9NH1vJiYoaVtyLTFdKz0xKTtjJiYoaVtyKzFdKz0xKTtpW3JdfD0xMjh9LHJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzczpmdW5jdGlvbiBCaXRNb2RlbF9ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKXtmb3IodmFyIGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LGE9dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSxpPXRoaXMuY29lZmZpY2VudHNTaWduLG49dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2Uscz10aGlzLnByb2Nlc3NpbmdGbGFncyxvPXRoaXMuY29udGV4dHMsYz10aGlzLmNvbnRleHRMYWJlbFRhYmxlLGw9dGhpcy5iaXRzRGVjb2RlZCxoPTA7aDxyO2grPTQpZm9yKHZhciB1PTA7dTx0O3UrKylmb3IodmFyIGQ9aCp0K3UsZj0wO2Y8NDtmKyssZCs9dCl7dmFyIGc9aCtmO2lmKGc+PXIpYnJlYWs7c1tkXSY9LTI7aWYoIWFbZF0mJm5bZF0pe3ZhciBtPWNbbltkXV07aWYoZS5yZWFkQml0KG8sbSkpe3ZhciBwPXRoaXMuZGVjb2RlU2lnbkJpdChnLHUsZCk7aVtkXT1wO2FbZF09MTt0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShnLHUsZCk7c1tkXXw9Mn1sW2RdKys7c1tkXXw9MX19fSxkZWNvZGVTaWduQml0OmZ1bmN0aW9uIEJpdE1vZGVsX2RlY29kZVNpZ25CaXQoZSx0LHIpe3ZhciBhLGksbixzLG8sYyxsPXRoaXMud2lkdGgsaD10aGlzLmhlaWdodCx1PXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUsZD10aGlzLmNvZWZmaWNlbnRzU2lnbjtzPXQ+MCYmMCE9PXVbci0xXTtpZih0KzE8bCYmMCE9PXVbcisxXSl7bj1kW3IrMV07YT1zPzEtbi0oaT1kW3ItMV0pOjEtbi1ufWVsc2UgYT1zPzEtKGk9ZFtyLTFdKS1pOjA7dmFyIGY9MyphO3M9ZT4wJiYwIT09dVtyLWxdO2lmKGUrMTxoJiYwIT09dVtyK2xdKXtuPWRbcitsXTthPXM/MS1uLShpPWRbci1sXSkrZjoxLW4tbitmfWVsc2UgYT1zPzEtKGk9ZFtyLWxdKS1pK2Y6ZjtpZihhPj0wKXtvPTkrYTtjPXRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsbyl9ZWxzZXtvPTktYTtjPTFedGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cyxvKX1yZXR1cm4gY30scnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3M6ZnVuY3Rpb24gQml0TW9kZWxfcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKXtmb3IodmFyIGUsdD10aGlzLmRlY29kZXIscj10aGlzLndpZHRoLGE9dGhpcy5oZWlnaHQsaT10aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlLG49dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2Uscz10aGlzLmNvbnRleHRzLG89dGhpcy5iaXRzRGVjb2RlZCxjPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLGw9ciphLGg9NCpyLHU9MDt1PGw7dT1lKXtlPU1hdGgubWluKGwsdStoKTtmb3IodmFyIGQ9MDtkPHI7ZCsrKWZvcih2YXIgZj11K2Q7ZjxlO2YrPXIpaWYoaVtmXSYmMD09KDEmY1tmXSkpe3ZhciBnPTE2O2lmKDAhPSgyJmNbZl0pKXtjW2ZdXj0yO2c9MD09PSgxMjcmbltmXSk/MTU6MTR9dmFyIG09dC5yZWFkQml0KHMsZyk7aVtmXT1pW2ZdPDwxfG07b1tmXSsrO2NbZl18PTF9fX0scnVuQ2xlYW51cFBhc3M6ZnVuY3Rpb24gQml0TW9kZWxfcnVuQ2xlYW51cFBhc3MoKXtmb3IodmFyIGUsdD10aGlzLmRlY29kZXIscj10aGlzLndpZHRoLGE9dGhpcy5oZWlnaHQsaT10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxuPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUscz10aGlzLmNvZWZmaWNlbnRzU2lnbixvPXRoaXMuY29udGV4dHMsYz10aGlzLmNvbnRleHRMYWJlbFRhYmxlLGw9dGhpcy5iaXRzRGVjb2RlZCxoPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLHU9cixkPTIqcixmPTMqcixnPTA7ZzxhO2c9ZSl7ZT1NYXRoLm1pbihnKzQsYSk7Zm9yKHZhciBtPWcqcixwPWcrMzxhLGI9MDtiPHI7YisrKXt2YXIgeSx2PW0rYix3PTAsaz12LFM9ZztpZihwJiYwPT09aFt2XSYmMD09PWhbdit1XSYmMD09PWhbditkXSYmMD09PWhbditmXSYmMD09PWlbdl0mJjA9PT1pW3YrdV0mJjA9PT1pW3YrZF0mJjA9PT1pW3YrZl0pe2lmKCF0LnJlYWRCaXQobywxOCkpe2xbdl0rKztsW3YrdV0rKztsW3YrZF0rKztsW3YrZl0rKztjb250aW51ZX1pZigwIT09KHc9dC5yZWFkQml0KG8sMTcpPDwxfHQucmVhZEJpdChvLDE3KSkpe1M9Zyt3O2srPXcqcn15PXRoaXMuZGVjb2RlU2lnbkJpdChTLGIsayk7c1trXT15O25ba109MTt0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShTLGIsayk7aFtrXXw9MjtrPXY7Zm9yKHZhciBDPWc7Qzw9UztDKyssays9cilsW2tdKys7dysrfWZvcihTPWcrdztTPGU7UysrLGsrPXIpaWYoIW5ba10mJjA9PSgxJmhba10pKXt2YXIgeD1jW2lba11dO2lmKDE9PT10LnJlYWRCaXQobyx4KSl7eT10aGlzLmRlY29kZVNpZ25CaXQoUyxiLGspO3Nba109eTtuW2tdPTE7dGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoUyxiLGspO2hba118PTJ9bFtrXSsrfX19fSxjaGVja1NlZ21lbnRhdGlvblN5bWJvbDpmdW5jdGlvbiBCaXRNb2RlbF9jaGVja1NlZ21lbnRhdGlvblN5bWJvbCgpe3ZhciBlPXRoaXMuZGVjb2Rlcix0PXRoaXMuY29udGV4dHM7aWYoMTAhPT0oZS5yZWFkQml0KHQsMTcpPDwzfGUucmVhZEJpdCh0LDE3KTw8MnxlLnJlYWRCaXQodCwxNyk8PDF8ZS5yZWFkQml0KHQsMTcpKSl0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgc2VnbWVudGF0aW9uIHN5bWJvbCIpfX07cmV0dXJuIEJpdE1vZGVsfSgpLG89ZnVuY3Rpb24gVHJhbnNmb3JtQ2xvc3VyZSgpe2Z1bmN0aW9uIFRyYW5zZm9ybSgpe31UcmFuc2Zvcm0ucHJvdG90eXBlLmNhbGN1bGF0ZT1mdW5jdGlvbiB0cmFuc2Zvcm1DYWxjdWxhdGUoZSx0LHIpe2Zvcih2YXIgYT1lWzBdLGk9MSxuPWUubGVuZ3RoO2k8bjtpKyspYT10aGlzLml0ZXJhdGUoYSxlW2ldLHQscik7cmV0dXJuIGF9O1RyYW5zZm9ybS5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uIGV4dGVuZChlLHQscil7dmFyIGE9dC0xLGk9dCsxLG49dCtyLTIscz10K3I7ZVthLS1dPWVbaSsrXTtlW3MrK109ZVtuLS1dO2VbYS0tXT1lW2krK107ZVtzKytdPWVbbi0tXTtlW2EtLV09ZVtpKytdO2VbcysrXT1lW24tLV07ZVthXT1lW2ldO2Vbc109ZVtuXX07VHJhbnNmb3JtLnByb3RvdHlwZS5pdGVyYXRlPWZ1bmN0aW9uIFRyYW5zZm9ybV9pdGVyYXRlKGUsdCxyLGEpe3ZhciBpLG4scyxvLGMsbCxoPWUud2lkdGgsdT1lLmhlaWdodCxkPWUuaXRlbXMsZj10LndpZHRoLGc9dC5oZWlnaHQsbT10Lml0ZW1zO2ZvcihzPTAsaT0wO2k8dTtpKyspe289MippKmY7Zm9yKG49MDtuPGg7bisrLHMrKyxvKz0yKW1bb109ZFtzXX1kPWUuaXRlbXM9bnVsbDt2YXIgcD1uZXcgRmxvYXQzMkFycmF5KGYrOCk7aWYoMT09PWYpe2lmKDAhPSgxJnIpKWZvcihsPTAscz0wO2w8ZztsKysscys9ZiltW3NdKj0uNX1lbHNlIGZvcihsPTAscz0wO2w8ZztsKysscys9Zil7cC5zZXQobS5zdWJhcnJheShzLHMrZiksNCk7dGhpcy5leHRlbmQocCw0LGYpO3RoaXMuZmlsdGVyKHAsNCxmKTttLnNldChwLnN1YmFycmF5KDQsNCtmKSxzKX12YXIgYj0xNix5PVtdO2ZvcihpPTA7aTxiO2krKyl5LnB1c2gobmV3IEZsb2F0MzJBcnJheShnKzgpKTt2YXIgdix3PTA7ZT00K2c7aWYoMT09PWcpe2lmKDAhPSgxJmEpKWZvcihjPTA7YzxmO2MrKyltW2NdKj0uNX1lbHNlIGZvcihjPTA7YzxmO2MrKyl7aWYoMD09PXcpe2I9TWF0aC5taW4oZi1jLGIpO2ZvcihzPWMsbz00O288ZTtzKz1mLG8rKylmb3Iodj0wO3Y8Yjt2KyspeVt2XVtvXT1tW3Mrdl07dz1ifXZhciBrPXlbLS13XTt0aGlzLmV4dGVuZChrLDQsZyk7dGhpcy5maWx0ZXIoayw0LGcpO2lmKDA9PT13KXtzPWMtYisxO2ZvcihvPTQ7bzxlO3MrPWYsbysrKWZvcih2PTA7djxiO3YrKyltW3Mrdl09eVt2XVtvXX19cmV0dXJue3dpZHRoOmYsaGVpZ2h0OmcsaXRlbXM6bX19O3JldHVybiBUcmFuc2Zvcm19KCksYz1mdW5jdGlvbiBJcnJldmVyc2libGVUcmFuc2Zvcm1DbG9zdXJlKCl7ZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCl7by5jYWxsKHRoaXMpfUlycmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSk7SXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24gaXJyZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKGUsdCxyKXt2YXIgYSxpLG4scyxvPXI+PjEsYz0tMS41ODYxMzQzNDIwNTk5MjQsbD0tLjA1Mjk4MDExODU3Mjk2MSxoPS44ODI5MTEwNzU1MzA5MzQsdT0uNDQzNTA2ODUyMDQzOTcxLGQ9MS4yMzAxNzQxMDQ5MTQwMDE7YT0odHw9MCktMztmb3IoaT1vKzQ7aS0tO2ErPTIpZVthXSo9LjgxMjg5MzA2NjExNTk2MDk7bj11KmVbKGE9dC0yKS0xXTtmb3IoaT1vKzM7aS0tO2ErPTIpe3M9dSplW2ErMV07ZVthXT1kKmVbYV0tbi1zO2lmKCFpLS0pYnJlYWs7bj11KmVbKGErPTIpKzFdO2VbYV09ZCplW2FdLW4tc31uPWgqZVsoYT10LTEpLTFdO2ZvcihpPW8rMjtpLS07YSs9Mil7cz1oKmVbYSsxXTtlW2FdLT1uK3M7aWYoIWktLSlicmVhaztuPWgqZVsoYSs9MikrMV07ZVthXS09bitzfW49bCplWyhhPXQpLTFdO2ZvcihpPW8rMTtpLS07YSs9Mil7cz1sKmVbYSsxXTtlW2FdLT1uK3M7aWYoIWktLSlicmVhaztuPWwqZVsoYSs9MikrMV07ZVthXS09bitzfWlmKDAhPT1vKXtuPWMqZVsoYT10KzEpLTFdO2ZvcihpPW87aS0tO2ErPTIpe3M9YyplW2ErMV07ZVthXS09bitzO2lmKCFpLS0pYnJlYWs7bj1jKmVbKGErPTIpKzFdO2VbYV0tPW4rc319fTtyZXR1cm4gSXJyZXZlcnNpYmxlVHJhbnNmb3JtfSgpLGw9ZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKXtmdW5jdGlvbiBSZXZlcnNpYmxlVHJhbnNmb3JtKCl7by5jYWxsKHRoaXMpfVJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpO1JldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbiByZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKGUsdCxyKXt2YXIgYSxpLG49cj4+MTtmb3IoYT10fD0wLGk9bisxO2ktLTthKz0yKWVbYV0tPWVbYS0xXStlW2ErMV0rMj4+Mjtmb3IoYT10KzEsaT1uO2ktLTthKz0yKWVbYV0rPWVbYS0xXStlW2ErMV0+PjF9O3JldHVybiBSZXZlcnNpYmxlVHJhbnNmb3JtfSgpO3JldHVybiBKcHhJbWFnZX0oKTt0LkpweEltYWdlPXN9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuY2FsY3VsYXRlU0hBNTEyPXQuY2FsY3VsYXRlU0hBMzg0PXQuY2FsY3VsYXRlU0hBMjU2PXQuY2FsY3VsYXRlTUQ1PXQuUERGMjA9dC5QREYxNz10LkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk9dC5BUkNGb3VyQ2lwaGVyPXQuQUVTMjU2Q2lwaGVyPXQuQUVTMTI4Q2lwaGVyPXZvaWQgMDt2YXIgYT1yKDIpLGk9cig1KSxuPXIoMTIpLHM9ZnVuY3Rpb24gQVJDRm91ckNpcGhlckNsb3N1cmUoKXtmdW5jdGlvbiBBUkNGb3VyQ2lwaGVyKGUpe3RoaXMuYT0wO3RoaXMuYj0wO3ZhciB0LHIsYT1uZXcgVWludDhBcnJheSgyNTYpLGk9MCxuPWUubGVuZ3RoO2Zvcih0PTA7dDwyNTY7Kyt0KWFbdF09dDtmb3IodD0wO3Q8MjU2OysrdCl7aT1pKyhyPWFbdF0pK2VbdCVuXSYyNTU7YVt0XT1hW2ldO2FbaV09cn10aGlzLnM9YX1BUkNGb3VyQ2lwaGVyLnByb3RvdHlwZT17ZW5jcnlwdEJsb2NrOmZ1bmN0aW9uIEFSQ0ZvdXJDaXBoZXJfZW5jcnlwdEJsb2NrKGUpe3ZhciB0LHIsYSxpPWUubGVuZ3RoLG49dGhpcy5hLHM9dGhpcy5iLG89dGhpcy5zLGM9bmV3IFVpbnQ4QXJyYXkoaSk7Zm9yKHQ9MDt0PGk7Kyt0KXthPW9bcz1zKyhyPW9bbj1uKzEmMjU1XSkmMjU1XTtvW25dPWE7b1tzXT1yO2NbdF09ZVt0XV5vW3IrYSYyNTVdfXRoaXMuYT1uO3RoaXMuYj1zO3JldHVybiBjfX07QVJDRm91ckNpcGhlci5wcm90b3R5cGUuZGVjcnlwdEJsb2NrPUFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHRCbG9jaztBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5lbmNyeXB0PUFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHRCbG9jaztyZXR1cm4gQVJDRm91ckNpcGhlcn0oKTt0LkFSQ0ZvdXJDaXBoZXI9czt2YXIgbz1mdW5jdGlvbiBjYWxjdWxhdGVNRDVDbG9zdXJlKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoWzcsMTIsMTcsMjIsNywxMiwxNywyMiw3LDEyLDE3LDIyLDcsMTIsMTcsMjIsNSw5LDE0LDIwLDUsOSwxNCwyMCw1LDksMTQsMjAsNSw5LDE0LDIwLDQsMTEsMTYsMjMsNCwxMSwxNiwyMyw0LDExLDE2LDIzLDQsMTEsMTYsMjMsNiwxMCwxNSwyMSw2LDEwLDE1LDIxLDYsMTAsMTUsMjEsNiwxMCwxNSwyMV0pLHQ9bmV3IEludDMyQXJyYXkoWy02ODA4NzY5MzYsLTM4OTU2NDU4Niw2MDYxMDU4MTksLTEwNDQ1MjUzMzAsLTE3NjQxODg5NywxMjAwMDgwNDI2LC0xNDczMjMxMzQxLC00NTcwNTk4MywxNzcwMDM1NDE2LC0xOTU4NDE0NDE3LC00MjA2MywtMTk5MDQwNDE2MiwxODA0NjAzNjgyLC00MDM0MTEwMSwtMTUwMjAwMjI5MCwxMjM2NTM1MzI5LC0xNjU3OTY1MTAsLTEwNjk1MDE2MzIsNjQzNzE3NzEzLC0zNzM4OTczMDIsLTcwMTU1ODY5MSwzODAxNjA4MywtNjYwNDc4MzM1LC00MDU1Mzc4NDgsNTY4NDQ2NDM4LC0xMDE5ODAzNjkwLC0xODczNjM5NjEsMTE2MzUzMTUwMSwtMTQ0NDY4MTQ2NywtNTE0MDM3ODQsMTczNTMyODQ3MywtMTkyNjYwNzczNCwtMzc4NTU4LC0yMDIyNTc0NDYzLDE4MzkwMzA1NjIsLTM1MzA5NTU2LC0xNTMwOTkyMDYwLDEyNzI4OTMzNTMsLTE1NTQ5NzYzMiwtMTA5NDczMDY0MCw2ODEyNzkxNzQsLTM1ODUzNzIyMiwtNzIyNTIxOTc5LDc2MDI5MTg5LC02NDAzNjQ0ODcsLTQyMTgxNTgzNSw1MzA3NDI1MjAsLTk5NTMzODY1MSwtMTk4NjMwODQ0LDExMjY4OTE0MTUsLTE0MTYzNTQ5MDUsLTU3NDM0MDU1LDE3MDA0ODU1NzEsLTE4OTQ5ODY2MDYsLTEwNTE1MjMsLTIwNTQ5MjI3OTksMTg3MzMxMzM1OSwtMzA2MTE3NDQsLTE1NjAxOTgzODAsMTMwOTE1MTY0OSwtMTQ1NTIzMDcwLC0xMTIwMjEwMzc5LDcxODc4NzI1OSwtMzQzNDg1NTUxXSk7cmV0dXJuIGZ1bmN0aW9uIGhhc2gocixhLGkpe3ZhciBuLHMsbyxjPTE3MzI1ODQxOTMsbD0tMjcxNzMzODc5LGg9LTE3MzI1ODQxOTQsdT0yNzE3MzM4NzgsZD1pKzcyJi02NCxmPW5ldyBVaW50OEFycmF5KGQpO2ZvcihuPTA7bjxpOysrbilmW25dPXJbYSsrXTtmW24rK109MTI4O289ZC04O2Zvcig7bjxvOylmW24rK109MDtmW24rK109aTw8MyYyNTU7ZltuKytdPWk+PjUmMjU1O2ZbbisrXT1pPj4xMyYyNTU7ZltuKytdPWk+PjIxJjI1NTtmW24rK109aT4+PjI5JjI1NTtmW24rK109MDtmW24rK109MDtmW24rK109MDt2YXIgZz1uZXcgSW50MzJBcnJheSgxNik7Zm9yKG49MDtuPGQ7KXtmb3Iocz0wO3M8MTY7KytzLG4rPTQpZ1tzXT1mW25dfGZbbisxXTw8OHxmW24rMl08PDE2fGZbbiszXTw8MjQ7dmFyIG0scCxiPWMseT1sLHY9aCx3PXU7Zm9yKHM9MDtzPDY0Oysrcyl7aWYoczwxNil7bT15JnZ8fnkmdztwPXN9ZWxzZSBpZihzPDMyKXttPXcmeXx+dyZ2O3A9NSpzKzEmMTV9ZWxzZSBpZihzPDQ4KXttPXledl53O3A9MypzKzUmMTV9ZWxzZXttPXZeKHl8fncpO3A9NypzJjE1fXZhciBrPXcsUz1iK20rdFtzXStnW3BdfDAsQz1lW3NdO3c9djt2PXk7eT15KyhTPDxDfFM+Pj4zMi1DKXwwO2I9a31jPWMrYnwwO2w9bCt5fDA7aD1oK3Z8MDt1PXUrd3wwfXJldHVybiBuZXcgVWludDhBcnJheShbMjU1JmMsYz4+OCYyNTUsYz4+MTYmMjU1LGM+Pj4yNCYyNTUsMjU1JmwsbD4+OCYyNTUsbD4+MTYmMjU1LGw+Pj4yNCYyNTUsMjU1JmgsaD4+OCYyNTUsaD4+MTYmMjU1LGg+Pj4yNCYyNTUsMjU1JnUsdT4+OCYyNTUsdT4+MTYmMjU1LHU+Pj4yNCYyNTVdKX19KCk7dC5jYWxjdWxhdGVNRDU9bzt2YXIgYz1mdW5jdGlvbiBXb3JkNjRDbG9zdXJlKCl7ZnVuY3Rpb24gV29yZDY0KGUsdCl7dGhpcy5oaWdoPTB8ZTt0aGlzLmxvdz0wfHR9V29yZDY0LnByb3RvdHlwZT17YW5kOmZ1bmN0aW9uIFdvcmQ2NF9hbmQoZSl7dGhpcy5oaWdoJj1lLmhpZ2g7dGhpcy5sb3cmPWUubG93fSx4b3I6ZnVuY3Rpb24gV29yZDY0X3hvcihlKXt0aGlzLmhpZ2hePWUuaGlnaDt0aGlzLmxvd149ZS5sb3d9LG9yOmZ1bmN0aW9uIFdvcmQ2NF9vcihlKXt0aGlzLmhpZ2h8PWUuaGlnaDt0aGlzLmxvd3w9ZS5sb3d9LHNoaWZ0UmlnaHQ6ZnVuY3Rpb24gV29yZDY0X3NoaWZ0UmlnaHQoZSl7aWYoZT49MzIpe3RoaXMubG93PXRoaXMuaGlnaD4+PmUtMzJ8MDt0aGlzLmhpZ2g9MH1lbHNle3RoaXMubG93PXRoaXMubG93Pj4+ZXx0aGlzLmhpZ2g8PDMyLWU7dGhpcy5oaWdoPXRoaXMuaGlnaD4+PmV8MH19LHNoaWZ0TGVmdDpmdW5jdGlvbiBXb3JkNjRfc2hpZnRMZWZ0KGUpe2lmKGU+PTMyKXt0aGlzLmhpZ2g9dGhpcy5sb3c8PGUtMzI7dGhpcy5sb3c9MH1lbHNle3RoaXMuaGlnaD10aGlzLmhpZ2g8PGV8dGhpcy5sb3c+Pj4zMi1lO3RoaXMubG93PXRoaXMubG93PDxlfX0scm90YXRlUmlnaHQ6ZnVuY3Rpb24gV29yZDY0X3JvdGF0ZVJpZ2h0KGUpe3ZhciB0LHI7aWYoMzImZSl7cj10aGlzLmxvdzt0PXRoaXMuaGlnaH1lbHNle3Q9dGhpcy5sb3c7cj10aGlzLmhpZ2h9ZSY9MzE7dGhpcy5sb3c9dD4+PmV8cjw8MzItZTt0aGlzLmhpZ2g9cj4+PmV8dDw8MzItZX0sbm90OmZ1bmN0aW9uIFdvcmQ2NF9ub3QoKXt0aGlzLmhpZ2g9fnRoaXMuaGlnaDt0aGlzLmxvdz1+dGhpcy5sb3d9LGFkZDpmdW5jdGlvbiBXb3JkNjRfYWRkKGUpe3ZhciB0PSh0aGlzLmxvdz4+PjApKyhlLmxvdz4+PjApLHI9KHRoaXMuaGlnaD4+PjApKyhlLmhpZ2g+Pj4wKTt0PjQyOTQ5NjcyOTUmJihyKz0xKTt0aGlzLmxvdz0wfHQ7dGhpcy5oaWdoPTB8cn0sY29weVRvOmZ1bmN0aW9uIFdvcmQ2NF9jb3B5VG8oZSx0KXtlW3RdPXRoaXMuaGlnaD4+PjI0JjI1NTtlW3QrMV09dGhpcy5oaWdoPj4xNiYyNTU7ZVt0KzJdPXRoaXMuaGlnaD4+OCYyNTU7ZVt0KzNdPTI1NSZ0aGlzLmhpZ2g7ZVt0KzRdPXRoaXMubG93Pj4+MjQmMjU1O2VbdCs1XT10aGlzLmxvdz4+MTYmMjU1O2VbdCs2XT10aGlzLmxvdz4+OCYyNTU7ZVt0KzddPTI1NSZ0aGlzLmxvd30sYXNzaWduOmZ1bmN0aW9uIFdvcmQ2NF9hc3NpZ24oZSl7dGhpcy5oaWdoPWUuaGlnaDt0aGlzLmxvdz1lLmxvd319O3JldHVybiBXb3JkNjR9KCksbD1mdW5jdGlvbiBjYWxjdWxhdGVTSEEyNTZDbG9zdXJlKCl7ZnVuY3Rpb24gcm90cihlLHQpe3JldHVybiBlPj4+dHxlPDwzMi10fWZ1bmN0aW9uIGNoKGUsdCxyKXtyZXR1cm4gZSZ0Xn5lJnJ9ZnVuY3Rpb24gbWFqKGUsdCxyKXtyZXR1cm4gZSZ0XmUmcl50JnJ9ZnVuY3Rpb24gc2lnbWEoZSl7cmV0dXJuIHJvdHIoZSwyKV5yb3RyKGUsMTMpXnJvdHIoZSwyMil9ZnVuY3Rpb24gc2lnbWFQcmltZShlKXtyZXR1cm4gcm90cihlLDYpXnJvdHIoZSwxMSlecm90cihlLDI1KX1mdW5jdGlvbiBsaXR0bGVTaWdtYShlKXtyZXR1cm4gcm90cihlLDcpXnJvdHIoZSwxOCleZT4+PjN9dmFyIGU9WzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF07cmV0dXJuIGZ1bmN0aW9uIGhhc2godCxyLGEpe3ZhciBpLG4scyxvPTE3NzkwMzM3MDMsYz0zMTQ0MTM0Mjc3LGw9MTAxMzkwNDI0MixoPTI3NzM0ODA3NjIsdT0xMzU5ODkzMTE5LGQ9MjYwMDgyMjkyNCxmPTUyODczNDYzNSxnPTE1NDE0NTkyMjUsbT02NCpNYXRoLmNlaWwoKGErOSkvNjQpLHA9bmV3IFVpbnQ4QXJyYXkobSk7Zm9yKGk9MDtpPGE7KytpKXBbaV09dFtyKytdO3BbaSsrXT0xMjg7cz1tLTg7Zm9yKDtpPHM7KXBbaSsrXT0wO3BbaSsrXT0wO3BbaSsrXT0wO3BbaSsrXT0wO3BbaSsrXT1hPj4+MjkmMjU1O3BbaSsrXT1hPj4yMSYyNTU7cFtpKytdPWE+PjEzJjI1NTtwW2krK109YT4+NSYyNTU7cFtpKytdPWE8PDMmMjU1O3ZhciBiLHk9bmV3IFVpbnQzMkFycmF5KDY0KTtmb3IoaT0wO2k8bTspe2ZvcihuPTA7bjwxNjsrK24pe3lbbl09cFtpXTw8MjR8cFtpKzFdPDwxNnxwW2krMl08PDh8cFtpKzNdO2krPTR9Zm9yKG49MTY7bjw2NDsrK24peVtuXT0ocm90cihiPXlbbi0yXSwxNylecm90cihiLDE5KV5iPj4+MTApK3lbbi03XStsaXR0bGVTaWdtYSh5W24tMTVdKSt5W24tMTZdfDA7dmFyIHYsdyxrPW8sUz1jLEM9bCx4PWgsQT11LFQ9ZCxJPWYsRj1nO2ZvcihuPTA7bjw2NDsrK24pe3Y9RitzaWdtYVByaW1lKEEpK2NoKEEsVCxJKStlW25dK3lbbl07dz1zaWdtYShrKSttYWooayxTLEMpO0Y9STtJPVQ7VD1BO0E9eCt2fDA7eD1DO0M9UztTPWs7az12K3d8MH1vPW8ra3wwO2M9YytTfDA7bD1sK0N8MDtoPWgreHwwO3U9dStBfDA7ZD1kK1R8MDtmPWYrSXwwO2c9ZytGfDB9cmV0dXJuIG5ldyBVaW50OEFycmF5KFtvPj4yNCYyNTUsbz4+MTYmMjU1LG8+PjgmMjU1LDI1NSZvLGM+PjI0JjI1NSxjPj4xNiYyNTUsYz4+OCYyNTUsMjU1JmMsbD4+MjQmMjU1LGw+PjE2JjI1NSxsPj44JjI1NSwyNTUmbCxoPj4yNCYyNTUsaD4+MTYmMjU1LGg+PjgmMjU1LDI1NSZoLHU+PjI0JjI1NSx1Pj4xNiYyNTUsdT4+OCYyNTUsMjU1JnUsZD4+MjQmMjU1LGQ+PjE2JjI1NSxkPj44JjI1NSwyNTUmZCxmPj4yNCYyNTUsZj4+MTYmMjU1LGY+PjgmMjU1LDI1NSZmLGc+PjI0JjI1NSxnPj4xNiYyNTUsZz4+OCYyNTUsMjU1JmddKX19KCk7dC5jYWxjdWxhdGVTSEEyNTY9bDt2YXIgaD1mdW5jdGlvbiBjYWxjdWxhdGVTSEE1MTJDbG9zdXJlKCl7ZnVuY3Rpb24gY2goZSx0LHIsYSxpKXtlLmFzc2lnbih0KTtlLmFuZChyKTtpLmFzc2lnbih0KTtpLm5vdCgpO2kuYW5kKGEpO2UueG9yKGkpfWZ1bmN0aW9uIG1haihlLHQscixhLGkpe2UuYXNzaWduKHQpO2UuYW5kKHIpO2kuYXNzaWduKHQpO2kuYW5kKGEpO2UueG9yKGkpO2kuYXNzaWduKHIpO2kuYW5kKGEpO2UueG9yKGkpfWZ1bmN0aW9uIHNpZ21hKGUsdCxyKXtlLmFzc2lnbih0KTtlLnJvdGF0ZVJpZ2h0KDI4KTtyLmFzc2lnbih0KTtyLnJvdGF0ZVJpZ2h0KDM0KTtlLnhvcihyKTtyLmFzc2lnbih0KTtyLnJvdGF0ZVJpZ2h0KDM5KTtlLnhvcihyKX1mdW5jdGlvbiBzaWdtYVByaW1lKGUsdCxyKXtlLmFzc2lnbih0KTtlLnJvdGF0ZVJpZ2h0KDE0KTtyLmFzc2lnbih0KTtyLnJvdGF0ZVJpZ2h0KDE4KTtlLnhvcihyKTtyLmFzc2lnbih0KTtyLnJvdGF0ZVJpZ2h0KDQxKTtlLnhvcihyKX1mdW5jdGlvbiBsaXR0bGVTaWdtYShlLHQscil7ZS5hc3NpZ24odCk7ZS5yb3RhdGVSaWdodCgxKTtyLmFzc2lnbih0KTtyLnJvdGF0ZVJpZ2h0KDgpO2UueG9yKHIpO3IuYXNzaWduKHQpO3Iuc2hpZnRSaWdodCg3KTtlLnhvcihyKX1mdW5jdGlvbiBsaXR0bGVTaWdtYVByaW1lKGUsdCxyKXtlLmFzc2lnbih0KTtlLnJvdGF0ZVJpZ2h0KDE5KTtyLmFzc2lnbih0KTtyLnJvdGF0ZVJpZ2h0KDYxKTtlLnhvcihyKTtyLmFzc2lnbih0KTtyLnNoaWZ0UmlnaHQoNik7ZS54b3Iocil9dmFyIGU9W25ldyBjKDExMTYzNTI0MDgsMzYwOTc2NzQ1OCksbmV3IGMoMTg5OTQ0NzQ0MSw2MDI4OTE3MjUpLG5ldyBjKDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSksbmV3IGMoMzkyMTAwOTU3MywyMTczMjk1NTQ4KSxuZXcgYyg5NjE5ODcxNjMsNDA4MTYyODQ3MiksbmV3IGMoMTUwODk3MDk5MywzMDUzODM0MjY1KSxuZXcgYygyNDUzNjM1NzQ4LDI5Mzc2NzE1NzkpLG5ldyBjKDI4NzA3NjMyMjEsMzY2NDYwOTU2MCksbmV3IGMoMzYyNDM4MTA4MCwyNzM0ODgzMzk0KSxuZXcgYygzMTA1OTg0MDEsMTE2NDk5NjU0MiksbmV3IGMoNjA3MjI1Mjc4LDEzMjM2MTA3NjQpLG5ldyBjKDE0MjY4ODE5ODcsMzU5MDMwNDk5NCksbmV3IGMoMTkyNTA3ODM4OCw0MDY4MTgyMzgzKSxuZXcgYygyMTYyMDc4MjA2LDk5MTMzNjExMyksbmV3IGMoMjYxNDg4ODEwMyw2MzM4MDMzMTcpLG5ldyBjKDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCksbmV3IGMoMzgzNTM5MDQwMSwyNjY2NjEzNDU4KSxuZXcgYyg0MDIyMjI0Nzc0LDk0NDcxMTEzOSksbmV3IGMoMjY0MzQ3MDc4LDIzNDEyNjI3NzMpLG5ldyBjKDYwNDgwNzYyOCwyMDA3ODAwOTMzKSxuZXcgYyg3NzAyNTU5ODMsMTQ5NTk5MDkwMSksbmV3IGMoMTI0OTE1MDEyMiwxODU2NDMxMjM1KSxuZXcgYygxNTU1MDgxNjkyLDMxNzUyMTgxMzIpLG5ldyBjKDE5OTYwNjQ5ODYsMjE5ODk1MDgzNyksbmV3IGMoMjU1NDIyMDg4MiwzOTk5NzE5MzM5KSxuZXcgYygyODIxODM0MzQ5LDc2Njc4NDAxNiksbmV3IGMoMjk1Mjk5NjgwOCwyNTY2NTk0ODc5KSxuZXcgYygzMjEwMzEzNjcxLDMyMDMzMzc5NTYpLG5ldyBjKDMzMzY1NzE4OTEsMTAzNDQ1NzAyNiksbmV3IGMoMzU4NDUyODcxMSwyNDY2OTQ4OTAxKSxuZXcgYygxMTM5MjY5OTMsMzc1ODMyNjM4MyksbmV3IGMoMzM4MjQxODk1LDE2ODcxNzkzNiksbmV3IGMoNjY2MzA3MjA1LDExODgxNzk5NjQpLG5ldyBjKDc3MzUyOTkxMiwxNTQ2MDQ1NzM0KSxuZXcgYygxMjk0NzU3MzcyLDE1MjI4MDU0ODUpLG5ldyBjKDEzOTYxODIyOTEsMjY0MzgzMzgyMyksbmV3IGMoMTY5NTE4MzcwMCwyMzQzNTI3MzkwKSxuZXcgYygxOTg2NjYxMDUxLDEwMTQ0Nzc0ODApLG5ldyBjKDIxNzcwMjYzNTAsMTIwNjc1OTE0MiksbmV3IGMoMjQ1Njk1NjAzNywzNDQwNzc2MjcpLG5ldyBjKDI3MzA0ODU5MjEsMTI5MDg2MzQ2MCksbmV3IGMoMjgyMDMwMjQxMSwzMTU4NDU0MjczKSxuZXcgYygzMjU5NzMwODAwLDM1MDU5NTI2NTcpLG5ldyBjKDMzNDU3NjQ3NzEsMTA2MjE3MDA4KSxuZXcgYygzNTE2MDY1ODE3LDM2MDYwMDgzNDQpLG5ldyBjKDM2MDAzNTI4MDQsMTQzMjcyNTc3NiksbmV3IGMoNDA5NDU3MTkwOSwxNDY3MDMxNTk0KSxuZXcgYygyNzU0MjMzNDQsODUxMTY5NzIwKSxuZXcgYyg0MzAyMjc3MzQsMzEwMDgyMzc1MiksbmV3IGMoNTA2OTQ4NjE2LDEzNjMyNTgxOTUpLG5ldyBjKDY1OTA2MDU1NiwzNzUwNjg1NTkzKSxuZXcgYyg4ODM5OTc4NzcsMzc4NTA1MDI4MCksbmV3IGMoOTU4MTM5NTcxLDMzMTgzMDc0MjcpLG5ldyBjKDEzMjI4MjIyMTgsMzgxMjcyMzQwMyksbmV3IGMoMTUzNzAwMjA2MywyMDAzMDM0OTk1KSxuZXcgYygxNzQ3ODczNzc5LDM2MDIwMzY4OTkpLG5ldyBjKDE5NTU1NjIyMjIsMTU3NTk5MDAxMiksbmV3IGMoMjAyNDEwNDgxNSwxMTI1NTkyOTI4KSxuZXcgYygyMjI3NzMwNDUyLDI3MTY5MDQzMDYpLG5ldyBjKDIzNjE4NTI0MjQsNDQyNzc2MDQ0KSxuZXcgYygyNDI4NDM2NDc0LDU5MzY5ODM0NCksbmV3IGMoMjc1NjczNDE4NywzNzMzMTEwMjQ5KSxuZXcgYygzMjA0MDMxNDc5LDI5OTkzNTE1NzMpLG5ldyBjKDMzMjkzMjUyOTgsMzgxNTkyMDQyNyksbmV3IGMoMzM5MTU2OTYxNCwzOTI4MzgzOTAwKSxuZXcgYygzNTE1MjY3MjcxLDU2NjI4MDcxMSksbmV3IGMoMzk0MDE4NzYwNiwzNDU0MDY5NTM0KSxuZXcgYyg0MTE4NjMwMjcxLDQwMDAyMzk5OTIpLG5ldyBjKDExNjQxODQ3NCwxOTE0MTM4NTU0KSxuZXcgYygxNzQyOTI0MjEsMjczMTA1NTI3MCksbmV3IGMoMjg5MzgwMzU2LDMyMDM5OTMwMDYpLG5ldyBjKDQ2MDM5MzI2OSwzMjA2MjAzMTUpLG5ldyBjKDY4NTQ3MTczMyw1ODc0OTY4MzYpLG5ldyBjKDg1MjE0Mjk3MSwxMDg2NzkyODUxKSxuZXcgYygxMDE3MDM2Mjk4LDM2NTU0MzEwMCksbmV3IGMoMTEyNjAwMDU4MCwyNjE4Mjk3Njc2KSxuZXcgYygxMjg4MDMzNDcwLDM0MDk4NTUxNTgpLG5ldyBjKDE1MDE1MDU5NDgsNDIzNDUwOTg2NiksbmV3IGMoMTYwNzE2NzkxNSw5ODcxNjc0NjgpLG5ldyBjKDE4MTY0MDIzMTYsMTI0NjE4OTU5MSldO3JldHVybiBmdW5jdGlvbiBoYXNoKHQscixhLGkpe3ZhciBuLHMsbyxsLGgsdSxkLGY7aWYoaT0hIWkpe249bmV3IGMoMzQxODA3MDM2NSwzMjM4MzcxMDMyKTtzPW5ldyBjKDE2NTQyNzAyNTAsOTE0MTUwNjYzKTtvPW5ldyBjKDI0Mzg1MjkzNzAsODEyNzAyOTk5KTtsPW5ldyBjKDM1NTQ2MjM2MCw0MTQ0OTEyNjk3KTtoPW5ldyBjKDE3MzE0MDU0MTUsNDI5MDc3NTg1Nyk7dT1uZXcgYygyMzk0MTgwMjMxLDE3NTA2MDMwMjUpO2Q9bmV3IGMoMzY3NTAwODUyNSwxNjk0MDc2ODM5KTtmPW5ldyBjKDEyMDMwNjI4MTMsMzIwNDA3NTQyOCl9ZWxzZXtuPW5ldyBjKDE3NzkwMzM3MDMsNDA4OTIzNTcyMCk7cz1uZXcgYygzMTQ0MTM0Mjc3LDIyMjc4NzM1OTUpO289bmV3IGMoMTAxMzkwNDI0Miw0MjcxMTc1NzIzKTtsPW5ldyBjKDI3NzM0ODA3NjIsMTU5NTc1MDEyOSk7aD1uZXcgYygxMzU5ODkzMTE5LDI5MTc1NjUxMzcpO3U9bmV3IGMoMjYwMDgyMjkyNCw3MjU1MTExOTkpO2Q9bmV3IGMoNTI4NzM0NjM1LDQyMTUzODk1NDcpO2Y9bmV3IGMoMTU0MTQ1OTIyNSwzMjcwMzMyMDkpfXZhciBnLG0scCxiPTEyOCpNYXRoLmNlaWwoKGErMTcpLzEyOCkseT1uZXcgVWludDhBcnJheShiKTtmb3IoZz0wO2c8YTsrK2cpeVtnXT10W3IrK107eVtnKytdPTEyODtwPWItMTY7Zm9yKDtnPHA7KXlbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT0wO3lbZysrXT1hPj4+MjkmMjU1O3lbZysrXT1hPj4yMSYyNTU7eVtnKytdPWE+PjEzJjI1NTt5W2crK109YT4+NSYyNTU7eVtnKytdPWE8PDMmMjU1O3ZhciB2PW5ldyBBcnJheSg4MCk7Zm9yKGc9MDtnPDgwO2crKyl2W2ddPW5ldyBjKDAsMCk7dmFyIHcsayxTPW5ldyBjKDAsMCksQz1uZXcgYygwLDApLHg9bmV3IGMoMCwwKSxBPW5ldyBjKDAsMCksVD1uZXcgYygwLDApLEk9bmV3IGMoMCwwKSxGPW5ldyBjKDAsMCksUD1uZXcgYygwLDApLEU9bmV3IGMoMCwwKSxCPW5ldyBjKDAsMCksTz1uZXcgYygwLDApLE09bmV3IGMoMCwwKTtmb3IoZz0wO2c8Yjspe2ZvcihtPTA7bTwxNjsrK20pe3ZbbV0uaGlnaD15W2ddPDwyNHx5W2crMV08PDE2fHlbZysyXTw8OHx5W2crM107dlttXS5sb3c9eVtnKzRdPDwyNHx5W2crNV08PDE2fHlbZys2XTw8OHx5W2crN107Zys9OH1mb3IobT0xNjttPDgwOysrbSl7bGl0dGxlU2lnbWFQcmltZSh3PXZbbV0sdlttLTJdLE0pO3cuYWRkKHZbbS03XSk7bGl0dGxlU2lnbWEoTyx2W20tMTVdLE0pO3cuYWRkKE8pO3cuYWRkKHZbbS0xNl0pfVMuYXNzaWduKG4pO0MuYXNzaWduKHMpO3guYXNzaWduKG8pO0EuYXNzaWduKGwpO1QuYXNzaWduKGgpO0kuYXNzaWduKHUpO0YuYXNzaWduKGQpO1AuYXNzaWduKGYpO2ZvcihtPTA7bTw4MDsrK20pe0UuYXNzaWduKFApO3NpZ21hUHJpbWUoTyxULE0pO0UuYWRkKE8pO2NoKE8sVCxJLEYsTSk7RS5hZGQoTyk7RS5hZGQoZVttXSk7RS5hZGQodlttXSk7c2lnbWEoQixTLE0pO21haihPLFMsQyx4LE0pO0IuYWRkKE8pO3c9UDtQPUY7Rj1JO0k9VDtBLmFkZChFKTtUPUE7QT14O3g9QztDPVM7dy5hc3NpZ24oRSk7dy5hZGQoQik7Uz13fW4uYWRkKFMpO3MuYWRkKEMpO28uYWRkKHgpO2wuYWRkKEEpO2guYWRkKFQpO3UuYWRkKEkpO2QuYWRkKEYpO2YuYWRkKFApfWlmKGkpe2s9bmV3IFVpbnQ4QXJyYXkoNDgpO24uY29weVRvKGssMCk7cy5jb3B5VG8oayw4KTtvLmNvcHlUbyhrLDE2KTtsLmNvcHlUbyhrLDI0KTtoLmNvcHlUbyhrLDMyKTt1LmNvcHlUbyhrLDQwKX1lbHNle2s9bmV3IFVpbnQ4QXJyYXkoNjQpO24uY29weVRvKGssMCk7cy5jb3B5VG8oayw4KTtvLmNvcHlUbyhrLDE2KTtsLmNvcHlUbyhrLDI0KTtoLmNvcHlUbyhrLDMyKTt1LmNvcHlUbyhrLDQwKTtkLmNvcHlUbyhrLDQ4KTtmLmNvcHlUbyhrLDU2KX1yZXR1cm4ga319KCk7dC5jYWxjdWxhdGVTSEE1MTI9aDt2YXIgdT1mdW5jdGlvbiBjYWxjdWxhdGVTSEEzODRDbG9zdXJlKCl7cmV0dXJuIGZ1bmN0aW9uIGhhc2goZSx0LHIpe3JldHVybiBoKGUsdCxyLCEwKX19KCk7dC5jYWxjdWxhdGVTSEEzODQ9dTt2YXIgZD1mdW5jdGlvbiBOdWxsQ2lwaGVyQ2xvc3VyZSgpe2Z1bmN0aW9uIE51bGxDaXBoZXIoKXt9TnVsbENpcGhlci5wcm90b3R5cGU9e2RlY3J5cHRCbG9jazpmdW5jdGlvbiBOdWxsQ2lwaGVyX2RlY3J5cHRCbG9jayhlKXtyZXR1cm4gZX0sZW5jcnlwdDpmdW5jdGlvbiBOdWxsQ2lwaGVyX2VuY3J5cHQoZSl7cmV0dXJuIGV9fTtyZXR1cm4gTnVsbENpcGhlcn0oKTtjbGFzcyBBRVNCYXNlQ2lwaGVye2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PUFFU0Jhc2VDaXBoZXImJigwLGEudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBBRVNCYXNlQ2lwaGVyLiIpO3RoaXMuX3M9bmV3IFVpbnQ4QXJyYXkoWzk5LDEyNCwxMTksMTIzLDI0MiwxMDcsMTExLDE5Nyw0OCwxLDEwMyw0MywyNTQsMjE1LDE3MSwxMTgsMjAyLDEzMCwyMDEsMTI1LDI1MCw4OSw3MSwyNDAsMTczLDIxMiwxNjIsMTc1LDE1NiwxNjQsMTE0LDE5MiwxODMsMjUzLDE0NywzOCw1NCw2MywyNDcsMjA0LDUyLDE2NSwyMjksMjQxLDExMywyMTYsNDksMjEsNCwxOTksMzUsMTk1LDI0LDE1MCw1LDE1NCw3LDE4LDEyOCwyMjYsMjM1LDM5LDE3OCwxMTcsOSwxMzEsNDQsMjYsMjcsMTEwLDkwLDE2MCw4Miw1OSwyMTQsMTc5LDQxLDIyNyw0NywxMzIsODMsMjA5LDAsMjM3LDMyLDI1MiwxNzcsOTEsMTA2LDIwMywxOTAsNTcsNzQsNzYsODgsMjA3LDIwOCwyMzksMTcwLDI1MSw2Nyw3Nyw1MSwxMzMsNjksMjQ5LDIsMTI3LDgwLDYwLDE1OSwxNjgsODEsMTYzLDY0LDE0MywxNDYsMTU3LDU2LDI0NSwxODgsMTgyLDIxOCwzMywxNiwyNTUsMjQzLDIxMCwyMDUsMTIsMTksMjM2LDk1LDE1MSw2OCwyMywxOTYsMTY3LDEyNiw2MSwxMDAsOTMsMjUsMTE1LDk2LDEyOSw3OSwyMjAsMzQsNDIsMTQ0LDEzNiw3MCwyMzgsMTg0LDIwLDIyMiw5NCwxMSwyMTksMjI0LDUwLDU4LDEwLDczLDYsMzYsOTIsMTk0LDIxMSwxNzIsOTgsMTQ1LDE0OSwyMjgsMTIxLDIzMSwyMDAsNTUsMTA5LDE0MSwyMTMsNzgsMTY5LDEwOCw4NiwyNDQsMjM0LDEwMSwxMjIsMTc0LDgsMTg2LDEyMCwzNyw0NiwyOCwxNjYsMTgwLDE5OCwyMzIsMjIxLDExNiwzMSw3NSwxODksMTM5LDEzOCwxMTIsNjIsMTgxLDEwMiw3MiwzLDI0NiwxNCw5Nyw1Myw4NywxODUsMTM0LDE5MywyOSwxNTgsMjI1LDI0OCwxNTIsMTcsMTA1LDIxNywxNDIsMTQ4LDE1NSwzMCwxMzUsMjMzLDIwNiw4NSw0MCwyMjMsMTQwLDE2MSwxMzcsMTMsMTkxLDIzMCw2NiwxMDQsNjUsMTUzLDQ1LDE1LDE3Niw4NCwxODcsMjJdKTt0aGlzLl9pbnZfcz1uZXcgVWludDhBcnJheShbODIsOSwxMDYsMjEzLDQ4LDU0LDE2NSw1NiwxOTEsNjQsMTYzLDE1OCwxMjksMjQzLDIxNSwyNTEsMTI0LDIyNyw1NywxMzAsMTU1LDQ3LDI1NSwxMzUsNTIsMTQyLDY3LDY4LDE5NiwyMjIsMjMzLDIwMyw4NCwxMjMsMTQ4LDUwLDE2NiwxOTQsMzUsNjEsMjM4LDc2LDE0OSwxMSw2NiwyNTAsMTk1LDc4LDgsNDYsMTYxLDEwMiw0MCwyMTcsMzYsMTc4LDExOCw5MSwxNjIsNzMsMTA5LDEzOSwyMDksMzcsMTE0LDI0OCwyNDYsMTAwLDEzNCwxMDQsMTUyLDIyLDIxMiwxNjQsOTIsMjA0LDkzLDEwMSwxODIsMTQ2LDEwOCwxMTIsNzIsODAsMjUzLDIzNywxODUsMjE4LDk0LDIxLDcwLDg3LDE2NywxNDEsMTU3LDEzMiwxNDQsMjE2LDE3MSwwLDE0MCwxODgsMjExLDEwLDI0NywyMjgsODgsNSwxODQsMTc5LDY5LDYsMjA4LDQ0LDMwLDE0MywyMDIsNjMsMTUsMiwxOTMsMTc1LDE4OSwzLDEsMTksMTM4LDEwNyw1OCwxNDUsMTcsNjUsNzksMTAzLDIyMCwyMzQsMTUxLDI0MiwyMDcsMjA2LDI0MCwxODAsMjMwLDExNSwxNTAsMTcyLDExNiwzNCwyMzEsMTczLDUzLDEzMywyMjYsMjQ5LDU1LDIzMiwyOCwxMTcsMjIzLDExMCw3MSwyNDEsMjYsMTEzLDI5LDQxLDE5NywxMzcsMTExLDE4Myw5OCwxNCwxNzAsMjQsMTkwLDI3LDI1Miw4Niw2Miw3NSwxOTgsMjEwLDEyMSwzMiwxNTQsMjE5LDE5MiwyNTQsMTIwLDIwNSw5MCwyNDQsMzEsMjIxLDE2OCw1MSwxMzYsNywxOTksNDksMTc3LDE4LDE2LDg5LDM5LDEyOCwyMzYsOTUsOTYsODEsMTI3LDE2OSwyNSwxODEsNzQsMTMsNDUsMjI5LDEyMiwxNTksMTQ3LDIwMSwxNTYsMjM5LDE2MCwyMjQsNTksNzcsMTc0LDQyLDI0NSwxNzYsMjAwLDIzNSwxODcsNjAsMTMxLDgzLDE1Myw5NywyMyw0Myw0LDEyNiwxODYsMTE5LDIxNCwzOCwyMjUsMTA1LDIwLDk5LDg1LDMzLDEyLDEyNV0pO3RoaXMuX21peD1uZXcgVWludDMyQXJyYXkoWzAsMjM1NDc0MTg3LDQ3MDk0ODM3NCwzMDM3NjUyNzcsOTQxODk2NzQ4LDkwODkzMzQxNSw2MDc1MzA1NTQsNzA4NzgwODQ5LDE4ODM3OTM0OTYsMjExODIxNDk5NSwxODE3ODY2ODMwLDE2NDk2MzkyMzcsMTIxNTA2MTEwOCwxMTgxMDQ1MTE5LDE0MTc1NjE2OTgsMTUxNzc2NzUyOSwzNzY3NTg2OTkyLDQwMDMwNjExNzksNDIzNjQyOTk5MCw0MDY5MjQ2ODkzLDM2MzU3MzM2NjAsMzYwMjc3MDMyNywzMjk5Mjc4NDc0LDM0MDA1Mjg3NjksMjQzMDEyMjIxNiwyNjY0NTQzNzE1LDIzNjIwOTAyMzgsMjE5Mzg2MjY0NSwyODM1MTIzMzk2LDI4MDExMDc0MDcsMzAzNTUzNTA1OCwzMTM1NzQwODg5LDM2NzgxMjQ5MjMsMzU3Njg3MDUxMiwzMzQxMzk0Mjg1LDMzNzQzNjE3MDIsMzgxMDQ5NjM0MywzOTc3Njc1MzU2LDQyNzkwODAyNTcsNDA0MzYxMDE4NiwyODc2NDk0NjI3LDI3NzYyOTI5MDQsMzA3NjYzOTAyOSwzMTEwNjUwOTQyLDI0NzIwMTE1MzUsMjY0MDI0MzIwNCwyNDAzNzI4NjY1LDIxNjkzMDMwNTgsMTAwMTA4OTk5NSw4OTk4MzU1ODQsNjY2NDY0NzMzLDY5OTQzMjE1MCw1OTcyNzg0NywyMjY5MDY4NjAsNTMwNDAwNzUzLDI5NDkzMDY4MiwxMjczMTY4Nzg3LDExNzI5NjcwNjQsMTQ3NTQxODUwMSwxNTA5NDMwNDE0LDE5NDI0MzU3NzUsMjExMDY2NzQ0NCwxODc2MjQxODMzLDE2NDE4MTYyMjYsMjkxMDIxOTc2NiwyNzQzMDM0MTA5LDI5NzYxNTE1MjAsMzIxMTYyMzE0NywyNTA1MjAyMTM4LDI2MDY0NTM5NjksMjMwMjY5MDI1MiwyMjY5NzI4NDU1LDM3MTE4Mjk0MjIsMzU0MzU5OTI2OSwzMjQwODk0MzkyLDM0NzUzMTMzMzEsMzg0MzY5OTA3NCwzOTQzOTA2NDQxLDQxNzgwNjIyMjgsNDE0NDA0Nzc3NSwxMzA2OTY3MzY2LDExMzk3ODE3MDksMTM3NDk4ODExMiwxNjEwNDU5NzM5LDE5NzU2ODM0MzQsMjA3NjkzNTI2NSwxNzc1Mjc2OTI0LDE3NDIzMTUxMjcsMTAzNDg2Nzk5OCw4NjY2Mzc4NDUsNTY2MDIxODk2LDgwMDQ0MDgzNSw5Mjk4NzY5OCwxOTMxOTUwNjUsNDI5NDU2MTY0LDM5NTQ0MTcxMSwxOTg0ODEyNjg1LDIwMTc3Nzg1NjYsMTc4NDY2MzE5NSwxNjgzNDA3MjQ4LDEzMTU1NjIxNDUsMTA4MDA5NDYzNCwxMzgzODU2MzExLDE1NTEwMzc4ODQsMTAxMDM5ODI5LDEzNTA1MDIwNiw0Mzc3NTcxMjMsMzM3NTUzODY0LDEwNDIzODU2NTcsODA3OTYyNjEwLDU3MzgwNDc4Myw3NDIwMzkwMTIsMjUzMTA2NzQ1MywyNTY0MDMzMzM0LDIzMjg4Mjg5NzEsMjIyNzU3MzAyNCwyOTM1NTY2ODY1LDI3MDAwOTkzNTQsMzAwMTc1NTY1NSwzMTY4OTM3MjI4LDM4Njg1NTI4MDUsMzkwMjU2MzE4Miw0MjAzMTgxMTcxLDQxMDI5Nzc5MTIsMzczNjE2NDkzNywzNTAxNzQxODkwLDMyNjU0Nzg3NTEsMzQzMzcxMjk4MCwxMTA2MDQxNTkxLDEzNDA0NjMxMDAsMTU3Njk3NjYwOSwxNDA4NzQ5MDM0LDIwNDMyMTE0ODMsMjAwOTE5NTQ3MiwxNzA4ODQ4MzMzLDE4MDkwNTQxNTAsODMyODc3MjMxLDEwNjgzNTEzOTYsNzY2OTQ1NDY1LDU5OTc2MjM1NCwxNTk0MTc5ODcsMTI2NDU0NjY0LDM2MTkyOTg3Nyw0NjMxODAxOTAsMjcwOTI2MDg3MSwyOTQzNjgyMzgwLDMxNzgxMDY5NjEsMzAwOTg3OTM4NiwyNTcyNjk3MTk1LDI1Mzg2ODExODQsMjIzNjIyODczMywyMzM2NDM0NTUwLDM1MDk4NzExMzUsMzc0NTM0NTMwMCwzNDQxODUwMzc3LDMyNzQ2NjcyNjYsMzkxMDE2MTk3MSwzODc3MTk4NjQ4LDQxMTA1Njg0ODUsNDIxMTgxODc5OCwyNTk3ODA2NDc2LDI0OTc2MDQ3NDMsMjI2MTA4OTE3OCwyMjk1MTAxMDczLDI3MzM4NTYxNjAsMjkwMjA4Nzg1MSwzMjAyNDM3MDQ2LDI5NjgwMTE0NTMsMzkzNjI5MTI4NCwzODM1MDM2ODk1LDQxMzY0NDA3NzAsNDE2OTQwODIwMSwzNTM1NDg2NDU2LDM3MDI2NjU0NTksMzQ2NzE5MjMwMiwzMjMxNzIyMjEzLDIwNTE1MTg3ODAsMTk1MTMxNzA0NywxNzE2ODkwNDEwLDE3NTA5MDIzMDUsMTExMzgxODM4NCwxMjgyMDUwMDc1LDE1ODQ1MDQ1ODIsMTM1MDA3ODk4OSwxNjg4MTA4NTIsNjc1NTY0NjMsMzcxMDQ5MzMwLDQwNDAxNjc2MSw4NDE3Mzk1OTIsMTAwODkxODU5NSw3NzU1NTA4MTQsNTQwMDgwNzI1LDM5Njk1NjIzNjksMzgwMTMzMjIzNCw0MDM1NDg5MDQ3LDQyNjk5MDc5OTYsMzU2OTI1NTIxMywzNjY5NDYyNTY2LDMzNjY3NTQ2MTksMzMzMjc0MDE0NCwyNjMxMDY1NDMzLDI0NjM4Nzk3NjIsMjE2MDExNzA3MSwyMzk1NTg4Njc2LDI3Njc2NDU1NTcsMjg2ODg5NzQwNiwzMTAyMDExNzQ3LDMwNjkwNDk5NjAsMjAyMDA4NDk3LDMzNzc4MzYyLDI3MDA0MDQ4Nyw1MDQ0NTk0MzYsODc1NDUxMjkzLDk3NTY1ODY0Niw2NzUwMzk2MjcsNjQxMDI1MTUyLDIwODQ3MDQyMzMsMTkxNzUxODU2MiwxNjE1ODYxMjQ3LDE4NTEzMzI4NTIsMTE0NzU1MDY2MSwxMjQ4ODAyNTEwLDE0ODQwMDU4NDMsMTQ1MTA0NDA1Niw5MzMzMDEzNzAsOTY3MzExNzI5LDczMzE1Njk3Miw2MzI5NTM3MDMsMjYwMzg4OTUwLDI1OTY1OTE3LDMyODY3MTgwOCw0OTY5MDYwNTksMTIwNjQ3Nzg1OCwxMjM5NDQzNzUzLDE1NDMyMDg1MDAsMTQ0MTk1MjU3NSwyMTQ0MTYxODA2LDE5MDg2OTQyNzcsMTY3NTU3Nzg4MCwxODQyNzU5NDQzLDM2MTAzNjkyMjYsMzY0NDM3OTU4NSwzNDA4MTE5NTE2LDMzMDc5MTYyNDcsNDAxMTE5MDUwMiwzNzc2NzY3NDY5LDQwNzczODQ0MzIsNDI0NTYxODY4MywyODA5NzcxMTU0LDI4NDI3MzcwNDksMzE0NDM5NjQyMCwzMDQzMTQwNDk1LDI2NzM3MDUxNTAsMjQzODIzNzYyMSwyMjAzMDMyMjMyLDIzNzAyMTM3OTVdKTt0aGlzLl9taXhDb2w9bmV3IFVpbnQ4QXJyYXkoMjU2KTtmb3IobGV0IGU9MDtlPDI1NjtlKyspdGhpcy5fbWl4Q29sW2VdPWU8MTI4P2U8PDE6ZTw8MV4yNzt0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNik7dGhpcy5idWZmZXJQb3NpdGlvbj0wfV9leHBhbmRLZXkoZSl7KDAsYS51bnJlYWNoYWJsZSkoIkNhbm5vdCBjYWxsIGBfZXhwYW5kS2V5YCBvbiB0aGUgYmFzZSBjbGFzcyIpfV9kZWNyeXB0KGUsdCl7bGV0IHIsYSxpO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoMTYpO24uc2V0KGUpO2ZvcihsZXQgZT0wLHI9dGhpcy5fa2V5U2l6ZTtlPDE2OysrZSwrK3IpbltlXV49dFtyXTtmb3IobGV0IGU9dGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uLTE7ZT49MTstLWUpe3I9blsxM107blsxM109bls5XTtuWzldPW5bNV07bls1XT1uWzFdO25bMV09cjtyPW5bMTRdO2E9blsxMF07blsxNF09bls2XTtuWzEwXT1uWzJdO25bNl09cjtuWzJdPWE7cj1uWzE1XTthPW5bMTFdO2k9bls3XTtuWzE1XT1uWzNdO25bMTFdPXI7bls3XT1hO25bM109aTtmb3IobGV0IGU9MDtlPDE2OysrZSluW2VdPXRoaXMuX2ludl9zW25bZV1dO2ZvcihsZXQgcj0wLGE9MTYqZTtyPDE2OysrciwrK2EpbltyXV49dFthXTtmb3IobGV0IGU9MDtlPDE2O2UrPTQpe2NvbnN0IHQ9dGhpcy5fbWl4W25bZV1dLGE9dGhpcy5fbWl4W25bZSsxXV0saT10aGlzLl9taXhbbltlKzJdXSxzPXRoaXMuX21peFtuW2UrM11dO3I9dF5hPj4+OF5hPDwyNF5pPj4+MTZeaTw8MTZecz4+PjI0XnM8PDg7bltlXT1yPj4+MjQmMjU1O25bZSsxXT1yPj4xNiYyNTU7bltlKzJdPXI+PjgmMjU1O25bZSszXT0yNTUmcn19cj1uWzEzXTtuWzEzXT1uWzldO25bOV09bls1XTtuWzVdPW5bMV07blsxXT1yO3I9blsxNF07YT1uWzEwXTtuWzE0XT1uWzZdO25bMTBdPW5bMl07bls2XT1yO25bMl09YTtyPW5bMTVdO2E9blsxMV07aT1uWzddO25bMTVdPW5bM107blsxMV09cjtuWzddPWE7blszXT1pO2ZvcihsZXQgZT0wO2U8MTY7KytlKXtuW2VdPXRoaXMuX2ludl9zW25bZV1dO25bZV1ePXRbZV19cmV0dXJuIG59X2VuY3J5cHQoZSx0KXtjb25zdCByPXRoaXMuX3M7bGV0IGEsaSxuO2NvbnN0IHM9bmV3IFVpbnQ4QXJyYXkoMTYpO3Muc2V0KGUpO2ZvcihsZXQgZT0wO2U8MTY7KytlKXNbZV1ePXRbZV07Zm9yKGxldCBlPTE7ZTx0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb247ZSsrKXtmb3IobGV0IGU9MDtlPDE2OysrZSlzW2VdPXJbc1tlXV07bj1zWzFdO3NbMV09c1s1XTtzWzVdPXNbOV07c1s5XT1zWzEzXTtzWzEzXT1uO249c1syXTtpPXNbNl07c1syXT1zWzEwXTtzWzZdPXNbMTRdO3NbMTBdPW47c1sxNF09aTtuPXNbM107aT1zWzddO2E9c1sxMV07c1szXT1zWzE1XTtzWzddPW47c1sxMV09aTtzWzE1XT1hO2ZvcihsZXQgZT0wO2U8MTY7ZSs9NCl7Y29uc3QgdD1zW2UrMF0scj1zW2UrMV0saT1zW2UrMl0sbj1zW2UrM107YT10XnJeaV5uO3NbZSswXV49YV50aGlzLl9taXhDb2xbdF5yXTtzW2UrMV1ePWFedGhpcy5fbWl4Q29sW3JeaV07c1tlKzJdXj1hXnRoaXMuX21peENvbFtpXm5dO3NbZSszXV49YV50aGlzLl9taXhDb2xbbl50XX1mb3IobGV0IHI9MCxhPTE2KmU7cjwxNjsrK3IsKythKXNbcl1ePXRbYV19Zm9yKGxldCBlPTA7ZTwxNjsrK2Upc1tlXT1yW3NbZV1dO249c1sxXTtzWzFdPXNbNV07c1s1XT1zWzldO3NbOV09c1sxM107c1sxM109bjtuPXNbMl07aT1zWzZdO3NbMl09c1sxMF07c1s2XT1zWzE0XTtzWzEwXT1uO3NbMTRdPWk7bj1zWzNdO2k9c1s3XTthPXNbMTFdO3NbM109c1sxNV07c1s3XT1uO3NbMTFdPWk7c1sxNV09YTtmb3IobGV0IGU9MCxyPXRoaXMuX2tleVNpemU7ZTwxNjsrK2UsKytyKXNbZV1ePXRbcl07cmV0dXJuIHN9X2RlY3J5cHRCbG9jazIoZSx0KXtjb25zdCByPWUubGVuZ3RoO2xldCBhPXRoaXMuYnVmZmVyLGk9dGhpcy5idWZmZXJQb3NpdGlvbjtjb25zdCBuPVtdO2xldCBzPXRoaXMuaXY7Zm9yKGxldCB0PTA7dDxyOysrdCl7YVtpXT1lW3RdOysraTtpZihpPDE2KWNvbnRpbnVlO2NvbnN0IHI9dGhpcy5fZGVjcnlwdChhLHRoaXMuX2tleSk7Zm9yKGxldCBlPTA7ZTwxNjsrK2UpcltlXV49c1tlXTtzPWE7bi5wdXNoKHIpO2E9bmV3IFVpbnQ4QXJyYXkoMTYpO2k9MH10aGlzLmJ1ZmZlcj1hO3RoaXMuYnVmZmVyTGVuZ3RoPWk7dGhpcy5pdj1zO2lmKDA9PT1uLmxlbmd0aClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7bGV0IG89MTYqbi5sZW5ndGg7aWYodCl7Y29uc3QgZT1uW24ubGVuZ3RoLTFdO2xldCB0PWVbMTVdO2lmKHQ8PTE2KXtmb3IobGV0IHI9MTUsYT0xNi10O3I+PWE7LS1yKWlmKGVbcl0hPT10KXt0PTA7YnJlYWt9by09dDtuW24ubGVuZ3RoLTFdPWUuc3ViYXJyYXkoMCwxNi10KX19Y29uc3QgYz1uZXcgVWludDhBcnJheShvKTtmb3IobGV0IGU9MCx0PTAscj1uLmxlbmd0aDtlPHI7KytlLHQrPTE2KWMuc2V0KG5bZV0sdCk7cmV0dXJuIGN9ZGVjcnlwdEJsb2NrKGUsdCxyPW51bGwpe2NvbnN0IGE9ZS5sZW5ndGgsaT10aGlzLmJ1ZmZlcjtsZXQgbj10aGlzLmJ1ZmZlclBvc2l0aW9uO2lmKHIpdGhpcy5pdj1yO2Vsc2V7Zm9yKGxldCB0PTA7bjwxNiYmdDxhOysrdCwrK24paVtuXT1lW3RdO2lmKG48MTYpe3RoaXMuYnVmZmVyTGVuZ3RoPW47cmV0dXJuIG5ldyBVaW50OEFycmF5KDApfXRoaXMuaXY9aTtlPWUuc3ViYXJyYXkoMTYpfXRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDE2KTt0aGlzLmJ1ZmZlckxlbmd0aD0wO3RoaXMuZGVjcnlwdEJsb2NrPXRoaXMuX2RlY3J5cHRCbG9jazI7cmV0dXJuIHRoaXMuZGVjcnlwdEJsb2NrKGUsdCl9ZW5jcnlwdChlLHQpe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGE9dGhpcy5idWZmZXIsaT10aGlzLmJ1ZmZlclBvc2l0aW9uO2NvbnN0IG49W107dHx8KHQ9bmV3IFVpbnQ4QXJyYXkoMTYpKTtmb3IobGV0IHM9MDtzPHI7KytzKXthW2ldPWVbc107KytpO2lmKGk8MTYpY29udGludWU7Zm9yKGxldCBlPTA7ZTwxNjsrK2UpYVtlXV49dFtlXTtjb25zdCByPXRoaXMuX2VuY3J5cHQoYSx0aGlzLl9rZXkpO3Q9cjtuLnB1c2gocik7YT1uZXcgVWludDhBcnJheSgxNik7aT0wfXRoaXMuYnVmZmVyPWE7dGhpcy5idWZmZXJMZW5ndGg9aTt0aGlzLml2PXQ7aWYoMD09PW4ubGVuZ3RoKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtjb25zdCBzPTE2Km4ubGVuZ3RoLG89bmV3IFVpbnQ4QXJyYXkocyk7Zm9yKGxldCBlPTAsdD0wLHI9bi5sZW5ndGg7ZTxyOysrZSx0Kz0xNilvLnNldChuW2VdLHQpO3JldHVybiBvfX1jbGFzcyBBRVMxMjhDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7dGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uPTEwO3RoaXMuX2tleVNpemU9MTYwO3RoaXMuX3Jjb249bmV3IFVpbnQ4QXJyYXkoWzE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0LDEwOCwyMTYsMTcxLDc3LDE1NCw0Nyw5NCwxODgsOTksMTk4LDE1MSw1MywxMDYsMjEyLDE3OSwxMjUsMjUwLDIzOSwxOTcsMTQ1LDU3LDExNCwyMjgsMjExLDE4OSw5NywxOTQsMTU5LDM3LDc0LDE0OCw1MSwxMDIsMjA0LDEzMSwyOSw1OCwxMTYsMjMyLDIwMywxNDEsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTQsMTA4LDIxNiwxNzEsNzcsMTU0LDQ3LDk0LDE4OCw5OSwxOTgsMTUxLDUzLDEwNiwyMTIsMTc5LDEyNSwyNTAsMjM5LDE5NywxNDUsNTcsMTE0LDIyOCwyMTEsMTg5LDk3LDE5NCwxNTksMzcsNzQsMTQ4LDUxLDEwMiwyMDQsMTMxLDI5LDU4LDExNiwyMzIsMjAzLDE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0LDEwOCwyMTYsMTcxLDc3LDE1NCw0Nyw5NCwxODgsOTksMTk4LDE1MSw1MywxMDYsMjEyLDE3OSwxMjUsMjUwLDIzOSwxOTcsMTQ1LDU3LDExNCwyMjgsMjExLDE4OSw5NywxOTQsMTU5LDM3LDc0LDE0OCw1MSwxMDIsMjA0LDEzMSwyOSw1OCwxMTYsMjMyLDIwMywxNDFdKTt0aGlzLl9rZXk9dGhpcy5fZXhwYW5kS2V5KGUpfV9leHBhbmRLZXkoZSl7Y29uc3QgdD10aGlzLl9zLHI9dGhpcy5fcmNvbixhPW5ldyBVaW50OEFycmF5KDE3Nik7YS5zZXQoZSk7Zm9yKGxldCBlPTE2LGk9MTtlPDE3NjsrK2kpe2xldCBuPWFbZS0zXSxzPWFbZS0yXSxvPWFbZS0xXSxjPWFbZS00XTtuPXRbbl07cz10W3NdO289dFtvXTtjPXRbY107bl49cltpXTtmb3IobGV0IHQ9MDt0PDQ7Kyt0KXthW2VdPW5ePWFbZS0xNl07ZSsrO2FbZV09c149YVtlLTE2XTtlKys7YVtlXT1vXj1hW2UtMTZdO2UrKzthW2VdPWNePWFbZS0xNl07ZSsrfX1yZXR1cm4gYX19dC5BRVMxMjhDaXBoZXI9QUVTMTI4Q2lwaGVyO2NsYXNzIEFFUzI1NkNpcGhlciBleHRlbmRzIEFFU0Jhc2VDaXBoZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTt0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb249MTQ7dGhpcy5fa2V5U2l6ZT0yMjQ7dGhpcy5fa2V5PXRoaXMuX2V4cGFuZEtleShlKX1fZXhwYW5kS2V5KGUpe2NvbnN0IHQ9dGhpcy5fcyxyPW5ldyBVaW50OEFycmF5KDI0MCk7ci5zZXQoZSk7bGV0IGEsaSxuLHMsbz0xO2ZvcihsZXQgZT0zMixjPTE7ZTwyNDA7KytjKXtpZihlJTMyPT0xNil7YT10W2FdO2k9dFtpXTtuPXRbbl07cz10W3NdfWVsc2UgaWYoZSUzMj09MCl7YT1yW2UtM107aT1yW2UtMl07bj1yW2UtMV07cz1yW2UtNF07YT10W2FdO2k9dFtpXTtuPXRbbl07cz10W3NdO2FePW87KG88PD0xKT49MjU2JiYobz0yNTUmKDI3Xm8pKX1mb3IobGV0IHQ9MDt0PDQ7Kyt0KXtyW2VdPWFePXJbZS0zMl07ZSsrO3JbZV09aV49cltlLTMyXTtlKys7cltlXT1uXj1yW2UtMzJdO2UrKztyW2VdPXNePXJbZS0zMl07ZSsrfX1yZXR1cm4gcn19dC5BRVMyNTZDaXBoZXI9QUVTMjU2Q2lwaGVyO3ZhciBmPWZ1bmN0aW9uIFBERjE3Q2xvc3VyZSgpe2Z1bmN0aW9uIGNvbXBhcmVCeXRlQXJyYXlzKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdIT09dFtyXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBQREYxNygpe31QREYxNy5wcm90b3R5cGU9e2NoZWNrT3duZXJQYXNzd29yZDpmdW5jdGlvbiBQREYxN19jaGVja093bmVyUGFzc3dvcmQoZSx0LHIsYSl7dmFyIGk9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrNTYpO2kuc2V0KGUsMCk7aS5zZXQodCxlLmxlbmd0aCk7aS5zZXQocixlLmxlbmd0aCt0Lmxlbmd0aCk7cmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKGwoaSwwLGkubGVuZ3RoKSxhKX0sY2hlY2tVc2VyUGFzc3dvcmQ6ZnVuY3Rpb24gUERGMTdfY2hlY2tVc2VyUGFzc3dvcmQoZSx0LHIpe3ZhciBhPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO2Euc2V0KGUsMCk7YS5zZXQodCxlLmxlbmd0aCk7cmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKGwoYSwwLGEubGVuZ3RoKSxyKX0sZ2V0T3duZXJLZXk6ZnVuY3Rpb24gUERGMTdfZ2V0T3duZXJLZXkoZSx0LHIsYSl7dmFyIGk9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrNTYpO2kuc2V0KGUsMCk7aS5zZXQodCxlLmxlbmd0aCk7aS5zZXQocixlLmxlbmd0aCt0Lmxlbmd0aCk7dmFyIG49bChpLDAsaS5sZW5ndGgpO3JldHVybiBuZXcgQUVTMjU2Q2lwaGVyKG4pLmRlY3J5cHRCbG9jayhhLCExLG5ldyBVaW50OEFycmF5KDE2KSl9LGdldFVzZXJLZXk6ZnVuY3Rpb24gUERGMTdfZ2V0VXNlcktleShlLHQscil7dmFyIGE9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrOCk7YS5zZXQoZSwwKTthLnNldCh0LGUubGVuZ3RoKTt2YXIgaT1sKGEsMCxhLmxlbmd0aCk7cmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIoaSkuZGVjcnlwdEJsb2NrKHIsITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX19O3JldHVybiBQREYxN30oKTt0LlBERjE3PWY7dmFyIGc9ZnVuY3Rpb24gUERGMjBDbG9zdXJlKCl7ZnVuY3Rpb24gY29uY2F0QXJyYXlzKGUsdCl7dmFyIHI9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrdC5sZW5ndGgpO3Iuc2V0KGUsMCk7ci5zZXQodCxlLmxlbmd0aCk7cmV0dXJuIHJ9ZnVuY3Rpb24gY2FsY3VsYXRlUERGMjBIYXNoKGUsdCxyKXtmb3IodmFyIGE9bCh0LDAsdC5sZW5ndGgpLnN1YmFycmF5KDAsMzIpLGk9WzBdLG49MDtuPDY0fHxpW2kubGVuZ3RoLTFdPm4tMzI7KXt2YXIgcz1lLmxlbmd0aCthLmxlbmd0aCtyLmxlbmd0aCxvPW5ldyBVaW50OEFycmF5KDY0KnMpLGM9Y29uY2F0QXJyYXlzKGUsYSk7Yz1jb25jYXRBcnJheXMoYyxyKTtmb3IodmFyIGQ9MCxmPTA7ZDw2NDtkKyssZis9cylvLnNldChjLGYpO2k9bmV3IEFFUzEyOENpcGhlcihhLnN1YmFycmF5KDAsMTYpKS5lbmNyeXB0KG8sYS5zdWJhcnJheSgxNiwzMikpO2Zvcih2YXIgZz0wLG09MDttPDE2O20rKyl7Zyo9MTtnJT0zO2crPShpW21dPj4+MCklMztnJT0zfTA9PT1nP2E9bChpLDAsaS5sZW5ndGgpOjE9PT1nP2E9dShpLDAsaS5sZW5ndGgpOjI9PT1nJiYoYT1oKGksMCxpLmxlbmd0aCkpO24rK31yZXR1cm4gYS5zdWJhcnJheSgwLDMyKX1mdW5jdGlvbiBQREYyMCgpe31mdW5jdGlvbiBjb21wYXJlQnl0ZUFycmF5cyhlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9UERGMjAucHJvdG90eXBlPXtoYXNoOmZ1bmN0aW9uIFBERjIwX2hhc2goZSx0LHIpe3JldHVybiBjYWxjdWxhdGVQREYyMEhhc2goZSx0LHIpfSxjaGVja093bmVyUGFzc3dvcmQ6ZnVuY3Rpb24gUERGMjBfY2hlY2tPd25lclBhc3N3b3JkKGUsdCxyLGEpe3ZhciBpPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzU2KTtpLnNldChlLDApO2kuc2V0KHQsZS5sZW5ndGgpO2kuc2V0KHIsZS5sZW5ndGgrdC5sZW5ndGgpO3JldHVybiBjb21wYXJlQnl0ZUFycmF5cyhjYWxjdWxhdGVQREYyMEhhc2goZSxpLHIpLGEpfSxjaGVja1VzZXJQYXNzd29yZDpmdW5jdGlvbiBQREYyMF9jaGVja1VzZXJQYXNzd29yZChlLHQscil7dmFyIGE9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrOCk7YS5zZXQoZSwwKTthLnNldCh0LGUubGVuZ3RoKTtyZXR1cm4gY29tcGFyZUJ5dGVBcnJheXMoY2FsY3VsYXRlUERGMjBIYXNoKGUsYSxbXSkscil9LGdldE93bmVyS2V5OmZ1bmN0aW9uIFBERjIwX2dldE93bmVyS2V5KGUsdCxyLGEpe3ZhciBpPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzU2KTtpLnNldChlLDApO2kuc2V0KHQsZS5sZW5ndGgpO2kuc2V0KHIsZS5sZW5ndGgrdC5sZW5ndGgpO3ZhciBuPWNhbGN1bGF0ZVBERjIwSGFzaChlLGkscik7cmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIobikuZGVjcnlwdEJsb2NrKGEsITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX0sZ2V0VXNlcktleTpmdW5jdGlvbiBQREYyMF9nZXRVc2VyS2V5KGUsdCxyKXt2YXIgYT1uZXcgVWludDhBcnJheShlLmxlbmd0aCs4KTthLnNldChlLDApO2Euc2V0KHQsZS5sZW5ndGgpO3ZhciBpPWNhbGN1bGF0ZVBERjIwSGFzaChlLGEsW10pO3JldHVybiBuZXcgQUVTMjU2Q2lwaGVyKGkpLmRlY3J5cHRCbG9jayhyLCExLG5ldyBVaW50OEFycmF5KDE2KSl9fTtyZXR1cm4gUERGMjB9KCk7dC5QREYyMD1nO3ZhciBtPWZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybUNsb3N1cmUoKXtmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm0oZSx0KXt0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yPWU7dGhpcy5TdHJlYW1DaXBoZXJDb25zdHJ1Y3Rvcj10fUNpcGhlclRyYW5zZm9ybS5wcm90b3R5cGU9e2NyZWF0ZVN0cmVhbTpmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fY3JlYXRlU3RyZWFtKGUsdCl7dmFyIHI9bmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I7cmV0dXJuIG5ldyBuLkRlY3J5cHRTdHJlYW0oZSx0LChmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1EZWNyeXB0U3RyZWFtKGUsdCl7cmV0dXJuIHIuZGVjcnlwdEJsb2NrKGUsdCl9KSl9LGRlY3J5cHRTdHJpbmc6ZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtX2RlY3J5cHRTdHJpbmcoZSl7dmFyIHQ9bmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3Iscj0oMCxhLnN0cmluZ1RvQnl0ZXMpKGUpO3I9dC5kZWNyeXB0QmxvY2sociwhMCk7cmV0dXJuKDAsYS5ieXRlc1RvU3RyaW5nKShyKX0sZW5jcnlwdFN0cmluZzpmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fZW5jcnlwdFN0cmluZyhlKXtjb25zdCB0PW5ldyB0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yO2lmKHQgaW5zdGFuY2VvZiBBRVNCYXNlQ2lwaGVyKXtjb25zdCByPWUubGVuZ3RoLGk9MTYtciUxNjsxNiE9PWkmJihlPWUucGFkRW5kKDE2Kk1hdGguY2VpbChyLzE2KSxTdHJpbmcuZnJvbUNoYXJDb2RlKGkpKSk7Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxNik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBjcnlwdG8pY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuKTtlbHNlIGZvcihsZXQgZT0wO2U8MTY7ZSsrKW5bZV09TWF0aC5mbG9vcigyNTYqTWF0aC5yYW5kb20oKSk7bGV0IHM9KDAsYS5zdHJpbmdUb0J5dGVzKShlKTtzPXQuZW5jcnlwdChzLG4pO2NvbnN0IG89bmV3IFVpbnQ4QXJyYXkoMTYrcy5sZW5ndGgpO28uc2V0KG4pO28uc2V0KHMsMTYpO3JldHVybigwLGEuYnl0ZXNUb1N0cmluZykobyl9bGV0IHI9KDAsYS5zdHJpbmdUb0J5dGVzKShlKTtyPXQuZW5jcnlwdChyKTtyZXR1cm4oMCxhLmJ5dGVzVG9TdHJpbmcpKHIpfX07cmV0dXJuIENpcGhlclRyYW5zZm9ybX0oKSxwPWZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybUZhY3RvcnlDbG9zdXJlKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoWzQwLDE5MSw3OCw5NCw3OCwxMTcsMTM4LDY1LDEwMCwwLDc4LDg2LDI1NSwyNTAsMSw4LDQ2LDQ2LDAsMTgyLDIwOCwxMDQsNjIsMTI4LDQ3LDEyLDE2OSwyNTQsMTAwLDgzLDEwNSwxMjJdKTtmdW5jdGlvbiBwcmVwYXJlS2V5RGF0YSh0LHIsYSxpLG4sYyxsLGgpe3ZhciB1LGQsZj00MCthLmxlbmd0aCt0Lmxlbmd0aCxnPW5ldyBVaW50OEFycmF5KGYpLG09MDtpZihyKXtkPU1hdGgubWluKDMyLHIubGVuZ3RoKTtmb3IoO208ZDsrK20pZ1ttXT1yW21dfXU9MDtmb3IoO208MzI7KWdbbSsrXT1lW3UrK107Zm9yKHU9MCxkPWEubGVuZ3RoO3U8ZDsrK3UpZ1ttKytdPWFbdV07Z1ttKytdPTI1NSZuO2dbbSsrXT1uPj44JjI1NTtnW20rK109bj4+MTYmMjU1O2dbbSsrXT1uPj4+MjQmMjU1O2Zvcih1PTAsZD10Lmxlbmd0aDt1PGQ7Kyt1KWdbbSsrXT10W3VdO2lmKGM+PTQmJiFoKXtnW20rK109MjU1O2dbbSsrXT0yNTU7Z1ttKytdPTI1NTtnW20rK109MjU1fXZhciBwPW8oZywwLG0pLGI9bD4+MztpZihjPj0zKWZvcih1PTA7dTw1MDsrK3UpcD1vKHAsMCxiKTt2YXIgeSx2PXAuc3ViYXJyYXkoMCxiKTtpZihjPj0zKXtmb3IobT0wO208MzI7KyttKWdbbV09ZVttXTtmb3IodT0wLGQ9dC5sZW5ndGg7dTxkOysrdSlnW20rK109dFt1XTt5PW5ldyBzKHYpLmVuY3J5cHRCbG9jayhvKGcsMCxtKSk7ZD12Lmxlbmd0aDt2YXIgdyxrPW5ldyBVaW50OEFycmF5KGQpO2Zvcih1PTE7dTw9MTk7Kyt1KXtmb3Iodz0wO3c8ZDsrK3cpa1t3XT12W3ddXnU7eT1uZXcgcyhrKS5lbmNyeXB0QmxvY2soeSl9Zm9yKHU9MCxkPXkubGVuZ3RoO3U8ZDsrK3UpaWYoaVt1XSE9PXlbdV0pcmV0dXJuIG51bGx9ZWxzZSBmb3IodT0wLGQ9KHk9bmV3IHModikuZW5jcnlwdEJsb2NrKGUpKS5sZW5ndGg7dTxkOysrdSlpZihpW3VdIT09eVt1XSlyZXR1cm4gbnVsbDtyZXR1cm4gdn12YXIgdD1pLk5hbWUuZ2V0KCJJZGVudGl0eSIpO2Z1bmN0aW9uIENpcGhlclRyYW5zZm9ybUZhY3RvcnkocixuLGMpe3ZhciBsPXIuZ2V0KCJGaWx0ZXIiKTtpZighKDAsaS5pc05hbWUpKGwsIlN0YW5kYXJkIikpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoInVua25vd24gZW5jcnlwdGlvbiBtZXRob2QiKTt0aGlzLmRpY3Q9cjt2YXIgaD1yLmdldCgiViIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGgpfHwxIT09aCYmMiE9PWgmJjQhPT1oJiY1IT09aCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigidW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBhbGdvcml0aG0iKTt0aGlzLmFsZ29yaXRobT1oO3ZhciB1PXIuZ2V0KCJMZW5ndGgiKTtpZighdSlpZihoPD0zKXU9NDA7ZWxzZXt2YXIgZD1yLmdldCgiQ0YiKSxtPXIuZ2V0KCJTdG1GIik7aWYoKDAsaS5pc0RpY3QpKGQpJiYoMCxpLmlzTmFtZSkobSkpe2Quc3VwcHJlc3NFbmNyeXB0aW9uPSEwO3ZhciBwPWQuZ2V0KG0ubmFtZSk7KHU9cCYmcC5nZXQoIkxlbmd0aCIpfHwxMjgpPDQwJiYodTw8PTMpfX1pZighTnVtYmVyLmlzSW50ZWdlcih1KXx8dTw0MHx8dSU4IT0wKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJpbnZhbGlkIGtleSBsZW5ndGgiKTt2YXIgYj0oMCxhLnN0cmluZ1RvQnl0ZXMpKHIuZ2V0KCJPIikpLnN1YmFycmF5KDAsMzIpLHk9KDAsYS5zdHJpbmdUb0J5dGVzKShyLmdldCgiVSIpKS5zdWJhcnJheSgwLDMyKSx2PXIuZ2V0KCJQIiksdz1yLmdldCgiUiIpLGs9KDQ9PT1ofHw1PT09aCkmJiExIT09ci5nZXQoIkVuY3J5cHRNZXRhZGF0YSIpO3RoaXMuZW5jcnlwdE1ldGFkYXRhPWs7dmFyIFMsQyx4PSgwLGEuc3RyaW5nVG9CeXRlcykobik7aWYoYyl7aWYoNj09PXcpdHJ5e2M9KDAsYS51dGY4U3RyaW5nVG9TdHJpbmcpKGMpfWNhdGNoKGUpeygwLGEud2FybikoIkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk6IFVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC4iKX1TPSgwLGEuc3RyaW5nVG9CeXRlcykoYyl9aWYoNSE9PWgpQz1wcmVwYXJlS2V5RGF0YSh4LFMsYix5LHYsdyx1LGspO2Vsc2V7dmFyIEE9KDAsYS5zdHJpbmdUb0J5dGVzKShyLmdldCgiTyIpKS5zdWJhcnJheSgzMiw0MCksVD0oMCxhLnN0cmluZ1RvQnl0ZXMpKHIuZ2V0KCJPIikpLnN1YmFycmF5KDQwLDQ4KSxJPSgwLGEuc3RyaW5nVG9CeXRlcykoci5nZXQoIlUiKSkuc3ViYXJyYXkoMCw0OCksRj0oMCxhLnN0cmluZ1RvQnl0ZXMpKHIuZ2V0KCJVIikpLnN1YmFycmF5KDMyLDQwKSxQPSgwLGEuc3RyaW5nVG9CeXRlcykoci5nZXQoIlUiKSkuc3ViYXJyYXkoNDAsNDgpLEU9KDAsYS5zdHJpbmdUb0J5dGVzKShyLmdldCgiT0UiKSksQj0oMCxhLnN0cmluZ1RvQnl0ZXMpKHIuZ2V0KCJVRSIpKTsoMCxhLnN0cmluZ1RvQnl0ZXMpKHIuZ2V0KCJQZXJtcyIpKTtDPWZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRpb25LZXkyMChlLHQscixhLGksbixzLG8sYyxsLGgsdSl7aWYodCl7dmFyIGQ9TWF0aC5taW4oMTI3LHQubGVuZ3RoKTt0PXQuc3ViYXJyYXkoMCxkKX1lbHNlIHQ9W107dmFyIG07cmV0dXJuKG09Nj09PWU/bmV3IGc6bmV3IGYpLmNoZWNrVXNlclBhc3N3b3JkKHQsbyxzKT9tLmdldFVzZXJLZXkodCxjLGgpOnQubGVuZ3RoJiZtLmNoZWNrT3duZXJQYXNzd29yZCh0LGEsbixyKT9tLmdldE93bmVyS2V5KHQsaSxuLGwpOm51bGx9KHcsUyxiLEEsVCxJLHksRixQLEUsQil9aWYoIUMmJiFjKXRocm93IG5ldyBhLlBhc3N3b3JkRXhjZXB0aW9uKCJObyBwYXNzd29yZCBnaXZlbiIsYS5QYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTtpZighQyYmYyl7Qz1wcmVwYXJlS2V5RGF0YSh4LGZ1bmN0aW9uIGRlY29kZVVzZXJQYXNzd29yZCh0LHIsYSxpKXt2YXIgbixjLGw9bmV3IFVpbnQ4QXJyYXkoMzIpLGg9MDtjPU1hdGgubWluKDMyLHQubGVuZ3RoKTtmb3IoO2g8YzsrK2gpbFtoXT10W2hdO249MDtmb3IoO2g8MzI7KWxbaCsrXT1lW24rK107dmFyIHUsZD1vKGwsMCxoKSxmPWk+PjM7aWYoYT49Mylmb3Iobj0wO248NTA7KytuKWQ9byhkLDAsZC5sZW5ndGgpO2lmKGE+PTMpe3U9cjt2YXIgZyxtPW5ldyBVaW50OEFycmF5KGYpO2ZvcihuPTE5O24+PTA7bi0tKXtmb3IoZz0wO2c8ZjsrK2cpbVtnXT1kW2ddXm47dT1uZXcgcyhtKS5lbmNyeXB0QmxvY2sodSl9fWVsc2UgdT1uZXcgcyhkLnN1YmFycmF5KDAsZikpLmVuY3J5cHRCbG9jayhyKTtyZXR1cm4gdX0oUyxiLHcsdSksYix5LHYsdyx1LGspfWlmKCFDKXRocm93IG5ldyBhLlBhc3N3b3JkRXhjZXB0aW9uKCJJbmNvcnJlY3QgUGFzc3dvcmQiLGEuUGFzc3dvcmRSZXNwb25zZXMuSU5DT1JSRUNUX1BBU1NXT1JEKTt0aGlzLmVuY3J5cHRpb25LZXk9QztpZihoPj00KXt2YXIgTz1yLmdldCgiQ0YiKTsoMCxpLmlzRGljdCkoTykmJihPLnN1cHByZXNzRW5jcnlwdGlvbj0hMCk7dGhpcy5jZj1PO3RoaXMuc3RtZj1yLmdldCgiU3RtRiIpfHx0O3RoaXMuc3RyZj1yLmdldCgiU3RyRiIpfHx0O3RoaXMuZWZmPXIuZ2V0KCJFRkYiKXx8dGhpcy5zdG1mfX1mdW5jdGlvbiBidWlsZE9iamVjdEtleShlLHQscixhKXt2YXIgaSxuLHM9bmV3IFVpbnQ4QXJyYXkoci5sZW5ndGgrOSk7Zm9yKGk9MCxuPXIubGVuZ3RoO2k8bjsrK2kpc1tpXT1yW2ldO3NbaSsrXT0yNTUmZTtzW2krK109ZT4+OCYyNTU7c1tpKytdPWU+PjE2JjI1NTtzW2krK109MjU1JnQ7c1tpKytdPXQ+PjgmMjU1O2lmKGEpe3NbaSsrXT0xMTU7c1tpKytdPTY1O3NbaSsrXT0xMDg7c1tpKytdPTg0fXJldHVybiBvKHMsMCxpKS5zdWJhcnJheSgwLE1hdGgubWluKHIubGVuZ3RoKzUsMTYpKX1mdW5jdGlvbiBidWlsZENpcGhlckNvbnN0cnVjdG9yKGUsdCxyLG4sbyl7aWYoISgwLGkuaXNOYW1lKSh0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS4iKTt2YXIgYyxsPWUuZ2V0KHQubmFtZSk7bnVsbCE9bCYmKGM9bC5nZXQoIkNGTSIpKTtpZighY3x8Ik5vbmUiPT09Yy5uYW1lKXJldHVybiBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1GYWN0b3J5QnVpbGRDaXBoZXJDb25zdHJ1Y3Rvck5vbmUoKXtyZXR1cm4gbmV3IGR9O2lmKCJWMiI9PT1jLm5hbWUpcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yVjIoKXtyZXR1cm4gbmV3IHMoYnVpbGRPYmplY3RLZXkocixuLG8sITEpKX07aWYoIkFFU1YyIj09PWMubmFtZSlyZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JBRVNWMigpe3JldHVybiBuZXcgQUVTMTI4Q2lwaGVyKGJ1aWxkT2JqZWN0S2V5KHIsbixvLCEwKSl9O2lmKCJBRVNWMyI9PT1jLm5hbWUpcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yQUVTVjMoKXtyZXR1cm4gbmV3IEFFUzI1NkNpcGhlcihvKX07dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlVua25vd24gY3J5cHRvIG1ldGhvZCIpfUNpcGhlclRyYW5zZm9ybUZhY3RvcnkucHJvdG90eXBlPXtjcmVhdGVDaXBoZXJUcmFuc2Zvcm06ZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeV9jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oZSx0KXtpZig0PT09dGhpcy5hbGdvcml0aG18fDU9PT10aGlzLmFsZ29yaXRobSlyZXR1cm4gbmV3IG0oYnVpbGRDaXBoZXJDb25zdHJ1Y3Rvcih0aGlzLmNmLHRoaXMuc3RtZixlLHQsdGhpcy5lbmNyeXB0aW9uS2V5KSxidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsdGhpcy5zdHJmLGUsdCx0aGlzLmVuY3J5cHRpb25LZXkpKTt2YXIgcj1idWlsZE9iamVjdEtleShlLHQsdGhpcy5lbmNyeXB0aW9uS2V5LCExKSxhPWZ1bmN0aW9uIGJ1aWxkQ2lwaGVyQ2lwaGVyQ29uc3RydWN0b3IoKXtyZXR1cm4gbmV3IHMocil9O3JldHVybiBuZXcgbShhLGEpfX07cmV0dXJuIENpcGhlclRyYW5zZm9ybUZhY3Rvcnl9KCk7dC5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5PXB9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQ29sb3JTcGFjZT12b2lkIDA7dmFyIGE9cigyKSxpPXIoNSksbj1yKDgpO2NsYXNzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNvbnN0cnVjdG9yPT09Q29sb3JTcGFjZSYmKDAsYS51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIENvbG9yU3BhY2UuIik7dGhpcy5uYW1lPWU7dGhpcy5udW1Db21wcz10fWdldFJnYihlLHQpe2NvbnN0IHI9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpO3RoaXMuZ2V0UmdiSXRlbShlLHQsciwwKTtyZXR1cm4gcn1nZXRSZ2JJdGVtKGUsdCxyLGkpeygwLGEudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIil9Z2V0UmdiQnVmZmVyKGUsdCxyLGksbixzLG8peygwLGEudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JCdWZmZXIiKX1nZXRPdXRwdXRMZW5ndGgoZSx0KXsoMCxhLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0T3V0cHV0TGVuZ3RoIil9aXNQYXNzdGhyb3VnaChlKXtyZXR1cm4hMX1pc0RlZmF1bHREZWNvZGUoZSx0KXtyZXR1cm4gQ29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUoZSx0aGlzLm51bUNvbXBzKX1maWxsUmdiKGUsdCxyLGEsaSxuLHMsbyxjKXtjb25zdCBsPXQqcjtsZXQgaD1udWxsO2NvbnN0IHU9MTw8cyxkPXIhPT1pfHx0IT09YTtpZih0aGlzLmlzUGFzc3Rocm91Z2gocykpaD1vO2Vsc2UgaWYoMT09PXRoaXMubnVtQ29tcHMmJmw+dSYmIkRldmljZUdyYXkiIT09dGhpcy5uYW1lJiYiRGV2aWNlUkdCIiE9PXRoaXMubmFtZSl7Y29uc3QgdD1zPD04P25ldyBVaW50OEFycmF5KHUpOm5ldyBVaW50MTZBcnJheSh1KTtmb3IobGV0IGU9MDtlPHU7ZSsrKXRbZV09ZTtjb25zdCByPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKnUpO3RoaXMuZ2V0UmdiQnVmZmVyKHQsMCx1LHIsMCxzLDApO2lmKGQpe2g9bmV3IFVpbnQ4QXJyYXkoMypsKTtsZXQgZT0wO2ZvcihsZXQgdD0wO3Q8bDsrK3Qpe2NvbnN0IGE9MypvW3RdO2hbZSsrXT1yW2FdO2hbZSsrXT1yW2ErMV07aFtlKytdPXJbYSsyXX19ZWxzZXtsZXQgdD0wO2ZvcihsZXQgYT0wO2E8bDsrK2Epe2NvbnN0IGk9MypvW2FdO2VbdCsrXT1yW2ldO2VbdCsrXT1yW2krMV07ZVt0KytdPXJbaSsyXTt0Kz1jfX19ZWxzZSBpZihkKXtoPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKmwpO3RoaXMuZ2V0UmdiQnVmZmVyKG8sMCxsLGgsMCxzLDApfWVsc2UgdGhpcy5nZXRSZ2JCdWZmZXIobywwLGEqbixlLDAscyxjKTtpZihoKWlmKGQpIWZ1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKGUsdCxyLGEsaSxuLHMpe3M9MSE9PXM/MDpzO2NvbnN0IG89ci9pLGM9YS9uO2xldCBsLGg9MDtjb25zdCB1PW5ldyBVaW50MTZBcnJheShpKSxkPTMqcjtmb3IobGV0IGU9MDtlPGk7ZSsrKXVbZV09MypNYXRoLmZsb29yKGUqbyk7Zm9yKGxldCByPTA7cjxuO3IrKyl7Y29uc3QgYT1NYXRoLmZsb29yKHIqYykqZDtmb3IobGV0IHI9MDtyPGk7cisrKXtsPWErdVtyXTt0W2grK109ZVtsKytdO3RbaCsrXT1lW2wrK107dFtoKytdPWVbbCsrXTtoKz1zfX19KGgsZSx0LHIsYSxpLGMpO2Vsc2V7bGV0IHQ9MCxyPTA7Zm9yKGxldCBpPTAscz1hKm47aTxzO2krKyl7ZVt0KytdPWhbcisrXTtlW3QrK109aFtyKytdO2VbdCsrXT1oW3IrK107dCs9Y319fWdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywidXNlc1plcm9Ub09uZVJhbmdlIiwhMCl9c3RhdGljIF9jYWNoZShlLHQscixhKXtpZighcil0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgInBhcnNlZENvbG9yU3BhY2UiIGFyZ3VtZW50LicpO2xldCBuLHM7aWYoZSBpbnN0YW5jZW9mIGkuUmVmKXtzPWU7ZT10LmZldGNoKGUpfWUgaW5zdGFuY2VvZiBpLk5hbWUmJihuPWUubmFtZSk7KG58fHMpJiZyLnNldChuLHMsYSl9c3RhdGljIGdldENhY2hlZChlLHQscil7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCdDb2xvclNwYWNlLmdldENhY2hlZCAtIGV4cGVjdGVkICJsb2NhbENvbG9yU3BhY2VDYWNoZSIgYXJndW1lbnQuJyk7aWYoZSBpbnN0YW5jZW9mIGkuUmVmKXtjb25zdCBhPXIuZ2V0QnlSZWYoZSk7aWYoYSlyZXR1cm4gYTt0cnl7ZT10LmZldGNoKGUpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBuLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGV9fWlmKGUgaW5zdGFuY2VvZiBpLk5hbWUpe2NvbnN0IHQ9ci5nZXRCeU5hbWUoZS5uYW1lKTtpZih0KXJldHVybiB0fXJldHVybiBudWxsfXN0YXRpYyBhc3luYyBwYXJzZUFzeW5jKHtjczplLHhyZWY6dCxyZXNvdXJjZXM6cj1udWxsLHBkZkZ1bmN0aW9uRmFjdG9yeTphLGxvY2FsQ29sb3JTcGFjZUNhY2hlOml9KXtjb25zdCBuPXRoaXMuX3BhcnNlKGUsdCxyLGEpO3RoaXMuX2NhY2hlKGUsdCxpLG4pO3JldHVybiBufXN0YXRpYyBwYXJzZSh7Y3M6ZSx4cmVmOnQscmVzb3VyY2VzOnI9bnVsbCxwZGZGdW5jdGlvbkZhY3Rvcnk6YSxsb2NhbENvbG9yU3BhY2VDYWNoZTppfSl7Y29uc3Qgbj10aGlzLmdldENhY2hlZChlLHQsaSk7aWYobilyZXR1cm4gbjtjb25zdCBzPXRoaXMuX3BhcnNlKGUsdCxyLGEpO3RoaXMuX2NhY2hlKGUsdCxpLHMpO3JldHVybiBzfXN0YXRpYyBfcGFyc2UoZSx0LHI9bnVsbCxuKXtlPXQuZmV0Y2hJZlJlZihlKTtpZigoMCxpLmlzTmFtZSkoZSkpc3dpdGNoKGUubmFtZSl7Y2FzZSJEZXZpY2VHcmF5IjpjYXNlIkciOnJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtjYXNlIkRldmljZVJHQiI6Y2FzZSJSR0IiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiO2Nhc2UiRGV2aWNlQ01ZSyI6Y2FzZSJDTVlLIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7Y2FzZSJQYXR0ZXJuIjpyZXR1cm4gbmV3IFBhdHRlcm5DUyhudWxsKTtkZWZhdWx0OmlmKCgwLGkuaXNEaWN0KShyKSl7Y29uc3QgYT1yLmdldCgiQ29sb3JTcGFjZSIpO2lmKCgwLGkuaXNEaWN0KShhKSl7Y29uc3Qgcz1hLmdldChlLm5hbWUpO2lmKHMpe2lmKCgwLGkuaXNOYW1lKShzKSlyZXR1cm4gdGhpcy5fcGFyc2Uocyx0LHIsbik7ZT1zO2JyZWFrfX19dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlVucmVjb2duaXplZCBDb2xvclNwYWNlOiAiK2UubmFtZSl9aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgaT10LmZldGNoSWZSZWYoZVswXSkubmFtZTtsZXQgcyxoLHUsZCxmLGc7c3dpdGNoKGkpe2Nhc2UiRGV2aWNlR3JheSI6Y2FzZSJHIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7Y2FzZSJEZXZpY2VSR0IiOmNhc2UiUkdCIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtjYXNlIkRldmljZUNNWUsiOmNhc2UiQ01ZSyI6cmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO2Nhc2UiQ2FsR3JheSI6cz10LmZldGNoSWZSZWYoZVsxXSk7ZD1zLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7Zj1zLmdldEFycmF5KCJCbGFja1BvaW50Iik7Zz1zLmdldCgiR2FtbWEiKTtyZXR1cm4gbmV3IG8oZCxmLGcpO2Nhc2UiQ2FsUkdCIjpzPXQuZmV0Y2hJZlJlZihlWzFdKTtkPXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTtmPXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTtnPXMuZ2V0QXJyYXkoIkdhbW1hIik7Y29uc3QgbT1zLmdldEFycmF5KCJNYXRyaXgiKTtyZXR1cm4gbmV3IGMoZCxmLGcsbSk7Y2FzZSJJQ0NCYXNlZCI6Y29uc3QgcD10LmZldGNoSWZSZWYoZVsxXSkuZGljdDtoPXAuZ2V0KCJOIik7Y29uc3QgYj1wLmdldCgiQWx0ZXJuYXRlIik7aWYoYil7Y29uc3QgZT10aGlzLl9wYXJzZShiLHQscixuKTtpZihlLm51bUNvbXBzPT09aClyZXR1cm4gZTsoMCxhLndhcm4pKCJJQ0NCYXNlZCBjb2xvciBzcGFjZTogSWdub3JpbmcgaW5jb3JyZWN0IC9BbHRlcm5hdGUgZW50cnkuIil9aWYoMT09PWgpcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5O2lmKDM9PT1oKXJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiO2lmKDQ9PT1oKXJldHVybiB0aGlzLnNpbmdsZXRvbnMuY215azticmVhaztjYXNlIlBhdHRlcm4iOnU9ZVsxXXx8bnVsbDt1JiYodT10aGlzLl9wYXJzZSh1LHQscixuKSk7cmV0dXJuIG5ldyBQYXR0ZXJuQ1ModSk7Y2FzZSJJbmRleGVkIjpjYXNlIkkiOnU9dGhpcy5fcGFyc2UoZVsxXSx0LHIsbik7Y29uc3QgeT10LmZldGNoSWZSZWYoZVsyXSkrMSx2PXQuZmV0Y2hJZlJlZihlWzNdKTtyZXR1cm4gbmV3IEluZGV4ZWRDUyh1LHksdik7Y2FzZSJTZXBhcmF0aW9uIjpjYXNlIkRldmljZU4iOmNvbnN0IHc9dC5mZXRjaElmUmVmKGVbMV0pO2g9QXJyYXkuaXNBcnJheSh3KT93Lmxlbmd0aDoxO3U9dGhpcy5fcGFyc2UoZVsyXSx0LHIsbik7Y29uc3Qgaz1uLmNyZWF0ZShlWzNdKTtyZXR1cm4gbmV3IEFsdGVybmF0ZUNTKGgsdSxrKTtjYXNlIkxhYiI6cz10LmZldGNoSWZSZWYoZVsxXSk7ZD1zLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7Zj1zLmdldEFycmF5KCJCbGFja1BvaW50Iik7Y29uc3QgUz1zLmdldEFycmF5KCJSYW5nZSIpO3JldHVybiBuZXcgbChkLGYsUyk7ZGVmYXVsdDp0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5pbXBsZW1lbnRlZCBDb2xvclNwYWNlIG9iamVjdDogIitpKX19dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogIitlKX1zdGF0aWMgaXNEZWZhdWx0RGVjb2RlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuITA7aWYoMip0IT09ZS5sZW5ndGgpeygwLGEud2FybikoIlRoZSBkZWNvZGUgbWFwIGlzIG5vdCB0aGUgY29ycmVjdCBsZW5ndGgiKTtyZXR1cm4hMH1mb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0Kz0yKWlmKDAhPT1lW3RdfHwxIT09ZVt0KzFdKXJldHVybiExO3JldHVybiEwfXN0YXRpYyBnZXQgc2luZ2xldG9ucygpe3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJzaW5nbGV0b25zIix7Z2V0IGdyYXkoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiZ3JheSIsbmV3IERldmljZUdyYXlDUyl9LGdldCByZ2IoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywicmdiIixuZXcgRGV2aWNlUmdiQ1MpfSxnZXQgY215aygpe3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJjbXlrIixuZXcgcyl9fSl9fXQuQ29sb3JTcGFjZT1Db2xvclNwYWNlO2NsYXNzIEFsdGVybmF0ZUNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoIkFsdGVybmF0ZSIsZSk7dGhpcy5iYXNlPXQ7dGhpcy50aW50Rm49cjt0aGlzLnRtcEJ1Zj1uZXcgRmxvYXQzMkFycmF5KHQubnVtQ29tcHMpfWdldFJnYkl0ZW0oZSx0LHIsYSl7Y29uc3QgaT10aGlzLnRtcEJ1Zjt0aGlzLnRpbnRGbihlLHQsaSwwKTt0aGlzLmJhc2UuZ2V0UmdiSXRlbShpLDAscixhKX1nZXRSZ2JCdWZmZXIoZSx0LHIsYSxpLG4scyl7Y29uc3Qgbz10aGlzLnRpbnRGbixjPXRoaXMuYmFzZSxsPTEvKCgxPDxuKS0xKSxoPWMubnVtQ29tcHMsdT1jLnVzZXNaZXJvVG9PbmVSYW5nZSxkPShjLmlzUGFzc3Rocm91Z2goOCl8fCF1KSYmMD09PXM7bGV0IGY9ZD9pOjA7Y29uc3QgZz1kP2E6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGgqciksbT10aGlzLm51bUNvbXBzLHA9bmV3IEZsb2F0MzJBcnJheShtKSxiPW5ldyBGbG9hdDMyQXJyYXkoaCk7bGV0IHksdjtmb3IoeT0wO3k8cjt5Kyspe2Zvcih2PTA7djxtO3YrKylwW3ZdPWVbdCsrXSpsO28ocCwwLGIsMCk7aWYodSlmb3Iodj0wO3Y8aDt2KyspZ1tmKytdPTI1NSpiW3ZdO2Vsc2V7Yy5nZXRSZ2JJdGVtKGIsMCxnLGYpO2YrPWh9fWR8fGMuZ2V0UmdiQnVmZmVyKGcsMCxyLGEsaSw4LHMpfWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGUqdGhpcy5iYXNlLm51bUNvbXBzL3RoaXMubnVtQ29tcHMsdCl9fWNsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSl7c3VwZXIoIlBhdHRlcm4iLG51bGwpO3RoaXMuYmFzZT1lfWlzRGVmYXVsdERlY29kZShlLHQpeygwLGEudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgUGF0dGVybkNTLmlzRGVmYXVsdERlY29kZSIpfX1jbGFzcyBJbmRleGVkQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKGUsdCxyKXtzdXBlcigiSW5kZXhlZCIsMSk7dGhpcy5iYXNlPWU7dGhpcy5oaWdoVmFsPXQ7Y29uc3Qgbj1lLm51bUNvbXBzKnQ7dGhpcy5sb29rdXA9bmV3IFVpbnQ4QXJyYXkobik7aWYoKDAsaS5pc1N0cmVhbSkocikpe2NvbnN0IGU9ci5nZXRCeXRlcyhuKTt0aGlzLmxvb2t1cC5zZXQoZSl9ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICIrcik7Zm9yKGxldCBlPTA7ZTxuOysrZSl0aGlzLmxvb2t1cFtlXT0yNTUmci5jaGFyQ29kZUF0KGUpfX1nZXRSZ2JJdGVtKGUsdCxyLGEpe2NvbnN0IGk9dGhpcy5iYXNlLm51bUNvbXBzLG49ZVt0XSppO3RoaXMuYmFzZS5nZXRSZ2JCdWZmZXIodGhpcy5sb29rdXAsbiwxLHIsYSw4LDApfWdldFJnYkJ1ZmZlcihlLHQscixhLGksbixzKXtjb25zdCBvPXRoaXMuYmFzZSxjPW8ubnVtQ29tcHMsbD1vLmdldE91dHB1dExlbmd0aChjLHMpLGg9dGhpcy5sb29rdXA7Zm9yKGxldCBuPTA7bjxyOysrbil7Y29uc3Qgcj1lW3QrK10qYztvLmdldFJnYkJ1ZmZlcihoLHIsMSxhLGksOCxzKTtpKz1sfX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChlKnRoaXMuYmFzZS5udW1Db21wcyx0KX1pc0RlZmF1bHREZWNvZGUoZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtpZigyIT09ZS5sZW5ndGgpeygwLGEud2FybikoIkRlY29kZSBtYXAgbGVuZ3RoIGlzIG5vdCBjb3JyZWN0Iik7cmV0dXJuITB9aWYoIU51bWJlci5pc0ludGVnZXIodCl8fHQ8MSl7KDAsYS53YXJuKSgiQml0cyBwZXIgY29tcG9uZW50IGlzIG5vdCBjb3JyZWN0Iik7cmV0dXJuITB9cmV0dXJuIDA9PT1lWzBdJiZlWzFdPT09KDE8PHQpLTF9fWNsYXNzIERldmljZUdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoKXtzdXBlcigiRGV2aWNlR3JheSIsMSl9Z2V0UmdiSXRlbShlLHQscixhKXtjb25zdCBpPTI1NSplW3RdO3JbYV09clthKzFdPXJbYSsyXT1pfWdldFJnYkJ1ZmZlcihlLHQscixhLGksbixzKXtjb25zdCBvPTI1NS8oKDE8PG4pLTEpO2xldCBjPXQsbD1pO2ZvcihsZXQgdD0wO3Q8cjsrK3Qpe2NvbnN0IHQ9byplW2MrK107YVtsKytdPXQ7YVtsKytdPXQ7YVtsKytdPXQ7bCs9c319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCl9fWNsYXNzIERldmljZVJnYkNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VSR0IiLDMpfWdldFJnYkl0ZW0oZSx0LHIsYSl7clthXT0yNTUqZVt0XTtyW2ErMV09MjU1KmVbdCsxXTtyW2ErMl09MjU1KmVbdCsyXX1nZXRSZ2JCdWZmZXIoZSx0LHIsYSxpLG4scyl7aWYoOD09PW4mJjA9PT1zKXthLnNldChlLnN1YmFycmF5KHQsdCszKnIpLGkpO3JldHVybn1jb25zdCBvPTI1NS8oKDE8PG4pLTEpO2xldCBjPXQsbD1pO2ZvcihsZXQgdD0wO3Q8cjsrK3Qpe2FbbCsrXT1vKmVbYysrXTthW2wrK109byplW2MrK107YVtsKytdPW8qZVtjKytdO2wrPXN9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiBlKigzK3QpLzN8MH1pc1Bhc3N0aHJvdWdoKGUpe3JldHVybiA4PT09ZX19Y29uc3Qgcz1mdW5jdGlvbiBEZXZpY2VDbXlrQ1NDbG9zdXJlKCl7ZnVuY3Rpb24gY29udmVydFRvUmdiKGUsdCxyLGEsaSl7Y29uc3Qgbj1lW3RdKnIscz1lW3QrMV0qcixvPWVbdCsyXSpyLGM9ZVt0KzNdKnI7YVtpXT0yNTUrbiooLTQuMzg3MzMyMzg0NjA5OTg4Km4rNTQuNDg2MTUxOTQxODkxNzYqcysxOC44MjI5MDUwMjE2NTMwMipvKzIxMi4yNTY2MjQ1MTYzOTU4NSpjLTI4NS4yMzMxMDI2MTM3MDA0KStzKigxLjcxNDk3NjM0NzczNjIxMzQqcy01LjYwOTY3MzY5MDQwNDczMTUqbystMTcuODczODcwODYxNDE1NDQ0KmMtNS40OTcwMDY0MjcxOTYzNjYpK28qKC0yLjUyMTczNDAxMzE2ODMwMzMqby0yMS4yNDg5MjMzMzczNTMwNzMqYysxNy41MTE5MjcwODQxODEzKStjKigtMjEuODYxMjIxNDc0NjM2MDUqYy0xODkuNDgxODA4MzU5MjI3NDcpO2FbaSsxXT0yNTUrbiooOC44NDEwNDE0MjIwMzYxNDkqbis2MC4xMTgwMjcwNDU1OTczNjYqcys2Ljg3MTQyNTU5MjA0OTAwNypvKzMxLjE1OTEwMDEzMDA1NTkyMipjLTc5LjI5NzA4NDQ4MTY1NDgpK3MqKC0xNS4zMTAzNjEzMDY5Njc4MTcqcysxNy41NzUyNTEyNjExMDk0ODIqbysxMzEuMzUyNTA5MTI0OTM5NzYqYy0xOTAuOTQ1MzMwMjU4ODk1MSkrbyooNC40NDQzMzkxMDI4NTI3Mzkqbys5Ljg2MzI4NjE0OTM0MDUqYy0yNC44Njc0MTU4MjU1NTg3OCkrYyooLTIwLjczNzMyNTQ3MTE4MTAzNCpjLTE4Ny44MDQ1MzcwOTcxOTU3OCk7YVtpKzJdPTI1NStuKiguODg0MjUyMjQzMDAwMzI5NipuKzguMDc4Njc3NTAzMTEyOTI4KnMrMzAuODk5NzgzMDk3MDM3Mjkqby0uMjM4ODMyMzg2ODkxNzg5MzQqYy0xNC4xODM1NzY3OTk2NzMyODYpK3MqKDEwLjQ5NTkzMjczNDMyMDcyKnMrNjMuMDIzNzg0OTQ3NTQwNTIqbys1MC42MDY5NTc2NTYzNjA3MzQqYy0xMTIuMjM4ODQyNTM3MTkyNDgpK28qKC4wMzI5NjA0MTExNDg3MzIxNypvKzExNS42MDM4NDQ0OTY0NjY0MSpjLTE5My41ODIwOTM1Njg2MTUwNSkrYyooLTIyLjMzODE2ODA3MzA5ODg2KmMtMTgwLjEyNjEzOTc0NzA4MzY3KX1yZXR1cm4gY2xhc3MgRGV2aWNlQ215a0NTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VDTVlLIiw0KX1nZXRSZ2JJdGVtKGUsdCxyLGEpe2NvbnZlcnRUb1JnYihlLHQsMSxyLGEpfWdldFJnYkJ1ZmZlcihlLHQscixhLGksbixzKXtjb25zdCBvPTEvKCgxPDxuKS0xKTtmb3IobGV0IG49MDtuPHI7bisrKXtjb252ZXJ0VG9SZ2IoZSx0LG8sYSxpKTt0Kz00O2krPTMrc319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUvNCooMyt0KXwwfX19KCksbz1mdW5jdGlvbiBDYWxHcmF5Q1NDbG9zdXJlKCl7ZnVuY3Rpb24gY29udmVydFRvUmdiKGUsdCxyLGEsaSxuKXtjb25zdCBzPSh0W3JdKm4pKiplLkcsbz1lLllXKnMsYz1NYXRoLm1heCgyOTUuOCpvKiouMzMzMzMzMzMzMzMzMzMzMy00MC44LDApO2FbaV09YzthW2krMV09YzthW2krMl09Y31yZXR1cm4gY2xhc3MgQ2FsR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoIkNhbEdyYXkiLDEpO2lmKCFlKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsR3JheSIpO3Q9dHx8WzAsMCwwXTtyPXJ8fDE7dGhpcy5YVz1lWzBdO3RoaXMuWVc9ZVsxXTt0aGlzLlpXPWVbMl07dGhpcy5YQj10WzBdO3RoaXMuWUI9dFsxXTt0aGlzLlpCPXRbMl07dGhpcy5HPXI7aWYodGhpcy5YVzwwfHx0aGlzLlpXPDB8fDEhPT10aGlzLllXKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgIit0aGlzLm5hbWUrIiwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7aWYodGhpcy5YQjwwfHx0aGlzLllCPDB8fHRoaXMuWkI8MCl7KDAsYS5pbmZvKShgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApO3RoaXMuWEI9dGhpcy5ZQj10aGlzLlpCPTB9MD09PXRoaXMuWEImJjA9PT10aGlzLllCJiYwPT09dGhpcy5aQnx8KDAsYS53YXJuKShgJHt0aGlzLm5hbWV9LCBCbGFja1BvaW50OiBYQjogJHt0aGlzLlhCfSwgWUI6ICR7dGhpcy5ZQn0sIFpCOiAke3RoaXMuWkJ9LCBvbmx5IGRlZmF1bHQgdmFsdWVzIGFyZSBzdXBwb3J0ZWQuYCk7aWYodGhpcy5HPDEpeygwLGEuaW5mbykoYEludmFsaWQgR2FtbWE6ICR7dGhpcy5HfSBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTt0aGlzLkc9MX19Z2V0UmdiSXRlbShlLHQscixhKXtjb252ZXJ0VG9SZ2IodGhpcyxlLHQscixhLDEpfWdldFJnYkJ1ZmZlcihlLHQscixhLGksbixzKXtjb25zdCBvPTEvKCgxPDxuKS0xKTtmb3IobGV0IG49MDtuPHI7KytuKXtjb252ZXJ0VG9SZ2IodGhpcyxlLHQsYSxpLG8pO3QrPTE7aSs9MytzfX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KX19fSgpLGM9ZnVuY3Rpb24gQ2FsUkdCQ1NDbG9zdXJlKCl7Y29uc3QgZT1uZXcgRmxvYXQzMkFycmF5KFsuODk1MSwuMjY2NCwtLjE2MTQsLS43NTAyLDEuNzEzNSwuMDM2NywuMDM4OSwtLjA2ODUsMS4wMjk2XSksdD1uZXcgRmxvYXQzMkFycmF5KFsuOTg2OTkyOSwtLjE0NzA1NDMsLjE1OTk2MjcsLjQzMjMwNTMsLjUxODM2MDMsLjA0OTI5MTIsLS4wMDg1Mjg3LC4wNDAwNDI4LC45Njg0ODY3XSkscj1uZXcgRmxvYXQzMkFycmF5KFszLjI0MDQ1NDIsLTEuNTM3MTM4NSwtLjQ5ODUzMTQsLS45NjkyNjYsMS44NzYwMTA4LC4wNDE1NTYsLjA1NTY0MzQsLS4yMDQwMjU5LDEuMDU3MjI1Ml0pLGk9bmV3IEZsb2F0MzJBcnJheShbMSwxLDFdKSxuPW5ldyBGbG9hdDMyQXJyYXkoMykscz1uZXcgRmxvYXQzMkFycmF5KDMpLG89bmV3IEZsb2F0MzJBcnJheSgzKTtmdW5jdGlvbiBtYXRyaXhQcm9kdWN0KGUsdCxyKXtyWzBdPWVbMF0qdFswXStlWzFdKnRbMV0rZVsyXSp0WzJdO3JbMV09ZVszXSp0WzBdK2VbNF0qdFsxXStlWzVdKnRbMl07clsyXT1lWzZdKnRbMF0rZVs3XSp0WzFdK2VbOF0qdFsyXX1mdW5jdGlvbiBzUkdCVHJhbnNmZXJGdW5jdGlvbihlKXtyZXR1cm4gZTw9LjAwMzEzMDg/YWRqdXN0VG9SYW5nZSgwLDEsMTIuOTIqZSk6ZT49Ljk5NTU0NTI1PzE6YWRqdXN0VG9SYW5nZSgwLDEsMS4wNTUqZSoqKDEvMi40KS0uMDU1KX1mdW5jdGlvbiBhZGp1c3RUb1JhbmdlKGUsdCxyKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbih0LHIpKX1mdW5jdGlvbiBkZWNvZGVMKGUpe3JldHVybiBlPDA/LWRlY29kZUwoLWUpOmU+OD8oKGUrMTYpLzExNikqKjM6ZSooKDI0LzExNikqKjMvOCl9ZnVuY3Rpb24gY29udmVydFRvUmdiKGEsYyxsLGgsdSxkKXtjb25zdCBmPWFkanVzdFRvUmFuZ2UoMCwxLGNbbF0qZCksZz1hZGp1c3RUb1JhbmdlKDAsMSxjW2wrMV0qZCksbT1hZGp1c3RUb1JhbmdlKDAsMSxjW2wrMl0qZCkscD0xPT09Zj8xOmYqKmEuR1IsYj0xPT09Zz8xOmcqKmEuR0cseT0xPT09bT8xOm0qKmEuR0Isdj1hLk1YQSpwK2EuTVhCKmIrYS5NWEMqeSx3PWEuTVlBKnArYS5NWUIqYithLk1ZQyp5LGs9YS5NWkEqcCthLk1aQipiK2EuTVpDKnksUz1zO1NbMF09djtTWzFdPXc7U1syXT1rO2NvbnN0IEM9bzshZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRmxhdChyLGEsaSl7aWYoMT09PXJbMF0mJjE9PT1yWzJdKXtpWzBdPWFbMF07aVsxXT1hWzFdO2lbMl09YVsyXTtyZXR1cm59Y29uc3Qgcz1pO21hdHJpeFByb2R1Y3QoZSxhLHMpO2NvbnN0IG89bjshZnVuY3Rpb24gY29udmVydFRvRmxhdChlLHQscil7clswXT0xKnRbMF0vZVswXTtyWzFdPTEqdFsxXS9lWzFdO3JbMl09MSp0WzJdL2VbMl19KHIscyxvKTttYXRyaXhQcm9kdWN0KHQsbyxpKX0oYS53aGl0ZVBvaW50LFMsQyk7Y29uc3QgeD1zOyFmdW5jdGlvbiBjb21wZW5zYXRlQmxhY2tQb2ludChlLHQscil7aWYoMD09PWVbMF0mJjA9PT1lWzFdJiYwPT09ZVsyXSl7clswXT10WzBdO3JbMV09dFsxXTtyWzJdPXRbMl07cmV0dXJufWNvbnN0IGE9ZGVjb2RlTCgwKSxpPSgxLWEpLygxLWRlY29kZUwoZVswXSkpLG49MS1pLHM9KDEtYSkvKDEtZGVjb2RlTChlWzFdKSksbz0xLXMsYz0oMS1hKS8oMS1kZWNvZGVMKGVbMl0pKSxsPTEtYztyWzBdPXRbMF0qaStuO3JbMV09dFsxXSpzK287clsyXT10WzJdKmMrbH0oYS5ibGFja1BvaW50LEMseCk7Y29uc3QgQT1vOyFmdW5jdGlvbiBub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUocixhLGkpe2NvbnN0IHM9aTttYXRyaXhQcm9kdWN0KGUsYSxzKTtjb25zdCBvPW47IWZ1bmN0aW9uIGNvbnZlcnRUb0Q2NShlLHQscil7clswXT0uOTUwNDcqdFswXS9lWzBdO3JbMV09MSp0WzFdL2VbMV07clsyXT0xLjA4ODgzKnRbMl0vZVsyXX0ocixzLG8pO21hdHJpeFByb2R1Y3QodCxvLGkpfShpLHgsQSk7Y29uc3QgVD1zO21hdHJpeFByb2R1Y3QocixBLFQpO2hbdV09MjU1KnNSR0JUcmFuc2ZlckZ1bmN0aW9uKFRbMF0pO2hbdSsxXT0yNTUqc1JHQlRyYW5zZmVyRnVuY3Rpb24oVFsxXSk7aFt1KzJdPTI1NSpzUkdCVHJhbnNmZXJGdW5jdGlvbihUWzJdKX1yZXR1cm4gY2xhc3MgQ2FsUkdCQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKGUsdCxyLGkpe3N1cGVyKCJDYWxSR0IiLDMpO2lmKCFlKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsUkdCIik7dD10fHxuZXcgRmxvYXQzMkFycmF5KDMpO3I9cnx8bmV3IEZsb2F0MzJBcnJheShbMSwxLDFdKTtpPWl8fG5ldyBGbG9hdDMyQXJyYXkoWzEsMCwwLDAsMSwwLDAsMCwxXSk7Y29uc3Qgbj1lWzBdLHM9ZVsxXSxvPWVbMl07dGhpcy53aGl0ZVBvaW50PWU7Y29uc3QgYz10WzBdLGw9dFsxXSxoPXRbMl07dGhpcy5ibGFja1BvaW50PXQ7dGhpcy5HUj1yWzBdO3RoaXMuR0c9clsxXTt0aGlzLkdCPXJbMl07dGhpcy5NWEE9aVswXTt0aGlzLk1ZQT1pWzFdO3RoaXMuTVpBPWlbMl07dGhpcy5NWEI9aVszXTt0aGlzLk1ZQj1pWzRdO3RoaXMuTVpCPWlbNV07dGhpcy5NWEM9aVs2XTt0aGlzLk1ZQz1pWzddO3RoaXMuTVpDPWlbOF07aWYobjwwfHxvPDB8fDEhPT1zKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgIit0aGlzLm5hbWUrIiwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7aWYoYzwwfHxsPDB8fGg8MCl7KDAsYS5pbmZvKShgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0gWyR7Y30sICR7bH0sICR7aH1dLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTt0aGlzLmJsYWNrUG9pbnQ9bmV3IEZsb2F0MzJBcnJheSgzKX1pZih0aGlzLkdSPDB8fHRoaXMuR0c8MHx8dGhpcy5HQjwwKXsoMCxhLmluZm8pKGBJbnZhbGlkIEdhbW1hIFske3RoaXMuR1J9LCAke3RoaXMuR0d9LCAke3RoaXMuR0J9XSBmb3IgYCt0aGlzLm5hbWUrIiwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIik7dGhpcy5HUj10aGlzLkdHPXRoaXMuR0I9MX19Z2V0UmdiSXRlbShlLHQscixhKXtjb252ZXJ0VG9SZ2IodGhpcyxlLHQscixhLDEpfWdldFJnYkJ1ZmZlcihlLHQscixhLGksbixzKXtjb25zdCBvPTEvKCgxPDxuKS0xKTtmb3IobGV0IG49MDtuPHI7KytuKXtjb252ZXJ0VG9SZ2IodGhpcyxlLHQsYSxpLG8pO3QrPTM7aSs9MytzfX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KS8zfDB9fX0oKSxsPWZ1bmN0aW9uIExhYkNTQ2xvc3VyZSgpe2Z1bmN0aW9uIGZuX2coZSl7bGV0IHQ7dD1lPj02LzI5P2UqZSplOjEwOC84NDEqKGUtNC8yOSk7cmV0dXJuIHR9ZnVuY3Rpb24gZGVjb2RlKGUsdCxyLGEpe3JldHVybiByK2UqKGEtcikvdH1mdW5jdGlvbiBjb252ZXJ0VG9SZ2IoZSx0LHIsYSxpLG4pe2xldCBzPXRbcl0sbz10W3IrMV0sYz10W3IrMl07aWYoITEhPT1hKXtzPWRlY29kZShzLGEsMCwxMDApO289ZGVjb2RlKG8sYSxlLmFtaW4sZS5hbWF4KTtjPWRlY29kZShjLGEsZS5ibWluLGUuYm1heCl9bz5lLmFtYXg/bz1lLmFtYXg6bzxlLmFtaW4mJihvPWUuYW1pbik7Yz5lLmJtYXg/Yz1lLmJtYXg6YzxlLmJtaW4mJihjPWUuYm1pbik7Y29uc3QgbD0ocysxNikvMTE2LGg9bCtvLzUwMCx1PWwtYy8yMDAsZD1lLlhXKmZuX2coaCksZj1lLllXKmZuX2cobCksZz1lLlpXKmZuX2codSk7bGV0IG0scCxiO2lmKGUuWlc8MSl7bT0zLjEzMzkqZCstMS42MTcqZistLjQ5MDYqZztwPS0uOTc4NSpkKzEuOTE2KmYrLjAzMzMqZztiPS4wNzIqZCstLjIyOSpmKzEuNDA1NypnfWVsc2V7bT0zLjI0MDYqZCstMS41MzcyKmYrLS40OTg2Kmc7cD0tLjk2ODkqZCsxLjg3NTgqZisuMDQxNSpnO2I9LjA1NTcqZCstLjIwNCpmKzEuMDU3Kmd9aVtuXT0yNTUqTWF0aC5zcXJ0KG0pO2lbbisxXT0yNTUqTWF0aC5zcXJ0KHApO2lbbisyXT0yNTUqTWF0aC5zcXJ0KGIpfXJldHVybiBjbGFzcyBMYWJDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKCJMYWIiLDMpO2lmKCFlKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgTGFiIik7dD10fHxbMCwwLDBdO3I9cnx8Wy0xMDAsMTAwLC0xMDAsMTAwXTt0aGlzLlhXPWVbMF07dGhpcy5ZVz1lWzFdO3RoaXMuWlc9ZVsyXTt0aGlzLmFtaW49clswXTt0aGlzLmFtYXg9clsxXTt0aGlzLmJtaW49clsyXTt0aGlzLmJtYXg9clszXTt0aGlzLlhCPXRbMF07dGhpcy5ZQj10WzFdO3RoaXMuWkI9dFsyXTtpZih0aGlzLlhXPDB8fHRoaXMuWlc8MHx8MSE9PXRoaXMuWVcpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzLCBubyBmYWxsYmFjayBhdmFpbGFibGUiKTtpZih0aGlzLlhCPDB8fHRoaXMuWUI8MHx8dGhpcy5aQjwwKXsoMCxhLmluZm8pKCJJbnZhbGlkIEJsYWNrUG9pbnQsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0Iik7dGhpcy5YQj10aGlzLllCPXRoaXMuWkI9MH1pZih0aGlzLmFtaW4+dGhpcy5hbWF4fHx0aGlzLmJtaW4+dGhpcy5ibWF4KXsoMCxhLmluZm8pKCJJbnZhbGlkIFJhbmdlLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdHMiKTt0aGlzLmFtaW49LTEwMDt0aGlzLmFtYXg9MTAwO3RoaXMuYm1pbj0tMTAwO3RoaXMuYm1heD0xMDB9fWdldFJnYkl0ZW0oZSx0LHIsYSl7Y29udmVydFRvUmdiKHRoaXMsZSx0LCExLHIsYSl9Z2V0UmdiQnVmZmVyKGUsdCxyLGEsaSxuLHMpe2NvbnN0IG89KDE8PG4pLTE7Zm9yKGxldCBuPTA7bjxyO24rKyl7Y29udmVydFRvUmdiKHRoaXMsZSx0LG8sYSxpKTt0Kz0zO2krPTMrc319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfWlzRGVmYXVsdERlY29kZShlLHQpe3JldHVybiEwfWdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywidXNlc1plcm9Ub09uZVJhbmdlIiwhMSl9fX0oKX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5HbG9iYWxJbWFnZUNhY2hlPXQuTG9jYWxHU3RhdGVDYWNoZT10LkxvY2FsRnVuY3Rpb25DYWNoZT10LkxvY2FsQ29sb3JTcGFjZUNhY2hlPXQuTG9jYWxJbWFnZUNhY2hlPXZvaWQgMDt2YXIgYT1yKDIpLGk9cig1KTtjbGFzcyBCYXNlTG9jYWxDYWNoZXtjb25zdHJ1Y3RvcihlKXt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZUxvY2FsQ2FjaGUmJigwLGEudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlTG9jYWxDYWNoZS4iKTtpZighZXx8IWUub25seVJlZnMpe3RoaXMuX25hbWVSZWZNYXA9bmV3IE1hcDt0aGlzLl9pbWFnZU1hcD1uZXcgTWFwfXRoaXMuX2ltYWdlQ2FjaGU9bmV3IGkuUmVmU2V0Q2FjaGV9Z2V0QnlOYW1lKGUpe2NvbnN0IHQ9dGhpcy5fbmFtZVJlZk1hcC5nZXQoZSk7cmV0dXJuIHQ/dGhpcy5nZXRCeVJlZih0KTp0aGlzLl9pbWFnZU1hcC5nZXQoZSl8fG51bGx9Z2V0QnlSZWYoZSl7cmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KGUpfHxudWxsfXNldChlLHQscil7KDAsYS51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgc2V0YCBjYWxsZWQuIil9fXQuTG9jYWxJbWFnZUNhY2hlPWNsYXNzIExvY2FsSW1hZ2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hle3NldChlLHQ9bnVsbCxyKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7aWYodCl7aWYodGhpcy5faW1hZ2VDYWNoZS5oYXModCkpcmV0dXJuO3RoaXMuX25hbWVSZWZNYXAuc2V0KGUsdCk7dGhpcy5faW1hZ2VDYWNoZS5wdXQodCxyKX1lbHNlIHRoaXMuX2ltYWdlTWFwLmhhcyhlKXx8dGhpcy5faW1hZ2VNYXAuc2V0KGUscil9fTt0LkxvY2FsQ29sb3JTcGFjZUNhY2hlPWNsYXNzIExvY2FsQ29sb3JTcGFjZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGV7c2V0KGU9bnVsbCx0PW51bGwscil7aWYoIWUmJiF0KXRocm93IG5ldyBFcnJvcignTG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFuZC9vciAicmVmIiBhcmd1bWVudC4nKTtpZih0KXtpZih0aGlzLl9pbWFnZUNhY2hlLmhhcyh0KSlyZXR1cm47ZSYmdGhpcy5fbmFtZVJlZk1hcC5zZXQoZSx0KTt0aGlzLl9pbWFnZUNhY2hlLnB1dCh0LHIpfWVsc2UgdGhpcy5faW1hZ2VNYXAuaGFzKGUpfHx0aGlzLl9pbWFnZU1hcC5zZXQoZSxyKX19O3QuTG9jYWxGdW5jdGlvbkNhY2hlPWNsYXNzIExvY2FsRnVuY3Rpb25DYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hle2NvbnN0cnVjdG9yKGUpe3N1cGVyKHtvbmx5UmVmczohMH0pfWdldEJ5TmFtZShlKXsoMCxhLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGBnZXRCeU5hbWVgIG1ldGhvZC4iKX1zZXQoZT1udWxsLHQscil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCdMb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXModCl8fHRoaXMuX2ltYWdlQ2FjaGUucHV0KHQscil9fTt0LkxvY2FsR1N0YXRlQ2FjaGU9Y2xhc3MgTG9jYWxHU3RhdGVDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hle3NldChlLHQ9bnVsbCxyKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsR1N0YXRlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFyZ3VtZW50LicpO2lmKHQpe2lmKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHQpKXJldHVybjt0aGlzLl9uYW1lUmVmTWFwLnNldChlLHQpO3RoaXMuX2ltYWdlQ2FjaGUucHV0KHQscil9ZWxzZSB0aGlzLl9pbWFnZU1hcC5oYXMoZSl8fHRoaXMuX2ltYWdlTWFwLnNldChlLHIpfX07Y2xhc3MgR2xvYmFsSW1hZ2VDYWNoZXtzdGF0aWMgZ2V0IE5VTV9QQUdFU19USFJFU0hPTEQoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiTlVNX1BBR0VTX1RIUkVTSE9MRCIsMil9c3RhdGljIGdldCBNQVhfSU1BR0VTX1RPX0NBQ0hFKCl7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIk1BWF9JTUFHRVNfVE9fQ0FDSEUiLDEwKX1jb25zdHJ1Y3Rvcigpe3RoaXMuX3JlZkNhY2hlPW5ldyBpLlJlZlNldENhY2hlO3RoaXMuX2ltYWdlQ2FjaGU9bmV3IGkuUmVmU2V0Q2FjaGV9c2hvdWxkQ2FjaGUoZSx0KXtjb25zdCByPXRoaXMuX3JlZkNhY2hlLmdldChlKTtyZXR1cm4hKChyP3Iuc2l6ZSsoci5oYXModCk/MDoxKToxKTxHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpJiYhKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhlKSYmdGhpcy5faW1hZ2VDYWNoZS5zaXplPj1HbG9iYWxJbWFnZUNhY2hlLk1BWF9JTUFHRVNfVE9fQ0FDSEUpfWFkZFBhZ2VJbmRleChlLHQpe2xldCByPXRoaXMuX3JlZkNhY2hlLmdldChlKTtpZighcil7cj1uZXcgU2V0O3RoaXMuX3JlZkNhY2hlLnB1dChlLHIpfXIuYWRkKHQpfWdldERhdGEoZSx0KXtjb25zdCByPXRoaXMuX3JlZkNhY2hlLmdldChlKTtpZighcilyZXR1cm4gbnVsbDtpZihyLnNpemU8R2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKXJldHVybiBudWxsO2lmKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhlKSlyZXR1cm4gbnVsbDtyLmFkZCh0KTtyZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQoZSl9c2V0RGF0YShlLHQpe2lmKCF0aGlzLl9yZWZDYWNoZS5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBleHBlY3RlZCAiYWRkUGFnZUluZGV4IiB0byBoYXZlIGJlZW4gY2FsbGVkLicpO3RoaXMuX2ltYWdlQ2FjaGUuaGFzKGUpfHwodGhpcy5faW1hZ2VDYWNoZS5zaXplPj1HbG9iYWxJbWFnZUNhY2hlLk1BWF9JTUFHRVNfVE9fQ0FDSEU/KDAsYS5pbmZvKSgiR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gaWdub3JpbmcgaW1hZ2UgYWJvdmUgTUFYX0lNQUdFU19UT19DQUNIRS4iKTp0aGlzLl9pbWFnZUNhY2hlLnB1dChlLHQpKX1jbGVhcihlPSExKXtlfHx0aGlzLl9yZWZDYWNoZS5jbGVhcigpO3RoaXMuX2ltYWdlQ2FjaGUuY2xlYXIoKX19dC5HbG9iYWxJbWFnZUNhY2hlPUdsb2JhbEltYWdlQ2FjaGV9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuZ2V0UXVhZFBvaW50cz1nZXRRdWFkUG9pbnRzO3QuTWFya3VwQW5ub3RhdGlvbj10LkFubm90YXRpb25GYWN0b3J5PXQuQW5ub3RhdGlvbkJvcmRlclN0eWxlPXQuQW5ub3RhdGlvbj12b2lkIDA7dmFyIGE9cigyKSxpPXIoMTApLG49cig1KSxzPXIoMjMpLG89cig4KSxjPXIoMjYpLGw9cigxMiksaD1yKDI3KTt0LkFubm90YXRpb25GYWN0b3J5PWNsYXNzIEFubm90YXRpb25GYWN0b3J5e3N0YXRpYyBjcmVhdGUoZSx0LHIsYSl7cmV0dXJuIHIuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKS50aGVuKGk9PnIuZW5zdXJlKHRoaXMsIl9jcmVhdGUiLFtlLHQscixhLGldKSl9c3RhdGljIF9jcmVhdGUoZSx0LHIsaSxzKXtjb25zdCBjPWUuZmV0Y2hJZlJlZih0KTtpZighKDAsbi5pc0RpY3QpKGMpKXJldHVybjtjb25zdCBsPSgwLG4uaXNSZWYpKHQpP3QudG9TdHJpbmcoKToiYW5ub3RfIitpLmNyZWF0ZU9iaklkKCk7bGV0IGg9Yy5nZXQoIlN1YnR5cGUiKTtoPSgwLG4uaXNOYW1lKShoKT9oLm5hbWU6bnVsbDtjb25zdCB1PXt4cmVmOmUscmVmOnQsZGljdDpjLHN1YnR5cGU6aCxpZDpsLHBkZk1hbmFnZXI6cixhY3JvRm9ybTpzIGluc3RhbmNlb2Ygbi5EaWN0P3M6bi5EaWN0LmVtcHR5fTtzd2l0Y2goaCl7Y2FzZSJMaW5rIjpyZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uKHUpO2Nhc2UiVGV4dCI6cmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbih1KTtjYXNlIldpZGdldCI6bGV0IGU9KDAsby5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDpjLGtleToiRlQifSk7ZT0oMCxuLmlzTmFtZSkoZSk/ZS5uYW1lOm51bGw7c3dpdGNoKGUpe2Nhc2UiVHgiOnJldHVybiBuZXcgVGV4dFdpZGdldEFubm90YXRpb24odSk7Y2FzZSJCdG4iOnJldHVybiBuZXcgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbih1KTtjYXNlIkNoIjpyZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb24odSl9KDAsYS53YXJuKSgnVW5pbXBsZW1lbnRlZCB3aWRnZXQgZmllbGQgdHlwZSAiJytlKyciLCBmYWxsaW5nIGJhY2sgdG8gYmFzZSBmaWVsZCB0eXBlLicpO3JldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbih1KTtjYXNlIlBvcHVwIjpyZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbih1KTtjYXNlIkZyZWVUZXh0IjpyZXR1cm4gbmV3IEZyZWVUZXh0QW5ub3RhdGlvbih1KTtjYXNlIkxpbmUiOnJldHVybiBuZXcgTGluZUFubm90YXRpb24odSk7Y2FzZSJTcXVhcmUiOnJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbih1KTtjYXNlIkNpcmNsZSI6cmV0dXJuIG5ldyBDaXJjbGVBbm5vdGF0aW9uKHUpO2Nhc2UiUG9seUxpbmUiOnJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uKHUpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbih1KTtjYXNlIkNhcmV0IjpyZXR1cm4gbmV3IENhcmV0QW5ub3RhdGlvbih1KTtjYXNlIkluayI6cmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uKHUpO2Nhc2UiSGlnaGxpZ2h0IjpyZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb24odSk7Y2FzZSJVbmRlcmxpbmUiOnJldHVybiBuZXcgVW5kZXJsaW5lQW5ub3RhdGlvbih1KTtjYXNlIlNxdWlnZ2x5IjpyZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbih1KTtjYXNlIlN0cmlrZU91dCI6cmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uKHUpO2Nhc2UiU3RhbXAiOnJldHVybiBuZXcgU3RhbXBBbm5vdGF0aW9uKHUpO2Nhc2UiRmlsZUF0dGFjaG1lbnQiOnJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uKHUpO2RlZmF1bHQ6aD8oMCxhLndhcm4pKCdVbmltcGxlbWVudGVkIGFubm90YXRpb24gdHlwZSAiJytoKyciLCBmYWxsaW5nIGJhY2sgdG8gYmFzZSBhbm5vdGF0aW9uLicpOigwLGEud2FybikoIkFubm90YXRpb24gaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgL1N1YnR5cGUuIik7cmV0dXJuIG5ldyBBbm5vdGF0aW9uKHUpfX19O2Z1bmN0aW9uIGdldFF1YWRQb2ludHMoZSx0KXtpZighZS5oYXMoIlF1YWRQb2ludHMiKSlyZXR1cm4gbnVsbDtjb25zdCByPWUuZ2V0QXJyYXkoIlF1YWRQb2ludHMiKTtpZighQXJyYXkuaXNBcnJheShyKXx8ci5sZW5ndGglOD4wKXJldHVybiBudWxsO2NvbnN0IGE9W107Zm9yKGxldCBlPTAsaT1yLmxlbmd0aC84O2U8aTtlKyspe2EucHVzaChbXSk7Zm9yKGxldCBpPTgqZSxuPTgqZSs4O2k8bjtpKz0yKXtjb25zdCBuPXJbaV0scz1yW2krMV07aWYobjx0WzBdfHxuPnRbMl18fHM8dFsxXXx8cz50WzNdKXJldHVybiBudWxsO2FbZV0ucHVzaCh7eDpuLHk6c30pfX1yZXR1cm4gYX1mdW5jdGlvbiBnZXRUcmFuc2Zvcm1NYXRyaXgoZSx0LHIpe2NvbnN0W2ksbixzLG9dPWEuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LHIpO2lmKGk9PT1zfHxuPT09bylyZXR1cm5bMSwwLDAsMSxlWzBdLGVbMV1dO2NvbnN0IGM9KGVbMl0tZVswXSkvKHMtaSksbD0oZVszXS1lWzFdKS8oby1uKTtyZXR1cm5bYywwLDAsbCxlWzBdLWkqYyxlWzFdLW4qbF19Y2xhc3MgQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtjb25zdCB0PWUuZGljdDt0aGlzLnNldENvbnRlbnRzKHQuZ2V0KCJDb250ZW50cyIpKTt0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUodC5nZXQoIk0iKSk7dGhpcy5zZXRGbGFncyh0LmdldCgiRiIpKTt0aGlzLnNldFJlY3RhbmdsZSh0LmdldEFycmF5KCJSZWN0IikpO3RoaXMuc2V0Q29sb3IodC5nZXRBcnJheSgiQyIpKTt0aGlzLnNldEJvcmRlclN0eWxlKHQpO3RoaXMuc2V0QXBwZWFyYW5jZSh0KTt0aGlzLmRhdGE9e2Fubm90YXRpb25GbGFnczp0aGlzLmZsYWdzLGJvcmRlclN0eWxlOnRoaXMuYm9yZGVyU3R5bGUsY29sb3I6dGhpcy5jb2xvcixjb250ZW50czp0aGlzLmNvbnRlbnRzLGhhc0FwcGVhcmFuY2U6ISF0aGlzLmFwcGVhcmFuY2UsaWQ6ZS5pZCxtb2RpZmljYXRpb25EYXRlOnRoaXMubW9kaWZpY2F0aW9uRGF0ZSxyZWN0OnRoaXMucmVjdGFuZ2xlLHN1YnR5cGU6ZS5zdWJ0eXBlfX1faGFzRmxhZyhlLHQpe3JldHVybiEhKGUmdCl9X2lzVmlld2FibGUoZSl7cmV0dXJuIXRoaXMuX2hhc0ZsYWcoZSxhLkFubm90YXRpb25GbGFnLklOVklTSUJMRSkmJiF0aGlzLl9oYXNGbGFnKGUsYS5Bbm5vdGF0aW9uRmxhZy5ISURERU4pJiYhdGhpcy5faGFzRmxhZyhlLGEuQW5ub3RhdGlvbkZsYWcuTk9WSUVXKX1faXNQcmludGFibGUoZSl7cmV0dXJuIHRoaXMuX2hhc0ZsYWcoZSxhLkFubm90YXRpb25GbGFnLlBSSU5UKSYmIXRoaXMuX2hhc0ZsYWcoZSxhLkFubm90YXRpb25GbGFnLklOVklTSUJMRSkmJiF0aGlzLl9oYXNGbGFnKGUsYS5Bbm5vdGF0aW9uRmxhZy5ISURERU4pfWdldCB2aWV3YWJsZSgpe3JldHVybiAwPT09dGhpcy5mbGFnc3x8dGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKX1nZXQgcHJpbnRhYmxlKCl7cmV0dXJuIDAhPT10aGlzLmZsYWdzJiZ0aGlzLl9pc1ByaW50YWJsZSh0aGlzLmZsYWdzKX1zZXRDb250ZW50cyhlKXt0aGlzLmNvbnRlbnRzPSgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGV8fCIiKX1zZXRNb2RpZmljYXRpb25EYXRlKGUpe3RoaXMubW9kaWZpY2F0aW9uRGF0ZT0oMCxhLmlzU3RyaW5nKShlKT9lOm51bGx9c2V0RmxhZ3MoZSl7dGhpcy5mbGFncz1OdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPjA/ZTowfWhhc0ZsYWcoZSl7cmV0dXJuIHRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncyxlKX1zZXRSZWN0YW5nbGUoZSl7QXJyYXkuaXNBcnJheShlKSYmND09PWUubGVuZ3RoP3RoaXMucmVjdGFuZ2xlPWEuVXRpbC5ub3JtYWxpemVSZWN0KGUpOnRoaXMucmVjdGFuZ2xlPVswLDAsMCwwXX1zZXRDb2xvcihlKXtjb25zdCB0PW5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtpZihBcnJheS5pc0FycmF5KGUpKXN3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnRoaXMuY29sb3I9bnVsbDticmVhaztjYXNlIDE6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2JJdGVtKGUsMCx0LDApO3RoaXMuY29sb3I9dDticmVhaztjYXNlIDM6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYkl0ZW0oZSwwLHQsMCk7dGhpcy5jb2xvcj10O2JyZWFrO2Nhc2UgNDpzLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYkl0ZW0oZSwwLHQsMCk7dGhpcy5jb2xvcj10O2JyZWFrO2RlZmF1bHQ6dGhpcy5jb2xvcj10fWVsc2UgdGhpcy5jb2xvcj10fXNldEJvcmRlclN0eWxlKGUpe3RoaXMuYm9yZGVyU3R5bGU9bmV3IEFubm90YXRpb25Cb3JkZXJTdHlsZTtpZigoMCxuLmlzRGljdCkoZSkpaWYoZS5oYXMoIkJTIikpe2NvbnN0IHQ9ZS5nZXQoIkJTIikscj10LmdldCgiVHlwZSIpO2lmKCFyfHwoMCxuLmlzTmFtZSkociwiQm9yZGVyIikpe3RoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgodC5nZXQoIlciKSx0aGlzLnJlY3RhbmdsZSk7dGhpcy5ib3JkZXJTdHlsZS5zZXRTdHlsZSh0LmdldCgiUyIpKTt0aGlzLmJvcmRlclN0eWxlLnNldERhc2hBcnJheSh0LmdldEFycmF5KCJEIikpfX1lbHNlIGlmKGUuaGFzKCJCb3JkZXIiKSl7Y29uc3QgdD1lLmdldEFycmF5KCJCb3JkZXIiKTtpZihBcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aD49Myl7dGhpcy5ib3JkZXJTdHlsZS5zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHRbMF0pO3RoaXMuYm9yZGVyU3R5bGUuc2V0VmVydGljYWxDb3JuZXJSYWRpdXModFsxXSk7dGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aCh0WzJdLHRoaXMucmVjdGFuZ2xlKTs0PT09dC5sZW5ndGgmJnRoaXMuYm9yZGVyU3R5bGUuc2V0RGFzaEFycmF5KHRbM10pfX1lbHNlIHRoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgoMCl9c2V0QXBwZWFyYW5jZShlKXt0aGlzLmFwcGVhcmFuY2U9bnVsbDtjb25zdCB0PWUuZ2V0KCJBUCIpO2lmKCEoMCxuLmlzRGljdCkodCkpcmV0dXJuO2NvbnN0IHI9dC5nZXQoIk4iKTtpZigoMCxuLmlzU3RyZWFtKShyKSl7dGhpcy5hcHBlYXJhbmNlPXI7cmV0dXJufWlmKCEoMCxuLmlzRGljdCkocikpcmV0dXJuO2NvbnN0IGE9ZS5nZXQoIkFTIik7KDAsbi5pc05hbWUpKGEpJiZyLmhhcyhhLm5hbWUpJiYodGhpcy5hcHBlYXJhbmNlPXIuZ2V0KGEubmFtZSkpfWxvYWRSZXNvdXJjZXMoZSl7cmV0dXJuIHRoaXMuYXBwZWFyYW5jZS5kaWN0LmdldEFzeW5jKCJSZXNvdXJjZXMiKS50aGVuKHQ9PntpZighdClyZXR1cm47cmV0dXJuIG5ldyBpLk9iamVjdExvYWRlcih0LGUsdC54cmVmKS5sb2FkKCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKX0pfWdldE9wZXJhdG9yTGlzdChlLHQscixpKXtpZighdGhpcy5hcHBlYXJhbmNlKXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IGMuT3BlcmF0b3JMaXN0KTtjb25zdCBuPXRoaXMuYXBwZWFyYW5jZSxzPXRoaXMuZGF0YSxvPW4uZGljdCxsPXRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsIkNvbG9yU3BhY2UiLCJQYXR0ZXJuIiwiU2hhZGluZyIsIlhPYmplY3QiLCJGb250Il0pLGg9by5nZXRBcnJheSgiQkJveCIpfHxbMCwwLDEsMV0sdT1vLmdldEFycmF5KCJNYXRyaXgiKXx8WzEsMCwwLDEsMCwwXSxkPWdldFRyYW5zZm9ybU1hdHJpeChzLnJlY3QsaCx1KTtyZXR1cm4gbC50aGVuKHI9Pntjb25zdCBpPW5ldyBjLk9wZXJhdG9yTGlzdDtpLmFkZE9wKGEuT1BTLmJlZ2luQW5ub3RhdGlvbixbcy5yZWN0LGQsdV0pO3JldHVybiBlLmdldE9wZXJhdG9yTGlzdCh7c3RyZWFtOm4sdGFzazp0LHJlc291cmNlczpyLG9wZXJhdG9yTGlzdDppfSkudGhlbigoKT0+e2kuYWRkT3AoYS5PUFMuZW5kQW5ub3RhdGlvbixbXSk7bi5yZXNldCgpO3JldHVybiBpfSl9KX1hc3luYyBzYXZlKGUsdCxyKXtyZXR1cm4gbnVsbH19dC5Bbm5vdGF0aW9uPUFubm90YXRpb247Y2xhc3MgQW5ub3RhdGlvbkJvcmRlclN0eWxle2NvbnN0cnVjdG9yKCl7dGhpcy53aWR0aD0xO3RoaXMuc3R5bGU9YS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEO3RoaXMuZGFzaEFycmF5PVszXTt0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXM9MDt0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzPTB9c2V0V2lkdGgoZSx0PVswLDAsMCwwXSl7aWYoKDAsbi5pc05hbWUpKGUpKXRoaXMud2lkdGg9MDtlbHNlIGlmKE51bWJlci5pc0ludGVnZXIoZSkpe2lmKGU+MCl7Y29uc3Qgcj0odFsyXS10WzBdKS8yLGk9KHRbM10tdFsxXSkvMjtpZihyPjAmJmk+MCYmKGU+cnx8ZT5pKSl7KDAsYS53YXJuKSgiQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICIrZSk7ZT0xfX10aGlzLndpZHRoPWV9fXNldFN0eWxlKGUpe2lmKCgwLG4uaXNOYW1lKShlKSlzd2l0Y2goZS5uYW1lKXtjYXNlIlMiOnRoaXMuc3R5bGU9YS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEO2JyZWFrO2Nhc2UiRCI6dGhpcy5zdHlsZT1hLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuREFTSEVEO2JyZWFrO2Nhc2UiQiI6dGhpcy5zdHlsZT1hLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDticmVhaztjYXNlIkkiOnRoaXMuc3R5bGU9YS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUO2JyZWFrO2Nhc2UiVSI6dGhpcy5zdHlsZT1hLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FfX1zZXREYXNoQXJyYXkoZSl7aWYoQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg+MCl7bGV0IHQ9ITAscj0hMDtmb3IoY29uc3QgYSBvZiBlKXtpZighKCthPj0wKSl7dD0hMTticmVha31hPjAmJihyPSExKX10JiYhcj90aGlzLmRhc2hBcnJheT1lOnRoaXMud2lkdGg9MH1lbHNlIGUmJih0aGlzLndpZHRoPTApfXNldEhvcml6b250YWxDb3JuZXJSYWRpdXMoZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cz1lKX1zZXRWZXJ0aWNhbENvcm5lclJhZGl1cyhlKXtOdW1iZXIuaXNJbnRlZ2VyKGUpJiYodGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cz1lKX19dC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGU9QW5ub3RhdGlvbkJvcmRlclN0eWxlO2NsYXNzIE1hcmt1cEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0IHQ9ZS5kaWN0O2lmKHQuaGFzKCJJUlQiKSl7Y29uc3QgZT10LmdldFJhdygiSVJUIik7dGhpcy5kYXRhLmluUmVwbHlUbz0oMCxuLmlzUmVmKShlKT9lLnRvU3RyaW5nKCk6bnVsbDtjb25zdCByPXQuZ2V0KCJSVCIpO3RoaXMuZGF0YS5yZXBseVR5cGU9KDAsbi5pc05hbWUpKHIpP3IubmFtZTphLkFubm90YXRpb25SZXBseVR5cGUuUkVQTFl9aWYodGhpcy5kYXRhLnJlcGx5VHlwZT09PWEuQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCl7Y29uc3QgZT10LmdldCgiSVJUIik7dGhpcy5kYXRhLnRpdGxlPSgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUuZ2V0KCJUIil8fCIiKTt0aGlzLnNldENvbnRlbnRzKGUuZ2V0KCJDb250ZW50cyIpKTt0aGlzLmRhdGEuY29udGVudHM9dGhpcy5jb250ZW50cztpZihlLmhhcygiQ3JlYXRpb25EYXRlIikpe3RoaXMuc2V0Q3JlYXRpb25EYXRlKGUuZ2V0KCJDcmVhdGlvbkRhdGUiKSk7dGhpcy5kYXRhLmNyZWF0aW9uRGF0ZT10aGlzLmNyZWF0aW9uRGF0ZX1lbHNlIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGU9bnVsbDtpZihlLmhhcygiTSIpKXt0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUoZS5nZXQoIk0iKSk7dGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGU9dGhpcy5tb2RpZmljYXRpb25EYXRlfWVsc2UgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGU9bnVsbDt0aGlzLmRhdGEuaGFzUG9wdXA9ZS5oYXMoIlBvcHVwIik7aWYoZS5oYXMoIkMiKSl7dGhpcy5zZXRDb2xvcihlLmdldEFycmF5KCJDIikpO3RoaXMuZGF0YS5jb2xvcj10aGlzLmNvbG9yfWVsc2UgdGhpcy5kYXRhLmNvbG9yPW51bGx9ZWxzZXt0aGlzLmRhdGEudGl0bGU9KDAsYS5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIlQiKXx8IiIpO3RoaXMuc2V0Q3JlYXRpb25EYXRlKHQuZ2V0KCJDcmVhdGlvbkRhdGUiKSk7dGhpcy5kYXRhLmNyZWF0aW9uRGF0ZT10aGlzLmNyZWF0aW9uRGF0ZTt0aGlzLmRhdGEuaGFzUG9wdXA9dC5oYXMoIlBvcHVwIik7dC5oYXMoIkMiKXx8KHRoaXMuZGF0YS5jb2xvcj1udWxsKX19c2V0Q3JlYXRpb25EYXRlKGUpe3RoaXMuY3JlYXRpb25EYXRlPSgwLGEuaXNTdHJpbmcpKGUpP2U6bnVsbH19dC5NYXJrdXBBbm5vdGF0aW9uPU1hcmt1cEFubm90YXRpb247Y2xhc3MgV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7Y29uc3QgdD1lLmRpY3Qscj10aGlzLmRhdGE7dGhpcy5yZWY9ZS5yZWY7ci5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLldJREdFVDtyLmZpZWxkTmFtZT10aGlzLl9jb25zdHJ1Y3RGaWVsZE5hbWUodCk7Y29uc3QgaT0oMCxvLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJWIixnZXRBcnJheTohMH0pO3IuZmllbGRWYWx1ZT10aGlzLl9kZWNvZGVGb3JtVmFsdWUoaSk7ci5hbHRlcm5hdGl2ZVRleHQ9KDAsYS5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIlRVIil8fCIiKTtyLmRlZmF1bHRBcHBlYXJhbmNlPSgwLG8uZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dCxrZXk6IkRBIn0pfHxlLmFjcm9Gb3JtLmdldCgiREEiKXx8IiI7Y29uc3Qgcz0oMCxvLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJGVCJ9KTtyLmZpZWxkVHlwZT0oMCxuLmlzTmFtZSkocyk/cy5uYW1lOm51bGw7dGhpcy5maWVsZFJlc291cmNlcz0oMCxvLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJEUiJ9KXx8ZS5hY3JvRm9ybS5nZXQoIkRSIil8fG4uRGljdC5lbXB0eTtyLmZpZWxkRmxhZ3M9KDAsby5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDp0LGtleToiRmYifSk7KCFOdW1iZXIuaXNJbnRlZ2VyKHIuZmllbGRGbGFncyl8fHIuZmllbGRGbGFnczwwKSYmKHIuZmllbGRGbGFncz0wKTtyLnJlYWRPbmx5PXRoaXMuaGFzRmllbGRGbGFnKGEuQW5ub3RhdGlvbkZpZWxkRmxhZy5SRUFET05MWSk7aWYoIlNpZyI9PT1yLmZpZWxkVHlwZSl7ci5maWVsZFZhbHVlPW51bGw7dGhpcy5zZXRGbGFncyhhLkFubm90YXRpb25GbGFnLkhJRERFTil9fV9jb25zdHJ1Y3RGaWVsZE5hbWUoZSl7aWYoIWUuaGFzKCJUIikmJiFlLmhhcygiUGFyZW50IikpeygwLGEud2FybikoIlVua25vd24gZmllbGQgbmFtZSwgZmFsbGluZyBiYWNrIHRvIGVtcHR5IGZpZWxkIG5hbWUuIik7cmV0dXJuIiJ9aWYoIWUuaGFzKCJQYXJlbnQiKSlyZXR1cm4oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlLmdldCgiVCIpKTtjb25zdCB0PVtdO2UuaGFzKCJUIikmJnQudW5zaGlmdCgoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlLmdldCgiVCIpKSk7bGV0IHI9ZTtmb3IoO3IuaGFzKCJQYXJlbnQiKTspe3I9ci5nZXQoIlBhcmVudCIpO2lmKCEoMCxuLmlzRGljdCkocikpYnJlYWs7ci5oYXMoIlQiKSYmdC51bnNoaWZ0KCgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHIuZ2V0KCJUIikpKX1yZXR1cm4gdC5qb2luKCIuIil9X2RlY29kZUZvcm1WYWx1ZShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmZpbHRlcihlPT4oMCxhLmlzU3RyaW5nKShlKSkubWFwKGU9PigwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUpKTooMCxuLmlzTmFtZSkoZSk/KDAsYS5zdHJpbmdUb1BERlN0cmluZykoZS5uYW1lKTooMCxhLmlzU3RyaW5nKShlKT8oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlKTpudWxsfWhhc0ZpZWxkRmxhZyhlKXtyZXR1cm4hISh0aGlzLmRhdGEuZmllbGRGbGFncyZlKX1nZXRPcGVyYXRvckxpc3QoZSx0LHIsaSl7cmV0dXJuIHI/UHJvbWlzZS5yZXNvbHZlKG5ldyBjLk9wZXJhdG9yTGlzdCk6dGhpcy5faGFzVGV4dD90aGlzLl9nZXRBcHBlYXJhbmNlKGUsdCxpKS50aGVuKG49PntpZih0aGlzLmFwcGVhcmFuY2UmJm51bGw9PT1uKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsaSk7Y29uc3Qgcz1uZXcgYy5PcGVyYXRvckxpc3Q7aWYoIXRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZXx8bnVsbD09PW4pcmV0dXJuIHM7Y29uc3Qgbz1bMSwwLDAsMSwwLDBdLGg9WzAsMCx0aGlzLmRhdGEucmVjdFsyXS10aGlzLmRhdGEucmVjdFswXSx0aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXV0sdT1nZXRUcmFuc2Zvcm1NYXRyaXgodGhpcy5kYXRhLnJlY3QsaCxvKTtzLmFkZE9wKGEuT1BTLmJlZ2luQW5ub3RhdGlvbixbdGhpcy5kYXRhLnJlY3QsdSxvXSk7Y29uc3QgZD1uZXcgbC5TdHJpbmdTdHJlYW0obik7cmV0dXJuIGUuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06ZCx0YXNrOnQscmVzb3VyY2VzOnRoaXMuZmllbGRSZXNvdXJjZXMsb3BlcmF0b3JMaXN0OnN9KS50aGVuKChmdW5jdGlvbigpe3MuYWRkT3AoYS5PUFMuZW5kQW5ub3RhdGlvbixbXSk7cmV0dXJuIHN9KSl9KTpzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsaSl9YXN5bmMgc2F2ZShlLHQscil7aWYodGhpcy5kYXRhLmZpZWxkVmFsdWU9PT1yW3RoaXMuZGF0YS5pZF0pcmV0dXJuIG51bGw7bGV0IGk9YXdhaXQgdGhpcy5fZ2V0QXBwZWFyYW5jZShlLHQscik7aWYobnVsbD09PWkpcmV0dXJuIG51bGw7Y29uc3Qgcz1lLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7aWYoISgwLG4uaXNEaWN0KShzKSlyZXR1cm4gbnVsbDtjb25zdCBvPVswLDAsdGhpcy5kYXRhLnJlY3RbMl0tdGhpcy5kYXRhLnJlY3RbMF0sdGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV1dLGM9ZS54cmVmLmdldE5ld1JlZigpLGw9bmV3IG4uRGljdChlLnhyZWYpO2wuc2V0KCJOIixjKTtjb25zdCB1PXJbdGhpcy5kYXRhLmlkXSxkPWUueHJlZi5lbmNyeXB0O2xldCBmPW51bGwsZz1udWxsO2lmKGQpe2Y9ZC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbik7Zz1kLmNyZWF0ZUNpcGhlclRyYW5zZm9ybShjLm51bSxjLmdlbik7aT1nLmVuY3J5cHRTdHJpbmcoaSl9cy5zZXQoIlYiLHUpO3Muc2V0KCJBUCIsbCk7cy5zZXQoIk0iLCJEOiIrKDAsYS5nZXRNb2RpZmljYXRpb25EYXRlKSgpKTtjb25zdCBtPW5ldyBuLkRpY3QoZS54cmVmKTttLnNldCgiTGVuZ3RoIixpLmxlbmd0aCk7bS5zZXQoIlN1YnR5cGUiLG4uTmFtZS5nZXQoIkZvcm0iKSk7bS5zZXQoIlJlc291cmNlcyIsdGhpcy5maWVsZFJlc291cmNlcyk7bS5zZXQoIkJCb3giLG8pO2NvbnN0IHA9W2Ake3RoaXMucmVmLm51bX0gJHt0aGlzLnJlZi5nZW59IG9ialxuYF07KDAsaC53cml0ZURpY3QpKHMscCxmKTtwLnB1c2goIlxuZW5kb2JqXG4iKTtjb25zdCBiPVtgJHtjLm51bX0gJHtjLmdlbn0gb2JqXG5gXTsoMCxoLndyaXRlRGljdCkobSxiLGcpO2IucHVzaCgiIHN0cmVhbVxuIik7Yi5wdXNoKGkpO2IucHVzaCgiXG5lbmRzdHJlYW1cbmVuZG9ialxuIik7cmV0dXJuW3tyZWY6dGhpcy5yZWYsZGF0YTpwLmpvaW4oIiIpfSx7cmVmOmMsZGF0YTpiLmpvaW4oIiIpfV19YXN5bmMgX2dldEFwcGVhcmFuY2UoZSx0LHIpe2NvbnN0IGk9dGhpcy5oYXNGaWVsZEZsYWcoYS5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKTtpZighcnx8aSlyZXR1cm4gbnVsbDtjb25zdCBuPXJbdGhpcy5kYXRhLmlkXTtpZigiIj09PW4pcmV0dXJuIiI7Y29uc3Qgcz10aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXSxvPXRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLGM9YXdhaXQgdGhpcy5fZ2V0Rm9udERhdGEoZSx0KSxbbCxoXT1jO2xldCB1PWNbMl07dT10aGlzLl9jb21wdXRlRm9udFNpemUobCxoLHUscyk7bGV0IGQ9bC5kZXNjZW50O2lzTmFOKGQpJiYoZD0wKTtjb25zdCBmPTIrTWF0aC5hYnMoZCkqdSxnPXRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSxtPXRoaXMuZGF0YS50ZXh0QWxpZ25tZW50O2lmKHRoaXMuZGF0YS5jb21iKXJldHVybiB0aGlzLl9nZXRDb21iQXBwZWFyYW5jZShnLG4sbywyLGYpO2lmKHRoaXMuZGF0YS5tdWx0aUxpbmUpcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoZyxuLGwsdSxvLHMsbSwyLGYpO2lmKDA9PT1tfHxtPjIpcmV0dXJuIi9UeCBCTUMgcSBCVCAiK2crYCAxIDAgMCAxIDIgJHtmfSBUbSAoJHsoMCxhLmVzY2FwZVN0cmluZykobil9KSBUaiBFVCBRIEVNQ2A7cmV0dXJuIi9UeCBCTUMgcSBCVCAiK2crIiAxIDAgMCAxIDAgMCBUbSAiK3RoaXMuX3JlbmRlclRleHQobixsLHUsbyxtLDIsZikrIiBFVCBRIEVNQyJ9YXN5bmMgX2dldEZvbnREYXRhKGUsdCl7Y29uc3Qgcj1uZXcgYy5PcGVyYXRvckxpc3QsYT17Zm9udFNpemU6MCxmb250Om51bGwsZm9udE5hbWU6bnVsbCxjbG9uZSgpe3JldHVybiB0aGlzfX07YXdhaXQgZS5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpuZXcgbC5TdHJpbmdTdHJlYW0odGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlKSx0YXNrOnQscmVzb3VyY2VzOnRoaXMuZmllbGRSZXNvdXJjZXMsb3BlcmF0b3JMaXN0OnIsaW5pdGlhbFN0YXRlOmF9KTtyZXR1cm5bYS5mb250LGEuZm9udE5hbWUsYS5mb250U2l6ZV19X2NvbXB1dGVGb250U2l6ZShlLHQscixhKXtpZihudWxsPT09cnx8MD09PXIpe2NvbnN0IGk9LjcqKGUuY2hhcnNUb0dseXBocygiTSIsITApWzBdLndpZHRoLzFlMyk7cj1NYXRoLm1heCgxLE1hdGguZmxvb3IoYS8oMS41KmkpKSk7bGV0IG49bmV3IFJlZ0V4cChgLyR7dH1cXHMrWzAtOS5dK1xccytUZmApOy0xPT09dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlLnNlYXJjaChuKSYmKG49bmV3IFJlZ0V4cChgLyR7dH1cXHMrVGZgKSk7dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlPXRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZS5yZXBsYWNlKG4sYC8ke3R9ICR7cn0gVGZgKX1yZXR1cm4gcn1fcmVuZGVyVGV4dChlLHQscixpLG4scyxvKXtjb25zdCBjPXQuY2hhcnNUb0dseXBocyhlKSxsPXIvMWUzO2xldCBoLHU9MDtmb3IoY29uc3QgZSBvZiBjKXUrPWUud2lkdGgqbDtoPTE9PT1uPyhpLXUpLzI6Mj09PW4/aS11LXM6cztoPWgudG9GaXhlZCgyKTtyZXR1cm5gJHtofSAke289by50b0ZpeGVkKDIpfSBUZCAoJHsoMCxhLmVzY2FwZVN0cmluZykoZSl9KSBUamB9fWNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLl9oYXNUZXh0PSEwO2NvbnN0IHQ9ZS5kaWN0OygwLGEuaXNTdHJpbmcpKHRoaXMuZGF0YS5maWVsZFZhbHVlKXx8KHRoaXMuZGF0YS5maWVsZFZhbHVlPSIiKTtsZXQgcj0oMCxvLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJRIn0pOyghTnVtYmVyLmlzSW50ZWdlcihyKXx8cjwwfHxyPjIpJiYocj1udWxsKTt0aGlzLmRhdGEudGV4dEFsaWdubWVudD1yO2xldCBpPSgwLG8uZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dCxrZXk6Ik1heExlbiJ9KTsoIU51bWJlci5pc0ludGVnZXIoaSl8fGk8MCkmJihpPW51bGwpO3RoaXMuZGF0YS5tYXhMZW49aTt0aGlzLmRhdGEubXVsdGlMaW5lPXRoaXMuaGFzRmllbGRGbGFnKGEuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpO3RoaXMuZGF0YS5jb21iPXRoaXMuaGFzRmllbGRGbGFnKGEuQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSYmIXRoaXMuaGFzRmllbGRGbGFnKGEuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpJiYhdGhpcy5oYXNGaWVsZEZsYWcoYS5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSYmIXRoaXMuaGFzRmllbGRGbGFnKGEuQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSYmbnVsbCE9PXRoaXMuZGF0YS5tYXhMZW59X2dldENvbWJBcHBlYXJhbmNlKGUsdCxyLGksbil7Y29uc3Qgcz0oci90aGlzLmRhdGEubWF4TGVuKS50b0ZpeGVkKDIpLG89W107Zm9yKGNvbnN0IGUgb2YgdClvLnB1c2goYCgkeygwLGEuZXNjYXBlU3RyaW5nKShlKX0pIFRqYCk7cmV0dXJuIi9UeCBCTUMgcSBCVCAiK2UrYCAxIDAgMCAxICR7aX0gJHtufSBUbSAke28uam9pbihgICR7c30gMCBUZCBgKX0gRVQgUSBFTUNgfV9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKGUsdCxyLGEsaSxuLHMsbyxjKXtjb25zdCBsPXQuc3BsaXQoL1xyXG58XHJ8XG4vKSxoPVtdLHU9aS0yKm87Zm9yKGNvbnN0IGUgb2YgbCl7Y29uc3QgdD10aGlzLl9zcGxpdExpbmUoZSxyLGEsdSk7Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD0wPT09aC5sZW5ndGg/bzowO2gucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGUscixhLGkscyx0LC1hKSl9fXJldHVybiIvVHggQk1DIHEgQlQgIitlK2AgMSAwIDAgMSAwICR7bn0gVG0gJHtoLmpvaW4oIlxuIil9IEVUIFEgRU1DYH1fc3BsaXRMaW5lKGUsdCxyLGEpe2lmKGUubGVuZ3RoPD0xKXJldHVybltlXTtjb25zdCBpPXIvMWUzLG49dC5jaGFyc1RvR2x5cGhzKCIgIiwhMClbMF0ud2lkdGgqaSxzPVtdO2xldCBvPS0xLGM9MCxsPTA7Zm9yKGxldCByPTAsaD1lLmxlbmd0aDtyPGg7cisrKXtjb25zdCBoPWUuY2hhckF0KHIpO2lmKCIgIj09PWgpaWYobCtuPmEpe3MucHVzaChlLnN1YnN0cmluZyhjLHIpKTtjPXI7bD1uO289LTF9ZWxzZXtsKz1uO289cn1lbHNle2NvbnN0IG49dC5jaGFyc1RvR2x5cGhzKGgsITEpWzBdLndpZHRoKmk7aWYobCtuPmEpaWYoLTEhPT1vKXtzLnB1c2goZS5zdWJzdHJpbmcoYyxvKzEpKTtjPXI9bysxO289LTE7bD0wfWVsc2V7cy5wdXNoKGUuc3Vic3RyaW5nKGMscikpO2M9cjtsPW59ZWxzZSBsKz1ufX1jPGUubGVuZ3RoJiZzLnB1c2goZS5zdWJzdHJpbmcoYyxlLmxlbmd0aCkpO3JldHVybiBzfX1jbGFzcyBCdXR0b25XaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLmNoZWNrZWRBcHBlYXJhbmNlPW51bGw7dGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlPW51bGw7dGhpcy5kYXRhLmNoZWNrQm94PSF0aGlzLmhhc0ZpZWxkRmxhZyhhLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pJiYhdGhpcy5oYXNGaWVsZEZsYWcoYS5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO3RoaXMuZGF0YS5yYWRpb0J1dHRvbj10aGlzLmhhc0ZpZWxkRmxhZyhhLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pJiYhdGhpcy5oYXNGaWVsZEZsYWcoYS5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO3RoaXMuZGF0YS5wdXNoQnV0dG9uPXRoaXMuaGFzRmllbGRGbGFnKGEuQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKTt0aGlzLmRhdGEuY2hlY2tCb3g/dGhpcy5fcHJvY2Vzc0NoZWNrQm94KGUpOnRoaXMuZGF0YS5yYWRpb0J1dHRvbj90aGlzLl9wcm9jZXNzUmFkaW9CdXR0b24oZSk6dGhpcy5kYXRhLnB1c2hCdXR0b24/dGhpcy5fcHJvY2Vzc1B1c2hCdXR0b24oZSk6KDAsYS53YXJuKSgiSW52YWxpZCBmaWVsZCBmbGFncyBmb3IgYnV0dG9uIHdpZGdldCBhbm5vdGF0aW9uIil9Z2V0T3BlcmF0b3JMaXN0KGUsdCxyLGEpe2lmKHRoaXMuZGF0YS5wdXNoQnV0dG9uKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LCExLGEpO2lmKGEpe2xldCBpO2k9YVt0aGlzLmRhdGEuaWRdfHwhMT90aGlzLmNoZWNrZWRBcHBlYXJhbmNlOnRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTtpZihpKXtjb25zdCBuPXRoaXMuYXBwZWFyYW5jZTt0aGlzLmFwcGVhcmFuY2U9aTtjb25zdCBzPXN1cGVyLmdldE9wZXJhdG9yTGlzdChlLHQscixhKTt0aGlzLmFwcGVhcmFuY2U9bjtyZXR1cm4gc31yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBjLk9wZXJhdG9yTGlzdCl9cmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChlLHQscixhKX1hc3luYyBzYXZlKGUsdCxyKXtyZXR1cm4gdGhpcy5kYXRhLmNoZWNrQm94P3RoaXMuX3NhdmVDaGVja2JveChlLHQscik6dGhpcy5kYXRhLnJhZGlvQnV0dG9uP3RoaXMuX3NhdmVSYWRpb0J1dHRvbihlLHQscik6c3VwZXIuc2F2ZShlLHQscil9YXN5bmMgX3NhdmVDaGVja2JveChlLHQscil7Y29uc3QgaT10aGlzLmRhdGEuZmllbGRWYWx1ZSYmIk9mZiIhPT10aGlzLmRhdGEuZmllbGRWYWx1ZSxzPXJbdGhpcy5kYXRhLmlkXTtpZihpPT09cylyZXR1cm4gbnVsbDtjb25zdCBvPWUueHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTtpZighKDAsbi5pc0RpY3QpKG8pKXJldHVybiBudWxsO2NvbnN0IGM9bi5OYW1lLmdldChzP3RoaXMuZGF0YS5leHBvcnRWYWx1ZToiT2ZmIik7by5zZXQoIlYiLGMpO28uc2V0KCJBUyIsYyk7by5zZXQoIk0iLCJEOiIrKDAsYS5nZXRNb2RpZmljYXRpb25EYXRlKSgpKTtjb25zdCBsPWUueHJlZi5lbmNyeXB0O2xldCB1PW51bGw7bCYmKHU9bC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbikpO2NvbnN0IGQ9W2Ake3RoaXMucmVmLm51bX0gJHt0aGlzLnJlZi5nZW59IG9ialxuYF07KDAsaC53cml0ZURpY3QpKG8sZCx1KTtkLnB1c2goIlxuZW5kb2JqXG4iKTtyZXR1cm5be3JlZjp0aGlzLnJlZixkYXRhOmQuam9pbigiIil9XX1hc3luYyBfc2F2ZVJhZGlvQnV0dG9uKGUsdCxyKXtjb25zdCBpPXRoaXMuZGF0YS5maWVsZFZhbHVlPT09dGhpcy5kYXRhLmJ1dHRvblZhbHVlLHM9clt0aGlzLmRhdGEuaWRdO2lmKGk9PT1zKXJldHVybiBudWxsO2NvbnN0IG89ZS54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpO2lmKCEoMCxuLmlzRGljdCkobykpcmV0dXJuIG51bGw7Y29uc3QgYz1uLk5hbWUuZ2V0KHM/dGhpcy5kYXRhLmJ1dHRvblZhbHVlOiJPZmYiKTtsZXQgbD1udWxsO2NvbnN0IHU9ZS54cmVmLmVuY3J5cHQ7aWYocylpZigoMCxuLmlzUmVmKSh0aGlzLnBhcmVudCkpe2NvbnN0IHQ9ZS54cmVmLmZldGNoKHRoaXMucGFyZW50KTtsZXQgcj1udWxsO3UmJihyPXUuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucGFyZW50Lm51bSx0aGlzLnBhcmVudC5nZW4pKTt0LnNldCgiViIsYyk7bD1bYCR7dGhpcy5wYXJlbnQubnVtfSAke3RoaXMucGFyZW50Lmdlbn0gb2JqXG5gXTsoMCxoLndyaXRlRGljdCkodCxsLHIpO2wucHVzaCgiXG5lbmRvYmpcbiIpfWVsc2UoMCxuLmlzRGljdCkodGhpcy5wYXJlbnQpJiZ0aGlzLnBhcmVudC5zZXQoIlYiLGMpO28uc2V0KCJBUyIsYyk7by5zZXQoIk0iLCJEOiIrKDAsYS5nZXRNb2RpZmljYXRpb25EYXRlKSgpKTtsZXQgZD1udWxsO3UmJihkPXUuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucmVmLm51bSx0aGlzLnJlZi5nZW4pKTtjb25zdCBmPVtgJHt0aGlzLnJlZi5udW19ICR7dGhpcy5yZWYuZ2VufSBvYmpcbmBdOygwLGgud3JpdGVEaWN0KShvLGYsZCk7Zi5wdXNoKCJcbmVuZG9ialxuIik7Y29uc3QgZz1be3JlZjp0aGlzLnJlZixkYXRhOmYuam9pbigiIil9XTtudWxsIT09bCYmZy5wdXNoKHtyZWY6dGhpcy5wYXJlbnQsZGF0YTpsLmpvaW4oIiIpfSk7cmV0dXJuIGd9X3Byb2Nlc3NDaGVja0JveChlKXtjb25zdCB0PWUuZGljdC5nZXQoIkFQIik7aWYoISgwLG4uaXNEaWN0KSh0KSlyZXR1cm47Y29uc3Qgcj10LmdldCgiTiIpO2lmKCEoMCxuLmlzRGljdCkocikpcmV0dXJuO2NvbnN0IGE9ci5nZXRLZXlzKCk7YS5pbmNsdWRlcygiT2ZmIil8fGEucHVzaCgiT2ZmIik7aWYoMj09PWEubGVuZ3RoKXt0aGlzLmRhdGEuZXhwb3J0VmFsdWU9Ik9mZiI9PT1hWzBdP2FbMV06YVswXTt0aGlzLmNoZWNrZWRBcHBlYXJhbmNlPXIuZ2V0KHRoaXMuZGF0YS5leHBvcnRWYWx1ZSk7dGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlPXIuZ2V0KCJPZmYiKXx8bnVsbH19X3Byb2Nlc3NSYWRpb0J1dHRvbihlKXt0aGlzLmRhdGEuZmllbGRWYWx1ZT10aGlzLmRhdGEuYnV0dG9uVmFsdWU9bnVsbDtjb25zdCB0PWUuZGljdC5nZXQoIlBhcmVudCIpO2lmKCgwLG4uaXNEaWN0KSh0KSYmdC5oYXMoIlYiKSl7Y29uc3Qgcj10LmdldCgiViIpO2lmKCgwLG4uaXNOYW1lKShyKSl7dGhpcy5wYXJlbnQ9ZS5kaWN0LmdldFJhdygiUGFyZW50Iik7dGhpcy5kYXRhLmZpZWxkVmFsdWU9dGhpcy5fZGVjb2RlRm9ybVZhbHVlKHIpfX1jb25zdCByPWUuZGljdC5nZXQoIkFQIik7aWYoISgwLG4uaXNEaWN0KShyKSlyZXR1cm47Y29uc3QgYT1yLmdldCgiTiIpO2lmKCgwLG4uaXNEaWN0KShhKSl7Zm9yKGNvbnN0IGUgb2YgYS5nZXRLZXlzKCkpaWYoIk9mZiIhPT1lKXt0aGlzLmRhdGEuYnV0dG9uVmFsdWU9ZTticmVha310aGlzLmNoZWNrZWRBcHBlYXJhbmNlPWEuZ2V0KHRoaXMuZGF0YS5idXR0b25WYWx1ZSk7dGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlPWEuZ2V0KCJPZmYiKXx8bnVsbH19X3Byb2Nlc3NQdXNoQnV0dG9uKGUpe2UuZGljdC5oYXMoIkEiKT9pLkNhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7ZGVzdERpY3Q6ZS5kaWN0LHJlc3VsdE9iajp0aGlzLmRhdGEsZG9jQmFzZVVybDplLnBkZk1hbmFnZXIuZG9jQmFzZVVybH0pOigwLGEud2FybikoIlB1c2ggYnV0dG9ucyB3aXRob3V0IGFjdGlvbiBkaWN0aW9uYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKX19Y2xhc3MgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLm9wdGlvbnM9W107Y29uc3QgdD0oMCxvLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OmUuZGljdCxrZXk6Ik9wdCJ9KTtpZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCByPWUueHJlZjtmb3IobGV0IGU9MCxhPXQubGVuZ3RoO2U8YTtlKyspe2NvbnN0IGE9ci5mZXRjaElmUmVmKHRbZV0pLGk9QXJyYXkuaXNBcnJheShhKTt0aGlzLmRhdGEub3B0aW9uc1tlXT17ZXhwb3J0VmFsdWU6dGhpcy5fZGVjb2RlRm9ybVZhbHVlKGk/ci5mZXRjaElmUmVmKGFbMF0pOmEpLGRpc3BsYXlWYWx1ZTp0aGlzLl9kZWNvZGVGb3JtVmFsdWUoaT9yLmZldGNoSWZSZWYoYVsxXSk6YSl9fX0oMCxhLmlzU3RyaW5nKSh0aGlzLmRhdGEuZmllbGRWYWx1ZSk/dGhpcy5kYXRhLmZpZWxkVmFsdWU9W3RoaXMuZGF0YS5maWVsZFZhbHVlXTp0aGlzLmRhdGEuZmllbGRWYWx1ZXx8KHRoaXMuZGF0YS5maWVsZFZhbHVlPVtdKTt0aGlzLmRhdGEuY29tYm89dGhpcy5oYXNGaWVsZEZsYWcoYS5Bbm5vdGF0aW9uRmllbGRGbGFnLkNPTUJPKTt0aGlzLmRhdGEubXVsdGlTZWxlY3Q9dGhpcy5oYXNGaWVsZEZsYWcoYS5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJU0VMRUNUKTt0aGlzLl9oYXNUZXh0PSEwfX1jbGFzcyBUZXh0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7Y29uc3QgdD1lLmRpY3Q7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPWEuQW5ub3RhdGlvblR5cGUuVEVYVDtpZih0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSl0aGlzLmRhdGEubmFtZT0iTm9JY29uIjtlbHNle3RoaXMuZGF0YS5yZWN0WzFdPXRoaXMuZGF0YS5yZWN0WzNdLTIyO3RoaXMuZGF0YS5yZWN0WzJdPXRoaXMuZGF0YS5yZWN0WzBdKzIyO3RoaXMuZGF0YS5uYW1lPXQuaGFzKCJOYW1lIik/dC5nZXQoIk5hbWUiKS5uYW1lOiJOb3RlIn1pZih0LmhhcygiU3RhdGUiKSl7dGhpcy5kYXRhLnN0YXRlPXQuZ2V0KCJTdGF0ZSIpfHxudWxsO3RoaXMuZGF0YS5zdGF0ZU1vZGVsPXQuZ2V0KCJTdGF0ZU1vZGVsIil8fG51bGx9ZWxzZXt0aGlzLmRhdGEuc3RhdGU9bnVsbDt0aGlzLmRhdGEuc3RhdGVNb2RlbD1udWxsfX19Y2xhc3MgTGlua0Fubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLkxJTks7Y29uc3QgdD1nZXRRdWFkUG9pbnRzKGUuZGljdCx0aGlzLnJlY3RhbmdsZSk7dCYmKHRoaXMuZGF0YS5xdWFkUG9pbnRzPXQpO2kuQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHtkZXN0RGljdDplLmRpY3QscmVzdWx0T2JqOnRoaXMuZGF0YSxkb2NCYXNlVXJsOmUucGRmTWFuYWdlci5kb2NCYXNlVXJsfSl9fWNsYXNzIFBvcHVwQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPWEuQW5ub3RhdGlvblR5cGUuUE9QVVA7bGV0IHQ9ZS5kaWN0LmdldCgiUGFyZW50Iik7aWYoIXQpeygwLGEud2FybikoIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLiIpO3JldHVybn1jb25zdCByPXQuZ2V0KCJTdWJ0eXBlIik7dGhpcy5kYXRhLnBhcmVudFR5cGU9KDAsbi5pc05hbWUpKHIpP3IubmFtZTpudWxsO2NvbnN0IGk9ZS5kaWN0LmdldFJhdygiUGFyZW50Iik7dGhpcy5kYXRhLnBhcmVudElkPSgwLG4uaXNSZWYpKGkpP2kudG9TdHJpbmcoKTpudWxsO2NvbnN0IHM9dC5nZXQoIlJUIik7KDAsbi5pc05hbWUpKHMsYS5Bbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSYmKHQ9dC5nZXQoIklSVCIpKTtpZih0LmhhcygiTSIpKXt0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUodC5nZXQoIk0iKSk7dGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGU9dGhpcy5tb2RpZmljYXRpb25EYXRlfWVsc2UgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGU9bnVsbDtpZih0LmhhcygiQyIpKXt0aGlzLnNldENvbG9yKHQuZ2V0QXJyYXkoIkMiKSk7dGhpcy5kYXRhLmNvbG9yPXRoaXMuY29sb3J9ZWxzZSB0aGlzLmRhdGEuY29sb3I9bnVsbDtpZighdGhpcy52aWV3YWJsZSl7Y29uc3QgZT10LmdldCgiRiIpO3RoaXMuX2lzVmlld2FibGUoZSkmJnRoaXMuc2V0RmxhZ3MoZSl9dGhpcy5kYXRhLnRpdGxlPSgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJUIil8fCIiKTt0aGlzLmRhdGEuY29udGVudHM9KDAsYS5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIkNvbnRlbnRzIil8fCIiKX19Y2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9YS5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVH19Y2xhc3MgTGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLkxJTkU7dGhpcy5kYXRhLmxpbmVDb29yZGluYXRlcz1hLlV0aWwubm9ybWFsaXplUmVjdChlLmRpY3QuZ2V0QXJyYXkoIkwiKSl9fWNsYXNzIFNxdWFyZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLlNRVUFSRX19Y2xhc3MgQ2lyY2xlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPWEuQW5ub3RhdGlvblR5cGUuQ0lSQ0xFfX1jbGFzcyBQb2x5bGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLlBPTFlMSU5FO2NvbnN0IHQ9ZS5kaWN0LmdldEFycmF5KCJWZXJ0aWNlcyIpO3RoaXMuZGF0YS52ZXJ0aWNlcz1bXTtmb3IobGV0IGU9MCxyPXQubGVuZ3RoO2U8cjtlKz0yKXRoaXMuZGF0YS52ZXJ0aWNlcy5wdXNoKHt4OnRbZV0seTp0W2UrMV19KX19Y2xhc3MgUG9seWdvbkFubm90YXRpb24gZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPWEuQW5ub3RhdGlvblR5cGUuUE9MWUdPTn19Y2xhc3MgQ2FyZXRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9YS5Bbm5vdGF0aW9uVHlwZS5DQVJFVH19Y2xhc3MgSW5rQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPWEuQW5ub3RhdGlvblR5cGUuSU5LO2NvbnN0IHQ9ZS54cmVmLHI9ZS5kaWN0LmdldEFycmF5KCJJbmtMaXN0Iik7dGhpcy5kYXRhLmlua0xpc3RzPVtdO2ZvcihsZXQgZT0wLGE9ci5sZW5ndGg7ZTxhOysrZSl7dGhpcy5kYXRhLmlua0xpc3RzLnB1c2goW10pO2ZvcihsZXQgYT0wLGk9cltlXS5sZW5ndGg7YTxpO2ErPTIpdGhpcy5kYXRhLmlua0xpc3RzW2VdLnB1c2goe3g6dC5mZXRjaElmUmVmKHJbZV1bYV0pLHk6dC5mZXRjaElmUmVmKHJbZV1bYSsxXSl9KX19fWNsYXNzIEhpZ2hsaWdodEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVDtjb25zdCB0PWdldFF1YWRQb2ludHMoZS5kaWN0LHRoaXMucmVjdGFuZ2xlKTt0JiYodGhpcy5kYXRhLnF1YWRQb2ludHM9dCl9fWNsYXNzIFVuZGVybGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLlVOREVSTElORTtjb25zdCB0PWdldFF1YWRQb2ludHMoZS5kaWN0LHRoaXMucmVjdGFuZ2xlKTt0JiYodGhpcy5kYXRhLnF1YWRQb2ludHM9dCl9fWNsYXNzIFNxdWlnZ2x5QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPWEuQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk7Y29uc3QgdD1nZXRRdWFkUG9pbnRzKGUuZGljdCx0aGlzLnJlY3RhbmdsZSk7dCYmKHRoaXMuZGF0YS5xdWFkUG9pbnRzPXQpfX1jbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9YS5Bbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ7Y29uc3QgdD1nZXRRdWFkUG9pbnRzKGUuZGljdCx0aGlzLnJlY3RhbmdsZSk7dCYmKHRoaXMuZGF0YS5xdWFkUG9pbnRzPXQpfX1jbGFzcyBTdGFtcEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLlNUQU1QfX1jbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0IHQ9bmV3IGkuRmlsZVNwZWMoZS5kaWN0LmdldCgiRlMiKSxlLnhyZWYpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1hLkFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UO3RoaXMuZGF0YS5maWxlPXQuc2VyaWFsaXphYmxlfX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuT3BlcmF0b3JMaXN0PXZvaWQgMDt2YXIgYT1yKDIpLGk9ZnVuY3Rpb24gUXVldWVPcHRpbWl6ZXJDbG9zdXJlKCl7ZnVuY3Rpb24gYWRkU3RhdGUoZSx0LHIsYSxpKXtmb3IodmFyIG49ZSxzPTAsbz10Lmxlbmd0aC0xO3M8bztzKyspe3ZhciBjPXRbc107bj1uW2NdfHwobltjXT1bXSl9blt0W3QubGVuZ3RoLTFdXT17Y2hlY2tGbjpyLGl0ZXJhdGVGbjphLHByb2Nlc3NGbjppfX12YXIgZT1bXTthZGRTdGF0ZShlLFthLk9QUy5zYXZlLGEuT1BTLnRyYW5zZm9ybSxhLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdCxhLk9QUy5yZXN0b3JlXSxudWxsLChmdW5jdGlvbiBpdGVyYXRlSW5saW5lSW1hZ2VHcm91cChlLHQpe3ZhciByPWUuZm5BcnJheSxpPSh0LShlLmlDdXJyLTMpKSU0O3N3aXRjaChpKXtjYXNlIDA6cmV0dXJuIHJbdF09PT1hLk9QUy5zYXZlO2Nhc2UgMTpyZXR1cm4gclt0XT09PWEuT1BTLnRyYW5zZm9ybTtjYXNlIDI6cmV0dXJuIHJbdF09PT1hLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdDtjYXNlIDM6cmV0dXJuIHJbdF09PT1hLk9QUy5yZXN0b3JlfXRocm93IG5ldyBFcnJvcigiaXRlcmF0ZUlubGluZUltYWdlR3JvdXAgLSBpbnZhbGlkIHBvczogIitpKX0pLChmdW5jdGlvbiBmb3VuZElubGluZUltYWdlR3JvdXAoZSx0KXt2YXIgcj1lLmZuQXJyYXksaT1lLmFyZ3NBcnJheSxuPWUuaUN1cnIscz1uLTMsbz1uLTIsYz1uLTEsbD1NYXRoLm1pbihNYXRoLmZsb29yKCh0LXMpLzQpLDIwMCk7aWYobDwxMClyZXR1cm4gdC0odC1zKSU0O3ZhciBoLHU9MCxkPVtdLGY9MCxnPTEsbT0xO2ZvcihoPTA7aDxsO2grKyl7dmFyIHA9aVtvKyhoPDwyKV0sYj1pW2MrKGg8PDIpXVswXTtpZihnK2Iud2lkdGg+MWUzKXt1PU1hdGgubWF4KHUsZyk7bSs9ZisyO2c9MDtmPTB9ZC5wdXNoKHt0cmFuc2Zvcm06cCx4OmcseTptLHc6Yi53aWR0aCxoOmIuaGVpZ2h0fSk7Zys9Yi53aWR0aCsyO2Y9TWF0aC5tYXgoZixiLmhlaWdodCl9dmFyIHk9TWF0aC5tYXgodSxnKSsxLHY9bStmKzEsdz1uZXcgVWludDhDbGFtcGVkQXJyYXkoeSp2KjQpLGs9eTw8Mjtmb3IoaD0wO2g8bDtoKyspe3ZhciBTPWlbYysoaDw8MildWzBdLmRhdGEsQz1kW2hdLnc8PDIseD0wLEE9ZFtoXS54K2RbaF0ueSp5PDwyO3cuc2V0KFMuc3ViYXJyYXkoMCxDKSxBLWspO2Zvcih2YXIgVD0wLEk9ZFtoXS5oO1Q8STtUKyspe3cuc2V0KFMuc3ViYXJyYXkoeCx4K0MpLEEpO3grPUM7QSs9a313LnNldChTLnN1YmFycmF5KHgtQyx4KSxBKTtmb3IoO0E+PTA7KXtTW0EtNF09U1tBXTtTW0EtM109U1tBKzFdO1NbQS0yXT1TW0ErMl07U1tBLTFdPVNbQSszXTtTW0ErQ109U1tBK0MtNF07U1tBK0MrMV09U1tBK0MtM107U1tBK0MrMl09U1tBK0MtMl07U1tBK0MrM109U1tBK0MtMV07QS09a319ci5zcGxpY2Uocyw0KmwsYS5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cCk7aS5zcGxpY2Uocyw0KmwsW3t3aWR0aDp5LGhlaWdodDp2LGtpbmQ6YS5JbWFnZUtpbmQuUkdCQV8zMkJQUCxkYXRhOnd9LGRdKTtyZXR1cm4gcysxfSkpO2FkZFN0YXRlKGUsW2EuT1BTLnNhdmUsYS5PUFMudHJhbnNmb3JtLGEuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCxhLk9QUy5yZXN0b3JlXSxudWxsLChmdW5jdGlvbiBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAoZSx0KXt2YXIgcj1lLmZuQXJyYXksaT0odC0oZS5pQ3Vyci0zKSklNDtzd2l0Y2goaSl7Y2FzZSAwOnJldHVybiByW3RdPT09YS5PUFMuc2F2ZTtjYXNlIDE6cmV0dXJuIHJbdF09PT1hLk9QUy50cmFuc2Zvcm07Y2FzZSAyOnJldHVybiByW3RdPT09YS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0O2Nhc2UgMzpyZXR1cm4gclt0XT09PWEuT1BTLnJlc3RvcmV9dGhyb3cgbmV3IEVycm9yKCJpdGVyYXRlSW1hZ2VNYXNrR3JvdXAgLSBpbnZhbGlkIHBvczogIitpKX0pLChmdW5jdGlvbiBmb3VuZEltYWdlTWFza0dyb3VwKGUsdCl7dmFyIHIsaT1lLmZuQXJyYXksbj1lLmFyZ3NBcnJheSxzPWUuaUN1cnIsbz1zLTMsYz1zLTIsbD1zLTEsaD1NYXRoLmZsb29yKCh0LW8pLzQpO2lmKChoPWZ1bmN0aW9uIGhhbmRsZVBhaW50U29saWRDb2xvckltYWdlTWFzayhlLHQscixpKXtmb3IodmFyIG49ZSsyLHM9MDtzPHQ7cysrKXt2YXIgbz1pW24rNCpzXSxjPTE9PT1vLmxlbmd0aCYmb1swXTtpZighY3x8MSE9PWMud2lkdGh8fDEhPT1jLmhlaWdodHx8Yy5kYXRhLmxlbmd0aCYmKDEhPT1jLmRhdGEubGVuZ3RofHwwIT09Yy5kYXRhWzBdKSlicmVhaztyW24rNCpzXT1hLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2t9cmV0dXJuIHQtc30obyxoLGksbikpPDEwKXJldHVybiB0LSh0LW8pJTQ7dmFyIHUsZCxmPSExLGc9bltsXVswXTtjb25zdCBtPW5bY11bMF0scD1uW2NdWzFdLGI9bltjXVsyXSx5PW5bY11bM107aWYocD09PWIpe2Y9ITA7dT1jKzQ7dmFyIHY9bCs0O2ZvcihyPTE7cjxoO3IrKyx1Kz00LHYrPTQpe2Q9blt1XTtpZihuW3ZdWzBdIT09Z3x8ZFswXSE9PW18fGRbMV0hPT1wfHxkWzJdIT09Ynx8ZFszXSE9PXkpe3I8MTA/Zj0hMTpoPXI7YnJlYWt9fX1pZihmKXtoPU1hdGgubWluKGgsMWUzKTt2YXIgdz1uZXcgRmxvYXQzMkFycmF5KDIqaCk7dT1jO2ZvcihyPTA7cjxoO3IrKyx1Kz00KXtkPW5bdV07d1tyPDwxXT1kWzRdO3dbMSsocjw8MSldPWRbNV19aS5zcGxpY2Uobyw0KmgsYS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KTtuLnNwbGljZShvLDQqaCxbZyxtLHAsYix5LHddKX1lbHNle2g9TWF0aC5taW4oaCwxMDApO3ZhciBrPVtdO2ZvcihyPTA7cjxoO3IrKyl7ZD1uW2MrKHI8PDIpXTt2YXIgUz1uW2wrKHI8PDIpXVswXTtrLnB1c2goe2RhdGE6Uy5kYXRhLHdpZHRoOlMud2lkdGgsaGVpZ2h0OlMuaGVpZ2h0LHRyYW5zZm9ybTpkfSl9aS5zcGxpY2Uobyw0KmgsYS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXApO24uc3BsaWNlKG8sNCpoLFtrXSl9cmV0dXJuIG8rMX0pKTthZGRTdGF0ZShlLFthLk9QUy5zYXZlLGEuT1BTLnRyYW5zZm9ybSxhLk9QUy5wYWludEltYWdlWE9iamVjdCxhLk9QUy5yZXN0b3JlXSwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hcmdzQXJyYXkscj1lLmlDdXJyLTI7cmV0dXJuIDA9PT10W3JdWzFdJiYwPT09dFtyXVsyXX0pLChmdW5jdGlvbiBpdGVyYXRlSW1hZ2VHcm91cChlLHQpe3ZhciByPWUuZm5BcnJheSxpPWUuYXJnc0FycmF5LG49KHQtKGUuaUN1cnItMykpJTQ7c3dpdGNoKG4pe2Nhc2UgMDpyZXR1cm4gclt0XT09PWEuT1BTLnNhdmU7Y2FzZSAxOmlmKHJbdF0hPT1hLk9QUy50cmFuc2Zvcm0pcmV0dXJuITE7dmFyIHM9ZS5pQ3Vyci0yLG89aVtzXVswXSxjPWlbc11bM107cmV0dXJuIGlbdF1bMF09PT1vJiYwPT09aVt0XVsxXSYmMD09PWlbdF1bMl0mJmlbdF1bM109PT1jO2Nhc2UgMjppZihyW3RdIT09YS5PUFMucGFpbnRJbWFnZVhPYmplY3QpcmV0dXJuITE7dmFyIGw9aVtlLmlDdXJyLTFdWzBdO3JldHVybiBpW3RdWzBdPT09bDtjYXNlIDM6cmV0dXJuIHJbdF09PT1hLk9QUy5yZXN0b3JlfXRocm93IG5ldyBFcnJvcigiaXRlcmF0ZUltYWdlR3JvdXAgLSBpbnZhbGlkIHBvczogIituKX0pLChmdW5jdGlvbihlLHQpe3ZhciByPWUuZm5BcnJheSxpPWUuYXJnc0FycmF5LG49ZS5pQ3VycixzPW4tMyxvPW4tMixjPWlbbi0xXVswXSxsPWlbb11bMF0saD1pW29dWzNdLHU9TWF0aC5taW4oTWF0aC5mbG9vcigodC1zKS80KSwxZTMpO2lmKHU8MylyZXR1cm4gdC0odC1zKSU0O2Zvcih2YXIgZD1uZXcgRmxvYXQzMkFycmF5KDIqdSksZj1vLGc9MDtnPHU7ZysrLGYrPTQpe3ZhciBtPWlbZl07ZFtnPDwxXT1tWzRdO2RbMSsoZzw8MSldPW1bNV19dmFyIHA9W2MsbCxoLGRdO3Iuc3BsaWNlKHMsNCp1LGEuT1BTLnBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KTtpLnNwbGljZShzLDQqdSxwKTtyZXR1cm4gcysxfSkpO2FkZFN0YXRlKGUsW2EuT1BTLmJlZ2luVGV4dCxhLk9QUy5zZXRGb250LGEuT1BTLnNldFRleHRNYXRyaXgsYS5PUFMuc2hvd1RleHQsYS5PUFMuZW5kVGV4dF0sbnVsbCwoZnVuY3Rpb24gaXRlcmF0ZVNob3dUZXh0R3JvdXAoZSx0KXt2YXIgcj1lLmZuQXJyYXksaT1lLmFyZ3NBcnJheSxuPSh0LShlLmlDdXJyLTQpKSU1O3N3aXRjaChuKXtjYXNlIDA6cmV0dXJuIHJbdF09PT1hLk9QUy5iZWdpblRleHQ7Y2FzZSAxOnJldHVybiByW3RdPT09YS5PUFMuc2V0Rm9udDtjYXNlIDI6cmV0dXJuIHJbdF09PT1hLk9QUy5zZXRUZXh0TWF0cml4O2Nhc2UgMzppZihyW3RdIT09YS5PUFMuc2hvd1RleHQpcmV0dXJuITE7dmFyIHM9ZS5pQ3Vyci0zLG89aVtzXVswXSxjPWlbc11bMV07cmV0dXJuIGlbdF1bMF09PT1vJiZpW3RdWzFdPT09YztjYXNlIDQ6cmV0dXJuIHJbdF09PT1hLk9QUy5lbmRUZXh0fXRocm93IG5ldyBFcnJvcigiaXRlcmF0ZVNob3dUZXh0R3JvdXAgLSBpbnZhbGlkIHBvczogIituKX0pLChmdW5jdGlvbihlLHQpe3ZhciByPWUuZm5BcnJheSxhPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixuPWktNCxzPWktMyxvPWktMixjPWktMSxsPWksaD1hW3NdWzBdLHU9YVtzXVsxXSxkPU1hdGgubWluKE1hdGguZmxvb3IoKHQtbikvNSksMWUzKTtpZihkPDMpcmV0dXJuIHQtKHQtbiklNTt2YXIgZj1uO2lmKG4+PTQmJnJbbi00XT09PXJbc10mJnJbbi0zXT09PXJbb10mJnJbbi0yXT09PXJbY10mJnJbbi0xXT09PXJbbF0mJmFbbi00XVswXT09PWgmJmFbbi00XVsxXT09PXUpe2QrKztmLT01fWZvcih2YXIgZz1mKzQsbT0xO208ZDttKyspe3Iuc3BsaWNlKGcsMyk7YS5zcGxpY2UoZywzKTtnKz0yfXJldHVybiBnKzF9KSk7ZnVuY3Rpb24gUXVldWVPcHRpbWl6ZXIoZSl7dGhpcy5xdWV1ZT1lO3RoaXMuc3RhdGU9bnVsbDt0aGlzLmNvbnRleHQ9e2lDdXJyOjAsZm5BcnJheTplLmZuQXJyYXksYXJnc0FycmF5OmUuYXJnc0FycmF5fTt0aGlzLm1hdGNoPW51bGw7dGhpcy5sYXN0UHJvY2Vzc2VkPTB9UXVldWVPcHRpbWl6ZXIucHJvdG90eXBlPXtfb3B0aW1pemUoKXtjb25zdCB0PXRoaXMucXVldWUuZm5BcnJheTtsZXQgcj10aGlzLmxhc3RQcm9jZXNzZWQsYT10Lmxlbmd0aCxpPXRoaXMuc3RhdGUsbj10aGlzLm1hdGNoO2lmKCFpJiYhbiYmcisxPT09YSYmIWVbdFtyXV0pe3RoaXMubGFzdFByb2Nlc3NlZD1hO3JldHVybn1jb25zdCBzPXRoaXMuY29udGV4dDtmb3IoO3I8YTspe2lmKG4pe2lmKCgwLG4uaXRlcmF0ZUZuKShzLHIpKXtyKys7Y29udGludWV9cj0oMCxuLnByb2Nlc3NGbikocyxyKzEpO2E9dC5sZW5ndGg7bj1udWxsO2k9bnVsbDtpZihyPj1hKWJyZWFrfWk9KGl8fGUpW3Rbcl1dO2lmKGkmJiFBcnJheS5pc0FycmF5KGkpKXtzLmlDdXJyPXI7cisrO2lmKCFpLmNoZWNrRm58fCgwLGkuY2hlY2tGbikocykpe249aTtpPW51bGx9ZWxzZSBpPW51bGx9ZWxzZSByKyt9dGhpcy5zdGF0ZT1pO3RoaXMubWF0Y2g9bjt0aGlzLmxhc3RQcm9jZXNzZWQ9cn0scHVzaChlLHQpe3RoaXMucXVldWUuZm5BcnJheS5wdXNoKGUpO3RoaXMucXVldWUuYXJnc0FycmF5LnB1c2godCk7dGhpcy5fb3B0aW1pemUoKX0sZmx1c2goKXtmb3IoO3RoaXMubWF0Y2g7KXtjb25zdCBlPXRoaXMucXVldWUuZm5BcnJheS5sZW5ndGg7dGhpcy5sYXN0UHJvY2Vzc2VkPSgwLHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsZSk7dGhpcy5tYXRjaD1udWxsO3RoaXMuc3RhdGU9bnVsbDt0aGlzLl9vcHRpbWl6ZSgpfX0scmVzZXQoKXt0aGlzLnN0YXRlPW51bGw7dGhpcy5tYXRjaD1udWxsO3RoaXMubGFzdFByb2Nlc3NlZD0wfX07cmV0dXJuIFF1ZXVlT3B0aW1pemVyfSgpLG49ZnVuY3Rpb24gTnVsbE9wdGltaXplckNsb3N1cmUoKXtmdW5jdGlvbiBOdWxsT3B0aW1pemVyKGUpe3RoaXMucXVldWU9ZX1OdWxsT3B0aW1pemVyLnByb3RvdHlwZT17cHVzaChlLHQpe3RoaXMucXVldWUuZm5BcnJheS5wdXNoKGUpO3RoaXMucXVldWUuYXJnc0FycmF5LnB1c2godCl9LGZsdXNoKCl7fSxyZXNldCgpe319O3JldHVybiBOdWxsT3B0aW1pemVyfSgpLHM9ZnVuY3Rpb24gT3BlcmF0b3JMaXN0Q2xvc3VyZSgpe2Z1bmN0aW9uIE9wZXJhdG9yTGlzdChlLHQpe3RoaXMuX3N0cmVhbVNpbms9dDt0aGlzLmZuQXJyYXk9W107dGhpcy5hcmdzQXJyYXk9W107dGhpcy5vcHRpbWl6ZXI9dCYmIm9wbGlzdCIhPT1lP25ldyBpKHRoaXMpOm5ldyBuKHRoaXMpO3RoaXMuZGVwZW5kZW5jaWVzPW5ldyBTZXQ7dGhpcy5fdG90YWxMZW5ndGg9MDt0aGlzLndlaWdodD0wO3RoaXMuX3Jlc29sdmVkPXQ/bnVsbDpQcm9taXNlLnJlc29sdmUoKX1PcGVyYXRvckxpc3QucHJvdG90eXBlPXtnZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuYXJnc0FycmF5Lmxlbmd0aH0sZ2V0IHJlYWR5KCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVkfHx0aGlzLl9zdHJlYW1TaW5rLnJlYWR5fSxnZXQgdG90YWxMZW5ndGgoKXtyZXR1cm4gdGhpcy5fdG90YWxMZW5ndGgrdGhpcy5sZW5ndGh9LGFkZE9wKGUsdCl7dGhpcy5vcHRpbWl6ZXIucHVzaChlLHQpO3RoaXMud2VpZ2h0Kys7dGhpcy5fc3RyZWFtU2luayYmKHRoaXMud2VpZ2h0Pj0xZTN8fHRoaXMud2VpZ2h0Pj05OTUmJihlPT09YS5PUFMucmVzdG9yZXx8ZT09PWEuT1BTLmVuZFRleHQpKSYmdGhpcy5mbHVzaCgpfSxhZGREZXBlbmRlbmN5KGUpe2lmKCF0aGlzLmRlcGVuZGVuY2llcy5oYXMoZSkpe3RoaXMuZGVwZW5kZW5jaWVzLmFkZChlKTt0aGlzLmFkZE9wKGEuT1BTLmRlcGVuZGVuY3ksW2VdKX19LGFkZERlcGVuZGVuY2llcyhlKXtmb3IoY29uc3QgdCBvZiBlKXRoaXMuYWRkRGVwZW5kZW5jeSh0KX0sYWRkT3BMaXN0KGUpe2lmKGUgaW5zdGFuY2VvZiBPcGVyYXRvckxpc3Qpe2Zvcihjb25zdCB0IG9mIGUuZGVwZW5kZW5jaWVzKXRoaXMuZGVwZW5kZW5jaWVzLmFkZCh0KTtmb3IodmFyIHQ9MCxyPWUubGVuZ3RoO3Q8cjt0KyspdGhpcy5hZGRPcChlLmZuQXJyYXlbdF0sZS5hcmdzQXJyYXlbdF0pfWVsc2UoMCxhLndhcm4pKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKX0sZ2V0SVIoKXtyZXR1cm57Zm5BcnJheTp0aGlzLmZuQXJyYXksYXJnc0FycmF5OnRoaXMuYXJnc0FycmF5LGxlbmd0aDp0aGlzLmxlbmd0aH19LGdldCBfdHJhbnNmZXJzKCl7Y29uc3QgZT1bXSx7Zm5BcnJheTp0LGFyZ3NBcnJheTpyLGxlbmd0aDppfT10aGlzO2ZvcihsZXQgbj0wO248aTtuKyspc3dpdGNoKHRbbl0pe2Nhc2UgYS5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6Y2FzZSBhLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOmNhc2UgYS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OmNvbnN0IHQ9cltuXVswXTt0LmNhY2hlZHx8ZS5wdXNoKHQuZGF0YS5idWZmZXIpfXJldHVybiBlfSxmbHVzaChlPSExKXt0aGlzLm9wdGltaXplci5mbHVzaCgpO2NvbnN0IHQ9dGhpcy5sZW5ndGg7dGhpcy5fdG90YWxMZW5ndGgrPXQ7dGhpcy5fc3RyZWFtU2luay5lbnF1ZXVlKHtmbkFycmF5OnRoaXMuZm5BcnJheSxhcmdzQXJyYXk6dGhpcy5hcmdzQXJyYXksbGFzdENodW5rOmUsbGVuZ3RoOnR9LDEsdGhpcy5fdHJhbnNmZXJzKTt0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO3RoaXMuZm5BcnJheS5sZW5ndGg9MDt0aGlzLmFyZ3NBcnJheS5sZW5ndGg9MDt0aGlzLndlaWdodD0wO3RoaXMub3B0aW1pemVyLnJlc2V0KCl9fTtyZXR1cm4gT3BlcmF0b3JMaXN0fSgpO3QuT3BlcmF0b3JMaXN0PXN9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3Qud3JpdGVEaWN0PXdyaXRlRGljdDt0LmluY3JlbWVudGFsVXBkYXRlPWZ1bmN0aW9uIGluY3JlbWVudGFsVXBkYXRlKGUsdCxyKXtjb25zdCBzPW5ldyBpLkRpY3QobnVsbCksbz10Lm5ld1JlZjtsZXQgYyxsO2NvbnN0IGg9ZVtlLmxlbmd0aC0xXTtpZigxMD09PWh8fDEzPT09aCl7Yz1bXTtsPWUubGVuZ3RofWVsc2V7Yz1bIlxuIl07bD1lLmxlbmd0aCsxfXMuc2V0KCJTaXplIixvLm51bSsxKTtzLnNldCgiUHJldiIsdC5zdGFydFhSZWYpO3Muc2V0KCJUeXBlIixpLk5hbWUuZ2V0KCJYUmVmIikpO251bGwhPT10LnJvb3RSZWYmJnMuc2V0KCJSb290Iix0LnJvb3RSZWYpO251bGwhPT10LmluZm9SZWYmJnMuc2V0KCJJbmZvIix0LmluZm9SZWYpO251bGwhPT10LmVuY3J5cHQmJnMuc2V0KCJFbmNyeXB0Iix0LmVuY3J5cHQpO3IucHVzaCh7cmVmOm8sZGF0YToiIn0pO3I9ci5zb3J0KChlLHQpPT5lLnJlZi5udW0tdC5yZWYubnVtKTtjb25zdCB1PVtbMCwxLDY1NTM1XV0sZD1bMCwxXTtsZXQgZj0wO2Zvcihjb25zdHtyZWY6ZSxkYXRhOnR9b2Ygcil7Zj1NYXRoLm1heChmLGwpO3UucHVzaChbMSxsLE1hdGgubWluKGUuZ2VuLDY1NTM1KV0pO2wrPXQubGVuZ3RoO2QucHVzaChlLm51bSk7ZC5wdXNoKDEpO2MucHVzaCh0KX1zLnNldCgiSW5kZXgiLGQpO2lmKDAhPT10LmZpbGVJZHMubGVuZ3RoKXtjb25zdCBlPWZ1bmN0aW9uIGNvbXB1dGVNRDUoZSx0KXtjb25zdCByPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpLGk9dC5maWxlbmFtZXx8IiIscz1bci50b1N0cmluZygpLGksZS50b1N0cmluZygpXTtsZXQgbz1zLnJlZHVjZSgoZSx0KT0+ZSt0Lmxlbmd0aCwwKTtmb3IoY29uc3QgZSBvZiBPYmplY3QudmFsdWVzKHQuaW5mbykpe3MucHVzaChlKTtvKz1lLmxlbmd0aH1jb25zdCBjPW5ldyBVaW50OEFycmF5KG8pO2xldCBsPTA7Zm9yKGNvbnN0IGUgb2Ygcyl7d3JpdGVTdHJpbmcoZSxsLGMpO2wrPWUubGVuZ3RofXJldHVybigwLGEuYnl0ZXNUb1N0cmluZykoKDAsbi5jYWxjdWxhdGVNRDUpKGMpKX0obCx0KTtzLnNldCgiSUQiLFt0LmZpbGVJZHNbMF0sZV0pfWNvbnN0IGc9WzEsTWF0aC5jZWlsKE1hdGgubG9nMihmKS84KSwyXSxtPShnWzBdK2dbMV0rZ1syXSkqdS5sZW5ndGg7cy5zZXQoIlciLGcpO3Muc2V0KCJMZW5ndGgiLG0pO2MucHVzaChgJHtvLm51bX0gJHtvLmdlbn0gb2JqXG5gKTt3cml0ZURpY3QocyxjLG51bGwpO2MucHVzaCgiIHN0cmVhbVxuIik7Y29uc3QgcD1jLnJlZHVjZSgoZSx0KT0+ZSt0Lmxlbmd0aCwwKSxiPWBcbmVuZHN0cmVhbVxuZW5kb2JqXG5zdGFydHhyZWZcbiR7bH1cbiUlRU9GXG5gLHk9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrcCttK2IubGVuZ3RoKTt5LnNldChlKTtsZXQgdj1lLmxlbmd0aDtmb3IoY29uc3QgZSBvZiBjKXt3cml0ZVN0cmluZyhlLHYseSk7dis9ZS5sZW5ndGh9Zm9yKGNvbnN0W2UsdCxyXW9mIHUpe3Y9d3JpdGVJbnQoZSxnWzBdLHYseSk7dj13cml0ZUludCh0LGdbMV0sdix5KTt2PXdyaXRlSW50KHIsZ1syXSx2LHkpfXdyaXRlU3RyaW5nKGIsdix5KTtyZXR1cm4geX07dmFyIGE9cigyKSxpPXIoNSksbj1yKDIyKTtmdW5jdGlvbiB3cml0ZURpY3QoZSx0LHIpe3QucHVzaCgiPDwiKTtmb3IoY29uc3QgYSBvZiBlLmdldEtleXMoKSl7dC5wdXNoKGAgLyR7YX0gYCk7d3JpdGVWYWx1ZShlLmdldFJhdyhhKSx0LHIpfXQucHVzaCgiPj4iKX1mdW5jdGlvbiB3cml0ZVZhbHVlKGUsdCxyKXtpZigoMCxpLmlzTmFtZSkoZSkpdC5wdXNoKCIvIitlLm5hbWUpO2Vsc2UgaWYoKDAsaS5pc1JlZikoZSkpdC5wdXNoKGAke2UubnVtfSAke2UuZ2VufSBSYCk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKSFmdW5jdGlvbiB3cml0ZUFycmF5KGUsdCxyKXt0LnB1c2goIlsiKTtsZXQgYT0hMDtmb3IoY29uc3QgaSBvZiBlKXthP2E9ITE6dC5wdXNoKCIgIik7d3JpdGVWYWx1ZShpLHQscil9dC5wdXNoKCJdIil9KGUsdCxyKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgZSl7bnVsbCE9PXImJihlPXIuZW5jcnlwdFN0cmluZyhlKSk7dC5wdXNoKGAoJHsoMCxhLmVzY2FwZVN0cmluZykoZSl9KWApfWVsc2UibnVtYmVyIj09dHlwZW9mIGU/dC5wdXNoKGZ1bmN0aW9uIG51bWJlclRvU3RyaW5nKGUpe2lmKE51bWJlci5pc0ludGVnZXIoZSkpcmV0dXJuIGUudG9TdHJpbmcoKTtjb25zdCB0PU1hdGgucm91bmQoMTAwKmUpO3JldHVybiB0JTEwMD09MD8odC8xMDApLnRvU3RyaW5nKCk6dCUxMD09MD9lLnRvRml4ZWQoMSk6ZS50b0ZpeGVkKDIpfShlKSk6KDAsaS5pc0RpY3QpKGUpP3dyaXRlRGljdChlLHQscik6KDAsaS5pc1N0cmVhbSkoZSkmJmZ1bmN0aW9uIHdyaXRlU3RyZWFtKGUsdCxyKXt3cml0ZURpY3QoZS5kaWN0LHQscik7dC5wdXNoKCIgc3RyZWFtXG4iKTtsZXQgaT0oMCxhLmJ5dGVzVG9TdHJpbmcpKGUuZ2V0Qnl0ZXMoKSk7bnVsbCE9PXImJihpPXIuZW5jcnlwdFN0cmluZyhpKSk7dC5wdXNoKGkpO3QucHVzaCgiXG5lbmRzdHJlYW1cbiIpfShlLHQscil9ZnVuY3Rpb24gd3JpdGVJbnQoZSx0LHIsYSl7Zm9yKGxldCBpPXQrci0xO2k+ci0xO2ktLSl7YVtpXT0yNTUmZTtlPj49OH1yZXR1cm4gcit0fWZ1bmN0aW9uIHdyaXRlU3RyaW5nKGUsdCxyKXtmb3IobGV0IGE9MCxpPWUubGVuZ3RoO2E8aTthKyspclt0K2FdPTI1NSZlLmNoYXJDb2RlQXQoYSl9fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlBhcnRpYWxFdmFsdWF0b3I9dm9pZCAwO3ZhciBhPXIoMiksaT1yKDI5KSxuPXIoNSkscz1yKDMwKSxvPXIoMzMpLGM9cig4KSxsPXIoMzYpLGg9cigzNSksdT1yKDM5KSxkPXIoNDApLGY9cigxMSksZz1yKDI0KSxtPXIoNDIpLHA9cigyMyksYj1yKDEyKSx5PXIoMzQpLHY9cig0Myksdz1yKDQ0KSxrPXIoMjYpLFM9cig0NSk7Y29uc3QgQz1PYmplY3QuZnJlZXplKHttYXhJbWFnZVNpemU6LTEsZGlzYWJsZUZvbnRGYWNlOiExLGlnbm9yZUVycm9yczohMSxpc0V2YWxTdXBwb3J0ZWQ6ITAsZm9udEV4dHJhUHJvcGVydGllczohMX0pLHg9MSxBPTIsVD1Qcm9taXNlLnJlc29sdmUoKTtmdW5jdGlvbiBub3JtYWxpemVCbGVuZE1vZGUoZSx0PSExKXtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0Kyspe2NvbnN0IHI9bm9ybWFsaXplQmxlbmRNb2RlKGVbdF0sITApO2lmKHIpcmV0dXJuIHJ9KDAsYS53YXJuKSgiVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZSBBcnJheTogIitlKTtyZXR1cm4ic291cmNlLW92ZXIifWlmKCEoMCxuLmlzTmFtZSkoZSkpcmV0dXJuIHQ/bnVsbDoic291cmNlLW92ZXIiO3N3aXRjaChlLm5hbWUpe2Nhc2UiTm9ybWFsIjpjYXNlIkNvbXBhdGlibGUiOnJldHVybiJzb3VyY2Utb3ZlciI7Y2FzZSJNdWx0aXBseSI6cmV0dXJuIm11bHRpcGx5IjtjYXNlIlNjcmVlbiI6cmV0dXJuInNjcmVlbiI7Y2FzZSJPdmVybGF5IjpyZXR1cm4ib3ZlcmxheSI7Y2FzZSJEYXJrZW4iOnJldHVybiJkYXJrZW4iO2Nhc2UiTGlnaHRlbiI6cmV0dXJuImxpZ2h0ZW4iO2Nhc2UiQ29sb3JEb2RnZSI6cmV0dXJuImNvbG9yLWRvZGdlIjtjYXNlIkNvbG9yQnVybiI6cmV0dXJuImNvbG9yLWJ1cm4iO2Nhc2UiSGFyZExpZ2h0IjpyZXR1cm4iaGFyZC1saWdodCI7Y2FzZSJTb2Z0TGlnaHQiOnJldHVybiJzb2Z0LWxpZ2h0IjtjYXNlIkRpZmZlcmVuY2UiOnJldHVybiJkaWZmZXJlbmNlIjtjYXNlIkV4Y2x1c2lvbiI6cmV0dXJuImV4Y2x1c2lvbiI7Y2FzZSJIdWUiOnJldHVybiJodWUiO2Nhc2UiU2F0dXJhdGlvbiI6cmV0dXJuInNhdHVyYXRpb24iO2Nhc2UiQ29sb3IiOnJldHVybiJjb2xvciI7Y2FzZSJMdW1pbm9zaXR5IjpyZXR1cm4ibHVtaW5vc2l0eSJ9aWYodClyZXR1cm4gbnVsbDsoMCxhLndhcm4pKCJVbnN1cHBvcnRlZCBibGVuZCBtb2RlOiAiK2UubmFtZSk7cmV0dXJuInNvdXJjZS1vdmVyIn1jbGFzcyBUaW1lU2xvdE1hbmFnZXJ7c3RhdGljIGdldCBUSU1FX1NMT1RfRFVSQVRJT05fTVMoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiVElNRV9TTE9UX0RVUkFUSU9OX01TIiwyMCl9c3RhdGljIGdldCBDSEVDS19USU1FX0VWRVJZKCl7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIkNIRUNLX1RJTUVfRVZFUlkiLDEwMCl9Y29uc3RydWN0b3IoKXt0aGlzLnJlc2V0KCl9Y2hlY2soKXtpZigrK3RoaXMuY2hlY2tlZDxUaW1lU2xvdE1hbmFnZXIuQ0hFQ0tfVElNRV9FVkVSWSlyZXR1cm4hMTt0aGlzLmNoZWNrZWQ9MDtyZXR1cm4gdGhpcy5lbmRUaW1lPD1EYXRlLm5vdygpfXJlc2V0KCl7dGhpcy5lbmRUaW1lPURhdGUubm93KCkrVGltZVNsb3RNYW5hZ2VyLlRJTUVfU0xPVF9EVVJBVElPTl9NUzt0aGlzLmNoZWNrZWQ9MH19Y2xhc3MgUGFydGlhbEV2YWx1YXRvcntjb25zdHJ1Y3Rvcih7eHJlZjplLGhhbmRsZXI6dCxwYWdlSW5kZXg6cixpZEZhY3Rvcnk6YSxmb250Q2FjaGU6aSxidWlsdEluQ01hcENhY2hlOm4sZ2xvYmFsSW1hZ2VDYWNoZTpzLG9wdGlvbnM6bz1udWxsfSl7dGhpcy54cmVmPWU7dGhpcy5oYW5kbGVyPXQ7dGhpcy5wYWdlSW5kZXg9cjt0aGlzLmlkRmFjdG9yeT1hO3RoaXMuZm9udENhY2hlPWk7dGhpcy5idWlsdEluQ01hcENhY2hlPW47dGhpcy5nbG9iYWxJbWFnZUNhY2hlPXM7dGhpcy5vcHRpb25zPW98fEM7dGhpcy5wYXJzaW5nVHlwZTNGb250PSExO3RoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZD10aGlzLmZldGNoQnVpbHRJbkNNYXAuYmluZCh0aGlzKX1nZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpe2NvbnN0IGU9bmV3IGQuUERGRnVuY3Rpb25GYWN0b3J5KHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5vcHRpb25zLmlzRXZhbFN1cHBvcnRlZH0pO3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJfcGRmRnVuY3Rpb25GYWN0b3J5IixlKX1jbG9uZShlPUMpe3ZhciB0PU9iamVjdC5jcmVhdGUodGhpcyk7dC5vcHRpb25zPWU7cmV0dXJuIHR9aGFzQmxlbmRNb2RlcyhlKXtpZighKGUgaW5zdGFuY2VvZiBuLkRpY3QpKXJldHVybiExO2NvbnN0IHQ9bmV3IG4uUmVmU2V0O2Uub2JqSWQmJnQucHV0KGUub2JqSWQpO2Zvcih2YXIgcj1bZV0saT10aGlzLnhyZWY7ci5sZW5ndGg7KXt2YXIgcz1yLnNoaWZ0KCksbz1zLmdldCgiRXh0R1N0YXRlIik7aWYobyBpbnN0YW5jZW9mIG4uRGljdClmb3IobGV0IGUgb2Ygby5nZXRSYXdWYWx1ZXMoKSl7aWYoZSBpbnN0YW5jZW9mIG4uUmVmKXtpZih0LmhhcyhlKSljb250aW51ZTt0cnl7ZT1pLmZldGNoKGUpfWNhdGNoKHIpe2lmKHIgaW5zdGFuY2VvZiBjLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHI7dC5wdXQoZSk7KDAsYS5pbmZvKShgaGFzQmxlbmRNb2RlcyAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7cn0iLmApO2NvbnRpbnVlfX1pZighKGUgaW5zdGFuY2VvZiBuLkRpY3QpKWNvbnRpbnVlO2Uub2JqSWQmJnQucHV0KGUub2JqSWQpO2NvbnN0IHI9ZS5nZXQoIkJNIik7aWYociBpbnN0YW5jZW9mIG4uTmFtZSl7aWYoIk5vcm1hbCIhPT1yLm5hbWUpcmV0dXJuITB9ZWxzZSBpZih2b2lkIDAhPT1yJiZBcnJheS5pc0FycmF5KHIpKWZvcihjb25zdCBlIG9mIHIpaWYoZSBpbnN0YW5jZW9mIG4uTmFtZSYmIk5vcm1hbCIhPT1lLm5hbWUpcmV0dXJuITB9dmFyIGw9cy5nZXQoIlhPYmplY3QiKTtpZihsIGluc3RhbmNlb2Ygbi5EaWN0KWZvcihsZXQgZSBvZiBsLmdldFJhd1ZhbHVlcygpKXtpZihlIGluc3RhbmNlb2Ygbi5SZWYpe2lmKHQuaGFzKGUpKWNvbnRpbnVlO3RyeXtlPWkuZmV0Y2goZSl9Y2F0Y2gocil7aWYociBpbnN0YW5jZW9mIGMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgcjt0LnB1dChlKTsoMCxhLmluZm8pKGBoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgWE9iamVjdDogIiR7cn0iLmApO2NvbnRpbnVlfX1pZigoMCxuLmlzU3RyZWFtKShlKSl7ZS5kaWN0Lm9iaklkJiZ0LnB1dChlLmRpY3Qub2JqSWQpO3ZhciBoPWUuZGljdC5nZXQoIlJlc291cmNlcyIpO2lmKGggaW5zdGFuY2VvZiBuLkRpY3QmJighaC5vYmpJZHx8IXQuaGFzKGgub2JqSWQpKSl7ci5wdXNoKGgpO2gub2JqSWQmJnQucHV0KGgub2JqSWQpfX19fXJldHVybiExfWFzeW5jIGZldGNoQnVpbHRJbkNNYXAoZSl7Y29uc3QgdD10aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuZ2V0KGUpO2lmKHQpcmV0dXJuIHQ7Y29uc3Qgcj10aGlzLmhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkZldGNoQnVpbHRJbkNNYXAiLHtuYW1lOmV9KS5nZXRSZWFkZXIoKSxpPWF3YWl0IG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpeyFmdW5jdGlvbiBwdW1wKCl7ci5yZWFkKCkudGhlbigoZnVuY3Rpb24oe3ZhbHVlOnQsZG9uZTpyfSl7aWYoIXIpe2UodCk7cHVtcCgpfX0pLHQpfSgpfSkpO2kuY29tcHJlc3Npb25UeXBlIT09YS5DTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUmJnRoaXMuYnVpbHRJbkNNYXBDYWNoZS5zZXQoZSxpKTtyZXR1cm4gaX1hc3luYyBidWlsZEZvcm1YT2JqZWN0KGUsdCxyLGkscyxvLGMpe3ZhciBsPXQuZGljdCxoPWwuZ2V0QXJyYXkoIk1hdHJpeCIpLHU9bC5nZXRBcnJheSgiQkJveCIpO3U9QXJyYXkuaXNBcnJheSh1KSYmND09PXUubGVuZ3RoP2EuVXRpbC5ub3JtYWxpemVSZWN0KHUpOm51bGw7bGV0IGQ9bnVsbDtpZihsLmhhcygiT0MiKSl7ZD1hd2FpdCB0aGlzLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGwuZ2V0KCJPQyIpLGUpO2kuYWRkT3AoYS5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIsZF0pfXZhciBmPWwuZ2V0KCJHcm91cCIpO2lmKGYpe3ZhciBnPXttYXRyaXg6aCxiYm94OnUsc21hc2s6cixpc29sYXRlZDohMSxrbm9ja291dDohMX0sbT1mLmdldCgiUyIpLGI9bnVsbDtpZigoMCxuLmlzTmFtZSkobSwiVHJhbnNwYXJlbmN5Iikpe2cuaXNvbGF0ZWQ9Zi5nZXQoIkkiKXx8ITE7Zy5rbm9ja291dD1mLmdldCgiSyIpfHwhMTtpZihmLmhhcygiQ1MiKSl7Y29uc3QgdD1mLmdldFJhdygiQ1MiKSxyPXAuQ29sb3JTcGFjZS5nZXRDYWNoZWQodCx0aGlzLnhyZWYsYyk7Yj1yfHxhd2FpdCB0aGlzLnBhcnNlQ29sb3JTcGFjZSh7Y3M6dCxyZXNvdXJjZXM6ZSxsb2NhbENvbG9yU3BhY2VDYWNoZTpjfSl9fWlmKHImJnIuYmFja2Ryb3Ape2I9Ynx8cC5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiO3IuYmFja2Ryb3A9Yi5nZXRSZ2Ioci5iYWNrZHJvcCwwKX1pLmFkZE9wKGEuT1BTLmJlZ2luR3JvdXAsW2ddKX1pLmFkZE9wKGEuT1BTLnBhaW50Rm9ybVhPYmplY3RCZWdpbixbaCx1XSk7cmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06dCx0YXNrOnMscmVzb3VyY2VzOmwuZ2V0KCJSZXNvdXJjZXMiKXx8ZSxvcGVyYXRvckxpc3Q6aSxpbml0aWFsU3RhdGU6b30pLnRoZW4oKGZ1bmN0aW9uKCl7aS5hZGRPcChhLk9QUy5wYWludEZvcm1YT2JqZWN0RW5kLFtdKTtmJiZpLmFkZE9wKGEuT1BTLmVuZEdyb3VwLFtnXSk7ZCYmaS5hZGRPcChhLk9QUy5lbmRNYXJrZWRDb250ZW50LFtdKX0pKX1fc2VuZEltZ0RhdGEoZSx0LHI9ITEpe2NvbnN0IGE9dD9bdC5kYXRhLmJ1ZmZlcl06bnVsbDtyZXR1cm4gdGhpcy5wYXJzaW5nVHlwZTNGb250fHxyP3RoaXMuaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLFtlLCJJbWFnZSIsdF0sYSk6dGhpcy5oYW5kbGVyLnNlbmQoIm9iaiIsW2UsdGhpcy5wYWdlSW5kZXgsIkltYWdlIix0XSxhKX1hc3luYyBidWlsZFBhaW50SW1hZ2VYT2JqZWN0KHtyZXNvdXJjZXM6ZSxpbWFnZTp0LGlzSW5saW5lOnI9ITEsb3BlcmF0b3JMaXN0OmksY2FjaGVLZXk6bixsb2NhbEltYWdlQ2FjaGU6cyxsb2NhbENvbG9yU3BhY2VDYWNoZTpvfSl7dmFyIGM9dC5kaWN0O2NvbnN0IGw9Yy5vYmpJZDt2YXIgaD1jLmdldCgiV2lkdGgiLCJXIiksdT1jLmdldCgiSGVpZ2h0IiwiSCIpO2lmKCEoaCYmKDAsYS5pc051bSkoaCkmJnUmJigwLGEuaXNOdW0pKHUpKSl7KDAsYS53YXJuKSgiSW1hZ2UgZGltZW5zaW9ucyBhcmUgbWlzc2luZywgb3Igbm90IG51bWJlcnMuIik7cmV0dXJufXZhciBkLGYsZz10aGlzLm9wdGlvbnMubWF4SW1hZ2VTaXplO2lmKC0xIT09ZyYmaCp1PmcpeygwLGEud2FybikoIkltYWdlIGV4Y2VlZGVkIG1heGltdW0gYWxsb3dlZCBzaXplIGFuZCB3YXMgcmVtb3ZlZC4iKTtyZXR1cm59aWYoYy5nZXQoIkltYWdlTWFzayIsIklNIil8fCExKXt2YXIgbT1jLmdldCgiV2lkdGgiLCJXIikscD1jLmdldCgiSGVpZ2h0IiwiSCIpLHk9bSs3Pj4zLHY9dC5nZXRCeXRlcyh5KnAsITApLHc9Yy5nZXRBcnJheSgiRGVjb2RlIiwiRCIpOyhkPVMuUERGSW1hZ2UuY3JlYXRlTWFzayh7aW1nQXJyYXk6dix3aWR0aDptLGhlaWdodDpwLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOnQgaW5zdGFuY2VvZiBiLkRlY29kZVN0cmVhbSxpbnZlcnNlRGVjb2RlOiEhdyYmd1swXT4wfSkpLmNhY2hlZD0hIW47Zj1bZF07aS5hZGRPcChhLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsZik7biYmcy5zZXQobixsLHtmbjphLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsYXJnczpmfSk7cmV0dXJufXZhciBrPWMuZ2V0KCJTTWFzayIsIlNNIil8fCExLEM9Yy5nZXQoIk1hc2siKXx8ITE7aWYociYmIWsmJiFDJiZoK3U8MjAwKXtjb25zdCBuPW5ldyBTLlBERkltYWdlKHt4cmVmOnRoaXMueHJlZixyZXM6ZSxpbWFnZTp0LGlzSW5saW5lOnIscGRmRnVuY3Rpb25GYWN0b3J5OnRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxsb2NhbENvbG9yU3BhY2VDYWNoZTpvfSk7ZD1uLmNyZWF0ZUltYWdlRGF0YSghMCk7aS5hZGRPcChhLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdCxbZF0pO3JldHVybn1sZXQgeD0iaW1nXyIrdGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKSxBPSExO2lmKHRoaXMucGFyc2luZ1R5cGUzRm9udCl4PWAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9X3R5cGUzXyR7eH1gO2Vsc2UgaWYobCl7QT10aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2hvdWxkQ2FjaGUobCx0aGlzLnBhZ2VJbmRleCk7QSYmKHg9YCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fJHt4fWApfWkuYWRkRGVwZW5kZW5jeSh4KTtmPVt4LGgsdV07Uy5QREZJbWFnZS5idWlsZEltYWdlKHt4cmVmOnRoaXMueHJlZixyZXM6ZSxpbWFnZTp0LGlzSW5saW5lOnIscGRmRnVuY3Rpb25GYWN0b3J5OnRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxsb2NhbENvbG9yU3BhY2VDYWNoZTpvfSkudGhlbihlPT57ZD1lLmNyZWF0ZUltYWdlRGF0YSghMSk7cmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKHgsZCxBKX0pLmNhdGNoKGU9PnsoMCxhLndhcm4pKGBVbmFibGUgdG8gZGVjb2RlIGltYWdlICIke3h9IjogIiR7ZX0iLmApO3JldHVybiB0aGlzLl9zZW5kSW1nRGF0YSh4LG51bGwsQSl9KTtpLmFkZE9wKGEuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGYpO2lmKG4pe3Muc2V0KG4sbCx7Zm46YS5PUFMucGFpbnRJbWFnZVhPYmplY3QsYXJnczpmfSk7aWYobCl7KDAsYS5hc3NlcnQpKCFyLCJDYW5ub3QgY2FjaGUgYW4gaW5saW5lIGltYWdlIGdsb2JhbGx5LiIpO3RoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRQYWdlSW5kZXgobCx0aGlzLnBhZ2VJbmRleCk7QSYmdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNldERhdGEobCx7b2JqSWQ6eCxmbjphLk9QUy5wYWludEltYWdlWE9iamVjdCxhcmdzOmZ9KX19fWhhbmRsZVNNYXNrKGUsdCxyLGEsaSxuKXt2YXIgcz1lLmdldCgiRyIpLG89e3N1YnR5cGU6ZS5nZXQoIlMiKS5uYW1lLGJhY2tkcm9wOmUuZ2V0KCJCQyIpfSxjPWUuZ2V0KCJUUiIpO2lmKCgwLGQuaXNQREZGdW5jdGlvbikoYykpe2NvbnN0IGU9dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZShjKTtmb3IodmFyIGw9bmV3IFVpbnQ4QXJyYXkoMjU2KSxoPW5ldyBGbG9hdDMyQXJyYXkoMSksdT0wO3U8MjU2O3UrKyl7aFswXT11LzI1NTtlKGgsMCxoLDApO2xbdV09MjU1KmhbMF18MH1vLnRyYW5zZmVyTWFwPWx9cmV0dXJuIHRoaXMuYnVpbGRGb3JtWE9iamVjdCh0LHMsbyxyLGEsaS5zdGF0ZS5jbG9uZSgpLG4pfWhhbmRsZVRyYW5zZmVyRnVuY3Rpb24oZSl7bGV0IHQ7aWYoQXJyYXkuaXNBcnJheShlKSl0PWU7ZWxzZXtpZighKDAsZC5pc1BERkZ1bmN0aW9uKShlKSlyZXR1cm4gbnVsbDt0PVtlXX1jb25zdCByPVtdO2xldCBhPTAsaT0wO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9dGhpcy54cmVmLmZldGNoSWZSZWYoZSk7YSsrO2lmKCgwLG4uaXNOYW1lKSh0LCJJZGVudGl0eSIpKXtyLnB1c2gobnVsbCk7Y29udGludWV9aWYoISgwLGQuaXNQREZGdW5jdGlvbikodCkpcmV0dXJuIG51bGw7Y29uc3Qgcz10aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHQpLG89bmV3IFVpbnQ4QXJyYXkoMjU2KSxjPW5ldyBGbG9hdDMyQXJyYXkoMSk7Zm9yKGxldCBlPTA7ZTwyNTY7ZSsrKXtjWzBdPWUvMjU1O3MoYywwLGMsMCk7b1tlXT0yNTUqY1swXXwwfXIucHVzaChvKTtpKyt9cmV0dXJuIDEhPT1hJiY0IT09YXx8MD09PWk/bnVsbDpyfWhhbmRsZVRpbGluZ1R5cGUoZSx0LHIsaSxzLG8sYyl7Y29uc3QgbD1uZXcgay5PcGVyYXRvckxpc3QsaD1uLkRpY3QubWVyZ2Uoe3hyZWY6dGhpcy54cmVmLGRpY3RBcnJheTpbcy5nZXQoIlJlc291cmNlcyIpLHJdfSk7cmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06aSx0YXNrOmMscmVzb3VyY2VzOmgsb3BlcmF0b3JMaXN0Omx9KS50aGVuKChmdW5jdGlvbigpe3JldHVybigwLHUuZ2V0VGlsaW5nUGF0dGVybklSKSh7Zm5BcnJheTpsLmZuQXJyYXksYXJnc0FycmF5OmwuYXJnc0FycmF5fSxzLHQpfSkpLnRoZW4oKGZ1bmN0aW9uKHQpe28uYWRkRGVwZW5kZW5jaWVzKGwuZGVwZW5kZW5jaWVzKTtvLmFkZE9wKGUsdCl9KSxlPT57aWYoIShlIGluc3RhbmNlb2YgYS5BYm9ydEV4Y2VwdGlvbikpe2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7dGhpcy5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIse2ZlYXR1cmVJZDphLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yVGlsaW5nUGF0dGVybn0pOygwLGEud2FybikoYGhhbmRsZVRpbGluZ1R5cGUgLSBpZ25vcmluZyBwYXR0ZXJuOiAiJHtlfSIuYCl9fSl9aGFuZGxlU2V0Rm9udChlLHQscixpLG4sbyl7dmFyIGMsbD0wO2lmKHQpe3Q9dC5zbGljZSgpO2M9dFswXS5uYW1lO2w9dFsxXX1yZXR1cm4gdGhpcy5sb2FkRm9udChjLHIsZSkudGhlbih0PT50LmZvbnQuaXNUeXBlM0ZvbnQ/dC5sb2FkVHlwZTNEYXRhKHRoaXMsZSxuKS50aGVuKChmdW5jdGlvbigpe2kuYWRkRGVwZW5kZW5jaWVzKHQudHlwZTNEZXBlbmRlbmNpZXMpO3JldHVybiB0fSkpLmNhdGNoKGU9Pnt0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOmEuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250TG9hZFR5cGUzfSk7cmV0dXJuIG5ldyBUcmFuc2xhdGVkRm9udCh7bG9hZGVkTmFtZToiZ19mb250X2Vycm9yIixmb250Om5ldyBzLkVycm9yRm9udCgiVHlwZTMgZm9udCBsb2FkIGVycm9yOiAiK2UpLGRpY3Q6dC5mb250LGV4dHJhUHJvcGVydGllczp0aGlzLm9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllc30pfSk6dCkudGhlbihlPT57by5mb250PWUuZm9udDtvLmZvbnRTaXplPWw7by5mb250TmFtZT1jO2Uuc2VuZCh0aGlzLmhhbmRsZXIpO3JldHVybiBlLmxvYWRlZE5hbWV9KX1oYW5kbGVUZXh0KGUsdCl7Y29uc3Qgcj10LmZvbnQsaT1yLmNoYXJzVG9HbHlwaHMoZSk7aWYoci5kYXRhKXsoISEodC50ZXh0UmVuZGVyaW5nTW9kZSZhLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcpfHwiUGF0dGVybiI9PT10LmZpbGxDb2xvclNwYWNlLm5hbWV8fHIuZGlzYWJsZUZvbnRGYWNlfHx0aGlzLm9wdGlvbnMuZGlzYWJsZUZvbnRGYWNlKSYmUGFydGlhbEV2YWx1YXRvci5idWlsZEZvbnRQYXRocyhyLGksdGhpcy5oYW5kbGVyKX1yZXR1cm4gaX1lbnN1cmVTdGF0ZUZvbnQoZSl7aWYoZS5mb250KXJldHVybjtjb25zdCB0PW5ldyBhLkZvcm1hdEVycm9yKCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuIik7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgdDt0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOmEuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250U3RhdGV9KTsoMCxhLndhcm4pKGBlbnN1cmVTdGF0ZUZvbnQ6ICIke3R9Ii5gKX1hc3luYyBzZXRHU3RhdGUoe3Jlc291cmNlczplLGdTdGF0ZTp0LG9wZXJhdG9yTGlzdDpyLGNhY2hlS2V5OmksdGFzazpzLHN0YXRlTWFuYWdlcjpvLGxvY2FsR1N0YXRlQ2FjaGU6Yyxsb2NhbENvbG9yU3BhY2VDYWNoZTpsfSl7Y29uc3QgaD10Lm9iaklkO2xldCB1PSEwO2Zvcih2YXIgZD1bXSxmPXQuZ2V0S2V5cygpLGc9UHJvbWlzZS5yZXNvbHZlKCksbT0wLHA9Zi5sZW5ndGg7bTxwO20rKyl7Y29uc3QgaT1mW21dLGM9dC5nZXQoaSk7c3dpdGNoKGkpe2Nhc2UiVHlwZSI6YnJlYWs7Y2FzZSJMVyI6Y2FzZSJMQyI6Y2FzZSJMSiI6Y2FzZSJNTCI6Y2FzZSJEIjpjYXNlIlJJIjpjYXNlIkZMIjpjYXNlIkNBIjpjYXNlImNhIjpkLnB1c2goW2ksY10pO2JyZWFrO2Nhc2UiRm9udCI6dT0hMTtnPWcudGhlbigoKT0+dGhpcy5oYW5kbGVTZXRGb250KGUsbnVsbCxjWzBdLHIscyxvLnN0YXRlKS50aGVuKChmdW5jdGlvbihlKXtyLmFkZERlcGVuZGVuY3koZSk7ZC5wdXNoKFtpLFtlLGNbMV1dXSl9KSkpO2JyZWFrO2Nhc2UiQk0iOmQucHVzaChbaSxub3JtYWxpemVCbGVuZE1vZGUoYyldKTticmVhaztjYXNlIlNNYXNrIjppZigoMCxuLmlzTmFtZSkoYywiTm9uZSIpKXtkLnB1c2goW2ksITFdKTticmVha31pZigoMCxuLmlzRGljdCkoYykpe3U9ITE7Zz1nLnRoZW4oKCk9PnRoaXMuaGFuZGxlU01hc2soYyxlLHIscyxvLGwpKTtkLnB1c2goW2ksITBdKX1lbHNlKDAsYS53YXJuKSgiVW5zdXBwb3J0ZWQgU01hc2sgdHlwZSIpO2JyZWFrO2Nhc2UiVFIiOmNvbnN0IHQ9dGhpcy5oYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKGMpO2QucHVzaChbaSx0XSk7YnJlYWs7Y2FzZSJPUCI6Y2FzZSJvcCI6Y2FzZSJPUE0iOmNhc2UiQkciOmNhc2UiQkcyIjpjYXNlIlVDUiI6Y2FzZSJVQ1IyIjpjYXNlIlRSMiI6Y2FzZSJIVCI6Y2FzZSJTTSI6Y2FzZSJTQSI6Y2FzZSJBSVMiOmNhc2UiVEsiOigwLGEuaW5mbykoImdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIitpKTticmVhaztkZWZhdWx0OigwLGEuaW5mbykoIlVua25vd24gZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiK2kpfX1yZXR1cm4gZy50aGVuKChmdW5jdGlvbigpe2QubGVuZ3RoPjAmJnIuYWRkT3AoYS5PUFMuc2V0R1N0YXRlLFtkXSk7dSYmYy5zZXQoaSxoLGQpfSkpfWxvYWRGb250KGUsdCxyKXtjb25zdCBlcnJvckZvbnQ9KCk9PlByb21pc2UucmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoe2xvYWRlZE5hbWU6ImdfZm9udF9lcnJvciIsZm9udDpuZXcgcy5FcnJvckZvbnQoYEZvbnQgIiR7ZX0iIGlzIG5vdCBhdmFpbGFibGUuYCksZGljdDp0LGV4dHJhUHJvcGVydGllczp0aGlzLm9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllc30pKTt2YXIgaSxvPXRoaXMueHJlZjtpZih0KXtpZighKDAsbi5pc1JlZikodCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoJ1RoZSAiZm9udCIgb2JqZWN0IHNob3VsZCBiZSBhIHJlZmVyZW5jZS4nKTtpPXR9ZWxzZXt2YXIgYz1yLmdldCgiRm9udCIpO2MmJihpPWMuZ2V0UmF3KGUpKX1pZighaSl7Y29uc3Qgcj1gRm9udCAiJHtlfHx0JiZ0LnRvU3RyaW5nKCl9IiBpcyBub3QgYXZhaWxhYmxlYDtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyYmIXRoaXMucGFyc2luZ1R5cGUzRm9udCl7KDAsYS53YXJuKShyKyIuIik7cmV0dXJuIGVycm9yRm9udCgpfXRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHtmZWF0dXJlSWQ6YS5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRNaXNzaW5nfSk7KDAsYS53YXJuKShyKyIgLS0gYXR0ZW1wdGluZyB0byBmYWxsYmFjayB0byBhIGRlZmF1bHQgZm9udC4iKTtpPVBhcnRpYWxFdmFsdWF0b3IuZmFsbGJhY2tGb250RGljdH1pZih0aGlzLmZvbnRDYWNoZS5oYXMoaSkpcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChpKTt0PW8uZmV0Y2hJZlJlZihpKTtpZighKDAsbi5pc0RpY3QpKHQpKXJldHVybiBlcnJvckZvbnQoKTtpZih0LnRyYW5zbGF0ZWQpcmV0dXJuIHQudHJhbnNsYXRlZDt2YXIgbD0oMCxhLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpLGg9dGhpcy5wcmVFdmFsdWF0ZUZvbnQodCk7Y29uc3R7ZGVzY3JpcHRvcjp1LGhhc2g6ZH09aDt2YXIgZixnLG09KDAsbi5pc1JlZikoaSk7bSYmKGY9ImYiK2kudG9TdHJpbmcoKSk7aWYoZCYmKDAsbi5pc0RpY3QpKHUpKXt1LmZvbnRBbGlhc2VzfHwodS5mb250QWxpYXNlcz1PYmplY3QuY3JlYXRlKG51bGwpKTt2YXIgcD11LmZvbnRBbGlhc2VzO2lmKHBbZF0pe3ZhciBiPXBbZF0uYWxpYXNSZWY7aWYobSYmYiYmdGhpcy5mb250Q2FjaGUuaGFzKGIpKXt0aGlzLmZvbnRDYWNoZS5wdXRBbGlhcyhpLGIpO3JldHVybiB0aGlzLmZvbnRDYWNoZS5nZXQoaSl9fWVsc2UgcFtkXT17Zm9udElEOnRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpfTttJiYocFtkXS5hbGlhc1JlZj1pKTtmPXBbZF0uZm9udElEfWlmKG0pdGhpcy5mb250Q2FjaGUucHV0KGksbC5wcm9taXNlKTtlbHNle2Z8fChmPXRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpKTt0aGlzLmZvbnRDYWNoZS5wdXQoImlkXyIrZixsLnByb21pc2UpfSgwLGEuYXNzZXJ0KShmJiZmLnN0YXJ0c1dpdGgoImYiKSwnVGhlICJmb250SUQiIG11c3QgYmUgKGNvcnJlY3RseSkgZGVmaW5lZC4nKTt0LmxvYWRlZE5hbWU9YCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fJHtmfWA7dC50cmFuc2xhdGVkPWwucHJvbWlzZTt0cnl7Zz10aGlzLnRyYW5zbGF0ZUZvbnQoaCl9Y2F0Y2goZSl7Zz1Qcm9taXNlLnJlamVjdChlKX1nLnRoZW4oZT0+e2lmKHZvaWQgMCE9PWUuZm9udFR5cGUpe28uc3RhdHMuZm9udFR5cGVzW2UuZm9udFR5cGVdPSEwfWwucmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoe2xvYWRlZE5hbWU6dC5sb2FkZWROYW1lLGZvbnQ6ZSxkaWN0OnQsZXh0cmFQcm9wZXJ0aWVzOnRoaXMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzfSkpfSkuY2F0Y2goZT0+e3RoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHtmZWF0dXJlSWQ6YS5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRUcmFuc2xhdGV9KTt0cnl7dmFyIHI9dSYmdS5nZXQoIkZvbnRGaWxlMyIpLGk9ciYmci5nZXQoIlN1YnR5cGUiKSxuPSgwLHMuZ2V0Rm9udFR5cGUpKGgudHlwZSxpJiZpLm5hbWUpO28uc3RhdHMuZm9udFR5cGVzW25dPSEwfWNhdGNoKGUpe31sLnJlc29sdmUobmV3IFRyYW5zbGF0ZWRGb250KHtsb2FkZWROYW1lOnQubG9hZGVkTmFtZSxmb250Om5ldyBzLkVycm9yRm9udChlIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOmUpLGRpY3Q6dCxleHRyYVByb3BlcnRpZXM6dGhpcy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXN9KSl9KTtyZXR1cm4gbC5wcm9taXNlfWJ1aWxkUGF0aChlLHQscixpPSExKXt2YXIgbj1lLmxlbmd0aC0xO3J8fChyPVtdKTtpZihuPDB8fGUuZm5BcnJheVtuXSE9PWEuT1BTLmNvbnN0cnVjdFBhdGgpe2lmKGkpeygwLGEud2FybikoYEVuY291bnRlcmVkIHBhdGggb3BlcmF0b3IgIiR7dH0iIGluc2lkZSBvZiBhIHRleHQgb2JqZWN0LmApO2UuYWRkT3AoYS5PUFMuc2F2ZSxudWxsKX1lLmFkZE9wKGEuT1BTLmNvbnN0cnVjdFBhdGgsW1t0XSxyXSk7aSYmZS5hZGRPcChhLk9QUy5yZXN0b3JlLG51bGwpfWVsc2V7dmFyIHM9ZS5hcmdzQXJyYXlbbl07c1swXS5wdXNoKHQpO0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHNbMV0scil9fXBhcnNlQ29sb3JTcGFjZSh7Y3M6ZSxyZXNvdXJjZXM6dCxsb2NhbENvbG9yU3BhY2VDYWNoZTpyfSl7cmV0dXJuIHAuQ29sb3JTcGFjZS5wYXJzZUFzeW5jKHtjczplLHhyZWY6dGhpcy54cmVmLHJlc291cmNlczp0LHBkZkZ1bmN0aW9uRmFjdG9yeTp0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksbG9jYWxDb2xvclNwYWNlQ2FjaGU6cn0pLmNhdGNoKGU9PntpZihlIGluc3RhbmNlb2YgYS5BYm9ydEV4Y2VwdGlvbilyZXR1cm4gbnVsbDtpZih0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXt0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOmEuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JDb2xvclNwYWNlfSk7KDAsYS53YXJuKShgcGFyc2VDb2xvclNwYWNlIC0gaWdub3JpbmcgQ29sb3JTcGFjZTogIiR7ZX0iLmApO3JldHVybiBudWxsfXRocm93IGV9KX1hc3luYyBoYW5kbGVDb2xvck4oZSx0LHIsaSxzLG8sYyxsKXt2YXIgaCxkPXJbci5sZW5ndGgtMV07aWYoKDAsbi5pc05hbWUpKGQpJiYoaD1zLmdldChkLm5hbWUpKSl7dmFyIGY9KDAsbi5pc1N0cmVhbSkoaCk/aC5kaWN0OmgsZz1mLmdldCgiUGF0dGVyblR5cGUiKTtpZihnPT09eCl7dmFyIG09aS5iYXNlP2kuYmFzZS5nZXRSZ2IociwwKTpudWxsO3JldHVybiB0aGlzLmhhbmRsZVRpbGluZ1R5cGUodCxtLG8saCxmLGUsYyl9aWYoZz09PUEpe3ZhciBwPWYuZ2V0KCJTaGFkaW5nIiksYj1mLmdldEFycmF5KCJNYXRyaXgiKTtoPXUuUGF0dGVybi5wYXJzZVNoYWRpbmcocCxiLHRoaXMueHJlZixvLHRoaXMuaGFuZGxlcix0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksbCk7ZS5hZGRPcCh0LGguZ2V0SVIoKSk7cmV0dXJufXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbmtub3duIFBhdHRlcm5UeXBlOiAiK2cpfXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbmtub3duIFBhdHRlcm5OYW1lOiAiK2QpfWFzeW5jIHBhcnNlTWFya2VkQ29udGVudFByb3BzKGUsdCl7bGV0IHI7aWYoKDAsbi5pc05hbWUpKGUpKXtyPXQuZ2V0KCJQcm9wZXJ0aWVzIikuZ2V0KGUubmFtZSl9ZWxzZXtpZighKDAsbi5pc0RpY3QpKGUpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLiIpO3I9ZX1jb25zdCBpPXIuZ2V0KCJUeXBlIikubmFtZTtpZigiT0NHIj09PWkpcmV0dXJue3R5cGU6aSxpZDpyLm9iaklkfTtpZigiT0NNRCI9PT1pKXtjb25zdCBlPXIuZ2V0KCJPQ0dzIik7aWYoQXJyYXkuaXNBcnJheShlKXx8KDAsbi5pc0RpY3QpKGUpKXtjb25zdCB0PVtdO0FycmF5LmlzQXJyYXkoZSk/ci5nZXQoIk9DR3MiKS5mb3JFYWNoKGU9Pnt0LnB1c2goZS50b1N0cmluZygpKX0pOnQucHVzaChlLm9iaklkKTtsZXQgYT1udWxsO3IuZ2V0KCJWRSIpJiYoYT0hMCk7cmV0dXJue3R5cGU6aSxpZHM6dCxwb2xpY3k6KDAsbi5pc05hbWUpKHIuZ2V0KCJQIikpP3IuZ2V0KCJQIikubmFtZTpudWxsLGV4cHJlc3Npb246YX19aWYoKDAsbi5pc1JlZikoZSkpcmV0dXJue3R5cGU6aSxpZDplLnRvU3RyaW5nKCl9fXJldHVybiBudWxsfWdldE9wZXJhdG9yTGlzdCh7c3RyZWFtOmUsdGFzazp0LHJlc291cmNlczpyLG9wZXJhdG9yTGlzdDppLGluaXRpYWxTdGF0ZTpzPW51bGx9KXtyPXJ8fG4uRGljdC5lbXB0eTtzPXN8fG5ldyBFdmFsU3RhdGU7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCdnZXRPcGVyYXRvckxpc3Q6IG1pc3NpbmcgIm9wZXJhdG9yTGlzdCIgcGFyYW1ldGVyJyk7dmFyIG89dGhpcyxjPXRoaXMueHJlZjtsZXQgbD0hMTtjb25zdCBoPW5ldyBnLkxvY2FsSW1hZ2VDYWNoZSxkPW5ldyBnLkxvY2FsQ29sb3JTcGFjZUNhY2hlLGY9bmV3IGcuTG9jYWxHU3RhdGVDYWNoZTt2YXIgbT1yLmdldCgiWE9iamVjdCIpfHxuLkRpY3QuZW1wdHksYj1yLmdldCgiUGF0dGVybiIpfHxuLkRpY3QuZW1wdHkseT1uZXcgU3RhdGVNYW5hZ2VyKHMpLHY9bmV3IEV2YWx1YXRvclByZXByb2Nlc3NvcihlLGMseSksdz1uZXcgVGltZVNsb3RNYW5hZ2VyO2Z1bmN0aW9uIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoZSl7Zm9yKHZhciB0PTAscj12LnNhdmVkU3RhdGVzRGVwdGg7dDxyO3QrKylpLmFkZE9wKGEuT1BTLnJlc3RvcmUsW10pfXJldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24gcHJvbWlzZUJvZHkoZSxzKXtjb25zdCBuZXh0PWZ1bmN0aW9uKHQpe1Byb21pc2UuYWxsKFt0LGkucmVhZHldKS50aGVuKChmdW5jdGlvbigpe3RyeXtwcm9taXNlQm9keShlLHMpfWNhdGNoKGUpe3MoZSl9fSkscyl9O3QuZW5zdXJlTm90VGVybWluYXRlZCgpO3cucmVzZXQoKTtmb3IodmFyIGcsayxTLEMseCxBPXt9OyEoZz13LmNoZWNrKCkpOyl7QS5hcmdzPW51bGw7aWYoIXYucmVhZChBKSlicmVhazt2YXIgST1BLmFyZ3MsRj1BLmZuO3N3aXRjaCgwfEYpe2Nhc2UgYS5PUFMucGFpbnRYT2JqZWN0OmlmKHg9SVswXS5uYW1lKXtjb25zdCBlPWguZ2V0QnlOYW1lKHgpO2lmKGUpe2kuYWRkT3AoZS5mbixlLmFyZ3MpO0k9bnVsbDtjb250aW51ZX19bmV4dChuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxzKXtpZigheCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiWE9iamVjdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7bGV0IGw9bS5nZXRSYXcoeCk7aWYobCBpbnN0YW5jZW9mIG4uUmVmKXtjb25zdCB0PWguZ2V0QnlSZWYobCk7aWYodCl7aS5hZGRPcCh0LmZuLHQuYXJncyk7ZSgpO3JldHVybn1jb25zdCByPW8uZ2xvYmFsSW1hZ2VDYWNoZS5nZXREYXRhKGwsby5wYWdlSW5kZXgpO2lmKHIpe2kuYWRkRGVwZW5kZW5jeShyLm9iaklkKTtpLmFkZE9wKHIuZm4sci5hcmdzKTtlKCk7cmV0dXJufWw9Yy5mZXRjaChsKX1pZighKDAsbi5pc1N0cmVhbSkobCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7Y29uc3QgdT1sLmRpY3QuZ2V0KCJTdWJ0eXBlIik7aWYoISgwLG4uaXNOYW1lKSh1KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpO2lmKCJGb3JtIiE9PXUubmFtZSlpZigiSW1hZ2UiIT09dS5uYW1lKXtpZigiUFMiIT09dS5uYW1lKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbmhhbmRsZWQgWE9iamVjdCBzdWJ0eXBlICIrdS5uYW1lKTsoMCxhLmluZm8pKCJJZ25vcmVkIFhPYmplY3Qgc3VidHlwZSBQUyIpO2UoKX1lbHNlIG8uYnVpbGRQYWludEltYWdlWE9iamVjdCh7cmVzb3VyY2VzOnIsaW1hZ2U6bCxvcGVyYXRvckxpc3Q6aSxjYWNoZUtleTp4LGxvY2FsSW1hZ2VDYWNoZTpoLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmR9KS50aGVuKGUscyk7ZWxzZXt5LnNhdmUoKTtvLmJ1aWxkRm9ybVhPYmplY3QocixsLG51bGwsaSx0LHkuc3RhdGUuY2xvbmUoKSxkKS50aGVuKChmdW5jdGlvbigpe3kucmVzdG9yZSgpO2UoKX0pLHMpfX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7aWYoIShlIGluc3RhbmNlb2YgYS5BYm9ydEV4Y2VwdGlvbikpe2lmKCFvLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7by5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIse2ZlYXR1cmVJZDphLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yWE9iamVjdH0pOygwLGEud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke2V9Ii5gKX19KSkpO3JldHVybjtjYXNlIGEuT1BTLnNldEZvbnQ6dmFyIFA9SVsxXTtuZXh0KG8uaGFuZGxlU2V0Rm9udChyLEksbnVsbCxpLHQseS5zdGF0ZSkudGhlbigoZnVuY3Rpb24oZSl7aS5hZGREZXBlbmRlbmN5KGUpO2kuYWRkT3AoYS5PUFMuc2V0Rm9udCxbZSxQXSl9KSkpO3JldHVybjtjYXNlIGEuT1BTLmJlZ2luVGV4dDpsPSEwO2JyZWFrO2Nhc2UgYS5PUFMuZW5kVGV4dDpsPSExO2JyZWFrO2Nhc2UgYS5PUFMuZW5kSW5saW5lSW1hZ2U6dmFyIEU9SVswXS5jYWNoZUtleTtpZihFKXtjb25zdCBlPWguZ2V0QnlOYW1lKEUpO2lmKGUpe2kuYWRkT3AoZS5mbixlLmFyZ3MpO0k9bnVsbDtjb250aW51ZX19bmV4dChvLmJ1aWxkUGFpbnRJbWFnZVhPYmplY3Qoe3Jlc291cmNlczpyLGltYWdlOklbMF0saXNJbmxpbmU6ITAsb3BlcmF0b3JMaXN0OmksY2FjaGVLZXk6RSxsb2NhbEltYWdlQ2FjaGU6aCxsb2NhbENvbG9yU3BhY2VDYWNoZTpkfSkpO3JldHVybjtjYXNlIGEuT1BTLnNob3dUZXh0OmlmKCF5LnN0YXRlLmZvbnQpe28uZW5zdXJlU3RhdGVGb250KHkuc3RhdGUpO2NvbnRpbnVlfUlbMF09by5oYW5kbGVUZXh0KElbMF0seS5zdGF0ZSk7YnJlYWs7Y2FzZSBhLk9QUy5zaG93U3BhY2VkVGV4dDppZigheS5zdGF0ZS5mb250KXtvLmVuc3VyZVN0YXRlRm9udCh5LnN0YXRlKTtjb250aW51ZX12YXIgQj1JWzBdLE89W10sTT1CLmxlbmd0aCxEPXkuc3RhdGU7Zm9yKGs9MDtrPE07KytrKXt2YXIgUj1CW2tdOygwLGEuaXNTdHJpbmcpKFIpP0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KE8sby5oYW5kbGVUZXh0KFIsRCkpOigwLGEuaXNOdW0pKFIpJiZPLnB1c2goUil9SVswXT1PO0Y9YS5PUFMuc2hvd1RleHQ7YnJlYWs7Y2FzZSBhLk9QUy5uZXh0TGluZVNob3dUZXh0OmlmKCF5LnN0YXRlLmZvbnQpe28uZW5zdXJlU3RhdGVGb250KHkuc3RhdGUpO2NvbnRpbnVlfWkuYWRkT3AoYS5PUFMubmV4dExpbmUpO0lbMF09by5oYW5kbGVUZXh0KElbMF0seS5zdGF0ZSk7Rj1hLk9QUy5zaG93VGV4dDticmVhaztjYXNlIGEuT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OmlmKCF5LnN0YXRlLmZvbnQpe28uZW5zdXJlU3RhdGVGb250KHkuc3RhdGUpO2NvbnRpbnVlfWkuYWRkT3AoYS5PUFMubmV4dExpbmUpO2kuYWRkT3AoYS5PUFMuc2V0V29yZFNwYWNpbmcsW0kuc2hpZnQoKV0pO2kuYWRkT3AoYS5PUFMuc2V0Q2hhclNwYWNpbmcsW0kuc2hpZnQoKV0pO0lbMF09by5oYW5kbGVUZXh0KElbMF0seS5zdGF0ZSk7Rj1hLk9QUy5zaG93VGV4dDticmVhaztjYXNlIGEuT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOnkuc3RhdGUudGV4dFJlbmRlcmluZ01vZGU9SVswXTticmVhaztjYXNlIGEuT1BTLnNldEZpbGxDb2xvclNwYWNlOntjb25zdCBlPXAuQ29sb3JTcGFjZS5nZXRDYWNoZWQoSVswXSxjLGQpO2lmKGUpe3kuc3RhdGUuZmlsbENvbG9yU3BhY2U9ZTtjb250aW51ZX1uZXh0KG8ucGFyc2VDb2xvclNwYWNlKHtjczpJWzBdLHJlc291cmNlczpyLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmR9KS50aGVuKChmdW5jdGlvbihlKXtlJiYoeS5zdGF0ZS5maWxsQ29sb3JTcGFjZT1lKX0pKSk7cmV0dXJufWNhc2UgYS5PUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZTp7Y29uc3QgZT1wLkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKElbMF0sYyxkKTtpZihlKXt5LnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9ZTtjb250aW51ZX1uZXh0KG8ucGFyc2VDb2xvclNwYWNlKHtjczpJWzBdLHJlc291cmNlczpyLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmR9KS50aGVuKChmdW5jdGlvbihlKXtlJiYoeS5zdGF0ZS5zdHJva2VDb2xvclNwYWNlPWUpfSkpKTtyZXR1cm59Y2FzZSBhLk9QUy5zZXRGaWxsQ29sb3I6ST0oQz15LnN0YXRlLmZpbGxDb2xvclNwYWNlKS5nZXRSZ2IoSSwwKTtGPWEuT1BTLnNldEZpbGxSR0JDb2xvcjticmVhaztjYXNlIGEuT1BTLnNldFN0cm9rZUNvbG9yOkk9KEM9eS5zdGF0ZS5zdHJva2VDb2xvclNwYWNlKS5nZXRSZ2IoSSwwKTtGPWEuT1BTLnNldFN0cm9rZVJHQkNvbG9yO2JyZWFrO2Nhc2UgYS5PUFMuc2V0RmlsbEdyYXk6eS5zdGF0ZS5maWxsQ29sb3JTcGFjZT1wLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5O0k9cC5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2IoSSwwKTtGPWEuT1BTLnNldEZpbGxSR0JDb2xvcjticmVhaztjYXNlIGEuT1BTLnNldFN0cm9rZUdyYXk6eS5zdGF0ZS5zdHJva2VDb2xvclNwYWNlPXAuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7ST1wLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYihJLDApO0Y9YS5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7YnJlYWs7Y2FzZSBhLk9QUy5zZXRGaWxsQ01ZS0NvbG9yOnkuc3RhdGUuZmlsbENvbG9yU3BhY2U9cC5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215aztJPXAuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKEksMCk7Rj1hLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSBhLk9QUy5zZXRTdHJva2VDTVlLQ29sb3I6eS5zdGF0ZS5zdHJva2VDb2xvclNwYWNlPXAuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWs7ST1wLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYihJLDApO0Y9YS5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7YnJlYWs7Y2FzZSBhLk9QUy5zZXRGaWxsUkdCQ29sb3I6eS5zdGF0ZS5maWxsQ29sb3JTcGFjZT1wLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7ST1wLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKEksMCk7YnJlYWs7Y2FzZSBhLk9QUy5zZXRTdHJva2VSR0JDb2xvcjp5LnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9cC5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiO0k9cC5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihJLDApO2JyZWFrO2Nhc2UgYS5PUFMuc2V0RmlsbENvbG9yTjppZigiUGF0dGVybiI9PT0oQz15LnN0YXRlLmZpbGxDb2xvclNwYWNlKS5uYW1lKXtuZXh0KG8uaGFuZGxlQ29sb3JOKGksYS5PUFMuc2V0RmlsbENvbG9yTixJLEMsYixyLHQsZCkpO3JldHVybn1JPUMuZ2V0UmdiKEksMCk7Rj1hLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSBhLk9QUy5zZXRTdHJva2VDb2xvck46aWYoIlBhdHRlcm4iPT09KEM9eS5zdGF0ZS5zdHJva2VDb2xvclNwYWNlKS5uYW1lKXtuZXh0KG8uaGFuZGxlQ29sb3JOKGksYS5PUFMuc2V0U3Ryb2tlQ29sb3JOLEksQyxiLHIsdCxkKSk7cmV0dXJufUk9Qy5nZXRSZ2IoSSwwKTtGPWEuT1BTLnNldFN0cm9rZVJHQkNvbG9yO2JyZWFrO2Nhc2UgYS5PUFMuc2hhZGluZ0ZpbGw6dmFyIE49ci5nZXQoIlNoYWRpbmciKTtpZighTil0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTm8gc2hhZGluZyByZXNvdXJjZSBmb3VuZCIpO3ZhciBMPU4uZ2V0KElbMF0ubmFtZSk7aWYoIUwpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIk5vIHNoYWRpbmcgb2JqZWN0IGZvdW5kIik7ST1bdS5QYXR0ZXJuLnBhcnNlU2hhZGluZyhMLG51bGwsYyxyLG8uaGFuZGxlcixvLl9wZGZGdW5jdGlvbkZhY3RvcnksZCkuZ2V0SVIoKV07Rj1hLk9QUy5zaGFkaW5nRmlsbDticmVhaztjYXNlIGEuT1BTLnNldEdTdGF0ZTppZih4PUlbMF0ubmFtZSl7Y29uc3QgZT1mLmdldEJ5TmFtZSh4KTtpZihlKXtlLmxlbmd0aD4wJiZpLmFkZE9wKGEuT1BTLnNldEdTdGF0ZSxbZV0pO0k9bnVsbDtjb250aW51ZX19bmV4dChuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxzKXtpZigheCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTtjb25zdCBjPXIuZ2V0KCJFeHRHU3RhdGUiKTtpZighKGMgaW5zdGFuY2VvZiBuLkRpY3QpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJFeHRHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTtjb25zdCBsPWMuZ2V0KHgpO2lmKCEobCBpbnN0YW5jZW9mIG4uRGljdCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpO28uc2V0R1N0YXRlKHtyZXNvdXJjZXM6cixnU3RhdGU6bCxvcGVyYXRvckxpc3Q6aSxjYWNoZUtleTp4LHRhc2s6dCxzdGF0ZU1hbmFnZXI6eSxsb2NhbEdTdGF0ZUNhY2hlOmYsbG9jYWxDb2xvclNwYWNlQ2FjaGU6ZH0pLnRoZW4oZSxzKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7aWYoIShlIGluc3RhbmNlb2YgYS5BYm9ydEV4Y2VwdGlvbikpe2lmKCFvLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7by5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIse2ZlYXR1cmVJZDphLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRXh0R1N0YXRlfSk7KDAsYS53YXJuKShgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtlfSIuYCl9fSkpKTtyZXR1cm47Y2FzZSBhLk9QUy5tb3ZlVG86Y2FzZSBhLk9QUy5saW5lVG86Y2FzZSBhLk9QUy5jdXJ2ZVRvOmNhc2UgYS5PUFMuY3VydmVUbzI6Y2FzZSBhLk9QUy5jdXJ2ZVRvMzpjYXNlIGEuT1BTLmNsb3NlUGF0aDpjYXNlIGEuT1BTLnJlY3RhbmdsZTpvLmJ1aWxkUGF0aChpLEYsSSxsKTtjb250aW51ZTtjYXNlIGEuT1BTLm1hcmtQb2ludDpjYXNlIGEuT1BTLm1hcmtQb2ludFByb3BzOmNhc2UgYS5PUFMuYmVnaW5Db21wYXQ6Y2FzZSBhLk9QUy5lbmRDb21wYXQ6Y29udGludWU7Y2FzZSBhLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wczppZighKDAsbi5pc05hbWUpKElbMF0pKXsoMCxhLndhcm4pKCJFeHBlY3RlZCBuYW1lIGZvciBiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyBhcmcwPSIrSVswXSk7Y29udGludWV9aWYoIk9DIj09PUlbMF0ubmFtZSl7bmV4dChvLnBhcnNlTWFya2VkQ29udGVudFByb3BzKElbMV0scikudGhlbihlPT57aS5hZGRPcChhLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyxbIk9DIixlXSl9KS5jYXRjaChlPT57aWYoIShlIGluc3RhbmNlb2YgYS5BYm9ydEV4Y2VwdGlvbikpe2lmKCFvLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7by5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIse2ZlYXR1cmVJZDphLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yTWFya2VkQ29udGVudH0pOygwLGEud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiAiJHtlfSIuYCl9fSkpO3JldHVybn1JPVtJWzBdLm5hbWVdO2JyZWFrO2Nhc2UgYS5PUFMuYmVnaW5NYXJrZWRDb250ZW50OmNhc2UgYS5PUFMuZW5kTWFya2VkQ29udGVudDpkZWZhdWx0OmlmKG51bGwhPT1JKXtmb3Ioaz0wLFM9SS5sZW5ndGg7azxTJiYhKElba11pbnN0YW5jZW9mIG4uRGljdCk7aysrKTtpZihrPFMpeygwLGEud2FybikoImdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIG9wZXJhdG9yOiAiK0YpO2NvbnRpbnVlfX19aS5hZGRPcChGLEkpfWlmKGcpbmV4dChUKTtlbHNle2Nsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTtlKCl9fSkpLmNhdGNoKGU9PntpZighKGUgaW5zdGFuY2VvZiBhLkFib3J0RXhjZXB0aW9uKSl7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTt0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOmEuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JPcGVyYXRvckxpc3R9KTsoMCxhLndhcm4pKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICIke3QubmFtZX0iIHRhc2s6ICIke2V9Ii5gKTtjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCl9fSl9Z2V0VGV4dENvbnRlbnQoe3N0cmVhbTplLHRhc2s6dCxyZXNvdXJjZXM6cixzdGF0ZU1hbmFnZXI6aT1udWxsLG5vcm1hbGl6ZVdoaXRlc3BhY2U6cz0hMSxjb21iaW5lVGV4dEl0ZW1zOm89ITEsc2luazpjLHNlZW5TdHlsZXM6aD1PYmplY3QuY3JlYXRlKG51bGwpfSl7cj1yfHxuLkRpY3QuZW1wdHk7aT1pfHxuZXcgU3RhdGVNYW5hZ2VyKG5ldyBUZXh0U3RhdGUpO3ZhciB1PS9ccy9nLGQ9e2l0ZW1zOltdLHN0eWxlczpPYmplY3QuY3JlYXRlKG51bGwpfSxmPXtpbml0aWFsaXplZDohMSxzdHI6W10sd2lkdGg6MCxoZWlnaHQ6MCx2ZXJ0aWNhbDohMSxsYXN0QWR2YW5jZVdpZHRoOjAsbGFzdEFkdmFuY2VIZWlnaHQ6MCx0ZXh0QWR2YW5jZVNjYWxlOjAsc3BhY2VXaWR0aDowLGZha2VTcGFjZU1pbjoxLzAsZmFrZU11bHRpU3BhY2VNaW46MS8wLGZha2VNdWx0aVNwYWNlTWF4Oi0wLHRleHRSdW5CcmVha0FsbG93ZWQ6ITEsdHJhbnNmb3JtOm51bGwsZm9udE5hbWU6bnVsbH0scD10aGlzLGI9dGhpcy54cmVmLHk9bnVsbDtjb25zdCB2PW5ldyBnLkxvY2FsSW1hZ2VDYWNoZSx3PW5ldyBnLkxvY2FsR1N0YXRlQ2FjaGU7dmFyIGssUz1uZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKGUsYixpKTtmdW5jdGlvbiBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKXtpZihmLmluaXRpYWxpemVkKXJldHVybiBmO3ZhciBlPWsuZm9udDtpZighKGUubG9hZGVkTmFtZSBpbiBoKSl7aFtlLmxvYWRlZE5hbWVdPSEwO2Quc3R5bGVzW2UubG9hZGVkTmFtZV09e2ZvbnRGYW1pbHk6ZS5mYWxsYmFja05hbWUsYXNjZW50OmUuYXNjZW50LGRlc2NlbnQ6ZS5kZXNjZW50LHZlcnRpY2FsOmUudmVydGljYWx9fWYuZm9udE5hbWU9ZS5sb2FkZWROYW1lO3ZhciB0PVtrLmZvbnRTaXplKmsudGV4dEhTY2FsZSwwLDAsay5mb250U2l6ZSwwLGsudGV4dFJpc2VdO2lmKGUuaXNUeXBlM0ZvbnQmJmsuZm9udFNpemU8PTEmJiEoMCxhLmlzQXJyYXlFcXVhbCkoay5mb250TWF0cml4LGEuRk9OVF9JREVOVElUWV9NQVRSSVgpKXtjb25zdCByPWUuYmJveFszXS1lLmJib3hbMV07cj4wJiYodFszXSo9ciprLmZvbnRNYXRyaXhbM10pfXZhciByPWEuVXRpbC50cmFuc2Zvcm0oay5jdG0sYS5VdGlsLnRyYW5zZm9ybShrLnRleHRNYXRyaXgsdCkpO2YudHJhbnNmb3JtPXI7aWYoZS52ZXJ0aWNhbCl7Zi53aWR0aD1NYXRoLnNxcnQoclswXSpyWzBdK3JbMV0qclsxXSk7Zi5oZWlnaHQ9MDtmLnZlcnRpY2FsPSEwfWVsc2V7Zi53aWR0aD0wO2YuaGVpZ2h0PU1hdGguc3FydChyWzJdKnJbMl0rclszXSpyWzNdKTtmLnZlcnRpY2FsPSExfXZhciBpPWsudGV4dExpbmVNYXRyaXhbMF0sbj1rLnRleHRMaW5lTWF0cml4WzFdLHM9TWF0aC5zcXJ0KGkqaStuKm4pO2k9ay5jdG1bMF07bj1rLmN0bVsxXTt2YXIgbz1NYXRoLnNxcnQoaSppK24qbik7Zi50ZXh0QWR2YW5jZVNjYWxlPW8qcztmLmxhc3RBZHZhbmNlV2lkdGg9MDtmLmxhc3RBZHZhbmNlSGVpZ2h0PTA7dmFyIGM9ZS5zcGFjZVdpZHRoLzFlMyprLmZvbnRTaXplO2lmKGMpe2Yuc3BhY2VXaWR0aD1jO2YuZmFrZVNwYWNlTWluPS4zKmM7Zi5mYWtlTXVsdGlTcGFjZU1pbj0xLjUqYztmLmZha2VNdWx0aVNwYWNlTWF4PTQqYztmLnRleHRSdW5CcmVha0FsbG93ZWQ9IWUuaXNNb25vc3BhY2V9ZWxzZXtmLnNwYWNlV2lkdGg9MDtmLmZha2VTcGFjZU1pbj0xLzA7Zi5mYWtlTXVsdGlTcGFjZU1pbj0xLzA7Zi5mYWtlTXVsdGlTcGFjZU1heD0wO2YudGV4dFJ1bkJyZWFrQWxsb3dlZD0hMX1mLmluaXRpYWxpemVkPSEwO3JldHVybiBmfWZ1bmN0aW9uIHJlcGxhY2VXaGl0ZXNwYWNlKGUpe2Zvcih2YXIgdCxyPTAsYT1lLmxlbmd0aDtyPGEmJih0PWUuY2hhckNvZGVBdChyKSk+PTMyJiZ0PD0xMjc7KXIrKztyZXR1cm4gcjxhP2UucmVwbGFjZSh1LCIgIik6ZX1mdW5jdGlvbiBoYW5kbGVTZXRGb250KGUsdCl7cmV0dXJuIHAubG9hZEZvbnQoZSx0LHIpLnRoZW4oKGZ1bmN0aW9uKGUpe2suZm9udD1lLmZvbnQ7ay5mb250TWF0cml4PWUuZm9udC5mb250TWF0cml4fHxhLkZPTlRfSURFTlRJVFlfTUFUUklYfSkpfWZ1bmN0aW9uIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGUpe2Zvcih2YXIgdD1rLmZvbnQscj1lbnN1cmVUZXh0Q29udGVudEl0ZW0oKSxhPTAsaT0wLG49dC5jaGFyc1RvR2x5cGhzKGUpLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIG89bltzXSxjPW51bGw7Yz10LnZlcnRpY2FsJiZvLnZtZXRyaWM/by52bWV0cmljWzBdOm8ud2lkdGg7dmFyIGg9by51bmljb2RlLHU9KDAsbC5nZXROb3JtYWxpemVkVW5pY29kZXMpKCk7dm9pZCAwIT09dVtoXSYmKGg9dVtoXSk7aD0oMCxsLnJldmVyc2VJZlJ0bCkoaCk7dmFyIGQ9ay5jaGFyU3BhY2luZztpZihvLmlzU3BhY2Upe3ZhciBmPWsud29yZFNwYWNpbmc7ZCs9ZjtmPjAmJmFkZEZha2VTcGFjZXMoZixyLnN0cil9dmFyIGc9MCxtPTA7aWYodC52ZXJ0aWNhbCl7aSs9bT1jKmsuZm9udE1hdHJpeFswXSprLmZvbnRTaXplK2R9ZWxzZXthKz1nPShjKmsuZm9udE1hdHJpeFswXSprLmZvbnRTaXplK2QpKmsudGV4dEhTY2FsZX1rLnRyYW5zbGF0ZVRleHRNYXRyaXgoZyxtKTtyLnN0ci5wdXNoKGgpfWlmKHQudmVydGljYWwpe3IubGFzdEFkdmFuY2VIZWlnaHQ9aTtyLmhlaWdodCs9TWF0aC5hYnMoaSl9ZWxzZXtyLmxhc3RBZHZhbmNlV2lkdGg9YTtyLndpZHRoKz1hfXJldHVybiByfWZ1bmN0aW9uIGFkZEZha2VTcGFjZXMoZSx0KXtpZighKGU8Zi5mYWtlU3BhY2VNaW4pKWlmKGU8Zi5mYWtlTXVsdGlTcGFjZU1pbil0LnB1c2goIiAiKTtlbHNlIGZvcih2YXIgcj1NYXRoLnJvdW5kKGUvZi5zcGFjZVdpZHRoKTtyLS0gPjA7KXQucHVzaCgiICIpfWZ1bmN0aW9uIGZsdXNoVGV4dENvbnRlbnRJdGVtKCl7aWYoZi5pbml0aWFsaXplZCl7Zi52ZXJ0aWNhbD9mLmhlaWdodCo9Zi50ZXh0QWR2YW5jZVNjYWxlOmYud2lkdGgqPWYudGV4dEFkdmFuY2VTY2FsZTtkLml0ZW1zLnB1c2goZnVuY3Rpb24gcnVuQmlkaVRyYW5zZm9ybShlKXt2YXIgdD1lLnN0ci5qb2luKCIiKSxyPSgwLG0uYmlkaSkodCwtMSxlLnZlcnRpY2FsKTtyZXR1cm57c3RyOnM/cmVwbGFjZVdoaXRlc3BhY2Uoci5zdHIpOnIuc3RyLGRpcjpyLmRpcix3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCx0cmFuc2Zvcm06ZS50cmFuc2Zvcm0sZm9udE5hbWU6ZS5mb250TmFtZX19KGYpKTtmLmluaXRpYWxpemVkPSExO2Yuc3RyLmxlbmd0aD0wfX1mdW5jdGlvbiBlbnF1ZXVlQ2h1bmsoKXtjb25zdCBlPWQuaXRlbXMubGVuZ3RoO2lmKGU+MCl7Yy5lbnF1ZXVlKGQsZSk7ZC5pdGVtcz1bXTtkLnN0eWxlcz1PYmplY3QuY3JlYXRlKG51bGwpfX12YXIgQz1uZXcgVGltZVNsb3RNYW5hZ2VyO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24gcHJvbWlzZUJvZHkoZSxsKXtjb25zdCBuZXh0PWZ1bmN0aW9uKHQpe2VucXVldWVDaHVuaygpO1Byb21pc2UuYWxsKFt0LGMucmVhZHldKS50aGVuKChmdW5jdGlvbigpe3RyeXtwcm9taXNlQm9keShlLGwpfWNhdGNoKGUpe2woZSl9fSksbCl9O3QuZW5zdXJlTm90VGVybWluYXRlZCgpO0MucmVzZXQoKTtmb3IodmFyIHUsZz17fSxtPVtdOyEodT1DLmNoZWNrKCkpOyl7bS5sZW5ndGg9MDtnLmFyZ3M9bTtpZighUy5yZWFkKGcpKWJyZWFrO2s9aS5zdGF0ZTt2YXIgeCxBPWcuZm47bT1nLmFyZ3M7c3dpdGNoKDB8QSl7Y2FzZSBhLk9QUy5zZXRGb250OnZhciBJPW1bMF0ubmFtZSxGPW1bMV07aWYoay5mb250JiZJPT09ay5mb250TmFtZSYmRj09PWsuZm9udFNpemUpYnJlYWs7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtrLmZvbnROYW1lPUk7ay5mb250U2l6ZT1GO25leHQoaGFuZGxlU2V0Rm9udChJLG51bGwpKTtyZXR1cm47Y2FzZSBhLk9QUy5zZXRUZXh0UmlzZTpmbHVzaFRleHRDb250ZW50SXRlbSgpO2sudGV4dFJpc2U9bVswXTticmVhaztjYXNlIGEuT1BTLnNldEhTY2FsZTpmbHVzaFRleHRDb250ZW50SXRlbSgpO2sudGV4dEhTY2FsZT1tWzBdLzEwMDticmVhaztjYXNlIGEuT1BTLnNldExlYWRpbmc6Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtrLmxlYWRpbmc9bVswXTticmVhaztjYXNlIGEuT1BTLm1vdmVUZXh0OnZhciBQPSEhay5mb250JiYwPT09KGsuZm9udC52ZXJ0aWNhbD9tWzBdOm1bMV0pO3g9bVswXS1tWzFdO2lmKG8mJlAmJmYuaW5pdGlhbGl6ZWQmJng+MCYmeDw9Zi5mYWtlTXVsdGlTcGFjZU1heCl7ay50cmFuc2xhdGVUZXh0TGluZU1hdHJpeChtWzBdLG1bMV0pO2Yud2lkdGgrPW1bMF0tZi5sYXN0QWR2YW5jZVdpZHRoO2YuaGVpZ2h0Kz1tWzFdLWYubGFzdEFkdmFuY2VIZWlnaHQ7YWRkRmFrZVNwYWNlcyhtWzBdLWYubGFzdEFkdmFuY2VXaWR0aC0obVsxXS1mLmxhc3RBZHZhbmNlSGVpZ2h0KSxmLnN0cik7YnJlYWt9Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtrLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KG1bMF0sbVsxXSk7ay50ZXh0TWF0cml4PWsudGV4dExpbmVNYXRyaXguc2xpY2UoKTticmVhaztjYXNlIGEuT1BTLnNldExlYWRpbmdNb3ZlVGV4dDpmbHVzaFRleHRDb250ZW50SXRlbSgpO2subGVhZGluZz0tbVsxXTtrLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KG1bMF0sbVsxXSk7ay50ZXh0TWF0cml4PWsudGV4dExpbmVNYXRyaXguc2xpY2UoKTticmVhaztjYXNlIGEuT1BTLm5leHRMaW5lOmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7ay5jYXJyaWFnZVJldHVybigpO2JyZWFrO2Nhc2UgYS5PUFMuc2V0VGV4dE1hdHJpeDp4PWsuY2FsY1RleHRMaW5lTWF0cml4QWR2YW5jZShtWzBdLG1bMV0sbVsyXSxtWzNdLG1bNF0sbVs1XSk7aWYobyYmbnVsbCE9PXgmJmYuaW5pdGlhbGl6ZWQmJngudmFsdWU+MCYmeC52YWx1ZTw9Zi5mYWtlTXVsdGlTcGFjZU1heCl7ay50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCh4LndpZHRoLHguaGVpZ2h0KTtmLndpZHRoKz14LndpZHRoLWYubGFzdEFkdmFuY2VXaWR0aDtmLmhlaWdodCs9eC5oZWlnaHQtZi5sYXN0QWR2YW5jZUhlaWdodDthZGRGYWtlU3BhY2VzKHgud2lkdGgtZi5sYXN0QWR2YW5jZVdpZHRoLSh4LmhlaWdodC1mLmxhc3RBZHZhbmNlSGVpZ2h0KSxmLnN0cik7YnJlYWt9Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtrLnNldFRleHRNYXRyaXgobVswXSxtWzFdLG1bMl0sbVszXSxtWzRdLG1bNV0pO2suc2V0VGV4dExpbmVNYXRyaXgobVswXSxtWzFdLG1bMl0sbVszXSxtWzRdLG1bNV0pO2JyZWFrO2Nhc2UgYS5PUFMuc2V0Q2hhclNwYWNpbmc6ay5jaGFyU3BhY2luZz1tWzBdO2JyZWFrO2Nhc2UgYS5PUFMuc2V0V29yZFNwYWNpbmc6ay53b3JkU3BhY2luZz1tWzBdO2JyZWFrO2Nhc2UgYS5PUFMuYmVnaW5UZXh0OmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7ay50ZXh0TWF0cml4PWEuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7ay50ZXh0TGluZU1hdHJpeD1hLklERU5USVRZX01BVFJJWC5zbGljZSgpO2JyZWFrO2Nhc2UgYS5PUFMuc2hvd1NwYWNlZFRleHQ6aWYoIWkuc3RhdGUuZm9udCl7cC5lbnN1cmVTdGF0ZUZvbnQoaS5zdGF0ZSk7Y29udGludWV9Zm9yKHZhciBFLEI9bVswXSxPPTAsTT1CLmxlbmd0aDtPPE07TysrKWlmKCJzdHJpbmciPT10eXBlb2YgQltPXSlidWlsZFRleHRDb250ZW50SXRlbShCW09dKTtlbHNlIGlmKCgwLGEuaXNOdW0pKEJbT10pKXtlbnN1cmVUZXh0Q29udGVudEl0ZW0oKTt4PUJbT10qay5mb250U2l6ZS8xZTM7dmFyIEQ9ITE7aWYoay5mb250LnZlcnRpY2FsKXtFPXg7ay50cmFuc2xhdGVUZXh0TWF0cml4KDAsRSk7KEQ9Zi50ZXh0UnVuQnJlYWtBbGxvd2VkJiZ4PmYuZmFrZU11bHRpU3BhY2VNYXgpfHwoZi5oZWlnaHQrPUUpfWVsc2V7RT0oeD0teCkqay50ZXh0SFNjYWxlO2sudHJhbnNsYXRlVGV4dE1hdHJpeChFLDApOyhEPWYudGV4dFJ1bkJyZWFrQWxsb3dlZCYmeD5mLmZha2VNdWx0aVNwYWNlTWF4KXx8KGYud2lkdGgrPUUpfUQ/Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTp4PjAmJmFkZEZha2VTcGFjZXMoeCxmLnN0cil9YnJlYWs7Y2FzZSBhLk9QUy5zaG93VGV4dDppZighaS5zdGF0ZS5mb250KXtwLmVuc3VyZVN0YXRlRm9udChpLnN0YXRlKTtjb250aW51ZX1idWlsZFRleHRDb250ZW50SXRlbShtWzBdKTticmVhaztjYXNlIGEuT1BTLm5leHRMaW5lU2hvd1RleHQ6aWYoIWkuc3RhdGUuZm9udCl7cC5lbnN1cmVTdGF0ZUZvbnQoaS5zdGF0ZSk7Y29udGludWV9Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtrLmNhcnJpYWdlUmV0dXJuKCk7YnVpbGRUZXh0Q29udGVudEl0ZW0obVswXSk7YnJlYWs7Y2FzZSBhLk9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDppZighaS5zdGF0ZS5mb250KXtwLmVuc3VyZVN0YXRlRm9udChpLnN0YXRlKTtjb250aW51ZX1mbHVzaFRleHRDb250ZW50SXRlbSgpO2sud29yZFNwYWNpbmc9bVswXTtrLmNoYXJTcGFjaW5nPW1bMV07ay5jYXJyaWFnZVJldHVybigpO2J1aWxkVGV4dENvbnRlbnRJdGVtKG1bMl0pO2JyZWFrO2Nhc2UgYS5PUFMucGFpbnRYT2JqZWN0OmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7eXx8KHk9ci5nZXQoIlhPYmplY3QiKXx8bi5EaWN0LmVtcHR5KTt2YXIgUj1tWzBdLm5hbWU7aWYoUiYmdi5nZXRCeU5hbWUoUikpYnJlYWs7bmV4dChuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxsKXtpZighUil0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiWE9iamVjdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7bGV0IHU9eS5nZXRSYXcoUik7aWYodSBpbnN0YW5jZW9mIG4uUmVmKXtpZih2LmdldEJ5UmVmKHUpKXtlKCk7cmV0dXJufXU9Yi5mZXRjaCh1KX1pZighKDAsbi5pc1N0cmVhbSkodSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7Y29uc3QgZD11LmRpY3QuZ2V0KCJTdWJ0eXBlIik7aWYoISgwLG4uaXNOYW1lKShkKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpO2lmKCJGb3JtIiE9PWQubmFtZSl7di5zZXQoUix1LmRpY3Qub2JqSWQsITApO2UoKTtyZXR1cm59Y29uc3QgZj1pLnN0YXRlLmNsb25lKCksZz1uZXcgU3RhdGVNYW5hZ2VyKGYpLG09dS5kaWN0LmdldEFycmF5KCJNYXRyaXgiKTtBcnJheS5pc0FycmF5KG0pJiY2PT09bS5sZW5ndGgmJmcudHJhbnNmb3JtKG0pO2VucXVldWVDaHVuaygpO2NvbnN0IHc9e2VucXVldWVJbnZva2VkOiExLGVucXVldWUoZSx0KXt0aGlzLmVucXVldWVJbnZva2VkPSEwO2MuZW5xdWV1ZShlLHQpfSxnZXQgZGVzaXJlZFNpemUoKXtyZXR1cm4gYy5kZXNpcmVkU2l6ZX0sZ2V0IHJlYWR5KCl7cmV0dXJuIGMucmVhZHl9fTtwLmdldFRleHRDb250ZW50KHtzdHJlYW06dSx0YXNrOnQscmVzb3VyY2VzOnUuZGljdC5nZXQoIlJlc291cmNlcyIpfHxyLHN0YXRlTWFuYWdlcjpnLG5vcm1hbGl6ZVdoaXRlc3BhY2U6cyxjb21iaW5lVGV4dEl0ZW1zOm8sc2luazp3LHNlZW5TdHlsZXM6aH0pLnRoZW4oKGZ1bmN0aW9uKCl7dy5lbnF1ZXVlSW52b2tlZHx8di5zZXQoUix1LmRpY3Qub2JqSWQsITApO2UoKX0pLGwpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBhLkFib3J0RXhjZXB0aW9uKSl7aWYoIXAub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxhLndhcm4pKGBnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke2V9Ii5gKX19KSkpO3JldHVybjtjYXNlIGEuT1BTLnNldEdTdGF0ZTppZigoUj1tWzBdLm5hbWUpJiZ3LmdldEJ5TmFtZShSKSlicmVhaztuZXh0KG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe2lmKCFSKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJHU3RhdGUgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpO2NvbnN0IGk9ci5nZXQoIkV4dEdTdGF0ZSIpO2lmKCEoaSBpbnN0YW5jZW9mIG4uRGljdCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkV4dEdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpO2NvbnN0IHM9aS5nZXQoUik7aWYoIShzIGluc3RhbmNlb2Ygbi5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7Y29uc3Qgbz1zLmdldCgiRm9udCIpO2lmKG8pe2ZsdXNoVGV4dENvbnRlbnRJdGVtKCk7ay5mb250TmFtZT1udWxsO2suZm9udFNpemU9b1sxXTtoYW5kbGVTZXRGb250KG51bGwsb1swXSkudGhlbihlLHQpfWVsc2V7dy5zZXQoUixzLm9iaklkLCEwKTtlKCl9fSkpLmNhdGNoKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBhLkFib3J0RXhjZXB0aW9uKSl7aWYoIXAub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxhLndhcm4pKGBnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7ZX0iLmApfX0pKSk7cmV0dXJufWlmKGQuaXRlbXMubGVuZ3RoPj1jLmRlc2lyZWRTaXplKXt1PSEwO2JyZWFrfX1pZih1KW5leHQoVCk7ZWxzZXtmbHVzaFRleHRDb250ZW50SXRlbSgpO2VucXVldWVDaHVuaygpO2UoKX19KSkuY2F0Y2goZT0+e2lmKCEoZSBpbnN0YW5jZW9mIGEuQWJvcnRFeGNlcHRpb24pKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLGEud2FybikoYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJHt0Lm5hbWV9IiB0YXNrOiAiJHtlfSIuYCk7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtlbnF1ZXVlQ2h1bmsoKX19KX1leHRyYWN0RGF0YVN0cnVjdHVyZXMoZSx0LHIpe2NvbnN0IGk9dGhpcy54cmVmO2xldCBjO3ZhciBsPWUuZ2V0KCJUb1VuaWNvZGUiKXx8dC5nZXQoIlRvVW5pY29kZSIpLGg9bD90aGlzLnJlYWRUb1VuaWNvZGUobCk6UHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7aWYoci5jb21wb3NpdGUpe3ZhciB1PWUuZ2V0KCJDSURTeXN0ZW1JbmZvIik7KDAsbi5pc0RpY3QpKHUpJiYoci5jaWRTeXN0ZW1JbmZvPXtyZWdpc3RyeTooMCxhLnN0cmluZ1RvUERGU3RyaW5nKSh1LmdldCgiUmVnaXN0cnkiKSksb3JkZXJpbmc6KDAsYS5zdHJpbmdUb1BERlN0cmluZykodS5nZXQoIk9yZGVyaW5nIikpLHN1cHBsZW1lbnQ6dS5nZXQoIlN1cHBsZW1lbnQiKX0pO3ZhciBkPWUuZ2V0KCJDSURUb0dJRE1hcCIpOygwLG4uaXNTdHJlYW0pKGQpJiYoYz1kLmdldEJ5dGVzKCkpfXZhciBmLGc9W10sbT1udWxsO2lmKGUuaGFzKCJFbmNvZGluZyIpKXtmPWUuZ2V0KCJFbmNvZGluZyIpO2lmKCgwLG4uaXNEaWN0KShmKSl7bT1mLmdldCgiQmFzZUVuY29kaW5nIik7bT0oMCxuLmlzTmFtZSkobSk/bS5uYW1lOm51bGw7aWYoZi5oYXMoIkRpZmZlcmVuY2VzIikpZm9yKHZhciBwPWYuZ2V0KCJEaWZmZXJlbmNlcyIpLGI9MCx5PTAsdj1wLmxlbmd0aDt5PHY7eSsrKXt2YXIgdz1pLmZldGNoSWZSZWYocFt5XSk7aWYoKDAsYS5pc051bSkodykpYj13O2Vsc2V7aWYoISgwLG4uaXNOYW1lKSh3KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBlbnRyeSBpbiAnRGlmZmVyZW5jZXMnIGFycmF5OiAiK3cpO2dbYisrXT13Lm5hbWV9fX1lbHNle2lmKCEoMCxuLmlzTmFtZSkoZikpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkVuY29kaW5nIGlzIG5vdCBhIE5hbWUgbm9yIGEgRGljdCIpO209Zi5uYW1lfSJNYWNSb21hbkVuY29kaW5nIiE9PW0mJiJNYWNFeHBlcnRFbmNvZGluZyIhPT1tJiYiV2luQW5zaUVuY29kaW5nIiE9PW0mJihtPW51bGwpfWlmKG0pci5kZWZhdWx0RW5jb2Rpbmc9KDAsby5nZXRFbmNvZGluZykobSkuc2xpY2UoKTtlbHNle3ZhciBrPSEhKHIuZmxhZ3Mmcy5Gb250RmxhZ3MuU3ltYm9saWMpLFM9ISEoci5mbGFncyZzLkZvbnRGbGFncy5Ob25zeW1ib2xpYyk7Zj1vLlN0YW5kYXJkRW5jb2Rpbmc7IlRydWVUeXBlIiE9PXIudHlwZXx8U3x8KGY9by5XaW5BbnNpRW5jb2RpbmcpO2lmKGspe2Y9by5NYWNSb21hbkVuY29kaW5nO3IuZmlsZXx8KC9TeW1ib2wvaS50ZXN0KHIubmFtZSk/Zj1vLlN5bWJvbFNldEVuY29kaW5nOi9EaW5nYmF0c3xXaW5nZGluZ3MvaS50ZXN0KHIubmFtZSkmJihmPW8uWmFwZkRpbmdiYXRzRW5jb2RpbmcpKX1yLmRlZmF1bHRFbmNvZGluZz1mfXIuZGlmZmVyZW5jZXM9ZztyLmJhc2VFbmNvZGluZ05hbWU9bTtyLmhhc0VuY29kaW5nPSEhbXx8Zy5sZW5ndGg+MDtyLmRpY3Q9ZTtyZXR1cm4gaC50aGVuKGU9PntyLnRvVW5pY29kZT1lO3JldHVybiB0aGlzLmJ1aWxkVG9Vbmljb2RlKHIpfSkudGhlbihlPT57ci50b1VuaWNvZGU9ZTtjJiYoci5jaWRUb0dpZE1hcD10aGlzLnJlYWRDaWRUb0dpZE1hcChjLGUpKTtyZXR1cm4gcn0pfV9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUoZSx0PSExKXsoMCxhLmFzc2VydCkoIWUuY29tcG9zaXRlLCJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7Y29uc3Qgcj1bXSxpPWUuZGVmYXVsdEVuY29kaW5nLnNsaWNlKCksbj1lLmJhc2VFbmNvZGluZ05hbWUsYz1lLmRpZmZlcmVuY2VzO2Zvcihjb25zdCBlIGluIGMpe2NvbnN0IHQ9Y1tlXTsiLm5vdGRlZiIhPT10JiYoaVtlXT10KX1jb25zdCBoPSgwLHkuZ2V0R2x5cGhzVW5pY29kZSkoKTtmb3IoY29uc3QgYSBpbiBpKXtsZXQgcz1pW2FdO2lmKCIiIT09cylpZih2b2lkIDAhPT1oW3NdKXJbYV09U3RyaW5nLmZyb21DaGFyQ29kZShoW3NdKTtlbHNle2xldCBpPTA7c3dpdGNoKHNbMF0pe2Nhc2UiRyI6Mz09PXMubGVuZ3RoJiYoaT1wYXJzZUludChzLnN1YnN0cmluZygxKSwxNikpO2JyZWFrO2Nhc2UiZyI6NT09PXMubGVuZ3RoJiYoaT1wYXJzZUludChzLnN1YnN0cmluZygxKSwxNikpO2JyZWFrO2Nhc2UiQyI6Y2FzZSJjIjppZihzLmxlbmd0aD49MyYmcy5sZW5ndGg8PTQpe2NvbnN0IHI9cy5zdWJzdHJpbmcoMSk7aWYodCl7aT1wYXJzZUludChyLDE2KTticmVha31pPStyO2lmKE51bWJlci5pc05hTihpKSYmTnVtYmVyLmlzSW50ZWdlcihwYXJzZUludChyLDE2KSkpcmV0dXJuIHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShlLCEwKX1icmVhaztkZWZhdWx0OmNvbnN0IHI9KDAsbC5nZXRVbmljb2RlRm9yR2x5cGgpKHMsaCk7LTEhPT1yJiYoaT1yKX1pZihpPjAmJmk8PTExMTQxMTEmJk51bWJlci5pc0ludGVnZXIoaSkpe2lmKG4mJmk9PT0rYSl7Y29uc3QgZT0oMCxvLmdldEVuY29kaW5nKShuKTtpZihlJiYocz1lW2FdKSl7clthXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGhbc10pO2NvbnRpbnVlfX1yW2FdPVN0cmluZy5mcm9tQ29kZVBvaW50KGkpfX19cmV0dXJuIG5ldyBzLlRvVW5pY29kZU1hcChyKX1idWlsZFRvVW5pY29kZShlKXtlLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwPSEhZS50b1VuaWNvZGUmJmUudG9Vbmljb2RlLmxlbmd0aD4wO2lmKGUuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApeyFlLmNvbXBvc2l0ZSYmZS5oYXNFbmNvZGluZyYmKGUuZmFsbGJhY2tUb1VuaWNvZGU9dGhpcy5fYnVpbGRTaW1wbGVGb250VG9Vbmljb2RlKGUpKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUudG9Vbmljb2RlKX1pZighZS5jb21wb3NpdGUpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUoZSkpO2lmKGUuY29tcG9zaXRlJiYoZS5jTWFwLmJ1aWx0SW5DTWFwJiYhKGUuY01hcCBpbnN0YW5jZW9mIGkuSWRlbnRpdHlDTWFwKXx8IkFkb2JlIj09PWUuY2lkU3lzdGVtSW5mby5yZWdpc3RyeSYmKCJHQjEiPT09ZS5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nfHwiQ05TMSI9PT1lLmNpZFN5c3RlbUluZm8ub3JkZXJpbmd8fCJKYXBhbjEiPT09ZS5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nfHwiS29yZWExIj09PWUuY2lkU3lzdGVtSW5mby5vcmRlcmluZykpKXtjb25zdCB0PWUuY2lkU3lzdGVtSW5mby5yZWdpc3RyeSxyPWUuY2lkU3lzdGVtSW5mby5vcmRlcmluZyxvPW4uTmFtZS5nZXQodCsiLSIrcisiLVVDUzIiKTtyZXR1cm4gaS5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOm8sZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSkudGhlbigoZnVuY3Rpb24odCl7Y29uc3Qgcj1lLmNNYXAsaT1bXTtyLmZvckVhY2goKGZ1bmN0aW9uKGUscil7aWYocj42NTUzNSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpO2NvbnN0IG49dC5sb29rdXAocik7biYmKGlbZV09U3RyaW5nLmZyb21DaGFyQ29kZSgobi5jaGFyQ29kZUF0KDApPDw4KStuLmNoYXJDb2RlQXQoMSkpKX0pKTtyZXR1cm4gbmV3IHMuVG9Vbmljb2RlTWFwKGkpfSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IHMuSWRlbnRpdHlUb1VuaWNvZGVNYXAoZS5maXJzdENoYXIsZS5sYXN0Q2hhcikpfXJlYWRUb1VuaWNvZGUoZSl7dmFyIHQ9ZTtyZXR1cm4oMCxuLmlzTmFtZSkodCk/aS5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOnQsZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBpLklkZW50aXR5Q01hcD9uZXcgcy5JZGVudGl0eVRvVW5pY29kZU1hcCgwLDY1NTM1KTpuZXcgcy5Ub1VuaWNvZGVNYXAoZS5nZXRNYXAoKSl9KSk6KDAsbi5pc1N0cmVhbSkodCk/aS5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOnQsZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSkudGhlbigoZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGkuSWRlbnRpdHlDTWFwKXJldHVybiBuZXcgcy5JZGVudGl0eVRvVW5pY29kZU1hcCgwLDY1NTM1KTt2YXIgdD1uZXcgQXJyYXkoZS5sZW5ndGgpO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtmb3IodmFyIGE9W10saT0wO2k8ci5sZW5ndGg7aSs9Mil7dmFyIG49ci5jaGFyQ29kZUF0KGkpPDw4fHIuY2hhckNvZGVBdChpKzEpO2lmKDU1Mjk2PT0oNjM0ODgmbikpe2krPTI7dmFyIHM9ci5jaGFyQ29kZUF0KGkpPDw4fHIuY2hhckNvZGVBdChpKzEpO2EucHVzaCgoKDEwMjMmbik8PDEwKSsoMTAyMyZzKSs2NTUzNil9ZWxzZSBhLnB1c2gobil9dFtlXT1TdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsYSl9KSk7cmV0dXJuIG5ldyBzLlRvVW5pY29kZU1hcCh0KX0pLGU9PntpZihlIGluc3RhbmNlb2YgYS5BYm9ydEV4Y2VwdGlvbilyZXR1cm4gbnVsbDtpZih0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXt0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOmEuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250VG9Vbmljb2RlfSk7KDAsYS53YXJuKShgcmVhZFRvVW5pY29kZSAtIGlnbm9yaW5nIFRvVW5pY29kZSBkYXRhOiAiJHtlfSIuYCk7cmV0dXJuIG51bGx9dGhyb3cgZX0pOlByb21pc2UucmVzb2x2ZShudWxsKX1yZWFkQ2lkVG9HaWRNYXAoZSx0KXtmb3IodmFyIHI9W10sYT0wLGk9ZS5sZW5ndGg7YTxpO2ErKyl7dmFyIG49ZVthKytdPDw4fGVbYV07Y29uc3QgaT1hPj4xOygwIT09bnx8dC5oYXMoaSkpJiYocltpXT1uKX1yZXR1cm4gcn1leHRyYWN0V2lkdGhzKGUsdCxyKXt2YXIgYSxpLG8sYyxsLGgsdSxkLGY9dGhpcy54cmVmLGc9W10sbT0wLHA9W107aWYoci5jb21wb3NpdGUpe209ZS5oYXMoIkRXIik/ZS5nZXQoIkRXIik6MWUzO2lmKGQ9ZS5nZXQoIlciKSlmb3IoaT0wLG89ZC5sZW5ndGg7aTxvO2krKyl7aD1mLmZldGNoSWZSZWYoZFtpKytdKTt1PWYuZmV0Y2hJZlJlZihkW2ldKTtpZihBcnJheS5pc0FycmF5KHUpKWZvcihjPTAsbD11Lmxlbmd0aDtjPGw7YysrKWdbaCsrXT1mLmZldGNoSWZSZWYodVtjXSk7ZWxzZXt2YXIgYj1mLmZldGNoSWZSZWYoZFsrK2ldKTtmb3IoYz1oO2M8PXU7YysrKWdbY109Yn19aWYoci52ZXJ0aWNhbCl7dmFyIHk9ZS5nZXRBcnJheSgiRFcyIil8fFs4ODAsLTFlM107YT1beVsxXSwuNSptLHlbMF1dO2lmKHk9ZS5nZXQoIlcyIikpZm9yKGk9MCxvPXkubGVuZ3RoO2k8bztpKyspe2g9Zi5mZXRjaElmUmVmKHlbaSsrXSk7dT1mLmZldGNoSWZSZWYoeVtpXSk7aWYoQXJyYXkuaXNBcnJheSh1KSlmb3IoYz0wLGw9dS5sZW5ndGg7YzxsO2MrKylwW2grK109W2YuZmV0Y2hJZlJlZih1W2MrK10pLGYuZmV0Y2hJZlJlZih1W2MrK10pLGYuZmV0Y2hJZlJlZih1W2NdKV07ZWxzZXt2YXIgdj1bZi5mZXRjaElmUmVmKHlbKytpXSksZi5mZXRjaElmUmVmKHlbKytpXSksZi5mZXRjaElmUmVmKHlbKytpXSldO2ZvcihjPWg7Yzw9dTtjKyspcFtjXT12fX19fWVsc2V7dmFyIHc9ci5maXJzdENoYXI7aWYoZD1lLmdldCgiV2lkdGhzIikpe2M9dztmb3IoaT0wLG89ZC5sZW5ndGg7aTxvO2krKylnW2MrK109Zi5mZXRjaElmUmVmKGRbaV0pO209cGFyc2VGbG9hdCh0LmdldCgiTWlzc2luZ1dpZHRoIikpfHwwfWVsc2V7dmFyIGs9ZS5nZXQoIkJhc2VGb250Iik7aWYoKDAsbi5pc05hbWUpKGspKXt2YXIgUz10aGlzLmdldEJhc2VGb250TWV0cmljcyhrLm5hbWUpO2c9dGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChTLndpZHRocyxyKTttPVMuZGVmYXVsdFdpZHRofX19dmFyIEM9ITAseD1tO2Zvcih2YXIgQSBpbiBnKXt2YXIgVD1nW0FdO2lmKFQpaWYoeCl7aWYoeCE9PVQpe0M9ITE7YnJlYWt9fWVsc2UgeD1UfUMmJihyLmZsYWdzfD1zLkZvbnRGbGFncy5GaXhlZFBpdGNoKTtyLmRlZmF1bHRXaWR0aD1tO3Iud2lkdGhzPWc7ci5kZWZhdWx0Vk1ldHJpY3M9YTtyLnZtZXRyaWNzPXB9aXNTZXJpZkZvbnQoZSl7dmFyIHQ9ZS5zcGxpdCgiLSIpWzBdO3JldHVybiB0IGluKDAsaC5nZXRTZXJpZkZvbnRzKSgpfHwtMSE9PXQuc2VhcmNoKC9zZXJpZi9naSl9Z2V0QmFzZUZvbnRNZXRyaWNzKGUpe3ZhciB0PTAscj1bXSxpPSExLG49KDAsaC5nZXRTdGRGb250TWFwKSgpW2VdfHxlLHM9KDAsdi5nZXRNZXRyaWNzKSgpO24gaW4gc3x8KG49dGhpcy5pc1NlcmlmRm9udChlKT8iVGltZXMtUm9tYW4iOiJIZWx2ZXRpY2EiKTt2YXIgbz1zW25dO2lmKCgwLGEuaXNOdW0pKG8pKXt0PW87aT0hMH1lbHNlIHI9bygpO3JldHVybntkZWZhdWx0V2lkdGg6dCxtb25vc3BhY2U6aSx3aWR0aHM6cn19YnVpbGRDaGFyQ29kZVRvV2lkdGgoZSx0KXtmb3IodmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKSxhPXQuZGlmZmVyZW5jZXMsaT10LmRlZmF1bHRFbmNvZGluZyxuPTA7bjwyNTY7bisrKW4gaW4gYSYmZVthW25dXT9yW25dPWVbYVtuXV06biBpbiBpJiZlW2lbbl1dJiYocltuXT1lW2lbbl1dKTtyZXR1cm4gcn1wcmVFdmFsdWF0ZUZvbnQoZSl7dmFyIHQ9ZSxyPWUuZ2V0KCJTdWJ0eXBlIik7aWYoISgwLG4uaXNOYW1lKShyKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiaW52YWxpZCBmb250IFN1YnR5cGUiKTt2YXIgaSxzPSExO2lmKCJUeXBlMCI9PT1yLm5hbWUpe3ZhciBvPWUuZ2V0KCJEZXNjZW5kYW50Rm9udHMiKTtpZighbyl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiRGVzY2VuZGFudCBmb250cyBhcmUgbm90IHNwZWNpZmllZCIpO3I9KGU9QXJyYXkuaXNBcnJheShvKT90aGlzLnhyZWYuZmV0Y2hJZlJlZihvWzBdKTpvKS5nZXQoIlN1YnR5cGUiKTtpZighKDAsbi5pc05hbWUpKHIpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpO3M9ITB9dmFyIGM9ZS5nZXQoIkZvbnREZXNjcmlwdG9yIik7aWYoYyl7dmFyIGw9bmV3IHcuTXVybXVySGFzaDNfNjQsaD10LmdldFJhdygiRW5jb2RpbmciKTtpZigoMCxuLmlzTmFtZSkoaCkpbC51cGRhdGUoaC5uYW1lKTtlbHNlIGlmKCgwLG4uaXNSZWYpKGgpKWwudXBkYXRlKGgudG9TdHJpbmcoKSk7ZWxzZSBpZigoMCxuLmlzRGljdCkoaCkpZm9yKGNvbnN0IGUgb2YgaC5nZXRSYXdWYWx1ZXMoKSlpZigoMCxuLmlzTmFtZSkoZSkpbC51cGRhdGUoZS5uYW1lKTtlbHNlIGlmKCgwLG4uaXNSZWYpKGUpKWwudXBkYXRlKGUudG9TdHJpbmcoKSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHU9ZS5sZW5ndGgsZD1uZXcgQXJyYXkodSksZj0wO2Y8dTtmKyspe3ZhciBnPWVbZl07KDAsbi5pc05hbWUpKGcpP2RbZl09Zy5uYW1lOigoMCxhLmlzTnVtKShnKXx8KDAsbi5pc1JlZikoZykpJiYoZFtmXT1nLnRvU3RyaW5nKCkpfWwudXBkYXRlKGQuam9pbigpKX1jb25zdCByPWUuZ2V0KCJGaXJzdENoYXIiKXx8MCxvPWUuZ2V0KCJMYXN0Q2hhciIpfHwocz82NTUzNToyNTUpO2wudXBkYXRlKGAke3J9LSR7b31gKTt2YXIgbT1lLmdldCgiVG9Vbmljb2RlIil8fHQuZ2V0KCJUb1VuaWNvZGUiKTtpZigoMCxuLmlzU3RyZWFtKShtKSl7dmFyIHA9bS5zdHJ8fG07aT1wLmJ1ZmZlcj9uZXcgVWludDhBcnJheShwLmJ1ZmZlci5idWZmZXIsMCxwLmJ1ZmZlckxlbmd0aCk6bmV3IFVpbnQ4QXJyYXkocC5ieXRlcy5idWZmZXIscC5zdGFydCxwLmVuZC1wLnN0YXJ0KTtsLnVwZGF0ZShpKX1lbHNlKDAsbi5pc05hbWUpKG0pJiZsLnVwZGF0ZShtLm5hbWUpO3ZhciBiPWUuZ2V0KCJXaWR0aHMiKXx8dC5nZXQoIldpZHRocyIpO2lmKGIpe2k9bmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQzMkFycmF5KGIpLmJ1ZmZlcik7bC51cGRhdGUoaSl9fXJldHVybntkZXNjcmlwdG9yOmMsZGljdDplLGJhc2VEaWN0OnQsY29tcG9zaXRlOnMsdHlwZTpyLm5hbWUsaGFzaDpsP2wuaGV4ZGlnZXN0KCk6IiJ9fXRyYW5zbGF0ZUZvbnQoZSl7dmFyIHQscj1lLmJhc2VEaWN0LG89ZS5kaWN0LGM9ZS5jb21wb3NpdGUsbD1lLmRlc2NyaXB0b3IsdT1lLnR5cGUsZD1jPzY1NTM1OjI1NTtjb25zdCBmPW8uZ2V0KCJGaXJzdENoYXIiKXx8MCxnPW8uZ2V0KCJMYXN0Q2hhciIpfHxkO2lmKCFsKXtpZigiVHlwZTMiIT09dSl7dmFyIG09by5nZXQoIkJhc2VGb250Iik7aWYoISgwLG4uaXNOYW1lKShtKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFzZSBmb250IGlzIG5vdCBzcGVjaWZpZWQiKTttPW0ubmFtZS5yZXBsYWNlKC9bLF9dL2csIi0iKTt2YXIgcD10aGlzLmdldEJhc2VGb250TWV0cmljcyhtKSxiPW0uc3BsaXQoIi0iKVswXSx5PSh0aGlzLmlzU2VyaWZGb250KGIpP3MuRm9udEZsYWdzLlNlcmlmOjApfChwLm1vbm9zcGFjZT9zLkZvbnRGbGFncy5GaXhlZFBpdGNoOjApfCgoMCxoLmdldFN5bWJvbHNGb250cykoKVtiXT9zLkZvbnRGbGFncy5TeW1ib2xpYzpzLkZvbnRGbGFncy5Ob25zeW1ib2xpYyk7dD17dHlwZTp1LG5hbWU6bSx3aWR0aHM6cC53aWR0aHMsZGVmYXVsdFdpZHRoOnAuZGVmYXVsdFdpZHRoLGZsYWdzOnksZmlyc3RDaGFyOmYsbGFzdENoYXI6Z307Y29uc3QgZT1vLmdldCgiV2lkdGhzIik7cmV0dXJuIHRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKG8sbyx0KS50aGVuKHQ9PntpZihlKXtjb25zdCByPVtdO2xldCBhPWY7Zm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0PGk7dCsrKXJbYSsrXT10aGlzLnhyZWYuZmV0Y2hJZlJlZihlW3RdKTt0LndpZHRocz1yfWVsc2UgdC53aWR0aHM9dGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChwLndpZHRocyx0KTtyZXR1cm4gbmV3IHMuRm9udChtLG51bGwsdCl9KX0obD1uZXcgbi5EaWN0KG51bGwpKS5zZXQoIkZvbnROYW1lIixuLk5hbWUuZ2V0KHUpKTtsLnNldCgiRm9udEJCb3giLG8uZ2V0QXJyYXkoIkZvbnRCQm94Iil8fFswLDAsMCwwXSl9dmFyIHY9bC5nZXQoIkZvbnROYW1lIiksdz1vLmdldCgiQmFzZUZvbnQiKTsoMCxhLmlzU3RyaW5nKSh2KSYmKHY9bi5OYW1lLmdldCh2KSk7KDAsYS5pc1N0cmluZykodykmJih3PW4uTmFtZS5nZXQodykpO2lmKCJUeXBlMyIhPT11KXt2YXIgaz12JiZ2Lm5hbWUsUz13JiZ3Lm5hbWU7aWYoayE9PVMpeygwLGEuaW5mbykoYFRoZSBGb250RGVzY3JpcHRvcidzIEZvbnROYW1lIGlzICIke2t9IiBidXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250J3MgQmFzZUZvbnQgIiR7U30iLmApO2smJlMmJlMuc3RhcnRzV2l0aChrKSYmKHY9dyl9fXY9dnx8dztpZighKDAsbi5pc05hbWUpKHYpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgbmFtZSIpO3ZhciBDLHg9bC5nZXQoIkZvbnRGaWxlIiwiRm9udEZpbGUyIiwiRm9udEZpbGUzIik7aWYoeCYmeC5kaWN0KXt2YXIgQT14LmRpY3QuZ2V0KCJTdWJ0eXBlIik7QSYmKEE9QS5uYW1lKTt2YXIgVD14LmRpY3QuZ2V0KCJMZW5ndGgxIiksST14LmRpY3QuZ2V0KCJMZW5ndGgyIiksRj14LmRpY3QuZ2V0KCJMZW5ndGgzIil9dD17dHlwZTp1LG5hbWU6di5uYW1lLHN1YnR5cGU6QSxmaWxlOngsbGVuZ3RoMTpULGxlbmd0aDI6SSxsZW5ndGgzOkYsbG9hZGVkTmFtZTpyLmxvYWRlZE5hbWUsY29tcG9zaXRlOmMsZml4ZWRQaXRjaDohMSxmb250TWF0cml4Om8uZ2V0QXJyYXkoIkZvbnRNYXRyaXgiKXx8YS5GT05UX0lERU5USVRZX01BVFJJWCxmaXJzdENoYXI6Znx8MCxsYXN0Q2hhcjpnfHxkLGJib3g6bC5nZXRBcnJheSgiRm9udEJCb3giKSxhc2NlbnQ6bC5nZXQoIkFzY2VudCIpLGRlc2NlbnQ6bC5nZXQoIkRlc2NlbnQiKSx4SGVpZ2h0OmwuZ2V0KCJYSGVpZ2h0IiksY2FwSGVpZ2h0OmwuZ2V0KCJDYXBIZWlnaHQiKSxmbGFnczpsLmdldCgiRmxhZ3MiKSxpdGFsaWNBbmdsZTpsLmdldCgiSXRhbGljQW5nbGUiKSxpc1R5cGUzRm9udDohMX07aWYoYyl7dmFyIFA9ci5nZXQoIkVuY29kaW5nIik7KDAsbi5pc05hbWUpKFApJiYodC5jaWRFbmNvZGluZz1QLm5hbWUpO0M9aS5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOlAsZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSkudGhlbigoZnVuY3Rpb24oZSl7dC5jTWFwPWU7dC52ZXJ0aWNhbD10LmNNYXAudmVydGljYWx9KSl9ZWxzZSBDPVByb21pc2UucmVzb2x2ZSh2b2lkIDApO3JldHVybiBDLnRoZW4oKCk9PnRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKG8scix0KSkudGhlbihlPT57dGhpcy5leHRyYWN0V2lkdGhzKG8sbCxlKTsiVHlwZTMiPT09dSYmKGUuaXNUeXBlM0ZvbnQ9ITApO3JldHVybiBuZXcgcy5Gb250KHYubmFtZSx4LGUpfSl9c3RhdGljIGJ1aWxkRm9udFBhdGhzKGUsdCxyKXtmdW5jdGlvbiBidWlsZFBhdGgodCl7ZS5yZW5kZXJlci5oYXNCdWlsdFBhdGgodCl8fHIuc2VuZCgiY29tbW9ub2JqIixbYCR7ZS5sb2FkZWROYW1lfV9wYXRoXyR7dH1gLCJGb250UGF0aCIsZS5yZW5kZXJlci5nZXRQYXRoSnModCldKX1mb3IoY29uc3QgZSBvZiB0KXtidWlsZFBhdGgoZS5mb250Q2hhcik7Y29uc3QgdD1lLmFjY2VudDt0JiZ0LmZvbnRDaGFyJiZidWlsZFBhdGgodC5mb250Q2hhcil9fXN0YXRpYyBnZXQgZmFsbGJhY2tGb250RGljdCgpe2NvbnN0IGU9bmV3IG4uRGljdDtlLnNldCgiQmFzZUZvbnQiLG4uTmFtZS5nZXQoIlBERkpTLUZhbGxiYWNrRm9udCIpKTtlLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpO2Uuc2V0KCJTdWJ0eXBlIixuLk5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7ZS5zZXQoIkVuY29kaW5nIixuLk5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSk7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImZhbGxiYWNrRm9udERpY3QiLGUpfX10LlBhcnRpYWxFdmFsdWF0b3I9UGFydGlhbEV2YWx1YXRvcjtjbGFzcyBUcmFuc2xhdGVkRm9udHtjb25zdHJ1Y3Rvcih7bG9hZGVkTmFtZTplLGZvbnQ6dCxkaWN0OnIsZXh0cmFQcm9wZXJ0aWVzOmE9ITF9KXt0aGlzLmxvYWRlZE5hbWU9ZTt0aGlzLmZvbnQ9dDt0aGlzLmRpY3Q9cjt0aGlzLl9leHRyYVByb3BlcnRpZXM9YTt0aGlzLnR5cGUzTG9hZGVkPW51bGw7dGhpcy50eXBlM0RlcGVuZGVuY2llcz10LmlzVHlwZTNGb250P25ldyBTZXQ6bnVsbDt0aGlzLnNlbnQ9ITF9c2VuZChlKXtpZighdGhpcy5zZW50KXt0aGlzLnNlbnQ9ITA7ZS5zZW5kKCJjb21tb25vYmoiLFt0aGlzLmxvYWRlZE5hbWUsIkZvbnQiLHRoaXMuZm9udC5leHBvcnREYXRhKHRoaXMuX2V4dHJhUHJvcGVydGllcyldKX19ZmFsbGJhY2soZSl7aWYoIXRoaXMuZm9udC5kYXRhKXJldHVybjt0aGlzLmZvbnQuZGlzYWJsZUZvbnRGYWNlPSEwO2NvbnN0IHQ9dGhpcy5mb250LmdseXBoQ2FjaGVWYWx1ZXM7UGFydGlhbEV2YWx1YXRvci5idWlsZEZvbnRQYXRocyh0aGlzLmZvbnQsdCxlKX1sb2FkVHlwZTNEYXRhKGUsdCxyKXtpZih0aGlzLnR5cGUzTG9hZGVkKXJldHVybiB0aGlzLnR5cGUzTG9hZGVkO2lmKCF0aGlzLmZvbnQuaXNUeXBlM0ZvbnQpdGhyb3cgbmV3IEVycm9yKCJNdXN0IGJlIGEgVHlwZTMgZm9udC4iKTt2YXIgaT1PYmplY3QuY3JlYXRlKGUub3B0aW9ucyk7aS5pZ25vcmVFcnJvcnM9ITE7dmFyIG49ZS5jbG9uZShpKTtuLnBhcnNpbmdUeXBlM0ZvbnQ9ITA7Y29uc3Qgcz10aGlzLmZvbnQsbz10aGlzLnR5cGUzRGVwZW5kZW5jaWVzO3ZhciBjPVByb21pc2UucmVzb2x2ZSgpLGw9dGhpcy5kaWN0LmdldCgiQ2hhclByb2NzIiksaD10aGlzLmRpY3QuZ2V0KCJSZXNvdXJjZXMiKXx8dCx1PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0IGUgb2YgbC5nZXRLZXlzKCkpYz1jLnRoZW4oKGZ1bmN0aW9uKCl7dmFyIHQ9bC5nZXQoZSksaT1uZXcgay5PcGVyYXRvckxpc3Q7cmV0dXJuIG4uZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06dCx0YXNrOnIscmVzb3VyY2VzOmgsb3BlcmF0b3JMaXN0Oml9KS50aGVuKChmdW5jdGlvbigpe3VbZV09aS5nZXRJUigpO2Zvcihjb25zdCBlIG9mIGkuZGVwZW5kZW5jaWVzKW8uYWRkKGUpfSkpLmNhdGNoKChmdW5jdGlvbih0KXsoMCxhLndhcm4pKGBUeXBlMyBmb250IHJlc291cmNlICIke2V9IiBpcyBub3QgYXZhaWxhYmxlLmApO2NvbnN0IHI9bmV3IGsuT3BlcmF0b3JMaXN0O3VbZV09ci5nZXRJUigpfSkpfSkpO3RoaXMudHlwZTNMb2FkZWQ9Yy50aGVuKChmdW5jdGlvbigpe3MuY2hhclByb2NPcGVyYXRvckxpc3Q9dX0pKTtyZXR1cm4gdGhpcy50eXBlM0xvYWRlZH19Y2xhc3MgU3RhdGVNYW5hZ2Vye2NvbnN0cnVjdG9yKGUpe3RoaXMuc3RhdGU9ZTt0aGlzLnN0YXRlU3RhY2s9W119c2F2ZSgpe3ZhciBlPXRoaXMuc3RhdGU7dGhpcy5zdGF0ZVN0YWNrLnB1c2godGhpcy5zdGF0ZSk7dGhpcy5zdGF0ZT1lLmNsb25lKCl9cmVzdG9yZSgpe3ZhciBlPXRoaXMuc3RhdGVTdGFjay5wb3AoKTtlJiYodGhpcy5zdGF0ZT1lKX10cmFuc2Zvcm0oZSl7dGhpcy5zdGF0ZS5jdG09YS5VdGlsLnRyYW5zZm9ybSh0aGlzLnN0YXRlLmN0bSxlKX19Y2xhc3MgVGV4dFN0YXRle2NvbnN0cnVjdG9yKCl7dGhpcy5jdG09bmV3IEZsb2F0MzJBcnJheShhLklERU5USVRZX01BVFJJWCk7dGhpcy5mb250TmFtZT1udWxsO3RoaXMuZm9udFNpemU9MDt0aGlzLmZvbnQ9bnVsbDt0aGlzLmZvbnRNYXRyaXg9YS5GT05UX0lERU5USVRZX01BVFJJWDt0aGlzLnRleHRNYXRyaXg9YS5JREVOVElUWV9NQVRSSVguc2xpY2UoKTt0aGlzLnRleHRMaW5lTWF0cml4PWEuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7dGhpcy5jaGFyU3BhY2luZz0wO3RoaXMud29yZFNwYWNpbmc9MDt0aGlzLmxlYWRpbmc9MDt0aGlzLnRleHRIU2NhbGU9MTt0aGlzLnRleHRSaXNlPTB9c2V0VGV4dE1hdHJpeChlLHQscixhLGksbil7dmFyIHM9dGhpcy50ZXh0TWF0cml4O3NbMF09ZTtzWzFdPXQ7c1syXT1yO3NbM109YTtzWzRdPWk7c1s1XT1ufXNldFRleHRMaW5lTWF0cml4KGUsdCxyLGEsaSxuKXt2YXIgcz10aGlzLnRleHRMaW5lTWF0cml4O3NbMF09ZTtzWzFdPXQ7c1syXT1yO3NbM109YTtzWzRdPWk7c1s1XT1ufXRyYW5zbGF0ZVRleHRNYXRyaXgoZSx0KXt2YXIgcj10aGlzLnRleHRNYXRyaXg7cls0XT1yWzBdKmUrclsyXSp0K3JbNF07cls1XT1yWzFdKmUrclszXSp0K3JbNV19dHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoZSx0KXt2YXIgcj10aGlzLnRleHRMaW5lTWF0cml4O3JbNF09clswXSplK3JbMl0qdCtyWzRdO3JbNV09clsxXSplK3JbM10qdCtyWzVdfWNhbGNUZXh0TGluZU1hdHJpeEFkdmFuY2UoZSx0LHIsYSxpLG4pe3ZhciBzPXRoaXMuZm9udDtpZighcylyZXR1cm4gbnVsbDt2YXIgbz10aGlzLnRleHRMaW5lTWF0cml4O2lmKGUhPT1vWzBdfHx0IT09b1sxXXx8ciE9PW9bMl18fGEhPT1vWzNdKXJldHVybiBudWxsO3ZhciBjPWktb1s0XSxsPW4tb1s1XTtpZihzLnZlcnRpY2FsJiYwIT09Y3x8IXMudmVydGljYWwmJjAhPT1sKXJldHVybiBudWxsO3ZhciBoLHUsZD1lKmEtdCpyO2lmKHMudmVydGljYWwpe2g9LWwqci9kO3U9bCplL2R9ZWxzZXtoPWMqYS9kO3U9LWMqdC9kfXJldHVybnt3aWR0aDpoLGhlaWdodDp1LHZhbHVlOnMudmVydGljYWw/dTpofX1jYWxjUmVuZGVyTWF0cml4KGUpe3ZhciB0PVt0aGlzLmZvbnRTaXplKnRoaXMudGV4dEhTY2FsZSwwLDAsdGhpcy5mb250U2l6ZSwwLHRoaXMudGV4dFJpc2VdO3JldHVybiBhLlV0aWwudHJhbnNmb3JtKGUsYS5VdGlsLnRyYW5zZm9ybSh0aGlzLnRleHRNYXRyaXgsdCkpfWNhcnJpYWdlUmV0dXJuKCl7dGhpcy50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCgwLC10aGlzLmxlYWRpbmcpO3RoaXMudGV4dE1hdHJpeD10aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCl9Y2xvbmUoKXt2YXIgZT1PYmplY3QuY3JlYXRlKHRoaXMpO2UudGV4dE1hdHJpeD10aGlzLnRleHRNYXRyaXguc2xpY2UoKTtlLnRleHRMaW5lTWF0cml4PXRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTtlLmZvbnRNYXRyaXg9dGhpcy5mb250TWF0cml4LnNsaWNlKCk7cmV0dXJuIGV9fWNsYXNzIEV2YWxTdGF0ZXtjb25zdHJ1Y3Rvcigpe3RoaXMuY3RtPW5ldyBGbG9hdDMyQXJyYXkoYS5JREVOVElUWV9NQVRSSVgpO3RoaXMuZm9udD1udWxsO3RoaXMudGV4dFJlbmRlcmluZ01vZGU9YS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMO3RoaXMuZmlsbENvbG9yU3BhY2U9cC5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTt0aGlzLnN0cm9rZUNvbG9yU3BhY2U9cC5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheX1jbG9uZSgpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpfX1jbGFzcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3J7c3RhdGljIGdldCBvcE1hcCgpe2NvbnN0IGU9KDAsYy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnc9e2lkOmEuT1BTLnNldExpbmVXaWR0aCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLko9e2lkOmEuT1BTLnNldExpbmVDYXAsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5qPXtpZDphLk9QUy5zZXRMaW5lSm9pbixudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLk09e2lkOmEuT1BTLnNldE1pdGVyTGltaXQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5kPXtpZDphLk9QUy5zZXREYXNoLG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O2Uucmk9e2lkOmEuT1BTLnNldFJlbmRlcmluZ0ludGVudCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLmk9e2lkOmEuT1BTLnNldEZsYXRuZXNzLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuZ3M9e2lkOmEuT1BTLnNldEdTdGF0ZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLnE9e2lkOmEuT1BTLnNhdmUsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5RPXtpZDphLk9QUy5yZXN0b3JlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuY209e2lkOmEuT1BTLnRyYW5zZm9ybSxudW1BcmdzOjYsdmFyaWFibGVBcmdzOiExfTtlLm09e2lkOmEuT1BTLm1vdmVUbyxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTtlLmw9e2lkOmEuT1BTLmxpbmVUbyxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTtlLmM9e2lkOmEuT1BTLmN1cnZlVG8sbnVtQXJnczo2LHZhcmlhYmxlQXJnczohMX07ZS52PXtpZDphLk9QUy5jdXJ2ZVRvMixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfTtlLnk9e2lkOmEuT1BTLmN1cnZlVG8zLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITF9O2UuaD17aWQ6YS5PUFMuY2xvc2VQYXRoLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UucmU9e2lkOmEuT1BTLnJlY3RhbmdsZSxudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfTtlLlM9e2lkOmEuT1BTLnN0cm9rZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLnM9e2lkOmEuT1BTLmNsb3NlU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuZj17aWQ6YS5PUFMuZmlsbCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLkY9e2lkOmEuT1BTLmZpbGwsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZVsiZioiXT17aWQ6YS5PUFMuZW9GaWxsLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuQj17aWQ6YS5PUFMuZmlsbFN0cm9rZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlWyJCKiJdPXtpZDphLk9QUy5lb0ZpbGxTdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5iPXtpZDphLk9QUy5jbG9zZUZpbGxTdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZVsiYioiXT17aWQ6YS5PUFMuY2xvc2VFT0ZpbGxTdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5uPXtpZDphLk9QUy5lbmRQYXRoLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuVz17aWQ6YS5PUFMuY2xpcCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlWyJXKiJdPXtpZDphLk9QUy5lb0NsaXAsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5CVD17aWQ6YS5PUFMuYmVnaW5UZXh0LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuRVQ9e2lkOmEuT1BTLmVuZFRleHQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5UYz17aWQ6YS5PUFMuc2V0Q2hhclNwYWNpbmcsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5Udz17aWQ6YS5PUFMuc2V0V29yZFNwYWNpbmcsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5Uej17aWQ6YS5PUFMuc2V0SFNjYWxlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuVEw9e2lkOmEuT1BTLnNldExlYWRpbmcsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5UZj17aWQ6YS5PUFMuc2V0Rm9udCxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTtlLlRyPXtpZDphLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLlRzPXtpZDphLk9QUy5zZXRUZXh0UmlzZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLlRkPXtpZDphLk9QUy5tb3ZlVGV4dCxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTtlLlREPXtpZDphLk9QUy5zZXRMZWFkaW5nTW92ZVRleHQsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07ZS5UbT17aWQ6YS5PUFMuc2V0VGV4dE1hdHJpeCxudW1BcmdzOjYsdmFyaWFibGVBcmdzOiExfTtlWyJUKiJdPXtpZDphLk9QUy5uZXh0TGluZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLlRqPXtpZDphLk9QUy5zaG93VGV4dCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLlRKPXtpZDphLk9QUy5zaG93U3BhY2VkVGV4dCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlWyInIl09e2lkOmEuT1BTLm5leHRMaW5lU2hvd1RleHQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZVsnIiddPXtpZDphLk9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dCxudW1BcmdzOjMsdmFyaWFibGVBcmdzOiExfTtlLmQwPXtpZDphLk9QUy5zZXRDaGFyV2lkdGgsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07ZS5kMT17aWQ6YS5PUFMuc2V0Q2hhcldpZHRoQW5kQm91bmRzLG51bUFyZ3M6Nix2YXJpYWJsZUFyZ3M6ITF9O2UuQ1M9e2lkOmEuT1BTLnNldFN0cm9rZUNvbG9yU3BhY2UsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5jcz17aWQ6YS5PUFMuc2V0RmlsbENvbG9yU3BhY2UsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5TQz17aWQ6YS5PUFMuc2V0U3Ryb2tlQ29sb3IsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMH07ZS5TQ049e2lkOmEuT1BTLnNldFN0cm9rZUNvbG9yTixudW1BcmdzOjMzLHZhcmlhYmxlQXJnczohMH07ZS5zYz17aWQ6YS5PUFMuc2V0RmlsbENvbG9yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITB9O2Uuc2NuPXtpZDphLk9QUy5zZXRGaWxsQ29sb3JOLG51bUFyZ3M6MzMsdmFyaWFibGVBcmdzOiEwfTtlLkc9e2lkOmEuT1BTLnNldFN0cm9rZUdyYXksbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5nPXtpZDphLk9QUy5zZXRGaWxsR3JheSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLlJHPXtpZDphLk9QUy5zZXRTdHJva2VSR0JDb2xvcixudW1BcmdzOjMsdmFyaWFibGVBcmdzOiExfTtlLnJnPXtpZDphLk9QUy5zZXRGaWxsUkdCQ29sb3IsbnVtQXJnczozLHZhcmlhYmxlQXJnczohMX07ZS5LPXtpZDphLk9QUy5zZXRTdHJva2VDTVlLQ29sb3IsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX07ZS5rPXtpZDphLk9QUy5zZXRGaWxsQ01ZS0NvbG9yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITF9O2Uuc2g9e2lkOmEuT1BTLnNoYWRpbmdGaWxsLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuQkk9e2lkOmEuT1BTLmJlZ2luSW5saW5lSW1hZ2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5JRD17aWQ6YS5PUFMuYmVnaW5JbWFnZURhdGEsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5FST17aWQ6YS5PUFMuZW5kSW5saW5lSW1hZ2UsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5Ebz17aWQ6YS5PUFMucGFpbnRYT2JqZWN0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuTVA9e2lkOmEuT1BTLm1hcmtQb2ludCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLkRQPXtpZDphLk9QUy5tYXJrUG9pbnRQcm9wcyxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTtlLkJNQz17aWQ6YS5PUFMuYmVnaW5NYXJrZWRDb250ZW50LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuQkRDPXtpZDphLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTtlLkVNQz17aWQ6YS5PUFMuZW5kTWFya2VkQ29udGVudCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLkJYPXtpZDphLk9QUy5iZWdpbkNvbXBhdCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLkVYPXtpZDphLk9QUy5lbmRDb21wYXQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5CTT1udWxsO2UuQkQ9bnVsbDtlLnRydWU9bnVsbDtlLmZhPW51bGw7ZS5mYWw9bnVsbDtlLmZhbHM9bnVsbDtlLmZhbHNlPW51bGw7ZS5udT1udWxsO2UubnVsPW51bGw7ZS5udWxsPW51bGx9KSk7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm9wTWFwIixlKCkpfXN0YXRpYyBnZXQgTUFYX0lOVkFMSURfUEFUSF9PUFMoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiTUFYX0lOVkFMSURfUEFUSF9PUFMiLDIwKX1jb25zdHJ1Y3RvcihlLHQscil7dGhpcy5wYXJzZXI9bmV3IGYuUGFyc2VyKHtsZXhlcjpuZXcgZi5MZXhlcihlLEV2YWx1YXRvclByZXByb2Nlc3Nvci5vcE1hcCkseHJlZjp0fSk7dGhpcy5zdGF0ZU1hbmFnZXI9cjt0aGlzLm5vblByb2Nlc3NlZEFyZ3M9W107dGhpcy5fbnVtSW52YWxpZFBhdGhPUFM9MH1nZXQgc2F2ZWRTdGF0ZXNEZXB0aCgpe3JldHVybiB0aGlzLnN0YXRlTWFuYWdlci5zdGF0ZVN0YWNrLmxlbmd0aH1yZWFkKGUpe2Zvcih2YXIgdD1lLmFyZ3M7Oyl7dmFyIHI9dGhpcy5wYXJzZXIuZ2V0T2JqKCk7aWYociBpbnN0YW5jZW9mIG4uQ21kKXt2YXIgaT1yLmNtZCxzPUV2YWx1YXRvclByZXByb2Nlc3Nvci5vcE1hcFtpXTtpZighcyl7KDAsYS53YXJuKShgVW5rbm93biBjb21tYW5kICIke2l9Ii5gKTtjb250aW51ZX12YXIgbz1zLmlkLGM9cy5udW1BcmdzLGw9bnVsbCE9PXQ/dC5sZW5ndGg6MDtpZihzLnZhcmlhYmxlQXJncylsPmMmJigwLGEuaW5mbykoYENvbW1hbmQgJHtpfTogZXhwZWN0ZWQgWzAsICR7Y31dIGFyZ3MsIGJ1dCByZWNlaXZlZCAke2x9IGFyZ3MuYCk7ZWxzZXtpZihsIT09Yyl7Zm9yKHZhciBoPXRoaXMubm9uUHJvY2Vzc2VkQXJncztsPmM7KXtoLnB1c2godC5zaGlmdCgpKTtsLS19Zm9yKDtsPGMmJjAhPT1oLmxlbmd0aDspe251bGw9PT10JiYodD1bXSk7dC51bnNoaWZ0KGgucG9wKCkpO2wrK319aWYobDxjKXtjb25zdCBlPWBjb21tYW5kICR7aX06IGV4cGVjdGVkICR7Y30gYXJncywgYnV0IHJlY2VpdmVkICR7bH0gYXJncy5gO2lmKG8+PWEuT1BTLm1vdmVUbyYmbzw9YS5PUFMuZW5kUGF0aCYmKyt0aGlzLl9udW1JbnZhbGlkUGF0aE9QUz5FdmFsdWF0b3JQcmVwcm9jZXNzb3IuTUFYX0lOVkFMSURfUEFUSF9PUFMpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgIitlKTsoMCxhLndhcm4pKCJTa2lwcGluZyAiK2UpO251bGwhPT10JiYodC5sZW5ndGg9MCk7Y29udGludWV9fXRoaXMucHJlcHJvY2Vzc0NvbW1hbmQobyx0KTtlLmZuPW87ZS5hcmdzPXQ7cmV0dXJuITB9aWYocj09PW4uRU9GKXJldHVybiExO2lmKG51bGwhPT1yKXtudWxsPT09dCYmKHQ9W10pO3QucHVzaChyKTtpZih0Lmxlbmd0aD4zMyl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIil9fX1wcmVwcm9jZXNzQ29tbWFuZChlLHQpe3N3aXRjaCgwfGUpe2Nhc2UgYS5PUFMuc2F2ZTp0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7YnJlYWs7Y2FzZSBhLk9QUy5yZXN0b3JlOnRoaXMuc3RhdGVNYW5hZ2VyLnJlc3RvcmUoKTticmVhaztjYXNlIGEuT1BTLnRyYW5zZm9ybTp0aGlzLnN0YXRlTWFuYWdlci50cmFuc2Zvcm0odCl9fX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQ01hcEZhY3Rvcnk9dC5JZGVudGl0eUNNYXA9dC5DTWFwPXZvaWQgMDt2YXIgYT1yKDIpLGk9cig1KSxuPXIoMTEpLHM9cig4KSxvPXIoMTIpLGM9WyJBZG9iZS1HQjEtVUNTMiIsIkFkb2JlLUNOUzEtVUNTMiIsIkFkb2JlLUphcGFuMS1VQ1MyIiwiQWRvYmUtS29yZWExLVVDUzIiLCI3OC1FVUMtSCIsIjc4LUVVQy1WIiwiNzgtSCIsIjc4LVJLU0otSCIsIjc4LVJLU0otViIsIjc4LVYiLCI3OG1zLVJLU0otSCIsIjc4bXMtUktTSi1WIiwiODNwdi1SS1NKLUgiLCI5MG1zLVJLU0otSCIsIjkwbXMtUktTSi1WIiwiOTBtc3AtUktTSi1IIiwiOTBtc3AtUktTSi1WIiwiOTBwdi1SS1NKLUgiLCI5MHB2LVJLU0otViIsIkFkZC1IIiwiQWRkLVJLU0otSCIsIkFkZC1SS1NKLVYiLCJBZGQtViIsIkFkb2JlLUNOUzEtMCIsIkFkb2JlLUNOUzEtMSIsIkFkb2JlLUNOUzEtMiIsIkFkb2JlLUNOUzEtMyIsIkFkb2JlLUNOUzEtNCIsIkFkb2JlLUNOUzEtNSIsIkFkb2JlLUNOUzEtNiIsIkFkb2JlLUdCMS0wIiwiQWRvYmUtR0IxLTEiLCJBZG9iZS1HQjEtMiIsIkFkb2JlLUdCMS0zIiwiQWRvYmUtR0IxLTQiLCJBZG9iZS1HQjEtNSIsIkFkb2JlLUphcGFuMS0wIiwiQWRvYmUtSmFwYW4xLTEiLCJBZG9iZS1KYXBhbjEtMiIsIkFkb2JlLUphcGFuMS0zIiwiQWRvYmUtSmFwYW4xLTQiLCJBZG9iZS1KYXBhbjEtNSIsIkFkb2JlLUphcGFuMS02IiwiQWRvYmUtS29yZWExLTAiLCJBZG9iZS1Lb3JlYTEtMSIsIkFkb2JlLUtvcmVhMS0yIiwiQjUtSCIsIkI1LVYiLCJCNXBjLUgiLCJCNXBjLVYiLCJDTlMtRVVDLUgiLCJDTlMtRVVDLVYiLCJDTlMxLUgiLCJDTlMxLVYiLCJDTlMyLUgiLCJDTlMyLVYiLCJFVEhLLUI1LUgiLCJFVEhLLUI1LVYiLCJFVGVuLUI1LUgiLCJFVGVuLUI1LVYiLCJFVGVubXMtQjUtSCIsIkVUZW5tcy1CNS1WIiwiRVVDLUgiLCJFVUMtViIsIkV4dC1IIiwiRXh0LVJLU0otSCIsIkV4dC1SS1NKLVYiLCJFeHQtViIsIkdCLUVVQy1IIiwiR0ItRVVDLVYiLCJHQi1IIiwiR0ItViIsIkdCSy1FVUMtSCIsIkdCSy1FVUMtViIsIkdCSzJLLUgiLCJHQksySy1WIiwiR0JLcC1FVUMtSCIsIkdCS3AtRVVDLVYiLCJHQlQtRVVDLUgiLCJHQlQtRVVDLVYiLCJHQlQtSCIsIkdCVC1WIiwiR0JUcGMtRVVDLUgiLCJHQlRwYy1FVUMtViIsIkdCcGMtRVVDLUgiLCJHQnBjLUVVQy1WIiwiSCIsIkhLZGxhLUI1LUgiLCJIS2RsYS1CNS1WIiwiSEtkbGItQjUtSCIsIkhLZGxiLUI1LVYiLCJIS2djY3MtQjUtSCIsIkhLZ2Njcy1CNS1WIiwiSEttMzE0LUI1LUgiLCJIS20zMTQtQjUtViIsIkhLbTQ3MS1CNS1IIiwiSEttNDcxLUI1LVYiLCJIS3Njcy1CNS1IIiwiSEtzY3MtQjUtViIsIkhhbmtha3UiLCJIaXJhZ2FuYSIsIktTQy1FVUMtSCIsIktTQy1FVUMtViIsIktTQy1IIiwiS1NDLUpvaGFiLUgiLCJLU0MtSm9oYWItViIsIktTQy1WIiwiS1NDbXMtVUhDLUgiLCJLU0Ntcy1VSEMtSFctSCIsIktTQ21zLVVIQy1IVy1WIiwiS1NDbXMtVUhDLVYiLCJLU0NwYy1FVUMtSCIsIktTQ3BjLUVVQy1WIiwiS2F0YWthbmEiLCJOV1AtSCIsIk5XUC1WIiwiUktTSi1IIiwiUktTSi1WIiwiUm9tYW4iLCJVbmlDTlMtVUNTMi1IIiwiVW5pQ05TLVVDUzItViIsIlVuaUNOUy1VVEYxNi1IIiwiVW5pQ05TLVVURjE2LVYiLCJVbmlDTlMtVVRGMzItSCIsIlVuaUNOUy1VVEYzMi1WIiwiVW5pQ05TLVVURjgtSCIsIlVuaUNOUy1VVEY4LVYiLCJVbmlHQi1VQ1MyLUgiLCJVbmlHQi1VQ1MyLVYiLCJVbmlHQi1VVEYxNi1IIiwiVW5pR0ItVVRGMTYtViIsIlVuaUdCLVVURjMyLUgiLCJVbmlHQi1VVEYzMi1WIiwiVW5pR0ItVVRGOC1IIiwiVW5pR0ItVVRGOC1WIiwiVW5pSklTLVVDUzItSCIsIlVuaUpJUy1VQ1MyLUhXLUgiLCJVbmlKSVMtVUNTMi1IVy1WIiwiVW5pSklTLVVDUzItViIsIlVuaUpJUy1VVEYxNi1IIiwiVW5pSklTLVVURjE2LVYiLCJVbmlKSVMtVVRGMzItSCIsIlVuaUpJUy1VVEYzMi1WIiwiVW5pSklTLVVURjgtSCIsIlVuaUpJUy1VVEY4LVYiLCJVbmlKSVMyMDA0LVVURjE2LUgiLCJVbmlKSVMyMDA0LVVURjE2LVYiLCJVbmlKSVMyMDA0LVVURjMyLUgiLCJVbmlKSVMyMDA0LVVURjMyLVYiLCJVbmlKSVMyMDA0LVVURjgtSCIsIlVuaUpJUzIwMDQtVVRGOC1WIiwiVW5pSklTUHJvLVVDUzItSFctViIsIlVuaUpJU1Byby1VQ1MyLVYiLCJVbmlKSVNQcm8tVVRGOC1WIiwiVW5pSklTWDAyMTMtVVRGMzItSCIsIlVuaUpJU1gwMjEzLVVURjMyLVYiLCJVbmlKSVNYMDIxMzIwMDQtVVRGMzItSCIsIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwiVW5pS1MtVUNTMi1IIiwiVW5pS1MtVUNTMi1WIiwiVW5pS1MtVVRGMTYtSCIsIlVuaUtTLVVURjE2LVYiLCJVbmlLUy1VVEYzMi1IIiwiVW5pS1MtVVRGMzItViIsIlVuaUtTLVVURjgtSCIsIlVuaUtTLVVURjgtViIsIlYiLCJXUC1TeW1ib2wiXTtjbGFzcyBDTWFwe2NvbnN0cnVjdG9yKGU9ITEpe3RoaXMuY29kZXNwYWNlUmFuZ2VzPVtbXSxbXSxbXSxbXV07dGhpcy5udW1Db2Rlc3BhY2VSYW5nZXM9MDt0aGlzLl9tYXA9W107dGhpcy5uYW1lPSIiO3RoaXMudmVydGljYWw9ITE7dGhpcy51c2VDTWFwPW51bGw7dGhpcy5idWlsdEluQ01hcD1lfWFkZENvZGVzcGFjZVJhbmdlKGUsdCxyKXt0aGlzLmNvZGVzcGFjZVJhbmdlc1tlLTFdLnB1c2godCxyKTt0aGlzLm51bUNvZGVzcGFjZVJhbmdlcysrfW1hcENpZFJhbmdlKGUsdCxyKXtpZih0LWU+MioqMjQtMSl0aHJvdyBuZXcgRXJyb3IoIm1hcENpZFJhbmdlIC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpO2Zvcig7ZTw9dDspdGhpcy5fbWFwW2UrK109cisrfW1hcEJmUmFuZ2UoZSx0LHIpe2lmKHQtZT4yKioyNC0xKXRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTtmb3IodmFyIGE9ci5sZW5ndGgtMTtlPD10Oyl7dGhpcy5fbWFwW2UrK109cjtyPXIuc3Vic3RyaW5nKDAsYSkrU3RyaW5nLmZyb21DaGFyQ29kZShyLmNoYXJDb2RlQXQoYSkrMSl9fW1hcEJmUmFuZ2VUb0FycmF5KGUsdCxyKXtpZih0LWU+MioqMjQtMSl0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpO2NvbnN0IGE9ci5sZW5ndGg7bGV0IGk9MDtmb3IoO2U8PXQmJmk8YTspe3RoaXMuX21hcFtlXT1yW2krK107KytlfX1tYXBPbmUoZSx0KXt0aGlzLl9tYXBbZV09dH1sb29rdXAoZSl7cmV0dXJuIHRoaXMuX21hcFtlXX1jb250YWlucyhlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fbWFwW2VdfWZvckVhY2goZSl7Y29uc3QgdD10aGlzLl9tYXAscj10Lmxlbmd0aDtpZihyPD02NTUzNilmb3IobGV0IGE9MDthPHI7YSsrKXZvaWQgMCE9PXRbYV0mJmUoYSx0W2FdKTtlbHNlIGZvcihjb25zdCByIGluIHQpZShyLHRbcl0pfWNoYXJDb2RlT2YoZSl7Y29uc3QgdD10aGlzLl9tYXA7aWYodC5sZW5ndGg8PTY1NTM2KXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKGNvbnN0IHIgaW4gdClpZih0W3JdPT09ZSlyZXR1cm4gMHxyO3JldHVybi0xfWdldE1hcCgpe3JldHVybiB0aGlzLl9tYXB9cmVhZENoYXJDb2RlKGUsdCxyKXtsZXQgYT0wO2NvbnN0IGk9dGhpcy5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCBuPTAscz1pLmxlbmd0aDtuPHM7bisrKXthPShhPDw4fGUuY2hhckNvZGVBdCh0K24pKT4+PjA7Y29uc3Qgcz1pW25dO2ZvcihsZXQgZT0wLHQ9cy5sZW5ndGg7ZTx0Oyl7Y29uc3QgdD1zW2UrK10saT1zW2UrK107aWYoYT49dCYmYTw9aSl7ci5jaGFyY29kZT1hO3IubGVuZ3RoPW4rMTtyZXR1cm59fX1yLmNoYXJjb2RlPTA7ci5sZW5ndGg9MX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuX21hcC5sZW5ndGh9Z2V0IGlzSWRlbnRpdHlDTWFwKCl7aWYoIklkZW50aXR5LUgiIT09dGhpcy5uYW1lJiYiSWRlbnRpdHktViIhPT10aGlzLm5hbWUpcmV0dXJuITE7aWYoNjU1MzYhPT10aGlzLl9tYXAubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgZT0wO2U8NjU1MzY7ZSsrKWlmKHRoaXMuX21hcFtlXSE9PWUpcmV0dXJuITE7cmV0dXJuITB9fXQuQ01hcD1DTWFwO2NsYXNzIElkZW50aXR5Q01hcCBleHRlbmRzIENNYXB7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO3RoaXMudmVydGljYWw9ZTt0aGlzLmFkZENvZGVzcGFjZVJhbmdlKHQsMCw2NTUzNSl9bWFwQ2lkUmFuZ2UoZSx0LHIpeygwLGEudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2UiKX1tYXBCZlJhbmdlKGUsdCxyKXsoMCxhLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2UiKX1tYXBCZlJhbmdlVG9BcnJheShlLHQscil7KDAsYS51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlVG9BcnJheSIpfW1hcE9uZShlLHQpeygwLGEudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkT25lIil9bG9va3VwKGUpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPD02NTUzNT9lOnZvaWQgMH1jb250YWlucyhlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKSYmZTw9NjU1MzV9Zm9yRWFjaChlKXtmb3IobGV0IHQ9MDt0PD02NTUzNTt0KyspZSh0LHQpfWNoYXJDb2RlT2YoZSl7cmV0dXJuIE51bWJlci5pc0ludGVnZXIoZSkmJmU8PTY1NTM1P2U6LTF9Z2V0TWFwKCl7Y29uc3QgZT1uZXcgQXJyYXkoNjU1MzYpO2ZvcihsZXQgdD0wO3Q8PTY1NTM1O3QrKyllW3RdPXQ7cmV0dXJuIGV9Z2V0IGxlbmd0aCgpe3JldHVybiA2NTUzNn1nZXQgaXNJZGVudGl0eUNNYXAoKXsoMCxhLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBhY2Nlc3MgLmlzSWRlbnRpdHlDTWFwIil9fXQuSWRlbnRpdHlDTWFwPUlkZW50aXR5Q01hcDt2YXIgbD1mdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyQ2xvc3VyZSgpe2Z1bmN0aW9uIGhleFRvSW50KGUsdCl7Zm9yKHZhciByPTAsYT0wO2E8PXQ7YSsrKXI9cjw8OHxlW2FdO3JldHVybiByPj4+MH1mdW5jdGlvbiBoZXhUb1N0cihlLHQpe3JldHVybiAxPT09dD9TdHJpbmcuZnJvbUNoYXJDb2RlKGVbMF0sZVsxXSk6Mz09PXQ/U3RyaW5nLmZyb21DaGFyQ29kZShlWzBdLGVbMV0sZVsyXSxlWzNdKTpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZS5zdWJhcnJheSgwLHQrMSkpfWZ1bmN0aW9uIGFkZEhleChlLHQscil7Zm9yKHZhciBhPTAsaT1yO2k+PTA7aS0tKXthKz1lW2ldK3RbaV07ZVtpXT0yNTUmYTthPj49OH19ZnVuY3Rpb24gaW5jSGV4KGUsdCl7Zm9yKHZhciByPTEsYT10O2E+PTAmJnI+MDthLS0pe3IrPWVbYV07ZVthXT0yNTUmcjtyPj49OH19ZnVuY3Rpb24gQmluYXJ5Q01hcFN0cmVhbShlKXt0aGlzLmJ1ZmZlcj1lO3RoaXMucG9zPTA7dGhpcy5lbmQ9ZS5sZW5ndGg7dGhpcy50bXBCdWY9bmV3IFVpbnQ4QXJyYXkoMTkpfUJpbmFyeUNNYXBTdHJlYW0ucHJvdG90eXBlPXtyZWFkQnl0ZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5lbmQ/LTE6dGhpcy5idWZmZXJbdGhpcy5wb3MrK119LHJlYWROdW1iZXIoKXt2YXIgZSx0PTA7ZG97dmFyIHI9dGhpcy5yZWFkQnl0ZSgpO2lmKHI8MCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTtlPSEoMTI4JnIpO3Q9dDw8N3wxMjcmcn13aGlsZSghZSk7cmV0dXJuIHR9LHJlYWRTaWduZWQoKXt2YXIgZT10aGlzLnJlYWROdW1iZXIoKTtyZXR1cm4gMSZlP34oZT4+PjEpOmU+Pj4xfSxyZWFkSGV4KGUsdCl7ZS5zZXQodGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3MsdGhpcy5wb3MrdCsxKSk7dGhpcy5wb3MrPXQrMX0scmVhZEhleE51bWJlcihlLHQpe3ZhciByLGk9dGhpcy50bXBCdWYsbj0wO2Rve3ZhciBzPXRoaXMucmVhZEJ5dGUoKTtpZihzPDApdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoInVuZXhwZWN0ZWQgRU9GIGluIGJjbWFwIik7cj0hKDEyOCZzKTtpW24rK109MTI3JnN9d2hpbGUoIXIpO2Zvcih2YXIgbz10LGM9MCxsPTA7bz49MDspe2Zvcig7bDw4JiZpLmxlbmd0aD4wOyl7Yz1pWy0tbl08PGx8YztsKz03fWVbb109MjU1JmM7by0tO2M+Pj04O2wtPTh9fSxyZWFkSGV4U2lnbmVkKGUsdCl7dGhpcy5yZWFkSGV4TnVtYmVyKGUsdCk7Zm9yKHZhciByPTEmZVt0XT8yNTU6MCxhPTAsaT0wO2k8PXQ7aSsrKXthPSgxJmEpPDw4fGVbaV07ZVtpXT1hPj4xXnJ9fSxyZWFkU3RyaW5nKCl7Zm9yKHZhciBlPXRoaXMucmVhZE51bWJlcigpLHQ9IiIscj0wO3I8ZTtyKyspdCs9U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWROdW1iZXIoKSk7cmV0dXJuIHR9fTtmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyKCl7fUJpbmFyeUNNYXBSZWFkZXIucHJvdG90eXBlPXtwcm9jZXNzOmZ1bmN0aW9uIHByb2Nlc3NCaW5hcnlDTWFwKGUsdCxyKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGEsaSl7dmFyIG49bmV3IEJpbmFyeUNNYXBTdHJlYW0oZSkscz1uLnJlYWRCeXRlKCk7dC52ZXJ0aWNhbD0hISgxJnMpO2Zvcih2YXIgbyxjLGw9bnVsbCxoPW5ldyBVaW50OEFycmF5KDE2KSx1PW5ldyBVaW50OEFycmF5KDE2KSxkPW5ldyBVaW50OEFycmF5KDE2KSxmPW5ldyBVaW50OEFycmF5KDE2KSxnPW5ldyBVaW50OEFycmF5KDE2KTsoYz1uLnJlYWRCeXRlKCkpPj0wOyl7dmFyIG09Yz4+NTtpZig3IT09bSl7dmFyIHA9ISEoMTYmYyksYj0xNSZjO2lmKGIrMT4xNil0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3NCaW5hcnlDTWFwOiBJbnZhbGlkIGRhdGFTaXplLiIpO3ZhciB5LHY9bi5yZWFkTnVtYmVyKCk7c3dpdGNoKG0pe2Nhc2UgMDpuLnJlYWRIZXgoaCxiKTtuLnJlYWRIZXhOdW1iZXIodSxiKTthZGRIZXgodSxoLGIpO3QuYWRkQ29kZXNwYWNlUmFuZ2UoYisxLGhleFRvSW50KGgsYiksaGV4VG9JbnQodSxiKSk7Zm9yKHk9MTt5PHY7eSsrKXtpbmNIZXgodSxiKTtuLnJlYWRIZXhOdW1iZXIoaCxiKTthZGRIZXgoaCx1LGIpO24ucmVhZEhleE51bWJlcih1LGIpO2FkZEhleCh1LGgsYik7dC5hZGRDb2Rlc3BhY2VSYW5nZShiKzEsaGV4VG9JbnQoaCxiKSxoZXhUb0ludCh1LGIpKX1icmVhaztjYXNlIDE6bi5yZWFkSGV4KGgsYik7bi5yZWFkSGV4TnVtYmVyKHUsYik7YWRkSGV4KHUsaCxiKTtuLnJlYWROdW1iZXIoKTtmb3IoeT0xO3k8djt5Kyspe2luY0hleCh1LGIpO24ucmVhZEhleE51bWJlcihoLGIpO2FkZEhleChoLHUsYik7bi5yZWFkSGV4TnVtYmVyKHUsYik7YWRkSGV4KHUsaCxiKTtuLnJlYWROdW1iZXIoKX1icmVhaztjYXNlIDI6bi5yZWFkSGV4KGQsYik7bz1uLnJlYWROdW1iZXIoKTt0Lm1hcE9uZShoZXhUb0ludChkLGIpLG8pO2Zvcih5PTE7eTx2O3krKyl7aW5jSGV4KGQsYik7aWYoIXApe24ucmVhZEhleE51bWJlcihnLGIpO2FkZEhleChkLGcsYil9bz1uLnJlYWRTaWduZWQoKSsobysxKTt0Lm1hcE9uZShoZXhUb0ludChkLGIpLG8pfWJyZWFrO2Nhc2UgMzpuLnJlYWRIZXgoaCxiKTtuLnJlYWRIZXhOdW1iZXIodSxiKTthZGRIZXgodSxoLGIpO289bi5yZWFkTnVtYmVyKCk7dC5tYXBDaWRSYW5nZShoZXhUb0ludChoLGIpLGhleFRvSW50KHUsYiksbyk7Zm9yKHk9MTt5PHY7eSsrKXtpbmNIZXgodSxiKTtpZihwKWguc2V0KHUpO2Vsc2V7bi5yZWFkSGV4TnVtYmVyKGgsYik7YWRkSGV4KGgsdSxiKX1uLnJlYWRIZXhOdW1iZXIodSxiKTthZGRIZXgodSxoLGIpO289bi5yZWFkTnVtYmVyKCk7dC5tYXBDaWRSYW5nZShoZXhUb0ludChoLGIpLGhleFRvSW50KHUsYiksbyl9YnJlYWs7Y2FzZSA0Om4ucmVhZEhleChkLDEpO24ucmVhZEhleChmLGIpO3QubWFwT25lKGhleFRvSW50KGQsMSksaGV4VG9TdHIoZixiKSk7Zm9yKHk9MTt5PHY7eSsrKXtpbmNIZXgoZCwxKTtpZighcCl7bi5yZWFkSGV4TnVtYmVyKGcsMSk7YWRkSGV4KGQsZywxKX1pbmNIZXgoZixiKTtuLnJlYWRIZXhTaWduZWQoZyxiKTthZGRIZXgoZixnLGIpO3QubWFwT25lKGhleFRvSW50KGQsMSksaGV4VG9TdHIoZixiKSl9YnJlYWs7Y2FzZSA1Om4ucmVhZEhleChoLDEpO24ucmVhZEhleE51bWJlcih1LDEpO2FkZEhleCh1LGgsMSk7bi5yZWFkSGV4KGYsYik7dC5tYXBCZlJhbmdlKGhleFRvSW50KGgsMSksaGV4VG9JbnQodSwxKSxoZXhUb1N0cihmLGIpKTtmb3IoeT0xO3k8djt5Kyspe2luY0hleCh1LDEpO2lmKHApaC5zZXQodSk7ZWxzZXtuLnJlYWRIZXhOdW1iZXIoaCwxKTthZGRIZXgoaCx1LDEpfW4ucmVhZEhleE51bWJlcih1LDEpO2FkZEhleCh1LGgsMSk7bi5yZWFkSGV4KGYsYik7dC5tYXBCZlJhbmdlKGhleFRvSW50KGgsMSksaGV4VG9JbnQodSwxKSxoZXhUb1N0cihmLGIpKX1icmVhaztkZWZhdWx0OmkobmV3IEVycm9yKCJwcm9jZXNzQmluYXJ5Q01hcDogVW5rbm93biB0eXBlOiAiK20pKTtyZXR1cm59fWVsc2Ugc3dpdGNoKDMxJmMpe2Nhc2UgMDpuLnJlYWRTdHJpbmcoKTticmVhaztjYXNlIDE6bD1uLnJlYWRTdHJpbmcoKX19YShsP3IobCk6dCl9KSl9fTtyZXR1cm4gQmluYXJ5Q01hcFJlYWRlcn0oKSxoPWZ1bmN0aW9uIENNYXBGYWN0b3J5Q2xvc3VyZSgpe2Z1bmN0aW9uIHN0clRvSW50KGUpe2Zvcih2YXIgdD0wLHI9MDtyPGUubGVuZ3RoO3IrKyl0PXQ8PDh8ZS5jaGFyQ29kZUF0KHIpO3JldHVybiB0Pj4+MH1mdW5jdGlvbiBleHBlY3RTdHJpbmcoZSl7aWYoISgwLGEuaXNTdHJpbmcpKGUpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgc3RyaW5nLiIpfWZ1bmN0aW9uIGV4cGVjdEludChlKXtpZighTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTWFsZm9ybWVkIENNYXA6IGV4cGVjdGVkIGludC4iKX1mdW5jdGlvbiBwYXJzZUJmQ2hhcihlLHQpe2Zvcig7Oyl7dmFyIHI9dC5nZXRPYmooKTtpZigoMCxpLmlzRU9GKShyKSlicmVhaztpZigoMCxpLmlzQ21kKShyLCJlbmRiZmNoYXIiKSlyZXR1cm47ZXhwZWN0U3RyaW5nKHIpO3ZhciBhPXN0clRvSW50KHIpO2V4cGVjdFN0cmluZyhyPXQuZ2V0T2JqKCkpO3ZhciBuPXI7ZS5tYXBPbmUoYSxuKX19ZnVuY3Rpb24gcGFyc2VCZlJhbmdlKGUsdCl7Zm9yKDs7KXt2YXIgcj10LmdldE9iaigpO2lmKCgwLGkuaXNFT0YpKHIpKWJyZWFrO2lmKCgwLGkuaXNDbWQpKHIsImVuZGJmcmFuZ2UiKSlyZXR1cm47ZXhwZWN0U3RyaW5nKHIpO3ZhciBuPXN0clRvSW50KHIpO2V4cGVjdFN0cmluZyhyPXQuZ2V0T2JqKCkpO3ZhciBzPXN0clRvSW50KHIpO3I9dC5nZXRPYmooKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHIpfHwoMCxhLmlzU3RyaW5nKShyKSl7dmFyIG89TnVtYmVyLmlzSW50ZWdlcihyKT9TdHJpbmcuZnJvbUNoYXJDb2RlKHIpOnI7ZS5tYXBCZlJhbmdlKG4scyxvKX1lbHNle2lmKCEoMCxpLmlzQ21kKShyLCJbIikpYnJlYWs7cj10LmdldE9iaigpO2Zvcih2YXIgYz1bXTshKDAsaS5pc0NtZCkociwiXSIpJiYhKDAsaS5pc0VPRikocik7KXtjLnB1c2gocik7cj10LmdldE9iaigpfWUubWFwQmZSYW5nZVRvQXJyYXkobixzLGMpfX10aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBiZiByYW5nZS4iKX1mdW5jdGlvbiBwYXJzZUNpZENoYXIoZSx0KXtmb3IoOzspe3ZhciByPXQuZ2V0T2JqKCk7aWYoKDAsaS5pc0VPRikocikpYnJlYWs7aWYoKDAsaS5pc0NtZCkociwiZW5kY2lkY2hhciIpKXJldHVybjtleHBlY3RTdHJpbmcocik7dmFyIGE9c3RyVG9JbnQocik7ZXhwZWN0SW50KHI9dC5nZXRPYmooKSk7dmFyIG49cjtlLm1hcE9uZShhLG4pfX1mdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGUsdCl7Zm9yKDs7KXt2YXIgcj10LmdldE9iaigpO2lmKCgwLGkuaXNFT0YpKHIpKWJyZWFrO2lmKCgwLGkuaXNDbWQpKHIsImVuZGNpZHJhbmdlIikpcmV0dXJuO2V4cGVjdFN0cmluZyhyKTt2YXIgYT1zdHJUb0ludChyKTtleHBlY3RTdHJpbmcocj10LmdldE9iaigpKTt2YXIgbj1zdHJUb0ludChyKTtleHBlY3RJbnQocj10LmdldE9iaigpKTt2YXIgcz1yO2UubWFwQ2lkUmFuZ2UoYSxuLHMpfX1mdW5jdGlvbiBwYXJzZUNvZGVzcGFjZVJhbmdlKGUsdCl7Zm9yKDs7KXt2YXIgcj10LmdldE9iaigpO2lmKCgwLGkuaXNFT0YpKHIpKWJyZWFrO2lmKCgwLGkuaXNDbWQpKHIsImVuZGNvZGVzcGFjZXJhbmdlIikpcmV0dXJuO2lmKCEoMCxhLmlzU3RyaW5nKShyKSlicmVhazt2YXIgbj1zdHJUb0ludChyKTtyPXQuZ2V0T2JqKCk7aWYoISgwLGEuaXNTdHJpbmcpKHIpKWJyZWFrO3ZhciBzPXN0clRvSW50KHIpO2UuYWRkQ29kZXNwYWNlUmFuZ2Uoci5sZW5ndGgsbixzKX10aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBjb2Rlc3BhY2UgcmFuZ2UuIil9ZnVuY3Rpb24gcGFyc2VXTW9kZShlLHQpe3ZhciByPXQuZ2V0T2JqKCk7TnVtYmVyLmlzSW50ZWdlcihyKSYmKGUudmVydGljYWw9ISFyKX1mdW5jdGlvbiBwYXJzZUNNYXBOYW1lKGUsdCl7dmFyIHI9dC5nZXRPYmooKTsoMCxpLmlzTmFtZSkocikmJigwLGEuaXNTdHJpbmcpKHIubmFtZSkmJihlLm5hbWU9ci5uYW1lKX1mdW5jdGlvbiBwYXJzZUNNYXAoZSx0LHIsbil7dmFyIG8sYztlOmZvcig7Oyl0cnl7dmFyIGw9dC5nZXRPYmooKTtpZigoMCxpLmlzRU9GKShsKSlicmVhaztpZigoMCxpLmlzTmFtZSkobCkpeyJXTW9kZSI9PT1sLm5hbWU/cGFyc2VXTW9kZShlLHQpOiJDTWFwTmFtZSI9PT1sLm5hbWUmJnBhcnNlQ01hcE5hbWUoZSx0KTtvPWx9ZWxzZSBpZigoMCxpLmlzQ21kKShsKSlzd2l0Y2gobC5jbWQpe2Nhc2UiZW5kY21hcCI6YnJlYWsgZTtjYXNlInVzZWNtYXAiOigwLGkuaXNOYW1lKShvKSYmKGM9by5uYW1lKTticmVhaztjYXNlImJlZ2luY29kZXNwYWNlcmFuZ2UiOnBhcnNlQ29kZXNwYWNlUmFuZ2UoZSx0KTticmVhaztjYXNlImJlZ2luYmZjaGFyIjpwYXJzZUJmQ2hhcihlLHQpO2JyZWFrO2Nhc2UiYmVnaW5jaWRjaGFyIjpwYXJzZUNpZENoYXIoZSx0KTticmVhaztjYXNlImJlZ2luYmZyYW5nZSI6cGFyc2VCZlJhbmdlKGUsdCk7YnJlYWs7Y2FzZSJiZWdpbmNpZHJhbmdlIjpwYXJzZUNpZFJhbmdlKGUsdCl9fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS53YXJuKSgiSW52YWxpZCBjTWFwIGRhdGE6ICIrZSk7Y29udGludWV9IW4mJmMmJihuPWMpO3JldHVybiBuP2V4dGVuZENNYXAoZSxyLG4pOlByb21pc2UucmVzb2x2ZShlKX1mdW5jdGlvbiBleHRlbmRDTWFwKGUsdCxyKXtyZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAocix0KS50aGVuKChmdW5jdGlvbih0KXtlLnVzZUNNYXA9dDtpZigwPT09ZS5udW1Db2Rlc3BhY2VSYW5nZXMpe2Zvcih2YXIgcj1lLnVzZUNNYXAuY29kZXNwYWNlUmFuZ2VzLGE9MDthPHIubGVuZ3RoO2ErKyllLmNvZGVzcGFjZVJhbmdlc1thXT1yW2FdLnNsaWNlKCk7ZS5udW1Db2Rlc3BhY2VSYW5nZXM9ZS51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlc31lLnVzZUNNYXAuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtlLmNvbnRhaW5zKHQpfHxlLm1hcE9uZSh0LGUudXNlQ01hcC5sb29rdXAodCkpfSkpO3JldHVybiBlfSkpfWZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKGUsdCl7cmV0dXJuIklkZW50aXR5LUgiPT09ZT9Qcm9taXNlLnJlc29sdmUobmV3IElkZW50aXR5Q01hcCghMSwyKSk6IklkZW50aXR5LVYiPT09ZT9Qcm9taXNlLnJlc29sdmUobmV3IElkZW50aXR5Q01hcCghMCwyKSk6Yy5pbmNsdWRlcyhlKT90P3QoZSkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHI9ZS5jTWFwRGF0YSxpPWUuY29tcHJlc3Npb25UeXBlLHM9bmV3IENNYXAoITApO2lmKGk9PT1hLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZKXJldHVybihuZXcgbCkucHJvY2VzcyhyLHMsKGZ1bmN0aW9uKGUpe3JldHVybiBleHRlbmRDTWFwKHMsdCxlKX0pKTtpZihpPT09YS5DTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpe3ZhciBjPW5ldyBuLkxleGVyKG5ldyBvLlN0cmVhbShyKSk7cmV0dXJuIHBhcnNlQ01hcChzLGMsdCxudWxsKX1yZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJUT0RPOiBPbmx5IEJJTkFSWS9OT05FIENNYXAgY29tcHJlc3Npb24gaXMgY3VycmVudGx5IHN1cHBvcnRlZC4iKSl9KSk6UHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJCdWlsdC1pbiBDTWFwIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm92aWRlZC4iKSk6UHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJVbmtub3duIENNYXAgbmFtZTogIitlKSl9cmV0dXJue2FzeW5jIGNyZWF0ZShlKXt2YXIgdD1lLmVuY29kaW5nLHI9ZS5mZXRjaEJ1aWx0SW5DTWFwLGE9ZS51c2VDTWFwO2lmKCgwLGkuaXNOYW1lKSh0KSlyZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAodC5uYW1lLHIpO2lmKCgwLGkuaXNTdHJlYW0pKHQpKXtyZXR1cm4gcGFyc2VDTWFwKG5ldyBDTWFwLG5ldyBuLkxleGVyKHQpLHIsYSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNJZGVudGl0eUNNYXA/Y3JlYXRlQnVpbHRJbkNNYXAoZS5uYW1lLHIpOmV9KSl9dGhyb3cgbmV3IEVycm9yKCJFbmNvZGluZyByZXF1aXJlZC4iKX19fSgpO3QuQ01hcEZhY3Rvcnk9aH0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5nZXRGb250VHlwZT1nZXRGb250VHlwZTt0LklkZW50aXR5VG9Vbmljb2RlTWFwPXQuVG9Vbmljb2RlTWFwPXQuRm9udEZsYWdzPXQuRm9udD10LkVycm9yRm9udD10LlNFQUNfQU5BTFlTSVNfRU5BQkxFRD12b2lkIDA7dmFyIGE9cigyKSxpPXIoMzEpLG49cigzNCkscz1yKDMzKSxvPXIoMzUpLGM9cigzNiksbD1yKDgpLGg9cigzNyksdT1yKDI5KSxkPXIoMTIpLGY9cigzOCk7Y29uc3QgZz1bWzU3MzQ0LDYzNzQzXSxbMTA0ODU3NiwxMTE0MTA5XV07dC5TRUFDX0FOQUxZU0lTX0VOQUJMRUQ9ITA7Y29uc3QgbT1bImFzY2VudCIsImJib3giLCJibGFjayIsImJvbGQiLCJjaGFyUHJvY09wZXJhdG9yTGlzdCIsImNvbXBvc2l0ZSIsImRhdGEiLCJkZWZhdWx0Vk1ldHJpY3MiLCJkZWZhdWx0V2lkdGgiLCJkZXNjZW50IiwiZmFsbGJhY2tOYW1lIiwiZm9udE1hdHJpeCIsImZvbnRUeXBlIiwiaXNNb25vc3BhY2UiLCJpc1NlcmlmRm9udCIsImlzVHlwZTNGb250IiwiaXRhbGljIiwibG9hZGVkTmFtZSIsIm1pbWV0eXBlIiwibWlzc2luZ0ZpbGUiLCJuYW1lIiwicmVtZWFzdXJlIiwic3VidHlwZSIsInR5cGUiLCJ2ZXJ0aWNhbCJdLHA9WyJjTWFwIiwiZGVmYXVsdEVuY29kaW5nIiwiZGlmZmVyZW5jZXMiLCJpc1N5bWJvbGljRm9udCIsInNlYWNNYXAiLCJ0b0ZvbnRDaGFyIiwidG9Vbmljb2RlIiwidm1ldHJpY3MiLCJ3aWR0aHMiXTt2YXIgYj17Rml4ZWRQaXRjaDoxLFNlcmlmOjIsU3ltYm9saWM6NCxTY3JpcHQ6OCxOb25zeW1ib2xpYzozMixJdGFsaWM6NjQsQWxsQ2FwOjY1NTM2LFNtYWxsQ2FwOjEzMTA3MixGb3JjZUJvbGQ6MjYyMTQ0fTt0LkZvbnRGbGFncz1iO3ZhciB5PVsiLm5vdGRlZiIsIi5udWxsIiwibm9ubWFya2luZ3JldHVybiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3Rlc2luZ2xlIiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJncmF2ZSIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCJBZGllcmVzaXMiLCJBcmluZyIsIkNjZWRpbGxhIiwiRWFjdXRlIiwiTnRpbGRlIiwiT2RpZXJlc2lzIiwiVWRpZXJlc2lzIiwiYWFjdXRlIiwiYWdyYXZlIiwiYWNpcmN1bWZsZXgiLCJhZGllcmVzaXMiLCJhdGlsZGUiLCJhcmluZyIsImNjZWRpbGxhIiwiZWFjdXRlIiwiZWdyYXZlIiwiZWNpcmN1bWZsZXgiLCJlZGllcmVzaXMiLCJpYWN1dGUiLCJpZ3JhdmUiLCJpY2lyY3VtZmxleCIsImlkaWVyZXNpcyIsIm50aWxkZSIsIm9hY3V0ZSIsIm9ncmF2ZSIsIm9jaXJjdW1mbGV4Iiwib2RpZXJlc2lzIiwib3RpbGRlIiwidWFjdXRlIiwidWdyYXZlIiwidWNpcmN1bWZsZXgiLCJ1ZGllcmVzaXMiLCJkYWdnZXIiLCJkZWdyZWUiLCJjZW50Iiwic3RlcmxpbmciLCJzZWN0aW9uIiwiYnVsbGV0IiwicGFyYWdyYXBoIiwiZ2VybWFuZGJscyIsInJlZ2lzdGVyZWQiLCJjb3B5cmlnaHQiLCJ0cmFkZW1hcmsiLCJhY3V0ZSIsImRpZXJlc2lzIiwibm90ZXF1YWwiLCJBRSIsIk9zbGFzaCIsImluZmluaXR5IiwicGx1c21pbnVzIiwibGVzc2VxdWFsIiwiZ3JlYXRlcmVxdWFsIiwieWVuIiwibXUiLCJwYXJ0aWFsZGlmZiIsInN1bW1hdGlvbiIsInByb2R1Y3QiLCJwaSIsImludGVncmFsIiwib3JkZmVtaW5pbmUiLCJvcmRtYXNjdWxpbmUiLCJPbWVnYSIsImFlIiwib3NsYXNoIiwicXVlc3Rpb25kb3duIiwiZXhjbGFtZG93biIsImxvZ2ljYWxub3QiLCJyYWRpY2FsIiwiZmxvcmluIiwiYXBwcm94ZXF1YWwiLCJEZWx0YSIsImd1aWxsZW1vdGxlZnQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwibm9uYnJlYWtpbmdzcGFjZSIsIkFncmF2ZSIsIkF0aWxkZSIsIk90aWxkZSIsIk9FIiwib2UiLCJlbmRhc2giLCJlbWRhc2giLCJxdW90ZWRibGxlZnQiLCJxdW90ZWRibHJpZ2h0IiwicXVvdGVsZWZ0IiwicXVvdGVyaWdodCIsImRpdmlkZSIsImxvemVuZ2UiLCJ5ZGllcmVzaXMiLCJZZGllcmVzaXMiLCJmcmFjdGlvbiIsImN1cnJlbmN5IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJwZXJ0aG91c2FuZCIsIkFjaXJjdW1mbGV4IiwiRWNpcmN1bWZsZXgiLCJBYWN1dGUiLCJFZGllcmVzaXMiLCJFZ3JhdmUiLCJJYWN1dGUiLCJJY2lyY3VtZmxleCIsIklkaWVyZXNpcyIsIklncmF2ZSIsIk9hY3V0ZSIsIk9jaXJjdW1mbGV4IiwiYXBwbGUiLCJPZ3JhdmUiLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVncmF2ZSIsImRvdGxlc3NpIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJyaW5nIiwiY2VkaWxsYSIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIiwiTHNsYXNoIiwibHNsYXNoIiwiU2Nhcm9uIiwic2Nhcm9uIiwiWmNhcm9uIiwiemNhcm9uIiwiYnJva2VuYmFyIiwiRXRoIiwiZXRoIiwiWWFjdXRlIiwieWFjdXRlIiwiVGhvcm4iLCJ0aG9ybiIsIm1pbnVzIiwibXVsdGlwbHkiLCJvbmVzdXBlcmlvciIsInR3b3N1cGVyaW9yIiwidGhyZWVzdXBlcmlvciIsIm9uZWhhbGYiLCJvbmVxdWFydGVyIiwidGhyZWVxdWFydGVycyIsImZyYW5jIiwiR2JyZXZlIiwiZ2JyZXZlIiwiSWRvdGFjY2VudCIsIlNjZWRpbGxhIiwic2NlZGlsbGEiLCJDYWN1dGUiLCJjYWN1dGUiLCJDY2Fyb24iLCJjY2Fyb24iLCJkY3JvYXQiXTtmdW5jdGlvbiBhZGp1c3RXaWR0aHMoZSl7aWYoZS5mb250TWF0cml4JiZlLmZvbnRNYXRyaXhbMF0hPT1hLkZPTlRfSURFTlRJVFlfTUFUUklYWzBdKXt2YXIgdD0uMDAxL2UuZm9udE1hdHJpeFswXSxyPWUud2lkdGhzO2Zvcih2YXIgaSBpbiByKXJbaV0qPXQ7ZS5kZWZhdWx0V2lkdGgqPXR9fWZ1bmN0aW9uIGdldEZvbnRUeXBlKGUsdCl7c3dpdGNoKGUpe2Nhc2UiVHlwZTEiOnJldHVybiJUeXBlMUMiPT09dD9hLkZvbnRUeXBlLlRZUEUxQzphLkZvbnRUeXBlLlRZUEUxO2Nhc2UiQ0lERm9udFR5cGUwIjpyZXR1cm4iQ0lERm9udFR5cGUwQyI9PT10P2EuRm9udFR5cGUuQ0lERk9OVFRZUEUwQzphLkZvbnRUeXBlLkNJREZPTlRUWVBFMDtjYXNlIk9wZW5UeXBlIjpyZXR1cm4gYS5Gb250VHlwZS5PUEVOVFlQRTtjYXNlIlRydWVUeXBlIjpyZXR1cm4gYS5Gb250VHlwZS5UUlVFVFlQRTtjYXNlIkNJREZvbnRUeXBlMiI6cmV0dXJuIGEuRm9udFR5cGUuQ0lERk9OVFRZUEUyO2Nhc2UiTU1UeXBlMSI6cmV0dXJuIGEuRm9udFR5cGUuTU1UWVBFMTtjYXNlIlR5cGUwIjpyZXR1cm4gYS5Gb250VHlwZS5UWVBFMDtkZWZhdWx0OnJldHVybiBhLkZvbnRUeXBlLlVOS05PV059fWZ1bmN0aW9uIHJlY292ZXJHbHlwaE5hbWUoZSx0KXtpZih2b2lkIDAhPT10W2VdKXJldHVybiBlO3ZhciByPSgwLGMuZ2V0VW5pY29kZUZvckdseXBoKShlLHQpO2lmKC0xIT09cilmb3IodmFyIGkgaW4gdClpZih0W2ldPT09cilyZXR1cm4gaTsoMCxhLmluZm8pKCJVbmFibGUgdG8gcmVjb3ZlciBhIHN0YW5kYXJkIGdseXBoIG5hbWUgZm9yOiAiK2UpO3JldHVybiBlfXZhciB2PWZ1bmN0aW9uIEdseXBoQ2xvc3VyZSgpe2Z1bmN0aW9uIEdseXBoKGUsdCxyLGEsaSxuLHMsbyl7dGhpcy5mb250Q2hhcj1lO3RoaXMudW5pY29kZT10O3RoaXMuYWNjZW50PXI7dGhpcy53aWR0aD1hO3RoaXMudm1ldHJpYz1pO3RoaXMub3BlcmF0b3JMaXN0SWQ9bjt0aGlzLmlzU3BhY2U9czt0aGlzLmlzSW5Gb250PW99R2x5cGgucHJvdG90eXBlLm1hdGNoZXNGb3JDYWNoZT1mdW5jdGlvbihlLHQscixhLGksbixzLG8pe3JldHVybiB0aGlzLmZvbnRDaGFyPT09ZSYmdGhpcy51bmljb2RlPT09dCYmdGhpcy5hY2NlbnQ9PT1yJiZ0aGlzLndpZHRoPT09YSYmdGhpcy52bWV0cmljPT09aSYmdGhpcy5vcGVyYXRvckxpc3RJZD09PW4mJnRoaXMuaXNTcGFjZT09PXMmJnRoaXMuaXNJbkZvbnQ9PT1vfTtyZXR1cm4gR2x5cGh9KCksdz1mdW5jdGlvbiBUb1VuaWNvZGVNYXBDbG9zdXJlKCl7ZnVuY3Rpb24gVG9Vbmljb2RlTWFwKGU9W10pe3RoaXMuX21hcD1lfVRvVW5pY29kZU1hcC5wcm90b3R5cGU9e2dldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbWFwLmxlbmd0aH0sZm9yRWFjaChlKXtmb3IodmFyIHQgaW4gdGhpcy5fbWFwKWUodCx0aGlzLl9tYXBbdF0uY2hhckNvZGVBdCgwKSl9LGhhcyhlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fbWFwW2VdfSxnZXQoZSl7cmV0dXJuIHRoaXMuX21hcFtlXX0sY2hhckNvZGVPZihlKXtjb25zdCB0PXRoaXMuX21hcDtpZih0Lmxlbmd0aDw9NjU1MzYpcmV0dXJuIHQuaW5kZXhPZihlKTtmb3IoY29uc3QgciBpbiB0KWlmKHRbcl09PT1lKXJldHVybiAwfHI7cmV0dXJuLTF9LGFtZW5kKGUpe2Zvcih2YXIgdCBpbiBlKXRoaXMuX21hcFt0XT1lW3RdfX07cmV0dXJuIFRvVW5pY29kZU1hcH0oKTt0LlRvVW5pY29kZU1hcD13O3ZhciBrPWZ1bmN0aW9uIElkZW50aXR5VG9Vbmljb2RlTWFwQ2xvc3VyZSgpe2Z1bmN0aW9uIElkZW50aXR5VG9Vbmljb2RlTWFwKGUsdCl7dGhpcy5maXJzdENoYXI9ZTt0aGlzLmxhc3RDaGFyPXR9SWRlbnRpdHlUb1VuaWNvZGVNYXAucHJvdG90eXBlPXtnZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMubGFzdENoYXIrMS10aGlzLmZpcnN0Q2hhcn0sZm9yRWFjaChlKXtmb3IodmFyIHQ9dGhpcy5maXJzdENoYXIscj10aGlzLmxhc3RDaGFyO3Q8PXI7dCsrKWUodCx0KX0saGFzKGUpe3JldHVybiB0aGlzLmZpcnN0Q2hhcjw9ZSYmZTw9dGhpcy5sYXN0Q2hhcn0sZ2V0KGUpe2lmKHRoaXMuZmlyc3RDaGFyPD1lJiZlPD10aGlzLmxhc3RDaGFyKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSxjaGFyQ29kZU9mKGUpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj10aGlzLmZpcnN0Q2hhciYmZTw9dGhpcy5sYXN0Q2hhcj9lOi0xfSxhbWVuZChlKXsoMCxhLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGFtZW5kKCkiKX19O3JldHVybiBJZGVudGl0eVRvVW5pY29kZU1hcH0oKTt0LklkZW50aXR5VG9Vbmljb2RlTWFwPWs7dmFyIFM9ZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlckNsb3N1cmUoKXtmdW5jdGlvbiB3cml0ZUludDE2KGUsdCxyKXtlW3RdPXI+PjgmMjU1O2VbdCsxXT0yNTUmcn1mdW5jdGlvbiB3cml0ZUludDMyKGUsdCxyKXtlW3RdPXI+PjI0JjI1NTtlW3QrMV09cj4+MTYmMjU1O2VbdCsyXT1yPj44JjI1NTtlW3QrM109MjU1JnJ9ZnVuY3Rpb24gd3JpdGVEYXRhKGUsdCxyKXt2YXIgYSxpO2lmKHIgaW5zdGFuY2VvZiBVaW50OEFycmF5KWUuc2V0KHIsdCk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHIpZm9yKGE9MCxpPXIubGVuZ3RoO2E8aTthKyspZVt0KytdPTI1NSZyLmNoYXJDb2RlQXQoYSk7ZWxzZSBmb3IoYT0wLGk9ci5sZW5ndGg7YTxpO2ErKyllW3QrK109MjU1JnJbYV19ZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcihlKXt0aGlzLnNmbnQ9ZTt0aGlzLnRhYmxlcz1PYmplY3QuY3JlYXRlKG51bGwpfU9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zPWZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJfZ2V0U2VhcmNoUGFyYW1zKGUsdCl7Zm9yKHZhciByPTEsYT0wOyhyXmUpPnI7KXtyPDw9MTthKyt9dmFyIGk9cip0O3JldHVybntyYW5nZTppLGVudHJ5OmEscmFuZ2VTaGlmdDp0KmUtaX19O09wZW5UeXBlRmlsZUJ1aWxkZXIucHJvdG90eXBlPXt0b0FycmF5OmZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJfdG9BcnJheSgpe3ZhciBlPXRoaXMuc2ZudCx0PXRoaXMudGFibGVzLHI9T2JqZWN0LmtleXModCk7ci5zb3J0KCk7dmFyIGksbixzLG8sYyxoPXIubGVuZ3RoLHU9MTIrMTYqaCxkPVt1XTtmb3IoaT0wO2k8aDtpKyspe3UrPSgobz10W3JbaV1dKS5sZW5ndGgrMyYtNCk+Pj4wO2QucHVzaCh1KX12YXIgZj1uZXcgVWludDhBcnJheSh1KTtmb3IoaT0wO2k8aDtpKyspe289dFtyW2ldXTt3cml0ZURhdGEoZixkW2ldLG8pfSJ0cnVlIj09PWUmJihlPSgwLGEuc3RyaW5nMzIpKDY1NTM2KSk7ZlswXT0yNTUmZS5jaGFyQ29kZUF0KDApO2ZbMV09MjU1JmUuY2hhckNvZGVBdCgxKTtmWzJdPTI1NSZlLmNoYXJDb2RlQXQoMik7ZlszXT0yNTUmZS5jaGFyQ29kZUF0KDMpO3dyaXRlSW50MTYoZiw0LGgpO3ZhciBnPU9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKGgsMTYpO3dyaXRlSW50MTYoZiw2LGcucmFuZ2UpO3dyaXRlSW50MTYoZiw4LGcuZW50cnkpO3dyaXRlSW50MTYoZiwxMCxnLnJhbmdlU2hpZnQpO3U9MTI7Zm9yKGk9MDtpPGg7aSsrKXtjPXJbaV07Zlt1XT0yNTUmYy5jaGFyQ29kZUF0KDApO2ZbdSsxXT0yNTUmYy5jaGFyQ29kZUF0KDEpO2ZbdSsyXT0yNTUmYy5jaGFyQ29kZUF0KDIpO2ZbdSszXT0yNTUmYy5jaGFyQ29kZUF0KDMpO3ZhciBtPTA7Zm9yKG49ZFtpXSxzPWRbaSsxXTtuPHM7bis9NCl7bT1tKygwLGwucmVhZFVpbnQzMikoZixuKT4+PjB9d3JpdGVJbnQzMihmLHUrNCxtKTt3cml0ZUludDMyKGYsdSs4LGRbaV0pO3dyaXRlSW50MzIoZix1KzEyLHRbY10ubGVuZ3RoKTt1Kz0xNn1yZXR1cm4gZn0sYWRkVGFibGU6ZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl9hZGRUYWJsZShlLHQpe2lmKGUgaW4gdGhpcy50YWJsZXMpdGhyb3cgbmV3IEVycm9yKCJUYWJsZSAiK2UrIiBhbHJlYWR5IGV4aXN0cyIpO3RoaXMudGFibGVzW2VdPXR9fTtyZXR1cm4gT3BlblR5cGVGaWxlQnVpbGRlcn0oKSxDPWZ1bmN0aW9uIEZvbnRDbG9zdXJlKCl7ZnVuY3Rpb24gRm9udChlLHQscil7dmFyIGk7dGhpcy5uYW1lPWU7dGhpcy5sb2FkZWROYW1lPXIubG9hZGVkTmFtZTt0aGlzLmlzVHlwZTNGb250PXIuaXNUeXBlM0ZvbnQ7dGhpcy5taXNzaW5nRmlsZT0hMTt0aGlzLmdseXBoQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmlzU2VyaWZGb250PSEhKHIuZmxhZ3MmYi5TZXJpZik7dGhpcy5pc1N5bWJvbGljRm9udD0hIShyLmZsYWdzJmIuU3ltYm9saWMpO3RoaXMuaXNNb25vc3BhY2U9ISEoci5mbGFncyZiLkZpeGVkUGl0Y2gpO3ZhciBuPXIudHlwZSxzPXIuc3VidHlwZTt0aGlzLnR5cGU9bjt0aGlzLnN1YnR5cGU9cztsZXQgbz0ic2Fucy1zZXJpZiI7dGhpcy5pc01vbm9zcGFjZT9vPSJtb25vc3BhY2UiOnRoaXMuaXNTZXJpZkZvbnQmJihvPSJzZXJpZiIpO3RoaXMuZmFsbGJhY2tOYW1lPW87dGhpcy5kaWZmZXJlbmNlcz1yLmRpZmZlcmVuY2VzO3RoaXMud2lkdGhzPXIud2lkdGhzO3RoaXMuZGVmYXVsdFdpZHRoPXIuZGVmYXVsdFdpZHRoO3RoaXMuY29tcG9zaXRlPXIuY29tcG9zaXRlO3RoaXMuY01hcD1yLmNNYXA7dGhpcy5hc2NlbnQ9ci5hc2NlbnQvMWUzO3RoaXMuZGVzY2VudD1yLmRlc2NlbnQvMWUzO3RoaXMuZm9udE1hdHJpeD1yLmZvbnRNYXRyaXg7dGhpcy5iYm94PXIuYmJveDt0aGlzLmRlZmF1bHRFbmNvZGluZz1yLmRlZmF1bHRFbmNvZGluZzt0aGlzLnRvVW5pY29kZT1yLnRvVW5pY29kZTt0aGlzLmZhbGxiYWNrVG9Vbmljb2RlPXIuZmFsbGJhY2tUb1VuaWNvZGV8fG5ldyB3O3RoaXMudG9Gb250Q2hhcj1bXTtpZigiVHlwZTMiIT09ci50eXBlKXt0aGlzLmNpZEVuY29kaW5nPXIuY2lkRW5jb2Rpbmc7dGhpcy52ZXJ0aWNhbD0hIXIudmVydGljYWw7aWYodGhpcy52ZXJ0aWNhbCl7dGhpcy52bWV0cmljcz1yLnZtZXRyaWNzO3RoaXMuZGVmYXVsdFZNZXRyaWNzPXIuZGVmYXVsdFZNZXRyaWNzfWlmKHQmJiF0LmlzRW1wdHkpe1tuLHNdPWZ1bmN0aW9uIGdldEZvbnRGaWxlVHlwZShlLHt0eXBlOnQsc3VidHlwZTpyLGNvbXBvc2l0ZTppfSl7bGV0IG4scztpZihmdW5jdGlvbiBpc1RydWVUeXBlRmlsZShlKXt2YXIgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4gNjU1MzY9PT0oMCxsLnJlYWRVaW50MzIpKHQsMCl8fCJ0cnVlIj09PSgwLGEuYnl0ZXNUb1N0cmluZykodCl9KGUpfHxpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZSkpbj1pPyJDSURGb250VHlwZTIiOiJUcnVlVHlwZSI7ZWxzZSBpZihmdW5jdGlvbiBpc09wZW5UeXBlRmlsZShlKXt2YXIgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4iT1RUTyI9PT0oMCxhLmJ5dGVzVG9TdHJpbmcpKHQpfShlKSluPWk/IkNJREZvbnRUeXBlMiI6Ik9wZW5UeXBlIjtlbHNlIGlmKGZ1bmN0aW9uIGlzVHlwZTFGaWxlKGUpe3ZhciB0PWUucGVla0J5dGVzKDIpO2lmKDM3PT09dFswXSYmMzM9PT10WzFdKXJldHVybiEwO2lmKDEyOD09PXRbMF0mJjE9PT10WzFdKXJldHVybiEwO3JldHVybiExfShlKSluPWk/IkNJREZvbnRUeXBlMCI6Ik1NVHlwZTEiPT09dD8iTU1UeXBlMSI6IlR5cGUxIjtlbHNlIGlmKGZ1bmN0aW9uIGlzQ0ZGRmlsZShlKXtjb25zdCB0PWUucGVla0J5dGVzKDQpO2lmKHRbMF0+PTEmJnRbM10+PTEmJnRbM108PTQpcmV0dXJuITA7cmV0dXJuITF9KGUpKWlmKGkpe249IkNJREZvbnRUeXBlMCI7cz0iQ0lERm9udFR5cGUwQyJ9ZWxzZXtuPSJNTVR5cGUxIj09PXQ/Ik1NVHlwZTEiOiJUeXBlMSI7cz0iVHlwZTFDIn1lbHNleygwLGEud2FybikoImdldEZvbnRGaWxlVHlwZTogVW5hYmxlIHRvIGRldGVjdCBjb3JyZWN0IGZvbnQgZmlsZSBUeXBlL1N1YnR5cGUuIik7bj10O3M9cn1yZXR1cm5bbixzXX0odCxyKTtuPT09dGhpcy50eXBlJiZzPT09dGhpcy5zdWJ0eXBlfHwoMCxhLmluZm8pKGBJbmNvbnNpc3RlbnQgZm9udCBmaWxlIFR5cGUvU3ViVHlwZSwgZXhwZWN0ZWQ6ICR7dGhpcy50eXBlfS8ke3RoaXMuc3VidHlwZX0gYnV0IGZvdW5kOiAke259LyR7c30uYCk7dHJ5e3ZhciBjO3N3aXRjaChuKXtjYXNlIk1NVHlwZTEiOigwLGEuaW5mbykoIk1NVHlwZTEgZm9udCAoIitlKyIpLCBmYWxsaW5nIGJhY2sgdG8gVHlwZTEuIik7Y2FzZSJUeXBlMSI6Y2FzZSJDSURGb250VHlwZTAiOnRoaXMubWltZXR5cGU9ImZvbnQvb3BlbnR5cGUiO3ZhciBoPSJUeXBlMUMiPT09c3x8IkNJREZvbnRUeXBlMEMiPT09cz9uZXcgVCh0LHIpOm5ldyBBKGUsdCxyKTthZGp1c3RXaWR0aHMocik7Yz10aGlzLmNvbnZlcnQoZSxoLHIpO2JyZWFrO2Nhc2UiT3BlblR5cGUiOmNhc2UiVHJ1ZVR5cGUiOmNhc2UiQ0lERm9udFR5cGUyIjp0aGlzLm1pbWV0eXBlPSJmb250L29wZW50eXBlIjtjPXRoaXMuY2hlY2tBbmRSZXBhaXIoZSx0LHIpO2lmKHRoaXMuaXNPcGVuVHlwZSl7YWRqdXN0V2lkdGhzKHIpO249Ik9wZW5UeXBlIn1icmVhaztkZWZhdWx0OnRocm93IG5ldyBhLkZvcm1hdEVycm9yKGBGb250ICR7bn0gaXMgbm90IHN1cHBvcnRlZGApfX1jYXRjaChlKXsoMCxhLndhcm4pKGUpO3RoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQoKTtyZXR1cm59dGhpcy5kYXRhPWM7dGhpcy5mb250VHlwZT1nZXRGb250VHlwZShuLHMpO3RoaXMuZm9udE1hdHJpeD1yLmZvbnRNYXRyaXg7dGhpcy53aWR0aHM9ci53aWR0aHM7dGhpcy5kZWZhdWx0V2lkdGg9ci5kZWZhdWx0V2lkdGg7dGhpcy50b1VuaWNvZGU9ci50b1VuaWNvZGU7dGhpcy5zZWFjTWFwPXIuc2VhY01hcH1lbHNle3QmJigwLGEud2FybikoJ0ZvbnQgZmlsZSBpcyBlbXB0eSBpbiAiJytlKyciICgnK3RoaXMubG9hZGVkTmFtZSsiKSIpO3RoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQoKX19ZWxzZXtmb3IoaT0wO2k8MjU2O2krKyl0aGlzLnRvRm9udENoYXJbaV09dGhpcy5kaWZmZXJlbmNlc1tpXXx8ci5kZWZhdWx0RW5jb2RpbmdbaV07dGhpcy5mb250VHlwZT1hLkZvbnRUeXBlLlRZUEUzfX1mdW5jdGlvbiBpbnQxNihlLHQpe3JldHVybihlPDw4KSt0fWZ1bmN0aW9uIHNpZ25lZEludDE2KGUsdCl7dmFyIHI9KGU8PDgpK3Q7cmV0dXJuIDMyNzY4JnI/ci02NTUzNjpyfWZ1bmN0aW9uIHN0cmluZzE2KGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGU+PjgmMjU1LDI1NSZlKX1mdW5jdGlvbiBzYWZlU3RyaW5nMTYoZSl7ZT4zMjc2Nz9lPTMyNzY3OmU8LTMyNzY4JiYoZT0tMzI3NjgpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGU+PjgmMjU1LDI1NSZlKX1mdW5jdGlvbiBpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZSl7Y29uc3QgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4idHRjZiI9PT0oMCxhLmJ5dGVzVG9TdHJpbmcpKHQpfWZ1bmN0aW9uIGJ1aWxkVG9Gb250Q2hhcihlLHQscil7Zm9yKHZhciBhLGk9W10sbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyktMSE9PShhPSgwLGMuZ2V0VW5pY29kZUZvckdseXBoKShlW25dLHQpKSYmKGlbbl09YSk7Zm9yKHZhciBvIGluIHIpLTEhPT0oYT0oMCxjLmdldFVuaWNvZGVGb3JHbHlwaCkocltvXSx0KSkmJihpWytvXT1hKTtyZXR1cm4gaX1mdW5jdGlvbiBhZGp1c3RNYXBwaW5nKGUsdCxyKXt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpLG49W10scz0wLG89Z1tzXVswXSxjPWdbc11bMV07Zm9yKHZhciBsIGluIGUpe3ZhciBoPWVbbHw9MF07aWYodChoKSl7aWYobz5jKXtpZigrK3M+PWcubGVuZ3RoKXsoMCxhLndhcm4pKCJSYW4gb3V0IG9mIHNwYWNlIGluIGZvbnQgcHJpdmF0ZSB1c2UgYXJlYS4iKTticmVha31vPWdbc11bMF07Yz1nW3NdWzFdfXZhciB1PW8rKzswPT09aCYmKGg9cik7aVt1XT1oO25bbF09dX19cmV0dXJue3RvRm9udENoYXI6bixjaGFyQ29kZVRvR2x5cGhJZDppLG5leHRBdmFpbGFibGVGb250Q2hhckNvZGU6b319ZnVuY3Rpb24gY3JlYXRlQ21hcFRhYmxlKGUsdCl7dmFyIHIsaSxuLHMsbz1mdW5jdGlvbiBnZXRSYW5nZXMoZSx0KXt2YXIgcj1bXTtmb3IodmFyIGEgaW4gZSllW2FdPj10fHxyLnB1c2goe2ZvbnRDaGFyQ29kZTowfGEsZ2x5cGhJZDplW2FdfSk7MD09PXIubGVuZ3RoJiZyLnB1c2goe2ZvbnRDaGFyQ29kZTowLGdseXBoSWQ6MH0pO3Iuc29ydCgoZnVuY3Rpb24gZm9udEdldFJhbmdlc1NvcnQoZSx0KXtyZXR1cm4gZS5mb250Q2hhckNvZGUtdC5mb250Q2hhckNvZGV9KSk7Zm9yKHZhciBpPVtdLG49ci5sZW5ndGgscz0wO3M8bjspe3ZhciBvPXJbc10uZm9udENoYXJDb2RlLGM9W3Jbc10uZ2x5cGhJZF07KytzO2Zvcih2YXIgbD1vO3M8biYmbCsxPT09cltzXS5mb250Q2hhckNvZGU7KXtjLnB1c2gocltzXS5nbHlwaElkKTsrK3M7aWYoNjU1MzU9PT0rK2wpYnJlYWt9aS5wdXNoKFtvLGwsY10pfXJldHVybiBpfShlLHQpLGM9b1tvLmxlbmd0aC0xXVsxXT42NTUzNT8yOjEsbD0iXDBcMCIrc3RyaW5nMTYoYykrIlwwA1wwASIrKDAsYS5zdHJpbmczMikoNCs4KmMpO2ZvcihyPW8ubGVuZ3RoLTE7cj49MCYmIShvW3JdWzBdPD02NTUzNSk7LS1yKTt2YXIgaD1yKzE7b1tyXVswXTw2NTUzNSYmNjU1MzU9PT1vW3JdWzFdJiYob1tyXVsxXT02NTUzNCk7dmFyIHUsZCxmLGcsbT1vW3JdWzFdPDY1NTM1PzE6MCxwPWgrbSxiPVMuZ2V0U2VhcmNoUGFyYW1zKHAsMikseT0iIix2PSIiLHc9IiIsaz0iIixDPSIiLHg9MDtmb3Iocj0wLGk9aDtyPGk7cisrKXtkPSh1PW9bcl0pWzBdO2Y9dVsxXTt5Kz1zdHJpbmcxNihkKTt2Kz1zdHJpbmcxNihmKTt2YXIgQT0hMDtmb3Iobj0xLHM9KGc9dVsyXSkubGVuZ3RoO248czsrK24paWYoZ1tuXSE9PWdbbi0xXSsxKXtBPSExO2JyZWFrfWlmKEEpe3crPXN0cmluZzE2KGdbMF0tZCY2NTUzNSk7ays9c3RyaW5nMTYoMCl9ZWxzZXt2YXIgVD0yKihwLXIpKzIqeDt4Kz1mLWQrMTt3Kz1zdHJpbmcxNigwKTtrKz1zdHJpbmcxNihUKTtmb3Iobj0wLHM9Zy5sZW5ndGg7bjxzOysrbilDKz1zdHJpbmcxNihnW25dKX19aWYobT4wKXt2Kz0iw7/DvyI7eSs9IsO/w78iO3crPSJcMAEiO2srPSJcMFwwIn12YXIgST0iXDBcMCIrc3RyaW5nMTYoMipwKStzdHJpbmcxNihiLnJhbmdlKStzdHJpbmcxNihiLmVudHJ5KStzdHJpbmcxNihiLnJhbmdlU2hpZnQpK3YrIlwwXDAiK3krdytrK0MsRj0iIixQPSIiO2lmKGM+MSl7bCs9IlwwA1wwXG4iKygwLGEuc3RyaW5nMzIpKDQrOCpjKzQrSS5sZW5ndGgpO0Y9IiI7Zm9yKHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspe2Q9KHU9b1tyXSlbMF07dmFyIEU9KGc9dVsyXSlbMF07Zm9yKG49MSxzPWcubGVuZ3RoO248czsrK24paWYoZ1tuXSE9PWdbbi0xXSsxKXtmPXVbMF0rbi0xO0YrPSgwLGEuc3RyaW5nMzIpKGQpKygwLGEuc3RyaW5nMzIpKGYpKygwLGEuc3RyaW5nMzIpKEUpO2Q9ZisxO0U9Z1tuXX1GKz0oMCxhLnN0cmluZzMyKShkKSsoMCxhLnN0cmluZzMyKSh1WzFdKSsoMCxhLnN0cmluZzMyKShFKX1QPSJcMFxmXDBcMCIrKDAsYS5zdHJpbmczMikoRi5sZW5ndGgrMTYpKyJcMFwwXDBcMCIrKDAsYS5zdHJpbmczMikoRi5sZW5ndGgvMTIpfXJldHVybiBsKyJcMAQiK3N0cmluZzE2KEkubGVuZ3RoKzQpK0krUCtGfWZ1bmN0aW9uIGNyZWF0ZU9TMlRhYmxlKGUsdCxyKXtyPXJ8fHt1bml0c1BlckVtOjAseU1heDowLHlNaW46MCxhc2NlbnQ6MCxkZXNjZW50OjB9O3ZhciBpPTAsbj0wLHM9MCxvPTAsbD1udWxsLGg9MDtpZih0KXtmb3IodmFyIHUgaW4gdCl7KGw+KHV8PTApfHwhbCkmJihsPXUpO2g8dSYmKGg9dSk7dmFyIGQ9KDAsYy5nZXRVbmljb2RlUmFuZ2VGb3IpKHUpO2lmKGQ8MzIpaXw9MTw8ZDtlbHNlIGlmKGQ8NjQpbnw9MTw8ZC0zMjtlbHNlIGlmKGQ8OTYpc3w9MTw8ZC02NDtlbHNle2lmKCEoZDwxMjMpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbmljb2RlIHJhbmdlcyBCaXRzID4gMTIzIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UiKTtvfD0xPDxkLTk2fX1oPjY1NTM1JiYoaD02NTUzNSl9ZWxzZXtsPTA7aD0yNTV9dmFyIGY9ZS5iYm94fHxbMCwwLDAsMF0sZz1yLnVuaXRzUGVyRW18fDEvKGUuZm9udE1hdHJpeHx8YS5GT05UX0lERU5USVRZX01BVFJJWClbMF0sbT1lLmFzY2VudFNjYWxlZD8xOmcvMWUzLHA9ci5hc2NlbnR8fE1hdGgucm91bmQobSooZS5hc2NlbnR8fGZbM10pKSxiPXIuZGVzY2VudHx8TWF0aC5yb3VuZChtKihlLmRlc2NlbnR8fGZbMV0pKTtiPjAmJmUuZGVzY2VudD4wJiZmWzFdPDAmJihiPS1iKTt2YXIgeT1yLnlNYXh8fHAsdj0tci55TWlufHwtYjtyZXR1cm4iXDADAiQBw7RcMAVcMFwwAsKKAsK7XDBcMFwwwowCwooCwrtcMFwwAcOfXHgwMDEBAlwwXDBcMFwwBiIrU3RyaW5nLmZyb21DaGFyQ29kZShlLmZpeGVkUGl0Y2g/OTowKSsiXDBcMFwwXDBcMFwwIisoMCxhLnN0cmluZzMyKShpKSsoMCxhLnN0cmluZzMyKShuKSsoMCxhLnN0cmluZzMyKShzKSsoMCxhLnN0cmluZzMyKShvKSsiKjIxKiIrc3RyaW5nMTYoZS5pdGFsaWNBbmdsZT8xOjApK3N0cmluZzE2KGx8fGUuZmlyc3RDaGFyKStzdHJpbmcxNihofHxlLmxhc3RDaGFyKStzdHJpbmcxNihwKStzdHJpbmcxNihiKSsiXDBkIitzdHJpbmcxNih5KStzdHJpbmcxNih2KSsiXDBcMFwwXDBcMFwwXDBcMCIrc3RyaW5nMTYoZS54SGVpZ2h0KStzdHJpbmcxNihlLmNhcEhlaWdodCkrc3RyaW5nMTYoMCkrc3RyaW5nMTYobHx8ZS5maXJzdENoYXIpKyJcMAMifWZ1bmN0aW9uIGNyZWF0ZVBvc3RUYWJsZShlKXt2YXIgdD1NYXRoLmZsb29yKDY1NTM2KmUuaXRhbGljQW5nbGUpO3JldHVybiJcMANcMFwwIisoMCxhLnN0cmluZzMyKSh0KSsiXDBcMFwwXDAiKygwLGEuc3RyaW5nMzIpKGUuZml4ZWRQaXRjaCkrIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIn1mdW5jdGlvbiBjcmVhdGVOYW1lVGFibGUoZSx0KXt0fHwodD1bW10sW11dKTt2YXIgcixhLGksbixzLG89W3RbMF1bMF18fCJPcmlnaW5hbCBsaWNlbmNlIix0WzBdWzFdfHxlLHRbMF1bMl18fCJVbmtub3duIix0WzBdWzNdfHwidW5pcXVlSUQiLHRbMF1bNF18fGUsdFswXVs1XXx8IlZlcnNpb24gMC4xMSIsdFswXVs2XXx8IiIsdFswXVs3XXx8IlVua25vd24iLHRbMF1bOF18fCJVbmtub3duIix0WzBdWzldfHwiVW5rbm93biJdLGM9W107Zm9yKHI9MCxhPW8ubGVuZ3RoO3I8YTtyKyspe3ZhciBsPVtdO2ZvcihpPTAsbj0ocz10WzFdW3JdfHxvW3JdKS5sZW5ndGg7aTxuO2krKylsLnB1c2goc3RyaW5nMTYocy5jaGFyQ29kZUF0KGkpKSk7Yy5wdXNoKGwuam9pbigiIikpfXZhciBoPVtvLGNdLHU9WyJcMAEiLCJcMAMiXSxkPVsiXDBcMCIsIlwwASJdLGY9WyJcMFwwIiwiBFx0Il0sZz1vLmxlbmd0aCp1Lmxlbmd0aCxtPSJcMFwwIitzdHJpbmcxNihnKStzdHJpbmcxNigxMipnKzYpLHA9MDtmb3Iocj0wLGE9dS5sZW5ndGg7cjxhO3IrKyl7dmFyIGI9aFtyXTtmb3IoaT0wLG49Yi5sZW5ndGg7aTxuO2krKyl7cz1iW2ldO20rPXVbcl0rZFtyXStmW3JdK3N0cmluZzE2KGkpK3N0cmluZzE2KHMubGVuZ3RoKStzdHJpbmcxNihwKTtwKz1zLmxlbmd0aH19cmV0dXJuIG0rPW8uam9pbigiIikrYy5qb2luKCIiKX1Gb250LnByb3RvdHlwZT17bmFtZTpudWxsLGZvbnQ6bnVsbCxtaW1ldHlwZTpudWxsLGRpc2FibGVGb250RmFjZTohMSxnZXQgcmVuZGVyZXIoKXt2YXIgZT1oLkZvbnRSZW5kZXJlckZhY3RvcnkuY3JlYXRlKHRoaXMsITApO3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJyZW5kZXJlciIsZSl9LGV4cG9ydERhdGEoZT0hMSl7Y29uc3QgdD1lP1suLi5tLC4uLnBdOm0scj1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBhLGk7Zm9yKGEgb2YgdCl7aT10aGlzW2FdO3ZvaWQgMCE9PWkmJihyW2FdPWkpfXJldHVybiByfSxmYWxsYmFja1RvU3lzdGVtRm9udDpmdW5jdGlvbiBGb250X2ZhbGxiYWNrVG9TeXN0ZW1Gb250KCl7dGhpcy5taXNzaW5nRmlsZT0hMDt2YXIgZT10aGlzLm5hbWUsdD10aGlzLnR5cGUscj10aGlzLnN1YnR5cGU7bGV0IGk9ZS5yZXBsYWNlKC9bLF9dL2csIi0iKS5yZXBsYWNlKC9ccy9nLCIiKTt2YXIgbD0oMCxvLmdldFN0ZEZvbnRNYXApKCksaD0oMCxvLmdldE5vblN0ZEZvbnRNYXApKCksdT0hIWxbaV18fCEoIWhbaV18fCFsW2hbaV1dKTtpPWxbaV18fGhbaV18fGk7dGhpcy5ib2xkPS0xIT09aS5zZWFyY2goL2JvbGQvZ2kpO3RoaXMuaXRhbGljPS0xIT09aS5zZWFyY2goL29ibGlxdWUvZ2kpfHwtMSE9PWkuc2VhcmNoKC9pdGFsaWMvZ2kpO3RoaXMuYmxhY2s9LTEhPT1lLnNlYXJjaCgvQmxhY2svZyk7dGhpcy5yZW1lYXN1cmU9T2JqZWN0LmtleXModGhpcy53aWR0aHMpLmxlbmd0aD4wO2lmKHUmJiJDSURGb250VHlwZTIiPT09dCYmdGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKCJJZGVudGl0eS0iKSl7Y29uc3QgdD0oMCxvLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSxyPVtdO2Zvcihjb25zdCBlIGluIHQpclsrZV09dFtlXTtpZigvQXJpYWwtP0JsYWNrL2kudGVzdChlKSl7dmFyIGQ9KDAsby5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2spKCk7Zm9yKGNvbnN0IGUgaW4gZClyWytlXT1kW2VdfWVsc2UgaWYoL0NhbGlicmkvaS50ZXN0KGUpKXtjb25zdCBlPSgwLG8uZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpKSgpO2Zvcihjb25zdCB0IGluIGUpclsrdF09ZVt0XX10aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIGt8fHRoaXMudG9Vbmljb2RlLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7clsrZV09dH0pKTt0aGlzLnRvRm9udENoYXI9cjt0aGlzLnRvVW5pY29kZT1uZXcgdyhyKX1lbHNlIGlmKC9TeW1ib2wvaS50ZXN0KGkpKXRoaXMudG9Gb250Q2hhcj1idWlsZFRvRm9udENoYXIocy5TeW1ib2xTZXRFbmNvZGluZywoMCxuLmdldEdseXBoc1VuaWNvZGUpKCksdGhpcy5kaWZmZXJlbmNlcyk7ZWxzZSBpZigvRGluZ2JhdHMvaS50ZXN0KGkpKXsvV2luZ2RpbmdzL2kudGVzdChlKSYmKDAsYS53YXJuKSgiTm9uLWVtYmVkZGVkIFdpbmdkaW5ncyBmb250LCBmYWxsaW5nIGJhY2sgdG8gWmFwZkRpbmdiYXRzLiIpO3RoaXMudG9Gb250Q2hhcj1idWlsZFRvRm9udENoYXIocy5aYXBmRGluZ2JhdHNFbmNvZGluZywoMCxuLmdldERpbmdiYXRzR2x5cGhzVW5pY29kZSkoKSx0aGlzLmRpZmZlcmVuY2VzKX1lbHNlIGlmKHUpdGhpcy50b0ZvbnRDaGFyPWJ1aWxkVG9Gb250Q2hhcih0aGlzLmRlZmF1bHRFbmNvZGluZywoMCxuLmdldEdseXBoc1VuaWNvZGUpKCksdGhpcy5kaWZmZXJlbmNlcyk7ZWxzZXtjb25zdCB0PSgwLG4uZ2V0R2x5cGhzVW5pY29kZSkoKSxyPVtdO3RoaXMudG9Vbmljb2RlLmZvckVhY2goKGUsYSk9PntpZighdGhpcy5jb21wb3NpdGUpe3ZhciBpPXRoaXMuZGlmZmVyZW5jZXNbZV18fHRoaXMuZGVmYXVsdEVuY29kaW5nW2VdO2NvbnN0IHI9KDAsYy5nZXRVbmljb2RlRm9yR2x5cGgpKGksdCk7LTEhPT1yJiYoYT1yKX1yWytlXT1hfSk7aWYodGhpcy5jb21wb3NpdGUmJnRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgayYmL1ZlcmRhbmEvaS50ZXN0KGUpKXtjb25zdCBlPSgwLG8uZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzKSgpO2Zvcihjb25zdCB0IGluIGUpclsrdF09ZVt0XX10aGlzLnRvRm9udENoYXI9cn10aGlzLmxvYWRlZE5hbWU9aS5zcGxpdCgiLSIpWzBdO3RoaXMuZm9udFR5cGU9Z2V0Rm9udFR5cGUodCxyKX0sY2hlY2tBbmRSZXBhaXI6ZnVuY3Rpb24gRm9udF9jaGVja0FuZFJlcGFpcihlLHQscil7Y29uc3Qgbz1bIk9TLzIiLCJjbWFwIiwiaGVhZCIsImhoZWEiLCJobXR4IiwibWF4cCIsIm5hbWUiLCJwb3N0IiwibG9jYSIsImdseWYiLCJmcGdtIiwicHJlcCIsImN2dCAiLCJDRkYgIl07ZnVuY3Rpb24gcmVhZFRhYmxlcyhlLHQpe2NvbnN0IHI9T2JqZWN0LmNyZWF0ZShudWxsKTtyWyJPUy8yIl09bnVsbDtyLmNtYXA9bnVsbDtyLmhlYWQ9bnVsbDtyLmhoZWE9bnVsbDtyLmhtdHg9bnVsbDtyLm1heHA9bnVsbDtyLm5hbWU9bnVsbDtyLnBvc3Q9bnVsbDtmb3IobGV0IGE9MDthPHQ7YSsrKXtjb25zdCB0PXJlYWRUYWJsZUVudHJ5KGUpO28uaW5jbHVkZXModC50YWcpJiYoMCE9PXQubGVuZ3RoJiYoclt0LnRhZ109dCkpfXJldHVybiByfWZ1bmN0aW9uIHJlYWRUYWJsZUVudHJ5KGUpe3ZhciB0PSgwLGEuYnl0ZXNUb1N0cmluZykoZS5nZXRCeXRlcyg0KSkscj1lLmdldEludDMyKCk+Pj4wLGk9ZS5nZXRJbnQzMigpPj4+MCxuPWUuZ2V0SW50MzIoKT4+PjAscz1lLnBvcztlLnBvcz1lLnN0YXJ0P2Uuc3RhcnQ6MDtlLnNraXAoaSk7dmFyIG89ZS5nZXRCeXRlcyhuKTtlLnBvcz1zO2lmKCJoZWFkIj09PXQpe29bOF09b1s5XT1vWzEwXT1vWzExXT0wO29bMTddfD0zMn1yZXR1cm57dGFnOnQsY2hlY2tzdW06cixsZW5ndGg6bixvZmZzZXQ6aSxkYXRhOm99fWZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcihlKXtyZXR1cm57dmVyc2lvbjooMCxhLmJ5dGVzVG9TdHJpbmcpKGUuZ2V0Qnl0ZXMoNCkpLG51bVRhYmxlczplLmdldFVpbnQxNigpLHNlYXJjaFJhbmdlOmUuZ2V0VWludDE2KCksZW50cnlTZWxlY3RvcjplLmdldFVpbnQxNigpLHJhbmdlU2hpZnQ6ZS5nZXRVaW50MTYoKX19ZnVuY3Rpb24gc2FuaXRpemVHbHlwaChlLHQscixhLGksbil7dmFyIHM9e2xlbmd0aDowLHNpemVPZkluc3RydWN0aW9uczowfTtpZihyLXQ8PTEyKXJldHVybiBzO3ZhciBvPWUuc3ViYXJyYXkodCxyKSxjPXNpZ25lZEludDE2KG9bMF0sb1sxXSk7aWYoYzwwKXshZnVuY3Rpb24gd3JpdGVTaWduZWRJbnQxNihlLHQscil7ZVt0KzFdPXI7ZVt0XT1yPj4+OH0obywwLGM9LTEpO2Euc2V0KG8saSk7cy5sZW5ndGg9by5sZW5ndGg7cmV0dXJuIHN9dmFyIGwsaD0xMCx1PTA7Zm9yKGw9MDtsPGM7bCsrKXt1PShvW2hdPDw4fG9baCsxXSkrMTtoKz0yfXZhciBkPWgsZj1vW2hdPDw4fG9baCsxXTtzLnNpemVPZkluc3RydWN0aW9ucz1mO3ZhciBnPWgrPTIrZixtPTA7Zm9yKGw9MDtsPHU7bCsrKXt2YXIgcD1vW2grK107MTkyJnAmJihvW2gtMV09NjMmcCk7bGV0IGU9MjsyJnA/ZT0xOjE2JnAmJihlPTApO2xldCB0PTI7NCZwP3Q9MTozMiZwJiYodD0wKTtjb25zdCByPWUrdDttKz1yO2lmKDgmcCl7dmFyIGI9b1toKytdO2wrPWI7bSs9YipyfX1pZigwPT09bSlyZXR1cm4gczt2YXIgeT1oK207aWYoeT5vLmxlbmd0aClyZXR1cm4gcztpZighbiYmZj4wKXthLnNldChvLnN1YmFycmF5KDAsZCksaSk7YS5zZXQoWzAsMF0saStkKTthLnNldChvLnN1YmFycmF5KGcseSksaStkKzIpO3ktPWY7by5sZW5ndGgteT4zJiYoeT15KzMmLTQpO3MubGVuZ3RoPXk7cmV0dXJuIHN9aWYoby5sZW5ndGgteT4zKXt5PXkrMyYtNDthLnNldChvLnN1YmFycmF5KDAseSksaSk7cy5sZW5ndGg9eTtyZXR1cm4gc31hLnNldChvLGkpO3MubGVuZ3RoPW8ubGVuZ3RoO3JldHVybiBzfWZ1bmN0aW9uIHJlYWROYW1lVGFibGUoZSl7dmFyIHI9KHQuc3RhcnQ/dC5zdGFydDowKStlLm9mZnNldDt0LnBvcz1yO3ZhciBpPVtbXSxbXV0sbj1lLmxlbmd0aCxzPXIrbjtpZigwIT09dC5nZXRVaW50MTYoKXx8bjw2KXJldHVybiBpO3ZhciBvLGMsbD10LmdldFVpbnQxNigpLGg9dC5nZXRVaW50MTYoKSx1PVtdO2ZvcihvPTA7bzxsJiZ0LnBvcysxMjw9cztvKyspe3ZhciBkPXtwbGF0Zm9ybTp0LmdldFVpbnQxNigpLGVuY29kaW5nOnQuZ2V0VWludDE2KCksbGFuZ3VhZ2U6dC5nZXRVaW50MTYoKSxuYW1lOnQuZ2V0VWludDE2KCksbGVuZ3RoOnQuZ2V0VWludDE2KCksb2Zmc2V0OnQuZ2V0VWludDE2KCl9OygxPT09ZC5wbGF0Zm9ybSYmMD09PWQuZW5jb2RpbmcmJjA9PT1kLmxhbmd1YWdlfHwzPT09ZC5wbGF0Zm9ybSYmMT09PWQuZW5jb2RpbmcmJjEwMzM9PT1kLmxhbmd1YWdlKSYmdS5wdXNoKGQpfWZvcihvPTAsYz11Lmxlbmd0aDtvPGM7bysrKXt2YXIgZj11W29dO2lmKCEoZi5sZW5ndGg8PTApKXt2YXIgZz1yK2grZi5vZmZzZXQ7aWYoIShnK2YubGVuZ3RoPnMpKXt0LnBvcz1nO3ZhciBtPWYubmFtZTtpZihmLmVuY29kaW5nKXtmb3IodmFyIHA9IiIsYj0wLHk9Zi5sZW5ndGg7Yjx5O2IrPTIpcCs9U3RyaW5nLmZyb21DaGFyQ29kZSh0LmdldFVpbnQxNigpKTtpWzFdW21dPXB9ZWxzZSBpWzBdW21dPSgwLGEuYnl0ZXNUb1N0cmluZykodC5nZXRCeXRlcyhmLmxlbmd0aCkpfX19cmV0dXJuIGl9dmFyIGM9WzAsMCwwLDAsMCwwLDAsMCwtMiwtMiwtMiwtMiwwLDAsLTIsLTUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwwLC0xLDAsLTEsLTEsLTEsLTEsMSwtMSwtOTk5LDAsMSwwLC0xLC0yLDAsLTEsLTIsLTEsLTEsMCwtMSwtMSwwLDAsLTk5OSwtOTk5LC0xLC0xLC0xLC0xLC0yLC05OTksLTIsLTIsLTk5OSwwLC0yLC0yLDAsMCwtMiwwLC0yLDAsMCwwLC0yLC0xLC0xLDEsMSwwLDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwwLC0xLDAsLTEsLTEsMCwtOTk5LC0xLC0xLC0xLC0xLC0xLC0xLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLC0yLC05OTksLTk5OSwtOTk5LC05OTksLTk5OSwtMSwtMSwtMiwtMiwwLDAsMCwwLC0xLC0xLC05OTksLTIsLTIsMCwwLC0xLC0yLC0yLDAsMCwwLC0xLC0xLC0xLC0yXTtmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbShlLHQpe2Zvcih2YXIgcixpLG4scyxvLGw9ZS5kYXRhLGg9MCx1PTAsZD0wLGY9W10sZz1bXSxtPVtdLHA9dC50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMsYj0hMSx5PTAsdj0wLHc9bC5sZW5ndGg7aDx3Oyl7dmFyIGs9bFtoKytdO2lmKDY0PT09ayl7aT1sW2grK107aWYoYnx8diloKz1pO2Vsc2UgZm9yKHI9MDtyPGk7cisrKWYucHVzaChsW2grK10pfWVsc2UgaWYoNjU9PT1rKXtpPWxbaCsrXTtpZihifHx2KWgrPTIqaTtlbHNlIGZvcihyPTA7cjxpO3IrKyl7bj1sW2grK107Zi5wdXNoKG48PDh8bFtoKytdKX19ZWxzZSBpZigxNzY9PSgyNDgmaykpe2k9ay0xNzYrMTtpZihifHx2KWgrPWk7ZWxzZSBmb3Iocj0wO3I8aTtyKyspZi5wdXNoKGxbaCsrXSl9ZWxzZSBpZigxODQ9PSgyNDgmaykpe2k9ay0xODQrMTtpZihifHx2KWgrPTIqaTtlbHNlIGZvcihyPTA7cjxpO3IrKyl7bj1sW2grK107Zi5wdXNoKG48PDh8bFtoKytdKX19ZWxzZSBpZig0MyE9PWt8fHApaWYoNDQhPT1rfHxwKXtpZig0NT09PWspaWYoYil7Yj0hMTt1PWh9ZWxzZXtpZighKG89Zy5wb3AoKSkpeygwLGEud2FybikoIlRUOiBFTkRGIGJhZCBzdGFjayIpO3QuaGludHNWYWxpZD0hMTtyZXR1cm59cz1tLnBvcCgpO2w9by5kYXRhO2g9by5pO3QuZnVuY3Rpb25zU3RhY2tEZWx0YXNbc109Zi5sZW5ndGgtby5zdGFja1RvcH1lbHNlIGlmKDEzNz09PWspe2lmKGJ8fHYpeygwLGEud2FybikoIlRUOiBuZXN0ZWQgSURFRnMgbm90IGFsbG93ZWQiKTtwPSEwfWI9ITA7ZD1ofWVsc2UgaWYoODg9PT1rKSsreTtlbHNlIGlmKDI3PT09ayl2PXk7ZWxzZSBpZig4OT09PWspe3Y9PT15JiYodj0wKTstLXl9ZWxzZSBpZigyOD09PWsmJiFiJiYhdil7dmFyIFM9ZltmLmxlbmd0aC0xXTtTPjAmJihoKz1TLTEpfX1lbHNle2lmKGJ8fHYpeygwLGEud2FybikoIlRUOiBuZXN0ZWQgRkRFRnMgbm90IGFsbG93ZWQiKTtwPSEwfWI9ITA7ZD1oO3M9Zi5wb3AoKTt0LmZ1bmN0aW9uc0RlZmluZWRbc109e2RhdGE6bCxpOmh9fWVsc2UgaWYoIWImJiF2KXtzPWZbZi5sZW5ndGgtMV07aWYoaXNOYU4ocykpKDAsYS5pbmZvKSgiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpO2Vsc2V7dC5mdW5jdGlvbnNVc2VkW3NdPSEwO2lmKHMgaW4gdC5mdW5jdGlvbnNTdGFja0RlbHRhcyl7Y29uc3QgZT1mLmxlbmd0aCt0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW3NdO2lmKGU8MCl7KDAsYS53YXJuKSgiVFQ6IENBTEwgaW52YWxpZCBmdW5jdGlvbnMgc3RhY2sgZGVsdGEuIik7dC5oaW50c1ZhbGlkPSExO3JldHVybn1mLmxlbmd0aD1lfWVsc2UgaWYocyBpbiB0LmZ1bmN0aW9uc0RlZmluZWQmJiFtLmluY2x1ZGVzKHMpKXtnLnB1c2goe2RhdGE6bCxpOmgsc3RhY2tUb3A6Zi5sZW5ndGgtMX0pO20ucHVzaChzKTtpZighKG89dC5mdW5jdGlvbnNEZWZpbmVkW3NdKSl7KDAsYS53YXJuKSgiVFQ6IENBTEwgbm9uLWV4aXN0ZW50IGZ1bmN0aW9uIik7dC5oaW50c1ZhbGlkPSExO3JldHVybn1sPW8uZGF0YTtoPW8uaX19fWlmKCFiJiYhdil7bGV0IGU9MDtrPD0xNDI/ZT1jW2tdOms+PTE5MiYmazw9MjIzP2U9LTE6az49MjI0JiYoZT0tMik7aWYoaz49MTEzJiZrPD0xMTcpe2k9Zi5wb3AoKTtpc05hTihpKXx8KGU9MiotaSl9Zm9yKDtlPDAmJmYubGVuZ3RoPjA7KXtmLnBvcCgpO2UrK31mb3IoO2U+MDspe2YucHVzaChOYU4pO2UtLX19fXQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zPXA7dmFyIEM9W2xdO2g+bC5sZW5ndGgmJkMucHVzaChuZXcgVWludDhBcnJheShoLWwubGVuZ3RoKSk7aWYoZD51KXsoMCxhLndhcm4pKCJUVDogY29tcGxlbWVudGluZyBhIG1pc3NpbmcgZnVuY3Rpb24gdGFpbCIpO0MucHVzaChuZXcgVWludDhBcnJheShbMzQsNDVdKSl9IWZ1bmN0aW9uIGZvbGRUVFRhYmxlKGUsdCl7aWYodC5sZW5ndGg+MSl7dmFyIHIsYSxpPTA7Zm9yKHI9MCxhPXQubGVuZ3RoO3I8YTtyKyspaSs9dFtyXS5sZW5ndGg7aT1pKzMmLTQ7dmFyIG49bmV3IFVpbnQ4QXJyYXkoaSkscz0wO2ZvcihyPTAsYT10Lmxlbmd0aDtyPGE7cisrKXtuLnNldCh0W3JdLHMpO3MrPXRbcl0ubGVuZ3RofWUuZGF0YT1uO2UubGVuZ3RoPWl9fShlLEMpfWxldCBsLGgsZixnO2lmKGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZSh0PW5ldyBkLlN0cmVhbShuZXcgVWludDhBcnJheSh0LmdldEJ5dGVzKCkpKSkpe2NvbnN0IGU9ZnVuY3Rpb24gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkRhdGEoZSx0KXtjb25zdHtudW1Gb250czpyLG9mZnNldFRhYmxlOml9PWZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25IZWFkZXIoZSl7Y29uc3QgdD0oMCxhLmJ5dGVzVG9TdHJpbmcpKGUuZ2V0Qnl0ZXMoNCkpOygwLGEuYXNzZXJ0KSgidHRjZiI9PT10LCJNdXN0IGJlIGEgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBmb250LiIpO2NvbnN0IHI9ZS5nZXRVaW50MTYoKSxpPWUuZ2V0VWludDE2KCksbj1lLmdldEludDMyKCk+Pj4wLHM9W107Zm9yKGxldCB0PTA7dDxuO3QrKylzLnB1c2goZS5nZXRJbnQzMigpPj4+MCk7Y29uc3Qgbz17dHRjVGFnOnQsbWFqb3JWZXJzaW9uOnIsbWlub3JWZXJzaW9uOmksbnVtRm9udHM6bixvZmZzZXRUYWJsZTpzfTtzd2l0Y2gocil7Y2FzZSAxOnJldHVybiBvO2Nhc2UgMjpvLmRzaWdUYWc9ZS5nZXRJbnQzMigpPj4+MDtvLmRzaWdMZW5ndGg9ZS5nZXRJbnQzMigpPj4+MDtvLmRzaWdPZmZzZXQ9ZS5nZXRJbnQzMigpPj4+MDtyZXR1cm4gb310aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcihgSW52YWxpZCBUcnVlVHlwZSBDb2xsZWN0aW9uIG1ham9yVmVyc2lvbjogJHtyfS5gKX0oZSk7Zm9yKGxldCBuPTA7bjxyO24rKyl7ZS5wb3M9KGUuc3RhcnR8fDApK2lbbl07Y29uc3Qgcj1yZWFkT3BlblR5cGVIZWFkZXIoZSkscz1yZWFkVGFibGVzKGUsci5udW1UYWJsZXMpO2lmKCFzLm5hbWUpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZm9udCBtdXN0IGNvbnRhaW4gYSAibmFtZSIgdGFibGUuJyk7Y29uc3Qgbz1yZWFkTmFtZVRhYmxlKHMubmFtZSk7Zm9yKGxldCBlPTAsYT1vLmxlbmd0aDtlPGE7ZSsrKWZvcihsZXQgYT0wLGk9b1tlXS5sZW5ndGg7YTxpO2ErKyl7Y29uc3QgaT1vW2VdW2FdO2lmKGkmJmkucmVwbGFjZSgvXHMvZywiIik9PT10KXJldHVybntoZWFkZXI6cix0YWJsZXM6c319fXRocm93IG5ldyBhLkZvcm1hdEVycm9yKGBUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIiR7dH0iIGZvbnQuYCl9KHQsdGhpcy5uYW1lKTtsPWUuaGVhZGVyO2g9ZS50YWJsZXN9ZWxzZXtsPXJlYWRPcGVuVHlwZUhlYWRlcih0KTtoPXJlYWRUYWJsZXModCxsLm51bVRhYmxlcyl9dmFyIG09IWhbIkNGRiAiXTtpZihtKXtpZighaC5sb2NhKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibG9jYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7aWYoIWguZ2x5Zil7KDAsYS53YXJuKSgnUmVxdWlyZWQgImdseWYiIHRhYmxlIGlzIG5vdCBmb3VuZCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTtoLmdseWY9e3RhZzoiZ2x5ZiIsZGF0YTpuZXcgVWludDhBcnJheSgwKX19dGhpcy5pc09wZW5UeXBlPSExfWVsc2V7Y29uc3QgdD1yLmNvbXBvc2l0ZSYmKChyLmNpZFRvR2lkTWFwfHxbXSkubGVuZ3RoPjB8fCEoci5jTWFwIGluc3RhbmNlb2YgdS5JZGVudGl0eUNNYXApKTtpZigiT1RUTyI9PT1sLnZlcnNpb24mJiF0fHwhaC5oZWFkfHwhaC5oaGVhfHwhaC5tYXhwfHwhaC5wb3N0KXtnPW5ldyBkLlN0cmVhbShoWyJDRkYgIl0uZGF0YSk7Zj1uZXcgVChnLHIpO2FkanVzdFdpZHRocyhyKTtyZXR1cm4gdGhpcy5jb252ZXJ0KGUsZixyKX1kZWxldGUgaC5nbHlmO2RlbGV0ZSBoLmxvY2E7ZGVsZXRlIGguZnBnbTtkZWxldGUgaC5wcmVwO2RlbGV0ZSBoWyJjdnQgIl07dGhpcy5pc09wZW5UeXBlPSEwfWlmKCFoLm1heHApdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJtYXhwIiB0YWJsZSBpcyBub3QgZm91bmQnKTt0LnBvcz0odC5zdGFydHx8MCkraC5tYXhwLm9mZnNldDt2YXIgcD10LmdldEludDMyKCk7Y29uc3QgYj10LmdldFVpbnQxNigpO2xldCB2PWIrMSx3PSEwO2lmKHY+NjU1MzUpe3c9ITE7dj1iOygwLGEud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gZ2x5ZnMgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpfXZhciBrPTAsQz0wO2lmKHA+PTY1NTM2JiZoLm1heHAubGVuZ3RoPj0yMil7dC5wb3MrPTg7aWYodC5nZXRVaW50MTYoKT4yKXtoLm1heHAuZGF0YVsxNF09MDtoLm1heHAuZGF0YVsxNV09Mn10LnBvcys9NDtrPXQuZ2V0VWludDE2KCk7dC5wb3MrPTQ7Qz10LmdldFVpbnQxNigpfWgubWF4cC5kYXRhWzRdPXY+Pjg7aC5tYXhwLmRhdGFbNV09MjU1JnY7dmFyIHg9ZnVuY3Rpb24gc2FuaXRpemVUVFByb2dyYW1zKGUsdCxyLGkpe3ZhciBuPXtmdW5jdGlvbnNEZWZpbmVkOltdLGZ1bmN0aW9uc1VzZWQ6W10sZnVuY3Rpb25zU3RhY2tEZWx0YXM6W10sdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOiExLGhpbnRzVmFsaWQ6ITB9O2UmJnNhbml0aXplVFRQcm9ncmFtKGUsbik7dCYmc2FuaXRpemVUVFByb2dyYW0odCxuKTtlJiZmdW5jdGlvbiBjaGVja0ludmFsaWRGdW5jdGlvbnMoZSx0KXtpZighZS50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpaWYoZS5mdW5jdGlvbnNEZWZpbmVkLmxlbmd0aD50KXsoMCxhLndhcm4pKCJUVDogbW9yZSBmdW5jdGlvbnMgZGVmaW5lZCB0aGFuIGV4cGVjdGVkIik7ZS5oaW50c1ZhbGlkPSExfWVsc2UgZm9yKHZhciByPTAsaT1lLmZ1bmN0aW9uc1VzZWQubGVuZ3RoO3I8aTtyKyspe2lmKHI+dCl7KDAsYS53YXJuKSgiVFQ6IGludmFsaWQgZnVuY3Rpb24gaWQ6ICIrcik7ZS5oaW50c1ZhbGlkPSExO3JldHVybn1pZihlLmZ1bmN0aW9uc1VzZWRbcl0mJiFlLmZ1bmN0aW9uc0RlZmluZWRbcl0peygwLGEud2FybikoIlRUOiB1bmRlZmluZWQgZnVuY3Rpb246ICIrcik7ZS5oaW50c1ZhbGlkPSExO3JldHVybn19fShuLGkpO2lmKHImJjEmci5sZW5ndGgpe3ZhciBzPW5ldyBVaW50OEFycmF5KHIubGVuZ3RoKzEpO3Muc2V0KHIuZGF0YSk7ci5kYXRhPXN9cmV0dXJuIG4uaGludHNWYWxpZH0oaC5mcGdtLGgucHJlcCxoWyJjdnQgIl0sayk7aWYoIXgpe2RlbGV0ZSBoLmZwZ207ZGVsZXRlIGgucHJlcDtkZWxldGUgaFsiY3Z0ICJdfSFmdW5jdGlvbiBzYW5pdGl6ZU1ldHJpY3MoZSx0LHIsaSxuKXtpZih0KXtlLnBvcz0oZS5zdGFydD9lLnN0YXJ0OjApK3Qub2Zmc2V0O2UucG9zKz00O2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz0yO2UucG9zKz04O2UucG9zKz0yO3ZhciBzPWUuZ2V0VWludDE2KCk7aWYocz5pKXsoMCxhLmluZm8pKCJUaGUgbnVtT2ZNZXRyaWNzICgiK3MrIikgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bUdseXBocyAoIitpKyIpIik7cz1pO3QuZGF0YVszNF09KDY1MjgwJnMpPj44O3QuZGF0YVszNV09MjU1JnN9dmFyIG89aS1zLShyLmxlbmd0aC00KnM+PjEpO2lmKG8+MCl7dmFyIGM9bmV3IFVpbnQ4QXJyYXkoci5sZW5ndGgrMipvKTtjLnNldChyLmRhdGEpO2lmKG4pe2Nbci5sZW5ndGhdPXIuZGF0YVsyXTtjW3IubGVuZ3RoKzFdPXIuZGF0YVszXX1yLmRhdGE9Y319ZWxzZSByJiYoci5kYXRhPW51bGwpfSh0LGguaGhlYSxoLmhtdHgsdix3KTtpZighaC5oZWFkKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGVhZCIgdGFibGUgaXMgbm90IGZvdW5kJyk7IWZ1bmN0aW9uIHNhbml0aXplSGVhZChlLHQscil7dmFyIGk9ZS5kYXRhLG49ZnVuY3Rpb24gaW50MzIoZSx0LHIsYSl7cmV0dXJuKGU8PDI0KSsodDw8MTYpKyhyPDw4KSthfShpWzBdLGlbMV0saVsyXSxpWzNdKTtpZihuPj4xNiE9MSl7KDAsYS5pbmZvKSgiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCB2ZXJzaW9uIGluIGhlYWQgdGFibGU6ICIrbik7aVswXT0wO2lbMV09MTtpWzJdPTA7aVszXT0wfXZhciBzPWludDE2KGlbNTBdLGlbNTFdKTtpZihzPDB8fHM+MSl7KDAsYS5pbmZvKSgiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCBpbmRleFRvTG9jRm9ybWF0IGluIGhlYWQgdGFibGU6ICIrcyk7dmFyIG89dCsxO2lmKHI9PT1vPDwxKXtpWzUwXT0wO2lbNTFdPTB9ZWxzZXtpZihyIT09bzw8Mil0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQ291bGQgbm90IGZpeCBpbmRleFRvTG9jRm9ybWF0OiAiK3MpO2lbNTBdPTA7aVs1MV09MX19fShoLmhlYWQsYixtP2gubG9jYS5sZW5ndGg6MCk7dmFyIEE9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihtKXt2YXIgST1pbnQxNihoLmhlYWQuZGF0YVs1MF0saC5oZWFkLmRhdGFbNTFdKSxGPWZ1bmN0aW9uIHNhbml0aXplR2x5cGhMb2NhdGlvbnMoZSx0LHIsYSxpLG4scyl7dmFyIG8sYyxsO2lmKGEpe289NDtjPWZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlTG9uZyhlLHQpe3JldHVybiBlW3RdPDwyNHxlW3QrMV08PDE2fGVbdCsyXTw8OHxlW3QrM119O2w9ZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGVMb25nKGUsdCxyKXtlW3RdPXI+Pj4yNCYyNTU7ZVt0KzFdPXI+PjE2JjI1NTtlW3QrMl09cj4+OCYyNTU7ZVt0KzNdPTI1NSZyfX1lbHNle289MjtjPWZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlKGUsdCl7cmV0dXJuIGVbdF08PDl8ZVt0KzFdPDwxfTtsPWZ1bmN0aW9uIGZvbnRJdGVtRW5jb2RlKGUsdCxyKXtlW3RdPXI+PjkmMjU1O2VbdCsxXT1yPj4xJjI1NX19dmFyIGg9bj9yKzE6cix1PW8qKDEraCksZD1uZXcgVWludDhBcnJheSh1KTtkLnNldChlLmRhdGEuc3ViYXJyYXkoMCx1KSk7ZS5kYXRhPWQ7dmFyIGYsZyxtPXQuZGF0YSxwPW0ubGVuZ3RoLGI9bmV3IFVpbnQ4QXJyYXkocCk7Y29uc3QgeT1bXTtmb3IoZj0wLGc9MDtmPHIrMTtmKyssZys9byl7bGV0IGU9YyhkLGcpO2U+cCYmKGU9cCk7eS5wdXNoKHtpbmRleDpmLG9mZnNldDplLGVuZE9mZnNldDowfSl9eS5zb3J0KChlLHQpPT5lLm9mZnNldC10Lm9mZnNldCk7Zm9yKGY9MDtmPHI7ZisrKXlbZl0uZW5kT2Zmc2V0PXlbZisxXS5vZmZzZXQ7eS5zb3J0KChlLHQpPT5lLmluZGV4LXQuaW5kZXgpO3ZhciB2PU9iamVjdC5jcmVhdGUobnVsbCksdz0wO2woZCwwLHcpO2ZvcihmPTAsZz1vO2Y8cjtmKyssZys9byl7dmFyIGs9c2FuaXRpemVHbHlwaChtLHlbZl0ub2Zmc2V0LHlbZl0uZW5kT2Zmc2V0LGIsdyxpKSxTPWsubGVuZ3RoOzA9PT1TJiYodltmXT0hMCk7ay5zaXplT2ZJbnN0cnVjdGlvbnM+cyYmKHM9ay5zaXplT2ZJbnN0cnVjdGlvbnMpO2woZCxnLHcrPVMpfWlmKDA9PT13KXt2YXIgQz1uZXcgVWludDhBcnJheShbMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQ5LDBdKTtmb3IoZj0wLGc9bztmPGg7ZisrLGcrPW8pbChkLGcsQy5sZW5ndGgpO3QuZGF0YT1DfWVsc2UgaWYobil7dmFyIHg9YyhkLG8pO2lmKGIubGVuZ3RoPngrdyl0LmRhdGE9Yi5zdWJhcnJheSgwLHgrdyk7ZWxzZXt0LmRhdGE9bmV3IFVpbnQ4QXJyYXkoeCt3KTt0LmRhdGEuc2V0KGIuc3ViYXJyYXkoMCx3KSl9dC5kYXRhLnNldChiLnN1YmFycmF5KDAseCksdyk7bChlLmRhdGEsZC5sZW5ndGgtbyx3K3gpfWVsc2UgdC5kYXRhPWIuc3ViYXJyYXkoMCx3KTtyZXR1cm57bWlzc2luZ0dseXBoczp2LG1heFNpemVPZkluc3RydWN0aW9uczpzfX0oaC5sb2NhLGguZ2x5ZixiLEkseCx3LEMpO0E9Ri5taXNzaW5nR2x5cGhzO2lmKHA+PTY1NTM2JiZoLm1heHAubGVuZ3RoPj0yMil7aC5tYXhwLmRhdGFbMjZdPUYubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zPj44O2gubWF4cC5kYXRhWzI3XT0yNTUmRi5tYXhTaXplT2ZJbnN0cnVjdGlvbnN9fWlmKCFoLmhoZWEpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoaGVhIiB0YWJsZSBpcyBub3QgZm91bmQnKTtpZigwPT09aC5oaGVhLmRhdGFbMTBdJiYwPT09aC5oaGVhLmRhdGFbMTFdKXtoLmhoZWEuZGF0YVsxMF09MjU1O2guaGhlYS5kYXRhWzExXT0yNTV9dmFyIFA9e3VuaXRzUGVyRW06aW50MTYoaC5oZWFkLmRhdGFbMThdLGguaGVhZC5kYXRhWzE5XSkseU1heDppbnQxNihoLmhlYWQuZGF0YVs0Ml0saC5oZWFkLmRhdGFbNDNdKSx5TWluOnNpZ25lZEludDE2KGguaGVhZC5kYXRhWzM4XSxoLmhlYWQuZGF0YVszOV0pLGFzY2VudDppbnQxNihoLmhoZWEuZGF0YVs0XSxoLmhoZWEuZGF0YVs1XSksZGVzY2VudDpzaWduZWRJbnQxNihoLmhoZWEuZGF0YVs2XSxoLmhoZWEuZGF0YVs3XSl9O3RoaXMuYXNjZW50PVAuYXNjZW50L1AudW5pdHNQZXJFbTt0aGlzLmRlc2NlbnQ9UC5kZXNjZW50L1AudW5pdHNQZXJFbTtoLnBvc3QmJmZ1bmN0aW9uIHJlYWRQb3N0U2NyaXB0VGFibGUoZSxyLGkpe3ZhciBuPSh0LnN0YXJ0P3Quc3RhcnQ6MCkrZS5vZmZzZXQ7dC5wb3M9bjt2YXIgcyxvPW4rZS5sZW5ndGgsYz10LmdldEludDMyKCk7dC5za2lwKDI4KTt2YXIgbCxoPSEwO3N3aXRjaChjKXtjYXNlIDY1NTM2OnM9eTticmVhaztjYXNlIDEzMTA3Mjp2YXIgdT10LmdldFVpbnQxNigpO2lmKHUhPT1pKXtoPSExO2JyZWFrfXZhciBkPVtdO2ZvcihsPTA7bDx1OysrbCl7dmFyIGY9dC5nZXRVaW50MTYoKTtpZihmPj0zMjc2OCl7aD0hMTticmVha31kLnB1c2goZil9aWYoIWgpYnJlYWs7Zm9yKHZhciBnPVtdLG09W107dC5wb3M8bzspe3ZhciBwPXQuZ2V0Qnl0ZSgpO20ubGVuZ3RoPXA7Zm9yKGw9MDtsPHA7KytsKW1bbF09U3RyaW5nLmZyb21DaGFyQ29kZSh0LmdldEJ5dGUoKSk7Zy5wdXNoKG0uam9pbigiIikpfXM9W107Zm9yKGw9MDtsPHU7KytsKXt2YXIgYj1kW2xdO2I8MjU4P3MucHVzaCh5W2JdKTpzLnB1c2goZ1tiLTI1OF0pfWJyZWFrO2Nhc2UgMTk2NjA4OmJyZWFrO2RlZmF1bHQ6KDAsYS53YXJuKSgiVW5rbm93bi91bnN1cHBvcnRlZCBwb3N0IHRhYmxlIHZlcnNpb24gIitjKTtoPSExO3IuZGVmYXVsdEVuY29kaW5nJiYocz1yLmRlZmF1bHRFbmNvZGluZyl9ci5nbHlwaE5hbWVzPXM7cmV0dXJuIGh9KGgucG9zdCxyLGIpO2gucG9zdD17dGFnOiJwb3N0IixkYXRhOmNyZWF0ZVBvc3RUYWJsZShyKX07Y29uc3QgRT1bXTtmdW5jdGlvbiBoYXNHbHlwaChlKXtyZXR1cm4hQVtlXX1pZihyLmNvbXBvc2l0ZSl7dmFyIEI9ci5jaWRUb0dpZE1hcHx8W10sTz0wPT09Qi5sZW5ndGg7ci5jTWFwLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7aWYodD42NTUzNSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpO3ZhciByPS0xO08/cj10OnZvaWQgMCE9PUJbdF0mJihyPUJbdF0pO3I+PTAmJnI8YiYmaGFzR2x5cGgocikmJihFW2VdPXIpfSkpfWVsc2V7dmFyIE09ZnVuY3Rpb24gcmVhZENtYXBUYWJsZShlLHQscixpKXtpZighZSl7KDAsYS53YXJuKSgiTm8gY21hcCB0YWJsZSBhdmFpbGFibGUuIik7cmV0dXJue3BsYXRmb3JtSWQ6LTEsZW5jb2RpbmdJZDotMSxtYXBwaW5nczpbXSxoYXNTaG9ydENtYXA6ITF9fXZhciBuLHM9KHQuc3RhcnQ/dC5zdGFydDowKStlLm9mZnNldDt0LnBvcz1zO3Quc2tpcCgyKTtmb3IodmFyIG8sYz10LmdldFVpbnQxNigpLGw9ITEsaD0wO2g8YztoKyspe3ZhciB1PXQuZ2V0VWludDE2KCksZD10LmdldFVpbnQxNigpLGY9dC5nZXRJbnQzMigpPj4+MCxnPSExO2lmKCFvfHxvLnBsYXRmb3JtSWQhPT11fHxvLmVuY29kaW5nSWQhPT1kKXtpZigwIT09dXx8MCE9PWQmJjEhPT1kJiYzIT09ZClpZigxPT09dSYmMD09PWQpZz0hMDtlbHNlIGlmKDMhPT11fHwxIT09ZHx8IWkmJm8pe2lmKHImJjM9PT11JiYwPT09ZCl7Zz0hMDtsPSEwfX1lbHNle2c9ITA7cnx8KGw9ITApfWVsc2UgZz0hMDtnJiYobz17cGxhdGZvcm1JZDp1LGVuY29kaW5nSWQ6ZCxvZmZzZXQ6Zn0pO2lmKGwpYnJlYWt9fW8mJih0LnBvcz1zK28ub2Zmc2V0KTtpZighb3x8LTE9PT10LnBlZWtCeXRlKCkpeygwLGEud2FybikoIkNvdWxkIG5vdCBmaW5kIGEgcHJlZmVycmVkIGNtYXAgdGFibGUuIik7cmV0dXJue3BsYXRmb3JtSWQ6LTEsZW5jb2RpbmdJZDotMSxtYXBwaW5nczpbXSxoYXNTaG9ydENtYXA6ITF9fXZhciBtPXQuZ2V0VWludDE2KCk7dC5za2lwKDQpO3ZhciBwLGIseT0hMSx2PVtdO2lmKDA9PT1tKXtmb3IocD0wO3A8MjU2O3ArKyl7dmFyIHc9dC5nZXRCeXRlKCk7dyYmdi5wdXNoKHtjaGFyQ29kZTpwLGdseXBoSWQ6d30pfXk9ITB9ZWxzZSBpZig0PT09bSl7dmFyIGs9dC5nZXRVaW50MTYoKT4+MTt0LnNraXAoNik7dmFyIFMsQz1bXTtmb3IoUz0wO1M8aztTKyspQy5wdXNoKHtlbmQ6dC5nZXRVaW50MTYoKX0pO3Quc2tpcCgyKTtmb3IoUz0wO1M8aztTKyspQ1tTXS5zdGFydD10LmdldFVpbnQxNigpO2ZvcihTPTA7UzxrO1MrKylDW1NdLmRlbHRhPXQuZ2V0VWludDE2KCk7dmFyIHg9MDtmb3IoUz0wO1M8aztTKyspe249Q1tTXTt2YXIgQT10LmdldFVpbnQxNigpO2lmKEEpe3ZhciBUPShBPj4xKS0oay1TKTtuLm9mZnNldEluZGV4PVQ7eD1NYXRoLm1heCh4LFQrbi5lbmQtbi5zdGFydCsxKX1lbHNlIG4ub2Zmc2V0SW5kZXg9LTF9dmFyIEk9W107Zm9yKHA9MDtwPHg7cCsrKUkucHVzaCh0LmdldFVpbnQxNigpKTtmb3IoUz0wO1M8aztTKyspe3M9KG49Q1tTXSkuc3RhcnQ7dmFyIEY9bi5lbmQsUD1uLmRlbHRhO1Q9bi5vZmZzZXRJbmRleDtmb3IocD1zO3A8PUY7cCsrKWlmKDY1NTM1IT09cCl7Yj0oYj1UPDA/cDpJW1QrcC1zXSkrUCY2NTUzNTt2LnB1c2goe2NoYXJDb2RlOnAsZ2x5cGhJZDpifSl9fX1lbHNle2lmKDYhPT1tKXsoMCxhLndhcm4pKCJjbWFwIHRhYmxlIGhhcyB1bnN1cHBvcnRlZCBmb3JtYXQ6ICIrbSk7cmV0dXJue3BsYXRmb3JtSWQ6LTEsZW5jb2RpbmdJZDotMSxtYXBwaW5nczpbXSxoYXNTaG9ydENtYXA6ITF9fXZhciBFPXQuZ2V0VWludDE2KCksQj10LmdldFVpbnQxNigpO2ZvcihwPTA7cDxCO3ArKyl7Yj10LmdldFVpbnQxNigpO3ZhciBPPUUrcDt2LnB1c2goe2NoYXJDb2RlOk8sZ2x5cGhJZDpifSl9fXYuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jaGFyQ29kZS10LmNoYXJDb2RlfSkpO2ZvcihoPTE7aDx2Lmxlbmd0aDtoKyspaWYodltoLTFdLmNoYXJDb2RlPT09dltoXS5jaGFyQ29kZSl7di5zcGxpY2UoaCwxKTtoLS19cmV0dXJue3BsYXRmb3JtSWQ6by5wbGF0Zm9ybUlkLGVuY29kaW5nSWQ6by5lbmNvZGluZ0lkLG1hcHBpbmdzOnYsaGFzU2hvcnRDbWFwOnl9fShoLmNtYXAsdCx0aGlzLmlzU3ltYm9saWNGb250LHIuaGFzRW5jb2RpbmcpLEQ9TS5wbGF0Zm9ybUlkLFI9TS5lbmNvZGluZ0lkLE49TS5tYXBwaW5ncyxMPU4ubGVuZ3RoO2xldCBlPVtdOyFyLmhhc0VuY29kaW5nfHwiTWFjUm9tYW5FbmNvZGluZyIhPT1yLmJhc2VFbmNvZGluZ05hbWUmJiJXaW5BbnNpRW5jb2RpbmciIT09ci5iYXNlRW5jb2RpbmdOYW1lfHwoZT0oMCxzLmdldEVuY29kaW5nKShyLmJhc2VFbmNvZGluZ05hbWUpKTtpZihyLmhhc0VuY29kaW5nJiYhdGhpcy5pc1N5bWJvbGljRm9udCYmKDM9PT1EJiYxPT09Unx8MT09PUQmJjA9PT1SKSl7dmFyIF89KDAsbi5nZXRHbHlwaHNVbmljb2RlKSgpO2ZvcihsZXQgdD0wO3Q8MjU2O3QrKyl7dmFyIFUscTtpZihVPXRoaXMuZGlmZmVyZW5jZXMmJnQgaW4gdGhpcy5kaWZmZXJlbmNlcz90aGlzLmRpZmZlcmVuY2VzW3RdOnQgaW4gZSYmIiIhPT1lW3RdP2VbdF06cy5TdGFuZGFyZEVuY29kaW5nW3RdKXtxPXJlY292ZXJHbHlwaE5hbWUoVSxfKTt2YXIgajszPT09RCYmMT09PVI/aj1fW3FdOjE9PT1EJiYwPT09UiYmKGo9cy5NYWNSb21hbkVuY29kaW5nLmluZGV4T2YocSkpO2ZvcihsZXQgZT0wO2U8TDsrK2UpaWYoTltlXS5jaGFyQ29kZT09PWope0VbdF09TltlXS5nbHlwaElkO2JyZWFrfX19fWVsc2UgaWYoMD09PUQpZm9yKGxldCBlPTA7ZTxMOysrZSlFW05bZV0uY2hhckNvZGVdPU5bZV0uZ2x5cGhJZDtlbHNlIGZvcihsZXQgZT0wO2U8TDsrK2Upe2xldCB0PU5bZV0uY2hhckNvZGU7Mz09PUQmJnQ+PTYxNDQwJiZ0PD02MTY5NSYmKHQmPTI1NSk7RVt0XT1OW2VdLmdseXBoSWR9aWYoci5nbHlwaE5hbWVzJiZlLmxlbmd0aClmb3IobGV0IHQ9MDt0PDI1NjsrK3QpaWYodm9pZCAwPT09RVt0XSYmZVt0XSl7VT1lW3RdO2NvbnN0IGE9ci5nbHlwaE5hbWVzLmluZGV4T2YoVSk7YT4wJiZoYXNHbHlwaChhKSYmKEVbdF09YSl9fTA9PT1FLmxlbmd0aCYmKEVbMF09MCk7bGV0IEg9di0xO3d8fChIPTApO3ZhciB6PWFkanVzdE1hcHBpbmcoRSxoYXNHbHlwaCxIKTt0aGlzLnRvRm9udENoYXI9ei50b0ZvbnRDaGFyO2guY21hcD17dGFnOiJjbWFwIixkYXRhOmNyZWF0ZUNtYXBUYWJsZSh6LmNoYXJDb2RlVG9HbHlwaElkLHYpfTtoWyJPUy8yIl0mJmZ1bmN0aW9uIHZhbGlkYXRlT1MyVGFibGUoZSx0KXt0LnBvcz0odC5zdGFydHx8MCkrZS5vZmZzZXQ7dmFyIHI9dC5nZXRVaW50MTYoKTt0LnNraXAoNjApO3ZhciBhPXQuZ2V0VWludDE2KCk7aWYocjw0JiY3NjgmYSlyZXR1cm4hMTtpZih0LmdldFVpbnQxNigpPnQuZ2V0VWludDE2KCkpcmV0dXJuITE7dC5za2lwKDYpO2lmKDA9PT10LmdldFVpbnQxNigpKXJldHVybiExO2UuZGF0YVs4XT1lLmRhdGFbOV09MDtyZXR1cm4hMH0oaFsiT1MvMiJdLHQpfHwoaFsiT1MvMiJdPXt0YWc6Ik9TLzIiLGRhdGE6Y3JlYXRlT1MyVGFibGUocix6LmNoYXJDb2RlVG9HbHlwaElkLFApfSk7aWYoIW0pdHJ5e2c9bmV3IGQuU3RyZWFtKGhbIkNGRiAiXS5kYXRhKTtmPW5ldyBpLkNGRlBhcnNlcihnLHIsITApLnBhcnNlKCk7Zi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7dmFyIEc9bmV3IGkuQ0ZGQ29tcGlsZXIoZik7aFsiQ0ZGICJdLmRhdGE9Ry5jb21waWxlKCl9Y2F0Y2goZSl7KDAsYS53YXJuKSgiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiK3IubG9hZGVkTmFtZSl9aWYoaC5uYW1lKXt2YXIgVz1yZWFkTmFtZVRhYmxlKGgubmFtZSk7aC5uYW1lLmRhdGE9Y3JlYXRlTmFtZVRhYmxlKGUsVyl9ZWxzZSBoLm5hbWU9e3RhZzoibmFtZSIsZGF0YTpjcmVhdGVOYW1lVGFibGUodGhpcy5uYW1lKX07dmFyIFg9bmV3IFMobC52ZXJzaW9uKTtmb3IodmFyIFYgaW4gaClYLmFkZFRhYmxlKFYsaFtWXS5kYXRhKTtyZXR1cm4gWC50b0FycmF5KCl9LGNvbnZlcnQ6ZnVuY3Rpb24gRm9udF9jb252ZXJ0KGUsdCxyKXtyLmZpeGVkUGl0Y2g9ITE7ci5idWlsdEluRW5jb2RpbmcmJmZ1bmN0aW9uIGFkanVzdFRvVW5pY29kZShlLHQpe2lmKCFlLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwJiYhKGUuaGFzRW5jb2Rpbmd8fHQ9PT1lLmRlZmF1bHRFbmNvZGluZ3x8ZS50b1VuaWNvZGUgaW5zdGFuY2VvZiBrKSl7dmFyIHI9W10sYT0oMCxuLmdldEdseXBoc1VuaWNvZGUpKCk7Zm9yKHZhciBpIGluIHQpe3ZhciBzPXRbaV0sbz0oMCxjLmdldFVuaWNvZGVGb3JHbHlwaCkocyxhKTstMSE9PW8mJihyW2ldPVN0cmluZy5mcm9tQ2hhckNvZGUobykpfWUudG9Vbmljb2RlLmFtZW5kKHIpfX0ocixyLmJ1aWx0SW5FbmNvZGluZyk7bGV0IGk9MTt0IGluc3RhbmNlb2YgVCYmKGk9dC5udW1HbHlwaHMtMSk7dmFyIG89dC5nZXRHbHlwaE1hcHBpbmcociksbD1hZGp1c3RNYXBwaW5nKG8sdC5oYXNHbHlwaElkLmJpbmQodCksaSk7dGhpcy50b0ZvbnRDaGFyPWwudG9Gb250Q2hhcjt2YXIgaD10Lm51bUdseXBocztmdW5jdGlvbiBnZXRDaGFyQ29kZXMoZSx0KXt2YXIgcj1udWxsO2Zvcih2YXIgYSBpbiBlKWlmKHQ9PT1lW2FdKXtyfHwocj1bXSk7ci5wdXNoKDB8YSl9cmV0dXJuIHJ9ZnVuY3Rpb24gY3JlYXRlQ2hhckNvZGUoZSx0KXtmb3IodmFyIHIgaW4gZSlpZih0PT09ZVtyXSlyZXR1cm4gMHxyO2wuY2hhckNvZGVUb0dseXBoSWRbbC5uZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlXT10O3JldHVybiBsLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrK312YXIgdT10LnNlYWNzO2lmKHUmJnUubGVuZ3RoKXt2YXIgZD1yLmZvbnRNYXRyaXh8fGEuRk9OVF9JREVOVElUWV9NQVRSSVgsZj10LmdldENoYXJzZXQoKSxnPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKHZhciBtIGluIHUpe3ZhciBwPXVbbXw9MF0sYj1zLlN0YW5kYXJkRW5jb2RpbmdbcFsyXV0seT1zLlN0YW5kYXJkRW5jb2RpbmdbcFszXV0sdj1mLmluZGV4T2YoYiksdz1mLmluZGV4T2YoeSk7aWYoISh2PDB8fHc8MCkpe3ZhciBDPXt4OnBbMF0qZFswXStwWzFdKmRbMl0rZFs0XSx5OnBbMF0qZFsxXStwWzFdKmRbM10rZFs1XX0seD1nZXRDaGFyQ29kZXMobyxtKTtpZih4KWZvcihsZXQgZT0wLHQ9eC5sZW5ndGg7ZTx0O2UrKyl7dmFyIEE9eFtlXSxJPWwuY2hhckNvZGVUb0dseXBoSWQsRj1jcmVhdGVDaGFyQ29kZShJLHYpLFA9Y3JlYXRlQ2hhckNvZGUoSSx3KTtnW0FdPXtiYXNlRm9udENoYXJDb2RlOkYsYWNjZW50Rm9udENoYXJDb2RlOlAsYWNjZW50T2Zmc2V0OkN9fX19ci5zZWFjTWFwPWd9dmFyIEU9MS8oci5mb250TWF0cml4fHxhLkZPTlRfSURFTlRJVFlfTUFUUklYKVswXSxCPW5ldyBTKCJPVFRPIik7Qi5hZGRUYWJsZSgiQ0ZGICIsdC5kYXRhKTtCLmFkZFRhYmxlKCJPUy8yIixjcmVhdGVPUzJUYWJsZShyLGwuY2hhckNvZGVUb0dseXBoSWQpKTtCLmFkZFRhYmxlKCJjbWFwIixjcmVhdGVDbWFwVGFibGUobC5jaGFyQ29kZVRvR2x5cGhJZCxoKSk7Qi5hZGRUYWJsZSgiaGVhZCIsIlwwAVwwXDBcMFwwEFwwXDBcMFwwXDBfDzzDtVwwXDAiK3NhZmVTdHJpbmcxNihFKSsiXDBcMFwwXDDCnlx2fidcMFwwXDBcMMKeXHZ+J1wwXDAiK3NhZmVTdHJpbmcxNihyLmRlc2NlbnQpKyIPw78iK3NhZmVTdHJpbmcxNihyLmFzY2VudCkrc3RyaW5nMTYoci5pdGFsaWNBbmdsZT8yOjApKyJcMBFcMFwwXDBcMFwwXDAiKTtCLmFkZFRhYmxlKCJoaGVhIiwiXDABXDBcMCIrc2FmZVN0cmluZzE2KHIuYXNjZW50KStzYWZlU3RyaW5nMTYoci5kZXNjZW50KSsiXDBcMMO/w79cMFwwXDBcMFwwXDAiK3NhZmVTdHJpbmcxNihyLmNhcEhlaWdodCkrc2FmZVN0cmluZzE2KE1hdGgudGFuKHIuaXRhbGljQW5nbGUpKnIueEhlaWdodCkrIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIrc3RyaW5nMTYoaCkpO0IuYWRkVGFibGUoImhtdHgiLGZ1bmN0aW9uIGZvbnRGaWVsZHNIbXR4KCl7dmFyIGU9dC5jaGFyc3RyaW5ncyxyPXQuY2ZmP3QuY2ZmLndpZHRoczpudWxsLGE9IlwwXDBcMFwwIjtmb3IobGV0IHQ9MSxzPWg7dDxzO3QrKyl7dmFyIGk9MDtpZihlKXt2YXIgbj1lW3QtMV07aT0id2lkdGgiaW4gbj9uLndpZHRoOjB9ZWxzZSByJiYoaT1NYXRoLmNlaWwoclt0XXx8MCkpO2ErPXN0cmluZzE2KGkpK3N0cmluZzE2KDApfXJldHVybiBhfSgpKTtCLmFkZFRhYmxlKCJtYXhwIiwiXDBcMFBcMCIrc3RyaW5nMTYoaCkpO0IuYWRkVGFibGUoIm5hbWUiLGNyZWF0ZU5hbWVUYWJsZShlKSk7Qi5hZGRUYWJsZSgicG9zdCIsY3JlYXRlUG9zdFRhYmxlKHIpKTtyZXR1cm4gQi50b0FycmF5KCl9LGdldCBzcGFjZVdpZHRoKCl7Zm9yKHZhciBlLHQ9WyJzcGFjZSIsIm1pbnVzIiwib25lIiwiaSIsIkkiXSxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKXt2YXIgcz10W3JdO2lmKHMgaW4gdGhpcy53aWR0aHMpe2U9dGhpcy53aWR0aHNbc107YnJlYWt9dmFyIG89KDAsbi5nZXRHbHlwaHNVbmljb2RlKSgpW3NdLGM9MDt0aGlzLmNvbXBvc2l0ZSYmdGhpcy5jTWFwLmNvbnRhaW5zKG8pJiYoYz10aGlzLmNNYXAubG9va3VwKG8pKTshYyYmdGhpcy50b1VuaWNvZGUmJihjPXRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YobykpO2M8PTAmJihjPW8pO2lmKGU9dGhpcy53aWR0aHNbY10pYnJlYWt9ZT1lfHx0aGlzLmRlZmF1bHRXaWR0aDtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywic3BhY2VXaWR0aCIsZSl9LGNoYXJUb0dseXBoOmZ1bmN0aW9uIEZvbnRfY2hhclRvR2x5cGgoZSx0KXt2YXIgcixpLG4scz1lO3RoaXMuY01hcCYmdGhpcy5jTWFwLmNvbnRhaW5zKGUpJiYocz10aGlzLmNNYXAubG9va3VwKGUpKTtpPXRoaXMud2lkdGhzW3NdO2k9KDAsYS5pc051bSkoaSk/aTp0aGlzLmRlZmF1bHRXaWR0aDt2YXIgbz10aGlzLnZtZXRyaWNzJiZ0aGlzLnZtZXRyaWNzW3NdO2xldCBsPXRoaXMudG9Vbmljb2RlLmdldChlKXx8dGhpcy5mYWxsYmFja1RvVW5pY29kZS5nZXQoZSl8fGU7Im51bWJlciI9PXR5cGVvZiBsJiYobD1TdHJpbmcuZnJvbUNoYXJDb2RlKGwpKTt2YXIgaD1lIGluIHRoaXMudG9Gb250Q2hhcjtyPXRoaXMudG9Gb250Q2hhcltlXXx8ZTtpZih0aGlzLm1pc3NpbmdGaWxlKXtjb25zdCB0PXRoaXMuZGlmZmVyZW5jZXNbZV18fHRoaXMuZGVmYXVsdEVuY29kaW5nW2VdOyIubm90ZGVmIiE9PXQmJiIiIT09dHx8IlR5cGUxIiE9PXRoaXMudHlwZXx8KHI9MzIpO3I9KDAsYy5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcykocil9dGhpcy5pc1R5cGUzRm9udCYmKG49cik7dmFyIHU9bnVsbDtpZih0aGlzLnNlYWNNYXAmJnRoaXMuc2VhY01hcFtlXSl7aD0hMDt2YXIgZD10aGlzLnNlYWNNYXBbZV07cj1kLmJhc2VGb250Q2hhckNvZGU7dT17Zm9udENoYXI6U3RyaW5nLmZyb21Db2RlUG9pbnQoZC5hY2NlbnRGb250Q2hhckNvZGUpLG9mZnNldDpkLmFjY2VudE9mZnNldH19bGV0IGY9IiI7Im51bWJlciI9PXR5cGVvZiByJiYocjw9MTExNDExMT9mPVN0cmluZy5mcm9tQ29kZVBvaW50KHIpOigwLGEud2FybikoImNoYXJUb0dseXBoIC0gaW52YWxpZCBmb250Q2hhckNvZGU6ICIrcikpO3ZhciBnPXRoaXMuZ2x5cGhDYWNoZVtlXTtpZighZ3x8IWcubWF0Y2hlc0ZvckNhY2hlKGYsbCx1LGksbyxuLHQsaCkpe2c9bmV3IHYoZixsLHUsaSxvLG4sdCxoKTt0aGlzLmdseXBoQ2FjaGVbZV09Z31yZXR1cm4gZ30sY2hhcnNUb0dseXBoczpmdW5jdGlvbiBGb250X2NoYXJzVG9HbHlwaHMoZSl7dmFyIHQscixhLGk9dGhpcy5jaGFyc0NhY2hlO2lmKGkmJih0PWlbZV0pKXJldHVybiB0O2l8fChpPXRoaXMuY2hhcnNDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpKTt0PVtdO3ZhciBuLHM9ZSxvPTA7aWYodGhpcy5jTWFwKWZvcih2YXIgYz1PYmplY3QuY3JlYXRlKG51bGwpO288ZS5sZW5ndGg7KXt0aGlzLmNNYXAucmVhZENoYXJDb2RlKGUsbyxjKTthPWMuY2hhcmNvZGU7dmFyIGw9Yy5sZW5ndGg7bys9bDt2YXIgaD0xPT09bCYmMzI9PT1lLmNoYXJDb2RlQXQoby0xKTtyPXRoaXMuY2hhclRvR2x5cGgoYSxoKTt0LnB1c2gocil9ZWxzZSBmb3Iobz0wLG49ZS5sZW5ndGg7bzxuOysrbyl7YT1lLmNoYXJDb2RlQXQobyk7cj10aGlzLmNoYXJUb0dseXBoKGEsMzI9PT1hKTt0LnB1c2gocil9cmV0dXJuIGlbc109dH0sZ2V0IGdseXBoQ2FjaGVWYWx1ZXMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmdseXBoQ2FjaGUpfX07cmV0dXJuIEZvbnR9KCk7dC5Gb250PUM7dmFyIHg9ZnVuY3Rpb24gRXJyb3JGb250Q2xvc3VyZSgpe2Z1bmN0aW9uIEVycm9yRm9udChlKXt0aGlzLmVycm9yPWU7dGhpcy5sb2FkZWROYW1lPSJnX2ZvbnRfZXJyb3IiO3RoaXMubWlzc2luZ0ZpbGU9ITB9RXJyb3JGb250LnByb3RvdHlwZT17Y2hhcnNUb0dseXBoczpmdW5jdGlvbiBFcnJvckZvbnRfY2hhcnNUb0dseXBocygpe3JldHVybltdfSxleHBvcnREYXRhKGU9ITEpe3JldHVybntlcnJvcjp0aGlzLmVycm9yfX19O3JldHVybiBFcnJvckZvbnR9KCk7dC5FcnJvckZvbnQ9eDtmdW5jdGlvbiB0eXBlMUZvbnRHbHlwaE1hcHBpbmcoZSx0LHIpe3ZhciBhLGksbyxjPU9iamVjdC5jcmVhdGUobnVsbCksbD0hIShlLmZsYWdzJmIuU3ltYm9saWMpO2lmKGUuYmFzZUVuY29kaW5nTmFtZSl7bz0oMCxzLmdldEVuY29kaW5nKShlLmJhc2VFbmNvZGluZ05hbWUpO2ZvcihpPTA7aTxvLmxlbmd0aDtpKyspe2E9ci5pbmRleE9mKG9baV0pO2NbaV09YT49MD9hOjB9fWVsc2UgaWYobClmb3IoaSBpbiB0KWNbaV09dFtpXTtlbHNle289cy5TdGFuZGFyZEVuY29kaW5nO2ZvcihpPTA7aTxvLmxlbmd0aDtpKyspe2E9ci5pbmRleE9mKG9baV0pO2NbaV09YT49MD9hOjB9fXZhciBoLHU9ZS5kaWZmZXJlbmNlcztpZih1KWZvcihpIGluIHUpe3ZhciBkPXVbaV07aWYoLTE9PT0oYT1yLmluZGV4T2YoZCkpKXtofHwoaD0oMCxuLmdldEdseXBoc1VuaWNvZGUpKCkpO3ZhciBmPXJlY292ZXJHbHlwaE5hbWUoZCxoKTtmIT09ZCYmKGE9ci5pbmRleE9mKGYpKX1jW2ldPWE+PTA/YTowfXJldHVybiBjfXZhciBBPWZ1bmN0aW9uIFR5cGUxRm9udENsb3N1cmUoKXtmdW5jdGlvbiBmaW5kQmxvY2soZSx0LHIpe2Zvcih2YXIgYSxpPWUubGVuZ3RoLG49dC5sZW5ndGgscz1pLW4sbz1yLGM9ITE7bzxzOyl7YT0wO2Zvcig7YTxuJiZlW28rYV09PT10W2FdOylhKys7aWYoYT49bil7bys9YTtmb3IoO288aSYmKDAsbC5pc1doaXRlU3BhY2UpKGVbb10pOylvKys7Yz0hMDticmVha31vKyt9cmV0dXJue2ZvdW5kOmMsbGVuZ3RoOm99fWZ1bmN0aW9uIFR5cGUxRm9udChlLHQscil7dmFyIGk9ci5sZW5ndGgxLG49KHIubGVuZ3RoMix0LnBlZWtCeXRlcyg2KSkscz0xMjg9PT1uWzBdJiYxPT09blsxXTtpZihzKXt0LnNraXAoNik7aT1uWzVdPDwyNHxuWzRdPDwxNnxuWzNdPDw4fG5bMl19dmFyIG89ZnVuY3Rpb24gZ2V0SGVhZGVyQmxvY2soZSx0KXt2YXIgcixpLG4scyxvPVsxMDEsMTAxLDEyMCwxMDEsOTldLGM9ZS5wb3M7dHJ5e2k9KHI9ZS5nZXRCeXRlcyh0KSkubGVuZ3RofWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBsLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGV9aWYoaT09PXQmJihuPWZpbmRCbG9jayhyLG8sdC0yKm8ubGVuZ3RoKSkuZm91bmQmJm4ubGVuZ3RoPT09dClyZXR1cm57c3RyZWFtOm5ldyBkLlN0cmVhbShyKSxsZW5ndGg6dH07KDAsYS53YXJuKSgnSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTtlLnBvcz1jO2Zvcig7Oyl7aWYoMD09PShuPWZpbmRCbG9jayhlLnBlZWtCeXRlcygyMDQ4KSxvLDApKS5sZW5ndGgpYnJlYWs7ZS5wb3MrPW4ubGVuZ3RoO2lmKG4uZm91bmQpe3M9ZS5wb3MtYzticmVha319ZS5wb3M9YztpZihzKXJldHVybntzdHJlYW06bmV3IGQuU3RyZWFtKGUuZ2V0Qnl0ZXMocykpLGxlbmd0aDpzfTsoMCxhLndhcm4pKCdVbmFibGUgdG8gcmVjb3ZlciAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB1c2luZyBhcyBpcy4nKTtyZXR1cm57c3RyZWFtOm5ldyBkLlN0cmVhbShlLmdldEJ5dGVzKHQpKSxsZW5ndGg6dH19KHQsaSk7bmV3IGYuVHlwZTFQYXJzZXIoby5zdHJlYW0sITEsITApLmV4dHJhY3RGb250SGVhZGVyKHIpO3MmJihuPXQuZ2V0Qnl0ZXMoNikpWzVdPDwyNHxuWzRdPDwxNnxuWzNdPDw4fG5bMl07dmFyIGM9ZnVuY3Rpb24gZ2V0RWV4ZWNCbG9jayhlLHQpe3ZhciByPWUuZ2V0Qnl0ZXMoKTtyZXR1cm57c3RyZWFtOm5ldyBkLlN0cmVhbShyKSxsZW5ndGg6ci5sZW5ndGh9fSh0KSxoPW5ldyBmLlR5cGUxUGFyc2VyKGMuc3RyZWFtLCEwLCEwKS5leHRyYWN0Rm9udFByb2dyYW0ocik7Zm9yKGNvbnN0IGUgaW4gaC5wcm9wZXJ0aWVzKXJbZV09aC5wcm9wZXJ0aWVzW2VdO3ZhciB1PWguY2hhcnN0cmluZ3MsZz10aGlzLmdldFR5cGUyQ2hhcnN0cmluZ3ModSksbT10aGlzLmdldFR5cGUyU3VicnMoaC5zdWJycyk7dGhpcy5jaGFyc3RyaW5ncz11O3RoaXMuZGF0YT10aGlzLndyYXAoZSxnLHRoaXMuY2hhcnN0cmluZ3MsbSxyKTt0aGlzLnNlYWNzPXRoaXMuZ2V0U2VhY3MoaC5jaGFyc3RyaW5ncyl9VHlwZTFGb250LnByb3RvdHlwZT17Z2V0IG51bUdseXBocygpe3JldHVybiB0aGlzLmNoYXJzdHJpbmdzLmxlbmd0aCsxfSxnZXRDaGFyc2V0OmZ1bmN0aW9uIFR5cGUxRm9udF9nZXRDaGFyc2V0KCl7Zm9yKHZhciBlPVsiLm5vdGRlZiJdLHQ9dGhpcy5jaGFyc3RyaW5ncyxyPTA7cjx0Lmxlbmd0aDtyKyspZS5wdXNoKHRbcl0uZ2x5cGhOYW1lKTtyZXR1cm4gZX0sZ2V0R2x5cGhNYXBwaW5nOmZ1bmN0aW9uIFR5cGUxRm9udF9nZXRHbHlwaE1hcHBpbmcoZSl7dmFyIHQ9dGhpcy5jaGFyc3RyaW5ncztpZihlLmNvbXBvc2l0ZSl7Y29uc3Qgcj1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihsZXQgYT0wLGk9dC5sZW5ndGg7YTxpO2ErKyl7cltlLmNNYXAuY2hhckNvZGVPZihhKV09YSsxfXJldHVybiByfXZhciByLGE9WyIubm90ZGVmIl07Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKylhLnB1c2godFtyXS5nbHlwaE5hbWUpO3ZhciBpPWUuYnVpbHRJbkVuY29kaW5nO2lmKGkpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKHZhciBzIGluIGkpKHI9YS5pbmRleE9mKGlbc10pKT49MCYmKG5bc109cil9cmV0dXJuIHR5cGUxRm9udEdseXBoTWFwcGluZyhlLG4sYSl9LGhhc0dseXBoSWQ6ZnVuY3Rpb24gVHlwZTFGb250X2hhc0dseXBoSUQoZSl7cmV0dXJuIShlPDB8fGU+PXRoaXMubnVtR2x5cGhzKSYmKDA9PT1lfHx0aGlzLmNoYXJzdHJpbmdzW2UtMV0uY2hhcnN0cmluZy5sZW5ndGg+MCl9LGdldFNlYWNzOmZ1bmN0aW9uIFR5cGUxRm9udF9nZXRTZWFjcyhlKXt2YXIgdCxyLGE9W107Zm9yKHQ9MCxyPWUubGVuZ3RoO3Q8cjt0Kyspe3ZhciBpPWVbdF07aS5zZWFjJiYoYVt0KzFdPWkuc2VhYyl9cmV0dXJuIGF9LGdldFR5cGUyQ2hhcnN0cmluZ3M6ZnVuY3Rpb24gVHlwZTFGb250X2dldFR5cGUyQ2hhcnN0cmluZ3MoZSl7Zm9yKHZhciB0PVtdLHI9MCxhPWUubGVuZ3RoO3I8YTtyKyspdC5wdXNoKGVbcl0uY2hhcnN0cmluZyk7cmV0dXJuIHR9LGdldFR5cGUyU3VicnM6ZnVuY3Rpb24gVHlwZTFGb250X2dldFR5cGUyU3VicnMoZSl7dmFyIHQ9MCxyPWUubGVuZ3RoO3Q9cjwxMTMzPzEwNzpyPDMzNzY5PzExMzE6MzI3Njg7dmFyIGEsaT1bXTtmb3IoYT0wO2E8dDthKyspaS5wdXNoKFsxMV0pO2ZvcihhPTA7YTxyO2ErKylpLnB1c2goZVthXSk7cmV0dXJuIGl9LHdyYXA6ZnVuY3Rpb24gVHlwZTFGb250X3dyYXAoZSx0LHIsYSxuKXt2YXIgcz1uZXcgaS5DRkY7cy5oZWFkZXI9bmV3IGkuQ0ZGSGVhZGVyKDEsMCw0LDQpO3MubmFtZXM9W2VdO3ZhciBvPW5ldyBpLkNGRlRvcERpY3Q7by5zZXRCeU5hbWUoInZlcnNpb24iLDM5MSk7by5zZXRCeU5hbWUoIk5vdGljZSIsMzkyKTtvLnNldEJ5TmFtZSgiRnVsbE5hbWUiLDM5Myk7by5zZXRCeU5hbWUoIkZhbWlseU5hbWUiLDM5NCk7by5zZXRCeU5hbWUoIldlaWdodCIsMzk1KTtvLnNldEJ5TmFtZSgiRW5jb2RpbmciLG51bGwpO28uc2V0QnlOYW1lKCJGb250TWF0cml4IixuLmZvbnRNYXRyaXgpO28uc2V0QnlOYW1lKCJGb250QkJveCIsbi5iYm94KTtvLnNldEJ5TmFtZSgiY2hhcnNldCIsbnVsbCk7by5zZXRCeU5hbWUoIkNoYXJTdHJpbmdzIixudWxsKTtvLnNldEJ5TmFtZSgiUHJpdmF0ZSIsbnVsbCk7cy50b3BEaWN0PW87dmFyIGM9bmV3IGkuQ0ZGU3RyaW5ncztjLmFkZCgiVmVyc2lvbiAwLjExIik7Yy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKTtjLmFkZChlKTtjLmFkZChlKTtjLmFkZCgiTWVkaXVtIik7cy5zdHJpbmdzPWM7cy5nbG9iYWxTdWJySW5kZXg9bmV3IGkuQ0ZGSW5kZXg7dmFyIGwsaCx1PXQubGVuZ3RoLGQ9WyIubm90ZGVmIl07Zm9yKGw9MDtsPHU7bCsrKXtjb25zdCBlPXJbbF0uZ2x5cGhOYW1lOy0xPT09aS5DRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihlKSYmYy5hZGQoZSk7ZC5wdXNoKGUpfXMuY2hhcnNldD1uZXcgaS5DRkZDaGFyc2V0KCExLDAsZCk7dmFyIGY9bmV3IGkuQ0ZGSW5kZXg7Zi5hZGQoWzEzOSwxNF0pO2ZvcihsPTA7bDx1O2wrKylmLmFkZCh0W2xdKTtzLmNoYXJTdHJpbmdzPWY7dmFyIGc9bmV3IGkuQ0ZGUHJpdmF0ZURpY3Q7Zy5zZXRCeU5hbWUoIlN1YnJzIixudWxsKTt2YXIgbT1bIkJsdWVWYWx1ZXMiLCJPdGhlckJsdWVzIiwiRmFtaWx5Qmx1ZXMiLCJGYW1pbHlPdGhlckJsdWVzIiwiU3RlbVNuYXBIIiwiU3RlbVNuYXBWIiwiQmx1ZVNoaWZ0IiwiQmx1ZUZ1enoiLCJCbHVlU2NhbGUiLCJMYW5ndWFnZUdyb3VwIiwiRXhwYW5zaW9uRmFjdG9yIiwiRm9yY2VCb2xkIiwiU3RkSFciLCJTdGRWVyJdO2ZvcihsPTAsaD1tLmxlbmd0aDtsPGg7bCsrKXt2YXIgcD1tW2xdO2lmKHAgaW4gbi5wcml2YXRlRGF0YSl7dmFyIGI9bi5wcml2YXRlRGF0YVtwXTtpZihBcnJheS5pc0FycmF5KGIpKWZvcih2YXIgeT1iLmxlbmd0aC0xO3k+MDt5LS0pYlt5XS09Ylt5LTFdO2cuc2V0QnlOYW1lKHAsYil9fXMudG9wRGljdC5wcml2YXRlRGljdD1nO3ZhciB2PW5ldyBpLkNGRkluZGV4O2ZvcihsPTAsaD1hLmxlbmd0aDtsPGg7bCsrKXYuYWRkKGFbbF0pO2cuc3VicnNJbmRleD12O3JldHVybiBuZXcgaS5DRkZDb21waWxlcihzKS5jb21waWxlKCl9fTtyZXR1cm4gVHlwZTFGb250fSgpLFQ9ZnVuY3Rpb24gQ0ZGRm9udENsb3N1cmUoKXtmdW5jdGlvbiBDRkZGb250KGUsdCl7dGhpcy5wcm9wZXJ0aWVzPXQ7dmFyIHI9bmV3IGkuQ0ZGUGFyc2VyKGUsdCwhMCk7dGhpcy5jZmY9ci5wYXJzZSgpO3RoaXMuY2ZmLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTt2YXIgbj1uZXcgaS5DRkZDb21waWxlcih0aGlzLmNmZik7dGhpcy5zZWFjcz10aGlzLmNmZi5zZWFjczt0cnl7dGhpcy5kYXRhPW4uY29tcGlsZSgpfWNhdGNoKHIpeygwLGEud2FybikoIkZhaWxlZCB0byBjb21waWxlIGZvbnQgIit0LmxvYWRlZE5hbWUpO3RoaXMuZGF0YT1lfX1DRkZGb250LnByb3RvdHlwZT17Z2V0IG51bUdseXBocygpe3JldHVybiB0aGlzLmNmZi5jaGFyU3RyaW5ncy5jb3VudH0sZ2V0Q2hhcnNldDpmdW5jdGlvbiBDRkZGb250X2dldENoYXJzZXQoKXtyZXR1cm4gdGhpcy5jZmYuY2hhcnNldC5jaGFyc2V0fSxnZXRHbHlwaE1hcHBpbmc6ZnVuY3Rpb24gQ0ZGRm9udF9nZXRHbHlwaE1hcHBpbmcoKXt2YXIgZSx0LHI9dGhpcy5jZmYsYT10aGlzLnByb3BlcnRpZXMsaT1yLmNoYXJzZXQuY2hhcnNldDtpZihhLmNvbXBvc2l0ZSl7ZT1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBzO2lmKHIuaXNDSURGb250KWZvcih0PTA7dDxpLmxlbmd0aDt0Kyspe3ZhciBuPWlbdF07cz1hLmNNYXAuY2hhckNvZGVPZihuKTtlW3NdPXR9ZWxzZSBmb3IodD0wO3Q8ci5jaGFyU3RyaW5ncy5jb3VudDt0Kyspe3M9YS5jTWFwLmNoYXJDb2RlT2YodCk7ZVtzXT10fXJldHVybiBlfXJldHVybiBlPXR5cGUxRm9udEdseXBoTWFwcGluZyhhLHIuZW5jb2Rpbmc/ci5lbmNvZGluZy5lbmNvZGluZzpudWxsLGkpfSxoYXNHbHlwaElkOmZ1bmN0aW9uIENGRkZvbnRfaGFzR2x5cGhJRChlKXtyZXR1cm4gdGhpcy5jZmYuaGFzR2x5cGhJZChlKX19O3JldHVybiBDRkZGb250fSgpfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkNGRkZEU2VsZWN0PXQuQ0ZGQ29tcGlsZXI9dC5DRkZQcml2YXRlRGljdD10LkNGRlRvcERpY3Q9dC5DRkZDaGFyc2V0PXQuQ0ZGSW5kZXg9dC5DRkZTdHJpbmdzPXQuQ0ZGSGVhZGVyPXQuQ0ZGPXQuQ0ZGUGFyc2VyPXQuQ0ZGU3RhbmRhcmRTdHJpbmdzPXZvaWQgMDt2YXIgYT1yKDIpLGk9cigzMiksbj1yKDMzKSxzPVsiLm5vdGRlZiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3RlcmlnaHQiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsInF1b3RlbGVmdCIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCJleGNsYW1kb3duIiwiY2VudCIsInN0ZXJsaW5nIiwiZnJhY3Rpb24iLCJ5ZW4iLCJmbG9yaW4iLCJzZWN0aW9uIiwiY3VycmVuY3kiLCJxdW90ZXNpbmdsZSIsInF1b3RlZGJsbGVmdCIsImd1aWxsZW1vdGxlZnQiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZW5kYXNoIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJwYXJhZ3JhcGgiLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInF1b3RlZGJscmlnaHQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwicGVydGhvdXNhbmQiLCJxdWVzdGlvbmRvd24iLCJncmF2ZSIsImFjdXRlIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJkaWVyZXNpcyIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iLCJlbWRhc2giLCJBRSIsIm9yZGZlbWluaW5lIiwiTHNsYXNoIiwiT3NsYXNoIiwiT0UiLCJvcmRtYXNjdWxpbmUiLCJhZSIsImRvdGxlc3NpIiwibHNsYXNoIiwib3NsYXNoIiwib2UiLCJnZXJtYW5kYmxzIiwib25lc3VwZXJpb3IiLCJsb2dpY2Fsbm90IiwibXUiLCJ0cmFkZW1hcmsiLCJFdGgiLCJvbmVoYWxmIiwicGx1c21pbnVzIiwiVGhvcm4iLCJvbmVxdWFydGVyIiwiZGl2aWRlIiwiYnJva2VuYmFyIiwiZGVncmVlIiwidGhvcm4iLCJ0aHJlZXF1YXJ0ZXJzIiwidHdvc3VwZXJpb3IiLCJyZWdpc3RlcmVkIiwibWludXMiLCJldGgiLCJtdWx0aXBseSIsInRocmVlc3VwZXJpb3IiLCJjb3B5cmlnaHQiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkFkaWVyZXNpcyIsIkFncmF2ZSIsIkFyaW5nIiwiQXRpbGRlIiwiQ2NlZGlsbGEiLCJFYWN1dGUiLCJFY2lyY3VtZmxleCIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiTnRpbGRlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJPZGllcmVzaXMiLCJPZ3JhdmUiLCJPdGlsZGUiLCJTY2Fyb24iLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVkaWVyZXNpcyIsIlVncmF2ZSIsIllhY3V0ZSIsIllkaWVyZXNpcyIsIlpjYXJvbiIsImFhY3V0ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYWdyYXZlIiwiYXJpbmciLCJhdGlsZGUiLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiZWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJpZ3JhdmUiLCJudGlsZGUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm9ncmF2ZSIsIm90aWxkZSIsInNjYXJvbiIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwidWdyYXZlIiwieWFjdXRlIiwieWRpZXJlc2lzIiwiemNhcm9uIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJ6ZXJvb2xkc3R5bGUiLCJvbmVvbGRzdHlsZSIsInR3b29sZHN0eWxlIiwidGhyZWVvbGRzdHlsZSIsImZvdXJvbGRzdHlsZSIsImZpdmVvbGRzdHlsZSIsInNpeG9sZHN0eWxlIiwic2V2ZW5vbGRzdHlsZSIsImVpZ2h0b2xkc3R5bGUiLCJuaW5lb2xkc3R5bGUiLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwicXVlc3Rpb25zbWFsbCIsImFzdXBlcmlvciIsImJzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsImRzdXBlcmlvciIsImVzdXBlcmlvciIsImlzdXBlcmlvciIsImxzdXBlcmlvciIsIm1zdXBlcmlvciIsIm5zdXBlcmlvciIsIm9zdXBlcmlvciIsInJzdXBlcmlvciIsInNzdXBlcmlvciIsInRzdXBlcmlvciIsImZmIiwiZmZpIiwiZmZsIiwicGFyZW5sZWZ0aW5mZXJpb3IiLCJwYXJlbnJpZ2h0aW5mZXJpb3IiLCJDaXJjdW1mbGV4c21hbGwiLCJoeXBoZW5zdXBlcmlvciIsIkdyYXZlc21hbGwiLCJBc21hbGwiLCJCc21hbGwiLCJDc21hbGwiLCJEc21hbGwiLCJFc21hbGwiLCJGc21hbGwiLCJHc21hbGwiLCJIc21hbGwiLCJJc21hbGwiLCJKc21hbGwiLCJLc21hbGwiLCJMc21hbGwiLCJNc21hbGwiLCJOc21hbGwiLCJPc21hbGwiLCJQc21hbGwiLCJRc21hbGwiLCJSc21hbGwiLCJTc21hbGwiLCJUc21hbGwiLCJVc21hbGwiLCJWc21hbGwiLCJXc21hbGwiLCJYc21hbGwiLCJZc21hbGwiLCJac21hbGwiLCJjb2xvbm1vbmV0YXJ5Iiwib25lZml0dGVkIiwicnVwaWFoIiwiVGlsZGVzbWFsbCIsImV4Y2xhbWRvd25zbWFsbCIsImNlbnRvbGRzdHlsZSIsIkxzbGFzaHNtYWxsIiwiU2Nhcm9uc21hbGwiLCJaY2Fyb25zbWFsbCIsIkRpZXJlc2lzc21hbGwiLCJCcmV2ZXNtYWxsIiwiQ2Fyb25zbWFsbCIsIkRvdGFjY2VudHNtYWxsIiwiTWFjcm9uc21hbGwiLCJmaWd1cmVkYXNoIiwiaHlwaGVuaW5mZXJpb3IiLCJPZ29uZWtzbWFsbCIsIlJpbmdzbWFsbCIsIkNlZGlsbGFzbWFsbCIsInF1ZXN0aW9uZG93bnNtYWxsIiwib25lZWlnaHRoIiwidGhyZWVlaWdodGhzIiwiZml2ZWVpZ2h0aHMiLCJzZXZlbmVpZ2h0aHMiLCJvbmV0aGlyZCIsInR3b3RoaXJkcyIsInplcm9zdXBlcmlvciIsImZvdXJzdXBlcmlvciIsImZpdmVzdXBlcmlvciIsInNpeHN1cGVyaW9yIiwic2V2ZW5zdXBlcmlvciIsImVpZ2h0c3VwZXJpb3IiLCJuaW5lc3VwZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJvbmVpbmZlcmlvciIsInR3b2luZmVyaW9yIiwidGhyZWVpbmZlcmlvciIsImZvdXJpbmZlcmlvciIsImZpdmVpbmZlcmlvciIsInNpeGluZmVyaW9yIiwic2V2ZW5pbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJuaW5laW5mZXJpb3IiLCJjZW50aW5mZXJpb3IiLCJkb2xsYXJpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiY29tbWFpbmZlcmlvciIsIkFncmF2ZXNtYWxsIiwiQWFjdXRlc21hbGwiLCJBY2lyY3VtZmxleHNtYWxsIiwiQXRpbGRlc21hbGwiLCJBZGllcmVzaXNzbWFsbCIsIkFyaW5nc21hbGwiLCJBRXNtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVncmF2ZXNtYWxsIiwiRWFjdXRlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJZ3JhdmVzbWFsbCIsIklhY3V0ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiRXRoc21hbGwiLCJOdGlsZGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2FjdXRlc21hbGwiLCJPY2lyY3VtZmxleHNtYWxsIiwiT3RpbGRlc21hbGwiLCJPZGllcmVzaXNzbWFsbCIsIk9Fc21hbGwiLCJPc2xhc2hzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWFjdXRlc21hbGwiLCJVY2lyY3VtZmxleHNtYWxsIiwiVWRpZXJlc2lzc21hbGwiLCJZYWN1dGVzbWFsbCIsIlRob3Juc21hbGwiLCJZZGllcmVzaXNzbWFsbCIsIjAwMS4wMDAiLCIwMDEuMDAxIiwiMDAxLjAwMiIsIjAwMS4wMDMiLCJCbGFjayIsIkJvbGQiLCJCb29rIiwiTGlnaHQiLCJNZWRpdW0iLCJSZWd1bGFyIiwiUm9tYW4iLCJTZW1pYm9sZCJdO3QuQ0ZGU3RhbmRhcmRTdHJpbmdzPXM7dmFyIG89ZnVuY3Rpb24gQ0ZGUGFyc2VyQ2xvc3VyZSgpe3ZhciBlPVtudWxsLHtpZDoiaHN0ZW0iLG1pbjoyLHN0YWNrQ2xlYXJpbmc6ITAsc3RlbTohMH0sbnVsbCx7aWQ6InZzdGVtIixtaW46MixzdGFja0NsZWFyaW5nOiEwLHN0ZW06ITB9LHtpZDoidm1vdmV0byIsbWluOjEsc3RhY2tDbGVhcmluZzohMH0se2lkOiJybGluZXRvIixtaW46MixyZXNldFN0YWNrOiEwfSx7aWQ6ImhsaW5ldG8iLG1pbjoxLHJlc2V0U3RhY2s6ITB9LHtpZDoidmxpbmV0byIsbWluOjEscmVzZXRTdGFjazohMH0se2lkOiJycmN1cnZldG8iLG1pbjo2LHJlc2V0U3RhY2s6ITB9LG51bGwse2lkOiJjYWxsc3ViciIsbWluOjEsdW5kZWZTdGFjazohMH0se2lkOiJyZXR1cm4iLG1pbjowLHVuZGVmU3RhY2s6ITB9LG51bGwsbnVsbCx7aWQ6ImVuZGNoYXIiLG1pbjowLHN0YWNrQ2xlYXJpbmc6ITB9LG51bGwsbnVsbCxudWxsLHtpZDoiaHN0ZW1obSIsbWluOjIsc3RhY2tDbGVhcmluZzohMCxzdGVtOiEwfSx7aWQ6ImhpbnRtYXNrIixtaW46MCxzdGFja0NsZWFyaW5nOiEwfSx7aWQ6ImNudHJtYXNrIixtaW46MCxzdGFja0NsZWFyaW5nOiEwfSx7aWQ6InJtb3ZldG8iLG1pbjoyLHN0YWNrQ2xlYXJpbmc6ITB9LHtpZDoiaG1vdmV0byIsbWluOjEsc3RhY2tDbGVhcmluZzohMH0se2lkOiJ2c3RlbWhtIixtaW46MixzdGFja0NsZWFyaW5nOiEwLHN0ZW06ITB9LHtpZDoicmN1cnZlbGluZSIsbWluOjgscmVzZXRTdGFjazohMH0se2lkOiJybGluZWN1cnZlIixtaW46OCxyZXNldFN0YWNrOiEwfSx7aWQ6InZ2Y3VydmV0byIsbWluOjQscmVzZXRTdGFjazohMH0se2lkOiJoaGN1cnZldG8iLG1pbjo0LHJlc2V0U3RhY2s6ITB9LG51bGwse2lkOiJjYWxsZ3N1YnIiLG1pbjoxLHVuZGVmU3RhY2s6ITB9LHtpZDoidmhjdXJ2ZXRvIixtaW46NCxyZXNldFN0YWNrOiEwfSx7aWQ6Imh2Y3VydmV0byIsbWluOjQscmVzZXRTdGFjazohMH1dLHQ9W251bGwsbnVsbCxudWxsLHtpZDoiYW5kIixtaW46MixzdGFja0RlbHRhOi0xfSx7aWQ6Im9yIixtaW46MixzdGFja0RlbHRhOi0xfSx7aWQ6Im5vdCIsbWluOjEsc3RhY2tEZWx0YTowfSxudWxsLG51bGwsbnVsbCx7aWQ6ImFicyIsbWluOjEsc3RhY2tEZWx0YTowfSx7aWQ6ImFkZCIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuOmZ1bmN0aW9uIHN0YWNrX2RpdihlLHQpe2VbdC0yXT1lW3QtMl0rZVt0LTFdfX0se2lkOiJzdWIiLG1pbjoyLHN0YWNrRGVsdGE6LTEsc3RhY2tGbjpmdW5jdGlvbiBzdGFja19kaXYoZSx0KXtlW3QtMl09ZVt0LTJdLWVbdC0xXX19LHtpZDoiZGl2IixtaW46MixzdGFja0RlbHRhOi0xLHN0YWNrRm46ZnVuY3Rpb24gc3RhY2tfZGl2KGUsdCl7ZVt0LTJdPWVbdC0yXS9lW3QtMV19fSxudWxsLHtpZDoibmVnIixtaW46MSxzdGFja0RlbHRhOjAsc3RhY2tGbjpmdW5jdGlvbiBzdGFja19kaXYoZSx0KXtlW3QtMV09LWVbdC0xXX19LHtpZDoiZXEiLG1pbjoyLHN0YWNrRGVsdGE6LTF9LG51bGwsbnVsbCx7aWQ6ImRyb3AiLG1pbjoxLHN0YWNrRGVsdGE6LTF9LG51bGwse2lkOiJwdXQiLG1pbjoyLHN0YWNrRGVsdGE6LTJ9LHtpZDoiZ2V0IixtaW46MSxzdGFja0RlbHRhOjB9LHtpZDoiaWZlbHNlIixtaW46NCxzdGFja0RlbHRhOi0zfSx7aWQ6InJhbmRvbSIsbWluOjAsc3RhY2tEZWx0YToxfSx7aWQ6Im11bCIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuOmZ1bmN0aW9uIHN0YWNrX2RpdihlLHQpe2VbdC0yXT1lW3QtMl0qZVt0LTFdfX0sbnVsbCx7aWQ6InNxcnQiLG1pbjoxLHN0YWNrRGVsdGE6MH0se2lkOiJkdXAiLG1pbjoxLHN0YWNrRGVsdGE6MX0se2lkOiJleGNoIixtaW46MixzdGFja0RlbHRhOjB9LHtpZDoiaW5kZXgiLG1pbjoyLHN0YWNrRGVsdGE6MH0se2lkOiJyb2xsIixtaW46MyxzdGFja0RlbHRhOi0yfSxudWxsLG51bGwsbnVsbCx7aWQ6ImhmbGV4IixtaW46NyxyZXNldFN0YWNrOiEwfSx7aWQ6ImZsZXgiLG1pbjoxMyxyZXNldFN0YWNrOiEwfSx7aWQ6ImhmbGV4MSIsbWluOjkscmVzZXRTdGFjazohMH0se2lkOiJmbGV4MSIsbWluOjExLHJlc2V0U3RhY2s6ITB9XTtyZXR1cm4gY2xhc3MgQ0ZGUGFyc2Vye2NvbnN0cnVjdG9yKGUsdCxyKXt0aGlzLmJ5dGVzPWUuZ2V0Qnl0ZXMoKTt0aGlzLnByb3BlcnRpZXM9dDt0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQ9ISFyfXBhcnNlKCl7dmFyIGU9dGhpcy5wcm9wZXJ0aWVzLHQ9bmV3IENGRjt0aGlzLmNmZj10O3ZhciByPXRoaXMucGFyc2VIZWFkZXIoKSxhPXRoaXMucGFyc2VJbmRleChyLmVuZFBvcyksaT10aGlzLnBhcnNlSW5kZXgoYS5lbmRQb3MpLG49dGhpcy5wYXJzZUluZGV4KGkuZW5kUG9zKSxzPXRoaXMucGFyc2VJbmRleChuLmVuZFBvcyksbz10aGlzLnBhcnNlRGljdChpLm9iai5nZXQoMCkpLGw9dGhpcy5jcmVhdGVEaWN0KGMsbyx0LnN0cmluZ3MpO3QuaGVhZGVyPXIub2JqO3QubmFtZXM9dGhpcy5wYXJzZU5hbWVJbmRleChhLm9iaik7dC5zdHJpbmdzPXRoaXMucGFyc2VTdHJpbmdJbmRleChuLm9iaik7dC50b3BEaWN0PWw7dC5nbG9iYWxTdWJySW5kZXg9cy5vYmo7dGhpcy5wYXJzZVByaXZhdGVEaWN0KHQudG9wRGljdCk7dC5pc0NJREZvbnQ9bC5oYXNOYW1lKCJST1MiKTt2YXIgaD1sLmdldEJ5TmFtZSgiQ2hhclN0cmluZ3MiKSx1PXRoaXMucGFyc2VJbmRleChoKS5vYmosZD1sLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpO2QmJihlLmZvbnRNYXRyaXg9ZCk7dmFyIGYsZyxtPWwuZ2V0QnlOYW1lKCJGb250QkJveCIpO2lmKG0pe2UuYXNjZW50PU1hdGgubWF4KG1bM10sbVsxXSk7ZS5kZXNjZW50PU1hdGgubWluKG1bMV0sbVszXSk7ZS5hc2NlbnRTY2FsZWQ9ITB9aWYodC5pc0NJREZvbnQpe2Zvcih2YXIgcD10aGlzLnBhcnNlSW5kZXgobC5nZXRCeU5hbWUoIkZEQXJyYXkiKSkub2JqLGI9MCx5PXAuY291bnQ7Yjx5OysrYil7dmFyIHY9cC5nZXQoYiksdz10aGlzLmNyZWF0ZURpY3QoYyx0aGlzLnBhcnNlRGljdCh2KSx0LnN0cmluZ3MpO3RoaXMucGFyc2VQcml2YXRlRGljdCh3KTt0LmZkQXJyYXkucHVzaCh3KX1nPW51bGw7Zj10aGlzLnBhcnNlQ2hhcnNldHMobC5nZXRCeU5hbWUoImNoYXJzZXQiKSx1LmNvdW50LHQuc3RyaW5ncywhMCk7dC5mZFNlbGVjdD10aGlzLnBhcnNlRkRTZWxlY3QobC5nZXRCeU5hbWUoIkZEU2VsZWN0IiksdS5jb3VudCl9ZWxzZXtmPXRoaXMucGFyc2VDaGFyc2V0cyhsLmdldEJ5TmFtZSgiY2hhcnNldCIpLHUuY291bnQsdC5zdHJpbmdzLCExKTtnPXRoaXMucGFyc2VFbmNvZGluZyhsLmdldEJ5TmFtZSgiRW5jb2RpbmciKSxlLHQuc3RyaW5ncyxmLmNoYXJzZXQpfXQuY2hhcnNldD1mO3QuZW5jb2Rpbmc9Zzt2YXIgaz10aGlzLnBhcnNlQ2hhclN0cmluZ3Moe2NoYXJTdHJpbmdzOnUsbG9jYWxTdWJySW5kZXg6bC5wcml2YXRlRGljdC5zdWJyc0luZGV4LGdsb2JhbFN1YnJJbmRleDpzLm9iaixmZFNlbGVjdDp0LmZkU2VsZWN0LGZkQXJyYXk6dC5mZEFycmF5LHByaXZhdGVEaWN0OmwucHJpdmF0ZURpY3R9KTt0LmNoYXJTdHJpbmdzPWsuY2hhclN0cmluZ3M7dC5zZWFjcz1rLnNlYWNzO3Qud2lkdGhzPWsud2lkdGhzO3JldHVybiB0fXBhcnNlSGVhZGVyKCl7Zm9yKHZhciBlPXRoaXMuYnl0ZXMsdD1lLmxlbmd0aCxyPTA7cjx0JiYxIT09ZVtyXTspKytyO2lmKHI+PXQpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgQ0ZGIGhlYWRlciIpO2lmKDAhPT1yKXsoMCxhLmluZm8pKCJjZmYgZGF0YSBpcyBzaGlmdGVkIik7ZT1lLnN1YmFycmF5KHIpO3RoaXMuYnl0ZXM9ZX12YXIgaT1lWzBdLG49ZVsxXSxzPWVbMl0sbz1lWzNdO3JldHVybntvYmo6bmV3IENGRkhlYWRlcihpLG4scyxvKSxlbmRQb3M6c319cGFyc2VEaWN0KGUpe3ZhciB0PTA7ZnVuY3Rpb24gcGFyc2VPcGVyYW5kKCl7dmFyIHI9ZVt0KytdO2lmKDMwPT09cilyZXR1cm4gZnVuY3Rpb24gcGFyc2VGbG9hdE9wZXJhbmQoKXt2YXIgcj0iIjtjb25zdCBhPVsiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIi4iLCJFIiwiRS0iLG51bGwsIi0iXTt2YXIgaT1lLmxlbmd0aDtmb3IoO3Q8aTspe3ZhciBuPWVbdCsrXSxzPW4+PjQsbz0xNSZuO2lmKDE1PT09cylicmVhaztyKz1hW3NdO2lmKDE1PT09bylicmVhaztyKz1hW29dfXJldHVybiBwYXJzZUZsb2F0KHIpfSgpO2lmKDI4PT09cilyZXR1cm4gcj0oKHI9ZVt0KytdKTw8MjR8ZVt0KytdPDwxNik+PjE2O2lmKDI5PT09cilyZXR1cm4gcj0ocj0ocj0ocj1lW3QrK10pPDw4fGVbdCsrXSk8PDh8ZVt0KytdKTw8OHxlW3QrK107aWYocj49MzImJnI8PTI0NilyZXR1cm4gci0xMzk7aWYocj49MjQ3JiZyPD0yNTApcmV0dXJuIDI1Niooci0yNDcpK2VbdCsrXSsxMDg7aWYocj49MjUxJiZyPD0yNTQpcmV0dXJuLTI1Niooci0yNTEpLWVbdCsrXS0xMDg7KDAsYS53YXJuKSgnQ0ZGUGFyc2VyX3BhcnNlRGljdDogIicrcisnIiBpcyBhIHJlc2VydmVkIGNvbW1hbmQuJyk7cmV0dXJuIE5hTn12YXIgcj1bXSxpPVtdO3Q9MDtmb3IodmFyIG49ZS5sZW5ndGg7dDxuOyl7dmFyIHM9ZVt0XTtpZihzPD0yMSl7MTI9PT1zJiYocz1zPDw4fGVbKyt0XSk7aS5wdXNoKFtzLHJdKTtyPVtdOysrdH1lbHNlIHIucHVzaChwYXJzZU9wZXJhbmQoKSl9cmV0dXJuIGl9cGFyc2VJbmRleChlKXt2YXIgdCxyLGE9bmV3IENGRkluZGV4LGk9dGhpcy5ieXRlcyxuPWlbZSsrXTw8OHxpW2UrK10scz1bXSxvPWU7aWYoMCE9PW4pe3ZhciBjPWlbZSsrXSxsPWUrKG4rMSkqYy0xO2Zvcih0PTAscj1uKzE7dDxyOysrdCl7Zm9yKHZhciBoPTAsdT0wO3U8YzsrK3Upe2g8PD04O2grPWlbZSsrXX1zLnB1c2gobCtoKX1vPXNbbl19Zm9yKHQ9MCxyPXMubGVuZ3RoLTE7dDxyOysrdCl7dmFyIGQ9c1t0XSxmPXNbdCsxXTthLmFkZChpLnN1YmFycmF5KGQsZikpfXJldHVybntvYmo6YSxlbmRQb3M6b319cGFyc2VOYW1lSW5kZXgoZSl7Zm9yKHZhciB0PVtdLHI9MCxpPWUuY291bnQ7cjxpOysrcil7dmFyIG49ZS5nZXQocik7dC5wdXNoKCgwLGEuYnl0ZXNUb1N0cmluZykobikpfXJldHVybiB0fXBhcnNlU3RyaW5nSW5kZXgoZSl7Zm9yKHZhciB0PW5ldyBDRkZTdHJpbmdzLHI9MCxpPWUuY291bnQ7cjxpOysrcil7dmFyIG49ZS5nZXQocik7dC5hZGQoKDAsYS5ieXRlc1RvU3RyaW5nKShuKSl9cmV0dXJuIHR9Y3JlYXRlRGljdChlLHQscil7Zm9yKHZhciBhPW5ldyBlKHIpLGk9MCxuPXQubGVuZ3RoO2k8bjsrK2kpe3ZhciBzPXRbaV0sbz1zWzBdLGM9c1sxXTthLnNldEJ5S2V5KG8sYyl9cmV0dXJuIGF9cGFyc2VDaGFyU3RyaW5nKHIsaSxuLHMpe2lmKCFpfHxyLmNhbGxEZXB0aD4xMClyZXR1cm4hMTtmb3IodmFyIG89ci5zdGFja1NpemUsYz1yLnN0YWNrLGw9aS5sZW5ndGgsaD0wO2g8bDspe3ZhciB1PWlbaCsrXSxkPW51bGw7aWYoMTI9PT11KXt2YXIgZj1pW2grK107aWYoMD09PWYpe2lbaC0yXT0xMzk7aVtoLTFdPTIyO289MH1lbHNlIGQ9dFtmXX1lbHNlIGlmKDI4PT09dSl7Y1tvXT0oaVtoXTw8MjR8aVtoKzFdPDwxNik+PjE2O2grPTI7bysrfWVsc2UgaWYoMTQ9PT11KXtpZihvPj00KXtvLT00O2lmKHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCl7ci5zZWFjPWMuc2xpY2UobyxvKzQpO3JldHVybiExfX1kPWVbdV19ZWxzZSBpZih1Pj0zMiYmdTw9MjQ2KXtjW29dPXUtMTM5O28rK31lbHNlIGlmKHU+PTI0NyYmdTw9MjU0KXtjW29dPXU8MjUxPyh1LTI0Nzw8OCkraVtoXSsxMDg6LSh1LTI1MTw8OCktaVtoXS0xMDg7aCsrO28rK31lbHNlIGlmKDI1NT09PXUpe2Nbb109KGlbaF08PDI0fGlbaCsxXTw8MTZ8aVtoKzJdPDw4fGlbaCszXSkvNjU1MzY7aCs9NDtvKyt9ZWxzZSBpZigxOT09PXV8fDIwPT09dSl7ci5oaW50cys9bz4+MTtoKz1yLmhpbnRzKzc+PjM7byU9MjtkPWVbdV19ZWxzZXtpZigxMD09PXV8fDI5PT09dSl7dmFyIGc7aWYoIShnPTEwPT09dT9uOnMpKXtkPWVbdV07KDAsYS53YXJuKSgiTWlzc2luZyBzdWJyc0luZGV4IGZvciAiK2QuaWQpO3JldHVybiExfXZhciBtPTMyNzY4O2cuY291bnQ8MTI0MD9tPTEwNzpnLmNvdW50PDMzOTAwJiYobT0xMTMxKTt2YXIgcD1jWy0tb10rbTtpZihwPDB8fHA+PWcuY291bnR8fGlzTmFOKHApKXtkPWVbdV07KDAsYS53YXJuKSgiT3V0IG9mIGJvdW5kcyBzdWJySW5kZXggZm9yICIrZC5pZCk7cmV0dXJuITF9ci5zdGFja1NpemU9bztyLmNhbGxEZXB0aCsrO2lmKCF0aGlzLnBhcnNlQ2hhclN0cmluZyhyLGcuZ2V0KHApLG4scykpcmV0dXJuITE7ci5jYWxsRGVwdGgtLTtvPXIuc3RhY2tTaXplO2NvbnRpbnVlfWlmKDExPT09dSl7ci5zdGFja1NpemU9bztyZXR1cm4hMH1kPWVbdV19aWYoZCl7aWYoZC5zdGVtKXtyLmhpbnRzKz1vPj4xO2lmKDM9PT11fHwyMz09PXUpci5oYXNWU3RlbXM9ITA7ZWxzZSBpZihyLmhhc1ZTdGVtcyYmKDE9PT11fHwxOD09PXUpKXsoMCxhLndhcm4pKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKTtpW2gtMV09MT09PXU/MzoyM319aWYoIm1pbiJpbiBkJiYhci51bmRlZlN0YWNrJiZvPGQubWluKXsoMCxhLndhcm4pKCJOb3QgZW5vdWdoIHBhcmFtZXRlcnMgZm9yICIrZC5pZCsiOyBhY3R1YWw6ICIrbysiLCBleHBlY3RlZDogIitkLm1pbik7cmV0dXJuITF9aWYoci5maXJzdFN0YWNrQ2xlYXJpbmcmJmQuc3RhY2tDbGVhcmluZyl7ci5maXJzdFN0YWNrQ2xlYXJpbmc9ITE7KG8tPWQubWluKT49MiYmZC5zdGVtP28lPTI6bz4xJiYoMCxhLndhcm4pKCJGb3VuZCB0b28gbWFueSBwYXJhbWV0ZXJzIGZvciBzdGFjay1jbGVhcmluZyBjb21tYW5kIik7bz4wJiZjW28tMV0+PTAmJihyLndpZHRoPWNbby0xXSl9aWYoInN0YWNrRGVsdGEiaW4gZCl7InN0YWNrRm4iaW4gZCYmZC5zdGFja0ZuKGMsbyk7bys9ZC5zdGFja0RlbHRhfWVsc2UgaWYoZC5zdGFja0NsZWFyaW5nKW89MDtlbHNlIGlmKGQucmVzZXRTdGFjayl7bz0wO3IudW5kZWZTdGFjaz0hMX1lbHNlIGlmKGQudW5kZWZTdGFjayl7bz0wO3IudW5kZWZTdGFjaz0hMDtyLmZpcnN0U3RhY2tDbGVhcmluZz0hMX19fXIuc3RhY2tTaXplPW87cmV0dXJuITB9cGFyc2VDaGFyU3RyaW5ncyh7Y2hhclN0cmluZ3M6ZSxsb2NhbFN1YnJJbmRleDp0LGdsb2JhbFN1YnJJbmRleDpyLGZkU2VsZWN0OmksZmRBcnJheTpuLHByaXZhdGVEaWN0OnN9KXtmb3IodmFyIG89W10sYz1bXSxsPWUuY291bnQsaD0wO2g8bDtoKyspe3ZhciB1PWUuZ2V0KGgpLGQ9e2NhbGxEZXB0aDowLHN0YWNrU2l6ZTowLHN0YWNrOltdLHVuZGVmU3RhY2s6ITAsaGludHM6MCxmaXJzdFN0YWNrQ2xlYXJpbmc6ITAsc2VhYzpudWxsLHdpZHRoOm51bGwsaGFzVlN0ZW1zOiExfSxmPSEwLGc9bnVsbCxtPXM7aWYoaSYmbi5sZW5ndGgpe3ZhciBwPWkuZ2V0RkRJbmRleChoKTtpZigtMT09PXApeygwLGEud2FybikoIkdseXBoIGluZGV4IGlzIG5vdCBpbiBmZCBzZWxlY3QuIik7Zj0hMX1pZihwPj1uLmxlbmd0aCl7KDAsYS53YXJuKSgiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIik7Zj0hMX1mJiYoZz0obT1uW3BdLnByaXZhdGVEaWN0KS5zdWJyc0luZGV4KX1lbHNlIHQmJihnPXQpO2YmJihmPXRoaXMucGFyc2VDaGFyU3RyaW5nKGQsdSxnLHIpKTtpZihudWxsIT09ZC53aWR0aCl7Y29uc3QgZT1tLmdldEJ5TmFtZSgibm9taW5hbFdpZHRoWCIpO2NbaF09ZStkLndpZHRofWVsc2V7Y29uc3QgZT1tLmdldEJ5TmFtZSgiZGVmYXVsdFdpZHRoWCIpO2NbaF09ZX1udWxsIT09ZC5zZWFjJiYob1toXT1kLnNlYWMpO2Z8fGUuc2V0KGgsbmV3IFVpbnQ4QXJyYXkoWzE0XSkpfXJldHVybntjaGFyU3RyaW5nczplLHNlYWNzOm8sd2lkdGhzOmN9fWVtcHR5UHJpdmF0ZURpY3Rpb25hcnkoZSl7dmFyIHQ9dGhpcy5jcmVhdGVEaWN0KGwsW10sZS5zdHJpbmdzKTtlLnNldEJ5S2V5KDE4LFswLDBdKTtlLnByaXZhdGVEaWN0PXR9cGFyc2VQcml2YXRlRGljdChlKXtpZihlLmhhc05hbWUoIlByaXZhdGUiKSl7dmFyIHQ9ZS5nZXRCeU5hbWUoIlByaXZhdGUiKTtpZihBcnJheS5pc0FycmF5KHQpJiYyPT09dC5sZW5ndGgpe3ZhciByPXRbMF0sYT10WzFdO2lmKDA9PT1yfHxhPj10aGlzLmJ5dGVzLmxlbmd0aCl0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkoZSk7ZWxzZXt2YXIgaT1hK3Isbj10aGlzLmJ5dGVzLnN1YmFycmF5KGEsaSkscz10aGlzLnBhcnNlRGljdChuKSxvPXRoaXMuY3JlYXRlRGljdChsLHMsZS5zdHJpbmdzKTtlLnByaXZhdGVEaWN0PW87aWYoby5nZXRCeU5hbWUoIlN1YnJzIikpe3ZhciBjPW8uZ2V0QnlOYW1lKCJTdWJycyIpLGg9YStjO2lmKDA9PT1jfHxoPj10aGlzLmJ5dGVzLmxlbmd0aCl0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkoZSk7ZWxzZXt2YXIgdT10aGlzLnBhcnNlSW5kZXgoaCk7by5zdWJyc0luZGV4PXUub2JqfX19fWVsc2UgZS5yZW1vdmVCeU5hbWUoIlByaXZhdGUiKX1lbHNlIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShlKX1wYXJzZUNoYXJzZXRzKGUsdCxyLG4pe2lmKDA9PT1lKXJldHVybiBuZXcgQ0ZGQ2hhcnNldCghMCxoLklTT19BRE9CRSxpLklTT0Fkb2JlQ2hhcnNldCk7aWYoMT09PWUpcmV0dXJuIG5ldyBDRkZDaGFyc2V0KCEwLGguRVhQRVJULGkuRXhwZXJ0Q2hhcnNldCk7aWYoMj09PWUpcmV0dXJuIG5ldyBDRkZDaGFyc2V0KCEwLGguRVhQRVJUX1NVQlNFVCxpLkV4cGVydFN1YnNldENoYXJzZXQpO3ZhciBzPXRoaXMuYnl0ZXMsbz1lLGM9c1tlKytdO2NvbnN0IGw9W24/MDoiLm5vdGRlZiJdO3ZhciB1LGQsZjt0LT0xO3N3aXRjaChjKXtjYXNlIDA6Zm9yKGY9MDtmPHQ7ZisrKXt1PXNbZSsrXTw8OHxzW2UrK107bC5wdXNoKG4/dTpyLmdldCh1KSl9YnJlYWs7Y2FzZSAxOmZvcig7bC5sZW5ndGg8PXQ7KXt1PXNbZSsrXTw8OHxzW2UrK107ZD1zW2UrK107Zm9yKGY9MDtmPD1kO2YrKylsLnB1c2gobj91Kys6ci5nZXQodSsrKSl9YnJlYWs7Y2FzZSAyOmZvcig7bC5sZW5ndGg8PXQ7KXt1PXNbZSsrXTw8OHxzW2UrK107ZD1zW2UrK108PDh8c1tlKytdO2ZvcihmPTA7Zjw9ZDtmKyspbC5wdXNoKG4/dSsrOnIuZ2V0KHUrKykpfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlVua25vd24gY2hhcnNldCBmb3JtYXQiKX12YXIgZz1lLG09cy5zdWJhcnJheShvLGcpO3JldHVybiBuZXcgQ0ZGQ2hhcnNldCghMSxjLGwsbSl9cGFyc2VFbmNvZGluZyhlLHQscixpKXt2YXIgcyxvLGMsbD1PYmplY3QuY3JlYXRlKG51bGwpLGg9dGhpcy5ieXRlcyx1PSExLGQ9bnVsbDtpZigwPT09ZXx8MT09PWUpe3U9ITA7cz1lO3ZhciBmPWU/bi5FeHBlcnRFbmNvZGluZzpuLlN0YW5kYXJkRW5jb2Rpbmc7Zm9yKG89MCxjPWkubGVuZ3RoO288YztvKyspe3ZhciBnPWYuaW5kZXhPZihpW29dKTstMSE9PWcmJihsW2ddPW8pfX1lbHNle3ZhciBtPWU7c3dpdGNoKDEyNyYocz1oW2UrK10pKXtjYXNlIDA6dmFyIHA9aFtlKytdO2ZvcihvPTE7bzw9cDtvKyspbFtoW2UrK11dPW87YnJlYWs7Y2FzZSAxOnZhciBiPWhbZSsrXSx5PTE7Zm9yKG89MDtvPGI7bysrKWZvcih2YXIgdj1oW2UrK10sdz1oW2UrK10saz12O2s8PXYrdztrKyspbFtrXT15Kys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcihgVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICR7c30gaW4gQ0ZGYCl9dmFyIFM9ZTtpZigxMjgmcyl7aFttXSY9MTI3OyFmdW5jdGlvbiByZWFkU3VwcGxlbWVudCgpe3ZhciB0PWhbZSsrXTtmb3Iobz0wO288dDtvKyspe3ZhciBhPWhbZSsrXSxuPShoW2UrK108PDgpKygyNTUmaFtlKytdKTtsW2FdPWkuaW5kZXhPZihyLmdldChuKSl9fSgpfWQ9aC5zdWJhcnJheShtLFMpfXJldHVybiBuZXcgQ0ZGRW5jb2RpbmcodSxzJj0xMjcsbCxkKX1wYXJzZUZEU2VsZWN0KGUsdCl7dmFyIHIsaT10aGlzLmJ5dGVzLG49aVtlKytdLHM9W107c3dpdGNoKG4pe2Nhc2UgMDpmb3Iocj0wO3I8dDsrK3Ipe3ZhciBvPWlbZSsrXTtzLnB1c2gobyl9YnJlYWs7Y2FzZSAzOnZhciBjPWlbZSsrXTw8OHxpW2UrK107Zm9yKHI9MDtyPGM7KytyKXt2YXIgbD1pW2UrK108PDh8aVtlKytdO2lmKDA9PT1yJiYwIT09bCl7KDAsYS53YXJuKSgicGFyc2VGRFNlbGVjdDogVGhlIGZpcnN0IHJhbmdlIG11c3QgaGF2ZSBhIGZpcnN0IEdJRCBvZiAwIC0tIHRyeWluZyB0byByZWNvdmVyLiIpO2w9MH1mb3IodmFyIGg9aVtlKytdLHU9aVtlXTw8OHxpW2UrMV0sZD1sO2Q8dTsrK2Qpcy5wdXNoKGgpfWUrPTI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcihgcGFyc2VGRFNlbGVjdDogVW5rbm93biBmb3JtYXQgIiR7bn0iLmApfWlmKHMubGVuZ3RoIT09dCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigicGFyc2VGRFNlbGVjdDogSW52YWxpZCBmb250IGRhdGEuIik7cmV0dXJuIG5ldyBDRkZGRFNlbGVjdChuLHMpfX19KCk7dC5DRkZQYXJzZXI9bztjbGFzcyBDRkZ7Y29uc3RydWN0b3IoKXt0aGlzLmhlYWRlcj1udWxsO3RoaXMubmFtZXM9W107dGhpcy50b3BEaWN0PW51bGw7dGhpcy5zdHJpbmdzPW5ldyBDRkZTdHJpbmdzO3RoaXMuZ2xvYmFsU3VickluZGV4PW51bGw7dGhpcy5lbmNvZGluZz1udWxsO3RoaXMuY2hhcnNldD1udWxsO3RoaXMuY2hhclN0cmluZ3M9bnVsbDt0aGlzLmZkQXJyYXk9W107dGhpcy5mZFNlbGVjdD1udWxsO3RoaXMuaXNDSURGb250PSExfWR1cGxpY2F0ZUZpcnN0R2x5cGgoKXtpZih0aGlzLmNoYXJTdHJpbmdzLmNvdW50Pj02NTUzNSkoMCxhLndhcm4pKCJOb3QgZW5vdWdoIHNwYWNlIGluIGNoYXJzdHJpbmdzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTtlbHNle3ZhciBlPXRoaXMuY2hhclN0cmluZ3MuZ2V0KDApO3RoaXMuY2hhclN0cmluZ3MuYWRkKGUpO3RoaXMuaXNDSURGb250JiZ0aGlzLmZkU2VsZWN0LmZkU2VsZWN0LnB1c2godGhpcy5mZFNlbGVjdC5mZFNlbGVjdFswXSl9fWhhc0dseXBoSWQoZSl7cmV0dXJuIShlPDB8fGU+PXRoaXMuY2hhclN0cmluZ3MuY291bnQpJiZ0aGlzLmNoYXJTdHJpbmdzLmdldChlKS5sZW5ndGg+MH19dC5DRkY9Q0ZGO2NsYXNzIENGRkhlYWRlcntjb25zdHJ1Y3RvcihlLHQscixhKXt0aGlzLm1ham9yPWU7dGhpcy5taW5vcj10O3RoaXMuaGRyU2l6ZT1yO3RoaXMub2ZmU2l6ZT1hfX10LkNGRkhlYWRlcj1DRkZIZWFkZXI7Y2xhc3MgQ0ZGU3RyaW5nc3tjb25zdHJ1Y3Rvcigpe3RoaXMuc3RyaW5ncz1bXX1nZXQoZSl7cmV0dXJuIGU+PTAmJmU8PTM5MD9zW2VdOmUtMzkxPD10aGlzLnN0cmluZ3MubGVuZ3RoP3RoaXMuc3RyaW5nc1tlLTM5MV06c1swXX1nZXRTSUQoZSl7bGV0IHQ9cy5pbmRleE9mKGUpO2lmKC0xIT09dClyZXR1cm4gdDt0PXRoaXMuc3RyaW5ncy5pbmRleE9mKGUpO3JldHVybi0xIT09dD90KzM5MTotMX1hZGQoZSl7dGhpcy5zdHJpbmdzLnB1c2goZSl9Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuc3RyaW5ncy5sZW5ndGh9fXQuQ0ZGU3RyaW5ncz1DRkZTdHJpbmdzO2NsYXNzIENGRkluZGV4e2NvbnN0cnVjdG9yKCl7dGhpcy5vYmplY3RzPVtdO3RoaXMubGVuZ3RoPTB9YWRkKGUpe3RoaXMubGVuZ3RoKz1lLmxlbmd0aDt0aGlzLm9iamVjdHMucHVzaChlKX1zZXQoZSx0KXt0aGlzLmxlbmd0aCs9dC5sZW5ndGgtdGhpcy5vYmplY3RzW2VdLmxlbmd0aDt0aGlzLm9iamVjdHNbZV09dH1nZXQoZSl7cmV0dXJuIHRoaXMub2JqZWN0c1tlXX1nZXQgY291bnQoKXtyZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aH19dC5DRkZJbmRleD1DRkZJbmRleDtjbGFzcyBDRkZEaWN0e2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5rZXlUb05hbWVNYXA9ZS5rZXlUb05hbWVNYXA7dGhpcy5uYW1lVG9LZXlNYXA9ZS5uYW1lVG9LZXlNYXA7dGhpcy5kZWZhdWx0cz1lLmRlZmF1bHRzO3RoaXMudHlwZXM9ZS50eXBlczt0aGlzLm9wY29kZXM9ZS5vcGNvZGVzO3RoaXMub3JkZXI9ZS5vcmRlcjt0aGlzLnN0cmluZ3M9dDt0aGlzLnZhbHVlcz1PYmplY3QuY3JlYXRlKG51bGwpfXNldEJ5S2V5KGUsdCl7aWYoIShlIGluIHRoaXMua2V5VG9OYW1lTWFwKSlyZXR1cm4hMTt2YXIgcj10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4hMDtmb3IodmFyIGk9MDtpPHI7aSsrKWlmKGlzTmFOKHRbaV0pKXsoMCxhLndhcm4pKCdJbnZhbGlkIENGRkRpY3QgdmFsdWU6ICInK3QrJyIgZm9yIGtleSAiJytlKyciLicpO3JldHVybiEwfXZhciBuPXRoaXMudHlwZXNbZV07Im51bSIhPT1uJiYic2lkIiE9PW4mJiJvZmZzZXQiIT09bnx8KHQ9dFswXSk7dGhpcy52YWx1ZXNbZV09dDtyZXR1cm4hMH1zZXRCeU5hbWUoZSx0KXtpZighKGUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKGBJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiJHtlfSJgKTt0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtlXV09dH1oYXNOYW1lKGUpe3JldHVybiB0aGlzLm5hbWVUb0tleU1hcFtlXWluIHRoaXMudmFsdWVzfWdldEJ5TmFtZShlKXtpZighKGUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKGBJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAke2V9ImApO3ZhciB0PXRoaXMubmFtZVRvS2V5TWFwW2VdO3JldHVybiB0IGluIHRoaXMudmFsdWVzP3RoaXMudmFsdWVzW3RdOnRoaXMuZGVmYXVsdHNbdF19cmVtb3ZlQnlOYW1lKGUpe2RlbGV0ZSB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtlXV19c3RhdGljIGNyZWF0ZVRhYmxlcyhlKXtmb3IodmFyIHQ9e2tleVRvTmFtZU1hcDp7fSxuYW1lVG9LZXlNYXA6e30sZGVmYXVsdHM6e30sdHlwZXM6e30sb3Bjb2Rlczp7fSxvcmRlcjpbXX0scj0wLGE9ZS5sZW5ndGg7cjxhOysrcil7dmFyIGk9ZVtyXSxuPUFycmF5LmlzQXJyYXkoaVswXSk/KGlbMF1bMF08PDgpK2lbMF1bMV06aVswXTt0LmtleVRvTmFtZU1hcFtuXT1pWzFdO3QubmFtZVRvS2V5TWFwW2lbMV1dPW47dC50eXBlc1tuXT1pWzJdO3QuZGVmYXVsdHNbbl09aVszXTt0Lm9wY29kZXNbbl09QXJyYXkuaXNBcnJheShpWzBdKT9pWzBdOltpWzBdXTt0Lm9yZGVyLnB1c2gobil9cmV0dXJuIHR9fXZhciBjPWZ1bmN0aW9uIENGRlRvcERpY3RDbG9zdXJlKCl7dmFyIGU9W1tbMTIsMzBdLCJST1MiLFsic2lkIiwic2lkIiwibnVtIl0sbnVsbF0sW1sxMiwyMF0sIlN5bnRoZXRpY0Jhc2UiLCJudW0iLG51bGxdLFswLCJ2ZXJzaW9uIiwic2lkIixudWxsXSxbMSwiTm90aWNlIiwic2lkIixudWxsXSxbWzEyLDBdLCJDb3B5cmlnaHQiLCJzaWQiLG51bGxdLFsyLCJGdWxsTmFtZSIsInNpZCIsbnVsbF0sWzMsIkZhbWlseU5hbWUiLCJzaWQiLG51bGxdLFs0LCJXZWlnaHQiLCJzaWQiLG51bGxdLFtbMTIsMV0sImlzRml4ZWRQaXRjaCIsIm51bSIsMF0sW1sxMiwyXSwiSXRhbGljQW5nbGUiLCJudW0iLDBdLFtbMTIsM10sIlVuZGVybGluZVBvc2l0aW9uIiwibnVtIiwtMTAwXSxbWzEyLDRdLCJVbmRlcmxpbmVUaGlja25lc3MiLCJudW0iLDUwXSxbWzEyLDVdLCJQYWludFR5cGUiLCJudW0iLDBdLFtbMTIsNl0sIkNoYXJzdHJpbmdUeXBlIiwibnVtIiwyXSxbWzEyLDddLCJGb250TWF0cml4IixbIm51bSIsIm51bSIsIm51bSIsIm51bSIsIm51bSIsIm51bSJdLFsuMDAxLDAsMCwuMDAxLDAsMF1dLFsxMywiVW5pcXVlSUQiLCJudW0iLG51bGxdLFs1LCJGb250QkJveCIsWyJudW0iLCJudW0iLCJudW0iLCJudW0iXSxbMCwwLDAsMF1dLFtbMTIsOF0sIlN0cm9rZVdpZHRoIiwibnVtIiwwXSxbMTQsIlhVSUQiLCJhcnJheSIsbnVsbF0sWzE1LCJjaGFyc2V0Iiwib2Zmc2V0IiwwXSxbMTYsIkVuY29kaW5nIiwib2Zmc2V0IiwwXSxbMTcsIkNoYXJTdHJpbmdzIiwib2Zmc2V0IiwwXSxbMTgsIlByaXZhdGUiLFsib2Zmc2V0Iiwib2Zmc2V0Il0sbnVsbF0sW1sxMiwyMV0sIlBvc3RTY3JpcHQiLCJzaWQiLG51bGxdLFtbMTIsMjJdLCJCYXNlRm9udE5hbWUiLCJzaWQiLG51bGxdLFtbMTIsMjNdLCJCYXNlRm9udEJsZW5kIiwiZGVsdGEiLG51bGxdLFtbMTIsMzFdLCJDSURGb250VmVyc2lvbiIsIm51bSIsMF0sW1sxMiwzMl0sIkNJREZvbnRSZXZpc2lvbiIsIm51bSIsMF0sW1sxMiwzM10sIkNJREZvbnRUeXBlIiwibnVtIiwwXSxbWzEyLDM0XSwiQ0lEQ291bnQiLCJudW0iLDg3MjBdLFtbMTIsMzVdLCJVSURCYXNlIiwibnVtIixudWxsXSxbWzEyLDM3XSwiRkRTZWxlY3QiLCJvZmZzZXQiLG51bGxdLFtbMTIsMzZdLCJGREFycmF5Iiwib2Zmc2V0IixudWxsXSxbWzEyLDM4XSwiRm9udE5hbWUiLCJzaWQiLG51bGxdXSx0PW51bGw7cmV0dXJuIGNsYXNzIENGRlRvcERpY3QgZXh0ZW5kcyBDRkZEaWN0e2NvbnN0cnVjdG9yKHIpe251bGw9PT10JiYodD1DRkZEaWN0LmNyZWF0ZVRhYmxlcyhlKSk7c3VwZXIodCxyKTt0aGlzLnByaXZhdGVEaWN0PW51bGx9fX0oKTt0LkNGRlRvcERpY3Q9Yzt2YXIgbD1mdW5jdGlvbiBDRkZQcml2YXRlRGljdENsb3N1cmUoKXt2YXIgZT1bWzYsIkJsdWVWYWx1ZXMiLCJkZWx0YSIsbnVsbF0sWzcsIk90aGVyQmx1ZXMiLCJkZWx0YSIsbnVsbF0sWzgsIkZhbWlseUJsdWVzIiwiZGVsdGEiLG51bGxdLFs5LCJGYW1pbHlPdGhlckJsdWVzIiwiZGVsdGEiLG51bGxdLFtbMTIsOV0sIkJsdWVTY2FsZSIsIm51bSIsLjAzOTYyNV0sW1sxMiwxMF0sIkJsdWVTaGlmdCIsIm51bSIsN10sW1sxMiwxMV0sIkJsdWVGdXp6IiwibnVtIiwxXSxbMTAsIlN0ZEhXIiwibnVtIixudWxsXSxbMTEsIlN0ZFZXIiwibnVtIixudWxsXSxbWzEyLDEyXSwiU3RlbVNuYXBIIiwiZGVsdGEiLG51bGxdLFtbMTIsMTNdLCJTdGVtU25hcFYiLCJkZWx0YSIsbnVsbF0sW1sxMiwxNF0sIkZvcmNlQm9sZCIsIm51bSIsMF0sW1sxMiwxN10sIkxhbmd1YWdlR3JvdXAiLCJudW0iLDBdLFtbMTIsMThdLCJFeHBhbnNpb25GYWN0b3IiLCJudW0iLC4wNl0sW1sxMiwxOV0sImluaXRpYWxSYW5kb21TZWVkIiwibnVtIiwwXSxbMjAsImRlZmF1bHRXaWR0aFgiLCJudW0iLDBdLFsyMSwibm9taW5hbFdpZHRoWCIsIm51bSIsMF0sWzE5LCJTdWJycyIsIm9mZnNldCIsbnVsbF1dLHQ9bnVsbDtyZXR1cm4gY2xhc3MgQ0ZGUHJpdmF0ZURpY3QgZXh0ZW5kcyBDRkZEaWN0e2NvbnN0cnVjdG9yKHIpe251bGw9PT10JiYodD1DRkZEaWN0LmNyZWF0ZVRhYmxlcyhlKSk7c3VwZXIodCxyKTt0aGlzLnN1YnJzSW5kZXg9bnVsbH19fSgpO3QuQ0ZGUHJpdmF0ZURpY3Q9bDt2YXIgaD17SVNPX0FET0JFOjAsRVhQRVJUOjEsRVhQRVJUX1NVQlNFVDoyfTtjbGFzcyBDRkZDaGFyc2V0e2NvbnN0cnVjdG9yKGUsdCxyLGEpe3RoaXMucHJlZGVmaW5lZD1lO3RoaXMuZm9ybWF0PXQ7dGhpcy5jaGFyc2V0PXI7dGhpcy5yYXc9YX19dC5DRkZDaGFyc2V0PUNGRkNoYXJzZXQ7Y2xhc3MgQ0ZGRW5jb2Rpbmd7Y29uc3RydWN0b3IoZSx0LHIsYSl7dGhpcy5wcmVkZWZpbmVkPWU7dGhpcy5mb3JtYXQ9dDt0aGlzLmVuY29kaW5nPXI7dGhpcy5yYXc9YX19Y2xhc3MgQ0ZGRkRTZWxlY3R7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmZvcm1hdD1lO3RoaXMuZmRTZWxlY3Q9dH1nZXRGREluZGV4KGUpe3JldHVybiBlPDB8fGU+PXRoaXMuZmRTZWxlY3QubGVuZ3RoPy0xOnRoaXMuZmRTZWxlY3RbZV19fXQuQ0ZGRkRTZWxlY3Q9Q0ZGRkRTZWxlY3Q7Y2xhc3MgQ0ZGT2Zmc2V0VHJhY2tlcntjb25zdHJ1Y3Rvcigpe3RoaXMub2Zmc2V0cz1PYmplY3QuY3JlYXRlKG51bGwpfWlzVHJhY2tpbmcoZSl7cmV0dXJuIGUgaW4gdGhpcy5vZmZzZXRzfXRyYWNrKGUsdCl7aWYoZSBpbiB0aGlzLm9mZnNldHMpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkFscmVhZHkgdHJhY2tpbmcgbG9jYXRpb24gb2YgIitlKTt0aGlzLm9mZnNldHNbZV09dH1vZmZzZXQoZSl7Zm9yKHZhciB0IGluIHRoaXMub2Zmc2V0cyl0aGlzLm9mZnNldHNbdF0rPWV9c2V0RW50cnlMb2NhdGlvbihlLHQscil7aWYoIShlIGluIHRoaXMub2Zmc2V0cykpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIk5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAiK2UpO2Zvcih2YXIgaT1yLmRhdGEsbj10aGlzLm9mZnNldHNbZV0scz0wLG89dC5sZW5ndGg7czxvOysrcyl7dmFyIGM9NSpzK24sbD1jKzEsaD1jKzIsdT1jKzMsZD1jKzQ7aWYoMjkhPT1pW2NdfHwwIT09aVtsXXx8MCE9PWlbaF18fDAhPT1pW3VdfHwwIT09aVtkXSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigid3JpdGluZyB0byBhbiBvZmZzZXQgdGhhdCBpcyBub3QgZW1wdHkiKTt2YXIgZj10W3NdO2lbY109Mjk7aVtsXT1mPj4yNCYyNTU7aVtoXT1mPj4xNiYyNTU7aVt1XT1mPj44JjI1NTtpW2RdPTI1NSZmfX19Y2xhc3MgQ0ZGQ29tcGlsZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5jZmY9ZX1jb21waWxlKCl7dmFyIGU9dGhpcy5jZmYsdD17ZGF0YTpbXSxsZW5ndGg6MCxhZGQ6ZnVuY3Rpb24gQ0ZGQ29tcGlsZXJfYWRkKGUpe3RoaXMuZGF0YT10aGlzLmRhdGEuY29uY2F0KGUpO3RoaXMubGVuZ3RoPXRoaXMuZGF0YS5sZW5ndGh9fSxyPXRoaXMuY29tcGlsZUhlYWRlcihlLmhlYWRlcik7dC5hZGQocik7dmFyIGk9dGhpcy5jb21waWxlTmFtZUluZGV4KGUubmFtZXMpO3QuYWRkKGkpO2lmKGUuaXNDSURGb250JiZlLnRvcERpY3QuaGFzTmFtZSgiRm9udE1hdHJpeCIpKXt2YXIgbj1lLnRvcERpY3QuZ2V0QnlOYW1lKCJGb250TWF0cml4Iik7ZS50b3BEaWN0LnJlbW92ZUJ5TmFtZSgiRm9udE1hdHJpeCIpO2Zvcih2YXIgcz0wLG89ZS5mZEFycmF5Lmxlbmd0aDtzPG87cysrKXt2YXIgYz1lLmZkQXJyYXlbc10sbD1uLnNsaWNlKDApO2MuaGFzTmFtZSgiRm9udE1hdHJpeCIpJiYobD1hLlV0aWwudHJhbnNmb3JtKGwsYy5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSkpO2Muc2V0QnlOYW1lKCJGb250TWF0cml4IixsKX19ZS50b3BEaWN0LnNldEJ5TmFtZSgiY2hhcnNldCIsMCk7dmFyIGg9dGhpcy5jb21waWxlVG9wRGljdHMoW2UudG9wRGljdF0sdC5sZW5ndGgsZS5pc0NJREZvbnQpO3QuYWRkKGgub3V0cHV0KTt2YXIgdT1oLnRyYWNrZXJzWzBdLGQ9dGhpcy5jb21waWxlU3RyaW5nSW5kZXgoZS5zdHJpbmdzLnN0cmluZ3MpO3QuYWRkKGQpO3ZhciBmPXRoaXMuY29tcGlsZUluZGV4KGUuZ2xvYmFsU3VickluZGV4KTt0LmFkZChmKTtpZihlLmVuY29kaW5nJiZlLnRvcERpY3QuaGFzTmFtZSgiRW5jb2RpbmciKSlpZihlLmVuY29kaW5nLnByZWRlZmluZWQpdS5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsW2UuZW5jb2RpbmcuZm9ybWF0XSx0KTtlbHNle3ZhciBnPXRoaXMuY29tcGlsZUVuY29kaW5nKGUuZW5jb2RpbmcpO3Uuc2V0RW50cnlMb2NhdGlvbigiRW5jb2RpbmciLFt0Lmxlbmd0aF0sdCk7dC5hZGQoZyl9dmFyIG09dGhpcy5jb21waWxlQ2hhcnNldChlLmNoYXJzZXQsZS5jaGFyU3RyaW5ncy5jb3VudCxlLnN0cmluZ3MsZS5pc0NJREZvbnQpO3Uuc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsW3QubGVuZ3RoXSx0KTt0LmFkZChtKTt2YXIgcD10aGlzLmNvbXBpbGVDaGFyU3RyaW5ncyhlLmNoYXJTdHJpbmdzKTt1LnNldEVudHJ5TG9jYXRpb24oIkNoYXJTdHJpbmdzIixbdC5sZW5ndGhdLHQpO3QuYWRkKHApO2lmKGUuaXNDSURGb250KXt1LnNldEVudHJ5TG9jYXRpb24oIkZEU2VsZWN0IixbdC5sZW5ndGhdLHQpO3ZhciBiPXRoaXMuY29tcGlsZUZEU2VsZWN0KGUuZmRTZWxlY3QpO3QuYWRkKGIpO2g9dGhpcy5jb21waWxlVG9wRGljdHMoZS5mZEFycmF5LHQubGVuZ3RoLCEwKTt1LnNldEVudHJ5TG9jYXRpb24oIkZEQXJyYXkiLFt0Lmxlbmd0aF0sdCk7dC5hZGQoaC5vdXRwdXQpO3ZhciB5PWgudHJhY2tlcnM7dGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKGUuZmRBcnJheSx5LHQpfXRoaXMuY29tcGlsZVByaXZhdGVEaWN0cyhbZS50b3BEaWN0XSxbdV0sdCk7dC5hZGQoWzBdKTtyZXR1cm4gdC5kYXRhfWVuY29kZU51bWJlcihlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKT90aGlzLmVuY29kZUludGVnZXIoZSk6dGhpcy5lbmNvZGVGbG9hdChlKX1zdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCl7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIkVuY29kZUZsb2F0UmVnRXhwIiwvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyl9ZW5jb2RlRmxvYXQoZSl7dmFyIHQ9ZS50b1N0cmluZygpLHI9Q0ZGQ29tcGlsZXIuRW5jb2RlRmxvYXRSZWdFeHAuZXhlYyh0KTtpZihyKXt2YXIgYT1wYXJzZUZsb2F0KCIxZSIrKChyWzJdPytyWzJdOjApK3JbMV0ubGVuZ3RoKSk7dD0oTWF0aC5yb3VuZChlKmEpL2EpLnRvU3RyaW5nKCl9dmFyIGksbixzPSIiO2ZvcihpPTAsbj10Lmxlbmd0aDtpPG47KytpKXt2YXIgbz10W2ldO3MrPSJlIj09PW8/Ii0iPT09dFsrK2ldPyJjIjoiYiI6Ii4iPT09bz8iYSI6Ii0iPT09bz8iZSI6b312YXIgYz1bMzBdO2ZvcihpPTAsbj0ocys9MSZzLmxlbmd0aD8iZiI6ImZmIikubGVuZ3RoO2k8bjtpKz0yKWMucHVzaChwYXJzZUludChzLnN1YnN0cmluZyhpLGkrMiksMTYpKTtyZXR1cm4gY31lbmNvZGVJbnRlZ2VyKGUpe3JldHVybiBlPj0tMTA3JiZlPD0xMDc/W2UrMTM5XTplPj0xMDgmJmU8PTExMzE/WzI0NysoKGUtPTEwOCk+PjgpLDI1NSZlXTplPj0tMTEzMSYmZTw9LTEwOD9bMjUxKygoZT0tZS0xMDgpPj44KSwyNTUmZV06ZT49LTMyNzY4JiZlPD0zMjc2Nz9bMjgsZT4+OCYyNTUsMjU1JmVdOlsyOSxlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LDI1NSZlXX1jb21waWxlSGVhZGVyKGUpe3JldHVybltlLm1ham9yLGUubWlub3IsZS5oZHJTaXplLGUub2ZmU2l6ZV19Y29tcGlsZU5hbWVJbmRleChlKXtmb3IodmFyIHQ9bmV3IENGRkluZGV4LHI9MCxpPWUubGVuZ3RoO3I8aTsrK3Ipe2Zvcih2YXIgbj1lW3JdLHM9TWF0aC5taW4obi5sZW5ndGgsMTI3KSxvPW5ldyBBcnJheShzKSxjPTA7YzxzO2MrKyl7dmFyIGw9bltjXTsobDwiISJ8fGw+In4ifHwiWyI9PT1sfHwiXSI9PT1sfHwiKCI9PT1sfHwiKSI9PT1sfHwieyI9PT1sfHwifSI9PT1sfHwiPCI9PT1sfHwiPiI9PT1sfHwiLyI9PT1sfHwiJSI9PT1sKSYmKGw9Il8iKTtvW2NdPWx9IiI9PT0obz1vLmpvaW4oIiIpKSYmKG89IkJhZF9Gb250X05hbWUiKTt0LmFkZCgoMCxhLnN0cmluZ1RvQnl0ZXMpKG8pKX1yZXR1cm4gdGhpcy5jb21waWxlSW5kZXgodCl9Y29tcGlsZVRvcERpY3RzKGUsdCxyKXtmb3IodmFyIGE9W10saT1uZXcgQ0ZGSW5kZXgsbj0wLHM9ZS5sZW5ndGg7bjxzOysrbil7dmFyIG89ZVtuXTtpZihyKXtvLnJlbW92ZUJ5TmFtZSgiQ0lERm9udFZlcnNpb24iKTtvLnJlbW92ZUJ5TmFtZSgiQ0lERm9udFJldmlzaW9uIik7by5yZW1vdmVCeU5hbWUoIkNJREZvbnRUeXBlIik7by5yZW1vdmVCeU5hbWUoIkNJRENvdW50Iik7by5yZW1vdmVCeU5hbWUoIlVJREJhc2UiKX12YXIgYz1uZXcgQ0ZGT2Zmc2V0VHJhY2tlcixsPXRoaXMuY29tcGlsZURpY3QobyxjKTthLnB1c2goYyk7aS5hZGQobCk7Yy5vZmZzZXQodCl9cmV0dXJue3RyYWNrZXJzOmEsb3V0cHV0Omk9dGhpcy5jb21waWxlSW5kZXgoaSxhKX19Y29tcGlsZVByaXZhdGVEaWN0cyhlLHQscil7Zm9yKHZhciBpPTAsbj1lLmxlbmd0aDtpPG47KytpKXt2YXIgcz1lW2ldLG89cy5wcml2YXRlRGljdDtpZighb3x8IXMuaGFzTmFtZSgiUHJpdmF0ZSIpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJUaGVyZSBtdXN0IGJlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5LiIpO3ZhciBjPW5ldyBDRkZPZmZzZXRUcmFja2VyLGw9dGhpcy5jb21waWxlRGljdChvLGMpLGg9ci5sZW5ndGg7Yy5vZmZzZXQoaCk7bC5sZW5ndGh8fChoPTApO3RbaV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsW2wubGVuZ3RoLGhdLHIpO3IuYWRkKGwpO2lmKG8uc3VicnNJbmRleCYmby5oYXNOYW1lKCJTdWJycyIpKXt2YXIgdT10aGlzLmNvbXBpbGVJbmRleChvLnN1YnJzSW5kZXgpO2Muc2V0RW50cnlMb2NhdGlvbigiU3VicnMiLFtsLmxlbmd0aF0scik7ci5hZGQodSl9fX1jb21waWxlRGljdChlLHQpe2Zvcih2YXIgcj1bXSxpPWUub3JkZXIsbj0wO248aS5sZW5ndGg7KytuKXt2YXIgcz1pW25dO2lmKHMgaW4gZS52YWx1ZXMpe3ZhciBvPWUudmFsdWVzW3NdLGM9ZS50eXBlc1tzXTtBcnJheS5pc0FycmF5KGMpfHwoYz1bY10pO0FycmF5LmlzQXJyYXkobyl8fChvPVtvXSk7aWYoMCE9PW8ubGVuZ3RoKXtmb3IodmFyIGw9MCxoPWMubGVuZ3RoO2w8aDsrK2wpe3ZhciB1PWNbbF0sZD1vW2xdO3N3aXRjaCh1KXtjYXNlIm51bSI6Y2FzZSJzaWQiOnI9ci5jb25jYXQodGhpcy5lbmNvZGVOdW1iZXIoZCkpO2JyZWFrO2Nhc2Uib2Zmc2V0Ijp2YXIgZj1lLmtleVRvTmFtZU1hcFtzXTt0LmlzVHJhY2tpbmcoZil8fHQudHJhY2soZixyLmxlbmd0aCk7cj1yLmNvbmNhdChbMjksMCwwLDAsMF0pO2JyZWFrO2Nhc2UiYXJyYXkiOmNhc2UiZGVsdGEiOnI9ci5jb25jYXQodGhpcy5lbmNvZGVOdW1iZXIoZCkpO2Zvcih2YXIgZz0xLG09by5sZW5ndGg7ZzxtOysrZylyPXIuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKG9bZ10pKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbmtub3duIGRhdGEgdHlwZSBvZiAiK3UpfX1yPXIuY29uY2F0KGUub3Bjb2Rlc1tzXSl9fX1yZXR1cm4gcn1jb21waWxlU3RyaW5nSW5kZXgoZSl7Zm9yKHZhciB0PW5ldyBDRkZJbmRleCxyPTAsaT1lLmxlbmd0aDtyPGk7KytyKXQuYWRkKCgwLGEuc3RyaW5nVG9CeXRlcykoZVtyXSkpO3JldHVybiB0aGlzLmNvbXBpbGVJbmRleCh0KX1jb21waWxlR2xvYmFsU3VickluZGV4KCl7dmFyIGU9dGhpcy5jZmYuZ2xvYmFsU3VickluZGV4O3RoaXMub3V0LndyaXRlQnl0ZUFycmF5KHRoaXMuY29tcGlsZUluZGV4KGUpKX1jb21waWxlQ2hhclN0cmluZ3MoZSl7Zm9yKHZhciB0PW5ldyBDRkZJbmRleCxyPTA7cjxlLmNvdW50O3IrKyl7dmFyIGE9ZS5nZXQocik7MCE9PWEubGVuZ3RoP3QuYWRkKGEpOnQuYWRkKG5ldyBVaW50OEFycmF5KFsxMzksMTRdKSl9cmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KHQpfWNvbXBpbGVDaGFyc2V0KGUsdCxyLGkpe2xldCBuO2NvbnN0IHM9dC0xO2lmKGkpbj1uZXcgVWludDhBcnJheShbMiwwLDAscz4+OCYyNTUsMjU1JnNdKTtlbHNle249bmV3IFVpbnQ4QXJyYXkoMSsyKnMpO25bMF09MDtsZXQgdD0wO2NvbnN0IGk9ZS5jaGFyc2V0Lmxlbmd0aDtsZXQgbz0hMTtmb3IobGV0IHM9MTtzPG4ubGVuZ3RoO3MrPTIpe2xldCBjPTA7aWYodDxpKXtjb25zdCBpPWUuY2hhcnNldFt0KytdO2M9ci5nZXRTSUQoaSk7aWYoLTE9PT1jKXtjPTA7aWYoIW8pe289ITA7KDAsYS53YXJuKShgQ291bGRuJ3QgZmluZCAke2l9IGluIENGRiBzdHJpbmdzYCl9fX1uW3NdPWM+PjgmMjU1O25bcysxXT0yNTUmY319cmV0dXJuIHRoaXMuY29tcGlsZVR5cGVkQXJyYXkobil9Y29tcGlsZUVuY29kaW5nKGUpe3JldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGUucmF3KX1jb21waWxlRkRTZWxlY3QoZSl7Y29uc3QgdD1lLmZvcm1hdDtsZXQgcixhO3N3aXRjaCh0KXtjYXNlIDA6cj1uZXcgVWludDhBcnJheSgxK2UuZmRTZWxlY3QubGVuZ3RoKTtyWzBdPXQ7Zm9yKGE9MDthPGUuZmRTZWxlY3QubGVuZ3RoO2ErKylyW2ErMV09ZS5mZFNlbGVjdFthXTticmVhaztjYXNlIDM6Y29uc3QgaT0wO2xldCBuPWUuZmRTZWxlY3RbMF07Y29uc3Qgcz1bdCwwLDAsaT4+OCYyNTUsMjU1Jmksbl07Zm9yKGE9MTthPGUuZmRTZWxlY3QubGVuZ3RoO2ErKyl7Y29uc3QgdD1lLmZkU2VsZWN0W2FdO2lmKHQhPT1uKXtzLnB1c2goYT4+OCYyNTUsMjU1JmEsdCk7bj10fX1jb25zdCBvPShzLmxlbmd0aC0zKS8zO3NbMV09bz4+OCYyNTU7c1syXT0yNTUmbztzLnB1c2goYT4+OCYyNTUsMjU1JmEpO3I9bmV3IFVpbnQ4QXJyYXkocyl9cmV0dXJuIHRoaXMuY29tcGlsZVR5cGVkQXJyYXkocil9Y29tcGlsZVR5cGVkQXJyYXkoZSl7Zm9yKHZhciB0PVtdLHI9MCxhPWUubGVuZ3RoO3I8YTsrK3IpdFtyXT1lW3JdO3JldHVybiB0fWNvbXBpbGVJbmRleChlLHQ9W10pe3ZhciByPWUub2JqZWN0cyxhPXIubGVuZ3RoO2lmKDA9PT1hKXJldHVyblswLDAsMF07dmFyIGksbixzPVthPj44JjI1NSwyNTUmYV0sbz0xO2ZvcihpPTA7aTxhOysraSlvKz1yW2ldLmxlbmd0aDtuPW88MjU2PzE6bzw2NTUzNj8yOm88MTY3NzcyMTY/Mzo0O3MucHVzaChuKTt2YXIgYz0xO2ZvcihpPTA7aTxhKzE7aSsrKXsxPT09bj9zLnB1c2goMjU1JmMpOjI9PT1uP3MucHVzaChjPj44JjI1NSwyNTUmYyk6Mz09PW4/cy5wdXNoKGM+PjE2JjI1NSxjPj44JjI1NSwyNTUmYyk6cy5wdXNoKGM+Pj4yNCYyNTUsYz4+MTYmMjU1LGM+PjgmMjU1LDI1NSZjKTtyW2ldJiYoYys9cltpXS5sZW5ndGgpfWZvcihpPTA7aTxhO2krKyl7dFtpXSYmdFtpXS5vZmZzZXQocy5sZW5ndGgpO2Zvcih2YXIgbD0wLGg9cltpXS5sZW5ndGg7bDxoO2wrKylzLnB1c2gocltpXVtsXSl9cmV0dXJuIHN9fXQuQ0ZGQ29tcGlsZXI9Q0ZGQ29tcGlsZXJ9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuRXhwZXJ0U3Vic2V0Q2hhcnNldD10LkV4cGVydENoYXJzZXQ9dC5JU09BZG9iZUNoYXJzZXQ9dm9pZCAwO3QuSVNPQWRvYmVDaGFyc2V0PVsiLm5vdGRlZiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3RlcmlnaHQiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsInF1b3RlbGVmdCIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCJleGNsYW1kb3duIiwiY2VudCIsInN0ZXJsaW5nIiwiZnJhY3Rpb24iLCJ5ZW4iLCJmbG9yaW4iLCJzZWN0aW9uIiwiY3VycmVuY3kiLCJxdW90ZXNpbmdsZSIsInF1b3RlZGJsbGVmdCIsImd1aWxsZW1vdGxlZnQiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZW5kYXNoIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJwYXJhZ3JhcGgiLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInF1b3RlZGJscmlnaHQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwicGVydGhvdXNhbmQiLCJxdWVzdGlvbmRvd24iLCJncmF2ZSIsImFjdXRlIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJkaWVyZXNpcyIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iLCJlbWRhc2giLCJBRSIsIm9yZGZlbWluaW5lIiwiTHNsYXNoIiwiT3NsYXNoIiwiT0UiLCJvcmRtYXNjdWxpbmUiLCJhZSIsImRvdGxlc3NpIiwibHNsYXNoIiwib3NsYXNoIiwib2UiLCJnZXJtYW5kYmxzIiwib25lc3VwZXJpb3IiLCJsb2dpY2Fsbm90IiwibXUiLCJ0cmFkZW1hcmsiLCJFdGgiLCJvbmVoYWxmIiwicGx1c21pbnVzIiwiVGhvcm4iLCJvbmVxdWFydGVyIiwiZGl2aWRlIiwiYnJva2VuYmFyIiwiZGVncmVlIiwidGhvcm4iLCJ0aHJlZXF1YXJ0ZXJzIiwidHdvc3VwZXJpb3IiLCJyZWdpc3RlcmVkIiwibWludXMiLCJldGgiLCJtdWx0aXBseSIsInRocmVlc3VwZXJpb3IiLCJjb3B5cmlnaHQiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkFkaWVyZXNpcyIsIkFncmF2ZSIsIkFyaW5nIiwiQXRpbGRlIiwiQ2NlZGlsbGEiLCJFYWN1dGUiLCJFY2lyY3VtZmxleCIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiTnRpbGRlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJPZGllcmVzaXMiLCJPZ3JhdmUiLCJPdGlsZGUiLCJTY2Fyb24iLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVkaWVyZXNpcyIsIlVncmF2ZSIsIllhY3V0ZSIsIllkaWVyZXNpcyIsIlpjYXJvbiIsImFhY3V0ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYWdyYXZlIiwiYXJpbmciLCJhdGlsZGUiLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiZWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJpZ3JhdmUiLCJudGlsZGUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm9ncmF2ZSIsIm90aWxkZSIsInNjYXJvbiIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwidWdyYXZlIiwieWFjdXRlIiwieWRpZXJlc2lzIiwiemNhcm9uIl07dC5FeHBlcnRDaGFyc2V0PVsiLm5vdGRlZiIsInNwYWNlIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwicXVlc3Rpb25zbWFsbCIsImFzdXBlcmlvciIsImJzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsImRzdXBlcmlvciIsImVzdXBlcmlvciIsImlzdXBlcmlvciIsImxzdXBlcmlvciIsIm1zdXBlcmlvciIsIm5zdXBlcmlvciIsIm9zdXBlcmlvciIsInJzdXBlcmlvciIsInNzdXBlcmlvciIsInRzdXBlcmlvciIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwicGFyZW5yaWdodGluZmVyaW9yIiwiQ2lyY3VtZmxleHNtYWxsIiwiaHlwaGVuc3VwZXJpb3IiLCJHcmF2ZXNtYWxsIiwiQXNtYWxsIiwiQnNtYWxsIiwiQ3NtYWxsIiwiRHNtYWxsIiwiRXNtYWxsIiwiRnNtYWxsIiwiR3NtYWxsIiwiSHNtYWxsIiwiSXNtYWxsIiwiSnNtYWxsIiwiS3NtYWxsIiwiTHNtYWxsIiwiTXNtYWxsIiwiTnNtYWxsIiwiT3NtYWxsIiwiUHNtYWxsIiwiUXNtYWxsIiwiUnNtYWxsIiwiU3NtYWxsIiwiVHNtYWxsIiwiVXNtYWxsIiwiVnNtYWxsIiwiV3NtYWxsIiwiWHNtYWxsIiwiWXNtYWxsIiwiWnNtYWxsIiwiY29sb25tb25ldGFyeSIsIm9uZWZpdHRlZCIsInJ1cGlhaCIsIlRpbGRlc21hbGwiLCJleGNsYW1kb3duc21hbGwiLCJjZW50b2xkc3R5bGUiLCJMc2xhc2hzbWFsbCIsIlNjYXJvbnNtYWxsIiwiWmNhcm9uc21hbGwiLCJEaWVyZXNpc3NtYWxsIiwiQnJldmVzbWFsbCIsIkNhcm9uc21hbGwiLCJEb3RhY2NlbnRzbWFsbCIsIk1hY3JvbnNtYWxsIiwiZmlndXJlZGFzaCIsImh5cGhlbmluZmVyaW9yIiwiT2dvbmVrc21hbGwiLCJSaW5nc21hbGwiLCJDZWRpbGxhc21hbGwiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJxdWVzdGlvbmRvd25zbWFsbCIsIm9uZWVpZ2h0aCIsInRocmVlZWlnaHRocyIsImZpdmVlaWdodGhzIiwic2V2ZW5laWdodGhzIiwib25ldGhpcmQiLCJ0d290aGlyZHMiLCJ6ZXJvc3VwZXJpb3IiLCJvbmVzdXBlcmlvciIsInR3b3N1cGVyaW9yIiwidGhyZWVzdXBlcmlvciIsImZvdXJzdXBlcmlvciIsImZpdmVzdXBlcmlvciIsInNpeHN1cGVyaW9yIiwic2V2ZW5zdXBlcmlvciIsImVpZ2h0c3VwZXJpb3IiLCJuaW5lc3VwZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJvbmVpbmZlcmlvciIsInR3b2luZmVyaW9yIiwidGhyZWVpbmZlcmlvciIsImZvdXJpbmZlcmlvciIsImZpdmVpbmZlcmlvciIsInNpeGluZmVyaW9yIiwic2V2ZW5pbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJuaW5laW5mZXJpb3IiLCJjZW50aW5mZXJpb3IiLCJkb2xsYXJpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiY29tbWFpbmZlcmlvciIsIkFncmF2ZXNtYWxsIiwiQWFjdXRlc21hbGwiLCJBY2lyY3VtZmxleHNtYWxsIiwiQXRpbGRlc21hbGwiLCJBZGllcmVzaXNzbWFsbCIsIkFyaW5nc21hbGwiLCJBRXNtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVncmF2ZXNtYWxsIiwiRWFjdXRlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJZ3JhdmVzbWFsbCIsIklhY3V0ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiRXRoc21hbGwiLCJOdGlsZGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2FjdXRlc21hbGwiLCJPY2lyY3VtZmxleHNtYWxsIiwiT3RpbGRlc21hbGwiLCJPZGllcmVzaXNzbWFsbCIsIk9Fc21hbGwiLCJPc2xhc2hzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWFjdXRlc21hbGwiLCJVY2lyY3VtZmxleHNtYWxsIiwiVWRpZXJlc2lzc21hbGwiLCJZYWN1dGVzbWFsbCIsIlRob3Juc21hbGwiLCJZZGllcmVzaXNzbWFsbCJdO3QuRXhwZXJ0U3Vic2V0Q2hhcnNldD1bIi5ub3RkZWYiLCJzcGFjZSIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwiYXN1cGVyaW9yIiwiYnN1cGVyaW9yIiwiY2VudHN1cGVyaW9yIiwiZHN1cGVyaW9yIiwiZXN1cGVyaW9yIiwiaXN1cGVyaW9yIiwibHN1cGVyaW9yIiwibXN1cGVyaW9yIiwibnN1cGVyaW9yIiwib3N1cGVyaW9yIiwicnN1cGVyaW9yIiwic3N1cGVyaW9yIiwidHN1cGVyaW9yIiwiZmYiLCJmaSIsImZsIiwiZmZpIiwiZmZsIiwicGFyZW5sZWZ0aW5mZXJpb3IiLCJwYXJlbnJpZ2h0aW5mZXJpb3IiLCJoeXBoZW5zdXBlcmlvciIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJjZW50b2xkc3R5bGUiLCJmaWd1cmVkYXNoIiwiaHlwaGVuaW5mZXJpb3IiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiXX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5nZXRFbmNvZGluZz1mdW5jdGlvbiBnZXRFbmNvZGluZyhlKXtzd2l0Y2goZSl7Y2FzZSJXaW5BbnNpRW5jb2RpbmciOnJldHVybiBvO2Nhc2UiU3RhbmRhcmRFbmNvZGluZyI6cmV0dXJuIHM7Y2FzZSJNYWNSb21hbkVuY29kaW5nIjpyZXR1cm4gbjtjYXNlIlN5bWJvbFNldEVuY29kaW5nIjpyZXR1cm4gYztjYXNlIlphcGZEaW5nYmF0c0VuY29kaW5nIjpyZXR1cm4gbDtjYXNlIkV4cGVydEVuY29kaW5nIjpyZXR1cm4gYTtjYXNlIk1hY0V4cGVydEVuY29kaW5nIjpyZXR1cm4gaTtkZWZhdWx0OnJldHVybiBudWxsfX07dC5FeHBlcnRFbmNvZGluZz10LlphcGZEaW5nYmF0c0VuY29kaW5nPXQuU3ltYm9sU2V0RW5jb2Rpbmc9dC5NYWNSb21hbkVuY29kaW5nPXQuU3RhbmRhcmRFbmNvZGluZz10LldpbkFuc2lFbmNvZGluZz12b2lkIDA7Y29uc3QgYT1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsIiIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwicXVlc3Rpb25zbWFsbCIsIiIsImFzdXBlcmlvciIsImJzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsImRzdXBlcmlvciIsImVzdXBlcmlvciIsIiIsIiIsIiIsImlzdXBlcmlvciIsIiIsIiIsImxzdXBlcmlvciIsIm1zdXBlcmlvciIsIm5zdXBlcmlvciIsIm9zdXBlcmlvciIsIiIsIiIsInJzdXBlcmlvciIsInNzdXBlcmlvciIsInRzdXBlcmlvciIsIiIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwiIiwicGFyZW5yaWdodGluZmVyaW9yIiwiQ2lyY3VtZmxleHNtYWxsIiwiaHlwaGVuc3VwZXJpb3IiLCJHcmF2ZXNtYWxsIiwiQXNtYWxsIiwiQnNtYWxsIiwiQ3NtYWxsIiwiRHNtYWxsIiwiRXNtYWxsIiwiRnNtYWxsIiwiR3NtYWxsIiwiSHNtYWxsIiwiSXNtYWxsIiwiSnNtYWxsIiwiS3NtYWxsIiwiTHNtYWxsIiwiTXNtYWxsIiwiTnNtYWxsIiwiT3NtYWxsIiwiUHNtYWxsIiwiUXNtYWxsIiwiUnNtYWxsIiwiU3NtYWxsIiwiVHNtYWxsIiwiVXNtYWxsIiwiVnNtYWxsIiwiV3NtYWxsIiwiWHNtYWxsIiwiWXNtYWxsIiwiWnNtYWxsIiwiY29sb25tb25ldGFyeSIsIm9uZWZpdHRlZCIsInJ1cGlhaCIsIlRpbGRlc21hbGwiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJleGNsYW1kb3duc21hbGwiLCJjZW50b2xkc3R5bGUiLCJMc2xhc2hzbWFsbCIsIiIsIiIsIlNjYXJvbnNtYWxsIiwiWmNhcm9uc21hbGwiLCJEaWVyZXNpc3NtYWxsIiwiQnJldmVzbWFsbCIsIkNhcm9uc21hbGwiLCIiLCJEb3RhY2NlbnRzbWFsbCIsIiIsIiIsIk1hY3JvbnNtYWxsIiwiIiwiIiwiZmlndXJlZGFzaCIsImh5cGhlbmluZmVyaW9yIiwiIiwiIiwiT2dvbmVrc21hbGwiLCJSaW5nc21hbGwiLCJDZWRpbGxhc21hbGwiLCIiLCIiLCIiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJxdWVzdGlvbmRvd25zbWFsbCIsIm9uZWVpZ2h0aCIsInRocmVlZWlnaHRocyIsImZpdmVlaWdodGhzIiwic2V2ZW5laWdodGhzIiwib25ldGhpcmQiLCJ0d290aGlyZHMiLCIiLCIiLCJ6ZXJvc3VwZXJpb3IiLCJvbmVzdXBlcmlvciIsInR3b3N1cGVyaW9yIiwidGhyZWVzdXBlcmlvciIsImZvdXJzdXBlcmlvciIsImZpdmVzdXBlcmlvciIsInNpeHN1cGVyaW9yIiwic2V2ZW5zdXBlcmlvciIsImVpZ2h0c3VwZXJpb3IiLCJuaW5lc3VwZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJvbmVpbmZlcmlvciIsInR3b2luZmVyaW9yIiwidGhyZWVpbmZlcmlvciIsImZvdXJpbmZlcmlvciIsImZpdmVpbmZlcmlvciIsInNpeGluZmVyaW9yIiwic2V2ZW5pbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJuaW5laW5mZXJpb3IiLCJjZW50aW5mZXJpb3IiLCJkb2xsYXJpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiY29tbWFpbmZlcmlvciIsIkFncmF2ZXNtYWxsIiwiQWFjdXRlc21hbGwiLCJBY2lyY3VtZmxleHNtYWxsIiwiQXRpbGRlc21hbGwiLCJBZGllcmVzaXNzbWFsbCIsIkFyaW5nc21hbGwiLCJBRXNtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVncmF2ZXNtYWxsIiwiRWFjdXRlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJZ3JhdmVzbWFsbCIsIklhY3V0ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiRXRoc21hbGwiLCJOdGlsZGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2FjdXRlc21hbGwiLCJPY2lyY3VtZmxleHNtYWxsIiwiT3RpbGRlc21hbGwiLCJPZGllcmVzaXNzbWFsbCIsIk9Fc21hbGwiLCJPc2xhc2hzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWFjdXRlc21hbGwiLCJVY2lyY3VtZmxleHNtYWxsIiwiVWRpZXJlc2lzc21hbGwiLCJZYWN1dGVzbWFsbCIsIlRob3Juc21hbGwiLCJZZGllcmVzaXNzbWFsbCJdO3QuRXhwZXJ0RW5jb2Rpbmc9YTtjb25zdCBpPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW1zbWFsbCIsIkh1bmdhcnVtbGF1dHNtYWxsIiwiY2VudG9sZHN0eWxlIiwiZG9sbGFyb2xkc3R5bGUiLCJkb2xsYXJzdXBlcmlvciIsImFtcGVyc2FuZHNtYWxsIiwiQWN1dGVzbWFsbCIsInBhcmVubGVmdHN1cGVyaW9yIiwicGFyZW5yaWdodHN1cGVyaW9yIiwidHdvZG90ZW5sZWFkZXIiLCJvbmVkb3RlbmxlYWRlciIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwiZnJhY3Rpb24iLCJ6ZXJvb2xkc3R5bGUiLCJvbmVvbGRzdHlsZSIsInR3b29sZHN0eWxlIiwidGhyZWVvbGRzdHlsZSIsImZvdXJvbGRzdHlsZSIsImZpdmVvbGRzdHlsZSIsInNpeG9sZHN0eWxlIiwic2V2ZW5vbGRzdHlsZSIsImVpZ2h0b2xkc3R5bGUiLCJuaW5lb2xkc3R5bGUiLCJjb2xvbiIsInNlbWljb2xvbiIsIiIsInRocmVlcXVhcnRlcnNlbWRhc2giLCIiLCJxdWVzdGlvbnNtYWxsIiwiIiwiIiwiIiwiIiwiRXRoc21hbGwiLCIiLCIiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiIiwiIiwiIiwiIiwiIiwiIiwiZmYiLCJmaSIsImZsIiwiZmZpIiwiZmZsIiwicGFyZW5sZWZ0aW5mZXJpb3IiLCIiLCJwYXJlbnJpZ2h0aW5mZXJpb3IiLCJDaXJjdW1mbGV4c21hbGwiLCJoeXBoZW5pbmZlcmlvciIsIkdyYXZlc21hbGwiLCJBc21hbGwiLCJCc21hbGwiLCJDc21hbGwiLCJEc21hbGwiLCJFc21hbGwiLCJGc21hbGwiLCJHc21hbGwiLCJIc21hbGwiLCJJc21hbGwiLCJKc21hbGwiLCJLc21hbGwiLCJMc21hbGwiLCJNc21hbGwiLCJOc21hbGwiLCJPc21hbGwiLCJQc21hbGwiLCJRc21hbGwiLCJSc21hbGwiLCJTc21hbGwiLCJUc21hbGwiLCJVc21hbGwiLCJWc21hbGwiLCJXc21hbGwiLCJYc21hbGwiLCJZc21hbGwiLCJac21hbGwiLCJjb2xvbm1vbmV0YXJ5Iiwib25lZml0dGVkIiwicnVwaWFoIiwiVGlsZGVzbWFsbCIsIiIsIiIsImFzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsIiIsIiIsIiIsIiIsIkFhY3V0ZXNtYWxsIiwiQWdyYXZlc21hbGwiLCJBY2lyY3VtZmxleHNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBdGlsZGVzbWFsbCIsIkFyaW5nc21hbGwiLCJDY2VkaWxsYXNtYWxsIiwiRWFjdXRlc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVjaXJjdW1mbGV4c21hbGwiLCJFZGllcmVzaXNzbWFsbCIsIklhY3V0ZXNtYWxsIiwiSWdyYXZlc21hbGwiLCJJY2lyY3VtZmxleHNtYWxsIiwiSWRpZXJlc2lzc21hbGwiLCJOdGlsZGVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2dyYXZlc21hbGwiLCJPY2lyY3VtZmxleHNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPdGlsZGVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWdyYXZlc21hbGwiLCJVY2lyY3VtZmxleHNtYWxsIiwiVWRpZXJlc2lzc21hbGwiLCIiLCJlaWdodHN1cGVyaW9yIiwiZm91cmluZmVyaW9yIiwidGhyZWVpbmZlcmlvciIsInNpeGluZmVyaW9yIiwiZWlnaHRpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJTY2Fyb25zbWFsbCIsIiIsImNlbnRpbmZlcmlvciIsInR3b2luZmVyaW9yIiwiIiwiRGllcmVzaXNzbWFsbCIsIiIsIkNhcm9uc21hbGwiLCJvc3VwZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCIiLCJjb21tYWluZmVyaW9yIiwicGVyaW9kaW5mZXJpb3IiLCJZYWN1dGVzbWFsbCIsIiIsImRvbGxhcmluZmVyaW9yIiwiIiwiIiwiVGhvcm5zbWFsbCIsIiIsIm5pbmVpbmZlcmlvciIsInplcm9pbmZlcmlvciIsIlpjYXJvbnNtYWxsIiwiQUVzbWFsbCIsIk9zbGFzaHNtYWxsIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVpbmZlcmlvciIsIkxzbGFzaHNtYWxsIiwiIiwiIiwiIiwiIiwiIiwiIiwiQ2VkaWxsYXNtYWxsIiwiIiwiIiwiIiwiIiwiIiwiT0VzbWFsbCIsImZpZ3VyZWRhc2giLCJoeXBoZW5zdXBlcmlvciIsIiIsIiIsIiIsIiIsImV4Y2xhbWRvd25zbWFsbCIsIiIsIllkaWVyZXNpc3NtYWxsIiwiIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJuaW5lc3VwZXJpb3IiLCJ6ZXJvc3VwZXJpb3IiLCIiLCJlc3VwZXJpb3IiLCJyc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCIiLCIiLCJpc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJkc3VwZXJpb3IiLCIiLCIiLCIiLCIiLCIiLCJsc3VwZXJpb3IiLCJPZ29uZWtzbWFsbCIsIkJyZXZlc21hbGwiLCJNYWNyb25zbWFsbCIsImJzdXBlcmlvciIsIm5zdXBlcmlvciIsIm1zdXBlcmlvciIsImNvbW1hc3VwZXJpb3IiLCJwZXJpb2RzdXBlcmlvciIsIkRvdGFjY2VudHNtYWxsIiwiUmluZ3NtYWxsIiwiIiwiIiwiIiwiIl0sbj1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3Rlc2luZ2xlIiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJncmF2ZSIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCIiLCJBZGllcmVzaXMiLCJBcmluZyIsIkNjZWRpbGxhIiwiRWFjdXRlIiwiTnRpbGRlIiwiT2RpZXJlc2lzIiwiVWRpZXJlc2lzIiwiYWFjdXRlIiwiYWdyYXZlIiwiYWNpcmN1bWZsZXgiLCJhZGllcmVzaXMiLCJhdGlsZGUiLCJhcmluZyIsImNjZWRpbGxhIiwiZWFjdXRlIiwiZWdyYXZlIiwiZWNpcmN1bWZsZXgiLCJlZGllcmVzaXMiLCJpYWN1dGUiLCJpZ3JhdmUiLCJpY2lyY3VtZmxleCIsImlkaWVyZXNpcyIsIm50aWxkZSIsIm9hY3V0ZSIsIm9ncmF2ZSIsIm9jaXJjdW1mbGV4Iiwib2RpZXJlc2lzIiwib3RpbGRlIiwidWFjdXRlIiwidWdyYXZlIiwidWNpcmN1bWZsZXgiLCJ1ZGllcmVzaXMiLCJkYWdnZXIiLCJkZWdyZWUiLCJjZW50Iiwic3RlcmxpbmciLCJzZWN0aW9uIiwiYnVsbGV0IiwicGFyYWdyYXBoIiwiZ2VybWFuZGJscyIsInJlZ2lzdGVyZWQiLCJjb3B5cmlnaHQiLCJ0cmFkZW1hcmsiLCJhY3V0ZSIsImRpZXJlc2lzIiwibm90ZXF1YWwiLCJBRSIsIk9zbGFzaCIsImluZmluaXR5IiwicGx1c21pbnVzIiwibGVzc2VxdWFsIiwiZ3JlYXRlcmVxdWFsIiwieWVuIiwibXUiLCJwYXJ0aWFsZGlmZiIsInN1bW1hdGlvbiIsInByb2R1Y3QiLCJwaSIsImludGVncmFsIiwib3JkZmVtaW5pbmUiLCJvcmRtYXNjdWxpbmUiLCJPbWVnYSIsImFlIiwib3NsYXNoIiwicXVlc3Rpb25kb3duIiwiZXhjbGFtZG93biIsImxvZ2ljYWxub3QiLCJyYWRpY2FsIiwiZmxvcmluIiwiYXBwcm94ZXF1YWwiLCJEZWx0YSIsImd1aWxsZW1vdGxlZnQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwic3BhY2UiLCJBZ3JhdmUiLCJBdGlsZGUiLCJPdGlsZGUiLCJPRSIsIm9lIiwiZW5kYXNoIiwiZW1kYXNoIiwicXVvdGVkYmxsZWZ0IiwicXVvdGVkYmxyaWdodCIsInF1b3RlbGVmdCIsInF1b3RlcmlnaHQiLCJkaXZpZGUiLCJsb3plbmdlIiwieWRpZXJlc2lzIiwiWWRpZXJlc2lzIiwiZnJhY3Rpb24iLCJjdXJyZW5jeSIsImd1aWxzaW5nbGxlZnQiLCJndWlsc2luZ2xyaWdodCIsImZpIiwiZmwiLCJkYWdnZXJkYmwiLCJwZXJpb2RjZW50ZXJlZCIsInF1b3Rlc2luZ2xiYXNlIiwicXVvdGVkYmxiYXNlIiwicGVydGhvdXNhbmQiLCJBY2lyY3VtZmxleCIsIkVjaXJjdW1mbGV4IiwiQWFjdXRlIiwiRWRpZXJlc2lzIiwiRWdyYXZlIiwiSWFjdXRlIiwiSWNpcmN1bWZsZXgiLCJJZGllcmVzaXMiLCJJZ3JhdmUiLCJPYWN1dGUiLCJPY2lyY3VtZmxleCIsImFwcGxlIiwiT2dyYXZlIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZ3JhdmUiLCJkb3RsZXNzaSIsImNpcmN1bWZsZXgiLCJ0aWxkZSIsIm1hY3JvbiIsImJyZXZlIiwiZG90YWNjZW50IiwicmluZyIsImNlZGlsbGEiLCJodW5nYXJ1bWxhdXQiLCJvZ29uZWsiLCJjYXJvbiJdO3QuTWFjUm9tYW5FbmNvZGluZz1uO2NvbnN0IHM9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXJpZ2h0IiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJxdW90ZWxlZnQiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiZXhjbGFtZG93biIsImNlbnQiLCJzdGVybGluZyIsImZyYWN0aW9uIiwieWVuIiwiZmxvcmluIiwic2VjdGlvbiIsImN1cnJlbmN5IiwicXVvdGVzaW5nbGUiLCJxdW90ZWRibGxlZnQiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsIiIsImVuZGFzaCIsImRhZ2dlciIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwiIiwicGFyYWdyYXBoIiwiYnVsbGV0IiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJxdW90ZWRibHJpZ2h0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsInBlcnRob3VzYW5kIiwiIiwicXVlc3Rpb25kb3duIiwiIiwiZ3JhdmUiLCJhY3V0ZSIsImNpcmN1bWZsZXgiLCJ0aWxkZSIsIm1hY3JvbiIsImJyZXZlIiwiZG90YWNjZW50IiwiZGllcmVzaXMiLCIiLCJyaW5nIiwiY2VkaWxsYSIsIiIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIiwiZW1kYXNoIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiQUUiLCIiLCJvcmRmZW1pbmluZSIsIiIsIiIsIiIsIiIsIkxzbGFzaCIsIk9zbGFzaCIsIk9FIiwib3JkbWFzY3VsaW5lIiwiIiwiIiwiIiwiIiwiIiwiYWUiLCIiLCIiLCIiLCJkb3RsZXNzaSIsIiIsIiIsImxzbGFzaCIsIm9zbGFzaCIsIm9lIiwiZ2VybWFuZGJscyIsIiIsIiIsIiIsIiJdO3QuU3RhbmRhcmRFbmNvZGluZz1zO2NvbnN0IG89WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXNpbmdsZSIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwiZ3JhdmUiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiYnVsbGV0IiwiRXVybyIsImJ1bGxldCIsInF1b3Rlc2luZ2xiYXNlIiwiZmxvcmluIiwicXVvdGVkYmxiYXNlIiwiZWxsaXBzaXMiLCJkYWdnZXIiLCJkYWdnZXJkYmwiLCJjaXJjdW1mbGV4IiwicGVydGhvdXNhbmQiLCJTY2Fyb24iLCJndWlsc2luZ2xsZWZ0IiwiT0UiLCJidWxsZXQiLCJaY2Fyb24iLCJidWxsZXQiLCJidWxsZXQiLCJxdW90ZWxlZnQiLCJxdW90ZXJpZ2h0IiwicXVvdGVkYmxsZWZ0IiwicXVvdGVkYmxyaWdodCIsImJ1bGxldCIsImVuZGFzaCIsImVtZGFzaCIsInRpbGRlIiwidHJhZGVtYXJrIiwic2Nhcm9uIiwiZ3VpbHNpbmdscmlnaHQiLCJvZSIsImJ1bGxldCIsInpjYXJvbiIsIllkaWVyZXNpcyIsInNwYWNlIiwiZXhjbGFtZG93biIsImNlbnQiLCJzdGVybGluZyIsImN1cnJlbmN5IiwieWVuIiwiYnJva2VuYmFyIiwic2VjdGlvbiIsImRpZXJlc2lzIiwiY29weXJpZ2h0Iiwib3JkZmVtaW5pbmUiLCJndWlsbGVtb3RsZWZ0IiwibG9naWNhbG5vdCIsImh5cGhlbiIsInJlZ2lzdGVyZWQiLCJtYWNyb24iLCJkZWdyZWUiLCJwbHVzbWludXMiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJhY3V0ZSIsIm11IiwicGFyYWdyYXBoIiwicGVyaW9kY2VudGVyZWQiLCJjZWRpbGxhIiwib25lc3VwZXJpb3IiLCJvcmRtYXNjdWxpbmUiLCJndWlsbGVtb3RyaWdodCIsIm9uZXF1YXJ0ZXIiLCJvbmVoYWxmIiwidGhyZWVxdWFydGVycyIsInF1ZXN0aW9uZG93biIsIkFncmF2ZSIsIkFhY3V0ZSIsIkFjaXJjdW1mbGV4IiwiQXRpbGRlIiwiQWRpZXJlc2lzIiwiQXJpbmciLCJBRSIsIkNjZWRpbGxhIiwiRWdyYXZlIiwiRWFjdXRlIiwiRWNpcmN1bWZsZXgiLCJFZGllcmVzaXMiLCJJZ3JhdmUiLCJJYWN1dGUiLCJJY2lyY3VtZmxleCIsIklkaWVyZXNpcyIsIkV0aCIsIk50aWxkZSIsIk9ncmF2ZSIsIk9hY3V0ZSIsIk9jaXJjdW1mbGV4IiwiT3RpbGRlIiwiT2RpZXJlc2lzIiwibXVsdGlwbHkiLCJPc2xhc2giLCJVZ3JhdmUiLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVkaWVyZXNpcyIsIllhY3V0ZSIsIlRob3JuIiwiZ2VybWFuZGJscyIsImFncmF2ZSIsImFhY3V0ZSIsImFjaXJjdW1mbGV4IiwiYXRpbGRlIiwiYWRpZXJlc2lzIiwiYXJpbmciLCJhZSIsImNjZWRpbGxhIiwiZWdyYXZlIiwiZWFjdXRlIiwiZWNpcmN1bWZsZXgiLCJlZGllcmVzaXMiLCJpZ3JhdmUiLCJpYWN1dGUiLCJpY2lyY3VtZmxleCIsImlkaWVyZXNpcyIsImV0aCIsIm50aWxkZSIsIm9ncmF2ZSIsIm9hY3V0ZSIsIm9jaXJjdW1mbGV4Iiwib3RpbGRlIiwib2RpZXJlc2lzIiwiZGl2aWRlIiwib3NsYXNoIiwidWdyYXZlIiwidWFjdXRlIiwidWNpcmN1bWZsZXgiLCJ1ZGllcmVzaXMiLCJ5YWN1dGUiLCJ0aG9ybiIsInlkaWVyZXNpcyJdO3QuV2luQW5zaUVuY29kaW5nPW87Y29uc3QgYz1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiZXhjbGFtIiwidW5pdmVyc2FsIiwibnVtYmVyc2lnbiIsImV4aXN0ZW50aWFsIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInN1Y2h0aGF0IiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrbWF0aCIsInBsdXMiLCJjb21tYSIsIm1pbnVzIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJjb25ncnVlbnQiLCJBbHBoYSIsIkJldGEiLCJDaGkiLCJEZWx0YSIsIkVwc2lsb24iLCJQaGkiLCJHYW1tYSIsIkV0YSIsIklvdGEiLCJ0aGV0YTEiLCJLYXBwYSIsIkxhbWJkYSIsIk11IiwiTnUiLCJPbWljcm9uIiwiUGkiLCJUaGV0YSIsIlJobyIsIlNpZ21hIiwiVGF1IiwiVXBzaWxvbiIsInNpZ21hMSIsIk9tZWdhIiwiWGkiLCJQc2kiLCJaZXRhIiwiYnJhY2tldGxlZnQiLCJ0aGVyZWZvcmUiLCJicmFja2V0cmlnaHQiLCJwZXJwZW5kaWN1bGFyIiwidW5kZXJzY29yZSIsInJhZGljYWxleCIsImFscGhhIiwiYmV0YSIsImNoaSIsImRlbHRhIiwiZXBzaWxvbiIsInBoaSIsImdhbW1hIiwiZXRhIiwiaW90YSIsInBoaTEiLCJrYXBwYSIsImxhbWJkYSIsIm11IiwibnUiLCJvbWljcm9uIiwicGkiLCJ0aGV0YSIsInJobyIsInNpZ21hIiwidGF1IiwidXBzaWxvbiIsIm9tZWdhMSIsIm9tZWdhIiwieGkiLCJwc2kiLCJ6ZXRhIiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsInNpbWlsYXIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJFdXJvIiwiVXBzaWxvbjEiLCJtaW51dGUiLCJsZXNzZXF1YWwiLCJmcmFjdGlvbiIsImluZmluaXR5IiwiZmxvcmluIiwiY2x1YiIsImRpYW1vbmQiLCJoZWFydCIsInNwYWRlIiwiYXJyb3dib3RoIiwiYXJyb3dsZWZ0IiwiYXJyb3d1cCIsImFycm93cmlnaHQiLCJhcnJvd2Rvd24iLCJkZWdyZWUiLCJwbHVzbWludXMiLCJzZWNvbmQiLCJncmVhdGVyZXF1YWwiLCJtdWx0aXBseSIsInByb3BvcnRpb25hbCIsInBhcnRpYWxkaWZmIiwiYnVsbGV0IiwiZGl2aWRlIiwibm90ZXF1YWwiLCJlcXVpdmFsZW5jZSIsImFwcHJveGVxdWFsIiwiZWxsaXBzaXMiLCJhcnJvd3ZlcnRleCIsImFycm93aG9yaXpleCIsImNhcnJpYWdlcmV0dXJuIiwiYWxlcGgiLCJJZnJha3R1ciIsIlJmcmFrdHVyIiwid2VpZXJzdHJhc3MiLCJjaXJjbGVtdWx0aXBseSIsImNpcmNsZXBsdXMiLCJlbXB0eXNldCIsImludGVyc2VjdGlvbiIsInVuaW9uIiwicHJvcGVyc3VwZXJzZXQiLCJyZWZsZXhzdXBlcnNldCIsIm5vdHN1YnNldCIsInByb3BlcnN1YnNldCIsInJlZmxleHN1YnNldCIsImVsZW1lbnQiLCJub3RlbGVtZW50IiwiYW5nbGUiLCJncmFkaWVudCIsInJlZ2lzdGVyc2VyaWYiLCJjb3B5cmlnaHRzZXJpZiIsInRyYWRlbWFya3NlcmlmIiwicHJvZHVjdCIsInJhZGljYWwiLCJkb3RtYXRoIiwibG9naWNhbG5vdCIsImxvZ2ljYWxhbmQiLCJsb2dpY2Fsb3IiLCJhcnJvd2RibGJvdGgiLCJhcnJvd2RibGxlZnQiLCJhcnJvd2RibHVwIiwiYXJyb3dkYmxyaWdodCIsImFycm93ZGJsZG93biIsImxvemVuZ2UiLCJhbmdsZWxlZnQiLCJyZWdpc3RlcnNhbnMiLCJjb3B5cmlnaHRzYW5zIiwidHJhZGVtYXJrc2FucyIsInN1bW1hdGlvbiIsInBhcmVubGVmdHRwIiwicGFyZW5sZWZ0ZXgiLCJwYXJlbmxlZnRidCIsImJyYWNrZXRsZWZ0dHAiLCJicmFja2V0bGVmdGV4IiwiYnJhY2tldGxlZnRidCIsImJyYWNlbGVmdHRwIiwiYnJhY2VsZWZ0bWlkIiwiYnJhY2VsZWZ0YnQiLCJicmFjZWV4IiwiIiwiYW5nbGVyaWdodCIsImludGVncmFsIiwiaW50ZWdyYWx0cCIsImludGVncmFsZXgiLCJpbnRlZ3JhbGJ0IiwicGFyZW5yaWdodHRwIiwicGFyZW5yaWdodGV4IiwicGFyZW5yaWdodGJ0IiwiYnJhY2tldHJpZ2h0dHAiLCJicmFja2V0cmlnaHRleCIsImJyYWNrZXRyaWdodGJ0IiwiYnJhY2VyaWdodHRwIiwiYnJhY2VyaWdodG1pZCIsImJyYWNlcmlnaHRidCIsIiJdO3QuU3ltYm9sU2V0RW5jb2Rpbmc9Yztjb25zdCBsPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJhMSIsImEyIiwiYTIwMiIsImEzIiwiYTQiLCJhNSIsImExMTkiLCJhMTE4IiwiYTExNyIsImExMSIsImExMiIsImExMyIsImExNCIsImExNSIsImExNiIsImExMDUiLCJhMTciLCJhMTgiLCJhMTkiLCJhMjAiLCJhMjEiLCJhMjIiLCJhMjMiLCJhMjQiLCJhMjUiLCJhMjYiLCJhMjciLCJhMjgiLCJhNiIsImE3IiwiYTgiLCJhOSIsImExMCIsImEyOSIsImEzMCIsImEzMSIsImEzMiIsImEzMyIsImEzNCIsImEzNSIsImEzNiIsImEzNyIsImEzOCIsImEzOSIsImE0MCIsImE0MSIsImE0MiIsImE0MyIsImE0NCIsImE0NSIsImE0NiIsImE0NyIsImE0OCIsImE0OSIsImE1MCIsImE1MSIsImE1MiIsImE1MyIsImE1NCIsImE1NSIsImE1NiIsImE1NyIsImE1OCIsImE1OSIsImE2MCIsImE2MSIsImE2MiIsImE2MyIsImE2NCIsImE2NSIsImE2NiIsImE2NyIsImE2OCIsImE2OSIsImE3MCIsImE3MSIsImE3MiIsImE3MyIsImE3NCIsImEyMDMiLCJhNzUiLCJhMjA0IiwiYTc2IiwiYTc3IiwiYTc4IiwiYTc5IiwiYTgxIiwiYTgyIiwiYTgzIiwiYTg0IiwiYTk3IiwiYTk4IiwiYTk5IiwiYTEwMCIsIiIsImE4OSIsImE5MCIsImE5MyIsImE5NCIsImE5MSIsImE5MiIsImEyMDUiLCJhODUiLCJhMjA2IiwiYTg2IiwiYTg3IiwiYTg4IiwiYTk1IiwiYTk2IiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiYTEwMSIsImExMDIiLCJhMTAzIiwiYTEwNCIsImExMDYiLCJhMTA3IiwiYTEwOCIsImExMTIiLCJhMTExIiwiYTExMCIsImExMDkiLCJhMTIwIiwiYTEyMSIsImExMjIiLCJhMTIzIiwiYTEyNCIsImExMjUiLCJhMTI2IiwiYTEyNyIsImExMjgiLCJhMTI5IiwiYTEzMCIsImExMzEiLCJhMTMyIiwiYTEzMyIsImExMzQiLCJhMTM1IiwiYTEzNiIsImExMzciLCJhMTM4IiwiYTEzOSIsImExNDAiLCJhMTQxIiwiYTE0MiIsImExNDMiLCJhMTQ0IiwiYTE0NSIsImExNDYiLCJhMTQ3IiwiYTE0OCIsImExNDkiLCJhMTUwIiwiYTE1MSIsImExNTIiLCJhMTUzIiwiYTE1NCIsImExNTUiLCJhMTU2IiwiYTE1NyIsImExNTgiLCJhMTU5IiwiYTE2MCIsImExNjEiLCJhMTYzIiwiYTE2NCIsImExOTYiLCJhMTY1IiwiYTE5MiIsImExNjYiLCJhMTY3IiwiYTE2OCIsImExNjkiLCJhMTcwIiwiYTE3MSIsImExNzIiLCJhMTczIiwiYTE2MiIsImExNzQiLCJhMTc1IiwiYTE3NiIsImExNzciLCJhMTc4IiwiYTE3OSIsImExOTMiLCJhMTgwIiwiYTE5OSIsImExODEiLCJhMjAwIiwiYTE4MiIsIiIsImEyMDEiLCJhMTgzIiwiYTE4NCIsImExOTciLCJhMTg1IiwiYTE5NCIsImExOTgiLCJhMTg2IiwiYTE5NSIsImExODciLCJhMTg4IiwiYTE4OSIsImExOTAiLCJhMTkxIiwiIl07dC5aYXBmRGluZ2JhdHNFbmNvZGluZz1sfSxmdW5jdGlvbihlLHQscil7dmFyIGE9cig4KS5nZXRMb29rdXBUYWJsZUZhY3RvcnksaT1hKChmdW5jdGlvbihlKXtlLkE9NjU7ZS5BRT0xOTg7ZS5BRWFjdXRlPTUwODtlLkFFbWFjcm9uPTQ4MjtlLkFFc21hbGw9NjM0NjI7ZS5BYWN1dGU9MTkzO2UuQWFjdXRlc21hbGw9NjM0NTc7ZS5BYnJldmU9MjU4O2UuQWJyZXZlYWN1dGU9Nzg1NDtlLkFicmV2ZWN5cmlsbGljPTEyMzI7ZS5BYnJldmVkb3RiZWxvdz03ODYyO2UuQWJyZXZlZ3JhdmU9Nzg1NjtlLkFicmV2ZWhvb2thYm92ZT03ODU4O2UuQWJyZXZldGlsZGU9Nzg2MDtlLkFjYXJvbj00NjE7ZS5BY2lyY2xlPTkzOTg7ZS5BY2lyY3VtZmxleD0xOTQ7ZS5BY2lyY3VtZmxleGFjdXRlPTc4NDQ7ZS5BY2lyY3VtZmxleGRvdGJlbG93PTc4NTI7ZS5BY2lyY3VtZmxleGdyYXZlPTc4NDY7ZS5BY2lyY3VtZmxleGhvb2thYm92ZT03ODQ4O2UuQWNpcmN1bWZsZXhzbWFsbD02MzQ1ODtlLkFjaXJjdW1mbGV4dGlsZGU9Nzg1MDtlLkFjdXRlPTYzMTc3O2UuQWN1dGVzbWFsbD02MzQxMjtlLkFjeXJpbGxpYz0xMDQwO2UuQWRibGdyYXZlPTUxMjtlLkFkaWVyZXNpcz0xOTY7ZS5BZGllcmVzaXNjeXJpbGxpYz0xMjM0O2UuQWRpZXJlc2lzbWFjcm9uPTQ3ODtlLkFkaWVyZXNpc3NtYWxsPTYzNDYwO2UuQWRvdGJlbG93PTc4NDA7ZS5BZG90bWFjcm9uPTQ4MDtlLkFncmF2ZT0xOTI7ZS5BZ3JhdmVzbWFsbD02MzQ1NjtlLkFob29rYWJvdmU9Nzg0MjtlLkFpZWN5cmlsbGljPTEyMzY7ZS5BaW52ZXJ0ZWRicmV2ZT01MTQ7ZS5BbHBoYT05MTM7ZS5BbHBoYXRvbm9zPTkwMjtlLkFtYWNyb249MjU2O2UuQW1vbm9zcGFjZT02NTMxMztlLkFvZ29uZWs9MjYwO2UuQXJpbmc9MTk3O2UuQXJpbmdhY3V0ZT01MDY7ZS5BcmluZ2JlbG93PTc2ODA7ZS5BcmluZ3NtYWxsPTYzNDYxO2UuQXNtYWxsPTYzMzI5O2UuQXRpbGRlPTE5NTtlLkF0aWxkZXNtYWxsPTYzNDU5O2UuQXliYXJtZW5pYW49MTMyOTtlLkI9NjY7ZS5CY2lyY2xlPTkzOTk7ZS5CZG90YWNjZW50PTc2ODI7ZS5CZG90YmVsb3c9NzY4NDtlLkJlY3lyaWxsaWM9MTA0MTtlLkJlbmFybWVuaWFuPTEzMzA7ZS5CZXRhPTkxNDtlLkJob29rPTM4NTtlLkJsaW5lYmVsb3c9NzY4NjtlLkJtb25vc3BhY2U9NjUzMTQ7ZS5CcmV2ZXNtYWxsPTYzMjIwO2UuQnNtYWxsPTYzMzMwO2UuQnRvcGJhcj0zODY7ZS5DPTY3O2UuQ2Fhcm1lbmlhbj0xMzQyO2UuQ2FjdXRlPTI2MjtlLkNhcm9uPTYzMTc4O2UuQ2Fyb25zbWFsbD02MzIyMTtlLkNjYXJvbj0yNjg7ZS5DY2VkaWxsYT0xOTk7ZS5DY2VkaWxsYWFjdXRlPTc2ODg7ZS5DY2VkaWxsYXNtYWxsPTYzNDYzO2UuQ2NpcmNsZT05NDAwO2UuQ2NpcmN1bWZsZXg9MjY0O2UuQ2RvdD0yNjY7ZS5DZG90YWNjZW50PTI2NjtlLkNlZGlsbGFzbWFsbD02MzQxNjtlLkNoYWFybWVuaWFuPTEzNTM7ZS5DaGVhYmtoYXNpYW5jeXJpbGxpYz0xMjEyO2UuQ2hlY3lyaWxsaWM9MTA2MztlLkNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljPTEyMTQ7ZS5DaGVkZXNjZW5kZXJjeXJpbGxpYz0xMjA2O2UuQ2hlZGllcmVzaXNjeXJpbGxpYz0xMjY4O2UuQ2hlaGFybWVuaWFuPTEzNDc7ZS5DaGVraGFrYXNzaWFuY3lyaWxsaWM9MTIyNztlLkNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTIwODtlLkNoaT05MzU7ZS5DaG9vaz0zOTE7ZS5DaXJjdW1mbGV4c21hbGw9NjMyMjI7ZS5DbW9ub3NwYWNlPTY1MzE1O2UuQ29hcm1lbmlhbj0xMzYxO2UuQ3NtYWxsPTYzMzMxO2UuRD02ODtlLkRaPTQ5NztlLkRaY2Fyb249NDUyO2UuRGFhcm1lbmlhbj0xMzMyO2UuRGFmcmljYW49MzkzO2UuRGNhcm9uPTI3MDtlLkRjZWRpbGxhPTc2OTY7ZS5EY2lyY2xlPTk0MDE7ZS5EY2lyY3VtZmxleGJlbG93PTc2OTg7ZS5EY3JvYXQ9MjcyO2UuRGRvdGFjY2VudD03NjkwO2UuRGRvdGJlbG93PTc2OTI7ZS5EZWN5cmlsbGljPTEwNDQ7ZS5EZWljb3B0aWM9MTAwNjtlLkRlbHRhPTg3MTA7ZS5EZWx0YWdyZWVrPTkxNjtlLkRob29rPTM5NDtlLkRpZXJlc2lzPTYzMTc5O2UuRGllcmVzaXNBY3V0ZT02MzE4MDtlLkRpZXJlc2lzR3JhdmU9NjMxODE7ZS5EaWVyZXNpc3NtYWxsPTYzNDAwO2UuRGlnYW1tYWdyZWVrPTk4ODtlLkRqZWN5cmlsbGljPTEwMjY7ZS5EbGluZWJlbG93PTc2OTQ7ZS5EbW9ub3NwYWNlPTY1MzE2O2UuRG90YWNjZW50c21hbGw9NjMyMjM7ZS5Ec2xhc2g9MjcyO2UuRHNtYWxsPTYzMzMyO2UuRHRvcGJhcj0zOTU7ZS5Eej00OTg7ZS5EemNhcm9uPTQ1MztlLkR6ZWFia2hhc2lhbmN5cmlsbGljPTEyNDg7ZS5EemVjeXJpbGxpYz0xMDI5O2UuRHpoZWN5cmlsbGljPTEwMzk7ZS5FPTY5O2UuRWFjdXRlPTIwMTtlLkVhY3V0ZXNtYWxsPTYzNDY1O2UuRWJyZXZlPTI3NjtlLkVjYXJvbj0yODI7ZS5FY2VkaWxsYWJyZXZlPTc3MDg7ZS5FY2hhcm1lbmlhbj0xMzMzO2UuRWNpcmNsZT05NDAyO2UuRWNpcmN1bWZsZXg9MjAyO2UuRWNpcmN1bWZsZXhhY3V0ZT03ODcwO2UuRWNpcmN1bWZsZXhiZWxvdz03NzA0O2UuRWNpcmN1bWZsZXhkb3RiZWxvdz03ODc4O2UuRWNpcmN1bWZsZXhncmF2ZT03ODcyO2UuRWNpcmN1bWZsZXhob29rYWJvdmU9Nzg3NDtlLkVjaXJjdW1mbGV4c21hbGw9NjM0NjY7ZS5FY2lyY3VtZmxleHRpbGRlPTc4NzY7ZS5FY3lyaWxsaWM9MTAyODtlLkVkYmxncmF2ZT01MTY7ZS5FZGllcmVzaXM9MjAzO2UuRWRpZXJlc2lzc21hbGw9NjM0Njc7ZS5FZG90PTI3ODtlLkVkb3RhY2NlbnQ9Mjc4O2UuRWRvdGJlbG93PTc4NjQ7ZS5FZmN5cmlsbGljPTEwNjA7ZS5FZ3JhdmU9MjAwO2UuRWdyYXZlc21hbGw9NjM0NjQ7ZS5FaGFybWVuaWFuPTEzMzU7ZS5FaG9va2Fib3ZlPTc4NjY7ZS5FaWdodHJvbWFuPTg1NTE7ZS5FaW52ZXJ0ZWRicmV2ZT01MTg7ZS5FaW90aWZpZWRjeXJpbGxpYz0xMTI0O2UuRWxjeXJpbGxpYz0xMDUxO2UuRWxldmVucm9tYW49ODU1NDtlLkVtYWNyb249Mjc0O2UuRW1hY3JvbmFjdXRlPTc3MDI7ZS5FbWFjcm9uZ3JhdmU9NzcwMDtlLkVtY3lyaWxsaWM9MTA1MjtlLkVtb25vc3BhY2U9NjUzMTc7ZS5FbmN5cmlsbGljPTEwNTM7ZS5FbmRlc2NlbmRlcmN5cmlsbGljPTExODY7ZS5Fbmc9MzMwO2UuRW5naGVjeXJpbGxpYz0xMTg4O2UuRW5ob29rY3lyaWxsaWM9MTIyMztlLkVvZ29uZWs9MjgwO2UuRW9wZW49NDAwO2UuRXBzaWxvbj05MTc7ZS5FcHNpbG9udG9ub3M9OTA0O2UuRXJjeXJpbGxpYz0xMDU2O2UuRXJldmVyc2VkPTM5ODtlLkVyZXZlcnNlZGN5cmlsbGljPTEwNjk7ZS5Fc2N5cmlsbGljPTEwNTc7ZS5Fc2Rlc2NlbmRlcmN5cmlsbGljPTExOTQ7ZS5Fc2g9NDI1O2UuRXNtYWxsPTYzMzMzO2UuRXRhPTkxOTtlLkV0YXJtZW5pYW49MTMzNjtlLkV0YXRvbm9zPTkwNTtlLkV0aD0yMDg7ZS5FdGhzbWFsbD02MzQ3MjtlLkV0aWxkZT03ODY4O2UuRXRpbGRlYmVsb3c9NzcwNjtlLkV1cm89ODM2NDtlLkV6aD00Mzk7ZS5FemhjYXJvbj00OTQ7ZS5FemhyZXZlcnNlZD00NDA7ZS5GPTcwO2UuRmNpcmNsZT05NDAzO2UuRmRvdGFjY2VudD03NzEwO2UuRmVoYXJtZW5pYW49MTM2NjtlLkZlaWNvcHRpYz05OTY7ZS5GaG9vaz00MDE7ZS5GaXRhY3lyaWxsaWM9MTEzODtlLkZpdmVyb21hbj04NTQ4O2UuRm1vbm9zcGFjZT02NTMxODtlLkZvdXJyb21hbj04NTQ3O2UuRnNtYWxsPTYzMzM0O2UuRz03MTtlLkdCc3F1YXJlPTEzMTkxO2UuR2FjdXRlPTUwMDtlLkdhbW1hPTkxNTtlLkdhbW1hYWZyaWNhbj00MDQ7ZS5HYW5naWFjb3B0aWM9MTAwMjtlLkdicmV2ZT0yODY7ZS5HY2Fyb249NDg2O2UuR2NlZGlsbGE9MjkwO2UuR2NpcmNsZT05NDA0O2UuR2NpcmN1bWZsZXg9Mjg0O2UuR2NvbW1hYWNjZW50PTI5MDtlLkdkb3Q9Mjg4O2UuR2RvdGFjY2VudD0yODg7ZS5HZWN5cmlsbGljPTEwNDM7ZS5HaGFkYXJtZW5pYW49MTM0NjtlLkdoZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTcyO2UuR2hlc3Ryb2tlY3lyaWxsaWM9MTE3MDtlLkdoZXVwdHVybmN5cmlsbGljPTExNjg7ZS5HaG9vaz00MDM7ZS5HaW1hcm1lbmlhbj0xMzMxO2UuR2plY3lyaWxsaWM9MTAyNztlLkdtYWNyb249NzcxMjtlLkdtb25vc3BhY2U9NjUzMTk7ZS5HcmF2ZT02MzE4MjtlLkdyYXZlc21hbGw9NjMzMjg7ZS5Hc21hbGw9NjMzMzU7ZS5Hc21hbGxob29rPTY2NztlLkdzdHJva2U9NDg0O2UuSD03MjtlLkgxODUzMz05Njc5O2UuSDE4NTQzPTk2NDI7ZS5IMTg1NTE9OTY0MztlLkgyMjA3Mz05NjMzO2UuSFBzcXVhcmU9MTMyNTk7ZS5IYWFia2hhc2lhbmN5cmlsbGljPTExOTI7ZS5IYWRlc2NlbmRlcmN5cmlsbGljPTEyMDI7ZS5IYXJkc2lnbmN5cmlsbGljPTEwNjY7ZS5IYmFyPTI5NDtlLkhicmV2ZWJlbG93PTc3MjI7ZS5IY2VkaWxsYT03NzIwO2UuSGNpcmNsZT05NDA1O2UuSGNpcmN1bWZsZXg9MjkyO2UuSGRpZXJlc2lzPTc3MTg7ZS5IZG90YWNjZW50PTc3MTQ7ZS5IZG90YmVsb3c9NzcxNjtlLkhtb25vc3BhY2U9NjUzMjA7ZS5Ib2FybWVuaWFuPTEzNDQ7ZS5Ib3JpY29wdGljPTFlMztlLkhzbWFsbD02MzMzNjtlLkh1bmdhcnVtbGF1dD02MzE4MztlLkh1bmdhcnVtbGF1dHNtYWxsPTYzMjI0O2UuSHpzcXVhcmU9MTMyMDA7ZS5JPTczO2UuSUFjeXJpbGxpYz0xMDcxO2UuSUo9MzA2O2UuSVVjeXJpbGxpYz0xMDcwO2UuSWFjdXRlPTIwNTtlLklhY3V0ZXNtYWxsPTYzNDY5O2UuSWJyZXZlPTMwMDtlLkljYXJvbj00NjM7ZS5JY2lyY2xlPTk0MDY7ZS5JY2lyY3VtZmxleD0yMDY7ZS5JY2lyY3VtZmxleHNtYWxsPTYzNDcwO2UuSWN5cmlsbGljPTEwMzA7ZS5JZGJsZ3JhdmU9NTIwO2UuSWRpZXJlc2lzPTIwNztlLklkaWVyZXNpc2FjdXRlPTc3MjY7ZS5JZGllcmVzaXNjeXJpbGxpYz0xMjUyO2UuSWRpZXJlc2lzc21hbGw9NjM0NzE7ZS5JZG90PTMwNDtlLklkb3RhY2NlbnQ9MzA0O2UuSWRvdGJlbG93PTc4ODI7ZS5JZWJyZXZlY3lyaWxsaWM9MTIzODtlLkllY3lyaWxsaWM9MTA0NTtlLklmcmFrdHVyPTg0NjU7ZS5JZ3JhdmU9MjA0O2UuSWdyYXZlc21hbGw9NjM0Njg7ZS5JaG9va2Fib3ZlPTc4ODA7ZS5JaWN5cmlsbGljPTEwNDg7ZS5JaW52ZXJ0ZWRicmV2ZT01MjI7ZS5JaXNob3J0Y3lyaWxsaWM9MTA0OTtlLkltYWNyb249Mjk4O2UuSW1hY3JvbmN5cmlsbGljPTEyNTA7ZS5JbW9ub3NwYWNlPTY1MzIxO2UuSW5pYXJtZW5pYW49MTMzOTtlLklvY3lyaWxsaWM9MTAyNTtlLklvZ29uZWs9MzAyO2UuSW90YT05MjE7ZS5Jb3RhYWZyaWNhbj00MDY7ZS5Jb3RhZGllcmVzaXM9OTM4O2UuSW90YXRvbm9zPTkwNjtlLklzbWFsbD02MzMzNztlLklzdHJva2U9NDA3O2UuSXRpbGRlPTI5NjtlLkl0aWxkZWJlbG93PTc3MjQ7ZS5JemhpdHNhY3lyaWxsaWM9MTE0MDtlLkl6aGl0c2FkYmxncmF2ZWN5cmlsbGljPTExNDI7ZS5KPTc0O2UuSmFhcm1lbmlhbj0xMzQ1O2UuSmNpcmNsZT05NDA3O2UuSmNpcmN1bWZsZXg9MzA4O2UuSmVjeXJpbGxpYz0xMDMyO2UuSmhlaGFybWVuaWFuPTEzNTU7ZS5KbW9ub3NwYWNlPTY1MzIyO2UuSnNtYWxsPTYzMzM4O2UuSz03NTtlLktCc3F1YXJlPTEzMTg5O2UuS0tzcXVhcmU9MTMyNjE7ZS5LYWJhc2hraXJjeXJpbGxpYz0xMTg0O2UuS2FjdXRlPTc3Mjg7ZS5LYWN5cmlsbGljPTEwNTA7ZS5LYWRlc2NlbmRlcmN5cmlsbGljPTExNzg7ZS5LYWhvb2tjeXJpbGxpYz0xMjE5O2UuS2FwcGE9OTIyO2UuS2FzdHJva2VjeXJpbGxpYz0xMTgyO2UuS2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljPTExODA7ZS5LY2Fyb249NDg4O2UuS2NlZGlsbGE9MzEwO2UuS2NpcmNsZT05NDA4O2UuS2NvbW1hYWNjZW50PTMxMDtlLktkb3RiZWxvdz03NzMwO2UuS2VoYXJtZW5pYW49MTM2NDtlLktlbmFybWVuaWFuPTEzNDM7ZS5LaGFjeXJpbGxpYz0xMDYxO2UuS2hlaWNvcHRpYz05OTg7ZS5LaG9vaz00MDg7ZS5LamVjeXJpbGxpYz0xMDM2O2UuS2xpbmViZWxvdz03NzMyO2UuS21vbm9zcGFjZT02NTMyMztlLktvcHBhY3lyaWxsaWM9MTE1MjtlLktvcHBhZ3JlZWs9OTkwO2UuS3NpY3lyaWxsaWM9MTEzNDtlLktzbWFsbD02MzMzOTtlLkw9NzY7ZS5MSj00NTU7ZS5MTD02MzE2NztlLkxhY3V0ZT0zMTM7ZS5MYW1iZGE9OTIzO2UuTGNhcm9uPTMxNztlLkxjZWRpbGxhPTMxNTtlLkxjaXJjbGU9OTQwOTtlLkxjaXJjdW1mbGV4YmVsb3c9Nzc0MDtlLkxjb21tYWFjY2VudD0zMTU7ZS5MZG90PTMxOTtlLkxkb3RhY2NlbnQ9MzE5O2UuTGRvdGJlbG93PTc3MzQ7ZS5MZG90YmVsb3dtYWNyb249NzczNjtlLkxpd25hcm1lbmlhbj0xMzQwO2UuTGo9NDU2O2UuTGplY3lyaWxsaWM9MTAzMztlLkxsaW5lYmVsb3c9NzczODtlLkxtb25vc3BhY2U9NjUzMjQ7ZS5Mc2xhc2g9MzIxO2UuTHNsYXNoc21hbGw9NjMyMjU7ZS5Mc21hbGw9NjMzNDA7ZS5NPTc3O2UuTUJzcXVhcmU9MTMxOTA7ZS5NYWNyb249NjMxODQ7ZS5NYWNyb25zbWFsbD02MzQwNztlLk1hY3V0ZT03NzQyO2UuTWNpcmNsZT05NDEwO2UuTWRvdGFjY2VudD03NzQ0O2UuTWRvdGJlbG93PTc3NDY7ZS5NZW5hcm1lbmlhbj0xMzQ4O2UuTW1vbm9zcGFjZT02NTMyNTtlLk1zbWFsbD02MzM0MTtlLk10dXJuZWQ9NDEyO2UuTXU9OTI0O2UuTj03ODtlLk5KPTQ1ODtlLk5hY3V0ZT0zMjM7ZS5OY2Fyb249MzI3O2UuTmNlZGlsbGE9MzI1O2UuTmNpcmNsZT05NDExO2UuTmNpcmN1bWZsZXhiZWxvdz03NzU0O2UuTmNvbW1hYWNjZW50PTMyNTtlLk5kb3RhY2NlbnQ9Nzc0ODtlLk5kb3RiZWxvdz03NzUwO2UuTmhvb2tsZWZ0PTQxMztlLk5pbmVyb21hbj04NTUyO2UuTmo9NDU5O2UuTmplY3lyaWxsaWM9MTAzNDtlLk5saW5lYmVsb3c9Nzc1MjtlLk5tb25vc3BhY2U9NjUzMjY7ZS5Ob3dhcm1lbmlhbj0xMzUwO2UuTnNtYWxsPTYzMzQyO2UuTnRpbGRlPTIwOTtlLk50aWxkZXNtYWxsPTYzNDczO2UuTnU9OTI1O2UuTz03OTtlLk9FPTMzODtlLk9Fc21hbGw9NjMyMjY7ZS5PYWN1dGU9MjExO2UuT2FjdXRlc21hbGw9NjM0NzU7ZS5PYmFycmVkY3lyaWxsaWM9MTI1NjtlLk9iYXJyZWRkaWVyZXNpc2N5cmlsbGljPTEyNTg7ZS5PYnJldmU9MzM0O2UuT2Nhcm9uPTQ2NTtlLk9jZW50ZXJlZHRpbGRlPTQxNTtlLk9jaXJjbGU9OTQxMjtlLk9jaXJjdW1mbGV4PTIxMjtlLk9jaXJjdW1mbGV4YWN1dGU9Nzg4ODtlLk9jaXJjdW1mbGV4ZG90YmVsb3c9Nzg5NjtlLk9jaXJjdW1mbGV4Z3JhdmU9Nzg5MDtlLk9jaXJjdW1mbGV4aG9va2Fib3ZlPTc4OTI7ZS5PY2lyY3VtZmxleHNtYWxsPTYzNDc2O2UuT2NpcmN1bWZsZXh0aWxkZT03ODk0O2UuT2N5cmlsbGljPTEwNTQ7ZS5PZGJsYWN1dGU9MzM2O2UuT2RibGdyYXZlPTUyNDtlLk9kaWVyZXNpcz0yMTQ7ZS5PZGllcmVzaXNjeXJpbGxpYz0xMjU0O2UuT2RpZXJlc2lzc21hbGw9NjM0Nzg7ZS5PZG90YmVsb3c9Nzg4NDtlLk9nb25la3NtYWxsPTYzMjI3O2UuT2dyYXZlPTIxMDtlLk9ncmF2ZXNtYWxsPTYzNDc0O2UuT2hhcm1lbmlhbj0xMzY1O2UuT2htPTg0ODY7ZS5PaG9va2Fib3ZlPTc4ODY7ZS5PaG9ybj00MTY7ZS5PaG9ybmFjdXRlPTc4OTg7ZS5PaG9ybmRvdGJlbG93PTc5MDY7ZS5PaG9ybmdyYXZlPTc5MDA7ZS5PaG9ybmhvb2thYm92ZT03OTAyO2UuT2hvcm50aWxkZT03OTA0O2UuT2h1bmdhcnVtbGF1dD0zMzY7ZS5PaT00MTg7ZS5PaW52ZXJ0ZWRicmV2ZT01MjY7ZS5PbWFjcm9uPTMzMjtlLk9tYWNyb25hY3V0ZT03NzYyO2UuT21hY3JvbmdyYXZlPTc3NjA7ZS5PbWVnYT04NDg2O2UuT21lZ2FjeXJpbGxpYz0xMTIwO2UuT21lZ2FncmVlaz05Mzc7ZS5PbWVnYXJvdW5kY3lyaWxsaWM9MTE0NjtlLk9tZWdhdGl0bG9jeXJpbGxpYz0xMTQ4O2UuT21lZ2F0b25vcz05MTE7ZS5PbWljcm9uPTkyNztlLk9taWNyb250b25vcz05MDg7ZS5PbW9ub3NwYWNlPTY1MzI3O2UuT25lcm9tYW49ODU0NDtlLk9vZ29uZWs9NDkwO2UuT29nb25la21hY3Jvbj00OTI7ZS5Pb3Blbj0zOTA7ZS5Pc2xhc2g9MjE2O2UuT3NsYXNoYWN1dGU9NTEwO2UuT3NsYXNoc21hbGw9NjM0ODA7ZS5Pc21hbGw9NjMzNDM7ZS5Pc3Ryb2tlYWN1dGU9NTEwO2UuT3RjeXJpbGxpYz0xMTUwO2UuT3RpbGRlPTIxMztlLk90aWxkZWFjdXRlPTc3NTY7ZS5PdGlsZGVkaWVyZXNpcz03NzU4O2UuT3RpbGRlc21hbGw9NjM0Nzc7ZS5QPTgwO2UuUGFjdXRlPTc3NjQ7ZS5QY2lyY2xlPTk0MTM7ZS5QZG90YWNjZW50PTc3NjY7ZS5QZWN5cmlsbGljPTEwNTU7ZS5QZWhhcm1lbmlhbj0xMzU0O2UuUGVtaWRkbGVob29rY3lyaWxsaWM9MTE5MDtlLlBoaT05MzQ7ZS5QaG9vaz00MjA7ZS5QaT05Mjg7ZS5QaXdyYXJtZW5pYW49MTM2MztlLlBtb25vc3BhY2U9NjUzMjg7ZS5Qc2k9OTM2O2UuUHNpY3lyaWxsaWM9MTEzNjtlLlBzbWFsbD02MzM0NDtlLlE9ODE7ZS5RY2lyY2xlPTk0MTQ7ZS5RbW9ub3NwYWNlPTY1MzI5O2UuUXNtYWxsPTYzMzQ1O2UuUj04MjtlLlJhYXJtZW5pYW49MTM1NjtlLlJhY3V0ZT0zNDA7ZS5SY2Fyb249MzQ0O2UuUmNlZGlsbGE9MzQyO2UuUmNpcmNsZT05NDE1O2UuUmNvbW1hYWNjZW50PTM0MjtlLlJkYmxncmF2ZT01Mjg7ZS5SZG90YWNjZW50PTc3Njg7ZS5SZG90YmVsb3c9Nzc3MDtlLlJkb3RiZWxvd21hY3Jvbj03NzcyO2UuUmVoYXJtZW5pYW49MTM2MDtlLlJmcmFrdHVyPTg0NzY7ZS5SaG89OTI5O2UuUmluZ3NtYWxsPTYzMjI4O2UuUmludmVydGVkYnJldmU9NTMwO2UuUmxpbmViZWxvdz03Nzc0O2UuUm1vbm9zcGFjZT02NTMzMDtlLlJzbWFsbD02MzM0NjtlLlJzbWFsbGludmVydGVkPTY0MTtlLlJzbWFsbGludmVydGVkc3VwZXJpb3I9Njk0O2UuUz04MztlLlNGMDEwMDAwPTk0ODQ7ZS5TRjAyMDAwMD05NDkyO2UuU0YwMzAwMDA9OTQ4ODtlLlNGMDQwMDAwPTk0OTY7ZS5TRjA1MDAwMD05NTMyO2UuU0YwNjAwMDA9OTUxNjtlLlNGMDcwMDAwPTk1MjQ7ZS5TRjA4MDAwMD05NTAwO2UuU0YwOTAwMDA9OTUwODtlLlNGMTAwMDAwPTk0NzI7ZS5TRjExMDAwMD05NDc0O2UuU0YxOTAwMDA9OTU2OTtlLlNGMjAwMDAwPTk1NzA7ZS5TRjIxMDAwMD05NTU4O2UuU0YyMjAwMDA9OTU1NztlLlNGMjMwMDAwPTk1NzE7ZS5TRjI0MDAwMD05NTUzO2UuU0YyNTAwMDA9OTU1OTtlLlNGMjYwMDAwPTk1NjU7ZS5TRjI3MDAwMD05NTY0O2UuU0YyODAwMDA9OTU2MztlLlNGMzYwMDAwPTk1NjY7ZS5TRjM3MDAwMD05NTY3O2UuU0YzODAwMDA9OTU2MjtlLlNGMzkwMDAwPTk1NTY7ZS5TRjQwMDAwMD05NTc3O2UuU0Y0MTAwMDA9OTU3NDtlLlNGNDIwMDAwPTk1Njg7ZS5TRjQzMDAwMD05NTUyO2UuU0Y0NDAwMDA9OTU4MDtlLlNGNDUwMDAwPTk1NzU7ZS5TRjQ2MDAwMD05NTc2O2UuU0Y0NzAwMDA9OTU3MjtlLlNGNDgwMDAwPTk1NzM7ZS5TRjQ5MDAwMD05NTYxO2UuU0Y1MDAwMDA9OTU2MDtlLlNGNTEwMDAwPTk1NTQ7ZS5TRjUyMDAwMD05NTU1O2UuU0Y1MzAwMDA9OTU3OTtlLlNGNTQwMDAwPTk1Nzg7ZS5TYWN1dGU9MzQ2O2UuU2FjdXRlZG90YWNjZW50PTc3ODA7ZS5TYW1waWdyZWVrPTk5MjtlLlNjYXJvbj0zNTI7ZS5TY2Fyb25kb3RhY2NlbnQ9Nzc4MjtlLlNjYXJvbnNtYWxsPTYzMjI5O2UuU2NlZGlsbGE9MzUwO2UuU2Nod2E9Mzk5O2UuU2Nod2FjeXJpbGxpYz0xMjQwO2UuU2Nod2FkaWVyZXNpc2N5cmlsbGljPTEyNDI7ZS5TY2lyY2xlPTk0MTY7ZS5TY2lyY3VtZmxleD0zNDg7ZS5TY29tbWFhY2NlbnQ9NTM2O2UuU2RvdGFjY2VudD03Nzc2O2UuU2RvdGJlbG93PTc3Nzg7ZS5TZG90YmVsb3dkb3RhY2NlbnQ9Nzc4NDtlLlNlaGFybWVuaWFuPTEzNTc7ZS5TZXZlbnJvbWFuPTg1NTA7ZS5TaGFhcm1lbmlhbj0xMzUxO2UuU2hhY3lyaWxsaWM9MTA2NDtlLlNoY2hhY3lyaWxsaWM9MTA2NTtlLlNoZWljb3B0aWM9OTk0O2UuU2hoYWN5cmlsbGljPTEyMTA7ZS5TaGltYWNvcHRpYz0xMDA0O2UuU2lnbWE9OTMxO2UuU2l4cm9tYW49ODU0OTtlLlNtb25vc3BhY2U9NjUzMzE7ZS5Tb2Z0c2lnbmN5cmlsbGljPTEwNjg7ZS5Tc21hbGw9NjMzNDc7ZS5TdGlnbWFncmVlaz05ODY7ZS5UPTg0O2UuVGF1PTkzMjtlLlRiYXI9MzU4O2UuVGNhcm9uPTM1NjtlLlRjZWRpbGxhPTM1NDtlLlRjaXJjbGU9OTQxNztlLlRjaXJjdW1mbGV4YmVsb3c9Nzc5MjtlLlRjb21tYWFjY2VudD0zNTQ7ZS5UZG90YWNjZW50PTc3ODY7ZS5UZG90YmVsb3c9Nzc4ODtlLlRlY3lyaWxsaWM9MTA1ODtlLlRlZGVzY2VuZGVyY3lyaWxsaWM9MTE5NjtlLlRlbnJvbWFuPTg1NTM7ZS5UZXRzZWN5cmlsbGljPTEyMDQ7ZS5UaGV0YT05MjA7ZS5UaG9vaz00Mjg7ZS5UaG9ybj0yMjI7ZS5UaG9ybnNtYWxsPTYzNDg2O2UuVGhyZWVyb21hbj04NTQ2O2UuVGlsZGVzbWFsbD02MzIzMDtlLlRpd25hcm1lbmlhbj0xMzU5O2UuVGxpbmViZWxvdz03NzkwO2UuVG1vbm9zcGFjZT02NTMzMjtlLlRvYXJtZW5pYW49MTMzNztlLlRvbmVmaXZlPTQ0NDtlLlRvbmVzaXg9Mzg4O2UuVG9uZXR3bz00MjM7ZS5UcmV0cm9mbGV4aG9vaz00MzA7ZS5Uc2VjeXJpbGxpYz0xMDYyO2UuVHNoZWN5cmlsbGljPTEwMzU7ZS5Uc21hbGw9NjMzNDg7ZS5Ud2VsdmVyb21hbj04NTU1O2UuVHdvcm9tYW49ODU0NTtlLlU9ODU7ZS5VYWN1dGU9MjE4O2UuVWFjdXRlc21hbGw9NjM0ODI7ZS5VYnJldmU9MzY0O2UuVWNhcm9uPTQ2NztlLlVjaXJjbGU9OTQxODtlLlVjaXJjdW1mbGV4PTIxOTtlLlVjaXJjdW1mbGV4YmVsb3c9Nzc5ODtlLlVjaXJjdW1mbGV4c21hbGw9NjM0ODM7ZS5VY3lyaWxsaWM9MTA1OTtlLlVkYmxhY3V0ZT0zNjg7ZS5VZGJsZ3JhdmU9NTMyO2UuVWRpZXJlc2lzPTIyMDtlLlVkaWVyZXNpc2FjdXRlPTQ3MTtlLlVkaWVyZXNpc2JlbG93PTc3OTQ7ZS5VZGllcmVzaXNjYXJvbj00NzM7ZS5VZGllcmVzaXNjeXJpbGxpYz0xMjY0O2UuVWRpZXJlc2lzZ3JhdmU9NDc1O2UuVWRpZXJlc2lzbWFjcm9uPTQ2OTtlLlVkaWVyZXNpc3NtYWxsPTYzNDg0O2UuVWRvdGJlbG93PTc5MDg7ZS5VZ3JhdmU9MjE3O2UuVWdyYXZlc21hbGw9NjM0ODE7ZS5VaG9va2Fib3ZlPTc5MTA7ZS5VaG9ybj00MzE7ZS5VaG9ybmFjdXRlPTc5MTI7ZS5VaG9ybmRvdGJlbG93PTc5MjA7ZS5VaG9ybmdyYXZlPTc5MTQ7ZS5VaG9ybmhvb2thYm92ZT03OTE2O2UuVWhvcm50aWxkZT03OTE4O2UuVWh1bmdhcnVtbGF1dD0zNjg7ZS5VaHVuZ2FydW1sYXV0Y3lyaWxsaWM9MTI2NjtlLlVpbnZlcnRlZGJyZXZlPTUzNDtlLlVrY3lyaWxsaWM9MTE0NDtlLlVtYWNyb249MzYyO2UuVW1hY3JvbmN5cmlsbGljPTEyNjI7ZS5VbWFjcm9uZGllcmVzaXM9NzgwMjtlLlVtb25vc3BhY2U9NjUzMzM7ZS5Vb2dvbmVrPTM3MDtlLlVwc2lsb249OTMzO2UuVXBzaWxvbjE9OTc4O2UuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrPTk3OTtlLlVwc2lsb25hZnJpY2FuPTQzMztlLlVwc2lsb25kaWVyZXNpcz05Mzk7ZS5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWs9OTgwO2UuVXBzaWxvbmhvb2tzeW1ib2w9OTc4O2UuVXBzaWxvbnRvbm9zPTkxMDtlLlVyaW5nPTM2NjtlLlVzaG9ydGN5cmlsbGljPTEwMzg7ZS5Vc21hbGw9NjMzNDk7ZS5Vc3RyYWlnaHRjeXJpbGxpYz0xMTk4O2UuVXN0cmFpZ2h0c3Ryb2tlY3lyaWxsaWM9MTIwMDtlLlV0aWxkZT0zNjA7ZS5VdGlsZGVhY3V0ZT03ODAwO2UuVXRpbGRlYmVsb3c9Nzc5NjtlLlY9ODY7ZS5WY2lyY2xlPTk0MTk7ZS5WZG90YmVsb3c9NzgwNjtlLlZlY3lyaWxsaWM9MTA0MjtlLlZld2FybWVuaWFuPTEzNTg7ZS5WaG9vaz00MzQ7ZS5WbW9ub3NwYWNlPTY1MzM0O2UuVm9hcm1lbmlhbj0xMzUyO2UuVnNtYWxsPTYzMzUwO2UuVnRpbGRlPTc4MDQ7ZS5XPTg3O2UuV2FjdXRlPTc4MTA7ZS5XY2lyY2xlPTk0MjA7ZS5XY2lyY3VtZmxleD0zNzI7ZS5XZGllcmVzaXM9NzgxMjtlLldkb3RhY2NlbnQ9NzgxNDtlLldkb3RiZWxvdz03ODE2O2UuV2dyYXZlPTc4MDg7ZS5XbW9ub3NwYWNlPTY1MzM1O2UuV3NtYWxsPTYzMzUxO2UuWD04ODtlLlhjaXJjbGU9OTQyMTtlLlhkaWVyZXNpcz03ODIwO2UuWGRvdGFjY2VudD03ODE4O2UuWGVoYXJtZW5pYW49MTM0MTtlLlhpPTkyNjtlLlhtb25vc3BhY2U9NjUzMzY7ZS5Yc21hbGw9NjMzNTI7ZS5ZPTg5O2UuWWFjdXRlPTIyMTtlLllhY3V0ZXNtYWxsPTYzNDg1O2UuWWF0Y3lyaWxsaWM9MTEyMjtlLlljaXJjbGU9OTQyMjtlLlljaXJjdW1mbGV4PTM3NDtlLllkaWVyZXNpcz0zNzY7ZS5ZZGllcmVzaXNzbWFsbD02MzQ4NztlLllkb3RhY2NlbnQ9NzgyMjtlLllkb3RiZWxvdz03OTI0O2UuWWVyaWN5cmlsbGljPTEwNjc7ZS5ZZXJ1ZGllcmVzaXNjeXJpbGxpYz0xMjcyO2UuWWdyYXZlPTc5MjI7ZS5ZaG9vaz00MzU7ZS5ZaG9va2Fib3ZlPTc5MjY7ZS5ZaWFybWVuaWFuPTEzNDk7ZS5ZaWN5cmlsbGljPTEwMzE7ZS5ZaXduYXJtZW5pYW49MTM2MjtlLlltb25vc3BhY2U9NjUzMzc7ZS5Zc21hbGw9NjMzNTM7ZS5ZdGlsZGU9NzkyODtlLll1c2JpZ2N5cmlsbGljPTExMzA7ZS5ZdXNiaWdpb3RpZmllZGN5cmlsbGljPTExMzI7ZS5ZdXNsaXR0bGVjeXJpbGxpYz0xMTI2O2UuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYz0xMTI4O2UuWj05MDtlLlphYXJtZW5pYW49MTMzNDtlLlphY3V0ZT0zNzc7ZS5aY2Fyb249MzgxO2UuWmNhcm9uc21hbGw9NjMyMzE7ZS5aY2lyY2xlPTk0MjM7ZS5aY2lyY3VtZmxleD03ODI0O2UuWmRvdD0zNzk7ZS5aZG90YWNjZW50PTM3OTtlLlpkb3RiZWxvdz03ODI2O2UuWmVjeXJpbGxpYz0xMDQ3O2UuWmVkZXNjZW5kZXJjeXJpbGxpYz0xMTc2O2UuWmVkaWVyZXNpc2N5cmlsbGljPTEyNDY7ZS5aZXRhPTkxODtlLlpoZWFybWVuaWFuPTEzMzg7ZS5aaGVicmV2ZWN5cmlsbGljPTEyMTc7ZS5aaGVjeXJpbGxpYz0xMDQ2O2UuWmhlZGVzY2VuZGVyY3lyaWxsaWM9MTE3NDtlLlpoZWRpZXJlc2lzY3lyaWxsaWM9MTI0NDtlLlpsaW5lYmVsb3c9NzgyODtlLlptb25vc3BhY2U9NjUzMzg7ZS5ac21hbGw9NjMzNTQ7ZS5ac3Ryb2tlPTQzNztlLmE9OTc7ZS5hYWJlbmdhbGk9MjQzODtlLmFhY3V0ZT0yMjU7ZS5hYWRldmE9MjMxMDtlLmFhZ3VqYXJhdGk9MjY5NDtlLmFhZ3VybXVraGk9MjU2NjtlLmFhbWF0cmFndXJtdWtoaT0yNjIyO2UuYWFydXNxdWFyZT0xMzA1OTtlLmFhdm93ZWxzaWduYmVuZ2FsaT0yNDk0O2UuYWF2b3dlbHNpZ25kZXZhPTIzNjY7ZS5hYXZvd2Vsc2lnbmd1amFyYXRpPTI3NTA7ZS5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW49MTM3NTtlLmFiYnJldmlhdGlvbnNpZ25kZXZhPTI0MTY7ZS5hYmVuZ2FsaT0yNDM3O2UuYWJvcG9tb2ZvPTEyNTcwO2UuYWJyZXZlPTI1OTtlLmFicmV2ZWFjdXRlPTc4NTU7ZS5hYnJldmVjeXJpbGxpYz0xMjMzO2UuYWJyZXZlZG90YmVsb3c9Nzg2MztlLmFicmV2ZWdyYXZlPTc4NTc7ZS5hYnJldmVob29rYWJvdmU9Nzg1OTtlLmFicmV2ZXRpbGRlPTc4NjE7ZS5hY2Fyb249NDYyO2UuYWNpcmNsZT05NDI0O2UuYWNpcmN1bWZsZXg9MjI2O2UuYWNpcmN1bWZsZXhhY3V0ZT03ODQ1O2UuYWNpcmN1bWZsZXhkb3RiZWxvdz03ODUzO2UuYWNpcmN1bWZsZXhncmF2ZT03ODQ3O2UuYWNpcmN1bWZsZXhob29rYWJvdmU9Nzg0OTtlLmFjaXJjdW1mbGV4dGlsZGU9Nzg1MTtlLmFjdXRlPTE4MDtlLmFjdXRlYmVsb3djbWI9NzkxO2UuYWN1dGVjbWI9NzY5O2UuYWN1dGVjb21iPTc2OTtlLmFjdXRlZGV2YT0yMzg4O2UuYWN1dGVsb3dtb2Q9NzE5O2UuYWN1dGV0b25lY21iPTgzMztlLmFjeXJpbGxpYz0xMDcyO2UuYWRibGdyYXZlPTUxMztlLmFkZGFrZ3VybXVraGk9MjY3MztlLmFkZXZhPTIzMDk7ZS5hZGllcmVzaXM9MjI4O2UuYWRpZXJlc2lzY3lyaWxsaWM9MTIzNTtlLmFkaWVyZXNpc21hY3Jvbj00Nzk7ZS5hZG90YmVsb3c9Nzg0MTtlLmFkb3RtYWNyb249NDgxO2UuYWU9MjMwO2UuYWVhY3V0ZT01MDk7ZS5hZWtvcmVhbj0xMjYyNDtlLmFlbWFjcm9uPTQ4MztlLmFmaWkwMDIwOD04MjEzO2UuYWZpaTA4OTQxPTgzNTY7ZS5hZmlpMTAwMTc9MTA0MDtlLmFmaWkxMDAxOD0xMDQxO2UuYWZpaTEwMDE5PTEwNDI7ZS5hZmlpMTAwMjA9MTA0MztlLmFmaWkxMDAyMT0xMDQ0O2UuYWZpaTEwMDIyPTEwNDU7ZS5hZmlpMTAwMjM9MTAyNTtlLmFmaWkxMDAyND0xMDQ2O2UuYWZpaTEwMDI1PTEwNDc7ZS5hZmlpMTAwMjY9MTA0ODtlLmFmaWkxMDAyNz0xMDQ5O2UuYWZpaTEwMDI4PTEwNTA7ZS5hZmlpMTAwMjk9MTA1MTtlLmFmaWkxMDAzMD0xMDUyO2UuYWZpaTEwMDMxPTEwNTM7ZS5hZmlpMTAwMzI9MTA1NDtlLmFmaWkxMDAzMz0xMDU1O2UuYWZpaTEwMDM0PTEwNTY7ZS5hZmlpMTAwMzU9MTA1NztlLmFmaWkxMDAzNj0xMDU4O2UuYWZpaTEwMDM3PTEwNTk7ZS5hZmlpMTAwMzg9MTA2MDtlLmFmaWkxMDAzOT0xMDYxO2UuYWZpaTEwMDQwPTEwNjI7ZS5hZmlpMTAwNDE9MTA2MztlLmFmaWkxMDA0Mj0xMDY0O2UuYWZpaTEwMDQzPTEwNjU7ZS5hZmlpMTAwNDQ9MTA2NjtlLmFmaWkxMDA0NT0xMDY3O2UuYWZpaTEwMDQ2PTEwNjg7ZS5hZmlpMTAwNDc9MTA2OTtlLmFmaWkxMDA0OD0xMDcwO2UuYWZpaTEwMDQ5PTEwNzE7ZS5hZmlpMTAwNTA9MTE2ODtlLmFmaWkxMDA1MT0xMDI2O2UuYWZpaTEwMDUyPTEwMjc7ZS5hZmlpMTAwNTM9MTAyODtlLmFmaWkxMDA1ND0xMDI5O2UuYWZpaTEwMDU1PTEwMzA7ZS5hZmlpMTAwNTY9MTAzMTtlLmFmaWkxMDA1Nz0xMDMyO2UuYWZpaTEwMDU4PTEwMzM7ZS5hZmlpMTAwNTk9MTAzNDtlLmFmaWkxMDA2MD0xMDM1O2UuYWZpaTEwMDYxPTEwMzY7ZS5hZmlpMTAwNjI9MTAzODtlLmFmaWkxMDA2Mz02MzE3MjtlLmFmaWkxMDA2ND02MzE3MztlLmFmaWkxMDA2NT0xMDcyO2UuYWZpaTEwMDY2PTEwNzM7ZS5hZmlpMTAwNjc9MTA3NDtlLmFmaWkxMDA2OD0xMDc1O2UuYWZpaTEwMDY5PTEwNzY7ZS5hZmlpMTAwNzA9MTA3NztlLmFmaWkxMDA3MT0xMTA1O2UuYWZpaTEwMDcyPTEwNzg7ZS5hZmlpMTAwNzM9MTA3OTtlLmFmaWkxMDA3ND0xMDgwO2UuYWZpaTEwMDc1PTEwODE7ZS5hZmlpMTAwNzY9MTA4MjtlLmFmaWkxMDA3Nz0xMDgzO2UuYWZpaTEwMDc4PTEwODQ7ZS5hZmlpMTAwNzk9MTA4NTtlLmFmaWkxMDA4MD0xMDg2O2UuYWZpaTEwMDgxPTEwODc7ZS5hZmlpMTAwODI9MTA4ODtlLmFmaWkxMDA4Mz0xMDg5O2UuYWZpaTEwMDg0PTEwOTA7ZS5hZmlpMTAwODU9MTA5MTtlLmFmaWkxMDA4Nj0xMDkyO2UuYWZpaTEwMDg3PTEwOTM7ZS5hZmlpMTAwODg9MTA5NDtlLmFmaWkxMDA4OT0xMDk1O2UuYWZpaTEwMDkwPTEwOTY7ZS5hZmlpMTAwOTE9MTA5NztlLmFmaWkxMDA5Mj0xMDk4O2UuYWZpaTEwMDkzPTEwOTk7ZS5hZmlpMTAwOTQ9MTEwMDtlLmFmaWkxMDA5NT0xMTAxO2UuYWZpaTEwMDk2PTExMDI7ZS5hZmlpMTAwOTc9MTEwMztlLmFmaWkxMDA5OD0xMTY5O2UuYWZpaTEwMDk5PTExMDY7ZS5hZmlpMTAxMDA9MTEwNztlLmFmaWkxMDEwMT0xMTA4O2UuYWZpaTEwMTAyPTExMDk7ZS5hZmlpMTAxMDM9MTExMDtlLmFmaWkxMDEwND0xMTExO2UuYWZpaTEwMTA1PTExMTI7ZS5hZmlpMTAxMDY9MTExMztlLmFmaWkxMDEwNz0xMTE0O2UuYWZpaTEwMTA4PTExMTU7ZS5hZmlpMTAxMDk9MTExNjtlLmFmaWkxMDExMD0xMTE4O2UuYWZpaTEwMTQ1PTEwMzk7ZS5hZmlpMTAxNDY9MTEyMjtlLmFmaWkxMDE0Nz0xMTM4O2UuYWZpaTEwMTQ4PTExNDA7ZS5hZmlpMTAxOTI9NjMxNzQ7ZS5hZmlpMTAxOTM9MTExOTtlLmFmaWkxMDE5ND0xMTIzO2UuYWZpaTEwMTk1PTExMzk7ZS5hZmlpMTAxOTY9MTE0MTtlLmFmaWkxMDgzMT02MzE3NTtlLmFmaWkxMDgzMj02MzE3NjtlLmFmaWkxMDg0Nj0xMjQxO2UuYWZpaTI5OT04MjA2O2UuYWZpaTMwMD04MjA3O2UuYWZpaTMwMT04MjA1O2UuYWZpaTU3MzgxPTE2NDI7ZS5hZmlpNTczODg9MTU0ODtlLmFmaWk1NzM5Mj0xNjMyO2UuYWZpaTU3MzkzPTE2MzM7ZS5hZmlpNTczOTQ9MTYzNDtlLmFmaWk1NzM5NT0xNjM1O2UuYWZpaTU3Mzk2PTE2MzY7ZS5hZmlpNTczOTc9MTYzNztlLmFmaWk1NzM5OD0xNjM4O2UuYWZpaTU3Mzk5PTE2Mzk7ZS5hZmlpNTc0MDA9MTY0MDtlLmFmaWk1NzQwMT0xNjQxO2UuYWZpaTU3NDAzPTE1NjM7ZS5hZmlpNTc0MDc9MTU2NztlLmFmaWk1NzQwOT0xNTY5O2UuYWZpaTU3NDEwPTE1NzA7ZS5hZmlpNTc0MTE9MTU3MTtlLmFmaWk1NzQxMj0xNTcyO2UuYWZpaTU3NDEzPTE1NzM7ZS5hZmlpNTc0MTQ9MTU3NDtlLmFmaWk1NzQxNT0xNTc1O2UuYWZpaTU3NDE2PTE1NzY7ZS5hZmlpNTc0MTc9MTU3NztlLmFmaWk1NzQxOD0xNTc4O2UuYWZpaTU3NDE5PTE1Nzk7ZS5hZmlpNTc0MjA9MTU4MDtlLmFmaWk1NzQyMT0xNTgxO2UuYWZpaTU3NDIyPTE1ODI7ZS5hZmlpNTc0MjM9MTU4MztlLmFmaWk1NzQyND0xNTg0O2UuYWZpaTU3NDI1PTE1ODU7ZS5hZmlpNTc0MjY9MTU4NjtlLmFmaWk1NzQyNz0xNTg3O2UuYWZpaTU3NDI4PTE1ODg7ZS5hZmlpNTc0Mjk9MTU4OTtlLmFmaWk1NzQzMD0xNTkwO2UuYWZpaTU3NDMxPTE1OTE7ZS5hZmlpNTc0MzI9MTU5MjtlLmFmaWk1NzQzMz0xNTkzO2UuYWZpaTU3NDM0PTE1OTQ7ZS5hZmlpNTc0NDA9MTYwMDtlLmFmaWk1NzQ0MT0xNjAxO2UuYWZpaTU3NDQyPTE2MDI7ZS5hZmlpNTc0NDM9MTYwMztlLmFmaWk1NzQ0ND0xNjA0O2UuYWZpaTU3NDQ1PTE2MDU7ZS5hZmlpNTc0NDY9MTYwNjtlLmFmaWk1NzQ0OD0xNjA4O2UuYWZpaTU3NDQ5PTE2MDk7ZS5hZmlpNTc0NTA9MTYxMDtlLmFmaWk1NzQ1MT0xNjExO2UuYWZpaTU3NDUyPTE2MTI7ZS5hZmlpNTc0NTM9MTYxMztlLmFmaWk1NzQ1ND0xNjE0O2UuYWZpaTU3NDU1PTE2MTU7ZS5hZmlpNTc0NTY9MTYxNjtlLmFmaWk1NzQ1Nz0xNjE3O2UuYWZpaTU3NDU4PTE2MTg7ZS5hZmlpNTc0NzA9MTYwNztlLmFmaWk1NzUwNT0xNzAwO2UuYWZpaTU3NTA2PTE2NjI7ZS5hZmlpNTc1MDc9MTY3MDtlLmFmaWk1NzUwOD0xNjg4O2UuYWZpaTU3NTA5PTE3MTE7ZS5hZmlpNTc1MTE9MTY1NztlLmFmaWk1NzUxMj0xNjcyO2UuYWZpaTU3NTEzPTE2ODE7ZS5hZmlpNTc1MTQ9MTcyMjtlLmFmaWk1NzUxOT0xNzQ2O2UuYWZpaTU3NTM0PTE3NDk7ZS5hZmlpNTc2MzY9ODM2MjtlLmFmaWk1NzY0NT0xNDcwO2UuYWZpaTU3NjU4PTE0NzU7ZS5hZmlpNTc2NjQ9MTQ4ODtlLmFmaWk1NzY2NT0xNDg5O2UuYWZpaTU3NjY2PTE0OTA7ZS5hZmlpNTc2Njc9MTQ5MTtlLmFmaWk1NzY2OD0xNDkyO2UuYWZpaTU3NjY5PTE0OTM7ZS5hZmlpNTc2NzA9MTQ5NDtlLmFmaWk1NzY3MT0xNDk1O2UuYWZpaTU3NjcyPTE0OTY7ZS5hZmlpNTc2NzM9MTQ5NztlLmFmaWk1NzY3ND0xNDk4O2UuYWZpaTU3Njc1PTE0OTk7ZS5hZmlpNTc2NzY9MTUwMDtlLmFmaWk1NzY3Nz0xNTAxO2UuYWZpaTU3Njc4PTE1MDI7ZS5hZmlpNTc2Nzk9MTUwMztlLmFmaWk1NzY4MD0xNTA0O2UuYWZpaTU3NjgxPTE1MDU7ZS5hZmlpNTc2ODI9MTUwNjtlLmFmaWk1NzY4Mz0xNTA3O2UuYWZpaTU3Njg0PTE1MDg7ZS5hZmlpNTc2ODU9MTUwOTtlLmFmaWk1NzY4Nj0xNTEwO2UuYWZpaTU3Njg3PTE1MTE7ZS5hZmlpNTc2ODg9MTUxMjtlLmFmaWk1NzY4OT0xNTEzO2UuYWZpaTU3NjkwPTE1MTQ7ZS5hZmlpNTc2OTQ9NjQyOTg7ZS5hZmlpNTc2OTU9NjQyOTk7ZS5hZmlpNTc3MDA9NjQzMzE7ZS5hZmlpNTc3MDU9NjQyODc7ZS5hZmlpNTc3MTY9MTUyMDtlLmFmaWk1NzcxNz0xNTIxO2UuYWZpaTU3NzE4PTE1MjI7ZS5hZmlpNTc3MjM9NjQzMDk7ZS5hZmlpNTc3OTM9MTQ2MDtlLmFmaWk1Nzc5ND0xNDYxO2UuYWZpaTU3Nzk1PTE0NjI7ZS5hZmlpNTc3OTY9MTQ2NztlLmFmaWk1Nzc5Nz0xNDY0O2UuYWZpaTU3Nzk4PTE0NjM7ZS5hZmlpNTc3OTk9MTQ1NjtlLmFmaWk1NzgwMD0xNDU4O2UuYWZpaTU3ODAxPTE0NTc7ZS5hZmlpNTc4MDI9MTQ1OTtlLmFmaWk1NzgwMz0xNDc0O2UuYWZpaTU3ODA0PTE0NzM7ZS5hZmlpNTc4MDY9MTQ2NTtlLmFmaWk1NzgwNz0xNDY4O2UuYWZpaTU3ODM5PTE0Njk7ZS5hZmlpNTc4NDE9MTQ3MTtlLmFmaWk1Nzg0Mj0xNDcyO2UuYWZpaTU3OTI5PTcwMDtlLmFmaWk2MTI0OD04NDUzO2UuYWZpaTYxMjg5PTg0Njc7ZS5hZmlpNjEzNTI9ODQ3MDtlLmFmaWk2MTU3Mz04MjM2O2UuYWZpaTYxNTc0PTgyMzc7ZS5hZmlpNjE1NzU9ODIzODtlLmFmaWk2MTY2ND04MjA0O2UuYWZpaTYzMTY3PTE2NDU7ZS5hZmlpNjQ5Mzc9NzAxO2UuYWdyYXZlPTIyNDtlLmFndWphcmF0aT0yNjkzO2UuYWd1cm11a2hpPTI1NjU7ZS5haGlyYWdhbmE9MTIzNTQ7ZS5haG9va2Fib3ZlPTc4NDM7ZS5haWJlbmdhbGk9MjQ0ODtlLmFpYm9wb21vZm89MTI1NzQ7ZS5haWRldmE9MjMyMDtlLmFpZWN5cmlsbGljPTEyMzc7ZS5haWd1amFyYXRpPTI3MDQ7ZS5haWd1cm11a2hpPTI1NzY7ZS5haW1hdHJhZ3VybXVraGk9MjYzMjtlLmFpbmFyYWJpYz0xNTkzO2UuYWluZmluYWxhcmFiaWM9NjUyMjY7ZS5haW5pbml0aWFsYXJhYmljPTY1MjI3O2UuYWlubWVkaWFsYXJhYmljPTY1MjI4O2UuYWludmVydGVkYnJldmU9NTE1O2UuYWl2b3dlbHNpZ25iZW5nYWxpPTI1MDQ7ZS5haXZvd2Vsc2lnbmRldmE9MjM3NjtlLmFpdm93ZWxzaWduZ3VqYXJhdGk9Mjc2MDtlLmFrYXRha2FuYT0xMjQ1MDtlLmFrYXRha2FuYWhhbGZ3aWR0aD02NTM5MztlLmFrb3JlYW49MTI2MjM7ZS5hbGVmPTE0ODg7ZS5hbGVmYXJhYmljPTE1NzU7ZS5hbGVmZGFnZXNoaGVicmV3PTY0MzA0O2UuYWxlZmZpbmFsYXJhYmljPTY1MTY2O2UuYWxlZmhhbXphYWJvdmVhcmFiaWM9MTU3MTtlLmFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWM9NjUxNTY7ZS5hbGVmaGFtemFiZWxvd2FyYWJpYz0xNTczO2UuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYz02NTE2MDtlLmFsZWZoZWJyZXc9MTQ4ODtlLmFsZWZsYW1lZGhlYnJldz02NDMzNTtlLmFsZWZtYWRkYWFib3ZlYXJhYmljPTE1NzA7ZS5hbGVmbWFkZGFhYm92ZWZpbmFsYXJhYmljPTY1MTU0O2UuYWxlZm1ha3N1cmFhcmFiaWM9MTYwOTtlLmFsZWZtYWtzdXJhZmluYWxhcmFiaWM9NjUyNjQ7ZS5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWM9NjUyNjc7ZS5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYz02NTI2ODtlLmFsZWZwYXRhaGhlYnJldz02NDMwMjtlLmFsZWZxYW1hdHNoZWJyZXc9NjQzMDM7ZS5hbGVwaD04NTAxO2UuYWxsZXF1YWw9ODc4MDtlLmFscGhhPTk0NTtlLmFscGhhdG9ub3M9OTQwO2UuYW1hY3Jvbj0yNTc7ZS5hbW9ub3NwYWNlPTY1MzQ1O2UuYW1wZXJzYW5kPTM4O2UuYW1wZXJzYW5kbW9ub3NwYWNlPTY1Mjg2O2UuYW1wZXJzYW5kc21hbGw9NjMyNzA7ZS5hbXNxdWFyZT0xMzI1MDtlLmFuYm9wb21vZm89MTI1Nzg7ZS5hbmdib3BvbW9mbz0xMjU4MDtlLmFuZ2JyYWNrZXRsZWZ0PTEyMjk2O2UuYW5nYnJhY2tldHJpZ2h0PTEyMjk3O2UuYW5na2hhbmtodXRoYWk9MzY3NDtlLmFuZ2xlPTg3MzY7ZS5hbmdsZWJyYWNrZXRsZWZ0PTEyMjk2O2UuYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsPTY1MDg3O2UuYW5nbGVicmFja2V0cmlnaHQ9MTIyOTc7ZS5hbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsPTY1MDg4O2UuYW5nbGVsZWZ0PTkwMDE7ZS5hbmdsZXJpZ2h0PTkwMDI7ZS5hbmdzdHJvbT04NDkxO2UuYW5vdGVsZWlhPTkwMztlLmFudWRhdHRhZGV2YT0yMzg2O2UuYW51c3ZhcmFiZW5nYWxpPTI0MzQ7ZS5hbnVzdmFyYWRldmE9MjMwNjtlLmFudXN2YXJhZ3VqYXJhdGk9MjY5MDtlLmFvZ29uZWs9MjYxO2UuYXBhYXRvc3F1YXJlPTEzMDU2O2UuYXBhcmVuPTkzNzI7ZS5hcG9zdHJvcGhlYXJtZW5pYW49MTM3MDtlLmFwb3N0cm9waGVtb2Q9NzAwO2UuYXBwbGU9NjM3NDM7ZS5hcHByb2FjaGVzPTg3ODQ7ZS5hcHByb3hlcXVhbD04Nzc2O2UuYXBwcm94ZXF1YWxvcmltYWdlPTg3ODY7ZS5hcHByb3hpbWF0ZWx5ZXF1YWw9ODc3MztlLmFyYWVhZWtvcmVhbj0xMjY4NjtlLmFyYWVha29yZWFuPTEyNjg1O2UuYXJjPTg5Nzg7ZS5hcmlnaHRoYWxmcmluZz03ODM0O2UuYXJpbmc9MjI5O2UuYXJpbmdhY3V0ZT01MDc7ZS5hcmluZ2JlbG93PTc2ODE7ZS5hcnJvd2JvdGg9ODU5NjtlLmFycm93ZGFzaGRvd249ODY3NTtlLmFycm93ZGFzaGxlZnQ9ODY3MjtlLmFycm93ZGFzaHJpZ2h0PTg2NzQ7ZS5hcnJvd2Rhc2h1cD04NjczO2UuYXJyb3dkYmxib3RoPTg2NjA7ZS5hcnJvd2RibGRvd249ODY1OTtlLmFycm93ZGJsbGVmdD04NjU2O2UuYXJyb3dkYmxyaWdodD04NjU4O2UuYXJyb3dkYmx1cD04NjU3O2UuYXJyb3dkb3duPTg1OTU7ZS5hcnJvd2Rvd25sZWZ0PTg2MDE7ZS5hcnJvd2Rvd25yaWdodD04NjAwO2UuYXJyb3dkb3dud2hpdGU9ODY4MTtlLmFycm93aGVhZGRvd25tb2Q9NzA5O2UuYXJyb3doZWFkbGVmdG1vZD03MDY7ZS5hcnJvd2hlYWRyaWdodG1vZD03MDc7ZS5hcnJvd2hlYWR1cG1vZD03MDg7ZS5hcnJvd2hvcml6ZXg9NjM3MTk7ZS5hcnJvd2xlZnQ9ODU5MjtlLmFycm93bGVmdGRibD04NjU2O2UuYXJyb3dsZWZ0ZGJsc3Ryb2tlPTg2NTM7ZS5hcnJvd2xlZnRvdmVycmlnaHQ9ODY0NjtlLmFycm93bGVmdHdoaXRlPTg2Nzg7ZS5hcnJvd3JpZ2h0PTg1OTQ7ZS5hcnJvd3JpZ2h0ZGJsc3Ryb2tlPTg2NTU7ZS5hcnJvd3JpZ2h0aGVhdnk9MTAxNDI7ZS5hcnJvd3JpZ2h0b3ZlcmxlZnQ9ODY0NDtlLmFycm93cmlnaHR3aGl0ZT04NjgwO2UuYXJyb3d0YWJsZWZ0PTg2NzY7ZS5hcnJvd3RhYnJpZ2h0PTg2Nzc7ZS5hcnJvd3VwPTg1OTM7ZS5hcnJvd3VwZG49ODU5NztlLmFycm93dXBkbmJzZT04NjE2O2UuYXJyb3d1cGRvd25iYXNlPTg2MTY7ZS5hcnJvd3VwbGVmdD04NTk4O2UuYXJyb3d1cGxlZnRvZmRvd249ODY0NTtlLmFycm93dXByaWdodD04NTk5O2UuYXJyb3d1cHdoaXRlPTg2Nzk7ZS5hcnJvd3ZlcnRleD02MzcxODtlLmFzY2lpY2lyY3VtPTk0O2UuYXNjaWljaXJjdW1tb25vc3BhY2U9NjUzNDI7ZS5hc2NpaXRpbGRlPTEyNjtlLmFzY2lpdGlsZGVtb25vc3BhY2U9NjUzNzQ7ZS5hc2NyaXB0PTU5MztlLmFzY3JpcHR0dXJuZWQ9NTk0O2UuYXNtYWxsaGlyYWdhbmE9MTIzNTM7ZS5hc21hbGxrYXRha2FuYT0xMjQ0OTtlLmFzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1MzgzO2UuYXN0ZXJpc2s9NDI7ZS5hc3Rlcmlza2FsdG9uZWFyYWJpYz0xNjQ1O2UuYXN0ZXJpc2thcmFiaWM9MTY0NTtlLmFzdGVyaXNrbWF0aD04NzI3O2UuYXN0ZXJpc2ttb25vc3BhY2U9NjUyOTA7ZS5hc3Rlcmlza3NtYWxsPTY1MTIxO2UuYXN0ZXJpc209ODI1ODtlLmFzdXBlcmlvcj02MzIwOTtlLmFzeW1wdG90aWNhbGx5ZXF1YWw9ODc3MTtlLmF0PTY0O2UuYXRpbGRlPTIyNztlLmF0bW9ub3NwYWNlPTY1MzEyO2UuYXRzbWFsbD02NTEzMTtlLmF0dXJuZWQ9NTkyO2UuYXViZW5nYWxpPTI0NTI7ZS5hdWJvcG9tb2ZvPTEyNTc2O2UuYXVkZXZhPTIzMjQ7ZS5hdWd1amFyYXRpPTI3MDg7ZS5hdWd1cm11a2hpPTI1ODA7ZS5hdWxlbmd0aG1hcmtiZW5nYWxpPTI1MTk7ZS5hdW1hdHJhZ3VybXVraGk9MjYzNjtlLmF1dm93ZWxzaWduYmVuZ2FsaT0yNTA4O2UuYXV2b3dlbHNpZ25kZXZhPTIzODA7ZS5hdXZvd2Vsc2lnbmd1amFyYXRpPTI3NjQ7ZS5hdmFncmFoYWRldmE9MjM2NTtlLmF5YmFybWVuaWFuPTEzNzc7ZS5heWluPTE1MDY7ZS5heWluYWx0b25laGVicmV3PTY0Mjg4O2UuYXlpbmhlYnJldz0xNTA2O2UuYj05ODtlLmJhYmVuZ2FsaT0yNDc2O2UuYmFja3NsYXNoPTkyO2UuYmFja3NsYXNobW9ub3NwYWNlPTY1MzQwO2UuYmFkZXZhPTIzNDg7ZS5iYWd1amFyYXRpPTI3MzI7ZS5iYWd1cm11a2hpPTI2MDQ7ZS5iYWhpcmFnYW5hPTEyNDAwO2UuYmFodHRoYWk9MzY0NztlLmJha2F0YWthbmE9MTI0OTY7ZS5iYXI9MTI0O2UuYmFybW9ub3NwYWNlPTY1MzcyO2UuYmJvcG9tb2ZvPTEyNTQ5O2UuYmNpcmNsZT05NDI1O2UuYmRvdGFjY2VudD03NjgzO2UuYmRvdGJlbG93PTc2ODU7ZS5iZWFtZWRzaXh0ZWVudGhub3Rlcz05ODM2O2UuYmVjYXVzZT04NzU3O2UuYmVjeXJpbGxpYz0xMDczO2UuYmVoYXJhYmljPTE1NzY7ZS5iZWhmaW5hbGFyYWJpYz02NTE2ODtlLmJlaGluaXRpYWxhcmFiaWM9NjUxNjk7ZS5iZWhpcmFnYW5hPTEyNDA5O2UuYmVobWVkaWFsYXJhYmljPTY1MTcwO2UuYmVobWVlbWluaXRpYWxhcmFiaWM9NjQ2NzE7ZS5iZWhtZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1MjA7ZS5iZWhub29uZmluYWxhcmFiaWM9NjQ2MjE7ZS5iZWthdGFrYW5hPTEyNTA1O2UuYmVuYXJtZW5pYW49MTM3ODtlLmJldD0xNDg5O2UuYmV0YT05NDY7ZS5iZXRhc3ltYm9sZ3JlZWs9OTc2O2UuYmV0ZGFnZXNoPTY0MzA1O2UuYmV0ZGFnZXNoaGVicmV3PTY0MzA1O2UuYmV0aGVicmV3PTE0ODk7ZS5iZXRyYWZlaGVicmV3PTY0MzMyO2UuYmhhYmVuZ2FsaT0yNDc3O2UuYmhhZGV2YT0yMzQ5O2UuYmhhZ3VqYXJhdGk9MjczMztlLmJoYWd1cm11a2hpPTI2MDU7ZS5iaG9vaz01OTU7ZS5iaWhpcmFnYW5hPTEyNDAzO2UuYmlrYXRha2FuYT0xMjQ5OTtlLmJpbGFiaWFsY2xpY2s9NjY0O2UuYmluZGlndXJtdWtoaT0yNTYyO2UuYmlydXNxdWFyZT0xMzEwNTtlLmJsYWNrY2lyY2xlPTk2Nzk7ZS5ibGFja2RpYW1vbmQ9OTY3MDtlLmJsYWNrZG93bnBvaW50aW5ndHJpYW5nbGU9OTY2MDtlLmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlcj05NjY4O2UuYmxhY2tsZWZ0cG9pbnRpbmd0cmlhbmdsZT05NjY0O2UuYmxhY2tsZW50aWN1bGFyYnJhY2tldGxlZnQ9MTIzMDQ7ZS5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdHZlcnRpY2FsPTY1MDgzO2UuYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0PTEyMzA1O2UuYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODQ7ZS5ibGFja2xvd2VybGVmdHRyaWFuZ2xlPTk2OTk7ZS5ibGFja2xvd2VycmlnaHR0cmlhbmdsZT05Njk4O2UuYmxhY2tyZWN0YW5nbGU9OTY0NDtlLmJsYWNrcmlnaHRwb2ludGluZ3BvaW50ZXI9OTY1ODtlLmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlPTk2NTQ7ZS5ibGFja3NtYWxsc3F1YXJlPTk2NDI7ZS5ibGFja3NtaWxpbmdmYWNlPTk3ODc7ZS5ibGFja3NxdWFyZT05NjMyO2UuYmxhY2tzdGFyPTk3MzM7ZS5ibGFja3VwcGVybGVmdHRyaWFuZ2xlPTk3MDA7ZS5ibGFja3VwcGVycmlnaHR0cmlhbmdsZT05NzAxO2UuYmxhY2t1cHBvaW50aW5nc21hbGx0cmlhbmdsZT05NjUyO2UuYmxhY2t1cHBvaW50aW5ndHJpYW5nbGU9OTY1MDtlLmJsYW5rPTkyNTE7ZS5ibGluZWJlbG93PTc2ODc7ZS5ibG9jaz05NjA4O2UuYm1vbm9zcGFjZT02NTM0NjtlLmJvYmFpbWFpdGhhaT0zNjEwO2UuYm9oaXJhZ2FuYT0xMjQxMjtlLmJva2F0YWthbmE9MTI1MDg7ZS5icGFyZW49OTM3MztlLmJxc3F1YXJlPTEzMjUxO2UuYnJhY2VleD02MzczMjtlLmJyYWNlbGVmdD0xMjM7ZS5icmFjZWxlZnRidD02MzczMTtlLmJyYWNlbGVmdG1pZD02MzczMDtlLmJyYWNlbGVmdG1vbm9zcGFjZT02NTM3MTtlLmJyYWNlbGVmdHNtYWxsPTY1MTE1O2UuYnJhY2VsZWZ0dHA9NjM3Mjk7ZS5icmFjZWxlZnR2ZXJ0aWNhbD02NTA3OTtlLmJyYWNlcmlnaHQ9MTI1O2UuYnJhY2VyaWdodGJ0PTYzNzQyO2UuYnJhY2VyaWdodG1pZD02Mzc0MTtlLmJyYWNlcmlnaHRtb25vc3BhY2U9NjUzNzM7ZS5icmFjZXJpZ2h0c21hbGw9NjUxMTY7ZS5icmFjZXJpZ2h0dHA9NjM3NDA7ZS5icmFjZXJpZ2h0dmVydGljYWw9NjUwODA7ZS5icmFja2V0bGVmdD05MTtlLmJyYWNrZXRsZWZ0YnQ9NjM3Mjg7ZS5icmFja2V0bGVmdGV4PTYzNzI3O2UuYnJhY2tldGxlZnRtb25vc3BhY2U9NjUzMzk7ZS5icmFja2V0bGVmdHRwPTYzNzI2O2UuYnJhY2tldHJpZ2h0PTkzO2UuYnJhY2tldHJpZ2h0YnQ9NjM3Mzk7ZS5icmFja2V0cmlnaHRleD02MzczODtlLmJyYWNrZXRyaWdodG1vbm9zcGFjZT02NTM0MTtlLmJyYWNrZXRyaWdodHRwPTYzNzM3O2UuYnJldmU9NzI4O2UuYnJldmViZWxvd2NtYj04MTQ7ZS5icmV2ZWNtYj03NzQ7ZS5icmV2ZWludmVydGVkYmVsb3djbWI9ODE1O2UuYnJldmVpbnZlcnRlZGNtYj03ODU7ZS5icmV2ZWludmVydGVkZG91YmxlY21iPTg2NTtlLmJyaWRnZWJlbG93Y21iPTgxMDtlLmJyaWRnZWludmVydGVkYmVsb3djbWI9ODI2O2UuYnJva2VuYmFyPTE2NjtlLmJzdHJva2U9Mzg0O2UuYnN1cGVyaW9yPTYzMjEwO2UuYnRvcGJhcj0zODc7ZS5idWhpcmFnYW5hPTEyNDA2O2UuYnVrYXRha2FuYT0xMjUwMjtlLmJ1bGxldD04MjI2O2UuYnVsbGV0aW52ZXJzZT05Njg4O2UuYnVsbGV0b3BlcmF0b3I9ODcyOTtlLmJ1bGxzZXllPTk2Nzg7ZS5jPTk5O2UuY2Fhcm1lbmlhbj0xMzkwO2UuY2FiZW5nYWxpPTI0NTg7ZS5jYWN1dGU9MjYzO2UuY2FkZXZhPTIzMzA7ZS5jYWd1amFyYXRpPTI3MTQ7ZS5jYWd1cm11a2hpPTI1ODY7ZS5jYWxzcXVhcmU9MTMxOTI7ZS5jYW5kcmFiaW5kdWJlbmdhbGk9MjQzMztlLmNhbmRyYWJpbmR1Y21iPTc4NDtlLmNhbmRyYWJpbmR1ZGV2YT0yMzA1O2UuY2FuZHJhYmluZHVndWphcmF0aT0yNjg5O2UuY2Fwc2xvY2s9ODY4MjtlLmNhcmVvZj04NDUzO2UuY2Fyb249NzExO2UuY2Fyb25iZWxvd2NtYj04MTI7ZS5jYXJvbmNtYj03ODA7ZS5jYXJyaWFnZXJldHVybj04NjI5O2UuY2JvcG9tb2ZvPTEyNTY4O2UuY2Nhcm9uPTI2OTtlLmNjZWRpbGxhPTIzMTtlLmNjZWRpbGxhYWN1dGU9NzY4OTtlLmNjaXJjbGU9OTQyNjtlLmNjaXJjdW1mbGV4PTI2NTtlLmNjdXJsPTU5NztlLmNkb3Q9MjY3O2UuY2RvdGFjY2VudD0yNjc7ZS5jZHNxdWFyZT0xMzI1MztlLmNlZGlsbGE9MTg0O2UuY2VkaWxsYWNtYj04MDc7ZS5jZW50PTE2MjtlLmNlbnRpZ3JhZGU9ODQ1MTtlLmNlbnRpbmZlcmlvcj02MzE5OTtlLmNlbnRtb25vc3BhY2U9NjU1MDQ7ZS5jZW50b2xkc3R5bGU9NjMzOTQ7ZS5jZW50c3VwZXJpb3I9NjMyMDA7ZS5jaGFhcm1lbmlhbj0xNDAxO2UuY2hhYmVuZ2FsaT0yNDU5O2UuY2hhZGV2YT0yMzMxO2UuY2hhZ3VqYXJhdGk9MjcxNTtlLmNoYWd1cm11a2hpPTI1ODc7ZS5jaGJvcG9tb2ZvPTEyNTY0O2UuY2hlYWJraGFzaWFuY3lyaWxsaWM9MTIxMztlLmNoZWNrbWFyaz0xMDAwMztlLmNoZWN5cmlsbGljPTEwOTU7ZS5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYz0xMjE1O2UuY2hlZGVzY2VuZGVyY3lyaWxsaWM9MTIwNztlLmNoZWRpZXJlc2lzY3lyaWxsaWM9MTI2OTtlLmNoZWhhcm1lbmlhbj0xMzk1O2UuY2hla2hha2Fzc2lhbmN5cmlsbGljPTEyMjg7ZS5jaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljPTEyMDk7ZS5jaGk9OTY3O2UuY2hpZXVjaGFjaXJjbGVrb3JlYW49MTI5MTk7ZS5jaGlldWNoYXBhcmVua29yZWFuPTEyODIzO2UuY2hpZXVjaGNpcmNsZWtvcmVhbj0xMjkwNTtlLmNoaWV1Y2hrb3JlYW49MTI2MTg7ZS5jaGlldWNocGFyZW5rb3JlYW49MTI4MDk7ZS5jaG9jaGFuZ3RoYWk9MzU5NDtlLmNob2NoYW50aGFpPTM1OTI7ZS5jaG9jaGluZ3RoYWk9MzU5MztlLmNob2Nob2V0aGFpPTM1OTY7ZS5jaG9vaz0zOTI7ZS5jaWV1Y2FjaXJjbGVrb3JlYW49MTI5MTg7ZS5jaWV1Y2FwYXJlbmtvcmVhbj0xMjgyMjtlLmNpZXVjY2lyY2xla29yZWFuPTEyOTA0O2UuY2lldWNrb3JlYW49MTI2MTY7ZS5jaWV1Y3BhcmVua29yZWFuPTEyODA4O2UuY2lldWN1cGFyZW5rb3JlYW49MTI4Mjg7ZS5jaXJjbGU9OTY3NTtlLmNpcmNsZWNvcHlydD0xNjk7ZS5jaXJjbGVtdWx0aXBseT04ODU1O2UuY2lyY2xlb3Q9ODg1NztlLmNpcmNsZXBsdXM9ODg1MztlLmNpcmNsZXBvc3RhbG1hcms9MTIzNDI7ZS5jaXJjbGV3aXRobGVmdGhhbGZibGFjaz05NjgwO2UuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrPTk2ODE7ZS5jaXJjdW1mbGV4PTcxMDtlLmNpcmN1bWZsZXhiZWxvd2NtYj04MTM7ZS5jaXJjdW1mbGV4Y21iPTc3MDtlLmNsZWFyPTg5OTk7ZS5jbGlja2FsdmVvbGFyPTQ1MDtlLmNsaWNrZGVudGFsPTQ0ODtlLmNsaWNrbGF0ZXJhbD00NDk7ZS5jbGlja3JldHJvZmxleD00NTE7ZS5jbHViPTk4Mjc7ZS5jbHVic3VpdGJsYWNrPTk4Mjc7ZS5jbHVic3VpdHdoaXRlPTk4MzE7ZS5jbWN1YmVkc3F1YXJlPTEzMjIwO2UuY21vbm9zcGFjZT02NTM0NztlLmNtc3F1YXJlZHNxdWFyZT0xMzIxNjtlLmNvYXJtZW5pYW49MTQwOTtlLmNvbG9uPTU4O2UuY29sb25tb25ldGFyeT04MzUzO2UuY29sb25tb25vc3BhY2U9NjUzMDY7ZS5jb2xvbnNpZ249ODM1MztlLmNvbG9uc21hbGw9NjUxMDk7ZS5jb2xvbnRyaWFuZ3VsYXJoYWxmbW9kPTcyMTtlLmNvbG9udHJpYW5ndWxhcm1vZD03MjA7ZS5jb21tYT00NDtlLmNvbW1hYWJvdmVjbWI9Nzg3O2UuY29tbWFhYm92ZXJpZ2h0Y21iPTc4OTtlLmNvbW1hYWNjZW50PTYzMTcxO2UuY29tbWFhcmFiaWM9MTU0ODtlLmNvbW1hYXJtZW5pYW49MTM3MztlLmNvbW1haW5mZXJpb3I9NjMyMDE7ZS5jb21tYW1vbm9zcGFjZT02NTI5MjtlLmNvbW1hcmV2ZXJzZWRhYm92ZWNtYj03ODg7ZS5jb21tYXJldmVyc2VkbW9kPTcwMTtlLmNvbW1hc21hbGw9NjUxMDQ7ZS5jb21tYXN1cGVyaW9yPTYzMjAyO2UuY29tbWF0dXJuZWRhYm92ZWNtYj03ODY7ZS5jb21tYXR1cm5lZG1vZD02OTk7ZS5jb21wYXNzPTk3ODg7ZS5jb25ncnVlbnQ9ODc3MztlLmNvbnRvdXJpbnRlZ3JhbD04NzUwO2UuY29udHJvbD04OTYzO2UuY29udHJvbEFDSz02O2UuY29udHJvbEJFTD03O2UuY29udHJvbEJTPTg7ZS5jb250cm9sQ0FOPTI0O2UuY29udHJvbENSPTEzO2UuY29udHJvbERDMT0xNztlLmNvbnRyb2xEQzI9MTg7ZS5jb250cm9sREMzPTE5O2UuY29udHJvbERDND0yMDtlLmNvbnRyb2xERUw9MTI3O2UuY29udHJvbERMRT0xNjtlLmNvbnRyb2xFTT0yNTtlLmNvbnRyb2xFTlE9NTtlLmNvbnRyb2xFT1Q9NDtlLmNvbnRyb2xFU0M9Mjc7ZS5jb250cm9sRVRCPTIzO2UuY29udHJvbEVUWD0zO2UuY29udHJvbEZGPTEyO2UuY29udHJvbEZTPTI4O2UuY29udHJvbEdTPTI5O2UuY29udHJvbEhUPTk7ZS5jb250cm9sTEY9MTA7ZS5jb250cm9sTkFLPTIxO2UuY29udHJvbE5VTEw9MDtlLmNvbnRyb2xSUz0zMDtlLmNvbnRyb2xTST0xNTtlLmNvbnRyb2xTTz0xNDtlLmNvbnRyb2xTT1Q9MjtlLmNvbnRyb2xTVFg9MTtlLmNvbnRyb2xTVUI9MjY7ZS5jb250cm9sU1lOPTIyO2UuY29udHJvbFVTPTMxO2UuY29udHJvbFZUPTExO2UuY29weXJpZ2h0PTE2OTtlLmNvcHlyaWdodHNhbnM9NjM3MjE7ZS5jb3B5cmlnaHRzZXJpZj02MzE5MztlLmNvcm5lcmJyYWNrZXRsZWZ0PTEyMzAwO2UuY29ybmVyYnJhY2tldGxlZnRoYWxmd2lkdGg9NjUzNzg7ZS5jb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsPTY1MDg5O2UuY29ybmVyYnJhY2tldHJpZ2h0PTEyMzAxO2UuY29ybmVyYnJhY2tldHJpZ2h0aGFsZndpZHRoPTY1Mzc5O2UuY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwOTA7ZS5jb3Jwb3JhdGlvbnNxdWFyZT0xMzE4MztlLmNvc3F1YXJlPTEzMjU1O2UuY292ZXJrZ3NxdWFyZT0xMzI1NDtlLmNwYXJlbj05Mzc0O2UuY3J1emVpcm89ODM1NDtlLmNzdHJldGNoZWQ9NjYzO2UuY3VybHlhbmQ9ODkxMTtlLmN1cmx5b3I9ODkxMDtlLmN1cnJlbmN5PTE2NDtlLmN5ckJyZXZlPTYzMTg1O2UuY3lyRmxleD02MzE4NjtlLmN5cmJyZXZlPTYzMTg4O2UuY3lyZmxleD02MzE4OTtlLmQ9MTAwO2UuZGFhcm1lbmlhbj0xMzgwO2UuZGFiZW5nYWxpPTI0NzA7ZS5kYWRhcmFiaWM9MTU5MDtlLmRhZGV2YT0yMzQyO2UuZGFkZmluYWxhcmFiaWM9NjUyMTQ7ZS5kYWRpbml0aWFsYXJhYmljPTY1MjE1O2UuZGFkbWVkaWFsYXJhYmljPTY1MjE2O2UuZGFnZXNoPTE0Njg7ZS5kYWdlc2hoZWJyZXc9MTQ2ODtlLmRhZ2dlcj04MjI0O2UuZGFnZ2VyZGJsPTgyMjU7ZS5kYWd1amFyYXRpPTI3MjY7ZS5kYWd1cm11a2hpPTI1OTg7ZS5kYWhpcmFnYW5hPTEyMzg0O2UuZGFrYXRha2FuYT0xMjQ4MDtlLmRhbGFyYWJpYz0xNTgzO2UuZGFsZXQ9MTQ5MTtlLmRhbGV0ZGFnZXNoPTY0MzA3O2UuZGFsZXRkYWdlc2hoZWJyZXc9NjQzMDc7ZS5kYWxldGhlYnJldz0xNDkxO2UuZGFsZmluYWxhcmFiaWM9NjUxOTQ7ZS5kYW1tYWFyYWJpYz0xNjE1O2UuZGFtbWFsb3dhcmFiaWM9MTYxNTtlLmRhbW1hdGFuYWx0b25lYXJhYmljPTE2MTI7ZS5kYW1tYXRhbmFyYWJpYz0xNjEyO2UuZGFuZGE9MjQwNDtlLmRhcmdhaGVicmV3PTE0NDc7ZS5kYXJnYWxlZnRoZWJyZXc9MTQ0NztlLmRhc2lhcG5ldW1hdGFjeXJpbGxpY2NtYj0xMTU3O2UuZGJsR3JhdmU9NjMxODc7ZS5kYmxhbmdsZWJyYWNrZXRsZWZ0PTEyMjk4O2UuZGJsYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsPTY1MDg1O2UuZGJsYW5nbGVicmFja2V0cmlnaHQ9MTIyOTk7ZS5kYmxhbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsPTY1MDg2O2UuZGJsYXJjaGludmVydGVkYmVsb3djbWI9ODExO2UuZGJsYXJyb3dsZWZ0PTg2NjA7ZS5kYmxhcnJvd3JpZ2h0PTg2NTg7ZS5kYmxkYW5kYT0yNDA1O2UuZGJsZ3JhdmU9NjMxOTA7ZS5kYmxncmF2ZWNtYj03ODM7ZS5kYmxpbnRlZ3JhbD04NzQ4O2UuZGJsbG93bGluZT04MjE1O2UuZGJsbG93bGluZWNtYj04MTk7ZS5kYmxvdmVybGluZWNtYj04MzE7ZS5kYmxwcmltZW1vZD02OTg7ZS5kYmx2ZXJ0aWNhbGJhcj04MjE0O2UuZGJsdmVydGljYWxsaW5lYWJvdmVjbWI9NzgyO2UuZGJvcG9tb2ZvPTEyNTUzO2UuZGJzcXVhcmU9MTMyNTY7ZS5kY2Fyb249MjcxO2UuZGNlZGlsbGE9NzY5NztlLmRjaXJjbGU9OTQyNztlLmRjaXJjdW1mbGV4YmVsb3c9NzY5OTtlLmRjcm9hdD0yNzM7ZS5kZGFiZW5nYWxpPTI0NjU7ZS5kZGFkZXZhPTIzMzc7ZS5kZGFndWphcmF0aT0yNzIxO2UuZGRhZ3VybXVraGk9MjU5MztlLmRkYWxhcmFiaWM9MTY3MjtlLmRkYWxmaW5hbGFyYWJpYz02NDM5MztlLmRkZGhhZGV2YT0yMzk2O2UuZGRoYWJlbmdhbGk9MjQ2NjtlLmRkaGFkZXZhPTIzMzg7ZS5kZGhhZ3VqYXJhdGk9MjcyMjtlLmRkaGFndXJtdWtoaT0yNTk0O2UuZGRvdGFjY2VudD03NjkxO2UuZGRvdGJlbG93PTc2OTM7ZS5kZWNpbWFsc2VwYXJhdG9yYXJhYmljPTE2NDM7ZS5kZWNpbWFsc2VwYXJhdG9ycGVyc2lhbj0xNjQzO2UuZGVjeXJpbGxpYz0xMDc2O2UuZGVncmVlPTE3NjtlLmRlaGloZWJyZXc9MTQ1MztlLmRlaGlyYWdhbmE9MTIzOTE7ZS5kZWljb3B0aWM9MTAwNztlLmRla2F0YWthbmE9MTI0ODc7ZS5kZWxldGVsZWZ0PTkwMDM7ZS5kZWxldGVyaWdodD04OTk4O2UuZGVsdGE9OTQ4O2UuZGVsdGF0dXJuZWQ9Mzk3O2UuZGVub21pbmF0b3JtaW51c29uZW51bWVyYXRvcmJlbmdhbGk9MjU1MjtlLmRlemg9Njc2O2UuZGhhYmVuZ2FsaT0yNDcxO2UuZGhhZGV2YT0yMzQzO2UuZGhhZ3VqYXJhdGk9MjcyNztlLmRoYWd1cm11a2hpPTI1OTk7ZS5kaG9vaz01OTk7ZS5kaWFseXRpa2F0b25vcz05MDE7ZS5kaWFseXRpa2F0b25vc2NtYj04MzY7ZS5kaWFtb25kPTk4MzA7ZS5kaWFtb25kc3VpdHdoaXRlPTk4MjY7ZS5kaWVyZXNpcz0xNjg7ZS5kaWVyZXNpc2FjdXRlPTYzMTkxO2UuZGllcmVzaXNiZWxvd2NtYj04MDQ7ZS5kaWVyZXNpc2NtYj03NzY7ZS5kaWVyZXNpc2dyYXZlPTYzMTkyO2UuZGllcmVzaXN0b25vcz05MDE7ZS5kaWhpcmFnYW5hPTEyMzg2O2UuZGlrYXRha2FuYT0xMjQ4MjtlLmRpdHRvbWFyaz0xMjI5MTtlLmRpdmlkZT0yNDc7ZS5kaXZpZGVzPTg3Mzk7ZS5kaXZpc2lvbnNsYXNoPTg3MjU7ZS5kamVjeXJpbGxpYz0xMTA2O2UuZGtzaGFkZT05NjE5O2UuZGxpbmViZWxvdz03Njk1O2UuZGxzcXVhcmU9MTMyMDc7ZS5kbWFjcm9uPTI3MztlLmRtb25vc3BhY2U9NjUzNDg7ZS5kbmJsb2NrPTk2MDQ7ZS5kb2NoYWRhdGhhaT0zNTk4O2UuZG9kZWt0aGFpPTM2MDQ7ZS5kb2hpcmFnYW5hPTEyMzkzO2UuZG9rYXRha2FuYT0xMjQ4OTtlLmRvbGxhcj0zNjtlLmRvbGxhcmluZmVyaW9yPTYzMjAzO2UuZG9sbGFybW9ub3NwYWNlPTY1Mjg0O2UuZG9sbGFyb2xkc3R5bGU9NjMyNjg7ZS5kb2xsYXJzbWFsbD02NTEyOTtlLmRvbGxhcnN1cGVyaW9yPTYzMjA0O2UuZG9uZz04MzYzO2UuZG9ydXNxdWFyZT0xMzA5NDtlLmRvdGFjY2VudD03Mjk7ZS5kb3RhY2NlbnRjbWI9Nzc1O2UuZG90YmVsb3djbWI9ODAzO2UuZG90YmVsb3djb21iPTgwMztlLmRvdGthdGFrYW5hPTEyNTM5O2UuZG90bGVzc2k9MzA1O2UuZG90bGVzc2o9NjMxNjY7ZS5kb3RsZXNzanN0cm9rZWhvb2s9NjQ0O2UuZG90bWF0aD04OTAxO2UuZG90dGVkY2lyY2xlPTk2NzY7ZS5kb3VibGV5b2RwYXRhaD02NDI4NztlLmRvdWJsZXlvZHBhdGFoaGVicmV3PTY0Mjg3O2UuZG93bnRhY2tiZWxvd2NtYj03OTg7ZS5kb3dudGFja21vZD03MjU7ZS5kcGFyZW49OTM3NTtlLmRzdXBlcmlvcj02MzIxMTtlLmR0YWlsPTU5ODtlLmR0b3BiYXI9Mzk2O2UuZHVoaXJhZ2FuYT0xMjM4OTtlLmR1a2F0YWthbmE9MTI0ODU7ZS5kej00OTk7ZS5kemFsdG9uZT02NzU7ZS5kemNhcm9uPTQ1NDtlLmR6Y3VybD02Nzc7ZS5kemVhYmtoYXNpYW5jeXJpbGxpYz0xMjQ5O2UuZHplY3lyaWxsaWM9MTEwOTtlLmR6aGVjeXJpbGxpYz0xMTE5O2UuZT0xMDE7ZS5lYWN1dGU9MjMzO2UuZWFydGg9OTc5MztlLmViZW5nYWxpPTI0NDc7ZS5lYm9wb21vZm89MTI1NzI7ZS5lYnJldmU9Mjc3O2UuZWNhbmRyYWRldmE9MjMxNztlLmVjYW5kcmFndWphcmF0aT0yNzAxO2UuZWNhbmRyYXZvd2Vsc2lnbmRldmE9MjM3MztlLmVjYW5kcmF2b3dlbHNpZ25ndWphcmF0aT0yNzU3O2UuZWNhcm9uPTI4MztlLmVjZWRpbGxhYnJldmU9NzcwOTtlLmVjaGFybWVuaWFuPTEzODE7ZS5lY2h5aXduYXJtZW5pYW49MTQxNTtlLmVjaXJjbGU9OTQyODtlLmVjaXJjdW1mbGV4PTIzNDtlLmVjaXJjdW1mbGV4YWN1dGU9Nzg3MTtlLmVjaXJjdW1mbGV4YmVsb3c9NzcwNTtlLmVjaXJjdW1mbGV4ZG90YmVsb3c9Nzg3OTtlLmVjaXJjdW1mbGV4Z3JhdmU9Nzg3MztlLmVjaXJjdW1mbGV4aG9va2Fib3ZlPTc4NzU7ZS5lY2lyY3VtZmxleHRpbGRlPTc4Nzc7ZS5lY3lyaWxsaWM9MTEwODtlLmVkYmxncmF2ZT01MTc7ZS5lZGV2YT0yMzE5O2UuZWRpZXJlc2lzPTIzNTtlLmVkb3Q9Mjc5O2UuZWRvdGFjY2VudD0yNzk7ZS5lZG90YmVsb3c9Nzg2NTtlLmVlZ3VybXVraGk9MjU3NTtlLmVlbWF0cmFndXJtdWtoaT0yNjMxO2UuZWZjeXJpbGxpYz0xMDkyO2UuZWdyYXZlPTIzMjtlLmVndWphcmF0aT0yNzAzO2UuZWhhcm1lbmlhbj0xMzgzO2UuZWhib3BvbW9mbz0xMjU3MztlLmVoaXJhZ2FuYT0xMjM2MDtlLmVob29rYWJvdmU9Nzg2NztlLmVpYm9wb21vZm89MTI1NzU7ZS5laWdodD01NjtlLmVpZ2h0YXJhYmljPTE2NDA7ZS5laWdodGJlbmdhbGk9MjU0MjtlLmVpZ2h0Y2lyY2xlPTkzMTk7ZS5laWdodGNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjk7ZS5laWdodGRldmE9MjQxNDtlLmVpZ2h0ZWVuY2lyY2xlPTkzMjk7ZS5laWdodGVlbnBhcmVuPTkzNDk7ZS5laWdodGVlbnBlcmlvZD05MzY5O2UuZWlnaHRndWphcmF0aT0yNzk4O2UuZWlnaHRndXJtdWtoaT0yNjcwO2UuZWlnaHRoYWNrYXJhYmljPTE2NDA7ZS5laWdodGhhbmd6aG91PTEyMzI4O2UuZWlnaHRobm90ZWJlYW1lZD05ODM1O2UuZWlnaHRpZGVvZ3JhcGhpY3BhcmVuPTEyODM5O2UuZWlnaHRpbmZlcmlvcj04MzI4O2UuZWlnaHRtb25vc3BhY2U9NjUzMDQ7ZS5laWdodG9sZHN0eWxlPTYzMjg4O2UuZWlnaHRwYXJlbj05MzM5O2UuZWlnaHRwZXJpb2Q9OTM1OTtlLmVpZ2h0cGVyc2lhbj0xNzg0O2UuZWlnaHRyb21hbj04NTY3O2UuZWlnaHRzdXBlcmlvcj04MzEyO2UuZWlnaHR0aGFpPTM2NzI7ZS5laW52ZXJ0ZWRicmV2ZT01MTk7ZS5laW90aWZpZWRjeXJpbGxpYz0xMTI1O2UuZWthdGFrYW5hPTEyNDU2O2UuZWthdGFrYW5haGFsZndpZHRoPTY1Mzk2O2UuZWtvbmthcmd1cm11a2hpPTI2NzY7ZS5la29yZWFuPTEyNjI4O2UuZWxjeXJpbGxpYz0xMDgzO2UuZWxlbWVudD04NzEyO2UuZWxldmVuY2lyY2xlPTkzMjI7ZS5lbGV2ZW5wYXJlbj05MzQyO2UuZWxldmVucGVyaW9kPTkzNjI7ZS5lbGV2ZW5yb21hbj04NTcwO2UuZWxsaXBzaXM9ODIzMDtlLmVsbGlwc2lzdmVydGljYWw9ODk0MjtlLmVtYWNyb249Mjc1O2UuZW1hY3JvbmFjdXRlPTc3MDM7ZS5lbWFjcm9uZ3JhdmU9NzcwMTtlLmVtY3lyaWxsaWM9MTA4NDtlLmVtZGFzaD04MjEyO2UuZW1kYXNodmVydGljYWw9NjUwNzM7ZS5lbW9ub3NwYWNlPTY1MzQ5O2UuZW1waGFzaXNtYXJrYXJtZW5pYW49MTM3MTtlLmVtcHR5c2V0PTg3MDk7ZS5lbmJvcG9tb2ZvPTEyNTc5O2UuZW5jeXJpbGxpYz0xMDg1O2UuZW5kYXNoPTgyMTE7ZS5lbmRhc2h2ZXJ0aWNhbD02NTA3NDtlLmVuZGVzY2VuZGVyY3lyaWxsaWM9MTE4NztlLmVuZz0zMzE7ZS5lbmdib3BvbW9mbz0xMjU4MTtlLmVuZ2hlY3lyaWxsaWM9MTE4OTtlLmVuaG9va2N5cmlsbGljPTEyMjQ7ZS5lbnNwYWNlPTgxOTQ7ZS5lb2dvbmVrPTI4MTtlLmVva29yZWFuPTEyNjI3O2UuZW9wZW49NjAzO2UuZW9wZW5jbG9zZWQ9NjY2O2UuZW9wZW5yZXZlcnNlZD02MDQ7ZS5lb3BlbnJldmVyc2VkY2xvc2VkPTYwNjtlLmVvcGVucmV2ZXJzZWRob29rPTYwNTtlLmVwYXJlbj05Mzc2O2UuZXBzaWxvbj05NDk7ZS5lcHNpbG9udG9ub3M9OTQxO2UuZXF1YWw9NjE7ZS5lcXVhbG1vbm9zcGFjZT02NTMwOTtlLmVxdWFsc21hbGw9NjUxMjY7ZS5lcXVhbHN1cGVyaW9yPTgzMTY7ZS5lcXVpdmFsZW5jZT04ODAxO2UuZXJib3BvbW9mbz0xMjU4MjtlLmVyY3lyaWxsaWM9MTA4ODtlLmVyZXZlcnNlZD02MDA7ZS5lcmV2ZXJzZWRjeXJpbGxpYz0xMTAxO2UuZXNjeXJpbGxpYz0xMDg5O2UuZXNkZXNjZW5kZXJjeXJpbGxpYz0xMTk1O2UuZXNoPTY0MztlLmVzaGN1cmw9NjQ2O2UuZXNob3J0ZGV2YT0yMzE4O2UuZXNob3J0dm93ZWxzaWduZGV2YT0yMzc0O2UuZXNocmV2ZXJzZWRsb29wPTQyNjtlLmVzaHNxdWF0cmV2ZXJzZWQ9NjQ1O2UuZXNtYWxsaGlyYWdhbmE9MTIzNTk7ZS5lc21hbGxrYXRha2FuYT0xMjQ1NTtlLmVzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg2O2UuZXN0aW1hdGVkPTg0OTQ7ZS5lc3VwZXJpb3I9NjMyMTI7ZS5ldGE9OTUxO2UuZXRhcm1lbmlhbj0xMzg0O2UuZXRhdG9ub3M9OTQyO2UuZXRoPTI0MDtlLmV0aWxkZT03ODY5O2UuZXRpbGRlYmVsb3c9NzcwNztlLmV0bmFodGFmb3VraGhlYnJldz0xNDI1O2UuZXRuYWh0YWZvdWtobGVmdGhlYnJldz0xNDI1O2UuZXRuYWh0YWhlYnJldz0xNDI1O2UuZXRuYWh0YWxlZnRoZWJyZXc9MTQyNTtlLmV0dXJuZWQ9NDc3O2UuZXVrb3JlYW49MTI2NDE7ZS5ldXJvPTgzNjQ7ZS5ldm93ZWxzaWduYmVuZ2FsaT0yNTAzO2UuZXZvd2Vsc2lnbmRldmE9MjM3NTtlLmV2b3dlbHNpZ25ndWphcmF0aT0yNzU5O2UuZXhjbGFtPTMzO2UuZXhjbGFtYXJtZW5pYW49MTM3MjtlLmV4Y2xhbWRibD04MjUyO2UuZXhjbGFtZG93bj0xNjE7ZS5leGNsYW1kb3duc21hbGw9NjMzOTM7ZS5leGNsYW1tb25vc3BhY2U9NjUyODE7ZS5leGNsYW1zbWFsbD02MzI2NTtlLmV4aXN0ZW50aWFsPTg3MDc7ZS5lemg9NjU4O2UuZXpoY2Fyb249NDk1O2UuZXpoY3VybD02NTk7ZS5lemhyZXZlcnNlZD00NDE7ZS5lemh0YWlsPTQ0MjtlLmY9MTAyO2UuZmFkZXZhPTIzOTg7ZS5mYWd1cm11a2hpPTI2NTQ7ZS5mYWhyZW5oZWl0PTg0NTc7ZS5mYXRoYWFyYWJpYz0xNjE0O2UuZmF0aGFsb3dhcmFiaWM9MTYxNDtlLmZhdGhhdGFuYXJhYmljPTE2MTE7ZS5mYm9wb21vZm89MTI1NTI7ZS5mY2lyY2xlPTk0Mjk7ZS5mZG90YWNjZW50PTc3MTE7ZS5mZWhhcmFiaWM9MTYwMTtlLmZlaGFybWVuaWFuPTE0MTQ7ZS5mZWhmaW5hbGFyYWJpYz02NTIzNDtlLmZlaGluaXRpYWxhcmFiaWM9NjUyMzU7ZS5mZWhtZWRpYWxhcmFiaWM9NjUyMzY7ZS5mZWljb3B0aWM9OTk3O2UuZmVtYWxlPTk3OTI7ZS5mZj02NDI1NjtlLmZfZj02NDI1NjtlLmZmaT02NDI1OTtlLmZmbD02NDI2MDtlLmZpPTY0MjU3O2UuZmlmdGVlbmNpcmNsZT05MzI2O2UuZmlmdGVlbnBhcmVuPTkzNDY7ZS5maWZ0ZWVucGVyaW9kPTkzNjY7ZS5maWd1cmVkYXNoPTgyMTA7ZS5maWxsZWRib3g9OTYzMjtlLmZpbGxlZHJlY3Q9OTY0NDtlLmZpbmFsa2FmPTE0OTg7ZS5maW5hbGthZmRhZ2VzaD02NDMxNDtlLmZpbmFsa2FmZGFnZXNoaGVicmV3PTY0MzE0O2UuZmluYWxrYWZoZWJyZXc9MTQ5ODtlLmZpbmFsbWVtPTE1MDE7ZS5maW5hbG1lbWhlYnJldz0xNTAxO2UuZmluYWxudW49MTUwMztlLmZpbmFsbnVuaGVicmV3PTE1MDM7ZS5maW5hbHBlPTE1MDc7ZS5maW5hbHBlaGVicmV3PTE1MDc7ZS5maW5hbHRzYWRpPTE1MDk7ZS5maW5hbHRzYWRpaGVicmV3PTE1MDk7ZS5maXJzdHRvbmVjaGluZXNlPTcxMztlLmZpc2hleWU9OTY3MztlLmZpdGFjeXJpbGxpYz0xMTM5O2UuZml2ZT01MztlLmZpdmVhcmFiaWM9MTYzNztlLmZpdmViZW5nYWxpPTI1Mzk7ZS5maXZlY2lyY2xlPTkzMTY7ZS5maXZlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNjtlLmZpdmVkZXZhPTI0MTE7ZS5maXZlZWlnaHRocz04NTQxO2UuZml2ZWd1amFyYXRpPTI3OTU7ZS5maXZlZ3VybXVraGk9MjY2NztlLmZpdmVoYWNrYXJhYmljPTE2Mzc7ZS5maXZlaGFuZ3pob3U9MTIzMjU7ZS5maXZlaWRlb2dyYXBoaWNwYXJlbj0xMjgzNjtlLmZpdmVpbmZlcmlvcj04MzI1O2UuZml2ZW1vbm9zcGFjZT02NTMwMTtlLmZpdmVvbGRzdHlsZT02MzI4NTtlLmZpdmVwYXJlbj05MzM2O2UuZml2ZXBlcmlvZD05MzU2O2UuZml2ZXBlcnNpYW49MTc4MTtlLmZpdmVyb21hbj04NTY0O2UuZml2ZXN1cGVyaW9yPTgzMDk7ZS5maXZldGhhaT0zNjY5O2UuZmw9NjQyNTg7ZS5mbG9yaW49NDAyO2UuZm1vbm9zcGFjZT02NTM1MDtlLmZtc3F1YXJlPTEzMjA5O2UuZm9mYW50aGFpPTM2MTU7ZS5mb2ZhdGhhaT0zNjEzO2UuZm9uZ21hbnRoYWk9MzY2MztlLmZvcmFsbD04NzA0O2UuZm91cj01MjtlLmZvdXJhcmFiaWM9MTYzNjtlLmZvdXJiZW5nYWxpPTI1Mzg7ZS5mb3VyY2lyY2xlPTkzMTU7ZS5mb3VyY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNTtlLmZvdXJkZXZhPTI0MTA7ZS5mb3VyZ3VqYXJhdGk9Mjc5NDtlLmZvdXJndXJtdWtoaT0yNjY2O2UuZm91cmhhY2thcmFiaWM9MTYzNjtlLmZvdXJoYW5nemhvdT0xMjMyNDtlLmZvdXJpZGVvZ3JhcGhpY3BhcmVuPTEyODM1O2UuZm91cmluZmVyaW9yPTgzMjQ7ZS5mb3VybW9ub3NwYWNlPTY1MzAwO2UuZm91cm51bWVyYXRvcmJlbmdhbGk9MjU1MTtlLmZvdXJvbGRzdHlsZT02MzI4NDtlLmZvdXJwYXJlbj05MzM1O2UuZm91cnBlcmlvZD05MzU1O2UuZm91cnBlcnNpYW49MTc4MDtlLmZvdXJyb21hbj04NTYzO2UuZm91cnN1cGVyaW9yPTgzMDg7ZS5mb3VydGVlbmNpcmNsZT05MzI1O2UuZm91cnRlZW5wYXJlbj05MzQ1O2UuZm91cnRlZW5wZXJpb2Q9OTM2NTtlLmZvdXJ0aGFpPTM2Njg7ZS5mb3VydGh0b25lY2hpbmVzZT03MTU7ZS5mcGFyZW49OTM3NztlLmZyYWN0aW9uPTgyNjA7ZS5mcmFuYz04MzU1O2UuZz0xMDM7ZS5nYWJlbmdhbGk9MjQ1NTtlLmdhY3V0ZT01MDE7ZS5nYWRldmE9MjMyNztlLmdhZmFyYWJpYz0xNzExO2UuZ2FmZmluYWxhcmFiaWM9NjQ0MDM7ZS5nYWZpbml0aWFsYXJhYmljPTY0NDA0O2UuZ2FmbWVkaWFsYXJhYmljPTY0NDA1O2UuZ2FndWphcmF0aT0yNzExO2UuZ2FndXJtdWtoaT0yNTgzO2UuZ2FoaXJhZ2FuYT0xMjM2NDtlLmdha2F0YWthbmE9MTI0NjA7ZS5nYW1tYT05NDc7ZS5nYW1tYWxhdGluc21hbGw9NjExO2UuZ2FtbWFzdXBlcmlvcj03MzY7ZS5nYW5naWFjb3B0aWM9MTAwMztlLmdib3BvbW9mbz0xMjU1NztlLmdicmV2ZT0yODc7ZS5nY2Fyb249NDg3O2UuZ2NlZGlsbGE9MjkxO2UuZ2NpcmNsZT05NDMwO2UuZ2NpcmN1bWZsZXg9Mjg1O2UuZ2NvbW1hYWNjZW50PTI5MTtlLmdkb3Q9Mjg5O2UuZ2RvdGFjY2VudD0yODk7ZS5nZWN5cmlsbGljPTEwNzU7ZS5nZWhpcmFnYW5hPTEyMzcwO2UuZ2VrYXRha2FuYT0xMjQ2NjtlLmdlb21ldHJpY2FsbHllcXVhbD04Nzg1O2UuZ2VyZXNoYWNjZW50aGVicmV3PTE0MzY7ZS5nZXJlc2hoZWJyZXc9MTUyMztlLmdlcmVzaG11cWRhbWhlYnJldz0xNDM3O2UuZ2VybWFuZGJscz0yMjM7ZS5nZXJzaGF5aW1hY2NlbnRoZWJyZXc9MTQzODtlLmdlcnNoYXlpbWhlYnJldz0xNTI0O2UuZ2V0YW1hcms9MTIzMDc7ZS5naGFiZW5nYWxpPTI0NTY7ZS5naGFkYXJtZW5pYW49MTM5NDtlLmdoYWRldmE9MjMyODtlLmdoYWd1amFyYXRpPTI3MTI7ZS5naGFndXJtdWtoaT0yNTg0O2UuZ2hhaW5hcmFiaWM9MTU5NDtlLmdoYWluZmluYWxhcmFiaWM9NjUyMzA7ZS5naGFpbmluaXRpYWxhcmFiaWM9NjUyMzE7ZS5naGFpbm1lZGlhbGFyYWJpYz02NTIzMjtlLmdoZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTczO2UuZ2hlc3Ryb2tlY3lyaWxsaWM9MTE3MTtlLmdoZXVwdHVybmN5cmlsbGljPTExNjk7ZS5naGhhZGV2YT0yMzk0O2UuZ2hoYWd1cm11a2hpPTI2NTA7ZS5naG9vaz02MDg7ZS5naHpzcXVhcmU9MTMyMDM7ZS5naWhpcmFnYW5hPTEyMzY2O2UuZ2lrYXRha2FuYT0xMjQ2MjtlLmdpbWFybWVuaWFuPTEzNzk7ZS5naW1lbD0xNDkwO2UuZ2ltZWxkYWdlc2g9NjQzMDY7ZS5naW1lbGRhZ2VzaGhlYnJldz02NDMwNjtlLmdpbWVsaGVicmV3PTE0OTA7ZS5namVjeXJpbGxpYz0xMTA3O2UuZ2xvdHRhbGludmVydGVkc3Ryb2tlPTQ0NjtlLmdsb3R0YWxzdG9wPTY2MDtlLmdsb3R0YWxzdG9waW52ZXJ0ZWQ9NjYyO2UuZ2xvdHRhbHN0b3Btb2Q9NzA0O2UuZ2xvdHRhbHN0b3ByZXZlcnNlZD02NjE7ZS5nbG90dGFsc3RvcHJldmVyc2VkbW9kPTcwNTtlLmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvcj03NDA7ZS5nbG90dGFsc3RvcHN0cm9rZT02NzM7ZS5nbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkPTY3NDtlLmdtYWNyb249NzcxMztlLmdtb25vc3BhY2U9NjUzNTE7ZS5nb2hpcmFnYW5hPTEyMzcyO2UuZ29rYXRha2FuYT0xMjQ2ODtlLmdwYXJlbj05Mzc4O2UuZ3Bhc3F1YXJlPTEzMjI4O2UuZ3JhZGllbnQ9ODcxMTtlLmdyYXZlPTk2O2UuZ3JhdmViZWxvd2NtYj03OTA7ZS5ncmF2ZWNtYj03Njg7ZS5ncmF2ZWNvbWI9NzY4O2UuZ3JhdmVkZXZhPTIzODc7ZS5ncmF2ZWxvd21vZD03MTg7ZS5ncmF2ZW1vbm9zcGFjZT02NTM0NDtlLmdyYXZldG9uZWNtYj04MzI7ZS5ncmVhdGVyPTYyO2UuZ3JlYXRlcmVxdWFsPTg4MDU7ZS5ncmVhdGVyZXF1YWxvcmxlc3M9ODkyMztlLmdyZWF0ZXJtb25vc3BhY2U9NjUzMTA7ZS5ncmVhdGVyb3JlcXVpdmFsZW50PTg4MTk7ZS5ncmVhdGVyb3JsZXNzPTg4MjM7ZS5ncmVhdGVyb3ZlcmVxdWFsPTg4MDc7ZS5ncmVhdGVyc21hbGw9NjUxMjU7ZS5nc2NyaXB0PTYwOTtlLmdzdHJva2U9NDg1O2UuZ3VoaXJhZ2FuYT0xMjM2ODtlLmd1aWxsZW1vdGxlZnQ9MTcxO2UuZ3VpbGxlbW90cmlnaHQ9MTg3O2UuZ3VpbHNpbmdsbGVmdD04MjQ5O2UuZ3VpbHNpbmdscmlnaHQ9ODI1MDtlLmd1a2F0YWthbmE9MTI0NjQ7ZS5ndXJhbXVzcXVhcmU9MTMwODA7ZS5neXNxdWFyZT0xMzI1NztlLmg9MTA0O2UuaGFhYmtoYXNpYW5jeXJpbGxpYz0xMTkzO2UuaGFhbHRvbmVhcmFiaWM9MTcyOTtlLmhhYmVuZ2FsaT0yNDg5O2UuaGFkZXNjZW5kZXJjeXJpbGxpYz0xMjAzO2UuaGFkZXZhPTIzNjE7ZS5oYWd1amFyYXRpPTI3NDU7ZS5oYWd1cm11a2hpPTI2MTc7ZS5oYWhhcmFiaWM9MTU4MTtlLmhhaGZpbmFsYXJhYmljPTY1MTg2O2UuaGFoaW5pdGlhbGFyYWJpYz02NTE4NztlLmhhaGlyYWdhbmE9MTIzOTk7ZS5oYWhtZWRpYWxhcmFiaWM9NjUxODg7ZS5oYWl0dXNxdWFyZT0xMzA5ODtlLmhha2F0YWthbmE9MTI0OTU7ZS5oYWthdGFrYW5haGFsZndpZHRoPTY1NDE4O2UuaGFsYW50Z3VybXVraGk9MjYzNztlLmhhbXphYXJhYmljPTE1Njk7ZS5oYW16YWxvd2FyYWJpYz0xNTY5O2UuaGFuZ3VsZmlsbGVyPTEyNjQ0O2UuaGFyZHNpZ25jeXJpbGxpYz0xMDk4O2UuaGFycG9vbmxlZnRiYXJidXA9ODYzNjtlLmhhcnBvb25yaWdodGJhcmJ1cD04NjQwO2UuaGFzcXVhcmU9MTMyNTg7ZS5oYXRhZnBhdGFoPTE0NTg7ZS5oYXRhZnBhdGFoMTY9MTQ1ODtlLmhhdGFmcGF0YWgyMz0xNDU4O2UuaGF0YWZwYXRhaDJmPTE0NTg7ZS5oYXRhZnBhdGFoaGVicmV3PTE0NTg7ZS5oYXRhZnBhdGFobmFycm93aGVicmV3PTE0NTg7ZS5oYXRhZnBhdGFocXVhcnRlcmhlYnJldz0xNDU4O2UuaGF0YWZwYXRhaHdpZGVoZWJyZXc9MTQ1ODtlLmhhdGFmcWFtYXRzPTE0NTk7ZS5oYXRhZnFhbWF0czFiPTE0NTk7ZS5oYXRhZnFhbWF0czI4PTE0NTk7ZS5oYXRhZnFhbWF0czM0PTE0NTk7ZS5oYXRhZnFhbWF0c2hlYnJldz0xNDU5O2UuaGF0YWZxYW1hdHNuYXJyb3doZWJyZXc9MTQ1OTtlLmhhdGFmcWFtYXRzcXVhcnRlcmhlYnJldz0xNDU5O2UuaGF0YWZxYW1hdHN3aWRlaGVicmV3PTE0NTk7ZS5oYXRhZnNlZ29sPTE0NTc7ZS5oYXRhZnNlZ29sMTc9MTQ1NztlLmhhdGFmc2Vnb2wyND0xNDU3O2UuaGF0YWZzZWdvbDMwPTE0NTc7ZS5oYXRhZnNlZ29saGVicmV3PTE0NTc7ZS5oYXRhZnNlZ29sbmFycm93aGVicmV3PTE0NTc7ZS5oYXRhZnNlZ29scXVhcnRlcmhlYnJldz0xNDU3O2UuaGF0YWZzZWdvbHdpZGVoZWJyZXc9MTQ1NztlLmhiYXI9Mjk1O2UuaGJvcG9tb2ZvPTEyNTU5O2UuaGJyZXZlYmVsb3c9NzcyMztlLmhjZWRpbGxhPTc3MjE7ZS5oY2lyY2xlPTk0MzE7ZS5oY2lyY3VtZmxleD0yOTM7ZS5oZGllcmVzaXM9NzcxOTtlLmhkb3RhY2NlbnQ9NzcxNTtlLmhkb3RiZWxvdz03NzE3O2UuaGU9MTQ5MjtlLmhlYXJ0PTk4Mjk7ZS5oZWFydHN1aXRibGFjaz05ODI5O2UuaGVhcnRzdWl0d2hpdGU9OTgyNTtlLmhlZGFnZXNoPTY0MzA4O2UuaGVkYWdlc2hoZWJyZXc9NjQzMDg7ZS5oZWhhbHRvbmVhcmFiaWM9MTcyOTtlLmhlaGFyYWJpYz0xNjA3O2UuaGVoZWJyZXc9MTQ5MjtlLmhlaGZpbmFsYWx0b25lYXJhYmljPTY0NDIzO2UuaGVoZmluYWxhbHR0d29hcmFiaWM9NjUyNTg7ZS5oZWhmaW5hbGFyYWJpYz02NTI1ODtlLmhlaGhhbXphYWJvdmVmaW5hbGFyYWJpYz02NDQyMTtlLmhlaGhhbXphYWJvdmVpc29sYXRlZGFyYWJpYz02NDQyMDtlLmhlaGluaXRpYWxhbHRvbmVhcmFiaWM9NjQ0MjQ7ZS5oZWhpbml0aWFsYXJhYmljPTY1MjU5O2UuaGVoaXJhZ2FuYT0xMjQwODtlLmhlaG1lZGlhbGFsdG9uZWFyYWJpYz02NDQyNTtlLmhlaG1lZGlhbGFyYWJpYz02NTI2MDtlLmhlaXNlaWVyYXNxdWFyZT0xMzE3OTtlLmhla2F0YWthbmE9MTI1MDQ7ZS5oZWthdGFrYW5haGFsZndpZHRoPTY1NDIxO2UuaGVrdXRhYXJ1c3F1YXJlPTEzMTEwO2UuaGVuZ2hvb2s9NjE1O2UuaGVydXR1c3F1YXJlPTEzMTEzO2UuaGV0PTE0OTU7ZS5oZXRoZWJyZXc9MTQ5NTtlLmhob29rPTYxNDtlLmhob29rc3VwZXJpb3I9Njg5O2UuaGlldWhhY2lyY2xla29yZWFuPTEyOTIzO2UuaGlldWhhcGFyZW5rb3JlYW49MTI4Mjc7ZS5oaWV1aGNpcmNsZWtvcmVhbj0xMjkwOTtlLmhpZXVoa29yZWFuPTEyNjIyO2UuaGlldWhwYXJlbmtvcmVhbj0xMjgxMztlLmhpaGlyYWdhbmE9MTI0MDI7ZS5oaWthdGFrYW5hPTEyNDk4O2UuaGlrYXRha2FuYWhhbGZ3aWR0aD02NTQxOTtlLmhpcmlxPTE0NjA7ZS5oaXJpcTE0PTE0NjA7ZS5oaXJpcTIxPTE0NjA7ZS5oaXJpcTJkPTE0NjA7ZS5oaXJpcWhlYnJldz0xNDYwO2UuaGlyaXFuYXJyb3doZWJyZXc9MTQ2MDtlLmhpcmlxcXVhcnRlcmhlYnJldz0xNDYwO2UuaGlyaXF3aWRlaGVicmV3PTE0NjA7ZS5obGluZWJlbG93PTc4MzA7ZS5obW9ub3NwYWNlPTY1MzUyO2UuaG9hcm1lbmlhbj0xMzkyO2UuaG9oaXB0aGFpPTM2Mjc7ZS5ob2hpcmFnYW5hPTEyNDExO2UuaG9rYXRha2FuYT0xMjUwNztlLmhva2F0YWthbmFoYWxmd2lkdGg9NjU0MjI7ZS5ob2xhbT0xNDY1O2UuaG9sYW0xOT0xNDY1O2UuaG9sYW0yNj0xNDY1O2UuaG9sYW0zMj0xNDY1O2UuaG9sYW1oZWJyZXc9MTQ2NTtlLmhvbGFtbmFycm93aGVicmV3PTE0NjU7ZS5ob2xhbXF1YXJ0ZXJoZWJyZXc9MTQ2NTtlLmhvbGFtd2lkZWhlYnJldz0xNDY1O2UuaG9ub2todWt0aGFpPTM2MzA7ZS5ob29rYWJvdmVjb21iPTc3NztlLmhvb2tjbWI9Nzc3O2UuaG9va3BhbGF0YWxpemVkYmVsb3djbWI9ODAxO2UuaG9va3JldHJvZmxleGJlbG93Y21iPTgwMjtlLmhvb25zcXVhcmU9MTMxMjI7ZS5ob3JpY29wdGljPTEwMDE7ZS5ob3Jpem9udGFsYmFyPTgyMTM7ZS5ob3JuY21iPTc5NTtlLmhvdHNwcmluZ3M9OTgzMjtlLmhvdXNlPTg5NjI7ZS5ocGFyZW49OTM3OTtlLmhzdXBlcmlvcj02ODg7ZS5odHVybmVkPTYxMztlLmh1aGlyYWdhbmE9MTI0MDU7ZS5odWlpdG9zcXVhcmU9MTMxMDc7ZS5odWthdGFrYW5hPTEyNTAxO2UuaHVrYXRha2FuYWhhbGZ3aWR0aD02NTQyMDtlLmh1bmdhcnVtbGF1dD03MzM7ZS5odW5nYXJ1bWxhdXRjbWI9Nzc5O2UuaHY9NDA1O2UuaHlwaGVuPTQ1O2UuaHlwaGVuaW5mZXJpb3I9NjMyMDU7ZS5oeXBoZW5tb25vc3BhY2U9NjUyOTM7ZS5oeXBoZW5zbWFsbD02NTEyMztlLmh5cGhlbnN1cGVyaW9yPTYzMjA2O2UuaHlwaGVudHdvPTgyMDg7ZS5pPTEwNTtlLmlhY3V0ZT0yMzc7ZS5pYWN5cmlsbGljPTExMDM7ZS5pYmVuZ2FsaT0yNDM5O2UuaWJvcG9tb2ZvPTEyNTgzO2UuaWJyZXZlPTMwMTtlLmljYXJvbj00NjQ7ZS5pY2lyY2xlPTk0MzI7ZS5pY2lyY3VtZmxleD0yMzg7ZS5pY3lyaWxsaWM9MTExMDtlLmlkYmxncmF2ZT01MjE7ZS5pZGVvZ3JhcGhlYXJ0aGNpcmNsZT0xMjk0MztlLmlkZW9ncmFwaGZpcmVjaXJjbGU9MTI5Mzk7ZS5pZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW49MTI4NjM7ZS5pZGVvZ3JhcGhpY2NhbGxwYXJlbj0xMjg1ODtlLmlkZW9ncmFwaGljY2VudHJlY2lyY2xlPTEyOTY1O2UuaWRlb2dyYXBoaWNjbG9zZT0xMjI5NDtlLmlkZW9ncmFwaGljY29tbWE9MTIyODk7ZS5pZGVvZ3JhcGhpY2NvbW1hbGVmdD02NTM4MDtlLmlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbj0xMjg1NTtlLmlkZW9ncmFwaGljY29ycmVjdGNpcmNsZT0xMjk2MztlLmlkZW9ncmFwaGljZWFydGhwYXJlbj0xMjg0NztlLmlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuPTEyODYxO2UuaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGU9MTI5NTc7ZS5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW49MTI4NjQ7ZS5pZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZT0xMjk1MDtlLmlkZW9ncmFwaGljZmluYW5jaWFscGFyZW49MTI4NTQ7ZS5pZGVvZ3JhcGhpY2ZpcmVwYXJlbj0xMjg0MztlLmlkZW9ncmFwaGljaGF2ZXBhcmVuPTEyODUwO2UuaWRlb2dyYXBoaWNoaWdoY2lyY2xlPTEyOTY0O2UuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrPTEyMjkzO2UuaWRlb2dyYXBoaWNsYWJvcmNpcmNsZT0xMjk1MjtlLmlkZW9ncmFwaGljbGFib3JwYXJlbj0xMjg1NjtlLmlkZW9ncmFwaGljbGVmdGNpcmNsZT0xMjk2NztlLmlkZW9ncmFwaGljbG93Y2lyY2xlPTEyOTY2O2UuaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZT0xMjk2OTtlLmlkZW9ncmFwaGljbWV0YWxwYXJlbj0xMjg0NjtlLmlkZW9ncmFwaGljbW9vbnBhcmVuPTEyODQyO2UuaWRlb2dyYXBoaWNuYW1lcGFyZW49MTI4NTI7ZS5pZGVvZ3JhcGhpY3BlcmlvZD0xMjI5MDtlLmlkZW9ncmFwaGljcHJpbnRjaXJjbGU9MTI5NTg7ZS5pZGVvZ3JhcGhpY3JlYWNocGFyZW49MTI4Njc7ZS5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuPTEyODU3O2UuaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuPTEyODYyO2UuaWRlb2dyYXBoaWNyaWdodGNpcmNsZT0xMjk2ODtlLmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlPTEyOTUzO2UuaWRlb2dyYXBoaWNzZWxmcGFyZW49MTI4NjY7ZS5pZGVvZ3JhcGhpY3NvY2lldHlwYXJlbj0xMjg1MTtlLmlkZW9ncmFwaGljc3BhY2U9MTIyODg7ZS5pZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbj0xMjg1MztlLmlkZW9ncmFwaGljc3RvY2twYXJlbj0xMjg0OTtlLmlkZW9ncmFwaGljc3R1ZHlwYXJlbj0xMjg1OTtlLmlkZW9ncmFwaGljc3VucGFyZW49MTI4NDg7ZS5pZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuPTEyODYwO2UuaWRlb2dyYXBoaWN3YXRlcnBhcmVuPTEyODQ0O2UuaWRlb2dyYXBoaWN3b29kcGFyZW49MTI4NDU7ZS5pZGVvZ3JhcGhpY3plcm89MTIyOTU7ZS5pZGVvZ3JhcGhtZXRhbGNpcmNsZT0xMjk0MjtlLmlkZW9ncmFwaG1vb25jaXJjbGU9MTI5Mzg7ZS5pZGVvZ3JhcGhuYW1lY2lyY2xlPTEyOTQ4O2UuaWRlb2dyYXBoc3VuY2lyY2xlPTEyOTQ0O2UuaWRlb2dyYXBod2F0ZXJjaXJjbGU9MTI5NDA7ZS5pZGVvZ3JhcGh3b29kY2lyY2xlPTEyOTQxO2UuaWRldmE9MjMxMTtlLmlkaWVyZXNpcz0yMzk7ZS5pZGllcmVzaXNhY3V0ZT03NzI3O2UuaWRpZXJlc2lzY3lyaWxsaWM9MTI1MztlLmlkb3RiZWxvdz03ODgzO2UuaWVicmV2ZWN5cmlsbGljPTEyMzk7ZS5pZWN5cmlsbGljPTEwNzc7ZS5pZXVuZ2FjaXJjbGVrb3JlYW49MTI5MTc7ZS5pZXVuZ2FwYXJlbmtvcmVhbj0xMjgyMTtlLmlldW5nY2lyY2xla29yZWFuPTEyOTAzO2UuaWV1bmdrb3JlYW49MTI2MTU7ZS5pZXVuZ3BhcmVua29yZWFuPTEyODA3O2UuaWdyYXZlPTIzNjtlLmlndWphcmF0aT0yNjk1O2UuaWd1cm11a2hpPTI1Njc7ZS5paGlyYWdhbmE9MTIzNTY7ZS5paG9va2Fib3ZlPTc4ODE7ZS5paWJlbmdhbGk9MjQ0MDtlLmlpY3lyaWxsaWM9MTA4MDtlLmlpZGV2YT0yMzEyO2UuaWlndWphcmF0aT0yNjk2O2UuaWlndXJtdWtoaT0yNTY4O2UuaWltYXRyYWd1cm11a2hpPTI2MjQ7ZS5paW52ZXJ0ZWRicmV2ZT01MjM7ZS5paXNob3J0Y3lyaWxsaWM9MTA4MTtlLmlpdm93ZWxzaWduYmVuZ2FsaT0yNDk2O2UuaWl2b3dlbHNpZ25kZXZhPTIzNjg7ZS5paXZvd2Vsc2lnbmd1amFyYXRpPTI3NTI7ZS5paj0zMDc7ZS5pa2F0YWthbmE9MTI0NTI7ZS5pa2F0YWthbmFoYWxmd2lkdGg9NjUzOTQ7ZS5pa29yZWFuPTEyNjQzO2UuaWxkZT03MzI7ZS5pbHV5aGVicmV3PTE0NTI7ZS5pbWFjcm9uPTI5OTtlLmltYWNyb25jeXJpbGxpYz0xMjUxO2UuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbD04Nzg3O2UuaW1hdHJhZ3VybXVraGk9MjYyMztlLmltb25vc3BhY2U9NjUzNTM7ZS5pbmNyZW1lbnQ9ODcxMDtlLmluZmluaXR5PTg3MzQ7ZS5pbmlhcm1lbmlhbj0xMzg3O2UuaW50ZWdyYWw9ODc0NztlLmludGVncmFsYm90dG9tPTg5OTM7ZS5pbnRlZ3JhbGJ0PTg5OTM7ZS5pbnRlZ3JhbGV4PTYzNzMzO2UuaW50ZWdyYWx0b3A9ODk5MjtlLmludGVncmFsdHA9ODk5MjtlLmludGVyc2VjdGlvbj04NzQ1O2UuaW50aXNxdWFyZT0xMzA2MTtlLmludmJ1bGxldD05Njg4O2UuaW52Y2lyY2xlPTk2ODk7ZS5pbnZzbWlsZWZhY2U9OTc4NztlLmlvY3lyaWxsaWM9MTEwNTtlLmlvZ29uZWs9MzAzO2UuaW90YT05NTM7ZS5pb3RhZGllcmVzaXM9OTcwO2UuaW90YWRpZXJlc2lzdG9ub3M9OTEyO2UuaW90YWxhdGluPTYxNztlLmlvdGF0b25vcz05NDM7ZS5pcGFyZW49OTM4MDtlLmlyaWd1cm11a2hpPTI2NzQ7ZS5pc21hbGxoaXJhZ2FuYT0xMjM1NTtlLmlzbWFsbGthdGFrYW5hPTEyNDUxO2UuaXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODQ7ZS5pc3NoYXJiZW5nYWxpPTI1NTQ7ZS5pc3Ryb2tlPTYxNjtlLmlzdXBlcmlvcj02MzIxMztlLml0ZXJhdGlvbmhpcmFnYW5hPTEyNDQ1O2UuaXRlcmF0aW9ua2F0YWthbmE9MTI1NDE7ZS5pdGlsZGU9Mjk3O2UuaXRpbGRlYmVsb3c9NzcyNTtlLml1Ym9wb21vZm89MTI1ODU7ZS5pdWN5cmlsbGljPTExMDI7ZS5pdm93ZWxzaWduYmVuZ2FsaT0yNDk1O2UuaXZvd2Vsc2lnbmRldmE9MjM2NztlLml2b3dlbHNpZ25ndWphcmF0aT0yNzUxO2UuaXpoaXRzYWN5cmlsbGljPTExNDE7ZS5pemhpdHNhZGJsZ3JhdmVjeXJpbGxpYz0xMTQzO2Uuaj0xMDY7ZS5qYWFybWVuaWFuPTEzOTM7ZS5qYWJlbmdhbGk9MjQ2MDtlLmphZGV2YT0yMzMyO2UuamFndWphcmF0aT0yNzE2O2UuamFndXJtdWtoaT0yNTg4O2UuamJvcG9tb2ZvPTEyNTYwO2UuamNhcm9uPTQ5NjtlLmpjaXJjbGU9OTQzMztlLmpjaXJjdW1mbGV4PTMwOTtlLmpjcm9zc2VkdGFpbD02Njk7ZS5qZG90bGVzc3N0cm9rZT02MDc7ZS5qZWN5cmlsbGljPTExMTI7ZS5qZWVtYXJhYmljPTE1ODA7ZS5qZWVtZmluYWxhcmFiaWM9NjUxODI7ZS5qZWVtaW5pdGlhbGFyYWJpYz02NTE4MztlLmplZW1tZWRpYWxhcmFiaWM9NjUxODQ7ZS5qZWhhcmFiaWM9MTY4ODtlLmplaGZpbmFsYXJhYmljPTY0Mzk1O2UuamhhYmVuZ2FsaT0yNDYxO2UuamhhZGV2YT0yMzMzO2UuamhhZ3VqYXJhdGk9MjcxNztlLmpoYWd1cm11a2hpPTI1ODk7ZS5qaGVoYXJtZW5pYW49MTQwMztlLmppcz0xMjI5MjtlLmptb25vc3BhY2U9NjUzNTQ7ZS5qcGFyZW49OTM4MTtlLmpzdXBlcmlvcj02OTA7ZS5rPTEwNztlLmthYmFzaGtpcmN5cmlsbGljPTExODU7ZS5rYWJlbmdhbGk9MjQ1MztlLmthY3V0ZT03NzI5O2Uua2FjeXJpbGxpYz0xMDgyO2Uua2FkZXNjZW5kZXJjeXJpbGxpYz0xMTc5O2Uua2FkZXZhPTIzMjU7ZS5rYWY9MTQ5OTtlLmthZmFyYWJpYz0xNjAzO2Uua2FmZGFnZXNoPTY0MzE1O2Uua2FmZGFnZXNoaGVicmV3PTY0MzE1O2Uua2FmZmluYWxhcmFiaWM9NjUyNDI7ZS5rYWZoZWJyZXc9MTQ5OTtlLmthZmluaXRpYWxhcmFiaWM9NjUyNDM7ZS5rYWZtZWRpYWxhcmFiaWM9NjUyNDQ7ZS5rYWZyYWZlaGVicmV3PTY0MzMzO2Uua2FndWphcmF0aT0yNzA5O2Uua2FndXJtdWtoaT0yNTgxO2Uua2FoaXJhZ2FuYT0xMjM2MztlLmthaG9va2N5cmlsbGljPTEyMjA7ZS5rYWthdGFrYW5hPTEyNDU5O2Uua2FrYXRha2FuYWhhbGZ3aWR0aD02NTM5ODtlLmthcHBhPTk1NDtlLmthcHBhc3ltYm9sZ3JlZWs9MTAwODtlLmthcHllb3VubWlldW1rb3JlYW49MTI2NTc7ZS5rYXB5ZW91bnBoaWV1cGhrb3JlYW49MTI2NzY7ZS5rYXB5ZW91bnBpZXVwa29yZWFuPTEyNjY0O2Uua2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuPTEyNjY1O2Uua2Fyb3JpaXNxdWFyZT0xMzA2OTtlLmthc2hpZGFhdXRvYXJhYmljPTE2MDA7ZS5rYXNoaWRhYXV0b25vc2lkZWJlYXJpbmdhcmFiaWM9MTYwMDtlLmthc21hbGxrYXRha2FuYT0xMjUzMztlLmthc3F1YXJlPTEzMTg4O2Uua2FzcmFhcmFiaWM9MTYxNjtlLmthc3JhdGFuYXJhYmljPTE2MTM7ZS5rYXN0cm9rZWN5cmlsbGljPTExODM7ZS5rYXRhaGlyYXByb2xvbmdtYXJraGFsZndpZHRoPTY1MzkyO2Uua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljPTExODE7ZS5rYm9wb21vZm89MTI1NTg7ZS5rY2Fsc3F1YXJlPTEzMTkzO2Uua2Nhcm9uPTQ4OTtlLmtjZWRpbGxhPTMxMTtlLmtjaXJjbGU9OTQzNDtlLmtjb21tYWFjY2VudD0zMTE7ZS5rZG90YmVsb3c9NzczMTtlLmtlaGFybWVuaWFuPTE0MTI7ZS5rZWhpcmFnYW5hPTEyMzY5O2Uua2VrYXRha2FuYT0xMjQ2NTtlLmtla2F0YWthbmFoYWxmd2lkdGg9NjU0MDE7ZS5rZW5hcm1lbmlhbj0xMzkxO2Uua2VzbWFsbGthdGFrYW5hPTEyNTM0O2Uua2dyZWVubGFuZGljPTMxMjtlLmtoYWJlbmdhbGk9MjQ1NDtlLmtoYWN5cmlsbGljPTEwOTM7ZS5raGFkZXZhPTIzMjY7ZS5raGFndWphcmF0aT0yNzEwO2Uua2hhZ3VybXVraGk9MjU4MjtlLmtoYWhhcmFiaWM9MTU4MjtlLmtoYWhmaW5hbGFyYWJpYz02NTE5MDtlLmtoYWhpbml0aWFsYXJhYmljPTY1MTkxO2Uua2hhaG1lZGlhbGFyYWJpYz02NTE5MjtlLmtoZWljb3B0aWM9OTk5O2Uua2hoYWRldmE9MjM5MztlLmtoaGFndXJtdWtoaT0yNjQ5O2Uua2hpZXVraGFjaXJjbGVrb3JlYW49MTI5MjA7ZS5raGlldWtoYXBhcmVua29yZWFuPTEyODI0O2Uua2hpZXVraGNpcmNsZWtvcmVhbj0xMjkwNjtlLmtoaWV1a2hrb3JlYW49MTI2MTk7ZS5raGlldWtocGFyZW5rb3JlYW49MTI4MTA7ZS5raG9raGFpdGhhaT0zNTg2O2Uua2hva2hvbnRoYWk9MzU4OTtlLmtob2todWF0dGhhaT0zNTg3O2Uua2hva2h3YWl0aGFpPTM1ODg7ZS5raG9tdXR0aGFpPTM2NzU7ZS5raG9vaz00MDk7ZS5raG9yYWtoYW5ndGhhaT0zNTkwO2Uua2h6c3F1YXJlPTEzMjAxO2Uua2loaXJhZ2FuYT0xMjM2NTtlLmtpa2F0YWthbmE9MTI0NjE7ZS5raWthdGFrYW5haGFsZndpZHRoPTY1Mzk5O2Uua2lyb2d1cmFtdXNxdWFyZT0xMzA3NztlLmtpcm9tZWV0b3J1c3F1YXJlPTEzMDc4O2Uua2lyb3NxdWFyZT0xMzA3NjtlLmtpeWVva2FjaXJjbGVrb3JlYW49MTI5MTA7ZS5raXllb2thcGFyZW5rb3JlYW49MTI4MTQ7ZS5raXllb2tjaXJjbGVrb3JlYW49MTI4OTY7ZS5raXllb2trb3JlYW49MTI1OTM7ZS5raXllb2twYXJlbmtvcmVhbj0xMjgwMDtlLmtpeWVva3Npb3Nrb3JlYW49MTI1OTU7ZS5ramVjeXJpbGxpYz0xMTE2O2Uua2xpbmViZWxvdz03NzMzO2Uua2xzcXVhcmU9MTMyMDg7ZS5rbWN1YmVkc3F1YXJlPTEzMjIyO2Uua21vbm9zcGFjZT02NTM1NTtlLmttc3F1YXJlZHNxdWFyZT0xMzIxODtlLmtvaGlyYWdhbmE9MTIzNzE7ZS5rb2htc3F1YXJlPTEzMjQ4O2Uua29rYWl0aGFpPTM1ODU7ZS5rb2thdGFrYW5hPTEyNDY3O2Uua29rYXRha2FuYWhhbGZ3aWR0aD02NTQwMjtlLmtvb3Bvc3F1YXJlPTEzMDg2O2Uua29wcGFjeXJpbGxpYz0xMTUzO2Uua29yZWFuc3RhbmRhcmRzeW1ib2w9MTI5Mjc7ZS5rb3JvbmlzY21iPTgzNTtlLmtwYXJlbj05MzgyO2Uua3Bhc3F1YXJlPTEzMjI2O2Uua3NpY3lyaWxsaWM9MTEzNTtlLmt0c3F1YXJlPTEzMjYzO2Uua3R1cm5lZD02NzA7ZS5rdWhpcmFnYW5hPTEyMzY3O2Uua3VrYXRha2FuYT0xMjQ2MztlLmt1a2F0YWthbmFoYWxmd2lkdGg9NjU0MDA7ZS5rdnNxdWFyZT0xMzI0MDtlLmt3c3F1YXJlPTEzMjQ2O2UubD0xMDg7ZS5sYWJlbmdhbGk9MjQ4MjtlLmxhY3V0ZT0zMTQ7ZS5sYWRldmE9MjM1NDtlLmxhZ3VqYXJhdGk9MjczODtlLmxhZ3VybXVraGk9MjYxMDtlLmxha2toYW5neWFvdGhhaT0zNjUzO2UubGFtYWxlZmZpbmFsYXJhYmljPTY1Mjc2O2UubGFtYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYz02NTI3MjtlLmxhbWFsZWZoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWM9NjUyNzE7ZS5sYW1hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljPTY1Mjc0O2UubGFtYWxlZmhhbXphYmVsb3dpc29sYXRlZGFyYWJpYz02NTI3MztlLmxhbWFsZWZpc29sYXRlZGFyYWJpYz02NTI3NTtlLmxhbWFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWM9NjUyNzA7ZS5sYW1hbGVmbWFkZGFhYm92ZWlzb2xhdGVkYXJhYmljPTY1MjY5O2UubGFtYXJhYmljPTE2MDQ7ZS5sYW1iZGE9OTU1O2UubGFtYmRhc3Ryb2tlPTQxMTtlLmxhbWVkPTE1MDA7ZS5sYW1lZGRhZ2VzaD02NDMxNjtlLmxhbWVkZGFnZXNoaGVicmV3PTY0MzE2O2UubGFtZWRoZWJyZXc9MTUwMDtlLmxhbWZpbmFsYXJhYmljPTY1MjQ2O2UubGFtaGFoaW5pdGlhbGFyYWJpYz02NDcxNDtlLmxhbWluaXRpYWxhcmFiaWM9NjUyNDc7ZS5sYW1qZWVtaW5pdGlhbGFyYWJpYz02NDcxMztlLmxhbWtoYWhpbml0aWFsYXJhYmljPTY0NzE1O2UubGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWM9NjUwMTA7ZS5sYW1tZWRpYWxhcmFiaWM9NjUyNDg7ZS5sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYz02NDkwNDtlLmxhbW1lZW1pbml0aWFsYXJhYmljPTY0NzE2O2UubGFyZ2VjaXJjbGU9OTcxMTtlLmxiYXI9NDEwO2UubGJlbHQ9NjIwO2UubGJvcG9tb2ZvPTEyNTU2O2UubGNhcm9uPTMxODtlLmxjZWRpbGxhPTMxNjtlLmxjaXJjbGU9OTQzNTtlLmxjaXJjdW1mbGV4YmVsb3c9Nzc0MTtlLmxjb21tYWFjY2VudD0zMTY7ZS5sZG90PTMyMDtlLmxkb3RhY2NlbnQ9MzIwO2UubGRvdGJlbG93PTc3MzU7ZS5sZG90YmVsb3dtYWNyb249NzczNztlLmxlZnRhbmdsZWFib3ZlY21iPTc5NDtlLmxlZnR0YWNrYmVsb3djbWI9NzkyO2UubGVzcz02MDtlLmxlc3NlcXVhbD04ODA0O2UubGVzc2VxdWFsb3JncmVhdGVyPTg5MjI7ZS5sZXNzbW9ub3NwYWNlPTY1MzA4O2UubGVzc29yZXF1aXZhbGVudD04ODE4O2UubGVzc29yZ3JlYXRlcj04ODIyO2UubGVzc292ZXJlcXVhbD04ODA2O2UubGVzc3NtYWxsPTY1MTI0O2UubGV6aD02MjI7ZS5sZmJsb2NrPTk2MTI7ZS5saG9va3JldHJvZmxleD02MjE7ZS5saXJhPTgzNTY7ZS5saXduYXJtZW5pYW49MTM4ODtlLmxqPTQ1NztlLmxqZWN5cmlsbGljPTExMTM7ZS5sbD02MzE2ODtlLmxsYWRldmE9MjM1NTtlLmxsYWd1amFyYXRpPTI3Mzk7ZS5sbGluZWJlbG93PTc3Mzk7ZS5sbGxhZGV2YT0yMzU2O2UubGx2b2NhbGljYmVuZ2FsaT0yNTI5O2UubGx2b2NhbGljZGV2YT0yNDAxO2UubGx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNTMxO2UubGx2b2NhbGljdm93ZWxzaWduZGV2YT0yNDAzO2UubG1pZGRsZXRpbGRlPTYxOTtlLmxtb25vc3BhY2U9NjUzNTY7ZS5sbXNxdWFyZT0xMzI2NDtlLmxvY2h1bGF0aGFpPTM2Mjg7ZS5sb2dpY2FsYW5kPTg3NDM7ZS5sb2dpY2Fsbm90PTE3MjtlLmxvZ2ljYWxub3RyZXZlcnNlZD04OTc2O2UubG9naWNhbG9yPTg3NDQ7ZS5sb2xpbmd0aGFpPTM2MjE7ZS5sb25ncz0zODM7ZS5sb3dsaW5lY2VudGVybGluZT02NTEwMjtlLmxvd2xpbmVjbWI9ODE4O2UubG93bGluZWRhc2hlZD02NTEwMTtlLmxvemVuZ2U9OTY3NDtlLmxwYXJlbj05MzgzO2UubHNsYXNoPTMyMjtlLmxzcXVhcmU9ODQ2NztlLmxzdXBlcmlvcj02MzIxNDtlLmx0c2hhZGU9OTYxNztlLmx1dGhhaT0zNjIyO2UubHZvY2FsaWNiZW5nYWxpPTI0NDQ7ZS5sdm9jYWxpY2RldmE9MjMxNjtlLmx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNTMwO2UubHZvY2FsaWN2b3dlbHNpZ25kZXZhPTI0MDI7ZS5seHNxdWFyZT0xMzI2NztlLm09MTA5O2UubWFiZW5nYWxpPTI0Nzg7ZS5tYWNyb249MTc1O2UubWFjcm9uYmVsb3djbWI9ODE3O2UubWFjcm9uY21iPTc3MjtlLm1hY3Jvbmxvd21vZD03MTc7ZS5tYWNyb25tb25vc3BhY2U9NjU1MDc7ZS5tYWN1dGU9Nzc0MztlLm1hZGV2YT0yMzUwO2UubWFndWphcmF0aT0yNzM0O2UubWFndXJtdWtoaT0yNjA2O2UubWFoYXBha2hoZWJyZXc9MTQ0NDtlLm1haGFwYWtobGVmdGhlYnJldz0xNDQ0O2UubWFoaXJhZ2FuYT0xMjQxNDtlLm1haWNoYXR0YXdhbG93bGVmdHRoYWk9NjM2Mzc7ZS5tYWljaGF0dGF3YWxvd3JpZ2h0dGhhaT02MzYzNjtlLm1haWNoYXR0YXdhdGhhaT0zNjU5O2UubWFpY2hhdHRhd2F1cHBlcmxlZnR0aGFpPTYzNjM1O2UubWFpZWtsb3dsZWZ0dGhhaT02MzYyODtlLm1haWVrbG93cmlnaHR0aGFpPTYzNjI3O2UubWFpZWt0aGFpPTM2NTY7ZS5tYWlla3VwcGVybGVmdHRoYWk9NjM2MjY7ZS5tYWloYW5ha2F0bGVmdHRoYWk9NjM2MjA7ZS5tYWloYW5ha2F0dGhhaT0zNjMzO2UubWFpdGFpa2h1bGVmdHRoYWk9NjM2MjU7ZS5tYWl0YWlraHV0aGFpPTM2NTU7ZS5tYWl0aG9sb3dsZWZ0dGhhaT02MzYzMTtlLm1haXRob2xvd3JpZ2h0dGhhaT02MzYzMDtlLm1haXRob3RoYWk9MzY1NztlLm1haXRob3VwcGVybGVmdHRoYWk9NjM2Mjk7ZS5tYWl0cmlsb3dsZWZ0dGhhaT02MzYzNDtlLm1haXRyaWxvd3JpZ2h0dGhhaT02MzYzMztlLm1haXRyaXRoYWk9MzY1ODtlLm1haXRyaXVwcGVybGVmdHRoYWk9NjM2MzI7ZS5tYWl5YW1va3RoYWk9MzY1NDtlLm1ha2F0YWthbmE9MTI1MTA7ZS5tYWthdGFrYW5haGFsZndpZHRoPTY1NDIzO2UubWFsZT05Nzk0O2UubWFuc3lvbnNxdWFyZT0xMzEyNztlLm1hcWFmaGVicmV3PTE0NzA7ZS5tYXJzPTk3OTQ7ZS5tYXNvcmFjaXJjbGVoZWJyZXc9MTQ1NTtlLm1hc3F1YXJlPTEzMTg3O2UubWJvcG9tb2ZvPTEyNTUxO2UubWJzcXVhcmU9MTMyNjg7ZS5tY2lyY2xlPTk0MzY7ZS5tY3ViZWRzcXVhcmU9MTMyMjE7ZS5tZG90YWNjZW50PTc3NDU7ZS5tZG90YmVsb3c9Nzc0NztlLm1lZW1hcmFiaWM9MTYwNTtlLm1lZW1maW5hbGFyYWJpYz02NTI1MDtlLm1lZW1pbml0aWFsYXJhYmljPTY1MjUxO2UubWVlbW1lZGlhbGFyYWJpYz02NTI1MjtlLm1lZW1tZWVtaW5pdGlhbGFyYWJpYz02NDcyMTtlLm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1ODQ7ZS5tZWV0b3J1c3F1YXJlPTEzMTMzO2UubWVoaXJhZ2FuYT0xMjQxNztlLm1laXppZXJhc3F1YXJlPTEzMTgyO2UubWVrYXRha2FuYT0xMjUxMztlLm1la2F0YWthbmFoYWxmd2lkdGg9NjU0MjY7ZS5tZW09MTUwMjtlLm1lbWRhZ2VzaD02NDMxODtlLm1lbWRhZ2VzaGhlYnJldz02NDMxODtlLm1lbWhlYnJldz0xNTAyO2UubWVuYXJtZW5pYW49MTM5NjtlLm1lcmtoYWhlYnJldz0xNDQ1O2UubWVya2hha2VmdWxhaGVicmV3PTE0NDY7ZS5tZXJraGFrZWZ1bGFsZWZ0aGVicmV3PTE0NDY7ZS5tZXJraGFsZWZ0aGVicmV3PTE0NDU7ZS5taG9vaz02MjU7ZS5taHpzcXVhcmU9MTMyMDI7ZS5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aD02NTM4MTtlLm1pZGRvdD0xODM7ZS5taWV1bWFjaXJjbGVrb3JlYW49MTI5MTQ7ZS5taWV1bWFwYXJlbmtvcmVhbj0xMjgxODtlLm1pZXVtY2lyY2xla29yZWFuPTEyOTAwO2UubWlldW1rb3JlYW49MTI2MDk7ZS5taWV1bXBhbnNpb3Nrb3JlYW49MTI2NTY7ZS5taWV1bXBhcmVua29yZWFuPTEyODA0O2UubWlldW1waWV1cGtvcmVhbj0xMjY1NDtlLm1pZXVtc2lvc2tvcmVhbj0xMjY1NTtlLm1paGlyYWdhbmE9MTI0MTU7ZS5taWthdGFrYW5hPTEyNTExO2UubWlrYXRha2FuYWhhbGZ3aWR0aD02NTQyNDtlLm1pbnVzPTg3MjI7ZS5taW51c2JlbG93Y21iPTgwMDtlLm1pbnVzY2lyY2xlPTg4NTQ7ZS5taW51c21vZD03Mjc7ZS5taW51c3BsdXM9ODcyMztlLm1pbnV0ZT04MjQyO2UubWlyaWJhYXJ1c3F1YXJlPTEzMTMwO2UubWlyaXNxdWFyZT0xMzEyOTtlLm1sb25nbGVndHVybmVkPTYyNDtlLm1sc3F1YXJlPTEzMjA2O2UubW1jdWJlZHNxdWFyZT0xMzIxOTtlLm1tb25vc3BhY2U9NjUzNTc7ZS5tbXNxdWFyZWRzcXVhcmU9MTMyMTU7ZS5tb2hpcmFnYW5hPTEyNDE4O2UubW9obXNxdWFyZT0xMzI0OTtlLm1va2F0YWthbmE9MTI1MTQ7ZS5tb2thdGFrYW5haGFsZndpZHRoPTY1NDI3O2UubW9sc3F1YXJlPTEzMjcwO2UubW9tYXRoYWk9MzYxNztlLm1vdmVyc3NxdWFyZT0xMzIyMztlLm1vdmVyc3NxdWFyZWRzcXVhcmU9MTMyMjQ7ZS5tcGFyZW49OTM4NDtlLm1wYXNxdWFyZT0xMzIyNztlLm1zc3F1YXJlPTEzMjM1O2UubXN1cGVyaW9yPTYzMjE1O2UubXR1cm5lZD02MjM7ZS5tdT0xODE7ZS5tdTE9MTgxO2UubXVhc3F1YXJlPTEzMTg2O2UubXVjaGdyZWF0ZXI9ODgxMTtlLm11Y2hsZXNzPTg4MTA7ZS5tdWZzcXVhcmU9MTMxOTY7ZS5tdWdyZWVrPTk1NjtlLm11Z3NxdWFyZT0xMzE5NztlLm11aGlyYWdhbmE9MTI0MTY7ZS5tdWthdGFrYW5hPTEyNTEyO2UubXVrYXRha2FuYWhhbGZ3aWR0aD02NTQyNTtlLm11bHNxdWFyZT0xMzIwNTtlLm11bHRpcGx5PTIxNTtlLm11bXNxdWFyZT0xMzIxMTtlLm11bmFoaGVicmV3PTE0NDM7ZS5tdW5haGxlZnRoZWJyZXc9MTQ0MztlLm11c2ljYWxub3RlPTk4MzQ7ZS5tdXNpY2Fsbm90ZWRibD05ODM1O2UubXVzaWNmbGF0c2lnbj05ODM3O2UubXVzaWNzaGFycHNpZ249OTgzOTtlLm11c3NxdWFyZT0xMzIzNDtlLm11dnNxdWFyZT0xMzIzODtlLm11d3NxdWFyZT0xMzI0NDtlLm12bWVnYXNxdWFyZT0xMzI0MTtlLm12c3F1YXJlPTEzMjM5O2UubXdtZWdhc3F1YXJlPTEzMjQ3O2UubXdzcXVhcmU9MTMyNDU7ZS5uPTExMDtlLm5hYmVuZ2FsaT0yNDcyO2UubmFibGE9ODcxMTtlLm5hY3V0ZT0zMjQ7ZS5uYWRldmE9MjM0NDtlLm5hZ3VqYXJhdGk9MjcyODtlLm5hZ3VybXVraGk9MjYwMDtlLm5haGlyYWdhbmE9MTIzOTQ7ZS5uYWthdGFrYW5hPTEyNDkwO2UubmFrYXRha2FuYWhhbGZ3aWR0aD02NTQxMztlLm5hcG9zdHJvcGhlPTMyOTtlLm5hc3F1YXJlPTEzMTg1O2UubmJvcG9tb2ZvPTEyNTU1O2UubmJzcGFjZT0xNjA7ZS5uY2Fyb249MzI4O2UubmNlZGlsbGE9MzI2O2UubmNpcmNsZT05NDM3O2UubmNpcmN1bWZsZXhiZWxvdz03NzU1O2UubmNvbW1hYWNjZW50PTMyNjtlLm5kb3RhY2NlbnQ9Nzc0OTtlLm5kb3RiZWxvdz03NzUxO2UubmVoaXJhZ2FuYT0xMjM5NztlLm5la2F0YWthbmE9MTI0OTM7ZS5uZWthdGFrYW5haGFsZndpZHRoPTY1NDE2O2UubmV3c2hlcWVsc2lnbj04MzYyO2UubmZzcXVhcmU9MTMxOTU7ZS5uZ2FiZW5nYWxpPTI0NTc7ZS5uZ2FkZXZhPTIzMjk7ZS5uZ2FndWphcmF0aT0yNzEzO2UubmdhZ3VybXVraGk9MjU4NTtlLm5nb25ndXRoYWk9MzU5MTtlLm5oaXJhZ2FuYT0xMjQzNTtlLm5ob29rbGVmdD02MjY7ZS5uaG9va3JldHJvZmxleD02Mjc7ZS5uaWV1bmFjaXJjbGVrb3JlYW49MTI5MTE7ZS5uaWV1bmFwYXJlbmtvcmVhbj0xMjgxNTtlLm5pZXVuY2lldWNrb3JlYW49MTI1OTc7ZS5uaWV1bmNpcmNsZWtvcmVhbj0xMjg5NztlLm5pZXVuaGlldWhrb3JlYW49MTI1OTg7ZS5uaWV1bmtvcmVhbj0xMjU5NjtlLm5pZXVucGFuc2lvc2tvcmVhbj0xMjY0ODtlLm5pZXVucGFyZW5rb3JlYW49MTI4MDE7ZS5uaWV1bnNpb3Nrb3JlYW49MTI2NDc7ZS5uaWV1bnRpa2V1dGtvcmVhbj0xMjY0NjtlLm5paGlyYWdhbmE9MTIzOTU7ZS5uaWthdGFrYW5hPTEyNDkxO2UubmlrYXRha2FuYWhhbGZ3aWR0aD02NTQxNDtlLm5pa2hhaGl0bGVmdHRoYWk9NjM2NDE7ZS5uaWtoYWhpdHRoYWk9MzY2MTtlLm5pbmU9NTc7ZS5uaW5lYXJhYmljPTE2NDE7ZS5uaW5lYmVuZ2FsaT0yNTQzO2UubmluZWNpcmNsZT05MzIwO2UubmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMzA7ZS5uaW5lZGV2YT0yNDE1O2UubmluZWd1amFyYXRpPTI3OTk7ZS5uaW5lZ3VybXVraGk9MjY3MTtlLm5pbmVoYWNrYXJhYmljPTE2NDE7ZS5uaW5laGFuZ3pob3U9MTIzMjk7ZS5uaW5laWRlb2dyYXBoaWNwYXJlbj0xMjg0MDtlLm5pbmVpbmZlcmlvcj04MzI5O2UubmluZW1vbm9zcGFjZT02NTMwNTtlLm5pbmVvbGRzdHlsZT02MzI4OTtlLm5pbmVwYXJlbj05MzQwO2UubmluZXBlcmlvZD05MzYwO2UubmluZXBlcnNpYW49MTc4NTtlLm5pbmVyb21hbj04NTY4O2UubmluZXN1cGVyaW9yPTgzMTM7ZS5uaW5ldGVlbmNpcmNsZT05MzMwO2UubmluZXRlZW5wYXJlbj05MzUwO2UubmluZXRlZW5wZXJpb2Q9OTM3MDtlLm5pbmV0aGFpPTM2NzM7ZS5uaj00NjA7ZS5uamVjeXJpbGxpYz0xMTE0O2UubmthdGFrYW5hPTEyNTMxO2UubmthdGFrYW5haGFsZndpZHRoPTY1NDM3O2UubmxlZ3JpZ2h0bG9uZz00MTQ7ZS5ubGluZWJlbG93PTc3NTM7ZS5ubW9ub3NwYWNlPTY1MzU4O2Uubm1zcXVhcmU9MTMyMTA7ZS5ubmFiZW5nYWxpPTI0Njc7ZS5ubmFkZXZhPTIzMzk7ZS5ubmFndWphcmF0aT0yNzIzO2Uubm5hZ3VybXVraGk9MjU5NTtlLm5ubmFkZXZhPTIzNDU7ZS5ub2hpcmFnYW5hPTEyMzk4O2Uubm9rYXRha2FuYT0xMjQ5NDtlLm5va2F0YWthbmFoYWxmd2lkdGg9NjU0MTc7ZS5ub25icmVha2luZ3NwYWNlPTE2MDtlLm5vbmVudGhhaT0zNjAzO2Uubm9udXRoYWk9MzYwOTtlLm5vb25hcmFiaWM9MTYwNjtlLm5vb25maW5hbGFyYWJpYz02NTI1NDtlLm5vb25naHVubmFhcmFiaWM9MTcyMjtlLm5vb25naHVubmFmaW5hbGFyYWJpYz02NDQxNTtlLm5vb25pbml0aWFsYXJhYmljPTY1MjU1O2Uubm9vbmplZW1pbml0aWFsYXJhYmljPTY0NzIyO2Uubm9vbmplZW1pc29sYXRlZGFyYWJpYz02NDU4NztlLm5vb25tZWRpYWxhcmFiaWM9NjUyNTY7ZS5ub29ubWVlbWluaXRpYWxhcmFiaWM9NjQ3MjU7ZS5ub29ubWVlbWlzb2xhdGVkYXJhYmljPTY0NTkwO2Uubm9vbm5vb25maW5hbGFyYWJpYz02NDY1MztlLm5vdGNvbnRhaW5zPTg3MTY7ZS5ub3RlbGVtZW50PTg3MTM7ZS5ub3RlbGVtZW50b2Y9ODcxMztlLm5vdGVxdWFsPTg4MDA7ZS5ub3RncmVhdGVyPTg4MTU7ZS5ub3RncmVhdGVybm9yZXF1YWw9ODgxNztlLm5vdGdyZWF0ZXJub3JsZXNzPTg4MjU7ZS5ub3RpZGVudGljYWw9ODgwMjtlLm5vdGxlc3M9ODgxNDtlLm5vdGxlc3Nub3JlcXVhbD04ODE2O2Uubm90cGFyYWxsZWw9ODc0MjtlLm5vdHByZWNlZGVzPTg4MzI7ZS5ub3RzdWJzZXQ9ODgzNjtlLm5vdHN1Y2NlZWRzPTg4MzM7ZS5ub3RzdXBlcnNldD04ODM3O2Uubm93YXJtZW5pYW49MTM5ODtlLm5wYXJlbj05Mzg1O2UubnNzcXVhcmU9MTMyMzM7ZS5uc3VwZXJpb3I9ODMxOTtlLm50aWxkZT0yNDE7ZS5udT05NTc7ZS5udWhpcmFnYW5hPTEyMzk2O2UubnVrYXRha2FuYT0xMjQ5MjtlLm51a2F0YWthbmFoYWxmd2lkdGg9NjU0MTU7ZS5udWt0YWJlbmdhbGk9MjQ5MjtlLm51a3RhZGV2YT0yMzY0O2UubnVrdGFndWphcmF0aT0yNzQ4O2UubnVrdGFndXJtdWtoaT0yNjIwO2UubnVtYmVyc2lnbj0zNTtlLm51bWJlcnNpZ25tb25vc3BhY2U9NjUyODM7ZS5udW1iZXJzaWduc21hbGw9NjUxMTk7ZS5udW1lcmFsc2lnbmdyZWVrPTg4NDtlLm51bWVyYWxzaWdubG93ZXJncmVlaz04ODU7ZS5udW1lcm89ODQ3MDtlLm51bj0xNTA0O2UubnVuZGFnZXNoPTY0MzIwO2UubnVuZGFnZXNoaGVicmV3PTY0MzIwO2UubnVuaGVicmV3PTE1MDQ7ZS5udnNxdWFyZT0xMzIzNztlLm53c3F1YXJlPTEzMjQzO2UubnlhYmVuZ2FsaT0yNDYyO2UubnlhZGV2YT0yMzM0O2UubnlhZ3VqYXJhdGk9MjcxODtlLm55YWd1cm11a2hpPTI1OTA7ZS5vPTExMTtlLm9hY3V0ZT0yNDM7ZS5vYW5ndGhhaT0zNjI5O2Uub2JhcnJlZD02Mjk7ZS5vYmFycmVkY3lyaWxsaWM9MTI1NztlLm9iYXJyZWRkaWVyZXNpc2N5cmlsbGljPTEyNTk7ZS5vYmVuZ2FsaT0yNDUxO2Uub2JvcG9tb2ZvPTEyNTcxO2Uub2JyZXZlPTMzNTtlLm9jYW5kcmFkZXZhPTIzMjE7ZS5vY2FuZHJhZ3VqYXJhdGk9MjcwNTtlLm9jYW5kcmF2b3dlbHNpZ25kZXZhPTIzNzc7ZS5vY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGk9Mjc2MTtlLm9jYXJvbj00NjY7ZS5vY2lyY2xlPTk0Mzg7ZS5vY2lyY3VtZmxleD0yNDQ7ZS5vY2lyY3VtZmxleGFjdXRlPTc4ODk7ZS5vY2lyY3VtZmxleGRvdGJlbG93PTc4OTc7ZS5vY2lyY3VtZmxleGdyYXZlPTc4OTE7ZS5vY2lyY3VtZmxleGhvb2thYm92ZT03ODkzO2Uub2NpcmN1bWZsZXh0aWxkZT03ODk1O2Uub2N5cmlsbGljPTEwODY7ZS5vZGJsYWN1dGU9MzM3O2Uub2RibGdyYXZlPTUyNTtlLm9kZXZhPTIzMjM7ZS5vZGllcmVzaXM9MjQ2O2Uub2RpZXJlc2lzY3lyaWxsaWM9MTI1NTtlLm9kb3RiZWxvdz03ODg1O2Uub2U9MzM5O2Uub2Vrb3JlYW49MTI2MzQ7ZS5vZ29uZWs9NzMxO2Uub2dvbmVrY21iPTgwODtlLm9ncmF2ZT0yNDI7ZS5vZ3VqYXJhdGk9MjcwNztlLm9oYXJtZW5pYW49MTQxMztlLm9oaXJhZ2FuYT0xMjM2MjtlLm9ob29rYWJvdmU9Nzg4NztlLm9ob3JuPTQxNztlLm9ob3JuYWN1dGU9Nzg5OTtlLm9ob3JuZG90YmVsb3c9NzkwNztlLm9ob3JuZ3JhdmU9NzkwMTtlLm9ob3JuaG9va2Fib3ZlPTc5MDM7ZS5vaG9ybnRpbGRlPTc5MDU7ZS5vaHVuZ2FydW1sYXV0PTMzNztlLm9pPTQxOTtlLm9pbnZlcnRlZGJyZXZlPTUyNztlLm9rYXRha2FuYT0xMjQ1ODtlLm9rYXRha2FuYWhhbGZ3aWR0aD02NTM5NztlLm9rb3JlYW49MTI2MzE7ZS5vbGVoZWJyZXc9MTQ1MTtlLm9tYWNyb249MzMzO2Uub21hY3JvbmFjdXRlPTc3NjM7ZS5vbWFjcm9uZ3JhdmU9Nzc2MTtlLm9tZGV2YT0yMzg0O2Uub21lZ2E9OTY5O2Uub21lZ2ExPTk4MjtlLm9tZWdhY3lyaWxsaWM9MTEyMTtlLm9tZWdhbGF0aW5jbG9zZWQ9NjMxO2Uub21lZ2Fyb3VuZGN5cmlsbGljPTExNDc7ZS5vbWVnYXRpdGxvY3lyaWxsaWM9MTE0OTtlLm9tZWdhdG9ub3M9OTc0O2Uub21ndWphcmF0aT0yNzY4O2Uub21pY3Jvbj05NTk7ZS5vbWljcm9udG9ub3M9OTcyO2Uub21vbm9zcGFjZT02NTM1OTtlLm9uZT00OTtlLm9uZWFyYWJpYz0xNjMzO2Uub25lYmVuZ2FsaT0yNTM1O2Uub25lY2lyY2xlPTkzMTI7ZS5vbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTIyO2Uub25lZGV2YT0yNDA3O2Uub25lZG90ZW5sZWFkZXI9ODIyODtlLm9uZWVpZ2h0aD04NTM5O2Uub25lZml0dGVkPTYzMTk2O2Uub25lZ3VqYXJhdGk9Mjc5MTtlLm9uZWd1cm11a2hpPTI2NjM7ZS5vbmVoYWNrYXJhYmljPTE2MzM7ZS5vbmVoYWxmPTE4OTtlLm9uZWhhbmd6aG91PTEyMzIxO2Uub25laWRlb2dyYXBoaWNwYXJlbj0xMjgzMjtlLm9uZWluZmVyaW9yPTgzMjE7ZS5vbmVtb25vc3BhY2U9NjUyOTc7ZS5vbmVudW1lcmF0b3JiZW5nYWxpPTI1NDg7ZS5vbmVvbGRzdHlsZT02MzI4MTtlLm9uZXBhcmVuPTkzMzI7ZS5vbmVwZXJpb2Q9OTM1MjtlLm9uZXBlcnNpYW49MTc3NztlLm9uZXF1YXJ0ZXI9MTg4O2Uub25lcm9tYW49ODU2MDtlLm9uZXN1cGVyaW9yPTE4NTtlLm9uZXRoYWk9MzY2NTtlLm9uZXRoaXJkPTg1MzE7ZS5vb2dvbmVrPTQ5MTtlLm9vZ29uZWttYWNyb249NDkzO2Uub29ndXJtdWtoaT0yNTc5O2Uub29tYXRyYWd1cm11a2hpPTI2MzU7ZS5vb3Blbj01OTY7ZS5vcGFyZW49OTM4NjtlLm9wZW5idWxsZXQ9OTcwMjtlLm9wdGlvbj04OTk3O2Uub3JkZmVtaW5pbmU9MTcwO2Uub3JkbWFzY3VsaW5lPTE4NjtlLm9ydGhvZ29uYWw9ODczNTtlLm9zaG9ydGRldmE9MjMyMjtlLm9zaG9ydHZvd2Vsc2lnbmRldmE9MjM3ODtlLm9zbGFzaD0yNDg7ZS5vc2xhc2hhY3V0ZT01MTE7ZS5vc21hbGxoaXJhZ2FuYT0xMjM2MTtlLm9zbWFsbGthdGFrYW5hPTEyNDU3O2Uub3NtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODc7ZS5vc3Ryb2tlYWN1dGU9NTExO2Uub3N1cGVyaW9yPTYzMjE2O2Uub3RjeXJpbGxpYz0xMTUxO2Uub3RpbGRlPTI0NTtlLm90aWxkZWFjdXRlPTc3NTc7ZS5vdGlsZGVkaWVyZXNpcz03NzU5O2Uub3Vib3BvbW9mbz0xMjU3NztlLm92ZXJsaW5lPTgyNTQ7ZS5vdmVybGluZWNlbnRlcmxpbmU9NjUwOTg7ZS5vdmVybGluZWNtYj03NzM7ZS5vdmVybGluZWRhc2hlZD02NTA5NztlLm92ZXJsaW5lZGJsd2F2eT02NTEwMDtlLm92ZXJsaW5ld2F2eT02NTA5OTtlLm92ZXJzY29yZT0xNzU7ZS5vdm93ZWxzaWduYmVuZ2FsaT0yNTA3O2Uub3Zvd2Vsc2lnbmRldmE9MjM3OTtlLm92b3dlbHNpZ25ndWphcmF0aT0yNzYzO2UucD0xMTI7ZS5wYWFtcHNzcXVhcmU9MTMxODQ7ZS5wYWFzZW50b3NxdWFyZT0xMzA5OTtlLnBhYmVuZ2FsaT0yNDc0O2UucGFjdXRlPTc3NjU7ZS5wYWRldmE9MjM0NjtlLnBhZ2Vkb3duPTg2NzE7ZS5wYWdldXA9ODY3MDtlLnBhZ3VqYXJhdGk9MjczMDtlLnBhZ3VybXVraGk9MjYwMjtlLnBhaGlyYWdhbmE9MTI0MDE7ZS5wYWl5YW5ub2l0aGFpPTM2MzE7ZS5wYWthdGFrYW5hPTEyNDk3O2UucGFsYXRhbGl6YXRpb25jeXJpbGxpY2NtYj0xMTU2O2UucGFsb2Noa2FjeXJpbGxpYz0xMjE2O2UucGFuc2lvc2tvcmVhbj0xMjY3MTtlLnBhcmFncmFwaD0xODI7ZS5wYXJhbGxlbD04NzQxO2UucGFyZW5sZWZ0PTQwO2UucGFyZW5sZWZ0YWx0b25lYXJhYmljPTY0ODMwO2UucGFyZW5sZWZ0YnQ9NjM3MjU7ZS5wYXJlbmxlZnRleD02MzcyNDtlLnBhcmVubGVmdGluZmVyaW9yPTgzMzM7ZS5wYXJlbmxlZnRtb25vc3BhY2U9NjUyODg7ZS5wYXJlbmxlZnRzbWFsbD02NTExMztlLnBhcmVubGVmdHN1cGVyaW9yPTgzMTc7ZS5wYXJlbmxlZnR0cD02MzcyMztlLnBhcmVubGVmdHZlcnRpY2FsPTY1MDc3O2UucGFyZW5yaWdodD00MTtlLnBhcmVucmlnaHRhbHRvbmVhcmFiaWM9NjQ4MzE7ZS5wYXJlbnJpZ2h0YnQ9NjM3MzY7ZS5wYXJlbnJpZ2h0ZXg9NjM3MzU7ZS5wYXJlbnJpZ2h0aW5mZXJpb3I9ODMzNDtlLnBhcmVucmlnaHRtb25vc3BhY2U9NjUyODk7ZS5wYXJlbnJpZ2h0c21hbGw9NjUxMTQ7ZS5wYXJlbnJpZ2h0c3VwZXJpb3I9ODMxODtlLnBhcmVucmlnaHR0cD02MzczNDtlLnBhcmVucmlnaHR2ZXJ0aWNhbD02NTA3ODtlLnBhcnRpYWxkaWZmPTg3MDY7ZS5wYXNlcWhlYnJldz0xNDcyO2UucGFzaHRhaGVicmV3PTE0MzM7ZS5wYXNxdWFyZT0xMzIyNTtlLnBhdGFoPTE0NjM7ZS5wYXRhaDExPTE0NjM7ZS5wYXRhaDFkPTE0NjM7ZS5wYXRhaDJhPTE0NjM7ZS5wYXRhaGhlYnJldz0xNDYzO2UucGF0YWhuYXJyb3doZWJyZXc9MTQ2MztlLnBhdGFocXVhcnRlcmhlYnJldz0xNDYzO2UucGF0YWh3aWRlaGVicmV3PTE0NjM7ZS5wYXplcmhlYnJldz0xNDQxO2UucGJvcG9tb2ZvPTEyNTUwO2UucGNpcmNsZT05NDM5O2UucGRvdGFjY2VudD03NzY3O2UucGU9MTUwODtlLnBlY3lyaWxsaWM9MTA4NztlLnBlZGFnZXNoPTY0MzI0O2UucGVkYWdlc2hoZWJyZXc9NjQzMjQ7ZS5wZWV6aXNxdWFyZT0xMzExNTtlLnBlZmluYWxkYWdlc2hoZWJyZXc9NjQzMjM7ZS5wZWhhcmFiaWM9MTY2MjtlLnBlaGFybWVuaWFuPTE0MDI7ZS5wZWhlYnJldz0xNTA4O2UucGVoZmluYWxhcmFiaWM9NjQzNDM7ZS5wZWhpbml0aWFsYXJhYmljPTY0MzQ0O2UucGVoaXJhZ2FuYT0xMjQxMDtlLnBlaG1lZGlhbGFyYWJpYz02NDM0NTtlLnBla2F0YWthbmE9MTI1MDY7ZS5wZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTkxO2UucGVyYWZlaGVicmV3PTY0MzM0O2UucGVyY2VudD0zNztlLnBlcmNlbnRhcmFiaWM9MTY0MjtlLnBlcmNlbnRtb25vc3BhY2U9NjUyODU7ZS5wZXJjZW50c21hbGw9NjUxMzA7ZS5wZXJpb2Q9NDY7ZS5wZXJpb2Rhcm1lbmlhbj0xNDE3O2UucGVyaW9kY2VudGVyZWQ9MTgzO2UucGVyaW9kaGFsZndpZHRoPTY1Mzc3O2UucGVyaW9kaW5mZXJpb3I9NjMyMDc7ZS5wZXJpb2Rtb25vc3BhY2U9NjUyOTQ7ZS5wZXJpb2RzbWFsbD02NTEwNjtlLnBlcmlvZHN1cGVyaW9yPTYzMjA4O2UucGVyaXNwb21lbmlncmVla2NtYj04MzQ7ZS5wZXJwZW5kaWN1bGFyPTg4Njk7ZS5wZXJ0aG91c2FuZD04MjQwO2UucGVzZXRhPTgzNTk7ZS5wZnNxdWFyZT0xMzE5NDtlLnBoYWJlbmdhbGk9MjQ3NTtlLnBoYWRldmE9MjM0NztlLnBoYWd1amFyYXRpPTI3MzE7ZS5waGFndXJtdWtoaT0yNjAzO2UucGhpPTk2NjtlLnBoaTE9OTgxO2UucGhpZXVwaGFjaXJjbGVrb3JlYW49MTI5MjI7ZS5waGlldXBoYXBhcmVua29yZWFuPTEyODI2O2UucGhpZXVwaGNpcmNsZWtvcmVhbj0xMjkwODtlLnBoaWV1cGhrb3JlYW49MTI2MjE7ZS5waGlldXBocGFyZW5rb3JlYW49MTI4MTI7ZS5waGlsYXRpbj02MzI7ZS5waGludGh1dGhhaT0zNjQyO2UucGhpc3ltYm9sZ3JlZWs9OTgxO2UucGhvb2s9NDIxO2UucGhvcGhhbnRoYWk9MzYxNDtlLnBob3BodW5ndGhhaT0zNjEyO2UucGhvc2FtcGhhb3RoYWk9MzYxNjtlLnBpPTk2MDtlLnBpZXVwYWNpcmNsZWtvcmVhbj0xMjkxNTtlLnBpZXVwYXBhcmVua29yZWFuPTEyODE5O2UucGlldXBjaWV1Y2tvcmVhbj0xMjY2MjtlLnBpZXVwY2lyY2xla29yZWFuPTEyOTAxO2UucGlldXBraXllb2trb3JlYW49MTI2NTg7ZS5waWV1cGtvcmVhbj0xMjYxMDtlLnBpZXVwcGFyZW5rb3JlYW49MTI4MDU7ZS5waWV1cHNpb3NraXllb2trb3JlYW49MTI2NjA7ZS5waWV1cHNpb3Nrb3JlYW49MTI2MTI7ZS5waWV1cHNpb3N0aWtldXRrb3JlYW49MTI2NjE7ZS5waWV1cHRoaWV1dGhrb3JlYW49MTI2NjM7ZS5waWV1cHRpa2V1dGtvcmVhbj0xMjY1OTtlLnBpaGlyYWdhbmE9MTI0MDQ7ZS5waWthdGFrYW5hPTEyNTAwO2UucGlzeW1ib2xncmVlaz05ODI7ZS5waXdyYXJtZW5pYW49MTQxMTtlLnBsdXM9NDM7ZS5wbHVzYmVsb3djbWI9Nzk5O2UucGx1c2NpcmNsZT04ODUzO2UucGx1c21pbnVzPTE3NztlLnBsdXNtb2Q9NzI2O2UucGx1c21vbm9zcGFjZT02NTI5MTtlLnBsdXNzbWFsbD02NTEyMjtlLnBsdXNzdXBlcmlvcj04MzE0O2UucG1vbm9zcGFjZT02NTM2MDtlLnBtc3F1YXJlPTEzMjcyO2UucG9oaXJhZ2FuYT0xMjQxMztlLnBvaW50aW5naW5kZXhkb3dud2hpdGU9OTc1OTtlLnBvaW50aW5naW5kZXhsZWZ0d2hpdGU9OTc1NjtlLnBvaW50aW5naW5kZXhyaWdodHdoaXRlPTk3NTg7ZS5wb2ludGluZ2luZGV4dXB3aGl0ZT05NzU3O2UucG9rYXRha2FuYT0xMjUwOTtlLnBvcGxhdGhhaT0zNjExO2UucG9zdGFsbWFyaz0xMjMwNjtlLnBvc3RhbG1hcmtmYWNlPTEyMzIwO2UucHBhcmVuPTkzODc7ZS5wcmVjZWRlcz04ODI2O2UucHJlc2NyaXB0aW9uPTg0Nzg7ZS5wcmltZW1vZD02OTc7ZS5wcmltZXJldmVyc2VkPTgyNDU7ZS5wcm9kdWN0PTg3MTk7ZS5wcm9qZWN0aXZlPTg5NjU7ZS5wcm9sb25nZWRrYW5hPTEyNTQwO2UucHJvcGVsbG9yPTg5ODQ7ZS5wcm9wZXJzdWJzZXQ9ODgzNDtlLnByb3BlcnN1cGVyc2V0PTg4MzU7ZS5wcm9wb3J0aW9uPTg3NTk7ZS5wcm9wb3J0aW9uYWw9ODczMztlLnBzaT05Njg7ZS5wc2ljeXJpbGxpYz0xMTM3O2UucHNpbGlwbmV1bWF0YWN5cmlsbGljY21iPTExNTg7ZS5wc3NxdWFyZT0xMzIzMjtlLnB1aGlyYWdhbmE9MTI0MDc7ZS5wdWthdGFrYW5hPTEyNTAzO2UucHZzcXVhcmU9MTMyMzY7ZS5wd3NxdWFyZT0xMzI0MjtlLnE9MTEzO2UucWFkZXZhPTIzOTI7ZS5xYWRtYWhlYnJldz0xNDQ4O2UucWFmYXJhYmljPTE2MDI7ZS5xYWZmaW5hbGFyYWJpYz02NTIzODtlLnFhZmluaXRpYWxhcmFiaWM9NjUyMzk7ZS5xYWZtZWRpYWxhcmFiaWM9NjUyNDA7ZS5xYW1hdHM9MTQ2NDtlLnFhbWF0czEwPTE0NjQ7ZS5xYW1hdHMxYT0xNDY0O2UucWFtYXRzMWM9MTQ2NDtlLnFhbWF0czI3PTE0NjQ7ZS5xYW1hdHMyOT0xNDY0O2UucWFtYXRzMzM9MTQ2NDtlLnFhbWF0c2RlPTE0NjQ7ZS5xYW1hdHNoZWJyZXc9MTQ2NDtlLnFhbWF0c25hcnJvd2hlYnJldz0xNDY0O2UucWFtYXRzcWF0YW5oZWJyZXc9MTQ2NDtlLnFhbWF0c3FhdGFubmFycm93aGVicmV3PTE0NjQ7ZS5xYW1hdHNxYXRhbnF1YXJ0ZXJoZWJyZXc9MTQ2NDtlLnFhbWF0c3FhdGFud2lkZWhlYnJldz0xNDY0O2UucWFtYXRzcXVhcnRlcmhlYnJldz0xNDY0O2UucWFtYXRzd2lkZWhlYnJldz0xNDY0O2UucWFybmV5cGFyYWhlYnJldz0xNDM5O2UucWJvcG9tb2ZvPTEyNTYxO2UucWNpcmNsZT05NDQwO2UucWhvb2s9NjcyO2UucW1vbm9zcGFjZT02NTM2MTtlLnFvZj0xNTExO2UucW9mZGFnZXNoPTY0MzI3O2UucW9mZGFnZXNoaGVicmV3PTY0MzI3O2UucW9maGVicmV3PTE1MTE7ZS5xcGFyZW49OTM4ODtlLnF1YXJ0ZXJub3RlPTk4MzM7ZS5xdWJ1dHM9MTQ2NztlLnF1YnV0czE4PTE0Njc7ZS5xdWJ1dHMyNT0xNDY3O2UucXVidXRzMzE9MTQ2NztlLnF1YnV0c2hlYnJldz0xNDY3O2UucXVidXRzbmFycm93aGVicmV3PTE0Njc7ZS5xdWJ1dHNxdWFydGVyaGVicmV3PTE0Njc7ZS5xdWJ1dHN3aWRlaGVicmV3PTE0Njc7ZS5xdWVzdGlvbj02MztlLnF1ZXN0aW9uYXJhYmljPTE1Njc7ZS5xdWVzdGlvbmFybWVuaWFuPTEzNzQ7ZS5xdWVzdGlvbmRvd249MTkxO2UucXVlc3Rpb25kb3duc21hbGw9NjM0MjM7ZS5xdWVzdGlvbmdyZWVrPTg5NDtlLnF1ZXN0aW9ubW9ub3NwYWNlPTY1MzExO2UucXVlc3Rpb25zbWFsbD02MzI5NTtlLnF1b3RlZGJsPTM0O2UucXVvdGVkYmxiYXNlPTgyMjI7ZS5xdW90ZWRibGxlZnQ9ODIyMDtlLnF1b3RlZGJsbW9ub3NwYWNlPTY1MjgyO2UucXVvdGVkYmxwcmltZT0xMjMxODtlLnF1b3RlZGJscHJpbWVyZXZlcnNlZD0xMjMxNztlLnF1b3RlZGJscmlnaHQ9ODIyMTtlLnF1b3RlbGVmdD04MjE2O2UucXVvdGVsZWZ0cmV2ZXJzZWQ9ODIxOTtlLnF1b3RlcmV2ZXJzZWQ9ODIxOTtlLnF1b3RlcmlnaHQ9ODIxNztlLnF1b3RlcmlnaHRuPTMyOTtlLnF1b3Rlc2luZ2xiYXNlPTgyMTg7ZS5xdW90ZXNpbmdsZT0zOTtlLnF1b3Rlc2luZ2xlbW9ub3NwYWNlPTY1Mjg3O2Uucj0xMTQ7ZS5yYWFybWVuaWFuPTE0MDQ7ZS5yYWJlbmdhbGk9MjQ4MDtlLnJhY3V0ZT0zNDE7ZS5yYWRldmE9MjM1MjtlLnJhZGljYWw9ODczMDtlLnJhZGljYWxleD02MzcxNztlLnJhZG92ZXJzc3F1YXJlPTEzMjMwO2UucmFkb3ZlcnNzcXVhcmVkc3F1YXJlPTEzMjMxO2UucmFkc3F1YXJlPTEzMjI5O2UucmFmZT0xNDcxO2UucmFmZWhlYnJldz0xNDcxO2UucmFndWphcmF0aT0yNzM2O2UucmFndXJtdWtoaT0yNjA4O2UucmFoaXJhZ2FuYT0xMjQyNTtlLnJha2F0YWthbmE9MTI1MjE7ZS5yYWthdGFrYW5haGFsZndpZHRoPTY1NDMxO2UucmFsb3dlcmRpYWdvbmFsYmVuZ2FsaT0yNTQ1O2UucmFtaWRkbGVkaWFnb25hbGJlbmdhbGk9MjU0NDtlLnJhbXNob3JuPTYxMjtlLnJhdGlvPTg3NTg7ZS5yYm9wb21vZm89MTI1NjY7ZS5yY2Fyb249MzQ1O2UucmNlZGlsbGE9MzQzO2UucmNpcmNsZT05NDQxO2UucmNvbW1hYWNjZW50PTM0MztlLnJkYmxncmF2ZT01Mjk7ZS5yZG90YWNjZW50PTc3Njk7ZS5yZG90YmVsb3c9Nzc3MTtlLnJkb3RiZWxvd21hY3Jvbj03NzczO2UucmVmZXJlbmNlbWFyaz04MjUxO2UucmVmbGV4c3Vic2V0PTg4Mzg7ZS5yZWZsZXhzdXBlcnNldD04ODM5O2UucmVnaXN0ZXJlZD0xNzQ7ZS5yZWdpc3RlcnNhbnM9NjM3MjA7ZS5yZWdpc3RlcnNlcmlmPTYzMTk0O2UucmVoYXJhYmljPTE1ODU7ZS5yZWhhcm1lbmlhbj0xNDA4O2UucmVoZmluYWxhcmFiaWM9NjUxOTg7ZS5yZWhpcmFnYW5hPTEyNDI4O2UucmVrYXRha2FuYT0xMjUyNDtlLnJla2F0YWthbmFoYWxmd2lkdGg9NjU0MzQ7ZS5yZXNoPTE1MTI7ZS5yZXNoZGFnZXNoaGVicmV3PTY0MzI4O2UucmVzaGhlYnJldz0xNTEyO2UucmV2ZXJzZWR0aWxkZT04NzY1O2UucmV2aWFoZWJyZXc9MTQzMTtlLnJldmlhbXVncmFzaGhlYnJldz0xNDMxO2UucmV2bG9naWNhbG5vdD04OTc2O2UucmZpc2hob29rPTYzODtlLnJmaXNoaG9va3JldmVyc2VkPTYzOTtlLnJoYWJlbmdhbGk9MjUyNTtlLnJoYWRldmE9MjM5NztlLnJobz05NjE7ZS5yaG9vaz02Mzc7ZS5yaG9va3R1cm5lZD02MzU7ZS5yaG9va3R1cm5lZHN1cGVyaW9yPTY5MztlLnJob3N5bWJvbGdyZWVrPTEwMDk7ZS5yaG90aWNob29rbW9kPTczNDtlLnJpZXVsYWNpcmNsZWtvcmVhbj0xMjkxMztlLnJpZXVsYXBhcmVua29yZWFuPTEyODE3O2UucmlldWxjaXJjbGVrb3JlYW49MTI4OTk7ZS5yaWV1bGhpZXVoa29yZWFuPTEyNjA4O2UucmlldWxraXllb2trb3JlYW49MTI2MDI7ZS5yaWV1bGtpeWVva3Npb3Nrb3JlYW49MTI2NDk7ZS5yaWV1bGtvcmVhbj0xMjYwMTtlLnJpZXVsbWlldW1rb3JlYW49MTI2MDM7ZS5yaWV1bHBhbnNpb3Nrb3JlYW49MTI2NTI7ZS5yaWV1bHBhcmVua29yZWFuPTEyODAzO2UucmlldWxwaGlldXBoa29yZWFuPTEyNjA3O2UucmlldWxwaWV1cGtvcmVhbj0xMjYwNDtlLnJpZXVscGlldXBzaW9za29yZWFuPTEyNjUxO2UucmlldWxzaW9za29yZWFuPTEyNjA1O2UucmlldWx0aGlldXRoa29yZWFuPTEyNjA2O2UucmlldWx0aWtldXRrb3JlYW49MTI2NTA7ZS5yaWV1bHllb3JpbmhpZXVoa29yZWFuPTEyNjUzO2UucmlnaHRhbmdsZT04NzM1O2UucmlnaHR0YWNrYmVsb3djbWI9NzkzO2UucmlnaHR0cmlhbmdsZT04ODk1O2UucmloaXJhZ2FuYT0xMjQyNjtlLnJpa2F0YWthbmE9MTI1MjI7ZS5yaWthdGFrYW5haGFsZndpZHRoPTY1NDMyO2UucmluZz03MzA7ZS5yaW5nYmVsb3djbWI9ODA1O2UucmluZ2NtYj03Nzg7ZS5yaW5naGFsZmxlZnQ9NzAzO2UucmluZ2hhbGZsZWZ0YXJtZW5pYW49MTM2OTtlLnJpbmdoYWxmbGVmdGJlbG93Y21iPTc5NjtlLnJpbmdoYWxmbGVmdGNlbnRlcmVkPTcyMztlLnJpbmdoYWxmcmlnaHQ9NzAyO2UucmluZ2hhbGZyaWdodGJlbG93Y21iPTgyNTtlLnJpbmdoYWxmcmlnaHRjZW50ZXJlZD03MjI7ZS5yaW52ZXJ0ZWRicmV2ZT01MzE7ZS5yaXR0b3J1c3F1YXJlPTEzMTM3O2UucmxpbmViZWxvdz03Nzc1O2UucmxvbmdsZWc9NjM2O2UucmxvbmdsZWd0dXJuZWQ9NjM0O2Uucm1vbm9zcGFjZT02NTM2MjtlLnJvaGlyYWdhbmE9MTI0Mjk7ZS5yb2thdGFrYW5hPTEyNTI1O2Uucm9rYXRha2FuYWhhbGZ3aWR0aD02NTQzNTtlLnJvcnVhdGhhaT0zNjE5O2UucnBhcmVuPTkzODk7ZS5ycmFiZW5nYWxpPTI1MjQ7ZS5ycmFkZXZhPTIzNTM7ZS5ycmFndXJtdWtoaT0yNjUyO2UucnJlaGFyYWJpYz0xNjgxO2UucnJlaGZpbmFsYXJhYmljPTY0Mzk3O2UucnJ2b2NhbGljYmVuZ2FsaT0yNTI4O2UucnJ2b2NhbGljZGV2YT0yNDAwO2UucnJ2b2NhbGljZ3VqYXJhdGk9Mjc4NDtlLnJydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGk9MjUwMDtlLnJydm9jYWxpY3Zvd2Vsc2lnbmRldmE9MjM3MjtlLnJydm9jYWxpY3Zvd2Vsc2lnbmd1amFyYXRpPTI3NTY7ZS5yc3VwZXJpb3I9NjMyMTc7ZS5ydGJsb2NrPTk2MTY7ZS5ydHVybmVkPTYzMztlLnJ0dXJuZWRzdXBlcmlvcj02OTI7ZS5ydWhpcmFnYW5hPTEyNDI3O2UucnVrYXRha2FuYT0xMjUyMztlLnJ1a2F0YWthbmFoYWxmd2lkdGg9NjU0MzM7ZS5ydXBlZW1hcmtiZW5nYWxpPTI1NDY7ZS5ydXBlZXNpZ25iZW5nYWxpPTI1NDc7ZS5ydXBpYWg9NjMxOTc7ZS5ydXRoYWk9MzYyMDtlLnJ2b2NhbGljYmVuZ2FsaT0yNDQzO2UucnZvY2FsaWNkZXZhPTIzMTU7ZS5ydm9jYWxpY2d1amFyYXRpPTI2OTk7ZS5ydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGk9MjQ5OTtlLnJ2b2NhbGljdm93ZWxzaWduZGV2YT0yMzcxO2UucnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aT0yNzU1O2Uucz0xMTU7ZS5zYWJlbmdhbGk9MjQ4ODtlLnNhY3V0ZT0zNDc7ZS5zYWN1dGVkb3RhY2NlbnQ9Nzc4MTtlLnNhZGFyYWJpYz0xNTg5O2Uuc2FkZXZhPTIzNjA7ZS5zYWRmaW5hbGFyYWJpYz02NTIxMDtlLnNhZGluaXRpYWxhcmFiaWM9NjUyMTE7ZS5zYWRtZWRpYWxhcmFiaWM9NjUyMTI7ZS5zYWd1amFyYXRpPTI3NDQ7ZS5zYWd1cm11a2hpPTI2MTY7ZS5zYWhpcmFnYW5hPTEyMzczO2Uuc2FrYXRha2FuYT0xMjQ2OTtlLnNha2F0YWthbmFoYWxmd2lkdGg9NjU0MDM7ZS5zYWxsYWxsYWhvdWFsYXloZXdhc2FsbGFtYXJhYmljPTY1MDE4O2Uuc2FtZWtoPTE1MDU7ZS5zYW1la2hkYWdlc2g9NjQzMjE7ZS5zYW1la2hkYWdlc2hoZWJyZXc9NjQzMjE7ZS5zYW1la2hoZWJyZXc9MTUwNTtlLnNhcmFhYXRoYWk9MzYzNDtlLnNhcmFhZXRoYWk9MzY0OTtlLnNhcmFhaW1haW1hbGFpdGhhaT0zNjUyO2Uuc2FyYWFpbWFpbXVhbnRoYWk9MzY1MTtlLnNhcmFhbXRoYWk9MzYzNTtlLnNhcmFhdGhhaT0zNjMyO2Uuc2FyYWV0aGFpPTM2NDg7ZS5zYXJhaWlsZWZ0dGhhaT02MzYyMjtlLnNhcmFpaXRoYWk9MzYzNztlLnNhcmFpbGVmdHRoYWk9NjM2MjE7ZS5zYXJhaXRoYWk9MzYzNjtlLnNhcmFvdGhhaT0zNjUwO2Uuc2FyYXVlZWxlZnR0aGFpPTYzNjI0O2Uuc2FyYXVlZXRoYWk9MzYzOTtlLnNhcmF1ZWxlZnR0aGFpPTYzNjIzO2Uuc2FyYXVldGhhaT0zNjM4O2Uuc2FyYXV0aGFpPTM2NDA7ZS5zYXJhdXV0aGFpPTM2NDE7ZS5zYm9wb21vZm89MTI1Njk7ZS5zY2Fyb249MzUzO2Uuc2Nhcm9uZG90YWNjZW50PTc3ODM7ZS5zY2VkaWxsYT0zNTE7ZS5zY2h3YT02MDE7ZS5zY2h3YWN5cmlsbGljPTEyNDE7ZS5zY2h3YWRpZXJlc2lzY3lyaWxsaWM9MTI0MztlLnNjaHdhaG9vaz02MDI7ZS5zY2lyY2xlPTk0NDI7ZS5zY2lyY3VtZmxleD0zNDk7ZS5zY29tbWFhY2NlbnQ9NTM3O2Uuc2RvdGFjY2VudD03Nzc3O2Uuc2RvdGJlbG93PTc3Nzk7ZS5zZG90YmVsb3dkb3RhY2NlbnQ9Nzc4NTtlLnNlYWd1bGxiZWxvd2NtYj04Mjg7ZS5zZWNvbmQ9ODI0MztlLnNlY29uZHRvbmVjaGluZXNlPTcxNDtlLnNlY3Rpb249MTY3O2Uuc2VlbmFyYWJpYz0xNTg3O2Uuc2VlbmZpbmFsYXJhYmljPTY1MjAyO2Uuc2VlbmluaXRpYWxhcmFiaWM9NjUyMDM7ZS5zZWVubWVkaWFsYXJhYmljPTY1MjA0O2Uuc2Vnb2w9MTQ2MjtlLnNlZ29sMTM9MTQ2MjtlLnNlZ29sMWY9MTQ2MjtlLnNlZ29sMmM9MTQ2MjtlLnNlZ29saGVicmV3PTE0NjI7ZS5zZWdvbG5hcnJvd2hlYnJldz0xNDYyO2Uuc2Vnb2xxdWFydGVyaGVicmV3PTE0NjI7ZS5zZWdvbHRhaGVicmV3PTE0MjY7ZS5zZWdvbHdpZGVoZWJyZXc9MTQ2MjtlLnNlaGFybWVuaWFuPTE0MDU7ZS5zZWhpcmFnYW5hPTEyMzc5O2Uuc2VrYXRha2FuYT0xMjQ3NTtlLnNla2F0YWthbmFoYWxmd2lkdGg9NjU0MDY7ZS5zZW1pY29sb249NTk7ZS5zZW1pY29sb25hcmFiaWM9MTU2MztlLnNlbWljb2xvbm1vbm9zcGFjZT02NTMwNztlLnNlbWljb2xvbnNtYWxsPTY1MTA4O2Uuc2VtaXZvaWNlZG1hcmtrYW5hPTEyNDQ0O2Uuc2VtaXZvaWNlZG1hcmtrYW5haGFsZndpZHRoPTY1NDM5O2Uuc2VudGlzcXVhcmU9MTMwOTA7ZS5zZW50b3NxdWFyZT0xMzA5MTtlLnNldmVuPTU1O2Uuc2V2ZW5hcmFiaWM9MTYzOTtlLnNldmVuYmVuZ2FsaT0yNTQxO2Uuc2V2ZW5jaXJjbGU9OTMxODtlLnNldmVuY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyODtlLnNldmVuZGV2YT0yNDEzO2Uuc2V2ZW5laWdodGhzPTg1NDI7ZS5zZXZlbmd1amFyYXRpPTI3OTc7ZS5zZXZlbmd1cm11a2hpPTI2Njk7ZS5zZXZlbmhhY2thcmFiaWM9MTYzOTtlLnNldmVuaGFuZ3pob3U9MTIzMjc7ZS5zZXZlbmlkZW9ncmFwaGljcGFyZW49MTI4Mzg7ZS5zZXZlbmluZmVyaW9yPTgzMjc7ZS5zZXZlbm1vbm9zcGFjZT02NTMwMztlLnNldmVub2xkc3R5bGU9NjMyODc7ZS5zZXZlbnBhcmVuPTkzMzg7ZS5zZXZlbnBlcmlvZD05MzU4O2Uuc2V2ZW5wZXJzaWFuPTE3ODM7ZS5zZXZlbnJvbWFuPTg1NjY7ZS5zZXZlbnN1cGVyaW9yPTgzMTE7ZS5zZXZlbnRlZW5jaXJjbGU9OTMyODtlLnNldmVudGVlbnBhcmVuPTkzNDg7ZS5zZXZlbnRlZW5wZXJpb2Q9OTM2ODtlLnNldmVudGhhaT0zNjcxO2Uuc2Z0aHlwaGVuPTE3MztlLnNoYWFybWVuaWFuPTEzOTk7ZS5zaGFiZW5nYWxpPTI0ODY7ZS5zaGFjeXJpbGxpYz0xMDk2O2Uuc2hhZGRhYXJhYmljPTE2MTc7ZS5zaGFkZGFkYW1tYWFyYWJpYz02NDYwOTtlLnNoYWRkYWRhbW1hdGFuYXJhYmljPTY0NjA2O2Uuc2hhZGRhZmF0aGFhcmFiaWM9NjQ2MDg7ZS5zaGFkZGFrYXNyYWFyYWJpYz02NDYxMDtlLnNoYWRkYWthc3JhdGFuYXJhYmljPTY0NjA3O2Uuc2hhZGU9OTYxODtlLnNoYWRlZGFyaz05NjE5O2Uuc2hhZGVsaWdodD05NjE3O2Uuc2hhZGVtZWRpdW09OTYxODtlLnNoYWRldmE9MjM1ODtlLnNoYWd1amFyYXRpPTI3NDI7ZS5zaGFndXJtdWtoaT0yNjE0O2Uuc2hhbHNoZWxldGhlYnJldz0xNDI3O2Uuc2hib3BvbW9mbz0xMjU2NTtlLnNoY2hhY3lyaWxsaWM9MTA5NztlLnNoZWVuYXJhYmljPTE1ODg7ZS5zaGVlbmZpbmFsYXJhYmljPTY1MjA2O2Uuc2hlZW5pbml0aWFsYXJhYmljPTY1MjA3O2Uuc2hlZW5tZWRpYWxhcmFiaWM9NjUyMDg7ZS5zaGVpY29wdGljPTk5NTtlLnNoZXFlbD04MzYyO2Uuc2hlcWVsaGVicmV3PTgzNjI7ZS5zaGV2YT0xNDU2O2Uuc2hldmExMTU9MTQ1NjtlLnNoZXZhMTU9MTQ1NjtlLnNoZXZhMjI9MTQ1NjtlLnNoZXZhMmU9MTQ1NjtlLnNoZXZhaGVicmV3PTE0NTY7ZS5zaGV2YW5hcnJvd2hlYnJldz0xNDU2O2Uuc2hldmFxdWFydGVyaGVicmV3PTE0NTY7ZS5zaGV2YXdpZGVoZWJyZXc9MTQ1NjtlLnNoaGFjeXJpbGxpYz0xMjExO2Uuc2hpbWFjb3B0aWM9MTAwNTtlLnNoaW49MTUxMztlLnNoaW5kYWdlc2g9NjQzMjk7ZS5zaGluZGFnZXNoaGVicmV3PTY0MzI5O2Uuc2hpbmRhZ2VzaHNoaW5kb3Q9NjQzMDA7ZS5zaGluZGFnZXNoc2hpbmRvdGhlYnJldz02NDMwMDtlLnNoaW5kYWdlc2hzaW5kb3Q9NjQzMDE7ZS5zaGluZGFnZXNoc2luZG90aGVicmV3PTY0MzAxO2Uuc2hpbmRvdGhlYnJldz0xNDczO2Uuc2hpbmhlYnJldz0xNTEzO2Uuc2hpbnNoaW5kb3Q9NjQyOTg7ZS5zaGluc2hpbmRvdGhlYnJldz02NDI5ODtlLnNoaW5zaW5kb3Q9NjQyOTk7ZS5zaGluc2luZG90aGVicmV3PTY0Mjk5O2Uuc2hvb2s9NjQyO2Uuc2lnbWE9OTYzO2Uuc2lnbWExPTk2MjtlLnNpZ21hZmluYWw9OTYyO2Uuc2lnbWFsdW5hdGVzeW1ib2xncmVlaz0xMDEwO2Uuc2loaXJhZ2FuYT0xMjM3NTtlLnNpa2F0YWthbmE9MTI0NzE7ZS5zaWthdGFrYW5haGFsZndpZHRoPTY1NDA0O2Uuc2lsdXFoZWJyZXc9MTQ2OTtlLnNpbHVxbGVmdGhlYnJldz0xNDY5O2Uuc2ltaWxhcj04NzY0O2Uuc2luZG90aGVicmV3PTE0NzQ7ZS5zaW9zYWNpcmNsZWtvcmVhbj0xMjkxNjtlLnNpb3NhcGFyZW5rb3JlYW49MTI4MjA7ZS5zaW9zY2lldWNrb3JlYW49MTI2NzA7ZS5zaW9zY2lyY2xla29yZWFuPTEyOTAyO2Uuc2lvc2tpeWVva2tvcmVhbj0xMjY2NjtlLnNpb3Nrb3JlYW49MTI2MTM7ZS5zaW9zbmlldW5rb3JlYW49MTI2Njc7ZS5zaW9zcGFyZW5rb3JlYW49MTI4MDY7ZS5zaW9zcGlldXBrb3JlYW49MTI2Njk7ZS5zaW9zdGlrZXV0a29yZWFuPTEyNjY4O2Uuc2l4PTU0O2Uuc2l4YXJhYmljPTE2Mzg7ZS5zaXhiZW5nYWxpPTI1NDA7ZS5zaXhjaXJjbGU9OTMxNztlLnNpeGNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjc7ZS5zaXhkZXZhPTI0MTI7ZS5zaXhndWphcmF0aT0yNzk2O2Uuc2l4Z3VybXVraGk9MjY2ODtlLnNpeGhhY2thcmFiaWM9MTYzODtlLnNpeGhhbmd6aG91PTEyMzI2O2Uuc2l4aWRlb2dyYXBoaWNwYXJlbj0xMjgzNztlLnNpeGluZmVyaW9yPTgzMjY7ZS5zaXhtb25vc3BhY2U9NjUzMDI7ZS5zaXhvbGRzdHlsZT02MzI4NjtlLnNpeHBhcmVuPTkzMzc7ZS5zaXhwZXJpb2Q9OTM1NztlLnNpeHBlcnNpYW49MTc4MjtlLnNpeHJvbWFuPTg1NjU7ZS5zaXhzdXBlcmlvcj04MzEwO2Uuc2l4dGVlbmNpcmNsZT05MzI3O2Uuc2l4dGVlbmN1cnJlbmN5ZGVub21pbmF0b3JiZW5nYWxpPTI1NTM7ZS5zaXh0ZWVucGFyZW49OTM0NztlLnNpeHRlZW5wZXJpb2Q9OTM2NztlLnNpeHRoYWk9MzY3MDtlLnNsYXNoPTQ3O2Uuc2xhc2htb25vc3BhY2U9NjUyOTU7ZS5zbG9uZz0zODM7ZS5zbG9uZ2RvdGFjY2VudD03ODM1O2Uuc21pbGVmYWNlPTk3ODY7ZS5zbW9ub3NwYWNlPTY1MzYzO2Uuc29mcGFzdXFoZWJyZXc9MTQ3NTtlLnNvZnRoeXBoZW49MTczO2Uuc29mdHNpZ25jeXJpbGxpYz0xMTAwO2Uuc29oaXJhZ2FuYT0xMjM4MTtlLnNva2F0YWthbmE9MTI0Nzc7ZS5zb2thdGFrYW5haGFsZndpZHRoPTY1NDA3O2Uuc29saWR1c2xvbmdvdmVybGF5Y21iPTgyNDtlLnNvbGlkdXNzaG9ydG92ZXJsYXljbWI9ODIzO2Uuc29ydXNpdGhhaT0zNjI1O2Uuc29zYWxhdGhhaT0zNjI0O2Uuc29zb3RoYWk9MzU5NTtlLnNvc3VhdGhhaT0zNjI2O2Uuc3BhY2U9MzI7ZS5zcGFjZWhhY2thcmFiaWM9MzI7ZS5zcGFkZT05ODI0O2Uuc3BhZGVzdWl0YmxhY2s9OTgyNDtlLnNwYWRlc3VpdHdoaXRlPTk4Mjg7ZS5zcGFyZW49OTM5MDtlLnNxdWFyZWJlbG93Y21iPTgyNztlLnNxdWFyZWNjPTEzMjUyO2Uuc3F1YXJlY209MTMyMTM7ZS5zcXVhcmVkaWFnb25hbGNyb3NzaGF0Y2hmaWxsPTk2NDE7ZS5zcXVhcmVob3Jpem9udGFsZmlsbD05NjM2O2Uuc3F1YXJla2c9MTMxOTk7ZS5zcXVhcmVrbT0xMzIxNDtlLnNxdWFyZWttY2FwaXRhbD0xMzI2MjtlLnNxdWFyZWxuPTEzMjY1O2Uuc3F1YXJlbG9nPTEzMjY2O2Uuc3F1YXJlbWc9MTMxOTg7ZS5zcXVhcmVtaWw9MTMyNjk7ZS5zcXVhcmVtbT0xMzIxMjtlLnNxdWFyZW1zcXVhcmVkPTEzMjE3O2Uuc3F1YXJlb3J0aG9nb25hbGNyb3NzaGF0Y2hmaWxsPTk2Mzg7ZS5zcXVhcmV1cHBlcmxlZnR0b2xvd2VycmlnaHRmaWxsPTk2Mzk7ZS5zcXVhcmV1cHBlcnJpZ2h0dG9sb3dlcmxlZnRmaWxsPTk2NDA7ZS5zcXVhcmV2ZXJ0aWNhbGZpbGw9OTYzNztlLnNxdWFyZXdoaXRld2l0aHNtYWxsYmxhY2s9OTYzNTtlLnNyc3F1YXJlPTEzMjc1O2Uuc3NhYmVuZ2FsaT0yNDg3O2Uuc3NhZGV2YT0yMzU5O2Uuc3NhZ3VqYXJhdGk9Mjc0MztlLnNzYW5nY2lldWNrb3JlYW49MTI2MTc7ZS5zc2FuZ2hpZXVoa29yZWFuPTEyNjc3O2Uuc3NhbmdpZXVuZ2tvcmVhbj0xMjY3MjtlLnNzYW5na2l5ZW9ra29yZWFuPTEyNTk0O2Uuc3NhbmduaWV1bmtvcmVhbj0xMjY0NTtlLnNzYW5ncGlldXBrb3JlYW49MTI2MTE7ZS5zc2FuZ3Npb3Nrb3JlYW49MTI2MTQ7ZS5zc2FuZ3Rpa2V1dGtvcmVhbj0xMjYwMDtlLnNzdXBlcmlvcj02MzIxODtlLnN0ZXJsaW5nPTE2MztlLnN0ZXJsaW5nbW9ub3NwYWNlPTY1NTA1O2Uuc3Ryb2tlbG9uZ292ZXJsYXljbWI9ODIyO2Uuc3Ryb2tlc2hvcnRvdmVybGF5Y21iPTgyMTtlLnN1YnNldD04ODM0O2Uuc3Vic2V0bm90ZXF1YWw9ODg0MjtlLnN1YnNldG9yZXF1YWw9ODgzODtlLnN1Y2NlZWRzPTg4Mjc7ZS5zdWNodGhhdD04NzE1O2Uuc3VoaXJhZ2FuYT0xMjM3NztlLnN1a2F0YWthbmE9MTI0NzM7ZS5zdWthdGFrYW5haGFsZndpZHRoPTY1NDA1O2Uuc3VrdW5hcmFiaWM9MTYxODtlLnN1bW1hdGlvbj04NzIxO2Uuc3VuPTk3ODg7ZS5zdXBlcnNldD04ODM1O2Uuc3VwZXJzZXRub3RlcXVhbD04ODQzO2Uuc3VwZXJzZXRvcmVxdWFsPTg4Mzk7ZS5zdnNxdWFyZT0xMzI3NjtlLnN5b3V3YWVyYXNxdWFyZT0xMzE4MDtlLnQ9MTE2O2UudGFiZW5nYWxpPTI0Njg7ZS50YWNrZG93bj04ODY4O2UudGFja2xlZnQ9ODg2NztlLnRhZGV2YT0yMzQwO2UudGFndWphcmF0aT0yNzI0O2UudGFndXJtdWtoaT0yNTk2O2UudGFoYXJhYmljPTE1OTE7ZS50YWhmaW5hbGFyYWJpYz02NTIxODtlLnRhaGluaXRpYWxhcmFiaWM9NjUyMTk7ZS50YWhpcmFnYW5hPTEyMzgzO2UudGFobWVkaWFsYXJhYmljPTY1MjIwO2UudGFpc3lvdWVyYXNxdWFyZT0xMzE4MTtlLnRha2F0YWthbmE9MTI0Nzk7ZS50YWthdGFrYW5haGFsZndpZHRoPTY1NDA4O2UudGF0d2VlbGFyYWJpYz0xNjAwO2UudGF1PTk2NDtlLnRhdj0xNTE0O2UudGF2ZGFnZXM9NjQzMzA7ZS50YXZkYWdlc2g9NjQzMzA7ZS50YXZkYWdlc2hoZWJyZXc9NjQzMzA7ZS50YXZoZWJyZXc9MTUxNDtlLnRiYXI9MzU5O2UudGJvcG9tb2ZvPTEyNTU0O2UudGNhcm9uPTM1NztlLnRjY3VybD02ODA7ZS50Y2VkaWxsYT0zNTU7ZS50Y2hlaGFyYWJpYz0xNjcwO2UudGNoZWhmaW5hbGFyYWJpYz02NDM3OTtlLnRjaGVoaW5pdGlhbGFyYWJpYz02NDM4MDtlLnRjaGVobWVkaWFsYXJhYmljPTY0MzgxO2UudGNpcmNsZT05NDQzO2UudGNpcmN1bWZsZXhiZWxvdz03NzkzO2UudGNvbW1hYWNjZW50PTM1NTtlLnRkaWVyZXNpcz03ODMxO2UudGRvdGFjY2VudD03Nzg3O2UudGRvdGJlbG93PTc3ODk7ZS50ZWN5cmlsbGljPTEwOTA7ZS50ZWRlc2NlbmRlcmN5cmlsbGljPTExOTc7ZS50ZWhhcmFiaWM9MTU3ODtlLnRlaGZpbmFsYXJhYmljPTY1MTc0O2UudGVoaGFoaW5pdGlhbGFyYWJpYz02NDY3NDtlLnRlaGhhaGlzb2xhdGVkYXJhYmljPTY0NTI0O2UudGVoaW5pdGlhbGFyYWJpYz02NTE3NTtlLnRlaGlyYWdhbmE9MTIzOTA7ZS50ZWhqZWVtaW5pdGlhbGFyYWJpYz02NDY3MztlLnRlaGplZW1pc29sYXRlZGFyYWJpYz02NDUyMztlLnRlaG1hcmJ1dGFhcmFiaWM9MTU3NztlLnRlaG1hcmJ1dGFmaW5hbGFyYWJpYz02NTE3MjtlLnRlaG1lZGlhbGFyYWJpYz02NTE3NjtlLnRlaG1lZW1pbml0aWFsYXJhYmljPTY0Njc2O2UudGVobWVlbWlzb2xhdGVkYXJhYmljPTY0NTI2O2UudGVobm9vbmZpbmFsYXJhYmljPTY0NjI3O2UudGVrYXRha2FuYT0xMjQ4NjtlLnRla2F0YWthbmFoYWxmd2lkdGg9NjU0MTE7ZS50ZWxlcGhvbmU9ODQ4MTtlLnRlbGVwaG9uZWJsYWNrPTk3NDI7ZS50ZWxpc2hhZ2Vkb2xhaGVicmV3PTE0NDA7ZS50ZWxpc2hhcWV0YW5haGVicmV3PTE0NDk7ZS50ZW5jaXJjbGU9OTMyMTtlLnRlbmlkZW9ncmFwaGljcGFyZW49MTI4NDE7ZS50ZW5wYXJlbj05MzQxO2UudGVucGVyaW9kPTkzNjE7ZS50ZW5yb21hbj04NTY5O2UudGVzaD02Nzk7ZS50ZXQ9MTQ5NjtlLnRldGRhZ2VzaD02NDMxMjtlLnRldGRhZ2VzaGhlYnJldz02NDMxMjtlLnRldGhlYnJldz0xNDk2O2UudGV0c2VjeXJpbGxpYz0xMjA1O2UudGV2aXJoZWJyZXc9MTQzNTtlLnRldmlybGVmdGhlYnJldz0xNDM1O2UudGhhYmVuZ2FsaT0yNDY5O2UudGhhZGV2YT0yMzQxO2UudGhhZ3VqYXJhdGk9MjcyNTtlLnRoYWd1cm11a2hpPTI1OTc7ZS50aGFsYXJhYmljPTE1ODQ7ZS50aGFsZmluYWxhcmFiaWM9NjUxOTY7ZS50aGFudGhha2hhdGxvd2xlZnR0aGFpPTYzNjQwO2UudGhhbnRoYWtoYXRsb3dyaWdodHRoYWk9NjM2Mzk7ZS50aGFudGhha2hhdHRoYWk9MzY2MDtlLnRoYW50aGFraGF0dXBwZXJsZWZ0dGhhaT02MzYzODtlLnRoZWhhcmFiaWM9MTU3OTtlLnRoZWhmaW5hbGFyYWJpYz02NTE3ODtlLnRoZWhpbml0aWFsYXJhYmljPTY1MTc5O2UudGhlaG1lZGlhbGFyYWJpYz02NTE4MDtlLnRoZXJlZXhpc3RzPTg3MDc7ZS50aGVyZWZvcmU9ODc1NjtlLnRoZXRhPTk1MjtlLnRoZXRhMT05Nzc7ZS50aGV0YXN5bWJvbGdyZWVrPTk3NztlLnRoaWV1dGhhY2lyY2xla29yZWFuPTEyOTIxO2UudGhpZXV0aGFwYXJlbmtvcmVhbj0xMjgyNTtlLnRoaWV1dGhjaXJjbGVrb3JlYW49MTI5MDc7ZS50aGlldXRoa29yZWFuPTEyNjIwO2UudGhpZXV0aHBhcmVua29yZWFuPTEyODExO2UudGhpcnRlZW5jaXJjbGU9OTMyNDtlLnRoaXJ0ZWVucGFyZW49OTM0NDtlLnRoaXJ0ZWVucGVyaW9kPTkzNjQ7ZS50aG9uYW5nbW9udGhvdGhhaT0zNjAxO2UudGhvb2s9NDI5O2UudGhvcGh1dGhhb3RoYWk9MzYwMjtlLnRob3JuPTI1NDtlLnRob3RoYWhhbnRoYWk9MzYwNztlLnRob3RoYW50aGFpPTM2MDA7ZS50aG90aG9uZ3RoYWk9MzYwODtlLnRob3RodW5ndGhhaT0zNjA2O2UudGhvdXNhbmRjeXJpbGxpYz0xMTU0O2UudGhvdXNhbmRzc2VwYXJhdG9yYXJhYmljPTE2NDQ7ZS50aG91c2FuZHNzZXBhcmF0b3JwZXJzaWFuPTE2NDQ7ZS50aHJlZT01MTtlLnRocmVlYXJhYmljPTE2MzU7ZS50aHJlZWJlbmdhbGk9MjUzNztlLnRocmVlY2lyY2xlPTkzMTQ7ZS50aHJlZWNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjQ7ZS50aHJlZWRldmE9MjQwOTtlLnRocmVlZWlnaHRocz04NTQwO2UudGhyZWVndWphcmF0aT0yNzkzO2UudGhyZWVndXJtdWtoaT0yNjY1O2UudGhyZWVoYWNrYXJhYmljPTE2MzU7ZS50aHJlZWhhbmd6aG91PTEyMzIzO2UudGhyZWVpZGVvZ3JhcGhpY3BhcmVuPTEyODM0O2UudGhyZWVpbmZlcmlvcj04MzIzO2UudGhyZWVtb25vc3BhY2U9NjUyOTk7ZS50aHJlZW51bWVyYXRvcmJlbmdhbGk9MjU1MDtlLnRocmVlb2xkc3R5bGU9NjMyODM7ZS50aHJlZXBhcmVuPTkzMzQ7ZS50aHJlZXBlcmlvZD05MzU0O2UudGhyZWVwZXJzaWFuPTE3Nzk7ZS50aHJlZXF1YXJ0ZXJzPTE5MDtlLnRocmVlcXVhcnRlcnNlbWRhc2g9NjMxOTg7ZS50aHJlZXJvbWFuPTg1NjI7ZS50aHJlZXN1cGVyaW9yPTE3OTtlLnRocmVldGhhaT0zNjY3O2UudGh6c3F1YXJlPTEzMjA0O2UudGloaXJhZ2FuYT0xMjM4NTtlLnRpa2F0YWthbmE9MTI0ODE7ZS50aWthdGFrYW5haGFsZndpZHRoPTY1NDA5O2UudGlrZXV0YWNpcmNsZWtvcmVhbj0xMjkxMjtlLnRpa2V1dGFwYXJlbmtvcmVhbj0xMjgxNjtlLnRpa2V1dGNpcmNsZWtvcmVhbj0xMjg5ODtlLnRpa2V1dGtvcmVhbj0xMjU5OTtlLnRpa2V1dHBhcmVua29yZWFuPTEyODAyO2UudGlsZGU9NzMyO2UudGlsZGViZWxvd2NtYj04MTY7ZS50aWxkZWNtYj03NzE7ZS50aWxkZWNvbWI9NzcxO2UudGlsZGVkb3VibGVjbWI9ODY0O2UudGlsZGVvcGVyYXRvcj04NzY0O2UudGlsZGVvdmVybGF5Y21iPTgyMDtlLnRpbGRldmVydGljYWxjbWI9ODMwO2UudGltZXNjaXJjbGU9ODg1NTtlLnRpcGVoYWhlYnJldz0xNDMwO2UudGlwZWhhbGVmdGhlYnJldz0xNDMwO2UudGlwcGlndXJtdWtoaT0yNjcyO2UudGl0bG9jeXJpbGxpY2NtYj0xMTU1O2UudGl3bmFybWVuaWFuPTE0MDc7ZS50bGluZWJlbG93PTc3OTE7ZS50bW9ub3NwYWNlPTY1MzY0O2UudG9hcm1lbmlhbj0xMzg1O2UudG9oaXJhZ2FuYT0xMjM5MjtlLnRva2F0YWthbmE9MTI0ODg7ZS50b2thdGFrYW5haGFsZndpZHRoPTY1NDEyO2UudG9uZWJhcmV4dHJhaGlnaG1vZD03NDE7ZS50b25lYmFyZXh0cmFsb3dtb2Q9NzQ1O2UudG9uZWJhcmhpZ2htb2Q9NzQyO2UudG9uZWJhcmxvd21vZD03NDQ7ZS50b25lYmFybWlkbW9kPTc0MztlLnRvbmVmaXZlPTQ0NTtlLnRvbmVzaXg9Mzg5O2UudG9uZXR3bz00MjQ7ZS50b25vcz05MDA7ZS50b25zcXVhcmU9MTMwOTU7ZS50b3BhdGFrdGhhaT0zNTk5O2UudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0PTEyMzA4O2UudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0c21hbGw9NjUxMTc7ZS50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnR2ZXJ0aWNhbD02NTA4MTtlLnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQ9MTIzMDk7ZS50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0c21hbGw9NjUxMTg7ZS50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODI7ZS50b3Rhb3RoYWk9MzYwNTtlLnRwYWxhdGFsaG9vaz00Mjc7ZS50cGFyZW49OTM5MTtlLnRyYWRlbWFyaz04NDgyO2UudHJhZGVtYXJrc2Fucz02MzcyMjtlLnRyYWRlbWFya3NlcmlmPTYzMTk1O2UudHJldHJvZmxleGhvb2s9NjQ4O2UudHJpYWdkbj05NjYwO2UudHJpYWdsZj05NjY4O2UudHJpYWdydD05NjU4O2UudHJpYWd1cD05NjUwO2UudHM9Njc4O2UudHNhZGk9MTUxMDtlLnRzYWRpZGFnZXNoPTY0MzI2O2UudHNhZGlkYWdlc2hoZWJyZXc9NjQzMjY7ZS50c2FkaWhlYnJldz0xNTEwO2UudHNlY3lyaWxsaWM9MTA5NDtlLnRzZXJlPTE0NjE7ZS50c2VyZTEyPTE0NjE7ZS50c2VyZTFlPTE0NjE7ZS50c2VyZTJiPTE0NjE7ZS50c2VyZWhlYnJldz0xNDYxO2UudHNlcmVuYXJyb3doZWJyZXc9MTQ2MTtlLnRzZXJlcXVhcnRlcmhlYnJldz0xNDYxO2UudHNlcmV3aWRlaGVicmV3PTE0NjE7ZS50c2hlY3lyaWxsaWM9MTExNTtlLnRzdXBlcmlvcj02MzIxOTtlLnR0YWJlbmdhbGk9MjQ2MztlLnR0YWRldmE9MjMzNTtlLnR0YWd1amFyYXRpPTI3MTk7ZS50dGFndXJtdWtoaT0yNTkxO2UudHRlaGFyYWJpYz0xNjU3O2UudHRlaGZpbmFsYXJhYmljPTY0MzU5O2UudHRlaGluaXRpYWxhcmFiaWM9NjQzNjA7ZS50dGVobWVkaWFsYXJhYmljPTY0MzYxO2UudHRoYWJlbmdhbGk9MjQ2NDtlLnR0aGFkZXZhPTIzMzY7ZS50dGhhZ3VqYXJhdGk9MjcyMDtlLnR0aGFndXJtdWtoaT0yNTkyO2UudHR1cm5lZD02NDc7ZS50dWhpcmFnYW5hPTEyMzg4O2UudHVrYXRha2FuYT0xMjQ4NDtlLnR1a2F0YWthbmFoYWxmd2lkdGg9NjU0MTA7ZS50dXNtYWxsaGlyYWdhbmE9MTIzODc7ZS50dXNtYWxsa2F0YWthbmE9MTI0ODM7ZS50dXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzOTE7ZS50d2VsdmVjaXJjbGU9OTMyMztlLnR3ZWx2ZXBhcmVuPTkzNDM7ZS50d2VsdmVwZXJpb2Q9OTM2MztlLnR3ZWx2ZXJvbWFuPTg1NzE7ZS50d2VudHljaXJjbGU9OTMzMTtlLnR3ZW50eWhhbmd6aG91PTIxMzE2O2UudHdlbnR5cGFyZW49OTM1MTtlLnR3ZW50eXBlcmlvZD05MzcxO2UudHdvPTUwO2UudHdvYXJhYmljPTE2MzQ7ZS50d29iZW5nYWxpPTI1MzY7ZS50d29jaXJjbGU9OTMxMztlLnR3b2NpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjM7ZS50d29kZXZhPTI0MDg7ZS50d29kb3RlbmxlYWRlcj04MjI5O2UudHdvZG90bGVhZGVyPTgyMjk7ZS50d29kb3RsZWFkZXJ2ZXJ0aWNhbD02NTA3MjtlLnR3b2d1amFyYXRpPTI3OTI7ZS50d29ndXJtdWtoaT0yNjY0O2UudHdvaGFja2FyYWJpYz0xNjM0O2UudHdvaGFuZ3pob3U9MTIzMjI7ZS50d29pZGVvZ3JhcGhpY3BhcmVuPTEyODMzO2UudHdvaW5mZXJpb3I9ODMyMjtlLnR3b21vbm9zcGFjZT02NTI5ODtlLnR3b251bWVyYXRvcmJlbmdhbGk9MjU0OTtlLnR3b29sZHN0eWxlPTYzMjgyO2UudHdvcGFyZW49OTMzMztlLnR3b3BlcmlvZD05MzUzO2UudHdvcGVyc2lhbj0xNzc4O2UudHdvcm9tYW49ODU2MTtlLnR3b3N0cm9rZT00NDM7ZS50d29zdXBlcmlvcj0xNzg7ZS50d290aGFpPTM2NjY7ZS50d290aGlyZHM9ODUzMjtlLnU9MTE3O2UudWFjdXRlPTI1MDtlLnViYXI9NjQ5O2UudWJlbmdhbGk9MjQ0MTtlLnVib3BvbW9mbz0xMjU4NDtlLnVicmV2ZT0zNjU7ZS51Y2Fyb249NDY4O2UudWNpcmNsZT05NDQ0O2UudWNpcmN1bWZsZXg9MjUxO2UudWNpcmN1bWZsZXhiZWxvdz03Nzk5O2UudWN5cmlsbGljPTEwOTE7ZS51ZGF0dGFkZXZhPTIzODU7ZS51ZGJsYWN1dGU9MzY5O2UudWRibGdyYXZlPTUzMztlLnVkZXZhPTIzMTM7ZS51ZGllcmVzaXM9MjUyO2UudWRpZXJlc2lzYWN1dGU9NDcyO2UudWRpZXJlc2lzYmVsb3c9Nzc5NTtlLnVkaWVyZXNpc2Nhcm9uPTQ3NDtlLnVkaWVyZXNpc2N5cmlsbGljPTEyNjU7ZS51ZGllcmVzaXNncmF2ZT00NzY7ZS51ZGllcmVzaXNtYWNyb249NDcwO2UudWRvdGJlbG93PTc5MDk7ZS51Z3JhdmU9MjQ5O2UudWd1amFyYXRpPTI2OTc7ZS51Z3VybXVraGk9MjU2OTtlLnVoaXJhZ2FuYT0xMjM1ODtlLnVob29rYWJvdmU9NzkxMTtlLnVob3JuPTQzMjtlLnVob3JuYWN1dGU9NzkxMztlLnVob3JuZG90YmVsb3c9NzkyMTtlLnVob3JuZ3JhdmU9NzkxNTtlLnVob3JuaG9va2Fib3ZlPTc5MTc7ZS51aG9ybnRpbGRlPTc5MTk7ZS51aHVuZ2FydW1sYXV0PTM2OTtlLnVodW5nYXJ1bWxhdXRjeXJpbGxpYz0xMjY3O2UudWludmVydGVkYnJldmU9NTM1O2UudWthdGFrYW5hPTEyNDU0O2UudWthdGFrYW5haGFsZndpZHRoPTY1Mzk1O2UudWtjeXJpbGxpYz0xMTQ1O2UudWtvcmVhbj0xMjYzNjtlLnVtYWNyb249MzYzO2UudW1hY3JvbmN5cmlsbGljPTEyNjM7ZS51bWFjcm9uZGllcmVzaXM9NzgwMztlLnVtYXRyYWd1cm11a2hpPTI2MjU7ZS51bW9ub3NwYWNlPTY1MzY1O2UudW5kZXJzY29yZT05NTtlLnVuZGVyc2NvcmVkYmw9ODIxNTtlLnVuZGVyc2NvcmVtb25vc3BhY2U9NjUzNDM7ZS51bmRlcnNjb3JldmVydGljYWw9NjUwNzU7ZS51bmRlcnNjb3Jld2F2eT02NTEwMztlLnVuaW9uPTg3NDY7ZS51bml2ZXJzYWw9ODcwNDtlLnVvZ29uZWs9MzcxO2UudXBhcmVuPTkzOTI7ZS51cGJsb2NrPTk2MDA7ZS51cHBlcmRvdGhlYnJldz0xNDc2O2UudXBzaWxvbj05NjU7ZS51cHNpbG9uZGllcmVzaXM9OTcxO2UudXBzaWxvbmRpZXJlc2lzdG9ub3M9OTQ0O2UudXBzaWxvbmxhdGluPTY1MDtlLnVwc2lsb250b25vcz05NzM7ZS51cHRhY2tiZWxvd2NtYj03OTc7ZS51cHRhY2ttb2Q9NzI0O2UudXJhZ3VybXVraGk9MjY3NTtlLnVyaW5nPTM2NztlLnVzaG9ydGN5cmlsbGljPTExMTg7ZS51c21hbGxoaXJhZ2FuYT0xMjM1NztlLnVzbWFsbGthdGFrYW5hPTEyNDUzO2UudXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODU7ZS51c3RyYWlnaHRjeXJpbGxpYz0xMTk5O2UudXN0cmFpZ2h0c3Ryb2tlY3lyaWxsaWM9MTIwMTtlLnV0aWxkZT0zNjE7ZS51dGlsZGVhY3V0ZT03ODAxO2UudXRpbGRlYmVsb3c9Nzc5NztlLnV1YmVuZ2FsaT0yNDQyO2UudXVkZXZhPTIzMTQ7ZS51dWd1amFyYXRpPTI2OTg7ZS51dWd1cm11a2hpPTI1NzA7ZS51dW1hdHJhZ3VybXVraGk9MjYyNjtlLnV1dm93ZWxzaWduYmVuZ2FsaT0yNDk4O2UudXV2b3dlbHNpZ25kZXZhPTIzNzA7ZS51dXZvd2Vsc2lnbmd1amFyYXRpPTI3NTQ7ZS51dm93ZWxzaWduYmVuZ2FsaT0yNDk3O2UudXZvd2Vsc2lnbmRldmE9MjM2OTtlLnV2b3dlbHNpZ25ndWphcmF0aT0yNzUzO2Uudj0xMTg7ZS52YWRldmE9MjM1NztlLnZhZ3VqYXJhdGk9Mjc0MTtlLnZhZ3VybXVraGk9MjYxMztlLnZha2F0YWthbmE9MTI1MzU7ZS52YXY9MTQ5MztlLnZhdmRhZ2VzaD02NDMwOTtlLnZhdmRhZ2VzaDY1PTY0MzA5O2UudmF2ZGFnZXNoaGVicmV3PTY0MzA5O2UudmF2aGVicmV3PTE0OTM7ZS52YXZob2xhbT02NDMzMTtlLnZhdmhvbGFtaGVicmV3PTY0MzMxO2UudmF2dmF2aGVicmV3PTE1MjA7ZS52YXZ5b2RoZWJyZXc9MTUyMTtlLnZjaXJjbGU9OTQ0NTtlLnZkb3RiZWxvdz03ODA3O2UudmVjeXJpbGxpYz0xMDc0O2UudmVoYXJhYmljPTE3MDA7ZS52ZWhmaW5hbGFyYWJpYz02NDM2MztlLnZlaGluaXRpYWxhcmFiaWM9NjQzNjQ7ZS52ZWhtZWRpYWxhcmFiaWM9NjQzNjU7ZS52ZWthdGFrYW5hPTEyNTM3O2UudmVudXM9OTc5MjtlLnZlcnRpY2FsYmFyPTEyNDtlLnZlcnRpY2FsbGluZWFib3ZlY21iPTc4MTtlLnZlcnRpY2FsbGluZWJlbG93Y21iPTgwOTtlLnZlcnRpY2FsbGluZWxvd21vZD03MTY7ZS52ZXJ0aWNhbGxpbmVtb2Q9NzEyO2UudmV3YXJtZW5pYW49MTQwNjtlLnZob29rPTY1MTtlLnZpa2F0YWthbmE9MTI1MzY7ZS52aXJhbWFiZW5nYWxpPTI1MDk7ZS52aXJhbWFkZXZhPTIzODE7ZS52aXJhbWFndWphcmF0aT0yNzY1O2UudmlzYXJnYWJlbmdhbGk9MjQzNTtlLnZpc2FyZ2FkZXZhPTIzMDc7ZS52aXNhcmdhZ3VqYXJhdGk9MjY5MTtlLnZtb25vc3BhY2U9NjUzNjY7ZS52b2FybWVuaWFuPTE0MDA7ZS52b2ljZWRpdGVyYXRpb25oaXJhZ2FuYT0xMjQ0NjtlLnZvaWNlZGl0ZXJhdGlvbmthdGFrYW5hPTEyNTQyO2Uudm9pY2VkbWFya2thbmE9MTI0NDM7ZS52b2ljZWRtYXJra2FuYWhhbGZ3aWR0aD02NTQzODtlLnZva2F0YWthbmE9MTI1Mzg7ZS52cGFyZW49OTM5MztlLnZ0aWxkZT03ODA1O2UudnR1cm5lZD02NTI7ZS52dWhpcmFnYW5hPTEyNDM2O2UudnVrYXRha2FuYT0xMjUzMjtlLnc9MTE5O2Uud2FjdXRlPTc4MTE7ZS53YWVrb3JlYW49MTI2MzM7ZS53YWhpcmFnYW5hPTEyNDMxO2Uud2FrYXRha2FuYT0xMjUyNztlLndha2F0YWthbmFoYWxmd2lkdGg9NjU0MzY7ZS53YWtvcmVhbj0xMjYzMjtlLndhc21hbGxoaXJhZ2FuYT0xMjQzMDtlLndhc21hbGxrYXRha2FuYT0xMjUyNjtlLndhdHRvc3F1YXJlPTEzMTQzO2Uud2F2ZWRhc2g9MTIzMTY7ZS53YXZ5dW5kZXJzY29yZXZlcnRpY2FsPTY1MDc2O2Uud2F3YXJhYmljPTE2MDg7ZS53YXdmaW5hbGFyYWJpYz02NTI2MjtlLndhd2hhbXphYWJvdmVhcmFiaWM9MTU3MjtlLndhd2hhbXphYWJvdmVmaW5hbGFyYWJpYz02NTE1ODtlLndic3F1YXJlPTEzMjc3O2Uud2NpcmNsZT05NDQ2O2Uud2NpcmN1bWZsZXg9MzczO2Uud2RpZXJlc2lzPTc4MTM7ZS53ZG90YWNjZW50PTc4MTU7ZS53ZG90YmVsb3c9NzgxNztlLndlaGlyYWdhbmE9MTI0MzM7ZS53ZWllcnN0cmFzcz04NDcyO2Uud2VrYXRha2FuYT0xMjUyOTtlLndla29yZWFuPTEyNjM4O2Uud2Vva29yZWFuPTEyNjM3O2Uud2dyYXZlPTc4MDk7ZS53aGl0ZWJ1bGxldD05NzAyO2Uud2hpdGVjaXJjbGU9OTY3NTtlLndoaXRlY2lyY2xlaW52ZXJzZT05Njg5O2Uud2hpdGVjb3JuZXJicmFja2V0bGVmdD0xMjMwMjtlLndoaXRlY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbD02NTA5MTtlLndoaXRlY29ybmVyYnJhY2tldHJpZ2h0PTEyMzAzO2Uud2hpdGVjb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA5MjtlLndoaXRlZGlhbW9uZD05NjcxO2Uud2hpdGVkaWFtb25kY29udGFpbmluZ2JsYWNrc21hbGxkaWFtb25kPTk2NzI7ZS53aGl0ZWRvd25wb2ludGluZ3NtYWxsdHJpYW5nbGU9OTY2MztlLndoaXRlZG93bnBvaW50aW5ndHJpYW5nbGU9OTY2MTtlLndoaXRlbGVmdHBvaW50aW5nc21hbGx0cmlhbmdsZT05NjY3O2Uud2hpdGVsZWZ0cG9pbnRpbmd0cmlhbmdsZT05NjY1O2Uud2hpdGVsZW50aWN1bGFyYnJhY2tldGxlZnQ9MTIzMTA7ZS53aGl0ZWxlbnRpY3VsYXJicmFja2V0cmlnaHQ9MTIzMTE7ZS53aGl0ZXJpZ2h0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2NTc7ZS53aGl0ZXJpZ2h0cG9pbnRpbmd0cmlhbmdsZT05NjU1O2Uud2hpdGVzbWFsbHNxdWFyZT05NjQzO2Uud2hpdGVzbWlsaW5nZmFjZT05Nzg2O2Uud2hpdGVzcXVhcmU9OTYzMztlLndoaXRlc3Rhcj05NzM0O2Uud2hpdGV0ZWxlcGhvbmU9OTc0MztlLndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0PTEyMzEyO2Uud2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0PTEyMzEzO2Uud2hpdGV1cHBvaW50aW5nc21hbGx0cmlhbmdsZT05NjUzO2Uud2hpdGV1cHBvaW50aW5ndHJpYW5nbGU9OTY1MTtlLndpaGlyYWdhbmE9MTI0MzI7ZS53aWthdGFrYW5hPTEyNTI4O2Uud2lrb3JlYW49MTI2Mzk7ZS53bW9ub3NwYWNlPTY1MzY3O2Uud29oaXJhZ2FuYT0xMjQzNDtlLndva2F0YWthbmE9MTI1MzA7ZS53b2thdGFrYW5haGFsZndpZHRoPTY1MzgyO2Uud29uPTgzNjE7ZS53b25tb25vc3BhY2U9NjU1MTA7ZS53b3dhZW50aGFpPTM2MjM7ZS53cGFyZW49OTM5NDtlLndyaW5nPTc4MzI7ZS53c3VwZXJpb3I9Njk1O2Uud3R1cm5lZD02NTM7ZS53eW5uPTQ0NztlLng9MTIwO2UueGFib3ZlY21iPTgyOTtlLnhib3BvbW9mbz0xMjU2MjtlLnhjaXJjbGU9OTQ0NztlLnhkaWVyZXNpcz03ODIxO2UueGRvdGFjY2VudD03ODE5O2UueGVoYXJtZW5pYW49MTM4OTtlLnhpPTk1ODtlLnhtb25vc3BhY2U9NjUzNjg7ZS54cGFyZW49OTM5NTtlLnhzdXBlcmlvcj03Mzk7ZS55PTEyMTtlLnlhYWRvc3F1YXJlPTEzMTM0O2UueWFiZW5nYWxpPTI0Nzk7ZS55YWN1dGU9MjUzO2UueWFkZXZhPTIzNTE7ZS55YWVrb3JlYW49MTI2MjY7ZS55YWd1amFyYXRpPTI3MzU7ZS55YWd1cm11a2hpPTI2MDc7ZS55YWhpcmFnYW5hPTEyNDIwO2UueWFrYXRha2FuYT0xMjUxNjtlLnlha2F0YWthbmFoYWxmd2lkdGg9NjU0Mjg7ZS55YWtvcmVhbj0xMjYyNTtlLnlhbWFra2FudGhhaT0zNjYyO2UueWFzbWFsbGhpcmFnYW5hPTEyNDE5O2UueWFzbWFsbGthdGFrYW5hPTEyNTE1O2UueWFzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg4O2UueWF0Y3lyaWxsaWM9MTEyMztlLnljaXJjbGU9OTQ0ODtlLnljaXJjdW1mbGV4PTM3NTtlLnlkaWVyZXNpcz0yNTU7ZS55ZG90YWNjZW50PTc4MjM7ZS55ZG90YmVsb3c9NzkyNTtlLnllaGFyYWJpYz0xNjEwO2UueWVoYmFycmVlYXJhYmljPTE3NDY7ZS55ZWhiYXJyZWVmaW5hbGFyYWJpYz02NDQzMTtlLnllaGZpbmFsYXJhYmljPTY1MjY2O2UueWVoaGFtemFhYm92ZWFyYWJpYz0xNTc0O2UueWVoaGFtemFhYm92ZWZpbmFsYXJhYmljPTY1MTYyO2UueWVoaGFtemFhYm92ZWluaXRpYWxhcmFiaWM9NjUxNjM7ZS55ZWhoYW16YWFib3ZlbWVkaWFsYXJhYmljPTY1MTY0O2UueWVoaW5pdGlhbGFyYWJpYz02NTI2NztlLnllaG1lZGlhbGFyYWJpYz02NTI2ODtlLnllaG1lZW1pbml0aWFsYXJhYmljPTY0NzMzO2UueWVobWVlbWlzb2xhdGVkYXJhYmljPTY0NjAwO2UueWVobm9vbmZpbmFsYXJhYmljPTY0NjYwO2UueWVodGhyZWVkb3RzYmVsb3dhcmFiaWM9MTc0NTtlLnlla29yZWFuPTEyNjMwO2UueWVuPTE2NTtlLnllbm1vbm9zcGFjZT02NTUwOTtlLnllb2tvcmVhbj0xMjYyOTtlLnllb3JpbmhpZXVoa29yZWFuPTEyNjc4O2UueWVyYWhiZW55b21vaGVicmV3PTE0NTA7ZS55ZXJhaGJlbnlvbW9sZWZ0aGVicmV3PTE0NTA7ZS55ZXJpY3lyaWxsaWM9MTA5OTtlLnllcnVkaWVyZXNpc2N5cmlsbGljPTEyNzM7ZS55ZXNpZXVuZ2tvcmVhbj0xMjY3MztlLnllc2lldW5ncGFuc2lvc2tvcmVhbj0xMjY3NTtlLnllc2lldW5nc2lvc2tvcmVhbj0xMjY3NDtlLnlldGl2aGVicmV3PTE0MzQ7ZS55Z3JhdmU9NzkyMztlLnlob29rPTQzNjtlLnlob29rYWJvdmU9NzkyNztlLnlpYXJtZW5pYW49MTM5NztlLnlpY3lyaWxsaWM9MTExMTtlLnlpa29yZWFuPTEyNjQyO2UueWlueWFuZz05Nzc1O2UueWl3bmFybWVuaWFuPTE0MTA7ZS55bW9ub3NwYWNlPTY1MzY5O2UueW9kPTE0OTc7ZS55b2RkYWdlc2g9NjQzMTM7ZS55b2RkYWdlc2hoZWJyZXc9NjQzMTM7ZS55b2RoZWJyZXc9MTQ5NztlLnlvZHlvZGhlYnJldz0xNTIyO2UueW9keW9kcGF0YWhoZWJyZXc9NjQyODc7ZS55b2hpcmFnYW5hPTEyNDI0O2UueW9pa29yZWFuPTEyNjgxO2UueW9rYXRha2FuYT0xMjUyMDtlLnlva2F0YWthbmFoYWxmd2lkdGg9NjU0MzA7ZS55b2tvcmVhbj0xMjYzNTtlLnlvc21hbGxoaXJhZ2FuYT0xMjQyMztlLnlvc21hbGxrYXRha2FuYT0xMjUxOTtlLnlvc21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM5MDtlLnlvdGdyZWVrPTEwMTE7ZS55b3lhZWtvcmVhbj0xMjY4MDtlLnlveWFrb3JlYW49MTI2Nzk7ZS55b3lha3RoYWk9MzYxODtlLnlveWluZ3RoYWk9MzU5NztlLnlwYXJlbj05Mzk2O2UueXBvZ2VncmFtbWVuaT04OTA7ZS55cG9nZWdyYW1tZW5pZ3JlZWtjbWI9ODM3O2UueXI9NDIyO2UueXJpbmc9NzgzMztlLnlzdXBlcmlvcj02OTY7ZS55dGlsZGU9NzkyOTtlLnl0dXJuZWQ9NjU0O2UueXVoaXJhZ2FuYT0xMjQyMjtlLnl1aWtvcmVhbj0xMjY4NDtlLnl1a2F0YWthbmE9MTI1MTg7ZS55dWthdGFrYW5haGFsZndpZHRoPTY1NDI5O2UueXVrb3JlYW49MTI2NDA7ZS55dXNiaWdjeXJpbGxpYz0xMTMxO2UueXVzYmlnaW90aWZpZWRjeXJpbGxpYz0xMTMzO2UueXVzbGl0dGxlY3lyaWxsaWM9MTEyNztlLnl1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWM9MTEyOTtlLnl1c21hbGxoaXJhZ2FuYT0xMjQyMTtlLnl1c21hbGxrYXRha2FuYT0xMjUxNztlLnl1c21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM4OTtlLnl1eWVrb3JlYW49MTI2ODM7ZS55dXllb2tvcmVhbj0xMjY4MjtlLnl5YWJlbmdhbGk9MjUyNztlLnl5YWRldmE9MjM5OTtlLno9MTIyO2UuemFhcm1lbmlhbj0xMzgyO2UuemFjdXRlPTM3ODtlLnphZGV2YT0yMzk1O2UuemFndXJtdWtoaT0yNjUxO2UuemFoYXJhYmljPTE1OTI7ZS56YWhmaW5hbGFyYWJpYz02NTIyMjtlLnphaGluaXRpYWxhcmFiaWM9NjUyMjM7ZS56YWhpcmFnYW5hPTEyMzc0O2UuemFobWVkaWFsYXJhYmljPTY1MjI0O2UuemFpbmFyYWJpYz0xNTg2O2UuemFpbmZpbmFsYXJhYmljPTY1MjAwO2UuemFrYXRha2FuYT0xMjQ3MDtlLnphcWVmZ2Fkb2xoZWJyZXc9MTQyOTtlLnphcWVmcWF0YW5oZWJyZXc9MTQyODtlLnphcnFhaGVicmV3PTE0MzI7ZS56YXlpbj0xNDk0O2UuemF5aW5kYWdlc2g9NjQzMTA7ZS56YXlpbmRhZ2VzaGhlYnJldz02NDMxMDtlLnpheWluaGVicmV3PTE0OTQ7ZS56Ym9wb21vZm89MTI1Njc7ZS56Y2Fyb249MzgyO2UuemNpcmNsZT05NDQ5O2UuemNpcmN1bWZsZXg9NzgyNTtlLnpjdXJsPTY1NztlLnpkb3Q9MzgwO2UuemRvdGFjY2VudD0zODA7ZS56ZG90YmVsb3c9NzgyNztlLnplY3lyaWxsaWM9MTA3OTtlLnplZGVzY2VuZGVyY3lyaWxsaWM9MTE3NztlLnplZGllcmVzaXNjeXJpbGxpYz0xMjQ3O2UuemVoaXJhZ2FuYT0xMjM4MDtlLnpla2F0YWthbmE9MTI0NzY7ZS56ZXJvPTQ4O2UuemVyb2FyYWJpYz0xNjMyO2UuemVyb2JlbmdhbGk9MjUzNDtlLnplcm9kZXZhPTI0MDY7ZS56ZXJvZ3VqYXJhdGk9Mjc5MDtlLnplcm9ndXJtdWtoaT0yNjYyO2UuemVyb2hhY2thcmFiaWM9MTYzMjtlLnplcm9pbmZlcmlvcj04MzIwO2UuemVyb21vbm9zcGFjZT02NTI5NjtlLnplcm9vbGRzdHlsZT02MzI4MDtlLnplcm9wZXJzaWFuPTE3NzY7ZS56ZXJvc3VwZXJpb3I9ODMwNDtlLnplcm90aGFpPTM2NjQ7ZS56ZXJvd2lkdGhqb2luZXI9NjUyNzk7ZS56ZXJvd2lkdGhub25qb2luZXI9ODIwNDtlLnplcm93aWR0aHNwYWNlPTgyMDM7ZS56ZXRhPTk1MDtlLnpoYm9wb21vZm89MTI1NjM7ZS56aGVhcm1lbmlhbj0xMzg2O2UuemhlYnJldmVjeXJpbGxpYz0xMjE4O2UuemhlY3lyaWxsaWM9MTA3ODtlLnpoZWRlc2NlbmRlcmN5cmlsbGljPTExNzU7ZS56aGVkaWVyZXNpc2N5cmlsbGljPTEyNDU7ZS56aWhpcmFnYW5hPTEyMzc2O2UuemlrYXRha2FuYT0xMjQ3MjtlLnppbm9yaGVicmV3PTE0NTQ7ZS56bGluZWJlbG93PTc4Mjk7ZS56bW9ub3NwYWNlPTY1MzcwO2Uuem9oaXJhZ2FuYT0xMjM4MjtlLnpva2F0YWthbmE9MTI0Nzg7ZS56cGFyZW49OTM5NztlLnpyZXRyb2ZsZXhob29rPTY1NjtlLnpzdHJva2U9NDM4O2UuenVoaXJhZ2FuYT0xMjM3ODtlLnp1a2F0YWthbmE9MTI0NzQ7ZVsiLm5vdGRlZiJdPTA7ZS5hbmdicmFja2V0bGVmdGJpZz05MDAxO2UuYW5nYnJhY2tldGxlZnRCaWc9OTAwMTtlLmFuZ2JyYWNrZXRsZWZ0YmlnZz05MDAxO2UuYW5nYnJhY2tldGxlZnRCaWdnPTkwMDE7ZS5hbmdicmFja2V0cmlnaHRCaWc9OTAwMjtlLmFuZ2JyYWNrZXRyaWdodGJpZz05MDAyO2UuYW5nYnJhY2tldHJpZ2h0QmlnZz05MDAyO2UuYW5nYnJhY2tldHJpZ2h0YmlnZz05MDAyO2UuYXJyb3dob29rbGVmdD04NjE4O2UuYXJyb3dob29rcmlnaHQ9ODYxNztlLmFycm93bGVmdHRvcGhhbGY9ODYzNjtlLmFycm93bGVmdGJvdGhhbGY9ODYzNztlLmFycm93bm9ydGhlYXN0PTg1OTk7ZS5hcnJvd25vcnRod2VzdD04NTk4O2UuYXJyb3dyaWdodHRvcGhhbGY9ODY0MDtlLmFycm93cmlnaHRib3RoYWxmPTg2NDE7ZS5hcnJvd3NvdXRoZWFzdD04NjAwO2UuYXJyb3dzb3V0aHdlc3Q9ODYwMTtlLmJhY2tzbGFzaGJpZz04NzI2O2UuYmFja3NsYXNoQmlnPTg3MjY7ZS5iYWNrc2xhc2hCaWdnPTg3MjY7ZS5iYWNrc2xhc2hiaWdnPTg3MjY7ZS5iYXJkYmw9ODIxNDtlLmJyYWNlaHRpcGRvd25sZWZ0PTY1MDc5O2UuYnJhY2VodGlwZG93bnJpZ2h0PTY1MDc5O2UuYnJhY2VodGlwdXBsZWZ0PTY1MDgwO2UuYnJhY2VodGlwdXByaWdodD02NTA4MDtlLmJyYWNlbGVmdEJpZz0xMjM7ZS5icmFjZWxlZnRiaWc9MTIzO2UuYnJhY2VsZWZ0YmlnZz0xMjM7ZS5icmFjZWxlZnRCaWdnPTEyMztlLmJyYWNlcmlnaHRCaWc9MTI1O2UuYnJhY2VyaWdodGJpZz0xMjU7ZS5icmFjZXJpZ2h0YmlnZz0xMjU7ZS5icmFjZXJpZ2h0QmlnZz0xMjU7ZS5icmFja2V0bGVmdGJpZz05MTtlLmJyYWNrZXRsZWZ0QmlnPTkxO2UuYnJhY2tldGxlZnRiaWdnPTkxO2UuYnJhY2tldGxlZnRCaWdnPTkxO2UuYnJhY2tldHJpZ2h0QmlnPTkzO2UuYnJhY2tldHJpZ2h0YmlnPTkzO2UuYnJhY2tldHJpZ2h0YmlnZz05MztlLmJyYWNrZXRyaWdodEJpZ2c9OTM7ZS5jZWlsaW5nbGVmdGJpZz04OTY4O2UuY2VpbGluZ2xlZnRCaWc9ODk2ODtlLmNlaWxpbmdsZWZ0QmlnZz04OTY4O2UuY2VpbGluZ2xlZnRiaWdnPTg5Njg7ZS5jZWlsaW5ncmlnaHRiaWc9ODk2OTtlLmNlaWxpbmdyaWdodEJpZz04OTY5O2UuY2VpbGluZ3JpZ2h0YmlnZz04OTY5O2UuY2VpbGluZ3JpZ2h0QmlnZz04OTY5O2UuY2lyY2xlZG90ZGlzcGxheT04ODU3O2UuY2lyY2xlZG90dGV4dD04ODU3O2UuY2lyY2xlbXVsdGlwbHlkaXNwbGF5PTg4NTU7ZS5jaXJjbGVtdWx0aXBseXRleHQ9ODg1NTtlLmNpcmNsZXBsdXNkaXNwbGF5PTg4NTM7ZS5jaXJjbGVwbHVzdGV4dD04ODUzO2UuY29udGludGVncmFsZGlzcGxheT04NzUwO2UuY29udGludGVncmFsdGV4dD04NzUwO2UuY29wcm9kdWN0ZGlzcGxheT04NzIwO2UuY29wcm9kdWN0dGV4dD04NzIwO2UuZmxvb3JsZWZ0QmlnPTg5NzA7ZS5mbG9vcmxlZnRiaWc9ODk3MDtlLmZsb29ybGVmdGJpZ2c9ODk3MDtlLmZsb29ybGVmdEJpZ2c9ODk3MDtlLmZsb29ycmlnaHRiaWc9ODk3MTtlLmZsb29ycmlnaHRCaWc9ODk3MTtlLmZsb29ycmlnaHRCaWdnPTg5NzE7ZS5mbG9vcnJpZ2h0YmlnZz04OTcxO2UuaGF0d2lkZT03NzA7ZS5oYXR3aWRlcj03NzA7ZS5oYXR3aWRlc3Q9NzcwO2UuaW50ZXJjYWw9NzQ4ODtlLmludGVncmFsZGlzcGxheT04NzQ3O2UuaW50ZWdyYWx0ZXh0PTg3NDc7ZS5pbnRlcnNlY3Rpb25kaXNwbGF5PTg4OTg7ZS5pbnRlcnNlY3Rpb250ZXh0PTg4OTg7ZS5sb2dpY2FsYW5kZGlzcGxheT04NzQzO2UubG9naWNhbGFuZHRleHQ9ODc0MztlLmxvZ2ljYWxvcmRpc3BsYXk9ODc0NDtlLmxvZ2ljYWxvcnRleHQ9ODc0NDtlLnBhcmVubGVmdEJpZz00MDtlLnBhcmVubGVmdGJpZz00MDtlLnBhcmVubGVmdEJpZ2c9NDA7ZS5wYXJlbmxlZnRiaWdnPTQwO2UucGFyZW5yaWdodEJpZz00MTtlLnBhcmVucmlnaHRiaWc9NDE7ZS5wYXJlbnJpZ2h0QmlnZz00MTtlLnBhcmVucmlnaHRiaWdnPTQxO2UucHJpbWU9ODI0MjtlLnByb2R1Y3RkaXNwbGF5PTg3MTk7ZS5wcm9kdWN0dGV4dD04NzE5O2UucmFkaWNhbGJpZz04NzMwO2UucmFkaWNhbEJpZz04NzMwO2UucmFkaWNhbEJpZ2c9ODczMDtlLnJhZGljYWxiaWdnPTg3MzA7ZS5yYWRpY2FsYnQ9ODczMDtlLnJhZGljYWx0cD04NzMwO2UucmFkaWNhbHZlcnRleD04NzMwO2Uuc2xhc2hiaWc9NDc7ZS5zbGFzaEJpZz00NztlLnNsYXNoQmlnZz00NztlLnNsYXNoYmlnZz00NztlLnN1bW1hdGlvbmRpc3BsYXk9ODcyMTtlLnN1bW1hdGlvbnRleHQ9ODcyMTtlLnRpbGRld2lkZT03MzI7ZS50aWxkZXdpZGVyPTczMjtlLnRpbGRld2lkZXN0PTczMjtlLnVuaW9uZGlzcGxheT04ODk5O2UudW5pb25tdWx0aWRpc3BsYXk9ODg0NjtlLnVuaW9ubXVsdGl0ZXh0PTg4NDY7ZS51bmlvbnNxZGlzcGxheT04ODUyO2UudW5pb25zcXRleHQ9ODg1MjtlLnVuaW9udGV4dD04ODk5O2UudmV4dGVuZGRvdWJsZT04NzQxO2UudmV4dGVuZHNpbmdsZT04NzM5fSkpLG49YSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0zMjtlLmExPTk5ODU7ZS5hMj05OTg2O2UuYTIwMj05OTg3O2UuYTM9OTk4ODtlLmE0PTk3NDI7ZS5hNT05OTkwO2UuYTExOT05OTkxO2UuYTExOD05OTkyO2UuYTExNz05OTkzO2UuYTExPTk3NTU7ZS5hMTI9OTc1ODtlLmExMz05OTk2O2UuYTE0PTk5OTc7ZS5hMTU9OTk5ODtlLmExNj05OTk5O2UuYTEwNT0xZTQ7ZS5hMTc9MTAwMDE7ZS5hMTg9MTAwMDI7ZS5hMTk9MTAwMDM7ZS5hMjA9MTAwMDQ7ZS5hMjE9MTAwMDU7ZS5hMjI9MTAwMDY7ZS5hMjM9MTAwMDc7ZS5hMjQ9MTAwMDg7ZS5hMjU9MTAwMDk7ZS5hMjY9MTAwMTA7ZS5hMjc9MTAwMTE7ZS5hMjg9MTAwMTI7ZS5hNj0xMDAxMztlLmE3PTEwMDE0O2UuYTg9MTAwMTU7ZS5hOT0xMDAxNjtlLmExMD0xMDAxNztlLmEyOT0xMDAxODtlLmEzMD0xMDAxOTtlLmEzMT0xMDAyMDtlLmEzMj0xMDAyMTtlLmEzMz0xMDAyMjtlLmEzND0xMDAyMztlLmEzNT05NzMzO2UuYTM2PTEwMDI1O2UuYTM3PTEwMDI2O2UuYTM4PTEwMDI3O2UuYTM5PTEwMDI4O2UuYTQwPTEwMDI5O2UuYTQxPTEwMDMwO2UuYTQyPTEwMDMxO2UuYTQzPTEwMDMyO2UuYTQ0PTEwMDMzO2UuYTQ1PTEwMDM0O2UuYTQ2PTEwMDM1O2UuYTQ3PTEwMDM2O2UuYTQ4PTEwMDM3O2UuYTQ5PTEwMDM4O2UuYTUwPTEwMDM5O2UuYTUxPTEwMDQwO2UuYTUyPTEwMDQxO2UuYTUzPTEwMDQyO2UuYTU0PTEwMDQzO2UuYTU1PTEwMDQ0O2UuYTU2PTEwMDQ1O2UuYTU3PTEwMDQ2O2UuYTU4PTEwMDQ3O2UuYTU5PTEwMDQ4O2UuYTYwPTEwMDQ5O2UuYTYxPTEwMDUwO2UuYTYyPTEwMDUxO2UuYTYzPTEwMDUyO2UuYTY0PTEwMDUzO2UuYTY1PTEwMDU0O2UuYTY2PTEwMDU1O2UuYTY3PTEwMDU2O2UuYTY4PTEwMDU3O2UuYTY5PTEwMDU4O2UuYTcwPTEwMDU5O2UuYTcxPTk2Nzk7ZS5hNzI9MTAwNjE7ZS5hNzM9OTYzMjtlLmE3ND0xMDA2MztlLmEyMDM9MTAwNjQ7ZS5hNzU9MTAwNjU7ZS5hMjA0PTEwMDY2O2UuYTc2PTk2NTA7ZS5hNzc9OTY2MDtlLmE3OD05NjcwO2UuYTc5PTEwMDcwO2UuYTgxPTk2ODc7ZS5hODI9MTAwNzI7ZS5hODM9MTAwNzM7ZS5hODQ9MTAwNzQ7ZS5hOTc9MTAwNzU7ZS5hOTg9MTAwNzY7ZS5hOTk9MTAwNzc7ZS5hMTAwPTEwMDc4O2UuYTEwMT0xMDA4MTtlLmExMDI9MTAwODI7ZS5hMTAzPTEwMDgzO2UuYTEwND0xMDA4NDtlLmExMDY9MTAwODU7ZS5hMTA3PTEwMDg2O2UuYTEwOD0xMDA4NztlLmExMTI9OTgyNztlLmExMTE9OTgzMDtlLmExMTA9OTgyOTtlLmExMDk9OTgyNDtlLmExMjA9OTMxMjtlLmExMjE9OTMxMztlLmExMjI9OTMxNDtlLmExMjM9OTMxNTtlLmExMjQ9OTMxNjtlLmExMjU9OTMxNztlLmExMjY9OTMxODtlLmExMjc9OTMxOTtlLmExMjg9OTMyMDtlLmExMjk9OTMyMTtlLmExMzA9MTAxMDI7ZS5hMTMxPTEwMTAzO2UuYTEzMj0xMDEwNDtlLmExMzM9MTAxMDU7ZS5hMTM0PTEwMTA2O2UuYTEzNT0xMDEwNztlLmExMzY9MTAxMDg7ZS5hMTM3PTEwMTA5O2UuYTEzOD0xMDExMDtlLmExMzk9MTAxMTE7ZS5hMTQwPTEwMTEyO2UuYTE0MT0xMDExMztlLmExNDI9MTAxMTQ7ZS5hMTQzPTEwMTE1O2UuYTE0ND0xMDExNjtlLmExNDU9MTAxMTc7ZS5hMTQ2PTEwMTE4O2UuYTE0Nz0xMDExOTtlLmExNDg9MTAxMjA7ZS5hMTQ5PTEwMTIxO2UuYTE1MD0xMDEyMjtlLmExNTE9MTAxMjM7ZS5hMTUyPTEwMTI0O2UuYTE1Mz0xMDEyNTtlLmExNTQ9MTAxMjY7ZS5hMTU1PTEwMTI3O2UuYTE1Nj0xMDEyODtlLmExNTc9MTAxMjk7ZS5hMTU4PTEwMTMwO2UuYTE1OT0xMDEzMTtlLmExNjA9MTAxMzI7ZS5hMTYxPTg1OTQ7ZS5hMTYzPTg1OTY7ZS5hMTY0PTg1OTc7ZS5hMTk2PTEwMTM2O2UuYTE2NT0xMDEzNztlLmExOTI9MTAxMzg7ZS5hMTY2PTEwMTM5O2UuYTE2Nz0xMDE0MDtlLmExNjg9MTAxNDE7ZS5hMTY5PTEwMTQyO2UuYTE3MD0xMDE0MztlLmExNzE9MTAxNDQ7ZS5hMTcyPTEwMTQ1O2UuYTE3Mz0xMDE0NjtlLmExNjI9MTAxNDc7ZS5hMTc0PTEwMTQ4O2UuYTE3NT0xMDE0OTtlLmExNzY9MTAxNTA7ZS5hMTc3PTEwMTUxO2UuYTE3OD0xMDE1MjtlLmExNzk9MTAxNTM7ZS5hMTkzPTEwMTU0O2UuYTE4MD0xMDE1NTtlLmExOTk9MTAxNTY7ZS5hMTgxPTEwMTU3O2UuYTIwMD0xMDE1ODtlLmExODI9MTAxNTk7ZS5hMjAxPTEwMTYxO2UuYTE4Mz0xMDE2MjtlLmExODQ9MTAxNjM7ZS5hMTk3PTEwMTY0O2UuYTE4NT0xMDE2NTtlLmExOTQ9MTAxNjY7ZS5hMTk4PTEwMTY3O2UuYTE4Nj0xMDE2ODtlLmExOTU9MTAxNjk7ZS5hMTg3PTEwMTcwO2UuYTE4OD0xMDE3MTtlLmExODk9MTAxNzI7ZS5hMTkwPTEwMTczO2UuYTE5MT0xMDE3NDtlLmE4OT0xMDA4ODtlLmE5MD0xMDA4OTtlLmE5Mz0xMDA5MDtlLmE5ND0xMDA5MTtlLmE5MT0xMDA5MjtlLmE5Mj0xMDA5MztlLmEyMDU9MTAwOTQ7ZS5hODU9MTAwOTU7ZS5hMjA2PTEwMDk2O2UuYTg2PTEwMDk3O2UuYTg3PTEwMDk4O2UuYTg4PTEwMDk5O2UuYTk1PTEwMTAwO2UuYTk2PTEwMTAxO2VbIi5ub3RkZWYiXT0wfSkpO3QuZ2V0R2x5cGhzVW5pY29kZT1pO3QuZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlPW59LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpPXQuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrPXQuZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzPXQuZ2V0U3ltYm9sc0ZvbnRzPXQuZ2V0U2VyaWZGb250cz10LmdldE5vblN0ZEZvbnRNYXA9dC5nZXRTdGRGb250TWFwPXZvaWQgMDt2YXIgYT1yKDgpO2NvbnN0IGk9KDAsYS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkFyaWFsTmFycm93PSJIZWx2ZXRpY2EiO2VbIkFyaWFsTmFycm93LUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiO2VbIkFyaWFsTmFycm93LUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjtlWyJBcmlhbE5hcnJvdy1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO2UuQXJpYWxCbGFjaz0iSGVsdmV0aWNhIjtlWyJBcmlhbEJsYWNrLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiO2VbIkFyaWFsQmxhY2stQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO2VbIkFyaWFsQmxhY2stSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIjtlWyJBcmlhbC1CbGFjayJdPSJIZWx2ZXRpY2EiO2VbIkFyaWFsLUJsYWNrLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiO2VbIkFyaWFsLUJsYWNrLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjtlWyJBcmlhbC1CbGFjay1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO2UuQXJpYWw9IkhlbHZldGljYSI7ZVsiQXJpYWwtQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCI7ZVsiQXJpYWwtQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO2VbIkFyaWFsLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7ZVsiQXJpYWwtQm9sZEl0YWxpY01UIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7ZVsiQXJpYWwtQm9sZE1UIl09IkhlbHZldGljYS1Cb2xkIjtlWyJBcmlhbC1JdGFsaWNNVCJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7ZS5BcmlhbE1UPSJIZWx2ZXRpY2EiO2VbIkNvdXJpZXItQm9sZCJdPSJDb3VyaWVyLUJvbGQiO2VbIkNvdXJpZXItQm9sZEl0YWxpYyJdPSJDb3VyaWVyLUJvbGRPYmxpcXVlIjtlWyJDb3VyaWVyLUl0YWxpYyJdPSJDb3VyaWVyLU9ibGlxdWUiO2UuQ291cmllck5ldz0iQ291cmllciI7ZVsiQ291cmllck5ldy1Cb2xkIl09IkNvdXJpZXItQm9sZCI7ZVsiQ291cmllck5ldy1Cb2xkSXRhbGljIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiO2VbIkNvdXJpZXJOZXctSXRhbGljIl09IkNvdXJpZXItT2JsaXF1ZSI7ZVsiQ291cmllck5ld1BTLUJvbGRJdGFsaWNNVCJdPSJDb3VyaWVyLUJvbGRPYmxpcXVlIjtlWyJDb3VyaWVyTmV3UFMtQm9sZE1UIl09IkNvdXJpZXItQm9sZCI7ZVsiQ291cmllck5ld1BTLUl0YWxpY01UIl09IkNvdXJpZXItT2JsaXF1ZSI7ZS5Db3VyaWVyTmV3UFNNVD0iQ291cmllciI7ZS5IZWx2ZXRpY2E9IkhlbHZldGljYSI7ZVsiSGVsdmV0aWNhLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiO2VbIkhlbHZldGljYS1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7ZVsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7ZVsiSGVsdmV0aWNhLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7ZVsiSGVsdmV0aWNhLU9ibGlxdWUiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO2VbIlN5bWJvbC1Cb2xkIl09IlN5bWJvbCI7ZVsiU3ltYm9sLUJvbGRJdGFsaWMiXT0iU3ltYm9sIjtlWyJTeW1ib2wtSXRhbGljIl09IlN5bWJvbCI7ZS5UaW1lc05ld1JvbWFuPSJUaW1lcy1Sb21hbiI7ZVsiVGltZXNOZXdSb21hbi1Cb2xkIl09IlRpbWVzLUJvbGQiO2VbIlRpbWVzTmV3Um9tYW4tQm9sZEl0YWxpYyJdPSJUaW1lcy1Cb2xkSXRhbGljIjtlWyJUaW1lc05ld1JvbWFuLUl0YWxpYyJdPSJUaW1lcy1JdGFsaWMiO2UuVGltZXNOZXdSb21hblBTPSJUaW1lcy1Sb21hbiI7ZVsiVGltZXNOZXdSb21hblBTLUJvbGQiXT0iVGltZXMtQm9sZCI7ZVsiVGltZXNOZXdSb21hblBTLUJvbGRJdGFsaWMiXT0iVGltZXMtQm9sZEl0YWxpYyI7ZVsiVGltZXNOZXdSb21hblBTLUJvbGRJdGFsaWNNVCJdPSJUaW1lcy1Cb2xkSXRhbGljIjtlWyJUaW1lc05ld1JvbWFuUFMtQm9sZE1UIl09IlRpbWVzLUJvbGQiO2VbIlRpbWVzTmV3Um9tYW5QUy1JdGFsaWMiXT0iVGltZXMtSXRhbGljIjtlWyJUaW1lc05ld1JvbWFuUFMtSXRhbGljTVQiXT0iVGltZXMtSXRhbGljIjtlLlRpbWVzTmV3Um9tYW5QU01UPSJUaW1lcy1Sb21hbiI7ZVsiVGltZXNOZXdSb21hblBTTVQtQm9sZCJdPSJUaW1lcy1Cb2xkIjtlWyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkSXRhbGljIl09IlRpbWVzLUJvbGRJdGFsaWMiO2VbIlRpbWVzTmV3Um9tYW5QU01ULUl0YWxpYyJdPSJUaW1lcy1JdGFsaWMifSkpO3QuZ2V0U3RkRm9udE1hcD1pO2NvbnN0IG49KDAsYS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkNhbGlicmk9IkhlbHZldGljYSI7ZVsiQ2FsaWJyaS1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjtlWyJDYWxpYnJpLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjtlWyJDYWxpYnJpLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7ZS5DZW50dXJ5R290aGljPSJIZWx2ZXRpY2EiO2VbIkNlbnR1cnlHb3RoaWMtQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCI7ZVsiQ2VudHVyeUdvdGhpYy1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7ZVsiQ2VudHVyeUdvdGhpYy1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO2UuQ29taWNTYW5zTVM9IkNvbWljIFNhbnMgTVMiO2VbIkNvbWljU2Fuc01TLUJvbGQiXT0iQ29taWMgU2FucyBNUy1Cb2xkIjtlWyJDb21pY1NhbnNNUy1Cb2xkSXRhbGljIl09IkNvbWljIFNhbnMgTVMtQm9sZEl0YWxpYyI7ZVsiQ29taWNTYW5zTVMtSXRhbGljIl09IkNvbWljIFNhbnMgTVMtSXRhbGljIjtlLkx1Y2lkYUNvbnNvbGU9IkNvdXJpZXIiO2VbIkx1Y2lkYUNvbnNvbGUtQm9sZCJdPSJDb3VyaWVyLUJvbGQiO2VbIkx1Y2lkYUNvbnNvbGUtQm9sZEl0YWxpYyJdPSJDb3VyaWVyLUJvbGRPYmxpcXVlIjtlWyJMdWNpZGFDb25zb2xlLUl0YWxpYyJdPSJDb3VyaWVyLU9ibGlxdWUiO2VbIkx1Y2lkYVNhbnMtRGVtaSJdPSJIZWx2ZXRpY2EtQm9sZCI7ZVsiTVMtR290aGljIl09Ik1TIEdvdGhpYyI7ZVsiTVMtR290aGljLUJvbGQiXT0iTVMgR290aGljLUJvbGQiO2VbIk1TLUdvdGhpYy1Cb2xkSXRhbGljIl09Ik1TIEdvdGhpYy1Cb2xkSXRhbGljIjtlWyJNUy1Hb3RoaWMtSXRhbGljIl09Ik1TIEdvdGhpYy1JdGFsaWMiO2VbIk1TLU1pbmNobyJdPSJNUyBNaW5jaG8iO2VbIk1TLU1pbmNoby1Cb2xkIl09Ik1TIE1pbmNoby1Cb2xkIjtlWyJNUy1NaW5jaG8tQm9sZEl0YWxpYyJdPSJNUyBNaW5jaG8tQm9sZEl0YWxpYyI7ZVsiTVMtTWluY2hvLUl0YWxpYyJdPSJNUyBNaW5jaG8tSXRhbGljIjtlWyJNUy1QR290aGljIl09Ik1TIFBHb3RoaWMiO2VbIk1TLVBHb3RoaWMtQm9sZCJdPSJNUyBQR290aGljLUJvbGQiO2VbIk1TLVBHb3RoaWMtQm9sZEl0YWxpYyJdPSJNUyBQR290aGljLUJvbGRJdGFsaWMiO2VbIk1TLVBHb3RoaWMtSXRhbGljIl09Ik1TIFBHb3RoaWMtSXRhbGljIjtlWyJNUy1QTWluY2hvIl09Ik1TIFBNaW5jaG8iO2VbIk1TLVBNaW5jaG8tQm9sZCJdPSJNUyBQTWluY2hvLUJvbGQiO2VbIk1TLVBNaW5jaG8tQm9sZEl0YWxpYyJdPSJNUyBQTWluY2hvLUJvbGRJdGFsaWMiO2VbIk1TLVBNaW5jaG8tSXRhbGljIl09Ik1TIFBNaW5jaG8tSXRhbGljIjtlLk51cHRpYWxTY3JpcHQ9IlRpbWVzLUl0YWxpYyI7ZS5TZWdvZVVJU3ltYm9sPSJIZWx2ZXRpY2EiO2UuV2luZ2RpbmdzPSJaYXBmRGluZ2JhdHMiO2VbIldpbmdkaW5ncy1SZWd1bGFyIl09IlphcGZEaW5nYmF0cyJ9KSk7dC5nZXROb25TdGRGb250TWFwPW47Y29uc3Qgcz0oMCxhLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbIkFkb2JlIEplbnNvbiJdPSEwO2VbIkFkb2JlIFRleHQiXT0hMDtlLkFsYmVydHVzPSEwO2UuQWxkdXM9ITA7ZS5BbGV4YW5kcmlhPSEwO2UuQWxnZXJpYW49ITA7ZVsiQW1lcmljYW4gVHlwZXdyaXRlciJdPSEwO2UuQW50aXF1YT0hMDtlLkFwZXg9ITA7ZS5Bcm5vPSEwO2UuQXN0ZXI9ITA7ZS5BdXJvcmE9ITA7ZS5CYXNrZXJ2aWxsZT0hMDtlLkJlbGw9ITA7ZS5CZW1ibz0hMDtlWyJCZW1ibyBTY2hvb2xib29rIl09ITA7ZS5CZW5ndWlhdD0hMDtlWyJCZXJrZWxleSBPbGQgU3R5bGUiXT0hMDtlWyJCZXJuaGFyZCBNb2Rlcm4iXT0hMDtlWyJCZXJ0aG9sZCBDaXR5Il09ITA7ZS5Cb2Rvbmk9ITA7ZVsiQmF1ZXIgQm9kb25pIl09ITA7ZVsiQm9vayBBbnRpcXVhIl09ITA7ZS5Cb29rbWFuPSEwO2VbIkJvcmRlYXV4IFJvbWFuIl09ITA7ZVsiQ2FsaWZvcm5pYW4gRkIiXT0hMDtlLkNhbGlzdG89ITA7ZS5DYWx2ZXJ0PSEwO2UuQ2FwaXRhbHM9ITA7ZS5DYW1icmlhPSEwO2UuQ2FydGllcj0hMDtlLkNhc2xvbj0hMDtlLkNhdHVsbD0hMDtlLkNlbnRhdXI9ITA7ZVsiQ2VudHVyeSBPbGQgU3R5bGUiXT0hMDtlWyJDZW50dXJ5IFNjaG9vbGJvb2siXT0hMDtlLkNoYXBhcnJhbD0hMDtlWyJDaGFyaXMgU0lMIl09ITA7ZS5DaGVsdGVuaGFtPSEwO2VbIkNob2xsYSBTbGFiIl09ITA7ZS5DbGFyZW5kb249ITA7ZS5DbGVhcmZhY2U9ITA7ZS5Db2NoaW49ITA7ZS5Db2xvbm5hPSEwO2VbIkNvbXB1dGVyIE1vZGVybiJdPSEwO2VbIkNvbmNyZXRlIFJvbWFuIl09ITA7ZS5Db25zdGFudGlhPSEwO2VbIkNvb3BlciBCbGFjayJdPSEwO2UuQ29yb25hPSEwO2UuRWNvdHlwZT0hMDtlLkVneXB0aWVubmU9ITA7ZS5FbGVwaGFudD0hMDtlLkV4Y2Vsc2lvcj0hMDtlLkZhaXJmaWVsZD0hMDtlWyJGRiBTY2FsYSJdPSEwO2UuRm9sa2FyZD0hMDtlLkZvb3RsaWdodD0hMDtlLkZyZWVTZXJpZj0hMDtlWyJGcml6IFF1YWRyYXRhIl09ITA7ZS5HYXJhbW9uZD0hMDtlLkdlbnRpdW09ITA7ZS5HZW9yZ2lhPSEwO2UuR2xvdWNlc3Rlcj0hMDtlWyJHb3VkeSBPbGQgU3R5bGUiXT0hMDtlWyJHb3VkeSBTY2hvb2xib29rIl09ITA7ZVsiR291ZHkgUHJvIEZvbnQiXT0hMDtlLkdyYW5qb249ITA7ZVsiR3VhcmRpYW4gRWd5cHRpYW4iXT0hMDtlLkhlYXRoZXI9ITA7ZS5IZXJjdWxlcz0hMDtlWyJIaWdoIFRvd2VyIFRleHQiXT0hMDtlLkhpcm9zaGlnZT0hMDtlWyJIb2VmbGVyIFRleHQiXT0hMDtlWyJIdW1hbmEgU2VyaWYiXT0hMDtlLkltcHJpbnQ9ITA7ZVsiSW9uaWMgTm8uIDUiXT0hMDtlLkphbnNvbj0hMDtlLkpvYW5uYT0hMDtlLktvcmlubmE9ITA7ZS5MZXhpY29uPSEwO2VbIkxpYmVyYXRpb24gU2VyaWYiXT0hMDtlWyJMaW51eCBMaWJlcnRpbmUiXT0hMDtlLkxpdGVyYXR1cm5heWE9ITA7ZS5MdWNpZGE9ITA7ZVsiTHVjaWRhIEJyaWdodCJdPSEwO2UuTWVsaW9yPSEwO2UuTWVtcGhpcz0hMDtlLk1pbGxlcj0hMDtlLk1pbmlvbj0hMDtlLk1vZGVybj0hMDtlWyJNb25hIExpc2EiXT0hMDtlWyJNcnMgRWF2ZXMiXT0hMDtlWyJNUyBTZXJpZiJdPSEwO2VbIk11c2VvIFNsYWIiXT0hMDtlWyJOZXcgWW9yayJdPSEwO2VbIk5pbWJ1cyBSb21hbiJdPSEwO2VbIk5QUyBSYXdsaW5zb24gUm9hZHdheSJdPSEwO2UuTnVwdGlhbFNjcmlwdD0hMDtlLlBhbGF0aW5vPSEwO2UuUGVycGV0dWE9ITA7ZS5QbGFudGluPSEwO2VbIlBsYW50aW4gU2Nob29sYm9vayJdPSEwO2UuUGxheWJpbGw9ITA7ZVsiUG9vciBSaWNoYXJkIl09ITA7ZVsiUmF3bGluc29uIFJvYWR3YXkiXT0hMDtlLlJlbmF1bHQ9ITA7ZS5SZXF1aWVtPSEwO2UuUm9ja3dlbGw9ITA7ZS5Sb21hbj0hMDtlWyJSb3RpcyBTZXJpZiJdPSEwO2UuU2Fib249ITA7ZS5TY2FsYT0hMDtlLlNlYWd1bGw9ITA7ZS5TaXN0aW5hPSEwO2UuU291dmVuaXI9ITA7ZS5TVElYPSEwO2VbIlN0b25lIEluZm9ybWFsIl09ITA7ZVsiU3RvbmUgU2VyaWYiXT0hMDtlLlN5bGZhZW49ITA7ZS5UaW1lcz0hMDtlLlRyYWphbj0hMDtlWyJUcmluaXTDqSJdPSEwO2VbIlRydW1wIE1lZGlhZXZhbCJdPSEwO2UuVXRvcGlhPSEwO2VbIlZhbGUgVHlwZSJdPSEwO2VbIkJpdHN0cmVhbSBWZXJhIl09ITA7ZVsiVmVyYSBTZXJpZiJdPSEwO2UuVmVyc2FpbGxlcz0hMDtlLldhbnRlZD0hMDtlLldlaXNzPSEwO2VbIldpZGUgTGF0aW4iXT0hMDtlLldpbmRzb3I9ITA7ZS5YSVRTPSEwfSkpO3QuZ2V0U2VyaWZGb250cz1zO2NvbnN0IG89KDAsYS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkRpbmdiYXRzPSEwO2UuU3ltYm9sPSEwO2UuWmFwZkRpbmdiYXRzPSEwfSkpO3QuZ2V0U3ltYm9sc0ZvbnRzPW87Y29uc3QgYz0oMCxhLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbMl09MTA7ZVszXT0zMjtlWzRdPTMzO2VbNV09MzQ7ZVs2XT0zNTtlWzddPTM2O2VbOF09Mzc7ZVs5XT0zODtlWzEwXT0zOTtlWzExXT00MDtlWzEyXT00MTtlWzEzXT00MjtlWzE0XT00MztlWzE1XT00NDtlWzE2XT00NTtlWzE3XT00NjtlWzE4XT00NztlWzE5XT00ODtlWzIwXT00OTtlWzIxXT01MDtlWzIyXT01MTtlWzIzXT01MjtlWzI0XT01MztlWzI1XT01NDtlWzI2XT01NTtlWzI3XT01NjtlWzI4XT01NztlWzI5XT01ODtlWzMwXT04OTQ7ZVszMV09NjA7ZVszMl09NjE7ZVszM109NjI7ZVszNF09NjM7ZVszNV09NjQ7ZVszNl09NjU7ZVszN109NjY7ZVszOF09Njc7ZVszOV09Njg7ZVs0MF09Njk7ZVs0MV09NzA7ZVs0Ml09NzE7ZVs0M109NzI7ZVs0NF09NzM7ZVs0NV09NzQ7ZVs0Nl09NzU7ZVs0N109NzY7ZVs0OF09Nzc7ZVs0OV09Nzg7ZVs1MF09Nzk7ZVs1MV09ODA7ZVs1Ml09ODE7ZVs1M109ODI7ZVs1NF09ODM7ZVs1NV09ODQ7ZVs1Nl09ODU7ZVs1N109ODY7ZVs1OF09ODc7ZVs1OV09ODg7ZVs2MF09ODk7ZVs2MV09OTA7ZVs2Ml09OTE7ZVs2M109OTI7ZVs2NF09OTM7ZVs2NV09OTQ7ZVs2Nl09OTU7ZVs2N109OTY7ZVs2OF09OTc7ZVs2OV09OTg7ZVs3MF09OTk7ZVs3MV09MTAwO2VbNzJdPTEwMTtlWzczXT0xMDI7ZVs3NF09MTAzO2VbNzVdPTEwNDtlWzc2XT0xMDU7ZVs3N109MTA2O2VbNzhdPTEwNztlWzc5XT0xMDg7ZVs4MF09MTA5O2VbODFdPTExMDtlWzgyXT0xMTE7ZVs4M109MTEyO2VbODRdPTExMztlWzg1XT0xMTQ7ZVs4Nl09MTE1O2VbODddPTExNjtlWzg4XT0xMTc7ZVs4OV09MTE4O2VbOTBdPTExOTtlWzkxXT0xMjA7ZVs5Ml09MTIxO2VbOTNdPTEyMjtlWzk0XT0xMjM7ZVs5NV09MTI0O2VbOTZdPTEyNTtlWzk3XT0xMjY7ZVs5OF09MTk2O2VbOTldPTE5NztlWzEwMF09MTk5O2VbMTAxXT0yMDE7ZVsxMDJdPTIwOTtlWzEwM109MjE0O2VbMTA0XT0yMjA7ZVsxMDVdPTIyNTtlWzEwNl09MjI0O2VbMTA3XT0yMjY7ZVsxMDhdPTIyODtlWzEwOV09MjI3O2VbMTEwXT0yMjk7ZVsxMTFdPTIzMTtlWzExMl09MjMzO2VbMTEzXT0yMzI7ZVsxMTRdPTIzNDtlWzExNV09MjM1O2VbMTE2XT0yMzc7ZVsxMTddPTIzNjtlWzExOF09MjM4O2VbMTE5XT0yMzk7ZVsxMjBdPTI0MTtlWzEyMV09MjQzO2VbMTIyXT0yNDI7ZVsxMjNdPTI0NDtlWzEyNF09MjQ2O2VbMTI1XT0yNDU7ZVsxMjZdPTI1MDtlWzEyN109MjQ5O2VbMTI4XT0yNTE7ZVsxMjldPTI1MjtlWzEzMF09ODIyNDtlWzEzMV09MTc2O2VbMTMyXT0xNjI7ZVsxMzNdPTE2MztlWzEzNF09MTY3O2VbMTM1XT04MjI2O2VbMTM2XT0xODI7ZVsxMzddPTIyMztlWzEzOF09MTc0O2VbMTM5XT0xNjk7ZVsxNDBdPTg0ODI7ZVsxNDFdPTE4MDtlWzE0Ml09MTY4O2VbMTQzXT04ODAwO2VbMTQ0XT0xOTg7ZVsxNDVdPTIxNjtlWzE0Nl09ODczNDtlWzE0N109MTc3O2VbMTQ4XT04ODA0O2VbMTQ5XT04ODA1O2VbMTUwXT0xNjU7ZVsxNTFdPTE4MTtlWzE1Ml09ODcwNjtlWzE1M109ODcyMTtlWzE1NF09ODcxOTtlWzE1Nl09ODc0NztlWzE1N109MTcwO2VbMTU4XT0xODY7ZVsxNTldPTg0ODY7ZVsxNjBdPTIzMDtlWzE2MV09MjQ4O2VbMTYyXT0xOTE7ZVsxNjNdPTE2MTtlWzE2NF09MTcyO2VbMTY1XT04NzMwO2VbMTY2XT00MDI7ZVsxNjddPTg3NzY7ZVsxNjhdPTg3MTA7ZVsxNjldPTE3MTtlWzE3MF09MTg3O2VbMTcxXT04MjMwO2VbMjEwXT0yMTg7ZVsyMjNdPTcxMTtlWzIyNF09MzIxO2VbMjI1XT0zMjI7ZVsyMjddPTM1MztlWzIyOV09MzgyO2VbMjM0XT0yNTM7ZVsyNTJdPTI2MztlWzI1M109MjY4O2VbMjU0XT0yNjk7ZVsyNThdPTI1ODtlWzI2MF09MjYwO2VbMjYxXT0yNjE7ZVsyNjVdPTI4MDtlWzI2Nl09MjgxO2VbMjY4XT0yODM7ZVsyNjldPTMxMztlWzI3NV09MzIzO2VbMjc2XT0zMjQ7ZVsyNzhdPTMyODtlWzI4NF09MzQ1O2VbMjg1XT0zNDY7ZVsyODZdPTM0NztlWzI5Ml09MzY3O2VbMjk1XT0zNzc7ZVsyOTZdPTM3ODtlWzI5OF09MzgwO2VbMzA1XT05NjM7ZVszMDZdPTk2NDtlWzMwN109OTY2O2VbMzA4XT04MjE1O2VbMzA5XT04MjUyO2VbMzEwXT04MzE5O2VbMzExXT04MzU5O2VbMzEyXT04NTkyO2VbMzEzXT04NTkzO2VbMzM3XT05NTUyO2VbNDkzXT0xMDM5O2VbNDk0XT0xMDQwO2VbNzA1XT0xNTI0O2VbNzA2XT04MzYyO2VbNzEwXT02NDI4ODtlWzcxMV09NjQyOTg7ZVs3NTldPTE2MTc7ZVs3NjFdPTE3NzY7ZVs3NjNdPTE3Nzg7ZVs3NzVdPTE2NTI7ZVs3NzddPTE3NjQ7ZVs3NzhdPTE3ODA7ZVs3NzldPTE3ODE7ZVs3ODBdPTE3ODI7ZVs3ODJdPTc3MTtlWzc4M109NjQ3MjY7ZVs3ODZdPTgzNjM7ZVs3ODhdPTg1MzI7ZVs3OTBdPTc2ODtlWzc5MV09NzY5O2VbNzkyXT03Njg7ZVs3OTVdPTgwMztlWzc5N109NjQzMzY7ZVs3OThdPTY0MzM3O2VbNzk5XT02NDM0MjtlWzgwMF09NjQzNDM7ZVs4MDFdPTY0MzQ0O2VbODAyXT02NDM0NTtlWzgwM109NjQzNjI7ZVs4MDRdPTY0MzYzO2VbODA1XT02NDM2NDtlWzI0MjRdPTc4MjE7ZVsyNDI1XT03ODIyO2VbMjQyNl09NzgyMztlWzI0MjddPTc4MjQ7ZVsyNDI4XT03ODI1O2VbMjQyOV09NzgyNjtlWzI0MzBdPTc4Mjc7ZVsyNDMzXT03NjgyO2VbMjY3OF09ODA0NTtlWzI2NzldPTgwNDY7ZVsyODMwXT0xNTUyO2VbMjgzOF09Njg2O2VbMjg0MF09NzUxO2VbMjg0Ml09NzUzO2VbMjg0M109NzU0O2VbMjg0NF09NzU1O2VbMjg0Nl09NzU3O2VbMjg1Nl09NzY3O2VbMjg1N109ODQ4O2VbMjg1OF09ODQ5O2VbMjg2Ml09ODUzO2VbMjg2M109ODU0O2VbMjg2NF09ODU1O2VbMjg2NV09ODYxO2VbMjg2Nl09ODYyO2VbMjkwNl09NzQ2MDtlWzI5MDhdPTc0NjI7ZVsyOTA5XT03NDYzO2VbMjkxMF09NzQ2NDtlWzI5MTJdPTc0NjY7ZVsyOTEzXT03NDY3O2VbMjkxNF09NzQ2ODtlWzI5MTZdPTc0NzA7ZVsyOTE3XT03NDcxO2VbMjkxOF09NzQ3MjtlWzI5MjBdPTc0NzQ7ZVsyOTIxXT03NDc1O2VbMjkyMl09NzQ3NjtlWzI5MjRdPTc0Nzg7ZVsyOTI1XT03NDc5O2VbMjkyNl09NzQ4MDtlWzI5MjhdPTc0ODI7ZVsyOTI5XT03NDgzO2VbMjkzMF09NzQ4NDtlWzI5MzJdPTc0ODY7ZVsyOTMzXT03NDg3O2VbMjkzNF09NzQ4ODtlWzI5MzZdPTc0OTA7ZVsyOTM3XT03NDkxO2VbMjkzOF09NzQ5MjtlWzI5NDBdPTc0OTQ7ZVsyOTQxXT03NDk1O2VbMjk0Ml09NzQ5NjtlWzI5NDRdPTc0OTg7ZVsyOTQ2XT03NTAwO2VbMjk0OF09NzUwMjtlWzI5NTBdPTc1MDQ7ZVsyOTUxXT03NTA1O2VbMjk1Ml09NzUwNjtlWzI5NTRdPTc1MDg7ZVsyOTU1XT03NTA5O2VbMjk1Nl09NzUxMDtlWzI5NThdPTc1MTI7ZVsyOTU5XT03NTEzO2VbMjk2MF09NzUxNDtlWzI5NjJdPTc1MTY7ZVsyOTYzXT03NTE3O2VbMjk2NF09NzUxODtlWzI5NjZdPTc1MjA7ZVsyOTY3XT03NTIxO2VbMjk2OF09NzUyMjtlWzI5NzBdPTc1MjQ7ZVsyOTcxXT03NTI1O2VbMjk3Ml09NzUyNjtlWzI5NzRdPTc1Mjg7ZVsyOTc1XT03NTI5O2VbMjk3Nl09NzUzMDtlWzI5NzhdPTE1Mzc7ZVsyOTc5XT0xNTM4O2VbMjk4MF09MTUzOTtlWzI5ODJdPTE1NDk7ZVsyOTgzXT0xNTUxO2VbMjk4NF09MTU1MjtlWzI5ODZdPTE1NTQ7ZVsyOTg3XT0xNTU1O2VbMjk4OF09MTU1NjtlWzI5OTBdPTE2MjM7ZVsyOTkxXT0xNjI0O2VbMjk5NV09MTc3NTtlWzI5OTldPTE3OTE7ZVszMDAyXT02NDI5MDtlWzMwMDNdPTY0MjkxO2VbMzAwNF09NjQyOTI7ZVszMDA2XT02NDI5NDtlWzMwMDddPTY0Mjk1O2VbMzAwOF09NjQyOTY7ZVszMDExXT0xOTAwO2VbMzAxNF09ODIyMztlWzMwMTVdPTgyNDQ7ZVszMDE3XT03NTMyO2VbMzAxOF09NzUzMztlWzMwMTldPTc1MzQ7ZVszMDc1XT03NTkwO2VbMzA3Nl09NzU5MTtlWzMwNzldPTc1OTQ7ZVszMDgwXT03NTk1O2VbMzA4M109NzU5ODtlWzMwODRdPTc1OTk7ZVszMDg3XT03NjAyO2VbMzA4OF09NzYwMztlWzMwOTFdPTc2MDY7ZVszMDkyXT03NjA3O2VbMzA5NV09NzYxMDtlWzMwOTZdPTc2MTE7ZVszMDk5XT03NjE0O2VbMzEwMF09NzYxNTtlWzMxMDNdPTc2MTg7ZVszMTA0XT03NjE5O2VbMzEwN109ODMzNztlWzMxMDhdPTgzMzg7ZVszMTE2XT0xODg0O2VbMzExOV09MTg4NTtlWzMxMjBdPTE4ODU7ZVszMTIzXT0xODg2O2VbMzEyNF09MTg4NjtlWzMxMjddPTE4ODc7ZVszMTI4XT0xODg3O2VbMzEzMV09MTg4ODtlWzMxMzJdPTE4ODg7ZVszMTM1XT0xODg5O2VbMzEzNl09MTg4OTtlWzMxMzldPTE4OTA7ZVszMTQwXT0xODkwO2VbMzE0M109MTg5MTtlWzMxNDRdPTE4OTE7ZVszMTQ3XT0xODkyO2VbMzE0OF09MTg5MjtlWzMxNTNdPTU4MDtlWzMxNTRdPTU4MTtlWzMxNTddPTU4NDtlWzMxNThdPTU4NTtlWzMxNjFdPTU4ODtlWzMxNjJdPTU4OTtlWzMxNjVdPTg5MTtlWzMxNjZdPTg5MjtlWzMxNjldPTEyNzQ7ZVszMTcwXT0xMjc1O2VbMzE3M109MTI3ODtlWzMxNzRdPTEyNzk7ZVszMTgxXT03NjIyO2VbMzE4Ml09NzYyMztlWzMyODJdPTExNzk5O2VbMzMxNl09NTc4O2VbMzM3OV09NDI3ODU7ZVszMzkzXT0xMTU5O2VbMzQxNl09ODM3N30pKTt0LmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cz1jO2NvbnN0IGw9KDAsYS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlWzIyN109MzIyO2VbMjY0XT0yNjE7ZVsyOTFdPTM0Nn0pKTt0LmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaz1sO2NvbnN0IGg9KDAsYS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlWzFdPTMyO2VbNF09NjU7ZVsxN109NjY7ZVsxOF09Njc7ZVsyNF09Njg7ZVsyOF09Njk7ZVszOF09NzA7ZVszOV09NzE7ZVs0NF09NzI7ZVs0N109NzM7ZVs1OF09NzQ7ZVs2MF09NzU7ZVs2Ml09NzY7ZVs2OF09Nzc7ZVs2OV09Nzg7ZVs3NV09Nzk7ZVs4N109ODA7ZVs4OV09ODE7ZVs5MF09ODI7ZVs5NF09ODM7ZVsxMDBdPTg0O2VbMTA0XT04NTtlWzExNV09ODY7ZVsxMTZdPTg3O2VbMTIxXT04ODtlWzEyMl09ODk7ZVsxMjddPTkwO2VbMjU4XT05NztlWzI2OF09MjYxO2VbMjcxXT05ODtlWzI3Ml09OTk7ZVsyNzNdPTI2MztlWzI4Ml09MTAwO2VbMjg2XT0xMDE7ZVsyOTVdPTI4MTtlWzI5Nl09MTAyO2VbMzM2XT0xMDM7ZVszNDZdPTEwNDtlWzM0OV09MTA1O2VbMzYxXT0xMDY7ZVszNjRdPTEwNztlWzM2N109MTA4O2VbMzcxXT0zMjI7ZVszNzNdPTEwOTtlWzM3NF09MTEwO2VbMzgxXT0xMTE7ZVszODNdPTI0MztlWzM5M109MTEyO2VbMzk1XT0xMTM7ZVszOTZdPTExNDtlWzQwMF09MTE1O2VbNDAxXT0zNDc7ZVs0MTBdPTExNjtlWzQzN109MTE3O2VbNDQ4XT0xMTg7ZVs0NDldPTExOTtlWzQ1NF09MTIwO2VbNDU1XT0xMjE7ZVs0NjBdPTEyMjtlWzQ2M109MzgwO2VbODUzXT00NDtlWzg1NV09NTg7ZVs4NTZdPTQ2O2VbODc2XT00NztlWzg3OF09NDU7ZVs4ODJdPTQ1O2VbODk0XT00MDtlWzg5NV09NDE7ZVs4OTZdPTkxO2VbODk3XT05MztlWzkyM109NjQ7ZVsxMDA0XT00ODtlWzEwMDVdPTQ5O2VbMTAwNl09NTA7ZVsxMDA3XT01MTtlWzEwMDhdPTUyO2VbMTAwOV09NTM7ZVsxMDEwXT01NDtlWzEwMTFdPTU1O2VbMTAxMl09NTY7ZVsxMDEzXT01NztlWzEwODFdPTM3O2VbMTA4NV09NDM7ZVsxMDg2XT00NX0pKTt0LmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaT1ofSxmdW5jdGlvbihlLHQscil7dmFyIGE9cig4KS5nZXRMb29rdXBUYWJsZUZhY3RvcnksaT1hKChmdW5jdGlvbihlKXtlWzYzNzIxXT0xNjk7ZVs2MzE5M109MTY5O2VbNjM3MjBdPTE3NDtlWzYzMTk0XT0xNzQ7ZVs2MzcyMl09ODQ4MjtlWzYzMTk1XT04NDgyO2VbNjM3MjldPTkxMjc7ZVs2MzczMF09OTEyODtlWzYzNzMxXT05MTI5O2VbNjM3NDBdPTkxMzE7ZVs2Mzc0MV09OTEzMjtlWzYzNzQyXT05MTMzO2VbNjM3MjZdPTkxMjE7ZVs2MzcyN109OTEyMjtlWzYzNzI4XT05MTIzO2VbNjM3MzddPTkxMjQ7ZVs2MzczOF09OTEyNTtlWzYzNzM5XT05MTI2O2VbNjM3MjNdPTkxMTU7ZVs2MzcyNF09OTExNjtlWzYzNzI1XT05MTE3O2VbNjM3MzRdPTkxMTg7ZVs2MzczNV09OTExOTtlWzYzNzM2XT05MTIwfSkpO3ZhciBuPVt7YmVnaW46MCxlbmQ6MTI3fSx7YmVnaW46MTI4LGVuZDoyNTV9LHtiZWdpbjoyNTYsZW5kOjM4M30se2JlZ2luOjM4NCxlbmQ6NTkxfSx7YmVnaW46NTkyLGVuZDo2ODd9LHtiZWdpbjo2ODgsZW5kOjc2N30se2JlZ2luOjc2OCxlbmQ6ODc5fSx7YmVnaW46ODgwLGVuZDoxMDIzfSx7YmVnaW46MTEzOTIsZW5kOjExNTE5fSx7YmVnaW46MTAyNCxlbmQ6MTI3OX0se2JlZ2luOjEzMjgsZW5kOjE0MjN9LHtiZWdpbjoxNDI0LGVuZDoxNTM1fSx7YmVnaW46NDIyNDAsZW5kOjQyNTU5fSx7YmVnaW46MTUzNixlbmQ6MTc5MX0se2JlZ2luOjE5ODQsZW5kOjIwNDd9LHtiZWdpbjoyMzA0LGVuZDoyNDMxfSx7YmVnaW46MjQzMixlbmQ6MjU1OX0se2JlZ2luOjI1NjAsZW5kOjI2ODd9LHtiZWdpbjoyNjg4LGVuZDoyODE1fSx7YmVnaW46MjgxNixlbmQ6Mjk0M30se2JlZ2luOjI5NDQsZW5kOjMwNzF9LHtiZWdpbjozMDcyLGVuZDozMTk5fSx7YmVnaW46MzIwMCxlbmQ6MzMyN30se2JlZ2luOjMzMjgsZW5kOjM0NTV9LHtiZWdpbjozNTg0LGVuZDozNzExfSx7YmVnaW46MzcxMixlbmQ6MzgzOX0se2JlZ2luOjQyNTYsZW5kOjQzNTF9LHtiZWdpbjo2OTEyLGVuZDo3MDM5fSx7YmVnaW46NDM1MixlbmQ6NDYwN30se2JlZ2luOjc2ODAsZW5kOjc5MzV9LHtiZWdpbjo3OTM2LGVuZDo4MTkxfSx7YmVnaW46ODE5MixlbmQ6ODMwM30se2JlZ2luOjgzMDQsZW5kOjgzNTF9LHtiZWdpbjo4MzUyLGVuZDo4Mzk5fSx7YmVnaW46ODQwMCxlbmQ6ODQ0N30se2JlZ2luOjg0NDgsZW5kOjg1Mjd9LHtiZWdpbjo4NTI4LGVuZDo4NTkxfSx7YmVnaW46ODU5MixlbmQ6ODcwM30se2JlZ2luOjg3MDQsZW5kOjg5NTl9LHtiZWdpbjo4OTYwLGVuZDo5MjE1fSx7YmVnaW46OTIxNixlbmQ6OTI3OX0se2JlZ2luOjkyODAsZW5kOjkzMTF9LHtiZWdpbjo5MzEyLGVuZDo5NDcxfSx7YmVnaW46OTQ3MixlbmQ6OTU5OX0se2JlZ2luOjk2MDAsZW5kOjk2MzF9LHtiZWdpbjo5NjMyLGVuZDo5NzI3fSx7YmVnaW46OTcyOCxlbmQ6OTk4M30se2JlZ2luOjk5ODQsZW5kOjEwMTc1fSx7YmVnaW46MTIyODgsZW5kOjEyMzUxfSx7YmVnaW46MTIzNTIsZW5kOjEyNDQ3fSx7YmVnaW46MTI0NDgsZW5kOjEyNTQzfSx7YmVnaW46MTI1NDQsZW5kOjEyNTkxfSx7YmVnaW46MTI1OTIsZW5kOjEyNjg3fSx7YmVnaW46NDMwNzIsZW5kOjQzMTM1fSx7YmVnaW46MTI4MDAsZW5kOjEzMDU1fSx7YmVnaW46MTMwNTYsZW5kOjEzMzExfSx7YmVnaW46NDQwMzIsZW5kOjU1MjE1fSx7YmVnaW46NTUyOTYsZW5kOjU3MzQzfSx7YmVnaW46Njc4NDAsZW5kOjY3ODcxfSx7YmVnaW46MTk5NjgsZW5kOjQwOTU5fSx7YmVnaW46NTczNDQsZW5kOjYzNzQzfSx7YmVnaW46MTI3MzYsZW5kOjEyNzgzfSx7YmVnaW46NjQyNTYsZW5kOjY0MzM1fSx7YmVnaW46NjQzMzYsZW5kOjY1MDIzfSx7YmVnaW46NjUwNTYsZW5kOjY1MDcxfSx7YmVnaW46NjUwNDAsZW5kOjY1MDU1fSx7YmVnaW46NjUxMDQsZW5kOjY1MTM1fSx7YmVnaW46NjUxMzYsZW5kOjY1Mjc5fSx7YmVnaW46NjUyODAsZW5kOjY1NTE5fSx7YmVnaW46NjU1MjAsZW5kOjY1NTM1fSx7YmVnaW46Mzg0MCxlbmQ6NDA5NX0se2JlZ2luOjE3OTIsZW5kOjE4NzF9LHtiZWdpbjoxOTIwLGVuZDoxOTgzfSx7YmVnaW46MzQ1NixlbmQ6MzU4M30se2JlZ2luOjQwOTYsZW5kOjQyNTV9LHtiZWdpbjo0NjA4LGVuZDo0OTkxfSx7YmVnaW46NTAyNCxlbmQ6NTExOX0se2JlZ2luOjUxMjAsZW5kOjU3NTl9LHtiZWdpbjo1NzYwLGVuZDo1NzkxfSx7YmVnaW46NTc5MixlbmQ6NTg4N30se2JlZ2luOjYwMTYsZW5kOjYxNDN9LHtiZWdpbjo2MTQ0LGVuZDo2MzE5fSx7YmVnaW46MTAyNDAsZW5kOjEwNDk1fSx7YmVnaW46NDA5NjAsZW5kOjQyMTI3fSx7YmVnaW46NTg4OCxlbmQ6NTkxOX0se2JlZ2luOjY2MzA0LGVuZDo2NjM1MX0se2JlZ2luOjY2MzUyLGVuZDo2NjM4M30se2JlZ2luOjY2NTYwLGVuZDo2NjYzOX0se2JlZ2luOjExODc4NCxlbmQ6MTE5MDM5fSx7YmVnaW46MTE5ODA4LGVuZDoxMjA4MzF9LHtiZWdpbjoxMDQ0NDgwLGVuZDoxMDQ4NTczfSx7YmVnaW46NjUwMjQsZW5kOjY1MDM5fSx7YmVnaW46OTE3NTA0LGVuZDo5MTc2MzF9LHtiZWdpbjo2NDAwLGVuZDo2NDc5fSx7YmVnaW46NjQ4MCxlbmQ6NjUyN30se2JlZ2luOjY1MjgsZW5kOjY2MjN9LHtiZWdpbjo2NjU2LGVuZDo2Njg3fSx7YmVnaW46MTEyNjQsZW5kOjExMzU5fSx7YmVnaW46MTE1NjgsZW5kOjExNjQ3fSx7YmVnaW46MTk5MDQsZW5kOjE5OTY3fSx7YmVnaW46NDMwMDgsZW5kOjQzMDU1fSx7YmVnaW46NjU1MzYsZW5kOjY1NjYzfSx7YmVnaW46NjU4NTYsZW5kOjY1OTM1fSx7YmVnaW46NjY0MzIsZW5kOjY2NDYzfSx7YmVnaW46NjY0NjQsZW5kOjY2NTI3fSx7YmVnaW46NjY2NDAsZW5kOjY2Njg3fSx7YmVnaW46NjY2ODgsZW5kOjY2NzM1fSx7YmVnaW46Njc1ODQsZW5kOjY3NjQ3fSx7YmVnaW46NjgwOTYsZW5kOjY4MTkxfSx7YmVnaW46MTE5NTUyLGVuZDoxMTk2NDd9LHtiZWdpbjo3MzcyOCxlbmQ6NzQ3NTF9LHtiZWdpbjoxMTk2NDgsZW5kOjExOTY3OX0se2JlZ2luOjcwNDAsZW5kOjcxMDN9LHtiZWdpbjo3MTY4LGVuZDo3MjQ3fSx7YmVnaW46NzI0OCxlbmQ6NzI5NX0se2JlZ2luOjQzMTM2LGVuZDo0MzIzMX0se2JlZ2luOjQzMjY0LGVuZDo0MzMxMX0se2JlZ2luOjQzMzEyLGVuZDo0MzM1OX0se2JlZ2luOjQzNTIwLGVuZDo0MzYxNX0se2JlZ2luOjY1OTM2LGVuZDo2NTk5OX0se2JlZ2luOjY2ZTMsZW5kOjY2MDQ3fSx7YmVnaW46NjYyMDgsZW5kOjY2MjcxfSx7YmVnaW46MTI3MDI0LGVuZDoxMjcxMzV9XTt2YXIgcz1hKChmdW5jdGlvbihlKXtlWyLCqCJdPSIgzIgiO2VbIsKvIl09IiDMhCI7ZVsiwrQiXT0iIMyBIjtlWyLCtSJdPSLOvCI7ZVsiwrgiXT0iIMynIjtlWyLEsiJdPSJJSiI7ZVsixLMiXT0iaWoiO2VbIsS/Il09IkzCtyI7ZVsixYAiXT0ibMK3IjtlWyLFiSJdPSLKvG4iO2VbIsW/Il09InMiO2VbIseEIl09IkTFvSI7ZVsix4UiXT0iRMW+IjtlWyLHhiJdPSJkxb4iO2VbIseHIl09IkxKIjtlWyLHiCJdPSJMaiI7ZVsix4kiXT0ibGoiO2VbIseKIl09Ik5KIjtlWyLHiyJdPSJOaiI7ZVsix4wiXT0ibmoiO2VbIsexIl09IkRaIjtlWyLHsiJdPSJEeiI7ZVsix7MiXT0iZHoiO2VbIsuYIl09IiDMhiI7ZVsiy5kiXT0iIMyHIjtlWyLLmiJdPSIgzIoiO2VbIsubIl09IiDMqCI7ZVsiy5wiXT0iIMyDIjtlWyLLnSJdPSIgzIsiO2VbIs26Il09IiDNhSI7ZVsizoQiXT0iIMyBIjtlWyLPkCJdPSLOsiI7ZVsiz5EiXT0izrgiO2VbIs+SIl09Is6lIjtlWyLPlSJdPSLPhiI7ZVsiz5YiXT0iz4AiO2VbIs+wIl09Is66IjtlWyLPsSJdPSLPgSI7ZVsiz7IiXT0iz4IiO2VbIs+0Il09Is6YIjtlWyLPtSJdPSLOtSI7ZVsiz7kiXT0izqMiO2VbItaHIl09ItWl1oIiO2VbItm1Il09Itin2bQiO2VbItm2Il09ItmI2bQiO2VbItm3Il09ItuH2bQiO2VbItm4Il09ItmK2bQiO2VbIuC4syJdPSLguY3guLIiO2VbIuC6syJdPSLgu43gurIiO2VbIuC7nCJdPSLguqvgupkiO2VbIuC7nSJdPSLguqvguqEiO2VbIuC9tyJdPSLgvrLgvoEiO2VbIuC9uSJdPSLgvrPgvoEiO2VbIuG6miJdPSJhyr4iO2VbIuG+vSJdPSIgzJMiO2VbIuG+vyJdPSIgzJMiO2VbIuG/gCJdPSIgzYIiO2VbIuG/viJdPSIgzJQiO2VbIuKAgiJdPSIgIjtlWyLigIMiXT0iICI7ZVsi4oCEIl09IiAiO2VbIuKAhSJdPSIgIjtlWyLigIYiXT0iICI7ZVsi4oCIIl09IiAiO2VbIuKAiSJdPSIgIjtlWyLigIoiXT0iICI7ZVsi4oCXIl09IiDMsyI7ZVsi4oCkIl09Ii4iO2VbIuKApSJdPSIuLiI7ZVsi4oCmIl09Ii4uLiI7ZVsi4oCzIl09IuKAsuKAsiI7ZVsi4oC0Il09IuKAsuKAsuKAsiI7ZVsi4oC2Il09IuKAteKAtSI7ZVsi4oC3Il09IuKAteKAteKAtSI7ZVsi4oC8Il09IiEhIjtlWyLigL4iXT0iIMyFIjtlWyLigYciXT0iPz8iO2VbIuKBiCJdPSI/ISI7ZVsi4oGJIl09IiE/IjtlWyLigZciXT0i4oCy4oCy4oCy4oCyIjtlWyLigZ8iXT0iICI7ZVsi4oKoIl09IlJzIjtlWyLihIAiXT0iYS9jIjtlWyLihIEiXT0iYS9zIjtlWyLihIMiXT0iwrBDIjtlWyLihIUiXT0iYy9vIjtlWyLihIYiXT0iYy91IjtlWyLihIciXT0ixpAiO2VbIuKEiSJdPSLCsEYiO2VbIuKEliJdPSJObyI7ZVsi4oShIl09IlRFTCI7ZVsi4oS1Il09IteQIjtlWyLihLYiXT0i15EiO2VbIuKEtyJdPSLXkiI7ZVsi4oS4Il09IteTIjtlWyLihLsiXT0iRkFYIjtlWyLihaAiXT0iSSI7ZVsi4oWhIl09IklJIjtlWyLihaIiXT0iSUlJIjtlWyLihaMiXT0iSVYiO2VbIuKFpCJdPSJWIjtlWyLihaUiXT0iVkkiO2VbIuKFpiJdPSJWSUkiO2VbIuKFpyJdPSJWSUlJIjtlWyLihagiXT0iSVgiO2VbIuKFqSJdPSJYIjtlWyLihaoiXT0iWEkiO2VbIuKFqyJdPSJYSUkiO2VbIuKFrCJdPSJMIjtlWyLiha0iXT0iQyI7ZVsi4oWuIl09IkQiO2VbIuKFryJdPSJNIjtlWyLihbAiXT0iaSI7ZVsi4oWxIl09ImlpIjtlWyLihbIiXT0iaWlpIjtlWyLihbMiXT0iaXYiO2VbIuKFtCJdPSJ2IjtlWyLihbUiXT0idmkiO2VbIuKFtiJdPSJ2aWkiO2VbIuKFtyJdPSJ2aWlpIjtlWyLihbgiXT0iaXgiO2VbIuKFuSJdPSJ4IjtlWyLihboiXT0ieGkiO2VbIuKFuyJdPSJ4aWkiO2VbIuKFvCJdPSJsIjtlWyLihb0iXT0iYyI7ZVsi4oW+Il09ImQiO2VbIuKFvyJdPSJtIjtlWyLiiKwiXT0i4oir4oirIjtlWyLiiK0iXT0i4oir4oir4oirIjtlWyLiiK8iXT0i4oiu4oiuIjtlWyLiiLAiXT0i4oiu4oiu4oiuIjtlWyLikbQiXT0iKDEpIjtlWyLikbUiXT0iKDIpIjtlWyLikbYiXT0iKDMpIjtlWyLikbciXT0iKDQpIjtlWyLikbgiXT0iKDUpIjtlWyLikbkiXT0iKDYpIjtlWyLikboiXT0iKDcpIjtlWyLikbsiXT0iKDgpIjtlWyLikbwiXT0iKDkpIjtlWyLikb0iXT0iKDEwKSI7ZVsi4pG+Il09IigxMSkiO2VbIuKRvyJdPSIoMTIpIjtlWyLikoAiXT0iKDEzKSI7ZVsi4pKBIl09IigxNCkiO2VbIuKSgiJdPSIoMTUpIjtlWyLikoMiXT0iKDE2KSI7ZVsi4pKEIl09IigxNykiO2VbIuKShSJdPSIoMTgpIjtlWyLikoYiXT0iKDE5KSI7ZVsi4pKHIl09IigyMCkiO2VbIuKSiCJdPSIxLiI7ZVsi4pKJIl09IjIuIjtlWyLikooiXT0iMy4iO2VbIuKSiyJdPSI0LiI7ZVsi4pKMIl09IjUuIjtlWyLiko0iXT0iNi4iO2VbIuKSjiJdPSI3LiI7ZVsi4pKPIl09IjguIjtlWyLikpAiXT0iOS4iO2VbIuKSkSJdPSIxMC4iO2VbIuKSkiJdPSIxMS4iO2VbIuKSkyJdPSIxMi4iO2VbIuKSlCJdPSIxMy4iO2VbIuKSlSJdPSIxNC4iO2VbIuKSliJdPSIxNS4iO2VbIuKSlyJdPSIxNi4iO2VbIuKSmCJdPSIxNy4iO2VbIuKSmSJdPSIxOC4iO2VbIuKSmiJdPSIxOS4iO2VbIuKSmyJdPSIyMC4iO2VbIuKSnCJdPSIoYSkiO2VbIuKSnSJdPSIoYikiO2VbIuKSniJdPSIoYykiO2VbIuKSnyJdPSIoZCkiO2VbIuKSoCJdPSIoZSkiO2VbIuKSoSJdPSIoZikiO2VbIuKSoiJdPSIoZykiO2VbIuKSoyJdPSIoaCkiO2VbIuKSpCJdPSIoaSkiO2VbIuKSpSJdPSIoaikiO2VbIuKSpiJdPSIoaykiO2VbIuKSpyJdPSIobCkiO2VbIuKSqCJdPSIobSkiO2VbIuKSqSJdPSIobikiO2VbIuKSqiJdPSIobykiO2VbIuKSqyJdPSIocCkiO2VbIuKSrCJdPSIocSkiO2VbIuKSrSJdPSIocikiO2VbIuKSriJdPSIocykiO2VbIuKSryJdPSIodCkiO2VbIuKSsCJdPSIodSkiO2VbIuKSsSJdPSIodikiO2VbIuKSsiJdPSIodykiO2VbIuKSsyJdPSIoeCkiO2VbIuKStCJdPSIoeSkiO2VbIuKStSJdPSIoeikiO2VbIuKojCJdPSLiiKviiKviiKviiKsiO2VbIuKptCJdPSI6Oj0iO2VbIuKptSJdPSI9PSI7ZVsi4qm2Il09Ij09PSI7ZVsi4rqfIl09IuavjSI7ZVsi4ruzIl09Ium+nyI7ZVsi4ryAIl09IuS4gCI7ZVsi4ryBIl09IuS4qCI7ZVsi4ryCIl09IuS4tiI7ZVsi4ryDIl09IuS4vyI7ZVsi4ryEIl09IuS5mSI7ZVsi4ryFIl09IuS6hSI7ZVsi4ryGIl09IuS6jCI7ZVsi4ryHIl09IuS6oCI7ZVsi4ryIIl09IuS6uiI7ZVsi4ryJIl09IuWEvyI7ZVsi4ryKIl09IuWFpSI7ZVsi4ryLIl09IuWFqyI7ZVsi4ryMIl09IuWGgiI7ZVsi4ryNIl09IuWGliI7ZVsi4ryOIl09IuWGqyI7ZVsi4ryPIl09IuWHoCI7ZVsi4ryQIl09IuWHtSI7ZVsi4ryRIl09IuWIgCI7ZVsi4rySIl09IuWKmyI7ZVsi4ryTIl09IuWLuSI7ZVsi4ryUIl09IuWMlSI7ZVsi4ryVIl09IuWMmiI7ZVsi4ryWIl09IuWMuCI7ZVsi4ryXIl09IuWNgSI7ZVsi4ryYIl09IuWNnCI7ZVsi4ryZIl09IuWNqSI7ZVsi4ryaIl09IuWOgiI7ZVsi4rybIl09IuWOtiI7ZVsi4rycIl09IuWPiCI7ZVsi4rydIl09IuWPoyI7ZVsi4ryeIl09IuWblyI7ZVsi4ryfIl09IuWcnyI7ZVsi4rygIl09IuWjqyI7ZVsi4ryhIl09IuWkgiI7ZVsi4ryiIl09IuWkiiI7ZVsi4ryjIl09IuWklSI7ZVsi4rykIl09IuWkpyI7ZVsi4rylIl09IuWlsyI7ZVsi4rymIl09IuWtkCI7ZVsi4rynIl09IuWugCI7ZVsi4ryoIl09IuWvuCI7ZVsi4rypIl09IuWwjyI7ZVsi4ryqIl09IuWwoiI7ZVsi4ryrIl09IuWwuCI7ZVsi4rysIl09IuWxriI7ZVsi4rytIl09IuWxsSI7ZVsi4ryuIl09IuW3myI7ZVsi4ryvIl09IuW3pSI7ZVsi4rywIl09IuW3sSI7ZVsi4ryxIl09IuW3viI7ZVsi4ryyIl09IuW5siI7ZVsi4ryzIl09IuW5uiI7ZVsi4ry0Il09IuW5vyI7ZVsi4ry1Il09IuW7tCI7ZVsi4ry2Il09IuW7viI7ZVsi4ry3Il09IuW8iyI7ZVsi4ry4Il09IuW8kyI7ZVsi4ry5Il09IuW9kCI7ZVsi4ry6Il09IuW9oSI7ZVsi4ry7Il09IuW9syI7ZVsi4ry8Il09IuW/gyI7ZVsi4ry9Il09IuaIiCI7ZVsi4ry+Il09IuaItiI7ZVsi4ry/Il09IuaJiyI7ZVsi4r2AIl09IuaUryI7ZVsi4r2BIl09IuaUtCI7ZVsi4r2CIl09IuaWhyI7ZVsi4r2DIl09IuaWlyI7ZVsi4r2EIl09IuaWpCI7ZVsi4r2FIl09IuaWuSI7ZVsi4r2GIl09IuaXoCI7ZVsi4r2HIl09IuaXpSI7ZVsi4r2IIl09IuabsCI7ZVsi4r2JIl09IuaciCI7ZVsi4r2KIl09IuacqCI7ZVsi4r2LIl09IuasoCI7ZVsi4r2MIl09IuatoiI7ZVsi4r2NIl09IuatuSI7ZVsi4r2OIl09IuausyI7ZVsi4r2PIl09IuaviyI7ZVsi4r2QIl09IuavlCI7ZVsi4r2RIl09IuavmyI7ZVsi4r2SIl09IuawjyI7ZVsi4r2TIl09IuawlCI7ZVsi4r2UIl09IuawtCI7ZVsi4r2VIl09IueBqyI7ZVsi4r2WIl09IueIqiI7ZVsi4r2XIl09IueItiI7ZVsi4r2YIl09IueIuyI7ZVsi4r2ZIl09IueIvyI7ZVsi4r2aIl09IueJhyI7ZVsi4r2bIl09IueJmSI7ZVsi4r2cIl09IueJmyI7ZVsi4r2dIl09IueKrCI7ZVsi4r2eIl09IueOhCI7ZVsi4r2fIl09IueOiSI7ZVsi4r2gIl09IueTnCI7ZVsi4r2hIl09IueTpiI7ZVsi4r2iIl09IueUmCI7ZVsi4r2jIl09IueUnyI7ZVsi4r2kIl09IueUqCI7ZVsi4r2lIl09IueUsCI7ZVsi4r2mIl09IueWiyI7ZVsi4r2nIl09IueWkiI7ZVsi4r2oIl09IueZtiI7ZVsi4r2pIl09IueZvSI7ZVsi4r2qIl09IueariI7ZVsi4r2rIl09IueavyI7ZVsi4r2sIl09IuebriI7ZVsi4r2tIl09IuefmyI7ZVsi4r2uIl09IuefoiI7ZVsi4r2vIl09IuefsyI7ZVsi4r2wIl09IuekuiI7ZVsi4r2xIl09IuemuCI7ZVsi4r2yIl09IuemviI7ZVsi4r2zIl09IueptCI7ZVsi4r20Il09IueriyI7ZVsi4r21Il09IueruSI7ZVsi4r22Il09IuexsyI7ZVsi4r23Il09IuezuCI7ZVsi4r24Il09Iue8tiI7ZVsi4r25Il09Iue9kSI7ZVsi4r26Il09Iue+iiI7ZVsi4r27Il09Iue+vSI7ZVsi4r28Il09IuiAgSI7ZVsi4r29Il09IuiAjCI7ZVsi4r2+Il09IuiAkiI7ZVsi4r2/Il09IuiAsyI7ZVsi4r6AIl09IuiBvyI7ZVsi4r6BIl09IuiCiSI7ZVsi4r6CIl09IuiHoyI7ZVsi4r6DIl09IuiHqiI7ZVsi4r6EIl09IuiHsyI7ZVsi4r6FIl09IuiHvCI7ZVsi4r6GIl09IuiIjCI7ZVsi4r6HIl09IuiImyI7ZVsi4r6IIl09IuiInyI7ZVsi4r6JIl09IuiJriI7ZVsi4r6KIl09IuiJsiI7ZVsi4r6LIl09IuiJuCI7ZVsi4r6MIl09IuiZjSI7ZVsi4r6NIl09IuiZqyI7ZVsi4r6OIl09IuihgCI7ZVsi4r6PIl09IuihjCI7ZVsi4r6QIl09IuihoyI7ZVsi4r6RIl09IuilviI7ZVsi4r6SIl09IuimiyI7ZVsi4r6TIl09IuinkiI7ZVsi4r6UIl09IuiogCI7ZVsi4r6VIl09IuiwtyI7ZVsi4r6WIl09IuixhiI7ZVsi4r6XIl09IuixlSI7ZVsi4r6YIl09IuixuCI7ZVsi4r6ZIl09IuiynSI7ZVsi4r6aIl09Iui1pCI7ZVsi4r6bIl09Iui1sCI7ZVsi4r6cIl09Iui2syI7ZVsi4r6dIl09Iui6qyI7ZVsi4r6eIl09Iui7iiI7ZVsi4r6fIl09Iui+myI7ZVsi4r6gIl09Iui+sCI7ZVsi4r6hIl09Iui+tSI7ZVsi4r6iIl09IumCkSI7ZVsi4r6jIl09IumFiSI7ZVsi4r6kIl09IumHhiI7ZVsi4r6lIl09IumHjCI7ZVsi4r6mIl09IumHkSI7ZVsi4r6nIl09IumVtyI7ZVsi4r6oIl09IumWgCI7ZVsi4r6pIl09IumYnCI7ZVsi4r6qIl09IumatiI7ZVsi4r6rIl09IumauSI7ZVsi4r6sIl09IumbqCI7ZVsi4r6tIl09IumdkSI7ZVsi4r6uIl09IumdniI7ZVsi4r6vIl09IumdoiI7ZVsi4r6wIl09IumdqSI7ZVsi4r6xIl09IumfiyI7ZVsi4r6yIl09IumfrSI7ZVsi4r6zIl09IumfsyI7ZVsi4r60Il09IumggSI7ZVsi4r61Il09IumiqCI7ZVsi4r62Il09IumjmyI7ZVsi4r63Il09IumjnyI7ZVsi4r64Il09IummliI7ZVsi4r65Il09IummmSI7ZVsi4r66Il09IummrCI7ZVsi4r67Il09IumqqCI7ZVsi4r68Il09IumrmCI7ZVsi4r69Il09IumrnyI7ZVsi4r6+Il09IumspSI7ZVsi4r6/Il09IumsryI7ZVsi4r+AIl09IumssiI7ZVsi4r+BIl09IumsvCI7ZVsi4r+CIl09IumtmiI7ZVsi4r+DIl09IumzpSI7ZVsi4r+EIl09Ium5tSI7ZVsi4r+FIl09Ium5vyI7ZVsi4r+GIl09Ium6pSI7ZVsi4r+HIl09Ium6uyI7ZVsi4r+IIl09Ium7gyI7ZVsi4r+JIl09Ium7jSI7ZVsi4r+KIl09Ium7kSI7ZVsi4r+LIl09Ium7uSI7ZVsi4r+MIl09Ium7vSI7ZVsi4r+NIl09Ium8jiI7ZVsi4r+OIl09Ium8kyI7ZVsi4r+PIl09Ium8oCI7ZVsi4r+QIl09Ium8uyI7ZVsi4r+RIl09Ium9iiI7ZVsi4r+SIl09Ium9kiI7ZVsi4r+TIl09Ium+jSI7ZVsi4r+UIl09Ium+nCI7ZVsi4r+VIl09Ium+oCI7ZVsi44C2Il09IuOAkiI7ZVsi44C4Il09IuWNgSI7ZVsi44C5Il09IuWNhCI7ZVsi44C6Il09IuWNhSI7ZVsi44KbIl09IiDjgpkiO2VbIuOCnCJdPSIg44KaIjtlWyLjhLEiXT0i4YSAIjtlWyLjhLIiXT0i4YSBIjtlWyLjhLMiXT0i4YaqIjtlWyLjhLQiXT0i4YSCIjtlWyLjhLUiXT0i4YasIjtlWyLjhLYiXT0i4YatIjtlWyLjhLciXT0i4YSDIjtlWyLjhLgiXT0i4YSEIjtlWyLjhLkiXT0i4YSFIjtlWyLjhLoiXT0i4YawIjtlWyLjhLsiXT0i4YaxIjtlWyLjhLwiXT0i4YayIjtlWyLjhL0iXT0i4YazIjtlWyLjhL4iXT0i4Ya0IjtlWyLjhL8iXT0i4Ya1IjtlWyLjhYAiXT0i4YSaIjtlWyLjhYEiXT0i4YSGIjtlWyLjhYIiXT0i4YSHIjtlWyLjhYMiXT0i4YSIIjtlWyLjhYQiXT0i4YShIjtlWyLjhYUiXT0i4YSJIjtlWyLjhYYiXT0i4YSKIjtlWyLjhYciXT0i4YSLIjtlWyLjhYgiXT0i4YSMIjtlWyLjhYkiXT0i4YSNIjtlWyLjhYoiXT0i4YSOIjtlWyLjhYsiXT0i4YSPIjtlWyLjhYwiXT0i4YSQIjtlWyLjhY0iXT0i4YSRIjtlWyLjhY4iXT0i4YSSIjtlWyLjhY8iXT0i4YWhIjtlWyLjhZAiXT0i4YWiIjtlWyLjhZEiXT0i4YWjIjtlWyLjhZIiXT0i4YWkIjtlWyLjhZMiXT0i4YWlIjtlWyLjhZQiXT0i4YWmIjtlWyLjhZUiXT0i4YWnIjtlWyLjhZYiXT0i4YWoIjtlWyLjhZciXT0i4YWpIjtlWyLjhZgiXT0i4YWqIjtlWyLjhZkiXT0i4YWrIjtlWyLjhZoiXT0i4YWsIjtlWyLjhZsiXT0i4YWtIjtlWyLjhZwiXT0i4YWuIjtlWyLjhZ0iXT0i4YWvIjtlWyLjhZ4iXT0i4YWwIjtlWyLjhZ8iXT0i4YWxIjtlWyLjhaAiXT0i4YWyIjtlWyLjhaEiXT0i4YWzIjtlWyLjhaIiXT0i4YW0IjtlWyLjhaMiXT0i4YW1IjtlWyLjhaQiXT0i4YWgIjtlWyLjhaUiXT0i4YSUIjtlWyLjhaYiXT0i4YSVIjtlWyLjhaciXT0i4YeHIjtlWyLjhagiXT0i4YeIIjtlWyLjhakiXT0i4YeMIjtlWyLjhaoiXT0i4YeOIjtlWyLjhasiXT0i4YeTIjtlWyLjhawiXT0i4YeXIjtlWyLjha0iXT0i4YeZIjtlWyLjha4iXT0i4YScIjtlWyLjha8iXT0i4YedIjtlWyLjhbAiXT0i4YefIjtlWyLjhbEiXT0i4YSdIjtlWyLjhbIiXT0i4YSeIjtlWyLjhbMiXT0i4YSgIjtlWyLjhbQiXT0i4YSiIjtlWyLjhbUiXT0i4YSjIjtlWyLjhbYiXT0i4YSnIjtlWyLjhbciXT0i4YSpIjtlWyLjhbgiXT0i4YSrIjtlWyLjhbkiXT0i4YSsIjtlWyLjhboiXT0i4YStIjtlWyLjhbsiXT0i4YSuIjtlWyLjhbwiXT0i4YSvIjtlWyLjhb0iXT0i4YSyIjtlWyLjhb4iXT0i4YS2IjtlWyLjhb8iXT0i4YWAIjtlWyLjhoAiXT0i4YWHIjtlWyLjhoEiXT0i4YWMIjtlWyLjhoIiXT0i4YexIjtlWyLjhoMiXT0i4YeyIjtlWyLjhoQiXT0i4YWXIjtlWyLjhoUiXT0i4YWYIjtlWyLjhoYiXT0i4YWZIjtlWyLjhociXT0i4YaEIjtlWyLjhogiXT0i4YaFIjtlWyLjhokiXT0i4YaIIjtlWyLjhooiXT0i4YaRIjtlWyLjhosiXT0i4YaSIjtlWyLjhowiXT0i4YaUIjtlWyLjho0iXT0i4YaeIjtlWyLjho4iXT0i4YahIjtlWyLjiIAiXT0iKOGEgCkiO2VbIuOIgSJdPSIo4YSCKSI7ZVsi44iCIl09IijhhIMpIjtlWyLjiIMiXT0iKOGEhSkiO2VbIuOIhCJdPSIo4YSGKSI7ZVsi44iFIl09IijhhIcpIjtlWyLjiIYiXT0iKOGEiSkiO2VbIuOIhyJdPSIo4YSLKSI7ZVsi44iIIl09IijhhIwpIjtlWyLjiIkiXT0iKOGEjikiO2VbIuOIiiJdPSIo4YSPKSI7ZVsi44iLIl09IijhhJApIjtlWyLjiIwiXT0iKOGEkSkiO2VbIuOIjSJdPSIo4YSSKSI7ZVsi44iOIl09IijhhIDhhaEpIjtlWyLjiI8iXT0iKOGEguGFoSkiO2VbIuOIkCJdPSIo4YSD4YWhKSI7ZVsi44iRIl09IijhhIXhhaEpIjtlWyLjiJIiXT0iKOGEhuGFoSkiO2VbIuOIkyJdPSIo4YSH4YWhKSI7ZVsi44iUIl09IijhhInhhaEpIjtlWyLjiJUiXT0iKOGEi+GFoSkiO2VbIuOIliJdPSIo4YSM4YWhKSI7ZVsi44iXIl09IijhhI7hhaEpIjtlWyLjiJgiXT0iKOGEj+GFoSkiO2VbIuOImSJdPSIo4YSQ4YWhKSI7ZVsi44iaIl09IijhhJHhhaEpIjtlWyLjiJsiXT0iKOGEkuGFoSkiO2VbIuOInCJdPSIo4YSM4YWuKSI7ZVsi44idIl09IijhhIvhhanhhIzhhaXhhqspIjtlWyLjiJ4iXT0iKOGEi+GFqeGEkuGFrikiO2VbIuOIoCJdPSIo5LiAKSI7ZVsi44ihIl09IijkuowpIjtlWyLjiKIiXT0iKOS4iSkiO2VbIuOIoyJdPSIo5ZubKSI7ZVsi44ikIl09IijkupQpIjtlWyLjiKUiXT0iKOWFrSkiO2VbIuOIpiJdPSIo5LiDKSI7ZVsi44inIl09IijlhaspIjtlWyLjiKgiXT0iKOS5nSkiO2VbIuOIqSJdPSIo5Y2BKSI7ZVsi44iqIl09IijmnIgpIjtlWyLjiKsiXT0iKOeBqykiO2VbIuOIrCJdPSIo5rC0KSI7ZVsi44itIl09IijmnKgpIjtlWyLjiK4iXT0iKOmHkSkiO2VbIuOIryJdPSIo5ZyfKSI7ZVsi44iwIl09Iijml6UpIjtlWyLjiLEiXT0iKOagqikiO2VbIuOIsiJdPSIo5pyJKSI7ZVsi44izIl09IijnpL4pIjtlWyLjiLQiXT0iKOWQjSkiO2VbIuOItSJdPSIo54m5KSI7ZVsi44i2Il09IijosqEpIjtlWyLjiLciXT0iKOelnSkiO2VbIuOIuCJdPSIo5Yq0KSI7ZVsi44i5Il09Iijku6MpIjtlWyLjiLoiXT0iKOWRvCkiO2VbIuOIuyJdPSIo5a2mKSI7ZVsi44i8Il09Iijnm6MpIjtlWyLjiL0iXT0iKOS8gSkiO2VbIuOIviJdPSIo6LOHKSI7ZVsi44i/Il09IijljZQpIjtlWyLjiYAiXT0iKOelrSkiO2VbIuOJgSJdPSIo5LyRKSI7ZVsi44mCIl09Iijoh6opIjtlWyLjiYMiXT0iKOiHsykiO2VbIuOLgCJdPSIx5pyIIjtlWyLji4EiXT0iMuaciCI7ZVsi44uCIl09IjPmnIgiO2VbIuOLgyJdPSI05pyIIjtlWyLji4QiXT0iNeaciCI7ZVsi44uFIl09IjbmnIgiO2VbIuOLhiJdPSI35pyIIjtlWyLji4ciXT0iOOaciCI7ZVsi44uIIl09IjnmnIgiO2VbIuOLiSJdPSIxMOaciCI7ZVsi44uKIl09IjEx5pyIIjtlWyLji4siXT0iMTLmnIgiO2VbIuONmCJdPSIw54K5IjtlWyLjjZkiXT0iMeeCuSI7ZVsi442aIl09IjLngrkiO2VbIuONmyJdPSIz54K5IjtlWyLjjZwiXT0iNOeCuSI7ZVsi442dIl09IjXngrkiO2VbIuONniJdPSI254K5IjtlWyLjjZ8iXT0iN+eCuSI7ZVsi442gIl09IjjngrkiO2VbIuONoSJdPSI554K5IjtlWyLjjaIiXT0iMTDngrkiO2VbIuONoyJdPSIxMeeCuSI7ZVsi442kIl09IjEy54K5IjtlWyLjjaUiXT0iMTPngrkiO2VbIuONpiJdPSIxNOeCuSI7ZVsi442nIl09IjE154K5IjtlWyLjjagiXT0iMTbngrkiO2VbIuONqSJdPSIxN+eCuSI7ZVsi442qIl09IjE454K5IjtlWyLjjasiXT0iMTnngrkiO2VbIuONrCJdPSIyMOeCuSI7ZVsi442tIl09IjIx54K5IjtlWyLjja4iXT0iMjLngrkiO2VbIuONryJdPSIyM+eCuSI7ZVsi442wIl09IjI054K5IjtlWyLjj6AiXT0iMeaXpSI7ZVsi44+hIl09IjLml6UiO2VbIuOPoiJdPSIz5pelIjtlWyLjj6MiXT0iNOaXpSI7ZVsi44+kIl09IjXml6UiO2VbIuOPpSJdPSI25pelIjtlWyLjj6YiXT0iN+aXpSI7ZVsi44+nIl09Ijjml6UiO2VbIuOPqCJdPSI55pelIjtlWyLjj6kiXT0iMTDml6UiO2VbIuOPqiJdPSIxMeaXpSI7ZVsi44+rIl09IjEy5pelIjtlWyLjj6wiXT0iMTPml6UiO2VbIuOPrSJdPSIxNOaXpSI7ZVsi44+uIl09IjE15pelIjtlWyLjj68iXT0iMTbml6UiO2VbIuOPsCJdPSIxN+aXpSI7ZVsi44+xIl09IjE45pelIjtlWyLjj7IiXT0iMTnml6UiO2VbIuOPsyJdPSIyMOaXpSI7ZVsi44+0Il09IjIx5pelIjtlWyLjj7UiXT0iMjLml6UiO2VbIuOPtiJdPSIyM+aXpSI7ZVsi44+3Il09IjI05pelIjtlWyLjj7giXT0iMjXml6UiO2VbIuOPuSJdPSIyNuaXpSI7ZVsi44+6Il09IjI35pelIjtlWyLjj7siXT0iMjjml6UiO2VbIuOPvCJdPSIyOeaXpSI7ZVsi44+9Il09IjMw5pelIjtlWyLjj74iXT0iMzHml6UiO2VbIu+sgCJdPSJmZiI7ZVsi76yBIl09ImZpIjtlWyLvrIIiXT0iZmwiO2VbIu+sgyJdPSJmZmkiO2VbIu+shCJdPSJmZmwiO2VbIu+shSJdPSLFv3QiO2VbIu+shiJdPSJzdCI7ZVsi76yTIl09ItW01bYiO2VbIu+slCJdPSLVtNWlIjtlWyLvrJUiXT0i1bTVqyI7ZVsi76yWIl09ItW+1bYiO2VbIu+slyJdPSLVtNWtIjtlWyLvrY8iXT0i15DXnCI7ZVsi762QIl09ItmxIjtlWyLvrZEiXT0i2bEiO2VbIu+tkiJdPSLZuyI7ZVsi762TIl09Itm7IjtlWyLvrZQiXT0i2bsiO2VbIu+tlSJdPSLZuyI7ZVsi762WIl09Itm+IjtlWyLvrZciXT0i2b4iO2VbIu+tmCJdPSLZviI7ZVsi762ZIl09Itm+IjtlWyLvrZoiXT0i2oAiO2VbIu+tmyJdPSLagCI7ZVsi762cIl09ItqAIjtlWyLvrZ0iXT0i2oAiO2VbIu+tniJdPSLZuiI7ZVsi762fIl09Itm6IjtlWyLvraAiXT0i2boiO2VbIu+toSJdPSLZuiI7ZVsi762iIl09Itm/IjtlWyLvraMiXT0i2b8iO2VbIu+tpCJdPSLZvyI7ZVsi762lIl09Itm/IjtlWyLvraYiXT0i2bkiO2VbIu+tpyJdPSLZuSI7ZVsi762oIl09Itm5IjtlWyLvrakiXT0i2bkiO2VbIu+tqiJdPSLapCI7ZVsi762rIl09ItqkIjtlWyLvrawiXT0i2qQiO2VbIu+trSJdPSLapCI7ZVsi762uIl09ItqmIjtlWyLvra8iXT0i2qYiO2VbIu+tsCJdPSLapiI7ZVsi762xIl09ItqmIjtlWyLvrbIiXT0i2oQiO2VbIu+tsyJdPSLahCI7ZVsi7620Il09ItqEIjtlWyLvrbUiXT0i2oQiO2VbIu+ttiJdPSLagyI7ZVsi7623Il09ItqDIjtlWyLvrbgiXT0i2oMiO2VbIu+tuSJdPSLagyI7ZVsi7626Il09ItqGIjtlWyLvrbsiXT0i2oYiO2VbIu+tvCJdPSLahiI7ZVsi7629Il09ItqGIjtlWyLvrb4iXT0i2ociO2VbIu+tvyJdPSLahyI7ZVsi766AIl09ItqHIjtlWyLvroEiXT0i2ociO2VbIu+ugiJdPSLajSI7ZVsi766DIl09ItqNIjtlWyLvroQiXT0i2owiO2VbIu+uhSJdPSLajCI7ZVsi766GIl09ItqOIjtlWyLvrociXT0i2o4iO2VbIu+uiCJdPSLaiCI7ZVsi766JIl09ItqIIjtlWyLvrooiXT0i2pgiO2VbIu+uiyJdPSLamCI7ZVsi766MIl09ItqRIjtlWyLvro0iXT0i2pEiO2VbIu+ujiJdPSLaqSI7ZVsi766PIl09ItqpIjtlWyLvrpAiXT0i2qkiO2VbIu+ukSJdPSLaqSI7ZVsi766SIl09ItqvIjtlWyLvrpMiXT0i2q8iO2VbIu+ulCJdPSLaryI7ZVsi766VIl09ItqvIjtlWyLvrpYiXT0i2rMiO2VbIu+ulyJdPSLasyI7ZVsi766YIl09ItqzIjtlWyLvrpkiXT0i2rMiO2VbIu+umiJdPSLasSI7ZVsi766bIl09ItqxIjtlWyLvrpwiXT0i2rEiO2VbIu+unSJdPSLasSI7ZVsi766eIl09Itq6IjtlWyLvrp8iXT0i2roiO2VbIu+uoCJdPSLauyI7ZVsi766hIl09Itq7IjtlWyLvrqIiXT0i2rsiO2VbIu+uoyJdPSLauyI7ZVsi766kIl09ItuAIjtlWyLvrqUiXT0i24AiO2VbIu+upiJdPSLbgSI7ZVsi766nIl09ItuBIjtlWyLvrqgiXT0i24EiO2VbIu+uqSJdPSLbgSI7ZVsi766qIl09Itq+IjtlWyLvrqsiXT0i2r4iO2VbIu+urCJdPSLaviI7ZVsi766tIl09Itq+IjtlWyLvrq4iXT0i25IiO2VbIu+uryJdPSLbkiI7ZVsi766wIl09ItuTIjtlWyLvrrEiXT0i25MiO2VbIu+vkyJdPSLarSI7ZVsi76+UIl09ItqtIjtlWyLvr5UiXT0i2q0iO2VbIu+vliJdPSLarSI7ZVsi76+XIl09ItuHIjtlWyLvr5giXT0i24ciO2VbIu+vmSJdPSLbhiI7ZVsi76+aIl09ItuGIjtlWyLvr5siXT0i24giO2VbIu+vnCJdPSLbiCI7ZVsi76+dIl09Itm3IjtlWyLvr54iXT0i24siO2VbIu+vnyJdPSLbiyI7ZVsi76+gIl09ItuFIjtlWyLvr6EiXT0i24UiO2VbIu+voiJdPSLbiSI7ZVsi76+jIl09ItuJIjtlWyLvr6QiXT0i25AiO2VbIu+vpSJdPSLbkCI7ZVsi76+mIl09ItuQIjtlWyLvr6ciXT0i25AiO2VbIu+vqCJdPSLZiSI7ZVsi76+pIl09ItmJIjtlWyLvr6oiXT0i2KbYpyI7ZVsi76+rIl09Itim2KciO2VbIu+vrCJdPSLYptuVIjtlWyLvr60iXT0i2KbblSI7ZVsi76+uIl09Itim2YgiO2VbIu+vryJdPSLYptmIIjtlWyLvr7AiXT0i2KbbhyI7ZVsi76+xIl09Itim24ciO2VbIu+vsiJdPSLYptuGIjtlWyLvr7MiXT0i2KbbhiI7ZVsi76+0Il09Itim24giO2VbIu+vtSJdPSLYptuIIjtlWyLvr7YiXT0i2KbbkCI7ZVsi76+3Il09Itim25AiO2VbIu+vuCJdPSLYptuQIjtlWyLvr7kiXT0i2KbZiSI7ZVsi76+6Il09Itim2YkiO2VbIu+vuyJdPSLYptmJIjtlWyLvr7wiXT0i24wiO2VbIu+vvSJdPSLbjCI7ZVsi76++Il09ItuMIjtlWyLvr78iXT0i24wiO2VbIu+wgCJdPSLYptisIjtlWyLvsIEiXT0i2KbYrSI7ZVsi77CCIl09Itim2YUiO2VbIu+wgyJdPSLYptmJIjtlWyLvsIQiXT0i2KbZiiI7ZVsi77CFIl09Itio2KwiO2VbIu+whiJdPSLYqNitIjtlWyLvsIciXT0i2KjYriI7ZVsi77CIIl09Itio2YUiO2VbIu+wiSJdPSLYqNmJIjtlWyLvsIoiXT0i2KjZiiI7ZVsi77CLIl09Itiq2KwiO2VbIu+wjCJdPSLYqtitIjtlWyLvsI0iXT0i2KrYriI7ZVsi77COIl09Itiq2YUiO2VbIu+wjyJdPSLYqtmJIjtlWyLvsJAiXT0i2KrZiiI7ZVsi77CRIl09Itir2KwiO2VbIu+wkiJdPSLYq9mFIjtlWyLvsJMiXT0i2KvZiSI7ZVsi77CUIl09Itir2YoiO2VbIu+wlSJdPSLYrNitIjtlWyLvsJYiXT0i2KzZhSI7ZVsi77CXIl09Itit2KwiO2VbIu+wmCJdPSLYrdmFIjtlWyLvsJkiXT0i2K7YrCI7ZVsi77CaIl09Itiu2K0iO2VbIu+wmyJdPSLYrtmFIjtlWyLvsJwiXT0i2LPYrCI7ZVsi77CdIl09Itiz2K0iO2VbIu+wniJdPSLYs9iuIjtlWyLvsJ8iXT0i2LPZhSI7ZVsi77CgIl09Iti12K0iO2VbIu+woSJdPSLYtdmFIjtlWyLvsKIiXT0i2LbYrCI7ZVsi77CjIl09Iti22K0iO2VbIu+wpCJdPSLYttiuIjtlWyLvsKUiXT0i2LbZhSI7ZVsi77CmIl09Iti32K0iO2VbIu+wpyJdPSLYt9mFIjtlWyLvsKgiXT0i2LjZhSI7ZVsi77CpIl09Iti52KwiO2VbIu+wqiJdPSLYudmFIjtlWyLvsKsiXT0i2LrYrCI7ZVsi77CsIl09Iti62YUiO2VbIu+wrSJdPSLZgdisIjtlWyLvsK4iXT0i2YHYrSI7ZVsi77CvIl09ItmB2K4iO2VbIu+wsCJdPSLZgdmFIjtlWyLvsLEiXT0i2YHZiSI7ZVsi77CyIl09ItmB2YoiO2VbIu+wsyJdPSLZgtitIjtlWyLvsLQiXT0i2YLZhSI7ZVsi77C1Il09ItmC2YkiO2VbIu+wtiJdPSLZgtmKIjtlWyLvsLciXT0i2YPYpyI7ZVsi77C4Il09ItmD2KwiO2VbIu+wuSJdPSLZg9itIjtlWyLvsLoiXT0i2YPYriI7ZVsi77C7Il09ItmD2YQiO2VbIu+wvCJdPSLZg9mFIjtlWyLvsL0iXT0i2YPZiSI7ZVsi77C+Il09ItmD2YoiO2VbIu+wvyJdPSLZhNisIjtlWyLvsYAiXT0i2YTYrSI7ZVsi77GBIl09ItmE2K4iO2VbIu+xgiJdPSLZhNmFIjtlWyLvsYMiXT0i2YTZiSI7ZVsi77GEIl09ItmE2YoiO2VbIu+xhSJdPSLZhdisIjtlWyLvsYYiXT0i2YXYrSI7ZVsi77GHIl09ItmF2K4iO2VbIu+xiCJdPSLZhdmFIjtlWyLvsYkiXT0i2YXZiSI7ZVsi77GKIl09ItmF2YoiO2VbIu+xiyJdPSLZhtisIjtlWyLvsYwiXT0i2YbYrSI7ZVsi77GNIl09ItmG2K4iO2VbIu+xjiJdPSLZhtmFIjtlWyLvsY8iXT0i2YbZiSI7ZVsi77GQIl09ItmG2YoiO2VbIu+xkSJdPSLZh9isIjtlWyLvsZIiXT0i2YfZhSI7ZVsi77GTIl09ItmH2YkiO2VbIu+xlCJdPSLZh9mKIjtlWyLvsZUiXT0i2YrYrCI7ZVsi77GWIl09ItmK2K0iO2VbIu+xlyJdPSLZitiuIjtlWyLvsZgiXT0i2YrZhSI7ZVsi77GZIl09ItmK2YkiO2VbIu+xmiJdPSLZitmKIjtlWyLvsZsiXT0i2LDZsCI7ZVsi77GcIl09Itix2bAiO2VbIu+xnSJdPSLZidmwIjtlWyLvsZ4iXT0iINmM2ZEiO2VbIu+xnyJdPSIg2Y3ZkSI7ZVsi77GgIl09IiDZjtmRIjtlWyLvsaEiXT0iINmP2ZEiO2VbIu+xoiJdPSIg2ZDZkSI7ZVsi77GjIl09IiDZkdmwIjtlWyLvsaQiXT0i2KbYsSI7ZVsi77GlIl09Itim2LIiO2VbIu+xpiJdPSLYptmFIjtlWyLvsaciXT0i2KbZhiI7ZVsi77GoIl09Itim2YkiO2VbIu+xqSJdPSLYptmKIjtlWyLvsaoiXT0i2KjYsSI7ZVsi77GrIl09Itio2LIiO2VbIu+xrCJdPSLYqNmFIjtlWyLvsa0iXT0i2KjZhiI7ZVsi77GuIl09Itio2YkiO2VbIu+xryJdPSLYqNmKIjtlWyLvsbAiXT0i2KrYsSI7ZVsi77GxIl09Itiq2LIiO2VbIu+xsiJdPSLYqtmFIjtlWyLvsbMiXT0i2KrZhiI7ZVsi77G0Il09Itiq2YkiO2VbIu+xtSJdPSLYqtmKIjtlWyLvsbYiXT0i2KvYsSI7ZVsi77G3Il09Itir2LIiO2VbIu+xuCJdPSLYq9mFIjtlWyLvsbkiXT0i2KvZhiI7ZVsi77G6Il09Itir2YkiO2VbIu+xuyJdPSLYq9mKIjtlWyLvsbwiXT0i2YHZiSI7ZVsi77G9Il09ItmB2YoiO2VbIu+xviJdPSLZgtmJIjtlWyLvsb8iXT0i2YLZiiI7ZVsi77KAIl09ItmD2KciO2VbIu+ygSJdPSLZg9mEIjtlWyLvsoIiXT0i2YPZhSI7ZVsi77KDIl09ItmD2YkiO2VbIu+yhCJdPSLZg9mKIjtlWyLvsoUiXT0i2YTZhSI7ZVsi77KGIl09ItmE2YkiO2VbIu+yhyJdPSLZhNmKIjtlWyLvsogiXT0i2YXYpyI7ZVsi77KJIl09ItmF2YUiO2VbIu+yiiJdPSLZhtixIjtlWyLvsosiXT0i2YbYsiI7ZVsi77KMIl09ItmG2YUiO2VbIu+yjSJdPSLZhtmGIjtlWyLvso4iXT0i2YbZiSI7ZVsi77KPIl09ItmG2YoiO2VbIu+ykCJdPSLZidmwIjtlWyLvspEiXT0i2YrYsSI7ZVsi77KSIl09ItmK2LIiO2VbIu+ykyJdPSLZitmFIjtlWyLvspQiXT0i2YrZhiI7ZVsi77KVIl09ItmK2YkiO2VbIu+yliJdPSLZitmKIjtlWyLvspciXT0i2KbYrCI7ZVsi77KYIl09Itim2K0iO2VbIu+ymSJdPSLYptiuIjtlWyLvspoiXT0i2KbZhSI7ZVsi77KbIl09Itim2YciO2VbIu+ynCJdPSLYqNisIjtlWyLvsp0iXT0i2KjYrSI7ZVsi77KeIl09Itio2K4iO2VbIu+ynyJdPSLYqNmFIjtlWyLvsqAiXT0i2KjZhyI7ZVsi77KhIl09Itiq2KwiO2VbIu+yoiJdPSLYqtitIjtlWyLvsqMiXT0i2KrYriI7ZVsi77KkIl09Itiq2YUiO2VbIu+ypSJdPSLYqtmHIjtlWyLvsqYiXT0i2KvZhSI7ZVsi77KnIl09Itis2K0iO2VbIu+yqCJdPSLYrNmFIjtlWyLvsqkiXT0i2K3YrCI7ZVsi77KqIl09Itit2YUiO2VbIu+yqyJdPSLYrtisIjtlWyLvsqwiXT0i2K7ZhSI7ZVsi77KtIl09Itiz2KwiO2VbIu+yriJdPSLYs9itIjtlWyLvsq8iXT0i2LPYriI7ZVsi77KwIl09Itiz2YUiO2VbIu+ysSJdPSLYtditIjtlWyLvsrIiXT0i2LXYriI7ZVsi77KzIl09Iti12YUiO2VbIu+ytCJdPSLYttisIjtlWyLvsrUiXT0i2LbYrSI7ZVsi77K2Il09Iti22K4iO2VbIu+ytyJdPSLYttmFIjtlWyLvsrgiXT0i2LfYrSI7ZVsi77K5Il09Iti42YUiO2VbIu+yuiJdPSLYudisIjtlWyLvsrsiXT0i2LnZhSI7ZVsi77K8Il09Iti62KwiO2VbIu+yvSJdPSLYutmFIjtlWyLvsr4iXT0i2YHYrCI7ZVsi77K/Il09ItmB2K0iO2VbIu+zgCJdPSLZgdiuIjtlWyLvs4EiXT0i2YHZhSI7ZVsi77OCIl09ItmC2K0iO2VbIu+zgyJdPSLZgtmFIjtlWyLvs4QiXT0i2YPYrCI7ZVsi77OFIl09ItmD2K0iO2VbIu+zhiJdPSLZg9iuIjtlWyLvs4ciXT0i2YPZhCI7ZVsi77OIIl09ItmD2YUiO2VbIu+ziSJdPSLZhNisIjtlWyLvs4oiXT0i2YTYrSI7ZVsi77OLIl09ItmE2K4iO2VbIu+zjCJdPSLZhNmFIjtlWyLvs40iXT0i2YTZhyI7ZVsi77OOIl09ItmF2KwiO2VbIu+zjyJdPSLZhditIjtlWyLvs5AiXT0i2YXYriI7ZVsi77ORIl09ItmF2YUiO2VbIu+zkiJdPSLZhtisIjtlWyLvs5MiXT0i2YbYrSI7ZVsi77OUIl09ItmG2K4iO2VbIu+zlSJdPSLZhtmFIjtlWyLvs5YiXT0i2YbZhyI7ZVsi77OXIl09ItmH2KwiO2VbIu+zmCJdPSLZh9mFIjtlWyLvs5kiXT0i2YfZsCI7ZVsi77OaIl09ItmK2KwiO2VbIu+zmyJdPSLZititIjtlWyLvs5wiXT0i2YrYriI7ZVsi77OdIl09ItmK2YUiO2VbIu+zniJdPSLZitmHIjtlWyLvs58iXT0i2KbZhSI7ZVsi77OgIl09Itim2YciO2VbIu+zoSJdPSLYqNmFIjtlWyLvs6IiXT0i2KjZhyI7ZVsi77OjIl09Itiq2YUiO2VbIu+zpCJdPSLYqtmHIjtlWyLvs6UiXT0i2KvZhSI7ZVsi77OmIl09Itir2YciO2VbIu+zpyJdPSLYs9mFIjtlWyLvs6giXT0i2LPZhyI7ZVsi77OpIl09Iti02YUiO2VbIu+zqiJdPSLYtNmHIjtlWyLvs6siXT0i2YPZhCI7ZVsi77OsIl09ItmD2YUiO2VbIu+zrSJdPSLZhNmFIjtlWyLvs64iXT0i2YbZhSI7ZVsi77OvIl09ItmG2YciO2VbIu+zsCJdPSLZitmFIjtlWyLvs7EiXT0i2YrZhyI7ZVsi77OyIl09ItmA2Y7ZkSI7ZVsi77OzIl09ItmA2Y/ZkSI7ZVsi77O0Il09ItmA2ZDZkSI7ZVsi77O1Il09Iti32YkiO2VbIu+ztiJdPSLYt9mKIjtlWyLvs7ciXT0i2LnZiSI7ZVsi77O4Il09Iti52YoiO2VbIu+zuSJdPSLYutmJIjtlWyLvs7oiXT0i2LrZiiI7ZVsi77O7Il09Itiz2YkiO2VbIu+zvCJdPSLYs9mKIjtlWyLvs70iXT0i2LTZiSI7ZVsi77O+Il09Iti02YoiO2VbIu+zvyJdPSLYrdmJIjtlWyLvtIAiXT0i2K3ZiiI7ZVsi77SBIl09Itis2YkiO2VbIu+0giJdPSLYrNmKIjtlWyLvtIMiXT0i2K7ZiSI7ZVsi77SEIl09Itiu2YoiO2VbIu+0hSJdPSLYtdmJIjtlWyLvtIYiXT0i2LXZiiI7ZVsi77SHIl09Iti22YkiO2VbIu+0iCJdPSLYttmKIjtlWyLvtIkiXT0i2LTYrCI7ZVsi77SKIl09Iti02K0iO2VbIu+0iyJdPSLYtNiuIjtlWyLvtIwiXT0i2LTZhSI7ZVsi77SNIl09Iti02LEiO2VbIu+0jiJdPSLYs9ixIjtlWyLvtI8iXT0i2LXYsSI7ZVsi77SQIl09Iti22LEiO2VbIu+0kSJdPSLYt9mJIjtlWyLvtJIiXT0i2LfZiiI7ZVsi77STIl09Iti52YkiO2VbIu+0lCJdPSLYudmKIjtlWyLvtJUiXT0i2LrZiSI7ZVsi77SWIl09Iti62YoiO2VbIu+0lyJdPSLYs9mJIjtlWyLvtJgiXT0i2LPZiiI7ZVsi77SZIl09Iti02YkiO2VbIu+0miJdPSLYtNmKIjtlWyLvtJsiXT0i2K3ZiSI7ZVsi77ScIl09Itit2YoiO2VbIu+0nSJdPSLYrNmJIjtlWyLvtJ4iXT0i2KzZiiI7ZVsi77SfIl09Itiu2YkiO2VbIu+0oCJdPSLYrtmKIjtlWyLvtKEiXT0i2LXZiSI7ZVsi77SiIl09Iti12YoiO2VbIu+0oyJdPSLYttmJIjtlWyLvtKQiXT0i2LbZiiI7ZVsi77SlIl09Iti02KwiO2VbIu+0piJdPSLYtNitIjtlWyLvtKciXT0i2LTYriI7ZVsi77SoIl09Iti02YUiO2VbIu+0qSJdPSLYtNixIjtlWyLvtKoiXT0i2LPYsSI7ZVsi77SrIl09Iti12LEiO2VbIu+0rCJdPSLYttixIjtlWyLvtK0iXT0i2LTYrCI7ZVsi77SuIl09Iti02K0iO2VbIu+0ryJdPSLYtNiuIjtlWyLvtLAiXT0i2LTZhSI7ZVsi77SxIl09Itiz2YciO2VbIu+0siJdPSLYtNmHIjtlWyLvtLMiXT0i2LfZhSI7ZVsi77S0Il09Itiz2KwiO2VbIu+0tSJdPSLYs9itIjtlWyLvtLYiXT0i2LPYriI7ZVsi77S3Il09Iti02KwiO2VbIu+0uCJdPSLYtNitIjtlWyLvtLkiXT0i2LTYriI7ZVsi77S6Il09Iti32YUiO2VbIu+0uyJdPSLYuNmFIjtlWyLvtLwiXT0i2KfZiyI7ZVsi77S9Il09Itin2YsiO2VbIu+1kCJdPSLYqtis2YUiO2VbIu+1kSJdPSLYqtit2KwiO2VbIu+1kiJdPSLYqtit2KwiO2VbIu+1kyJdPSLYqtit2YUiO2VbIu+1lCJdPSLYqtiu2YUiO2VbIu+1lSJdPSLYqtmF2KwiO2VbIu+1liJdPSLYqtmF2K0iO2VbIu+1lyJdPSLYqtmF2K4iO2VbIu+1mCJdPSLYrNmF2K0iO2VbIu+1mSJdPSLYrNmF2K0iO2VbIu+1miJdPSLYrdmF2YoiO2VbIu+1myJdPSLYrdmF2YkiO2VbIu+1nCJdPSLYs9it2KwiO2VbIu+1nSJdPSLYs9is2K0iO2VbIu+1niJdPSLYs9is2YkiO2VbIu+1nyJdPSLYs9mF2K0iO2VbIu+1oCJdPSLYs9mF2K0iO2VbIu+1oSJdPSLYs9mF2KwiO2VbIu+1oiJdPSLYs9mF2YUiO2VbIu+1oyJdPSLYs9mF2YUiO2VbIu+1pCJdPSLYtdit2K0iO2VbIu+1pSJdPSLYtdit2K0iO2VbIu+1piJdPSLYtdmF2YUiO2VbIu+1pyJdPSLYtNit2YUiO2VbIu+1qCJdPSLYtNit2YUiO2VbIu+1qSJdPSLYtNis2YoiO2VbIu+1qiJdPSLYtNmF2K4iO2VbIu+1qyJdPSLYtNmF2K4iO2VbIu+1rCJdPSLYtNmF2YUiO2VbIu+1rSJdPSLYtNmF2YUiO2VbIu+1riJdPSLYttit2YkiO2VbIu+1ryJdPSLYttiu2YUiO2VbIu+1sCJdPSLYttiu2YUiO2VbIu+1sSJdPSLYt9mF2K0iO2VbIu+1siJdPSLYt9mF2K0iO2VbIu+1syJdPSLYt9mF2YUiO2VbIu+1tCJdPSLYt9mF2YoiO2VbIu+1tSJdPSLYudis2YUiO2VbIu+1tiJdPSLYudmF2YUiO2VbIu+1tyJdPSLYudmF2YUiO2VbIu+1uCJdPSLYudmF2YkiO2VbIu+1uSJdPSLYutmF2YUiO2VbIu+1uiJdPSLYutmF2YoiO2VbIu+1uyJdPSLYutmF2YkiO2VbIu+1vCJdPSLZgdiu2YUiO2VbIu+1vSJdPSLZgdiu2YUiO2VbIu+1viJdPSLZgtmF2K0iO2VbIu+1vyJdPSLZgtmF2YUiO2VbIu+2gCJdPSLZhNit2YUiO2VbIu+2gSJdPSLZhNit2YoiO2VbIu+2giJdPSLZhNit2YkiO2VbIu+2gyJdPSLZhNis2KwiO2VbIu+2hCJdPSLZhNis2KwiO2VbIu+2hSJdPSLZhNiu2YUiO2VbIu+2hiJdPSLZhNiu2YUiO2VbIu+2hyJdPSLZhNmF2K0iO2VbIu+2iCJdPSLZhNmF2K0iO2VbIu+2iSJdPSLZhdit2KwiO2VbIu+2iiJdPSLZhdit2YUiO2VbIu+2iyJdPSLZhdit2YoiO2VbIu+2jCJdPSLZhdis2K0iO2VbIu+2jSJdPSLZhdis2YUiO2VbIu+2jiJdPSLZhdiu2KwiO2VbIu+2jyJdPSLZhdiu2YUiO2VbIu+2kiJdPSLZhdis2K4iO2VbIu+2kyJdPSLZh9mF2KwiO2VbIu+2lCJdPSLZh9mF2YUiO2VbIu+2lSJdPSLZhtit2YUiO2VbIu+2liJdPSLZhtit2YkiO2VbIu+2lyJdPSLZhtis2YUiO2VbIu+2mCJdPSLZhtis2YUiO2VbIu+2mSJdPSLZhtis2YkiO2VbIu+2miJdPSLZhtmF2YoiO2VbIu+2myJdPSLZhtmF2YkiO2VbIu+2nCJdPSLZitmF2YUiO2VbIu+2nSJdPSLZitmF2YUiO2VbIu+2niJdPSLYqNiu2YoiO2VbIu+2nyJdPSLYqtis2YoiO2VbIu+2oCJdPSLYqtis2YkiO2VbIu+2oSJdPSLYqtiu2YoiO2VbIu+2oiJdPSLYqtiu2YkiO2VbIu+2oyJdPSLYqtmF2YoiO2VbIu+2pCJdPSLYqtmF2YkiO2VbIu+2pSJdPSLYrNmF2YoiO2VbIu+2piJdPSLYrNit2YkiO2VbIu+2pyJdPSLYrNmF2YkiO2VbIu+2qCJdPSLYs9iu2YkiO2VbIu+2qSJdPSLYtdit2YoiO2VbIu+2qiJdPSLYtNit2YoiO2VbIu+2qyJdPSLYttit2YoiO2VbIu+2rCJdPSLZhNis2YoiO2VbIu+2rSJdPSLZhNmF2YoiO2VbIu+2riJdPSLZitit2YoiO2VbIu+2ryJdPSLZitis2YoiO2VbIu+2sCJdPSLZitmF2YoiO2VbIu+2sSJdPSLZhdmF2YoiO2VbIu+2siJdPSLZgtmF2YoiO2VbIu+2syJdPSLZhtit2YoiO2VbIu+2tCJdPSLZgtmF2K0iO2VbIu+2tSJdPSLZhNit2YUiO2VbIu+2tiJdPSLYudmF2YoiO2VbIu+2tyJdPSLZg9mF2YoiO2VbIu+2uCJdPSLZhtis2K0iO2VbIu+2uSJdPSLZhdiu2YoiO2VbIu+2uiJdPSLZhNis2YUiO2VbIu+2uyJdPSLZg9mF2YUiO2VbIu+2vCJdPSLZhNis2YUiO2VbIu+2vSJdPSLZhtis2K0iO2VbIu+2viJdPSLYrNit2YoiO2VbIu+2vyJdPSLYrdis2YoiO2VbIu+3gCJdPSLZhdis2YoiO2VbIu+3gSJdPSLZgdmF2YoiO2VbIu+3giJdPSLYqNit2YoiO2VbIu+3gyJdPSLZg9mF2YUiO2VbIu+3hCJdPSLYudis2YUiO2VbIu+3hSJdPSLYtdmF2YUiO2VbIu+3hiJdPSLYs9iu2YoiO2VbIu+3hyJdPSLZhtis2YoiO2VbIu+5iSJdPSLigL4iO2VbIu+5iiJdPSLigL4iO2VbIu+5iyJdPSLigL4iO2VbIu+5jCJdPSLigL4iO2VbIu+5jSJdPSJfIjtlWyLvuY4iXT0iXyI7ZVsi77mPIl09Il8iO2VbIu+6gCJdPSLYoSI7ZVsi77qBIl09ItiiIjtlWyLvuoIiXT0i2KIiO2VbIu+6gyJdPSLYoyI7ZVsi77qEIl09ItijIjtlWyLvuoUiXT0i2KQiO2VbIu+6hiJdPSLYpCI7ZVsi77qHIl09ItilIjtlWyLvuogiXT0i2KUiO2VbIu+6iSJdPSLYpiI7ZVsi77qKIl09ItimIjtlWyLvuosiXT0i2KYiO2VbIu+6jCJdPSLYpiI7ZVsi77qNIl09ItinIjtlWyLvuo4iXT0i2KciO2VbIu+6jyJdPSLYqCI7ZVsi77qQIl09ItioIjtlWyLvupEiXT0i2KgiO2VbIu+6kiJdPSLYqCI7ZVsi77qTIl09ItipIjtlWyLvupQiXT0i2KkiO2VbIu+6lSJdPSLYqiI7ZVsi77qWIl09ItiqIjtlWyLvupciXT0i2KoiO2VbIu+6mCJdPSLYqiI7ZVsi77qZIl09ItirIjtlWyLvupoiXT0i2KsiO2VbIu+6myJdPSLYqyI7ZVsi77qcIl09ItirIjtlWyLvup0iXT0i2KwiO2VbIu+6niJdPSLYrCI7ZVsi77qfIl09ItisIjtlWyLvuqAiXT0i2KwiO2VbIu+6oSJdPSLYrSI7ZVsi77qiIl09ItitIjtlWyLvuqMiXT0i2K0iO2VbIu+6pCJdPSLYrSI7ZVsi77qlIl09ItiuIjtlWyLvuqYiXT0i2K4iO2VbIu+6pyJdPSLYriI7ZVsi77qoIl09ItiuIjtlWyLvuqkiXT0i2K8iO2VbIu+6qiJdPSLYryI7ZVsi77qrIl09ItiwIjtlWyLvuqwiXT0i2LAiO2VbIu+6rSJdPSLYsSI7ZVsi77quIl09ItixIjtlWyLvuq8iXT0i2LIiO2VbIu+6sCJdPSLYsiI7ZVsi77qxIl09ItizIjtlWyLvurIiXT0i2LMiO2VbIu+6syJdPSLYsyI7ZVsi77q0Il09ItizIjtlWyLvurUiXT0i2LQiO2VbIu+6tiJdPSLYtCI7ZVsi77q3Il09Iti0IjtlWyLvurgiXT0i2LQiO2VbIu+6uSJdPSLYtSI7ZVsi77q6Il09Iti1IjtlWyLvursiXT0i2LUiO2VbIu+6vCJdPSLYtSI7ZVsi77q9Il09Iti2IjtlWyLvur4iXT0i2LYiO2VbIu+6vyJdPSLYtiI7ZVsi77uAIl09Iti2IjtlWyLvu4EiXT0i2LciO2VbIu+7giJdPSLYtyI7ZVsi77uDIl09Iti3IjtlWyLvu4QiXT0i2LciO2VbIu+7hSJdPSLYuCI7ZVsi77uGIl09Iti4IjtlWyLvu4ciXT0i2LgiO2VbIu+7iCJdPSLYuCI7ZVsi77uJIl09Iti5IjtlWyLvu4oiXT0i2LkiO2VbIu+7iyJdPSLYuSI7ZVsi77uMIl09Iti5IjtlWyLvu40iXT0i2LoiO2VbIu+7jiJdPSLYuiI7ZVsi77uPIl09Iti6IjtlWyLvu5AiXT0i2LoiO2VbIu+7kSJdPSLZgSI7ZVsi77uSIl09ItmBIjtlWyLvu5MiXT0i2YEiO2VbIu+7lCJdPSLZgSI7ZVsi77uVIl09ItmCIjtlWyLvu5YiXT0i2YIiO2VbIu+7lyJdPSLZgiI7ZVsi77uYIl09ItmCIjtlWyLvu5kiXT0i2YMiO2VbIu+7miJdPSLZgyI7ZVsi77ubIl09ItmDIjtlWyLvu5wiXT0i2YMiO2VbIu+7nSJdPSLZhCI7ZVsi77ueIl09ItmEIjtlWyLvu58iXT0i2YQiO2VbIu+7oCJdPSLZhCI7ZVsi77uhIl09ItmFIjtlWyLvu6IiXT0i2YUiO2VbIu+7oyJdPSLZhSI7ZVsi77ukIl09ItmFIjtlWyLvu6UiXT0i2YYiO2VbIu+7piJdPSLZhiI7ZVsi77unIl09ItmGIjtlWyLvu6giXT0i2YYiO2VbIu+7qSJdPSLZhyI7ZVsi77uqIl09ItmHIjtlWyLvu6siXT0i2YciO2VbIu+7rCJdPSLZhyI7ZVsi77utIl09ItmIIjtlWyLvu64iXT0i2YgiO2VbIu+7ryJdPSLZiSI7ZVsi77uwIl09ItmJIjtlWyLvu7EiXT0i2YoiO2VbIu+7siJdPSLZiiI7ZVsi77uzIl09ItmKIjtlWyLvu7QiXT0i2YoiO2VbIu+7tSJdPSLZhNiiIjtlWyLvu7YiXT0i2YTYoiI7ZVsi77u3Il09ItmE2KMiO2VbIu+7uCJdPSLZhNijIjtlWyLvu7kiXT0i2YTYpSI7ZVsi77u6Il09ItmE2KUiO2VbIu+7uyJdPSLZhNinIjtlWyLvu7wiXT0i2YTYpyJ9KSk7dC5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcz1mdW5jdGlvbiBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhlKXtyZXR1cm4gZT49NjU1MjAmJmU8PTY1NTM1PzA6ZT49NjI5NzYmJmU8PTYzNzQzP2koKVtlXXx8ZToxNzM9PT1lPzQ1OmV9O3QucmV2ZXJzZUlmUnRsPWZ1bmN0aW9uIHJldmVyc2VJZlJ0bChlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD0xfHwhZnVuY3Rpb24gaXNSVExSYW5nZUZvcihlKXt2YXIgdD1uWzEzXTtyZXR1cm4gZT49dC5iZWdpbiYmZTx0LmVuZHx8ZT49KHQ9blsxMV0pLmJlZ2luJiZlPHQuZW5kfShlLmNoYXJDb2RlQXQoMCkpKXJldHVybiBlO2Zvcih2YXIgcj0iIixhPXQtMTthPj0wO2EtLSlyKz1lW2FdO3JldHVybiByfTt0LmdldFVuaWNvZGVSYW5nZUZvcj1mdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IoZSl7Zm9yKHZhciB0PTAscj1uLmxlbmd0aDt0PHI7dCsrKXt2YXIgYT1uW3RdO2lmKGU+PWEuYmVnaW4mJmU8YS5lbmQpcmV0dXJuIHR9cmV0dXJuLTF9O3QuZ2V0Tm9ybWFsaXplZFVuaWNvZGVzPXM7dC5nZXRVbmljb2RlRm9yR2x5cGg9ZnVuY3Rpb24gZ2V0VW5pY29kZUZvckdseXBoKGUsdCl7dmFyIHI9dFtlXTtpZih2b2lkIDAhPT1yKXJldHVybiByO2lmKCFlKXJldHVybi0xO2lmKCJ1Ij09PWVbMF0pe3ZhciBhLGk9ZS5sZW5ndGg7aWYoNz09PWkmJiJuIj09PWVbMV0mJiJpIj09PWVbMl0pYT1lLnN1YnN0cmluZygzKTtlbHNle2lmKCEoaT49NSYmaTw9NykpcmV0dXJuLTE7YT1lLnN1YnN0cmluZygxKX1pZihhPT09YS50b1VwcGVyQ2FzZSgpJiYocj1wYXJzZUludChhLDE2KSk+PTApcmV0dXJuIHJ9cmV0dXJuLTF9fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkZvbnRSZW5kZXJlckZhY3Rvcnk9dm9pZCAwO3ZhciBhPXIoMiksaT1yKDMxKSxuPXIoMzQpLHM9cigzMyksbz1yKDEyKSxjPWZ1bmN0aW9uIEZvbnRSZW5kZXJlckZhY3RvcnlDbG9zdXJlKCl7ZnVuY3Rpb24gZ2V0TG9uZyhlLHQpe3JldHVybiBlW3RdPDwyNHxlW3QrMV08PDE2fGVbdCsyXTw8OHxlW3QrM119ZnVuY3Rpb24gZ2V0VXNob3J0KGUsdCl7cmV0dXJuIGVbdF08PDh8ZVt0KzFdfWZ1bmN0aW9uIGdldFN1YnJvdXRpbmVCaWFzKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IHI9MzI3Njg7dDwxMjQwP3I9MTA3OnQ8MzM5MDAmJihyPTExMzEpO3JldHVybiByfWZ1bmN0aW9uIHBhcnNlQ21hcChlLHQscil7dmFyIGksbixzLG89MT09PWdldFVzaG9ydChlLHQrMik/Z2V0TG9uZyhlLHQrOCk6Z2V0TG9uZyhlLHQrMTYpLGM9Z2V0VXNob3J0KGUsdCtvKTtpZig0PT09Yyl7Z2V0VXNob3J0KGUsdCtvKzIpO3ZhciBsPWdldFVzaG9ydChlLHQrbys2KT4+MTtuPXQrbysxNDtpPVtdO2ZvcihzPTA7czxsO3MrKyxuKz0yKWlbc109e2VuZDpnZXRVc2hvcnQoZSxuKX07bis9Mjtmb3Iocz0wO3M8bDtzKyssbis9MilpW3NdLnN0YXJ0PWdldFVzaG9ydChlLG4pO2ZvcihzPTA7czxsO3MrKyxuKz0yKWlbc10uaWREZWx0YT1nZXRVc2hvcnQoZSxuKTtmb3Iocz0wO3M8bDtzKyssbis9Mil7dmFyIGg9Z2V0VXNob3J0KGUsbik7aWYoMCE9PWgpe2lbc10uaWRzPVtdO2Zvcih2YXIgdT0wLGQ9aVtzXS5lbmQtaVtzXS5zdGFydCsxO3U8ZDt1Kyspe2lbc10uaWRzW3VdPWdldFVzaG9ydChlLG4raCk7aCs9Mn19fXJldHVybiBpfWlmKDEyPT09Yyl7Z2V0TG9uZyhlLHQrbys0KTt2YXIgZj1nZXRMb25nKGUsdCtvKzEyKTtuPXQrbysxNjtpPVtdO2ZvcihzPTA7czxmO3MrKyl7aS5wdXNoKHtzdGFydDpnZXRMb25nKGUsbiksZW5kOmdldExvbmcoZSxuKzQpLGlkRGVsdGE6Z2V0TG9uZyhlLG4rOCktZ2V0TG9uZyhlLG4pfSk7bis9MTJ9cmV0dXJuIGl9dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoInVuc3VwcG9ydGVkIGNtYXA6ICIrYyl9ZnVuY3Rpb24gcGFyc2VDZmYoZSx0LHIsYSl7dmFyIG49bmV3IGkuQ0ZGUGFyc2VyKG5ldyBvLlN0cmVhbShlLHQsci10KSx7fSxhKS5wYXJzZSgpO3JldHVybntnbHlwaHM6bi5jaGFyU3RyaW5ncy5vYmplY3RzLHN1YnJzOm4udG9wRGljdC5wcml2YXRlRGljdCYmbi50b3BEaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgmJm4udG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHMsZ3N1YnJzOm4uZ2xvYmFsU3VickluZGV4JiZuLmdsb2JhbFN1YnJJbmRleC5vYmplY3RzLGlzQ0ZGQ0lERm9udDpuLmlzQ0lERm9udCxmZFNlbGVjdDpuLmZkU2VsZWN0LGZkQXJyYXk6bi5mZEFycmF5fX1mdW5jdGlvbiBsb29rdXBDbWFwKGUsdCl7Zm9yKHZhciByPXQuY29kZVBvaW50QXQoMCksYT0wLGk9MCxuPWUubGVuZ3RoLTE7aTxuOyl7dmFyIHM9aStuKzE+PjE7cjxlW3NdLnN0YXJ0P249cy0xOmk9c31lW2ldLnN0YXJ0PD1yJiZyPD1lW2ldLmVuZCYmKGE9ZVtpXS5pZERlbHRhKyhlW2ldLmlkcz9lW2ldLmlkc1tyLWVbaV0uc3RhcnRdOnIpJjY1NTM1KTtyZXR1cm57Y2hhckNvZGU6cixnbHlwaElkOmF9fWNvbnN0IGU9W107Y2xhc3MgQ29tcGlsZWRGb250e2NvbnN0cnVjdG9yKGUpe3RoaXMuY29uc3RydWN0b3I9PT1Db21waWxlZEZvbnQmJigwLGEudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBDb21waWxlZEZvbnQuIik7dGhpcy5mb250TWF0cml4PWU7dGhpcy5jb21waWxlZEdseXBocz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZD1PYmplY3QuY3JlYXRlKG51bGwpfWdldFBhdGhKcyhlKXtjb25zdCB0PWxvb2t1cENtYXAodGhpcy5jbWFwLGUpO2xldCByPXRoaXMuY29tcGlsZWRHbHlwaHNbdC5nbHlwaElkXTtpZighcil7cj10aGlzLmNvbXBpbGVHbHlwaCh0aGlzLmdseXBoc1t0LmdseXBoSWRdLHQuZ2x5cGhJZCk7dGhpcy5jb21waWxlZEdseXBoc1t0LmdseXBoSWRdPXJ9dm9pZCAwPT09dGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW3QuY2hhckNvZGVdJiYodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW3QuY2hhckNvZGVdPXQuZ2x5cGhJZCk7cmV0dXJuIHJ9Y29tcGlsZUdseXBoKHQscil7aWYoIXR8fDA9PT10Lmxlbmd0aHx8MTQ9PT10WzBdKXJldHVybiBlO2xldCBpPXRoaXMuZm9udE1hdHJpeDtpZih0aGlzLmlzQ0ZGQ0lERm9udCl7Y29uc3QgZT10aGlzLmZkU2VsZWN0LmdldEZESW5kZXgocik7aWYoZT49MCYmZTx0aGlzLmZkQXJyYXkubGVuZ3RoKXtpPXRoaXMuZmRBcnJheVtlXS5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKXx8YS5GT05UX0lERU5USVRZX01BVFJJWH1lbHNlKDAsYS53YXJuKSgiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIil9Y29uc3Qgbj1bXTtuLnB1c2goe2NtZDoic2F2ZSJ9KTtuLnB1c2goe2NtZDoidHJhbnNmb3JtIixhcmdzOmkuc2xpY2UoKX0pO24ucHVzaCh7Y21kOiJzY2FsZSIsYXJnczpbInNpemUiLCItc2l6ZSJdfSk7dGhpcy5jb21waWxlR2x5cGhJbXBsKHQsbixyKTtuLnB1c2goe2NtZDoicmVzdG9yZSJ9KTtyZXR1cm4gbn1jb21waWxlR2x5cGhJbXBsKCl7KDAsYS51bnJlYWNoYWJsZSkoIkNoaWxkcmVuIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzLiIpfWhhc0J1aWx0UGF0aChlKXtjb25zdCB0PWxvb2t1cENtYXAodGhpcy5jbWFwLGUpO3JldHVybiB2b2lkIDAhPT10aGlzLmNvbXBpbGVkR2x5cGhzW3QuZ2x5cGhJZF0mJnZvaWQgMCE9PXRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFt0LmNoYXJDb2RlXX19Y2xhc3MgVHJ1ZVR5cGVDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udHtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIocnx8WzQ4OGUtNiwwLDAsNDg4ZS02LDAsMF0pO3RoaXMuZ2x5cGhzPWU7dGhpcy5jbWFwPXR9Y29tcGlsZUdseXBoSW1wbChlLHQpeyFmdW5jdGlvbiBjb21waWxlR2x5ZihlLHQscil7ZnVuY3Rpb24gbW92ZVRvKGUscil7dC5wdXNoKHtjbWQ6Im1vdmVUbyIsYXJnczpbZSxyXX0pfWZ1bmN0aW9uIGxpbmVUbyhlLHIpe3QucHVzaCh7Y21kOiJsaW5lVG8iLGFyZ3M6W2Uscl19KX1mdW5jdGlvbiBxdWFkcmF0aWNDdXJ2ZVRvKGUscixhLGkpe3QucHVzaCh7Y21kOiJxdWFkcmF0aWNDdXJ2ZVRvIixhcmdzOltlLHIsYSxpXX0pfXZhciBhLGk9MCxuPShlW2ldPDwyNHxlW2krMV08PDE2KT4+MTYscz0wLG89MDtpKz0xMDtpZihuPDApZG97YT1lW2ldPDw4fGVbaSsxXTt2YXIgYyxsLGg9ZVtpKzJdPDw4fGVbaSszXTtpKz00O2lmKDEmYSl7Yz0oZVtpXTw8MjR8ZVtpKzFdPDwxNik+PjE2O2w9KGVbaSsyXTw8MjR8ZVtpKzNdPDwxNik+PjE2O2krPTR9ZWxzZXtjPWVbaSsrXTtsPWVbaSsrXX1pZigyJmEpe3M9YztvPWx9ZWxzZXtzPTA7bz0wfXZhciB1PTEsZD0xLGY9MCxnPTA7aWYoOCZhKXt1PWQ9KGVbaV08PDI0fGVbaSsxXTw8MTYpLzEwNzM3NDE4MjQ7aSs9Mn1lbHNlIGlmKDY0JmEpe3U9KGVbaV08PDI0fGVbaSsxXTw8MTYpLzEwNzM3NDE4MjQ7ZD0oZVtpKzJdPDwyNHxlW2krM108PDE2KS8xMDczNzQxODI0O2krPTR9ZWxzZSBpZigxMjgmYSl7dT0oZVtpXTw8MjR8ZVtpKzFdPDwxNikvMTA3Mzc0MTgyNDtmPShlW2krMl08PDI0fGVbaSszXTw8MTYpLzEwNzM3NDE4MjQ7Zz0oZVtpKzRdPDwyNHxlW2krNV08PDE2KS8xMDczNzQxODI0O2Q9KGVbaSs2XTw8MjR8ZVtpKzddPDwxNikvMTA3Mzc0MTgyNDtpKz04fXZhciBtPXIuZ2x5cGhzW2hdO2lmKG0pe3QucHVzaCh7Y21kOiJzYXZlIn0pO3QucHVzaCh7Y21kOiJ0cmFuc2Zvcm0iLGFyZ3M6W3UsZixnLGQscyxvXX0pO2NvbXBpbGVHbHlmKG0sdCxyKTt0LnB1c2goe2NtZDoicmVzdG9yZSJ9KX19d2hpbGUoMzImYSk7ZWxzZXt2YXIgcCxiLHk9W107Zm9yKHA9MDtwPG47cCsrKXt5LnB1c2goZVtpXTw8OHxlW2krMV0pO2krPTJ9aSs9MisoZVtpXTw8OHxlW2krMV0pO2Zvcih2YXIgdj15W3kubGVuZ3RoLTFdKzEsdz1bXTt3Lmxlbmd0aDx2Oyl7dmFyIGs9MTs4JihhPWVbaSsrXSkmJihrKz1lW2krK10pO2Zvcig7ay0tID4wOyl3LnB1c2goe2ZsYWdzOmF9KX1mb3IocD0wO3A8djtwKyspe3N3aXRjaCgxOCZ3W3BdLmZsYWdzKXtjYXNlIDA6cys9KGVbaV08PDI0fGVbaSsxXTw8MTYpPj4xNjtpKz0yO2JyZWFrO2Nhc2UgMjpzLT1lW2krK107YnJlYWs7Y2FzZSAxODpzKz1lW2krK119d1twXS54PXN9Zm9yKHA9MDtwPHY7cCsrKXtzd2l0Y2goMzYmd1twXS5mbGFncyl7Y2FzZSAwOm8rPShlW2ldPDwyNHxlW2krMV08PDE2KT4+MTY7aSs9MjticmVhaztjYXNlIDQ6by09ZVtpKytdO2JyZWFrO2Nhc2UgMzY6bys9ZVtpKytdfXdbcF0ueT1vfXZhciBTPTA7Zm9yKGk9MDtpPG47aSsrKXt2YXIgQz15W2ldLHg9dy5zbGljZShTLEMrMSk7aWYoMSZ4WzBdLmZsYWdzKXgucHVzaCh4WzBdKTtlbHNlIGlmKDEmeFt4Lmxlbmd0aC0xXS5mbGFncyl4LnVuc2hpZnQoeFt4Lmxlbmd0aC0xXSk7ZWxzZXt2YXIgQT17ZmxhZ3M6MSx4Oih4WzBdLngreFt4Lmxlbmd0aC0xXS54KS8yLHk6KHhbMF0ueSt4W3gubGVuZ3RoLTFdLnkpLzJ9O3gudW5zaGlmdChBKTt4LnB1c2goQSl9bW92ZVRvKHhbMF0ueCx4WzBdLnkpO2ZvcihwPTEsYj14Lmxlbmd0aDtwPGI7cCsrKWlmKDEmeFtwXS5mbGFncylsaW5lVG8oeFtwXS54LHhbcF0ueSk7ZWxzZSBpZigxJnhbcCsxXS5mbGFncyl7cXVhZHJhdGljQ3VydmVUbyh4W3BdLngseFtwXS55LHhbcCsxXS54LHhbcCsxXS55KTtwKyt9ZWxzZSBxdWFkcmF0aWNDdXJ2ZVRvKHhbcF0ueCx4W3BdLnksKHhbcF0ueCt4W3ArMV0ueCkvMiwoeFtwXS55K3hbcCsxXS55KS8yKTtTPUMrMX19fShlLHQsdGhpcyl9fWNsYXNzIFR5cGUyQ29tcGlsZWQgZXh0ZW5kcyBDb21waWxlZEZvbnR7Y29uc3RydWN0b3IoZSx0LHIsYSl7c3VwZXIocnx8Wy4wMDEsMCwwLC4wMDEsMCwwXSk7dGhpcy5nbHlwaHM9ZS5nbHlwaHM7dGhpcy5nc3VicnM9ZS5nc3VicnN8fFtdO3RoaXMuc3VicnM9ZS5zdWJyc3x8W107dGhpcy5jbWFwPXQ7dGhpcy5nbHlwaE5hbWVNYXA9YXx8KDAsbi5nZXRHbHlwaHNVbmljb2RlKSgpO3RoaXMuZ3N1YnJzQmlhcz1nZXRTdWJyb3V0aW5lQmlhcyh0aGlzLmdzdWJycyk7dGhpcy5zdWJyc0JpYXM9Z2V0U3Vicm91dGluZUJpYXModGhpcy5zdWJycyk7dGhpcy5pc0NGRkNJREZvbnQ9ZS5pc0NGRkNJREZvbnQ7dGhpcy5mZFNlbGVjdD1lLmZkU2VsZWN0O3RoaXMuZmRBcnJheT1lLmZkQXJyYXl9Y29tcGlsZUdseXBoSW1wbChlLHQscil7IWZ1bmN0aW9uIGNvbXBpbGVDaGFyU3RyaW5nKGUsdCxyLGkpe2Z1bmN0aW9uIG1vdmVUbyhlLHIpe3QucHVzaCh7Y21kOiJtb3ZlVG8iLGFyZ3M6W2Uscl19KX1mdW5jdGlvbiBsaW5lVG8oZSxyKXt0LnB1c2goe2NtZDoibGluZVRvIixhcmdzOltlLHJdfSl9ZnVuY3Rpb24gYmV6aWVyQ3VydmVUbyhlLHIsYSxpLG4scyl7dC5wdXNoKHtjbWQ6ImJlemllckN1cnZlVG8iLGFyZ3M6W2UscixhLGksbixzXX0pfXZhciBuPVtdLG89MCxjPTAsbD0wOyFmdW5jdGlvbiBwYXJzZShlKXtmb3IodmFyIGg9MDtoPGUubGVuZ3RoOyl7dmFyIHUsZCxmLGcsbSxwLGIseSx2PSExLHc9ZVtoKytdO3N3aXRjaCh3KXtjYXNlIDE6Y2FzZSAzOmwrPW4ubGVuZ3RoPj4xO3Y9ITA7YnJlYWs7Y2FzZSA0OmMrPW4ucG9wKCk7bW92ZVRvKG8sYyk7dj0hMDticmVhaztjYXNlIDU6Zm9yKDtuLmxlbmd0aD4wOyl7bys9bi5zaGlmdCgpO2MrPW4uc2hpZnQoKTtsaW5lVG8obyxjKX1icmVhaztjYXNlIDY6Zm9yKDtuLmxlbmd0aD4wOyl7bGluZVRvKG8rPW4uc2hpZnQoKSxjKTtpZigwPT09bi5sZW5ndGgpYnJlYWs7Yys9bi5zaGlmdCgpO2xpbmVUbyhvLGMpfWJyZWFrO2Nhc2UgNzpmb3IoO24ubGVuZ3RoPjA7KXtjKz1uLnNoaWZ0KCk7bGluZVRvKG8sYyk7aWYoMD09PW4ubGVuZ3RoKWJyZWFrO2xpbmVUbyhvKz1uLnNoaWZ0KCksYyl9YnJlYWs7Y2FzZSA4OmZvcig7bi5sZW5ndGg+MDspe3U9bytuLnNoaWZ0KCk7Zj1jK24uc2hpZnQoKTtkPXUrbi5zaGlmdCgpO2c9ZituLnNoaWZ0KCk7bz1kK24uc2hpZnQoKTtjPWcrbi5zaGlmdCgpO2JlemllckN1cnZlVG8odSxmLGQsZyxvLGMpfWJyZWFrO2Nhc2UgMTA6Yj1uLnBvcCgpO3k9bnVsbDtpZihyLmlzQ0ZGQ0lERm9udCl7Y29uc3QgZT1yLmZkU2VsZWN0LmdldEZESW5kZXgoaSk7aWYoZT49MCYmZTxyLmZkQXJyYXkubGVuZ3RoKXtjb25zdCB0PXIuZmRBcnJheVtlXTtsZXQgYTt0LnByaXZhdGVEaWN0JiZ0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgmJihhPXQucHJpdmF0ZURpY3Quc3VicnNJbmRleC5vYmplY3RzKTthJiYoeT1hW2IrPWdldFN1YnJvdXRpbmVCaWFzKGEpXSl9ZWxzZSgwLGEud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpfWVsc2UgeT1yLnN1YnJzW2Irci5zdWJyc0JpYXNdO3kmJnBhcnNlKHkpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuO2Nhc2UgMTI6c3dpdGNoKHc9ZVtoKytdKXtjYXNlIDM0OmQ9KHU9bytuLnNoaWZ0KCkpK24uc2hpZnQoKTttPWMrbi5zaGlmdCgpO289ZCtuLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LGMsZCxtLG8sbSk7ZD0odT1vK24uc2hpZnQoKSkrbi5zaGlmdCgpO289ZCtuLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LG0sZCxjLG8sYyk7YnJlYWs7Y2FzZSAzNTp1PW8rbi5zaGlmdCgpO2Y9YytuLnNoaWZ0KCk7ZD11K24uc2hpZnQoKTtnPWYrbi5zaGlmdCgpO289ZCtuLnNoaWZ0KCk7Yz1nK24uc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKHUsZixkLGcsbyxjKTt1PW8rbi5zaGlmdCgpO2Y9YytuLnNoaWZ0KCk7ZD11K24uc2hpZnQoKTtnPWYrbi5zaGlmdCgpO289ZCtuLnNoaWZ0KCk7Yz1nK24uc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKHUsZixkLGcsbyxjKTtuLnBvcCgpO2JyZWFrO2Nhc2UgMzY6YmV6aWVyQ3VydmVUbyh1PW8rbi5zaGlmdCgpLG09YytuLnNoaWZ0KCksZD11K24uc2hpZnQoKSxwPW0rbi5zaGlmdCgpLG89ZCtuLnNoaWZ0KCkscCk7YmV6aWVyQ3VydmVUbyh1PW8rbi5zaGlmdCgpLHAsZD11K24uc2hpZnQoKSxwK24uc2hpZnQoKSxvPWQrbi5zaGlmdCgpLGMpO2JyZWFrO2Nhc2UgMzc6dmFyIGs9byxTPWM7dT1vK24uc2hpZnQoKTtmPWMrbi5zaGlmdCgpO2Q9dStuLnNoaWZ0KCk7Zz1mK24uc2hpZnQoKTtvPWQrbi5zaGlmdCgpO2M9ZytuLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LGYsZCxnLG8sYyk7dT1vK24uc2hpZnQoKTtmPWMrbi5zaGlmdCgpO2Q9dStuLnNoaWZ0KCk7Zz1mK24uc2hpZnQoKTtvPWQ7Yz1nO01hdGguYWJzKG8tayk+TWF0aC5hYnMoYy1TKT9vKz1uLnNoaWZ0KCk6Yys9bi5zaGlmdCgpO2JlemllckN1cnZlVG8odSxmLGQsZyxvLGMpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoInVua25vd24gb3BlcmF0b3I6IDEyICIrdyl9YnJlYWs7Y2FzZSAxNDppZihuLmxlbmd0aD49NCl7dmFyIEM9bi5wb3AoKSx4PW4ucG9wKCk7Yz1uLnBvcCgpO289bi5wb3AoKTt0LnB1c2goe2NtZDoic2F2ZSJ9KTt0LnB1c2goe2NtZDoidHJhbnNsYXRlIixhcmdzOltvLGNdfSk7dmFyIEE9bG9va3VwQ21hcChyLmNtYXAsU3RyaW5nLmZyb21DaGFyQ29kZShyLmdseXBoTmFtZU1hcFtzLlN0YW5kYXJkRW5jb2RpbmdbQ11dKSk7Y29tcGlsZUNoYXJTdHJpbmcoci5nbHlwaHNbQS5nbHlwaElkXSx0LHIsQS5nbHlwaElkKTt0LnB1c2goe2NtZDoicmVzdG9yZSJ9KTtBPWxvb2t1cENtYXAoci5jbWFwLFN0cmluZy5mcm9tQ2hhckNvZGUoci5nbHlwaE5hbWVNYXBbcy5TdGFuZGFyZEVuY29kaW5nW3hdXSkpO2NvbXBpbGVDaGFyU3RyaW5nKHIuZ2x5cGhzW0EuZ2x5cGhJZF0sdCxyLEEuZ2x5cGhJZCl9cmV0dXJuO2Nhc2UgMTg6bCs9bi5sZW5ndGg+PjE7dj0hMDticmVhaztjYXNlIDE5OmNhc2UgMjA6aCs9KGwrPW4ubGVuZ3RoPj4xKSs3Pj4zO3Y9ITA7YnJlYWs7Y2FzZSAyMTpjKz1uLnBvcCgpO21vdmVUbyhvKz1uLnBvcCgpLGMpO3Y9ITA7YnJlYWs7Y2FzZSAyMjptb3ZlVG8obys9bi5wb3AoKSxjKTt2PSEwO2JyZWFrO2Nhc2UgMjM6bCs9bi5sZW5ndGg+PjE7dj0hMDticmVhaztjYXNlIDI0OmZvcig7bi5sZW5ndGg+Mjspe3U9bytuLnNoaWZ0KCk7Zj1jK24uc2hpZnQoKTtkPXUrbi5zaGlmdCgpO2c9ZituLnNoaWZ0KCk7bz1kK24uc2hpZnQoKTtjPWcrbi5zaGlmdCgpO2JlemllckN1cnZlVG8odSxmLGQsZyxvLGMpfW8rPW4uc2hpZnQoKTtjKz1uLnNoaWZ0KCk7bGluZVRvKG8sYyk7YnJlYWs7Y2FzZSAyNTpmb3IoO24ubGVuZ3RoPjY7KXtvKz1uLnNoaWZ0KCk7Yys9bi5zaGlmdCgpO2xpbmVUbyhvLGMpfXU9bytuLnNoaWZ0KCk7Zj1jK24uc2hpZnQoKTtkPXUrbi5zaGlmdCgpO2c9ZituLnNoaWZ0KCk7bz1kK24uc2hpZnQoKTtjPWcrbi5zaGlmdCgpO2JlemllckN1cnZlVG8odSxmLGQsZyxvLGMpO2JyZWFrO2Nhc2UgMjY6bi5sZW5ndGglMiYmKG8rPW4uc2hpZnQoKSk7Zm9yKDtuLmxlbmd0aD4wOyl7dT1vO2Y9YytuLnNoaWZ0KCk7ZD11K24uc2hpZnQoKTtnPWYrbi5zaGlmdCgpO289ZDtjPWcrbi5zaGlmdCgpO2JlemllckN1cnZlVG8odSxmLGQsZyxvLGMpfWJyZWFrO2Nhc2UgMjc6bi5sZW5ndGglMiYmKGMrPW4uc2hpZnQoKSk7Zm9yKDtuLmxlbmd0aD4wOyliZXppZXJDdXJ2ZVRvKHU9bytuLnNoaWZ0KCksZj1jLGQ9dStuLnNoaWZ0KCksZz1mK24uc2hpZnQoKSxvPWQrbi5zaGlmdCgpLGM9Zyk7YnJlYWs7Y2FzZSAyODpuLnB1c2goKGVbaF08PDI0fGVbaCsxXTw8MTYpPj4xNik7aCs9MjticmVhaztjYXNlIDI5OmI9bi5wb3AoKStyLmdzdWJyc0JpYXM7KHk9ci5nc3VicnNbYl0pJiZwYXJzZSh5KTticmVhaztjYXNlIDMwOmZvcig7bi5sZW5ndGg+MDspe3U9bztmPWMrbi5zaGlmdCgpO2Q9dStuLnNoaWZ0KCk7Zz1mK24uc2hpZnQoKTtvPWQrbi5zaGlmdCgpO2M9ZysoMT09PW4ubGVuZ3RoP24uc2hpZnQoKTowKTtiZXppZXJDdXJ2ZVRvKHUsZixkLGcsbyxjKTtpZigwPT09bi5sZW5ndGgpYnJlYWs7dT1vK24uc2hpZnQoKTtmPWM7ZD11K24uc2hpZnQoKTtnPWYrbi5zaGlmdCgpO2M9ZytuLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LGYsZCxnLG89ZCsoMT09PW4ubGVuZ3RoP24uc2hpZnQoKTowKSxjKX1icmVhaztjYXNlIDMxOmZvcig7bi5sZW5ndGg+MDspe3U9bytuLnNoaWZ0KCk7Zj1jO2Q9dStuLnNoaWZ0KCk7Zz1mK24uc2hpZnQoKTtjPWcrbi5zaGlmdCgpO2JlemllckN1cnZlVG8odSxmLGQsZyxvPWQrKDE9PT1uLmxlbmd0aD9uLnNoaWZ0KCk6MCksYyk7aWYoMD09PW4ubGVuZ3RoKWJyZWFrO3U9bztmPWMrbi5zaGlmdCgpO2Q9dStuLnNoaWZ0KCk7Zz1mK24uc2hpZnQoKTtvPWQrbi5zaGlmdCgpO2M9ZysoMT09PW4ubGVuZ3RoP24uc2hpZnQoKTowKTtiZXppZXJDdXJ2ZVRvKHUsZixkLGcsbyxjKX1icmVhaztkZWZhdWx0OmlmKHc8MzIpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoInVua25vd24gb3BlcmF0b3I6ICIrdyk7aWYodzwyNDcpbi5wdXNoKHctMTM5KTtlbHNlIGlmKHc8MjUxKW4ucHVzaCgyNTYqKHctMjQ3KStlW2grK10rMTA4KTtlbHNlIGlmKHc8MjU1KW4ucHVzaCgyNTYqLSh3LTI1MSktZVtoKytdLTEwOCk7ZWxzZXtuLnB1c2goKGVbaF08PDI0fGVbaCsxXTw8MTZ8ZVtoKzJdPDw4fGVbaCszXSkvNjU1MzYpO2grPTR9fXYmJihuLmxlbmd0aD0wKX19KGUpfShlLHQsdGhpcyxyKX19cmV0dXJue2NyZWF0ZTpmdW5jdGlvbiBGb250UmVuZGVyZXJGYWN0b3J5X2NyZWF0ZShlLHQpe2Zvcih2YXIgcixpLG4scyxvLGMsbD1uZXcgVWludDhBcnJheShlLmRhdGEpLGg9Z2V0VXNob3J0KGwsNCksdT0wLGQ9MTI7dTxoO3UrKyxkKz0xNil7dmFyIGY9KDAsYS5ieXRlc1RvU3RyaW5nKShsLnN1YmFycmF5KGQsZCs0KSksZz1nZXRMb25nKGwsZCs4KSxtPWdldExvbmcobCxkKzEyKTtzd2l0Y2goZil7Y2FzZSJjbWFwIjpyPXBhcnNlQ21hcChsLGcpO2JyZWFrO2Nhc2UiZ2x5ZiI6aT1sLnN1YmFycmF5KGcsZyttKTticmVhaztjYXNlImxvY2EiOm49bC5zdWJhcnJheShnLGcrbSk7YnJlYWs7Y2FzZSJoZWFkIjpjPWdldFVzaG9ydChsLGcrMTgpO289Z2V0VXNob3J0KGwsZys1MCk7YnJlYWs7Y2FzZSJDRkYgIjpzPXBhcnNlQ2ZmKGwsZyxnK20sdCl9fWlmKGkpe3ZhciBwPWM/WzEvYywwLDAsMS9jLDAsMF06ZS5mb250TWF0cml4O3JldHVybiBuZXcgVHJ1ZVR5cGVDb21waWxlZChmdW5jdGlvbiBwYXJzZUdseWZUYWJsZShlLHQscil7dmFyIGEsaTtpZihyKXthPTQ7aT1mdW5jdGlvbiBmb250SXRlbURlY29kZUxvbmcoZSx0KXtyZXR1cm4gZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8ZVt0KzNdfX1lbHNle2E9MjtpPWZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlKGUsdCl7cmV0dXJuIGVbdF08PDl8ZVt0KzFdPDwxfX1mb3IodmFyIG49W10scz1pKHQsMCksbz1hO288dC5sZW5ndGg7bys9YSl7dmFyIGM9aSh0LG8pO24ucHVzaChlLnN1YmFycmF5KHMsYykpO3M9Y31yZXR1cm4gbn0oaSxuLG8pLHIscCl9cmV0dXJuIG5ldyBUeXBlMkNvbXBpbGVkKHMscixlLmZvbnRNYXRyaXgsZS5nbHlwaE5hbWVNYXApfX19KCk7dC5Gb250UmVuZGVyZXJGYWN0b3J5PWN9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuVHlwZTFQYXJzZXI9dm9pZCAwO3ZhciBhPXIoMzMpLGk9cig4KSxuPXIoMTIpLHM9cigyKSxvPWZ1bmN0aW9uIFR5cGUxQ2hhclN0cmluZ0Nsb3N1cmUoKXt2YXIgZT1bNF0sdD1bNV0scj1bNl0sYT1bN10saT1bOF0sbj1bMTIsMzVdLG89WzE0XSxjPVsyMV0sbD1bMjJdLGg9WzMwXSx1PVszMV07ZnVuY3Rpb24gVHlwZTFDaGFyU3RyaW5nKCl7dGhpcy53aWR0aD0wO3RoaXMubHNiPTA7dGhpcy5mbGV4aW5nPSExO3RoaXMub3V0cHV0PVtdO3RoaXMuc3RhY2s9W119VHlwZTFDaGFyU3RyaW5nLnByb3RvdHlwZT17Y29udmVydDpmdW5jdGlvbiBUeXBlMUNoYXJTdHJpbmdfY29udmVydChkLGYsZyl7Zm9yKHZhciBtLHAsYix5PWQubGVuZ3RoLHY9ITEsdz0wO3c8eTt3Kyspe3ZhciBrPWRbd107aWYoazwzMil7MTI9PT1rJiYoaz0oazw8OCkrZFsrK3ddKTtzd2l0Y2goayl7Y2FzZSAxOmNhc2UgMzp0aGlzLnN0YWNrPVtdO2JyZWFrO2Nhc2UgNDppZih0aGlzLmZsZXhpbmcpe2lmKHRoaXMuc3RhY2subGVuZ3RoPDEpe3Y9ITA7YnJlYWt9dmFyIFM9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnN0YWNrLnB1c2goMCxTKTticmVha312PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMSxlKTticmVhaztjYXNlIDU6dj10aGlzLmV4ZWN1dGVDb21tYW5kKDIsdCk7YnJlYWs7Y2FzZSA2OnY9dGhpcy5leGVjdXRlQ29tbWFuZCgxLHIpO2JyZWFrO2Nhc2UgNzp2PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMSxhKTticmVhaztjYXNlIDg6dj10aGlzLmV4ZWN1dGVDb21tYW5kKDYsaSk7YnJlYWs7Y2FzZSA5OnRoaXMuc3RhY2s9W107YnJlYWs7Y2FzZSAxMDppZih0aGlzLnN0YWNrLmxlbmd0aDwxKXt2PSEwO2JyZWFrfWlmKCFmW2I9dGhpcy5zdGFjay5wb3AoKV0pe3Y9ITA7YnJlYWt9dj10aGlzLmNvbnZlcnQoZltiXSxmLGcpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuIHY7Y2FzZSAxMzppZih0aGlzLnN0YWNrLmxlbmd0aDwyKXt2PSEwO2JyZWFrfW09dGhpcy5zdGFjay5wb3AoKTtwPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5sc2I9cDt0aGlzLndpZHRoPW07dGhpcy5zdGFjay5wdXNoKG0scCk7dj10aGlzLmV4ZWN1dGVDb21tYW5kKDIsbCk7YnJlYWs7Y2FzZSAxNDp0aGlzLm91dHB1dC5wdXNoKG9bMF0pO2JyZWFrO2Nhc2UgMjE6aWYodGhpcy5mbGV4aW5nKWJyZWFrO3Y9dGhpcy5leGVjdXRlQ29tbWFuZCgyLGMpO2JyZWFrO2Nhc2UgMjI6aWYodGhpcy5mbGV4aW5nKXt0aGlzLnN0YWNrLnB1c2goMCk7YnJlYWt9dj10aGlzLmV4ZWN1dGVDb21tYW5kKDEsbCk7YnJlYWs7Y2FzZSAzMDp2PXRoaXMuZXhlY3V0ZUNvbW1hbmQoNCxoKTticmVhaztjYXNlIDMxOnY9dGhpcy5leGVjdXRlQ29tbWFuZCg0LHUpO2JyZWFrO2Nhc2UgMzA3MjpjYXNlIDMwNzM6Y2FzZSAzMDc0OnRoaXMuc3RhY2s9W107YnJlYWs7Y2FzZSAzMDc4OmlmKGcpe2NvbnN0IGU9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC01XTt0aGlzLnNlYWM9dGhpcy5zdGFjay5zcGxpY2UoLTQsNCk7dGhpcy5zZWFjWzBdKz10aGlzLmxzYi1lO3Y9dGhpcy5leGVjdXRlQ29tbWFuZCgwLG8pfWVsc2Ugdj10aGlzLmV4ZWN1dGVDb21tYW5kKDQsbyk7YnJlYWs7Y2FzZSAzMDc5OmlmKHRoaXMuc3RhY2subGVuZ3RoPDQpe3Y9ITA7YnJlYWt9dGhpcy5zdGFjay5wb3AoKTttPXRoaXMuc3RhY2sucG9wKCk7dmFyIEM9dGhpcy5zdGFjay5wb3AoKTtwPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5sc2I9cDt0aGlzLndpZHRoPW07dGhpcy5zdGFjay5wdXNoKG0scCxDKTt2PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMyxjKTticmVhaztjYXNlIDMwODQ6aWYodGhpcy5zdGFjay5sZW5ndGg8Mil7dj0hMDticmVha312YXIgeD10aGlzLnN0YWNrLnBvcCgpLEE9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnN0YWNrLnB1c2goQS94KTticmVhaztjYXNlIDMwODg6aWYodGhpcy5zdGFjay5sZW5ndGg8Mil7dj0hMDticmVha31iPXRoaXMuc3RhY2sucG9wKCk7dmFyIFQ9dGhpcy5zdGFjay5wb3AoKTtpZigwPT09YiYmMz09PVQpe3ZhciBJPXRoaXMuc3RhY2suc3BsaWNlKHRoaXMuc3RhY2subGVuZ3RoLTE3LDE3KTt0aGlzLnN0YWNrLnB1c2goSVsyXStJWzBdLElbM10rSVsxXSxJWzRdLElbNV0sSVs2XSxJWzddLElbOF0sSVs5XSxJWzEwXSxJWzExXSxJWzEyXSxJWzEzXSxJWzE0XSk7dj10aGlzLmV4ZWN1dGVDb21tYW5kKDEzLG4sITApO3RoaXMuZmxleGluZz0hMTt0aGlzLnN0YWNrLnB1c2goSVsxNV0sSVsxNl0pfWVsc2UgMT09PWImJjA9PT1UJiYodGhpcy5mbGV4aW5nPSEwKTticmVhaztjYXNlIDMwODk6YnJlYWs7Y2FzZSAzMTA1OnRoaXMuc3RhY2s9W107YnJlYWs7ZGVmYXVsdDooMCxzLndhcm4pKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgIicraysnIicpfWlmKHYpYnJlYWt9ZWxzZXtrPD0yNDY/ay09MTM5Oms9azw9MjUwPzI1Niooay0yNDcpK2RbKyt3XSsxMDg6azw9MjU0Py0yNTYqKGstMjUxKS1kWysrd10tMTA4OigyNTUmZFsrK3ddKTw8MjR8KDI1NSZkWysrd10pPDwxNnwoMjU1JmRbKyt3XSk8PDh8KDI1NSZkWysrd10pPDwwO3RoaXMuc3RhY2sucHVzaChrKX19cmV0dXJuIHZ9LGV4ZWN1dGVDb21tYW5kKGUsdCxyKXt2YXIgYT10aGlzLnN0YWNrLmxlbmd0aDtpZihlPmEpcmV0dXJuITA7Zm9yKHZhciBpPWEtZSxuPWk7bjxhO24rKyl7dmFyIHM9dGhpcy5zdGFja1tuXTtpZihOdW1iZXIuaXNJbnRlZ2VyKHMpKXRoaXMub3V0cHV0LnB1c2goMjgscz4+OCYyNTUsMjU1JnMpO2Vsc2V7cz02NTUzNipzfDA7dGhpcy5vdXRwdXQucHVzaCgyNTUscz4+MjQmMjU1LHM+PjE2JjI1NSxzPj44JjI1NSwyNTUmcyl9fXRoaXMub3V0cHV0LnB1c2guYXBwbHkodGhpcy5vdXRwdXQsdCk7cj90aGlzLnN0YWNrLnNwbGljZShpLGUpOnRoaXMuc3RhY2subGVuZ3RoPTA7cmV0dXJuITF9fTtyZXR1cm4gVHlwZTFDaGFyU3RyaW5nfSgpLGM9ZnVuY3Rpb24gVHlwZTFQYXJzZXJDbG9zdXJlKCl7ZnVuY3Rpb24gaXNIZXhEaWdpdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fHxlPj02NSYmZTw9NzB8fGU+PTk3JiZlPD0xMDJ9ZnVuY3Rpb24gZGVjcnlwdChlLHQscil7aWYocj49ZS5sZW5ndGgpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO3ZhciBhLGksbj0wfHQ7Zm9yKGE9MDthPHI7YSsrKW49NTI4NDUqKGVbYV0rbikrMjI3MTkmNjU1MzU7dmFyIHM9ZS5sZW5ndGgtcixvPW5ldyBVaW50OEFycmF5KHMpO2ZvcihhPXIsaT0wO2k8czthKyssaSsrKXt2YXIgYz1lW2FdO29baV09Y15uPj44O249NTI4NDUqKGMrbikrMjI3MTkmNjU1MzV9cmV0dXJuIG99ZnVuY3Rpb24gaXNTcGVjaWFsKGUpe3JldHVybiA0Nz09PWV8fDkxPT09ZXx8OTM9PT1lfHwxMjM9PT1lfHwxMjU9PT1lfHw0MD09PWV8fDQxPT09ZX1mdW5jdGlvbiBUeXBlMVBhcnNlcihlLHQscil7aWYodCl7dmFyIGE9ZS5nZXRCeXRlcygpLHM9ISgoaXNIZXhEaWdpdChhWzBdKXx8KDAsaS5pc1doaXRlU3BhY2UpKGFbMF0pKSYmaXNIZXhEaWdpdChhWzFdKSYmaXNIZXhEaWdpdChhWzJdKSYmaXNIZXhEaWdpdChhWzNdKSYmaXNIZXhEaWdpdChhWzRdKSYmaXNIZXhEaWdpdChhWzVdKSYmaXNIZXhEaWdpdChhWzZdKSYmaXNIZXhEaWdpdChhWzddKSk7ZT1uZXcgbi5TdHJlYW0ocz9kZWNyeXB0KGEsNTU2NjUsNCk6ZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGUsdCxyKXt2YXIgYSxpLG49MHx0LHM9ZS5sZW5ndGgsbz1uZXcgVWludDhBcnJheShzPj4+MSk7Zm9yKGE9MCxpPTA7YTxzO2ErKyl7dmFyIGM9ZVthXTtpZihpc0hleERpZ2l0KGMpKXthKys7Zm9yKHZhciBsO2E8cyYmIWlzSGV4RGlnaXQobD1lW2FdKTspYSsrO2lmKGE8cyl7dmFyIGg9cGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZShjLGwpLDE2KTtvW2krK109aF5uPj44O249NTI4NDUqKGgrbikrMjI3MTkmNjU1MzV9fX1yZXR1cm4gby5zbGljZShyLGkpfShhLDU1NjY1LDQpKX10aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQ9ISFyO3RoaXMuc3RyZWFtPWU7dGhpcy5uZXh0Q2hhcigpfVR5cGUxUGFyc2VyLnByb3RvdHlwZT17cmVhZE51bWJlckFycmF5OmZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWROdW1iZXJBcnJheSgpe3RoaXMuZ2V0VG9rZW4oKTtmb3IodmFyIGU9W107Oyl7dmFyIHQ9dGhpcy5nZXRUb2tlbigpO2lmKG51bGw9PT10fHwiXSI9PT10fHwifSI9PT10KWJyZWFrO2UucHVzaChwYXJzZUZsb2F0KHR8fDApKX1yZXR1cm4gZX0scmVhZE51bWJlcjpmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkTnVtYmVyKCl7dmFyIGU9dGhpcy5nZXRUb2tlbigpO3JldHVybiBwYXJzZUZsb2F0KGV8fDApfSxyZWFkSW50OmZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWRJbnQoKXt2YXIgZT10aGlzLmdldFRva2VuKCk7cmV0dXJuIDB8cGFyc2VJbnQoZXx8MCwxMCl9LHJlYWRCb29sZWFuOmZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWRCb29sZWFuKCl7cmV0dXJuInRydWUiPT09dGhpcy5nZXRUb2tlbigpPzE6MH0sbmV4dENoYXI6ZnVuY3Rpb24gVHlwZTFfbmV4dENoYXIoKXtyZXR1cm4gdGhpcy5jdXJyZW50Q2hhcj10aGlzLnN0cmVhbS5nZXRCeXRlKCl9LGdldFRva2VuOmZ1bmN0aW9uIFR5cGUxUGFyc2VyX2dldFRva2VuKCl7Zm9yKHZhciBlPSExLHQ9dGhpcy5jdXJyZW50Q2hhcjs7KXtpZigtMT09PXQpcmV0dXJuIG51bGw7aWYoZSkxMCE9PXQmJjEzIT09dHx8KGU9ITEpO2Vsc2UgaWYoMzc9PT10KWU9ITA7ZWxzZSBpZighKDAsaS5pc1doaXRlU3BhY2UpKHQpKWJyZWFrO3Q9dGhpcy5uZXh0Q2hhcigpfWlmKGlzU3BlY2lhbCh0KSl7dGhpcy5uZXh0Q2hhcigpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQpfXZhciByPSIiO2Rve3IrPVN0cmluZy5mcm9tQ2hhckNvZGUodCk7dD10aGlzLm5leHRDaGFyKCl9d2hpbGUodD49MCYmISgwLGkuaXNXaGl0ZVNwYWNlKSh0KSYmIWlzU3BlY2lhbCh0KSk7cmV0dXJuIHJ9LHJlYWRDaGFyU3RyaW5nczpmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkQ2hhclN0cmluZ3MoZSx0KXtyZXR1cm4tMT09PXQ/ZTpkZWNyeXB0KGUsNDMzMCx0KX0sZXh0cmFjdEZvbnRQcm9ncmFtOmZ1bmN0aW9uIFR5cGUxUGFyc2VyX2V4dHJhY3RGb250UHJvZ3JhbShlKXt2YXIgdD10aGlzLnN0cmVhbSxyPVtdLGE9W10saT1PYmplY3QuY3JlYXRlKG51bGwpO2kubGVuSVY9NDtmb3IodmFyIG4scyxjLGwsaCx1PXtzdWJyczpbXSxjaGFyc3RyaW5nczpbXSxwcm9wZXJ0aWVzOntwcml2YXRlRGF0YTppfX07bnVsbCE9PShuPXRoaXMuZ2V0VG9rZW4oKSk7KWlmKCIvIj09PW4pc3dpdGNoKG49dGhpcy5nZXRUb2tlbigpKXtjYXNlIkNoYXJTdHJpbmdzIjp0aGlzLmdldFRva2VuKCk7dGhpcy5nZXRUb2tlbigpO3RoaXMuZ2V0VG9rZW4oKTt0aGlzLmdldFRva2VuKCk7Zm9yKDtudWxsIT09KG49dGhpcy5nZXRUb2tlbigpKSYmImVuZCIhPT1uOylpZigiLyI9PT1uKXt2YXIgZD10aGlzLmdldFRva2VuKCk7cz10aGlzLnJlYWRJbnQoKTt0aGlzLmdldFRva2VuKCk7Yz1zPjA/dC5nZXRCeXRlcyhzKTpuZXcgVWludDhBcnJheSgwKTtsPXUucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjtoPXRoaXMucmVhZENoYXJTdHJpbmdzKGMsbCk7dGhpcy5uZXh0Q2hhcigpOyJub2FjY2VzcyI9PT0obj10aGlzLmdldFRva2VuKCkpJiZ0aGlzLmdldFRva2VuKCk7YS5wdXNoKHtnbHlwaDpkLGVuY29kZWQ6aH0pfWJyZWFrO2Nhc2UiU3VicnMiOnRoaXMucmVhZEludCgpO3RoaXMuZ2V0VG9rZW4oKTtmb3IoOyJkdXAiPT09dGhpcy5nZXRUb2tlbigpOyl7Y29uc3QgZT10aGlzLnJlYWRJbnQoKTtzPXRoaXMucmVhZEludCgpO3RoaXMuZ2V0VG9rZW4oKTtjPXM+MD90LmdldEJ5dGVzKHMpOm5ldyBVaW50OEFycmF5KDApO2w9dS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhLmxlbklWO2g9dGhpcy5yZWFkQ2hhclN0cmluZ3MoYyxsKTt0aGlzLm5leHRDaGFyKCk7Im5vYWNjZXNzIj09PShuPXRoaXMuZ2V0VG9rZW4oKSkmJnRoaXMuZ2V0VG9rZW4oKTtyW2VdPWh9YnJlYWs7Y2FzZSJCbHVlVmFsdWVzIjpjYXNlIk90aGVyQmx1ZXMiOmNhc2UiRmFtaWx5Qmx1ZXMiOmNhc2UiRmFtaWx5T3RoZXJCbHVlcyI6dmFyIGY9dGhpcy5yZWFkTnVtYmVyQXJyYXkoKTtmLmxlbmd0aD4wJiZmLmxlbmd0aCwwO2JyZWFrO2Nhc2UiU3RlbVNuYXBIIjpjYXNlIlN0ZW1TbmFwViI6dS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW25dPXRoaXMucmVhZE51bWJlckFycmF5KCk7YnJlYWs7Y2FzZSJTdGRIVyI6Y2FzZSJTdGRWVyI6dS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW25dPXRoaXMucmVhZE51bWJlckFycmF5KClbMF07YnJlYWs7Y2FzZSJCbHVlU2hpZnQiOmNhc2UibGVuSVYiOmNhc2UiQmx1ZUZ1enoiOmNhc2UiQmx1ZVNjYWxlIjpjYXNlIkxhbmd1YWdlR3JvdXAiOmNhc2UiRXhwYW5zaW9uRmFjdG9yIjp1LnByb3BlcnRpZXMucHJpdmF0ZURhdGFbbl09dGhpcy5yZWFkTnVtYmVyKCk7YnJlYWs7Y2FzZSJGb3JjZUJvbGQiOnUucHJvcGVydGllcy5wcml2YXRlRGF0YVtuXT10aGlzLnJlYWRCb29sZWFuKCl9Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspe2Q9YVtnXS5nbHlwaDtoPWFbZ10uZW5jb2RlZDt2YXIgbT1uZXcgbyxwPW0uY29udmVydChoLHIsdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKSxiPW0ub3V0cHV0O3AmJihiPVsxNF0pO2NvbnN0IHQ9e2dseXBoTmFtZTpkLGNoYXJzdHJpbmc6Yix3aWR0aDptLndpZHRoLGxzYjptLmxzYixzZWFjOm0uc2VhY307Ii5ub3RkZWYiPT09ZD91LmNoYXJzdHJpbmdzLnVuc2hpZnQodCk6dS5jaGFyc3RyaW5ncy5wdXNoKHQpO2lmKGUuYnVpbHRJbkVuY29kaW5nKXtjb25zdCB0PWUuYnVpbHRJbkVuY29kaW5nLmluZGV4T2YoZCk7dD4tMSYmdm9pZCAwPT09ZS53aWR0aHNbdF0mJnQ+PWUuZmlyc3RDaGFyJiZ0PD1lLmxhc3RDaGFyJiYoZS53aWR0aHNbdF09bS53aWR0aCl9fXJldHVybiB1fSxleHRyYWN0Rm9udEhlYWRlcjpmdW5jdGlvbiBUeXBlMVBhcnNlcl9leHRyYWN0Rm9udEhlYWRlcihlKXtmb3IodmFyIHQ7bnVsbCE9PSh0PXRoaXMuZ2V0VG9rZW4oKSk7KWlmKCIvIj09PXQpc3dpdGNoKHQ9dGhpcy5nZXRUb2tlbigpKXtjYXNlIkZvbnRNYXRyaXgiOnZhciByPXRoaXMucmVhZE51bWJlckFycmF5KCk7ZS5mb250TWF0cml4PXI7YnJlYWs7Y2FzZSJFbmNvZGluZyI6dmFyIGksbj10aGlzLmdldFRva2VuKCk7aWYoL15cZCskLy50ZXN0KG4pKXtpPVtdO3ZhciBzPTB8cGFyc2VJbnQobiwxMCk7dGhpcy5nZXRUb2tlbigpO2Zvcih2YXIgbz0wO288cztvKyspe3Q9dGhpcy5nZXRUb2tlbigpO2Zvcig7ImR1cCIhPT10JiYiZGVmIiE9PXQ7KWlmKG51bGw9PT0odD10aGlzLmdldFRva2VuKCkpKXJldHVybjtpZigiZGVmIj09PXQpYnJlYWs7dmFyIGM9dGhpcy5yZWFkSW50KCk7dGhpcy5nZXRUb2tlbigpO3ZhciBsPXRoaXMuZ2V0VG9rZW4oKTtpW2NdPWw7dGhpcy5nZXRUb2tlbigpfX1lbHNlIGk9KDAsYS5nZXRFbmNvZGluZykobik7ZS5idWlsdEluRW5jb2Rpbmc9aTticmVhaztjYXNlIkZvbnRCQm94Ijp2YXIgaD10aGlzLnJlYWROdW1iZXJBcnJheSgpO2UuYXNjZW50PU1hdGgubWF4KGhbM10saFsxXSk7ZS5kZXNjZW50PU1hdGgubWluKGhbMV0saFszXSk7ZS5hc2NlbnRTY2FsZWQ9ITB9fX07cmV0dXJuIFR5cGUxUGFyc2VyfSgpO3QuVHlwZTFQYXJzZXI9Y30sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5nZXRUaWxpbmdQYXR0ZXJuSVI9ZnVuY3Rpb24gZ2V0VGlsaW5nUGF0dGVybklSKGUsdCxyKXtjb25zdCBpPXQuZ2V0QXJyYXkoIk1hdHJpeCIpLG49YS5VdGlsLm5vcm1hbGl6ZVJlY3QodC5nZXRBcnJheSgiQkJveCIpKSxzPXQuZ2V0KCJYU3RlcCIpLG89dC5nZXQoIllTdGVwIiksYz10LmdldCgiUGFpbnRUeXBlIiksbD10LmdldCgiVGlsaW5nVHlwZSIpO2lmKG5bMl0tblswXT09MHx8blszXS1uWzFdPT0wKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvQkJveCBhcnJheTogWyR7bn1dLmApO3JldHVyblsiVGlsaW5nUGF0dGVybiIscixlLGksbixzLG8sYyxsXX07dC5QYXR0ZXJuPXZvaWQgMDt2YXIgYT1yKDIpLGk9cigyMyksbj1yKDUpLHM9cig4KSxvPTIsYz0zLGw9NCxoPTUsdT02LGQ9NyxmPWZ1bmN0aW9uIFBhdHRlcm5DbG9zdXJlKCl7ZnVuY3Rpb24gUGF0dGVybigpeygwLGEudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgUGF0dGVybiBjb25zdHJ1Y3RvciIpfVBhdHRlcm4ucHJvdG90eXBlPXtnZXRQYXR0ZXJuOmZ1bmN0aW9uIFBhdHRlcm5fZ2V0UGF0dGVybihlKXsoMCxhLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm4uZ2V0U3R5bGU6ICIrZSl9fTtQYXR0ZXJuLnBhcnNlU2hhZGluZz1mdW5jdGlvbihlLHQscixpLGYsbSxwKXt2YXIgYj0oMCxuLmlzU3RyZWFtKShlKT9lLmRpY3Q6ZSx5PWIuZ2V0KCJTaGFkaW5nVHlwZSIpO3RyeXtzd2l0Y2goeSl7Y2FzZSBvOmNhc2UgYzpyZXR1cm4gbmV3IGcuUmFkaWFsQXhpYWwoYix0LHIsaSxtLHApO2Nhc2UgbDpjYXNlIGg6Y2FzZSB1OmNhc2UgZDpyZXR1cm4gbmV3IGcuTWVzaChlLHQscixpLG0scCk7ZGVmYXVsdDp0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgU2hhZGluZ1R5cGU6ICIreSl9fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7Zi5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHtmZWF0dXJlSWQ6YS5VTlNVUFBPUlRFRF9GRUFUVVJFUy5zaGFkaW5nUGF0dGVybn0pOygwLGEud2FybikoZSk7cmV0dXJuIG5ldyBnLkR1bW15fX07cmV0dXJuIFBhdHRlcm59KCk7dC5QYXR0ZXJuPWY7dmFyIGc9e1NNQUxMX05VTUJFUjoxZS02fTtnLlJhZGlhbEF4aWFsPWZ1bmN0aW9uIFJhZGlhbEF4aWFsQ2xvc3VyZSgpe2Z1bmN0aW9uIFJhZGlhbEF4aWFsKGUsdCxyLG4scyxvKXt0aGlzLm1hdHJpeD10O3RoaXMuY29vcmRzQXJyPWUuZ2V0QXJyYXkoIkNvb3JkcyIpO3RoaXMuc2hhZGluZ1R5cGU9ZS5nZXQoIlNoYWRpbmdUeXBlIik7dGhpcy50eXBlPSJQYXR0ZXJuIjtjb25zdCBsPWkuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6ZS5nZXRSYXcoIkNvbG9yU3BhY2UiKXx8ZS5nZXRSYXcoIkNTIikseHJlZjpyLHJlc291cmNlczpuLHBkZkZ1bmN0aW9uRmFjdG9yeTpzLGxvY2FsQ29sb3JTcGFjZUNhY2hlOm99KTt0aGlzLmNzPWw7Y29uc3QgaD1lLmdldEFycmF5KCJCQm94Iik7QXJyYXkuaXNBcnJheShoKSYmND09PWgubGVuZ3RoP3RoaXMuYmJveD1hLlV0aWwubm9ybWFsaXplUmVjdChoKTp0aGlzLmJib3g9bnVsbDt2YXIgdT0wLGQ9MTtpZihlLmhhcygiRG9tYWluIikpe3ZhciBmPWUuZ2V0QXJyYXkoIkRvbWFpbiIpO3U9ZlswXTtkPWZbMV19dmFyIG09ITEscD0hMTtpZihlLmhhcygiRXh0ZW5kIikpe3ZhciBiPWUuZ2V0QXJyYXkoIkV4dGVuZCIpO209YlswXTtwPWJbMV19aWYoISh0aGlzLnNoYWRpbmdUeXBlIT09Y3x8bSYmcCkpe3ZhciB5PXRoaXMuY29vcmRzQXJyWzBdLHY9dGhpcy5jb29yZHNBcnJbMV0sdz10aGlzLmNvb3Jkc0FyclsyXSxrPXRoaXMuY29vcmRzQXJyWzNdLFM9dGhpcy5jb29yZHNBcnJbNF0sQz10aGlzLmNvb3Jkc0Fycls1XSx4PU1hdGguc3FydCgoeS1rKSooeS1rKSsodi1TKSoodi1TKSk7dzw9Qyt4JiZDPD13K3gmJigwLGEud2FybikoIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC4iKX10aGlzLmV4dGVuZFN0YXJ0PW07dGhpcy5leHRlbmRFbmQ9cDt2YXIgQT1lLmdldFJhdygiRnVuY3Rpb24iKSxUPXMuY3JlYXRlRnJvbUFycmF5KEEpO2NvbnN0IEk9KGQtdSkvMTA7dmFyIEY9dGhpcy5jb2xvclN0b3BzPVtdO2lmKHU+PWR8fEk8PTApKDAsYS5pbmZvKSgiQmFkIHNoYWRpbmcgZG9tYWluLiIpO2Vsc2V7dmFyIFAsRT1uZXcgRmxvYXQzMkFycmF5KGwubnVtQ29tcHMpLEI9bmV3IEZsb2F0MzJBcnJheSgxKTtmb3IobGV0IGU9MDtlPD0xMDtlKyspe0JbMF09dStlKkk7VChCLDAsRSwwKTtQPWwuZ2V0UmdiKEUsMCk7dmFyIE89YS5VdGlsLm1ha2VDc3NSZ2IoUFswXSxQWzFdLFBbMl0pO0YucHVzaChbZS8xMCxPXSl9dmFyIE09InRyYW5zcGFyZW50IjtpZihlLmhhcygiQmFja2dyb3VuZCIpKXtQPWwuZ2V0UmdiKGUuZ2V0KCJCYWNrZ3JvdW5kIiksMCk7TT1hLlV0aWwubWFrZUNzc1JnYihQWzBdLFBbMV0sUFsyXSl9aWYoIW0pe0YudW5zaGlmdChbMCxNXSk7RlsxXVswXSs9Zy5TTUFMTF9OVU1CRVJ9aWYoIXApe0ZbRi5sZW5ndGgtMV1bMF0tPWcuU01BTExfTlVNQkVSO0YucHVzaChbMSxNXSl9dGhpcy5jb2xvclN0b3BzPUZ9fVJhZGlhbEF4aWFsLnByb3RvdHlwZT17Z2V0SVI6ZnVuY3Rpb24gUmFkaWFsQXhpYWxfZ2V0SVIoKXt2YXIgZSx0LHIsaSxuLHM9dGhpcy5jb29yZHNBcnIsbD10aGlzLnNoYWRpbmdUeXBlO2lmKGw9PT1vKXt0PVtzWzBdLHNbMV1dO3I9W3NbMl0sc1szXV07aT1udWxsO249bnVsbDtlPSJheGlhbCJ9ZWxzZSBpZihsPT09Yyl7dD1bc1swXSxzWzFdXTtyPVtzWzNdLHNbNF1dO2k9c1syXTtuPXNbNV07ZT0icmFkaWFsIn1lbHNlKDAsYS51bnJlYWNoYWJsZSkoImdldFBhdHRlcm4gdHlwZSB1bmtub3duOiAiK2wpO3ZhciBoPXRoaXMubWF0cml4O2lmKGgpe3Q9YS5VdGlsLmFwcGx5VHJhbnNmb3JtKHQsaCk7cj1hLlV0aWwuYXBwbHlUcmFuc2Zvcm0ocixoKTtpZihsPT09Yyl7dmFyIHU9YS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGgpO2kqPXVbMF07bio9dVsxXX19cmV0dXJuWyJSYWRpYWxBeGlhbCIsZSx0aGlzLmJib3gsdGhpcy5jb2xvclN0b3BzLHQscixpLG5dfX07cmV0dXJuIFJhZGlhbEF4aWFsfSgpO2cuTWVzaD1mdW5jdGlvbiBNZXNoQ2xvc3VyZSgpe2Z1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXIoZSx0KXt0aGlzLnN0cmVhbT1lO3RoaXMuY29udGV4dD10O3RoaXMuYnVmZmVyPTA7dGhpcy5idWZmZXJMZW5ndGg9MDt2YXIgcj10Lm51bUNvbXBzO3RoaXMudG1wQ29tcHNCdWY9bmV3IEZsb2F0MzJBcnJheShyKTt2YXIgYT10LmNvbG9yU3BhY2UubnVtQ29tcHM7dGhpcy50bXBDc0NvbXBzQnVmPXQuY29sb3JGbj9uZXcgRmxvYXQzMkFycmF5KGEpOnRoaXMudG1wQ29tcHNCdWZ9TWVzaFN0cmVhbVJlYWRlci5wcm90b3R5cGU9e2dldCBoYXNEYXRhKCl7aWYodGhpcy5zdHJlYW0uZW5kKXJldHVybiB0aGlzLnN0cmVhbS5wb3M8dGhpcy5zdHJlYW0uZW5kO2lmKHRoaXMuYnVmZmVyTGVuZ3RoPjApcmV0dXJuITA7dmFyIGU9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO2lmKGU8MClyZXR1cm4hMTt0aGlzLmJ1ZmZlcj1lO3RoaXMuYnVmZmVyTGVuZ3RoPTg7cmV0dXJuITB9LHJlYWRCaXRzOmZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZEJpdHMoZSl7dmFyIHQ9dGhpcy5idWZmZXIscj10aGlzLmJ1ZmZlckxlbmd0aDtpZigzMj09PWUpe2lmKDA9PT1yKXJldHVybih0aGlzLnN0cmVhbS5nZXRCeXRlKCk8PDI0fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8MTZ8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpPDw4fHRoaXMuc3RyZWFtLmdldEJ5dGUoKSk+Pj4wO3Q9dDw8MjR8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpPDwxNnx0aGlzLnN0cmVhbS5nZXRCeXRlKCk8PDh8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO3ZhciBhPXRoaXMuc3RyZWFtLmdldEJ5dGUoKTt0aGlzLmJ1ZmZlcj1hJigxPDxyKS0xO3JldHVybih0PDw4LXJ8KDI1NSZhKT4+cik+Pj4wfWlmKDg9PT1lJiYwPT09cilyZXR1cm4gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO2Zvcig7cjxlOyl7dD10PDw4fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtyKz04fXItPWU7dGhpcy5idWZmZXJMZW5ndGg9cjt0aGlzLmJ1ZmZlcj10JigxPDxyKS0xO3JldHVybiB0Pj5yfSxhbGlnbjpmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX2FsaWduKCl7dGhpcy5idWZmZXI9MDt0aGlzLmJ1ZmZlckxlbmd0aD0wfSxyZWFkRmxhZzpmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRGbGFnKCl7cmV0dXJuIHRoaXMucmVhZEJpdHModGhpcy5jb250ZXh0LmJpdHNQZXJGbGFnKX0scmVhZENvb3JkaW5hdGU6ZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9yZWFkQ29vcmRpbmF0ZSgpe3ZhciBlPXRoaXMuY29udGV4dC5iaXRzUGVyQ29vcmRpbmF0ZSx0PXRoaXMucmVhZEJpdHMoZSkscj10aGlzLnJlYWRCaXRzKGUpLGE9dGhpcy5jb250ZXh0LmRlY29kZSxpPWU8MzI/MS8oKDE8PGUpLTEpOjIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7cmV0dXJuW3QqaSooYVsxXS1hWzBdKSthWzBdLHIqaSooYVszXS1hWzJdKSthWzJdXX0scmVhZENvbXBvbmVudHM6ZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9yZWFkQ29tcG9uZW50cygpe2Zvcih2YXIgZT10aGlzLmNvbnRleHQubnVtQ29tcHMsdD10aGlzLmNvbnRleHQuYml0c1BlckNvbXBvbmVudCxyPXQ8MzI/MS8oKDE8PHQpLTEpOjIuMzI4MzA2NDM2NTM4Njk2M2UtMTAsYT10aGlzLmNvbnRleHQuZGVjb2RlLGk9dGhpcy50bXBDb21wc0J1ZixuPTAscz00O248ZTtuKysscys9Mil7dmFyIG89dGhpcy5yZWFkQml0cyh0KTtpW25dPW8qciooYVtzKzFdLWFbc10pK2Fbc119dmFyIGM9dGhpcy50bXBDc0NvbXBzQnVmO3RoaXMuY29udGV4dC5jb2xvckZuJiZ0aGlzLmNvbnRleHQuY29sb3JGbihpLDAsYywwKTtyZXR1cm4gdGhpcy5jb250ZXh0LmNvbG9yU3BhY2UuZ2V0UmdiKGMsMCl9fTt2YXIgZT1mdW5jdGlvbiBnZXRCQ2xvc3VyZSgpe3ZhciBlPVtdO3JldHVybiBmdW5jdGlvbiBnZXRCKHQpe2VbdF18fChlW3RdPWZ1bmN0aW9uIGJ1aWxkQihlKXtmb3IodmFyIHQ9W10scj0wO3I8PWU7cisrKXt2YXIgYT1yL2UsaT0xLWE7dC5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoW2kqaSppLDMqYSppKmksMyphKmEqaSxhKmEqYV0pKX1yZXR1cm4gdH0odCkpO3JldHVybiBlW3RdfX0oKTtmdW5jdGlvbiBidWlsZEZpZ3VyZUZyb21QYXRjaCh0LHIpe3ZhciBpPXQuZmlndXJlc1tyXTsoMCxhLmFzc2VydCkoInBhdGNoIj09PWkudHlwZSwiVW5leHBlY3RlZCBwYXRjaCBtZXNoIGZpZ3VyZSIpO3ZhciBuPXQuY29vcmRzLHM9dC5jb2xvcnMsbz1pLmNvb3JkcyxjPWkuY29sb3JzLGw9TWF0aC5taW4obltvWzBdXVswXSxuW29bM11dWzBdLG5bb1sxMl1dWzBdLG5bb1sxNV1dWzBdKSxoPU1hdGgubWluKG5bb1swXV1bMV0sbltvWzNdXVsxXSxuW29bMTJdXVsxXSxuW29bMTVdXVsxXSksdT1NYXRoLm1heChuW29bMF1dWzBdLG5bb1szXV1bMF0sbltvWzEyXV1bMF0sbltvWzE1XV1bMF0pLGQ9TWF0aC5tYXgobltvWzBdXVsxXSxuW29bM11dWzFdLG5bb1sxMl1dWzFdLG5bb1sxNV1dWzFdKSxmPU1hdGguY2VpbCgyMCoodS1sKS8odC5ib3VuZHNbMl0tdC5ib3VuZHNbMF0pKTtmPU1hdGgubWF4KDMsTWF0aC5taW4oMjAsZikpO3ZhciBnPU1hdGguY2VpbCgyMCooZC1oKS8odC5ib3VuZHNbM10tdC5ib3VuZHNbMV0pKTtnPU1hdGgubWF4KDMsTWF0aC5taW4oMjAsZykpO2Zvcih2YXIgbT1mKzEscD1uZXcgSW50MzJBcnJheSgoZysxKSptKSxiPW5ldyBJbnQzMkFycmF5KChnKzEpKm0pLHk9MCx2PW5ldyBVaW50OEFycmF5KDMpLHc9bmV3IFVpbnQ4QXJyYXkoMyksaz1zW2NbMF1dLFM9c1tjWzFdXSxDPXNbY1syXV0seD1zW2NbM11dLEE9ZShnKSxUPWUoZiksST0wO0k8PWc7SSsrKXt2WzBdPShrWzBdKihnLUkpK0NbMF0qSSkvZ3wwO3ZbMV09KGtbMV0qKGctSSkrQ1sxXSpJKS9nfDA7dlsyXT0oa1syXSooZy1JKStDWzJdKkkpL2d8MDt3WzBdPShTWzBdKihnLUkpK3hbMF0qSSkvZ3wwO3dbMV09KFNbMV0qKGctSSkreFsxXSpJKS9nfDA7d1syXT0oU1syXSooZy1JKSt4WzJdKkkpL2d8MDtmb3IodmFyIEY9MDtGPD1mO0YrKyx5KyspaWYoMCE9PUkmJkkhPT1nfHwwIT09RiYmRiE9PWYpe2Zvcih2YXIgUD0wLEU9MCxCPTAsTz0wO088PTM7TysrKWZvcih2YXIgTT0wO008PTM7TSsrLEIrKyl7dmFyIEQ9QVtJXVtPXSpUW0ZdW01dO1ArPW5bb1tCXV1bMF0qRDtFKz1uW29bQl1dWzFdKkR9cFt5XT1uLmxlbmd0aDtuLnB1c2goW1AsRV0pO2JbeV09cy5sZW5ndGg7dmFyIFI9bmV3IFVpbnQ4QXJyYXkoMyk7UlswXT0odlswXSooZi1GKSt3WzBdKkYpL2Z8MDtSWzFdPSh2WzFdKihmLUYpK3dbMV0qRikvZnwwO1JbMl09KHZbMl0qKGYtRikrd1syXSpGKS9mfDA7cy5wdXNoKFIpfX1wWzBdPW9bMF07YlswXT1jWzBdO3BbZl09b1szXTtiW2ZdPWNbMV07cFttKmddPW9bMTJdO2JbbSpnXT1jWzJdO3BbbSpnK2ZdPW9bMTVdO2JbbSpnK2ZdPWNbM107dC5maWd1cmVzW3JdPXt0eXBlOiJsYXR0aWNlIixjb29yZHM6cCxjb2xvcnM6Yix2ZXJ0aWNlc1BlclJvdzptfX1mdW5jdGlvbiB1cGRhdGVCb3VuZHMoZSl7Zm9yKHZhciB0PWUuY29vcmRzWzBdWzBdLHI9ZS5jb29yZHNbMF1bMV0sYT10LGk9cixuPTEscz1lLmNvb3Jkcy5sZW5ndGg7bjxzO24rKyl7dmFyIG89ZS5jb29yZHNbbl1bMF0sYz1lLmNvb3Jkc1tuXVsxXTt0PXQ+bz9vOnQ7cj1yPmM/YzpyO2E9YTxvP286YTtpPWk8Yz9jOml9ZS5ib3VuZHM9W3QscixhLGldfWZ1bmN0aW9uIE1lc2goZSx0LHIscyxvLGMpe2lmKCEoMCxuLmlzU3RyZWFtKShlKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTWVzaCBkYXRhIGlzIG5vdCBhIHN0cmVhbSIpO3ZhciBmPWUuZGljdDt0aGlzLm1hdHJpeD10O3RoaXMuc2hhZGluZ1R5cGU9Zi5nZXQoIlNoYWRpbmdUeXBlIik7dGhpcy50eXBlPSJQYXR0ZXJuIjtjb25zdCBnPWYuZ2V0QXJyYXkoIkJCb3giKTtBcnJheS5pc0FycmF5KGcpJiY0PT09Zy5sZW5ndGg/dGhpcy5iYm94PWEuVXRpbC5ub3JtYWxpemVSZWN0KGcpOnRoaXMuYmJveD1udWxsO2NvbnN0IG09aS5Db2xvclNwYWNlLnBhcnNlKHtjczpmLmdldFJhdygiQ29sb3JTcGFjZSIpfHxmLmdldFJhdygiQ1MiKSx4cmVmOnIscmVzb3VyY2VzOnMscGRmRnVuY3Rpb25GYWN0b3J5Om8sbG9jYWxDb2xvclNwYWNlQ2FjaGU6Y30pO3RoaXMuY3M9bTt0aGlzLmJhY2tncm91bmQ9Zi5oYXMoIkJhY2tncm91bmQiKT9tLmdldFJnYihmLmdldCgiQmFja2dyb3VuZCIpLDApOm51bGw7dmFyIHA9Zi5nZXRSYXcoIkZ1bmN0aW9uIiksYj1wP28uY3JlYXRlRnJvbUFycmF5KHApOm51bGw7dGhpcy5jb29yZHM9W107dGhpcy5jb2xvcnM9W107dGhpcy5maWd1cmVzPVtdO3ZhciB5PW5ldyBNZXNoU3RyZWFtUmVhZGVyKGUse2JpdHNQZXJDb29yZGluYXRlOmYuZ2V0KCJCaXRzUGVyQ29vcmRpbmF0ZSIpLGJpdHNQZXJDb21wb25lbnQ6Zi5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSxiaXRzUGVyRmxhZzpmLmdldCgiQml0c1BlckZsYWciKSxkZWNvZGU6Zi5nZXRBcnJheSgiRGVjb2RlIiksY29sb3JGbjpiLGNvbG9yU3BhY2U6bSxudW1Db21wczpiPzE6bS5udW1Db21wc30pLHY9ITE7c3dpdGNoKHRoaXMuc2hhZGluZ1R5cGUpe2Nhc2UgbDohZnVuY3Rpb24gZGVjb2RlVHlwZTRTaGFkaW5nKGUsdCl7Zm9yKHZhciByPWUuY29vcmRzLGk9ZS5jb2xvcnMsbj1bXSxzPVtdLG89MDt0Lmhhc0RhdGE7KXt2YXIgYz10LnJlYWRGbGFnKCksbD10LnJlYWRDb29yZGluYXRlKCksaD10LnJlYWRDb21wb25lbnRzKCk7aWYoMD09PW8pe2lmKCEoMDw9YyYmYzw9MikpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZTQgZmxhZyIpO3N3aXRjaChjKXtjYXNlIDA6bz0zO2JyZWFrO2Nhc2UgMTpzLnB1c2goc1tzLmxlbmd0aC0yXSxzW3MubGVuZ3RoLTFdKTtvPTE7YnJlYWs7Y2FzZSAyOnMucHVzaChzW3MubGVuZ3RoLTNdLHNbcy5sZW5ndGgtMV0pO289MX1uLnB1c2goYyl9cy5wdXNoKHIubGVuZ3RoKTtyLnB1c2gobCk7aS5wdXNoKGgpO28tLTt0LmFsaWduKCl9ZS5maWd1cmVzLnB1c2goe3R5cGU6InRyaWFuZ2xlcyIsY29vcmRzOm5ldyBJbnQzMkFycmF5KHMpLGNvbG9yczpuZXcgSW50MzJBcnJheShzKX0pfSh0aGlzLHkpO2JyZWFrO2Nhc2UgaDp2YXIgdz0wfGYuZ2V0KCJWZXJ0aWNlc1BlclJvdyIpO2lmKHc8Mil0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBWZXJ0aWNlc1BlclJvdyIpOyFmdW5jdGlvbiBkZWNvZGVUeXBlNVNoYWRpbmcoZSx0LHIpe2Zvcih2YXIgYT1lLmNvb3JkcyxpPWUuY29sb3JzLG49W107dC5oYXNEYXRhOyl7dmFyIHM9dC5yZWFkQ29vcmRpbmF0ZSgpLG89dC5yZWFkQ29tcG9uZW50cygpO24ucHVzaChhLmxlbmd0aCk7YS5wdXNoKHMpO2kucHVzaChvKX1lLmZpZ3VyZXMucHVzaCh7dHlwZToibGF0dGljZSIsY29vcmRzOm5ldyBJbnQzMkFycmF5KG4pLGNvbG9yczpuZXcgSW50MzJBcnJheShuKSx2ZXJ0aWNlc1BlclJvdzpyfSl9KHRoaXMseSx3KTticmVhaztjYXNlIHU6IWZ1bmN0aW9uIGRlY29kZVR5cGU2U2hhZGluZyhlLHQpe2Zvcih2YXIgcj1lLmNvb3JkcyxpPWUuY29sb3JzLG49bmV3IEludDMyQXJyYXkoMTYpLHM9bmV3IEludDMyQXJyYXkoNCk7dC5oYXNEYXRhOyl7dmFyIG8sYyxsPXQucmVhZEZsYWcoKTtpZighKDA8PWwmJmw8PTMpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU2IGZsYWciKTt2YXIgaD1yLmxlbmd0aDtmb3Iobz0wLGM9MCE9PWw/ODoxMjtvPGM7bysrKXIucHVzaCh0LnJlYWRDb29yZGluYXRlKCkpO3ZhciB1LGQsZixnLG09aS5sZW5ndGg7Zm9yKG89MCxjPTAhPT1sPzI6NDtvPGM7bysrKWkucHVzaCh0LnJlYWRDb21wb25lbnRzKCkpO3N3aXRjaChsKXtjYXNlIDA6blsxMl09aCszO25bMTNdPWgrNDtuWzE0XT1oKzU7blsxNV09aCs2O25bOF09aCsyO25bMTFdPWgrNztuWzRdPWgrMTtuWzddPWgrODtuWzBdPWg7blsxXT1oKzExO25bMl09aCsxMDtuWzNdPWgrOTtzWzJdPW0rMTtzWzNdPW0rMjtzWzBdPW07c1sxXT1tKzM7YnJlYWs7Y2FzZSAxOnU9blsxMl07ZD1uWzEzXTtmPW5bMTRdO2c9blsxNV07blsxMl09ZztuWzEzXT1oKzA7blsxNF09aCsxO25bMTVdPWgrMjtuWzhdPWY7blsxMV09aCszO25bNF09ZDtuWzddPWgrNDtuWzBdPXU7blsxXT1oKzc7blsyXT1oKzY7blszXT1oKzU7dT1zWzJdO2Q9c1szXTtzWzJdPWQ7c1szXT1tO3NbMF09dTtzWzFdPW0rMTticmVhaztjYXNlIDI6dT1uWzE1XTtkPW5bMTFdO25bMTJdPW5bM107blsxM109aCswO25bMTRdPWgrMTtuWzE1XT1oKzI7bls4XT1uWzddO25bMTFdPWgrMztuWzRdPWQ7bls3XT1oKzQ7blswXT11O25bMV09aCs3O25bMl09aCs2O25bM109aCs1O3U9c1szXTtzWzJdPXNbMV07c1szXT1tO3NbMF09dTtzWzFdPW0rMTticmVhaztjYXNlIDM6blsxMl09blswXTtuWzEzXT1oKzA7blsxNF09aCsxO25bMTVdPWgrMjtuWzhdPW5bMV07blsxMV09aCszO25bNF09blsyXTtuWzddPWgrNDtuWzBdPW5bM107blsxXT1oKzc7blsyXT1oKzY7blszXT1oKzU7c1syXT1zWzBdO3NbM109bTtzWzBdPXNbMV07c1sxXT1tKzF9bls1XT1yLmxlbmd0aDtyLnB1c2goWygtNCpyW25bMF1dWzBdLXJbblsxNV1dWzBdKzYqKHJbbls0XV1bMF0rcltuWzFdXVswXSktMioocltuWzEyXV1bMF0rcltuWzNdXVswXSkrMyoocltuWzEzXV1bMF0rcltuWzddXVswXSkpLzksKC00KnJbblswXV1bMV0tcltuWzE1XV1bMV0rNioocltuWzRdXVsxXStyW25bMV1dWzFdKS0yKihyW25bMTJdXVsxXStyW25bM11dWzFdKSszKihyW25bMTNdXVsxXStyW25bN11dWzFdKSkvOV0pO25bNl09ci5sZW5ndGg7ci5wdXNoKFsoLTQqcltuWzNdXVswXS1yW25bMTJdXVswXSs2KihyW25bMl1dWzBdK3Jbbls3XV1bMF0pLTIqKHJbblswXV1bMF0rcltuWzE1XV1bMF0pKzMqKHJbbls0XV1bMF0rcltuWzE0XV1bMF0pKS85LCgtNCpyW25bM11dWzFdLXJbblsxMl1dWzFdKzYqKHJbblsyXV1bMV0rcltuWzddXVsxXSktMioocltuWzBdXVsxXStyW25bMTVdXVsxXSkrMyoocltuWzRdXVsxXStyW25bMTRdXVsxXSkpLzldKTtuWzldPXIubGVuZ3RoO3IucHVzaChbKC00KnJbblsxMl1dWzBdLXJbblszXV1bMF0rNioocltuWzhdXVswXStyW25bMTNdXVswXSktMioocltuWzBdXVswXStyW25bMTVdXVswXSkrMyoocltuWzExXV1bMF0rcltuWzFdXVswXSkpLzksKC00KnJbblsxMl1dWzFdLXJbblszXV1bMV0rNioocltuWzhdXVsxXStyW25bMTNdXVsxXSktMioocltuWzBdXVsxXStyW25bMTVdXVsxXSkrMyoocltuWzExXV1bMV0rcltuWzFdXVsxXSkpLzldKTtuWzEwXT1yLmxlbmd0aDtyLnB1c2goWygtNCpyW25bMTVdXVswXS1yW25bMF1dWzBdKzYqKHJbblsxMV1dWzBdK3JbblsxNF1dWzBdKS0yKihyW25bMTJdXVswXStyW25bM11dWzBdKSszKihyW25bMl1dWzBdK3Jbbls4XV1bMF0pKS85LCgtNCpyW25bMTVdXVsxXS1yW25bMF1dWzFdKzYqKHJbblsxMV1dWzFdK3JbblsxNF1dWzFdKS0yKihyW25bMTJdXVsxXStyW25bM11dWzFdKSszKihyW25bMl1dWzFdK3Jbbls4XV1bMV0pKS85XSk7ZS5maWd1cmVzLnB1c2goe3R5cGU6InBhdGNoIixjb29yZHM6bmV3IEludDMyQXJyYXkobiksY29sb3JzOm5ldyBJbnQzMkFycmF5KHMpfSl9fSh0aGlzLHkpO3Y9ITA7YnJlYWs7Y2FzZSBkOiFmdW5jdGlvbiBkZWNvZGVUeXBlN1NoYWRpbmcoZSx0KXtmb3IodmFyIHI9ZS5jb29yZHMsaT1lLmNvbG9ycyxuPW5ldyBJbnQzMkFycmF5KDE2KSxzPW5ldyBJbnQzMkFycmF5KDQpO3QuaGFzRGF0YTspe3ZhciBvLGMsbD10LnJlYWRGbGFnKCk7aWYoISgwPD1sJiZsPD0zKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNyBmbGFnIik7dmFyIGg9ci5sZW5ndGg7Zm9yKG89MCxjPTAhPT1sPzEyOjE2O288YztvKyspci5wdXNoKHQucmVhZENvb3JkaW5hdGUoKSk7dmFyIHUsZCxmLGcsbT1pLmxlbmd0aDtmb3Iobz0wLGM9MCE9PWw/Mjo0O288YztvKyspaS5wdXNoKHQucmVhZENvbXBvbmVudHMoKSk7c3dpdGNoKGwpe2Nhc2UgMDpuWzEyXT1oKzM7blsxM109aCs0O25bMTRdPWgrNTtuWzE1XT1oKzY7bls4XT1oKzI7bls5XT1oKzEzO25bMTBdPWgrMTQ7blsxMV09aCs3O25bNF09aCsxO25bNV09aCsxMjtuWzZdPWgrMTU7bls3XT1oKzg7blswXT1oO25bMV09aCsxMTtuWzJdPWgrMTA7blszXT1oKzk7c1syXT1tKzE7c1szXT1tKzI7c1swXT1tO3NbMV09bSszO2JyZWFrO2Nhc2UgMTp1PW5bMTJdO2Q9blsxM107Zj1uWzE0XTtnPW5bMTVdO25bMTJdPWc7blsxM109aCswO25bMTRdPWgrMTtuWzE1XT1oKzI7bls4XT1mO25bOV09aCs5O25bMTBdPWgrMTA7blsxMV09aCszO25bNF09ZDtuWzVdPWgrODtuWzZdPWgrMTE7bls3XT1oKzQ7blswXT11O25bMV09aCs3O25bMl09aCs2O25bM109aCs1O3U9c1syXTtkPXNbM107c1syXT1kO3NbM109bTtzWzBdPXU7c1sxXT1tKzE7YnJlYWs7Y2FzZSAyOnU9blsxNV07ZD1uWzExXTtuWzEyXT1uWzNdO25bMTNdPWgrMDtuWzE0XT1oKzE7blsxNV09aCsyO25bOF09bls3XTtuWzldPWgrOTtuWzEwXT1oKzEwO25bMTFdPWgrMztuWzRdPWQ7bls1XT1oKzg7bls2XT1oKzExO25bN109aCs0O25bMF09dTtuWzFdPWgrNztuWzJdPWgrNjtuWzNdPWgrNTt1PXNbM107c1syXT1zWzFdO3NbM109bTtzWzBdPXU7c1sxXT1tKzE7YnJlYWs7Y2FzZSAzOm5bMTJdPW5bMF07blsxM109aCswO25bMTRdPWgrMTtuWzE1XT1oKzI7bls4XT1uWzFdO25bOV09aCs5O25bMTBdPWgrMTA7blsxMV09aCszO25bNF09blsyXTtuWzVdPWgrODtuWzZdPWgrMTE7bls3XT1oKzQ7blswXT1uWzNdO25bMV09aCs3O25bMl09aCs2O25bM109aCs1O3NbMl09c1swXTtzWzNdPW07c1swXT1zWzFdO3NbMV09bSsxfWUuZmlndXJlcy5wdXNoKHt0eXBlOiJwYXRjaCIsY29vcmRzOm5ldyBJbnQzMkFycmF5KG4pLGNvbG9yczpuZXcgSW50MzJBcnJheShzKX0pfX0odGhpcyx5KTt2PSEwO2JyZWFrO2RlZmF1bHQ6KDAsYS51bnJlYWNoYWJsZSkoIlVuc3VwcG9ydGVkIG1lc2ggdHlwZS4iKX1pZih2KXt1cGRhdGVCb3VuZHModGhpcyk7Zm9yKHZhciBrPTAsUz10aGlzLmZpZ3VyZXMubGVuZ3RoO2s8UztrKyspYnVpbGRGaWd1cmVGcm9tUGF0Y2godGhpcyxrKX11cGRhdGVCb3VuZHModGhpcyk7IWZ1bmN0aW9uIHBhY2tEYXRhKGUpe3ZhciB0LHIsYSxpLG49ZS5jb29yZHMscz1uZXcgRmxvYXQzMkFycmF5KDIqbi5sZW5ndGgpO2Zvcih0PTAsYT0wLHI9bi5sZW5ndGg7dDxyO3QrKyl7dmFyIG89blt0XTtzW2ErK109b1swXTtzW2ErK109b1sxXX1lLmNvb3Jkcz1zO3ZhciBjPWUuY29sb3JzLGw9bmV3IFVpbnQ4QXJyYXkoMypjLmxlbmd0aCk7Zm9yKHQ9MCxhPTAscj1jLmxlbmd0aDt0PHI7dCsrKXt2YXIgaD1jW3RdO2xbYSsrXT1oWzBdO2xbYSsrXT1oWzFdO2xbYSsrXT1oWzJdfWUuY29sb3JzPWw7dmFyIHU9ZS5maWd1cmVzO2Zvcih0PTAscj11Lmxlbmd0aDt0PHI7dCsrKXt2YXIgZD11W3RdLGY9ZC5jb29yZHMsZz1kLmNvbG9ycztmb3IoYT0wLGk9Zi5sZW5ndGg7YTxpO2ErKyl7ZlthXSo9MjtnW2FdKj0zfX19KHRoaXMpfU1lc2gucHJvdG90eXBlPXtnZXRJUjpmdW5jdGlvbiBNZXNoX2dldElSKCl7cmV0dXJuWyJNZXNoIix0aGlzLnNoYWRpbmdUeXBlLHRoaXMuY29vcmRzLHRoaXMuY29sb3JzLHRoaXMuZmlndXJlcyx0aGlzLmJvdW5kcyx0aGlzLm1hdHJpeCx0aGlzLmJib3gsdGhpcy5iYWNrZ3JvdW5kXX19O3JldHVybiBNZXNofSgpO2cuRHVtbXk9ZnVuY3Rpb24gRHVtbXlDbG9zdXJlKCl7ZnVuY3Rpb24gRHVtbXkoKXt0aGlzLnR5cGU9IlBhdHRlcm4ifUR1bW15LnByb3RvdHlwZT17Z2V0SVI6ZnVuY3Rpb24gRHVtbXlfZ2V0SVIoKXtyZXR1cm5bIkR1bW15Il19fTtyZXR1cm4gRHVtbXl9KCl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuaXNQREZGdW5jdGlvbj1mdW5jdGlvbiBpc1BERkZ1bmN0aW9uKGUpe3ZhciB0O2lmKCJvYmplY3QiIT10eXBlb2YgZSlyZXR1cm4hMTtpZigoMCxhLmlzRGljdCkoZSkpdD1lO2Vsc2V7aWYoISgwLGEuaXNTdHJlYW0pKGUpKXJldHVybiExO3Q9ZS5kaWN0fXJldHVybiB0LmhhcygiRnVuY3Rpb25UeXBlIil9O3QuUG9zdFNjcmlwdENvbXBpbGVyPXQuUG9zdFNjcmlwdEV2YWx1YXRvcj10LlBERkZ1bmN0aW9uRmFjdG9yeT12b2lkIDA7dmFyIGE9cig1KSxpPXIoMiksbj1yKDQxKSxzPXIoMjQpO3QuUERGRnVuY3Rpb25GYWN0b3J5PWNsYXNzIFBERkZ1bmN0aW9uRmFjdG9yeXtjb25zdHJ1Y3Rvcih7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0PSEwfSl7dGhpcy54cmVmPWU7dGhpcy5pc0V2YWxTdXBwb3J0ZWQ9ITEhPT10O3RoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZT1udWxsfWNyZWF0ZShlKXtjb25zdCB0PXRoaXMuZ2V0Q2FjaGVkKGUpO2lmKHQpcmV0dXJuIHQ7Y29uc3Qgcj1vLnBhcnNlKHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5pc0V2YWxTdXBwb3J0ZWQsZm46ZSBpbnN0YW5jZW9mIGEuUmVmP3RoaXMueHJlZi5mZXRjaChlKTplfSk7dGhpcy5fY2FjaGUoZSxyKTtyZXR1cm4gcn1jcmVhdGVGcm9tQXJyYXkoZSl7Y29uc3QgdD10aGlzLmdldENhY2hlZChlKTtpZih0KXJldHVybiB0O2NvbnN0IHI9by5wYXJzZUFycmF5KHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5pc0V2YWxTdXBwb3J0ZWQsZm5PYmo6ZSBpbnN0YW5jZW9mIGEuUmVmP3RoaXMueHJlZi5mZXRjaChlKTplfSk7dGhpcy5fY2FjaGUoZSxyKTtyZXR1cm4gcn1nZXRDYWNoZWQoZSl7bGV0IHQ7ZSBpbnN0YW5jZW9mIGEuUmVmP3Q9ZTplIGluc3RhbmNlb2YgYS5EaWN0P3Q9ZS5vYmpJZDooMCxhLmlzU3RyZWFtKShlKSYmKHQ9ZS5kaWN0JiZlLmRpY3Qub2JqSWQpO2lmKHQpe3RoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZXx8KHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZT1uZXcgcy5Mb2NhbEZ1bmN0aW9uQ2FjaGUpO2NvbnN0IGU9dGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlLmdldEJ5UmVmKHQpO2lmKGUpcmV0dXJuIGV9cmV0dXJuIG51bGx9X2NhY2hlKGUsdCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCdQREZGdW5jdGlvbkZhY3RvcnkuX2NhY2hlIC0gZXhwZWN0ZWQgInBhcnNlZEZ1bmN0aW9uIiBhcmd1bWVudC4nKTtsZXQgcjtlIGluc3RhbmNlb2YgYS5SZWY/cj1lOmUgaW5zdGFuY2VvZiBhLkRpY3Q/cj1lLm9iaklkOigwLGEuaXNTdHJlYW0pKGUpJiYocj1lLmRpY3QmJmUuZGljdC5vYmpJZCk7aWYocil7dGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlfHwodGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlPW5ldyBzLkxvY2FsRnVuY3Rpb25DYWNoZSk7dGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlLnNldChudWxsLHIsdCl9fX07ZnVuY3Rpb24gdG9OdW1iZXJBcnJheShlKXtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gbnVsbDtjb25zdCB0PWUubGVuZ3RoO2ZvcihsZXQgcj0wO3I8dDtyKyspaWYoIm51bWJlciIhPXR5cGVvZiBlW3JdKXtjb25zdCByPW5ldyBBcnJheSh0KTtmb3IobGV0IGE9MDthPHQ7YSsrKXJbYV09K2VbYV07cmV0dXJuIHJ9cmV0dXJuIGV9dmFyIG89ZnVuY3Rpb24gUERGRnVuY3Rpb25DbG9zdXJlKCl7cmV0dXJue2dldFNhbXBsZUFycmF5KGUsdCxyLGEpe3ZhciBpLG4scz0xO2ZvcihpPTAsbj1lLmxlbmd0aDtpPG47aSsrKXMqPWVbaV07cyo9dDt2YXIgbz1uZXcgQXJyYXkocyksYz0wLGw9MCxoPTEvKDIqKnItMSksdT1hLmdldEJ5dGVzKChzKnIrNykvOCksZD0wO2ZvcihpPTA7aTxzO2krKyl7Zm9yKDtjPHI7KXtsPDw9ODtsfD11W2QrK107Yys9OH1jLT1yO29baV09KGw+PmMpKmg7bCY9KDE8PGMpLTF9cmV0dXJuIG99LGdldElSKHt4cmVmOmUsaXNFdmFsU3VwcG9ydGVkOnQsZm46cn0pe3ZhciBhPXIuZGljdDthfHwoYT1yKTt2YXIgbj1bdGhpcy5jb25zdHJ1Y3RTYW1wbGVkLG51bGwsdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQsdGhpcy5jb25zdHJ1Y3RTdGljaGVkLHRoaXMuY29uc3RydWN0UG9zdFNjcmlwdF1bYS5nZXQoIkZ1bmN0aW9uVHlwZSIpXTtpZighbil0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlIG9mIGZ1bmN0aW9uIik7cmV0dXJuIG4uY2FsbCh0aGlzLHt4cmVmOmUsaXNFdmFsU3VwcG9ydGVkOnQsZm46cixkaWN0OmF9KX0sZnJvbUlSKHt4cmVmOmUsaXNFdmFsU3VwcG9ydGVkOnQsSVI6cn0pe3N3aXRjaChyWzBdKXtjYXNlIDA6cmV0dXJuIHRoaXMuY29uc3RydWN0U2FtcGxlZEZyb21JUih7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0LElSOnJ9KTtjYXNlIDI6cmV0dXJuIHRoaXMuY29uc3RydWN0SW50ZXJwb2xhdGVkRnJvbUlSKHt4cmVmOmUsaXNFdmFsU3VwcG9ydGVkOnQsSVI6cn0pO2Nhc2UgMzpyZXR1cm4gdGhpcy5jb25zdHJ1Y3RTdGljaGVkRnJvbUlSKHt4cmVmOmUsaXNFdmFsU3VwcG9ydGVkOnQsSVI6cn0pO2RlZmF1bHQ6cmV0dXJuIHRoaXMuY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUih7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0LElSOnJ9KX19LHBhcnNlKHt4cmVmOmUsaXNFdmFsU3VwcG9ydGVkOnQsZm46cn0pe2NvbnN0IGE9dGhpcy5nZXRJUih7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0LGZuOnJ9KTtyZXR1cm4gdGhpcy5mcm9tSVIoe3hyZWY6ZSxpc0V2YWxTdXBwb3J0ZWQ6dCxJUjphfSl9LHBhcnNlQXJyYXkoe3hyZWY6ZSxpc0V2YWxTdXBwb3J0ZWQ6dCxmbk9iajpyfSl7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuIHRoaXMucGFyc2Uoe3hyZWY6ZSxpc0V2YWxTdXBwb3J0ZWQ6dCxmbjpyfSk7Zm9yKHZhciBhPVtdLGk9MCxuPXIubGVuZ3RoO2k8bjtpKyspYS5wdXNoKHRoaXMucGFyc2Uoe3hyZWY6ZSxpc0V2YWxTdXBwb3J0ZWQ6dCxmbjplLmZldGNoSWZSZWYocltpXSl9KSk7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyLGkpe2Zvcih2YXIgbj0wLHM9YS5sZW5ndGg7bjxzO24rKylhW25dKGUsdCxyLGkrbil9fSxjb25zdHJ1Y3RTYW1wbGVkKHt4cmVmOmUsaXNFdmFsU3VwcG9ydGVkOnQsZm46cixkaWN0OmF9KXtmdW5jdGlvbiB0b011bHRpQXJyYXkoZSl7Zm9yKHZhciB0PWUubGVuZ3RoLHI9W10sYT0wLGk9MDtpPHQ7aSs9Mil7clthXT1bZVtpXSxlW2krMV1dOysrYX1yZXR1cm4gcn12YXIgbj10b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIkRvbWFpbiIpKSxzPXRvTnVtYmVyQXJyYXkoYS5nZXRBcnJheSgiUmFuZ2UiKSk7aWYoIW58fCFzKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJObyBkb21haW4gb3IgcmFuZ2UiKTt2YXIgbz1uLmxlbmd0aC8yLGM9cy5sZW5ndGgvMjtuPXRvTXVsdGlBcnJheShuKTtzPXRvTXVsdGlBcnJheShzKTt2YXIgbD10b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIlNpemUiKSksaD1hLmdldCgiQml0c1BlclNhbXBsZSIpLHU9YS5nZXQoIk9yZGVyIil8fDE7MSE9PXUmJigwLGkuaW5mbykoIk5vIHN1cHBvcnQgZm9yIGN1YmljIHNwbGluZSBpbnRlcnBvbGF0aW9uOiAiK3UpO3ZhciBkPXRvTnVtYmVyQXJyYXkoYS5nZXRBcnJheSgiRW5jb2RlIikpO2lmKGQpZD10b011bHRpQXJyYXkoZCk7ZWxzZXtkPVtdO2Zvcih2YXIgZj0wO2Y8bzsrK2YpZC5wdXNoKFswLGxbZl0tMV0pfXZhciBnPXRvTnVtYmVyQXJyYXkoYS5nZXRBcnJheSgiRGVjb2RlIikpO3JldHVyblswLG8sbixkLGc9Zz90b011bHRpQXJyYXkoZyk6cyx0aGlzLmdldFNhbXBsZUFycmF5KGwsYyxoLHIpLGwsYywyKipoLTEsc119LGNvbnN0cnVjdFNhbXBsZWRGcm9tSVIoe3hyZWY6ZSxpc0V2YWxTdXBwb3J0ZWQ6dCxJUjpyfSl7ZnVuY3Rpb24gaW50ZXJwb2xhdGUoZSx0LHIsYSxpKXtyZXR1cm4gYSsoaS1hKS8oci10KSooZS10KX1yZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0U2FtcGxlZEZyb21JUlJlc3VsdChlLHQsYSxpKXt2YXIgbixzLG89clsxXSxjPXJbMl0sbD1yWzNdLGg9cls0XSx1PXJbNV0sZD1yWzZdLGY9cls3XSxnPXJbOV0sbT0xPDxvLHA9bmV3IEZsb2F0NjRBcnJheShtKSxiPW5ldyBVaW50MzJBcnJheShtKTtmb3Iocz0wO3M8bTtzKyspcFtzXT0xO3ZhciB5PWYsdj0xO2ZvcihuPTA7bjxvOysrbil7dmFyIHc9Y1tuXVswXSxrPWNbbl1bMV0sUz1pbnRlcnBvbGF0ZShNYXRoLm1pbihNYXRoLm1heChlW3Qrbl0sdyksayksdyxrLGxbbl1bMF0sbFtuXVsxXSksQz1kW25dLHg9KFM9TWF0aC5taW4oTWF0aC5tYXgoUywwKSxDLTEpKTxDLTE/TWF0aC5mbG9vcihTKTpTLTEsQT14KzEtUyxUPVMteCxJPXgqeSxGPUkreTtmb3Iocz0wO3M8bTtzKyspaWYocyZ2KXtwW3NdKj1UO2Jbc10rPUZ9ZWxzZXtwW3NdKj1BO2Jbc10rPUl9eSo9Qzt2PDw9MX1mb3Iocz0wO3M8ZjsrK3Mpe3ZhciBQPTA7Zm9yKG49MDtuPG07bisrKVArPXVbYltuXStzXSpwW25dO1A9aW50ZXJwb2xhdGUoUCwwLDEsaFtzXVswXSxoW3NdWzFdKTthW2krc109TWF0aC5taW4oTWF0aC5tYXgoUCxnW3NdWzBdKSxnW3NdWzFdKX19fSxjb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoe3hyZWY6ZSxpc0V2YWxTdXBwb3J0ZWQ6dCxmbjpyLGRpY3Q6YX0pe2Zvcih2YXIgaT10b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIkMwIikpfHxbMF0sbj10b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIkMxIikpfHxbMV0scz1hLmdldCgiTiIpLG89aS5sZW5ndGgsYz1bXSxsPTA7bDxvOysrbCljLnB1c2gobltsXS1pW2xdKTtyZXR1cm5bMixpLGMsc119LGNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUih7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0LElSOnJ9KXt2YXIgYT1yWzFdLGk9clsyXSxuPXJbM10scz1pLmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0SW50ZXJwb2xhdGVkRnJvbUlSUmVzdWx0KGUsdCxyLG8pe2Zvcih2YXIgYz0xPT09bj9lW3RdOmVbdF0qKm4sbD0wO2w8czsrK2wpcltvK2xdPWFbbF0rYyppW2xdfX0sY29uc3RydWN0U3RpY2hlZCh7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0LGZuOnIsZGljdDphfSl7dmFyIG49dG9OdW1iZXJBcnJheShhLmdldEFycmF5KCJEb21haW4iKSk7aWYoIW4pdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiIpO2lmKDEhPT1uLmxlbmd0aC8yKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJCYWQgZG9tYWluIGZvciBzdGljaGVkIGZ1bmN0aW9uIik7Zm9yKHZhciBzPWEuZ2V0KCJGdW5jdGlvbnMiKSxvPVtdLGM9MCxsPXMubGVuZ3RoO2M8bDsrK2Mpby5wdXNoKHRoaXMucGFyc2Uoe3hyZWY6ZSxpc0V2YWxTdXBwb3J0ZWQ6dCxmbjplLmZldGNoSWZSZWYoc1tjXSl9KSk7cmV0dXJuWzMsbix0b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIkJvdW5kcyIpKSx0b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIkVuY29kZSIpKSxvXX0sY29uc3RydWN0U3RpY2hlZEZyb21JUih7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0LElSOnJ9KXt2YXIgYT1yWzFdLGk9clsyXSxuPXJbM10scz1yWzRdLG89bmV3IEZsb2F0MzJBcnJheSgxKTtyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0U3RpY2hlZEZyb21JUlJlc3VsdChlLHQscixjKXtmb3IodmFyIGw9ZnVuY3Rpb24gY29uc3RydWN0U3RpY2hlZEZyb21JUkNsaXAoZSx0LHIpe2U+cj9lPXI6ZTx0JiYoZT10KTtyZXR1cm4gZX0oZVt0XSxhWzBdLGFbMV0pLGg9MCx1PWkubGVuZ3RoO2g8dSYmIShsPGlbaF0pOysraCk7dmFyIGQ9YVswXTtoPjAmJihkPWlbaC0xXSk7dmFyIGY9YVsxXTtoPGkubGVuZ3RoJiYoZj1pW2hdKTt2YXIgZz1uWzIqaF0sbT1uWzIqaCsxXTtvWzBdPWQ9PT1mP2c6ZysobC1kKSoobS1nKS8oZi1kKTtzW2hdKG8sMCxyLGMpfX0sY29uc3RydWN0UG9zdFNjcmlwdCh7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0LGZuOnIsZGljdDphfSl7dmFyIHM9dG9OdW1iZXJBcnJheShhLmdldEFycmF5KCJEb21haW4iKSksbz10b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIlJhbmdlIikpO2lmKCFzKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJObyBkb21haW4uIik7aWYoIW8pdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIk5vIHJhbmdlLiIpO3ZhciBjPW5ldyBuLlBvc3RTY3JpcHRMZXhlcihyKTtyZXR1cm5bNCxzLG8sbmV3IG4uUG9zdFNjcmlwdFBhcnNlcihjKS5wYXJzZSgpXX0sY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUih7eHJlZjplLGlzRXZhbFN1cHBvcnRlZDp0LElSOnJ9KXt2YXIgYT1yWzFdLG49clsyXSxzPXJbM107aWYodCYmaS5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQudmFsdWUpe2NvbnN0IGU9KG5ldyBoKS5jb21waWxlKHMsYSxuKTtpZihlKXJldHVybiBuZXcgRnVuY3Rpb24oInNyYyIsInNyY09mZnNldCIsImRlc3QiLCJkZXN0T2Zmc2V0IixlKX0oMCxpLmluZm8pKCJVbmFibGUgdG8gY29tcGlsZSBQUyBmdW5jdGlvbiIpO3ZhciBvPW4ubGVuZ3RoPj4xLGM9YS5sZW5ndGg+PjEsdT1uZXcgbChzKSxkPU9iamVjdC5jcmVhdGUobnVsbCksZj04MTkyLGc9bmV3IEZsb2F0MzJBcnJheShjKTtyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUlJlc3VsdChlLHQscixhKXt2YXIgaSxzLGw9IiIsaD1nO2ZvcihpPTA7aTxjO2krKyl7cz1lW3QraV07aFtpXT1zO2wrPXMrIl8ifXZhciBtPWRbbF07aWYodm9pZCAwPT09bSl7dmFyIHA9bmV3IEZsb2F0MzJBcnJheShvKSxiPXUuZXhlY3V0ZShoKSx5PWIubGVuZ3RoLW87Zm9yKGk9MDtpPG87aSsrKXtzPWJbeStpXTt2YXIgdj1uWzIqaV07KHM8dnx8cz4odj1uWzIqaSsxXSkpJiYocz12KTtwW2ldPXN9aWYoZj4wKXtmLS07ZFtsXT1wfXIuc2V0KHAsYSl9ZWxzZSByLnNldChtLGEpfX19fSgpO3ZhciBjPWZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja0Nsb3N1cmUoKXtmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2soZSl7dGhpcy5zdGFjaz1lP0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUsMCk6W119UG9zdFNjcmlwdFN0YWNrLnByb3RvdHlwZT17cHVzaDpmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcHVzaChlKXtpZih0aGlzLnN0YWNrLmxlbmd0aD49MTAwKXRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy4iKTt0aGlzLnN0YWNrLnB1c2goZSl9LHBvcDpmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcG9wKCl7aWYodGhpcy5zdGFjay5sZW5ndGg8PTApdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIHVuZGVyZmxvdy4iKTtyZXR1cm4gdGhpcy5zdGFjay5wb3AoKX0sY29weTpmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfY29weShlKXtpZih0aGlzLnN0YWNrLmxlbmd0aCtlPj0xMDApdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpO2Zvcih2YXIgdD10aGlzLnN0YWNrLHI9dC5sZW5ndGgtZSxhPWUtMTthPj0wO2EtLSxyKyspdC5wdXNoKHRbcl0pfSxpbmRleDpmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfaW5kZXgoZSl7dGhpcy5wdXNoKHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtZS0xXSl9LHJvbGw6ZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX3JvbGwoZSx0KXt2YXIgcixhLGksbj10aGlzLnN0YWNrLHM9bi5sZW5ndGgtZSxvPW4ubGVuZ3RoLTEsYz1zKyh0LU1hdGguZmxvb3IodC9lKSplKTtmb3Iocj1zLGE9bztyPGE7cisrLGEtLSl7aT1uW3JdO25bcl09blthXTtuW2FdPWl9Zm9yKHI9cyxhPWMtMTtyPGE7cisrLGEtLSl7aT1uW3JdO25bcl09blthXTtuW2FdPWl9Zm9yKHI9YyxhPW87cjxhO3IrKyxhLS0pe2k9bltyXTtuW3JdPW5bYV07blthXT1pfX19O3JldHVybiBQb3N0U2NyaXB0U3RhY2t9KCksbD1mdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yQ2xvc3VyZSgpe2Z1bmN0aW9uIFBvc3RTY3JpcHRFdmFsdWF0b3IoZSl7dGhpcy5vcGVyYXRvcnM9ZX1Qb3N0U2NyaXB0RXZhbHVhdG9yLnByb3RvdHlwZT17ZXhlY3V0ZTpmdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yX2V4ZWN1dGUoZSl7Zm9yKHZhciB0LHIsYSxuPW5ldyBjKGUpLHM9MCxvPXRoaXMub3BlcmF0b3JzLGw9by5sZW5ndGg7czxsOylpZigibnVtYmVyIiE9dHlwZW9mKHQ9b1tzKytdKSlzd2l0Y2godCl7Y2FzZSJqeiI6YT1uLnBvcCgpOyhyPW4ucG9wKCkpfHwocz1hKTticmVhaztjYXNlImoiOnM9cj1uLnBvcCgpO2JyZWFrO2Nhc2UiYWJzIjpyPW4ucG9wKCk7bi5wdXNoKE1hdGguYWJzKHIpKTticmVhaztjYXNlImFkZCI6YT1uLnBvcCgpO3I9bi5wb3AoKTtuLnB1c2gocithKTticmVhaztjYXNlImFuZCI6YT1uLnBvcCgpO3I9bi5wb3AoKTsoMCxpLmlzQm9vbCkocikmJigwLGkuaXNCb29sKShhKT9uLnB1c2gociYmYSk6bi5wdXNoKHImYSk7YnJlYWs7Y2FzZSJhdGFuIjpyPW4ucG9wKCk7bi5wdXNoKE1hdGguYXRhbihyKSk7YnJlYWs7Y2FzZSJiaXRzaGlmdCI6YT1uLnBvcCgpOyhyPW4ucG9wKCkpPjA/bi5wdXNoKHI8PGEpOm4ucHVzaChyPj5hKTticmVhaztjYXNlImNlaWxpbmciOnI9bi5wb3AoKTtuLnB1c2goTWF0aC5jZWlsKHIpKTticmVhaztjYXNlImNvcHkiOnI9bi5wb3AoKTtuLmNvcHkocik7YnJlYWs7Y2FzZSJjb3MiOnI9bi5wb3AoKTtuLnB1c2goTWF0aC5jb3MocikpO2JyZWFrO2Nhc2UiY3ZpIjpyPTB8bi5wb3AoKTtuLnB1c2gocik7YnJlYWs7Y2FzZSJjdnIiOmJyZWFrO2Nhc2UiZGl2IjphPW4ucG9wKCk7cj1uLnBvcCgpO24ucHVzaChyL2EpO2JyZWFrO2Nhc2UiZHVwIjpuLmNvcHkoMSk7YnJlYWs7Y2FzZSJlcSI6YT1uLnBvcCgpO3I9bi5wb3AoKTtuLnB1c2gocj09PWEpO2JyZWFrO2Nhc2UiZXhjaCI6bi5yb2xsKDIsMSk7YnJlYWs7Y2FzZSJleHAiOmE9bi5wb3AoKTtyPW4ucG9wKCk7bi5wdXNoKHIqKmEpO2JyZWFrO2Nhc2UiZmFsc2UiOm4ucHVzaCghMSk7YnJlYWs7Y2FzZSJmbG9vciI6cj1uLnBvcCgpO24ucHVzaChNYXRoLmZsb29yKHIpKTticmVhaztjYXNlImdlIjphPW4ucG9wKCk7cj1uLnBvcCgpO24ucHVzaChyPj1hKTticmVhaztjYXNlImd0IjphPW4ucG9wKCk7cj1uLnBvcCgpO24ucHVzaChyPmEpO2JyZWFrO2Nhc2UiaWRpdiI6YT1uLnBvcCgpO3I9bi5wb3AoKTtuLnB1c2goci9hfDApO2JyZWFrO2Nhc2UiaW5kZXgiOnI9bi5wb3AoKTtuLmluZGV4KHIpO2JyZWFrO2Nhc2UibGUiOmE9bi5wb3AoKTtyPW4ucG9wKCk7bi5wdXNoKHI8PWEpO2JyZWFrO2Nhc2UibG4iOnI9bi5wb3AoKTtuLnB1c2goTWF0aC5sb2cocikpO2JyZWFrO2Nhc2UibG9nIjpyPW4ucG9wKCk7bi5wdXNoKE1hdGgubG9nKHIpL01hdGguTE4xMCk7YnJlYWs7Y2FzZSJsdCI6YT1uLnBvcCgpO3I9bi5wb3AoKTtuLnB1c2gocjxhKTticmVhaztjYXNlIm1vZCI6YT1uLnBvcCgpO3I9bi5wb3AoKTtuLnB1c2gociVhKTticmVhaztjYXNlIm11bCI6YT1uLnBvcCgpO3I9bi5wb3AoKTtuLnB1c2gociphKTticmVhaztjYXNlIm5lIjphPW4ucG9wKCk7cj1uLnBvcCgpO24ucHVzaChyIT09YSk7YnJlYWs7Y2FzZSJuZWciOnI9bi5wb3AoKTtuLnB1c2goLXIpO2JyZWFrO2Nhc2Uibm90IjpyPW4ucG9wKCk7KDAsaS5pc0Jvb2wpKHIpP24ucHVzaCghcik6bi5wdXNoKH5yKTticmVhaztjYXNlIm9yIjphPW4ucG9wKCk7cj1uLnBvcCgpOygwLGkuaXNCb29sKShyKSYmKDAsaS5pc0Jvb2wpKGEpP24ucHVzaChyfHxhKTpuLnB1c2gocnxhKTticmVhaztjYXNlInBvcCI6bi5wb3AoKTticmVhaztjYXNlInJvbGwiOmE9bi5wb3AoKTtyPW4ucG9wKCk7bi5yb2xsKHIsYSk7YnJlYWs7Y2FzZSJyb3VuZCI6cj1uLnBvcCgpO24ucHVzaChNYXRoLnJvdW5kKHIpKTticmVhaztjYXNlInNpbiI6cj1uLnBvcCgpO24ucHVzaChNYXRoLnNpbihyKSk7YnJlYWs7Y2FzZSJzcXJ0IjpyPW4ucG9wKCk7bi5wdXNoKE1hdGguc3FydChyKSk7YnJlYWs7Y2FzZSJzdWIiOmE9bi5wb3AoKTtyPW4ucG9wKCk7bi5wdXNoKHItYSk7YnJlYWs7Y2FzZSJ0cnVlIjpuLnB1c2goITApO2JyZWFrO2Nhc2UidHJ1bmNhdGUiOnI9KHI9bi5wb3AoKSk8MD9NYXRoLmNlaWwocik6TWF0aC5mbG9vcihyKTtuLnB1c2gocik7YnJlYWs7Y2FzZSJ4b3IiOmE9bi5wb3AoKTtyPW4ucG9wKCk7KDAsaS5pc0Jvb2wpKHIpJiYoMCxpLmlzQm9vbCkoYSk/bi5wdXNoKHIhPT1hKTpuLnB1c2gocl5hKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJVbmtub3duIG9wZXJhdG9yICIrdCl9ZWxzZSBuLnB1c2godCk7cmV0dXJuIG4uc3RhY2t9fTtyZXR1cm4gUG9zdFNjcmlwdEV2YWx1YXRvcn0oKTt0LlBvc3RTY3JpcHRFdmFsdWF0b3I9bDt2YXIgaD1mdW5jdGlvbiBQb3N0U2NyaXB0Q29tcGlsZXJDbG9zdXJlKCl7ZnVuY3Rpb24gQXN0Tm9kZShlKXt0aGlzLnR5cGU9ZX1Bc3ROb2RlLnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbihlKXsoMCxpLnVucmVhY2hhYmxlKSgiYWJzdHJhY3QgbWV0aG9kIil9O2Z1bmN0aW9uIEFzdEFyZ3VtZW50KGUsdCxyKXtBc3ROb2RlLmNhbGwodGhpcywiYXJncyIpO3RoaXMuaW5kZXg9ZTt0aGlzLm1pbj10O3RoaXMubWF4PXJ9QXN0QXJndW1lbnQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpO0FzdEFyZ3VtZW50LnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbihlKXtlLnZpc2l0QXJndW1lbnQodGhpcyl9O2Z1bmN0aW9uIEFzdExpdGVyYWwoZSl7QXN0Tm9kZS5jYWxsKHRoaXMsImxpdGVyYWwiKTt0aGlzLm51bWJlcj1lO3RoaXMubWluPWU7dGhpcy5tYXg9ZX1Bc3RMaXRlcmFsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtBc3RMaXRlcmFsLnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbihlKXtlLnZpc2l0TGl0ZXJhbCh0aGlzKX07ZnVuY3Rpb24gQXN0QmluYXJ5T3BlcmF0aW9uKGUsdCxyLGEsaSl7QXN0Tm9kZS5jYWxsKHRoaXMsImJpbmFyeSIpO3RoaXMub3A9ZTt0aGlzLmFyZzE9dDt0aGlzLmFyZzI9cjt0aGlzLm1pbj1hO3RoaXMubWF4PWl9QXN0QmluYXJ5T3BlcmF0aW9uLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtBc3RCaW5hcnlPcGVyYXRpb24ucHJvdG90eXBlLnZpc2l0PWZ1bmN0aW9uKGUpe2UudmlzaXRCaW5hcnlPcGVyYXRpb24odGhpcyl9O2Z1bmN0aW9uIEFzdE1pbihlLHQpe0FzdE5vZGUuY2FsbCh0aGlzLCJtYXgiKTt0aGlzLmFyZz1lO3RoaXMubWluPWUubWluO3RoaXMubWF4PXR9QXN0TWluLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtBc3RNaW4ucHJvdG90eXBlLnZpc2l0PWZ1bmN0aW9uKGUpe2UudmlzaXRNaW4odGhpcyl9O2Z1bmN0aW9uIEFzdFZhcmlhYmxlKGUsdCxyKXtBc3ROb2RlLmNhbGwodGhpcywidmFyIik7dGhpcy5pbmRleD1lO3RoaXMubWluPXQ7dGhpcy5tYXg9cn1Bc3RWYXJpYWJsZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBc3ROb2RlLnByb3RvdHlwZSk7QXN0VmFyaWFibGUucHJvdG90eXBlLnZpc2l0PWZ1bmN0aW9uKGUpe2UudmlzaXRWYXJpYWJsZSh0aGlzKX07ZnVuY3Rpb24gQXN0VmFyaWFibGVEZWZpbml0aW9uKGUsdCl7QXN0Tm9kZS5jYWxsKHRoaXMsImRlZmluaXRpb24iKTt0aGlzLnZhcmlhYmxlPWU7dGhpcy5hcmc9dH1Bc3RWYXJpYWJsZURlZmluaXRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpO0FzdFZhcmlhYmxlRGVmaW5pdGlvbi5wcm90b3R5cGUudmlzaXQ9ZnVuY3Rpb24oZSl7ZS52aXNpdFZhcmlhYmxlRGVmaW5pdGlvbih0aGlzKX07ZnVuY3Rpb24gRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yKCl7dGhpcy5wYXJ0cz1bXX1FeHByZXNzaW9uQnVpbGRlclZpc2l0b3IucHJvdG90eXBlPXt2aXNpdEFyZ3VtZW50KGUpe3RoaXMucGFydHMucHVzaCgiTWF0aC5tYXgoIixlLm1pbiwiLCBNYXRoLm1pbigiLGUubWF4LCIsIHNyY1tzcmNPZmZzZXQgKyAiLGUuaW5kZXgsIl0pKSIpfSx2aXNpdFZhcmlhYmxlKGUpe3RoaXMucGFydHMucHVzaCgidiIsZS5pbmRleCl9LHZpc2l0TGl0ZXJhbChlKXt0aGlzLnBhcnRzLnB1c2goZS5udW1iZXIpfSx2aXNpdEJpbmFyeU9wZXJhdGlvbihlKXt0aGlzLnBhcnRzLnB1c2goIigiKTtlLmFyZzEudmlzaXQodGhpcyk7dGhpcy5wYXJ0cy5wdXNoKCIgIixlLm9wLCIgIik7ZS5hcmcyLnZpc2l0KHRoaXMpO3RoaXMucGFydHMucHVzaCgiKSIpfSx2aXNpdFZhcmlhYmxlRGVmaW5pdGlvbihlKXt0aGlzLnBhcnRzLnB1c2goInZhciAiKTtlLnZhcmlhYmxlLnZpc2l0KHRoaXMpO3RoaXMucGFydHMucHVzaCgiID0gIik7ZS5hcmcudmlzaXQodGhpcyk7dGhpcy5wYXJ0cy5wdXNoKCI7Iil9LHZpc2l0TWluKGUpe3RoaXMucGFydHMucHVzaCgiTWF0aC5taW4oIik7ZS5hcmcudmlzaXQodGhpcyk7dGhpcy5wYXJ0cy5wdXNoKCIsICIsZS5tYXgsIikiKX0sdG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5wYXJ0cy5qb2luKCIiKX19O2Z1bmN0aW9uIGJ1aWxkQWRkT3BlcmF0aW9uKGUsdCl7cmV0dXJuImxpdGVyYWwiPT09dC50eXBlJiYwPT09dC5udW1iZXI/ZToibGl0ZXJhbCI9PT1lLnR5cGUmJjA9PT1lLm51bWJlcj90OiJsaXRlcmFsIj09PXQudHlwZSYmImxpdGVyYWwiPT09ZS50eXBlP25ldyBBc3RMaXRlcmFsKGUubnVtYmVyK3QubnVtYmVyKTpuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIrIixlLHQsZS5taW4rdC5taW4sZS5tYXgrdC5tYXgpfWZ1bmN0aW9uIGJ1aWxkTXVsT3BlcmF0aW9uKGUsdCl7aWYoImxpdGVyYWwiPT09dC50eXBlKXtpZigwPT09dC5udW1iZXIpcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApO2lmKDE9PT10Lm51bWJlcilyZXR1cm4gZTtpZigibGl0ZXJhbCI9PT1lLnR5cGUpcmV0dXJuIG5ldyBBc3RMaXRlcmFsKGUubnVtYmVyKnQubnVtYmVyKX1pZigibGl0ZXJhbCI9PT1lLnR5cGUpe2lmKDA9PT1lLm51bWJlcilyZXR1cm4gbmV3IEFzdExpdGVyYWwoMCk7aWYoMT09PWUubnVtYmVyKXJldHVybiB0fXJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIqIixlLHQsTWF0aC5taW4oZS5taW4qdC5taW4sZS5taW4qdC5tYXgsZS5tYXgqdC5taW4sZS5tYXgqdC5tYXgpLE1hdGgubWF4KGUubWluKnQubWluLGUubWluKnQubWF4LGUubWF4KnQubWluLGUubWF4KnQubWF4KSl9ZnVuY3Rpb24gYnVpbGRTdWJPcGVyYXRpb24oZSx0KXtpZigibGl0ZXJhbCI9PT10LnR5cGUpe2lmKDA9PT10Lm51bWJlcilyZXR1cm4gZTtpZigibGl0ZXJhbCI9PT1lLnR5cGUpcmV0dXJuIG5ldyBBc3RMaXRlcmFsKGUubnVtYmVyLXQubnVtYmVyKX1yZXR1cm4iYmluYXJ5Ij09PXQudHlwZSYmIi0iPT09dC5vcCYmImxpdGVyYWwiPT09ZS50eXBlJiYxPT09ZS5udW1iZXImJiJsaXRlcmFsIj09PXQuYXJnMS50eXBlJiYxPT09dC5hcmcxLm51bWJlcj90LmFyZzI6bmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiLSIsZSx0LGUubWluLXQubWF4LGUubWF4LXQubWluKX1mdW5jdGlvbiBidWlsZE1pbk9wZXJhdGlvbihlLHQpe3JldHVybiBlLm1pbj49dD9uZXcgQXN0TGl0ZXJhbCh0KTplLm1heDw9dD9lOm5ldyBBc3RNaW4oZSx0KX1mdW5jdGlvbiBQb3N0U2NyaXB0Q29tcGlsZXIoKXt9UG9zdFNjcmlwdENvbXBpbGVyLnByb3RvdHlwZT17Y29tcGlsZTpmdW5jdGlvbiBQb3N0U2NyaXB0Q29tcGlsZXJfY29tcGlsZShlLHQscil7dmFyIGEsaSxuLHMsbyxjLGwsaCx1PVtdLGQ9W10sZj10Lmxlbmd0aD4+MSxnPXIubGVuZ3RoPj4xLG09MDtmb3IobGV0IGU9MDtlPGY7ZSsrKXUucHVzaChuZXcgQXN0QXJndW1lbnQoZSx0WzIqZV0sdFsyKmUrMV0pKTtmb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0KyspaWYoIm51bWJlciIhPXR5cGVvZihoPWVbdF0pKXN3aXRjaChoKXtjYXNlImFkZCI6aWYodS5sZW5ndGg8MilyZXR1cm4gbnVsbDtzPXUucG9wKCk7bj11LnBvcCgpO3UucHVzaChidWlsZEFkZE9wZXJhdGlvbihuLHMpKTticmVhaztjYXNlImN2ciI6aWYodS5sZW5ndGg8MSlyZXR1cm4gbnVsbDticmVhaztjYXNlIm11bCI6aWYodS5sZW5ndGg8MilyZXR1cm4gbnVsbDtzPXUucG9wKCk7bj11LnBvcCgpO3UucHVzaChidWlsZE11bE9wZXJhdGlvbihuLHMpKTticmVhaztjYXNlInN1YiI6aWYodS5sZW5ndGg8MilyZXR1cm4gbnVsbDtzPXUucG9wKCk7bj11LnBvcCgpO3UucHVzaChidWlsZFN1Yk9wZXJhdGlvbihuLHMpKTticmVhaztjYXNlImV4Y2giOmlmKHUubGVuZ3RoPDIpcmV0dXJuIG51bGw7bz11LnBvcCgpO2M9dS5wb3AoKTt1LnB1c2gobyxjKTticmVhaztjYXNlInBvcCI6aWYodS5sZW5ndGg8MSlyZXR1cm4gbnVsbDt1LnBvcCgpO2JyZWFrO2Nhc2UiaW5kZXgiOmlmKHUubGVuZ3RoPDEpcmV0dXJuIG51bGw7aWYoImxpdGVyYWwiIT09KG49dS5wb3AoKSkudHlwZSlyZXR1cm4gbnVsbDtpZigoYT1uLm51bWJlcik8MHx8IU51bWJlci5pc0ludGVnZXIoYSl8fHUubGVuZ3RoPGEpcmV0dXJuIG51bGw7aWYoImxpdGVyYWwiPT09KG89dVt1Lmxlbmd0aC1hLTFdKS50eXBlfHwidmFyIj09PW8udHlwZSl7dS5wdXNoKG8pO2JyZWFrfWw9bmV3IEFzdFZhcmlhYmxlKG0rKyxvLm1pbixvLm1heCk7dVt1Lmxlbmd0aC1hLTFdPWw7dS5wdXNoKGwpO2QucHVzaChuZXcgQXN0VmFyaWFibGVEZWZpbml0aW9uKGwsbykpO2JyZWFrO2Nhc2UiZHVwIjppZih1Lmxlbmd0aDwxKXJldHVybiBudWxsO2lmKCJudW1iZXIiPT10eXBlb2YgZVt0KzFdJiYiZ3QiPT09ZVt0KzJdJiZlW3QrM109PT10KzcmJiJqeiI9PT1lW3QrNF0mJiJwb3AiPT09ZVt0KzVdJiZlW3QrNl09PT1lW3QrMV0pe249dS5wb3AoKTt1LnB1c2goYnVpbGRNaW5PcGVyYXRpb24obixlW3QrMV0pKTt0Kz02O2JyZWFrfWlmKCJsaXRlcmFsIj09PShvPXVbdS5sZW5ndGgtMV0pLnR5cGV8fCJ2YXIiPT09by50eXBlKXt1LnB1c2gobyk7YnJlYWt9bD1uZXcgQXN0VmFyaWFibGUobSsrLG8ubWluLG8ubWF4KTt1W3UubGVuZ3RoLTFdPWw7dS5wdXNoKGwpO2QucHVzaChuZXcgQXN0VmFyaWFibGVEZWZpbml0aW9uKGwsbykpO2JyZWFrO2Nhc2Uicm9sbCI6aWYodS5sZW5ndGg8MilyZXR1cm4gbnVsbDtzPXUucG9wKCk7bj11LnBvcCgpO2lmKCJsaXRlcmFsIiE9PXMudHlwZXx8ImxpdGVyYWwiIT09bi50eXBlKXJldHVybiBudWxsO2k9cy5udW1iZXI7aWYoKGE9bi5udW1iZXIpPD0wfHwhTnVtYmVyLmlzSW50ZWdlcihhKXx8IU51bWJlci5pc0ludGVnZXIoaSl8fHUubGVuZ3RoPGEpcmV0dXJuIG51bGw7aWYoMD09PShpPShpJWErYSklYSkpYnJlYWs7QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodSx1LnNwbGljZSh1Lmxlbmd0aC1hLGEtaSkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG51bGx9ZWxzZSB1LnB1c2gobmV3IEFzdExpdGVyYWwoaCkpO2lmKHUubGVuZ3RoIT09ZylyZXR1cm4gbnVsbDt2YXIgcD1bXTtkLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3I7ZS52aXNpdCh0KTtwLnB1c2godC50b1N0cmluZygpKX0pKTt1LmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7dmFyIGE9bmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcjtlLnZpc2l0KGEpO3ZhciBpPXJbMip0XSxuPXJbMip0KzFdLHM9W2EudG9TdHJpbmcoKV07aWYoaT5lLm1pbil7cy51bnNoaWZ0KCJNYXRoLm1heCgiLGksIiwgIik7cy5wdXNoKCIpIil9aWYobjxlLm1heCl7cy51bnNoaWZ0KCJNYXRoLm1pbigiLG4sIiwgIik7cy5wdXNoKCIpIil9cy51bnNoaWZ0KCJkZXN0W2Rlc3RPZmZzZXQgKyAiLHQsIl0gPSAiKTtzLnB1c2goIjsiKTtwLnB1c2gocy5qb2luKCIiKSl9KSk7cmV0dXJuIHAuam9pbigiXG4iKX19O3JldHVybiBQb3N0U2NyaXB0Q29tcGlsZXJ9KCk7dC5Qb3N0U2NyaXB0Q29tcGlsZXI9aH0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Qb3N0U2NyaXB0UGFyc2VyPXQuUG9zdFNjcmlwdExleGVyPXZvaWQgMDt2YXIgYT1yKDIpLGk9cig1KSxuPXIoOCk7dC5Qb3N0U2NyaXB0UGFyc2VyPWNsYXNzIFBvc3RTY3JpcHRQYXJzZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5sZXhlcj1lO3RoaXMub3BlcmF0b3JzPVtdO3RoaXMudG9rZW49bnVsbDt0aGlzLnByZXY9bnVsbH1uZXh0VG9rZW4oKXt0aGlzLnByZXY9dGhpcy50b2tlbjt0aGlzLnRva2VuPXRoaXMubGV4ZXIuZ2V0VG9rZW4oKX1hY2NlcHQoZSl7aWYodGhpcy50b2tlbi50eXBlPT09ZSl7dGhpcy5uZXh0VG9rZW4oKTtyZXR1cm4hMH1yZXR1cm4hMX1leHBlY3QoZSl7aWYodGhpcy5hY2NlcHQoZSkpcmV0dXJuITA7dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoYFVuZXhwZWN0ZWQgc3ltYm9sOiBmb3VuZCAke3RoaXMudG9rZW4udHlwZX0gZXhwZWN0ZWQgJHtlfS5gKX1wYXJzZSgpe3RoaXMubmV4dFRva2VuKCk7dGhpcy5leHBlY3Qocy5MQlJBQ0UpO3RoaXMucGFyc2VCbG9jaygpO3RoaXMuZXhwZWN0KHMuUkJSQUNFKTtyZXR1cm4gdGhpcy5vcGVyYXRvcnN9cGFyc2VCbG9jaygpe2Zvcig7OylpZih0aGlzLmFjY2VwdChzLk5VTUJFUikpdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpO2Vsc2UgaWYodGhpcy5hY2NlcHQocy5PUEVSQVRPUikpdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpO2Vsc2V7aWYoIXRoaXMuYWNjZXB0KHMuTEJSQUNFKSlyZXR1cm47dGhpcy5wYXJzZUNvbmRpdGlvbigpfX1wYXJzZUNvbmRpdGlvbigpe2NvbnN0IGU9dGhpcy5vcGVyYXRvcnMubGVuZ3RoO3RoaXMub3BlcmF0b3JzLnB1c2gobnVsbCxudWxsKTt0aGlzLnBhcnNlQmxvY2soKTt0aGlzLmV4cGVjdChzLlJCUkFDRSk7aWYodGhpcy5hY2NlcHQocy5JRikpe3RoaXMub3BlcmF0b3JzW2VdPXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLm9wZXJhdG9yc1tlKzFdPSJqeiJ9ZWxzZXtpZighdGhpcy5hY2NlcHQocy5MQlJBQ0UpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJQUyBGdW5jdGlvbjogZXJyb3IgcGFyc2luZyBjb25kaXRpb25hbC4iKTt7Y29uc3QgdD10aGlzLm9wZXJhdG9ycy5sZW5ndGg7dGhpcy5vcGVyYXRvcnMucHVzaChudWxsLG51bGwpO2NvbnN0IHI9dGhpcy5vcGVyYXRvcnMubGVuZ3RoO3RoaXMucGFyc2VCbG9jaygpO3RoaXMuZXhwZWN0KHMuUkJSQUNFKTt0aGlzLmV4cGVjdChzLklGRUxTRSk7dGhpcy5vcGVyYXRvcnNbdF09dGhpcy5vcGVyYXRvcnMubGVuZ3RoO3RoaXMub3BlcmF0b3JzW3QrMV09ImoiO3RoaXMub3BlcmF0b3JzW2VdPXI7dGhpcy5vcGVyYXRvcnNbZSsxXT0ianoifX19fTtjb25zdCBzPXtMQlJBQ0U6MCxSQlJBQ0U6MSxOVU1CRVI6MixPUEVSQVRPUjozLElGOjQsSUZFTFNFOjV9LG89ZnVuY3Rpb24gUG9zdFNjcmlwdFRva2VuQ2xvc3VyZSgpe2NvbnN0IGU9T2JqZWN0LmNyZWF0ZShudWxsKTtjbGFzcyBQb3N0U2NyaXB0VG9rZW57Y29uc3RydWN0b3IoZSx0KXt0aGlzLnR5cGU9ZTt0aGlzLnZhbHVlPXR9c3RhdGljIGdldE9wZXJhdG9yKHQpe2NvbnN0IHI9ZVt0XTtyZXR1cm4gcnx8KGVbdF09bmV3IFBvc3RTY3JpcHRUb2tlbihzLk9QRVJBVE9SLHQpKX1zdGF0aWMgZ2V0IExCUkFDRSgpe3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJMQlJBQ0UiLG5ldyBQb3N0U2NyaXB0VG9rZW4ocy5MQlJBQ0UsInsiKSl9c3RhdGljIGdldCBSQlJBQ0UoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiUkJSQUNFIixuZXcgUG9zdFNjcmlwdFRva2VuKHMuUkJSQUNFLCJ9IikpfXN0YXRpYyBnZXQgSUYoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiSUYiLG5ldyBQb3N0U2NyaXB0VG9rZW4ocy5JRiwiSUYiKSl9c3RhdGljIGdldCBJRkVMU0UoKXtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiSUZFTFNFIixuZXcgUG9zdFNjcmlwdFRva2VuKHMuSUZFTFNFLCJJRkVMU0UiKSl9fXJldHVybiBQb3N0U2NyaXB0VG9rZW59KCk7dC5Qb3N0U2NyaXB0TGV4ZXI9Y2xhc3MgUG9zdFNjcmlwdExleGVye2NvbnN0cnVjdG9yKGUpe3RoaXMuc3RyZWFtPWU7dGhpcy5uZXh0Q2hhcigpO3RoaXMuc3RyQnVmPVtdfW5leHRDaGFyKCl7cmV0dXJuIHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfWdldFRva2VuKCl7bGV0IGU9ITEsdD10aGlzLmN1cnJlbnRDaGFyO2Zvcig7Oyl7aWYodDwwKXJldHVybiBpLkVPRjtpZihlKTEwIT09dCYmMTMhPT10fHwoZT0hMSk7ZWxzZSBpZigzNz09PXQpZT0hMDtlbHNlIGlmKCEoMCxuLmlzV2hpdGVTcGFjZSkodCkpYnJlYWs7dD10aGlzLm5leHRDaGFyKCl9c3dpdGNoKDB8dCl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQzOmNhc2UgNDU6Y2FzZSA0NjpyZXR1cm4gbmV3IG8ocy5OVU1CRVIsdGhpcy5nZXROdW1iZXIoKSk7Y2FzZSAxMjM6dGhpcy5uZXh0Q2hhcigpO3JldHVybiBvLkxCUkFDRTtjYXNlIDEyNTp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIG8uUkJSQUNFfWNvbnN0IHI9dGhpcy5zdHJCdWY7ci5sZW5ndGg9MDtyWzBdPVN0cmluZy5mcm9tQ2hhckNvZGUodCk7Zm9yKDsodD10aGlzLm5leHRDaGFyKCkpPj0wJiYodD49NjUmJnQ8PTkwfHx0Pj05NyYmdDw9MTIyKTspci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodCkpO2NvbnN0IGE9ci5qb2luKCIiKTtzd2l0Y2goYS50b0xvd2VyQ2FzZSgpKXtjYXNlImlmIjpyZXR1cm4gby5JRjtjYXNlImlmZWxzZSI6cmV0dXJuIG8uSUZFTFNFO2RlZmF1bHQ6cmV0dXJuIG8uZ2V0T3BlcmF0b3IoYSl9fWdldE51bWJlcigpe2xldCBlPXRoaXMuY3VycmVudENoYXI7Y29uc3QgdD10aGlzLnN0ckJ1Zjt0Lmxlbmd0aD0wO3RbMF09U3RyaW5nLmZyb21DaGFyQ29kZShlKTtmb3IoOyhlPXRoaXMubmV4dENoYXIoKSk+PTAmJihlPj00OCYmZTw9NTd8fDQ1PT09ZXx8NDY9PT1lKTspdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpO2NvbnN0IHI9cGFyc2VGbG9hdCh0LmpvaW4oIiIpKTtpZihpc05hTihyKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXI6ICIrcik7cmV0dXJuIHJ9fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5iaWRpPWZ1bmN0aW9uIGJpZGkoZSx0LHIpe3ZhciBjPSEwLGw9ZS5sZW5ndGg7aWYoMD09PWx8fHIpcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KGUsYyxyKTtzLmxlbmd0aD1sO28ubGVuZ3RoPWw7dmFyIGgsdSxkPTA7Zm9yKGg9MDtoPGw7KytoKXtzW2hdPWUuY2hhckF0KGgpO3ZhciBmPWUuY2hhckNvZGVBdChoKSxnPSJMIjtmPD0yNTU/Zz1pW2ZdOjE0MjQ8PWYmJmY8PTE1MjQ/Zz0iUiI6MTUzNjw9ZiYmZjw9MTc5MT8oZz1uWzI1NSZmXSl8fCgwLGEud2FybikoIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIitmLnRvU3RyaW5nKDE2KSk6MTc5Mjw9ZiYmZjw9MjIyMCYmKGc9IkFMIik7IlIiIT09ZyYmIkFMIiE9PWcmJiJBTiIhPT1nfHxkKys7b1toXT1nfWlmKDA9PT1kKXJldHVybiBjcmVhdGVCaWRpVGV4dChlLGM9ITApO2lmKC0xPT09dClpZihkL2w8LjMpe2M9ITA7dD0wfWVsc2V7Yz0hMTt0PTF9dmFyIG09W107Zm9yKGg9MDtoPGw7KytoKW1baF09dDt2YXIgcCxiPWlzT2RkKHQpPyJSIjoiTCIseT1iLHY9eSx3PXk7Zm9yKGg9MDtoPGw7KytoKSJOU00iPT09b1toXT9vW2hdPXc6dz1vW2hdO3c9eTtmb3IoaD0wO2g8bDsrK2gpIkVOIj09PShwPW9baF0pP29baF09IkFMIj09PXc/IkFOIjoiRU4iOiJSIiE9PXAmJiJMIiE9PXAmJiJBTCIhPT1wfHwodz1wKTtmb3IoaD0wO2g8bDsrK2gpIkFMIj09PShwPW9baF0pJiYob1toXT0iUiIpO2ZvcihoPTE7aDxsLTE7KytoKXsiRVMiPT09b1toXSYmIkVOIj09PW9baC0xXSYmIkVOIj09PW9baCsxXSYmKG9baF09IkVOIik7IkNTIiE9PW9baF18fCJFTiIhPT1vW2gtMV0mJiJBTiIhPT1vW2gtMV18fG9baCsxXSE9PW9baC0xXXx8KG9baF09b1toLTFdKX1mb3IoaD0wO2g8bDsrK2gpaWYoIkVOIj09PW9baF0pe3ZhciBrO2ZvcihrPWgtMTtrPj0wJiYiRVQiPT09b1trXTstLWspb1trXT0iRU4iO2ZvcihrPWgrMTtrPGwmJiJFVCI9PT1vW2tdOysraylvW2tdPSJFTiJ9Zm9yKGg9MDtoPGw7KytoKSJXUyIhPT0ocD1vW2hdKSYmIkVTIiE9PXAmJiJFVCIhPT1wJiYiQ1MiIT09cHx8KG9baF09Ik9OIik7dz15O2ZvcihoPTA7aDxsOysraCkiRU4iPT09KHA9b1toXSk/b1toXT0iTCI9PT13PyJMIjoiRU4iOiJSIiE9PXAmJiJMIiE9PXB8fCh3PXApO2ZvcihoPTA7aDxsOysraClpZigiT04iPT09b1toXSl7dmFyIFM9ZmluZFVuZXF1YWwobyxoKzEsIk9OIiksQz15O2g+MCYmKEM9b1toLTFdKTt2YXIgeD12O1MrMTxsJiYoeD1vW1MrMV0pOyJMIiE9PUMmJihDPSJSIik7IkwiIT09eCYmKHg9IlIiKTtDPT09eCYmc2V0VmFsdWVzKG8saCxTLEMpO2g9Uy0xfWZvcihoPTA7aDxsOysraCkiT04iPT09b1toXSYmKG9baF09Yik7Zm9yKGg9MDtoPGw7KytoKXtwPW9baF07aXNFdmVuKG1baF0pPyJSIj09PXA/bVtoXSs9MToiQU4iIT09cCYmIkVOIiE9PXB8fChtW2hdKz0yKToiTCIhPT1wJiYiQU4iIT09cCYmIkVOIiE9PXB8fChtW2hdKz0xKX12YXIgQSxUPS0xLEk9OTk7Zm9yKGg9MCx1PW0ubGVuZ3RoO2g8dTsrK2gpe0E9bVtoXTtUPEEmJihUPUEpO0k+QSYmaXNPZGQoQSkmJihJPUEpfWZvcihBPVQ7QT49STstLUEpe3ZhciBGPS0xO2ZvcihoPTAsdT1tLmxlbmd0aDtoPHU7KytoKWlmKG1baF08QSl7aWYoRj49MCl7cmV2ZXJzZVZhbHVlcyhzLEYsaCk7Rj0tMX19ZWxzZSBGPDAmJihGPWgpO0Y+PTAmJnJldmVyc2VWYWx1ZXMocyxGLG0ubGVuZ3RoKX1mb3IoaD0wLHU9cy5sZW5ndGg7aDx1OysraCl7dmFyIFA9c1toXTsiPCIhPT1QJiYiPiIhPT1QfHwoc1toXT0iIil9cmV0dXJuIGNyZWF0ZUJpZGlUZXh0KHMuam9pbigiIiksYyl9O3ZhciBhPXIoMiksaT1bIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIlMiLCJCIiwiUyIsIldTIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCIiwiQiIsIkIiLCJTIiwiV1MiLCJPTiIsIk9OIiwiRVQiLCJFVCIsIkVUIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIkVTIiwiQ1MiLCJFUyIsIkNTIiwiQ1MiLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkNTIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiT04iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk9OIiwiT04iLCJPTiIsIk9OIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJDUyIsIk9OIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJPTiIsIk9OIiwiT04iLCJPTiIsIkwiLCJPTiIsIk9OIiwiQk4iLCJPTiIsIk9OIiwiRVQiLCJFVCIsIkVOIiwiRU4iLCJPTiIsIkwiLCJPTiIsIk9OIiwiT04iLCJFTiIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIl0sbj1bIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIk9OIiwiT04iLCJBTCIsIkVUIiwiRVQiLCJBTCIsIkNTIiwiQUwiLCJPTiIsIk9OIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQUwiLCJBTCIsIiIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiRVQiLCJBTiIsIkFOIiwiQUwiLCJBTCIsIkFMIiwiTlNNIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFOIiwiT04iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiTlNNIiwiTlNNIiwiT04iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiXTtmdW5jdGlvbiBpc09kZChlKXtyZXR1cm4gMCE9KDEmZSl9ZnVuY3Rpb24gaXNFdmVuKGUpe3JldHVybiAwPT0oMSZlKX1mdW5jdGlvbiBmaW5kVW5lcXVhbChlLHQscil7Zm9yKHZhciBhPXQsaT1lLmxlbmd0aDthPGk7KythKWlmKGVbYV0hPT1yKXJldHVybiBhO3JldHVybiBhfWZ1bmN0aW9uIHNldFZhbHVlcyhlLHQscixhKXtmb3IodmFyIGk9dDtpPHI7KytpKWVbaV09YX1mdW5jdGlvbiByZXZlcnNlVmFsdWVzKGUsdCxyKXtmb3IodmFyIGE9dCxpPXItMTthPGk7KythLC0taSl7dmFyIG49ZVthXTtlW2FdPWVbaV07ZVtpXT1ufX1mdW5jdGlvbiBjcmVhdGVCaWRpVGV4dChlLHQscj0hMSl7bGV0IGE9Imx0ciI7cj9hPSJ0dGIiOnR8fChhPSJydGwiKTtyZXR1cm57c3RyOmUsZGlyOmF9fXZhciBzPVtdLG89W119LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuZ2V0TWV0cmljcz12b2lkIDA7dmFyIGE9cig4KSxpPSgwLGEuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5Db3VyaWVyPTYwMDtlWyJDb3VyaWVyLUJvbGQiXT02MDA7ZVsiQ291cmllci1Cb2xkT2JsaXF1ZSJdPTYwMDtlWyJDb3VyaWVyLU9ibGlxdWUiXT02MDA7ZS5IZWx2ZXRpY2E9KDAsYS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI3ODtlLmV4Y2xhbT0yNzg7ZS5xdW90ZWRibD0zNTU7ZS5udW1iZXJzaWduPTU1NjtlLmRvbGxhcj01NTY7ZS5wZXJjZW50PTg4OTtlLmFtcGVyc2FuZD02Njc7ZS5xdW90ZXJpZ2h0PTIyMjtlLnBhcmVubGVmdD0zMzM7ZS5wYXJlbnJpZ2h0PTMzMztlLmFzdGVyaXNrPTM4OTtlLnBsdXM9NTg0O2UuY29tbWE9Mjc4O2UuaHlwaGVuPTMzMztlLnBlcmlvZD0yNzg7ZS5zbGFzaD0yNzg7ZS56ZXJvPTU1NjtlLm9uZT01NTY7ZS50d289NTU2O2UudGhyZWU9NTU2O2UuZm91cj01NTY7ZS5maXZlPTU1NjtlLnNpeD01NTY7ZS5zZXZlbj01NTY7ZS5laWdodD01NTY7ZS5uaW5lPTU1NjtlLmNvbG9uPTI3ODtlLnNlbWljb2xvbj0yNzg7ZS5sZXNzPTU4NDtlLmVxdWFsPTU4NDtlLmdyZWF0ZXI9NTg0O2UucXVlc3Rpb249NTU2O2UuYXQ9MTAxNTtlLkE9NjY3O2UuQj02Njc7ZS5DPTcyMjtlLkQ9NzIyO2UuRT02Njc7ZS5GPTYxMTtlLkc9Nzc4O2UuSD03MjI7ZS5JPTI3ODtlLko9NTAwO2UuSz02Njc7ZS5MPTU1NjtlLk09ODMzO2UuTj03MjI7ZS5PPTc3ODtlLlA9NjY3O2UuUT03Nzg7ZS5SPTcyMjtlLlM9NjY3O2UuVD02MTE7ZS5VPTcyMjtlLlY9NjY3O2UuVz05NDQ7ZS5YPTY2NztlLlk9NjY3O2UuWj02MTE7ZS5icmFja2V0bGVmdD0yNzg7ZS5iYWNrc2xhc2g9Mjc4O2UuYnJhY2tldHJpZ2h0PTI3ODtlLmFzY2lpY2lyY3VtPTQ2OTtlLnVuZGVyc2NvcmU9NTU2O2UucXVvdGVsZWZ0PTIyMjtlLmE9NTU2O2UuYj01NTY7ZS5jPTUwMDtlLmQ9NTU2O2UuZT01NTY7ZS5mPTI3ODtlLmc9NTU2O2UuaD01NTY7ZS5pPTIyMjtlLmo9MjIyO2Uuaz01MDA7ZS5sPTIyMjtlLm09ODMzO2Uubj01NTY7ZS5vPTU1NjtlLnA9NTU2O2UucT01NTY7ZS5yPTMzMztlLnM9NTAwO2UudD0yNzg7ZS51PTU1NjtlLnY9NTAwO2Uudz03MjI7ZS54PTUwMDtlLnk9NTAwO2Uuej01MDA7ZS5icmFjZWxlZnQ9MzM0O2UuYmFyPTI2MDtlLmJyYWNlcmlnaHQ9MzM0O2UuYXNjaWl0aWxkZT01ODQ7ZS5leGNsYW1kb3duPTMzMztlLmNlbnQ9NTU2O2Uuc3Rlcmxpbmc9NTU2O2UuZnJhY3Rpb249MTY3O2UueWVuPTU1NjtlLmZsb3Jpbj01NTY7ZS5zZWN0aW9uPTU1NjtlLmN1cnJlbmN5PTU1NjtlLnF1b3Rlc2luZ2xlPTE5MTtlLnF1b3RlZGJsbGVmdD0zMzM7ZS5ndWlsbGVtb3RsZWZ0PTU1NjtlLmd1aWxzaW5nbGxlZnQ9MzMzO2UuZ3VpbHNpbmdscmlnaHQ9MzMzO2UuZmk9NTAwO2UuZmw9NTAwO2UuZW5kYXNoPTU1NjtlLmRhZ2dlcj01NTY7ZS5kYWdnZXJkYmw9NTU2O2UucGVyaW9kY2VudGVyZWQ9Mjc4O2UucGFyYWdyYXBoPTUzNztlLmJ1bGxldD0zNTA7ZS5xdW90ZXNpbmdsYmFzZT0yMjI7ZS5xdW90ZWRibGJhc2U9MzMzO2UucXVvdGVkYmxyaWdodD0zMzM7ZS5ndWlsbGVtb3RyaWdodD01NTY7ZS5lbGxpcHNpcz0xZTM7ZS5wZXJ0aG91c2FuZD0xZTM7ZS5xdWVzdGlvbmRvd249NjExO2UuZ3JhdmU9MzMzO2UuYWN1dGU9MzMzO2UuY2lyY3VtZmxleD0zMzM7ZS50aWxkZT0zMzM7ZS5tYWNyb249MzMzO2UuYnJldmU9MzMzO2UuZG90YWNjZW50PTMzMztlLmRpZXJlc2lzPTMzMztlLnJpbmc9MzMzO2UuY2VkaWxsYT0zMzM7ZS5odW5nYXJ1bWxhdXQ9MzMzO2Uub2dvbmVrPTMzMztlLmNhcm9uPTMzMztlLmVtZGFzaD0xZTM7ZS5BRT0xZTM7ZS5vcmRmZW1pbmluZT0zNzA7ZS5Mc2xhc2g9NTU2O2UuT3NsYXNoPTc3ODtlLk9FPTFlMztlLm9yZG1hc2N1bGluZT0zNjU7ZS5hZT04ODk7ZS5kb3RsZXNzaT0yNzg7ZS5sc2xhc2g9MjIyO2Uub3NsYXNoPTYxMTtlLm9lPTk0NDtlLmdlcm1hbmRibHM9NjExO2UuSWRpZXJlc2lzPTI3ODtlLmVhY3V0ZT01NTY7ZS5hYnJldmU9NTU2O2UudWh1bmdhcnVtbGF1dD01NTY7ZS5lY2Fyb249NTU2O2UuWWRpZXJlc2lzPTY2NztlLmRpdmlkZT01ODQ7ZS5ZYWN1dGU9NjY3O2UuQWNpcmN1bWZsZXg9NjY3O2UuYWFjdXRlPTU1NjtlLlVjaXJjdW1mbGV4PTcyMjtlLnlhY3V0ZT01MDA7ZS5zY29tbWFhY2NlbnQ9NTAwO2UuZWNpcmN1bWZsZXg9NTU2O2UuVXJpbmc9NzIyO2UuVWRpZXJlc2lzPTcyMjtlLmFvZ29uZWs9NTU2O2UuVWFjdXRlPTcyMjtlLnVvZ29uZWs9NTU2O2UuRWRpZXJlc2lzPTY2NztlLkRjcm9hdD03MjI7ZS5jb21tYWFjY2VudD0yNTA7ZS5jb3B5cmlnaHQ9NzM3O2UuRW1hY3Jvbj02Njc7ZS5jY2Fyb249NTAwO2UuYXJpbmc9NTU2O2UuTmNvbW1hYWNjZW50PTcyMjtlLmxhY3V0ZT0yMjI7ZS5hZ3JhdmU9NTU2O2UuVGNvbW1hYWNjZW50PTYxMTtlLkNhY3V0ZT03MjI7ZS5hdGlsZGU9NTU2O2UuRWRvdGFjY2VudD02Njc7ZS5zY2Fyb249NTAwO2Uuc2NlZGlsbGE9NTAwO2UuaWFjdXRlPTI3ODtlLmxvemVuZ2U9NDcxO2UuUmNhcm9uPTcyMjtlLkdjb21tYWFjY2VudD03Nzg7ZS51Y2lyY3VtZmxleD01NTY7ZS5hY2lyY3VtZmxleD01NTY7ZS5BbWFjcm9uPTY2NztlLnJjYXJvbj0zMzM7ZS5jY2VkaWxsYT01MDA7ZS5aZG90YWNjZW50PTYxMTtlLlRob3JuPTY2NztlLk9tYWNyb249Nzc4O2UuUmFjdXRlPTcyMjtlLlNhY3V0ZT02Njc7ZS5kY2Fyb249NjQzO2UuVW1hY3Jvbj03MjI7ZS51cmluZz01NTY7ZS50aHJlZXN1cGVyaW9yPTMzMztlLk9ncmF2ZT03Nzg7ZS5BZ3JhdmU9NjY3O2UuQWJyZXZlPTY2NztlLm11bHRpcGx5PTU4NDtlLnVhY3V0ZT01NTY7ZS5UY2Fyb249NjExO2UucGFydGlhbGRpZmY9NDc2O2UueWRpZXJlc2lzPTUwMDtlLk5hY3V0ZT03MjI7ZS5pY2lyY3VtZmxleD0yNzg7ZS5FY2lyY3VtZmxleD02Njc7ZS5hZGllcmVzaXM9NTU2O2UuZWRpZXJlc2lzPTU1NjtlLmNhY3V0ZT01MDA7ZS5uYWN1dGU9NTU2O2UudW1hY3Jvbj01NTY7ZS5OY2Fyb249NzIyO2UuSWFjdXRlPTI3ODtlLnBsdXNtaW51cz01ODQ7ZS5icm9rZW5iYXI9MjYwO2UucmVnaXN0ZXJlZD03Mzc7ZS5HYnJldmU9Nzc4O2UuSWRvdGFjY2VudD0yNzg7ZS5zdW1tYXRpb249NjAwO2UuRWdyYXZlPTY2NztlLnJhY3V0ZT0zMzM7ZS5vbWFjcm9uPTU1NjtlLlphY3V0ZT02MTE7ZS5aY2Fyb249NjExO2UuZ3JlYXRlcmVxdWFsPTU0OTtlLkV0aD03MjI7ZS5DY2VkaWxsYT03MjI7ZS5sY29tbWFhY2NlbnQ9MjIyO2UudGNhcm9uPTMxNztlLmVvZ29uZWs9NTU2O2UuVW9nb25laz03MjI7ZS5BYWN1dGU9NjY3O2UuQWRpZXJlc2lzPTY2NztlLmVncmF2ZT01NTY7ZS56YWN1dGU9NTAwO2UuaW9nb25laz0yMjI7ZS5PYWN1dGU9Nzc4O2Uub2FjdXRlPTU1NjtlLmFtYWNyb249NTU2O2Uuc2FjdXRlPTUwMDtlLmlkaWVyZXNpcz0yNzg7ZS5PY2lyY3VtZmxleD03Nzg7ZS5VZ3JhdmU9NzIyO2UuRGVsdGE9NjEyO2UudGhvcm49NTU2O2UudHdvc3VwZXJpb3I9MzMzO2UuT2RpZXJlc2lzPTc3ODtlLm11PTU1NjtlLmlncmF2ZT0yNzg7ZS5vaHVuZ2FydW1sYXV0PTU1NjtlLkVvZ29uZWs9NjY3O2UuZGNyb2F0PTU1NjtlLnRocmVlcXVhcnRlcnM9ODM0O2UuU2NlZGlsbGE9NjY3O2UubGNhcm9uPTI5OTtlLktjb21tYWFjY2VudD02Njc7ZS5MYWN1dGU9NTU2O2UudHJhZGVtYXJrPTFlMztlLmVkb3RhY2NlbnQ9NTU2O2UuSWdyYXZlPTI3ODtlLkltYWNyb249Mjc4O2UuTGNhcm9uPTU1NjtlLm9uZWhhbGY9ODM0O2UubGVzc2VxdWFsPTU0OTtlLm9jaXJjdW1mbGV4PTU1NjtlLm50aWxkZT01NTY7ZS5VaHVuZ2FydW1sYXV0PTcyMjtlLkVhY3V0ZT02Njc7ZS5lbWFjcm9uPTU1NjtlLmdicmV2ZT01NTY7ZS5vbmVxdWFydGVyPTgzNDtlLlNjYXJvbj02Njc7ZS5TY29tbWFhY2NlbnQ9NjY3O2UuT2h1bmdhcnVtbGF1dD03Nzg7ZS5kZWdyZWU9NDAwO2Uub2dyYXZlPTU1NjtlLkNjYXJvbj03MjI7ZS51Z3JhdmU9NTU2O2UucmFkaWNhbD00NTM7ZS5EY2Fyb249NzIyO2UucmNvbW1hYWNjZW50PTMzMztlLk50aWxkZT03MjI7ZS5vdGlsZGU9NTU2O2UuUmNvbW1hYWNjZW50PTcyMjtlLkxjb21tYWFjY2VudD01NTY7ZS5BdGlsZGU9NjY3O2UuQW9nb25laz02Njc7ZS5BcmluZz02Njc7ZS5PdGlsZGU9Nzc4O2UuemRvdGFjY2VudD01MDA7ZS5FY2Fyb249NjY3O2UuSW9nb25laz0yNzg7ZS5rY29tbWFhY2NlbnQ9NTAwO2UubWludXM9NTg0O2UuSWNpcmN1bWZsZXg9Mjc4O2UubmNhcm9uPTU1NjtlLnRjb21tYWFjY2VudD0yNzg7ZS5sb2dpY2Fsbm90PTU4NDtlLm9kaWVyZXNpcz01NTY7ZS51ZGllcmVzaXM9NTU2O2Uubm90ZXF1YWw9NTQ5O2UuZ2NvbW1hYWNjZW50PTU1NjtlLmV0aD01NTY7ZS56Y2Fyb249NTAwO2UubmNvbW1hYWNjZW50PTU1NjtlLm9uZXN1cGVyaW9yPTMzMztlLmltYWNyb249Mjc4O2UuRXVybz01NTZ9KSk7ZVsiSGVsdmV0aWNhLUJvbGQiXT0oMCxhLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9Mjc4O2UuZXhjbGFtPTMzMztlLnF1b3RlZGJsPTQ3NDtlLm51bWJlcnNpZ249NTU2O2UuZG9sbGFyPTU1NjtlLnBlcmNlbnQ9ODg5O2UuYW1wZXJzYW5kPTcyMjtlLnF1b3RlcmlnaHQ9Mjc4O2UucGFyZW5sZWZ0PTMzMztlLnBhcmVucmlnaHQ9MzMzO2UuYXN0ZXJpc2s9Mzg5O2UucGx1cz01ODQ7ZS5jb21tYT0yNzg7ZS5oeXBoZW49MzMzO2UucGVyaW9kPTI3ODtlLnNsYXNoPTI3ODtlLnplcm89NTU2O2Uub25lPTU1NjtlLnR3bz01NTY7ZS50aHJlZT01NTY7ZS5mb3VyPTU1NjtlLmZpdmU9NTU2O2Uuc2l4PTU1NjtlLnNldmVuPTU1NjtlLmVpZ2h0PTU1NjtlLm5pbmU9NTU2O2UuY29sb249MzMzO2Uuc2VtaWNvbG9uPTMzMztlLmxlc3M9NTg0O2UuZXF1YWw9NTg0O2UuZ3JlYXRlcj01ODQ7ZS5xdWVzdGlvbj02MTE7ZS5hdD05NzU7ZS5BPTcyMjtlLkI9NzIyO2UuQz03MjI7ZS5EPTcyMjtlLkU9NjY3O2UuRj02MTE7ZS5HPTc3ODtlLkg9NzIyO2UuST0yNzg7ZS5KPTU1NjtlLks9NzIyO2UuTD02MTE7ZS5NPTgzMztlLk49NzIyO2UuTz03Nzg7ZS5QPTY2NztlLlE9Nzc4O2UuUj03MjI7ZS5TPTY2NztlLlQ9NjExO2UuVT03MjI7ZS5WPTY2NztlLlc9OTQ0O2UuWD02Njc7ZS5ZPTY2NztlLlo9NjExO2UuYnJhY2tldGxlZnQ9MzMzO2UuYmFja3NsYXNoPTI3ODtlLmJyYWNrZXRyaWdodD0zMzM7ZS5hc2NpaWNpcmN1bT01ODQ7ZS51bmRlcnNjb3JlPTU1NjtlLnF1b3RlbGVmdD0yNzg7ZS5hPTU1NjtlLmI9NjExO2UuYz01NTY7ZS5kPTYxMTtlLmU9NTU2O2UuZj0zMzM7ZS5nPTYxMTtlLmg9NjExO2UuaT0yNzg7ZS5qPTI3ODtlLms9NTU2O2UubD0yNzg7ZS5tPTg4OTtlLm49NjExO2Uubz02MTE7ZS5wPTYxMTtlLnE9NjExO2Uucj0zODk7ZS5zPTU1NjtlLnQ9MzMzO2UudT02MTE7ZS52PTU1NjtlLnc9Nzc4O2UueD01NTY7ZS55PTU1NjtlLno9NTAwO2UuYnJhY2VsZWZ0PTM4OTtlLmJhcj0yODA7ZS5icmFjZXJpZ2h0PTM4OTtlLmFzY2lpdGlsZGU9NTg0O2UuZXhjbGFtZG93bj0zMzM7ZS5jZW50PTU1NjtlLnN0ZXJsaW5nPTU1NjtlLmZyYWN0aW9uPTE2NztlLnllbj01NTY7ZS5mbG9yaW49NTU2O2Uuc2VjdGlvbj01NTY7ZS5jdXJyZW5jeT01NTY7ZS5xdW90ZXNpbmdsZT0yMzg7ZS5xdW90ZWRibGxlZnQ9NTAwO2UuZ3VpbGxlbW90bGVmdD01NTY7ZS5ndWlsc2luZ2xsZWZ0PTMzMztlLmd1aWxzaW5nbHJpZ2h0PTMzMztlLmZpPTYxMTtlLmZsPTYxMTtlLmVuZGFzaD01NTY7ZS5kYWdnZXI9NTU2O2UuZGFnZ2VyZGJsPTU1NjtlLnBlcmlvZGNlbnRlcmVkPTI3ODtlLnBhcmFncmFwaD01NTY7ZS5idWxsZXQ9MzUwO2UucXVvdGVzaW5nbGJhc2U9Mjc4O2UucXVvdGVkYmxiYXNlPTUwMDtlLnF1b3RlZGJscmlnaHQ9NTAwO2UuZ3VpbGxlbW90cmlnaHQ9NTU2O2UuZWxsaXBzaXM9MWUzO2UucGVydGhvdXNhbmQ9MWUzO2UucXVlc3Rpb25kb3duPTYxMTtlLmdyYXZlPTMzMztlLmFjdXRlPTMzMztlLmNpcmN1bWZsZXg9MzMzO2UudGlsZGU9MzMzO2UubWFjcm9uPTMzMztlLmJyZXZlPTMzMztlLmRvdGFjY2VudD0zMzM7ZS5kaWVyZXNpcz0zMzM7ZS5yaW5nPTMzMztlLmNlZGlsbGE9MzMzO2UuaHVuZ2FydW1sYXV0PTMzMztlLm9nb25laz0zMzM7ZS5jYXJvbj0zMzM7ZS5lbWRhc2g9MWUzO2UuQUU9MWUzO2Uub3JkZmVtaW5pbmU9MzcwO2UuTHNsYXNoPTYxMTtlLk9zbGFzaD03Nzg7ZS5PRT0xZTM7ZS5vcmRtYXNjdWxpbmU9MzY1O2UuYWU9ODg5O2UuZG90bGVzc2k9Mjc4O2UubHNsYXNoPTI3ODtlLm9zbGFzaD02MTE7ZS5vZT05NDQ7ZS5nZXJtYW5kYmxzPTYxMTtlLklkaWVyZXNpcz0yNzg7ZS5lYWN1dGU9NTU2O2UuYWJyZXZlPTU1NjtlLnVodW5nYXJ1bWxhdXQ9NjExO2UuZWNhcm9uPTU1NjtlLllkaWVyZXNpcz02Njc7ZS5kaXZpZGU9NTg0O2UuWWFjdXRlPTY2NztlLkFjaXJjdW1mbGV4PTcyMjtlLmFhY3V0ZT01NTY7ZS5VY2lyY3VtZmxleD03MjI7ZS55YWN1dGU9NTU2O2Uuc2NvbW1hYWNjZW50PTU1NjtlLmVjaXJjdW1mbGV4PTU1NjtlLlVyaW5nPTcyMjtlLlVkaWVyZXNpcz03MjI7ZS5hb2dvbmVrPTU1NjtlLlVhY3V0ZT03MjI7ZS51b2dvbmVrPTYxMTtlLkVkaWVyZXNpcz02Njc7ZS5EY3JvYXQ9NzIyO2UuY29tbWFhY2NlbnQ9MjUwO2UuY29weXJpZ2h0PTczNztlLkVtYWNyb249NjY3O2UuY2Nhcm9uPTU1NjtlLmFyaW5nPTU1NjtlLk5jb21tYWFjY2VudD03MjI7ZS5sYWN1dGU9Mjc4O2UuYWdyYXZlPTU1NjtlLlRjb21tYWFjY2VudD02MTE7ZS5DYWN1dGU9NzIyO2UuYXRpbGRlPTU1NjtlLkVkb3RhY2NlbnQ9NjY3O2Uuc2Nhcm9uPTU1NjtlLnNjZWRpbGxhPTU1NjtlLmlhY3V0ZT0yNzg7ZS5sb3plbmdlPTQ5NDtlLlJjYXJvbj03MjI7ZS5HY29tbWFhY2NlbnQ9Nzc4O2UudWNpcmN1bWZsZXg9NjExO2UuYWNpcmN1bWZsZXg9NTU2O2UuQW1hY3Jvbj03MjI7ZS5yY2Fyb249Mzg5O2UuY2NlZGlsbGE9NTU2O2UuWmRvdGFjY2VudD02MTE7ZS5UaG9ybj02Njc7ZS5PbWFjcm9uPTc3ODtlLlJhY3V0ZT03MjI7ZS5TYWN1dGU9NjY3O2UuZGNhcm9uPTc0MztlLlVtYWNyb249NzIyO2UudXJpbmc9NjExO2UudGhyZWVzdXBlcmlvcj0zMzM7ZS5PZ3JhdmU9Nzc4O2UuQWdyYXZlPTcyMjtlLkFicmV2ZT03MjI7ZS5tdWx0aXBseT01ODQ7ZS51YWN1dGU9NjExO2UuVGNhcm9uPTYxMTtlLnBhcnRpYWxkaWZmPTQ5NDtlLnlkaWVyZXNpcz01NTY7ZS5OYWN1dGU9NzIyO2UuaWNpcmN1bWZsZXg9Mjc4O2UuRWNpcmN1bWZsZXg9NjY3O2UuYWRpZXJlc2lzPTU1NjtlLmVkaWVyZXNpcz01NTY7ZS5jYWN1dGU9NTU2O2UubmFjdXRlPTYxMTtlLnVtYWNyb249NjExO2UuTmNhcm9uPTcyMjtlLklhY3V0ZT0yNzg7ZS5wbHVzbWludXM9NTg0O2UuYnJva2VuYmFyPTI4MDtlLnJlZ2lzdGVyZWQ9NzM3O2UuR2JyZXZlPTc3ODtlLklkb3RhY2NlbnQ9Mjc4O2Uuc3VtbWF0aW9uPTYwMDtlLkVncmF2ZT02Njc7ZS5yYWN1dGU9Mzg5O2Uub21hY3Jvbj02MTE7ZS5aYWN1dGU9NjExO2UuWmNhcm9uPTYxMTtlLmdyZWF0ZXJlcXVhbD01NDk7ZS5FdGg9NzIyO2UuQ2NlZGlsbGE9NzIyO2UubGNvbW1hYWNjZW50PTI3ODtlLnRjYXJvbj0zODk7ZS5lb2dvbmVrPTU1NjtlLlVvZ29uZWs9NzIyO2UuQWFjdXRlPTcyMjtlLkFkaWVyZXNpcz03MjI7ZS5lZ3JhdmU9NTU2O2UuemFjdXRlPTUwMDtlLmlvZ29uZWs9Mjc4O2UuT2FjdXRlPTc3ODtlLm9hY3V0ZT02MTE7ZS5hbWFjcm9uPTU1NjtlLnNhY3V0ZT01NTY7ZS5pZGllcmVzaXM9Mjc4O2UuT2NpcmN1bWZsZXg9Nzc4O2UuVWdyYXZlPTcyMjtlLkRlbHRhPTYxMjtlLnRob3JuPTYxMTtlLnR3b3N1cGVyaW9yPTMzMztlLk9kaWVyZXNpcz03Nzg7ZS5tdT02MTE7ZS5pZ3JhdmU9Mjc4O2Uub2h1bmdhcnVtbGF1dD02MTE7ZS5Fb2dvbmVrPTY2NztlLmRjcm9hdD02MTE7ZS50aHJlZXF1YXJ0ZXJzPTgzNDtlLlNjZWRpbGxhPTY2NztlLmxjYXJvbj00MDA7ZS5LY29tbWFhY2NlbnQ9NzIyO2UuTGFjdXRlPTYxMTtlLnRyYWRlbWFyaz0xZTM7ZS5lZG90YWNjZW50PTU1NjtlLklncmF2ZT0yNzg7ZS5JbWFjcm9uPTI3ODtlLkxjYXJvbj02MTE7ZS5vbmVoYWxmPTgzNDtlLmxlc3NlcXVhbD01NDk7ZS5vY2lyY3VtZmxleD02MTE7ZS5udGlsZGU9NjExO2UuVWh1bmdhcnVtbGF1dD03MjI7ZS5FYWN1dGU9NjY3O2UuZW1hY3Jvbj01NTY7ZS5nYnJldmU9NjExO2Uub25lcXVhcnRlcj04MzQ7ZS5TY2Fyb249NjY3O2UuU2NvbW1hYWNjZW50PTY2NztlLk9odW5nYXJ1bWxhdXQ9Nzc4O2UuZGVncmVlPTQwMDtlLm9ncmF2ZT02MTE7ZS5DY2Fyb249NzIyO2UudWdyYXZlPTYxMTtlLnJhZGljYWw9NTQ5O2UuRGNhcm9uPTcyMjtlLnJjb21tYWFjY2VudD0zODk7ZS5OdGlsZGU9NzIyO2Uub3RpbGRlPTYxMTtlLlJjb21tYWFjY2VudD03MjI7ZS5MY29tbWFhY2NlbnQ9NjExO2UuQXRpbGRlPTcyMjtlLkFvZ29uZWs9NzIyO2UuQXJpbmc9NzIyO2UuT3RpbGRlPTc3ODtlLnpkb3RhY2NlbnQ9NTAwO2UuRWNhcm9uPTY2NztlLklvZ29uZWs9Mjc4O2Uua2NvbW1hYWNjZW50PTU1NjtlLm1pbnVzPTU4NDtlLkljaXJjdW1mbGV4PTI3ODtlLm5jYXJvbj02MTE7ZS50Y29tbWFhY2NlbnQ9MzMzO2UubG9naWNhbG5vdD01ODQ7ZS5vZGllcmVzaXM9NjExO2UudWRpZXJlc2lzPTYxMTtlLm5vdGVxdWFsPTU0OTtlLmdjb21tYWFjY2VudD02MTE7ZS5ldGg9NjExO2UuemNhcm9uPTUwMDtlLm5jb21tYWFjY2VudD02MTE7ZS5vbmVzdXBlcmlvcj0zMzM7ZS5pbWFjcm9uPTI3ODtlLkV1cm89NTU2fSkpO2VbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdPSgwLGEuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0yNzg7ZS5leGNsYW09MzMzO2UucXVvdGVkYmw9NDc0O2UubnVtYmVyc2lnbj01NTY7ZS5kb2xsYXI9NTU2O2UucGVyY2VudD04ODk7ZS5hbXBlcnNhbmQ9NzIyO2UucXVvdGVyaWdodD0yNzg7ZS5wYXJlbmxlZnQ9MzMzO2UucGFyZW5yaWdodD0zMzM7ZS5hc3Rlcmlzaz0zODk7ZS5wbHVzPTU4NDtlLmNvbW1hPTI3ODtlLmh5cGhlbj0zMzM7ZS5wZXJpb2Q9Mjc4O2Uuc2xhc2g9Mjc4O2UuemVybz01NTY7ZS5vbmU9NTU2O2UudHdvPTU1NjtlLnRocmVlPTU1NjtlLmZvdXI9NTU2O2UuZml2ZT01NTY7ZS5zaXg9NTU2O2Uuc2V2ZW49NTU2O2UuZWlnaHQ9NTU2O2UubmluZT01NTY7ZS5jb2xvbj0zMzM7ZS5zZW1pY29sb249MzMzO2UubGVzcz01ODQ7ZS5lcXVhbD01ODQ7ZS5ncmVhdGVyPTU4NDtlLnF1ZXN0aW9uPTYxMTtlLmF0PTk3NTtlLkE9NzIyO2UuQj03MjI7ZS5DPTcyMjtlLkQ9NzIyO2UuRT02Njc7ZS5GPTYxMTtlLkc9Nzc4O2UuSD03MjI7ZS5JPTI3ODtlLko9NTU2O2UuSz03MjI7ZS5MPTYxMTtlLk09ODMzO2UuTj03MjI7ZS5PPTc3ODtlLlA9NjY3O2UuUT03Nzg7ZS5SPTcyMjtlLlM9NjY3O2UuVD02MTE7ZS5VPTcyMjtlLlY9NjY3O2UuVz05NDQ7ZS5YPTY2NztlLlk9NjY3O2UuWj02MTE7ZS5icmFja2V0bGVmdD0zMzM7ZS5iYWNrc2xhc2g9Mjc4O2UuYnJhY2tldHJpZ2h0PTMzMztlLmFzY2lpY2lyY3VtPTU4NDtlLnVuZGVyc2NvcmU9NTU2O2UucXVvdGVsZWZ0PTI3ODtlLmE9NTU2O2UuYj02MTE7ZS5jPTU1NjtlLmQ9NjExO2UuZT01NTY7ZS5mPTMzMztlLmc9NjExO2UuaD02MTE7ZS5pPTI3ODtlLmo9Mjc4O2Uuaz01NTY7ZS5sPTI3ODtlLm09ODg5O2Uubj02MTE7ZS5vPTYxMTtlLnA9NjExO2UucT02MTE7ZS5yPTM4OTtlLnM9NTU2O2UudD0zMzM7ZS51PTYxMTtlLnY9NTU2O2Uudz03Nzg7ZS54PTU1NjtlLnk9NTU2O2Uuej01MDA7ZS5icmFjZWxlZnQ9Mzg5O2UuYmFyPTI4MDtlLmJyYWNlcmlnaHQ9Mzg5O2UuYXNjaWl0aWxkZT01ODQ7ZS5leGNsYW1kb3duPTMzMztlLmNlbnQ9NTU2O2Uuc3Rlcmxpbmc9NTU2O2UuZnJhY3Rpb249MTY3O2UueWVuPTU1NjtlLmZsb3Jpbj01NTY7ZS5zZWN0aW9uPTU1NjtlLmN1cnJlbmN5PTU1NjtlLnF1b3Rlc2luZ2xlPTIzODtlLnF1b3RlZGJsbGVmdD01MDA7ZS5ndWlsbGVtb3RsZWZ0PTU1NjtlLmd1aWxzaW5nbGxlZnQ9MzMzO2UuZ3VpbHNpbmdscmlnaHQ9MzMzO2UuZmk9NjExO2UuZmw9NjExO2UuZW5kYXNoPTU1NjtlLmRhZ2dlcj01NTY7ZS5kYWdnZXJkYmw9NTU2O2UucGVyaW9kY2VudGVyZWQ9Mjc4O2UucGFyYWdyYXBoPTU1NjtlLmJ1bGxldD0zNTA7ZS5xdW90ZXNpbmdsYmFzZT0yNzg7ZS5xdW90ZWRibGJhc2U9NTAwO2UucXVvdGVkYmxyaWdodD01MDA7ZS5ndWlsbGVtb3RyaWdodD01NTY7ZS5lbGxpcHNpcz0xZTM7ZS5wZXJ0aG91c2FuZD0xZTM7ZS5xdWVzdGlvbmRvd249NjExO2UuZ3JhdmU9MzMzO2UuYWN1dGU9MzMzO2UuY2lyY3VtZmxleD0zMzM7ZS50aWxkZT0zMzM7ZS5tYWNyb249MzMzO2UuYnJldmU9MzMzO2UuZG90YWNjZW50PTMzMztlLmRpZXJlc2lzPTMzMztlLnJpbmc9MzMzO2UuY2VkaWxsYT0zMzM7ZS5odW5nYXJ1bWxhdXQ9MzMzO2Uub2dvbmVrPTMzMztlLmNhcm9uPTMzMztlLmVtZGFzaD0xZTM7ZS5BRT0xZTM7ZS5vcmRmZW1pbmluZT0zNzA7ZS5Mc2xhc2g9NjExO2UuT3NsYXNoPTc3ODtlLk9FPTFlMztlLm9yZG1hc2N1bGluZT0zNjU7ZS5hZT04ODk7ZS5kb3RsZXNzaT0yNzg7ZS5sc2xhc2g9Mjc4O2Uub3NsYXNoPTYxMTtlLm9lPTk0NDtlLmdlcm1hbmRibHM9NjExO2UuSWRpZXJlc2lzPTI3ODtlLmVhY3V0ZT01NTY7ZS5hYnJldmU9NTU2O2UudWh1bmdhcnVtbGF1dD02MTE7ZS5lY2Fyb249NTU2O2UuWWRpZXJlc2lzPTY2NztlLmRpdmlkZT01ODQ7ZS5ZYWN1dGU9NjY3O2UuQWNpcmN1bWZsZXg9NzIyO2UuYWFjdXRlPTU1NjtlLlVjaXJjdW1mbGV4PTcyMjtlLnlhY3V0ZT01NTY7ZS5zY29tbWFhY2NlbnQ9NTU2O2UuZWNpcmN1bWZsZXg9NTU2O2UuVXJpbmc9NzIyO2UuVWRpZXJlc2lzPTcyMjtlLmFvZ29uZWs9NTU2O2UuVWFjdXRlPTcyMjtlLnVvZ29uZWs9NjExO2UuRWRpZXJlc2lzPTY2NztlLkRjcm9hdD03MjI7ZS5jb21tYWFjY2VudD0yNTA7ZS5jb3B5cmlnaHQ9NzM3O2UuRW1hY3Jvbj02Njc7ZS5jY2Fyb249NTU2O2UuYXJpbmc9NTU2O2UuTmNvbW1hYWNjZW50PTcyMjtlLmxhY3V0ZT0yNzg7ZS5hZ3JhdmU9NTU2O2UuVGNvbW1hYWNjZW50PTYxMTtlLkNhY3V0ZT03MjI7ZS5hdGlsZGU9NTU2O2UuRWRvdGFjY2VudD02Njc7ZS5zY2Fyb249NTU2O2Uuc2NlZGlsbGE9NTU2O2UuaWFjdXRlPTI3ODtlLmxvemVuZ2U9NDk0O2UuUmNhcm9uPTcyMjtlLkdjb21tYWFjY2VudD03Nzg7ZS51Y2lyY3VtZmxleD02MTE7ZS5hY2lyY3VtZmxleD01NTY7ZS5BbWFjcm9uPTcyMjtlLnJjYXJvbj0zODk7ZS5jY2VkaWxsYT01NTY7ZS5aZG90YWNjZW50PTYxMTtlLlRob3JuPTY2NztlLk9tYWNyb249Nzc4O2UuUmFjdXRlPTcyMjtlLlNhY3V0ZT02Njc7ZS5kY2Fyb249NzQzO2UuVW1hY3Jvbj03MjI7ZS51cmluZz02MTE7ZS50aHJlZXN1cGVyaW9yPTMzMztlLk9ncmF2ZT03Nzg7ZS5BZ3JhdmU9NzIyO2UuQWJyZXZlPTcyMjtlLm11bHRpcGx5PTU4NDtlLnVhY3V0ZT02MTE7ZS5UY2Fyb249NjExO2UucGFydGlhbGRpZmY9NDk0O2UueWRpZXJlc2lzPTU1NjtlLk5hY3V0ZT03MjI7ZS5pY2lyY3VtZmxleD0yNzg7ZS5FY2lyY3VtZmxleD02Njc7ZS5hZGllcmVzaXM9NTU2O2UuZWRpZXJlc2lzPTU1NjtlLmNhY3V0ZT01NTY7ZS5uYWN1dGU9NjExO2UudW1hY3Jvbj02MTE7ZS5OY2Fyb249NzIyO2UuSWFjdXRlPTI3ODtlLnBsdXNtaW51cz01ODQ7ZS5icm9rZW5iYXI9MjgwO2UucmVnaXN0ZXJlZD03Mzc7ZS5HYnJldmU9Nzc4O2UuSWRvdGFjY2VudD0yNzg7ZS5zdW1tYXRpb249NjAwO2UuRWdyYXZlPTY2NztlLnJhY3V0ZT0zODk7ZS5vbWFjcm9uPTYxMTtlLlphY3V0ZT02MTE7ZS5aY2Fyb249NjExO2UuZ3JlYXRlcmVxdWFsPTU0OTtlLkV0aD03MjI7ZS5DY2VkaWxsYT03MjI7ZS5sY29tbWFhY2NlbnQ9Mjc4O2UudGNhcm9uPTM4OTtlLmVvZ29uZWs9NTU2O2UuVW9nb25laz03MjI7ZS5BYWN1dGU9NzIyO2UuQWRpZXJlc2lzPTcyMjtlLmVncmF2ZT01NTY7ZS56YWN1dGU9NTAwO2UuaW9nb25laz0yNzg7ZS5PYWN1dGU9Nzc4O2Uub2FjdXRlPTYxMTtlLmFtYWNyb249NTU2O2Uuc2FjdXRlPTU1NjtlLmlkaWVyZXNpcz0yNzg7ZS5PY2lyY3VtZmxleD03Nzg7ZS5VZ3JhdmU9NzIyO2UuRGVsdGE9NjEyO2UudGhvcm49NjExO2UudHdvc3VwZXJpb3I9MzMzO2UuT2RpZXJlc2lzPTc3ODtlLm11PTYxMTtlLmlncmF2ZT0yNzg7ZS5vaHVuZ2FydW1sYXV0PTYxMTtlLkVvZ29uZWs9NjY3O2UuZGNyb2F0PTYxMTtlLnRocmVlcXVhcnRlcnM9ODM0O2UuU2NlZGlsbGE9NjY3O2UubGNhcm9uPTQwMDtlLktjb21tYWFjY2VudD03MjI7ZS5MYWN1dGU9NjExO2UudHJhZGVtYXJrPTFlMztlLmVkb3RhY2NlbnQ9NTU2O2UuSWdyYXZlPTI3ODtlLkltYWNyb249Mjc4O2UuTGNhcm9uPTYxMTtlLm9uZWhhbGY9ODM0O2UubGVzc2VxdWFsPTU0OTtlLm9jaXJjdW1mbGV4PTYxMTtlLm50aWxkZT02MTE7ZS5VaHVuZ2FydW1sYXV0PTcyMjtlLkVhY3V0ZT02Njc7ZS5lbWFjcm9uPTU1NjtlLmdicmV2ZT02MTE7ZS5vbmVxdWFydGVyPTgzNDtlLlNjYXJvbj02Njc7ZS5TY29tbWFhY2NlbnQ9NjY3O2UuT2h1bmdhcnVtbGF1dD03Nzg7ZS5kZWdyZWU9NDAwO2Uub2dyYXZlPTYxMTtlLkNjYXJvbj03MjI7ZS51Z3JhdmU9NjExO2UucmFkaWNhbD01NDk7ZS5EY2Fyb249NzIyO2UucmNvbW1hYWNjZW50PTM4OTtlLk50aWxkZT03MjI7ZS5vdGlsZGU9NjExO2UuUmNvbW1hYWNjZW50PTcyMjtlLkxjb21tYWFjY2VudD02MTE7ZS5BdGlsZGU9NzIyO2UuQW9nb25laz03MjI7ZS5BcmluZz03MjI7ZS5PdGlsZGU9Nzc4O2UuemRvdGFjY2VudD01MDA7ZS5FY2Fyb249NjY3O2UuSW9nb25laz0yNzg7ZS5rY29tbWFhY2NlbnQ9NTU2O2UubWludXM9NTg0O2UuSWNpcmN1bWZsZXg9Mjc4O2UubmNhcm9uPTYxMTtlLnRjb21tYWFjY2VudD0zMzM7ZS5sb2dpY2Fsbm90PTU4NDtlLm9kaWVyZXNpcz02MTE7ZS51ZGllcmVzaXM9NjExO2Uubm90ZXF1YWw9NTQ5O2UuZ2NvbW1hYWNjZW50PTYxMTtlLmV0aD02MTE7ZS56Y2Fyb249NTAwO2UubmNvbW1hYWNjZW50PTYxMTtlLm9uZXN1cGVyaW9yPTMzMztlLmltYWNyb249Mjc4O2UuRXVybz01NTZ9KSk7ZVsiSGVsdmV0aWNhLU9ibGlxdWUiXT0oMCxhLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9Mjc4O2UuZXhjbGFtPTI3ODtlLnF1b3RlZGJsPTM1NTtlLm51bWJlcnNpZ249NTU2O2UuZG9sbGFyPTU1NjtlLnBlcmNlbnQ9ODg5O2UuYW1wZXJzYW5kPTY2NztlLnF1b3RlcmlnaHQ9MjIyO2UucGFyZW5sZWZ0PTMzMztlLnBhcmVucmlnaHQ9MzMzO2UuYXN0ZXJpc2s9Mzg5O2UucGx1cz01ODQ7ZS5jb21tYT0yNzg7ZS5oeXBoZW49MzMzO2UucGVyaW9kPTI3ODtlLnNsYXNoPTI3ODtlLnplcm89NTU2O2Uub25lPTU1NjtlLnR3bz01NTY7ZS50aHJlZT01NTY7ZS5mb3VyPTU1NjtlLmZpdmU9NTU2O2Uuc2l4PTU1NjtlLnNldmVuPTU1NjtlLmVpZ2h0PTU1NjtlLm5pbmU9NTU2O2UuY29sb249Mjc4O2Uuc2VtaWNvbG9uPTI3ODtlLmxlc3M9NTg0O2UuZXF1YWw9NTg0O2UuZ3JlYXRlcj01ODQ7ZS5xdWVzdGlvbj01NTY7ZS5hdD0xMDE1O2UuQT02Njc7ZS5CPTY2NztlLkM9NzIyO2UuRD03MjI7ZS5FPTY2NztlLkY9NjExO2UuRz03Nzg7ZS5IPTcyMjtlLkk9Mjc4O2UuSj01MDA7ZS5LPTY2NztlLkw9NTU2O2UuTT04MzM7ZS5OPTcyMjtlLk89Nzc4O2UuUD02Njc7ZS5RPTc3ODtlLlI9NzIyO2UuUz02Njc7ZS5UPTYxMTtlLlU9NzIyO2UuVj02Njc7ZS5XPTk0NDtlLlg9NjY3O2UuWT02Njc7ZS5aPTYxMTtlLmJyYWNrZXRsZWZ0PTI3ODtlLmJhY2tzbGFzaD0yNzg7ZS5icmFja2V0cmlnaHQ9Mjc4O2UuYXNjaWljaXJjdW09NDY5O2UudW5kZXJzY29yZT01NTY7ZS5xdW90ZWxlZnQ9MjIyO2UuYT01NTY7ZS5iPTU1NjtlLmM9NTAwO2UuZD01NTY7ZS5lPTU1NjtlLmY9Mjc4O2UuZz01NTY7ZS5oPTU1NjtlLmk9MjIyO2Uuaj0yMjI7ZS5rPTUwMDtlLmw9MjIyO2UubT04MzM7ZS5uPTU1NjtlLm89NTU2O2UucD01NTY7ZS5xPTU1NjtlLnI9MzMzO2Uucz01MDA7ZS50PTI3ODtlLnU9NTU2O2Uudj01MDA7ZS53PTcyMjtlLng9NTAwO2UueT01MDA7ZS56PTUwMDtlLmJyYWNlbGVmdD0zMzQ7ZS5iYXI9MjYwO2UuYnJhY2VyaWdodD0zMzQ7ZS5hc2NpaXRpbGRlPTU4NDtlLmV4Y2xhbWRvd249MzMzO2UuY2VudD01NTY7ZS5zdGVybGluZz01NTY7ZS5mcmFjdGlvbj0xNjc7ZS55ZW49NTU2O2UuZmxvcmluPTU1NjtlLnNlY3Rpb249NTU2O2UuY3VycmVuY3k9NTU2O2UucXVvdGVzaW5nbGU9MTkxO2UucXVvdGVkYmxsZWZ0PTMzMztlLmd1aWxsZW1vdGxlZnQ9NTU2O2UuZ3VpbHNpbmdsbGVmdD0zMzM7ZS5ndWlsc2luZ2xyaWdodD0zMzM7ZS5maT01MDA7ZS5mbD01MDA7ZS5lbmRhc2g9NTU2O2UuZGFnZ2VyPTU1NjtlLmRhZ2dlcmRibD01NTY7ZS5wZXJpb2RjZW50ZXJlZD0yNzg7ZS5wYXJhZ3JhcGg9NTM3O2UuYnVsbGV0PTM1MDtlLnF1b3Rlc2luZ2xiYXNlPTIyMjtlLnF1b3RlZGJsYmFzZT0zMzM7ZS5xdW90ZWRibHJpZ2h0PTMzMztlLmd1aWxsZW1vdHJpZ2h0PTU1NjtlLmVsbGlwc2lzPTFlMztlLnBlcnRob3VzYW5kPTFlMztlLnF1ZXN0aW9uZG93bj02MTE7ZS5ncmF2ZT0zMzM7ZS5hY3V0ZT0zMzM7ZS5jaXJjdW1mbGV4PTMzMztlLnRpbGRlPTMzMztlLm1hY3Jvbj0zMzM7ZS5icmV2ZT0zMzM7ZS5kb3RhY2NlbnQ9MzMzO2UuZGllcmVzaXM9MzMzO2UucmluZz0zMzM7ZS5jZWRpbGxhPTMzMztlLmh1bmdhcnVtbGF1dD0zMzM7ZS5vZ29uZWs9MzMzO2UuY2Fyb249MzMzO2UuZW1kYXNoPTFlMztlLkFFPTFlMztlLm9yZGZlbWluaW5lPTM3MDtlLkxzbGFzaD01NTY7ZS5Pc2xhc2g9Nzc4O2UuT0U9MWUzO2Uub3JkbWFzY3VsaW5lPTM2NTtlLmFlPTg4OTtlLmRvdGxlc3NpPTI3ODtlLmxzbGFzaD0yMjI7ZS5vc2xhc2g9NjExO2Uub2U9OTQ0O2UuZ2VybWFuZGJscz02MTE7ZS5JZGllcmVzaXM9Mjc4O2UuZWFjdXRlPTU1NjtlLmFicmV2ZT01NTY7ZS51aHVuZ2FydW1sYXV0PTU1NjtlLmVjYXJvbj01NTY7ZS5ZZGllcmVzaXM9NjY3O2UuZGl2aWRlPTU4NDtlLllhY3V0ZT02Njc7ZS5BY2lyY3VtZmxleD02Njc7ZS5hYWN1dGU9NTU2O2UuVWNpcmN1bWZsZXg9NzIyO2UueWFjdXRlPTUwMDtlLnNjb21tYWFjY2VudD01MDA7ZS5lY2lyY3VtZmxleD01NTY7ZS5VcmluZz03MjI7ZS5VZGllcmVzaXM9NzIyO2UuYW9nb25laz01NTY7ZS5VYWN1dGU9NzIyO2UudW9nb25laz01NTY7ZS5FZGllcmVzaXM9NjY3O2UuRGNyb2F0PTcyMjtlLmNvbW1hYWNjZW50PTI1MDtlLmNvcHlyaWdodD03Mzc7ZS5FbWFjcm9uPTY2NztlLmNjYXJvbj01MDA7ZS5hcmluZz01NTY7ZS5OY29tbWFhY2NlbnQ9NzIyO2UubGFjdXRlPTIyMjtlLmFncmF2ZT01NTY7ZS5UY29tbWFhY2NlbnQ9NjExO2UuQ2FjdXRlPTcyMjtlLmF0aWxkZT01NTY7ZS5FZG90YWNjZW50PTY2NztlLnNjYXJvbj01MDA7ZS5zY2VkaWxsYT01MDA7ZS5pYWN1dGU9Mjc4O2UubG96ZW5nZT00NzE7ZS5SY2Fyb249NzIyO2UuR2NvbW1hYWNjZW50PTc3ODtlLnVjaXJjdW1mbGV4PTU1NjtlLmFjaXJjdW1mbGV4PTU1NjtlLkFtYWNyb249NjY3O2UucmNhcm9uPTMzMztlLmNjZWRpbGxhPTUwMDtlLlpkb3RhY2NlbnQ9NjExO2UuVGhvcm49NjY3O2UuT21hY3Jvbj03Nzg7ZS5SYWN1dGU9NzIyO2UuU2FjdXRlPTY2NztlLmRjYXJvbj02NDM7ZS5VbWFjcm9uPTcyMjtlLnVyaW5nPTU1NjtlLnRocmVlc3VwZXJpb3I9MzMzO2UuT2dyYXZlPTc3ODtlLkFncmF2ZT02Njc7ZS5BYnJldmU9NjY3O2UubXVsdGlwbHk9NTg0O2UudWFjdXRlPTU1NjtlLlRjYXJvbj02MTE7ZS5wYXJ0aWFsZGlmZj00NzY7ZS55ZGllcmVzaXM9NTAwO2UuTmFjdXRlPTcyMjtlLmljaXJjdW1mbGV4PTI3ODtlLkVjaXJjdW1mbGV4PTY2NztlLmFkaWVyZXNpcz01NTY7ZS5lZGllcmVzaXM9NTU2O2UuY2FjdXRlPTUwMDtlLm5hY3V0ZT01NTY7ZS51bWFjcm9uPTU1NjtlLk5jYXJvbj03MjI7ZS5JYWN1dGU9Mjc4O2UucGx1c21pbnVzPTU4NDtlLmJyb2tlbmJhcj0yNjA7ZS5yZWdpc3RlcmVkPTczNztlLkdicmV2ZT03Nzg7ZS5JZG90YWNjZW50PTI3ODtlLnN1bW1hdGlvbj02MDA7ZS5FZ3JhdmU9NjY3O2UucmFjdXRlPTMzMztlLm9tYWNyb249NTU2O2UuWmFjdXRlPTYxMTtlLlpjYXJvbj02MTE7ZS5ncmVhdGVyZXF1YWw9NTQ5O2UuRXRoPTcyMjtlLkNjZWRpbGxhPTcyMjtlLmxjb21tYWFjY2VudD0yMjI7ZS50Y2Fyb249MzE3O2UuZW9nb25laz01NTY7ZS5Vb2dvbmVrPTcyMjtlLkFhY3V0ZT02Njc7ZS5BZGllcmVzaXM9NjY3O2UuZWdyYXZlPTU1NjtlLnphY3V0ZT01MDA7ZS5pb2dvbmVrPTIyMjtlLk9hY3V0ZT03Nzg7ZS5vYWN1dGU9NTU2O2UuYW1hY3Jvbj01NTY7ZS5zYWN1dGU9NTAwO2UuaWRpZXJlc2lzPTI3ODtlLk9jaXJjdW1mbGV4PTc3ODtlLlVncmF2ZT03MjI7ZS5EZWx0YT02MTI7ZS50aG9ybj01NTY7ZS50d29zdXBlcmlvcj0zMzM7ZS5PZGllcmVzaXM9Nzc4O2UubXU9NTU2O2UuaWdyYXZlPTI3ODtlLm9odW5nYXJ1bWxhdXQ9NTU2O2UuRW9nb25laz02Njc7ZS5kY3JvYXQ9NTU2O2UudGhyZWVxdWFydGVycz04MzQ7ZS5TY2VkaWxsYT02Njc7ZS5sY2Fyb249Mjk5O2UuS2NvbW1hYWNjZW50PTY2NztlLkxhY3V0ZT01NTY7ZS50cmFkZW1hcms9MWUzO2UuZWRvdGFjY2VudD01NTY7ZS5JZ3JhdmU9Mjc4O2UuSW1hY3Jvbj0yNzg7ZS5MY2Fyb249NTU2O2Uub25laGFsZj04MzQ7ZS5sZXNzZXF1YWw9NTQ5O2Uub2NpcmN1bWZsZXg9NTU2O2UubnRpbGRlPTU1NjtlLlVodW5nYXJ1bWxhdXQ9NzIyO2UuRWFjdXRlPTY2NztlLmVtYWNyb249NTU2O2UuZ2JyZXZlPTU1NjtlLm9uZXF1YXJ0ZXI9ODM0O2UuU2Nhcm9uPTY2NztlLlNjb21tYWFjY2VudD02Njc7ZS5PaHVuZ2FydW1sYXV0PTc3ODtlLmRlZ3JlZT00MDA7ZS5vZ3JhdmU9NTU2O2UuQ2Nhcm9uPTcyMjtlLnVncmF2ZT01NTY7ZS5yYWRpY2FsPTQ1MztlLkRjYXJvbj03MjI7ZS5yY29tbWFhY2NlbnQ9MzMzO2UuTnRpbGRlPTcyMjtlLm90aWxkZT01NTY7ZS5SY29tbWFhY2NlbnQ9NzIyO2UuTGNvbW1hYWNjZW50PTU1NjtlLkF0aWxkZT02Njc7ZS5Bb2dvbmVrPTY2NztlLkFyaW5nPTY2NztlLk90aWxkZT03Nzg7ZS56ZG90YWNjZW50PTUwMDtlLkVjYXJvbj02Njc7ZS5Jb2dvbmVrPTI3ODtlLmtjb21tYWFjY2VudD01MDA7ZS5taW51cz01ODQ7ZS5JY2lyY3VtZmxleD0yNzg7ZS5uY2Fyb249NTU2O2UudGNvbW1hYWNjZW50PTI3ODtlLmxvZ2ljYWxub3Q9NTg0O2Uub2RpZXJlc2lzPTU1NjtlLnVkaWVyZXNpcz01NTY7ZS5ub3RlcXVhbD01NDk7ZS5nY29tbWFhY2NlbnQ9NTU2O2UuZXRoPTU1NjtlLnpjYXJvbj01MDA7ZS5uY29tbWFhY2NlbnQ9NTU2O2Uub25lc3VwZXJpb3I9MzMzO2UuaW1hY3Jvbj0yNzg7ZS5FdXJvPTU1Nn0pKTtlLlN5bWJvbD0oMCxhLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwO2UuZXhjbGFtPTMzMztlLnVuaXZlcnNhbD03MTM7ZS5udW1iZXJzaWduPTUwMDtlLmV4aXN0ZW50aWFsPTU0OTtlLnBlcmNlbnQ9ODMzO2UuYW1wZXJzYW5kPTc3ODtlLnN1Y2h0aGF0PTQzOTtlLnBhcmVubGVmdD0zMzM7ZS5wYXJlbnJpZ2h0PTMzMztlLmFzdGVyaXNrbWF0aD01MDA7ZS5wbHVzPTU0OTtlLmNvbW1hPTI1MDtlLm1pbnVzPTU0OTtlLnBlcmlvZD0yNTA7ZS5zbGFzaD0yNzg7ZS56ZXJvPTUwMDtlLm9uZT01MDA7ZS50d289NTAwO2UudGhyZWU9NTAwO2UuZm91cj01MDA7ZS5maXZlPTUwMDtlLnNpeD01MDA7ZS5zZXZlbj01MDA7ZS5laWdodD01MDA7ZS5uaW5lPTUwMDtlLmNvbG9uPTI3ODtlLnNlbWljb2xvbj0yNzg7ZS5sZXNzPTU0OTtlLmVxdWFsPTU0OTtlLmdyZWF0ZXI9NTQ5O2UucXVlc3Rpb249NDQ0O2UuY29uZ3J1ZW50PTU0OTtlLkFscGhhPTcyMjtlLkJldGE9NjY3O2UuQ2hpPTcyMjtlLkRlbHRhPTYxMjtlLkVwc2lsb249NjExO2UuUGhpPTc2MztlLkdhbW1hPTYwMztlLkV0YT03MjI7ZS5Jb3RhPTMzMztlLnRoZXRhMT02MzE7ZS5LYXBwYT03MjI7ZS5MYW1iZGE9Njg2O2UuTXU9ODg5O2UuTnU9NzIyO2UuT21pY3Jvbj03MjI7ZS5QaT03Njg7ZS5UaGV0YT03NDE7ZS5SaG89NTU2O2UuU2lnbWE9NTkyO2UuVGF1PTYxMTtlLlVwc2lsb249NjkwO2Uuc2lnbWExPTQzOTtlLk9tZWdhPTc2ODtlLlhpPTY0NTtlLlBzaT03OTU7ZS5aZXRhPTYxMTtlLmJyYWNrZXRsZWZ0PTMzMztlLnRoZXJlZm9yZT04NjM7ZS5icmFja2V0cmlnaHQ9MzMzO2UucGVycGVuZGljdWxhcj02NTg7ZS51bmRlcnNjb3JlPTUwMDtlLnJhZGljYWxleD01MDA7ZS5hbHBoYT02MzE7ZS5iZXRhPTU0OTtlLmNoaT01NDk7ZS5kZWx0YT00OTQ7ZS5lcHNpbG9uPTQzOTtlLnBoaT01MjE7ZS5nYW1tYT00MTE7ZS5ldGE9NjAzO2UuaW90YT0zMjk7ZS5waGkxPTYwMztlLmthcHBhPTU0OTtlLmxhbWJkYT01NDk7ZS5tdT01NzY7ZS5udT01MjE7ZS5vbWljcm9uPTU0OTtlLnBpPTU0OTtlLnRoZXRhPTUyMTtlLnJobz01NDk7ZS5zaWdtYT02MDM7ZS50YXU9NDM5O2UudXBzaWxvbj01NzY7ZS5vbWVnYTE9NzEzO2Uub21lZ2E9Njg2O2UueGk9NDkzO2UucHNpPTY4NjtlLnpldGE9NDk0O2UuYnJhY2VsZWZ0PTQ4MDtlLmJhcj0yMDA7ZS5icmFjZXJpZ2h0PTQ4MDtlLnNpbWlsYXI9NTQ5O2UuRXVybz03NTA7ZS5VcHNpbG9uMT02MjA7ZS5taW51dGU9MjQ3O2UubGVzc2VxdWFsPTU0OTtlLmZyYWN0aW9uPTE2NztlLmluZmluaXR5PTcxMztlLmZsb3Jpbj01MDA7ZS5jbHViPTc1MztlLmRpYW1vbmQ9NzUzO2UuaGVhcnQ9NzUzO2Uuc3BhZGU9NzUzO2UuYXJyb3dib3RoPTEwNDI7ZS5hcnJvd2xlZnQ9OTg3O2UuYXJyb3d1cD02MDM7ZS5hcnJvd3JpZ2h0PTk4NztlLmFycm93ZG93bj02MDM7ZS5kZWdyZWU9NDAwO2UucGx1c21pbnVzPTU0OTtlLnNlY29uZD00MTE7ZS5ncmVhdGVyZXF1YWw9NTQ5O2UubXVsdGlwbHk9NTQ5O2UucHJvcG9ydGlvbmFsPTcxMztlLnBhcnRpYWxkaWZmPTQ5NDtlLmJ1bGxldD00NjA7ZS5kaXZpZGU9NTQ5O2Uubm90ZXF1YWw9NTQ5O2UuZXF1aXZhbGVuY2U9NTQ5O2UuYXBwcm94ZXF1YWw9NTQ5O2UuZWxsaXBzaXM9MWUzO2UuYXJyb3d2ZXJ0ZXg9NjAzO2UuYXJyb3dob3JpemV4PTFlMztlLmNhcnJpYWdlcmV0dXJuPTY1ODtlLmFsZXBoPTgyMztlLklmcmFrdHVyPTY4NjtlLlJmcmFrdHVyPTc5NTtlLndlaWVyc3RyYXNzPTk4NztlLmNpcmNsZW11bHRpcGx5PTc2ODtlLmNpcmNsZXBsdXM9NzY4O2UuZW1wdHlzZXQ9ODIzO2UuaW50ZXJzZWN0aW9uPTc2ODtlLnVuaW9uPTc2ODtlLnByb3BlcnN1cGVyc2V0PTcxMztlLnJlZmxleHN1cGVyc2V0PTcxMztlLm5vdHN1YnNldD03MTM7ZS5wcm9wZXJzdWJzZXQ9NzEzO2UucmVmbGV4c3Vic2V0PTcxMztlLmVsZW1lbnQ9NzEzO2Uubm90ZWxlbWVudD03MTM7ZS5hbmdsZT03Njg7ZS5ncmFkaWVudD03MTM7ZS5yZWdpc3RlcnNlcmlmPTc5MDtlLmNvcHlyaWdodHNlcmlmPTc5MDtlLnRyYWRlbWFya3NlcmlmPTg5MDtlLnByb2R1Y3Q9ODIzO2UucmFkaWNhbD01NDk7ZS5kb3RtYXRoPTI1MDtlLmxvZ2ljYWxub3Q9NzEzO2UubG9naWNhbGFuZD02MDM7ZS5sb2dpY2Fsb3I9NjAzO2UuYXJyb3dkYmxib3RoPTEwNDI7ZS5hcnJvd2RibGxlZnQ9OTg3O2UuYXJyb3dkYmx1cD02MDM7ZS5hcnJvd2RibHJpZ2h0PTk4NztlLmFycm93ZGJsZG93bj02MDM7ZS5sb3plbmdlPTQ5NDtlLmFuZ2xlbGVmdD0zMjk7ZS5yZWdpc3RlcnNhbnM9NzkwO2UuY29weXJpZ2h0c2Fucz03OTA7ZS50cmFkZW1hcmtzYW5zPTc4NjtlLnN1bW1hdGlvbj03MTM7ZS5wYXJlbmxlZnR0cD0zODQ7ZS5wYXJlbmxlZnRleD0zODQ7ZS5wYXJlbmxlZnRidD0zODQ7ZS5icmFja2V0bGVmdHRwPTM4NDtlLmJyYWNrZXRsZWZ0ZXg9Mzg0O2UuYnJhY2tldGxlZnRidD0zODQ7ZS5icmFjZWxlZnR0cD00OTQ7ZS5icmFjZWxlZnRtaWQ9NDk0O2UuYnJhY2VsZWZ0YnQ9NDk0O2UuYnJhY2VleD00OTQ7ZS5hbmdsZXJpZ2h0PTMyOTtlLmludGVncmFsPTI3NDtlLmludGVncmFsdHA9Njg2O2UuaW50ZWdyYWxleD02ODY7ZS5pbnRlZ3JhbGJ0PTY4NjtlLnBhcmVucmlnaHR0cD0zODQ7ZS5wYXJlbnJpZ2h0ZXg9Mzg0O2UucGFyZW5yaWdodGJ0PTM4NDtlLmJyYWNrZXRyaWdodHRwPTM4NDtlLmJyYWNrZXRyaWdodGV4PTM4NDtlLmJyYWNrZXRyaWdodGJ0PTM4NDtlLmJyYWNlcmlnaHR0cD00OTQ7ZS5icmFjZXJpZ2h0bWlkPTQ5NDtlLmJyYWNlcmlnaHRidD00OTQ7ZS5hcHBsZT03OTB9KSk7ZVsiVGltZXMtUm9tYW4iXT0oMCxhLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwO2UuZXhjbGFtPTMzMztlLnF1b3RlZGJsPTQwODtlLm51bWJlcnNpZ249NTAwO2UuZG9sbGFyPTUwMDtlLnBlcmNlbnQ9ODMzO2UuYW1wZXJzYW5kPTc3ODtlLnF1b3RlcmlnaHQ9MzMzO2UucGFyZW5sZWZ0PTMzMztlLnBhcmVucmlnaHQ9MzMzO2UuYXN0ZXJpc2s9NTAwO2UucGx1cz01NjQ7ZS5jb21tYT0yNTA7ZS5oeXBoZW49MzMzO2UucGVyaW9kPTI1MDtlLnNsYXNoPTI3ODtlLnplcm89NTAwO2Uub25lPTUwMDtlLnR3bz01MDA7ZS50aHJlZT01MDA7ZS5mb3VyPTUwMDtlLmZpdmU9NTAwO2Uuc2l4PTUwMDtlLnNldmVuPTUwMDtlLmVpZ2h0PTUwMDtlLm5pbmU9NTAwO2UuY29sb249Mjc4O2Uuc2VtaWNvbG9uPTI3ODtlLmxlc3M9NTY0O2UuZXF1YWw9NTY0O2UuZ3JlYXRlcj01NjQ7ZS5xdWVzdGlvbj00NDQ7ZS5hdD05MjE7ZS5BPTcyMjtlLkI9NjY3O2UuQz02Njc7ZS5EPTcyMjtlLkU9NjExO2UuRj01NTY7ZS5HPTcyMjtlLkg9NzIyO2UuST0zMzM7ZS5KPTM4OTtlLks9NzIyO2UuTD02MTE7ZS5NPTg4OTtlLk49NzIyO2UuTz03MjI7ZS5QPTU1NjtlLlE9NzIyO2UuUj02Njc7ZS5TPTU1NjtlLlQ9NjExO2UuVT03MjI7ZS5WPTcyMjtlLlc9OTQ0O2UuWD03MjI7ZS5ZPTcyMjtlLlo9NjExO2UuYnJhY2tldGxlZnQ9MzMzO2UuYmFja3NsYXNoPTI3ODtlLmJyYWNrZXRyaWdodD0zMzM7ZS5hc2NpaWNpcmN1bT00Njk7ZS51bmRlcnNjb3JlPTUwMDtlLnF1b3RlbGVmdD0zMzM7ZS5hPTQ0NDtlLmI9NTAwO2UuYz00NDQ7ZS5kPTUwMDtlLmU9NDQ0O2UuZj0zMzM7ZS5nPTUwMDtlLmg9NTAwO2UuaT0yNzg7ZS5qPTI3ODtlLms9NTAwO2UubD0yNzg7ZS5tPTc3ODtlLm49NTAwO2Uubz01MDA7ZS5wPTUwMDtlLnE9NTAwO2Uucj0zMzM7ZS5zPTM4OTtlLnQ9Mjc4O2UudT01MDA7ZS52PTUwMDtlLnc9NzIyO2UueD01MDA7ZS55PTUwMDtlLno9NDQ0O2UuYnJhY2VsZWZ0PTQ4MDtlLmJhcj0yMDA7ZS5icmFjZXJpZ2h0PTQ4MDtlLmFzY2lpdGlsZGU9NTQxO2UuZXhjbGFtZG93bj0zMzM7ZS5jZW50PTUwMDtlLnN0ZXJsaW5nPTUwMDtlLmZyYWN0aW9uPTE2NztlLnllbj01MDA7ZS5mbG9yaW49NTAwO2Uuc2VjdGlvbj01MDA7ZS5jdXJyZW5jeT01MDA7ZS5xdW90ZXNpbmdsZT0xODA7ZS5xdW90ZWRibGxlZnQ9NDQ0O2UuZ3VpbGxlbW90bGVmdD01MDA7ZS5ndWlsc2luZ2xsZWZ0PTMzMztlLmd1aWxzaW5nbHJpZ2h0PTMzMztlLmZpPTU1NjtlLmZsPTU1NjtlLmVuZGFzaD01MDA7ZS5kYWdnZXI9NTAwO2UuZGFnZ2VyZGJsPTUwMDtlLnBlcmlvZGNlbnRlcmVkPTI1MDtlLnBhcmFncmFwaD00NTM7ZS5idWxsZXQ9MzUwO2UucXVvdGVzaW5nbGJhc2U9MzMzO2UucXVvdGVkYmxiYXNlPTQ0NDtlLnF1b3RlZGJscmlnaHQ9NDQ0O2UuZ3VpbGxlbW90cmlnaHQ9NTAwO2UuZWxsaXBzaXM9MWUzO2UucGVydGhvdXNhbmQ9MWUzO2UucXVlc3Rpb25kb3duPTQ0NDtlLmdyYXZlPTMzMztlLmFjdXRlPTMzMztlLmNpcmN1bWZsZXg9MzMzO2UudGlsZGU9MzMzO2UubWFjcm9uPTMzMztlLmJyZXZlPTMzMztlLmRvdGFjY2VudD0zMzM7ZS5kaWVyZXNpcz0zMzM7ZS5yaW5nPTMzMztlLmNlZGlsbGE9MzMzO2UuaHVuZ2FydW1sYXV0PTMzMztlLm9nb25laz0zMzM7ZS5jYXJvbj0zMzM7ZS5lbWRhc2g9MWUzO2UuQUU9ODg5O2Uub3JkZmVtaW5pbmU9Mjc2O2UuTHNsYXNoPTYxMTtlLk9zbGFzaD03MjI7ZS5PRT04ODk7ZS5vcmRtYXNjdWxpbmU9MzEwO2UuYWU9NjY3O2UuZG90bGVzc2k9Mjc4O2UubHNsYXNoPTI3ODtlLm9zbGFzaD01MDA7ZS5vZT03MjI7ZS5nZXJtYW5kYmxzPTUwMDtlLklkaWVyZXNpcz0zMzM7ZS5lYWN1dGU9NDQ0O2UuYWJyZXZlPTQ0NDtlLnVodW5nYXJ1bWxhdXQ9NTAwO2UuZWNhcm9uPTQ0NDtlLllkaWVyZXNpcz03MjI7ZS5kaXZpZGU9NTY0O2UuWWFjdXRlPTcyMjtlLkFjaXJjdW1mbGV4PTcyMjtlLmFhY3V0ZT00NDQ7ZS5VY2lyY3VtZmxleD03MjI7ZS55YWN1dGU9NTAwO2Uuc2NvbW1hYWNjZW50PTM4OTtlLmVjaXJjdW1mbGV4PTQ0NDtlLlVyaW5nPTcyMjtlLlVkaWVyZXNpcz03MjI7ZS5hb2dvbmVrPTQ0NDtlLlVhY3V0ZT03MjI7ZS51b2dvbmVrPTUwMDtlLkVkaWVyZXNpcz02MTE7ZS5EY3JvYXQ9NzIyO2UuY29tbWFhY2NlbnQ9MjUwO2UuY29weXJpZ2h0PTc2MDtlLkVtYWNyb249NjExO2UuY2Nhcm9uPTQ0NDtlLmFyaW5nPTQ0NDtlLk5jb21tYWFjY2VudD03MjI7ZS5sYWN1dGU9Mjc4O2UuYWdyYXZlPTQ0NDtlLlRjb21tYWFjY2VudD02MTE7ZS5DYWN1dGU9NjY3O2UuYXRpbGRlPTQ0NDtlLkVkb3RhY2NlbnQ9NjExO2Uuc2Nhcm9uPTM4OTtlLnNjZWRpbGxhPTM4OTtlLmlhY3V0ZT0yNzg7ZS5sb3plbmdlPTQ3MTtlLlJjYXJvbj02Njc7ZS5HY29tbWFhY2NlbnQ9NzIyO2UudWNpcmN1bWZsZXg9NTAwO2UuYWNpcmN1bWZsZXg9NDQ0O2UuQW1hY3Jvbj03MjI7ZS5yY2Fyb249MzMzO2UuY2NlZGlsbGE9NDQ0O2UuWmRvdGFjY2VudD02MTE7ZS5UaG9ybj01NTY7ZS5PbWFjcm9uPTcyMjtlLlJhY3V0ZT02Njc7ZS5TYWN1dGU9NTU2O2UuZGNhcm9uPTU4ODtlLlVtYWNyb249NzIyO2UudXJpbmc9NTAwO2UudGhyZWVzdXBlcmlvcj0zMDA7ZS5PZ3JhdmU9NzIyO2UuQWdyYXZlPTcyMjtlLkFicmV2ZT03MjI7ZS5tdWx0aXBseT01NjQ7ZS51YWN1dGU9NTAwO2UuVGNhcm9uPTYxMTtlLnBhcnRpYWxkaWZmPTQ3NjtlLnlkaWVyZXNpcz01MDA7ZS5OYWN1dGU9NzIyO2UuaWNpcmN1bWZsZXg9Mjc4O2UuRWNpcmN1bWZsZXg9NjExO2UuYWRpZXJlc2lzPTQ0NDtlLmVkaWVyZXNpcz00NDQ7ZS5jYWN1dGU9NDQ0O2UubmFjdXRlPTUwMDtlLnVtYWNyb249NTAwO2UuTmNhcm9uPTcyMjtlLklhY3V0ZT0zMzM7ZS5wbHVzbWludXM9NTY0O2UuYnJva2VuYmFyPTIwMDtlLnJlZ2lzdGVyZWQ9NzYwO2UuR2JyZXZlPTcyMjtlLklkb3RhY2NlbnQ9MzMzO2Uuc3VtbWF0aW9uPTYwMDtlLkVncmF2ZT02MTE7ZS5yYWN1dGU9MzMzO2Uub21hY3Jvbj01MDA7ZS5aYWN1dGU9NjExO2UuWmNhcm9uPTYxMTtlLmdyZWF0ZXJlcXVhbD01NDk7ZS5FdGg9NzIyO2UuQ2NlZGlsbGE9NjY3O2UubGNvbW1hYWNjZW50PTI3ODtlLnRjYXJvbj0zMjY7ZS5lb2dvbmVrPTQ0NDtlLlVvZ29uZWs9NzIyO2UuQWFjdXRlPTcyMjtlLkFkaWVyZXNpcz03MjI7ZS5lZ3JhdmU9NDQ0O2UuemFjdXRlPTQ0NDtlLmlvZ29uZWs9Mjc4O2UuT2FjdXRlPTcyMjtlLm9hY3V0ZT01MDA7ZS5hbWFjcm9uPTQ0NDtlLnNhY3V0ZT0zODk7ZS5pZGllcmVzaXM9Mjc4O2UuT2NpcmN1bWZsZXg9NzIyO2UuVWdyYXZlPTcyMjtlLkRlbHRhPTYxMjtlLnRob3JuPTUwMDtlLnR3b3N1cGVyaW9yPTMwMDtlLk9kaWVyZXNpcz03MjI7ZS5tdT01MDA7ZS5pZ3JhdmU9Mjc4O2Uub2h1bmdhcnVtbGF1dD01MDA7ZS5Fb2dvbmVrPTYxMTtlLmRjcm9hdD01MDA7ZS50aHJlZXF1YXJ0ZXJzPTc1MDtlLlNjZWRpbGxhPTU1NjtlLmxjYXJvbj0zNDQ7ZS5LY29tbWFhY2NlbnQ9NzIyO2UuTGFjdXRlPTYxMTtlLnRyYWRlbWFyaz05ODA7ZS5lZG90YWNjZW50PTQ0NDtlLklncmF2ZT0zMzM7ZS5JbWFjcm9uPTMzMztlLkxjYXJvbj02MTE7ZS5vbmVoYWxmPTc1MDtlLmxlc3NlcXVhbD01NDk7ZS5vY2lyY3VtZmxleD01MDA7ZS5udGlsZGU9NTAwO2UuVWh1bmdhcnVtbGF1dD03MjI7ZS5FYWN1dGU9NjExO2UuZW1hY3Jvbj00NDQ7ZS5nYnJldmU9NTAwO2Uub25lcXVhcnRlcj03NTA7ZS5TY2Fyb249NTU2O2UuU2NvbW1hYWNjZW50PTU1NjtlLk9odW5nYXJ1bWxhdXQ9NzIyO2UuZGVncmVlPTQwMDtlLm9ncmF2ZT01MDA7ZS5DY2Fyb249NjY3O2UudWdyYXZlPTUwMDtlLnJhZGljYWw9NDUzO2UuRGNhcm9uPTcyMjtlLnJjb21tYWFjY2VudD0zMzM7ZS5OdGlsZGU9NzIyO2Uub3RpbGRlPTUwMDtlLlJjb21tYWFjY2VudD02Njc7ZS5MY29tbWFhY2NlbnQ9NjExO2UuQXRpbGRlPTcyMjtlLkFvZ29uZWs9NzIyO2UuQXJpbmc9NzIyO2UuT3RpbGRlPTcyMjtlLnpkb3RhY2NlbnQ9NDQ0O2UuRWNhcm9uPTYxMTtlLklvZ29uZWs9MzMzO2Uua2NvbW1hYWNjZW50PTUwMDtlLm1pbnVzPTU2NDtlLkljaXJjdW1mbGV4PTMzMztlLm5jYXJvbj01MDA7ZS50Y29tbWFhY2NlbnQ9Mjc4O2UubG9naWNhbG5vdD01NjQ7ZS5vZGllcmVzaXM9NTAwO2UudWRpZXJlc2lzPTUwMDtlLm5vdGVxdWFsPTU0OTtlLmdjb21tYWFjY2VudD01MDA7ZS5ldGg9NTAwO2UuemNhcm9uPTQ0NDtlLm5jb21tYWFjY2VudD01MDA7ZS5vbmVzdXBlcmlvcj0zMDA7ZS5pbWFjcm9uPTI3ODtlLkV1cm89NTAwfSkpO2VbIlRpbWVzLUJvbGQiXT0oMCxhLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwO2UuZXhjbGFtPTMzMztlLnF1b3RlZGJsPTU1NTtlLm51bWJlcnNpZ249NTAwO2UuZG9sbGFyPTUwMDtlLnBlcmNlbnQ9MWUzO2UuYW1wZXJzYW5kPTgzMztlLnF1b3RlcmlnaHQ9MzMzO2UucGFyZW5sZWZ0PTMzMztlLnBhcmVucmlnaHQ9MzMzO2UuYXN0ZXJpc2s9NTAwO2UucGx1cz01NzA7ZS5jb21tYT0yNTA7ZS5oeXBoZW49MzMzO2UucGVyaW9kPTI1MDtlLnNsYXNoPTI3ODtlLnplcm89NTAwO2Uub25lPTUwMDtlLnR3bz01MDA7ZS50aHJlZT01MDA7ZS5mb3VyPTUwMDtlLmZpdmU9NTAwO2Uuc2l4PTUwMDtlLnNldmVuPTUwMDtlLmVpZ2h0PTUwMDtlLm5pbmU9NTAwO2UuY29sb249MzMzO2Uuc2VtaWNvbG9uPTMzMztlLmxlc3M9NTcwO2UuZXF1YWw9NTcwO2UuZ3JlYXRlcj01NzA7ZS5xdWVzdGlvbj01MDA7ZS5hdD05MzA7ZS5BPTcyMjtlLkI9NjY3O2UuQz03MjI7ZS5EPTcyMjtlLkU9NjY3O2UuRj02MTE7ZS5HPTc3ODtlLkg9Nzc4O2UuST0zODk7ZS5KPTUwMDtlLks9Nzc4O2UuTD02Njc7ZS5NPTk0NDtlLk49NzIyO2UuTz03Nzg7ZS5QPTYxMTtlLlE9Nzc4O2UuUj03MjI7ZS5TPTU1NjtlLlQ9NjY3O2UuVT03MjI7ZS5WPTcyMjtlLlc9MWUzO2UuWD03MjI7ZS5ZPTcyMjtlLlo9NjY3O2UuYnJhY2tldGxlZnQ9MzMzO2UuYmFja3NsYXNoPTI3ODtlLmJyYWNrZXRyaWdodD0zMzM7ZS5hc2NpaWNpcmN1bT01ODE7ZS51bmRlcnNjb3JlPTUwMDtlLnF1b3RlbGVmdD0zMzM7ZS5hPTUwMDtlLmI9NTU2O2UuYz00NDQ7ZS5kPTU1NjtlLmU9NDQ0O2UuZj0zMzM7ZS5nPTUwMDtlLmg9NTU2O2UuaT0yNzg7ZS5qPTMzMztlLms9NTU2O2UubD0yNzg7ZS5tPTgzMztlLm49NTU2O2Uubz01MDA7ZS5wPTU1NjtlLnE9NTU2O2Uucj00NDQ7ZS5zPTM4OTtlLnQ9MzMzO2UudT01NTY7ZS52PTUwMDtlLnc9NzIyO2UueD01MDA7ZS55PTUwMDtlLno9NDQ0O2UuYnJhY2VsZWZ0PTM5NDtlLmJhcj0yMjA7ZS5icmFjZXJpZ2h0PTM5NDtlLmFzY2lpdGlsZGU9NTIwO2UuZXhjbGFtZG93bj0zMzM7ZS5jZW50PTUwMDtlLnN0ZXJsaW5nPTUwMDtlLmZyYWN0aW9uPTE2NztlLnllbj01MDA7ZS5mbG9yaW49NTAwO2Uuc2VjdGlvbj01MDA7ZS5jdXJyZW5jeT01MDA7ZS5xdW90ZXNpbmdsZT0yNzg7ZS5xdW90ZWRibGxlZnQ9NTAwO2UuZ3VpbGxlbW90bGVmdD01MDA7ZS5ndWlsc2luZ2xsZWZ0PTMzMztlLmd1aWxzaW5nbHJpZ2h0PTMzMztlLmZpPTU1NjtlLmZsPTU1NjtlLmVuZGFzaD01MDA7ZS5kYWdnZXI9NTAwO2UuZGFnZ2VyZGJsPTUwMDtlLnBlcmlvZGNlbnRlcmVkPTI1MDtlLnBhcmFncmFwaD01NDA7ZS5idWxsZXQ9MzUwO2UucXVvdGVzaW5nbGJhc2U9MzMzO2UucXVvdGVkYmxiYXNlPTUwMDtlLnF1b3RlZGJscmlnaHQ9NTAwO2UuZ3VpbGxlbW90cmlnaHQ9NTAwO2UuZWxsaXBzaXM9MWUzO2UucGVydGhvdXNhbmQ9MWUzO2UucXVlc3Rpb25kb3duPTUwMDtlLmdyYXZlPTMzMztlLmFjdXRlPTMzMztlLmNpcmN1bWZsZXg9MzMzO2UudGlsZGU9MzMzO2UubWFjcm9uPTMzMztlLmJyZXZlPTMzMztlLmRvdGFjY2VudD0zMzM7ZS5kaWVyZXNpcz0zMzM7ZS5yaW5nPTMzMztlLmNlZGlsbGE9MzMzO2UuaHVuZ2FydW1sYXV0PTMzMztlLm9nb25laz0zMzM7ZS5jYXJvbj0zMzM7ZS5lbWRhc2g9MWUzO2UuQUU9MWUzO2Uub3JkZmVtaW5pbmU9MzAwO2UuTHNsYXNoPTY2NztlLk9zbGFzaD03Nzg7ZS5PRT0xZTM7ZS5vcmRtYXNjdWxpbmU9MzMwO2UuYWU9NzIyO2UuZG90bGVzc2k9Mjc4O2UubHNsYXNoPTI3ODtlLm9zbGFzaD01MDA7ZS5vZT03MjI7ZS5nZXJtYW5kYmxzPTU1NjtlLklkaWVyZXNpcz0zODk7ZS5lYWN1dGU9NDQ0O2UuYWJyZXZlPTUwMDtlLnVodW5nYXJ1bWxhdXQ9NTU2O2UuZWNhcm9uPTQ0NDtlLllkaWVyZXNpcz03MjI7ZS5kaXZpZGU9NTcwO2UuWWFjdXRlPTcyMjtlLkFjaXJjdW1mbGV4PTcyMjtlLmFhY3V0ZT01MDA7ZS5VY2lyY3VtZmxleD03MjI7ZS55YWN1dGU9NTAwO2Uuc2NvbW1hYWNjZW50PTM4OTtlLmVjaXJjdW1mbGV4PTQ0NDtlLlVyaW5nPTcyMjtlLlVkaWVyZXNpcz03MjI7ZS5hb2dvbmVrPTUwMDtlLlVhY3V0ZT03MjI7ZS51b2dvbmVrPTU1NjtlLkVkaWVyZXNpcz02Njc7ZS5EY3JvYXQ9NzIyO2UuY29tbWFhY2NlbnQ9MjUwO2UuY29weXJpZ2h0PTc0NztlLkVtYWNyb249NjY3O2UuY2Nhcm9uPTQ0NDtlLmFyaW5nPTUwMDtlLk5jb21tYWFjY2VudD03MjI7ZS5sYWN1dGU9Mjc4O2UuYWdyYXZlPTUwMDtlLlRjb21tYWFjY2VudD02Njc7ZS5DYWN1dGU9NzIyO2UuYXRpbGRlPTUwMDtlLkVkb3RhY2NlbnQ9NjY3O2Uuc2Nhcm9uPTM4OTtlLnNjZWRpbGxhPTM4OTtlLmlhY3V0ZT0yNzg7ZS5sb3plbmdlPTQ5NDtlLlJjYXJvbj03MjI7ZS5HY29tbWFhY2NlbnQ9Nzc4O2UudWNpcmN1bWZsZXg9NTU2O2UuYWNpcmN1bWZsZXg9NTAwO2UuQW1hY3Jvbj03MjI7ZS5yY2Fyb249NDQ0O2UuY2NlZGlsbGE9NDQ0O2UuWmRvdGFjY2VudD02Njc7ZS5UaG9ybj02MTE7ZS5PbWFjcm9uPTc3ODtlLlJhY3V0ZT03MjI7ZS5TYWN1dGU9NTU2O2UuZGNhcm9uPTY3MjtlLlVtYWNyb249NzIyO2UudXJpbmc9NTU2O2UudGhyZWVzdXBlcmlvcj0zMDA7ZS5PZ3JhdmU9Nzc4O2UuQWdyYXZlPTcyMjtlLkFicmV2ZT03MjI7ZS5tdWx0aXBseT01NzA7ZS51YWN1dGU9NTU2O2UuVGNhcm9uPTY2NztlLnBhcnRpYWxkaWZmPTQ5NDtlLnlkaWVyZXNpcz01MDA7ZS5OYWN1dGU9NzIyO2UuaWNpcmN1bWZsZXg9Mjc4O2UuRWNpcmN1bWZsZXg9NjY3O2UuYWRpZXJlc2lzPTUwMDtlLmVkaWVyZXNpcz00NDQ7ZS5jYWN1dGU9NDQ0O2UubmFjdXRlPTU1NjtlLnVtYWNyb249NTU2O2UuTmNhcm9uPTcyMjtlLklhY3V0ZT0zODk7ZS5wbHVzbWludXM9NTcwO2UuYnJva2VuYmFyPTIyMDtlLnJlZ2lzdGVyZWQ9NzQ3O2UuR2JyZXZlPTc3ODtlLklkb3RhY2NlbnQ9Mzg5O2Uuc3VtbWF0aW9uPTYwMDtlLkVncmF2ZT02Njc7ZS5yYWN1dGU9NDQ0O2Uub21hY3Jvbj01MDA7ZS5aYWN1dGU9NjY3O2UuWmNhcm9uPTY2NztlLmdyZWF0ZXJlcXVhbD01NDk7ZS5FdGg9NzIyO2UuQ2NlZGlsbGE9NzIyO2UubGNvbW1hYWNjZW50PTI3ODtlLnRjYXJvbj00MTY7ZS5lb2dvbmVrPTQ0NDtlLlVvZ29uZWs9NzIyO2UuQWFjdXRlPTcyMjtlLkFkaWVyZXNpcz03MjI7ZS5lZ3JhdmU9NDQ0O2UuemFjdXRlPTQ0NDtlLmlvZ29uZWs9Mjc4O2UuT2FjdXRlPTc3ODtlLm9hY3V0ZT01MDA7ZS5hbWFjcm9uPTUwMDtlLnNhY3V0ZT0zODk7ZS5pZGllcmVzaXM9Mjc4O2UuT2NpcmN1bWZsZXg9Nzc4O2UuVWdyYXZlPTcyMjtlLkRlbHRhPTYxMjtlLnRob3JuPTU1NjtlLnR3b3N1cGVyaW9yPTMwMDtlLk9kaWVyZXNpcz03Nzg7ZS5tdT01NTY7ZS5pZ3JhdmU9Mjc4O2Uub2h1bmdhcnVtbGF1dD01MDA7ZS5Fb2dvbmVrPTY2NztlLmRjcm9hdD01NTY7ZS50aHJlZXF1YXJ0ZXJzPTc1MDtlLlNjZWRpbGxhPTU1NjtlLmxjYXJvbj0zOTQ7ZS5LY29tbWFhY2NlbnQ9Nzc4O2UuTGFjdXRlPTY2NztlLnRyYWRlbWFyaz0xZTM7ZS5lZG90YWNjZW50PTQ0NDtlLklncmF2ZT0zODk7ZS5JbWFjcm9uPTM4OTtlLkxjYXJvbj02Njc7ZS5vbmVoYWxmPTc1MDtlLmxlc3NlcXVhbD01NDk7ZS5vY2lyY3VtZmxleD01MDA7ZS5udGlsZGU9NTU2O2UuVWh1bmdhcnVtbGF1dD03MjI7ZS5FYWN1dGU9NjY3O2UuZW1hY3Jvbj00NDQ7ZS5nYnJldmU9NTAwO2Uub25lcXVhcnRlcj03NTA7ZS5TY2Fyb249NTU2O2UuU2NvbW1hYWNjZW50PTU1NjtlLk9odW5nYXJ1bWxhdXQ9Nzc4O2UuZGVncmVlPTQwMDtlLm9ncmF2ZT01MDA7ZS5DY2Fyb249NzIyO2UudWdyYXZlPTU1NjtlLnJhZGljYWw9NTQ5O2UuRGNhcm9uPTcyMjtlLnJjb21tYWFjY2VudD00NDQ7ZS5OdGlsZGU9NzIyO2Uub3RpbGRlPTUwMDtlLlJjb21tYWFjY2VudD03MjI7ZS5MY29tbWFhY2NlbnQ9NjY3O2UuQXRpbGRlPTcyMjtlLkFvZ29uZWs9NzIyO2UuQXJpbmc9NzIyO2UuT3RpbGRlPTc3ODtlLnpkb3RhY2NlbnQ9NDQ0O2UuRWNhcm9uPTY2NztlLklvZ29uZWs9Mzg5O2Uua2NvbW1hYWNjZW50PTU1NjtlLm1pbnVzPTU3MDtlLkljaXJjdW1mbGV4PTM4OTtlLm5jYXJvbj01NTY7ZS50Y29tbWFhY2NlbnQ9MzMzO2UubG9naWNhbG5vdD01NzA7ZS5vZGllcmVzaXM9NTAwO2UudWRpZXJlc2lzPTU1NjtlLm5vdGVxdWFsPTU0OTtlLmdjb21tYWFjY2VudD01MDA7ZS5ldGg9NTAwO2UuemNhcm9uPTQ0NDtlLm5jb21tYWFjY2VudD01NTY7ZS5vbmVzdXBlcmlvcj0zMDA7ZS5pbWFjcm9uPTI3ODtlLkV1cm89NTAwfSkpO2VbIlRpbWVzLUJvbGRJdGFsaWMiXT0oMCxhLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwO2UuZXhjbGFtPTM4OTtlLnF1b3RlZGJsPTU1NTtlLm51bWJlcnNpZ249NTAwO2UuZG9sbGFyPTUwMDtlLnBlcmNlbnQ9ODMzO2UuYW1wZXJzYW5kPTc3ODtlLnF1b3RlcmlnaHQ9MzMzO2UucGFyZW5sZWZ0PTMzMztlLnBhcmVucmlnaHQ9MzMzO2UuYXN0ZXJpc2s9NTAwO2UucGx1cz01NzA7ZS5jb21tYT0yNTA7ZS5oeXBoZW49MzMzO2UucGVyaW9kPTI1MDtlLnNsYXNoPTI3ODtlLnplcm89NTAwO2Uub25lPTUwMDtlLnR3bz01MDA7ZS50aHJlZT01MDA7ZS5mb3VyPTUwMDtlLmZpdmU9NTAwO2Uuc2l4PTUwMDtlLnNldmVuPTUwMDtlLmVpZ2h0PTUwMDtlLm5pbmU9NTAwO2UuY29sb249MzMzO2Uuc2VtaWNvbG9uPTMzMztlLmxlc3M9NTcwO2UuZXF1YWw9NTcwO2UuZ3JlYXRlcj01NzA7ZS5xdWVzdGlvbj01MDA7ZS5hdD04MzI7ZS5BPTY2NztlLkI9NjY3O2UuQz02Njc7ZS5EPTcyMjtlLkU9NjY3O2UuRj02Njc7ZS5HPTcyMjtlLkg9Nzc4O2UuST0zODk7ZS5KPTUwMDtlLks9NjY3O2UuTD02MTE7ZS5NPTg4OTtlLk49NzIyO2UuTz03MjI7ZS5QPTYxMTtlLlE9NzIyO2UuUj02Njc7ZS5TPTU1NjtlLlQ9NjExO2UuVT03MjI7ZS5WPTY2NztlLlc9ODg5O2UuWD02Njc7ZS5ZPTYxMTtlLlo9NjExO2UuYnJhY2tldGxlZnQ9MzMzO2UuYmFja3NsYXNoPTI3ODtlLmJyYWNrZXRyaWdodD0zMzM7ZS5hc2NpaWNpcmN1bT01NzA7ZS51bmRlcnNjb3JlPTUwMDtlLnF1b3RlbGVmdD0zMzM7ZS5hPTUwMDtlLmI9NTAwO2UuYz00NDQ7ZS5kPTUwMDtlLmU9NDQ0O2UuZj0zMzM7ZS5nPTUwMDtlLmg9NTU2O2UuaT0yNzg7ZS5qPTI3ODtlLms9NTAwO2UubD0yNzg7ZS5tPTc3ODtlLm49NTU2O2Uubz01MDA7ZS5wPTUwMDtlLnE9NTAwO2Uucj0zODk7ZS5zPTM4OTtlLnQ9Mjc4O2UudT01NTY7ZS52PTQ0NDtlLnc9NjY3O2UueD01MDA7ZS55PTQ0NDtlLno9Mzg5O2UuYnJhY2VsZWZ0PTM0ODtlLmJhcj0yMjA7ZS5icmFjZXJpZ2h0PTM0ODtlLmFzY2lpdGlsZGU9NTcwO2UuZXhjbGFtZG93bj0zODk7ZS5jZW50PTUwMDtlLnN0ZXJsaW5nPTUwMDtlLmZyYWN0aW9uPTE2NztlLnllbj01MDA7ZS5mbG9yaW49NTAwO2Uuc2VjdGlvbj01MDA7ZS5jdXJyZW5jeT01MDA7ZS5xdW90ZXNpbmdsZT0yNzg7ZS5xdW90ZWRibGxlZnQ9NTAwO2UuZ3VpbGxlbW90bGVmdD01MDA7ZS5ndWlsc2luZ2xsZWZ0PTMzMztlLmd1aWxzaW5nbHJpZ2h0PTMzMztlLmZpPTU1NjtlLmZsPTU1NjtlLmVuZGFzaD01MDA7ZS5kYWdnZXI9NTAwO2UuZGFnZ2VyZGJsPTUwMDtlLnBlcmlvZGNlbnRlcmVkPTI1MDtlLnBhcmFncmFwaD01MDA7ZS5idWxsZXQ9MzUwO2UucXVvdGVzaW5nbGJhc2U9MzMzO2UucXVvdGVkYmxiYXNlPTUwMDtlLnF1b3RlZGJscmlnaHQ9NTAwO2UuZ3VpbGxlbW90cmlnaHQ9NTAwO2UuZWxsaXBzaXM9MWUzO2UucGVydGhvdXNhbmQ9MWUzO2UucXVlc3Rpb25kb3duPTUwMDtlLmdyYXZlPTMzMztlLmFjdXRlPTMzMztlLmNpcmN1bWZsZXg9MzMzO2UudGlsZGU9MzMzO2UubWFjcm9uPTMzMztlLmJyZXZlPTMzMztlLmRvdGFjY2VudD0zMzM7ZS5kaWVyZXNpcz0zMzM7ZS5yaW5nPTMzMztlLmNlZGlsbGE9MzMzO2UuaHVuZ2FydW1sYXV0PTMzMztlLm9nb25laz0zMzM7ZS5jYXJvbj0zMzM7ZS5lbWRhc2g9MWUzO2UuQUU9OTQ0O2Uub3JkZmVtaW5pbmU9MjY2O2UuTHNsYXNoPTYxMTtlLk9zbGFzaD03MjI7ZS5PRT05NDQ7ZS5vcmRtYXNjdWxpbmU9MzAwO2UuYWU9NzIyO2UuZG90bGVzc2k9Mjc4O2UubHNsYXNoPTI3ODtlLm9zbGFzaD01MDA7ZS5vZT03MjI7ZS5nZXJtYW5kYmxzPTUwMDtlLklkaWVyZXNpcz0zODk7ZS5lYWN1dGU9NDQ0O2UuYWJyZXZlPTUwMDtlLnVodW5nYXJ1bWxhdXQ9NTU2O2UuZWNhcm9uPTQ0NDtlLllkaWVyZXNpcz02MTE7ZS5kaXZpZGU9NTcwO2UuWWFjdXRlPTYxMTtlLkFjaXJjdW1mbGV4PTY2NztlLmFhY3V0ZT01MDA7ZS5VY2lyY3VtZmxleD03MjI7ZS55YWN1dGU9NDQ0O2Uuc2NvbW1hYWNjZW50PTM4OTtlLmVjaXJjdW1mbGV4PTQ0NDtlLlVyaW5nPTcyMjtlLlVkaWVyZXNpcz03MjI7ZS5hb2dvbmVrPTUwMDtlLlVhY3V0ZT03MjI7ZS51b2dvbmVrPTU1NjtlLkVkaWVyZXNpcz02Njc7ZS5EY3JvYXQ9NzIyO2UuY29tbWFhY2NlbnQ9MjUwO2UuY29weXJpZ2h0PTc0NztlLkVtYWNyb249NjY3O2UuY2Nhcm9uPTQ0NDtlLmFyaW5nPTUwMDtlLk5jb21tYWFjY2VudD03MjI7ZS5sYWN1dGU9Mjc4O2UuYWdyYXZlPTUwMDtlLlRjb21tYWFjY2VudD02MTE7ZS5DYWN1dGU9NjY3O2UuYXRpbGRlPTUwMDtlLkVkb3RhY2NlbnQ9NjY3O2Uuc2Nhcm9uPTM4OTtlLnNjZWRpbGxhPTM4OTtlLmlhY3V0ZT0yNzg7ZS5sb3plbmdlPTQ5NDtlLlJjYXJvbj02Njc7ZS5HY29tbWFhY2NlbnQ9NzIyO2UudWNpcmN1bWZsZXg9NTU2O2UuYWNpcmN1bWZsZXg9NTAwO2UuQW1hY3Jvbj02Njc7ZS5yY2Fyb249Mzg5O2UuY2NlZGlsbGE9NDQ0O2UuWmRvdGFjY2VudD02MTE7ZS5UaG9ybj02MTE7ZS5PbWFjcm9uPTcyMjtlLlJhY3V0ZT02Njc7ZS5TYWN1dGU9NTU2O2UuZGNhcm9uPTYwODtlLlVtYWNyb249NzIyO2UudXJpbmc9NTU2O2UudGhyZWVzdXBlcmlvcj0zMDA7ZS5PZ3JhdmU9NzIyO2UuQWdyYXZlPTY2NztlLkFicmV2ZT02Njc7ZS5tdWx0aXBseT01NzA7ZS51YWN1dGU9NTU2O2UuVGNhcm9uPTYxMTtlLnBhcnRpYWxkaWZmPTQ5NDtlLnlkaWVyZXNpcz00NDQ7ZS5OYWN1dGU9NzIyO2UuaWNpcmN1bWZsZXg9Mjc4O2UuRWNpcmN1bWZsZXg9NjY3O2UuYWRpZXJlc2lzPTUwMDtlLmVkaWVyZXNpcz00NDQ7ZS5jYWN1dGU9NDQ0O2UubmFjdXRlPTU1NjtlLnVtYWNyb249NTU2O2UuTmNhcm9uPTcyMjtlLklhY3V0ZT0zODk7ZS5wbHVzbWludXM9NTcwO2UuYnJva2VuYmFyPTIyMDtlLnJlZ2lzdGVyZWQ9NzQ3O2UuR2JyZXZlPTcyMjtlLklkb3RhY2NlbnQ9Mzg5O2Uuc3VtbWF0aW9uPTYwMDtlLkVncmF2ZT02Njc7ZS5yYWN1dGU9Mzg5O2Uub21hY3Jvbj01MDA7ZS5aYWN1dGU9NjExO2UuWmNhcm9uPTYxMTtlLmdyZWF0ZXJlcXVhbD01NDk7ZS5FdGg9NzIyO2UuQ2NlZGlsbGE9NjY3O2UubGNvbW1hYWNjZW50PTI3ODtlLnRjYXJvbj0zNjY7ZS5lb2dvbmVrPTQ0NDtlLlVvZ29uZWs9NzIyO2UuQWFjdXRlPTY2NztlLkFkaWVyZXNpcz02Njc7ZS5lZ3JhdmU9NDQ0O2UuemFjdXRlPTM4OTtlLmlvZ29uZWs9Mjc4O2UuT2FjdXRlPTcyMjtlLm9hY3V0ZT01MDA7ZS5hbWFjcm9uPTUwMDtlLnNhY3V0ZT0zODk7ZS5pZGllcmVzaXM9Mjc4O2UuT2NpcmN1bWZsZXg9NzIyO2UuVWdyYXZlPTcyMjtlLkRlbHRhPTYxMjtlLnRob3JuPTUwMDtlLnR3b3N1cGVyaW9yPTMwMDtlLk9kaWVyZXNpcz03MjI7ZS5tdT01NzY7ZS5pZ3JhdmU9Mjc4O2Uub2h1bmdhcnVtbGF1dD01MDA7ZS5Fb2dvbmVrPTY2NztlLmRjcm9hdD01MDA7ZS50aHJlZXF1YXJ0ZXJzPTc1MDtlLlNjZWRpbGxhPTU1NjtlLmxjYXJvbj0zODI7ZS5LY29tbWFhY2NlbnQ9NjY3O2UuTGFjdXRlPTYxMTtlLnRyYWRlbWFyaz0xZTM7ZS5lZG90YWNjZW50PTQ0NDtlLklncmF2ZT0zODk7ZS5JbWFjcm9uPTM4OTtlLkxjYXJvbj02MTE7ZS5vbmVoYWxmPTc1MDtlLmxlc3NlcXVhbD01NDk7ZS5vY2lyY3VtZmxleD01MDA7ZS5udGlsZGU9NTU2O2UuVWh1bmdhcnVtbGF1dD03MjI7ZS5FYWN1dGU9NjY3O2UuZW1hY3Jvbj00NDQ7ZS5nYnJldmU9NTAwO2Uub25lcXVhcnRlcj03NTA7ZS5TY2Fyb249NTU2O2UuU2NvbW1hYWNjZW50PTU1NjtlLk9odW5nYXJ1bWxhdXQ9NzIyO2UuZGVncmVlPTQwMDtlLm9ncmF2ZT01MDA7ZS5DY2Fyb249NjY3O2UudWdyYXZlPTU1NjtlLnJhZGljYWw9NTQ5O2UuRGNhcm9uPTcyMjtlLnJjb21tYWFjY2VudD0zODk7ZS5OdGlsZGU9NzIyO2Uub3RpbGRlPTUwMDtlLlJjb21tYWFjY2VudD02Njc7ZS5MY29tbWFhY2NlbnQ9NjExO2UuQXRpbGRlPTY2NztlLkFvZ29uZWs9NjY3O2UuQXJpbmc9NjY3O2UuT3RpbGRlPTcyMjtlLnpkb3RhY2NlbnQ9Mzg5O2UuRWNhcm9uPTY2NztlLklvZ29uZWs9Mzg5O2Uua2NvbW1hYWNjZW50PTUwMDtlLm1pbnVzPTYwNjtlLkljaXJjdW1mbGV4PTM4OTtlLm5jYXJvbj01NTY7ZS50Y29tbWFhY2NlbnQ9Mjc4O2UubG9naWNhbG5vdD02MDY7ZS5vZGllcmVzaXM9NTAwO2UudWRpZXJlc2lzPTU1NjtlLm5vdGVxdWFsPTU0OTtlLmdjb21tYWFjY2VudD01MDA7ZS5ldGg9NTAwO2UuemNhcm9uPTM4OTtlLm5jb21tYWFjY2VudD01NTY7ZS5vbmVzdXBlcmlvcj0zMDA7ZS5pbWFjcm9uPTI3ODtlLkV1cm89NTAwfSkpO2VbIlRpbWVzLUl0YWxpYyJdPSgwLGEuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0yNTA7ZS5leGNsYW09MzMzO2UucXVvdGVkYmw9NDIwO2UubnVtYmVyc2lnbj01MDA7ZS5kb2xsYXI9NTAwO2UucGVyY2VudD04MzM7ZS5hbXBlcnNhbmQ9Nzc4O2UucXVvdGVyaWdodD0zMzM7ZS5wYXJlbmxlZnQ9MzMzO2UucGFyZW5yaWdodD0zMzM7ZS5hc3Rlcmlzaz01MDA7ZS5wbHVzPTY3NTtlLmNvbW1hPTI1MDtlLmh5cGhlbj0zMzM7ZS5wZXJpb2Q9MjUwO2Uuc2xhc2g9Mjc4O2UuemVybz01MDA7ZS5vbmU9NTAwO2UudHdvPTUwMDtlLnRocmVlPTUwMDtlLmZvdXI9NTAwO2UuZml2ZT01MDA7ZS5zaXg9NTAwO2Uuc2V2ZW49NTAwO2UuZWlnaHQ9NTAwO2UubmluZT01MDA7ZS5jb2xvbj0zMzM7ZS5zZW1pY29sb249MzMzO2UubGVzcz02NzU7ZS5lcXVhbD02NzU7ZS5ncmVhdGVyPTY3NTtlLnF1ZXN0aW9uPTUwMDtlLmF0PTkyMDtlLkE9NjExO2UuQj02MTE7ZS5DPTY2NztlLkQ9NzIyO2UuRT02MTE7ZS5GPTYxMTtlLkc9NzIyO2UuSD03MjI7ZS5JPTMzMztlLko9NDQ0O2UuSz02Njc7ZS5MPTU1NjtlLk09ODMzO2UuTj02Njc7ZS5PPTcyMjtlLlA9NjExO2UuUT03MjI7ZS5SPTYxMTtlLlM9NTAwO2UuVD01NTY7ZS5VPTcyMjtlLlY9NjExO2UuVz04MzM7ZS5YPTYxMTtlLlk9NTU2O2UuWj01NTY7ZS5icmFja2V0bGVmdD0zODk7ZS5iYWNrc2xhc2g9Mjc4O2UuYnJhY2tldHJpZ2h0PTM4OTtlLmFzY2lpY2lyY3VtPTQyMjtlLnVuZGVyc2NvcmU9NTAwO2UucXVvdGVsZWZ0PTMzMztlLmE9NTAwO2UuYj01MDA7ZS5jPTQ0NDtlLmQ9NTAwO2UuZT00NDQ7ZS5mPTI3ODtlLmc9NTAwO2UuaD01MDA7ZS5pPTI3ODtlLmo9Mjc4O2Uuaz00NDQ7ZS5sPTI3ODtlLm09NzIyO2Uubj01MDA7ZS5vPTUwMDtlLnA9NTAwO2UucT01MDA7ZS5yPTM4OTtlLnM9Mzg5O2UudD0yNzg7ZS51PTUwMDtlLnY9NDQ0O2Uudz02Njc7ZS54PTQ0NDtlLnk9NDQ0O2Uuej0zODk7ZS5icmFjZWxlZnQ9NDAwO2UuYmFyPTI3NTtlLmJyYWNlcmlnaHQ9NDAwO2UuYXNjaWl0aWxkZT01NDE7ZS5leGNsYW1kb3duPTM4OTtlLmNlbnQ9NTAwO2Uuc3Rlcmxpbmc9NTAwO2UuZnJhY3Rpb249MTY3O2UueWVuPTUwMDtlLmZsb3Jpbj01MDA7ZS5zZWN0aW9uPTUwMDtlLmN1cnJlbmN5PTUwMDtlLnF1b3Rlc2luZ2xlPTIxNDtlLnF1b3RlZGJsbGVmdD01NTY7ZS5ndWlsbGVtb3RsZWZ0PTUwMDtlLmd1aWxzaW5nbGxlZnQ9MzMzO2UuZ3VpbHNpbmdscmlnaHQ9MzMzO2UuZmk9NTAwO2UuZmw9NTAwO2UuZW5kYXNoPTUwMDtlLmRhZ2dlcj01MDA7ZS5kYWdnZXJkYmw9NTAwO2UucGVyaW9kY2VudGVyZWQ9MjUwO2UucGFyYWdyYXBoPTUyMztlLmJ1bGxldD0zNTA7ZS5xdW90ZXNpbmdsYmFzZT0zMzM7ZS5xdW90ZWRibGJhc2U9NTU2O2UucXVvdGVkYmxyaWdodD01NTY7ZS5ndWlsbGVtb3RyaWdodD01MDA7ZS5lbGxpcHNpcz04ODk7ZS5wZXJ0aG91c2FuZD0xZTM7ZS5xdWVzdGlvbmRvd249NTAwO2UuZ3JhdmU9MzMzO2UuYWN1dGU9MzMzO2UuY2lyY3VtZmxleD0zMzM7ZS50aWxkZT0zMzM7ZS5tYWNyb249MzMzO2UuYnJldmU9MzMzO2UuZG90YWNjZW50PTMzMztlLmRpZXJlc2lzPTMzMztlLnJpbmc9MzMzO2UuY2VkaWxsYT0zMzM7ZS5odW5nYXJ1bWxhdXQ9MzMzO2Uub2dvbmVrPTMzMztlLmNhcm9uPTMzMztlLmVtZGFzaD04ODk7ZS5BRT04ODk7ZS5vcmRmZW1pbmluZT0yNzY7ZS5Mc2xhc2g9NTU2O2UuT3NsYXNoPTcyMjtlLk9FPTk0NDtlLm9yZG1hc2N1bGluZT0zMTA7ZS5hZT02Njc7ZS5kb3RsZXNzaT0yNzg7ZS5sc2xhc2g9Mjc4O2Uub3NsYXNoPTUwMDtlLm9lPTY2NztlLmdlcm1hbmRibHM9NTAwO2UuSWRpZXJlc2lzPTMzMztlLmVhY3V0ZT00NDQ7ZS5hYnJldmU9NTAwO2UudWh1bmdhcnVtbGF1dD01MDA7ZS5lY2Fyb249NDQ0O2UuWWRpZXJlc2lzPTU1NjtlLmRpdmlkZT02NzU7ZS5ZYWN1dGU9NTU2O2UuQWNpcmN1bWZsZXg9NjExO2UuYWFjdXRlPTUwMDtlLlVjaXJjdW1mbGV4PTcyMjtlLnlhY3V0ZT00NDQ7ZS5zY29tbWFhY2NlbnQ9Mzg5O2UuZWNpcmN1bWZsZXg9NDQ0O2UuVXJpbmc9NzIyO2UuVWRpZXJlc2lzPTcyMjtlLmFvZ29uZWs9NTAwO2UuVWFjdXRlPTcyMjtlLnVvZ29uZWs9NTAwO2UuRWRpZXJlc2lzPTYxMTtlLkRjcm9hdD03MjI7ZS5jb21tYWFjY2VudD0yNTA7ZS5jb3B5cmlnaHQ9NzYwO2UuRW1hY3Jvbj02MTE7ZS5jY2Fyb249NDQ0O2UuYXJpbmc9NTAwO2UuTmNvbW1hYWNjZW50PTY2NztlLmxhY3V0ZT0yNzg7ZS5hZ3JhdmU9NTAwO2UuVGNvbW1hYWNjZW50PTU1NjtlLkNhY3V0ZT02Njc7ZS5hdGlsZGU9NTAwO2UuRWRvdGFjY2VudD02MTE7ZS5zY2Fyb249Mzg5O2Uuc2NlZGlsbGE9Mzg5O2UuaWFjdXRlPTI3ODtlLmxvemVuZ2U9NDcxO2UuUmNhcm9uPTYxMTtlLkdjb21tYWFjY2VudD03MjI7ZS51Y2lyY3VtZmxleD01MDA7ZS5hY2lyY3VtZmxleD01MDA7ZS5BbWFjcm9uPTYxMTtlLnJjYXJvbj0zODk7ZS5jY2VkaWxsYT00NDQ7ZS5aZG90YWNjZW50PTU1NjtlLlRob3JuPTYxMTtlLk9tYWNyb249NzIyO2UuUmFjdXRlPTYxMTtlLlNhY3V0ZT01MDA7ZS5kY2Fyb249NTQ0O2UuVW1hY3Jvbj03MjI7ZS51cmluZz01MDA7ZS50aHJlZXN1cGVyaW9yPTMwMDtlLk9ncmF2ZT03MjI7ZS5BZ3JhdmU9NjExO2UuQWJyZXZlPTYxMTtlLm11bHRpcGx5PTY3NTtlLnVhY3V0ZT01MDA7ZS5UY2Fyb249NTU2O2UucGFydGlhbGRpZmY9NDc2O2UueWRpZXJlc2lzPTQ0NDtlLk5hY3V0ZT02Njc7ZS5pY2lyY3VtZmxleD0yNzg7ZS5FY2lyY3VtZmxleD02MTE7ZS5hZGllcmVzaXM9NTAwO2UuZWRpZXJlc2lzPTQ0NDtlLmNhY3V0ZT00NDQ7ZS5uYWN1dGU9NTAwO2UudW1hY3Jvbj01MDA7ZS5OY2Fyb249NjY3O2UuSWFjdXRlPTMzMztlLnBsdXNtaW51cz02NzU7ZS5icm9rZW5iYXI9Mjc1O2UucmVnaXN0ZXJlZD03NjA7ZS5HYnJldmU9NzIyO2UuSWRvdGFjY2VudD0zMzM7ZS5zdW1tYXRpb249NjAwO2UuRWdyYXZlPTYxMTtlLnJhY3V0ZT0zODk7ZS5vbWFjcm9uPTUwMDtlLlphY3V0ZT01NTY7ZS5aY2Fyb249NTU2O2UuZ3JlYXRlcmVxdWFsPTU0OTtlLkV0aD03MjI7ZS5DY2VkaWxsYT02Njc7ZS5sY29tbWFhY2NlbnQ9Mjc4O2UudGNhcm9uPTMwMDtlLmVvZ29uZWs9NDQ0O2UuVW9nb25laz03MjI7ZS5BYWN1dGU9NjExO2UuQWRpZXJlc2lzPTYxMTtlLmVncmF2ZT00NDQ7ZS56YWN1dGU9Mzg5O2UuaW9nb25laz0yNzg7ZS5PYWN1dGU9NzIyO2Uub2FjdXRlPTUwMDtlLmFtYWNyb249NTAwO2Uuc2FjdXRlPTM4OTtlLmlkaWVyZXNpcz0yNzg7ZS5PY2lyY3VtZmxleD03MjI7ZS5VZ3JhdmU9NzIyO2UuRGVsdGE9NjEyO2UudGhvcm49NTAwO2UudHdvc3VwZXJpb3I9MzAwO2UuT2RpZXJlc2lzPTcyMjtlLm11PTUwMDtlLmlncmF2ZT0yNzg7ZS5vaHVuZ2FydW1sYXV0PTUwMDtlLkVvZ29uZWs9NjExO2UuZGNyb2F0PTUwMDtlLnRocmVlcXVhcnRlcnM9NzUwO2UuU2NlZGlsbGE9NTAwO2UubGNhcm9uPTMwMDtlLktjb21tYWFjY2VudD02Njc7ZS5MYWN1dGU9NTU2O2UudHJhZGVtYXJrPTk4MDtlLmVkb3RhY2NlbnQ9NDQ0O2UuSWdyYXZlPTMzMztlLkltYWNyb249MzMzO2UuTGNhcm9uPTYxMTtlLm9uZWhhbGY9NzUwO2UubGVzc2VxdWFsPTU0OTtlLm9jaXJjdW1mbGV4PTUwMDtlLm50aWxkZT01MDA7ZS5VaHVuZ2FydW1sYXV0PTcyMjtlLkVhY3V0ZT02MTE7ZS5lbWFjcm9uPTQ0NDtlLmdicmV2ZT01MDA7ZS5vbmVxdWFydGVyPTc1MDtlLlNjYXJvbj01MDA7ZS5TY29tbWFhY2NlbnQ9NTAwO2UuT2h1bmdhcnVtbGF1dD03MjI7ZS5kZWdyZWU9NDAwO2Uub2dyYXZlPTUwMDtlLkNjYXJvbj02Njc7ZS51Z3JhdmU9NTAwO2UucmFkaWNhbD00NTM7ZS5EY2Fyb249NzIyO2UucmNvbW1hYWNjZW50PTM4OTtlLk50aWxkZT02Njc7ZS5vdGlsZGU9NTAwO2UuUmNvbW1hYWNjZW50PTYxMTtlLkxjb21tYWFjY2VudD01NTY7ZS5BdGlsZGU9NjExO2UuQW9nb25laz02MTE7ZS5BcmluZz02MTE7ZS5PdGlsZGU9NzIyO2UuemRvdGFjY2VudD0zODk7ZS5FY2Fyb249NjExO2UuSW9nb25laz0zMzM7ZS5rY29tbWFhY2NlbnQ9NDQ0O2UubWludXM9Njc1O2UuSWNpcmN1bWZsZXg9MzMzO2UubmNhcm9uPTUwMDtlLnRjb21tYWFjY2VudD0yNzg7ZS5sb2dpY2Fsbm90PTY3NTtlLm9kaWVyZXNpcz01MDA7ZS51ZGllcmVzaXM9NTAwO2Uubm90ZXF1YWw9NTQ5O2UuZ2NvbW1hYWNjZW50PTUwMDtlLmV0aD01MDA7ZS56Y2Fyb249Mzg5O2UubmNvbW1hYWNjZW50PTUwMDtlLm9uZXN1cGVyaW9yPTMwMDtlLmltYWNyb249Mjc4O2UuRXVybz01MDB9KSk7ZS5aYXBmRGluZ2JhdHM9KDAsYS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI3ODtlLmExPTk3NDtlLmEyPTk2MTtlLmEyMDI9OTc0O2UuYTM9OTgwO2UuYTQ9NzE5O2UuYTU9Nzg5O2UuYTExOT03OTA7ZS5hMTE4PTc5MTtlLmExMTc9NjkwO2UuYTExPTk2MDtlLmExMj05Mzk7ZS5hMTM9NTQ5O2UuYTE0PTg1NTtlLmExNT05MTE7ZS5hMTY9OTMzO2UuYTEwNT05MTE7ZS5hMTc9OTQ1O2UuYTE4PTk3NDtlLmExOT03NTU7ZS5hMjA9ODQ2O2UuYTIxPTc2MjtlLmEyMj03NjE7ZS5hMjM9NTcxO2UuYTI0PTY3NztlLmEyNT03NjM7ZS5hMjY9NzYwO2UuYTI3PTc1OTtlLmEyOD03NTQ7ZS5hNj00OTQ7ZS5hNz01NTI7ZS5hOD01Mzc7ZS5hOT01Nzc7ZS5hMTA9NjkyO2UuYTI5PTc4NjtlLmEzMD03ODg7ZS5hMzE9Nzg4O2UuYTMyPTc5MDtlLmEzMz03OTM7ZS5hMzQ9Nzk0O2UuYTM1PTgxNjtlLmEzNj04MjM7ZS5hMzc9Nzg5O2UuYTM4PTg0MTtlLmEzOT04MjM7ZS5hNDA9ODMzO2UuYTQxPTgxNjtlLmE0Mj04MzE7ZS5hNDM9OTIzO2UuYTQ0PTc0NDtlLmE0NT03MjM7ZS5hNDY9NzQ5O2UuYTQ3PTc5MDtlLmE0OD03OTI7ZS5hNDk9Njk1O2UuYTUwPTc3NjtlLmE1MT03Njg7ZS5hNTI9NzkyO2UuYTUzPTc1OTtlLmE1ND03MDc7ZS5hNTU9NzA4O2UuYTU2PTY4MjtlLmE1Nz03MDE7ZS5hNTg9ODI2O2UuYTU5PTgxNTtlLmE2MD03ODk7ZS5hNjE9Nzg5O2UuYTYyPTcwNztlLmE2Mz02ODc7ZS5hNjQ9Njk2O2UuYTY1PTY4OTtlLmE2Nj03ODY7ZS5hNjc9Nzg3O2UuYTY4PTcxMztlLmE2OT03OTE7ZS5hNzA9Nzg1O2UuYTcxPTc5MTtlLmE3Mj04NzM7ZS5hNzM9NzYxO2UuYTc0PTc2MjtlLmEyMDM9NzYyO2UuYTc1PTc1OTtlLmEyMDQ9NzU5O2UuYTc2PTg5MjtlLmE3Nz04OTI7ZS5hNzg9Nzg4O2UuYTc5PTc4NDtlLmE4MT00Mzg7ZS5hODI9MTM4O2UuYTgzPTI3NztlLmE4ND00MTU7ZS5hOTc9MzkyO2UuYTk4PTM5MjtlLmE5OT02Njg7ZS5hMTAwPTY2ODtlLmE4OT0zOTA7ZS5hOTA9MzkwO2UuYTkzPTMxNztlLmE5ND0zMTc7ZS5hOTE9Mjc2O2UuYTkyPTI3NjtlLmEyMDU9NTA5O2UuYTg1PTUwOTtlLmEyMDY9NDEwO2UuYTg2PTQxMDtlLmE4Nz0yMzQ7ZS5hODg9MjM0O2UuYTk1PTMzNDtlLmE5Nj0zMzQ7ZS5hMTAxPTczMjtlLmExMDI9NTQ0O2UuYTEwMz01NDQ7ZS5hMTA0PTkxMDtlLmExMDY9NjY3O2UuYTEwNz03NjA7ZS5hMTA4PTc2MDtlLmExMTI9Nzc2O2UuYTExMT01OTU7ZS5hMTEwPTY5NDtlLmExMDk9NjI2O2UuYTEyMD03ODg7ZS5hMTIxPTc4ODtlLmExMjI9Nzg4O2UuYTEyMz03ODg7ZS5hMTI0PTc4ODtlLmExMjU9Nzg4O2UuYTEyNj03ODg7ZS5hMTI3PTc4ODtlLmExMjg9Nzg4O2UuYTEyOT03ODg7ZS5hMTMwPTc4ODtlLmExMzE9Nzg4O2UuYTEzMj03ODg7ZS5hMTMzPTc4ODtlLmExMzQ9Nzg4O2UuYTEzNT03ODg7ZS5hMTM2PTc4ODtlLmExMzc9Nzg4O2UuYTEzOD03ODg7ZS5hMTM5PTc4ODtlLmExNDA9Nzg4O2UuYTE0MT03ODg7ZS5hMTQyPTc4ODtlLmExNDM9Nzg4O2UuYTE0ND03ODg7ZS5hMTQ1PTc4ODtlLmExNDY9Nzg4O2UuYTE0Nz03ODg7ZS5hMTQ4PTc4ODtlLmExNDk9Nzg4O2UuYTE1MD03ODg7ZS5hMTUxPTc4ODtlLmExNTI9Nzg4O2UuYTE1Mz03ODg7ZS5hMTU0PTc4ODtlLmExNTU9Nzg4O2UuYTE1Nj03ODg7ZS5hMTU3PTc4ODtlLmExNTg9Nzg4O2UuYTE1OT03ODg7ZS5hMTYwPTg5NDtlLmExNjE9ODM4O2UuYTE2Mz0xMDE2O2UuYTE2ND00NTg7ZS5hMTk2PTc0ODtlLmExNjU9OTI0O2UuYTE5Mj03NDg7ZS5hMTY2PTkxODtlLmExNjc9OTI3O2UuYTE2OD05Mjg7ZS5hMTY5PTkyODtlLmExNzA9ODM0O2UuYTE3MT04NzM7ZS5hMTcyPTgyODtlLmExNzM9OTI0O2UuYTE2Mj05MjQ7ZS5hMTc0PTkxNztlLmExNzU9OTMwO2UuYTE3Nj05MzE7ZS5hMTc3PTQ2MztlLmExNzg9ODgzO2UuYTE3OT04MzY7ZS5hMTkzPTgzNjtlLmExODA9ODY3O2UuYTE5OT04Njc7ZS5hMTgxPTY5NjtlLmEyMDA9Njk2O2UuYTE4Mj04NzQ7ZS5hMjAxPTg3NDtlLmExODM9NzYwO2UuYTE4ND05NDY7ZS5hMTk3PTc3MTtlLmExODU9ODY1O2UuYTE5ND03NzE7ZS5hMTk4PTg4ODtlLmExODY9OTY3O2UuYTE5NT04ODg7ZS5hMTg3PTgzMTtlLmExODg9ODczO2UuYTE4OT05Mjc7ZS5hMTkwPTk3MDtlLmExOTE9OTE4fSkpfSkpO3QuZ2V0TWV0cmljcz1pfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lk11cm11ckhhc2gzXzY0PXZvaWQgMDt2YXIgYT1yKDIpO3QuTXVybXVySGFzaDNfNjQ9Y2xhc3MgTXVybXVySGFzaDNfNjR7Y29uc3RydWN0b3IoZSl7dGhpcy5oMT1lPzQyOTQ5NjcyOTUmZTozMjg1Mzc3NTIwO3RoaXMuaDI9ZT80Mjk0OTY3Mjk1JmU6MzI4NTM3NzUyMH11cGRhdGUoZSl7bGV0IHQscjtpZigoMCxhLmlzU3RyaW5nKShlKSl7dD1uZXcgVWludDhBcnJheSgyKmUubGVuZ3RoKTtyPTA7Zm9yKGxldCBhPTAsaT1lLmxlbmd0aDthPGk7YSsrKXtjb25zdCBpPWUuY2hhckNvZGVBdChhKTtpZihpPD0yNTUpdFtyKytdPWk7ZWxzZXt0W3IrK109aT4+Pjg7dFtyKytdPTI1NSZpfX19ZWxzZXtpZighKDAsYS5pc0FycmF5QnVmZmVyKShlKSl0aHJvdyBuZXcgRXJyb3IoIldyb25nIGRhdGEgZm9ybWF0IGluIE11cm11ckhhc2gzXzY0X3VwZGF0ZS4gSW5wdXQgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheS4iKTt0PWU7cj10LmJ5dGVMZW5ndGh9Y29uc3QgaT1yPj4yLG49ci00Kmkscz1uZXcgVWludDMyQXJyYXkodC5idWZmZXIsMCxpKTtsZXQgbz0wLGM9MCxsPXRoaXMuaDEsaD10aGlzLmgyO2NvbnN0IHU9MzQzMjkxODM1MyxkPTQ2MTg0NTkwNztmb3IobGV0IGU9MDtlPGk7ZSsrKWlmKDEmZSl7bz1zW2VdO289byp1JjQyOTQ5MDE3NjB8MTE2MDEqbyY2NTUzNTtvPW88PDE1fG8+Pj4xNztvPW8qZCY0Mjk0OTAxNzYwfDEzNzE1Km8mNjU1MzU7bF49bztsPWw8PDEzfGw+Pj4xOTtsPTUqbCszODY0MjkyMTk2fWVsc2V7Yz1zW2VdO2M9Yyp1JjQyOTQ5MDE3NjB8MTE2MDEqYyY2NTUzNTtjPWM8PDE1fGM+Pj4xNztjPWMqZCY0Mjk0OTAxNzYwfDEzNzE1KmMmNjU1MzU7aF49YztoPWg8PDEzfGg+Pj4xOTtoPTUqaCszODY0MjkyMTk2fW89MDtzd2l0Y2gobil7Y2FzZSAzOm9ePXRbNCppKzJdPDwxNjtjYXNlIDI6b149dFs0KmkrMV08PDg7Y2FzZSAxOm9ePXRbNCppXTtvPW8qdSY0Mjk0OTAxNzYwfDExNjAxKm8mNjU1MzU7bz1vPDwxNXxvPj4+MTc7bz1vKmQmNDI5NDkwMTc2MHwxMzcxNSpvJjY1NTM1OzEmaT9sXj1vOmhePW99dGhpcy5oMT1sO3RoaXMuaDI9aH1oZXhkaWdlc3QoKXtsZXQgZT10aGlzLmgxLHQ9dGhpcy5oMjtlXj10Pj4+MTtlPTM5ODE4MDY3OTcqZSY0Mjk0OTAxNzYwfDM2MDQ1KmUmNjU1MzU7dD00MjgzNTQzNTExKnQmNDI5NDkwMTc2MHwoMjk1MDE2Mzc5NyoodDw8MTZ8ZT4+PjE2KSY0Mjk0OTAxNzYwKT4+PjE2O2VePXQ+Pj4xO2U9NDQ0OTg0NDAzKmUmNDI5NDkwMTc2MHw2MDQ5OSplJjY1NTM1O3Q9MzMwMTg4MjM2Nip0JjQyOTQ5MDE3NjB8KDMxMjA0Mzc4OTMqKHQ8PDE2fGU+Pj4xNikmNDI5NDkwMTc2MCk+Pj4xNjtlXj10Pj4+MTtjb25zdCByPShlPj4+MCkudG9TdHJpbmcoMTYpLGE9KHQ+Pj4wKS50b1N0cmluZygxNik7cmV0dXJuIHIucGFkU3RhcnQoOCwiMCIpK2EucGFkU3RhcnQoOCwiMCIpfX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuUERGSW1hZ2U9dm9pZCAwO3ZhciBhPXIoMiksaT1yKDUpLG49cigyMykscz1yKDEyKSxvPXIoMTgpLGM9cigyMSk7ZnVuY3Rpb24gZGVjb2RlQW5kQ2xhbXAoZSx0LHIsYSl7KGU9dCtlKnIpPDA/ZT0wOmU+YSYmKGU9YSk7cmV0dXJuIGV9ZnVuY3Rpb24gcmVzaXplSW1hZ2VNYXNrKGUsdCxyLGEsaSxuKXt2YXIgcz1pKm47bGV0IG87bz10PD04P25ldyBVaW50OEFycmF5KHMpOnQ8PTE2P25ldyBVaW50MTZBcnJheShzKTpuZXcgVWludDMyQXJyYXkocyk7dmFyIGMsbCxoLHUsZD1yL2ksZj1hL24sZz0wLG09bmV3IFVpbnQxNkFycmF5KGkpLHA9cjtmb3IoYz0wO2M8aTtjKyspbVtjXT1NYXRoLmZsb29yKGMqZCk7Zm9yKGM9MDtjPG47YysrKXtoPU1hdGguZmxvb3IoYypmKSpwO2ZvcihsPTA7bDxpO2wrKyl7dT1oK21bbF07b1tnKytdPWVbdV19fXJldHVybiBvfWNsYXNzIFBERkltYWdle2NvbnN0cnVjdG9yKHt4cmVmOmUscmVzOnQsaW1hZ2U6cixpc0lubGluZTpzPSExLHNtYXNrOm89bnVsbCxtYXNrOmw9bnVsbCxpc01hc2s6aD0hMSxwZGZGdW5jdGlvbkZhY3Rvcnk6dSxsb2NhbENvbG9yU3BhY2VDYWNoZTpkfSl7dGhpcy5pbWFnZT1yO3ZhciBmPXIuZGljdDtjb25zdCBnPWYuZ2V0KCJGaWx0ZXIiKTtpZigoMCxpLmlzTmFtZSkoZykpc3dpdGNoKGcubmFtZSl7Y2FzZSJKUFhEZWNvZGUiOnZhciBtPW5ldyBjLkpweEltYWdlO20ucGFyc2VJbWFnZVByb3BlcnRpZXMoci5zdHJlYW0pO3Iuc3RyZWFtLnJlc2V0KCk7ci53aWR0aD1tLndpZHRoO3IuaGVpZ2h0PW0uaGVpZ2h0O3IuYml0c1BlckNvbXBvbmVudD1tLmJpdHNQZXJDb21wb25lbnQ7ci5udW1Db21wcz1tLmNvbXBvbmVudHNDb3VudDticmVhaztjYXNlIkpCSUcyRGVjb2RlIjpyLmJpdHNQZXJDb21wb25lbnQ9MTtyLm51bUNvbXBzPTF9bGV0IHA9Zi5nZXQoIldpZHRoIiwiVyIpLGI9Zi5nZXQoIkhlaWdodCIsIkgiKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHIud2lkdGgpJiZyLndpZHRoPjAmJk51bWJlci5pc0ludGVnZXIoci5oZWlnaHQpJiZyLmhlaWdodD4wJiYoci53aWR0aCE9PXB8fHIuaGVpZ2h0IT09YikpeygwLGEud2FybikoIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgcmF0aGVyIHRoYW4gdGhlIGltYWdlIGRpY3Rpb25hcnkuIik7cD1yLndpZHRoO2I9ci5oZWlnaHR9aWYocDwxfHxiPDEpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoYEludmFsaWQgaW1hZ2Ugd2lkdGg6ICR7cH0gb3IgaGVpZ2h0OiAke2J9YCk7dGhpcy53aWR0aD1wO3RoaXMuaGVpZ2h0PWI7dGhpcy5pbnRlcnBvbGF0ZT1mLmdldCgiSW50ZXJwb2xhdGUiLCJJIil8fCExO3RoaXMuaW1hZ2VNYXNrPWYuZ2V0KCJJbWFnZU1hc2siLCJJTSIpfHwhMTt0aGlzLm1hdHRlPWYuZ2V0KCJNYXR0ZSIpfHwhMTt2YXIgeT1yLmJpdHNQZXJDb21wb25lbnQ7aWYoIXkmJiEoeT1mLmdldCgiQml0c1BlckNvbXBvbmVudCIsIkJQQyIpKSl7aWYoIXRoaXMuaW1hZ2VNYXNrKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJCaXRzIHBlciBjb21wb25lbnQgbWlzc2luZyBpbiBpbWFnZTogIit0aGlzLmltYWdlTWFzayk7eT0xfXRoaXMuYnBjPXk7aWYoIXRoaXMuaW1hZ2VNYXNrKXtsZXQgbz1mLmdldFJhdygiQ29sb3JTcGFjZSIpfHxmLmdldFJhdygiQ1MiKTtpZighbyl7KDAsYS5pbmZvKSgiSlBYIGltYWdlcyAod2hpY2ggZG8gbm90IHJlcXVpcmUgY29sb3Igc3BhY2VzKSIpO3N3aXRjaChyLm51bUNvbXBzKXtjYXNlIDE6bz1pLk5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7YnJlYWs7Y2FzZSAzOm89aS5OYW1lLmdldCgiRGV2aWNlUkdCIik7YnJlYWs7Y2FzZSA0Om89aS5OYW1lLmdldCgiRGV2aWNlQ01ZSyIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBKUFggaW1hZ2VzIHdpdGggJHtyLm51bUNvbXBzfSBjb2xvciBjb21wb25lbnRzIG5vdCBzdXBwb3J0ZWQuYCl9fXRoaXMuY29sb3JTcGFjZT1uLkNvbG9yU3BhY2UucGFyc2Uoe2NzOm8seHJlZjplLHJlc291cmNlczpzP3Q6bnVsbCxwZGZGdW5jdGlvbkZhY3Rvcnk6dSxsb2NhbENvbG9yU3BhY2VDYWNoZTpkfSk7dGhpcy5udW1Db21wcz10aGlzLmNvbG9yU3BhY2UubnVtQ29tcHN9dGhpcy5kZWNvZGU9Zi5nZXRBcnJheSgiRGVjb2RlIiwiRCIpO3RoaXMubmVlZHNEZWNvZGU9ITE7aWYodGhpcy5kZWNvZGUmJih0aGlzLmNvbG9yU3BhY2UmJiF0aGlzLmNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLHkpfHxoJiYhbi5Db2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwxKSkpe3RoaXMubmVlZHNEZWNvZGU9ITA7dmFyIHY9KDE8PHkpLTE7dGhpcy5kZWNvZGVDb2VmZmljaWVudHM9W107dGhpcy5kZWNvZGVBZGRlbmRzPVtdO2NvbnN0IGU9dGhpcy5jb2xvclNwYWNlJiYiSW5kZXhlZCI9PT10aGlzLmNvbG9yU3BhY2UubmFtZTtmb3IodmFyIHc9MCxrPTA7dzx0aGlzLmRlY29kZS5sZW5ndGg7dys9MiwrK2spe3ZhciBTPXRoaXMuZGVjb2RlW3ddLEM9dGhpcy5kZWNvZGVbdysxXTt0aGlzLmRlY29kZUNvZWZmaWNpZW50c1trXT1lPyhDLVMpL3Y6Qy1TO3RoaXMuZGVjb2RlQWRkZW5kc1trXT1lP1M6dipTfX1pZihvKXRoaXMuc21hc2s9bmV3IFBERkltYWdlKHt4cmVmOmUscmVzOnQsaW1hZ2U6byxpc0lubGluZTpzLHBkZkZ1bmN0aW9uRmFjdG9yeTp1LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmR9KTtlbHNlIGlmKGwpaWYoKDAsaS5pc1N0cmVhbSkobCkpe2wuZGljdC5nZXQoIkltYWdlTWFzayIsIklNIik/dGhpcy5tYXNrPW5ldyBQREZJbWFnZSh7eHJlZjplLHJlczp0LGltYWdlOmwsaXNJbmxpbmU6cyxpc01hc2s6ITAscGRmRnVuY3Rpb25GYWN0b3J5OnUsbG9jYWxDb2xvclNwYWNlQ2FjaGU6ZH0pOigwLGEud2FybikoIklnbm9yaW5nIC9NYXNrIGluIGltYWdlIHdpdGhvdXQgL0ltYWdlTWFzay4iKX1lbHNlIHRoaXMubWFzaz1sfXN0YXRpYyBhc3luYyBidWlsZEltYWdlKHt4cmVmOmUscmVzOnQsaW1hZ2U6cixpc0lubGluZTpuPSExLHBkZkZ1bmN0aW9uRmFjdG9yeTpzLGxvY2FsQ29sb3JTcGFjZUNhY2hlOm99KXtjb25zdCBjPXI7bGV0IGw9bnVsbCxoPW51bGw7Y29uc3QgdT1yLmRpY3QuZ2V0KCJTTWFzayIpLGQ9ci5kaWN0LmdldCgiTWFzayIpO3U/bD11OmQmJigoMCxpLmlzU3RyZWFtKShkKXx8QXJyYXkuaXNBcnJheShkKT9oPWQ6KDAsYS53YXJuKSgiVW5zdXBwb3J0ZWQgbWFzayBmb3JtYXQuIikpO3JldHVybiBuZXcgUERGSW1hZ2Uoe3hyZWY6ZSxyZXM6dCxpbWFnZTpjLGlzSW5saW5lOm4sc21hc2s6bCxtYXNrOmgscGRmRnVuY3Rpb25GYWN0b3J5OnMsbG9jYWxDb2xvclNwYWNlQ2FjaGU6b30pfXN0YXRpYyBjcmVhdGVNYXNrKHtpbWdBcnJheTplLHdpZHRoOnQsaGVpZ2h0OnIsaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW06YSxpbnZlcnNlRGVjb2RlOml9KXt2YXIgbixzLG89KHQrNz4+MykqcixjPWUuYnl0ZUxlbmd0aDtpZighYXx8aSYmIShvPT09YykpaWYoaSl7KG49bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG8pKS5zZXQoZSk7Zm9yKHM9YztzPG87cysrKW5bc109MjU1fWVsc2Uobj1uZXcgVWludDhDbGFtcGVkQXJyYXkoYykpLnNldChlKTtlbHNlIG49ZTtpZihpKWZvcihzPTA7czxjO3MrKyluW3NdXj0yNTU7cmV0dXJue2RhdGE6bix3aWR0aDp0LGhlaWdodDpyfX1nZXQgZHJhd1dpZHRoKCl7cmV0dXJuIE1hdGgubWF4KHRoaXMud2lkdGgsdGhpcy5zbWFzayYmdGhpcy5zbWFzay53aWR0aHx8MCx0aGlzLm1hc2smJnRoaXMubWFzay53aWR0aHx8MCl9Z2V0IGRyYXdIZWlnaHQoKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5oZWlnaHQsdGhpcy5zbWFzayYmdGhpcy5zbWFzay5oZWlnaHR8fDAsdGhpcy5tYXNrJiZ0aGlzLm1hc2suaGVpZ2h0fHwwKX1kZWNvZGVCdWZmZXIoZSl7dmFyIHQscixhPXRoaXMuYnBjLGk9dGhpcy5udW1Db21wcyxuPXRoaXMuZGVjb2RlQWRkZW5kcyxzPXRoaXMuZGVjb2RlQ29lZmZpY2llbnRzLG89KDE8PGEpLTE7aWYoMSE9PWEpe3ZhciBjPTA7Zm9yKHQ9MCxyPXRoaXMud2lkdGgqdGhpcy5oZWlnaHQ7dDxyO3QrKylmb3IodmFyIGw9MDtsPGk7bCsrKXtlW2NdPWRlY29kZUFuZENsYW1wKGVbY10sbltsXSxzW2xdLG8pO2MrK319ZWxzZSBmb3IodD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyllW3RdPSshZVt0XX1nZXRDb21wb25lbnRzKGUpe3ZhciB0PXRoaXMuYnBjO2lmKDg9PT10KXJldHVybiBlO3ZhciByPXRoaXMud2lkdGgsYT10aGlzLmhlaWdodCxpPXRoaXMubnVtQ29tcHMsbj1yKmEqaSxzPTA7bGV0IG87bz10PD04P25ldyBVaW50OEFycmF5KG4pOnQ8PTE2P25ldyBVaW50MTZBcnJheShuKTpuZXcgVWludDMyQXJyYXkobik7dmFyIGMsbCxoPXIqaSx1PSgxPDx0KS0xLGQ9MDtpZigxPT09dClmb3IodmFyIGYsZyxtLHA9MDtwPGE7cCsrKXtnPWQrKC04JmgpO209ZCtoO2Zvcig7ZDxnOyl7bD1lW3MrK107b1tkXT1sPj43JjE7b1tkKzFdPWw+PjYmMTtvW2QrMl09bD4+NSYxO29bZCszXT1sPj40JjE7b1tkKzRdPWw+PjMmMTtvW2QrNV09bD4+MiYxO29bZCs2XT1sPj4xJjE7b1tkKzddPTEmbDtkKz04fWlmKGQ8bSl7bD1lW3MrK107Zj0xMjg7Zm9yKDtkPG07KXtvW2QrK109KyEhKGwmZik7Zj4+PTF9fX1lbHNle3ZhciBiPTA7bD0wO2ZvcihkPTAsYz1uO2Q8YzsrK2Qpe2lmKGQlaD09MCl7bD0wO2I9MH1mb3IoO2I8dDspe2w9bDw8OHxlW3MrK107Yis9OH12YXIgeT1iLXQ7bGV0IHI9bD4+eTtyPDA/cj0wOnI+dSYmKHI9dSk7b1tkXT1yO2wmPSgxPDx5KS0xO2I9eX19cmV0dXJuIG99ZmlsbE9wYWNpdHkoZSx0LHIsaSxuKXt2YXIgcyxvLGMsbCxoLHUsZD10aGlzLnNtYXNrLGY9dGhpcy5tYXNrO2lmKGQpe289ZC53aWR0aDtjPWQuaGVpZ2h0O3M9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG8qYyk7ZC5maWxsR3JheUJ1ZmZlcihzKTtvPT09dCYmYz09PXJ8fChzPXJlc2l6ZUltYWdlTWFzayhzLGQuYnBjLG8sYyx0LHIpKX1lbHNlIGlmKGYpaWYoZiBpbnN0YW5jZW9mIFBERkltYWdlKXtvPWYud2lkdGg7Yz1mLmhlaWdodDtzPW5ldyBVaW50OENsYW1wZWRBcnJheShvKmMpO2YubnVtQ29tcHM9MTtmLmZpbGxHcmF5QnVmZmVyKHMpO2ZvcihsPTAsaD1vKmM7bDxoOysrbClzW2xdPTI1NS1zW2xdO289PT10JiZjPT09cnx8KHM9cmVzaXplSW1hZ2VNYXNrKHMsZi5icGMsbyxjLHQscikpfWVsc2V7aWYoIUFycmF5LmlzQXJyYXkoZikpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlVua25vd24gbWFzayBmb3JtYXQuIik7cz1uZXcgVWludDhDbGFtcGVkQXJyYXkodCpyKTt2YXIgZz10aGlzLm51bUNvbXBzO2ZvcihsPTAsaD10KnI7bDxoOysrbCl7dmFyIG09MCxwPWwqZztmb3IodT0wO3U8ZzsrK3Upe3ZhciBiPW5bcCt1XSx5PTIqdTtpZihiPGZbeV18fGI+Zlt5KzFdKXttPTI1NTticmVha319c1tsXT1tfX1pZihzKWZvcihsPTAsdT0zLGg9dCppO2w8aDsrK2wsdSs9NCllW3VdPXNbbF07ZWxzZSBmb3IobD0wLHU9MyxoPXQqaTtsPGg7KytsLHUrPTQpZVt1XT0yNTV9dW5kb1ByZWJsZW5kKGUsdCxyKXt2YXIgYT10aGlzLnNtYXNrJiZ0aGlzLnNtYXNrLm1hdHRlO2lmKGEpZm9yKHZhciBpPXRoaXMuY29sb3JTcGFjZS5nZXRSZ2IoYSwwKSxuPWlbMF0scz1pWzFdLG89aVsyXSxjPXQqcio0LGw9MDtsPGM7bCs9NCl7dmFyIGg9ZVtsKzNdO2lmKDAhPT1oKXt2YXIgdT0yNTUvaDtlW2xdPShlW2xdLW4pKnUrbjtlW2wrMV09KGVbbCsxXS1zKSp1K3M7ZVtsKzJdPShlW2wrMl0tbykqdStvfWVsc2V7ZVtsXT0yNTU7ZVtsKzFdPTI1NTtlW2wrMl09MjU1fX19Y3JlYXRlSW1hZ2VEYXRhKGU9ITEpe3ZhciB0LHI9dGhpcy5kcmF3V2lkdGgsaT10aGlzLmRyYXdIZWlnaHQsbj17d2lkdGg6cixoZWlnaHQ6aSxraW5kOjAsZGF0YTpudWxsfSxjPXRoaXMubnVtQ29tcHMsbD10aGlzLndpZHRoLGg9dGhpcy5oZWlnaHQsdT10aGlzLmJwYyxkPWwqYyp1Kzc+PjM7aWYoIWUpe3ZhciBmOyJEZXZpY2VHcmF5Ij09PXRoaXMuY29sb3JTcGFjZS5uYW1lJiYxPT09dT9mPWEuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOiJEZXZpY2VSR0IiIT09dGhpcy5jb2xvclNwYWNlLm5hbWV8fDghPT11fHx0aGlzLm5lZWRzRGVjb2RlfHwoZj1hLkltYWdlS2luZC5SR0JfMjRCUFApO2lmKGYmJiF0aGlzLnNtYXNrJiYhdGhpcy5tYXNrJiZyPT09bCYmaT09PWgpe24ua2luZD1mO3Q9dGhpcy5nZXRJbWFnZUJ5dGVzKGgqZCk7aWYodGhpcy5pbWFnZSBpbnN0YW5jZW9mIHMuRGVjb2RlU3RyZWFtKW4uZGF0YT10O2Vsc2V7dmFyIGc9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQubGVuZ3RoKTtnLnNldCh0KTtuLmRhdGE9Z31pZih0aGlzLm5lZWRzRGVjb2RlKXsoMCxhLmFzc2VydCkoZj09PWEuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQLCJQREZJbWFnZS5jcmVhdGVJbWFnZURhdGE6IFRoZSBpbWFnZSBtdXN0IGJlIGdyYXlzY2FsZS4iKTtmb3IodmFyIG09bi5kYXRhLHA9MCxiPW0ubGVuZ3RoO3A8YjtwKyspbVtwXV49MjU1fXJldHVybiBufWlmKHRoaXMuaW1hZ2UgaW5zdGFuY2VvZiBvLkpwZWdTdHJlYW0mJiF0aGlzLnNtYXNrJiYhdGhpcy5tYXNrKXtsZXQgZT1oKmQ7c3dpdGNoKHRoaXMuY29sb3JTcGFjZS5uYW1lKXtjYXNlIkRldmljZUdyYXkiOmUqPTM7Y2FzZSJEZXZpY2VSR0IiOmNhc2UiRGV2aWNlQ01ZSyI6bi5raW5kPWEuSW1hZ2VLaW5kLlJHQl8yNEJQUDtuLmRhdGE9dGhpcy5nZXRJbWFnZUJ5dGVzKGUscixpLCEwKTtyZXR1cm4gbn19fXZhciB5LHYsdz0wfCh0PXRoaXMuZ2V0SW1hZ2VCeXRlcyhoKmQpKS5sZW5ndGgvZCppL2gsaz10aGlzLmdldENvbXBvbmVudHModCk7aWYoZXx8dGhpcy5zbWFza3x8dGhpcy5tYXNrKXtuLmtpbmQ9YS5JbWFnZUtpbmQuUkdCQV8zMkJQUDtuLmRhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHIqaSo0KTt5PTE7dj0hMDt0aGlzLmZpbGxPcGFjaXR5KG4uZGF0YSxyLGksdyxrKX1lbHNle24ua2luZD1hLkltYWdlS2luZC5SR0JfMjRCUFA7bi5kYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheShyKmkqMyk7eT0wO3Y9ITF9dGhpcy5uZWVkc0RlY29kZSYmdGhpcy5kZWNvZGVCdWZmZXIoayk7dGhpcy5jb2xvclNwYWNlLmZpbGxSZ2Iobi5kYXRhLGwsaCxyLGksdyx1LGsseSk7diYmdGhpcy51bmRvUHJlYmxlbmQobi5kYXRhLHIsdyk7cmV0dXJuIG59ZmlsbEdyYXlCdWZmZXIoZSl7dmFyIHQ9dGhpcy5udW1Db21wcztpZigxIT09dCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUmVhZGluZyBncmF5IHNjYWxlIGZyb20gYSBjb2xvciBpbWFnZTogIit0KTt2YXIgcixpLG49dGhpcy53aWR0aCxzPXRoaXMuaGVpZ2h0LG89dGhpcy5icGMsYz1uKnQqbys3Pj4zLGw9dGhpcy5nZXRJbWFnZUJ5dGVzKHMqYyksaD10aGlzLmdldENvbXBvbmVudHMobCk7aWYoMSE9PW8pe3RoaXMubmVlZHNEZWNvZGUmJnRoaXMuZGVjb2RlQnVmZmVyKGgpO2k9bipzO3ZhciB1PTI1NS8oKDE8PG8pLTEpO2ZvcihyPTA7cjxpOysrcillW3JdPXUqaFtyXX1lbHNle2k9bipzO2lmKHRoaXMubmVlZHNEZWNvZGUpZm9yKHI9MDtyPGk7KytyKWVbcl09aFtyXS0xJjI1NTtlbHNlIGZvcihyPTA7cjxpOysrcillW3JdPTI1NSYtaFtyXX19Z2V0SW1hZ2VCeXRlcyhlLHQscixhPSExKXt0aGlzLmltYWdlLnJlc2V0KCk7dGhpcy5pbWFnZS5kcmF3V2lkdGg9dHx8dGhpcy53aWR0aDt0aGlzLmltYWdlLmRyYXdIZWlnaHQ9cnx8dGhpcy5oZWlnaHQ7dGhpcy5pbWFnZS5mb3JjZVJHQj0hIWE7cmV0dXJuIHRoaXMuaW1hZ2UuZ2V0Qnl0ZXMoZSwhMCl9fXQuUERGSW1hZ2U9UERGSW1hZ2V9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuTWVzc2FnZUhhbmRsZXI9dm9pZCAwO3ZhciBhPXIoMik7Y29uc3QgaT0xLG49MixzPTEsbz0yLGM9MyxsPTQsaD01LHU9NixkPTcsZj04O2Z1bmN0aW9uIHdyYXBSZWFzb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gZTtzd2l0Y2goZS5uYW1lKXtjYXNlIkFib3J0RXhjZXB0aW9uIjpyZXR1cm4gbmV3IGEuQWJvcnRFeGNlcHRpb24oZS5tZXNzYWdlKTtjYXNlIk1pc3NpbmdQREZFeGNlcHRpb24iOnJldHVybiBuZXcgYS5NaXNzaW5nUERGRXhjZXB0aW9uKGUubWVzc2FnZSk7Y2FzZSJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iOnJldHVybiBuZXcgYS5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oZS5tZXNzYWdlLGUuc3RhdHVzKTtjYXNlIlVua25vd25FcnJvckV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBhLlVua25vd25FcnJvckV4Y2VwdGlvbihlLm1lc3NhZ2UsZS5kZXRhaWxzKTtkZWZhdWx0OnJldHVybiBuZXcgYS5Vbmtub3duRXJyb3JFeGNlcHRpb24oZS5tZXNzYWdlLGUudG9TdHJpbmcoKSl9fXQuTWVzc2FnZUhhbmRsZXI9Y2xhc3MgTWVzc2FnZUhhbmRsZXJ7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuc291cmNlTmFtZT1lO3RoaXMudGFyZ2V0TmFtZT10O3RoaXMuY29tT2JqPXI7dGhpcy5jYWxsYmFja0lkPTE7dGhpcy5zdHJlYW1JZD0xO3RoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM9ITA7dGhpcy5zdHJlYW1TaW5rcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuc3RyZWFtQ29udHJvbGxlcnM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5hY3Rpb25IYW5kbGVyPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5fb25Db21PYmpPbk1lc3NhZ2U9ZT0+e2NvbnN0IHQ9ZS5kYXRhO2lmKHQudGFyZ2V0TmFtZSE9PXRoaXMuc291cmNlTmFtZSlyZXR1cm47aWYodC5zdHJlYW0pe3RoaXMuX3Byb2Nlc3NTdHJlYW1NZXNzYWdlKHQpO3JldHVybn1pZih0LmNhbGxiYWNrKXtjb25zdCBlPXQuY2FsbGJhY2tJZCxyPXRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbZV07aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayAiK2UpO2RlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2VdO2lmKHQuY2FsbGJhY2s9PT1pKXIucmVzb2x2ZSh0LmRhdGEpO2Vsc2V7aWYodC5jYWxsYmFjayE9PW4pdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTtyLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSl9cmV0dXJufWNvbnN0IGE9dGhpcy5hY3Rpb25IYW5kbGVyW3QuYWN0aW9uXTtpZighYSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAiK3QuYWN0aW9uKTtpZih0LmNhbGxiYWNrSWQpe2NvbnN0IGU9dGhpcy5zb3VyY2VOYW1lLHM9dC5zb3VyY2VOYW1lO25ldyBQcm9taXNlKChmdW5jdGlvbihlKXtlKGEodC5kYXRhKSl9KSkudGhlbigoZnVuY3Rpb24oYSl7ci5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTplLHRhcmdldE5hbWU6cyxjYWxsYmFjazppLGNhbGxiYWNrSWQ6dC5jYWxsYmFja0lkLGRhdGE6YX0pfSksKGZ1bmN0aW9uKGEpe3IucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6ZSx0YXJnZXROYW1lOnMsY2FsbGJhY2s6bixjYWxsYmFja0lkOnQuY2FsbGJhY2tJZCxyZWFzb246d3JhcFJlYXNvbihhKX0pfSkpfWVsc2UgdC5zdHJlYW1JZD90aGlzLl9jcmVhdGVTdHJlYW1TaW5rKHQpOmEodC5kYXRhKX07ci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSl9b24oZSx0KXtjb25zdCByPXRoaXMuYWN0aW9uSGFuZGxlcjtpZihyW2VdKXRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgYWxyZWFkeSBhbiBhY3Rpb25OYW1lIGNhbGxlZCAiJHtlfSJgKTtyW2VdPXR9c2VuZChlLHQscil7dGhpcy5fcG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6dGhpcy5zb3VyY2VOYW1lLHRhcmdldE5hbWU6dGhpcy50YXJnZXROYW1lLGFjdGlvbjplLGRhdGE6dH0scil9c2VuZFdpdGhQcm9taXNlKGUsdCxyKXtjb25zdCBpPXRoaXMuY2FsbGJhY2tJZCsrLG49KDAsYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2ldPW47dHJ5e3RoaXMuX3Bvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnRoaXMuc291cmNlTmFtZSx0YXJnZXROYW1lOnRoaXMudGFyZ2V0TmFtZSxhY3Rpb246ZSxjYWxsYmFja0lkOmksZGF0YTp0fSxyKX1jYXRjaChlKXtuLnJlamVjdChlKX1yZXR1cm4gbi5wcm9taXNlfXNlbmRXaXRoU3RyZWFtKGUsdCxyLGkpe2NvbnN0IG49dGhpcy5zdHJlYW1JZCsrLG89dGhpcy5zb3VyY2VOYW1lLGM9dGhpcy50YXJnZXROYW1lLGw9dGhpcy5jb21PYmo7cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQ6cj0+e2NvbnN0IHM9KDAsYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW25dPXtjb250cm9sbGVyOnIsc3RhcnRDYWxsOnMscHVsbENhbGw6bnVsbCxjYW5jZWxDYWxsOm51bGwsaXNDbG9zZWQ6ITF9O3RoaXMuX3Bvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOm8sdGFyZ2V0TmFtZTpjLGFjdGlvbjplLHN0cmVhbUlkOm4sZGF0YTp0LGRlc2lyZWRTaXplOnIuZGVzaXJlZFNpemV9LGkpO3JldHVybiBzLnByb21pc2V9LHB1bGw6ZT0+e2NvbnN0IHQ9KDAsYS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW25dLnB1bGxDYWxsPXQ7bC5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpvLHRhcmdldE5hbWU6YyxzdHJlYW06dSxzdHJlYW1JZDpuLGRlc2lyZWRTaXplOmUuZGVzaXJlZFNpemV9KTtyZXR1cm4gdC5wcm9taXNlfSxjYW5jZWw6ZT0+eygwLGEuYXNzZXJ0KShlIGluc3RhbmNlb2YgRXJyb3IsImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTtjb25zdCB0PSgwLGEuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5zdHJlYW1Db250cm9sbGVyc1tuXS5jYW5jZWxDYWxsPXQ7dGhpcy5zdHJlYW1Db250cm9sbGVyc1tuXS5pc0Nsb3NlZD0hMDtsLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOm8sdGFyZ2V0TmFtZTpjLHN0cmVhbTpzLHN0cmVhbUlkOm4scmVhc29uOndyYXBSZWFzb24oZSl9KTtyZXR1cm4gdC5wcm9taXNlfX0scil9X2NyZWF0ZVN0cmVhbVNpbmsoZSl7Y29uc3QgdD10aGlzLHI9dGhpcy5hY3Rpb25IYW5kbGVyW2UuYWN0aW9uXSxpPWUuc3RyZWFtSWQsbj10aGlzLnNvdXJjZU5hbWUscz1lLnNvdXJjZU5hbWUsbz10aGlzLmNvbU9iaix1PXtlbnF1ZXVlKGUscj0xLG8pe2lmKHRoaXMuaXNDYW5jZWxsZWQpcmV0dXJuO2NvbnN0IGM9dGhpcy5kZXNpcmVkU2l6ZTt0aGlzLmRlc2lyZWRTaXplLT1yO2lmKGM+MCYmdGhpcy5kZXNpcmVkU2l6ZTw9MCl7dGhpcy5zaW5rQ2FwYWJpbGl0eT0oMCxhLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMucmVhZHk9dGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlfXQuX3Bvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOm4sdGFyZ2V0TmFtZTpzLHN0cmVhbTpsLHN0cmVhbUlkOmksY2h1bms6ZX0sbyl9LGNsb3NlKCl7aWYoIXRoaXMuaXNDYW5jZWxsZWQpe3RoaXMuaXNDYW5jZWxsZWQ9ITA7by5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpuLHRhcmdldE5hbWU6cyxzdHJlYW06YyxzdHJlYW1JZDppfSk7ZGVsZXRlIHQuc3RyZWFtU2lua3NbaV19fSxlcnJvcihlKXsoMCxhLmFzc2VydCkoZSBpbnN0YW5jZW9mIEVycm9yLCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTtpZighdGhpcy5pc0NhbmNlbGxlZCl7dGhpcy5pc0NhbmNlbGxlZD0hMDtvLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOm4sdGFyZ2V0TmFtZTpzLHN0cmVhbTpoLHN0cmVhbUlkOmkscmVhc29uOndyYXBSZWFzb24oZSl9KX19LHNpbmtDYXBhYmlsaXR5OigwLGEuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCksb25QdWxsOm51bGwsb25DYW5jZWw6bnVsbCxpc0NhbmNlbGxlZDohMSxkZXNpcmVkU2l6ZTplLmRlc2lyZWRTaXplLHJlYWR5Om51bGx9O3Uuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO3UucmVhZHk9dS5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO3RoaXMuc3RyZWFtU2lua3NbaV09dTtuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCl7dChyKGUuZGF0YSx1KSl9KSkudGhlbigoZnVuY3Rpb24oKXtvLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOm4sdGFyZ2V0TmFtZTpzLHN0cmVhbTpmLHN0cmVhbUlkOmksc3VjY2VzczohMH0pfSksKGZ1bmN0aW9uKGUpe28ucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6bix0YXJnZXROYW1lOnMsc3RyZWFtOmYsc3RyZWFtSWQ6aSxyZWFzb246d3JhcFJlYXNvbihlKX0pfSkpfV9wcm9jZXNzU3RyZWFtTWVzc2FnZShlKXtjb25zdCB0PWUuc3RyZWFtSWQscj10aGlzLnNvdXJjZU5hbWUsaT1lLnNvdXJjZU5hbWUsbj10aGlzLmNvbU9iajtzd2l0Y2goZS5zdHJlYW0pe2Nhc2UgZjplLnN1Y2Nlc3M/dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5zdGFydENhbGwucmVzb2x2ZSgpOnRoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0uc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGUucmVhc29uKSk7YnJlYWs7Y2FzZSBkOmUuc3VjY2Vzcz90aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLnB1bGxDYWxsLnJlc29sdmUoKTp0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLnB1bGxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGUucmVhc29uKSk7YnJlYWs7Y2FzZSB1OmlmKCF0aGlzLnN0cmVhbVNpbmtzW3RdKXtuLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTppLHN0cmVhbTpkLHN0cmVhbUlkOnQsc3VjY2VzczohMH0pO2JyZWFrfXRoaXMuc3RyZWFtU2lua3NbdF0uZGVzaXJlZFNpemU8PTAmJmUuZGVzaXJlZFNpemU+MCYmdGhpcy5zdHJlYW1TaW5rc1t0XS5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7dGhpcy5zdHJlYW1TaW5rc1t0XS5kZXNpcmVkU2l6ZT1lLmRlc2lyZWRTaXplO2NvbnN0e29uUHVsbDpnfT10aGlzLnN0cmVhbVNpbmtzW2Uuc3RyZWFtSWRdO25ldyBQcm9taXNlKChmdW5jdGlvbihlKXtlKGcmJmcoKSl9KSkudGhlbigoZnVuY3Rpb24oKXtuLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTppLHN0cmVhbTpkLHN0cmVhbUlkOnQsc3VjY2VzczohMH0pfSksKGZ1bmN0aW9uKGUpe24ucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6cix0YXJnZXROYW1lOmksc3RyZWFtOmQsc3RyZWFtSWQ6dCxyZWFzb246d3JhcFJlYXNvbihlKX0pfSkpO2JyZWFrO2Nhc2UgbDooMCxhLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XSwiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpO2lmKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0uaXNDbG9zZWQpYnJlYWs7dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5jb250cm9sbGVyLmVucXVldWUoZS5jaHVuayk7YnJlYWs7Y2FzZSBjOigwLGEuYXNzZXJ0KSh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLCJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpO2lmKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0uaXNDbG9zZWQpYnJlYWs7dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5pc0Nsb3NlZD0hMDt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLmNvbnRyb2xsZXIuY2xvc2UoKTt0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHQpO2JyZWFrO2Nhc2UgaDooMCxhLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XSwiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihlLnJlYXNvbikpO3RoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIodCk7YnJlYWs7Y2FzZSBvOmUuc3VjY2Vzcz90aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLmNhbmNlbENhbGwucmVzb2x2ZSgpOnRoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0uY2FuY2VsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihlLnJlYXNvbikpO3RoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIodCk7YnJlYWs7Y2FzZSBzOmlmKCF0aGlzLnN0cmVhbVNpbmtzW3RdKWJyZWFrO2NvbnN0e29uQ2FuY2VsOm19PXRoaXMuc3RyZWFtU2lua3NbZS5zdHJlYW1JZF07bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3QobSYmbSh3cmFwUmVhc29uKGUucmVhc29uKSkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7bi5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6aSxzdHJlYW06byxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbihlKXtuLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTppLHN0cmVhbTpvLHN0cmVhbUlkOnQscmVhc29uOndyYXBSZWFzb24oZSl9KX0pKTt0aGlzLnN0cmVhbVNpbmtzW3RdLnNpbmtDYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGUucmVhc29uKSk7dGhpcy5zdHJlYW1TaW5rc1t0XS5pc0NhbmNlbGxlZD0hMDtkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1t0XTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBzdHJlYW0gY2FzZSIpfX1hc3luYyBfZGVsZXRlU3RyZWFtQ29udHJvbGxlcihlKXthd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbZV0uc3RhcnRDYWxsLHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbZV0ucHVsbENhbGwsdGhpcy5zdHJlYW1Db250cm9sbGVyc1tlXS5jYW5jZWxDYWxsXS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLnByb21pc2V9KSkpO2RlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2VdfV9wb3N0TWVzc2FnZShlLHQpe3QmJnRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM/dGhpcy5jb21PYmoucG9zdE1lc3NhZ2UoZSx0KTp0aGlzLmNvbU9iai5wb3N0TWVzc2FnZShlKX1kZXN0cm95KCl7dGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpfX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuUERGV29ya2VyU3RyZWFtPXZvaWQgMDt2YXIgYT1yKDIpO3QuUERGV29ya2VyU3RyZWFtPWNsYXNzIFBERldvcmtlclN0cmVhbXtjb25zdHJ1Y3RvcihlKXt0aGlzLl9tc2dIYW5kbGVyPWU7dGhpcy5fY29udGVudExlbmd0aD1udWxsO3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPW51bGw7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycz1bXX1nZXRGdWxsUmVhZGVyKCl7KDAsYS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGV29ya2VyU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bmV3IFBERldvcmtlclN0cmVhbVJlYWRlcih0aGlzLl9tc2dIYW5kbGVyKTtyZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXJ9Z2V0UmFuZ2VSZWFkZXIoZSx0KXtjb25zdCByPW5ldyBQREZXb3JrZXJTdHJlYW1SYW5nZVJlYWRlcihlLHQsdGhpcy5fbXNnSGFuZGxlcik7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHIpO3JldHVybiByfWNhbmNlbEFsbFJlcXVlc3RzKGUpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyJiZ0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwoZSk7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNhbmNlbChlKX0pKX19O2NsYXNzIFBERldvcmtlclN0cmVhbVJlYWRlcntjb25zdHJ1Y3RvcihlKXt0aGlzLl9tc2dIYW5kbGVyPWU7dGhpcy5vblByb2dyZXNzPW51bGw7dGhpcy5fY29udGVudExlbmd0aD1udWxsO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9ITE7dGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9ITE7Y29uc3QgdD10aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRSZWFkZXIiKTt0aGlzLl9yZWFkZXI9dC5nZXRSZWFkZXIoKTt0aGlzLl9oZWFkZXJzUmVhZHk9dGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlJlYWRlckhlYWRlcnNSZWFkeSIpLnRoZW4oZT0+e3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPWUuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7dGhpcy5faXNSYW5nZVN1cHBvcnRlZD1lLmlzUmFuZ2VTdXBwb3J0ZWQ7dGhpcy5fY29udGVudExlbmd0aD1lLmNvbnRlbnRMZW5ndGh9KX1nZXQgaGVhZGVyc1JlYWR5KCl7cmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeX1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofWdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpe3JldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZH1nZXQgaXNSYW5nZVN1cHBvcnRlZCgpe3JldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkfWFzeW5jIHJlYWQoKXtjb25zdHt2YWx1ZTplLGRvbmU6dH09YXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtyZXR1cm4gdD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Ont2YWx1ZTplLmJ1ZmZlcixkb25lOiExfX1jYW5jZWwoZSl7dGhpcy5fcmVhZGVyLmNhbmNlbChlKX19Y2xhc3MgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXJ7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuX21zZ0hhbmRsZXI9cjt0aGlzLm9uUHJvZ3Jlc3M9bnVsbDtjb25zdCBhPXRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJhbmdlUmVhZGVyIix7YmVnaW46ZSxlbmQ6dH0pO3RoaXMuX3JlYWRlcj1hLmdldFJlYWRlcigpfWdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpe3JldHVybiExfWFzeW5jIHJlYWQoKXtjb25zdHt2YWx1ZTplLGRvbmU6dH09YXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtyZXR1cm4gdD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Ont2YWx1ZTplLmJ1ZmZlcixkb25lOiExfX1jYW5jZWwoZSl7dGhpcy5fcmVhZGVyLmNhbmNlbChlKX19fV0pfSkpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NtYXBzLzc4LUVVQy1ILmJjbWFwIGIvY21hcHMvNzgtRVVDLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1NWZjNwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzc4LUVVQy1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzc4LUVVQy1WLmJjbWFwIGIvY21hcHMvNzgtRVVDLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlZDg1MwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzc4LUVVQy1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzc4LUguYmNtYXAgYi9jbWFwcy83OC1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTg5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy83OC1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzc4LVJLU0otSC5iY21hcCBiL2NtYXBzLzc4LVJLU0otSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDE2N2NiCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvNzgtUktTSi1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzc4LVJLU0otVi5iY21hcCBiL2NtYXBzLzc4LVJLU0otVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIxNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvNzgtUktTSi1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzc4LVYuYmNtYXAgYi9jbWFwcy83OC1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWY5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy83OC1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzc4bXMtUktTSi1ILmJjbWFwIGIvY21hcHMvNzhtcy1SS1NKLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwNzdkMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzc4bXMtUktTSi1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzc4bXMtUktTSi1WLmJjbWFwIGIvY21hcHMvNzhtcy1SS1NKLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmMjMyMwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzc4bXMtUktTSi1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzgzcHYtUktTSi1ILmJjbWFwIGIvY21hcHMvODNwdi1SS1NKLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1OWJjNQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzgzcHYtUktTSi1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzkwbXMtUktTSi1ILmJjbWFwIGIvY21hcHMvOTBtcy1SS1NKLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4MjkzOAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzkwbXMtUktTSi1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzkwbXMtUktTSi1WLmJjbWFwIGIvY21hcHMvOTBtcy1SS1NKLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwNTQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzkwbXMtUktTSi1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzkwbXNwLVJLU0otSC5iY21hcCBiL2NtYXBzLzkwbXNwLVJLU0otSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmQzMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvOTBtc3AtUktTSi1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzkwbXNwLVJLU0otVi5iY21hcCBiL2NtYXBzLzkwbXNwLVJLU0otVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWVmMTRhCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvOTBtc3AtUktTSi1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzkwcHYtUktTSi1ILmJjbWFwIGIvY21hcHMvOTBwdi1SS1NKLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmNzEzYgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzkwcHYtUktTSi1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzLzkwcHYtUktTSi1WLmJjbWFwIGIvY21hcHMvOTBwdi1SS1NKLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4ZTBjYwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzLzkwcHYtUktTSi1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0FkZC1ILmJjbWFwIGIvY21hcHMvQWRkLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0NDJhYwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0FkZC1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0FkZC1SS1NKLUguYmNtYXAgYi9jbWFwcy9BZGQtUktTSi1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDY1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9BZGQtUktTSi1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0FkZC1SS1NKLVYuYmNtYXAgYi9jbWFwcy9BZGQtUktTSi1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDAxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9BZGQtUktTSi1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0FkZC1WLmJjbWFwIGIvY21hcHMvQWRkLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4MTZkMwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0FkZC1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUNOUzEtMC5iY21hcCBiL2NtYXBzL0Fkb2JlLUNOUzEtMC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGVjMDRhCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQWRvYmUtQ05TMS0wLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUNOUzEtMS5iY21hcCBiL2NtYXBzL0Fkb2JlLUNOUzEtMS5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2E1MDE0Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQWRvYmUtQ05TMS0xLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUNOUzEtMi5iY21hcCBiL2NtYXBzL0Fkb2JlLUNOUzEtMi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE5NTE0Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQWRvYmUtQ05TMS0yLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUNOUzEtMy5iY21hcCBiL2NtYXBzL0Fkb2JlLUNOUzEtMy5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQ4YjhjCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQWRvYmUtQ05TMS0zLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUNOUzEtNC5iY21hcCBiL2NtYXBzL0Fkb2JlLUNOUzEtNC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTBmYzZjCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQWRvYmUtQ05TMS00LmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUNOUzEtNS5iY21hcCBiL2NtYXBzL0Fkb2JlLUNOUzEtNS5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2FmNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQWRvYmUtQ05TMS01LmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUNOUzEtNi5iY21hcCBiL2NtYXBzL0Fkb2JlLUNOUzEtNi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzdmYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQWRvYmUtQ05TMS02LmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUNOUzEtVUNTMi5iY21hcCBiL2NtYXBzL0Fkb2JlLUNOUzEtVUNTMi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ3OWEyCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQWRvYmUtQ05TMS1VQ1MyLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUdCMS0wLmJjbWFwIGIvY21hcHMvQWRvYmUtR0IxLTAuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxMDEwOAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUdCMS0wLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUdCMS0xLmJjbWFwIGIvY21hcHMvQWRvYmUtR0IxLTEuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3YmIxMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUdCMS0xLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUdCMS0yLmJjbWFwIGIvY21hcHMvQWRvYmUtR0IxLTIuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2NDhjYwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUdCMS0yLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUdCMS0zLmJjbWFwIGIvY21hcHMvQWRvYmUtR0IxLTMuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyMTQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUdCMS0zLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUdCMS00LmJjbWFwIGIvY21hcHMvQWRvYmUtR0IxLTQuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwYzYzYQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUdCMS00LmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUdCMS01LmJjbWFwIGIvY21hcHMvQWRvYmUtR0IxLTUuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2MjNiNQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUdCMS01LmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUdCMS1VQ1MyLmJjbWFwIGIvY21hcHMvQWRvYmUtR0IxLVVDUzIuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NjUyNQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUdCMS1VQ1MyLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUphcGFuMS0wLmJjbWFwIGIvY21hcHMvQWRvYmUtSmFwYW4xLTAuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlOTRlYwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUphcGFuMS0wLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUphcGFuMS0xLmJjbWFwIGIvY21hcHMvQWRvYmUtSmFwYW4xLTEuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkNDJjNQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUphcGFuMS0xLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUphcGFuMS0yLmJjbWFwIGIvY21hcHMvQWRvYmUtSmFwYW4xLTIuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwODE5YQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUphcGFuMS0yLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUphcGFuMS0zLmJjbWFwIGIvY21hcHMvQWRvYmUtSmFwYW4xLTMuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3ZGZjMQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUphcGFuMS0zLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUphcGFuMS00LmJjbWFwIGIvY21hcHMvQWRvYmUtSmFwYW4xLTQuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhYTliZgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUphcGFuMS00LmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUphcGFuMS01LmJjbWFwIGIvY21hcHMvQWRvYmUtSmFwYW4xLTUuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0YjY1YwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUphcGFuMS01LmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUphcGFuMS02LmJjbWFwIGIvY21hcHMvQWRvYmUtSmFwYW4xLTYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3ZDY5OQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUphcGFuMS02LmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUphcGFuMS1VQ1MyLmJjbWFwIGIvY21hcHMvQWRvYmUtSmFwYW4xLVVDUzIuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4YTE0MQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUphcGFuMS1VQ1MyLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUtvcmVhMS0wLmJjbWFwIGIvY21hcHMvQWRvYmUtS29yZWExLTAuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmMWE5OQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUtvcmVhMS0wLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUtvcmVhMS0xLmJjbWFwIGIvY21hcHMvQWRvYmUtS29yZWExLTEuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmZmEzNgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUtvcmVhMS0xLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUtvcmVhMS0yLmJjbWFwIGIvY21hcHMvQWRvYmUtS29yZWExLTIuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3MjMwOAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUtvcmVhMS0yLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0Fkb2JlLUtvcmVhMS1VQ1MyLmJjbWFwIGIvY21hcHMvQWRvYmUtS29yZWExLVVDUzIuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzNzFjMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0Fkb2JlLUtvcmVhMS1VQ1MyLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0I1LUguYmNtYXAgYi9jbWFwcy9CNS1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjRkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9CNS1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0I1LVYuYmNtYXAgYi9jbWFwcy9CNS1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGY4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9CNS1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0I1cGMtSC5iY21hcCBiL2NtYXBzL0I1cGMtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTAwMTMxCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQjVwYy1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0I1cGMtVi5iY21hcCBiL2NtYXBzL0I1cGMtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I5OWZmCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQjVwYy1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0NOUy1FVUMtSC5iY21hcCBiL2NtYXBzL0NOUy1FVUMtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQxZDBjCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQ05TLUVVQy1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0NOUy1FVUMtVi5iY21hcCBiL2NtYXBzL0NOUy1FVUMtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTM5M2E1Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQ05TLUVVQy1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0NOUzEtSC5iY21hcCBiL2NtYXBzL0NOUzEtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM4ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQ05TMS1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0NOUzEtVi5iY21hcCBiL2NtYXBzL0NOUzEtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzMxNjlmCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQ05TMS1WLmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0NOUzItSC5iY21hcCBiL2NtYXBzL0NOUzItSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODliMzUyCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQ05TMi1ILmJjbWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NtYXBzL0NOUzItVi5iY21hcCBiL2NtYXBzL0NOUzItVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg4Y2VjCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvQ05TMi1WLmJjbWFwCkBAIC0wLDAgKzEsMyBAQAorA+BSQ29weXJpZ2h0IDE5OTAtMjAwOSBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCitTZWUgLi9MSUNFTlNF4QZDTlMyLUgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jbWFwcy9FVEhLLUI1LUguYmNtYXAgYi9jbWFwcy9FVEhLLUI1LUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyOTQxNQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0VUSEstQjUtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FVEhLLUI1LVYuYmNtYXAgYi9jbWFwcy9FVEhLLUI1LVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5YWVjNgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0VUSEstQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FVGVuLUI1LUguYmNtYXAgYi9jbWFwcy9FVGVuLUI1LUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkNzc0NgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0VUZW4tQjUtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FVGVuLUI1LVYuYmNtYXAgYi9jbWFwcy9FVGVuLUI1LVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliZmYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0VUZW4tQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FVGVubXMtQjUtSC5iY21hcCBiL2NtYXBzL0VUZW5tcy1CNS1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDY5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9FVGVubXMtQjUtSC5iY21hcApAQCAtMCwwICsxLDMgQEAKKwLgUkNvcHlyaWdodCAxOTkwLTIwMDkgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuCitBbGwgcmlnaHRzIHJlc2VydmVkLgorU2VlIC4vTElDRU5TReEJRVRlbi1CNS1IYAEgXgEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jbWFwcy9FVGVubXMtQjUtVi5iY21hcCBiL2NtYXBzL0VUZW5tcy1CNS1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzVkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9FVGVubXMtQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FVUMtSC5iY21hcCBiL2NtYXBzL0VVQy1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MmVhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FVUMtVi5iY21hcCBiL2NtYXBzL0VVQy1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhN2MxODMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FeHQtSC5iY21hcCBiL2NtYXBzL0V4dC1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNWNkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9FeHQtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FeHQtUktTSi1ILmJjbWFwIGIvY21hcHMvRXh0LVJLU0otSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRkMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvRXh0LVJLU0otSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FeHQtUktTSi1WLmJjbWFwIGIvY21hcHMvRXh0LVJLU0otVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDU3YzI3Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvRXh0LVJLU0otVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9FeHQtVi5iY21hcCBiL2NtYXBzL0V4dC1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTljYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9FeHQtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQi1FVUMtSC5iY21hcCBiL2NtYXBzL0dCLUVVQy1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTkwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9HQi1FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQi1FVUMtVi5iY21hcCBiL2NtYXBzL0dCLUVVQy1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmU1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9HQi1FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQi1ILmJjbWFwIGIvY21hcHMvR0ItSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE4OWM1Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvR0ItSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQi1WLmJjbWFwIGIvY21hcHMvR0ItVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA4MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvR0ItVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQkstRVVDLUguYmNtYXAgYi9jbWFwcy9HQkstRVVDLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmZmY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0dCSy1FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQkstRVVDLVYuYmNtYXAgYi9jbWFwcy9HQkstRVVDLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkZjZiZQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0dCSy1FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQksySy1ILmJjbWFwIGIvY21hcHMvR0JLMkstSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY2YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvR0JLMkstSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQksySy1WLmJjbWFwIGIvY21hcHMvR0JLMkstVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWE5NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvR0JLMkstVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQktwLUVVQy1ILmJjbWFwIGIvY21hcHMvR0JLcC1FVUMtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2IwYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvR0JLcC1FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQktwLUVVQy1WLmJjbWFwIGIvY21hcHMvR0JLcC1FVUMtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E5M2I4Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvR0JLcC1FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQlQtRVVDLUguYmNtYXAgYi9jbWFwcy9HQlQtRVVDLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0ZTJkMwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0dCVC1FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQlQtRVVDLVYuYmNtYXAgYi9jbWFwcy9HQlQtRVVDLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNzA2NgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0dCVC1FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQlQtSC5iY21hcCBiL2NtYXBzL0dCVC1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MzdhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9HQlQtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQlQtVi5iY21hcCBiL2NtYXBzL0dCVC1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5N2FiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9HQlQtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQlRwYy1FVUMtSC5iY21hcCBiL2NtYXBzL0dCVHBjLUVVQy1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTUwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9HQlRwYy1FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQlRwYy1FVUMtVi5iY21hcCBiL2NtYXBzL0dCVHBjLUVVQy1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGQ3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9HQlRwYy1FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQnBjLUVVQy1ILmJjbWFwIGIvY21hcHMvR0JwYy1FVUMtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWVkZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvR0JwYy1FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9HQnBjLUVVQy1WLmJjbWFwIGIvY21hcHMvR0JwYy1FVUMtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ1MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvR0JwYy1FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9ILmJjbWFwIGIvY21hcHMvSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI0ZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS2RsYS1CNS1ILmJjbWFwIGIvY21hcHMvSEtkbGEtQjUtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDMwYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvSEtkbGEtQjUtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS2RsYS1CNS1WLmJjbWFwIGIvY21hcHMvSEtkbGEtQjUtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODk0Njk0Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvSEtkbGEtQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS2RsYi1CNS1ILmJjbWFwIGIvY21hcHMvSEtkbGItQjUtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODI5YTIzCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvSEtkbGItQjUtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS2RsYi1CNS1WLmJjbWFwIGIvY21hcHMvSEtkbGItQjUtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjU3MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvSEtkbGItQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS2djY3MtQjUtSC5iY21hcCBiL2NtYXBzL0hLZ2Njcy1CNS1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MWE0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9IS2djY3MtQjUtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS2djY3MtQjUtVi5iY21hcCBiL2NtYXBzL0hLZ2Njcy1CNS1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTNjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9IS2djY3MtQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS20zMTQtQjUtSC5iY21hcCBiL2NtYXBzL0hLbTMxNC1CNS1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmRjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9IS20zMTQtQjUtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS20zMTQtQjUtVi5iY21hcCBiL2NtYXBzL0hLbTMxNC1CNS1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTZkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9IS20zMTQtQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS200NzEtQjUtSC5iY21hcCBiL2NtYXBzL0hLbTQ3MS1CNS1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDE3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9IS200NzEtQjUtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS200NzEtQjUtVi5iY21hcCBiL2NtYXBzL0hLbTQ3MS1CNS1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTU5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9IS200NzEtQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS3Njcy1CNS1ILmJjbWFwIGIvY21hcHMvSEtzY3MtQjUtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWY3ODU3Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvSEtzY3MtQjUtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IS3Njcy1CNS1WLmJjbWFwIGIvY21hcHMvSEtzY3MtQjUtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIyZmEyCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvSEtzY3MtQjUtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IYW5rYWt1LmJjbWFwIGIvY21hcHMvSGFua2FrdS5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhlYzdmCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvSGFua2FrdS5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9IaXJhZ2FuYS5iY21hcCBiL2NtYXBzL0hpcmFnYW5hLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTk4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9IaXJhZ2FuYS5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0MtRVVDLUguYmNtYXAgYi9jbWFwcy9LU0MtRVVDLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1YzY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0tTQy1FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0MtRVVDLVYuYmNtYXAgYi9jbWFwcy9LU0MtRVVDLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3YjIxZgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL0tTQy1FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0MtSC5iY21hcCBiL2NtYXBzL0tTQy1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjIyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0MtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0MtSm9oYWItSC5iY21hcCBiL2NtYXBzL0tTQy1Kb2hhYi1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzFmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0MtSm9oYWItSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0MtSm9oYWItVi5iY21hcCBiL2NtYXBzL0tTQy1Kb2hhYi1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2N2NlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0MtSm9oYWItVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0MtVi5iY21hcCBiL2NtYXBzL0tTQy1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTJmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0MtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0Ntcy1VSEMtSC5iY21hcCBiL2NtYXBzL0tTQ21zLVVIQy1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDQyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0Ntcy1VSEMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0Ntcy1VSEMtSFctSC5iY21hcCBiL2NtYXBzL0tTQ21zLVVIQy1IVy1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNGFlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0Ntcy1VSEMtSFctSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0Ntcy1VSEMtSFctVi5iY21hcCBiL2NtYXBzL0tTQ21zLVVIQy1IVy1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTVkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0Ntcy1VSEMtSFctVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0Ntcy1VSEMtVi5iY21hcCBiL2NtYXBzL0tTQ21zLVVIQy1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjk3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0Ntcy1VSEMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0NwYy1FVUMtSC5iY21hcCBiL2NtYXBzL0tTQ3BjLUVVQy1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNmYzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0NwYy1FVUMtSC5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LU0NwYy1FVUMtVi5iY21hcCBiL2NtYXBzL0tTQ3BjLUVVQy1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYzkxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LU0NwYy1FVUMtVi5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9LYXRha2FuYS5iY21hcCBiL2NtYXBzL0thdGFrYW5hLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNDMwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9LYXRha2FuYS5iY21hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jbWFwcy9MSUNFTlNFIGIvY21hcHMvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFkMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvTElDRU5TRQpAQCAtMCwwICsxLDM2IEBACislJUNvcHlyaWdodDogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlQ29weXJpZ2h0OiBDb3B5cmlnaHQgMTk5MC0yMDA5IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLgorJSVDb3B5cmlnaHQ6IEFsbCByaWdodHMgcmVzZXJ2ZWQuCislJUNvcHlyaWdodDoKKyUlQ29weXJpZ2h0OiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCislJUNvcHlyaWdodDogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKKyUlQ29weXJpZ2h0OiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorJSVDb3B5cmlnaHQ6CislJUNvcHlyaWdodDogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorJSVDb3B5cmlnaHQ6IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCislJUNvcHlyaWdodDogZGlzY2xhaW1lci4KKyUlQ29weXJpZ2h0OgorJSVDb3B5cmlnaHQ6IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyUlQ29weXJpZ2h0OiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworJSVDb3B5cmlnaHQ6IGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworJSVDb3B5cmlnaHQ6IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCislJUNvcHlyaWdodDoKKyUlQ29weXJpZ2h0OiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIG5vciB0aGUgbmFtZXMKKyUlQ29weXJpZ2h0OiBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorJSVDb3B5cmlnaHQ6IHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyUlQ29weXJpZ2h0OiB3cml0dGVuIHBlcm1pc3Npb24uIAorJSVDb3B5cmlnaHQ6CislJUNvcHlyaWdodDogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECislJUNvcHlyaWdodDogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyUlQ29weXJpZ2h0OiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorJSVDb3B5cmlnaHQ6IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCislJUNvcHlyaWdodDogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKKyUlQ29weXJpZ2h0OiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyUlQ29weXJpZ2h0OiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyUlQ29weXJpZ2h0OiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyUlQ29weXJpZ2h0OiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorJSVDb3B5cmlnaHQ6IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorJSVDb3B5cmlnaHQ6IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorJSVDb3B5cmlnaHQ6IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyUlQ29weXJpZ2h0OiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyUlQ29weXJpZ2h0OiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvY21hcHMvTldQLUguYmNtYXAgYi9jbWFwcy9OV1AtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM1ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvTldQLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvTldQLVYuYmNtYXAgYi9jbWFwcy9OV1AtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjU3ODVlCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvTldQLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvUktTSi1ILmJjbWFwIGIvY21hcHMvUktTSi1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGQyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9SS1NKLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvUktTSi1WLmJjbWFwIGIvY21hcHMvUktTSi1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTU1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9SS1NKLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvUm9tYW4uYmNtYXAgYi9jbWFwcy9Sb21hbi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODk2ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvUm9tYW4uYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pQ05TLVVDUzItSC5iY21hcCBiL2NtYXBzL1VuaUNOUy1VQ1MyLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkYjI3YwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUNOUy1VQ1MyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pQ05TLVVDUzItVi5iY21hcCBiL2NtYXBzL1VuaUNOUy1VQ1MyLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjOWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUNOUy1VQ1MyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pQ05TLVVURjE2LUguYmNtYXAgYi9jbWFwcy9VbmlDTlMtVVRGMTYtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjFhZmVmCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pQ05TLVVURjE2LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pQ05TLVVURjE2LVYuYmNtYXAgYi9jbWFwcy9VbmlDTlMtVVRGMTYtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjBjZmZlCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pQ05TLVVURjE2LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pQ05TLVVURjMyLUguYmNtYXAgYi9jbWFwcy9VbmlDTlMtVVRGMzItSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWIxOGExCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pQ05TLVVURjMyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pQ05TLVVURjMyLVYuYmNtYXAgYi9jbWFwcy9VbmlDTlMtVVRGMzItVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDE0NjYyCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pQ05TLVVURjMyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pQ05TLVVURjgtSC5iY21hcCBiL2NtYXBzL1VuaUNOUy1VVEY4LUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjNmJkNwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUNOUy1VVEY4LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pQ05TLVVURjgtVi5iY21hcCBiL2NtYXBzL1VuaUNOUy1VVEY4LVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhMjdlNAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUNOUy1VVEY4LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pR0ItVUNTMi1ILmJjbWFwIGIvY21hcHMvVW5pR0ItVUNTMi1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDYyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlHQi1VQ1MyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pR0ItVUNTMi1WLmJjbWFwIGIvY21hcHMvVW5pR0ItVUNTMi1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzUzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlHQi1VQ1MyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pR0ItVVRGMTYtSC5iY21hcCBiL2NtYXBzL1VuaUdCLVVURjE2LUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1MDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUdCLVVURjE2LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pR0ItVVRGMTYtVi5iY21hcCBiL2NtYXBzL1VuaUdCLVVURjE2LVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmMDIzZQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUdCLVVURjE2LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pR0ItVVRGMzItSC5iY21hcCBiL2NtYXBzL1VuaUdCLVVURjMyLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkYmQxNAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUdCLVVURjMyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pR0ItVVRGMzItVi5iY21hcCBiL2NtYXBzL1VuaUdCLVVURjMyLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5YzMwYQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUdCLVVURjMyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pR0ItVVRGOC1ILmJjbWFwIGIvY21hcHMvVW5pR0ItVVRGOC1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmNhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlHQi1VVEY4LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pR0ItVVRGOC1WLmJjbWFwIGIvY21hcHMvVW5pR0ItVVRGOC1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ODAyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlHQi1VVEY4LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVDUzItSC5iY21hcCBiL2NtYXBzL1VuaUpJUy1VQ1MyLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhZjU2YQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJUy1VQ1MyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVDUzItSFctSC5iY21hcCBiL2NtYXBzL1VuaUpJUy1VQ1MyLUhXLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5OTc1YwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJUy1VQ1MyLUhXLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVDUzItSFctVi5iY21hcCBiL2NtYXBzL1VuaUpJUy1VQ1MyLUhXLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhMGExYwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJUy1VQ1MyLUhXLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVDUzItVi5iY21hcCBiL2NtYXBzL1VuaUpJUy1VQ1MyLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwYjlkZAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJUy1VQ1MyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVURjE2LUguYmNtYXAgYi9jbWFwcy9VbmlKSVMtVVRGMTYtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzYxMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pSklTLVVURjE2LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVURjE2LVYuYmNtYXAgYi9jbWFwcy9VbmlKSVMtVVRGMTYtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGJmOTBjCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pSklTLVVURjE2LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVURjMyLUguYmNtYXAgYi9jbWFwcy9VbmlKSVMtVVRGMzItSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTgzZDUzCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pSklTLVVURjMyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVURjMyLVYuYmNtYXAgYi9jbWFwcy9VbmlKSVMtVVRGMzItVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTg3MTM1Ci0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pSklTLVVURjMyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVURjgtSC5iY21hcCBiL2NtYXBzL1VuaUpJUy1VVEY4LUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMzM0YwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJUy1VVEY4LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTLVVURjgtVi5iY21hcCBiL2NtYXBzL1VuaUpJUy1VVEY4LVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4YTk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJUy1VVEY4LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTMjAwNC1VVEYxNi1ILmJjbWFwIGIvY21hcHMvVW5pSklTMjAwNC1VVEYxNi1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NjhiZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlKSVMyMDA0LVVURjE2LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTMjAwNC1VVEYxNi1WLmJjbWFwIGIvY21hcHMvVW5pSklTMjAwNC1VVEYxNi1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWJmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlKSVMyMDA0LVVURjE2LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTMjAwNC1VVEYzMi1ILmJjbWFwIGIvY21hcHMvVW5pSklTMjAwNC1VVEYzMi1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZWVlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlKSVMyMDA0LVVURjMyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTMjAwNC1VVEYzMi1WLmJjbWFwIGIvY21hcHMvVW5pSklTMjAwNC1VVEYzMi1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTQ2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlKSVMyMDA0LVVURjMyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTMjAwNC1VVEY4LUguYmNtYXAgYi9jbWFwcy9VbmlKSVMyMDA0LVVURjgtSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFhNjRmCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pSklTMjAwNC1VVEY4LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTMjAwNC1VVEY4LVYuYmNtYXAgYi9jbWFwcy9VbmlKSVMyMDA0LVVURjgtVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRhYTllCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pSklTMjAwNC1VVEY4LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTUHJvLVVDUzItSFctVi5iY21hcCBiL2NtYXBzL1VuaUpJU1Byby1VQ1MyLUhXLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzZjkyMQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJU1Byby1VQ1MyLUhXLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTUHJvLVVDUzItVi5iY21hcCBiL2NtYXBzL1VuaUpJU1Byby1VQ1MyLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0OGY2NwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJU1Byby1VQ1MyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTUHJvLVVURjgtVi5iY21hcCBiL2NtYXBzL1VuaUpJU1Byby1VVEY4LVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0OWQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJU1Byby1VVEY4LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTWDAyMTMtVVRGMzItSC5iY21hcCBiL2NtYXBzL1VuaUpJU1gwMjEzLVVURjMyLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzYTY3NwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJU1gwMjEzLVVURjMyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTWDAyMTMtVVRGMzItVi5iY21hcCBiL2NtYXBzL1VuaUpJU1gwMjEzLVVURjMyLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyNzI0OAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUpJU1gwMjEzLVVURjMyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTWDAyMTMyMDA0LVVURjMyLUguYmNtYXAgYi9jbWFwcy9VbmlKSVNYMDIxMzIwMDQtVVRGMzItSC5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWE5ODhkCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pSklTWDAyMTMyMDA0LVVURjMyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pSklTWDAyMTMyMDA0LVVURjMyLVYuYmNtYXAgYi9jbWFwcy9VbmlKSVNYMDIxMzIwMDQtVVRGMzItVi5iY21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UwNTRhCi0tLSAvZGV2L251bGwKKysrIGIvY21hcHMvVW5pSklTWDAyMTMyMDA0LVVURjMyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pS1MtVUNTMi1ILmJjbWFwIGIvY21hcHMvVW5pS1MtVUNTMi1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Yjk0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlLUy1VQ1MyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pS1MtVUNTMi1WLmJjbWFwIGIvY21hcHMvVW5pS1MtVUNTMi1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNmFkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlLUy1VQ1MyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pS1MtVVRGMTYtSC5iY21hcCBiL2NtYXBzL1VuaUtTLVVURjE2LUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0ZTY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUtTLVVURjE2LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pS1MtVVRGMTYtVi5iY21hcCBiL2NtYXBzL1VuaUtTLVVURjE2LVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1ZWZiNwotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUtTLVVURjE2LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pS1MtVVRGMzItSC5iY21hcCBiL2NtYXBzL1VuaUtTLVVURjMyLUguYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5ZDIxNAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUtTLVVURjMyLUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pS1MtVVRGMzItVi5iY21hcCBiL2NtYXBzL1VuaUtTLVVURjMyLVYuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhYjIwOAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1VuaUtTLVVURjMyLVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pS1MtVVRGOC1ILmJjbWFwIGIvY21hcHMvVW5pS1MtVVRGOC1ILmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjg2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlLUy1VVEY4LUguYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVW5pS1MtVVRGOC1WLmJjbWFwIGIvY21hcHMvVW5pS1MtVVRGOC1WLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmE3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9VbmlLUy1VVEY4LVYuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvVi5iY21hcCBiL2NtYXBzL1YuYmNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlYzk5MAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXBzL1YuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY21hcHMvV1AtU3ltYm9sLmJjbWFwIGIvY21hcHMvV1AtU3ltYm9sLmJjbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NzI5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFwcy9XUC1TeW1ib2wuYmNtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXM1L2J1aWxkL3BkZi5qcyBiL2VzNS9idWlsZC9wZGYuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmZGEzNwotLS0gL2Rldi9udWxsCisrKyBiL2VzNS9idWlsZC9wZGYuanMKQEAgLTAsMCArMSwyNjY2NSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworCisoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgeworCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKKwkJbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CisJZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCisJCWRlZmluZSgicGRmanMtZGlzdC9idWlsZC9wZGYiLCBbXSwgZmFjdG9yeSk7CisJZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpCisJCWV4cG9ydHNbInBkZmpzLWRpc3QvYnVpbGQvcGRmIl0gPSBmYWN0b3J5KCk7CisJZWxzZQorCQlyb290WyJwZGZqcy1kaXN0L2J1aWxkL3BkZiJdID0gcm9vdC5wZGZqc0xpYiA9IGZhY3RvcnkoKTsKK30pKHRoaXMsIGZ1bmN0aW9uKCkgeworcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKKy8qKioqKiovIAkvLyBUaGUgbW9kdWxlIGNhY2hlCisvKioqKioqLyAJdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KKy8qKioqKiovIAlmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CisvKioqKioqLworLyoqKioqKi8gCQkvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKKy8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHsKKy8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOworLyoqKioqKi8gCQl9CisvKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCisvKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKKy8qKioqKiovIAkJCWk6IG1vZHVsZUlkLAorLyoqKioqKi8gCQkJbDogZmFsc2UsCisvKioqKioqLyAJCQlleHBvcnRzOiB7fQorLyoqKioqKi8gCQl9OworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCisvKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pOworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZAorLyoqKioqKi8gCQltb2R1bGUubCA9IHRydWU7CisvKioqKioqLworLyoqKioqKi8gCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQorLyoqKioqKi8gCQlyZXR1cm4gbW9kdWxlLmV4cG9ydHM7CisvKioqKioqLyAJfQorLyoqKioqKi8KKy8qKioqKiovCisvKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXykKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm0gPSBtb2R1bGVzOworLyoqKioqKi8KKy8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7CisvKioqKioqLworLyoqKioqKi8gCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0cworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikgeworLyoqKioqKi8gCQlpZighX193X3BkZmpzX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7CisvKioqKioqLyAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTsKKy8qKioqKiovIAkJfQorLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7CisvKioqKioqLyAJCWlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykgeworLyoqKioqKi8gCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7CisvKioqKioqLyAJCX0KKy8qKioqKiovIAkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3QKKy8qKioqKiovIAkvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXQKKy8qKioqKiovIAkvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnMKKy8qKioqKiovIAkvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3QKKy8qKioqKiovIAkvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHsKKy8qKioqKiovIAkJaWYobW9kZSAmIDEpIHZhbHVlID0gX193X3BkZmpzX3JlcXVpcmVfXyh2YWx1ZSk7CisvKioqKioqLyAJCWlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7CisvKioqKioqLyAJCWlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7CisvKioqKioqLyAJCXZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisvKioqKioqLyAJCV9fd19wZGZqc19yZXF1aXJlX18ucihucyk7CisvKioqKioqLyAJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTsKKy8qKioqKiovIAkJaWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193X3BkZmpzX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpOworLyoqKioqKi8gCQlyZXR1cm4gbnM7CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHsKKy8qKioqKiovIAkJdmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/CisvKioqKioqLyAJCQlmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOgorLyoqKioqKi8gCQkJZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTsKKy8qKioqKiovIAkJX193X3BkZmpzX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpOworLyoqKioqKi8gCQlyZXR1cm4gZ2V0dGVyOworLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbAorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX18KKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLnAgPSAiIjsKKy8qKioqKiovCisvKioqKioqLworLyoqKioqKi8gCS8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0cworLyoqKioqKi8gCXJldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucyA9IDApOworLyoqKioqKi8gfSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqLyAoWworLyogMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImFkZExpbmtBdHRyaWJ1dGVzIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuYWRkTGlua0F0dHJpYnV0ZXM7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJnZXRGaWxlbmFtZUZyb21VcmwiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfZGlzcGxheV91dGlscy5nZXRGaWxlbmFtZUZyb21Vcmw7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJMaW5rVGFyZ2V0IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuTGlua1RhcmdldDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImxvYWRTY3JpcHQiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfZGlzcGxheV91dGlscy5sb2FkU2NyaXB0OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGRGF0ZVN0cmluZyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLlBERkRhdGVTdHJpbmc7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24iLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfZGlzcGxheV91dGlscy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb247CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJidWlsZCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9hcGkuYnVpbGQ7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJnZXREb2N1bWVudCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9hcGkuZ2V0RG9jdW1lbnQ7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJMb29wYmFja1BvcnQiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfYXBpLkxvb3BiYWNrUG9ydDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERkRhdGFSYW5nZVRyYW5zcG9ydCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9hcGkuUERGRGF0YVJhbmdlVHJhbnNwb3J0OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGV29ya2VyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX2FwaS5QREZXb3JrZXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJ2ZXJzaW9uIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX2FwaS52ZXJzaW9uOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiQ01hcENvbXByZXNzaW9uVHlwZSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGU7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJjcmVhdGVPYmplY3RVUkwiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdXRpbC5jcmVhdGVPYmplY3RVUkw7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJJbnZhbGlkUERGRXhjZXB0aW9uIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3V0aWwuSW52YWxpZFBERkV4Y2VwdGlvbjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIk1pc3NpbmdQREZFeGNlcHRpb24iLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiT1BTIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3V0aWwuT1BTOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUGFzc3dvcmRSZXNwb25zZXMiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdXRpbC5QYXNzd29yZFJlc3BvbnNlczsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBlcm1pc3Npb25GbGFnIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3V0aWwuUGVybWlzc2lvbkZsYWc7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJyZW1vdmVOdWxsQ2hhcmFjdGVycyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF91dGlsLnJlbW92ZU51bGxDaGFyYWN0ZXJzOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAic2hhZG93IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3V0aWwuc2hhZG93OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiVU5TVVBQT1JURURfRkVBVFVSRVMiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUzsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlV0aWwiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdXRpbC5VdGlsOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiVmVyYm9zaXR5TGV2ZWwiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdXRpbC5WZXJib3NpdHlMZXZlbDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkFubm90YXRpb25MYXllciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9hbm5vdGF0aW9uX2xheWVyLkFubm90YXRpb25MYXllcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImFwaUNvbXBhdGliaWxpdHlQYXJhbXMiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfYXBpX2NvbXBhdGliaWxpdHkuYXBpQ29tcGF0aWJpbGl0eVBhcmFtczsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkdsb2JhbFdvcmtlck9wdGlvbnMiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfd29ya2VyX29wdGlvbnMuR2xvYmFsV29ya2VyT3B0aW9uczsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgInJlbmRlclRleHRMYXllciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF90ZXh0X2xheWVyLnJlbmRlclRleHRMYXllcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlNWR0dyYXBoaWNzIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3N2Zy5TVkdHcmFwaGljczsKKyAgfQorfSk7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfYXBpID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDIpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2Fubm90YXRpb25fbGF5ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxNik7CisKK3ZhciBfYXBpX2NvbXBhdGliaWxpdHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNik7CisKK3ZhciBfd29ya2VyX29wdGlvbnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOSk7CisKK3ZhciBfdGV4dF9sYXllciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjE3KTsKKwordmFyIF9zdmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxOCk7CisKK3ZhciBwZGZqc1ZlcnNpb24gPSAnMi42LjM0Nyc7Cit2YXIgcGRmanNCdWlsZCA9ICczYmU5YzY1Zic7Cit7CisgIHZhciBfcmVxdWlyZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyksCisgICAgICBpc05vZGVKUyA9IF9yZXF1aXJlLmlzTm9kZUpTOworCisgIGlmIChpc05vZGVKUykgeworICAgIHZhciBQREZOb2RlU3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTkpLlBERk5vZGVTdHJlYW07CisKKyAgICAoMCwgX2FwaS5zZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeSkoZnVuY3Rpb24gKHBhcmFtcykgeworICAgICAgcmV0dXJuIG5ldyBQREZOb2RlU3RyZWFtKHBhcmFtcyk7CisgICAgfSk7CisgIH0gZWxzZSB7CisgICAgdmFyIFBERk5ldHdvcmtTdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyMikuUERGTmV0d29ya1N0cmVhbTsKKworICAgIHZhciBQREZGZXRjaFN0cmVhbTsKKworICAgIGlmICgoMCwgX2Rpc3BsYXlfdXRpbHMuaXNGZXRjaFN1cHBvcnRlZCkoKSkgeworICAgICAgUERGRmV0Y2hTdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyMykuUERGRmV0Y2hTdHJlYW07CisgICAgfQorCisgICAgKDAsIF9hcGkuc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkpKGZ1bmN0aW9uIChwYXJhbXMpIHsKKyAgICAgIGlmIChQREZGZXRjaFN0cmVhbSAmJiAoMCwgX2Rpc3BsYXlfdXRpbHMuaXNWYWxpZEZldGNoVXJsKShwYXJhbXMudXJsKSkgeworICAgICAgICByZXR1cm4gbmV3IFBERkZldGNoU3RyZWFtKHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgUERGTmV0d29ya1N0cmVhbShwYXJhbXMpOworICAgIH0pOworICB9Cit9CisKKy8qKiovIH0pLAorLyogMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmFkZExpbmtBdHRyaWJ1dGVzID0gYWRkTGlua0F0dHJpYnV0ZXM7CitleHBvcnRzLmdldEZpbGVuYW1lRnJvbVVybCA9IGdldEZpbGVuYW1lRnJvbVVybDsKK2V4cG9ydHMuaXNGZXRjaFN1cHBvcnRlZCA9IGlzRmV0Y2hTdXBwb3J0ZWQ7CitleHBvcnRzLmlzVmFsaWRGZXRjaFVybCA9IGlzVmFsaWRGZXRjaFVybDsKK2V4cG9ydHMubG9hZFNjcmlwdCA9IGxvYWRTY3JpcHQ7CitleHBvcnRzLmRlcHJlY2F0ZWQgPSBkZXByZWNhdGVkOworZXhwb3J0cy5QREZEYXRlU3RyaW5nID0gZXhwb3J0cy5TdGF0VGltZXIgPSBleHBvcnRzLkRPTVNWR0ZhY3RvcnkgPSBleHBvcnRzLkRPTUNNYXBSZWFkZXJGYWN0b3J5ID0gZXhwb3J0cy5CYXNlQ01hcFJlYWRlckZhY3RvcnkgPSBleHBvcnRzLkRPTUNhbnZhc0ZhY3RvcnkgPSBleHBvcnRzLkJhc2VDYW52YXNGYWN0b3J5ID0gZXhwb3J0cy5ERUZBVUxUX0xJTktfUkVMID0gZXhwb3J0cy5MaW5rVGFyZ2V0ID0gZXhwb3J0cy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24gPSBleHBvcnRzLlBhZ2VWaWV3cG9ydCA9IHZvaWQgMDsKKwordmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXygyKSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIERFRkFVTFRfTElOS19SRUwgPSAibm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdyI7CitleHBvcnRzLkRFRkFVTFRfTElOS19SRUwgPSBERUZBVUxUX0xJTktfUkVMOwordmFyIFNWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CisKK3ZhciBCYXNlQ2FudmFzRmFjdG9yeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEJhc2VDYW52YXNGYWN0b3J5KCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCYXNlQ2FudmFzRmFjdG9yeSk7CisKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNhbnZhc0ZhY3RvcnkpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDYW52YXNGYWN0b3J5LiIpOworICAgIH0KKyAgfQorCisgIF9jcmVhdGVDbGFzcyhCYXNlQ2FudmFzRmFjdG9yeSwgW3sKKyAgICBrZXk6ICJjcmVhdGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUod2lkdGgsIGhlaWdodCkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBjcmVhdGVgIGNhbGxlZC4iKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZXNldCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KGNhbnZhc0FuZENvbnRleHQsIHdpZHRoLCBoZWlnaHQpIHsKKyAgICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW52YXMgaXMgbm90IHNwZWNpZmllZCIpOworICAgICAgfQorCisgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FudmFzIHNpemUiKTsKKyAgICAgIH0KKworICAgICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSB3aWR0aDsKKyAgICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IGhlaWdodDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJkZXN0cm95IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveShjYW52YXNBbmRDb250ZXh0KSB7CisgICAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgIH0KKworICAgICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSAwOworICAgICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gMDsKKyAgICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzID0gbnVsbDsKKyAgICAgIGNhbnZhc0FuZENvbnRleHQuY29udGV4dCA9IG51bGw7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEJhc2VDYW52YXNGYWN0b3J5OworfSgpOworCitleHBvcnRzLkJhc2VDYW52YXNGYWN0b3J5ID0gQmFzZUNhbnZhc0ZhY3Rvcnk7CisKK3ZhciBET01DYW52YXNGYWN0b3J5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUNhbnZhc0ZhY3RvcnkpIHsKKyAgX2luaGVyaXRzKERPTUNhbnZhc0ZhY3RvcnksIF9CYXNlQ2FudmFzRmFjdG9yeSk7CisKKyAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihET01DYW52YXNGYWN0b3J5KTsKKworICBmdW5jdGlvbiBET01DYW52YXNGYWN0b3J5KCkgeworICAgIHZhciBfdGhpczsKKworICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSwKKyAgICAgICAgX3JlZiRvd25lckRvY3VtZW50ID0gX3JlZi5vd25lckRvY3VtZW50LAorICAgICAgICBvd25lckRvY3VtZW50ID0gX3JlZiRvd25lckRvY3VtZW50ID09PSB2b2lkIDAgPyBnbG9iYWxUaGlzLmRvY3VtZW50IDogX3JlZiRvd25lckRvY3VtZW50OworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERPTUNhbnZhc0ZhY3RvcnkpOworCisgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKKyAgICBfdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50OworICAgIHJldHVybiBfdGhpczsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhET01DYW52YXNGYWN0b3J5LCBbeworICAgIGtleTogImNyZWF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7CisgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FudmFzIHNpemUiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworCisgICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOworICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7CisgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgcmV0dXJuIHsKKyAgICAgICAgY2FudmFzOiBjYW52YXMsCisgICAgICAgIGNvbnRleHQ6IGNvbnRleHQKKyAgICAgIH07CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIERPTUNhbnZhc0ZhY3Rvcnk7Cit9KEJhc2VDYW52YXNGYWN0b3J5KTsKKworZXhwb3J0cy5ET01DYW52YXNGYWN0b3J5ID0gRE9NQ2FudmFzRmFjdG9yeTsKKwordmFyIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEJhc2VDTWFwUmVhZGVyRmFjdG9yeShfcmVmMikgeworICAgIHZhciBfcmVmMiRiYXNlVXJsID0gX3JlZjIuYmFzZVVybCwKKyAgICAgICAgYmFzZVVybCA9IF9yZWYyJGJhc2VVcmwgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRiYXNlVXJsLAorICAgICAgICBfcmVmMiRpc0NvbXByZXNzZWQgPSBfcmVmMi5pc0NvbXByZXNzZWQsCisgICAgICAgIGlzQ29tcHJlc3NlZCA9IF9yZWYyJGlzQ29tcHJlc3NlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiRpc0NvbXByZXNzZWQ7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmFzZUNNYXBSZWFkZXJGYWN0b3J5KTsKKworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ01hcFJlYWRlckZhY3RvcnkpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS4iKTsKKyAgICB9CisKKyAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsOworICAgIHRoaXMuaXNDb21wcmVzc2VkID0gaXNDb21wcmVzc2VkOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEJhc2VDTWFwUmVhZGVyRmFjdG9yeSwgW3sKKyAgICBrZXk6ICJmZXRjaCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfZmV0Y2ggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShfcmVmMykgeworICAgICAgICB2YXIgX3RoaXMyID0gdGhpczsKKworICAgICAgICB2YXIgbmFtZSwgdXJsLCBjb21wcmVzc2lvblR5cGU7CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG5hbWUgPSBfcmVmMy5uYW1lOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFzZVVybCkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwICJiYXNlVXJsIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgKyAndGhlICJjTWFwVXJsIiBhbmQgImNNYXBQYWNrZWQiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nKTsKKworICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDTWFwIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIik7CisKKyAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuYmFzZVVybCArIG5hbWUgKyAodGhpcy5pc0NvbXByZXNzZWQgPyAiLmJjbWFwIiA6ICIiKTsKKyAgICAgICAgICAgICAgICBjb21wcmVzc2lvblR5cGUgPSB0aGlzLmlzQ29tcHJlc3NlZCA/IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZIDogX3V0aWwuQ01hcENvbXByZXNzaW9uVHlwZS5OT05FOworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHRoaXMuX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSlbImNhdGNoIl0oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gbG9hZCAiLmNvbmNhdChfdGhpczIuaXNDb21wcmVzc2VkID8gImJpbmFyeSAiIDogIiIsICJDTWFwIGF0OiAiKS5jb25jYXQodXJsKSk7CisgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIGZldGNoKF94KSB7CisgICAgICAgIHJldHVybiBfZmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZldGNoOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiX2ZldGNoRGF0YSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLiIpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBCYXNlQ01hcFJlYWRlckZhY3Rvcnk7Cit9KCk7CisKK2V4cG9ydHMuQmFzZUNNYXBSZWFkZXJGYWN0b3J5ID0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5OworCit2YXIgRE9NQ01hcFJlYWRlckZhY3RvcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlQ01hcFJlYWRlckZhY3RvcikgeworICBfaW5oZXJpdHMoRE9NQ01hcFJlYWRlckZhY3RvcnksIF9CYXNlQ01hcFJlYWRlckZhY3Rvcik7CisKKyAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoRE9NQ01hcFJlYWRlckZhY3RvcnkpOworCisgIGZ1bmN0aW9uIERPTUNNYXBSZWFkZXJGYWN0b3J5KCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBET01DTWFwUmVhZGVyRmFjdG9yeSk7CisKKyAgICByZXR1cm4gX3N1cGVyMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKERPTUNNYXBSZWFkZXJGYWN0b3J5LCBbeworICAgIGtleTogIl9mZXRjaERhdGEiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7CisgICAgICB2YXIgX3RoaXMzID0gdGhpczsKKworICAgICAgaWYgKGlzRmV0Y2hTdXBwb3J0ZWQoKSAmJiBpc1ZhbGlkRmV0Y2hVcmwodXJsLCBkb2N1bWVudC5iYXNlVVJJKSkgeworICAgICAgICByZXR1cm4gZmV0Y2godXJsKS50aGVuKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICAgICAgICAgIHZhciBfcmVmNCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMihyZXNwb25zZSkgeworICAgICAgICAgICAgdmFyIGNNYXBEYXRhOworICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgeworICAgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgeworICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHsKKyAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfdGhpczMuaXNDb21wcmVzc2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IFVpbnQ4QXJyYXk7CisgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQxID0gX2NvbnRleHQyLnNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGNNYXBEYXRhID0gbmV3IF9jb250ZXh0Mi50MChfY29udGV4dDIudDEpOworICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE1OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQyID0gX3V0aWwuc3RyaW5nVG9CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTsKKworICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQzID0gX2NvbnRleHQyLnNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGNNYXBEYXRhID0gKDAsIF9jb250ZXh0Mi50MikoX2NvbnRleHQyLnQzKTsKKworICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgICAgICBjTWFwRGF0YTogY01hcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25UeXBlOiBjb21wcmVzc2lvblR5cGUKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIF9jYWxsZWUyKTsKKyAgICAgICAgICB9KSk7CisKKyAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94MikgeworICAgICAgICAgICAgcmV0dXJuIF9yZWY0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgICAgfTsKKyAgICAgICAgfSgpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgICAgICAgcmVxdWVzdC5vcGVuKCJHRVQiLCB1cmwsIHRydWUpOworCisgICAgICAgIGlmIChfdGhpczMuaXNDb21wcmVzc2VkKSB7CisgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOworICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwIHx8IHJlcXVlc3Quc3RhdHVzID09PSAwKSB7CisgICAgICAgICAgICB2YXIgY01hcERhdGE7CisKKyAgICAgICAgICAgIGlmIChfdGhpczMuaXNDb21wcmVzc2VkICYmIHJlcXVlc3QucmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgY01hcERhdGEgPSBuZXcgVWludDhBcnJheShyZXF1ZXN0LnJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIV90aGlzMy5pc0NvbXByZXNzZWQgJiYgcmVxdWVzdC5yZXNwb25zZVRleHQpIHsKKyAgICAgICAgICAgICAgY01hcERhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykocmVxdWVzdC5yZXNwb25zZVRleHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY01hcERhdGEpIHsKKyAgICAgICAgICAgICAgcmVzb2x2ZSh7CisgICAgICAgICAgICAgICAgY01hcERhdGE6IGNNYXBEYXRhLAorICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZTogY29tcHJlc3Npb25UeXBlCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXF1ZXN0LnN0YXR1c1RleHQpKTsKKyAgICAgICAgfTsKKworICAgICAgICByZXF1ZXN0LnNlbmQobnVsbCk7CisgICAgICB9KTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gRE9NQ01hcFJlYWRlckZhY3Rvcnk7Cit9KEJhc2VDTWFwUmVhZGVyRmFjdG9yeSk7CisKK2V4cG9ydHMuRE9NQ01hcFJlYWRlckZhY3RvcnkgPSBET01DTWFwUmVhZGVyRmFjdG9yeTsKKwordmFyIERPTVNWR0ZhY3RvcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBET01TVkdGYWN0b3J5KCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBET01TVkdGYWN0b3J5KTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhET01TVkdGYWN0b3J5LCBbeworICAgIGtleTogImNyZWF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7CisgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCwgIkludmFsaWQgU1ZHIGRpbWVuc2lvbnMiKTsKKyAgICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCAic3ZnOnN2ZyIpOworICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgidmVyc2lvbiIsICIxLjEiKTsKKyAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGggKyAicHgiKTsKKyAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIGhlaWdodCArICJweCIpOworICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgicHJlc2VydmVBc3BlY3RSYXRpbyIsICJub25lIik7CisgICAgICBzdmcuc2V0QXR0cmlidXRlKCJ2aWV3Qm94IiwgIjAgMCAiICsgd2lkdGggKyAiICIgKyBoZWlnaHQpOworICAgICAgcmV0dXJuIHN2ZzsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjcmVhdGVFbGVtZW50IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlKSB7CisgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0eXBlb2YgdHlwZSA9PT0gInN0cmluZyIsICJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGUiKTsKKyAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCB0eXBlKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gRE9NU1ZHRmFjdG9yeTsKK30oKTsKKworZXhwb3J0cy5ET01TVkdGYWN0b3J5ID0gRE9NU1ZHRmFjdG9yeTsKKwordmFyIFBhZ2VWaWV3cG9ydCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBhZ2VWaWV3cG9ydChfcmVmNSkgeworICAgIHZhciB2aWV3Qm94ID0gX3JlZjUudmlld0JveCwKKyAgICAgICAgc2NhbGUgPSBfcmVmNS5zY2FsZSwKKyAgICAgICAgcm90YXRpb24gPSBfcmVmNS5yb3RhdGlvbiwKKyAgICAgICAgX3JlZjUkb2Zmc2V0WCA9IF9yZWY1Lm9mZnNldFgsCisgICAgICAgIG9mZnNldFggPSBfcmVmNSRvZmZzZXRYID09PSB2b2lkIDAgPyAwIDogX3JlZjUkb2Zmc2V0WCwKKyAgICAgICAgX3JlZjUkb2Zmc2V0WSA9IF9yZWY1Lm9mZnNldFksCisgICAgICAgIG9mZnNldFkgPSBfcmVmNSRvZmZzZXRZID09PSB2b2lkIDAgPyAwIDogX3JlZjUkb2Zmc2V0WSwKKyAgICAgICAgX3JlZjUkZG9udEZsaXAgPSBfcmVmNS5kb250RmxpcCwKKyAgICAgICAgZG9udEZsaXAgPSBfcmVmNSRkb250RmxpcCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNSRkb250RmxpcDsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYWdlVmlld3BvcnQpOworCisgICAgdGhpcy52aWV3Qm94ID0gdmlld0JveDsKKyAgICB0aGlzLnNjYWxlID0gc2NhbGU7CisgICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uOworICAgIHRoaXMub2Zmc2V0WCA9IG9mZnNldFg7CisgICAgdGhpcy5vZmZzZXRZID0gb2Zmc2V0WTsKKyAgICB2YXIgY2VudGVyWCA9ICh2aWV3Qm94WzJdICsgdmlld0JveFswXSkgLyAyOworICAgIHZhciBjZW50ZXJZID0gKHZpZXdCb3hbM10gKyB2aWV3Qm94WzFdKSAvIDI7CisgICAgdmFyIHJvdGF0ZUEsIHJvdGF0ZUIsIHJvdGF0ZUMsIHJvdGF0ZUQ7CisgICAgcm90YXRpb24gPSByb3RhdGlvbiAlIDM2MDsKKyAgICByb3RhdGlvbiA9IHJvdGF0aW9uIDwgMCA/IHJvdGF0aW9uICsgMzYwIDogcm90YXRpb247CisKKyAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CisgICAgICBjYXNlIDE4MDoKKyAgICAgICAgcm90YXRlQSA9IC0xOworICAgICAgICByb3RhdGVCID0gMDsKKyAgICAgICAgcm90YXRlQyA9IDA7CisgICAgICAgIHJvdGF0ZUQgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA5MDoKKyAgICAgICAgcm90YXRlQSA9IDA7CisgICAgICAgIHJvdGF0ZUIgPSAxOworICAgICAgICByb3RhdGVDID0gMTsKKyAgICAgICAgcm90YXRlRCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI3MDoKKyAgICAgICAgcm90YXRlQSA9IDA7CisgICAgICAgIHJvdGF0ZUIgPSAtMTsKKyAgICAgICAgcm90YXRlQyA9IC0xOworICAgICAgICByb3RhdGVEID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcm90YXRlQSA9IDE7CisgICAgICAgIHJvdGF0ZUIgPSAwOworICAgICAgICByb3RhdGVDID0gMDsKKyAgICAgICAgcm90YXRlRCA9IC0xOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLiIpOworICAgIH0KKworICAgIGlmIChkb250RmxpcCkgeworICAgICAgcm90YXRlQyA9IC1yb3RhdGVDOworICAgICAgcm90YXRlRCA9IC1yb3RhdGVEOworICAgIH0KKworICAgIHZhciBvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZOworICAgIHZhciB3aWR0aCwgaGVpZ2h0OworCisgICAgaWYgKHJvdGF0ZUEgPT09IDApIHsKKyAgICAgIG9mZnNldENhbnZhc1ggPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFg7CisgICAgICBvZmZzZXRDYW52YXNZID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRZOworICAgICAgd2lkdGggPSBNYXRoLmFicyh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTsKKyAgICAgIGhlaWdodCA9IE1hdGguYWJzKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlOworICAgIH0gZWxzZSB7CisgICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRYOworICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclkgLSB2aWV3Qm94WzFdKSAqIHNjYWxlICsgb2Zmc2V0WTsKKyAgICAgIHdpZHRoID0gTWF0aC5hYnModmlld0JveFsyXSAtIHZpZXdCb3hbMF0pICogc2NhbGU7CisgICAgICBoZWlnaHQgPSBNYXRoLmFicyh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTsKKyAgICB9CisKKyAgICB0aGlzLnRyYW5zZm9ybSA9IFtyb3RhdGVBICogc2NhbGUsIHJvdGF0ZUIgKiBzY2FsZSwgcm90YXRlQyAqIHNjYWxlLCByb3RhdGVEICogc2NhbGUsIG9mZnNldENhbnZhc1ggLSByb3RhdGVBICogc2NhbGUgKiBjZW50ZXJYIC0gcm90YXRlQyAqIHNjYWxlICogY2VudGVyWSwgb2Zmc2V0Q2FudmFzWSAtIHJvdGF0ZUIgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVEICogc2NhbGUgKiBjZW50ZXJZXTsKKyAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUGFnZVZpZXdwb3J0LCBbeworICAgIGtleTogImNsb25lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoKSB7CisgICAgICB2YXIgX3JlZjYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LAorICAgICAgICAgIF9yZWY2JHNjYWxlID0gX3JlZjYuc2NhbGUsCisgICAgICAgICAgc2NhbGUgPSBfcmVmNiRzY2FsZSA9PT0gdm9pZCAwID8gdGhpcy5zY2FsZSA6IF9yZWY2JHNjYWxlLAorICAgICAgICAgIF9yZWY2JHJvdGF0aW9uID0gX3JlZjYucm90YXRpb24sCisgICAgICAgICAgcm90YXRpb24gPSBfcmVmNiRyb3RhdGlvbiA9PT0gdm9pZCAwID8gdGhpcy5yb3RhdGlvbiA6IF9yZWY2JHJvdGF0aW9uLAorICAgICAgICAgIF9yZWY2JG9mZnNldFggPSBfcmVmNi5vZmZzZXRYLAorICAgICAgICAgIG9mZnNldFggPSBfcmVmNiRvZmZzZXRYID09PSB2b2lkIDAgPyB0aGlzLm9mZnNldFggOiBfcmVmNiRvZmZzZXRYLAorICAgICAgICAgIF9yZWY2JG9mZnNldFkgPSBfcmVmNi5vZmZzZXRZLAorICAgICAgICAgIG9mZnNldFkgPSBfcmVmNiRvZmZzZXRZID09PSB2b2lkIDAgPyB0aGlzLm9mZnNldFkgOiBfcmVmNiRvZmZzZXRZLAorICAgICAgICAgIF9yZWY2JGRvbnRGbGlwID0gX3JlZjYuZG9udEZsaXAsCisgICAgICAgICAgZG9udEZsaXAgPSBfcmVmNiRkb250RmxpcCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRkb250RmxpcDsKKworICAgICAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoeworICAgICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSwKKyAgICAgICAgc2NhbGU6IHNjYWxlLAorICAgICAgICByb3RhdGlvbjogcm90YXRpb24sCisgICAgICAgIG9mZnNldFg6IG9mZnNldFgsCisgICAgICAgIG9mZnNldFk6IG9mZnNldFksCisgICAgICAgIGRvbnRGbGlwOiBkb250RmxpcAorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29udmVydFRvVmlld3BvcnRQb2ludCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCwgeSkgeworICAgICAgcmV0dXJuIF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29udmVydFRvVmlld3BvcnRSZWN0YW5nbGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZShyZWN0KSB7CisgICAgICB2YXIgdG9wTGVmdCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMF0sIHJlY3RbMV1dLCB0aGlzLnRyYW5zZm9ybSk7CisKKyAgICAgIHZhciBib3R0b21SaWdodCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMl0sIHJlY3RbM11dLCB0aGlzLnRyYW5zZm9ybSk7CisKKyAgICAgIHJldHVybiBbdG9wTGVmdFswXSwgdG9wTGVmdFsxXSwgYm90dG9tUmlnaHRbMF0sIGJvdHRvbVJpZ2h0WzFdXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjb252ZXJ0VG9QZGZQb2ludCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnZlcnRUb1BkZlBvaW50KHgsIHkpIHsKKyAgICAgIHJldHVybiBfdXRpbC5VdGlsLmFwcGx5SW52ZXJzZVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUGFnZVZpZXdwb3J0OworfSgpOworCitleHBvcnRzLlBhZ2VWaWV3cG9ydCA9IFBhZ2VWaWV3cG9ydDsKKwordmFyIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24pIHsKKyAgX2luaGVyaXRzKFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24pOworCisgIHZhciBfc3VwZXIzID0gX2NyZWF0ZVN1cGVyKFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbik7CisKKyAgZnVuY3Rpb24gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKG1zZywgdHlwZSkgeworICAgIHZhciBfdGhpczQ7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKTsKKworICAgIF90aGlzNCA9IF9zdXBlcjMuY2FsbCh0aGlzLCBtc2cpOworICAgIF90aGlzNC50eXBlID0gdHlwZTsKKyAgICByZXR1cm4gX3RoaXM0OworICB9CisKKyAgcmV0dXJuIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbjsKK30oX3V0aWwuQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uOwordmFyIExpbmtUYXJnZXQgPSB7CisgIE5PTkU6IDAsCisgIFNFTEY6IDEsCisgIEJMQU5LOiAyLAorICBQQVJFTlQ6IDMsCisgIFRPUDogNAorfTsKK2V4cG9ydHMuTGlua1RhcmdldCA9IExpbmtUYXJnZXQ7CisKK2Z1bmN0aW9uIGFkZExpbmtBdHRyaWJ1dGVzKGxpbmspIHsKKyAgdmFyIF9yZWY3ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSwKKyAgICAgIHVybCA9IF9yZWY3LnVybCwKKyAgICAgIHRhcmdldCA9IF9yZWY3LnRhcmdldCwKKyAgICAgIHJlbCA9IF9yZWY3LnJlbCwKKyAgICAgIF9yZWY3JGVuYWJsZWQgPSBfcmVmNy5lbmFibGVkLAorICAgICAgZW5hYmxlZCA9IF9yZWY3JGVuYWJsZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmNyRlbmFibGVkOworCisgICgwLCBfdXRpbC5hc3NlcnQpKHVybCAmJiB0eXBlb2YgdXJsID09PSAic3RyaW5nIiwgJ2FkZExpbmtBdHRyaWJ1dGVzOiBBIHZhbGlkICJ1cmwiIHBhcmFtZXRlciBtdXN0IHByb3ZpZGVkLicpOworICB2YXIgdXJsTnVsbFJlbW92ZWQgPSAoMCwgX3V0aWwucmVtb3ZlTnVsbENoYXJhY3RlcnMpKHVybCk7CisKKyAgaWYgKGVuYWJsZWQpIHsKKyAgICBsaW5rLmhyZWYgPSBsaW5rLnRpdGxlID0gdXJsTnVsbFJlbW92ZWQ7CisgIH0gZWxzZSB7CisgICAgbGluay5ocmVmID0gIiI7CisgICAgbGluay50aXRsZSA9ICJEaXNhYmxlZDogIi5jb25jYXQodXJsTnVsbFJlbW92ZWQpOworCisgICAgbGluay5vbmNsaWNrID0gZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisgIH0KKworICB2YXIgdGFyZ2V0U3RyID0gIiI7CisKKyAgc3dpdGNoICh0YXJnZXQpIHsKKyAgICBjYXNlIExpbmtUYXJnZXQuTk9ORToKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMaW5rVGFyZ2V0LlNFTEY6CisgICAgICB0YXJnZXRTdHIgPSAiX3NlbGYiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExpbmtUYXJnZXQuQkxBTks6CisgICAgICB0YXJnZXRTdHIgPSAiX2JsYW5rIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMaW5rVGFyZ2V0LlBBUkVOVDoKKyAgICAgIHRhcmdldFN0ciA9ICJfcGFyZW50IjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMaW5rVGFyZ2V0LlRPUDoKKyAgICAgIHRhcmdldFN0ciA9ICJfdG9wIjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgbGluay50YXJnZXQgPSB0YXJnZXRTdHI7CisgIGxpbmsucmVsID0gdHlwZW9mIHJlbCA9PT0gInN0cmluZyIgPyByZWwgOiBERUZBVUxUX0xJTktfUkVMOworfQorCitmdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21VcmwodXJsKSB7CisgIHZhciBhbmNob3IgPSB1cmwuaW5kZXhPZigiIyIpOworICB2YXIgcXVlcnkgPSB1cmwuaW5kZXhPZigiPyIpOworICB2YXIgZW5kID0gTWF0aC5taW4oYW5jaG9yID4gMCA/IGFuY2hvciA6IHVybC5sZW5ndGgsIHF1ZXJ5ID4gMCA/IHF1ZXJ5IDogdXJsLmxlbmd0aCk7CisgIHJldHVybiB1cmwuc3Vic3RyaW5nKHVybC5sYXN0SW5kZXhPZigiLyIsIGVuZCkgKyAxLCBlbmQpOworfQorCit2YXIgU3RhdFRpbWVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gU3RhdFRpbWVyKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdGF0VGltZXIpOworCisgICAgdGhpcy5zdGFydGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLnRpbWVzID0gW107CisgIH0KKworICBfY3JlYXRlQ2xhc3MoU3RhdFRpbWVyLCBbeworICAgIGtleTogInRpbWUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB0aW1lKG5hbWUpIHsKKyAgICAgIGlmIChuYW1lIGluIHRoaXMuc3RhcnRlZCkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIlRpbWVyIGlzIGFscmVhZHkgcnVubmluZyBmb3IgIi5jb25jYXQobmFtZSkpOworICAgICAgfQorCisgICAgICB0aGlzLnN0YXJ0ZWRbbmFtZV0gPSBEYXRlLm5vdygpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRpbWVFbmQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB0aW1lRW5kKG5hbWUpIHsKKyAgICAgIGlmICghKG5hbWUgaW4gdGhpcy5zdGFydGVkKSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIlRpbWVyIGhhcyBub3QgYmVlbiBzdGFydGVkIGZvciAiLmNvbmNhdChuYW1lKSk7CisgICAgICB9CisKKyAgICAgIHRoaXMudGltZXMucHVzaCh7CisgICAgICAgIG5hbWU6IG5hbWUsCisgICAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbbmFtZV0sCisgICAgICAgIGVuZDogRGF0ZS5ub3coKQorICAgICAgfSk7CisgICAgICBkZWxldGUgdGhpcy5zdGFydGVkW25hbWVdOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRvU3RyaW5nIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CisgICAgICB2YXIgb3V0QnVmID0gW107CisgICAgICB2YXIgbG9uZ2VzdCA9IDA7CisKKyAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLnRpbWVzKSwKKyAgICAgICAgICBfc3RlcDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgdGltZSA9IF9zdGVwLnZhbHVlOworICAgICAgICAgIHZhciBuYW1lID0gdGltZS5uYW1lOworCisgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gbG9uZ2VzdCkgeworICAgICAgICAgICAgbG9uZ2VzdCA9IG5hbWUubGVuZ3RoOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvci5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3IuZigpOworICAgICAgfQorCisgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMudGltZXMpLAorICAgICAgICAgIF9zdGVwMjsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgX3RpbWUgPSBfc3RlcDIudmFsdWU7CisgICAgICAgICAgdmFyIGR1cmF0aW9uID0gX3RpbWUuZW5kIC0gX3RpbWUuc3RhcnQ7CisgICAgICAgICAgb3V0QnVmLnB1c2goIiIuY29uY2F0KF90aW1lLm5hbWUucGFkRW5kKGxvbmdlc3QpLCAiICIpLmNvbmNhdChkdXJhdGlvbiwgIm1zXG4iKSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjIuZigpOworICAgICAgfQorCisgICAgICByZXR1cm4gb3V0QnVmLmpvaW4oIiIpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBTdGF0VGltZXI7Cit9KCk7CisKK2V4cG9ydHMuU3RhdFRpbWVyID0gU3RhdFRpbWVyOworCitmdW5jdGlvbiBpc0ZldGNoU3VwcG9ydGVkKCkgeworICByZXR1cm4gdHlwZW9mIGZldGNoICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgUmVzcG9uc2UgIT09ICJ1bmRlZmluZWQiICYmICJib2R5IiBpbiBSZXNwb25zZS5wcm90b3R5cGUgJiYgdHlwZW9mIFJlYWRhYmxlU3RyZWFtICE9PSAidW5kZWZpbmVkIjsKK30KKworZnVuY3Rpb24gaXNWYWxpZEZldGNoVXJsKHVybCwgYmFzZVVybCkgeworICB0cnkgeworICAgIHZhciBfcmVmOCA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCksCisgICAgICAgIHByb3RvY29sID0gX3JlZjgucHJvdG9jb2w7CisKKyAgICByZXR1cm4gcHJvdG9jb2wgPT09ICJodHRwOiIgfHwgcHJvdG9jb2wgPT09ICJodHRwczoiOworICB9IGNhdGNoIChleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitmdW5jdGlvbiBsb2FkU2NyaXB0KHNyYykgeworICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKyAgICBzY3JpcHQuc3JjID0gc3JjOworICAgIHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlOworCisgICAgc2NyaXB0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgICAgICByZWplY3QobmV3IEVycm9yKCJDYW5ub3QgbG9hZCBzY3JpcHQgYXQ6ICIuY29uY2F0KHNjcmlwdC5zcmMpKSk7CisgICAgfTsKKworICAgIChkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKKyAgfSk7Cit9CisKK2Z1bmN0aW9uIGRlcHJlY2F0ZWQoZGV0YWlscykgeworICBjb25zb2xlLmxvZygiRGVwcmVjYXRlZCBBUEkgdXNhZ2U6ICIgKyBkZXRhaWxzKTsKK30KKwordmFyIHBkZkRhdGVTdHJpbmdSZWdleDsKKwordmFyIFBERkRhdGVTdHJpbmcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZEYXRlU3RyaW5nKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZEYXRlU3RyaW5nKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQREZEYXRlU3RyaW5nLCBudWxsLCBbeworICAgIGtleTogInRvRGF0ZU9iamVjdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHRvRGF0ZU9iamVjdChpbnB1dCkgeworICAgICAgaWYgKCFpbnB1dCB8fCAhKDAsIF91dGlsLmlzU3RyaW5nKShpbnB1dCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGlmICghcGRmRGF0ZVN0cmluZ1JlZ2V4KSB7CisgICAgICAgIHBkZkRhdGVTdHJpbmdSZWdleCA9IG5ldyBSZWdFeHAoIl5EOiIgKyAiKFxcZHs0fSkiICsgIihcXGR7Mn0pPyIgKyAiKFxcZHsyfSk/IiArICIoXFxkezJ9KT8iICsgIihcXGR7Mn0pPyIgKyAiKFxcZHsyfSk/IiArICIoW1p8K3wtXSk/IiArICIoXFxkezJ9KT8iICsgIic/IiArICIoXFxkezJ9KT8iICsgIic/Iik7CisgICAgICB9CisKKyAgICAgIHZhciBtYXRjaGVzID0gcGRmRGF0ZVN0cmluZ1JlZ2V4LmV4ZWMoaW5wdXQpOworCisgICAgICBpZiAoIW1hdGNoZXMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApOworICAgICAgdmFyIG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApOworICAgICAgbW9udGggPSBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyID8gbW9udGggLSAxIDogMDsKKyAgICAgIHZhciBkYXkgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxMCk7CisgICAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxOworICAgICAgdmFyIGhvdXIgPSBwYXJzZUludChtYXRjaGVzWzRdLCAxMCk7CisgICAgICBob3VyID0gaG91ciA+PSAwICYmIGhvdXIgPD0gMjMgPyBob3VyIDogMDsKKyAgICAgIHZhciBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7CisgICAgICBtaW51dGUgPSBtaW51dGUgPj0gMCAmJiBtaW51dGUgPD0gNTkgPyBtaW51dGUgOiAwOworICAgICAgdmFyIHNlY29uZCA9IHBhcnNlSW50KG1hdGNoZXNbNl0sIDEwKTsKKyAgICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7CisgICAgICB2YXIgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCAiWiI7CisgICAgICB2YXIgb2Zmc2V0SG91ciA9IHBhcnNlSW50KG1hdGNoZXNbOF0sIDEwKTsKKyAgICAgIG9mZnNldEhvdXIgPSBvZmZzZXRIb3VyID49IDAgJiYgb2Zmc2V0SG91ciA8PSAyMyA/IG9mZnNldEhvdXIgOiAwOworICAgICAgdmFyIG9mZnNldE1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbOV0sIDEwKSB8fCAwOworICAgICAgb2Zmc2V0TWludXRlID0gb2Zmc2V0TWludXRlID49IDAgJiYgb2Zmc2V0TWludXRlIDw9IDU5ID8gb2Zmc2V0TWludXRlIDogMDsKKworICAgICAgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gIi0iKSB7CisgICAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjsKKyAgICAgICAgbWludXRlICs9IG9mZnNldE1pbnV0ZTsKKyAgICAgIH0gZWxzZSBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSAiKyIpIHsKKyAgICAgICAgaG91ciAtPSBvZmZzZXRIb3VyOworICAgICAgICBtaW51dGUgLT0gb2Zmc2V0TWludXRlOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGRGF0ZVN0cmluZzsKK30oKTsKKworZXhwb3J0cy5QREZEYXRlU3RyaW5nID0gUERGRGF0ZVN0cmluZzsKKworLyoqKi8gfSksCisvKiAyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCittb2R1bGUuZXhwb3J0cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CisKKy8qKiovIH0pLAorLyogMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24obW9kdWxlKSB7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCit2YXIgcnVudGltZSA9IGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlOworICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7CisgIHZhciB1bmRlZmluZWQ7CisgIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiA/IFN5bWJvbCA6IHt9OworICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIjsKKyAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciI7CisgIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOworCisgIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKKyAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgIGVudW1lcmFibGU6IHRydWUsCisgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICB3cml0YWJsZTogdHJ1ZQorICAgIH0pOworICAgIHJldHVybiBvYmpba2V5XTsKKyAgfQorCisgIHRyeSB7CisgICAgZGVmaW5lKHt9LCAiIik7CisgIH0gY2F0Y2ggKGVycikgeworICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7CisgICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7CisgICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTsKKyAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTsKKyAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CisgICAgcmV0dXJuIGdlbmVyYXRvcjsKKyAgfQorCisgIGV4cG9ydHMud3JhcCA9IHdyYXA7CisKKyAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHR5cGU6ICJub3JtYWwiLAorICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpCisgICAgICB9OworICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdHlwZTogInRocm93IiwKKyAgICAgICAgYXJnOiBlcnIKKyAgICAgIH07CisgICAgfQorICB9CisKKyAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSAic3VzcGVuZGVkU3RhcnQiOworICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9ICJzdXNwZW5kZWRZaWVsZCI7CisgIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9ICJleGVjdXRpbmciOworICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSAiY29tcGxldGVkIjsKKyAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTsKKworICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fQorCisgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KKworICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9CisKKyAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CisKKyAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzOworICB9OworCisgIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKKyAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOworCisgIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJiBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiYgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkgeworICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7CisgIH0KKworICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CisgIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7CisgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247CisgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvckZ1bmN0aW9uIik7CisKKyAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgeworICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsKKyAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgeworICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgeworICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gImZ1bmN0aW9uIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7CisgICAgcmV0dXJuIGN0b3IgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSAiR2VuZXJhdG9yRnVuY3Rpb24iIDogZmFsc2U7CisgIH07CisKKyAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgeworICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHsKKyAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlOworICAgICAgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpOworICAgIH0KKworICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTsKKyAgICByZXR1cm4gZ2VuRnVuOworICB9OworCisgIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIF9fYXdhaXQ6IGFyZworICAgIH07CisgIH07CisKKyAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CisgICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpOworCisgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKKyAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7CisgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKKworICAgICAgICBpZiAodmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09ICJvYmplY3QiICYmIGhhc093bi5jYWxsKHZhbHVlLCAiX19hd2FpdCIpKSB7CisgICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgICAgIGludm9rZSgibmV4dCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOworICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAgICAgIGludm9rZSgidGhyb3ciLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7CisgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkOworICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKKworICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHsKKyAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkgeworICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7CisgICAgfQorCisgICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTsKKyAgfQorCisgIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7CisKKyAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjsKKworICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24gKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkgeworICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7CisgICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOworICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikgPyBpdGVyIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsKKyAgICB9KTsKKyAgfTsKKworICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHsKKyAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0OworICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHsKKyAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHsKKyAgICAgICAgaWYgKG1ldGhvZCA9PT0gInRocm93IikgeworICAgICAgICAgIHRocm93IGFyZzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7CisgICAgICB9CisKKyAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kOworICAgICAgY29udGV4dC5hcmcgPSBhcmc7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7CisKKyAgICAgICAgaWYgKGRlbGVnYXRlKSB7CisgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CisKKyAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAibmV4dCIpIHsKKyAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09ICJ0aHJvdyIpIHsKKyAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7CisgICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gInJldHVybiIpIHsKKyAgICAgICAgICBjb250ZXh0LmFicnVwdCgicmV0dXJuIiwgY29udGV4dC5hcmcpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZzsKKyAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOworCisgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gIm5vcm1hbCIpIHsKKyAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IEdlblN0YXRlQ29tcGxldGVkIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDsKKworICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsCisgICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmUKKyAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CisgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDsKKyAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsKKyAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdOworCisgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKworICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAidGhyb3ciKSB7CisgICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvclsicmV0dXJuIl0pIHsKKyAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iOworICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOworICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOworCisgICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAidGhyb3ciKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpOworICAgICAgfQorCisgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICB9CisKKyAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpOworCisgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CisgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7CisgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKyAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgIH0KKworICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZzsKKworICAgIGlmICghaW5mbykgeworICAgICAgY29udGV4dC5tZXRob2QgPSAidGhyb3ciOworICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpOworICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7CisgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICB9CisKKyAgICBpZiAoaW5mby5kb25lKSB7CisgICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTsKKyAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7CisKKyAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gInJldHVybiIpIHsKKyAgICAgICAgY29udGV4dC5tZXRob2QgPSAibmV4dCI7CisgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKyAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgfQorCisgIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7CisgIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKTsKKworICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOworICB9OworCisgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CisgICAgdmFyIGVudHJ5ID0geworICAgICAgdHJ5TG9jOiBsb2NzWzBdCisgICAgfTsKKworICAgIGlmICgxIGluIGxvY3MpIHsKKyAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTsKKyAgICB9CisKKyAgICBpZiAoMiBpbiBsb2NzKSB7CisgICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTsKKyAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTsKKyAgICB9CisKKyAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7CisgIH0KKworICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CisgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307CisgICAgcmVjb3JkLnR5cGUgPSAibm9ybWFsIjsKKyAgICBkZWxldGUgcmVjb3JkLmFyZzsKKyAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOworICB9CisKKyAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkgeworICAgIHRoaXMudHJ5RW50cmllcyA9IFt7CisgICAgICB0cnlMb2M6ICJyb290IgorICAgIH1dOworICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTsKKyAgICB0aGlzLnJlc2V0KHRydWUpOworICB9CisKKyAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKG9iamVjdCkgeworICAgIHZhciBrZXlzID0gW107CisKKyAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7CisgICAgICBrZXlzLnB1c2goa2V5KTsKKyAgICB9CisKKyAgICBrZXlzLnJldmVyc2UoKTsKKyAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHsKKyAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkgeworICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKKworICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgeworICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7CisgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7CisgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbmV4dC5kb25lID0gdHJ1ZTsKKyAgICAgIHJldHVybiBuZXh0OworICAgIH07CisgIH07CisKKyAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7CisgICAgaWYgKGl0ZXJhYmxlKSB7CisgICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07CisKKyAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgeworICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gImZ1bmN0aW9uIikgeworICAgICAgICByZXR1cm4gaXRlcmFibGU7CisgICAgICB9CisKKyAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgeworICAgICAgICB2YXIgaSA9IC0xLAorICAgICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7CisgICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkgeworICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgeworICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07CisgICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkOworICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIG5leHQ6IGRvbmVSZXN1bHQKKyAgICB9OworICB9CisKKyAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7CisKKyAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHsKKyAgICByZXR1cm4geworICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgIGRvbmU6IHRydWUKKyAgICB9OworICB9CisKKyAgQ29udGV4dC5wcm90b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6IENvbnRleHQsCisgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsKKyAgICAgIHRoaXMucHJldiA9IDA7CisgICAgICB0aGlzLm5leHQgPSAwOworICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMuZG9uZSA9IGZhbHNlOworICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7CisgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKKyAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkOworICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7CisKKyAgICAgIGlmICghc2tpcFRlbXBSZXNldCkgeworICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHsKKyAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICJ0IiAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7CisgICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKKyAgICAgIHRoaXMuZG9uZSA9IHRydWU7CisgICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdOworICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjsKKworICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMucnZhbDsKKyAgICB9LAorICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHsKKyAgICAgIGlmICh0aGlzLmRvbmUpIHsKKyAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworICAgICAgfQorCisgICAgICB2YXIgY29udGV4dCA9IHRoaXM7CisKKyAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgeworICAgICAgICByZWNvcmQudHlwZSA9ICJ0aHJvdyI7CisgICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247CisgICAgICAgIGNvbnRleHQubmV4dCA9IGxvYzsKKworICAgICAgICBpZiAoY2F1Z2h0KSB7CisgICAgICAgICAgY29udGV4dC5tZXRob2QgPSAibmV4dCI7CisgICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gISFjYXVnaHQ7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOworICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSAicm9vdCIpIHsKKyAgICAgICAgICByZXR1cm4gaGFuZGxlKCJlbmQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7CisgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpOworICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksICJmaW5hbGx5TG9jIik7CisKKyAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmaW5hbGx5RW50cnkgJiYgKHR5cGUgPT09ICJicmVhayIgfHwgdHlwZSA9PT0gImNvbnRpbnVlIikgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OworICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlOworICAgICAgcmVjb3JkLmFyZyA9IGFyZzsKKworICAgICAgaWYgKGZpbmFsbHlFbnRyeSkgeworICAgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKKyAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7CisgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpOworICAgIH0sCisgICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJlY29yZCwgYWZ0ZXJMb2MpIHsKKyAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICB0aHJvdyByZWNvcmQuYXJnOworICAgICAgfQorCisgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJicmVhayIgfHwgcmVjb3JkLnR5cGUgPT09ICJjb250aW51ZSIpIHsKKyAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZzsKKyAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09ICJyZXR1cm4iKSB7CisgICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZzsKKyAgICAgICAgdGhpcy5tZXRob2QgPSAicmV0dXJuIjsKKyAgICAgICAgdGhpcy5uZXh0ID0gImVuZCI7CisgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAibm9ybWFsIiAmJiBhZnRlckxvYykgeworICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CisgICAgfSwKKyAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgeworICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpOworICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpOworICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKKyAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKKworICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7CisgICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdGhyb3duOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CisgICAgfSwKKyAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7CisgICAgICB0aGlzLmRlbGVnYXRlID0geworICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSwKKyAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKKyAgICAgICAgbmV4dExvYzogbmV4dExvYworICAgICAgfTsKKworICAgICAgaWYgKHRoaXMubWV0aG9kID09PSAibmV4dCIpIHsKKyAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIGV4cG9ydHM7Cit9KCggZmFsc2UgPyB1bmRlZmluZWQgOiBfdHlwZW9mKG1vZHVsZSkpID09PSAib2JqZWN0IiA/IG1vZHVsZS5leHBvcnRzIDoge30pOworCit0cnkgeworICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOworfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKKyAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOworfQorLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKHRoaXMsIF9fd19wZGZqc19yZXF1aXJlX18oNCkobW9kdWxlKSkpCisKKy8qKiovIH0pLAorLyogNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobW9kdWxlKSB7CisgIGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkgeworICAgIG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbiAoKSB7fTsKKworICAgIG1vZHVsZS5wYXRocyA9IFtdOworICAgIGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAibG9hZGVkIiwgeworICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbW9kdWxlLmw7CisgICAgICB9CisgICAgfSk7CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgImlkIiwgeworICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbW9kdWxlLmk7CisgICAgICB9CisgICAgfSk7CisgICAgbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7CisgIH0KKworICByZXR1cm4gbW9kdWxlOworfTsKKworLyoqKi8gfSksCisvKiA1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuYXJyYXlCeXRlTGVuZ3RoID0gYXJyYXlCeXRlTGVuZ3RoOworZXhwb3J0cy5hcnJheXNUb0J5dGVzID0gYXJyYXlzVG9CeXRlczsKK2V4cG9ydHMuYXNzZXJ0ID0gYXNzZXJ0OworZXhwb3J0cy5ieXRlc1RvU3RyaW5nID0gYnl0ZXNUb1N0cmluZzsKK2V4cG9ydHMuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eTsKK2V4cG9ydHMuZXNjYXBlU3RyaW5nID0gZXNjYXBlU3RyaW5nOworZXhwb3J0cy5nZXRNb2RpZmljYXRpb25EYXRlID0gZ2V0TW9kaWZpY2F0aW9uRGF0ZTsKK2V4cG9ydHMuZ2V0VmVyYm9zaXR5TGV2ZWwgPSBnZXRWZXJib3NpdHlMZXZlbDsKK2V4cG9ydHMuaW5mbyA9IGluZm87CitleHBvcnRzLmlzQXJyYXlCdWZmZXIgPSBpc0FycmF5QnVmZmVyOworZXhwb3J0cy5pc0FycmF5RXF1YWwgPSBpc0FycmF5RXF1YWw7CitleHBvcnRzLmlzQm9vbCA9IGlzQm9vbDsKK2V4cG9ydHMuaXNOdW0gPSBpc051bTsKK2V4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZzsKK2V4cG9ydHMuaXNTYW1lT3JpZ2luID0gaXNTYW1lT3JpZ2luOworZXhwb3J0cy5jcmVhdGVWYWxpZEFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDsKK2V4cG9ydHMucmVtb3ZlTnVsbENoYXJhY3RlcnMgPSByZW1vdmVOdWxsQ2hhcmFjdGVyczsKK2V4cG9ydHMuc2V0VmVyYm9zaXR5TGV2ZWwgPSBzZXRWZXJib3NpdHlMZXZlbDsKK2V4cG9ydHMuc2hhZG93ID0gc2hhZG93OworZXhwb3J0cy5zdHJpbmczMiA9IHN0cmluZzMyOworZXhwb3J0cy5zdHJpbmdUb0J5dGVzID0gc3RyaW5nVG9CeXRlczsKK2V4cG9ydHMuc3RyaW5nVG9QREZTdHJpbmcgPSBzdHJpbmdUb1BERlN0cmluZzsKK2V4cG9ydHMuc3RyaW5nVG9VVEY4U3RyaW5nID0gc3RyaW5nVG9VVEY4U3RyaW5nOworZXhwb3J0cy51dGY4U3RyaW5nVG9TdHJpbmcgPSB1dGY4U3RyaW5nVG9TdHJpbmc7CitleHBvcnRzLndhcm4gPSB3YXJuOworZXhwb3J0cy51bnJlYWNoYWJsZSA9IHVucmVhY2hhYmxlOworZXhwb3J0cy5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSBleHBvcnRzLklzTGl0dGxlRW5kaWFuQ2FjaGVkID0gZXhwb3J0cy5jcmVhdGVPYmplY3RVUkwgPSBleHBvcnRzLkZvcm1hdEVycm9yID0gZXhwb3J0cy5VdGlsID0gZXhwb3J0cy5Vbmtub3duRXJyb3JFeGNlcHRpb24gPSBleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IGV4cG9ydHMuVGV4dFJlbmRlcmluZ01vZGUgPSBleHBvcnRzLlN0cmVhbVR5cGUgPSBleHBvcnRzLlBlcm1pc3Npb25GbGFnID0gZXhwb3J0cy5QYXNzd29yZFJlc3BvbnNlcyA9IGV4cG9ydHMuUGFzc3dvcmRFeGNlcHRpb24gPSBleHBvcnRzLk1pc3NpbmdQREZFeGNlcHRpb24gPSBleHBvcnRzLkludmFsaWRQREZFeGNlcHRpb24gPSBleHBvcnRzLkFib3J0RXhjZXB0aW9uID0gZXhwb3J0cy5DTWFwQ29tcHJlc3Npb25UeXBlID0gZXhwb3J0cy5JbWFnZUtpbmQgPSBleHBvcnRzLkZvbnRUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSBleHBvcnRzLkFubm90YXRpb25SZXBseVR5cGUgPSBleHBvcnRzLkFubm90YXRpb25NYXJrZWRTdGF0ZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkZsYWcgPSBleHBvcnRzLkFubm90YXRpb25GaWVsZEZsYWcgPSBleHBvcnRzLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSBleHBvcnRzLlVOU1VQUE9SVEVEX0ZFQVRVUkVTID0gZXhwb3J0cy5WZXJib3NpdHlMZXZlbCA9IGV4cG9ydHMuT1BTID0gZXhwb3J0cy5JREVOVElUWV9NQVRSSVggPSBleHBvcnRzLkZPTlRfSURFTlRJVFlfTUFUUklYID0gZXhwb3J0cy5CYXNlRXhjZXB0aW9uID0gdm9pZCAwOworCitfX3dfcGRmanNfcmVxdWlyZV9fKDYpOworCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKwordmFyIElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKK2V4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gSURFTlRJVFlfTUFUUklYOwordmFyIEZPTlRfSURFTlRJVFlfTUFUUklYID0gWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF07CitleHBvcnRzLkZPTlRfSURFTlRJVFlfTUFUUklYID0gRk9OVF9JREVOVElUWV9NQVRSSVg7Cit2YXIgUGVybWlzc2lvbkZsYWcgPSB7CisgIFBSSU5UOiAweDA0LAorICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsCisgIENPUFk6IDB4MTAsCisgIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCwKKyAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsCisgIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLAorICBBU1NFTUJMRTogMHg0MDAsCisgIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAKK307CitleHBvcnRzLlBlcm1pc3Npb25GbGFnID0gUGVybWlzc2lvbkZsYWc7Cit2YXIgVGV4dFJlbmRlcmluZ01vZGUgPSB7CisgIEZJTEw6IDAsCisgIFNUUk9LRTogMSwKKyAgRklMTF9TVFJPS0U6IDIsCisgIElOVklTSUJMRTogMywKKyAgRklMTF9BRERfVE9fUEFUSDogNCwKKyAgU1RST0tFX0FERF9UT19QQVRIOiA1LAorICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNiwKKyAgQUREX1RPX1BBVEg6IDcsCisgIEZJTExfU1RST0tFX01BU0s6IDMsCisgIEFERF9UT19QQVRIX0ZMQUc6IDQKK307CitleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGU7Cit2YXIgSW1hZ2VLaW5kID0geworICBHUkFZU0NBTEVfMUJQUDogMSwKKyAgUkdCXzI0QlBQOiAyLAorICBSR0JBXzMyQlBQOiAzCit9OworZXhwb3J0cy5JbWFnZUtpbmQgPSBJbWFnZUtpbmQ7Cit2YXIgQW5ub3RhdGlvblR5cGUgPSB7CisgIFRFWFQ6IDEsCisgIExJTks6IDIsCisgIEZSRUVURVhUOiAzLAorICBMSU5FOiA0LAorICBTUVVBUkU6IDUsCisgIENJUkNMRTogNiwKKyAgUE9MWUdPTjogNywKKyAgUE9MWUxJTkU6IDgsCisgIEhJR0hMSUdIVDogOSwKKyAgVU5ERVJMSU5FOiAxMCwKKyAgU1FVSUdHTFk6IDExLAorICBTVFJJS0VPVVQ6IDEyLAorICBTVEFNUDogMTMsCisgIENBUkVUOiAxNCwKKyAgSU5LOiAxNSwKKyAgUE9QVVA6IDE2LAorICBGSUxFQVRUQUNITUVOVDogMTcsCisgIFNPVU5EOiAxOCwKKyAgTU9WSUU6IDE5LAorICBXSURHRVQ6IDIwLAorICBTQ1JFRU46IDIxLAorICBQUklOVEVSTUFSSzogMjIsCisgIFRSQVBORVQ6IDIzLAorICBXQVRFUk1BUks6IDI0LAorICBUSFJFRUQ6IDI1LAorICBSRURBQ1Q6IDI2Cit9OworZXhwb3J0cy5Bbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlOwordmFyIEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHsKKyAgTUFSS0VEOiAiTWFya2VkIiwKKyAgUkVWSUVXOiAiUmV2aWV3IgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0gQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlOwordmFyIEFubm90YXRpb25NYXJrZWRTdGF0ZSA9IHsKKyAgTUFSS0VEOiAiTWFya2VkIiwKKyAgVU5NQVJLRUQ6ICJVbm1hcmtlZCIKK307CitleHBvcnRzLkFubm90YXRpb25NYXJrZWRTdGF0ZSA9IEFubm90YXRpb25NYXJrZWRTdGF0ZTsKK3ZhciBBbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSB7CisgIEFDQ0VQVEVEOiAiQWNjZXB0ZWQiLAorICBSRUpFQ1RFRDogIlJlamVjdGVkIiwKKyAgQ0FOQ0VMTEVEOiAiQ2FuY2VsbGVkIiwKKyAgQ09NUExFVEVEOiAiQ29tcGxldGVkIiwKKyAgTk9ORTogIk5vbmUiCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSBBbm5vdGF0aW9uUmV2aWV3U3RhdGU7Cit2YXIgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHsKKyAgR1JPVVA6ICJHcm91cCIsCisgIFJFUExZOiAiUiIKK307CitleHBvcnRzLkFubm90YXRpb25SZXBseVR5cGUgPSBBbm5vdGF0aW9uUmVwbHlUeXBlOwordmFyIEFubm90YXRpb25GbGFnID0geworICBJTlZJU0lCTEU6IDB4MDEsCisgIEhJRERFTjogMHgwMiwKKyAgUFJJTlQ6IDB4MDQsCisgIE5PWk9PTTogMHgwOCwKKyAgTk9ST1RBVEU6IDB4MTAsCisgIE5PVklFVzogMHgyMCwKKyAgUkVBRE9OTFk6IDB4NDAsCisgIExPQ0tFRDogMHg4MCwKKyAgVE9HR0xFTk9WSUVXOiAweDEwMCwKKyAgTE9DS0VEQ09OVEVOVFM6IDB4MjAwCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uRmxhZyA9IEFubm90YXRpb25GbGFnOwordmFyIEFubm90YXRpb25GaWVsZEZsYWcgPSB7CisgIFJFQURPTkxZOiAweDAwMDAwMDEsCisgIFJFUVVJUkVEOiAweDAwMDAwMDIsCisgIE5PRVhQT1JUOiAweDAwMDAwMDQsCisgIE1VTFRJTElORTogMHgwMDAxMDAwLAorICBQQVNTV09SRDogMHgwMDAyMDAwLAorICBOT1RPR0dMRVRPT0ZGOiAweDAwMDQwMDAsCisgIFJBRElPOiAweDAwMDgwMDAsCisgIFBVU0hCVVRUT046IDB4MDAxMDAwMCwKKyAgQ09NQk86IDB4MDAyMDAwMCwKKyAgRURJVDogMHgwMDQwMDAwLAorICBTT1JUOiAweDAwODAwMDAsCisgIEZJTEVTRUxFQ1Q6IDB4MDEwMDAwMCwKKyAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKKyAgRE9OT1RTUEVMTENIRUNLOiAweDA0MDAwMDAsCisgIERPTk9UU0NST0xMOiAweDA4MDAwMDAsCisgIENPTUI6IDB4MTAwMDAwMCwKKyAgUklDSFRFWFQ6IDB4MjAwMDAwMCwKKyAgUkFESU9TSU5VTklTT046IDB4MjAwMDAwMCwKKyAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IEFubm90YXRpb25GaWVsZEZsYWc7Cit2YXIgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IHsKKyAgU09MSUQ6IDEsCisgIERBU0hFRDogMiwKKyAgQkVWRUxFRDogMywKKyAgSU5TRVQ6IDQsCisgIFVOREVSTElORTogNQorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU7Cit2YXIgU3RyZWFtVHlwZSA9IHsKKyAgVU5LTk9XTjogIlVOS05PV04iLAorICBGTEFURTogIkZMQVRFIiwKKyAgTFpXOiAiTFpXIiwKKyAgRENUOiAiRENUIiwKKyAgSlBYOiAiSlBYIiwKKyAgSkJJRzogIkpCSUciLAorICBBODU6ICJBODUiLAorICBBSFg6ICJBSFgiLAorICBDQ0Y6ICJDQ0YiLAorICBSTFg6ICJSTFgiCit9OworZXhwb3J0cy5TdHJlYW1UeXBlID0gU3RyZWFtVHlwZTsKK3ZhciBGb250VHlwZSA9IHsKKyAgVU5LTk9XTjogIlVOS05PV04iLAorICBUWVBFMTogIlRZUEUxIiwKKyAgVFlQRTFDOiAiVFlQRTFDIiwKKyAgQ0lERk9OVFRZUEUwOiAiQ0lERk9OVFRZUEUwIiwKKyAgQ0lERk9OVFRZUEUwQzogIkNJREZPTlRUWVBFMEMiLAorICBUUlVFVFlQRTogIlRSVUVUWVBFIiwKKyAgQ0lERk9OVFRZUEUyOiAiQ0lERk9OVFRZUEUyIiwKKyAgVFlQRTM6ICJUWVBFMyIsCisgIE9QRU5UWVBFOiAiT1BFTlRZUEUiLAorICBUWVBFMDogIlRZUEUwIiwKKyAgTU1UWVBFMTogIk1NVFlQRTEiCit9OworZXhwb3J0cy5Gb250VHlwZSA9IEZvbnRUeXBlOwordmFyIFZlcmJvc2l0eUxldmVsID0geworICBFUlJPUlM6IDAsCisgIFdBUk5JTkdTOiAxLAorICBJTkZPUzogNQorfTsKK2V4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBWZXJib3NpdHlMZXZlbDsKK3ZhciBDTWFwQ29tcHJlc3Npb25UeXBlID0geworICBOT05FOiAwLAorICBCSU5BUlk6IDEsCisgIFNUUkVBTTogMgorfTsKK2V4cG9ydHMuQ01hcENvbXByZXNzaW9uVHlwZSA9IENNYXBDb21wcmVzc2lvblR5cGU7Cit2YXIgT1BTID0geworICBkZXBlbmRlbmN5OiAxLAorICBzZXRMaW5lV2lkdGg6IDIsCisgIHNldExpbmVDYXA6IDMsCisgIHNldExpbmVKb2luOiA0LAorICBzZXRNaXRlckxpbWl0OiA1LAorICBzZXREYXNoOiA2LAorICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsCisgIHNldEZsYXRuZXNzOiA4LAorICBzZXRHU3RhdGU6IDksCisgIHNhdmU6IDEwLAorICByZXN0b3JlOiAxMSwKKyAgdHJhbnNmb3JtOiAxMiwKKyAgbW92ZVRvOiAxMywKKyAgbGluZVRvOiAxNCwKKyAgY3VydmVUbzogMTUsCisgIGN1cnZlVG8yOiAxNiwKKyAgY3VydmVUbzM6IDE3LAorICBjbG9zZVBhdGg6IDE4LAorICByZWN0YW5nbGU6IDE5LAorICBzdHJva2U6IDIwLAorICBjbG9zZVN0cm9rZTogMjEsCisgIGZpbGw6IDIyLAorICBlb0ZpbGw6IDIzLAorICBmaWxsU3Ryb2tlOiAyNCwKKyAgZW9GaWxsU3Ryb2tlOiAyNSwKKyAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKKyAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LAorICBlbmRQYXRoOiAyOCwKKyAgY2xpcDogMjksCisgIGVvQ2xpcDogMzAsCisgIGJlZ2luVGV4dDogMzEsCisgIGVuZFRleHQ6IDMyLAorICBzZXRDaGFyU3BhY2luZzogMzMsCisgIHNldFdvcmRTcGFjaW5nOiAzNCwKKyAgc2V0SFNjYWxlOiAzNSwKKyAgc2V0TGVhZGluZzogMzYsCisgIHNldEZvbnQ6IDM3LAorICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsCisgIHNldFRleHRSaXNlOiAzOSwKKyAgbW92ZVRleHQ6IDQwLAorICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAorICBzZXRUZXh0TWF0cml4OiA0MiwKKyAgbmV4dExpbmU6IDQzLAorICBzaG93VGV4dDogNDQsCisgIHNob3dTcGFjZWRUZXh0OiA0NSwKKyAgbmV4dExpbmVTaG93VGV4dDogNDYsCisgIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKKyAgc2V0Q2hhcldpZHRoOiA0OCwKKyAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSwKKyAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCisgIHNldEZpbGxDb2xvclNwYWNlOiA1MSwKKyAgc2V0U3Ryb2tlQ29sb3I6IDUyLAorICBzZXRTdHJva2VDb2xvck46IDUzLAorICBzZXRGaWxsQ29sb3I6IDU0LAorICBzZXRGaWxsQ29sb3JOOiA1NSwKKyAgc2V0U3Ryb2tlR3JheTogNTYsCisgIHNldEZpbGxHcmF5OiA1NywKKyAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LAorICBzZXRGaWxsUkdCQ29sb3I6IDU5LAorICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLAorICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSwKKyAgc2hhZGluZ0ZpbGw6IDYyLAorICBiZWdpbklubGluZUltYWdlOiA2MywKKyAgYmVnaW5JbWFnZURhdGE6IDY0LAorICBlbmRJbmxpbmVJbWFnZTogNjUsCisgIHBhaW50WE9iamVjdDogNjYsCisgIG1hcmtQb2ludDogNjcsCisgIG1hcmtQb2ludFByb3BzOiA2OCwKKyAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSwKKyAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLAorICBlbmRNYXJrZWRDb250ZW50OiA3MSwKKyAgYmVnaW5Db21wYXQ6IDcyLAorICBlbmRDb21wYXQ6IDczLAorICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAorICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSwKKyAgYmVnaW5Hcm91cDogNzYsCisgIGVuZEdyb3VwOiA3NywKKyAgYmVnaW5Bbm5vdGF0aW9uczogNzgsCisgIGVuZEFubm90YXRpb25zOiA3OSwKKyAgYmVnaW5Bbm5vdGF0aW9uOiA4MCwKKyAgZW5kQW5ub3RhdGlvbjogODEsCisgIHBhaW50SnBlZ1hPYmplY3Q6IDgyLAorICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLAorICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsCisgIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKKyAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LAorICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NywKKyAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAorICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LAorICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLAorICBjb25zdHJ1Y3RQYXRoOiA5MQorfTsKK2V4cG9ydHMuT1BTID0gT1BTOwordmFyIFVOU1VQUE9SVEVEX0ZFQVRVUkVTID0geworICB1bmtub3duOiAidW5rbm93biIsCisgIGZvcm1zOiAiZm9ybXMiLAorICBqYXZhU2NyaXB0OiAiamF2YVNjcmlwdCIsCisgIHNtYXNrOiAic21hc2siLAorICBzaGFkaW5nUGF0dGVybjogInNoYWRpbmdQYXR0ZXJuIiwKKyAgZm9udDogImZvbnQiLAorICBlcnJvclRpbGluZ1BhdHRlcm46ICJlcnJvclRpbGluZ1BhdHRlcm4iLAorICBlcnJvckV4dEdTdGF0ZTogImVycm9yRXh0R1N0YXRlIiwKKyAgZXJyb3JYT2JqZWN0OiAiZXJyb3JYT2JqZWN0IiwKKyAgZXJyb3JGb250TG9hZFR5cGUzOiAiZXJyb3JGb250TG9hZFR5cGUzIiwKKyAgZXJyb3JGb250U3RhdGU6ICJlcnJvckZvbnRTdGF0ZSIsCisgIGVycm9yRm9udE1pc3Npbmc6ICJlcnJvckZvbnRNaXNzaW5nIiwKKyAgZXJyb3JGb250VHJhbnNsYXRlOiAiZXJyb3JGb250VHJhbnNsYXRlIiwKKyAgZXJyb3JDb2xvclNwYWNlOiAiZXJyb3JDb2xvclNwYWNlIiwKKyAgZXJyb3JPcGVyYXRvckxpc3Q6ICJlcnJvck9wZXJhdG9yTGlzdCIsCisgIGVycm9yRm9udFRvVW5pY29kZTogImVycm9yRm9udFRvVW5pY29kZSIsCisgIGVycm9yRm9udExvYWROYXRpdmU6ICJlcnJvckZvbnRMb2FkTmF0aXZlIiwKKyAgZXJyb3JGb250R2V0UGF0aDogImVycm9yRm9udEdldFBhdGgiLAorICBlcnJvck1hcmtlZENvbnRlbnQ6ICJlcnJvck1hcmtlZENvbnRlbnQiCit9OworZXhwb3J0cy5VTlNVUFBPUlRFRF9GRUFUVVJFUyA9IFVOU1VQUE9SVEVEX0ZFQVRVUkVTOwordmFyIFBhc3N3b3JkUmVzcG9uc2VzID0geworICBORUVEX1BBU1NXT1JEOiAxLAorICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIKK307CitleHBvcnRzLlBhc3N3b3JkUmVzcG9uc2VzID0gUGFzc3dvcmRSZXNwb25zZXM7Cit2YXIgdmVyYm9zaXR5ID0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1M7CisKK2Z1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGxldmVsKSB7CisgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkgeworICAgIHZlcmJvc2l0eSA9IGxldmVsOworICB9Cit9CisKK2Z1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkgeworICByZXR1cm4gdmVyYm9zaXR5OworfQorCitmdW5jdGlvbiBpbmZvKG1zZykgeworICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLklORk9TKSB7CisgICAgY29uc29sZS5sb2coIkluZm86ICIuY29uY2F0KG1zZykpOworICB9Cit9CisKK2Z1bmN0aW9uIHdhcm4obXNnKSB7CisgIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1MpIHsKKyAgICBjb25zb2xlLmxvZygiV2FybmluZzogIi5jb25jYXQobXNnKSk7CisgIH0KK30KKworZnVuY3Rpb24gdW5yZWFjaGFibGUobXNnKSB7CisgIHRocm93IG5ldyBFcnJvcihtc2cpOworfQorCitmdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7CisgIGlmICghY29uZCkgeworICAgIHVucmVhY2hhYmxlKG1zZyk7CisgIH0KK30KKworZnVuY3Rpb24gaXNTYW1lT3JpZ2luKGJhc2VVcmwsIG90aGVyVXJsKSB7CisgIHZhciBiYXNlOworCisgIHRyeSB7CisgICAgYmFzZSA9IG5ldyBVUkwoYmFzZVVybCk7CisKKyAgICBpZiAoIWJhc2Uub3JpZ2luIHx8IGJhc2Uub3JpZ2luID09PSAibnVsbCIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2YXIgb3RoZXIgPSBuZXcgVVJMKG90aGVyVXJsLCBiYXNlKTsKKyAgcmV0dXJuIGJhc2Uub3JpZ2luID09PSBvdGhlci5vcmlnaW47Cit9CisKK2Z1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2wodXJsKSB7CisgIGlmICghdXJsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHsKKyAgICBjYXNlICJodHRwOiI6CisgICAgY2FzZSAiaHR0cHM6IjoKKyAgICBjYXNlICJmdHA6IjoKKyAgICBjYXNlICJtYWlsdG86IjoKKyAgICBjYXNlICJ0ZWw6IjoKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitmdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgYmFzZVVybCkgeworICBpZiAoIXVybCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgdHJ5IHsKKyAgICB2YXIgYWJzb2x1dGVVcmwgPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpOworCisgICAgaWYgKF9pc1ZhbGlkUHJvdG9jb2woYWJzb2x1dGVVcmwpKSB7CisgICAgICByZXR1cm4gYWJzb2x1dGVVcmw7CisgICAgfQorICB9IGNhdGNoIChleCkge30KKworICByZXR1cm4gbnVsbDsKK30KKworZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUpIHsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgeworICAgIHZhbHVlOiB2YWx1ZSwKKyAgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICB3cml0YWJsZTogZmFsc2UKKyAgfSk7CisgIHJldHVybiB2YWx1ZTsKK30KKwordmFyIEJhc2VFeGNlcHRpb24gPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VFeGNlcHRpb24pIHsKKyAgICAgIHVucmVhY2hhYmxlKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLiIpOworICAgIH0KKworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB9CisKKyAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKKyAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247CisgIHJldHVybiBCYXNlRXhjZXB0aW9uOworfSgpOworCitleHBvcnRzLkJhc2VFeGNlcHRpb24gPSBCYXNlRXhjZXB0aW9uOworCit2YXIgUGFzc3dvcmRFeGNlcHRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlRXhjZXB0aW9uKSB7CisgIF9pbmhlcml0cyhQYXNzd29yZEV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24pOworCisgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUGFzc3dvcmRFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIFBhc3N3b3JkRXhjZXB0aW9uKG1zZywgY29kZSkgeworICAgIHZhciBfdGhpczsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXNzd29yZEV4Y2VwdGlvbik7CisKKyAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZyk7CisgICAgX3RoaXMuY29kZSA9IGNvZGU7CisgICAgcmV0dXJuIF90aGlzOworICB9CisKKyAgcmV0dXJuIFBhc3N3b3JkRXhjZXB0aW9uOworfShCYXNlRXhjZXB0aW9uKTsKKworZXhwb3J0cy5QYXNzd29yZEV4Y2VwdGlvbiA9IFBhc3N3b3JkRXhjZXB0aW9uOworCit2YXIgVW5rbm93bkVycm9yRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjIpIHsKKyAgX2luaGVyaXRzKFVua25vd25FcnJvckV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24yKTsKKworICB2YXIgX3N1cGVyMiA9IF9jcmVhdGVTdXBlcihVbmtub3duRXJyb3JFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIFVua25vd25FcnJvckV4Y2VwdGlvbihtc2csIGRldGFpbHMpIHsKKyAgICB2YXIgX3RoaXMyOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVua25vd25FcnJvckV4Y2VwdGlvbik7CisKKyAgICBfdGhpczIgPSBfc3VwZXIyLmNhbGwodGhpcywgbXNnKTsKKyAgICBfdGhpczIuZGV0YWlscyA9IGRldGFpbHM7CisgICAgcmV0dXJuIF90aGlzMjsKKyAgfQorCisgIHJldHVybiBVbmtub3duRXJyb3JFeGNlcHRpb247Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IFVua25vd25FcnJvckV4Y2VwdGlvbjsKKwordmFyIEludmFsaWRQREZFeGNlcHRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlRXhjZXB0aW9uMykgeworICBfaW5oZXJpdHMoSW52YWxpZFBERkV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24zKTsKKworICB2YXIgX3N1cGVyMyA9IF9jcmVhdGVTdXBlcihJbnZhbGlkUERGRXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBJbnZhbGlkUERGRXhjZXB0aW9uKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZhbGlkUERGRXhjZXB0aW9uKTsKKworICAgIHJldHVybiBfc3VwZXIzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICByZXR1cm4gSW52YWxpZFBERkV4Y2VwdGlvbjsKK30oQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IEludmFsaWRQREZFeGNlcHRpb247CisKK3ZhciBNaXNzaW5nUERGRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjQpIHsKKyAgX2luaGVyaXRzKE1pc3NpbmdQREZFeGNlcHRpb24sIF9CYXNlRXhjZXB0aW9uNCk7CisKKyAgdmFyIF9zdXBlcjQgPSBfY3JlYXRlU3VwZXIoTWlzc2luZ1BERkV4Y2VwdGlvbik7CisKKyAgZnVuY3Rpb24gTWlzc2luZ1BERkV4Y2VwdGlvbigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWlzc2luZ1BERkV4Y2VwdGlvbik7CisKKyAgICByZXR1cm4gX3N1cGVyNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9CisKKyAgcmV0dXJuIE1pc3NpbmdQREZFeGNlcHRpb247Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLk1pc3NpbmdQREZFeGNlcHRpb24gPSBNaXNzaW5nUERGRXhjZXB0aW9uOworCit2YXIgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjUpIHsKKyAgX2luaGVyaXRzKFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb241KTsKKworICB2YXIgX3N1cGVyNSA9IF9jcmVhdGVTdXBlcihVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihtc2csIHN0YXR1cykgeworICAgIHZhciBfdGhpczM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKTsKKworICAgIF90aGlzMyA9IF9zdXBlcjUuY2FsbCh0aGlzLCBtc2cpOworICAgIF90aGlzMy5zdGF0dXMgPSBzdGF0dXM7CisgICAgcmV0dXJuIF90aGlzMzsKKyAgfQorCisgIHJldHVybiBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb247Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjsKKwordmFyIEZvcm1hdEVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjYpIHsKKyAgX2luaGVyaXRzKEZvcm1hdEVycm9yLCBfQmFzZUV4Y2VwdGlvbjYpOworCisgIHZhciBfc3VwZXI2ID0gX2NyZWF0ZVN1cGVyKEZvcm1hdEVycm9yKTsKKworICBmdW5jdGlvbiBGb3JtYXRFcnJvcigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0RXJyb3IpOworCisgICAgcmV0dXJuIF9zdXBlcjYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfQorCisgIHJldHVybiBGb3JtYXRFcnJvcjsKK30oQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuRm9ybWF0RXJyb3IgPSBGb3JtYXRFcnJvcjsKKwordmFyIEFib3J0RXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjcpIHsKKyAgX2luaGVyaXRzKEFib3J0RXhjZXB0aW9uLCBfQmFzZUV4Y2VwdGlvbjcpOworCisgIHZhciBfc3VwZXI3ID0gX2NyZWF0ZVN1cGVyKEFib3J0RXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBBYm9ydEV4Y2VwdGlvbigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWJvcnRFeGNlcHRpb24pOworCisgICAgcmV0dXJuIF9zdXBlcjcuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfQorCisgIHJldHVybiBBYm9ydEV4Y2VwdGlvbjsKK30oQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuQWJvcnRFeGNlcHRpb24gPSBBYm9ydEV4Y2VwdGlvbjsKK3ZhciBOdWxsQ2hhcmFjdGVyc1JlZ0V4cCA9IC9ceDAwL2c7CisKK2Z1bmN0aW9uIHJlbW92ZU51bGxDaGFyYWN0ZXJzKHN0cikgeworICBpZiAodHlwZW9mIHN0ciAhPT0gInN0cmluZyIpIHsKKyAgICB3YXJuKCJUaGUgYXJndW1lbnQgZm9yIHJlbW92ZU51bGxDaGFyYWN0ZXJzIG11c3QgYmUgYSBzdHJpbmcuIik7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIHJldHVybiBzdHIucmVwbGFjZShOdWxsQ2hhcmFjdGVyc1JlZ0V4cCwgIiIpOworfQorCitmdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7CisgIGFzc2VydChieXRlcyAhPT0gbnVsbCAmJiBfdHlwZW9mKGJ5dGVzKSA9PT0gIm9iamVjdCIgJiYgYnl0ZXMubGVuZ3RoICE9PSB1bmRlZmluZWQsICJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7CisgIHZhciBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisgIHZhciBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyOworCisgIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKKyAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7CisgIH0KKworICB2YXIgc3RyQnVmID0gW107CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7CisgICAgdmFyIGNodW5rRW5kID0gTWF0aC5taW4oaSArIE1BWF9BUkdVTUVOVF9DT1VOVCwgbGVuZ3RoKTsKKyAgICB2YXIgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7CisgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpOworICB9CisKKyAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHsKKyAgYXNzZXJ0KHR5cGVvZiBzdHIgPT09ICJzdHJpbmciLCAiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpOworICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDsKKyAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKKworICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7CisgIH0KKworICByZXR1cm4gYnl0ZXM7Cit9CisKK2Z1bmN0aW9uIGFycmF5Qnl0ZUxlbmd0aChhcnIpIHsKKyAgaWYgKGFyci5sZW5ndGggIT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybiBhcnIubGVuZ3RoOworICB9CisKKyAgYXNzZXJ0KGFyci5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQsICJhcnJheUJ5dGVMZW5ndGggLSBpbnZhbGlkIGFyZ3VtZW50LiIpOworICByZXR1cm4gYXJyLmJ5dGVMZW5ndGg7Cit9CisKK2Z1bmN0aW9uIGFycmF5c1RvQnl0ZXMoYXJyKSB7CisgIHZhciBsZW5ndGggPSBhcnIubGVuZ3RoOworCisgIGlmIChsZW5ndGggPT09IDEgJiYgYXJyWzBdIGluc3RhbmNlb2YgVWludDhBcnJheSkgeworICAgIHJldHVybiBhcnJbMF07CisgIH0KKworICB2YXIgcmVzdWx0TGVuZ3RoID0gMDsKKworICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgcmVzdWx0TGVuZ3RoICs9IGFycmF5Qnl0ZUxlbmd0aChhcnJbaV0pOworICB9CisKKyAgdmFyIHBvcyA9IDA7CisgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0TGVuZ3RoKTsKKworICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuZ3RoOyBfaSsrKSB7CisgICAgdmFyIGl0ZW0gPSBhcnJbX2ldOworCisgICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7CisgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CisgICAgICAgIGl0ZW0gPSBzdHJpbmdUb0J5dGVzKGl0ZW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaXRlbSA9IG5ldyBVaW50OEFycmF5KGl0ZW0pOworICAgICAgfQorICAgIH0KKworICAgIHZhciBpdGVtTGVuZ3RoID0gaXRlbS5ieXRlTGVuZ3RoOworICAgIGRhdGEuc2V0KGl0ZW0sIHBvcyk7CisgICAgcG9zICs9IGl0ZW1MZW5ndGg7CisgIH0KKworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHsKKyAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOworfQorCitmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHsKKyAgdmFyIGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTsKKyAgYnVmZmVyOFswXSA9IDE7CisgIHZhciB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpOworICByZXR1cm4gdmlldzMyWzBdID09PSAxOworfQorCit2YXIgSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSB7CisgIGdldCB2YWx1ZSgpIHsKKyAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2YWx1ZSIsIGlzTGl0dGxlRW5kaWFuKCkpOworICB9CisKK307CitleHBvcnRzLklzTGl0dGxlRW5kaWFuQ2FjaGVkID0gSXNMaXR0bGVFbmRpYW5DYWNoZWQ7CisKK2Z1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHsKKyAgdHJ5IHsKKyAgICBuZXcgRnVuY3Rpb24oIiIpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZhciBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSB7CisgIGdldCB2YWx1ZSgpIHsKKyAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2YWx1ZSIsIGlzRXZhbFN1cHBvcnRlZCgpKTsKKyAgfQorCit9OworZXhwb3J0cy5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQ7Cit2YXIgcmdiQnVmID0gWyJyZ2IoIiwgMCwgIiwiLCAwLCAiLCIsIDAsICIpIl07CisKK3ZhciBVdGlsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gVXRpbCgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVXRpbCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoVXRpbCwgbnVsbCwgW3sKKyAgICBrZXk6ICJtYWtlQ3NzUmdiIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbWFrZUNzc1JnYihyLCBnLCBiKSB7CisgICAgICByZ2JCdWZbMV0gPSByOworICAgICAgcmdiQnVmWzNdID0gZzsKKyAgICAgIHJnYkJ1Zls1XSA9IGI7CisgICAgICByZXR1cm4gcmdiQnVmLmpvaW4oIiIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRyYW5zZm9ybSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHRyYW5zZm9ybShtMSwgbTIpIHsKKyAgICAgIHJldHVybiBbbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLCBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSwgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV1dOworICAgIH0KKyAgfSwgeworICAgIGtleTogImFwcGx5VHJhbnNmb3JtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm0ocCwgbSkgeworICAgICAgdmFyIHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07CisgICAgICB2YXIgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTsKKyAgICAgIHJldHVybiBbeHQsIHl0XTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJhcHBseUludmVyc2VUcmFuc2Zvcm0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseUludmVyc2VUcmFuc2Zvcm0ocCwgbSkgeworICAgICAgdmFyIGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOworICAgICAgdmFyIHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7CisgICAgICB2YXIgeXQgPSAoLXBbMF0gKiBtWzFdICsgcFsxXSAqIG1bMF0gKyBtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQ7CisgICAgICByZXR1cm4gW3h0LCB5dF07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3giLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChyLCBtKSB7CisgICAgICB2YXIgcDEgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHIsIG0pOworICAgICAgdmFyIHAyID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLnNsaWNlKDIsIDQpLCBtKTsKKyAgICAgIHZhciBwMyA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JbMF0sIHJbM11dLCBtKTsKKyAgICAgIHZhciBwNCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JbMl0sIHJbMV1dLCBtKTsKKyAgICAgIHJldHVybiBbTWF0aC5taW4ocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1pbihwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5tYXgocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpbnZlcnNlVHJhbnNmb3JtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaW52ZXJzZVRyYW5zZm9ybShtKSB7CisgICAgICB2YXIgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07CisgICAgICByZXR1cm4gW21bM10gLyBkLCAtbVsxXSAvIGQsIC1tWzJdIC8gZCwgbVswXSAvIGQsIChtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQsIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGRdOworICAgIH0KKyAgfSwgeworICAgIGtleTogImFwcGx5M2RUcmFuc2Zvcm0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseTNkVHJhbnNmb3JtKG0sIHYpIHsKKyAgICAgIHJldHVybiBbbVswXSAqIHZbMF0gKyBtWzFdICogdlsxXSArIG1bMl0gKiB2WzJdLCBtWzNdICogdlswXSArIG1bNF0gKiB2WzFdICsgbVs1XSAqIHZbMl0sIG1bNl0gKiB2WzBdICsgbVs3XSAqIHZbMV0gKyBtWzhdICogdlsyXV07CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7CisgICAgICB2YXIgdHJhbnNwb3NlID0gW21bMF0sIG1bMl0sIG1bMV0sIG1bM11dOworICAgICAgdmFyIGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTsKKyAgICAgIHZhciBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107CisgICAgICB2YXIgYyA9IG1bMl0gKiB0cmFuc3Bvc2VbMF0gKyBtWzNdICogdHJhbnNwb3NlWzJdOworICAgICAgdmFyIGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTsKKyAgICAgIHZhciBmaXJzdCA9IChhICsgZCkgLyAyOworICAgICAgdmFyIHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICogKGEgKyBkKSAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjsKKyAgICAgIHZhciBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7CisgICAgICB2YXIgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxOworICAgICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJub3JtYWxpemVSZWN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbm9ybWFsaXplUmVjdChyZWN0KSB7CisgICAgICB2YXIgciA9IHJlY3Quc2xpY2UoMCk7CisKKyAgICAgIGlmIChyZWN0WzBdID4gcmVjdFsyXSkgeworICAgICAgICByWzBdID0gcmVjdFsyXTsKKyAgICAgICAgclsyXSA9IHJlY3RbMF07CisgICAgICB9CisKKyAgICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkgeworICAgICAgICByWzFdID0gcmVjdFszXTsKKyAgICAgICAgclszXSA9IHJlY3RbMV07CisgICAgICB9CisKKyAgICAgIHJldHVybiByOworICAgIH0KKyAgfSwgeworICAgIGtleTogImludGVyc2VjdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHsKKyAgICAgIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikgeworICAgICAgICByZXR1cm4gYSAtIGI7CisgICAgICB9CisKKyAgICAgIHZhciBvcmRlcmVkWCA9IFtyZWN0MVswXSwgcmVjdDFbMl0sIHJlY3QyWzBdLCByZWN0MlsyXV0uc29ydChjb21wYXJlKTsKKyAgICAgIHZhciBvcmRlcmVkWSA9IFtyZWN0MVsxXSwgcmVjdDFbM10sIHJlY3QyWzFdLCByZWN0MlszXV0uc29ydChjb21wYXJlKTsKKyAgICAgIHZhciByZXN1bHQgPSBbXTsKKyAgICAgIHJlY3QxID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QxKTsKKyAgICAgIHJlY3QyID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QyKTsKKworICAgICAgaWYgKG9yZGVyZWRYWzBdID09PSByZWN0MVswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDJbMF0gfHwgb3JkZXJlZFhbMF0gPT09IHJlY3QyWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MVswXSkgeworICAgICAgICByZXN1bHRbMF0gPSBvcmRlcmVkWFsxXTsKKyAgICAgICAgcmVzdWx0WzJdID0gb3JkZXJlZFhbMl07CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKG9yZGVyZWRZWzBdID09PSByZWN0MVsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDJbMV0gfHwgb3JkZXJlZFlbMF0gPT09IHJlY3QyWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MVsxXSkgeworICAgICAgICByZXN1bHRbMV0gPSBvcmRlcmVkWVsxXTsKKyAgICAgICAgcmVzdWx0WzNdID0gb3JkZXJlZFlbMl07CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gVXRpbDsKK30oKTsKKworZXhwb3J0cy5VdGlsID0gVXRpbDsKK3ZhciBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJEOCwgMHgyQzcsIDB4MkM2LCAweDJEOSwgMHgyREQsIDB4MkRCLCAweDJEQSwgMHgyREMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNBLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFFLCAweDIwMUMsIDB4MjAxRCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQSwgMHgyMTIyLCAweEZCMDEsIDB4RkIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdELCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN0UsIDAsIDB4MjBBQ107CisKK2Z1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikgeworICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aCwKKyAgICAgIHN0ckJ1ZiA9IFtdOworCisgIGlmIChzdHJbMF0gPT09ICJceEZFIiAmJiBzdHJbMV0gPT09ICJceEZGIikgeworICAgIGZvciAodmFyIGkgPSAyOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoaSkgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkgKyAxKSkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJbMF0gPT09ICJceEZGIiAmJiBzdHJbMV0gPT09ICJceEZFIikgeworICAgIGZvciAodmFyIF9pMiA9IDI7IF9pMiA8IGxlbmd0aDsgX2kyICs9IDIpIHsKKyAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoX2kyICsgMSkgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KF9pMikpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbGVuZ3RoOyArK19pMykgeworICAgICAgdmFyIGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChfaTMpXTsKKyAgICAgIHN0ckJ1Zi5wdXNoKGNvZGUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpIDogc3RyLmNoYXJBdChfaTMpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyQnVmLmpvaW4oIiIpOworfQorCitmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKSB7CisgIHJldHVybiBzdHIucmVwbGFjZSgvKFtcKFwpXFxdKS9nLCAiXFwkMSIpOworfQorCitmdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7CisgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpOworfQorCitmdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7CisgIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7Cit9CisKK2Z1bmN0aW9uIGlzQm9vbCh2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gImJvb2xlYW4iOworfQorCitmdW5jdGlvbiBpc051bSh2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gIm51bWJlciI7Cit9CisKK2Z1bmN0aW9uIGlzU3RyaW5nKHYpIHsKKyAgcmV0dXJuIHR5cGVvZiB2ID09PSAic3RyaW5nIjsKK30KKworZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2KSB7CisgIHJldHVybiBfdHlwZW9mKHYpID09PSAib2JqZWN0IiAmJiB2ICE9PSBudWxsICYmIHYuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkOworfQorCitmdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikgeworICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIGFycjEuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7CisgICAgcmV0dXJuIGVsZW1lbnQgPT09IGFycjJbaW5kZXhdOworICB9KTsKK30KKworZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpIHsKKyAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBEYXRlKERhdGUubm93KCkpOworICB2YXIgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCAoZGF0ZS5nZXRVVENEYXRlKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpXTsKKyAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKSB7CisgIHZhciBjYXBhYmlsaXR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgdmFyIGlzU2V0dGxlZCA9IGZhbHNlOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2FwYWJpbGl0eSwgInNldHRsZWQiLCB7CisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gaXNTZXR0bGVkOworICAgIH0KKyAgfSk7CisgIGNhcGFiaWxpdHkucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICBjYXBhYmlsaXR5LnJlc29sdmUgPSBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgaXNTZXR0bGVkID0gdHJ1ZTsKKyAgICAgIHJlc29sdmUoZGF0YSk7CisgICAgfTsKKworICAgIGNhcGFiaWxpdHkucmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgaXNTZXR0bGVkID0gdHJ1ZTsKKyAgICAgIHJlamVjdChyZWFzb24pOworICAgIH07CisgIH0pOworICByZXR1cm4gY2FwYWJpbGl0eTsKK30KKwordmFyIGNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTENsb3N1cmUoKSB7CisgIHZhciBkaWdpdHMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iOworICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGRhdGEsIGNvbnRlbnRUeXBlKSB7CisgICAgdmFyIGZvcmNlRGF0YVNjaGVtYSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7CisKKyAgICBpZiAoIWZvcmNlRGF0YVNjaGVtYSAmJiBVUkwuY3JlYXRlT2JqZWN0VVJMKSB7CisgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgICB0eXBlOiBjb250ZW50VHlwZQorICAgICAgfSk7CisgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKKyAgICB9CisKKyAgICB2YXIgYnVmZmVyID0gImRhdGE6Ii5jb25jYXQoY29udGVudFR5cGUsICI7YmFzZTY0LCIpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7CisgICAgICB2YXIgYjEgPSBkYXRhW2ldICYgMHhmZjsKKyAgICAgIHZhciBiMiA9IGRhdGFbaSArIDFdICYgMHhmZjsKKyAgICAgIHZhciBiMyA9IGRhdGFbaSArIDJdICYgMHhmZjsKKyAgICAgIHZhciBkMSA9IGIxID4+IDIsCisgICAgICAgICAgZDIgPSAoYjEgJiAzKSA8PCA0IHwgYjIgPj4gNDsKKyAgICAgIHZhciBkMyA9IGkgKyAxIDwgaWkgPyAoYjIgJiAweGYpIDw8IDIgfCBiMyA+PiA2IDogNjQ7CisgICAgICB2YXIgZDQgPSBpICsgMiA8IGlpID8gYjMgJiAweDNmIDogNjQ7CisgICAgICBidWZmZXIgKz0gZGlnaXRzW2QxXSArIGRpZ2l0c1tkMl0gKyBkaWdpdHNbZDNdICsgZGlnaXRzW2Q0XTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworICB9OworfSgpOworCitleHBvcnRzLmNyZWF0ZU9iamVjdFVSTCA9IGNyZWF0ZU9iamVjdFVSTDsKKworLyoqKi8gfSksCisvKiA2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCit2YXIgX2lzX25vZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAidW5kZWZpbmVkIiB8fCAhZ2xvYmFsVGhpcy5fcGRmanNDb21wYXRpYmlsaXR5Q2hlY2tlZCkgeworICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICJ1bmRlZmluZWQiIHx8IGdsb2JhbFRoaXMuTWF0aCAhPT0gTWF0aCkgeworICAgIGdsb2JhbFRoaXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworICB9CisKKyAgZ2xvYmFsVGhpcy5fcGRmanNDb21wYXRpYmlsaXR5Q2hlY2tlZCA9IHRydWU7CisgIHZhciBoYXNET00gPSAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2Yod2luZG93KSkgPT09ICJvYmplY3QiICYmICh0eXBlb2YgZG9jdW1lbnQgPT09ICJ1bmRlZmluZWQiID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKGRvY3VtZW50KSkgPT09ICJvYmplY3QiOworICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gInVuZGVmaW5lZCIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAiIjsKKyAgdmFyIGlzSUUgPSAvVHJpZGVudC8udGVzdCh1c2VyQWdlbnQpOworCisgIChmdW5jdGlvbiBjaGVja05vZGVCdG9hKCkgeworICAgIGlmIChnbG9iYWxUaGlzLmJ0b2EgfHwgIV9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5idG9hID0gZnVuY3Rpb24gKGNoYXJzKSB7CisgICAgICByZXR1cm4gQnVmZmVyLmZyb20oY2hhcnMsICJiaW5hcnkiKS50b1N0cmluZygiYmFzZTY0Iik7CisgICAgfTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tOb2RlQXRvYigpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5hdG9iIHx8ICFfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuYXRvYiA9IGZ1bmN0aW9uIChpbnB1dCkgeworICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGlucHV0LCAiYmFzZTY0IikudG9TdHJpbmcoImJpbmFyeSIpOworICAgIH07CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrQ2hpbGROb2RlUmVtb3ZlKCkgeworICAgIGlmICghaGFzRE9NKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHR5cGVvZiBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgeworICAgICAgICB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7CisgICAgICB9CisgICAgfTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tET01Ub2tlbkxpc3RBZGRSZW1vdmUoKSB7CisgICAgaWYgKCFoYXNET00gfHwgX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgZGl2LmNsYXNzTGlzdC5hZGQoInRlc3RPbmUiLCAidGVzdFR3byIpOworCisgICAgaWYgKGRpdi5jbGFzc0xpc3QuY29udGFpbnMoInRlc3RPbmUiKSA9PT0gdHJ1ZSAmJiBkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0ZXN0VHdvIikgPT09IHRydWUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgT3JpZ2luYWxET01Ub2tlbkxpc3RBZGQgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZDsKKyAgICB2YXIgT3JpZ2luYWxET01Ub2tlbkxpc3RSZW1vdmUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZTsKKworICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKCkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHRva2VucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKKyAgICAgICAgdG9rZW5zW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBfaSA9IDAsIF90b2tlbnMgPSB0b2tlbnM7IF9pIDwgX3Rva2Vucy5sZW5ndGg7IF9pKyspIHsKKyAgICAgICAgdmFyIHRva2VuID0gX3Rva2Vuc1tfaV07CisgICAgICAgIE9yaWdpbmFsRE9NVG9rZW5MaXN0QWRkLmNhbGwodGhpcywgdG9rZW4pOworICAgICAgfQorICAgIH07CisKKyAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgdG9rZW5zID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CisgICAgICAgIHRva2Vuc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBfaTIgPSAwLCBfdG9rZW5zMiA9IHRva2VuczsgX2kyIDwgX3Rva2VuczIubGVuZ3RoOyBfaTIrKykgeworICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5zMltfaTJdOworICAgICAgICBPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZS5jYWxsKHRoaXMsIHRva2VuKTsKKyAgICAgIH0KKyAgICB9OworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpIHsKKyAgICBpZiAoIWhhc0RPTSB8fCBfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworICAgIGlmIChkaXYuY2xhc3NMaXN0LnRvZ2dsZSgidGVzdCIsIDApID09PSBmYWxzZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHRva2VuKSB7CisgICAgICB2YXIgZm9yY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/ICEhYXJndW1lbnRzWzFdIDogIXRoaXMuY29udGFpbnModG9rZW4pOworICAgICAgcmV0dXJuIHRoaXNbZm9yY2UgPyAiYWRkIiA6ICJyZW1vdmUiXSh0b2tlbiksIGZvcmNlOworICAgIH07CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrV2luZG93SGlzdG9yeVB1c2hTdGF0ZVJlcGxhY2VTdGF0ZSgpIHsKKyAgICBpZiAoIWhhc0RPTSB8fCAhaXNJRSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBPcmlnaW5hbFB1c2hTdGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZTsKKyAgICB2YXIgT3JpZ2luYWxSZXBsYWNlU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGU7CisKKyAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHsKKyAgICAgIHZhciBhcmdzID0gdXJsID09PSB1bmRlZmluZWQgPyBbc3RhdGUsIHRpdGxlXSA6IFtzdGF0ZSwgdGl0bGUsIHVybF07CisgICAgICBPcmlnaW5hbFB1c2hTdGF0ZS5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICB9OworCisgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7CisgICAgICB2YXIgYXJncyA9IHVybCA9PT0gdW5kZWZpbmVkID8gW3N0YXRlLCB0aXRsZV0gOiBbc3RhdGUsIHRpdGxlLCB1cmxdOworICAgICAgT3JpZ2luYWxSZXBsYWNlU3RhdGUuYXBwbHkodGhpcywgYXJncyk7CisgICAgfTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdTdGFydHNXaXRoKCkgeworICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdFbmRzV2l0aCgpIHsKKyAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oNjQpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1N0cmluZ0luY2x1ZGVzKCkgeworICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg2Nik7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlJbmNsdWRlcygpIHsKKyAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg2OCk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlGcm9tKCkgeworICAgIGlmIChBcnJheS5mcm9tKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg3Nik7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0QXNzaWduKCkgeworICAgIGlmIChPYmplY3QuYXNzaWduKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg5OCk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0RnJvbUVudHJpZXMoKSB7CisgICAgaWYgKE9iamVjdC5mcm9tRW50cmllcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTAxKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tNYXRoTG9nMigpIHsKKyAgICBpZiAoTWF0aC5sb2cyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTWF0aC5sb2cyID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDUpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja051bWJlcklzTmFOKCkgeworICAgIGlmIChOdW1iZXIuaXNOYU4pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBOdW1iZXIuaXNOYU4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNyk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrTnVtYmVySXNJbnRlZ2VyKCkgeworICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTnVtYmVyLmlzSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA5KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tUeXBlZEFycmF5U2xpY2UoKSB7CisgICAgaWYgKFVpbnQ4QXJyYXkucHJvdG90eXBlLnNsaWNlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXygxMTIpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1Byb21pc2UoKSB7CisgICAgaWYgKGdsb2JhbFRoaXMuUHJvbWlzZSAmJiBnbG9iYWxUaGlzLlByb21pc2UuYWxsU2V0dGxlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuUHJvbWlzZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE3KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tVUkwoKSB7CisgICAgZ2xvYmFsVGhpcy5VUkwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzOCk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrUmVhZGFibGVTdHJlYW0oKSB7CisgICAgdmFyIGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIGlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICB0cnkgeworICAgICAgICBuZXcgUmVhZGFibGVTdHJlYW0oeworICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiBzdGFydChjb250cm9sbGVyKSB7CisgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCA9IHRydWU7CisgICAgICB9IGNhdGNoIChlKSB7fQorICAgIH0KKworICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ1KS5SZWFkYWJsZVN0cmVhbTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tNYXBFbnRyaWVzKCkgeworICAgIGlmIChnbG9iYWxUaGlzLk1hcCAmJiBnbG9iYWxUaGlzLk1hcC5wcm90b3R5cGUuZW50cmllcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuTWFwID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDYpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1NldEVudHJpZXMoKSB7CisgICAgaWYgKGdsb2JhbFRoaXMuU2V0ICYmIGdsb2JhbFRoaXMuU2V0LnByb3RvdHlwZS5lbnRyaWVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5TZXQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1Myk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrV2Vha01hcCgpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5XZWFrTWFwID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTUpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1dlYWtTZXQoKSB7CisgICAgaWYgKGdsb2JhbFRoaXMuV2Vha1NldCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuV2Vha1NldCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYxKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdDb2RlUG9pbnRBdCgpIHsKKyAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTYzKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdGcm9tQ29kZVBvaW50KCkgeworICAgIGlmIChTdHJpbmcuZnJvbUNvZGVQb2ludCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZy5mcm9tQ29kZVBvaW50ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjUpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1N5bWJvbCgpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5TeW1ib2wpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDE2Nyk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nUGFkU3RhcnQoKSB7CisgICAgaWYgKFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDE5MCk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nUGFkRW5kKCkgeworICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnBhZEVuZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTk1KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tPYmplY3RWYWx1ZXMoKSB7CisgICAgaWYgKE9iamVjdC52YWx1ZXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPYmplY3QudmFsdWVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTcpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja09iamVjdEVudHJpZXMoKSB7CisgICAgaWYgKE9iamVjdC5lbnRyaWVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgT2JqZWN0LmVudHJpZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMCk7CisgIH0pKCk7Cit9CisKKy8qKiovIH0pLAorLyogNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmlzTm9kZUpTID0gdm9pZCAwOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKwordmFyIGlzTm9kZUpTID0gKHR5cGVvZiBwcm9jZXNzID09PSAidW5kZWZpbmVkIiA/ICJ1bmRlZmluZWQiIDogX3R5cGVvZihwcm9jZXNzKSkgPT09ICJvYmplY3QiICYmIHByb2Nlc3MgKyAiIiA9PT0gIltvYmplY3QgcHJvY2Vzc10iICYmICFwcm9jZXNzLnZlcnNpb25zLm53ICYmICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSAiYnJvd3NlciIpOworZXhwb3J0cy5pc05vZGVKUyA9IGlzTm9kZUpTOworCisvKioqLyB9KSwKKy8qIDggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXyg5KTsKK21vZHVsZS5leHBvcnRzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7CisKKy8qKiovIH0pLAorLyogOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOworJCh7IGdsb2JhbDogdHJ1ZSB9LCB7IGdsb2JhbFRoaXM6IGdsb2JhbCB9KTsKKworLyoqKi8gfSksCisvKiAxMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxMikuZjsKK3ZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI2KTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHNldEdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzApOwordmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQwKTsKK3ZhciBpc0ZvcmNlZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTIpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7CisgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0OworIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDsKKyB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0OworIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7CisgaWYgKEdMT0JBTCkgeworICB0YXJnZXQgPSBnbG9iYWw7CisgfSBlbHNlIGlmIChTVEFUSUMpIHsKKyAgdGFyZ2V0ID0gZ2xvYmFsW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pOworIH0gZWxzZSB7CisgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlOworIH0KKyBpZiAodGFyZ2V0KQorICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKKyAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07CisgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkgeworICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpOworICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlOworICAgfSBlbHNlCisgICAgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTsKKyAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7CisgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7CisgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KQorICAgICBjb250aW51ZTsKKyAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7CisgICB9CisgICBpZiAob3B0aW9ucy5zaGFtIHx8IHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pIHsKKyAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7CisgICB9CisgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpOworICB9Cit9OworCisvKioqLyB9KSwKKy8qIDExICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK3ZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiBpdCAmJiBpdC5NYXRoID09IE1hdGggJiYgaXQ7Cit9OworbW9kdWxlLmV4cG9ydHMgPSBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fCBjaGVjayh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdykgfHwgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHwgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7CisKKy8qKiovIH0pLAorLyogMTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1KTsKK3ZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTsKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciB0b1ByaW1pdGl2ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjEpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIElFOF9ET01fREVGSU5FID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cit2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKK2V4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHsKKyBPID0gdG9JbmRleGVkT2JqZWN0KE8pOworIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKKyBpZiAoSUU4X0RPTV9ERUZJTkUpCisgIHRyeSB7CisgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApOworICB9IGNhdGNoIChlcnJvcikgeworICB9CisgaWYgKGhhcyhPLCBQKSkKKyAgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTsKK307CisKKy8qKiovIH0pLAorLyogMTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cittb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CisgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeworICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiA3OworICB9CisgfSlbMV0gIT0gNzsKK30pOworCisvKioqLyB9KSwKKy8qIDE0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHsKKyB0cnkgeworICByZXR1cm4gISFleGVjKCk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgcmV0dXJuIHRydWU7CisgfQorfTsKKworLyoqKi8gfSksCisvKiAxNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlOwordmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7Cit2YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgIW5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpOworZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7CisgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7CisgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7Cit9IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7CisKKy8qKiovIH0pLAorLyogMTYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkgeworIHJldHVybiB7CisgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksCisgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSwKKyAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksCisgIHZhbHVlOiB2YWx1ZQorIH07Cit9OworCisvKioqLyB9KSwKKy8qIDE3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBJbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjApOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7Cit9OworCisvKioqLyB9KSwKKy8qIDE4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOwordmFyIGNsYXNzb2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciBzcGxpdCA9ICcnLnNwbGl0OworbW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7CisgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTsKK30pID8gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQuY2FsbChpdCwgJycpIDogT2JqZWN0KGl0KTsKK30gOiBPYmplY3Q7CisKKy8qKiovIH0pLAorLyogMTkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKwordmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7Cit9OworCisvKioqLyB9KSwKKy8qIDIwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgaWYgKGl0ID09IHVuZGVmaW5lZCkKKyAgdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiICsgaXQpOworIHJldHVybiBpdDsKK307CisKKy8qKiovIH0pLAorLyogMjEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykgeworIGlmICghaXNPYmplY3QoaW5wdXQpKQorICByZXR1cm4gaW5wdXQ7CisgdmFyIGZuLCB2YWw7CisgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpCisgIHJldHVybiB2YWw7CisgaWYgKHR5cGVvZiAoZm4gPSBpbnB1dC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpCisgIHJldHVybiB2YWw7CisgaWYgKCFQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKQorICByZXR1cm4gdmFsOworIHRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIik7Cit9OworCisvKioqLyB9KSwKKy8qIDIyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJzsKK307CisKKy8qKiovIH0pLAorLyogMjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKwordmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CisgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7Cit9OworCisvKioqLyB9KSwKKy8qIDI0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgY3JlYXRlRWxlbWVudCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpOworbW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHsKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gNzsKKyAgfQorIH0pLmEgIT0gNzsKK30pOworCisvKioqLyB9KSwKKy8qIDI1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50OwordmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307Cit9OworCisvKioqLyB9KSwKKy8qIDI2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyNyk7Cit2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cittb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkgeworIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTsKK30gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7Cisgb2JqZWN0W2tleV0gPSB2YWx1ZTsKKyByZXR1cm4gb2JqZWN0OworfTsKKworLyoqKi8gfSksCisvKiAyNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBJRThfRE9NX0RFRklORSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjQpOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7Cit2YXIgdG9QcmltaXRpdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxKTsKK3ZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK2V4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7CisgYW5PYmplY3QoTyk7CisgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpOworIGFuT2JqZWN0KEF0dHJpYnV0ZXMpOworIGlmIChJRThfRE9NX0RFRklORSkKKyAgdHJ5IHsKKyAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgfQorIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpCisgIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTsKKyBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKQorICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTsKKyByZXR1cm4gTzsKK307CisKKy8qKiovIH0pLAorLyogMjggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIGlmICghaXNPYmplY3QoaXQpKSB7CisgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7CisgfQorIHJldHVybiBpdDsKK307CisKKy8qKiovIH0pLAorLyogMjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIHNldEdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzApOwordmFyIGluc3BlY3RTb3VyY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMxKTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0OwordmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlOwordmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpOworKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHsKKyB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTsKKyB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7CisgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlOworIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgeworICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiAhaGFzKHZhbHVlLCAnbmFtZScpKQorICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIGtleSk7CisgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7CisgfQorIGlmIChPID09PSBnbG9iYWwpIHsKKyAgaWYgKHNpbXBsZSkKKyAgIE9ba2V5XSA9IHZhbHVlOworICBlbHNlCisgICBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7CisgIHJldHVybjsKKyB9IGVsc2UgaWYgKCF1bnNhZmUpIHsKKyAgZGVsZXRlIE9ba2V5XTsKKyB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHsKKyAgc2ltcGxlID0gdHJ1ZTsKKyB9CisgaWYgKHNpbXBsZSkKKyAgT1trZXldID0gdmFsdWU7CisgZWxzZQorICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7Cit9KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7Cit9KTsKKworLyoqKi8gfSksCisvKiAzMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgdHJ5IHsKKyAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbCwga2V5LCB2YWx1ZSk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgZ2xvYmFsW2tleV0gPSB2YWx1ZTsKKyB9CisgcmV0dXJuIHZhbHVlOworfTsKKworLyoqKi8gfSksCisvKiAzMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgc3RvcmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMyKTsKK3ZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmc7CitpZiAodHlwZW9mIHN0b3JlLmluc3BlY3RTb3VyY2UgIT0gJ2Z1bmN0aW9uJykgeworIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7CisgfTsKK30KK21vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTsKKworLyoqKi8gfSksCisvKiAzMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgc2V0R2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygzMCk7Cit2YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7Cit2YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7Cittb2R1bGUuZXhwb3J0cyA9IHN0b3JlOworCisvKioqLyB9KSwKKy8qIDMzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBOQVRJVkVfV0VBS19NQVAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM0KTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIG9iamVjdEhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIHNoYXJlZEtleSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzUpOwordmFyIGhpZGRlbktleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK3ZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7Cit2YXIgc2V0LCBnZXQsIGhhczsKK3ZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7Cit9OwordmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7CisgcmV0dXJuIGZ1bmN0aW9uIChpdCkgeworICB2YXIgc3RhdGU7CisgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHsKKyAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTsKKyAgfQorICByZXR1cm4gc3RhdGU7CisgfTsKK307CitpZiAoTkFUSVZFX1dFQUtfTUFQKSB7CisgdmFyIHN0b3JlID0gbmV3IFdlYWtNYXAoKTsKKyB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7CisgdmFyIHdtaGFzID0gc3RvcmUuaGFzOworIHZhciB3bXNldCA9IHN0b3JlLnNldDsKKyBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7CisgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7CisgIHJldHVybiBtZXRhZGF0YTsKKyB9OworIGdldCA9IGZ1bmN0aW9uIChpdCkgeworICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSwgaXQpIHx8IHt9OworIH07CisgaGFzID0gZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7CisgfTsKK30gZWxzZSB7CisgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpOworIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTsKKyBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7CisgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTsKKyAgcmV0dXJuIG1ldGFkYXRhOworIH07CisgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9OworIH07CisgaGFzID0gZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTsKKyB9OworfQorbW9kdWxlLmV4cG9ydHMgPSB7Cisgc2V0OiBzZXQsCisgZ2V0OiBnZXQsCisgaGFzOiBoYXMsCisgZW5mb3JjZTogZW5mb3JjZSwKKyBnZXR0ZXJGb3I6IGdldHRlckZvcgorfTsKKworLyoqKi8gfSksCisvKiAzNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgaW5zcGVjdFNvdXJjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzEpOwordmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDsKK21vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCkpOworCisvKioqLyB9KSwKKy8qIDM1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBzaGFyZWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM2KTsKK3ZhciB1aWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKK3ZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHsKKyByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7Cit9OworCisvKioqLyB9KSwKKy8qIDM2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBJU19QVVJFID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7Cit2YXIgc3RvcmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMyKTsKKyhtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7Cit9KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7CisgdmVyc2lvbjogJzMuNi41JywKKyBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsCisgY29weXJpZ2h0OiAnwqkgMjAyMCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScKK30pOworCisvKioqLyB9KSwKKy8qIDM3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZmFsc2U7CisKKy8qKiovIH0pLAorLyogMzggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKwordmFyIGlkID0gMDsKK3ZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkgeworIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNik7Cit9OworCisvKioqLyB9KSwKKy8qIDM5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0ge307CisKKy8qKiovIH0pLAorLyogNDAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIG93bktleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQxKTsKK3ZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjcpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHsKKyB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTsKKyB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOworIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjsKKyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgdmFyIGtleSA9IGtleXNbaV07CisgIGlmICghaGFzKHRhcmdldCwga2V5KSkKKyAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsKKyB9Cit9OworCisvKioqLyB9KSwKKy8qIDQxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Mik7Cit2YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNDQpOwordmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNTEpOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7Cittb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHsKKyB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpOworIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjsKKyByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzOworfTsKKworLyoqKi8gfSksCisvKiA0MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkgeworIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkOworfTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7CisgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKSA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdOworfTsKKworLyoqKi8gfSksCisvKiA0MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cittb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDsKKworLyoqKi8gfSksCisvKiA0NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NSk7Cit2YXIgZW51bUJ1Z0tleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUwKTsKK3ZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7CitleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHsKKyByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpOworfTsKKworLyoqKi8gfSksCisvKiA0NSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNyk7Cit2YXIgaW5kZXhPZiA9IF9fd19wZGZqc19yZXF1aXJlX18oNDYpLmluZGV4T2Y7Cit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykgeworIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7CisgdmFyIGkgPSAwOworIHZhciByZXN1bHQgPSBbXTsKKyB2YXIga2V5OworIGZvciAoa2V5IGluIE8pCisgICFoYXMoaGlkZGVuS2V5cywga2V5KSAmJiBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpOworIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKQorICBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7CisgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTsKKyAgfQorIHJldHVybiByZXN1bHQ7Cit9OworCisvKioqLyB9KSwKKy8qIDQ2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDkpOwordmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykgeworIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHsKKyAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpOworICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpOworICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpOworICB2YXIgdmFsdWU7CisgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkKKyAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgeworICAgIHZhbHVlID0gT1tpbmRleCsrXTsKKyAgICBpZiAodmFsdWUgIT0gdmFsdWUpCisgICAgIHJldHVybiB0cnVlOworICAgfQorICBlbHNlCisgICBmb3IgKDsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHsKKyAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkKKyAgICAgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7CisgICB9CisgIHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7CisgfTsKK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLAorIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSkKK307CisKKy8qKiovIH0pLAorLyogNDcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHRvSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNDgpOwordmFyIG1pbiA9IE1hdGgubWluOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKKyByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlcihhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsKK307CisKKy8qKiovIH0pLAorLyogNDggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKwordmFyIGNlaWwgPSBNYXRoLmNlaWw7Cit2YXIgZmxvb3IgPSBNYXRoLmZsb29yOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKKyByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTsKK307CisKKy8qKiovIH0pLAorLyogNDkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHRvSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNDgpOwordmFyIG1heCA9IE1hdGgubWF4OwordmFyIG1pbiA9IE1hdGgubWluOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkgeworIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTsKKyByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTsKK307CisKKy8qKiovIH0pLAorLyogNTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBbCisgJ2NvbnN0cnVjdG9yJywKKyAnaGFzT3duUHJvcGVydHknLAorICdpc1Byb3RvdHlwZU9mJywKKyAncHJvcGVydHlJc0VudW1lcmFibGUnLAorICd0b0xvY2FsZVN0cmluZycsCisgJ3RvU3RyaW5nJywKKyAndmFsdWVPZicKK107CisKKy8qKiovIH0pLAorLyogNTEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczsKKworLyoqKi8gfSksCisvKiA1MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciByZXBsYWNlbWVudCA9IC8jfFwucHJvdG90eXBlXC4vOwordmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikgeworIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTsKKyByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2UgOiB0eXBlb2YgZGV0ZWN0aW9uID09ICdmdW5jdGlvbicgPyBmYWlscyhkZXRlY3Rpb24pIDogISFkZXRlY3Rpb247Cit9OwordmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKKyByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpOworfTsKK3ZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9OwordmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJzsKK3ZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnOworbW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDsKKworLyoqKi8gfSksCisvKiA1MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDU0KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjEpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3N0YXJ0c1dpdGgnKTsKKworLyoqKi8gfSksCisvKiA1NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxMikuZjsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIG5vdEFSZWdFeHAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU1KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7Cit2YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYwKTsKK3ZhciBJU19QVVJFID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7Cit2YXIgbmF0aXZlU3RhcnRzV2l0aCA9ICcnLnN0YXJ0c1dpdGg7Cit2YXIgbWluID0gTWF0aC5taW47Cit2YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpOwordmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7CisgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSwgJ3N0YXJ0c1dpdGgnKTsKKyByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTsKK30oKTsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMKK30sIHsKKyBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZykgeworICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTsKKyAgbm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpOworICB2YXIgaW5kZXggPSB0b0xlbmd0aChtaW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7CisgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTsKKyAgcmV0dXJuIG5hdGl2ZVN0YXJ0c1dpdGggPyBuYXRpdmVTdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleCkgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogNTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzUmVnRXhwID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIGlmIChpc1JlZ0V4cChpdCkpIHsKKyAgdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTsKKyB9CisgcmV0dXJuIGl0OworfTsKKworLyoqKi8gfSksCisvKiA1NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaXNPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyKTsKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIHZhciBpc1JlZ0V4cDsKKyByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT0gJ1JlZ0V4cCcpOworfTsKKworLyoqKi8gfSksCisvKiA1NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgc2hhcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygzNik7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgdWlkID0gX193X3BkZmpzX3JlcXVpcmVfXygzOCk7Cit2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTgpOwordmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OSk7Cit2YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTsKK3ZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sOwordmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHsKKyBpZiAoIWhhcyhXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpKSB7CisgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKQorICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gU3ltYm9sW25hbWVdOworICBlbHNlCisgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7CisgfQorIHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07Cit9OworCisvKioqLyB9KSwKKy8qIDU4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOworbW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gIVN0cmluZyhTeW1ib2woKSk7Cit9KTsKKworLyoqKi8gfSksCisvKiA1OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTgpOworbW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MICYmICFTeW1ib2wuc2hhbSAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnOworCisvKioqLyB9KSwKKy8qIDYwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7CisgdmFyIHJlZ2V4cCA9IC8uLzsKKyB0cnkgeworICAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTsKKyB9IGNhdGNoIChlKSB7CisgIHRyeSB7CisgICByZWdleHBbTUFUQ0hdID0gZmFsc2U7CisgICByZXR1cm4gJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7CisgIH0gY2F0Y2ggKGYpIHsKKyAgfQorIH0KKyByZXR1cm4gZmFsc2U7Cit9OworCisvKioqLyB9KSwKKy8qIDYxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBiaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Mik7Cit2YXIgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9ELCBsZW5ndGgpIHsKKyByZXR1cm4gYmluZChjYWxsLCBnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdLCBsZW5ndGgpOworfTsKKworLyoqKi8gfSksCisvKiA2MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYUZ1bmN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Myk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7CisgYUZ1bmN0aW9uKGZuKTsKKyBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKQorICByZXR1cm4gZm47Cisgc3dpdGNoIChsZW5ndGgpIHsKKyBjYXNlIDA6CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gZm4uY2FsbCh0aGF0KTsKKyAgfTsKKyBjYXNlIDE6CisgIHJldHVybiBmdW5jdGlvbiAoYSkgeworICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7CisgIH07CisgY2FzZSAyOgorICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHsKKyAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpOworICB9OworIGNhc2UgMzoKKyAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7CisgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTsKKyAgfTsKKyB9CisgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7CisgfTsKK307CisKKy8qKiovIH0pLAorLyogNjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHsKKyAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7CisgfQorIHJldHVybiBpdDsKK307CisKKy8qKiovIH0pLAorLyogNjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXyg2NSk7Cit2YXIgZW50cnlVbmJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYxKTsKK21vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdlbmRzV2l0aCcpOworCisvKioqLyB9KSwKKy8qIDY1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKS5mOwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nyk7Cit2YXIgbm90QVJlZ0V4cCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTUpOwordmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwKTsKK3ZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IF9fd19wZGZqc19yZXF1aXJlX18oNjApOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBuYXRpdmVFbmRzV2l0aCA9ICcnLmVuZHNXaXRoOwordmFyIG1pbiA9IE1hdGgubWluOwordmFyIENPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDID0gY29ycmVjdElzUmVnRXhwTG9naWMoJ2VuZHNXaXRoJyk7Cit2YXIgTUROX1BPTFlGSUxMX0JVRyA9ICFJU19QVVJFICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyAmJiAhIWZ1bmN0aW9uICgpIHsKKyB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnKTsKKyByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTsKK30oKTsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMKK30sIHsKKyBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nKSB7CisgIHZhciB0aGF0ID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpOworICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7CisgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOworICB2YXIgbGVuID0gdG9MZW5ndGgodGhhdC5sZW5ndGgpOworICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IG1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7CisgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTsKKyAgcmV0dXJuIG5hdGl2ZUVuZHNXaXRoID8gbmF0aXZlRW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZCkgOiB0aGF0LnNsaWNlKGVuZCAtIHNlYXJjaC5sZW5ndGgsIGVuZCkgPT09IHNlYXJjaDsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiA2NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDY3KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjEpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ2luY2x1ZGVzJyk7CisKKy8qKiovIH0pLAorLyogNjcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIG5vdEFSZWdFeHAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU1KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7Cit2YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYwKTsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykKK30sIHsKKyBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nKSB7CisgIHJldHVybiAhIX5TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSkuaW5kZXhPZihub3RBUmVnRXhwKHNlYXJjaFN0cmluZyksIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiA2OCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDY5KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjEpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnaW5jbHVkZXMnKTsKKworLyoqKi8gfSksCisvKiA2OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgJGluY2x1ZGVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NikuaW5jbHVkZXM7Cit2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzApOwordmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg3NSk7Cit2YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnaW5kZXhPZicsIHsKKyBBQ0NFU1NPUlM6IHRydWUsCisgMTogMAorfSk7CiskKHsKKyB0YXJnZXQ6ICdBcnJheScsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhVVNFU19UT19MRU5HVEgKK30sIHsKKyBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwpIHsKKyAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOworIH0KK30pOworYWRkVG9VbnNjb3BhYmxlcygnaW5jbHVkZXMnKTsKKworLyoqKi8gfSksCisvKiA3MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgY3JlYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXyg3MSk7Cit2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KTsKK3ZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTsKK3ZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTsKK2lmIChBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSB7CisgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHsKKyAgY29uZmlndXJhYmxlOiB0cnVlLAorICB2YWx1ZTogY3JlYXRlKG51bGwpCisgfSk7Cit9Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHsKKyBBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7Cit9OworCisvKioqLyB9KSwKKy8qIDcxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjgpOwordmFyIGRlZmluZVByb3BlcnRpZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcyKTsKK3ZhciBlbnVtQnVnS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTApOwordmFyIGhpZGRlbktleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK3ZhciBodG1sID0gX193X3BkZmpzX3JlcXVpcmVfXyg3NCk7Cit2YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7Cit2YXIgc2hhcmVkS2V5ID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7Cit2YXIgR1QgPSAnPic7Cit2YXIgTFQgPSAnPCc7Cit2YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7Cit2YXIgU0NSSVBUID0gJ3NjcmlwdCc7Cit2YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7Cit2YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsKK307Cit2YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHsKKyByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUOworfTsKK3ZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkgeworIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTsKKyBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTsKKyB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0OworIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7CisgcmV0dXJuIHRlbXA7Cit9OwordmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKKyB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7CisgdmFyIGlmcmFtZURvY3VtZW50OworIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTsKKyBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTsKKyBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OworIGlmcmFtZURvY3VtZW50Lm9wZW4oKTsKKyBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpOworIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7CisgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7Cit9OwordmFyIGFjdGl2ZVhEb2N1bWVudDsKK3ZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7CisgdHJ5IHsKKyAgYWN0aXZlWERvY3VtZW50ID0gZG9jdW1lbnQuZG9tYWluICYmIG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpOworIH0gY2F0Y2ggKGVycm9yKSB7CisgfQorIE51bGxQcm90b09iamVjdCA9IGFjdGl2ZVhEb2N1bWVudCA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpOworIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7Cisgd2hpbGUgKGxlbmd0aC0tKQorICBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07CisgcmV0dXJuIE51bGxQcm90b09iamVjdCgpOworfTsKK2hpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTsKK21vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykgeworIHZhciByZXN1bHQ7CisgaWYgKE8gIT09IG51bGwpIHsKKyAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7CisgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7CisgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7CisgIHJlc3VsdFtJRV9QUk9UT10gPSBPOworIH0gZWxzZQorICByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTsKKyByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpOworfTsKKworLyoqKi8gfSksCisvKiA3MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjcpOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7Cit2YXIgb2JqZWN0S2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzMpOworbW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7CisgYW5PYmplY3QoTyk7CisgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpOworIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKKyB2YXIgaW5kZXggPSAwOworIHZhciBrZXk7Cisgd2hpbGUgKGxlbmd0aCA+IGluZGV4KQorICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7CisgcmV0dXJuIE87Cit9OworCisvKioqLyB9KSwKKy8qIDczICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ1KTsKK3ZhciBlbnVtQnVnS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTApOworbW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHsKKyByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTsKK307CisKKy8qKiovIH0pLAorLyogNzQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKTsKK21vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7CisKKy8qKiovIH0pLAorLyogNzUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK3ZhciBjYWNoZSA9IHt9OwordmFyIHRocm93ZXIgPSBmdW5jdGlvbiAoaXQpIHsKKyB0aHJvdyBpdDsKK307Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgb3B0aW9ucykgeworIGlmIChoYXMoY2FjaGUsIE1FVEhPRF9OQU1FKSkKKyAgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXTsKKyBpZiAoIW9wdGlvbnMpCisgIG9wdGlvbnMgPSB7fTsKKyB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdOworIHZhciBBQ0NFU1NPUlMgPSBoYXMob3B0aW9ucywgJ0FDQ0VTU09SUycpID8gb3B0aW9ucy5BQ0NFU1NPUlMgOiBmYWxzZTsKKyB2YXIgYXJndW1lbnQwID0gaGFzKG9wdGlvbnMsIDApID8gb3B0aW9uc1swXSA6IHRocm93ZXI7CisgdmFyIGFyZ3VtZW50MSA9IGhhcyhvcHRpb25zLCAxKSA/IG9wdGlvbnNbMV0gOiB1bmRlZmluZWQ7CisgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXSA9ICEhbWV0aG9kICYmICFmYWlscyhmdW5jdGlvbiAoKSB7CisgIGlmIChBQ0NFU1NPUlMgJiYgIURFU0NSSVBUT1JTKQorICAgcmV0dXJuIHRydWU7CisgIHZhciBPID0geyBsZW5ndGg6IC0xIH07CisgIGlmIChBQ0NFU1NPUlMpCisgICBkZWZpbmVQcm9wZXJ0eShPLCAxLCB7CisgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICBnZXQ6IHRocm93ZXIKKyAgIH0pOworICBlbHNlCisgICBPWzFdID0gMTsKKyAgbWV0aG9kLmNhbGwoTywgYXJndW1lbnQwLCBhcmd1bWVudDEpOworIH0pOworfTsKKworLyoqKi8gfSksCisvKiA3NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDc3KTsKK19fd19wZGZqc19yZXF1aXJlX18oODkpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tOworCisvKioqLyB9KSwKKy8qIDc3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGNoYXJBdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzgpLmNoYXJBdDsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc5KTsKK3ZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJzsKK3ZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7Cit2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7CitkZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHsKKyBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKKyAgdHlwZTogU1RSSU5HX0lURVJBVE9SLAorICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksCisgIGluZGV4OiAwCisgfSk7Cit9LCBmdW5jdGlvbiBuZXh0KCkgeworIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CisgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZzsKKyB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDsKKyB2YXIgcG9pbnQ7CisgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpCisgIHJldHVybiB7CisgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgZG9uZTogdHJ1ZQorICB9OworIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpOworIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDsKKyByZXR1cm4geworICB2YWx1ZTogcG9pbnQsCisgIGRvbmU6IGZhbHNlCisgfTsKK30pOworCisvKioqLyB9KSwKKy8qIDc4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0ludGVnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ4KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7Cit2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7CisgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7CisgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTsKKyAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7CisgIHZhciBzaXplID0gUy5sZW5ndGg7CisgIHZhciBmaXJzdCwgc2Vjb25kOworICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpCisgICByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDsKKyAgZmlyc3QgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24pOworICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGID8gQ09OVkVSVF9UT19TVFJJTkcgPyBTLmNoYXJBdChwb3NpdGlvbikgOiBmaXJzdCA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7CisgfTsKK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksCisgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSkKK307CisKKy8qKiovIH0pLAorLyogNzkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgwKTsKK3ZhciBnZXRQcm90b3R5cGVPZiA9IF9fd19wZGZqc19yZXF1aXJlX18oODIpOwordmFyIHNldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nyk7Cit2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg1KTsKK3ZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI2KTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBJdGVyYXRvcnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg2KTsKK3ZhciBJdGVyYXRvcnNDb3JlID0gX193X3BkZmpzX3JlcXVpcmVfXyg4MSk7Cit2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlOwordmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7Cit2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7Cit2YXIgS0VZUyA9ICdrZXlzJzsKK3ZhciBWQUxVRVMgPSAndmFsdWVzJzsKK3ZhciBFTlRSSUVTID0gJ2VudHJpZXMnOwordmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7CisgcmV0dXJuIHRoaXM7Cit9OworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7CisgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTsKKyB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHsKKyAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKQorICAgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjsKKyAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpCisgICByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07CisgIHN3aXRjaCAoS0lORCkgeworICBjYXNlIEtFWVM6CisgICByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7CisgICB9OworICBjYXNlIFZBTFVFUzoKKyAgIHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOworICAgfTsKKyAgY2FzZSBFTlRSSUVTOgorICAgcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOworICAgfTsKKyAgfQorICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOworICB9OworIH07CisgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7CisgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlOworIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTsKKyB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXSB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdOworIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7CisgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yOworIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTsKKyBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHsKKyAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpOworICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHsKKyAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkgeworICAgIGlmIChzZXRQcm90b3R5cGVPZikgeworICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHsKKyAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpOworICAgIH0KKyAgIH0KKyAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7CisgICBpZiAoSVNfUFVSRSkKKyAgICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzOworICB9CisgfQorIGlmIChERUZBVUxUID09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHsKKyAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTsKKyAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeworICAgcmV0dXJuIG5hdGl2ZUl0ZXJhdG9yLmNhbGwodGhpcyk7CisgIH07CisgfQorIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikgeworICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpOworIH0KKyBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7CisgaWYgKERFRkFVTFQpIHsKKyAgbWV0aG9kcyA9IHsKKyAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksCisgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksCisgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUykKKyAgfTsKKyAgaWYgKEZPUkNFRCkKKyAgIGZvciAoS0VZIGluIG1ldGhvZHMpIHsKKyAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7CisgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7CisgICAgfQorICAgfQorICBlbHNlCisgICAkKHsKKyAgICB0YXJnZXQ6IE5BTUUsCisgICAgcHJvdG86IHRydWUsCisgICAgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRQorICAgfSwgbWV0aG9kcyk7CisgfQorIHJldHVybiBtZXRob2RzOworfTsKKworLyoqKi8gfSksCisvKiA4MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBJdGVyYXRvclByb3RvdHlwZSA9IF9fd19wZGZqc19yZXF1aXJlX18oODEpLkl0ZXJhdG9yUHJvdG90eXBlOwordmFyIGNyZWF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNzEpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7Cit2YXIgSXRlcmF0b3JzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nik7Cit2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gdGhpczsKK307Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7CisgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7CisgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pOworIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTsKKyBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzOworIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yOworfTsKKworLyoqKi8gfSksCisvKiA4MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBnZXRQcm90b3R5cGVPZiA9IF9fd19wZGZqc19yZXF1aXJlX18oODIpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKK3ZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7Cit2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gdGhpczsKK307Cit2YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjsKK2lmIChbXS5rZXlzKSB7CisgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTsKKyBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpCisgIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlOworIGVsc2UgeworICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7CisgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpCisgICBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTsKKyB9Cit9CitpZiAoSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkKQorIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CitpZiAoIUlTX1BVUkUgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSB7CisgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7Cit9Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsCisgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SUworfTsKKworLyoqKi8gfSksCisvKiA4MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgdG9PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgzKTsKK3ZhciBzaGFyZWRLZXkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM1KTsKK3ZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg0KTsKK3ZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTsKK3ZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlOworbW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykgeworIE8gPSB0b09iamVjdChPKTsKKyBpZiAoaGFzKE8sIElFX1BST1RPKSkKKyAgcmV0dXJuIE9bSUVfUFJPVE9dOworIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7CisgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsKKyB9CisgcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsOworfTsKKworLyoqKi8gfSksCisvKiA4MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjApOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKKyByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTsKK307CisKKy8qKiovIH0pLAorLyogODQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cittb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CisgZnVuY3Rpb24gRigpIHsKKyB9CisgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsOworIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlOworfSk7CisKKy8qKiovIH0pLAorLyogODUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNykuZjsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7CisgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHsKKyAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgIHZhbHVlOiBUQUcKKyAgfSk7CisgfQorfTsKKworLyoqKi8gfSksCisvKiA4NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IHt9OworCisvKioqLyB9KSwKKy8qIDg3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjgpOwordmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IF9fd19wZGZqc19yZXF1aXJlX18oODgpOworbW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkgeworIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlOworIHZhciB0ZXN0ID0ge307CisgdmFyIHNldHRlcjsKKyB0cnkgeworICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7CisgIHNldHRlci5jYWxsKHRlc3QsIFtdKTsKKyAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyB9CisgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7CisgIGFuT2JqZWN0KE8pOworICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pOworICBpZiAoQ09SUkVDVF9TRVRURVIpCisgICBzZXR0ZXIuY2FsbChPLCBwcm90byk7CisgIGVsc2UKKyAgIE8uX19wcm90b19fID0gcHJvdG87CisgIHJldHVybiBPOworIH07Cit9KCkgOiB1bmRlZmluZWQpOworCisvKioqLyB9KSwKKy8qIDg4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAoIWlzT2JqZWN0KGl0KSAmJiBpdCAhPT0gbnVsbCkgeworICB0aHJvdyBUeXBlRXJyb3IoIkNhbid0IHNldCAiICsgU3RyaW5nKGl0KSArICcgYXMgYSBwcm90b3R5cGUnKTsKKyB9CisgcmV0dXJuIGl0OworfTsKKworLyoqKi8gfSksCisvKiA4OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGZyb20gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkwKTsKK3ZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk3KTsKK3ZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsKKyBBcnJheS5mcm9tKGl0ZXJhYmxlKTsKK30pOworJCh7CisgdGFyZ2V0OiAnQXJyYXknLAorIHN0YXQ6IHRydWUsCisgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OCit9LCB7IGZyb206IGZyb20gfSk7CisKKy8qKiovIH0pLAorLyogOTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjIpOwordmFyIHRvT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Myk7Cit2YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd19wZGZqc19yZXF1aXJlX18oOTEpOwordmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTIpOwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nyk7Cit2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkzKTsKK3ZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTQpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSkgeworIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTsKKyB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7CisgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKKyB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7CisgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7CisgdmFyIGluZGV4ID0gMDsKKyB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTsKKyBpZiAobWFwcGluZykKKyAgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTsKKyBpZiAoaXRlcmF0b3JNZXRob2QgIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkgeworICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7CisgIG5leHQgPSBpdGVyYXRvci5uZXh0OworICByZXN1bHQgPSBuZXcgQygpOworICBmb3IgKDsgIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykgeworICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFsKKyAgICBzdGVwLnZhbHVlLAorICAgIGluZGV4CisgICBdLCB0cnVlKSA6IHN0ZXAudmFsdWU7CisgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7CisgIH0KKyB9IGVsc2UgeworICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7CisgIHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7CisgIGZvciAoOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgeworICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdOworICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpOworICB9CisgfQorIHJlc3VsdC5sZW5ndGggPSBpbmRleDsKKyByZXR1cm4gcmVzdWx0OworfTsKKworLyoqKi8gfSksCisvKiA5MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHsKKyB0cnkgeworICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpOworIH0gY2F0Y2ggKGVycm9yKSB7CisgIHZhciByZXR1cm5NZXRob2QgPSBpdGVyYXRvclsncmV0dXJuJ107CisgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkKKyAgIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSk7CisgIHRocm93IGVycm9yOworIH0KK307CisKKy8qKiovIH0pLAorLyogOTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIEl0ZXJhdG9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oODYpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTsKK307CisKKy8qKiovIH0pLAorLyogOTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgdG9QcmltaXRpdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxKTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjcpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7CisgdmFyIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUoa2V5KTsKKyBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KQorICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpOworIGVsc2UKKyAgb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlOworfTsKKworLyoqKi8gfSksCisvKiA5NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oOTUpOwordmFyIEl0ZXJhdG9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oODYpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAoaXQgIT0gdW5kZWZpbmVkKQorICByZXR1cm4gaXRbSVRFUkFUT1JdIHx8IGl0WydAQGl0ZXJhdG9yJ10gfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTsKK307CisKKy8qKiovIH0pLAorLyogOTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTYpOwordmFyIGNsYXNzb2ZSYXcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwordmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7CisgcmV0dXJuIGFyZ3VtZW50czsKK30oKSkgPT0gJ0FyZ3VtZW50cyc7Cit2YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHsKKyB0cnkgeworICByZXR1cm4gaXRba2V5XTsKKyB9IGNhdGNoIChlcnJvcikgeworIH0KK307Cittb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHsKKyB2YXIgTywgdGFnLCByZXN1bHQ7CisgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZyA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKSA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0OworfTsKKworLyoqKi8gfSksCisvKiA5NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKK3ZhciB0ZXN0ID0ge307Cit0ZXN0W1RPX1NUUklOR19UQUddID0gJ3onOworbW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJzsKKworLyoqKi8gfSksCisvKiA5NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7Cit2YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7Cit0cnkgeworIHZhciBjYWxsZWQgPSAwOworIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7CisgIG5leHQ6IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTsKKyAgfSwKKyAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHsKKyAgIFNBRkVfQ0xPU0lORyA9IHRydWU7CisgIH0KKyB9OworIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0aGlzOworIH07CisgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsKKyAgdGhyb3cgMjsKKyB9KTsKK30gY2F0Y2ggKGVycm9yKSB7Cit9Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHsKKyBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKQorICByZXR1cm4gZmFsc2U7CisgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7CisgdHJ5IHsKKyAgdmFyIG9iamVjdCA9IHt9OworICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeworICAgcmV0dXJuIHsKKyAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CisgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9OworICAgIH0KKyAgIH07CisgIH07CisgIGV4ZWMob2JqZWN0KTsKKyB9IGNhdGNoIChlcnJvcikgeworIH0KKyByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7Cit9OworCisvKioqLyB9KSwKKy8qIDk4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oOTkpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuYXNzaWduOworCisvKioqLyB9KSwKKy8qIDk5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgYXNzaWduID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDApOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduCit9LCB7IGFzc2lnbjogYXNzaWduIH0pOworCisvKioqLyB9KSwKKy8qIDEwMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgb2JqZWN0S2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzMpOwordmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNTEpOwordmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7Cit2YXIgdG9PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgzKTsKK3ZhciBJbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjsKK3ZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK21vZHVsZS5leHBvcnRzID0gIW5hdGl2ZUFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CisgaWYgKERFU0NSSVBUT1JTICYmIG5hdGl2ZUFzc2lnbih7IGI6IDEgfSwgbmF0aXZlQXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHsKKyAgICAgdmFsdWU6IDMsCisgICAgIGVudW1lcmFibGU6IGZhbHNlCisgICAgfSk7CisgICB9CisgIH0pLCB7IGI6IDIgfSkpLmIgIT09IDEpCisgIHJldHVybiB0cnVlOworIHZhciBBID0ge307CisgdmFyIEIgPSB7fTsKKyB2YXIgc3ltYm9sID0gU3ltYm9sKCk7CisgdmFyIGFscGhhYmV0ID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JzsKKyBBW3N5bWJvbF0gPSA3OworIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsKKyAgQltjaHJdID0gY2hyOworIH0pOworIHJldHVybiBuYXRpdmVBc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKG5hdGl2ZUFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IGFscGhhYmV0OworfSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsKKyB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7CisgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgdmFyIGluZGV4ID0gMTsKKyB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7CisgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjsKKyB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHsKKyAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7CisgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gb2JqZWN0S2V5cyhTKS5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKFMpKSA6IG9iamVjdEtleXMoUyk7CisgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKKyAgdmFyIGogPSAwOworICB2YXIga2V5OworICB3aGlsZSAobGVuZ3RoID4gaikgeworICAga2V5ID0ga2V5c1tqKytdOworICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpCisgICAgVFtrZXldID0gU1trZXldOworICB9CisgfQorIHJldHVybiBUOworfSA6IG5hdGl2ZUFzc2lnbjsKKworLyoqKi8gfSksCisvKiAxMDEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMDIpOworX193X3BkZmpzX3JlcXVpcmVfXygxMDMpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZnJvbUVudHJpZXM7CisKKy8qKiovIH0pLAorLyogMTAyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcpOwordmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcwKTsKK3ZhciBJdGVyYXRvcnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg2KTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc5KTsKK3ZhciBBUlJBWV9JVEVSQVRPUiA9ICdBcnJheSBJdGVyYXRvcic7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7Cittb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHsKKyBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKKyAgdHlwZTogQVJSQVlfSVRFUkFUT1IsCisgIHRhcmdldDogdG9JbmRleGVkT2JqZWN0KGl0ZXJhdGVkKSwKKyAgaW5kZXg6IDAsCisgIGtpbmQ6IGtpbmQKKyB9KTsKK30sIGZ1bmN0aW9uICgpIHsKKyB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOworIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7CisgdmFyIGtpbmQgPSBzdGF0ZS5raW5kOworIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7CisgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkgeworICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7CisgIHJldHVybiB7CisgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgZG9uZTogdHJ1ZQorICB9OworIH0KKyBpZiAoa2luZCA9PSAna2V5cycpCisgIHJldHVybiB7CisgICB2YWx1ZTogaW5kZXgsCisgICBkb25lOiBmYWxzZQorICB9OworIGlmIChraW5kID09ICd2YWx1ZXMnKQorICByZXR1cm4geworICAgdmFsdWU6IHRhcmdldFtpbmRleF0sCisgICBkb25lOiBmYWxzZQorICB9OworIHJldHVybiB7CisgIHZhbHVlOiBbCisgICBpbmRleCwKKyAgIHRhcmdldFtpbmRleF0KKyAgXSwKKyAgZG9uZTogZmFsc2UKKyB9OworfSwgJ3ZhbHVlcycpOworSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTsKK2FkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTsKK2FkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpOworYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOworCisvKioqLyB9KSwKKy8qIDEwMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGl0ZXJhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNCk7Cit2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkzKTsKKyQoeworIHRhcmdldDogJ09iamVjdCcsCisgc3RhdDogdHJ1ZQorfSwgeworIGZyb21FbnRyaWVzOiBmdW5jdGlvbiBmcm9tRW50cmllcyhpdGVyYWJsZSkgeworICB2YXIgb2JqID0ge307CisgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChrLCB2KSB7CisgICBjcmVhdGVQcm9wZXJ0eShvYmosIGssIHYpOworICB9LCB1bmRlZmluZWQsIHRydWUpOworICByZXR1cm4gb2JqOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDEwNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkyKTsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIGJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYyKTsKK3ZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTQpOwordmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkxKTsKK3ZhciBSZXN1bHQgPSBmdW5jdGlvbiAoc3RvcHBlZCwgcmVzdWx0KSB7CisgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDsKKyB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKK307Cit2YXIgaXRlcmF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgQVNfRU5UUklFUywgSVNfSVRFUkFUT1IpIHsKKyB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoZm4sIHRoYXQsIEFTX0VOVFJJRVMgPyAyIDogMSk7CisgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDsKKyBpZiAoSVNfSVRFUkFUT1IpIHsKKyAgaXRlcmF0b3IgPSBpdGVyYWJsZTsKKyB9IGVsc2UgeworICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7CisgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpCisgICB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTsKKyAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7CisgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHsKKyAgICByZXN1bHQgPSBBU19FTlRSSUVTID8gYm91bmRGdW5jdGlvbihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBib3VuZEZ1bmN0aW9uKGl0ZXJhYmxlW2luZGV4XSk7CisgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpCisgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisgICByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7CisgIH0KKyAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7CisgfQorIG5leHQgPSBpdGVyYXRvci5uZXh0OworIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7CisgIHJlc3VsdCA9IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIGJvdW5kRnVuY3Rpb24sIHN0ZXAudmFsdWUsIEFTX0VOVFJJRVMpOworICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KQorICAgcmV0dXJuIHJlc3VsdDsKKyB9CisgcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOworfTsKK2l0ZXJhdGUuc3RvcCA9IGZ1bmN0aW9uIChyZXN1bHQpIHsKKyByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCByZXN1bHQpOworfTsKKworLyoqKi8gfSksCisvKiAxMDUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMDYpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5NYXRoLmxvZzI7CisKKy8qKiovIH0pLAorLyogMTA2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgbG9nID0gTWF0aC5sb2c7Cit2YXIgTE4yID0gTWF0aC5MTjI7CiskKHsKKyB0YXJnZXQ6ICdNYXRoJywKKyBzdGF0OiB0cnVlCit9LCB7CisgbG9nMjogZnVuY3Rpb24gbG9nMih4KSB7CisgIHJldHVybiBsb2coeCkgLyBMTjI7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTA3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTA4KTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzTmFOOworCisvKioqLyB9KSwKKy8qIDEwOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOworJCh7CisgdGFyZ2V0OiAnTnVtYmVyJywKKyBzdGF0OiB0cnVlCit9LCB7CisgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikgeworICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxMDkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMTApOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyOworCisvKioqLyB9KSwKKy8qIDExMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGlzSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTExKTsKKyQoeworIHRhcmdldDogJ051bWJlcicsCisgc3RhdDogdHJ1ZQorfSwgeyBpc0ludGVnZXI6IGlzSW50ZWdlciB9KTsKKworLyoqKi8gfSksCisvKiAxMTEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgZmxvb3IgPSBNYXRoLmZsb29yOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHsKKyByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDsKK307CisKKy8qKiovIH0pLAorLyogMTEyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTEzKTsKKworLyoqKi8gfSksCisvKiAxMTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE0KTsKK3ZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7Cit2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKK3ZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwordmFyICRzbGljZSA9IFtdLnNsaWNlOwordmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKKyBuZXcgSW50OEFycmF5KDEpLnNsaWNlKCk7Cit9KTsKK2V4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkgeworIHZhciBsaXN0ID0gJHNsaWNlLmNhbGwoYVR5cGVkQXJyYXkodGhpcyksIHN0YXJ0LCBlbmQpOworIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworIHZhciBpbmRleCA9IDA7CisgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoOworIHZhciByZXN1bHQgPSBuZXcgKGFUeXBlZEFycmF5Q29uc3RydWN0b3IoQykpKGxlbmd0aCk7Cisgd2hpbGUgKGxlbmd0aCA+IGluZGV4KQorICByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTsKKyByZXR1cm4gcmVzdWx0OworfSwgRk9SQ0VEKTsKKworLyoqKi8gfSksCisvKiAxMTQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE1KTsKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oOTUpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIHJlZGVmaW5lID0gX193X3BkZmpzX3JlcXVpcmVfXygyOSk7Cit2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KS5mOwordmFyIGdldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Mik7Cit2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg3KTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciB1aWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKK3ZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5OwordmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlOwordmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5OwordmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlOwordmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTsKK3ZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7Cit2YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTsKK3ZhciBpc1Byb3RvdHlwZU9mID0gT2JqZWN0UHJvdG90eXBlLmlzUHJvdG90eXBlT2Y7Cit2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKK3ZhciBUWVBFRF9BUlJBWV9UQUcgPSB1aWQoJ1RZUEVEX0FSUkFZX1RBRycpOwordmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBOQVRJVkVfQVJSQVlfQlVGRkVSICYmICEhc2V0UHJvdG90eXBlT2YgJiYgY2xhc3NvZihnbG9iYWwub3BlcmEpICE9PSAnT3BlcmEnOwordmFyIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gZmFsc2U7Cit2YXIgTkFNRTsKK3ZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCA9IHsKKyBJbnQ4QXJyYXk6IDEsCisgVWludDhBcnJheTogMSwKKyBVaW50OENsYW1wZWRBcnJheTogMSwKKyBJbnQxNkFycmF5OiAyLAorIFVpbnQxNkFycmF5OiAyLAorIEludDMyQXJyYXk6IDQsCisgVWludDMyQXJyYXk6IDQsCisgRmxvYXQzMkFycmF5OiA0LAorIEZsb2F0NjRBcnJheTogOAorfTsKK3ZhciBpc1ZpZXcgPSBmdW5jdGlvbiBpc1ZpZXcoaXQpIHsKKyB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTsKKyByZXR1cm4ga2xhc3MgPT09ICdEYXRhVmlldycgfHwgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBrbGFzcyk7Cit9OwordmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiBpc09iamVjdChpdCkgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBjbGFzc29mKGl0KSk7Cit9OwordmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7CisgaWYgKGlzVHlwZWRBcnJheShpdCkpCisgIHJldHVybiBpdDsKKyB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheScpOworfTsKK3ZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKEMpIHsKKyBpZiAoc2V0UHJvdG90eXBlT2YpIHsKKyAgaWYgKGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5LCBDKSkKKyAgIHJldHVybiBDOworIH0gZWxzZQorICBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkKKyAgIGlmIChoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIE5BTUUpKSB7CisgICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07CisgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiAoQyA9PT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yIHx8IGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5Q29uc3RydWN0b3IsIEMpKSkgeworICAgICByZXR1cm4gQzsKKyAgICB9CisgICB9CisgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3InKTsKK307Cit2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQpIHsKKyBpZiAoIURFU0NSSVBUT1JTKQorICByZXR1cm47CisgaWYgKGZvcmNlZCkKKyAgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKKyAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldOworICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZSwgS0VZKSkgeworICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlW0tFWV07CisgICB9CisgIH0KKyBpZiAoIVR5cGVkQXJyYXlQcm90b3R5cGVbS0VZXSB8fCBmb3JjZWQpIHsKKyAgcmVkZWZpbmUoVHlwZWRBcnJheVByb3RvdHlwZSwgS0VZLCBmb3JjZWQgPyBwcm9wZXJ0eSA6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgSW50OEFycmF5UHJvdG90eXBlW0tFWV0gfHwgcHJvcGVydHkpOworIH0KK307Cit2YXIgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQpIHsKKyB2YXIgQVJSQVksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKKyBpZiAoIURFU0NSSVBUT1JTKQorICByZXR1cm47CisgaWYgKHNldFByb3RvdHlwZU9mKSB7CisgIGlmIChmb3JjZWQpCisgICBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CisgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTsKKyAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSkpIHsKKyAgICAgZGVsZXRlIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcltLRVldOworICAgIH0KKyAgIH0KKyAgaWYgKCFUeXBlZEFycmF5W0tFWV0gfHwgZm9yY2VkKSB7CisgICB0cnkgeworICAgIHJldHVybiByZWRlZmluZShUeXBlZEFycmF5LCBLRVksIGZvcmNlZCA/IHByb3BlcnR5IDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlbS0VZXSB8fCBwcm9wZXJ0eSk7CisgICB9IGNhdGNoIChlcnJvcikgeworICAgfQorICB9IGVsc2UKKyAgIHJldHVybjsKKyB9CisgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgeworICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldOworICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkgeworICAgcmVkZWZpbmUoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVksIHByb3BlcnR5KTsKKyAgfQorIH0KK307Citmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKKyBpZiAoIWdsb2JhbFtOQU1FXSkKKyAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IGZhbHNlOworfQoraWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8IHR5cGVvZiBUeXBlZEFycmF5ICE9ICdmdW5jdGlvbicgfHwgVHlwZWRBcnJheSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7CisgVHlwZWRBcnJheSA9IGZ1bmN0aW9uIFR5cGVkQXJyYXkoKSB7CisgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTsKKyB9OworIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKQorICBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKKyAgIGlmIChnbG9iYWxbTkFNRV0pCisgICAgc2V0UHJvdG90eXBlT2YoZ2xvYmFsW05BTUVdLCBUeXBlZEFycmF5KTsKKyAgfQorfQoraWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8ICFUeXBlZEFycmF5UHJvdG90eXBlIHx8IFR5cGVkQXJyYXlQcm90b3R5cGUgPT09IE9iamVjdFByb3RvdHlwZSkgeworIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5LnByb3RvdHlwZTsKKyBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykKKyAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CisgICBpZiAoZ2xvYmFsW05BTUVdKQorICAgIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXS5wcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOworICB9Cit9CitpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBnZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSkgIT09IFR5cGVkQXJyYXlQcm90b3R5cGUpIHsKKyBzZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7Cit9CitpZiAoREVTQ1JJUFRPUlMgJiYgIWhhcyhUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkgeworIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gdHJ1ZTsKKyBkZWZpbmVQcm9wZXJ0eShUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7CisgIGdldDogZnVuY3Rpb24gKCkgeworICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMpID8gdGhpc1tUWVBFRF9BUlJBWV9UQUddIDogdW5kZWZpbmVkOworICB9CisgfSk7CisgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KQorICBpZiAoZ2xvYmFsW05BTUVdKSB7CisgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsW05BTUVdLCBUWVBFRF9BUlJBWV9UQUcsIE5BTUUpOworICB9Cit9Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTLAorIFRZUEVEX0FSUkFZX1RBRzogVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQgJiYgVFlQRURfQVJSQVlfVEFHLAorIGFUeXBlZEFycmF5OiBhVHlwZWRBcnJheSwKKyBhVHlwZWRBcnJheUNvbnN0cnVjdG9yOiBhVHlwZWRBcnJheUNvbnN0cnVjdG9yLAorIGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlNZXRob2QsCisgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDogZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCwKKyBpc1ZpZXc6IGlzVmlldywKKyBpc1R5cGVkQXJyYXk6IGlzVHlwZWRBcnJheSwKKyBUeXBlZEFycmF5OiBUeXBlZEFycmF5LAorIFR5cGVkQXJyYXlQcm90b3R5cGU6IFR5cGVkQXJyYXlQcm90b3R5cGUKK307CisKKy8qKiovIH0pLAorLyogMTE1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnOworCisvKioqLyB9KSwKKy8qIDExNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciBhRnVuY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYzKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHsKKyB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yOworIHZhciBTOworIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpOworfTsKKworLyoqKi8gfSksCisvKiAxMTcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMTgpOworX193X3BkZmpzX3JlcXVpcmVfXyg3Nyk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEyMCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEyMik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEzNik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEzNyk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLlByb21pc2U7CisKKy8qKiovIH0pLAorLyogMTE4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk2KTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHRvU3RyaW5nID0gX193X3BkZmpzX3JlcXVpcmVfXygxMTkpOworaWYgKCFUT19TVFJJTkdfVEFHX1NVUFBPUlQpIHsKKyByZWRlZmluZShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCB0b1N0cmluZywgeyB1bnNhZmU6IHRydWUgfSk7Cit9CisKKy8qKiovIH0pLAorLyogMTE5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTYpOwordmFyIGNsYXNzb2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk1KTsKK21vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8ge30udG9TdHJpbmcgOiBmdW5jdGlvbiB0b1N0cmluZygpIHsKKyByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7Cit9OworCisvKioqLyB9KSwKKy8qIDEyMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgRE9NSXRlcmFibGVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjEpOwordmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDIpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Cit2YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7Citmb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7CisgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTsKKyB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7CisgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGUpIHsKKyAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykKKyAgIHRyeSB7CisgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7CisgICB9IGNhdGNoIChlcnJvcikgeworICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7CisgICB9CisgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkgeworICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIENPTExFQ1RJT05fTkFNRSk7CisgIH0KKyAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKQorICAgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHsKKyAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkKKyAgICAgdHJ5IHsKKyAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBNRVRIT0RfTkFNRSwgQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKTsKKyAgICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdOworICAgICB9CisgICB9CisgfQorfQorCisvKioqLyB9KSwKKy8qIDEyMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IHsKKyBDU1NSdWxlTGlzdDogMCwKKyBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLAorIENTU1ZhbHVlTGlzdDogMCwKKyBDbGllbnRSZWN0TGlzdDogMCwKKyBET01SZWN0TGlzdDogMCwKKyBET01TdHJpbmdMaXN0OiAwLAorIERPTVRva2VuTGlzdDogMSwKKyBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCwKKyBGaWxlTGlzdDogMCwKKyBIVE1MQWxsQ29sbGVjdGlvbjogMCwKKyBIVE1MQ29sbGVjdGlvbjogMCwKKyBIVE1MRm9ybUVsZW1lbnQ6IDAsCisgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsCisgTWVkaWFMaXN0OiAwLAorIE1pbWVUeXBlQXJyYXk6IDAsCisgTmFtZWROb2RlTWFwOiAwLAorIE5vZGVMaXN0OiAxLAorIFBhaW50UmVxdWVzdExpc3Q6IDAsCisgUGx1Z2luOiAwLAorIFBsdWdpbkFycmF5OiAwLAorIFNWR0xlbmd0aExpc3Q6IDAsCisgU1ZHTnVtYmVyTGlzdDogMCwKKyBTVkdQYXRoU2VnTGlzdDogMCwKKyBTVkdQb2ludExpc3Q6IDAsCisgU1ZHU3RyaW5nTGlzdDogMCwKKyBTVkdUcmFuc2Zvcm1MaXN0OiAwLAorIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsCisgU3R5bGVTaGVldExpc3Q6IDAsCisgVGV4dFRyYWNrQ3VlTGlzdDogMCwKKyBUZXh0VHJhY2tMaXN0OiAwLAorIFRvdWNoTGlzdDogMAorfTsKKworLyoqKi8gfSksCisvKiAxMjIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Mik7Cit2YXIgTmF0aXZlUHJvbWlzZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIzKTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHJlZGVmaW5lQWxsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjQpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7Cit2YXIgc2V0U3BlY2llcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI1KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGFGdW5jdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oNjMpOwordmFyIGFuSW5zdGFuY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNik7Cit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIGluc3BlY3RTb3VyY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMxKTsKK3ZhciBpdGVyYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDQpOwordmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oOTcpOwordmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE2KTsKK3ZhciB0YXNrID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjcpLnNldDsKK3ZhciBtaWNyb3Rhc2sgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMCk7Cit2YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMSk7Cit2YXIgaG9zdFJlcG9ydEVycm9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMzKTsKK3ZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMyKTsKK3ZhciBwZXJmb3JtID0gX193X3BkZmpzX3JlcXVpcmVfXygxMzQpOwordmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMzKTsKK3ZhciBpc0ZvcmNlZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTIpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIFY4X1ZFUlNJT04gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzNSk7Cit2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwordmFyIFBST01JU0UgPSAnUHJvbWlzZSc7Cit2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0OwordmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKK3ZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpOwordmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2U7Cit2YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjsKK3ZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDsKK3ZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7Cit2YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTsKK3ZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7Cit2YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7Cit2YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnOwordmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpOwordmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJzsKK3ZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJzsKK3ZhciBQRU5ESU5HID0gMDsKK3ZhciBGVUxGSUxMRUQgPSAxOwordmFyIFJFSkVDVEVEID0gMjsKK3ZhciBIQU5ETEVEID0gMTsKK3ZhciBVTkhBTkRMRUQgPSAyOwordmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47Cit2YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkgeworIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gaW5zcGVjdFNvdXJjZShQcm9taXNlQ29uc3RydWN0b3IpICE9PSBTdHJpbmcoUHJvbWlzZUNvbnN0cnVjdG9yKTsKKyBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UpIHsKKyAgaWYgKFY4X1ZFUlNJT04gPT09IDY2KQorICAgcmV0dXJuIHRydWU7CisgIGlmICghSVNfTk9ERSAmJiB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ICE9ICdmdW5jdGlvbicpCisgICByZXR1cm4gdHJ1ZTsKKyB9CisgaWYgKElTX1BVUkUgJiYgIVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGVbJ2ZpbmFsbHknXSkKKyAgcmV0dXJuIHRydWU7CisgaWYgKFY4X1ZFUlNJT04gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFByb21pc2VDb25zdHJ1Y3RvcikpCisgIHJldHVybiBmYWxzZTsKKyB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpOworIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7CisgIGV4ZWMoZnVuY3Rpb24gKCkgeworICB9LCBmdW5jdGlvbiAoKSB7CisgIH0pOworIH07CisgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9OworIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7CisgcmV0dXJuICEocHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyB9KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlKTsKK30pOwordmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsKKyBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7CisgfSk7Cit9KTsKK3ZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7CisgdmFyIHRoZW47CisgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlOworfTsKK3ZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIGlzUmVqZWN0KSB7CisgaWYgKHN0YXRlLm5vdGlmaWVkKQorICByZXR1cm47Cisgc3RhdGUubm90aWZpZWQgPSB0cnVlOworIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9uczsKKyBtaWNyb3Rhc2soZnVuY3Rpb24gKCkgeworICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTsKKyAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEOworICB2YXIgaW5kZXggPSAwOworICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHsKKyAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdOworICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDsKKyAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTsKKyAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7CisgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluOworICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkOworICAgdHJ5IHsKKyAgICBpZiAoaGFuZGxlcikgeworICAgICBpZiAoIW9rKSB7CisgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpCisgICAgICAgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpOworICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDsKKyAgICAgfQorICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkKKyAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICBlbHNlIHsKKyAgICAgIGlmIChkb21haW4pCisgICAgICAgZG9tYWluLmVudGVyKCk7CisgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsKKyAgICAgIGlmIChkb21haW4pIHsKKyAgICAgICBkb21haW4uZXhpdCgpOworICAgICAgIGV4aXRlZCA9IHRydWU7CisgICAgICB9CisgICAgIH0KKyAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkgeworICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTsKKyAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7CisgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpOworICAgICB9IGVsc2UKKyAgICAgIHJlc29sdmUocmVzdWx0KTsKKyAgICB9IGVsc2UKKyAgICAgcmVqZWN0KHZhbHVlKTsKKyAgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKQorICAgICBkb21haW4uZXhpdCgpOworICAgIHJlamVjdChlcnJvcik7CisgICB9CisgIH0KKyAgc3RhdGUucmVhY3Rpb25zID0gW107CisgIHN0YXRlLm5vdGlmaWVkID0gZmFsc2U7CisgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKQorICAgb25VbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpOworIH0pOworfTsKK3ZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikgeworIHZhciBldmVudCwgaGFuZGxlcjsKKyBpZiAoRElTUEFUQ0hfRVZFTlQpIHsKKyAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTsKKyAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7CisgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjsKKyAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTsKKyAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworIH0gZWxzZQorICBldmVudCA9IHsKKyAgIHByb21pc2U6IHByb21pc2UsCisgICByZWFzb246IHJlYXNvbgorICB9OworIGlmIChoYW5kbGVyID0gZ2xvYmFsWydvbicgKyBuYW1lXSkKKyAgaGFuZGxlcihldmVudCk7CisgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikKKyAgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTsKK307Cit2YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHsKKyB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7CisgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlOworICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpOworICB2YXIgcmVzdWx0OworICBpZiAoSVNfVU5IQU5ETEVEKSB7CisgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSVNfTk9ERSkgeworICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTsKKyAgICB9IGVsc2UKKyAgICAgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7CisgICB9KTsKKyAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDsKKyAgIGlmIChyZXN1bHQuZXJyb3IpCisgICAgdGhyb3cgcmVzdWx0LnZhbHVlOworICB9CisgfSk7Cit9OwordmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7CisgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50OworfTsKK3ZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSkgeworIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHsKKyAgaWYgKElTX05PREUpIHsKKyAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpOworICB9IGVsc2UKKyAgIGRpc3BhdGNoRXZlbnQoUkVKRUNUSU9OX0hBTkRMRUQsIHByb21pc2UsIHN0YXRlLnZhbHVlKTsKKyB9KTsKK307Cit2YXIgYmluZCA9IGZ1bmN0aW9uIChmbiwgcHJvbWlzZSwgc3RhdGUsIHVud3JhcCkgeworIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHsKKyAgZm4ocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApOworIH07Cit9OwordmFyIGludGVybmFsUmVqZWN0ID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7CisgaWYgKHN0YXRlLmRvbmUpCisgIHJldHVybjsKKyBzdGF0ZS5kb25lID0gdHJ1ZTsKKyBpZiAodW53cmFwKQorICBzdGF0ZSA9IHVud3JhcDsKKyBzdGF0ZS52YWx1ZSA9IHZhbHVlOworIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7Cisgbm90aWZ5KHByb21pc2UsIHN0YXRlLCB0cnVlKTsKK307Cit2YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7CisgaWYgKHN0YXRlLmRvbmUpCisgIHJldHVybjsKKyBzdGF0ZS5kb25lID0gdHJ1ZTsKKyBpZiAodW53cmFwKQorICBzdGF0ZSA9IHVud3JhcDsKKyB0cnkgeworICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpCisgICB0aHJvdyBUeXBlRXJyb3IoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7CisgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7CisgIGlmICh0aGVuKSB7CisgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkgeworICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9OworICAgIHRyeSB7CisgICAgIHRoZW4uY2FsbCh2YWx1ZSwgYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHdyYXBwZXIsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpKTsKKyAgICB9IGNhdGNoIChlcnJvcikgeworICAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB3cmFwcGVyLCBlcnJvciwgc3RhdGUpOworICAgIH0KKyAgIH0pOworICB9IGVsc2UgeworICAgc3RhdGUudmFsdWUgPSB2YWx1ZTsKKyAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEOworICAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCBmYWxzZSk7CisgIH0KKyB9IGNhdGNoIChlcnJvcikgeworICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7CisgfQorfTsKK2lmIChGT1JDRUQpIHsKKyBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7CisgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTsKKyAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTsKKyAgSW50ZXJuYWwuY2FsbCh0aGlzKTsKKyAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgdHJ5IHsKKyAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB0aGlzLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHRoaXMsIHN0YXRlKSk7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICBpbnRlcm5hbFJlamVjdCh0aGlzLCBzdGF0ZSwgZXJyb3IpOworICB9CisgfTsKKyBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHsKKyAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CisgICB0eXBlOiBQUk9NSVNFLAorICAgZG9uZTogZmFsc2UsCisgICBub3RpZmllZDogZmFsc2UsCisgICBwYXJlbnQ6IGZhbHNlLAorICAgcmVhY3Rpb25zOiBbXSwKKyAgIHJlamVjdGlvbjogZmFsc2UsCisgICBzdGF0ZTogUEVORElORywKKyAgIHZhbHVlOiB1bmRlZmluZWQKKyAgfSk7CisgfTsKKyBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7CisgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHsKKyAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpOworICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpOworICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTsKKyAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7CisgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7CisgICBzdGF0ZS5wYXJlbnQgPSB0cnVlOworICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pOworICAgaWYgKHN0YXRlLnN0YXRlICE9IFBFTkRJTkcpCisgICAgbm90aWZ5KHRoaXMsIHN0YXRlLCBmYWxzZSk7CisgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTsKKyAgfSwKKyAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHsKKyAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTsKKyAgfQorIH0pOworIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkgeworICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpOworICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpOworICB0aGlzLnByb21pc2UgPSBwcm9taXNlOworICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgcHJvbWlzZSwgc3RhdGUpOworICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHN0YXRlKTsKKyB9OworIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7CisgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQykgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7CisgfTsKKyBpZiAoIUlTX1BVUkUgJiYgdHlwZW9mIE5hdGl2ZVByb21pc2UgPT0gJ2Z1bmN0aW9uJykgeworICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUudGhlbjsKKyAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgeworICAgdmFyIHRoYXQgPSB0aGlzOworICAgcmV0dXJuIG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgIG5hdGl2ZVRoZW4uY2FsbCh0aGF0LCByZXNvbHZlLCByZWplY3QpOworICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7CisgIH0sIHsgdW5zYWZlOiB0cnVlIH0pOworICBpZiAodHlwZW9mICRmZXRjaCA9PSAnZnVuY3Rpb24nKQorICAgJCh7CisgICAgZ2xvYmFsOiB0cnVlLAorICAgIGVudW1lcmFibGU6IHRydWUsCisgICAgZm9yY2VkOiB0cnVlCisgICB9LCB7CisgICAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0KSB7CisgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShQcm9taXNlQ29uc3RydWN0b3IsICRmZXRjaC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cykpOworICAgIH0KKyAgIH0pOworIH0KK30KKyQoeworIGdsb2JhbDogdHJ1ZSwKKyB3cmFwOiB0cnVlLAorIGZvcmNlZDogRk9SQ0VECit9LCB7IFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvciB9KTsKK3NldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpOworc2V0U3BlY2llcyhQUk9NSVNFKTsKK1Byb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTsKKyQoeworIHRhcmdldDogUFJPTUlTRSwKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogRk9SQ0VECit9LCB7CisgcmVqZWN0OiBmdW5jdGlvbiByZWplY3QocikgeworICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpOworICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7CisgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CisgfQorfSk7CiskKHsKKyB0YXJnZXQ6IFBST01JU0UsCisgc3RhdDogdHJ1ZSwKKyBmb3JjZWQ6IElTX1BVUkUgfHwgRk9SQ0VECit9LCB7CisgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7CisgIHJldHVybiBwcm9taXNlUmVzb2x2ZShJU19QVVJFICYmIHRoaXMgPT09IFByb21pc2VXcmFwcGVyID8gUHJvbWlzZUNvbnN0cnVjdG9yIDogdGhpcywgeCk7CisgfQorfSk7CiskKHsKKyB0YXJnZXQ6IFBST01JU0UsCisgc3RhdDogdHJ1ZSwKKyBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04KK30sIHsKKyBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkgeworICB2YXIgQyA9IHRoaXM7CisgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7CisgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlOworICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7CisgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKKyAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTsKKyAgIHZhciB2YWx1ZXMgPSBbXTsKKyAgIHZhciBjb3VudGVyID0gMDsKKyAgIHZhciByZW1haW5pbmcgPSAxOworICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHsKKyAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7CisgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTsKKyAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpOworICAgIHJlbWFpbmluZysrOworICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgIGlmIChhbHJlYWR5Q2FsbGVkKQorICAgICAgcmV0dXJuOworICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTsKKyAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlOworICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7CisgICAgfSwgcmVqZWN0KTsKKyAgIH0pOworICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpOworICB9KTsKKyAgaWYgKHJlc3VsdC5lcnJvcikKKyAgIHJlamVjdChyZXN1bHQudmFsdWUpOworICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOworIH0sCisgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkgeworICB2YXIgQyA9IHRoaXM7CisgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7CisgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDsKKyAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkgeworICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpOworICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHsKKyAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTsKKyAgIH0pOworICB9KTsKKyAgaWYgKHJlc3VsdC5lcnJvcikKKyAgIHJlamVjdChyZXN1bHQudmFsdWUpOworICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDEyMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cittb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlOworCisvKioqLyB9KSwKKy8qIDEyNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgcmVkZWZpbmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7CisgZm9yICh2YXIga2V5IGluIHNyYykKKyAgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTsKKyByZXR1cm4gdGFyZ2V0OworfTsKKworLyoqKi8gfSksCisvKiAxMjUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgZ2V0QnVpbHRJbiA9IF9fd19wZGZqc19yZXF1aXJlX18oNDIpOwordmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyNyk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7CisgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTsKKyB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOworIGlmIChERVNDUklQVE9SUyAmJiBDb25zdHJ1Y3RvciAmJiAhQ29uc3RydWN0b3JbU1BFQ0lFU10pIHsKKyAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHsKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzOworICAgfQorICB9KTsKKyB9Cit9OworCisvKioqLyB9KSwKKy8qIDEyNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUpIHsKKyBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeworICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTsKKyB9CisgcmV0dXJuIGl0OworfTsKKworLyoqKi8gfSksCisvKiAxMjcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIGJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYyKTsKK3ZhciBodG1sID0gX193X3BkZmpzX3JlcXVpcmVfXyg3NCk7Cit2YXIgY3JlYXRlRWxlbWVudCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpOwordmFyIElTX0lPUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI4KTsKK3ZhciBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjsKK3ZhciBzZXQgPSBnbG9iYWwuc2V0SW1tZWRpYXRlOwordmFyIGNsZWFyID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlOwordmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKK3ZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDsKK3ZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDsKK3ZhciBjb3VudGVyID0gMDsKK3ZhciBxdWV1ZSA9IHt9OwordmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnOwordmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0OwordmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkgeworIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHsKKyAgdmFyIGZuID0gcXVldWVbaWRdOworICBkZWxldGUgcXVldWVbaWRdOworICBmbigpOworIH0KK307Cit2YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7CisgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgcnVuKGlkKTsKKyB9OworfTsKK3ZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkgeworIHJ1bihldmVudC5kYXRhKTsKK307Cit2YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkgeworIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTsKK307CitpZiAoIXNldCB8fCAhY2xlYXIpIHsKKyBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHsKKyAgdmFyIGFyZ3MgPSBbXTsKKyAgdmFyIGkgPSAxOworICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpCisgICBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pOworICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkgeworICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CisgIH07CisgIGRlZmVyKGNvdW50ZXIpOworICByZXR1cm4gY291bnRlcjsKKyB9OworIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHsKKyAgZGVsZXRlIHF1ZXVlW2lkXTsKKyB9OworIGlmIChjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJykgeworICBkZWZlciA9IGZ1bmN0aW9uIChpZCkgeworICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTsKKyAgfTsKKyB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykgeworICBkZWZlciA9IGZ1bmN0aW9uIChpZCkgeworICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpOworICB9OworIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwgJiYgIUlTX0lPUykgeworICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7CisgIHBvcnQgPSBjaGFubmVsLnBvcnQyOworICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyOworICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7CisgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiYgIWZhaWxzKHBvc3QpICYmIGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonKSB7CisgIGRlZmVyID0gcG9zdDsKKyAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpOworIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSB7CisgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7CisgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkgeworICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7CisgICAgcnVuKGlkKTsKKyAgIH07CisgIH07CisgfSBlbHNlIHsKKyAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHsKKyAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7CisgIH07CisgfQorfQorbW9kdWxlLmV4cG9ydHMgPSB7Cisgc2V0OiBzZXQsCisgY2xlYXI6IGNsZWFyCit9OworCisvKioqLyB9KSwKKy8qIDEyOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgdXNlckFnZW50ID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjkpOworbW9kdWxlLmV4cG9ydHMgPSAvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KTsKKworLyoqKi8gfSksCisvKiAxMjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKTsKK21vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnOworCisvKioqLyB9KSwKKy8qIDEzMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxMikuZjsKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgbWFjcm90YXNrID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjcpLnNldDsKK3ZhciBJU19JT1MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyOCk7Cit2YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyOwordmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKK3ZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7Cit2YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnOwordmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpOwordmFyIHF1ZXVlTWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTsKK3ZhciBmbHVzaCwgaGVhZCwgbGFzdCwgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47CitpZiAoIXF1ZXVlTWljcm90YXNrKSB7CisgZmx1c2ggPSBmdW5jdGlvbiAoKSB7CisgIHZhciBwYXJlbnQsIGZuOworICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKQorICAgcGFyZW50LmV4aXQoKTsKKyAgd2hpbGUgKGhlYWQpIHsKKyAgIGZuID0gaGVhZC5mbjsKKyAgIGhlYWQgPSBoZWFkLm5leHQ7CisgICB0cnkgeworICAgIGZuKCk7CisgICB9IGNhdGNoIChlcnJvcikgeworICAgIGlmIChoZWFkKQorICAgICBub3RpZnkoKTsKKyAgICBlbHNlCisgICAgIGxhc3QgPSB1bmRlZmluZWQ7CisgICAgdGhyb3cgZXJyb3I7CisgICB9CisgIH0KKyAgbGFzdCA9IHVuZGVmaW5lZDsKKyAgaWYgKHBhcmVudCkKKyAgIHBhcmVudC5lbnRlcigpOworIH07CisgaWYgKElTX05PREUpIHsKKyAgbm90aWZ5ID0gZnVuY3Rpb24gKCkgeworICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7CisgIH07CisgfSBlbHNlIGlmIChNdXRhdGlvbk9ic2VydmVyICYmICFJU19JT1MpIHsKKyAgdG9nZ2xlID0gdHJ1ZTsKKyAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKKyAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOworICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7CisgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlOworICB9OworIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHsKKyAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOworICB0aGVuID0gcHJvbWlzZS50aGVuOworICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7CisgICB0aGVuLmNhbGwocHJvbWlzZSwgZmx1c2gpOworICB9OworIH0gZWxzZSB7CisgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHsKKyAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpOworICB9OworIH0KK30KK21vZHVsZS5leHBvcnRzID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7CisgdmFyIHRhc2sgPSB7CisgIGZuOiBmbiwKKyAgbmV4dDogdW5kZWZpbmVkCisgfTsKKyBpZiAobGFzdCkKKyAgbGFzdC5uZXh0ID0gdGFzazsKKyBpZiAoIWhlYWQpIHsKKyAgaGVhZCA9IHRhc2s7CisgIG5vdGlmeSgpOworIH0KKyBsYXN0ID0gdGFzazsKK307CisKKy8qKiovIH0pLAorLyogMTMxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjgpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7CisgYW5PYmplY3QoQyk7CisgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpCisgIHJldHVybiB4OworIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7CisgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlOworIHJlc29sdmUoeCk7CisgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7Cit9OworCisvKioqLyB9KSwKKy8qIDEzMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBhRnVuY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYzKTsKK3ZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7CisgdmFyIHJlc29sdmUsIHJlamVjdDsKKyB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkgeworICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKQorICAgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpOworICByZXNvbHZlID0gJCRyZXNvbHZlOworICByZWplY3QgPSAkJHJlamVjdDsKKyB9KTsKKyB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7CisgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTsKK307Cittb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHsKKyByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpOworfTsKKworLyoqKi8gfSksCisvKiAxMzMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikgeworIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7CisgaWYgKGNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgeworICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7CisgfQorfTsKKworLyoqKi8gfSksCisvKiAxMzQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykgeworIHRyeSB7CisgIHJldHVybiB7CisgICBlcnJvcjogZmFsc2UsCisgICB2YWx1ZTogZXhlYygpCisgIH07CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgcmV0dXJuIHsKKyAgIGVycm9yOiB0cnVlLAorICAgdmFsdWU6IGVycm9yCisgIH07CisgfQorfTsKKworLyoqKi8gfSksCisvKiAxMzUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIHVzZXJBZ2VudCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI5KTsKK3ZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7Cit2YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7Cit2YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODsKK3ZhciBtYXRjaCwgdmVyc2lvbjsKK2lmICh2OCkgeworIG1hdGNoID0gdjguc3BsaXQoJy4nKTsKKyB2ZXJzaW9uID0gbWF0Y2hbMF0gKyBtYXRjaFsxXTsKK30gZWxzZSBpZiAodXNlckFnZW50KSB7CisgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcLyhcZCspLyk7CisgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkgeworICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pOworICBpZiAobWF0Y2gpCisgICB2ZXJzaW9uID0gbWF0Y2hbMV07CisgfQorfQorbW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uICYmICt2ZXJzaW9uOworCisvKioqLyB9KSwKKy8qIDEzNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgYUZ1bmN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Myk7Cit2YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMik7Cit2YXIgcGVyZm9ybSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTM0KTsKK3ZhciBpdGVyYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDQpOworJCh7CisgdGFyZ2V0OiAnUHJvbWlzZScsCisgc3RhdDogdHJ1ZQorfSwgeworIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHsKKyAgdmFyIEMgPSB0aGlzOworICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7CisgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlOworICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7CisgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKKyAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpOworICAgdmFyIHZhbHVlcyA9IFtdOworICAgdmFyIGNvdW50ZXIgPSAwOworICAgdmFyIHJlbWFpbmluZyA9IDE7CisgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkgeworICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKzsKKyAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlOworICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7CisgICAgcmVtYWluaW5nKys7CisgICAgcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICBpZiAoYWxyZWFkeUNhbGxlZCkKKyAgICAgIHJldHVybjsKKyAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7CisgICAgIHZhbHVlc1tpbmRleF0gPSB7CisgICAgICBzdGF0dXM6ICdmdWxmaWxsZWQnLAorICAgICAgdmFsdWU6IHZhbHVlCisgICAgIH07CisgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKKyAgICB9LCBmdW5jdGlvbiAoZSkgeworICAgICBpZiAoYWxyZWFkeUNhbGxlZCkKKyAgICAgIHJldHVybjsKKyAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7CisgICAgIHZhbHVlc1tpbmRleF0gPSB7CisgICAgICBzdGF0dXM6ICdyZWplY3RlZCcsCisgICAgICByZWFzb246IGUKKyAgICAgfTsKKyAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpOworICAgIH0pOworICAgfSk7CisgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7CisgIH0pOworICBpZiAocmVzdWx0LmVycm9yKQorICAgcmVqZWN0KHJlc3VsdC52YWx1ZSk7CisgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTM3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBJU19QVVJFID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7Cit2YXIgTmF0aXZlUHJvbWlzZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIzKTsKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKTsKK3ZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7Cit2YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMSk7Cit2YXIgcmVkZWZpbmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK3ZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7CisgTmF0aXZlUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXS5jYWxsKHsKKyAgdGhlbjogZnVuY3Rpb24gKCkgeworICB9CisgfSwgZnVuY3Rpb24gKCkgeworIH0pOworfSk7CiskKHsKKyB0YXJnZXQ6ICdQcm9taXNlJywKKyBwcm90bzogdHJ1ZSwKKyByZWFsOiB0cnVlLAorIGZvcmNlZDogTk9OX0dFTkVSSUMKK30sIHsKKyAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHsKKyAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTsKKyAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7CisgIHJldHVybiB0aGlzLnRoZW4oaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB4OworICAgfSk7CisgIH0gOiBvbkZpbmFsbHksIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkgeworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICB0aHJvdyBlOworICAgfSk7CisgIH0gOiBvbkZpbmFsbHkpOworIH0KK30pOworaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHsKKyByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J10pOworfQorCisvKioqLyB9KSwKKy8qIDEzOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDEzOSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE0NCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE0Mik7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLlVSTDsKKworLyoqKi8gfSksCisvKiAxMzkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCitfX3dfcGRmanNfcmVxdWlyZV9fKDc3KTsKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQwKTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBkZWZpbmVQcm9wZXJ0aWVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg3Mik7Cit2YXIgcmVkZWZpbmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK3ZhciBhbkluc3RhbmNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjYpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIGFzc2lnbiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTAwKTsKK3ZhciBhcnJheUZyb20gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkwKTsKK3ZhciBjb2RlQXQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc4KS5jb2RlQXQ7Cit2YXIgdG9BU0NJSSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQxKTsKK3ZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd19wZGZqc19yZXF1aXJlX18oODUpOwordmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQyKTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgTmF0aXZlVVJMID0gZ2xvYmFsLlVSTDsKK3ZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zOwordmFyIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuZ2V0U3RhdGU7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsVVJMU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignVVJMJyk7Cit2YXIgZmxvb3IgPSBNYXRoLmZsb29yOwordmFyIHBvdyA9IE1hdGgucG93OwordmFyIElOVkFMSURfQVVUSE9SSVRZID0gJ0ludmFsaWQgYXV0aG9yaXR5JzsKK3ZhciBJTlZBTElEX1NDSEVNRSA9ICdJbnZhbGlkIHNjaGVtZSc7Cit2YXIgSU5WQUxJRF9IT1NUID0gJ0ludmFsaWQgaG9zdCc7Cit2YXIgSU5WQUxJRF9QT1JUID0gJ0ludmFsaWQgcG9ydCc7Cit2YXIgQUxQSEEgPSAvW0EtWmEtel0vOwordmFyIEFMUEhBTlVNRVJJQyA9IC9bXGQrLS5BLVphLXpdLzsKK3ZhciBESUdJVCA9IC9cZC87Cit2YXIgSEVYX1NUQVJUID0gL14oMHh8MFgpLzsKK3ZhciBPQ1QgPSAvXlswLTddKyQvOwordmFyIERFQyA9IC9eXGQrJC87Cit2YXIgSEVYID0gL15bXGRBLUZhLWZdKyQvOwordmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQgPSAvW1x1MDAwMFx1MDAwOVx1MDAwQVx1MDAwRCAjJS86P0BbXFxdXS87Cit2YXIgRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVF9FWENMVURJTkdfUEVSQ0VOVCA9IC9bXHUwMDAwXHUwMDA5XHUwMDBBXHUwMDBEICMvOj9AW1xcXV0vOwordmFyIExFQURJTkdfQU5EX1RSQUlMSU5HX0MwX0NPTlRST0xfT1JfU1BBQ0UgPSAvXltcdTAwMDAtXHUwMDFGIF0rfFtcdTAwMDAtXHUwMDFGIF0rJC9nOwordmFyIFRBQl9BTkRfTkVXX0xJTkUgPSAvW1x1MDAwOVx1MDAwQVx1MDAwRF0vZzsKK3ZhciBFT0Y7Cit2YXIgcGFyc2VIb3N0ID0gZnVuY3Rpb24gKHVybCwgaW5wdXQpIHsKKyB2YXIgcmVzdWx0LCBjb2RlUG9pbnRzLCBpbmRleDsKKyBpZiAoaW5wdXQuY2hhckF0KDApID09ICdbJykgeworICBpZiAoaW5wdXQuY2hhckF0KGlucHV0Lmxlbmd0aCAtIDEpICE9ICddJykKKyAgIHJldHVybiBJTlZBTElEX0hPU1Q7CisgIHJlc3VsdCA9IHBhcnNlSVB2NihpbnB1dC5zbGljZSgxLCAtMSkpOworICBpZiAoIXJlc3VsdCkKKyAgIHJldHVybiBJTlZBTElEX0hPU1Q7CisgIHVybC5ob3N0ID0gcmVzdWx0OworIH0gZWxzZSBpZiAoIWlzU3BlY2lhbCh1cmwpKSB7CisgIGlmIChGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5ULnRlc3QoaW5wdXQpKQorICAgcmV0dXJuIElOVkFMSURfSE9TVDsKKyAgcmVzdWx0ID0gJyc7CisgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb2RlUG9pbnRzLmxlbmd0aDsgaW5kZXgrKykgeworICAgcmVzdWx0ICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpbmRleF0sIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpOworICB9CisgIHVybC5ob3N0ID0gcmVzdWx0OworIH0gZWxzZSB7CisgIGlucHV0ID0gdG9BU0NJSShpbnB1dCk7CisgIGlmIChGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5ULnRlc3QoaW5wdXQpKQorICAgcmV0dXJuIElOVkFMSURfSE9TVDsKKyAgcmVzdWx0ID0gcGFyc2VJUHY0KGlucHV0KTsKKyAgaWYgKHJlc3VsdCA9PT0gbnVsbCkKKyAgIHJldHVybiBJTlZBTElEX0hPU1Q7CisgIHVybC5ob3N0ID0gcmVzdWx0OworIH0KK307Cit2YXIgcGFyc2VJUHY0ID0gZnVuY3Rpb24gKGlucHV0KSB7CisgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJy4nKTsKKyB2YXIgcGFydHNMZW5ndGgsIG51bWJlcnMsIGluZGV4LCBwYXJ0LCByYWRpeCwgbnVtYmVyLCBpcHY0OworIGlmIChwYXJ0cy5sZW5ndGggJiYgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT0gJycpIHsKKyAgcGFydHMucG9wKCk7CisgfQorIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoOworIGlmIChwYXJ0c0xlbmd0aCA+IDQpCisgIHJldHVybiBpbnB1dDsKKyBudW1iZXJzID0gW107CisgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGFydHNMZW5ndGg7IGluZGV4KyspIHsKKyAgcGFydCA9IHBhcnRzW2luZGV4XTsKKyAgaWYgKHBhcnQgPT0gJycpCisgICByZXR1cm4gaW5wdXQ7CisgIHJhZGl4ID0gMTA7CisgIGlmIChwYXJ0Lmxlbmd0aCA+IDEgJiYgcGFydC5jaGFyQXQoMCkgPT0gJzAnKSB7CisgICByYWRpeCA9IEhFWF9TVEFSVC50ZXN0KHBhcnQpID8gMTYgOiA4OworICAgcGFydCA9IHBhcnQuc2xpY2UocmFkaXggPT0gOCA/IDEgOiAyKTsKKyAgfQorICBpZiAocGFydCA9PT0gJycpIHsKKyAgIG51bWJlciA9IDA7CisgIH0gZWxzZSB7CisgICBpZiAoIShyYWRpeCA9PSAxMCA/IERFQyA6IHJhZGl4ID09IDggPyBPQ1QgOiBIRVgpLnRlc3QocGFydCkpCisgICAgcmV0dXJuIGlucHV0OworICAgbnVtYmVyID0gcGFyc2VJbnQocGFydCwgcmFkaXgpOworICB9CisgIG51bWJlcnMucHVzaChudW1iZXIpOworIH0KKyBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0c0xlbmd0aDsgaW5kZXgrKykgeworICBudW1iZXIgPSBudW1iZXJzW2luZGV4XTsKKyAgaWYgKGluZGV4ID09IHBhcnRzTGVuZ3RoIC0gMSkgeworICAgaWYgKG51bWJlciA+PSBwb3coMjU2LCA1IC0gcGFydHNMZW5ndGgpKQorICAgIHJldHVybiBudWxsOworICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkKKyAgIHJldHVybiBudWxsOworIH0KKyBpcHY0ID0gbnVtYmVycy5wb3AoKTsKKyBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJzLmxlbmd0aDsgaW5kZXgrKykgeworICBpcHY0ICs9IG51bWJlcnNbaW5kZXhdICogcG93KDI1NiwgMyAtIGluZGV4KTsKKyB9CisgcmV0dXJuIGlwdjQ7Cit9OwordmFyIHBhcnNlSVB2NiA9IGZ1bmN0aW9uIChpbnB1dCkgeworIHZhciBhZGRyZXNzID0gWworICAwLAorICAwLAorICAwLAorICAwLAorICAwLAorICAwLAorICAwLAorICAwCisgXTsKKyB2YXIgcGllY2VJbmRleCA9IDA7CisgdmFyIGNvbXByZXNzID0gbnVsbDsKKyB2YXIgcG9pbnRlciA9IDA7CisgdmFyIHZhbHVlLCBsZW5ndGgsIG51bWJlcnNTZWVuLCBpcHY0UGllY2UsIG51bWJlciwgc3dhcHMsIHN3YXA7CisgdmFyIGNoYXIgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBpbnB1dC5jaGFyQXQocG9pbnRlcik7CisgfTsKKyBpZiAoY2hhcigpID09ICc6JykgeworICBpZiAoaW5wdXQuY2hhckF0KDEpICE9ICc6JykKKyAgIHJldHVybjsKKyAgcG9pbnRlciArPSAyOworICBwaWVjZUluZGV4Kys7CisgIGNvbXByZXNzID0gcGllY2VJbmRleDsKKyB9Cisgd2hpbGUgKGNoYXIoKSkgeworICBpZiAocGllY2VJbmRleCA9PSA4KQorICAgcmV0dXJuOworICBpZiAoY2hhcigpID09ICc6JykgeworICAgaWYgKGNvbXByZXNzICE9PSBudWxsKQorICAgIHJldHVybjsKKyAgIHBvaW50ZXIrKzsKKyAgIHBpZWNlSW5kZXgrKzsKKyAgIGNvbXByZXNzID0gcGllY2VJbmRleDsKKyAgIGNvbnRpbnVlOworICB9CisgIHZhbHVlID0gbGVuZ3RoID0gMDsKKyAgd2hpbGUgKGxlbmd0aCA8IDQgJiYgSEVYLnRlc3QoY2hhcigpKSkgeworICAgdmFsdWUgPSB2YWx1ZSAqIDE2ICsgcGFyc2VJbnQoY2hhcigpLCAxNik7CisgICBwb2ludGVyKys7CisgICBsZW5ndGgrKzsKKyAgfQorICBpZiAoY2hhcigpID09ICcuJykgeworICAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHJldHVybjsKKyAgIHBvaW50ZXIgLT0gbGVuZ3RoOworICAgaWYgKHBpZWNlSW5kZXggPiA2KQorICAgIHJldHVybjsKKyAgIG51bWJlcnNTZWVuID0gMDsKKyAgIHdoaWxlIChjaGFyKCkpIHsKKyAgICBpcHY0UGllY2UgPSBudWxsOworICAgIGlmIChudW1iZXJzU2VlbiA+IDApIHsKKyAgICAgaWYgKGNoYXIoKSA9PSAnLicgJiYgbnVtYmVyc1NlZW4gPCA0KQorICAgICAgcG9pbnRlcisrOworICAgICBlbHNlCisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghRElHSVQudGVzdChjaGFyKCkpKQorICAgICByZXR1cm47CisgICAgd2hpbGUgKERJR0lULnRlc3QoY2hhcigpKSkgeworICAgICBudW1iZXIgPSBwYXJzZUludChjaGFyKCksIDEwKTsKKyAgICAgaWYgKGlwdjRQaWVjZSA9PT0gbnVsbCkKKyAgICAgIGlwdjRQaWVjZSA9IG51bWJlcjsKKyAgICAgZWxzZSBpZiAoaXB2NFBpZWNlID09IDApCisgICAgICByZXR1cm47CisgICAgIGVsc2UKKyAgICAgIGlwdjRQaWVjZSA9IGlwdjRQaWVjZSAqIDEwICsgbnVtYmVyOworICAgICBpZiAoaXB2NFBpZWNlID4gMjU1KQorICAgICAgcmV0dXJuOworICAgICBwb2ludGVyKys7CisgICAgfQorICAgIGFkZHJlc3NbcGllY2VJbmRleF0gPSBhZGRyZXNzW3BpZWNlSW5kZXhdICogMjU2ICsgaXB2NFBpZWNlOworICAgIG51bWJlcnNTZWVuKys7CisgICAgaWYgKG51bWJlcnNTZWVuID09IDIgfHwgbnVtYmVyc1NlZW4gPT0gNCkKKyAgICAgcGllY2VJbmRleCsrOworICAgfQorICAgaWYgKG51bWJlcnNTZWVuICE9IDQpCisgICAgcmV0dXJuOworICAgYnJlYWs7CisgIH0gZWxzZSBpZiAoY2hhcigpID09ICc6JykgeworICAgcG9pbnRlcisrOworICAgaWYgKCFjaGFyKCkpCisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKGNoYXIoKSkKKyAgIHJldHVybjsKKyAgYWRkcmVzc1twaWVjZUluZGV4KytdID0gdmFsdWU7CisgfQorIGlmIChjb21wcmVzcyAhPT0gbnVsbCkgeworICBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzczsKKyAgcGllY2VJbmRleCA9IDc7CisgIHdoaWxlIChwaWVjZUluZGV4ICE9IDAgJiYgc3dhcHMgPiAwKSB7CisgICBzd2FwID0gYWRkcmVzc1twaWVjZUluZGV4XTsKKyAgIGFkZHJlc3NbcGllY2VJbmRleC0tXSA9IGFkZHJlc3NbY29tcHJlc3MgKyBzd2FwcyAtIDFdOworICAgYWRkcmVzc1tjb21wcmVzcyArIC0tc3dhcHNdID0gc3dhcDsKKyAgfQorIH0gZWxzZSBpZiAocGllY2VJbmRleCAhPSA4KQorICByZXR1cm47CisgcmV0dXJuIGFkZHJlc3M7Cit9OwordmFyIGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlID0gZnVuY3Rpb24gKGlwdjYpIHsKKyB2YXIgbWF4SW5kZXggPSBudWxsOworIHZhciBtYXhMZW5ndGggPSAxOworIHZhciBjdXJyU3RhcnQgPSBudWxsOworIHZhciBjdXJyTGVuZ3RoID0gMDsKKyB2YXIgaW5kZXggPSAwOworIGZvciAoOyBpbmRleCA8IDg7IGluZGV4KyspIHsKKyAgaWYgKGlwdjZbaW5kZXhdICE9PSAwKSB7CisgICBpZiAoY3Vyckxlbmd0aCA+IG1heExlbmd0aCkgeworICAgIG1heEluZGV4ID0gY3VyclN0YXJ0OworICAgIG1heExlbmd0aCA9IGN1cnJMZW5ndGg7CisgICB9CisgICBjdXJyU3RhcnQgPSBudWxsOworICAgY3Vyckxlbmd0aCA9IDA7CisgIH0gZWxzZSB7CisgICBpZiAoY3VyclN0YXJ0ID09PSBudWxsKQorICAgIGN1cnJTdGFydCA9IGluZGV4OworICAgKytjdXJyTGVuZ3RoOworICB9CisgfQorIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7CisgIG1heEluZGV4ID0gY3VyclN0YXJ0OworICBtYXhMZW5ndGggPSBjdXJyTGVuZ3RoOworIH0KKyByZXR1cm4gbWF4SW5kZXg7Cit9OwordmFyIHNlcmlhbGl6ZUhvc3QgPSBmdW5jdGlvbiAoaG9zdCkgeworIHZhciByZXN1bHQsIGluZGV4LCBjb21wcmVzcywgaWdub3JlMDsKKyBpZiAodHlwZW9mIGhvc3QgPT0gJ251bWJlcicpIHsKKyAgcmVzdWx0ID0gW107CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIHsKKyAgIHJlc3VsdC51bnNoaWZ0KGhvc3QgJSAyNTYpOworICAgaG9zdCA9IGZsb29yKGhvc3QgLyAyNTYpOworICB9CisgIHJldHVybiByZXN1bHQuam9pbignLicpOworIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHsKKyAgcmVzdWx0ID0gJyc7CisgIGNvbXByZXNzID0gZmluZExvbmdlc3RaZXJvU2VxdWVuY2UoaG9zdCk7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHsKKyAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKQorICAgIGNvbnRpbnVlOworICAgaWYgKGlnbm9yZTApCisgICAgaWdub3JlMCA9IGZhbHNlOworICAgaWYgKGNvbXByZXNzID09PSBpbmRleCkgeworICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7CisgICAgaWdub3JlMCA9IHRydWU7CisgICB9IGVsc2UgeworICAgIHJlc3VsdCArPSBob3N0W2luZGV4XS50b1N0cmluZygxNik7CisgICAgaWYgKGluZGV4IDwgNykKKyAgICAgcmVzdWx0ICs9ICc6JzsKKyAgIH0KKyAgfQorICByZXR1cm4gJ1snICsgcmVzdWx0ICsgJ10nOworIH0KKyByZXR1cm4gaG9zdDsKK307Cit2YXIgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCA9IHt9OwordmFyIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCwgeworICcgJzogMSwKKyAnIic6IDEsCisgJzwnOiAxLAorICc+JzogMSwKKyAnYCc6IDEKK30pOwordmFyIHBhdGhQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQsIHsKKyAnIyc6IDEsCisgJz8nOiAxLAorICd7JzogMSwKKyAnfSc6IDEKK30pOwordmFyIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgcGF0aFBlcmNlbnRFbmNvZGVTZXQsIHsKKyAnLyc6IDEsCisgJzonOiAxLAorICc7JzogMSwKKyAnPSc6IDEsCisgJ0AnOiAxLAorICdbJzogMSwKKyAnXFwnOiAxLAorICddJzogMSwKKyAnXic6IDEsCisgJ3wnOiAxCit9KTsKK3ZhciBwZXJjZW50RW5jb2RlID0gZnVuY3Rpb24gKGNoYXIsIHNldCkgeworIHZhciBjb2RlID0gY29kZUF0KGNoYXIsIDApOworIHJldHVybiBjb2RlID4gMHgyMCAmJiBjb2RlIDwgMHg3RiAmJiAhaGFzKHNldCwgY2hhcikgPyBjaGFyIDogZW5jb2RlVVJJQ29tcG9uZW50KGNoYXIpOworfTsKK3ZhciBzcGVjaWFsU2NoZW1lcyA9IHsKKyBmdHA6IDIxLAorIGZpbGU6IG51bGwsCisgaHR0cDogODAsCisgaHR0cHM6IDQ0MywKKyB3czogODAsCisgd3NzOiA0NDMKK307Cit2YXIgaXNTcGVjaWFsID0gZnVuY3Rpb24gKHVybCkgeworIHJldHVybiBoYXMoc3BlY2lhbFNjaGVtZXMsIHVybC5zY2hlbWUpOworfTsKK3ZhciBpbmNsdWRlc0NyZWRlbnRpYWxzID0gZnVuY3Rpb24gKHVybCkgeworIHJldHVybiB1cmwudXNlcm5hbWUgIT0gJycgfHwgdXJsLnBhc3N3b3JkICE9ICcnOworfTsKK3ZhciBjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQgPSBmdW5jdGlvbiAodXJsKSB7CisgcmV0dXJuICF1cmwuaG9zdCB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09ICdmaWxlJzsKK307Cit2YXIgaXNXaW5kb3dzRHJpdmVMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nLCBub3JtYWxpemVkKSB7CisgdmFyIHNlY29uZDsKKyByZXR1cm4gc3RyaW5nLmxlbmd0aCA9PSAyICYmIEFMUEhBLnRlc3Qoc3RyaW5nLmNoYXJBdCgwKSkgJiYgKChzZWNvbmQgPSBzdHJpbmcuY2hhckF0KDEpKSA9PSAnOicgfHwgIW5vcm1hbGl6ZWQgJiYgc2Vjb25kID09ICd8Jyk7Cit9OwordmFyIHN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CisgdmFyIHRoaXJkOworIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmcuc2xpY2UoMCwgMikpICYmIChzdHJpbmcubGVuZ3RoID09IDIgfHwgKCh0aGlyZCA9IHN0cmluZy5jaGFyQXQoMikpID09PSAnLycgfHwgdGhpcmQgPT09ICdcXCcgfHwgdGhpcmQgPT09ICc/JyB8fCB0aGlyZCA9PT0gJyMnKSk7Cit9OwordmFyIHNob3J0ZW5VUkxzUGF0aCA9IGZ1bmN0aW9uICh1cmwpIHsKKyB2YXIgcGF0aCA9IHVybC5wYXRoOworIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoOworIGlmIChwYXRoU2l6ZSAmJiAodXJsLnNjaGVtZSAhPSAnZmlsZScgfHwgcGF0aFNpemUgIT0gMSB8fCAhaXNXaW5kb3dzRHJpdmVMZXR0ZXIocGF0aFswXSwgdHJ1ZSkpKSB7CisgIHBhdGgucG9wKCk7CisgfQorfTsKK3ZhciBpc1NpbmdsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7CisgcmV0dXJuIHNlZ21lbnQgPT09ICcuJyB8fCBzZWdtZW50LnRvTG93ZXJDYXNlKCkgPT09ICclMmUnOworfTsKK3ZhciBpc0RvdWJsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7Cisgc2VnbWVudCA9IHNlZ21lbnQudG9Mb3dlckNhc2UoKTsKKyByZXR1cm4gc2VnbWVudCA9PT0gJy4uJyB8fCBzZWdtZW50ID09PSAnJTJlLicgfHwgc2VnbWVudCA9PT0gJy4lMmUnIHx8IHNlZ21lbnQgPT09ICclMmUlMmUnOworfTsKK3ZhciBTQ0hFTUVfU1RBUlQgPSB7fTsKK3ZhciBTQ0hFTUUgPSB7fTsKK3ZhciBOT19TQ0hFTUUgPSB7fTsKK3ZhciBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWSA9IHt9OwordmFyIFBBVEhfT1JfQVVUSE9SSVRZID0ge307Cit2YXIgUkVMQVRJVkUgPSB7fTsKK3ZhciBSRUxBVElWRV9TTEFTSCA9IHt9OwordmFyIFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVMgPSB7fTsKK3ZhciBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUyA9IHt9OwordmFyIEFVVEhPUklUWSA9IHt9OwordmFyIEhPU1QgPSB7fTsKK3ZhciBIT1NUTkFNRSA9IHt9OwordmFyIFBPUlQgPSB7fTsKK3ZhciBGSUxFID0ge307Cit2YXIgRklMRV9TTEFTSCA9IHt9OwordmFyIEZJTEVfSE9TVCA9IHt9OwordmFyIFBBVEhfU1RBUlQgPSB7fTsKK3ZhciBQQVRIID0ge307Cit2YXIgQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSCA9IHt9OwordmFyIFFVRVJZID0ge307Cit2YXIgRlJBR01FTlQgPSB7fTsKK3ZhciBwYXJzZVVSTCA9IGZ1bmN0aW9uICh1cmwsIGlucHV0LCBzdGF0ZU92ZXJyaWRlLCBiYXNlKSB7CisgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBTQ0hFTUVfU1RBUlQ7CisgdmFyIHBvaW50ZXIgPSAwOworIHZhciBidWZmZXIgPSAnJzsKKyB2YXIgc2VlbkF0ID0gZmFsc2U7CisgdmFyIHNlZW5CcmFja2V0ID0gZmFsc2U7CisgdmFyIHNlZW5QYXNzd29yZFRva2VuID0gZmFsc2U7CisgdmFyIGNvZGVQb2ludHMsIGNoYXIsIGJ1ZmZlckNvZGVQb2ludHMsIGZhaWx1cmU7CisgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7CisgIHVybC5zY2hlbWUgPSAnJzsKKyAgdXJsLnVzZXJuYW1lID0gJyc7CisgIHVybC5wYXNzd29yZCA9ICcnOworICB1cmwuaG9zdCA9IG51bGw7CisgIHVybC5wb3J0ID0gbnVsbDsKKyAgdXJsLnBhdGggPSBbXTsKKyAgdXJsLnF1ZXJ5ID0gbnVsbDsKKyAgdXJsLmZyYWdtZW50ID0gbnVsbDsKKyAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSBmYWxzZTsKKyAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKExFQURJTkdfQU5EX1RSQUlMSU5HX0MwX0NPTlRST0xfT1JfU1BBQ0UsICcnKTsKKyB9CisgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFRBQl9BTkRfTkVXX0xJTkUsICcnKTsKKyBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKGlucHV0KTsKKyB3aGlsZSAocG9pbnRlciA8PSBjb2RlUG9pbnRzLmxlbmd0aCkgeworICBjaGFyID0gY29kZVBvaW50c1twb2ludGVyXTsKKyAgc3dpdGNoIChzdGF0ZSkgeworICBjYXNlIFNDSEVNRV9TVEFSVDoKKyAgIGlmIChjaGFyICYmIEFMUEhBLnRlc3QoY2hhcikpIHsKKyAgICBidWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpOworICAgIHN0YXRlID0gU0NIRU1FOworICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkgeworICAgIHN0YXRlID0gTk9fU0NIRU1FOworICAgIGNvbnRpbnVlOworICAgfSBlbHNlCisgICAgcmV0dXJuIElOVkFMSURfU0NIRU1FOworICAgYnJlYWs7CisgIGNhc2UgU0NIRU1FOgorICAgaWYgKGNoYXIgJiYgKEFMUEhBTlVNRVJJQy50ZXN0KGNoYXIpIHx8IGNoYXIgPT0gJysnIHx8IGNoYXIgPT0gJy0nIHx8IGNoYXIgPT0gJy4nKSkgeworICAgIGJ1ZmZlciArPSBjaGFyLnRvTG93ZXJDYXNlKCk7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonKSB7CisgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgKGlzU3BlY2lhbCh1cmwpICE9IGhhcyhzcGVjaWFsU2NoZW1lcywgYnVmZmVyKSB8fCBidWZmZXIgPT0gJ2ZpbGUnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpIHx8IHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwuaG9zdCkpCisgICAgIHJldHVybjsKKyAgICB1cmwuc2NoZW1lID0gYnVmZmVyOworICAgIGlmIChzdGF0ZU92ZXJyaWRlKSB7CisgICAgIGlmIChpc1NwZWNpYWwodXJsKSAmJiBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSA9PSB1cmwucG9ydCkKKyAgICAgIHVybC5wb3J0ID0gbnVsbDsKKyAgICAgcmV0dXJuOworICAgIH0KKyAgICBidWZmZXIgPSAnJzsKKyAgICBpZiAodXJsLnNjaGVtZSA9PSAnZmlsZScpIHsKKyAgICAgc3RhdGUgPSBGSUxFOworICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHVybCkgJiYgYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSB1cmwuc2NoZW1lKSB7CisgICAgIHN0YXRlID0gU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFk7CisgICAgfSBlbHNlIGlmIChpc1NwZWNpYWwodXJsKSkgeworICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVM7CisgICAgfSBlbHNlIGlmIChjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHsKKyAgICAgc3RhdGUgPSBQQVRIX09SX0FVVEhPUklUWTsKKyAgICAgcG9pbnRlcisrOworICAgIH0gZWxzZSB7CisgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTsKKyAgICAgdXJsLnBhdGgucHVzaCgnJyk7CisgICAgIHN0YXRlID0gQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSDsKKyAgICB9CisgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7CisgICAgYnVmZmVyID0gJyc7CisgICAgc3RhdGUgPSBOT19TQ0hFTUU7CisgICAgcG9pbnRlciA9IDA7CisgICAgY29udGludWU7CisgICB9IGVsc2UKKyAgICByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7CisgICBicmVhazsKKyAgY2FzZSBOT19TQ0hFTUU6CisgICBpZiAoIWJhc2UgfHwgYmFzZS5jYW5ub3RCZUFCYXNlVVJMICYmIGNoYXIgIT0gJyMnKQorICAgIHJldHVybiBJTlZBTElEX1NDSEVNRTsKKyAgIGlmIChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciA9PSAnIycpIHsKKyAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7CisgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKKyAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OworICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTsKKyAgICBzdGF0ZSA9IEZSQUdNRU5UOworICAgIGJyZWFrOworICAgfQorICAgc3RhdGUgPSBiYXNlLnNjaGVtZSA9PSAnZmlsZScgPyBGSUxFIDogUkVMQVRJVkU7CisgICBjb250aW51ZTsKKyAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWToKKyAgIGlmIChjaGFyID09ICcvJyAmJiBjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHsKKyAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOworICAgIHBvaW50ZXIrKzsKKyAgIH0gZWxzZSB7CisgICAgc3RhdGUgPSBSRUxBVElWRTsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIFBBVEhfT1JfQVVUSE9SSVRZOgorICAgaWYgKGNoYXIgPT0gJy8nKSB7CisgICAgc3RhdGUgPSBBVVRIT1JJVFk7CisgICAgYnJlYWs7CisgICB9IGVsc2UgeworICAgIHN0YXRlID0gUEFUSDsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgY2FzZSBSRUxBVElWRToKKyAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTsKKyAgIGlmIChjaGFyID09IEVPRikgeworICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7CisgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDsKKyAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKKyAgICB1cmwucG9ydCA9IGJhc2UucG9ydDsKKyAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOworICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkgeworICAgIHN0YXRlID0gUkVMQVRJVkVfU0xBU0g7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJz8nKSB7CisgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTsKKyAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkOworICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OworICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0OworICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CisgICAgdXJsLnF1ZXJ5ID0gJyc7CisgICAgc3RhdGUgPSBRVUVSWTsKKyAgIH0gZWxzZSBpZiAoY2hhciA9PSAnIycpIHsKKyAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lOworICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7CisgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7CisgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKKyAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OworICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgIHN0YXRlID0gRlJBR01FTlQ7CisgICB9IGVsc2UgeworICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7CisgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDsKKyAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKKyAgICB1cmwucG9ydCA9IGJhc2UucG9ydDsKKyAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOworICAgIHVybC5wYXRoLnBvcCgpOworICAgIHN0YXRlID0gUEFUSDsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIFJFTEFUSVZFX1NMQVNIOgorICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXCcpKSB7CisgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUzsKKyAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycpIHsKKyAgICBzdGF0ZSA9IEFVVEhPUklUWTsKKyAgIH0gZWxzZSB7CisgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTsKKyAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkOworICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OworICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0OworICAgIHN0YXRlID0gUEFUSDsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVM6CisgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOworICAgaWYgKGNoYXIgIT0gJy8nIHx8IGJ1ZmZlci5jaGFyQXQocG9pbnRlciArIDEpICE9ICcvJykKKyAgICBjb250aW51ZTsKKyAgIHBvaW50ZXIrKzsKKyAgIGJyZWFrOworICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOgorICAgaWYgKGNoYXIgIT0gJy8nICYmIGNoYXIgIT0gJ1xcJykgeworICAgIHN0YXRlID0gQVVUSE9SSVRZOworICAgIGNvbnRpbnVlOworICAgfQorICAgYnJlYWs7CisgIGNhc2UgQVVUSE9SSVRZOgorICAgaWYgKGNoYXIgPT0gJ0AnKSB7CisgICAgaWYgKHNlZW5BdCkKKyAgICAgYnVmZmVyID0gJyU0MCcgKyBidWZmZXI7CisgICAgc2VlbkF0ID0gdHJ1ZTsKKyAgICBidWZmZXJDb2RlUG9pbnRzID0gYXJyYXlGcm9tKGJ1ZmZlcik7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJDb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgIHZhciBjb2RlUG9pbnQgPSBidWZmZXJDb2RlUG9pbnRzW2ldOworICAgICBpZiAoY29kZVBvaW50ID09ICc6JyAmJiAhc2VlblBhc3N3b3JkVG9rZW4pIHsKKyAgICAgIHNlZW5QYXNzd29yZFRva2VuID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgICB9CisgICAgIHZhciBlbmNvZGVkQ29kZVBvaW50cyA9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50LCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpOworICAgICBpZiAoc2VlblBhc3N3b3JkVG9rZW4pCisgICAgICB1cmwucGFzc3dvcmQgKz0gZW5jb2RlZENvZGVQb2ludHM7CisgICAgIGVsc2UKKyAgICAgIHVybC51c2VybmFtZSArPSBlbmNvZGVkQ29kZVBvaW50czsKKyAgICB9CisgICAgYnVmZmVyID0gJyc7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnIHx8IGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkgeworICAgIGlmIChzZWVuQXQgJiYgYnVmZmVyID09ICcnKQorICAgICByZXR1cm4gSU5WQUxJRF9BVVRIT1JJVFk7CisgICAgcG9pbnRlciAtPSBhcnJheUZyb20oYnVmZmVyKS5sZW5ndGggKyAxOworICAgIGJ1ZmZlciA9ICcnOworICAgIHN0YXRlID0gSE9TVDsKKyAgIH0gZWxzZQorICAgIGJ1ZmZlciArPSBjaGFyOworICAgYnJlYWs7CisgIGNhc2UgSE9TVDoKKyAgY2FzZSBIT1NUTkFNRToKKyAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7CisgICAgc3RhdGUgPSBGSUxFX0hPU1Q7CisgICAgY29udGludWU7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonICYmICFzZWVuQnJhY2tldCkgeworICAgIGlmIChidWZmZXIgPT0gJycpCisgICAgIHJldHVybiBJTlZBTElEX0hPU1Q7CisgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7CisgICAgaWYgKGZhaWx1cmUpCisgICAgIHJldHVybiBmYWlsdXJlOworICAgIGJ1ZmZlciA9ICcnOworICAgIHN0YXRlID0gUE9SVDsKKyAgICBpZiAoc3RhdGVPdmVycmlkZSA9PSBIT1NUTkFNRSkKKyAgICAgcmV0dXJuOworICAgfSBlbHNlIGlmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICcvJyB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJyB8fCBjaGFyID09ICdcXCcgJiYgaXNTcGVjaWFsKHVybCkpIHsKKyAgICBpZiAoaXNTcGVjaWFsKHVybCkgJiYgYnVmZmVyID09ICcnKQorICAgICByZXR1cm4gSU5WQUxJRF9IT1NUOworICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIGJ1ZmZlciA9PSAnJyAmJiAoaW5jbHVkZXNDcmVkZW50aWFscyh1cmwpIHx8IHVybC5wb3J0ICE9PSBudWxsKSkKKyAgICAgcmV0dXJuOworICAgIGZhaWx1cmUgPSBwYXJzZUhvc3QodXJsLCBidWZmZXIpOworICAgIGlmIChmYWlsdXJlKQorICAgICByZXR1cm4gZmFpbHVyZTsKKyAgICBidWZmZXIgPSAnJzsKKyAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CisgICAgaWYgKHN0YXRlT3ZlcnJpZGUpCisgICAgIHJldHVybjsKKyAgICBjb250aW51ZTsKKyAgIH0gZWxzZSB7CisgICAgaWYgKGNoYXIgPT0gJ1snKQorICAgICBzZWVuQnJhY2tldCA9IHRydWU7CisgICAgZWxzZSBpZiAoY2hhciA9PSAnXScpCisgICAgIHNlZW5CcmFja2V0ID0gZmFsc2U7CisgICAgYnVmZmVyICs9IGNoYXI7CisgICB9CisgICBicmVhazsKKyAgY2FzZSBQT1JUOgorICAgaWYgKERJR0lULnRlc3QoY2hhcikpIHsKKyAgICBidWZmZXIgKz0gY2hhcjsKKyAgIH0gZWxzZSBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHwgY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpIHx8IHN0YXRlT3ZlcnJpZGUpIHsKKyAgICBpZiAoYnVmZmVyICE9ICcnKSB7CisgICAgIHZhciBwb3J0ID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7CisgICAgIGlmIChwb3J0ID4gMHhGRkZGKQorICAgICAgcmV0dXJuIElOVkFMSURfUE9SVDsKKyAgICAgdXJsLnBvcnQgPSBpc1NwZWNpYWwodXJsKSAmJiBwb3J0ID09PSBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSA/IG51bGwgOiBwb3J0OworICAgICBidWZmZXIgPSAnJzsKKyAgICB9CisgICAgaWYgKHN0YXRlT3ZlcnJpZGUpCisgICAgIHJldHVybjsKKyAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CisgICAgY29udGludWU7CisgICB9IGVsc2UKKyAgICByZXR1cm4gSU5WQUxJRF9QT1JUOworICAgYnJlYWs7CisgIGNhc2UgRklMRToKKyAgIHVybC5zY2hlbWUgPSAnZmlsZSc7CisgICBpZiAoY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnKQorICAgIHN0YXRlID0gRklMRV9TTEFTSDsKKyAgIGVsc2UgaWYgKGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnKSB7CisgICAgaWYgKGNoYXIgPT0gRU9GKSB7CisgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OworICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOworICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OworICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnPycpIHsKKyAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CisgICAgIHVybC5xdWVyeSA9ICcnOworICAgICBzdGF0ZSA9IFFVRVJZOworICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnIycpIHsKKyAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CisgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7CisgICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgICBzdGF0ZSA9IEZSQUdNRU5UOworICAgIH0gZWxzZSB7CisgICAgIGlmICghc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihjb2RlUG9pbnRzLnNsaWNlKHBvaW50ZXIpLmpvaW4oJycpKSkgeworICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOworICAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7CisgICAgIH0KKyAgICAgc3RhdGUgPSBQQVRIOworICAgICBjb250aW51ZTsKKyAgICB9CisgICB9IGVsc2UgeworICAgIHN0YXRlID0gUEFUSDsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIEZJTEVfU0xBU0g6CisgICBpZiAoY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnKSB7CisgICAgc3RhdGUgPSBGSUxFX0hPU1Q7CisgICAgYnJlYWs7CisgICB9CisgICBpZiAoYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSAnZmlsZScgJiYgIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoY29kZVBvaW50cy5zbGljZShwb2ludGVyKS5qb2luKCcnKSkpIHsKKyAgICBpZiAoaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYmFzZS5wYXRoWzBdLCB0cnVlKSkKKyAgICAgdXJsLnBhdGgucHVzaChiYXNlLnBhdGhbMF0pOworICAgIGVsc2UKKyAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICB9CisgICBzdGF0ZSA9IFBBVEg7CisgICBjb250aW51ZTsKKyAgY2FzZSBGSUxFX0hPU1Q6CisgICBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnKSB7CisgICAgaWYgKCFzdGF0ZU92ZXJyaWRlICYmIGlzV2luZG93c0RyaXZlTGV0dGVyKGJ1ZmZlcikpIHsKKyAgICAgc3RhdGUgPSBQQVRIOworICAgIH0gZWxzZSBpZiAoYnVmZmVyID09ICcnKSB7CisgICAgIHVybC5ob3N0ID0gJyc7CisgICAgIGlmIChzdGF0ZU92ZXJyaWRlKQorICAgICAgcmV0dXJuOworICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CisgICAgfSBlbHNlIHsKKyAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7CisgICAgIGlmIChmYWlsdXJlKQorICAgICAgcmV0dXJuIGZhaWx1cmU7CisgICAgIGlmICh1cmwuaG9zdCA9PSAnbG9jYWxob3N0JykKKyAgICAgIHVybC5ob3N0ID0gJyc7CisgICAgIGlmIChzdGF0ZU92ZXJyaWRlKQorICAgICAgcmV0dXJuOworICAgICBidWZmZXIgPSAnJzsKKyAgICAgc3RhdGUgPSBQQVRIX1NUQVJUOworICAgIH0KKyAgICBjb250aW51ZTsKKyAgIH0gZWxzZQorICAgIGJ1ZmZlciArPSBjaGFyOworICAgYnJlYWs7CisgIGNhc2UgUEFUSF9TVEFSVDoKKyAgIGlmIChpc1NwZWNpYWwodXJsKSkgeworICAgIHN0YXRlID0gUEFUSDsKKyAgICBpZiAoY2hhciAhPSAnLycgJiYgY2hhciAhPSAnXFwnKQorICAgICBjb250aW51ZTsKKyAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnPycpIHsKKyAgICB1cmwucXVlcnkgPSAnJzsKKyAgICBzdGF0ZSA9IFFVRVJZOworICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICcjJykgeworICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgIHN0YXRlID0gRlJBR01FTlQ7CisgICB9IGVsc2UgaWYgKGNoYXIgIT0gRU9GKSB7CisgICAgc3RhdGUgPSBQQVRIOworICAgIGlmIChjaGFyICE9ICcvJykKKyAgICAgY29udGludWU7CisgICB9CisgICBicmVhazsKKyAgY2FzZSBQQVRIOgorICAgaWYgKGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSB8fCAhc3RhdGVPdmVycmlkZSAmJiAoY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycpKSB7CisgICAgaWYgKGlzRG91YmxlRG90KGJ1ZmZlcikpIHsKKyAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7CisgICAgIGlmIChjaGFyICE9ICcvJyAmJiAhKGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHsKKyAgICAgIHVybC5wYXRoLnB1c2goJycpOworICAgICB9CisgICAgfSBlbHNlIGlmIChpc1NpbmdsZURvdChidWZmZXIpKSB7CisgICAgIGlmIChjaGFyICE9ICcvJyAmJiAhKGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHsKKyAgICAgIHVybC5wYXRoLnB1c2goJycpOworICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwucGF0aC5sZW5ndGggJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkgeworICAgICAgaWYgKHVybC5ob3N0KQorICAgICAgIHVybC5ob3N0ID0gJyc7CisgICAgICBidWZmZXIgPSBidWZmZXIuY2hhckF0KDApICsgJzonOworICAgICB9CisgICAgIHVybC5wYXRoLnB1c2goYnVmZmVyKTsKKyAgICB9CisgICAgYnVmZmVyID0gJyc7CisgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpIHsKKyAgICAgd2hpbGUgKHVybC5wYXRoLmxlbmd0aCA+IDEgJiYgdXJsLnBhdGhbMF0gPT09ICcnKSB7CisgICAgICB1cmwucGF0aC5zaGlmdCgpOworICAgICB9CisgICAgfQorICAgIGlmIChjaGFyID09ICc/JykgeworICAgICB1cmwucXVlcnkgPSAnJzsKKyAgICAgc3RhdGUgPSBRVUVSWTsKKyAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7CisgICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgICBzdGF0ZSA9IEZSQUdNRU5UOworICAgIH0KKyAgIH0gZWxzZSB7CisgICAgYnVmZmVyICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgcGF0aFBlcmNlbnRFbmNvZGVTZXQpOworICAgfQorICAgYnJlYWs7CisgIGNhc2UgQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSDoKKyAgIGlmIChjaGFyID09ICc/JykgeworICAgIHVybC5xdWVyeSA9ICcnOworICAgIHN0YXRlID0gUVVFUlk7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7CisgICAgdXJsLmZyYWdtZW50ID0gJyc7CisgICAgc3RhdGUgPSBGUkFHTUVOVDsKKyAgIH0gZWxzZSBpZiAoY2hhciAhPSBFT0YpIHsKKyAgICB1cmwucGF0aFswXSArPSBwZXJjZW50RW5jb2RlKGNoYXIsIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpOworICAgfQorICAgYnJlYWs7CisgIGNhc2UgUVVFUlk6CisgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnIycpIHsKKyAgICB1cmwuZnJhZ21lbnQgPSAnJzsKKyAgICBzdGF0ZSA9IEZSQUdNRU5UOworICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikgeworICAgIGlmIChjaGFyID09ICInIiAmJiBpc1NwZWNpYWwodXJsKSkKKyAgICAgdXJsLnF1ZXJ5ICs9ICclMjcnOworICAgIGVsc2UgaWYgKGNoYXIgPT0gJyMnKQorICAgICB1cmwucXVlcnkgKz0gJyUyMyc7CisgICAgZWxzZQorICAgICB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaGFyLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIEZSQUdNRU5UOgorICAgaWYgKGNoYXIgIT0gRU9GKQorICAgIHVybC5mcmFnbWVudCArPSBwZXJjZW50RW5jb2RlKGNoYXIsIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCk7CisgICBicmVhazsKKyAgfQorICBwb2ludGVyKys7CisgfQorfTsKK3ZhciBVUkxDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFVSTCh1cmwpIHsKKyB2YXIgdGhhdCA9IGFuSW5zdGFuY2UodGhpcywgVVJMQ29uc3RydWN0b3IsICdVUkwnKTsKKyB2YXIgYmFzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOworIHZhciB1cmxTdHJpbmcgPSBTdHJpbmcodXJsKTsKKyB2YXIgc3RhdGUgPSBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHsgdHlwZTogJ1VSTCcgfSk7CisgdmFyIGJhc2VTdGF0ZSwgZmFpbHVyZTsKKyBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7CisgIGlmIChiYXNlIGluc3RhbmNlb2YgVVJMQ29uc3RydWN0b3IpCisgICBiYXNlU3RhdGUgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKGJhc2UpOworICBlbHNlIHsKKyAgIGZhaWx1cmUgPSBwYXJzZVVSTChiYXNlU3RhdGUgPSB7fSwgU3RyaW5nKGJhc2UpKTsKKyAgIGlmIChmYWlsdXJlKQorICAgIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTsKKyAgfQorIH0KKyBmYWlsdXJlID0gcGFyc2VVUkwoc3RhdGUsIHVybFN0cmluZywgbnVsbCwgYmFzZVN0YXRlKTsKKyBpZiAoZmFpbHVyZSkKKyAgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpOworIHZhciBzZWFyY2hQYXJhbXMgPSBzdGF0ZS5zZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7CisgdmFyIHNlYXJjaFBhcmFtc1N0YXRlID0gZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZShzZWFyY2hQYXJhbXMpOworIHNlYXJjaFBhcmFtc1N0YXRlLnVwZGF0ZVNlYXJjaFBhcmFtcyhzdGF0ZS5xdWVyeSk7Cisgc2VhcmNoUGFyYW1zU3RhdGUudXBkYXRlVVJMID0gZnVuY3Rpb24gKCkgeworICBzdGF0ZS5xdWVyeSA9IFN0cmluZyhzZWFyY2hQYXJhbXMpIHx8IG51bGw7CisgfTsKKyBpZiAoIURFU0NSSVBUT1JTKSB7CisgIHRoYXQuaHJlZiA9IHNlcmlhbGl6ZVVSTC5jYWxsKHRoYXQpOworICB0aGF0Lm9yaWdpbiA9IGdldE9yaWdpbi5jYWxsKHRoYXQpOworICB0aGF0LnByb3RvY29sID0gZ2V0UHJvdG9jb2wuY2FsbCh0aGF0KTsKKyAgdGhhdC51c2VybmFtZSA9IGdldFVzZXJuYW1lLmNhbGwodGhhdCk7CisgIHRoYXQucGFzc3dvcmQgPSBnZXRQYXNzd29yZC5jYWxsKHRoYXQpOworICB0aGF0Lmhvc3QgPSBnZXRIb3N0LmNhbGwodGhhdCk7CisgIHRoYXQuaG9zdG5hbWUgPSBnZXRIb3N0bmFtZS5jYWxsKHRoYXQpOworICB0aGF0LnBvcnQgPSBnZXRQb3J0LmNhbGwodGhhdCk7CisgIHRoYXQucGF0aG5hbWUgPSBnZXRQYXRobmFtZS5jYWxsKHRoYXQpOworICB0aGF0LnNlYXJjaCA9IGdldFNlYXJjaC5jYWxsKHRoYXQpOworICB0aGF0LnNlYXJjaFBhcmFtcyA9IGdldFNlYXJjaFBhcmFtcy5jYWxsKHRoYXQpOworICB0aGF0Lmhhc2ggPSBnZXRIYXNoLmNhbGwodGhhdCk7CisgfQorfTsKK3ZhciBVUkxQcm90b3R5cGUgPSBVUkxDb25zdHJ1Y3Rvci5wcm90b3R5cGU7Cit2YXIgc2VyaWFsaXplVVJMID0gZnVuY3Rpb24gKCkgeworIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOworIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lOworIHZhciB1c2VybmFtZSA9IHVybC51c2VybmFtZTsKKyB2YXIgcGFzc3dvcmQgPSB1cmwucGFzc3dvcmQ7CisgdmFyIGhvc3QgPSB1cmwuaG9zdDsKKyB2YXIgcG9ydCA9IHVybC5wb3J0OworIHZhciBwYXRoID0gdXJsLnBhdGg7CisgdmFyIHF1ZXJ5ID0gdXJsLnF1ZXJ5OworIHZhciBmcmFnbWVudCA9IHVybC5mcmFnbWVudDsKKyB2YXIgb3V0cHV0ID0gc2NoZW1lICsgJzonOworIGlmIChob3N0ICE9PSBudWxsKSB7CisgIG91dHB1dCArPSAnLy8nOworICBpZiAoaW5jbHVkZXNDcmVkZW50aWFscyh1cmwpKSB7CisgICBvdXRwdXQgKz0gdXNlcm5hbWUgKyAocGFzc3dvcmQgPyAnOicgKyBwYXNzd29yZCA6ICcnKSArICdAJzsKKyAgfQorICBvdXRwdXQgKz0gc2VyaWFsaXplSG9zdChob3N0KTsKKyAgaWYgKHBvcnQgIT09IG51bGwpCisgICBvdXRwdXQgKz0gJzonICsgcG9ydDsKKyB9IGVsc2UgaWYgKHNjaGVtZSA9PSAnZmlsZScpCisgIG91dHB1dCArPSAnLy8nOworIG91dHB1dCArPSB1cmwuY2Fubm90QmVBQmFzZVVSTCA/IHBhdGhbMF0gOiBwYXRoLmxlbmd0aCA/ICcvJyArIHBhdGguam9pbignLycpIDogJyc7CisgaWYgKHF1ZXJ5ICE9PSBudWxsKQorICBvdXRwdXQgKz0gJz8nICsgcXVlcnk7CisgaWYgKGZyYWdtZW50ICE9PSBudWxsKQorICBvdXRwdXQgKz0gJyMnICsgZnJhZ21lbnQ7CisgcmV0dXJuIG91dHB1dDsKK307Cit2YXIgZ2V0T3JpZ2luID0gZnVuY3Rpb24gKCkgeworIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOworIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lOworIHZhciBwb3J0ID0gdXJsLnBvcnQ7CisgaWYgKHNjaGVtZSA9PSAnYmxvYicpCisgIHRyeSB7CisgICByZXR1cm4gbmV3IFVSTChzY2hlbWUucGF0aFswXSkub3JpZ2luOworICB9IGNhdGNoIChlcnJvcikgeworICAgcmV0dXJuICdudWxsJzsKKyAgfQorIGlmIChzY2hlbWUgPT0gJ2ZpbGUnIHx8ICFpc1NwZWNpYWwodXJsKSkKKyAgcmV0dXJuICdudWxsJzsKKyByZXR1cm4gc2NoZW1lICsgJzovLycgKyBzZXJpYWxpemVIb3N0KHVybC5ob3N0KSArIChwb3J0ICE9PSBudWxsID8gJzonICsgcG9ydCA6ICcnKTsKK307Cit2YXIgZ2V0UHJvdG9jb2wgPSBmdW5jdGlvbiAoKSB7CisgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2NoZW1lICsgJzonOworfTsKK3ZhciBnZXRVc2VybmFtZSA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS51c2VybmFtZTsKK307Cit2YXIgZ2V0UGFzc3dvcmQgPSBmdW5jdGlvbiAoKSB7CisgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykucGFzc3dvcmQ7Cit9OwordmFyIGdldEhvc3QgPSBmdW5jdGlvbiAoKSB7CisgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgdmFyIGhvc3QgPSB1cmwuaG9zdDsKKyB2YXIgcG9ydCA9IHVybC5wb3J0OworIHJldHVybiBob3N0ID09PSBudWxsID8gJycgOiBwb3J0ID09PSBudWxsID8gc2VyaWFsaXplSG9zdChob3N0KSA6IHNlcmlhbGl6ZUhvc3QoaG9zdCkgKyAnOicgKyBwb3J0OworfTsKK3ZhciBnZXRIb3N0bmFtZSA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgaG9zdCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykuaG9zdDsKKyByZXR1cm4gaG9zdCA9PT0gbnVsbCA/ICcnIDogc2VyaWFsaXplSG9zdChob3N0KTsKK307Cit2YXIgZ2V0UG9ydCA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgcG9ydCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykucG9ydDsKKyByZXR1cm4gcG9ydCA9PT0gbnVsbCA/ICcnIDogU3RyaW5nKHBvcnQpOworfTsKK3ZhciBnZXRQYXRobmFtZSA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKKyB2YXIgcGF0aCA9IHVybC5wYXRoOworIHJldHVybiB1cmwuY2Fubm90QmVBQmFzZVVSTCA/IHBhdGhbMF0gOiBwYXRoLmxlbmd0aCA/ICcvJyArIHBhdGguam9pbignLycpIDogJyc7Cit9OwordmFyIGdldFNlYXJjaCA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgcXVlcnkgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnF1ZXJ5OworIHJldHVybiBxdWVyeSA/ICc/JyArIHF1ZXJ5IDogJyc7Cit9OwordmFyIGdldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5zZWFyY2hQYXJhbXM7Cit9OwordmFyIGdldEhhc2ggPSBmdW5jdGlvbiAoKSB7CisgdmFyIGZyYWdtZW50ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5mcmFnbWVudDsKKyByZXR1cm4gZnJhZ21lbnQgPyAnIycgKyBmcmFnbWVudCA6ICcnOworfTsKK3ZhciBhY2Nlc3NvckRlc2NyaXB0b3IgPSBmdW5jdGlvbiAoZ2V0dGVyLCBzZXR0ZXIpIHsKKyByZXR1cm4geworICBnZXQ6IGdldHRlciwKKyAgc2V0OiBzZXR0ZXIsCisgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgZW51bWVyYWJsZTogdHJ1ZQorIH07Cit9OworaWYgKERFU0NSSVBUT1JTKSB7CisgZGVmaW5lUHJvcGVydGllcyhVUkxQcm90b3R5cGUsIHsKKyAgaHJlZjogYWNjZXNzb3JEZXNjcmlwdG9yKHNlcmlhbGl6ZVVSTCwgZnVuY3Rpb24gKGhyZWYpIHsKKyAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOworICAgdmFyIHVybFN0cmluZyA9IFN0cmluZyhocmVmKTsKKyAgIHZhciBmYWlsdXJlID0gcGFyc2VVUkwodXJsLCB1cmxTdHJpbmcpOworICAgaWYgKGZhaWx1cmUpCisgICAgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpOworICAgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSh1cmwuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXModXJsLnF1ZXJ5KTsKKyAgfSksCisgIG9yaWdpbjogYWNjZXNzb3JEZXNjcmlwdG9yKGdldE9yaWdpbiksCisgIHByb3RvY29sOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UHJvdG9jb2wsIGZ1bmN0aW9uIChwcm90b2NvbCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhwcm90b2NvbCkgKyAnOicsIFNDSEVNRV9TVEFSVCk7CisgIH0pLAorICB1c2VybmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFVzZXJuYW1lLCBmdW5jdGlvbiAodXNlcm5hbWUpIHsKKyAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOworICAgdmFyIGNvZGVQb2ludHMgPSBhcnJheUZyb20oU3RyaW5nKHVzZXJuYW1lKSk7CisgICBpZiAoY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkpCisgICAgcmV0dXJuOworICAgdXJsLnVzZXJuYW1lID0gJyc7CisgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHsKKyAgICB1cmwudXNlcm5hbWUgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2ldLCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpOworICAgfQorICB9KSwKKyAgcGFzc3dvcmQ6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXNzd29yZCwgZnVuY3Rpb24gKHBhc3N3b3JkKSB7CisgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKKyAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKFN0cmluZyhwYXNzd29yZCkpOworICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKQorICAgIHJldHVybjsKKyAgIHVybC5wYXNzd29yZCA9ICcnOworICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgdXJsLnBhc3N3b3JkICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpXSwgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0KTsKKyAgIH0KKyAgfSksCisgIGhvc3Q6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRIb3N0LCBmdW5jdGlvbiAoaG9zdCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBpZiAodXJsLmNhbm5vdEJlQUJhc2VVUkwpCisgICAgcmV0dXJuOworICAgcGFyc2VVUkwodXJsLCBTdHJpbmcoaG9zdCksIEhPU1QpOworICB9KSwKKyAgaG9zdG5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRIb3N0bmFtZSwgZnVuY3Rpb24gKGhvc3RuYW1lKSB7CisgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKKyAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkKKyAgICByZXR1cm47CisgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhob3N0bmFtZSksIEhPU1ROQU1FKTsKKyAgfSksCisgIHBvcnQ6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQb3J0LCBmdW5jdGlvbiAocG9ydCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBpZiAoY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkpCisgICAgcmV0dXJuOworICAgcG9ydCA9IFN0cmluZyhwb3J0KTsKKyAgIGlmIChwb3J0ID09ICcnKQorICAgIHVybC5wb3J0ID0gbnVsbDsKKyAgIGVsc2UKKyAgICBwYXJzZVVSTCh1cmwsIHBvcnQsIFBPUlQpOworICB9KSwKKyAgcGF0aG5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXRobmFtZSwgZnVuY3Rpb24gKHBhdGhuYW1lKSB7CisgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKKyAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkKKyAgICByZXR1cm47CisgICB1cmwucGF0aCA9IFtdOworICAgcGFyc2VVUkwodXJsLCBwYXRobmFtZSArICcnLCBQQVRIX1NUQVJUKTsKKyAgfSksCisgIHNlYXJjaDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFNlYXJjaCwgZnVuY3Rpb24gKHNlYXJjaCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTsKKyAgIGlmIChzZWFyY2ggPT0gJycpIHsKKyAgICB1cmwucXVlcnkgPSBudWxsOworICAgfSBlbHNlIHsKKyAgICBpZiAoJz8nID09IHNlYXJjaC5jaGFyQXQoMCkpCisgICAgIHNlYXJjaCA9IHNlYXJjaC5zbGljZSgxKTsKKyAgICB1cmwucXVlcnkgPSAnJzsKKyAgICBwYXJzZVVSTCh1cmwsIHNlYXJjaCwgUVVFUlkpOworICAgfQorICAgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSh1cmwuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXModXJsLnF1ZXJ5KTsKKyAgfSksCisgIHNlYXJjaFBhcmFtczogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFNlYXJjaFBhcmFtcyksCisgIGhhc2g6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRIYXNoLCBmdW5jdGlvbiAoaGFzaCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBoYXNoID0gU3RyaW5nKGhhc2gpOworICAgaWYgKGhhc2ggPT0gJycpIHsKKyAgICB1cmwuZnJhZ21lbnQgPSBudWxsOworICAgIHJldHVybjsKKyAgIH0KKyAgIGlmICgnIycgPT0gaGFzaC5jaGFyQXQoMCkpCisgICAgaGFzaCA9IGhhc2guc2xpY2UoMSk7CisgICB1cmwuZnJhZ21lbnQgPSAnJzsKKyAgIHBhcnNlVVJMKHVybCwgaGFzaCwgRlJBR01FTlQpOworICB9KQorIH0pOworfQorcmVkZWZpbmUoVVJMUHJvdG90eXBlLCAndG9KU09OJywgZnVuY3Rpb24gdG9KU09OKCkgeworIHJldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKTsKK30sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTsKK3JlZGVmaW5lKFVSTFByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7CisgcmV0dXJuIHNlcmlhbGl6ZVVSTC5jYWxsKHRoaXMpOworfSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pOworaWYgKE5hdGl2ZVVSTCkgeworIHZhciBuYXRpdmVDcmVhdGVPYmplY3RVUkwgPSBOYXRpdmVVUkwuY3JlYXRlT2JqZWN0VVJMOworIHZhciBuYXRpdmVSZXZva2VPYmplY3RVUkwgPSBOYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMOworIGlmIChuYXRpdmVDcmVhdGVPYmplY3RVUkwpCisgIHJlZGVmaW5lKFVSTENvbnN0cnVjdG9yLCAnY3JlYXRlT2JqZWN0VVJMJywgZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGJsb2IpIHsKKyAgIHJldHVybiBuYXRpdmVDcmVhdGVPYmplY3RVUkwuYXBwbHkoTmF0aXZlVVJMLCBhcmd1bWVudHMpOworICB9KTsKKyBpZiAobmF0aXZlUmV2b2tlT2JqZWN0VVJMKQorICByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHsKKyAgIHJldHVybiBuYXRpdmVSZXZva2VPYmplY3RVUkwuYXBwbHkoTmF0aXZlVVJMLCBhcmd1bWVudHMpOworICB9KTsKK30KK3NldFRvU3RyaW5nVGFnKFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7CiskKHsKKyBnbG9iYWw6IHRydWUsCisgZm9yY2VkOiAhVVNFX05BVElWRV9VUkwsCisgc2hhbTogIURFU0NSSVBUT1JTCit9LCB7IFVSTDogVVJMQ29uc3RydWN0b3IgfSk7CisKKy8qKiovIH0pLAorLyogMTQwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKK21vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKKyB2YXIgdXJsID0gbmV3IFVSTCgnYj9hPTEmYj0yJmM9MycsICdodHRwOi8vYScpOworIHZhciBzZWFyY2hQYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zOworIHZhciByZXN1bHQgPSAnJzsKKyB1cmwucGF0aG5hbWUgPSAnYyUyMGQnOworIHNlYXJjaFBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7CisgIHNlYXJjaFBhcmFtc1snZGVsZXRlJ10oJ2InKTsKKyAgcmVzdWx0ICs9IGtleSArIHZhbHVlOworIH0pOworIHJldHVybiBJU19QVVJFICYmICF1cmwudG9KU09OIHx8ICFzZWFyY2hQYXJhbXMuc29ydCB8fCB1cmwuaHJlZiAhPT0gJ2h0dHA6Ly9hL2MlMjBkP2E9MSZjPTMnIHx8IHNlYXJjaFBhcmFtcy5nZXQoJ2MnKSAhPT0gJzMnIHx8IFN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKCc/YT0xJykpICE9PSAnYT0xJyB8fCAhc2VhcmNoUGFyYW1zW0lURVJBVE9SXSB8fCBuZXcgVVJMKCdodHRwczovL2FAYicpLnVzZXJuYW1lICE9PSAnYScgfHwgbmV3IFVSTFNlYXJjaFBhcmFtcyhuZXcgVVJMU2VhcmNoUGFyYW1zKCdhPWInKSkuZ2V0KCdhJykgIT09ICdiJyB8fCBuZXcgVVJMKCdodHRwOi8v0YLQtdGB0YInKS5ob3N0ICE9PSAneG4tLWUxYXliYycgfHwgbmV3IFVSTCgnaHR0cDovL2Ej0LEnKS5oYXNoICE9PSAnIyVEMCVCMScgfHwgcmVzdWx0ICE9PSAnYTFjMycgfHwgbmV3IFVSTCgnaHR0cDovL3gnLCB1bmRlZmluZWQpLmhvc3QgIT09ICd4JzsKK30pOworCisvKioqLyB9KSwKKy8qIDE0MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBtYXhJbnQgPSAyMTQ3NDgzNjQ3OwordmFyIGJhc2UgPSAzNjsKK3ZhciB0TWluID0gMTsKK3ZhciB0TWF4ID0gMjY7Cit2YXIgc2tldyA9IDM4OwordmFyIGRhbXAgPSA3MDA7Cit2YXIgaW5pdGlhbEJpYXMgPSA3MjsKK3ZhciBpbml0aWFsTiA9IDEyODsKK3ZhciBkZWxpbWl0ZXIgPSAnLSc7Cit2YXIgcmVnZXhOb25BU0NJSSA9IC9bXlwwLVx1MDA3RV0vOwordmFyIHJlZ2V4U2VwYXJhdG9ycyA9IC9bLlx1MzAwMlx1RkYwRVx1RkY2MV0vZzsKK3ZhciBPVkVSRkxPV19FUlJPUiA9ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzcyc7Cit2YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluOwordmFyIGZsb29yID0gTWF0aC5mbG9vcjsKK3ZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwordmFyIHVjczJkZWNvZGUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CisgdmFyIG91dHB1dCA9IFtdOworIHZhciBjb3VudGVyID0gMDsKKyB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKKyB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgeworICB2YXIgdmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspOworICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7CisgICB2YXIgZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspOworICAgaWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7CisgICAgb3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTsKKyAgIH0gZWxzZSB7CisgICAgb3V0cHV0LnB1c2godmFsdWUpOworICAgIGNvdW50ZXItLTsKKyAgIH0KKyAgfSBlbHNlIHsKKyAgIG91dHB1dC5wdXNoKHZhbHVlKTsKKyAgfQorIH0KKyByZXR1cm4gb3V0cHV0OworfTsKK3ZhciBkaWdpdFRvQmFzaWMgPSBmdW5jdGlvbiAoZGlnaXQpIHsKKyByZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpOworfTsKK3ZhciBhZGFwdCA9IGZ1bmN0aW9uIChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHsKKyB2YXIgayA9IDA7CisgZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTsKKyBkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7CisgZm9yICg7IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7CisgIGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTsKKyB9CisgcmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7Cit9OwordmFyIGVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCkgeworIHZhciBvdXRwdXQgPSBbXTsKKyBpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpOworIHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDsKKyB2YXIgbiA9IGluaXRpYWxOOworIHZhciBkZWx0YSA9IDA7CisgdmFyIGJpYXMgPSBpbml0aWFsQmlhczsKKyB2YXIgaSwgY3VycmVudFZhbHVlOworIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTsKKyAgaWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHsKKyAgIG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTsKKyAgfQorIH0KKyB2YXIgYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoOworIHZhciBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoOworIGlmIChiYXNpY0xlbmd0aCkgeworICBvdXRwdXQucHVzaChkZWxpbWl0ZXIpOworIH0KKyB3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkgeworICB2YXIgbSA9IG1heEludDsKKyAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CisgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTsKKyAgIGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7CisgICAgbSA9IGN1cnJlbnRWYWx1ZTsKKyAgIH0KKyAgfQorICB2YXIgaGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxOworICBpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkgeworICAgdGhyb3cgUmFuZ2VFcnJvcihPVkVSRkxPV19FUlJPUik7CisgIH0KKyAgZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTsKKyAgbiA9IG07CisgIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgY3VycmVudFZhbHVlID0gaW5wdXRbaV07CisgICBpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7CisgICAgdGhyb3cgUmFuZ2VFcnJvcihPVkVSRkxPV19FUlJPUik7CisgICB9CisgICBpZiAoY3VycmVudFZhbHVlID09IG4pIHsKKyAgICB2YXIgcSA9IGRlbHRhOworICAgIGZvciAodmFyIGsgPSBiYXNlOzsgayArPSBiYXNlKSB7CisgICAgIHZhciB0ID0gayA8PSBiaWFzID8gdE1pbiA6IGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXM7CisgICAgIGlmIChxIDwgdCkKKyAgICAgIGJyZWFrOworICAgICB2YXIgcU1pbnVzVCA9IHEgLSB0OworICAgICB2YXIgYmFzZU1pbnVzVCA9IGJhc2UgLSB0OworICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCkpKTsKKyAgICAgcSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTsKKyAgICB9CisgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxKSkpOworICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7CisgICAgZGVsdGEgPSAwOworICAgICsraGFuZGxlZENQQ291bnQ7CisgICB9CisgIH0KKyAgKytkZWx0YTsKKyAgKytuOworIH0KKyByZXR1cm4gb3V0cHV0LmpvaW4oJycpOworfTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7CisgdmFyIGVuY29kZWQgPSBbXTsKKyB2YXIgbGFiZWxzID0gaW5wdXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1x1MDAyRScpLnNwbGl0KCcuJyk7CisgdmFyIGksIGxhYmVsOworIGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHsKKyAgbGFiZWwgPSBsYWJlbHNbaV07CisgIGVuY29kZWQucHVzaChyZWdleE5vbkFTQ0lJLnRlc3QobGFiZWwpID8gJ3huLS0nICsgZW5jb2RlKGxhYmVsKSA6IGxhYmVsKTsKKyB9CisgcmV0dXJuIGVuY29kZWQuam9pbignLicpOworfTsKKworLyoqKi8gfSksCisvKiAxNDIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCitfX3dfcGRmanNfcmVxdWlyZV9fKDEwMik7Cit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKTsKK3ZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQwKTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHJlZGVmaW5lQWxsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjQpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7Cit2YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwordmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMzKTsKK3ZhciBhbkluc3RhbmNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjYpOwordmFyIGhhc093biA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIGJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYyKTsKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXyg5NSk7Cit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGNyZWF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNzEpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOwordmFyIGdldEl0ZXJhdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDMpOwordmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193X3BkZmpzX3JlcXVpcmVfXyg5NCk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTsKK3ZhciBIZWFkZXJzID0gZ2V0QnVpbHRJbignSGVhZGVycycpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIFVSTF9TRUFSQ0hfUEFSQU1TID0gJ1VSTFNlYXJjaFBhcmFtcyc7Cit2YXIgVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IgPSBVUkxfU0VBUkNIX1BBUkFNUyArICdJdGVyYXRvcic7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsUGFyYW1zU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihVUkxfU0VBUkNIX1BBUkFNUyk7Cit2YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IpOwordmFyIHBsdXMgPSAvXCsvZzsKK3ZhciBzZXF1ZW5jZXMgPSBBcnJheSg0KTsKK3ZhciBwZXJjZW50U2VxdWVuY2UgPSBmdW5jdGlvbiAoYnl0ZXMpIHsKKyByZXR1cm4gc2VxdWVuY2VzW2J5dGVzIC0gMV0gfHwgKHNlcXVlbmNlc1tieXRlcyAtIDFdID0gUmVnRXhwKCcoKD86JVtcXGRhLWZdezJ9KXsnICsgYnl0ZXMgKyAnfSknLCAnZ2knKSk7Cit9OwordmFyIHBlcmNlbnREZWNvZGUgPSBmdW5jdGlvbiAoc2VxdWVuY2UpIHsKKyB0cnkgeworICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHNlcXVlbmNlKTsKKyB9IGNhdGNoIChlcnJvcikgeworICByZXR1cm4gc2VxdWVuY2U7CisgfQorfTsKK3ZhciBkZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChpdCkgeworIHZhciByZXN1bHQgPSBpdC5yZXBsYWNlKHBsdXMsICcgJyk7CisgdmFyIGJ5dGVzID0gNDsKKyB0cnkgeworICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdCk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgd2hpbGUgKGJ5dGVzKSB7CisgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpOworICB9CisgIHJldHVybiByZXN1bHQ7CisgfQorfTsKK3ZhciBmaW5kID0gL1shJygpfl18JTIwL2c7Cit2YXIgcmVwbGFjZSA9IHsKKyAnISc6ICclMjEnLAorICInIjogJyUyNycsCisgJygnOiAnJTI4JywKKyAnKSc6ICclMjknLAorICd+JzogJyU3RScsCisgJyUyMCc6ICcrJworfTsKK3ZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkgeworIHJldHVybiByZXBsYWNlW21hdGNoXTsKK307Cit2YXIgc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChpdCkucmVwbGFjZShmaW5kLCByZXBsYWNlcik7Cit9OwordmFyIHBhcnNlU2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHJlc3VsdCwgcXVlcnkpIHsKKyBpZiAocXVlcnkpIHsKKyAgdmFyIGF0dHJpYnV0ZXMgPSBxdWVyeS5zcGxpdCgnJicpOworICB2YXIgaW5kZXggPSAwOworICB2YXIgYXR0cmlidXRlLCBlbnRyeTsKKyAgd2hpbGUgKGluZGV4IDwgYXR0cmlidXRlcy5sZW5ndGgpIHsKKyAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaW5kZXgrK107CisgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkgeworICAgIGVudHJ5ID0gYXR0cmlidXRlLnNwbGl0KCc9Jyk7CisgICAgcmVzdWx0LnB1c2goeworICAgICBrZXk6IGRlc2VyaWFsaXplKGVudHJ5LnNoaWZ0KCkpLAorICAgICB2YWx1ZTogZGVzZXJpYWxpemUoZW50cnkuam9pbignPScpKQorICAgIH0pOworICAgfQorICB9CisgfQorfTsKK3ZhciB1cGRhdGVTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAocXVlcnkpIHsKKyB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDsKKyBwYXJzZVNlYXJjaFBhcmFtcyh0aGlzLmVudHJpZXMsIHF1ZXJ5KTsKK307Cit2YXIgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGggPSBmdW5jdGlvbiAocGFzc2VkLCByZXF1aXJlZCkgeworIGlmIChwYXNzZWQgPCByZXF1aXJlZCkKKyAgdGhyb3cgVHlwZUVycm9yKCdOb3QgZW5vdWdoIGFyZ3VtZW50cycpOworfTsKK3ZhciBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciA9IGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoZnVuY3Rpb24gSXRlcmF0b3IocGFyYW1zLCBraW5kKSB7Cisgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CisgIHR5cGU6IFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SLAorICBpdGVyYXRvcjogZ2V0SXRlcmF0b3IoZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZShwYXJhbXMpLmVudHJpZXMpLAorICBraW5kOiBraW5kCisgfSk7Cit9LCAnSXRlcmF0b3InLCBmdW5jdGlvbiBuZXh0KCkgeworIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTsKKyB2YXIga2luZCA9IHN0YXRlLmtpbmQ7CisgdmFyIHN0ZXAgPSBzdGF0ZS5pdGVyYXRvci5uZXh0KCk7CisgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTsKKyBpZiAoIXN0ZXAuZG9uZSkgeworICBzdGVwLnZhbHVlID0ga2luZCA9PT0gJ2tleXMnID8gZW50cnkua2V5IDoga2luZCA9PT0gJ3ZhbHVlcycgPyBlbnRyeS52YWx1ZSA6IFsKKyAgIGVudHJ5LmtleSwKKyAgIGVudHJ5LnZhbHVlCisgIF07CisgfQorIHJldHVybiBzdGVwOworfSk7Cit2YXIgVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBVUkxTZWFyY2hQYXJhbXMoKSB7CisgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciwgVVJMX1NFQVJDSF9QQVJBTVMpOworIHZhciBpbml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQ7CisgdmFyIHRoYXQgPSB0aGlzOworIHZhciBlbnRyaWVzID0gW107CisgdmFyIGl0ZXJhdG9yTWV0aG9kLCBpdGVyYXRvciwgbmV4dCwgc3RlcCwgZW50cnlJdGVyYXRvciwgZW50cnlOZXh0LCBmaXJzdCwgc2Vjb25kLCBrZXk7Cisgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CisgIHR5cGU6IFVSTF9TRUFSQ0hfUEFSQU1TLAorICBlbnRyaWVzOiBlbnRyaWVzLAorICB1cGRhdGVVUkw6IGZ1bmN0aW9uICgpIHsKKyAgfSwKKyAgdXBkYXRlU2VhcmNoUGFyYW1zOiB1cGRhdGVTZWFyY2hQYXJhbXMKKyB9KTsKKyBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7CisgIGlmIChpc09iamVjdChpbml0KSkgeworICAgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChpbml0KTsKKyAgIGlmICh0eXBlb2YgaXRlcmF0b3JNZXRob2QgPT09ICdmdW5jdGlvbicpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoaW5pdCk7CisgICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7CisgICAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHsKKyAgICAgZW50cnlJdGVyYXRvciA9IGdldEl0ZXJhdG9yKGFuT2JqZWN0KHN0ZXAudmFsdWUpKTsKKyAgICAgZW50cnlOZXh0ID0gZW50cnlJdGVyYXRvci5uZXh0OworICAgICBpZiAoKGZpcnN0ID0gZW50cnlOZXh0LmNhbGwoZW50cnlJdGVyYXRvcikpLmRvbmUgfHwgKHNlY29uZCA9IGVudHJ5TmV4dC5jYWxsKGVudHJ5SXRlcmF0b3IpKS5kb25lIHx8ICFlbnRyeU5leHQuY2FsbChlbnRyeUl0ZXJhdG9yKS5kb25lKQorICAgICAgdGhyb3cgVHlwZUVycm9yKCdFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyJyk7CisgICAgIGVudHJpZXMucHVzaCh7CisgICAgICBrZXk6IGZpcnN0LnZhbHVlICsgJycsCisgICAgICB2YWx1ZTogc2Vjb25kLnZhbHVlICsgJycKKyAgICAgfSk7CisgICAgfQorICAgfSBlbHNlCisgICAgZm9yIChrZXkgaW4gaW5pdCkKKyAgICAgaWYgKGhhc093bihpbml0LCBrZXkpKQorICAgICAgZW50cmllcy5wdXNoKHsKKyAgICAgICBrZXk6IGtleSwKKyAgICAgICB2YWx1ZTogaW5pdFtrZXldICsgJycKKyAgICAgIH0pOworICB9IGVsc2UgeworICAgcGFyc2VTZWFyY2hQYXJhbXMoZW50cmllcywgdHlwZW9mIGluaXQgPT09ICdzdHJpbmcnID8gaW5pdC5jaGFyQXQoMCkgPT09ICc/JyA/IGluaXQuc2xpY2UoMSkgOiBpbml0IDogaW5pdCArICcnKTsKKyAgfQorIH0KK307Cit2YXIgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlID0gVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IucHJvdG90eXBlOworcmVkZWZpbmVBbGwoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7CisgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHsKKyAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMik7CisgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7CisgIHN0YXRlLmVudHJpZXMucHVzaCh7CisgICBrZXk6IG5hbWUgKyAnJywKKyAgIHZhbHVlOiB2YWx1ZSArICcnCisgIH0pOworICBzdGF0ZS51cGRhdGVVUkwoKTsKKyB9LAorICdkZWxldGUnOiBmdW5jdGlvbiAobmFtZSkgeworICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKKyAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTsKKyAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzOworICB2YXIga2V5ID0gbmFtZSArICcnOworICB2YXIgaW5kZXggPSAwOworICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgeworICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KQorICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTsKKyAgIGVsc2UKKyAgICBpbmRleCsrOworICB9CisgIHN0YXRlLnVwZGF0ZVVSTCgpOworIH0sCisgZ2V0OiBmdW5jdGlvbiBnZXQobmFtZSkgeworICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKKyAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7CisgIHZhciBrZXkgPSBuYW1lICsgJyc7CisgIHZhciBpbmRleCA9IDA7CisgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7CisgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpCisgICAgcmV0dXJuIGVudHJpZXNbaW5kZXhdLnZhbHVlOworICB9CisgIHJldHVybiBudWxsOworIH0sCisgZ2V0QWxsOiBmdW5jdGlvbiBnZXRBbGwobmFtZSkgeworICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKKyAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7CisgIHZhciBrZXkgPSBuYW1lICsgJyc7CisgIHZhciByZXN1bHQgPSBbXTsKKyAgdmFyIGluZGV4ID0gMDsKKyAgZm9yICg7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKKyAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkKKyAgICByZXN1bHQucHVzaChlbnRyaWVzW2luZGV4XS52YWx1ZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKKyB9LAorIGhhczogZnVuY3Rpb24gaGFzKG5hbWUpIHsKKyAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7CisgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOworICB2YXIga2V5ID0gbmFtZSArICcnOworICB2YXIgaW5kZXggPSAwOworICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgeworICAgaWYgKGVudHJpZXNbaW5kZXgrK10ua2V5ID09PSBrZXkpCisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworIH0sCisgc2V0OiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHsKKyAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7CisgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7CisgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllczsKKyAgdmFyIGZvdW5kID0gZmFsc2U7CisgIHZhciBrZXkgPSBuYW1lICsgJyc7CisgIHZhciB2YWwgPSB2YWx1ZSArICcnOworICB2YXIgaW5kZXggPSAwOworICB2YXIgZW50cnk7CisgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7CisgICBlbnRyeSA9IGVudHJpZXNbaW5kZXhdOworICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7CisgICAgaWYgKGZvdW5kKQorICAgICBlbnRyaWVzLnNwbGljZShpbmRleC0tLCAxKTsKKyAgICBlbHNlIHsKKyAgICAgZm91bmQgPSB0cnVlOworICAgICBlbnRyeS52YWx1ZSA9IHZhbDsKKyAgICB9CisgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkKKyAgIGVudHJpZXMucHVzaCh7CisgICAga2V5OiBrZXksCisgICAgdmFsdWU6IHZhbAorICAgfSk7CisgIHN0YXRlLnVwZGF0ZVVSTCgpOworIH0sCisgc29ydDogZnVuY3Rpb24gc29ydCgpIHsKKyAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTsKKyAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzOworICB2YXIgc2xpY2UgPSBlbnRyaWVzLnNsaWNlKCk7CisgIHZhciBlbnRyeSwgZW50cmllc0luZGV4LCBzbGljZUluZGV4OworICBlbnRyaWVzLmxlbmd0aCA9IDA7CisgIGZvciAoc2xpY2VJbmRleCA9IDA7IHNsaWNlSW5kZXggPCBzbGljZS5sZW5ndGg7IHNsaWNlSW5kZXgrKykgeworICAgZW50cnkgPSBzbGljZVtzbGljZUluZGV4XTsKKyAgIGZvciAoZW50cmllc0luZGV4ID0gMDsgZW50cmllc0luZGV4IDwgc2xpY2VJbmRleDsgZW50cmllc0luZGV4KyspIHsKKyAgICBpZiAoZW50cmllc1tlbnRyaWVzSW5kZXhdLmtleSA+IGVudHJ5LmtleSkgeworICAgICBlbnRyaWVzLnNwbGljZShlbnRyaWVzSW5kZXgsIDAsIGVudHJ5KTsKKyAgICAgYnJlYWs7CisgICAgfQorICAgfQorICAgaWYgKGVudHJpZXNJbmRleCA9PT0gc2xpY2VJbmRleCkKKyAgICBlbnRyaWVzLnB1c2goZW50cnkpOworICB9CisgIHN0YXRlLnVwZGF0ZVVSTCgpOworIH0sCisgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaykgeworICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllczsKKyAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CisgIHZhciBpbmRleCA9IDA7CisgIHZhciBlbnRyeTsKKyAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHsKKyAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTsKKyAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7CisgIH0KKyB9LAorIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7CisgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IodGhpcywgJ2tleXMnKTsKKyB9LAorIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkgeworICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICd2YWx1ZXMnKTsKKyB9LAorIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7CisgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IodGhpcywgJ2VudHJpZXMnKTsKKyB9Cit9LCB7IGVudW1lcmFibGU6IHRydWUgfSk7CityZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsIElURVJBVE9SLCBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZW50cmllcyk7CityZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOworIHZhciByZXN1bHQgPSBbXTsKKyB2YXIgaW5kZXggPSAwOworIHZhciBlbnRyeTsKKyB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgeworICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107CisgIHJlc3VsdC5wdXNoKHNlcmlhbGl6ZShlbnRyeS5rZXkpICsgJz0nICsgc2VyaWFsaXplKGVudHJ5LnZhbHVlKSk7CisgfQorIHJldHVybiByZXN1bHQuam9pbignJicpOworfSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pOworc2V0VG9TdHJpbmdUYWcoVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTsKKyQoeworIGdsb2JhbDogdHJ1ZSwKKyBmb3JjZWQ6ICFVU0VfTkFUSVZFX1VSTAorfSwgeyBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yIH0pOworaWYgKCFVU0VfTkFUSVZFX1VSTCAmJiB0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIEhlYWRlcnMgPT0gJ2Z1bmN0aW9uJykgeworICQoeworICBnbG9iYWw6IHRydWUsCisgIGVudW1lcmFibGU6IHRydWUsCisgIGZvcmNlZDogdHJ1ZQorIH0sIHsKKyAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0KSB7CisgICB2YXIgYXJncyA9IFtpbnB1dF07CisgICB2YXIgaW5pdCwgYm9keSwgaGVhZGVyczsKKyAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworICAgIGluaXQgPSBhcmd1bWVudHNbMV07CisgICAgaWYgKGlzT2JqZWN0KGluaXQpKSB7CisgICAgIGJvZHkgPSBpbml0LmJvZHk7CisgICAgIGlmIChjbGFzc29mKGJvZHkpID09PSBVUkxfU0VBUkNIX1BBUkFNUykgeworICAgICAgaGVhZGVycyA9IGluaXQuaGVhZGVycyA/IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycykgOiBuZXcgSGVhZGVycygpOworICAgICAgaWYgKCFoZWFkZXJzLmhhcygnY29udGVudC10eXBlJykpIHsKKyAgICAgICBoZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jyk7CisgICAgICB9CisgICAgICBpbml0ID0gY3JlYXRlKGluaXQsIHsKKyAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgU3RyaW5nKGJvZHkpKSwKKyAgICAgICBoZWFkZXJzOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgaGVhZGVycykKKyAgICAgIH0pOworICAgICB9CisgICAgfQorICAgIGFyZ3MucHVzaChpbml0KTsKKyAgIH0KKyAgIHJldHVybiAkZmV0Y2guYXBwbHkodGhpcywgYXJncyk7CisgIH0KKyB9KTsKK30KK21vZHVsZS5leHBvcnRzID0geworIFVSTFNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsCisgZ2V0U3RhdGU6IGdldEludGVybmFsUGFyYW1zU3RhdGUKK307CisKKy8qKiovIH0pLAorLyogMTQzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjgpOwordmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193X3BkZmpzX3JlcXVpcmVfXyg5NCk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0KTsKKyBpZiAodHlwZW9mIGl0ZXJhdG9yTWV0aG9kICE9ICdmdW5jdGlvbicpIHsKKyAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpOworIH0KKyByZXR1cm4gYW5PYmplY3QoaXRlcmF0b3JNZXRob2QuY2FsbChpdCkpOworfTsKKworLyoqKi8gfSksCisvKiAxNDQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOworJCh7CisgdGFyZ2V0OiAnVVJMJywKKyBwcm90bzogdHJ1ZSwKKyBlbnVtZXJhYmxlOiB0cnVlCit9LCB7CisgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7CisgIHJldHVybiBVUkwucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTQ1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CisgIHRydWUgPyBmYWN0b3J5KGV4cG9ydHMpIDogdW5kZWZpbmVkOworfSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICd1c2Ugc3RyaWN0JzsKKyB2YXIgU3ltYm9sUG9seWZpbGwgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnID8gU3ltYm9sIDogZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7CisgIHJldHVybiAiU3ltYm9sKCIgKyBkZXNjcmlwdGlvbiArICIpIjsKKyB9OworIGZ1bmN0aW9uIG5vb3AoKSB7CisgfQorIHZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoeCkgeworICByZXR1cm4geCAhPT0geDsKKyB9OworIHZhciByZXRocm93QXNzZXJ0aW9uRXJyb3JSZWplY3Rpb24gPSBub29wOworIGZ1bmN0aW9uIHR5cGVJc09iamVjdCh4KSB7CisgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJzsKKyB9CisgZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTGlzdChlbGVtZW50cykgeworICByZXR1cm4gZWxlbWVudHMuc2xpY2UoKTsKKyB9CisgZnVuY3Rpb24gQXJyYXlCdWZmZXJDb3B5KGRlc3QsIGRlc3RPZmZzZXQsIHNyYywgc3JjT2Zmc2V0LCBuKSB7CisgIG5ldyBVaW50OEFycmF5KGRlc3QpLnNldChuZXcgVWludDhBcnJheShzcmMsIHNyY09mZnNldCwgbiksIGRlc3RPZmZzZXQpOworIH0KKyBmdW5jdGlvbiBJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHYpIHsKKyAgaWYgKElzTm9uTmVnYXRpdmVOdW1iZXIodikgPT09IGZhbHNlKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHYgPT09IEluZmluaXR5KSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIElzTm9uTmVnYXRpdmVOdW1iZXIodikgeworICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKE51bWJlcklzTmFOKHYpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHYgPCAwKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIENhbGwoRiwgViwgYXJncykgeworICBpZiAodHlwZW9mIEYgIT09ICdmdW5jdGlvbicpIHsKKyAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhIGZ1bmN0aW9uJyk7CisgIH0KKyAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKEYsIFYsIGFyZ3MpOworIH0KKyBmdW5jdGlvbiBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nT2JqZWN0LCBtZXRob2ROYW1lLCBhbGdvQXJnQ291bnQsIGV4dHJhQXJncykgeworICB2YXIgbWV0aG9kID0gdW5kZXJseWluZ09iamVjdFttZXRob2ROYW1lXTsKKyAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7CisgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IobWV0aG9kICsgIiBpcyBub3QgYSBtZXRob2QiKTsKKyAgIH0KKyAgIHN3aXRjaCAoYWxnb0FyZ0NvdW50KSB7CisgICBjYXNlIDA6IHsKKyAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBQcm9taXNlQ2FsbChtZXRob2QsIHVuZGVybHlpbmdPYmplY3QsIGV4dHJhQXJncyk7CisgICAgIH07CisgICAgfQorICAgY2FzZSAxOiB7CisgICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7CisgICAgICB2YXIgZnVsbEFyZ3MgPSBbYXJnXS5jb25jYXQoZXh0cmFBcmdzKTsKKyAgICAgIHJldHVybiBQcm9taXNlQ2FsbChtZXRob2QsIHVuZGVybHlpbmdPYmplY3QsIGZ1bGxBcmdzKTsKKyAgICAgfTsKKyAgICB9CisgICB9CisgIH0KKyAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgIH07CisgfQorIGZ1bmN0aW9uIEludm9rZU9yTm9vcChPLCBQLCBhcmdzKSB7CisgIHZhciBtZXRob2QgPSBPW1BdOworICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHsKKyAgIHJldHVybiB1bmRlZmluZWQ7CisgIH0KKyAgcmV0dXJuIENhbGwobWV0aG9kLCBPLCBhcmdzKTsKKyB9CisgZnVuY3Rpb24gUHJvbWlzZUNhbGwoRiwgViwgYXJncykgeworICB0cnkgeworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoQ2FsbChGLCBWLCBhcmdzKSk7CisgIH0gY2F0Y2ggKHZhbHVlKSB7CisgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2YWx1ZSk7CisgIH0KKyB9CisgZnVuY3Rpb24gVHJhbnNmZXJBcnJheUJ1ZmZlcihPKSB7CisgIHJldHVybiBPOworIH0KKyBmdW5jdGlvbiBJc0RldGFjaGVkQnVmZmVyKE8pIHsKKyAgcmV0dXJuIGZhbHNlOworIH0KKyBmdW5jdGlvbiBWYWxpZGF0ZUFuZE5vcm1hbGl6ZUhpZ2hXYXRlck1hcmsoaGlnaFdhdGVyTWFyaykgeworICBoaWdoV2F0ZXJNYXJrID0gTnVtYmVyKGhpZ2hXYXRlck1hcmspOworICBpZiAoTnVtYmVySXNOYU4oaGlnaFdhdGVyTWFyaykgfHwgaGlnaFdhdGVyTWFyayA8IDApIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdoaWdoV2F0ZXJNYXJrIHByb3BlcnR5IG9mIGEgcXVldWluZyBzdHJhdGVneSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm9uLU5hTicpOworICB9CisgIHJldHVybiBoaWdoV2F0ZXJNYXJrOworIH0KKyBmdW5jdGlvbiBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oc2l6ZSkgeworICBpZiAoc2l6ZSA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiAxOworICAgfTsKKyAgfQorICBpZiAodHlwZW9mIHNpemUgIT09ICdmdW5jdGlvbicpIHsKKyAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgcHJvcGVydHkgb2YgYSBxdWV1aW5nIHN0cmF0ZWd5IG11c3QgYmUgYSBmdW5jdGlvbicpOworICB9CisgIHJldHVybiBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIHJldHVybiBzaXplKGNodW5rKTsKKyAgfTsKKyB9CisgdmFyIG9yaWdpbmFsUHJvbWlzZSA9IFByb21pc2U7CisgdmFyIG9yaWdpbmFsUHJvbWlzZVRoZW4gPSBQcm9taXNlLnByb3RvdHlwZS50aGVuOworIHZhciBvcmlnaW5hbFByb21pc2VSZXNvbHZlID0gUHJvbWlzZS5yZXNvbHZlLmJpbmQob3JpZ2luYWxQcm9taXNlKTsKKyB2YXIgb3JpZ2luYWxQcm9taXNlUmVqZWN0ID0gUHJvbWlzZS5yZWplY3QuYmluZChvcmlnaW5hbFByb21pc2UpOworIGZ1bmN0aW9uIG5ld1Byb21pc2UoZXhlY3V0b3IpIHsKKyAgcmV0dXJuIG5ldyBvcmlnaW5hbFByb21pc2UoZXhlY3V0b3IpOworIH0KKyBmdW5jdGlvbiBwcm9taXNlUmVzb2x2ZWRXaXRoKHZhbHVlKSB7CisgIHJldHVybiBvcmlnaW5hbFByb21pc2VSZXNvbHZlKHZhbHVlKTsKKyB9CisgZnVuY3Rpb24gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFzb24pIHsKKyAgcmV0dXJuIG9yaWdpbmFsUHJvbWlzZVJlamVjdChyZWFzb24pOworIH0KKyBmdW5jdGlvbiBQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHsKKyAgcmV0dXJuIG9yaWdpbmFsUHJvbWlzZVRoZW4uY2FsbChwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7CisgfQorIGZ1bmN0aW9uIHVwb25Qcm9taXNlKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7CisgIFBlcmZvcm1Qcm9taXNlVGhlbihQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpLCB1bmRlZmluZWQsIHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbik7CisgfQorIGZ1bmN0aW9uIHVwb25GdWxmaWxsbWVudChwcm9taXNlLCBvbkZ1bGZpbGxlZCkgeworICB1cG9uUHJvbWlzZShwcm9taXNlLCBvbkZ1bGZpbGxlZCk7CisgfQorIGZ1bmN0aW9uIHVwb25SZWplY3Rpb24ocHJvbWlzZSwgb25SZWplY3RlZCkgeworICB1cG9uUHJvbWlzZShwcm9taXNlLCB1bmRlZmluZWQsIG9uUmVqZWN0ZWQpOworIH0KKyBmdW5jdGlvbiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChwcm9taXNlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHsKKyAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpOworIH0KKyBmdW5jdGlvbiBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHByb21pc2UpIHsKKyAgUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIHVuZGVmaW5lZCwgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKTsKKyB9CisgdmFyIFFVRVVFX01BWF9BUlJBWV9TSVpFID0gMTYzODQ7CisgdmFyIFNpbXBsZVF1ZXVlID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBTaW1wbGVRdWV1ZSgpIHsKKyAgIHRoaXMuX2N1cnNvciA9IDA7CisgICB0aGlzLl9zaXplID0gMDsKKyAgIHRoaXMuX2Zyb250ID0geworICAgIF9lbGVtZW50czogW10sCisgICAgX25leHQ6IHVuZGVmaW5lZAorICAgfTsKKyAgIHRoaXMuX2JhY2sgPSB0aGlzLl9mcm9udDsKKyAgIHRoaXMuX2N1cnNvciA9IDA7CisgICB0aGlzLl9zaXplID0gMDsKKyAgfQorICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2ltcGxlUXVldWUucHJvdG90eXBlLCAibGVuZ3RoIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXMuX3NpemU7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgU2ltcGxlUXVldWUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZWxlbWVudCkgeworICAgdmFyIG9sZEJhY2sgPSB0aGlzLl9iYWNrOworICAgdmFyIG5ld0JhY2sgPSBvbGRCYWNrOworICAgaWYgKG9sZEJhY2suX2VsZW1lbnRzLmxlbmd0aCA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUgLSAxKSB7CisgICAgbmV3QmFjayA9IHsKKyAgICAgX2VsZW1lbnRzOiBbXSwKKyAgICAgX25leHQ6IHVuZGVmaW5lZAorICAgIH07CisgICB9CisgICBvbGRCYWNrLl9lbGVtZW50cy5wdXNoKGVsZW1lbnQpOworICAgaWYgKG5ld0JhY2sgIT09IG9sZEJhY2spIHsKKyAgICB0aGlzLl9iYWNrID0gbmV3QmFjazsKKyAgICBvbGRCYWNrLl9uZXh0ID0gbmV3QmFjazsKKyAgIH0KKyAgICsrdGhpcy5fc2l6ZTsKKyAgfTsKKyAgU2ltcGxlUXVldWUucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gKCkgeworICAgdmFyIG9sZEZyb250ID0gdGhpcy5fZnJvbnQ7CisgICB2YXIgbmV3RnJvbnQgPSBvbGRGcm9udDsKKyAgIHZhciBvbGRDdXJzb3IgPSB0aGlzLl9jdXJzb3I7CisgICB2YXIgbmV3Q3Vyc29yID0gb2xkQ3Vyc29yICsgMTsKKyAgIHZhciBlbGVtZW50cyA9IG9sZEZyb250Ll9lbGVtZW50czsKKyAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbb2xkQ3Vyc29yXTsKKyAgIGlmIChuZXdDdXJzb3IgPT09IFFVRVVFX01BWF9BUlJBWV9TSVpFKSB7CisgICAgbmV3RnJvbnQgPSBvbGRGcm9udC5fbmV4dDsKKyAgICBuZXdDdXJzb3IgPSAwOworICAgfQorICAgLS10aGlzLl9zaXplOworICAgdGhpcy5fY3Vyc29yID0gbmV3Q3Vyc29yOworICAgaWYgKG9sZEZyb250ICE9PSBuZXdGcm9udCkgeworICAgIHRoaXMuX2Zyb250ID0gbmV3RnJvbnQ7CisgICB9CisgICBlbGVtZW50c1tvbGRDdXJzb3JdID0gdW5kZWZpbmVkOworICAgcmV0dXJuIGVsZW1lbnQ7CisgIH07CisgIFNpbXBsZVF1ZXVlLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICB2YXIgaSA9IHRoaXMuX2N1cnNvcjsKKyAgIHZhciBub2RlID0gdGhpcy5fZnJvbnQ7CisgICB2YXIgZWxlbWVudHMgPSBub2RlLl9lbGVtZW50czsKKyAgIHdoaWxlIChpICE9PSBlbGVtZW50cy5sZW5ndGggfHwgbm9kZS5fbmV4dCAhPT0gdW5kZWZpbmVkKSB7CisgICAgaWYgKGkgPT09IGVsZW1lbnRzLmxlbmd0aCkgeworICAgICBub2RlID0gbm9kZS5fbmV4dDsKKyAgICAgZWxlbWVudHMgPSBub2RlLl9lbGVtZW50czsKKyAgICAgaSA9IDA7CisgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHsKKyAgICAgIGJyZWFrOworICAgICB9CisgICAgfQorICAgIGNhbGxiYWNrKGVsZW1lbnRzW2ldKTsKKyAgICArK2k7CisgICB9CisgIH07CisgIFNpbXBsZVF1ZXVlLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkgeworICAgdmFyIGZyb250ID0gdGhpcy5fZnJvbnQ7CisgICB2YXIgY3Vyc29yID0gdGhpcy5fY3Vyc29yOworICAgcmV0dXJuIGZyb250Ll9lbGVtZW50c1tjdXJzb3JdOworICB9OworICByZXR1cm4gU2ltcGxlUXVldWU7CisgfSgpOworIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh2YWx1ZSwgZG9uZSwgZm9yQXV0aG9yQ29kZSkgeworICB2YXIgcHJvdG90eXBlID0gbnVsbDsKKyAgaWYgKGZvckF1dGhvckNvZGUgPT09IHRydWUpIHsKKyAgIHByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7CisgIH0KKyAgdmFyIG9iaiA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTsKKyAgb2JqLnZhbHVlID0gdmFsdWU7CisgIG9iai5kb25lID0gZG9uZTsKKyAgcmV0dXJuIG9iajsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZShyZWFkZXIsIHN0cmVhbSkgeworICByZWFkZXIuX2ZvckF1dGhvckNvZGUgPSB0cnVlOworICByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPSBzdHJlYW07CisgIHN0cmVhbS5fcmVhZGVyID0gcmVhZGVyOworICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykgeworICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHJlYWRlcik7CisgIH0gZWxzZSBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQocmVhZGVyKTsKKyAgfSBlbHNlIHsKKyAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQocmVhZGVyLCBzdHJlYW0uX3N0b3JlZEVycm9yKTsKKyAgfQorIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwocmVhZGVyLCByZWFzb24pIHsKKyAgdmFyIHN0cmVhbSA9IHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbTsKKyAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgcmVhc29uKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpIHsKKyAgaWYgKHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbS5fc3RhdGUgPT09ICdyZWFkYWJsZScpIHsKKyAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgbmV3IFR5cGVFcnJvcignUmVhZGVyIHdhcyByZWxlYXNlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIHN0cmVhbVwncyBjbG9zZWRuZXNzJykpOworICB9IGVsc2UgeworICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCBuZXcgVHlwZUVycm9yKCdSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtXCdzIGNsb3NlZG5lc3MnKSk7CisgIH0KKyAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7CisgIHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9IHVuZGVmaW5lZDsKKyB9CisgZnVuY3Rpb24gcmVhZGVyTG9ja0V4Y2VwdGlvbihuYW1lKSB7CisgIHJldHVybiBuZXcgVHlwZUVycm9yKCdDYW5ub3QgJyArIG5hbWUgKyAnIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgcmVhZGVyJyk7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpIHsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7CisgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0OworICB9KTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbikgeworICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTsKKyAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCByZWFzb24pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHJlYWRlcikgeworICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTsKKyAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcik7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgcmVhc29uKSB7CisgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocmVhZGVyLl9jbG9zZWRQcm9taXNlKTsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pOworICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCByZWFzb24pIHsKKyAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbik7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZShyZWFkZXIpIHsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7CisgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7CisgfQorIHZhciBDYW5jZWxTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0NhbmNlbFN0ZXBzXV0nKTsKKyB2YXIgUHVsbFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbUHVsbFN0ZXBzXV0nKTsKKyBmdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSwgZm9yQXV0aG9yQ29kZSkgeworICBpZiAoZm9yQXV0aG9yQ29kZSA9PT0gdm9pZCAwKSB7CisgICBmb3JBdXRob3JDb2RlID0gZmFsc2U7CisgIH0KKyAgdmFyIHJlYWRlciA9IG5ldyBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTsKKyAgcmVhZGVyLl9mb3JBdXRob3JDb2RlID0gZm9yQXV0aG9yQ29kZTsKKyAgcmV0dXJuIHJlYWRlcjsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0pIHsKKyAgdmFyIHByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgIHZhciByZWFkUmVxdWVzdCA9IHsKKyAgICBfcmVzb2x2ZTogcmVzb2x2ZSwKKyAgICBfcmVqZWN0OiByZWplY3QKKyAgIH07CisgICBzdHJlYW0uX3JlYWRlci5fcmVhZFJlcXVlc3RzLnB1c2gocmVhZFJlcXVlc3QpOworICB9KTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHsKKyAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyOworICB2YXIgcmVhZFJlcXVlc3QgPSByZWFkZXIuX3JlYWRSZXF1ZXN0cy5zaGlmdCgpOworICByZWFkUmVxdWVzdC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoY2h1bmssIGRvbmUsIHJlYWRlci5fZm9yQXV0aG9yQ29kZSkpOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pIHsKKyAgcmV0dXJuIHN0cmVhbS5fcmVhZGVyLl9yZWFkUmVxdWVzdHMubGVuZ3RoOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSB7CisgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjsKKyAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIHZhciBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pIHsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHN0cmVhbSkgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIGNhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBSZWFkYWJsZVN0cmVhbSBpbnN0YW5jZScpOworICAgfQorICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSA9PT0gdHJ1ZSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgcmVhZGluZyBieSBhbm90aGVyIHJlYWRlcicpOworICAgfQorICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZSh0aGlzLCBzdHJlYW0pOworICAgdGhpcy5fcmVhZFJlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIH0KKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUsICJjbG9zZWQiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7CisgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZWQnKSk7CisgICAgfQorICAgIHJldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlOworICAgfSwKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjYW5jZWwnKSk7CisgICB9CisgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbignY2FuY2VsJykpOworICAgfQorICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLCByZWFzb24pOworICB9OworICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7CisgICB9CisgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigncmVhZCBmcm9tJykpOworICAgfQorICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQodGhpcyk7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUucmVsZWFzZUxvY2sgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7CisgICAgdGhyb3cgZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7CisgICB9CisgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuOworICAgfQorICAgaWYgKHRoaXMuX3JlYWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQnKTsKKyAgIH0KKyAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UodGhpcyk7CisgIH07CisgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI7CisgfSgpOworIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3JlYWRSZXF1ZXN0cycpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSB7CisgIHZhciBzdHJlYW0gPSByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW07CisgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodW5kZWZpbmVkLCB0cnVlLCByZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgfQorICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW0uX3N0b3JlZEVycm9yKTsKKyAgfQorICByZXR1cm4gc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXJbUHVsbFN0ZXBzXSgpOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7CisgIHJldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLiIgKyBuYW1lICsgIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIik7CisgfQorIHZhciBfYTsKKyB2YXIgQXN5bmNJdGVyYXRvclByb3RvdHlwZTsKKyBpZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLmFzeW5jSXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7CisgIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSAoX2EgPSB7fSwgX2FbU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gdGhpczsKKyAgfSwgX2EpOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvciwgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTsKKyB9CisgdmFyIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IHsKKyAgbmV4dDogZnVuY3Rpb24gKCkgeworICAgaWYgKElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpID09PSBmYWxzZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKCduZXh0JykpOworICAgfQorICAgdmFyIHJlYWRlciA9IHRoaXMuX2FzeW5jSXRlcmF0b3JSZWFkZXI7CisgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdpdGVyYXRlJykpOworICAgfQorICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSwgZnVuY3Rpb24gKHJlc3VsdCkgeworICAgIHZhciBkb25lID0gcmVzdWx0LmRvbmU7CisgICAgaWYgKGRvbmUpIHsKKyAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpOworICAgIH0KKyAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7CisgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh2YWx1ZSwgZG9uZSwgdHJ1ZSk7CisgICB9KTsKKyAgfSwKKyAgcmV0dXJuOiBmdW5jdGlvbiAodmFsdWUpIHsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbignbmV4dCcpKTsKKyAgIH0KKyAgIHZhciByZWFkZXIgPSB0aGlzLl9hc3luY0l0ZXJhdG9yUmVhZGVyOworICAgaWYgKHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbignZmluaXNoIGl0ZXJhdGluZycpKTsKKyAgIH0KKyAgIGlmIChyZWFkZXIuX3JlYWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQnKSk7CisgICB9CisgICBpZiAodGhpcy5fcHJldmVudENhbmNlbCA9PT0gZmFsc2UpIHsKKyAgICB2YXIgcmVzdWx0ID0gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHJlYWRlciwgdmFsdWUpOworICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UocmVhZGVyKTsKKyAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgocmVzdWx0LCBmdW5jdGlvbiAoKSB7CisgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodmFsdWUsIHRydWUsIHRydWUpOworICAgIH0pOworICAgfQorICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpOworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZhbHVlLCB0cnVlLCB0cnVlKSk7CisgIH0KKyB9OworIGlmIChBc3luY0l0ZXJhdG9yUHJvdG90eXBlICE9PSB1bmRlZmluZWQpIHsKKyAgT2JqZWN0LnNldFByb3RvdHlwZU9mKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7CisgfQorIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUsICduZXh0JywgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTsKKyBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlLCAncmV0dXJuJywgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTsKKyBmdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgcHJldmVudENhbmNlbCkgeworICBpZiAocHJldmVudENhbmNlbCA9PT0gdm9pZCAwKSB7CisgICBwcmV2ZW50Q2FuY2VsID0gZmFsc2U7CisgIH0KKyAgdmFyIHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTsKKyAgdmFyIGl0ZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUpOworICBpdGVyYXRvci5fYXN5bmNJdGVyYXRvclJlYWRlciA9IHJlYWRlcjsKKyAgaXRlcmF0b3IuX3ByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpOworICByZXR1cm4gaXRlcmF0b3I7CisgfQorIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2FzeW5jSXRlcmF0b3JSZWFkZXInKSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworIH0KKyBmdW5jdGlvbiBzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7CisgIHJldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0ZWFtQXN5bmNJdGVyYXRvciIpOworIH0KKyBmdW5jdGlvbiBEZXF1ZXVlVmFsdWUoY29udGFpbmVyKSB7CisgIHZhciBwYWlyID0gY29udGFpbmVyLl9xdWV1ZS5zaGlmdCgpOworICBjb250YWluZXIuX3F1ZXVlVG90YWxTaXplIC09IHBhaXIuc2l6ZTsKKyAgaWYgKGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPCAwKSB7CisgICBjb250YWluZXIuX3F1ZXVlVG90YWxTaXplID0gMDsKKyAgfQorICByZXR1cm4gcGFpci52YWx1ZTsKKyB9CisgZnVuY3Rpb24gRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udGFpbmVyLCB2YWx1ZSwgc2l6ZSkgeworICBzaXplID0gTnVtYmVyKHNpemUpOworICBpZiAoIUlzRmluaXRlTm9uTmVnYXRpdmVOdW1iZXIoc2l6ZSkpIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdTaXplIG11c3QgYmUgYSBmaW5pdGUsIG5vbi1OYU4sIG5vbi1uZWdhdGl2ZSBudW1iZXIuJyk7CisgIH0KKyAgY29udGFpbmVyLl9xdWV1ZS5wdXNoKHsKKyAgIHZhbHVlOiB2YWx1ZSwKKyAgIHNpemU6IHNpemUKKyAgfSk7CisgIGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgKz0gc2l6ZTsKKyB9CisgZnVuY3Rpb24gUGVla1F1ZXVlVmFsdWUoY29udGFpbmVyKSB7CisgIHZhciBwYWlyID0gY29udGFpbmVyLl9xdWV1ZS5wZWVrKCk7CisgIHJldHVybiBwYWlyLnZhbHVlOworIH0KKyBmdW5jdGlvbiBSZXNldFF1ZXVlKGNvbnRhaW5lcikgeworICBjb250YWluZXIuX3F1ZXVlID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPSAwOworIH0KKyB2YXIgQWJvcnRTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0Fib3J0U3RlcHNdXScpOworIHZhciBFcnJvclN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbRXJyb3JTdGVwc11dJyk7CisgdmFyIFdyaXRhYmxlU3RyZWFtID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbSh1bmRlcmx5aW5nU2luaywgc3RyYXRlZ3kpIHsKKyAgIGlmICh1bmRlcmx5aW5nU2luayA9PT0gdm9pZCAwKSB7CisgICAgdW5kZXJseWluZ1NpbmsgPSB7fTsKKyAgIH0KKyAgIGlmIChzdHJhdGVneSA9PT0gdm9pZCAwKSB7CisgICAgc3RyYXRlZ3kgPSB7fTsKKyAgIH0KKyAgIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbSh0aGlzKTsKKyAgIHZhciBzaXplID0gc3RyYXRlZ3kuc2l6ZTsKKyAgIHZhciBoaWdoV2F0ZXJNYXJrID0gc3RyYXRlZ3kuaGlnaFdhdGVyTWFyazsKKyAgIHZhciB0eXBlID0gdW5kZXJseWluZ1NpbmsudHlwZTsKKyAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlIGlzIHNwZWNpZmllZCcpOworICAgfQorICAgdmFyIHNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oc2l6ZSk7CisgICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7CisgICAgaGlnaFdhdGVyTWFyayA9IDE7CisgICB9CisgICBoaWdoV2F0ZXJNYXJrID0gVmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGhpZ2hXYXRlck1hcmspOworICAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHRoaXMsIHVuZGVybHlpbmdTaW5rLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTsKKyAgfQorICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCAibG9ja2VkIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKElzV3JpdGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7CisgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24oJ2xvY2tlZCcpOworICAgIH0KKyAgICByZXR1cm4gSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0aGlzKTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdhYm9ydCcpKTsKKyAgIH0KKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGFib3J0IGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7CisgICB9CisgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLCByZWFzb24pOworICB9OworICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpKTsKKyAgIH0KKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7CisgICB9CisgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQodGhpcykgPT09IHRydWUpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2xvc2UgYW4gYWxyZWFkeS1jbG9zaW5nIHN0cmVhbScpKTsKKyAgIH0KKyAgIHJldHVybiBXcml0YWJsZVN0cmVhbUNsb3NlKHRoaXMpOworICB9OworICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuZ2V0V3JpdGVyID0gZnVuY3Rpb24gKCkgeworICAgaWYgKElzV3JpdGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbignZ2V0V3JpdGVyJyk7CisgICB9CisgICByZXR1cm4gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKTsKKyAgfTsKKyAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtOworIH0oKTsKKyBmdW5jdGlvbiBBY3F1aXJlV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSkgeworICByZXR1cm4gbmV3IFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihzdHJlYW0pOworIH0KKyBmdW5jdGlvbiBDcmVhdGVXcml0YWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkgeworICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdm9pZCAwKSB7CisgICBoaWdoV2F0ZXJNYXJrID0gMTsKKyAgfQorICBpZiAoc2l6ZUFsZ29yaXRobSA9PT0gdm9pZCAwKSB7CisgICBzaXplQWxnb3JpdGhtID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiAxOworICAgfTsKKyAgfQorICB2YXIgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUpOworICBJbml0aWFsaXplV3JpdGFibGVTdHJlYW0oc3RyZWFtKTsKKyAgdmFyIGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTsKKyAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pOworICByZXR1cm4gc3RyZWFtOworIH0KKyBmdW5jdGlvbiBJbml0aWFsaXplV3JpdGFibGVTdHJlYW0oc3RyZWFtKSB7CisgIHN0cmVhbS5fc3RhdGUgPSAnd3JpdGFibGUnOworICBzdHJlYW0uX3N0b3JlZEVycm9yID0gdW5kZWZpbmVkOworICBzdHJlYW0uX3dyaXRlciA9IHVuZGVmaW5lZDsKKyAgc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7CisgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpOworICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkOworICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkOworICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGZhbHNlOworIH0KKyBmdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtKHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcicpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSB7CisgIGlmIChzdHJlYW0uX3dyaXRlciA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtQWJvcnQoc3RyZWFtLCByZWFzb24pIHsKKyAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTsKKyAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpOworICB9CisgIGlmIChzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgIT09IHVuZGVmaW5lZCkgeworICAgcmV0dXJuIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcHJvbWlzZTsKKyAgfQorICB2YXIgd2FzQWxyZWFkeUVycm9yaW5nID0gZmFsc2U7CisgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykgeworICAgd2FzQWxyZWFkeUVycm9yaW5nID0gdHJ1ZTsKKyAgIHJlYXNvbiA9IHVuZGVmaW5lZDsKKyAgfQorICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0geworICAgIF9wcm9taXNlOiB1bmRlZmluZWQsCisgICAgX3Jlc29sdmU6IHJlc29sdmUsCisgICAgX3JlamVjdDogcmVqZWN0LAorICAgIF9yZWFzb246IHJlYXNvbiwKKyAgICBfd2FzQWxyZWFkeUVycm9yaW5nOiB3YXNBbHJlYWR5RXJyb3JpbmcKKyAgIH07CisgIH0pOworICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2UgPSBwcm9taXNlOworICBpZiAod2FzQWxyZWFkeUVycm9yaW5nID09PSBmYWxzZSkgeworICAgV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKTsKKyAgfQorICByZXR1cm4gcHJvbWlzZTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pIHsKKyAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTsKKyAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJUaGUgc3RyZWFtIChpbiAiICsgc3RhdGUgKyAiIHN0YXRlKSBpcyBub3QgaW4gdGhlIHdyaXRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkIikpOworICB9CisgIHZhciBwcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICB2YXIgY2xvc2VSZXF1ZXN0ID0geworICAgIF9yZXNvbHZlOiByZXNvbHZlLAorICAgIF9yZWplY3Q6IHJlamVjdAorICAgfTsKKyAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gY2xvc2VSZXF1ZXN0OworICB9KTsKKyAgdmFyIHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyOworICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQgJiYgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPT09IHRydWUgJiYgc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7CisgIH0KKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyKTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtQWRkV3JpdGVSZXF1ZXN0KHN0cmVhbSkgeworICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgdmFyIHdyaXRlUmVxdWVzdCA9IHsKKyAgICBfcmVzb2x2ZTogcmVzb2x2ZSwKKyAgICBfcmVqZWN0OiByZWplY3QKKyAgIH07CisgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMucHVzaCh3cml0ZVJlcXVlc3QpOworICB9KTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24oc3RyZWFtLCBlcnJvcikgeworICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICBpZiAoc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIGVycm9yKTsKKyAgIHJldHVybjsKKyAgfQorICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIHJlYXNvbikgeworICB2YXIgY29udHJvbGxlciA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyOworICBzdHJlYW0uX3N0YXRlID0gJ2Vycm9yaW5nJzsKKyAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHJlYXNvbjsKKyAgdmFyIHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyOworICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQpIHsKKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVhc29uKTsKKyAgfQorICBpZiAoV3JpdGFibGVTdHJlYW1IYXNPcGVyYXRpb25NYXJrZWRJbkZsaWdodChzdHJlYW0pID09PSBmYWxzZSAmJiBjb250cm9sbGVyLl9zdGFydGVkID09PSB0cnVlKSB7CisgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pIHsKKyAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmVkJzsKKyAgc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXJbRXJyb3JTdGVwc10oKTsKKyAgdmFyIHN0b3JlZEVycm9yID0gc3RyZWFtLl9zdG9yZWRFcnJvcjsKKyAgc3RyZWFtLl93cml0ZVJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHdyaXRlUmVxdWVzdCkgeworICAgd3JpdGVSZXF1ZXN0Ll9yZWplY3Qoc3RvcmVkRXJyb3IpOworICB9KTsKKyAgc3RyZWFtLl93cml0ZVJlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIGlmIChzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPT09IHVuZGVmaW5lZCkgeworICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pOworICAgcmV0dXJuOworICB9CisgIHZhciBhYm9ydFJlcXVlc3QgPSBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3Q7CisgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgaWYgKGFib3J0UmVxdWVzdC5fd2FzQWxyZWFkeUVycm9yaW5nID09PSB0cnVlKSB7CisgICBhYm9ydFJlcXVlc3QuX3JlamVjdChzdG9yZWRFcnJvcik7CisgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7CisgICByZXR1cm47CisgIH0KKyAgdmFyIHByb21pc2UgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltBYm9ydFN0ZXBzXShhYm9ydFJlcXVlc3QuX3JlYXNvbik7CisgIHVwb25Qcm9taXNlKHByb21pc2UsIGZ1bmN0aW9uICgpIHsKKyAgIGFib3J0UmVxdWVzdC5fcmVzb2x2ZSgpOworICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pOworICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICBhYm9ydFJlcXVlc3QuX3JlamVjdChyZWFzb24pOworICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pOworICB9KTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlKHN0cmVhbSkgeworICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0Ll9yZXNvbHZlKHVuZGVmaW5lZCk7CisgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZVdpdGhFcnJvcihzdHJlYW0sIGVycm9yKSB7CisgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3JlamVjdChlcnJvcik7CisgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7CisgIFdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24oc3RyZWFtLCBlcnJvcik7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZShzdHJlYW0pIHsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdC5fcmVzb2x2ZSh1bmRlZmluZWQpOworICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkOworICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHsKKyAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7CisgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHsKKyAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Jlc29sdmUoKTsKKyAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7CisgICB9CisgIH0KKyAgc3RyZWFtLl9zdGF0ZSA9ICdjbG9zZWQnOworICB2YXIgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7CisgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkgeworICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcik7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdC5fcmVqZWN0KGVycm9yKTsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7CisgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3JlamVjdChlcnJvcik7CisgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7CisgIH0KKyAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSB7CisgIGlmIChzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworIH0KKyBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0KHN0cmVhbSkgeworICBpZiAoc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworIH0KKyBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pIHsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHN0cmVhbS5fY2xvc2VSZXF1ZXN0OworICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pIHsKKyAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5zaGlmdCgpOworIH0KKyBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSkgeworICBpZiAoc3RyZWFtLl9jbG9zZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkgeworICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QuX3JlamVjdChzdHJlYW0uX3N0b3JlZEVycm9yKTsKKyAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkOworICB9CisgIHZhciB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjsKKyAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7CisgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIHN0cmVhbS5fc3RvcmVkRXJyb3IpOworICB9CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKSB7CisgIHZhciB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjsKKyAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkICYmIGJhY2twcmVzc3VyZSAhPT0gc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHsKKyAgIGlmIChiYWNrcHJlc3N1cmUgPT09IHRydWUpIHsKKyAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQod3JpdGVyKTsKKyAgIH0gZWxzZSB7CisgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKTsKKyAgIH0KKyAgfQorICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTsKKyB9CisgdmFyIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciA9IGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSkgeworICAgaWYgKElzV3JpdGFibGVTdHJlYW0oc3RyZWFtKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFdyaXRhYmxlU3RyZWFtIGluc3RhbmNlJyk7CisgICB9CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSB3cml0aW5nIGJ5IGFub3RoZXIgd3JpdGVyJyk7CisgICB9CisgICB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID0gc3RyZWFtOworICAgc3RyZWFtLl93cml0ZXIgPSB0aGlzOworICAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTsKKyAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykgeworICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pID09PSBmYWxzZSAmJiBzdHJlYW0uX2JhY2twcmVzc3VyZSA9PT0gdHJ1ZSkgeworICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7CisgICAgfQorICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTsKKyAgIH0gZWxzZSBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHsKKyAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpOworICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7CisgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTsKKyAgIH0gZWxzZSB7CisgICAgdmFyIHN0b3JlZEVycm9yID0gc3RyZWFtLl9zdG9yZWRFcnJvcjsKKyAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RvcmVkRXJyb3IpOworICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RvcmVkRXJyb3IpOworICAgfQorICB9CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCAiY2xvc2VkIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZSwgImRlc2lyZWRTaXplIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTsKKyAgICB9CisgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTsKKyAgICB9CisgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHRoaXMpOworICAgfSwKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCAicmVhZHkiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWFkeScpKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdhYm9ydCcpKTsKKyAgIH0KKyAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignYWJvcnQnKSk7CisgICB9CisgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQWJvcnQodGhpcywgcmVhc29uKTsKKyAgfTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHsKKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKSk7CisgICB9CisgICB2YXIgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTsKKyAgIGlmIChzdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCdjbG9zZScpKTsKKyAgIH0KKyAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pID09PSB0cnVlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGFuIGFscmVhZHktY2xvc2luZyBzdHJlYW0nKSk7CisgICB9CisgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2UodGhpcyk7CisgIH07CisgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUucmVsZWFzZUxvY2sgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7CisgICB9CisgICB2YXIgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTsKKyAgIGlmIChzdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybjsKKyAgIH0KKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2UodGhpcyk7CisgIH07CisgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignd3JpdGUnKSk7CisgICB9CisgICBpZiAodGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ3dyaXRlIHRvJykpOworICAgfQorICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHRoaXMsIGNodW5rKTsKKyAgfTsKKyAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcjsKKyB9KCk7CisgZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoeCkgeworICBpZiAoIXR5cGVJc09iamVjdCh4KSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfb3duZXJXcml0YWJsZVN0cmVhbScpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckFib3J0KHdyaXRlciwgcmVhc29uKSB7CisgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07CisgIHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KHN0cmVhbSwgcmVhc29uKTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2Uod3JpdGVyKSB7CisgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07CisgIHJldHVybiBXcml0YWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24od3JpdGVyKSB7CisgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07CisgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7CisgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pID09PSB0cnVlIHx8IHN0YXRlID09PSAnY2xvc2VkJykgeworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTsKKyAgfQorICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgIH0KKyAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHdyaXRlcik7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZUNsb3NlZFByb21pc2VSZWplY3RlZCh3cml0ZXIsIGVycm9yKSB7CisgIGlmICh3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7CisgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIGVycm9yKTsKKyAgfSBlbHNlIHsKKyAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpOworICB9CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgZXJyb3IpIHsKKyAgaWYgKHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPT09ICdwZW5kaW5nJykgeworICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIGVycm9yKTsKKyAgfSBlbHNlIHsKKyAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQod3JpdGVyLCBlcnJvcik7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUod3JpdGVyKSB7CisgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07CisgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7CisgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnIHx8IHN0YXRlID09PSAnZXJyb3JpbmcnKSB7CisgICByZXR1cm4gbnVsbDsKKyAgfQorICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyKTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh3cml0ZXIpIHsKKyAgdmFyIHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTsKKyAgdmFyIHJlbGVhc2VkRXJyb3IgPSBuZXcgVHlwZUVycm9yKCdXcml0ZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtXCdzIGNsb3NlZG5lc3MnKTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCByZWxlYXNlZEVycm9yKTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVsZWFzZWRFcnJvcik7CisgIHN0cmVhbS5fd3JpdGVyID0gdW5kZWZpbmVkOworICB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW0gPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspIHsKKyAgdmFyIHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTsKKyAgdmFyIGNvbnRyb2xsZXIgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcjsKKyAgdmFyIGNodW5rU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspOworICBpZiAoc3RyZWFtICE9PSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW0pIHsKKyAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCd3cml0ZSB0bycpKTsKKyAgfQorICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgIH0KKyAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IHRydWUgfHwgc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGlzIGNsb3Npbmcgb3IgY2xvc2VkIGFuZCBjYW5ub3QgYmUgd3JpdHRlbiB0bycpKTsKKyAgfQorICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHsKKyAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpOworICB9CisgIHZhciBwcm9taXNlID0gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpOworICByZXR1cm4gcHJvbWlzZTsKKyB9CisgdmFyIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKSB7CisgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBleHBsaWNpdGx5Jyk7CisgIH0KKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeworICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvciBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcicpOworICAgfQorICAgdmFyIHN0YXRlID0gdGhpcy5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZTsKKyAgIGlmIChzdGF0ZSAhPT0gJ3dyaXRhYmxlJykgeworICAgIHJldHVybjsKKyAgIH0KKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCBlKTsKKyAgfTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGVbQWJvcnRTdGVwc10gPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICB2YXIgcmVzdWx0ID0gdGhpcy5fYWJvcnRBbGdvcml0aG0ocmVhc29uKTsKKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7CisgICByZXR1cm4gcmVzdWx0OworICB9OworICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZVtFcnJvclN0ZXBzXSA9IGZ1bmN0aW9uICgpIHsKKyAgIFJlc2V0UXVldWUodGhpcyk7CisgIH07CisgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyOworIH0oKTsKKyBmdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoeCkgeworICBpZiAoIXR5cGVJc09iamVjdCh4KSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHsKKyAgY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtID0gc3RyZWFtOworICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisgIGNvbnRyb2xsZXIuX3F1ZXVlID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDsKKyAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTsKKyAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlOworICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSBzaXplQWxnb3JpdGhtOworICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7CisgIGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtID0gd3JpdGVBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtID0gY2xvc2VBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gYWJvcnRBbGdvcml0aG07CisgIHZhciBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpOworICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7CisgIHZhciBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7CisgIHZhciBzdGFydFByb21pc2UgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KTsKKyAgdXBvblByb21pc2Uoc3RhcnRQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTsKKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgfSwgZnVuY3Rpb24gKHIpIHsKKyAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlOworICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIHIpOworICB9KTsKKyB9CisgZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHN0cmVhbSwgdW5kZXJseWluZ1NpbmssIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHsKKyAgdmFyIGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTsKKyAgZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKSB7CisgICByZXR1cm4gSW52b2tlT3JOb29wKHVuZGVybHlpbmdTaW5rLCAnc3RhcnQnLCBbY29udHJvbGxlcl0pOworICB9CisgIHZhciB3cml0ZUFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTaW5rLCAnd3JpdGUnLCAxLCBbY29udHJvbGxlcl0pOworICB2YXIgY2xvc2VBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nU2luaywgJ2Nsb3NlJywgMCwgW10pOworICB2YXIgYWJvcnRBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nU2luaywgJ2Fib3J0JywgMSwgW10pOworICBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikgeworICBjb250cm9sbGVyLl93cml0ZUFsZ29yaXRobSA9IHVuZGVmaW5lZDsKKyAgY29udHJvbGxlci5fY2xvc2VBbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7CisgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsICdjbG9zZScsIDApOworICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspIHsKKyAgdHJ5IHsKKyAgIHJldHVybiBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0oY2h1bmspOworICB9IGNhdGNoIChjaHVua1NpemVFKSB7CisgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBjaHVua1NpemVFKTsKKyAgIHJldHVybiAxOworICB9CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7CisgIHJldHVybiBjb250cm9sbGVyLl9zdHJhdGVneUhXTSAtIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplOworIH0KKyBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyV3JpdGUoY29udHJvbGxlciwgY2h1bmssIGNodW5rU2l6ZSkgeworICB2YXIgd3JpdGVSZWNvcmQgPSB7IGNodW5rOiBjaHVuayB9OworICB0cnkgeworICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgd3JpdGVSZWNvcmQsIGNodW5rU2l6ZSk7CisgIH0gY2F0Y2ggKGVucXVldWVFKSB7CisgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBlbnF1ZXVlRSk7CisgICByZXR1cm47CisgIH0KKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTsKKyAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IGZhbHNlICYmIHN0cmVhbS5fc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgIHZhciBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpOworICAgV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpOworICB9CisgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTsKKyAgaWYgKGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPT09IGZhbHNlKSB7CisgICByZXR1cm47CisgIH0KKyAgaWYgKHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkgeworICAgcmV0dXJuOworICB9CisgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7CisgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykgeworICAgV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pOworICAgcmV0dXJuOworICB9CisgIGlmIChjb250cm9sbGVyLl9xdWV1ZS5sZW5ndGggPT09IDApIHsKKyAgIHJldHVybjsKKyAgfQorICB2YXIgd3JpdGVSZWNvcmQgPSBQZWVrUXVldWVWYWx1ZShjb250cm9sbGVyKTsKKyAgaWYgKHdyaXRlUmVjb3JkID09PSAnY2xvc2UnKSB7CisgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc0Nsb3NlKGNvbnRyb2xsZXIpOworICB9IGVsc2UgeworICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZShjb250cm9sbGVyLCB3cml0ZVJlY29yZC5jaHVuayk7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoY29udHJvbGxlciwgZXJyb3IpIHsKKyAgaWYgKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbS5fc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlcnJvcik7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NDbG9zZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07CisgIFdyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSk7CisgIERlcXVldWVWYWx1ZShjb250cm9sbGVyKTsKKyAgdmFyIHNpbmtDbG9zZVByb21pc2UgPSBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSgpOworICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpOworICB1cG9uUHJvbWlzZShzaW5rQ2xvc2VQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2Uoc3RyZWFtKTsKKyAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHN0cmVhbSwgcmVhc29uKTsKKyAgfSk7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzV3JpdGUoY29udHJvbGxlciwgY2h1bmspIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTsKKyAgV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pOworICB2YXIgc2lua1dyaXRlUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtKGNodW5rKTsKKyAgdXBvblByb21pc2Uoc2lua1dyaXRlUHJvbWlzZSwgZnVuY3Rpb24gKCkgeworICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlKHN0cmVhbSk7CisgICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICAgRGVxdWV1ZVZhbHVlKGNvbnRyb2xsZXIpOworICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IGZhbHNlICYmIHN0YXRlID09PSAnd3JpdGFibGUnKSB7CisgICAgdmFyIGJhY2twcmVzc3VyZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcik7CisgICAgV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpOworICAgfQorICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpOworICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykgeworICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7CisgICB9CisgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGVXaXRoRXJyb3Ioc3RyZWFtLCByZWFzb24pOworICB9KTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKSB7CisgIHZhciBkZXNpcmVkU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTsKKyAgcmV0dXJuIGRlc2lyZWRTaXplIDw9IDA7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlcnJvcikgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtOworICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpOworICBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3Jpbmcoc3RyZWFtLCBlcnJvcik7CisgfQorIGZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLiIgKyBuYW1lICsgIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW0iKTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS4iICsgbmFtZSArICIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIpOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbihuYW1lKSB7CisgIHJldHVybiBuZXcgVHlwZUVycm9yKCdDYW5ub3QgJyArIG5hbWUgKyAnIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgd3JpdGVyJyk7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpIHsKKyAgd3JpdGVyLl9jbG9zZWRQcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7CisgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0OworICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncGVuZGluZyc7CisgIH0pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7CisgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpOworICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbik7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQod3JpdGVyKSB7CisgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpOworICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pIHsKKyAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh3cml0ZXIuX2Nsb3NlZFByb21pc2UpOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0KHJlYXNvbik7CisgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9ICdyZWplY3RlZCc7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7CisgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKSB7CisgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7CisgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9ICdyZXNvbHZlZCc7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcikgeworICB3cml0ZXIuX3JlYWR5UHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7CisgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSByZWplY3Q7CisgIH0pOworICB3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID0gJ3BlbmRpbmcnOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pIHsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbik7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh3cml0ZXIpIHsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbikgeworICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHdyaXRlci5fcmVhZHlQcm9taXNlKTsKKyAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0KHJlYXNvbik7CisgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7CisgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDsKKyAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdyZWplY3RlZCc7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCh3cml0ZXIpIHsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIHJlYXNvbikgeworICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpIHsKKyAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpOworICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkOworICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7CisgIHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPSAnZnVsZmlsbGVkJzsKKyB9CisgZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh2YWx1ZSkgeworICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIHRyeSB7CisgICByZXR1cm4gdHlwZW9mIHZhbHVlLmFib3J0ZWQgPT09ICdib29sZWFuJzsKKyAgfSBjYXRjaCAoX2EpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorIH0KKyB2YXIgTmF0aXZlRE9NRXhjZXB0aW9uID0gdHlwZW9mIERPTUV4Y2VwdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBET01FeGNlcHRpb24gOiB1bmRlZmluZWQ7CisgZnVuY3Rpb24gaXNET01FeGNlcHRpb25Db25zdHJ1Y3RvcihjdG9yKSB7CisgIGlmICghKHR5cGVvZiBjdG9yID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBjdG9yID09PSAnb2JqZWN0JykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICB0cnkgeworICAgbmV3IGN0b3IoKTsKKyAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChfYSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgfQorIGZ1bmN0aW9uIGNyZWF0ZURPTUV4Y2VwdGlvblBvbHlmaWxsKCkgeworICB2YXIgY3RvciA9IGZ1bmN0aW9uIERPTUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKSB7CisgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICcnOworICAgdGhpcy5uYW1lID0gbmFtZSB8fCAnRXJyb3InOworICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7CisgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgICB9CisgIH07CisgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3Rvci5wcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIHsKKyAgIHZhbHVlOiBjdG9yLAorICAgd3JpdGFibGU6IHRydWUsCisgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisgIHJldHVybiBjdG9yOworIH0KKyB2YXIgRE9NRXhjZXB0aW9uJDEgPSBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKE5hdGl2ZURPTUV4Y2VwdGlvbikgPyBOYXRpdmVET01FeGNlcHRpb24gOiBjcmVhdGVET01FeGNlcHRpb25Qb2x5ZmlsbCgpOworIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUGlwZVRvKHNvdXJjZSwgZGVzdCwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCkgeworICB2YXIgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzb3VyY2UpOworICB2YXIgd3JpdGVyID0gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihkZXN0KTsKKyAgc291cmNlLl9kaXN0dXJiZWQgPSB0cnVlOworICB2YXIgc2h1dHRpbmdEb3duID0gZmFsc2U7CisgIHZhciBjdXJyZW50V3JpdGUgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgIHJldHVybiBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgIHZhciBhYm9ydEFsZ29yaXRobTsKKyAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkgeworICAgIGFib3J0QWxnb3JpdGhtID0gZnVuY3Rpb24gKCkgeworICAgICB2YXIgZXJyb3IgPSBuZXcgRE9NRXhjZXB0aW9uJDEoJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpOworICAgICB2YXIgYWN0aW9ucyA9IFtdOworICAgICBpZiAocHJldmVudEFib3J0ID09PSBmYWxzZSkgeworICAgICAgYWN0aW9ucy5wdXNoKGZ1bmN0aW9uICgpIHsKKyAgICAgICBpZiAoZGVzdC5fc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQoZGVzdCwgZXJyb3IpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpOworICAgICAgfSk7CisgICAgIH0KKyAgICAgaWYgKHByZXZlbnRDYW5jZWwgPT09IGZhbHNlKSB7CisgICAgICBhY3Rpb25zLnB1c2goZnVuY3Rpb24gKCkgeworICAgICAgIGlmIChzb3VyY2UuX3N0YXRlID09PSAncmVhZGFibGUnKSB7CisgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIGVycm9yKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTsKKyAgICAgIH0pOworICAgICB9CisgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYWN0aW9ucy5tYXAoZnVuY3Rpb24gKGFjdGlvbikgeworICAgICAgIHJldHVybiBhY3Rpb24oKTsKKyAgICAgIH0pKTsKKyAgICAgfSwgdHJ1ZSwgZXJyb3IpOworICAgIH07CisgICAgaWYgKHNpZ25hbC5hYm9ydGVkID09PSB0cnVlKSB7CisgICAgIGFib3J0QWxnb3JpdGhtKCk7CisgICAgIHJldHVybjsKKyAgICB9CisgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbGdvcml0aG0pOworICAgfQorICAgZnVuY3Rpb24gcGlwZUxvb3AoKSB7CisgICAgcmV0dXJuIG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmVMb29wLCByZWplY3RMb29wKSB7CisgICAgIGZ1bmN0aW9uIG5leHQoZG9uZSkgeworICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICByZXNvbHZlTG9vcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocGlwZVN0ZXAoKSwgbmV4dCwgcmVqZWN0TG9vcCk7CisgICAgICB9CisgICAgIH0KKyAgICAgbmV4dChmYWxzZSk7CisgICAgfSk7CisgICB9CisgICBmdW5jdGlvbiBwaXBlU3RlcCgpIHsKKyAgICBpZiAoc2h1dHRpbmdEb3duID09PSB0cnVlKSB7CisgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHdyaXRlci5fcmVhZHlQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4oUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpLCBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICBpZiAocmVzdWx0LmRvbmUgPT09IHRydWUpIHsKKyAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRXcml0ZSA9IFBlcmZvcm1Qcm9taXNlVGhlbihXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh3cml0ZXIsIHJlc3VsdC52YWx1ZSksIHVuZGVmaW5lZCwgbm9vcCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgIH0pOworICAgIH0pOworICAgfQorICAgaXNPckJlY29tZXNFcnJvcmVkKHNvdXJjZSwgcmVhZGVyLl9jbG9zZWRQcm9taXNlLCBmdW5jdGlvbiAoc3RvcmVkRXJyb3IpIHsKKyAgICBpZiAocHJldmVudEFib3J0ID09PSBmYWxzZSkgeworICAgICBzaHV0ZG93bldpdGhBY3Rpb24oZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQoZGVzdCwgc3RvcmVkRXJyb3IpOworICAgICB9LCB0cnVlLCBzdG9yZWRFcnJvcik7CisgICAgfSBlbHNlIHsKKyAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpOworICAgIH0KKyAgIH0pOworICAgaXNPckJlY29tZXNFcnJvcmVkKGRlc3QsIHdyaXRlci5fY2xvc2VkUHJvbWlzZSwgZnVuY3Rpb24gKHN0b3JlZEVycm9yKSB7CisgICAgaWYgKHByZXZlbnRDYW5jZWwgPT09IGZhbHNlKSB7CisgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBzdG9yZWRFcnJvcik7CisgICAgIH0sIHRydWUsIHN0b3JlZEVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICBzaHV0ZG93bih0cnVlLCBzdG9yZWRFcnJvcik7CisgICAgfQorICAgfSk7CisgICBpc09yQmVjb21lc0Nsb3NlZChzb3VyY2UsIHJlYWRlci5fY2xvc2VkUHJvbWlzZSwgZnVuY3Rpb24gKCkgeworICAgIGlmIChwcmV2ZW50Q2xvc2UgPT09IGZhbHNlKSB7CisgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih3cml0ZXIpOworICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICBzaHV0ZG93bigpOworICAgIH0KKyAgIH0pOworICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSB0cnVlIHx8IGRlc3QuX3N0YXRlID09PSAnY2xvc2VkJykgeworICAgIHZhciBkZXN0Q2xvc2VkXzEgPSBuZXcgVHlwZUVycm9yKCd0aGUgZGVzdGluYXRpb24gd3JpdGFibGUgc3RyZWFtIGNsb3NlZCBiZWZvcmUgYWxsIGRhdGEgY291bGQgYmUgcGlwZWQgdG8gaXQnKTsKKyAgICBpZiAocHJldmVudENhbmNlbCA9PT0gZmFsc2UpIHsKKyAgICAgc2h1dGRvd25XaXRoQWN0aW9uKGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIGRlc3RDbG9zZWRfMSk7CisgICAgIH0sIHRydWUsIGRlc3RDbG9zZWRfMSk7CisgICAgfSBlbHNlIHsKKyAgICAgc2h1dGRvd24odHJ1ZSwgZGVzdENsb3NlZF8xKTsKKyAgICB9CisgICB9CisgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHBpcGVMb29wKCkpOworICAgZnVuY3Rpb24gd2FpdEZvcldyaXRlc1RvRmluaXNoKCkgeworICAgIHZhciBvbGRDdXJyZW50V3JpdGUgPSBjdXJyZW50V3JpdGU7CisgICAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihjdXJyZW50V3JpdGUsIGZ1bmN0aW9uICgpIHsKKyAgICAgcmV0dXJuIG9sZEN1cnJlbnRXcml0ZSAhPT0gY3VycmVudFdyaXRlID8gd2FpdEZvcldyaXRlc1RvRmluaXNoKCkgOiB1bmRlZmluZWQ7CisgICAgfSk7CisgICB9CisgICBmdW5jdGlvbiBpc09yQmVjb21lc0Vycm9yZWQoc3RyZWFtLCBwcm9taXNlLCBhY3Rpb24pIHsKKyAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICAgIGFjdGlvbihzdHJlYW0uX3N0b3JlZEVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICB1cG9uUmVqZWN0aW9uKHByb21pc2UsIGFjdGlvbik7CisgICAgfQorICAgfQorICAgZnVuY3Rpb24gaXNPckJlY29tZXNDbG9zZWQoc3RyZWFtLCBwcm9taXNlLCBhY3Rpb24pIHsKKyAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgICAgYWN0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgdXBvbkZ1bGZpbGxtZW50KHByb21pc2UsIGFjdGlvbik7CisgICAgfQorICAgfQorICAgZnVuY3Rpb24gc2h1dGRvd25XaXRoQWN0aW9uKGFjdGlvbiwgb3JpZ2luYWxJc0Vycm9yLCBvcmlnaW5hbEVycm9yKSB7CisgICAgaWYgKHNodXR0aW5nRG93biA9PT0gdHJ1ZSkgeworICAgICByZXR1cm47CisgICAgfQorICAgIHNodXR0aW5nRG93biA9IHRydWU7CisgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSBmYWxzZSkgeworICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGRvVGhlUmVzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgZG9UaGVSZXN0KCk7CisgICAgfQorICAgIGZ1bmN0aW9uIGRvVGhlUmVzdCgpIHsKKyAgICAgdXBvblByb21pc2UoYWN0aW9uKCksIGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmaW5hbGl6ZShvcmlnaW5hbElzRXJyb3IsIG9yaWdpbmFsRXJyb3IpOworICAgICB9LCBmdW5jdGlvbiAobmV3RXJyb3IpIHsKKyAgICAgIHJldHVybiBmaW5hbGl6ZSh0cnVlLCBuZXdFcnJvcik7CisgICAgIH0pOworICAgIH0KKyAgIH0KKyAgIGZ1bmN0aW9uIHNodXRkb3duKGlzRXJyb3IsIGVycm9yKSB7CisgICAgaWYgKHNodXR0aW5nRG93biA9PT0gdHJ1ZSkgeworICAgICByZXR1cm47CisgICAgfQorICAgIHNodXR0aW5nRG93biA9IHRydWU7CisgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSBmYWxzZSkgeworICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcik7CisgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgIGZpbmFsaXplKGlzRXJyb3IsIGVycm9yKTsKKyAgICB9CisgICB9CisgICBmdW5jdGlvbiBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcikgeworICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2Uod3JpdGVyKTsKKyAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7CisgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7CisgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QWxnb3JpdGhtKTsKKyAgICB9CisgICAgaWYgKGlzRXJyb3IpIHsKKyAgICAgcmVqZWN0KGVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICByZXNvbHZlKHVuZGVmaW5lZCk7CisgICAgfQorICAgfQorICB9KTsKKyB9CisgdmFyIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKSB7CisgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgIH0KKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCAiZGVzaXJlZFNpemUiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7CisgICAgfQorICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyk7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKTsKKyAgIH0KKyAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgY2xvc2UnKTsKKyAgIH0KKyAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0aGlzKTsKKyAgfTsKKyAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChjaHVuaykgeworICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2VucXVldWUnKTsKKyAgIH0KKyAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZScpOworICAgfQorICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTsKKyAgfTsKKyAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeworICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7CisgICB9CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgZSk7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW0NhbmNlbFN0ZXBzXSA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgIFJlc2V0UXVldWUodGhpcyk7CisgICB2YXIgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpOworICAgcmV0dXJuIHJlc3VsdDsKKyAgfTsKKyAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGVbUHVsbFN0ZXBzXSA9IGZ1bmN0aW9uICgpIHsKKyAgIHZhciBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07CisgICBpZiAodGhpcy5fcXVldWUubGVuZ3RoID4gMCkgeworICAgIHZhciBjaHVuayA9IERlcXVldWVWYWx1ZSh0aGlzKTsKKyAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUgJiYgdGhpcy5fcXVldWUubGVuZ3RoID09PSAwKSB7CisgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7CisgICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTsKKyAgICB9IGVsc2UgeworICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KGNodW5rLCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgIH0KKyAgIHZhciBwZW5kaW5nUHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtKTsKKyAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpOworICAgcmV0dXJuIHBlbmRpbmdQcm9taXNlOworICB9OworICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcjsKKyB9KCk7CisgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbScpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpIHsKKyAgdmFyIHNob3VsZFB1bGwgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcik7CisgIGlmIChzaG91bGRQdWxsID09PSBmYWxzZSkgeworICAgcmV0dXJuOworICB9CisgIGlmIChjb250cm9sbGVyLl9wdWxsaW5nID09PSB0cnVlKSB7CisgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSB0cnVlOworICAgcmV0dXJuOworICB9CisgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSB0cnVlOworICB2YXIgcHVsbFByb21pc2UgPSBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtKCk7CisgIHVwb25Qcm9taXNlKHB1bGxQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7CisgICBpZiAoY29udHJvbGxlci5fcHVsbEFnYWluID09PSB0cnVlKSB7CisgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gZmFsc2U7CisgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7CisgICB9CisgIH0sIGZ1bmN0aW9uIChlKSB7CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSk7CisgIH0pOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtOworICBpZiAoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpID09PSBmYWxzZSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjb250cm9sbGVyLl9zdGFydGVkID09PSBmYWxzZSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkgPT09IHRydWUgJiYgUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA+IDApIHsKKyAgIHJldHVybiB0cnVlOworICB9CisgIHZhciBkZXNpcmVkU2l6ZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTsKKyAgaWYgKGRlc2lyZWRTaXplID4gMCkgeworICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHsKKyAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHVuZGVmaW5lZDsKKyAgY29udHJvbGxlci5fY2FuY2VsQWxnb3JpdGhtID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07CisgIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID0gdHJ1ZTsKKyAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlLmxlbmd0aCA9PT0gMCkgeworICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTsKKyAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTsKKyAgfQorIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtOworICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7CisgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGNodW5rLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICB2YXIgY2h1bmtTaXplID0gdm9pZCAwOworICAgdHJ5IHsKKyAgICBjaHVua1NpemUgPSBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0oY2h1bmspOworICAgfSBjYXRjaCAoY2h1bmtTaXplRSkgeworICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBjaHVua1NpemVFKTsKKyAgICB0aHJvdyBjaHVua1NpemVFOworICAgfQorICAgdHJ5IHsKKyAgICBFbnF1ZXVlVmFsdWVXaXRoU2l6ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKTsKKyAgIH0gY2F0Y2ggKGVucXVldWVFKSB7CisgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVucXVldWVFKTsKKyAgICB0aHJvdyBlbnF1ZXVlRTsKKyAgIH0KKyAgfQorICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHsKKyAgIHJldHVybjsKKyAgfQorICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpOworICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpOworICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07CisgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7CisgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICByZXR1cm4gbnVsbDsKKyAgfQorICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZShjb250cm9sbGVyKSB7CisgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikgPT09IHRydWUpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpIHsKKyAgdmFyIHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTsKKyAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID09PSBmYWxzZSAmJiBzdGF0ZSA9PT0gJ3JlYWRhYmxlJykgeworICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworIH0KKyBmdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7CisgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbSA9IHN0cmVhbTsKKyAgY29udHJvbGxlci5fcXVldWUgPSB1bmRlZmluZWQ7CisgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkOworICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpOworICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7CisgIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID0gZmFsc2U7CisgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlOworICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7CisgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHNpemVBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNID0gaGlnaFdhdGVyTWFyazsKKyAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTsKKyAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICB2YXIgc3RhcnRSZXN1bHQgPSBzdGFydEFsZ29yaXRobSgpOworICB1cG9uUHJvbWlzZShwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KSwgZnVuY3Rpb24gKCkgeworICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgfSwgZnVuY3Rpb24gKHIpIHsKKyAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCByKTsKKyAgfSk7CisgfQorIGZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHN0cmVhbSwgdW5kZXJseWluZ1NvdXJjZSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkgeworICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpOworICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHsKKyAgIHJldHVybiBJbnZva2VPck5vb3AodW5kZXJseWluZ1NvdXJjZSwgJ3N0YXJ0JywgW2NvbnRyb2xsZXJdKTsKKyAgfQorICB2YXIgcHVsbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTb3VyY2UsICdwdWxsJywgMCwgW2NvbnRyb2xsZXJdKTsKKyAgdmFyIGNhbmNlbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTb3VyY2UsICdjYW5jZWwnLCAxLCBbXSk7CisgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIik7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtVGVlKHN0cmVhbSwgY2xvbmVGb3JCcmFuY2gyKSB7CisgIHZhciByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7CisgIHZhciByZWFkaW5nID0gZmFsc2U7CisgIHZhciBjYW5jZWxlZDEgPSBmYWxzZTsKKyAgdmFyIGNhbmNlbGVkMiA9IGZhbHNlOworICB2YXIgcmVhc29uMTsKKyAgdmFyIHJlYXNvbjI7CisgIHZhciBicmFuY2gxOworICB2YXIgYnJhbmNoMjsKKyAgdmFyIHJlc29sdmVDYW5jZWxQcm9taXNlOworICB2YXIgY2FuY2VsUHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgIHJlc29sdmVDYW5jZWxQcm9taXNlID0gcmVzb2x2ZTsKKyAgfSk7CisgIGZ1bmN0aW9uIHB1bGxBbGdvcml0aG0oKSB7CisgICBpZiAocmVhZGluZyA9PT0gdHJ1ZSkgeworICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgICB9CisgICByZWFkaW5nID0gdHJ1ZTsKKyAgIHZhciByZWFkUHJvbWlzZSA9IHRyYW5zZm9ybVByb21pc2VXaXRoKFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSwgZnVuY3Rpb24gKHJlc3VsdCkgeworICAgIHJlYWRpbmcgPSBmYWxzZTsKKyAgICB2YXIgZG9uZSA9IHJlc3VsdC5kb25lOworICAgIGlmIChkb25lID09PSB0cnVlKSB7CisgICAgIGlmIChjYW5jZWxlZDEgPT09IGZhbHNlKSB7CisgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTsKKyAgICAgfQorICAgICBpZiAoY2FuY2VsZWQyID09PSBmYWxzZSkgeworICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7CisgICAgIH0KKyAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7CisgICAgdmFyIHZhbHVlMSA9IHZhbHVlOworICAgIHZhciB2YWx1ZTIgPSB2YWx1ZTsKKyAgICBpZiAoY2FuY2VsZWQxID09PSBmYWxzZSkgeworICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShicmFuY2gxLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHZhbHVlMSk7CisgICAgfQorICAgIGlmIChjYW5jZWxlZDIgPT09IGZhbHNlKSB7CisgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmFsdWUyKTsKKyAgICB9CisgICB9KTsKKyAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocmVhZFByb21pc2UpOworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTsKKyAgfQorICBmdW5jdGlvbiBjYW5jZWwxQWxnb3JpdGhtKHJlYXNvbikgeworICAgY2FuY2VsZWQxID0gdHJ1ZTsKKyAgIHJlYXNvbjEgPSByZWFzb247CisgICBpZiAoY2FuY2VsZWQyID09PSB0cnVlKSB7CisgICAgdmFyIGNvbXBvc2l0ZVJlYXNvbiA9IGNyZWF0ZUFycmF5RnJvbUxpc3QoWworICAgICByZWFzb24xLAorICAgICByZWFzb24yCisgICAgXSk7CisgICAgdmFyIGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTsKKyAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpOworICAgfQorICAgcmV0dXJuIGNhbmNlbFByb21pc2U7CisgIH0KKyAgZnVuY3Rpb24gY2FuY2VsMkFsZ29yaXRobShyZWFzb24pIHsKKyAgIGNhbmNlbGVkMiA9IHRydWU7CisgICByZWFzb24yID0gcmVhc29uOworICAgaWYgKGNhbmNlbGVkMSA9PT0gdHJ1ZSkgeworICAgIHZhciBjb21wb3NpdGVSZWFzb24gPSBjcmVhdGVBcnJheUZyb21MaXN0KFsKKyAgICAgcmVhc29uMSwKKyAgICAgcmVhc29uMgorICAgIF0pOworICAgIHZhciBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7CisgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoY2FuY2VsUmVzdWx0KTsKKyAgIH0KKyAgIHJldHVybiBjYW5jZWxQcm9taXNlOworICB9CisgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkgeworICB9CisgIGJyYW5jaDEgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMUFsZ29yaXRobSk7CisgIGJyYW5jaDIgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7CisgIHVwb25SZWplY3Rpb24ocmVhZGVyLl9jbG9zZWRQcm9taXNlLCBmdW5jdGlvbiAocikgeworICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgcik7CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTsKKyAgfSk7CisgIHJldHVybiBbCisgICBicmFuY2gxLAorICAgYnJhbmNoMgorICBdOworIH0KKyB2YXIgTnVtYmVySXNJbnRlZ2VyID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiAodmFsdWUpIHsKKyAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZTsKKyB9OworIHZhciBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0ID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KCkgeworICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseScpOworICB9CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSwgInZpZXciLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpID09PSBmYWxzZSkgeworICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3ZpZXcnKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuX3ZpZXc7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUucmVzcG9uZCA9IGZ1bmN0aW9uIChieXRlc1dyaXR0ZW4pIHsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKCdyZXNwb25kJyk7CisgICB9CisgICBpZiAodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgQllPQiByZXF1ZXN0IGhhcyBiZWVuIGludmFsaWRhdGVkJyk7CisgICB9CisgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih0aGlzLl92aWV3LmJ1ZmZlcikgPT09IHRydWUpOworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbik7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLnJlc3BvbmRXaXRoTmV3VmlldyA9IGZ1bmN0aW9uICh2aWV3KSB7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpID09PSBmYWxzZSkgeworICAgIHRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigncmVzcG9uZCcpOworICAgfQorICAgaWYgKHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID09PSB1bmRlZmluZWQpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIEJZT0IgcmVxdWVzdCBoYXMgYmVlbiBpbnZhbGlkYXRlZCcpOworICAgfQorICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgY2FuIG9ubHkgcmVzcG9uZCB3aXRoIGFycmF5IGJ1ZmZlciB2aWV3cycpOworICAgfQorICAgaWYgKElzRGV0YWNoZWRCdWZmZXIodmlldy5idWZmZXIpID09PSB0cnVlKTsKKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIHZpZXcpOworICB9OworICByZXR1cm4gUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdDsKKyB9KCk7CisgdmFyIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoKSB7CisgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5Jyk7CisgIH0KKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCAiYnlvYlJlcXVlc3QiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2J5b2JSZXF1ZXN0Jyk7CisgICAgfQorICAgIGlmICh0aGlzLl9ieW9iUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkgeworICAgICB2YXIgZmlyc3REZXNjcmlwdG9yID0gdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7CisgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciwgZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQsIGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTsKKyAgICAgdmFyIGJ5b2JSZXF1ZXN0ID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSk7CisgICAgIFNldFVwUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdChieW9iUmVxdWVzdCwgdGhpcywgdmlldyk7CisgICAgIHRoaXMuX2J5b2JSZXF1ZXN0ID0gYnlvYlJlcXVlc3Q7CisgICAgfQorICAgIHJldHVybiB0aGlzLl9ieW9iUmVxdWVzdDsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUsICJkZXNpcmVkU2l6ZSIsIHsKKyAgIGdldDogZnVuY3Rpb24gKCkgeworICAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTsKKyAgICB9CisgICAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0aGlzKTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHsKKyAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpOworICAgfQorICAgaWYgKHRoaXMuX2Nsb3NlUmVxdWVzdGVkID09PSB0cnVlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZDsgZG8gbm90IGNsb3NlIGl0IGFnYWluIScpOworICAgfQorICAgdmFyIHN0YXRlID0gdGhpcy5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7CisgICBpZiAoc3RhdGUgIT09ICdyZWFkYWJsZScpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgc3RyZWFtIChpbiAiICsgc3RhdGUgKyAiIHN0YXRlKSBpcyBub3QgaW4gdGhlIHJlYWRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkIik7CisgICB9CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UodGhpcyk7CisgIH07CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdlbnF1ZXVlJyk7CisgICB9CisgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nJyk7CisgICB9CisgICB2YXIgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTsKKyAgIGlmIChzdGF0ZSAhPT0gJ3JlYWRhYmxlJykgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBzdHJlYW0gKGluICIgKyBzdGF0ZSArICIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBlbnF1ZXVlZCB0byIpOworICAgfQorICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IGNhbiBvbmx5IGVucXVldWUgYXJyYXkgYnVmZmVyIHZpZXdzIHdoZW4gdXNpbmcgYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyJyk7CisgICB9CisgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcihjaHVuay5idWZmZXIpID09PSB0cnVlKTsKKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTsKKyAgfTsKKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeworICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7CisgICB9CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IodGhpcywgZSk7CisgIH07CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlW0NhbmNlbFN0ZXBzXSA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgIGlmICh0aGlzLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHsKKyAgICB2YXIgZmlyc3REZXNjcmlwdG9yID0gdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7CisgICAgZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkID0gMDsKKyAgIH0KKyAgIFJlc2V0UXVldWUodGhpcyk7CisgICB2YXIgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpOworICAgcmV0dXJuIHJlc3VsdDsKKyAgfTsKKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGVbUHVsbFN0ZXBzXSA9IGZ1bmN0aW9uICgpIHsKKyAgIHZhciBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICAgaWYgKHRoaXMuX3F1ZXVlVG90YWxTaXplID4gMCkgeworICAgIHZhciBlbnRyeSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7CisgICAgdGhpcy5fcXVldWVUb3RhbFNpemUgLT0gZW50cnkuYnl0ZUxlbmd0aDsKKyAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbih0aGlzKTsKKyAgICB2YXIgdmlldyA9IHZvaWQgMDsKKyAgICB0cnkgeworICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW50cnkuYnVmZmVyLCBlbnRyeS5ieXRlT2Zmc2V0LCBlbnRyeS5ieXRlTGVuZ3RoKTsKKyAgICB9IGNhdGNoICh2aWV3RSkgeworICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2aWV3RSk7CisgICAgfQorICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh2aWV3LCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgIH0KKyAgIHZhciBhdXRvQWxsb2NhdGVDaHVua1NpemUgPSB0aGlzLl9hdXRvQWxsb2NhdGVDaHVua1NpemU7CisgICBpZiAoYXV0b0FsbG9jYXRlQ2h1bmtTaXplICE9PSB1bmRlZmluZWQpIHsKKyAgICB2YXIgYnVmZmVyID0gdm9pZCAwOworICAgIHRyeSB7CisgICAgIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihhdXRvQWxsb2NhdGVDaHVua1NpemUpOworICAgIH0gY2F0Y2ggKGJ1ZmZlckUpIHsKKyAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnVmZmVyRSk7CisgICAgfQorICAgIHZhciBwdWxsSW50b0Rlc2NyaXB0b3IgPSB7CisgICAgIGJ1ZmZlcjogYnVmZmVyLAorICAgICBieXRlT2Zmc2V0OiAwLAorICAgICBieXRlTGVuZ3RoOiBhdXRvQWxsb2NhdGVDaHVua1NpemUsCisgICAgIGJ5dGVzRmlsbGVkOiAwLAorICAgICBlbGVtZW50U2l6ZTogMSwKKyAgICAgY3RvcjogVWludDhBcnJheSwKKyAgICAgcmVhZGVyVHlwZTogJ2RlZmF1bHQnCisgICAgfTsKKyAgICB0aGlzLl9wZW5kaW5nUHVsbEludG9zLnB1c2gocHVsbEludG9EZXNjcmlwdG9yKTsKKyAgIH0KKyAgIHZhciBwcm9taXNlID0gUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0pOworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodGhpcyk7CisgICByZXR1cm4gcHJvbWlzZTsKKyAgfTsKKyAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXI7CisgfSgpOworIGZ1bmN0aW9uIElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih4KSB7CisgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcikgeworICB2YXIgc2hvdWxkUHVsbCA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKTsKKyAgaWYgKHNob3VsZFB1bGwgPT09IGZhbHNlKSB7CisgICByZXR1cm47CisgIH0KKyAgaWYgKGNvbnRyb2xsZXIuX3B1bGxpbmcgPT09IHRydWUpIHsKKyAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IHRydWU7CisgICByZXR1cm47CisgIH0KKyAgY29udHJvbGxlci5fcHVsbGluZyA9IHRydWU7CisgIHZhciBwdWxsUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0oKTsKKyAgdXBvblByb21pc2UocHVsbFByb21pc2UsIGZ1bmN0aW9uICgpIHsKKyAgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSBmYWxzZTsKKyAgIGlmIChjb250cm9sbGVyLl9wdWxsQWdhaW4gPT09IHRydWUpIHsKKyAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTsKKyAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgIH0KKyAgfSwgZnVuY3Rpb24gKGUpIHsKKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTsKKyAgfSk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcikgeworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpOworICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHsKKyAgdmFyIGRvbmUgPSBmYWxzZTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICBkb25lID0gdHJ1ZTsKKyAgfQorICB2YXIgZmlsbGVkVmlldyA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yKHB1bGxJbnRvRGVzY3JpcHRvcik7CisgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IucmVhZGVyVHlwZSA9PT0gJ2RlZmF1bHQnKSB7CisgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGZpbGxlZFZpZXcsIGRvbmUpOworICB9IGVsc2UgeworICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgZmlsbGVkVmlldywgZG9uZSk7CisgIH0KKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKSB7CisgIHZhciBieXRlc0ZpbGxlZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDsKKyAgdmFyIGVsZW1lbnRTaXplID0gcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplOworICByZXR1cm4gbmV3IHB1bGxJbnRvRGVzY3JpcHRvci5jdG9yKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0LCBieXRlc0ZpbGxlZCAvIGVsZW1lbnRTaXplKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7CisgIGNvbnRyb2xsZXIuX3F1ZXVlLnB1c2goeworICAgYnVmZmVyOiBidWZmZXIsCisgICBieXRlT2Zmc2V0OiBieXRlT2Zmc2V0LAorICAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aAorICB9KTsKKyAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgKz0gYnl0ZUxlbmd0aDsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSB7CisgIHZhciBlbGVtZW50U2l6ZSA9IHB1bGxJbnRvRGVzY3JpcHRvci5lbGVtZW50U2l6ZTsKKyAgdmFyIGN1cnJlbnRBbGlnbmVkQnl0ZXMgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBlbGVtZW50U2l6ZTsKKyAgdmFyIG1heEJ5dGVzVG9Db3B5ID0gTWF0aC5taW4oY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTsKKyAgdmFyIG1heEJ5dGVzRmlsbGVkID0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgbWF4Qnl0ZXNUb0NvcHk7CisgIHZhciBtYXhBbGlnbmVkQnl0ZXMgPSBtYXhCeXRlc0ZpbGxlZCAtIG1heEJ5dGVzRmlsbGVkICUgZWxlbWVudFNpemU7CisgIHZhciB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nID0gbWF4Qnl0ZXNUb0NvcHk7CisgIHZhciByZWFkeSA9IGZhbHNlOworICBpZiAobWF4QWxpZ25lZEJ5dGVzID4gY3VycmVudEFsaWduZWRCeXRlcykgeworICAgdG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyA9IG1heEFsaWduZWRCeXRlcyAtIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDsKKyAgIHJlYWR5ID0gdHJ1ZTsKKyAgfQorICB2YXIgcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZTsKKyAgd2hpbGUgKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPiAwKSB7CisgICB2YXIgaGVhZE9mUXVldWUgPSBxdWV1ZS5wZWVrKCk7CisgICB2YXIgYnl0ZXNUb0NvcHkgPSBNYXRoLm1pbih0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nLCBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoKTsKKyAgIHZhciBkZXN0U3RhcnQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCArIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDsKKyAgIEFycmF5QnVmZmVyQ29weShwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBkZXN0U3RhcnQsIGhlYWRPZlF1ZXVlLmJ1ZmZlciwgaGVhZE9mUXVldWUuYnl0ZU9mZnNldCwgYnl0ZXNUb0NvcHkpOworICAgaWYgKGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGggPT09IGJ5dGVzVG9Db3B5KSB7CisgICAgcXVldWUuc2hpZnQoKTsKKyAgIH0gZWxzZSB7CisgICAgaGVhZE9mUXVldWUuYnl0ZU9mZnNldCArPSBieXRlc1RvQ29weTsKKyAgICBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoIC09IGJ5dGVzVG9Db3B5OworICAgfQorICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgLT0gYnl0ZXNUb0NvcHk7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNUb0NvcHksIHB1bGxJbnRvRGVzY3JpcHRvcik7CisgICB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nIC09IGJ5dGVzVG9Db3B5OworICB9CisgIHJldHVybiByZWFkeTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIsIHNpemUsIHB1bGxJbnRvRGVzY3JpcHRvcikgeworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpOworICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKz0gc2l6ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4oY29udHJvbGxlcikgeworICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDAgJiYgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHsKKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7CisgICBSZWFkYWJsZVN0cmVhbUNsb3NlKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0pOworICB9IGVsc2UgeworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7CisgIH0KKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKSB7CisgIGlmIChjb250cm9sbGVyLl9ieW9iUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm47CisgIH0KKyAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9ieW9iUmVxdWVzdC5fdmlldyA9IHVuZGVmaW5lZDsKKyAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcikgeworICB3aGlsZSAoY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7CisgICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDApIHsKKyAgICByZXR1cm47CisgICB9CisgICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7CisgICBpZiAoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSA9PT0gdHJ1ZSkgeworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTsKKyAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcik7CisgICB9CisgIH0KKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclB1bGxJbnRvKGNvbnRyb2xsZXIsIHZpZXcpIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07CisgIHZhciBlbGVtZW50U2l6ZSA9IDE7CisgIGlmICh2aWV3LmNvbnN0cnVjdG9yICE9PSBEYXRhVmlldykgeworICAgZWxlbWVudFNpemUgPSB2aWV3LmNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UOworICB9CisgIHZhciBjdG9yID0gdmlldy5jb25zdHJ1Y3RvcjsKKyAgdmFyIGJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIodmlldy5idWZmZXIpOworICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0geworICAgYnVmZmVyOiBidWZmZXIsCisgICBieXRlT2Zmc2V0OiB2aWV3LmJ5dGVPZmZzZXQsCisgICBieXRlTGVuZ3RoOiB2aWV3LmJ5dGVMZW5ndGgsCisgICBieXRlc0ZpbGxlZDogMCwKKyAgIGVsZW1lbnRTaXplOiBlbGVtZW50U2l6ZSwKKyAgIGN0b3I6IGN0b3IsCisgICByZWFkZXJUeXBlOiAnYnlvYicKKyAgfTsKKyAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkgeworICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7CisgICByZXR1cm4gUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtKTsKKyAgfQorICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgIHZhciBlbXB0eVZpZXcgPSBuZXcgY3RvcihwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCwgMCk7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoZW1wdHlWaWV3LCB0cnVlLCBzdHJlYW0uX3JlYWRlci5fZm9yQXV0aG9yQ29kZSkpOworICB9CisgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHsKKyAgIGlmIChSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZShjb250cm9sbGVyLCBwdWxsSW50b0Rlc2NyaXB0b3IpID09PSB0cnVlKSB7CisgICAgdmFyIGZpbGxlZFZpZXcgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpOworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpOworICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChmaWxsZWRWaWV3LCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgIH0KKyAgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9PT0gdHJ1ZSkgeworICAgIHZhciBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpOworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChlKTsKKyAgIH0KKyAgfQorICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnB1c2gocHVsbEludG9EZXNjcmlwdG9yKTsKKyAgdmFyIHByb21pc2UgPSBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChzdHJlYW0pOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpIHsKKyAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlcik7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkgPT09IHRydWUpIHsKKyAgIHdoaWxlIChSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSA+IDApIHsKKyAgICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpOworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpOworICAgfQorICB9CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKSB7CisgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKyBieXRlc1dyaXR0ZW4gPiBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZUxlbmd0aCkgeworICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2J5dGVzV3JpdHRlbiBvdXQgb2YgcmFuZ2UnKTsKKyAgfQorICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBwdWxsSW50b0Rlc2NyaXB0b3IpOworICBpZiAocHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkIDwgcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplKSB7CisgICByZXR1cm47CisgIH0KKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpOworICB2YXIgcmVtYWluZGVyU2l6ZSA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAlIHB1bGxJbnRvRGVzY3JpcHRvci5lbGVtZW50U2l6ZTsKKyAgaWYgKHJlbWFpbmRlclNpemUgPiAwKSB7CisgICB2YXIgZW5kID0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQ7CisgICB2YXIgcmVtYWluZGVyID0gcHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlci5zbGljZShlbmQgLSByZW1haW5kZXJTaXplLCBlbmQpOworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgcmVtYWluZGVyLCAwLCByZW1haW5kZXIuYnl0ZUxlbmd0aCk7CisgIH0KKyAgcHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIocHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlcik7CisgIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAtPSByZW1haW5kZXJTaXplOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcik7CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcik7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKSB7CisgIHZhciBmaXJzdERlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07CisgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykgeworICAgaWYgKGJ5dGVzV3JpdHRlbiAhPT0gMCkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J5dGVzV3JpdHRlbiBtdXN0IGJlIDAgd2hlbiBjYWxsaW5nIHJlc3BvbmQoKSBvbiBhIGNsb3NlZCBzdHJlYW0nKTsKKyAgIH0KKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpOworICB9IGVsc2UgeworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBmaXJzdERlc2NyaXB0b3IpOworICB9CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcikgeworICB2YXIgZGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3Muc2hpZnQoKTsKKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTsKKyAgcmV0dXJuIGRlc2NyaXB0b3I7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9PT0gdHJ1ZSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjb250cm9sbGVyLl9zdGFydGVkID09PSBmYWxzZSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSA9PT0gdHJ1ZSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkgeworICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pID09PSB0cnVlICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyhzdHJlYW0pID4gMCkgeworICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdmFyIGRlc2lyZWRTaXplID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpOworICBpZiAoZGVzaXJlZFNpemUgPiAwKSB7CisgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikgeworICBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9jYW5jZWxBbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPiAwKSB7CisgICBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9IHRydWU7CisgICByZXR1cm47CisgIH0KKyAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkgeworICAgdmFyIGZpcnN0UGVuZGluZ1B1bGxJbnRvID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7CisgICBpZiAoZmlyc3RQZW5kaW5nUHVsbEludG8uYnl0ZXNGaWxsZWQgPiAwKSB7CisgICAgdmFyIGUgPSBuZXcgVHlwZUVycm9yKCdJbnN1ZmZpY2llbnQgYnl0ZXMgdG8gZmlsbCBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gYnVmZmVyJyk7CisgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpOworICAgIHRocm93IGU7CisgICB9CisgIH0KKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTsKKyAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTsKKyAgdmFyIGJ1ZmZlciA9IGNodW5rLmJ1ZmZlcjsKKyAgdmFyIGJ5dGVPZmZzZXQgPSBjaHVuay5ieXRlT2Zmc2V0OworICB2YXIgYnl0ZUxlbmd0aCA9IGNodW5rLmJ5dGVMZW5ndGg7CisgIHZhciB0cmFuc2ZlcnJlZEJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoYnVmZmVyKTsKKyAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihzdHJlYW0pID09PSB0cnVlKSB7CisgICBpZiAoUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA9PT0gMCkgeworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTsKKyAgIH0gZWxzZSB7CisgICAgdmFyIHRyYW5zZmVycmVkVmlldyA9IG5ldyBVaW50OEFycmF5KHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTsKKyAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIHRyYW5zZmVycmVkVmlldywgZmFsc2UpOworICAgfQorICB9IGVsc2UgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pID09PSB0cnVlKSB7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpOworICB9IGVsc2UgeworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgdHJhbnNmZXJyZWRCdWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpOworICB9CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSkgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHsKKyAgIHJldHVybjsKKyAgfQorICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJQZW5kaW5nUHVsbEludG9zKGNvbnRyb2xsZXIpOworICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpOworICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIG51bGw7CisgIH0KKyAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykgeworICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbikgeworICBieXRlc1dyaXR0ZW4gPSBOdW1iZXIoYnl0ZXNXcml0dGVuKTsKKyAgaWYgKElzRmluaXRlTm9uTmVnYXRpdmVOdW1iZXIoYnl0ZXNXcml0dGVuKSA9PT0gZmFsc2UpIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdieXRlc1dyaXR0ZW4gbXVzdCBiZSBhIGZpbml0ZScpOworICB9CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3Vmlldyhjb250cm9sbGVyLCB2aWV3KSB7CisgIHZhciBmaXJzdERlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTsKKyAgaWYgKGZpcnN0RGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICE9PSB2aWV3LmJ5dGVPZmZzZXQpIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgcmVnaW9uIHNwZWNpZmllZCBieSB2aWV3IGRvZXMgbm90IG1hdGNoIGJ5b2JSZXF1ZXN0Jyk7CisgIH0KKyAgaWYgKGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoICE9PSB2aWV3LmJ5dGVMZW5ndGgpIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgYnVmZmVyIG9mIHZpZXcgaGFzIGRpZmZlcmVudCBjYXBhY2l0eSB0aGFuIGJ5b2JSZXF1ZXN0Jyk7CisgIH0KKyAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IHZpZXcuYnVmZmVyOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEludGVybmFsKGNvbnRyb2xsZXIsIHZpZXcuYnl0ZUxlbmd0aCk7CisgfQorIGZ1bmN0aW9uIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSkgeworICBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtID0gc3RyZWFtOworICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTsKKyAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlOworICBjb250cm9sbGVyLl9ieW9iUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgY29udHJvbGxlci5fcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDsKKyAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTsKKyAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlOworICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTsKKyAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTsKKyAgY29udHJvbGxlci5fYXV0b0FsbG9jYXRlQ2h1bmtTaXplID0gYXV0b0FsbG9jYXRlQ2h1bmtTaXplOworICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgdmFyIHN0YXJ0UmVzdWx0ID0gc3RhcnRBbGdvcml0aG0oKTsKKyAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksIGZ1bmN0aW9uICgpIHsKKyAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlOworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7CisgIH0sIGZ1bmN0aW9uIChyKSB7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7CisgIH0pOworIH0KKyBmdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdCeXRlU291cmNlLCBoaWdoV2F0ZXJNYXJrKSB7CisgIHZhciBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSk7CisgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkgeworICAgcmV0dXJuIEludm9rZU9yTm9vcCh1bmRlcmx5aW5nQnl0ZVNvdXJjZSwgJ3N0YXJ0JywgW2NvbnRyb2xsZXJdKTsKKyAgfQorICB2YXIgcHVsbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdCeXRlU291cmNlLCAncHVsbCcsIDAsIFtjb250cm9sbGVyXSk7CisgIHZhciBjYW5jZWxBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nQnl0ZVNvdXJjZSwgJ2NhbmNlbCcsIDEsIFtdKTsKKyAgdmFyIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHVuZGVybHlpbmdCeXRlU291cmNlLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTsKKyAgaWYgKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSAhPT0gdW5kZWZpbmVkKSB7CisgICBhdXRvQWxsb2NhdGVDaHVua1NpemUgPSBOdW1iZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTsKKyAgIGlmIChOdW1iZXJJc0ludGVnZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKSA9PT0gZmFsc2UgfHwgYXV0b0FsbG9jYXRlQ2h1bmtTaXplIDw9IDApIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXV0b0FsbG9jYXRlQ2h1bmtTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7CisgICB9CisgIH0KKyAgU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTsKKyB9CisgZnVuY3Rpb24gU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHJlcXVlc3QsIGNvbnRyb2xsZXIsIHZpZXcpIHsKKyAgcmVxdWVzdC5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICByZXF1ZXN0Ll92aWV3ID0gdmlldzsKKyB9CisgZnVuY3Rpb24gYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHsKKyAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLiIgKyBuYW1lICsgIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCIpOworIH0KKyBmdW5jdGlvbiBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIik7CisgfQorIGZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtLCBmb3JBdXRob3JDb2RlKSB7CisgIGlmIChmb3JBdXRob3JDb2RlID09PSB2b2lkIDApIHsKKyAgIGZvckF1dGhvckNvZGUgPSBmYWxzZTsKKyAgfQorICB2YXIgcmVhZGVyID0gbmV3IFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0pOworICByZWFkZXIuX2ZvckF1dGhvckNvZGUgPSBmb3JBdXRob3JDb2RlOworICByZXR1cm4gcmVhZGVyOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChzdHJlYW0pIHsKKyAgdmFyIHByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgIHZhciByZWFkSW50b1JlcXVlc3QgPSB7CisgICAgX3Jlc29sdmU6IHJlc29sdmUsCisgICAgX3JlamVjdDogcmVqZWN0CisgICB9OworICAgc3RyZWFtLl9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMucHVzaChyZWFkSW50b1JlcXVlc3QpOworICB9KTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRJbnRvUmVxdWVzdChzdHJlYW0sIGNodW5rLCBkb25lKSB7CisgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjsKKyAgdmFyIHJlYWRJbnRvUmVxdWVzdCA9IHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5zaGlmdCgpOworICByZWFkSW50b1JlcXVlc3QuX3Jlc29sdmUoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KGNodW5rLCBkb25lLCByZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzKHN0cmVhbSkgeworICByZXR1cm4gc3RyZWFtLl9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0JZT0JSZWFkZXIoc3RyZWFtKSB7CisgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjsKKyAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihyZWFkZXIpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIHZhciBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0pIHsKKyAgIGlmICghSXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIGNhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBSZWFkYWJsZVN0cmVhbSBpbnN0YW5jZSBnaXZlbiBhICcgKyAnYnl0ZSBzb3VyY2UnKTsKKyAgIH0KKyAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpID09PSBmYWxzZSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgYSBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgZm9yIGEgc3RyZWFtIG5vdCBjb25zdHJ1Y3RlZCB3aXRoIGEgYnl0ZSAnICsgJ3NvdXJjZScpOworICAgfQorICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgcmVhZGluZyBieSBhbm90aGVyIHJlYWRlcicpOworICAgfQorICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZSh0aGlzLCBzdHJlYW0pOworICAgdGhpcy5fcmVhZEludG9SZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpOworICB9CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLCAiY2xvc2VkIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkgeworICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2FuY2VsJykpOworICAgfQorICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTsKKyAgIH0KKyAgIHJldHVybiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwodGhpcywgcmVhc29uKTsKKyAgfTsKKyAgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVhZCcpKTsKKyAgIH0KKyAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdyZWFkIGZyb20nKSk7CisgICB9CisgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyh2aWV3KSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ3ZpZXcgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldycpKTsKKyAgIH0KKyAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHZpZXcuYnVmZmVyKSA9PT0gdHJ1ZSk7CisgICBpZiAodmlldy5ieXRlTGVuZ3RoID09PSAwKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigndmlldyBtdXN0IGhhdmUgbm9uLXplcm8gYnl0ZUxlbmd0aCcpKTsKKyAgIH0KKyAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXJSZWFkKHRoaXMsIHZpZXcpOworICB9OworICBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLnJlbGVhc2VMb2NrID0gZnVuY3Rpb24gKCkgeworICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkgeworICAgIHRocm93IGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWxlYXNlTG9jaycpOworICAgfQorICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybjsKKyAgIH0KKyAgIGlmICh0aGlzLl9yZWFkSW50b1JlcXVlc3RzLmxlbmd0aCA+IDApIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCcpOworICAgfQorICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSh0aGlzKTsKKyAgfTsKKyAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcjsKKyB9KCk7CisgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoeCkgeworICBpZiAoIXR5cGVJc09iamVjdCh4KSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZEludG9SZXF1ZXN0cycpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQocmVhZGVyLCB2aWV3KSB7CisgIHZhciBzdHJlYW0gPSByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW07CisgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgIH0KKyAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmlldyk7CisgfQorIGZ1bmN0aW9uIGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHsKKyAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIiKTsKKyB9CisgdmFyIFJlYWRhYmxlU3RyZWFtID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbSh1bmRlcmx5aW5nU291cmNlLCBzdHJhdGVneSkgeworICAgaWYgKHVuZGVybHlpbmdTb3VyY2UgPT09IHZvaWQgMCkgeworICAgIHVuZGVybHlpbmdTb3VyY2UgPSB7fTsKKyAgIH0KKyAgIGlmIChzdHJhdGVneSA9PT0gdm9pZCAwKSB7CisgICAgc3RyYXRlZ3kgPSB7fTsKKyAgIH0KKyAgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbSh0aGlzKTsKKyAgIHZhciBzaXplID0gc3RyYXRlZ3kuc2l6ZTsKKyAgIHZhciBoaWdoV2F0ZXJNYXJrID0gc3RyYXRlZ3kuaGlnaFdhdGVyTWFyazsKKyAgIHZhciB0eXBlID0gdW5kZXJseWluZ1NvdXJjZS50eXBlOworICAgdmFyIHR5cGVTdHJpbmcgPSBTdHJpbmcodHlwZSk7CisgICBpZiAodHlwZVN0cmluZyA9PT0gJ2J5dGVzJykgeworICAgIGlmIChzaXplICE9PSB1bmRlZmluZWQpIHsKKyAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBzdHJhdGVneSBmb3IgYSBieXRlIHN0cmVhbSBjYW5ub3QgaGF2ZSBhIHNpemUgZnVuY3Rpb24nKTsKKyAgICB9CisgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkgeworICAgICBoaWdoV2F0ZXJNYXJrID0gMDsKKyAgICB9CisgICAgaGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTsKKyAgICBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrKTsKKyAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgdmFyIHNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oc2l6ZSk7CisgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkgeworICAgICBoaWdoV2F0ZXJNYXJrID0gMTsKKyAgICB9CisgICAgaGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTsKKyAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTsKKyAgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQnKTsKKyAgIH0KKyAgfQorICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCAibG9ja2VkIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKElzUmVhZGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7CisgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnbG9ja2VkJyk7CisgICAgfQorICAgIHJldHVybiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpOworICAgfSwKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2NhbmNlbCcpKTsKKyAgIH0KKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbmNlbCBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgcmVhZGVyJykpOworICAgfQorICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHRoaXMsIHJlYXNvbik7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5nZXRSZWFkZXIgPSBmdW5jdGlvbiAoX2EpIHsKKyAgIHZhciBtb2RlID0gKF9hID09PSB2b2lkIDAgPyB7fSA6IF9hKS5tb2RlOworICAgaWYgKElzUmVhZGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdnZXRSZWFkZXInKTsKKyAgIH0KKyAgIGlmIChtb2RlID09PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzLCB0cnVlKTsKKyAgIH0KKyAgIG1vZGUgPSBTdHJpbmcobW9kZSk7CisgICBpZiAobW9kZSA9PT0gJ2J5b2InKSB7CisgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcywgdHJ1ZSk7CisgICB9CisgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBtb2RlIGlzIHNwZWNpZmllZCcpOworICB9OworICBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggPSBmdW5jdGlvbiAoX2EsIF9iKSB7CisgICB2YXIgd3JpdGFibGUgPSBfYS53cml0YWJsZSwgcmVhZGFibGUgPSBfYS5yZWFkYWJsZTsKKyAgIHZhciBfYyA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iLCBwcmV2ZW50Q2xvc2UgPSBfYy5wcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCA9IF9jLnByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCA9IF9jLnByZXZlbnRDYW5jZWwsIHNpZ25hbCA9IF9jLnNpZ25hbDsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHRoaXMpID09PSBmYWxzZSkgeworICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRocm91Z2gnKTsKKyAgIH0KKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtKHdyaXRhYmxlKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd3cml0YWJsZSBhcmd1bWVudCB0byBwaXBlVGhyb3VnaCBtdXN0IGJlIGEgV3JpdGFibGVTdHJlYW0nKTsKKyAgIH0KKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHJlYWRhYmxlKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWFkYWJsZSBhcmd1bWVudCB0byBwaXBlVGhyb3VnaCBtdXN0IGJlIGEgUmVhZGFibGVTdHJlYW0nKTsKKyAgIH0KKyAgIHByZXZlbnRDbG9zZSA9IEJvb2xlYW4ocHJldmVudENsb3NlKTsKKyAgIHByZXZlbnRBYm9ydCA9IEJvb2xlYW4ocHJldmVudEFib3J0KTsKKyAgIHByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpOworICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2hcJ3Mgc2lnbmFsIG9wdGlvbiBtdXN0IGJlIGFuIEFib3J0U2lnbmFsJyk7CisgICB9CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSA9PT0gdHJ1ZSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVGhyb3VnaCBjYW5ub3QgYmUgdXNlZCBvbiBhIGxvY2tlZCBSZWFkYWJsZVN0cmVhbScpOworICAgfQorICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQod3JpdGFibGUpID09PSB0cnVlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUaHJvdWdoIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFdyaXRhYmxlU3RyZWFtJyk7CisgICB9CisgICB2YXIgcHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtUGlwZVRvKHRoaXMsIHdyaXRhYmxlLCBwcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCwgc2lnbmFsKTsKKyAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocHJvbWlzZSk7CisgICByZXR1cm4gcmVhZGFibGU7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gPSBmdW5jdGlvbiAoZGVzdCwgX2EpIHsKKyAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCBwcmV2ZW50Q2xvc2UgPSBfYi5wcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCA9IF9iLnByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCA9IF9iLnByZXZlbnRDYW5jZWwsIHNpZ25hbCA9IF9iLnNpZ25hbDsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHRoaXMpID09PSBmYWxzZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRvJykpOworICAgfQorICAgaWYgKElzV3JpdGFibGVTdHJlYW0oZGVzdCkgPT09IGZhbHNlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUb1wncyBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgV3JpdGFibGVTdHJlYW0nKSk7CisgICB9CisgICBwcmV2ZW50Q2xvc2UgPSBCb29sZWFuKHByZXZlbnRDbG9zZSk7CisgICBwcmV2ZW50QWJvcnQgPSBCb29sZWFuKHByZXZlbnRBYm9ydCk7CisgICBwcmV2ZW50Q2FuY2VsID0gQm9vbGVhbihwcmV2ZW50Q2FuY2VsKTsKKyAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCAmJiAhaXNBYm9ydFNpZ25hbChzaWduYWwpKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUb1wncyBzaWduYWwgb3B0aW9uIG11c3QgYmUgYW4gQWJvcnRTaWduYWwnKSk7CisgICB9CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSA9PT0gdHJ1ZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKSk7CisgICB9CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChkZXN0KSA9PT0gdHJ1ZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0nKSk7CisgICB9CisgICByZXR1cm4gUmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcywgZGVzdCwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCk7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS50ZWUgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3RlZScpOworICAgfQorICAgdmFyIGJyYW5jaGVzID0gUmVhZGFibGVTdHJlYW1UZWUodGhpcyk7CisgICByZXR1cm4gY3JlYXRlQXJyYXlGcm9tTGlzdChicmFuY2hlcyk7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChfYSkgeworICAgdmFyIF9iID0gKF9hID09PSB2b2lkIDAgPyB7fSA6IF9hKS5wcmV2ZW50Q2FuY2VsLCBwcmV2ZW50Q2FuY2VsID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2dldEl0ZXJhdG9yJyk7CisgICB9CisgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzLCBwcmV2ZW50Q2FuY2VsKTsKKyAgfTsKKyAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtOworIH0oKTsKKyBpZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLmFzeW5jSXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLmFzeW5jSXRlcmF0b3IsIHsKKyAgIHZhbHVlOiBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuZ2V0SXRlcmF0b3IsCisgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAgIHdyaXRhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworIH0KKyBmdW5jdGlvbiBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7CisgIGlmIChoaWdoV2F0ZXJNYXJrID09PSB2b2lkIDApIHsKKyAgIGhpZ2hXYXRlck1hcmsgPSAxOworICB9CisgIGlmIChzaXplQWxnb3JpdGhtID09PSB2b2lkIDApIHsKKyAgIHNpemVBbGdvcml0aG0gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIDE7CisgICB9OworICB9CisgIHZhciBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSk7CisgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbShzdHJlYW0pOworICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpOworICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTsKKyAgcmV0dXJuIHN0cmVhbTsKKyB9CisgZnVuY3Rpb24gSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHN0cmVhbSkgeworICBzdHJlYW0uX3N0YXRlID0gJ3JlYWRhYmxlJzsKKyAgc3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7CisgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7CisgIHN0cmVhbS5fZGlzdHVyYmVkID0gZmFsc2U7CisgfQorIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW0oeCkgeworICBpZiAoIXR5cGVJc09iamVjdCh4KSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pIHsKKyAgaWYgKHN0cmVhbS5fcmVhZGVyID09PSB1bmRlZmluZWQpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pIHsKKyAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlOworICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgIH0KKyAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgIH0KKyAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pOworICB2YXIgc291cmNlQ2FuY2VsUHJvbWlzZSA9IHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyW0NhbmNlbFN0ZXBzXShyZWFzb24pOworICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoc291cmNlQ2FuY2VsUHJvbWlzZSwgbm9vcCk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKSB7CisgIHN0cmVhbS5fc3RhdGUgPSAnY2xvc2VkJzsKKyAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyOworICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHsKKyAgIHJldHVybjsKKyAgfQorICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKSkgeworICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVhZFJlcXVlc3QpIHsKKyAgICByZWFkUmVxdWVzdC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodW5kZWZpbmVkLCB0cnVlLCByZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgIH0pOworICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTsKKyAgfQorICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUocmVhZGVyKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpIHsKKyAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmVkJzsKKyAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IGU7CisgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjsKKyAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm47CisgIH0KKyAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHsKKyAgIHJlYWRlci5fcmVhZFJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRSZXF1ZXN0KSB7CisgICAgcmVhZFJlcXVlc3QuX3JlamVjdChlKTsKKyAgIH0pOworICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTsKKyAgfSBlbHNlIHsKKyAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWFkSW50b1JlcXVlc3QpIHsKKyAgICByZWFkSW50b1JlcXVlc3QuX3JlamVjdChlKTsKKyAgIH0pOworICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIH0KKyAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCBlKTsKKyB9CisgZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKG5hbWUpIHsKKyAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS4iICsgbmFtZSArICIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtIik7CisgfQorIHZhciBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5ID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5KF9hKSB7CisgICB2YXIgaGlnaFdhdGVyTWFyayA9IF9hLmhpZ2hXYXRlck1hcms7CisgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrOworICB9CisgIEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIHJldHVybiBjaHVuay5ieXRlTGVuZ3RoOworICB9OworICByZXR1cm4gQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneTsKKyB9KCk7CisgdmFyIENvdW50UXVldWluZ1N0cmF0ZWd5ID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDb3VudFF1ZXVpbmdTdHJhdGVneShfYSkgeworICAgdmFyIGhpZ2hXYXRlck1hcmsgPSBfYS5oaWdoV2F0ZXJNYXJrOworICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyazsKKyAgfQorICBDb3VudFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiAxOworICB9OworICByZXR1cm4gQ291bnRRdWV1aW5nU3RyYXRlZ3k7CisgfSgpOworIHZhciBUcmFuc2Zvcm1TdHJlYW0gPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbSh0cmFuc2Zvcm1lciwgd3JpdGFibGVTdHJhdGVneSwgcmVhZGFibGVTdHJhdGVneSkgeworICAgaWYgKHRyYW5zZm9ybWVyID09PSB2b2lkIDApIHsKKyAgICB0cmFuc2Zvcm1lciA9IHt9OworICAgfQorICAgaWYgKHdyaXRhYmxlU3RyYXRlZ3kgPT09IHZvaWQgMCkgeworICAgIHdyaXRhYmxlU3RyYXRlZ3kgPSB7fTsKKyAgIH0KKyAgIGlmIChyZWFkYWJsZVN0cmF0ZWd5ID09PSB2b2lkIDApIHsKKyAgICByZWFkYWJsZVN0cmF0ZWd5ID0ge307CisgICB9CisgICB2YXIgd3JpdGFibGVTaXplRnVuY3Rpb24gPSB3cml0YWJsZVN0cmF0ZWd5LnNpemU7CisgICB2YXIgd3JpdGFibGVIaWdoV2F0ZXJNYXJrID0gd3JpdGFibGVTdHJhdGVneS5oaWdoV2F0ZXJNYXJrOworICAgdmFyIHJlYWRhYmxlU2l6ZUZ1bmN0aW9uID0gcmVhZGFibGVTdHJhdGVneS5zaXplOworICAgdmFyIHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IHJlYWRhYmxlU3RyYXRlZ3kuaGlnaFdhdGVyTWFyazsKKyAgIHZhciB3cml0YWJsZVR5cGUgPSB0cmFuc2Zvcm1lci53cml0YWJsZVR5cGU7CisgICBpZiAod3JpdGFibGVUeXBlICE9PSB1bmRlZmluZWQpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB3cml0YWJsZSB0eXBlIHNwZWNpZmllZCcpOworICAgfQorICAgdmFyIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSA9IE1ha2VTaXplQWxnb3JpdGhtRnJvbVNpemVGdW5jdGlvbih3cml0YWJsZVNpemVGdW5jdGlvbik7CisgICBpZiAod3JpdGFibGVIaWdoV2F0ZXJNYXJrID09PSB1bmRlZmluZWQpIHsKKyAgICB3cml0YWJsZUhpZ2hXYXRlck1hcmsgPSAxOworICAgfQorICAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrID0gVmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKHdyaXRhYmxlSGlnaFdhdGVyTWFyayk7CisgICB2YXIgcmVhZGFibGVUeXBlID0gdHJhbnNmb3JtZXIucmVhZGFibGVUeXBlOworICAgaWYgKHJlYWRhYmxlVHlwZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgcmVhZGFibGUgdHlwZSBzcGVjaWZpZWQnKTsKKyAgIH0KKyAgIHZhciByZWFkYWJsZVNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24ocmVhZGFibGVTaXplRnVuY3Rpb24pOworICAgaWYgKHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmVhZGFibGVIaWdoV2F0ZXJNYXJrID0gMDsKKyAgIH0KKyAgIHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhyZWFkYWJsZUhpZ2hXYXRlck1hcmspOworICAgdmFyIHN0YXJ0UHJvbWlzZV9yZXNvbHZlOworICAgdmFyIHN0YXJ0UHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICBzdGFydFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7CisgICB9KTsKKyAgIEluaXRpYWxpemVUcmFuc2Zvcm1TdHJlYW0odGhpcywgc3RhcnRQcm9taXNlLCB3cml0YWJsZUhpZ2hXYXRlck1hcmssIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSwgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLCByZWFkYWJsZVNpemVBbGdvcml0aG0pOworICAgU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21UcmFuc2Zvcm1lcih0aGlzLCB0cmFuc2Zvcm1lcik7CisgICB2YXIgc3RhcnRSZXN1bHQgPSBJbnZva2VPck5vb3AodHJhbnNmb3JtZXIsICdzdGFydCcsIFt0aGlzLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyXSk7CisgICBzdGFydFByb21pc2VfcmVzb2x2ZShzdGFydFJlc3VsdCk7CisgIH0KKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUsICJyZWFkYWJsZSIsIHsKKyAgIGdldDogZnVuY3Rpb24gKCkgeworICAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdyZWFkYWJsZScpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fcmVhZGFibGU7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUsICJ3cml0YWJsZSIsIHsKKyAgIGdldDogZnVuY3Rpb24gKCkgeworICAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCd3cml0YWJsZScpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fd3JpdGFibGU7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbTsKKyB9KCk7CisgZnVuY3Rpb24gSW5pdGlhbGl6ZVRyYW5zZm9ybVN0cmVhbShzdHJlYW0sIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKSB7CisgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkgeworICAgcmV0dXJuIHN0YXJ0UHJvbWlzZTsKKyAgfQorICBmdW5jdGlvbiB3cml0ZUFsZ29yaXRobShjaHVuaykgeworICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuayk7CisgIH0KKyAgZnVuY3Rpb24gYWJvcnRBbGdvcml0aG0ocmVhc29uKSB7CisgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobShzdHJlYW0sIHJlYXNvbik7CisgIH0KKyAgZnVuY3Rpb24gY2xvc2VBbGdvcml0aG0oKSB7CisgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobShzdHJlYW0pOworICB9CisgIHN0cmVhbS5fd3JpdGFibGUgPSBDcmVhdGVXcml0YWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0pOworICBmdW5jdGlvbiBwdWxsQWxnb3JpdGhtKCkgeworICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtKHN0cmVhbSk7CisgIH0KKyAgZnVuY3Rpb24gY2FuY2VsQWxnb3JpdGhtKHJlYXNvbikgeworICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIHJlYXNvbik7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpOworICB9CisgIHN0cmVhbS5fcmVhZGFibGUgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCByZWFkYWJsZUhpZ2hXYXRlck1hcmssIHJlYWRhYmxlU2l6ZUFsZ29yaXRobSk7CisgIHN0cmVhbS5fYmFja3ByZXNzdXJlID0gdW5kZWZpbmVkOworICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSB1bmRlZmluZWQ7CisgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkOworICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTsKKyAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkOworIH0KKyBmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbSh4KSB7CisgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ190cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKSB7CisgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihzdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGUpOworICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSk7CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKSB7CisgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcik7CisgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKHN0cmVhbS5fd3JpdGFibGUuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciwgZSk7CisgIGlmIChzdHJlYW0uX2JhY2twcmVzc3VyZSA9PT0gdHJ1ZSkgeworICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgZmFsc2UpOworICB9CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSkgeworICBpZiAoc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHsKKyAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlKCk7CisgIH0KKyAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlOworICB9KTsKKyAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSBiYWNrcHJlc3N1cmU7CisgfQorIHZhciBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciA9IGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKSB7CisgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciBpbnN0YW5jZXMgY2Fubm90IGJlIGNyZWF0ZWQgZGlyZWN0bHknKTsKKyAgfQorICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCAiZGVzaXJlZFNpemUiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Rlc2lyZWRTaXplJyk7CisgICAgfQorICAgIHZhciByZWFkYWJsZUNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyOworICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUocmVhZGFibGVDb250cm9sbGVyKTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChjaHVuaykgeworICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2VucXVldWUnKTsKKyAgIH0KKyAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLCBjaHVuayk7CisgIH07CisgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdlcnJvcicpOworICAgfQorICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCByZWFzb24pOworICB9OworICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUudGVybWluYXRlID0gZnVuY3Rpb24gKCkgeworICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3Rlcm1pbmF0ZScpOworICAgfQorICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUodGhpcyk7CisgIH07CisgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcjsKKyB9KCk7CisgZnVuY3Rpb24gSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7CisgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHRyYW5zZm9ybUFsZ29yaXRobSwgZmx1c2hBbGdvcml0aG0pIHsKKyAgY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSA9IHN0cmVhbTsKKyAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgY29udHJvbGxlci5fdHJhbnNmb3JtQWxnb3JpdGhtID0gdHJhbnNmb3JtQWxnb3JpdGhtOworICBjb250cm9sbGVyLl9mbHVzaEFsZ29yaXRobSA9IGZsdXNoQWxnb3JpdGhtOworIH0KKyBmdW5jdGlvbiBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVRyYW5zZm9ybWVyKHN0cmVhbSwgdHJhbnNmb3JtZXIpIHsKKyAgdmFyIGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7CisgIHZhciB0cmFuc2Zvcm1BbGdvcml0aG0gPSBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIHRyeSB7CisgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGNvbnRyb2xsZXIsIGNodW5rKTsKKyAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpOworICAgfSBjYXRjaCAodHJhbnNmb3JtUmVzdWx0RSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHRyYW5zZm9ybVJlc3VsdEUpOworICAgfQorICB9OworICB2YXIgdHJhbnNmb3JtTWV0aG9kID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtOworICBpZiAodHJhbnNmb3JtTWV0aG9kICE9PSB1bmRlZmluZWQpIHsKKyAgIGlmICh0eXBlb2YgdHJhbnNmb3JtTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJhbnNmb3JtIGlzIG5vdCBhIG1ldGhvZCcpOworICAgfQorICAgdHJhbnNmb3JtQWxnb3JpdGhtID0gZnVuY3Rpb24gKGNodW5rKSB7CisgICAgcmV0dXJuIFByb21pc2VDYWxsKHRyYW5zZm9ybU1ldGhvZCwgdHJhbnNmb3JtZXIsIFsKKyAgICAgY2h1bmssCisgICAgIGNvbnRyb2xsZXIKKyAgICBdKTsKKyAgIH07CisgIH0KKyAgdmFyIGZsdXNoQWxnb3JpdGhtID0gQ3JlYXRlQWxnb3JpdGhtRnJvbVVuZGVybHlpbmdNZXRob2QodHJhbnNmb3JtZXIsICdmbHVzaCcsIDAsIFtjb250cm9sbGVyXSk7CisgIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCB0cmFuc2Zvcm1BbGdvcml0aG0sIGZsdXNoQWxnb3JpdGhtKTsKKyB9CisgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikgeworICBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgIGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtID0gdW5kZWZpbmVkOworIH0KKyBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW07CisgIHZhciByZWFkYWJsZUNvbnRyb2xsZXIgPSBzdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7CisgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUocmVhZGFibGVDb250cm9sbGVyKSA9PT0gZmFsc2UpIHsKKyAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlIHNpZGUgaXMgbm90IGluIGEgc3RhdGUgdGhhdCBwZXJtaXRzIGVucXVldWUnKTsKKyAgfQorICB0cnkgeworICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUocmVhZGFibGVDb250cm9sbGVyLCBjaHVuayk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKTsKKyAgIHRocm93IHN0cmVhbS5fcmVhZGFibGUuX3N0b3JlZEVycm9yOworICB9CisgIHZhciBiYWNrcHJlc3N1cmUgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVySGFzQmFja3ByZXNzdXJlKHJlYWRhYmxlQ29udHJvbGxlcik7CisgIGlmIChiYWNrcHJlc3N1cmUgIT09IHN0cmVhbS5fYmFja3ByZXNzdXJlKSB7CisgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTsKKyAgfQorIH0KKyBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHsKKyAgVHJhbnNmb3JtU3RyZWFtRXJyb3IoY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSwgZSk7CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuaykgeworICB2YXIgdHJhbnNmb3JtUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3RyYW5zZm9ybUFsZ29yaXRobShjaHVuayk7CisgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aCh0cmFuc2Zvcm1Qcm9taXNlLCB1bmRlZmluZWQsIGZ1bmN0aW9uIChyKSB7CisgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLCByKTsKKyAgIHRocm93IHI7CisgIH0pOworIH0KKyBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclRlcm1pbmF0ZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtOworICB2YXIgcmVhZGFibGVDb250cm9sbGVyID0gc3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyOworICBpZiAoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlcikgPT09IHRydWUpIHsKKyAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShyZWFkYWJsZUNvbnRyb2xsZXIpOworICB9CisgIHZhciBlcnJvciA9IG5ldyBUeXBlRXJyb3IoJ1RyYW5zZm9ybVN0cmVhbSB0ZXJtaW5hdGVkJyk7CisgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlcnJvcik7CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuaykgeworICB2YXIgY29udHJvbGxlciA9IHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcjsKKyAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlID09PSB0cnVlKSB7CisgICB2YXIgYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSA9IHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZTsKKyAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChiYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHdyaXRhYmxlID0gc3RyZWFtLl93cml0YWJsZTsKKyAgICB2YXIgc3RhdGUgPSB3cml0YWJsZS5fc3RhdGU7CisgICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7CisgICAgIHRocm93IHdyaXRhYmxlLl9zdG9yZWRFcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuayk7CisgICB9KTsKKyAgfQorICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGNvbnRyb2xsZXIsIGNodW5rKTsKKyB9CisgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobShzdHJlYW0sIHJlYXNvbikgeworICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIHJlYXNvbik7CisgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQ2xvc2VBbGdvcml0aG0oc3RyZWFtKSB7CisgIHZhciByZWFkYWJsZSA9IHN0cmVhbS5fcmVhZGFibGU7CisgIHZhciBjb250cm9sbGVyID0gc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyOworICB2YXIgZmx1c2hQcm9taXNlID0gY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0oKTsKKyAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7CisgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChmbHVzaFByb21pc2UsIGZ1bmN0aW9uICgpIHsKKyAgIGlmIChyZWFkYWJsZS5fc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgIHRocm93IHJlYWRhYmxlLl9zdG9yZWRFcnJvcjsKKyAgIH0KKyAgIHZhciByZWFkYWJsZUNvbnRyb2xsZXIgPSByZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyOworICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShyZWFkYWJsZUNvbnRyb2xsZXIpID09PSB0cnVlKSB7CisgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHJlYWRhYmxlQ29udHJvbGxlcik7CisgICB9CisgIH0sIGZ1bmN0aW9uIChyKSB7CisgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIHIpOworICAgdGhyb3cgcmVhZGFibGUuX3N0b3JlZEVycm9yOworICB9KTsKKyB9CisgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNvdXJjZVB1bGxBbGdvcml0aG0oc3RyZWFtKSB7CisgIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIGZhbHNlKTsKKyAgcmV0dXJuIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEobmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLiIgKyBuYW1lICsgIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiKTsKKyB9CisgZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKG5hbWUpIHsKKyAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIlRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW0iKTsKKyB9CisgZXhwb3J0cy5CeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5ID0gQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneTsKKyBleHBvcnRzLkNvdW50UXVldWluZ1N0cmF0ZWd5ID0gQ291bnRRdWV1aW5nU3RyYXRlZ3k7CisgZXhwb3J0cy5SZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlU3RyZWFtOworIGV4cG9ydHMuVHJhbnNmb3JtU3RyZWFtID0gVHJhbnNmb3JtU3RyZWFtOworIGV4cG9ydHMuV3JpdGFibGVTdHJlYW0gPSBXcml0YWJsZVN0cmVhbTsKKyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOworfSkpOworCisvKioqLyB9KSwKKy8qIDE0NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDE0Nyk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDExOCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDc3KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTIwKTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguTWFwOworCisvKioqLyB9KSwKKy8qIDE0NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBjb2xsZWN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDgpOwordmFyIGNvbGxlY3Rpb25TdHJvbmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1Mik7Cittb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7CisgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsKKyAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7CisgfTsKK30sIGNvbGxlY3Rpb25TdHJvbmcpOworCisvKioqLyB9KSwKKy8qIDE0OCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgaXNGb3JjZWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUyKTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSk7Cit2YXIgaXRlcmF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA0KTsKK3ZhciBhbkluc3RhbmNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjYpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk3KTsKK3ZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd19wZGZqc19yZXF1aXJlX18oODUpOwordmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTEpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7CisgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xOworIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xOworIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7CisgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdOworIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7CisgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7CisgdmFyIGV4cG9ydGVkID0ge307CisgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHsKKyAgdmFyIG5hdGl2ZU1ldGhvZCA9IE5hdGl2ZVByb3RvdHlwZVtLRVldOworICByZWRlZmluZShOYXRpdmVQcm90b3R5cGUsIEtFWSwgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7CisgICBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSk7CisgICByZXR1cm4gdGhpczsKKyAgfSA6IEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChrZXkpIHsKKyAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTsKKyAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gdW5kZWZpbmVkIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7CisgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7CisgIH0gOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkgeworICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpOworICAgcmV0dXJuIHRoaXM7CisgIH0pOworIH07CisgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHR5cGVvZiBOYXRpdmVDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeworICAgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTsKKyAgfSkpKSkgeworICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTsKKyAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7CisgfSBlbHNlIGlmIChpc0ZvcmNlZChDT05TVFJVQ1RPUl9OQU1FLCB0cnVlKSkgeworICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTsKKyAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTsKKyAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeworICAgaW5zdGFuY2UuaGFzKDEpOworICB9KTsKKyAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7CisgICBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOworICB9KTsKKyAgdmFyIEJVR0dZX1pFUk8gPSAhSVNfV0VBSyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7CisgICB2YXIgJGluc3RhbmNlID0gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7CisgICB2YXIgaW5kZXggPSA1OworICAgd2hpbGUgKGluZGV4LS0pCisgICAgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpOworICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTsKKyAgfSk7CisgIGlmICghQUNDRVBUX0lURVJBQkxFUykgeworICAgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uIChkdW1teSwgaXRlcmFibGUpIHsKKyAgICBhbkluc3RhbmNlKGR1bW15LCBDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7CisgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlQ29uc3RydWN0b3IoKSwgZHVtbXksIENvbnN0cnVjdG9yKTsKKyAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKQorICAgICBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKKyAgICByZXR1cm4gdGhhdDsKKyAgIH0pOworICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlOworICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7CisgIH0KKyAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHsKKyAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7CisgICBmaXhNZXRob2QoJ2hhcycpOworICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7CisgIH0KKyAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpCisgICBmaXhNZXRob2QoQURERVIpOworICBpZiAoSVNfV0VBSyAmJiBOYXRpdmVQcm90b3R5cGUuY2xlYXIpCisgICBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyOworIH0KKyBleHBvcnRlZFtDT05TVFJVQ1RPUl9OQU1FXSA9IENvbnN0cnVjdG9yOworICQoeworICBnbG9iYWw6IHRydWUsCisgIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IKKyB9LCBleHBvcnRlZCk7Cisgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOworIGlmICghSVNfV0VBSykKKyAgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTsKKyByZXR1cm4gQ29uc3RydWN0b3I7Cit9OworCisvKioqLyB9KSwKKy8qIDE0OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KS5mOwordmFyIHVpZCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzgpOwordmFyIEZSRUVaSU5HID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTApOwordmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7Cit2YXIgaWQgPSAwOwordmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkgeworIHJldHVybiB0cnVlOworfTsKK3ZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkgeworIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeworICB2YWx1ZTogeworICAgb2JqZWN0SUQ6ICdPJyArICsraWQsCisgICB3ZWFrRGF0YToge30KKyAgfQorIH0pOworfTsKK3ZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHsKKyBpZiAoIWlzT2JqZWN0KGl0KSkKKyAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDsKKyBpZiAoIWhhcyhpdCwgTUVUQURBVEEpKSB7CisgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkKKyAgIHJldHVybiAnRic7CisgIGlmICghY3JlYXRlKQorICAgcmV0dXJuICdFJzsKKyAgc2V0TWV0YWRhdGEoaXQpOworIH0KKyByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEOworfTsKK3ZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7CisgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkgeworICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpCisgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFjcmVhdGUpCisgICByZXR1cm4gZmFsc2U7CisgIHNldE1ldGFkYXRhKGl0KTsKKyB9CisgcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTsKK307Cit2YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAoRlJFRVpJTkcgJiYgbWV0YS5SRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEFEQVRBKSkKKyAgc2V0TWV0YWRhdGEoaXQpOworIHJldHVybiBpdDsKK307Cit2YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0geworIFJFUVVJUkVEOiBmYWxzZSwKKyBmYXN0S2V5OiBmYXN0S2V5LAorIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSwKKyBvbkZyZWV6ZTogb25GcmVlemUKK307CitoaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7CisKKy8qKiovIH0pLAorLyogMTUwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOworbW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeworIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpOworfSk7CisKKy8qKiovIH0pLAorLyogMTUxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIHNldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHsKKyB2YXIgTmV3VGFyZ2V0LCBOZXdUYXJnZXRQcm90b3R5cGU7CisgaWYgKHNldFByb3RvdHlwZU9mICYmIHR5cGVvZiAoTmV3VGFyZ2V0ID0gZHVtbXkuY29uc3RydWN0b3IpID09ICdmdW5jdGlvbicgJiYgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmIGlzT2JqZWN0KE5ld1RhcmdldFByb3RvdHlwZSA9IE5ld1RhcmdldC5wcm90b3R5cGUpICYmIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGUpCisgIHNldFByb3RvdHlwZU9mKCR0aGlzLCBOZXdUYXJnZXRQcm90b3R5cGUpOworIHJldHVybiAkdGhpczsKK307CisKKy8qKiovIH0pLAorLyogMTUyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNykuZjsKK3ZhciBjcmVhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcxKTsKK3ZhciByZWRlZmluZUFsbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI0KTsKK3ZhciBiaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Mik7Cit2YXIgYW5JbnN0YW5jZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI2KTsKK3ZhciBpdGVyYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDQpOwordmFyIGRlZmluZUl0ZXJhdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OSk7Cit2YXIgc2V0U3BlY2llcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI1KTsKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGZhc3RLZXkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSkuZmFzdEtleTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjsKK21vZHVsZS5leHBvcnRzID0geworIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikgeworICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7CisgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpOworICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CisgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSwKKyAgICBpbmRleDogY3JlYXRlKG51bGwpLAorICAgIGZpcnN0OiB1bmRlZmluZWQsCisgICAgbGFzdDogdW5kZWZpbmVkLAorICAgIHNpemU6IDAKKyAgIH0pOworICAgaWYgKCFERVNDUklQVE9SUykKKyAgICB0aGF0LnNpemUgPSAwOworICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkKKyAgICBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKKyAgfSk7CisgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKKyAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTsKKyAgIHZhciBwcmV2aW91cywgaW5kZXg7CisgICBpZiAoZW50cnkpIHsKKyAgICBlbnRyeS52YWx1ZSA9IHZhbHVlOworICAgfSBlbHNlIHsKKyAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7CisgICAgIGluZGV4OiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwKKyAgICAga2V5OiBrZXksCisgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgcHJldmlvdXM6IHByZXZpb3VzID0gc3RhdGUubGFzdCwKKyAgICAgbmV4dDogdW5kZWZpbmVkLAorICAgICByZW1vdmVkOiBmYWxzZQorICAgIH07CisgICAgaWYgKCFzdGF0ZS5maXJzdCkKKyAgICAgc3RhdGUuZmlyc3QgPSBlbnRyeTsKKyAgICBpZiAocHJldmlvdXMpCisgICAgIHByZXZpb3VzLm5leHQgPSBlbnRyeTsKKyAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgIHN0YXRlLnNpemUrKzsKKyAgICBlbHNlCisgICAgIHRoYXQuc2l6ZSsrOworICAgIGlmIChpbmRleCAhPT0gJ0YnKQorICAgICBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTsKKyAgIH0KKyAgIHJldHVybiB0aGF0OworICB9OworICB2YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpOworICAgdmFyIGVudHJ5OworICAgaWYgKGluZGV4ICE9PSAnRicpCisgICAgcmV0dXJuIHN0YXRlLmluZGV4W2luZGV4XTsKKyAgIGZvciAoZW50cnkgPSBzdGF0ZS5maXJzdDsgZW50cnk7IGVudHJ5ID0gZW50cnkubmV4dCkgeworICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KQorICAgICByZXR1cm4gZW50cnk7CisgICB9CisgIH07CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7CisgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7CisgICAgdmFyIHRoYXQgPSB0aGlzOworICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7CisgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDsKKyAgICB2YXIgZW50cnkgPSBzdGF0ZS5maXJzdDsKKyAgICB3aGlsZSAoZW50cnkpIHsKKyAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7CisgICAgIGlmIChlbnRyeS5wcmV2aW91cykKKyAgICAgIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDsKKyAgICAgZGVsZXRlIGRhdGFbZW50cnkuaW5kZXhdOworICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CisgICAgfQorICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDsKKyAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgIHN0YXRlLnNpemUgPSAwOworICAgIGVsc2UKKyAgICAgdGhhdC5zaXplID0gMDsKKyAgIH0sCisgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgeworICAgIHZhciB0aGF0ID0gdGhpczsKKyAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7CisgICAgaWYgKGVudHJ5KSB7CisgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDsKKyAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91czsKKyAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTsKKyAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7CisgICAgIGlmIChwcmV2KQorICAgICAgcHJldi5uZXh0ID0gbmV4dDsKKyAgICAgaWYgKG5leHQpCisgICAgICBuZXh0LnByZXZpb3VzID0gcHJldjsKKyAgICAgaWYgKHN0YXRlLmZpcnN0ID09IGVudHJ5KQorICAgICAgc3RhdGUuZmlyc3QgPSBuZXh0OworICAgICBpZiAoc3RhdGUubGFzdCA9PSBlbnRyeSkKKyAgICAgIHN0YXRlLmxhc3QgPSBwcmV2OworICAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgICBzdGF0ZS5zaXplLS07CisgICAgIGVsc2UKKyAgICAgIHRoYXQuc2l6ZS0tOworICAgIH0KKyAgICByZXR1cm4gISFlbnRyeTsKKyAgIH0sCisgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4pIHsKKyAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOworICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CisgICAgdmFyIGVudHJ5OworICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7CisgICAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7CisgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKQorICAgICAgZW50cnkgPSBlbnRyeS5wcmV2aW91czsKKyAgICB9CisgICB9LAorICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTsKKyAgIH0KKyAgfSk7CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CisgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGlzLCBrZXkpOworICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTsKKyAgIH0sCisgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CisgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7CisgICB9CisgIH0gOiB7CisgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkgeworICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpOworICAgfQorICB9KTsKKyAgaWYgKERFU0NSSVBUT1JTKQorICAgZGVmaW5lUHJvcGVydHkoQy5wcm90b3R5cGUsICdzaXplJywgeworICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplOworICAgIH0KKyAgIH0pOworICByZXR1cm4gQzsKKyB9LAorIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkgeworICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJzsKKyAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKKyAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7CisgIGRlZmluZUl0ZXJhdG9yKEMsIENPTlNUUlVDVE9SX05BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkgeworICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CisgICAgdHlwZTogSVRFUkFUT1JfTkFNRSwKKyAgICB0YXJnZXQ6IGl0ZXJhdGVkLAorICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksCisgICAga2luZDoga2luZCwKKyAgICBsYXN0OiB1bmRlZmluZWQKKyAgIH0pOworICB9LCBmdW5jdGlvbiAoKSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7CisgICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7CisgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0OworICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpCisgICAgZW50cnkgPSBlbnRyeS5wcmV2aW91czsKKyAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7CisgICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkOworICAgIHJldHVybiB7CisgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgIGRvbmU6IHRydWUKKyAgICB9OworICAgfQorICAgaWYgKGtpbmQgPT0gJ2tleXMnKQorICAgIHJldHVybiB7CisgICAgIHZhbHVlOiBlbnRyeS5rZXksCisgICAgIGRvbmU6IGZhbHNlCisgICAgfTsKKyAgIGlmIChraW5kID09ICd2YWx1ZXMnKQorICAgIHJldHVybiB7CisgICAgIHZhbHVlOiBlbnRyeS52YWx1ZSwKKyAgICAgZG9uZTogZmFsc2UKKyAgICB9OworICAgcmV0dXJuIHsKKyAgICB2YWx1ZTogWworICAgICBlbnRyeS5rZXksCisgICAgIGVudHJ5LnZhbHVlCisgICAgXSwKKyAgICBkb25lOiBmYWxzZQorICAgfTsKKyAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpOworICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpOworIH0KK307CisKKy8qKiovIH0pLAorLyogMTUzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTU0KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTE4KTsKK19fd19wZGZqc19yZXF1aXJlX18oNzcpOworX193X3BkZmpzX3JlcXVpcmVfXygxMjApOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5TZXQ7CisKKy8qKiovIH0pLAorLyogMTU0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGNvbGxlY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OCk7Cit2YXIgY29sbGVjdGlvblN0cm9uZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTUyKTsKK21vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignU2V0JywgZnVuY3Rpb24gKGluaXQpIHsKKyByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeworICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsKKyB9OworfSwgY29sbGVjdGlvblN0cm9uZyk7CisKKy8qKiovIH0pLAorLyogMTU1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTE4KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTU2KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTIwKTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguV2Vha01hcDsKKworLyoqKi8gfSksCisvKiAxNTYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgcmVkZWZpbmVBbGwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNCk7Cit2YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK3ZhciBjb2xsZWN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDgpOwordmFyIGNvbGxlY3Rpb25XZWFrID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTcpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgZW5mb3JjZUl0ZXJuYWxTdGF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpLmVuZm9yY2U7Cit2YXIgTkFUSVZFX1dFQUtfTUFQID0gX193X3BkZmpzX3JlcXVpcmVfXygzNCk7Cit2YXIgSVNfSUUxMSA9ICFnbG9iYWwuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gZ2xvYmFsOwordmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7Cit2YXIgSW50ZXJuYWxXZWFrTWFwOwordmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkgeworIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkgeworICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsKKyB9OworfTsKK3ZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignV2Vha01hcCcsIHdyYXBwZXIsIGNvbGxlY3Rpb25XZWFrKTsKK2lmIChOQVRJVkVfV0VBS19NQVAgJiYgSVNfSUUxMSkgeworIEludGVybmFsV2Vha01hcCA9IGNvbGxlY3Rpb25XZWFrLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsICdXZWFrTWFwJywgdHJ1ZSk7CisgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7CisgdmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7CisgdmFyIG5hdGl2ZURlbGV0ZSA9IFdlYWtNYXBQcm90b3R5cGVbJ2RlbGV0ZSddOworIHZhciBuYXRpdmVIYXMgPSBXZWFrTWFwUHJvdG90eXBlLmhhczsKKyB2YXIgbmF0aXZlR2V0ID0gV2Vha01hcFByb3RvdHlwZS5nZXQ7CisgdmFyIG5hdGl2ZVNldCA9IFdlYWtNYXBQcm90b3R5cGUuc2V0OworIHJlZGVmaW5lQWxsKFdlYWtNYXBQcm90b3R5cGUsIHsKKyAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHsKKyAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkgeworICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7CisgICAgaWYgKCFzdGF0ZS5mcm96ZW4pCisgICAgIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTsKKyAgICByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW5bJ2RlbGV0ZSddKGtleSk7CisgICB9CisgICByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KTsKKyAgfSwKKyAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHsKKyAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpOworICAgIGlmICghc3RhdGUuZnJvemVuKQorICAgICBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7CisgICAgcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuLmhhcyhrZXkpOworICAgfQorICAgcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSk7CisgIH0sCisgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkgeworICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CisgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoIXN0YXRlLmZyb3plbikKKyAgICAgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOworICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpID8gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTsKKyAgIH0KKyAgIHJldHVybiBuYXRpdmVHZXQuY2FsbCh0aGlzLCBrZXkpOworICB9LAorICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CisgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHsKKyAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpOworICAgIGlmICghc3RhdGUuZnJvemVuKQorICAgICBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7CisgICAgbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KSA/IG5hdGl2ZVNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpIDogc3RhdGUuZnJvemVuLnNldChrZXksIHZhbHVlKTsKKyAgIH0gZWxzZQorICAgIG5hdGl2ZVNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpOworICAgcmV0dXJuIHRoaXM7CisgIH0KKyB9KTsKK30KKworLyoqKi8gfSksCisvKiAxNTcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgcmVkZWZpbmVBbGwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNCk7Cit2YXIgZ2V0V2Vha0RhdGEgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSkuZ2V0V2Vha0RhdGE7Cit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGFuSW5zdGFuY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNik7Cit2YXIgaXRlcmF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA0KTsKK3ZhciBBcnJheUl0ZXJhdGlvbk1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTU4KTsKK3ZhciAkaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpOwordmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKK3ZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7Cit2YXIgZmluZCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmQ7Cit2YXIgZmluZEluZGV4ID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZEluZGV4OwordmFyIGlkID0gMDsKK3ZhciB1bmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKHN0b3JlKSB7CisgcmV0dXJuIHN0b3JlLmZyb3plbiB8fCAoc3RvcmUuZnJvemVuID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7Cit9OwordmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7CisgdGhpcy5lbnRyaWVzID0gW107Cit9OwordmFyIGZpbmRVbmNhdWdodEZyb3plbiA9IGZ1bmN0aW9uIChzdG9yZSwga2V5KSB7CisgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiBpdFswXSA9PT0ga2V5OworIH0pOworfTsKK1VuY2F1Z2h0RnJvemVuU3RvcmUucHJvdG90eXBlID0geworIGdldDogZnVuY3Rpb24gKGtleSkgeworICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTsKKyAgaWYgKGVudHJ5KQorICAgcmV0dXJuIGVudHJ5WzFdOworIH0sCisgaGFzOiBmdW5jdGlvbiAoa2V5KSB7CisgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpOworIH0sCisgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTsKKyAgaWYgKGVudHJ5KQorICAgZW50cnlbMV0gPSB2YWx1ZTsKKyAgZWxzZQorICAgdGhpcy5lbnRyaWVzLnB1c2goWworICAgIGtleSwKKyAgICB2YWx1ZQorICAgXSk7CisgfSwKKyAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgeworICB2YXIgaW5kZXggPSBmaW5kSW5kZXgodGhpcy5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHsKKyAgIHJldHVybiBpdFswXSA9PT0ga2V5OworICB9KTsKKyAgaWYgKH5pbmRleCkKKyAgIHRoaXMuZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpOworICByZXR1cm4gISF+aW5kZXg7CisgfQorfTsKK21vZHVsZS5leHBvcnRzID0geworIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikgeworICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7CisgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpOworICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CisgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSwKKyAgICBpZDogaWQrKywKKyAgICBmcm96ZW46IHVuZGVmaW5lZAorICAgfSk7CisgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKQorICAgIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB0aGF0LCBJU19NQVApOworICB9KTsKKyAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpOworICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHsKKyAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7CisgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpOworICAgaWYgKGRhdGEgPT09IHRydWUpCisgICAgdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuc2V0KGtleSwgdmFsdWUpOworICAgZWxzZQorICAgIGRhdGFbc3RhdGUuaWRdID0gdmFsdWU7CisgICByZXR1cm4gdGhhdDsKKyAgfTsKKyAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHsKKyAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoIWlzT2JqZWN0KGtleSkpCisgICAgIHJldHVybiBmYWxzZTsKKyAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7CisgICAgaWYgKGRhdGEgPT09IHRydWUpCisgICAgIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKVsnZGVsZXRlJ10oa2V5KTsKKyAgICByZXR1cm4gZGF0YSAmJiAkaGFzKGRhdGEsIHN0YXRlLmlkKSAmJiBkZWxldGUgZGF0YVtzdGF0ZS5pZF07CisgICB9LAorICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoIWlzT2JqZWN0KGtleSkpCisgICAgIHJldHVybiBmYWxzZTsKKyAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7CisgICAgaWYgKGRhdGEgPT09IHRydWUpCisgICAgIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5oYXMoa2V5KTsKKyAgICByZXR1cm4gZGF0YSAmJiAkaGFzKGRhdGEsIHN0YXRlLmlkKTsKKyAgIH0KKyAgfSk7CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CisgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOworICAgIGlmIChpc09iamVjdChrZXkpKSB7CisgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTsKKyAgICAgaWYgKGRhdGEgPT09IHRydWUpCisgICAgICByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuZ2V0KGtleSk7CisgICAgIHJldHVybiBkYXRhID8gZGF0YVtzdGF0ZS5pZF0gOiB1bmRlZmluZWQ7CisgICAgfQorICAgfSwKKyAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpOworICAgfQorICB9IDogeworICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHsKKyAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlLCB0cnVlKTsKKyAgIH0KKyAgfSk7CisgIHJldHVybiBDOworIH0KK307CisKKy8qKiovIH0pLAorLyogMTU4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBiaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Mik7Cit2YXIgSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwordmFyIHRvT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Myk7Cit2YXIgdG9MZW5ndGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ3KTsKK3ZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1OSk7Cit2YXIgcHVzaCA9IFtdLnB1c2g7Cit2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHsKKyB2YXIgSVNfTUFQID0gVFlQRSA9PSAxOworIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7CisgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7CisgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0OworIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2OworIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYOworIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7CisgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpOworICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7CisgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTsKKyAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTsKKyAgdmFyIGluZGV4ID0gMDsKKyAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTsKKyAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7CisgIHZhciB2YWx1ZSwgcmVzdWx0OworICBmb3IgKDsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspCisgICBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikgeworICAgIHZhbHVlID0gc2VsZltpbmRleF07CisgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pOworICAgIGlmIChUWVBFKSB7CisgICAgIGlmIChJU19NQVApCisgICAgICB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OworICAgICBlbHNlIGlmIChyZXN1bHQpCisgICAgICBzd2l0Y2ggKFRZUEUpIHsKKyAgICAgIGNhc2UgMzoKKyAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgNToKKyAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICBjYXNlIDY6CisgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgY2FzZSAyOgorICAgICAgIHB1c2guY2FsbCh0YXJnZXQsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgZWxzZSBpZiAoSVNfRVZFUlkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgfQorICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogdGFyZ2V0OworIH07Cit9OworbW9kdWxlLmV4cG9ydHMgPSB7CisgZm9yRWFjaDogY3JlYXRlTWV0aG9kKDApLAorIG1hcDogY3JlYXRlTWV0aG9kKDEpLAorIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLAorIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSwKKyBldmVyeTogY3JlYXRlTWV0aG9kKDQpLAorIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSwKKyBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KQorfTsKKworLyoqKi8gfSksCisvKiAxNTkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgaXNBcnJheSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYwKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHsKKyB2YXIgQzsKKyBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkgeworICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjsKKyAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkKKyAgIEMgPSB1bmRlZmluZWQ7CisgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7CisgICBDID0gQ1tTUEVDSUVTXTsKKyAgIGlmIChDID09PSBudWxsKQorICAgIEMgPSB1bmRlZmluZWQ7CisgIH0KKyB9CisgcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTsKK307CisKKy8qKiovIH0pLAorLyogMTYwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cittb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHsKKyByZXR1cm4gY2xhc3NvZihhcmcpID09ICdBcnJheSc7Cit9OworCisvKioqLyB9KSwKKy8qIDE2MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDExOCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE2Mik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEyMCk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLldlYWtTZXQ7CisKKy8qKiovIH0pLAorLyogMTYyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGNvbGxlY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OCk7Cit2YXIgY29sbGVjdGlvbldlYWsgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1Nyk7Citjb2xsZWN0aW9uKCdXZWFrU2V0JywgZnVuY3Rpb24gKGluaXQpIHsKKyByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpIHsKKyAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7CisgfTsKK30sIGNvbGxlY3Rpb25XZWFrKTsKKworLyoqKi8gfSksCisvKiAxNjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxNjQpOwordmFyIGVudHJ5VW5iaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2MSk7Cittb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAnY29kZVBvaW50QXQnKTsKKworLyoqKi8gfSksCisvKiAxNjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGNvZGVBdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzgpLmNvZGVBdDsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUKK30sIHsKKyBjb2RlUG9pbnRBdDogZnVuY3Rpb24gY29kZVBvaW50QXQocG9zKSB7CisgIHJldHVybiBjb2RlQXQodGhpcywgcG9zKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxNjUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxNjYpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5TdHJpbmcuZnJvbUNvZGVQb2ludDsKKworLyoqKi8gfSksCisvKiAxNjYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ5KTsKK3ZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwordmFyIG5hdGl2ZUZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDsKK3ZhciBJTkNPUlJFQ1RfTEVOR1RIID0gISFuYXRpdmVGcm9tQ29kZVBvaW50ICYmIG5hdGl2ZUZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDE7CiskKHsKKyB0YXJnZXQ6ICdTdHJpbmcnLAorIHN0YXQ6IHRydWUsCisgZm9yY2VkOiBJTkNPUlJFQ1RfTEVOR1RICit9LCB7CisgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludCh4KSB7CisgIHZhciBlbGVtZW50cyA9IFtdOworICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKyAgdmFyIGkgPSAwOworICB2YXIgY29kZTsKKyAgd2hpbGUgKGxlbmd0aCA+IGkpIHsKKyAgIGNvZGUgPSArYXJndW1lbnRzW2krK107CisgICBpZiAodG9BYnNvbHV0ZUluZGV4KGNvZGUsIDB4MTBGRkZGKSAhPT0gY29kZSkKKyAgICB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTsKKyAgIGVsZW1lbnRzLnB1c2goY29kZSA8IDB4MTAwMDAgPyBmcm9tQ2hhckNvZGUoY29kZSkgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4RDgwMCwgY29kZSAlIDB4NDAwICsgMHhEQzAwKSk7CisgIH0KKyAgcmV0dXJuIGVsZW1lbnRzLmpvaW4oJycpOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDE2NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDE2OCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDExOCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3MCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3NCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3NSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3Nik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3Nyk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3OCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3OSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4MCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4MSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4Mik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4Myk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4NCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4NSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4Nik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4Nyk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4OCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4OSk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN5bWJvbDsKKworLyoqKi8gfSksCisvKiAxNjggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgaXNBcnJheSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYwKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIHRvT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Myk7Cit2YXIgdG9MZW5ndGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ3KTsKK3ZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oOTMpOwordmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTU5KTsKK3ZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjkpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIFY4X1ZFUlNJT04gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzNSk7Cit2YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEUgPSB3ZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpOwordmFyIE1BWF9TQUZFX0lOVEVHRVIgPSAweDFGRkZGRkZGRkZGRkZGOwordmFyIE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCA9ICdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnOwordmFyIElTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgPSBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CisgdmFyIGFycmF5ID0gW107CisgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7CisgcmV0dXJuIGFycmF5LmNvbmNhdCgpWzBdICE9PSBhcnJheTsKK30pOwordmFyIFNQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ2NvbmNhdCcpOwordmFyIGlzQ29uY2F0U3ByZWFkYWJsZSA9IGZ1bmN0aW9uIChPKSB7CisgaWYgKCFpc09iamVjdChPKSkKKyAgcmV0dXJuIGZhbHNlOworIHZhciBzcHJlYWRhYmxlID0gT1tJU19DT05DQVRfU1BSRUFEQUJMRV07CisgcmV0dXJuIHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/ICEhc3ByZWFkYWJsZSA6IGlzQXJyYXkoTyk7Cit9OwordmFyIEZPUkNFRCA9ICFJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUIHx8ICFTUEVDSUVTX1NVUFBPUlQ7CiskKHsKKyB0YXJnZXQ6ICdBcnJheScsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiBGT1JDRUQKK30sIHsKKyBjb25jYXQ6IGZ1bmN0aW9uIGNvbmNhdChhcmcpIHsKKyAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTsKKyAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7CisgIHZhciBuID0gMDsKKyAgdmFyIGksIGssIGxlbmd0aCwgbGVuLCBFOworICBmb3IgKGkgPSAtMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICBFID0gaSA9PT0gLTEgPyBPIDogYXJndW1lbnRzW2ldOworICAgaWYgKGlzQ29uY2F0U3ByZWFkYWJsZShFKSkgeworICAgIGxlbiA9IHRvTGVuZ3RoKEUubGVuZ3RoKTsKKyAgICBpZiAobiArIGxlbiA+IE1BWF9TQUZFX0lOVEVHRVIpCisgICAgIHRocm93IFR5cGVFcnJvcihNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQpOworICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsrKywgbisrKQorICAgICBpZiAoayBpbiBFKQorICAgICAgY3JlYXRlUHJvcGVydHkoQSwgbiwgRVtrXSk7CisgICB9IGVsc2UgeworICAgIGlmIChuID49IE1BWF9TQUZFX0lOVEVHRVIpCisgICAgIHRocm93IFR5cGVFcnJvcihNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQpOworICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4rKywgRSk7CisgICB9CisgIH0KKyAgQS5sZW5ndGggPSBuOworICByZXR1cm4gQTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxNjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgVjhfVkVSU0lPTiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTM1KTsKK3ZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgeworIHJldHVybiBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CisgIHZhciBhcnJheSA9IFtdOworICB2YXIgY29uc3RydWN0b3IgPSBhcnJheS5jb25zdHJ1Y3RvciA9IHt9OworICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiB7IGZvbzogMSB9OworICB9OworICByZXR1cm4gYXJyYXlbTUVUSE9EX05BTUVdKEJvb2xlYW4pLmZvbyAhPT0gMTsKKyB9KTsKK307CisKKy8qKiovIH0pLAorLyogMTcwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Mik7Cit2YXIgSVNfUFVSRSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzcpOwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTgpOwordmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OSk7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBpc0FycmF5ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjApOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciB0b09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oODMpOwordmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcpOwordmFyIHRvUHJpbWl0aXZlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMSk7Cit2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cit2YXIgbmF0aXZlT2JqZWN0Q3JlYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXyg3MSk7Cit2YXIgb2JqZWN0S2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzMpOwordmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ0KTsKK3ZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3MSk7Cit2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXyg1MSk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7Cit2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KTsKK3ZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTUpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIHJlZGVmaW5lID0gX193X3BkZmpzX3JlcXVpcmVfXygyOSk7Cit2YXIgc2hhcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygzNik7Cit2YXIgc2hhcmVkS2V5ID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7Cit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOwordmFyIHVpZCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzgpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Mik7Cit2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzMpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7Cit2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpOwordmFyICRmb3JFYWNoID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTgpLmZvckVhY2g7Cit2YXIgSElEREVOID0gc2hhcmVkS2V5KCdoaWRkZW4nKTsKK3ZhciBTWU1CT0wgPSAnU3ltYm9sJzsKK3ZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJzsKK3ZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpOwordmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdFtQUk9UT1RZUEVdOwordmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sOwordmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpOwordmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mOwordmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjsKK3ZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7Cit2YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mOwordmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTsKK3ZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7Cit2YXIgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeScpOwordmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTsKK3ZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwordmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDsKK3ZhciBVU0VfU0VUVEVSID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDsKK3ZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkgeworIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywgeworICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsKKyAgfQorIH0pKS5hICE9IDc7Cit9KSA/IGZ1bmN0aW9uIChPLCBQLCBBdHRyaWJ1dGVzKSB7CisgdmFyIE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCBQKTsKKyBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvcikKKyAgZGVsZXRlIE9iamVjdFByb3RvdHlwZVtQXTsKKyBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTsKKyBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciAmJiBPICE9PSBPYmplY3RQcm90b3R5cGUpIHsKKyAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTsKKyB9Cit9IDogbmF0aXZlRGVmaW5lUHJvcGVydHk7Cit2YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcsIGRlc2NyaXB0aW9uKSB7CisgdmFyIHN5bWJvbCA9IEFsbFN5bWJvbHNbdGFnXSA9IG5hdGl2ZU9iamVjdENyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pOworIHNldEludGVybmFsU3RhdGUoc3ltYm9sLCB7CisgIHR5cGU6IFNZTUJPTCwKKyAgdGFnOiB0YWcsCisgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbgorIH0pOworIGlmICghREVTQ1JJUFRPUlMpCisgIHN5bWJvbC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworIHJldHVybiBzeW1ib2w7Cit9OwordmFyIGlzU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnOworfSA6IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiBPYmplY3QoaXQpIGluc3RhbmNlb2YgJFN5bWJvbDsKK307Cit2YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykgeworIGlmIChPID09PSBPYmplY3RQcm90b3R5cGUpCisgICRkZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQLCBBdHRyaWJ1dGVzKTsKKyBhbk9iamVjdChPKTsKKyB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CisgYW5PYmplY3QoQXR0cmlidXRlcyk7CisgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7CisgIGlmICghQXR0cmlidXRlcy5lbnVtZXJhYmxlKSB7CisgICBpZiAoIWhhcyhPLCBISURERU4pKQorICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIEhJRERFTiwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHt9KSk7CisgICBPW0hJRERFTl1ba2V5XSA9IHRydWU7CisgIH0gZWxzZSB7CisgICBpZiAoaGFzKE8sIEhJRERFTikgJiYgT1tISURERU5dW2tleV0pCisgICAgT1tISURERU5dW2tleV0gPSBmYWxzZTsKKyAgIEF0dHJpYnV0ZXMgPSBuYXRpdmVPYmplY3RDcmVhdGUoQXR0cmlidXRlcywgeyBlbnVtZXJhYmxlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgZmFsc2UpIH0pOworICB9CisgIHJldHVybiBzZXRTeW1ib2xEZXNjcmlwdG9yKE8sIGtleSwgQXR0cmlidXRlcyk7CisgfQorIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBrZXksIEF0dHJpYnV0ZXMpOworfTsKK3ZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykgeworIGFuT2JqZWN0KE8pOworIHZhciBwcm9wZXJ0aWVzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpOworIHZhciBrZXlzID0gb2JqZWN0S2V5cyhwcm9wZXJ0aWVzKS5jb25jYXQoJGdldE93blByb3BlcnR5U3ltYm9scyhwcm9wZXJ0aWVzKSk7CisgJGZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkgeworICBpZiAoIURFU0NSSVBUT1JTIHx8ICRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHByb3BlcnRpZXMsIGtleSkpCisgICAkZGVmaW5lUHJvcGVydHkoTywga2V5LCBwcm9wZXJ0aWVzW2tleV0pOworIH0pOworIHJldHVybiBPOworfTsKK3ZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHsKKyByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gbmF0aXZlT2JqZWN0Q3JlYXRlKE8pIDogJGRlZmluZVByb3BlcnRpZXMobmF0aXZlT2JqZWN0Q3JlYXRlKE8pLCBQcm9wZXJ0aWVzKTsKK307Cit2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgeworIHZhciBQID0gdG9QcmltaXRpdmUoViwgdHJ1ZSk7CisgdmFyIGVudW1lcmFibGUgPSBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRoaXMsIFApOworIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIFApICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCkpCisgIHJldHVybiBmYWxzZTsKKyByZXR1cm4gZW51bWVyYWJsZSB8fCAhaGFzKHRoaXMsIFApIHx8ICFoYXMoQWxsU3ltYm9scywgUCkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW1BdID8gZW51bWVyYWJsZSA6IHRydWU7Cit9OwordmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkgeworIHZhciBpdCA9IHRvSW5kZXhlZE9iamVjdChPKTsKKyB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CisgaWYgKGl0ID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBrZXkpKQorICByZXR1cm47CisgdmFyIGRlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7CisgaWYgKGRlc2NyaXB0b3IgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgeworICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlOworIH0KKyByZXR1cm4gZGVzY3JpcHRvcjsKK307Cit2YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHsKKyB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChPKSk7CisgdmFyIHJlc3VsdCA9IFtdOworICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7CisgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhoaWRkZW5LZXlzLCBrZXkpKQorICAgcmVzdWx0LnB1c2goa2V5KTsKKyB9KTsKKyByZXR1cm4gcmVzdWx0OworfTsKK3ZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pIHsKKyB2YXIgSVNfT0JKRUNUX1BST1RPVFlQRSA9IE8gPT09IE9iamVjdFByb3RvdHlwZTsKKyB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKElTX09CSkVDVF9QUk9UT1RZUEUgPyBPYmplY3RQcm90b3R5cGVTeW1ib2xzIDogdG9JbmRleGVkT2JqZWN0KE8pKTsKKyB2YXIgcmVzdWx0ID0gW107CisgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHsKKyAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICghSVNfT0JKRUNUX1BST1RPVFlQRSB8fCBoYXMoT2JqZWN0UHJvdG90eXBlLCBrZXkpKSkgeworICAgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTsKKyAgfQorIH0pOworIHJldHVybiByZXN1bHQ7Cit9OworaWYgKCFOQVRJVkVfU1lNQk9MKSB7CisgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHsKKyAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKQorICAgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTsKKyAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTsKKyAgdmFyIHRhZyA9IHVpZChkZXNjcmlwdGlvbik7CisgIHZhciBzZXR0ZXIgPSBmdW5jdGlvbiAodmFsdWUpIHsKKyAgIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUpCisgICAgc2V0dGVyLmNhbGwoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgdmFsdWUpOworICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpCisgICAgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTsKKyAgIHNldFN5bWJvbERlc2NyaXB0b3IodGhpcywgdGFnLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTsKKyAgfTsKKyAgaWYgKERFU0NSSVBUT1JTICYmIFVTRV9TRVRURVIpCisgICBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7CisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIHNldDogc2V0dGVyCisgICB9KTsKKyAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7CisgfTsKKyByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7CisgfSk7CisgcmVkZWZpbmUoJFN5bWJvbCwgJ3dpdGhvdXRTZXR0ZXInLCBmdW5jdGlvbiAoZGVzY3JpcHRpb24pIHsKKyAgcmV0dXJuIHdyYXAodWlkKGRlc2NyaXB0aW9uKSwgZGVzY3JpcHRpb24pOworIH0pOworIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7CisgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0eTsKKyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CisgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lczsKKyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7Cisgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAgcmV0dXJuIHdyYXAod2VsbEtub3duU3ltYm9sKG5hbWUpLCBuYW1lKTsKKyB9OworIGlmIChERVNDUklQVE9SUykgeworICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sICdkZXNjcmlwdGlvbicsIHsKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuZGVzY3JpcHRpb247CisgICB9CisgIH0pOworICBpZiAoIUlTX1BVUkUpIHsKKyAgIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB7IHVuc2FmZTogdHJ1ZSB9KTsKKyAgfQorIH0KK30KKyQoeworIGdsb2JhbDogdHJ1ZSwKKyB3cmFwOiB0cnVlLAorIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsCisgc2hhbTogIU5BVElWRV9TWU1CT0wKK30sIHsgU3ltYm9sOiAkU3ltYm9sIH0pOworJGZvckVhY2gob2JqZWN0S2V5cyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBmdW5jdGlvbiAobmFtZSkgeworIGRlZmluZVdlbGxLbm93blN5bWJvbChuYW1lKTsKK30pOworJCh7CisgdGFyZ2V0OiBTWU1CT0wsCisgc3RhdDogdHJ1ZSwKKyBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MCit9LCB7CisgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHsKKyAgdmFyIHN0cmluZyA9IFN0cmluZyhrZXkpOworICBpZiAoaGFzKFN0cmluZ1RvU3ltYm9sUmVnaXN0cnksIHN0cmluZykpCisgICByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddOworICB2YXIgc3ltYm9sID0gJFN5bWJvbChzdHJpbmcpOworICBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5W3N0cmluZ10gPSBzeW1ib2w7CisgIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltYm9sXSA9IHN0cmluZzsKKyAgcmV0dXJuIHN5bWJvbDsKKyB9LAorIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkgeworICBpZiAoIWlzU3ltYm9sKHN5bSkpCisgICB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2wnKTsKKyAgaWYgKGhhcyhTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5LCBzeW0pKQorICAgcmV0dXJuIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltXTsKKyB9LAorIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeworICBVU0VfU0VUVEVSID0gdHJ1ZTsKKyB9LAorIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeworICBVU0VfU0VUVEVSID0gZmFsc2U7CisgfQorfSk7CiskKHsKKyB0YXJnZXQ6ICdPYmplY3QnLAorIHN0YXQ6IHRydWUsCisgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwKKyBzaGFtOiAhREVTQ1JJUFRPUlMKK30sIHsKKyBjcmVhdGU6ICRjcmVhdGUsCisgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSwKKyBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcywKKyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKK30pOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogIU5BVElWRV9TWU1CT0wKK30sIHsKKyBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcywKKyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMKK30pOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogZmFpbHMoZnVuY3Rpb24gKCkgeworICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZigxKTsKKyB9KQorfSwgeworIGdldE93blByb3BlcnR5U3ltYm9sczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7CisgIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZih0b09iamVjdChpdCkpOworIH0KK30pOworaWYgKCRzdHJpbmdpZnkpIHsKKyB2YXIgRk9SQ0VEX0pTT05fU1RSSU5HSUZZID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkgeworICB2YXIgc3ltYm9sID0gJFN5bWJvbCgpOworICByZXR1cm4gJHN0cmluZ2lmeShbc3ltYm9sXSkgIT0gJ1tudWxsXScgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPSAne30nIHx8ICRzdHJpbmdpZnkoT2JqZWN0KHN5bWJvbCkpICE9ICd7fSc7CisgfSk7CisgJCh7CisgIHRhcmdldDogJ0pTT04nLAorICBzdGF0OiB0cnVlLAorICBmb3JjZWQ6IEZPUkNFRF9KU09OX1NUUklOR0lGWQorIH0sIHsKKyAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkgeworICAgdmFyIGFyZ3MgPSBbaXRdOworICAgdmFyIGluZGV4ID0gMTsKKyAgIHZhciAkcmVwbGFjZXI7CisgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGluZGV4KQorICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaW5kZXgrK10pOworICAgJHJlcGxhY2VyID0gcmVwbGFjZXI7CisgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkKKyAgICByZXR1cm47CisgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKQorICAgIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykKKyAgICAgIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7CisgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKQorICAgICAgcmV0dXJuIHZhbHVlOworICAgIH07CisgICBhcmdzWzFdID0gcmVwbGFjZXI7CisgICByZXR1cm4gJHN0cmluZ2lmeS5hcHBseShudWxsLCBhcmdzKTsKKyAgfQorIH0pOworfQoraWYgKCEkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSkgeworIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpOworfQorc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgU1lNQk9MKTsKK2hpZGRlbktleXNbSElEREVOXSA9IHRydWU7CisKKy8qKiovIH0pLAorLyogMTcxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NCkuZjsKK3ZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nOwordmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107Cit2YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHsKKyB0cnkgeworICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhpdCk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7CisgfQorfTsKK21vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7CisgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTsKK307CisKKy8qKiovIH0pLAorLyogMTcyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK2V4cG9ydHMuZiA9IHdlbGxLbm93blN5bWJvbDsKKworLyoqKi8gfSksCisvKiAxNzMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzIpOwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNykuZjsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHsKKyB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pOworIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpCisgIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwgeyB2YWx1ZTogd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKE5BTUUpIH0pOworfTsKKworLyoqKi8gfSksCisvKiAxNzQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpOworCisvKioqLyB9KSwKKy8qIDE3NSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNykuZjsKK3ZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MCk7Cit2YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKK2lmIChERVNDUklQVE9SUyAmJiB0eXBlb2YgTmF0aXZlU3ltYm9sID09ICdmdW5jdGlvbicgJiYgKCEoJ2Rlc2NyaXB0aW9uJyBpbiBOYXRpdmVTeW1ib2wucHJvdG90eXBlKSB8fCBOYXRpdmVTeW1ib2woKS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSkgeworIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTsKKyB2YXIgU3ltYm9sV3JhcHBlciA9IGZ1bmN0aW9uIFN5bWJvbCgpIHsKKyAgdmFyIGRlc2NyaXB0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTsKKyAgdmFyIHJlc3VsdCA9IHRoaXMgaW5zdGFuY2VvZiBTeW1ib2xXcmFwcGVyID8gbmV3IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbikgOiBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gTmF0aXZlU3ltYm9sKCkgOiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pOworICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKQorICAgRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlW3Jlc3VsdF0gPSB0cnVlOworICByZXR1cm4gcmVzdWx0OworIH07CisgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhTeW1ib2xXcmFwcGVyLCBOYXRpdmVTeW1ib2wpOworIHZhciBzeW1ib2xQcm90b3R5cGUgPSBTeW1ib2xXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZVN5bWJvbC5wcm90b3R5cGU7Cisgc3ltYm9sUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ltYm9sV3JhcHBlcjsKKyB2YXIgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90b3R5cGUudG9TdHJpbmc7CisgdmFyIG5hdGl2ZSA9IFN0cmluZyhOYXRpdmVTeW1ib2woJ3Rlc3QnKSkgPT0gJ1N5bWJvbCh0ZXN0KSc7CisgdmFyIHJlZ2V4cCA9IC9eU3ltYm9sXCgoLiopXClbXildKyQvOworIGRlZmluZVByb3BlcnR5KHN5bWJvbFByb3RvdHlwZSwgJ2Rlc2NyaXB0aW9uJywgeworICBjb25maWd1cmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7CisgICB2YXIgc3ltYm9sID0gaXNPYmplY3QodGhpcykgPyB0aGlzLnZhbHVlT2YoKSA6IHRoaXM7CisgICB2YXIgc3RyaW5nID0gc3ltYm9sVG9TdHJpbmcuY2FsbChzeW1ib2wpOworICAgaWYgKGhhcyhFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUsIHN5bWJvbCkpCisgICAgcmV0dXJuICcnOworICAgdmFyIGRlc2MgPSBuYXRpdmUgPyBzdHJpbmcuc2xpY2UoNywgLTEpIDogc3RyaW5nLnJlcGxhY2UocmVnZXhwLCAnJDEnKTsKKyAgIHJldHVybiBkZXNjID09PSAnJyA/IHVuZGVmaW5lZCA6IGRlc2M7CisgIH0KKyB9KTsKKyAkKHsKKyAgZ2xvYmFsOiB0cnVlLAorICBmb3JjZWQ6IHRydWUKKyB9LCB7IFN5bWJvbDogU3ltYm9sV3JhcHBlciB9KTsKK30KKworLyoqKi8gfSksCisvKiAxNzYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTsKKworLyoqKi8gfSksCisvKiAxNzcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7CisKKy8qKiovIH0pLAorLyogMTc4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CisKKy8qKiovIH0pLAorLyogMTc5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoJyk7CisKKy8qKiovIH0pLAorLyogMTgwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoQWxsJyk7CisKKy8qKiovIH0pLAorLyogMTgxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTsKKworLyoqKi8gfSksCisvKiAxODIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnc2VhcmNoJyk7CisKKy8qKiovIH0pLAorLyogMTgzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKKworLyoqKi8gfSksCisvKiAxODQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnc3BsaXQnKTsKKworLyoqKi8gfSksCisvKiAxODUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTsKKworLyoqKi8gfSksCisvKiAxODYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKKworLyoqKi8gfSksCisvKiAxODcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTsKKworLyoqKi8gfSksCisvKiAxODggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7CitzZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpOworCisvKioqLyB9KSwKKy8qIDE4OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg1KTsKK3NldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpOworCisvKioqLyB9KSwKKy8qIDE5MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDE5MSk7Cit2YXIgZW50cnlVbmJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYxKTsKK21vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdwYWRTdGFydCcpOworCisvKioqLyB9KSwKKy8qIDE5MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgJHBhZFN0YXJ0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTIpLnN0YXJ0OwordmFyIFdFQktJVF9CVUcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5NCk7CiskKHsKKyB0YXJnZXQ6ICdTdHJpbmcnLAorIHByb3RvOiB0cnVlLAorIGZvcmNlZDogV0VCS0lUX0JVRworfSwgeworIHBhZFN0YXJ0OiBmdW5jdGlvbiBwYWRTdGFydChtYXhMZW5ndGgpIHsKKyAgcmV0dXJuICRwYWRTdGFydCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxOTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nyk7Cit2YXIgcmVwZWF0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTMpOwordmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwKTsKK3ZhciBjZWlsID0gTWF0aC5jZWlsOwordmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19FTkQpIHsKKyByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHsKKyAgdmFyIFMgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpOworICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7CisgIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpOworICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTsKKyAgdmFyIGZpbGxMZW4sIHN0cmluZ0ZpbGxlcjsKKyAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykKKyAgIHJldHVybiBTOworICBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoOworICBzdHJpbmdGaWxsZXIgPSByZXBlYXQuY2FsbChmaWxsU3RyLCBjZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpOworICBpZiAoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pCisgICBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7CisgIHJldHVybiBJU19FTkQgPyBTICsgc3RyaW5nRmlsbGVyIDogc3RyaW5nRmlsbGVyICsgUzsKKyB9OworfTsKK21vZHVsZS5leHBvcnRzID0geworIHN0YXJ0OiBjcmVhdGVNZXRob2QoZmFsc2UpLAorIGVuZDogY3JlYXRlTWV0aG9kKHRydWUpCit9OworCisvKioqLyB9KSwKKy8qIDE5MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciB0b0ludGVnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ4KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7Cittb2R1bGUuZXhwb3J0cyA9ICcnLnJlcGVhdCB8fCBmdW5jdGlvbiByZXBlYXQoY291bnQpIHsKKyB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpOworIHZhciByZXN1bHQgPSAnJzsKKyB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7CisgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpCisgIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpOworIGZvciAoOyBuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpCisgIGlmIChuICYgMSkKKyAgIHJlc3VsdCArPSBzdHI7CisgcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKiovIH0pLAorLyogMTk0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB1c2VyQWdlbnQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyOSk7Cittb2R1bGUuZXhwb3J0cyA9IC9WZXJzaW9uXC8xMFwuXGQrKFwuXGQrKT8oIE1vYmlsZVwvXHcrKT8gU2FmYXJpXC8vLnRlc3QodXNlckFnZW50KTsKKworLyoqKi8gfSksCisvKiAxOTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxOTYpOwordmFyIGVudHJ5VW5iaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2MSk7Cittb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAncGFkRW5kJyk7CisKKy8qKiovIH0pLAorLyogMTk2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciAkcGFkRW5kID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTIpLmVuZDsKK3ZhciBXRUJLSVRfQlVHID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTQpOworJCh7CisgdGFyZ2V0OiAnU3RyaW5nJywKKyBwcm90bzogdHJ1ZSwKKyBmb3JjZWQ6IFdFQktJVF9CVUcKK30sIHsKKyBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGgpIHsKKyAgcmV0dXJuICRwYWRFbmQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTk3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTk4KTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LnZhbHVlczsKKworLyoqKi8gfSksCisvKiAxOTggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciAkdmFsdWVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTkpLnZhbHVlczsKKyQoeworIHRhcmdldDogJ09iamVjdCcsCisgc3RhdDogdHJ1ZQorfSwgeworIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKE8pIHsKKyAgcmV0dXJuICR2YWx1ZXMoTyk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTk5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIG9iamVjdEtleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDczKTsKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTUpLmY7Cit2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRPX0VOVFJJRVMpIHsKKyByZXR1cm4gZnVuY3Rpb24gKGl0KSB7CisgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTsKKyAgdmFyIGtleXMgPSBvYmplY3RLZXlzKE8pOworICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7CisgIHZhciBpID0gMDsKKyAgdmFyIHJlc3VsdCA9IFtdOworICB2YXIga2V5OworICB3aGlsZSAobGVuZ3RoID4gaSkgeworICAga2V5ID0ga2V5c1tpKytdOworICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKE8sIGtleSkpIHsKKyAgICByZXN1bHQucHVzaChUT19FTlRSSUVTID8gWworICAgICBrZXksCisgICAgIE9ba2V5XQorICAgIF0gOiBPW2tleV0pOworICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7CisgfTsKK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBlbnRyaWVzOiBjcmVhdGVNZXRob2QodHJ1ZSksCisgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpCit9OworCisvKioqLyB9KSwKKy8qIDIwMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDIwMSk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzOworCisvKioqLyB9KSwKKy8qIDIwMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyICRlbnRyaWVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTkpLmVudHJpZXM7CiskKHsKKyB0YXJnZXQ6ICdPYmplY3QnLAorIHN0YXQ6IHRydWUKK30sIHsKKyBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHsKKyAgcmV0dXJuICRlbnRyaWVzKE8pOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDIwMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldERvY3VtZW50ID0gZ2V0RG9jdW1lbnQ7CitleHBvcnRzLnNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5ID0gc2V0UERGTmV0d29ya1N0cmVhbUZhY3Rvcnk7CitleHBvcnRzLmJ1aWxkID0gZXhwb3J0cy52ZXJzaW9uID0gZXhwb3J0cy5QREZQYWdlUHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50UHJveHkgPSBleHBvcnRzLlBERldvcmtlciA9IGV4cG9ydHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0ID0gZXhwb3J0cy5Mb29wYmFja1BvcnQgPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oMikpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCit2YXIgX2ZvbnRfbG9hZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDMpOworCit2YXIgX25vZGVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNCk7CisKK3ZhciBfYW5ub3RhdGlvbl9zdG9yYWdlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDUpOworCit2YXIgX2FwaV9jb21wYXRpYmlsaXR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDYpOworCit2YXIgX2NhbnZhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA3KTsKKwordmFyIF93b3JrZXJfb3B0aW9ucyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA5KTsKKwordmFyIF9pc19ub2RlID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKKwordmFyIF9tZXNzYWdlX2hhbmRsZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxMCk7CisKK3ZhciBfbWV0YWRhdGEgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxMSk7CisKK3ZhciBfb3B0aW9uYWxfY29udGVudF9jb25maWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxMyk7CisKK3ZhciBfdHJhbnNwb3J0X3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjE0KTsKKwordmFyIF93ZWJnbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjE1KTsKKworZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH0KKworZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfQorCitmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9CisKK2Z1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH0KKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IHRocm93IF9lMjsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTMpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UzOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCitmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfQorCitmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9CisKK2Z1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCitmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbInJldHVybiJdICE9IG51bGwpIF9pWyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0KKworZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCit2YXIgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFID0gNjU1MzY7Cit2YXIgUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUID0gMTAwOwordmFyIERlZmF1bHRDYW52YXNGYWN0b3J5ID0gX2lzX25vZGUuaXNOb2RlSlMgPyBfbm9kZV91dGlscy5Ob2RlQ2FudmFzRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzLkRPTUNhbnZhc0ZhY3Rvcnk7Cit2YXIgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gX2lzX25vZGUuaXNOb2RlSlMgPyBfbm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeTsKK3ZhciBjcmVhdGVQREZOZXR3b3JrU3RyZWFtOworCitmdW5jdGlvbiBzZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeShwZGZOZXR3b3JrU3RyZWFtRmFjdG9yeSkgeworICBjcmVhdGVQREZOZXR3b3JrU3RyZWFtID0gcGRmTmV0d29ya1N0cmVhbUZhY3Rvcnk7Cit9CisKK2Z1bmN0aW9uIGdldERvY3VtZW50KHNyYykgeworICB2YXIgdGFzayA9IG5ldyBQREZEb2N1bWVudExvYWRpbmdUYXNrKCk7CisgIHZhciBzb3VyY2U7CisKKyAgaWYgKHR5cGVvZiBzcmMgPT09ICJzdHJpbmciKSB7CisgICAgc291cmNlID0geworICAgICAgdXJsOiBzcmMKKyAgICB9OworICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShzcmMpKSB7CisgICAgc291cmNlID0geworICAgICAgZGF0YTogc3JjCisgICAgfTsKKyAgfSBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQpIHsKKyAgICBzb3VyY2UgPSB7CisgICAgICByYW5nZTogc3JjCisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoX3R5cGVvZihzcmMpICE9PSAib2JqZWN0IikgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciBpbiBnZXREb2N1bWVudCwgIiArICJuZWVkIGVpdGhlciBVaW50OEFycmF5LCBzdHJpbmcgb3IgYSBwYXJhbWV0ZXIgb2JqZWN0Iik7CisgICAgfQorCisgICAgaWYgKCFzcmMudXJsICYmICFzcmMuZGF0YSAmJiAhc3JjLnJhbmdlKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcGFyYW1ldGVyIG9iamVjdDogbmVlZCBlaXRoZXIgLmRhdGEsIC5yYW5nZSBvciAudXJsIik7CisgICAgfQorCisgICAgc291cmNlID0gc3JjOworICB9CisKKyAgdmFyIHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIHZhciByYW5nZVRyYW5zcG9ydCA9IG51bGwsCisgICAgICB3b3JrZXIgPSBudWxsOworCisgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsKKyAgICBpZiAoa2V5ID09PSAidXJsIiAmJiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIikgeworICAgICAgcGFyYW1zW2tleV0gPSBuZXcgVVJMKHNvdXJjZVtrZXldLCB3aW5kb3cubG9jYXRpb24pLmhyZWY7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PT0gInJhbmdlIikgeworICAgICAgcmFuZ2VUcmFuc3BvcnQgPSBzb3VyY2Vba2V5XTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSBpZiAoa2V5ID09PSAid29ya2VyIikgeworICAgICAgd29ya2VyID0gc291cmNlW2tleV07CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PT0gImRhdGEiICYmICEoc291cmNlW2tleV0gaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgeworICAgICAgdmFyIHBkZkJ5dGVzID0gc291cmNlW2tleV07CisKKyAgICAgIGlmICh0eXBlb2YgcGRmQnl0ZXMgPT09ICJzdHJpbmciKSB7CisgICAgICAgIHBhcmFtc1trZXldID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHBkZkJ5dGVzKTsKKyAgICAgIH0gZWxzZSBpZiAoX3R5cGVvZihwZGZCeXRlcykgPT09ICJvYmplY3QiICYmIHBkZkJ5dGVzICE9PSBudWxsICYmICFpc05hTihwZGZCeXRlcy5sZW5ndGgpKSB7CisgICAgICAgIHBhcmFtc1trZXldID0gbmV3IFVpbnQ4QXJyYXkocGRmQnl0ZXMpOworICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNBcnJheUJ1ZmZlcikocGRmQnl0ZXMpKSB7CisgICAgICAgIHBhcmFtc1trZXldID0gbmV3IFVpbnQ4QXJyYXkocGRmQnl0ZXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFBERiBiaW5hcnkgZGF0YTogZWl0aGVyIHR5cGVkIGFycmF5LCAiICsgInN0cmluZyBvciBhcnJheS1saWtlIG9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgIiArICJkYXRhIHByb3BlcnR5LiIpOworICAgICAgfQorCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBwYXJhbXNba2V5XSA9IHNvdXJjZVtrZXldOworICB9CisKKyAgcGFyYW1zLnJhbmdlQ2h1bmtTaXplID0gcGFyYW1zLnJhbmdlQ2h1bmtTaXplIHx8IERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRTsKKyAgcGFyYW1zLkNNYXBSZWFkZXJGYWN0b3J5ID0gcGFyYW1zLkNNYXBSZWFkZXJGYWN0b3J5IHx8IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeTsKKyAgcGFyYW1zLmlnbm9yZUVycm9ycyA9IHBhcmFtcy5zdG9wQXRFcnJvcnMgIT09IHRydWU7CisgIHBhcmFtcy5mb250RXh0cmFQcm9wZXJ0aWVzID0gcGFyYW1zLmZvbnRFeHRyYVByb3BlcnRpZXMgPT09IHRydWU7CisgIHBhcmFtcy5wZGZCdWcgPSBwYXJhbXMucGRmQnVnID09PSB0cnVlOworCisgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJhbXMubWF4SW1hZ2VTaXplKSkgeworICAgIHBhcmFtcy5tYXhJbWFnZVNpemUgPSAtMTsKKyAgfQorCisgIGlmICh0eXBlb2YgcGFyYW1zLmlzRXZhbFN1cHBvcnRlZCAhPT0gImJvb2xlYW4iKSB7CisgICAgcGFyYW1zLmlzRXZhbFN1cHBvcnRlZCA9IHRydWU7CisgIH0KKworICBpZiAodHlwZW9mIHBhcmFtcy5kaXNhYmxlRm9udEZhY2UgIT09ICJib29sZWFuIikgeworICAgIHBhcmFtcy5kaXNhYmxlRm9udEZhY2UgPSBfYXBpX2NvbXBhdGliaWxpdHkuYXBpQ29tcGF0aWJpbGl0eVBhcmFtcy5kaXNhYmxlRm9udEZhY2UgfHwgZmFsc2U7CisgIH0KKworICBpZiAodHlwZW9mIHBhcmFtcy5vd25lckRvY3VtZW50ID09PSAidW5kZWZpbmVkIikgeworICAgIHBhcmFtcy5vd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudDsKKyAgfQorCisgIGlmICh0eXBlb2YgcGFyYW1zLmRpc2FibGVSYW5nZSAhPT0gImJvb2xlYW4iKSB7CisgICAgcGFyYW1zLmRpc2FibGVSYW5nZSA9IGZhbHNlOworICB9CisKKyAgaWYgKHR5cGVvZiBwYXJhbXMuZGlzYWJsZVN0cmVhbSAhPT0gImJvb2xlYW4iKSB7CisgICAgcGFyYW1zLmRpc2FibGVTdHJlYW0gPSBmYWxzZTsKKyAgfQorCisgIGlmICh0eXBlb2YgcGFyYW1zLmRpc2FibGVBdXRvRmV0Y2ggIT09ICJib29sZWFuIikgeworICAgIHBhcmFtcy5kaXNhYmxlQXV0b0ZldGNoID0gZmFsc2U7CisgIH0KKworICAoMCwgX3V0aWwuc2V0VmVyYm9zaXR5TGV2ZWwpKHBhcmFtcy52ZXJib3NpdHkpOworCisgIGlmICghd29ya2VyKSB7CisgICAgdmFyIHdvcmtlclBhcmFtcyA9IHsKKyAgICAgIHZlcmJvc2l0eTogcGFyYW1zLnZlcmJvc2l0eSwKKyAgICAgIHBvcnQ6IF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnQKKyAgICB9OworICAgIHdvcmtlciA9IHdvcmtlclBhcmFtcy5wb3J0ID8gUERGV29ya2VyLmZyb21Qb3J0KHdvcmtlclBhcmFtcykgOiBuZXcgUERGV29ya2VyKHdvcmtlclBhcmFtcyk7CisgICAgdGFzay5fd29ya2VyID0gd29ya2VyOworICB9CisKKyAgdmFyIGRvY0lkID0gdGFzay5kb2NJZDsKKyAgd29ya2VyLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgaWYgKHRhc2suZGVzdHJveWVkKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkxvYWRpbmcgYWJvcnRlZCIpOworICAgIH0KKworICAgIHZhciB3b3JrZXJJZFByb21pc2UgPSBfZmV0Y2hEb2N1bWVudCh3b3JrZXIsIHBhcmFtcywgcmFuZ2VUcmFuc3BvcnQsIGRvY0lkKTsKKworICAgIHZhciBuZXR3b3JrU3RyZWFtUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICB2YXIgbmV0d29ya1N0cmVhbTsKKworICAgICAgaWYgKHJhbmdlVHJhbnNwb3J0KSB7CisgICAgICAgIG5ldHdvcmtTdHJlYW0gPSBuZXcgX3RyYW5zcG9ydF9zdHJlYW0uUERGRGF0YVRyYW5zcG9ydFN0cmVhbSh7CisgICAgICAgICAgbGVuZ3RoOiBwYXJhbXMubGVuZ3RoLAorICAgICAgICAgIGluaXRpYWxEYXRhOiBwYXJhbXMuaW5pdGlhbERhdGEsCisgICAgICAgICAgcHJvZ3Jlc3NpdmVEb25lOiBwYXJhbXMucHJvZ3Jlc3NpdmVEb25lLAorICAgICAgICAgIGRpc2FibGVSYW5nZTogcGFyYW1zLmRpc2FibGVSYW5nZSwKKyAgICAgICAgICBkaXNhYmxlU3RyZWFtOiBwYXJhbXMuZGlzYWJsZVN0cmVhbQorICAgICAgICB9LCByYW5nZVRyYW5zcG9ydCk7CisgICAgICB9IGVsc2UgaWYgKCFwYXJhbXMuZGF0YSkgeworICAgICAgICBuZXR3b3JrU3RyZWFtID0gY3JlYXRlUERGTmV0d29ya1N0cmVhbSh7CisgICAgICAgICAgdXJsOiBwYXJhbXMudXJsLAorICAgICAgICAgIGxlbmd0aDogcGFyYW1zLmxlbmd0aCwKKyAgICAgICAgICBodHRwSGVhZGVyczogcGFyYW1zLmh0dHBIZWFkZXJzLAorICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogcGFyYW1zLndpdGhDcmVkZW50aWFscywKKyAgICAgICAgICByYW5nZUNodW5rU2l6ZTogcGFyYW1zLnJhbmdlQ2h1bmtTaXplLAorICAgICAgICAgIGRpc2FibGVSYW5nZTogcGFyYW1zLmRpc2FibGVSYW5nZSwKKyAgICAgICAgICBkaXNhYmxlU3RyZWFtOiBwYXJhbXMuZGlzYWJsZVN0cmVhbQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmVzb2x2ZShuZXR3b3JrU3RyZWFtKTsKKyAgICB9KTsKKyAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3dvcmtlcklkUHJvbWlzZSwgbmV0d29ya1N0cmVhbVByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChfcmVmKSB7CisgICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSwKKyAgICAgICAgICB3b3JrZXJJZCA9IF9yZWYyWzBdLAorICAgICAgICAgIG5ldHdvcmtTdHJlYW0gPSBfcmVmMlsxXTsKKworICAgICAgaWYgKHRhc2suZGVzdHJveWVkKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiTG9hZGluZyBhYm9ydGVkIik7CisgICAgICB9CisKKyAgICAgIHZhciBtZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKGRvY0lkLCB3b3JrZXJJZCwgd29ya2VyLnBvcnQpOworICAgICAgbWVzc2FnZUhhbmRsZXIucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSB3b3JrZXIucG9zdE1lc3NhZ2VUcmFuc2ZlcnM7CisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFdvcmtlclRyYW5zcG9ydChtZXNzYWdlSGFuZGxlciwgdGFzaywgbmV0d29ya1N0cmVhbSwgcGFyYW1zKTsKKyAgICAgIHRhc2suX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoIlJlYWR5IiwgbnVsbCk7CisgICAgfSk7CisgIH0pWyJjYXRjaCJdKHRhc2suX2NhcGFiaWxpdHkucmVqZWN0KTsKKyAgcmV0dXJuIHRhc2s7Cit9CisKK2Z1bmN0aW9uIF9mZXRjaERvY3VtZW50KHdvcmtlciwgc291cmNlLCBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQsIGRvY0lkKSB7CisgIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7CisgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKSk7CisgIH0KKworICBpZiAocGRmRGF0YVJhbmdlVHJhbnNwb3J0KSB7CisgICAgc291cmNlLmxlbmd0aCA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5sZW5ndGg7CisgICAgc291cmNlLmluaXRpYWxEYXRhID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmluaXRpYWxEYXRhOworICAgIHNvdXJjZS5wcm9ncmVzc2l2ZURvbmUgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQucHJvZ3Jlc3NpdmVEb25lOworICB9CisKKyAgcmV0dXJuIHdvcmtlci5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERvY1JlcXVlc3QiLCB7CisgICAgZG9jSWQ6IGRvY0lkLAorICAgIGFwaVZlcnNpb246ICcyLjYuMzQ3JywKKyAgICBzb3VyY2U6IHsKKyAgICAgIGRhdGE6IHNvdXJjZS5kYXRhLAorICAgICAgdXJsOiBzb3VyY2UudXJsLAorICAgICAgcGFzc3dvcmQ6IHNvdXJjZS5wYXNzd29yZCwKKyAgICAgIGRpc2FibGVBdXRvRmV0Y2g6IHNvdXJjZS5kaXNhYmxlQXV0b0ZldGNoLAorICAgICAgcmFuZ2VDaHVua1NpemU6IHNvdXJjZS5yYW5nZUNodW5rU2l6ZSwKKyAgICAgIGxlbmd0aDogc291cmNlLmxlbmd0aAorICAgIH0sCisgICAgbWF4SW1hZ2VTaXplOiBzb3VyY2UubWF4SW1hZ2VTaXplLAorICAgIGRpc2FibGVGb250RmFjZTogc291cmNlLmRpc2FibGVGb250RmFjZSwKKyAgICBwb3N0TWVzc2FnZVRyYW5zZmVyczogd29ya2VyLnBvc3RNZXNzYWdlVHJhbnNmZXJzLAorICAgIGRvY0Jhc2VVcmw6IHNvdXJjZS5kb2NCYXNlVXJsLAorICAgIGlnbm9yZUVycm9yczogc291cmNlLmlnbm9yZUVycm9ycywKKyAgICBpc0V2YWxTdXBwb3J0ZWQ6IHNvdXJjZS5pc0V2YWxTdXBwb3J0ZWQsCisgICAgZm9udEV4dHJhUHJvcGVydGllczogc291cmNlLmZvbnRFeHRyYVByb3BlcnRpZXMKKyAgfSkudGhlbihmdW5jdGlvbiAod29ya2VySWQpIHsKKyAgICBpZiAod29ya2VyLmRlc3Ryb3llZCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpOworICAgIH0KKworICAgIHJldHVybiB3b3JrZXJJZDsKKyAgfSk7Cit9CisKK3ZhciBQREZEb2N1bWVudExvYWRpbmdUYXNrID0gZnVuY3Rpb24gUERGRG9jdW1lbnRMb2FkaW5nVGFza0Nsb3N1cmUoKSB7CisgIHZhciBuZXh0RG9jdW1lbnRJZCA9IDA7CisKKyAgdmFyIFBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICAgIGZ1bmN0aW9uIFBERkRvY3VtZW50TG9hZGluZ1Rhc2soKSB7CisgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGRG9jdW1lbnRMb2FkaW5nVGFzayk7CisKKyAgICAgIHRoaXMuX2NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsOworICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDsKKyAgICAgIHRoaXMuZG9jSWQgPSAiZCIgKyBuZXh0RG9jdW1lbnRJZCsrOworICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMub25QYXNzd29yZCA9IG51bGw7CisgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICAgICAgdGhpcy5vblVuc3VwcG9ydGVkRmVhdHVyZSA9IG51bGw7CisgICAgfQorCisgICAgX2NyZWF0ZUNsYXNzKFBERkRvY3VtZW50TG9hZGluZ1Rhc2ssIFt7CisgICAgICBrZXk6ICJkZXN0cm95IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkgeworICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKKyAgICAgICAgdmFyIHRyYW5zcG9ydERlc3Ryb3llZCA9ICF0aGlzLl90cmFuc3BvcnQgPyBQcm9taXNlLnJlc29sdmUoKSA6IHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95KCk7CisgICAgICAgIHJldHVybiB0cmFuc3BvcnREZXN0cm95ZWQudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgX3RoaXMuX3RyYW5zcG9ydCA9IG51bGw7CisKKyAgICAgICAgICBpZiAoX3RoaXMuX3dvcmtlcikgeworICAgICAgICAgICAgX3RoaXMuX3dvcmtlci5kZXN0cm95KCk7CisKKyAgICAgICAgICAgIF90aGlzLl93b3JrZXIgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAicHJvbWlzZSIsCisgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gUERGRG9jdW1lbnRMb2FkaW5nVGFzazsKKyAgfSgpOworCisgIHJldHVybiBQREZEb2N1bWVudExvYWRpbmdUYXNrOworfSgpOworCit2YXIgUERGRGF0YVJhbmdlVHJhbnNwb3J0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGRGF0YVJhbmdlVHJhbnNwb3J0KGxlbmd0aCwgaW5pdGlhbERhdGEpIHsKKyAgICB2YXIgcHJvZ3Jlc3NpdmVEb25lID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZEYXRhUmFuZ2VUcmFuc3BvcnQpOworCisgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgdGhpcy5pbml0aWFsRGF0YSA9IGluaXRpYWxEYXRhOworICAgIHRoaXMucHJvZ3Jlc3NpdmVEb25lID0gcHJvZ3Jlc3NpdmVEb25lOworICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107CisgICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXTsKKyAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTsKKyAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTsKKyAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGRGF0YVJhbmdlVHJhbnNwb3J0LCBbeworICAgIGtleTogImFkZFJhbmdlTGlzdGVuZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSB7CisgICAgICB0aGlzLl9yYW5nZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJhZGRQcm9ncmVzc0xpc3RlbmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUHJvZ3Jlc3NMaXN0ZW5lcihsaXN0ZW5lcikgeworICAgICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihsaXN0ZW5lcikgeworICAgICAgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIobGlzdGVuZXIpIHsKKyAgICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvbkRhdGFSYW5nZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRGF0YVJhbmdlKGJlZ2luLCBjaHVuaykgeworICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX3JhbmdlTGlzdGVuZXJzKSwKKyAgICAgICAgICBfc3RlcDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBfc3RlcC52YWx1ZTsKKyAgICAgICAgICBsaXN0ZW5lcihiZWdpbiwgY2h1bmspOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvci5mKCk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAib25EYXRhUHJvZ3Jlc3MiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRhdGFQcm9ncmVzcyhsb2FkZWQsIHRvdGFsKSB7CisgICAgICB2YXIgX3RoaXMyID0gdGhpczsKKworICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoX3RoaXMyLl9wcm9ncmVzc0xpc3RlbmVycyksCisgICAgICAgICAgICBfc3RlcDI7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykgeworICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gX3N0ZXAyLnZhbHVlOworICAgICAgICAgICAgbGlzdGVuZXIobG9hZGVkLCB0b3RhbCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3IyLmYoKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAib25EYXRhUHJvZ3Jlc3NpdmVSZWFkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25EYXRhUHJvZ3Jlc3NpdmVSZWFkKGNodW5rKSB7CisgICAgICB2YXIgX3RoaXMzID0gdGhpczsKKworICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoX3RoaXMzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMpLAorICAgICAgICAgICAgX3N0ZXAzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IF9zdGVwMy52YWx1ZTsKKyAgICAgICAgICAgIGxpc3RlbmVyKGNodW5rKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIF9pdGVyYXRvcjMuZShlcnIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIF9pdGVyYXRvcjMuZigpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvbkRhdGFQcm9ncmVzc2l2ZURvbmUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7CisgICAgICB2YXIgX3RoaXM0ID0gdGhpczsKKworICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoX3RoaXM0Ll9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMpLAorICAgICAgICAgICAgX3N0ZXA0OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IF9zdGVwNC52YWx1ZTsKKyAgICAgICAgICAgIGxpc3RlbmVyKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3I0LmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3I0LmYoKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAidHJhbnNwb3J0UmVhZHkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB0cmFuc3BvcnRSZWFkeSgpIHsKKyAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVxdWVzdERhdGFSYW5nZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlcXVlc3REYXRhUmFuZ2UoYmVnaW4sIGVuZCkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIFBERkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYWJvcnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhYm9ydCgpIHt9CisgIH1dKTsKKworICByZXR1cm4gUERGRGF0YVJhbmdlVHJhbnNwb3J0OworfSgpOworCitleHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydCA9IFBERkRhdGFSYW5nZVRyYW5zcG9ydDsKKwordmFyIFBERkRvY3VtZW50UHJveHkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZEb2N1bWVudFByb3h5KHBkZkluZm8sIHRyYW5zcG9ydCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZEb2N1bWVudFByb3h5KTsKKworICAgIHRoaXMuX3BkZkluZm8gPSBwZGZJbmZvOworICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQREZEb2N1bWVudFByb3h5LCBbeworICAgIGtleTogImdldFBhZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlKHBhZ2VOdW1iZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZShwYWdlTnVtYmVyKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRQYWdlSW5kZXgiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlSW5kZXgocmVmKSB7CisgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VJbmRleChyZWYpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldERlc3RpbmF0aW9ucyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlc3RpbmF0aW9ucygpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0RGVzdGluYXRpb24iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXN0aW5hdGlvbihpZCkgeworICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbihpZCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UGFnZUxhYmVscyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBhZ2VMYWJlbHMoKSB7CisgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRQYWdlTGF5b3V0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGFnZUxheW91dCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxheW91dCgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFBhZ2VNb2RlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGFnZU1vZGUoKSB7CisgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VNb2RlKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0Vmlld2VyUHJlZmVyZW5jZXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRPcGVuQWN0aW9uIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3BlbkFjdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3BlbkFjdGlvbigpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEF0dGFjaG1lbnRzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QXR0YWNobWVudHMoKSB7CisgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEF0dGFjaG1lbnRzKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0SmF2YVNjcmlwdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEphdmFTY3JpcHQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEphdmFTY3JpcHQoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRPdXRsaW5lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3V0bGluZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UGVybWlzc2lvbnMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQZXJtaXNzaW9ucygpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRNZXRhZGF0YSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1ldGFkYXRhKCkgeworICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNZXRhZGF0YSgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldERhdGEiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREYXRhKCkgeworICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0RG93bmxvYWRJbmZvIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RG93bmxvYWRJbmZvKCkgeworICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0U3RhdHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdGF0cygpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0U3RhdHMoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjbGVhbnVwIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYW51cCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc3RhcnRDbGVhbnVwKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZGVzdHJveSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7CisgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nVGFzay5kZXN0cm95KCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2F2ZURvY3VtZW50IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2F2ZURvY3VtZW50KGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnNhdmVEb2N1bWVudChhbm5vdGF0aW9uU3RvcmFnZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYW5ub3RhdGlvblN0b3JhZ2UiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJhbm5vdGF0aW9uU3RvcmFnZSIsIG5ldyBfYW5ub3RhdGlvbl9zdG9yYWdlLkFubm90YXRpb25TdG9yYWdlKCkpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm51bVBhZ2VzIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLm51bVBhZ2VzOworICAgIH0KKyAgfSwgeworICAgIGtleTogImZpbmdlcnByaW50IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLmZpbmdlcnByaW50OworICAgIH0KKyAgfSwgeworICAgIGtleTogImxvYWRpbmdQYXJhbXMiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zOworICAgIH0KKyAgfSwgeworICAgIGtleTogImxvYWRpbmdUYXNrIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1Rhc2s7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERkRvY3VtZW50UHJveHk7Cit9KCk7CisKK2V4cG9ydHMuUERGRG9jdW1lbnRQcm94eSA9IFBERkRvY3VtZW50UHJveHk7CisKK3ZhciBQREZQYWdlUHJveHkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZQYWdlUHJveHkocGFnZUluZGV4LCBwYWdlSW5mbywgdHJhbnNwb3J0LCBvd25lckRvY3VtZW50KSB7CisgICAgdmFyIHBkZkJ1ZyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogZmFsc2U7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGUGFnZVByb3h5KTsKKworICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDsKKyAgICB0aGlzLl9wYWdlSW5mbyA9IHBhZ2VJbmZvOworICAgIHRoaXMuX293bmVyRG9jdW1lbnQgPSBvd25lckRvY3VtZW50OworICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB0aGlzLl9zdGF0cyA9IHBkZkJ1ZyA/IG5ldyBfZGlzcGxheV91dGlscy5TdGF0VGltZXIoKSA6IG51bGw7CisgICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnOworICAgIHRoaXMuY29tbW9uT2JqcyA9IHRyYW5zcG9ydC5jb21tb25PYmpzOworICAgIHRoaXMub2JqcyA9IG5ldyBQREZPYmplY3RzKCk7CisgICAgdGhpcy5jbGVhbnVwQWZ0ZXJSZW5kZXIgPSBmYWxzZTsKKyAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gZmFsc2U7CisgICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpOworICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGUGFnZVByb3h5LCBbeworICAgIGtleTogImdldFZpZXdwb3J0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Vmlld3BvcnQoKSB7CisgICAgICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LAorICAgICAgICAgIHNjYWxlID0gX3JlZjMuc2NhbGUsCisgICAgICAgICAgX3JlZjMkcm90YXRpb24gPSBfcmVmMy5yb3RhdGlvbiwKKyAgICAgICAgICByb3RhdGlvbiA9IF9yZWYzJHJvdGF0aW9uID09PSB2b2lkIDAgPyB0aGlzLnJvdGF0ZSA6IF9yZWYzJHJvdGF0aW9uLAorICAgICAgICAgIF9yZWYzJG9mZnNldFggPSBfcmVmMy5vZmZzZXRYLAorICAgICAgICAgIG9mZnNldFggPSBfcmVmMyRvZmZzZXRYID09PSB2b2lkIDAgPyAwIDogX3JlZjMkb2Zmc2V0WCwKKyAgICAgICAgICBfcmVmMyRvZmZzZXRZID0gX3JlZjMub2Zmc2V0WSwKKyAgICAgICAgICBvZmZzZXRZID0gX3JlZjMkb2Zmc2V0WSA9PT0gdm9pZCAwID8gMCA6IF9yZWYzJG9mZnNldFksCisgICAgICAgICAgX3JlZjMkZG9udEZsaXAgPSBfcmVmMy5kb250RmxpcCwKKyAgICAgICAgICBkb250RmxpcCA9IF9yZWYzJGRvbnRGbGlwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYzJGRvbnRGbGlwOworCisgICAgICByZXR1cm4gbmV3IF9kaXNwbGF5X3V0aWxzLlBhZ2VWaWV3cG9ydCh7CisgICAgICAgIHZpZXdCb3g6IHRoaXMudmlldywKKyAgICAgICAgc2NhbGU6IHNjYWxlLAorICAgICAgICByb3RhdGlvbjogcm90YXRpb24sCisgICAgICAgIG9mZnNldFg6IG9mZnNldFgsCisgICAgICAgIG9mZnNldFk6IG9mZnNldFksCisgICAgICAgIGRvbnRGbGlwOiBkb250RmxpcAorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0QW5ub3RhdGlvbnMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgIHZhciBfcmVmNCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sCisgICAgICAgICAgX3JlZjQkaW50ZW50ID0gX3JlZjQuaW50ZW50LAorICAgICAgICAgIGludGVudCA9IF9yZWY0JGludGVudCA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY0JGludGVudDsKKworICAgICAgaWYgKCF0aGlzLmFubm90YXRpb25zUHJvbWlzZSB8fCB0aGlzLmFubm90YXRpb25zSW50ZW50ICE9PSBpbnRlbnQpIHsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9uc1Byb21pc2UgPSB0aGlzLl90cmFuc3BvcnQuZ2V0QW5ub3RhdGlvbnModGhpcy5fcGFnZUluZGV4LCBpbnRlbnQpOworICAgICAgICB0aGlzLmFubm90YXRpb25zSW50ZW50ID0gaW50ZW50OworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uc1Byb21pc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKF9yZWY1KSB7CisgICAgICB2YXIgX3RoaXM1ID0gdGhpczsKKworICAgICAgdmFyIGNhbnZhc0NvbnRleHQgPSBfcmVmNS5jYW52YXNDb250ZXh0LAorICAgICAgICAgIHZpZXdwb3J0ID0gX3JlZjUudmlld3BvcnQsCisgICAgICAgICAgX3JlZjUkaW50ZW50ID0gX3JlZjUuaW50ZW50LAorICAgICAgICAgIGludGVudCA9IF9yZWY1JGludGVudCA9PT0gdm9pZCAwID8gImRpc3BsYXkiIDogX3JlZjUkaW50ZW50LAorICAgICAgICAgIF9yZWY1JGVuYWJsZVdlYkdMID0gX3JlZjUuZW5hYmxlV2ViR0wsCisgICAgICAgICAgZW5hYmxlV2ViR0wgPSBfcmVmNSRlbmFibGVXZWJHTCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNSRlbmFibGVXZWJHTCwKKyAgICAgICAgICBfcmVmNSRyZW5kZXJJbnRlcmFjdGkgPSBfcmVmNS5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSBfcmVmNSRyZW5kZXJJbnRlcmFjdGkgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjUkcmVuZGVySW50ZXJhY3RpLAorICAgICAgICAgIF9yZWY1JHRyYW5zZm9ybSA9IF9yZWY1LnRyYW5zZm9ybSwKKyAgICAgICAgICB0cmFuc2Zvcm0gPSBfcmVmNSR0cmFuc2Zvcm0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNSR0cmFuc2Zvcm0sCisgICAgICAgICAgX3JlZjUkaW1hZ2VMYXllciA9IF9yZWY1LmltYWdlTGF5ZXIsCisgICAgICAgICAgaW1hZ2VMYXllciA9IF9yZWY1JGltYWdlTGF5ZXIgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNSRpbWFnZUxheWVyLAorICAgICAgICAgIF9yZWY1JGNhbnZhc0ZhY3RvcnkgPSBfcmVmNS5jYW52YXNGYWN0b3J5LAorICAgICAgICAgIGNhbnZhc0ZhY3RvcnkgPSBfcmVmNSRjYW52YXNGYWN0b3J5ID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjUkY2FudmFzRmFjdG9yeSwKKyAgICAgICAgICBfcmVmNSRiYWNrZ3JvdW5kID0gX3JlZjUuYmFja2dyb3VuZCwKKyAgICAgICAgICBiYWNrZ3JvdW5kID0gX3JlZjUkYmFja2dyb3VuZCA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY1JGJhY2tncm91bmQsCisgICAgICAgICAgX3JlZjUkYW5ub3RhdGlvblN0b3JhID0gX3JlZjUuYW5ub3RhdGlvblN0b3JhZ2UsCisgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2UgPSBfcmVmNSRhbm5vdGF0aW9uU3RvcmEgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNSRhbm5vdGF0aW9uU3RvcmEsCisgICAgICAgICAgX3JlZjUkb3B0aW9uYWxDb250ZW50ID0gX3JlZjUub3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSwKKyAgICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gX3JlZjUkb3B0aW9uYWxDb250ZW50ID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjUkb3B0aW9uYWxDb250ZW50OworCisgICAgICBpZiAodGhpcy5fc3RhdHMpIHsKKyAgICAgICAgdGhpcy5fc3RhdHMudGltZSgiT3ZlcmFsbCIpOworICAgICAgfQorCisgICAgICB2YXIgcmVuZGVyaW5nSW50ZW50ID0gaW50ZW50ID09PSAicHJpbnQiID8gInByaW50IiA6ICJkaXNwbGF5IjsKKyAgICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTsKKworICAgICAgaWYgKCFvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7CisgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7CisgICAgICB9CisKKyAgICAgIHZhciBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQocmVuZGVyaW5nSW50ZW50KTsKKworICAgICAgaWYgKCFpbnRlbnRTdGF0ZSkgeworICAgICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChyZW5kZXJpbmdJbnRlbnQsIGludGVudFN0YXRlKTsKKyAgICAgIH0KKworICAgICAgaWYgKGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpIHsKKyAgICAgICAgY2xlYXJUaW1lb3V0KGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpOworICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIGNhbnZhc0ZhY3RvcnlJbnN0YW5jZSA9IGNhbnZhc0ZhY3RvcnkgfHwgbmV3IERlZmF1bHRDYW52YXNGYWN0b3J5KHsKKyAgICAgICAgb3duZXJEb2N1bWVudDogdGhpcy5fb3duZXJEb2N1bWVudAorICAgICAgfSk7CisgICAgICB2YXIgd2ViR0xDb250ZXh0ID0gbmV3IF93ZWJnbC5XZWJHTENvbnRleHQoeworICAgICAgICBlbmFibGU6IGVuYWJsZVdlYkdMCisgICAgICB9KTsKKworICAgICAgaWYgKCFpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7CisgICAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHsKKyAgICAgICAgICBmbkFycmF5OiBbXSwKKyAgICAgICAgICBhcmdzQXJyYXk6IFtdLAorICAgICAgICAgIGxhc3RDaHVuazogZmFsc2UKKyAgICAgICAgfTsKKworICAgICAgICBpZiAodGhpcy5fc3RhdHMpIHsKKyAgICAgICAgICB0aGlzLl9zdGF0cy50aW1lKCJQYWdlIFJlcXVlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3QoeworICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LAorICAgICAgICAgIGludGVudDogcmVuZGVyaW5nSW50ZW50LAorICAgICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHJlbmRlckludGVyYWN0aXZlRm9ybXMgPT09IHRydWUsCisgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IGFubm90YXRpb25TdG9yYWdlICYmIGFubm90YXRpb25TdG9yYWdlLmdldEFsbCgpIHx8IG51bGwKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKGVycm9yKSB7CisgICAgICAgIHZhciBpID0gaW50ZW50U3RhdGUucmVuZGVyVGFza3MuaW5kZXhPZihpbnRlcm5hbFJlbmRlclRhc2spOworCisgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5zcGxpY2UoaSwgMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3RoaXM1LmNsZWFudXBBZnRlclJlbmRlciB8fCByZW5kZXJpbmdJbnRlbnQgPT09ICJwcmludCIpIHsKKyAgICAgICAgICBfdGhpczUucGVuZGluZ0NsZWFudXAgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgX3RoaXM1Ll90cnlDbGVhbnVwKCk7CisKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucmVqZWN0KGVycm9yKTsKKworICAgICAgICAgIF90aGlzNS5fYWJvcnRPcGVyYXRvckxpc3QoeworICAgICAgICAgICAgaW50ZW50U3RhdGU6IGludGVudFN0YXRlLAorICAgICAgICAgICAgcmVhc29uOiBlcnJvcgorICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfdGhpczUuX3N0YXRzKSB7CisgICAgICAgICAgX3RoaXM1Ll9zdGF0cy50aW1lRW5kKCJSZW5kZXJpbmciKTsKKworICAgICAgICAgIF90aGlzNS5fc3RhdHMudGltZUVuZCgiT3ZlcmFsbCIpOworICAgICAgICB9CisgICAgICB9OworCisgICAgICB2YXIgaW50ZXJuYWxSZW5kZXJUYXNrID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7CisgICAgICAgIGNhbGxiYWNrOiBjb21wbGV0ZSwKKyAgICAgICAgcGFyYW1zOiB7CisgICAgICAgICAgY2FudmFzQ29udGV4dDogY2FudmFzQ29udGV4dCwKKyAgICAgICAgICB2aWV3cG9ydDogdmlld3BvcnQsCisgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sCisgICAgICAgICAgaW1hZ2VMYXllcjogaW1hZ2VMYXllciwKKyAgICAgICAgICBiYWNrZ3JvdW5kOiBiYWNrZ3JvdW5kCisgICAgICAgIH0sCisgICAgICAgIG9ianM6IHRoaXMub2JqcywKKyAgICAgICAgY29tbW9uT2JqczogdGhpcy5jb21tb25PYmpzLAorICAgICAgICBvcGVyYXRvckxpc3Q6IGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCwKKyAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsCisgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IGNhbnZhc0ZhY3RvcnlJbnN0YW5jZSwKKyAgICAgICAgd2ViR0xDb250ZXh0OiB3ZWJHTENvbnRleHQsCisgICAgICAgIHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZTogcmVuZGVyaW5nSW50ZW50ICE9PSAicHJpbnQiLAorICAgICAgICBwZGZCdWc6IHRoaXMuX3BkZkJ1ZworICAgICAgfSk7CisKKyAgICAgIGlmICghaW50ZW50U3RhdGUucmVuZGVyVGFza3MpIHsKKyAgICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MgPSBbXTsKKyAgICAgIH0KKworICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MucHVzaChpbnRlcm5hbFJlbmRlclRhc2spOworICAgICAgdmFyIHJlbmRlclRhc2sgPSBpbnRlcm5hbFJlbmRlclRhc2sudGFzazsKKyAgICAgIFByb21pc2UuYWxsKFtpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2UsIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2VdKS50aGVuKGZ1bmN0aW9uIChfcmVmNikgeworICAgICAgICB2YXIgX3JlZjcgPSBfc2xpY2VkVG9BcnJheShfcmVmNiwgMiksCisgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSBfcmVmN1swXSwKKyAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZyA9IF9yZWY3WzFdOworCisgICAgICAgIGlmIChfdGhpczUucGVuZGluZ0NsZWFudXApIHsKKyAgICAgICAgICBjb21wbGV0ZSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfdGhpczUuX3N0YXRzKSB7CisgICAgICAgICAgX3RoaXM1Ll9zdGF0cy50aW1lKCJSZW5kZXJpbmciKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsUmVuZGVyVGFzay5pbml0aWFsaXplR3JhcGhpY3MoeworICAgICAgICAgIHRyYW5zcGFyZW5jeTogdHJhbnNwYXJlbmN5LAorICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogb3B0aW9uYWxDb250ZW50Q29uZmlnCisgICAgICAgIH0pOworICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCgpOworICAgICAgfSlbImNhdGNoIl0oY29tcGxldGUpOworICAgICAgcmV0dXJuIHJlbmRlclRhc2s7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0T3BlcmF0b3JMaXN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3BlcmF0b3JMaXN0KCkgeworICAgICAgZnVuY3Rpb24gb3BlcmF0b3JMaXN0Q2hhbmdlZCgpIHsKKyAgICAgICAgaWYgKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHsKKyAgICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCk7CisgICAgICAgICAgdmFyIGkgPSBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5pbmRleE9mKG9wTGlzdFRhc2spOworCisgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3Muc3BsaWNlKGksIDEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgcmVuZGVyaW5nSW50ZW50ID0gIm9wbGlzdCI7CisKKyAgICAgIHZhciBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQocmVuZGVyaW5nSW50ZW50KTsKKworICAgICAgaWYgKCFpbnRlbnRTdGF0ZSkgeworICAgICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChyZW5kZXJpbmdJbnRlbnQsIGludGVudFN0YXRlKTsKKyAgICAgIH0KKworICAgICAgdmFyIG9wTGlzdFRhc2s7CisKKyAgICAgIGlmICghaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHsKKyAgICAgICAgb3BMaXN0VGFzayA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgIG9wTGlzdFRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCA9IG9wZXJhdG9yTGlzdENoYW5nZWQ7CisgICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcyA9IFtdOworICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5wdXNoKG9wTGlzdFRhc2spOworICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7CisgICAgICAgICAgZm5BcnJheTogW10sCisgICAgICAgICAgYXJnc0FycmF5OiBbXSwKKyAgICAgICAgICBsYXN0Q2h1bms6IGZhbHNlCisgICAgICAgIH07CisKKyAgICAgICAgaWYgKHRoaXMuX3N0YXRzKSB7CisgICAgICAgICAgdGhpcy5fc3RhdHMudGltZSgiUGFnZSBSZXF1ZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KHsKKyAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCwKKyAgICAgICAgICBpbnRlbnQ6IHJlbmRlcmluZ0ludGVudAorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic3RyZWFtVGV4dENvbnRlbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzdHJlYW1UZXh0Q29udGVudCgpIHsKKyAgICAgIHZhciBfcmVmOCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sCisgICAgICAgICAgX3JlZjgkbm9ybWFsaXplV2hpdGVzID0gX3JlZjgubm9ybWFsaXplV2hpdGVzcGFjZSwKKyAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlID0gX3JlZjgkbm9ybWFsaXplV2hpdGVzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWY4JG5vcm1hbGl6ZVdoaXRlcywKKyAgICAgICAgICBfcmVmOCRkaXNhYmxlQ29tYmluZVQgPSBfcmVmOC5kaXNhYmxlQ29tYmluZVRleHRJdGVtcywKKyAgICAgICAgICBkaXNhYmxlQ29tYmluZVRleHRJdGVtcyA9IF9yZWY4JGRpc2FibGVDb21iaW5lVCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmOCRkaXNhYmxlQ29tYmluZVQ7CisKKyAgICAgIHZhciBURVhUX0NPTlRFTlRfQ0hVTktfU0laRSA9IDEwMDsKKyAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFRleHRDb250ZW50IiwgeworICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCwKKyAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZTogbm9ybWFsaXplV2hpdGVzcGFjZSA9PT0gdHJ1ZSwKKyAgICAgICAgY29tYmluZVRleHRJdGVtczogZGlzYWJsZUNvbWJpbmVUZXh0SXRlbXMgIT09IHRydWUKKyAgICAgIH0sIHsKKyAgICAgICAgaGlnaFdhdGVyTWFyazogVEVYVF9DT05URU5UX0NIVU5LX1NJWkUsCisgICAgICAgIHNpemU6IGZ1bmN0aW9uIHNpemUodGV4dENvbnRlbnQpIHsKKyAgICAgICAgICByZXR1cm4gdGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRUZXh0Q29udGVudCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRleHRDb250ZW50KCkgeworICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307CisgICAgICB2YXIgcmVhZGFibGVTdHJlYW0gPSB0aGlzLnN0cmVhbVRleHRDb250ZW50KHBhcmFtcyk7CisgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgICAgICBmdW5jdGlvbiBwdW1wKCkgeworICAgICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoX3JlZjkpIHsKKyAgICAgICAgICAgIHZhciBfdGV4dENvbnRlbnQkaXRlbXM7CisKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWY5LnZhbHVlLAorICAgICAgICAgICAgICAgIGRvbmUgPSBfcmVmOS5kb25lOworCisgICAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgICByZXNvbHZlKHRleHRDb250ZW50KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRleHRDb250ZW50LnN0eWxlcywgdmFsdWUuc3R5bGVzKTsKKworICAgICAgICAgICAgKF90ZXh0Q29udGVudCRpdGVtcyA9IHRleHRDb250ZW50Lml0ZW1zKS5wdXNoLmFwcGx5KF90ZXh0Q29udGVudCRpdGVtcywgX3RvQ29uc3VtYWJsZUFycmF5KHZhbHVlLml0ZW1zKSk7CisKKyAgICAgICAgICAgIHB1bXAoKTsKKyAgICAgICAgICB9LCByZWplY3QpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOworICAgICAgICB2YXIgdGV4dENvbnRlbnQgPSB7CisgICAgICAgICAgaXRlbXM6IFtdLAorICAgICAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKQorICAgICAgICB9OworICAgICAgICBwdW1wKCk7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfZGVzdHJveSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9kZXN0cm95KCkgeworICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlOworICAgICAgdGhpcy5fdHJhbnNwb3J0LnBhZ2VDYWNoZVt0aGlzLl9wYWdlSW5kZXhdID0gbnVsbDsKKyAgICAgIHZhciB3YWl0T24gPSBbXTsKKworICAgICAgdmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLl9pbnRlbnRTdGF0ZXMpLAorICAgICAgICAgIF9zdGVwNTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3I1LnMoKTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgX3N0ZXA1JHZhbHVlID0gX3NsaWNlZFRvQXJyYXkoX3N0ZXA1LnZhbHVlLCAyKSwKKyAgICAgICAgICAgICAgaW50ZW50ID0gX3N0ZXA1JHZhbHVlWzBdLAorICAgICAgICAgICAgICBpbnRlbnRTdGF0ZSA9IF9zdGVwNSR2YWx1ZVsxXTsKKworICAgICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgICAgIGludGVudFN0YXRlOiBpbnRlbnRTdGF0ZSwKKyAgICAgICAgICAgIHJlYXNvbjogbmV3IEVycm9yKCJQYWdlIHdhcyBkZXN0cm95ZWQuIiksCisgICAgICAgICAgICBmb3JjZTogdHJ1ZQorICAgICAgICAgIH0pOworCisgICAgICAgICAgaWYgKGludGVudCA9PT0gIm9wbGlzdCIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBfaXRlcmF0b3I2ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaW50ZW50U3RhdGUucmVuZGVyVGFza3MpLAorICAgICAgICAgICAgICBfc3RlcDY7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I2LnMoKTsgIShfc3RlcDYgPSBfaXRlcmF0b3I2Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgICAgdmFyIGludGVybmFsUmVuZGVyVGFzayA9IF9zdGVwNi52YWx1ZTsKKyAgICAgICAgICAgICAgd2FpdE9uLnB1c2goaW50ZXJuYWxSZW5kZXJUYXNrLmNvbXBsZXRlZCk7CisgICAgICAgICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgIF9pdGVyYXRvcjYuZShlcnIpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfaXRlcmF0b3I2LmYoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3I1LmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjUuZigpOworICAgICAgfQorCisgICAgICB0aGlzLm9ianMuY2xlYXIoKTsKKyAgICAgIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlID0gbnVsbDsKKyAgICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTsKKyAgICAgIHJldHVybiBQcm9taXNlLmFsbCh3YWl0T24pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNsZWFudXAiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhbnVwKCkgeworICAgICAgdmFyIHJlc2V0U3RhdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlOworICAgICAgdGhpcy5wZW5kaW5nQ2xlYW51cCA9IHRydWU7CisgICAgICByZXR1cm4gdGhpcy5fdHJ5Q2xlYW51cChyZXNldFN0YXRzKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfdHJ5Q2xlYW51cCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF90cnlDbGVhbnVwKCkgeworICAgICAgdmFyIHJlc2V0U3RhdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlOworCisgICAgICBpZiAoIXRoaXMucGVuZGluZ0NsZWFudXApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB2YXIgX2l0ZXJhdG9yNyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSksCisgICAgICAgICAgX3N0ZXA3OworCisgICAgICB0cnkgeworICAgICAgICBmb3IgKF9pdGVyYXRvcjcucygpOyAhKF9zdGVwNyA9IF9pdGVyYXRvcjcubigpKS5kb25lOykgeworICAgICAgICAgIHZhciBfc3RlcDckdmFsdWUgPSBfc3RlcDcudmFsdWUsCisgICAgICAgICAgICAgIHJlbmRlclRhc2tzID0gX3N0ZXA3JHZhbHVlLnJlbmRlclRhc2tzLAorICAgICAgICAgICAgICBvcGVyYXRvckxpc3QgPSBfc3RlcDckdmFsdWUub3BlcmF0b3JMaXN0OworCisgICAgICAgICAgaWYgKHJlbmRlclRhc2tzLmxlbmd0aCAhPT0gMCB8fCAhb3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvcjcuZShlcnIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgX2l0ZXJhdG9yNy5mKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpOworCisgICAgICB0aGlzLm9ianMuY2xlYXIoKTsKKyAgICAgIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlID0gbnVsbDsKKworICAgICAgaWYgKHJlc2V0U3RhdHMgJiYgdGhpcy5fc3RhdHMpIHsKKyAgICAgICAgdGhpcy5fc3RhdHMgPSBuZXcgX2Rpc3BsYXlfdXRpbHMuU3RhdFRpbWVyKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9zdGFydFJlbmRlclBhZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfc3RhcnRSZW5kZXJQYWdlKHRyYW5zcGFyZW5jeSwgaW50ZW50KSB7CisgICAgICB2YXIgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGludGVudCk7CisKKyAgICAgIGlmICghaW50ZW50U3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fc3RhdHMpIHsKKyAgICAgICAgdGhpcy5fc3RhdHMudGltZUVuZCgiUGFnZSBSZXF1ZXN0Iik7CisgICAgICB9CisKKyAgICAgIGlmIChpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7CisgICAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSh0cmFuc3BhcmVuY3kpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIl9yZW5kZXJQYWdlQ2h1bmsiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVuZGVyUGFnZUNodW5rKG9wZXJhdG9yTGlzdENodW5rLCBpbnRlbnRTdGF0ZSkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gb3BlcmF0b3JMaXN0Q2h1bmsubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuZm5BcnJheS5wdXNoKG9wZXJhdG9yTGlzdENodW5rLmZuQXJyYXlbaV0pOworICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuYXJnc0FycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuYXJnc0FycmF5W2ldKTsKKyAgICAgIH0KKworICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayA9IG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuazsKKworICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgaW50ZW50U3RhdGUucmVuZGVyVGFza3MubGVuZ3RoOyBfaTIrKykgeworICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrc1tfaTJdLm9wZXJhdG9yTGlzdENoYW5nZWQoKTsKKyAgICAgIH0KKworICAgICAgaWYgKG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuaykgeworICAgICAgICB0aGlzLl90cnlDbGVhbnVwKCk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3B1bXBPcGVyYXRvckxpc3QiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcHVtcE9wZXJhdG9yTGlzdChhcmdzKSB7CisgICAgICB2YXIgX3RoaXM2ID0gdGhpczsKKworICAgICAgKDAsIF91dGlsLmFzc2VydCkoYXJncy5pbnRlbnQsICdQREZQYWdlUHJveHkuX3B1bXBPcGVyYXRvckxpc3Q6IEV4cGVjdGVkICJpbnRlbnQiIGFyZ3VtZW50LicpOworCisgICAgICB2YXIgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldE9wZXJhdG9yTGlzdCIsIGFyZ3MpOworCisgICAgICB2YXIgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CisKKyAgICAgIHZhciBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoYXJncy5pbnRlbnQpOworCisgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSByZWFkZXI7CisKKyAgICAgIHZhciBwdW1wID0gZnVuY3Rpb24gcHVtcCgpIHsKKyAgICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChfcmVmMTApIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBfcmVmMTAudmFsdWUsCisgICAgICAgICAgICAgIGRvbmUgPSBfcmVmMTAuZG9uZTsKKworICAgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChfdGhpczYuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBfdGhpczYuX3JlbmRlclBhZ2VDaHVuayh2YWx1ZSwgaW50ZW50U3RhdGUpOworCisgICAgICAgICAgcHVtcCgpOworICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDsKKworICAgICAgICAgIGlmIChfdGhpczYuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KSB7CisgICAgICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gdHJ1ZTsKKworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrc1tpXS5vcGVyYXRvckxpc3RDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF90aGlzNi5fdHJ5Q2xlYW51cCgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7CisgICAgICAgICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOworICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHsKKyAgICAgICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyByZWFzb247CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH07CisKKyAgICAgIHB1bXAoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfYWJvcnRPcGVyYXRvckxpc3QiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfYWJvcnRPcGVyYXRvckxpc3QoX3JlZjExKSB7CisgICAgICB2YXIgX3RoaXM3ID0gdGhpczsKKworICAgICAgdmFyIGludGVudFN0YXRlID0gX3JlZjExLmludGVudFN0YXRlLAorICAgICAgICAgIHJlYXNvbiA9IF9yZWYxMS5yZWFzb24sCisgICAgICAgICAgX3JlZjExJGZvcmNlID0gX3JlZjExLmZvcmNlLAorICAgICAgICAgIGZvcmNlID0gX3JlZjExJGZvcmNlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYxMSRmb3JjZTsKKyAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yIHx8IF90eXBlb2YocmVhc29uKSA9PT0gIm9iamVjdCIgJiYgcmVhc29uICE9PSBudWxsLCAnUERGUGFnZVByb3h5Ll9hYm9ydE9wZXJhdG9yTGlzdDogRXhwZWN0ZWQgInJlYXNvbiIgYXJndW1lbnQuJyk7CisKKyAgICAgIGlmICghaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCFmb3JjZSkgeworICAgICAgICBpZiAoaW50ZW50U3RhdGUucmVuZGVyVGFza3MubGVuZ3RoICE9PSAwKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikgeworICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIF90aGlzNy5fYWJvcnRPcGVyYXRvckxpc3QoeworICAgICAgICAgICAgICBpbnRlbnRTdGF0ZTogaW50ZW50U3RhdGUsCisgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uLAorICAgICAgICAgICAgICBmb3JjZTogdHJ1ZQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsOworICAgICAgICAgIH0sIFJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlci5jYW5jZWwobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKHJlYXNvbiAmJiByZWFzb24ubWVzc2FnZSkpOworICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDsKKworICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgX2l0ZXJhdG9yOCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX2ludGVudFN0YXRlcyksCisgICAgICAgICAgX3N0ZXA4OworCisgICAgICB0cnkgeworICAgICAgICBmb3IgKF9pdGVyYXRvcjgucygpOyAhKF9zdGVwOCA9IF9pdGVyYXRvcjgubigpKS5kb25lOykgeworICAgICAgICAgIHZhciBfc3RlcDgkdmFsdWUgPSBfc2xpY2VkVG9BcnJheShfc3RlcDgudmFsdWUsIDIpLAorICAgICAgICAgICAgICBpbnRlbnQgPSBfc3RlcDgkdmFsdWVbMF0sCisgICAgICAgICAgICAgIGN1ckludGVudFN0YXRlID0gX3N0ZXA4JHZhbHVlWzFdOworCisgICAgICAgICAgaWYgKGN1ckludGVudFN0YXRlID09PSBpbnRlbnRTdGF0ZSkgeworICAgICAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzWyJkZWxldGUiXShpbnRlbnQpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3I4LmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjguZigpOworICAgICAgfQorCisgICAgICB0aGlzLmNsZWFudXAoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwYWdlTnVtYmVyIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlSW5kZXggKyAxOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJvdGF0ZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlZiIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucmVmOworICAgIH0KKyAgfSwgeworICAgIGtleTogInVzZXJVbml0IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby51c2VyVW5pdDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ2aWV3IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3OworICAgIH0KKyAgfSwgeworICAgIGtleTogInN0YXRzIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9zdGF0czsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGUGFnZVByb3h5OworfSgpOworCitleHBvcnRzLlBERlBhZ2VQcm94eSA9IFBERlBhZ2VQcm94eTsKKwordmFyIExvb3BiYWNrUG9ydCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIExvb3BiYWNrUG9ydCgpIHsKKyAgICB2YXIgZGVmZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9vcGJhY2tQb3J0KTsKKworICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdOworICAgIHRoaXMuX2RlZmVyID0gZGVmZXI7CisgICAgdGhpcy5fZGVmZXJyZWQgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhMb29wYmFja1BvcnQsIFt7CisgICAga2V5OiAicG9zdE1lc3NhZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBwb3N0TWVzc2FnZShvYmosIHRyYW5zZmVycykgeworICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CisKKyAgICAgIGZ1bmN0aW9uIGNsb25lVmFsdWUodmFsdWUpIHsKKyAgICAgICAgaWYgKF90eXBlb2YodmFsdWUpICE9PSAib2JqZWN0IiB8fCB2YWx1ZSA9PT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbG9uZWQuaGFzKHZhbHVlKSkgeworICAgICAgICAgIHJldHVybiBjbG9uZWQuZ2V0KHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWZmZXIsIHJlc3VsdDsKKworICAgICAgICBpZiAoKGJ1ZmZlciA9IHZhbHVlLmJ1ZmZlcikgJiYgKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKGJ1ZmZlcikpIHsKKyAgICAgICAgICB2YXIgdHJhbnNmZXJhYmxlID0gdHJhbnNmZXJzICYmIHRyYW5zZmVycy5pbmNsdWRlcyhidWZmZXIpOworCisgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IHZhbHVlLmNvbnN0cnVjdG9yKGJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyB2YWx1ZS5jb25zdHJ1Y3Rvcih2YWx1ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgY2xvbmVkLnNldCh2YWx1ZSwgcmVzdWx0KTsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbXSA6IHt9OworICAgICAgICBjbG9uZWQuc2V0KHZhbHVlLCByZXN1bHQpOworCisgICAgICAgIGZvciAodmFyIGkgaW4gdmFsdWUpIHsKKyAgICAgICAgICB2YXIgZGVzYyA9IHZvaWQgMCwKKyAgICAgICAgICAgICAgcCA9IHZhbHVlOworCisgICAgICAgICAgd2hpbGUgKCEoZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocCwgaSkpKSB7CisgICAgICAgICAgICBwID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHApOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0eXBlb2YgZGVzYy52YWx1ZSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0eXBlb2YgZGVzYy52YWx1ZSA9PT0gImZ1bmN0aW9uIikgeworICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5ICYmIHZhbHVlLmhhc093blByb3BlcnR5KGkpKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTG9vcGJhY2tQb3J0LnBvc3RNZXNzYWdlIC0gY2Fubm90IGNsb25lOiAiLmNvbmNhdCh2YWx1ZVtpXSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXN1bHRbaV0gPSBjbG9uZVZhbHVlKGRlc2MudmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLl9kZWZlcikgeworICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsKKyAgICAgICAgICBsaXN0ZW5lci5jYWxsKF90aGlzOCwgeworICAgICAgICAgICAgZGF0YTogb2JqCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGNsb25lZCA9IG5ldyBXZWFrTWFwKCk7CisgICAgICB2YXIgZSA9IHsKKyAgICAgICAgZGF0YTogY2xvbmVWYWx1ZShvYmopCisgICAgICB9OworCisgICAgICB0aGlzLl9kZWZlcnJlZC50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgX3RoaXM4Ll9saXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsKKyAgICAgICAgICBsaXN0ZW5lci5jYWxsKF90aGlzOCwgZSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYWRkRXZlbnRMaXN0ZW5lciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpIHsKKyAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZW1vdmVFdmVudExpc3RlbmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikgeworICAgICAgdmFyIGkgPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7CisKKyAgICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaSwgMSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAidGVybWluYXRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gdGVybWluYXRlKCkgeworICAgICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIExvb3BiYWNrUG9ydDsKK30oKTsKKworZXhwb3J0cy5Mb29wYmFja1BvcnQgPSBMb29wYmFja1BvcnQ7CisKK3ZhciBQREZXb3JrZXIgPSBmdW5jdGlvbiBQREZXb3JrZXJDbG9zdXJlKCkgeworICB2YXIgcGRmV29ya2VyUG9ydHMgPSBuZXcgV2Vha01hcCgpOworICB2YXIgaXNXb3JrZXJEaXNhYmxlZCA9IGZhbHNlOworICB2YXIgZmFsbGJhY2tXb3JrZXJTcmM7CisgIHZhciBuZXh0RmFrZVdvcmtlcklkID0gMDsKKyAgdmFyIGZha2VXb3JrZXJDYXBhYmlsaXR5OworCisgIGlmIChfaXNfbm9kZS5pc05vZGVKUyAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gImZ1bmN0aW9uIikgeworICAgIGlzV29ya2VyRGlzYWJsZWQgPSB0cnVlOworICAgIGZhbGxiYWNrV29ya2VyU3JjID0gIi4vcGRmLndvcmtlci5qcyI7CisgIH0gZWxzZSBpZiAoKHR5cGVvZiBkb2N1bWVudCA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2YoZG9jdW1lbnQpKSA9PT0gIm9iamVjdCIgJiYgImN1cnJlbnRTY3JpcHQiIGluIGRvY3VtZW50KSB7CisgICAgdmFyIHBkZmpzRmlsZVBhdGggPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOworCisgICAgaWYgKHBkZmpzRmlsZVBhdGgpIHsKKyAgICAgIGZhbGxiYWNrV29ya2VyU3JjID0gcGRmanNGaWxlUGF0aC5yZXBsYWNlKC8oXC4oPzptaW5cLik/anMpKFw/LiopPyQvaSwgIi53b3JrZXIkMSQyIik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gX2dldFdvcmtlclNyYygpIHsKKyAgICBpZiAoX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKSB7CisgICAgICByZXR1cm4gX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjOworICAgIH0KKworICAgIGlmICh0eXBlb2YgZmFsbGJhY2tXb3JrZXJTcmMgIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBpZiAoIV9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgICgwLCBfZGlzcGxheV91dGlscy5kZXByZWNhdGVkKSgnTm8gIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjIiBzcGVjaWZpZWQuJyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxsYmFja1dvcmtlclNyYzsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ05vICJHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyIgc3BlY2lmaWVkLicpOworICB9CisKKyAgZnVuY3Rpb24gZ2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCkgeworICAgIHZhciBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI7CisKKyAgICB0cnkgeworICAgICAgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyID0gZ2xvYmFsVGhpcy5wZGZqc1dvcmtlciAmJiBnbG9iYWxUaGlzLnBkZmpzV29ya2VyLldvcmtlck1lc3NhZ2VIYW5kbGVyOworICAgIH0gY2F0Y2ggKGV4KSB7fQorCisgICAgcmV0dXJuIG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlciB8fCBudWxsOworICB9CisKKyAgZnVuY3Rpb24gc2V0dXBGYWtlV29ya2VyR2xvYmFsKCkgeworICAgIGlmIChmYWtlV29ya2VyQ2FwYWJpbGl0eSkgeworICAgICAgcmV0dXJuIGZha2VXb3JrZXJDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorCisgICAgZmFrZVdvcmtlckNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICB2YXIgbG9hZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfcmVmMTIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKKyAgICAgICAgdmFyIG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlciwgd29ya2VyOworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKTsKKworICAgICAgICAgICAgICAgIGlmICghbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmICghKF9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiByZXF1aXJlID09PSAiZnVuY3Rpb24iKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3b3JrZXIgPSBldmFsKCJyZXF1aXJlIikoX2dldFdvcmtlclNyYygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXIpOworCisgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDAsIF9kaXNwbGF5X3V0aWxzLmxvYWRTY3JpcHQpKF9nZXRXb3JrZXJTcmMoKSk7CisKKyAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHdpbmRvdy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlKTsKKyAgICAgIH0pKTsKKworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGxvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIF9yZWYxMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfTsKKyAgICB9KCk7CisKKyAgICBsb2FkZXIoKS50aGVuKGZha2VXb3JrZXJDYXBhYmlsaXR5LnJlc29sdmUsIGZha2VXb3JrZXJDYXBhYmlsaXR5LnJlamVjdCk7CisgICAgcmV0dXJuIGZha2VXb3JrZXJDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVDRE5XcmFwcGVyKHVybCkgeworICAgIHZhciB3cmFwcGVyID0gImltcG9ydFNjcmlwdHMoJyIgKyB1cmwgKyAiJyk7IjsKKyAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbd3JhcHBlcl0pKTsKKyAgfQorCisgIHZhciBQREZXb3JrZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICAgIGZ1bmN0aW9uIFBERldvcmtlcigpIHsKKyAgICAgIHZhciBfcmVmMTMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LAorICAgICAgICAgIF9yZWYxMyRuYW1lID0gX3JlZjEzLm5hbWUsCisgICAgICAgICAgbmFtZSA9IF9yZWYxMyRuYW1lID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjEzJG5hbWUsCisgICAgICAgICAgX3JlZjEzJHBvcnQgPSBfcmVmMTMucG9ydCwKKyAgICAgICAgICBwb3J0ID0gX3JlZjEzJHBvcnQgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMTMkcG9ydCwKKyAgICAgICAgICBfcmVmMTMkdmVyYm9zaXR5ID0gX3JlZjEzLnZlcmJvc2l0eSwKKyAgICAgICAgICB2ZXJib3NpdHkgPSBfcmVmMTMkdmVyYm9zaXR5ID09PSB2b2lkIDAgPyAoMCwgX3V0aWwuZ2V0VmVyYm9zaXR5TGV2ZWwpKCkgOiBfcmVmMTMkdmVyYm9zaXR5OworCisgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGV29ya2VyKTsKKworICAgICAgaWYgKHBvcnQgJiYgcGRmV29ya2VyUG9ydHMuaGFzKHBvcnQpKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVzZSBtb3JlIHRoYW4gb25lIFBERldvcmtlciBwZXIgcG9ydCIpOworICAgICAgfQorCisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSB0cnVlOworICAgICAgdGhpcy52ZXJib3NpdHkgPSB2ZXJib3NpdHk7CisgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICB0aGlzLl9wb3J0ID0gbnVsbDsKKyAgICAgIHRoaXMuX3dlYldvcmtlciA9IG51bGw7CisgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7CisKKyAgICAgIGlmIChwb3J0KSB7CisgICAgICAgIHBkZldvcmtlclBvcnRzLnNldChwb3J0LCB0aGlzKTsKKworICAgICAgICB0aGlzLl9pbml0aWFsaXplRnJvbVBvcnQocG9ydCk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9pbml0aWFsaXplKCk7CisgICAgfQorCisgICAgX2NyZWF0ZUNsYXNzKFBERldvcmtlciwgW3sKKyAgICAgIGtleTogIl9pbml0aWFsaXplRnJvbVBvcnQiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0aWFsaXplRnJvbVBvcnQocG9ydCkgeworICAgICAgICB0aGlzLl9wb3J0ID0gcG9ydDsKKyAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcigibWFpbiIsICJ3b3JrZXIiLCBwb3J0KTsKKworICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5vbigicmVhZHkiLCBmdW5jdGlvbiAoKSB7fSk7CisKKyAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJfaW5pdGlhbGl6ZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7CisgICAgICAgIHZhciBfdGhpczkgPSB0aGlzOworCisgICAgICAgIGlmICh0eXBlb2YgV29ya2VyICE9PSAidW5kZWZpbmVkIiAmJiAhaXNXb3JrZXJEaXNhYmxlZCAmJiAhZ2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCkpIHsKKyAgICAgICAgICB2YXIgd29ya2VyU3JjID0gX2dldFdvcmtlclNyYygpOworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghKDAsIF91dGlsLmlzU2FtZU9yaWdpbikod2luZG93LmxvY2F0aW9uLmhyZWYsIHdvcmtlclNyYykpIHsKKyAgICAgICAgICAgICAgd29ya2VyU3JjID0gY3JlYXRlQ0ROV3JhcHBlcihuZXcgVVJMKHdvcmtlclNyYywgd2luZG93LmxvY2F0aW9uKS5ocmVmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyU3JjKTsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJtYWluIiwgIndvcmtlciIsIHdvcmtlcik7CisKKyAgICAgICAgICAgIHZhciB0ZXJtaW5hdGVFYXJseSA9IGZ1bmN0aW9uIHRlcm1pbmF0ZUVhcmx5KCkgeworICAgICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBvbldvcmtlckVycm9yKTsKKyAgICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpOworICAgICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7CisKKyAgICAgICAgICAgICAgaWYgKF90aGlzOS5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgICBfdGhpczkuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfdGhpczkuX3NldHVwRmFrZVdvcmtlcigpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB2YXIgb25Xb3JrZXJFcnJvciA9IGZ1bmN0aW9uIG9uV29ya2VyRXJyb3IoKSB7CisgICAgICAgICAgICAgIGlmICghX3RoaXM5Ll93ZWJXb3JrZXIpIHsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBvbldvcmtlckVycm9yKTsKKyAgICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJ0ZXN0IiwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIiwgb25Xb3JrZXJFcnJvcik7CisKKyAgICAgICAgICAgICAgaWYgKF90aGlzOS5kZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICAgICAgX3RoaXM5Ll9tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyOworICAgICAgICAgICAgICAgIF90aGlzOS5fcG9ydCA9IHdvcmtlcjsKKyAgICAgICAgICAgICAgICBfdGhpczkuX3dlYldvcmtlciA9IHdvcmtlcjsKKworICAgICAgICAgICAgICAgIGlmICghZGF0YS5zdXBwb3J0VHJhbnNmZXJzKSB7CisgICAgICAgICAgICAgICAgICBfdGhpczkucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfdGhpczkuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKCJjb25maWd1cmUiLCB7CisgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk6IF90aGlzOS52ZXJib3NpdHkKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfdGhpczkuX3NldHVwRmFrZVdvcmtlcigpOworCisgICAgICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5vbigicmVhZHkiLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBvbldvcmtlckVycm9yKTsKKworICAgICAgICAgICAgICBpZiAoX3RoaXM5LmRlc3Ryb3llZCkgeworICAgICAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZW5kVGVzdCgpOworICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICAgICAgX3RoaXM5Ll9zZXR1cEZha2VXb3JrZXIoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHZhciBzZW5kVGVzdCA9IGZ1bmN0aW9uIHNlbmRUZXN0KCkgeworICAgICAgICAgICAgICB2YXIgdGVzdE9iaiA9IG5ldyBVaW50OEFycmF5KFtfdGhpczkucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPyAyNTUgOiAwXSk7CisKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKCJ0ZXN0IiwgdGVzdE9iaiwgW3Rlc3RPYmouYnVmZmVyXSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJDYW5ub3QgdXNlIHBvc3RNZXNzYWdlIHRyYW5zZmVycy4iKTsKKyAgICAgICAgICAgICAgICB0ZXN0T2JqWzBdID0gMDsKKyAgICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKCJ0ZXN0IiwgdGVzdE9iaik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNlbmRUZXN0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogIl9zZXR1cEZha2VXb3JrZXIiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXR1cEZha2VXb3JrZXIoKSB7CisgICAgICAgIHZhciBfdGhpczEwID0gdGhpczsKKworICAgICAgICBpZiAoIWlzV29ya2VyRGlzYWJsZWQpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIuIik7CisgICAgICAgICAgaXNXb3JrZXJEaXNhYmxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzZXR1cEZha2VXb3JrZXJHbG9iYWwoKS50aGVuKGZ1bmN0aW9uIChXb3JrZXJNZXNzYWdlSGFuZGxlcikgeworICAgICAgICAgIGlmIChfdGhpczEwLmRlc3Ryb3llZCkgeworICAgICAgICAgICAgX3RoaXMxMC5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIHBvcnQgPSBuZXcgTG9vcGJhY2tQb3J0KCk7CisgICAgICAgICAgX3RoaXMxMC5fcG9ydCA9IHBvcnQ7CisgICAgICAgICAgdmFyIGlkID0gImZha2UiICsgbmV4dEZha2VXb3JrZXJJZCsrOworICAgICAgICAgIHZhciB3b3JrZXJIYW5kbGVyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoaWQgKyAiX3dvcmtlciIsIGlkLCBwb3J0KTsKKyAgICAgICAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cCh3b3JrZXJIYW5kbGVyLCBwb3J0KTsKKyAgICAgICAgICB2YXIgbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihpZCwgaWQgKyAiX3dvcmtlciIsIHBvcnQpOworICAgICAgICAgIF90aGlzMTAuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7CisKKyAgICAgICAgICBfdGhpczEwLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZCgiY29uZmlndXJlIiwgeworICAgICAgICAgICAgdmVyYm9zaXR5OiBfdGhpczEwLnZlcmJvc2l0eQorICAgICAgICAgIH0pOworICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgX3RoaXMxMC5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIgZmFpbGVkOiBcIiIuY29uY2F0KHJlYXNvbi5tZXNzYWdlLCAiXCIuIikpKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiZGVzdHJveSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHsKKyAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlOworCisgICAgICAgIGlmICh0aGlzLl93ZWJXb3JrZXIpIHsKKyAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7CisKKyAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcGRmV29ya2VyUG9ydHNbImRlbGV0ZSJdKHRoaXMuX3BvcnQpOworICAgICAgICB0aGlzLl9wb3J0ID0gbnVsbDsKKworICAgICAgICBpZiAodGhpcy5fbWVzc2FnZUhhbmRsZXIpIHsKKyAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7CisKKyAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJwcm9taXNlIiwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAicG9ydCIsCisgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnQ7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAibWVzc2FnZUhhbmRsZXIiLAorICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGFuZGxlcjsKKyAgICAgIH0KKyAgICB9XSwgW3sKKyAgICAgIGtleTogImZyb21Qb3J0IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tUG9ydChwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy5wb3J0KSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQREZXb3JrZXIuZnJvbVBvcnQgLSBpbnZhbGlkIG1ldGhvZCBzaWduYXR1cmUuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGRmV29ya2VyUG9ydHMuaGFzKHBhcmFtcy5wb3J0KSkgeworICAgICAgICAgIHJldHVybiBwZGZXb3JrZXJQb3J0cy5nZXQocGFyYW1zLnBvcnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBQREZXb3JrZXIocGFyYW1zKTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJnZXRXb3JrZXJTcmMiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFdvcmtlclNyYygpIHsKKyAgICAgICAgcmV0dXJuIF9nZXRXb3JrZXJTcmMoKTsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gUERGV29ya2VyOworICB9KCk7CisKKyAgcmV0dXJuIFBERldvcmtlcjsKK30oKTsKKworZXhwb3J0cy5QREZXb3JrZXIgPSBQREZXb3JrZXI7CisKK3ZhciBXb3JrZXJUcmFuc3BvcnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBXb3JrZXJUcmFuc3BvcnQobWVzc2FnZUhhbmRsZXIsIGxvYWRpbmdUYXNrLCBuZXR3b3JrU3RyZWFtLCBwYXJhbXMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV29ya2VyVHJhbnNwb3J0KTsKKworICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjsKKyAgICB0aGlzLmxvYWRpbmdUYXNrID0gbG9hZGluZ1Rhc2s7CisgICAgdGhpcy5jb21tb25PYmpzID0gbmV3IFBERk9iamVjdHMoKTsKKyAgICB0aGlzLmZvbnRMb2FkZXIgPSBuZXcgX2ZvbnRfbG9hZGVyLkZvbnRMb2FkZXIoeworICAgICAgZG9jSWQ6IGxvYWRpbmdUYXNrLmRvY0lkLAorICAgICAgb25VbnN1cHBvcnRlZEZlYXR1cmU6IHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlLmJpbmQodGhpcyksCisgICAgICBvd25lckRvY3VtZW50OiBwYXJhbXMub3duZXJEb2N1bWVudAorICAgIH0pOworICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtczsKKyAgICB0aGlzLkNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IHBhcmFtcy5DTWFwUmVhZGVyRmFjdG9yeSh7CisgICAgICBiYXNlVXJsOiBwYXJhbXMuY01hcFVybCwKKyAgICAgIGlzQ29tcHJlc3NlZDogcGFyYW1zLmNNYXBQYWNrZWQKKyAgICB9KTsKKyAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOworICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBudWxsOworICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSA9IG51bGw7CisgICAgdGhpcy5fbmV0d29ya1N0cmVhbSA9IG5ldHdvcmtTdHJlYW07CisgICAgdGhpcy5fZnVsbFJlYWRlciA9IG51bGw7CisgICAgdGhpcy5fbGFzdFByb2dyZXNzID0gbnVsbDsKKyAgICB0aGlzLnBhZ2VDYWNoZSA9IFtdOworICAgIHRoaXMucGFnZVByb21pc2VzID0gW107CisgICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFdvcmtlclRyYW5zcG9ydCwgW3sKKyAgICBrZXk6ICJkZXN0cm95IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHsKKyAgICAgIHZhciBfdGhpczExID0gdGhpczsKKworICAgICAgaWYgKHRoaXMuZGVzdHJveUNhcGFiaWxpdHkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlOworICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKworICAgICAgaWYgKHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSkgeworICAgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQgZHVyaW5nIG9uUGFzc3dvcmQgY2FsbGJhY2siKSk7CisgICAgICB9CisKKyAgICAgIHZhciB3YWl0T24gPSBbXTsKKyAgICAgIHRoaXMucGFnZUNhY2hlLmZvckVhY2goZnVuY3Rpb24gKHBhZ2UpIHsKKyAgICAgICAgaWYgKHBhZ2UpIHsKKyAgICAgICAgICB3YWl0T24ucHVzaChwYWdlLl9kZXN0cm95KCkpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHRoaXMucGFnZUNhY2hlLmxlbmd0aCA9IDA7CisgICAgICB0aGlzLnBhZ2VQcm9taXNlcy5sZW5ndGggPSAwOworICAgICAgdmFyIHRlcm1pbmF0ZWQgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiVGVybWluYXRlIiwgbnVsbCk7CisgICAgICB3YWl0T24ucHVzaCh0ZXJtaW5hdGVkKTsKKyAgICAgIFByb21pc2UuYWxsKHdhaXRPbikudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIF90aGlzMTEuZm9udExvYWRlci5jbGVhcigpOworCisgICAgICAgIGlmIChfdGhpczExLl9uZXR3b3JrU3RyZWFtKSB7CisgICAgICAgICAgX3RoaXMxMS5fbmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3RoaXMxMS5tZXNzYWdlSGFuZGxlcikgeworICAgICAgICAgIF90aGlzMTEubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpOworCisgICAgICAgICAgX3RoaXMxMS5tZXNzYWdlSGFuZGxlciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBfdGhpczExLmRlc3Ryb3lDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgIH0sIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVqZWN0KTsKKyAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0dXBNZXNzYWdlSGFuZGxlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldHVwTWVzc2FnZUhhbmRsZXIoKSB7CisgICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7CisKKyAgICAgIHZhciBtZXNzYWdlSGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXIsCisgICAgICAgICAgbG9hZGluZ1Rhc2sgPSB0aGlzLmxvYWRpbmdUYXNrOworICAgICAgbWVzc2FnZUhhbmRsZXIub24oIkdldFJlYWRlciIsIGZ1bmN0aW9uIChkYXRhLCBzaW5rKSB7CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKF90aGlzMTIuX25ldHdvcmtTdHJlYW0sICJHZXRSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLiIpOworICAgICAgICBfdGhpczEyLl9mdWxsUmVhZGVyID0gX3RoaXMxMi5fbmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyKCk7CisKKyAgICAgICAgX3RoaXMxMi5fZnVsbFJlYWRlci5vblByb2dyZXNzID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICAgIF90aGlzMTIuX2xhc3RQcm9ncmVzcyA9IHsKKyAgICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCwKKyAgICAgICAgICAgIHRvdGFsOiBldnQudG90YWwKKyAgICAgICAgICB9OworICAgICAgICB9OworCisgICAgICAgIHNpbmsub25QdWxsID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgIF90aGlzMTIuX2Z1bGxSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKF9yZWYxNCkgeworICAgICAgICAgICAgdmFyIHZhbHVlID0gX3JlZjE0LnZhbHVlLAorICAgICAgICAgICAgICAgIGRvbmUgPSBfcmVmMTQuZG9uZTsKKworICAgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh2YWx1ZSksICJHZXRSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci4iKTsKKyAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pOworICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBzaW5rLm9uQ2FuY2VsID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIF90aGlzMTIuX2Z1bGxSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisKKyAgICAgICAgICBzaW5rLnJlYWR5WyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFkeVJlYXNvbikgeworICAgICAgICAgICAgaWYgKF90aGlzMTIuZGVzdHJveWVkKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICB9KTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJSZWFkZXJIZWFkZXJzUmVhZHkiLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICB2YXIgaGVhZGVyc0NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgIHZhciBmdWxsUmVhZGVyID0gX3RoaXMxMi5fZnVsbFJlYWRlcjsKKyAgICAgICAgZnVsbFJlYWRlci5oZWFkZXJzUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgaWYgKCFmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkIHx8ICFmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGlmIChfdGhpczEyLl9sYXN0UHJvZ3Jlc3MgJiYgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcykgeworICAgICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKF90aGlzMTIuX2xhc3RQcm9ncmVzcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bGxSZWFkZXIub25Qcm9ncmVzcyA9IGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHsKKyAgICAgICAgICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCwKKyAgICAgICAgICAgICAgICAgIHRvdGFsOiBldnQudG90YWwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBoZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICAgIGlzU3RyZWFtaW5nU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkLAorICAgICAgICAgICAgaXNSYW5nZVN1cHBvcnRlZDogZnVsbFJlYWRlci5pc1JhbmdlU3VwcG9ydGVkLAorICAgICAgICAgICAgY29udGVudExlbmd0aDogZnVsbFJlYWRlci5jb250ZW50TGVuZ3RoCisgICAgICAgICAgfSk7CisgICAgICAgIH0sIGhlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7CisgICAgICAgIHJldHVybiBoZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgfSk7CisgICAgICBtZXNzYWdlSGFuZGxlci5vbigiR2V0UmFuZ2VSZWFkZXIiLCBmdW5jdGlvbiAoZGF0YSwgc2luaykgeworICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShfdGhpczEyLl9uZXR3b3JrU3RyZWFtLCAiR2V0UmFuZ2VSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLiIpOworCisgICAgICAgIHZhciByYW5nZVJlYWRlciA9IF90aGlzMTIuX25ldHdvcmtTdHJlYW0uZ2V0UmFuZ2VSZWFkZXIoZGF0YS5iZWdpbiwgZGF0YS5lbmQpOworCisgICAgICAgIGlmICghcmFuZ2VSZWFkZXIpIHsKKyAgICAgICAgICBzaW5rLmNsb3NlKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2luay5vblB1bGwgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKF9yZWYxNSkgeworICAgICAgICAgICAgdmFyIHZhbHVlID0gX3JlZjE1LnZhbHVlLAorICAgICAgICAgICAgICAgIGRvbmUgPSBfcmVmMTUuZG9uZTsKKworICAgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh2YWx1ZSksICJHZXRSYW5nZVJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLiIpOworICAgICAgICAgICAgc2luay5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSwgMSwgW3ZhbHVlXSk7CisgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgc2luay5lcnJvcihyZWFzb24pOworICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHNpbmsub25DYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgcmFuZ2VSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgICAgICAgc2luay5yZWFkeVsiY2F0Y2giXShmdW5jdGlvbiAocmVhZHlSZWFzb24pIHsKKyAgICAgICAgICAgIGlmIChfdGhpczEyLmRlc3Ryb3llZCkgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uOworICAgICAgICAgIH0pOworICAgICAgICB9OworICAgICAgfSk7CisgICAgICBtZXNzYWdlSGFuZGxlci5vbigiR2V0RG9jIiwgZnVuY3Rpb24gKF9yZWYxNikgeworICAgICAgICB2YXIgcGRmSW5mbyA9IF9yZWYxNi5wZGZJbmZvOworICAgICAgICBfdGhpczEyLl9udW1QYWdlcyA9IHBkZkluZm8ubnVtUGFnZXM7CisKKyAgICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVzb2x2ZShuZXcgUERGRG9jdW1lbnRQcm94eShwZGZJbmZvLCBfdGhpczEyKSk7CisgICAgICB9KTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJEb2NFeGNlcHRpb24iLCBmdW5jdGlvbiAoZXgpIHsKKyAgICAgICAgdmFyIHJlYXNvbjsKKworICAgICAgICBzd2l0Y2ggKGV4Lm5hbWUpIHsKKyAgICAgICAgICBjYXNlICJQYXNzd29yZEV4Y2VwdGlvbiI6CisgICAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguY29kZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkludmFsaWRQREZFeGNlcHRpb24iOgorICAgICAgICAgICAgcmVhc29uID0gbmV3IF91dGlsLkludmFsaWRQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIk1pc3NpbmdQREZFeGNlcHRpb24iOgorICAgICAgICAgICAgcmVhc29uID0gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiI6CisgICAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlVua25vd25FcnJvckV4Y2VwdGlvbiI6CisgICAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmRldGFpbHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikpIHsKKyAgICAgICAgICB2YXIgbXNnID0gIkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuIjsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWRpbmdUYXNrLl9jYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOworICAgICAgfSk7CisgICAgICBtZXNzYWdlSGFuZGxlci5vbigiUGFzc3dvcmRSZXF1ZXN0IiwgZnVuY3Rpb24gKGV4Y2VwdGlvbikgeworICAgICAgICBfdGhpczEyLl9wYXNzd29yZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQpIHsKKyAgICAgICAgICB2YXIgdXBkYXRlUGFzc3dvcmQgPSBmdW5jdGlvbiB1cGRhdGVQYXNzd29yZChwYXNzd29yZCkgeworICAgICAgICAgICAgX3RoaXMxMi5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH07CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9hZGluZ1Rhc2sub25QYXNzd29yZCh1cGRhdGVQYXNzd29yZCwgZXhjZXB0aW9uLmNvZGUpOworICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICBfdGhpczEyLl9wYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KGV4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX3RoaXMxMi5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChuZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24oZXhjZXB0aW9uLm1lc3NhZ2UsIGV4Y2VwdGlvbi5jb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX3RoaXMxMi5fcGFzc3dvcmRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICB9KTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJEYXRhTG9hZGVkIiwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3MpIHsKKyAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHsKKyAgICAgICAgICAgIGxvYWRlZDogZGF0YS5sZW5ndGgsCisgICAgICAgICAgICB0b3RhbDogZGF0YS5sZW5ndGgKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIF90aGlzMTIuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEpOworICAgICAgfSk7CisgICAgICBtZXNzYWdlSGFuZGxlci5vbigiU3RhcnRSZW5kZXJQYWdlIiwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgaWYgKF90aGlzMTIuZGVzdHJveWVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHBhZ2UgPSBfdGhpczEyLnBhZ2VDYWNoZVtkYXRhLnBhZ2VJbmRleF07CisKKyAgICAgICAgcGFnZS5fc3RhcnRSZW5kZXJQYWdlKGRhdGEudHJhbnNwYXJlbmN5LCBkYXRhLmludGVudCk7CisgICAgICB9KTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJjb21tb25vYmoiLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBpZiAoX3RoaXMxMi5kZXN0cm95ZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgX2RhdGEgPSBfc2xpY2VkVG9BcnJheShkYXRhLCAzKSwKKyAgICAgICAgICAgIGlkID0gX2RhdGFbMF0sCisgICAgICAgICAgICB0eXBlID0gX2RhdGFbMV0sCisgICAgICAgICAgICBleHBvcnRlZERhdGEgPSBfZGF0YVsyXTsKKworICAgICAgICBpZiAoX3RoaXMxMi5jb21tb25PYmpzLmhhcyhpZCkpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICBjYXNlICJGb250IjoKKyAgICAgICAgICAgIHZhciBwYXJhbXMgPSBfdGhpczEyLl9wYXJhbXM7CisKKyAgICAgICAgICAgIGlmICgiZXJyb3IiIGluIGV4cG9ydGVkRGF0YSkgeworICAgICAgICAgICAgICB2YXIgZXhwb3J0ZWRFcnJvciA9IGV4cG9ydGVkRGF0YS5lcnJvcjsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiAiLmNvbmNhdChleHBvcnRlZEVycm9yKSk7CisKKyAgICAgICAgICAgICAgX3RoaXMxMi5jb21tb25PYmpzLnJlc29sdmUoaWQsIGV4cG9ydGVkRXJyb3IpOworCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZm9udFJlZ2lzdHJ5ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHBhcmFtcy5wZGZCdWcgJiYgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yICYmIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5lbmFibGVkKSB7CisgICAgICAgICAgICAgIGZvbnRSZWdpc3RyeSA9IHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZvbnQ6IGZ1bmN0aW9uIHJlZ2lzdGVyRm9udChmb250LCB1cmwpIHsKKyAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQoZm9udCwgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmb250ID0gbmV3IF9mb250X2xvYWRlci5Gb250RmFjZU9iamVjdChleHBvcnRlZERhdGEsIHsKKyAgICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBwYXJhbXMuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IHBhcmFtcy5kaXNhYmxlRm9udEZhY2UsCisgICAgICAgICAgICAgIGlnbm9yZUVycm9yczogcGFyYW1zLmlnbm9yZUVycm9ycywKKyAgICAgICAgICAgICAgb25VbnN1cHBvcnRlZEZlYXR1cmU6IF90aGlzMTIuX29uVW5zdXBwb3J0ZWRGZWF0dXJlLmJpbmQoX3RoaXMxMiksCisgICAgICAgICAgICAgIGZvbnRSZWdpc3RyeTogZm9udFJlZ2lzdHJ5CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgX3RoaXMxMi5mb250TG9hZGVyLmJpbmQoZm9udClbImNhdGNoIl0oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJGb250RmFsbGJhY2siLCB7CisgICAgICAgICAgICAgICAgaWQ6IGlkCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSlbImZpbmFsbHkiXShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgIGlmICghcGFyYW1zLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5kYXRhKSB7CisgICAgICAgICAgICAgICAgZm9udC5kYXRhID0gbnVsbDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIF90aGlzMTIuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBmb250KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkZvbnRQYXRoIjoKKyAgICAgICAgICBjYXNlICJJbWFnZSI6CisgICAgICAgICAgICBfdGhpczEyLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWREYXRhKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJHb3QgdW5rbm93biBjb21tb24gb2JqZWN0IHR5cGUgIi5jb25jYXQodHlwZSkpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJvYmoiLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBpZiAoX3RoaXMxMi5kZXN0cm95ZWQpIHsKKyAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgdmFyIF9kYXRhMiA9IF9zbGljZWRUb0FycmF5KGRhdGEsIDQpLAorICAgICAgICAgICAgaWQgPSBfZGF0YTJbMF0sCisgICAgICAgICAgICBwYWdlSW5kZXggPSBfZGF0YTJbMV0sCisgICAgICAgICAgICB0eXBlID0gX2RhdGEyWzJdLAorICAgICAgICAgICAgaW1hZ2VEYXRhID0gX2RhdGEyWzNdOworCisgICAgICAgIHZhciBwYWdlUHJveHkgPSBfdGhpczEyLnBhZ2VDYWNoZVtwYWdlSW5kZXhdOworCisgICAgICAgIGlmIChwYWdlUHJveHkub2Jqcy5oYXMoaWQpKSB7CisgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgIGNhc2UgIkltYWdlIjoKKyAgICAgICAgICAgIHBhZ2VQcm94eS5vYmpzLnJlc29sdmUoaWQsIGltYWdlRGF0YSk7CisgICAgICAgICAgICB2YXIgTUFYX0lNQUdFX1NJWkVfVE9fU1RPUkUgPSA4MDAwMDAwOworCisgICAgICAgICAgICBpZiAoaW1hZ2VEYXRhICYmICJkYXRhIiBpbiBpbWFnZURhdGEgJiYgaW1hZ2VEYXRhLmRhdGEubGVuZ3RoID4gTUFYX0lNQUdFX1NJWkVfVE9fU1RPUkUpIHsKKyAgICAgICAgICAgICAgcGFnZVByb3h5LmNsZWFudXBBZnRlclJlbmRlciA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiR290IHVua25vd24gb2JqZWN0IHR5cGUgIi5jb25jYXQodHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0pOworICAgICAgbWVzc2FnZUhhbmRsZXIub24oIkRvY1Byb2dyZXNzIiwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgaWYgKF90aGlzMTIuZGVzdHJveWVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3MpIHsKKyAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHsKKyAgICAgICAgICAgIGxvYWRlZDogZGF0YS5sb2FkZWQsCisgICAgICAgICAgICB0b3RhbDogZGF0YS50b3RhbAorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZS5iaW5kKHRoaXMpKTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJGZXRjaEJ1aWx0SW5DTWFwIiwgZnVuY3Rpb24gKGRhdGEsIHNpbmspIHsKKyAgICAgICAgaWYgKF90aGlzMTIuZGVzdHJveWVkKSB7CisgICAgICAgICAgc2luay5lcnJvcihuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmZXRjaGVkID0gZmFsc2U7CisKKyAgICAgICAgc2luay5vblB1bGwgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgaWYgKGZldGNoZWQpIHsKKyAgICAgICAgICAgIHNpbmsuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmZXRjaGVkID0gdHJ1ZTsKKworICAgICAgICAgIF90aGlzMTIuQ01hcFJlYWRlckZhY3RvcnkuZmV0Y2goZGF0YSkudGhlbihmdW5jdGlvbiAoYnVpbHRJbkNNYXApIHsKKyAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShidWlsdEluQ01hcCwgMSwgW2J1aWx0SW5DTWFwLmNNYXBEYXRhLmJ1ZmZlcl0pOworICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9vblVuc3VwcG9ydGVkRmVhdHVyZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9vblVuc3VwcG9ydGVkRmVhdHVyZShfcmVmMTcpIHsKKyAgICAgIHZhciBmZWF0dXJlSWQgPSBfcmVmMTcuZmVhdHVyZUlkOworCisgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5sb2FkaW5nVGFzay5vblVuc3VwcG9ydGVkRmVhdHVyZSkgeworICAgICAgICB0aGlzLmxvYWRpbmdUYXNrLm9uVW5zdXBwb3J0ZWRGZWF0dXJlKGZlYXR1cmVJZCk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0RGF0YSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERhdGEoKSB7CisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERhdGEiLCBudWxsKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRQYWdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGFnZShwYWdlTnVtYmVyKSB7CisgICAgICB2YXIgX3RoaXMxMyA9IHRoaXM7CisKKyAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSB8fCBwYWdlTnVtYmVyIDw9IDAgfHwgcGFnZU51bWJlciA+IHRoaXMuX251bVBhZ2VzKSB7CisgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkludmFsaWQgcGFnZSByZXF1ZXN0IikpOworICAgICAgfQorCisgICAgICB2YXIgcGFnZUluZGV4ID0gcGFnZU51bWJlciAtIDE7CisKKyAgICAgIGlmIChwYWdlSW5kZXggaW4gdGhpcy5wYWdlUHJvbWlzZXMpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFnZVByb21pc2VzW3BhZ2VJbmRleF07CisgICAgICB9CisKKyAgICAgIHZhciBwcm9taXNlID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2UiLCB7CisgICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChwYWdlSW5mbykgeworICAgICAgICBpZiAoX3RoaXMxMy5kZXN0cm95ZWQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRyYW5zcG9ydCBkZXN0cm95ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwYWdlID0gbmV3IFBERlBhZ2VQcm94eShwYWdlSW5kZXgsIHBhZ2VJbmZvLCBfdGhpczEzLCBfdGhpczEzLl9wYXJhbXMub3duZXJEb2N1bWVudCwgX3RoaXMxMy5fcGFyYW1zLnBkZkJ1Zyk7CisgICAgICAgIF90aGlzMTMucGFnZUNhY2hlW3BhZ2VJbmRleF0gPSBwYWdlOworICAgICAgICByZXR1cm4gcGFnZTsKKyAgICAgIH0pOworICAgICAgdGhpcy5wYWdlUHJvbWlzZXNbcGFnZUluZGV4XSA9IHByb21pc2U7CisgICAgICByZXR1cm4gcHJvbWlzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRQYWdlSW5kZXgiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlSW5kZXgocmVmKSB7CisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2VJbmRleCIsIHsKKyAgICAgICAgcmVmOiByZWYKKyAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihyZWFzb24pKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEFubm90YXRpb25zIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QW5ub3RhdGlvbnMocGFnZUluZGV4LCBpbnRlbnQpIHsKKyAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0QW5ub3RhdGlvbnMiLCB7CisgICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LAorICAgICAgICBpbnRlbnQ6IGludGVudAorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2F2ZURvY3VtZW50IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2F2ZURvY3VtZW50KGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlNhdmVEb2N1bWVudCIsIHsKKyAgICAgICAgbnVtUGFnZXM6IHRoaXMuX251bVBhZ2VzLAorICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogYW5ub3RhdGlvblN0b3JhZ2UgJiYgYW5ub3RhdGlvblN0b3JhZ2UuZ2V0QWxsKCkgfHwgbnVsbCwKKyAgICAgICAgZmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXIgPyB0aGlzLl9mdWxsUmVhZGVyLmZpbGVuYW1lIDogbnVsbAorICAgICAgfSlbImZpbmFsbHkiXShmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlLnJlc2V0TW9kaWZpZWQoKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0RGVzdGluYXRpb25zIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVzdGluYXRpb25zKCkgeworICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREZXN0aW5hdGlvbnMiLCBudWxsKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXREZXN0aW5hdGlvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlc3RpbmF0aW9uKGlkKSB7CisgICAgICBpZiAodHlwZW9mIGlkICE9PSAic3RyaW5nIikgeworICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJJbnZhbGlkIGRlc3RpbmF0aW9uIHJlcXVlc3QuIikpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERlc3RpbmF0aW9uIiwgeworICAgICAgICBpZDogaWQKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFBhZ2VMYWJlbHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlTGFiZWxzKCkgeworICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlTGFiZWxzIiwgbnVsbCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UGFnZUxheW91dCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBhZ2VMYXlvdXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2VMYXlvdXQiLCBudWxsKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRQYWdlTW9kZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBhZ2VNb2RlKCkgeworICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlTW9kZSIsIG51bGwpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFZpZXdlclByZWZlcmVuY2VzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7CisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFZpZXdlclByZWZlcmVuY2VzIiwgbnVsbCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0T3BlbkFjdGlvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9wZW5BY3Rpb24oKSB7CisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldE9wZW5BY3Rpb24iLCBudWxsKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRBdHRhY2htZW50cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRzKCkgeworICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRBdHRhY2htZW50cyIsIG51bGwpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEphdmFTY3JpcHQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRKYXZhU2NyaXB0KCkgeworICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRKYXZhU2NyaXB0IiwgbnVsbCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0T3V0bGluZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE91dGxpbmUoKSB7CisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldE91dGxpbmUiLCBudWxsKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRPcHRpb25hbENvbnRlbnRDb25maWciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSB7CisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsIG51bGwpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBfb3B0aW9uYWxfY29udGVudF9jb25maWcuT3B0aW9uYWxDb250ZW50Q29uZmlnKHJlc3VsdHMpOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UGVybWlzc2lvbnMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQZXJtaXNzaW9ucygpIHsKKyAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGVybWlzc2lvbnMiLCBudWxsKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRNZXRhZGF0YSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1ldGFkYXRhKCkgeworICAgICAgdmFyIF90aGlzMTQgPSB0aGlzOworCisgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldE1ldGFkYXRhIiwgbnVsbCkudGhlbihmdW5jdGlvbiAocmVzdWx0cykgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIGluZm86IHJlc3VsdHNbMF0sCisgICAgICAgICAgbWV0YWRhdGE6IHJlc3VsdHNbMV0gPyBuZXcgX21ldGFkYXRhLk1ldGFkYXRhKHJlc3VsdHNbMV0pIDogbnVsbCwKKyAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogX3RoaXMxNC5fZnVsbFJlYWRlciA/IF90aGlzMTQuX2Z1bGxSZWFkZXIuZmlsZW5hbWUgOiBudWxsCisgICAgICAgIH07CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRTdGF0cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN0YXRzKCkgeworICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRTdGF0cyIsIG51bGwpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInN0YXJ0Q2xlYW51cCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0Q2xlYW51cCgpIHsKKyAgICAgIHZhciBfdGhpczE1ID0gdGhpczsKKworICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJDbGVhbnVwIiwgbnVsbCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IF90aGlzMTUucGFnZUNhY2hlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICB2YXIgcGFnZSA9IF90aGlzMTUucGFnZUNhY2hlW2ldOworCisgICAgICAgICAgaWYgKHBhZ2UpIHsKKyAgICAgICAgICAgIHZhciBjbGVhbnVwU3VjY2Vzc2Z1bCA9IHBhZ2UuY2xlYW51cCgpOworCisgICAgICAgICAgICBpZiAoIWNsZWFudXBTdWNjZXNzZnVsKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigic3RhcnRDbGVhbnVwOiBQYWdlICIuY29uY2F0KGkgKyAxLCAiIGlzIGN1cnJlbnRseSByZW5kZXJpbmcuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIF90aGlzMTUuY29tbW9uT2Jqcy5jbGVhcigpOworCisgICAgICAgIF90aGlzMTUuZm9udExvYWRlci5jbGVhcigpOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAibG9hZGluZ1BhcmFtcyIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgcGFyYW1zID0gdGhpcy5fcGFyYW1zOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJsb2FkaW5nUGFyYW1zIiwgeworICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBwYXJhbXMuZGlzYWJsZUF1dG9GZXRjaCwKKyAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBwYXJhbXMuZGlzYWJsZUZvbnRGYWNlCisgICAgICB9KTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gV29ya2VyVHJhbnNwb3J0OworfSgpOworCit2YXIgUERGT2JqZWN0cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBERk9iamVjdHMoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERk9iamVjdHMpOworCisgICAgdGhpcy5fb2JqcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGT2JqZWN0cywgW3sKKyAgICBrZXk6ICJfZW5zdXJlT2JqIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2Vuc3VyZU9iaihvYmpJZCkgeworICAgICAgaWYgKHRoaXMuX29ianNbb2JqSWRdKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9vYmpzW29iaklkXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX29ianNbb2JqSWRdID0geworICAgICAgICBjYXBhYmlsaXR5OiAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCksCisgICAgICAgIGRhdGE6IG51bGwsCisgICAgICAgIHJlc29sdmVkOiBmYWxzZQorICAgICAgfTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQob2JqSWQpIHsKKyAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDsKKworICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIHRoaXMuX2Vuc3VyZU9iaihvYmpJZCkuY2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oY2FsbGJhY2spOworCisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICB2YXIgb2JqID0gdGhpcy5fb2Jqc1tvYmpJZF07CisKKyAgICAgIGlmICghb2JqIHx8ICFvYmoucmVzb2x2ZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJSZXF1ZXN0aW5nIG9iamVjdCB0aGF0IGlzbid0IHJlc29sdmVkIHlldCAiLmNvbmNhdChvYmpJZCwgIi4iKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvYmouZGF0YTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoYXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMob2JqSWQpIHsKKyAgICAgIHZhciBvYmogPSB0aGlzLl9vYmpzW29iaklkXTsKKyAgICAgIHJldHVybiBvYmogPyBvYmoucmVzb2x2ZWQgOiBmYWxzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZXNvbHZlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVzb2x2ZShvYmpJZCwgZGF0YSkgeworICAgICAgdmFyIG9iaiA9IHRoaXMuX2Vuc3VyZU9iaihvYmpJZCk7CisKKyAgICAgIG9iai5yZXNvbHZlZCA9IHRydWU7CisgICAgICBvYmouZGF0YSA9IGRhdGE7CisgICAgICBvYmouY2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNsZWFyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7CisgICAgICB0aGlzLl9vYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGT2JqZWN0czsKK30oKTsKKwordmFyIFJlbmRlclRhc2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBSZW5kZXJUYXNrKGludGVybmFsUmVuZGVyVGFzaykgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZW5kZXJUYXNrKTsKKworICAgIHRoaXMuX2ludGVybmFsUmVuZGVyVGFzayA9IGludGVybmFsUmVuZGVyVGFzazsKKyAgICB0aGlzLm9uQ29udGludWUgPSBudWxsOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFJlbmRlclRhc2ssIFt7CisgICAga2V5OiAiY2FuY2VsIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsKCkgeworICAgICAgdGhpcy5faW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbCgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInByb21pc2UiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFJlbmRlclRhc2s7Cit9KCk7CisKK3ZhciBJbnRlcm5hbFJlbmRlclRhc2sgPSBmdW5jdGlvbiBJbnRlcm5hbFJlbmRlclRhc2tDbG9zdXJlKCkgeworICB2YXIgY2FudmFzSW5SZW5kZXJpbmcgPSBuZXcgV2Vha1NldCgpOworCisgIHZhciBJbnRlcm5hbFJlbmRlclRhc2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICAgIGZ1bmN0aW9uIEludGVybmFsUmVuZGVyVGFzayhfcmVmMTgpIHsKKyAgICAgIHZhciBjYWxsYmFjayA9IF9yZWYxOC5jYWxsYmFjaywKKyAgICAgICAgICBwYXJhbXMgPSBfcmVmMTgucGFyYW1zLAorICAgICAgICAgIG9ianMgPSBfcmVmMTgub2JqcywKKyAgICAgICAgICBjb21tb25PYmpzID0gX3JlZjE4LmNvbW1vbk9ianMsCisgICAgICAgICAgb3BlcmF0b3JMaXN0ID0gX3JlZjE4Lm9wZXJhdG9yTGlzdCwKKyAgICAgICAgICBwYWdlSW5kZXggPSBfcmVmMTgucGFnZUluZGV4LAorICAgICAgICAgIGNhbnZhc0ZhY3RvcnkgPSBfcmVmMTguY2FudmFzRmFjdG9yeSwKKyAgICAgICAgICB3ZWJHTENvbnRleHQgPSBfcmVmMTgud2ViR0xDb250ZXh0LAorICAgICAgICAgIF9yZWYxOCR1c2VSZXF1ZXN0QW5pbSA9IF9yZWYxOC51c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsCisgICAgICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gX3JlZjE4JHVzZVJlcXVlc3RBbmltID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYxOCR1c2VSZXF1ZXN0QW5pbSwKKyAgICAgICAgICBfcmVmMTgkcGRmQnVnID0gX3JlZjE4LnBkZkJ1ZywKKyAgICAgICAgICBwZGZCdWcgPSBfcmVmMTgkcGRmQnVnID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYxOCRwZGZCdWc7CisKKyAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnRlcm5hbFJlbmRlclRhc2spOworCisgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgIHRoaXMub2JqcyA9IG9ianM7CisgICAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzOworICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSBudWxsOworICAgICAgdGhpcy5vcGVyYXRvckxpc3QgPSBvcGVyYXRvckxpc3Q7CisgICAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7CisgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5OworICAgICAgdGhpcy53ZWJHTENvbnRleHQgPSB3ZWJHTENvbnRleHQ7CisgICAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7CisgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gbnVsbDsKKyAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9IGZhbHNlOworICAgICAgdGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSB0cnVlICYmIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiOworICAgICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMuY2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHRoaXMudGFzayA9IG5ldyBSZW5kZXJUYXNrKHRoaXMpOworICAgICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7CisgICAgICB0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCA9IHRoaXMuX3NjaGVkdWxlTmV4dC5iaW5kKHRoaXMpOworICAgICAgdGhpcy5fbmV4dEJvdW5kID0gdGhpcy5fbmV4dC5iaW5kKHRoaXMpOworICAgICAgdGhpcy5fY2FudmFzID0gcGFyYW1zLmNhbnZhc0NvbnRleHQuY2FudmFzOworICAgIH0KKworICAgIF9jcmVhdGVDbGFzcyhJbnRlcm5hbFJlbmRlclRhc2ssIFt7CisgICAgICBrZXk6ICJpbml0aWFsaXplR3JhcGhpY3MiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemVHcmFwaGljcyhfcmVmMTkpIHsKKyAgICAgICAgdmFyIF9yZWYxOSR0cmFuc3BhcmVuY3kgPSBfcmVmMTkudHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gX3JlZjE5JHRyYW5zcGFyZW5jeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMTkkdHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnID0gX3JlZjE5Lm9wdGlvbmFsQ29udGVudENvbmZpZzsKKworICAgICAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5fY2FudmFzKSB7CisgICAgICAgICAgaWYgKGNhbnZhc0luUmVuZGVyaW5nLmhhcyh0aGlzLl9jYW52YXMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCB1c2UgdGhlIHNhbWUgY2FudmFzIGR1cmluZyBtdWx0aXBsZSByZW5kZXIoKSBvcGVyYXRpb25zLiAiICsgIlVzZSBkaWZmZXJlbnQgY2FudmFzIG9yIGVuc3VyZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgIiArICJjYW5jZWxsZWQgb3IgY29tcGxldGVkLiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGNhbnZhc0luUmVuZGVyaW5nLmFkZCh0aGlzLl9jYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuX3BkZkJ1ZyAmJiBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyICYmIGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIuZW5hYmxlZCkgeworICAgICAgICAgIHRoaXMuc3RlcHBlciA9IGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIuY3JlYXRlKHRoaXMuX3BhZ2VJbmRleCk7CisgICAgICAgICAgdGhpcy5zdGVwcGVyLmluaXQodGhpcy5vcGVyYXRvckxpc3QpOworICAgICAgICAgIHRoaXMuc3RlcHBlci5uZXh0QnJlYWtQb2ludCA9IHRoaXMuc3RlcHBlci5nZXROZXh0QnJlYWtQb2ludCgpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIF90aGlzJHBhcmFtcyA9IHRoaXMucGFyYW1zLAorICAgICAgICAgICAgY2FudmFzQ29udGV4dCA9IF90aGlzJHBhcmFtcy5jYW52YXNDb250ZXh0LAorICAgICAgICAgICAgdmlld3BvcnQgPSBfdGhpcyRwYXJhbXMudmlld3BvcnQsCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBfdGhpcyRwYXJhbXMudHJhbnNmb3JtLAorICAgICAgICAgICAgaW1hZ2VMYXllciA9IF90aGlzJHBhcmFtcy5pbWFnZUxheWVyLAorICAgICAgICAgICAgYmFja2dyb3VuZCA9IF90aGlzJHBhcmFtcy5iYWNrZ3JvdW5kOworICAgICAgICB0aGlzLmdmeCA9IG5ldyBfY2FudmFzLkNhbnZhc0dyYXBoaWNzKGNhbnZhc0NvbnRleHQsIHRoaXMuY29tbW9uT2JqcywgdGhpcy5vYmpzLCB0aGlzLmNhbnZhc0ZhY3RvcnksIHRoaXMud2ViR0xDb250ZXh0LCBpbWFnZUxheWVyLCBvcHRpb25hbENvbnRlbnRDb25maWcpOworICAgICAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoeworICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLAorICAgICAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydCwKKyAgICAgICAgICB0cmFuc3BhcmVuY3k6IHRyYW5zcGFyZW5jeSwKKyAgICAgICAgICBiYWNrZ3JvdW5kOiBiYWNrZ3JvdW5kCisgICAgICAgIH0pOworICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IDA7CisgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9IHRydWU7CisKKyAgICAgICAgaWYgKHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrKSB7CisgICAgICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImNhbmNlbCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsKCkgeworICAgICAgICB2YXIgZXJyb3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7CisgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOworICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7CisKKyAgICAgICAgaWYgKHRoaXMuZ2Z4KSB7CisgICAgICAgICAgdGhpcy5nZnguZW5kRHJhd2luZygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuX2NhbnZhcykgeworICAgICAgICAgIGNhbnZhc0luUmVuZGVyaW5nWyJkZWxldGUiXSh0aGlzLl9jYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jYWxsYmFjayhlcnJvciB8fCBuZXcgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKCJSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICIuY29uY2F0KHRoaXMuX3BhZ2VJbmRleCArIDEpLCAiY2FudmFzIikpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogIm9wZXJhdG9yTGlzdENoYW5nZWQiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7CisgICAgICAgIGlmICghdGhpcy5ncmFwaGljc1JlYWR5KSB7CisgICAgICAgICAgaWYgKCF0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaykgeworICAgICAgICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSB0aGlzLl9jb250aW51ZUJvdW5kOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLnN0ZXBwZXIpIHsKKyAgICAgICAgICB0aGlzLnN0ZXBwZXIudXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLnJ1bm5pbmcpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9jb250aW51ZSgpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogIl9jb250aW51ZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gX2NvbnRpbnVlKCkgeworICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlOworCisgICAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLnRhc2sub25Db250aW51ZSkgeworICAgICAgICAgIHRoaXMudGFzay5vbkNvbnRpbnVlKHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLl9zY2hlZHVsZU5leHQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogIl9zY2hlZHVsZU5leHQiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zY2hlZHVsZU5leHQoKSB7CisgICAgICAgIHZhciBfdGhpczE2ID0gdGhpczsKKworICAgICAgICBpZiAodGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7CisgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBfdGhpczE2Ll9uZXh0Qm91bmQoKVsiY2F0Y2giXShfdGhpczE2LmNhbmNlbC5iaW5kKF90aGlzMTYpKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZClbImNhdGNoIl0odGhpcy5jYW5jZWwuYmluZCh0aGlzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJfbmV4dCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgX25leHQyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgeworICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIpOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSB0aGlzLmdmeC5leGVjdXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0LCB0aGlzLm9wZXJhdG9yTGlzdElkeCwgdGhpcy5fY29udGludWVCb3VuZCwgdGhpcy5zdGVwcGVyKTsKKworICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0SWR4ID09PSB0aGlzLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHsKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FudmFzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNJblJlbmRlcmluZ1siZGVsZXRlIl0odGhpcy5fY2FudmFzKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7CisgICAgICAgIH0pKTsKKworICAgICAgICBmdW5jdGlvbiBfbmV4dCgpIHsKKyAgICAgICAgICByZXR1cm4gX25leHQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX25leHQ7CisgICAgICB9KCkKKyAgICB9LCB7CisgICAgICBrZXk6ICJjb21wbGV0ZWQiLAorICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNhcGFiaWxpdHkucHJvbWlzZVsiY2F0Y2giXShmdW5jdGlvbiAoKSB7fSk7CisgICAgICB9CisgICAgfV0pOworCisgICAgcmV0dXJuIEludGVybmFsUmVuZGVyVGFzazsKKyAgfSgpOworCisgIHJldHVybiBJbnRlcm5hbFJlbmRlclRhc2s7Cit9KCk7CisKK3ZhciB2ZXJzaW9uID0gJzIuNi4zNDcnOworZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjsKK3ZhciBidWlsZCA9ICczYmU5YzY1Zic7CitleHBvcnRzLmJ1aWxkID0gYnVpbGQ7CisKKy8qKiovIH0pLAorLyogMjAzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRm9udExvYWRlciA9IGV4cG9ydHMuRm9udEZhY2VPYmplY3QgPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oMikpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCitmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAiZGVmYXVsdCI6IG9iaiB9OyB9CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH0KKworZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7IGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBCYXNlRm9udExvYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEJhc2VGb250TG9hZGVyKF9yZWYpIHsKKyAgICB2YXIgZG9jSWQgPSBfcmVmLmRvY0lkLAorICAgICAgICBvblVuc3VwcG9ydGVkRmVhdHVyZSA9IF9yZWYub25VbnN1cHBvcnRlZEZlYXR1cmUsCisgICAgICAgIF9yZWYkb3duZXJEb2N1bWVudCA9IF9yZWYub3duZXJEb2N1bWVudCwKKyAgICAgICAgb3duZXJEb2N1bWVudCA9IF9yZWYkb3duZXJEb2N1bWVudCA9PT0gdm9pZCAwID8gZ2xvYmFsVGhpcy5kb2N1bWVudCA6IF9yZWYkb3duZXJEb2N1bWVudDsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCYXNlRm9udExvYWRlcik7CisKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUZvbnRMb2FkZXIpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGb250TG9hZGVyLiIpOworICAgIH0KKworICAgIHRoaXMuZG9jSWQgPSBkb2NJZDsKKyAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSA9IG9uVW5zdXBwb3J0ZWRGZWF0dXJlOworICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDsKKyAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcyA9IFtdOworICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhCYXNlRm9udExvYWRlciwgW3sKKyAgICBrZXk6ICJhZGROYXRpdmVGb250RmFjZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKSB7CisgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5wdXNoKG5hdGl2ZUZvbnRGYWNlKTsKKworICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuYWRkKG5hdGl2ZUZvbnRGYWNlKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpbnNlcnRSdWxlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0UnVsZShydWxlKSB7CisgICAgICB2YXIgc3R5bGVFbGVtZW50ID0gdGhpcy5zdHlsZUVsZW1lbnQ7CisKKyAgICAgIGlmICghc3R5bGVFbGVtZW50KSB7CisgICAgICAgIHN0eWxlRWxlbWVudCA9IHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKKyAgICAgICAgc3R5bGVFbGVtZW50LmlkID0gIlBERkpTX0ZPTlRfU1RZTEVfVEFHXyIuY29uY2F0KHRoaXMuZG9jSWQpOworCisgICAgICAgIHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7CisgICAgICB9CisKKyAgICAgIHZhciBzdHlsZVNoZWV0ID0gc3R5bGVFbGVtZW50LnNoZWV0OworICAgICAgc3R5bGVTaGVldC5pbnNlcnRSdWxlKHJ1bGUsIHN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjbGVhciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdGhpcy5uYXRpdmVGb250RmFjZXMuZm9yRWFjaChmdW5jdGlvbiAobmF0aXZlRm9udEZhY2UpIHsKKyAgICAgICAgX3RoaXMuX2RvY3VtZW50LmZvbnRzWyJkZWxldGUiXShuYXRpdmVGb250RmFjZSk7CisgICAgICB9KTsKKyAgICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmxlbmd0aCA9IDA7CisKKyAgICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkgeworICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTsKKyAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBudWxsOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImJpbmQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX2JpbmQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShmb250KSB7CisgICAgICAgIHZhciBfdGhpczIgPSB0aGlzOworCisgICAgICAgIHZhciBuYXRpdmVGb250RmFjZSwgcnVsZTsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYgKCEoZm9udC5hdHRhY2hlZCB8fCBmb250Lm1pc3NpbmdGaWxlKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZm9udC5hdHRhY2hlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE5OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbmF0aXZlRm9udEZhY2UgPSBmb250LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZUZvbnRGYWNlKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKTsKKyAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNzsKKyAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUZvbnRGYWNlLmxvYWRlZDsKKworICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMjsKKyAgICAgICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0WyJjYXRjaCJdKDcpOworCisgICAgICAgICAgICAgICAgdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUoeworICAgICAgICAgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRMb2FkTmF0aXZlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkZhaWxlZCB0byBsb2FkIGZvbnQgJyIuY29uY2F0KG5hdGl2ZUZvbnRGYWNlLmZhbWlseSwgIic6ICciKS5jb25jYXQoX2NvbnRleHQudDAsICInLiIpKTsKKyAgICAgICAgICAgICAgICBmb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhyb3cgX2NvbnRleHQudDA7CisKKyAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKKworICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgIHJ1bGUgPSBmb250LmNyZWF0ZUZvbnRGYWNlUnVsZSgpOworCisgICAgICAgICAgICAgICAgaWYgKCFydWxlKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLmluc2VydFJ1bGUocnVsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIpOworCisgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI2OworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBfdGhpczIuX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHJlc29sdmUpOworCisgICAgICAgICAgICAgICAgICBfdGhpczIuX3ByZXBhcmVGb250TG9hZEV2ZW50KFtydWxlXSwgW2ZvbnRdLCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlLCB0aGlzLCBbWzcsIDEyXV0pOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBiaW5kKF94KSB7CisgICAgICAgIHJldHVybiBfYmluZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gYmluZDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogIl9xdWV1ZUxvYWRpbmdDYWxsYmFjayIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9xdWV1ZUxvYWRpbmdDYWxsYmFjayhjYWxsYmFjaykgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfcXVldWVMb2FkaW5nQ2FsbGJhY2tgLiIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9wcmVwYXJlRm9udExvYWRFdmVudCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9wcmVwYXJlRm9udExvYWRFdmVudChydWxlcywgZm9udHNUb0xvYWQsIHJlcXVlc3QpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgX3ByZXBhcmVGb250TG9hZEV2ZW50YC4iKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBzdXBwb3J0ZWQgPSB0eXBlb2YgdGhpcy5fZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmICEhdGhpcy5fZG9jdW1lbnQuZm9udHM7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQiLCBzdXBwb3J0ZWQpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRgLiIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9sb2FkVGVzdEZvbnQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfbG9hZFRlc3RGb250YC4iKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQmFzZUZvbnRMb2FkZXI7Cit9KCk7CisKK3ZhciBGb250TG9hZGVyOworZXhwb3J0cy5Gb250TG9hZGVyID0gRm9udExvYWRlcjsKK3sKKyAgZXhwb3J0cy5Gb250TG9hZGVyID0gRm9udExvYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VGb250TG9hZGVyKSB7CisgICAgX2luaGVyaXRzKEdlbmVyaWNGb250TG9hZGVyLCBfQmFzZUZvbnRMb2FkZXIpOworCisgICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihHZW5lcmljRm9udExvYWRlcik7CisKKyAgICBmdW5jdGlvbiBHZW5lcmljRm9udExvYWRlcihwYXJhbXMpIHsKKyAgICAgIHZhciBfdGhpczM7CisKKyAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBHZW5lcmljRm9udExvYWRlcik7CisKKyAgICAgIF90aGlzMyA9IF9zdXBlci5jYWxsKHRoaXMsIHBhcmFtcyk7CisgICAgICBfdGhpczMubG9hZGluZ0NvbnRleHQgPSB7CisgICAgICAgIHJlcXVlc3RzOiBbXSwKKyAgICAgICAgbmV4dFJlcXVlc3RJZDogMAorICAgICAgfTsKKyAgICAgIF90aGlzMy5sb2FkVGVzdEZvbnRJZCA9IDA7CisgICAgICByZXR1cm4gX3RoaXMzOworICAgIH0KKworICAgIF9jcmVhdGVDbGFzcyhHZW5lcmljRm9udExvYWRlciwgW3sKKyAgICAgIGtleTogIl9xdWV1ZUxvYWRpbmdDYWxsYmFjayIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKGNhbGxiYWNrKSB7CisgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlUmVxdWVzdCgpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSghcmVxdWVzdC5kb25lLCAiY29tcGxldGVSZXF1ZXN0KCkgY2Fubm90IGJlIGNhbGxlZCB0d2ljZS4iKTsKKyAgICAgICAgICByZXF1ZXN0LmRvbmUgPSB0cnVlOworCisgICAgICAgICAgd2hpbGUgKGNvbnRleHQucmVxdWVzdHMubGVuZ3RoID4gMCAmJiBjb250ZXh0LnJlcXVlc3RzWzBdLmRvbmUpIHsKKyAgICAgICAgICAgIHZhciBvdGhlclJlcXVlc3QgPSBjb250ZXh0LnJlcXVlc3RzLnNoaWZ0KCk7CisgICAgICAgICAgICBzZXRUaW1lb3V0KG90aGVyUmVxdWVzdC5jYWxsYmFjaywgMCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmxvYWRpbmdDb250ZXh0OworICAgICAgICB2YXIgcmVxdWVzdCA9IHsKKyAgICAgICAgICBpZDogInBkZmpzLWZvbnQtbG9hZGluZy0iLmNvbmNhdChjb250ZXh0Lm5leHRSZXF1ZXN0SWQrKyksCisgICAgICAgICAgZG9uZTogZmFsc2UsCisgICAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlUmVxdWVzdCwKKyAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2sKKyAgICAgICAgfTsKKyAgICAgICAgY29udGV4dC5yZXF1ZXN0cy5wdXNoKHJlcXVlc3QpOworICAgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJfcHJlcGFyZUZvbnRMb2FkRXZlbnQiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9wcmVwYXJlRm9udExvYWRFdmVudChydWxlcywgZm9udHMsIHJlcXVlc3QpIHsKKyAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CisKKyAgICAgICAgZnVuY3Rpb24gaW50MzIoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgICAgcmV0dXJuIGRhdGEuY2hhckNvZGVBdChvZmZzZXQpIDw8IDI0IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDIpIDw8IDggfCBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMykgJiAweGZmOworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gc3BsaWNlU3RyaW5nKHMsIG9mZnNldCwgcmVtb3ZlLCBpbnNlcnQpIHsKKyAgICAgICAgICB2YXIgY2h1bmsxID0gcy5zdWJzdHJpbmcoMCwgb2Zmc2V0KTsKKyAgICAgICAgICB2YXIgY2h1bmsyID0gcy5zdWJzdHJpbmcob2Zmc2V0ICsgcmVtb3ZlKTsKKyAgICAgICAgICByZXR1cm4gY2h1bmsxICsgaW5zZXJ0ICsgY2h1bmsyOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGksIGlpOworCisgICAgICAgIHZhciBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKKworICAgICAgICBjYW52YXMud2lkdGggPSAxOworICAgICAgICBjYW52YXMuaGVpZ2h0ID0gMTsKKyAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOworICAgICAgICB2YXIgY2FsbGVkID0gMDsKKworICAgICAgICBmdW5jdGlvbiBpc0ZvbnRSZWFkeShuYW1lLCBjYWxsYmFjaykgeworICAgICAgICAgIGNhbGxlZCsrOworCisgICAgICAgICAgaWYgKGNhbGxlZCA+IDMwKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkxvYWQgdGVzdCBmb250IG5ldmVyIGxvYWRlZC4iKTsKKyAgICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgY3R4LmZvbnQgPSAiMzBweCAiICsgbmFtZTsKKyAgICAgICAgICBjdHguZmlsbFRleHQoIi4iLCAwLCAyMCk7CisgICAgICAgICAgdmFyIGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7CisKKyAgICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbM10gPiAwKSB7CisgICAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHNldFRpbWVvdXQoaXNGb250UmVhZHkuYmluZChudWxsLCBuYW1lLCBjYWxsYmFjaykpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvYWRUZXN0Rm9udElkID0gImx0Ii5jb25jYXQoRGF0ZS5ub3coKSkuY29uY2F0KHRoaXMubG9hZFRlc3RGb250SWQrKyk7CisgICAgICAgIHZhciBkYXRhID0gdGhpcy5fbG9hZFRlc3RGb250OworICAgICAgICB2YXIgQ09NTUVOVF9PRkZTRVQgPSA5NzY7CisgICAgICAgIGRhdGEgPSBzcGxpY2VTdHJpbmcoZGF0YSwgQ09NTUVOVF9PRkZTRVQsIGxvYWRUZXN0Rm9udElkLmxlbmd0aCwgbG9hZFRlc3RGb250SWQpOworICAgICAgICB2YXIgQ0ZGX0NIRUNLU1VNX09GRlNFVCA9IDE2OworICAgICAgICB2YXIgWFhYWF9WQUxVRSA9IDB4NTg1ODU4NTg7CisgICAgICAgIHZhciBjaGVja3N1bSA9IGludDMyKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQpOworCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gbG9hZFRlc3RGb250SWQubGVuZ3RoIC0gMzsgaSA8IGlpOyBpICs9IDQpIHsKKyAgICAgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtIC0gWFhYWF9WQUxVRSArIGludDMyKGxvYWRUZXN0Rm9udElkLCBpKSB8IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IGxvYWRUZXN0Rm9udElkLmxlbmd0aCkgeworICAgICAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQgKyAiWFhYIiwgaSkgfCAwOworICAgICAgICB9CisKKyAgICAgICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDRkZfQ0hFQ0tTVU1fT0ZGU0VULCA0LCAoMCwgX3V0aWwuc3RyaW5nMzIpKGNoZWNrc3VtKSk7CisgICAgICAgIHZhciB1cmwgPSAidXJsKGRhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsIi5jb25jYXQoYnRvYShkYXRhKSwgIik7Iik7CisgICAgICAgIHZhciBydWxlID0gIkBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OlwiIi5jb25jYXQobG9hZFRlc3RGb250SWQsICJcIjtzcmM6IikuY29uY2F0KHVybCwgIn0iKTsKKyAgICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpOworICAgICAgICB2YXIgbmFtZXMgPSBbXTsKKworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGZvbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBuYW1lcy5wdXNoKGZvbnRzW2ldLmxvYWRlZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgbmFtZXMucHVzaChsb2FkVGVzdEZvbnRJZCk7CisKKyAgICAgICAgdmFyIGRpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCisgICAgICAgIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CisgICAgICAgIGRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5oZWlnaHQgPSAiMTBweCI7CisgICAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisgICAgICAgIGRpdi5zdHlsZS50b3AgPSBkaXYuc3R5bGUubGVmdCA9ICIwcHgiOworCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIHZhciBzcGFuID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworCisgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9ICJIaSI7CisgICAgICAgICAgc3Bhbi5zdHlsZS5mb250RmFtaWx5ID0gbmFtZXNbaV07CisgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHNwYW4pOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpOworCisgICAgICAgIGlzRm9udFJlYWR5KGxvYWRUZXN0Rm9udElkLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgX3RoaXM0Ll9kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7CisKKyAgICAgICAgICByZXF1ZXN0LmNvbXBsZXRlKCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkIiwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICB2YXIgc3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgbSA9IC9Nb3ppbGxhXC81LjAuKj9ydjooXGQrKS4qPyBHZWNrby8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KTsKKworICAgICAgICAgIGlmIChtICYmIG1bMV0gPj0gMTQpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCIsIHN1cHBvcnRlZCk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiX2xvYWRUZXN0Rm9udCIsCisgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgICAgdmFyIGdldExvYWRUZXN0Rm9udCA9IGZ1bmN0aW9uIGdldExvYWRUZXN0Rm9udCgpIHsKKyAgICAgICAgICByZXR1cm4gYXRvYigiVDFSVVR3QUxBSUFBQXdBd1EwWkdJREh0Wmc0QUFBT1lBQUFBZ1VaR1ZFMWxrelp3QUFBRUhBQUFBQnhIUkVWR0FCUUEiICsgIkZRQUFCRGdBQUFBZVQxTXZNbFlOWXdrQUFBRWdBQUFBWUdOdFlYQUJEUUxVQUFBQ05BQUFBVUpvWldGay94VkZEUUFBIiArICJBTHdBQUFBMmFHaGxZUWRrQStvQUFBRDBBQUFBSkdodGRIZ0Q2QUFBQUFBRVdBQUFBQVp0WVhod0FBSlFBQUFBQVJnQSIgKyAiQUFBR2JtRnRaVmptZEg0QUFBR0FBQUFBc1hCdmMzVC9oZ0F6QUFBRGVBQUFBQ0FBQVFBQUFBRUFBTFpSRnNSZkR6ejEiICsgIkFBc0Q2QUFBQUFET0JPVExBQUFBQU00S0hEd0FBQUFBQStnRElRQUFBQWdBQWdBQUFBQUFBQUFCQUFBRElRQUFBRm9EIiArICI2QUFBQUFBRDZBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFVQUFBQWdBQUFBUUQ2QUgwQUFVQUFBS0tBcndBQUFDTSIgKyAiQW9vQ3ZBQUFBZUFBTVFFQ0FBQUNBQVlKQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFGQm1SV1FBd0FBdUFDNEQiICsgIklQODRBRm9ESVFBQUFBQUFBUUFBQUFBQUFBQUFBQ0FBSUFBQkFBQUFEZ0N1QUFFQUFBQUFBQUFBQVFBQUFBRUFBQUFBIiArICJBQUVBQVFBQUFBRUFBQUFBQUFJQUFRQUFBQUVBQUFBQUFBTUFBUUFBQUFFQUFBQUFBQVFBQVFBQUFBRUFBQUFBQUFVQSIgKyAiQVFBQUFBRUFBQUFBQUFZQUFRQUFBQU1BQVFRSkFBQUFBZ0FCQUFNQUFRUUpBQUVBQWdBQkFBTUFBUVFKQUFJQUFnQUIiICsgIkFBTUFBUVFKQUFNQUFnQUJBQU1BQVFRSkFBUUFBZ0FCQUFNQUFRUUpBQVVBQWdBQkFBTUFBUVFKQUFZQUFnQUJXQUJZIiArICJBQUFBQUFBQUF3QUFBQU1BQUFBY0FBRUFBQUFBQUR3QUF3QUJBQUFBSEFBRUFDQUFBQUFFQUFRQUFRQUFBQzcvL3dBQSIgKyAiQUM3Ly8vL1RBQUVBQUFBQUFBQUJCZ0FBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiICsgIkFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIiArICJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIgKyAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiICsgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIiArICJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQUFBQUFBQUQvZ3dBeUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQSIgKyAiQUFBQkFBUUVBQUVCQVFKWUFBRUJBU0g0RHdENEd3SEVBdmdjQS9nWEJJd01BWXVMK256NXRRWGtENWozQ0JMbkVRQUMiICsgIkFRRUJJVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWUFBQUJBUUFBRHdBQ0FRRUVFL3QzIiArICJEb3Y2ZkFINmZBVCtmUHA4K253SERvc01Ddm0xQ3ZtMURBejZmQlFBQUFBQUFBQUJBQUFBQU1tSmJ6RUFBQUFBemdUaiIgKyAiRlFBQUFBRE9CT1FwQUFFQUFBQUFBQUFBREFBVUFBUUFBQUFCQUFBQUFnQUJBQUFBQUFBQUFBQUQ2QUFBQUFBQUFBPT0iKTsKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIl9sb2FkVGVzdEZvbnQiLCBnZXRMb2FkVGVzdEZvbnQoKSk7CisgICAgICB9CisgICAgfV0pOworCisgICAgcmV0dXJuIEdlbmVyaWNGb250TG9hZGVyOworICB9KEJhc2VGb250TG9hZGVyKTsKK30KKwordmFyIEZvbnRGYWNlT2JqZWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gRm9udEZhY2VPYmplY3QodHJhbnNsYXRlZERhdGEsIF9yZWYyKSB7CisgICAgdmFyIF9yZWYyJGlzRXZhbFN1cHBvcnRlZCA9IF9yZWYyLmlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgaXNFdmFsU3VwcG9ydGVkID0gX3JlZjIkaXNFdmFsU3VwcG9ydGVkID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjIkaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICBfcmVmMiRkaXNhYmxlRm9udEZhY2UgPSBfcmVmMi5kaXNhYmxlRm9udEZhY2UsCisgICAgICAgIGRpc2FibGVGb250RmFjZSA9IF9yZWYyJGRpc2FibGVGb250RmFjZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiRkaXNhYmxlRm9udEZhY2UsCisgICAgICAgIF9yZWYyJGlnbm9yZUVycm9ycyA9IF9yZWYyLmlnbm9yZUVycm9ycywKKyAgICAgICAgaWdub3JlRXJyb3JzID0gX3JlZjIkaWdub3JlRXJyb3JzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJGlnbm9yZUVycm9ycywKKyAgICAgICAgX3JlZjIkb25VbnN1cHBvcnRlZEZlID0gX3JlZjIub25VbnN1cHBvcnRlZEZlYXR1cmUsCisgICAgICAgIG9uVW5zdXBwb3J0ZWRGZWF0dXJlID0gX3JlZjIkb25VbnN1cHBvcnRlZEZlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjIkb25VbnN1cHBvcnRlZEZlLAorICAgICAgICBfcmVmMiRmb250UmVnaXN0cnkgPSBfcmVmMi5mb250UmVnaXN0cnksCisgICAgICAgIGZvbnRSZWdpc3RyeSA9IF9yZWYyJGZvbnRSZWdpc3RyeSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYyJGZvbnRSZWdpc3RyeTsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb250RmFjZU9iamVjdCk7CisKKyAgICB0aGlzLmNvbXBpbGVkR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgIGZvciAodmFyIGkgaW4gdHJhbnNsYXRlZERhdGEpIHsKKyAgICAgIHRoaXNbaV0gPSB0cmFuc2xhdGVkRGF0YVtpXTsKKyAgICB9CisKKyAgICB0aGlzLmlzRXZhbFN1cHBvcnRlZCA9IGlzRXZhbFN1cHBvcnRlZCAhPT0gZmFsc2U7CisgICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBkaXNhYmxlRm9udEZhY2UgPT09IHRydWU7CisgICAgdGhpcy5pZ25vcmVFcnJvcnMgPSBpZ25vcmVFcnJvcnMgPT09IHRydWU7CisgICAgdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUgPSBvblVuc3VwcG9ydGVkRmVhdHVyZTsKKyAgICB0aGlzLmZvbnRSZWdpc3RyeSA9IGZvbnRSZWdpc3RyeTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhGb250RmFjZU9iamVjdCwgW3sKKyAgICBrZXk6ICJjcmVhdGVOYXRpdmVGb250RmFjZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCkgeworICAgICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kaXNhYmxlRm9udEZhY2UpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciBuYXRpdmVGb250RmFjZSA9IG5ldyBGb250RmFjZSh0aGlzLmxvYWRlZE5hbWUsIHRoaXMuZGF0YSwge30pOworCisgICAgICBpZiAodGhpcy5mb250UmVnaXN0cnkpIHsKKyAgICAgICAgdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMpOworICAgICAgfQorCisgICAgICByZXR1cm4gbmF0aXZlRm9udEZhY2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY3JlYXRlRm9udEZhY2VSdWxlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlRm9udEZhY2VSdWxlKCkgeworICAgICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kaXNhYmxlRm9udEZhY2UpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciBkYXRhID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSkpOworICAgICAgdmFyIHVybCA9ICJ1cmwoZGF0YToiLmNvbmNhdCh0aGlzLm1pbWV0eXBlLCAiO2Jhc2U2NCwiKS5jb25jYXQoYnRvYShkYXRhKSwgIik7Iik7CisgICAgICB2YXIgcnVsZSA9ICJAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiIuY29uY2F0KHRoaXMubG9hZGVkTmFtZSwgIlwiO3NyYzoiKS5jb25jYXQodXJsLCAifSIpOworCisgICAgICBpZiAodGhpcy5mb250UmVnaXN0cnkpIHsKKyAgICAgICAgdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMsIHVybCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBydWxlOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFBhdGhHZW5lcmF0b3IiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYXRoR2VuZXJhdG9yKG9ianMsIGNoYXJhY3RlcikgeworICAgICAgaWYgKHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl07CisgICAgICB9CisKKyAgICAgIHZhciBjbWRzLCBjdXJyZW50OworCisgICAgICB0cnkgeworICAgICAgICBjbWRzID0gb2Jqcy5nZXQodGhpcy5sb2FkZWROYW1lICsgIl9wYXRoXyIgKyBjaGFyYWN0ZXIpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKCF0aGlzLmlnbm9yZUVycm9ycykgeworICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlKSB7CisgICAgICAgICAgdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUoeworICAgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRHZXRQYXRoCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICAoMCwgX3V0aWwud2FybikoImdldFBhdGhHZW5lcmF0b3IgLSBpZ25vcmluZyBjaGFyYWN0ZXI6IFwiIi5jb25jYXQoZXgsICJcIi4iKSk7CisgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkge307CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmlzRXZhbFN1cHBvcnRlZCAmJiBfdXRpbC5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQudmFsdWUpIHsKKyAgICAgICAgdmFyIGFyZ3MsCisgICAgICAgICAgICBqcyA9ICIiOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNtZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGN1cnJlbnQgPSBjbWRzW2ldOworCisgICAgICAgICAgaWYgKGN1cnJlbnQuYXJncyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBhcmdzID0gY3VycmVudC5hcmdzLmpvaW4oIiwiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJncyA9ICIiOworICAgICAgICAgIH0KKworICAgICAgICAgIGpzICs9ICJjLiIgKyBjdXJyZW50LmNtZCArICIoIiArIGFyZ3MgKyAiKTtcbiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gbmV3IEZ1bmN0aW9uKCJjIiwgInNpemUiLCBqcyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkgeworICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9paSA9IGNtZHMubGVuZ3RoOyBfaSA8IF9paTsgX2krKykgeworICAgICAgICAgIGN1cnJlbnQgPSBjbWRzW19pXTsKKworICAgICAgICAgIGlmIChjdXJyZW50LmNtZCA9PT0gInNjYWxlIikgeworICAgICAgICAgICAgY3VycmVudC5hcmdzID0gW3NpemUsIC1zaXplXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjW2N1cnJlbnQuY21kXS5hcHBseShjLCBjdXJyZW50LmFyZ3MpOworICAgICAgICB9CisgICAgICB9OworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBGb250RmFjZU9iamVjdDsKK30oKTsKKworZXhwb3J0cy5Gb250RmFjZU9iamVjdCA9IEZvbnRGYWNlT2JqZWN0OworCisvKioqLyB9KSwKKy8qIDIwNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IGV4cG9ydHMuTm9kZUNhbnZhc0ZhY3RvcnkgPSB2b2lkIDA7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCit2YXIgTm9kZUNhbnZhc0ZhY3RvcnkgPSBmdW5jdGlvbiBOb2RlQ2FudmFzRmFjdG9yeSgpIHsKKyAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGVDYW52YXNGYWN0b3J5KTsKKworICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJOb3QgaW1wbGVtZW50ZWQ6IE5vZGVDYW52YXNGYWN0b3J5Iik7Cit9OworCitleHBvcnRzLk5vZGVDYW52YXNGYWN0b3J5ID0gTm9kZUNhbnZhc0ZhY3Rvcnk7CisKK3ZhciBOb2RlQ01hcFJlYWRlckZhY3RvcnkgPSBmdW5jdGlvbiBOb2RlQ01hcFJlYWRlckZhY3RvcnkoKSB7CisgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb2RlQ01hcFJlYWRlckZhY3RvcnkpOworCisgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIk5vdCBpbXBsZW1lbnRlZDogTm9kZUNNYXBSZWFkZXJGYWN0b3J5Iik7Cit9OworCitleHBvcnRzLk5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IE5vZGVDTWFwUmVhZGVyRmFjdG9yeTsKKworaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgIGV4cG9ydHMuTm9kZUNhbnZhc0ZhY3RvcnkgPSBOb2RlQ2FudmFzRmFjdG9yeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VDYW52YXNGYWN0b3J5KSB7CisgICAgX2luaGVyaXRzKE5vZGVDYW52YXNGYWN0b3J5LCBfQmFzZUNhbnZhc0ZhY3RvcnkpOworCisgICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihOb2RlQ2FudmFzRmFjdG9yeSk7CisKKyAgICBmdW5jdGlvbiBOb2RlQ2FudmFzRmFjdG9yeSgpIHsKKyAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb2RlQ2FudmFzRmFjdG9yeSk7CisKKyAgICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBfY3JlYXRlQ2xhc3MoTm9kZUNhbnZhc0ZhY3RvcnksIFt7CisgICAgICBrZXk6ICJjcmVhdGUiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7CisgICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgQ2FudmFzID0gcmVxdWlyZSgiY2FudmFzIik7CisKKyAgICAgICAgdmFyIGNhbnZhcyA9IENhbnZhcy5jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgY2FudmFzOiBjYW52YXMsCisgICAgICAgICAgY29udGV4dDogY2FudmFzLmdldENvbnRleHQoIjJkIikKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gTm9kZUNhbnZhc0ZhY3Rvcnk7CisgIH0oX2Rpc3BsYXlfdXRpbHMuQmFzZUNhbnZhc0ZhY3RvcnkpOworCisgIGV4cG9ydHMuTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUNNYXBSZWFkZXJGYWN0b3IpIHsKKyAgICBfaW5oZXJpdHMoTm9kZUNNYXBSZWFkZXJGYWN0b3J5LCBfQmFzZUNNYXBSZWFkZXJGYWN0b3IpOworCisgICAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoTm9kZUNNYXBSZWFkZXJGYWN0b3J5KTsKKworICAgIGZ1bmN0aW9uIE5vZGVDTWFwUmVhZGVyRmFjdG9yeSgpIHsKKyAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb2RlQ01hcFJlYWRlckZhY3RvcnkpOworCisgICAgICByZXR1cm4gX3N1cGVyMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIF9jcmVhdGVDbGFzcyhOb2RlQ01hcFJlYWRlckZhY3RvcnksIFt7CisgICAgICBrZXk6ICJfZmV0Y2hEYXRhIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICAgICAgdmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKKworICAgICAgICAgIGZzLnJlYWRGaWxlKHVybCwgZnVuY3Rpb24gKGVycm9yLCBkYXRhKSB7CisgICAgICAgICAgICBpZiAoZXJyb3IgfHwgIWRhdGEpIHsKKyAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvcikpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc29sdmUoeworICAgICAgICAgICAgICBjTWFwRGF0YTogbmV3IFVpbnQ4QXJyYXkoZGF0YSksCisgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZTogY29tcHJlc3Npb25UeXBlCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfV0pOworCisgICAgcmV0dXJuIE5vZGVDTWFwUmVhZGVyRmFjdG9yeTsKKyAgfShfZGlzcGxheV91dGlscy5CYXNlQ01hcFJlYWRlckZhY3RvcnkpOworfQorCisvKioqLyB9KSwKKy8qIDIwNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkFubm90YXRpb25TdG9yYWdlID0gdm9pZCAwOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIEFubm90YXRpb25TdG9yYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQW5ub3RhdGlvblN0b3JhZ2UoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFubm90YXRpb25TdG9yYWdlKTsKKworICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgTWFwKCk7CisgICAgdGhpcy5fbW9kaWZpZWQgPSBmYWxzZTsKKyAgICB0aGlzLm9uU2V0TW9kaWZpZWQgPSBudWxsOworICAgIHRoaXMub25SZXNldE1vZGlmaWVkID0gbnVsbDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhBbm5vdGF0aW9uU3RvcmFnZSwgW3sKKyAgICBrZXk6ICJnZXRPckNyZWF0ZVZhbHVlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3JDcmVhdGVWYWx1ZShrZXksIGRlZmF1bHRWYWx1ZSkgeworICAgICAgaWYgKHRoaXMuX3N0b3JhZ2UuaGFzKGtleSkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0KGtleSk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX3N0b3JhZ2Uuc2V0KGtleSwgZGVmYXVsdFZhbHVlKTsKKworICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRWYWx1ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZhbHVlKGtleSwgdmFsdWUpIHsKKyAgICAgIGlmICh0aGlzLl9zdG9yYWdlLmdldChrZXkpICE9PSB2YWx1ZSkgeworICAgICAgICB0aGlzLl9zZXRNb2RpZmllZCgpOworICAgICAgfQorCisgICAgICB0aGlzLl9zdG9yYWdlLnNldChrZXksIHZhbHVlKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRBbGwiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGwoKSB7CisgICAgICBpZiAodGhpcy5fc3RvcmFnZS5zaXplID09PSAwKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX3N0b3JhZ2UpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9zZXRNb2RpZmllZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRNb2RpZmllZCgpIHsKKyAgICAgIGlmICghdGhpcy5fbW9kaWZpZWQpIHsKKyAgICAgICAgdGhpcy5fbW9kaWZpZWQgPSB0cnVlOworCisgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vblNldE1vZGlmaWVkID09PSAiZnVuY3Rpb24iKSB7CisgICAgICAgICAgdGhpcy5vblNldE1vZGlmaWVkKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZXNldE1vZGlmaWVkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXRNb2RpZmllZCgpIHsKKyAgICAgIGlmICh0aGlzLl9tb2RpZmllZCkgeworICAgICAgICB0aGlzLl9tb2RpZmllZCA9IGZhbHNlOworCisgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2l6ZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5zaXplOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBBbm5vdGF0aW9uU3RvcmFnZTsKK30oKTsKKworZXhwb3J0cy5Bbm5vdGF0aW9uU3RvcmFnZSA9IEFubm90YXRpb25TdG9yYWdlOworCisvKioqLyB9KSwKKy8qIDIwNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmFwaUNvbXBhdGliaWxpdHlQYXJhbXMgPSB2b2lkIDA7CisKK3ZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7CisKK3ZhciBjb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKK3sKKyAgKGZ1bmN0aW9uIGNoZWNrRm9udEZhY2UoKSB7CisgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICBjb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVGb250RmFjZSA9IHRydWU7CisgICAgfQorICB9KSgpOworfQordmFyIGFwaUNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuZnJlZXplKGNvbXBhdGliaWxpdHlQYXJhbXMpOworZXhwb3J0cy5hcGlDb21wYXRpYmlsaXR5UGFyYW1zID0gYXBpQ29tcGF0aWJpbGl0eVBhcmFtczsKKworLyoqKi8gfSksCisvKiAyMDcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DYW52YXNHcmFwaGljcyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9wYXR0ZXJuX2hlbHBlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA4KTsKKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKwordmFyIE1JTl9GT05UX1NJWkUgPSAxNjsKK3ZhciBNQVhfRk9OVF9TSVpFID0gMTAwOwordmFyIE1BWF9HUk9VUF9TSVpFID0gNDA5NjsKK3ZhciBNSU5fV0lEVEhfRkFDVE9SID0gMC42NTsKK3ZhciBDT01QSUxFX1RZUEUzX0dMWVBIUyA9IHRydWU7Cit2YXIgTUFYX1NJWkVfVE9fQ09NUElMRSA9IDEwMDA7Cit2YXIgRlVMTF9DSFVOS19IRUlHSFQgPSAxNjsKKworZnVuY3Rpb24gYWRkQ29udGV4dEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSB7CisgIGlmICghY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0pIHsKKyAgICBjdHguX29yaWdpbmFsU2F2ZSA9IGN0eC5zYXZlOworICAgIGN0eC5fb3JpZ2luYWxSZXN0b3JlID0gY3R4LnJlc3RvcmU7CisgICAgY3R4Ll9vcmlnaW5hbFJvdGF0ZSA9IGN0eC5yb3RhdGU7CisgICAgY3R4Ll9vcmlnaW5hbFNjYWxlID0gY3R4LnNjYWxlOworICAgIGN0eC5fb3JpZ2luYWxUcmFuc2xhdGUgPSBjdHgudHJhbnNsYXRlOworICAgIGN0eC5fb3JpZ2luYWxUcmFuc2Zvcm0gPSBjdHgudHJhbnNmb3JtOworICAgIGN0eC5fb3JpZ2luYWxTZXRUcmFuc2Zvcm0gPSBjdHguc2V0VHJhbnNmb3JtOworICAgIGN0eC5fdHJhbnNmb3JtTWF0cml4ID0gY3R4Ll90cmFuc2Zvcm1NYXRyaXggfHwgWzEsIDAsIDAsIDEsIDAsIDBdOworICAgIGN0eC5fdHJhbnNmb3JtU3RhY2sgPSBbXTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCAibW96Q3VycmVudFRyYW5zZm9ybSIsIHsKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCAibW96Q3VycmVudFRyYW5zZm9ybUludmVyc2UiLCB7CisgICAgICBnZXQ6IGZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKCkgeworICAgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgICAgdmFyIGEgPSBtWzBdLAorICAgICAgICAgICAgYiA9IG1bMV0sCisgICAgICAgICAgICBjID0gbVsyXSwKKyAgICAgICAgICAgIGQgPSBtWzNdLAorICAgICAgICAgICAgZSA9IG1bNF0sCisgICAgICAgICAgICBmID0gbVs1XTsKKyAgICAgICAgdmFyIGFkX2JjID0gYSAqIGQgLSBiICogYzsKKyAgICAgICAgdmFyIGJjX2FkID0gYiAqIGMgLSBhICogZDsKKyAgICAgICAgcmV0dXJuIFtkIC8gYWRfYmMsIGIgLyBiY19hZCwgYyAvIGJjX2FkLCBhIC8gYWRfYmMsIChkICogZSAtIGMgKiBmKSAvIGJjX2FkLCAoYiAqIGUgLSBhICogZikgLyBhZF9iY107CisgICAgICB9CisgICAgfSk7CisKKyAgICBjdHguc2F2ZSA9IGZ1bmN0aW9uIGN0eFNhdmUoKSB7CisgICAgICB2YXIgb2xkID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4OworCisgICAgICB0aGlzLl90cmFuc2Zvcm1TdGFjay5wdXNoKG9sZCk7CisKKyAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IG9sZC5zbGljZSgwLCA2KTsKKworICAgICAgdGhpcy5fb3JpZ2luYWxTYXZlKCk7CisgICAgfTsKKworICAgIGN0eC5yZXN0b3JlID0gZnVuY3Rpb24gY3R4UmVzdG9yZSgpIHsKKyAgICAgIHZhciBwcmV2ID0gdGhpcy5fdHJhbnNmb3JtU3RhY2sucG9wKCk7CisKKyAgICAgIGlmIChwcmV2KSB7CisgICAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IHByZXY7CisKKyAgICAgICAgdGhpcy5fb3JpZ2luYWxSZXN0b3JlKCk7CisgICAgICB9CisgICAgfTsKKworICAgIGN0eC50cmFuc2xhdGUgPSBmdW5jdGlvbiBjdHhUcmFuc2xhdGUoeCwgeSkgeworICAgICAgdmFyIG0gPSB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7CisgICAgICBtWzRdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07CisgICAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07CisKKyAgICAgIHRoaXMuX29yaWdpbmFsVHJhbnNsYXRlKHgsIHkpOworICAgIH07CisKKyAgICBjdHguc2NhbGUgPSBmdW5jdGlvbiBjdHhTY2FsZSh4LCB5KSB7CisgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgIG1bMF0gPSBtWzBdICogeDsKKyAgICAgIG1bMV0gPSBtWzFdICogeDsKKyAgICAgIG1bMl0gPSBtWzJdICogeTsKKyAgICAgIG1bM10gPSBtWzNdICogeTsKKworICAgICAgdGhpcy5fb3JpZ2luYWxTY2FsZSh4LCB5KTsKKyAgICB9OworCisgICAgY3R4LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7CisgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IFttWzBdICogYSArIG1bMl0gKiBiLCBtWzFdICogYSArIG1bM10gKiBiLCBtWzBdICogYyArIG1bMl0gKiBkLCBtWzFdICogYyArIG1bM10gKiBkLCBtWzBdICogZSArIG1bMl0gKiBmICsgbVs0XSwgbVsxXSAqIGUgKyBtWzNdICogZiArIG1bNV1dOworCisgICAgICBjdHguX29yaWdpbmFsVHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpOworICAgIH07CisKKyAgICBjdHguc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4U2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IFthLCBiLCBjLCBkLCBlLCBmXTsKKworICAgICAgY3R4Ll9vcmlnaW5hbFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTsKKyAgICB9OworCisgICAgY3R4LnJvdGF0ZSA9IGZ1bmN0aW9uIGN0eFJvdGF0ZShhbmdsZSkgeworICAgICAgdmFyIGNvc1ZhbHVlID0gTWF0aC5jb3MoYW5nbGUpOworICAgICAgdmFyIHNpblZhbHVlID0gTWF0aC5zaW4oYW5nbGUpOworICAgICAgdmFyIG0gPSB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7CisgICAgICB0aGlzLl90cmFuc2Zvcm1NYXRyaXggPSBbbVswXSAqIGNvc1ZhbHVlICsgbVsyXSAqIHNpblZhbHVlLCBtWzFdICogY29zVmFsdWUgKyBtWzNdICogc2luVmFsdWUsIG1bMF0gKiAtc2luVmFsdWUgKyBtWzJdICogY29zVmFsdWUsIG1bMV0gKiAtc2luVmFsdWUgKyBtWzNdICogY29zVmFsdWUsIG1bNF0sIG1bNV1dOworCisgICAgICB0aGlzLl9vcmlnaW5hbFJvdGF0ZShhbmdsZSk7CisgICAgfTsKKyAgfQorfQorCit2YXIgQ2FjaGVkQ2FudmFzZXMgPSBmdW5jdGlvbiBDYWNoZWRDYW52YXNlc0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENhY2hlZENhbnZhc2VzKGNhbnZhc0ZhY3RvcnkpIHsKKyAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5OworICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9CisKKyAgQ2FjaGVkQ2FudmFzZXMucHJvdG90eXBlID0geworICAgIGdldENhbnZhczogZnVuY3Rpb24gQ2FjaGVkQ2FudmFzZXNfZ2V0Q2FudmFzKGlkLCB3aWR0aCwgaGVpZ2h0LCB0cmFja1RyYW5zZm9ybSkgeworICAgICAgdmFyIGNhbnZhc0VudHJ5OworCisgICAgICBpZiAodGhpcy5jYWNoZVtpZF0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdOworICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkucmVzZXQoY2FudmFzRW50cnksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjYW52YXNFbnRyeS5jb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbnZhc0VudHJ5ID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgdGhpcy5jYWNoZVtpZF0gPSBjYW52YXNFbnRyeTsKKyAgICAgIH0KKworICAgICAgaWYgKHRyYWNrVHJhbnNmb3JtKSB7CisgICAgICAgIGFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGNhbnZhc0VudHJ5LmNvbnRleHQpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2FudmFzRW50cnk7CisgICAgfSwKKyAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7CisgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLmNhY2hlKSB7CisgICAgICAgIHZhciBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdOworICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkuZGVzdHJveShjYW52YXNFbnRyeSk7CisgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTsKKyAgICAgIH0KKyAgICB9CisgIH07CisgIHJldHVybiBDYWNoZWRDYW52YXNlczsKK30oKTsKKworZnVuY3Rpb24gY29tcGlsZVR5cGUzR2x5cGgoaW1nRGF0YSkgeworICB2YXIgUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCA9IDEwMDA7CisgIHZhciB3aWR0aCA9IGltZ0RhdGEud2lkdGgsCisgICAgICBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgdmFyIGksCisgICAgICBqLAorICAgICAgajAsCisgICAgICB3aWR0aDEgPSB3aWR0aCArIDE7CisgIHZhciBwb2ludHMgPSBuZXcgVWludDhBcnJheSh3aWR0aDEgKiAoaGVpZ2h0ICsgMSkpOworICB2YXIgUE9JTlRfVFlQRVMgPSBuZXcgVWludDhBcnJheShbMCwgMiwgNCwgMCwgMSwgMCwgNSwgNCwgOCwgMTAsIDAsIDgsIDAsIDIsIDEsIDBdKTsKKyAgdmFyIGxpbmVTaXplID0gd2lkdGggKyA3ICYgfjcsCisgICAgICBkYXRhMCA9IGltZ0RhdGEuZGF0YTsKKyAgdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShsaW5lU2l6ZSAqIGhlaWdodCksCisgICAgICBwb3MgPSAwLAorICAgICAgaWk7CisKKyAgZm9yIChpID0gMCwgaWkgPSBkYXRhMC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgdmFyIG1hc2sgPSAxMjgsCisgICAgICAgIGVsZW0gPSBkYXRhMFtpXTsKKworICAgIHdoaWxlIChtYXNrID4gMCkgeworICAgICAgZGF0YVtwb3MrK10gPSBlbGVtICYgbWFzayA/IDAgOiAyNTU7CisgICAgICBtYXNrID4+PSAxOworICAgIH0KKyAgfQorCisgIHZhciBjb3VudCA9IDA7CisgIHBvcyA9IDA7CisKKyAgaWYgKGRhdGFbcG9zXSAhPT0gMCkgeworICAgIHBvaW50c1swXSA9IDE7CisgICAgKytjb3VudDsKKyAgfQorCisgIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7CisgICAgaWYgKGRhdGFbcG9zXSAhPT0gZGF0YVtwb3MgKyAxXSkgeworICAgICAgcG9pbnRzW2pdID0gZGF0YVtwb3NdID8gMiA6IDE7CisgICAgICArK2NvdW50OworICAgIH0KKworICAgIHBvcysrOworICB9CisKKyAgaWYgKGRhdGFbcG9zXSAhPT0gMCkgeworICAgIHBvaW50c1tqXSA9IDI7CisgICAgKytjb3VudDsKKyAgfQorCisgIGZvciAoaSA9IDE7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIHBvcyA9IGkgKiBsaW5lU2l6ZTsKKyAgICBqMCA9IGkgKiB3aWR0aDE7CisKKyAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkgeworICAgICAgcG9pbnRzW2owXSA9IGRhdGFbcG9zXSA/IDEgOiA4OworICAgICAgKytjb3VudDsKKyAgICB9CisKKyAgICB2YXIgc3VtID0gKGRhdGFbcG9zXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplXSA/IDggOiAwKTsKKworICAgIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBzdW0gPSAoc3VtID4+IDIpICsgKGRhdGFbcG9zICsgMV0gPyA0IDogMCkgKyAoZGF0YVtwb3MgLSBsaW5lU2l6ZSArIDFdID8gOCA6IDApOworCisgICAgICBpZiAoUE9JTlRfVFlQRVNbc3VtXSkgeworICAgICAgICBwb2ludHNbajAgKyBqXSA9IFBPSU5UX1RZUEVTW3N1bV07CisgICAgICAgICsrY291bnQ7CisgICAgICB9CisKKyAgICAgIHBvcysrOworICAgIH0KKworICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7CisgICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDIgOiA0OworICAgICAgKytjb3VudDsKKyAgICB9CisKKyAgICBpZiAoY291bnQgPiBQT0lOVF9UT19QUk9DRVNTX0xJTUlUKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwb3MgPSBsaW5lU2l6ZSAqIChoZWlnaHQgLSAxKTsKKyAgajAgPSBpICogd2lkdGgxOworCisgIGlmIChkYXRhW3Bvc10gIT09IDApIHsKKyAgICBwb2ludHNbajBdID0gODsKKyAgICArK2NvdW50OworICB9CisKKyAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICBpZiAoZGF0YVtwb3NdICE9PSBkYXRhW3BvcyArIDFdKSB7CisgICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDQgOiA4OworICAgICAgKytjb3VudDsKKyAgICB9CisKKyAgICBwb3MrKzsKKyAgfQorCisgIGlmIChkYXRhW3Bvc10gIT09IDApIHsKKyAgICBwb2ludHNbajAgKyBqXSA9IDQ7CisgICAgKytjb3VudDsKKyAgfQorCisgIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHZhciBzdGVwcyA9IG5ldyBJbnQzMkFycmF5KFswLCB3aWR0aDEsIC0xLCAwLCAtd2lkdGgxLCAwLCAwLCAwLCAxXSk7CisgIHZhciBvdXRsaW5lcyA9IFtdOworCisgIGZvciAoaSA9IDA7IGNvdW50ICYmIGkgPD0gaGVpZ2h0OyBpKyspIHsKKyAgICB2YXIgcCA9IGkgKiB3aWR0aDE7CisgICAgdmFyIGVuZCA9IHAgKyB3aWR0aDsKKworICAgIHdoaWxlIChwIDwgZW5kICYmICFwb2ludHNbcF0pIHsKKyAgICAgIHArKzsKKyAgICB9CisKKyAgICBpZiAocCA9PT0gZW5kKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB2YXIgY29vcmRzID0gW3AgJSB3aWR0aDEsIGldOworICAgIHZhciB0eXBlID0gcG9pbnRzW3BdLAorICAgICAgICBwMCA9IHAsCisgICAgICAgIHBwOworCisgICAgZG8geworICAgICAgdmFyIHN0ZXAgPSBzdGVwc1t0eXBlXTsKKworICAgICAgZG8geworICAgICAgICBwICs9IHN0ZXA7CisgICAgICB9IHdoaWxlICghcG9pbnRzW3BdKTsKKworICAgICAgcHAgPSBwb2ludHNbcF07CisKKyAgICAgIGlmIChwcCAhPT0gNSAmJiBwcCAhPT0gMTApIHsKKyAgICAgICAgdHlwZSA9IHBwOworICAgICAgICBwb2ludHNbcF0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9IHBwICYgMHgzMyAqIHR5cGUgPj4gNDsKKyAgICAgICAgcG9pbnRzW3BdICY9IHR5cGUgPj4gMiB8IHR5cGUgPDwgMjsKKyAgICAgIH0KKworICAgICAgY29vcmRzLnB1c2gocCAlIHdpZHRoMSk7CisgICAgICBjb29yZHMucHVzaChwIC8gd2lkdGgxIHwgMCk7CisKKyAgICAgIGlmICghcG9pbnRzW3BdKSB7CisgICAgICAgIC0tY291bnQ7CisgICAgICB9CisgICAgfSB3aGlsZSAocDAgIT09IHApOworCisgICAgb3V0bGluZXMucHVzaChjb29yZHMpOworICAgIC0taTsKKyAgfQorCisgIHZhciBkcmF3T3V0bGluZSA9IGZ1bmN0aW9uIGRyYXdPdXRsaW5lKGMpIHsKKyAgICBjLnNhdmUoKTsKKyAgICBjLnNjYWxlKDEgLyB3aWR0aCwgLTEgLyBoZWlnaHQpOworICAgIGMudHJhbnNsYXRlKDAsIC1oZWlnaHQpOworICAgIGMuYmVnaW5QYXRoKCk7CisKKyAgICBmb3IgKHZhciBrID0gMCwga2sgPSBvdXRsaW5lcy5sZW5ndGg7IGsgPCBrazsgaysrKSB7CisgICAgICB2YXIgbyA9IG91dGxpbmVzW2tdOworICAgICAgYy5tb3ZlVG8ob1swXSwgb1sxXSk7CisKKyAgICAgIGZvciAodmFyIGwgPSAyLCBsbCA9IG8ubGVuZ3RoOyBsIDwgbGw7IGwgKz0gMikgeworICAgICAgICBjLmxpbmVUbyhvW2xdLCBvW2wgKyAxXSk7CisgICAgICB9CisgICAgfQorCisgICAgYy5maWxsKCk7CisgICAgYy5iZWdpblBhdGgoKTsKKyAgICBjLnJlc3RvcmUoKTsKKyAgfTsKKworICByZXR1cm4gZHJhd091dGxpbmU7Cit9CisKK3ZhciBDYW52YXNFeHRyYVN0YXRlID0gZnVuY3Rpb24gQ2FudmFzRXh0cmFTdGF0ZUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGUoKSB7CisgICAgdGhpcy5hbHBoYUlzU2hhcGUgPSBmYWxzZTsKKyAgICB0aGlzLmZvbnRTaXplID0gMDsKKyAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxOworICAgIHRoaXMudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICB0aGlzLnRleHRNYXRyaXhTY2FsZSA9IDE7CisgICAgdGhpcy5mb250TWF0cml4ID0gX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7CisgICAgdGhpcy5sZWFkaW5nID0gMDsKKyAgICB0aGlzLnggPSAwOworICAgIHRoaXMueSA9IDA7CisgICAgdGhpcy5saW5lWCA9IDA7CisgICAgdGhpcy5saW5lWSA9IDA7CisgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7CisgICAgdGhpcy53b3JkU3BhY2luZyA9IDA7CisgICAgdGhpcy50ZXh0SFNjYWxlID0gMTsKKyAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTDsKKyAgICB0aGlzLnRleHRSaXNlID0gMDsKKyAgICB0aGlzLmZpbGxDb2xvciA9ICIjMDAwMDAwIjsKKyAgICB0aGlzLnN0cm9rZUNvbG9yID0gIiMwMDAwMDAiOworICAgIHRoaXMucGF0dGVybkZpbGwgPSBmYWxzZTsKKyAgICB0aGlzLmZpbGxBbHBoYSA9IDE7CisgICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7CisgICAgdGhpcy5saW5lV2lkdGggPSAxOworICAgIHRoaXMuYWN0aXZlU01hc2sgPSBudWxsOworICAgIHRoaXMucmVzdW1lU01hc2tDdHggPSBudWxsOworICAgIHRoaXMudHJhbnNmZXJNYXBzID0gbnVsbDsKKyAgfQorCisgIENhbnZhc0V4dHJhU3RhdGUucHJvdG90eXBlID0geworICAgIGNsb25lOiBmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlX2Nsb25lKCkgeworICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7CisgICAgfSwKKyAgICBzZXRDdXJyZW50UG9pbnQ6IGZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGVfc2V0Q3VycmVudFBvaW50KHgsIHkpIHsKKyAgICAgIHRoaXMueCA9IHg7CisgICAgICB0aGlzLnkgPSB5OworICAgIH0KKyAgfTsKKyAgcmV0dXJuIENhbnZhc0V4dHJhU3RhdGU7Cit9KCk7CisKK3ZhciBDYW52YXNHcmFwaGljcyA9IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzQ2xvc3VyZSgpIHsKKyAgdmFyIEVYRUNVVElPTl9USU1FID0gMTU7CisgIHZhciBFWEVDVVRJT05fU1RFUFMgPSAxMDsKKworICBmdW5jdGlvbiBDYW52YXNHcmFwaGljcyhjYW52YXNDdHgsIGNvbW1vbk9ianMsIG9ianMsIGNhbnZhc0ZhY3RvcnksIHdlYkdMQ29udGV4dCwgaW1hZ2VMYXllciwgb3B0aW9uYWxDb250ZW50Q29uZmlnKSB7CisgICAgdGhpcy5jdHggPSBjYW52YXNDdHg7CisgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUoKTsKKyAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTsKKyAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDsKKyAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTsKKyAgICB0aGlzLnJlcyA9IG51bGw7CisgICAgdGhpcy54b2JqcyA9IG51bGw7CisgICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqczsKKyAgICB0aGlzLm9ianMgPSBvYmpzOworICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7CisgICAgdGhpcy53ZWJHTENvbnRleHQgPSB3ZWJHTENvbnRleHQ7CisgICAgdGhpcy5pbWFnZUxheWVyID0gaW1hZ2VMYXllcjsKKyAgICB0aGlzLmdyb3VwU3RhY2sgPSBbXTsKKyAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7CisgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gbnVsbDsKKyAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjayA9IFtdOworICAgIHRoaXMuZ3JvdXBMZXZlbCA9IDA7CisgICAgdGhpcy5zbWFza1N0YWNrID0gW107CisgICAgdGhpcy5zbWFza0NvdW50ZXIgPSAwOworICAgIHRoaXMudGVtcFNNYXNrID0gbnVsbDsKKyAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdHJ1ZTsKKyAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjayA9IFtdOworICAgIHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnID0gb3B0aW9uYWxDb250ZW50Q29uZmlnOworICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMgPSBuZXcgQ2FjaGVkQ2FudmFzZXModGhpcy5jYW52YXNGYWN0b3J5KTsKKworICAgIGlmIChjYW52YXNDdHgpIHsKKyAgICAgIGFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGNhbnZhc0N0eCk7CisgICAgfQorCisgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7CisgIH0KKworICBmdW5jdGlvbiBwdXRCaW5hcnlJbWFnZURhdGEoY3R4LCBpbWdEYXRhKSB7CisgICAgdmFyIHRyYW5zZmVyTWFwcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDsKKworICAgIGlmICh0eXBlb2YgSW1hZ2VEYXRhICE9PSAidW5kZWZpbmVkIiAmJiBpbWdEYXRhIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7CisgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltZ0RhdGEsIDAsIDApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCwKKyAgICAgICAgd2lkdGggPSBpbWdEYXRhLndpZHRoOworICAgIHZhciBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICB2YXIgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7CisgICAgdmFyIHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxOworICAgIHZhciBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7CisgICAgdmFyIHNyY1BvcyA9IDAsCisgICAgICAgIGRlc3RQb3M7CisgICAgdmFyIHNyYyA9IGltZ0RhdGEuZGF0YTsKKyAgICB2YXIgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhOworICAgIHZhciBpLCBqLCB0aGlzQ2h1bmtIZWlnaHQsIGVsZW1zSW5UaGlzQ2h1bms7CisgICAgdmFyIHRyYW5zZmVyTWFwUmVkLCB0cmFuc2Zlck1hcEdyZWVuLCB0cmFuc2Zlck1hcEJsdWUsIHRyYW5zZmVyTWFwR3JheTsKKworICAgIGlmICh0cmFuc2Zlck1hcHMpIHsKKyAgICAgIHN3aXRjaCAodHJhbnNmZXJNYXBzLmxlbmd0aCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgdHJhbnNmZXJNYXBSZWQgPSB0cmFuc2Zlck1hcHNbMF07CisgICAgICAgICAgdHJhbnNmZXJNYXBHcmVlbiA9IHRyYW5zZmVyTWFwc1swXTsKKyAgICAgICAgICB0cmFuc2Zlck1hcEJsdWUgPSB0cmFuc2Zlck1hcHNbMF07CisgICAgICAgICAgdHJhbnNmZXJNYXBHcmF5ID0gdHJhbnNmZXJNYXBzWzBdOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICB0cmFuc2Zlck1hcFJlZCA9IHRyYW5zZmVyTWFwc1swXTsKKyAgICAgICAgICB0cmFuc2Zlck1hcEdyZWVuID0gdHJhbnNmZXJNYXBzWzFdOworICAgICAgICAgIHRyYW5zZmVyTWFwQmx1ZSA9IHRyYW5zZmVyTWFwc1syXTsKKyAgICAgICAgICB0cmFuc2Zlck1hcEdyYXkgPSB0cmFuc2Zlck1hcHNbM107CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGltZ0RhdGEua2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7CisgICAgICB2YXIgc3JjTGVuZ3RoID0gc3JjLmJ5dGVMZW5ndGg7CisgICAgICB2YXIgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyLCAwLCBkZXN0LmJ5dGVMZW5ndGggPj4gMik7CisgICAgICB2YXIgZGVzdDMyRGF0YUxlbmd0aCA9IGRlc3QzMi5sZW5ndGg7CisgICAgICB2YXIgZnVsbFNyY0RpZmYgPSB3aWR0aCArIDcgPj4gMzsKKyAgICAgIHZhciB3aGl0ZSA9IDB4ZmZmZmZmZmY7CisgICAgICB2YXIgYmxhY2sgPSBfdXRpbC5Jc0xpdHRsZUVuZGlhbkNhY2hlZC52YWx1ZSA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmOworCisgICAgICBpZiAodHJhbnNmZXJNYXBHcmF5KSB7CisgICAgICAgIGlmICh0cmFuc2Zlck1hcEdyYXlbMF0gPT09IDB4ZmYgJiYgdHJhbnNmZXJNYXBHcmF5WzB4ZmZdID09PSAwKSB7CisgICAgICAgICAgdmFyIF9yZWYgPSBbYmxhY2ssIHdoaXRlXTsKKyAgICAgICAgICB3aGl0ZSA9IF9yZWZbMF07CisgICAgICAgICAgYmxhY2sgPSBfcmVmWzFdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7CisgICAgICAgIHRoaXNDaHVua0hlaWdodCA9IGkgPCBmdWxsQ2h1bmtzID8gRlVMTF9DSFVOS19IRUlHSFQgOiBwYXJ0aWFsQ2h1bmtIZWlnaHQ7CisgICAgICAgIGRlc3RQb3MgPSAwOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzQ2h1bmtIZWlnaHQ7IGorKykgeworICAgICAgICAgIHZhciBzcmNEaWZmID0gc3JjTGVuZ3RoIC0gc3JjUG9zOworICAgICAgICAgIHZhciBrID0gMDsKKyAgICAgICAgICB2YXIga0VuZCA9IHNyY0RpZmYgPiBmdWxsU3JjRGlmZiA/IHdpZHRoIDogc3JjRGlmZiAqIDggLSA3OworICAgICAgICAgIHZhciBrRW5kVW5yb2xsZWQgPSBrRW5kICYgfjc7CisgICAgICAgICAgdmFyIG1hc2sgPSAwOworICAgICAgICAgIHZhciBzcmNCeXRlID0gMDsKKworICAgICAgICAgIGZvciAoOyBrIDwga0VuZFVucm9sbGVkOyBrICs9IDgpIHsKKyAgICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdOworICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMTI4ID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDY0ID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDMyID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDE2ID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDggPyB3aGl0ZSA6IGJsYWNrOworICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgNCA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAyID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEgPyB3aGl0ZSA6IGJsYWNrOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoOyBrIDwga0VuZDsgaysrKSB7CisgICAgICAgICAgICBpZiAobWFzayA9PT0gMCkgeworICAgICAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTsKKyAgICAgICAgICAgICAgbWFzayA9IDEyODsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgbWFzayA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBtYXNrID4+PSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChkZXN0UG9zIDwgZGVzdDMyRGF0YUxlbmd0aCkgeworICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaW1nRGF0YS5raW5kID09PSBfdXRpbC5JbWFnZUtpbmQuUkdCQV8zMkJQUCkgeworICAgICAgdmFyIGhhc1RyYW5zZmVyTWFwcyA9ICEhKHRyYW5zZmVyTWFwUmVkIHx8IHRyYW5zZmVyTWFwR3JlZW4gfHwgdHJhbnNmZXJNYXBCbHVlKTsKKyAgICAgIGogPSAwOworICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogRlVMTF9DSFVOS19IRUlHSFQgKiA0OworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZnVsbENodW5rczsgaSsrKSB7CisgICAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNQb3MsIHNyY1BvcyArIGVsZW1zSW5UaGlzQ2h1bmspKTsKKyAgICAgICAgc3JjUG9zICs9IGVsZW1zSW5UaGlzQ2h1bms7CisKKyAgICAgICAgaWYgKGhhc1RyYW5zZmVyTWFwcykgeworICAgICAgICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBlbGVtc0luVGhpc0NodW5rOyBfayArPSA0KSB7CisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBSZWQpIHsKKyAgICAgICAgICAgICAgZGVzdFtfayArIDBdID0gdHJhbnNmZXJNYXBSZWRbZGVzdFtfayArIDBdXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwR3JlZW4pIHsKKyAgICAgICAgICAgICAgZGVzdFtfayArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W19rICsgMV1dOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBCbHVlKSB7CisgICAgICAgICAgICAgIGRlc3RbX2sgKyAyXSA9IHRyYW5zZmVyTWFwQmx1ZVtkZXN0W19rICsgMl1dOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTsKKyAgICAgICAgaiArPSBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPCB0b3RhbENodW5rcykgeworICAgICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiBwYXJ0aWFsQ2h1bmtIZWlnaHQgKiA0OworICAgICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7CisKKyAgICAgICAgaWYgKGhhc1RyYW5zZmVyTWFwcykgeworICAgICAgICAgIGZvciAodmFyIF9rMiA9IDA7IF9rMiA8IGVsZW1zSW5UaGlzQ2h1bms7IF9rMiArPSA0KSB7CisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBSZWQpIHsKKyAgICAgICAgICAgICAgZGVzdFtfazIgKyAwXSA9IHRyYW5zZmVyTWFwUmVkW2Rlc3RbX2syICsgMF1dOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBHcmVlbikgeworICAgICAgICAgICAgICBkZXN0W19rMiArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W19rMiArIDFdXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwQmx1ZSkgeworICAgICAgICAgICAgICBkZXN0W19rMiArIDJdID0gdHJhbnNmZXJNYXBCbHVlW2Rlc3RbX2syICsgMl1dOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUCkgeworICAgICAgdmFyIF9oYXNUcmFuc2Zlck1hcHMgPSAhISh0cmFuc2Zlck1hcFJlZCB8fCB0cmFuc2Zlck1hcEdyZWVuIHx8IHRyYW5zZmVyTWFwQmx1ZSk7CisKKyAgICAgIHRoaXNDaHVua0hlaWdodCA9IEZVTExfQ0hVTktfSEVJR0hUOworICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogdGhpc0NodW5rSGVpZ2h0OworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykgeworICAgICAgICBpZiAoaSA+PSBmdWxsQ2h1bmtzKSB7CisgICAgICAgICAgdGhpc0NodW5rSGVpZ2h0ID0gcGFydGlhbENodW5rSGVpZ2h0OworICAgICAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGRlc3RQb3MgPSAwOworCisgICAgICAgIGZvciAoaiA9IGVsZW1zSW5UaGlzQ2h1bms7IGotLTspIHsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdOworICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107CisgICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSAyNTU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX2hhc1RyYW5zZmVyTWFwcykgeworICAgICAgICAgIGZvciAodmFyIF9rMyA9IDA7IF9rMyA8IGRlc3RQb3M7IF9rMyArPSA0KSB7CisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBSZWQpIHsKKyAgICAgICAgICAgICAgZGVzdFtfazMgKyAwXSA9IHRyYW5zZmVyTWFwUmVkW2Rlc3RbX2szICsgMF1dOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBHcmVlbikgeworICAgICAgICAgICAgICBkZXN0W19rMyArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W19rMyArIDFdXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwQmx1ZSkgeworICAgICAgICAgICAgICBkZXN0W19rMyArIDJdID0gdHJhbnNmZXJNYXBCbHVlW2Rlc3RbX2szICsgMl1dOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoImJhZCBpbWFnZSBraW5kOiAiLmNvbmNhdChpbWdEYXRhLmtpbmQpKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwdXRCaW5hcnlJbWFnZU1hc2soY3R4LCBpbWdEYXRhKSB7CisgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LAorICAgICAgICB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgdmFyIHBhcnRpYWxDaHVua0hlaWdodCA9IGhlaWdodCAlIEZVTExfQ0hVTktfSEVJR0hUOworICAgIHZhciBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICB2YXIgdG90YWxDaHVua3MgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQgPT09IDAgPyBmdWxsQ2h1bmtzIDogZnVsbENodW5rcyArIDE7CisgICAgdmFyIGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTsKKyAgICB2YXIgc3JjUG9zID0gMDsKKyAgICB2YXIgc3JjID0gaW1nRGF0YS5kYXRhOworICAgIHZhciBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHsKKyAgICAgIHZhciB0aGlzQ2h1bmtIZWlnaHQgPSBpIDwgZnVsbENodW5rcyA/IEZVTExfQ0hVTktfSEVJR0hUIDogcGFydGlhbENodW5rSGVpZ2h0OworICAgICAgdmFyIGRlc3RQb3MgPSAzOworCisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXNDaHVua0hlaWdodDsgaisrKSB7CisgICAgICAgIHZhciBtYXNrID0gMDsKKworICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHdpZHRoOyBrKyspIHsKKyAgICAgICAgICBpZiAoIW1hc2spIHsKKyAgICAgICAgICAgIHZhciBlbGVtID0gc3JjW3NyY1BvcysrXTsKKyAgICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGVzdFtkZXN0UG9zXSA9IGVsZW0gJiBtYXNrID8gMCA6IDI1NTsKKyAgICAgICAgICBkZXN0UG9zICs9IDQ7CisgICAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb3B5Q3R4U3RhdGUoc291cmNlQ3R4LCBkZXN0Q3R4KSB7CisgICAgdmFyIHByb3BlcnRpZXMgPSBbInN0cm9rZVN0eWxlIiwgImZpbGxTdHlsZSIsICJmaWxsUnVsZSIsICJnbG9iYWxBbHBoYSIsICJsaW5lV2lkdGgiLCAibGluZUNhcCIsICJsaW5lSm9pbiIsICJtaXRlckxpbWl0IiwgImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsICJmb250Il07CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07CisKKyAgICAgIGlmIChzb3VyY2VDdHhbcHJvcGVydHldICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgZGVzdEN0eFtwcm9wZXJ0eV0gPSBzb3VyY2VDdHhbcHJvcGVydHldOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzb3VyY2VDdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkgeworICAgICAgZGVzdEN0eC5zZXRMaW5lRGFzaChzb3VyY2VDdHguZ2V0TGluZURhc2goKSk7CisgICAgICBkZXN0Q3R4LmxpbmVEYXNoT2Zmc2V0ID0gc291cmNlQ3R4LmxpbmVEYXNoT2Zmc2V0OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KGN0eCkgeworICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjMDAwMDAwIjsKKyAgICBjdHguZmlsbFN0eWxlID0gIiMwMDAwMDAiOworICAgIGN0eC5maWxsUnVsZSA9ICJub256ZXJvIjsKKyAgICBjdHguZ2xvYmFsQWxwaGEgPSAxOworICAgIGN0eC5saW5lV2lkdGggPSAxOworICAgIGN0eC5saW5lQ2FwID0gImJ1dHQiOworICAgIGN0eC5saW5lSm9pbiA9ICJtaXRlciI7CisgICAgY3R4Lm1pdGVyTGltaXQgPSAxMDsKKyAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNvdXJjZS1vdmVyIjsKKyAgICBjdHguZm9udCA9ICIxMHB4IHNhbnMtc2VyaWYiOworCisgICAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBjdHguc2V0TGluZURhc2goW10pOworICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gMDsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21wb3NlU01hc2tCYWNrZHJvcChieXRlcywgcjAsIGcwLCBiMCkgeworICAgIHZhciBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisKKyAgICBmb3IgKHZhciBpID0gMzsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CisgICAgICB2YXIgYWxwaGEgPSBieXRlc1tpXTsKKworICAgICAgaWYgKGFscGhhID09PSAwKSB7CisgICAgICAgIGJ5dGVzW2kgLSAzXSA9IHIwOworICAgICAgICBieXRlc1tpIC0gMl0gPSBnMDsKKyAgICAgICAgYnl0ZXNbaSAtIDFdID0gYjA7CisgICAgICB9IGVsc2UgaWYgKGFscGhhIDwgMjU1KSB7CisgICAgICAgIHZhciBhbHBoYV8gPSAyNTUgLSBhbHBoYTsKKyAgICAgICAgYnl0ZXNbaSAtIDNdID0gYnl0ZXNbaSAtIDNdICogYWxwaGEgKyByMCAqIGFscGhhXyA+PiA4OworICAgICAgICBieXRlc1tpIC0gMl0gPSBieXRlc1tpIC0gMl0gKiBhbHBoYSArIGcwICogYWxwaGFfID4+IDg7CisgICAgICAgIGJ5dGVzW2kgLSAxXSA9IGJ5dGVzW2kgLSAxXSAqIGFscGhhICsgYjAgKiBhbHBoYV8gPj4gODsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYShtYXNrRGF0YSwgbGF5ZXJEYXRhLCB0cmFuc2Zlck1hcCkgeworICAgIHZhciBsZW5ndGggPSBtYXNrRGF0YS5sZW5ndGg7CisgICAgdmFyIHNjYWxlID0gMSAvIDI1NTsKKworICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgIHZhciBhbHBoYSA9IHRyYW5zZmVyTWFwID8gdHJhbnNmZXJNYXBbbWFza0RhdGFbaV1dIDogbWFza0RhdGFbaV07CisgICAgICBsYXllckRhdGFbaV0gPSBsYXllckRhdGFbaV0gKiBhbHBoYSAqIHNjYWxlIHwgMDsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21wb3NlU01hc2tMdW1pbm9zaXR5KG1hc2tEYXRhLCBsYXllckRhdGEsIHRyYW5zZmVyTWFwKSB7CisgICAgdmFyIGxlbmd0aCA9IG1hc2tEYXRhLmxlbmd0aDsKKworICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgIHZhciB5ID0gbWFza0RhdGFbaSAtIDNdICogNzcgKyBtYXNrRGF0YVtpIC0gMl0gKiAxNTIgKyBtYXNrRGF0YVtpIC0gMV0gKiAyODsKKyAgICAgIGxheWVyRGF0YVtpXSA9IHRyYW5zZmVyTWFwID8gbGF5ZXJEYXRhW2ldICogdHJhbnNmZXJNYXBbeSA+PiA4XSA+PiA4IDogbGF5ZXJEYXRhW2ldICogeSA+PiAxNjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZW5lcmljQ29tcG9zZVNNYXNrKG1hc2tDdHgsIGxheWVyQ3R4LCB3aWR0aCwgaGVpZ2h0LCBzdWJ0eXBlLCBiYWNrZHJvcCwgdHJhbnNmZXJNYXApIHsKKyAgICB2YXIgaGFzQmFja2Ryb3AgPSAhIWJhY2tkcm9wOworICAgIHZhciByMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMF0gOiAwOworICAgIHZhciBnMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMV0gOiAwOworICAgIHZhciBiMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMl0gOiAwOworICAgIHZhciBjb21wb3NlRm47CisKKyAgICBpZiAoc3VidHlwZSA9PT0gIkx1bWlub3NpdHkiKSB7CisgICAgICBjb21wb3NlRm4gPSBjb21wb3NlU01hc2tMdW1pbm9zaXR5OworICAgIH0gZWxzZSB7CisgICAgICBjb21wb3NlRm4gPSBjb21wb3NlU01hc2tBbHBoYTsKKyAgICB9CisKKyAgICB2YXIgUElYRUxTX1RPX1BST0NFU1MgPSAxMDQ4NTc2OworICAgIHZhciBjaHVua1NpemUgPSBNYXRoLm1pbihoZWlnaHQsIE1hdGguY2VpbChQSVhFTFNfVE9fUFJPQ0VTUyAvIHdpZHRoKSk7CisKKyAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArPSBjaHVua1NpemUpIHsKKyAgICAgIHZhciBjaHVua0hlaWdodCA9IE1hdGgubWluKGNodW5rU2l6ZSwgaGVpZ2h0IC0gcm93KTsKKyAgICAgIHZhciBtYXNrRGF0YSA9IG1hc2tDdHguZ2V0SW1hZ2VEYXRhKDAsIHJvdywgd2lkdGgsIGNodW5rSGVpZ2h0KTsKKyAgICAgIHZhciBsYXllckRhdGEgPSBsYXllckN0eC5nZXRJbWFnZURhdGEoMCwgcm93LCB3aWR0aCwgY2h1bmtIZWlnaHQpOworCisgICAgICBpZiAoaGFzQmFja2Ryb3ApIHsKKyAgICAgICAgY29tcG9zZVNNYXNrQmFja2Ryb3AobWFza0RhdGEuZGF0YSwgcjAsIGcwLCBiMCk7CisgICAgICB9CisKKyAgICAgIGNvbXBvc2VGbihtYXNrRGF0YS5kYXRhLCBsYXllckRhdGEuZGF0YSwgdHJhbnNmZXJNYXApOworICAgICAgbWFza0N0eC5wdXRJbWFnZURhdGEobGF5ZXJEYXRhLCAwLCByb3cpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGNvbXBvc2VTTWFzayhjdHgsIHNtYXNrLCBsYXllckN0eCwgd2ViR0xDb250ZXh0KSB7CisgICAgdmFyIG1hc2sgPSBzbWFzay5jYW52YXM7CisgICAgdmFyIG1hc2tDdHggPSBzbWFzay5jb250ZXh0OworICAgIGN0eC5zZXRUcmFuc2Zvcm0oc21hc2suc2NhbGVYLCAwLCAwLCBzbWFzay5zY2FsZVksIHNtYXNrLm9mZnNldFgsIHNtYXNrLm9mZnNldFkpOworICAgIHZhciBiYWNrZHJvcCA9IHNtYXNrLmJhY2tkcm9wIHx8IG51bGw7CisKKyAgICBpZiAoIXNtYXNrLnRyYW5zZmVyTWFwICYmIHdlYkdMQ29udGV4dC5pc0VuYWJsZWQpIHsKKyAgICAgIHZhciBjb21wb3NlZCA9IHdlYkdMQ29udGV4dC5jb21wb3NlU01hc2soeworICAgICAgICBsYXllcjogbGF5ZXJDdHguY2FudmFzLAorICAgICAgICBtYXNrOiBtYXNrLAorICAgICAgICBwcm9wZXJ0aWVzOiB7CisgICAgICAgICAgc3VidHlwZTogc21hc2suc3VidHlwZSwKKyAgICAgICAgICBiYWNrZHJvcDogYmFja2Ryb3AKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApOworICAgICAgY3R4LmRyYXdJbWFnZShjb21wb3NlZCwgc21hc2sub2Zmc2V0WCwgc21hc2sub2Zmc2V0WSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2VuZXJpY0NvbXBvc2VTTWFzayhtYXNrQ3R4LCBsYXllckN0eCwgbWFzay53aWR0aCwgbWFzay5oZWlnaHQsIHNtYXNrLnN1YnR5cGUsIGJhY2tkcm9wLCBzbWFzay50cmFuc2Zlck1hcCk7CisgICAgY3R4LmRyYXdJbWFnZShtYXNrLCAwLCAwKTsKKyAgfQorCisgIHZhciBMSU5FX0NBUF9TVFlMRVMgPSBbImJ1dHQiLCAicm91bmQiLCAic3F1YXJlIl07CisgIHZhciBMSU5FX0pPSU5fU1RZTEVTID0gWyJtaXRlciIsICJyb3VuZCIsICJiZXZlbCJdOworICB2YXIgTk9STUFMX0NMSVAgPSB7fTsKKyAgdmFyIEVPX0NMSVAgPSB7fTsKKyAgQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlID0geworICAgIGJlZ2luRHJhd2luZzogZnVuY3Rpb24gYmVnaW5EcmF3aW5nKF9yZWYyKSB7CisgICAgICB2YXIgdHJhbnNmb3JtID0gX3JlZjIudHJhbnNmb3JtLAorICAgICAgICAgIHZpZXdwb3J0ID0gX3JlZjIudmlld3BvcnQsCisgICAgICAgICAgX3JlZjIkdHJhbnNwYXJlbmN5ID0gX3JlZjIudHJhbnNwYXJlbmN5LAorICAgICAgICAgIHRyYW5zcGFyZW5jeSA9IF9yZWYyJHRyYW5zcGFyZW5jeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiR0cmFuc3BhcmVuY3ksCisgICAgICAgICAgX3JlZjIkYmFja2dyb3VuZCA9IF9yZWYyLmJhY2tncm91bmQsCisgICAgICAgICAgYmFja2dyb3VuZCA9IF9yZWYyJGJhY2tncm91bmQgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRiYWNrZ3JvdW5kOworICAgICAgdmFyIHdpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoOworICAgICAgdmFyIGhlaWdodCA9IHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7CisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kIHx8ICJyZ2IoMjU1LCAyNTUsIDI1NSkiOworICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisKKyAgICAgIGlmICh0cmFuc3BhcmVuY3kpIHsKKyAgICAgICAgdmFyIHRyYW5zcGFyZW50Q2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoInRyYW5zcGFyZW50Iiwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7CisgICAgICAgIHRoaXMuY29tcG9zaXRlQ3R4ID0gdGhpcy5jdHg7CisgICAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSB0cmFuc3BhcmVudENhbnZhcy5jYW52YXM7CisgICAgICAgIHRoaXMuY3R4ID0gdHJhbnNwYXJlbnRDYW52YXMuY29udGV4dDsKKyAgICAgICAgdGhpcy5jdHguc2F2ZSgpOworICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsIHRoaXMuY29tcG9zaXRlQ3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0pOworICAgICAgfQorCisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7CisKKyAgICAgIGlmICh0cmFuc2Zvcm0pIHsKKyAgICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCB0cmFuc2Zvcm0pOworICAgICAgfQorCisgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsIHZpZXdwb3J0LnRyYW5zZm9ybSk7CisgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLnNsaWNlKCk7CisKKyAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHsKKyAgICAgICAgdGhpcy5pbWFnZUxheWVyLmJlZ2luTGF5b3V0KCk7CisgICAgICB9CisgICAgfSwKKyAgICBleGVjdXRlT3BlcmF0b3JMaXN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCwgZXhlY3V0aW9uU3RhcnRJZHgsIGNvbnRpbnVlQ2FsbGJhY2ssIHN0ZXBwZXIpIHsKKyAgICAgIHZhciBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5OworICAgICAgdmFyIGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTsKKyAgICAgIHZhciBpID0gZXhlY3V0aW9uU3RhcnRJZHggfHwgMDsKKyAgICAgIHZhciBhcmdzQXJyYXlMZW4gPSBhcmdzQXJyYXkubGVuZ3RoOworCisgICAgICBpZiAoYXJnc0FycmF5TGVuID09PSBpKSB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorCisgICAgICB2YXIgY2h1bmtPcGVyYXRpb25zID0gYXJnc0FycmF5TGVuIC0gaSA+IEVYRUNVVElPTl9TVEVQUyAmJiB0eXBlb2YgY29udGludWVDYWxsYmFjayA9PT0gImZ1bmN0aW9uIjsKKyAgICAgIHZhciBlbmRUaW1lID0gY2h1bmtPcGVyYXRpb25zID8gRGF0ZS5ub3coKSArIEVYRUNVVElPTl9USU1FIDogMDsKKyAgICAgIHZhciBzdGVwcyA9IDA7CisgICAgICB2YXIgY29tbW9uT2JqcyA9IHRoaXMuY29tbW9uT2JqczsKKyAgICAgIHZhciBvYmpzID0gdGhpcy5vYmpzOworICAgICAgdmFyIGZuSWQ7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChzdGVwcGVyICE9PSB1bmRlZmluZWQgJiYgaSA9PT0gc3RlcHBlci5uZXh0QnJlYWtQb2ludCkgeworICAgICAgICAgIHN0ZXBwZXIuYnJlYWtJdChpLCBjb250aW51ZUNhbGxiYWNrKTsKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorCisgICAgICAgIGZuSWQgPSBmbkFycmF5W2ldOworCisgICAgICAgIGlmIChmbklkICE9PSBfdXRpbC5PUFMuZGVwZW5kZW5jeSkgeworICAgICAgICAgIHRoaXNbZm5JZF0uYXBwbHkodGhpcywgYXJnc0FycmF5W2ldKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYXJnc0FycmF5W2ldKSwKKyAgICAgICAgICAgICAgX3N0ZXA7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgICAgdmFyIGRlcE9iaklkID0gX3N0ZXAudmFsdWU7CisgICAgICAgICAgICAgIHZhciBvYmpzUG9vbCA9IGRlcE9iaklkLnN0YXJ0c1dpdGgoImdfIikgPyBjb21tb25PYmpzIDogb2JqczsKKworICAgICAgICAgICAgICBpZiAoIW9ianNQb29sLmhhcyhkZXBPYmpJZCkpIHsKKyAgICAgICAgICAgICAgICBvYmpzUG9vbC5nZXQoZGVwT2JqSWQsIGNvbnRpbnVlQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgICBfaXRlcmF0b3IuZShlcnIpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfaXRlcmF0b3IuZigpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkrKzsKKworICAgICAgICBpZiAoaSA9PT0gYXJnc0FycmF5TGVuKSB7CisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2h1bmtPcGVyYXRpb25zICYmICsrc3RlcHMgPiBFWEVDVVRJT05fU1RFUFMpIHsKKyAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IGVuZFRpbWUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlQ2FsbGJhY2soKTsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgIH0KKworICAgICAgICAgIHN0ZXBzID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgZW5kRHJhd2luZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kRHJhd2luZygpIHsKKyAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgIT09IG51bGwpIHsKKyAgICAgICAgdGhpcy5lbmRTTWFza0dyb3VwKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTsKKworICAgICAgaWYgKHRoaXMudHJhbnNwYXJlbnRDYW52YXMpIHsKKyAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNvbXBvc2l0ZUN0eDsKKyAgICAgICAgdGhpcy5jdHguc2F2ZSgpOworICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnRyYW5zcGFyZW50Q2FudmFzLCAwLCAwKTsKKyAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpOworICAgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdGhpcy5jYWNoZWRDYW52YXNlcy5jbGVhcigpOworICAgICAgdGhpcy53ZWJHTENvbnRleHQuY2xlYXIoKTsKKworICAgICAgaWYgKHRoaXMuaW1hZ2VMYXllcikgeworICAgICAgICB0aGlzLmltYWdlTGF5ZXIuZW5kTGF5b3V0KCk7CisgICAgICB9CisgICAgfSwKKyAgICBzZXRMaW5lV2lkdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExpbmVXaWR0aCh3aWR0aCkgeworICAgICAgdGhpcy5jdXJyZW50LmxpbmVXaWR0aCA9IHdpZHRoOworICAgICAgdGhpcy5jdHgubGluZVdpZHRoID0gd2lkdGg7CisgICAgfSwKKyAgICBzZXRMaW5lQ2FwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMaW5lQ2FwKHN0eWxlKSB7CisgICAgICB0aGlzLmN0eC5saW5lQ2FwID0gTElORV9DQVBfU1RZTEVTW3N0eWxlXTsKKyAgICB9LAorICAgIHNldExpbmVKb2luOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMaW5lSm9pbihzdHlsZSkgeworICAgICAgdGhpcy5jdHgubGluZUpvaW4gPSBMSU5FX0pPSU5fU1RZTEVTW3N0eWxlXTsKKyAgICB9LAorICAgIHNldE1pdGVyTGltaXQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldE1pdGVyTGltaXQobGltaXQpIHsKKyAgICAgIHRoaXMuY3R4Lm1pdGVyTGltaXQgPSBsaW1pdDsKKyAgICB9LAorICAgIHNldERhc2g6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKworICAgICAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoQXJyYXkpOworICAgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBkYXNoUGhhc2U7CisgICAgICB9CisgICAgfSwKKyAgICBzZXRSZW5kZXJpbmdJbnRlbnQ6IGZ1bmN0aW9uIHNldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHt9LAorICAgIHNldEZsYXRuZXNzOiBmdW5jdGlvbiBzZXRGbGF0bmVzcyhmbGF0bmVzcykge30sCisgICAgc2V0R1N0YXRlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRHU3RhdGUoc3RhdGVzKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdGF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgc3RhdGUgPSBzdGF0ZXNbaV07CisgICAgICAgIHZhciBrZXkgPSBzdGF0ZVswXTsKKyAgICAgICAgdmFyIHZhbHVlID0gc3RhdGVbMV07CisKKyAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICBjYXNlICJMVyI6CisgICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkxDIjoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkxKIjoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4odmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJNTCI6CisgICAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQodmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJEIjoKKyAgICAgICAgICAgIHRoaXMuc2V0RGFzaCh2YWx1ZVswXSwgdmFsdWVbMV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJSSSI6CisgICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkZMIjoKKyAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3ModmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJGb250IjoKKyAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh2YWx1ZVswXSwgdmFsdWVbMV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJDQSI6CisgICAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBzdGF0ZVsxXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiY2EiOgorICAgICAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSA9IHN0YXRlWzFdOworICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBzdGF0ZVsxXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQk0iOgorICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlNNYXNrIjoKKyAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2spIHsKKyAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggPiAwICYmIHRoaXMuc3RhdGVTdGFja1t0aGlzLnN0YXRlU3RhY2subGVuZ3RoIC0gMV0uYWN0aXZlU01hc2sgPT09IHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykgeworICAgICAgICAgICAgICAgIHRoaXMuc3VzcGVuZFNNYXNrR3JvdXAoKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmVuZFNNYXNrR3JvdXAoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSB2YWx1ZSA/IHRoaXMudGVtcFNNYXNrIDogbnVsbDsKKworICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykgeworICAgICAgICAgICAgICB0aGlzLmJlZ2luU01hc2tHcm91cCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlRSIjoKKyAgICAgICAgICAgIHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgYmVnaW5TTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpblNNYXNrR3JvdXAoKSB7CisgICAgICB2YXIgYWN0aXZlU01hc2sgPSB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s7CisgICAgICB2YXIgZHJhd25XaWR0aCA9IGFjdGl2ZVNNYXNrLmNhbnZhcy53aWR0aDsKKyAgICAgIHZhciBkcmF3bkhlaWdodCA9IGFjdGl2ZVNNYXNrLmNhbnZhcy5oZWlnaHQ7CisgICAgICB2YXIgY2FjaGVJZCA9ICJzbWFza0dyb3VwQXQiICsgdGhpcy5ncm91cExldmVsOworICAgICAgdmFyIHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhjYWNoZUlkLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCwgdHJ1ZSk7CisgICAgICB2YXIgY3VycmVudEN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBjdXJyZW50Q3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07CisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICB2YXIgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7CisgICAgICBncm91cEN0eC5zY2FsZSgxIC8gYWN0aXZlU01hc2suc2NhbGVYLCAxIC8gYWN0aXZlU01hc2suc2NhbGVZKTsKKyAgICAgIGdyb3VwQ3R4LnRyYW5zbGF0ZSgtYWN0aXZlU01hc2sub2Zmc2V0WCwgLWFjdGl2ZVNNYXNrLm9mZnNldFkpOworICAgICAgZ3JvdXBDdHgudHJhbnNmb3JtLmFwcGx5KGdyb3VwQ3R4LCBjdXJyZW50VHJhbnNmb3JtKTsKKyAgICAgIGFjdGl2ZVNNYXNrLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZSA9IGdyb3VwQ3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlOworICAgICAgY29weUN0eFN0YXRlKGN1cnJlbnRDdHgsIGdyb3VwQ3R4KTsKKyAgICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7CisgICAgICB0aGlzLnNldEdTdGF0ZShbWyJCTSIsICJzb3VyY2Utb3ZlciJdLCBbImNhIiwgMV0sIFsiQ0EiLCAxXV0pOworICAgICAgdGhpcy5ncm91cFN0YWNrLnB1c2goY3VycmVudEN0eCk7CisgICAgICB0aGlzLmdyb3VwTGV2ZWwrKzsKKyAgICB9LAorICAgIHN1c3BlbmRTTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRTTWFza0dyb3VwKCkgeworICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdHg7CisgICAgICB0aGlzLmdyb3VwTGV2ZWwtLTsKKyAgICAgIHRoaXMuY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpOworICAgICAgY29tcG9zZVNNYXNrKHRoaXMuY3R4LCB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2ssIGdyb3VwQ3R4LCB0aGlzLndlYkdMQ29udGV4dCk7CisgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICBjb3B5Q3R4U3RhdGUoZ3JvdXBDdHgsIHRoaXMuY3R4KTsKKyAgICAgIHRoaXMuY3VycmVudC5yZXN1bWVTTWFza0N0eCA9IGdyb3VwQ3R4OworCisgICAgICB2YXIgZGVsdGFUcmFuc2Zvcm0gPSBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2suc3RhcnRUcmFuc2Zvcm1JbnZlcnNlLCBncm91cEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtKTsKKworICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCBkZWx0YVRyYW5zZm9ybSk7CisgICAgICBncm91cEN0eC5zYXZlKCk7CisgICAgICBncm91cEN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgICBncm91cEN0eC5jbGVhclJlY3QoMCwgMCwgZ3JvdXBDdHguY2FudmFzLndpZHRoLCBncm91cEN0eC5jYW52YXMuaGVpZ2h0KTsKKyAgICAgIGdyb3VwQ3R4LnJlc3RvcmUoKTsKKyAgICB9LAorICAgIHJlc3VtZVNNYXNrR3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFNNYXNrR3JvdXAoKSB7CisgICAgICB2YXIgZ3JvdXBDdHggPSB0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHg7CisgICAgICB2YXIgY3VycmVudEN0eCA9IHRoaXMuY3R4OworICAgICAgdGhpcy5jdHggPSBncm91cEN0eDsKKyAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGN1cnJlbnRDdHgpOworICAgICAgdGhpcy5ncm91cExldmVsKys7CisgICAgfSwKKyAgICBlbmRTTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRTTWFza0dyb3VwKCkgeworICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdHg7CisgICAgICB0aGlzLmdyb3VwTGV2ZWwtLTsKKyAgICAgIHRoaXMuY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpOworICAgICAgY29tcG9zZVNNYXNrKHRoaXMuY3R4LCB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2ssIGdyb3VwQ3R4LCB0aGlzLndlYkdMQ29udGV4dCk7CisgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisgICAgICBjb3B5Q3R4U3RhdGUoZ3JvdXBDdHgsIHRoaXMuY3R4KTsKKworICAgICAgdmFyIGRlbHRhVHJhbnNmb3JtID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZSwgZ3JvdXBDdHgubW96Q3VycmVudFRyYW5zZm9ybSk7CisKKyAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgZGVsdGFUcmFuc2Zvcm0pOworICAgIH0sCisgICAgc2F2ZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2F2ZSgpIHsKKyAgICAgIHRoaXMuY3R4LnNhdmUoKTsKKyAgICAgIHZhciBvbGQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICB0aGlzLnN0YXRlU3RhY2sucHVzaChvbGQpOworICAgICAgdGhpcy5jdXJyZW50ID0gb2xkLmNsb25lKCk7CisgICAgICB0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHggPSBudWxsOworICAgIH0sCisgICAgcmVzdG9yZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcmVzdG9yZSgpIHsKKyAgICAgIGlmICh0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHgpIHsKKyAgICAgICAgdGhpcy5yZXN1bWVTTWFza0dyb3VwKCk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgIT09IG51bGwgJiYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggPT09IDAgfHwgdGhpcy5zdGF0ZVN0YWNrW3RoaXMuc3RhdGVTdGFjay5sZW5ndGggLSAxXS5hY3RpdmVTTWFzayAhPT0gdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSkgeworICAgICAgICB0aGlzLmVuZFNNYXNrR3JvdXAoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggIT09IDApIHsKKyAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpOworICAgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsOworICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfdHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTsKKyAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsOworICAgIH0sCisgICAgY29uc3RydWN0UGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY29uc3RydWN0UGF0aChvcHMsIGFyZ3MpIHsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgdmFyIHggPSBjdXJyZW50LngsCisgICAgICAgICAgeSA9IGN1cnJlbnQueTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwLCBpaSA9IG9wcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAob3BzW2ldIHwgMCkgeworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnJlY3RhbmdsZToKKyAgICAgICAgICAgIHggPSBhcmdzW2orK107CisgICAgICAgICAgICB5ID0gYXJnc1tqKytdOworICAgICAgICAgICAgdmFyIHdpZHRoID0gYXJnc1tqKytdOworICAgICAgICAgICAgdmFyIGhlaWdodCA9IGFyZ3NbaisrXTsKKworICAgICAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIGN0eC5saW5lV2lkdGggPCB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSkgeworICAgICAgICAgICAgICB3aWR0aCA9IHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGVpZ2h0ID09PSAwICYmIGN0eC5saW5lV2lkdGggPCB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSkgeworICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHh3ID0geCArIHdpZHRoOworICAgICAgICAgICAgdmFyIHloID0geSArIGhlaWdodDsKKyAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7CisgICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5KTsKKyAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTsKKyAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeWgpOworICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTsKKyAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRvOgorICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2orK107CisgICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5saW5lVG86CisgICAgICAgICAgICB4ID0gYXJnc1tqKytdOworICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG86CisgICAgICAgICAgICB4ID0gYXJnc1tqICsgNF07CisgICAgICAgICAgICB5ID0gYXJnc1tqICsgNV07CisgICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdLCB4LCB5KTsKKyAgICAgICAgICAgIGogKz0gNjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzI6CisgICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyh4LCB5LCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdKTsKKyAgICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTsKKyAgICAgICAgICAgIGogKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzM6CisgICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07CisgICAgICAgICAgICB5ID0gYXJnc1tqICsgM107CisgICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhhcmdzW2pdLCBhcmdzW2ogKyAxXSwgeCwgeSwgeCwgeSk7CisgICAgICAgICAgICBqICs9IDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDoKKyAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpOworICAgIH0sCisgICAgY2xvc2VQYXRoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbG9zZVBhdGgoKSB7CisgICAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTsKKyAgICB9LAorICAgIHN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc3Ryb2tlKGNvbnN1bWVQYXRoKSB7CisgICAgICBjb25zdW1lUGF0aCA9IHR5cGVvZiBjb25zdW1lUGF0aCAhPT0gInVuZGVmaW5lZCIgPyBjb25zdW1lUGF0aCA6IHRydWU7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7CisgICAgICBjdHguZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGE7CisKKyAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIGlmIChzdHJva2VDb2xvciAmJiBzdHJva2VDb2xvci5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpICYmIHN0cm9rZUNvbG9yLnR5cGUgPT09ICJQYXR0ZXJuIikgeworICAgICAgICAgIGN0eC5zYXZlKCk7CisgICAgICAgICAgdmFyIHRyYW5zZm9ybSA9IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworCisgICAgICAgICAgdmFyIHNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0cmFuc2Zvcm0pWzBdOworCisgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMpOworICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBNYXRoLm1heCh0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSAqIE1JTl9XSURUSF9GQUNUT1IsIHRoaXMuY3VycmVudC5saW5lV2lkdGggKiBzY2FsZSk7CisgICAgICAgICAgY3R4LnN0cm9rZSgpOworICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IE1hdGgubWF4KHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpICogTUlOX1dJRFRIX0ZBQ1RPUiwgdGhpcy5jdXJyZW50LmxpbmVXaWR0aCk7CisgICAgICAgICAgY3R4LnN0cm9rZSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjb25zdW1lUGF0aCkgeworICAgICAgICB0aGlzLmNvbnN1bWVQYXRoKCk7CisgICAgICB9CisKKyAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5maWxsQWxwaGE7CisgICAgfSwKKyAgICBjbG9zZVN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VTdHJva2UoKSB7CisgICAgICB0aGlzLmNsb3NlUGF0aCgpOworICAgICAgdGhpcy5zdHJva2UoKTsKKyAgICB9LAorICAgIGZpbGw6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2ZpbGwoY29uc3VtZVBhdGgpIHsKKyAgICAgIGNvbnN1bWVQYXRoID0gdHlwZW9mIGNvbnN1bWVQYXRoICE9PSAidW5kZWZpbmVkIiA/IGNvbnN1bWVQYXRoIDogdHJ1ZTsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yOworICAgICAgdmFyIGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7CisgICAgICB2YXIgbmVlZFJlc3RvcmUgPSBmYWxzZTsKKworICAgICAgaWYgKGlzUGF0dGVybkZpbGwpIHsKKyAgICAgICAgY3R4LnNhdmUoKTsKKworICAgICAgICBpZiAodGhpcy5iYXNlVHJhbnNmb3JtKSB7CisgICAgICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHRoaXMuYmFzZVRyYW5zZm9ybSk7CisgICAgICAgIH0KKworICAgICAgICBjdHguZmlsbFN0eWxlID0gZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzKTsKKyAgICAgICAgbmVlZFJlc3RvcmUgPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICBpZiAodGhpcy5wZW5kaW5nRU9GaWxsKSB7CisgICAgICAgICAgY3R4LmZpbGwoImV2ZW5vZGQiKTsKKyAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdHguZmlsbCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChuZWVkUmVzdG9yZSkgeworICAgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgfQorCisgICAgICBpZiAoY29uc3VtZVBhdGgpIHsKKyAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpOworICAgICAgfQorICAgIH0sCisgICAgZW9GaWxsOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lb0ZpbGwoKSB7CisgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlOworICAgICAgdGhpcy5maWxsKCk7CisgICAgfSwKKyAgICBmaWxsU3Ryb2tlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19maWxsU3Ryb2tlKCkgeworICAgICAgdGhpcy5maWxsKGZhbHNlKTsKKyAgICAgIHRoaXMuc3Ryb2tlKGZhbHNlKTsKKyAgICAgIHRoaXMuY29uc3VtZVBhdGgoKTsKKyAgICB9LAorICAgIGVvRmlsbFN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW9GaWxsU3Ryb2tlKCkgeworICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTsKKyAgICAgIHRoaXMuZmlsbFN0cm9rZSgpOworICAgIH0sCisgICAgY2xvc2VGaWxsU3Ryb2tlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbG9zZUZpbGxTdHJva2UoKSB7CisgICAgICB0aGlzLmNsb3NlUGF0aCgpOworICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7CisgICAgfSwKKyAgICBjbG9zZUVPRmlsbFN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VFT0ZpbGxTdHJva2UoKSB7CisgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlOworICAgICAgdGhpcy5jbG9zZVBhdGgoKTsKKyAgICAgIHRoaXMuZmlsbFN0cm9rZSgpOworICAgIH0sCisgICAgZW5kUGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kUGF0aCgpIHsKKyAgICAgIHRoaXMuY29uc3VtZVBhdGgoKTsKKyAgICB9LAorICAgIGNsaXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2NsaXAoKSB7CisgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gTk9STUFMX0NMSVA7CisgICAgfSwKKyAgICBlb0NsaXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VvQ2xpcCgpIHsKKyAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBFT19DTElQOworICAgIH0sCisgICAgYmVnaW5UZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpblRleHQoKSB7CisgICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxOworICAgICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggPSAwOworICAgICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgPSAwOworICAgIH0sCisgICAgZW5kVGV4dDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kVGV4dCgpIHsKKyAgICAgIHZhciBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRoczsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKworICAgICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgY3R4LmJlZ2luUGF0aCgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGN0eC5zYXZlKCk7CisgICAgICBjdHguYmVnaW5QYXRoKCk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpXTsKKyAgICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHBhdGgudHJhbnNmb3JtKTsKKyAgICAgICAgY3R4LnRyYW5zbGF0ZShwYXRoLngsIHBhdGgueSk7CisgICAgICAgIHBhdGguYWRkVG9QYXRoKGN0eCwgcGF0aC5mb250U2l6ZSk7CisgICAgICB9CisKKyAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICBjdHguY2xpcCgpOworICAgICAgY3R4LmJlZ2luUGF0aCgpOworICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1RleHRQYXRoczsKKyAgICB9LAorICAgIHNldENoYXJTcGFjaW5nOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRDaGFyU3BhY2luZyhzcGFjaW5nKSB7CisgICAgICB0aGlzLmN1cnJlbnQuY2hhclNwYWNpbmcgPSBzcGFjaW5nOworICAgIH0sCisgICAgc2V0V29yZFNwYWNpbmc6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFdvcmRTcGFjaW5nKHNwYWNpbmcpIHsKKyAgICAgIHRoaXMuY3VycmVudC53b3JkU3BhY2luZyA9IHNwYWNpbmc7CisgICAgfSwKKyAgICBzZXRIU2NhbGU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEhTY2FsZShzY2FsZSkgeworICAgICAgdGhpcy5jdXJyZW50LnRleHRIU2NhbGUgPSBzY2FsZSAvIDEwMDsKKyAgICB9LAorICAgIHNldExlYWRpbmc6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExlYWRpbmcobGVhZGluZykgeworICAgICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZzsKKyAgICB9LAorICAgIHNldEZvbnQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEZvbnQoZm9udFJlZk5hbWUsIHNpemUpIHsKKyAgICAgIHZhciBmb250T2JqID0gdGhpcy5jb21tb25PYmpzLmdldChmb250UmVmTmFtZSk7CisgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKworICAgICAgaWYgKCFmb250T2JqKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FuJ3QgZmluZCBmb250IGZvciAiLmNvbmNhdChmb250UmVmTmFtZSkpOworICAgICAgfQorCisgICAgICBjdXJyZW50LmZvbnRNYXRyaXggPSBmb250T2JqLmZvbnRNYXRyaXggPyBmb250T2JqLmZvbnRNYXRyaXggOiBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWDsKKworICAgICAgaWYgKGN1cnJlbnQuZm9udE1hdHJpeFswXSA9PT0gMCB8fCBjdXJyZW50LmZvbnRNYXRyaXhbM10gPT09IDApIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGZvbnQgbWF0cml4IGZvciBmb250ICIgKyBmb250UmVmTmFtZSk7CisgICAgICB9CisKKyAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBzaXplID0gLXNpemU7CisgICAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IC0xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gMTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jdXJyZW50LmZvbnQgPSBmb250T2JqOworICAgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplID0gc2l6ZTsKKworICAgICAgaWYgKGZvbnRPYmouaXNUeXBlM0ZvbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgbmFtZSA9IGZvbnRPYmoubG9hZGVkTmFtZSB8fCAic2Fucy1zZXJpZiI7CisgICAgICB2YXIgYm9sZCA9ICJub3JtYWwiOworCisgICAgICBpZiAoZm9udE9iai5ibGFjaykgeworICAgICAgICBib2xkID0gIjkwMCI7CisgICAgICB9IGVsc2UgaWYgKGZvbnRPYmouYm9sZCkgeworICAgICAgICBib2xkID0gImJvbGQiOworICAgICAgfQorCisgICAgICB2YXIgaXRhbGljID0gZm9udE9iai5pdGFsaWMgPyAiaXRhbGljIiA6ICJub3JtYWwiOworICAgICAgdmFyIHR5cGVmYWNlID0gIlwiIi5jb25jYXQobmFtZSwgIlwiLCAiKS5jb25jYXQoZm9udE9iai5mYWxsYmFja05hbWUpOworICAgICAgdmFyIGJyb3dzZXJGb250U2l6ZSA9IHNpemU7CisKKyAgICAgIGlmIChzaXplIDwgTUlOX0ZPTlRfU0laRSkgeworICAgICAgICBicm93c2VyRm9udFNpemUgPSBNSU5fRk9OVF9TSVpFOworICAgICAgfSBlbHNlIGlmIChzaXplID4gTUFYX0ZPTlRfU0laRSkgeworICAgICAgICBicm93c2VyRm9udFNpemUgPSBNQVhfRk9OVF9TSVpFOworICAgICAgfQorCisgICAgICB0aGlzLmN1cnJlbnQuZm9udFNpemVTY2FsZSA9IHNpemUgLyBicm93c2VyRm9udFNpemU7CisgICAgICB0aGlzLmN0eC5mb250ID0gIiIuY29uY2F0KGl0YWxpYywgIiAiKS5jb25jYXQoYm9sZCwgIiAiKS5jb25jYXQoYnJvd3NlckZvbnRTaXplLCAicHggIikuY29uY2F0KHR5cGVmYWNlKTsKKyAgICB9LAorICAgIHNldFRleHRSZW5kZXJpbmdNb2RlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRUZXh0UmVuZGVyaW5nTW9kZShtb2RlKSB7CisgICAgICB0aGlzLmN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPSBtb2RlOworICAgIH0sCisgICAgc2V0VGV4dFJpc2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFRleHRSaXNlKHJpc2UpIHsKKyAgICAgIHRoaXMuY3VycmVudC50ZXh0UmlzZSA9IHJpc2U7CisgICAgfSwKKyAgICBtb3ZlVGV4dDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfbW92ZVRleHQoeCwgeSkgeworICAgICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggKz0geDsKKyAgICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZICs9IHk7CisgICAgfSwKKyAgICBzZXRMZWFkaW5nTW92ZVRleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExlYWRpbmdNb3ZlVGV4dCh4LCB5KSB7CisgICAgICB0aGlzLnNldExlYWRpbmcoLXkpOworICAgICAgdGhpcy5tb3ZlVGV4dCh4LCB5KTsKKyAgICB9LAorICAgIHNldFRleHRNYXRyaXg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgeworICAgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07CisgICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpOworICAgICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggPSAwOworICAgICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgPSAwOworICAgIH0sCisgICAgbmV4dExpbmU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX25leHRMaW5lKCkgeworICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7CisgICAgfSwKKyAgICBwYWludENoYXI6IGZ1bmN0aW9uIHBhaW50Q2hhcihjaGFyYWN0ZXIsIHgsIHksIHBhdHRlcm5UcmFuc2Zvcm0pIHsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgdmFyIGZvbnQgPSBjdXJyZW50LmZvbnQ7CisgICAgICB2YXIgdGV4dFJlbmRlcmluZ01vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlOworICAgICAgdmFyIGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZSAvIGN1cnJlbnQuZm9udFNpemVTY2FsZTsKKyAgICAgIHZhciBmaWxsU3Ryb2tlTW9kZSA9IHRleHRSZW5kZXJpbmdNb2RlICYgX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSzsKKyAgICAgIHZhciBpc0FkZFRvUGF0aFNldCA9ICEhKHRleHRSZW5kZXJpbmdNb2RlICYgX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBRyk7CisgICAgICB2YXIgcGF0dGVybkZpbGwgPSBjdXJyZW50LnBhdHRlcm5GaWxsICYmICFmb250Lm1pc3NpbmdGaWxlOworICAgICAgdmFyIGFkZFRvUGF0aDsKKworICAgICAgaWYgKGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IGlzQWRkVG9QYXRoU2V0IHx8IHBhdHRlcm5GaWxsKSB7CisgICAgICAgIGFkZFRvUGF0aCA9IGZvbnQuZ2V0UGF0aEdlbmVyYXRvcih0aGlzLmNvbW1vbk9ianMsIGNoYXJhY3Rlcik7CisgICAgICB9CisKKyAgICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBwYXR0ZXJuRmlsbCkgeworICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICBjdHgudHJhbnNsYXRlKHgsIHkpOworICAgICAgICBjdHguYmVnaW5QYXRoKCk7CisgICAgICAgIGFkZFRvUGF0aChjdHgsIGZvbnRTaXplKTsKKworICAgICAgICBpZiAocGF0dGVyblRyYW5zZm9ybSkgeworICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3R4LCBwYXR0ZXJuVHJhbnNmb3JtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHsKKyAgICAgICAgICBjdHguZmlsbCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7CisgICAgICAgICAgY3R4LnN0cm9rZSgpOworICAgICAgICB9CisKKyAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHsKKyAgICAgICAgICBjdHguZmlsbFRleHQoY2hhcmFjdGVyLCB4LCB5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkgeworICAgICAgICAgIGN0eC5zdHJva2VUZXh0KGNoYXJhY3RlciwgeCwgeSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGlzQWRkVG9QYXRoU2V0KSB7CisgICAgICAgIHZhciBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRocyB8fCAodGhpcy5wZW5kaW5nVGV4dFBhdGhzID0gW10pOworICAgICAgICBwYXRocy5wdXNoKHsKKyAgICAgICAgICB0cmFuc2Zvcm06IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLAorICAgICAgICAgIHg6IHgsCisgICAgICAgICAgeTogeSwKKyAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsCisgICAgICAgICAgYWRkVG9QYXRoOiBhZGRUb1BhdGgKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIGdldCBpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCgpIHsKKyAgICAgIHZhciBfdGhpcyRjYWNoZWRDYW52YXNlcyQgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygiaXNGb250U3VicGl4ZWxBQUVuYWJsZWQiLCAxMCwgMTApLAorICAgICAgICAgIGN0eCA9IF90aGlzJGNhY2hlZENhbnZhc2VzJC5jb250ZXh0OworCisgICAgICBjdHguc2NhbGUoMS41LCAxKTsKKyAgICAgIGN0eC5maWxsVGV4dCgiSSIsIDAsIDEwKTsKKyAgICAgIHZhciBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMCwgMTApLmRhdGE7CisgICAgICB2YXIgZW5hYmxlZCA9IGZhbHNlOworCisgICAgICBmb3IgKHZhciBpID0gMzsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgICAgaWYgKGRhdGFbaV0gPiAwICYmIGRhdGFbaV0gPCAyNTUpIHsKKyAgICAgICAgICBlbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzRm9udFN1YnBpeGVsQUFFbmFibGVkIiwgZW5hYmxlZCk7CisgICAgfSwKKworICAgIHNob3dUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zaG93VGV4dChnbHlwaHMpIHsKKyAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgdmFyIGZvbnQgPSBjdXJyZW50LmZvbnQ7CisKKyAgICAgIGlmIChmb250LmlzVHlwZTNGb250KSB7CisgICAgICAgIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQoZ2x5cGhzKTsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTsKKworICAgICAgaWYgKGZvbnRTaXplID09PSAwKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlOworICAgICAgdmFyIGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZzsKKyAgICAgIHZhciB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7CisgICAgICB2YXIgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjsKKyAgICAgIHZhciB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjsKKyAgICAgIHZhciBnbHlwaHNMZW5ndGggPSBnbHlwaHMubGVuZ3RoOworICAgICAgdmFyIHZlcnRpY2FsID0gZm9udC52ZXJ0aWNhbDsKKyAgICAgIHZhciBzcGFjaW5nRGlyID0gdmVydGljYWwgPyAxIDogLTE7CisgICAgICB2YXIgZGVmYXVsdFZNZXRyaWNzID0gZm9udC5kZWZhdWx0Vk1ldHJpY3M7CisgICAgICB2YXIgd2lkdGhBZHZhbmNlU2NhbGUgPSBmb250U2l6ZSAqIGN1cnJlbnQuZm9udE1hdHJpeFswXTsKKyAgICAgIHZhciBzaW1wbGVGaWxsVGV4dCA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIWZvbnQuZGlzYWJsZUZvbnRGYWNlICYmICFjdXJyZW50LnBhdHRlcm5GaWxsOworICAgICAgY3R4LnNhdmUoKTsKKyAgICAgIHZhciBwYXR0ZXJuVHJhbnNmb3JtOworCisgICAgICBpZiAoY3VycmVudC5wYXR0ZXJuRmlsbCkgeworICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICB2YXIgcGF0dGVybiA9IGN1cnJlbnQuZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzKTsKKyAgICAgICAgcGF0dGVyblRyYW5zZm9ybSA9IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworICAgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybjsKKyAgICAgIH0KKworICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIGN1cnJlbnQudGV4dE1hdHJpeCk7CisgICAgICBjdHgudHJhbnNsYXRlKGN1cnJlbnQueCwgY3VycmVudC55ICsgY3VycmVudC50ZXh0UmlzZSk7CisKKyAgICAgIGlmIChmb250RGlyZWN0aW9uID4gMCkgeworICAgICAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgLTEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIDEpOworICAgICAgfQorCisgICAgICB2YXIgbGluZVdpZHRoID0gY3VycmVudC5saW5lV2lkdGg7CisgICAgICB2YXIgc2NhbGUgPSBjdXJyZW50LnRleHRNYXRyaXhTY2FsZTsKKworICAgICAgaWYgKHNjYWxlID09PSAwIHx8IGxpbmVXaWR0aCA9PT0gMCkgeworICAgICAgICB2YXIgZmlsbFN0cm9rZU1vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSzsKKworICAgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHsKKyAgICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDsKKyAgICAgICAgICBsaW5lV2lkdGggPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSAqIE1JTl9XSURUSF9GQUNUT1I7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxpbmVXaWR0aCAvPSBzY2FsZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZvbnRTaXplU2NhbGUgIT09IDEuMCkgeworICAgICAgICBjdHguc2NhbGUoZm9udFNpemVTY2FsZSwgZm9udFNpemVTY2FsZSk7CisgICAgICAgIGxpbmVXaWR0aCAvPSBmb250U2l6ZVNjYWxlOworICAgICAgfQorCisgICAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoOworICAgICAgdmFyIHggPSAwLAorICAgICAgICAgIGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkgeworICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07CisKKyAgICAgICAgaWYgKCgwLCBfdXRpbC5pc051bSkoZ2x5cGgpKSB7CisgICAgICAgICAgeCArPSBzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSAvIDEwMDA7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmVzdG9yZU5lZWRlZCA9IGZhbHNlOworICAgICAgICB2YXIgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nOworICAgICAgICB2YXIgY2hhcmFjdGVyID0gZ2x5cGguZm9udENoYXI7CisgICAgICAgIHZhciBhY2NlbnQgPSBnbHlwaC5hY2NlbnQ7CisgICAgICAgIHZhciBzY2FsZWRYLCBzY2FsZWRZLCBzY2FsZWRBY2NlbnRYLCBzY2FsZWRBY2NlbnRZOworICAgICAgICB2YXIgd2lkdGggPSBnbHlwaC53aWR0aDsKKworICAgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgICB2YXIgdm1ldHJpYywgdngsIHZ5OworICAgICAgICAgIHZtZXRyaWMgPSBnbHlwaC52bWV0cmljIHx8IGRlZmF1bHRWTWV0cmljczsKKyAgICAgICAgICB2eCA9IGdseXBoLnZtZXRyaWMgPyB2bWV0cmljWzFdIDogd2lkdGggKiAwLjU7CisgICAgICAgICAgdnggPSAtdnggKiB3aWR0aEFkdmFuY2VTY2FsZTsKKyAgICAgICAgICB2eSA9IHZtZXRyaWNbMl0gKiB3aWR0aEFkdmFuY2VTY2FsZTsKKyAgICAgICAgICB3aWR0aCA9IHZtZXRyaWMgPyAtdm1ldHJpY1swXSA6IHdpZHRoOworICAgICAgICAgIHNjYWxlZFggPSB2eCAvIGZvbnRTaXplU2NhbGU7CisgICAgICAgICAgc2NhbGVkWSA9ICh4ICsgdnkpIC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzY2FsZWRYID0geCAvIGZvbnRTaXplU2NhbGU7CisgICAgICAgICAgc2NhbGVkWSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm9udC5yZW1lYXN1cmUgJiYgd2lkdGggPiAwKSB7CisgICAgICAgICAgdmFyIG1lYXN1cmVkV2lkdGggPSBjdHgubWVhc3VyZVRleHQoY2hhcmFjdGVyKS53aWR0aCAqIDEwMDAgLyBmb250U2l6ZSAqIGZvbnRTaXplU2NhbGU7CisKKyAgICAgICAgICBpZiAod2lkdGggPCBtZWFzdXJlZFdpZHRoICYmIHRoaXMuaXNGb250U3VicGl4ZWxBQUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHZhciBjaGFyYWN0ZXJTY2FsZVggPSB3aWR0aCAvIG1lYXN1cmVkV2lkdGg7CisgICAgICAgICAgICByZXN0b3JlTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGN0eC5zYXZlKCk7CisgICAgICAgICAgICBjdHguc2NhbGUoY2hhcmFjdGVyU2NhbGVYLCAxKTsKKyAgICAgICAgICAgIHNjYWxlZFggLz0gY2hhcmFjdGVyU2NhbGVYOworICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggIT09IG1lYXN1cmVkV2lkdGgpIHsKKyAgICAgICAgICAgIHNjYWxlZFggKz0gKHdpZHRoIC0gbWVhc3VyZWRXaWR0aCkgLyAyMDAwICogZm9udFNpemUgLyBmb250U2l6ZVNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIChnbHlwaC5pc0luRm9udCB8fCBmb250Lm1pc3NpbmdGaWxlKSkgeworICAgICAgICAgIGlmIChzaW1wbGVGaWxsVGV4dCAmJiAhYWNjZW50KSB7CisgICAgICAgICAgICBjdHguZmlsbFRleHQoY2hhcmFjdGVyLCBzY2FsZWRYLCBzY2FsZWRZKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5wYWludENoYXIoY2hhcmFjdGVyLCBzY2FsZWRYLCBzY2FsZWRZLCBwYXR0ZXJuVHJhbnNmb3JtKTsKKworICAgICAgICAgICAgaWYgKGFjY2VudCkgeworICAgICAgICAgICAgICBzY2FsZWRBY2NlbnRYID0gc2NhbGVkWCArIGZvbnRTaXplICogYWNjZW50Lm9mZnNldC54IC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICAgICAgc2NhbGVkQWNjZW50WSA9IHNjYWxlZFkgLSBmb250U2l6ZSAqIGFjY2VudC5vZmZzZXQueSAvIGZvbnRTaXplU2NhbGU7CisgICAgICAgICAgICAgIHRoaXMucGFpbnRDaGFyKGFjY2VudC5mb250Q2hhciwgc2NhbGVkQWNjZW50WCwgc2NhbGVkQWNjZW50WSwgcGF0dGVyblRyYW5zZm9ybSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIGNoYXJXaWR0aDsKKworICAgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlIC0gc3BhY2luZyAqIGZvbnREaXJlY3Rpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSArIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgeCArPSBjaGFyV2lkdGg7CisKKyAgICAgICAgaWYgKHJlc3RvcmVOZWVkZWQpIHsKKyAgICAgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICBjdXJyZW50LnkgLT0geDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnQueCArPSB4ICogdGV4dEhTY2FsZTsKKyAgICAgIH0KKworICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICB9LAorICAgIHNob3dUeXBlM1RleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3Nob3dUeXBlM1RleHQoZ2x5cGhzKSB7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgIHZhciBmb250ID0gY3VycmVudC5mb250OworICAgICAgdmFyIGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTsKKyAgICAgIHZhciBmb250RGlyZWN0aW9uID0gY3VycmVudC5mb250RGlyZWN0aW9uOworICAgICAgdmFyIHNwYWNpbmdEaXIgPSBmb250LnZlcnRpY2FsID8gMSA6IC0xOworICAgICAgdmFyIGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZzsKKyAgICAgIHZhciB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7CisgICAgICB2YXIgdGV4dEhTY2FsZSA9IGN1cnJlbnQudGV4dEhTY2FsZSAqIGZvbnREaXJlY3Rpb247CisgICAgICB2YXIgZm9udE1hdHJpeCA9IGN1cnJlbnQuZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWDsKKyAgICAgIHZhciBnbHlwaHNMZW5ndGggPSBnbHlwaHMubGVuZ3RoOworICAgICAgdmFyIGlzVGV4dEludmlzaWJsZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLklOVklTSUJMRTsKKyAgICAgIHZhciBpLCBnbHlwaCwgd2lkdGgsIHNwYWNpbmdMZW5ndGg7CisKKyAgICAgIGlmIChpc1RleHRJbnZpc2libGUgfHwgZm9udFNpemUgPT09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDsKKyAgICAgIGN0eC5zYXZlKCk7CisgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgY3VycmVudC50ZXh0TWF0cml4KTsKKyAgICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkpOworICAgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIGZvbnREaXJlY3Rpb24pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgZ2x5cGggPSBnbHlwaHNbaV07CisKKyAgICAgICAgaWYgKCgwLCBfdXRpbC5pc051bSkoZ2x5cGgpKSB7CisgICAgICAgICAgc3BhY2luZ0xlbmd0aCA9IHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplIC8gMTAwMDsKKyAgICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUoc3BhY2luZ0xlbmd0aCwgMCk7CisgICAgICAgICAgY3VycmVudC54ICs9IHNwYWNpbmdMZW5ndGggKiB0ZXh0SFNjYWxlOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZzsKKyAgICAgICAgdmFyIG9wZXJhdG9yTGlzdCA9IGZvbnQuY2hhclByb2NPcGVyYXRvckxpc3RbZ2x5cGgub3BlcmF0b3JMaXN0SWRdOworCisgICAgICAgIGlmICghb3BlcmF0b3JMaXN0KSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUeXBlMyBjaGFyYWN0ZXIgXCIiLmNvbmNhdChnbHlwaC5vcGVyYXRvckxpc3RJZCwgIlwiIGlzIG5vdCBhdmFpbGFibGUuIikpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IGdseXBoOworICAgICAgICAgIHRoaXMuc2F2ZSgpOworICAgICAgICAgIGN0eC5zY2FsZShmb250U2l6ZSwgZm9udFNpemUpOworICAgICAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCBmb250TWF0cml4KTsKKyAgICAgICAgICB0aGlzLmV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0KTsKKyAgICAgICAgICB0aGlzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0cmFuc2Zvcm1lZCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW2dseXBoLndpZHRoLCAwXSwgZm9udE1hdHJpeCk7CisKKyAgICAgICAgd2lkdGggPSB0cmFuc2Zvcm1lZFswXSAqIGZvbnRTaXplICsgc3BhY2luZzsKKyAgICAgICAgY3R4LnRyYW5zbGF0ZSh3aWR0aCwgMCk7CisgICAgICAgIGN1cnJlbnQueCArPSB3aWR0aCAqIHRleHRIU2NhbGU7CisgICAgICB9CisKKyAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7CisgICAgfSwKKyAgICBzZXRDaGFyV2lkdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJXaWR0aCh4V2lkdGgsIHlXaWR0aCkge30sCisgICAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRDaGFyV2lkdGhBbmRCb3VuZHMoeFdpZHRoLCB5V2lkdGgsIGxseCwgbGx5LCB1cngsIHVyeSkgeworICAgICAgdGhpcy5jdHgucmVjdChsbHgsIGxseSwgdXJ4IC0gbGx4LCB1cnkgLSBsbHkpOworICAgICAgdGhpcy5jbGlwKCk7CisgICAgICB0aGlzLmVuZFBhdGgoKTsKKyAgICB9LAorICAgIGdldENvbG9yTl9QYXR0ZXJuOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19nZXRDb2xvck5fUGF0dGVybihJUikgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdmFyIHBhdHRlcm47CisKKyAgICAgIGlmIChJUlswXSA9PT0gIlRpbGluZ1BhdHRlcm4iKSB7CisgICAgICAgIHZhciBjb2xvciA9IElSWzFdOworICAgICAgICB2YXIgYmFzZVRyYW5zZm9ybSA9IHRoaXMuYmFzZVRyYW5zZm9ybSB8fCB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLnNsaWNlKCk7CisgICAgICAgIHZhciBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB7CisgICAgICAgICAgY3JlYXRlQ2FudmFzR3JhcGhpY3M6IGZ1bmN0aW9uIGNyZWF0ZUNhbnZhc0dyYXBoaWNzKGN0eCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYW52YXNHcmFwaGljcyhjdHgsIF90aGlzLmNvbW1vbk9ianMsIF90aGlzLm9ianMsIF90aGlzLmNhbnZhc0ZhY3RvcnksIF90aGlzLndlYkdMQ29udGV4dCk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBwYXR0ZXJuID0gbmV3IF9wYXR0ZXJuX2hlbHBlci5UaWxpbmdQYXR0ZXJuKElSLCBjb2xvciwgdGhpcy5jdHgsIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSwgYmFzZVRyYW5zZm9ybSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXR0ZXJuID0gKDAsIF9wYXR0ZXJuX2hlbHBlci5nZXRTaGFkaW5nUGF0dGVybkZyb21JUikoSVIpOworICAgICAgfQorCisgICAgICByZXR1cm4gcGF0dGVybjsKKyAgICB9LAorICAgIHNldFN0cm9rZUNvbG9yTjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0U3Ryb2tlQ29sb3JOKCkgeworICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gdGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpOworICAgIH0sCisgICAgc2V0RmlsbENvbG9yTjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0RmlsbENvbG9yTigpIHsKKyAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7CisgICAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSB0cnVlOworICAgIH0sCisgICAgc2V0U3Ryb2tlUkdCQ29sb3I6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFN0cm9rZVJHQkNvbG9yKHIsIGcsIGIpIHsKKyAgICAgIHZhciBjb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyLCBnLCBiKTsKKworICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjsKKyAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IGNvbG9yOworICAgIH0sCisgICAgc2V0RmlsbFJHQkNvbG9yOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRGaWxsUkdCQ29sb3IociwgZywgYikgeworICAgICAgdmFyIGNvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKHIsIGcsIGIpOworCisgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvcjsKKyAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBjb2xvcjsKKyAgICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IGZhbHNlOworICAgIH0sCisgICAgc2hhZGluZ0ZpbGw6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NoYWRpbmdGaWxsKHBhdHRlcm5JUikgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdGhpcy5zYXZlKCk7CisgICAgICB2YXIgcGF0dGVybiA9ICgwLCBfcGF0dGVybl9oZWxwZXIuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIpKHBhdHRlcm5JUik7CisgICAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybi5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgdHJ1ZSk7CisgICAgICB2YXIgaW52ID0gY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlOworCisgICAgICBpZiAoaW52KSB7CisgICAgICAgIHZhciBjYW52YXMgPSBjdHguY2FudmFzOworICAgICAgICB2YXIgd2lkdGggPSBjYW52YXMud2lkdGg7CisgICAgICAgIHZhciBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0OworCisgICAgICAgIHZhciBibCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBpbnYpOworCisgICAgICAgIHZhciBiciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIGhlaWdodF0sIGludik7CisKKyAgICAgICAgdmFyIHVsID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIDBdLCBpbnYpOworCisgICAgICAgIHZhciB1ciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCBoZWlnaHRdLCBpbnYpOworCisgICAgICAgIHZhciB4MCA9IE1hdGgubWluKGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTsKKyAgICAgICAgdmFyIHkwID0gTWF0aC5taW4oYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pOworICAgICAgICB2YXIgeDEgPSBNYXRoLm1heChibFswXSwgYnJbMF0sIHVsWzBdLCB1clswXSk7CisgICAgICAgIHZhciB5MSA9IE1hdGgubWF4KGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTsKKyAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoeDAsIHkwLCB4MSAtIHgwLCB5MSAtIHkwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KC0xZTEwLCAtMWUxMCwgMmUxMCwgMmUxMCk7CisgICAgICB9CisKKyAgICAgIHRoaXMucmVzdG9yZSgpOworICAgIH0sCisgICAgYmVnaW5JbmxpbmVJbWFnZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5JbmxpbmVJbWFnZSgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlIik7CisgICAgfSwKKyAgICBiZWdpbkltYWdlRGF0YTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5JbWFnZURhdGEoKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbWFnZURhdGEiKTsKKyAgICB9LAorICAgIHBhaW50Rm9ybVhPYmplY3RCZWdpbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5zYXZlKCk7CisgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wdXNoKHRoaXMuYmFzZVRyYW5zZm9ybSk7CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdHJpeCkgJiYgbWF0cml4Lmxlbmd0aCA9PT0gNikgeworICAgICAgICB0aGlzLnRyYW5zZm9ybS5hcHBseSh0aGlzLCBtYXRyaXgpOworICAgICAgfQorCisgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworCisgICAgICBpZiAoYmJveCkgeworICAgICAgICB2YXIgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTsKKyAgICAgICAgdmFyIGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdOworICAgICAgICB0aGlzLmN0eC5yZWN0KGJib3hbMF0sIGJib3hbMV0sIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB0aGlzLmNsaXAoKTsKKyAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICB9CisgICAgfSwKKyAgICBwYWludEZvcm1YT2JqZWN0RW5kOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEZvcm1YT2JqZWN0RW5kKCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wb3AoKTsKKyAgICB9LAorICAgIGJlZ2luR3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luR3JvdXAoZ3JvdXApIHsKKyAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuc2F2ZSgpOworICAgICAgdmFyIGN1cnJlbnRDdHggPSB0aGlzLmN0eDsKKworICAgICAgaWYgKCFncm91cC5pc29sYXRlZCkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIlRPRE86IFN1cHBvcnQgbm9uLWlzb2xhdGVkIGdyb3Vwcy4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdyb3VwLmtub2Nrb3V0KSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiS25vY2tvdXQgZ3JvdXBzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICB9CisKKyAgICAgIHZhciBjdXJyZW50VHJhbnNmb3JtID0gY3VycmVudEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworCisgICAgICBpZiAoZ3JvdXAubWF0cml4KSB7CisgICAgICAgIGN1cnJlbnRDdHgudHJhbnNmb3JtLmFwcGx5KGN1cnJlbnRDdHgsIGdyb3VwLm1hdHJpeCk7CisgICAgICB9CisKKyAgICAgIGlmICghZ3JvdXAuYmJveCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJvdW5kaW5nIGJveCBpcyByZXF1aXJlZC4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGJvdW5kcyA9IF91dGlsLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZ3JvdXAuYmJveCwgY3VycmVudEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtKTsKKworICAgICAgdmFyIGNhbnZhc0JvdW5kcyA9IFswLCAwLCBjdXJyZW50Q3R4LmNhbnZhcy53aWR0aCwgY3VycmVudEN0eC5jYW52YXMuaGVpZ2h0XTsKKyAgICAgIGJvdW5kcyA9IF91dGlsLlV0aWwuaW50ZXJzZWN0KGJvdW5kcywgY2FudmFzQm91bmRzKSB8fCBbMCwgMCwgMCwgMF07CisgICAgICB2YXIgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTsKKyAgICAgIHZhciBvZmZzZXRZID0gTWF0aC5mbG9vcihib3VuZHNbMV0pOworICAgICAgdmFyIGRyYXduV2lkdGggPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFgsIDEpOworICAgICAgdmFyIGRyYXduSGVpZ2h0ID0gTWF0aC5tYXgoTWF0aC5jZWlsKGJvdW5kc1szXSkgLSBvZmZzZXRZLCAxKTsKKyAgICAgIHZhciBzY2FsZVggPSAxLAorICAgICAgICAgIHNjYWxlWSA9IDE7CisKKyAgICAgIGlmIChkcmF3bldpZHRoID4gTUFYX0dST1VQX1NJWkUpIHsKKyAgICAgICAgc2NhbGVYID0gZHJhd25XaWR0aCAvIE1BWF9HUk9VUF9TSVpFOworICAgICAgICBkcmF3bldpZHRoID0gTUFYX0dST1VQX1NJWkU7CisgICAgICB9CisKKyAgICAgIGlmIChkcmF3bkhlaWdodCA+IE1BWF9HUk9VUF9TSVpFKSB7CisgICAgICAgIHNjYWxlWSA9IGRyYXduSGVpZ2h0IC8gTUFYX0dST1VQX1NJWkU7CisgICAgICAgIGRyYXduSGVpZ2h0ID0gTUFYX0dST1VQX1NJWkU7CisgICAgICB9CisKKyAgICAgIHZhciBjYWNoZUlkID0gImdyb3VwQXQiICsgdGhpcy5ncm91cExldmVsOworCisgICAgICBpZiAoZ3JvdXAuc21hc2spIHsKKyAgICAgICAgY2FjaGVJZCArPSAiX3NtYXNrXyIgKyB0aGlzLnNtYXNrQ291bnRlcisrICUgMjsKKyAgICAgIH0KKworICAgICAgdmFyIHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhjYWNoZUlkLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCwgdHJ1ZSk7CisgICAgICB2YXIgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7CisgICAgICBncm91cEN0eC5zY2FsZSgxIC8gc2NhbGVYLCAxIC8gc2NhbGVZKTsKKyAgICAgIGdyb3VwQ3R4LnRyYW5zbGF0ZSgtb2Zmc2V0WCwgLW9mZnNldFkpOworICAgICAgZ3JvdXBDdHgudHJhbnNmb3JtLmFwcGx5KGdyb3VwQ3R4LCBjdXJyZW50VHJhbnNmb3JtKTsKKworICAgICAgaWYgKGdyb3VwLnNtYXNrKSB7CisgICAgICAgIHRoaXMuc21hc2tTdGFjay5wdXNoKHsKKyAgICAgICAgICBjYW52YXM6IHNjcmF0Y2hDYW52YXMuY2FudmFzLAorICAgICAgICAgIGNvbnRleHQ6IGdyb3VwQ3R4LAorICAgICAgICAgIG9mZnNldFg6IG9mZnNldFgsCisgICAgICAgICAgb2Zmc2V0WTogb2Zmc2V0WSwKKyAgICAgICAgICBzY2FsZVg6IHNjYWxlWCwKKyAgICAgICAgICBzY2FsZVk6IHNjYWxlWSwKKyAgICAgICAgICBzdWJ0eXBlOiBncm91cC5zbWFzay5zdWJ0eXBlLAorICAgICAgICAgIGJhY2tkcm9wOiBncm91cC5zbWFzay5iYWNrZHJvcCwKKyAgICAgICAgICB0cmFuc2Zlck1hcDogZ3JvdXAuc21hc2sudHJhbnNmZXJNYXAgfHwgbnVsbCwKKyAgICAgICAgICBzdGFydFRyYW5zZm9ybUludmVyc2U6IG51bGwKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50Q3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgY3VycmVudEN0eC50cmFuc2xhdGUob2Zmc2V0WCwgb2Zmc2V0WSk7CisgICAgICAgIGN1cnJlbnRDdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpOworICAgICAgfQorCisgICAgICBjb3B5Q3R4U3RhdGUoY3VycmVudEN0eCwgZ3JvdXBDdHgpOworICAgICAgdGhpcy5jdHggPSBncm91cEN0eDsKKyAgICAgIHRoaXMuc2V0R1N0YXRlKFtbIkJNIiwgInNvdXJjZS1vdmVyIl0sIFsiY2EiLCAxXSwgWyJDQSIsIDFdXSk7CisgICAgICB0aGlzLmdyb3VwU3RhY2sucHVzaChjdXJyZW50Q3R4KTsKKyAgICAgIHRoaXMuZ3JvdXBMZXZlbCsrOworICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDsKKyAgICB9LAorICAgIGVuZEdyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRHcm91cChncm91cCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5ncm91cExldmVsLS07CisgICAgICB2YXIgZ3JvdXBDdHggPSB0aGlzLmN0eDsKKyAgICAgIHRoaXMuY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpOworCisgICAgICBpZiAodGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmN0eC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKGdyb3VwLnNtYXNrKSB7CisgICAgICAgIHRoaXMudGVtcFNNYXNrID0gdGhpcy5zbWFza1N0YWNrLnBvcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGdyb3VwQ3R4LmNhbnZhcywgMCwgMCk7CisgICAgICB9CisKKyAgICAgIHRoaXMucmVzdG9yZSgpOworICAgIH0sCisgICAgYmVnaW5Bbm5vdGF0aW9uczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5Bbm5vdGF0aW9ucygpIHsKKyAgICAgIHRoaXMuc2F2ZSgpOworCisgICAgICBpZiAodGhpcy5iYXNlVHJhbnNmb3JtKSB7CisgICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgdGhpcy5iYXNlVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICB9LAorICAgIGVuZEFubm90YXRpb25zOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRBbm5vdGF0aW9ucygpIHsKKyAgICAgIHRoaXMucmVzdG9yZSgpOworICAgIH0sCisgICAgYmVnaW5Bbm5vdGF0aW9uOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkFubm90YXRpb24ocmVjdCwgdHJhbnNmb3JtLCBtYXRyaXgpIHsKKyAgICAgIHRoaXMuc2F2ZSgpOworICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpOworICAgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUoKTsKKworICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVjdCkgJiYgcmVjdC5sZW5ndGggPT09IDQpIHsKKyAgICAgICAgdmFyIHdpZHRoID0gcmVjdFsyXSAtIHJlY3RbMF07CisgICAgICAgIHZhciBoZWlnaHQgPSByZWN0WzNdIC0gcmVjdFsxXTsKKyAgICAgICAgdGhpcy5jdHgucmVjdChyZWN0WzBdLCByZWN0WzFdLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgdGhpcy5jbGlwKCk7CisgICAgICAgIHRoaXMuZW5kUGF0aCgpOworICAgICAgfQorCisgICAgICB0aGlzLnRyYW5zZm9ybS5hcHBseSh0aGlzLCB0cmFuc2Zvcm0pOworICAgICAgdGhpcy50cmFuc2Zvcm0uYXBwbHkodGhpcywgbWF0cml4KTsKKyAgICB9LAorICAgIGVuZEFubm90YXRpb246IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEFubm90YXRpb24oKSB7CisgICAgICB0aGlzLnJlc3RvcmUoKTsKKyAgICB9LAorICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZU1hc2tYT2JqZWN0KGltZykgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIHdpZHRoID0gaW1nLndpZHRoLAorICAgICAgICAgIGhlaWdodCA9IGltZy5oZWlnaHQ7CisgICAgICB2YXIgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjsKKyAgICAgIHZhciBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsOworICAgICAgdmFyIGdseXBoID0gdGhpcy5wcm9jZXNzaW5nVHlwZTM7CisKKyAgICAgIGlmIChDT01QSUxFX1RZUEUzX0dMWVBIUyAmJiBnbHlwaCAmJiBnbHlwaC5jb21waWxlZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGlmICh3aWR0aCA8PSBNQVhfU0laRV9UT19DT01QSUxFICYmIGhlaWdodCA8PSBNQVhfU0laRV9UT19DT01QSUxFKSB7CisgICAgICAgICAgZ2x5cGguY29tcGlsZWQgPSBjb21waWxlVHlwZTNHbHlwaCh7CisgICAgICAgICAgICBkYXRhOiBpbWcuZGF0YSwKKyAgICAgICAgICAgIHdpZHRoOiB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0CisgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2x5cGguY29tcGlsZWQgPSBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChnbHlwaCAmJiBnbHlwaC5jb21waWxlZCkgeworICAgICAgICBnbHlwaC5jb21waWxlZChjdHgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBtYXNrQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoIm1hc2tDYW52YXMiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0OworICAgICAgbWFza0N0eC5zYXZlKCk7CisgICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0N0eCwgaW1nKTsKKyAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNvdXJjZS1pbiI7CisgICAgICBtYXNrQ3R4LmZpbGxTdHlsZSA9IGlzUGF0dGVybkZpbGwgPyBmaWxsQ29sb3IuZ2V0UGF0dGVybihtYXNrQ3R4LCB0aGlzKSA6IGZpbGxDb2xvcjsKKyAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICBtYXNrQ3R4LnJlc3RvcmUoKTsKKyAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QobWFza0NhbnZhcy5jYW52YXMpOworICAgIH0sCisgICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0OiBmdW5jdGlvbiBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQoaW1nRGF0YSwgc2NhbGVYKSB7CisgICAgICB2YXIgc2tld1ggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7CisgICAgICB2YXIgc2tld1kgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7CisgICAgICB2YXIgc2NhbGVZID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgPyBhcmd1bWVudHNbNF0gOiB1bmRlZmluZWQ7CisgICAgICB2YXIgcG9zaXRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgPyBhcmd1bWVudHNbNV0gOiB1bmRlZmluZWQ7CisKKyAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgICB2YXIgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7CisgICAgICB2YXIgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjsKKyAgICAgIHZhciBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsOworICAgICAgdmFyIG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygibWFza0NhbnZhcyIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgdmFyIG1hc2tDdHggPSBtYXNrQ2FudmFzLmNvbnRleHQ7CisgICAgICBtYXNrQ3R4LnNhdmUoKTsKKyAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ3R4LCBpbWdEYXRhKTsKKyAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNvdXJjZS1pbiI7CisgICAgICBtYXNrQ3R4LmZpbGxTdHlsZSA9IGlzUGF0dGVybkZpbGwgPyBmaWxsQ29sb3IuZ2V0UGF0dGVybihtYXNrQ3R4LCB0aGlzKSA6IGZpbGxDb2xvcjsKKyAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICBtYXNrQ3R4LnJlc3RvcmUoKTsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgICAgY3R4LnNhdmUoKTsKKyAgICAgICAgY3R4LnRyYW5zZm9ybShzY2FsZVgsIHNrZXdYLCBza2V3WSwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV0pOworICAgICAgICBjdHguc2NhbGUoMSwgLTEpOworICAgICAgICBjdHguZHJhd0ltYWdlKG1hc2tDYW52YXMuY2FudmFzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSwgMSk7CisgICAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICB9CisgICAgfSwKKyAgICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXAoaW1hZ2VzKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjsKKyAgICAgIHZhciBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbWFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgaW1hZ2UgPSBpbWFnZXNbaV07CisgICAgICAgIHZhciB3aWR0aCA9IGltYWdlLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0OworICAgICAgICB2YXIgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtYXNrQ2FudmFzIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0OworICAgICAgICBtYXNrQ3R4LnNhdmUoKTsKKyAgICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDdHgsIGltYWdlKTsKKyAgICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAic291cmNlLWluIjsKKyAgICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4obWFza0N0eCwgdGhpcykgOiBmaWxsQ29sb3I7CisgICAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1hc2tDdHgucmVzdG9yZSgpOworICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgaW1hZ2UudHJhbnNmb3JtKTsKKyAgICAgICAgY3R4LnNjYWxlKDEsIC0xKTsKKyAgICAgICAgY3R4LmRyYXdJbWFnZShtYXNrQ2FudmFzLmNhbnZhcywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEsIDEpOworICAgICAgICBjdHgucmVzdG9yZSgpOworICAgICAgfQorICAgIH0sCisgICAgcGFpbnRJbWFnZVhPYmplY3Q6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VYT2JqZWN0KG9iaklkKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgaW1nRGF0YSA9IG9iaklkLnN0YXJ0c1dpdGgoImdfIikgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KG9iaklkKSA6IHRoaXMub2Jqcy5nZXQob2JqSWQpOworCisgICAgICBpZiAoIWltZ0RhdGEpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKTsKKyAgICB9LAorICAgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlWE9iamVjdFJlcGVhdChvYmpJZCwgc2NhbGVYLCBzY2FsZVksIHBvc2l0aW9ucykgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGltZ0RhdGEgPSBvYmpJZC5zdGFydHNXaXRoKCJnXyIpID8gdGhpcy5jb21tb25PYmpzLmdldChvYmpJZCkgOiB0aGlzLm9ianMuZ2V0KG9iaklkKTsKKworICAgICAgaWYgKCFpbWdEYXRhKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldCIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgICB2YXIgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7CisgICAgICB2YXIgbWFwID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CisgICAgICAgIG1hcC5wdXNoKHsKKyAgICAgICAgICB0cmFuc2Zvcm06IFtzY2FsZVgsIDAsIDAsIHNjYWxlWSwgcG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdXSwKKyAgICAgICAgICB4OiAwLAorICAgICAgICAgIHk6IDAsCisgICAgICAgICAgdzogd2lkdGgsCisgICAgICAgICAgaDogaGVpZ2h0CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAoaW1nRGF0YSwgbWFwKTsKKyAgICB9LAorICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgd2lkdGggPSBpbWdEYXRhLndpZHRoOworICAgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0OworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdGhpcy5zYXZlKCk7CisgICAgICBjdHguc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7CisgICAgICB2YXIgY3VycmVudFRyYW5zZm9ybSA9IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTsKKyAgICAgIHZhciBhID0gY3VycmVudFRyYW5zZm9ybVswXSwKKyAgICAgICAgICBiID0gY3VycmVudFRyYW5zZm9ybVsxXTsKKyAgICAgIHZhciB3aWR0aFNjYWxlID0gTWF0aC5tYXgoTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpLCAxKTsKKyAgICAgIHZhciBjID0gY3VycmVudFRyYW5zZm9ybVsyXSwKKyAgICAgICAgICBkID0gY3VycmVudFRyYW5zZm9ybVszXTsKKyAgICAgIHZhciBoZWlnaHRTY2FsZSA9IE1hdGgubWF4KE1hdGguc3FydChjICogYyArIGQgKiBkKSwgMSk7CisgICAgICB2YXIgaW1nVG9QYWludCwgdG1wQ2FudmFzOworCisgICAgICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAiZnVuY3Rpb24iICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAhaW1nRGF0YS5kYXRhKSB7CisgICAgICAgIGltZ1RvUGFpbnQgPSBpbWdEYXRhOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoImlubGluZUltYWdlIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHZhciB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDsKKyAgICAgICAgcHV0QmluYXJ5SW1hZ2VEYXRhKHRtcEN0eCwgaW1nRGF0YSwgdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyk7CisgICAgICAgIGltZ1RvUGFpbnQgPSB0bXBDYW52YXMuY2FudmFzOworICAgICAgfQorCisgICAgICB2YXIgcGFpbnRXaWR0aCA9IHdpZHRoLAorICAgICAgICAgIHBhaW50SGVpZ2h0ID0gaGVpZ2h0OworICAgICAgdmFyIHRtcENhbnZhc0lkID0gInByZXNjYWxlMSI7CisKKyAgICAgIHdoaWxlICh3aWR0aFNjYWxlID4gMiAmJiBwYWludFdpZHRoID4gMSB8fCBoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKSB7CisgICAgICAgIHZhciBuZXdXaWR0aCA9IHBhaW50V2lkdGgsCisgICAgICAgICAgICBuZXdIZWlnaHQgPSBwYWludEhlaWdodDsKKworICAgICAgICBpZiAod2lkdGhTY2FsZSA+IDIgJiYgcGFpbnRXaWR0aCA+IDEpIHsKKyAgICAgICAgICBuZXdXaWR0aCA9IE1hdGguY2VpbChwYWludFdpZHRoIC8gMik7CisgICAgICAgICAgd2lkdGhTY2FsZSAvPSBwYWludFdpZHRoIC8gbmV3V2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGVpZ2h0U2NhbGUgPiAyICYmIHBhaW50SGVpZ2h0ID4gMSkgeworICAgICAgICAgIG5ld0hlaWdodCA9IE1hdGguY2VpbChwYWludEhlaWdodCAvIDIpOworICAgICAgICAgIGhlaWdodFNjYWxlIC89IHBhaW50SGVpZ2h0IC8gbmV3SGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXModG1wQ2FudmFzSWQsIG5ld1dpZHRoLCBuZXdIZWlnaHQpOworICAgICAgICB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDsKKyAgICAgICAgdG1wQ3R4LmNsZWFyUmVjdCgwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKKyAgICAgICAgdG1wQ3R4LmRyYXdJbWFnZShpbWdUb1BhaW50LCAwLCAwLCBwYWludFdpZHRoLCBwYWludEhlaWdodCwgMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7CisgICAgICAgIGltZ1RvUGFpbnQgPSB0bXBDYW52YXMuY2FudmFzOworICAgICAgICBwYWludFdpZHRoID0gbmV3V2lkdGg7CisgICAgICAgIHBhaW50SGVpZ2h0ID0gbmV3SGVpZ2h0OworICAgICAgICB0bXBDYW52YXNJZCA9IHRtcENhbnZhc0lkID09PSAicHJlc2NhbGUxIiA/ICJwcmVzY2FsZTIiIDogInByZXNjYWxlMSI7CisgICAgICB9CisKKyAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nVG9QYWludCwgMCwgMCwgcGFpbnRXaWR0aCwgcGFpbnRIZWlnaHQsIDAsIC1oZWlnaHQsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICBpZiAodGhpcy5pbWFnZUxheWVyKSB7CisgICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuZ2V0Q2FudmFzUG9zaXRpb24oMCwgLWhlaWdodCk7CisgICAgICAgIHRoaXMuaW1hZ2VMYXllci5hcHBlbmRJbWFnZSh7CisgICAgICAgICAgaW1nRGF0YTogaW1nRGF0YSwKKyAgICAgICAgICBsZWZ0OiBwb3NpdGlvblswXSwKKyAgICAgICAgICB0b3A6IHBvc2l0aW9uWzFdLAorICAgICAgICAgIHdpZHRoOiB3aWR0aCAvIGN1cnJlbnRUcmFuc2Zvcm1bMF0sCisgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLyBjdXJyZW50VHJhbnNmb3JtWzNdCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLnJlc3RvcmUoKTsKKyAgICB9LAorICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAoaW1nRGF0YSwgbWFwKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgdyA9IGltZ0RhdGEud2lkdGg7CisgICAgICB2YXIgaCA9IGltZ0RhdGEuaGVpZ2h0OworICAgICAgdmFyIHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJpbmxpbmVJbWFnZSIsIHcsIGgpOworICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0OworICAgICAgcHV0QmluYXJ5SW1hZ2VEYXRhKHRtcEN0eCwgaW1nRGF0YSwgdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG1hcC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHZhciBlbnRyeSA9IG1hcFtpXTsKKyAgICAgICAgY3R4LnNhdmUoKTsKKyAgICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIGVudHJ5LnRyYW5zZm9ybSk7CisgICAgICAgIGN0eC5zY2FsZSgxLCAtMSk7CisgICAgICAgIGN0eC5kcmF3SW1hZ2UodG1wQ2FudmFzLmNhbnZhcywgZW50cnkueCwgZW50cnkueSwgZW50cnkudywgZW50cnkuaCwgMCwgLTEsIDEsIDEpOworCisgICAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHsKKyAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldENhbnZhc1Bvc2l0aW9uKGVudHJ5LngsIGVudHJ5LnkpOworICAgICAgICAgIHRoaXMuaW1hZ2VMYXllci5hcHBlbmRJbWFnZSh7CisgICAgICAgICAgICBpbWdEYXRhOiBpbWdEYXRhLAorICAgICAgICAgICAgbGVmdDogcG9zaXRpb25bMF0sCisgICAgICAgICAgICB0b3A6IHBvc2l0aW9uWzFdLAorICAgICAgICAgICAgd2lkdGg6IHcsCisgICAgICAgICAgICBoZWlnaHQ6IGgKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICB9CisgICAgfSwKKyAgICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50U29saWRDb2xvckltYWdlTWFzaygpIHsKKyAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpOworICAgIH0sCisgICAgbWFya1BvaW50OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19tYXJrUG9pbnQodGFnKSB7fSwKKyAgICBtYXJrUG9pbnRQcm9wczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfbWFya1BvaW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7fSwKKyAgICBiZWdpbk1hcmtlZENvbnRlbnQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luTWFya2VkQ29udGVudCh0YWcpIHsKKyAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goeworICAgICAgICB2aXNpYmxlOiB0cnVlCisgICAgICB9KTsKKyAgICB9LAorICAgIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyh0YWcsIHByb3BlcnRpZXMpIHsKKyAgICAgIGlmICh0YWcgPT09ICJPQyIpIHsKKyAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7CisgICAgICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcuaXNWaXNpYmxlKHByb3BlcnRpZXMpCisgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7CisgICAgICAgICAgdmlzaWJsZTogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpOworICAgIH0sCisgICAgZW5kTWFya2VkQ29udGVudDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kTWFya2VkQ29udGVudCgpIHsKKyAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnBvcCgpOworICAgICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpOworICAgIH0sCisgICAgYmVnaW5Db21wYXQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luQ29tcGF0KCkge30sCisgICAgZW5kQ29tcGF0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRDb21wYXQoKSB7fSwKKyAgICBjb25zdW1lUGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY29uc3VtZVBhdGgoKSB7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisKKyAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7CisgICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwID09PSBFT19DTElQKSB7CisgICAgICAgICAgY3R4LmNsaXAoImV2ZW5vZGQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdHguY2xpcCgpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGN0eC5iZWdpblBhdGgoKTsKKyAgICB9LAorICAgIGdldFNpbmdsZVBpeGVsV2lkdGg6IGZ1bmN0aW9uIGdldFNpbmdsZVBpeGVsV2lkdGgoc2NhbGUpIHsKKyAgICAgIGlmICh0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID09PSBudWxsKSB7CisgICAgICAgIHZhciBpbnZlcnNlID0gdGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7CisgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBNYXRoLnNxcnQoTWF0aC5tYXgoaW52ZXJzZVswXSAqIGludmVyc2VbMF0gKyBpbnZlcnNlWzFdICogaW52ZXJzZVsxXSwgaW52ZXJzZVsyXSAqIGludmVyc2VbMl0gKyBpbnZlcnNlWzNdICogaW52ZXJzZVszXSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aDsKKyAgICB9LAorICAgIGdldENhbnZhc1Bvc2l0aW9uOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19nZXRDYW52YXNQb3NpdGlvbih4LCB5KSB7CisgICAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybTsKKyAgICAgIHJldHVybiBbdHJhbnNmb3JtWzBdICogeCArIHRyYW5zZm9ybVsyXSAqIHkgKyB0cmFuc2Zvcm1bNF0sIHRyYW5zZm9ybVsxXSAqIHggKyB0cmFuc2Zvcm1bM10gKiB5ICsgdHJhbnNmb3JtWzVdXTsKKyAgICB9LAorICAgIGlzQ29udGVudFZpc2libGU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2lzQ29udGVudFZpc2libGUoKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy5tYXJrZWRDb250ZW50U3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaWYgKCF0aGlzLm1hcmtlZENvbnRlbnRTdGFja1tpXS52aXNpYmxlKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfTsKKworICBmb3IgKHZhciBvcCBpbiBfdXRpbC5PUFMpIHsKKyAgICBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbX3V0aWwuT1BTW29wXV0gPSBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdOworICB9CisKKyAgcmV0dXJuIENhbnZhc0dyYXBoaWNzOworfSgpOworCitleHBvcnRzLkNhbnZhc0dyYXBoaWNzID0gQ2FudmFzR3JhcGhpY3M7CisKKy8qKiovIH0pLAorLyogMjA4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIgPSBnZXRTaGFkaW5nUGF0dGVybkZyb21JUjsKK2V4cG9ydHMuVGlsaW5nUGF0dGVybiA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIFNoYWRpbmdJUnMgPSB7fTsKKworZnVuY3Rpb24gYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpIHsKKyAgaWYgKCFiYm94IHx8IHR5cGVvZiBQYXRoMkQgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFyIHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07CisgIHZhciBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTsKKyAgdmFyIHJlZ2lvbiA9IG5ldyBQYXRoMkQoKTsKKyAgcmVnaW9uLnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7CisgIGN0eC5jbGlwKHJlZ2lvbik7Cit9CisKK1NoYWRpbmdJUnMuUmFkaWFsQXhpYWwgPSB7CisgIGZyb21JUjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZnJvbUlSKHJhdykgeworICAgIHZhciB0eXBlID0gcmF3WzFdOworICAgIHZhciBiYm94ID0gcmF3WzJdOworICAgIHZhciBjb2xvclN0b3BzID0gcmF3WzNdOworICAgIHZhciBwMCA9IHJhd1s0XTsKKyAgICB2YXIgcDEgPSByYXdbNV07CisgICAgdmFyIHIwID0gcmF3WzZdOworICAgIHZhciByMSA9IHJhd1s3XTsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZ2V0UGF0dGVybihjdHgpIHsKKyAgICAgICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpOworICAgICAgICB2YXIgZ3JhZDsKKworICAgICAgICBpZiAodHlwZSA9PT0gImF4aWFsIikgeworICAgICAgICAgIGdyYWQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQocDBbMF0sIHAwWzFdLCBwMVswXSwgcDFbMV0pOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJyYWRpYWwiKSB7CisgICAgICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudChwMFswXSwgcDBbMV0sIHIwLCBwMVswXSwgcDFbMV0sIHIxKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbG9yU3RvcHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIHZhciBjID0gY29sb3JTdG9wc1tpXTsKKyAgICAgICAgICBncmFkLmFkZENvbG9yU3RvcChjWzBdLCBjWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBncmFkOworICAgICAgfQorICAgIH07CisgIH0KK307CisKK3ZhciBjcmVhdGVNZXNoQ2FudmFzID0gZnVuY3Rpb24gY3JlYXRlTWVzaENhbnZhc0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwMSwgcDIsIHAzLCBjMSwgYzIsIGMzKSB7CisgICAgdmFyIGNvb3JkcyA9IGNvbnRleHQuY29vcmRzLAorICAgICAgICBjb2xvcnMgPSBjb250ZXh0LmNvbG9yczsKKyAgICB2YXIgYnl0ZXMgPSBkYXRhLmRhdGEsCisgICAgICAgIHJvd1NpemUgPSBkYXRhLndpZHRoICogNDsKKyAgICB2YXIgdG1wOworCisgICAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHsKKyAgICAgIHRtcCA9IHAxOworICAgICAgcDEgPSBwMjsKKyAgICAgIHAyID0gdG1wOworICAgICAgdG1wID0gYzE7CisgICAgICBjMSA9IGMyOworICAgICAgYzIgPSB0bXA7CisgICAgfQorCisgICAgaWYgKGNvb3Jkc1twMiArIDFdID4gY29vcmRzW3AzICsgMV0pIHsKKyAgICAgIHRtcCA9IHAyOworICAgICAgcDIgPSBwMzsKKyAgICAgIHAzID0gdG1wOworICAgICAgdG1wID0gYzI7CisgICAgICBjMiA9IGMzOworICAgICAgYzMgPSB0bXA7CisgICAgfQorCisgICAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHsKKyAgICAgIHRtcCA9IHAxOworICAgICAgcDEgPSBwMjsKKyAgICAgIHAyID0gdG1wOworICAgICAgdG1wID0gYzE7CisgICAgICBjMSA9IGMyOworICAgICAgYzIgPSB0bXA7CisgICAgfQorCisgICAgdmFyIHgxID0gKGNvb3Jkc1twMV0gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7CisgICAgdmFyIHkxID0gKGNvb3Jkc1twMSArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZOworICAgIHZhciB4MiA9IChjb29yZHNbcDJdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYOworICAgIHZhciB5MiA9IChjb29yZHNbcDIgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTsKKyAgICB2YXIgeDMgPSAoY29vcmRzW3AzXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDsKKyAgICB2YXIgeTMgPSAoY29vcmRzW3AzICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7CisKKyAgICBpZiAoeTEgPj0geTMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgYzFyID0gY29sb3JzW2MxXSwKKyAgICAgICAgYzFnID0gY29sb3JzW2MxICsgMV0sCisgICAgICAgIGMxYiA9IGNvbG9yc1tjMSArIDJdOworICAgIHZhciBjMnIgPSBjb2xvcnNbYzJdLAorICAgICAgICBjMmcgPSBjb2xvcnNbYzIgKyAxXSwKKyAgICAgICAgYzJiID0gY29sb3JzW2MyICsgMl07CisgICAgdmFyIGMzciA9IGNvbG9yc1tjM10sCisgICAgICAgIGMzZyA9IGNvbG9yc1tjMyArIDFdLAorICAgICAgICBjM2IgPSBjb2xvcnNbYzMgKyAyXTsKKyAgICB2YXIgbWluWSA9IE1hdGgucm91bmQoeTEpLAorICAgICAgICBtYXhZID0gTWF0aC5yb3VuZCh5Myk7CisgICAgdmFyIHhhLCBjYXIsIGNhZywgY2FiOworICAgIHZhciB4YiwgY2JyLCBjYmcsIGNiYjsKKworICAgIGZvciAodmFyIHkgPSBtaW5ZOyB5IDw9IG1heFk7IHkrKykgeworICAgICAgaWYgKHkgPCB5MikgeworICAgICAgICB2YXIgX2sgPSB2b2lkIDA7CisKKyAgICAgICAgaWYgKHkgPCB5MSkgeworICAgICAgICAgIF9rID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh5MSA9PT0geTIpIHsKKyAgICAgICAgICBfayA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX2sgPSAoeTEgLSB5KSAvICh5MSAtIHkyKTsKKyAgICAgICAgfQorCisgICAgICAgIHhhID0geDEgLSAoeDEgLSB4MikgKiBfazsKKyAgICAgICAgY2FyID0gYzFyIC0gKGMxciAtIGMycikgKiBfazsKKyAgICAgICAgY2FnID0gYzFnIC0gKGMxZyAtIGMyZykgKiBfazsKKyAgICAgICAgY2FiID0gYzFiIC0gKGMxYiAtIGMyYikgKiBfazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBfazIgPSB2b2lkIDA7CisKKyAgICAgICAgaWYgKHkgPiB5MykgeworICAgICAgICAgIF9rMiA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoeTIgPT09IHkzKSB7CisgICAgICAgICAgX2syID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfazIgPSAoeTIgLSB5KSAvICh5MiAtIHkzKTsKKyAgICAgICAgfQorCisgICAgICAgIHhhID0geDIgLSAoeDIgLSB4MykgKiBfazI7CisgICAgICAgIGNhciA9IGMyciAtIChjMnIgLSBjM3IpICogX2syOworICAgICAgICBjYWcgPSBjMmcgLSAoYzJnIC0gYzNnKSAqIF9rMjsKKyAgICAgICAgY2FiID0gYzJiIC0gKGMyYiAtIGMzYikgKiBfazI7CisgICAgICB9CisKKyAgICAgIHZhciBrID0gdm9pZCAwOworCisgICAgICBpZiAoeSA8IHkxKSB7CisgICAgICAgIGsgPSAwOworICAgICAgfSBlbHNlIGlmICh5ID4geTMpIHsKKyAgICAgICAgayA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBrID0gKHkxIC0geSkgLyAoeTEgLSB5Myk7CisgICAgICB9CisKKyAgICAgIHhiID0geDEgLSAoeDEgLSB4MykgKiBrOworICAgICAgY2JyID0gYzFyIC0gKGMxciAtIGMzcikgKiBrOworICAgICAgY2JnID0gYzFnIC0gKGMxZyAtIGMzZykgKiBrOworICAgICAgY2JiID0gYzFiIC0gKGMxYiAtIGMzYikgKiBrOworICAgICAgdmFyIHgxXyA9IE1hdGgucm91bmQoTWF0aC5taW4oeGEsIHhiKSk7CisgICAgICB2YXIgeDJfID0gTWF0aC5yb3VuZChNYXRoLm1heCh4YSwgeGIpKTsKKyAgICAgIHZhciBqID0gcm93U2l6ZSAqIHkgKyB4MV8gKiA0OworCisgICAgICBmb3IgKHZhciB4ID0geDFfOyB4IDw9IHgyXzsgeCsrKSB7CisgICAgICAgIGsgPSAoeGEgLSB4KSAvICh4YSAtIHhiKTsKKworICAgICAgICBpZiAoayA8IDApIHsKKyAgICAgICAgICBrID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChrID4gMSkgeworICAgICAgICAgIGsgPSAxOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZXNbaisrXSA9IGNhciAtIChjYXIgLSBjYnIpICogayB8IDA7CisgICAgICAgIGJ5dGVzW2orK10gPSBjYWcgLSAoY2FnIC0gY2JnKSAqIGsgfCAwOworICAgICAgICBieXRlc1tqKytdID0gY2FiIC0gKGNhYiAtIGNiYikgKiBrIHwgMDsKKyAgICAgICAgYnl0ZXNbaisrXSA9IDI1NTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZSwgY29udGV4dCkgeworICAgIHZhciBwcyA9IGZpZ3VyZS5jb29yZHM7CisgICAgdmFyIGNzID0gZmlndXJlLmNvbG9yczsKKyAgICB2YXIgaSwgaWk7CisKKyAgICBzd2l0Y2ggKGZpZ3VyZS50eXBlKSB7CisgICAgICBjYXNlICJsYXR0aWNlIjoKKyAgICAgICAgdmFyIHZlcnRpY2VzUGVyUm93ID0gZmlndXJlLnZlcnRpY2VzUGVyUm93OworICAgICAgICB2YXIgcm93cyA9IE1hdGguZmxvb3IocHMubGVuZ3RoIC8gdmVydGljZXNQZXJSb3cpIC0gMTsKKyAgICAgICAgdmFyIGNvbHMgPSB2ZXJ0aWNlc1BlclJvdyAtIDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykgeworICAgICAgICAgIHZhciBxID0gaSAqIHZlcnRpY2VzUGVyUm93OworCisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb2xzOyBqKyssIHErKykgeworICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3FdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3FdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pOworICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJ0cmlhbmdsZXMiOgorICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHBzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHsKKyAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbaV0sIHBzW2kgKyAxXSwgcHNbaSArIDJdLCBjc1tpXSwgY3NbaSArIDFdLCBjc1tpICsgMl0pOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBmaWd1cmUiKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVNZXNoQ2FudmFzKGJvdW5kcywgY29tYmluZXNTY2FsZSwgY29vcmRzLCBjb2xvcnMsIGZpZ3VyZXMsIGJhY2tncm91bmRDb2xvciwgY2FjaGVkQ2FudmFzZXMsIHdlYkdMQ29udGV4dCkgeworICAgIHZhciBFWFBFQ1RFRF9TQ0FMRSA9IDEuMTsKKyAgICB2YXIgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7CisgICAgdmFyIEJPUkRFUl9TSVpFID0gMjsKKyAgICB2YXIgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTsKKyAgICB2YXIgb2Zmc2V0WSA9IE1hdGguZmxvb3IoYm91bmRzWzFdKTsKKyAgICB2YXIgYm91bmRzV2lkdGggPSBNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFg7CisgICAgdmFyIGJvdW5kc0hlaWdodCA9IE1hdGguY2VpbChib3VuZHNbM10pIC0gb2Zmc2V0WTsKKyAgICB2YXIgd2lkdGggPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzV2lkdGggKiBjb21iaW5lc1NjYWxlWzBdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7CisgICAgdmFyIGhlaWdodCA9IE1hdGgubWluKE1hdGguY2VpbChNYXRoLmFicyhib3VuZHNIZWlnaHQgKiBjb21iaW5lc1NjYWxlWzFdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7CisgICAgdmFyIHNjYWxlWCA9IGJvdW5kc1dpZHRoIC8gd2lkdGg7CisgICAgdmFyIHNjYWxlWSA9IGJvdW5kc0hlaWdodCAvIGhlaWdodDsKKyAgICB2YXIgY29udGV4dCA9IHsKKyAgICAgIGNvb3JkczogY29vcmRzLAorICAgICAgY29sb3JzOiBjb2xvcnMsCisgICAgICBvZmZzZXRYOiAtb2Zmc2V0WCwKKyAgICAgIG9mZnNldFk6IC1vZmZzZXRZLAorICAgICAgc2NhbGVYOiAxIC8gc2NhbGVYLAorICAgICAgc2NhbGVZOiAxIC8gc2NhbGVZCisgICAgfTsKKyAgICB2YXIgcGFkZGVkV2lkdGggPSB3aWR0aCArIEJPUkRFUl9TSVpFICogMjsKKyAgICB2YXIgcGFkZGVkSGVpZ2h0ID0gaGVpZ2h0ICsgQk9SREVSX1NJWkUgKiAyOworICAgIHZhciBjYW52YXMsIHRtcENhbnZhcywgaSwgaWk7CisKKyAgICBpZiAod2ViR0xDb250ZXh0LmlzRW5hYmxlZCkgeworICAgICAgY2FudmFzID0gd2ViR0xDb250ZXh0LmRyYXdGaWd1cmVzKHsKKyAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICBoZWlnaHQ6IGhlaWdodCwKKyAgICAgICAgYmFja2dyb3VuZENvbG9yOiBiYWNrZ3JvdW5kQ29sb3IsCisgICAgICAgIGZpZ3VyZXM6IGZpZ3VyZXMsCisgICAgICAgIGNvbnRleHQ6IGNvbnRleHQKKyAgICAgIH0pOworICAgICAgdG1wQ2FudmFzID0gY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtZXNoIiwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgZmFsc2UpOworICAgICAgdG1wQ2FudmFzLmNvbnRleHQuZHJhd0ltYWdlKGNhbnZhcywgQk9SREVSX1NJWkUsIEJPUkRFUl9TSVpFKTsKKyAgICAgIGNhbnZhcyA9IHRtcENhbnZhcy5jYW52YXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcENhbnZhcyA9IGNhY2hlZENhbnZhc2VzLmdldENhbnZhcygibWVzaCIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQsIGZhbHNlKTsKKyAgICAgIHZhciB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDsKKyAgICAgIHZhciBkYXRhID0gdG1wQ3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikgeworICAgICAgICB2YXIgYnl0ZXMgPSBkYXRhLmRhdGE7CisKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7CisgICAgICAgICAgYnl0ZXNbaV0gPSBiYWNrZ3JvdW5kQ29sb3JbMF07CisgICAgICAgICAgYnl0ZXNbaSArIDFdID0gYmFja2dyb3VuZENvbG9yWzFdOworICAgICAgICAgIGJ5dGVzW2kgKyAyXSA9IGJhY2tncm91bmRDb2xvclsyXTsKKyAgICAgICAgICBieXRlc1tpICsgM10gPSAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IGZpZ3VyZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmVzW2ldLCBjb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgdG1wQ3R4LnB1dEltYWdlRGF0YShkYXRhLCBCT1JERVJfU0laRSwgQk9SREVSX1NJWkUpOworICAgICAgY2FudmFzID0gdG1wQ2FudmFzLmNhbnZhczsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgY2FudmFzOiBjYW52YXMsCisgICAgICBvZmZzZXRYOiBvZmZzZXRYIC0gQk9SREVSX1NJWkUgKiBzY2FsZVgsCisgICAgICBvZmZzZXRZOiBvZmZzZXRZIC0gQk9SREVSX1NJWkUgKiBzY2FsZVksCisgICAgICBzY2FsZVg6IHNjYWxlWCwKKyAgICAgIHNjYWxlWTogc2NhbGVZCisgICAgfTsKKyAgfQorCisgIHJldHVybiBjcmVhdGVNZXNoQ2FudmFzOworfSgpOworCitTaGFkaW5nSVJzLk1lc2ggPSB7CisgIGZyb21JUjogZnVuY3Rpb24gTWVzaF9mcm9tSVIocmF3KSB7CisgICAgdmFyIGNvb3JkcyA9IHJhd1syXTsKKyAgICB2YXIgY29sb3JzID0gcmF3WzNdOworICAgIHZhciBmaWd1cmVzID0gcmF3WzRdOworICAgIHZhciBib3VuZHMgPSByYXdbNV07CisgICAgdmFyIG1hdHJpeCA9IHJhd1s2XTsKKyAgICB2YXIgYmJveCA9IHJhd1s3XTsKKyAgICB2YXIgYmFja2dyb3VuZCA9IHJhd1s4XTsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gTWVzaF9nZXRQYXR0ZXJuKGN0eCwgb3duZXIsIHNoYWRpbmdGaWxsKSB7CisgICAgICAgIGFwcGx5Qm91bmRpbmdCb3goY3R4LCBiYm94KTsKKyAgICAgICAgdmFyIHNjYWxlOworCisgICAgICAgIGlmIChzaGFkaW5nRmlsbCkgeworICAgICAgICAgIHNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShjdHgubW96Q3VycmVudFRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG93bmVyLmJhc2VUcmFuc2Zvcm0pOworCisgICAgICAgICAgaWYgKG1hdHJpeCkgeworICAgICAgICAgICAgdmFyIG1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtYXRyaXgpOworCisgICAgICAgICAgICBzY2FsZSA9IFtzY2FsZVswXSAqIG1hdHJpeFNjYWxlWzBdLCBzY2FsZVsxXSAqIG1hdHJpeFNjYWxlWzFdXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IGNyZWF0ZU1lc2hDYW52YXMoYm91bmRzLCBzY2FsZSwgY29vcmRzLCBjb2xvcnMsIGZpZ3VyZXMsIHNoYWRpbmdGaWxsID8gbnVsbCA6IGJhY2tncm91bmQsIG93bmVyLmNhY2hlZENhbnZhc2VzLCBvd25lci53ZWJHTENvbnRleHQpOworCisgICAgICAgIGlmICghc2hhZGluZ0ZpbGwpIHsKKyAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtLmFwcGx5KGN0eCwgb3duZXIuYmFzZVRyYW5zZm9ybSk7CisKKyAgICAgICAgICBpZiAobWF0cml4KSB7CisgICAgICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgbWF0cml4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjdHgudHJhbnNsYXRlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZKTsKKyAgICAgICAgY3R4LnNjYWxlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7CisgICAgICAgIHJldHVybiBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgIm5vLXJlcGVhdCIpOworICAgICAgfQorICAgIH07CisgIH0KK307CitTaGFkaW5nSVJzLkR1bW15ID0geworICBmcm9tSVI6IGZ1bmN0aW9uIER1bW15X2Zyb21JUigpIHsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gRHVtbXlfZnJvbUlSX2dldFBhdHRlcm4oKSB7CisgICAgICAgIHJldHVybiAiaG90cGluayI7CisgICAgICB9CisgICAgfTsKKyAgfQorfTsKKworZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIocmF3KSB7CisgIHZhciBzaGFkaW5nSVIgPSBTaGFkaW5nSVJzW3Jhd1swXV07CisKKyAgaWYgKCFzaGFkaW5nSVIpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gSVIgdHlwZTogIi5jb25jYXQocmF3WzBdKSk7CisgIH0KKworICByZXR1cm4gc2hhZGluZ0lSLmZyb21JUihyYXcpOworfQorCit2YXIgVGlsaW5nUGF0dGVybiA9IGZ1bmN0aW9uIFRpbGluZ1BhdHRlcm5DbG9zdXJlKCkgeworICB2YXIgUGFpbnRUeXBlID0geworICAgIENPTE9SRUQ6IDEsCisgICAgVU5DT0xPUkVEOiAyCisgIH07CisgIHZhciBNQVhfUEFUVEVSTl9TSVpFID0gMzAwMDsKKworICBmdW5jdGlvbiBUaWxpbmdQYXR0ZXJuKElSLCBjb2xvciwgY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pIHsKKyAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IElSWzJdOworICAgIHRoaXMubWF0cml4ID0gSVJbM10gfHwgWzEsIDAsIDAsIDEsIDAsIDBdOworICAgIHRoaXMuYmJveCA9IElSWzRdOworICAgIHRoaXMueHN0ZXAgPSBJUls1XTsKKyAgICB0aGlzLnlzdGVwID0gSVJbNl07CisgICAgdGhpcy5wYWludFR5cGUgPSBJUls3XTsKKyAgICB0aGlzLnRpbGluZ1R5cGUgPSBJUls4XTsKKyAgICB0aGlzLmNvbG9yID0gY29sb3I7CisgICAgdGhpcy5jYW52YXNHcmFwaGljc0ZhY3RvcnkgPSBjYW52YXNHcmFwaGljc0ZhY3Rvcnk7CisgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gYmFzZVRyYW5zZm9ybTsKKyAgICB0aGlzLnR5cGUgPSAiUGF0dGVybiI7CisgICAgdGhpcy5jdHggPSBjdHg7CisgIH0KKworICBUaWxpbmdQYXR0ZXJuLnByb3RvdHlwZSA9IHsKKyAgICBjcmVhdGVQYXR0ZXJuQ2FudmFzOiBmdW5jdGlvbiBUaWxpblBhdHRlcm5fY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcikgeworICAgICAgdmFyIG9wZXJhdG9yTGlzdCA9IHRoaXMub3BlcmF0b3JMaXN0OworICAgICAgdmFyIGJib3ggPSB0aGlzLmJib3g7CisgICAgICB2YXIgeHN0ZXAgPSB0aGlzLnhzdGVwOworICAgICAgdmFyIHlzdGVwID0gdGhpcy55c3RlcDsKKyAgICAgIHZhciBwYWludFR5cGUgPSB0aGlzLnBhaW50VHlwZTsKKyAgICAgIHZhciB0aWxpbmdUeXBlID0gdGhpcy50aWxpbmdUeXBlOworICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcjsKKyAgICAgIHZhciBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiVGlsaW5nVHlwZTogIiArIHRpbGluZ1R5cGUpOworICAgICAgdmFyIHgwID0gYmJveFswXSwKKyAgICAgICAgICB5MCA9IGJib3hbMV0sCisgICAgICAgICAgeDEgPSBiYm94WzJdLAorICAgICAgICAgIHkxID0gYmJveFszXTsKKworICAgICAgdmFyIG1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7CisKKyAgICAgIHZhciBjdXJNYXRyaXhTY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5iYXNlVHJhbnNmb3JtKTsKKworICAgICAgdmFyIGNvbWJpbmVkU2NhbGUgPSBbbWF0cml4U2NhbGVbMF0gKiBjdXJNYXRyaXhTY2FsZVswXSwgbWF0cml4U2NhbGVbMV0gKiBjdXJNYXRyaXhTY2FsZVsxXV07CisgICAgICB2YXIgZGlteCA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKHhzdGVwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIGNvbWJpbmVkU2NhbGVbMF0pOworICAgICAgdmFyIGRpbXkgPSB0aGlzLmdldFNpemVBbmRTY2FsZSh5c3RlcCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCwgY29tYmluZWRTY2FsZVsxXSk7CisgICAgICB2YXIgdG1wQ2FudmFzID0gb3duZXIuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJwYXR0ZXJuIiwgZGlteC5zaXplLCBkaW15LnNpemUsIHRydWUpOworICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0OworICAgICAgdmFyIGdyYXBoaWNzID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5LmNyZWF0ZUNhbnZhc0dyYXBoaWNzKHRtcEN0eCk7CisgICAgICBncmFwaGljcy5ncm91cExldmVsID0gb3duZXIuZ3JvdXBMZXZlbDsKKyAgICAgIHRoaXMuc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKTsKKyAgICAgIGdyYXBoaWNzLnRyYW5zZm9ybShkaW14LnNjYWxlLCAwLCAwLCBkaW15LnNjYWxlLCAwLCAwKTsKKyAgICAgIGdyYXBoaWNzLnRyYW5zZm9ybSgxLCAwLCAwLCAxLCAteDAsIC15MCk7CisgICAgICB0aGlzLmNsaXBCYm94KGdyYXBoaWNzLCBiYm94LCB4MCwgeTAsIHgxLCB5MSk7CisgICAgICBncmFwaGljcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7CisgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oMSwgMCwgMCwgMSwgeDAsIHkwKTsKKyAgICAgIHRoaXMuY3R4LnNjYWxlKDEgLyBkaW14LnNjYWxlLCAxIC8gZGlteS5zY2FsZSk7CisgICAgICByZXR1cm4gdG1wQ2FudmFzLmNhbnZhczsKKyAgICB9LAorICAgIGdldFNpemVBbmRTY2FsZTogZnVuY3Rpb24gVGlsaW5nUGF0dGVybl9nZXRTaXplQW5kU2NhbGUoc3RlcCwgcmVhbE91dHB1dFNpemUsIHNjYWxlKSB7CisgICAgICBzdGVwID0gTWF0aC5hYnMoc3RlcCk7CisgICAgICB2YXIgbWF4U2l6ZSA9IE1hdGgubWF4KE1BWF9QQVRURVJOX1NJWkUsIHJlYWxPdXRwdXRTaXplKTsKKyAgICAgIHZhciBzaXplID0gTWF0aC5jZWlsKHN0ZXAgKiBzY2FsZSk7CisKKyAgICAgIGlmIChzaXplID49IG1heFNpemUpIHsKKyAgICAgICAgc2l6ZSA9IG1heFNpemU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzY2FsZSA9IHNpemUgLyBzdGVwOworICAgICAgfQorCisgICAgICByZXR1cm4geworICAgICAgICBzY2FsZTogc2NhbGUsCisgICAgICAgIHNpemU6IHNpemUKKyAgICAgIH07CisgICAgfSwKKyAgICBjbGlwQmJveDogZnVuY3Rpb24gY2xpcEJib3goZ3JhcGhpY3MsIGJib3gsIHgwLCB5MCwgeDEsIHkxKSB7CisgICAgICBpZiAoQXJyYXkuaXNBcnJheShiYm94KSAmJiBiYm94Lmxlbmd0aCA9PT0gNCkgeworICAgICAgICB2YXIgYmJveFdpZHRoID0geDEgLSB4MDsKKyAgICAgICAgdmFyIGJib3hIZWlnaHQgPSB5MSAtIHkwOworICAgICAgICBncmFwaGljcy5jdHgucmVjdCh4MCwgeTAsIGJib3hXaWR0aCwgYmJveEhlaWdodCk7CisgICAgICAgIGdyYXBoaWNzLmNsaXAoKTsKKyAgICAgICAgZ3JhcGhpY3MuZW5kUGF0aCgpOworICAgICAgfQorICAgIH0sCisgICAgc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0OiBmdW5jdGlvbiBzZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQoZ3JhcGhpY3MsIHBhaW50VHlwZSwgY29sb3IpIHsKKyAgICAgIHZhciBjb250ZXh0ID0gZ3JhcGhpY3MuY3R4LAorICAgICAgICAgIGN1cnJlbnQgPSBncmFwaGljcy5jdXJyZW50OworCisgICAgICBzd2l0Y2ggKHBhaW50VHlwZSkgeworICAgICAgICBjYXNlIFBhaW50VHlwZS5DT0xPUkVEOgorICAgICAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGN0eC5maWxsU3R5bGU7CisgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGN0eC5zdHJva2VTdHlsZTsKKyAgICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGN0eC5maWxsU3R5bGU7CisgICAgICAgICAgY3VycmVudC5zdHJva2VDb2xvciA9IGN0eC5zdHJva2VTdHlsZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBhaW50VHlwZS5VTkNPTE9SRUQ6CisgICAgICAgICAgdmFyIGNzc0NvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pOworCisgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjc3NDb2xvcjsKKyAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY3NzQ29sb3I7CisgICAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjc3NDb2xvcjsKKyAgICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVuc3VwcG9ydGVkIHBhaW50IHR5cGU6ICIuY29uY2F0KHBhaW50VHlwZSkpOworICAgICAgfQorICAgIH0sCisgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gVGlsaW5nUGF0dGVybl9nZXRQYXR0ZXJuKGN0eCwgb3duZXIpIHsKKyAgICAgIGN0eCA9IHRoaXMuY3R4OworICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHRoaXMuYmFzZVRyYW5zZm9ybSk7CisgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgdGhpcy5tYXRyaXgpOworICAgICAgdmFyIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMgPSB0aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMob3duZXIpOworICAgICAgcmV0dXJuIGN0eC5jcmVhdGVQYXR0ZXJuKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMsICJyZXBlYXQiKTsKKyAgICB9CisgIH07CisgIHJldHVybiBUaWxpbmdQYXR0ZXJuOworfSgpOworCitleHBvcnRzLlRpbGluZ1BhdHRlcm4gPSBUaWxpbmdQYXR0ZXJuOworCisvKioqLyB9KSwKKy8qIDIwOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkdsb2JhbFdvcmtlck9wdGlvbnMgPSB2b2lkIDA7Cit2YXIgR2xvYmFsV29ya2VyT3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CitleHBvcnRzLkdsb2JhbFdvcmtlck9wdGlvbnMgPSBHbG9iYWxXb3JrZXJPcHRpb25zOworR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0ID0gR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0ID09PSB1bmRlZmluZWQgPyBudWxsIDogR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0OworR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgPSBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9PT0gdW5kZWZpbmVkID8gIiIgOiBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYzsKKworLyoqKi8gfSksCisvKiAyMTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5NZXNzYWdlSGFuZGxlciA9IHZvaWQgMDsKKwordmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXygyKSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK3ZhciBDYWxsYmFja0tpbmQgPSB7CisgIFVOS05PV046IDAsCisgIERBVEE6IDEsCisgIEVSUk9SOiAyCit9OwordmFyIFN0cmVhbUtpbmQgPSB7CisgIFVOS05PV046IDAsCisgIENBTkNFTDogMSwKKyAgQ0FOQ0VMX0NPTVBMRVRFOiAyLAorICBDTE9TRTogMywKKyAgRU5RVUVVRTogNCwKKyAgRVJST1I6IDUsCisgIFBVTEw6IDYsCisgIFBVTExfQ09NUExFVEU6IDcsCisgIFNUQVJUX0NPTVBMRVRFOiA4Cit9OworCitmdW5jdGlvbiB3cmFwUmVhc29uKHJlYXNvbikgeworICBpZiAoX3R5cGVvZihyZWFzb24pICE9PSAib2JqZWN0IiB8fCByZWFzb24gPT09IG51bGwpIHsKKyAgICByZXR1cm4gcmVhc29uOworICB9CisKKyAgc3dpdGNoIChyZWFzb24ubmFtZSkgeworICAgIGNhc2UgIkFib3J0RXhjZXB0aW9uIjoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpOworCisgICAgY2FzZSAiTWlzc2luZ1BERkV4Y2VwdGlvbiI6CisgICAgICByZXR1cm4gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpOworCisgICAgY2FzZSAiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uc3RhdHVzKTsKKworICAgIGNhc2UgIlVua25vd25FcnJvckV4Y2VwdGlvbiI6CisgICAgICByZXR1cm4gbmV3IF91dGlsLlVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmRldGFpbHMpOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24udG9TdHJpbmcoKSk7CisgIH0KK30KKwordmFyIE1lc3NhZ2VIYW5kbGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gTWVzc2FnZUhhbmRsZXIoc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7CisgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZXNzYWdlSGFuZGxlcik7CisKKyAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lOworICAgIHRoaXMudGFyZ2V0TmFtZSA9IHRhcmdldE5hbWU7CisgICAgdGhpcy5jb21PYmogPSBjb21PYmo7CisgICAgdGhpcy5jYWxsYmFja0lkID0gMTsKKyAgICB0aGlzLnN0cmVhbUlkID0gMTsKKyAgICB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gdHJ1ZTsKKyAgICB0aGlzLnN0cmVhbVNpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgIHZhciBkYXRhID0gZXZlbnQuZGF0YTsKKworICAgICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gX3RoaXMuc291cmNlTmFtZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChkYXRhLnN0cmVhbSkgeworICAgICAgICBfdGhpcy5fcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5jYWxsYmFjaykgeworICAgICAgICB2YXIgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDsKKyAgICAgICAgdmFyIGNhcGFiaWxpdHkgPSBfdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKKworICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZXNvbHZlIGNhbGxiYWNrICIuY29uY2F0KGNhbGxiYWNrSWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGV0ZSBfdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKKworICAgICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHsKKyAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuRVJST1IpIHsKKyAgICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGFjdGlvbiA9IF90aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dOworCisgICAgICBpZiAoIWFjdGlvbikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAiLmNvbmNhdChkYXRhLmFjdGlvbikpOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5jYWxsYmFja0lkKSB7CisgICAgICAgIHZhciBjYlNvdXJjZU5hbWUgPSBfdGhpcy5zb3VyY2VOYW1lOworICAgICAgICB2YXIgY2JUYXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lOworICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSkpOworICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLAorICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLAorICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAorICAgICAgICAgICAgZGF0YTogcmVzdWx0CisgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLAorICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5FUlJPUiwKKyAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCwKKyAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7CisgICAgICAgIF90aGlzLl9jcmVhdGVTdHJlYW1TaW5rKGRhdGEpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgYWN0aW9uKGRhdGEuZGF0YSk7CisgICAgfTsKKworICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKE1lc3NhZ2VIYW5kbGVyLCBbeworICAgIGtleTogIm9uIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb24oYWN0aW9uTmFtZSwgaGFuZGxlcikgeworICAgICAgdmFyIGFoID0gdGhpcy5hY3Rpb25IYW5kbGVyOworCisgICAgICBpZiAoYWhbYWN0aW9uTmFtZV0pIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkIFwiIi5jb25jYXQoYWN0aW9uTmFtZSwgIlwiIikpOworICAgICAgfQorCisgICAgICBhaFthY3Rpb25OYW1lXSA9IGhhbmRsZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2VuZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7CisgICAgICB0aGlzLl9wb3N0TWVzc2FnZSh7CisgICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKKyAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAorICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCisgICAgICAgIGRhdGE6IGRhdGEKKyAgICAgIH0sIHRyYW5zZmVycyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2VuZFdpdGhQcm9taXNlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykgeworICAgICAgdmFyIGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKKyAgICAgIHZhciBjYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXSA9IGNhcGFiaWxpdHk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuX3Bvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsCisgICAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAorICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKKyAgICAgICAgICBjYWxsYmFja0lkOiBjYWxsYmFja0lkLAorICAgICAgICAgIGRhdGE6IGRhdGEKKyAgICAgICAgfSwgdHJhbnNmZXJzKTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KGV4KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZW5kV2l0aFN0cmVhbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmRXaXRoU3RyZWFtKGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXVlaW5nU3RyYXRlZ3ksIHRyYW5zZmVycykgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHZhciBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKzsKKyAgICAgIHZhciBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lOworICAgICAgdmFyIHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWU7CisgICAgICB2YXIgY29tT2JqID0gdGhpcy5jb21PYmo7CisgICAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHsKKyAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KGNvbnRyb2xsZXIpIHsKKyAgICAgICAgICB2YXIgc3RhcnRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICAgIF90aGlzMi5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0gPSB7CisgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLAorICAgICAgICAgICAgc3RhcnRDYWxsOiBzdGFydENhcGFiaWxpdHksCisgICAgICAgICAgICBwdWxsQ2FsbDogbnVsbCwKKyAgICAgICAgICAgIGNhbmNlbENhbGw6IG51bGwsCisgICAgICAgICAgICBpc0Nsb3NlZDogZmFsc2UKKyAgICAgICAgICB9OworCisgICAgICAgICAgX3RoaXMyLl9wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKKyAgICAgICAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCwKKyAgICAgICAgICAgIGRhdGE6IGRhdGEsCisgICAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQorICAgICAgICAgIH0sIHRyYW5zZmVycyk7CisKKyAgICAgICAgICByZXR1cm4gc3RhcnRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICAgIH0sCisgICAgICAgIHB1bGw6IGZ1bmN0aW9uIHB1bGwoY29udHJvbGxlcikgeworICAgICAgICAgIHZhciBwdWxsQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgICAgICBfdGhpczIuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsID0gcHVsbENhcGFiaWxpdHk7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWU6IHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTEwsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQorICAgICAgICAgIH0pOworICAgICAgICAgIHJldHVybiBwdWxsQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgICB9LAorICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTsKKyAgICAgICAgICB2YXIgY2FuY2VsQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgICAgICBfdGhpczIuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5OworICAgICAgICAgIF90aGlzMi5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlOworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgIH0pOworICAgICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICAgIH0KKyAgICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9jcmVhdGVTdHJlYW1TaW5rIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSkgeworICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgdmFyIGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CisgICAgICB2YXIgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkOworICAgICAgdmFyIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CisgICAgICB2YXIgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTsKKyAgICAgIHZhciBjb21PYmogPSB0aGlzLmNvbU9iajsKKyAgICAgIHZhciBzdHJlYW1TaW5rID0geworICAgICAgICBlbnF1ZXVlOiBmdW5jdGlvbiBlbnF1ZXVlKGNodW5rKSB7CisgICAgICAgICAgdmFyIHNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7CisgICAgICAgICAgdmFyIHRyYW5zZmVycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkOworCisgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTsKKyAgICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7CisKKyAgICAgICAgICBpZiAobGFzdERlc2lyZWRTaXplID4gMCAmJiB0aGlzLmRlc2lyZWRTaXplIDw9IDApIHsKKyAgICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGYuX3Bvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWU6IHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVOUVVFVUUsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICBjaHVuazogY2h1bmsKKyAgICAgICAgICB9LCB0cmFuc2ZlcnMpOworICAgICAgICB9LAorICAgICAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7CisgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBkZWxldGUgc2VsZi5zdHJlYW1TaW5rc1tzdHJlYW1JZF07CisgICAgICAgIH0sCisgICAgICAgIGVycm9yOiBmdW5jdGlvbiBlcnJvcihyZWFzb24pIHsKKyAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgImVycm9yIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvbiIpOworCisgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRVJST1IsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgIH0pOworICAgICAgICB9LAorICAgICAgICBzaW5rQ2FwYWJpbGl0eTogKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpLAorICAgICAgICBvblB1bGw6IG51bGwsCisgICAgICAgIG9uQ2FuY2VsOiBudWxsLAorICAgICAgICBpc0NhbmNlbGxlZDogZmFsc2UsCisgICAgICAgIGRlc2lyZWRTaXplOiBkYXRhLmRlc2lyZWRTaXplLAorICAgICAgICByZWFkeTogbnVsbAorICAgICAgfTsKKyAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgc3RyZWFtU2luay5yZWFkeSA9IHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdID0gc3RyZWFtU2luazsKKyAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSwgc3RyZWFtU2luaykpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgc291cmNlTmFtZTogc291cmNlTmFtZSwKKyAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSwKKyAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgc3VjY2VzczogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLAorICAgICAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCwKKyAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9wcm9jZXNzU3RyZWFtTWVzc2FnZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9wcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7CisgICAgICB2YXIgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkOworICAgICAgdmFyIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CisgICAgICB2YXIgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTsKKyAgICAgIHZhciBjb21PYmogPSB0aGlzLmNvbU9iajsKKworICAgICAgc3dpdGNoIChkYXRhLnN0cmVhbSkgeworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEU6CisgICAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgeworICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLnJlc29sdmUoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEU6CisgICAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgeworICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwucmVzb2x2ZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMOgorICAgICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHsKKyAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IHNvdXJjZU5hbWUsCisgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAorICAgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLmRlc2lyZWRTaXplIDw9IDAgJiYgZGF0YS5kZXNpcmVkU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5kZXNpcmVkU2l6ZSA9IGRhdGEuZGVzaXJlZFNpemU7CisgICAgICAgICAgdmFyIG9uUHVsbCA9IHRoaXMuc3RyZWFtU2lua3NbZGF0YS5zdHJlYW1JZF0ub25QdWxsOworICAgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgICAgICByZXNvbHZlKG9uUHVsbCAmJiBvblB1bGwoKSk7CisgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKKyAgICAgICAgICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkLAorICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKKyAgICAgICAgICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkLAorICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTdHJlYW1LaW5kLkVOUVVFVUU6CisgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CisKKyAgICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZW5xdWV1ZShkYXRhLmNodW5rKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0xPU0U6CisgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOworCisgICAgICAgICAgaWYgKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5jbG9zZSgpOworCisgICAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6CisgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworCisgICAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOgorICAgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwucmVzb2x2ZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOgorICAgICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBvbkNhbmNlbCA9IHRoaXMuc3RyZWFtU2lua3NbZGF0YS5zdHJlYW1JZF0ub25DYW5jZWw7CisgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgICAgICAgIHJlc29sdmUob25DYW5jZWwgJiYgb25DYW5jZWwod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpKTsKKyAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IHNvdXJjZU5hbWUsCisgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCisgICAgICAgICAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCwKKyAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgICAgc291cmNlTmFtZTogc291cmNlTmFtZSwKKyAgICAgICAgICAgICAgdGFyZ2V0TmFtZTogdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSwKKyAgICAgICAgICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkLAorICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKKyAgICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5pc0NhbmNlbGxlZCA9IHRydWU7CisgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHN0cmVhbSBjYXNlIik7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc3RyZWFtSWQpIHsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChbdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCwgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbF0ubWFwKGZ1bmN0aW9uIChjYXBhYmlsaXR5KSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gY2FwYWJpbGl0eSAmJiBjYXBhYmlsaXR5LnByb21pc2U7CisgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07CisKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoX3gpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxldGVTdHJlYW1Db250cm9sbGVyMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXI7CisgICAgfSgpCisgIH0sIHsKKyAgICBrZXk6ICJfcG9zdE1lc3NhZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJzKSB7CisgICAgICBpZiAodHJhbnNmZXJzICYmIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMpIHsKKyAgICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImRlc3Ryb3kiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkgeworICAgICAgdGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gTWVzc2FnZUhhbmRsZXI7Cit9KCk7CisKK2V4cG9ydHMuTWVzc2FnZUhhbmRsZXIgPSBNZXNzYWdlSGFuZGxlcjsKKworLyoqKi8gfSksCisvKiAyMTEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5NZXRhZGF0YSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF94bWxfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTIpOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIE1ldGFkYXRhID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gTWV0YWRhdGEoZGF0YSkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZXRhZGF0YSk7CisKKyAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIsICJNZXRhZGF0YTogaW5wdXQgaXMgbm90IGEgc3RyaW5nIik7CisgICAgZGF0YSA9IHRoaXMuX3JlcGFpcihkYXRhKTsKKyAgICB2YXIgcGFyc2VyID0gbmV3IF94bWxfcGFyc2VyLlNpbXBsZVhNTFBhcnNlcigpOworICAgIHZhciB4bWxEb2N1bWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoZGF0YSk7CisgICAgdGhpcy5fbWV0YWRhdGFNYXAgPSBuZXcgTWFwKCk7CisKKyAgICBpZiAoeG1sRG9jdW1lbnQpIHsKKyAgICAgIHRoaXMuX3BhcnNlKHhtbERvY3VtZW50KTsKKyAgICB9CisgIH0KKworICBfY3JlYXRlQ2xhc3MoTWV0YWRhdGEsIFt7CisgICAga2V5OiAiX3JlcGFpciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXBhaXIoZGF0YSkgeworICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvXltePF0rLywgIiIpLnJlcGxhY2UoLz5cXDM3NlxcMzc3KFtePF0rKS9nLCBmdW5jdGlvbiAoYWxsLCBjb2RlcykgeworICAgICAgICB2YXIgYnl0ZXMgPSBjb2Rlcy5yZXBsYWNlKC9cXChbMC0zXSkoWzAtN10pKFswLTddKS9nLCBmdW5jdGlvbiAoY29kZSwgZDEsIGQyLCBkMykgeworICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGQxICogNjQgKyBkMiAqIDggKyBkMyAqIDEpOworICAgICAgICB9KS5yZXBsYWNlKC8mKGFtcHxhcG9zfGd0fGx0fHF1b3QpOy9nLCBmdW5jdGlvbiAoc3RyLCBuYW1lKSB7CisgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CisgICAgICAgICAgICBjYXNlICJhbXAiOgorICAgICAgICAgICAgICByZXR1cm4gIiYiOworCisgICAgICAgICAgICBjYXNlICJhcG9zIjoKKyAgICAgICAgICAgICAgcmV0dXJuICInIjsKKworICAgICAgICAgICAgY2FzZSAiZ3QiOgorICAgICAgICAgICAgICByZXR1cm4gIj4iOworCisgICAgICAgICAgICBjYXNlICJsdCI6CisgICAgICAgICAgICAgIHJldHVybiAiPCI7CisKKyAgICAgICAgICAgIGNhc2UgInF1b3QiOgorICAgICAgICAgICAgICByZXR1cm4gJyInOworICAgICAgICAgIH0KKworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiX3JlcGFpcjogIi5jb25jYXQobmFtZSwgIiBpc24ndCBkZWZpbmVkLiIpKTsKKyAgICAgICAgfSk7CisgICAgICAgIHZhciBjaGFycyA9ICIiOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgICAgICB2YXIgY29kZSA9IGJ5dGVzLmNoYXJDb2RlQXQoaSkgKiAyNTYgKyBieXRlcy5jaGFyQ29kZUF0KGkgKyAxKTsKKworICAgICAgICAgIGlmIChjb2RlID49IDMyICYmIGNvZGUgPCAxMjcgJiYgY29kZSAhPT0gNjAgJiYgY29kZSAhPT0gNjIgJiYgY29kZSAhPT0gMzgpIHsKKyAgICAgICAgICAgIGNoYXJzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJzICs9ICImI3giICsgKDB4MTAwMDAgKyBjb2RlKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpICsgIjsiOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiPiIgKyBjaGFyczsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9wYXJzZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9wYXJzZSh4bWxEb2N1bWVudCkgeworICAgICAgdmFyIHJkZiA9IHhtbERvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKworICAgICAgaWYgKHJkZi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAicmRmOnJkZiIpIHsKKyAgICAgICAgcmRmID0gcmRmLmZpcnN0Q2hpbGQ7CisKKyAgICAgICAgd2hpbGUgKHJkZiAmJiByZGYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gInJkZjpyZGYiKSB7CisgICAgICAgICAgcmRmID0gcmRmLm5leHRTaWJsaW5nOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBub2RlTmFtZSA9IHJkZiA/IHJkZi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDsKKworICAgICAgaWYgKCFyZGYgfHwgbm9kZU5hbWUgIT09ICJyZGY6cmRmIiB8fCAhcmRmLmhhc0NoaWxkTm9kZXMoKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBjaGlsZHJlbiA9IHJkZi5jaGlsZE5vZGVzOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHZhciBkZXNjID0gY2hpbGRyZW5baV07CisKKyAgICAgICAgaWYgKGRlc2Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gInJkZjpkZXNjcmlwdGlvbiIpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGRlc2MuY2hpbGROb2Rlcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgaWYgKGRlc2MuY2hpbGROb2Rlc1tqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAiI3RleHQiKSB7CisgICAgICAgICAgICB2YXIgZW50cnkgPSBkZXNjLmNoaWxkTm9kZXNbal07CisgICAgICAgICAgICB2YXIgbmFtZSA9IGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhTWFwLnNldChuYW1lLCBlbnRyeS50ZXh0Q29udGVudC50cmltKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImdldCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldChuYW1lKSB7CisgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFNYXAuaGFzKG5hbWUpID8gdGhpcy5fbWV0YWRhdGFNYXAuZ2V0KG5hbWUpIDogbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRBbGwiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGwoKSB7CisgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX21ldGFkYXRhTWFwKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoYXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMobmFtZSkgeworICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhTWFwLmhhcyhuYW1lKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gTWV0YWRhdGE7Cit9KCk7CisKK2V4cG9ydHMuTWV0YWRhdGEgPSBNZXRhZGF0YTsKKworLyoqKi8gfSksCisvKiAyMTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5TaW1wbGVYTUxQYXJzZXIgPSB2b2lkIDA7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCitmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfQorCitmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9CisKK2Z1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCitmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbInJldHVybiJdICE9IG51bGwpIF9pWyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0KKworZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9CisKK2Z1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSAidW5kZWZpbmVkIiAmJiBSZWZsZWN0LmdldCkgeyBfZ2V0ID0gUmVmbGVjdC5nZXQ7IH0gZWxzZSB7IF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBiYXNlID0gX3N1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7IGlmICghYmFzZSkgcmV0dXJuOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOyBpZiAoZGVzYy5nZXQpIHsgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpOyB9IHJldHVybiBkZXNjLnZhbHVlOyB9OyB9IHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7IH0KKworZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkgeyB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkgeyBvYmplY3QgPSBfZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7IH0gcmV0dXJuIG9iamVjdDsgfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgWE1MUGFyc2VyRXJyb3JDb2RlID0geworICBOb0Vycm9yOiAwLAorICBFbmRPZkRvY3VtZW50OiAtMSwKKyAgVW50ZXJtaW5hdGVkQ2RhdDogLTIsCisgIFVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uOiAtMywKKyAgVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uOiAtNCwKKyAgVW50ZXJtaW5hdGVkQ29tbWVudDogLTUsCisgIE1hbGZvcm1lZEVsZW1lbnQ6IC02LAorICBPdXRPZk1lbW9yeTogLTcsCisgIFVudGVybWluYXRlZEF0dHJpYnV0ZVZhbHVlOiAtOCwKKyAgVW50ZXJtaW5hdGVkRWxlbWVudDogLTksCisgIEVsZW1lbnROZXZlckJlZ3VuOiAtMTAKK307CisKK2Z1bmN0aW9uIGlzV2hpdGVzcGFjZShzLCBpbmRleCkgeworICB2YXIgY2ggPSBzW2luZGV4XTsKKyAgcmV0dXJuIGNoID09PSAiICIgfHwgY2ggPT09ICJcbiIgfHwgY2ggPT09ICJcciIgfHwgY2ggPT09ICJcdCI7Cit9CisKK2Z1bmN0aW9uIGlzV2hpdGVzcGFjZVN0cmluZyhzKSB7CisgIGZvciAodmFyIGkgPSAwLCBpaSA9IHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgIGlmICghaXNXaGl0ZXNwYWNlKHMsIGkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZhciBYTUxQYXJzZXJCYXNlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gWE1MUGFyc2VyQmFzZSgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWE1MUGFyc2VyQmFzZSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoWE1MUGFyc2VyQmFzZSwgW3sKKyAgICBrZXk6ICJfcmVzb2x2ZUVudGl0aWVzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3Jlc29sdmVFbnRpdGllcyhzKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICByZXR1cm4gcy5yZXBsYWNlKC8mKFteO10rKTsvZywgZnVuY3Rpb24gKGFsbCwgZW50aXR5KSB7CisgICAgICAgIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDIpID09PSAiI3giKSB7CisgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygyKSwgMTYpKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDEpID09PSAiIyIpIHsKKyAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlbnRpdHkuc3Vic3RyaW5nKDEpLCAxMCkpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChlbnRpdHkpIHsKKyAgICAgICAgICBjYXNlICJsdCI6CisgICAgICAgICAgICByZXR1cm4gIjwiOworCisgICAgICAgICAgY2FzZSAiZ3QiOgorICAgICAgICAgICAgcmV0dXJuICI+IjsKKworICAgICAgICAgIGNhc2UgImFtcCI6CisgICAgICAgICAgICByZXR1cm4gIiYiOworCisgICAgICAgICAgY2FzZSAicXVvdCI6CisgICAgICAgICAgICByZXR1cm4gJyInOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF90aGlzLm9uUmVzb2x2ZUVudGl0eShlbnRpdHkpOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3BhcnNlQ29udGVudCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9wYXJzZUNvbnRlbnQocywgc3RhcnQpIHsKKyAgICAgIHZhciBhdHRyaWJ1dGVzID0gW107CisgICAgICB2YXIgcG9zID0gc3RhcnQ7CisKKyAgICAgIGZ1bmN0aW9uIHNraXBXcygpIHsKKyAgICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7CisgICAgICAgICAgKytwb3M7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICIvIikgeworICAgICAgICArK3BvczsKKyAgICAgIH0KKworICAgICAgdmFyIG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKKyAgICAgIHNraXBXcygpOworCisgICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIgJiYgc1twb3NdICE9PSAiPyIpIHsKKyAgICAgICAgc2tpcFdzKCk7CisgICAgICAgIHZhciBhdHRyTmFtZSA9ICIiLAorICAgICAgICAgICAgYXR0clZhbHVlID0gIiI7CisKKyAgICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI9IikgeworICAgICAgICAgIGF0dHJOYW1lICs9IHNbcG9zXTsKKyAgICAgICAgICArK3BvczsKKyAgICAgICAgfQorCisgICAgICAgIHNraXBXcygpOworCisgICAgICAgIGlmIChzW3Bvc10gIT09ICI9IikgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgKytwb3M7CisgICAgICAgIHNraXBXcygpOworICAgICAgICB2YXIgYXR0ckVuZENoYXIgPSBzW3Bvc107CisKKyAgICAgICAgaWYgKGF0dHJFbmRDaGFyICE9PSAnIicgJiYgYXR0ckVuZENoYXIgIT09ICInIikgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGF0dHJFbmRJbmRleCA9IHMuaW5kZXhPZihhdHRyRW5kQ2hhciwgKytwb3MpOworCisgICAgICAgIGlmIChhdHRyRW5kSW5kZXggPCAwKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBhdHRyVmFsdWUgPSBzLnN1YnN0cmluZyhwb3MsIGF0dHJFbmRJbmRleCk7CisgICAgICAgIGF0dHJpYnV0ZXMucHVzaCh7CisgICAgICAgICAgbmFtZTogYXR0ck5hbWUsCisgICAgICAgICAgdmFsdWU6IHRoaXMuX3Jlc29sdmVFbnRpdGllcyhhdHRyVmFsdWUpCisgICAgICAgIH0pOworICAgICAgICBwb3MgPSBhdHRyRW5kSW5kZXggKyAxOworICAgICAgICBza2lwV3MoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgbmFtZTogbmFtZSwKKyAgICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlcywKKyAgICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydAorICAgICAgfTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocywgc3RhcnQpIHsKKyAgICAgIHZhciBwb3MgPSBzdGFydDsKKworICAgICAgZnVuY3Rpb24gc2tpcFdzKCkgeworICAgICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlKHMsIHBvcykpIHsKKyAgICAgICAgICArK3BvczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgIWlzV2hpdGVzcGFjZShzLCBwb3MpICYmIHNbcG9zXSAhPT0gIj4iICYmIHNbcG9zXSAhPT0gIi8iKSB7CisgICAgICAgICsrcG9zOworICAgICAgfQorCisgICAgICB2YXIgbmFtZSA9IHMuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpOworICAgICAgc2tpcFdzKCk7CisgICAgICB2YXIgYXR0clN0YXJ0ID0gcG9zOworCisgICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgKHNbcG9zXSAhPT0gIj8iIHx8IHNbcG9zICsgMV0gIT09ICI+IikpIHsKKyAgICAgICAgKytwb3M7CisgICAgICB9CisKKyAgICAgIHZhciB2YWx1ZSA9IHMuc3Vic3RyaW5nKGF0dHJTdGFydCwgcG9zKTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIG5hbWU6IG5hbWUsCisgICAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydAorICAgICAgfTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwYXJzZVhtbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlWG1sKHMpIHsKKyAgICAgIHZhciBpID0gMDsKKworICAgICAgd2hpbGUgKGkgPCBzLmxlbmd0aCkgeworICAgICAgICB2YXIgY2ggPSBzW2ldOworICAgICAgICB2YXIgaiA9IGk7CisKKyAgICAgICAgaWYgKGNoID09PSAiPCIpIHsKKyAgICAgICAgICArK2o7CisgICAgICAgICAgdmFyIGNoMiA9IHNbal07CisgICAgICAgICAgdmFyIHEgPSB2b2lkIDA7CisKKyAgICAgICAgICBzd2l0Y2ggKGNoMikgeworICAgICAgICAgICAgY2FzZSAiLyI6CisgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGopOworCisgICAgICAgICAgICAgIGlmIChxIDwgMCkgeworICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRWxlbWVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhpcy5vbkVuZEVsZW1lbnQocy5zdWJzdHJpbmcoaiwgcSkpOworICAgICAgICAgICAgICBqID0gcSArIDE7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICI/IjoKKyAgICAgICAgICAgICAgKytqOworCisgICAgICAgICAgICAgIHZhciBwaSA9IHRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIGopOworCisgICAgICAgICAgICAgIGlmIChzLnN1YnN0cmluZyhqICsgcGkucGFyc2VkLCBqICsgcGkucGFyc2VkICsgMikgIT09ICI/PiIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB0aGlzLm9uUGkocGkubmFtZSwgcGkudmFsdWUpOworICAgICAgICAgICAgICBqICs9IHBpLnBhcnNlZCArIDI7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICIhIjoKKyAgICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgMykgPT09ICItLSIpIHsKKyAgICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCItLT4iLCBqICsgMyk7CisKKyAgICAgICAgICAgICAgICBpZiAocSA8IDApIHsKKyAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5vbkNvbW1lbnQocy5zdWJzdHJpbmcoaiArIDMsIHEpKTsKKyAgICAgICAgICAgICAgICBqID0gcSArIDM7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gIltDREFUQVsiKSB7CisgICAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiXV0+IiwgaiArIDgpOworCisgICAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENkYXQpOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMub25DZGF0YShzLnN1YnN0cmluZyhqICsgOCwgcSkpOworICAgICAgICAgICAgICAgIGogPSBxICsgMzsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDgpID09PSAiRE9DVFlQRSIpIHsKKyAgICAgICAgICAgICAgICB2YXIgcTIgPSBzLmluZGV4T2YoIlsiLCBqICsgOCk7CisgICAgICAgICAgICAgICAgdmFyIGNvbXBsZXhEb2N0eXBlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGogKyA4KTsKKworICAgICAgICAgICAgICAgIGlmIChxIDwgMCkgeworICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWREb2N0eXBlRGVjbGFyYXRpb24pOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChxMiA+IDAgJiYgcSA+IHEyKSB7CisgICAgICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCJdPiIsIGogKyA4KTsKKworICAgICAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBjb21wbGV4RG9jdHlwZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGRvY3R5cGVDb250ZW50ID0gcy5zdWJzdHJpbmcoaiArIDgsIHEgKyAoY29tcGxleERvY3R5cGUgPyAxIDogMCkpOworICAgICAgICAgICAgICAgIHRoaXMub25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KTsKKyAgICAgICAgICAgICAgICBqID0gcSArIChjb21wbGV4RG9jdHlwZSA/IDIgOiAxKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLk1hbGZvcm1lZEVsZW1lbnQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuX3BhcnNlQ29udGVudChzLCBqKTsKKworICAgICAgICAgICAgICBpZiAoY29udGVudCA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIGlzQ2xvc2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyBjb250ZW50LnBhcnNlZCwgaiArIGNvbnRlbnQucGFyc2VkICsgMikgPT09ICIvPiIpIHsKKyAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIGNvbnRlbnQucGFyc2VkLCBqICsgY29udGVudC5wYXJzZWQgKyAxKSAhPT0gIj4iKSB7CisgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB0aGlzLm9uQmVnaW5FbGVtZW50KGNvbnRlbnQubmFtZSwgY29udGVudC5hdHRyaWJ1dGVzLCBpc0Nsb3NlZCk7CisgICAgICAgICAgICAgIGogKz0gY29udGVudC5wYXJzZWQgKyAoaXNDbG9zZWQgPyAyIDogMSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3aGlsZSAoaiA8IHMubGVuZ3RoICYmIHNbal0gIT09ICI8IikgeworICAgICAgICAgICAgaisrOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciB0ZXh0ID0gcy5zdWJzdHJpbmcoaSwgaik7CisgICAgICAgICAgdGhpcy5vblRleHQodGhpcy5fcmVzb2x2ZUVudGl0aWVzKHRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGkgPSBqOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uUmVzb2x2ZUVudGl0eSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG9uUmVzb2x2ZUVudGl0eShuYW1lKSB7CisgICAgICByZXR1cm4gIiYiLmNvbmNhdChuYW1lLCAiOyIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uUGkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvblBpKG5hbWUsIHZhbHVlKSB7fQorICB9LCB7CisgICAga2V5OiAib25Db21tZW50IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25Db21tZW50KHRleHQpIHt9CisgIH0sIHsKKyAgICBrZXk6ICJvbkNkYXRhIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25DZGF0YSh0ZXh0KSB7fQorICB9LCB7CisgICAga2V5OiAib25Eb2N0eXBlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KSB7fQorICB9LCB7CisgICAga2V5OiAib25UZXh0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25UZXh0KHRleHQpIHt9CisgIH0sIHsKKyAgICBrZXk6ICJvbkJlZ2luRWxlbWVudCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHt9CisgIH0sIHsKKyAgICBrZXk6ICJvbkVuZEVsZW1lbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVuZEVsZW1lbnQobmFtZSkge30KKyAgfSwgeworICAgIGtleTogIm9uRXJyb3IiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVycm9yKGNvZGUpIHt9CisgIH1dKTsKKworICByZXR1cm4gWE1MUGFyc2VyQmFzZTsKK30oKTsKKwordmFyIFNpbXBsZURPTU5vZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBTaW1wbGVET01Ob2RlKG5vZGVOYW1lLCBub2RlVmFsdWUpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2ltcGxlRE9NTm9kZSk7CisKKyAgICB0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7CisgICAgdGhpcy5ub2RlVmFsdWUgPSBub2RlVmFsdWU7CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJwYXJlbnROb2RlIiwgeworICAgICAgdmFsdWU6IG51bGwsCisgICAgICB3cml0YWJsZTogdHJ1ZQorICAgIH0pOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFNpbXBsZURPTU5vZGUsIFt7CisgICAga2V5OiAiaGFzQ2hpbGROb2RlcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0NoaWxkTm9kZXMoKSB7CisgICAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVzICYmIHRoaXMuY2hpbGROb2Rlcy5sZW5ndGggPiAwOworICAgIH0KKyAgfSwgeworICAgIGtleTogImZpcnN0Q2hpbGQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyAmJiB0aGlzLmNoaWxkTm9kZXNbMF07CisgICAgfQorICB9LCB7CisgICAga2V5OiAibmV4dFNpYmxpbmciLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgdmFyIGNoaWxkTm9kZXMgPSB0aGlzLnBhcmVudE5vZGUuY2hpbGROb2RlczsKKworICAgICAgaWYgKCFjaGlsZE5vZGVzKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHZhciBpbmRleCA9IGNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTsKKworICAgICAgaWYgKGluZGV4ID09PSAtMSkgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICByZXR1cm4gY2hpbGROb2Rlc1tpbmRleCArIDFdOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRleHRDb250ZW50IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIGlmICghdGhpcy5jaGlsZE5vZGVzKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5vZGVWYWx1ZSB8fCAiIjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY2hpbGROb2Rlcy5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7CisgICAgICAgIHJldHVybiBjaGlsZC50ZXh0Q29udGVudDsKKyAgICAgIH0pLmpvaW4oIiIpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBTaW1wbGVET01Ob2RlOworfSgpOworCit2YXIgU2ltcGxlWE1MUGFyc2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfWE1MUGFyc2VyQmFzZSkgeworICBfaW5oZXJpdHMoU2ltcGxlWE1MUGFyc2VyLCBfWE1MUGFyc2VyQmFzZSk7CisKKyAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihTaW1wbGVYTUxQYXJzZXIpOworCisgIGZ1bmN0aW9uIFNpbXBsZVhNTFBhcnNlcigpIHsKKyAgICB2YXIgX3RoaXMyOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNpbXBsZVhNTFBhcnNlcik7CisKKyAgICBfdGhpczIgPSBfc3VwZXIuY2FsbCh0aGlzKTsKKyAgICBfdGhpczIuX2N1cnJlbnRGcmFnbWVudCA9IG51bGw7CisgICAgX3RoaXMyLl9zdGFjayA9IG51bGw7CisgICAgX3RoaXMyLl9lcnJvckNvZGUgPSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcjsKKyAgICByZXR1cm4gX3RoaXMyOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFNpbXBsZVhNTFBhcnNlciwgW3sKKyAgICBrZXk6ICJwYXJzZUZyb21TdHJpbmciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUZyb21TdHJpbmcoZGF0YSkgeworICAgICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gW107CisgICAgICB0aGlzLl9zdGFjayA9IFtdOworICAgICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CisgICAgICB0aGlzLnBhcnNlWG1sKGRhdGEpOworCisgICAgICBpZiAodGhpcy5fZXJyb3JDb2RlICE9PSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcikgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICB2YXIgX3RoaXMkX2N1cnJlbnRGcmFnbWVuID0gX3NsaWNlZFRvQXJyYXkodGhpcy5fY3VycmVudEZyYWdtZW50LCAxKSwKKyAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSBfdGhpcyRfY3VycmVudEZyYWdtZW5bMF07CisKKyAgICAgIGlmICghZG9jdW1lbnRFbGVtZW50KSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIGRvY3VtZW50RWxlbWVudDogZG9jdW1lbnRFbGVtZW50CisgICAgICB9OworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uUmVzb2x2ZUVudGl0eSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG9uUmVzb2x2ZUVudGl0eShuYW1lKSB7CisgICAgICBzd2l0Y2ggKG5hbWUpIHsKKyAgICAgICAgY2FzZSAiYXBvcyI6CisgICAgICAgICAgcmV0dXJuICInIjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKFNpbXBsZVhNTFBhcnNlci5wcm90b3R5cGUpLCAib25SZXNvbHZlRW50aXR5IiwgdGhpcykuY2FsbCh0aGlzLCBuYW1lKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvblRleHQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvblRleHQodGV4dCkgeworICAgICAgaWYgKGlzV2hpdGVzcGFjZVN0cmluZyh0ZXh0KSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUoIiN0ZXh0IiwgdGV4dCk7CisKKyAgICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG5vZGUpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uQ2RhdGEiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNkYXRhKHRleHQpIHsKKyAgICAgIHZhciBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUoIiN0ZXh0IiwgdGV4dCk7CisKKyAgICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG5vZGUpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uQmVnaW5FbGVtZW50IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25CZWdpbkVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgaXNFbXB0eSkgeworICAgICAgdmFyIG5vZGUgPSBuZXcgU2ltcGxlRE9NTm9kZShuYW1lKTsKKyAgICAgIG5vZGUuY2hpbGROb2RlcyA9IFtdOworCisgICAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTsKKworICAgICAgaWYgKGlzRW1wdHkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnRGcmFnbWVudCk7CisKKyAgICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG5vZGUuY2hpbGROb2RlczsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvbkVuZEVsZW1lbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVuZEVsZW1lbnQobmFtZSkgeworICAgICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gdGhpcy5fc3RhY2sucG9wKCkgfHwgW107CisgICAgICB2YXIgbGFzdEVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RnJhZ21lbnRbdGhpcy5fY3VycmVudEZyYWdtZW50Lmxlbmd0aCAtIDFdOworCisgICAgICBpZiAoIWxhc3RFbGVtZW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbGFzdEVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGxhc3RFbGVtZW50LmNoaWxkTm9kZXNbaV0ucGFyZW50Tm9kZSA9IGxhc3RFbGVtZW50OworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uRXJyb3IiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVycm9yKGNvZGUpIHsKKyAgICAgIHRoaXMuX2Vycm9yQ29kZSA9IGNvZGU7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFNpbXBsZVhNTFBhcnNlcjsKK30oWE1MUGFyc2VyQmFzZSk7CisKK2V4cG9ydHMuU2ltcGxlWE1MUGFyc2VyID0gU2ltcGxlWE1MUGFyc2VyOworCisvKioqLyB9KSwKKy8qIDIxMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK3ZhciBPcHRpb25hbENvbnRlbnRHcm91cCA9IGZ1bmN0aW9uIE9wdGlvbmFsQ29udGVudEdyb3VwKG5hbWUsIGludGVudCkgeworICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT3B0aW9uYWxDb250ZW50R3JvdXApOworCisgIHRoaXMudmlzaWJsZSA9IHRydWU7CisgIHRoaXMubmFtZSA9IG5hbWU7CisgIHRoaXMuaW50ZW50ID0gaW50ZW50OworfTsKKwordmFyIE9wdGlvbmFsQ29udGVudENvbmZpZyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIE9wdGlvbmFsQ29udGVudENvbmZpZyhkYXRhKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE9wdGlvbmFsQ29udGVudENvbmZpZyk7CisKKyAgICB0aGlzLm5hbWUgPSBudWxsOworICAgIHRoaXMuY3JlYXRvciA9IG51bGw7CisgICAgdGhpcy5fb3JkZXIgPSBudWxsOworICAgIHRoaXMuX2dyb3VwcyA9IG5ldyBNYXAoKTsKKworICAgIGlmIChkYXRhID09PSBudWxsKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lOworICAgIHRoaXMuY3JlYXRvciA9IGRhdGEuY3JlYXRvcjsKKyAgICB0aGlzLl9vcmRlciA9IGRhdGEub3JkZXI7CisKKyAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGF0YS5ncm91cHMpLAorICAgICAgICBfc3RlcDsKKworICAgIHRyeSB7CisgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgeworICAgICAgICB2YXIgX2dyb3VwID0gX3N0ZXAudmFsdWU7CisKKyAgICAgICAgdGhpcy5fZ3JvdXBzLnNldChfZ3JvdXAuaWQsIG5ldyBPcHRpb25hbENvbnRlbnRHcm91cChfZ3JvdXAubmFtZSwgX2dyb3VwLmludGVudCkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgX2l0ZXJhdG9yLmYoKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS5iYXNlU3RhdGUgPT09ICJPRkYiKSB7CisgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX2dyb3VwcyksCisgICAgICAgICAgX3N0ZXAyOworCisgICAgICB0cnkgeworICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykgeworICAgICAgICAgIHZhciBncm91cCA9IF9zdGVwMi52YWx1ZTsKKyAgICAgICAgICBncm91cC52aXNpYmxlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjIuZigpOworICAgICAgfQorICAgIH0KKworICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGF0YS5vbiksCisgICAgICAgIF9zdGVwMzsKKworICAgIHRyeSB7CisgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykgeworICAgICAgICB2YXIgb24gPSBfc3RlcDMudmFsdWU7CisgICAgICAgIHRoaXMuX2dyb3Vwcy5nZXQob24pLnZpc2libGUgPSB0cnVlOworICAgICAgfQorICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgX2l0ZXJhdG9yMy5lKGVycik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIF9pdGVyYXRvcjMuZigpOworICAgIH0KKworICAgIHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGF0YS5vZmYpLAorICAgICAgICBfc3RlcDQ7CisKKyAgICB0cnkgeworICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgdmFyIG9mZiA9IF9zdGVwNC52YWx1ZTsKKyAgICAgICAgdGhpcy5fZ3JvdXBzLmdldChvZmYpLnZpc2libGUgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgIF9pdGVyYXRvcjQuZShlcnIpOworICAgIH0gZmluYWxseSB7CisgICAgICBfaXRlcmF0b3I0LmYoKTsKKyAgICB9CisgIH0KKworICBfY3JlYXRlQ2xhc3MoT3B0aW9uYWxDb250ZW50Q29uZmlnLCBbeworICAgIGtleTogImlzVmlzaWJsZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmlzaWJsZShncm91cCkgeworICAgICAgaWYgKGdyb3VwLnR5cGUgPT09ICJPQ0ciKSB7CisgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhncm91cC5pZCkpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAiLmNvbmNhdChncm91cC5pZCkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXAuaWQpLnZpc2libGU7CisgICAgICB9IGVsc2UgaWYgKGdyb3VwLnR5cGUgPT09ICJPQ01EIikgeworICAgICAgICBpZiAoZ3JvdXAuZXhwcmVzc2lvbikgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVmlzaWJpbGl0eSBleHByZXNzaW9uIG5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFncm91cC5wb2xpY3kgfHwgZ3JvdXAucG9saWN5ID09PSAiQW55T24iKSB7CisgICAgICAgICAgdmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihncm91cC5pZHMpLAorICAgICAgICAgICAgICBfc3RlcDU7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I1LnMoKTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgICAgdmFyIGlkID0gX3N0ZXA1LnZhbHVlOworCisgICAgICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhpZCkpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAiLmNvbmNhdChpZCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgX2l0ZXJhdG9yNS5lKGVycik7CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9pdGVyYXRvcjUuZigpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09ICJBbGxPbiIpIHsKKyAgICAgICAgICB2YXIgX2l0ZXJhdG9yNiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGdyb3VwLmlkcyksCisgICAgICAgICAgICAgIF9zdGVwNjsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjYucygpOyAhKF9zdGVwNiA9IF9pdGVyYXRvcjYubigpKS5kb25lOykgeworICAgICAgICAgICAgICB2YXIgX2lkID0gX3N0ZXA2LnZhbHVlOworCisgICAgICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhfaWQpKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogIi5jb25jYXQoX2lkKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5nZXQoX2lkKS52aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgICBfaXRlcmF0b3I2LmUoZXJyKTsKKyAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2l0ZXJhdG9yNi5mKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSAiQW55T2ZmIikgeworICAgICAgICAgIHZhciBfaXRlcmF0b3I3ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZ3JvdXAuaWRzKSwKKyAgICAgICAgICAgICAgX3N0ZXA3OworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNy5zKCk7ICEoX3N0ZXA3ID0gX2l0ZXJhdG9yNy5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICAgIHZhciBfaWQyID0gX3N0ZXA3LnZhbHVlOworCisgICAgICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhfaWQyKSkgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICIuY29uY2F0KF9pZDIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmdldChfaWQyKS52aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgIF9pdGVyYXRvcjcuZShlcnIpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfaXRlcmF0b3I3LmYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSAiQWxsT2ZmIikgeworICAgICAgICAgIHZhciBfaXRlcmF0b3I4ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZ3JvdXAuaWRzKSwKKyAgICAgICAgICAgICAgX3N0ZXA4OworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yOC5zKCk7ICEoX3N0ZXA4ID0gX2l0ZXJhdG9yOC5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICAgIHZhciBfaWQzID0gX3N0ZXA4LnZhbHVlOworCisgICAgICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhfaWQzKSkgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICIuY29uY2F0KF9pZDMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KF9pZDMpLnZpc2libGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgIF9pdGVyYXRvcjguZShlcnIpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfaXRlcmF0b3I4LmYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSAiLmNvbmNhdChncm91cC5wb2xpY3ksICIuIikpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmtub3duIGdyb3VwIHR5cGUgIi5jb25jYXQoZ3JvdXAudHlwZSwgIi4iKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRWaXNpYmlsaXR5IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VmlzaWJpbGl0eShpZCkgeworICAgICAgdmFyIHZpc2libGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7CisKKyAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhpZCkpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogIi5jb25jYXQoaWQpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9ncm91cHMuZ2V0KGlkKS52aXNpYmxlID0gISF2aXNpYmxlOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldE9yZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3JkZXIoKSB7CisgICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5zaXplKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fb3JkZXIpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX29yZGVyLnNsaWNlKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2dyb3Vwcy5rZXlzKCkpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEdyb3VwcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEdyb3VwcygpIHsKKyAgICAgIGlmICghdGhpcy5fZ3JvdXBzLnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fZ3JvdXBzKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRHcm91cCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEdyb3VwKGlkKSB7CisgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBzLmdldChpZCkgfHwgbnVsbDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gT3B0aW9uYWxDb250ZW50Q29uZmlnOworfSgpOworCitleHBvcnRzLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IE9wdGlvbmFsQ29udGVudENvbmZpZzsKKworLyoqKi8gfSksCisvKiAyMTQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZEYXRhVHJhbnNwb3J0U3RyZWFtID0gdm9pZCAwOworCit2YXIgX3JlZ2VuZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dfcGRmanNfcmVxdWlyZV9fKDIpKTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKworZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgImRlZmF1bHQiOiBvYmogfTsgfQorCitmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9CisKK2Z1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJ1bmRlZmluZWQiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFsicmV0dXJuIl0gIT0gbnVsbCkgaXRbInJldHVybiJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH0KKworZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KKworZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0ocGFyYW1zLCBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQpIHsKKyAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0pOworCisgICAgKDAsIF91dGlsLmFzc2VydCkocGRmRGF0YVJhbmdlVHJhbnNwb3J0LCAnUERGRGF0YVRyYW5zcG9ydFN0cmVhbSAtIG1pc3NpbmcgcmVxdWlyZWQgInBkZkRhdGFSYW5nZVRyYW5zcG9ydCIgYXJndW1lbnQuJyk7CisgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gW107CisgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gcGFyYW1zLnByb2dyZXNzaXZlRG9uZSB8fCBmYWxzZTsKKyAgICB2YXIgaW5pdGlhbERhdGEgPSBwYXJhbXMuaW5pdGlhbERhdGE7CisKKyAgICBpZiAoaW5pdGlhbERhdGEgJiYgaW5pdGlhbERhdGEubGVuZ3RoID4gMCkgeworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGluaXRpYWxEYXRhKS5idWZmZXI7CisKKyAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7CisgICAgfQorCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0ID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0OworICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXBhcmFtcy5kaXNhYmxlU3RyZWFtOworICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhcGFyYW1zLmRpc2FibGVSYW5nZTsKKyAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gcGFyYW1zLmxlbmd0aDsKKyAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7CisgICAgdGhpcy5fcmFuZ2VSZWFkZXJzID0gW107CisKKyAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUmFuZ2VMaXN0ZW5lcihmdW5jdGlvbiAoYmVnaW4sIGNodW5rKSB7CisgICAgICBfdGhpcy5fb25SZWNlaXZlRGF0YSh7CisgICAgICAgIGJlZ2luOiBiZWdpbiwKKyAgICAgICAgY2h1bms6IGNodW5rCisgICAgICB9KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc0xpc3RlbmVyKGZ1bmN0aW9uIChsb2FkZWQsIHRvdGFsKSB7CisgICAgICBfdGhpcy5fb25Qcm9ncmVzcyh7CisgICAgICAgIGxvYWRlZDogbG9hZGVkLAorICAgICAgICB0b3RhbDogdG90YWwKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGZ1bmN0aW9uIChjaHVuaykgeworICAgICAgX3RoaXMuX29uUmVjZWl2ZURhdGEoeworICAgICAgICBjaHVuazogY2h1bmsKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKGZ1bmN0aW9uICgpIHsKKyAgICAgIF90aGlzLl9vblByb2dyZXNzaXZlRG9uZSgpOworICAgIH0pOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnRyYW5zcG9ydFJlYWR5KCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGRGF0YVRyYW5zcG9ydFN0cmVhbSwgW3sKKyAgICBrZXk6ICJfb25SZWNlaXZlRGF0YSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9vblJlY2VpdmVEYXRhKGFyZ3MpIHsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheShhcmdzLmNodW5rKS5idWZmZXI7CisKKyAgICAgIGlmIChhcmdzLmJlZ2luID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7CisgICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2VucXVldWUoYnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChidWZmZXIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgZm91bmQgPSB0aGlzLl9yYW5nZVJlYWRlcnMuc29tZShmdW5jdGlvbiAocmFuZ2VSZWFkZXIpIHsKKyAgICAgICAgICBpZiAocmFuZ2VSZWFkZXIuX2JlZ2luICE9PSBhcmdzLmJlZ2luKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmFuZ2VSZWFkZXIuX2VucXVldWUoYnVmZmVyKTsKKworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9KTsKKworICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShmb3VuZCwgIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuIik7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX29uUHJvZ3Jlc3MiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfb25Qcm9ncmVzcyhldnQpIHsKKyAgICAgIGlmIChldnQudG90YWwgPT09IHVuZGVmaW5lZCkgeworICAgICAgICB2YXIgZmlyc3RSZWFkZXIgPSB0aGlzLl9yYW5nZVJlYWRlcnNbMF07CisKKyAgICAgICAgaWYgKGZpcnN0UmVhZGVyICYmIGZpcnN0UmVhZGVyLm9uUHJvZ3Jlc3MpIHsKKyAgICAgICAgICBmaXJzdFJlYWRlci5vblByb2dyZXNzKHsKKyAgICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZAorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgZnVsbFJlYWRlciA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOworCisgICAgICAgIGlmIChmdWxsUmVhZGVyICYmIGZ1bGxSZWFkZXIub25Qcm9ncmVzcykgeworICAgICAgICAgIGZ1bGxSZWFkZXIub25Qcm9ncmVzcyh7CisgICAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsCisgICAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfb25Qcm9ncmVzc2l2ZURvbmUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfb25Qcm9ncmVzc2l2ZURvbmUoKSB7CisgICAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHsKKyAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIucHJvZ3Jlc3NpdmVEb25lKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHRydWU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3JlbW92ZVJhbmdlUmVhZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3JlbW92ZVJhbmdlUmVhZGVyKHJlYWRlcikgeworICAgICAgdmFyIGkgPSB0aGlzLl9yYW5nZVJlYWRlcnMuaW5kZXhPZihyZWFkZXIpOworCisgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgIHRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UoaSwgMSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0RnVsbFJlYWRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZ1bGxSZWFkZXIoKSB7CisgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsICJQREZEYXRhVHJhbnNwb3J0U3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgICB2YXIgcXVldWVkQ2h1bmtzID0gdGhpcy5fcXVldWVkQ2h1bmtzOworICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gbnVsbDsKKyAgICAgIHJldHVybiBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcih0aGlzLCBxdWV1ZWRDaHVua3MsIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UmFuZ2VSZWFkZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CisgICAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIHJlYWRlciA9IG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgYmVnaW4sIGVuZCk7CisKKyAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpOworCisgICAgICB0aGlzLl9yYW5nZVJlYWRlcnMucHVzaChyZWFkZXIpOworCisgICAgICByZXR1cm4gcmVhZGVyOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNhbmNlbEFsbFJlcXVlc3RzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7CisgICAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHsKKyAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgICB9CisKKyAgICAgIHZhciByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNsaWNlKDApOworCisgICAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJhbmdlUmVhZGVyKSB7CisgICAgICAgIHJhbmdlUmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgICAgfSk7CisKKyAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hYm9ydCgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID8gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2xvYWRlZCA6IDA7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERkRhdGFUcmFuc3BvcnRTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IFBERkRhdGFUcmFuc3BvcnRTdHJlYW07CisKK3ZhciBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcihzdHJlYW0sIHF1ZXVlZENodW5rcykgeworICAgIHZhciBwcm9ncmVzc2l2ZURvbmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIpOworCisgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMuX2RvbmUgPSBwcm9ncmVzc2l2ZURvbmUgfHwgZmFsc2U7CisgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsOworICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IHF1ZXVlZENodW5rcyB8fCBbXTsKKyAgICB0aGlzLl9sb2FkZWQgPSAwOworCisgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX3F1ZXVlZENodW5rcyksCisgICAgICAgIF9zdGVwOworCisgICAgdHJ5IHsKKyAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CisgICAgICAgIHZhciBjaHVuayA9IF9zdGVwLnZhbHVlOworICAgICAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgIF9pdGVyYXRvci5lKGVycik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIF9pdGVyYXRvci5mKCk7CisgICAgfQorCisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKyAgICB0aGlzLl9oZWFkZXJzUmVhZHkgPSBQcm9taXNlLnJlc29sdmUoKTsKKyAgICBzdHJlYW0uX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpczsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIsIFt7CisgICAga2V5OiAiX2VucXVldWUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZW5xdWV1ZShjaHVuaykgeworICAgICAgaWYgKHRoaXMuX2RvbmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkgeworICAgICAgICB2YXIgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpOworCisgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICAgIHZhbHVlOiBjaHVuaywKKyAgICAgICAgICBkb25lOiBmYWxzZQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGNodW5rKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmJ5dGVMZW5ndGg7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVhZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfcmVhZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgeworICAgICAgICB2YXIgY2h1bmssIHJlcXVlc3RDYXBhYmlsaXR5OworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBpZiAoISh0aGlzLl9xdWV1ZWRDaHVua3MubGVuZ3RoID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVua3Muc2hpZnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CisgICAgICAgICAgICAgICAgICB2YWx1ZTogY2h1bmssCisgICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RvbmUpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IHRydWUKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTsKKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2UpOworCisgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIHJlYWQoKSB7CisgICAgICAgIHJldHVybiBfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVhZDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImNhbmNlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgIHRoaXMuX2RvbmUgPSB0cnVlOworCisgICAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICAgIGRvbmU6IHRydWUKKyAgICAgICAgfSk7CisgICAgICB9KTsKKworICAgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwcm9ncmVzc2l2ZURvbmUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9ncmVzc2l2ZURvbmUoKSB7CisgICAgICBpZiAodGhpcy5fZG9uZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2RvbmUgPSB0cnVlOworICAgIH0KKyAgfSwgeworICAgIGtleTogImhlYWRlcnNSZWFkeSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5faGVhZGVyc1JlYWR5OworICAgIH0KKyAgfSwgeworICAgIGtleTogImZpbGVuYW1lIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1JhbmdlU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzUmFuZ2VTdXBwb3J0ZWQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNTdHJlYW1pbmdTdXBwb3J0ZWQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX3N0cmVhbS5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29udGVudExlbmd0aCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RoOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyOworfSgpOworCit2YXIgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyKHN0cmVhbSwgYmVnaW4sIGVuZCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIpOworCisgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMuX2JlZ2luID0gYmVnaW47CisgICAgdGhpcy5fZW5kID0gZW5kOworICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDsKKyAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworICAgIHRoaXMuX2RvbmUgPSBmYWxzZTsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciwgW3sKKyAgICBrZXk6ICJfZW5xdWV1ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9lbnF1ZXVlKGNodW5rKSB7CisgICAgICBpZiAodGhpcy5fZG9uZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBjaHVuazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciByZXF1ZXN0c0NhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpOworCisgICAgICAgIHJlcXVlc3RzQ2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICB2YWx1ZTogY2h1bmssCisgICAgICAgICAgZG9uZTogZmFsc2UKKyAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHsKKyAgICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgICBkb25lOiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgICAgICB9CisKKyAgICAgIHRoaXMuX2RvbmUgPSB0cnVlOworCisgICAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlYWQyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgeworICAgICAgICB2YXIgY2h1bmssIHJlcXVlc3RDYXBhYmlsaXR5OworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9xdWV1ZWRDaHVuaykgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVuazsKKyAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiBjaHVuaywKKyAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZG9uZSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA2OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgICAgICAgICBkb25lOiB0cnVlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZSk7CisKKyAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiByZWFkKCkgeworICAgICAgICByZXR1cm4gX3JlYWQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZWFkOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiY2FuY2VsIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsKHJlYXNvbikgeworICAgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7CisgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgIH0pOworCisgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworCisgICAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzU3RyZWFtaW5nU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyOworfSgpOworCisvKioqLyB9KSwKKy8qIDIxNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLldlYkdMQ29udGV4dCA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBXZWJHTENvbnRleHQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBXZWJHTENvbnRleHQoX3JlZikgeworICAgIHZhciBfcmVmJGVuYWJsZSA9IF9yZWYuZW5hYmxlLAorICAgICAgICBlbmFibGUgPSBfcmVmJGVuYWJsZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGVuYWJsZTsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXZWJHTENvbnRleHQpOworCisgICAgdGhpcy5fZW5hYmxlZCA9IGVuYWJsZSA9PT0gdHJ1ZTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhXZWJHTENvbnRleHQsIFt7CisgICAga2V5OiAiY29tcG9zZVNNYXNrIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9zZVNNYXNrKF9yZWYyKSB7CisgICAgICB2YXIgbGF5ZXIgPSBfcmVmMi5sYXllciwKKyAgICAgICAgICBtYXNrID0gX3JlZjIubWFzaywKKyAgICAgICAgICBwcm9wZXJ0aWVzID0gX3JlZjIucHJvcGVydGllczsKKyAgICAgIHJldHVybiBXZWJHTFV0aWxzLmNvbXBvc2VTTWFzayhsYXllciwgbWFzaywgcHJvcGVydGllcyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZHJhd0ZpZ3VyZXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBkcmF3RmlndXJlcyhfcmVmMykgeworICAgICAgdmFyIHdpZHRoID0gX3JlZjMud2lkdGgsCisgICAgICAgICAgaGVpZ2h0ID0gX3JlZjMuaGVpZ2h0LAorICAgICAgICAgIGJhY2tncm91bmRDb2xvciA9IF9yZWYzLmJhY2tncm91bmRDb2xvciwKKyAgICAgICAgICBmaWd1cmVzID0gX3JlZjMuZmlndXJlcywKKyAgICAgICAgICBjb250ZXh0ID0gX3JlZjMuY29udGV4dDsKKyAgICAgIHJldHVybiBXZWJHTFV0aWxzLmRyYXdGaWd1cmVzKHdpZHRoLCBoZWlnaHQsIGJhY2tncm91bmRDb2xvciwgZmlndXJlcywgY29udGV4dCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2xlYXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHsKKyAgICAgIFdlYkdMVXRpbHMuY2xlYW51cCgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzRW5hYmxlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQ7CisKKyAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGVuYWJsZWQgPSBXZWJHTFV0aWxzLnRyeUluaXRHTCgpOworICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzRW5hYmxlZCIsIGVuYWJsZWQpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBXZWJHTENvbnRleHQ7Cit9KCk7CisKK2V4cG9ydHMuV2ViR0xDb250ZXh0ID0gV2ViR0xDb250ZXh0OworCit2YXIgV2ViR0xVdGlscyA9IGZ1bmN0aW9uIFdlYkdMVXRpbHNDbG9zdXJlKCkgeworICBmdW5jdGlvbiBsb2FkU2hhZGVyKGdsLCBjb2RlLCBzaGFkZXJUeXBlKSB7CisgICAgdmFyIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKKyAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBjb2RlKTsKKyAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgdmFyIGNvbXBpbGVkID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpOworCisgICAgaWYgKCFjb21waWxlZCkgeworICAgICAgdmFyIGVycm9yTXNnID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpOworICAgICAgdGhyb3cgbmV3IEVycm9yKCJFcnJvciBkdXJpbmcgc2hhZGVyIGNvbXBpbGF0aW9uOiAiICsgZXJyb3JNc2cpOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhTaGFkZXIoZ2wsIGNvZGUpIHsKKyAgICByZXR1cm4gbG9hZFNoYWRlcihnbCwgY29kZSwgZ2wuVkVSVEVYX1NIQURFUik7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgY29kZSkgeworICAgIHJldHVybiBsb2FkU2hhZGVyKGdsLCBjb2RlLCBnbC5GUkFHTUVOVF9TSEFERVIpOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbShnbCwgc2hhZGVycykgeworICAgIHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc2hhZGVycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyc1tpXSk7CisgICAgfQorCisgICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgdmFyIGxpbmtlZCA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpOworCisgICAgaWYgKCFsaW5rZWQpIHsKKyAgICAgIHZhciBlcnJvck1zZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pOworICAgICAgdGhyb3cgbmV3IEVycm9yKCJFcnJvciBkdXJpbmcgcHJvZ3JhbSBsaW5raW5nOiAiICsgZXJyb3JNc2cpOworICAgIH0KKworICAgIHJldHVybiBwcm9ncmFtOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShnbCwgaW1hZ2UsIHRleHR1cmVJZCkgeworICAgIGdsLmFjdGl2ZVRleHR1cmUodGV4dHVyZUlkKTsKKyAgICB2YXIgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKKyAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKKyAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKKyAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKKyAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CisgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOworICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpOworICAgIHJldHVybiB0ZXh0dXJlOworICB9CisKKyAgdmFyIGN1cnJlbnRHTCwgY3VycmVudENhbnZhczsKKworICBmdW5jdGlvbiBnZW5lcmF0ZUdMKCkgeworICAgIGlmIChjdXJyZW50R0wpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdXJyZW50Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CisgICAgY3VycmVudEdMID0gY3VycmVudENhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbCIsIHsKKyAgICAgIHByZW11bHRpcGxpZWRhbHBoYTogZmFsc2UKKyAgICB9KTsKKyAgfQorCisgIHZhciBzbWFza1ZlcnRleFNoYWRlckNvZGUgPSAiXAorICBhdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXR0cmlidXRlIHZlYzIgYV90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlmb3JtIHZlYzIgdV9yZXNvbHV0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZhcnlpbmcgdmVjMiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjMiBjbGlwU3BhY2UgPSAoYV9wb3NpdGlvbiAvIHVfcmVzb2x1dGlvbikgKiAyLjAgLSAxLjA7ICAgXAorICAgIGdsX1Bvc2l0aW9uID0gdmVjNChjbGlwU3BhY2UgKiB2ZWMyKDEsIC0xKSwgMCwgMSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisgIHZhciBzbWFza0ZyYWdtZW50U2hhZGVyQ29kZSA9ICJcCisgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSB2ZWM0IHVfYmFja2Ryb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuaWZvcm0gaW50IHVfc3VidHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSBzYW1wbGVyMkQgdV9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlYzQgaW1hZ2VDb2xvciA9IHRleHR1cmUyRCh1X2ltYWdlLCB2X3RleENvb3JkKTsgICAgICAgICAgIFwKKyAgICB2ZWM0IG1hc2tDb2xvciA9IHRleHR1cmUyRCh1X21hc2ssIHZfdGV4Q29vcmQpOyAgICAgICAgICAgICBcCisgICAgaWYgKHVfYmFja2Ryb3AuYSA+IDAuMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFza0NvbG9yLnJnYiA9IG1hc2tDb2xvci5yZ2IgKiBtYXNrQ29sb3IuYSArICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1X2JhY2tkcm9wLnJnYiAqICgxLjAgLSBtYXNrQ29sb3IuYSk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IGx1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodV9zdWJ0eXBlID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBsdW0gPSBtYXNrQ29sb3IuYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGx1bSA9IG1hc2tDb2xvci5yICogMC4zICsgbWFza0NvbG9yLmcgKiAwLjU5ICsgICAgICAgICAgICBcCisgICAgICAgICAgICBtYXNrQ29sb3IuYiAqIDAuMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbWFnZUNvbG9yLmEgKj0gbHVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW1hZ2VDb2xvci5yZ2IgKj0gaW1hZ2VDb2xvci5hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdsX0ZyYWdDb2xvciA9IGltYWdlQ29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICB2YXIgc21hc2tDYWNoZSA9IG51bGw7CisKKyAgZnVuY3Rpb24gaW5pdFNtYXNrR0woKSB7CisgICAgdmFyIGNhbnZhcywgZ2w7CisgICAgZ2VuZXJhdGVHTCgpOworICAgIGNhbnZhcyA9IGN1cnJlbnRDYW52YXM7CisgICAgY3VycmVudENhbnZhcyA9IG51bGw7CisgICAgZ2wgPSBjdXJyZW50R0w7CisgICAgY3VycmVudEdMID0gbnVsbDsKKyAgICB2YXIgdmVydGV4U2hhZGVyID0gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCBzbWFza1ZlcnRleFNoYWRlckNvZGUpOworICAgIHZhciBmcmFnbWVudFNoYWRlciA9IGNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBzbWFza0ZyYWdtZW50U2hhZGVyQ29kZSk7CisgICAgdmFyIHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKGdsLCBbdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcl0pOworICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgdmFyIGNhY2hlID0ge307CisgICAgY2FjaGUuZ2wgPSBnbDsKKyAgICBjYWNoZS5jYW52YXMgPSBjYW52YXM7CisgICAgY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3Jlc29sdXRpb24iKTsKKyAgICBjYWNoZS5wb3NpdGlvbkxvY2F0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgImFfcG9zaXRpb24iKTsKKyAgICBjYWNoZS5iYWNrZHJvcExvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tkcm9wIik7CisgICAgY2FjaGUuc3VidHlwZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3N1YnR5cGUiKTsKKyAgICB2YXIgdGV4Q29vcmRMb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX3RleENvb3JkIik7CisgICAgdmFyIHRleExheWVyTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW1hZ2UiKTsKKyAgICB2YXIgdGV4TWFza0xvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X21hc2siKTsKKyAgICB2YXIgdGV4Q29vcmRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTsKKyAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGV4Q29vcmRCdWZmZXIpOworICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDEuMCwgMS4wLCAwLjAsIDEuMCwgMS4wXSksIGdsLlNUQVRJQ19EUkFXKTsKKyAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZExvY2F0aW9uKTsKKyAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7CisgICAgZ2wudW5pZm9ybTFpKHRleExheWVyTG9jYXRpb24sIDApOworICAgIGdsLnVuaWZvcm0xaSh0ZXhNYXNrTG9jYXRpb24sIDEpOworICAgIHNtYXNrQ2FjaGUgPSBjYWNoZTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbXBvc2VTTWFzayhsYXllciwgbWFzaywgcHJvcGVydGllcykgeworICAgIHZhciB3aWR0aCA9IGxheWVyLndpZHRoLAorICAgICAgICBoZWlnaHQgPSBsYXllci5oZWlnaHQ7CisKKyAgICBpZiAoIXNtYXNrQ2FjaGUpIHsKKyAgICAgIGluaXRTbWFza0dMKCk7CisgICAgfQorCisgICAgdmFyIGNhY2hlID0gc21hc2tDYWNoZSwKKyAgICAgICAgY2FudmFzID0gY2FjaGUuY2FudmFzLAorICAgICAgICBnbCA9IGNhY2hlLmdsOworICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoOworICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTsKKyAgICBnbC51bmlmb3JtMmYoY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGlmIChwcm9wZXJ0aWVzLmJhY2tkcm9wKSB7CisgICAgICBnbC51bmlmb3JtNGYoY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uLCBwcm9wZXJ0aWVzLmJhY2tkcm9wWzBdLCBwcm9wZXJ0aWVzLmJhY2tkcm9wWzFdLCBwcm9wZXJ0aWVzLmJhY2tkcm9wWzJdLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2wudW5pZm9ybTRmKGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiwgMCwgMCwgMCwgMCk7CisgICAgfQorCisgICAgZ2wudW5pZm9ybTFpKGNhY2hlLnN1YnR5cGVMb2NhdGlvbiwgcHJvcGVydGllcy5zdWJ0eXBlID09PSAiTHVtaW5vc2l0eSIgPyAxIDogMCk7CisgICAgdmFyIHRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBsYXllciwgZ2wuVEVYVFVSRTApOworICAgIHZhciBtYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIG1hc2ssIGdsLlRFWFRVUkUxKTsKKyAgICB2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7CisgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIHdpZHRoLCAwLCAwLCBoZWlnaHQsIDAsIGhlaWdodCwgd2lkdGgsIDAsIHdpZHRoLCBoZWlnaHRdKSwgZ2wuU1RBVElDX0RSQVcpOworICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNhY2hlLnBvc2l0aW9uTG9jYXRpb24pOworICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY2FjaGUucG9zaXRpb25Mb2NhdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTsKKyAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOworICAgIGdsLmVuYWJsZShnbC5CTEVORCk7CisgICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRVMsIDAsIDYpOworICAgIGdsLmZsdXNoKCk7CisgICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTsKKyAgICBnbC5kZWxldGVUZXh0dXJlKG1hc2tUZXh0dXJlKTsKKyAgICBnbC5kZWxldGVCdWZmZXIoYnVmZmVyKTsKKyAgICByZXR1cm4gY2FudmFzOworICB9CisKKyAgdmFyIGZpZ3VyZXNWZXJ0ZXhTaGFkZXJDb2RlID0gIlwKKyAgYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGF0dHJpYnV0ZSB2ZWMzIGFfY29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuaWZvcm0gdmVjMiB1X3NjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlmb3JtIHZlYzIgdV9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZhcnlpbmcgdmVjNCB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjMiBwb3NpdGlvbiA9IChhX3Bvc2l0aW9uICsgdV9vZmZzZXQpICogdV9zY2FsZTsgICAgICAgICAgXAorICAgIHZlYzIgY2xpcFNwYWNlID0gKHBvc2l0aW9uIC8gdV9yZXNvbHV0aW9uKSAqIDIuMCAtIDEuMDsgICAgIFwKKyAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoY2xpcFNwYWNlICogdmVjMigxLCAtMSksIDAsIDEpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZfY29sb3IgPSB2ZWM0KGFfY29sb3IgLyAyNTUuMCwgMS4wKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICB2YXIgZmlndXJlc0ZyYWdtZW50U2hhZGVyQ29kZSA9ICJcCisgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdmFyeWluZyB2ZWM0IHZfY29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnbF9GcmFnQ29sb3IgPSB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgdmFyIGZpZ3VyZXNDYWNoZSA9IG51bGw7CisKKyAgZnVuY3Rpb24gaW5pdEZpZ3VyZXNHTCgpIHsKKyAgICB2YXIgY2FudmFzLCBnbDsKKyAgICBnZW5lcmF0ZUdMKCk7CisgICAgY2FudmFzID0gY3VycmVudENhbnZhczsKKyAgICBjdXJyZW50Q2FudmFzID0gbnVsbDsKKyAgICBnbCA9IGN1cnJlbnRHTDsKKyAgICBjdXJyZW50R0wgPSBudWxsOworICAgIHZhciB2ZXJ0ZXhTaGFkZXIgPSBjcmVhdGVWZXJ0ZXhTaGFkZXIoZ2wsIGZpZ3VyZXNWZXJ0ZXhTaGFkZXJDb2RlKTsKKyAgICB2YXIgZnJhZ21lbnRTaGFkZXIgPSBjcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgZmlndXJlc0ZyYWdtZW50U2hhZGVyQ29kZSk7CisgICAgdmFyIHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKGdsLCBbdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcl0pOworICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgdmFyIGNhY2hlID0ge307CisgICAgY2FjaGUuZ2wgPSBnbDsKKyAgICBjYWNoZS5jYW52YXMgPSBjYW52YXM7CisgICAgY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3Jlc29sdXRpb24iKTsKKyAgICBjYWNoZS5zY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3NjYWxlIik7CisgICAgY2FjaGUub2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CisgICAgY2FjaGUucG9zaXRpb25Mb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX3Bvc2l0aW9uIik7CisgICAgY2FjaGUuY29sb3JMb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX2NvbG9yIik7CisgICAgZmlndXJlc0NhY2hlID0gY2FjaGU7CisgIH0KKworICBmdW5jdGlvbiBkcmF3RmlndXJlcyh3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kQ29sb3IsIGZpZ3VyZXMsIGNvbnRleHQpIHsKKyAgICBpZiAoIWZpZ3VyZXNDYWNoZSkgeworICAgICAgaW5pdEZpZ3VyZXNHTCgpOworICAgIH0KKworICAgIHZhciBjYWNoZSA9IGZpZ3VyZXNDYWNoZSwKKyAgICAgICAgY2FudmFzID0gY2FjaGUuY2FudmFzLAorICAgICAgICBnbCA9IGNhY2hlLmdsOworICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoOworICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTsKKyAgICBnbC51bmlmb3JtMmYoY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB2YXIgY291bnQgPSAwOworICAgIHZhciBpLCBpaSwgcm93czsKKworICAgIGZvciAoaSA9IDAsIGlpID0gZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBzd2l0Y2ggKGZpZ3VyZXNbaV0udHlwZSkgeworICAgICAgICBjYXNlICJsYXR0aWNlIjoKKyAgICAgICAgICByb3dzID0gZmlndXJlc1tpXS5jb29yZHMubGVuZ3RoIC8gZmlndXJlc1tpXS52ZXJ0aWNlc1BlclJvdyB8IDA7CisgICAgICAgICAgY291bnQgKz0gKHJvd3MgLSAxKSAqIChmaWd1cmVzW2ldLnZlcnRpY2VzUGVyUm93IC0gMSkgKiA2OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRyaWFuZ2xlcyI6CisgICAgICAgICAgY291bnQgKz0gZmlndXJlc1tpXS5jb29yZHMubGVuZ3RoOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHZhciBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7CisgICAgdmFyIGNvbG9ycyA9IG5ldyBVaW50OEFycmF5KGNvdW50ICogMyk7CisgICAgdmFyIGNvb3Jkc01hcCA9IGNvbnRleHQuY29vcmRzLAorICAgICAgICBjb2xvcnNNYXAgPSBjb250ZXh0LmNvbG9yczsKKyAgICB2YXIgcEluZGV4ID0gMCwKKyAgICAgICAgY0luZGV4ID0gMDsKKworICAgIGZvciAoaSA9IDAsIGlpID0gZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgZmlndXJlID0gZmlndXJlc1tpXSwKKyAgICAgICAgICBwcyA9IGZpZ3VyZS5jb29yZHMsCisgICAgICAgICAgY3MgPSBmaWd1cmUuY29sb3JzOworCisgICAgICBzd2l0Y2ggKGZpZ3VyZS50eXBlKSB7CisgICAgICAgIGNhc2UgImxhdHRpY2UiOgorICAgICAgICAgIHZhciBjb2xzID0gZmlndXJlLnZlcnRpY2VzUGVyUm93OworICAgICAgICAgIHJvd3MgPSBwcy5sZW5ndGggLyBjb2xzIHwgMDsKKworICAgICAgICAgIGZvciAodmFyIHJvdyA9IDE7IHJvdyA8IHJvd3M7IHJvdysrKSB7CisgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gcm93ICogY29scyArIDE7CisKKyAgICAgICAgICAgIGZvciAodmFyIGNvbCA9IDE7IGNvbCA8IGNvbHM7IGNvbCsrLCBvZmZzZXQrKykgeworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4XSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzIC0gMV1dOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMV0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gY29scyAtIDFdICsgMV07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAyXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzXV07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAzXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzXSArIDFdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgNF0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gMV1dOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgNV0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gMV0gKyAxXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleF0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29scyAtIDFdXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDFdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIGNvbHMgLSAxXSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMl0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29scyAtIDFdICsgMl07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAzXSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzXV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA0XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzXSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgNV0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29sc10gKyAyXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDZdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIDFdXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDddID0gY29sb3JzTWFwW2NzW29mZnNldCAtIDFdICsgMV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA4XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSAxXSArIDJdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgNl0gPSBjb29yZHNbcEluZGV4ICsgMl07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyA3XSA9IGNvb3Jkc1twSW5kZXggKyAzXTsKKyAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDhdID0gY29vcmRzW3BJbmRleCArIDRdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgOV0gPSBjb29yZHNbcEluZGV4ICsgNV07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAxMF0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0XV07CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAxMV0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0XSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgOV0gPSBjb2xvcnNbY0luZGV4ICsgM107CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxMF0gPSBjb2xvcnNbY0luZGV4ICsgNF07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxMV0gPSBjb2xvcnNbY0luZGV4ICsgNV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxMl0gPSBjb2xvcnNbY0luZGV4ICsgNl07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxM10gPSBjb2xvcnNbY0luZGV4ICsgN107CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxNF0gPSBjb2xvcnNbY0luZGV4ICsgOF07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxNV0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0XV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxNl0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0XSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTddID0gY29sb3JzTWFwW2NzW29mZnNldF0gKyAyXTsKKyAgICAgICAgICAgICAgcEluZGV4ICs9IDEyOworICAgICAgICAgICAgICBjSW5kZXggKz0gMTg7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAidHJpYW5nbGVzIjoKKyAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBwcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICBjb29yZHNbcEluZGV4XSA9IGNvb3Jkc01hcFtwc1tqXV07CisgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMV0gPSBjb29yZHNNYXBbcHNbal0gKyAxXTsKKyAgICAgICAgICAgIGNvbG9yc1tjSW5kZXhdID0gY29sb3JzTWFwW2NzW2pdXTsKKyAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxXSA9IGNvbG9yc01hcFtjc1tqXSArIDFdOworICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDJdID0gY29sb3JzTWFwW2NzW2pdICsgMl07CisgICAgICAgICAgICBwSW5kZXggKz0gMjsKKyAgICAgICAgICAgIGNJbmRleCArPSAzOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHsKKyAgICAgIGdsLmNsZWFyQ29sb3IoYmFja2dyb3VuZENvbG9yWzBdIC8gMjU1LCBiYWNrZ3JvdW5kQ29sb3JbMV0gLyAyNTUsIGJhY2tncm91bmRDb2xvclsyXSAvIDI1NSwgMS4wKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTsKKyAgICB2YXIgY29vcmRzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGNvb3Jkc0J1ZmZlcik7CisgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGNvb3JkcywgZ2wuU1RBVElDX0RSQVcpOworICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNhY2hlLnBvc2l0aW9uTG9jYXRpb24pOworICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY2FjaGUucG9zaXRpb25Mb2NhdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTsKKyAgICB2YXIgY29sb3JzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGNvbG9yc0J1ZmZlcik7CisgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGNvbG9ycywgZ2wuU1RBVElDX0RSQVcpOworICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNhY2hlLmNvbG9yTG9jYXRpb24pOworICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY2FjaGUuY29sb3JMb2NhdGlvbiwgMywgZ2wuVU5TSUdORURfQllURSwgZmFsc2UsIDAsIDApOworICAgIGdsLnVuaWZvcm0yZihjYWNoZS5zY2FsZUxvY2F0aW9uLCBjb250ZXh0LnNjYWxlWCwgY29udGV4dC5zY2FsZVkpOworICAgIGdsLnVuaWZvcm0yZihjYWNoZS5vZmZzZXRMb2NhdGlvbiwgY29udGV4dC5vZmZzZXRYLCBjb250ZXh0Lm9mZnNldFkpOworICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVTLCAwLCBjb3VudCk7CisgICAgZ2wuZmx1c2goKTsKKyAgICBnbC5kZWxldGVCdWZmZXIoY29vcmRzQnVmZmVyKTsKKyAgICBnbC5kZWxldGVCdWZmZXIoY29sb3JzQnVmZmVyKTsKKyAgICByZXR1cm4gY2FudmFzOworICB9CisKKyAgcmV0dXJuIHsKKyAgICB0cnlJbml0R0w6IGZ1bmN0aW9uIHRyeUluaXRHTCgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGdlbmVyYXRlR0woKTsKKyAgICAgICAgcmV0dXJuICEhY3VycmVudEdMOworICAgICAgfSBjYXRjaCAoZXgpIHt9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorICAgIGNvbXBvc2VTTWFzazogY29tcG9zZVNNYXNrLAorICAgIGRyYXdGaWd1cmVzOiBkcmF3RmlndXJlcywKKyAgICBjbGVhbnVwOiBmdW5jdGlvbiBjbGVhbnVwKCkgeworICAgICAgaWYgKHNtYXNrQ2FjaGUgJiYgc21hc2tDYWNoZS5jYW52YXMpIHsKKyAgICAgICAgc21hc2tDYWNoZS5jYW52YXMud2lkdGggPSAwOworICAgICAgICBzbWFza0NhY2hlLmNhbnZhcy5oZWlnaHQgPSAwOworICAgICAgfQorCisgICAgICBpZiAoZmlndXJlc0NhY2hlICYmIGZpZ3VyZXNDYWNoZS5jYW52YXMpIHsKKyAgICAgICAgZmlndXJlc0NhY2hlLmNhbnZhcy53aWR0aCA9IDA7CisgICAgICAgIGZpZ3VyZXNDYWNoZS5jYW52YXMuaGVpZ2h0ID0gMDsKKyAgICAgIH0KKworICAgICAgc21hc2tDYWNoZSA9IG51bGw7CisgICAgICBmaWd1cmVzQ2FjaGUgPSBudWxsOworICAgIH0KKyAgfTsKK30oKTsKKworLyoqKi8gfSksCisvKiAyMTYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Bbm5vdGF0aW9uTGF5ZXIgPSB2b2lkIDA7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfYW5ub3RhdGlvbl9zdG9yYWdlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDUpOworCitmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5nZXQpIHsgX2dldCA9IFJlZmxlY3QuZ2V0OyB9IGVsc2UgeyBfZ2V0ID0gZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgYmFzZSA9IF9zdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpOyBpZiAoIWJhc2UpIHJldHVybjsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTsgaWYgKGRlc2MuZ2V0KSB7IHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTsgfSByZXR1cm4gZGVzYy52YWx1ZTsgfTsgfSByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpOyB9CisKK2Z1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHsgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrOyB9IHJldHVybiBvYmplY3Q7IH0KKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBBbm5vdGF0aW9uRWxlbWVudEZhY3RvcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBBbm5vdGF0aW9uRWxlbWVudEZhY3RvcnkoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFubm90YXRpb25FbGVtZW50RmFjdG9yeSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5LCBudWxsLCBbeworICAgIGtleTogImNyZWF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZShwYXJhbWV0ZXJzKSB7CisgICAgICB2YXIgc3VidHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5hbm5vdGF0aW9uVHlwZTsKKworICAgICAgc3dpdGNoIChzdWJ0eXBlKSB7CisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSzoKKyAgICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlRFWFQ6CisgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQ6CisgICAgICAgICAgdmFyIGZpZWxkVHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5maWVsZFR5cGU7CisKKyAgICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgY2FzZSAiVHgiOgorICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICAgICAgY2FzZSAiQnRuIjoKKyAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGF0YS5yYWRpb0J1dHRvbikgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLmRhdGEuY2hlY2tCb3gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICByZXR1cm4gbmV3IFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICAgICAgY2FzZSAiQ2giOgorICAgICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT1BVUDoKKyAgICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDoKKyAgICAgICAgICByZXR1cm4gbmV3IEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5FOgorICAgICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuU1FVQVJFOgorICAgICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5DSVJDTEU6CisgICAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlBPTFlMSU5FOgorICAgICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkNBUkVUOgorICAgICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLklOSzoKKyAgICAgICAgICByZXR1cm4gbmV3IElua0Fubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9MWUdPTjoKKyAgICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVDoKKyAgICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOgorICAgICAgICAgIHJldHVybiBuZXcgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TUVVJR0dMWToKKyAgICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ6CisgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlNUQU1QOgorICAgICAgICAgIHJldHVybiBuZXcgU3RhbXBBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UOgorICAgICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisgICAgICB9CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEFubm90YXRpb25FbGVtZW50RmFjdG9yeTsKK30oKTsKKwordmFyIEFubm90YXRpb25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycykgeworICAgIHZhciBpc1JlbmRlcmFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOworICAgIHZhciBpZ25vcmVCb3JkZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFubm90YXRpb25FbGVtZW50KTsKKworICAgIHRoaXMuaXNSZW5kZXJhYmxlID0gaXNSZW5kZXJhYmxlOworICAgIHRoaXMuZGF0YSA9IHBhcmFtZXRlcnMuZGF0YTsKKyAgICB0aGlzLmxheWVyID0gcGFyYW1ldGVycy5sYXllcjsKKyAgICB0aGlzLnBhZ2UgPSBwYXJhbWV0ZXJzLnBhZ2U7CisgICAgdGhpcy52aWV3cG9ydCA9IHBhcmFtZXRlcnMudmlld3BvcnQ7CisgICAgdGhpcy5saW5rU2VydmljZSA9IHBhcmFtZXRlcnMubGlua1NlcnZpY2U7CisgICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBwYXJhbWV0ZXJzLmRvd25sb2FkTWFuYWdlcjsKKyAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IHBhcmFtZXRlcnMuaW1hZ2VSZXNvdXJjZXNQYXRoOworICAgIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3JtczsKKyAgICB0aGlzLnN2Z0ZhY3RvcnkgPSBwYXJhbWV0ZXJzLnN2Z0ZhY3Rvcnk7CisgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSA9IHBhcmFtZXRlcnMuYW5ub3RhdGlvblN0b3JhZ2U7CisKKyAgICBpZiAoaXNSZW5kZXJhYmxlKSB7CisgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIpOworICAgIH0KKyAgfQorCisgIF9jcmVhdGVDbGFzcyhBbm5vdGF0aW9uRWxlbWVudCwgW3sKKyAgICBrZXk6ICJfY3JlYXRlQ29udGFpbmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZUNvbnRhaW5lcigpIHsKKyAgICAgIHZhciBpZ25vcmVCb3JkZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlOworICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEsCisgICAgICAgICAgcGFnZSA9IHRoaXMucGFnZSwKKyAgICAgICAgICB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQ7CisgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIpOworICAgICAgdmFyIHdpZHRoID0gZGF0YS5yZWN0WzJdIC0gZGF0YS5yZWN0WzBdOworICAgICAgdmFyIGhlaWdodCA9IGRhdGEucmVjdFszXSAtIGRhdGEucmVjdFsxXTsKKyAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImRhdGEtYW5ub3RhdGlvbi1pZCIsIGRhdGEuaWQpOworCisgICAgICB2YXIgcmVjdCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChbZGF0YS5yZWN0WzBdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbMV0gKyBwYWdlLnZpZXdbMV0sIGRhdGEucmVjdFsyXSwgcGFnZS52aWV3WzNdIC0gZGF0YS5yZWN0WzNdICsgcGFnZS52aWV3WzFdXSk7CisKKyAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSAibWF0cml4KCIuY29uY2F0KHZpZXdwb3J0LnRyYW5zZm9ybS5qb2luKCIsIiksICIpIik7CisgICAgICBjb250YWluZXIuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gIi0iLmNvbmNhdChyZWN0WzBdLCAicHggLSIpLmNvbmNhdChyZWN0WzFdLCAicHgiKTsKKworICAgICAgaWYgKCFpZ25vcmVCb3JkZXIgJiYgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCA+IDApIHsKKyAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlcldpZHRoID0gIiIuY29uY2F0KGRhdGEuYm9yZGVyU3R5bGUud2lkdGgsICJweCIpOworCisgICAgICAgIGlmIChkYXRhLmJvcmRlclN0eWxlLnN0eWxlICE9PSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORSkgeworICAgICAgICAgIHdpZHRoID0gd2lkdGggLSAyICogZGF0YS5ib3JkZXJTdHlsZS53aWR0aDsKKyAgICAgICAgICBoZWlnaHQgPSBoZWlnaHQgLSAyICogZGF0YS5ib3JkZXJTdHlsZS53aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBob3Jpem9udGFsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS5ob3Jpem9udGFsQ29ybmVyUmFkaXVzOworICAgICAgICB2YXIgdmVydGljYWxSYWRpdXMgPSBkYXRhLmJvcmRlclN0eWxlLnZlcnRpY2FsQ29ybmVyUmFkaXVzOworCisgICAgICAgIGlmIChob3Jpem9udGFsUmFkaXVzID4gMCB8fCB2ZXJ0aWNhbFJhZGl1cyA+IDApIHsKKyAgICAgICAgICB2YXIgcmFkaXVzID0gIiIuY29uY2F0KGhvcml6b250YWxSYWRpdXMsICJweCAvICIpLmNvbmNhdCh2ZXJ0aWNhbFJhZGl1cywgInB4Iik7CisgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclJhZGl1cyA9IHJhZGl1czsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZGF0YS5ib3JkZXJTdHlsZS5zdHlsZSkgeworICAgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDoKKyAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJTdHlsZSA9ICJzb2xpZCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ6CisgICAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyU3R5bGUgPSAiZGFzaGVkIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ6CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBiZXZlbGVkIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDoKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGluc2V0Iik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU6CisgICAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSAic29saWQiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGF0YS5jb2xvcikgeworICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJDb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihkYXRhLmNvbG9yWzBdIHwgMCwgZGF0YS5jb2xvclsxXSB8IDAsIGRhdGEuY29sb3JbMl0gfCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyV2lkdGggPSAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gIiIuY29uY2F0KHJlY3RbMF0sICJweCIpOworICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9ICIiLmNvbmNhdChyZWN0WzFdLCAicHgiKTsKKyAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICIiLmNvbmNhdCh3aWR0aCwgInB4Iik7CisgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gIiIuY29uY2F0KGhlaWdodCwgInB4Iik7CisgICAgICByZXR1cm4gY29udGFpbmVyOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9jcmVhdGVQb3B1cCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9jcmVhdGVQb3B1cChjb250YWluZXIsIHRyaWdnZXIsIGRhdGEpIHsKKyAgICAgIGlmICghdHJpZ2dlcikgeworICAgICAgICB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgIHRyaWdnZXIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyLnN0eWxlLmhlaWdodDsKKyAgICAgICAgdHJpZ2dlci5zdHlsZS53aWR0aCA9IGNvbnRhaW5lci5zdHlsZS53aWR0aDsKKyAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRyaWdnZXIpOworICAgICAgfQorCisgICAgICB2YXIgcG9wdXBFbGVtZW50ID0gbmV3IFBvcHVwRWxlbWVudCh7CisgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLAorICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLAorICAgICAgICBjb2xvcjogZGF0YS5jb2xvciwKKyAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsCisgICAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IGRhdGEubW9kaWZpY2F0aW9uRGF0ZSwKKyAgICAgICAgY29udGVudHM6IGRhdGEuY29udGVudHMsCisgICAgICAgIGhpZGVXcmFwcGVyOiB0cnVlCisgICAgICB9KTsKKyAgICAgIHZhciBwb3B1cCA9IHBvcHVwRWxlbWVudC5yZW5kZXIoKTsKKyAgICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBjb250YWluZXIuc3R5bGUud2lkdGg7CisgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocG9wdXApOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlbmRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWQiKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQW5ub3RhdGlvbkVsZW1lbnQ7Cit9KCk7CisKK3ZhciBMaW5rQW5ub3RhdGlvbkVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Bbm5vdGF0aW9uRWxlbWVudCkgeworICBfaW5oZXJpdHMoTGlua0Fubm90YXRpb25FbGVtZW50LCBfQW5ub3RhdGlvbkVsZW1lbnQpOworCisgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTGlua0Fubm90YXRpb25FbGVtZW50KTsKKworICBmdW5jdGlvbiBMaW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycykgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5rQW5ub3RhdGlvbkVsZW1lbnQpOworCisgICAgdmFyIGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS51cmwgfHwgcGFyYW1ldGVycy5kYXRhLmRlc3QgfHwgcGFyYW1ldGVycy5kYXRhLmFjdGlvbik7CisgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoTGlua0Fubm90YXRpb25FbGVtZW50LCBbeworICAgIGtleTogInJlbmRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJsaW5rQW5ub3RhdGlvbiI7CisgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSwKKyAgICAgICAgICBsaW5rU2VydmljZSA9IHRoaXMubGlua1NlcnZpY2U7CisgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKworICAgICAgaWYgKGRhdGEudXJsKSB7CisgICAgICAgICgwLCBfZGlzcGxheV91dGlscy5hZGRMaW5rQXR0cmlidXRlcykobGluaywgeworICAgICAgICAgIHVybDogZGF0YS51cmwsCisgICAgICAgICAgdGFyZ2V0OiBkYXRhLm5ld1dpbmRvdyA/IF9kaXNwbGF5X3V0aWxzLkxpbmtUYXJnZXQuQkxBTksgOiBsaW5rU2VydmljZS5leHRlcm5hbExpbmtUYXJnZXQsCisgICAgICAgICAgcmVsOiBsaW5rU2VydmljZS5leHRlcm5hbExpbmtSZWwsCisgICAgICAgICAgZW5hYmxlZDogbGlua1NlcnZpY2UuZXh0ZXJuYWxMaW5rRW5hYmxlZAorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5hY3Rpb24pIHsKKyAgICAgICAgdGhpcy5fYmluZE5hbWVkQWN0aW9uKGxpbmssIGRhdGEuYWN0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX2JpbmRMaW5rKGxpbmssIGRhdGEuZGVzdCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmspOworICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9iaW5kTGluayIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9iaW5kTGluayhsaW5rLCBkZXN0aW5hdGlvbikgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXREZXN0aW5hdGlvbkhhc2goZGVzdGluYXRpb24pOworCisgICAgICBsaW5rLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChkZXN0aW5hdGlvbikgeworICAgICAgICAgIF90aGlzLmxpbmtTZXJ2aWNlLm5hdmlnYXRlVG8oZGVzdGluYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfTsKKworICAgICAgaWYgKGRlc3RpbmF0aW9uKSB7CisgICAgICAgIGxpbmsuY2xhc3NOYW1lID0gImludGVybmFsTGluayI7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2JpbmROYW1lZEFjdGlvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9iaW5kTmFtZWRBY3Rpb24obGluaywgYWN0aW9uKSB7CisgICAgICB2YXIgX3RoaXMyID0gdGhpczsKKworICAgICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoIiIpOworCisgICAgICBsaW5rLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIF90aGlzMi5saW5rU2VydmljZS5leGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9OworCisgICAgICBsaW5rLmNsYXNzTmFtZSA9ICJpbnRlcm5hbExpbmsiOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBMaW5rQW5ub3RhdGlvbkVsZW1lbnQ7Cit9KEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIFRleHRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Fubm90YXRpb25FbGVtZW50MikgeworICBfaW5oZXJpdHMoVGV4dEFubm90YXRpb25FbGVtZW50LCBfQW5ub3RhdGlvbkVsZW1lbnQyKTsKKworICB2YXIgX3N1cGVyMiA9IF9jcmVhdGVTdXBlcihUZXh0QW5ub3RhdGlvbkVsZW1lbnQpOworCisgIGZ1bmN0aW9uIFRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgICB2YXIgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHJldHVybiBfc3VwZXIyLmNhbGwodGhpcywgcGFyYW1ldGVycywgaXNSZW5kZXJhYmxlKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhUZXh0QW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gInRleHRBbm5vdGF0aW9uIjsKKyAgICAgIHZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOworICAgICAgaW1hZ2Uuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0OworICAgICAgaW1hZ2Uuc3R5bGUud2lkdGggPSB0aGlzLmNvbnRhaW5lci5zdHlsZS53aWR0aDsKKyAgICAgIGltYWdlLnNyYyA9IHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoICsgImFubm90YXRpb24tIiArIHRoaXMuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgKyAiLnN2ZyI7CisgICAgICBpbWFnZS5hbHQgPSAiW3t7dHlwZX19IEFubm90YXRpb25dIjsKKyAgICAgIGltYWdlLmRhdGFzZXQubDEwbklkID0gInRleHRfYW5ub3RhdGlvbl90eXBlIjsKKyAgICAgIGltYWdlLmRhdGFzZXQubDEwbkFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7CisgICAgICAgIHR5cGU6IHRoaXMuZGF0YS5uYW1lCisgICAgICB9KTsKKworICAgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIGltYWdlLCB0aGlzLmRhdGEpOworICAgICAgfQorCisgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChpbWFnZSk7CisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFRleHRBbm5vdGF0aW9uRWxlbWVudDsKK30oQW5ub3RhdGlvbkVsZW1lbnQpOworCit2YXIgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Bbm5vdGF0aW9uRWxlbWVudDMpIHsKKyAgX2luaGVyaXRzKFdpZGdldEFubm90YXRpb25FbGVtZW50LCBfQW5ub3RhdGlvbkVsZW1lbnQzKTsKKworICB2YXIgX3N1cGVyMyA9IF9jcmVhdGVTdXBlcihXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdpZGdldEFubm90YXRpb25FbGVtZW50KTsKKworICAgIHJldHVybiBfc3VwZXIzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudDsKK30oQW5ub3RhdGlvbkVsZW1lbnQpOworCit2YXIgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfV2lkZ2V0QW5ub3RhdGlvbkVsZW0pIHsKKyAgX2luaGVyaXRzKFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCwgX1dpZGdldEFubm90YXRpb25FbGVtKTsKKworICB2YXIgX3N1cGVyNCA9IF9jcmVhdGVTdXBlcihUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpOworCisgIGZ1bmN0aW9uIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgICB2YXIgaXNSZW5kZXJhYmxlID0gcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIHx8ICFwYXJhbWV0ZXJzLmRhdGEuaGFzQXBwZWFyYW5jZSAmJiAhIXBhcmFtZXRlcnMuZGF0YS5maWVsZFZhbHVlOworICAgIHJldHVybiBfc3VwZXI0LmNhbGwodGhpcywgcGFyYW1ldGVycywgaXNSZW5kZXJhYmxlKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgdmFyIFRFWFRfQUxJR05NRU5UID0gWyJsZWZ0IiwgImNlbnRlciIsICJyaWdodCJdOworICAgICAgdmFyIHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlOworICAgICAgdmFyIGlkID0gdGhpcy5kYXRhLmlkOworICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gInRleHRXaWRnZXRBbm5vdGF0aW9uIjsKKyAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKKworICAgICAgaWYgKHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcykgeworICAgICAgICB2YXIgdGV4dENvbnRlbnQgPSBzdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoaWQsIHRoaXMuZGF0YS5maWVsZFZhbHVlKTsKKworICAgICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkgeworICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOworICAgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgICAgICAgICBlbGVtZW50LnR5cGUgPSAidGV4dCI7CisgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgdGV4dENvbnRlbnQpOworICAgICAgICB9CisKKyAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIGV2ZW50LnRhcmdldC52YWx1ZSk7CisgICAgICAgIH0pOworICAgICAgICBlbGVtZW50LmRpc2FibGVkID0gdGhpcy5kYXRhLnJlYWRPbmx5OworICAgICAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lOworCisgICAgICAgIGlmICh0aGlzLmRhdGEubWF4TGVuICE9PSBudWxsKSB7CisgICAgICAgICAgZWxlbWVudC5tYXhMZW5ndGggPSB0aGlzLmRhdGEubWF4TGVuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuZGF0YS5jb21iKSB7CisgICAgICAgICAgdmFyIGZpZWxkV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdOworICAgICAgICAgIHZhciBjb21iV2lkdGggPSBmaWVsZFdpZHRoIC8gdGhpcy5kYXRhLm1heExlbjsKKyAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoImNvbWIiKTsKKyAgICAgICAgICBlbGVtZW50LnN0eWxlLmxldHRlclNwYWNpbmcgPSAiY2FsYygiLmNvbmNhdChjb21iV2lkdGgsICJweCAtIDFjaCkiKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7CisgICAgICAgIGVsZW1lbnQuc3R5bGUudmVydGljYWxBbGlnbiA9ICJtaWRkbGUiOworICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAidGFibGUtY2VsbCI7CisgICAgICAgIHZhciBmb250ID0gbnVsbDsKKworICAgICAgICBpZiAodGhpcy5kYXRhLmZvbnRSZWZOYW1lICYmIHRoaXMucGFnZS5jb21tb25PYmpzLmhhcyh0aGlzLmRhdGEuZm9udFJlZk5hbWUpKSB7CisgICAgICAgICAgZm9udCA9IHRoaXMucGFnZS5jb21tb25PYmpzLmdldCh0aGlzLmRhdGEuZm9udFJlZk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fc2V0VGV4dFN0eWxlKGVsZW1lbnQsIGZvbnQpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgIT09IG51bGwpIHsKKyAgICAgICAgZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSBURVhUX0FMSUdOTUVOVFt0aGlzLmRhdGEudGV4dEFsaWdubWVudF07CisgICAgICB9CisKKyAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpOworICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9zZXRUZXh0U3R5bGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfc2V0VGV4dFN0eWxlKGVsZW1lbnQsIGZvbnQpIHsKKyAgICAgIHZhciBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7CisgICAgICBzdHlsZS5mb250U2l6ZSA9ICIiLmNvbmNhdCh0aGlzLmRhdGEuZm9udFNpemUsICJweCIpOworICAgICAgc3R5bGUuZGlyZWN0aW9uID0gdGhpcy5kYXRhLmZvbnREaXJlY3Rpb24gPCAwID8gInJ0bCIgOiAibHRyIjsKKworICAgICAgaWYgKCFmb250KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGJvbGQgPSAibm9ybWFsIjsKKworICAgICAgaWYgKGZvbnQuYmxhY2spIHsKKyAgICAgICAgYm9sZCA9ICI5MDAiOworICAgICAgfSBlbHNlIGlmIChmb250LmJvbGQpIHsKKyAgICAgICAgYm9sZCA9ICJib2xkIjsKKyAgICAgIH0KKworICAgICAgc3R5bGUuZm9udFdlaWdodCA9IGJvbGQ7CisgICAgICBzdHlsZS5mb250U3R5bGUgPSBmb250Lml0YWxpYyA/ICJpdGFsaWMiIDogIm5vcm1hbCI7CisgICAgICB2YXIgZm9udEZhbWlseSA9IGZvbnQubG9hZGVkTmFtZSA/ICJcIiIuY29uY2F0KGZvbnQubG9hZGVkTmFtZSwgIlwiLCAiKSA6ICIiOworICAgICAgdmFyIGZhbGxiYWNrTmFtZSA9IGZvbnQuZmFsbGJhY2tOYW1lIHx8ICJIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiOworICAgICAgc3R5bGUuZm9udEZhbWlseSA9IGZvbnRGYW1pbHkgKyBmYWxsYmFja05hbWU7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudDsKK30oV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpOworCit2YXIgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1dpZGdldEFubm90YXRpb25FbGVtMikgeworICBfaW5oZXJpdHMoQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCwgX1dpZGdldEFubm90YXRpb25FbGVtMik7CisKKyAgdmFyIF9zdXBlcjUgPSBfY3JlYXRlU3VwZXIoQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpOworCisgICAgcmV0dXJuIF9zdXBlcjUuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgdmFyIHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlOworICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICB2YXIgaWQgPSBkYXRhLmlkOworICAgICAgdmFyIHZhbHVlID0gc3RvcmFnZS5nZXRPckNyZWF0ZVZhbHVlKGlkLCBkYXRhLmZpZWxkVmFsdWUgJiYgZGF0YS5maWVsZFZhbHVlICE9PSAiT2ZmIik7CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBjaGVja0JveCI7CisgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAgICBlbGVtZW50LmRpc2FibGVkID0gZGF0YS5yZWFkT25seTsKKyAgICAgIGVsZW1lbnQudHlwZSA9ICJjaGVja2JveCI7CisgICAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lOworCisgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwgZXZlbnQudGFyZ2V0LmNoZWNrZWQpOworICAgICAgfSk7CisgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTsKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudDsKK30oV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpOworCit2YXIgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1dpZGdldEFubm90YXRpb25FbGVtMykgeworICBfaW5oZXJpdHMoUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCwgX1dpZGdldEFubm90YXRpb25FbGVtMyk7CisKKyAgdmFyIF9zdXBlcjYgPSBfY3JlYXRlU3VwZXIoUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpOworCisgICAgcmV0dXJuIF9zdXBlcjYuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImJ1dHRvbldpZGdldEFubm90YXRpb24gcmFkaW9CdXR0b24iOworICAgICAgdmFyIHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlOworICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICB2YXIgaWQgPSBkYXRhLmlkOworICAgICAgdmFyIHZhbHVlID0gc3RvcmFnZS5nZXRPckNyZWF0ZVZhbHVlKGlkLCBkYXRhLmZpZWxkVmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWUpOworICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOworICAgICAgZWxlbWVudC5kaXNhYmxlZCA9IGRhdGEucmVhZE9ubHk7CisgICAgICBlbGVtZW50LnR5cGUgPSAicmFkaW8iOworICAgICAgZWxlbWVudC5uYW1lID0gZGF0YS5maWVsZE5hbWU7CisKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIHRydWUpOworICAgICAgfQorCisgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICB2YXIgbmFtZSA9IGV2ZW50LnRhcmdldC5uYW1lOworCisgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKSksCisgICAgICAgICAgICBfc3RlcDsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICB2YXIgcmFkaW8gPSBfc3RlcC52YWx1ZTsKKworICAgICAgICAgICAgaWYgKHJhZGlvICE9PSBldmVudC50YXJnZXQpIHsKKyAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShyYWRpby5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgiZGF0YS1hbm5vdGF0aW9uLWlkIiksIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgX2l0ZXJhdG9yLmYoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIGV2ZW50LnRhcmdldC5jaGVja2VkKTsKKyAgICAgIH0pOworICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQ7Cit9KFdpZGdldEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0xpbmtBbm5vdGF0aW9uRWxlbWVuKSB7CisgIF9pbmhlcml0cyhQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQsIF9MaW5rQW5ub3RhdGlvbkVsZW1lbik7CisKKyAgdmFyIF9zdXBlcjcgPSBfY3JlYXRlU3VwZXIoUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KTsKKworICBmdW5jdGlvbiBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgICByZXR1cm4gX3N1cGVyNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCwgW3sKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB2YXIgY29udGFpbmVyID0gX2dldChfZ2V0UHJvdG90eXBlT2YoUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50LnByb3RvdHlwZSksICJyZW5kZXIiLCB0aGlzKS5jYWxsKHRoaXMpOworCisgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gImJ1dHRvbldpZGdldEFubm90YXRpb24gcHVzaEJ1dHRvbiI7CisgICAgICByZXR1cm4gY29udGFpbmVyOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQ7Cit9KExpbmtBbm5vdGF0aW9uRWxlbWVudCk7CisKK3ZhciBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1dpZGdldEFubm90YXRpb25FbGVtNCkgeworICBfaW5oZXJpdHMoQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQsIF9XaWRnZXRBbm5vdGF0aW9uRWxlbTQpOworCisgIHZhciBfc3VwZXI4ID0gX2NyZWF0ZVN1cGVyKENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50KTsKKworICBmdW5jdGlvbiBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50KTsKKworICAgIHJldHVybiBfc3VwZXI4LmNhbGwodGhpcywgcGFyYW1ldGVycywgcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCwgW3sKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAiY2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiI7CisgICAgICB2YXIgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7CisgICAgICB2YXIgaWQgPSB0aGlzLmRhdGEuaWQ7CisgICAgICBzdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoaWQsIHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCA+IDAgPyB0aGlzLmRhdGEuZmllbGRWYWx1ZVswXSA6IG51bGwpOworICAgICAgdmFyIHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKKyAgICAgIHNlbGVjdEVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7CisgICAgICBzZWxlY3RFbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lOworCisgICAgICBpZiAoIXRoaXMuZGF0YS5jb21ibykgeworICAgICAgICBzZWxlY3RFbGVtZW50LnNpemUgPSB0aGlzLmRhdGEub3B0aW9ucy5sZW5ndGg7CisKKyAgICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aVNlbGVjdCkgeworICAgICAgICAgIHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5kYXRhLm9wdGlvbnMpLAorICAgICAgICAgIF9zdGVwMjsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgb3B0aW9uID0gX3N0ZXAyLnZhbHVlOworICAgICAgICAgIHZhciBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CisgICAgICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbi5kaXNwbGF5VmFsdWU7CisgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IG9wdGlvbi5leHBvcnRWYWx1ZTsKKworICAgICAgICAgIGlmICh0aGlzLmRhdGEuZmllbGRWYWx1ZS5pbmNsdWRlcyhvcHRpb24uZXhwb3J0VmFsdWUpKSB7CisgICAgICAgICAgICBvcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCB0cnVlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3IyLmYoKTsKKyAgICAgIH0KKworICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICB2YXIgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zOworICAgICAgICB2YXIgdmFsdWUgPSBvcHRpb25zW29wdGlvbnMuc2VsZWN0ZWRJbmRleF0udmFsdWU7CisgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHZhbHVlKTsKKyAgICAgIH0pOworICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoc2VsZWN0RWxlbWVudCk7CisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50OworfShXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7CisKK3ZhciBQb3B1cEFubm90YXRpb25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5ub3RhdGlvbkVsZW1lbnQ0KSB7CisgIF9pbmhlcml0cyhQb3B1cEFubm90YXRpb25FbGVtZW50LCBfQW5ub3RhdGlvbkVsZW1lbnQ0KTsKKworICB2YXIgX3N1cGVyOSA9IF9jcmVhdGVTdXBlcihQb3B1cEFubm90YXRpb25FbGVtZW50KTsKKworICBmdW5jdGlvbiBQb3B1cEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgICB2YXIgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgcmV0dXJuIF9zdXBlcjkuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgdmFyIElHTk9SRV9UWVBFUyA9IFsiTGluZSIsICJTcXVhcmUiLCAiQ2lyY2xlIiwgIlBvbHlMaW5lIiwgIlBvbHlnb24iLCAiSW5rIl07CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAicG9wdXBBbm5vdGF0aW9uIjsKKworICAgICAgaWYgKElHTk9SRV9UWVBFUy5pbmNsdWRlcyh0aGlzLmRhdGEucGFyZW50VHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgICAgfQorCisgICAgICB2YXIgc2VsZWN0b3IgPSAiW2RhdGEtYW5ub3RhdGlvbi1pZD1cIiIuY29uY2F0KHRoaXMuZGF0YS5wYXJlbnRJZCwgIlwiXSIpOworICAgICAgdmFyIHBhcmVudEVsZW1lbnQgPSB0aGlzLmxheWVyLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOworCisgICAgICBpZiAoIXBhcmVudEVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgICAgfQorCisgICAgICB2YXIgcG9wdXAgPSBuZXcgUG9wdXBFbGVtZW50KHsKKyAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lciwKKyAgICAgICAgdHJpZ2dlcjogcGFyZW50RWxlbWVudCwKKyAgICAgICAgY29sb3I6IHRoaXMuZGF0YS5jb2xvciwKKyAgICAgICAgdGl0bGU6IHRoaXMuZGF0YS50aXRsZSwKKyAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUsCisgICAgICAgIGNvbnRlbnRzOiB0aGlzLmRhdGEuY29udGVudHMKKyAgICAgIH0pOworICAgICAgdmFyIHBhcmVudExlZnQgPSBwYXJzZUZsb2F0KHBhcmVudEVsZW1lbnQuc3R5bGUubGVmdCk7CisgICAgICB2YXIgcGFyZW50V2lkdGggPSBwYXJzZUZsb2F0KHBhcmVudEVsZW1lbnQuc3R5bGUud2lkdGgpOworICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gIi0iLmNvbmNhdChwYXJlbnRMZWZ0ICsgcGFyZW50V2lkdGgsICJweCAtIikuY29uY2F0KHBhcmVudEVsZW1lbnQuc3R5bGUudG9wKTsKKyAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSAiIi5jb25jYXQocGFyZW50TGVmdCArIHBhcmVudFdpZHRoLCAicHgiKTsKKyAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHBvcHVwLnJlbmRlcigpKTsKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUG9wdXBBbm5vdGF0aW9uRWxlbWVudDsKK30oQW5ub3RhdGlvbkVsZW1lbnQpOworCit2YXIgUG9wdXBFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUG9wdXBFbGVtZW50KHBhcmFtZXRlcnMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9wdXBFbGVtZW50KTsKKworICAgIHRoaXMuY29udGFpbmVyID0gcGFyYW1ldGVycy5jb250YWluZXI7CisgICAgdGhpcy50cmlnZ2VyID0gcGFyYW1ldGVycy50cmlnZ2VyOworICAgIHRoaXMuY29sb3IgPSBwYXJhbWV0ZXJzLmNvbG9yOworICAgIHRoaXMudGl0bGUgPSBwYXJhbWV0ZXJzLnRpdGxlOworICAgIHRoaXMubW9kaWZpY2F0aW9uRGF0ZSA9IHBhcmFtZXRlcnMubW9kaWZpY2F0aW9uRGF0ZTsKKyAgICB0aGlzLmNvbnRlbnRzID0gcGFyYW1ldGVycy5jb250ZW50czsKKyAgICB0aGlzLmhpZGVXcmFwcGVyID0gcGFyYW1ldGVycy5oaWRlV3JhcHBlciB8fCBmYWxzZTsKKyAgICB0aGlzLnBpbm5lZCA9IGZhbHNlOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBvcHVwRWxlbWVudCwgW3sKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB2YXIgQkFDS0dST1VORF9FTkxJR0hUID0gMC43OworICAgICAgdmFyIHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgIHdyYXBwZXIuY2xhc3NOYW1lID0gInBvcHVwV3JhcHBlciI7CisgICAgICB0aGlzLmhpZGVFbGVtZW50ID0gdGhpcy5oaWRlV3JhcHBlciA/IHdyYXBwZXIgOiB0aGlzLmNvbnRhaW5lcjsKKyAgICAgIHRoaXMuaGlkZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCB0cnVlKTsKKyAgICAgIHZhciBwb3B1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgcG9wdXAuY2xhc3NOYW1lID0gInBvcHVwIjsKKyAgICAgIHZhciBjb2xvciA9IHRoaXMuY29sb3I7CisKKyAgICAgIGlmIChjb2xvcikgeworICAgICAgICB2YXIgciA9IEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjb2xvclswXSkgKyBjb2xvclswXTsKKyAgICAgICAgdmFyIGcgPSBCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gY29sb3JbMV0pICsgY29sb3JbMV07CisgICAgICAgIHZhciBiID0gQkFDS0dST1VORF9FTkxJR0hUICogKDI1NSAtIGNvbG9yWzJdKSArIGNvbG9yWzJdOworICAgICAgICBwb3B1cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBfdXRpbC5VdGlsLm1ha2VDc3NSZ2IociB8IDAsIGcgfCAwLCBiIHwgMCk7CisgICAgICB9CisKKyAgICAgIHZhciB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImgxIik7CisgICAgICB0aXRsZS50ZXh0Q29udGVudCA9IHRoaXMudGl0bGU7CisgICAgICBwb3B1cC5hcHBlbmRDaGlsZCh0aXRsZSk7CisKKyAgICAgIHZhciBkYXRlT2JqZWN0ID0gX2Rpc3BsYXlfdXRpbHMuUERGRGF0ZVN0cmluZy50b0RhdGVPYmplY3QodGhpcy5tb2RpZmljYXRpb25EYXRlKTsKKworICAgICAgaWYgKGRhdGVPYmplY3QpIHsKKyAgICAgICAgdmFyIG1vZGlmaWNhdGlvbkRhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CisgICAgICAgIG1vZGlmaWNhdGlvbkRhdGUudGV4dENvbnRlbnQgPSAie3tkYXRlfX0sIHt7dGltZX19IjsKKyAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5kYXRhc2V0LmwxMG5JZCA9ICJhbm5vdGF0aW9uX2RhdGVfc3RyaW5nIjsKKyAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5kYXRhc2V0LmwxMG5BcmdzID0gSlNPTi5zdHJpbmdpZnkoeworICAgICAgICAgIGRhdGU6IGRhdGVPYmplY3QudG9Mb2NhbGVEYXRlU3RyaW5nKCksCisgICAgICAgICAgdGltZTogZGF0ZU9iamVjdC50b0xvY2FsZVRpbWVTdHJpbmcoKQorICAgICAgICB9KTsKKyAgICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQobW9kaWZpY2F0aW9uRGF0ZSk7CisgICAgICB9CisKKyAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuX2Zvcm1hdENvbnRlbnRzKHRoaXMuY29udGVudHMpOworCisgICAgICBwb3B1cC5hcHBlbmRDaGlsZChjb250ZW50cyk7CisgICAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLl90b2dnbGUuYmluZCh0aGlzKSk7CisgICAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgdGhpcy5fc2hvdy5iaW5kKHRoaXMsIGZhbHNlKSk7CisgICAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCB0aGlzLl9oaWRlLmJpbmQodGhpcywgZmFsc2UpKTsKKyAgICAgIHBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5faGlkZS5iaW5kKHRoaXMsIHRydWUpKTsKKyAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQocG9wdXApOworICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2Zvcm1hdENvbnRlbnRzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2Zvcm1hdENvbnRlbnRzKGNvbnRlbnRzKSB7CisgICAgICB2YXIgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTsKKyAgICAgIHZhciBsaW5lcyA9IGNvbnRlbnRzLnNwbGl0KC8oPzpcclxuP3xcbikvKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICB2YXIgbGluZSA9IGxpbmVzW2ldOworICAgICAgICBwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpKTsKKworICAgICAgICBpZiAoaSA8IGlpIC0gMSkgeworICAgICAgICAgIHAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHA7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3RvZ2dsZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF90b2dnbGUoKSB7CisgICAgICBpZiAodGhpcy5waW5uZWQpIHsKKyAgICAgICAgdGhpcy5faGlkZSh0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX3Nob3codHJ1ZSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3Nob3ciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfc2hvdygpIHsKKyAgICAgIHZhciBwaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlOworCisgICAgICBpZiAocGluKSB7CisgICAgICAgIHRoaXMucGlubmVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuaGlkZUVsZW1lbnQuaGFzQXR0cmlidXRlKCJoaWRkZW4iKSkgeworICAgICAgICB0aGlzLmhpZGVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIik7CisgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCArPSAxOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIl9oaWRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2hpZGUoKSB7CisgICAgICB2YXIgdW5waW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7CisKKyAgICAgIGlmICh1bnBpbikgeworICAgICAgICB0aGlzLnBpbm5lZCA9IGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMuaGlkZUVsZW1lbnQuaGFzQXR0cmlidXRlKCJoaWRkZW4iKSAmJiAhdGhpcy5waW5uZWQpIHsKKyAgICAgICAgdGhpcy5oaWRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsIHRydWUpOworICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggLT0gMTsKKyAgICAgIH0KKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUG9wdXBFbGVtZW50OworfSgpOworCit2YXIgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Fubm90YXRpb25FbGVtZW50NSkgeworICBfaW5oZXJpdHMoRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCwgX0Fubm90YXRpb25FbGVtZW50NSk7CisKKyAgdmFyIF9zdXBlcjEwID0gX2NyZWF0ZVN1cGVyKEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQpOworCisgIGZ1bmN0aW9uIEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycykgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KTsKKworICAgIHZhciBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgcmV0dXJuIF9zdXBlcjEwLmNhbGwodGhpcywgcGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhGcmVlVGV4dEFubm90YXRpb25FbGVtZW50LCBbeworICAgIGtleTogInJlbmRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJmcmVlVGV4dEFubm90YXRpb24iOworCisgICAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50OworfShBbm5vdGF0aW9uRWxlbWVudCk7CisKK3ZhciBMaW5lQW5ub3RhdGlvbkVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Bbm5vdGF0aW9uRWxlbWVudDYpIHsKKyAgX2luaGVyaXRzKExpbmVBbm5vdGF0aW9uRWxlbWVudCwgX0Fubm90YXRpb25FbGVtZW50Nik7CisKKyAgdmFyIF9zdXBlcjExID0gX2NyZWF0ZVN1cGVyKExpbmVBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gTGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGluZUFubm90YXRpb25FbGVtZW50KTsKKworICAgIHZhciBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgcmV0dXJuIF9zdXBlcjExLmNhbGwodGhpcywgcGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhMaW5lQW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImxpbmVBbm5vdGF0aW9uIjsKKyAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhOworICAgICAgdmFyIHdpZHRoID0gZGF0YS5yZWN0WzJdIC0gZGF0YS5yZWN0WzBdOworICAgICAgdmFyIGhlaWdodCA9IGRhdGEucmVjdFszXSAtIGRhdGEucmVjdFsxXTsKKyAgICAgIHZhciBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpOworICAgICAgdmFyIGxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmxpbmUiKTsKKyAgICAgIGxpbmUuc2V0QXR0cmlidXRlKCJ4MSIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzBdKTsKKyAgICAgIGxpbmUuc2V0QXR0cmlidXRlKCJ5MSIsIGRhdGEucmVjdFszXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzFdKTsKKyAgICAgIGxpbmUuc2V0QXR0cmlidXRlKCJ4MiIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzJdKTsKKyAgICAgIGxpbmUuc2V0QXR0cmlidXRlKCJ5MiIsIGRhdGEucmVjdFszXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzNdKTsKKyAgICAgIGxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpOworICAgICAgbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsICJ0cmFuc3BhcmVudCIpOworICAgICAgc3ZnLmFwcGVuZENoaWxkKGxpbmUpOworICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7CisKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBsaW5lLCBkYXRhKTsKKworICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBMaW5lQW5ub3RhdGlvbkVsZW1lbnQ7Cit9KEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIFNxdWFyZUFubm90YXRpb25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5ub3RhdGlvbkVsZW1lbnQ3KSB7CisgIF9pbmhlcml0cyhTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCwgX0Fubm90YXRpb25FbGVtZW50Nyk7CisKKyAgdmFyIF9zdXBlcjEyID0gX2NyZWF0ZVN1cGVyKFNxdWFyZUFubm90YXRpb25FbGVtZW50KTsKKworICBmdW5jdGlvbiBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNxdWFyZUFubm90YXRpb25FbGVtZW50KTsKKworICAgIHZhciBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgcmV0dXJuIF9zdXBlcjEyLmNhbGwodGhpcywgcGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCwgW3sKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAic3F1YXJlQW5ub3RhdGlvbiI7CisgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICAgIHZhciB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTsKKyAgICAgIHZhciBoZWlnaHQgPSBkYXRhLnJlY3RbM10gLSBkYXRhLnJlY3RbMV07CisgICAgICB2YXIgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIHZhciBib3JkZXJXaWR0aCA9IGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7CisgICAgICB2YXIgc3F1YXJlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7CisgICAgICBzcXVhcmUuc2V0QXR0cmlidXRlKCJ4IiwgYm9yZGVyV2lkdGggLyAyKTsKKyAgICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoInkiLCBib3JkZXJXaWR0aCAvIDIpOworICAgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgid2lkdGgiLCB3aWR0aCAtIGJvcmRlcldpZHRoKTsKKyAgICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIGhlaWdodCAtIGJvcmRlcldpZHRoKTsKKyAgICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsIGJvcmRlcldpZHRoIHx8IDEpOworICAgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgInRyYW5zcGFyZW50Iik7CisgICAgICBzcXVhcmUuc2V0QXR0cmlidXRlKCJmaWxsIiwgIm5vbmUiKTsKKyAgICAgIHN2Zy5hcHBlbmRDaGlsZChzcXVhcmUpOworICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7CisKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBzcXVhcmUsIGRhdGEpOworCisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFNxdWFyZUFubm90YXRpb25FbGVtZW50OworfShBbm5vdGF0aW9uRWxlbWVudCk7CisKK3ZhciBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Fubm90YXRpb25FbGVtZW50OCkgeworICBfaW5oZXJpdHMoQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQsIF9Bbm5vdGF0aW9uRWxlbWVudDgpOworCisgIHZhciBfc3VwZXIxMyA9IF9jcmVhdGVTdXBlcihDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycykgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgICB2YXIgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHJldHVybiBfc3VwZXIxMy5jYWxsKHRoaXMsIHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImNpcmNsZUFubm90YXRpb24iOworICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICB2YXIgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07CisgICAgICB2YXIgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdOworICAgICAgdmFyIHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7CisgICAgICB2YXIgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoOworICAgICAgdmFyIGNpcmNsZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZWxsaXBzZSIpOworICAgICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgiY3giLCB3aWR0aCAvIDIpOworICAgICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgiY3kiLCBoZWlnaHQgLyAyKTsKKyAgICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoInJ4Iiwgd2lkdGggLyAyIC0gYm9yZGVyV2lkdGggLyAyKTsKKyAgICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoInJ5IiwgaGVpZ2h0IC8gMiAtIGJvcmRlcldpZHRoIC8gMik7CisgICAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCBib3JkZXJXaWR0aCB8fCAxKTsKKyAgICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsICJ0cmFuc3BhcmVudCIpOworICAgICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJub25lIik7CisgICAgICBzdmcuYXBwZW5kQ2hpbGQoY2lyY2xlKTsKKyAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpOworCisgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgY2lyY2xlLCBkYXRhKTsKKworICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudDsKK30oQW5ub3RhdGlvbkVsZW1lbnQpOworCit2YXIgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Fubm90YXRpb25FbGVtZW50OSkgeworICBfaW5oZXJpdHMoUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCwgX0Fubm90YXRpb25FbGVtZW50OSk7CisKKyAgdmFyIF9zdXBlcjE0ID0gX2NyZWF0ZVN1cGVyKFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQpOworCisgIGZ1bmN0aW9uIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycykgeworICAgIHZhciBfdGhpczM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgICB2YXIgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIF90aGlzMyA9IF9zdXBlcjE0LmNhbGwodGhpcywgcGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgICBfdGhpczMuY29udGFpbmVyQ2xhc3NOYW1lID0gInBvbHlsaW5lQW5ub3RhdGlvbiI7CisgICAgX3RoaXMzLnN2Z0VsZW1lbnROYW1lID0gInN2Zzpwb2x5bGluZSI7CisgICAgcmV0dXJuIF90aGlzMzsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQb2x5bGluZUFubm90YXRpb25FbGVtZW50LCBbeworICAgIGtleTogInJlbmRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lOworICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICB2YXIgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07CisgICAgICB2YXIgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdOworICAgICAgdmFyIHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7CisgICAgICB2YXIgcG9pbnRzID0gW107CisKKyAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGF0YS52ZXJ0aWNlcyksCisgICAgICAgICAgX3N0ZXAzOworCisgICAgICB0cnkgeworICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykgeworICAgICAgICAgIHZhciBjb29yZGluYXRlID0gX3N0ZXAzLnZhbHVlOworICAgICAgICAgIHZhciB4ID0gY29vcmRpbmF0ZS54IC0gZGF0YS5yZWN0WzBdOworICAgICAgICAgIHZhciB5ID0gZGF0YS5yZWN0WzNdIC0gY29vcmRpbmF0ZS55OworICAgICAgICAgIHBvaW50cy5wdXNoKHggKyAiLCIgKyB5KTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvcjMuZShlcnIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgX2l0ZXJhdG9yMy5mKCk7CisgICAgICB9CisKKyAgICAgIHBvaW50cyA9IHBvaW50cy5qb2luKCIgIik7CisgICAgICB2YXIgcG9seWxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTsKKyAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZSgicG9pbnRzIiwgcG9pbnRzKTsKKyAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTsKKyAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgInRyYW5zcGFyZW50Iik7CisgICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOworICAgICAgc3ZnLmFwcGVuZENoaWxkKHBvbHlsaW5lKTsKKyAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpOworCisgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgcG9seWxpbmUsIGRhdGEpOworCisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQ7Cit9KEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1BvbHlsaW5lQW5ub3RhdGlvbkVsKSB7CisgIF9pbmhlcml0cyhQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQsIF9Qb2x5bGluZUFubm90YXRpb25FbCk7CisKKyAgdmFyIF9zdXBlcjE1ID0gX2NyZWF0ZVN1cGVyKFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gUG9seWdvbkFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpIHsKKyAgICB2YXIgX3RoaXM0OworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgICBfdGhpczQgPSBfc3VwZXIxNS5jYWxsKHRoaXMsIHBhcmFtZXRlcnMpOworICAgIF90aGlzNC5jb250YWluZXJDbGFzc05hbWUgPSAicG9seWdvbkFubm90YXRpb24iOworICAgIF90aGlzNC5zdmdFbGVtZW50TmFtZSA9ICJzdmc6cG9seWdvbiI7CisgICAgcmV0dXJuIF90aGlzNDsKKyAgfQorCisgIHJldHVybiBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQ7Cit9KFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQpOworCit2YXIgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Fubm90YXRpb25FbGVtZW50MTApIHsKKyAgX2luaGVyaXRzKENhcmV0QW5ub3RhdGlvbkVsZW1lbnQsIF9Bbm5vdGF0aW9uRWxlbWVudDEwKTsKKworICB2YXIgX3N1cGVyMTYgPSBfY3JlYXRlU3VwZXIoQ2FyZXRBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQpOworCisgICAgdmFyIGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICByZXR1cm4gX3N1cGVyMTYuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKENhcmV0QW5ub3RhdGlvbkVsZW1lbnQsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgeworICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImNhcmV0QW5ub3RhdGlvbiI7CisKKyAgICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7CisgICAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQ7Cit9KEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIElua0Fubm90YXRpb25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5ub3RhdGlvbkVsZW1lbnQxMSkgeworICBfaW5oZXJpdHMoSW5rQW5ub3RhdGlvbkVsZW1lbnQsIF9Bbm5vdGF0aW9uRWxlbWVudDExKTsKKworICB2YXIgX3N1cGVyMTcgPSBfY3JlYXRlU3VwZXIoSW5rQW5ub3RhdGlvbkVsZW1lbnQpOworCisgIGZ1bmN0aW9uIElua0Fubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpIHsKKyAgICB2YXIgX3RoaXM1OworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElua0Fubm90YXRpb25FbGVtZW50KTsKKworICAgIHZhciBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgX3RoaXM1ID0gX3N1cGVyMTcuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICAgIF90aGlzNS5jb250YWluZXJDbGFzc05hbWUgPSAiaW5rQW5ub3RhdGlvbiI7CisgICAgX3RoaXM1LnN2Z0VsZW1lbnROYW1lID0gInN2Zzpwb2x5bGluZSI7CisgICAgcmV0dXJuIF90aGlzNTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhJbmtBbm5vdGF0aW9uRWxlbWVudCwgW3sKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZTsKKyAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhOworICAgICAgdmFyIHdpZHRoID0gZGF0YS5yZWN0WzJdIC0gZGF0YS5yZWN0WzBdOworICAgICAgdmFyIGhlaWdodCA9IGRhdGEucmVjdFszXSAtIGRhdGEucmVjdFsxXTsKKyAgICAgIHZhciBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpOworCisgICAgICB2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRhdGEuaW5rTGlzdHMpLAorICAgICAgICAgIF9zdGVwNDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgaW5rTGlzdCA9IF9zdGVwNC52YWx1ZTsKKyAgICAgICAgICB2YXIgcG9pbnRzID0gW107CisKKyAgICAgICAgICB2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGlua0xpc3QpLAorICAgICAgICAgICAgICBfc3RlcDU7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I1LnMoKTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGUgPSBfc3RlcDUudmFsdWU7CisgICAgICAgICAgICAgIHZhciB4ID0gY29vcmRpbmF0ZS54IC0gZGF0YS5yZWN0WzBdOworICAgICAgICAgICAgICB2YXIgeSA9IGRhdGEucmVjdFszXSAtIGNvb3JkaW5hdGUueTsKKyAgICAgICAgICAgICAgcG9pbnRzLnB1c2goIiIuY29uY2F0KHgsICIsIikuY29uY2F0KHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgIF9pdGVyYXRvcjUuZShlcnIpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfaXRlcmF0b3I1LmYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwb2ludHMgPSBwb2ludHMuam9pbigiICIpOworICAgICAgICAgIHZhciBwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpOworICAgICAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZSgicG9pbnRzIiwgcG9pbnRzKTsKKyAgICAgICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7CisgICAgICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2UiLCAidHJhbnNwYXJlbnQiKTsKKyAgICAgICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOworCisgICAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIHBvbHlsaW5lLCBkYXRhKTsKKworICAgICAgICAgIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3I0LmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjQuZigpOworICAgICAgfQorCisgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTsKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gSW5rQW5ub3RhdGlvbkVsZW1lbnQ7Cit9KEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5ub3RhdGlvbkVsZW1lbnQxMikgeworICBfaW5oZXJpdHMoSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQsIF9Bbm5vdGF0aW9uRWxlbWVudDEyKTsKKworICB2YXIgX3N1cGVyMTggPSBfY3JlYXRlU3VwZXIoSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQpOworCisgIGZ1bmN0aW9uIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQpOworCisgICAgdmFyIGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICByZXR1cm4gX3N1cGVyMTguY2FsbCh0aGlzLCBwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50LCBbeworICAgIGtleTogInJlbmRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJoaWdobGlnaHRBbm5vdGF0aW9uIjsKKworICAgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQ7Cit9KEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIFVuZGVybGluZUFubm90YXRpb25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5ub3RhdGlvbkVsZW1lbnQxMykgeworICBfaW5oZXJpdHMoVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQsIF9Bbm5vdGF0aW9uRWxlbWVudDEzKTsKKworICB2YXIgX3N1cGVyMTkgPSBfY3JlYXRlU3VwZXIoVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQpOworCisgIGZ1bmN0aW9uIFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQpOworCisgICAgdmFyIGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICByZXR1cm4gX3N1cGVyMTkuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFVuZGVybGluZUFubm90YXRpb25FbGVtZW50LCBbeworICAgIGtleTogInJlbmRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJ1bmRlcmxpbmVBbm5vdGF0aW9uIjsKKworICAgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQ7Cit9KEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Bbm5vdGF0aW9uRWxlbWVudDE0KSB7CisgIF9pbmhlcml0cyhTcXVpZ2dseUFubm90YXRpb25FbGVtZW50LCBfQW5ub3RhdGlvbkVsZW1lbnQxNCk7CisKKyAgdmFyIF9zdXBlcjIwID0gX2NyZWF0ZVN1cGVyKFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQpOworCisgIGZ1bmN0aW9uIFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycykgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50KTsKKworICAgIHZhciBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgcmV0dXJuIF9zdXBlcjIwLmNhbGwodGhpcywgcGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhTcXVpZ2dseUFubm90YXRpb25FbGVtZW50LCBbeworICAgIGtleTogInJlbmRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJzcXVpZ2dseUFubm90YXRpb24iOworCisgICAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50OworfShBbm5vdGF0aW9uRWxlbWVudCk7CisKK3ZhciBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Fubm90YXRpb25FbGVtZW50MTUpIHsKKyAgX2luaGVyaXRzKFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50LCBfQW5ub3RhdGlvbkVsZW1lbnQxNSk7CisKKyAgdmFyIF9zdXBlcjIxID0gX2NyZWF0ZVN1cGVyKFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50KTsKKworICBmdW5jdGlvbiBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50KTsKKworICAgIHZhciBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgcmV0dXJuIF9zdXBlcjIxLmNhbGwodGhpcywgcGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCwgW3sKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAic3RyaWtlb3V0QW5ub3RhdGlvbiI7CisKKyAgICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7CisgICAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50OworfShBbm5vdGF0aW9uRWxlbWVudCk7CisKK3ZhciBTdGFtcEFubm90YXRpb25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5ub3RhdGlvbkVsZW1lbnQxNikgeworICBfaW5oZXJpdHMoU3RhbXBBbm5vdGF0aW9uRWxlbWVudCwgX0Fubm90YXRpb25FbGVtZW50MTYpOworCisgIHZhciBfc3VwZXIyMiA9IF9jcmVhdGVTdXBlcihTdGFtcEFubm90YXRpb25FbGVtZW50KTsKKworICBmdW5jdGlvbiBTdGFtcEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RhbXBBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgICB2YXIgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHJldHVybiBfc3VwZXIyMi5jYWxsKHRoaXMsIHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoU3RhbXBBbm5vdGF0aW9uRWxlbWVudCwgW3sKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAic3RhbXBBbm5vdGF0aW9uIjsKKworICAgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gU3RhbXBBbm5vdGF0aW9uRWxlbWVudDsKK30oQW5ub3RhdGlvbkVsZW1lbnQpOworCit2YXIgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Fubm90YXRpb25FbGVtZW50MTcpIHsKKyAgX2luaGVyaXRzKEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQsIF9Bbm5vdGF0aW9uRWxlbWVudDE3KTsKKworICB2YXIgX3N1cGVyMjMgPSBfY3JlYXRlU3VwZXIoRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCk7CisKKyAgZnVuY3Rpb24gRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKSB7CisgICAgdmFyIF90aGlzNjsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50KTsKKworICAgIF90aGlzNiA9IF9zdXBlcjIzLmNhbGwodGhpcywgcGFyYW1ldGVycywgdHJ1ZSk7CisgICAgdmFyIF90aGlzNiRkYXRhJGZpbGUgPSBfdGhpczYuZGF0YS5maWxlLAorICAgICAgICBmaWxlbmFtZSA9IF90aGlzNiRkYXRhJGZpbGUuZmlsZW5hbWUsCisgICAgICAgIGNvbnRlbnQgPSBfdGhpczYkZGF0YSRmaWxlLmNvbnRlbnQ7CisgICAgX3RoaXM2LmZpbGVuYW1lID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEZpbGVuYW1lRnJvbVVybCkoZmlsZW5hbWUpOworICAgIF90aGlzNi5jb250ZW50ID0gY29udGVudDsKKworICAgIGlmIChfdGhpczYubGlua1NlcnZpY2UuZXZlbnRCdXMpIHsKKyAgICAgIF90aGlzNi5saW5rU2VydmljZS5ldmVudEJ1cy5kaXNwYXRjaCgiZmlsZWF0dGFjaG1lbnRhbm5vdGF0aW9uIiwgeworICAgICAgICBzb3VyY2U6IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXM2KSwKKyAgICAgICAgaWQ6ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZmlsZW5hbWUpLAorICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsCisgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQKKyAgICAgIH0pOworICAgIH0KKworICAgIHJldHVybiBfdGhpczY7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCwgW3sKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAiZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIjsKKyAgICAgIHZhciB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICB0cmlnZ2VyLnN0eWxlLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodDsKKyAgICAgIHRyaWdnZXIuc3R5bGUud2lkdGggPSB0aGlzLmNvbnRhaW5lci5zdHlsZS53aWR0aDsKKyAgICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCB0aGlzLl9kb3dubG9hZC5iaW5kKHRoaXMpKTsKKworICAgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXAgJiYgKHRoaXMuZGF0YS50aXRsZSB8fCB0aGlzLmRhdGEuY29udGVudHMpKSB7CisgICAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCB0cmlnZ2VyLCB0aGlzLmRhdGEpOworICAgICAgfQorCisgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0cmlnZ2VyKTsKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfZG93bmxvYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZG93bmxvYWQoKSB7CisgICAgICBpZiAoIXRoaXMuZG93bmxvYWRNYW5hZ2VyKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRG93bmxvYWQgY2Fubm90IGJlIHN0YXJ0ZWQgZHVlIHRvIHVuYXZhaWxhYmxlIGRvd25sb2FkIG1hbmFnZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmRvd25sb2FkTWFuYWdlci5kb3dubG9hZERhdGEodGhpcy5jb250ZW50LCB0aGlzLmZpbGVuYW1lLCAiIik7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQ7Cit9KEFubm90YXRpb25FbGVtZW50KTsKKwordmFyIEFubm90YXRpb25MYXllciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEFubm90YXRpb25MYXllcigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5ub3RhdGlvbkxheWVyKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhBbm5vdGF0aW9uTGF5ZXIsIG51bGwsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHBhcmFtZXRlcnMpIHsKKyAgICAgIHZhciBzb3J0ZWRBbm5vdGF0aW9ucyA9IFtdLAorICAgICAgICAgIHBvcHVwQW5ub3RhdGlvbnMgPSBbXTsKKworICAgICAgdmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihwYXJhbWV0ZXJzLmFubm90YXRpb25zKSwKKyAgICAgICAgICBfc3RlcDY7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoX2l0ZXJhdG9yNi5zKCk7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgdmFyIF9kYXRhID0gX3N0ZXA2LnZhbHVlOworCisgICAgICAgICAgaWYgKCFfZGF0YSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKF9kYXRhLmFubm90YXRpb25UeXBlID09PSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT1BVUCkgeworICAgICAgICAgICAgcG9wdXBBbm5vdGF0aW9ucy5wdXNoKF9kYXRhKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goX2RhdGEpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yNi5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3I2LmYoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBvcHVwQW5ub3RhdGlvbnMubGVuZ3RoKSB7CisgICAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2guYXBwbHkoc29ydGVkQW5ub3RhdGlvbnMsIHBvcHVwQW5ub3RhdGlvbnMpOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBfaSA9IDAsIF9zb3J0ZWRBbm5vdGF0aW9ucyA9IHNvcnRlZEFubm90YXRpb25zOyBfaSA8IF9zb3J0ZWRBbm5vdGF0aW9ucy5sZW5ndGg7IF9pKyspIHsKKyAgICAgICAgdmFyIGRhdGEgPSBfc29ydGVkQW5ub3RhdGlvbnNbX2ldOworICAgICAgICB2YXIgZWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUoeworICAgICAgICAgIGRhdGE6IGRhdGEsCisgICAgICAgICAgbGF5ZXI6IHBhcmFtZXRlcnMuZGl2LAorICAgICAgICAgIHBhZ2U6IHBhcmFtZXRlcnMucGFnZSwKKyAgICAgICAgICB2aWV3cG9ydDogcGFyYW1ldGVycy52aWV3cG9ydCwKKyAgICAgICAgICBsaW5rU2VydmljZTogcGFyYW1ldGVycy5saW5rU2VydmljZSwKKyAgICAgICAgICBkb3dubG9hZE1hbmFnZXI6IHBhcmFtZXRlcnMuZG93bmxvYWRNYW5hZ2VyLAorICAgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogcGFyYW1ldGVycy5pbWFnZVJlc291cmNlc1BhdGggfHwgIiIsCisgICAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdHlwZW9mIHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9PT0gImJvb2xlYW4iID8gcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIDogdHJ1ZSwKKyAgICAgICAgICBzdmdGYWN0b3J5OiBuZXcgX2Rpc3BsYXlfdXRpbHMuRE9NU1ZHRmFjdG9yeSgpLAorICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlIHx8IG5ldyBfYW5ub3RhdGlvbl9zdG9yYWdlLkFubm90YXRpb25TdG9yYWdlKCkKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKGVsZW1lbnQuaXNSZW5kZXJhYmxlKSB7CisgICAgICAgICAgcGFyYW1ldGVycy5kaXYuYXBwZW5kQ2hpbGQoZWxlbWVudC5yZW5kZXIoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ1cGRhdGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUocGFyYW1ldGVycykgeworICAgICAgdmFyIF9pdGVyYXRvcjcgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihwYXJhbWV0ZXJzLmFubm90YXRpb25zKSwKKyAgICAgICAgICBfc3RlcDc7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoX2l0ZXJhdG9yNy5zKCk7ICEoX3N0ZXA3ID0gX2l0ZXJhdG9yNy5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgdmFyIGRhdGEgPSBfc3RlcDcudmFsdWU7CisgICAgICAgICAgdmFyIGVsZW1lbnQgPSBwYXJhbWV0ZXJzLmRpdi5xdWVyeVNlbGVjdG9yKCJbZGF0YS1hbm5vdGF0aW9uLWlkPVwiIi5jb25jYXQoZGF0YS5pZCwgIlwiXSIpKTsKKworICAgICAgICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICJtYXRyaXgoIi5jb25jYXQocGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbigiLCIpLCAiKSIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvcjcuZShlcnIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgX2l0ZXJhdG9yNy5mKCk7CisgICAgICB9CisKKyAgICAgIHBhcmFtZXRlcnMuZGl2LnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIik7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEFubm90YXRpb25MYXllcjsKK30oKTsKKworZXhwb3J0cy5Bbm5vdGF0aW9uTGF5ZXIgPSBBbm5vdGF0aW9uTGF5ZXI7CisKKy8qKiovIH0pLAorLyogMjE3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMucmVuZGVyVGV4dExheWVyID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgcmVuZGVyVGV4dExheWVyID0gZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyQ2xvc3VyZSgpIHsKKyAgdmFyIE1BWF9URVhUX0RJVlNfVE9fUkVOREVSID0gMTAwMDAwOworICB2YXIgTm9uV2hpdGVzcGFjZVJlZ2V4cCA9IC9cUy87CisKKyAgZnVuY3Rpb24gaXNBbGxXaGl0ZXNwYWNlKHN0cikgeworICAgIHJldHVybiAhTm9uV2hpdGVzcGFjZVJlZ2V4cC50ZXN0KHN0cik7CisgIH0KKworICBmdW5jdGlvbiBhcHBlbmRUZXh0KHRhc2ssIGdlb20sIHN0eWxlcykgeworICAgIHZhciB0ZXh0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworICAgIHZhciB0ZXh0RGl2UHJvcGVydGllcyA9IHsKKyAgICAgIGFuZ2xlOiAwLAorICAgICAgY2FudmFzV2lkdGg6IDAsCisgICAgICBpc1doaXRlc3BhY2U6IGZhbHNlLAorICAgICAgb3JpZ2luYWxUcmFuc2Zvcm06IG51bGwsCisgICAgICBwYWRkaW5nQm90dG9tOiAwLAorICAgICAgcGFkZGluZ0xlZnQ6IDAsCisgICAgICBwYWRkaW5nUmlnaHQ6IDAsCisgICAgICBwYWRkaW5nVG9wOiAwLAorICAgICAgc2NhbGU6IDEKKyAgICB9OworCisgICAgdGFzay5fdGV4dERpdnMucHVzaCh0ZXh0RGl2KTsKKworICAgIGlmIChpc0FsbFdoaXRlc3BhY2UoZ2VvbS5zdHIpKSB7CisgICAgICB0ZXh0RGl2UHJvcGVydGllcy5pc1doaXRlc3BhY2UgPSB0cnVlOworCisgICAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHR4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGFzay5fdmlld3BvcnQudHJhbnNmb3JtLCBnZW9tLnRyYW5zZm9ybSk7CisKKyAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKHR4WzFdLCB0eFswXSk7CisgICAgdmFyIHN0eWxlID0gc3R5bGVzW2dlb20uZm9udE5hbWVdOworCisgICAgaWYgKHN0eWxlLnZlcnRpY2FsKSB7CisgICAgICBhbmdsZSArPSBNYXRoLlBJIC8gMjsKKyAgICB9CisKKyAgICB2YXIgZm9udEhlaWdodCA9IE1hdGguc3FydCh0eFsyXSAqIHR4WzJdICsgdHhbM10gKiB0eFszXSk7CisgICAgdmFyIGZvbnRBc2NlbnQgPSBmb250SGVpZ2h0OworCisgICAgaWYgKHN0eWxlLmFzY2VudCkgeworICAgICAgZm9udEFzY2VudCA9IHN0eWxlLmFzY2VudCAqIGZvbnRBc2NlbnQ7CisgICAgfSBlbHNlIGlmIChzdHlsZS5kZXNjZW50KSB7CisgICAgICBmb250QXNjZW50ID0gKDEgKyBzdHlsZS5kZXNjZW50KSAqIGZvbnRBc2NlbnQ7CisgICAgfQorCisgICAgdmFyIGxlZnQsIHRvcDsKKworICAgIGlmIChhbmdsZSA9PT0gMCkgeworICAgICAgbGVmdCA9IHR4WzRdOworICAgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50OworICAgIH0gZWxzZSB7CisgICAgICBsZWZ0ID0gdHhbNF0gKyBmb250QXNjZW50ICogTWF0aC5zaW4oYW5nbGUpOworICAgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50ICogTWF0aC5jb3MoYW5nbGUpOworICAgIH0KKworICAgIHRleHREaXYuc3R5bGUubGVmdCA9ICIiLmNvbmNhdChsZWZ0LCAicHgiKTsKKyAgICB0ZXh0RGl2LnN0eWxlLnRvcCA9ICIiLmNvbmNhdCh0b3AsICJweCIpOworICAgIHRleHREaXYuc3R5bGUuZm9udFNpemUgPSAiIi5jb25jYXQoZm9udEhlaWdodCwgInB4Iik7CisgICAgdGV4dERpdi5zdHlsZS5mb250RmFtaWx5ID0gc3R5bGUuZm9udEZhbWlseTsKKyAgICB0ZXh0RGl2LnRleHRDb250ZW50ID0gZ2VvbS5zdHI7CisKKyAgICBpZiAodGFzay5fZm9udEluc3BlY3RvckVuYWJsZWQpIHsKKyAgICAgIHRleHREaXYuZGF0YXNldC5mb250TmFtZSA9IGdlb20uZm9udE5hbWU7CisgICAgfQorCisgICAgaWYgKGFuZ2xlICE9PSAwKSB7CisgICAgICB0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSA9IGFuZ2xlICogKDE4MCAvIE1hdGguUEkpOworICAgIH0KKworICAgIHZhciBzaG91bGRTY2FsZVRleHQgPSBmYWxzZTsKKworICAgIGlmIChnZW9tLnN0ci5sZW5ndGggPiAxKSB7CisgICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoZ2VvbS50cmFuc2Zvcm1bMF0gIT09IGdlb20udHJhbnNmb3JtWzNdKSB7CisgICAgICB2YXIgYWJzU2NhbGVYID0gTWF0aC5hYnMoZ2VvbS50cmFuc2Zvcm1bMF0pLAorICAgICAgICAgIGFic1NjYWxlWSA9IE1hdGguYWJzKGdlb20udHJhbnNmb3JtWzNdKTsKKworICAgICAgaWYgKGFic1NjYWxlWCAhPT0gYWJzU2NhbGVZICYmIE1hdGgubWF4KGFic1NjYWxlWCwgYWJzU2NhbGVZKSAvIE1hdGgubWluKGFic1NjYWxlWCwgYWJzU2NhbGVZKSA+IDEuNSkgeworICAgICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzaG91bGRTY2FsZVRleHQpIHsKKyAgICAgIGlmIChzdHlsZS52ZXJ0aWNhbCkgeworICAgICAgICB0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCA9IGdlb20uaGVpZ2h0ICogdGFzay5fdmlld3BvcnQuc2NhbGU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCA9IGdlb20ud2lkdGggKiB0YXNrLl92aWV3cG9ydC5zY2FsZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpOworCisgICAgaWYgKHRhc2suX3RleHRDb250ZW50U3RyZWFtKSB7CisgICAgICB0YXNrLl9sYXlvdXRUZXh0KHRleHREaXYpOworICAgIH0KKworICAgIGlmICh0YXNrLl9lbmhhbmNlVGV4dFNlbGVjdGlvbikgeworICAgICAgdmFyIGFuZ2xlQ29zID0gMSwKKyAgICAgICAgICBhbmdsZVNpbiA9IDA7CisKKyAgICAgIGlmIChhbmdsZSAhPT0gMCkgeworICAgICAgICBhbmdsZUNvcyA9IE1hdGguY29zKGFuZ2xlKTsKKyAgICAgICAgYW5nbGVTaW4gPSBNYXRoLnNpbihhbmdsZSk7CisgICAgICB9CisKKyAgICAgIHZhciBkaXZXaWR0aCA9IChzdHlsZS52ZXJ0aWNhbCA/IGdlb20uaGVpZ2h0IDogZ2VvbS53aWR0aCkgKiB0YXNrLl92aWV3cG9ydC5zY2FsZTsKKyAgICAgIHZhciBkaXZIZWlnaHQgPSBmb250SGVpZ2h0OworICAgICAgdmFyIG0sIGI7CisKKyAgICAgIGlmIChhbmdsZSAhPT0gMCkgeworICAgICAgICBtID0gW2FuZ2xlQ29zLCBhbmdsZVNpbiwgLWFuZ2xlU2luLCBhbmdsZUNvcywgbGVmdCwgdG9wXTsKKyAgICAgICAgYiA9IF91dGlsLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHRdLCBtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGIgPSBbbGVmdCwgdG9wLCBsZWZ0ICsgZGl2V2lkdGgsIHRvcCArIGRpdkhlaWdodF07CisgICAgICB9CisKKyAgICAgIHRhc2suX2JvdW5kcy5wdXNoKHsKKyAgICAgICAgbGVmdDogYlswXSwKKyAgICAgICAgdG9wOiBiWzFdLAorICAgICAgICByaWdodDogYlsyXSwKKyAgICAgICAgYm90dG9tOiBiWzNdLAorICAgICAgICBkaXY6IHRleHREaXYsCisgICAgICAgIHNpemU6IFtkaXZXaWR0aCwgZGl2SGVpZ2h0XSwKKyAgICAgICAgbTogbQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcmVuZGVyKHRhc2spIHsKKyAgICBpZiAodGFzay5fY2FuY2VsZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgdGV4dERpdnMgPSB0YXNrLl90ZXh0RGl2czsKKyAgICB2YXIgY2FwYWJpbGl0eSA9IHRhc2suX2NhcGFiaWxpdHk7CisgICAgdmFyIHRleHREaXZzTGVuZ3RoID0gdGV4dERpdnMubGVuZ3RoOworCisgICAgaWYgKHRleHREaXZzTGVuZ3RoID4gTUFYX1RFWFRfRElWU19UT19SRU5ERVIpIHsKKyAgICAgIHRhc2suX3JlbmRlcmluZ0RvbmUgPSB0cnVlOworICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCF0YXNrLl90ZXh0Q29udGVudFN0cmVhbSkgeworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0RGl2c0xlbmd0aDsgaSsrKSB7CisgICAgICAgIHRhc2suX2xheW91dFRleHQodGV4dERpdnNbaV0pOworICAgICAgfQorICAgIH0KKworICAgIHRhc2suX3JlbmRlcmluZ0RvbmUgPSB0cnVlOworICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpOworICB9CisKKyAgZnVuY3Rpb24gZmluZFBvc2l0aXZlTWluKHRzLCBvZmZzZXQsIGNvdW50KSB7CisgICAgdmFyIHJlc3VsdCA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIHZhciB0ID0gdHNbb2Zmc2V0KytdOworCisgICAgICBpZiAodCA+IDApIHsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gTWF0aC5taW4odCwgcmVzdWx0KSA6IHQ7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGV4cGFuZCh0YXNrKSB7CisgICAgdmFyIGJvdW5kcyA9IHRhc2suX2JvdW5kczsKKyAgICB2YXIgdmlld3BvcnQgPSB0YXNrLl92aWV3cG9ydDsKKyAgICB2YXIgZXhwYW5kZWQgPSBleHBhbmRCb3VuZHModmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCwgYm91bmRzKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwYW5kZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBkaXYgPSBib3VuZHNbaV0uZGl2OworCisgICAgICB2YXIgZGl2UHJvcGVydGllcyA9IHRhc2suX3RleHREaXZQcm9wZXJ0aWVzLmdldChkaXYpOworCisgICAgICBpZiAoZGl2UHJvcGVydGllcy5hbmdsZSA9PT0gMCkgeworICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdMZWZ0ID0gYm91bmRzW2ldLmxlZnQgLSBleHBhbmRlZFtpXS5sZWZ0OworICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdUb3AgPSBib3VuZHNbaV0udG9wIC0gZXhwYW5kZWRbaV0udG9wOworICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdSaWdodCA9IGV4cGFuZGVkW2ldLnJpZ2h0IC0gYm91bmRzW2ldLnJpZ2h0OworICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdCb3R0b20gPSBleHBhbmRlZFtpXS5ib3R0b20gLSBib3VuZHNbaV0uYm90dG9tOworCisgICAgICAgIHRhc2suX3RleHREaXZQcm9wZXJ0aWVzLnNldChkaXYsIGRpdlByb3BlcnRpZXMpOworCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgZSA9IGV4cGFuZGVkW2ldLAorICAgICAgICAgIGIgPSBib3VuZHNbaV07CisgICAgICB2YXIgbSA9IGIubSwKKyAgICAgICAgICBjID0gbVswXSwKKyAgICAgICAgICBzID0gbVsxXTsKKyAgICAgIHZhciBwb2ludHMgPSBbWzAsIDBdLCBbMCwgYi5zaXplWzFdXSwgW2Iuc2l6ZVswXSwgMF0sIGIuc2l6ZV07CisgICAgICB2YXIgdHMgPSBuZXcgRmxvYXQ2NEFycmF5KDY0KTsKKyAgICAgIHBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwLCBqKSB7CisgICAgICAgIHZhciB0ID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShwLCBtKTsKKworICAgICAgICB0c1tqICsgMF0gPSBjICYmIChlLmxlZnQgLSB0WzBdKSAvIGM7CisgICAgICAgIHRzW2ogKyA0XSA9IHMgJiYgKGUudG9wIC0gdFsxXSkgLyBzOworICAgICAgICB0c1tqICsgOF0gPSBjICYmIChlLnJpZ2h0IC0gdFswXSkgLyBjOworICAgICAgICB0c1tqICsgMTJdID0gcyAmJiAoZS5ib3R0b20gLSB0WzFdKSAvIHM7CisgICAgICAgIHRzW2ogKyAxNl0gPSBzICYmIChlLmxlZnQgLSB0WzBdKSAvIC1zOworICAgICAgICB0c1tqICsgMjBdID0gYyAmJiAoZS50b3AgLSB0WzFdKSAvIGM7CisgICAgICAgIHRzW2ogKyAyNF0gPSBzICYmIChlLnJpZ2h0IC0gdFswXSkgLyAtczsKKyAgICAgICAgdHNbaiArIDI4XSA9IGMgJiYgKGUuYm90dG9tIC0gdFsxXSkgLyBjOworICAgICAgICB0c1tqICsgMzJdID0gYyAmJiAoZS5sZWZ0IC0gdFswXSkgLyAtYzsKKyAgICAgICAgdHNbaiArIDM2XSA9IHMgJiYgKGUudG9wIC0gdFsxXSkgLyAtczsKKyAgICAgICAgdHNbaiArIDQwXSA9IGMgJiYgKGUucmlnaHQgLSB0WzBdKSAvIC1jOworICAgICAgICB0c1tqICsgNDRdID0gcyAmJiAoZS5ib3R0b20gLSB0WzFdKSAvIC1zOworICAgICAgICB0c1tqICsgNDhdID0gcyAmJiAoZS5sZWZ0IC0gdFswXSkgLyBzOworICAgICAgICB0c1tqICsgNTJdID0gYyAmJiAoZS50b3AgLSB0WzFdKSAvIC1jOworICAgICAgICB0c1tqICsgNTZdID0gcyAmJiAoZS5yaWdodCAtIHRbMF0pIC8gczsKKyAgICAgICAgdHNbaiArIDYwXSA9IGMgJiYgKGUuYm90dG9tIC0gdFsxXSkgLyAtYzsKKyAgICAgIH0pOworICAgICAgdmFyIGJveFNjYWxlID0gMSArIE1hdGgubWluKE1hdGguYWJzKGMpLCBNYXRoLmFicyhzKSk7CisgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdMZWZ0ID0gZmluZFBvc2l0aXZlTWluKHRzLCAzMiwgMTYpIC8gYm94U2NhbGU7CisgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdUb3AgPSBmaW5kUG9zaXRpdmVNaW4odHMsIDQ4LCAxNikgLyBib3hTY2FsZTsKKyAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ1JpZ2h0ID0gZmluZFBvc2l0aXZlTWluKHRzLCAwLCAxNikgLyBib3hTY2FsZTsKKyAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ0JvdHRvbSA9IGZpbmRQb3NpdGl2ZU1pbih0cywgMTYsIDE2KSAvIGJveFNjYWxlOworCisgICAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQoZGl2LCBkaXZQcm9wZXJ0aWVzKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBleHBhbmRCb3VuZHMod2lkdGgsIGhlaWdodCwgYm94ZXMpIHsKKyAgICB2YXIgYm91bmRzID0gYm94ZXMubWFwKGZ1bmN0aW9uIChib3gsIGkpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHgxOiBib3gubGVmdCwKKyAgICAgICAgeTE6IGJveC50b3AsCisgICAgICAgIHgyOiBib3gucmlnaHQsCisgICAgICAgIHkyOiBib3guYm90dG9tLAorICAgICAgICBpbmRleDogaSwKKyAgICAgICAgeDFOZXc6IHVuZGVmaW5lZCwKKyAgICAgICAgeDJOZXc6IHVuZGVmaW5lZAorICAgICAgfTsKKyAgICB9KTsKKyAgICBleHBhbmRCb3VuZHNMVFIod2lkdGgsIGJvdW5kcyk7CisgICAgdmFyIGV4cGFuZGVkID0gbmV3IEFycmF5KGJveGVzLmxlbmd0aCk7CisgICAgYm91bmRzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKKyAgICAgIHZhciBpID0gYi5pbmRleDsKKyAgICAgIGV4cGFuZGVkW2ldID0geworICAgICAgICBsZWZ0OiBiLngxTmV3LAorICAgICAgICB0b3A6IDAsCisgICAgICAgIHJpZ2h0OiBiLngyTmV3LAorICAgICAgICBib3R0b206IDAKKyAgICAgIH07CisgICAgfSk7CisgICAgYm94ZXMubWFwKGZ1bmN0aW9uIChib3gsIGkpIHsKKyAgICAgIHZhciBlID0gZXhwYW5kZWRbaV0sCisgICAgICAgICAgYiA9IGJvdW5kc1tpXTsKKyAgICAgIGIueDEgPSBib3gudG9wOworICAgICAgYi55MSA9IHdpZHRoIC0gZS5yaWdodDsKKyAgICAgIGIueDIgPSBib3guYm90dG9tOworICAgICAgYi55MiA9IHdpZHRoIC0gZS5sZWZ0OworICAgICAgYi5pbmRleCA9IGk7CisgICAgICBiLngxTmV3ID0gdW5kZWZpbmVkOworICAgICAgYi54Mk5ldyA9IHVuZGVmaW5lZDsKKyAgICB9KTsKKyAgICBleHBhbmRCb3VuZHNMVFIoaGVpZ2h0LCBib3VuZHMpOworICAgIGJvdW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7CisgICAgICB2YXIgaSA9IGIuaW5kZXg7CisgICAgICBleHBhbmRlZFtpXS50b3AgPSBiLngxTmV3OworICAgICAgZXhwYW5kZWRbaV0uYm90dG9tID0gYi54Mk5ldzsKKyAgICB9KTsKKyAgICByZXR1cm4gZXhwYW5kZWQ7CisgIH0KKworICBmdW5jdGlvbiBleHBhbmRCb3VuZHNMVFIod2lkdGgsIGJvdW5kcykgeworICAgIGJvdW5kcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICByZXR1cm4gYS54MSAtIGIueDEgfHwgYS5pbmRleCAtIGIuaW5kZXg7CisgICAgfSk7CisgICAgdmFyIGZha2VCb3VuZGFyeSA9IHsKKyAgICAgIHgxOiAtSW5maW5pdHksCisgICAgICB5MTogLUluZmluaXR5LAorICAgICAgeDI6IDAsCisgICAgICB5MjogSW5maW5pdHksCisgICAgICBpbmRleDogLTEsCisgICAgICB4MU5ldzogMCwKKyAgICAgIHgyTmV3OiAwCisgICAgfTsKKyAgICB2YXIgaG9yaXpvbiA9IFt7CisgICAgICBzdGFydDogLUluZmluaXR5LAorICAgICAgZW5kOiBJbmZpbml0eSwKKyAgICAgIGJvdW5kYXJ5OiBmYWtlQm91bmRhcnkKKyAgICB9XTsKKyAgICBib3VuZHMuZm9yRWFjaChmdW5jdGlvbiAoYm91bmRhcnkpIHsKKyAgICAgIHZhciBpID0gMDsKKworICAgICAgd2hpbGUgKGkgPCBob3Jpem9uLmxlbmd0aCAmJiBob3Jpem9uW2ldLmVuZCA8PSBib3VuZGFyeS55MSkgeworICAgICAgICBpKys7CisgICAgICB9CisKKyAgICAgIHZhciBqID0gaG9yaXpvbi5sZW5ndGggLSAxOworCisgICAgICB3aGlsZSAoaiA+PSAwICYmIGhvcml6b25bal0uc3RhcnQgPj0gYm91bmRhcnkueTIpIHsKKyAgICAgICAgai0tOworICAgICAgfQorCisgICAgICB2YXIgaG9yaXpvblBhcnQsIGFmZmVjdGVkQm91bmRhcnk7CisgICAgICB2YXIgcSwKKyAgICAgICAgICBrLAorICAgICAgICAgIG1heFhOZXcgPSAtSW5maW5pdHk7CisKKyAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7CisgICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTsKKyAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5OworICAgICAgICB2YXIgeE5ldzsKKworICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54MiA+IGJvdW5kYXJ5LngxKSB7CisgICAgICAgICAgeE5ldyA9IGFmZmVjdGVkQm91bmRhcnkuaW5kZXggPiBib3VuZGFyeS5pbmRleCA/IGFmZmVjdGVkQm91bmRhcnkueDFOZXcgOiBib3VuZGFyeS54MTsKKyAgICAgICAgfSBlbHNlIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB4TmV3ID0gKGFmZmVjdGVkQm91bmRhcnkueDIgKyBib3VuZGFyeS54MSkgLyAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHhOZXcgPSBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHhOZXcgPiBtYXhYTmV3KSB7CisgICAgICAgICAgbWF4WE5ldyA9IHhOZXc7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYm91bmRhcnkueDFOZXcgPSBtYXhYTmV3OworCisgICAgICBmb3IgKHEgPSBpOyBxIDw9IGo7IHErKykgeworICAgICAgICBob3Jpem9uUGFydCA9IGhvcml6b25bcV07CisgICAgICAgIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTsKKworICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkueDIgPiBib3VuZGFyeS54MSkgeworICAgICAgICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkuaW5kZXggPiBib3VuZGFyeS5pbmRleCkgeworICAgICAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gYWZmZWN0ZWRCb3VuZGFyeS54MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IG1heFhOZXc7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPiBtYXhYTmV3KSB7CisgICAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IE1hdGgubWF4KG1heFhOZXcsIGFmZmVjdGVkQm91bmRhcnkueDIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBjaGFuZ2VkSG9yaXpvbiA9IFtdLAorICAgICAgICAgIGxhc3RCb3VuZGFyeSA9IG51bGw7CisKKyAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7CisgICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTsKKyAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5OworICAgICAgICB2YXIgdXNlQm91bmRhcnkgPSBhZmZlY3RlZEJvdW5kYXJ5LngyID4gYm91bmRhcnkueDIgPyBhZmZlY3RlZEJvdW5kYXJ5IDogYm91bmRhcnk7CisKKyAgICAgICAgaWYgKGxhc3RCb3VuZGFyeSA9PT0gdXNlQm91bmRhcnkpIHsKKyAgICAgICAgICBjaGFuZ2VkSG9yaXpvbltjaGFuZ2VkSG9yaXpvbi5sZW5ndGggLSAxXS5lbmQgPSBob3Jpem9uUGFydC5lbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2hhbmdlZEhvcml6b24ucHVzaCh7CisgICAgICAgICAgICBzdGFydDogaG9yaXpvblBhcnQuc3RhcnQsCisgICAgICAgICAgICBlbmQ6IGhvcml6b25QYXJ0LmVuZCwKKyAgICAgICAgICAgIGJvdW5kYXJ5OiB1c2VCb3VuZGFyeQorICAgICAgICAgIH0pOworICAgICAgICAgIGxhc3RCb3VuZGFyeSA9IHVzZUJvdW5kYXJ5OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChob3Jpem9uW2ldLnN0YXJ0IDwgYm91bmRhcnkueTEpIHsKKyAgICAgICAgY2hhbmdlZEhvcml6b25bMF0uc3RhcnQgPSBib3VuZGFyeS55MTsKKyAgICAgICAgY2hhbmdlZEhvcml6b24udW5zaGlmdCh7CisgICAgICAgICAgc3RhcnQ6IGhvcml6b25baV0uc3RhcnQsCisgICAgICAgICAgZW5kOiBib3VuZGFyeS55MSwKKyAgICAgICAgICBib3VuZGFyeTogaG9yaXpvbltpXS5ib3VuZGFyeQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgaWYgKGJvdW5kYXJ5LnkyIDwgaG9yaXpvbltqXS5lbmQpIHsKKyAgICAgICAgY2hhbmdlZEhvcml6b25bY2hhbmdlZEhvcml6b24ubGVuZ3RoIC0gMV0uZW5kID0gYm91bmRhcnkueTI7CisgICAgICAgIGNoYW5nZWRIb3Jpem9uLnB1c2goeworICAgICAgICAgIHN0YXJ0OiBib3VuZGFyeS55MiwKKyAgICAgICAgICBlbmQ6IGhvcml6b25bal0uZW5kLAorICAgICAgICAgIGJvdW5kYXJ5OiBob3Jpem9uW2pdLmJvdW5kYXJ5CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBmb3IgKHEgPSBpOyBxIDw9IGo7IHErKykgeworICAgICAgICBob3Jpem9uUGFydCA9IGhvcml6b25bcV07CisgICAgICAgIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTsKKworICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdXNlZCA9IGZhbHNlOworCisgICAgICAgIGZvciAoayA9IGkgLSAxOyAhdXNlZCAmJiBrID49IDAgJiYgaG9yaXpvbltrXS5zdGFydCA+PSBhZmZlY3RlZEJvdW5kYXJ5LnkxOyBrLS0pIHsKKyAgICAgICAgICB1c2VkID0gaG9yaXpvbltrXS5ib3VuZGFyeSA9PT0gYWZmZWN0ZWRCb3VuZGFyeTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoayA9IGogKyAxOyAhdXNlZCAmJiBrIDwgaG9yaXpvbi5sZW5ndGggJiYgaG9yaXpvbltrXS5lbmQgPD0gYWZmZWN0ZWRCb3VuZGFyeS55MjsgaysrKSB7CisgICAgICAgICAgdXNlZCA9IGhvcml6b25ba10uYm91bmRhcnkgPT09IGFmZmVjdGVkQm91bmRhcnk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGsgPSAwOyAhdXNlZCAmJiBrIDwgY2hhbmdlZEhvcml6b24ubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICB1c2VkID0gY2hhbmdlZEhvcml6b25ba10uYm91bmRhcnkgPT09IGFmZmVjdGVkQm91bmRhcnk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXVzZWQpIHsKKyAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gbWF4WE5ldzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGhvcml6b24sIFtpLCBqIC0gaSArIDFdLmNvbmNhdChjaGFuZ2VkSG9yaXpvbikpOworICAgIH0pOworICAgIGhvcml6b24uZm9yRWFjaChmdW5jdGlvbiAoaG9yaXpvblBhcnQpIHsKKyAgICAgIHZhciBhZmZlY3RlZEJvdW5kYXJ5ID0gaG9yaXpvblBhcnQuYm91bmRhcnk7CisKKyAgICAgIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IE1hdGgubWF4KHdpZHRoLCBhZmZlY3RlZEJvdW5kYXJ5LngyKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIFRleHRMYXllclJlbmRlclRhc2soX3JlZikgeworICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICB2YXIgdGV4dENvbnRlbnQgPSBfcmVmLnRleHRDb250ZW50LAorICAgICAgICB0ZXh0Q29udGVudFN0cmVhbSA9IF9yZWYudGV4dENvbnRlbnRTdHJlYW0sCisgICAgICAgIGNvbnRhaW5lciA9IF9yZWYuY29udGFpbmVyLAorICAgICAgICB2aWV3cG9ydCA9IF9yZWYudmlld3BvcnQsCisgICAgICAgIHRleHREaXZzID0gX3JlZi50ZXh0RGl2cywKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ciA9IF9yZWYudGV4dENvbnRlbnRJdGVtc1N0ciwKKyAgICAgICAgZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBfcmVmLmVuaGFuY2VUZXh0U2VsZWN0aW9uOworICAgIHRoaXMuX3RleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7CisgICAgdGhpcy5fdGV4dENvbnRlbnRTdHJlYW0gPSB0ZXh0Q29udGVudFN0cmVhbTsKKyAgICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7CisgICAgdGhpcy5fZG9jdW1lbnQgPSBjb250YWluZXIub3duZXJEb2N1bWVudDsKKyAgICB0aGlzLl92aWV3cG9ydCA9IHZpZXdwb3J0OworICAgIHRoaXMuX3RleHREaXZzID0gdGV4dERpdnMgfHwgW107CisgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRleHRDb250ZW50SXRlbXNTdHIgfHwgW107CisgICAgdGhpcy5fZW5oYW5jZVRleHRTZWxlY3Rpb24gPSAhIWVuaGFuY2VUZXh0U2VsZWN0aW9uOworICAgIHRoaXMuX2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISEoZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yICYmIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5lbmFibGVkKTsKKyAgICB0aGlzLl9yZWFkZXIgPSBudWxsOworICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udFNpemUgPSBudWxsOworICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSA9IG51bGw7CisgICAgdGhpcy5fbGF5b3V0VGV4dEN0eCA9IG51bGw7CisgICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpOworICAgIHRoaXMuX3JlbmRlcmluZ0RvbmUgPSBmYWxzZTsKKyAgICB0aGlzLl9jYW5jZWxlZCA9IGZhbHNlOworICAgIHRoaXMuX2NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5fcmVuZGVyVGltZXIgPSBudWxsOworICAgIHRoaXMuX2JvdW5kcyA9IFtdOworCisgICAgdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlWyJmaW5hbGx5Il0oZnVuY3Rpb24gKCkgeworICAgICAgaWYgKF90aGlzLl9sYXlvdXRUZXh0Q3R4KSB7CisgICAgICAgIF90aGlzLl9sYXlvdXRUZXh0Q3R4LmNhbnZhcy53aWR0aCA9IDA7CisgICAgICAgIF90aGlzLl9sYXlvdXRUZXh0Q3R4LmNhbnZhcy5oZWlnaHQgPSAwOworICAgICAgICBfdGhpcy5fbGF5b3V0VGV4dEN0eCA9IG51bGw7CisgICAgICB9CisgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKCkge30pOworICB9CisKKyAgVGV4dExheWVyUmVuZGVyVGFzay5wcm90b3R5cGUgPSB7CisgICAgZ2V0IHByb21pc2UoKSB7CisgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0sCisKKyAgICBjYW5jZWw6IGZ1bmN0aW9uIFRleHRMYXllcl9jYW5jZWwoKSB7CisgICAgICB0aGlzLl9jYW5jZWxlZCA9IHRydWU7CisKKyAgICAgIGlmICh0aGlzLl9yZWFkZXIpIHsKKyAgICAgICAgdGhpcy5fcmVhZGVyLmNhbmNlbChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC4iKSk7CisKKyAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3JlbmRlclRpbWVyICE9PSBudWxsKSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZW5kZXJUaW1lcik7CisgICAgICAgIHRoaXMuX3JlbmRlclRpbWVyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdGhpcy5fY2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuIikpOworICAgIH0sCisgICAgX3Byb2Nlc3NJdGVtczogZnVuY3Rpb24gX3Byb2Nlc3NJdGVtcyhpdGVtcywgc3R5bGVDYWNoZSkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHRoaXMuX3RleHRDb250ZW50SXRlbXNTdHIucHVzaChpdGVtc1tpXS5zdHIpOworCisgICAgICAgIGFwcGVuZFRleHQodGhpcywgaXRlbXNbaV0sIHN0eWxlQ2FjaGUpOworICAgICAgfQorICAgIH0sCisgICAgX2xheW91dFRleHQ6IGZ1bmN0aW9uIF9sYXlvdXRUZXh0KHRleHREaXYpIHsKKyAgICAgIHZhciB0ZXh0RGl2UHJvcGVydGllcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldCh0ZXh0RGl2KTsKKworICAgICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmlzV2hpdGVzcGFjZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciB0cmFuc2Zvcm0gPSAiIjsKKworICAgICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoICE9PSAwKSB7CisgICAgICAgIHZhciBfdGV4dERpdiRzdHlsZSA9IHRleHREaXYuc3R5bGUsCisgICAgICAgICAgICBmb250U2l6ZSA9IF90ZXh0RGl2JHN0eWxlLmZvbnRTaXplLAorICAgICAgICAgICAgZm9udEZhbWlseSA9IF90ZXh0RGl2JHN0eWxlLmZvbnRGYW1pbHk7CisKKyAgICAgICAgaWYgKGZvbnRTaXplICE9PSB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRTaXplIHx8IGZvbnRGYW1pbHkgIT09IHRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSkgeworICAgICAgICAgIHRoaXMuX2xheW91dFRleHRDdHguZm9udCA9ICIiLmNvbmNhdChmb250U2l6ZSwgIiAiKS5jb25jYXQoZm9udEZhbWlseSk7CisgICAgICAgICAgdGhpcy5fbGF5b3V0VGV4dExhc3RGb250U2l6ZSA9IGZvbnRTaXplOworICAgICAgICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSA9IGZvbnRGYW1pbHk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgX3RoaXMkX2xheW91dFRleHRDdHgkID0gdGhpcy5fbGF5b3V0VGV4dEN0eC5tZWFzdXJlVGV4dCh0ZXh0RGl2LnRleHRDb250ZW50KSwKKyAgICAgICAgICAgIHdpZHRoID0gX3RoaXMkX2xheW91dFRleHRDdHgkLndpZHRoOworCisgICAgICAgIGlmICh3aWR0aCA+IDApIHsKKyAgICAgICAgICB0ZXh0RGl2UHJvcGVydGllcy5zY2FsZSA9IHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoIC8gd2lkdGg7CisgICAgICAgICAgdHJhbnNmb3JtID0gInNjYWxlWCgiLmNvbmNhdCh0ZXh0RGl2UHJvcGVydGllcy5zY2FsZSwgIikiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuYW5nbGUgIT09IDApIHsKKyAgICAgICAgdHJhbnNmb3JtID0gInJvdGF0ZSgiLmNvbmNhdCh0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSwgImRlZykgIikuY29uY2F0KHRyYW5zZm9ybSk7CisgICAgICB9CisKKyAgICAgIGlmICh0cmFuc2Zvcm0ubGVuZ3RoID4gMCkgeworICAgICAgICBpZiAodGhpcy5fZW5oYW5jZVRleHRTZWxlY3Rpb24pIHsKKyAgICAgICAgICB0ZXh0RGl2UHJvcGVydGllcy5vcmlnaW5hbFRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKKyAgICAgICAgfQorCisgICAgICAgIHRleHREaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtOworICAgICAgfQorCisgICAgICB0aGlzLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpOworCisgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGV4dERpdik7CisgICAgfSwKKyAgICBfcmVuZGVyOiBmdW5jdGlvbiBUZXh0TGF5ZXJfcmVuZGVyKHRpbWVvdXQpIHsKKyAgICAgIHZhciBfdGhpczIgPSB0aGlzOworCisgICAgICB2YXIgY2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHZhciBzdHlsZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworCisgICAgICBjYW52YXMubW96T3BhcXVlID0gdHJ1ZTsKKyAgICAgIHRoaXMuX2xheW91dFRleHRDdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CisgICAgICAgIGFscGhhOiBmYWxzZQorICAgICAgfSk7CisKKyAgICAgIGlmICh0aGlzLl90ZXh0Q29udGVudCkgeworICAgICAgICB2YXIgdGV4dEl0ZW1zID0gdGhpcy5fdGV4dENvbnRlbnQuaXRlbXM7CisgICAgICAgIHZhciB0ZXh0U3R5bGVzID0gdGhpcy5fdGV4dENvbnRlbnQuc3R5bGVzOworCisgICAgICAgIHRoaXMuX3Byb2Nlc3NJdGVtcyh0ZXh0SXRlbXMsIHRleHRTdHlsZXMpOworCisgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXh0Q29udGVudFN0cmVhbSkgeworICAgICAgICB2YXIgcHVtcCA9IGZ1bmN0aW9uIHB1bXAoKSB7CisgICAgICAgICAgX3RoaXMyLl9yZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKF9yZWYyKSB7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBfcmVmMi52YWx1ZSwKKyAgICAgICAgICAgICAgICBkb25lID0gX3JlZjIuZG9uZTsKKworICAgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZUNhY2hlLCB2YWx1ZS5zdHlsZXMpOworCisgICAgICAgICAgICBfdGhpczIuX3Byb2Nlc3NJdGVtcyh2YWx1ZS5pdGVtcywgc3R5bGVDYWNoZSk7CisKKyAgICAgICAgICAgIHB1bXAoKTsKKyAgICAgICAgICB9LCBjYXBhYmlsaXR5LnJlamVjdCk7CisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5fcmVhZGVyID0gdGhpcy5fdGV4dENvbnRlbnRTdHJlYW0uZ2V0UmVhZGVyKCk7CisgICAgICAgIHB1bXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVpdGhlciAidGV4dENvbnRlbnQiIG5vciAidGV4dENvbnRlbnRTdHJlYW0iJyArICIgcGFyYW1ldGVycyBzcGVjaWZpZWQuIik7CisgICAgICB9CisKKyAgICAgIGNhcGFiaWxpdHkucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgc3R5bGVDYWNoZSA9IG51bGw7CisKKyAgICAgICAgaWYgKCF0aW1lb3V0KSB7CisgICAgICAgICAgcmVuZGVyKF90aGlzMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX3RoaXMyLl9yZW5kZXJUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmVuZGVyKF90aGlzMik7CisgICAgICAgICAgICBfdGhpczIuX3JlbmRlclRpbWVyID0gbnVsbDsKKyAgICAgICAgICB9LCB0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgfSwgdGhpcy5fY2FwYWJpbGl0eS5yZWplY3QpOworICAgIH0sCisgICAgZXhwYW5kVGV4dERpdnM6IGZ1bmN0aW9uIFRleHRMYXllcl9leHBhbmRUZXh0RGl2cyhleHBhbmREaXZzKSB7CisgICAgICBpZiAoIXRoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uIHx8ICF0aGlzLl9yZW5kZXJpbmdEb25lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2JvdW5kcyAhPT0gbnVsbCkgeworICAgICAgICBleHBhbmQodGhpcyk7CisgICAgICAgIHRoaXMuX2JvdW5kcyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciB0cmFuc2Zvcm1CdWYgPSBbXSwKKyAgICAgICAgICBwYWRkaW5nQnVmID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuX3RleHREaXZzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGRpdiA9IHRoaXMuX3RleHREaXZzW2ldOworCisgICAgICAgIHZhciBkaXZQcm9wcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldChkaXYpOworCisgICAgICAgIGlmIChkaXZQcm9wcy5pc1doaXRlc3BhY2UpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHBhbmREaXZzKSB7CisgICAgICAgICAgdHJhbnNmb3JtQnVmLmxlbmd0aCA9IDA7CisgICAgICAgICAgcGFkZGluZ0J1Zi5sZW5ndGggPSAwOworCisgICAgICAgICAgaWYgKGRpdlByb3BzLm9yaWdpbmFsVHJhbnNmb3JtKSB7CisgICAgICAgICAgICB0cmFuc2Zvcm1CdWYucHVzaChkaXZQcm9wcy5vcmlnaW5hbFRyYW5zZm9ybSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdUb3AgPiAwKSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goIiIuY29uY2F0KGRpdlByb3BzLnBhZGRpbmdUb3AsICJweCIpKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybUJ1Zi5wdXNoKCJ0cmFuc2xhdGVZKCIuY29uY2F0KC1kaXZQcm9wcy5wYWRkaW5nVG9wLCAicHgpIikpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdSaWdodCA+IDApIHsKKyAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaCgiIi5jb25jYXQoZGl2UHJvcHMucGFkZGluZ1JpZ2h0IC8gZGl2UHJvcHMuc2NhbGUsICJweCIpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKDApOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkaXZQcm9wcy5wYWRkaW5nQm90dG9tID4gMCkgeworICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKCIiLmNvbmNhdChkaXZQcm9wcy5wYWRkaW5nQm90dG9tLCAicHgiKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaCgwKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZGl2UHJvcHMucGFkZGluZ0xlZnQgPiAwKSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goIiIuY29uY2F0KGRpdlByb3BzLnBhZGRpbmdMZWZ0IC8gZGl2UHJvcHMuc2NhbGUsICJweCIpKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybUJ1Zi5wdXNoKCJ0cmFuc2xhdGVYKCIuY29uY2F0KC1kaXZQcm9wcy5wYWRkaW5nTGVmdCAvIGRpdlByb3BzLnNjYWxlLCAicHgpIikpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGl2LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nQnVmLmpvaW4oIiAiKTsKKworICAgICAgICAgIGlmICh0cmFuc2Zvcm1CdWYubGVuZ3RoKSB7CisgICAgICAgICAgICBkaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtQnVmLmpvaW4oIiAiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGl2LnN0eWxlLnBhZGRpbmcgPSBudWxsOworICAgICAgICAgIGRpdi5zdHlsZS50cmFuc2Zvcm0gPSBkaXZQcm9wcy5vcmlnaW5hbFRyYW5zZm9ybTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXIocmVuZGVyUGFyYW1ldGVycykgeworICAgIHZhciB0YXNrID0gbmV3IFRleHRMYXllclJlbmRlclRhc2soeworICAgICAgdGV4dENvbnRlbnQ6IHJlbmRlclBhcmFtZXRlcnMudGV4dENvbnRlbnQsCisgICAgICB0ZXh0Q29udGVudFN0cmVhbTogcmVuZGVyUGFyYW1ldGVycy50ZXh0Q29udGVudFN0cmVhbSwKKyAgICAgIGNvbnRhaW5lcjogcmVuZGVyUGFyYW1ldGVycy5jb250YWluZXIsCisgICAgICB2aWV3cG9ydDogcmVuZGVyUGFyYW1ldGVycy52aWV3cG9ydCwKKyAgICAgIHRleHREaXZzOiByZW5kZXJQYXJhbWV0ZXJzLnRleHREaXZzLAorICAgICAgdGV4dENvbnRlbnRJdGVtc1N0cjogcmVuZGVyUGFyYW1ldGVycy50ZXh0Q29udGVudEl0ZW1zU3RyLAorICAgICAgZW5oYW5jZVRleHRTZWxlY3Rpb246IHJlbmRlclBhcmFtZXRlcnMuZW5oYW5jZVRleHRTZWxlY3Rpb24KKyAgICB9KTsKKworICAgIHRhc2suX3JlbmRlcihyZW5kZXJQYXJhbWV0ZXJzLnRpbWVvdXQpOworCisgICAgcmV0dXJuIHRhc2s7CisgIH0KKworICByZXR1cm4gcmVuZGVyVGV4dExheWVyOworfSgpOworCitleHBvcnRzLnJlbmRlclRleHRMYXllciA9IHJlbmRlclRleHRMYXllcjsKKworLyoqKi8gfSksCisvKiAyMTggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5TVkdHcmFwaGljcyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTsKKwordmFyIF9pc19ub2RlID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKKworZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9CisKK2Z1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0KKworZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfQorCitmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9CisKK2Z1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9CisKK2Z1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0KKworZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pWyJyZXR1cm4iXSAhPSBudWxsKSBfaVsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9CisKK2Z1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfQorCitmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgdGhyb3cgX2UyOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMykgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTM7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFsicmV0dXJuIl0gIT0gbnVsbCkgaXRbInJldHVybiJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH0KKworZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KKworZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgU1ZHR3JhcGhpY3MgPSBmdW5jdGlvbiBTVkdHcmFwaGljcygpIHsKKyAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IFNWR0dyYXBoaWNzIik7Cit9OworCitleHBvcnRzLlNWR0dyYXBoaWNzID0gU1ZHR3JhcGhpY3M7Cit7CisgIHZhciBvcExpc3RUb1RyZWUgPSBmdW5jdGlvbiBvcExpc3RUb1RyZWUob3BMaXN0KSB7CisgICAgdmFyIG9wVHJlZSA9IFtdOworICAgIHZhciB0bXAgPSBbXTsKKworICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvcExpc3QpLAorICAgICAgICBfc3RlcDsKKworICAgIHRyeSB7CisgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgeworICAgICAgICB2YXIgb3BMaXN0RWxlbWVudCA9IF9zdGVwLnZhbHVlOworCisgICAgICAgIGlmIChvcExpc3RFbGVtZW50LmZuID09PSAic2F2ZSIpIHsKKyAgICAgICAgICBvcFRyZWUucHVzaCh7CisgICAgICAgICAgICBmbklkOiA5MiwKKyAgICAgICAgICAgIGZuOiAiZ3JvdXAiLAorICAgICAgICAgICAgaXRlbXM6IFtdCisgICAgICAgICAgfSk7CisgICAgICAgICAgdG1wLnB1c2gob3BUcmVlKTsKKyAgICAgICAgICBvcFRyZWUgPSBvcFRyZWVbb3BUcmVlLmxlbmd0aCAtIDFdLml0ZW1zOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wTGlzdEVsZW1lbnQuZm4gPT09ICJyZXN0b3JlIikgeworICAgICAgICAgIG9wVHJlZSA9IHRtcC5wb3AoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvcFRyZWUucHVzaChvcExpc3RFbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgX2l0ZXJhdG9yLmYoKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3BUcmVlOworICB9OworCisgIHZhciBwZiA9IGZ1bmN0aW9uIHBmKHZhbHVlKSB7CisgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CisgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICB2YXIgcyA9IHZhbHVlLnRvRml4ZWQoMTApOworICAgIHZhciBpID0gcy5sZW5ndGggLSAxOworCisgICAgaWYgKHNbaV0gIT09ICIwIikgeworICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgZG8geworICAgICAgaS0tOworICAgIH0gd2hpbGUgKHNbaV0gPT09ICIwIik7CisKKyAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgc1tpXSA9PT0gIi4iID8gaSA6IGkgKyAxKTsKKyAgfTsKKworICB2YXIgcG0gPSBmdW5jdGlvbiBwbShtKSB7CisgICAgaWYgKG1bNF0gPT09IDAgJiYgbVs1XSA9PT0gMCkgeworICAgICAgaWYgKG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCkgeworICAgICAgICBpZiAobVswXSA9PT0gMSAmJiBtWzNdID09PSAxKSB7CisgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICJzY2FsZSgiLmNvbmNhdChwZihtWzBdKSwgIiAiKS5jb25jYXQocGYobVszXSksICIpIik7CisgICAgICB9CisKKyAgICAgIGlmIChtWzBdID09PSBtWzNdICYmIG1bMV0gPT09IC1tWzJdKSB7CisgICAgICAgIHZhciBhID0gTWF0aC5hY29zKG1bMF0pICogMTgwIC8gTWF0aC5QSTsKKyAgICAgICAgcmV0dXJuICJyb3RhdGUoIi5jb25jYXQocGYoYSksICIpIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtWzBdID09PSAxICYmIG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCAmJiBtWzNdID09PSAxKSB7CisgICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIuY29uY2F0KHBmKG1bNF0pLCAiICIpLmNvbmNhdChwZihtWzVdKSwgIikiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gIm1hdHJpeCgiLmNvbmNhdChwZihtWzBdKSwgIiAiKS5jb25jYXQocGYobVsxXSksICIgIikuY29uY2F0KHBmKG1bMl0pLCAiICIpLmNvbmNhdChwZihtWzNdKSwgIiAiKS5jb25jYXQocGYobVs0XSksICIgIikgKyAiIi5jb25jYXQocGYobVs1XSksICIpIik7CisgIH07CisKKyAgdmFyIFNWR19ERUZBVUxUUyA9IHsKKyAgICBmb250U3R5bGU6ICJub3JtYWwiLAorICAgIGZvbnRXZWlnaHQ6ICJub3JtYWwiLAorICAgIGZpbGxDb2xvcjogIiMwMDAwMDAiCisgIH07CisgIHZhciBYTUxfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKKyAgdmFyIFhMSU5LX05TID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiOworICB2YXIgTElORV9DQVBfU1RZTEVTID0gWyJidXR0IiwgInJvdW5kIiwgInNxdWFyZSJdOworICB2YXIgTElORV9KT0lOX1NUWUxFUyA9IFsibWl0ZXIiLCAicm91bmQiLCAiYmV2ZWwiXTsKKworICB2YXIgY29udmVydEltZ0RhdGFUb1BuZyA9IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgUE5HX0hFQURFUiA9IG5ldyBVaW50OEFycmF5KFsweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhXSk7CisgICAgdmFyIENIVU5LX1dSQVBQRVJfU0laRSA9IDEyOworICAgIHZhciBjcmNUYWJsZSA9IG5ldyBJbnQzMkFycmF5KDI1Nik7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICB2YXIgYyA9IGk7CisKKyAgICAgIGZvciAodmFyIGggPSAwOyBoIDwgODsgaCsrKSB7CisgICAgICAgIGlmIChjICYgMSkgeworICAgICAgICAgIGMgPSAweGVkYjg4MzIwIF4gYyA+PiAxICYgMHg3ZmZmZmZmZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjID0gYyA+PiAxICYgMHg3ZmZmZmZmZjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjcmNUYWJsZVtpXSA9IGM7CisgICAgfQorCisgICAgZnVuY3Rpb24gY3JjMzIoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIGNyYyA9IC0xOworCisgICAgICBmb3IgKHZhciBfaSA9IHN0YXJ0OyBfaSA8IGVuZDsgX2krKykgeworICAgICAgICB2YXIgYSA9IChjcmMgXiBkYXRhW19pXSkgJiAweGZmOworICAgICAgICB2YXIgYiA9IGNyY1RhYmxlW2FdOworICAgICAgICBjcmMgPSBjcmMgPj4+IDggXiBiOworICAgICAgfQorCisgICAgICByZXR1cm4gY3JjIF4gLTE7CisgICAgfQorCisgICAgZnVuY3Rpb24gd3JpdGVQbmdDaHVuayh0eXBlLCBib2R5LCBkYXRhLCBvZmZzZXQpIHsKKyAgICAgIHZhciBwID0gb2Zmc2V0OworICAgICAgdmFyIGxlbiA9IGJvZHkubGVuZ3RoOworICAgICAgZGF0YVtwXSA9IGxlbiA+PiAyNCAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAxXSA9IGxlbiA+PiAxNiAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAyXSA9IGxlbiA+PiA4ICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDNdID0gbGVuICYgMHhmZjsKKyAgICAgIHAgKz0gNDsKKyAgICAgIGRhdGFbcF0gPSB0eXBlLmNoYXJDb2RlQXQoMCkgJiAweGZmOworICAgICAgZGF0YVtwICsgMV0gPSB0eXBlLmNoYXJDb2RlQXQoMSkgJiAweGZmOworICAgICAgZGF0YVtwICsgMl0gPSB0eXBlLmNoYXJDb2RlQXQoMikgJiAweGZmOworICAgICAgZGF0YVtwICsgM10gPSB0eXBlLmNoYXJDb2RlQXQoMykgJiAweGZmOworICAgICAgcCArPSA0OworICAgICAgZGF0YS5zZXQoYm9keSwgcCk7CisgICAgICBwICs9IGJvZHkubGVuZ3RoOworICAgICAgdmFyIGNyYyA9IGNyYzMyKGRhdGEsIG9mZnNldCArIDQsIHApOworICAgICAgZGF0YVtwXSA9IGNyYyA+PiAyNCAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAxXSA9IGNyYyA+PiAxNiAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAyXSA9IGNyYyA+PiA4ICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDNdID0gY3JjICYgMHhmZjsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBhZGxlcjMyKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIHZhciBhID0gMTsKKyAgICAgIHZhciBiID0gMDsKKworICAgICAgZm9yICh2YXIgX2kyID0gc3RhcnQ7IF9pMiA8IGVuZDsgKytfaTIpIHsKKyAgICAgICAgYSA9IChhICsgKGRhdGFbX2kyXSAmIDB4ZmYpKSAlIDY1NTIxOworICAgICAgICBiID0gKGIgKyBhKSAlIDY1NTIxOworICAgICAgfQorCisgICAgICByZXR1cm4gYiA8PCAxNiB8IGE7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmMobGl0ZXJhbHMpIHsKKyAgICAgIGlmICghX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgcmV0dXJuIGRlZmxhdGVTeW5jVW5jb21wcmVzc2VkKGxpdGVyYWxzKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgdmFyIGlucHV0OworCisgICAgICAgIGlmIChwYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUpID49IDgpIHsKKyAgICAgICAgICBpbnB1dCA9IGxpdGVyYWxzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlucHV0ID0gQnVmZmVyLmZyb20obGl0ZXJhbHMpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG91dHB1dCA9IHJlcXVpcmUoInpsaWIiKS5kZWZsYXRlU3luYyhpbnB1dCwgeworICAgICAgICAgIGxldmVsOiA5CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBvdXRwdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gb3V0cHV0IDogbmV3IFVpbnQ4QXJyYXkob3V0cHV0KTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJOb3QgY29tcHJlc3NpbmcgUE5HIGJlY2F1c2UgemxpYi5kZWZsYXRlU3luYyBpcyB1bmF2YWlsYWJsZTogIiArIGUpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQobGl0ZXJhbHMpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlZmxhdGVTeW5jVW5jb21wcmVzc2VkKGxpdGVyYWxzKSB7CisgICAgICB2YXIgbGVuID0gbGl0ZXJhbHMubGVuZ3RoOworICAgICAgdmFyIG1heEJsb2NrTGVuZ3RoID0gMHhmZmZmOworICAgICAgdmFyIGRlZmxhdGVCbG9ja3MgPSBNYXRoLmNlaWwobGVuIC8gbWF4QmxvY2tMZW5ndGgpOworICAgICAgdmFyIGlkYXQgPSBuZXcgVWludDhBcnJheSgyICsgbGVuICsgZGVmbGF0ZUJsb2NrcyAqIDUgKyA0KTsKKyAgICAgIHZhciBwaSA9IDA7CisgICAgICBpZGF0W3BpKytdID0gMHg3ODsKKyAgICAgIGlkYXRbcGkrK10gPSAweDljOworICAgICAgdmFyIHBvcyA9IDA7CisKKyAgICAgIHdoaWxlIChsZW4gPiBtYXhCbG9ja0xlbmd0aCkgeworICAgICAgICBpZGF0W3BpKytdID0gMHgwMDsKKyAgICAgICAgaWRhdFtwaSsrXSA9IDB4ZmY7CisgICAgICAgIGlkYXRbcGkrK10gPSAweGZmOworICAgICAgICBpZGF0W3BpKytdID0gMHgwMDsKKyAgICAgICAgaWRhdFtwaSsrXSA9IDB4MDA7CisgICAgICAgIGlkYXQuc2V0KGxpdGVyYWxzLnN1YmFycmF5KHBvcywgcG9zICsgbWF4QmxvY2tMZW5ndGgpLCBwaSk7CisgICAgICAgIHBpICs9IG1heEJsb2NrTGVuZ3RoOworICAgICAgICBwb3MgKz0gbWF4QmxvY2tMZW5ndGg7CisgICAgICAgIGxlbiAtPSBtYXhCbG9ja0xlbmd0aDsKKyAgICAgIH0KKworICAgICAgaWRhdFtwaSsrXSA9IDB4MDE7CisgICAgICBpZGF0W3BpKytdID0gbGVuICYgMHhmZjsKKyAgICAgIGlkYXRbcGkrK10gPSBsZW4gPj4gOCAmIDB4ZmY7CisgICAgICBpZGF0W3BpKytdID0gfmxlbiAmIDB4ZmZmZiAmIDB4ZmY7CisgICAgICBpZGF0W3BpKytdID0gKH5sZW4gJiAweGZmZmYpID4+IDggJiAweGZmOworICAgICAgaWRhdC5zZXQobGl0ZXJhbHMuc3ViYXJyYXkocG9zKSwgcGkpOworICAgICAgcGkgKz0gbGl0ZXJhbHMubGVuZ3RoIC0gcG9zOworICAgICAgdmFyIGFkbGVyID0gYWRsZXIzMihsaXRlcmFscywgMCwgbGl0ZXJhbHMubGVuZ3RoKTsKKyAgICAgIGlkYXRbcGkrK10gPSBhZGxlciA+PiAyNCAmIDB4ZmY7CisgICAgICBpZGF0W3BpKytdID0gYWRsZXIgPj4gMTYgJiAweGZmOworICAgICAgaWRhdFtwaSsrXSA9IGFkbGVyID4+IDggJiAweGZmOworICAgICAgaWRhdFtwaSsrXSA9IGFkbGVyICYgMHhmZjsKKyAgICAgIHJldHVybiBpZGF0OworICAgIH0KKworICAgIGZ1bmN0aW9uIGVuY29kZShpbWdEYXRhLCBraW5kLCBmb3JjZURhdGFTY2hlbWEsIGlzTWFzaykgeworICAgICAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aDsKKyAgICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgICAgIHZhciBiaXREZXB0aCwgY29sb3JUeXBlLCBsaW5lU2l6ZTsKKyAgICAgIHZhciBieXRlcyA9IGltZ0RhdGEuZGF0YTsKKworICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOgorICAgICAgICAgIGNvbG9yVHlwZSA9IDA7CisgICAgICAgICAgYml0RGVwdGggPSAxOworICAgICAgICAgIGxpbmVTaXplID0gd2lkdGggKyA3ID4+IDM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQOgorICAgICAgICAgIGNvbG9yVHlwZSA9IDI7CisgICAgICAgICAgYml0RGVwdGggPSA4OworICAgICAgICAgIGxpbmVTaXplID0gd2lkdGggKiAzOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX3V0aWwuSW1hZ2VLaW5kLlJHQkFfMzJCUFA6CisgICAgICAgICAgY29sb3JUeXBlID0gNjsKKyAgICAgICAgICBiaXREZXB0aCA9IDg7CisgICAgICAgICAgbGluZVNpemUgPSB3aWR0aCAqIDQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0Iik7CisgICAgICB9CisKKyAgICAgIHZhciBsaXRlcmFscyA9IG5ldyBVaW50OEFycmF5KCgxICsgbGluZVNpemUpICogaGVpZ2h0KTsKKyAgICAgIHZhciBvZmZzZXRMaXRlcmFscyA9IDAsCisgICAgICAgICAgb2Zmc2V0Qnl0ZXMgPSAwOworCisgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGxpdGVyYWxzW29mZnNldExpdGVyYWxzKytdID0gMDsKKyAgICAgICAgbGl0ZXJhbHMuc2V0KGJ5dGVzLnN1YmFycmF5KG9mZnNldEJ5dGVzLCBvZmZzZXRCeXRlcyArIGxpbmVTaXplKSwgb2Zmc2V0TGl0ZXJhbHMpOworICAgICAgICBvZmZzZXRCeXRlcyArPSBsaW5lU2l6ZTsKKyAgICAgICAgb2Zmc2V0TGl0ZXJhbHMgKz0gbGluZVNpemU7CisgICAgICB9CisKKyAgICAgIGlmIChraW5kID09PSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgJiYgaXNNYXNrKSB7CisgICAgICAgIG9mZnNldExpdGVyYWxzID0gMDsKKworICAgICAgICBmb3IgKHZhciBfeSA9IDA7IF95IDwgaGVpZ2h0OyBfeSsrKSB7CisgICAgICAgICAgb2Zmc2V0TGl0ZXJhbHMrKzsKKworICAgICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGxpbmVTaXplOyBfaTMrKykgeworICAgICAgICAgICAgbGl0ZXJhbHNbb2Zmc2V0TGl0ZXJhbHMrK10gXj0gMHhmZjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGloZHIgPSBuZXcgVWludDhBcnJheShbd2lkdGggPj4gMjQgJiAweGZmLCB3aWR0aCA+PiAxNiAmIDB4ZmYsIHdpZHRoID4+IDggJiAweGZmLCB3aWR0aCAmIDB4ZmYsIGhlaWdodCA+PiAyNCAmIDB4ZmYsIGhlaWdodCA+PiAxNiAmIDB4ZmYsIGhlaWdodCA+PiA4ICYgMHhmZiwgaGVpZ2h0ICYgMHhmZiwgYml0RGVwdGgsIGNvbG9yVHlwZSwgMHgwMCwgMHgwMCwgMHgwMF0pOworICAgICAgdmFyIGlkYXQgPSBkZWZsYXRlU3luYyhsaXRlcmFscyk7CisgICAgICB2YXIgcG5nTGVuZ3RoID0gUE5HX0hFQURFUi5sZW5ndGggKyBDSFVOS19XUkFQUEVSX1NJWkUgKiAzICsgaWhkci5sZW5ndGggKyBpZGF0Lmxlbmd0aDsKKyAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocG5nTGVuZ3RoKTsKKyAgICAgIHZhciBvZmZzZXQgPSAwOworICAgICAgZGF0YS5zZXQoUE5HX0hFQURFUiwgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCArPSBQTkdfSEVBREVSLmxlbmd0aDsKKyAgICAgIHdyaXRlUG5nQ2h1bmsoIklIRFIiLCBpaGRyLCBkYXRhLCBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IENIVU5LX1dSQVBQRVJfU0laRSArIGloZHIubGVuZ3RoOworICAgICAgd3JpdGVQbmdDaHVuaygiSURBVEEiLCBpZGF0LCBkYXRhLCBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IENIVU5LX1dSQVBQRVJfU0laRSArIGlkYXQubGVuZ3RoOworICAgICAgd3JpdGVQbmdDaHVuaygiSUVORCIsIG5ldyBVaW50OEFycmF5KDApLCBkYXRhLCBvZmZzZXQpOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5jcmVhdGVPYmplY3RVUkwpKGRhdGEsICJpbWFnZS9wbmciLCBmb3JjZURhdGFTY2hlbWEpOworICAgIH0KKworICAgIHJldHVybiBmdW5jdGlvbiBjb252ZXJ0SW1nRGF0YVRvUG5nKGltZ0RhdGEsIGZvcmNlRGF0YVNjaGVtYSwgaXNNYXNrKSB7CisgICAgICB2YXIga2luZCA9IGltZ0RhdGEua2luZCA9PT0gdW5kZWZpbmVkID8gX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQIDogaW1nRGF0YS5raW5kOworICAgICAgcmV0dXJuIGVuY29kZShpbWdEYXRhLCBraW5kLCBmb3JjZURhdGFTY2hlbWEsIGlzTWFzayk7CisgICAgfTsKKyAgfSgpOworCisgIHZhciBTVkdFeHRyYVN0YXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgICBmdW5jdGlvbiBTVkdFeHRyYVN0YXRlKCkgeworICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNWR0V4dHJhU3RhdGUpOworCisgICAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxOworICAgICAgdGhpcy5mb250V2VpZ2h0ID0gU1ZHX0RFRkFVTFRTLmZvbnRXZWlnaHQ7CisgICAgICB0aGlzLmZvbnRTaXplID0gMDsKKyAgICAgIHRoaXMudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICAgIHRoaXMuZm9udE1hdHJpeCA9IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgdGhpcy5sZWFkaW5nID0gMDsKKyAgICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMOworICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxOworICAgICAgdGhpcy54ID0gMDsKKyAgICAgIHRoaXMueSA9IDA7CisgICAgICB0aGlzLmxpbmVYID0gMDsKKyAgICAgIHRoaXMubGluZVkgPSAwOworICAgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7CisgICAgICB0aGlzLndvcmRTcGFjaW5nID0gMDsKKyAgICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7CisgICAgICB0aGlzLnRleHRSaXNlID0gMDsKKyAgICAgIHRoaXMuZmlsbENvbG9yID0gU1ZHX0RFRkFVTFRTLmZpbGxDb2xvcjsKKyAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSAiIzAwMDAwMCI7CisgICAgICB0aGlzLmZpbGxBbHBoYSA9IDE7CisgICAgICB0aGlzLnN0cm9rZUFscGhhID0gMTsKKyAgICAgIHRoaXMubGluZVdpZHRoID0gMTsKKyAgICAgIHRoaXMubGluZUpvaW4gPSAiIjsKKyAgICAgIHRoaXMubGluZUNhcCA9ICIiOworICAgICAgdGhpcy5taXRlckxpbWl0ID0gMDsKKyAgICAgIHRoaXMuZGFzaEFycmF5ID0gW107CisgICAgICB0aGlzLmRhc2hQaGFzZSA9IDA7CisgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdOworICAgICAgdGhpcy5hY3RpdmVDbGlwVXJsID0gbnVsbDsKKyAgICAgIHRoaXMuY2xpcEdyb3VwID0gbnVsbDsKKyAgICAgIHRoaXMubWFza0lkID0gIiI7CisgICAgfQorCisgICAgX2NyZWF0ZUNsYXNzKFNWR0V4dHJhU3RhdGUsIFt7CisgICAgICBrZXk6ICJjbG9uZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoKSB7CisgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNldEN1cnJlbnRQb2ludCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q3VycmVudFBvaW50KHgsIHkpIHsKKyAgICAgICAgdGhpcy54ID0geDsKKyAgICAgICAgdGhpcy55ID0geTsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gU1ZHRXh0cmFTdGF0ZTsKKyAgfSgpOworCisgIHZhciBjbGlwQ291bnQgPSAwOworICB2YXIgbWFza0NvdW50ID0gMDsKKyAgdmFyIHNoYWRpbmdDb3VudCA9IDA7CisKKyAgZXhwb3J0cy5TVkdHcmFwaGljcyA9IFNWR0dyYXBoaWNzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgICBmdW5jdGlvbiBTVkdHcmFwaGljcyhjb21tb25PYmpzLCBvYmpzKSB7CisgICAgICB2YXIgZm9yY2VEYXRhU2NoZW1hID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTsKKworICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNWR0dyYXBoaWNzKTsKKworICAgICAgdGhpcy5zdmdGYWN0b3J5ID0gbmV3IF9kaXNwbGF5X3V0aWxzLkRPTVNWR0ZhY3RvcnkoKTsKKyAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBTVkdFeHRyYVN0YXRlKCk7CisgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sgPSBbXTsKKyAgICAgIHRoaXMuZXh0cmFTdGFjayA9IFtdOworICAgICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqczsKKyAgICAgIHRoaXMub2JqcyA9IG9ianM7CisgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDsKKyAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlOworICAgICAgdGhpcy5lbWJlZEZvbnRzID0gZmFsc2U7CisgICAgICB0aGlzLmVtYmVkZGVkRm9udHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgdGhpcy5jc3NTdHlsZSA9IG51bGw7CisgICAgICB0aGlzLmZvcmNlRGF0YVNjaGVtYSA9ICEhZm9yY2VEYXRhU2NoZW1hOworICAgICAgdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmcgPSBbXTsKKworICAgICAgZm9yICh2YXIgb3AgaW4gX3V0aWwuT1BTKSB7CisgICAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nW191dGlsLk9QU1tvcF1dID0gb3A7CisgICAgICB9CisgICAgfQorCisgICAgX2NyZWF0ZUNsYXNzKFNWR0dyYXBoaWNzLCBbeworICAgICAga2V5OiAic2F2ZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2F2ZSgpIHsKKyAgICAgICAgdGhpcy50cmFuc2Zvcm1TdGFjay5wdXNoKHRoaXMudHJhbnNmb3JtTWF0cml4KTsKKyAgICAgICAgdmFyIG9sZCA9IHRoaXMuY3VycmVudDsKKyAgICAgICAgdGhpcy5leHRyYVN0YWNrLnB1c2gob2xkKTsKKyAgICAgICAgdGhpcy5jdXJyZW50ID0gb2xkLmNsb25lKCk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAicmVzdG9yZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVzdG9yZSgpIHsKKyAgICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSB0aGlzLnRyYW5zZm9ybVN0YWNrLnBvcCgpOworICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmV4dHJhU3RhY2sucG9wKCk7CisgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsOworICAgICAgICB0aGlzLnRncnAgPSBudWxsOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImdyb3VwIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBncm91cChpdGVtcykgeworICAgICAgICB0aGlzLnNhdmUoKTsKKyAgICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKGl0ZW1zKTsKKyAgICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAibG9hZERlcGVuZGVuY2llcyIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZERlcGVuZGVuY2llcyhvcGVyYXRvckxpc3QpIHsKKyAgICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgICB2YXIgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5OworICAgICAgICB2YXIgYXJnc0FycmF5ID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheTsKKworICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLmRlcGVuZGVuY3kpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYXJnc0FycmF5W2ldKSwKKyAgICAgICAgICAgICAgX3N0ZXAyOworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkgeworICAgICAgICAgICAgICB2YXIgb2JqID0gX3N0ZXAyLnZhbHVlOworICAgICAgICAgICAgICB2YXIgb2Jqc1Bvb2wgPSBvYmouc3RhcnRzV2l0aCgiZ18iKSA/IF90aGlzLmNvbW1vbk9ianMgOiBfdGhpcy5vYmpzOworICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgICAgICAgICAgb2Jqc1Bvb2wuZ2V0KG9iaiwgcmVzb2x2ZSk7CisgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgIF90aGlzLmN1cnJlbnQuZGVwZW5kZW5jaWVzLnB1c2gocHJvbWlzZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykgeworICAgICAgICAgICAgICBfbG9vcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9pdGVyYXRvcjIuZigpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzLmN1cnJlbnQuZGVwZW5kZW5jaWVzKTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJ0cmFuc2Zvcm0iLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7CisgICAgICAgIHZhciB0cmFuc2Zvcm1NYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07CisgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGhpcy50cmFuc2Zvcm1NYXRyaXgsIHRyYW5zZm9ybU1hdHJpeCk7CisgICAgICAgIHRoaXMudGdycCA9IG51bGw7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiZ2V0U1ZHIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTVkcob3BlcmF0b3JMaXN0LCB2aWV3cG9ydCkgeworICAgICAgICB2YXIgX3RoaXMyID0gdGhpczsKKworICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7CisKKyAgICAgICAgdmFyIHN2Z0VsZW1lbnQgPSB0aGlzLl9pbml0aWFsaXplKHZpZXdwb3J0KTsKKworICAgICAgICByZXR1cm4gdGhpcy5sb2FkRGVwZW5kZW5jaWVzKG9wZXJhdG9yTGlzdCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgX3RoaXMyLnRyYW5zZm9ybU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKworICAgICAgICAgIF90aGlzMi5leGVjdXRlT3BUcmVlKF90aGlzMi5jb252ZXJ0T3BMaXN0KG9wZXJhdG9yTGlzdCkpOworCisgICAgICAgICAgcmV0dXJuIHN2Z0VsZW1lbnQ7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImNvbnZlcnRPcExpc3QiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSB7CisgICAgICAgIHZhciBvcGVyYXRvcklkTWFwcGluZyA9IHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nOworICAgICAgICB2YXIgYXJnc0FycmF5ID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheTsKKyAgICAgICAgdmFyIGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTsKKyAgICAgICAgdmFyIG9wTGlzdCA9IFtdOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIHZhciBmbklkID0gZm5BcnJheVtpXTsKKyAgICAgICAgICBvcExpc3QucHVzaCh7CisgICAgICAgICAgICBmbklkOiBmbklkLAorICAgICAgICAgICAgZm46IG9wZXJhdG9ySWRNYXBwaW5nW2ZuSWRdLAorICAgICAgICAgICAgYXJnczogYXJnc0FycmF5W2ldCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3BMaXN0VG9UcmVlKG9wTGlzdCk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiZXhlY3V0ZU9wVHJlZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZXhlY3V0ZU9wVHJlZShvcFRyZWUpIHsKKyAgICAgICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvcFRyZWUpLAorICAgICAgICAgICAgX3N0ZXAzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBvcFRyZWVFbGVtZW50ID0gX3N0ZXAzLnZhbHVlOworICAgICAgICAgICAgdmFyIGZuID0gb3BUcmVlRWxlbWVudC5mbjsKKyAgICAgICAgICAgIHZhciBmbklkID0gb3BUcmVlRWxlbWVudC5mbklkOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBvcFRyZWVFbGVtZW50LmFyZ3M7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZm5JZCB8IDApIHsKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5UZXh0OgorICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5UZXh0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZGVwZW5kZW5jeToKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMZWFkaW5nOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0TGVhZGluZyhhcmdzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMZWFkaW5nTW92ZVRleHQ6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRMZWFkaW5nTW92ZVRleHQoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0Rm9udDoKKyAgICAgICAgICAgICAgICB0aGlzLnNldEZvbnQoYXJncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hvd1RleHQ6CisgICAgICAgICAgICAgICAgdGhpcy5zaG93VGV4dChhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93U3BhY2VkVGV4dDoKKyAgICAgICAgICAgICAgICB0aGlzLnNob3dUZXh0KGFyZ3NbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZFRleHQ6CisgICAgICAgICAgICAgICAgdGhpcy5lbmRUZXh0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRleHQ6CisgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVGV4dChhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZzoKKyAgICAgICAgICAgICAgICB0aGlzLnNldENoYXJTcGFjaW5nKGFyZ3NbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFdvcmRTcGFjaW5nOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0V29yZFNwYWNpbmcoYXJnc1swXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0SFNjYWxlOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0SFNjYWxlKGFyZ3NbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRNYXRyaXg6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0TWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRSaXNlOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0VGV4dFJpc2UoYXJnc1swXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0UmVuZGVyaW5nTW9kZShhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMaW5lV2lkdGg6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgoYXJnc1swXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGluZUpvaW46CisgICAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMaW5lQ2FwOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRNaXRlckxpbWl0OgorICAgICAgICAgICAgICAgIHRoaXMuc2V0TWl0ZXJMaW1pdChhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRGaWxsUkdCQ29sb3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VSR0JDb2xvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDb2xvck46CisgICAgICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VDb2xvck4oYXJncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbENvbG9yTjoKKyAgICAgICAgICAgICAgICB0aGlzLnNldEZpbGxDb2xvck4oYXJncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hhZGluZ0ZpbGw6CisgICAgICAgICAgICAgICAgdGhpcy5zaGFkaW5nRmlsbChhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXREYXNoOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0RGFzaChhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRSZW5kZXJpbmdJbnRlbnQ6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQoYXJnc1swXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmxhdG5lc3M6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRGbGF0bmVzcyhhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRHU3RhdGU6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRHU3RhdGUoYXJnc1swXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZmlsbDoKKyAgICAgICAgICAgICAgICB0aGlzLmZpbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lb0ZpbGw6CisgICAgICAgICAgICAgICAgdGhpcy5lb0ZpbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zdHJva2U6CisgICAgICAgICAgICAgICAgdGhpcy5zdHJva2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5maWxsU3Ryb2tlOgorICAgICAgICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVvRmlsbFN0cm9rZToKKyAgICAgICAgICAgICAgICB0aGlzLmVvRmlsbFN0cm9rZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsaXA6CisgICAgICAgICAgICAgICAgdGhpcy5jbGlwKCJub256ZXJvIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW9DbGlwOgorICAgICAgICAgICAgICAgIHRoaXMuY2xpcCgiZXZlbm9kZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazoKKyAgICAgICAgICAgICAgICB0aGlzLnBhaW50U29saWRDb2xvckltYWdlTWFzaygpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0OgorICAgICAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZVhPYmplY3QoYXJnc1swXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6CisgICAgICAgICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q6CisgICAgICAgICAgICAgICAgdGhpcy5wYWludEltYWdlTWFza1hPYmplY3QoYXJnc1swXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luOgorICAgICAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEJlZ2luKGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQ6CisgICAgICAgICAgICAgICAgdGhpcy5wYWludEZvcm1YT2JqZWN0RW5kKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY2xvc2VQYXRoOgorICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY2xvc2VTdHJva2U6CisgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVN0cm9rZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlRmlsbFN0cm9rZToKKyAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRmlsbFN0cm9rZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlRU9GaWxsU3Ryb2tlOgorICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VFT0ZpbGxTdHJva2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5uZXh0TGluZToKKyAgICAgICAgICAgICAgICB0aGlzLm5leHRMaW5lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMudHJhbnNmb3JtOgorICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNvbnN0cnVjdFBhdGg6CisgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RQYXRoKGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZFBhdGg6CisgICAgICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSA5MjoKKyAgICAgICAgICAgICAgICB0aGlzLmdyb3VwKG9wVHJlZUVsZW1lbnQuaXRlbXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmltcGxlbWVudGVkIG9wZXJhdG9yICIuY29uY2F0KGZuKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3IzLmYoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNldFdvcmRTcGFjaW5nIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRXb3JkU3BhY2luZyh3b3JkU3BhY2luZykgeworICAgICAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZzsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXRDaGFyU3BhY2luZyIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q2hhclNwYWNpbmcoY2hhclNwYWNpbmcpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gY2hhclNwYWNpbmc7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAibmV4dExpbmUiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIG5leHRMaW5lKCkgeworICAgICAgICB0aGlzLm1vdmVUZXh0KDAsIHRoaXMuY3VycmVudC5sZWFkaW5nKTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXRUZXh0TWF0cml4IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICAgIGN1cnJlbnQudGV4dE1hdHJpeCA9IGN1cnJlbnQubGluZU1hdHJpeCA9IFthLCBiLCBjLCBkLCBlLCBmXTsKKyAgICAgICAgY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7CisgICAgICAgIGN1cnJlbnQueCA9IGN1cnJlbnQubGluZVggPSAwOworICAgICAgICBjdXJyZW50LnkgPSBjdXJyZW50LmxpbmVZID0gMDsKKyAgICAgICAgY3VycmVudC54Y29vcmRzID0gW107CisgICAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdOworICAgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpOworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LWZhbWlseSIsIGN1cnJlbnQuZm9udEZhbWlseSk7CisgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZvbnQtc2l6ZSIsICIiLmNvbmNhdChwZihjdXJyZW50LmZvbnRTaXplKSwgInB4IikpOworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgcGYoLWN1cnJlbnQueSkpOworICAgICAgICBjdXJyZW50LnR4dEVsZW1lbnQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRleHQiKTsKKyAgICAgICAgY3VycmVudC50eHRFbGVtZW50LmFwcGVuZENoaWxkKGN1cnJlbnQudHNwYW4pOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImJlZ2luVGV4dCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gYmVnaW5UZXh0KCkgeworICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgICAgY3VycmVudC54ID0gY3VycmVudC5saW5lWCA9IDA7CisgICAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgPSAwOworICAgICAgICBjdXJyZW50LnRleHRNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7CisgICAgICAgIGN1cnJlbnQubGluZU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICAgICAgY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxOworICAgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpOworICAgICAgICBjdXJyZW50LnR4dEVsZW1lbnQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRleHQiKTsKKyAgICAgICAgY3VycmVudC50eHRncnAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTsKKyAgICAgICAgY3VycmVudC54Y29vcmRzID0gW107CisgICAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogIm1vdmVUZXh0IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlVGV4dCh4LCB5KSB7CisgICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgICBjdXJyZW50LnggPSBjdXJyZW50LmxpbmVYICs9IHg7CisgICAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgKz0geTsKKyAgICAgICAgY3VycmVudC54Y29vcmRzID0gW107CisgICAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdOworICAgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpOworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LWZhbWlseSIsIGN1cnJlbnQuZm9udEZhbWlseSk7CisgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZvbnQtc2l6ZSIsICIiLmNvbmNhdChwZihjdXJyZW50LmZvbnRTaXplKSwgInB4IikpOworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgcGYoLWN1cnJlbnQueSkpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNob3dUZXh0IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaG93VGV4dChnbHlwaHMpIHsKKyAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICAgIHZhciBmb250ID0gY3VycmVudC5mb250OworICAgICAgICB2YXIgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplOworCisgICAgICAgIGlmIChmb250U2l6ZSA9PT0gMCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlOworICAgICAgICB2YXIgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nOworICAgICAgICB2YXIgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nOworICAgICAgICB2YXIgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjsKKyAgICAgICAgdmFyIHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uOworICAgICAgICB2YXIgdmVydGljYWwgPSBmb250LnZlcnRpY2FsOworICAgICAgICB2YXIgc3BhY2luZ0RpciA9IHZlcnRpY2FsID8gMSA6IC0xOworICAgICAgICB2YXIgZGVmYXVsdFZNZXRyaWNzID0gZm9udC5kZWZhdWx0Vk1ldHJpY3M7CisgICAgICAgIHZhciB3aWR0aEFkdmFuY2VTY2FsZSA9IGZvbnRTaXplICogY3VycmVudC5mb250TWF0cml4WzBdOworICAgICAgICB2YXIgeCA9IDA7CisKKyAgICAgICAgdmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihnbHlwaHMpLAorICAgICAgICAgICAgX3N0ZXA0OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBnbHlwaCA9IF9zdGVwNC52YWx1ZTsKKworICAgICAgICAgICAgaWYgKGdseXBoID09PSBudWxsKSB7CisgICAgICAgICAgICAgIHggKz0gZm9udERpcmVjdGlvbiAqIHdvcmRTcGFjaW5nOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzTnVtKShnbHlwaCkpIHsKKyAgICAgICAgICAgICAgeCArPSBzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSAvIDEwMDA7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nOworICAgICAgICAgICAgdmFyIGNoYXJhY3RlciA9IGdseXBoLmZvbnRDaGFyOworICAgICAgICAgICAgdmFyIHNjYWxlZFggPSB2b2lkIDAsCisgICAgICAgICAgICAgICAgc2NhbGVkWSA9IHZvaWQgMDsKKyAgICAgICAgICAgIHZhciB3aWR0aCA9IGdseXBoLndpZHRoOworCisgICAgICAgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgICAgICAgdmFyIHZ4ID0gdm9pZCAwOworICAgICAgICAgICAgICB2YXIgdm1ldHJpYyA9IGdseXBoLnZtZXRyaWMgfHwgZGVmYXVsdFZNZXRyaWNzOworICAgICAgICAgICAgICB2eCA9IGdseXBoLnZtZXRyaWMgPyB2bWV0cmljWzFdIDogd2lkdGggKiAwLjU7CisgICAgICAgICAgICAgIHZ4ID0gLXZ4ICogd2lkdGhBZHZhbmNlU2NhbGU7CisgICAgICAgICAgICAgIHZhciB2eSA9IHZtZXRyaWNbMl0gKiB3aWR0aEFkdmFuY2VTY2FsZTsKKyAgICAgICAgICAgICAgd2lkdGggPSB2bWV0cmljID8gLXZtZXRyaWNbMF0gOiB3aWR0aDsKKyAgICAgICAgICAgICAgc2NhbGVkWCA9IHZ4IC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICAgICAgc2NhbGVkWSA9ICh4ICsgdnkpIC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHNjYWxlZFggPSB4IC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICAgICAgc2NhbGVkWSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChnbHlwaC5pc0luRm9udCB8fCBmb250Lm1pc3NpbmdGaWxlKSB7CisgICAgICAgICAgICAgIGN1cnJlbnQueGNvb3Jkcy5wdXNoKGN1cnJlbnQueCArIHNjYWxlZFgpOworCisgICAgICAgICAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnQueWNvb3Jkcy5wdXNoKC1jdXJyZW50LnkgKyBzY2FsZWRZKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGN1cnJlbnQudHNwYW4udGV4dENvbnRlbnQgKz0gY2hhcmFjdGVyOworICAgICAgICAgICAgfSBlbHNlIHt9CisKKyAgICAgICAgICAgIHZhciBjaGFyV2lkdGggPSB2b2lkIDA7CisKKyAgICAgICAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlIC0gc3BhY2luZyAqIGZvbnREaXJlY3Rpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHggKz0gY2hhcldpZHRoOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgX2l0ZXJhdG9yNC5lKGVycik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgX2l0ZXJhdG9yNC5mKCk7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4IiwgY3VycmVudC54Y29vcmRzLm1hcChwZikuam9pbigiICIpKTsKKworICAgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgY3VycmVudC55Y29vcmRzLm1hcChwZikuam9pbigiICIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgcGYoLWN1cnJlbnQueSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnRpY2FsKSB7CisgICAgICAgICAgY3VycmVudC55IC09IHg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VycmVudC54ICs9IHggKiB0ZXh0SFNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZm9udC1mYW1pbHkiLCBjdXJyZW50LmZvbnRGYW1pbHkpOworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LXNpemUiLCAiIi5jb25jYXQocGYoY3VycmVudC5mb250U2l6ZSksICJweCIpKTsKKworICAgICAgICBpZiAoY3VycmVudC5mb250U3R5bGUgIT09IFNWR19ERUZBVUxUUy5mb250U3R5bGUpIHsKKyAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LXN0eWxlIiwgY3VycmVudC5mb250U3R5bGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnQuZm9udFdlaWdodCAhPT0gU1ZHX0RFRkFVTFRTLmZvbnRXZWlnaHQpIHsKKyAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LXdlaWdodCIsIGN1cnJlbnQuZm9udFdlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZmlsbFN0cm9rZU1vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSzsKKworICAgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7CisgICAgICAgICAgaWYgKGN1cnJlbnQuZmlsbENvbG9yICE9PSBTVkdfREVGQVVMVFMuZmlsbENvbG9yKSB7CisgICAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgY3VycmVudC5maWxsQ29sb3IpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjdXJyZW50LmZpbGxBbHBoYSA8IDEpIHsKKyAgICAgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwtb3BhY2l0eSIsIGN1cnJlbnQuZmlsbEFscGhhKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEgpIHsKKyAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgInRyYW5zcGFyZW50Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbCIsICJub25lIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHsKKyAgICAgICAgICB2YXIgbGluZVdpZHRoU2NhbGUgPSAxIC8gKGN1cnJlbnQudGV4dE1hdHJpeFNjYWxlIHx8IDEpOworCisgICAgICAgICAgdGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhjdXJyZW50LnRzcGFuLCBsaW5lV2lkdGhTY2FsZSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdGV4dE1hdHJpeCA9IGN1cnJlbnQudGV4dE1hdHJpeDsKKworICAgICAgICBpZiAoY3VycmVudC50ZXh0UmlzZSAhPT0gMCkgeworICAgICAgICAgIHRleHRNYXRyaXggPSB0ZXh0TWF0cml4LnNsaWNlKCk7CisgICAgICAgICAgdGV4dE1hdHJpeFs1XSArPSBjdXJyZW50LnRleHRSaXNlOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudC50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ0cmFuc2Zvcm0iLCAiIi5jb25jYXQocG0odGV4dE1hdHJpeCksICIgc2NhbGUoIikuY29uY2F0KHBmKHRleHRIU2NhbGUpLCAiLCAtMSkiKSk7CisgICAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTlMsICJ4bWw6c3BhY2UiLCAicHJlc2VydmUiKTsKKyAgICAgICAgY3VycmVudC50eHRFbGVtZW50LmFwcGVuZENoaWxkKGN1cnJlbnQudHNwYW4pOworICAgICAgICBjdXJyZW50LnR4dGdycC5hcHBlbmRDaGlsZChjdXJyZW50LnR4dEVsZW1lbnQpOworCisgICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoY3VycmVudC50eHRFbGVtZW50KTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXRMZWFkaW5nTW92ZVRleHQiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldExlYWRpbmdNb3ZlVGV4dCh4LCB5KSB7CisgICAgICAgIHRoaXMuc2V0TGVhZGluZygteSk7CisgICAgICAgIHRoaXMubW92ZVRleHQoeCwgeSk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiYWRkRm9udFN0eWxlIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRGb250U3R5bGUoZm9udE9iaikgeworICAgICAgICBpZiAoIWZvbnRPYmouZGF0YSkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYWRkRm9udFN0eWxlOiBObyBmb250IGRhdGEgYXZhaWxhYmxlLCAiICsgJ2Vuc3VyZSB0aGF0IHRoZSAiZm9udEV4dHJhUHJvcGVydGllcyIgQVBJIHBhcmFtZXRlciBpcyBzZXQuJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuY3NzU3R5bGUpIHsKKyAgICAgICAgICB0aGlzLmNzc1N0eWxlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpzdHlsZSIpOworICAgICAgICAgIHRoaXMuY3NzU3R5bGUuc2V0QXR0cmlidXRlTlMobnVsbCwgInR5cGUiLCAidGV4dC9jc3MiKTsKKyAgICAgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQodGhpcy5jc3NTdHlsZSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdXJsID0gKDAsIF91dGlsLmNyZWF0ZU9iamVjdFVSTCkoZm9udE9iai5kYXRhLCBmb250T2JqLm1pbWV0eXBlLCB0aGlzLmZvcmNlRGF0YVNjaGVtYSk7CisgICAgICAgIHRoaXMuY3NzU3R5bGUudGV4dENvbnRlbnQgKz0gIkBmb250LWZhY2UgeyBmb250LWZhbWlseTogXCIiLmNvbmNhdChmb250T2JqLmxvYWRlZE5hbWUsICJcIjsiKSArICIgc3JjOiB1cmwoIi5jb25jYXQodXJsLCAiKTsgfVxuIik7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAic2V0Rm9udCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Rm9udChkZXRhaWxzKSB7CisgICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgICB2YXIgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZGV0YWlsc1swXSk7CisgICAgICAgIHZhciBzaXplID0gZGV0YWlsc1sxXTsKKyAgICAgICAgY3VycmVudC5mb250ID0gZm9udE9iajsKKworICAgICAgICBpZiAodGhpcy5lbWJlZEZvbnRzICYmICFmb250T2JqLm1pc3NpbmdGaWxlICYmICF0aGlzLmVtYmVkZGVkRm9udHNbZm9udE9iai5sb2FkZWROYW1lXSkgeworICAgICAgICAgIHRoaXMuYWRkRm9udFN0eWxlKGZvbnRPYmopOworICAgICAgICAgIHRoaXMuZW1iZWRkZWRGb250c1tmb250T2JqLmxvYWRlZE5hbWVdID0gZm9udE9iajsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnQuZm9udE1hdHJpeCA9IGZvbnRPYmouZm9udE1hdHJpeCA/IGZvbnRPYmouZm9udE1hdHJpeCA6IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgICB2YXIgYm9sZCA9ICJub3JtYWwiOworCisgICAgICAgIGlmIChmb250T2JqLmJsYWNrKSB7CisgICAgICAgICAgYm9sZCA9ICI5MDAiOworICAgICAgICB9IGVsc2UgaWYgKGZvbnRPYmouYm9sZCkgeworICAgICAgICAgIGJvbGQgPSAiYm9sZCI7CisgICAgICAgIH0KKworICAgICAgICB2YXIgaXRhbGljID0gZm9udE9iai5pdGFsaWMgPyAiaXRhbGljIiA6ICJub3JtYWwiOworCisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgIHNpemUgPSAtc2l6ZTsKKyAgICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAxOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudC5mb250U2l6ZSA9IHNpemU7CisgICAgICAgIGN1cnJlbnQuZm9udEZhbWlseSA9IGZvbnRPYmoubG9hZGVkTmFtZTsKKyAgICAgICAgY3VycmVudC5mb250V2VpZ2h0ID0gYm9sZDsKKyAgICAgICAgY3VycmVudC5mb250U3R5bGUgPSBpdGFsaWM7CisgICAgICAgIGN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7CisgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCBwZigtY3VycmVudC55KSk7CisgICAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdOworICAgICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJlbmRUZXh0IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbmRUZXh0KCkgeworICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKworICAgICAgICBpZiAoY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcgJiYgY3VycmVudC50eHRFbGVtZW50ICYmIGN1cnJlbnQudHh0RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgICBjdXJyZW50LmVsZW1lbnQgPSBjdXJyZW50LnR4dEVsZW1lbnQ7CisgICAgICAgICAgdGhpcy5jbGlwKCJub256ZXJvIik7CisgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXRMaW5lV2lkdGgiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldExpbmVXaWR0aCh3aWR0aCkgeworICAgICAgICBpZiAod2lkdGggPiAwKSB7CisgICAgICAgICAgdGhpcy5jdXJyZW50LmxpbmVXaWR0aCA9IHdpZHRoOworICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAic2V0TGluZUNhcCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TGluZUNhcChzdHlsZSkgeworICAgICAgICB0aGlzLmN1cnJlbnQubGluZUNhcCA9IExJTkVfQ0FQX1NUWUxFU1tzdHlsZV07CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAic2V0TGluZUpvaW4iLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldExpbmVKb2luKHN0eWxlKSB7CisgICAgICAgIHRoaXMuY3VycmVudC5saW5lSm9pbiA9IExJTkVfSk9JTl9TVFlMRVNbc3R5bGVdOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNldE1pdGVyTGltaXQiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldE1pdGVyTGltaXQobGltaXQpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50Lm1pdGVyTGltaXQgPSBsaW1pdDsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXRTdHJva2VBbHBoYSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U3Ryb2tlQWxwaGEoc3Ryb2tlQWxwaGEpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhID0gc3Ryb2tlQWxwaGE7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAic2V0U3Ryb2tlUkdCQ29sb3IiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFN0cm9rZVJHQkNvbG9yKHIsIGcsIGIpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKHIsIGcsIGIpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNldEZpbGxBbHBoYSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RmlsbEFscGhhKGZpbGxBbHBoYSkgeworICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gZmlsbEFscGhhOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNldEZpbGxSR0JDb2xvciIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RmlsbFJHQkNvbG9yKHIsIGcsIGIpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyLCBnLCBiKTsKKyAgICAgICAgdGhpcy5jdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpOworICAgICAgICB0aGlzLmN1cnJlbnQueGNvb3JkcyA9IFtdOworICAgICAgICB0aGlzLmN1cnJlbnQueWNvb3JkcyA9IFtdOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNldFN0cm9rZUNvbG9yTiIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U3Ryb2tlQ29sb3JOKGFyZ3MpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNldEZpbGxDb2xvck4iLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEZpbGxDb2xvck4oYXJncykgeworICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNoYWRpbmdGaWxsIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaGFkaW5nRmlsbChhcmdzKSB7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMudmlld3BvcnQud2lkdGg7CisgICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLnZpZXdwb3J0LmhlaWdodDsKKworICAgICAgICB2YXIgaW52ID0gX3V0aWwuVXRpbC5pbnZlcnNlVHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4KTsKKworICAgICAgICB2YXIgYmwgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFswLCAwXSwgaW52KTsKKworICAgICAgICB2YXIgYnIgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFswLCBoZWlnaHRdLCBpbnYpOworCisgICAgICAgIHZhciB1bCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCAwXSwgaW52KTsKKworICAgICAgICB2YXIgdXIgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt3aWR0aCwgaGVpZ2h0XSwgaW52KTsKKworICAgICAgICB2YXIgeDAgPSBNYXRoLm1pbihibFswXSwgYnJbMF0sIHVsWzBdLCB1clswXSk7CisgICAgICAgIHZhciB5MCA9IE1hdGgubWluKGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTsKKyAgICAgICAgdmFyIHgxID0gTWF0aC5tYXgoYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pOworICAgICAgICB2YXIgeTEgPSBNYXRoLm1heChibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7CisgICAgICAgIHZhciByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCB4MCk7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCB5MCk7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgeDEgLSB4MCk7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImhlaWdodCIsIHkxIC0geTApOworICAgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgdGhpcy5fbWFrZVNoYWRpbmdQYXR0ZXJuKGFyZ3MpKTsKKworICAgICAgICBpZiAodGhpcy5jdXJyZW50LmZpbGxBbHBoYSA8IDEpIHsKKyAgICAgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsLW9wYWNpdHkiLCB0aGlzLmN1cnJlbnQuZmlsbEFscGhhKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQocmVjdCk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiX21ha2VDb2xvck5fUGF0dGVybiIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gX21ha2VDb2xvck5fUGF0dGVybihhcmdzKSB7CisgICAgICAgIGlmIChhcmdzWzBdID09PSAiVGlsaW5nUGF0dGVybiIpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVRpbGluZ1BhdHRlcm4oYXJncyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVNoYWRpbmdQYXR0ZXJuKGFyZ3MpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogIl9tYWtlVGlsaW5nUGF0dGVybiIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gX21ha2VUaWxpbmdQYXR0ZXJuKGFyZ3MpIHsKKyAgICAgICAgdmFyIGNvbG9yID0gYXJnc1sxXTsKKyAgICAgICAgdmFyIG9wZXJhdG9yTGlzdCA9IGFyZ3NbMl07CisgICAgICAgIHZhciBtYXRyaXggPSBhcmdzWzNdIHx8IF91dGlsLklERU5USVRZX01BVFJJWDsKKworICAgICAgICB2YXIgX2FyZ3MkID0gX3NsaWNlZFRvQXJyYXkoYXJnc1s0XSwgNCksCisgICAgICAgICAgICB4MCA9IF9hcmdzJFswXSwKKyAgICAgICAgICAgIHkwID0gX2FyZ3MkWzFdLAorICAgICAgICAgICAgeDEgPSBfYXJncyRbMl0sCisgICAgICAgICAgICB5MSA9IF9hcmdzJFszXTsKKworICAgICAgICB2YXIgeHN0ZXAgPSBhcmdzWzVdOworICAgICAgICB2YXIgeXN0ZXAgPSBhcmdzWzZdOworICAgICAgICB2YXIgcGFpbnRUeXBlID0gYXJnc1s3XTsKKyAgICAgICAgdmFyIHRpbGluZ0lkID0gInNoYWRpbmciLmNvbmNhdChzaGFkaW5nQ291bnQrKyk7CisKKyAgICAgICAgdmFyIF9VdGlsJGFwcGx5VHJhbnNmb3JtID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbeDAsIHkwXSwgbWF0cml4KSwKKyAgICAgICAgICAgIF9VdGlsJGFwcGx5VHJhbnNmb3JtMiA9IF9zbGljZWRUb0FycmF5KF9VdGlsJGFwcGx5VHJhbnNmb3JtLCAyKSwKKyAgICAgICAgICAgIHR4MCA9IF9VdGlsJGFwcGx5VHJhbnNmb3JtMlswXSwKKyAgICAgICAgICAgIHR5MCA9IF9VdGlsJGFwcGx5VHJhbnNmb3JtMlsxXTsKKworICAgICAgICB2YXIgX1V0aWwkYXBwbHlUcmFuc2Zvcm0zID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbeDEsIHkxXSwgbWF0cml4KSwKKyAgICAgICAgICAgIF9VdGlsJGFwcGx5VHJhbnNmb3JtNCA9IF9zbGljZWRUb0FycmF5KF9VdGlsJGFwcGx5VHJhbnNmb3JtMywgMiksCisgICAgICAgICAgICB0eDEgPSBfVXRpbCRhcHBseVRyYW5zZm9ybTRbMF0sCisgICAgICAgICAgICB0eTEgPSBfVXRpbCRhcHBseVRyYW5zZm9ybTRbMV07CisKKyAgICAgICAgdmFyIF9VdGlsJHNpbmd1bGFyVmFsdWVEZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobWF0cml4KSwKKyAgICAgICAgICAgIF9VdGlsJHNpbmd1bGFyVmFsdWVEZTIgPSBfc2xpY2VkVG9BcnJheShfVXRpbCRzaW5ndWxhclZhbHVlRGUsIDIpLAorICAgICAgICAgICAgeHNjYWxlID0gX1V0aWwkc2luZ3VsYXJWYWx1ZURlMlswXSwKKyAgICAgICAgICAgIHlzY2FsZSA9IF9VdGlsJHNpbmd1bGFyVmFsdWVEZTJbMV07CisKKyAgICAgICAgdmFyIHR4c3RlcCA9IHhzdGVwICogeHNjYWxlOworICAgICAgICB2YXIgdHlzdGVwID0geXN0ZXAgKiB5c2NhbGU7CisgICAgICAgIHZhciB0aWxpbmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnBhdHRlcm4iKTsKKyAgICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsICJpZCIsIHRpbGluZ0lkKTsKKyAgICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsICJwYXR0ZXJuVW5pdHMiLCAidXNlclNwYWNlT25Vc2UiKTsKKyAgICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ3aWR0aCIsIHR4c3RlcCk7CisgICAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgdHlzdGVwKTsKKyAgICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4IiwgIiIuY29uY2F0KHR4MCkpOworICAgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCAiIi5jb25jYXQodHkwKSk7CisgICAgICAgIHZhciBzdmcgPSB0aGlzLnN2ZzsKKyAgICAgICAgdmFyIHRyYW5zZm9ybU1hdHJpeCA9IHRoaXMudHJhbnNmb3JtTWF0cml4OworICAgICAgICB2YXIgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjsKKyAgICAgICAgdmFyIHN0cm9rZUNvbG9yID0gdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yOworICAgICAgICB2YXIgYmJveCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodHgxIC0gdHgwLCB0eTEgLSB0eTApOworICAgICAgICB0aGlzLnN2ZyA9IGJib3g7CisgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gbWF0cml4OworCisgICAgICAgIGlmIChwYWludFR5cGUgPT09IDIpIHsKKyAgICAgICAgICB2YXIgY3NzQ29sb3IgPSBfdXRpbC5VdGlsLm1ha2VDc3NSZ2IuYXBwbHkoX3V0aWwuVXRpbCwgX3RvQ29uc3VtYWJsZUFycmF5KGNvbG9yKSk7CisKKyAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gY3NzQ29sb3I7CisgICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmV4ZWN1dGVPcFRyZWUodGhpcy5jb252ZXJ0T3BMaXN0KG9wZXJhdG9yTGlzdCkpOworICAgICAgICB0aGlzLnN2ZyA9IHN2ZzsKKyAgICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSB0cmFuc2Zvcm1NYXRyaXg7CisgICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBmaWxsQ29sb3I7CisgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHN0cm9rZUNvbG9yOworICAgICAgICB0aWxpbmcuYXBwZW5kQ2hpbGQoYmJveC5jaGlsZE5vZGVzWzBdKTsKKyAgICAgICAgdGhpcy5kZWZzLmFwcGVuZENoaWxkKHRpbGluZyk7CisgICAgICAgIHJldHVybiAidXJsKCMiLmNvbmNhdCh0aWxpbmdJZCwgIikiKTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJfbWFrZVNoYWRpbmdQYXR0ZXJuIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBfbWFrZVNoYWRpbmdQYXR0ZXJuKGFyZ3MpIHsKKyAgICAgICAgc3dpdGNoIChhcmdzWzBdKSB7CisgICAgICAgICAgY2FzZSAiUmFkaWFsQXhpYWwiOgorICAgICAgICAgICAgdmFyIHNoYWRpbmdJZCA9ICJzaGFkaW5nIi5jb25jYXQoc2hhZGluZ0NvdW50KyspOworICAgICAgICAgICAgdmFyIGNvbG9yU3RvcHMgPSBhcmdzWzNdOworICAgICAgICAgICAgdmFyIGdyYWRpZW50OworCisgICAgICAgICAgICBzd2l0Y2ggKGFyZ3NbMV0pIHsKKyAgICAgICAgICAgICAgY2FzZSAiYXhpYWwiOgorICAgICAgICAgICAgICAgIHZhciBwb2ludDAgPSBhcmdzWzRdOworICAgICAgICAgICAgICAgIHZhciBwb2ludDEgPSBhcmdzWzVdOworICAgICAgICAgICAgICAgIGdyYWRpZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpsaW5lYXJHcmFkaWVudCIpOworICAgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJpZCIsIHNoYWRpbmdJZCk7CisgICAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImdyYWRpZW50VW5pdHMiLCAidXNlclNwYWNlT25Vc2UiKTsKKyAgICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieDEiLCBwb2ludDBbMF0pOworICAgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5MSIsIHBvaW50MFsxXSk7CisgICAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgIngyIiwgcG9pbnQxWzBdKTsKKyAgICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieTIiLCBwb2ludDFbMV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgInJhZGlhbCI6CisgICAgICAgICAgICAgICAgdmFyIGZvY2FsUG9pbnQgPSBhcmdzWzRdOworICAgICAgICAgICAgICAgIHZhciBjaXJjbGVQb2ludCA9IGFyZ3NbNV07CisgICAgICAgICAgICAgICAgdmFyIGZvY2FsUmFkaXVzID0gYXJnc1s2XTsKKyAgICAgICAgICAgICAgICB2YXIgY2lyY2xlUmFkaXVzID0gYXJnc1s3XTsKKyAgICAgICAgICAgICAgICBncmFkaWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmFkaWFsR3JhZGllbnQiKTsKKyAgICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaWQiLCBzaGFkaW5nSWQpOworICAgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJncmFkaWVudFVuaXRzIiwgInVzZXJTcGFjZU9uVXNlIik7CisgICAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImN4IiwgY2lyY2xlUG9pbnRbMF0pOworICAgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJjeSIsIGNpcmNsZVBvaW50WzFdKTsKKyAgICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiciIsIGNpcmNsZVJhZGl1cyk7CisgICAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZ4IiwgZm9jYWxQb2ludFswXSk7CisgICAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZ5IiwgZm9jYWxQb2ludFsxXSk7CisgICAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZyIiwgZm9jYWxSYWRpdXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIFJhZGlhbEF4aWFsIHR5cGU6ICIuY29uY2F0KGFyZ3NbMV0pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihjb2xvclN0b3BzKSwKKyAgICAgICAgICAgICAgICBfc3RlcDU7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNS5zKCk7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICAgICAgdmFyIGNvbG9yU3RvcCA9IF9zdGVwNS52YWx1ZTsKKyAgICAgICAgICAgICAgICB2YXIgc3RvcCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6c3RvcCIpOworICAgICAgICAgICAgICAgIHN0b3Auc2V0QXR0cmlidXRlTlMobnVsbCwgIm9mZnNldCIsIGNvbG9yU3RvcFswXSk7CisgICAgICAgICAgICAgICAgc3RvcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAic3RvcC1jb2xvciIsIGNvbG9yU3RvcFsxXSk7CisgICAgICAgICAgICAgICAgZ3JhZGllbnQuYXBwZW5kQ2hpbGQoc3RvcCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgICBfaXRlcmF0b3I1LmUoZXJyKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgIF9pdGVyYXRvcjUuZigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQoZ3JhZGllbnQpOworICAgICAgICAgICAgcmV0dXJuICJ1cmwoIyIuY29uY2F0KHNoYWRpbmdJZCwgIikiKTsKKworICAgICAgICAgIGNhc2UgIk1lc2giOgorICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmltcGxlbWVudGVkIHBhdHRlcm4gTWVzaCIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICBjYXNlICJEdW1teSI6CisgICAgICAgICAgICByZXR1cm4gImhvdHBpbmsiOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBJUiB0eXBlOiAiLmNvbmNhdChhcmdzWzBdKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXREYXNoIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREYXNoKGRhc2hBcnJheSwgZGFzaFBoYXNlKSB7CisgICAgICAgIHRoaXMuY3VycmVudC5kYXNoQXJyYXkgPSBkYXNoQXJyYXk7CisgICAgICAgIHRoaXMuY3VycmVudC5kYXNoUGhhc2UgPSBkYXNoUGhhc2U7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiY29uc3RydWN0UGF0aCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RydWN0UGF0aChvcHMsIGFyZ3MpIHsKKyAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICAgIHZhciB4ID0gY3VycmVudC54LAorICAgICAgICAgICAgeSA9IGN1cnJlbnQueTsKKyAgICAgICAgdmFyIGQgPSBbXTsKKyAgICAgICAgdmFyIGogPSAwOworCisgICAgICAgIHZhciBfaXRlcmF0b3I2ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIob3BzKSwKKyAgICAgICAgICAgIF9zdGVwNjsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNi5zKCk7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICB2YXIgb3AgPSBfc3RlcDYudmFsdWU7CisKKyAgICAgICAgICAgIHN3aXRjaCAob3AgfCAwKSB7CisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnJlY3RhbmdsZToKKyAgICAgICAgICAgICAgICB4ID0gYXJnc1tqKytdOworICAgICAgICAgICAgICAgIHkgPSBhcmdzW2orK107CisgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gYXJnc1tqKytdOworICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBhcmdzW2orK107CisgICAgICAgICAgICAgICAgdmFyIHh3ID0geCArIHdpZHRoOworICAgICAgICAgICAgICAgIHZhciB5aCA9IHkgKyBoZWlnaHQ7CisgICAgICAgICAgICAgICAgZC5wdXNoKCJNIiwgcGYoeCksIHBmKHkpLCAiTCIsIHBmKHh3KSwgcGYoeSksICJMIiwgcGYoeHcpLCBwZih5aCksICJMIiwgcGYoeCksIHBmKHloKSwgIloiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5tb3ZlVG86CisgICAgICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgICAgICB5ID0gYXJnc1tqKytdOworICAgICAgICAgICAgICAgIGQucHVzaCgiTSIsIHBmKHgpLCBwZih5KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubGluZVRvOgorICAgICAgICAgICAgICAgIHggPSBhcmdzW2orK107CisgICAgICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgICAgICBkLnB1c2goIkwiLCBwZih4KSwgcGYoeSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG86CisgICAgICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDRdOworICAgICAgICAgICAgICAgIHkgPSBhcmdzW2ogKyA1XTsKKyAgICAgICAgICAgICAgICBkLnB1c2goIkMiLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZihhcmdzW2ogKyAyXSksIHBmKGFyZ3NbaiArIDNdKSwgcGYoeCksIHBmKHkpKTsKKyAgICAgICAgICAgICAgICBqICs9IDY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzI6CisgICAgICAgICAgICAgICAgZC5wdXNoKCJDIiwgcGYoeCksIHBmKHkpLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZihhcmdzW2ogKyAyXSksIHBmKGFyZ3NbaiArIDNdKSk7CisgICAgICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDJdOworICAgICAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTsKKyAgICAgICAgICAgICAgICBqICs9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzM6CisgICAgICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDJdOworICAgICAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTsKKyAgICAgICAgICAgICAgICBkLnB1c2goIkMiLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZih4KSwgcGYoeSksIHBmKHgpLCBwZih5KSk7CisgICAgICAgICAgICAgICAgaiArPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDoKKyAgICAgICAgICAgICAgICBkLnB1c2goIloiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIF9pdGVyYXRvcjYuZShlcnIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIF9pdGVyYXRvcjYuZigpOworICAgICAgICB9CisKKyAgICAgICAgZCA9IGQuam9pbigiICIpOworCisgICAgICAgIGlmIChjdXJyZW50LnBhdGggJiYgb3BzLmxlbmd0aCA+IDAgJiYgb3BzWzBdICE9PSBfdXRpbC5PUFMucmVjdGFuZ2xlICYmIG9wc1swXSAhPT0gX3V0aWwuT1BTLm1vdmVUbykgeworICAgICAgICAgIGQgPSBjdXJyZW50LnBhdGguZ2V0QXR0cmlidXRlTlMobnVsbCwgImQiKSArIGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VycmVudC5wYXRoID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpwYXRoIik7CisKKyAgICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKGN1cnJlbnQucGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50LnBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgImQiLCBkKTsKKyAgICAgICAgY3VycmVudC5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgIm5vbmUiKTsKKyAgICAgICAgY3VycmVudC5lbGVtZW50ID0gY3VycmVudC5wYXRoOworICAgICAgICBjdXJyZW50LnNldEN1cnJlbnRQb2ludCh4LCB5KTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJlbmRQYXRoIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbmRQYXRoKCkgeworICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgICAgY3VycmVudC5wYXRoID0gbnVsbDsKKworICAgICAgICBpZiAoIXRoaXMucGVuZGluZ0NsaXApIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWN1cnJlbnQuZWxlbWVudCkgeworICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBjbGlwSWQgPSAiY2xpcHBhdGgiLmNvbmNhdChjbGlwQ291bnQrKyk7CisgICAgICAgIHZhciBjbGlwUGF0aCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6Y2xpcFBhdGgiKTsKKyAgICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgImlkIiwgY2xpcElkKTsKKyAgICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgInRyYW5zZm9ybSIsIHBtKHRoaXMudHJhbnNmb3JtTWF0cml4KSk7CisgICAgICAgIHZhciBjbGlwRWxlbWVudCA9IGN1cnJlbnQuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7CisKKyAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXAgPT09ICJldmVub2RkIikgeworICAgICAgICAgIGNsaXBFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJjbGlwLXJ1bGUiLCAiZXZlbm9kZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNsaXBFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJjbGlwLXJ1bGUiLCAibm9uemVybyIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7CisgICAgICAgIGNsaXBQYXRoLmFwcGVuZENoaWxkKGNsaXBFbGVtZW50KTsKKyAgICAgICAgdGhpcy5kZWZzLmFwcGVuZENoaWxkKGNsaXBQYXRoKTsKKworICAgICAgICBpZiAoY3VycmVudC5hY3RpdmVDbGlwVXJsKSB7CisgICAgICAgICAgY3VycmVudC5jbGlwR3JvdXAgPSBudWxsOworICAgICAgICAgIHRoaXMuZXh0cmFTdGFjay5mb3JFYWNoKGZ1bmN0aW9uIChwcmV2KSB7CisgICAgICAgICAgICBwcmV2LmNsaXBHcm91cCA9IG51bGw7CisgICAgICAgICAgfSk7CisgICAgICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgImNsaXAtcGF0aCIsIGN1cnJlbnQuYWN0aXZlQ2xpcFVybCk7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50LmFjdGl2ZUNsaXBVcmwgPSAidXJsKCMiLmNvbmNhdChjbGlwSWQsICIpIik7CisgICAgICAgIHRoaXMudGdycCA9IG51bGw7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiY2xpcCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpcCh0eXBlKSB7CisgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSB0eXBlOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImNsb3NlUGF0aCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2VQYXRoKCkgeworICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKworICAgICAgICBpZiAoY3VycmVudC5wYXRoKSB7CisgICAgICAgICAgdmFyIGQgPSAiIi5jb25jYXQoY3VycmVudC5wYXRoLmdldEF0dHJpYnV0ZU5TKG51bGwsICJkIiksICJaIik7CisgICAgICAgICAgY3VycmVudC5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICJkIiwgZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXRMZWFkaW5nIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRMZWFkaW5nKGxlYWRpbmcpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZzsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXRUZXh0UmlzZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4dFJpc2UodGV4dFJpc2UpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gdGV4dFJpc2U7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAic2V0VGV4dFJlbmRlcmluZ01vZGUiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRleHRSZW5kZXJpbmdNb2RlKHRleHRSZW5kZXJpbmdNb2RlKSB7CisgICAgICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IHRleHRSZW5kZXJpbmdNb2RlOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInNldEhTY2FsZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0SFNjYWxlKHNjYWxlKSB7CisgICAgICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gc2NhbGUgLyAxMDA7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAic2V0UmVuZGVyaW5nSW50ZW50IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KSB7fQorICAgIH0sIHsKKyAgICAgIGtleTogInNldEZsYXRuZXNzIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRGbGF0bmVzcyhmbGF0bmVzcykge30KKyAgICB9LCB7CisgICAgICBrZXk6ICJzZXRHU3RhdGUiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEdTdGF0ZShzdGF0ZXMpIHsKKyAgICAgICAgdmFyIF9pdGVyYXRvcjcgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzdGF0ZXMpLAorICAgICAgICAgICAgX3N0ZXA3OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3I3LnMoKTsgIShfc3RlcDcgPSBfaXRlcmF0b3I3Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBfc3RlcDckdmFsdWUgPSBfc2xpY2VkVG9BcnJheShfc3RlcDcudmFsdWUsIDIpLAorICAgICAgICAgICAgICAgIGtleSA9IF9zdGVwNyR2YWx1ZVswXSwKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IF9zdGVwNyR2YWx1ZVsxXTsKKworICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICAgICAgY2FzZSAiTFciOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0TGluZVdpZHRoKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICJMQyI6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICJMSiI6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbih2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAiTUwiOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0TWl0ZXJMaW1pdCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAiRCI6CisgICAgICAgICAgICAgICAgdGhpcy5zZXREYXNoKHZhbHVlWzBdLCB2YWx1ZVsxXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAiUkkiOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICJGTCI6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRGbGF0bmVzcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAiRm9udCI6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICJDQSI6CisgICAgICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VBbHBoYSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAiY2EiOgorICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsbEFscGhhKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5pbXBsZW1lbnRlZCBncmFwaGljIHN0YXRlIG9wZXJhdG9yICIuY29uY2F0KGtleSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgX2l0ZXJhdG9yNy5lKGVycik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgX2l0ZXJhdG9yNy5mKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJmaWxsIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBmaWxsKCkgeworICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKworICAgICAgICBpZiAoY3VycmVudC5lbGVtZW50KSB7CisgICAgICAgICAgY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgY3VycmVudC5maWxsQ29sb3IpOworICAgICAgICAgIGN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbC1vcGFjaXR5IiwgY3VycmVudC5maWxsQWxwaGEpOworICAgICAgICAgIHRoaXMuZW5kUGF0aCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAic3Ryb2tlIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBzdHJva2UoKSB7CisgICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworCisgICAgICAgIGlmIChjdXJyZW50LmVsZW1lbnQpIHsKKyAgICAgICAgICB0aGlzLl9zZXRTdHJva2VBdHRyaWJ1dGVzKGN1cnJlbnQuZWxlbWVudCk7CisKKyAgICAgICAgICBjdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwiLCAibm9uZSIpOworICAgICAgICAgIHRoaXMuZW5kUGF0aCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiX3NldFN0cm9rZUF0dHJpYnV0ZXMiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRTdHJva2VBdHRyaWJ1dGVzKGVsZW1lbnQpIHsKKyAgICAgICAgdmFyIGxpbmVXaWR0aFNjYWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxOworICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgICAgdmFyIGRhc2hBcnJheSA9IGN1cnJlbnQuZGFzaEFycmF5OworCisgICAgICAgIGlmIChsaW5lV2lkdGhTY2FsZSAhPT0gMSAmJiBkYXNoQXJyYXkubGVuZ3RoID4gMCkgeworICAgICAgICAgIGRhc2hBcnJheSA9IGRhc2hBcnJheS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gbGluZVdpZHRoU2NhbGUgKiB2YWx1ZTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZSIsIGN1cnJlbnQuc3Ryb2tlQ29sb3IpOworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2Utb3BhY2l0eSIsIGN1cnJlbnQuc3Ryb2tlQWxwaGEpOworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2UtbWl0ZXJsaW1pdCIsIHBmKGN1cnJlbnQubWl0ZXJMaW1pdCkpOworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2UtbGluZWNhcCIsIGN1cnJlbnQubGluZUNhcCk7CisgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZS1saW5lam9pbiIsIGN1cnJlbnQubGluZUpvaW4pOworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2Utd2lkdGgiLCBwZihsaW5lV2lkdGhTY2FsZSAqIGN1cnJlbnQubGluZVdpZHRoKSArICJweCIpOworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2UtZGFzaGFycmF5IiwgZGFzaEFycmF5Lm1hcChwZikuam9pbigiICIpKTsKKyAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAic3Ryb2tlLWRhc2hvZmZzZXQiLCBwZihsaW5lV2lkdGhTY2FsZSAqIGN1cnJlbnQuZGFzaFBoYXNlKSArICJweCIpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImVvRmlsbCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZW9GaWxsKCkgeworICAgICAgICBpZiAodGhpcy5jdXJyZW50LmVsZW1lbnQpIHsKKyAgICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbC1ydWxlIiwgImV2ZW5vZGQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZmlsbCgpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImZpbGxTdHJva2UiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbGxTdHJva2UoKSB7CisgICAgICAgIHRoaXMuc3Ryb2tlKCk7CisgICAgICAgIHRoaXMuZmlsbCgpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImVvRmlsbFN0cm9rZSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZW9GaWxsU3Ryb2tlKCkgeworICAgICAgICBpZiAodGhpcy5jdXJyZW50LmVsZW1lbnQpIHsKKyAgICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbC1ydWxlIiwgImV2ZW5vZGQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImNsb3NlU3Ryb2tlIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZVN0cm9rZSgpIHsKKyAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTsKKyAgICAgICAgdGhpcy5zdHJva2UoKTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJjbG9zZUZpbGxTdHJva2UiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlRmlsbFN0cm9rZSgpIHsKKyAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTsKKyAgICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiY2xvc2VFT0ZpbGxTdHJva2UiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlRU9GaWxsU3Ryb2tlKCkgeworICAgICAgICB0aGlzLmNsb3NlUGF0aCgpOworICAgICAgICB0aGlzLmVvRmlsbFN0cm9rZSgpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInBhaW50U29saWRDb2xvckltYWdlTWFzayIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCkgeworICAgICAgICB2YXIgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4IiwgIjAiKTsKKyAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsICIwIik7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgIjFweCIpOworICAgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJoZWlnaHQiLCAiMXB4Iik7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwiLCB0aGlzLmN1cnJlbnQuZmlsbENvbG9yKTsKKworICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKHJlY3QpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInBhaW50SW1hZ2VYT2JqZWN0IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYWludEltYWdlWE9iamVjdChvYmpJZCkgeworICAgICAgICB2YXIgaW1nRGF0YSA9IG9iaklkLnN0YXJ0c1dpdGgoImdfIikgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KG9iaklkKSA6IHRoaXMub2Jqcy5nZXQob2JqSWQpOworCisgICAgICAgIGlmICghaW1nRGF0YSkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRGVwZW5kZW50IGltYWdlIHdpdGggb2JqZWN0IElEICIuY29uY2F0KG9iaklkLCAiIGlzIG5vdCByZWFkeSB5ZXQiKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJwYWludElubGluZUltYWdlWE9iamVjdCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSwgbWFzaykgeworICAgICAgICB2YXIgd2lkdGggPSBpbWdEYXRhLndpZHRoOworICAgICAgICB2YXIgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7CisgICAgICAgIHZhciBpbWdTcmMgPSBjb252ZXJ0SW1nRGF0YVRvUG5nKGltZ0RhdGEsIHRoaXMuZm9yY2VEYXRhU2NoZW1hLCAhIW1hc2spOworICAgICAgICB2YXIgY2xpcHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTsKKyAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCAiMCIpOworICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsICIwIik7CisgICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ3aWR0aCIsIHBmKHdpZHRoKSk7CisgICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJoZWlnaHQiLCBwZihoZWlnaHQpKTsKKyAgICAgICAgdGhpcy5jdXJyZW50LmVsZW1lbnQgPSBjbGlwcmVjdDsKKyAgICAgICAgdGhpcy5jbGlwKCJub256ZXJvIik7CisgICAgICAgIHZhciBpbWdFbCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6aW1hZ2UiKTsKKyAgICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMoWExJTktfTlMsICJ4bGluazpocmVmIiwgaW1nU3JjKTsKKyAgICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCAiMCIpOworICAgICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsIHBmKC1oZWlnaHQpKTsKKyAgICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgcGYod2lkdGgpICsgInB4Iik7CisgICAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsICJoZWlnaHQiLCBwZihoZWlnaHQpICsgInB4Iik7CisgICAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ0cmFuc2Zvcm0iLCAic2NhbGUoIi5jb25jYXQocGYoMSAvIHdpZHRoKSwgIiAiKS5jb25jYXQocGYoLTEgLyBoZWlnaHQpLCAiKSIpKTsKKworICAgICAgICBpZiAobWFzaykgeworICAgICAgICAgIG1hc2suYXBwZW5kQ2hpbGQoaW1nRWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoaW1nRWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAicGFpbnRJbWFnZU1hc2tYT2JqZWN0IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYWludEltYWdlTWFza1hPYmplY3QoaW1nRGF0YSkgeworICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgICAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aDsKKyAgICAgICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0OworICAgICAgICB2YXIgZmlsbENvbG9yID0gY3VycmVudC5maWxsQ29sb3I7CisgICAgICAgIGN1cnJlbnQubWFza0lkID0gIm1hc2siLmNvbmNhdChtYXNrQ291bnQrKyk7CisgICAgICAgIHZhciBtYXNrID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzptYXNrIik7CisgICAgICAgIG1hc2suc2V0QXR0cmlidXRlTlMobnVsbCwgImlkIiwgY3VycmVudC5tYXNrSWQpOworICAgICAgICB2YXIgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4IiwgIjAiKTsKKyAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsICIwIik7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgcGYod2lkdGgpKTsKKyAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgcGYoaGVpZ2h0KSk7CisgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwiLCBmaWxsQ29sb3IpOworICAgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJtYXNrIiwgInVybCgjIi5jb25jYXQoY3VycmVudC5tYXNrSWQsICIpIikpOworICAgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQobWFzayk7CisKKyAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChyZWN0KTsKKworICAgICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEsIG1hc2spOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInBhaW50Rm9ybVhPYmplY3RCZWdpbiIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkgeworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRyaXgpICYmIG1hdHJpeC5sZW5ndGggPT09IDYpIHsKKyAgICAgICAgICB0aGlzLnRyYW5zZm9ybShtYXRyaXhbMF0sIG1hdHJpeFsxXSwgbWF0cml4WzJdLCBtYXRyaXhbM10sIG1hdHJpeFs0XSwgbWF0cml4WzVdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiYm94KSB7CisgICAgICAgICAgdmFyIHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07CisgICAgICAgICAgdmFyIGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdOworICAgICAgICAgIHZhciBjbGlwcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4IiwgYmJveFswXSk7CisgICAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCBiYm94WzFdKTsKKyAgICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAid2lkdGgiLCBwZih3aWR0aCkpOworICAgICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJoZWlnaHQiLCBwZihoZWlnaHQpKTsKKyAgICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGNsaXByZWN0OworICAgICAgICAgIHRoaXMuY2xpcCgibm9uemVybyIpOworICAgICAgICAgIHRoaXMuZW5kUGF0aCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAicGFpbnRGb3JtWE9iamVjdEVuZCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gcGFpbnRGb3JtWE9iamVjdEVuZCgpIHt9CisgICAgfSwgeworICAgICAga2V5OiAiX2luaXRpYWxpemUiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0aWFsaXplKHZpZXdwb3J0KSB7CisgICAgICAgIHZhciBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOworICAgICAgICB2YXIgZGVmaW5pdGlvbnMgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmRlZnMiKTsKKyAgICAgICAgc3ZnLmFwcGVuZENoaWxkKGRlZmluaXRpb25zKTsKKyAgICAgICAgdGhpcy5kZWZzID0gZGVmaW5pdGlvbnM7CisgICAgICAgIHZhciByb290R3JvdXAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTsKKyAgICAgICAgcm9vdEdyb3VwLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ0cmFuc2Zvcm0iLCBwbSh2aWV3cG9ydC50cmFuc2Zvcm0pKTsKKyAgICAgICAgc3ZnLmFwcGVuZENoaWxkKHJvb3RHcm91cCk7CisgICAgICAgIHRoaXMuc3ZnID0gcm9vdEdyb3VwOworICAgICAgICByZXR1cm4gc3ZnOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogIl9lbnN1cmVDbGlwR3JvdXAiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9lbnN1cmVDbGlwR3JvdXAoKSB7CisgICAgICAgIGlmICghdGhpcy5jdXJyZW50LmNsaXBHcm91cCkgeworICAgICAgICAgIHZhciBjbGlwR3JvdXAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTsKKyAgICAgICAgICBjbGlwR3JvdXAuc2V0QXR0cmlidXRlTlMobnVsbCwgImNsaXAtcGF0aCIsIHRoaXMuY3VycmVudC5hY3RpdmVDbGlwVXJsKTsKKyAgICAgICAgICB0aGlzLnN2Zy5hcHBlbmRDaGlsZChjbGlwR3JvdXApOworICAgICAgICAgIHRoaXMuY3VycmVudC5jbGlwR3JvdXAgPSBjbGlwR3JvdXA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmNsaXBHcm91cDsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJfZW5zdXJlVHJhbnNmb3JtR3JvdXAiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpIHsKKyAgICAgICAgaWYgKCF0aGlzLnRncnApIHsKKyAgICAgICAgICB0aGlzLnRncnAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTsKKyAgICAgICAgICB0aGlzLnRncnAuc2V0QXR0cmlidXRlTlMobnVsbCwgInRyYW5zZm9ybSIsIHBtKHRoaXMudHJhbnNmb3JtTWF0cml4KSk7CisKKyAgICAgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpIHsKKyAgICAgICAgICAgIHRoaXMuX2Vuc3VyZUNsaXBHcm91cCgpLmFwcGVuZENoaWxkKHRoaXMudGdycCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuc3ZnLmFwcGVuZENoaWxkKHRoaXMudGdycCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMudGdycDsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gU1ZHR3JhcGhpY3M7CisgIH0oKTsKK30KKworLyoqKi8gfSksCisvKiAyMTkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZOb2RlU3RyZWFtID0gdm9pZCAwOworCit2YXIgX3JlZ2VuZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dfcGRmanNfcmVxdWlyZV9fKDIpKTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9uZXR3b3JrX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjApOworCitmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAiZGVmYXVsdCI6IG9iaiB9OyB9CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH0KKworZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7IGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKKzsKKwordmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKKwordmFyIGh0dHAgPSByZXF1aXJlKCJodHRwIik7CisKK3ZhciBodHRwcyA9IHJlcXVpcmUoImh0dHBzIik7CisKK3ZhciB1cmwgPSByZXF1aXJlKCJ1cmwiKTsKKwordmFyIGZpbGVVcmlSZWdleCA9IC9eZmlsZTpcL1wvXC9bYS16QS1aXTpcLy87CisKK2Z1bmN0aW9uIHBhcnNlVXJsKHNvdXJjZVVybCkgeworICB2YXIgcGFyc2VkVXJsID0gdXJsLnBhcnNlKHNvdXJjZVVybCk7CisKKyAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gImZpbGU6IiB8fCBwYXJzZWRVcmwuaG9zdCkgeworICAgIHJldHVybiBwYXJzZWRVcmw7CisgIH0KKworICBpZiAoL15bYS16XTpbL1xcXS9pLnRlc3Qoc291cmNlVXJsKSkgeworICAgIHJldHVybiB1cmwucGFyc2UoImZpbGU6Ly8vIi5jb25jYXQoc291cmNlVXJsKSk7CisgIH0KKworICBpZiAoIXBhcnNlZFVybC5ob3N0KSB7CisgICAgcGFyc2VkVXJsLnByb3RvY29sID0gImZpbGU6IjsKKyAgfQorCisgIHJldHVybiBwYXJzZWRVcmw7Cit9CisKK3ZhciBQREZOb2RlU3RyZWFtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGTm9kZVN0cmVhbShzb3VyY2UpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGTm9kZVN0cmVhbSk7CisKKyAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICB0aGlzLnVybCA9IHBhcnNlVXJsKHNvdXJjZS51cmwpOworICAgIHRoaXMuaXNIdHRwID0gdGhpcy51cmwucHJvdG9jb2wgPT09ICJodHRwOiIgfHwgdGhpcy51cmwucHJvdG9jb2wgPT09ICJodHRwczoiOworICAgIHRoaXMuaXNGc1VybCA9IHRoaXMudXJsLnByb3RvY29sID09PSAiZmlsZToiOworICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBzb3VyY2UuaHR0cEhlYWRlcnMgfHwge307CisgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsOworICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQREZOb2RlU3RyZWFtLCBbeworICAgIGtleTogImdldEZ1bGxSZWFkZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGdWxsUmVhZGVyKCkgeworICAgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCAiUERGTm9kZVN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcih0aGlzKSA6IG5ldyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlcih0aGlzKTsKKyAgICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRSYW5nZVJlYWRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJhbmdlUmVhZGVyKHN0YXJ0LCBlbmQpIHsKKyAgICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICB2YXIgcmFuZ2VSZWFkZXIgPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIodGhpcywgc3RhcnQsIGVuZCkgOiBuZXcgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIHN0YXJ0LCBlbmQpOworCisgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmFuZ2VSZWFkZXIpOworCisgICAgICByZXR1cm4gcmFuZ2VSZWFkZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2FuY2VsQWxsUmVxdWVzdHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHsKKyAgICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgeworICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlYWRlcnMgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApOworCisgICAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikgeworICAgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQgOiAwOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQREZOb2RlU3RyZWFtOworfSgpOworCitleHBvcnRzLlBERk5vZGVTdHJlYW0gPSBQREZOb2RlU3RyZWFtOworCit2YXIgQmFzZUZ1bGxSZWFkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBCYXNlRnVsbFJlYWRlcihzdHJlYW0pIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmFzZUZ1bGxSZWFkZXIpOworCisgICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDsKKyAgICB0aGlzLl9kb25lID0gZmFsc2U7CisgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgICAgdmFyIHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7CisgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CisgICAgdGhpcy5fbG9hZGVkID0gMDsKKyAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7CisgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTsKKyAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTsKKworICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkgeworICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTsKKyAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7CisgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsOworICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEJhc2VGdWxsUmVhZGVyLCBbeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlYWQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKKyAgICAgICAgdmFyIGNodW5rLCBidWZmZXI7CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RvbmUpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IHRydWUKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjsKKworICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIShjaHVuayA9PT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHRoaXMucmVhZCgpKTsKKworICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5sZW5ndGg7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCwKKyAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGgKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIHJlYWQoKSB7CisgICAgICAgIHJldHVybiBfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVhZDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImNhbmNlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfZXJyb3IiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZXJyb3IocmVhc29uKSB7CisgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjsKKworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9zZXRSZWFkYWJsZVN0cmVhbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTsKKyAgICAgIHJlYWRhYmxlU3RyZWFtLm9uKCJyZWFkYWJsZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgX3RoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgIH0pOworICAgICAgcmVhZGFibGVTdHJlYW0ub24oImVuZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpOworICAgICAgICBfdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICAgICAgX3RoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgIH0pOworICAgICAgcmVhZGFibGVTdHJlYW0ub24oImVycm9yIiwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBfdGhpcy5fZXJyb3IocmVhc29uKTsKKyAgICAgIH0pOworCisgICAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHsKKyAgICAgICAgdGhpcy5fZXJyb3IobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJzdHJlYW1pbmcgaXMgZGlzYWJsZWQiKSk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoZWFkZXJzUmVhZHkiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmlsZW5hbWUiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNvbnRlbnRMZW5ndGgiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNSYW5nZVN1cHBvcnRlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1N0cmVhbWluZ1N1cHBvcnRlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEJhc2VGdWxsUmVhZGVyOworfSgpOworCit2YXIgQmFzZVJhbmdlUmVhZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQmFzZVJhbmdlUmVhZGVyKHN0cmVhbSkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCYXNlUmFuZ2VSZWFkZXIpOworCisgICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDsKKyAgICB0aGlzLl9kb25lID0gZmFsc2U7CisgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgICAgdGhpcy5fbG9hZGVkID0gMDsKKyAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7CisgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdmFyIHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7CisgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQmFzZVJhbmdlUmVhZGVyLCBbeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlYWQyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgeworICAgICAgICB2YXIgY2h1bmssIGJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9kb25lKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IHRydWUKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA2OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7CisKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIGNodW5rID0gdGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpOworCisgICAgICAgICAgICAgICAgaWYgKCEoY2h1bmsgPT09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHRoaXMucmVhZCgpKTsKKworICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5sZW5ndGg7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZAorICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gcmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIF9yZWFkMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVhZDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImNhbmNlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfZXJyb3IiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZXJyb3IocmVhc29uKSB7CisgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjsKKworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9zZXRSZWFkYWJsZVN0cmVhbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07CisgICAgICByZWFkYWJsZVN0cmVhbS5vbigicmVhZGFibGUiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIF90aGlzMi5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgfSk7CisgICAgICByZWFkYWJsZVN0cmVhbS5vbigiZW5kIiwgZnVuY3Rpb24gKCkgeworICAgICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7CisgICAgICAgIF90aGlzMi5fZG9uZSA9IHRydWU7CisKKyAgICAgICAgX3RoaXMyLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICB9KTsKKyAgICAgIHJlYWRhYmxlU3RyZWFtLm9uKCJlcnJvciIsIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgX3RoaXMyLl9lcnJvcihyZWFzb24pOworICAgICAgfSk7CisKKyAgICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1N0cmVhbWluZ1N1cHBvcnRlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEJhc2VSYW5nZVJlYWRlcjsKK30oKTsKKworZnVuY3Rpb24gY3JlYXRlUmVxdWVzdE9wdGlvbnMocGFyc2VkVXJsLCBoZWFkZXJzKSB7CisgIHJldHVybiB7CisgICAgcHJvdG9jb2w6IHBhcnNlZFVybC5wcm90b2NvbCwKKyAgICBhdXRoOiBwYXJzZWRVcmwuYXV0aCwKKyAgICBob3N0OiBwYXJzZWRVcmwuaG9zdG5hbWUsCisgICAgcG9ydDogcGFyc2VkVXJsLnBvcnQsCisgICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsCisgICAgbWV0aG9kOiAiR0VUIiwKKyAgICBoZWFkZXJzOiBoZWFkZXJzCisgIH07Cit9CisKK3ZhciBQREZOb2RlU3RyZWFtRnVsbFJlYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VGdWxsUmVhZGVyKSB7CisgIF9pbmhlcml0cyhQREZOb2RlU3RyZWFtRnVsbFJlYWRlciwgX0Jhc2VGdWxsUmVhZGVyKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyKTsKKworICBmdW5jdGlvbiBQREZOb2RlU3RyZWFtRnVsbFJlYWRlcihzdHJlYW0pIHsKKyAgICB2YXIgX3RoaXMzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyKTsKKworICAgIF90aGlzMyA9IF9zdXBlci5jYWxsKHRoaXMsIHN0cmVhbSk7CisKKyAgICB2YXIgaGFuZGxlUmVzcG9uc2UgPSBmdW5jdGlvbiBoYW5kbGVSZXNwb25zZShyZXNwb25zZSkgeworICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkgeworICAgICAgICB2YXIgZXJyb3IgPSBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbigiTWlzc2luZyBQREYgXCIiLmNvbmNhdChfdGhpczMuX3VybCwgIlwiLiIpKTsKKyAgICAgICAgX3RoaXMzLl9zdG9yZWRFcnJvciA9IGVycm9yOworCisgICAgICAgIF90aGlzMy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIF90aGlzMy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICBfdGhpczMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTsKKworICAgICAgdmFyIGdldFJlc3BvbnNlSGVhZGVyID0gZnVuY3Rpb24gZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSkgeworICAgICAgICByZXR1cm4gX3RoaXMzLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV07CisgICAgICB9OworCisgICAgICB2YXIgX3ZhbGlkYXRlUmFuZ2VSZXF1ZXN0ID0gKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7CisgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBnZXRSZXNwb25zZUhlYWRlciwKKyAgICAgICAgaXNIdHRwOiBzdHJlYW0uaXNIdHRwLAorICAgICAgICByYW5nZUNodW5rU2l6ZTogX3RoaXMzLl9yYW5nZUNodW5rU2l6ZSwKKyAgICAgICAgZGlzYWJsZVJhbmdlOiBfdGhpczMuX2Rpc2FibGVSYW5nZQorICAgICAgfSksCisgICAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzID0gX3ZhbGlkYXRlUmFuZ2VSZXF1ZXN0LmFsbG93UmFuZ2VSZXF1ZXN0cywKKyAgICAgICAgICBzdWdnZXN0ZWRMZW5ndGggPSBfdmFsaWRhdGVSYW5nZVJlcXVlc3Quc3VnZ2VzdGVkTGVuZ3RoOworCisgICAgICBfdGhpczMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBhbGxvd1JhbmdlUmVxdWVzdHM7CisgICAgICBfdGhpczMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgX3RoaXMzLl9jb250ZW50TGVuZ3RoOworICAgICAgX3RoaXMzLl9maWxlbmFtZSA9ICgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7CisgICAgfTsKKworICAgIF90aGlzMy5fcmVxdWVzdCA9IG51bGw7CisKKyAgICBpZiAoX3RoaXMzLl91cmwucHJvdG9jb2wgPT09ICJodHRwOiIpIHsKKyAgICAgIF90aGlzMy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyhfdGhpczMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpOworICAgIH0gZWxzZSB7CisgICAgICBfdGhpczMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKF90aGlzMy5fdXJsLCBzdHJlYW0uaHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7CisgICAgfQorCisgICAgX3RoaXMzLl9yZXF1ZXN0Lm9uKCJlcnJvciIsIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIF90aGlzMy5fc3RvcmVkRXJyb3IgPSByZWFzb247CisKKyAgICAgIF90aGlzMy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CisgICAgfSk7CisKKyAgICBfdGhpczMuX3JlcXVlc3QuZW5kKCk7CisKKyAgICByZXR1cm4gX3RoaXMzOworICB9CisKKyAgcmV0dXJuIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyOworfShCYXNlRnVsbFJlYWRlcik7CisKK3ZhciBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlUmFuZ2VSZWFkZXIpIHsKKyAgX2luaGVyaXRzKFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlciwgX0Jhc2VSYW5nZVJlYWRlcik7CisKKyAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKTsKKworICBmdW5jdGlvbiBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIoc3RyZWFtLCBzdGFydCwgZW5kKSB7CisgICAgdmFyIF90aGlzNDsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIpOworCisgICAgX3RoaXM0ID0gX3N1cGVyMi5jYWxsKHRoaXMsIHN0cmVhbSk7CisgICAgX3RoaXM0Ll9odHRwSGVhZGVycyA9IHt9OworCisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gc3RyZWFtLmh0dHBIZWFkZXJzKSB7CisgICAgICB2YXIgdmFsdWUgPSBzdHJlYW0uaHR0cEhlYWRlcnNbcHJvcGVydHldOworCisgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAidW5kZWZpbmVkIikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgX3RoaXM0Ll9odHRwSGVhZGVyc1twcm9wZXJ0eV0gPSB2YWx1ZTsKKyAgICB9CisKKyAgICBfdGhpczQuX2h0dHBIZWFkZXJzLlJhbmdlID0gImJ5dGVzPSIuY29uY2F0KHN0YXJ0LCAiLSIpLmNvbmNhdChlbmQgLSAxKTsKKworICAgIHZhciBoYW5kbGVSZXNwb25zZSA9IGZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKSB7CisgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7CisgICAgICAgIHZhciBlcnJvciA9IG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKCJNaXNzaW5nIFBERiBcIiIuY29uY2F0KF90aGlzNC5fdXJsLCAiXCIuIikpOworICAgICAgICBfdGhpczQuX3N0b3JlZEVycm9yID0gZXJyb3I7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgX3RoaXM0Ll9zZXRSZWFkYWJsZVN0cmVhbShyZXNwb25zZSk7CisgICAgfTsKKworICAgIF90aGlzNC5fcmVxdWVzdCA9IG51bGw7CisKKyAgICBpZiAoX3RoaXM0Ll91cmwucHJvdG9jb2wgPT09ICJodHRwOiIpIHsKKyAgICAgIF90aGlzNC5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyhfdGhpczQuX3VybCwgX3RoaXM0Ll9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTsKKyAgICB9IGVsc2UgeworICAgICAgX3RoaXM0Ll9yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyhfdGhpczQuX3VybCwgX3RoaXM0Ll9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBfdGhpczQuX3JlcXVlc3Qub24oImVycm9yIiwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgX3RoaXM0Ll9zdG9yZWRFcnJvciA9IHJlYXNvbjsKKyAgICB9KTsKKworICAgIF90aGlzNC5fcmVxdWVzdC5lbmQoKTsKKworICAgIHJldHVybiBfdGhpczQ7CisgIH0KKworICByZXR1cm4gUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyOworfShCYXNlUmFuZ2VSZWFkZXIpOworCit2YXIgUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VGdWxsUmVhZGVyMikgeworICBfaW5oZXJpdHMoUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlciwgX0Jhc2VGdWxsUmVhZGVyMik7CisKKyAgdmFyIF9zdXBlcjMgPSBfY3JlYXRlU3VwZXIoUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcik7CisKKyAgZnVuY3Rpb24gUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcihzdHJlYW0pIHsKKyAgICB2YXIgX3RoaXM1OworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIpOworCisgICAgX3RoaXM1ID0gX3N1cGVyMy5jYWxsKHRoaXMsIHN0cmVhbSk7CisgICAgdmFyIHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoX3RoaXM1Ll91cmwucGF0aCk7CisKKyAgICBpZiAoZmlsZVVyaVJlZ2V4LnRlc3QoX3RoaXM1Ll91cmwuaHJlZikpIHsKKyAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cLy8sICIiKTsKKyAgICB9CisKKyAgICBmcy5sc3RhdChwYXRoLCBmdW5jdGlvbiAoZXJyb3IsIHN0YXQpIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gIkVOT0VOVCIpIHsKKyAgICAgICAgICBlcnJvciA9IG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKCJNaXNzaW5nIFBERiBcIiIuY29uY2F0KHBhdGgsICJcIi4iKSk7CisgICAgICAgIH0KKworICAgICAgICBfdGhpczUuX3N0b3JlZEVycm9yID0gZXJyb3I7CisKKyAgICAgICAgX3RoaXM1Ll9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgX3RoaXM1Ll9jb250ZW50TGVuZ3RoID0gc3RhdC5zaXplOworCisgICAgICBfdGhpczUuX3NldFJlYWRhYmxlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aCkpOworCisgICAgICBfdGhpczUuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICB9KTsKKyAgICByZXR1cm4gX3RoaXM1OworICB9CisKKyAgcmV0dXJuIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXI7Cit9KEJhc2VGdWxsUmVhZGVyKTsKKwordmFyIFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZVJhbmdlUmVhZGVyMikgeworICBfaW5oZXJpdHMoUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIsIF9CYXNlUmFuZ2VSZWFkZXIyKTsKKworICB2YXIgX3N1cGVyNCA9IF9jcmVhdGVTdXBlcihQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcik7CisKKyAgZnVuY3Rpb24gUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIoc3RyZWFtLCBzdGFydCwgZW5kKSB7CisgICAgdmFyIF90aGlzNjsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcik7CisKKyAgICBfdGhpczYgPSBfc3VwZXI0LmNhbGwodGhpcywgc3RyZWFtKTsKKyAgICB2YXIgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudChfdGhpczYuX3VybC5wYXRoKTsKKworICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdChfdGhpczYuX3VybC5ocmVmKSkgeworICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlwvLywgIiIpOworICAgIH0KKworICAgIF90aGlzNi5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLCB7CisgICAgICBzdGFydDogc3RhcnQsCisgICAgICBlbmQ6IGVuZCAtIDEKKyAgICB9KSk7CisKKyAgICByZXR1cm4gX3RoaXM2OworICB9CisKKyAgcmV0dXJuIFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyOworfShCYXNlUmFuZ2VSZWFkZXIpOworCisvKioqLyB9KSwKKy8qIDIyMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IgPSBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yOworZXhwb3J0cy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyID0gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcjsKK2V4cG9ydHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMgPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllczsKK2V4cG9ydHMudmFsaWRhdGVSZXNwb25zZVN0YXR1cyA9IHZhbGlkYXRlUmVzcG9uc2VTdGF0dXM7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY29udGVudF9kaXNwb3NpdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIxKTsKKworZnVuY3Rpb24gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoX3JlZikgeworICB2YXIgZ2V0UmVzcG9uc2VIZWFkZXIgPSBfcmVmLmdldFJlc3BvbnNlSGVhZGVyLAorICAgICAgaXNIdHRwID0gX3JlZi5pc0h0dHAsCisgICAgICByYW5nZUNodW5rU2l6ZSA9IF9yZWYucmFuZ2VDaHVua1NpemUsCisgICAgICBkaXNhYmxlUmFuZ2UgPSBfcmVmLmRpc2FibGVSYW5nZTsKKyAgKDAsIF91dGlsLmFzc2VydCkocmFuZ2VDaHVua1NpemUgPiAwLCAiUmFuZ2UgY2h1bmsgc2l6ZSBtdXN0IGJlIGxhcmdlciB0aGFuIHplcm8iKTsKKyAgdmFyIHJldHVyblZhbHVlcyA9IHsKKyAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGZhbHNlLAorICAgIHN1Z2dlc3RlZExlbmd0aDogdW5kZWZpbmVkCisgIH07CisgIHZhciBsZW5ndGggPSBwYXJzZUludChnZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1MZW5ndGgiKSwgMTApOworCisgIGlmICghTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpKSB7CisgICAgcmV0dXJuIHJldHVyblZhbHVlczsKKyAgfQorCisgIHJldHVyblZhbHVlcy5zdWdnZXN0ZWRMZW5ndGggPSBsZW5ndGg7CisKKyAgaWYgKGxlbmd0aCA8PSAyICogcmFuZ2VDaHVua1NpemUpIHsKKyAgICByZXR1cm4gcmV0dXJuVmFsdWVzOworICB9CisKKyAgaWYgKGRpc2FibGVSYW5nZSB8fCAhaXNIdHRwKSB7CisgICAgcmV0dXJuIHJldHVyblZhbHVlczsKKyAgfQorCisgIGlmIChnZXRSZXNwb25zZUhlYWRlcigiQWNjZXB0LVJhbmdlcyIpICE9PSAiYnl0ZXMiKSB7CisgICAgcmV0dXJuIHJldHVyblZhbHVlczsKKyAgfQorCisgIHZhciBjb250ZW50RW5jb2RpbmcgPSBnZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpIHx8ICJpZGVudGl0eSI7CisKKyAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPT0gImlkZW50aXR5IikgeworICAgIHJldHVybiByZXR1cm5WYWx1ZXM7CisgIH0KKworICByZXR1cm5WYWx1ZXMuYWxsb3dSYW5nZVJlcXVlc3RzID0gdHJ1ZTsKKyAgcmV0dXJuIHJldHVyblZhbHVlczsKK30KKworZnVuY3Rpb24gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcikgeworICB2YXIgY29udGVudERpc3Bvc2l0aW9uID0gZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iKTsKKworICBpZiAoY29udGVudERpc3Bvc2l0aW9uKSB7CisgICAgdmFyIGZpbGVuYW1lID0gKDAsIF9jb250ZW50X2Rpc3Bvc2l0aW9uLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcikoY29udGVudERpc3Bvc2l0aW9uKTsKKworICAgIGlmIChmaWxlbmFtZS5pbmNsdWRlcygiJSIpKSB7CisgICAgICB0cnkgeworICAgICAgICBmaWxlbmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSk7CisgICAgICB9IGNhdGNoIChleCkge30KKyAgICB9CisKKyAgICBpZiAoL1wucGRmJC9pLnRlc3QoZmlsZW5hbWUpKSB7CisgICAgICByZXR1cm4gZmlsZW5hbWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG51bGw7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB1cmwpIHsKKyAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IHN0YXR1cyA9PT0gMCAmJiB1cmwuc3RhcnRzV2l0aCgiZmlsZToiKSkgeworICAgIHJldHVybiBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbignTWlzc2luZyBQREYgIicgKyB1cmwgKyAnIi4nKTsKKyAgfQorCisgIHJldHVybiBuZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSAoIiArIHN0YXR1cyArICcpIHdoaWxlIHJldHJpZXZpbmcgUERGICInICsgdXJsICsgJyIuJywgc3RhdHVzKTsKK30KKworZnVuY3Rpb24gdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhzdGF0dXMpIHsKKyAgcmV0dXJuIHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2OworfQorCisvKioqLyB9KSwKKy8qIDIyMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciA9IGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcjsKKworZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH0KKworZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKworZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pWyJyZXR1cm4iXSAhPSBudWxsKSBfaVsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9CisKK2Z1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfQorCitmdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIoY29udGVudERpc3Bvc2l0aW9uKSB7CisgIHZhciBuZWVkc0VuY29kaW5nRml4dXAgPSB0cnVlOworICB2YXIgdG1wID0gdG9QYXJhbVJlZ0V4cCgiZmlsZW5hbWVcXCoiLCAiaSIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTsKKworICBpZiAodG1wKSB7CisgICAgdG1wID0gdG1wWzFdOworICAgIHZhciBmaWxlbmFtZSA9IHJmYzI2MTZ1bnF1b3RlKHRtcCk7CisgICAgZmlsZW5hbWUgPSB1bmVzY2FwZShmaWxlbmFtZSk7CisgICAgZmlsZW5hbWUgPSByZmM1OTg3ZGVjb2RlKGZpbGVuYW1lKTsKKyAgICBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUoZmlsZW5hbWUpOworICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTsKKyAgfQorCisgIHRtcCA9IHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb24pOworCisgIGlmICh0bXApIHsKKyAgICB2YXIgX2ZpbGVuYW1lID0gcmZjMjA0N2RlY29kZSh0bXApOworCisgICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoX2ZpbGVuYW1lKTsKKyAgfQorCisgIHRtcCA9IHRvUGFyYW1SZWdFeHAoImZpbGVuYW1lIiwgImkiKS5leGVjKGNvbnRlbnREaXNwb3NpdGlvbik7CisKKyAgaWYgKHRtcCkgeworICAgIHRtcCA9IHRtcFsxXTsKKworICAgIHZhciBfZmlsZW5hbWUyID0gcmZjMjYxNnVucXVvdGUodG1wKTsKKworICAgIF9maWxlbmFtZTIgPSByZmMyMDQ3ZGVjb2RlKF9maWxlbmFtZTIpOworICAgIHJldHVybiBmaXh1cEVuY29kaW5nKF9maWxlbmFtZTIpOworICB9CisKKyAgZnVuY3Rpb24gdG9QYXJhbVJlZ0V4cChhdHRyaWJ1dGVQYXR0ZXJuLCBmbGFncykgeworICAgIHJldHVybiBuZXcgUmVnRXhwKCIoPzpefDspXFxzKiIgKyBhdHRyaWJ1dGVQYXR0ZXJuICsgIlxccyo9XFxzKiIgKyAiKCIgKyAnW14iO1xcc11bXjtcXHNdKicgKyAifCIgKyAnIig/OlteIlxcXFxdfFxcXFwiPykrIj8nICsgIikiLCBmbGFncyk7CisgIH0KKworICBmdW5jdGlvbiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSkgeworICAgIGlmIChlbmNvZGluZykgeworICAgICAgaWYgKCEvXltceDAwLVx4RkZdKyQvLnRlc3QodmFsdWUpKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcsIHsKKyAgICAgICAgICBmYXRhbDogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgICAgdmFyIGJ5dGVzID0gQXJyYXkuZnJvbSh2YWx1ZSwgZnVuY3Rpb24gKGNoKSB7CisgICAgICAgICAgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkgJiAweGZmOworICAgICAgICB9KTsKKyAgICAgICAgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShuZXcgVWludDhBcnJheShieXRlcykpOworICAgICAgICBuZWVkc0VuY29kaW5nRml4dXAgPSBmYWxzZTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgaWYgKC9edXRmLT84JC9pLnRlc3QoZW5jb2RpbmcpKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh2YWx1ZSkpOworICAgICAgICAgICAgbmVlZHNFbmNvZGluZ0ZpeHVwID0gZmFsc2U7CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gZml4dXBFbmNvZGluZyh2YWx1ZSkgeworICAgIGlmIChuZWVkc0VuY29kaW5nRml4dXAgJiYgL1tceDgwLVx4ZmZdLy50ZXN0KHZhbHVlKSkgeworICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKCJ1dGYtOCIsIHZhbHVlKTsKKworICAgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCkgeworICAgICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoImlzby04ODU5LTEiLCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvblN0cikgeworICAgIHZhciBtYXRjaGVzID0gW107CisgICAgdmFyIG1hdGNoOworICAgIHZhciBpdGVyID0gdG9QYXJhbVJlZ0V4cCgiZmlsZW5hbWVcXCooKD8hMFxcZClcXGQrKShcXCo/KSIsICJpZyIpOworCisgICAgd2hpbGUgKChtYXRjaCA9IGl0ZXIuZXhlYyhjb250ZW50RGlzcG9zaXRpb25TdHIpKSAhPT0gbnVsbCkgeworICAgICAgdmFyIF9tYXRjaCA9IG1hdGNoLAorICAgICAgICAgIF9tYXRjaDIgPSBfc2xpY2VkVG9BcnJheShfbWF0Y2gsIDQpLAorICAgICAgICAgIG4gPSBfbWF0Y2gyWzFdLAorICAgICAgICAgIHF1b3QgPSBfbWF0Y2gyWzJdLAorICAgICAgICAgIHBhcnQgPSBfbWF0Y2gyWzNdOworCisgICAgICBuID0gcGFyc2VJbnQobiwgMTApOworCisgICAgICBpZiAobiBpbiBtYXRjaGVzKSB7CisgICAgICAgIGlmIChuID09PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgbWF0Y2hlc1tuXSA9IFtxdW90LCBwYXJ0XTsKKyAgICB9CisKKyAgICB2YXIgcGFydHMgPSBbXTsKKworICAgIGZvciAodmFyIF9uMiA9IDA7IF9uMiA8IG1hdGNoZXMubGVuZ3RoOyArK19uMikgeworICAgICAgaWYgKCEoX24yIGluIG1hdGNoZXMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB2YXIgX21hdGNoZXMkX24gPSBfc2xpY2VkVG9BcnJheShtYXRjaGVzW19uMl0sIDIpLAorICAgICAgICAgIF9xdW90ID0gX21hdGNoZXMkX25bMF0sCisgICAgICAgICAgX3BhcnQgPSBfbWF0Y2hlcyRfblsxXTsKKworICAgICAgX3BhcnQgPSByZmMyNjE2dW5xdW90ZShfcGFydCk7CisKKyAgICAgIGlmIChfcXVvdCkgeworICAgICAgICBfcGFydCA9IHVuZXNjYXBlKF9wYXJ0KTsKKworICAgICAgICBpZiAoX24yID09PSAwKSB7CisgICAgICAgICAgX3BhcnQgPSByZmM1OTg3ZGVjb2RlKF9wYXJ0KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwYXJ0cy5wdXNoKF9wYXJ0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcGFydHMuam9pbigiIik7CisgIH0KKworICBmdW5jdGlvbiByZmMyNjE2dW5xdW90ZSh2YWx1ZSkgeworICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCciJykpIHsKKyAgICAgIHZhciBwYXJ0cyA9IHZhbHVlLnNsaWNlKDEpLnNwbGl0KCdcXCInKTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkgeworICAgICAgICB2YXIgcXVvdGluZGV4ID0gcGFydHNbaV0uaW5kZXhPZignIicpOworCisgICAgICAgIGlmIChxdW90aW5kZXggIT09IC0xKSB7CisgICAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5zbGljZSgwLCBxdW90aW5kZXgpOworICAgICAgICAgIHBhcnRzLmxlbmd0aCA9IGkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5yZXBsYWNlKC9cXCguKS9nLCAiJDEiKTsKKyAgICAgIH0KKworICAgICAgdmFsdWUgPSBwYXJ0cy5qb2luKCciJyk7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gcmZjNTk4N2RlY29kZShleHR2YWx1ZSkgeworICAgIHZhciBlbmNvZGluZ2VuZCA9IGV4dHZhbHVlLmluZGV4T2YoIiciKTsKKworICAgIGlmIChlbmNvZGluZ2VuZCA9PT0gLTEpIHsKKyAgICAgIHJldHVybiBleHR2YWx1ZTsKKyAgICB9CisKKyAgICB2YXIgZW5jb2RpbmcgPSBleHR2YWx1ZS5zbGljZSgwLCBlbmNvZGluZ2VuZCk7CisgICAgdmFyIGxhbmd2YWx1ZSA9IGV4dHZhbHVlLnNsaWNlKGVuY29kaW5nZW5kICsgMSk7CisgICAgdmFyIHZhbHVlID0gbGFuZ3ZhbHVlLnJlcGxhY2UoL15bXiddKicvLCAiIik7CisgICAgcmV0dXJuIHRleHRkZWNvZGUoZW5jb2RpbmcsIHZhbHVlKTsKKyAgfQorCisgIGZ1bmN0aW9uIHJmYzIwNDdkZWNvZGUodmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoIj0/IikgfHwgL1tceDAwLVx4MTlceDgwLVx4ZmZdLy50ZXN0KHZhbHVlKSkgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC89XD8oW1x3LV0qKVw/KFtRcUJiXSlcPygoPzpbXj9dfFw/KD8hPSkpKilcPz0vZywgZnVuY3Rpb24gKG1hdGNoZXMsIGNoYXJzZXQsIGVuY29kaW5nLCB0ZXh0KSB7CisgICAgICBpZiAoZW5jb2RpbmcgPT09ICJxIiB8fCBlbmNvZGluZyA9PT0gIlEiKSB7CisgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL18vZywgIiAiKTsKKyAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPShbMC05YS1mQS1GXXsyfSkvZywgZnVuY3Rpb24gKG1hdGNoLCBoZXgpIHsKKyAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgdGV4dCA9IGF0b2IodGV4dCk7CisgICAgICB9IGNhdGNoIChlKSB7fQorCisgICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTsKKyAgICB9KTsKKyAgfQorCisgIHJldHVybiAiIjsKK30KKworLyoqKi8gfSksCisvKiAyMjIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZOZXR3b3JrU3RyZWFtID0gdm9pZCAwOworCit2YXIgX3JlZ2VuZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dfcGRmanNfcmVxdWlyZV9fKDIpKTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9uZXR3b3JrX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjApOworCitmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfQorCitmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9CisKK2Z1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCis7Cit2YXIgT0tfUkVTUE9OU0UgPSAyMDA7Cit2YXIgUEFSVElBTF9DT05URU5UX1JFU1BPTlNFID0gMjA2OworCitmdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih4aHIpIHsKKyAgdmFyIGRhdGEgPSB4aHIucmVzcG9uc2U7CisKKyAgaWYgKHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIikgeworICAgIHJldHVybiBkYXRhOworICB9CisKKyAgdmFyIGFycmF5ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRhdGEpOworICByZXR1cm4gYXJyYXkuYnVmZmVyOworfQorCit2YXIgTmV0d29ya01hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBOZXR3b3JrTWFuYWdlcih1cmwsIGFyZ3MpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTmV0d29ya01hbmFnZXIpOworCisgICAgdGhpcy51cmwgPSB1cmw7CisgICAgYXJncyA9IGFyZ3MgfHwge307CisgICAgdGhpcy5pc0h0dHAgPSAvXmh0dHBzPzovaS50ZXN0KHVybCk7CisgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIGFyZ3MuaHR0cEhlYWRlcnMgfHwge307CisgICAgdGhpcy53aXRoQ3JlZGVudGlhbHMgPSBhcmdzLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTsKKworICAgIHRoaXMuZ2V0WGhyID0gYXJncy5nZXRYaHIgfHwgZnVuY3Rpb24gTmV0d29ya01hbmFnZXJfZ2V0WGhyKCkgeworICAgICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICAgIH07CisKKyAgICB0aGlzLmN1cnJYaHJJZCA9IDA7CisgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKE5ldHdvcmtNYW5hZ2VyLCBbeworICAgIGtleTogInJlcXVlc3RSYW5nZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBsaXN0ZW5lcnMpIHsKKyAgICAgIHZhciBhcmdzID0geworICAgICAgICBiZWdpbjogYmVnaW4sCisgICAgICAgIGVuZDogZW5kCisgICAgICB9OworCisgICAgICBmb3IgKHZhciBwcm9wIGluIGxpc3RlbmVycykgeworICAgICAgICBhcmdzW3Byb3BdID0gbGlzdGVuZXJzW3Byb3BdOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGFyZ3MpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlcXVlc3RGdWxsIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVxdWVzdEZ1bGwobGlzdGVuZXJzKSB7CisgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGxpc3RlbmVycyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVxdWVzdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlcXVlc3QoYXJncykgeworICAgICAgdmFyIHhociA9IHRoaXMuZ2V0WGhyKCk7CisgICAgICB2YXIgeGhySWQgPSB0aGlzLmN1cnJYaHJJZCsrOworICAgICAgdmFyIHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdID0geworICAgICAgICB4aHI6IHhocgorICAgICAgfTsKKyAgICAgIHhoci5vcGVuKCJHRVQiLCB0aGlzLnVybCk7CisgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7CisKKyAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMuaHR0cEhlYWRlcnMpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5odHRwSGVhZGVyc1twcm9wZXJ0eV07CisKKyAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKHByb3BlcnR5LCB2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmlzSHR0cCAmJiAiYmVnaW4iIGluIGFyZ3MgJiYgImVuZCIgaW4gYXJncykgeworICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiUmFuZ2UiLCAiYnl0ZXM9Ii5jb25jYXQoYXJncy5iZWdpbiwgIi0iKS5jb25jYXQoYXJncy5lbmQgLSAxKSk7CisgICAgICAgIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPSBPS19SRVNQT05TRTsKKyAgICAgIH0KKworICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CisKKyAgICAgIGlmIChhcmdzLm9uRXJyb3IpIHsKKyAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZ0KSB7CisgICAgICAgICAgYXJncy5vbkVycm9yKHhoci5zdGF0dXMpOworICAgICAgICB9OworICAgICAgfQorCisgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcywgeGhySWQpOworICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzLCB4aHJJZCk7CisgICAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCA9IGFyZ3Mub25IZWFkZXJzUmVjZWl2ZWQ7CisgICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUgPSBhcmdzLm9uRG9uZTsKKyAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IgPSBhcmdzLm9uRXJyb3I7CisgICAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzID0gYXJncy5vblByb2dyZXNzOworICAgICAgeGhyLnNlbmQobnVsbCk7CisgICAgICByZXR1cm4geGhySWQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAib25Qcm9ncmVzcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG9uUHJvZ3Jlc3MoeGhySWQsIGV2dCkgeworICAgICAgdmFyIHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdOworCisgICAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3MpIHsKKyAgICAgICAgcGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzcyhldnQpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uU3RhdGVDaGFuZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvblN0YXRlQ2hhbmdlKHhocklkLCBldnQpIHsKKyAgICAgIHZhciBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTsKKworICAgICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciB4aHIgPSBwZW5kaW5nUmVxdWVzdC54aHI7CisKKyAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA+PSAyICYmIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkKSB7CisgICAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkKCk7CisgICAgICAgIGRlbGV0ZSBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZDsKKyAgICAgIH0KKworICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCEoeGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTsKKworICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDAgJiYgdGhpcy5pc0h0dHApIHsKKyAgICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IpIHsKKyAgICAgICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yKHhoci5zdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgeGhyU3RhdHVzID0geGhyLnN0YXR1cyB8fCBPS19SRVNQT05TRTsKKyAgICAgIHZhciBva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ID0geGhyU3RhdHVzID09PSBPS19SRVNQT05TRSAmJiBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9PT0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFOworCisgICAgICBpZiAoIW9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QgJiYgeGhyU3RhdHVzICE9PSBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cykgeworICAgICAgICBpZiAocGVuZGluZ1JlcXVlc3Qub25FcnJvcikgeworICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IoeGhyLnN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBjaHVuayA9IGdldEFycmF5QnVmZmVyKHhocik7CisKKyAgICAgIGlmICh4aHJTdGF0dXMgPT09IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRSkgeworICAgICAgICB2YXIgcmFuZ2VIZWFkZXIgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiKTsKKyAgICAgICAgdmFyIG1hdGNoZXMgPSAvYnl0ZXMgKFxkKyktKFxkKylcLyhcZCspLy5leGVjKHJhbmdlSGVhZGVyKTsKKyAgICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHsKKyAgICAgICAgICBiZWdpbjogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLAorICAgICAgICAgIGNodW5rOiBjaHVuaworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSBpZiAoY2h1bmspIHsKKyAgICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHsKKyAgICAgICAgICBiZWdpbjogMCwKKyAgICAgICAgICBjaHVuazogY2h1bmsKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgaWYgKHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IpIHsKKyAgICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcih4aHIuc3RhdHVzKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRSZXF1ZXN0WGhyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVxdWVzdFhocih4aHJJZCkgeworICAgICAgcmV0dXJuIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNQZW5kaW5nUmVxdWVzdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGlzUGVuZGluZ1JlcXVlc3QoeGhySWQpIHsKKyAgICAgIHJldHVybiB4aHJJZCBpbiB0aGlzLnBlbmRpbmdSZXF1ZXN0czsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJhYm9ydFJlcXVlc3QiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhYm9ydFJlcXVlc3QoeGhySWQpIHsKKyAgICAgIHZhciB4aHIgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0ueGhyOworICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTsKKyAgICAgIHhoci5hYm9ydCgpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBOZXR3b3JrTWFuYWdlcjsKK30oKTsKKwordmFyIFBERk5ldHdvcmtTdHJlYW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZOZXR3b3JrU3RyZWFtKHNvdXJjZSkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZOZXR3b3JrU3RyZWFtKTsKKworICAgIHRoaXMuX3NvdXJjZSA9IHNvdXJjZTsKKyAgICB0aGlzLl9tYW5hZ2VyID0gbmV3IE5ldHdvcmtNYW5hZ2VyKHNvdXJjZS51cmwsIHsKKyAgICAgIGh0dHBIZWFkZXJzOiBzb3VyY2UuaHR0cEhlYWRlcnMsCisgICAgICB3aXRoQ3JlZGVudGlhbHM6IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMKKyAgICB9KTsKKyAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTsKKyAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7CisgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERk5ldHdvcmtTdHJlYW0sIFt7CisgICAga2V5OiAiX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkKHJlYWRlcikgeworICAgICAgdmFyIGkgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLmluZGV4T2YocmVhZGVyKTsKKworICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNwbGljZShpLCAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRGdWxsUmVhZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RnVsbFJlYWRlcigpIHsKKyAgICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERk5ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTsKKyAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCB0aGlzLl9zb3VyY2UpOworICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFJhbmdlUmVhZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkgeworICAgICAgdmFyIHJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsIGJlZ2luLCBlbmQpOworICAgICAgcmVhZGVyLm9uQ2xvc2VkID0gdGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTsKKworICAgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7CisKKyAgICAgIHJldHVybiByZWFkZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2FuY2VsQWxsUmVxdWVzdHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHsKKyAgICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgeworICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlYWRlcnMgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApOworCisgICAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikgeworICAgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgICB9KTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGTmV0d29ya1N0cmVhbTsKK30oKTsKKworZXhwb3J0cy5QREZOZXR3b3JrU3RyZWFtID0gUERGTmV0d29ya1N0cmVhbTsKKwordmFyIFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlcihtYW5hZ2VyLCBzb3VyY2UpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyKTsKKworICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyOworICAgIHZhciBhcmdzID0geworICAgICAgb25IZWFkZXJzUmVjZWl2ZWQ6IHRoaXMuX29uSGVhZGVyc1JlY2VpdmVkLmJpbmQodGhpcyksCisgICAgICBvbkRvbmU6IHRoaXMuX29uRG9uZS5iaW5kKHRoaXMpLAorICAgICAgb25FcnJvcjogdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpLAorICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpCisgICAgfTsKKyAgICB0aGlzLl91cmwgPSBzb3VyY2UudXJsOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RGdWxsKGFyZ3MpOworICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTsKKyAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKyAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTsKKworICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkgeworICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlOworICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTsKKyAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworICAgIHRoaXMuX2RvbmUgPSBmYWxzZTsKKyAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIsIFt7CisgICAga2V5OiAiX29uSGVhZGVyc1JlY2VpdmVkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX29uSGVhZGVyc1JlY2VpdmVkKCkgeworICAgICAgdmFyIGZ1bGxSZXF1ZXN0WGhySWQgPSB0aGlzLl9mdWxsUmVxdWVzdElkOworCisgICAgICB2YXIgZnVsbFJlcXVlc3RYaHIgPSB0aGlzLl9tYW5hZ2VyLmdldFJlcXVlc3RYaHIoZnVsbFJlcXVlc3RYaHJJZCk7CisKKyAgICAgIHZhciBnZXRSZXNwb25zZUhlYWRlciA9IGZ1bmN0aW9uIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGZ1bGxSZXF1ZXN0WGhyLmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpOworICAgICAgfTsKKworICAgICAgdmFyIF92YWxpZGF0ZVJhbmdlUmVxdWVzdCA9ICgwLCBfbmV0d29ya191dGlscy52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoeworICAgICAgICBnZXRSZXNwb25zZUhlYWRlcjogZ2V0UmVzcG9uc2VIZWFkZXIsCisgICAgICAgIGlzSHR0cDogdGhpcy5fbWFuYWdlci5pc0h0dHAsCisgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSwKKyAgICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2UKKyAgICAgIH0pLAorICAgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyA9IF92YWxpZGF0ZVJhbmdlUmVxdWVzdC5hbGxvd1JhbmdlUmVxdWVzdHMsCisgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoID0gX3ZhbGlkYXRlUmFuZ2VSZXF1ZXN0LnN1Z2dlc3RlZExlbmd0aDsKKworICAgICAgaWYgKGFsbG93UmFuZ2VSZXF1ZXN0cykgeworICAgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoOworICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpOworCisgICAgICBpZiAodGhpcy5faXNSYW5nZVN1cHBvcnRlZCkgeworICAgICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdChmdWxsUmVxdWVzdFhocklkKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX29uRG9uZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkRvbmUoYXJncykgeworICAgICAgaWYgKGFyZ3MpIHsKKyAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICB2YXIgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpOworCisgICAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgICAgICB2YWx1ZTogYXJncy5jaHVuaywKKyAgICAgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5fY2FjaGVkQ2h1bmtzLnB1c2goYXJncy5jaHVuayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7CisgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgIH0pOworCisgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9vbkVycm9yIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX29uRXJyb3Ioc3RhdHVzKSB7CisgICAgICB2YXIgdXJsID0gdGhpcy5fdXJsOworICAgICAgdmFyIGV4Y2VwdGlvbiA9ICgwLCBfbmV0d29ya191dGlscy5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKShzdGF0dXMsIHVybCk7CisgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGV4Y2VwdGlvbjsKKworICAgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QoZXhjZXB0aW9uKTsKKworICAgICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHsKKyAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KGV4Y2VwdGlvbik7CisgICAgICB9KTsKKworICAgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKyAgICAgIHRoaXMuX2NhY2hlZENodW5rcyA9IFtdOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9vblByb2dyZXNzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX29uUHJvZ3Jlc3MoZGF0YSkgeworICAgICAgaWYgKHRoaXMub25Qcm9ncmVzcykgeworICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICAgIGxvYWRlZDogZGF0YS5sb2FkZWQsCisgICAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoQ29tcHV0YWJsZSA/IGRhdGEudG90YWwgOiB0aGlzLl9jb250ZW50TGVuZ3RoCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlYWQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKKyAgICAgICAgdmFyIGNodW5rLCByZXF1ZXN0Q2FwYWJpbGl0eTsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNodW5rID0gdGhpcy5fY2FjaGVkQ2h1bmtzLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IGNodW5rLAorICAgICAgICAgICAgICAgICAgZG9uZTogZmFsc2UKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9kb25lKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgICAgICAgICBkb25lOiB0cnVlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlKTsKKworICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gcmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIF9yZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZWFkOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiY2FuY2VsIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsKHJlYXNvbikgeworICAgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CisKKyAgICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7CisgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgIH0pOworCisgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworCisgICAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpKSB7CisgICAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpOworICAgICAgfQorCisgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmlsZW5hbWUiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzUmFuZ2VTdXBwb3J0ZWQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNTdHJlYW1pbmdTdXBwb3J0ZWQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNvbnRlbnRMZW5ndGgiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaGVhZGVyc1JlYWR5IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlcjsKK30oKTsKKwordmFyIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKG1hbmFnZXIsIGJlZ2luLCBlbmQpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcik7CisKKyAgICB0aGlzLl9tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB2YXIgYXJncyA9IHsKKyAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksCisgICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcykKKyAgICB9OworICAgIHRoaXMuX3JlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQsIGFyZ3MpOworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsOworICAgIHRoaXMuX2RvbmUgPSBmYWxzZTsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICAgIHRoaXMub25DbG9zZWQgPSBudWxsOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIsIFt7CisgICAga2V5OiAiX2Nsb3NlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2Nsb3NlKCkgeworICAgICAgaWYgKHRoaXMub25DbG9zZWQpIHsKKyAgICAgICAgdGhpcy5vbkNsb3NlZCh0aGlzKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfb25Eb25lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX29uRG9uZShkYXRhKSB7CisgICAgICB2YXIgY2h1bmsgPSBkYXRhLmNodW5rOworCisgICAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkgeworICAgICAgICB2YXIgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpOworCisgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICAgIHZhbHVlOiBjaHVuaywKKyAgICAgICAgICBkb25lOiBmYWxzZQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7CisgICAgICB9CisKKyAgICAgIHRoaXMuX2RvbmUgPSB0cnVlOworCisgICAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICAgIGRvbmU6IHRydWUKKyAgICAgICAgfSk7CisgICAgICB9KTsKKworICAgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKworICAgICAgdGhpcy5fY2xvc2UoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfb25Qcm9ncmVzcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9vblByb2dyZXNzKGV2dCkgeworICAgICAgaWYgKCF0aGlzLmlzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMub25Qcm9ncmVzcykgeworICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZAorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZWFkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9yZWFkMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHsKKyAgICAgICAgdmFyIGNodW5rLCByZXF1ZXN0Q2FwYWJpbGl0eTsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmICghKHRoaXMuX3F1ZXVlZENodW5rICE9PSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVuazsKKyAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiBjaHVuaywKKyAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZG9uZSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA2OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgICAgICAgICBkb25lOiB0cnVlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZSk7CisKKyAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiByZWFkKCkgeworICAgICAgICByZXR1cm4gX3JlYWQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZWFkOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiY2FuY2VsIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsKHJlYXNvbikgeworICAgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7CisgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgIH0pOworCisgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworCisgICAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCkpIHsKKyAgICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fcmVxdWVzdElkKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fY2xvc2UoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1N0cmVhbWluZ1N1cHBvcnRlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXI7Cit9KCk7CisKKy8qKiovIH0pLAorLyogMjIzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGRmV0Y2hTdHJlYW0gPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oMikpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX25ldHdvcmtfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyMCk7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9CisKK2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH0KKworZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7IGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKKzsKKworZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKGhlYWRlcnMsIHdpdGhDcmVkZW50aWFscywgYWJvcnRDb250cm9sbGVyKSB7CisgIHJldHVybiB7CisgICAgbWV0aG9kOiAiR0VUIiwKKyAgICBoZWFkZXJzOiBoZWFkZXJzLAorICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyICYmIGFib3J0Q29udHJvbGxlci5zaWduYWwsCisgICAgbW9kZTogImNvcnMiLAorICAgIGNyZWRlbnRpYWxzOiB3aXRoQ3JlZGVudGlhbHMgPyAiaW5jbHVkZSIgOiAic2FtZS1vcmlnaW4iLAorICAgIHJlZGlyZWN0OiAiZm9sbG93IgorICB9OworfQorCitmdW5jdGlvbiBjcmVhdGVIZWFkZXJzKGh0dHBIZWFkZXJzKSB7CisgIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTsKKworICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBodHRwSGVhZGVycykgeworICAgIHZhciB2YWx1ZSA9IGh0dHBIZWFkZXJzW3Byb3BlcnR5XTsKKworICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBoZWFkZXJzLmFwcGVuZChwcm9wZXJ0eSwgdmFsdWUpOworICB9CisKKyAgcmV0dXJuIGhlYWRlcnM7Cit9CisKK3ZhciBQREZGZXRjaFN0cmVhbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBERkZldGNoU3RyZWFtKHNvdXJjZSkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZGZXRjaFN0cmVhbSk7CisKKyAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3Qoc291cmNlLnVybCk7CisgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTsKKyAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7CisgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERkZldGNoU3RyZWFtLCBbeworICAgIGtleTogImdldEZ1bGxSZWFkZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGdWxsUmVhZGVyKCkgeworICAgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCAiUERGRmV0Y2hTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTsKKyAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERkZldGNoU3RyZWFtUmVhZGVyKHRoaXMpOworICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFJhbmdlUmVhZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkgeworICAgICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciByZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTsKKworICAgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7CisKKyAgICAgIHJldHVybiByZWFkZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2FuY2VsQWxsUmVxdWVzdHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHsKKyAgICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgeworICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlYWRlcnMgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApOworCisgICAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikgeworICAgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQgOiAwOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQREZGZXRjaFN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5QREZGZXRjaFN0cmVhbSA9IFBERkZldGNoU3RyZWFtOworCit2YXIgUERGRmV0Y2hTdHJlYW1SZWFkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZGZXRjaFN0cmVhbVJlYWRlcihzdHJlYW0pIHsKKyAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERkZldGNoU3RyZWFtUmVhZGVyKTsKKworICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLl9yZWFkZXIgPSBudWxsOworICAgIHRoaXMuX2xvYWRlZCA9IDA7CisgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsOworICAgIHZhciBzb3VyY2UgPSBzdHJlYW0uc291cmNlOworICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7CisgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CisgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTsKKyAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTsKKworICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkgeworICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKKyAgICB9CisKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTsKKyAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7CisgICAgdGhpcy5faGVhZGVycyA9IGNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTsKKyAgICB2YXIgdXJsID0gc291cmNlLnVybDsKKyAgICBmZXRjaCh1cmwsIGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLCB0aGlzLl93aXRoQ3JlZGVudGlhbHMsIHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CisgICAgICBpZiAoISgwLCBfbmV0d29ya191dGlscy52YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKShyZXNwb25zZS5zdGF0dXMpKSB7CisgICAgICAgIHRocm93ICgwLCBfbmV0d29ya191dGlscy5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKShyZXNwb25zZS5zdGF0dXMsIHVybCk7CisgICAgICB9CisKKyAgICAgIF90aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpOworCisgICAgICBfdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICB2YXIgZ2V0UmVzcG9uc2VIZWFkZXIgPSBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcihuYW1lKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZS5oZWFkZXJzLmdldChuYW1lKTsKKyAgICAgIH07CisKKyAgICAgIHZhciBfdmFsaWRhdGVSYW5nZVJlcXVlc3QgPSAoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHsKKyAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGdldFJlc3BvbnNlSGVhZGVyLAorICAgICAgICBpc0h0dHA6IF90aGlzLl9zdHJlYW0uaXNIdHRwLAorICAgICAgICByYW5nZUNodW5rU2l6ZTogX3RoaXMuX3JhbmdlQ2h1bmtTaXplLAorICAgICAgICBkaXNhYmxlUmFuZ2U6IF90aGlzLl9kaXNhYmxlUmFuZ2UKKyAgICAgIH0pLAorICAgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyA9IF92YWxpZGF0ZVJhbmdlUmVxdWVzdC5hbGxvd1JhbmdlUmVxdWVzdHMsCisgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoID0gX3ZhbGlkYXRlUmFuZ2VSZXF1ZXN0LnN1Z2dlc3RlZExlbmd0aDsKKworICAgICAgX3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBhbGxvd1JhbmdlUmVxdWVzdHM7CisgICAgICBfdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCBfdGhpcy5fY29udGVudExlbmd0aDsKKyAgICAgIF90aGlzLl9maWxlbmFtZSA9ICgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7CisKKyAgICAgIGlmICghX3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIF90aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7CisgICAgICAgIF90aGlzLmNhbmNlbChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oIlN0cmVhbWluZyBpcyBkaXNhYmxlZC4iKSk7CisgICAgICB9CisgICAgfSlbImNhdGNoIl0odGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERkZldGNoU3RyZWFtUmVhZGVyLCBbeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlYWQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKKyAgICAgICAgdmFyIF95aWVsZCR0aGlzJF9yZWFkZXIkciwgdmFsdWUsIGRvbmUsIGJ1ZmZlcjsKKworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkKCk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIF95aWVsZCR0aGlzJF9yZWFkZXIkciA9IF9jb250ZXh0LnNlbnQ7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBfeWllbGQkdGhpcyRfcmVhZGVyJHIudmFsdWU7CisgICAgICAgICAgICAgICAgZG9uZSA9IF95aWVsZCR0aGlzJF9yZWFkZXIkci5kb25lOworCisgICAgICAgICAgICAgICAgaWYgKCFkb25lKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IGRvbmUKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCwKKyAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGgKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHZhbHVlKS5idWZmZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIHJlYWQoKSB7CisgICAgICAgIHJldHVybiBfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVhZDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImNhbmNlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgIGlmICh0aGlzLl9yZWFkZXIpIHsKKyAgICAgICAgdGhpcy5fcmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fYWJvcnRDb250cm9sbGVyKSB7CisgICAgICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImhlYWRlcnNSZWFkeSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmaWxlbmFtZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29udGVudExlbmd0aCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1JhbmdlU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzU3RyZWFtaW5nU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGRmV0Y2hTdHJlYW1SZWFkZXI7Cit9KCk7CisKK3ZhciBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcihzdHJlYW0sIGJlZ2luLCBlbmQpIHsKKyAgICB2YXIgX3RoaXMyID0gdGhpczsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyKTsKKworICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLl9yZWFkZXIgPSBudWxsOworICAgIHRoaXMuX2xvYWRlZCA9IDA7CisgICAgdmFyIHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7CisgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTsKKyAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTsKKworICAgIGlmICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAidW5kZWZpbmVkIikgeworICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOworICAgIH0KKworICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7CisKKyAgICB0aGlzLl9oZWFkZXJzLmFwcGVuZCgiUmFuZ2UiLCAiYnl0ZXM9Ii5jb25jYXQoYmVnaW4sICItIikuY29uY2F0KGVuZCAtIDEpKTsKKworICAgIHZhciB1cmwgPSBzb3VyY2UudXJsOworICAgIGZldGNoKHVybCwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKKyAgICAgIGlmICghKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHJlc3BvbnNlLnN0YXR1cykpIHsKKyAgICAgICAgdGhyb3cgKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHJlc3BvbnNlLnN0YXR1cywgdXJsKTsKKyAgICAgIH0KKworICAgICAgX3RoaXMyLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgIF90aGlzMi5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTsKKyAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5uYW1lID09PSAiQWJvcnRFcnJvciIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aHJvdyByZWFzb247CisgICAgfSk7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyLCBbeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlYWQyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgeworICAgICAgICB2YXIgX3lpZWxkJHRoaXMkX3JlYWRlciRyMiwgdmFsdWUsIGRvbmUsIGJ1ZmZlcjsKKworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkKCk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIF95aWVsZCR0aGlzJF9yZWFkZXIkcjIgPSBfY29udGV4dDIuc2VudDsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IF95aWVsZCR0aGlzJF9yZWFkZXIkcjIudmFsdWU7CisgICAgICAgICAgICAgICAgZG9uZSA9IF95aWVsZCR0aGlzJF9yZWFkZXIkcjIuZG9uZTsKKworICAgICAgICAgICAgICAgIGlmICghZG9uZSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA5OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IGRvbmUKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZAorICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpLmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gcmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIF9yZWFkMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVhZDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImNhbmNlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgIGlmICh0aGlzLl9yZWFkZXIpIHsKKyAgICAgICAgdGhpcy5fcmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fYWJvcnRDb250cm9sbGVyKSB7CisgICAgICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImlzU3RyZWFtaW5nU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcjsKK30oKTsKKworLyoqKi8gfSkKKy8qKioqKiovIF0pOworfSk7CisvLyMgc291cmNlTWFwcGluZ1VSTD1wZGYuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXM1L2J1aWxkL3BkZi5qcy5tYXAgYi9lczUvYnVpbGQvcGRmLmpzLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDhlYWYwCi0tLSAvZGV2L251bGwKKysrIGIvZXM1L2J1aWxkL3BkZi5qcy5tYXAKQEAgLTAsMCArMSBAQAoreyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL3BkZi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvc2hhcmVkL3V0aWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL3NoYXJlZC9jb21wYXRpYmlsaXR5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9zaGFyZWQvaXNfbm9kZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9nbG9iYWwtdGhpcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXRoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL3N0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3QtYS1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW50cnktdW5iaW5kLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL2VuZHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL2luY2x1ZGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2FycmF5L2luY2x1ZGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9mcm9tLWVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcm9tLWVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbWF0aC9sb2cyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvdHlwZWQtYXJyYXkvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zbGljZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLW5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvd2ViL3VybC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS11cmwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wdW55Y29kZS10by1hc2NpaS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy93ZWItc3RyZWFtcy1wb2x5ZmlsbC9kaXN0L3BvbnlmaWxsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL21hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zZXQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvd2Vhay1tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy93ZWFrLXNldC9pbmRleC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstc2V0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9jb2RlLXBvaW50LWF0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL2Zyb20tY29kZS1wb2ludC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2guanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuc2VhcmNoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wudW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL3BhZC1zdGFydC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQtd2Via2l0LWJ1Zy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zdHJpbmcvcGFkLWVuZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9hcGkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvZm9udF9sb2FkZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvbm9kZV91dGlscy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9hbm5vdGF0aW9uX3N0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvYXBpX2NvbXBhdGliaWxpdHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvY2FudmFzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L3BhdHRlcm5faGVscGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L3dvcmtlcl9vcHRpb25zLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9zaGFyZWQvbWVzc2FnZV9oYW5kbGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L21ldGFkYXRhLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L3htbF9wYXJzZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvb3B0aW9uYWxfY29udGVudF9jb25maWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvdHJhbnNwb3J0X3N0cmVhbS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS93ZWJnbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9hbm5vdGF0aW9uX2xheWVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L3RleHRfbGF5ZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvc3ZnLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L25vZGVfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L25ldHdvcmtfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYvc3JjL2Rpc3BsYXkvY29udGVudF9kaXNwb3NpdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi9zcmMvZGlzcGxheS9uZXR3b3JrLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmL3NyYy9kaXNwbGF5L2ZldGNoX3N0cmVhbS5qcyJdLCJuYW1lcyI6WyJwZGZqc1ZlcnNpb24iLCJwZGZqc0J1aWxkIiwicmVxdWlyZSIsIlBERk5vZGVTdHJlYW0iLCJzZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeSIsInBhcmFtcyIsIlBERk5ldHdvcmtTdHJlYW0iLCJQREZGZXRjaFN0cmVhbSIsImlzVmFsaWRGZXRjaFVybCIsIkRFRkFVTFRfTElOS19SRUwiLCJTVkdfTlMiLCJjb25zdHJ1Y3RvciIsInVucmVhY2hhYmxlIiwiY3JlYXRlIiwicmVzZXQiLCJjYW52YXNBbmRDb250ZXh0Iiwid2lkdGgiLCJoZWlnaHQiLCJkZXN0cm95Iiwib3duZXJEb2N1bWVudCIsImdsb2JhbFRoaXMiLCJjYW52YXMiLCJjb250ZXh0IiwiYmFzZVVybCIsImlzQ29tcHJlc3NlZCIsInVybCIsImNvbXByZXNzaW9uVHlwZSIsIkNNYXBDb21wcmVzc2lvblR5cGUiLCJyZWFzb24iLCJfZmV0Y2hEYXRhIiwiaXNGZXRjaFN1cHBvcnRlZCIsImRvY3VtZW50IiwicmVzcG9uc2UiLCJjTWFwRGF0YSIsInN0cmluZ1RvQnl0ZXMiLCJyZXF1ZXN0IiwiWE1MSHR0cFJlcXVlc3QiLCJyZXNvbHZlIiwicmVqZWN0IiwiYXNzZXJ0Iiwic3ZnIiwiY3JlYXRlRWxlbWVudCIsIm9mZnNldFgiLCJvZmZzZXRZIiwiZG9udEZsaXAiLCJjZW50ZXJYIiwidmlld0JveCIsImNlbnRlclkiLCJyb3RhdGlvbiIsInJvdGF0ZUEiLCJyb3RhdGVCIiwicm90YXRlQyIsInJvdGF0ZUQiLCJvZmZzZXRDYW52YXNYIiwiTWF0aCIsIm9mZnNldENhbnZhc1kiLCJjbG9uZSIsInNjYWxlIiwiY29udmVydFRvVmlld3BvcnRQb2ludCIsImNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlIiwidG9wTGVmdCIsInJlY3QiLCJib3R0b21SaWdodCIsImNvbnZlcnRUb1BkZlBvaW50IiwiTGlua1RhcmdldCIsIk5PTkUiLCJTRUxGIiwiQkxBTksiLCJQQVJFTlQiLCJUT1AiLCJlbmFibGVkIiwidXJsTnVsbFJlbW92ZWQiLCJyZW1vdmVOdWxsQ2hhcmFjdGVycyIsImxpbmsiLCJ0YXJnZXRTdHIiLCJhbmNob3IiLCJxdWVyeSIsImVuZCIsIk9iamVjdCIsInRpbWUiLCJuYW1lIiwid2FybiIsIkRhdGUiLCJ0aW1lRW5kIiwic3RhcnQiLCJvdXRCdWYiLCJsb25nZXN0IiwiZHVyYXRpb24iLCJSZXNwb25zZSIsInByb3RvY29sIiwic2NyaXB0IiwiY29uc29sZSIsImlzU3RyaW5nIiwicGRmRGF0ZVN0cmluZ1JlZ2V4IiwibWF0Y2hlcyIsInllYXIiLCJwYXJzZUludCIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsInVuaXZlcnNhbFRpbWVSZWxhdGlvbiIsIm9mZnNldEhvdXIiLCJvZmZzZXRNaW51dGUiLCJtb2R1bGUiLCJydW50aW1lIiwiT3AiLCJoYXNPd24iLCIkU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ2YWx1ZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIm9iaiIsImRlZmluZSIsInByb3RvR2VuZXJhdG9yIiwib3V0ZXJGbiIsImdlbmVyYXRvciIsInRyeUxvY3NMaXN0IiwibWFrZUludm9rZU1ldGhvZCIsImV4cG9ydHMiLCJ0eXBlIiwiYXJnIiwiZm4iLCJHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0IiwiR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCIsIkdlblN0YXRlRXhlY3V0aW5nIiwiR2VuU3RhdGVDb21wbGV0ZWQiLCJDb250aW51ZVNlbnRpbmVsIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkdlbmVyYXRvciIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiY3RvciIsImdlbkZ1biIsIl9fYXdhaXQiLCJyZWNvcmQiLCJ0cnlDYXRjaCIsInJlc3VsdCIsImludm9rZSIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaXRlciIsIndyYXAiLCJzdGF0ZSIsIm1ldGhvZCIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsImRvbmUiLCJpbmZvIiwiZW50cnkiLCJ0cnlMb2MiLCJsb2NzIiwia2V5cyIsImtleSIsIm5leHQiLCJpdGVyYXRvck1ldGhvZCIsIml0ZXJhYmxlIiwiaXNOYU4iLCJpIiwiQ29udGV4dCIsInN0b3AiLCJyb290RW50cnkiLCJyb290UmVjb3JkIiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJoYW5kbGUiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJhYnJ1cHQiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsInJlc2V0VHJ5RW50cnkiLCJ0aHJvd24iLCJkZWxlZ2F0ZVlpZWxkIiwiaXRlcmF0b3IiLCJyZXN1bHROYW1lIiwibmV4dExvYyIsInJlZ2VuZXJhdG9yUnVudGltZSIsIkZ1bmN0aW9uIiwiZ2V0IiwiSURFTlRJVFlfTUFUUklYIiwiRk9OVF9JREVOVElUWV9NQVRSSVgiLCJQZXJtaXNzaW9uRmxhZyIsIlBSSU5UIiwiTU9ESUZZX0NPTlRFTlRTIiwiQ09QWSIsIk1PRElGWV9BTk5PVEFUSU9OUyIsIkZJTExfSU5URVJBQ1RJVkVfRk9STVMiLCJDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZIiwiQVNTRU1CTEUiLCJQUklOVF9ISUdIX1FVQUxJVFkiLCJUZXh0UmVuZGVyaW5nTW9kZSIsIkZJTEwiLCJTVFJPS0UiLCJGSUxMX1NUUk9LRSIsIklOVklTSUJMRSIsIkZJTExfQUREX1RPX1BBVEgiLCJTVFJPS0VfQUREX1RPX1BBVEgiLCJGSUxMX1NUUk9LRV9BRERfVE9fUEFUSCIsIkFERF9UT19QQVRIIiwiRklMTF9TVFJPS0VfTUFTSyIsIkFERF9UT19QQVRIX0ZMQUciLCJJbWFnZUtpbmQiLCJHUkFZU0NBTEVfMUJQUCIsIlJHQl8yNEJQUCIsIlJHQkFfMzJCUFAiLCJBbm5vdGF0aW9uVHlwZSIsIlRFWFQiLCJMSU5LIiwiRlJFRVRFWFQiLCJMSU5FIiwiU1FVQVJFIiwiQ0lSQ0xFIiwiUE9MWUdPTiIsIlBPTFlMSU5FIiwiSElHSExJR0hUIiwiVU5ERVJMSU5FIiwiU1FVSUdHTFkiLCJTVFJJS0VPVVQiLCJTVEFNUCIsIkNBUkVUIiwiSU5LIiwiUE9QVVAiLCJGSUxFQVRUQUNITUVOVCIsIlNPVU5EIiwiTU9WSUUiLCJXSURHRVQiLCJTQ1JFRU4iLCJQUklOVEVSTUFSSyIsIlRSQVBORVQiLCJXQVRFUk1BUksiLCJUSFJFRUQiLCJSRURBQ1QiLCJBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUiLCJNQVJLRUQiLCJSRVZJRVciLCJBbm5vdGF0aW9uTWFya2VkU3RhdGUiLCJVTk1BUktFRCIsIkFubm90YXRpb25SZXZpZXdTdGF0ZSIsIkFDQ0VQVEVEIiwiUkVKRUNURUQiLCJDQU5DRUxMRUQiLCJDT01QTEVURUQiLCJBbm5vdGF0aW9uUmVwbHlUeXBlIiwiR1JPVVAiLCJSRVBMWSIsIkFubm90YXRpb25GbGFnIiwiSElEREVOIiwiTk9aT09NIiwiTk9ST1RBVEUiLCJOT1ZJRVciLCJSRUFET05MWSIsIkxPQ0tFRCIsIlRPR0dMRU5PVklFVyIsIkxPQ0tFRENPTlRFTlRTIiwiQW5ub3RhdGlvbkZpZWxkRmxhZyIsIlJFUVVJUkVEIiwiTk9FWFBPUlQiLCJNVUxUSUxJTkUiLCJQQVNTV09SRCIsIk5PVE9HR0xFVE9PRkYiLCJSQURJTyIsIlBVU0hCVVRUT04iLCJDT01CTyIsIkVESVQiLCJTT1JUIiwiRklMRVNFTEVDVCIsIk1VTFRJU0VMRUNUIiwiRE9OT1RTUEVMTENIRUNLIiwiRE9OT1RTQ1JPTEwiLCJDT01CIiwiUklDSFRFWFQiLCJSQURJT1NJTlVOSVNPTiIsIkNPTU1JVE9OU0VMQ0hBTkdFIiwiQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSIsIlNPTElEIiwiREFTSEVEIiwiQkVWRUxFRCIsIklOU0VUIiwiU3RyZWFtVHlwZSIsIlVOS05PV04iLCJGTEFURSIsIkxaVyIsIkRDVCIsIkpQWCIsIkpCSUciLCJBODUiLCJBSFgiLCJDQ0YiLCJSTFgiLCJGb250VHlwZSIsIlRZUEUxIiwiVFlQRTFDIiwiQ0lERk9OVFRZUEUwIiwiQ0lERk9OVFRZUEUwQyIsIlRSVUVUWVBFIiwiQ0lERk9OVFRZUEUyIiwiVFlQRTMiLCJPUEVOVFlQRSIsIlRZUEUwIiwiTU1UWVBFMSIsIlZlcmJvc2l0eUxldmVsIiwiRVJST1JTIiwiV0FSTklOR1MiLCJJTkZPUyIsIkJJTkFSWSIsIlNUUkVBTSIsIk9QUyIsImRlcGVuZGVuY3kiLCJzZXRMaW5lV2lkdGgiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRNaXRlckxpbWl0Iiwic2V0RGFzaCIsInNldFJlbmRlcmluZ0ludGVudCIsInNldEZsYXRuZXNzIiwic2V0R1N0YXRlIiwic2F2ZSIsInJlc3RvcmUiLCJ0cmFuc2Zvcm0iLCJtb3ZlVG8iLCJsaW5lVG8iLCJjdXJ2ZVRvIiwiY3VydmVUbzIiLCJjdXJ2ZVRvMyIsImNsb3NlUGF0aCIsInJlY3RhbmdsZSIsInN0cm9rZSIsImNsb3NlU3Ryb2tlIiwiZmlsbCIsImVvRmlsbCIsImZpbGxTdHJva2UiLCJlb0ZpbGxTdHJva2UiLCJjbG9zZUZpbGxTdHJva2UiLCJjbG9zZUVPRmlsbFN0cm9rZSIsImVuZFBhdGgiLCJjbGlwIiwiZW9DbGlwIiwiYmVnaW5UZXh0IiwiZW5kVGV4dCIsInNldENoYXJTcGFjaW5nIiwic2V0V29yZFNwYWNpbmciLCJzZXRIU2NhbGUiLCJzZXRMZWFkaW5nIiwic2V0Rm9udCIsInNldFRleHRSZW5kZXJpbmdNb2RlIiwic2V0VGV4dFJpc2UiLCJtb3ZlVGV4dCIsInNldExlYWRpbmdNb3ZlVGV4dCIsInNldFRleHRNYXRyaXgiLCJuZXh0TGluZSIsInNob3dUZXh0Iiwic2hvd1NwYWNlZFRleHQiLCJuZXh0TGluZVNob3dUZXh0IiwibmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQiLCJzZXRDaGFyV2lkdGgiLCJzZXRDaGFyV2lkdGhBbmRCb3VuZHMiLCJzZXRTdHJva2VDb2xvclNwYWNlIiwic2V0RmlsbENvbG9yU3BhY2UiLCJzZXRTdHJva2VDb2xvciIsInNldFN0cm9rZUNvbG9yTiIsInNldEZpbGxDb2xvciIsInNldEZpbGxDb2xvck4iLCJzZXRTdHJva2VHcmF5Iiwic2V0RmlsbEdyYXkiLCJzZXRTdHJva2VSR0JDb2xvciIsInNldEZpbGxSR0JDb2xvciIsInNldFN0cm9rZUNNWUtDb2xvciIsInNldEZpbGxDTVlLQ29sb3IiLCJzaGFkaW5nRmlsbCIsImJlZ2luSW5saW5lSW1hZ2UiLCJiZWdpbkltYWdlRGF0YSIsImVuZElubGluZUltYWdlIiwicGFpbnRYT2JqZWN0IiwibWFya1BvaW50IiwibWFya1BvaW50UHJvcHMiLCJiZWdpbk1hcmtlZENvbnRlbnQiLCJiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyIsImVuZE1hcmtlZENvbnRlbnQiLCJiZWdpbkNvbXBhdCIsImVuZENvbXBhdCIsInBhaW50Rm9ybVhPYmplY3RCZWdpbiIsInBhaW50Rm9ybVhPYmplY3RFbmQiLCJiZWdpbkdyb3VwIiwiZW5kR3JvdXAiLCJiZWdpbkFubm90YXRpb25zIiwiZW5kQW5ub3RhdGlvbnMiLCJiZWdpbkFubm90YXRpb24iLCJlbmRBbm5vdGF0aW9uIiwicGFpbnRKcGVnWE9iamVjdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwIiwicGFpbnRJbWFnZVhPYmplY3QiLCJwYWludElubGluZUltYWdlWE9iamVjdCIsInBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAiLCJwYWludEltYWdlWE9iamVjdFJlcGVhdCIsInBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCIsInBhaW50U29saWRDb2xvckltYWdlTWFzayIsImNvbnN0cnVjdFBhdGgiLCJVTlNVUFBPUlRFRF9GRUFUVVJFUyIsInVua25vd24iLCJmb3JtcyIsImphdmFTY3JpcHQiLCJzbWFzayIsInNoYWRpbmdQYXR0ZXJuIiwiZm9udCIsImVycm9yVGlsaW5nUGF0dGVybiIsImVycm9yRXh0R1N0YXRlIiwiZXJyb3JYT2JqZWN0IiwiZXJyb3JGb250TG9hZFR5cGUzIiwiZXJyb3JGb250U3RhdGUiLCJlcnJvckZvbnRNaXNzaW5nIiwiZXJyb3JGb250VHJhbnNsYXRlIiwiZXJyb3JDb2xvclNwYWNlIiwiZXJyb3JPcGVyYXRvckxpc3QiLCJlcnJvckZvbnRUb1VuaWNvZGUiLCJlcnJvckZvbnRMb2FkTmF0aXZlIiwiZXJyb3JGb250R2V0UGF0aCIsImVycm9yTWFya2VkQ29udGVudCIsIlBhc3N3b3JkUmVzcG9uc2VzIiwiTkVFRF9QQVNTV09SRCIsIklOQ09SUkVDVF9QQVNTV09SRCIsInZlcmJvc2l0eSIsIk51bWJlciIsImJhc2UiLCJvdGhlciIsImFic29sdXRlVXJsIiwiX2lzVmFsaWRQcm90b2NvbCIsIkJhc2VFeGNlcHRpb24iLCJOdWxsQ2hhcmFjdGVyc1JlZ0V4cCIsInN0ciIsImJ5dGVzIiwibGVuZ3RoIiwiTUFYX0FSR1VNRU5UX0NPVU5UIiwiU3RyaW5nIiwic3RyQnVmIiwiY2h1bmtFbmQiLCJjaHVuayIsImFyciIsInJlc3VsdExlbmd0aCIsImFycmF5Qnl0ZUxlbmd0aCIsInBvcyIsImRhdGEiLCJpdGVtIiwiaXRlbUxlbmd0aCIsImJ1ZmZlcjgiLCJ2aWV3MzIiLCJJc0xpdHRsZUVuZGlhbkNhY2hlZCIsInNoYWRvdyIsImlzTGl0dGxlRW5kaWFuIiwiSXNFdmFsU3VwcG9ydGVkQ2FjaGVkIiwiaXNFdmFsU3VwcG9ydGVkIiwicmdiQnVmIiwibTEiLCJtMiIsInh0IiwicCIsIm0iLCJ5dCIsImQiLCJwMSIsIlV0aWwiLCJwMiIsInIiLCJwMyIsInA0IiwidiIsInRyYW5zcG9zZSIsImEiLCJiIiwiYyIsImZpcnN0Iiwic3giLCJzeSIsIm9yZGVyZWRYIiwicmVjdDEiLCJyZWN0MiIsIm9yZGVyZWRZIiwiUERGU3RyaW5nVHJhbnNsYXRlVGFibGUiLCJjb2RlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhcnIxIiwiYXJyMiIsImVsZW1lbnQiLCJkYXRlIiwiYnVmZmVyIiwiY2FwYWJpbGl0eSIsImlzU2V0dGxlZCIsImNyZWF0ZU9iamVjdFVSTCIsImRpZ2l0cyIsImZvcmNlRGF0YVNjaGVtYSIsIlVSTCIsImJsb2IiLCJpaSIsImIxIiwiYjIiLCJiMyIsImQxIiwiZDIiLCJkMyIsImQ0IiwiaGFzRE9NIiwidXNlckFnZW50IiwibmF2aWdhdG9yIiwiaXNJRSIsIkJ1ZmZlciIsIkVsZW1lbnQiLCJkaXYiLCJPcmlnaW5hbERPTVRva2VuTGlzdEFkZCIsIkRPTVRva2VuTGlzdCIsIk9yaWdpbmFsRE9NVG9rZW5MaXN0UmVtb3ZlIiwidG9rZW4iLCJmb3JjZSIsImFyZ3VtZW50cyIsIk9yaWdpbmFsUHVzaFN0YXRlIiwid2luZG93IiwiT3JpZ2luYWxSZXBsYWNlU3RhdGUiLCJhcmdzIiwiQXJyYXkiLCJVaW50OEFycmF5IiwiaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCIsImNvbnRyb2xsZXIiLCJpc05vZGVKUyIsInByb2Nlc3MiLCIkIiwiZ2xvYmFsIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZiIsImNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSIsInJlZGVmaW5lIiwic2V0R2xvYmFsIiwiY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyIsImlzRm9yY2VkIiwib3B0aW9ucyIsInNvdXJjZSIsIlRBUkdFVCIsInRhcmdldCIsIkdMT0JBTCIsIlNUQVRJQyIsInN0YXQiLCJGT1JDRUQiLCJ0YXJnZXRQcm9wZXJ0eSIsInNvdXJjZVByb3BlcnR5IiwiZGVzY3JpcHRvciIsInByb3RvdHlwZSIsIm5vVGFyZ2V0R2V0IiwiZm9yY2VkIiwidW5kZWZpbmVkIiwic2hhbSIsImNoZWNrIiwiaXQiLCJzZWxmIiwiREVTQ1JJUFRPUlMiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSIsImNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciIsInRvSW5kZXhlZE9iamVjdCIsInRvUHJpbWl0aXZlIiwiaGFzIiwiSUU4X0RPTV9ERUZJTkUiLCJuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJPIiwiUCIsImVycm9yIiwiY2FsbCIsImZhaWxzIiwiZGVmaW5lUHJvcGVydHkiLCJleGVjIiwibmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIk5BU0hPUk5fQlVHIiwiViIsImJpdG1hcCIsIkluZGV4ZWRPYmplY3QiLCJyZXF1aXJlT2JqZWN0Q29lcmNpYmxlIiwiY2xhc3NvZiIsInNwbGl0IiwidG9TdHJpbmciLCJzbGljZSIsIlR5cGVFcnJvciIsImlzT2JqZWN0IiwiaW5wdXQiLCJQUkVGRVJSRURfU1RSSU5HIiwidmFsIiwidmFsdWVPZiIsImhhc093blByb3BlcnR5IiwiRVhJU1RTIiwiZGVmaW5lUHJvcGVydHlNb2R1bGUiLCJvYmplY3QiLCJhbk9iamVjdCIsIm5hdGl2ZURlZmluZVByb3BlcnR5IiwiQXR0cmlidXRlcyIsImluc3BlY3RTb3VyY2UiLCJJbnRlcm5hbFN0YXRlTW9kdWxlIiwiZ2V0SW50ZXJuYWxTdGF0ZSIsImVuZm9yY2VJbnRlcm5hbFN0YXRlIiwiZW5mb3JjZSIsIlRFTVBMQVRFIiwidW5zYWZlIiwic2ltcGxlIiwiam9pbiIsInN0b3JlIiwiZnVuY3Rpb25Ub1N0cmluZyIsIlNIQVJFRCIsIk5BVElWRV9XRUFLX01BUCIsIm9iamVjdEhhcyIsInNoYXJlZEtleSIsImhpZGRlbktleXMiLCJXZWFrTWFwIiwic2V0IiwiZ2V0dGVyRm9yIiwiVFlQRSIsIndtZ2V0Iiwid21oYXMiLCJ3bXNldCIsIm1ldGFkYXRhIiwiU1RBVEUiLCJ0ZXN0Iiwic2hhcmVkIiwidWlkIiwiSVNfUFVSRSIsInB1c2giLCJ2ZXJzaW9uIiwibW9kZSIsImNvcHlyaWdodCIsImlkIiwicG9zdGZpeCIsInJhbmRvbSIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUiLCJnZXRCdWlsdEluIiwiZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSIsImdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImNvbmNhdCIsInBhdGgiLCJhRnVuY3Rpb24iLCJ2YXJpYWJsZSIsIm5hbWVzcGFjZSIsImludGVybmFsT2JqZWN0S2V5cyIsImVudW1CdWdLZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImluZGV4T2YiLCJuYW1lcyIsInRvTGVuZ3RoIiwidG9BYnNvbHV0ZUluZGV4IiwiY3JlYXRlTWV0aG9kIiwiSVNfSU5DTFVERVMiLCIkdGhpcyIsImVsIiwiZnJvbUluZGV4IiwiaW5kZXgiLCJpbmNsdWRlcyIsInRvSW50ZWdlciIsIm1pbiIsImFyZ3VtZW50IiwiY2VpbCIsImZsb29yIiwibWF4IiwiaW50ZWdlciIsInJlcGxhY2VtZW50IiwiZmVhdHVyZSIsImRldGVjdGlvbiIsIm5vcm1hbGl6ZSIsIlBPTFlGSUxMIiwiTkFUSVZFIiwic3RyaW5nIiwicmVwbGFjZSIsInRvTG93ZXJDYXNlIiwiZW50cnlVbmJpbmQiLCJub3RBUmVnRXhwIiwiY29ycmVjdElzUmVnRXhwTG9naWMiLCJuYXRpdmVTdGFydHNXaXRoIiwic3RhcnRzV2l0aCIsIkNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDIiwiTUROX1BPTFlGSUxMX0JVRyIsInByb3RvIiwic2VhcmNoU3RyaW5nIiwidGhhdCIsInNlYXJjaCIsImlzUmVnRXhwIiwid2VsbEtub3duU3ltYm9sIiwiTUFUQ0giLCJOQVRJVkVfU1lNQk9MIiwiVVNFX1NZTUJPTF9BU19VSUQiLCJXZWxsS25vd25TeW1ib2xzU3RvcmUiLCJTeW1ib2wiLCJjcmVhdGVXZWxsS25vd25TeW1ib2wiLCJ3aXRob3V0U2V0dGVyIiwiTUVUSE9EX05BTUUiLCJyZWdleHAiLCJlIiwiYmluZCIsIkNPTlNUUlVDVE9SIiwiTUVUSE9EIiwiYXBwbHkiLCJuYXRpdmVFbmRzV2l0aCIsImVuZHNXaXRoIiwiZW5kUG9zaXRpb24iLCJsZW4iLCIkaW5jbHVkZXMiLCJhZGRUb1Vuc2NvcGFibGVzIiwiYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgiLCJVU0VTX1RPX0xFTkdUSCIsIkFDQ0VTU09SUyIsIlVOU0NPUEFCTEVTIiwiQXJyYXlQcm90b3R5cGUiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiaHRtbCIsImRvY3VtZW50Q3JlYXRlRWxlbWVudCIsIkdUIiwiTFQiLCJQUk9UT1RZUEUiLCJTQ1JJUFQiLCJJRV9QUk9UTyIsIkVtcHR5Q29uc3RydWN0b3IiLCJzY3JpcHRUYWciLCJjb250ZW50IiwiTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCIsImFjdGl2ZVhEb2N1bWVudCIsIndyaXRlIiwiY2xvc2UiLCJ0ZW1wIiwicGFyZW50V2luZG93IiwiTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lIiwiaWZyYW1lIiwiSlMiLCJpZnJhbWVEb2N1bWVudCIsInN0eWxlIiwiZGlzcGxheSIsImFwcGVuZENoaWxkIiwic3JjIiwiY29udGVudFdpbmRvdyIsIm9wZW4iLCJGIiwiTnVsbFByb3RvT2JqZWN0IiwiZG9tYWluIiwiQWN0aXZlWE9iamVjdCIsIlByb3BlcnRpZXMiLCJvYmplY3RLZXlzIiwiY2FjaGUiLCJ0aHJvd2VyIiwiYXJndW1lbnQwIiwiYXJndW1lbnQxIiwiZnJvbSIsImNoYXJBdCIsImRlZmluZUl0ZXJhdG9yIiwiU1RSSU5HX0lURVJBVE9SIiwic2V0SW50ZXJuYWxTdGF0ZSIsIml0ZXJhdGVkIiwicG9pbnQiLCJDT05WRVJUX1RPX1NUUklORyIsIlMiLCJwb3NpdGlvbiIsInNpemUiLCJjaGFyQ29kZUF0IiwiY29kZUF0IiwiY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJzZXRUb1N0cmluZ1RhZyIsIkl0ZXJhdG9ycyIsIkl0ZXJhdG9yc0NvcmUiLCJCVUdHWV9TQUZBUklfSVRFUkFUT1JTIiwiSVRFUkFUT1IiLCJLRVlTIiwiVkFMVUVTIiwiRU5UUklFUyIsInJldHVyblRoaXMiLCJJdGVyYWJsZSIsIk5BTUUiLCJJdGVyYXRvckNvbnN0cnVjdG9yIiwiREVGQVVMVCIsIklTX1NFVCIsImdldEl0ZXJhdGlvbk1ldGhvZCIsIktJTkQiLCJkZWZhdWx0SXRlcmF0b3IiLCJJdGVyYWJsZVByb3RvdHlwZSIsImVudHJpZXMiLCJUT19TVFJJTkdfVEFHIiwiSU5DT1JSRUNUX1ZBTFVFU19OQU1FIiwibmF0aXZlSXRlcmF0b3IiLCJhbnlOYXRpdmVJdGVyYXRvciIsIkN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSIsIm1ldGhvZHMiLCJLRVkiLCJQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUiLCJhcnJheUl0ZXJhdG9yIiwidG9PYmplY3QiLCJDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIiLCJPYmplY3RQcm90b3R5cGUiLCJUQUciLCJhUG9zc2libGVQcm90b3R5cGUiLCJDT1JSRUNUX1NFVFRFUiIsInNldHRlciIsIl9fcHJvdG9fXyIsImNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiIsIklOQ09SUkVDVF9JVEVSQVRJT04iLCJjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nIiwiaXNBcnJheUl0ZXJhdG9yTWV0aG9kIiwiY3JlYXRlUHJvcGVydHkiLCJnZXRJdGVyYXRvck1ldGhvZCIsImFycmF5TGlrZSIsIkMiLCJhcmd1bWVudHNMZW5ndGgiLCJtYXBmbiIsIm1hcHBpbmciLCJzdGVwIiwicmV0dXJuTWV0aG9kIiwicHJvcGVydHlLZXkiLCJUT19TVFJJTkdfVEFHX1NVUFBPUlQiLCJjbGFzc29mUmF3IiwiQ09SUkVDVF9BUkdVTUVOVFMiLCJ0cnlHZXQiLCJ0YWciLCJjYWxsZWUiLCJTQUZFX0NMT1NJTkciLCJjYWxsZWQiLCJpdGVyYXRvcldpdGhSZXR1cm4iLCJTS0lQX0NMT1NJTkciLCJJVEVSQVRJT05fU1VQUE9SVCIsImFzc2lnbiIsIm5hdGl2ZUFzc2lnbiIsIkEiLCJCIiwic3ltYm9sIiwiYWxwaGFiZXQiLCJmb3JFYWNoIiwiY2hyIiwiVCIsImoiLCJmcm9tRW50cmllcyIsIkFSUkFZX0lURVJBVE9SIiwia2luZCIsIkFyZ3VtZW50cyIsIml0ZXJhdGUiLCJrIiwiUmVzdWx0Iiwic3RvcHBlZCIsIkFTX0VOVFJJRVMiLCJJU19JVEVSQVRPUiIsImJvdW5kRnVuY3Rpb24iLCJpdGVyRm4iLCJsb2cyIiwibG9nIiwiTE4yIiwieCIsIm51bWJlciIsImlzSW50ZWdlciIsImlzRmluaXRlIiwiQXJyYXlCdWZmZXJWaWV3Q29yZSIsInNwZWNpZXNDb25zdHJ1Y3RvciIsImFUeXBlZEFycmF5IiwiYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciIsImV4cG9ydFR5cGVkQXJyYXlNZXRob2QiLCIkc2xpY2UiLCJJbnQ4QXJyYXkiLCJsaXN0IiwiTkFUSVZFX0FSUkFZX0JVRkZFUiIsIkludDhBcnJheVByb3RvdHlwZSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUiLCJUeXBlZEFycmF5IiwiVHlwZWRBcnJheVByb3RvdHlwZSIsImlzUHJvdG90eXBlT2YiLCJUWVBFRF9BUlJBWV9UQUciLCJOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIiwib3BlcmEiLCJUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCIsIlR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0IiwiSW50MTZBcnJheSIsIlVpbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIlVpbnQzMkFycmF5IiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiaXNWaWV3Iiwia2xhc3MiLCJpc1R5cGVkQXJyYXkiLCJBUlJBWSIsIlR5cGVkQXJyYXlDb25zdHJ1Y3RvciIsInByb3BlcnR5IiwiZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCIsIkFycmF5QnVmZmVyIiwiRGF0YVZpZXciLCJTUEVDSUVTIiwiZGVmYXVsdENvbnN0cnVjdG9yIiwiUHJvbWlzZSIsIkRPTUl0ZXJhYmxlcyIsIkFycmF5SXRlcmF0b3JNZXRob2RzIiwiQXJyYXlWYWx1ZXMiLCJDT0xMRUNUSU9OX05BTUUiLCJDb2xsZWN0aW9uIiwiQ29sbGVjdGlvblByb3RvdHlwZSIsIkNTU1J1bGVMaXN0IiwiQ1NTU3R5bGVEZWNsYXJhdGlvbiIsIkNTU1ZhbHVlTGlzdCIsIkNsaWVudFJlY3RMaXN0IiwiRE9NUmVjdExpc3QiLCJET01TdHJpbmdMaXN0IiwiRGF0YVRyYW5zZmVySXRlbUxpc3QiLCJGaWxlTGlzdCIsIkhUTUxBbGxDb2xsZWN0aW9uIiwiSFRNTENvbGxlY3Rpb24iLCJIVE1MRm9ybUVsZW1lbnQiLCJIVE1MU2VsZWN0RWxlbWVudCIsIk1lZGlhTGlzdCIsIk1pbWVUeXBlQXJyYXkiLCJOYW1lZE5vZGVNYXAiLCJOb2RlTGlzdCIsIlBhaW50UmVxdWVzdExpc3QiLCJQbHVnaW4iLCJQbHVnaW5BcnJheSIsIlNWR0xlbmd0aExpc3QiLCJTVkdOdW1iZXJMaXN0IiwiU1ZHUGF0aFNlZ0xpc3QiLCJTVkdQb2ludExpc3QiLCJTVkdTdHJpbmdMaXN0IiwiU1ZHVHJhbnNmb3JtTGlzdCIsIlNvdXJjZUJ1ZmZlckxpc3QiLCJTdHlsZVNoZWV0TGlzdCIsIlRleHRUcmFja0N1ZUxpc3QiLCJUZXh0VHJhY2tMaXN0IiwiVG91Y2hMaXN0IiwiTmF0aXZlUHJvbWlzZSIsInJlZGVmaW5lQWxsIiwic2V0U3BlY2llcyIsImFuSW5zdGFuY2UiLCJ0YXNrIiwibWljcm90YXNrIiwicHJvbWlzZVJlc29sdmUiLCJob3N0UmVwb3J0RXJyb3JzIiwibmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUiLCJwZXJmb3JtIiwiVjhfVkVSU0lPTiIsIlBST01JU0UiLCJnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSIsIlByb21pc2VDb25zdHJ1Y3RvciIsIiRmZXRjaCIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwibmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5IiwiSVNfTk9ERSIsIkRJU1BBVENIX0VWRU5UIiwiY3JlYXRlRXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiVU5IQU5ETEVEX1JFSkVDVElPTiIsIlJFSkVDVElPTl9IQU5ETEVEIiwiUEVORElORyIsIkZVTEZJTExFRCIsIkhBTkRMRUQiLCJVTkhBTkRMRUQiLCJJbnRlcm5hbCIsIk93blByb21pc2VDYXBhYmlsaXR5IiwiUHJvbWlzZVdyYXBwZXIiLCJuYXRpdmVUaGVuIiwiR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSIsIlByb21pc2VSZWplY3Rpb25FdmVudCIsInByb21pc2UiLCJGYWtlUHJvbWlzZSIsInRoZW4iLCJhbGwiLCJpc1RoZW5hYmxlIiwibm90aWZ5IiwiaXNSZWplY3QiLCJub3RpZmllZCIsImNoYWluIiwicmVhY3Rpb25zIiwib2siLCJyZWFjdGlvbiIsImhhbmRsZXIiLCJmYWlsIiwiZXhpdGVkIiwicmVqZWN0aW9uIiwib25IYW5kbGVVbmhhbmRsZWQiLCJlbnRlciIsImV4aXQiLCJvblVuaGFuZGxlZCIsImV2ZW50IiwiaW5pdEV2ZW50IiwiSVNfVU5IQU5ETEVEIiwiaXNVbmhhbmRsZWQiLCJlbWl0IiwicGFyZW50IiwidW53cmFwIiwiaW50ZXJuYWxSZWplY3QiLCJpbnRlcm5hbFJlc29sdmUiLCJ3cmFwcGVyIiwiZXhlY3V0b3IiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJmZXRjaCIsIiRwcm9taXNlUmVzb2x2ZSIsImNvdW50ZXIiLCJyZW1haW5pbmciLCJhbHJlYWR5Q2FsbGVkIiwicmFjZSIsIkNPTlNUUlVDVE9SX05BTUUiLCJDb25zdHJ1Y3RvciIsIklTX0lPUyIsImxvY2F0aW9uIiwic2V0SW1tZWRpYXRlIiwiY2xlYXIiLCJjbGVhckltbWVkaWF0ZSIsIk1lc3NhZ2VDaGFubmVsIiwiRGlzcGF0Y2giLCJxdWV1ZSIsIk9OUkVBRFlTVEFURUNIQU5HRSIsImRlZmVyIiwiY2hhbm5lbCIsInBvcnQiLCJydW4iLCJydW5uZXIiLCJsaXN0ZW5lciIsInBvc3QiLCJwb3N0TWVzc2FnZSIsImhvc3QiLCJuZXh0VGljayIsIm5vdyIsInBvcnQyIiwicG9ydDEiLCJvbm1lc3NhZ2UiLCJhZGRFdmVudExpc3RlbmVyIiwiaW1wb3J0U2NyaXB0cyIsInJlbW92ZUNoaWxkIiwic2V0VGltZW91dCIsIm1hY3JvdGFzayIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiwicXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yIiwicXVldWVNaWNyb3Rhc2siLCJmbHVzaCIsImhlYWQiLCJsYXN0IiwidG9nZ2xlIiwibm9kZSIsImNyZWF0ZVRleHROb2RlIiwib2JzZXJ2ZSIsImNoYXJhY3RlckRhdGEiLCJwcm9taXNlQ2FwYWJpbGl0eSIsIlByb21pc2VDYXBhYmlsaXR5IiwiJCRyZXNvbHZlIiwiJCRyZWplY3QiLCJ2ZXJzaW9ucyIsInY4IiwibWF0Y2giLCJhbGxTZXR0bGVkIiwic3RhdHVzIiwiTk9OX0dFTkVSSUMiLCJyZWFsIiwib25GaW5hbGx5IiwiaXNGdW5jdGlvbiIsIlVTRV9OQVRJVkVfVVJMIiwiYXJyYXlGcm9tIiwidG9BU0NJSSIsIlVSTFNlYXJjaFBhcmFtc01vZHVsZSIsIk5hdGl2ZVVSTCIsIlVSTFNlYXJjaFBhcmFtcyIsImdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUiLCJnZXRTdGF0ZSIsImdldEludGVybmFsVVJMU3RhdGUiLCJwb3ciLCJJTlZBTElEX0FVVEhPUklUWSIsIklOVkFMSURfU0NIRU1FIiwiSU5WQUxJRF9IT1NUIiwiSU5WQUxJRF9QT1JUIiwiQUxQSEEiLCJBTFBIQU5VTUVSSUMiLCJESUdJVCIsIkhFWF9TVEFSVCIsIk9DVCIsIkRFQyIsIkhFWCIsIkZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQiLCJGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5UIiwiTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSIsIlRBQl9BTkRfTkVXX0xJTkUiLCJFT0YiLCJwYXJzZUhvc3QiLCJjb2RlUG9pbnRzIiwicGFyc2VJUHY2IiwiaXNTcGVjaWFsIiwicGVyY2VudEVuY29kZSIsIkMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQiLCJwYXJzZUlQdjQiLCJwYXJ0cyIsInBhcnRzTGVuZ3RoIiwibnVtYmVycyIsInBhcnQiLCJyYWRpeCIsImlwdjQiLCJwb3AiLCJhZGRyZXNzIiwicGllY2VJbmRleCIsImNvbXByZXNzIiwicG9pbnRlciIsIm51bWJlcnNTZWVuIiwiaXB2NFBpZWNlIiwic3dhcHMiLCJzd2FwIiwiY2hhciIsImZpbmRMb25nZXN0WmVyb1NlcXVlbmNlIiwiaXB2NiIsIm1heEluZGV4IiwibWF4TGVuZ3RoIiwiY3VyclN0YXJ0IiwiY3Vyckxlbmd0aCIsInNlcmlhbGl6ZUhvc3QiLCJpZ25vcmUwIiwidW5zaGlmdCIsImZyYWdtZW50UGVyY2VudEVuY29kZVNldCIsInBhdGhQZXJjZW50RW5jb2RlU2V0IiwidXNlcmluZm9QZXJjZW50RW5jb2RlU2V0Iiwic3BlY2lhbFNjaGVtZXMiLCJmdHAiLCJmaWxlIiwiaHR0cCIsImh0dHBzIiwid3MiLCJ3c3MiLCJzY2hlbWUiLCJpbmNsdWRlc0NyZWRlbnRpYWxzIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCIsImNhbm5vdEJlQUJhc2VVUkwiLCJpc1dpbmRvd3NEcml2ZUxldHRlciIsIm5vcm1hbGl6ZWQiLCJzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyIiwidGhpcmQiLCJzaG9ydGVuVVJMc1BhdGgiLCJwYXRoU2l6ZSIsImlzU2luZ2xlRG90Iiwic2VnbWVudCIsImlzRG91YmxlRG90IiwiU0NIRU1FX1NUQVJUIiwiU0NIRU1FIiwiTk9fU0NIRU1FIiwiU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkiLCJQQVRIX09SX0FVVEhPUklUWSIsIlJFTEFUSVZFIiwiUkVMQVRJVkVfU0xBU0giLCJTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTIiwiU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMiLCJBVVRIT1JJVFkiLCJIT1NUIiwiSE9TVE5BTUUiLCJQT1JUIiwiRklMRSIsIkZJTEVfU0xBU0giLCJGSUxFX0hPU1QiLCJQQVRIX1NUQVJUIiwiUEFUSCIsIkNBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEgiLCJRVUVSWSIsIkZSQUdNRU5UIiwicGFyc2VVUkwiLCJzdGF0ZU92ZXJyaWRlIiwic2VlbkF0Iiwic2VlbkJyYWNrZXQiLCJzZWVuUGFzc3dvcmRUb2tlbiIsImJ1ZmZlckNvZGVQb2ludHMiLCJmYWlsdXJlIiwiZnJhZ21lbnQiLCJjb2RlUG9pbnQiLCJlbmNvZGVkQ29kZVBvaW50cyIsInNoaWZ0IiwiVVJMQ29uc3RydWN0b3IiLCJ1cmxTdHJpbmciLCJiYXNlU3RhdGUiLCJzZWFyY2hQYXJhbXMiLCJzZWFyY2hQYXJhbXNTdGF0ZSIsInVwZGF0ZVNlYXJjaFBhcmFtcyIsInVwZGF0ZVVSTCIsImhyZWYiLCJzZXJpYWxpemVVUkwiLCJvcmlnaW4iLCJnZXRPcmlnaW4iLCJnZXRQcm90b2NvbCIsImdldFVzZXJuYW1lIiwiZ2V0UGFzc3dvcmQiLCJnZXRIb3N0IiwiaG9zdG5hbWUiLCJnZXRIb3N0bmFtZSIsImdldFBvcnQiLCJwYXRobmFtZSIsImdldFBhdGhuYW1lIiwiZ2V0U2VhcmNoIiwiZ2V0U2VhcmNoUGFyYW1zIiwiaGFzaCIsImdldEhhc2giLCJVUkxQcm90b3R5cGUiLCJvdXRwdXQiLCJhY2Nlc3NvckRlc2NyaXB0b3IiLCJnZXR0ZXIiLCJ0b0pTT04iLCJuYXRpdmVDcmVhdGVPYmplY3RVUkwiLCJuYXRpdmVSZXZva2VPYmplY3RVUkwiLCJyZXZva2VPYmplY3RVUkwiLCJzb3J0IiwibWF4SW50IiwidE1pbiIsInRNYXgiLCJza2V3IiwiZGFtcCIsImluaXRpYWxCaWFzIiwiaW5pdGlhbE4iLCJkZWxpbWl0ZXIiLCJyZWdleE5vbkFTQ0lJIiwicmVnZXhTZXBhcmF0b3JzIiwiT1ZFUkZMT1dfRVJST1IiLCJiYXNlTWludXNUTWluIiwic3RyaW5nRnJvbUNoYXJDb2RlIiwiZnJvbUNoYXJDb2RlIiwidWNzMmRlY29kZSIsImV4dHJhIiwiZGlnaXRUb0Jhc2ljIiwiZGlnaXQiLCJhZGFwdCIsImRlbHRhIiwibnVtUG9pbnRzIiwiZmlyc3RUaW1lIiwiZW5jb2RlIiwiaW5wdXRMZW5ndGgiLCJuIiwiYmlhcyIsImN1cnJlbnRWYWx1ZSIsImJhc2ljTGVuZ3RoIiwiaGFuZGxlZENQQ291bnQiLCJoYW5kbGVkQ1BDb3VudFBsdXNPbmUiLCJSYW5nZUVycm9yIiwicSIsInQiLCJxTWludXNUIiwiYmFzZU1pbnVzVCIsImVuY29kZWQiLCJsYWJlbHMiLCJsYWJlbCIsImdldEl0ZXJhdG9yIiwiSGVhZGVycyIsIlVSTF9TRUFSQ0hfUEFSQU1TIiwiVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IiLCJnZXRJbnRlcm5hbFBhcmFtc1N0YXRlIiwiZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlIiwicGx1cyIsInNlcXVlbmNlcyIsInBlcmNlbnRTZXF1ZW5jZSIsIlJlZ0V4cCIsInBlcmNlbnREZWNvZGUiLCJzZXF1ZW5jZSIsImRlc2VyaWFsaXplIiwiZmluZCIsInJlcGxhY2VyIiwic2VyaWFsaXplIiwicGFyc2VTZWFyY2hQYXJhbXMiLCJhdHRyaWJ1dGVzIiwiYXR0cmlidXRlIiwidmFsaWRhdGVBcmd1bWVudHNMZW5ndGgiLCJwYXNzZWQiLCJyZXF1aXJlZCIsIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiwiSXRlcmF0b3IiLCJVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciIsImluaXQiLCJlbnRyeUl0ZXJhdG9yIiwiZW50cnlOZXh0IiwiVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlIiwiYXBwZW5kIiwic3BsaWNlIiwiZ2V0QWxsIiwiZm91bmQiLCJlbnRyaWVzSW5kZXgiLCJzbGljZUluZGV4IiwiY2FsbGJhY2siLCJib2R5IiwiaGVhZGVycyIsImZhY3RvcnkiLCJTeW1ib2xQb2x5ZmlsbCIsImRlc2NyaXB0aW9uIiwibm9vcCIsIk51bWJlcklzTmFOIiwicmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uIiwidHlwZUlzT2JqZWN0IiwiY3JlYXRlQXJyYXlGcm9tTGlzdCIsImVsZW1lbnRzIiwiQXJyYXlCdWZmZXJDb3B5IiwiZGVzdCIsImRlc3RPZmZzZXQiLCJzcmNPZmZzZXQiLCJJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyIiwiSXNOb25OZWdhdGl2ZU51bWJlciIsIkluZmluaXR5IiwiQ2FsbCIsIkNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kIiwidW5kZXJseWluZ09iamVjdCIsIm1ldGhvZE5hbWUiLCJhbGdvQXJnQ291bnQiLCJleHRyYUFyZ3MiLCJQcm9taXNlQ2FsbCIsImZ1bGxBcmdzIiwicHJvbWlzZVJlc29sdmVkV2l0aCIsIkludm9rZU9yTm9vcCIsInByb21pc2VSZWplY3RlZFdpdGgiLCJUcmFuc2ZlckFycmF5QnVmZmVyIiwiSXNEZXRhY2hlZEJ1ZmZlciIsIlZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayIsImhpZ2hXYXRlck1hcmsiLCJNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24iLCJvcmlnaW5hbFByb21pc2UiLCJvcmlnaW5hbFByb21pc2VUaGVuIiwib3JpZ2luYWxQcm9taXNlUmVzb2x2ZSIsIm9yaWdpbmFsUHJvbWlzZVJlamVjdCIsIm5ld1Byb21pc2UiLCJQZXJmb3JtUHJvbWlzZVRoZW4iLCJ1cG9uUHJvbWlzZSIsInVwb25GdWxmaWxsbWVudCIsInVwb25SZWplY3Rpb24iLCJ0cmFuc2Zvcm1Qcm9taXNlV2l0aCIsImZ1bGZpbGxtZW50SGFuZGxlciIsInJlamVjdGlvbkhhbmRsZXIiLCJzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlIiwiUVVFVUVfTUFYX0FSUkFZX1NJWkUiLCJTaW1wbGVRdWV1ZSIsIl9jdXJzb3IiLCJfc2l6ZSIsIl9mcm9udCIsIl9lbGVtZW50cyIsIl9uZXh0IiwiX2JhY2siLCJvbGRCYWNrIiwibmV3QmFjayIsIm9sZEZyb250IiwibmV3RnJvbnQiLCJvbGRDdXJzb3IiLCJuZXdDdXJzb3IiLCJwZWVrIiwiZnJvbnQiLCJjdXJzb3IiLCJSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQiLCJmb3JBdXRob3JDb2RlIiwiUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZSIsInJlYWRlciIsInN0cmVhbSIsIl9mb3JBdXRob3JDb2RlIiwiX293bmVyUmVhZGFibGVTdHJlYW0iLCJfcmVhZGVyIiwiX3N0YXRlIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQiLCJfc3RvcmVkRXJyb3IiLCJSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwiLCJSZWFkYWJsZVN0cmVhbUNhbmNlbCIsIlJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkIiwicmVhZGVyTG9ja0V4Y2VwdGlvbiIsIl9jbG9zZWRQcm9taXNlIiwiX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSIsIl9jbG9zZWRQcm9taXNlX3JlamVjdCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSIsIkNhbmNlbFN0ZXBzIiwiUHVsbFN0ZXBzIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciIsIlJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3QiLCJyZWFkUmVxdWVzdCIsIl9yZXNvbHZlIiwiX3JlamVjdCIsIl9yZWFkUmVxdWVzdHMiLCJSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdCIsIlJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzIiwiUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyIiwiSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIiLCJJc1JlYWRhYmxlU3RyZWFtIiwiSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCIsImRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiY2FuY2VsIiwicmVhZCIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQiLCJyZWxlYXNlTG9jayIsIl9kaXN0dXJiZWQiLCJfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyIiwiX2EiLCJBc3luY0l0ZXJhdG9yUHJvdG90eXBlIiwiYXN5bmNJdGVyYXRvciIsIlJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSIsIklzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yIiwic3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJfYXN5bmNJdGVyYXRvclJlYWRlciIsInJldHVybiIsIl9wcmV2ZW50Q2FuY2VsIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciIsInByZXZlbnRDYW5jZWwiLCJCb29sZWFuIiwiRGVxdWV1ZVZhbHVlIiwiY29udGFpbmVyIiwicGFpciIsIl9xdWV1ZSIsIl9xdWV1ZVRvdGFsU2l6ZSIsIkVucXVldWVWYWx1ZVdpdGhTaXplIiwiUGVla1F1ZXVlVmFsdWUiLCJSZXNldFF1ZXVlIiwiQWJvcnRTdGVwcyIsIkVycm9yU3RlcHMiLCJXcml0YWJsZVN0cmVhbSIsInVuZGVybHlpbmdTaW5rIiwic3RyYXRlZ3kiLCJJbml0aWFsaXplV3JpdGFibGVTdHJlYW0iLCJzaXplQWxnb3JpdGhtIiwiU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rIiwiSXNXcml0YWJsZVN0cmVhbSIsInN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24iLCJJc1dyaXRhYmxlU3RyZWFtTG9ja2VkIiwiYWJvcnQiLCJXcml0YWJsZVN0cmVhbUFib3J0IiwiV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQiLCJXcml0YWJsZVN0cmVhbUNsb3NlIiwiZ2V0V3JpdGVyIiwiQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIsIkNyZWF0ZVdyaXRhYmxlU3RyZWFtIiwic3RhcnRBbGdvcml0aG0iLCJ3cml0ZUFsZ29yaXRobSIsImNsb3NlQWxnb3JpdGhtIiwiYWJvcnRBbGdvcml0aG0iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiX3dyaXRlciIsIl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIiLCJfd3JpdGVSZXF1ZXN0cyIsIl9pbkZsaWdodFdyaXRlUmVxdWVzdCIsIl9jbG9zZVJlcXVlc3QiLCJfaW5GbGlnaHRDbG9zZVJlcXVlc3QiLCJfcGVuZGluZ0Fib3J0UmVxdWVzdCIsIl9iYWNrcHJlc3N1cmUiLCJfcHJvbWlzZSIsIndhc0FscmVhZHlFcnJvcmluZyIsIl9yZWFzb24iLCJfd2FzQWxyZWFkeUVycm9yaW5nIiwiV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nIiwiY2xvc2VSZXF1ZXN0Iiwid3JpdGVyIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UiLCJXcml0YWJsZVN0cmVhbUFkZFdyaXRlUmVxdWVzdCIsIndyaXRlUmVxdWVzdCIsIldyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24iLCJXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQiLCJXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0IiwiX3N0YXJ0ZWQiLCJzdG9yZWRFcnJvciIsIldyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQiLCJhYm9ydFJlcXVlc3QiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGVXaXRoRXJyb3IiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2UiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3IiLCJXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodCIsIldyaXRhYmxlU3RyZWFtTWFya0ZpcnN0V3JpdGVSZXF1ZXN0SW5GbGlnaHQiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCIsIldyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlIiwiYmFja3ByZXNzdXJlIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0IiwiX293bmVyV3JpdGFibGVTdHJlYW0iLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkIiwiSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIiLCJkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsImRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUiLCJfcmVhZHlQcm9taXNlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQWJvcnQiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2UiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVDbG9zZWRQcm9taXNlUmVqZWN0ZWQiLCJfY2xvc2VkUHJvbWlzZVN0YXRlIiwiZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQiLCJfcmVhZHlQcm9taXNlU3RhdGUiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVqZWN0IiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0VG9SZWplY3RlZCIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSIsInJlbGVhc2VkRXJyb3IiLCJjaHVua1NpemUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0Q2h1bmtTaXplIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlIiwiSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvciIsIl9hYm9ydEFsZ29yaXRobSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMiLCJfc3RyYXRlZ3lTaXplQWxnb3JpdGhtIiwiX3N0cmF0ZWd5SFdNIiwiX3dyaXRlQWxnb3JpdGhtIiwiX2Nsb3NlQWxnb3JpdGhtIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZSIsInN0YXJ0UmVzdWx0Iiwic3RhcnRQcm9taXNlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkIiwiY2h1bmtTaXplRSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkIiwid3JpdGVSZWNvcmQiLCJlbnF1ZXVlRSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc1dyaXRlIiwic2lua0Nsb3NlUHJvbWlzZSIsInNpbmtXcml0ZVByb21pc2UiLCJkZXNpcmVkU2l6ZSIsIl9yZWFkeVByb21pc2VfcmVzb2x2ZSIsIl9yZWFkeVByb21pc2VfcmVqZWN0IiwiaXNBYm9ydFNpZ25hbCIsImFib3J0ZWQiLCJOYXRpdmVET01FeGNlcHRpb24iLCJET01FeGNlcHRpb24iLCJpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yIiwiY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwiLCJtZXNzYWdlIiwiRXJyb3IiLCJjYXB0dXJlU3RhY2tUcmFjZSIsIkRPTUV4Y2VwdGlvbiQxIiwiUmVhZGFibGVTdHJlYW1QaXBlVG8iLCJwcmV2ZW50Q2xvc2UiLCJwcmV2ZW50QWJvcnQiLCJzaWduYWwiLCJzaHV0dGluZ0Rvd24iLCJjdXJyZW50V3JpdGUiLCJhY3Rpb25zIiwic2h1dGRvd25XaXRoQWN0aW9uIiwibWFwIiwiYWN0aW9uIiwicGlwZUxvb3AiLCJyZXNvbHZlTG9vcCIsInJlamVjdExvb3AiLCJwaXBlU3RlcCIsImlzT3JCZWNvbWVzRXJyb3JlZCIsInNodXRkb3duIiwiaXNPckJlY29tZXNDbG9zZWQiLCJkZXN0Q2xvc2VkXzEiLCJ3YWl0Rm9yV3JpdGVzVG9GaW5pc2giLCJvbGRDdXJyZW50V3JpdGUiLCJvcmlnaW5hbElzRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwiZG9UaGVSZXN0IiwiZmluYWxpemUiLCJuZXdFcnJvciIsImlzRXJyb3IiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsIklzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsImRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSIsImVucXVldWUiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvciIsIl9jYW5jZWxBbGdvcml0aG0iLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbSIsIl9jbG9zZVJlcXVlc3RlZCIsIlJlYWRhYmxlU3RyZWFtQ2xvc2UiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCIsInBlbmRpbmdQcm9taXNlIiwic2hvdWxkUHVsbCIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCIsIl9wdWxsaW5nIiwiX3B1bGxBZ2FpbiIsInB1bGxQcm9taXNlIiwiX3B1bGxBbGdvcml0aG0iLCJSZWFkYWJsZVN0cmVhbUVycm9yIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZSIsIlNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsInB1bGxBbGdvcml0aG0iLCJjYW5jZWxBbGdvcml0aG0iLCJTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSIsInVuZGVybHlpbmdTb3VyY2UiLCJSZWFkYWJsZVN0cmVhbVRlZSIsImNsb25lRm9yQnJhbmNoMiIsInJlYWRpbmciLCJjYW5jZWxlZDEiLCJjYW5jZWxlZDIiLCJyZWFzb24xIiwicmVhc29uMiIsImJyYW5jaDEiLCJicmFuY2gyIiwicmVzb2x2ZUNhbmNlbFByb21pc2UiLCJjYW5jZWxQcm9taXNlIiwicmVhZFByb21pc2UiLCJ2YWx1ZTEiLCJ2YWx1ZTIiLCJjYW5jZWwxQWxnb3JpdGhtIiwiY29tcG9zaXRlUmVhc29uIiwiY2FuY2VsUmVzdWx0IiwiY2FuY2VsMkFsZ29yaXRobSIsIkNyZWF0ZVJlYWRhYmxlU3RyZWFtIiwiTnVtYmVySXNJbnRlZ2VyIiwiUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCIsIklzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCIsImJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbiIsIl92aWV3IiwicmVzcG9uZCIsImJ5dGVzV3JpdHRlbiIsIl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kIiwicmVzcG9uZFdpdGhOZXdWaWV3IiwidmlldyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXciLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiX2J5b2JSZXF1ZXN0IiwiX3BlbmRpbmdQdWxsSW50b3MiLCJmaXJzdERlc2NyaXB0b3IiLCJieXRlT2Zmc2V0IiwiYnl0ZXNGaWxsZWQiLCJieXRlTGVuZ3RoIiwiYnlvYlJlcXVlc3QiLCJTZXRVcFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUiLCJfY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluIiwidmlld0UiLCJhdXRvQWxsb2NhdGVDaHVua1NpemUiLCJfYXV0b0FsbG9jYXRlQ2h1bmtTaXplIiwiYnVmZmVyRSIsInB1bGxJbnRvRGVzY3JpcHRvciIsImVsZW1lbnRTaXplIiwicmVhZGVyVHlwZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yIiwiZmlsbGVkVmlldyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yIiwiUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSIsImN1cnJlbnRBbGlnbmVkQnl0ZXMiLCJtYXhCeXRlc1RvQ29weSIsIm1heEJ5dGVzRmlsbGVkIiwibWF4QWxpZ25lZEJ5dGVzIiwidG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyIsInJlYWR5IiwiaGVhZE9mUXVldWUiLCJieXRlc1RvQ29weSIsImRlc3RTdGFydCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvciIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8iLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHVsbEludG8iLCJCWVRFU19QRVJfRUxFTUVOVCIsIlJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0IiwiZW1wdHlWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlIiwiUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyIiwiUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUiLCJyZW1haW5kZXJTaXplIiwicmVtYWluZGVyIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbCIsImZpcnN0UGVuZGluZ1B1bGxJbnRvIiwidHJhbnNmZXJyZWRCdWZmZXIiLCJ0cmFuc2ZlcnJlZFZpZXciLCJTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiLCJTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSIsInVuZGVybHlpbmdCeXRlU291cmNlIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciIsIlJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciIsInJlYWRJbnRvUmVxdWVzdCIsIl9yZWFkSW50b1JlcXVlc3RzIiwiSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIiLCJieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsIlJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQiLCJSZWFkYWJsZVN0cmVhbSIsIkluaXRpYWxpemVSZWFkYWJsZVN0cmVhbSIsInR5cGVTdHJpbmciLCJzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEiLCJnZXRSZWFkZXIiLCJwaXBlVGhyb3VnaCIsIl9iIiwicmVhZGFibGUiLCJfYyIsInBpcGVUbyIsInRlZSIsImJyYW5jaGVzIiwic291cmNlQ2FuY2VsUHJvbWlzZSIsIkJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kiLCJDb3VudFF1ZXVpbmdTdHJhdGVneSIsIlRyYW5zZm9ybVN0cmVhbSIsInRyYW5zZm9ybWVyIiwid3JpdGFibGVTdHJhdGVneSIsInJlYWRhYmxlU3RyYXRlZ3kiLCJ3cml0YWJsZVNpemVGdW5jdGlvbiIsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsInJlYWRhYmxlU2l6ZUZ1bmN0aW9uIiwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIiwid3JpdGFibGVUeXBlIiwid3JpdGFibGVTaXplQWxnb3JpdGhtIiwicmVhZGFibGVUeXBlIiwicmVhZGFibGVTaXplQWxnb3JpdGhtIiwic3RhcnRQcm9taXNlX3Jlc29sdmUiLCJJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtIiwiU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21UcmFuc2Zvcm1lciIsIl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyIiwiSXNUcmFuc2Zvcm1TdHJlYW0iLCJzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIiLCJfcmVhZGFibGUiLCJfd3JpdGFibGUiLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua1dyaXRlQWxnb3JpdGhtIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQ2xvc2VBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUiLCJfYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSIsIl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUiLCJUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUiLCJUcmFuc2Zvcm1TdHJlYW1FcnJvciIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEiLCJyZWFkYWJsZUNvbnRyb2xsZXIiLCJfY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IiLCJ0ZXJtaW5hdGUiLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclRlcm1pbmF0ZSIsIlNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJ0cmFuc2Zvcm1BbGdvcml0aG0iLCJmbHVzaEFsZ29yaXRobSIsIl90cmFuc2Zvcm1BbGdvcml0aG0iLCJfZmx1c2hBbGdvcml0aG0iLCJ0cmFuc2Zvcm1SZXN1bHRFIiwidHJhbnNmb3JtTWV0aG9kIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtIiwidHJhbnNmb3JtUHJvbWlzZSIsImJhY2twcmVzc3VyZUNoYW5nZVByb21pc2UiLCJmbHVzaFByb21pc2UiLCJNYXAiLCJjb2xsZWN0aW9uIiwiY29sbGVjdGlvblN0cm9uZyIsIkludGVybmFsTWV0YWRhdGFNb2R1bGUiLCJpbmhlcml0SWZSZXF1aXJlZCIsImNvbW1vbiIsIklTX01BUCIsIklTX1dFQUsiLCJBRERFUiIsIk5hdGl2ZUNvbnN0cnVjdG9yIiwiTmF0aXZlUHJvdG90eXBlIiwiZXhwb3J0ZWQiLCJmaXhNZXRob2QiLCJuYXRpdmVNZXRob2QiLCJhZGQiLCJnZXRDb25zdHJ1Y3RvciIsImluc3RhbmNlIiwiSEFTTlRfQ0hBSU5JTkciLCJUSFJPV1NfT05fUFJJTUlUSVZFUyIsIkFDQ0VQVF9JVEVSQUJMRVMiLCJCVUdHWV9aRVJPIiwiJGluc3RhbmNlIiwiZHVtbXkiLCJzZXRTdHJvbmciLCJGUkVFWklORyIsIk1FVEFEQVRBIiwiaXNFeHRlbnNpYmxlIiwic2V0TWV0YWRhdGEiLCJvYmplY3RJRCIsIndlYWtEYXRhIiwiZmFzdEtleSIsImdldFdlYWtEYXRhIiwib25GcmVlemUiLCJtZXRhIiwicHJldmVudEV4dGVuc2lvbnMiLCJXcmFwcGVyIiwiTmV3VGFyZ2V0IiwiTmV3VGFyZ2V0UHJvdG90eXBlIiwiaW50ZXJuYWxTdGF0ZUdldHRlckZvciIsImdldEVudHJ5IiwicHJldmlvdXMiLCJyZW1vdmVkIiwicHJldiIsImNhbGxiYWNrZm4iLCJJVEVSQVRPUl9OQU1FIiwiZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUiLCJTZXQiLCJjb2xsZWN0aW9uV2VhayIsImVuZm9yY2VJdGVybmFsU3RhdGUiLCJJU19JRTExIiwiSW50ZXJuYWxXZWFrTWFwIiwiJFdlYWtNYXAiLCJXZWFrTWFwUHJvdG90eXBlIiwibmF0aXZlRGVsZXRlIiwibmF0aXZlSGFzIiwibmF0aXZlR2V0IiwibmF0aXZlU2V0IiwiZnJvemVuIiwiQXJyYXlJdGVyYXRpb25Nb2R1bGUiLCIkaGFzIiwiZmluZEluZGV4IiwidW5jYXVnaHRGcm96ZW5TdG9yZSIsIlVuY2F1Z2h0RnJvemVuU3RvcmUiLCJmaW5kVW5jYXVnaHRGcm96ZW4iLCJhcnJheVNwZWNpZXNDcmVhdGUiLCJJU19GSUxURVIiLCJJU19TT01FIiwiSVNfRVZFUlkiLCJJU19GSU5EX0lOREVYIiwiTk9fSE9MRVMiLCJzcGVjaWZpY0NyZWF0ZSIsImZpbHRlciIsInNvbWUiLCJldmVyeSIsImlzQXJyYXkiLCJvcmlnaW5hbEFycmF5IiwiV2Vha1NldCIsImNvZGVQb2ludEF0IiwiZnJvbUNvZGVQb2ludCIsIm5hdGl2ZUZyb21Db2RlUG9pbnQiLCJJTkNPUlJFQ1RfTEVOR1RIIiwiYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCIsIklTX0NPTkNBVF9TUFJFQURBQkxFIiwiTUFYX1NBRkVfSU5URUdFUiIsIk1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCIsIklTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQiLCJhcnJheSIsIlNQRUNJRVNfU1VQUE9SVCIsImlzQ29uY2F0U3ByZWFkYWJsZSIsInNwcmVhZGFibGUiLCJFIiwiZm9vIiwibmF0aXZlT2JqZWN0Q3JlYXRlIiwiZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsIiwid3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSIsImRlZmluZVdlbGxLbm93blN5bWJvbCIsIiRmb3JFYWNoIiwiU1lNQk9MIiwiVE9fUFJJTUlUSVZFIiwiJHN0cmluZ2lmeSIsIm5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMiLCJBbGxTeW1ib2xzIiwiT2JqZWN0UHJvdG90eXBlU3ltYm9scyIsIlN0cmluZ1RvU3ltYm9sUmVnaXN0cnkiLCJTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5IiwiUU9iamVjdCIsIlVTRV9TRVRURVIiLCJmaW5kQ2hpbGQiLCJzZXRTeW1ib2xEZXNjcmlwdG9yIiwiT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciIsImlzU3ltYm9sIiwiJGRlZmluZVByb3BlcnR5IiwiJGRlZmluZVByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzIiwiJGdldE93blByb3BlcnR5U3ltYm9scyIsIiRwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIiRjcmVhdGUiLCIkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiJGdldE93blByb3BlcnR5TmFtZXMiLCJJU19PQkpFQ1RfUFJPVE9UWVBFIiwia2V5Rm9yIiwic3ltIiwidXNlU2V0dGVyIiwidXNlU2ltcGxlIiwiRk9SQ0VEX0pTT05fU1RSSU5HSUZZIiwic3RyaW5naWZ5Iiwic3BhY2UiLCIkcmVwbGFjZXIiLCJ3aW5kb3dOYW1lcyIsImdldFdpbmRvd05hbWVzIiwiTmF0aXZlU3ltYm9sIiwiRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlIiwiU3ltYm9sV3JhcHBlciIsInN5bWJvbFByb3RvdHlwZSIsInN5bWJvbFRvU3RyaW5nIiwibmF0aXZlIiwiZGVzYyIsIkpTT04iLCIkcGFkU3RhcnQiLCJXRUJLSVRfQlVHIiwicGFkU3RhcnQiLCJyZXBlYXQiLCJJU19FTkQiLCJmaWxsU3RyaW5nIiwic3RyaW5nTGVuZ3RoIiwiZmlsbFN0ciIsImludE1heExlbmd0aCIsImZpbGxMZW4iLCJzdHJpbmdGaWxsZXIiLCJjb3VudCIsIiRwYWRFbmQiLCJwYWRFbmQiLCIkdmFsdWVzIiwiVE9fRU5UUklFUyIsIiRlbnRyaWVzIiwiREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFIiwiUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUIiwiRGVmYXVsdENhbnZhc0ZhY3RvcnkiLCJEZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkiLCJjcmVhdGVQREZOZXR3b3JrU3RyZWFtIiwiaXNBcnJheUJ1ZmZlciIsInJhbmdlIiwicmFuZ2VUcmFuc3BvcnQiLCJ3b3JrZXIiLCJwZGZCeXRlcyIsImFwaUNvbXBhdGliaWxpdHlQYXJhbXMiLCJzZXRWZXJib3NpdHlMZXZlbCIsIndvcmtlclBhcmFtcyIsIkdsb2JhbFdvcmtlck9wdGlvbnMiLCJQREZXb3JrZXIiLCJkb2NJZCIsIndvcmtlcklkUHJvbWlzZSIsIl9mZXRjaERvY3VtZW50IiwibmV0d29ya1N0cmVhbVByb21pc2UiLCJuZXR3b3JrU3RyZWFtIiwiaW5pdGlhbERhdGEiLCJwcm9ncmVzc2l2ZURvbmUiLCJkaXNhYmxlUmFuZ2UiLCJkaXNhYmxlU3RyZWFtIiwiaHR0cEhlYWRlcnMiLCJ3aXRoQ3JlZGVudGlhbHMiLCJyYW5nZUNodW5rU2l6ZSIsIm1lc3NhZ2VIYW5kbGVyIiwidHJhbnNwb3J0IiwicGRmRGF0YVJhbmdlVHJhbnNwb3J0IiwiYXBpVmVyc2lvbiIsImRpc2FibGVBdXRvRmV0Y2giLCJtYXhJbWFnZVNpemUiLCJkaXNhYmxlRm9udEZhY2UiLCJwb3N0TWVzc2FnZVRyYW5zZmVycyIsImRvY0Jhc2VVcmwiLCJpZ25vcmVFcnJvcnMiLCJmb250RXh0cmFQcm9wZXJ0aWVzIiwiUERGRG9jdW1lbnRMb2FkaW5nVGFzayIsIm5leHREb2N1bWVudElkIiwidHJhbnNwb3J0RGVzdHJveWVkIiwiYWRkUmFuZ2VMaXN0ZW5lciIsImFkZFByb2dyZXNzTGlzdGVuZXIiLCJhZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lciIsImFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyIiwib25EYXRhUmFuZ2UiLCJvbkRhdGFQcm9ncmVzcyIsIm9uRGF0YVByb2dyZXNzaXZlUmVhZCIsInJlcXVlc3REYXRhUmFuZ2UiLCJnZXRQYWdlIiwiZ2V0UGFnZUluZGV4IiwiZ2V0RGVzdGluYXRpb24iLCJzYXZlRG9jdW1lbnQiLCJwZGZCdWciLCJnZXRWaWV3cG9ydCIsImdldEFubm90YXRpb25zIiwiaW50ZW50IiwiZW5hYmxlV2ViR0wiLCJyZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIiwiaW1hZ2VMYXllciIsImNhbnZhc0ZhY3RvcnkiLCJiYWNrZ3JvdW5kIiwiYW5ub3RhdGlvblN0b3JhZ2UiLCJvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIiwicmVuZGVyIiwicmVuZGVyaW5nSW50ZW50IiwiaW50ZW50U3RhdGUiLCJjbGVhclRpbWVvdXQiLCJjYW52YXNGYWN0b3J5SW5zdGFuY2UiLCJ3ZWJHTENvbnRleHQiLCJlbmFibGUiLCJmbkFycmF5IiwiYXJnc0FycmF5IiwibGFzdENodW5rIiwicGFnZUluZGV4IiwiaW50ZXJuYWxSZW5kZXJUYXNrIiwiY2FudmFzQ29udGV4dCIsInZpZXdwb3J0Iiwib2JqcyIsImNvbW1vbk9ianMiLCJvcGVyYXRvckxpc3QiLCJ1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJyZW5kZXJUYXNrIiwidHJhbnNwYXJlbmN5Iiwib3B0aW9uYWxDb250ZW50Q29uZmlnIiwib3BMaXN0VGFzayIsInN0cmVhbVRleHRDb250ZW50Iiwibm9ybWFsaXplV2hpdGVzcGFjZSIsImRpc2FibGVDb21iaW5lVGV4dEl0ZW1zIiwiVEVYVF9DT05URU5UX0NIVU5LX1NJWkUiLCJjb21iaW5lVGV4dEl0ZW1zIiwidGV4dENvbnRlbnQiLCJnZXRUZXh0Q29udGVudCIsInJlYWRhYmxlU3RyZWFtIiwicHVtcCIsIml0ZW1zIiwic3R5bGVzIiwid2FpdE9uIiwicmVzZXRTdGF0cyIsImNsZWFudXAiLCJfdHJ5Q2xlYW51cCIsInJlbmRlclRhc2tzIiwiX3N0YXJ0UmVuZGVyUGFnZSIsIl9yZW5kZXJQYWdlQ2h1bmsiLCJvcGVyYXRvckxpc3RDaHVuayIsIl9wdW1wT3BlcmF0b3JMaXN0IiwiX2Fib3J0T3BlcmF0b3JMaXN0IiwiY3VySW50ZW50U3RhdGUiLCJjbG9uZWQiLCJ0cmFuc2ZlcmFibGUiLCJ0cmFuc2ZlcnMiLCJjbG9uZVZhbHVlIiwicGRmV29ya2VyUG9ydHMiLCJpc1dvcmtlckRpc2FibGVkIiwibmV4dEZha2VXb3JrZXJJZCIsImZhbGxiYWNrV29ya2VyU3JjIiwicGRmanNGaWxlUGF0aCIsImRlcHJlY2F0ZWQiLCJtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIiLCJmYWtlV29ya2VyQ2FwYWJpbGl0eSIsImxvYWRlciIsImdldE1haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlciIsImV2YWwiLCJnZXRXb3JrZXJTcmMiLCJsb2FkU2NyaXB0IiwiX2luaXRpYWxpemVGcm9tUG9ydCIsIndvcmtlclNyYyIsImlzU2FtZU9yaWdpbiIsImNyZWF0ZUNETldyYXBwZXIiLCJ0ZXJtaW5hdGVFYXJseSIsIm9uV29ya2VyRXJyb3IiLCJzZW5kVGVzdCIsInRlc3RPYmoiLCJzZXR1cEZha2VXb3JrZXJHbG9iYWwiLCJXb3JrZXJNZXNzYWdlSGFuZGxlciIsIndvcmtlckhhbmRsZXIiLCJsb2FkaW5nVGFzayIsIm9uVW5zdXBwb3J0ZWRGZWF0dXJlIiwicGFnZSIsInRlcm1pbmF0ZWQiLCJldnQiLCJsb2FkZWQiLCJ0b3RhbCIsInNpbmsiLCJyZWFkeVJlYXNvbiIsImhlYWRlcnNDYXBhYmlsaXR5IiwiZnVsbFJlYWRlciIsImlzU3RyZWFtaW5nU3VwcG9ydGVkIiwiaXNSYW5nZVN1cHBvcnRlZCIsImNvbnRlbnRMZW5ndGgiLCJyYW5nZVJlYWRlciIsInBkZkluZm8iLCJleCIsIm1zZyIsImV4Y2VwdGlvbiIsInVwZGF0ZVBhc3N3b3JkIiwiZXhwb3J0ZWRFcnJvciIsImV4cG9ydGVkRGF0YSIsImZvbnRSZWdpc3RyeSIsInJlZ2lzdGVyRm9udCIsInBhZ2VQcm94eSIsIk1BWF9JTUFHRV9TSVpFX1RPX1NUT1JFIiwiaW1hZ2VEYXRhIiwiZmV0Y2hlZCIsImJ1aWx0SW5DTWFwIiwiX29uVW5zdXBwb3J0ZWRGZWF0dXJlIiwicGFnZU51bWJlciIsInBhZ2VJbmZvIiwicmVmIiwibnVtUGFnZXMiLCJmaWxlbmFtZSIsInJlc3VsdHMiLCJjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSIsImNsZWFudXBTdWNjZXNzZnVsIiwiX2Vuc3VyZU9iaiIsInJlc29sdmVkIiwiSW50ZXJuYWxSZW5kZXJUYXNrIiwiY2FudmFzSW5SZW5kZXJpbmciLCJpbml0aWFsaXplR3JhcGhpY3MiLCJidWlsZCIsImFkZE5hdGl2ZUZvbnRGYWNlIiwiaW5zZXJ0UnVsZSIsInN0eWxlRWxlbWVudCIsInN0eWxlU2hlZXQiLCJuYXRpdmVGb250RmFjZSIsImZlYXR1cmVJZCIsInJ1bGUiLCJfcXVldWVMb2FkaW5nQ2FsbGJhY2siLCJfcHJlcGFyZUZvbnRMb2FkRXZlbnQiLCJzdXBwb3J0ZWQiLCJGb250TG9hZGVyIiwicmVxdWVzdHMiLCJuZXh0UmVxdWVzdElkIiwib3RoZXJSZXF1ZXN0Iiwib2Zmc2V0IiwiY2h1bmsxIiwicyIsImNodW5rMiIsImN0eCIsImlzRm9udFJlYWR5IiwibG9hZFRlc3RGb250SWQiLCJDT01NRU5UX09GRlNFVCIsInNwbGljZVN0cmluZyIsIkNGRl9DSEVDS1NVTV9PRkZTRVQiLCJYWFhYX1ZBTFVFIiwiY2hlY2tzdW0iLCJpbnQzMiIsInN0cmluZzMyIiwiYnRvYSIsImZvbnRzIiwic3BhbiIsImdldExvYWRUZXN0Rm9udCIsImF0b2IiLCJ0cmFuc2xhdGVkRGF0YSIsImJ5dGVzVG9TdHJpbmciLCJnZXRQYXRoR2VuZXJhdG9yIiwiY21kcyIsImpzIiwiY3VycmVudCIsIk5vZGVDYW52YXNGYWN0b3J5IiwiTm9kZUNNYXBSZWFkZXJGYWN0b3J5IiwiQ2FudmFzIiwiX19ub25fd2VicGFja19yZXF1aXJlX18iLCJmcyIsImdldE9yQ3JlYXRlVmFsdWUiLCJzZXRWYWx1ZSIsImNvbXBhdGliaWxpdHlQYXJhbXMiLCJNSU5fRk9OVF9TSVpFIiwiTUFYX0ZPTlRfU0laRSIsIk1BWF9HUk9VUF9TSVpFIiwiTUlOX1dJRFRIX0ZBQ1RPUiIsIkNPTVBJTEVfVFlQRTNfR0xZUEhTIiwiTUFYX1NJWkVfVE9fQ09NUElMRSIsIkZVTExfQ0hVTktfSEVJR0hUIiwiYWRfYmMiLCJiY19hZCIsIm9sZCIsImNvc1ZhbHVlIiwic2luVmFsdWUiLCJDYWNoZWRDYW52YXNlcyIsImdldENhbnZhcyIsImNhbnZhc0VudHJ5IiwiYWRkQ29udGV4dEN1cnJlbnRUcmFuc2Zvcm0iLCJQT0lOVF9UT19QUk9DRVNTX0xJTUlUIiwiaW1nRGF0YSIsIndpZHRoMSIsInBvaW50cyIsIlBPSU5UX1RZUEVTIiwibGluZVNpemUiLCJkYXRhMCIsIm1hc2siLCJlbGVtIiwiajAiLCJzdW0iLCJzdGVwcyIsIm91dGxpbmVzIiwiY29vcmRzIiwicDAiLCJwcCIsImRyYXdPdXRsaW5lIiwia2siLCJvIiwibCIsImxsIiwiQ2FudmFzRXh0cmFTdGF0ZSIsInNldEN1cnJlbnRQb2ludCIsIkNhbnZhc0dyYXBoaWNzIiwiRVhFQ1VUSU9OX1RJTUUiLCJFWEVDVVRJT05fU1RFUFMiLCJ0cmFuc2Zlck1hcHMiLCJwYXJ0aWFsQ2h1bmtIZWlnaHQiLCJmdWxsQ2h1bmtzIiwidG90YWxDaHVua3MiLCJjaHVua0ltZ0RhdGEiLCJzcmNQb3MiLCJ0cmFuc2Zlck1hcFJlZCIsInRyYW5zZmVyTWFwR3JlZW4iLCJ0cmFuc2Zlck1hcEJsdWUiLCJ0cmFuc2Zlck1hcEdyYXkiLCJzcmNMZW5ndGgiLCJkZXN0MzIiLCJkZXN0MzJEYXRhTGVuZ3RoIiwiZnVsbFNyY0RpZmYiLCJ3aGl0ZSIsImJsYWNrIiwidGhpc0NodW5rSGVpZ2h0IiwiZGVzdFBvcyIsInNyY0RpZmYiLCJrRW5kIiwia0VuZFVucm9sbGVkIiwic3JjQnl0ZSIsImhhc1RyYW5zZmVyTWFwcyIsImVsZW1zSW5UaGlzQ2h1bmsiLCJzb3VyY2VDdHgiLCJkZXN0Q3R4IiwiYWxwaGEiLCJhbHBoYV8iLCJyMCIsImcwIiwiYjAiLCJtYXNrRGF0YSIsInRyYW5zZmVyTWFwIiwibGF5ZXJEYXRhIiwieSIsImhhc0JhY2tkcm9wIiwiYmFja2Ryb3AiLCJzdWJ0eXBlIiwiY29tcG9zZUZuIiwiUElYRUxTX1RPX1BST0NFU1MiLCJyb3ciLCJjaHVua0hlaWdodCIsIm1hc2tDdHgiLCJsYXllckN0eCIsImNvbXBvc2VTTWFza0JhY2tkcm9wIiwiY29tcG9zZWQiLCJsYXllciIsImdlbmVyaWNDb21wb3NlU01hc2siLCJMSU5FX0NBUF9TVFlMRVMiLCJMSU5FX0pPSU5fU1RZTEVTIiwiTk9STUFMX0NMSVAiLCJFT19DTElQIiwiYmVnaW5EcmF3aW5nIiwidHJhbnNwYXJlbnRDYW52YXMiLCJyZXNldEN0eFRvRGVmYXVsdCIsImV4ZWN1dGVPcGVyYXRvckxpc3QiLCJleGVjdXRpb25TdGFydElkeCIsImFyZ3NBcnJheUxlbiIsImNodW5rT3BlcmF0aW9ucyIsImVuZFRpbWUiLCJzdGVwcGVyIiwiZm5JZCIsIm9ianNQb29sIiwiZGVwT2JqSWQiLCJjb250aW51ZUNhbGxiYWNrIiwiZW5kRHJhd2luZyIsInN0YXRlcyIsImJlZ2luU01hc2tHcm91cCIsImFjdGl2ZVNNYXNrIiwiZHJhd25XaWR0aCIsImRyYXduSGVpZ2h0IiwiY2FjaGVJZCIsInNjcmF0Y2hDYW52YXMiLCJjdXJyZW50Q3R4IiwiY3VycmVudFRyYW5zZm9ybSIsImdyb3VwQ3R4IiwiY29weUN0eFN0YXRlIiwic3VzcGVuZFNNYXNrR3JvdXAiLCJjb21wb3NlU01hc2siLCJkZWx0YVRyYW5zZm9ybSIsInJlc3VtZVNNYXNrR3JvdXAiLCJlbmRTTWFza0dyb3VwIiwib3BzIiwieHciLCJ5aCIsImNvbnN1bWVQYXRoIiwic3Ryb2tlQ29sb3IiLCJmaWxsQ29sb3IiLCJpc1BhdHRlcm5GaWxsIiwibmVlZFJlc3RvcmUiLCJwYXRocyIsImZvbnRPYmoiLCJib2xkIiwiaXRhbGljIiwidHlwZWZhY2UiLCJicm93c2VyRm9udFNpemUiLCJwYWludENoYXIiLCJ0ZXh0UmVuZGVyaW5nTW9kZSIsImZvbnRTaXplIiwiZmlsbFN0cm9rZU1vZGUiLCJpc0FkZFRvUGF0aFNldCIsInBhdHRlcm5GaWxsIiwiYWRkVG9QYXRoIiwiZm9udFNpemVTY2FsZSIsImNoYXJTcGFjaW5nIiwid29yZFNwYWNpbmciLCJmb250RGlyZWN0aW9uIiwidGV4dEhTY2FsZSIsImdseXBoc0xlbmd0aCIsImdseXBocyIsInZlcnRpY2FsIiwic3BhY2luZ0RpciIsImRlZmF1bHRWTWV0cmljcyIsIndpZHRoQWR2YW5jZVNjYWxlIiwic2ltcGxlRmlsbFRleHQiLCJwYXR0ZXJuIiwicGF0dGVyblRyYW5zZm9ybSIsImxpbmVXaWR0aCIsImdseXBoIiwiaXNOdW0iLCJyZXN0b3JlTmVlZGVkIiwic3BhY2luZyIsImNoYXJhY3RlciIsImFjY2VudCIsInZtZXRyaWMiLCJ2eCIsInZ5Iiwic2NhbGVkWCIsInNjYWxlZFkiLCJtZWFzdXJlZFdpZHRoIiwiY2hhcmFjdGVyU2NhbGVYIiwic2NhbGVkQWNjZW50WCIsInNjYWxlZEFjY2VudFkiLCJjaGFyV2lkdGgiLCJzaG93VHlwZTNUZXh0IiwiZm9udE1hdHJpeCIsImlzVGV4dEludmlzaWJsZSIsInNwYWNpbmdMZW5ndGgiLCJ0cmFuc2Zvcm1lZCIsInVyeCIsInVyeSIsImdldENvbG9yTl9QYXR0ZXJuIiwiSVIiLCJjb2xvciIsImJhc2VUcmFuc2Zvcm0iLCJjYW52YXNHcmFwaGljc0ZhY3RvcnkiLCJjcmVhdGVDYW52YXNHcmFwaGljcyIsImdldFNoYWRpbmdQYXR0ZXJuRnJvbUlSIiwiaW52IiwiYmwiLCJiciIsInVsIiwidXIiLCJ4MCIsInkwIiwieDEiLCJ5MSIsIm1hdHJpeCIsImJib3giLCJncm91cCIsImJvdW5kcyIsImNhbnZhc0JvdW5kcyIsInNjYWxlWCIsInNjYWxlWSIsInN0YXJ0VHJhbnNmb3JtSW52ZXJzZSIsImltZyIsIm1hc2tDYW52YXMiLCJwdXRCaW5hcnlJbWFnZU1hc2siLCJza2V3WCIsInNrZXdZIiwicG9zaXRpb25zIiwiaW1hZ2VzIiwiaW1hZ2UiLCJvYmpJZCIsInciLCJoIiwid2lkdGhTY2FsZSIsImhlaWdodFNjYWxlIiwiaW1nVG9QYWludCIsInRtcENhbnZhcyIsInRtcEN0eCIsInB1dEJpbmFyeUltYWdlRGF0YSIsInBhaW50V2lkdGgiLCJwYWludEhlaWdodCIsInRtcENhbnZhc0lkIiwibmV3V2lkdGgiLCJuZXdIZWlnaHQiLCJsZWZ0IiwidG9wIiwidmlzaWJsZSIsImdldFNpbmdsZVBpeGVsV2lkdGgiLCJpbnZlcnNlIiwiZ2V0Q2FudmFzUG9zaXRpb24iLCJpc0NvbnRlbnRWaXNpYmxlIiwiU2hhZGluZ0lScyIsInJlZ2lvbiIsImZyb21JUiIsInJhdyIsImNvbG9yU3RvcHMiLCJyMSIsImdldFBhdHRlcm4iLCJhcHBseUJvdW5kaW5nQm94IiwiZ3JhZCIsImNyZWF0ZU1lc2hDYW52YXMiLCJjb2xvcnMiLCJyb3dTaXplIiwidG1wIiwiYzEiLCJjMiIsImMzIiwieDIiLCJ5MiIsIngzIiwieTMiLCJjMXIiLCJjMWciLCJjMWIiLCJjMnIiLCJjMmciLCJjMmIiLCJjM3IiLCJjM2ciLCJjM2IiLCJtaW5ZIiwibWF4WSIsInhhIiwiY2FyIiwiY2FnIiwiY2FiIiwieGIiLCJjYnIiLCJjYmciLCJjYmIiLCJ4MV8iLCJ4Ml8iLCJwcyIsImZpZ3VyZSIsImNzIiwidmVydGljZXNQZXJSb3ciLCJyb3dzIiwiY29scyIsImRyYXdUcmlhbmdsZSIsIkVYUEVDVEVEX1NDQUxFIiwiTUFYX1BBVFRFUk5fU0laRSIsIkJPUkRFUl9TSVpFIiwiYm91bmRzV2lkdGgiLCJib3VuZHNIZWlnaHQiLCJjb21iaW5lc1NjYWxlIiwicGFkZGVkV2lkdGgiLCJwYWRkZWRIZWlnaHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJmaWd1cmVzIiwiY2FjaGVkQ2FudmFzZXMiLCJkcmF3RmlndXJlIiwib3duZXIiLCJtYXRyaXhTY2FsZSIsInRlbXBvcmFyeVBhdHRlcm5DYW52YXMiLCJzaGFkaW5nSVIiLCJUaWxpbmdQYXR0ZXJuIiwiUGFpbnRUeXBlIiwiQ09MT1JFRCIsIlVOQ09MT1JFRCIsImNyZWF0ZVBhdHRlcm5DYW52YXMiLCJ4c3RlcCIsInlzdGVwIiwicGFpbnRUeXBlIiwidGlsaW5nVHlwZSIsImN1ck1hdHJpeFNjYWxlIiwiY29tYmluZWRTY2FsZSIsImRpbXgiLCJkaW15IiwiZ3JhcGhpY3MiLCJnZXRTaXplQW5kU2NhbGUiLCJtYXhTaXplIiwiY2xpcEJib3giLCJiYm94V2lkdGgiLCJiYm94SGVpZ2h0Iiwic2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0IiwiY3NzQ29sb3IiLCJDYWxsYmFja0tpbmQiLCJEQVRBIiwiRVJST1IiLCJTdHJlYW1LaW5kIiwiQ0FOQ0VMIiwiQ0FOQ0VMX0NPTVBMRVRFIiwiQ0xPU0UiLCJFTlFVRVVFIiwiUFVMTCIsIlBVTExfQ09NUExFVEUiLCJTVEFSVF9DT01QTEVURSIsImNhbGxiYWNrSWQiLCJ3cmFwUmVhc29uIiwiY2JTb3VyY2VOYW1lIiwiY2JUYXJnZXROYW1lIiwiY29tT2JqIiwic291cmNlTmFtZSIsInRhcmdldE5hbWUiLCJvbiIsImFoIiwic2VuZCIsInNlbmRXaXRoUHJvbWlzZSIsInNlbmRXaXRoU3RyZWFtIiwic3RyZWFtSWQiLCJzdGFydENhcGFiaWxpdHkiLCJzdGFydENhbGwiLCJwdWxsQ2FsbCIsImNhbmNlbENhbGwiLCJpc0Nsb3NlZCIsInB1bGwiLCJwdWxsQ2FwYWJpbGl0eSIsImNhbmNlbENhcGFiaWxpdHkiLCJfY3JlYXRlU3RyZWFtU2luayIsInN0cmVhbVNpbmsiLCJsYXN0RGVzaXJlZFNpemUiLCJzaW5rQ2FwYWJpbGl0eSIsIm9uUHVsbCIsIm9uQ2FuY2VsIiwiaXNDYW5jZWxsZWQiLCJzdWNjZXNzIiwiX3Byb2Nlc3NTdHJlYW1NZXNzYWdlIiwiX3Bvc3RNZXNzYWdlIiwicGFyc2VyIiwieG1sRG9jdW1lbnQiLCJfcmVwYWlyIiwiY2hhcnMiLCJfcGFyc2UiLCJyZGYiLCJub2RlTmFtZSIsImNoaWxkcmVuIiwiamoiLCJYTUxQYXJzZXJFcnJvckNvZGUiLCJOb0Vycm9yIiwiRW5kT2ZEb2N1bWVudCIsIlVudGVybWluYXRlZENkYXQiLCJVbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbiIsIlVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbiIsIlVudGVybWluYXRlZENvbW1lbnQiLCJNYWxmb3JtZWRFbGVtZW50IiwiT3V0T2ZNZW1vcnkiLCJVbnRlcm1pbmF0ZWRBdHRyaWJ1dGVWYWx1ZSIsIlVudGVybWluYXRlZEVsZW1lbnQiLCJFbGVtZW50TmV2ZXJCZWd1biIsImNoIiwiaXNXaGl0ZXNwYWNlIiwiX3Jlc29sdmVFbnRpdGllcyIsImVudGl0eSIsIl9wYXJzZUNvbnRlbnQiLCJza2lwV3MiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImF0dHJFbmRDaGFyIiwiYXR0ckVuZEluZGV4IiwicGFyc2VkIiwiX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uIiwiYXR0clN0YXJ0IiwicGFyc2VYbWwiLCJjaDIiLCJwaSIsInEyIiwiY29tcGxleERvY3R5cGUiLCJkb2N0eXBlQ29udGVudCIsInRleHQiLCJvblJlc29sdmVFbnRpdHkiLCJvblBpIiwib25Db21tZW50Iiwib25DZGF0YSIsIm9uRG9jdHlwZSIsIm9uVGV4dCIsIm9uQmVnaW5FbGVtZW50Iiwib25FbmRFbGVtZW50Iiwib25FcnJvciIsImNoaWxkTm9kZXMiLCJjaGlsZCIsInBhcnNlRnJvbVN0cmluZyIsImRvY3VtZW50RWxlbWVudCIsImlzV2hpdGVzcGFjZVN0cmluZyIsImxhc3RFbGVtZW50IiwiaXNWaXNpYmxlIiwic2V0VmlzaWJpbGl0eSIsImdldEdyb3VwIiwiYmVnaW4iLCJfb25SZWNlaXZlRGF0YSIsIl9vblByb2dyZXNzIiwiZmlyc3RSZWFkZXIiLCJfcmVtb3ZlUmFuZ2VSZWFkZXIiLCJxdWV1ZWRDaHVua3MiLCJnZXRSYW5nZVJlYWRlciIsImNhbmNlbEFsbFJlcXVlc3RzIiwicmVhZGVycyIsIl9lbnF1ZXVlIiwicmVxdWVzdENhcGFiaWxpdHkiLCJyZXF1ZXN0c0NhcGFiaWxpdHkiLCJXZWJHTFV0aWxzIiwiZHJhd0ZpZ3VyZXMiLCJzaGFkZXIiLCJnbCIsImNvbXBpbGVkIiwiZXJyb3JNc2ciLCJsb2FkU2hhZGVyIiwicHJvZ3JhbSIsInNoYWRlcnMiLCJsaW5rZWQiLCJ0ZXh0dXJlIiwiY3VycmVudENhbnZhcyIsImN1cnJlbnRHTCIsInByZW11bHRpcGxpZWRhbHBoYSIsInNtYXNrVmVydGV4U2hhZGVyQ29kZSIsInNtYXNrRnJhZ21lbnRTaGFkZXJDb2RlIiwic21hc2tDYWNoZSIsImdlbmVyYXRlR0wiLCJ2ZXJ0ZXhTaGFkZXIiLCJjcmVhdGVWZXJ0ZXhTaGFkZXIiLCJmcmFnbWVudFNoYWRlciIsImNyZWF0ZUZyYWdtZW50U2hhZGVyIiwidGV4Q29vcmRMb2NhdGlvbiIsInRleExheWVyTG9jYXRpb24iLCJ0ZXhNYXNrTG9jYXRpb24iLCJ0ZXhDb29yZEJ1ZmZlciIsImluaXRTbWFza0dMIiwiY3JlYXRlVGV4dHVyZSIsIm1hc2tUZXh0dXJlIiwiZmlndXJlc1ZlcnRleFNoYWRlckNvZGUiLCJmaWd1cmVzRnJhZ21lbnRTaGFkZXJDb2RlIiwiZmlndXJlc0NhY2hlIiwiaW5pdEZpZ3VyZXNHTCIsImNvb3Jkc01hcCIsImNvbG9yc01hcCIsInBJbmRleCIsImNJbmRleCIsImNvbCIsImNvb3Jkc0J1ZmZlciIsImNvbG9yc0J1ZmZlciIsInRyeUluaXRHTCIsInBhcmFtZXRlcnMiLCJmaWVsZFR5cGUiLCJpc1JlbmRlcmFibGUiLCJpZ25vcmVCb3JkZXIiLCJfY3JlYXRlQ29udGFpbmVyIiwiaG9yaXpvbnRhbFJhZGl1cyIsInZlcnRpY2FsUmFkaXVzIiwicmFkaXVzIiwiX2NyZWF0ZVBvcHVwIiwidHJpZ2dlciIsInBvcHVwRWxlbWVudCIsInRpdGxlIiwibW9kaWZpY2F0aW9uRGF0ZSIsImNvbnRlbnRzIiwiaGlkZVdyYXBwZXIiLCJwb3B1cCIsImFkZExpbmtBdHRyaWJ1dGVzIiwibGlua1NlcnZpY2UiLCJyZWwiLCJfYmluZExpbmsiLCJfYmluZE5hbWVkQWN0aW9uIiwiVEVYVF9BTElHTk1FTlQiLCJzdG9yYWdlIiwiZmllbGRXaWR0aCIsImNvbWJXaWR0aCIsIl9zZXRUZXh0U3R5bGUiLCJmb250RmFtaWx5IiwiZmFsbGJhY2tOYW1lIiwicmFkaW8iLCJzZWxlY3RFbGVtZW50Iiwib3B0aW9uRWxlbWVudCIsIm9wdGlvbiIsIklHTk9SRV9UWVBFUyIsInNlbGVjdG9yIiwicGFyZW50RWxlbWVudCIsInBhcmVudExlZnQiLCJwYXJzZUZsb2F0IiwicGFyZW50V2lkdGgiLCJCQUNLR1JPVU5EX0VOTElHSFQiLCJnIiwiZGF0ZU9iamVjdCIsIlBERkRhdGVTdHJpbmciLCJfZm9ybWF0Q29udGVudHMiLCJsaW5lcyIsImxpbmUiLCJwaW4iLCJfc2hvdyIsInVucGluIiwiX2hpZGUiLCJib3JkZXJXaWR0aCIsInNxdWFyZSIsImNpcmNsZSIsImNvb3JkaW5hdGUiLCJwb2x5bGluZSIsImdldEZpbGVuYW1lRnJvbVVybCIsInN0cmluZ1RvUERGU3RyaW5nIiwic29ydGVkQW5ub3RhdGlvbnMiLCJwb3B1cEFubm90YXRpb25zIiwiZG93bmxvYWRNYW5hZ2VyIiwiaW1hZ2VSZXNvdXJjZXNQYXRoIiwic3ZnRmFjdG9yeSIsInJlbmRlclRleHRMYXllciIsIk1BWF9URVhUX0RJVlNfVE9fUkVOREVSIiwiTm9uV2hpdGVzcGFjZVJlZ2V4cCIsInRleHREaXYiLCJ0ZXh0RGl2UHJvcGVydGllcyIsImFuZ2xlIiwiY2FudmFzV2lkdGgiLCJvcmlnaW5hbFRyYW5zZm9ybSIsInBhZGRpbmdCb3R0b20iLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdUb3AiLCJpc0FsbFdoaXRlc3BhY2UiLCJnZW9tIiwidHgiLCJmb250SGVpZ2h0IiwiZm9udEFzY2VudCIsInNob3VsZFNjYWxlVGV4dCIsImFic1NjYWxlWCIsImFic1NjYWxlWSIsImFuZ2xlQ29zIiwiYW5nbGVTaW4iLCJkaXZXaWR0aCIsImRpdkhlaWdodCIsInJpZ2h0IiwiYm90dG9tIiwidGV4dERpdnMiLCJ0ZXh0RGl2c0xlbmd0aCIsInRzIiwiZXhwYW5kZWQiLCJleHBhbmRCb3VuZHMiLCJkaXZQcm9wZXJ0aWVzIiwiYm94U2NhbGUiLCJmaW5kUG9zaXRpdmVNaW4iLCJib3giLCJ4MU5ldyIsIngyTmV3IiwiZXhwYW5kQm91bmRzTFRSIiwiYm94ZXMiLCJmYWtlQm91bmRhcnkiLCJob3Jpem9uIiwiYm91bmRhcnkiLCJtYXhYTmV3IiwiaG9yaXpvblBhcnQiLCJhZmZlY3RlZEJvdW5kYXJ5IiwieE5ldyIsImNoYW5nZWRIb3Jpem9uIiwibGFzdEJvdW5kYXJ5IiwidXNlQm91bmRhcnkiLCJ1c2VkIiwidGV4dENvbnRlbnRJdGVtc1N0ciIsIlRleHRMYXllclJlbmRlclRhc2siLCJfcHJvY2Vzc0l0ZW1zIiwiYXBwZW5kVGV4dCIsIl9sYXlvdXRUZXh0IiwiX3JlbmRlciIsInN0eWxlQ2FjaGUiLCJ0ZXh0SXRlbXMiLCJ0ZXh0U3R5bGVzIiwiZXhwYW5kVGV4dERpdnMiLCJleHBhbmQiLCJ0cmFuc2Zvcm1CdWYiLCJwYWRkaW5nQnVmIiwiZGl2UHJvcHMiLCJyZW5kZXJQYXJhbWV0ZXJzIiwidGV4dENvbnRlbnRTdHJlYW0iLCJlbmhhbmNlVGV4dFNlbGVjdGlvbiIsIlNWR0dyYXBoaWNzIiwib3BUcmVlIiwib3BMaXN0RWxlbWVudCIsInBmIiwiU1ZHX0RFRkFVTFRTIiwiZm9udFN0eWxlIiwiZm9udFdlaWdodCIsIlhNTF9OUyIsIlhMSU5LX05TIiwiY29udmVydEltZ0RhdGFUb1BuZyIsIlBOR19IRUFERVIiLCJDSFVOS19XUkFQUEVSX1NJWkUiLCJjcmNUYWJsZSIsImNyYyIsImNyYzMyIiwiZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQiLCJsZXZlbCIsImxpdGVyYWxzIiwibWF4QmxvY2tMZW5ndGgiLCJkZWZsYXRlQmxvY2tzIiwiaWRhdCIsImFkbGVyIiwiYWRsZXIzMiIsImNvbG9yVHlwZSIsImJpdERlcHRoIiwib2Zmc2V0TGl0ZXJhbHMiLCJvZmZzZXRCeXRlcyIsImloZHIiLCJkZWZsYXRlU3luYyIsInBuZ0xlbmd0aCIsIndyaXRlUG5nQ2h1bmsiLCJjbGlwQ291bnQiLCJtYXNrQ291bnQiLCJzaGFkaW5nQ291bnQiLCJsb2FkRGVwZW5kZW5jaWVzIiwidHJhbnNmb3JtTWF0cml4IiwiZ2V0U1ZHIiwic3ZnRWxlbWVudCIsImNvbnZlcnRPcExpc3QiLCJvcGVyYXRvcklkTWFwcGluZyIsIm9wTGlzdCIsIm9wTGlzdFRvVHJlZSIsImV4ZWN1dGVPcFRyZWUiLCJvcFRyZWVFbGVtZW50IiwibGluZVdpZHRoU2NhbGUiLCJ0ZXh0TWF0cml4IiwicG0iLCJhZGRGb250U3R5bGUiLCJkZXRhaWxzIiwic2V0U3Ryb2tlQWxwaGEiLCJzZXRGaWxsQWxwaGEiLCJfbWFrZUNvbG9yTl9QYXR0ZXJuIiwiX21ha2VUaWxpbmdQYXR0ZXJuIiwidGlsaW5nSWQiLCJ0eHN0ZXAiLCJ0eXN0ZXAiLCJ0aWxpbmciLCJ0eDEiLCJ0eTEiLCJfbWFrZVNoYWRpbmdQYXR0ZXJuIiwic2hhZGluZ0lkIiwicG9pbnQwIiwicG9pbnQxIiwiZ3JhZGllbnQiLCJmb2NhbFBvaW50IiwiY2lyY2xlUG9pbnQiLCJmb2NhbFJhZGl1cyIsImNpcmNsZVJhZGl1cyIsImNvbG9yU3RvcCIsIm9wIiwiY2xpcElkIiwiY2xpcFBhdGgiLCJjbGlwRWxlbWVudCIsIl9zZXRTdHJva2VBdHRyaWJ1dGVzIiwiZGFzaEFycmF5IiwiaW1nU3JjIiwiY2xpcHJlY3QiLCJpbWdFbCIsIl9pbml0aWFsaXplIiwiZGVmaW5pdGlvbnMiLCJyb290R3JvdXAiLCJjbGlwR3JvdXAiLCJmaWxlVXJpUmVnZXgiLCJwYXJzZWRVcmwiLCJwYXJzZVVybCIsIl9lcnJvciIsIl9zZXRSZWFkYWJsZVN0cmVhbSIsImF1dGgiLCJoYW5kbGVSZXNwb25zZSIsImdldFJlc3BvbnNlSGVhZGVyIiwiaXNIdHRwIiwic3VnZ2VzdGVkTGVuZ3RoIiwiZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlciIsImNyZWF0ZVJlcXVlc3RPcHRpb25zIiwicmV0dXJuVmFsdWVzIiwiYWxsb3dSYW5nZVJlcXVlc3RzIiwiY29udGVudEVuY29kaW5nIiwiY29udGVudERpc3Bvc2l0aW9uIiwiZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyIiwibmVlZHNFbmNvZGluZ0ZpeHVwIiwidG9QYXJhbVJlZ0V4cCIsInJmYzI2MTZ1bnF1b3RlIiwicmZjNTk4N2RlY29kZSIsInJmYzIwNDdkZWNvZGUiLCJmaXh1cEVuY29kaW5nIiwicmZjMjIzMWdldHBhcmFtIiwiZGVjb2RlciIsImZhdGFsIiwidGV4dGRlY29kZSIsInF1b3RpbmRleCIsImVuY29kaW5nZW5kIiwiZXh0dmFsdWUiLCJlbmNvZGluZyIsImxhbmd2YWx1ZSIsIk9LX1JFU1BPTlNFIiwiUEFSVElBTF9DT05URU5UX1JFU1BPTlNFIiwieGhyIiwicmVxdWVzdFJhbmdlIiwibGlzdGVuZXJzIiwicmVxdWVzdEZ1bGwiLCJ4aHJJZCIsInBlbmRpbmdSZXF1ZXN0Iiwib25Qcm9ncmVzcyIsIm9uU3RhdGVDaGFuZ2UiLCJ4aHJTdGF0dXMiLCJva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0IiwiZ2V0QXJyYXlCdWZmZXIiLCJyYW5nZUhlYWRlciIsImdldFJlcXVlc3RYaHIiLCJpc1BlbmRpbmdSZXF1ZXN0IiwiX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkIiwib25IZWFkZXJzUmVjZWl2ZWQiLCJvbkRvbmUiLCJtYW5hZ2VyIiwiZnVsbFJlcXVlc3RYaHJJZCIsImZ1bGxSZXF1ZXN0WGhyIiwiX29uRG9uZSIsIl9vbkVycm9yIiwiY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvciIsImFib3J0Q29udHJvbGxlciIsImNyZWRlbnRpYWxzIiwicmVkaXJlY3QiLCJjcmVhdGVIZWFkZXJzIiwiY3JlYXRlRmV0Y2hPcHRpb25zIiwidmFsaWRhdGVSZXNwb25zZVN0YXR1cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO1FDVkE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FB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Ozs7QUFBeEIscUIsMEJBQUEsSztBQUFBLG9CLDBCQUFBLEk7O3FCQUNOLEk7Ozs7O2tEQUNTO0FBQUU3M0IsdUJBQUYsRUFBRUEsS0FBRjtBQUFTZ0Qsc0JBQVQsRUFBU0E7QUFBVCxpQjs7O0FBRVQsZ0NBQWdCaEQsTUFOTCxVQU1YOztBQUNBLG9CQUFJLEtBQUosWUFBcUI7QUFDbkIsa0NBQWdCO0FBQUU2NUQsNEJBQVEsS0FEUDtBQUNILG1CQUFoQjtBQVJTOztBQVVMeGhELHNCLEdBQVMsc0JBVkosTTtrREFXSjtBQUFFclkseUJBQUY7QUFBaUJnRCx3QkFBakI7QUFBQSxpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJCQUdUK3NDLE0sRUFBZTtBQUNiLFVBQUksS0FBSixTQUFrQjtBQUNoQiw0QkFEZ0IsTUFDaEI7QUFGVzs7QUFJYixVQUFJLEtBQUosa0JBQTJCO0FBQ3pCLDhCQUR5QixLQUN6QjtBQUxXO0FBN0RlOzs7d0JBMkNIO0FBQ3pCLGFBQU8sS0FEa0IscUJBQ3pCO0FBNUM0QiIsImZpbGUiOiJwZGYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd19wZGZqc19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd19wZGZqc19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd19wZGZqc19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dfcGRmanNfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd19wZGZqc19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd19wZGZqc19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd19wZGZqc19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucyA9IDApO1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIGFkZExpbmtBdHRyaWJ1dGVzLFxuICBnZXRGaWxlbmFtZUZyb21VcmwsXG4gIGlzRmV0Y2hTdXBwb3J0ZWQsXG4gIGlzVmFsaWRGZXRjaFVybCxcbiAgTGlua1RhcmdldCxcbiAgbG9hZFNjcmlwdCxcbiAgUERGRGF0ZVN0cmluZyxcbiAgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLFxufSBmcm9tIFwiLi9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIGJ1aWxkLFxuICBnZXREb2N1bWVudCxcbiAgTG9vcGJhY2tQb3J0LFxuICBQREZEYXRhUmFuZ2VUcmFuc3BvcnQsXG4gIFBERldvcmtlcixcbiAgc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnksXG4gIHZlcnNpb24sXG59IGZyb20gXCIuL2Rpc3BsYXkvYXBpLmpzXCI7XG5pbXBvcnQge1xuICBDTWFwQ29tcHJlc3Npb25UeXBlLFxuICBjcmVhdGVPYmplY3RVUkwsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBjcmVhdGVWYWxpZEFic29sdXRlVXJsLFxuICBJbnZhbGlkUERGRXhjZXB0aW9uLFxuICBNaXNzaW5nUERGRXhjZXB0aW9uLFxuICBPUFMsXG4gIFBhc3N3b3JkUmVzcG9uc2VzLFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgcmVtb3ZlTnVsbENoYXJhY3RlcnMsXG4gIHNoYWRvdyxcbiAgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uLFxuICBVTlNVUFBPUlRFRF9GRUFUVVJFUyxcbiAgVXRpbCxcbiAgVmVyYm9zaXR5TGV2ZWwsXG59IGZyb20gXCIuL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uTGF5ZXIgfSBmcm9tIFwiLi9kaXNwbGF5L2Fubm90YXRpb25fbGF5ZXIuanNcIjtcbmltcG9ydCB7IGFwaUNvbXBhdGliaWxpdHlQYXJhbXMgfSBmcm9tIFwiLi9kaXNwbGF5L2FwaV9jb21wYXRpYmlsaXR5LmpzXCI7XG5pbXBvcnQgeyBHbG9iYWxXb3JrZXJPcHRpb25zIH0gZnJvbSBcIi4vZGlzcGxheS93b3JrZXJfb3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgcmVuZGVyVGV4dExheWVyIH0gZnJvbSBcIi4vZGlzcGxheS90ZXh0X2xheWVyLmpzXCI7XG5pbXBvcnQgeyBTVkdHcmFwaGljcyB9IGZyb20gXCIuL2Rpc3BsYXkvc3ZnLmpzXCI7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAqL1xuY29uc3QgcGRmanNWZXJzaW9uID1cbiAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiID8gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9WRVJTSU9OXCIpIDogdm9pZCAwO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzICovXG5jb25zdCBwZGZqc0J1aWxkID1cbiAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiID8gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9CVUlMRFwiKSA6IHZvaWQgMDtcblxuaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIlBST0RVQ1RJT05cIikpIHtcbiAgY29uc3Qgc3RyZWFtc1Byb21pc2UgPSBQcm9taXNlLmFsbChbXG4gICAgaW1wb3J0KFwicGRmanMvZGlzcGxheS9uZXR3b3JrLmpzXCIpLFxuICAgIGltcG9ydChcInBkZmpzL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzXCIpLFxuICBdKTtcbiAgc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkocGFyYW1zID0+IHtcbiAgICByZXR1cm4gc3RyZWFtc1Byb21pc2UudGhlbihzdHJlYW1zID0+IHtcbiAgICAgIGNvbnN0IFt7IFBERk5ldHdvcmtTdHJlYW0gfSwgeyBQREZGZXRjaFN0cmVhbSB9XSA9IHN0cmVhbXM7XG4gICAgICBpZiAoaXNGZXRjaFN1cHBvcnRlZCgpICYmIGlzVmFsaWRGZXRjaFVybChwYXJhbXMudXJsKSkge1xuICAgICAgICByZXR1cm4gbmV3IFBERkZldGNoU3RyZWFtKHBhcmFtcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFBERk5ldHdvcmtTdHJlYW0ocGFyYW1zKTtcbiAgICB9KTtcbiAgfSk7XG59IGVsc2UgaWYgKFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpKSB7XG4gIGNvbnN0IHsgaXNOb2RlSlMgfSA9IHJlcXVpcmUoXCIuL3NoYXJlZC9pc19ub2RlLmpzXCIpO1xuICBpZiAoaXNOb2RlSlMpIHtcbiAgICBjb25zdCBQREZOb2RlU3RyZWFtID0gcmVxdWlyZShcIi4vZGlzcGxheS9ub2RlX3N0cmVhbS5qc1wiKS5QREZOb2RlU3RyZWFtO1xuICAgIHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KHBhcmFtcyA9PiB7XG4gICAgICByZXR1cm4gbmV3IFBERk5vZGVTdHJlYW0ocGFyYW1zKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBQREZOZXR3b3JrU3RyZWFtID0gcmVxdWlyZShcIi4vZGlzcGxheS9uZXR3b3JrLmpzXCIpLlBERk5ldHdvcmtTdHJlYW07XG4gICAgbGV0IFBERkZldGNoU3RyZWFtO1xuICAgIGlmIChpc0ZldGNoU3VwcG9ydGVkKCkpIHtcbiAgICAgIFBERkZldGNoU3RyZWFtID0gcmVxdWlyZShcIi4vZGlzcGxheS9mZXRjaF9zdHJlYW0uanNcIikuUERGRmV0Y2hTdHJlYW07XG4gICAgfVxuICAgIHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KHBhcmFtcyA9PiB7XG4gICAgICBpZiAoUERGRmV0Y2hTdHJlYW0gJiYgaXNWYWxpZEZldGNoVXJsKHBhcmFtcy51cmwpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRmV0Y2hTdHJlYW0ocGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUERGTmV0d29ya1N0cmVhbShwYXJhbXMpO1xuICAgIH0pO1xuICB9XG59IGVsc2UgaWYgKFBERkpTRGV2LnRlc3QoXCJDSFJPTUVcIikpIHtcbiAgY29uc3QgUERGTmV0d29ya1N0cmVhbSA9IHJlcXVpcmUoXCIuL2Rpc3BsYXkvbmV0d29yay5qc1wiKS5QREZOZXR3b3JrU3RyZWFtO1xuICBsZXQgUERGRmV0Y2hTdHJlYW07XG4gIGNvbnN0IGlzQ2hyb21lV2l0aEZldGNoQ3JlZGVudGlhbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZmV0Y2ggZG9lcyBub3QgaW5jbHVkZSBjcmVkZW50aWFscyB1bnRpbCBDaHJvbWUgNjEuMC4zMTM4LjAgYW5kIGxhdGVyLlxuICAgIC8vIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy8yZTIzMWNmMDUyY2E1ZTY4ZTIyYmFmMDAwOGFjOWU1ZTI5MTIxNzA3XG4gICAgdHJ5IHtcbiAgICAgIC8vIEluZGV4ZWQgcHJvcGVydGllcyBvbiB3aW5kb3cgYXJlIHJlYWQtb25seSBpbiBDaHJvbWUgNjEuMC4zMTUxLjArXG4gICAgICAvLyBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLmdpdC8rLzU4YWI0YTk3MWIwNmRlYzEzZTRlZGY5ZGU4MzgyY2E2ODQ3ZjYxOTBcbiAgICAgIHdpbmRvd1s5OTldID0gMTIzOyAvLyBzaG91bGQgdGhyb3cuIE5vdGU6IEpTIHN0cmljdCBtb2RlIE1VU1QgYmUgZW5hYmxlZC5cbiAgICAgIGRlbGV0ZSB3aW5kb3dbOTk5XTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGlmIChpc0ZldGNoU3VwcG9ydGVkKCkgJiYgaXNDaHJvbWVXaXRoRmV0Y2hDcmVkZW50aWFscygpKSB7XG4gICAgUERGRmV0Y2hTdHJlYW0gPSByZXF1aXJlKFwiLi9kaXNwbGF5L2ZldGNoX3N0cmVhbS5qc1wiKS5QREZGZXRjaFN0cmVhbTtcbiAgfVxuICBzZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeShwYXJhbXMgPT4ge1xuICAgIGlmIChQREZGZXRjaFN0cmVhbSAmJiBpc1ZhbGlkRmV0Y2hVcmwocGFyYW1zLnVybCkpIHtcbiAgICAgIHJldHVybiBuZXcgUERGRmV0Y2hTdHJlYW0ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQREZOZXR3b3JrU3RyZWFtKHBhcmFtcyk7XG4gIH0pO1xufVxuXG5leHBvcnQge1xuICAvLyBGcm9tIFwiLi9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanNcIjpcbiAgYWRkTGlua0F0dHJpYnV0ZXMsXG4gIGdldEZpbGVuYW1lRnJvbVVybCxcbiAgTGlua1RhcmdldCxcbiAgbG9hZFNjcmlwdCxcbiAgUERGRGF0ZVN0cmluZyxcbiAgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLFxuICAvLyBGcm9tIFwiLi9kaXNwbGF5L2FwaS5qc1wiOlxuICBidWlsZCxcbiAgZ2V0RG9jdW1lbnQsXG4gIExvb3BiYWNrUG9ydCxcbiAgUERGRGF0YVJhbmdlVHJhbnNwb3J0LFxuICBQREZXb3JrZXIsXG4gIHZlcnNpb24sXG4gIC8vIEZyb20gXCIuL3NoYXJlZC91dGlsLmpzXCI6XG4gIENNYXBDb21wcmVzc2lvblR5cGUsXG4gIGNyZWF0ZU9iamVjdFVSTCxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG4gIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwsXG4gIEludmFsaWRQREZFeGNlcHRpb24sXG4gIE1pc3NpbmdQREZFeGNlcHRpb24sXG4gIE9QUyxcbiAgUGFzc3dvcmRSZXNwb25zZXMsXG4gIFBlcm1pc3Npb25GbGFnLFxuICByZW1vdmVOdWxsQ2hhcmFjdGVycyxcbiAgc2hhZG93LFxuICBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sXG4gIFVOU1VQUE9SVEVEX0ZFQVRVUkVTLFxuICBVdGlsLFxuICBWZXJib3NpdHlMZXZlbCxcbiAgLy8gRnJvbSBcIi4vZGlzcGxheS9hbm5vdGF0aW9uX2xheWVyLmpzXCI6XG4gIEFubm90YXRpb25MYXllcixcbiAgLy8gRnJvbSBcIi4vZGlzcGxheS9hcGlfY29tcGF0aWJpbGl0eS5qc1wiOlxuICBhcGlDb21wYXRpYmlsaXR5UGFyYW1zLFxuICAvLyBGcm9tIFwiLi9kaXNwbGF5L3dvcmtlcl9vcHRpb25zLmpzXCI6XG4gIEdsb2JhbFdvcmtlck9wdGlvbnMsXG4gIC8vIEZyb20gXCIuL2Rpc3BsYXkvdGV4dF9sYXllci5qc1wiOlxuICByZW5kZXJUZXh0TGF5ZXIsXG4gIC8vIEZyb20gXCIuL2Rpc3BsYXkvc3ZnLmpzXCI6XG4gIFNWR0dyYXBoaWNzLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE1IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBCYXNlRXhjZXB0aW9uLFxuICBDTWFwQ29tcHJlc3Npb25UeXBlLFxuICBpc1N0cmluZyxcbiAgcmVtb3ZlTnVsbENoYXJhY3RlcnMsXG4gIHN0cmluZ1RvQnl0ZXMsXG4gIHVucmVhY2hhYmxlLFxuICBVdGlsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuY29uc3QgREVGQVVMVF9MSU5LX1JFTCA9IFwibm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvd1wiO1xuY29uc3QgU1ZHX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuXG5jbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ2FudmFzRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ2FudmFzRmFjdG9yeS5cIik7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlYCBjYWxsZWQuXCIpO1xuICB9XG5cbiAgcmVzZXQoY2FudmFzQW5kQ29udGV4dCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkXCIpO1xuICAgIH1cbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjYW52YXMgc2l6ZVwiKTtcbiAgICB9XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBkZXN0cm95KGNhbnZhc0FuZENvbnRleHQpIHtcbiAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW52YXMgaXMgbm90IHNwZWNpZmllZFwiKTtcbiAgICB9XG4gICAgLy8gWmVyb2luZyB0aGUgd2lkdGggYW5kIGhlaWdodCBjYXVzZSBGaXJlZm94IHRvIHJlbGVhc2UgZ3JhcGhpY3NcbiAgICAvLyByZXNvdXJjZXMgaW1tZWRpYXRlbHksIHdoaWNoIGNhbiBncmVhdGx5IHJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24uXG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSAwO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMgPSBudWxsO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY29udGV4dCA9IG51bGw7XG4gIH1cbn1cblxuY2xhc3MgRE9NQ2FudmFzRmFjdG9yeSBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoeyBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudCB9ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcbiAgfVxuXG4gIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgfVxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzLFxuICAgICAgY29udGV4dCxcbiAgICB9O1xuICB9XG59XG5cbmNsYXNzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHsgYmFzZVVybCA9IG51bGwsIGlzQ29tcHJlc3NlZCA9IGZhbHNlIH0pIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5KSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS5cIik7XG4gICAgfVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgdGhpcy5pc0NvbXByZXNzZWQgPSBpc0NvbXByZXNzZWQ7XG4gIH1cblxuICBhc3luYyBmZXRjaCh7IG5hbWUgfSkge1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgQ01hcCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgK1xuICAgICAgICAgICd0aGUgXCJjTWFwVXJsXCIgYW5kIFwiY01hcFBhY2tlZFwiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNNYXAgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybCArIG5hbWUgKyAodGhpcy5pc0NvbXByZXNzZWQgPyBcIi5iY21hcFwiIDogXCJcIik7XG4gICAgY29uc3QgY29tcHJlc3Npb25UeXBlID0gdGhpcy5pc0NvbXByZXNzZWRcbiAgICAgID8gQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUllcbiAgICAgIDogQ01hcENvbXByZXNzaW9uVHlwZS5OT05FO1xuXG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byBsb2FkICR7dGhpcy5pc0NvbXByZXNzZWQgPyBcImJpbmFyeSBcIiA6IFwiXCJ9Q01hcCBhdDogJHt1cmx9YFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfZmV0Y2hEYXRhYCBjYWxsZWQuXCIpO1xuICB9XG59XG5cbmNsYXNzIERPTUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIGlmIChcbiAgICAgICh0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiYgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHx8XG4gICAgICAoaXNGZXRjaFN1cHBvcnRlZCgpICYmIGlzVmFsaWRGZXRjaFVybCh1cmwsIGRvY3VtZW50LmJhc2VVUkkpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZldGNoKHVybCkudGhlbihhc3luYyByZXNwb25zZSA9PiB7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNNYXBEYXRhO1xuICAgICAgICBpZiAodGhpcy5pc0NvbXByZXNzZWQpIHtcbiAgICAgICAgICBjTWFwRGF0YSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNNYXBEYXRhID0gc3RyaW5nVG9CeXRlcyhhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNNYXBEYXRhLCBjb21wcmVzc2lvblR5cGUgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSBGZXRjaCBBUEkgaXMgbm90IHN1cHBvcnRlZC5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgcmVxdWVzdC5vcGVuKFwiR0VUXCIsIHVybCwgdHJ1ZSk7XG5cbiAgICAgIGlmICh0aGlzLmlzQ29tcHJlc3NlZCkge1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwIHx8IHJlcXVlc3Quc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgbGV0IGNNYXBEYXRhO1xuICAgICAgICAgIGlmICh0aGlzLmlzQ29tcHJlc3NlZCAmJiByZXF1ZXN0LnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjTWFwRGF0YSA9IG5ldyBVaW50OEFycmF5KHJlcXVlc3QucmVzcG9uc2UpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNDb21wcmVzc2VkICYmIHJlcXVlc3QucmVzcG9uc2VUZXh0KSB7XG4gICAgICAgICAgICBjTWFwRGF0YSA9IHN0cmluZ1RvQnl0ZXMocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY01hcERhdGEpIHtcbiAgICAgICAgICAgIHJlc29sdmUoeyBjTWFwRGF0YSwgY29tcHJlc3Npb25UeXBlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZWplY3QobmV3IEVycm9yKHJlcXVlc3Quc3RhdHVzVGV4dCkpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5zZW5kKG51bGwpO1xuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIERPTVNWR0ZhY3Rvcnkge1xuICBjcmVhdGUod2lkdGgsIGhlaWdodCkge1xuICAgIGFzc2VydCh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCwgXCJJbnZhbGlkIFNWRyBkaW1lbnNpb25zXCIpO1xuXG4gICAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJzdmc6c3ZnXCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3aWR0aCArIFwicHhcIik7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoZWlnaHQgKyBcInB4XCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsIFwibm9uZVwiKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBcIjAgMCBcIiArIHdpZHRoICsgXCIgXCIgKyBoZWlnaHQpO1xuXG4gICAgcmV0dXJuIHN2ZztcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnQodHlwZSkge1xuICAgIGFzc2VydCh0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiwgXCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGVcIik7XG5cbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWdlVmlld3BvcnRQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge0FycmF5PG51bWJlcj59IHZpZXdCb3ggLSBUaGUgeE1pbiwgeU1pbiwgeE1heCBhbmRcbiAqICAgeU1heCBjb29yZGluYXRlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY2FsZSAtIFRoZSBzY2FsZSBvZiB0aGUgdmlld3BvcnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcm90YXRpb24gLSBUaGUgcm90YXRpb24sIGluIGRlZ3JlZXMsIG9mIHRoZSB2aWV3cG9ydC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0WF0gLSBUaGUgaG9yaXpvbnRhbCwgaS5lLiB4LWF4aXMsIG9mZnNldC4gVGhlXG4gKiAgIGRlZmF1bHQgdmFsdWUgaXMgYDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRZXSAtIFRoZSB2ZXJ0aWNhbCwgaS5lLiB5LWF4aXMsIG9mZnNldC4gVGhlXG4gKiAgIGRlZmF1bHQgdmFsdWUgaXMgYDBgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZG9udEZsaXBdIC0gSWYgdHJ1ZSwgdGhlIHktYXhpcyB3aWxsIG5vdCBiZSBmbGlwcGVkLlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGFnZVZpZXdwb3J0Q2xvbmVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3NjYWxlXSAtIFRoZSBzY2FsZSwgb3ZlcnJpZGluZyB0aGUgb25lIGluIHRoZSBjbG9uZWRcbiAqICAgdmlld3BvcnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0aGlzLnNjYWxlYC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcm90YXRpb25dIC0gVGhlIHJvdGF0aW9uLCBpbiBkZWdyZWVzLCBvdmVycmlkaW5nIHRoZSBvbmVcbiAqICAgaW4gdGhlIGNsb25lZCB2aWV3cG9ydC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRoaXMucm90YXRpb25gLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRYXSAtIFRoZSBob3Jpem9udGFsLCBpLmUuIHgtYXhpcywgb2Zmc2V0LlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdGhpcy5vZmZzZXRYYC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0WV0gLSBUaGUgdmVydGljYWwsIGkuZS4geS1heGlzLCBvZmZzZXQuXG4gKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0aGlzLm9mZnNldFlgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZG9udEZsaXBdIC0gSWYgdHJ1ZSwgdGhlIHgtYXhpcyB3aWxsIG5vdCBiZSBmbGlwcGVkLlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogUERGIHBhZ2Ugdmlld3BvcnQgY3JlYXRlZCBiYXNlZCBvbiBzY2FsZSwgcm90YXRpb24gYW5kIG9mZnNldC5cbiAqL1xuY2xhc3MgUGFnZVZpZXdwb3J0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFnZVZpZXdwb3J0UGFyYW1ldGVyc31cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICB2aWV3Qm94LFxuICAgIHNjYWxlLFxuICAgIHJvdGF0aW9uLFxuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGRvbnRGbGlwID0gZmFsc2UsXG4gIH0pIHtcbiAgICB0aGlzLnZpZXdCb3ggPSB2aWV3Qm94O1xuICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgdGhpcy5vZmZzZXRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLm9mZnNldFkgPSBvZmZzZXRZO1xuXG4gICAgLy8gY3JlYXRpbmcgdHJhbnNmb3JtIHRvIGNvbnZlcnQgcGRmIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBub3JtYWxcbiAgICAvLyBjYW52YXMgbGlrZSBjb29yZGluYXRlcyB0YWtpbmcgaW4gYWNjb3VudCBzY2FsZSBhbmQgcm90YXRpb25cbiAgICBjb25zdCBjZW50ZXJYID0gKHZpZXdCb3hbMl0gKyB2aWV3Qm94WzBdKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh2aWV3Qm94WzNdICsgdmlld0JveFsxXSkgLyAyO1xuICAgIGxldCByb3RhdGVBLCByb3RhdGVCLCByb3RhdGVDLCByb3RhdGVEO1xuICAgIHJvdGF0aW9uID0gcm90YXRpb24gJSAzNjA7XG4gICAgcm90YXRpb24gPSByb3RhdGlvbiA8IDAgPyByb3RhdGlvbiArIDM2MCA6IHJvdGF0aW9uO1xuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByb3RhdGVBID0gLTE7XG4gICAgICAgIHJvdGF0ZUIgPSAwO1xuICAgICAgICByb3RhdGVDID0gMDtcbiAgICAgICAgcm90YXRlRCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcm90YXRlQSA9IDA7XG4gICAgICAgIHJvdGF0ZUIgPSAxO1xuICAgICAgICByb3RhdGVDID0gMTtcbiAgICAgICAgcm90YXRlRCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJvdGF0ZUEgPSAwO1xuICAgICAgICByb3RhdGVCID0gLTE7XG4gICAgICAgIHJvdGF0ZUMgPSAtMTtcbiAgICAgICAgcm90YXRlRCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAwOlxuICAgICAgICByb3RhdGVBID0gMTtcbiAgICAgICAgcm90YXRlQiA9IDA7XG4gICAgICAgIHJvdGF0ZUMgPSAwO1xuICAgICAgICByb3RhdGVEID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiUGFnZVZpZXdwb3J0OiBJbnZhbGlkIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy5cIlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChkb250RmxpcCkge1xuICAgICAgcm90YXRlQyA9IC1yb3RhdGVDO1xuICAgICAgcm90YXRlRCA9IC1yb3RhdGVEO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZO1xuICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xuICAgIGlmIChyb3RhdGVBID09PSAwKSB7XG4gICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWSAtIHZpZXdCb3hbMV0pICogc2NhbGUgKyBvZmZzZXRYO1xuICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WTtcbiAgICAgIHdpZHRoID0gTWF0aC5hYnModmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG4gICAgICBoZWlnaHQgPSBNYXRoLmFicyh2aWV3Qm94WzJdIC0gdmlld0JveFswXSkgKiBzY2FsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0Q2FudmFzWCA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WDtcbiAgICAgIG9mZnNldENhbnZhc1kgPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFk7XG4gICAgICB3aWR0aCA9IE1hdGguYWJzKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5hYnModmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG4gICAgfVxuICAgIC8vIGNyZWF0aW5nIHRyYW5zZm9ybSBmb3IgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOlxuICAgIC8vIHRyYW5zbGF0ZSgtY2VudGVyWCwgLWNlbnRlclkpLCByb3RhdGUgYW5kIGZsaXAgdmVydGljYWxseSxcbiAgICAvLyBzY2FsZSwgYW5kIHRyYW5zbGF0ZShvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZKVxuICAgIHRoaXMudHJhbnNmb3JtID0gW1xuICAgICAgcm90YXRlQSAqIHNjYWxlLFxuICAgICAgcm90YXRlQiAqIHNjYWxlLFxuICAgICAgcm90YXRlQyAqIHNjYWxlLFxuICAgICAgcm90YXRlRCAqIHNjYWxlLFxuICAgICAgb2Zmc2V0Q2FudmFzWCAtIHJvdGF0ZUEgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVDICogc2NhbGUgKiBjZW50ZXJZLFxuICAgICAgb2Zmc2V0Q2FudmFzWSAtIHJvdGF0ZUIgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVEICogc2NhbGUgKiBjZW50ZXJZLFxuICAgIF07XG5cbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2xvbmVzIHZpZXdwb3J0LCB3aXRoIG9wdGlvbmFsIGFkZGl0aW9uYWwgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHtQYWdlVmlld3BvcnRDbG9uZVBhcmFtZXRlcnN9IFtwYXJhbXNdXG4gICAqIEByZXR1cm5zIHtQYWdlVmlld3BvcnR9IENsb25lZCB2aWV3cG9ydC5cbiAgICovXG4gIGNsb25lKHtcbiAgICBzY2FsZSA9IHRoaXMuc2NhbGUsXG4gICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uLFxuICAgIG9mZnNldFggPSB0aGlzLm9mZnNldFgsXG4gICAgb2Zmc2V0WSA9IHRoaXMub2Zmc2V0WSxcbiAgICBkb250RmxpcCA9IGZhbHNlLFxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSxcbiAgICAgIHNjYWxlLFxuICAgICAgcm90YXRpb24sXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGRvbnRGbGlwLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIFBERiBwb2ludCB0byB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuIEZvciBleGFtcGxlcywgdXNlZnVsIGZvclxuICAgKiBjb252ZXJ0aW5nIFBERiBsb2NhdGlvbiBpbnRvIGNhbnZhcyBwaXhlbCBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBjb250YWluaW5nIGB4YCBhbmQgYHlgIHByb3BlcnRpZXMgb2YgdGhlXG4gICAqICAgcG9pbnQgaW4gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3BhY2UuXG4gICAqIEBzZWUge0BsaW5rIGNvbnZlcnRUb1BkZlBvaW50fVxuICAgKiBAc2VlIHtAbGluayBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZX1cbiAgICovXG4gIGNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCwgeSkge1xuICAgIHJldHVybiBVdGlsLmFwcGx5VHJhbnNmb3JtKFt4LCB5XSwgdGhpcy50cmFuc2Zvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIFBERiByZWN0YW5nbGUgdG8gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0ge0FycmF5fSByZWN0IC0gVGhlIHhNaW4sIHlNaW4sIHhNYXggYW5kIHlNYXggY29vcmRpbmF0ZXMuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgY29udGFpbmluZyBjb3JyZXNwb25kaW5nIGNvb3JkaW5hdGVzIG9mIHRoZVxuICAgKiAgIHJlY3RhbmdsZSBpbiB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZSBzcGFjZS5cbiAgICogQHNlZSB7QGxpbmsgY29udmVydFRvVmlld3BvcnRQb2ludH1cbiAgICovXG4gIGNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlKHJlY3QpIHtcbiAgICBjb25zdCB0b3BMZWZ0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFswXSwgcmVjdFsxXV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICBjb25zdCBib3R0b21SaWdodCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMl0sIHJlY3RbM11dLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgcmV0dXJuIFt0b3BMZWZ0WzBdLCB0b3BMZWZ0WzFdLCBib3R0b21SaWdodFswXSwgYm90dG9tUmlnaHRbMV1dO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHZpZXdwb3J0IGNvb3JkaW5hdGVzIHRvIHRoZSBQREYgbG9jYXRpb24uIEZvciBleGFtcGxlcywgdXNlZnVsXG4gICAqIGZvciBjb252ZXJ0aW5nIGNhbnZhcyBwaXhlbCBsb2NhdGlvbiBpbnRvIFBERiBvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIG9mIHRoZVxuICAgKiAgIHBvaW50IGluIHRoZSBQREYgY29vcmRpbmF0ZSBzcGFjZS5cbiAgICogQHNlZSB7QGxpbmsgY29udmVydFRvVmlld3BvcnRQb2ludH1cbiAgICovXG4gIGNvbnZlcnRUb1BkZlBvaW50KHgsIHkpIHtcbiAgICByZXR1cm4gVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7XG4gIH1cbn1cblxuY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgdHlwZSkge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxufVxuXG5jb25zdCBMaW5rVGFyZ2V0ID0ge1xuICBOT05FOiAwLCAvLyBEZWZhdWx0IHZhbHVlLlxuICBTRUxGOiAxLFxuICBCTEFOSzogMixcbiAgUEFSRU5UOiAzLFxuICBUT1A6IDQsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4dGVybmFsTGlua1BhcmFtZXRlcnNcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVybmFsTGlua1BhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgLSBBbiBhYnNvbHV0ZSBVUkwuXG4gKiBAcHJvcGVydHkge0xpbmtUYXJnZXR9IFt0YXJnZXRdIC0gVGhlIGxpbmsgdGFyZ2V0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpc1xuICogICBgTGlua1RhcmdldC5OT05FYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVsXSAtIFRoZSBsaW5rIHJlbGF0aW9uc2hpcC4gVGhlIGRlZmF1bHQgdmFsdWUgaXNcbiAqICAgYERFRkFVTFRfTElOS19SRUxgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBlbmFibGVkLiBUaGVcbiAqICAgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICovXG5cbi8qKlxuICogQWRkcyB2YXJpb3VzIGF0dHJpYnV0ZXMgKGhyZWYsIHRpdGxlLCB0YXJnZXQsIHJlbCkgdG8gaHlwZXJsaW5rcy5cbiAqIEBwYXJhbSB7SFRNTExpbmtFbGVtZW50fSBsaW5rIC0gVGhlIGxpbmsgZWxlbWVudC5cbiAqIEBwYXJhbSB7RXh0ZXJuYWxMaW5rUGFyYW1ldGVyc30gcGFyYW1zXG4gKi9cbmZ1bmN0aW9uIGFkZExpbmtBdHRyaWJ1dGVzKGxpbmssIHsgdXJsLCB0YXJnZXQsIHJlbCwgZW5hYmxlZCA9IHRydWUgfSA9IHt9KSB7XG4gIGFzc2VydChcbiAgICB1cmwgJiYgdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIixcbiAgICAnYWRkTGlua0F0dHJpYnV0ZXM6IEEgdmFsaWQgXCJ1cmxcIiBwYXJhbWV0ZXIgbXVzdCBwcm92aWRlZC4nXG4gICk7XG5cbiAgY29uc3QgdXJsTnVsbFJlbW92ZWQgPSByZW1vdmVOdWxsQ2hhcmFjdGVycyh1cmwpO1xuICBpZiAoZW5hYmxlZCkge1xuICAgIGxpbmsuaHJlZiA9IGxpbmsudGl0bGUgPSB1cmxOdWxsUmVtb3ZlZDtcbiAgfSBlbHNlIHtcbiAgICBsaW5rLmhyZWYgPSBcIlwiO1xuICAgIGxpbmsudGl0bGUgPSBgRGlzYWJsZWQ6ICR7dXJsTnVsbFJlbW92ZWR9YDtcbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIGxldCB0YXJnZXRTdHIgPSBcIlwiOyAvLyBMaW5rVGFyZ2V0Lk5PTkVcbiAgc3dpdGNoICh0YXJnZXQpIHtcbiAgICBjYXNlIExpbmtUYXJnZXQuTk9ORTpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTGlua1RhcmdldC5TRUxGOlxuICAgICAgdGFyZ2V0U3RyID0gXCJfc2VsZlwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMaW5rVGFyZ2V0LkJMQU5LOlxuICAgICAgdGFyZ2V0U3RyID0gXCJfYmxhbmtcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTGlua1RhcmdldC5QQVJFTlQ6XG4gICAgICB0YXJnZXRTdHIgPSBcIl9wYXJlbnRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTGlua1RhcmdldC5UT1A6XG4gICAgICB0YXJnZXRTdHIgPSBcIl90b3BcIjtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGxpbmsudGFyZ2V0ID0gdGFyZ2V0U3RyO1xuXG4gIGxpbmsucmVsID0gdHlwZW9mIHJlbCA9PT0gXCJzdHJpbmdcIiA/IHJlbCA6IERFRkFVTFRfTElOS19SRUw7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsZSBuYW1lIGZyb20gYSBnaXZlbiBVUkwuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbVVybCh1cmwpIHtcbiAgY29uc3QgYW5jaG9yID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuICBjb25zdCBxdWVyeSA9IHVybC5pbmRleE9mKFwiP1wiKTtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4oXG4gICAgYW5jaG9yID4gMCA/IGFuY2hvciA6IHVybC5sZW5ndGgsXG4gICAgcXVlcnkgPiAwID8gcXVlcnkgOiB1cmwubGVuZ3RoXG4gICk7XG4gIHJldHVybiB1cmwuc3Vic3RyaW5nKHVybC5sYXN0SW5kZXhPZihcIi9cIiwgZW5kKSArIDEsIGVuZCk7XG59XG5cbmNsYXNzIFN0YXRUaW1lciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhcnRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy50aW1lcyA9IFtdO1xuICB9XG5cbiAgdGltZShuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5zdGFydGVkKSB7XG4gICAgICB3YXJuKGBUaW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydGVkW25hbWVdID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHRpbWVFbmQobmFtZSkge1xuICAgIGlmICghKG5hbWUgaW4gdGhpcy5zdGFydGVkKSkge1xuICAgICAgd2FybihgVGltZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy50aW1lcy5wdXNoKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydDogdGhpcy5zdGFydGVkW25hbWVdLFxuICAgICAgZW5kOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICAgIC8vIFJlbW92ZSB0aW1lciBmcm9tIHN0YXJ0ZWQgc28gaXQgY2FuIGJlIGNhbGxlZCBhZ2Fpbi5cbiAgICBkZWxldGUgdGhpcy5zdGFydGVkW25hbWVdO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgLy8gRmluZCB0aGUgbG9uZ2VzdCBuYW1lIGZvciBwYWRkaW5nIHB1cnBvc2VzLlxuICAgIGNvbnN0IG91dEJ1ZiA9IFtdO1xuICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICBmb3IgKGNvbnN0IHRpbWUgb2YgdGhpcy50aW1lcykge1xuICAgICAgY29uc3QgbmFtZSA9IHRpbWUubmFtZTtcbiAgICAgIGlmIChuYW1lLmxlbmd0aCA+IGxvbmdlc3QpIHtcbiAgICAgICAgbG9uZ2VzdCA9IG5hbWUubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRpbWUgb2YgdGhpcy50aW1lcykge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSB0aW1lLmVuZCAtIHRpbWUuc3RhcnQ7XG4gICAgICBvdXRCdWYucHVzaChgJHt0aW1lLm5hbWUucGFkRW5kKGxvbmdlc3QpfSAke2R1cmF0aW9ufW1zXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWYuam9pbihcIlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0ZldGNoU3VwcG9ydGVkKCkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBmZXRjaCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBSZXNwb25zZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIFwiYm9keVwiIGluIFJlc3BvbnNlLnByb3RvdHlwZSAmJlxuICAgIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPT0gXCJ1bmRlZmluZWRcIlxuICApO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodXJsLCBiYXNlVXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBwcm90b2NvbCB9ID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICAvLyBUaGUgRmV0Y2ggQVBJIG9ubHkgc3VwcG9ydHMgdGhlIGh0dHAvaHR0cHMgcHJvdG9jb2xzLCBhbmQgbm90IGZpbGUvZnRwLlxuICAgIHJldHVybiBwcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHByb3RvY29sID09PSBcImh0dHBzOlwiO1xuICB9IGNhdGNoIChleCkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gYG5ldyBVUkwoKWAgd2lsbCB0aHJvdyBvbiBpbmNvcnJlY3QgZGF0YS5cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5mdW5jdGlvbiBsb2FkU2NyaXB0KHNyYykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0LnNyYyA9IHNyYztcblxuICAgIHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xuICAgIHNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGxvYWQgc2NyaXB0IGF0OiAke3NjcmlwdC5zcmN9YCkpO1xuICAgIH07XG4gICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9KTtcbn1cblxuLy8gRGVwcmVjYXRlZCBBUEkgZnVuY3Rpb24gLS0gZGlzcGxheSByZWdhcmRsZXNzIG9mIHRoZSBgdmVyYm9zaXR5YCBzZXR0aW5nLlxuZnVuY3Rpb24gZGVwcmVjYXRlZChkZXRhaWxzKSB7XG4gIGNvbnNvbGUubG9nKFwiRGVwcmVjYXRlZCBBUEkgdXNhZ2U6IFwiICsgZGV0YWlscyk7XG59XG5cbmxldCBwZGZEYXRlU3RyaW5nUmVnZXg7XG5cbmNsYXNzIFBERkRhdGVTdHJpbmcge1xuICAvKipcbiAgICogQ29udmVydCBhIFBERiBkYXRlIHN0cmluZyB0byBhIEphdmFTY3JpcHQgYERhdGVgIG9iamVjdC5cbiAgICpcbiAgICogVGhlIFBERiBkYXRlIHN0cmluZyBmb3JtYXQgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNy45LjQgb2YgdGhlIG9mZmljaWFsXG4gICAqIFBERiAzMjAwMC0xOjIwMDggc3BlY2lmaWNhdGlvbi4gSG93ZXZlciwgaW4gdGhlIFBERiAxLjcgcmVmZXJlbmNlIChzaXh0aFxuICAgKiBlZGl0aW9uKSBBZG9iZSBkZXNjcmliZXMgdGhlIHNhbWUgZm9ybWF0IGluY2x1ZGluZyBhIHRyYWlsaW5nIGFwb3N0cm9waGUuXG4gICAqIFRoaXMgc3ludGF4IGluIGluY29ycmVjdCwgYnV0IEFkb2JlIEFjcm9iYXQgY3JlYXRlcyBQREYgZmlsZXMgdGhhdCBjb250YWluXG4gICAqIHRoZW0uIFdlIGlnbm9yZSBhbGwgYXBvc3Ryb3BoZXMgYXMgdGhleSBhcmUgbm90IG5lY2Vzc2FyeSBmb3IgZGF0ZSBwYXJzaW5nLlxuICAgKlxuICAgKiBNb3Jlb3ZlciwgQWRvYmUgQWNyb2JhdCBkb2Vzbid0IGhhbmRsZSBjaGFuZ2luZyB0aGUgZGF0ZSB0byB1bml2ZXJzYWwgdGltZVxuICAgKiBhbmQgZG9lc24ndCB1c2UgdGhlIHVzZXIncyB0aW1lIHpvbmUgKGVmZmVjdGl2ZWx5IGlnbm9yaW5nIHRoZSBISCcgYW5kIG1tJ1xuICAgKiBwYXJ0cyBvZiB0aGUgZGF0ZSBzdHJpbmcpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcbiAgICogQHJldHVybnMge0RhdGV8bnVsbH1cbiAgICovXG4gIHN0YXRpYyB0b0RhdGVPYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0IHx8ICFpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIExhemlseSBpbml0aWFsaXplIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgaWYgKCFwZGZEYXRlU3RyaW5nUmVnZXgpIHtcbiAgICAgIHBkZkRhdGVTdHJpbmdSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIFwiXkQ6XCIgKyAvLyBQcmVmaXggKHJlcXVpcmVkKVxuICAgICAgICBcIihcXFxcZHs0fSlcIiArIC8vIFllYXIgKHJlcXVpcmVkKVxuICAgICAgICBcIihcXFxcZHsyfSk/XCIgKyAvLyBNb250aCAob3B0aW9uYWwpXG4gICAgICAgIFwiKFxcXFxkezJ9KT9cIiArIC8vIERheSAob3B0aW9uYWwpXG4gICAgICAgIFwiKFxcXFxkezJ9KT9cIiArIC8vIEhvdXIgKG9wdGlvbmFsKVxuICAgICAgICBcIihcXFxcZHsyfSk/XCIgKyAvLyBNaW51dGUgKG9wdGlvbmFsKVxuICAgICAgICBcIihcXFxcZHsyfSk/XCIgKyAvLyBTZWNvbmQgKG9wdGlvbmFsKVxuICAgICAgICBcIihbWnwrfC1dKT9cIiArIC8vIFVuaXZlcnNhbCB0aW1lIHJlbGF0aW9uIChvcHRpb25hbClcbiAgICAgICAgXCIoXFxcXGR7Mn0pP1wiICsgLy8gT2Zmc2V0IGhvdXIgKG9wdGlvbmFsKVxuICAgICAgICBcIic/XCIgKyAvLyBTcGxpdHRpbmcgYXBvc3Ryb3BoZSAob3B0aW9uYWwpXG4gICAgICAgIFwiKFxcXFxkezJ9KT9cIiArIC8vIE9mZnNldCBtaW51dGUgKG9wdGlvbmFsKVxuICAgICAgICAgIFwiJz9cIiAvLyBUcmFpbGluZyBhcG9zdHJvcGhlIChvcHRpb25hbClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uYWwgZmllbGRzIHRoYXQgZG9uJ3Qgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIGZyb20gdGhlIHJlZ3VsYXJcbiAgICAvLyBleHByZXNzaW9uIChzdWNoIGFzIGluY29ycmVjdCBkaWdpdCBjb3VudHMgb3IgbnVtYmVycyB0aGF0IGFyZSBvdXQgb2ZcbiAgICAvLyByYW5nZSkgd2lsbCBmYWxsIGJhY2sgdGhlIGRlZmF1bHRzIGZyb20gdGhlIHNwZWNpZmljYXRpb24uXG4gICAgY29uc3QgbWF0Y2hlcyA9IHBkZkRhdGVTdHJpbmdSZWdleC5leGVjKGlucHV0KTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEphdmFTY3JpcHQncyBgRGF0ZWAgb2JqZWN0IGV4cGVjdHMgdGhlIG1vbnRoIHRvIGJlIGJldHdlZW4gMCBhbmQgMTFcbiAgICAvLyBpbnN0ZWFkIG9mIDEgYW5kIDEyLCBzbyB3ZSBoYXZlIHRvIGNvcnJlY3QgZm9yIHRoYXQuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKTtcbiAgICBsZXQgbW9udGggPSBwYXJzZUludChtYXRjaGVzWzJdLCAxMCk7XG4gICAgbW9udGggPSBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyID8gbW9udGggLSAxIDogMDtcbiAgICBsZXQgZGF5ID0gcGFyc2VJbnQobWF0Y2hlc1szXSwgMTApO1xuICAgIGRheSA9IGRheSA+PSAxICYmIGRheSA8PSAzMSA/IGRheSA6IDE7XG4gICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaGVzWzRdLCAxMCk7XG4gICAgaG91ciA9IGhvdXIgPj0gMCAmJiBob3VyIDw9IDIzID8gaG91ciA6IDA7XG4gICAgbGV0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICBtaW51dGUgPSBtaW51dGUgPj0gMCAmJiBtaW51dGUgPD0gNTkgPyBtaW51dGUgOiAwO1xuICAgIGxldCBzZWNvbmQgPSBwYXJzZUludChtYXRjaGVzWzZdLCAxMCk7XG4gICAgc2Vjb25kID0gc2Vjb25kID49IDAgJiYgc2Vjb25kIDw9IDU5ID8gc2Vjb25kIDogMDtcbiAgICBjb25zdCB1bml2ZXJzYWxUaW1lUmVsYXRpb24gPSBtYXRjaGVzWzddIHx8IFwiWlwiO1xuICAgIGxldCBvZmZzZXRIb3VyID0gcGFyc2VJbnQobWF0Y2hlc1s4XSwgMTApO1xuICAgIG9mZnNldEhvdXIgPSBvZmZzZXRIb3VyID49IDAgJiYgb2Zmc2V0SG91ciA8PSAyMyA/IG9mZnNldEhvdXIgOiAwO1xuICAgIGxldCBvZmZzZXRNaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzldLCAxMCkgfHwgMDtcbiAgICBvZmZzZXRNaW51dGUgPSBvZmZzZXRNaW51dGUgPj0gMCAmJiBvZmZzZXRNaW51dGUgPD0gNTkgPyBvZmZzZXRNaW51dGUgOiAwO1xuXG4gICAgLy8gVW5pdmVyc2FsIHRpbWUgcmVsYXRpb24gJ1onIG1lYW5zIHRoYXQgdGhlIGxvY2FsIHRpbWUgaXMgZXF1YWwgdG8gdGhlXG4gICAgLy8gdW5pdmVyc2FsIHRpbWUsIHdoZXJlYXMgdGhlIHJlbGF0aW9ucyAnKycvJy0nIGluZGljYXRlIHRoYXQgdGhlIGxvY2FsXG4gICAgLy8gdGltZSBpcyBsYXRlciByZXNwZWN0aXZlbHkgZWFybGllciB0aGFuIHRoZSB1bml2ZXJzYWwgdGltZS4gRXZlcnkgZGF0ZVxuICAgIC8vIGlzIG5vcm1hbGl6ZWQgdG8gdW5pdmVyc2FsIHRpbWUuXG4gICAgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gXCItXCIpIHtcbiAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7XG4gICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09IFwiK1wiKSB7XG4gICAgICBob3VyIC09IG9mZnNldEhvdXI7XG4gICAgICBtaW51dGUgLT0gb2Zmc2V0TWludXRlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhZ2VWaWV3cG9ydCxcbiAgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLFxuICBhZGRMaW5rQXR0cmlidXRlcyxcbiAgZ2V0RmlsZW5hbWVGcm9tVXJsLFxuICBMaW5rVGFyZ2V0LFxuICBERUZBVUxUX0xJTktfUkVMLFxuICBCYXNlQ2FudmFzRmFjdG9yeSxcbiAgRE9NQ2FudmFzRmFjdG9yeSxcbiAgQmFzZUNNYXBSZWFkZXJGYWN0b3J5LFxuICBET01DTWFwUmVhZGVyRmFjdG9yeSxcbiAgRE9NU1ZHRmFjdG9yeSxcbiAgU3RhdFRpbWVyLFxuICBpc0ZldGNoU3VwcG9ydGVkLFxuICBpc1ZhbGlkRmV0Y2hVcmwsXG4gIGxvYWRTY3JpcHQsXG4gIGRlcHJlY2F0ZWQsXG4gIFBERkRhdGVTdHJpbmcsXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgXCIuL2NvbXBhdGliaWxpdHkuanNcIjtcblxuY29uc3QgSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdO1xuY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTtcblxuLy8gUGVybWlzc2lvbiBmbGFncyBmcm9tIFRhYmxlIDIyLCBTZWN0aW9uIDcuNi4zLjIgb2YgdGhlIFBERiBzcGVjaWZpY2F0aW9uLlxuY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7XG4gIFBSSU5UOiAweDA0LFxuICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsXG4gIENPUFk6IDB4MTAsXG4gIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCxcbiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsXG4gIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLFxuICBBU1NFTUJMRTogMHg0MDAsXG4gIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAsXG59O1xuXG5jb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHtcbiAgRklMTDogMCxcbiAgU1RST0tFOiAxLFxuICBGSUxMX1NUUk9LRTogMixcbiAgSU5WSVNJQkxFOiAzLFxuICBGSUxMX0FERF9UT19QQVRIOiA0LFxuICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsXG4gIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LFxuICBBRERfVE9fUEFUSDogNyxcbiAgRklMTF9TVFJPS0VfTUFTSzogMyxcbiAgQUREX1RPX1BBVEhfRkxBRzogNCxcbn07XG5cbmNvbnN0IEltYWdlS2luZCA9IHtcbiAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gIFJHQl8yNEJQUDogMixcbiAgUkdCQV8zMkJQUDogMyxcbn07XG5cbmNvbnN0IEFubm90YXRpb25UeXBlID0ge1xuICBURVhUOiAxLFxuICBMSU5LOiAyLFxuICBGUkVFVEVYVDogMyxcbiAgTElORTogNCxcbiAgU1FVQVJFOiA1LFxuICBDSVJDTEU6IDYsXG4gIFBPTFlHT046IDcsXG4gIFBPTFlMSU5FOiA4LFxuICBISUdITElHSFQ6IDksXG4gIFVOREVSTElORTogMTAsXG4gIFNRVUlHR0xZOiAxMSxcbiAgU1RSSUtFT1VUOiAxMixcbiAgU1RBTVA6IDEzLFxuICBDQVJFVDogMTQsXG4gIElOSzogMTUsXG4gIFBPUFVQOiAxNixcbiAgRklMRUFUVEFDSE1FTlQ6IDE3LFxuICBTT1VORDogMTgsXG4gIE1PVklFOiAxOSxcbiAgV0lER0VUOiAyMCxcbiAgU0NSRUVOOiAyMSxcbiAgUFJJTlRFUk1BUks6IDIyLFxuICBUUkFQTkVUOiAyMyxcbiAgV0FURVJNQVJLOiAyNCxcbiAgVEhSRUVEOiAyNSxcbiAgUkVEQUNUOiAyNixcbn07XG5cbmNvbnN0IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHtcbiAgTUFSS0VEOiBcIk1hcmtlZFwiLFxuICBSRVZJRVc6IFwiUmV2aWV3XCIsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uTWFya2VkU3RhdGUgPSB7XG4gIE1BUktFRDogXCJNYXJrZWRcIixcbiAgVU5NQVJLRUQ6IFwiVW5tYXJrZWRcIixcbn07XG5cbmNvbnN0IEFubm90YXRpb25SZXZpZXdTdGF0ZSA9IHtcbiAgQUNDRVBURUQ6IFwiQWNjZXB0ZWRcIixcbiAgUkVKRUNURUQ6IFwiUmVqZWN0ZWRcIixcbiAgQ0FOQ0VMTEVEOiBcIkNhbmNlbGxlZFwiLFxuICBDT01QTEVURUQ6IFwiQ29tcGxldGVkXCIsXG4gIE5PTkU6IFwiTm9uZVwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHtcbiAgR1JPVVA6IFwiR3JvdXBcIixcbiAgUkVQTFk6IFwiUlwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7XG4gIElOVklTSUJMRTogMHgwMSxcbiAgSElEREVOOiAweDAyLFxuICBQUklOVDogMHgwNCxcbiAgTk9aT09NOiAweDA4LFxuICBOT1JPVEFURTogMHgxMCxcbiAgTk9WSUVXOiAweDIwLFxuICBSRUFET05MWTogMHg0MCxcbiAgTE9DS0VEOiAweDgwLFxuICBUT0dHTEVOT1ZJRVc6IDB4MTAwLFxuICBMT0NLRURDT05URU5UUzogMHgyMDAsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0ge1xuICBSRUFET05MWTogMHgwMDAwMDAxLFxuICBSRVFVSVJFRDogMHgwMDAwMDAyLFxuICBOT0VYUE9SVDogMHgwMDAwMDA0LFxuICBNVUxUSUxJTkU6IDB4MDAwMTAwMCxcbiAgUEFTU1dPUkQ6IDB4MDAwMjAwMCxcbiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLFxuICBSQURJTzogMHgwMDA4MDAwLFxuICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsXG4gIENPTUJPOiAweDAwMjAwMDAsXG4gIEVESVQ6IDB4MDA0MDAwMCxcbiAgU09SVDogMHgwMDgwMDAwLFxuICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsXG4gIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsXG4gIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLFxuICBET05PVFNDUk9MTDogMHgwODAwMDAwLFxuICBDT01COiAweDEwMDAwMDAsXG4gIFJJQ0hURVhUOiAweDIwMDAwMDAsXG4gIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsXG4gIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDAsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0ge1xuICBTT0xJRDogMSxcbiAgREFTSEVEOiAyLFxuICBCRVZFTEVEOiAzLFxuICBJTlNFVDogNCxcbiAgVU5ERVJMSU5FOiA1LFxufTtcblxuY29uc3QgU3RyZWFtVHlwZSA9IHtcbiAgVU5LTk9XTjogXCJVTktOT1dOXCIsXG4gIEZMQVRFOiBcIkZMQVRFXCIsXG4gIExaVzogXCJMWldcIixcbiAgRENUOiBcIkRDVFwiLFxuICBKUFg6IFwiSlBYXCIsXG4gIEpCSUc6IFwiSkJJR1wiLFxuICBBODU6IFwiQTg1XCIsXG4gIEFIWDogXCJBSFhcIixcbiAgQ0NGOiBcIkNDRlwiLFxuICBSTFg6IFwiUkxYXCIsIC8vIFBERiBzaG9ydCBuYW1lIGlzICdSTCcsIGJ1dCB0ZWxlbWV0cnkgcmVxdWlyZXMgdGhyZWUgY2hhcnMuXG59O1xuXG5jb25zdCBGb250VHlwZSA9IHtcbiAgVU5LTk9XTjogXCJVTktOT1dOXCIsXG4gIFRZUEUxOiBcIlRZUEUxXCIsXG4gIFRZUEUxQzogXCJUWVBFMUNcIixcbiAgQ0lERk9OVFRZUEUwOiBcIkNJREZPTlRUWVBFMFwiLFxuICBDSURGT05UVFlQRTBDOiBcIkNJREZPTlRUWVBFMENcIixcbiAgVFJVRVRZUEU6IFwiVFJVRVRZUEVcIixcbiAgQ0lERk9OVFRZUEUyOiBcIkNJREZPTlRUWVBFMlwiLFxuICBUWVBFMzogXCJUWVBFM1wiLFxuICBPUEVOVFlQRTogXCJPUEVOVFlQRVwiLFxuICBUWVBFMDogXCJUWVBFMFwiLFxuICBNTVRZUEUxOiBcIk1NVFlQRTFcIixcbn07XG5cbmNvbnN0IFZlcmJvc2l0eUxldmVsID0ge1xuICBFUlJPUlM6IDAsXG4gIFdBUk5JTkdTOiAxLFxuICBJTkZPUzogNSxcbn07XG5cbmNvbnN0IENNYXBDb21wcmVzc2lvblR5cGUgPSB7XG4gIE5PTkU6IDAsXG4gIEJJTkFSWTogMSxcbiAgU1RSRUFNOiAyLFxufTtcblxuLy8gQWxsIHRoZSBwb3NzaWJsZSBvcGVyYXRpb25zIGZvciBhbiBvcGVyYXRvciBsaXN0LlxuY29uc3QgT1BTID0ge1xuICAvLyBJbnRlbnRpb25hbGx5IHN0YXJ0IGZyb20gMSBzbyBpdCBpcyBlYXN5IHRvIHNwb3QgYmFkIG9wZXJhdG9ycyB0aGF0IHdpbGwgYmVcbiAgLy8gMCdzLlxuICBkZXBlbmRlbmN5OiAxLFxuICBzZXRMaW5lV2lkdGg6IDIsXG4gIHNldExpbmVDYXA6IDMsXG4gIHNldExpbmVKb2luOiA0LFxuICBzZXRNaXRlckxpbWl0OiA1LFxuICBzZXREYXNoOiA2LFxuICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gIHNldEZsYXRuZXNzOiA4LFxuICBzZXRHU3RhdGU6IDksXG4gIHNhdmU6IDEwLFxuICByZXN0b3JlOiAxMSxcbiAgdHJhbnNmb3JtOiAxMixcbiAgbW92ZVRvOiAxMyxcbiAgbGluZVRvOiAxNCxcbiAgY3VydmVUbzogMTUsXG4gIGN1cnZlVG8yOiAxNixcbiAgY3VydmVUbzM6IDE3LFxuICBjbG9zZVBhdGg6IDE4LFxuICByZWN0YW5nbGU6IDE5LFxuICBzdHJva2U6IDIwLFxuICBjbG9zZVN0cm9rZTogMjEsXG4gIGZpbGw6IDIyLFxuICBlb0ZpbGw6IDIzLFxuICBmaWxsU3Ryb2tlOiAyNCxcbiAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICBlbmRQYXRoOiAyOCxcbiAgY2xpcDogMjksXG4gIGVvQ2xpcDogMzAsXG4gIGJlZ2luVGV4dDogMzEsXG4gIGVuZFRleHQ6IDMyLFxuICBzZXRDaGFyU3BhY2luZzogMzMsXG4gIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgc2V0SFNjYWxlOiAzNSxcbiAgc2V0TGVhZGluZzogMzYsXG4gIHNldEZvbnQ6IDM3LFxuICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gIHNldFRleHRSaXNlOiAzOSxcbiAgbW92ZVRleHQ6IDQwLFxuICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICBzZXRUZXh0TWF0cml4OiA0MixcbiAgbmV4dExpbmU6IDQzLFxuICBzaG93VGV4dDogNDQsXG4gIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICBzZXRTdHJva2VDb2xvck46IDUzLFxuICBzZXRGaWxsQ29sb3I6IDU0LFxuICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgc2V0U3Ryb2tlR3JheTogNTYsXG4gIHNldEZpbGxHcmF5OiA1NyxcbiAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgc2hhZGluZ0ZpbGw6IDYyLFxuICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gIHBhaW50WE9iamVjdDogNjYsXG4gIG1hcmtQb2ludDogNjcsXG4gIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgYmVnaW5Db21wYXQ6IDcyLFxuICBlbmRDb21wYXQ6IDczLFxuICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgYmVnaW5Hcm91cDogNzYsXG4gIGVuZEdyb3VwOiA3NyxcbiAgYmVnaW5Bbm5vdGF0aW9uczogNzgsXG4gIGVuZEFubm90YXRpb25zOiA3OSxcbiAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgZW5kQW5ub3RhdGlvbjogODEsXG4gIHBhaW50SnBlZ1hPYmplY3Q6IDgyLFxuICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLFxuICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsXG4gIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSxcbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LFxuICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NyxcbiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LFxuICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LFxuICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLFxuICBjb25zdHJ1Y3RQYXRoOiA5MSxcbn07XG5cbmNvbnN0IFVOU1VQUE9SVEVEX0ZFQVRVUkVTID0ge1xuICAvKiogQGRlcHJlY2F0ZWQgdW51c2VkICovXG4gIHVua25vd246IFwidW5rbm93blwiLFxuICBmb3JtczogXCJmb3Jtc1wiLFxuICBqYXZhU2NyaXB0OiBcImphdmFTY3JpcHRcIixcbiAgc21hc2s6IFwic21hc2tcIixcbiAgc2hhZGluZ1BhdHRlcm46IFwic2hhZGluZ1BhdHRlcm5cIixcbiAgLyoqIEBkZXByZWNhdGVkIHVudXNlZCAqL1xuICBmb250OiBcImZvbnRcIixcbiAgZXJyb3JUaWxpbmdQYXR0ZXJuOiBcImVycm9yVGlsaW5nUGF0dGVyblwiLFxuICBlcnJvckV4dEdTdGF0ZTogXCJlcnJvckV4dEdTdGF0ZVwiLFxuICBlcnJvclhPYmplY3Q6IFwiZXJyb3JYT2JqZWN0XCIsXG4gIGVycm9yRm9udExvYWRUeXBlMzogXCJlcnJvckZvbnRMb2FkVHlwZTNcIixcbiAgZXJyb3JGb250U3RhdGU6IFwiZXJyb3JGb250U3RhdGVcIixcbiAgZXJyb3JGb250TWlzc2luZzogXCJlcnJvckZvbnRNaXNzaW5nXCIsXG4gIGVycm9yRm9udFRyYW5zbGF0ZTogXCJlcnJvckZvbnRUcmFuc2xhdGVcIixcbiAgZXJyb3JDb2xvclNwYWNlOiBcImVycm9yQ29sb3JTcGFjZVwiLFxuICBlcnJvck9wZXJhdG9yTGlzdDogXCJlcnJvck9wZXJhdG9yTGlzdFwiLFxuICBlcnJvckZvbnRUb1VuaWNvZGU6IFwiZXJyb3JGb250VG9Vbmljb2RlXCIsXG4gIGVycm9yRm9udExvYWROYXRpdmU6IFwiZXJyb3JGb250TG9hZE5hdGl2ZVwiLFxuICBlcnJvckZvbnRHZXRQYXRoOiBcImVycm9yRm9udEdldFBhdGhcIixcbiAgZXJyb3JNYXJrZWRDb250ZW50OiBcImVycm9yTWFya2VkQ29udGVudFwiLFxufTtcblxuY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7XG4gIE5FRURfUEFTU1dPUkQ6IDEsXG4gIElOQ09SUkVDVF9QQVNTV09SRDogMixcbn07XG5cbmxldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUztcblxuZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHtcbiAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7XG4gICAgdmVyYm9zaXR5ID0gbGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7XG4gIHJldHVybiB2ZXJib3NpdHk7XG59XG5cbi8vIEEgbm90aWNlIGZvciBkZXZzLiBUaGVzZSBhcmUgZ29vZCBmb3IgdGhpbmdzIHRoYXQgYXJlIGhlbHBmdWwgdG8gZGV2cywgc3VjaFxuLy8gYXMgd2FybmluZyB0aGF0IFdvcmtlcnMgd2VyZSBkaXNhYmxlZCwgd2hpY2ggaXMgaW1wb3J0YW50IHRvIGRldnMgYnV0IG5vdFxuLy8gZW5kIHVzZXJzLlxuZnVuY3Rpb24gaW5mbyhtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykge1xuICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTtcbiAgfVxufVxuXG4vLyBOb24tZmF0YWwgd2FybmluZ3MuXG5mdW5jdGlvbiB3YXJuKG1zZykge1xuICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7XG4gICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykge1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykge1xuICBpZiAoIWNvbmQpIHtcbiAgICB1bnJlYWNoYWJsZShtc2cpO1xuICB9XG59XG5cbi8vIENoZWNrcyBpZiBVUkxzIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiBGb3Igbm9uLUhUVFAgYmFzZWQgVVJMcywgcmV0dXJucyBmYWxzZS5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbihiYXNlVXJsLCBvdGhlclVybCkge1xuICBsZXQgYmFzZTtcbiAgdHJ5IHtcbiAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICBpZiAoIWJhc2Uub3JpZ2luIHx8IGJhc2Uub3JpZ2luID09PSBcIm51bGxcIikge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub24tSFRUUCB1cmxcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvdGhlciA9IG5ldyBVUkwob3RoZXJVcmwsIGJhc2UpO1xuICByZXR1cm4gYmFzZS5vcmlnaW4gPT09IG90aGVyLm9yaWdpbjtcbn1cblxuLy8gQ2hlY2tzIGlmIFVSTHMgdXNlIG9uZSBvZiB0aGUgYWxsb3dlZCBwcm90b2NvbHMsIGUuZy4gdG8gYXZvaWQgWFNTLlxuZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh1cmwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHtcbiAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICBjYXNlIFwiaHR0cHM6XCI6XG4gICAgY2FzZSBcImZ0cDpcIjpcbiAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgIGNhc2UgXCJ0ZWw6XCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgdmFsaWQgYWJzb2x1dGUgVVJMLlxuICpcbiAqIEBwYXJhbSB7VVJMfHN0cmluZ30gdXJsIC0gQW4gYWJzb2x1dGUsIG9yIHJlbGF0aXZlLCBVUkwuXG4gKiBAcGFyYW0ge1VSTHxzdHJpbmd9IGJhc2VVcmwgLSBBbiBhYnNvbHV0ZSBVUkwuXG4gKiBAcmV0dXJucyBFaXRoZXIgYSB2YWxpZCB7VVJMfSwgb3IgYG51bGxgIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGFic29sdXRlVXJsID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICBpZiAoX2lzVmFsaWRQcm90b2NvbChhYnNvbHV0ZVVybCkpIHtcbiAgICAgIHJldHVybiBhYnNvbHV0ZVVybDtcbiAgICB9XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgLyogYG5ldyBVUkwoKWAgd2lsbCB0aHJvdyBvbiBpbmNvcnJlY3QgZGF0YS4gKi9cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuICAgIHZhbHVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZSB7YW55fVxuICovXG5jb25zdCBCYXNlRXhjZXB0aW9uID0gKGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcblxuICByZXR1cm4gQmFzZUV4Y2VwdGlvbjtcbn0pKCk7XG5cbmNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgY29kZSkge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuXG5jbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICB9XG59XG5cbmNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciBjYXVzZWQgZHVyaW5nIHBhcnNpbmcgUERGIGRhdGEuXG4gKi9cbmNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG4vKipcbiAqIEVycm9yIHVzZWQgdG8gaW5kaWNhdGUgdGFzayBjYW5jZWxsYXRpb24uXG4gKi9cbmNsYXNzIEFib3J0RXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG5jb25zdCBOdWxsQ2hhcmFjdGVyc1JlZ0V4cCA9IC9cXHgwMC9nO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnMoc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgd2FybihcIlRoZSBhcmd1bWVudCBmb3IgcmVtb3ZlTnVsbENoYXJhY3RlcnMgbXVzdCBiZSBhIHN0cmluZy5cIik7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICByZXR1cm4gc3RyLnJlcGxhY2UoTnVsbENoYXJhY3RlcnNSZWdFeHAsIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7XG4gIGFzc2VydChcbiAgICBieXRlcyAhPT0gbnVsbCAmJiB0eXBlb2YgYnl0ZXMgPT09IFwib2JqZWN0XCIgJiYgYnl0ZXMubGVuZ3RoICE9PSB1bmRlZmluZWQsXG4gICAgXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nXCJcbiAgKTtcbiAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyO1xuICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICB9XG4gIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcbiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7XG4gICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7XG4gICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpO1xuICB9XG4gIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgYXNzZXJ0KHR5cGVvZiBzdHIgPT09IFwic3RyaW5nXCIsIFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKipcbiAqIEdldHMgbGVuZ3RoIG9mIHRoZSBhcnJheSAoQXJyYXksIFVpbnQ4QXJyYXksIG9yIHN0cmluZykgaW4gYnl0ZXMuXG4gKiBAcGFyYW0ge0FycmF5PGFueT58VWludDhBcnJheXxzdHJpbmd9IGFyclxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gYXJyYXlCeXRlTGVuZ3RoKGFycikge1xuICBpZiAoYXJyLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGFyci5sZW5ndGg7XG4gIH1cbiAgYXNzZXJ0KGFyci5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQsIFwiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC5cIik7XG4gIHJldHVybiBhcnIuYnl0ZUxlbmd0aDtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyBhcnJheSBpdGVtcyAoYXJyYXlzKSBpbnRvIHNpbmdsZSBVaW50OEFycmF5IG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8YW55PnxVaW50OEFycmF5fHN0cmluZz59IGFyciAtIHRoZSBhcnJheSBvZiB0aGUgYXJyYXlzXG4gKiAgIChBcnJheSwgVWludDhBcnJheSwgb3Igc3RyaW5nKS5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiBhcnJheXNUb0J5dGVzKGFycikge1xuICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICAvLyBTaG9ydGN1dDogaWYgZmlyc3QgYW5kIG9ubHkgaXRlbSBpcyBVaW50OEFycmF5LCByZXR1cm4gaXQuXG4gIGlmIChsZW5ndGggPT09IDEgJiYgYXJyWzBdIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiBhcnJbMF07XG4gIH1cbiAgbGV0IHJlc3VsdExlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRMZW5ndGggKz0gYXJyYXlCeXRlTGVuZ3RoKGFycltpXSk7XG4gIH1cbiAgbGV0IHBvcyA9IDA7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShyZXN1bHRMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGl0ZW0gPSBhcnJbaV07XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbSA9IHN0cmluZ1RvQnl0ZXMoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtID0gbmV3IFVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1MZW5ndGggPSBpdGVtLmJ5dGVMZW5ndGg7XG4gICAgZGF0YS5zZXQoaXRlbSwgcG9zKTtcbiAgICBwb3MgKz0gaXRlbUxlbmd0aDtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgKHZhbHVlID4+IDI0KSAmIDB4ZmYsXG4gICAgKHZhbHVlID4+IDE2KSAmIDB4ZmYsXG4gICAgKHZhbHVlID4+IDgpICYgMHhmZixcbiAgICB2YWx1ZSAmIDB4ZmZcbiAgKTtcbn1cblxuLy8gQ2hlY2tzIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBwbGF0Zm9ybS5cbmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkge1xuICBjb25zdCBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gIGJ1ZmZlcjhbMF0gPSAxO1xuICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpO1xuICByZXR1cm4gdmlldzMyWzBdID09PSAxO1xufVxuY29uc3QgSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSB7XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidmFsdWVcIiwgaXNMaXR0bGVFbmRpYW4oKSk7XG4gIH0sXG59O1xuXG4vLyBDaGVja3MgaWYgaXQncyBwb3NzaWJsZSB0byBldmFsIEpTIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkge1xuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbihcIlwiKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcsIG5vLW5ldy1mdW5jXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmNvbnN0IElzRXZhbFN1cHBvcnRlZENhY2hlZCA9IHtcbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2YWx1ZVwiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7XG4gIH0sXG59O1xuXG5jb25zdCByZ2JCdWYgPSBbXCJyZ2IoXCIsIDAsIFwiLFwiLCAwLCBcIixcIiwgMCwgXCIpXCJdO1xuXG5jbGFzcyBVdGlsIHtcbiAgLy8gbWFrZUNzc1JnYigpIGNhbiBiZSBjYWxsZWQgdGhvdXNhbmRzIG9mIHRpbWVzLiBVc2luZyDCtHJnYkJ1ZmAgYXZvaWRzXG4gIC8vIGNyZWF0aW5nIG1hbnkgaW50ZXJtZWRpYXRlIHN0cmluZ3MuXG4gIHN0YXRpYyBtYWtlQ3NzUmdiKHIsIGcsIGIpIHtcbiAgICByZ2JCdWZbMV0gPSByO1xuICAgIHJnYkJ1ZlszXSA9IGc7XG4gICAgcmdiQnVmWzVdID0gYjtcbiAgICByZXR1cm4gcmdiQnVmLmpvaW4oXCJcIik7XG4gIH1cblxuICAvLyBDb25jYXRlbmF0ZXMgdHdvIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIHRvZ2V0aGVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gIHN0YXRpYyB0cmFuc2Zvcm0obTEsIG0yKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG0xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLFxuICAgICAgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sXG4gICAgICBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSxcbiAgICAgIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLFxuICAgICAgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSxcbiAgICAgIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIEZvciAyZCBhZmZpbmUgdHJhbnNmb3Jtc1xuICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0ocCwgbSkge1xuICAgIGNvbnN0IHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07XG4gICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cblxuICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHAsIG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICBjb25zdCB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkO1xuICAgIGNvbnN0IHl0ID0gKC1wWzBdICogbVsxXSArIHBbMV0gKiBtWzBdICsgbVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHRyYW5zZm9ybSB0byB0aGUgcmVjdGFuZ2xlIGFuZCBmaW5kcyB0aGUgbWluaW11bSBheGlhbGx5XG4gIC8vIGFsaWduZWQgYm91bmRpbmcgYm94LlxuICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkge1xuICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLCBtKTtcbiAgICBjb25zdCBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7XG4gICAgY29uc3QgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7XG4gICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7XG4gICAgcmV0dXJuIFtcbiAgICAgIE1hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSxcbiAgICAgIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSxcbiAgICAgIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSxcbiAgICAgIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSxcbiAgICBdO1xuICB9XG5cbiAgc3RhdGljIGludmVyc2VUcmFuc2Zvcm0obSkge1xuICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuICAgIHJldHVybiBbXG4gICAgICBtWzNdIC8gZCxcbiAgICAgIC1tWzFdIC8gZCxcbiAgICAgIC1tWzJdIC8gZCxcbiAgICAgIG1bMF0gLyBkLFxuICAgICAgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCxcbiAgICAgIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQsXG4gICAgXTtcbiAgfVxuXG4gIC8vIEFwcGx5IGEgZ2VuZXJpYyAzZCBtYXRyaXggTSBvbiBhIDMtdmVjdG9yIHY6XG4gIC8vICAgfCBhIGIgYyB8ICAgfCBYIHxcbiAgLy8gICB8IGQgZSBmIHwgeCB8IFkgfFxuICAvLyAgIHwgZyBoIGkgfCAgIHwgWiB8XG4gIC8vIE0gaXMgYXNzdW1lZCB0byBiZSBzZXJpYWxpemVkIGFzIFthLGIsYyxkLGUsZixnLGgsaV0sXG4gIC8vIHdpdGggdiBhcyBbWCxZLFpdXG4gIHN0YXRpYyBhcHBseTNkVHJhbnNmb3JtKG0sIHYpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbVswXSAqIHZbMF0gKyBtWzFdICogdlsxXSArIG1bMl0gKiB2WzJdLFxuICAgICAgbVszXSAqIHZbMF0gKyBtWzRdICogdlsxXSArIG1bNV0gKiB2WzJdLFxuICAgICAgbVs2XSAqIHZbMF0gKyBtWzddICogdlsxXSArIG1bOF0gKiB2WzJdLFxuICAgIF07XG4gIH1cblxuICAvLyBUaGlzIGNhbGN1bGF0aW9uIHVzZXMgU2luZ3VsYXIgVmFsdWUgRGVjb21wb3NpdGlvbi5cbiAgLy8gVGhlIFNWRCBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aCBmb3JtdWxhIEEgPSBVU1YuIFdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZVxuICAvLyBtYXRyaXggUyBoZXJlIGJlY2F1c2UgaXQgcmVwcmVzZW50cyB0aGUgc2NhbGUgdmFsdWVzLlxuICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkge1xuICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTtcblxuICAgIC8vIE11bHRpcGx5IG1hdHJpeCBtIHdpdGggaXRzIHRyYW5zcG9zZS5cbiAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07XG4gICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdO1xuICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107XG5cbiAgICAvLyBTb2x2ZSB0aGUgc2Vjb25kIGRlZ3JlZSBwb2x5bm9taWFsIHRvIGdldCByb290cy5cbiAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyO1xuICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICogKGEgKyBkKSAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjtcbiAgICBjb25zdCBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7XG4gICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxO1xuXG4gICAgLy8gU2NhbGUgdmFsdWVzIGFyZSB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBlaWdlbnZhbHVlcy5cbiAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHJlY3RhbmdsZSByZWN0PVt4MSwgeTEsIHgyLCB5Ml0gc28gdGhhdCAoeDEseTEpIDwgKHgyLHkyKVxuICAvLyBGb3IgY29vcmRpbmF0ZSBzeXN0ZW1zIHdob3NlIG9yaWdpbiBsaWVzIGluIHRoZSBib3R0b20tbGVmdCwgdGhpc1xuICAvLyBtZWFucyBub3JtYWxpemF0aW9uIHRvIChCTCxUUikgb3JkZXJpbmcuIEZvciBzeXN0ZW1zIHdpdGggb3JpZ2luIGluIHRoZVxuICAvLyB0b3AtbGVmdCwgdGhpcyBtZWFucyAoVEwsQlIpIG9yZGVyaW5nLlxuICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7XG4gICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7IC8vIGNsb25lIHJlY3RcbiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHtcbiAgICAgIHJbMF0gPSByZWN0WzJdO1xuICAgICAgclsyXSA9IHJlY3RbMF07XG4gICAgfVxuICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkge1xuICAgICAgclsxXSA9IHJlY3RbM107XG4gICAgICByWzNdID0gcmVjdFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgcmVjdGFuZ2xlIFt4MSwgeTEsIHgyLCB5Ml0gY29ycmVzcG9uZGluZyB0byB0aGVcbiAgLy8gaW50ZXJzZWN0aW9uIG9mIHJlY3QxIGFuZCByZWN0Mi4gSWYgbm8gaW50ZXJzZWN0aW9uLCByZXR1cm5zICdmYWxzZSdcbiAgLy8gVGhlIHJlY3RhbmdsZSBjb29yZGluYXRlcyBvZiByZWN0MSwgcmVjdDIgc2hvdWxkIGJlIFt4MSwgeTEsIHgyLCB5Ml1cbiAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHtcbiAgICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9XG5cbiAgICAvLyBPcmRlciBwb2ludHMgYWxvbmcgdGhlIGF4ZXNcbiAgICBjb25zdCBvcmRlcmVkWCA9IFtyZWN0MVswXSwgcmVjdDFbMl0sIHJlY3QyWzBdLCByZWN0MlsyXV0uc29ydChjb21wYXJlKTtcbiAgICBjb25zdCBvcmRlcmVkWSA9IFtyZWN0MVsxXSwgcmVjdDFbM10sIHJlY3QyWzFdLCByZWN0MlszXV0uc29ydChjb21wYXJlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHJlY3QxID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QxKTtcbiAgICByZWN0MiA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0Mik7XG5cbiAgICAvLyBYOiBmaXJzdCBhbmQgc2Vjb25kIHBvaW50cyBiZWxvbmcgdG8gZGlmZmVyZW50IHJlY3RhbmdsZXM/XG4gICAgaWYgKFxuICAgICAgKG9yZGVyZWRYWzBdID09PSByZWN0MVswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDJbMF0pIHx8XG4gICAgICAob3JkZXJlZFhbMF0gPT09IHJlY3QyWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MVswXSlcbiAgICApIHtcbiAgICAgIC8vIEludGVyc2VjdGlvbiBtdXN0IGJlIGJldHdlZW4gc2Vjb25kIGFuZCB0aGlyZCBwb2ludHNcbiAgICAgIHJlc3VsdFswXSA9IG9yZGVyZWRYWzFdO1xuICAgICAgcmVzdWx0WzJdID0gb3JkZXJlZFhbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFk6IGZpcnN0IGFuZCBzZWNvbmQgcG9pbnRzIGJlbG9uZyB0byBkaWZmZXJlbnQgcmVjdGFuZ2xlcz9cbiAgICBpZiAoXG4gICAgICAob3JkZXJlZFlbMF0gPT09IHJlY3QxWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MlsxXSkgfHxcbiAgICAgIChvcmRlcmVkWVswXSA9PT0gcmVjdDJbMV0gJiYgb3JkZXJlZFlbMV0gPT09IHJlY3QxWzFdKVxuICAgICkge1xuICAgICAgLy8gSW50ZXJzZWN0aW9uIG11c3QgYmUgYmV0d2VlbiBzZWNvbmQgYW5kIHRoaXJkIHBvaW50c1xuICAgICAgcmVzdWx0WzFdID0gb3JkZXJlZFlbMV07XG4gICAgICByZXN1bHRbM10gPSBvcmRlcmVkWVsyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAweDJEOCwgMHgyQzcsIDB4MkM2LCAweDJEOSwgMHgyREQsIDB4MkRCLCAweDJEQSwgMHgyREMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LFxuICAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNBLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFFLCAweDIwMUMsXG4gIDB4MjAxRCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQSwgMHgyMTIyLCAweEZCMDEsIDB4RkIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCxcbiAgMHgxNzgsIDB4MTdELCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN0UsIDAsIDB4MjBBQ1xuXTtcblxuZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoc3RyKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgc3RyQnVmID0gW107XG4gIGlmIChzdHJbMF0gPT09IFwiXFx4RkVcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkZcIikge1xuICAgIC8vIFVURjE2QkUgQk9NXG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikge1xuICAgICAgc3RyQnVmLnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoKHN0ci5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEZGXCIgJiYgc3RyWzFdID09PSBcIlxceEZFXCIpIHtcbiAgICAvLyBVVEYxNkxFIEJPTVxuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHN0ckJ1Zi5wdXNoKFxuICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKChzdHIuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgfCBzdHIuY2hhckNvZGVBdChpKSlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChpKV07XG4gICAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgLy8gcmVwbGFjZSBcIihcIiwgXCIpXCIgYW5kIFwiXFxcIiBieSBcIlxcKFwiLCBcIlxcKVwiIGFuZCBcIlxcXFxcIlxuICAvLyBpbiBvcmRlciB0byB3cml0ZSBpdCBpbiBhIFBERiBmaWxlLlxuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXFwoXFwpXFxcXF0pL2csIFwiXFxcXCQxXCIpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xufVxuXG5mdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7XG4gIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbCh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJib29sZWFuXCI7XG59XG5cbmZ1bmN0aW9uIGlzTnVtKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm51bWJlclwiO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmIHYuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikge1xuICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBhcnIxLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgIHJldHVybiBlbGVtZW50ID09PSBhcnIyW2luZGV4XTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoZGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkpKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IFtcbiAgICBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSxcbiAgICAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgKGRhdGUuZ2V0VVRDRGF0ZSgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICBdO1xuXG4gIHJldHVybiBidWZmZXIuam9pbihcIlwiKTtcbn1cblxuLyoqXG4gKiBQcm9taXNlIENhcGFiaWxpdHkgb2JqZWN0LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb21pc2VDYXBhYmlsaXR5XG4gKiBAcHJvcGVydHkge1Byb21pc2U8YW55Pn0gcHJvbWlzZSAtIEEgUHJvbWlzZSBvYmplY3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNldHRsZWQgLSBJZiB0aGUgUHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQvcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZXNvbHZlIC0gRnVsZmlsbHMgdGhlIFByb21pc2UuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZWplY3QgLSBSZWplY3RzIHRoZSBQcm9taXNlLlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb21pc2UgY2FwYWJpbGl0eSBvYmplY3QuXG4gKiBAYWxpYXMgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZUNhcGFiaWxpdHl9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCkge1xuICBjb25zdCBjYXBhYmlsaXR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IGlzU2V0dGxlZCA9IGZhbHNlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYXBhYmlsaXR5LCBcInNldHRsZWRcIiwge1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBpc1NldHRsZWQ7XG4gICAgfSxcbiAgfSk7XG4gIGNhcGFiaWxpdHkucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBjYXBhYmlsaXR5LnJlc29sdmUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaXNTZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgfTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlzU2V0dGxlZCA9IHRydWU7XG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGNhcGFiaWxpdHk7XG59XG5cbmNvbnN0IGNyZWF0ZU9iamVjdFVSTCA9IChmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkxDbG9zdXJlKCkge1xuICAvLyBCbG9iL2NyZWF0ZU9iamVjdFVSTCBpcyBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gZGF0YSBzY2hlbWEuXG4gIGNvbnN0IGRpZ2l0cyA9XG4gICAgXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChkYXRhLCBjb250ZW50VHlwZSwgZm9yY2VEYXRhU2NoZW1hID0gZmFsc2UpIHtcbiAgICBpZiAoIWZvcmNlRGF0YVNjaGVtYSAmJiBVUkwuY3JlYXRlT2JqZWN0VVJMKSB7XG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2RhdGFdLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlciA9IGBkYXRhOiR7Y29udGVudFR5cGV9O2Jhc2U2NCxgO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMykge1xuICAgICAgY29uc3QgYjEgPSBkYXRhW2ldICYgMHhmZjtcbiAgICAgIGNvbnN0IGIyID0gZGF0YVtpICsgMV0gJiAweGZmO1xuICAgICAgY29uc3QgYjMgPSBkYXRhW2kgKyAyXSAmIDB4ZmY7XG4gICAgICBjb25zdCBkMSA9IGIxID4+IDIsXG4gICAgICAgIGQyID0gKChiMSAmIDMpIDw8IDQpIHwgKGIyID4+IDQpO1xuICAgICAgY29uc3QgZDMgPSBpICsgMSA8IGlpID8gKChiMiAmIDB4ZikgPDwgMikgfCAoYjMgPj4gNikgOiA2NDtcbiAgICAgIGNvbnN0IGQ0ID0gaSArIDIgPCBpaSA/IGIzICYgMHgzZiA6IDY0O1xuICAgICAgYnVmZmVyICs9IGRpZ2l0c1tkMV0gKyBkaWdpdHNbZDJdICsgZGlnaXRzW2QzXSArIGRpZ2l0c1tkNF07XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG4gIH07XG59KSgpO1xuXG5leHBvcnQge1xuICBCYXNlRXhjZXB0aW9uLFxuICBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgSURFTlRJVFlfTUFUUklYLFxuICBPUFMsXG4gIFZlcmJvc2l0eUxldmVsLFxuICBVTlNVUFBPUlRFRF9GRUFUVVJFUyxcbiAgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSxcbiAgQW5ub3RhdGlvbkZpZWxkRmxhZyxcbiAgQW5ub3RhdGlvbkZsYWcsXG4gIEFubm90YXRpb25NYXJrZWRTdGF0ZSxcbiAgQW5ub3RhdGlvblJlcGx5VHlwZSxcbiAgQW5ub3RhdGlvblJldmlld1N0YXRlLFxuICBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUsXG4gIEFubm90YXRpb25UeXBlLFxuICBGb250VHlwZSxcbiAgSW1hZ2VLaW5kLFxuICBDTWFwQ29tcHJlc3Npb25UeXBlLFxuICBBYm9ydEV4Y2VwdGlvbixcbiAgSW52YWxpZFBERkV4Y2VwdGlvbixcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbixcbiAgUGFzc3dvcmRFeGNlcHRpb24sXG4gIFBhc3N3b3JkUmVzcG9uc2VzLFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgU3RyZWFtVHlwZSxcbiAgVGV4dFJlbmRlcmluZ01vZGUsXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbiAgVW5rbm93bkVycm9yRXhjZXB0aW9uLFxuICBVdGlsLFxuICBGb3JtYXRFcnJvcixcbiAgYXJyYXlCeXRlTGVuZ3RoLFxuICBhcnJheXNUb0J5dGVzLFxuICBhc3NlcnQsXG4gIGJ5dGVzVG9TdHJpbmcsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBjcmVhdGVPYmplY3RVUkwsXG4gIGVzY2FwZVN0cmluZyxcbiAgZ2V0TW9kaWZpY2F0aW9uRGF0ZSxcbiAgZ2V0VmVyYm9zaXR5TGV2ZWwsXG4gIGluZm8sXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQXJyYXlFcXVhbCxcbiAgaXNCb29sLFxuICBpc051bSxcbiAgaXNTdHJpbmcsXG4gIGlzU2FtZU9yaWdpbixcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCxcbiAgSXNMaXR0bGVFbmRpYW5DYWNoZWQsXG4gIElzRXZhbFN1cHBvcnRlZENhY2hlZCxcbiAgcmVtb3ZlTnVsbENoYXJhY3RlcnMsXG4gIHNldFZlcmJvc2l0eUxldmVsLFxuICBzaGFkb3csXG4gIHN0cmluZzMyLFxuICBzdHJpbmdUb0J5dGVzLFxuICBzdHJpbmdUb1BERlN0cmluZyxcbiAgc3RyaW5nVG9VVEY4U3RyaW5nLFxuICB1dGY4U3RyaW5nVG9TdHJpbmcsXG4gIHdhcm4sXG4gIHVucmVhY2hhYmxlLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgaXNOb2RlSlMgfSBmcm9tIFwiLi9pc19ub2RlLmpzXCI7XG5cbi8vIFNraXAgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIG1vZGVybiBidWlsZHMgYW5kIGlmIHdlIGFscmVhZHkgcmFuIHRoZSBtb2R1bGUuXG5pZiAoXG4gICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJTS0lQX0JBQkVMXCIpKSAmJlxuICAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwidW5kZWZpbmVkXCIgfHwgIWdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQpXG4pIHtcbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgZ2xvYmFsVGhpcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEvRWRnZSwgT3BlcmFcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcInVuZGVmaW5lZFwiIHx8IGdsb2JhbFRoaXMuTWF0aCAhPT0gTWF0aCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduXG4gICAgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL2dsb2JhbC10aGlzXCIpO1xuICB9XG4gIGdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQgPSB0cnVlO1xuXG4gIGNvbnN0IGhhc0RPTSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRvY3VtZW50ID09PSBcIm9iamVjdFwiO1xuICBjb25zdCB1c2VyQWdlbnQgPVxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IFwiXCI7XG4gIGNvbnN0IGlzSUUgPSAvVHJpZGVudC8udGVzdCh1c2VyQWdlbnQpO1xuXG4gIC8vIFN1cHBvcnQ6IE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrTm9kZUJ0b2EoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuYnRvYSB8fCAhaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5idG9hID0gZnVuY3Rpb24gKGNoYXJzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShjaGFycywgXCJiaW5hcnlcIikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBOb2RlLmpzXG4gIChmdW5jdGlvbiBjaGVja05vZGVBdG9iKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLmF0b2IgfHwgIWlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuYXRvYiA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oaW5wdXQsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgQ2hpbGROb2RlLnJlbW92ZSBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLlxuICAoZnVuY3Rpb24gY2hlY2tDaGlsZE5vZGVSZW1vdmUoKSB7XG4gICAgaWYgKCFoYXNET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbW96aWxsYS9hdm9pZC1yZW1vdmVDaGlsZFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBET01Ub2tlbkxpc3QucHJvdG90eXBlLnthZGQsIHJlbW92ZX0sIHdpdGggbW9yZSB0aGFuXG4gIC8vIG9uZSBwYXJhbWV0ZXIsIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrRE9NVG9rZW5MaXN0QWRkUmVtb3ZlKCkge1xuICAgIGlmICghaGFzRE9NIHx8IGlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJ0ZXN0T25lXCIsIFwidGVzdFR3b1wiKTtcblxuICAgIGlmIChcbiAgICAgIGRpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJ0ZXN0T25lXCIpID09PSB0cnVlICYmXG4gICAgICBkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKFwidGVzdFR3b1wiKSA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBPcmlnaW5hbERPTVRva2VuTGlzdEFkZCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO1xuICAgIGNvbnN0IE9yaWdpbmFsRE9NVG9rZW5MaXN0UmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XG5cbiAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICguLi50b2tlbnMpIHtcbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIE9yaWdpbmFsRE9NVG9rZW5MaXN0QWRkLmNhbGwodGhpcywgdG9rZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoLi4udG9rZW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZS5jYWxsKHRoaXMsIHRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlLCB3aXRoIHRoZSBvcHRpb25hbFxuICAvLyBcImZvcmNlXCIgcGFyYW1ldGVyLCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpIHtcbiAgICBpZiAoIWhhc0RPTSB8fCBpc05vZGVKUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGlmIChkaXYuY2xhc3NMaXN0LnRvZ2dsZShcInRlc3RcIiwgMCkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGZvcmNlID1cbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAhIWFyZ3VtZW50c1sxXSA6ICF0aGlzLmNvbnRhaW5zKHRva2VuKTtcbiAgICAgIHJldHVybiB0aGlzW2ZvcmNlID8gXCJhZGRcIiA6IFwicmVtb3ZlXCJdKHRva2VuKSwgZm9yY2U7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciB3aW5kb3cuaGlzdG9yeS57cHVzaFN0YXRlLCByZXBsYWNlU3RhdGV9LCB3aXRoIHRoZVxuICAvLyBgdXJsYCBwYXJhbWV0ZXIgc2V0IHRvIGB1bmRlZmluZWRgLCB3aXRob3V0IGJyZWFraW5nIHRoZSBkb2N1bWVudCBVUkwuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1dpbmRvd0hpc3RvcnlQdXNoU3RhdGVSZXBsYWNlU3RhdGUoKSB7XG4gICAgaWYgKCFoYXNET00gfHwgIWlzSUUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgT3JpZ2luYWxQdXNoU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7XG4gICAgY29uc3QgT3JpZ2luYWxSZXBsYWNlU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG5cbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSB1cmwgPT09IHVuZGVmaW5lZCA/IFtzdGF0ZSwgdGl0bGVdIDogW3N0YXRlLCB0aXRsZSwgdXJsXTtcbiAgICAgIE9yaWdpbmFsUHVzaFN0YXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7XG4gICAgICBjb25zdCBhcmdzID0gdXJsID09PSB1bmRlZmluZWQgPyBbc3RhdGUsIHRpdGxlXSA6IFtzdGF0ZSwgdGl0bGUsIHVybF07XG4gICAgICBPcmlnaW5hbFJlcGxhY2VTdGF0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NDFcbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nU3RhcnRzV2l0aCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9zdGFydHMtd2l0aC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw0MVxuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdFbmRzV2l0aCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvZW5kcy13aXRoLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQxXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0luY2x1ZGVzKCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9pbmNsdWRlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQ3XG4gIChmdW5jdGlvbiBjaGVja0FycmF5SW5jbHVkZXMoKSB7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9hcnJheS9pbmNsdWRlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBBcnJheS5mcm9tIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlGcm9tKCkge1xuICAgIGlmIChBcnJheS5mcm9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL2FycmF5L2Zyb20uanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LmFzc2lnbiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja09iamVjdEFzc2lnbigpIHtcbiAgICBpZiAoT2JqZWN0LmFzc2lnbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5mcm9tRW50cmllcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NzNcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0RnJvbUVudHJpZXMoKSB7XG4gICAgaWYgKE9iamVjdC5mcm9tRW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvZnJvbS1lbnRyaWVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE1hdGgubG9nMiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8MzhcbiAgKGZ1bmN0aW9uIGNoZWNrTWF0aExvZzIoKSB7XG4gICAgaWYgKE1hdGgubG9nMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBNYXRoLmxvZzIgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9tYXRoL2xvZzIuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgTnVtYmVyLmlzTmFOIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUuXG4gIChmdW5jdGlvbiBjaGVja051bWJlcklzTmFOKCkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTnVtYmVyLmlzTmFOID0gcmVxdWlyZShcImNvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBOdW1iZXIuaXNJbnRlZ2VyIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTwzNFxuICAoZnVuY3Rpb24gY2hlY2tOdW1iZXJJc0ludGVnZXIoKSB7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTnVtYmVyLmlzSW50ZWdlciA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFR5cGVkQXJyYXkucHJvdG90eXBlLnNsaWNlIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrVHlwZWRBcnJheVNsaWNlKCkge1xuICAgIGlmIChVaW50OEFycmF5LnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy90eXBlZC1hcnJheS9zbGljZVwiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRSwgU2FmYXJpPDExLCBDaHJvbWU8NjNcbiAgKGZ1bmN0aW9uIGNoZWNrUHJvbWlzZSgpIHtcbiAgICBpZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgYXJlIHN5bmNocm9ub3VzLCBoZW5jZSBgUHJvbWlzZWAgc2hvdWxkbid0XG4gICAgICAvLyBuZWVkIHRvIGJlIHBvbHlmaWxsZWQgZm9yIHRoZSBJTUFHRV9ERUNPREVSUyBidWlsZCB0YXJnZXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChnbG9iYWxUaGlzLlByb21pc2UgJiYgZ2xvYmFsVGhpcy5Qcm9taXNlLmFsbFNldHRsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5Qcm9taXNlID0gcmVxdWlyZShcImNvcmUtanMvZXMvcHJvbWlzZS9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tVUkwoKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIlBST0RVQ1RJT05cIikpIHtcbiAgICAgIC8vIFByZXZlbnQgXCJyZXF1aXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIgZXJyb3JzIGluIGRldmVsb3BtZW50IG1vZGUsXG4gICAgICAvLyBzaW5jZSB0aGUgYFVSTGAgY29uc3RydWN0b3Igc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBtb2Rlcm4gYnJvd2Vycy5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCFQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkge1xuICAgICAgLy8gVGhlIGBVUkxgIGNvbnN0cnVjdG9yIGlzIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlIGluIHRoZSBleHRlbnNpb25cbiAgICAgIC8vIGJ1aWxkcy5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgZG9uJ3QgdXNlIHRoZSBgVVJMYCBjb25zdHJ1Y3Rvciwgc28gaXRcbiAgICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSBwb2x5ZmlsbGVkIGZvciB0aGUgSU1BR0VfREVDT0RFUlMgYnVpbGQgdGFyZ2V0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLlVSTCA9IHJlcXVpcmUoXCJjb3JlLWpzL3dlYi91cmwuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUUsIE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrUmVhZGFibGVTdHJlYW0oKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiSU1BR0VfREVDT0RFUlNcIikpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IGltYWdlIGRlY29kZXJzIGFyZSBzeW5jaHJvbm91cywgaGVuY2UgYFJlYWRhYmxlU3RyZWFtYFxuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gYmUgcG9seWZpbGxlZCBmb3IgdGhlIElNQUdFX0RFQ09ERVJTIGJ1aWxkIHRhcmdldC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIC8vIE1TIEVkZ2UgbWF5IHNheSBpdCBoYXMgUmVhZGFibGVTdHJlYW0gYnV0IHRoZXkgYXJlIG5vdCB1cCB0byBzcGVjIHlldC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICAgICAgbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUaGUgUmVhZGFibGVTdHJlYW0gY29uc3RydWN0b3IgY2Fubm90IGJlIHVzZWQuXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKFwid2ViLXN0cmVhbXMtcG9seWZpbGwvZGlzdC9wb255ZmlsbC5qc1wiKS5SZWFkYWJsZVN0cmVhbTtcbiAgfSkoKTtcblxuICAvLyBXZSB3YW50IHRvIHN1cHBvcnQgTWFwIGl0ZXJhdGlvbiwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSBwb3NzaWJsZSB0byBlYXNpbHlcbiAgLy8gdGVzdCBmb3IgdGhhdCBzcGVjaWZpY2FsbHk7IGhlbmNlIHVzaW5nIGEgc2ltaWxhcmx5IHVuc3VwcG9ydGVkIHByb3BlcnR5LlxuICAvLyBTdXBwb3J0OiBJRTExXG4gIChmdW5jdGlvbiBjaGVja01hcEVudHJpZXMoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuTWFwICYmIGdsb2JhbFRoaXMuTWFwLnByb3RvdHlwZS5lbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuTWFwID0gcmVxdWlyZShcImNvcmUtanMvZXMvbWFwL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFdlIHdhbnQgdG8gc3VwcG9ydCBTZXQgaXRlcmF0aW9uLCBidXQgaXQgZG9lc24ndCBzZWVtIHBvc3NpYmxlIHRvIGVhc2lseVxuICAvLyB0ZXN0IGZvciB0aGF0IHNwZWNpZmljYWxseTsgaGVuY2UgdXNpbmcgYSBzaW1pbGFybHkgdW5zdXBwb3J0ZWQgcHJvcGVydHkuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrU2V0RW50cmllcygpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5TZXQgJiYgZ2xvYmFsVGhpcy5TZXQucHJvdG90eXBlLmVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5TZXQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9zZXQvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUU8MTEsIFNhZmFyaTw4LCBDaHJvbWU8MzZcbiAgKGZ1bmN0aW9uIGNoZWNrV2Vha01hcCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuV2Vha01hcCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3dlYWstbWFwL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrV2Vha1NldCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrU2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuV2Vha1NldCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3dlYWstc2V0L2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5jb2RlUG9pbnRBdCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEuXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0NvZGVQb2ludEF0KCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9jb2RlLXBvaW50LWF0LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5mcm9tQ29kZVBvaW50IGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUxMS5cbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nRnJvbUNvZGVQb2ludCgpIHtcbiAgICBpZiAoU3RyaW5nLmZyb21Db2RlUG9pbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgU3RyaW5nLmZyb21Db2RlUG9pbnQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvZnJvbS1jb2RlLXBvaW50LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1N5bWJvbCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5TeW1ib2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3ltYm9sL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU3XG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1BhZFN0YXJ0KCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9wYWQtc3RhcnQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU3XG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1BhZEVuZCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL3BhZC1lbmQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LnZhbHVlcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NTRcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0VmFsdWVzKCkge1xuICAgIGlmIChPYmplY3QudmFsdWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXMgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvdmFsdWVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5lbnRyaWVzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw1NFxuICAoZnVuY3Rpb24gY2hlY2tPYmplY3RFbnRyaWVzKCkge1xuICAgIGlmIChPYmplY3QuZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzXCIpO1xuICB9KSgpO1xufVxuIiwiLyogQ29weXJpZ2h0IDIwMTggTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWxzIHByb2Nlc3MgKi9cblxuLy8gTlcuanMgLyBFbGVjdHJvbiBpcyBhIGJyb3dzZXIgY29udGV4dCwgYnV0IGNvcGllcyBzb21lIE5vZGUuanMgb2JqZWN0czsgc2VlXG4vLyBodHRwOi8vZG9jcy5ud2pzLmlvL2VuL2xhdGVzdC9Gb3IlMjBVc2Vycy9BZHZhbmNlZC9KYXZhU2NyaXB0JTIwQ29udGV4dHMlMjBpbiUyME5XLmpzLyNhY2Nlc3Mtbm9kZWpzLWFuZC1ud2pzLWFwaS1pbi1icm93c2VyLWNvbnRleHRcbi8vIGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvYXBpL3Byb2Nlc3MjcHJvY2Vzc3ZlcnNpb25zZWxlY3Ryb24tcmVhZG9ubHlcbi8vIGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvYXBpL3Byb2Nlc3MjcHJvY2Vzc3R5cGUtcmVhZG9ubHlcbmNvbnN0IGlzTm9kZUpTID1cbiAgdHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiZcbiAgcHJvY2VzcyArIFwiXCIgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiICYmXG4gICFwcm9jZXNzLnZlcnNpb25zLm53ICYmXG4gICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSBcImJyb3dzZXJcIik7XG5cbmV4cG9ydCB7IGlzTm9kZUpTIH07XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmdsb2JhbC10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG4vLyBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1nbG9iYWxcbiQoeyBnbG9iYWw6IHRydWUgfSwge1xuICBnbG9iYWxUaGlzOiBnbG9iYWxcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gKGdsb2JhbFtUQVJHRVRdIHx8IHt9KS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXRcbiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCJ2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fFxuICBjaGVjayh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pWzFdICE9IDc7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsIi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIFBSRUZFUlJFRF9TVFJJTkcpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGlucHV0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcblxudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgVEVNUExBVEUgPSBTdHJpbmcoU3RyaW5nKS5zcGxpdCgnU3RyaW5nJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIGtleSk7XG4gICAgZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpLnNvdXJjZSA9IFRFTVBMQVRFLmpvaW4odHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/IGtleSA6ICcnKTtcbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsLCBrZXksIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmc7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAodHlwZW9mIHN0b3JlLmluc3BlY3RTb3VyY2UgIT0gJ2Z1bmN0aW9uJykge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgc2V0R2xvYmFsKFNIQVJFRCwge30pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlO1xuIiwidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVApIHtcbiAgdmFyIHN0b3JlID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIHdtZ2V0ID0gc3RvcmUuZ2V0O1xuICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7XG4gIHZhciB3bXNldCA9IHN0b3JlLnNldDtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSwgaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21oYXMuY2FsbChzdG9yZSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoaW5zcGVjdFNvdXJjZShXZWFrTWFwKSk7XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy42LjUnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMjAgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJyArIFN0cmluZyhrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyAoKytpZCArIHBvc3RmaXgpLnRvU3RyaW5nKDM2KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwidmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlID09ICdmdW5jdGlvbicgPyB2YXJpYWJsZSA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSlcbiAgICA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyKGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcbiIsIi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3N0YXJ0c1dpdGgnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIG5hdGl2ZVN0YXJ0c1dpdGggPSAnJy5zdGFydHNXaXRoO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnN0YXJ0c3dpdGhcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgaW5kZXggPSB0b0xlbmd0aChtaW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwidmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNSZWdFeHAoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zXCIpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbi8vIGBJc1JlZ0V4cGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc3JlZ2V4cFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXMoV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgZWxzZSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwidmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0xcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICYmICFTeW1ib2wuc2hhbVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICB2YXIgcmVnZXhwID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChmKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SLCBNRVRIT0QsIGxlbmd0aCkge1xuICByZXR1cm4gYmluZChjYWxsLCBnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdLCBsZW5ndGgpO1xufTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aCcpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAnZW5kc1dpdGgnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIG5hdGl2ZUVuZHNXaXRoID0gJycuZW5kc1dpdGg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdlbmRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7XG59KCk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZW5kc3dpdGhcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwge1xuICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7XG4gICAgdmFyIHRoYXQgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgbm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpO1xuICAgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0aGF0Lmxlbmd0aCk7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBtaW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gbmF0aXZlRW5kc1dpdGhcbiAgICAgID8gbmF0aXZlRW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFjb3JyZWN0SXNSZWdFeHBMb2dpYygnaW5jbHVkZXMnKSB9LCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICByZXR1cm4gISF+U3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpXG4gICAgICAuaW5kZXhPZihub3RBUmVnRXhwKHNlYXJjaFN0cmluZyksIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzJyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ0FycmF5JywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmNsdWRlcztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aCcpO1xuXG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnaW5kZXhPZicsIHsgQUNDRVNTT1JTOiB0cnVlLCAxOiAwIH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVVTRVNfVE9fTEVOR1RIIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdpbmNsdWRlcycpO1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmlmIChBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSB7XG4gIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoQXJyYXlQcm90b3R5cGUsIFVOU0NPUEFCTEVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBjcmVhdGUobnVsbClcbiAgfSk7XG59XG5cbi8vIGFkZCBhIGtleSB0byBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xuXG52YXIgR1QgPSAnPic7XG52YXIgTFQgPSAnPCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgU0NSSVBUID0gJ3NjcmlwdCc7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBFbXB0eUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG52YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIExUICsgU0NSSVBUICsgR1QgKyBjb250ZW50ICsgTFQgKyAnLycgKyBTQ1JJUFQgKyBHVDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBBY3RpdmVYIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHtcbiAgYWN0aXZlWERvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnJykpO1xuICBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTtcbiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDtcbiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDsgLy8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgcmV0dXJuIHRlbXA7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzVcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7XG59O1xuXG4vLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0XG4vLyBObyBuZWVkIHRvIHVzZSBhY3RpdmUgeCBhcHByb2FjaCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyBub3Qgc2V0XG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2XG4vLyBhdm9pZCBJRSBHQyBidWdcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8qIGdsb2JhbCBBY3RpdmVYT2JqZWN0ICovXG4gICAgYWN0aXZlWERvY3VtZW50ID0gZG9jdW1lbnQuZG9tYWluICYmIG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfVxuICBOdWxsUHJvdG9PYmplY3QgPSBhY3RpdmVYRG9jdW1lbnQgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKTtcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3Qua2V5c1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNhY2hlID0ge307XG5cbnZhciB0aHJvd2VyID0gZnVuY3Rpb24gKGl0KSB7IHRocm93IGl0OyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgb3B0aW9ucykge1xuICBpZiAoaGFzKGNhY2hlLCBNRVRIT0RfTkFNRSkpIHJldHVybiBjYWNoZVtNRVRIT0RfTkFNRV07XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdO1xuICB2YXIgQUNDRVNTT1JTID0gaGFzKG9wdGlvbnMsICdBQ0NFU1NPUlMnKSA/IG9wdGlvbnMuQUNDRVNTT1JTIDogZmFsc2U7XG4gIHZhciBhcmd1bWVudDAgPSBoYXMob3B0aW9ucywgMCkgPyBvcHRpb25zWzBdIDogdGhyb3dlcjtcbiAgdmFyIGFyZ3VtZW50MSA9IGhhcyhvcHRpb25zLCAxKSA/IG9wdGlvbnNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXSA9ICEhbWV0aG9kICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKEFDQ0VTU09SUyAmJiAhREVTQ1JJUFRPUlMpIHJldHVybiB0cnVlO1xuICAgIHZhciBPID0geyBsZW5ndGg6IC0xIH07XG5cbiAgICBpZiAoQUNDRVNTT1JTKSBkZWZpbmVQcm9wZXJ0eShPLCAxLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogdGhyb3dlciB9KTtcbiAgICBlbHNlIE9bMV0gPSAxO1xuXG4gICAgbWV0aG9kLmNhbGwoTywgYXJndW1lbnQwLCBhcmd1bWVudDEpO1xuICB9KTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mcm9tJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoYXJBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlJykuY2hhckF0O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIFNUUklOR19JVEVSQVRPUiA9ICdTdHJpbmcgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogU3RyaW5nKGl0ZXJhdGVkKSxcbiAgICBpbmRleDogMFxuICB9KTtcbi8vIGAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgY29kZVBvaW50QXQsIGF0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7XG4gICAgdmFyIFMgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBzaXplID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBmaXJzdCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbik7XG4gICAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgICAgfHwgKHNlY29uZCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklORyA/IFMuY2hhckF0KHBvc2l0aW9uKSA6IGZpcnN0XG4gICAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgICB9XG4gIH1cblxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZBVUxUID09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlO1xuICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5hdGl2ZUl0ZXJhdG9yLmNhbGwodGhpcyk7IH07XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxuaWYgKEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbmlmICghSVNfUFVSRSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIHtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7XG59O1xuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICBhbk9iamVjdChPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyLmNhbGwoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpICYmIGl0ICE9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKGl0KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQsIHZhbHVlO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gICAgcmVzdWx0ID0gbmV3IEMoKTtcbiAgICBmb3IgKDshKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwge1xuICBhc3NpZ246IGFzc2lnblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xuXG52YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhbmF0aXZlQXNzaWduIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZylcbiAgaWYgKERFU0NSSVBUT1JTICYmIG5hdGl2ZUFzc2lnbih7IGI6IDEgfSwgbmF0aXZlQXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbiAgd2hpbGUgKGFyZ3VtZW50c0xlbmd0aCA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBvYmplY3RLZXlzKFMpLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6IG5hdGl2ZUFzc2lnbjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmZyb20tZW50cmllcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmZyb21FbnRyaWVzO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4vLyBgT2JqZWN0LmZyb21FbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1mcm9tLWVudHJpZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZnJvbUVudHJpZXM6IGZ1bmN0aW9uIGZyb21FbnRyaWVzKGl0ZXJhYmxlKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShvYmosIGssIHYpO1xuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgaXRlcmF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgQVNfRU5UUklFUywgSVNfSVRFUkFUT1IpIHtcbiAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGZuLCB0aGF0LCBBU19FTlRSSUVTID8gMiA6IDEpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gQVNfRU5UUklFU1xuICAgICAgICAgID8gYm91bmRGdW5jdGlvbihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSlcbiAgICAgICAgICA6IGJvdW5kRnVuY3Rpb24oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7XG4gIH1cblxuICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHtcbiAgICByZXN1bHQgPSBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBib3VuZEZ1bmN0aW9uLCBzdGVwLnZhbHVlLCBBU19FTlRSSUVTKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG5cbml0ZXJhdGUuc3RvcCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgcmVzdWx0KTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hdGgubG9nMicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTWF0aC5sb2cyO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxuLy8gYE1hdGgubG9nMmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmxvZzJcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCkge1xuICAgIHJldHVybiBsb2coeCkgLyBMTjI7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNOYU47XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE51bWJlci5pc05hTmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNuYW5cbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVnZXInKTtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlclxuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwge1xuICBpc0ludGVnZXI6IGlzSW50ZWdlclxufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBOdW1iZXIuaXNJbnRlZ2VyYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KSB7XG4gIHJldHVybiAhaXNPYmplY3QoaXQpICYmIGlzRmluaXRlKGl0KSAmJiBmbG9vcihpdCkgPT09IGl0O1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc2xpY2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyICRzbGljZSA9IFtdLnNsaWNlO1xuXG52YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgbmV3IEludDhBcnJheSgxKS5zbGljZSgpO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2xpY2VcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICB2YXIgbGlzdCA9ICRzbGljZS5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCBzdGFydCwgZW5kKTtcbiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0sIEZPUkNFRCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXItbmF0aXZlJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlO1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5O1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlO1xudmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTtcbnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBpc1Byb3RvdHlwZU9mID0gT2JqZWN0UHJvdG90eXBlLmlzUHJvdG90eXBlT2Y7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIFRZUEVEX0FSUkFZX1RBRyA9IHVpZCgnVFlQRURfQVJSQVlfVEFHJyk7XG4vLyBGaXhpbmcgbmF0aXZlIHR5cGVkIGFycmF5cyBpbiBPcGVyYSBQcmVzdG8gY3Jhc2hlcyB0aGUgYnJvd3Nlciwgc2VlICM1OTVcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJztcbnZhciBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCA9IGZhbHNlO1xudmFyIE5BTUU7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCA9IHtcbiAgSW50OEFycmF5OiAxLFxuICBVaW50OEFycmF5OiAxLFxuICBVaW50OENsYW1wZWRBcnJheTogMSxcbiAgSW50MTZBcnJheTogMixcbiAgVWludDE2QXJyYXk6IDIsXG4gIEludDMyQXJyYXk6IDQsXG4gIFVpbnQzMkFycmF5OiA0LFxuICBGbG9hdDMyQXJyYXk6IDQsXG4gIEZsb2F0NjRBcnJheTogOFxufTtcblxudmFyIGlzVmlldyA9IGZ1bmN0aW9uIGlzVmlldyhpdCkge1xuICB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTtcbiAgcmV0dXJuIGtsYXNzID09PSAnRGF0YVZpZXcnIHx8IGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpO1xufTtcblxudmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwgY2xhc3NvZihpdCkpO1xufTtcblxudmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1R5cGVkQXJyYXkoaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7XG59O1xuXG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIGlmIChpc1Byb3RvdHlwZU9mLmNhbGwoVHlwZWRBcnJheSwgQykpIHJldHVybiBDO1xuICB9IGVsc2UgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIGlmIChoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIE5BTUUpKSB7XG4gICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07XG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiAoQyA9PT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yIHx8IGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5Q29uc3RydWN0b3IsIEMpKSkge1xuICAgICAgcmV0dXJuIEM7XG4gICAgfVxuICB9IHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yJyk7XG59O1xuXG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQpIHtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoZm9yY2VkKSBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHtcbiAgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlW0tFWV07XG4gICAgfVxuICB9XG4gIGlmICghVHlwZWRBcnJheVByb3RvdHlwZVtLRVldIHx8IGZvcmNlZCkge1xuICAgIHJlZGVmaW5lKFR5cGVkQXJyYXlQcm90b3R5cGUsIEtFWSwgZm9yY2VkID8gcHJvcGVydHlcbiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSk7XG4gIH1cbn07XG5cbnZhciBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCkge1xuICB2YXIgQVJSQVksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICBpZiAoZm9yY2VkKSBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVkpKSB7XG4gICAgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFUeXBlZEFycmF5W0tFWV0gfHwgZm9yY2VkKSB7XG4gICAgICAvLyBWOCB+IENocm9tZSA0OS01MCBgJVR5cGVkQXJyYXklYCBtZXRob2RzIGFyZSBub24td3JpdGFibGUgbm9uLWNvbmZpZ3VyYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlZGVmaW5lKFR5cGVkQXJyYXksIEtFWSwgZm9yY2VkID8gcHJvcGVydHkgOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIEludDhBcnJheVtLRVldIHx8IHByb3BlcnR5KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICB9IGVsc2UgcmV0dXJuO1xuICB9XG4gIGZvciAoQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgKCFUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXSB8fCBmb3JjZWQpKSB7XG4gICAgICByZWRlZmluZShUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfVxufTtcblxuZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIGlmICghZ2xvYmFsW05BTUVdKSBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gZmFsc2U7XG59XG5cbi8vIFdlYktpdCBidWcgLSB0eXBlZCBhcnJheXMgY29uc3RydWN0b3JzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgdHlwZW9mIFR5cGVkQXJyYXkgIT0gJ2Z1bmN0aW9uJyB8fCBUeXBlZEFycmF5ID09PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBUeXBlZEFycmF5ID0gZnVuY3Rpb24gVHlwZWRBcnJheSgpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG4gIH07XG4gIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBpZiAoZ2xvYmFsW05BTUVdKSBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0sIFR5cGVkQXJyYXkpO1xuICB9XG59XG5cbmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhVHlwZWRBcnJheVByb3RvdHlwZSB8fCBUeXBlZEFycmF5UHJvdG90eXBlID09PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkucHJvdG90eXBlO1xuICBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgaWYgKGdsb2JhbFtOQU1FXSkgc2V0UHJvdG90eXBlT2YoZ2xvYmFsW05BTUVdLnByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG4gIH1cbn1cblxuLy8gV2ViS2l0IGJ1ZyAtIG9uZSBtb3JlIG9iamVjdCBpbiBVaW50OENsYW1wZWRBcnJheSBwcm90b3R5cGUgY2hhaW5cbmlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlKSAhPT0gVHlwZWRBcnJheVByb3RvdHlwZSkge1xuICBzZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG59XG5cbmlmIChERVNDUklQVE9SUyAmJiAhaGFzKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gdHJ1ZTtcbiAgZGVmaW5lUHJvcGVydHkoVHlwZWRBcnJheVByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgeyBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodGhpcykgPyB0aGlzW1RZUEVEX0FSUkFZX1RBR10gOiB1bmRlZmluZWQ7XG4gIH0gfSk7XG4gIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgaWYgKGdsb2JhbFtOQU1FXSkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWxbTkFNRV0sIFRZUEVEX0FSUkFZX1RBRywgTkFNRSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MsXG4gIFRZUEVEX0FSUkFZX1RBRzogVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQgJiYgVFlQRURfQVJSQVlfVEFHLFxuICBhVHlwZWRBcnJheTogYVR5cGVkQXJyYXksXG4gIGFUeXBlZEFycmF5Q29uc3RydWN0b3I6IGFUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gIGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlNZXRob2QsXG4gIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QsXG4gIGlzVmlldzogaXNWaWV3LFxuICBpc1R5cGVkQXJyYXk6IGlzVHlwZWRBcnJheSxcbiAgVHlwZWRBcnJheTogVHlwZWRBcnJheSxcbiAgVHlwZWRBcnJheVByb3RvdHlwZTogVHlwZWRBcnJheVByb3RvdHlwZVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5Qcm9taXNlO1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xuaWYgKCFUT19TVFJJTkdfVEFHX1NVUFBPUlQpIHtcbiAgcmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgdG9TdHJpbmcsIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyB7fS50b1N0cmluZyA6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTtcbiAgdmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gPSBBcnJheVZhbHVlcztcbiAgICB9XG4gICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgQ09MTEVDVElPTl9OQU1FKTtcbiAgICB9XG4gICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykge1xuICAgICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkgdHJ5IHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIE1FVEhPRF9OQU1FLCBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gPSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2U7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG52YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47XG5cbnZhciBGT1JDRUQgPSBpc0ZvcmNlZChQUk9NSVNFLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gaW5zcGVjdFNvdXJjZShQcm9taXNlQ29uc3RydWN0b3IpICE9PSBTdHJpbmcoUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFKSB7XG4gICAgLy8gVjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgaWYgKFY4X1ZFUlNJT04gPT09IDY2KSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBVbmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgaWYgKCFJU19OT0RFICYmIHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgIT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gV2UgbmVlZCBQcm9taXNlI2ZpbmFsbHkgaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICFQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlWydmaW5hbGx5J10pIHJldHVybiB0cnVlO1xuICAvLyBXZSBjYW4ndCB1c2UgQEBzcGVjaWVzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoVjhfVkVSU0lPTiA+PSA1MSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoUHJvbWlzZUNvbnN0cnVjdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBEZXRlY3QgY29ycmVjdG5lc3Mgb2Ygc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpO1xuICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICB9O1xuICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gIHJldHVybiAhKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2UpO1xufSk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIFByb21pc2VDb25zdHJ1Y3Rvci5hbGwoaXRlcmFibGUpWydjYXRjaCddKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9ucztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PSBGVUxGSUxMRUQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gY2hhaW5baW5kZXgrK107XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGF0ZS5yZWFjdGlvbnMgPSBbXTtcbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChwcm9taXNlLCBzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBwcm9taXNlLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkocHJvbWlzZSwgc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpO1xuICAgIGlmICh0aGVuKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHByb21pc2UsIHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRUQpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHRoaXMsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgdGhpcywgc3RhdGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaW50ZXJuYWxSZWplY3QodGhpcywgc3RhdGUsIGVycm9yKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IFtdLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7XG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLnRoZW5gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gSVNfTk9ERSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkodGhpcywgc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHN0YXRlKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicpIHtcbiAgICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcblxuICAgIC8vIHdyYXAgbmF0aXZlIFByb21pc2UjdGhlbiBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2UucHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgbmF0aXZlVGhlbi5jYWxsKHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG5cbiAgICAvLyB3cmFwIGZldGNoIHJlc3VsdFxuICAgIGlmICh0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicpICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKFByb21pc2VDb25zdHJ1Y3RvciwgJGZldGNoLmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlamVjdFxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZXNvbHZlXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShJU19QVVJFICYmIHRoaXMgPT09IFByb21pc2VXcmFwcGVyID8gUHJvbWlzZUNvbnN0cnVjdG9yIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICAvLyBgUHJvbWlzZS5hbGxgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlO1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgJyArIChuYW1lID8gbmFtZSArICcgJyA6ICcnKSArICdpbnZvY2F0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcblxudmFyIGxvY2F0aW9uID0gZ2xvYmFsLmxvY2F0aW9uO1xudmFyIHNldCA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbnZhciBydW4gPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcblxudmFyIHJ1bm5lciA9IGZ1bmN0aW9uIChpZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJ1bihpZCk7XG4gIH07XG59O1xuXG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIHBvc3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTtcbn07XG5cbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0IHx8ICFjbGVhcikge1xuICBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjRcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCAmJiAhSVNfSU9TKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJlxuICAgIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmXG4gICAgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmXG4gICAgIWZhaWxzKHBvc3QpICYmXG4gICAgbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOidcbiAgKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gLyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCduYXZpZ2F0b3InLCAndXNlckFnZW50JykgfHwgJyc7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcblxudmFyIE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIElTX05PREUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbi8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2BcbnZhciBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAncXVldWVNaWNyb3Rhc2snKTtcbnZhciBxdWV1ZU1pY3JvdGFzayA9IHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciAmJiBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IudmFsdWU7XG5cbnZhciBmbHVzaCwgaGVhZCwgbGFzdCwgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47XG5cbi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kXG5pZiAoIXF1ZXVlTWljcm90YXNrKSB7XG4gIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChJU19OT0RFICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE11dGF0aW9uT2JzZXJ2ZXIgJiYgIUlTX0lPUykge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgdGhlbiA9IHByb21pc2UudGhlbjtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuLmNhbGwocHJvbWlzZSwgZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7XG4gIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgaWYgKCFoZWFkKSB7XG4gICAgaGVhZCA9IHRhc2s7XG4gICAgbm90aWZ5KCk7XG4gIH0gbGFzdCA9IHRhc2s7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcblxuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdmFyIGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZTtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikge1xuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7XG52YXIgbWF0Y2gsIHZlcnNpb247XG5cbmlmICh2OCkge1xuICBtYXRjaCA9IHY4LnNwbGl0KCcuJyk7XG4gIHZlcnNpb24gPSBtYXRjaFswXSArIG1hdGNoWzFdO1xufSBlbHNlIGlmICh1c2VyQWdlbnQpIHtcbiAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkge1xuICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSBtYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb24gJiYgK3ZlcnNpb247XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFByb21pc2UuYWxsU2V0dGxlZGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWFsbFNldHRsZWRcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxuLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5XG52YXIgTk9OX0dFTkVSSUMgPSAhIU5hdGl2ZVByb21pc2UgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICBOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IE5PTl9HRU5FUklDIH0sIHtcbiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHksXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5XG4gICAgKTtcbiAgfVxufSk7XG5cbi8vIHBhdGNoIG5hdGl2ZSBQcm9taXNlLnByb3RvdHlwZSBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHtcbiAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICdmaW5hbGx5JywgZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddKTtcbn1cbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIudXJsLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5VUkw7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YFxucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgVVNFX05BVElWRV9VUkwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXVybCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xudmFyIGFycmF5RnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY29kZUF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jb2RlQXQ7XG52YXIgdG9BU0NJSSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWknKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IHJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgTmF0aXZlVVJMID0gZ2xvYmFsLlVSTDtcbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zO1xudmFyIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuZ2V0U3RhdGU7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsVVJMU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignVVJMJyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHBvdyA9IE1hdGgucG93O1xuXG52YXIgSU5WQUxJRF9BVVRIT1JJVFkgPSAnSW52YWxpZCBhdXRob3JpdHknO1xudmFyIElOVkFMSURfU0NIRU1FID0gJ0ludmFsaWQgc2NoZW1lJztcbnZhciBJTlZBTElEX0hPU1QgPSAnSW52YWxpZCBob3N0JztcbnZhciBJTlZBTElEX1BPUlQgPSAnSW52YWxpZCBwb3J0JztcblxudmFyIEFMUEhBID0gL1tBLVphLXpdLztcbnZhciBBTFBIQU5VTUVSSUMgPSAvW1xcZCstLkEtWmEtel0vO1xudmFyIERJR0lUID0gL1xcZC87XG52YXIgSEVYX1NUQVJUID0gL14oMHh8MFgpLztcbnZhciBPQ1QgPSAvXlswLTddKyQvO1xudmFyIERFQyA9IC9eXFxkKyQvO1xudmFyIEhFWCA9IC9eW1xcZEEtRmEtZl0rJC87XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQgPSAvW1xcdTAwMDBcXHUwMDA5XFx1MDAwQVxcdTAwMEQgIyUvOj9AW1xcXFxdXS87XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQgPSAvW1xcdTAwMDBcXHUwMDA5XFx1MDAwQVxcdTAwMEQgIy86P0BbXFxcXF1dLztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG52YXIgTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdK3xbXFx1MDAwMC1cXHUwMDFGIF0rJC9nO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbnZhciBUQUJfQU5EX05FV19MSU5FID0gL1tcXHUwMDA5XFx1MDAwQVxcdTAwMERdL2c7XG52YXIgRU9GO1xuXG52YXIgcGFyc2VIb3N0ID0gZnVuY3Rpb24gKHVybCwgaW5wdXQpIHtcbiAgdmFyIHJlc3VsdCwgY29kZVBvaW50cywgaW5kZXg7XG4gIGlmIChpbnB1dC5jaGFyQXQoMCkgPT0gJ1snKSB7XG4gICAgaWYgKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAxKSAhPSAnXScpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgcmVzdWx0ID0gcGFyc2VJUHY2KGlucHV0LnNsaWNlKDEsIC0xKSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIC8vIG9wYXF1ZSBob3N0XG4gIH0gZWxzZSBpZiAoIWlzU3BlY2lhbCh1cmwpKSB7XG4gICAgaWYgKEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQudGVzdChpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgcmVzdWx0ID0gJyc7XG4gICAgY29kZVBvaW50cyA9IGFycmF5RnJvbShpbnB1dCk7XG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29kZVBvaW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHJlc3VsdCArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaW5kZXhdLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTtcbiAgICB9XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgaW5wdXQgPSB0b0FTQ0lJKGlucHV0KTtcbiAgICBpZiAoRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVC50ZXN0KGlucHV0KSkgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICByZXN1bHQgPSBwYXJzZUlQdjQoaW5wdXQpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBwYXJzZUlQdjQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJy4nKTtcbiAgdmFyIHBhcnRzTGVuZ3RoLCBudW1iZXJzLCBpbmRleCwgcGFydCwgcmFkaXgsIG51bWJlciwgaXB2NDtcbiAgaWYgKHBhcnRzLmxlbmd0aCAmJiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PSAnJykge1xuICAgIHBhcnRzLnBvcCgpO1xuICB9XG4gIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoO1xuICBpZiAocGFydHNMZW5ndGggPiA0KSByZXR1cm4gaW5wdXQ7XG4gIG51bWJlcnMgPSBbXTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGFydHNMZW5ndGg7IGluZGV4KyspIHtcbiAgICBwYXJ0ID0gcGFydHNbaW5kZXhdO1xuICAgIGlmIChwYXJ0ID09ICcnKSByZXR1cm4gaW5wdXQ7XG4gICAgcmFkaXggPSAxMDtcbiAgICBpZiAocGFydC5sZW5ndGggPiAxICYmIHBhcnQuY2hhckF0KDApID09ICcwJykge1xuICAgICAgcmFkaXggPSBIRVhfU1RBUlQudGVzdChwYXJ0KSA/IDE2IDogODtcbiAgICAgIHBhcnQgPSBwYXJ0LnNsaWNlKHJhZGl4ID09IDggPyAxIDogMik7XG4gICAgfVxuICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgbnVtYmVyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEocmFkaXggPT0gMTAgPyBERUMgOiByYWRpeCA9PSA4ID8gT0NUIDogSEVYKS50ZXN0KHBhcnQpKSByZXR1cm4gaW5wdXQ7XG4gICAgICBudW1iZXIgPSBwYXJzZUludChwYXJ0LCByYWRpeCk7XG4gICAgfVxuICAgIG51bWJlcnMucHVzaChudW1iZXIpO1xuICB9XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgbnVtYmVyID0gbnVtYmVyc1tpbmRleF07XG4gICAgaWYgKGluZGV4ID09IHBhcnRzTGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKG51bWJlciA+PSBwb3coMjU2LCA1IC0gcGFydHNMZW5ndGgpKSByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXB2NCA9IG51bWJlcnMucG9wKCk7XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgaXB2NCArPSBudW1iZXJzW2luZGV4XSAqIHBvdygyNTYsIDMgLSBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIGlwdjQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbnZhciBwYXJzZUlQdjYgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIGFkZHJlc3MgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gIHZhciBwaWVjZUluZGV4ID0gMDtcbiAgdmFyIGNvbXByZXNzID0gbnVsbDtcbiAgdmFyIHBvaW50ZXIgPSAwO1xuICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDtcblxuICB2YXIgY2hhciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW5wdXQuY2hhckF0KHBvaW50ZXIpO1xuICB9O1xuXG4gIGlmIChjaGFyKCkgPT0gJzonKSB7XG4gICAgaWYgKGlucHV0LmNoYXJBdCgxKSAhPSAnOicpIHJldHVybjtcbiAgICBwb2ludGVyICs9IDI7XG4gICAgcGllY2VJbmRleCsrO1xuICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgfVxuICB3aGlsZSAoY2hhcigpKSB7XG4gICAgaWYgKHBpZWNlSW5kZXggPT0gOCkgcmV0dXJuO1xuICAgIGlmIChjaGFyKCkgPT0gJzonKSB7XG4gICAgICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHJldHVybjtcbiAgICAgIHBvaW50ZXIrKztcbiAgICAgIHBpZWNlSW5kZXgrKztcbiAgICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YWx1ZSA9IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKGxlbmd0aCA8IDQgJiYgSEVYLnRlc3QoY2hhcigpKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDE2ICsgcGFyc2VJbnQoY2hhcigpLCAxNik7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBsZW5ndGgrKztcbiAgICB9XG4gICAgaWYgKGNoYXIoKSA9PSAnLicpIHtcbiAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgcG9pbnRlciAtPSBsZW5ndGg7XG4gICAgICBpZiAocGllY2VJbmRleCA+IDYpIHJldHVybjtcbiAgICAgIG51bWJlcnNTZWVuID0gMDtcbiAgICAgIHdoaWxlIChjaGFyKCkpIHtcbiAgICAgICAgaXB2NFBpZWNlID0gbnVsbDtcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID4gMCkge1xuICAgICAgICAgIGlmIChjaGFyKCkgPT0gJy4nICYmIG51bWJlcnNTZWVuIDwgNCkgcG9pbnRlcisrO1xuICAgICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghRElHSVQudGVzdChjaGFyKCkpKSByZXR1cm47XG4gICAgICAgIHdoaWxlIChESUdJVC50ZXN0KGNoYXIoKSkpIHtcbiAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChjaGFyKCksIDEwKTtcbiAgICAgICAgICBpZiAoaXB2NFBpZWNlID09PSBudWxsKSBpcHY0UGllY2UgPSBudW1iZXI7XG4gICAgICAgICAgZWxzZSBpZiAoaXB2NFBpZWNlID09IDApIHJldHVybjtcbiAgICAgICAgICBlbHNlIGlwdjRQaWVjZSA9IGlwdjRQaWVjZSAqIDEwICsgbnVtYmVyO1xuICAgICAgICAgIGlmIChpcHY0UGllY2UgPiAyNTUpIHJldHVybjtcbiAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1twaWVjZUluZGV4XSA9IGFkZHJlc3NbcGllY2VJbmRleF0gKiAyNTYgKyBpcHY0UGllY2U7XG4gICAgICAgIG51bWJlcnNTZWVuKys7XG4gICAgICAgIGlmIChudW1iZXJzU2VlbiA9PSAyIHx8IG51bWJlcnNTZWVuID09IDQpIHBpZWNlSW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXJzU2VlbiAhPSA0KSByZXR1cm47XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNoYXIoKSA9PSAnOicpIHtcbiAgICAgIHBvaW50ZXIrKztcbiAgICAgIGlmICghY2hhcigpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGFyKCkpIHJldHVybjtcbiAgICBhZGRyZXNzW3BpZWNlSW5kZXgrK10gPSB2YWx1ZTtcbiAgfVxuICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHtcbiAgICBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzcztcbiAgICBwaWVjZUluZGV4ID0gNztcbiAgICB3aGlsZSAocGllY2VJbmRleCAhPSAwICYmIHN3YXBzID4gMCkge1xuICAgICAgc3dhcCA9IGFkZHJlc3NbcGllY2VJbmRleF07XG4gICAgICBhZGRyZXNzW3BpZWNlSW5kZXgtLV0gPSBhZGRyZXNzW2NvbXByZXNzICsgc3dhcHMgLSAxXTtcbiAgICAgIGFkZHJlc3NbY29tcHJlc3MgKyAtLXN3YXBzXSA9IHN3YXA7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBpZWNlSW5kZXggIT0gOCkgcmV0dXJuO1xuICByZXR1cm4gYWRkcmVzcztcbn07XG5cbnZhciBmaW5kTG9uZ2VzdFplcm9TZXF1ZW5jZSA9IGZ1bmN0aW9uIChpcHY2KSB7XG4gIHZhciBtYXhJbmRleCA9IG51bGw7XG4gIHZhciBtYXhMZW5ndGggPSAxO1xuICB2YXIgY3VyclN0YXJ0ID0gbnVsbDtcbiAgdmFyIGN1cnJMZW5ndGggPSAwO1xuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKDsgaW5kZXggPCA4OyBpbmRleCsrKSB7XG4gICAgaWYgKGlwdjZbaW5kZXhdICE9PSAwKSB7XG4gICAgICBpZiAoY3Vyckxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICBtYXhJbmRleCA9IGN1cnJTdGFydDtcbiAgICAgICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGN1cnJTdGFydCA9IG51bGw7XG4gICAgICBjdXJyTGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1cnJTdGFydCA9PT0gbnVsbCkgY3VyclN0YXJ0ID0gaW5kZXg7XG4gICAgICArK2N1cnJMZW5ndGg7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgbWF4SW5kZXggPSBjdXJyU3RhcnQ7XG4gICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDtcbiAgfVxuICByZXR1cm4gbWF4SW5kZXg7XG59O1xuXG52YXIgc2VyaWFsaXplSG9zdCA9IGZ1bmN0aW9uIChob3N0KSB7XG4gIHZhciByZXN1bHQsIGluZGV4LCBjb21wcmVzcywgaWdub3JlMDtcbiAgLy8gaXB2NFxuICBpZiAodHlwZW9mIGhvc3QgPT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQudW5zaGlmdChob3N0ICUgMjU2KTtcbiAgICAgIGhvc3QgPSBmbG9vcihob3N0IC8gMjU2KTtcbiAgICB9IHJldHVybiByZXN1bHQuam9pbignLicpO1xuICAvLyBpcHY2XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHtcbiAgICByZXN1bHQgPSAnJztcbiAgICBjb21wcmVzcyA9IGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlKGhvc3QpO1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChpZ25vcmUwKSBpZ25vcmUwID0gZmFsc2U7XG4gICAgICBpZiAoY29tcHJlc3MgPT09IGluZGV4KSB7XG4gICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7XG4gICAgICAgIGlnbm9yZTAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGhvc3RbaW5kZXhdLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKGluZGV4IDwgNykgcmVzdWx0ICs9ICc6JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdbJyArIHJlc3VsdCArICddJztcbiAgfSByZXR1cm4gaG9zdDtcbn07XG5cbnZhciBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0ID0ge307XG52YXIgZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0LCB7XG4gICcgJzogMSwgJ1wiJzogMSwgJzwnOiAxLCAnPic6IDEsICdgJzogMVxufSk7XG52YXIgcGF0aFBlcmNlbnRFbmNvZGVTZXQgPSBhc3NpZ24oe30sIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCwge1xuICAnIyc6IDEsICc/JzogMSwgJ3snOiAxLCAnfSc6IDFcbn0pO1xudmFyIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgcGF0aFBlcmNlbnRFbmNvZGVTZXQsIHtcbiAgJy8nOiAxLCAnOic6IDEsICc7JzogMSwgJz0nOiAxLCAnQCc6IDEsICdbJzogMSwgJ1xcXFwnOiAxLCAnXSc6IDEsICdeJzogMSwgJ3wnOiAxXG59KTtcblxudmFyIHBlcmNlbnRFbmNvZGUgPSBmdW5jdGlvbiAoY2hhciwgc2V0KSB7XG4gIHZhciBjb2RlID0gY29kZUF0KGNoYXIsIDApO1xuICByZXR1cm4gY29kZSA+IDB4MjAgJiYgY29kZSA8IDB4N0YgJiYgIWhhcyhzZXQsIGNoYXIpID8gY2hhciA6IGVuY29kZVVSSUNvbXBvbmVudChjaGFyKTtcbn07XG5cbnZhciBzcGVjaWFsU2NoZW1lcyA9IHtcbiAgZnRwOiAyMSxcbiAgZmlsZTogbnVsbCxcbiAgaHR0cDogODAsXG4gIGh0dHBzOiA0NDMsXG4gIHdzOiA4MCxcbiAgd3NzOiA0NDNcbn07XG5cbnZhciBpc1NwZWNpYWwgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiBoYXMoc3BlY2lhbFNjaGVtZXMsIHVybC5zY2hlbWUpO1xufTtcblxudmFyIGluY2x1ZGVzQ3JlZGVudGlhbHMgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiB1cmwudXNlcm5hbWUgIT0gJycgfHwgdXJsLnBhc3N3b3JkICE9ICcnO1xufTtcblxudmFyIGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgcmV0dXJuICF1cmwuaG9zdCB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09ICdmaWxlJztcbn07XG5cbnZhciBpc1dpbmRvd3NEcml2ZUxldHRlciA9IGZ1bmN0aW9uIChzdHJpbmcsIG5vcm1hbGl6ZWQpIHtcbiAgdmFyIHNlY29uZDtcbiAgcmV0dXJuIHN0cmluZy5sZW5ndGggPT0gMiAmJiBBTFBIQS50ZXN0KHN0cmluZy5jaGFyQXQoMCkpXG4gICAgJiYgKChzZWNvbmQgPSBzdHJpbmcuY2hhckF0KDEpKSA9PSAnOicgfHwgKCFub3JtYWxpemVkICYmIHNlY29uZCA9PSAnfCcpKTtcbn07XG5cbnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgdGhpcmQ7XG4gIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmcuc2xpY2UoMCwgMikpICYmIChcbiAgICBzdHJpbmcubGVuZ3RoID09IDIgfHxcbiAgICAoKHRoaXJkID0gc3RyaW5nLmNoYXJBdCgyKSkgPT09ICcvJyB8fCB0aGlyZCA9PT0gJ1xcXFwnIHx8IHRoaXJkID09PSAnPycgfHwgdGhpcmQgPT09ICcjJylcbiAgKTtcbn07XG5cbnZhciBzaG9ydGVuVVJMc1BhdGggPSBmdW5jdGlvbiAodXJsKSB7XG4gIHZhciBwYXRoID0gdXJsLnBhdGg7XG4gIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoO1xuICBpZiAocGF0aFNpemUgJiYgKHVybC5zY2hlbWUgIT0gJ2ZpbGUnIHx8IHBhdGhTaXplICE9IDEgfHwgIWlzV2luZG93c0RyaXZlTGV0dGVyKHBhdGhbMF0sIHRydWUpKSkge1xuICAgIHBhdGgucG9wKCk7XG4gIH1cbn07XG5cbnZhciBpc1NpbmdsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudC50b0xvd2VyQ2FzZSgpID09PSAnJTJlJztcbn07XG5cbnZhciBpc0RvdWJsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gIHNlZ21lbnQgPSBzZWdtZW50LnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7XG59O1xuXG4vLyBTdGF0ZXM6XG52YXIgU0NIRU1FX1NUQVJUID0ge307XG52YXIgU0NIRU1FID0ge307XG52YXIgTk9fU0NIRU1FID0ge307XG52YXIgU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkgPSB7fTtcbnZhciBQQVRIX09SX0FVVEhPUklUWSA9IHt9O1xudmFyIFJFTEFUSVZFID0ge307XG52YXIgUkVMQVRJVkVfU0xBU0ggPSB7fTtcbnZhciBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTID0ge307XG52YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTtcbnZhciBBVVRIT1JJVFkgPSB7fTtcbnZhciBIT1NUID0ge307XG52YXIgSE9TVE5BTUUgPSB7fTtcbnZhciBQT1JUID0ge307XG52YXIgRklMRSA9IHt9O1xudmFyIEZJTEVfU0xBU0ggPSB7fTtcbnZhciBGSUxFX0hPU1QgPSB7fTtcbnZhciBQQVRIX1NUQVJUID0ge307XG52YXIgUEFUSCA9IHt9O1xudmFyIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEggPSB7fTtcbnZhciBRVUVSWSA9IHt9O1xudmFyIEZSQUdNRU5UID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xudmFyIHBhcnNlVVJMID0gZnVuY3Rpb24gKHVybCwgaW5wdXQsIHN0YXRlT3ZlcnJpZGUsIGJhc2UpIHtcbiAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBTQ0hFTUVfU1RBUlQ7XG4gIHZhciBwb2ludGVyID0gMDtcbiAgdmFyIGJ1ZmZlciA9ICcnO1xuICB2YXIgc2VlbkF0ID0gZmFsc2U7XG4gIHZhciBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICB2YXIgc2VlblBhc3N3b3JkVG9rZW4gPSBmYWxzZTtcbiAgdmFyIGNvZGVQb2ludHMsIGNoYXIsIGJ1ZmZlckNvZGVQb2ludHMsIGZhaWx1cmU7XG5cbiAgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgdXJsLnNjaGVtZSA9ICcnO1xuICAgIHVybC51c2VybmFtZSA9ICcnO1xuICAgIHVybC5wYXNzd29yZCA9ICcnO1xuICAgIHVybC5ob3N0ID0gbnVsbDtcbiAgICB1cmwucG9ydCA9IG51bGw7XG4gICAgdXJsLnBhdGggPSBbXTtcbiAgICB1cmwucXVlcnkgPSBudWxsO1xuICAgIHVybC5mcmFnbWVudCA9IG51bGw7XG4gICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSBmYWxzZTtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSwgJycpO1xuICB9XG5cbiAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFRBQl9BTkRfTkVXX0xJTkUsICcnKTtcblxuICBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKGlucHV0KTtcblxuICB3aGlsZSAocG9pbnRlciA8PSBjb2RlUG9pbnRzLmxlbmd0aCkge1xuICAgIGNoYXIgPSBjb2RlUG9pbnRzW3BvaW50ZXJdO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgU0NIRU1FX1NUQVJUOlxuICAgICAgICBpZiAoY2hhciAmJiBBTFBIQS50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBzdGF0ZSA9IFNDSEVNRTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIHN0YXRlID0gTk9fU0NIRU1FO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfU0NIRU1FO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTQ0hFTUU6XG4gICAgICAgIGlmIChjaGFyICYmIChBTFBIQU5VTUVSSUMudGVzdChjaGFyKSB8fCBjaGFyID09ICcrJyB8fCBjaGFyID09ICctJyB8fCBjaGFyID09ICcuJykpIHtcbiAgICAgICAgICBidWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonKSB7XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgKFxuICAgICAgICAgICAgKGlzU3BlY2lhbCh1cmwpICE9IGhhcyhzcGVjaWFsU2NoZW1lcywgYnVmZmVyKSkgfHxcbiAgICAgICAgICAgIChidWZmZXIgPT0gJ2ZpbGUnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpKSB8fFxuICAgICAgICAgICAgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwuaG9zdClcbiAgICAgICAgICApKSByZXR1cm47XG4gICAgICAgICAgdXJsLnNjaGVtZSA9IGJ1ZmZlcjtcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdID09IHVybC5wb3J0KSB1cmwucG9ydCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgICAgc3RhdGUgPSBGSUxFO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHVybCkgJiYgYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSB1cmwuc2NoZW1lKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHVybCkpIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludHNbcG9pbnRlciArIDFdID09ICcvJykge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIX09SX0FVVEhPUklUWTtcbiAgICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSB0cnVlO1xuICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICBzdGF0ZSA9IENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBOT19TQ0hFTUU7XG4gICAgICAgICAgcG9pbnRlciA9IDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE5PX1NDSEVNRTpcbiAgICAgICAgaWYgKCFiYXNlIHx8IChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciAhPSAnIycpKSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgIGlmIChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTtcbiAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnID8gRklMRSA6IFJFTEFUSVZFO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWTpcbiAgICAgICAgaWYgKGNoYXIgPT0gJy8nICYmIGNvZGVQb2ludHNbcG9pbnRlciArIDFdID09ICcvJykge1xuICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7XG4gICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUEFUSF9PUl9BVVRIT1JJVFk6XG4gICAgICAgIGlmIChjaGFyID09ICcvJykge1xuICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFTEFUSVZFOlxuICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgIGlmIChjaGFyID09IEVPRikge1xuICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycgfHwgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkge1xuICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkVfU0xBU0g7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTtcbiAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgIHVybC5wYXRoLnBvcCgpO1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBSRUxBVElWRV9TTEFTSDpcbiAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXFxcJykpIHtcbiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJy8nKSB7XG4gICAgICAgICAgc3RhdGUgPSBBVVRIT1JJVFk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTOlxuICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICBpZiAoY2hhciAhPSAnLycgfHwgYnVmZmVyLmNoYXJBdChwb2ludGVyICsgMSkgIT0gJy8nKSBjb250aW51ZTtcbiAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUzpcbiAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmIGNoYXIgIT0gJ1xcXFwnKSB7XG4gICAgICAgICAgc3RhdGUgPSBBVVRIT1JJVFk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgQVVUSE9SSVRZOlxuICAgICAgICBpZiAoY2hhciA9PSAnQCcpIHtcbiAgICAgICAgICBpZiAoc2VlbkF0KSBidWZmZXIgPSAnJTQwJyArIGJ1ZmZlcjtcbiAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgIGJ1ZmZlckNvZGVQb2ludHMgPSBhcnJheUZyb20oYnVmZmVyKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1ZmZlckNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBidWZmZXJDb2RlUG9pbnRzW2ldO1xuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSAnOicgJiYgIXNlZW5QYXNzd29yZFRva2VuKSB7XG4gICAgICAgICAgICAgIHNlZW5QYXNzd29yZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZW5jb2RlZENvZGVQb2ludHMgPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludCwgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgICAgIGlmIChzZWVuUGFzc3dvcmRUb2tlbikgdXJsLnBhc3N3b3JkICs9IGVuY29kZWRDb2RlUG9pbnRzO1xuICAgICAgICAgICAgZWxzZSB1cmwudXNlcm5hbWUgKz0gZW5jb2RlZENvZGVQb2ludHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnIHx8XG4gICAgICAgICAgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoc2VlbkF0ICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfQVVUSE9SSVRZO1xuICAgICAgICAgIHBvaW50ZXIgLT0gYXJyYXlGcm9tKGJ1ZmZlcikubGVuZ3RoICsgMTtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEhPU1Q7XG4gICAgICAgIH0gZWxzZSBidWZmZXIgKz0gY2hhcjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSE9TVDpcbiAgICAgIGNhc2UgSE9TVE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgc3RhdGUgPSBGSUxFX0hPU1Q7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnOicgJiYgIXNlZW5CcmFja2V0KSB7XG4gICAgICAgICAgaWYgKGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICAgICAgICBmYWlsdXJlID0gcGFyc2VIb3N0KHVybCwgYnVmZmVyKTtcbiAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBQT1JUO1xuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlID09IEhPU1ROQU1FKSByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHxcbiAgICAgICAgICAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChpc1NwZWNpYWwodXJsKSAmJiBidWZmZXIgPT0gJycpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgYnVmZmVyID09ICcnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpKSByZXR1cm47XG4gICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7XG4gICAgICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlO1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGFyID09ICdbJykgc2VlbkJyYWNrZXQgPSB0cnVlO1xuICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJ10nKSBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICAgICAgICAgIGJ1ZmZlciArPSBjaGFyO1xuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIFBPUlQ6XG4gICAgICAgIGlmIChESUdJVC50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHxcbiAgICAgICAgICAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpIHx8XG4gICAgICAgICAgc3RhdGVPdmVycmlkZVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoYnVmZmVyICE9ICcnKSB7XG4gICAgICAgICAgICB2YXIgcG9ydCA9IHBhcnNlSW50KGJ1ZmZlciwgMTApO1xuICAgICAgICAgICAgaWYgKHBvcnQgPiAweEZGRkYpIHJldHVybiBJTlZBTElEX1BPUlQ7XG4gICAgICAgICAgICB1cmwucG9ydCA9IChpc1NwZWNpYWwodXJsKSAmJiBwb3J0ID09PSBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSkgPyBudWxsIDogcG9ydDtcbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBJTlZBTElEX1BPUlQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZJTEU6XG4gICAgICAgIHVybC5zY2hlbWUgPSAnZmlsZSc7XG4gICAgICAgIGlmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXFxcJykgc3RhdGUgPSBGSUxFX1NMQVNIO1xuICAgICAgICBlbHNlIGlmIChiYXNlICYmIGJhc2Uuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgIGlmIChjaGFyID09IEVPRikge1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJz8nKSB7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcjJykge1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGNvZGVQb2ludHMuc2xpY2UocG9pbnRlcikuam9pbignJykpKSB7XG4gICAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgICBzaG9ydGVuVVJMc1BhdGgodXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgRklMRV9TTEFTSDpcbiAgICAgICAgaWYgKGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcXFwnKSB7XG4gICAgICAgICAgc3RhdGUgPSBGSUxFX0hPU1Q7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnICYmICFzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGNvZGVQb2ludHMuc2xpY2UocG9pbnRlcikuam9pbignJykpKSB7XG4gICAgICAgICAgaWYgKGlzV2luZG93c0RyaXZlTGV0dGVyKGJhc2UucGF0aFswXSwgdHJ1ZSkpIHVybC5wYXRoLnB1c2goYmFzZS5wYXRoWzBdKTtcbiAgICAgICAgICBlbHNlIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIGNhc2UgRklMRV9IT1NUOlxuICAgICAgICBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFxcXCcgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyID09ICcnKSB7XG4gICAgICAgICAgICB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICBpZiAodXJsLmhvc3QgPT0gJ2xvY2FsaG9zdCcpIHVybC5ob3N0ID0gJyc7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7XG4gICAgICAgICAgfSBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaGFyO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBQQVRIX1NUQVJUOlxuICAgICAgICBpZiAoaXNTcGVjaWFsKHVybCkpIHtcbiAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmIGNoYXIgIT0gJ1xcXFwnKSBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICc/Jykge1xuICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgIT0gRU9GKSB7XG4gICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIGlmIChjaGFyICE9ICcvJykgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUEFUSDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8XG4gICAgICAgICAgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKSB8fFxuICAgICAgICAgICghc3RhdGVPdmVycmlkZSAmJiAoY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoaXNEb3VibGVEb3QoYnVmZmVyKSkge1xuICAgICAgICAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7XG4gICAgICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgIShjaGFyID09ICdcXFxcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHtcbiAgICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1NpbmdsZURvdChidWZmZXIpKSB7XG4gICAgICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgIShjaGFyID09ICdcXFxcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHtcbiAgICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAhdXJsLnBhdGgubGVuZ3RoICYmIGlzV2luZG93c0RyaXZlTGV0dGVyKGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgaWYgKHVybC5ob3N0KSB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuY2hhckF0KDApICsgJzonOyAvLyBub3JtYWxpemUgd2luZG93cyBkcml2ZSBsZXR0ZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVybC5wYXRoLnB1c2goYnVmZmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpIHtcbiAgICAgICAgICAgIHdoaWxlICh1cmwucGF0aC5sZW5ndGggPiAxICYmIHVybC5wYXRoWzBdID09PSAnJykge1xuICAgICAgICAgICAgICB1cmwucGF0aC5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSBRVUVSWTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RW5jb2RlKGNoYXIsIHBhdGhQZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBDQU5OT1RfQkVfQV9CQVNFX1VSTF9QQVRIOlxuICAgICAgICBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikge1xuICAgICAgICAgIHVybC5wYXRoWzBdICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUVVFUlk6XG4gICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICcjJykge1xuICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciAhPSBFT0YpIHtcbiAgICAgICAgICBpZiAoY2hhciA9PSBcIidcIiAmJiBpc1NwZWNpYWwodXJsKSkgdXJsLnF1ZXJ5ICs9ICclMjcnO1xuICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB1cmwucXVlcnkgKz0gJyUyMyc7XG4gICAgICAgICAgZWxzZSB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaGFyLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBGUkFHTUVOVDpcbiAgICAgICAgaWYgKGNoYXIgIT0gRU9GKSB1cmwuZnJhZ21lbnQgKz0gcGVyY2VudEVuY29kZShjaGFyLCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBwb2ludGVyKys7XG4gIH1cbn07XG5cbi8vIGBVUkxgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1jbGFzc1xudmFyIFVSTENvbnN0cnVjdG9yID0gZnVuY3Rpb24gVVJMKHVybCAvKiAsIGJhc2UgKi8pIHtcbiAgdmFyIHRoYXQgPSBhbkluc3RhbmNlKHRoaXMsIFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7XG4gIHZhciBiYXNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciB1cmxTdHJpbmcgPSBTdHJpbmcodXJsKTtcbiAgdmFyIHN0YXRlID0gc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7IHR5cGU6ICdVUkwnIH0pO1xuICB2YXIgYmFzZVN0YXRlLCBmYWlsdXJlO1xuICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGJhc2UgaW5zdGFuY2VvZiBVUkxDb25zdHJ1Y3RvcikgYmFzZVN0YXRlID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZShiYXNlKTtcbiAgICBlbHNlIHtcbiAgICAgIGZhaWx1cmUgPSBwYXJzZVVSTChiYXNlU3RhdGUgPSB7fSwgU3RyaW5nKGJhc2UpKTtcbiAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7XG4gICAgfVxuICB9XG4gIGZhaWx1cmUgPSBwYXJzZVVSTChzdGF0ZSwgdXJsU3RyaW5nLCBudWxsLCBiYXNlU3RhdGUpO1xuICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICB2YXIgc2VhcmNoUGFyYW1zID0gc3RhdGUuc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICB2YXIgc2VhcmNoUGFyYW1zU3RhdGUgPSBnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlKHNlYXJjaFBhcmFtcyk7XG4gIHNlYXJjaFBhcmFtc1N0YXRlLnVwZGF0ZVNlYXJjaFBhcmFtcyhzdGF0ZS5xdWVyeSk7XG4gIHNlYXJjaFBhcmFtc1N0YXRlLnVwZGF0ZVVSTCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzdGF0ZS5xdWVyeSA9IFN0cmluZyhzZWFyY2hQYXJhbXMpIHx8IG51bGw7XG4gIH07XG4gIGlmICghREVTQ1JJUFRPUlMpIHtcbiAgICB0aGF0LmhyZWYgPSBzZXJpYWxpemVVUkwuY2FsbCh0aGF0KTtcbiAgICB0aGF0Lm9yaWdpbiA9IGdldE9yaWdpbi5jYWxsKHRoYXQpO1xuICAgIHRoYXQucHJvdG9jb2wgPSBnZXRQcm90b2NvbC5jYWxsKHRoYXQpO1xuICAgIHRoYXQudXNlcm5hbWUgPSBnZXRVc2VybmFtZS5jYWxsKHRoYXQpO1xuICAgIHRoYXQucGFzc3dvcmQgPSBnZXRQYXNzd29yZC5jYWxsKHRoYXQpO1xuICAgIHRoYXQuaG9zdCA9IGdldEhvc3QuY2FsbCh0aGF0KTtcbiAgICB0aGF0Lmhvc3RuYW1lID0gZ2V0SG9zdG5hbWUuY2FsbCh0aGF0KTtcbiAgICB0aGF0LnBvcnQgPSBnZXRQb3J0LmNhbGwodGhhdCk7XG4gICAgdGhhdC5wYXRobmFtZSA9IGdldFBhdGhuYW1lLmNhbGwodGhhdCk7XG4gICAgdGhhdC5zZWFyY2ggPSBnZXRTZWFyY2guY2FsbCh0aGF0KTtcbiAgICB0aGF0LnNlYXJjaFBhcmFtcyA9IGdldFNlYXJjaFBhcmFtcy5jYWxsKHRoYXQpO1xuICAgIHRoYXQuaGFzaCA9IGdldEhhc2guY2FsbCh0aGF0KTtcbiAgfVxufTtcblxudmFyIFVSTFByb3RvdHlwZSA9IFVSTENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxudmFyIHNlcmlhbGl6ZVVSTCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lO1xuICB2YXIgdXNlcm5hbWUgPSB1cmwudXNlcm5hbWU7XG4gIHZhciBwYXNzd29yZCA9IHVybC5wYXNzd29yZDtcbiAgdmFyIGhvc3QgPSB1cmwuaG9zdDtcbiAgdmFyIHBvcnQgPSB1cmwucG9ydDtcbiAgdmFyIHBhdGggPSB1cmwucGF0aDtcbiAgdmFyIHF1ZXJ5ID0gdXJsLnF1ZXJ5O1xuICB2YXIgZnJhZ21lbnQgPSB1cmwuZnJhZ21lbnQ7XG4gIHZhciBvdXRwdXQgPSBzY2hlbWUgKyAnOic7XG4gIGlmIChob3N0ICE9PSBudWxsKSB7XG4gICAgb3V0cHV0ICs9ICcvLyc7XG4gICAgaWYgKGluY2x1ZGVzQ3JlZGVudGlhbHModXJsKSkge1xuICAgICAgb3V0cHV0ICs9IHVzZXJuYW1lICsgKHBhc3N3b3JkID8gJzonICsgcGFzc3dvcmQgOiAnJykgKyAnQCc7XG4gICAgfVxuICAgIG91dHB1dCArPSBzZXJpYWxpemVIb3N0KGhvc3QpO1xuICAgIGlmIChwb3J0ICE9PSBudWxsKSBvdXRwdXQgKz0gJzonICsgcG9ydDtcbiAgfSBlbHNlIGlmIChzY2hlbWUgPT0gJ2ZpbGUnKSBvdXRwdXQgKz0gJy8vJztcbiAgb3V0cHV0ICs9IHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgcGF0aC5qb2luKCcvJykgOiAnJztcbiAgaWYgKHF1ZXJ5ICE9PSBudWxsKSBvdXRwdXQgKz0gJz8nICsgcXVlcnk7XG4gIGlmIChmcmFnbWVudCAhPT0gbnVsbCkgb3V0cHV0ICs9ICcjJyArIGZyYWdtZW50O1xuICByZXR1cm4gb3V0cHV0O1xufTtcblxudmFyIGdldE9yaWdpbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lO1xuICB2YXIgcG9ydCA9IHVybC5wb3J0O1xuICBpZiAoc2NoZW1lID09ICdibG9iJykgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTChzY2hlbWUucGF0aFswXSkub3JpZ2luO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH1cbiAgaWYgKHNjaGVtZSA9PSAnZmlsZScgfHwgIWlzU3BlY2lhbCh1cmwpKSByZXR1cm4gJ251bGwnO1xuICByZXR1cm4gc2NoZW1lICsgJzovLycgKyBzZXJpYWxpemVIb3N0KHVybC5ob3N0KSArIChwb3J0ICE9PSBudWxsID8gJzonICsgcG9ydCA6ICcnKTtcbn07XG5cbnZhciBnZXRQcm90b2NvbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2NoZW1lICsgJzonO1xufTtcblxudmFyIGdldFVzZXJuYW1lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS51c2VybmFtZTtcbn07XG5cbnZhciBnZXRQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykucGFzc3dvcmQ7XG59O1xuXG52YXIgZ2V0SG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBob3N0ID0gdXJsLmhvc3Q7XG4gIHZhciBwb3J0ID0gdXJsLnBvcnQ7XG4gIHJldHVybiBob3N0ID09PSBudWxsID8gJydcbiAgICA6IHBvcnQgPT09IG51bGwgPyBzZXJpYWxpemVIb3N0KGhvc3QpXG4gICAgOiBzZXJpYWxpemVIb3N0KGhvc3QpICsgJzonICsgcG9ydDtcbn07XG5cbnZhciBnZXRIb3N0bmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhvc3QgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLmhvc3Q7XG4gIHJldHVybiBob3N0ID09PSBudWxsID8gJycgOiBzZXJpYWxpemVIb3N0KGhvc3QpO1xufTtcblxudmFyIGdldFBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwb3J0ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5wb3J0O1xuICByZXR1cm4gcG9ydCA9PT0gbnVsbCA/ICcnIDogU3RyaW5nKHBvcnQpO1xufTtcblxudmFyIGdldFBhdGhuYW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgdmFyIHBhdGggPSB1cmwucGF0aDtcbiAgcmV0dXJuIHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgcGF0aC5qb2luKCcvJykgOiAnJztcbn07XG5cbnZhciBnZXRTZWFyY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBxdWVyeSA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykucXVlcnk7XG4gIHJldHVybiBxdWVyeSA/ICc/JyArIHF1ZXJ5IDogJyc7XG59O1xuXG52YXIgZ2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5zZWFyY2hQYXJhbXM7XG59O1xuXG52YXIgZ2V0SGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZyYWdtZW50ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5mcmFnbWVudDtcbiAgcmV0dXJuIGZyYWdtZW50ID8gJyMnICsgZnJhZ21lbnQgOiAnJztcbn07XG5cbnZhciBhY2Nlc3NvckRlc2NyaXB0b3IgPSBmdW5jdGlvbiAoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIHsgZ2V0OiBnZXR0ZXIsIHNldDogc2V0dGVyLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUgfTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICBkZWZpbmVQcm9wZXJ0aWVzKFVSTFByb3RvdHlwZSwge1xuICAgIC8vIGBVUkwucHJvdG90eXBlLmhyZWZgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhyZWZcbiAgICBocmVmOiBhY2Nlc3NvckRlc2NyaXB0b3Ioc2VyaWFsaXplVVJMLCBmdW5jdGlvbiAoaHJlZikge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICB2YXIgdXJsU3RyaW5nID0gU3RyaW5nKGhyZWYpO1xuICAgICAgdmFyIGZhaWx1cmUgPSBwYXJzZVVSTCh1cmwsIHVybFN0cmluZyk7XG4gICAgICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICAgICAgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSh1cmwuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXModXJsLnF1ZXJ5KTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5vcmlnaW5gIGdldHRlclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1vcmlnaW5cbiAgICBvcmlnaW46IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRPcmlnaW4pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnByb3RvY29sYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wcm90b2NvbFxuICAgIHByb3RvY29sOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UHJvdG9jb2wsIGZ1bmN0aW9uIChwcm90b2NvbCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhwcm90b2NvbCkgKyAnOicsIFNDSEVNRV9TVEFSVCk7XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUudXNlcm5hbWVgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXVzZXJuYW1lXG4gICAgdXNlcm5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRVc2VybmFtZSwgZnVuY3Rpb24gKHVzZXJuYW1lKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKFN0cmluZyh1c2VybmFtZSkpO1xuICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47XG4gICAgICB1cmwudXNlcm5hbWUgPSAnJztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cmwudXNlcm5hbWUgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2ldLCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnBhc3N3b3JkYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wYXNzd29yZFxuICAgIHBhc3N3b3JkOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UGFzc3dvcmQsIGZ1bmN0aW9uIChwYXNzd29yZCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICB2YXIgY29kZVBvaW50cyA9IGFycmF5RnJvbShTdHJpbmcocGFzc3dvcmQpKTtcbiAgICAgIGlmIChjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQodXJsKSkgcmV0dXJuO1xuICAgICAgdXJsLnBhc3N3b3JkID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXJsLnBhc3N3b3JkICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpXSwgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0YCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ob3N0XG4gICAgaG9zdDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldEhvc3QsIGZ1bmN0aW9uIChob3N0KSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuO1xuICAgICAgcGFyc2VVUkwodXJsLCBTdHJpbmcoaG9zdCksIEhPU1QpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLmhvc3RuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ob3N0bmFtZVxuICAgIGhvc3RuYW1lOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdG5hbWUsIGZ1bmN0aW9uIChob3N0bmFtZSkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBpZiAodXJsLmNhbm5vdEJlQUJhc2VVUkwpIHJldHVybjtcbiAgICAgIHBhcnNlVVJMKHVybCwgU3RyaW5nKGhvc3RuYW1lKSwgSE9TVE5BTUUpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnBvcnRgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXBvcnRcbiAgICBwb3J0OiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UG9ydCwgZnVuY3Rpb24gKHBvcnQpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47XG4gICAgICBwb3J0ID0gU3RyaW5nKHBvcnQpO1xuICAgICAgaWYgKHBvcnQgPT0gJycpIHVybC5wb3J0ID0gbnVsbDtcbiAgICAgIGVsc2UgcGFyc2VVUkwodXJsLCBwb3J0LCBQT1JUKTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5wYXRobmFtZWAgYWNjZXNzb3JzIHBhaXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgICBwYXRobmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFBhdGhuYW1lLCBmdW5jdGlvbiAocGF0aG5hbWUpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgaWYgKHVybC5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgICB1cmwucGF0aCA9IFtdO1xuICAgICAgcGFyc2VVUkwodXJsLCBwYXRobmFtZSArICcnLCBQQVRIX1NUQVJUKTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5zZWFyY2hgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXNlYXJjaFxuICAgIHNlYXJjaDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFNlYXJjaCwgZnVuY3Rpb24gKHNlYXJjaCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTtcbiAgICAgIGlmIChzZWFyY2ggPT0gJycpIHtcbiAgICAgICAgdXJsLnF1ZXJ5ID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgnPycgPT0gc2VhcmNoLmNoYXJBdCgwKSkgc2VhcmNoID0gc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgcGFyc2VVUkwodXJsLCBzZWFyY2gsIFFVRVJZKTtcbiAgICAgIH1cbiAgICAgIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUodXJsLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHVybC5xdWVyeSk7XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUuc2VhcmNoUGFyYW1zYCBnZXR0ZXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNocGFyYW1zXG4gICAgc2VhcmNoUGFyYW1zOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0U2VhcmNoUGFyYW1zKSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5oYXNoYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1oYXNoXG4gICAgaGFzaDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldEhhc2gsIGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIGhhc2ggPSBTdHJpbmcoaGFzaCk7XG4gICAgICBpZiAoaGFzaCA9PSAnJykge1xuICAgICAgICB1cmwuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJyMnID09IGhhc2guY2hhckF0KDApKSBoYXNoID0gaGFzaC5zbGljZSgxKTtcbiAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgcGFyc2VVUkwodXJsLCBoYXNoLCBGUkFHTUVOVCk7XG4gICAgfSlcbiAgfSk7XG59XG5cbi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdG9qc29uXG5yZWRlZmluZShVUkxQcm90b3R5cGUsICd0b0pTT04nLCBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIHJldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKTtcbn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLy8gYFVSTC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNVUkwtc3RyaW5naWZpY2F0aW9uLWJlaGF2aW9yXG5yZWRlZmluZShVUkxQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gc2VyaWFsaXplVVJMLmNhbGwodGhpcyk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbmlmIChOYXRpdmVVUkwpIHtcbiAgdmFyIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCA9IE5hdGl2ZVVSTC5jcmVhdGVPYmplY3RVUkw7XG4gIHZhciBuYXRpdmVSZXZva2VPYmplY3RVUkwgPSBOYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMO1xuICAvLyBgVVJMLmNyZWF0ZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvY3JlYXRlT2JqZWN0VVJMXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBpZiAobmF0aXZlQ3JlYXRlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ2NyZWF0ZU9iamVjdFVSTCcsIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChibG9iKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTC5hcHBseShOYXRpdmVVUkwsIGFyZ3VtZW50cyk7XG4gIH0pO1xuICAvLyBgVVJMLnJldm9rZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvcmV2b2tlT2JqZWN0VVJMXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBpZiAobmF0aXZlUmV2b2tlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHtcbiAgICByZXR1cm4gbmF0aXZlUmV2b2tlT2JqZWN0VVJMLmFwcGx5KE5hdGl2ZVVSTCwgYXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbnNldFRvU3RyaW5nVGFnKFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7XG5cbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBVUkw6IFVSTENvbnN0cnVjdG9yXG59KTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IG5ldyBVUkwoJ2I/YT0xJmI9MiZjPTMnLCAnaHR0cDovL2EnKTtcbiAgdmFyIHNlYXJjaFBhcmFtcyA9IHVybC5zZWFyY2hQYXJhbXM7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdXJsLnBhdGhuYW1lID0gJ2MlMjBkJztcbiAgc2VhcmNoUGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBzZWFyY2hQYXJhbXNbJ2RlbGV0ZSddKCdiJyk7XG4gICAgcmVzdWx0ICs9IGtleSArIHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIChJU19QVVJFICYmICF1cmwudG9KU09OKVxuICAgIHx8ICFzZWFyY2hQYXJhbXMuc29ydFxuICAgIHx8IHVybC5ocmVmICE9PSAnaHR0cDovL2EvYyUyMGQ/YT0xJmM9MydcbiAgICB8fCBzZWFyY2hQYXJhbXMuZ2V0KCdjJykgIT09ICczJ1xuICAgIHx8IFN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKCc/YT0xJykpICE9PSAnYT0xJ1xuICAgIHx8ICFzZWFyY2hQYXJhbXNbSVRFUkFUT1JdXG4gICAgLy8gdGhyb3dzIGluIEVkZ2VcbiAgICB8fCBuZXcgVVJMKCdodHRwczovL2FAYicpLnVzZXJuYW1lICE9PSAnYSdcbiAgICB8fCBuZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoJ2E9YicpKS5nZXQoJ2EnKSAhPT0gJ2InXG4gICAgLy8gbm90IHB1bnljb2RlZCBpbiBFZGdlXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL9GC0LXRgdGCJykuaG9zdCAhPT0gJ3huLS1lMWF5YmMnXG4gICAgLy8gbm90IGVzY2FwZWQgaW4gQ2hyb21lIDYyLVxuICAgIHx8IG5ldyBVUkwoJ2h0dHA6Ly9hI9CxJykuaGFzaCAhPT0gJyMlRDAlQjEnXG4gICAgLy8gZmFpbHMgaW4gQ2hyb21lIDY2LVxuICAgIHx8IHJlc3VsdCAhPT0gJ2ExYzMnXG4gICAgLy8gdGhyb3dzIGluIFNhZmFyaVxuICAgIHx8IG5ldyBVUkwoJ2h0dHA6Ly94JywgdW5kZWZpbmVkKS5ob3N0ICE9PSAneCc7XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9wdW55Y29kZS5qcy9ibG9iL21hc3Rlci9wdW55Y29kZS5qc1xudmFyIG1heEludCA9IDIxNDc0ODM2NDc7IC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcbnZhciBiYXNlID0gMzY7XG52YXIgdE1pbiA9IDE7XG52YXIgdE1heCA9IDI2O1xudmFyIHNrZXcgPSAzODtcbnZhciBkYW1wID0gNzAwO1xudmFyIGluaXRpYWxCaWFzID0gNzI7XG52YXIgaW5pdGlhbE4gPSAxMjg7IC8vIDB4ODBcbnZhciBkZWxpbWl0ZXIgPSAnLSc7IC8vICdcXHgyRCdcbnZhciByZWdleE5vbkFTQ0lJID0gL1teXFwwLVxcdTAwN0VdLzsgLy8gbm9uLUFTQ0lJIGNoYXJzXG52YXIgcmVnZXhTZXBhcmF0b3JzID0gL1suXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nOyAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG52YXIgT1ZFUkZMT1dfRVJST1IgPSAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnO1xudmFyIGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbjtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKi9cbnZhciB1Y3MyZGVjb2RlID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBjb3VudGVyID0gMDtcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcbiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgICAvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuICAgICAgdmFyIGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcbiAgICAgIGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLlxuICAgICAgICBvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGVcbiAgICAgICAgLy8gbmV4dCBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuXG4gICAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTtcbiAgICAgICAgY291bnRlci0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqL1xudmFyIGRpZ2l0VG9CYXNpYyA9IGZ1bmN0aW9uIChkaWdpdCkge1xuICAvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuICAvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcbiAgcmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KTtcbn07XG5cbi8qKlxuICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG4gKi9cbnZhciBhZGFwdCA9IGZ1bmN0aW9uIChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcbiAgdmFyIGsgPSAwO1xuICBkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuICBkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG4gIGZvciAoOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuICAgIGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcbiAgfVxuICByZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcbiAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgbWF4LXN0YXRlbWVudHNcbnZhciBlbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuXG4gIC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG4gIGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cbiAgLy8gQ2FjaGUgdGhlIGxlbmd0aC5cbiAgdmFyIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuICB2YXIgbiA9IGluaXRpYWxOO1xuICB2YXIgZGVsdGEgPSAwO1xuICB2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuICB2YXIgaSwgY3VycmVudFZhbHVlO1xuXG4gIC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgIGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG4gICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDsgLy8gbnVtYmVyIG9mIGJhc2ljIGNvZGUgcG9pbnRzLlxuICB2YXIgaGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aDsgLy8gbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cbiAgLy8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS5cbiAgaWYgKGJhc2ljTGVuZ3RoKSB7XG4gICAgb3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcbiAgfVxuXG4gIC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcbiAgd2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcbiAgICAvLyBBbGwgbm9uLWJhc2ljIGNvZGUgcG9pbnRzIDwgbiBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LiBGaW5kIHRoZSBuZXh0IGxhcmdlciBvbmU6XG4gICAgdmFyIG0gPSBtYXhJbnQ7XG4gICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG4gICAgICAgIG0gPSBjdXJyZW50VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LCBidXQgZ3VhcmQgYWdhaW5zdCBvdmVyZmxvdy5cbiAgICB2YXIgaGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxO1xuICAgIGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTtcbiAgICB9XG5cbiAgICBkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuICAgIG4gPSBtO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihPVkVSRkxPV19FUlJPUik7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFZhbHVlID09IG4pIHtcbiAgICAgICAgLy8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuXG4gICAgICAgIHZhciBxID0gZGVsdGE7XG4gICAgICAgIGZvciAodmFyIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuICAgICAgICAgIHZhciB0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcbiAgICAgICAgICBpZiAocSA8IHQpIGJyZWFrO1xuICAgICAgICAgIHZhciBxTWludXNUID0gcSAtIHQ7XG4gICAgICAgICAgdmFyIGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcbiAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCkpKTtcbiAgICAgICAgICBxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxKSkpO1xuICAgICAgICBiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuICAgICAgICBkZWx0YSA9IDA7XG4gICAgICAgICsraGFuZGxlZENQQ291bnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgKytkZWx0YTtcbiAgICArK247XG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gIHZhciBlbmNvZGVkID0gW107XG4gIHZhciBsYWJlbHMgPSBpbnB1dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx1MDAyRScpLnNwbGl0KCcuJyk7XG4gIHZhciBpLCBsYWJlbDtcbiAgZm9yIChpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgIGxhYmVsID0gbGFiZWxzW2ldO1xuICAgIGVuY29kZWQucHVzaChyZWdleE5vbkFTQ0lJLnRlc3QobGFiZWwpID8gJ3huLS0nICsgZW5jb2RlKGxhYmVsKSA6IGxhYmVsKTtcbiAgfVxuICByZXR1cm4gZW5jb2RlZC5qb2luKCcuJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogaW4gY29yZS1qc0A0LCBtb3ZlIC9tb2R1bGVzLyBkZXBlbmRlbmNpZXMgdG8gcHVibGljIGVudHJpZXMgZm9yIGJldHRlciBvcHRpbWl6YXRpb24gYnkgdG9vbHMgbGlrZSBgcHJlc2V0LWVudmBcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgVVNFX05BVElWRV9VUkwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXVybCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciAkZmV0Y2ggPSBnZXRCdWlsdEluKCdmZXRjaCcpO1xudmFyIEhlYWRlcnMgPSBnZXRCdWlsdEluKCdIZWFkZXJzJyk7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgVVJMX1NFQVJDSF9QQVJBTVMgPSAnVVJMU2VhcmNoUGFyYW1zJztcbnZhciBVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUiA9IFVSTF9TRUFSQ0hfUEFSQU1TICsgJ0l0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFVSTF9TRUFSQ0hfUEFSQU1TKTtcbnZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUik7XG5cbnZhciBwbHVzID0gL1xcKy9nO1xudmFyIHNlcXVlbmNlcyA9IEFycmF5KDQpO1xuXG52YXIgcGVyY2VudFNlcXVlbmNlID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHJldHVybiBzZXF1ZW5jZXNbYnl0ZXMgLSAxXSB8fCAoc2VxdWVuY2VzW2J5dGVzIC0gMV0gPSBSZWdFeHAoJygoPzolW1xcXFxkYS1mXXsyfSl7JyArIGJ5dGVzICsgJ30pJywgJ2dpJykpO1xufTtcblxudmFyIHBlcmNlbnREZWNvZGUgPSBmdW5jdGlvbiAoc2VxdWVuY2UpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHNlcXVlbmNlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gc2VxdWVuY2U7XG4gIH1cbn07XG5cbnZhciBkZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gaXQucmVwbGFjZShwbHVzLCAnICcpO1xuICB2YXIgYnl0ZXMgPSA0O1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB3aGlsZSAoYnl0ZXMpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHBlcmNlbnRTZXF1ZW5jZShieXRlcy0tKSwgcGVyY2VudERlY29kZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmaW5kID0gL1shJygpfl18JTIwL2c7XG5cbnZhciByZXBsYWNlID0ge1xuICAnISc6ICclMjEnLFxuICBcIidcIjogJyUyNycsXG4gICcoJzogJyUyOCcsXG4gICcpJzogJyUyOScsXG4gICd+JzogJyU3RScsXG4gICclMjAnOiAnKydcbn07XG5cbnZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICByZXR1cm4gcmVwbGFjZVttYXRjaF07XG59O1xuXG52YXIgc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoaXQpLnJlcGxhY2UoZmluZCwgcmVwbGFjZXIpO1xufTtcblxudmFyIHBhcnNlU2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHJlc3VsdCwgcXVlcnkpIHtcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBxdWVyeS5zcGxpdCgnJicpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGF0dHJpYnV0ZSwgZW50cnk7XG4gICAgd2hpbGUgKGluZGV4IDwgYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaW5kZXgrK107XG4gICAgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkge1xuICAgICAgICBlbnRyeSA9IGF0dHJpYnV0ZS5zcGxpdCgnPScpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAga2V5OiBkZXNlcmlhbGl6ZShlbnRyeS5zaGlmdCgpKSxcbiAgICAgICAgICB2YWx1ZTogZGVzZXJpYWxpemUoZW50cnkuam9pbignPScpKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciB1cGRhdGVTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAocXVlcnkpIHtcbiAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG4gIHBhcnNlU2VhcmNoUGFyYW1zKHRoaXMuZW50cmllcywgcXVlcnkpO1xufTtcblxudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gZnVuY3Rpb24gKHBhc3NlZCwgcmVxdWlyZWQpIHtcbiAgaWYgKHBhc3NlZCA8IHJlcXVpcmVkKSB0aHJvdyBUeXBlRXJyb3IoJ05vdCBlbm91Z2ggYXJndW1lbnRzJyk7XG59O1xuXG52YXIgVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IgPSBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKGZ1bmN0aW9uIEl0ZXJhdG9yKHBhcmFtcywga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUixcbiAgICBpdGVyYXRvcjogZ2V0SXRlcmF0b3IoZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZShwYXJhbXMpLmVudHJpZXMpLFxuICAgIGtpbmQ6IGtpbmRcbiAgfSk7XG59LCAnSXRlcmF0b3InLCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7XG4gIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgdmFyIHN0ZXAgPSBzdGF0ZS5pdGVyYXRvci5uZXh0KCk7XG4gIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gIGlmICghc3RlcC5kb25lKSB7XG4gICAgc3RlcC52YWx1ZSA9IGtpbmQgPT09ICdrZXlzJyA/IGVudHJ5LmtleSA6IGtpbmQgPT09ICd2YWx1ZXMnID8gZW50cnkudmFsdWUgOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV07XG4gIH0gcmV0dXJuIHN0ZXA7XG59KTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLXVybHNlYXJjaHBhcmFtc1xudmFyIFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gVVJMU2VhcmNoUGFyYW1zKC8qIGluaXQgKi8pIHtcbiAgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciwgVVJMX1NFQVJDSF9QQVJBTVMpO1xuICB2YXIgaW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgdGhhdCA9IHRoaXM7XG4gIHZhciBlbnRyaWVzID0gW107XG4gIHZhciBpdGVyYXRvck1ldGhvZCwgaXRlcmF0b3IsIG5leHQsIHN0ZXAsIGVudHJ5SXRlcmF0b3IsIGVudHJ5TmV4dCwgZmlyc3QsIHNlY29uZCwga2V5O1xuXG4gIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgIHR5cGU6IFVSTF9TRUFSQ0hfUEFSQU1TLFxuICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgdXBkYXRlVVJMOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sXG4gICAgdXBkYXRlU2VhcmNoUGFyYW1zOiB1cGRhdGVTZWFyY2hQYXJhbXNcbiAgfSk7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChpc09iamVjdChpbml0KSkge1xuICAgICAgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChpbml0KTtcbiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JNZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKGluaXQpO1xuICAgICAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHtcbiAgICAgICAgICBlbnRyeUl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoYW5PYmplY3Qoc3RlcC52YWx1ZSkpO1xuICAgICAgICAgIGVudHJ5TmV4dCA9IGVudHJ5SXRlcmF0b3IubmV4dDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoZmlyc3QgPSBlbnRyeU5leHQuY2FsbChlbnRyeUl0ZXJhdG9yKSkuZG9uZSB8fFxuICAgICAgICAgICAgKHNlY29uZCA9IGVudHJ5TmV4dC5jYWxsKGVudHJ5SXRlcmF0b3IpKS5kb25lIHx8XG4gICAgICAgICAgICAhZW50cnlOZXh0LmNhbGwoZW50cnlJdGVyYXRvcikuZG9uZVxuICAgICAgICAgICkgdGhyb3cgVHlwZUVycm9yKCdFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyJyk7XG4gICAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiBmaXJzdC52YWx1ZSArICcnLCB2YWx1ZTogc2Vjb25kLnZhbHVlICsgJycgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBmb3IgKGtleSBpbiBpbml0KSBpZiAoaGFzT3duKGluaXQsIGtleSkpIGVudHJpZXMucHVzaCh7IGtleToga2V5LCB2YWx1ZTogaW5pdFtrZXldICsgJycgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlU2VhcmNoUGFyYW1zKGVudHJpZXMsIHR5cGVvZiBpbml0ID09PSAnc3RyaW5nJyA/IGluaXQuY2hhckF0KDApID09PSAnPycgPyBpbml0LnNsaWNlKDEpIDogaW5pdCA6IGluaXQgKyAnJyk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlID0gVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG5yZWRlZmluZUFsbChVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsIHtcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuYXBwZW50YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWFwcGVuZFxuICBhcHBlbmQ6IGZ1bmN0aW9uIGFwcGVuZChuYW1lLCB2YWx1ZSkge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDIpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgc3RhdGUuZW50cmllcy5wdXNoKHsga2V5OiBuYW1lICsgJycsIHZhbHVlOiB2YWx1ZSArICcnIH0pO1xuICAgIHN0YXRlLnVwZGF0ZVVSTCgpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5kZWxldGVgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZGVsZXRlXG4gICdkZWxldGUnOiBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzO1xuICAgIHZhciBrZXkgPSBuYW1lICsgJyc7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KSBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBlbHNlIGluZGV4Kys7XG4gICAgfVxuICAgIHN0YXRlLnVwZGF0ZVVSTCgpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5nZXRgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZ2V0XG4gIGdldDogZnVuY3Rpb24gZ2V0KG5hbWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgICB2YXIga2V5ID0gbmFtZSArICcnO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgZm9yICg7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgcmV0dXJuIGVudHJpZXNbaW5kZXhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZ2V0QWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWdldGFsbFxuICBnZXRBbGw6IGZ1bmN0aW9uIGdldEFsbChuYW1lKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGtleSA9IG5hbWUgKyAnJztcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KSByZXN1bHQucHVzaChlbnRyaWVzW2luZGV4XS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmhhc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXNcbiAgaGFzOiBmdW5jdGlvbiBoYXMobmFtZSkge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBrZXkgPSBuYW1lICsgJyc7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXgrK10ua2V5ID09PSBrZXkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNldGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zZXRcbiAgc2V0OiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICB2YXIga2V5ID0gbmFtZSArICcnO1xuICAgIHZhciB2YWwgPSB2YWx1ZSArICcnO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChmb3VuZCkgZW50cmllcy5zcGxpY2UoaW5kZXgtLSwgMSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZvdW5kKSBlbnRyaWVzLnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IHZhbCB9KTtcbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zb3J0XG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoKSB7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTtcbiAgICB2YXIgZW50cmllcyA9IHN0YXRlLmVudHJpZXM7XG4gICAgLy8gQXJyYXkjc29ydCBpcyBub3Qgc3RhYmxlIGluIHNvbWUgZW5naW5lc1xuICAgIHZhciBzbGljZSA9IGVudHJpZXMuc2xpY2UoKTtcbiAgICB2YXIgZW50cnksIGVudHJpZXNJbmRleCwgc2xpY2VJbmRleDtcbiAgICBlbnRyaWVzLmxlbmd0aCA9IDA7XG4gICAgZm9yIChzbGljZUluZGV4ID0gMDsgc2xpY2VJbmRleCA8IHNsaWNlLmxlbmd0aDsgc2xpY2VJbmRleCsrKSB7XG4gICAgICBlbnRyeSA9IHNsaWNlW3NsaWNlSW5kZXhdO1xuICAgICAgZm9yIChlbnRyaWVzSW5kZXggPSAwOyBlbnRyaWVzSW5kZXggPCBzbGljZUluZGV4OyBlbnRyaWVzSW5kZXgrKykge1xuICAgICAgICBpZiAoZW50cmllc1tlbnRyaWVzSW5kZXhdLmtleSA+IGVudHJ5LmtleSkge1xuICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGVudHJpZXNJbmRleCwgMCwgZW50cnkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZW50cmllc0luZGV4ID09PSBzbGljZUluZGV4KSBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4gIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2sgLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgZW50cnk7XG4gICAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTtcbiAgICAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7XG4gICAgfVxuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5rZXlzYCBtZXRob2RcbiAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICdrZXlzJyk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IodGhpcywgJ3ZhbHVlcycpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2RcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICdlbnRyaWVzJyk7XG4gIH1cbn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxucmVkZWZpbmUoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCBJVEVSQVRPUiwgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmVudHJpZXMpO1xuXG4vLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHNlYXJjaHBhcmFtcy1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbnJlZGVmaW5lKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcbiAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgcmVzdWx0LnB1c2goc2VyaWFsaXplKGVudHJ5LmtleSkgKyAnPScgKyBzZXJpYWxpemUoZW50cnkudmFsdWUpKTtcbiAgfSByZXR1cm4gcmVzdWx0LmpvaW4oJyYnKTtcbn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuc2V0VG9TdHJpbmdUYWcoVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTtcblxuJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhVVNFX05BVElWRV9VUkwgfSwge1xuICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yXG59KTtcblxuLy8gV3JhcCBgZmV0Y2hgIGZvciBjb3JyZWN0IHdvcmsgd2l0aCBwb2x5ZmlsbGVkIGBVUkxTZWFyY2hQYXJhbXNgXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc0XG5pZiAoIVVTRV9OQVRJVkVfVVJMICYmIHR5cGVvZiAkZmV0Y2ggPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSGVhZGVycyA9PSAnZnVuY3Rpb24nKSB7XG4gICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0IC8qICwgaW5pdCAqLykge1xuICAgICAgdmFyIGFyZ3MgPSBbaW5wdXRdO1xuICAgICAgdmFyIGluaXQsIGJvZHksIGhlYWRlcnM7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaW5pdCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGluaXQpKSB7XG4gICAgICAgICAgYm9keSA9IGluaXQuYm9keTtcbiAgICAgICAgICBpZiAoY2xhc3NvZihib2R5KSA9PT0gVVJMX1NFQVJDSF9QQVJBTVMpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBpbml0LmhlYWRlcnMgPyBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMpIDogbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgICAgIGlmICghaGVhZGVycy5oYXMoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXQgPSBjcmVhdGUoaW5pdCwge1xuICAgICAgICAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgU3RyaW5nKGJvZHkpKSxcbiAgICAgICAgICAgICAgaGVhZGVyczogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIGhlYWRlcnMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXJncy5wdXNoKGluaXQpO1xuICAgICAgfSByZXR1cm4gJGZldGNoLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLFxuICBnZXRTdGF0ZTogZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0KTtcbiAgaWYgKHR5cGVvZiBpdGVyYXRvck1ldGhvZCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICB9IHJldHVybiBhbk9iamVjdChpdGVyYXRvck1ldGhvZC5jYWxsKGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdG9qc29uXG4kKHsgdGFyZ2V0OiAnVVJMJywgcHJvdG86IHRydWUsIGVudW1lcmFibGU6IHRydWUgfSwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gVVJMLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMpO1xuICB9XG59KTtcbiIsIi8qKlxuICogd2ViLXN0cmVhbXMtcG9seWZpbGwgdjIuMS4xXG4gKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5XZWJTdHJlYW1zUG9seWZpbGwgPSB7fSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LnN5bWJvbFwiIC8+XG4gICAgdmFyIFN5bWJvbFBvbHlmaWxsID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/XG4gICAgICAgIFN5bWJvbCA6XG4gICAgICAgIGZ1bmN0aW9uIChkZXNjcmlwdGlvbikgeyByZXR1cm4gXCJTeW1ib2woXCIgKyBkZXNjcmlwdGlvbiArIFwiKVwiOyB9O1xuXG4gICAgLy8vIDxyZWZlcmVuY2UgbGliPVwiZG9tXCIgLz5cbiAgICBmdW5jdGlvbiBub29wKCkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc05hTiNQb2x5ZmlsbFxuICAgIHZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoeCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICAgIHJldHVybiB4ICE9PSB4O1xuICAgIH07XG5cbiAgICB2YXIgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uID0gIG5vb3A7XG5cbiAgICBmdW5jdGlvbiB0eXBlSXNPYmplY3QoeCkge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKSB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTGlzdChlbGVtZW50cykge1xuICAgICAgICAvLyBXZSB1c2UgYXJyYXlzIHRvIHJlcHJlc2VudCBsaXN0cywgc28gdGhpcyBpcyBiYXNpY2FsbHkgYSBuby1vcC5cbiAgICAgICAgLy8gRG8gYSBzbGljZSB0aG91Z2gganVzdCBpbiBjYXNlIHdlIGhhcHBlbiB0byBkZXBlbmQgb24gdGhlIHVuaXF1ZS1uZXNzLlxuICAgICAgICByZXR1cm4gZWxlbWVudHMuc2xpY2UoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gQXJyYXlCdWZmZXJDb3B5KGRlc3QsIGRlc3RPZmZzZXQsIHNyYywgc3JjT2Zmc2V0LCBuKSB7XG4gICAgICAgIG5ldyBVaW50OEFycmF5KGRlc3QpLnNldChuZXcgVWludDhBcnJheShzcmMsIHNyY09mZnNldCwgbiksIGRlc3RPZmZzZXQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHYpIHtcbiAgICAgICAgaWYgKElzTm9uTmVnYXRpdmVOdW1iZXIodikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHYgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIElzTm9uTmVnYXRpdmVOdW1iZXIodikge1xuICAgICAgICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlcklzTmFOKHYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHYgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIENhbGwoRiwgViwgYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIEYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKEYsIFYsIGFyZ3MpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nT2JqZWN0LCBtZXRob2ROYW1lLCBhbGdvQXJnQ291bnQsIGV4dHJhQXJncykge1xuICAgICAgICB2YXIgbWV0aG9kID0gdW5kZXJseWluZ09iamVjdFttZXRob2ROYW1lXTtcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobWV0aG9kICsgXCIgaXMgbm90IGEgbWV0aG9kXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChhbGdvQXJnQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlQ2FsbChtZXRob2QsIHVuZGVybHlpbmdPYmplY3QsIGV4dHJhQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bGxBcmdzID0gW2FyZ10uY29uY2F0KGV4dHJhQXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZUNhbGwobWV0aG9kLCB1bmRlcmx5aW5nT2JqZWN0LCBmdWxsQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7IH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIEludm9rZU9yTm9vcChPLCBQLCBhcmdzKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBPW1BdO1xuICAgICAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhbGwobWV0aG9kLCBPLCBhcmdzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUHJvbWlzZUNhbGwoRiwgViwgYXJncykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoQ2FsbChGLCBWLCBhcmdzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTm90IGltcGxlbWVudGVkIGNvcnJlY3RseVxuICAgIGZ1bmN0aW9uIFRyYW5zZmVyQXJyYXlCdWZmZXIoTykge1xuICAgICAgICByZXR1cm4gTztcbiAgICB9XG4gICAgLy8gTm90IGltcGxlbWVudGVkIGNvcnJlY3RseVxuICAgIGZ1bmN0aW9uIElzRGV0YWNoZWRCdWZmZXIoTykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKSB7XG4gICAgICAgIGhpZ2hXYXRlck1hcmsgPSBOdW1iZXIoaGlnaFdhdGVyTWFyayk7XG4gICAgICAgIGlmIChOdW1iZXJJc05hTihoaWdoV2F0ZXJNYXJrKSB8fCBoaWdoV2F0ZXJNYXJrIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2hpZ2hXYXRlck1hcmsgcHJvcGVydHkgb2YgYSBxdWV1aW5nIHN0cmF0ZWd5IG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBub24tTmFOJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2hXYXRlck1hcms7XG4gICAgfVxuICAgIGZ1bmN0aW9uIE1ha2VTaXplQWxnb3JpdGhtRnJvbVNpemVGdW5jdGlvbihzaXplKSB7XG4gICAgICAgIGlmIChzaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZSBwcm9wZXJ0eSBvZiBhIHF1ZXVpbmcgc3RyYXRlZ3kgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjaHVuaykgeyByZXR1cm4gc2l6ZShjaHVuayk7IH07XG4gICAgfVxuICAgIHZhciBvcmlnaW5hbFByb21pc2UgPSBQcm9taXNlO1xuICAgIHZhciBvcmlnaW5hbFByb21pc2VUaGVuID0gUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcbiAgICB2YXIgb3JpZ2luYWxQcm9taXNlUmVzb2x2ZSA9IFByb21pc2UucmVzb2x2ZS5iaW5kKG9yaWdpbmFsUHJvbWlzZSk7XG4gICAgdmFyIG9yaWdpbmFsUHJvbWlzZVJlamVjdCA9IFByb21pc2UucmVqZWN0LmJpbmQob3JpZ2luYWxQcm9taXNlKTtcbiAgICBmdW5jdGlvbiBuZXdQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgb3JpZ2luYWxQcm9taXNlKGV4ZWN1dG9yKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvbWlzZVJlc29sdmVkV2l0aCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxQcm9taXNlUmVzb2x2ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb21pc2VSZWplY3RlZFdpdGgocmVhc29uKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbFByb21pc2VSZWplY3QocmVhc29uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIC8vIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gY29ycmVjdGx5IGVtdWxhdGUgdGhlIGJlaGF2aW91ciBmcm9tIEphdmFTY3JpcHQsIHNvIHRoaXMgaXMganVzdCBhblxuICAgICAgICAvLyBhcHByb3hpbWF0aW9uLlxuICAgICAgICByZXR1cm4gb3JpZ2luYWxQcm9taXNlVGhlbi5jYWxsKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBvblByb21pc2UocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgUGVyZm9ybVByb21pc2VUaGVuKFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCksIHVuZGVmaW5lZCwgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBvbkZ1bGZpbGxtZW50KHByb21pc2UsIG9uRnVsZmlsbGVkKSB7XG4gICAgICAgIHVwb25Qcm9taXNlKHByb21pc2UsIG9uRnVsZmlsbGVkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBvblJlamVjdGlvbihwcm9taXNlLCBvblJlamVjdGVkKSB7XG4gICAgICAgIHVwb25Qcm9taXNlKHByb21pc2UsIHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVByb21pc2VXaXRoKHByb21pc2UsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcikge1xuICAgICAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocHJvbWlzZSkge1xuICAgICAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgdW5kZWZpbmVkLCByZXRocm93QXNzZXJ0aW9uRXJyb3JSZWplY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIE9yaWdpbmFsIGZyb20gQ2hyb21pdW1cbiAgICAvLyBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLysvMGFlZTQ0MzRhNGRiYTQyYTQyYWJhZWE5YmZiYzBjZDE5NmE2M2JjMS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N0cmVhbXMvU2ltcGxlUXVldWUuanNcbiAgICB2YXIgUVVFVUVfTUFYX0FSUkFZX1NJWkUgPSAxNjM4NDtcbiAgICAvKipcbiAgICAgKiBTaW1wbGUgcXVldWUgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogQXZvaWRzIHNjYWxhYmlsaXR5IGlzc3VlcyB3aXRoIHVzaW5nIGEgcGFja2VkIGFycmF5IGRpcmVjdGx5IGJ5IHVzaW5nXG4gICAgICogbXVsdGlwbGUgYXJyYXlzIGluIGEgbGlua2VkIGxpc3QgYW5kIGtlZXBpbmcgdGhlIGFycmF5IHNpemUgYm91bmRlZC5cbiAgICAgKi9cbiAgICB2YXIgU2ltcGxlUXVldWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFNpbXBsZVF1ZXVlKCkge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICAgICAgLy8gX2Zyb250IGFuZCBfYmFjayBhcmUgYWx3YXlzIGRlZmluZWQuXG4gICAgICAgICAgICB0aGlzLl9mcm9udCA9IHtcbiAgICAgICAgICAgICAgICBfZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgICAgIF9uZXh0OiB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9iYWNrID0gdGhpcy5fZnJvbnQ7XG4gICAgICAgICAgICAvLyBUaGUgY3Vyc29yIGlzIHVzZWQgdG8gYXZvaWQgY2FsbGluZyBBcnJheS5zaGlmdCgpLlxuICAgICAgICAgICAgLy8gSXQgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBmcm9udCBlbGVtZW50IG9mIHRoZSBhcnJheSBpbnNpZGUgdGhlXG4gICAgICAgICAgICAvLyBmcm9udC1tb3N0IG5vZGUuIEl0IGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgWzAsIFFVRVVFX01BWF9BUlJBWV9TSVpFKS5cbiAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG9ubHkgb25lIG5vZGUsIHNpemUgPT09IGVsZW1lbnRzLmxlbmd0aCAtIGN1cnNvci5cbiAgICAgICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTaW1wbGVRdWV1ZS5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEZvciBleGNlcHRpb24gc2FmZXR5LCB0aGlzIG1ldGhvZCBpcyBzdHJ1Y3R1cmVkIGluIG9yZGVyOlxuICAgICAgICAvLyAxLiBSZWFkIHN0YXRlXG4gICAgICAgIC8vIDIuIENhbGN1bGF0ZSByZXF1aXJlZCBzdGF0ZSBtdXRhdGlvbnNcbiAgICAgICAgLy8gMy4gUGVyZm9ybSBzdGF0ZSBtdXRhdGlvbnNcbiAgICAgICAgU2ltcGxlUXVldWUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIG9sZEJhY2sgPSB0aGlzLl9iYWNrO1xuICAgICAgICAgICAgdmFyIG5ld0JhY2sgPSBvbGRCYWNrO1xuICAgICAgICAgICAgaWYgKG9sZEJhY2suX2VsZW1lbnRzLmxlbmd0aCA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUgLSAxKSB7XG4gICAgICAgICAgICAgICAgbmV3QmFjayA9IHtcbiAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgX25leHQ6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwdXNoKCkgaXMgdGhlIG11dGF0aW9uIG1vc3QgbGlrZWx5IHRvIHRocm93IGFuIGV4Y2VwdGlvbiwgc28gaXRcbiAgICAgICAgICAgIC8vIGdvZXMgZmlyc3QuXG4gICAgICAgICAgICBvbGRCYWNrLl9lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKG5ld0JhY2sgIT09IG9sZEJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iYWNrID0gbmV3QmFjaztcbiAgICAgICAgICAgICAgICBvbGRCYWNrLl9uZXh0ID0gbmV3QmFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsrdGhpcy5fc2l6ZTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTGlrZSBwdXNoKCksIHNoaWZ0KCkgZm9sbG93cyB0aGUgcmVhZCAtPiBjYWxjdWxhdGUgLT4gbXV0YXRlIHBhdHRlcm4gZm9yXG4gICAgICAgIC8vIGV4Y2VwdGlvbiBzYWZldHkuXG4gICAgICAgIFNpbXBsZVF1ZXVlLnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHsgLy8gbXVzdCBub3QgYmUgY2FsbGVkIG9uIGFuIGVtcHR5IHF1ZXVlXG4gICAgICAgICAgICB2YXIgb2xkRnJvbnQgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgICAgIHZhciBuZXdGcm9udCA9IG9sZEZyb250O1xuICAgICAgICAgICAgdmFyIG9sZEN1cnNvciA9IHRoaXMuX2N1cnNvcjtcbiAgICAgICAgICAgIHZhciBuZXdDdXJzb3IgPSBvbGRDdXJzb3IgKyAxO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gb2xkRnJvbnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tvbGRDdXJzb3JdO1xuICAgICAgICAgICAgaWYgKG5ld0N1cnNvciA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBuZXdGcm9udCA9IG9sZEZyb250Ll9uZXh0O1xuICAgICAgICAgICAgICAgIG5ld0N1cnNvciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBObyBtdXRhdGlvbnMgYmVmb3JlIHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAtLXRoaXMuX3NpemU7XG4gICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSBuZXdDdXJzb3I7XG4gICAgICAgICAgICBpZiAob2xkRnJvbnQgIT09IG5ld0Zyb250KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnJvbnQgPSBuZXdGcm9udDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBlcm1pdCBzaGlmdGVkIGVsZW1lbnQgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICAgICAgICBlbGVtZW50c1tvbGRDdXJzb3JdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRoZSB0cmlja3kgdGhpbmcgYWJvdXQgZm9yRWFjaCgpIGlzIHRoYXQgaXQgY2FuIGJlIGNhbGxlZFxuICAgICAgICAvLyByZS1lbnRyYW50bHkuIFRoZSBxdWV1ZSBtYXkgYmUgbXV0YXRlZCBpbnNpZGUgdGhlIGNhbGxiYWNrLiBJdCBpcyBlYXN5IHRvXG4gICAgICAgIC8vIHNlZSB0aGF0IHB1c2goKSB3aXRoaW4gdGhlIGNhbGxiYWNrIGhhcyBubyBuZWdhdGl2ZSBlZmZlY3RzIHNpbmNlIHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHF1ZXVlIGlzIGNoZWNrZWQgZm9yIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4gSWYgc2hpZnQoKSBpcyBjYWxsZWRcbiAgICAgICAgLy8gcmVwZWF0ZWRseSB3aXRoaW4gdGhlIGNhbGxiYWNrIHRoZW4gdGhlIG5leHQgaXRlcmF0aW9uIG1heSByZXR1cm4gYW5cbiAgICAgICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuIEluIHRoaXMgY2FzZSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWRcbiAgICAgICAgLy8gd2l0aCB1bmRlZmluZWQgdmFsdWVzIHVudGlsIHdlIGVpdGhlciBcImNhdGNoIHVwXCIgd2l0aCBlbGVtZW50cyB0aGF0IHN0aWxsXG4gICAgICAgIC8vIGV4aXN0IG9yIHJlYWNoIHRoZSBiYWNrIG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgU2ltcGxlUXVldWUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IG5vZGUuX2VsZW1lbnRzO1xuICAgICAgICAgICAgd2hpbGUgKGkgIT09IGVsZW1lbnRzLmxlbmd0aCB8fCBub2RlLl9uZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLl9uZXh0O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9IG5vZGUuX2VsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZWxlbWVudHNbaV0pO1xuICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgaWYgc2hpZnQoKSB3YXMgY2FsbGVkIG5vdyxcbiAgICAgICAgLy8gd2l0aG91dCBtb2RpZnlpbmcgdGhlIHF1ZXVlLlxuICAgICAgICBTaW1wbGVRdWV1ZS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHsgLy8gbXVzdCBub3QgYmUgY2FsbGVkIG9uIGFuIGVtcHR5IHF1ZXVlXG4gICAgICAgICAgICB2YXIgZnJvbnQgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLl9jdXJzb3I7XG4gICAgICAgICAgICByZXR1cm4gZnJvbnQuX2VsZW1lbnRzW2N1cnNvcl07XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBTaW1wbGVRdWV1ZTtcbiAgICB9KCkpO1xuXG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZhbHVlLCBkb25lLCBmb3JBdXRob3JDb2RlKSB7XG4gICAgICAgIHZhciBwcm90b3R5cGUgPSBudWxsO1xuICAgICAgICBpZiAoZm9yQXV0aG9yQ29kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgb2JqLmRvbmUgPSBkb25lO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHJlYWRlciwgc3RyZWFtKSB7XG4gICAgICAgIHJlYWRlci5fZm9yQXV0aG9yQ29kZSA9IHRydWU7XG4gICAgICAgIHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgc3RyZWFtLl9yZWFkZXIgPSByZWFkZXI7XG4gICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZChyZWFkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEEgY2xpZW50IG9mIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciBhbmQgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZVxuICAgIC8vIGNoZWNrLlxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbChyZWFkZXIsIHJlYXNvbikge1xuICAgICAgICB2YXIgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcikge1xuICAgICAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCBuZXcgVHlwZUVycm9yKCdSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtXFwncyBjbG9zZWRuZXNzJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCBuZXcgVHlwZUVycm9yKCdSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtXFwncyBjbG9zZWRuZXNzJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbS5fcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSByZWFkZXJzLlxuICAgIGZ1bmN0aW9uIHJlYWRlckxvY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQ2Fubm90ICcgKyBuYW1lICsgJyBhIHN0cmVhbSB1c2luZyBhIHJlbGVhc2VkIHJlYWRlcicpO1xuICAgIH1cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbikge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHJlYWRlcikge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgcmVhc29uKSB7XG4gICAgICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocmVhZGVyLl9jbG9zZWRQcm9taXNlKTtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCByZWFzb24pIHtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZShyZWFkZXIpIHtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIENhbmNlbFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbQ2FuY2VsU3RlcHNdXScpO1xuICAgIHZhciBQdWxsU3RlcHMgPSBTeW1ib2xQb2x5ZmlsbCgnW1tQdWxsU3RlcHNdXScpO1xuXG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtLCBmb3JBdXRob3JDb2RlKSB7XG4gICAgICAgIGlmIChmb3JBdXRob3JDb2RlID09PSB2b2lkIDApIHsgZm9yQXV0aG9yQ29kZSA9IGZhbHNlOyB9XG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG4gICAgICAgIHJlYWRlci5fZm9yQXV0aG9yQ29kZSA9IGZvckF1dGhvckNvZGU7XG4gICAgICAgIHJldHVybiByZWFkZXI7XG4gICAgfVxuICAgIC8vIFJlYWRhYmxlU3RyZWFtIEFQSSBleHBvc2VkIGZvciBjb250cm9sbGVycy5cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUFkZFJlYWRSZXF1ZXN0KHN0cmVhbSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlYWRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIF9yZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIF9yZWplY3Q6IHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHN0cmVhbS5fcmVhZGVyLl9yZWFkUmVxdWVzdHMucHVzaChyZWFkUmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3Qoc3RyZWFtLCBjaHVuaywgZG9uZSkge1xuICAgICAgICB2YXIgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgICAgIHZhciByZWFkUmVxdWVzdCA9IHJlYWRlci5fcmVhZFJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIHJlYWRSZXF1ZXN0Ll9yZXNvbHZlKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChjaHVuaywgZG9uZSwgcmVhZGVyLl9mb3JBdXRob3JDb2RlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkge1xuICAgICAgICByZXR1cm4gc3RyZWFtLl9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5sZW5ndGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihzdHJlYW0pIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSkge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFJlYWRhYmxlU3RyZWFtIGluc3RhbmNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSByZWFkaW5nIGJ5IGFub3RoZXIgcmVhZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZSwgXCJjbG9zZWRcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2FuY2VsJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwodGhpcywgcmVhc29uKTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWFkJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ3JlYWQgZnJvbScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLnJlbGVhc2VMb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWxlYXNlTG9jaycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWFkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIHJlbGVhc2UgYSByZWFkZXIgbG9jayB3aGVuIHRoYXQgcmVhZGVyIGhhcyBwZW5kaW5nIHJlYWQoKSBjYWxscyB1bi1zZXR0bGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIHJlYWRlcnMuXG4gICAgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoeCkge1xuICAgICAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZFJlcXVlc3RzJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh1bmRlZmluZWQsIHRydWUsIHJlYWRlci5fZm9yQXV0aG9yQ29kZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcltQdWxsU3RlcHNdKCk7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIuXG4gICAgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUuXCIgKyBuYW1lICsgXCIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclwiKTtcbiAgICB9XG5cbiAgICAvLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTguYXN5bmNpdGVyYWJsZVwiIC8+XG4gICAgdmFyIF9hO1xuICAgIHZhciBBc3luY0l0ZXJhdG9yUHJvdG90eXBlO1xuICAgIGlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbnNpZGUgYSBFUzIwMTgrIGVudmlyb25tZW50LCBidXQgd2UncmUgY29tcGlsaW5nIHRvIGFuIG9sZGVyIHN5bnRheC5cbiAgICAgICAgLy8gV2UgY2Fubm90IGFjY2VzcyAlQXN5bmNJdGVyYXRvclByb3RvdHlwZSUgd2l0aG91dCBub24tRVMyMDE4IHN5bnRheCwgYnV0IHdlIGNhbiByZS1jcmVhdGUgaXQuXG4gICAgICAgIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSAoX2EgPSB7fSxcbiAgICAgICAgICAgIC8vIDI1LjEuMy4xICVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSBbIEBAYXN5bmNJdGVyYXRvciBdICggKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXN5bmNpdGVyYXRvcnByb3RvdHlwZS1hc3luY2l0ZXJhdG9yXG4gICAgICAgICAgICBfYVtTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3luY0l0ZXJhdG9yUHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yLCB7IGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8vLyA8cmVmZXJlbmNlIGxpYj1cImVzMjAxOC5hc3luY2l0ZXJhYmxlXCIgLz5cbiAgICB2YXIgUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlID0ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24oJ25leHQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gdGhpcy5fYXN5bmNJdGVyYXRvclJlYWRlcjtcbiAgICAgICAgICAgIGlmIChyZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2l0ZXJhdGUnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRvbmUgPSByZXN1bHQuZG9uZTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZhbHVlLCBkb25lLCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXR1cm46IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKCduZXh0JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlYWRlciA9IHRoaXMuX2FzeW5jSXRlcmF0b3JSZWFkZXI7XG4gICAgICAgICAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdmaW5pc2ggaXRlcmF0aW5nJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlYWRlci5fcmVhZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9wcmV2ZW50Q2FuY2VsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwocmVhZGVyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChyZXN1bHQsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZhbHVlLCB0cnVlLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmIChBc3luY0l0ZXJhdG9yUHJvdG90eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUsICduZXh0JywgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlLCAncmV0dXJuJywgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICAvLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG4gICAgZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcihzdHJlYW0sIHByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgaWYgKHByZXZlbnRDYW5jZWwgPT09IHZvaWQgMCkgeyBwcmV2ZW50Q2FuY2VsID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICBpdGVyYXRvci5fYXN5bmNJdGVyYXRvclJlYWRlciA9IHJlYWRlcjtcbiAgICAgICAgaXRlcmF0b3IuX3ByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpO1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHgpIHtcbiAgICAgICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2FzeW5jSXRlcmF0b3JSZWFkZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG4gICAgZnVuY3Rpb24gc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvci5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdGVhbUFzeW5jSXRlcmF0b3JcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRGVxdWV1ZVZhbHVlKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgcGFpciA9IGNvbnRhaW5lci5fcXVldWUuc2hpZnQoKTtcbiAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSAtPSBwYWlyLnNpemU7XG4gICAgICAgIGlmIChjb250YWluZXIuX3F1ZXVlVG90YWxTaXplIDwgMCkge1xuICAgICAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhaXIudmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRhaW5lciwgdmFsdWUsIHNpemUpIHtcbiAgICAgICAgc2l6ZSA9IE51bWJlcihzaXplKTtcbiAgICAgICAgaWYgKCFJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignU2l6ZSBtdXN0IGJlIGEgZmluaXRlLCBub24tTmFOLCBub24tbmVnYXRpdmUgbnVtYmVyLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lci5fcXVldWUucHVzaCh7IHZhbHVlOiB2YWx1ZSwgc2l6ZTogc2l6ZSB9KTtcbiAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSArPSBzaXplO1xuICAgIH1cbiAgICBmdW5jdGlvbiBQZWVrUXVldWVWYWx1ZShjb250YWluZXIpIHtcbiAgICAgICAgdmFyIHBhaXIgPSBjb250YWluZXIuX3F1ZXVlLnBlZWsoKTtcbiAgICAgICAgcmV0dXJuIHBhaXIudmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlc2V0UXVldWUoY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lci5fcXVldWUgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIEFib3J0U3RlcHMgPSBTeW1ib2xQb2x5ZmlsbCgnW1tBYm9ydFN0ZXBzXV0nKTtcbiAgICB2YXIgRXJyb3JTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0Vycm9yU3RlcHNdXScpO1xuICAgIHZhciBXcml0YWJsZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW0odW5kZXJseWluZ1NpbmssIHN0cmF0ZWd5KSB7XG4gICAgICAgICAgICBpZiAodW5kZXJseWluZ1NpbmsgPT09IHZvaWQgMCkgeyB1bmRlcmx5aW5nU2luayA9IHt9OyB9XG4gICAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IHZvaWQgMCkgeyBzdHJhdGVneSA9IHt9OyB9XG4gICAgICAgICAgICBJbml0aWFsaXplV3JpdGFibGVTdHJlYW0odGhpcyk7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHN0cmF0ZWd5LnNpemU7XG4gICAgICAgICAgICB2YXIgaGlnaFdhdGVyTWFyayA9IHN0cmF0ZWd5LmhpZ2hXYXRlck1hcms7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IHVuZGVybHlpbmdTaW5rLnR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzaXplQWxnb3JpdGhtID0gTWFrZVNpemVBbGdvcml0aG1Gcm9tU2l6ZUZ1bmN0aW9uKHNpemUpO1xuICAgICAgICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcmsgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgICAgIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU2luayh0aGlzLCB1bmRlcmx5aW5nU2luaywgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgXCJsb2NrZWRcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24oJ2xvY2tlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdhYm9ydCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGFib3J0IGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLCByZWFzb24pO1xuICAgICAgICB9O1xuICAgICAgICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQodGhpcykgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2xvc2UgYW4gYWxyZWFkeS1jbG9zaW5nIHN0cmVhbScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbUNsb3NlKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuZ2V0V3JpdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbignZ2V0V3JpdGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoc3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBuZXcgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSk7XG4gICAgfVxuICAgIC8vIFRocm93cyBpZiBhbmQgb25seSBpZiBzdGFydEFsZ29yaXRobSB0aHJvd3MuXG4gICAgZnVuY3Rpb24gQ3JlYXRlV3JpdGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHZvaWQgMCkgeyBoaWdoV2F0ZXJNYXJrID0gMTsgfVxuICAgICAgICBpZiAoc2l6ZUFsZ29yaXRobSA9PT0gdm9pZCAwKSB7IHNpemVBbGdvcml0aG0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9OyB9XG4gICAgICAgIHZhciBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgICAgIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbShzdHJlYW0pO1xuICAgICAgICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgICAgICBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfVxuICAgIGZ1bmN0aW9uIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbShzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLl9zdGF0ZSA9ICd3cml0YWJsZSc7XG4gICAgICAgIC8vIFRoZSBlcnJvciB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYnkgbmV3IG1ldGhvZCBjYWxscyBvbmNlIHRoZSBzdGF0ZSBiZWNvbWVzIGVycm9yZWQuIE9ubHkgc2V0IHdoZW4gW1tzdGF0ZV1dIGlzXG4gICAgICAgIC8vICdlcnJvcmluZycgb3IgJ2Vycm9yZWQnLiBNYXkgYmUgc2V0IHRvIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAgICAgICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RyZWFtLl93cml0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdG8gdW5kZWZpbmVkIGZpcnN0IGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjb250cm9sbGVyIGNoZWNrcyB0aGlzXG4gICAgICAgIC8vIHZhcmlhYmxlIHRvIHZhbGlkYXRlIHRoZSBjYWxsZXIuXG4gICAgICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBUaGlzIHF1ZXVlIGlzIHBsYWNlZCBoZXJlIGluc3RlYWQgb2YgdGhlIHdyaXRlciBjbGFzcyBpbiBvcmRlciB0byBhbGxvdyBmb3IgcGFzc2luZyBhIHdyaXRlciB0byB0aGUgbmV4dCBkYXRhXG4gICAgICAgIC8vIHByb2R1Y2VyIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHF1ZXVlZCB3cml0ZXMgdG8gZmluaXNoLlxuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgLy8gV3JpdGUgcmVxdWVzdHMgYXJlIHJlbW92ZWQgZnJvbSBfd3JpdGVSZXF1ZXN0cyB3aGVuIHdyaXRlKCkgaXMgY2FsbGVkIG9uIHRoZSB1bmRlcmx5aW5nIHNpbmsuIFRoaXMgcHJldmVudHNcbiAgICAgICAgLy8gdGhlbSBmcm9tIGJlaW5nIGVycm9uZW91c2x5IHJlamVjdGVkIG9uIGVycm9yLiBJZiBhIHdyaXRlKCkgY2FsbCBpcyBpbi1mbGlnaHQsIHRoZSByZXF1ZXN0IGlzIHN0b3JlZCBoZXJlLlxuICAgICAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBUaGUgcHJvbWlzZSB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHdyaXRlci5jbG9zZSgpLiBTdG9yZWQgaGVyZSBiZWNhdXNlIGl0IG1heSBiZSBmdWxmaWxsZWQgYWZ0ZXIgdGhlIHdyaXRlclxuICAgICAgICAvLyBoYXMgYmVlbiBkZXRhY2hlZC5cbiAgICAgICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIENsb3NlIHJlcXVlc3QgaXMgcmVtb3ZlZCBmcm9tIF9jbG9zZVJlcXVlc3Qgd2hlbiBjbG9zZSgpIGlzIGNhbGxlZCBvbiB0aGUgdW5kZXJseWluZyBzaW5rLiBUaGlzIHByZXZlbnRzIGl0XG4gICAgICAgIC8vIGZyb20gYmVpbmcgZXJyb25lb3VzbHkgcmVqZWN0ZWQgb24gZXJyb3IuIElmIGEgY2xvc2UoKSBjYWxsIGlzIGluLWZsaWdodCwgdGhlIHJlcXVlc3QgaXMgc3RvcmVkIGhlcmUuXG4gICAgICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFRoZSBwcm9taXNlIHRoYXQgd2FzIHJldHVybmVkIGZyb20gd3JpdGVyLmFib3J0KCkuIFRoaXMgbWF5IGFsc28gYmUgZnVsZmlsbGVkIGFmdGVyIHRoZSB3cml0ZXIgaGFzIGRldGFjaGVkLlxuICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFRoZSBiYWNrcHJlc3N1cmUgc2lnbmFsIHNldCBieSB0aGUgY29udHJvbGxlci5cbiAgICAgICAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbSh4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ193cml0YWJsZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkge1xuICAgICAgICBpZiAoc3RyZWFtLl93cml0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUFib3J0KHN0cmVhbSwgcmVhc29uKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcgfHwgc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdhc0FscmVhZHlFcnJvcmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgIHdhc0FscmVhZHlFcnJvcmluZyA9IHRydWU7XG4gICAgICAgICAgICAvLyByZWFzb24gd2lsbCBub3QgYmUgdXNlZCwgc28gZG9uJ3Qga2VlcCBhIHJlZmVyZW5jZSB0byBpdC5cbiAgICAgICAgICAgIHJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIF9wcm9taXNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX3Jlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgX3JlamVjdDogcmVqZWN0LFxuICAgICAgICAgICAgICAgIF9yZWFzb246IHJlYXNvbixcbiAgICAgICAgICAgICAgICBfd2FzQWxyZWFkeUVycm9yaW5nOiB3YXNBbHJlYWR5RXJyb3JpbmdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2UgPSBwcm9taXNlO1xuICAgICAgICBpZiAod2FzQWxyZWFkeUVycm9yaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pIHtcbiAgICAgICAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKFwiVGhlIHN0cmVhbSAoaW4gXCIgKyBzdGF0ZSArIFwiIHN0YXRlKSBpcyBub3QgaW4gdGhlIHdyaXRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkXCIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIGNsb3NlUmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICBfcmVqZWN0OiByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IGNsb3NlUmVxdWVzdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjtcbiAgICAgICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkICYmIHN0cmVhbS5fYmFja3ByZXNzdXJlID09PSB0cnVlICYmIHN0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICAvLyBXcml0YWJsZVN0cmVhbSBBUEkgZXhwb3NlZCBmb3IgY29udHJvbGxlcnMuXG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgd3JpdGVSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIF9yZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIF9yZWplY3Q6IHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5wdXNoKHdyaXRlUmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3Jpbmcoc3RyZWFtKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgICAgIHN0cmVhbS5fc3RhdGUgPSAnZXJyb3JpbmcnO1xuICAgICAgICBzdHJlYW0uX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgICAgICB2YXIgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0KHN0cmVhbSkgPT09IGZhbHNlICYmIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3Jpbmcoc3RyZWFtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uX3N0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltFcnJvclN0ZXBzXSgpO1xuICAgICAgICB2YXIgc3RvcmVkRXJyb3IgPSBzdHJlYW0uX3N0b3JlZEVycm9yO1xuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAod3JpdGVSZXF1ZXN0KSB7XG4gICAgICAgICAgICB3cml0ZVJlcXVlc3QuX3JlamVjdChzdG9yZWRFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFib3J0UmVxdWVzdCA9IHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdDtcbiAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoYWJvcnRSZXF1ZXN0Ll93YXNBbHJlYWR5RXJyb3JpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGFib3J0UmVxdWVzdC5fcmVqZWN0KHN0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQoc3RyZWFtKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvbWlzZSA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyW0Fib3J0U3RlcHNdKGFib3J0UmVxdWVzdC5fcmVhc29uKTtcbiAgICAgICAgdXBvblByb21pc2UocHJvbWlzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYWJvcnRSZXF1ZXN0Ll9yZXNvbHZlKCk7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGFib3J0UmVxdWVzdC5fcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUoc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0Ll9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIHdhcyB0b28gbGF0ZSB0byBkbyBhbnl0aGluZywgc28gaXQgaXMgaWdub3JlZC5cbiAgICAgICAgICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Jlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICAgICAgICB2YXIgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gTmV2ZXIgZXhlY3V0ZSBzaW5rIGFib3J0KCkgYWZ0ZXIgc2luayBjbG9zZSgpLlxuICAgICAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uKHN0cmVhbSwgZXJyb3IpO1xuICAgIH1cbiAgICAvLyBUT0RPKHJpY2VhKTogRml4IGFscGhhYmV0aWNhbCBvcmRlci5cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pIHtcbiAgICAgICAgaWYgKHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID09PSB1bmRlZmluZWQgJiYgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtSGFzT3BlcmF0aW9uTWFya2VkSW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgICAgIGlmIChzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID09PSB1bmRlZmluZWQgJiYgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID0gc3RyZWFtLl9jbG9zZVJlcXVlc3Q7XG4gICAgICAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbU1hcmtGaXJzdFdyaXRlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gc3RyZWFtLl93cml0ZVJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQoc3RyZWFtKSB7XG4gICAgICAgIGlmIChzdHJlYW0uX2Nsb3NlUmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdC5fcmVqZWN0KHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgICAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgdmFyIHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgICAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQgJiYgYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICAgICAgaWYgKGJhY2twcmVzc3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCh3cml0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTtcbiAgICB9XG4gICAgdmFyIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSkge1xuICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW0oc3RyZWFtKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFdyaXRhYmxlU3RyZWFtIGluc3RhbmNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSB3cml0aW5nIGJ5IGFub3RoZXIgd3JpdGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICAgICAgc3RyZWFtLl93cml0ZXIgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pID09PSBmYWxzZSAmJiBzdHJlYW0uX2JhY2twcmVzc3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RvcmVkRXJyb3IgPSBzdHJlYW0uX3N0b3JlZEVycm9yO1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0aGlzLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0aGlzLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIFwiY2xvc2VkXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIFwiZGVzaXJlZFNpemVcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHRoaXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCBcInJlYWR5XCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWR5JykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Fib3J0JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCdhYm9ydCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCh0aGlzLCByZWFzb24pO1xuICAgICAgICB9O1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzdHJlYW0gPSB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ2Nsb3NlJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2xvc2UgYW4gYWxyZWFkeS1jbG9zaW5nIHN0cmVhbScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS5yZWxlYXNlTG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzdHJlYW0gPSB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCd3cml0ZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignd3JpdGUgdG8nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyV3JpdGUodGhpcywgY2h1bmspO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5cbiAgICBmdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19vd25lcldyaXRhYmxlU3RyZWFtJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQSBjbGllbnQgb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCh3cml0ZXIsIHJlYXNvbikge1xuICAgICAgICB2YXIgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydChzdHJlYW0sIHJlYXNvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHdyaXRlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZVdpdGhFcnJvclByb3BhZ2F0aW9uKHdyaXRlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSA9PT0gdHJ1ZSB8fCBzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh3cml0ZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVDbG9zZWRQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCBlcnJvcikge1xuICAgICAgICBpZiAod3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZCh3cml0ZXIsIGVycm9yKSB7XG4gICAgICAgIGlmICh3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHdyaXRlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2Uod3JpdGVyKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgICAgIHZhciByZWxlYXNlZEVycm9yID0gbmV3IFR5cGVFcnJvcignV3JpdGVyIHdhcyByZWxlYXNlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIHN0cmVhbVxcJ3MgY2xvc2VkbmVzcycpO1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZCh3cml0ZXIsIHJlbGVhc2VkRXJyb3IpO1xuICAgICAgICAvLyBUaGUgc3RhdGUgdHJhbnNpdGlvbnMgdG8gXCJlcnJvcmVkXCIgYmVmb3JlIHRoZSBzaW5rIGFib3J0KCkgbWV0aG9kIHJ1bnMsIGJ1dCB0aGUgd3JpdGVyLmNsb3NlZCBwcm9taXNlIGlzIG5vdFxuICAgICAgICAvLyByZWplY3RlZCB1bnRpbCBhZnRlcndhcmRzLiBUaGlzIG1lYW5zIHRoYXQgc2ltcGx5IHRlc3Rpbmcgc3RhdGUgd2lsbCBub3Qgd29yay5cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVsZWFzZWRFcnJvcik7XG4gICAgICAgIHN0cmVhbS5fd3JpdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgdmFyIGNodW5rU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICBpZiAoc3RyZWFtICE9PSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW0pIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCd3cml0ZSB0bycpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IHRydWUgfHwgc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGlzIGNsb3Npbmcgb3IgY2xvc2VkIGFuZCBjYW5ub3QgYmUgd3JpdHRlbiB0bycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9taXNlID0gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGV4cGxpY2l0bHknKTtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLmVycm9yIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0uX3N0YXRlO1xuICAgICAgICAgICAgaWYgKHN0YXRlICE9PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBjbG9zZWQsIGVycm9yZWQgb3Igd2lsbCBiZSBzb29uLiBUaGUgc2luayBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgaWYgaXQgZ2V0cyBhbiBlcnJvciBoZXJlLCBzb1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgdHJlYXQgaXQgYXMgYSBuby1vcC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGVbQWJvcnRTdGVwc10gPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fYWJvcnRBbGdvcml0aG0ocmVhc29uKTtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW0Vycm9yU3RlcHNdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XG4gICAgfSgpKTtcbiAgICAvLyBBYnN0cmFjdCBvcGVyYXRpb25zIGltcGxlbWVudGluZyBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgdGhlIFdyaXRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkV3JpdGFibGVTdHJlYW0nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgICAgICBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgLy8gTmVlZCB0byBzZXQgdGhlIHNsb3RzIHNvIHRoYXQgdGhlIGFzc2VydCBkb2Vzbid0IGZpcmUuIEluIHRoZSBzcGVjIHRoZSBzbG90cyBhbHJlYWR5IGV4aXN0IGltcGxpY2l0bHkuXG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSBzaXplQWxnb3JpdGhtO1xuICAgICAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7XG4gICAgICAgIGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtID0gd3JpdGVBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtID0gY2xvc2VBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gYWJvcnRBbGdvcml0aG07XG4gICAgICAgIHZhciBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpO1xuICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgICAgIHZhciBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7XG4gICAgICAgIHZhciBzdGFydFByb21pc2UgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KTtcbiAgICAgICAgdXBvblByb21pc2Uoc3RhcnRQcm9taXNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIHIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHN0cmVhbSwgdW5kZXJseWluZ1NpbmssIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICAgICAgZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKSB7XG4gICAgICAgICAgICByZXR1cm4gSW52b2tlT3JOb29wKHVuZGVybHlpbmdTaW5rLCAnc3RhcnQnLCBbY29udHJvbGxlcl0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3cml0ZUFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTaW5rLCAnd3JpdGUnLCAxLCBbY29udHJvbGxlcl0pO1xuICAgICAgICB2YXIgY2xvc2VBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nU2luaywgJ2Nsb3NlJywgMCwgW10pO1xuICAgICAgICB2YXIgYWJvcnRBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nU2luaywgJ2Fib3J0JywgMSwgW10pO1xuICAgICAgICBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG4gICAgfVxuICAgIC8vIENsZWFyQWxnb3JpdGhtcyBtYXkgYmUgY2FsbGVkIHR3aWNlLiBFcnJvcmluZyB0aGUgc2FtZSBzdHJlYW0gaW4gbXVsdGlwbGUgd2F5cyB3aWxsIG9mdGVuIHJlc3VsdCBpbiByZWR1bmRhbnQgY2FsbHMuXG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fYWJvcnRBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgJ2Nsb3NlJywgMCk7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldENodW5rU2l6ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGNodW5rU2l6ZUUpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKGNvbnRyb2xsZXIsIGNodW5rU2l6ZUUpO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJXcml0ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKSB7XG4gICAgICAgIHZhciB3cml0ZVJlY29yZCA9IHsgY2h1bms6IGNodW5rIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBFbnF1ZXVlVmFsdWVXaXRoU2l6ZShjb250cm9sbGVyLCB3cml0ZVJlY29yZCwgY2h1bmtTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZW5xdWV1ZUUpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKGNvbnRyb2xsZXIsIGVucXVldWVFKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSA9PT0gZmFsc2UgJiYgc3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgdmFyIGJhY2twcmVzc3VyZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcik7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICAvLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgICAgICBpZiAoY29udHJvbGxlci5fc3RhcnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3cml0ZVJlY29yZCA9IFBlZWtRdWV1ZVZhbHVlKGNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAod3JpdGVSZWNvcmQgPT09ICdjbG9zZScpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc1dyaXRlKGNvbnRyb2xsZXIsIHdyaXRlUmVjb3JkLmNodW5rKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBlcnJvcikge1xuICAgICAgICBpZiAoY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc0Nsb3NlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1NYXJrQ2xvc2VSZXF1ZXN0SW5GbGlnaHQoc3RyZWFtKTtcbiAgICAgICAgRGVxdWV1ZVZhbHVlKGNvbnRyb2xsZXIpO1xuICAgICAgICB2YXIgc2lua0Nsb3NlUHJvbWlzZSA9IGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtKCk7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIHVwb25Qcm9taXNlKHNpbmtDbG9zZVByb21pc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZShzdHJlYW0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3Ioc3RyZWFtLCByZWFzb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgICAgICBXcml0YWJsZVN0cmVhbU1hcmtGaXJzdFdyaXRlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSk7XG4gICAgICAgIHZhciBzaW5rV3JpdGVQcm9taXNlID0gY29udHJvbGxlci5fd3JpdGVBbGdvcml0aG0oY2h1bmspO1xuICAgICAgICB1cG9uUHJvbWlzZShzaW5rV3JpdGVQcm9taXNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUoc3RyZWFtKTtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgICAgICBEZXF1ZXVlVmFsdWUoY29udHJvbGxlcik7XG4gICAgICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSA9PT0gZmFsc2UgJiYgc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmFja3ByZXNzdXJlID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZVdpdGhFcnJvcihzdHJlYW0sIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIGRlc2lyZWRTaXplID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gZGVzaXJlZFNpemUgPD0gMDtcbiAgICB9XG4gICAgLy8gQSBjbGllbnQgb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGUgY2hlY2suXG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVycm9yKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIGVycm9yKTtcbiAgICB9XG4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZS5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW1cIik7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIuXG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuXCIgKyBuYW1lICsgXCIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQ2Fubm90ICcgKyBuYW1lICsgJyBhIHN0cmVhbSB1c2luZyBhIHJlbGVhc2VkIHdyaXRlcicpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKSB7XG4gICAgICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZVN0YXRlID0gJ3BlbmRpbmcnO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHdyaXRlcikge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgcmVhc29uKSB7XG4gICAgICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUod3JpdGVyLl9jbG9zZWRQcm9taXNlKTtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncmVqZWN0ZWQnO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcikge1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncmVzb2x2ZWQnO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpIHtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdwZW5kaW5nJztcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQod3JpdGVyKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pIHtcbiAgICAgICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh3cml0ZXIuX3JlYWR5UHJvbWlzZSk7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPSAncmVqZWN0ZWQnO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQod3JpdGVyKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pIHtcbiAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKSB7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID0gJ2Z1bGZpbGxlZCc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlLmFib3J0ZWQgPT09ICdib29sZWFuJztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgIC8vIEFib3J0U2lnbmFsLnByb3RvdHlwZS5hYm9ydGVkIHRocm93cyBpZiBpdHMgYnJhbmQgY2hlY2sgZmFpbHNcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vLyA8cmVmZXJlbmNlIGxpYj1cImRvbVwiIC8+XG4gICAgdmFyIE5hdGl2ZURPTUV4Y2VwdGlvbiA9IHR5cGVvZiBET01FeGNlcHRpb24gIT09ICd1bmRlZmluZWQnID8gRE9NRXhjZXB0aW9uIDogdW5kZWZpbmVkO1xuXG4gICAgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbiAgICBmdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKGN0b3IpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIGN0b3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGN0b3IgPT09ICdvYmplY3QnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgY3RvcigpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwoKSB7XG4gICAgICAgIHZhciBjdG9yID0gZnVuY3Rpb24gRE9NRXhjZXB0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJyc7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdFcnJvcic7XG4gICAgICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdG9yLnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgeyB2YWx1ZTogY3Rvciwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIGN0b3I7XG4gICAgfVxuICAgIHZhciBET01FeGNlcHRpb24kMSA9IGlzRE9NRXhjZXB0aW9uQ29uc3RydWN0b3IoTmF0aXZlRE9NRXhjZXB0aW9uKSA/IE5hdGl2ZURPTUV4Y2VwdGlvbiA6IGNyZWF0ZURPTUV4Y2VwdGlvblBvbHlmaWxsKCk7XG5cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVBpcGVUbyhzb3VyY2UsIGRlc3QsIHByZXZlbnRDbG9zZSwgcHJldmVudEFib3J0LCBwcmV2ZW50Q2FuY2VsLCBzaWduYWwpIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc291cmNlKTtcbiAgICAgICAgdmFyIHdyaXRlciA9IEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoZGVzdCk7XG4gICAgICAgIHNvdXJjZS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHNodXR0aW5nRG93biA9IGZhbHNlO1xuICAgICAgICAvLyBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3BlYydzIHJlcXVpcmVtZW50IHRoYXQgd2Ugd2FpdCBmb3Igb25nb2luZyB3cml0ZXMgZHVyaW5nIHNodXRkb3duLlxuICAgICAgICB2YXIgY3VycmVudFdyaXRlID0gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgYWJvcnRBbGdvcml0aG07XG4gICAgICAgICAgICBpZiAoc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhYm9ydEFsZ29yaXRobSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IERPTUV4Y2VwdGlvbiQxKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZlbnRBYm9ydCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KGRlc3QsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ZW50Q2FuY2VsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oZnVuY3Rpb24gKCkgeyByZXR1cm4gUHJvbWlzZS5hbGwoYWN0aW9ucy5tYXAoZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gYWN0aW9uKCk7IH0pKTsgfSwgdHJ1ZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0QWxnb3JpdGhtKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbGdvcml0aG0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNpbmcgcmVhZGVyIGFuZCB3cml0ZXIsIHJlYWQgYWxsIGNodW5rcyBmcm9tIHRoaXMgYW5kIHdyaXRlIHRoZW0gdG8gZGVzdFxuICAgICAgICAgICAgLy8gLSBCYWNrcHJlc3N1cmUgbXVzdCBiZSBlbmZvcmNlZFxuICAgICAgICAgICAgLy8gLSBTaHV0ZG93biBtdXN0IHN0b3AgYWxsIGFjdGl2aXR5XG4gICAgICAgICAgICBmdW5jdGlvbiBwaXBlTG9vcCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUxvb3AsIHJlamVjdExvb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbmV4dChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVMb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYFBlcmZvcm1Qcm9taXNlVGhlbmAgaW5zdGVhZCBvZiBgdXBvblByb21pc2VgIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIHVubmVjZXNzYXJ5IGAuY2F0Y2gocmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKWAgaGFuZGxlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocGlwZVN0ZXAoKSwgbmV4dCwgcmVqZWN0TG9vcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBwaXBlU3RlcCgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2h1dHRpbmdEb3duID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHdyaXRlci5fcmVhZHlQcm9taXNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4oUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXcml0ZSA9IFBlcmZvcm1Qcm9taXNlVGhlbihXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh3cml0ZXIsIHJlc3VsdC52YWx1ZSksIHVuZGVmaW5lZCwgbm9vcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXJyb3JzIG11c3QgYmUgcHJvcGFnYXRlZCBmb3J3YXJkXG4gICAgICAgICAgICBpc09yQmVjb21lc0Vycm9yZWQoc291cmNlLCByZWFkZXIuX2Nsb3NlZFByb21pc2UsIGZ1bmN0aW9uIChzdG9yZWRFcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ZW50QWJvcnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7IHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KGRlc3QsIHN0b3JlZEVycm9yKTsgfSwgdHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRXJyb3JzIG11c3QgYmUgcHJvcGFnYXRlZCBiYWNrd2FyZFxuICAgICAgICAgICAgaXNPckJlY29tZXNFcnJvcmVkKGRlc3QsIHdyaXRlci5fY2xvc2VkUHJvbWlzZSwgZnVuY3Rpb24gKHN0b3JlZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZlbnRDYW5jZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7IHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIHN0b3JlZEVycm9yKTsgfSwgdHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ2xvc2luZyBtdXN0IGJlIHByb3BhZ2F0ZWQgZm9yd2FyZFxuICAgICAgICAgICAgaXNPckJlY29tZXNDbG9zZWQoc291cmNlLCByZWFkZXIuX2Nsb3NlZFByb21pc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJldmVudENsb3NlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oZnVuY3Rpb24gKCkgeyByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih3cml0ZXIpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNodXRkb3duKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBDbG9zaW5nIG11c3QgYmUgcHJvcGFnYXRlZCBiYWNrd2FyZFxuICAgICAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSB0cnVlIHx8IGRlc3QuX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgICAgIHZhciBkZXN0Q2xvc2VkXzEgPSBuZXcgVHlwZUVycm9yKCd0aGUgZGVzdGluYXRpb24gd3JpdGFibGUgc3RyZWFtIGNsb3NlZCBiZWZvcmUgYWxsIGRhdGEgY291bGQgYmUgcGlwZWQgdG8gaXQnKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmVudENhbmNlbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKGZ1bmN0aW9uICgpIHsgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHNvdXJjZSwgZGVzdENsb3NlZF8xKTsgfSwgdHJ1ZSwgZGVzdENsb3NlZF8xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNodXRkb3duKHRydWUsIGRlc3RDbG9zZWRfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShwaXBlTG9vcCgpKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpIHtcbiAgICAgICAgICAgICAgICAvLyBBbm90aGVyIHdyaXRlIG1heSBoYXZlIHN0YXJ0ZWQgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIG9uIHRoaXMgY3VycmVudFdyaXRlLCBzbyB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gd2FpdFxuICAgICAgICAgICAgICAgIC8vIGZvciB0aGF0IHRvby5cbiAgICAgICAgICAgICAgICB2YXIgb2xkQ3VycmVudFdyaXRlID0gY3VycmVudFdyaXRlO1xuICAgICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4oY3VycmVudFdyaXRlLCBmdW5jdGlvbiAoKSB7IHJldHVybiBvbGRDdXJyZW50V3JpdGUgIT09IGN1cnJlbnRXcml0ZSA/IHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpIDogdW5kZWZpbmVkOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzT3JCZWNvbWVzRXJyb3JlZChzdHJlYW0sIHByb21pc2UsIGFjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXBvblJlamVjdGlvbihwcm9taXNlLCBhY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzT3JCZWNvbWVzQ2xvc2VkKHN0cmVhbSwgcHJvbWlzZSwgYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXBvbkZ1bGZpbGxtZW50KHByb21pc2UsIGFjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gc2h1dGRvd25XaXRoQWN0aW9uKGFjdGlvbiwgb3JpZ2luYWxJc0Vycm9yLCBvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNodXR0aW5nRG93biA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGRvVGhlUmVzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkb1RoZVJlc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9UaGVSZXN0KCkge1xuICAgICAgICAgICAgICAgICAgICB1cG9uUHJvbWlzZShhY3Rpb24oKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gZmluYWxpemUob3JpZ2luYWxJc0Vycm9yLCBvcmlnaW5hbEVycm9yKTsgfSwgZnVuY3Rpb24gKG5ld0Vycm9yKSB7IHJldHVybiBmaW5hbGl6ZSh0cnVlLCBuZXdFcnJvcik7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNodXRkb3duKGlzRXJyb3IsIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNodXR0aW5nRG93biA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZpbmFsaXplKGlzRXJyb3IsIGVycm9yKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZmluYWxpemUoaXNFcnJvciwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHdyaXRlcik7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgICAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEFsZ29yaXRobSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgXCJkZXNpcmVkU2l6ZVwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2VucXVldWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGVbQ2FuY2VsU3RlcHNdID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9jYW5jZWxBbGdvcml0aG0ocmVhc29uKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW1B1bGxTdGVwc10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3RyZWFtID0gdGhpcy5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgY2h1bmsgPSBEZXF1ZXVlVmFsdWUodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Nsb3NlUmVxdWVzdGVkID09PSB0cnVlICYmIHRoaXMuX3F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KGNodW5rLCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwZW5kaW5nUHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHBlbmRpbmdQcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcbiAgICB9KCkpO1xuICAgIC8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuICAgIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkUmVhZGFibGVTdHJlYW0nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzaG91bGRQdWxsID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAoc2hvdWxkUHVsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fcHVsbGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIHB1bGxQcm9taXNlID0gY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSgpO1xuICAgICAgICB1cG9uUHJvbWlzZShwdWxsUHJvbWlzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShjb250cm9sbGVyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fc3RhcnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVzaXJlZFNpemUgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcik7XG4gICAgICAgIGlmIChkZXNpcmVkU2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBIGNsaWVudCBvZiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgICAgICBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSA9PT0gdHJ1ZSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3Qoc3RyZWFtLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNodW5rU2l6ZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2h1bmtTaXplID0gY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtKGNodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChjaHVua1NpemVFKSB7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGNodW5rU2l6ZUUpO1xuICAgICAgICAgICAgICAgIHRocm93IGNodW5rU2l6ZUU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVucXVldWVFKSB7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVucXVldWVFKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlbnF1ZXVlRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbiAgICB9XG4gICAgLy8gVGhpcyBpcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUcmFuc2Zvcm1TdHJlYW0uXG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZShjb250cm9sbGVyKSB7XG4gICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID09PSBmYWxzZSAmJiBzdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgY29udHJvbGxlci5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkO1xuICAgICAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHNpemVBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNID0gaGlnaFdhdGVyTWFyaztcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTtcbiAgICAgICAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICB2YXIgc3RhcnRSZXN1bHQgPSBzdGFydEFsZ29yaXRobSgpO1xuICAgICAgICB1cG9uUHJvbWlzZShwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCByKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHN0cmVhbSwgdW5kZXJseWluZ1NvdXJjZSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgICAgICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgICAgICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHtcbiAgICAgICAgICAgIHJldHVybiBJbnZva2VPck5vb3AodW5kZXJseWluZ1NvdXJjZSwgJ3N0YXJ0JywgW2NvbnRyb2xsZXJdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHVsbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTb3VyY2UsICdwdWxsJywgMCwgW2NvbnRyb2xsZXJdKTtcbiAgICAgICAgdmFyIGNhbmNlbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTb3VyY2UsICdjYW5jZWwnLCAxLCBbXSk7XG4gICAgICAgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xuICAgIH1cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbiAgICBmdW5jdGlvbiBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLlwiICsgbmFtZSArIFwiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtVGVlKHN0cmVhbSwgY2xvbmVGb3JCcmFuY2gyKSB7XG4gICAgICAgIHZhciByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG4gICAgICAgIHZhciByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIHZhciBjYW5jZWxlZDEgPSBmYWxzZTtcbiAgICAgICAgdmFyIGNhbmNlbGVkMiA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVhc29uMTtcbiAgICAgICAgdmFyIHJlYXNvbjI7XG4gICAgICAgIHZhciBicmFuY2gxO1xuICAgICAgICB2YXIgYnJhbmNoMjtcbiAgICAgICAgdmFyIHJlc29sdmVDYW5jZWxQcm9taXNlO1xuICAgICAgICB2YXIgY2FuY2VsUHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZ1bmN0aW9uIHB1bGxBbGdvcml0aG0oKSB7XG4gICAgICAgICAgICBpZiAocmVhZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciByZWFkUHJvbWlzZSA9IHRyYW5zZm9ybVByb21pc2VXaXRoKFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgZG9uZSA9IHJlc3VsdC5kb25lO1xuICAgICAgICAgICAgICAgIGlmIChkb25lID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5jZWxlZDEgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuY2VsZWQyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlMSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZTIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gYWNjZXNzIHRoZSBjbG9uaW5nIGNvZGUgcmlnaHQgbm93IGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgYWRkIG9uZSB0aGVuIHdlJ2xsIG5lZWQgYW4gaW1wbGVtZW50YXRpb24gZm9yIHNlcmlhbGl6YWJsZSBvYmplY3RzLlxuICAgICAgICAgICAgICAgIC8vIGlmIChjYW5jZWxlZDIgPT09IGZhbHNlICYmIGNsb25lRm9yQnJhbmNoMiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgdmFsdWUyID0gU3RydWN0dXJlZERlc2VyaWFsaXplKFN0cnVjdHVyZWRTZXJpYWxpemUodmFsdWUyKSk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxlZDEgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmFsdWUxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGVkMiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCB2YWx1ZTIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShyZWFkUHJvbWlzZSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbDFBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgICAgICBjYW5jZWxlZDEgPSB0cnVlO1xuICAgICAgICAgICAgcmVhc29uMSA9IHJlYXNvbjtcbiAgICAgICAgICAgIGlmIChjYW5jZWxlZDIgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRlUmVhc29uID0gY3JlYXRlQXJyYXlGcm9tTGlzdChbcmVhc29uMSwgcmVhc29uMl0pO1xuICAgICAgICAgICAgICAgIHZhciBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoY2FuY2VsUmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbDJBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgICAgICBjYW5jZWxlZDIgPSB0cnVlO1xuICAgICAgICAgICAgcmVhc29uMiA9IHJlYXNvbjtcbiAgICAgICAgICAgIGlmIChjYW5jZWxlZDEgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRlUmVhc29uID0gY3JlYXRlQXJyYXlGcm9tTGlzdChbcmVhc29uMSwgcmVhc29uMl0pO1xuICAgICAgICAgICAgICAgIHZhciBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoY2FuY2VsUmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkgeyB9XG4gICAgICAgIGJyYW5jaDEgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMUFsZ29yaXRobSk7XG4gICAgICAgIGJyYW5jaDIgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7XG4gICAgICAgIHVwb25SZWplY3Rpb24ocmVhZGVyLl9jbG9zZWRQcm9taXNlLCBmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgcik7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBbYnJhbmNoMSwgYnJhbmNoMl07XG4gICAgfVxuXG4gICAgLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXIjUG9seWZpbGxcbiAgICB2YXIgTnVtYmVySXNJbnRlZ2VyID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIGlzRmluaXRlKHZhbHVlKSAmJlxuICAgICAgICAgICAgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xuICAgIH07XG5cbiAgICB2YXIgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseScpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSwgXCJ2aWV3XCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigndmlldycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlldztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS5yZXNwb25kID0gZnVuY3Rpb24gKGJ5dGVzV3JpdHRlbikge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Jlc3BvbmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHRoaXMuX3ZpZXcuYnVmZmVyKSA9PT0gdHJ1ZSkgO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbik7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLnJlc3BvbmRXaXRoTmV3VmlldyA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigncmVzcG9uZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIEJZT0IgcmVxdWVzdCBoYXMgYmVlbiBpbnZhbGlkYXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgY2FuIG9ubHkgcmVzcG9uZCB3aXRoIGFycmF5IGJ1ZmZlciB2aWV3cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzRGV0YWNoZWRCdWZmZXIodmlldy5idWZmZXIpID09PSB0cnVlKSA7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLCB2aWV3KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3Q7XG4gICAgfSgpKTtcbiAgICB2YXIgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseScpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSwgXCJieW9iUmVxdWVzdFwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2J5b2JSZXF1ZXN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ieW9iUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3REZXNjcmlwdG9yID0gdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciwgZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQsIGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5b2JSZXF1ZXN0ID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIFNldFVwUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdChieW9iUmVxdWVzdCwgdGhpcywgdmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2J5b2JSZXF1ZXN0ID0gYnlvYlJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ieW9iUmVxdWVzdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUsIFwiZGVzaXJlZFNpemVcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdkZXNpcmVkU2l6ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKHRoaXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkOyBkbyBub3QgY2xvc2UgaXQgYWdhaW4hJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgc3RyZWFtIChpbiBcIiArIHN0YXRlICsgXCIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBjbG9zZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdlbnF1ZXVlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgc3RyZWFtIChpbiBcIiArIHN0YXRlICsgXCIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBlbnF1ZXVlZCB0b1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBjYW4gb25seSBlbnF1ZXVlIGFycmF5IGJ1ZmZlciB2aWV3cyB3aGVuIHVzaW5nIGEgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzRGV0YWNoZWRCdWZmZXIoY2h1bmsuYnVmZmVyKSA9PT0gdHJ1ZSkgO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUodGhpcywgY2h1bmspO1xuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcih0aGlzLCBlKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZVtDYW5jZWxTdGVwc10gPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0RGVzY3JpcHRvciA9IHRoaXMuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICAgICAgICAgIGZpcnN0RGVzY3JpcHRvci5ieXRlc0ZpbGxlZCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZXNldFF1ZXVlKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NhbmNlbEFsZ29yaXRobShyZWFzb24pO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGVbUHVsbFN0ZXBzXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlVG90YWxTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVldWVUb3RhbFNpemUgLT0gZW50cnkuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbih0aGlzKTtcbiAgICAgICAgICAgICAgICB2YXIgdmlldyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW50cnkuYnVmZmVyLCBlbnRyeS5ieXRlT2Zmc2V0LCBlbnRyeS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKHZpZXdFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHZpZXdFKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZpZXcsIGZhbHNlLCBzdHJlYW0uX3JlYWRlci5fZm9yQXV0aG9yQ29kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHRoaXMuX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICAgICAgICAgIGlmIChhdXRvQWxsb2NhdGVDaHVua1NpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChidWZmZXJFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGJ1ZmZlckUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgYnl0ZU9mZnNldDogMCxcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogYXV0b0FsbG9jYXRlQ2h1bmtTaXplLFxuICAgICAgICAgICAgICAgICAgICBieXRlc0ZpbGxlZDogMCxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNpemU6IDEsXG4gICAgICAgICAgICAgICAgICAgIGN0b3I6IFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlclR5cGU6ICdkZWZhdWx0J1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIuXG4gICAgZnVuY3Rpb24gSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHgpIHtcbiAgICAgICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QoeCkge1xuICAgICAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzaG91bGRQdWxsID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAoc2hvdWxkUHVsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fcHVsbGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gVE9ETzogVGVzdCBjb250cm9sbGVyIGFyZ3VtZW50XG4gICAgICAgIHZhciBwdWxsUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0oKTtcbiAgICAgICAgdXBvblByb21pc2UocHVsbFByb21pc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyLl9wdWxsQWdhaW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcikge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpO1xuICAgICAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmlsbGVkVmlldyA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IucmVhZGVyVHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGZpbGxlZFZpZXcsIGRvbmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgZmlsbGVkVmlldywgZG9uZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgICAgIHZhciBieXRlc0ZpbGxlZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgdmFyIGVsZW1lbnRTaXplID0gcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplO1xuICAgICAgICByZXR1cm4gbmV3IHB1bGxJbnRvRGVzY3JpcHRvci5jdG9yKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0LCBieXRlc0ZpbGxlZCAvIGVsZW1lbnRTaXplKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlLnB1c2goeyBidWZmZXI6IGJ1ZmZlciwgYnl0ZU9mZnNldDogYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aCB9KTtcbiAgICAgICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgKz0gYnl0ZUxlbmd0aDtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgICAgIHZhciBlbGVtZW50U2l6ZSA9IHB1bGxJbnRvRGVzY3JpcHRvci5lbGVtZW50U2l6ZTtcbiAgICAgICAgdmFyIGN1cnJlbnRBbGlnbmVkQnl0ZXMgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBlbGVtZW50U2l6ZTtcbiAgICAgICAgdmFyIG1heEJ5dGVzVG9Db3B5ID0gTWF0aC5taW4oY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTtcbiAgICAgICAgdmFyIG1heEJ5dGVzRmlsbGVkID0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgbWF4Qnl0ZXNUb0NvcHk7XG4gICAgICAgIHZhciBtYXhBbGlnbmVkQnl0ZXMgPSBtYXhCeXRlc0ZpbGxlZCAtIG1heEJ5dGVzRmlsbGVkICUgZWxlbWVudFNpemU7XG4gICAgICAgIHZhciB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nID0gbWF4Qnl0ZXNUb0NvcHk7XG4gICAgICAgIHZhciByZWFkeSA9IGZhbHNlO1xuICAgICAgICBpZiAobWF4QWxpZ25lZEJ5dGVzID4gY3VycmVudEFsaWduZWRCeXRlcykge1xuICAgICAgICAgICAgdG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyA9IG1heEFsaWduZWRCeXRlcyAtIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZTtcbiAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICB2YXIgaGVhZE9mUXVldWUgPSBxdWV1ZS5wZWVrKCk7XG4gICAgICAgICAgICB2YXIgYnl0ZXNUb0NvcHkgPSBNYXRoLm1pbih0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nLCBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBkZXN0U3RhcnQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCArIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgICAgIEFycmF5QnVmZmVyQ29weShwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBkZXN0U3RhcnQsIGhlYWRPZlF1ZXVlLmJ1ZmZlciwgaGVhZE9mUXVldWUuYnl0ZU9mZnNldCwgYnl0ZXNUb0NvcHkpO1xuICAgICAgICAgICAgaWYgKGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGggPT09IGJ5dGVzVG9Db3B5KSB7XG4gICAgICAgICAgICAgICAgcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhlYWRPZlF1ZXVlLmJ5dGVPZmZzZXQgKz0gYnl0ZXNUb0NvcHk7XG4gICAgICAgICAgICAgICAgaGVhZE9mUXVldWUuYnl0ZUxlbmd0aCAtPSBieXRlc1RvQ29weTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplIC09IGJ5dGVzVG9Db3B5O1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIsIGJ5dGVzVG9Db3B5LCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgdG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyAtPSBieXRlc1RvQ29weTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVhZHk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLCBzaXplLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICAgICAgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICs9IHNpemU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID09PSAwICYmIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcikge1xuICAgICAgICBpZiAoY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0Ll9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QuX3ZpZXcgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgd2hpbGUgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHB1bGxJbnRvRGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICAgICAgaWYgKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhjb250cm9sbGVyLCB2aWV3KSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICB2YXIgZWxlbWVudFNpemUgPSAxO1xuICAgICAgICBpZiAodmlldy5jb25zdHJ1Y3RvciAhPT0gRGF0YVZpZXcpIHtcbiAgICAgICAgICAgIGVsZW1lbnRTaXplID0gdmlldy5jb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3RvciA9IHZpZXcuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBidWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKTtcbiAgICAgICAgdmFyIHB1bGxJbnRvRGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogYnVmZmVyLFxuICAgICAgICAgICAgYnl0ZU9mZnNldDogdmlldy5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgYnl0ZUxlbmd0aDogdmlldy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgYnl0ZXNGaWxsZWQ6IDAsXG4gICAgICAgICAgICBlbGVtZW50U2l6ZTogZWxlbWVudFNpemUsXG4gICAgICAgICAgICBjdG9yOiBjdG9yLFxuICAgICAgICAgICAgcmVhZGVyVHlwZTogJ2J5b2InXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucHVzaChwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgLy8gTm8gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoKSBjYWxsIHNpbmNlOlxuICAgICAgICAgICAgLy8gLSBObyBjaGFuZ2UgaGFwcGVucyBvbiBkZXNpcmVkU2l6ZVxuICAgICAgICAgICAgLy8gLSBUaGUgc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gbm90aWZpZWQgb2YgdGhhdCB0aGVyZSdzIGF0IGxlYXN0IDEgcGVuZGluZyByZWFkKHZpZXcpXG4gICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIHZhciBlbXB0eVZpZXcgPSBuZXcgY3RvcihwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCwgMCk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoZW1wdHlWaWV3LCB0cnVlLCBzdHJlYW0uX3JlYWRlci5fZm9yQXV0aG9yQ29kZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGlmIChSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZShjb250cm9sbGVyLCBwdWxsSW50b0Rlc2NyaXB0b3IpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpbGxlZFZpZXcgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChmaWxsZWRWaWV3LCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnB1c2gocHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgdmFyIHByb21pc2UgPSBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChzdHJlYW0pO1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpIHtcbiAgICAgICAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlcik7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdoaWxlIChSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKyBieXRlc1dyaXR0ZW4gPiBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2J5dGVzV3JpdHRlbiBvdXQgb2YgcmFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICBpZiAocHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkIDwgcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoZXRoZXIgd2Ugc2hvdWxkIGRldGFjaCB0aGUgYnVmZmVyIG9yIG5vdCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTtcbiAgICAgICAgdmFyIHJlbWFpbmRlclNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgICAgIGlmIChyZW1haW5kZXJTaXplID4gMCkge1xuICAgICAgICAgICAgdmFyIGVuZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICAgICAgdmFyIHJlbWFpbmRlciA9IHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIuc2xpY2UoZW5kIC0gcmVtYWluZGVyU2l6ZSwgZW5kKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHJlbWFpbmRlciwgMCwgcmVtYWluZGVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIpO1xuICAgICAgICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLT0gcmVtYWluZGVyU2l6ZTtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEludGVybmFsKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbikge1xuICAgICAgICB2YXIgZmlyc3REZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIGlmIChieXRlc1dyaXR0ZW4gIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdieXRlc1dyaXR0ZW4gbXVzdCBiZSAwIHdoZW4gY2FsbGluZyByZXNwb25kKCkgb24gYSBjbG9zZWQgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEluQ2xvc2VkU3RhdGUoY29udHJvbGxlciwgZmlyc3REZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgZmlyc3REZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnNoaWZ0KCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fc3RhcnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyKHN0cmVhbSkgPT09IHRydWUgJiYgUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0JZT0JSZWFkZXIoc3RyZWFtKSA9PT0gdHJ1ZSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZXNpcmVkU2l6ZSA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTtcbiAgICAgICAgaWYgKGRlc2lyZWRTaXplID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fY2FuY2VsQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBIGNsaWVudCBvZiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID4gMCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBmaXJzdFBlbmRpbmdQdWxsSW50byA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICAgICAgaWYgKGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ5dGVzRmlsbGVkID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgICAgIHZhciBidWZmZXIgPSBjaHVuay5idWZmZXI7XG4gICAgICAgIHZhciBieXRlT2Zmc2V0ID0gY2h1bmsuYnl0ZU9mZnNldDtcbiAgICAgICAgdmFyIGJ5dGVMZW5ndGggPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhbnNmZXJyZWRCdWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNmZXJyZWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodHJhbnNmZXJyZWRCdWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgdHJhbnNmZXJyZWRWaWV3LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IElkZWFsbHkgaW4gdGhpcyBicmFuY2ggZGV0YWNoaW5nIHNob3VsZCBoYXBwZW4gb25seSBpZiB0aGUgYnVmZmVyIGlzIG5vdCBjb25zdW1lZCBmdWxseS5cbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcik7XG4gICAgICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKSB7XG4gICAgICAgIGJ5dGVzV3JpdHRlbiA9IE51bWJlcihieXRlc1dyaXR0ZW4pO1xuICAgICAgICBpZiAoSXNGaW5pdGVOb25OZWdhdGl2ZU51bWJlcihieXRlc1dyaXR0ZW4pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2J5dGVzV3JpdHRlbiBtdXN0IGJlIGEgZmluaXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbChjb250cm9sbGVyLCBieXRlc1dyaXR0ZW4pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KGNvbnRyb2xsZXIsIHZpZXcpIHtcbiAgICAgICAgdmFyIGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgIT09IHZpZXcuYnl0ZU9mZnNldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSByZWdpb24gc3BlY2lmaWVkIGJ5IHZpZXcgZG9lcyBub3QgbWF0Y2ggYnlvYlJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVMZW5ndGggIT09IHZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBidWZmZXIgb2YgdmlldyBoYXMgZGlmZmVyZW50IGNhcGFjaXR5IHRoYW4gYnlvYlJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBmaXJzdERlc2NyaXB0b3IuYnVmZmVyID0gdmlldy5idWZmZXI7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgdmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBOZWVkIHRvIHNldCB0aGUgc2xvdHMgc28gdGhhdCB0aGUgYXNzZXJ0IGRvZXNuJ3QgZmlyZS4gSW4gdGhlIHNwZWMgdGhlIHNsb3RzIGFscmVhZHkgZXhpc3QgaW1wbGljaXRseS5cbiAgICAgICAgY29udHJvbGxlci5fcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICAgICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTtcbiAgICAgICAgY29udHJvbGxlci5fYXV0b0FsbG9jYXRlQ2h1bmtTaXplID0gYXV0b0FsbG9jYXRlQ2h1bmtTaXplO1xuICAgICAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgICAgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgdmFyIHN0YXJ0UmVzdWx0ID0gc3RhcnRBbGdvcml0aG0oKTtcbiAgICAgICAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdCeXRlU291cmNlLCBoaWdoV2F0ZXJNYXJrKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkge1xuICAgICAgICAgICAgcmV0dXJuIEludm9rZU9yTm9vcCh1bmRlcmx5aW5nQnl0ZVNvdXJjZSwgJ3N0YXJ0JywgW2NvbnRyb2xsZXJdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHVsbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdCeXRlU291cmNlLCAncHVsbCcsIDAsIFtjb250cm9sbGVyXSk7XG4gICAgICAgIHZhciBjYW5jZWxBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nQnl0ZVNvdXJjZSwgJ2NhbmNlbCcsIDEsIFtdKTtcbiAgICAgICAgdmFyIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHVuZGVybHlpbmdCeXRlU291cmNlLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICAgICAgaWYgKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhdXRvQWxsb2NhdGVDaHVua1NpemUgPSBOdW1iZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXJJc0ludGVnZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKSA9PT0gZmFsc2UgfHwgYXV0b0FsbG9jYXRlQ2h1bmtTaXplIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXV0b0FsbG9jYXRlQ2h1bmtTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHJlcXVlc3QsIGNvbnRyb2xsZXIsIHZpZXcpIHtcbiAgICAgICAgcmVxdWVzdC5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICByZXF1ZXN0Ll92aWV3ID0gdmlldztcbiAgICB9XG4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QuXG4gICAgZnVuY3Rpb24gYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdFwiKTtcbiAgICB9XG4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIuXG4gICAgZnVuY3Rpb24gYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclwiKTtcbiAgICB9XG5cbiAgICAvLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG4gICAgZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0sIGZvckF1dGhvckNvZGUpIHtcbiAgICAgICAgaWYgKGZvckF1dGhvckNvZGUgPT09IHZvaWQgMCkgeyBmb3JBdXRob3JDb2RlID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtKTtcbiAgICAgICAgcmVhZGVyLl9mb3JBdXRob3JDb2RlID0gZm9yQXV0aG9yQ29kZTtcbiAgICAgICAgcmV0dXJuIHJlYWRlcjtcbiAgICB9XG4gICAgLy8gUmVhZGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHN0cmVhbSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlYWRJbnRvUmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICBfcmVqZWN0OiByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzdHJlYW0uX3JlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5wdXNoKHJlYWRJbnRvUmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgICAgICB2YXIgcmVhZEludG9SZXF1ZXN0ID0gcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoY2h1bmssIGRvbmUsIHJlYWRlci5fZm9yQXV0aG9yQ29kZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uX3JlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5sZW5ndGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHN0cmVhbSkge1xuICAgICAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFJlYWRhYmxlU3RyZWFtIGluc3RhbmNlIGdpdmVuIGEgJyArXG4gICAgICAgICAgICAgICAgICAgICdieXRlIHNvdXJjZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciBmb3IgYSBzdHJlYW0gbm90IGNvbnN0cnVjdGVkIHdpdGggYSBieXRlICcgK1xuICAgICAgICAgICAgICAgICAgICAnc291cmNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSByZWFkaW5nIGJ5IGFub3RoZXIgcmVhZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUsIFwiY2xvc2VkXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdjYW5jZWwnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigncmVhZCBmcm9tJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCd2aWV3IG11c3QgYmUgYW4gYXJyYXkgYnVmZmVyIHZpZXcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih2aWV3LmJ1ZmZlcikgPT09IHRydWUpIDtcbiAgICAgICAgICAgIGlmICh2aWV3LmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCd2aWV3IG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQodGhpcywgdmlldyk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUucmVsZWFzZUxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIHJlbGVhc2UgYSByZWFkZXIgbG9jayB3aGVuIHRoYXQgcmVhZGVyIGhhcyBwZW5kaW5nIHJlYWQoKSBjYWxscyB1bi1zZXR0bGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIHJlYWRlcnMuXG4gICAgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoeCkge1xuICAgICAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZEludG9SZXF1ZXN0cycpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQocmVhZGVyLCB2aWV3KSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW07XG4gICAgICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udHJvbGxlcnMgbXVzdCBpbXBsZW1lbnQgdGhpcy5cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmlldyk7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIuXG4gICAgZnVuY3Rpb24gYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUuXCIgKyBuYW1lICsgXCIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclwiKTtcbiAgICB9XG5cbiAgICB2YXIgUmVhZGFibGVTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtKHVuZGVybHlpbmdTb3VyY2UsIHN0cmF0ZWd5KSB7XG4gICAgICAgICAgICBpZiAodW5kZXJseWluZ1NvdXJjZSA9PT0gdm9pZCAwKSB7IHVuZGVybHlpbmdTb3VyY2UgPSB7fTsgfVxuICAgICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSB2b2lkIDApIHsgc3RyYXRlZ3kgPSB7fTsgfVxuICAgICAgICAgICAgSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNpemUgPSBzdHJhdGVneS5zaXplO1xuICAgICAgICAgICAgdmFyIGhpZ2hXYXRlck1hcmsgPSBzdHJhdGVneS5oaWdoV2F0ZXJNYXJrO1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB1bmRlcmx5aW5nU291cmNlLnR5cGU7XG4gICAgICAgICAgICB2YXIgdHlwZVN0cmluZyA9IFN0cmluZyh0eXBlKTtcbiAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHN0cmF0ZWd5IGZvciBhIGJ5dGUgc3RyZWFtIGNhbm5vdCBoYXZlIGEgc2l6ZSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcmsgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrID0gVmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGhpZ2hXYXRlck1hcmspO1xuICAgICAgICAgICAgICAgIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHRoaXMsIHVuZGVybHlpbmdTb3VyY2UsIGhpZ2hXYXRlck1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oc2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgICAgICAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGUgaXMgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwgXCJsb2NrZWRcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnbG9ja2VkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2NhbmNlbCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbmNlbCBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgcmVhZGVyJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5nZXRSZWFkZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHZhciBtb2RlID0gKF9hID09PSB2b2lkIDAgPyB7fSA6IF9hKS5tb2RlO1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdnZXRSZWFkZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vZGUgPSBTdHJpbmcobW9kZSk7XG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2J5b2InKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBtb2RlIGlzIHNwZWNpZmllZCcpO1xuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggPSBmdW5jdGlvbiAoX2EsIF9iKSB7XG4gICAgICAgICAgICB2YXIgd3JpdGFibGUgPSBfYS53cml0YWJsZSwgcmVhZGFibGUgPSBfYS5yZWFkYWJsZTtcbiAgICAgICAgICAgIHZhciBfYyA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iLCBwcmV2ZW50Q2xvc2UgPSBfYy5wcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCA9IF9jLnByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCA9IF9jLnByZXZlbnRDYW5jZWwsIHNpZ25hbCA9IF9jLnNpZ25hbDtcbiAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRocm91Z2gnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtKHdyaXRhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd3cml0YWJsZSBhcmd1bWVudCB0byBwaXBlVGhyb3VnaCBtdXN0IGJlIGEgV3JpdGFibGVTdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHJlYWRhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWFkYWJsZSBhcmd1bWVudCB0byBwaXBlVGhyb3VnaCBtdXN0IGJlIGEgUmVhZGFibGVTdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZlbnRDbG9zZSA9IEJvb2xlYW4ocHJldmVudENsb3NlKTtcbiAgICAgICAgICAgIHByZXZlbnRBYm9ydCA9IEJvb2xlYW4ocHJldmVudEFib3J0KTtcbiAgICAgICAgICAgIHByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpO1xuICAgICAgICAgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2hcXCdzIHNpZ25hbCBvcHRpb24gbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcykgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHdyaXRhYmxlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVGhyb3VnaCBjYW5ub3QgYmUgdXNlZCBvbiBhIGxvY2tlZCBXcml0YWJsZVN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSBSZWFkYWJsZVN0cmVhbVBpcGVUbyh0aGlzLCB3cml0YWJsZSwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCk7XG4gICAgICAgICAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHByb21pc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRhYmxlO1xuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvID0gZnVuY3Rpb24gKGRlc3QsIF9hKSB7XG4gICAgICAgICAgICB2YXIgX2IgPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYSwgcHJldmVudENsb3NlID0gX2IucHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQgPSBfYi5wcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwgPSBfYi5wcmV2ZW50Q2FuY2VsLCBzaWduYWwgPSBfYi5zaWduYWw7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3BpcGVUbycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtKGRlc3QpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG9cXCdzIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBXcml0YWJsZVN0cmVhbScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZlbnRDbG9zZSA9IEJvb2xlYW4ocHJldmVudENsb3NlKTtcbiAgICAgICAgICAgIHByZXZlbnRBYm9ydCA9IEJvb2xlYW4ocHJldmVudEFib3J0KTtcbiAgICAgICAgICAgIHByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpO1xuICAgICAgICAgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvXFwncyBzaWduYWwgb3B0aW9uIG11c3QgYmUgYW4gQWJvcnRTaWduYWwnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChkZXN0KSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcywgZGVzdCwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS50ZWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3RlZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJyYW5jaGVzID0gUmVhZGFibGVTdHJlYW1UZWUodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQXJyYXlGcm9tTGlzdChicmFuY2hlcyk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIF9iID0gKF9hID09PSB2b2lkIDAgPyB7fSA6IF9hKS5wcmV2ZW50Q2FuY2VsLCBwcmV2ZW50Q2FuY2VsID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2dldEl0ZXJhdG9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzLCBwcmV2ZW50Q2FuY2VsKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtO1xuICAgIH0oKSk7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yID09PSAnc3ltYm9sJykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yLCB7XG4gICAgICAgICAgICB2YWx1ZTogUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLmdldEl0ZXJhdG9yLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuICAgIC8vIFRocm93cyBpZiBhbmQgb25seSBpZiBzdGFydEFsZ29yaXRobSB0aHJvd3MuXG4gICAgZnVuY3Rpb24gQ3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgICAgICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdm9pZCAwKSB7IGhpZ2hXYXRlck1hcmsgPSAxOyB9XG4gICAgICAgIGlmIChzaXplQWxnb3JpdGhtID09PSB2b2lkIDApIHsgc2l6ZUFsZ29yaXRobSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH07IH1cbiAgICAgICAgdmFyIHN0cmVhbSA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKTtcbiAgICAgICAgSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHN0cmVhbSk7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgICAgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJbml0aWFsaXplUmVhZGFibGVTdHJlYW0oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5fc3RhdGUgPSAncmVhZGFibGUnO1xuICAgICAgICBzdHJlYW0uX3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RyZWFtLl9kaXN0dXJiZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbSh4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkge1xuICAgICAgICBpZiAoc3RyZWFtLl9yZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBSZWFkYWJsZVN0cmVhbSBBUEkgZXhwb3NlZCBmb3IgY29udHJvbGxlcnMuXG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pIHtcbiAgICAgICAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xuICAgICAgICB2YXIgc291cmNlQ2FuY2VsUHJvbWlzZSA9IHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyW0NhbmNlbFN0ZXBzXShyZWFzb24pO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoc291cmNlQ2FuY2VsUHJvbWlzZSwgbm9vcCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5fc3RhdGUgPSAnY2xvc2VkJztcbiAgICAgICAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVhZFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZWFkUmVxdWVzdC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodW5kZWZpbmVkLCB0cnVlLCByZWFkZXIuX2ZvckF1dGhvckNvZGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUocmVhZGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpIHtcbiAgICAgICAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IGU7XG4gICAgICAgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICAgICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgICAgIHJlYWRlci5fcmVhZFJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgcmVhZFJlcXVlc3QuX3JlamVjdChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWFkSW50b1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZWFkSW50b1JlcXVlc3QuX3JlamVjdChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCBlKTtcbiAgICB9XG4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMShuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKFwiUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLlwiICsgbmFtZSArIFwiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbVwiKTtcbiAgICB9XG5cbiAgICB2YXIgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneShfYSkge1xuICAgICAgICAgICAgdmFyIGhpZ2hXYXRlck1hcmsgPSBfYS5oaWdoV2F0ZXJNYXJrO1xuICAgICAgICAgICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyaztcbiAgICAgICAgfVxuICAgICAgICBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3k7XG4gICAgfSgpKTtcblxuICAgIHZhciBDb3VudFF1ZXVpbmdTdHJhdGVneSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQ291bnRRdWV1aW5nU3RyYXRlZ3koX2EpIHtcbiAgICAgICAgICAgIHZhciBoaWdoV2F0ZXJNYXJrID0gX2EuaGlnaFdhdGVyTWFyaztcbiAgICAgICAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcms7XG4gICAgICAgIH1cbiAgICAgICAgQ291bnRRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIENvdW50UXVldWluZ1N0cmF0ZWd5O1xuICAgIH0oKSk7XG5cbiAgICAvLyBDbGFzcyBUcmFuc2Zvcm1TdHJlYW1cbiAgICB2YXIgVHJhbnNmb3JtU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0odHJhbnNmb3JtZXIsIHdyaXRhYmxlU3RyYXRlZ3ksIHJlYWRhYmxlU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lciA9PT0gdm9pZCAwKSB7IHRyYW5zZm9ybWVyID0ge307IH1cbiAgICAgICAgICAgIGlmICh3cml0YWJsZVN0cmF0ZWd5ID09PSB2b2lkIDApIHsgd3JpdGFibGVTdHJhdGVneSA9IHt9OyB9XG4gICAgICAgICAgICBpZiAocmVhZGFibGVTdHJhdGVneSA9PT0gdm9pZCAwKSB7IHJlYWRhYmxlU3RyYXRlZ3kgPSB7fTsgfVxuICAgICAgICAgICAgdmFyIHdyaXRhYmxlU2l6ZUZ1bmN0aW9uID0gd3JpdGFibGVTdHJhdGVneS5zaXplO1xuICAgICAgICAgICAgdmFyIHdyaXRhYmxlSGlnaFdhdGVyTWFyayA9IHdyaXRhYmxlU3RyYXRlZ3kuaGlnaFdhdGVyTWFyaztcbiAgICAgICAgICAgIHZhciByZWFkYWJsZVNpemVGdW5jdGlvbiA9IHJlYWRhYmxlU3RyYXRlZ3kuc2l6ZTtcbiAgICAgICAgICAgIHZhciByZWFkYWJsZUhpZ2hXYXRlck1hcmsgPSByZWFkYWJsZVN0cmF0ZWd5LmhpZ2hXYXRlck1hcms7XG4gICAgICAgICAgICB2YXIgd3JpdGFibGVUeXBlID0gdHJhbnNmb3JtZXIud3JpdGFibGVUeXBlO1xuICAgICAgICAgICAgaWYgKHdyaXRhYmxlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgd3JpdGFibGUgdHlwZSBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB3cml0YWJsZVNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24od3JpdGFibGVTaXplRnVuY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHdyaXRhYmxlSGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyaXRhYmxlSGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayh3cml0YWJsZUhpZ2hXYXRlck1hcmspO1xuICAgICAgICAgICAgdmFyIHJlYWRhYmxlVHlwZSA9IHRyYW5zZm9ybWVyLnJlYWRhYmxlVHlwZTtcbiAgICAgICAgICAgIGlmIChyZWFkYWJsZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHJlYWRhYmxlIHR5cGUgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVhZGFibGVTaXplQWxnb3JpdGhtID0gTWFrZVNpemVBbGdvcml0aG1Gcm9tU2l6ZUZ1bmN0aW9uKHJlYWRhYmxlU2l6ZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIGlmIChyZWFkYWJsZUhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkYWJsZUhpZ2hXYXRlck1hcmsgPSBWYWxpZGF0ZUFuZE5vcm1hbGl6ZUhpZ2hXYXRlck1hcmsocmVhZGFibGVIaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgICAgIHZhciBzdGFydFByb21pc2VfcmVzb2x2ZTtcbiAgICAgICAgICAgIHZhciBzdGFydFByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtKHRoaXMsIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKTtcbiAgICAgICAgICAgIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIodGhpcywgdHJhbnNmb3JtZXIpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0UmVzdWx0ID0gSW52b2tlT3JOb29wKHRyYW5zZm9ybWVyLCAnc3RhcnQnLCBbdGhpcy5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcl0pO1xuICAgICAgICAgICAgc3RhcnRQcm9taXNlX3Jlc29sdmUoc3RhcnRSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLCBcInJlYWRhYmxlXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdyZWFkYWJsZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUsIFwid3JpdGFibGVcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIoJ3dyaXRhYmxlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtO1xuICAgIH0oKSk7XG4gICAgZnVuY3Rpb24gSW5pdGlhbGl6ZVRyYW5zZm9ybVN0cmVhbShzdHJlYW0sIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKSB7XG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB3cml0ZUFsZ29yaXRobShjaHVuaykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWJvcnRBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobShzdHJlYW0sIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2xvc2VBbGdvcml0aG0oKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5fd3JpdGFibGUgPSBDcmVhdGVXcml0YWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0pO1xuICAgICAgICBmdW5jdGlvbiBwdWxsQWxnb3JpdGhtKCkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIHJlYXNvbik7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5fcmVhZGFibGUgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCByZWFkYWJsZUhpZ2hXYXRlck1hcmssIHJlYWRhYmxlU2l6ZUFsZ29yaXRobSk7XG4gICAgICAgIC8vIFRoZSBbW2JhY2twcmVzc3VyZV1dIHNsb3QgaXMgc2V0IHRvIHVuZGVmaW5lZCBzbyB0aGF0IGl0IGNhbiBiZSBpbml0aWFsaXNlZCBieSBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUuXG4gICAgICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlID0gdW5kZWZpbmVkO1xuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTtcbiAgICAgICAgLy8gVXNlZCBieSBJc1dyaXRhYmxlU3RyZWFtKCkgd2hpY2ggaXMgY2FsbGVkIGJ5IFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKS5cbiAgICAgICAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbSh4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ190cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gVGhpcyBpcyBhIG5vLW9wIGlmIGJvdGggc2lkZXMgYXJlIGFscmVhZHkgZXJyb3JlZC5cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIGUpIHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgZSk7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIGUpIHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoc3RyZWFtLl93cml0YWJsZS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyLCBlKTtcbiAgICAgICAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBQcmV0ZW5kIHRoYXQgcHVsbCgpIHdhcyBjYWxsZWQgdG8gcGVybWl0IGFueSBwZW5kaW5nIHdyaXRlKCkgY2FsbHMgdG8gY29tcGxldGUuIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSgpXG4gICAgICAgICAgICAvLyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gZW5xdWV1ZSgpIG9yIHB1bGwoKSBvbmNlIHRoZSBSZWFkYWJsZVN0cmVhbSBpcyBlcnJvcmVkLCBzbyB0aGlzIHdpbGwgd2lsbCBiZSB0aGUgZmluYWwgdGltZVxuICAgICAgICAgICAgLy8gX2JhY2twcmVzc3VyZSBpcyBzZXQuXG4gICAgICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKSB7XG4gICAgICAgIC8vIFBhc3NlcyBhbHNvIHdoZW4gY2FsbGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAgICAgIGlmIChzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTtcbiAgICB9XG4gICAgdmFyIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgaW5zdGFuY2VzIGNhbm5vdCBiZSBjcmVhdGVkIGRpcmVjdGx5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgXCJkZXNpcmVkU2l6ZVwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZWFkYWJsZUNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2VucXVldWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLCBjaHVuayk7XG4gICAgICAgIH07XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdlcnJvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCByZWFzb24pO1xuICAgICAgICB9O1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUudGVybWluYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3Rlcm1pbmF0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcbiAgICB9KCkpO1xuICAgIC8vIFRyYW5zZm9ybSBTdHJlYW0gRGVmYXVsdCBDb250cm9sbGVyIEFic3RyYWN0IE9wZXJhdGlvbnNcbiAgICBmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHgpIHtcbiAgICAgICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgdHJhbnNmb3JtQWxnb3JpdGhtLCBmbHVzaEFsZ29yaXRobSkge1xuICAgICAgICBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBzdHJlYW0uX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0gPSB0cmFuc2Zvcm1BbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtID0gZmx1c2hBbGdvcml0aG07XG4gICAgfVxuICAgIGZ1bmN0aW9uIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIoc3RyZWFtLCB0cmFuc2Zvcm1lcikge1xuICAgICAgICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICAgICAgdmFyIHRyYW5zZm9ybUFsZ29yaXRobSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAodHJhbnNmb3JtUmVzdWx0RSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHRyYW5zZm9ybVJlc3VsdEUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgdHJhbnNmb3JtTWV0aG9kID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtO1xuICAgICAgICBpZiAodHJhbnNmb3JtTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJhbnNmb3JtIGlzIG5vdCBhIG1ldGhvZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhbnNmb3JtQWxnb3JpdGhtID0gZnVuY3Rpb24gKGNodW5rKSB7IHJldHVybiBQcm9taXNlQ2FsbCh0cmFuc2Zvcm1NZXRob2QsIHRyYW5zZm9ybWVyLCBbY2h1bmssIGNvbnRyb2xsZXJdKTsgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmx1c2hBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh0cmFuc2Zvcm1lciwgJ2ZsdXNoJywgMCwgW2NvbnRyb2xsZXJdKTtcbiAgICAgICAgU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHRyYW5zZm9ybUFsZ29yaXRobSwgZmx1c2hBbGdvcml0aG0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3RyYW5zZm9ybUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbTtcbiAgICAgICAgdmFyIHJlYWRhYmxlQ29udHJvbGxlciA9IHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShyZWFkYWJsZUNvbnRyb2xsZXIpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGUgc2lkZSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHRocm90dGxlIHRyYW5zZm9ybSBpbnZvY2F0aW9ucyBiYXNlZCBvbiB0aGUgYmFja3ByZXNzdXJlIG9mIHRoZSBSZWFkYWJsZVN0cmVhbSwgYnV0IHdlIHN0aWxsXG4gICAgICAgIC8vIGFjY2VwdCBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoKSBjYWxscy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZWFkYWJsZVN0cmF0ZWd5LnNpemUoKSB0aHJvd3MuXG4gICAgICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSk7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW0uX3JlYWRhYmxlLl9zdG9yZWRFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFja3ByZXNzdXJlID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZShyZWFkYWJsZUNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAoYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKSB7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0sIGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0oY29udHJvbGxlciwgY2h1bmspIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybVByb21pc2UgPSBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0oY2h1bmspO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgodHJhbnNmb3JtUHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3IoY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSwgcik7XG4gICAgICAgICAgICB0aHJvdyByO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbTtcbiAgICAgICAgdmFyIHJlYWRhYmxlQ29udHJvbGxlciA9IHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShyZWFkYWJsZUNvbnRyb2xsZXIpID09PSB0cnVlKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBuZXcgVHlwZUVycm9yKCdUcmFuc2Zvcm1TdHJlYW0gdGVybWluYXRlZCcpO1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZXJyb3IpO1xuICAgIH1cbiAgICAvLyBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2luayBBbGdvcml0aG1zXG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtXcml0ZUFsZ29yaXRobShzdHJlYW0sIGNodW5rKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyO1xuICAgICAgICBpZiAoc3RyZWFtLl9iYWNrcHJlc3N1cmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBiYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlID0gc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKGJhY2twcmVzc3VyZUNoYW5nZVByb21pc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgd3JpdGFibGUgPSBzdHJlYW0uX3dyaXRhYmxlO1xuICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdyaXRhYmxlLl9zdGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgd3JpdGFibGUuX3N0b3JlZEVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGNvbnRyb2xsZXIsIGNodW5rKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0oY29udHJvbGxlciwgY2h1bmspO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Fib3J0QWxnb3JpdGhtKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgICAgIC8vIGFib3J0KCkgaXMgbm90IGNhbGxlZCBzeW5jaHJvbm91c2x5LCBzbyBpdCBpcyBwb3NzaWJsZSBmb3IgYWJvcnQoKSB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGFscmVhZHlcbiAgICAgICAgLy8gZXJyb3JlZC5cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCByZWFzb24pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Nsb3NlQWxnb3JpdGhtKHN0cmVhbSkge1xuICAgICAgICAvLyBzdHJlYW0uX3JlYWRhYmxlIGNhbm5vdCBjaGFuZ2UgYWZ0ZXIgY29uc3RydWN0aW9uLCBzbyBjYWNoaW5nIGl0IGFjcm9zcyBhIGNhbGwgdG8gdXNlciBjb2RlIGlzIHNhZmUuXG4gICAgICAgIHZhciByZWFkYWJsZSA9IHN0cmVhbS5fcmVhZGFibGU7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyO1xuICAgICAgICB2YXIgZmx1c2hQcm9taXNlID0gY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0oKTtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIC8vIFJldHVybiBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB1bmRlZmluZWQgb24gc3VjY2Vzcy5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKGZsdXNoUHJvbWlzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHJlYWRhYmxlLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVhZGFibGUuX3N0b3JlZEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlYWRhYmxlQ29udHJvbGxlciA9IHJlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgICAgICAgICBpZiAoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlcikgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yKHN0cmVhbSwgcik7XG4gICAgICAgICAgICB0aHJvdyByZWFkYWJsZS5fc3RvcmVkRXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlIEFsZ29yaXRobXNcbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobShzdHJlYW0pIHtcbiAgICAgICAgLy8gSW52YXJpYW50LiBFbmZvcmNlZCBieSB0aGUgcHJvbWlzZXMgcmV0dXJuZWQgYnkgc3RhcnQoKSBhbmQgcHVsbCgpLlxuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCBmYWxzZSk7XG4gICAgICAgIC8vIFByZXZlbnQgdGhlIG5leHQgcHVsbCgpIGNhbGwgdW50aWwgdGhlcmUgaXMgYmFja3ByZXNzdXJlLlxuICAgICAgICByZXR1cm4gc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlO1xuICAgIH1cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIuXG4gICAgZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEobmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJcIik7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBUcmFuc2Zvcm1TdHJlYW0uXG4gICAgZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLlwiICsgbmFtZSArIFwiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW1cIik7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5CeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5ID0gQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneTtcbiAgICBleHBvcnRzLkNvdW50UXVldWluZ1N0cmF0ZWd5ID0gQ291bnRRdWV1aW5nU3RyYXRlZ3k7XG4gICAgZXhwb3J0cy5SZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlU3RyZWFtO1xuICAgIGV4cG9ydHMuVHJhbnNmb3JtU3RyZWFtID0gVHJhbnNmb3JtU3RyZWFtO1xuICAgIGV4cG9ydHMuV3JpdGFibGVTdHJlYW0gPSBXcml0YWJsZVN0cmVhbTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb255ZmlsbC5qcy5tYXBcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk1hcDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBNYXBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXAtb2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdNYXAnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7XG4gIHZhciBJU19NQVAgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ01hcCcpICE9PSAtMTtcbiAgdmFyIElTX1dFQUsgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ1dlYWsnKSAhPT0gLTE7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgdmFyIE5hdGl2ZVByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yICYmIE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7XG4gIHZhciBleHBvcnRlZCA9IHt9O1xuXG4gIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbiAoS0VZKSB7XG4gICAgdmFyIG5hdGl2ZU1ldGhvZCA9IE5hdGl2ZVByb3RvdHlwZVtLRVldO1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb3RvdHlwZSwgS0VZLFxuICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdnZXQnID8gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IHVuZGVmaW5lZCA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHlwZW9mIE5hdGl2ZUNvbnN0cnVjdG9yICE9ICdmdW5jdGlvbicgfHwgIShJU19XRUFLIHx8IE5hdGl2ZVByb3RvdHlwZS5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSkge1xuICAgIC8vIGNyZWF0ZSBjb2xsZWN0aW9uIGNvbnN0cnVjdG9yXG4gICAgQ29uc3RydWN0b3IgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCksIGR1bW15LCBDb25zdHJ1Y3Rvcik7XG4gICAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB0aGF0LCBJU19NQVApO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IgfSwgZXhwb3J0ZWQpO1xuXG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufTtcbiIsInZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xuXG52YXIgTUVUQURBVEEgPSB1aWQoJ21ldGEnKTtcbnZhciBpZCA9IDA7XG5cbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgc2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgZGVmaW5lUHJvcGVydHkoaXQsIE1FVEFEQVRBLCB7IHZhbHVlOiB7XG4gICAgb2JqZWN0SUQ6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHdlYWtEYXRhOiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcblxudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gYSBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS5vYmplY3RJRDtcbn07XG5cbnZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gdGhlIHN0b3JlIG9mIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTtcbn07XG5cbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWklORyAmJiBtZXRhLlJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIFJFUVVJUkVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cbmhpZGRlbktleXNbTUVUQURBVEFdID0gdHJ1ZTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gbWFrZXMgc3ViY2xhc3Npbmcgd29yayBjb3JyZWN0IGZvciB3cmFwcGVkIGJ1aWx0LWluc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJHRoaXMsIGR1bW15LCBXcmFwcGVyKSB7XG4gIHZhciBOZXdUYXJnZXQsIE5ld1RhcmdldFByb3RvdHlwZTtcbiAgaWYgKFxuICAgIC8vIGl0IGNhbiB3b3JrIG9ubHkgd2l0aCBuYXRpdmUgYHNldFByb3RvdHlwZU9mYFxuICAgIHNldFByb3RvdHlwZU9mICYmXG4gICAgLy8gd2UgaGF2ZW4ndCBjb21wbGV0ZWx5IGNvcnJlY3QgcHJlLUVTNiB3YXkgZm9yIGdldHRpbmcgYG5ldy50YXJnZXRgLCBzbyB1c2UgdGhpc1xuICAgIHR5cGVvZiAoTmV3VGFyZ2V0ID0gZHVtbXkuY29uc3RydWN0b3IpID09ICdmdW5jdGlvbicgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5mYXN0S2V5O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGluZGV4OiBjcmVhdGUobnVsbCksXG4gICAgICAgIGZpcnN0OiB1bmRlZmluZWQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgc2l6ZTogMFxuICAgICAgfSk7XG4gICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHRoYXQsIElTX01BUCk7XG4gICAgfSk7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgdmFyIHByZXZpb3VzLCBpbmRleDtcbiAgICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XG4gICAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7XG4gICAgICAgICAgaW5kZXg6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91czogcHJldmlvdXMgPSBzdGF0ZS5sYXN0LFxuICAgICAgICAgIG5leHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZW1vdmVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXN0YXRlLmZpcnN0KSBzdGF0ZS5maXJzdCA9IGVudHJ5O1xuICAgICAgICBpZiAocHJldmlvdXMpIHByZXZpb3VzLm5leHQgPSBlbnRyeTtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplKys7XG4gICAgICAgIGVsc2UgdGhhdC5zaXplKys7XG4gICAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09ICdGJykgc3RhdGUuaW5kZXhbaW5kZXhdID0gZW50cnk7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICB2YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgLy8gZmFzdCBjYXNlXG4gICAgICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gICAgICB2YXIgZW50cnk7XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHN0YXRlLmluZGV4W2luZGV4XTtcbiAgICAgIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICAgICAgZm9yIChlbnRyeSA9IHN0YXRlLmZpcnN0OyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uZXh0KSB7XG4gICAgICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBkYXRhID0gc3RhdGUuaW5kZXg7XG4gICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0O1xuICAgICAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplID0gMDtcbiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgICBkZWxldGUgc3RhdGUuaW5kZXhbZW50cnkuaW5kZXhdO1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm5leHQgPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnByZXZpb3VzID0gcHJldjtcbiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT0gZW50cnkpIHN0YXRlLmZpcnN0ID0gbmV4dDtcbiAgICAgICAgICBpZiAoc3RhdGUubGFzdCA9PSBlbnRyeSkgc3RhdGUubGFzdCA9IHByZXY7XG4gICAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplLS07XG4gICAgICAgICAgZWxzZSB0aGF0LnNpemUtLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7XG4gICAgICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHtcbiAgICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJztcbiAgICB2YXIgZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpO1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICBkZWZpbmVJdGVyYXRvcihDLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9O1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS52YWx1ZSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguU2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYFNldGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNldC1vYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ1NldCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMud2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguV2Vha01hcDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25XZWFrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGVuZm9yY2VJdGVybmFsU3RhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKS5lbmZvcmNlO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcblxudmFyIElTX0lFMTEgPSAhZ2xvYmFsLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xudmFyIEludGVybmFsV2Vha01hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtd2Vha21hcC1jb25zdHJ1Y3RvclxudmFyICRXZWFrTWFwID0gbW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdXZWFrTWFwJywgd3JhcHBlciwgY29sbGVjdGlvbldlYWspO1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG4vLyBXZSBjYW4ndCB1c2UgZmVhdHVyZSBkZXRlY3Rpb24gYmVjYXVzZSBpdCBjcmFzaCBzb21lIG9sZCBJRSBidWlsZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80ODVcbmlmIChOQVRJVkVfV0VBS19NQVAgJiYgSVNfSUUxMSkge1xuICBJbnRlcm5hbFdlYWtNYXAgPSBjb2xsZWN0aW9uV2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCAnV2Vha01hcCcsIHRydWUpO1xuICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTtcbiAgdmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVEZWxldGUgPSBXZWFrTWFwUHJvdG90eXBlWydkZWxldGUnXTtcbiAgdmFyIG5hdGl2ZUhhcyA9IFdlYWtNYXBQcm90b3R5cGUuaGFzO1xuICB2YXIgbmF0aXZlR2V0ID0gV2Vha01hcFByb3RvdHlwZS5nZXQ7XG4gIHZhciBuYXRpdmVTZXQgPSBXZWFrTWFwUHJvdG90eXBlLnNldDtcbiAgcmVkZWZpbmVBbGwoV2Vha01hcFByb3RvdHlwZSwge1xuICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGV0ZS5jYWxsKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuWydkZWxldGUnXShrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plbi5oYXMoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KSA/IG5hdGl2ZUdldC5jYWxsKHRoaXMsIGtleSkgOiBzdGF0ZS5mcm96ZW4uZ2V0KGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVHZXQuY2FsbCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSkgPyBuYXRpdmVTZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlKSA6IHN0YXRlLmZyb3plbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgbmF0aXZlU2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGdldFdlYWtEYXRhID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykuZ2V0V2Vha0RhdGE7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIEFycmF5SXRlcmF0aW9uTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpO1xudmFyICRoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcbnZhciBmaW5kID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZDtcbnZhciBmaW5kSW5kZXggPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kSW5kZXg7XG52YXIgaWQgPSAwO1xuXG4vLyBmYWxsYmFjayBmb3IgdW5jYXVnaHQgZnJvemVuIGtleXNcbnZhciB1bmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKHN0b3JlKSB7XG4gIHJldHVybiBzdG9yZS5mcm96ZW4gfHwgKHN0b3JlLmZyb3plbiA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKCkpO1xufTtcblxudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW50cmllcyA9IFtdO1xufTtcblxudmFyIGZpbmRVbmNhdWdodEZyb3plbiA9IGZ1bmN0aW9uIChzdG9yZSwga2V5KSB7XG4gIHJldHVybiBmaW5kKHN0b3JlLmVudHJpZXMsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5cblVuY2F1Z2h0RnJvemVuU3RvcmUucHJvdG90eXBlID0ge1xuICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZiAoZW50cnkpIHJldHVybiBlbnRyeVsxXTtcbiAgfSxcbiAgaGFzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuICEhZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZiAoZW50cnkpIGVudHJ5WzFdID0gdmFsdWU7XG4gICAgZWxzZSB0aGlzLmVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LFxuICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBpbmRleCA9IGZpbmRJbmRleCh0aGlzLmVudHJpZXMsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgdGhpcy5lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpZDogaWQrKyxcbiAgICAgICAgZnJvemVuOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHRoYXQsIElTX01BUCk7XG4gICAgfSk7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTtcbiAgICAgIGVsc2UgZGF0YVtzdGF0ZS5pZF0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgc3RhdGUuaWQpICYmIGRlbGV0ZSBkYXRhW3N0YXRlLmlkXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgc3RhdGUuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIElTX01BUCA/IHtcbiAgICAgIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEM7XG4gIH1cbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbnZhciBwdXNoID0gW10ucHVzaDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaC5jYWxsKHRhcmdldCwgdmFsdWUpOyAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNilcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy53ZWFrLXNldCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5XZWFrU2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25XZWFrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24td2VhaycpO1xuXG4vLyBgV2Vha1NldGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdlYWtzZXQtY29uc3RydWN0b3JcbmNvbGxlY3Rpb24oJ1dlYWtTZXQnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpIHsgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCBjb2xsZWN0aW9uV2Vhayk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0Jyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdjb2RlUG9pbnRBdCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY29kZUF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jb2RlQXQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSB9LCB7XG4gIGNvZGVQb2ludEF0OiBmdW5jdGlvbiBjb2RlUG9pbnRBdChwb3MpIHtcbiAgICByZXR1cm4gY29kZUF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5TdHJpbmcuZnJvbUNvZGVQb2ludDtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBuYXRpdmVGcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbnZhciBJTkNPUlJFQ1RfTEVOR1RIID0gISFuYXRpdmVGcm9tQ29kZVBvaW50ICYmIG5hdGl2ZUZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDE7XG5cbi8vIGBTdHJpbmcuZnJvbUNvZGVQb2ludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcuZnJvbWNvZGVwb2ludFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0xFTkdUSCB9LCB7XG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYgKHRvQWJzb2x1dGVJbmRleChjb2RlLCAweDEwRkZGRikgIT09IGNvZGUpIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgZWxlbWVudHMucHVzaChjb2RlIDwgMHgxMDAwMFxuICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgICA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLCBjb2RlICUgMHg0MDAgKyAweERDMDApXG4gICAgICApO1xuICAgIH0gcmV0dXJuIGVsZW1lbnRzLmpvaW4oJycpO1xuICB9XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN5bWJvbDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7XG52YXIgTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEID0gJ01heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCc7XG5cbi8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuLy8gZGVvcHRpbWl6YXRpb24gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUID0gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyYXkgPSBbXTtcbiAgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7XG4gIHJldHVybiBhcnJheS5jb25jYXQoKVswXSAhPT0gYXJyYXk7XG59KTtcblxudmFyIFNQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ2NvbmNhdCcpO1xuXG52YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHtcbiAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgc3ByZWFkYWJsZSA9IE9bSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTtcbn07XG5cbnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhU1BFQ0lFU19TVVBQT1JUO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29uY2F0XG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAaXNDb25jYXRTcHJlYWRhYmxlIGFuZCBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KGFyZykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGksIGssIGxlbmd0aCwgbGVuLCBFO1xuICAgIGZvciAoaSA9IC0xLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIEUgPSBpID09PSAtMSA/IE8gOiBhcmd1bWVudHNbaV07XG4gICAgICBpZiAoaXNDb25jYXRTcHJlYWRhYmxlKEUpKSB7XG4gICAgICAgIGxlbiA9IHRvTGVuZ3RoKEUubGVuZ3RoKTtcbiAgICAgICAgaWYgKG4gKyBsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgaysrLCBuKyspIGlmIChrIGluIEUpIGNyZWF0ZVByb3BlcnR5KEEsIG4sIEVba10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG4gPj0gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4rKywgRSk7XG4gICAgICB9XG4gICAgfVxuICAgIEEubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIC8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc3XG4gIHJldHVybiBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gYXJyYXkuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGZvbzogMSB9O1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5W01FVEhPRF9OQU1FXShCb29sZWFuKS5mb28gIT09IDE7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgbmF0aXZlT2JqZWN0Q3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCcpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5mb3JFYWNoO1xuXG52YXIgSElEREVOID0gc2hhcmVkS2V5KCdoaWRkZW4nKTtcbnZhciBTWU1CT0wgPSAnU3ltYm9sJztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeScpO1xudmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIFVTRV9TRVRURVIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0Q3JlYXRlKG5hdGl2ZURlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIHZhciBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yID0gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgUCk7XG4gIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKSBkZWxldGUgT2JqZWN0UHJvdG90eXBlW1BdO1xuICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgaWYgKE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgJiYgTyAhPT0gT2JqZWN0UHJvdG90eXBlKSB7XG4gICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTtcbiAgfVxufSA6IG5hdGl2ZURlZmluZVByb3BlcnR5O1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcsIGRlc2NyaXB0aW9uKSB7XG4gIHZhciBzeW1ib2wgPSBBbGxTeW1ib2xzW3RhZ10gPSBuYXRpdmVPYmplY3RDcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc2V0SW50ZXJuYWxTdGF0ZShzeW1ib2wsIHtcbiAgICB0eXBlOiBTWU1CT0wsXG4gICAgdGFnOiB0YWcsXG4gICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXG4gIH0pO1xuICBpZiAoIURFU0NSSVBUT1JTKSBzeW1ib2wuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgcmV0dXJuIHN5bWJvbDtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoaXQpIGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGlmIChPID09PSBPYmplY3RQcm90b3R5cGUpICRkZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQLCBBdHRyaWJ1dGVzKTtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghQXR0cmlidXRlcy5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhPLCBISURERU4pKSBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBISURERU4sIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB7fSkpO1xuICAgICAgT1tISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKE8sIEhJRERFTikgJiYgT1tISURERU5dW2tleV0pIE9bSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBBdHRyaWJ1dGVzID0gbmF0aXZlT2JqZWN0Q3JlYXRlKEF0dHJpYnV0ZXMsIHsgZW51bWVyYWJsZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjcmlwdG9yKE8sIGtleSwgQXR0cmlidXRlcyk7XG4gIH0gcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIGtleSwgQXR0cmlidXRlcyk7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wZXJ0aWVzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMocHJvcGVydGllcykuY29uY2F0KCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcGVydGllcykpO1xuICAkZm9yRWFjaChrZXlzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFERVNDUklQVE9SUyB8fCAkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChwcm9wZXJ0aWVzLCBrZXkpKSAkZGVmaW5lUHJvcGVydHkoTywga2V5LCBwcm9wZXJ0aWVzW2tleV0pO1xuICB9KTtcbiAgcmV0dXJuIE87XG59O1xuXG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyBuYXRpdmVPYmplY3RDcmVhdGUoTykgOiAkZGVmaW5lUHJvcGVydGllcyhuYXRpdmVPYmplY3RDcmVhdGUoTyksIFByb3BlcnRpZXMpO1xufTtcblxudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIFAgPSB0b1ByaW1pdGl2ZShWLCB0cnVlKTtcbiAgdmFyIGVudW1lcmFibGUgPSBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRoaXMsIFApO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhcyhBbGxTeW1ib2xzLCBQKSAmJiAhaGFzKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIFApKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbnVtZXJhYmxlIHx8ICFoYXModGhpcywgUCkgfHwgIWhhcyhBbGxTeW1ib2xzLCBQKSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1bUF0gPyBlbnVtZXJhYmxlIDogdHJ1ZTtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgdmFyIGl0ID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgZGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTtcbiAgaWYgKGRlc2NyaXB0b3IgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkge1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGRlc2NyaXB0b3I7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoTykpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKGhpZGRlbktleXMsIGtleSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTykge1xuICB2YXIgSVNfT0JKRUNUX1BST1RPVFlQRSA9IE8gPT09IE9iamVjdFByb3RvdHlwZTtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhJU19PQkpFQ1RfUFJPVE9UWVBFID8gT2JqZWN0UHJvdG90eXBlU3ltYm9scyA6IHRvSW5kZXhlZE9iamVjdChPKSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgKCFJU19PQkpFQ1RfUFJPVE9UWVBFIHx8IGhhcyhPYmplY3RQcm90b3R5cGUsIGtleSkpKSB7XG4gICAgICByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBgU3ltYm9sYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLWNvbnN0cnVjdG9yXG5pZiAoIU5BVElWRV9TWU1CT0wpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgdGFnID0gdWlkKGRlc2NyaXB0aW9uKTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlKSBzZXR0ZXIuY2FsbChPYmplY3RQcm90b3R5cGVTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2NyaXB0b3IodGhpcywgdGFnLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBVU0VfU0VUVEVSKSBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiBzZXR0ZXIgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7XG4gIH07XG5cbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7XG4gIH0pO1xuXG4gIHJlZGVmaW5lKCRTeW1ib2wsICd3aXRob3V0U2V0dGVyJywgZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIHdyYXAodWlkKGRlc2NyaXB0aW9uKSwgZGVzY3JpcHRpb24pO1xuICB9KTtcblxuICBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mID0gJGRlZmluZVByb3BlcnR5O1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdlbGxLbm93blN5bWJvbChuYW1lKSwgbmFtZSk7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtU3ltYm9sLWRlc2NyaXB0aW9uXG4gICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoJFN5bWJvbFtQUk9UT1RZUEVdLCAnZGVzY3JpcHRpb24nLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5kZXNjcmlwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIUlTX1BVUkUpIHtcbiAgICAgIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIU5BVElWRV9TWU1CT0wgfSwge1xuICBTeW1ib2w6ICRTeW1ib2xcbn0pO1xuXG4kZm9yRWFjaChvYmplY3RLZXlzKFdlbGxLbm93blN5bWJvbHNTdG9yZSksIGZ1bmN0aW9uIChuYW1lKSB7XG4gIGRlZmluZVdlbGxLbm93blN5bWJvbChuYW1lKTtcbn0pO1xuXG4kKHsgdGFyZ2V0OiBTWU1CT0wsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wgfSwge1xuICAvLyBgU3ltYm9sLmZvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5mb3JcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgc3RyaW5nID0gU3RyaW5nKGtleSk7XG4gICAgaWYgKGhhcyhTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5LCBzdHJpbmcpKSByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddO1xuICAgIHZhciBzeW1ib2wgPSAkU3ltYm9sKHN0cmluZyk7XG4gICAgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddID0gc3ltYm9sO1xuICAgIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltYm9sXSA9IHN0cmluZztcbiAgICByZXR1cm4gc3ltYm9sO1xuICB9LFxuICAvLyBgU3ltYm9sLmtleUZvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5rZXlmb3JcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcbiAgICBpZiAoaGFzKFN5bWJvbFRvU3RyaW5nUmVnaXN0cnksIHN5bSkpIHJldHVybiBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5W3N5bV07XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSBmYWxzZTsgfVxufSk7XG5cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICAvLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvclxufSk7XG5cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5c3ltYm9sc1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyBDaHJvbWUgMzggYW5kIDM5IGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBmYWlscyBvbiBwcmltaXRpdmVzXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNDQzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBmYWlscyhmdW5jdGlvbiAoKSB7IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKDEpOyB9KSB9LCB7XG4gIGdldE93blByb3BlcnR5U3ltYm9sczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gICAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKHRvT2JqZWN0KGl0KSk7XG4gIH1cbn0pO1xuXG4vLyBgSlNPTi5zdHJpbmdpZnlgIG1ldGhvZCBiZWhhdmlvciB3aXRoIHN5bWJvbHNcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24uc3RyaW5naWZ5XG5pZiAoJHN0cmluZ2lmeSkge1xuICB2YXIgRk9SQ0VEX0pTT05fU1RSSU5HSUZZID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBzeW1ib2wgPSAkU3ltYm9sKCk7XG4gICAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgICByZXR1cm4gJHN0cmluZ2lmeShbc3ltYm9sXSkgIT0gJ1tudWxsXSdcbiAgICAgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAgICAgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPSAne30nXG4gICAgICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICAgICAgfHwgJHN0cmluZ2lmeShPYmplY3Qoc3ltYm9sKSkgIT0gJ3t9JztcbiAgfSk7XG5cbiAgJCh7IHRhcmdldDogJ0pTT04nLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9KU09OX1NUUklOR0lGWSB9LCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgICAgdmFyIGluZGV4ID0gMTtcbiAgICAgIHZhciAkcmVwbGFjZXI7XG4gICAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGluZGV4KSBhcmdzLnB1c2goYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICAgICRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICAgIHJldHVybiAkc3RyaW5naWZ5LmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZVxuaWYgKCEkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbn1cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddYCBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCBTWU1CT0wpO1xuXG5oaWRkZW5LZXlzW0hJRERFTl0gPSB0cnVlO1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xuXG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KGl0KSk7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG5leHBvcnRzLmYgPSB3ZWxsS25vd25TeW1ib2w7XG4iLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FKSB7XG4gIHZhciBTeW1ib2wgPSBwYXRoLlN5bWJvbCB8fCAocGF0aC5TeW1ib2wgPSB7fSk7XG4gIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwge1xuICAgIHZhbHVlOiB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYoTkFNRSlcbiAgfSk7XG59O1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5hc3luY0l0ZXJhdG9yYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmFzeW5jaXRlcmF0b3JcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpO1xuIiwiLy8gYFN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25gIGdldHRlclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvblxuJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG5cbnZhciBOYXRpdmVTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xuXG5pZiAoREVTQ1JJUFRPUlMgJiYgdHlwZW9mIE5hdGl2ZVN5bWJvbCA9PSAnZnVuY3Rpb24nICYmICghKCdkZXNjcmlwdGlvbicgaW4gTmF0aXZlU3ltYm9sLnByb3RvdHlwZSkgfHxcbiAgLy8gU2FmYXJpIDEyIGJ1Z1xuICBOYXRpdmVTeW1ib2woKS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkXG4pKSB7XG4gIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTtcbiAgLy8gd3JhcCBTeW1ib2wgY29uc3RydWN0b3IgZm9yIGNvcnJlY3Qgd29yayB3aXRoIHVuZGVmaW5lZCBkZXNjcmlwdGlvblxuICB2YXIgU3ltYm9sV3JhcHBlciA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0cmluZyhhcmd1bWVudHNbMF0pO1xuICAgIHZhciByZXN1bHQgPSB0aGlzIGluc3RhbmNlb2YgU3ltYm9sV3JhcHBlclxuICAgICAgPyBuZXcgTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKVxuICAgICAgLy8gaW4gRWRnZSAxMywgU3RyaW5nKFN5bWJvbCh1bmRlZmluZWQpKSA9PT0gJ1N5bWJvbCh1bmRlZmluZWQpJ1xuICAgICAgOiBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gTmF0aXZlU3ltYm9sKCkgOiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gJycpIEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZVtyZXN1bHRdID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKFN5bWJvbFdyYXBwZXIsIE5hdGl2ZVN5bWJvbCk7XG4gIHZhciBzeW1ib2xQcm90b3R5cGUgPSBTeW1ib2xXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZVN5bWJvbC5wcm90b3R5cGU7XG4gIHN5bWJvbFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN5bWJvbFdyYXBwZXI7XG5cbiAgdmFyIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG90eXBlLnRvU3RyaW5nO1xuICB2YXIgbmF0aXZlID0gU3RyaW5nKE5hdGl2ZVN5bWJvbCgndGVzdCcpKSA9PSAnU3ltYm9sKHRlc3QpJztcbiAgdmFyIHJlZ2V4cCA9IC9eU3ltYm9sXFwoKC4qKVxcKVteKV0rJC87XG4gIGRlZmluZVByb3BlcnR5KHN5bWJvbFByb3RvdHlwZSwgJ2Rlc2NyaXB0aW9uJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkge1xuICAgICAgdmFyIHN5bWJvbCA9IGlzT2JqZWN0KHRoaXMpID8gdGhpcy52YWx1ZU9mKCkgOiB0aGlzO1xuICAgICAgdmFyIHN0cmluZyA9IHN5bWJvbFRvU3RyaW5nLmNhbGwoc3ltYm9sKTtcbiAgICAgIGlmIChoYXMoRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlLCBzeW1ib2wpKSByZXR1cm4gJyc7XG4gICAgICB2YXIgZGVzYyA9IG5hdGl2ZSA/IHN0cmluZy5zbGljZSg3LCAtMSkgOiBzdHJpbmcucmVwbGFjZShyZWdleHAsICckMScpO1xuICAgICAgcmV0dXJuIGRlc2MgPT09ICcnID8gdW5kZWZpbmVkIDogZGVzYztcbiAgICB9XG4gIH0pO1xuXG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgU3ltYm9sOiBTeW1ib2xXcmFwcGVyXG4gIH0pO1xufVxuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5oYXNJbnN0YW5jZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5oYXNpbnN0YW5jZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdoYXNJbnN0YW5jZScpO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXNjb25jYXRzcHJlYWRhYmxlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5pdGVyYXRvcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5pdGVyYXRvclxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5tYXRjaGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5tYXRjaFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5tYXRjaEFsbGAgd2VsbC1rbm93biBzeW1ib2xcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2hBbGwnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wucmVwbGFjZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5yZXBsYWNlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc2VhcmNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNlYXJjaFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzZWFyY2gnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc3BlY2llc2Agd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGVjaWVzXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc3BsaXRgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuc3BsaXRcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnc3BsaXQnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudG9QcmltaXRpdmVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9wcmltaXRpdmVcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudG9TdHJpbmdUYWdgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9zdHJpbmd0YWdcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudW5zY29wYWJsZXNgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudW5zY29wYWJsZXNcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbiIsInZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xuXG4vLyBNYXRoW0BAdG9TdHJpbmdUYWddIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG5cbi8vIEpTT05bQEB0b1N0cmluZ1RhZ10gcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24tQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3BhZFN0YXJ0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkcGFkU3RhcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCcpLnN0YXJ0O1xudmFyIFdFQktJVF9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZC13ZWJraXQtYnVnJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkc3RhcnRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXRUJLSVRfQlVHIH0sIHtcbiAgcGFkU3RhcnQ6IGZ1bmN0aW9uIHBhZFN0YXJ0KG1heExlbmd0aCAvKiAsIGZpbGxTdHJpbmcgPSAnICcgKi8pIHtcbiAgICByZXR1cm4gJHBhZFN0YXJ0KHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyBwYWRTdGFydCwgcGFkRW5kIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfRU5EKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIG1heExlbmd0aCwgZmlsbFN0cmluZykge1xuICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpbGxTdHIgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiBTdHJpbmcoZmlsbFN0cmluZyk7XG4gICAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gICAgdmFyIGZpbGxMZW4sIHN0cmluZ0ZpbGxlcjtcbiAgICBpZiAoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aCB8fCBmaWxsU3RyID09ICcnKSByZXR1cm4gUztcbiAgICBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoO1xuICAgIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIGNlaWwoZmlsbExlbiAvIGZpbGxTdHIubGVuZ3RoKSk7XG4gICAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKSBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gICAgcmV0dXJuIElTX0VORCA/IFMgKyBzdHJpbmdGaWxsZXIgOiBzdHJpbmdGaWxsZXIgKyBTO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRzdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUucGFkRW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRlbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcbm1vZHVsZS5leHBvcnRzID0gJycucmVwZWF0IHx8IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpO1xuICBmb3IgKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpIGlmIChuICYgMSkgcmVzdWx0ICs9IHN0cjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXVuc2FmZS1yZWdleFxubW9kdWxlLmV4cG9ydHMgPSAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8oIE1vYmlsZVxcL1xcdyspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1lbmQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3BhZEVuZCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHBhZEVuZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcGFkJykuZW5kO1xudmFyIFdFQktJVF9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZC13ZWJraXQtYnVnJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZGVuZFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFdFQktJVF9CVUcgfSwge1xuICBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuICRwYWRFbmQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QudmFsdWVzO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHZhbHVlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXknKS52YWx1ZXM7XG5cbi8vIGBPYmplY3QudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoTykge1xuICAgIHJldHVybiAkdmFsdWVzKE8pO1xuICB9XG59KTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbi8vIGBPYmplY3QueyBlbnRyaWVzLCB2YWx1ZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUT19FTlRSSUVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChpdCk7XG4gICAgdmFyIGtleXMgPSBvYmplY3RLZXlzKE8pO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGkpIHtcbiAgICAgIGtleSA9IGtleXNbaSsrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChPLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFRPX0VOVFJJRVMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuICBlbnRyaWVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBPYmplY3QudmFsdWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnZhbHVlc1xuICB2YWx1ZXM6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZW50cmllcztcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHtcbiAgICByZXR1cm4gJGVudHJpZXMoTyk7XG4gIH1cbn0pO1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG4vKipcbiAqIEBtb2R1bGUgcGRmanNMaWJcbiAqL1xuXG5pbXBvcnQge1xuICBBYm9ydEV4Y2VwdGlvbixcbiAgYXNzZXJ0LFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgZ2V0VmVyYm9zaXR5TGV2ZWwsXG4gIGluZm8sXG4gIEludmFsaWRQREZFeGNlcHRpb24sXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzU2FtZU9yaWdpbixcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbixcbiAgUGFzc3dvcmRFeGNlcHRpb24sXG4gIHNldFZlcmJvc2l0eUxldmVsLFxuICBzaGFkb3csXG4gIHN0cmluZ1RvQnl0ZXMsXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbiAgVW5rbm93bkVycm9yRXhjZXB0aW9uLFxuICB1bnJlYWNoYWJsZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBkZXByZWNhdGVkLFxuICBET01DYW52YXNGYWN0b3J5LFxuICBET01DTWFwUmVhZGVyRmFjdG9yeSxcbiAgbG9hZFNjcmlwdCxcbiAgUGFnZVZpZXdwb3J0LFxuICBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24sXG4gIFN0YXRUaW1lcixcbn0gZnJvbSBcIi4vZGlzcGxheV91dGlscy5qc1wiO1xuaW1wb3J0IHsgRm9udEZhY2VPYmplY3QsIEZvbnRMb2FkZXIgfSBmcm9tIFwiLi9mb250X2xvYWRlci5qc1wiO1xuaW1wb3J0IHsgTm9kZUNhbnZhc0ZhY3RvcnksIE5vZGVDTWFwUmVhZGVyRmFjdG9yeSB9IGZyb20gXCIuL25vZGVfdXRpbHMuanNcIjtcbmltcG9ydCB7IEFubm90YXRpb25TdG9yYWdlIH0gZnJvbSBcIi4vYW5ub3RhdGlvbl9zdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhcGlDb21wYXRpYmlsaXR5UGFyYW1zIH0gZnJvbSBcIi4vYXBpX2NvbXBhdGliaWxpdHkuanNcIjtcbmltcG9ydCB7IENhbnZhc0dyYXBoaWNzIH0gZnJvbSBcIi4vY2FudmFzLmpzXCI7XG5pbXBvcnQgeyBHbG9iYWxXb3JrZXJPcHRpb25zIH0gZnJvbSBcIi4vd29ya2VyX29wdGlvbnMuanNcIjtcbmltcG9ydCB7IGlzTm9kZUpTIH0gZnJvbSBcIi4uL3NoYXJlZC9pc19ub2RlLmpzXCI7XG5pbXBvcnQgeyBNZXNzYWdlSGFuZGxlciB9IGZyb20gXCIuLi9zaGFyZWQvbWVzc2FnZV9oYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCIuL21ldGFkYXRhLmpzXCI7XG5pbXBvcnQgeyBPcHRpb25hbENvbnRlbnRDb25maWcgfSBmcm9tIFwiLi9vcHRpb25hbF9jb250ZW50X2NvbmZpZy5qc1wiO1xuaW1wb3J0IHsgUERGRGF0YVRyYW5zcG9ydFN0cmVhbSB9IGZyb20gXCIuL3RyYW5zcG9ydF9zdHJlYW0uanNcIjtcbmltcG9ydCB7IFdlYkdMQ29udGV4dCB9IGZyb20gXCIuL3dlYmdsLmpzXCI7XG5cbmNvbnN0IERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRSA9IDY1NTM2OyAvLyAyXjE2ID0gNjU1MzZcbmNvbnN0IFJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVCA9IDEwMDsgLy8gbXNcblxuY29uc3QgRGVmYXVsdENhbnZhc0ZhY3RvcnkgPVxuICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8IFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpKSAmJiBpc05vZGVKU1xuICAgID8gTm9kZUNhbnZhc0ZhY3RvcnlcbiAgICA6IERPTUNhbnZhc0ZhY3Rvcnk7XG5jb25zdCBEZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkgPVxuICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8IFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpKSAmJiBpc05vZGVKU1xuICAgID8gTm9kZUNNYXBSZWFkZXJGYWN0b3J5XG4gICAgOiBET01DTWFwUmVhZGVyRmFjdG9yeTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb259IElQREZTdHJlYW1GYWN0b3J5XG4gKiBAcGFyYW0ge0RvY3VtZW50SW5pdFBhcmFtZXRlcnN9IHBhcmFtcyAtIFRoZSBkb2N1bWVudCBpbml0aWFsaXphdGlvblxuICogICBwYXJhbWV0ZXJzLiBUaGUgXCJ1cmxcIiBrZXkgaXMgYWx3YXlzIHByZXNlbnQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlLCB3aGljaCBpcyByZXNvbHZlZCB3aXRoIGFuIGluc3RhbmNlIG9mXG4gKiAgIHtJUERGU3RyZWFtfS5cbiAqIEBpZ25vcmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlIElQREZTdHJlYW1GYWN0b3J5XG4gKiBAcHJpdmF0ZVxuICovXG5sZXQgY3JlYXRlUERGTmV0d29ya1N0cmVhbTtcblxuLyoqXG4gKiBTZXRzIHRoZSBmdW5jdGlvbiB0aGF0IGluc3RhbnRpYXRlcyBhbiB7SVBERlN0cmVhbX0gYXMgYW4gYWx0ZXJuYXRpdmUgUERGXG4gKiBkYXRhIHRyYW5zcG9ydC5cbiAqXG4gKiBAcGFyYW0ge0lQREZTdHJlYW1GYWN0b3J5fSBwZGZOZXR3b3JrU3RyZWFtRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGZ1bmN0aW9uXG4gKiAgIHRoYXQgdGFrZXMgZG9jdW1lbnQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAoaW5jbHVkaW5nIGEgXCJ1cmxcIikgYW5kXG4gKiAgIHJldHVybnMgYSBwcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIHdpdGggYW4gaW5zdGFuY2Ugb2Yge0lQREZTdHJlYW19LlxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBzZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeShwZGZOZXR3b3JrU3RyZWFtRmFjdG9yeSkge1xuICBjcmVhdGVQREZOZXR3b3JrU3RyZWFtID0gcGRmTmV0d29ya1N0cmVhbUZhY3Rvcnk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgeyBJbnQ4QXJyYXkgfCBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkgfFxuICogICAgICAgICAgICBJbnQxNkFycmF5IHwgVWludDE2QXJyYXkgfFxuICogICAgICAgICAgICBJbnQzMkFycmF5IHwgVWludDMyQXJyYXkgfCBGbG9hdDMyQXJyYXkgfFxuICogICAgICAgICAgICBGbG9hdDY0QXJyYXlcbiAqIH0gVHlwZWRBcnJheVxuICovXG5cbi8qKlxuICogRG9jdW1lbnQgaW5pdGlhbGl6YXRpb24gLyBsb2FkaW5nIHBhcmFtZXRlcnMgb2JqZWN0LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERvY3VtZW50SW5pdFBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgb2YgdGhlIFBERi5cbiAqIEBwcm9wZXJ0eSB7VHlwZWRBcnJheXxBcnJheTxudW1iZXI+fHN0cmluZ30gW2RhdGFdIC0gQmluYXJ5IFBERiBkYXRhLiBVc2VcbiAqICAgIHR5cGVkIGFycmF5cyAoVWludDhBcnJheSkgdG8gaW1wcm92ZSB0aGUgbWVtb3J5IHVzYWdlLiBJZiBQREYgZGF0YSBpc1xuICogICAgQkFTRTY0LWVuY29kZWQsIHVzZSBgYXRvYigpYCB0byBjb252ZXJ0IGl0IHRvIGEgYmluYXJ5IHN0cmluZyBmaXJzdC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbaHR0cEhlYWRlcnNdIC0gQmFzaWMgYXV0aGVudGljYXRpb24gaGVhZGVycy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3dpdGhDcmVkZW50aWFsc10gLSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3RcbiAqICAgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyBzaG91bGQgYmUgbWFkZSB1c2luZyBjcmVkZW50aWFscyBzdWNoXG4gKiAgIGFzIGNvb2tpZXMgb3IgYXV0aG9yaXphdGlvbiBoZWFkZXJzLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXNzd29yZF0gLSBGb3IgZGVjcnlwdGluZyBwYXNzd29yZC1wcm90ZWN0ZWQgUERGcy5cbiAqIEBwcm9wZXJ0eSB7VHlwZWRBcnJheX0gW2luaXRpYWxEYXRhXSAtIEEgdHlwZWQgYXJyYXkgd2l0aCB0aGUgZmlyc3QgcG9ydGlvblxuICogICBvciBhbGwgb2YgdGhlIHBkZiBkYXRhLiBVc2VkIGJ5IHRoZSBleHRlbnNpb24gc2luY2Ugc29tZSBkYXRhIGlzIGFscmVhZHlcbiAqICAgbG9hZGVkIGJlZm9yZSB0aGUgc3dpdGNoIHRvIHJhbmdlIHJlcXVlc3RzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsZW5ndGhdIC0gVGhlIFBERiBmaWxlIGxlbmd0aC4gSXQncyB1c2VkIGZvciBwcm9ncmVzc1xuICogICByZXBvcnRzIGFuZCByYW5nZSByZXF1ZXN0cyBvcGVyYXRpb25zLlxuICogQHByb3BlcnR5IHtQREZEYXRhUmFuZ2VUcmFuc3BvcnR9IFtyYW5nZV0gLSBBbGxvd3MgZm9yIHVzaW5nIGEgY3VzdG9tIHJhbmdlXG4gKiAgIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmFuZ2VDaHVua1NpemVdIC0gU3BlY2lmeSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBmZXRjaGVkXG4gKiAgIHBlciByYW5nZSByZXF1ZXN0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGxpbmsgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFfS5cbiAqIEBwcm9wZXJ0eSB7UERGV29ya2VyfSBbd29ya2VyXSAtIFRoZSB3b3JrZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGxvYWRpbmcgYW5kXG4gKiAgIHBhcnNpbmcgdGhlIFBERiBkYXRhLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt2ZXJib3NpdHldIC0gQ29udHJvbHMgdGhlIGxvZ2dpbmcgbGV2ZWw7IHRoZSBjb25zdGFudHNcbiAqICAgZnJvbSB7QGxpbmsgVmVyYm9zaXR5TGV2ZWx9IHNob3VsZCBiZSB1c2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkb2NCYXNlVXJsXSAtIFRoZSBiYXNlIFVSTCBvZiB0aGUgZG9jdW1lbnQsIHVzZWQgd2hlblxuICogICBhdHRlbXB0aW5nIHRvIHJlY292ZXIgdmFsaWQgYWJzb2x1dGUgVVJMcyBmb3IgYW5ub3RhdGlvbnMsIGFuZCBvdXRsaW5lXG4gKiAgIGl0ZW1zLCB0aGF0IChpbmNvcnJlY3RseSkgb25seSBzcGVjaWZ5IHJlbGF0aXZlIFVSTHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NNYXBVcmxdIC0gVGhlIFVSTCB3aGVyZSB0aGUgcHJlZGVmaW5lZCBBZG9iZSBDTWFwcyBhcmVcbiAqICAgbG9jYXRlZC4gSW5jbHVkZSB0aGUgdHJhaWxpbmcgc2xhc2guXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjTWFwUGFja2VkXSAtIFNwZWNpZmllcyBpZiB0aGUgQWRvYmUgQ01hcHMgYXJlIGJpbmFyeVxuICogICBwYWNrZWQgb3Igbm90LlxuICogQHByb3BlcnR5IHtPYmplY3R9IFtDTWFwUmVhZGVyRmFjdG9yeV0gLSBUaGUgZmFjdG9yeSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuXG4gKiAgIHJlYWRpbmcgYnVpbHQtaW4gQ01hcCBmaWxlcy4gUHJvdmlkaW5nIGEgY3VzdG9tIGZhY3RvcnkgaXMgdXNlZnVsIGZvclxuICogICBlbnZpcm9ubWVudHMgd2l0aG91dCBGZXRjaCBBUEkgb3IgYFhNTEh0dHBSZXF1ZXN0YCBzdXBwb3J0LCBzdWNoIGFzXG4gKiAgIE5vZGUuanMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtET01DTWFwUmVhZGVyRmFjdG9yeX0uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdG9wQXRFcnJvcnNdIC0gUmVqZWN0IGNlcnRhaW4gcHJvbWlzZXMsIGUuZy5cbiAqICAgYGdldE9wZXJhdG9yTGlzdGAsIGBnZXRUZXh0Q29udGVudGAsIGFuZCBgUmVuZGVyVGFza2AsIHdoZW4gdGhlIGFzc29jaWF0ZWRcbiAqICAgUERGIGRhdGEgY2Fubm90IGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIGluc3RlYWQgb2YgYXR0ZW1wdGluZyB0byByZWNvdmVyXG4gKiAgIHdoYXRldmVyIHBvc3NpYmxlIG9mIHRoZSBkYXRhLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhJbWFnZVNpemVdIC0gVGhlIG1heGltdW0gYWxsb3dlZCBpbWFnZSBzaXplIGluIHRvdGFsXG4gKiAgIHBpeGVscywgaS5lLiB3aWR0aCAqIGhlaWdodC4gSW1hZ2VzIGFib3ZlIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgcmVuZGVyZWQuXG4gKiAgIFVzZSAtMSBmb3Igbm8gbGltaXQsIHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpc0V2YWxTdXBwb3J0ZWRdIC0gRGV0ZXJtaW5lcyBpZiB3ZSBjYW4gZXZhbHVhdGUgc3RyaW5nc1xuICogICBhcyBKYXZhU2NyaXB0LiBQcmltYXJpbHkgdXNlZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIGZvbnQgcmVuZGVyaW5nLCBhbmRcbiAqICAgd2hlbiBwYXJzaW5nIFBERiBmdW5jdGlvbnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc2FibGVGb250RmFjZV0gLSBCeSBkZWZhdWx0IGZvbnRzIGFyZSBjb252ZXJ0ZWQgdG9cbiAqICAgT3BlblR5cGUgZm9udHMgYW5kIGxvYWRlZCB2aWEgYEBmb250LWZhY2VgIHJ1bGVzLiBJZiBkaXNhYmxlZCwgZm9udHMgd2lsbFxuICogICBiZSByZW5kZXJlZCB1c2luZyBhIGJ1aWx0LWluIGZvbnQgcmVuZGVyZXIgdGhhdCBjb25zdHJ1Y3RzIHRoZSBnbHlwaHMgd2l0aFxuICogICBwcmltaXRpdmUgcGF0aCBjb21tYW5kcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvbnRFeHRyYVByb3BlcnRpZXNdIC0gSW5jbHVkZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMsXG4gKiAgIHdoaWNoIGFyZSB1bnVzZWQgZHVyaW5nIHJlbmRlcmluZyBvZiBQREYgZG9jdW1lbnRzLCB3aGVuIGV4cG9ydGluZyB0aGVcbiAqICAgcGFyc2VkIGZvbnQgZGF0YSBmcm9tIHRoZSB3b3JrZXItdGhyZWFkLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZ1xuICogICBwdXJwb3NlcyAoYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSwgYnV0IG5vdGUgdGhhdCBpdCB3aWxsIGxlYWQgdG9cbiAqICAgaW5jcmVhc2VkIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7SFRNTERvY3VtZW50fSBbb3duZXJEb2N1bWVudF0gLSBTcGVjaWZ5IGFuIGV4cGxpY2l0IGRvY3VtZW50XG4gKiAgIGNvbnRleHQgdG8gY3JlYXRlIGVsZW1lbnRzIHdpdGggYW5kIHRvIGxvYWQgcmVzb3VyY2VzLCBzdWNoIGFzIGZvbnRzLFxuICogICBpbnRvLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBkb2N1bWVudC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc2FibGVSYW5nZV0gLSBEaXNhYmxlIHJhbmdlIHJlcXVlc3QgbG9hZGluZyBvZiBQREZcbiAqICAgZmlsZXMuIFdoZW4gZW5hYmxlZCwgYW5kIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgcGFydGlhbCBjb250ZW50IHJlcXVlc3RzLFxuICogICB0aGVuIHRoZSBQREYgd2lsbCBiZSBmZXRjaGVkIGluIGNodW5rcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc2FibGVTdHJlYW1dIC0gRGlzYWJsZSBzdHJlYW1pbmcgb2YgUERGIGZpbGUgZGF0YS5cbiAqICAgQnkgZGVmYXVsdCBQREYuanMgYXR0ZW1wdHMgdG8gbG9hZCBQREYgZmlsZXMgaW4gY2h1bmtzLiBUaGUgZGVmYXVsdCB2YWx1ZVxuICogICBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZUF1dG9GZXRjaF0gLSBEaXNhYmxlIHByZS1mZXRjaGluZyBvZiBQREYgZmlsZVxuICogICBkYXRhLiBXaGVuIHJhbmdlIHJlcXVlc3RzIGFyZSBlbmFibGVkIFBERi5qcyB3aWxsIGF1dG9tYXRpY2FsbHkga2VlcFxuICogICBmZXRjaGluZyBtb3JlIGRhdGEgZXZlbiBpZiBpdCBpc24ndCBuZWVkZWQgdG8gZGlzcGxheSB0aGUgY3VycmVudCBwYWdlLlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICpcbiAqICAgTk9URTogSXQgaXMgYWxzbyBuZWNlc3NhcnkgdG8gZGlzYWJsZSBzdHJlYW1pbmcsIHNlZSBhYm92ZSwgaW4gb3JkZXIgZm9yXG4gKiAgIGRpc2FibGluZyBvZiBwcmUtZmV0Y2hpbmcgdG8gd29yayBjb3JyZWN0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwZGZCdWddIC0gRW5hYmxlcyBzcGVjaWFsIGhvb2tzIGZvciBkZWJ1Z2dpbmcgUERGLmpzXG4gKiAgIChzZWUgYHdlYi9kZWJ1Z2dlci5qc2ApLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGRG9jdW1lbnRTdGF0c1xuICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBib29sZWFuPn0gc3RyZWFtVHlwZXMgLSBVc2VkIHN0cmVhbSB0eXBlcyBpbiB0aGVcbiAqICAgZG9jdW1lbnQgKGFuIGl0ZW0gaXMgc2V0IHRvIHRydWUgaWYgc3BlY2lmaWMgc3RyZWFtIElEIHdhcyB1c2VkIGluIHRoZVxuICogICBkb2N1bWVudCkuXG4gKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSBmb250VHlwZXMgLSBVc2VkIGZvbnQgdHlwZXMgaW4gdGhlXG4gKiAgIGRvY3VtZW50IChhbiBpdGVtIGlzIHNldCB0byB0cnVlIGlmIHNwZWNpZmljIGZvbnQgSUQgd2FzIHVzZWQgaW4gdGhlXG4gKiAgIGRvY3VtZW50KS5cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIGxvYWRpbmcgYSBQREYgYW5kIGludGVyYWN0aW5nIHdpdGggaXQuXG4gKlxuICogTk9URTogSWYgYSBVUkwgaXMgdXNlZCB0byBmZXRjaCB0aGUgUERGIGRhdGEgYSBzdGFuZGFyZCBGZXRjaCBBUEkgY2FsbCAob3JcbiAqIFhIUiBhcyBmYWxsYmFjaykgaXMgdXNlZCwgd2hpY2ggbWVhbnMgaXQgbXVzdCBmb2xsb3cgc2FtZSBvcmlnaW4gcnVsZXMsXG4gKiBlLmcuIG5vIGNyb3NzLWRvbWFpbiByZXF1ZXN0cyB3aXRob3V0IENPUlMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8VHlwZWRBcnJheXxEb2N1bWVudEluaXRQYXJhbWV0ZXJzfFBERkRhdGFSYW5nZVRyYW5zcG9ydH0gc3JjIC1cbiAqICAgQ2FuIGJlIGEgVVJMIHRvIHdoZXJlIGEgUERGIGZpbGUgaXMgbG9jYXRlZCwgYSB0eXBlZCBhcnJheSAoVWludDhBcnJheSlcbiAqICAgYWxyZWFkeSBwb3B1bGF0ZWQgd2l0aCBkYXRhIG9yIHBhcmFtZXRlciBvYmplY3QuXG4gKiBAcmV0dXJucyB7UERGRG9jdW1lbnRMb2FkaW5nVGFza31cbiAqL1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnQoc3JjKSB7XG4gIGNvbnN0IHRhc2sgPSBuZXcgUERGRG9jdW1lbnRMb2FkaW5nVGFzaygpO1xuXG4gIGxldCBzb3VyY2U7XG4gIGlmICh0eXBlb2Ygc3JjID09PSBcInN0cmluZ1wiKSB7XG4gICAgc291cmNlID0geyB1cmw6IHNyYyB9O1xuICB9IGVsc2UgaWYgKGlzQXJyYXlCdWZmZXIoc3JjKSkge1xuICAgIHNvdXJjZSA9IHsgZGF0YTogc3JjIH07XG4gIH0gZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgUERGRGF0YVJhbmdlVHJhbnNwb3J0KSB7XG4gICAgc291cmNlID0geyByYW5nZTogc3JjIH07XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBzcmMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIHBhcmFtZXRlciBpbiBnZXREb2N1bWVudCwgXCIgK1xuICAgICAgICAgIFwibmVlZCBlaXRoZXIgVWludDhBcnJheSwgc3RyaW5nIG9yIGEgcGFyYW1ldGVyIG9iamVjdFwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXNyYy51cmwgJiYgIXNyYy5kYXRhICYmICFzcmMucmFuZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIHBhcmFtZXRlciBvYmplY3Q6IG5lZWQgZWl0aGVyIC5kYXRhLCAucmFuZ2Ugb3IgLnVybFwiXG4gICAgICApO1xuICAgIH1cbiAgICBzb3VyY2UgPSBzcmM7XG4gIH1cbiAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IHJhbmdlVHJhbnNwb3J0ID0gbnVsbCxcbiAgICB3b3JrZXIgPSBudWxsO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgIGlmIChrZXkgPT09IFwidXJsXCIgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgLy8gVGhlIGZ1bGwgcGF0aCBpcyByZXF1aXJlZCBpbiB0aGUgJ3VybCcgZmllbGQuXG4gICAgICBwYXJhbXNba2V5XSA9IG5ldyBVUkwoc291cmNlW2tleV0sIHdpbmRvdy5sb2NhdGlvbikuaHJlZjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInJhbmdlXCIpIHtcbiAgICAgIHJhbmdlVHJhbnNwb3J0ID0gc291cmNlW2tleV07XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJ3b3JrZXJcIikge1xuICAgICAgd29ya2VyID0gc291cmNlW2tleV07XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJkYXRhXCIgJiYgIShzb3VyY2Vba2V5XSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAvLyBDb252ZXJ0aW5nIHN0cmluZyBvciBhcnJheS1saWtlIGRhdGEgdG8gVWludDhBcnJheS5cbiAgICAgIGNvbnN0IHBkZkJ5dGVzID0gc291cmNlW2tleV07XG4gICAgICBpZiAodHlwZW9mIHBkZkJ5dGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHBhcmFtc1trZXldID0gc3RyaW5nVG9CeXRlcyhwZGZCeXRlcyk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgcGRmQnl0ZXMgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgcGRmQnl0ZXMgIT09IG51bGwgJiZcbiAgICAgICAgIWlzTmFOKHBkZkJ5dGVzLmxlbmd0aClcbiAgICAgICkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IG5ldyBVaW50OEFycmF5KHBkZkJ5dGVzKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihwZGZCeXRlcykpIHtcbiAgICAgICAgcGFyYW1zW2tleV0gPSBuZXcgVWludDhBcnJheShwZGZCeXRlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIFBERiBiaW5hcnkgZGF0YTogZWl0aGVyIHR5cGVkIGFycmF5LCBcIiArXG4gICAgICAgICAgICBcInN0cmluZyBvciBhcnJheS1saWtlIG9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgXCIgK1xuICAgICAgICAgICAgXCJkYXRhIHByb3BlcnR5LlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGFyYW1zW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHBhcmFtcy5yYW5nZUNodW5rU2l6ZSA9IHBhcmFtcy5yYW5nZUNodW5rU2l6ZSB8fCBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU7XG4gIHBhcmFtcy5DTWFwUmVhZGVyRmFjdG9yeSA9XG4gICAgcGFyYW1zLkNNYXBSZWFkZXJGYWN0b3J5IHx8IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeTtcbiAgcGFyYW1zLmlnbm9yZUVycm9ycyA9IHBhcmFtcy5zdG9wQXRFcnJvcnMgIT09IHRydWU7XG4gIHBhcmFtcy5mb250RXh0cmFQcm9wZXJ0aWVzID0gcGFyYW1zLmZvbnRFeHRyYVByb3BlcnRpZXMgPT09IHRydWU7XG4gIHBhcmFtcy5wZGZCdWcgPSBwYXJhbXMucGRmQnVnID09PSB0cnVlO1xuXG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJhbXMubWF4SW1hZ2VTaXplKSkge1xuICAgIHBhcmFtcy5tYXhJbWFnZVNpemUgPSAtMTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5pc0V2YWxTdXBwb3J0ZWQgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgcGFyYW1zLmlzRXZhbFN1cHBvcnRlZCA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuZGlzYWJsZUZvbnRGYWNlICE9PSBcImJvb2xlYW5cIikge1xuICAgIHBhcmFtcy5kaXNhYmxlRm9udEZhY2UgPSBhcGlDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVGb250RmFjZSB8fCBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5vd25lckRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcGFyYW1zLm93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXJhbXMuZGlzYWJsZVJhbmdlICE9PSBcImJvb2xlYW5cIikge1xuICAgIHBhcmFtcy5kaXNhYmxlUmFuZ2UgPSBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5kaXNhYmxlU3RyZWFtICE9PSBcImJvb2xlYW5cIikge1xuICAgIHBhcmFtcy5kaXNhYmxlU3RyZWFtID0gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuZGlzYWJsZUF1dG9GZXRjaCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICBwYXJhbXMuZGlzYWJsZUF1dG9GZXRjaCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gU2V0IHRoZSBtYWluLXRocmVhZCB2ZXJib3NpdHkgbGV2ZWwuXG4gIHNldFZlcmJvc2l0eUxldmVsKHBhcmFtcy52ZXJib3NpdHkpO1xuXG4gIGlmICghd29ya2VyKSB7XG4gICAgY29uc3Qgd29ya2VyUGFyYW1zID0ge1xuICAgICAgdmVyYm9zaXR5OiBwYXJhbXMudmVyYm9zaXR5LFxuICAgICAgcG9ydDogR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0LFxuICAgIH07XG4gICAgLy8gV29ya2VyIHdhcyBub3QgcHJvdmlkZWQgLS0gY3JlYXRpbmcgYW5kIG93bmluZyBvdXIgb3duLiBJZiBtZXNzYWdlIHBvcnRcbiAgICAvLyBpcyBzcGVjaWZpZWQgaW4gZ2xvYmFsIHdvcmtlciBvcHRpb25zLCB1c2luZyBpdC5cbiAgICB3b3JrZXIgPSB3b3JrZXJQYXJhbXMucG9ydFxuICAgICAgPyBQREZXb3JrZXIuZnJvbVBvcnQod29ya2VyUGFyYW1zKVxuICAgICAgOiBuZXcgUERGV29ya2VyKHdvcmtlclBhcmFtcyk7XG4gICAgdGFzay5fd29ya2VyID0gd29ya2VyO1xuICB9XG4gIGNvbnN0IGRvY0lkID0gdGFzay5kb2NJZDtcbiAgd29ya2VyLnByb21pc2VcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGFzay5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZXJJZFByb21pc2UgPSBfZmV0Y2hEb2N1bWVudChcbiAgICAgICAgd29ya2VyLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJhbmdlVHJhbnNwb3J0LFxuICAgICAgICBkb2NJZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ldHdvcmtTdHJlYW1Qcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgbGV0IG5ldHdvcmtTdHJlYW07XG4gICAgICAgIGlmIChyYW5nZVRyYW5zcG9ydCkge1xuICAgICAgICAgIG5ldHdvcmtTdHJlYW0gPSBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGVuZ3RoOiBwYXJhbXMubGVuZ3RoLFxuICAgICAgICAgICAgICBpbml0aWFsRGF0YTogcGFyYW1zLmluaXRpYWxEYXRhLFxuICAgICAgICAgICAgICBwcm9ncmVzc2l2ZURvbmU6IHBhcmFtcy5wcm9ncmVzc2l2ZURvbmUsXG4gICAgICAgICAgICAgIGRpc2FibGVSYW5nZTogcGFyYW1zLmRpc2FibGVSYW5nZSxcbiAgICAgICAgICAgICAgZGlzYWJsZVN0cmVhbTogcGFyYW1zLmRpc2FibGVTdHJlYW0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmFuZ2VUcmFuc3BvcnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXJhbXMuZGF0YSkge1xuICAgICAgICAgIG5ldHdvcmtTdHJlYW0gPSBjcmVhdGVQREZOZXR3b3JrU3RyZWFtKHtcbiAgICAgICAgICAgIHVybDogcGFyYW1zLnVybCxcbiAgICAgICAgICAgIGxlbmd0aDogcGFyYW1zLmxlbmd0aCxcbiAgICAgICAgICAgIGh0dHBIZWFkZXJzOiBwYXJhbXMuaHR0cEhlYWRlcnMsXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHBhcmFtcy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICByYW5nZUNodW5rU2l6ZTogcGFyYW1zLnJhbmdlQ2h1bmtTaXplLFxuICAgICAgICAgICAgZGlzYWJsZVJhbmdlOiBwYXJhbXMuZGlzYWJsZVJhbmdlLFxuICAgICAgICAgICAgZGlzYWJsZVN0cmVhbTogcGFyYW1zLmRpc2FibGVTdHJlYW0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShuZXR3b3JrU3RyZWFtKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3dvcmtlcklkUHJvbWlzZSwgbmV0d29ya1N0cmVhbVByb21pc2VdKS50aGVuKFxuICAgICAgICBmdW5jdGlvbiAoW3dvcmtlcklkLCBuZXR3b3JrU3RyZWFtXSkge1xuICAgICAgICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgICAgICAgZG9jSWQsXG4gICAgICAgICAgICB3b3JrZXJJZCxcbiAgICAgICAgICAgIHdvcmtlci5wb3J0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBtZXNzYWdlSGFuZGxlci5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHdvcmtlci5wb3N0TWVzc2FnZVRyYW5zZmVycztcbiAgICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgV29ya2VyVHJhbnNwb3J0KFxuICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgbmV0d29ya1N0cmVhbSxcbiAgICAgICAgICAgIHBhcmFtc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGFzay5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoXCJSZWFkeVwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KVxuICAgIC5jYXRjaCh0YXNrLl9jYXBhYmlsaXR5LnJlamVjdCk7XG5cbiAgcmV0dXJuIHRhc2s7XG59XG5cbi8qKlxuICogU3RhcnRzIGZldGNoaW5nIG9mIHNwZWNpZmllZCBQREYgZG9jdW1lbnQvZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1BERldvcmtlcn0gd29ya2VyXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlXG4gKiBAcGFyYW0ge1BERkRhdGFSYW5nZVRyYW5zcG9ydH0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gZG9jSWQgLSBVbmlxdWUgZG9jdW1lbnQgSUQsIHVzZWQgaW4gYE1lc3NhZ2VIYW5kbGVyYC5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSB3b3JrZXIgSUQgb2YgdGhlXG4gKiAgIGBNZXNzYWdlSGFuZGxlcmAgaXMga25vd24uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfZmV0Y2hEb2N1bWVudCh3b3JrZXIsIHNvdXJjZSwgcGRmRGF0YVJhbmdlVHJhbnNwb3J0LCBkb2NJZCkge1xuICBpZiAod29ya2VyLmRlc3Ryb3llZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG4gIH1cblxuICBpZiAocGRmRGF0YVJhbmdlVHJhbnNwb3J0KSB7XG4gICAgc291cmNlLmxlbmd0aCA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5sZW5ndGg7XG4gICAgc291cmNlLmluaXRpYWxEYXRhID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmluaXRpYWxEYXRhO1xuICAgIHNvdXJjZS5wcm9ncmVzc2l2ZURvbmUgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQucHJvZ3Jlc3NpdmVEb25lO1xuICB9XG4gIHJldHVybiB3b3JrZXIubWVzc2FnZUhhbmRsZXJcbiAgICAuc2VuZFdpdGhQcm9taXNlKFwiR2V0RG9jUmVxdWVzdFwiLCB7XG4gICAgICBkb2NJZCxcbiAgICAgIGFwaVZlcnNpb246XG4gICAgICAgIHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhUERGSlNEZXYudGVzdChcIlRFU1RJTkdcIilcbiAgICAgICAgICA/IFBERkpTRGV2LmV2YWwoXCJCVU5ETEVfVkVSU0lPTlwiKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIC8vIE9ubHkgc2VuZCB0aGUgcmVxdWlyZWQgcHJvcGVydGllcywgYW5kICpub3QqIHRoZSBlbnRpcmUgb2JqZWN0LlxuICAgICAgc291cmNlOiB7XG4gICAgICAgIGRhdGE6IHNvdXJjZS5kYXRhLFxuICAgICAgICB1cmw6IHNvdXJjZS51cmwsXG4gICAgICAgIHBhc3N3b3JkOiBzb3VyY2UucGFzc3dvcmQsXG4gICAgICAgIGRpc2FibGVBdXRvRmV0Y2g6IHNvdXJjZS5kaXNhYmxlQXV0b0ZldGNoLFxuICAgICAgICByYW5nZUNodW5rU2l6ZTogc291cmNlLnJhbmdlQ2h1bmtTaXplLFxuICAgICAgICBsZW5ndGg6IHNvdXJjZS5sZW5ndGgsXG4gICAgICB9LFxuICAgICAgbWF4SW1hZ2VTaXplOiBzb3VyY2UubWF4SW1hZ2VTaXplLFxuICAgICAgZGlzYWJsZUZvbnRGYWNlOiBzb3VyY2UuZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgcG9zdE1lc3NhZ2VUcmFuc2ZlcnM6IHdvcmtlci5wb3N0TWVzc2FnZVRyYW5zZmVycyxcbiAgICAgIGRvY0Jhc2VVcmw6IHNvdXJjZS5kb2NCYXNlVXJsLFxuICAgICAgaWdub3JlRXJyb3JzOiBzb3VyY2UuaWdub3JlRXJyb3JzLFxuICAgICAgaXNFdmFsU3VwcG9ydGVkOiBzb3VyY2UuaXNFdmFsU3VwcG9ydGVkLFxuICAgICAgZm9udEV4dHJhUHJvcGVydGllczogc291cmNlLmZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAod29ya2VySWQpIHtcbiAgICAgIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmtlcklkO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoZSBsb2FkaW5nIHRhc2sgY29udHJvbHMgdGhlIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gbG9hZCBhIFBERiBkb2N1bWVudFxuICogKHN1Y2ggYXMgbmV0d29yayByZXF1ZXN0cykgYW5kIHByb3ZpZGVzIGEgd2F5IHRvIGxpc3RlbiBmb3IgY29tcGxldGlvbixcbiAqIGFmdGVyIHdoaWNoIGluZGl2aWR1YWwgcGFnZXMgY2FuIGJlIHJlbmRlcmVkLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBERkRvY3VtZW50TG9hZGluZ1Rhc2tcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkb2NJZCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZG9jdW1lbnQgbG9hZGluZyB0YXNrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBkZXN0cm95ZWQgLSBXaGV0aGVyIHRoZSBsb2FkaW5nIHRhc2sgaXMgZGVzdHJveWVkIG9yIG5vdC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IFtvblBhc3N3b3JkXSAtIENhbGxiYWNrIHRvIHJlcXVlc3QgYSBwYXNzd29yZCBpZiBhIHdyb25nXG4gKiAgIG9yIG5vIHBhc3N3b3JkIHdhcyBwcm92aWRlZC4gVGhlIGNhbGxiYWNrIHJlY2VpdmVzIHR3byBwYXJhbWV0ZXJzOiBhXG4gKiAgIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgcGFzc3dvcmQsIGFuZCBhIHJlYXNvbiAoc2VlXG4gKiAgIHtAbGluayBQYXNzd29yZFJlc3BvbnNlc30pLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW29uUHJvZ3Jlc3NdIC0gQ2FsbGJhY2sgdG8gYmUgYWJsZSB0byBtb25pdG9yIHRoZVxuICogICBsb2FkaW5nIHByb2dyZXNzIG9mIHRoZSBQREYgZmlsZSAobmVjZXNzYXJ5IHRvIGltcGxlbWVudCBlLmcuIGEgbG9hZGluZ1xuICogICBiYXIpLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYW4ge09iamVjdH0gd2l0aCB0aGUgcHJvcGVydGllcyBgbG9hZGVkYFxuICogICAoe251bWJlcn0pIGFuZCBgdG90YWxgICh7bnVtYmVyfSkgdGhhdCBpbmRpY2F0ZSBob3cgbWFueSBieXRlcyBhcmUgbG9hZGVkLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW29uVW5zdXBwb3J0ZWRGZWF0dXJlXSAtIENhbGxiYWNrIGZvciB3aGVuIGFuXG4gKiAgIHVuc3VwcG9ydGVkIGZlYXR1cmUgaXMgdXNlZCBpbiB0aGUgUERGIGRvY3VtZW50LiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYW5cbiAqICAge0BsaW5rIFVOU1VQUE9SVEVEX0ZFQVRVUkVTfSBhcmd1bWVudC5cbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQREZEb2N1bWVudFByb3h5Pn0gcHJvbWlzZSAtIFByb21pc2UgZm9yIGRvY3VtZW50IGxvYWRpbmdcbiAqICAgdGFzayBjb21wbGV0aW9uLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZGVzdHJveSAtIEFib3J0IGFsbCBuZXR3b3JrIHJlcXVlc3RzIGFuZCBkZXN0cm95XG4gKiAgIHRoZSB3b3JrZXIuIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkZXN0cnVjdGlvbiBpc1xuICogICBjb21wbGV0ZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7YW55fVxuICogQGlnbm9yZVxuICovXG5jb25zdCBQREZEb2N1bWVudExvYWRpbmdUYXNrID0gKGZ1bmN0aW9uIFBERkRvY3VtZW50TG9hZGluZ1Rhc2tDbG9zdXJlKCkge1xuICBsZXQgbmV4dERvY3VtZW50SWQgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGluZyB0YXNrIGNvbnRyb2xzIHRoZSBvcGVyYXRpb25zIHJlcXVpcmVkIHRvIGxvYWQgYSBQREYgZG9jdW1lbnRcbiAgICogKHN1Y2ggYXMgbmV0d29yayByZXF1ZXN0cykgYW5kIHByb3ZpZGVzIGEgd2F5IHRvIGxpc3RlbiBmb3IgY29tcGxldGlvbixcbiAgICogYWZ0ZXIgd2hpY2ggaW5kaXZpZHVhbCBwYWdlcyBjYW4gYmUgcmVuZGVyZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNsYXNzIFBERkRvY3VtZW50TG9hZGluZ1Rhc2sge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5fY2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGRvY3VtZW50IGxvYWRpbmcgdGFzay5cbiAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgKi9cbiAgICAgIHRoaXMuZG9jSWQgPSBcImRcIiArIG5leHREb2N1bWVudElkKys7XG5cbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgbG9hZGluZyB0YXNrIGlzIGRlc3Ryb3llZCBvciBub3QuXG4gICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAqL1xuICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBDYWxsYmFjayB0byByZXF1ZXN0IGEgcGFzc3dvcmQgaWYgYSB3cm9uZyBvciBubyBwYXNzd29yZCB3YXMgcHJvdmlkZWQuXG4gICAgICAgKiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgdHdvIHBhcmFtZXRlcnM6IGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkXG4gICAgICAgKiB3aXRoIHRoZSBuZXcgcGFzc3dvcmQsIGFuZCBhIHJlYXNvbiAoc2VlIHtAbGluayBQYXNzd29yZFJlc3BvbnNlc30pLlxuICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxuICAgICAgICovXG4gICAgICB0aGlzLm9uUGFzc3dvcmQgPSBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIENhbGxiYWNrIHRvIGJlIGFibGUgdG8gbW9uaXRvciB0aGUgbG9hZGluZyBwcm9ncmVzcyBvZiB0aGUgUERGIGZpbGVcbiAgICAgICAqIChuZWNlc3NhcnkgdG8gaW1wbGVtZW50IGUuZy4gYSBsb2FkaW5nIGJhcikuIFRoZSBjYWxsYmFjayByZWNlaXZlc1xuICAgICAgICogYW4ge09iamVjdH0gd2l0aCB0aGUgcHJvcGVydGllcyBgbG9hZGVkYCAoe251bWJlcn0pIGFuZCBgdG90YWxgXG4gICAgICAgKiAoe251bWJlcn0pIHRoYXQgaW5kaWNhdGUgaG93IG1hbnkgYnl0ZXMgYXJlIGxvYWRlZC5cbiAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cbiAgICAgICAqL1xuICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhbiB1bnN1cHBvcnRlZCBmZWF0dXJlIGlzIHVzZWQgaW4gdGhlIFBERiBkb2N1bWVudC5cbiAgICAgICAqIFRoZSBjYWxsYmFjayByZWNlaXZlcyBhbiB7QGxpbmsgVU5TVVBQT1JURURfRkVBVFVSRVN9IGFyZ3VtZW50LlxuICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxuICAgICAgICovXG4gICAgICB0aGlzLm9uVW5zdXBwb3J0ZWRGZWF0dXJlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIGZvciBkb2N1bWVudCBsb2FkaW5nIHRhc2sgY29tcGxldGlvbi5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTxQREZEb2N1bWVudFByb3h5Pn1cbiAgICAgKi9cbiAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gZGVzdHJ1Y3Rpb24gaXNcbiAgICAgKiAgIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICBjb25zdCB0cmFuc3BvcnREZXN0cm95ZWQgPSAhdGhpcy5fdHJhbnNwb3J0XG4gICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgOiB0aGlzLl90cmFuc3BvcnQuZGVzdHJveSgpO1xuICAgICAgcmV0dXJuIHRyYW5zcG9ydERlc3Ryb3llZC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0ID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgICAgIHRoaXMuX3dvcmtlci5kZXN0cm95KCk7XG4gICAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBQREZEb2N1bWVudExvYWRpbmdUYXNrO1xufSkoKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyB0byBzdXBwb3J0IHJhbmdlIHJlcXVlc3RzIGZpbGUgbG9hZGluZy5cbiAqL1xuY2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBpbml0aWFsRGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9ncmVzc2l2ZURvbmVdXG4gICAqL1xuICBjb25zdHJ1Y3RvcihsZW5ndGgsIGluaXRpYWxEYXRhLCBwcm9ncmVzc2l2ZURvbmUgPSBmYWxzZSkge1xuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIHRoaXMuaW5pdGlhbERhdGEgPSBpbml0aWFsRGF0YTtcbiAgICB0aGlzLnByb2dyZXNzaXZlRG9uZSA9IHByb2dyZXNzaXZlRG9uZTtcblxuICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107XG4gICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICB9XG5cbiAgYWRkUmFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgYWRkUHJvZ3Jlc3NMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICBhZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuXG4gIG9uRGF0YVJhbmdlKGJlZ2luLCBjaHVuaykge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGJlZ2luLCBjaHVuayk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRhUHJvZ3Jlc3MobG9hZGVkLCB0b3RhbCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcihsb2FkZWQsIHRvdGFsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uRGF0YVByb2dyZXNzaXZlUmVhZChjaHVuaykge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMpIHtcbiAgICAgICAgbGlzdGVuZXIoY2h1bmspO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25EYXRhUHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMpIHtcbiAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRyYW5zcG9ydFJlYWR5KCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cblxuICByZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBQREZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZVwiKTtcbiAgfVxuXG4gIGFib3J0KCkge31cbn1cblxuLyoqXG4gKiBQcm94eSB0byBhIGBQREZEb2N1bWVudGAgaW4gdGhlIHdvcmtlciB0aHJlYWQuXG4gKi9cbmNsYXNzIFBERkRvY3VtZW50UHJveHkge1xuICBjb25zdHJ1Y3RvcihwZGZJbmZvLCB0cmFuc3BvcnQpIHtcbiAgICB0aGlzLl9wZGZJbmZvID0gcGRmSW5mbztcbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Fubm90YXRpb25TdG9yYWdlfSBTdG9yYWdlIGZvciBhbm5vdGF0aW9uIGRhdGEgaW4gZm9ybXMuXG4gICAqL1xuICBnZXQgYW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImFubm90YXRpb25TdG9yYWdlXCIsIG5ldyBBbm5vdGF0aW9uU3RvcmFnZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfSBUb3RhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIFBERiBmaWxlLlxuICAgKi9cbiAgZ2V0IG51bVBhZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLm51bVBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9IEEgKG5vdCBndWFyYW50ZWVkIHRvIGJlKSB1bmlxdWUgSUQgdG8gaWRlbnRpZnkgYSBQREYuXG4gICAqL1xuICBnZXQgZmluZ2VycHJpbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BkZkluZm8uZmluZ2VycHJpbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VOdW1iZXIgLSBUaGUgcGFnZSBudW1iZXIgdG8gZ2V0LiBUaGUgZmlyc3QgcGFnZSBpcyAxLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQREZQYWdlUHJveHk+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoXG4gICAqICAgYSB7QGxpbmsgUERGUGFnZVByb3h5fSBvYmplY3QuXG4gICAqL1xuICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2UocGFnZU51bWJlcik7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7bnVtOiBudW1iZXIsIGdlbjogbnVtYmVyfX0gcmVmIC0gVGhlIHBhZ2UgcmVmZXJlbmNlLiBNdXN0IGhhdmVcbiAgICogICB0aGUgYG51bWAgYW5kIGBnZW5gIHByb3BlcnRpZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtudW06IG51bWJlciwgZ2VuOiBudW1iZXJ9Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWRcbiAgICogICB3aXRoIHRoZSBwYWdlIGluZGV4IChzdGFydGluZyBmcm9tIHplcm8pIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiAgIHJlZmVyZW5jZS5cbiAgICovXG4gIGdldFBhZ2VJbmRleChyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VJbmRleChyZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdDxzdHJpbmcsIEFycmF5PGFueT4+Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWRcbiAgICogICB3aXRoIGEgbWFwcGluZyBmcm9tIG5hbWVkIGRlc3RpbmF0aW9ucyB0byByZWZlcmVuY2VzLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSBzbG93IGZvciBsYXJnZSBkb2N1bWVudHMuIFVzZSBgZ2V0RGVzdGluYXRpb25gIGluc3RlYWQuXG4gICAqL1xuICBnZXREZXN0aW5hdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgbmFtZWQgZGVzdGluYXRpb24gdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxhbnk+Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbGxcbiAgICogICBpbmZvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gbmFtZWQgZGVzdGluYXRpb24uXG4gICAqL1xuICBnZXREZXN0aW5hdGlvbihpZCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb24oaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHN0cmluZz4gfCBudWxsPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aFxuICAgKiAgIGFuIHtBcnJheX0gY29udGFpbmluZyB0aGUgcGFnZSBsYWJlbHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBwYWdlXG4gICAqICAgaW5kZXhlcywgb3IgYG51bGxgIHdoZW4gbm8gcGFnZSBsYWJlbHMgYXJlIHByZXNlbnQgaW4gdGhlIFBERiBmaWxlLlxuICAgKi9cbiAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGEge3N0cmluZ31cbiAgICogICBjb250YWluaW5nIHRoZSBwYWdlIGxheW91dCBuYW1lLlxuICAgKi9cbiAgZ2V0UGFnZUxheW91dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYXlvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGEge3N0cmluZ31cbiAgICogICBjb250YWluaW5nIHRoZSBwYWdlIG1vZGUgbmFtZS5cbiAgICovXG4gIGdldFBhZ2VNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZU1vZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3QgfCBudWxsPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhblxuICAgKiAgIHtPYmplY3R9IGNvbnRhaW5pbmcgdGhlIHZpZXdlciBwcmVmZXJlbmNlcywgb3IgYG51bGxgIHdoZW4gbm8gdmlld2VyXG4gICAqICAgcHJlZmVyZW5jZXMgYXJlIHByZXNlbnQgaW4gdGhlIFBERiBmaWxlLlxuICAgKi9cbiAgZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRWaWV3ZXJQcmVmZXJlbmNlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueSB8IG51bGw+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIHtBcnJheX1cbiAgICogICBjb250YWluaW5nIHRoZSBkZXN0aW5hdGlvbiwgb3IgYG51bGxgIHdoZW4gbm8gb3BlbiBhY3Rpb24gaXMgcHJlc2VudFxuICAgKiAgIGluIHRoZSBQREYuXG4gICAqL1xuICBnZXRPcGVuQWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3BlbkFjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSBsb29rdXAgdGFibGVcbiAgICogICBmb3IgbWFwcGluZyBuYW1lZCBhdHRhY2htZW50cyB0byB0aGVpciBjb250ZW50LlxuICAgKi9cbiAgZ2V0QXR0YWNobWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBdHRhY2htZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHN0cmluZz4gfCBudWxsPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aFxuICAgKiAgIGFuIHtBcnJheX0gb2YgYWxsIHRoZSBKYXZhU2NyaXB0IHN0cmluZ3MgaW4gdGhlIG5hbWUgdHJlZSwgb3IgYG51bGxgXG4gICAqICAgaWYgbm8gSmF2YVNjcmlwdCBleGlzdHMuXG4gICAqL1xuICBnZXRKYXZhU2NyaXB0KCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0SmF2YVNjcmlwdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE91dGxpbmVOb2RlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvbGRcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBpdGFsaWNcbiAgICogQHByb3BlcnR5IHtVaW50OENsYW1wZWRBcnJheX0gY29sb3IgLSBUaGUgY29sb3IgaW4gUkdCIGZvcm1hdCB0byB1c2UgZm9yXG4gICAqICAgZGlzcGxheSBwdXJwb3Nlcy5cbiAgICogQHByb3BlcnR5IHtzdHJpbmcgfCBBcnJheTxhbnk+IHwgbnVsbH0gZGVzdFxuICAgKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gdW5zYWZlVXJsXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gbmV3V2luZG93XG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBjb3VudFxuICAgKiBAcHJvcGVydHkge0FycmF5PE91dGxpbmVOb2RlPn0gaXRlbXNcbiAgICovXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PE91dGxpbmVOb2RlPj59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW5cbiAgICogICB7QXJyYXl9IHRoYXQgaXMgYSB0cmVlIG91dGxpbmUgKGlmIGl0IGhhcyBvbmUpIG9mIHRoZSBQREYgZmlsZS5cbiAgICovXG4gIGdldE91dGxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPdXRsaW5lKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8T3B0aW9uYWxDb250ZW50Q29uZmlnPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aFxuICAgKiAgIGFuIHtAbGluayBPcHRpb25hbENvbnRlbnRDb25maWd9IHRoYXQgY29udGFpbnMgYWxsIHRoZSBvcHRpb25hbCBjb250ZW50XG4gICAqICAgZ3JvdXBzIChhc3N1bWluZyB0aGF0IHRoZSBkb2N1bWVudCBoYXMgYW55KS5cbiAgICovXG4gIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PG51bWJlcj4gfCBudWxsPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aFxuICAgKiAgIGFuIHtBcnJheX0gdGhhdCBjb250YWlucyB0aGUgcGVybWlzc2lvbiBmbGFncyBmb3IgdGhlIFBERiBkb2N1bWVudCwgb3JcbiAgICogICBgbnVsbGAgd2hlbiBubyBwZXJtaXNzaW9ucyBhcmUgcHJlc2VudCBpbiB0aGUgUERGIGZpbGUuXG4gICAqL1xuICBnZXRQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBlcm1pc3Npb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBpbmZvOiBPYmplY3QsIG1ldGFkYXRhOiBNZXRhZGF0YSB9Pn0gQSBwcm9taXNlIHRoYXQgaXNcbiAgICogICByZXNvbHZlZCB3aXRoIGFuIHtPYmplY3R9IHRoYXQgaGFzIGBpbmZvYCBhbmQgYG1ldGFkYXRhYCBwcm9wZXJ0aWVzLlxuICAgKiAgIGBpbmZvYCBpcyBhbiB7T2JqZWN0fSBmaWxsZWQgd2l0aCBhbnl0aGluZyBhdmFpbGFibGUgaW4gdGhlIGluZm9ybWF0aW9uXG4gICAqICAgZGljdGlvbmFyeSBhbmQgc2ltaWxhcmx5IGBtZXRhZGF0YWAgaXMgYSB7TWV0YWRhdGF9IG9iamVjdCB3aXRoXG4gICAqICAgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWV0YWRhdGEgc2VjdGlvbiBvZiB0aGUgUERGLlxuICAgKi9cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNZXRhZGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR5cGVkQXJyYXk+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFcbiAgICogICB7VHlwZWRBcnJheX0gdGhhdCBoYXMgdGhlIHJhdyBkYXRhIGZyb20gdGhlIFBERi5cbiAgICovXG4gIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBsZW5ndGg6IG51bWJlciB9Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGVcbiAgICogICBkb2N1bWVudCdzIGRhdGEgaXMgbG9hZGVkLiBJdCBpcyByZXNvbHZlZCB3aXRoIGFuIHtPYmplY3R9IHRoYXQgY29udGFpbnNcbiAgICogICB0aGUgYGxlbmd0aGAgcHJvcGVydHkgdGhhdCBpbmRpY2F0ZXMgc2l6ZSBvZiB0aGUgUERGIGRhdGEgaW4gYnl0ZXMuXG4gICAqL1xuICBnZXREb3dubG9hZEluZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8UERGRG9jdW1lbnRTdGF0cz59IEEgcHJvbWlzZSB0aGlzIGlzIHJlc29sdmVkIHdpdGhcbiAgICogICBjdXJyZW50IHN0YXRpc3RpY3MgYWJvdXQgZG9jdW1lbnQgc3RydWN0dXJlcyAoc2VlXG4gICAqICAge0BsaW5rIFBERkRvY3VtZW50U3RhdHN9KS5cbiAgICovXG4gIGdldFN0YXRzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgZG9jdW1lbnQgb24gYm90aCB0aGUgbWFpbiBhbmQgd29ya2VyXG4gICAqIHRocmVhZHMuXG4gICAqXG4gICAqIE5PVEU6IERvIG5vdCwgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiByZW5kZXJpbmcgaXNcbiAgICogY3VycmVudGx5IG9uZ29pbmcgc2luY2UgdGhhdCBtYXkgbGVhZCB0byByZW5kZXJpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBjbGVhbi11cCBoYXMgZmluaXNoZWQuXG4gICAqL1xuICBjbGVhbnVwKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc3RhcnRDbGVhbnVwKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaW5zdGFuY2UgYW5kIHRlcm1pbmF0ZXMgdGhlIHdvcmtlci5cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1Rhc2suZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtEb2N1bWVudEluaXRQYXJhbWV0ZXJzfSBBIHN1YnNldCBvZiB0aGUgY3VycmVudFxuICAgKiAgIHtEb2N1bWVudEluaXRQYXJhbWV0ZXJzfSwgd2hpY2ggYXJlIGVpdGhlciBuZWVkZWQgaW4gdGhlIHZpZXdlciBhbmQvb3JcbiAgICogICB3aG9zZSBkZWZhdWx0IHZhbHVlcyBtYXkgYmUgYWZmZWN0ZWQgYnkgdGhlIGBhcGlDb21wYXRpYmlsaXR5UGFyYW1zYC5cbiAgICovXG4gIGdldCBsb2FkaW5nUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1BhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7UERGRG9jdW1lbnRMb2FkaW5nVGFza30gVGhlIGxvYWRpbmdUYXNrIGZvciB0aGUgY3VycmVudCBkb2N1bWVudC5cbiAgICovXG4gIGdldCBsb2FkaW5nVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdUYXNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QW5ub3RhdGlvblN0b3JhZ2V9IGFubm90YXRpb25TdG9yYWdlIC0gU3RvcmFnZSBmb3IgYW5ub3RhdGlvblxuICAgKiAgIGRhdGEgaW4gZm9ybXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFcbiAgICogICB7VWludDhBcnJheX0gY29udGFpbmluZyB0aGUgZnVsbCBkYXRhIG9mIHRoZSBzYXZlZCBkb2N1bWVudC5cbiAgICovXG4gIHNhdmVEb2N1bWVudChhbm5vdGF0aW9uU3RvcmFnZSkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc2F2ZURvY3VtZW50KGFubm90YXRpb25TdG9yYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgZ2V0Vmlld3BvcnQgcGFyYW1ldGVycy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRWaWV3cG9ydFBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY2FsZSAtIFRoZSBkZXNpcmVkIHNjYWxlIG9mIHRoZSB2aWV3cG9ydC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcm90YXRpb25dIC0gVGhlIGRlc2lyZWQgcm90YXRpb24sIGluIGRlZ3JlZXMsIG9mXG4gKiAgIHRoZSB2aWV3cG9ydC4gSWYgb21pdHRlZCBpdCBkZWZhdWx0cyB0byB0aGUgcGFnZSByb3RhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0WF0gLSBUaGUgaG9yaXpvbnRhbCwgaS5lLiB4LWF4aXMsIG9mZnNldC5cbiAqICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRZXSAtIFRoZSB2ZXJ0aWNhbCwgaS5lLiB5LWF4aXMsIG9mZnNldC5cbiAqICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDBgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZG9udEZsaXBdIC0gSWYgdHJ1ZSwgdGhlIHktYXhpcyB3aWxsIG5vdCBiZVxuICogICBmbGlwcGVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogUGFnZSBnZXRUZXh0Q29udGVudCBwYXJhbWV0ZXJzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGdldFRleHRDb250ZW50UGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtib29sZWFufSBub3JtYWxpemVXaGl0ZXNwYWNlIC0gUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mXG4gKiAgIHdoaXRlc3BhY2Ugd2l0aCBzdGFuZGFyZCBzcGFjZXMgKDB4MjApLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBkaXNhYmxlQ29tYmluZVRleHRJdGVtcyAtIERvIG5vdCBhdHRlbXB0IHRvIGNvbWJpbmVcbiAqICAgc2FtZSBsaW5lIHtAbGluayBUZXh0SXRlbX0ncy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqL1xuXG4vKipcbiAqIFBhZ2UgdGV4dCBjb250ZW50LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRDb250ZW50XG4gKiBAcHJvcGVydHkge0FycmF5PFRleHRJdGVtPn0gaXRlbXMgLSBBcnJheSBvZiB7QGxpbmsgVGV4dEl0ZW19IG9iamVjdHMuXG4gKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIFRleHRTdHlsZT59IHN0eWxlcyAtIHtAbGluayBUZXh0U3R5bGV9IG9iamVjdHMsXG4gKiAgIGluZGV4ZWQgYnkgZm9udCBuYW1lLlxuICovXG5cbi8qKlxuICogUGFnZSB0ZXh0IGNvbnRlbnQgcGFydC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZXh0SXRlbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ciAtIFRleHQgY29udGVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXIgLSBUZXh0IGRpcmVjdGlvbjogJ3R0YicsICdsdHInIG9yICdydGwnLlxuICogQHByb3BlcnR5IHtBcnJheTxhbnk+fSB0cmFuc2Zvcm0gLSBUcmFuc2Zvcm1hdGlvbiBtYXRyaXguXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBXaWR0aCBpbiBkZXZpY2Ugc3BhY2UuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gSGVpZ2h0IGluIGRldmljZSBzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb250TmFtZSAtIEZvbnQgbmFtZSB1c2VkIGJ5IFBERi5qcyBmb3IgY29udmVydGVkIGZvbnQuXG4gKi9cblxuLyoqXG4gKiBUZXh0IHN0eWxlLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFzY2VudCAtIEZvbnQgYXNjZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlc2NlbnQgLSBGb250IGRlc2NlbnQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZlcnRpY2FsIC0gV2hldGhlciBvciBub3QgdGhlIHRleHQgaXMgaW4gdmVydGljYWwgbW9kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb250RmFtaWx5IC0gVGhlIHBvc3NpYmxlIGZvbnQgZmFtaWx5LlxuICovXG5cbi8qKlxuICogUGFnZSBhbm5vdGF0aW9uIHBhcmFtZXRlcnMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0QW5ub3RhdGlvbnNQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW50ZW50IC0gRGV0ZXJtaW5lcyB0aGUgYW5ub3RhdGlvbnMgdGhhdCB3aWxsIGJlIGZldGNoZWQsXG4gKiAgIGNhbiBiZSBlaXRoZXIgJ2Rpc3BsYXknICh2aWV3YWJsZSBhbm5vdGF0aW9ucykgb3IgJ3ByaW50JyAocHJpbnRhYmxlXG4gKiAgIGFubm90YXRpb25zKS4gSWYgdGhlIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhbGwgYW5ub3RhdGlvbnMgYXJlIGZldGNoZWQuXG4gKi9cblxuLyoqXG4gKiBQYWdlIHJlbmRlciBwYXJhbWV0ZXJzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlbmRlclBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjYW52YXNDb250ZXh0IC0gQSAyRCBjb250ZXh0IG9mIGEgRE9NIENhbnZhcyBvYmplY3QuXG4gKiBAcHJvcGVydHkge1BhZ2VWaWV3cG9ydH0gdmlld3BvcnQgLSBSZW5kZXJpbmcgdmlld3BvcnQgb2J0YWluZWQgYnkgY2FsbGluZ1xuICogICB0aGUgYFBERlBhZ2VQcm94eS5nZXRWaWV3cG9ydGAgbWV0aG9kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbnRlbnRdIC0gUmVuZGVyaW5nIGludGVudCwgY2FuIGJlICdkaXNwbGF5JyBvciAncHJpbnQnLlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAnZGlzcGxheScuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVXZWJHTF0gLSBFbmFibGVzIFdlYkdMIGFjY2VsZXJhdGVkIHJlbmRlcmluZyBmb3JcbiAqICAgc29tZSBvcGVyYXRpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVuZGVySW50ZXJhY3RpdmVGb3Jtc10gLSBXaGV0aGVyIG9yIG5vdCBpbnRlcmFjdGl2ZVxuICogICBmb3JtIGVsZW1lbnRzIGFyZSByZW5kZXJlZCBpbiB0aGUgZGlzcGxheSBsYXllci4gSWYgc28sIHdlIGRvIG5vdCByZW5kZXJcbiAqICAgdGhlbSBvbiB0aGUgY2FudmFzIGFzIHdlbGwuXG4gKiBAcHJvcGVydHkge0FycmF5PGFueT59IFt0cmFuc2Zvcm1dIC0gQWRkaXRpb25hbCB0cmFuc2Zvcm0sIGFwcGxpZWQganVzdFxuICogICBiZWZvcmUgdmlld3BvcnQgdHJhbnNmb3JtLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFtpbWFnZUxheWVyXSAtIEFuIG9iamVjdCB0aGF0IGhhcyBgYmVnaW5MYXlvdXRgLFxuICogICBgZW5kTGF5b3V0YCBhbmQgYGFwcGVuZEltYWdlYCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gW2NhbnZhc0ZhY3RvcnldIC0gVGhlIGZhY3RvcnkgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWRcbiAqICAgd2hlbiBjcmVhdGluZyBjYW52YXNlcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMge25ldyBET01DYW52YXNGYWN0b3J5KCl9LlxuICogQHByb3BlcnR5IHtPYmplY3QgfCBzdHJpbmd9IFtiYWNrZ3JvdW5kXSAtIEJhY2tncm91bmQgdG8gdXNlIGZvciB0aGUgY2FudmFzLlxuICogICBBbnkgdmFsaWQgYGNhbnZhcy5maWxsU3R5bGVgIGNhbiBiZSB1c2VkOiBhIGBET01TdHJpbmdgIHBhcnNlZCBhcyBDU1NcbiAqICAgPGNvbG9yPiB2YWx1ZSwgYSBgQ2FudmFzR3JhZGllbnRgIG9iamVjdCAoYSBsaW5lYXIgb3IgcmFkaWFsIGdyYWRpZW50KSBvclxuICogICBhIGBDYW52YXNQYXR0ZXJuYCBvYmplY3QgKGEgcmVwZXRpdGl2ZSBpbWFnZSkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzXG4gKiAgICdyZ2IoMjU1LDI1NSwyNTUpJy5cbiAqIEBwcm9wZXJ0eSB7QW5ub3RhdGlvblN0b3JhZ2V9IFthbm5vdGF0aW9uU3RvcmFnZV0gLSBTdG9yYWdlIGZvciBhbm5vdGF0aW9uXG4gKiAgIGRhdGEgaW4gZm9ybXMuXG4gKiBAcHJvcGVydHkge1Byb21pc2U8T3B0aW9uYWxDb250ZW50Q29uZmlnPn0gW29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2VdIC1cbiAqICAgQSBwcm9taXNlIHRoYXQgc2hvdWxkIHJlc29sdmUgd2l0aCBhbiB7QGxpbmsgT3B0aW9uYWxDb250ZW50Q29uZmlnfVxuICogICBjcmVhdGVkIGZyb20gYFBERkRvY3VtZW50UHJveHkuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnYC4gSWYgYG51bGxgLFxuICogICB0aGUgY29uZmlndXJhdGlvbiB3aWxsIGJlIGZldGNoZWQgYXV0b21hdGljYWxseSB3aXRoIHRoZSBkZWZhdWx0IHZpc2liaWxpdHlcbiAqICAgc3RhdGVzIHNldC5cbiAqL1xuXG4vKipcbiAqIFBERiBwYWdlIG9wZXJhdG9yIGxpc3QuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGT3BlcmF0b3JMaXN0XG4gKiBAcHJvcGVydHkge0FycmF5PG51bWJlcj59IGZuQXJyYXkgLSBBcnJheSBjb250YWluaW5nIHRoZSBvcGVyYXRvciBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge0FycmF5PGFueT59IGFyZ3NBcnJheSAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyBvZiB0aGVcbiAqICAgZnVuY3Rpb25zLlxuICovXG5cbi8qKlxuICogUHJveHkgdG8gYSBgUERGUGFnZWAgaW4gdGhlIHdvcmtlciB0aHJlYWQuXG4gKi9cbmNsYXNzIFBERlBhZ2VQcm94eSB7XG4gIGNvbnN0cnVjdG9yKHBhZ2VJbmRleCwgcGFnZUluZm8sIHRyYW5zcG9ydCwgb3duZXJEb2N1bWVudCwgcGRmQnVnID0gZmFsc2UpIHtcbiAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5fcGFnZUluZm8gPSBwYWdlSW5mbztcbiAgICB0aGlzLl9vd25lckRvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgdGhpcy5fc3RhdHMgPSBwZGZCdWcgPyBuZXcgU3RhdFRpbWVyKCkgOiBudWxsO1xuICAgIHRoaXMuX3BkZkJ1ZyA9IHBkZkJ1ZztcbiAgICB0aGlzLmNvbW1vbk9ianMgPSB0cmFuc3BvcnQuY29tbW9uT2JqcztcbiAgICB0aGlzLm9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuXG4gICAgdGhpcy5jbGVhbnVwQWZ0ZXJSZW5kZXIgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG4gICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn0gUGFnZSBudW1iZXIgb2YgdGhlIHBhZ2UuIEZpcnN0IHBhZ2UgaXMgMS5cbiAgICovXG4gIGdldCBwYWdlTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5kZXggKyAxO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgZGVncmVlcyB0aGUgcGFnZSBpcyByb3RhdGVkIGNsb2Nrd2lzZS5cbiAgICovXG4gIGdldCByb3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJvdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7T2JqZWN0fSBUaGUgcmVmZXJlbmNlIHRoYXQgcG9pbnRzIHRvIHRoaXMgcGFnZS4gSXQgaGFzIGBudW1gIGFuZFxuICAgKiAgIGBnZW5gIHByb3BlcnRpZXMuXG4gICAqL1xuICBnZXQgcmVmKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby5yZWY7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn0gVGhlIGRlZmF1bHQgc2l6ZSBvZiB1bml0cyBpbiAxLzcybmRzIG9mIGFuIGluY2guXG4gICAqL1xuICBnZXQgdXNlclVuaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnVzZXJVbml0O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtBcnJheTxudW1iZXI+fSBBbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBQREYgcGFnZSBpblxuICAgKiAgIHVzZXIgc3BhY2UgdW5pdHMgW3gxLCB5MSwgeDIsIHkyXS5cbiAgICovXG4gIGdldCB2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7R2V0Vmlld3BvcnRQYXJhbWV0ZXJzfSBwYXJhbXMgLSBWaWV3cG9ydCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UGFnZVZpZXdwb3J0fSBDb250YWlucyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBwcm9wZXJ0aWVzXG4gICAqICAgYWxvbmcgd2l0aCB0cmFuc2Zvcm1zIHJlcXVpcmVkIGZvciByZW5kZXJpbmcuXG4gICAqL1xuICBnZXRWaWV3cG9ydCh7XG4gICAgc2NhbGUsXG4gICAgcm90YXRpb24gPSB0aGlzLnJvdGF0ZSxcbiAgICBvZmZzZXRYID0gMCxcbiAgICBvZmZzZXRZID0gMCxcbiAgICBkb250RmxpcCA9IGZhbHNlLFxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICB2aWV3Qm94OiB0aGlzLnZpZXcsXG4gICAgICBzY2FsZSxcbiAgICAgIHJvdGF0aW9uLFxuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFksXG4gICAgICBkb250RmxpcCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0dldEFubm90YXRpb25zUGFyYW1ldGVyc30gcGFyYW1zIC0gQW5ub3RhdGlvbiBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxhbnk+Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhblxuICAgKiAgIHtBcnJheX0gb2YgdGhlIGFubm90YXRpb24gb2JqZWN0cy5cbiAgICovXG4gIGdldEFubm90YXRpb25zKHsgaW50ZW50ID0gbnVsbCB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuYW5ub3RhdGlvbnNQcm9taXNlIHx8IHRoaXMuYW5ub3RhdGlvbnNJbnRlbnQgIT09IGludGVudCkge1xuICAgICAgdGhpcy5hbm5vdGF0aW9uc1Byb21pc2UgPSB0aGlzLl90cmFuc3BvcnQuZ2V0QW5ub3RhdGlvbnMoXG4gICAgICAgIHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgICAgaW50ZW50XG4gICAgICApO1xuICAgICAgdGhpcy5hbm5vdGF0aW9uc0ludGVudCA9IGludGVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJlZ2lucyB0aGUgcHJvY2VzcyBvZiByZW5kZXJpbmcgYSBwYWdlIHRvIHRoZSBkZXNpcmVkIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVuZGVyUGFyYW1ldGVyc30gcGFyYW1zIFBhZ2UgcmVuZGVyIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtSZW5kZXJUYXNrfSBBbiBvYmplY3QgdGhhdCBjb250YWlucyBhIHByb21pc2UgdGhhdCBpc1xuICAgKiAgIHJlc29sdmVkIHdoZW4gdGhlIHBhZ2UgZmluaXNoZXMgcmVuZGVyaW5nLlxuICAgKi9cbiAgcmVuZGVyKHtcbiAgICBjYW52YXNDb250ZXh0LFxuICAgIHZpZXdwb3J0LFxuICAgIGludGVudCA9IFwiZGlzcGxheVwiLFxuICAgIGVuYWJsZVdlYkdMID0gZmFsc2UsXG4gICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IGZhbHNlLFxuICAgIHRyYW5zZm9ybSA9IG51bGwsXG4gICAgaW1hZ2VMYXllciA9IG51bGwsXG4gICAgY2FudmFzRmFjdG9yeSA9IG51bGwsXG4gICAgYmFja2dyb3VuZCA9IG51bGwsXG4gICAgYW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsLFxuICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBudWxsLFxuICB9KSB7XG4gICAgaWYgKHRoaXMuX3N0YXRzKSB7XG4gICAgICB0aGlzLl9zdGF0cy50aW1lKFwiT3ZlcmFsbFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByZW5kZXJpbmdJbnRlbnQgPSBpbnRlbnQgPT09IFwicHJpbnRcIiA/IFwicHJpbnRcIiA6IFwiZGlzcGxheVwiO1xuICAgIC8vIElmIHRoZXJlIHdhcyBhIHBlbmRpbmcgZGVzdHJveSwgY2FuY2VsIGl0IHNvIG5vIGNsZWFudXAgaGFwcGVucyBkdXJpbmdcbiAgICAvLyB0aGlzIGNhbGwgdG8gcmVuZGVyLlxuICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcblxuICAgIGlmICghb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSkge1xuICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBsZXQgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KHJlbmRlcmluZ0ludGVudCk7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuICAgICAgaW50ZW50U3RhdGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChyZW5kZXJpbmdJbnRlbnQsIGludGVudFN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhhdCBhIHBlbmRpbmcgYHN0cmVhbVJlYWRlcmAgY2FuY2VsIHRpbWVvdXQgaXMgYWx3YXlzIGFib3J0ZWQuXG4gICAgaWYgKGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNhbnZhc0ZhY3RvcnlJbnN0YW5jZSA9XG4gICAgICBjYW52YXNGYWN0b3J5IHx8XG4gICAgICBuZXcgRGVmYXVsdENhbnZhc0ZhY3RvcnkoeyBvd25lckRvY3VtZW50OiB0aGlzLl9vd25lckRvY3VtZW50IH0pO1xuICAgIGNvbnN0IHdlYkdMQ29udGV4dCA9IG5ldyBXZWJHTENvbnRleHQoe1xuICAgICAgZW5hYmxlOiBlbmFibGVXZWJHTCxcbiAgICB9KTtcblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSB5ZXQsIHRoZW4gdGhlIG9wZXJhdG9yTGlzdFxuICAgIC8vIHdhcyBuZXZlciByZXF1ZXN0ZWQgYmVmb3JlLiBNYWtlIHRoZSByZXF1ZXN0IGFuZCBjcmVhdGUgdGhlIHByb21pc2UuXG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHtcbiAgICAgICAgZm5BcnJheTogW10sXG4gICAgICAgIGFyZ3NBcnJheTogW10sXG4gICAgICAgIGxhc3RDaHVuazogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5fc3RhdHMpIHtcbiAgICAgICAgdGhpcy5fc3RhdHMudGltZShcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3Qoe1xuICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgICAgaW50ZW50OiByZW5kZXJpbmdJbnRlbnQsXG4gICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHJlbmRlckludGVyYWN0aXZlRm9ybXMgPT09IHRydWUsXG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlOlxuICAgICAgICAgIChhbm5vdGF0aW9uU3RvcmFnZSAmJiBhbm5vdGF0aW9uU3RvcmFnZS5nZXRBbGwoKSkgfHwgbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gZXJyb3IgPT4ge1xuICAgICAgY29uc3QgaSA9IGludGVudFN0YXRlLnJlbmRlclRhc2tzLmluZGV4T2YoaW50ZXJuYWxSZW5kZXJUYXNrKTtcbiAgICAgIGlmIChpID49IDApIHtcbiAgICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3Muc3BsaWNlKGksIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRlbXB0IHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UgZHVyaW5nICpwcmludGluZyosIGJ5IGFsd2F5cyBydW5uaW5nXG4gICAgICAvLyBjbGVhbnVwIG9uY2UgcmVuZGVyaW5nIGhhcyBmaW5pc2hlZCAocmVnYXJkbGVzcyBvZiBjbGVhbnVwQWZ0ZXJSZW5kZXIpLlxuICAgICAgaWYgKHRoaXMuY2xlYW51cEFmdGVyUmVuZGVyIHx8IHJlbmRlcmluZ0ludGVudCA9PT0gXCJwcmludFwiKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fdHJ5Q2xlYW51cCgpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcblxuICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgaW50ZW50U3RhdGUsXG4gICAgICAgICAgcmVhc29uOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc3RhdHMpIHtcbiAgICAgICAgdGhpcy5fc3RhdHMudGltZUVuZChcIlJlbmRlcmluZ1wiKTtcbiAgICAgICAgdGhpcy5fc3RhdHMudGltZUVuZChcIk92ZXJhbGxcIik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGludGVybmFsUmVuZGVyVGFzayA9IG5ldyBJbnRlcm5hbFJlbmRlclRhc2soe1xuICAgICAgY2FsbGJhY2s6IGNvbXBsZXRlLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzLCBhbmQgKm5vdCogdGhlIGVudGlyZSBvYmplY3QuXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgY2FudmFzQ29udGV4dCxcbiAgICAgICAgdmlld3BvcnQsXG4gICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgaW1hZ2VMYXllcixcbiAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgIH0sXG4gICAgICBvYmpzOiB0aGlzLm9ianMsXG4gICAgICBjb21tb25PYmpzOiB0aGlzLmNvbW1vbk9ianMsXG4gICAgICBvcGVyYXRvckxpc3Q6IGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgY2FudmFzRmFjdG9yeTogY2FudmFzRmFjdG9yeUluc3RhbmNlLFxuICAgICAgd2ViR0xDb250ZXh0LFxuICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiByZW5kZXJpbmdJbnRlbnQgIT09IFwicHJpbnRcIixcbiAgICAgIHBkZkJ1ZzogdGhpcy5fcGRmQnVnLFxuICAgIH0pO1xuXG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MgPSBbXTtcbiAgICB9XG4gICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MucHVzaChpbnRlcm5hbFJlbmRlclRhc2spO1xuICAgIGNvbnN0IHJlbmRlclRhc2sgPSBpbnRlcm5hbFJlbmRlclRhc2sudGFzaztcblxuICAgIFByb21pc2UuYWxsKFtcbiAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucHJvbWlzZSxcbiAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UsXG4gICAgXSlcbiAgICAgIC50aGVuKChbdHJhbnNwYXJlbmN5LCBvcHRpb25hbENvbnRlbnRDb25maWddKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGVhbnVwKSB7XG4gICAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRzKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdHMudGltZShcIlJlbmRlcmluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suaW5pdGlhbGl6ZUdyYXBoaWNzKHtcbiAgICAgICAgICB0cmFuc3BhcmVuY3ksXG4gICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnLFxuICAgICAgICB9KTtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goY29tcGxldGUpO1xuXG4gICAgcmV0dXJuIHJlbmRlclRhc2s7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8UERGT3BlcmF0b3JMaXN0Pn0gQSBwcm9taXNlIHJlc29sdmVkIHdpdGggYW5cbiAgICogICB7QGxpbmsgUERGT3BlcmF0b3JMaXN0fSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHBhZ2UncyBvcGVyYXRvciBsaXN0LlxuICAgKi9cbiAgZ2V0T3BlcmF0b3JMaXN0KCkge1xuICAgIGZ1bmN0aW9uIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7XG4gICAgICBpZiAoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCk7XG5cbiAgICAgICAgY29uc3QgaSA9IGludGVudFN0YXRlLnJlbmRlclRhc2tzLmluZGV4T2Yob3BMaXN0VGFzayk7XG4gICAgICAgIGlmIChpID49IDApIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZW5kZXJpbmdJbnRlbnQgPSBcIm9wbGlzdFwiO1xuICAgIGxldCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQocmVuZGVyaW5nSW50ZW50KTtcbiAgICBpZiAoIWludGVudFN0YXRlKSB7XG4gICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KHJlbmRlcmluZ0ludGVudCwgaW50ZW50U3RhdGUpO1xuICAgIH1cbiAgICBsZXQgb3BMaXN0VGFzaztcblxuICAgIGlmICghaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgIG9wTGlzdFRhc2sgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgb3BMaXN0VGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkID0gb3BlcmF0b3JMaXN0Q2hhbmdlZDtcbiAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzID0gW107XG4gICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5wdXNoKG9wTGlzdFRhc2spO1xuICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0ID0ge1xuICAgICAgICBmbkFycmF5OiBbXSxcbiAgICAgICAgYXJnc0FycmF5OiBbXSxcbiAgICAgICAgbGFzdENodW5rOiBmYWxzZSxcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLl9zdGF0cykge1xuICAgICAgICB0aGlzLl9zdGF0cy50aW1lKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdCh7XG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgICBpbnRlbnQ6IHJlbmRlcmluZ0ludGVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2dldFRleHRDb250ZW50UGFyYW1ldGVyc30gcGFyYW1zIC0gZ2V0VGV4dENvbnRlbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1JlYWRhYmxlU3RyZWFtfSBTdHJlYW0gZm9yIHJlYWRpbmcgdGV4dCBjb250ZW50IGNodW5rcy5cbiAgICovXG4gIHN0cmVhbVRleHRDb250ZW50KHtcbiAgICBub3JtYWxpemVXaGl0ZXNwYWNlID0gZmFsc2UsXG4gICAgZGlzYWJsZUNvbWJpbmVUZXh0SXRlbXMgPSBmYWxzZSxcbiAgfSA9IHt9KSB7XG4gICAgY29uc3QgVEVYVF9DT05URU5UX0NIVU5LX1NJWkUgPSAxMDA7XG5cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFxuICAgICAgXCJHZXRUZXh0Q29udGVudFwiLFxuICAgICAge1xuICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZTogbm9ybWFsaXplV2hpdGVzcGFjZSA9PT0gdHJ1ZSxcbiAgICAgICAgY29tYmluZVRleHRJdGVtczogZGlzYWJsZUNvbWJpbmVUZXh0SXRlbXMgIT09IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoaWdoV2F0ZXJNYXJrOiBURVhUX0NPTlRFTlRfQ0hVTktfU0laRSxcbiAgICAgICAgc2l6ZSh0ZXh0Q29udGVudCkge1xuICAgICAgICAgIHJldHVybiB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2dldFRleHRDb250ZW50UGFyYW1ldGVyc30gcGFyYW1zIC0gZ2V0VGV4dENvbnRlbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VGV4dENvbnRlbnQ+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFcbiAgICogICB7QGxpbmsgVGV4dENvbnRlbnR9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBhZ2UncyB0ZXh0IGNvbnRlbnQuXG4gICAqL1xuICBnZXRUZXh0Q29udGVudChwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5zdHJlYW1UZXh0Q29udGVudChwYXJhbXMpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoeyB2YWx1ZSwgZG9uZSB9KSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRleHRDb250ZW50LnN0eWxlcywgdmFsdWUuc3R5bGVzKTtcbiAgICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKC4uLnZhbHVlLml0ZW1zKTtcbiAgICAgICAgICBwdW1wKCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSB7XG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgc3R5bGVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgfTtcbiAgICAgIHB1bXAoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgcGFnZSBvYmplY3QuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNwb3J0LnBhZ2VDYWNoZVt0aGlzLl9wYWdlSW5kZXhdID0gbnVsbDtcblxuICAgIGNvbnN0IHdhaXRPbiA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ludGVudCwgaW50ZW50U3RhdGVdIG9mIHRoaXMuX2ludGVudFN0YXRlcykge1xuICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgICAgcmVhc29uOiBuZXcgRXJyb3IoXCJQYWdlIHdhcyBkZXN0cm95ZWQuXCIpLFxuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaW50ZW50ID09PSBcIm9wbGlzdFwiKSB7XG4gICAgICAgIC8vIEF2b2lkIGVycm9ycyBiZWxvdywgc2luY2UgdGhlIHJlbmRlclRhc2tzIGFyZSBqdXN0IHN0dWJzLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrIG9mIGludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7XG4gICAgICAgIHdhaXRPbi5wdXNoKGludGVybmFsUmVuZGVyVGFzay5jb21wbGV0ZWQpO1xuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuICAgIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHdhaXRPbik7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHVwIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlIHBhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc2V0U3RhdHNdIC0gUmVzZXQgcGFnZSBzdGF0cywgaWYgZW5hYmxlZC5cbiAgICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSW5kaWNhdGVzIGlmIGNsZWFuLXVwIHdhcyBzdWNjZXNzZnVsbHkgcnVuLlxuICAgKi9cbiAgY2xlYW51cChyZXNldFN0YXRzID0gZmFsc2UpIHtcbiAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5fdHJ5Q2xlYW51cChyZXNldFN0YXRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBjbGVhbiB1cCBpZiByZW5kZXJpbmcgaXMgaW4gYSBzdGF0ZSB3aGVyZSB0aGF0J3MgcG9zc2libGUuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdHJ5Q2xlYW51cChyZXNldFN0YXRzID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0NsZWFudXApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IHJlbmRlclRhc2tzLCBvcGVyYXRvckxpc3QgfSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChyZW5kZXJUYXNrcy5sZW5ndGggIT09IDAgfHwgIW9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpO1xuICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuICAgIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlID0gbnVsbDtcbiAgICBpZiAocmVzZXRTdGF0cyAmJiB0aGlzLl9zdGF0cykge1xuICAgICAgdGhpcy5fc3RhdHMgPSBuZXcgU3RhdFRpbWVyKCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3N0YXJ0UmVuZGVyUGFnZSh0cmFuc3BhcmVuY3ksIGludGVudCkge1xuICAgIGNvbnN0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChpbnRlbnQpO1xuICAgIGlmICghaW50ZW50U3RhdGUpIHtcbiAgICAgIHJldHVybjsgLy8gUmVuZGVyaW5nIHdhcyBjYW5jZWxsZWQuXG4gICAgfVxuICAgIGlmICh0aGlzLl9zdGF0cykge1xuICAgICAgdGhpcy5fc3RhdHMudGltZUVuZChcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICB9XG4gICAgLy8gVE9ETyBSZWZhY3RvciBSZW5kZXJQYWdlUmVxdWVzdCB0byBzZXBhcmF0ZSByZW5kZXJpbmdcbiAgICAvLyBhbmQgb3BlcmF0b3IgbGlzdCBsb2dpY1xuICAgIGlmIChpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnJlc29sdmUodHJhbnNwYXJlbmN5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZW5kZXJQYWdlQ2h1bmsob3BlcmF0b3JMaXN0Q2h1bmssIGludGVudFN0YXRlKSB7XG4gICAgLy8gQWRkIHRoZSBuZXcgY2h1bmsgdG8gdGhlIGN1cnJlbnQgb3BlcmF0b3IgbGlzdC5cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcGVyYXRvckxpc3RDaHVuay5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuZm5BcnJheS5wdXNoKG9wZXJhdG9yTGlzdENodW5rLmZuQXJyYXlbaV0pO1xuICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5wdXNoKG9wZXJhdG9yTGlzdENodW5rLmFyZ3NBcnJheVtpXSk7XG4gICAgfVxuICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSBvcGVyYXRvckxpc3RDaHVuay5sYXN0Q2h1bms7XG5cbiAgICAvLyBOb3RpZnkgYWxsIHRoZSByZW5kZXJpbmcgdGFza3MgdGhlcmUgYXJlIG1vcmUgb3BlcmF0b3JzIHRvIGJlIGNvbnN1bWVkLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZW50U3RhdGUucmVuZGVyVGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzW2ldLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3JMaXN0Q2h1bmsubGFzdENodW5rKSB7XG4gICAgICB0aGlzLl90cnlDbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHVtcE9wZXJhdG9yTGlzdChhcmdzKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgYXJncy5pbnRlbnQsXG4gICAgICAnUERGUGFnZVByb3h5Ll9wdW1wT3BlcmF0b3JMaXN0OiBFeHBlY3RlZCBcImludGVudFwiIGFyZ3VtZW50LidcbiAgICApO1xuXG4gICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXG4gICAgICBcIkdldE9wZXJhdG9yTGlzdFwiLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG5cbiAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoYXJncy5pbnRlbnQpO1xuICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IHJlYWRlcjtcblxuICAgIGNvbnN0IHB1bXAgPSAoKSA9PiB7XG4gICAgICByZWFkZXIucmVhZCgpLnRoZW4oXG4gICAgICAgICh7IHZhbHVlLCBkb25lIH0pID0+IHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JlIGFueSBwZW5kaW5nIHJlcXVlc3RzIGlmIHRoZSB3b3JrZXIgd2FzIHRlcm1pbmF0ZWQuXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3JlbmRlclBhZ2VDaHVuayh2YWx1ZSwgaW50ZW50U3RhdGUpO1xuICAgICAgICAgIHB1bXAoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JlIGFueSBwZW5kaW5nIHJlcXVlc3RzIGlmIHRoZSB3b3JrZXIgd2FzIHRlcm1pbmF0ZWQuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QpIHtcbiAgICAgICAgICAgIC8vIE1hcmsgb3BlcmF0b3IgbGlzdCBhcyBjb21wbGV0ZS5cbiAgICAgICAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVudFN0YXRlLnJlbmRlclRhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzW2ldLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RyeUNsZWFudXAoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkge1xuICAgICAgICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuICAgIHB1bXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2Fib3J0T3BlcmF0b3JMaXN0KHsgaW50ZW50U3RhdGUsIHJlYXNvbiwgZm9yY2UgPSBmYWxzZSB9KSB7XG4gICAgYXNzZXJ0KFxuICAgICAgcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAgICAgKHR5cGVvZiByZWFzb24gPT09IFwib2JqZWN0XCIgJiYgcmVhc29uICE9PSBudWxsKSxcbiAgICAgICdQREZQYWdlUHJveHkuX2Fib3J0T3BlcmF0b3JMaXN0OiBFeHBlY3RlZCBcInJlYXNvblwiIGFyZ3VtZW50LidcbiAgICApO1xuXG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFmb3JjZSkge1xuICAgICAgLy8gRW5zdXJlIHRoYXQgYW4gRXJyb3Igb2NjdXJyaW5nIGluICpvbmx5KiBvbmUgYEludGVybmFsUmVuZGVyVGFza2AsIGUuZy5cbiAgICAgIC8vIG11bHRpcGxlIHJlbmRlcigpIGNhbGxzIG9uIHRoZSBzYW1lIGNhbnZhcywgd29uJ3QgYnJlYWsgYWxsIHJlbmRlcmluZy5cbiAgICAgIGlmIChpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW1tZWRpYXRlbHkgYWJvcnQgcGFyc2luZyBvbiB0aGUgd29ya2VyLXRocmVhZCB3aGVuIHJlbmRlcmluZyBpc1xuICAgICAgLy8gY2FuY2VsbGVkLCBzaW5jZSB0aGF0IHdpbGwgdW5uZWNlc3NhcmlseSBkZWxheSByZS1yZW5kZXJpbmcgd2hlbiAoZm9yXG4gICAgICAvLyBwYXJ0aWFsbHkgcGFyc2VkIHBhZ2VzKSBlLmcuIHpvb21pbmcvcm90YXRpb24gb2NjdXJzIGluIHRoZSB2aWV3ZXIuXG4gICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKSB7XG4gICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7IGludGVudFN0YXRlLCByZWFzb24sIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9LCBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlci5jYW5jZWwoXG4gICAgICBuZXcgQWJvcnRFeGNlcHRpb24ocmVhc29uICYmIHJlYXNvbi5tZXNzYWdlKVxuICAgICk7XG4gICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcblxuICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47IC8vIElnbm9yZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBpZiB0aGUgd29ya2VyIHdhcyB0ZXJtaW5hdGVkLlxuICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIGN1cnJlbnQgYGludGVudFN0YXRlYCwgc2luY2UgYSBjYW5jZWxsZWQgYGdldE9wZXJhdG9yTGlzdGBcbiAgICAvLyBjYWxsIG9uIHRoZSB3b3JrZXItdGhyZWFkIGNhbm5vdCBiZSByZS1zdGFydGVkLi4uXG4gICAgZm9yIChjb25zdCBbaW50ZW50LCBjdXJJbnRlbnRTdGF0ZV0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSB7XG4gICAgICBpZiAoY3VySW50ZW50U3RhdGUgPT09IGludGVudFN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUoaW50ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIC4uLiBhbmQgZm9yY2UgY2xlYW4tdXAgdG8gZW5zdXJlIHRoYXQgYW55IG9sZCBzdGF0ZSBpcyBhbHdheXMgcmVtb3ZlZC5cbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7T2JqZWN0fSBSZXR1cm5zIHBhZ2Ugc3RhdHMsIGlmIGVuYWJsZWQ7IHJldHVybnMgYG51bGxgIG90aGVyd2lzZS5cbiAgICovXG4gIGdldCBzdGF0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHM7XG4gIH1cbn1cblxuY2xhc3MgTG9vcGJhY2tQb3J0IHtcbiAgY29uc3RydWN0b3IoZGVmZXIgPSB0cnVlKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzID0gW107XG4gICAgdGhpcy5fZGVmZXIgPSBkZWZlcjtcbiAgICB0aGlzLl9kZWZlcnJlZCA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgcG9zdE1lc3NhZ2Uob2JqLCB0cmFuc2ZlcnMpIHtcbiAgICBmdW5jdGlvbiBjbG9uZVZhbHVlKHZhbHVlKSB7XG4gICAgICAvLyBUcnlpbmcgdG8gcGVyZm9ybSBhIHN0cnVjdHVyZWQgY2xvbmUgY2xvc2UgdG8gdGhlIHNwZWMsIGluY2x1ZGluZ1xuICAgICAgLy8gdHJhbnNmZXJzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgLy8gYWxyZWFkeSBjbG9uZWQgdGhlIG9iamVjdFxuICAgICAgICByZXR1cm4gY2xvbmVkLmdldCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBsZXQgYnVmZmVyLCByZXN1bHQ7XG4gICAgICBpZiAoKGJ1ZmZlciA9IHZhbHVlLmJ1ZmZlcikgJiYgaXNBcnJheUJ1ZmZlcihidWZmZXIpKSB7XG4gICAgICAgIC8vIFdlIGZvdW5kIG9iamVjdCB3aXRoIEFycmF5QnVmZmVyICh0eXBlZCBhcnJheSkuXG4gICAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZSA9IHRyYW5zZmVycyAmJiB0cmFuc2ZlcnMuaW5jbHVkZXMoYnVmZmVyKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZSkge1xuICAgICAgICAgIHJlc3VsdCA9IG5ldyB2YWx1ZS5jb25zdHJ1Y3RvcihcbiAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgIHZhbHVlLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBuZXcgdmFsdWUuY29uc3RydWN0b3IodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNsb25lZC5zZXQodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFtdIDoge307XG4gICAgICBjbG9uZWQuc2V0KHZhbHVlLCByZXN1bHQpOyAvLyBhZGRpbmcgdG8gY2FjaGUgbm93IGZvciBjeWNsaWMgcmVmZXJlbmNlc1xuICAgICAgLy8gQ2xvbmluZyBhbGwgdmFsdWUgYW5kIG9iamVjdCBwcm9wZXJ0aWVzLCBob3dldmVyIGlnbm9yaW5nIHByb3BlcnRpZXNcbiAgICAgIC8vIGRlZmluZWQgdmlhIGdldHRlci5cbiAgICAgIGZvciAoY29uc3QgaSBpbiB2YWx1ZSkge1xuICAgICAgICBsZXQgZGVzYyxcbiAgICAgICAgICBwID0gdmFsdWU7XG4gICAgICAgIHdoaWxlICghKGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHAsIGkpKSkge1xuICAgICAgICAgIHAgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjLnZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjLnZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYExvb3BiYWNrUG9ydC5wb3N0TWVzc2FnZSAtIGNhbm5vdCBjbG9uZTogJHt2YWx1ZVtpXX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbaV0gPSBjbG9uZVZhbHVlKGRlc2MudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2RlZmVyKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgeyBkYXRhOiBvYmogfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9uZWQgPSBuZXcgV2Vha01hcCgpO1xuICAgIGNvbnN0IGUgPSB7IGRhdGE6IGNsb25lVmFsdWUob2JqKSB9O1xuICAgIHRoaXMuX2RlZmVycmVkLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IGkgPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgfVxuXG4gIHRlcm1pbmF0ZSgpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBERldvcmtlclBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGUgd29ya2VyLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFtwb3J0XSAtIFRoZSBgd29ya2VyUG9ydGAgb2JqZWN0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt2ZXJib3NpdHldIC0gQ29udHJvbHMgdGhlIGxvZ2dpbmcgbGV2ZWw7IHRoZVxuICogICBjb25zdGFudHMgZnJvbSB7QGxpbmsgVmVyYm9zaXR5TGV2ZWx9IHNob3VsZCBiZSB1c2VkLlxuICovXG5cbi8qKiBAdHlwZSB7YW55fSAqL1xuY29uc3QgUERGV29ya2VyID0gKGZ1bmN0aW9uIFBERldvcmtlckNsb3N1cmUoKSB7XG4gIGNvbnN0IHBkZldvcmtlclBvcnRzID0gbmV3IFdlYWtNYXAoKTtcbiAgbGV0IGlzV29ya2VyRGlzYWJsZWQgPSBmYWxzZTtcbiAgbGV0IGZhbGxiYWNrV29ya2VyU3JjO1xuICBsZXQgbmV4dEZha2VXb3JrZXJJZCA9IDA7XG4gIGxldCBmYWtlV29ya2VyQ2FwYWJpbGl0eTtcblxuICBpZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgaWYgKGlzTm9kZUpTICYmIHR5cGVvZiBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBXb3JrZXJzIGFyZW4ndCBzdXBwb3J0ZWQgaW4gTm9kZS5qcywgZm9yY2UtZGlzYWJsaW5nIHRoZW0gdGhlcmUuXG4gICAgICBpc1dvcmtlckRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiTElCXCIpKSB7XG4gICAgICAgIGZhbGxiYWNrV29ya2VyU3JjID0gXCIuLi9wZGYud29ya2VyLmpzXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmYWxsYmFja1dvcmtlclNyYyA9IFwiLi9wZGYud29ya2VyLmpzXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwib2JqZWN0XCIgJiYgXCJjdXJyZW50U2NyaXB0XCIgaW4gZG9jdW1lbnQpIHtcbiAgICAgIGNvbnN0IHBkZmpzRmlsZVBhdGggPVxuICAgICAgICBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuICAgICAgaWYgKHBkZmpzRmlsZVBhdGgpIHtcbiAgICAgICAgZmFsbGJhY2tXb3JrZXJTcmMgPSBwZGZqc0ZpbGVQYXRoLnJlcGxhY2UoXG4gICAgICAgICAgLyhcXC4oPzptaW5cXC4pP2pzKShcXD8uKik/JC9pLFxuICAgICAgICAgIFwiLndvcmtlciQxJDJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFdvcmtlclNyYygpIHtcbiAgICBpZiAoR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMpIHtcbiAgICAgIHJldHVybiBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmYWxsYmFja1dvcmtlclNyYyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKCFpc05vZGVKUykge1xuICAgICAgICBkZXByZWNhdGVkKCdObyBcIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjXCIgc3BlY2lmaWVkLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbGxiYWNrV29ya2VyU3JjO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgbGV0IG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICB0cnkge1xuICAgICAgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyID1cbiAgICAgICAgZ2xvYmFsVGhpcy5wZGZqc1dvcmtlciAmJiBnbG9iYWxUaGlzLnBkZmpzV29ya2VyLldvcmtlck1lc3NhZ2VIYW5kbGVyO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvKiBJZ25vcmUgZXJyb3JzLiAqL1xuICAgIH1cbiAgICByZXR1cm4gbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyIHx8IG51bGw7XG4gIH1cblxuICAvLyBMb2FkcyB3b3JrZXIgY29kZSBpbnRvIG1haW4gdGhyZWFkLlxuICBmdW5jdGlvbiBzZXR1cEZha2VXb3JrZXJHbG9iYWwoKSB7XG4gICAgaWYgKGZha2VXb3JrZXJDYXBhYmlsaXR5KSB7XG4gICAgICByZXR1cm4gZmFrZVdvcmtlckNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9XG4gICAgZmFrZVdvcmtlckNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuXG4gICAgY29uc3QgbG9hZGVyID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyID0gZ2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCk7XG5cbiAgICAgIGlmIChtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgLy8gVGhlIHdvcmtlciB3YXMgYWxyZWFkeSBsb2FkZWQgdXNpbmcgZS5nLiBhIGA8c2NyaXB0PmAgdGFnLlxuICAgICAgICByZXR1cm4gbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIlBST0RVQ1RJT05cIikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBTeXN0ZW1KUyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIC8vIE1hbnVhbGx5IGxvYWQgU3lzdGVtSlMsIHNpbmNlIGl0J3Mgb25seSBuZWNlc3NhcnkgZm9yIGZha2Ugd29ya2Vycy5cbiAgICAgICAgICBhd2FpdCBsb2FkU2NyaXB0KFwiLi4vbm9kZV9tb2R1bGVzL3N5c3RlbWpzL2Rpc3Qvc3lzdGVtLmpzXCIpO1xuICAgICAgICAgIGF3YWl0IGxvYWRTY3JpcHQoXCIuLi9zeXN0ZW1qcy5jb25maWcuanNcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgU3lzdGVtSlMuaW1wb3J0KFwicGRmanMvY29yZS93b3JrZXIuanNcIik7XG4gICAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpICYmXG4gICAgICAgIGlzTm9kZUpTICYmXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICB0eXBlb2YgX19ub25fd2VicGFja19yZXF1aXJlX18gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgKSB7XG4gICAgICAgIC8vIFNpbmNlIGJ1bmRsZXJzLCBzdWNoIGFzIFdlYnBhY2ssIGNhbm5vdCBiZSB0b2xkIHRvIGxlYXZlIGByZXF1aXJlYFxuICAgICAgICAvLyBzdGF0ZW1lbnRzIGFsb25lIHdlIGFyZSB0aHVzIGZvcmNlZCB0byBqdW1wIHRocm91Z2ggaG9vcHMgaW4gb3JkZXJcbiAgICAgICAgLy8gdG8gcHJldmVudCBgQ3JpdGljYWwgZGVwZW5kZW5jeTogLi4uYCB3YXJuaW5ncyBpbiB0aGlyZC1wYXJ0eVxuICAgICAgICAvLyBkZXBsb3ltZW50cyBvZiB0aGUgYnVpbHQgYHBkZi5qc2AvYHBkZi53b3JrZXIuanNgIGZpbGVzOyBzZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2svd2VicGFjay9pc3N1ZXMvODgyNlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBjb2RlIHJ1bm5pbmcgaW5cbiAgICAgICAgLy8gTm9kZS5qcyB3b24ndCBldmVyIGJlIGFmZmVjdGVkIGJ5IGUuZy4gQ29udGVudCBTZWN1cml0eSBQb2xpY2llcyB0aGF0XG4gICAgICAgIC8vIHByZXZlbnQgdGhlIHVzZSBvZiBgZXZhbGAuIElmIHRoYXQgZXZlciBvY2N1cnMsIHdlIHNob3VsZCByZXZlcnQgdGhpc1xuICAgICAgICAvLyB0byBhIG5vcm1hbCBgX19ub25fd2VicGFja19yZXF1aXJlX19gIHN0YXRlbWVudCBhbmQgc2ltcGx5IGRvY3VtZW50XG4gICAgICAgIC8vIHRoZSBXZWJwYWNrIHdhcm5pbmdzIGluc3RlYWQgKHRlbGxpbmcgdXNlcnMgdG8gaWdub3JlIHRoZW0pLlxuICAgICAgICAvL1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbFxuICAgICAgICBjb25zdCB3b3JrZXIgPSBldmFsKFwicmVxdWlyZVwiKShnZXRXb3JrZXJTcmMoKSk7XG4gICAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICB9XG4gICAgICBhd2FpdCBsb2FkU2NyaXB0KGdldFdvcmtlclNyYygpKTtcbiAgICAgIHJldHVybiB3aW5kb3cucGRmanNXb3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgfTtcbiAgICBsb2FkZXIoKS50aGVuKGZha2VXb3JrZXJDYXBhYmlsaXR5LnJlc29sdmUsIGZha2VXb3JrZXJDYXBhYmlsaXR5LnJlamVjdCk7XG5cbiAgICByZXR1cm4gZmFrZVdvcmtlckNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNETldyYXBwZXIodXJsKSB7XG4gICAgLy8gV2Ugd2lsbCByZWx5IG9uIGJsb2IgVVJMJ3MgcHJvcGVydHkgdG8gc3BlY2lmeSBvcmlnaW4uXG4gICAgLy8gV2Ugd2FudCB0aGlzIGZ1bmN0aW9uIHRvIGZhaWwgaW4gY2FzZSBpZiBjcmVhdGVPYmplY3RVUkwgb3IgQmxvYiBkbyBub3RcbiAgICAvLyBleGlzdCBvciBmYWlsIGZvciBzb21lIHJlYXNvbiAtLSBvdXIgV29ya2VyIGNyZWF0aW9uIHdpbGwgZmFpbCBhbnl3YXkuXG4gICAgY29uc3Qgd3JhcHBlciA9IFwiaW1wb3J0U2NyaXB0cygnXCIgKyB1cmwgKyBcIicpO1wiO1xuICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt3cmFwcGVyXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBERi5qcyB3ZWIgd29ya2VyIGFic3RyYWN0aW9uIHRoYXQgY29udHJvbHMgdGhlIGluc3RhbnRpYXRpb24gb2YgUERGXG4gICAqIGRvY3VtZW50cy4gTWVzc2FnZSBoYW5kbGVycyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGZyb20gdGhlIG1haW5cbiAgICogdGhyZWFkIHRvIHRoZSB3b3JrZXIgdGhyZWFkIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgY3JlYXRpb24gb2YgYSB3ZWJcbiAgICogd29ya2VyIGlzIG5vdCBwb3NzaWJsZSwgYSBcImZha2VcIiB3b3JrZXIgd2lsbCBiZSB1c2VkIGluc3RlYWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNsYXNzIFBERldvcmtlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQREZXb3JrZXJQYXJhbWV0ZXJzfSBwYXJhbXMgLSBXb3JrZXIgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICBuYW1lID0gbnVsbCxcbiAgICAgIHBvcnQgPSBudWxsLFxuICAgICAgdmVyYm9zaXR5ID0gZ2V0VmVyYm9zaXR5TGV2ZWwoKSxcbiAgICB9ID0ge30pIHtcbiAgICAgIGlmIChwb3J0ICYmIHBkZldvcmtlclBvcnRzLmhhcyhwb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIG1vcmUgdGhhbiBvbmUgUERGV29ya2VyIHBlciBwb3J0XCIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSB0cnVlO1xuICAgICAgdGhpcy52ZXJib3NpdHkgPSB2ZXJib3NpdHk7XG5cbiAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICB0aGlzLl9wb3J0ID0gbnVsbDtcbiAgICAgIHRoaXMuX3dlYldvcmtlciA9IG51bGw7XG4gICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG5cbiAgICAgIGlmIChwb3J0KSB7XG4gICAgICAgIHBkZldvcmtlclBvcnRzLnNldChwb3J0LCB0aGlzKTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfVxuXG4gICAgZ2V0IHBvcnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcG9ydDtcbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhhbmRsZXI7XG4gICAgfVxuXG4gICAgX2luaXRpYWxpemVGcm9tUG9ydChwb3J0KSB7XG4gICAgICB0aGlzLl9wb3J0ID0gcG9ydDtcbiAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCBwb3J0KTtcbiAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLm9uKFwicmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBJZ25vcmluZyAncmVhZHknIGV2ZW50IC0tIE1lc3NhZ2VIYW5kbGVyIHNoYWxsIGJlIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgICAgLy8gYW5kIHJlYWR5IHRvIGFjY2VwdCB0aGUgbWVzc2FnZXMuXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAvLyBJZiB3b3JrZXIgc3VwcG9ydCBpc24ndCBkaXNhYmxlZCBleHBsaWNpdCBhbmQgdGhlIGJyb3dzZXIgaGFzIHdvcmtlclxuICAgICAgLy8gc3VwcG9ydCwgY3JlYXRlIGEgbmV3IHdlYiB3b3JrZXIgYW5kIHRlc3QgaWYgaXQvdGhlIGJyb3dzZXIgZnVsZmlsbHNcbiAgICAgIC8vIGFsbCByZXF1aXJlbWVudHMgdG8gcnVuIHBhcnRzIG9mIHBkZi5qcyBpbiBhIHdlYiB3b3JrZXIuXG4gICAgICAvLyBSaWdodCBub3csIHRoZSByZXF1aXJlbWVudCBpcywgdGhhdCBhbiBVaW50OEFycmF5IGlzIHN0aWxsIGFuXG4gICAgICAvLyBVaW50OEFycmF5IGFzIGl0IGFycml2ZXMgb24gdGhlIHdvcmtlci4gKENocm9tZSBhZGRlZCB0aGlzIHdpdGggdi4xNS4pXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBXb3JrZXIgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgIWlzV29ya2VyRGlzYWJsZWQgJiZcbiAgICAgICAgIWdldE1haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpXG4gICAgICApIHtcbiAgICAgICAgbGV0IHdvcmtlclNyYyA9IGdldFdvcmtlclNyYygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gV3JhcHMgd29ya2VyU3JjIHBhdGggaW50byBibG9iIFVSTCwgaWYgdGhlIGZvcm1lciBkb2VzIG5vdCBiZWxvbmdcbiAgICAgICAgICAvLyB0byB0aGUgc2FtZSBvcmlnaW4uXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICBQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSAmJlxuICAgICAgICAgICAgIWlzU2FtZU9yaWdpbih3aW5kb3cubG9jYXRpb24uaHJlZiwgd29ya2VyU3JjKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgd29ya2VyU3JjID0gY3JlYXRlQ0ROV3JhcHBlcihcbiAgICAgICAgICAgICAgbmV3IFVSTCh3b3JrZXJTcmMsIHdpbmRvdy5sb2NhdGlvbikuaHJlZlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEZGIGNhbid0IGNyZWF0ZSBhIHdvcmtlciBvbiBsb2NhbGhvc3QsIHNlZTpcbiAgICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODMyODBcbiAgICAgICAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclNyYyk7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoXCJtYWluXCIsIFwid29ya2VyXCIsIHdvcmtlcik7XG4gICAgICAgICAgY29uc3QgdGVybWluYXRlRWFybHkgPSAoKSA9PiB7XG4gICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGZha2Ugd29ya2VyIGlmIHRoZSB0ZXJtaW5hdGlvbiBpcyBjYXVzZWQgYnkgYW5cbiAgICAgICAgICAgICAgLy8gZXJyb3IgKGUuZy4gTmV0d29ya0Vycm9yIC8gU2VjdXJpdHlFcnJvcikuXG4gICAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBvbldvcmtlckVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWJXb3JrZXIpIHtcbiAgICAgICAgICAgICAgLy8gV29ya2VyIGZhaWxlZCB0byBpbml0aWFsaXplIGR1ZSB0byBhbiBlcnJvci4gQ2xlYW4gdXAgYW5kIGZhbGxcbiAgICAgICAgICAgICAgLy8gYmFjayB0byB0aGUgZmFrZSB3b3JrZXIuXG4gICAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuXG4gICAgICAgICAgbWVzc2FnZUhhbmRsZXIub24oXCJ0ZXN0XCIsIGRhdGEgPT4ge1xuICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpO1xuICAgICAgICAgICAgICByZXR1cm47IC8vIHdvcmtlciB3YXMgZGVzdHJveWVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAvLyBzdXBwb3J0VHlwZWRBcnJheVxuICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyO1xuICAgICAgICAgICAgICB0aGlzLl9wb3J0ID0gd29ya2VyO1xuICAgICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIgPSB3b3JrZXI7XG4gICAgICAgICAgICAgIGlmICghZGF0YS5zdXBwb3J0VHJhbnNmZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIC8vIFNlbmQgZ2xvYmFsIHNldHRpbmcsIGUuZy4gdmVyYm9zaXR5IGxldmVsLlxuICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwiY29uZmlndXJlXCIsIHtcbiAgICAgICAgICAgICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwicmVhZHlcIiwgZGF0YSA9PiB7XG4gICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgICAgIHJldHVybjsgLy8gd29ya2VyIHdhcyBkZXN0cm95ZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHNlbmRUZXN0KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIC8vIFdlIG5lZWQgZmFsbGJhY2sgdG8gYSBmYWtlZCB3b3JrZXIuXG4gICAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3Qgc2VuZFRlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0T2JqID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzID8gMjU1IDogMCxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBPcGVyYSB0aHJvdyBhIERBVEFfQ0xPTkVfRVJSIG9uIHNlcmlhbGl6aW5nIHRoZVxuICAgICAgICAgICAgLy8gdHlwZWQgYXJyYXkuIEFsc28sIGNoZWNraW5nIGlmIHdlIGNhbiB1c2UgdHJhbnNmZXJzLlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcInRlc3RcIiwgdGVzdE9iaiwgW3Rlc3RPYmouYnVmZmVyXSk7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICB3YXJuKFwiQ2Fubm90IHVzZSBwb3N0TWVzc2FnZSB0cmFuc2ZlcnMuXCIpO1xuICAgICAgICAgICAgICB0ZXN0T2JqWzBdID0gMDtcbiAgICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcInRlc3RcIiwgdGVzdE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEl0IG1pZ2h0IHRha2UgdGltZSBmb3Igd29ya2VyIHRvIGluaXRpYWxpemUgKGVzcGVjaWFsbHkgd2hlbiBBTURcbiAgICAgICAgICAvLyBsb2FkZXIgaXMgdXNlZCkuIFdlIHdpbGwgdHJ5IHRvIHNlbmQgdGVzdCBpbW1lZGlhdGVseSwgYW5kIHRoZW5cbiAgICAgICAgICAvLyB3aGVuICdyZWFkeScgbWVzc2FnZSB3aWxsIGFycml2ZS4gVGhlIHdvcmtlciBzaGFsbCBwcm9jZXNzIG9ubHlcbiAgICAgICAgICAvLyBmaXJzdCByZWNlaXZlZCAndGVzdCcuXG4gICAgICAgICAgc2VuZFRlc3QoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpbmZvKFwiVGhlIHdvcmtlciBoYXMgYmVlbiBkaXNhYmxlZC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEVpdGhlciB3b3JrZXJzIGFyZSBkaXNhYmxlZCwgbm90IHN1cHBvcnRlZCBvciBoYXZlIHRocm93biBhbiBleGNlcHRpb24uXG4gICAgICAvLyBUaHVzLCB3ZSBmYWxsYmFjayB0byBhIGZha2VkIHdvcmtlci5cbiAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgIH1cblxuICAgIF9zZXR1cEZha2VXb3JrZXIoKSB7XG4gICAgICBpZiAoIWlzV29ya2VyRGlzYWJsZWQpIHtcbiAgICAgICAgd2FybihcIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIuXCIpO1xuICAgICAgICBpc1dvcmtlckRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2V0dXBGYWtlV29ya2VyR2xvYmFsKClcbiAgICAgICAgLnRoZW4oV29ya2VyTWVzc2FnZUhhbmRsZXIgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHBvcnQgPSBuZXcgTG9vcGJhY2tQb3J0KCk7XG4gICAgICAgICAgdGhpcy5fcG9ydCA9IHBvcnQ7XG5cbiAgICAgICAgICAvLyBBbGwgZmFrZSB3b3JrZXJzIHVzZSB0aGUgc2FtZSBwb3J0LCBtYWtpbmcgaWQgdW5pcXVlLlxuICAgICAgICAgIGNvbnN0IGlkID0gXCJmYWtlXCIgKyBuZXh0RmFrZVdvcmtlcklkKys7XG5cbiAgICAgICAgICAvLyBJZiB0aGUgbWFpbiB0aHJlYWQgaXMgb3VyIHdvcmtlciwgc2V0dXAgdGhlIGhhbmRsaW5nIGZvciB0aGVcbiAgICAgICAgICAvLyBtZXNzYWdlcyAtLSB0aGUgbWFpbiB0aHJlYWQgc2VuZHMgdG8gaXQgc2VsZi5cbiAgICAgICAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKGlkICsgXCJfd29ya2VyXCIsIGlkLCBwb3J0KTtcbiAgICAgICAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cCh3b3JrZXJIYW5kbGVyLCBwb3J0KTtcblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKGlkLCBpZCArIFwiX3dvcmtlclwiLCBwb3J0KTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyO1xuICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgLy8gU2VuZCBnbG9iYWwgc2V0dGluZywgZS5nLiB2ZXJib3NpdHkgbGV2ZWwuXG4gICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcImNvbmZpZ3VyZVwiLCB7XG4gICAgICAgICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgICAgbmV3IEVycm9yKGBTZXR0aW5nIHVwIGZha2Ugd29ya2VyIGZhaWxlZDogXCIke3JlYXNvbi5tZXNzYWdlfVwiLmApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIHdvcmtlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuX3dlYldvcmtlcikge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIHRlcm1pbmF0ZSBvbmx5IHdlYiB3b3JrZXIgY3JlYXRlZCByZXNvdXJjZS5cbiAgICAgICAgdGhpcy5fd2ViV29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgcGRmV29ya2VyUG9ydHMuZGVsZXRlKHRoaXMuX3BvcnQpO1xuICAgICAgdGhpcy5fcG9ydCA9IG51bGw7XG4gICAgICBpZiAodGhpcy5fbWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQREZXb3JrZXJQYXJhbWV0ZXJzfSBwYXJhbXMgLSBUaGUgd29ya2VyIGluaXRpYWxpemF0aW9uXG4gICAgICogICBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tUG9ydChwYXJhbXMpIHtcbiAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMucG9ydCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQREZXb3JrZXIuZnJvbVBvcnQgLSBpbnZhbGlkIG1ldGhvZCBzaWduYXR1cmUuXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHBkZldvcmtlclBvcnRzLmhhcyhwYXJhbXMucG9ydCkpIHtcbiAgICAgICAgcmV0dXJuIHBkZldvcmtlclBvcnRzLmdldChwYXJhbXMucG9ydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFBERldvcmtlcihwYXJhbXMpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRXb3JrZXJTcmMoKSB7XG4gICAgICByZXR1cm4gZ2V0V29ya2VyU3JjKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBQREZXb3JrZXI7XG59KSgpO1xuXG4vKipcbiAqIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAqIEBpZ25vcmVcbiAqL1xuY2xhc3MgV29ya2VyVHJhbnNwb3J0IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZUhhbmRsZXIsIGxvYWRpbmdUYXNrLCBuZXR3b3JrU3RyZWFtLCBwYXJhbXMpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG4gICAgdGhpcy5sb2FkaW5nVGFzayA9IGxvYWRpbmdUYXNrO1xuICAgIHRoaXMuY29tbW9uT2JqcyA9IG5ldyBQREZPYmplY3RzKCk7XG4gICAgdGhpcy5mb250TG9hZGVyID0gbmV3IEZvbnRMb2FkZXIoe1xuICAgICAgZG9jSWQ6IGxvYWRpbmdUYXNrLmRvY0lkLFxuICAgICAgb25VbnN1cHBvcnRlZEZlYXR1cmU6IHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlLmJpbmQodGhpcyksXG4gICAgICBvd25lckRvY3VtZW50OiBwYXJhbXMub3duZXJEb2N1bWVudCxcbiAgICB9KTtcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5DTWFwUmVhZGVyRmFjdG9yeSA9IG5ldyBwYXJhbXMuQ01hcFJlYWRlckZhY3Rvcnkoe1xuICAgICAgYmFzZVVybDogcGFyYW1zLmNNYXBVcmwsXG4gICAgICBpc0NvbXByZXNzZWQ6IHBhcmFtcy5jTWFwUGFja2VkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5ID0gbnVsbDtcbiAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkgPSBudWxsO1xuXG4gICAgdGhpcy5fbmV0d29ya1N0cmVhbSA9IG5ldHdvcmtTdHJlYW07XG4gICAgdGhpcy5fZnVsbFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFByb2dyZXNzID0gbnVsbDtcblxuICAgIHRoaXMucGFnZUNhY2hlID0gW107XG4gICAgdGhpcy5wYWdlUHJvbWlzZXMgPSBbXTtcbiAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuXG4gICAgdGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVyKCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH1cblxuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcblxuICAgIGlmICh0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkpIHtcbiAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkIGR1cmluZyBvblBhc3N3b3JkIGNhbGxiYWNrXCIpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdhaXRPbiA9IFtdO1xuICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgYWxsIHJlbmRlcmluZ3MgdG8gYmUgY29tcGxldGVkLCBlLmcuXG4gICAgLy8gdGltZW91dC9yQUYgY2FuIHRha2UgYSBsb25nIHRpbWUuXG4gICAgdGhpcy5wYWdlQ2FjaGUuZm9yRWFjaChmdW5jdGlvbiAocGFnZSkge1xuICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgd2FpdE9uLnB1c2gocGFnZS5fZGVzdHJveSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBhZ2VDYWNoZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucGFnZVByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gZmluaXNoIGl0cyBsb25nIHJ1bm5pbmcgdGFza3MuXG4gICAgY29uc3QgdGVybWluYXRlZCA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiVGVybWluYXRlXCIsIG51bGwpO1xuICAgIHdhaXRPbi5wdXNoKHRlcm1pbmF0ZWQpO1xuICAgIFByb21pc2UuYWxsKHdhaXRPbikudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTtcbiAgICAgIGlmICh0aGlzLl9uZXR3b3JrU3RyZWFtKSB7XG4gICAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0uY2FuY2VsQWxsUmVxdWVzdHMoXG4gICAgICAgICAgbmV3IEFib3J0RXhjZXB0aW9uKFwiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLlwiKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9LCB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIHNldHVwTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgY29uc3QgeyBtZXNzYWdlSGFuZGxlciwgbG9hZGluZ1Rhc2sgfSA9IHRoaXM7XG5cbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkdldFJlYWRlclwiLCAoZGF0YSwgc2luaykgPT4ge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICB0aGlzLl9uZXR3b3JrU3RyZWFtLFxuICAgICAgICBcIkdldFJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuXCJcbiAgICAgICk7XG4gICAgICB0aGlzLl9mdWxsUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyKCk7XG4gICAgICB0aGlzLl9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSBldnQgPT4ge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSB7XG4gICAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuICAgICAgICAgIHRvdGFsOiBldnQudG90YWwsXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Z1bGxSZWFkZXJcbiAgICAgICAgICAucmVhZCgpXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHsgdmFsdWUsIGRvbmUgfSkge1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIGlzQXJyYXlCdWZmZXIodmFsdWUpLFxuICAgICAgICAgICAgICBcIkdldFJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gRW5xdWV1ZSBkYXRhIGNodW5rIGludG8gc2luaywgYW5kIHRyYW5zZmVyIGl0XG4gICAgICAgICAgICAvLyB0byBvdGhlciBzaWRlIGFzIGBUcmFuc2ZlcmFibGVgIG9iamVjdC5cbiAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBzaW5rLm9uQ2FuY2VsID0gcmVhc29uID0+IHtcbiAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5jYW5jZWwocmVhc29uKTtcblxuICAgICAgICBzaW5rLnJlYWR5LmNhdGNoKHJlYWR5UmVhc29uID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JlIGFueSBwZW5kaW5nIHJlcXVlc3RzIGlmIHRoZSB3b3JrZXIgd2FzIHRlcm1pbmF0ZWQuXG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIlJlYWRlckhlYWRlcnNSZWFkeVwiLCBkYXRhID0+IHtcbiAgICAgIGNvbnN0IGhlYWRlcnNDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIGNvbnN0IGZ1bGxSZWFkZXIgPSB0aGlzLl9mdWxsUmVhZGVyO1xuICAgICAgZnVsbFJlYWRlci5oZWFkZXJzUmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIElmIHN0cmVhbSBvciByYW5nZSBhcmUgZGlzYWJsZWQsIGl0J3Mgb3VyIG9ubHkgd2F5IHRvIHJlcG9ydFxuICAgICAgICAvLyBsb2FkaW5nIHByb2dyZXNzLlxuICAgICAgICBpZiAoIWZ1bGxSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQgfHwgIWZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgICAgIGlmICh0aGlzLl9sYXN0UHJvZ3Jlc3MgJiYgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcykge1xuICAgICAgICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcyh0aGlzLl9sYXN0UHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSBldnQgPT4ge1xuICAgICAgICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcyh7XG4gICAgICAgICAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuICAgICAgICAgICAgICAgIHRvdGFsOiBldnQudG90YWwsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBoZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1N1cHBvcnRlZDogZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCxcbiAgICAgICAgICBpc1JhbmdlU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQsXG4gICAgICAgICAgY29udGVudExlbmd0aDogZnVsbFJlYWRlci5jb250ZW50TGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgIH0sIGhlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7XG5cbiAgICAgIHJldHVybiBoZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH0pO1xuXG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXRSYW5nZVJlYWRlclwiLCAoZGF0YSwgc2luaykgPT4ge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICB0aGlzLl9uZXR3b3JrU3RyZWFtLFxuICAgICAgICBcIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihcbiAgICAgICAgZGF0YS5iZWdpbixcbiAgICAgICAgZGF0YS5lbmRcbiAgICAgICk7XG5cbiAgICAgIC8vIFdoZW4gc3RyZWFtaW5nIGlzIGVuYWJsZWQsIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgZGF0YSByZXF1ZXN0ZWQgaGVyZVxuICAgICAgLy8gaGFzIGFscmVhZHkgYmVlbiBmZXRjaGVkIHZpYSB0aGUgYF9mdWxsUmVxdWVzdFJlYWRlcmAgaW1wbGVtZW50YXRpb24uXG4gICAgICAvLyBIb3dldmVyLCBnaXZlbiB0aGF0IHRoZSBQREYgZGF0YSBpcyBsb2FkZWQgYXN5bmNocm9ub3VzbHkgb24gdGhlXG4gICAgICAvLyBtYWluLXRocmVhZCBhbmQgdGhlbiBzZW50IHZpYSBgcG9zdE1lc3NhZ2VgIHRvIHRoZSB3b3JrZXItdGhyZWFkLFxuICAgICAgLy8gaXQgbWF5IG5vdCBoYXZlIGJlZW4gYXZhaWxhYmxlIGR1cmluZyBwYXJzaW5nIChoZW5jZSB0aGUgYXR0ZW1wdCB0b1xuICAgICAgLy8gdXNlIHJhbmdlIHJlcXVlc3RzIGhlcmUpLlxuICAgICAgLy9cbiAgICAgIC8vIFRvIGF2b2lkIHdhc3RpbmcgdGltZSBhbmQgcmVzb3VyY2VzIGhlcmUsIHdlJ2xsIHRodXMgKm5vdCogZGlzcGF0Y2hcbiAgICAgIC8vIHJhbmdlIHJlcXVlc3RzIGlmIHRoZSBkYXRhIHdhcyBhbHJlYWR5IGxvYWRlZCBidXQgaGFzIG5vdCBiZWVuIHNlbnQgdG9cbiAgICAgIC8vIHRoZSB3b3JrZXItdGhyZWFkIHlldCAod2hpY2ggd2lsbCBoYXBwZW4gdmlhIHRoZSBgX2Z1bGxSZXF1ZXN0UmVhZGVyYCkuXG4gICAgICBpZiAoIXJhbmdlUmVhZGVyKSB7XG4gICAgICAgIHNpbmsuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzaW5rLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgcmFuZ2VSZWFkZXJcbiAgICAgICAgICAucmVhZCgpXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHsgdmFsdWUsIGRvbmUgfSkge1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIGlzQXJyYXlCdWZmZXIodmFsdWUpLFxuICAgICAgICAgICAgICBcIkdldFJhbmdlUmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzaW5rLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpLCAxLCBbdmFsdWVdKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgICAgc2luay5lcnJvcihyZWFzb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgc2luay5vbkNhbmNlbCA9IHJlYXNvbiA9PiB7XG4gICAgICAgIHJhbmdlUmVhZGVyLmNhbmNlbChyZWFzb24pO1xuXG4gICAgICAgIHNpbmsucmVhZHkuY2F0Y2gocmVhZHlSZWFzb24gPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0RG9jXCIsICh7IHBkZkluZm8gfSkgPT4ge1xuICAgICAgdGhpcy5fbnVtUGFnZXMgPSBwZGZJbmZvLm51bVBhZ2VzO1xuICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVzb2x2ZShuZXcgUERGRG9jdW1lbnRQcm94eShwZGZJbmZvLCB0aGlzKSk7XG4gICAgfSk7XG5cbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRvY0V4Y2VwdGlvblwiLCBmdW5jdGlvbiAoZXgpIHtcbiAgICAgIGxldCByZWFzb247XG4gICAgICBzd2l0Y2ggKGV4Lm5hbWUpIHtcbiAgICAgICAgY2FzZSBcIlBhc3N3b3JkRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IFBhc3N3b3JkRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmNvZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKGV4Lm1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGV4Lm1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5zdGF0dXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5kZXRhaWxzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICghKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICBjb25zdCBtc2cgPSBcIkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuXCI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICB1bnJlYWNoYWJsZShtc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG5cbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIlBhc3N3b3JkUmVxdWVzdFwiLCBleGNlcHRpb24gPT4ge1xuICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcblxuICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlUGFzc3dvcmQgPSBwYXNzd29yZCA9PiB7XG4gICAgICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9hZGluZ1Rhc2sub25QYXNzd29yZCh1cGRhdGVQYXNzd29yZCwgZXhjZXB0aW9uLmNvZGUpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QoZXgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgIG5ldyBQYXNzd29yZEV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSwgZXhjZXB0aW9uLmNvZGUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfSk7XG5cbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRhdGFMb2FkZWRcIiwgZGF0YSA9PiB7XG4gICAgICAvLyBGb3IgY29uc2lzdGVuY3k6IEVuc3VyZSB0aGF0IHByb2dyZXNzIGlzIGFsd2F5cyByZXBvcnRlZCB3aGVuIHRoZVxuICAgICAgLy8gZW50aXJlIFBERiBmaWxlIGhhcyBiZWVuIGxvYWRlZCwgcmVnYXJkbGVzcyBvZiBob3cgaXQgd2FzIGZldGNoZWQuXG4gICAgICBpZiAobG9hZGluZ1Rhc2sub25Qcm9ncmVzcykge1xuICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHtcbiAgICAgICAgICBsb2FkZWQ6IGRhdGEubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucmVzb2x2ZShkYXRhKTtcbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiU3RhcnRSZW5kZXJQYWdlXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjsgLy8gSWdub3JlIGFueSBwZW5kaW5nIHJlcXVlc3RzIGlmIHRoZSB3b3JrZXIgd2FzIHRlcm1pbmF0ZWQuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2VDYWNoZVtkYXRhLnBhZ2VJbmRleF07XG4gICAgICBwYWdlLl9zdGFydFJlbmRlclBhZ2UoZGF0YS50cmFuc3BhcmVuY3ksIGRhdGEuaW50ZW50KTtcbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiY29tbW9ub2JqXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjsgLy8gSWdub3JlIGFueSBwZW5kaW5nIHJlcXVlc3RzIGlmIHRoZSB3b3JrZXIgd2FzIHRlcm1pbmF0ZWQuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtpZCwgdHlwZSwgZXhwb3J0ZWREYXRhXSA9IGRhdGE7XG4gICAgICBpZiAodGhpcy5jb21tb25PYmpzLmhhcyhpZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLl9wYXJhbXM7XG5cbiAgICAgICAgICBpZiAoXCJlcnJvclwiIGluIGV4cG9ydGVkRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRFcnJvciA9IGV4cG9ydGVkRGF0YS5lcnJvcjtcbiAgICAgICAgICAgIHdhcm4oYEVycm9yIGR1cmluZyBmb250IGxvYWRpbmc6ICR7ZXhwb3J0ZWRFcnJvcn1gKTtcbiAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBleHBvcnRlZEVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBmb250UmVnaXN0cnkgPSBudWxsO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5wZGZCdWcgJiZcbiAgICAgICAgICAgIGdsb2JhbFRoaXMuRm9udEluc3BlY3RvciAmJlxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmVuYWJsZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZvbnRSZWdpc3RyeSA9IHtcbiAgICAgICAgICAgICAgcmVnaXN0ZXJGb250KGZvbnQsIHVybCkge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQoZm9udCwgdXJsKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZvbnQgPSBuZXcgRm9udEZhY2VPYmplY3QoZXhwb3J0ZWREYXRhLCB7XG4gICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHBhcmFtcy5pc0V2YWxTdXBwb3J0ZWQsXG4gICAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IHBhcmFtcy5kaXNhYmxlRm9udEZhY2UsXG4gICAgICAgICAgICBpZ25vcmVFcnJvcnM6IHBhcmFtcy5pZ25vcmVFcnJvcnMsXG4gICAgICAgICAgICBvblVuc3VwcG9ydGVkRmVhdHVyZTogdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGZvbnRSZWdpc3RyeSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuZm9udExvYWRlclxuICAgICAgICAgICAgLmJpbmQoZm9udClcbiAgICAgICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiRm9udEZhbGxiYWNrXCIsIHsgaWQgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5mb250RXh0cmFQcm9wZXJ0aWVzICYmIGZvbnQuZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIEltbWVkaWF0ZWx5IHJlbGVhc2UgdGhlIGBmb250LmRhdGFgIHByb3BlcnR5IG9uY2UgdGhlIGZvbnRcbiAgICAgICAgICAgICAgICAvLyBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgRE9NLCBzaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsXG4gICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgYSBgUERGRG9jdW1lbnRQcm94eS5jbGVhbnVwYCBjYWxsLlxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIGBmb250LmRhdGFgIGNvdWxkIGJlIHZlcnkgbGFyZ2UsIGUuZy4gaW4gc29tZSBjYXNlc1xuICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIG1lZ2FieXRlcywgdGhpcyB3aWxsIGhlbHAgcmVkdWNlIG1lbW9yeSB1c2FnZS5cbiAgICAgICAgICAgICAgICBmb250LmRhdGEgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBmb250KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRm9udFBhdGhcIjpcbiAgICAgICAgY2FzZSBcIkltYWdlXCI6XG4gICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGV4cG9ydGVkRGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHb3QgdW5rbm93biBjb21tb24gb2JqZWN0IHR5cGUgJHt0eXBlfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJvYmpcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgLy8gSWdub3JlIGFueSBwZW5kaW5nIHJlcXVlc3RzIGlmIHRoZSB3b3JrZXIgd2FzIHRlcm1pbmF0ZWQuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtpZCwgcGFnZUluZGV4LCB0eXBlLCBpbWFnZURhdGFdID0gZGF0YTtcbiAgICAgIGNvbnN0IHBhZ2VQcm94eSA9IHRoaXMucGFnZUNhY2hlW3BhZ2VJbmRleF07XG4gICAgICBpZiAocGFnZVByb3h5Lm9ianMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkltYWdlXCI6XG4gICAgICAgICAgcGFnZVByb3h5Lm9ianMucmVzb2x2ZShpZCwgaW1hZ2VEYXRhKTtcblxuICAgICAgICAgIC8vIEhldXJpc3RpYyB0aGF0IHdpbGwgYWxsb3cgdXMgbm90IHRvIHN0b3JlIGxhcmdlIGRhdGEuXG4gICAgICAgICAgY29uc3QgTUFYX0lNQUdFX1NJWkVfVE9fU1RPUkUgPSA4MDAwMDAwO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGltYWdlRGF0YSAmJlxuICAgICAgICAgICAgXCJkYXRhXCIgaW4gaW1hZ2VEYXRhICYmXG4gICAgICAgICAgICBpbWFnZURhdGEuZGF0YS5sZW5ndGggPiBNQVhfSU1BR0VfU0laRV9UT19TVE9SRVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcGFnZVByb3h5LmNsZWFudXBBZnRlclJlbmRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR290IHVua25vd24gb2JqZWN0IHR5cGUgJHt0eXBlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRG9jUHJvZ3Jlc3NcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcyh7XG4gICAgICAgICAgbG9hZGVkOiBkYXRhLmxvYWRlZCxcbiAgICAgICAgICB0b3RhbDogZGF0YS50b3RhbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBtZXNzYWdlSGFuZGxlci5vbihcbiAgICAgIFwiVW5zdXBwb3J0ZWRGZWF0dXJlXCIsXG4gICAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZS5iaW5kKHRoaXMpXG4gICAgKTtcblxuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRmV0Y2hCdWlsdEluQ01hcFwiLCAoZGF0YSwgc2luaykgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHNpbmsuZXJyb3IobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgZmV0Y2hlZCA9IGZhbHNlO1xuXG4gICAgICBzaW5rLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKGZldGNoZWQpIHtcbiAgICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZldGNoZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuQ01hcFJlYWRlckZhY3RvcnkuZmV0Y2goZGF0YSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYnVpbHRJbkNNYXApIHtcbiAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShidWlsdEluQ01hcCwgMSwgW2J1aWx0SW5DTWFwLmNNYXBEYXRhLmJ1ZmZlcl0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBfb25VbnN1cHBvcnRlZEZlYXR1cmUoeyBmZWF0dXJlSWQgfSkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaWYgdGhlIHdvcmtlciB3YXMgdGVybWluYXRlZC5cbiAgICB9XG4gICAgaWYgKHRoaXMubG9hZGluZ1Rhc2sub25VbnN1cHBvcnRlZEZlYXR1cmUpIHtcbiAgICAgIHRoaXMubG9hZGluZ1Rhc2sub25VbnN1cHBvcnRlZEZlYXR1cmUoZmVhdHVyZUlkKTtcbiAgICB9XG4gIH1cblxuICBnZXREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERhdGFcIiwgbnVsbCk7XG4gIH1cblxuICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICAhTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSB8fFxuICAgICAgcGFnZU51bWJlciA8PSAwIHx8XG4gICAgICBwYWdlTnVtYmVyID4gdGhpcy5fbnVtUGFnZXNcbiAgICApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZ2UgcmVxdWVzdFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUluZGV4ID0gcGFnZU51bWJlciAtIDE7XG4gICAgaWYgKHBhZ2VJbmRleCBpbiB0aGlzLnBhZ2VQcm9taXNlcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFnZVByb21pc2VzW3BhZ2VJbmRleF07XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICAuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZVwiLCB7XG4gICAgICAgIHBhZ2VJbmRleCxcbiAgICAgIH0pXG4gICAgICAudGhlbihwYWdlSW5mbyA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyYW5zcG9ydCBkZXN0cm95ZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFnZSA9IG5ldyBQREZQYWdlUHJveHkoXG4gICAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICAgIHBhZ2VJbmZvLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5fcGFyYW1zLm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgdGhpcy5fcGFyYW1zLnBkZkJ1Z1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhZ2VDYWNoZVtwYWdlSW5kZXhdID0gcGFnZTtcbiAgICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgICB9KTtcbiAgICB0aGlzLnBhZ2VQcm9taXNlc1twYWdlSW5kZXhdID0gcHJvbWlzZTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGdldFBhZ2VJbmRleChyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VJbmRleFwiLCB7XG4gICAgICAgIHJlZixcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKHJlYXNvbikpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgsIGludGVudCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldEFubm90YXRpb25zXCIsIHtcbiAgICAgIHBhZ2VJbmRleCxcbiAgICAgIGludGVudCxcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVEb2N1bWVudChhbm5vdGF0aW9uU3RvcmFnZSkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICAuc2VuZFdpdGhQcm9taXNlKFwiU2F2ZURvY3VtZW50XCIsIHtcbiAgICAgICAgbnVtUGFnZXM6IHRoaXMuX251bVBhZ2VzLFxuICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTpcbiAgICAgICAgICAoYW5ub3RhdGlvblN0b3JhZ2UgJiYgYW5ub3RhdGlvblN0b3JhZ2UuZ2V0QWxsKCkpIHx8IG51bGwsXG4gICAgICAgIGZpbGVuYW1lOiB0aGlzLl9mdWxsUmVhZGVyID8gdGhpcy5fZnVsbFJlYWRlci5maWxlbmFtZSA6IG51bGwsXG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBpZiAoYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uc1wiLCBudWxsKTtcbiAgfVxuXG4gIGdldERlc3RpbmF0aW9uKGlkKSB7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgZGVzdGluYXRpb24gcmVxdWVzdC5cIikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREZXN0aW5hdGlvblwiLCB7XG4gICAgICBpZCxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBhZ2VMYWJlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxhYmVsc1wiLCBudWxsKTtcbiAgfVxuXG4gIGdldFBhZ2VMYXlvdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxheW91dFwiLCBudWxsKTtcbiAgfVxuXG4gIGdldFBhZ2VNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VNb2RlXCIsIG51bGwpO1xuICB9XG5cbiAgZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0Vmlld2VyUHJlZmVyZW5jZXNcIiwgbnVsbCk7XG4gIH1cblxuICBnZXRPcGVuQWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE9wZW5BY3Rpb25cIiwgbnVsbCk7XG4gIH1cblxuICBnZXRBdHRhY2htZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRBdHRhY2htZW50c1wiLCBudWxsKTtcbiAgfVxuXG4gIGdldEphdmFTY3JpcHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0SmF2YVNjcmlwdFwiLCBudWxsKTtcbiAgfVxuXG4gIGdldE91dGxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3V0bGluZVwiLCBudWxsKTtcbiAgfVxuXG4gIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgLnNlbmRXaXRoUHJvbWlzZShcIkdldE9wdGlvbmFsQ29udGVudENvbmZpZ1wiLCBudWxsKVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgT3B0aW9uYWxDb250ZW50Q29uZmlnKHJlc3VsdHMpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQZXJtaXNzaW9uc1wiLCBudWxsKTtcbiAgfVxuXG4gIGdldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICAuc2VuZFdpdGhQcm9taXNlKFwiR2V0TWV0YWRhdGFcIiwgbnVsbClcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGluZm86IHJlc3VsdHNbMF0sXG4gICAgICAgICAgbWV0YWRhdGE6IHJlc3VsdHNbMV0gPyBuZXcgTWV0YWRhdGEocmVzdWx0c1sxXSkgOiBudWxsLFxuICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOiB0aGlzLl9mdWxsUmVhZGVyXG4gICAgICAgICAgICA/IHRoaXMuX2Z1bGxSZWFkZXIuZmlsZW5hbWVcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0U3RhdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0U3RhdHNcIiwgbnVsbCk7XG4gIH1cblxuICBzdGFydENsZWFudXAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiQ2xlYW51cFwiLCBudWxsKS50aGVuKCgpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMucGFnZUNhY2hlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMucGFnZUNhY2hlW2ldO1xuICAgICAgICBpZiAocGFnZSkge1xuICAgICAgICAgIGNvbnN0IGNsZWFudXBTdWNjZXNzZnVsID0gcGFnZS5jbGVhbnVwKCk7XG5cbiAgICAgICAgICBpZiAoIWNsZWFudXBTdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBzdGFydENsZWFudXA6IFBhZ2UgJHtpICsgMX0gaXMgY3VycmVudGx5IHJlbmRlcmluZy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7XG4gICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nUGFyYW1zKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcmFtcztcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwibG9hZGluZ1BhcmFtc1wiLCB7XG4gICAgICBkaXNhYmxlQXV0b0ZldGNoOiBwYXJhbXMuZGlzYWJsZUF1dG9GZXRjaCxcbiAgICAgIGRpc2FibGVGb250RmFjZTogcGFyYW1zLmRpc2FibGVGb250RmFjZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgUERGIGRvY3VtZW50IGFuZCBwYWdlIGlzIGJ1aWx0IG9mIG1hbnkgb2JqZWN0cy4gRS5nLiB0aGVyZSBhcmUgb2JqZWN0cyBmb3JcbiAqIGZvbnRzLCBpbWFnZXMsIHJlbmRlcmluZyBjb2RlLCBldGMuIFRoZXNlIG9iamVjdHMgbWF5IGdldCBwcm9jZXNzZWQgaW5zaWRlIG9mXG4gKiBhIHdvcmtlci4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHNvbWUgYmFzaWMgbWV0aG9kcyB0byBtYW5hZ2UgdGhlc2Ugb2JqZWN0cy5cbiAqIEBpZ25vcmVcbiAqL1xuY2xhc3MgUERGT2JqZWN0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlcmUgaXMgYW4gb2JqZWN0IGRlZmluZWQgZm9yIGBvYmpJZGAuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZW5zdXJlT2JqKG9iaklkKSB7XG4gICAgaWYgKHRoaXMuX29ianNbb2JqSWRdKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2Jqc1tvYmpJZF07XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5fb2Jqc1tvYmpJZF0gPSB7XG4gICAgICBjYXBhYmlsaXR5OiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpLFxuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIHJlc29sdmVkOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBjYWxsZWQgKndpdGhvdXQqIGNhbGxiYWNrLCB0aGlzIHJldHVybnMgdGhlIGRhdGEgb2YgYG9iaklkYCBidXQgdGhlXG4gICAqIG9iamVjdCBuZWVkcyB0byBiZSByZXNvbHZlZC4gSWYgaXQgaXNuJ3QsIHRoaXMgbWV0aG9kIHRocm93cy5cbiAgICpcbiAgICogSWYgY2FsbGVkICp3aXRoKiBhIGNhbGxiYWNrLCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIGRhdGEgb2YgdGhlXG4gICAqIG9iamVjdCBvbmNlIHRoZSBvYmplY3QgaXMgcmVzb2x2ZWQuIFRoYXQgbWVhbnMsIGlmIHlvdSBjYWxsIHRoaXMgbWV0aG9kXG4gICAqIGFuZCB0aGUgb2JqZWN0IGlzIGFscmVhZHkgcmVzb2x2ZWQsIHRoZSBjYWxsYmFjayBnZXRzIGNhbGxlZCByaWdodCBhd2F5LlxuICAgKi9cbiAgZ2V0KG9iaklkLCBjYWxsYmFjayA9IG51bGwpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBhIGNhbGxiYWNrLCB0aGVuIHRoZSBnZXQgY2FuIGJlIGFzeW5jIGFuZCB0aGUgb2JqZWN0IGlzXG4gICAgLy8gbm90IHJlcXVpcmVkIHRvIGJlIHJlc29sdmVkIHJpZ2h0IG5vdy5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2Vuc3VyZU9iaihvYmpJZCkuY2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIElmIHRoZXJlIGlzbid0IGEgY2FsbGJhY2ssIHRoZSB1c2VyIGV4cGVjdHMgdG8gZ2V0IHRoZSByZXNvbHZlZCBkYXRhXG4gICAgLy8gZGlyZWN0bHkuXG4gICAgY29uc3Qgb2JqID0gdGhpcy5fb2Jqc1tvYmpJZF07XG4gICAgLy8gSWYgdGhlcmUgaXNuJ3QgYW4gb2JqZWN0IHlldCBvciB0aGUgb2JqZWN0IGlzbid0IHJlc29sdmVkLCB0aGVuIHRoZVxuICAgIC8vIGRhdGEgaXNuJ3QgcmVhZHkgeWV0IVxuICAgIGlmICghb2JqIHx8ICFvYmoucmVzb2x2ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdGluZyBvYmplY3QgdGhhdCBpc24ndCByZXNvbHZlZCB5ZXQgJHtvYmpJZH0uYCk7XG4gICAgfVxuICAgIHJldHVybiBvYmouZGF0YTtcbiAgfVxuXG4gIGhhcyhvYmpJZCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX29ianNbb2JqSWRdO1xuICAgIHJldHVybiBvYmogPyBvYmoucmVzb2x2ZWQgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgb2JqZWN0IGBvYmpJZGAgd2l0aCBvcHRpb25hbCBgZGF0YWAuXG4gICAqL1xuICByZXNvbHZlKG9iaklkLCBkYXRhKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5fZW5zdXJlT2JqKG9iaklkKTtcblxuICAgIG9iai5yZXNvbHZlZCA9IHRydWU7XG4gICAgb2JqLmRhdGEgPSBkYXRhO1xuICAgIG9iai5jYXBhYmlsaXR5LnJlc29sdmUoZGF0YSk7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLl9vYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxufVxuXG4vKipcbiAqIEFsbG93cyBjb250cm9sbGluZyBvZiB0aGUgcmVuZGVyaW5nIHRhc2tzLlxuICovXG5jbGFzcyBSZW5kZXJUYXNrIHtcbiAgY29uc3RydWN0b3IoaW50ZXJuYWxSZW5kZXJUYXNrKSB7XG4gICAgdGhpcy5faW50ZXJuYWxSZW5kZXJUYXNrID0gaW50ZXJuYWxSZW5kZXJUYXNrO1xuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZm9yIGluY3JlbWVudGFsIHJlbmRlcmluZyAtLSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWRcbiAgICAgKiBlYWNoIHRpbWUgdGhlIHJlbmRlcmluZyBpcyBwYXVzZWQuICBUbyBjb250aW51ZSByZW5kZXJpbmcgY2FsbCB0aGVcbiAgICAgKiBmdW5jdGlvbiB0aGF0IGlzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2suXG4gICAgICogQHR5cGUge2Z1bmN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMub25Db250aW51ZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJvbWlzZSBmb3IgcmVuZGVyaW5nIHRhc2sgY29tcGxldGlvbi5cbiAgICogQHR5cGUge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXQgcHJvbWlzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSByZW5kZXJpbmcgdGFzay4gSWYgdGhlIHRhc2sgaXMgY3VycmVudGx5IHJlbmRlcmluZyBpdCB3aWxsXG4gICAqIG5vdCBiZSBjYW5jZWxsZWQgdW50aWwgZ3JhcGhpY3MgcGF1c2VzIHdpdGggYSB0aW1lb3V0LiBUaGUgcHJvbWlzZSB0aGF0XG4gICAqIHRoaXMgb2JqZWN0IGV4dGVuZHMgd2lsbCBiZSByZWplY3RlZCB3aGVuIGNhbmNlbGxlZC5cbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLl9pbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IEludGVybmFsUmVuZGVyVGFzayA9IChmdW5jdGlvbiBJbnRlcm5hbFJlbmRlclRhc2tDbG9zdXJlKCkge1xuICBjb25zdCBjYW52YXNJblJlbmRlcmluZyA9IG5ldyBXZWFrU2V0KCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBjbGFzcyBJbnRlcm5hbFJlbmRlclRhc2sge1xuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgcGFyYW1zLFxuICAgICAgb2JqcyxcbiAgICAgIGNvbW1vbk9ianMsXG4gICAgICBvcGVyYXRvckxpc3QsXG4gICAgICBwYWdlSW5kZXgsXG4gICAgICBjYW52YXNGYWN0b3J5LFxuICAgICAgd2ViR0xDb250ZXh0LFxuICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZmFsc2UsXG4gICAgICBwZGZCdWcgPSBmYWxzZSxcbiAgICB9KSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICAgIHRoaXMub2JqcyA9IG9ianM7XG4gICAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzO1xuICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSBudWxsO1xuICAgICAgdGhpcy5vcGVyYXRvckxpc3QgPSBvcGVyYXRvckxpc3Q7XG4gICAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5O1xuICAgICAgdGhpcy53ZWJHTENvbnRleHQgPSB3ZWJHTENvbnRleHQ7XG4gICAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7XG5cbiAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgdGhpcy5ncmFwaGljc1JlYWR5ID0gZmFsc2U7XG4gICAgICB0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICAgICAgICB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09IHRydWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIHRoaXMuY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgdGhpcy50YXNrID0gbmV3IFJlbmRlclRhc2sodGhpcyk7XG4gICAgICAvLyBjYWNoaW5nIHRoaXMtYm91bmQgbWV0aG9kc1xuICAgICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCA9IHRoaXMuX3NjaGVkdWxlTmV4dC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5fbmV4dEJvdW5kID0gdGhpcy5fbmV4dC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5fY2FudmFzID0gcGFyYW1zLmNhbnZhc0NvbnRleHQuY2FudmFzO1xuICAgIH1cblxuICAgIGdldCBjb21wbGV0ZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYXBhYmlsaXR5LnByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBJZ25vcmluZyBlcnJvcnMsIHNpbmNlIHdlIG9ubHkgd2FudCB0byBrbm93IHdoZW4gcmVuZGVyaW5nIGlzXG4gICAgICAgIC8vIG5vIGxvbmdlciBwZW5kaW5nLlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZUdyYXBoaWNzKHsgdHJhbnNwYXJlbmN5ID0gZmFsc2UsIG9wdGlvbmFsQ29udGVudENvbmZpZyB9KSB7XG4gICAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2NhbnZhcykge1xuICAgICAgICBpZiAoY2FudmFzSW5SZW5kZXJpbmcuaGFzKHRoaXMuX2NhbnZhcykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCB1c2UgdGhlIHNhbWUgY2FudmFzIGR1cmluZyBtdWx0aXBsZSByZW5kZXIoKSBvcGVyYXRpb25zLiBcIiArXG4gICAgICAgICAgICAgIFwiVXNlIGRpZmZlcmVudCBjYW52YXMgb3IgZW5zdXJlIHByZXZpb3VzIG9wZXJhdGlvbnMgd2VyZSBcIiArXG4gICAgICAgICAgICAgIFwiY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FudmFzSW5SZW5kZXJpbmcuYWRkKHRoaXMuX2NhbnZhcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fcGRmQnVnICYmXG4gICAgICAgIGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIgJiZcbiAgICAgICAgZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5lbmFibGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zdGVwcGVyID0gZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5jcmVhdGUodGhpcy5fcGFnZUluZGV4KTtcbiAgICAgICAgdGhpcy5zdGVwcGVyLmluaXQodGhpcy5vcGVyYXRvckxpc3QpO1xuICAgICAgICB0aGlzLnN0ZXBwZXIubmV4dEJyZWFrUG9pbnQgPSB0aGlzLnN0ZXBwZXIuZ2V0TmV4dEJyZWFrUG9pbnQoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2FudmFzQ29udGV4dCxcbiAgICAgICAgdmlld3BvcnQsXG4gICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgaW1hZ2VMYXllcixcbiAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgIH0gPSB0aGlzLnBhcmFtcztcblxuICAgICAgdGhpcy5nZnggPSBuZXcgQ2FudmFzR3JhcGhpY3MoXG4gICAgICAgIGNhbnZhc0NvbnRleHQsXG4gICAgICAgIHRoaXMuY29tbW9uT2JqcyxcbiAgICAgICAgdGhpcy5vYmpzLFxuICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnksXG4gICAgICAgIHRoaXMud2ViR0xDb250ZXh0LFxuICAgICAgICBpbWFnZUxheWVyLFxuICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWdcbiAgICAgICk7XG4gICAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe1xuICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgIHZpZXdwb3J0LFxuICAgICAgICB0cmFuc3BhcmVuY3ksXG4gICAgICAgIGJhY2tncm91bmQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gMDtcbiAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9IHRydWU7XG4gICAgICBpZiAodGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYW5jZWwoZXJyb3IgPSBudWxsKSB7XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmdmeCkge1xuICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY2FudmFzKSB7XG4gICAgICAgIGNhbnZhc0luUmVuZGVyaW5nLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxsYmFjayhcbiAgICAgICAgZXJyb3IgfHxcbiAgICAgICAgICBuZXcgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKFxuICAgICAgICAgICAgYFJlbmRlcmluZyBjYW5jZWxsZWQsIHBhZ2UgJHt0aGlzLl9wYWdlSW5kZXggKyAxfWAsXG4gICAgICAgICAgICBcImNhbnZhc1wiXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgICAgaWYgKCF0aGlzLmdyYXBoaWNzUmVhZHkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaykge1xuICAgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gdGhpcy5fY29udGludWVCb3VuZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0ZXBwZXIpIHtcbiAgICAgICAgdGhpcy5zdGVwcGVyLnVwZGF0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29udGludWUoKTtcbiAgICB9XG5cbiAgICBfY29udGludWUoKSB7XG4gICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRhc2sub25Db250aW51ZSkge1xuICAgICAgICB0aGlzLnRhc2sub25Db250aW51ZSh0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zY2hlZHVsZU5leHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfc2NoZWR1bGVOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9uZXh0Qm91bmQoKS5jYXRjaCh0aGlzLmNhbmNlbC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZCkuY2F0Y2godGhpcy5jYW5jZWwuYmluZCh0aGlzKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgX25leHQoKSB7XG4gICAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSB0aGlzLmdmeC5leGVjdXRlT3BlcmF0b3JMaXN0KFxuICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdCxcbiAgICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHgsXG4gICAgICAgIHRoaXMuX2NvbnRpbnVlQm91bmQsXG4gICAgICAgIHRoaXMuc3RlcHBlclxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdElkeCA9PT0gdGhpcy5vcGVyYXRvckxpc3QuYXJnc0FycmF5Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuICAgICAgICAgIHRoaXMuZ2Z4LmVuZERyYXdpbmcoKTtcbiAgICAgICAgICBpZiAodGhpcy5fY2FudmFzKSB7XG4gICAgICAgICAgICBjYW52YXNJblJlbmRlcmluZy5kZWxldGUodGhpcy5fY2FudmFzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBJbnRlcm5hbFJlbmRlclRhc2s7XG59KSgpO1xuXG4vKiogQHR5cGUge3N0cmluZ30gKi9cbmNvbnN0IHZlcnNpb24gPVxuICB0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgPyBQREZKU0Rldi5ldmFsKFwiQlVORExFX1ZFUlNJT05cIikgOiBudWxsO1xuLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5jb25zdCBidWlsZCA9XG4gIHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiA/IFBERkpTRGV2LmV2YWwoXCJCVU5ETEVfQlVJTERcIikgOiBudWxsO1xuXG5leHBvcnQge1xuICBnZXREb2N1bWVudCxcbiAgTG9vcGJhY2tQb3J0LFxuICBQREZEYXRhUmFuZ2VUcmFuc3BvcnQsXG4gIFBERldvcmtlcixcbiAgUERGRG9jdW1lbnRQcm94eSxcbiAgUERGUGFnZVByb3h5LFxuICBzZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeSxcbiAgdmVyc2lvbixcbiAgYnVpbGQsXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIGFzc2VydCxcbiAgYnl0ZXNUb1N0cmluZyxcbiAgSXNFdmFsU3VwcG9ydGVkQ2FjaGVkLFxuICBzaGFkb3csXG4gIHN0cmluZzMyLFxuICB1bnJlYWNoYWJsZSxcbiAgVU5TVVBQT1JURURfRkVBVFVSRVMsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG5jbGFzcyBCYXNlRm9udExvYWRlciB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkb2NJZCxcbiAgICBvblVuc3VwcG9ydGVkRmVhdHVyZSxcbiAgICBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudCxcbiAgfSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRm9udExvYWRlcikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRm9udExvYWRlci5cIik7XG4gICAgfVxuICAgIHRoaXMuZG9jSWQgPSBkb2NJZDtcbiAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSA9IG9uVW5zdXBwb3J0ZWRGZWF0dXJlO1xuICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcblxuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzID0gW107XG4gICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBudWxsO1xuICB9XG5cbiAgYWRkTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpIHtcbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5wdXNoKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICB0aGlzLl9kb2N1bWVudC5mb250cy5hZGQobmF0aXZlRm9udEZhY2UpO1xuICB9XG5cbiAgaW5zZXJ0UnVsZShydWxlKSB7XG4gICAgbGV0IHN0eWxlRWxlbWVudCA9IHRoaXMuc3R5bGVFbGVtZW50O1xuICAgIGlmICghc3R5bGVFbGVtZW50KSB7XG4gICAgICBzdHlsZUVsZW1lbnQgPSB0aGlzLnN0eWxlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgIHN0eWxlRWxlbWVudC5pZCA9IGBQREZKU19GT05UX1NUWUxFX1RBR18ke3RoaXMuZG9jSWR9YDtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdXG4gICAgICAgIC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlU2hlZXQgPSBzdHlsZUVsZW1lbnQuc2hlZXQ7XG4gICAgc3R5bGVTaGVldC5pbnNlcnRSdWxlKHJ1bGUsIHN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmZvckVhY2gobmF0aXZlRm9udEZhY2UgPT4ge1xuICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICB9KTtcbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5sZW5ndGggPSAwO1xuXG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICAvLyBOb3RlOiBDaGlsZE5vZGUucmVtb3ZlIGRvZXNuJ3QgdGhyb3cgaWYgdGhlIHBhcmVudE5vZGUgaXMgdW5kZWZpbmVkLlxuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYmluZChmb250KSB7XG4gICAgLy8gQWRkIHRoZSBmb250IHRvIHRoZSBET00gb25seSBvbmNlOyBza2lwIGlmIHRoZSBmb250IGlzIGFscmVhZHkgbG9hZGVkLlxuICAgIGlmIChmb250LmF0dGFjaGVkIHx8IGZvbnQubWlzc2luZ0ZpbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9udC5hdHRhY2hlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICBjb25zdCBuYXRpdmVGb250RmFjZSA9IGZvbnQuY3JlYXRlTmF0aXZlRm9udEZhY2UoKTtcbiAgICAgIGlmIChuYXRpdmVGb250RmFjZSkge1xuICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBuYXRpdmVGb250RmFjZS5sb2FkZWQ7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUoe1xuICAgICAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRMb2FkTmF0aXZlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdhcm4oYEZhaWxlZCB0byBsb2FkIGZvbnQgJyR7bmF0aXZlRm9udEZhY2UuZmFtaWx5fSc6ICcke2V4fScuYCk7XG5cbiAgICAgICAgICAvLyBXaGVuIGZvbnQgbG9hZGluZyBmYWlsZWQsIGZhbGwgYmFjayB0byB0aGUgYnVpbHQtaW4gZm9udCByZW5kZXJlci5cbiAgICAgICAgICBmb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7XG4gICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjsgLy8gVGhlIGZvbnQgd2FzLCBhc3luY2hyb25vdXNseSwgbG9hZGVkLlxuICAgIH1cblxuICAgIC8vICF0aGlzLmlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWRcbiAgICBjb25zdCBydWxlID0gZm9udC5jcmVhdGVGb250RmFjZVJ1bGUoKTtcbiAgICBpZiAocnVsZSkge1xuICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuXG4gICAgICBpZiAodGhpcy5pc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCkge1xuICAgICAgICByZXR1cm47IC8vIFRoZSBmb250IHdhcywgc3luY2hyb25vdXNseSwgbG9hZGVkLlxuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9xdWV1ZUxvYWRpbmdDYWxsYmFjayhyZXNvbHZlKTtcbiAgICAgICAgdGhpcy5fcHJlcGFyZUZvbnRMb2FkRXZlbnQoW3J1bGVdLCBbZm9udF0sIHJlcXVlc3QpO1xuICAgICAgfSk7XG4gICAgICAvLyBUaGUgZm9udCB3YXMsIGFzeW5jaHJvbm91c2x5LCBsb2FkZWQuXG4gICAgfVxuICB9XG5cbiAgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYF9xdWV1ZUxvYWRpbmdDYWxsYmFja2AuXCIpO1xuICB9XG5cbiAgZ2V0IGlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQoKSB7XG4gICAgY29uc3Qgc3VwcG9ydGVkID1cbiAgICAgIHR5cGVvZiB0aGlzLl9kb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhIXRoaXMuX2RvY3VtZW50LmZvbnRzO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkXCIsIHN1cHBvcnRlZCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2V0dGVyLXJldHVyblxuICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYGlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkYC5cIik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2V0dGVyLXJldHVyblxuICBnZXQgX2xvYWRUZXN0Rm9udCgpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgX2xvYWRUZXN0Rm9udGAuXCIpO1xuICB9XG5cbiAgX3ByZXBhcmVGb250TG9hZEV2ZW50KHJ1bGVzLCBmb250c1RvTG9hZCwgcmVxdWVzdCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfcHJlcGFyZUZvbnRMb2FkRXZlbnRgLlwiKTtcbiAgfVxufVxuXG5sZXQgRm9udExvYWRlcjtcbmlmICh0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiYgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHtcbiAgRm9udExvYWRlciA9IGNsYXNzIE1vemNlbnRyYWxGb250TG9hZGVyIGV4dGVuZHMgQmFzZUZvbnRMb2FkZXIge1xuICAgIGdldCBpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCgpIHtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZFwiLCB0cnVlKTtcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBQREZKU0Rldi50ZXN0KCdDSFJPTUUgfHwgR0VORVJJQycpXG5cbiAgRm9udExvYWRlciA9IGNsYXNzIEdlbmVyaWNGb250TG9hZGVyIGV4dGVuZHMgQmFzZUZvbnRMb2FkZXIge1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgc3VwZXIocGFyYW1zKTtcbiAgICAgIHRoaXMubG9hZGluZ0NvbnRleHQgPSB7XG4gICAgICAgIHJlcXVlc3RzOiBbXSxcbiAgICAgICAgbmV4dFJlcXVlc3RJZDogMCxcbiAgICAgIH07XG4gICAgICB0aGlzLmxvYWRUZXN0Rm9udElkID0gMDtcbiAgICB9XG5cbiAgICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7XG4gICAgICBsZXQgc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8ICFQREZKU0Rldi50ZXN0KFwiQ0hST01FXCIpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgLy8gTm9kZS5qcyAtIHdlIGNhbiBwcmV0ZW5kIHRoYXQgc3luYyBmb250IGxvYWRpbmcgaXMgc3VwcG9ydGVkLlxuICAgICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlciBhZ2VudCBzdHJpbmcgc25pZmZpbmcgaXMgYmFkLCBidXQgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvXG4gICAgICAgICAgLy8gdGVsbCBpZiB0aGUgZm9udCBpcyBmdWxseSBsb2FkZWQgYW5kIHJlYWR5IHRvIGJlIHVzZWQgd2l0aCBjYW52YXMuXG4gICAgICAgICAgY29uc3QgbSA9IC9Nb3ppbGxhXFwvNS4wLio/cnY6KFxcZCspLio/IEdlY2tvLy5leGVjKFxuICAgICAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG0gJiYgbVsxXSA+PSAxNCkge1xuICAgICAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVE9ETyAtIG90aGVyIGJyb3dzZXJzLi4uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZFwiLCBzdXBwb3J0ZWQpO1xuICAgIH1cblxuICAgIF9xdWV1ZUxvYWRpbmdDYWxsYmFjayhjYWxsYmFjaykge1xuICAgICAgZnVuY3Rpb24gY29tcGxldGVSZXF1ZXN0KCkge1xuICAgICAgICBhc3NlcnQoIXJlcXVlc3QuZG9uZSwgXCJjb21wbGV0ZVJlcXVlc3QoKSBjYW5ub3QgYmUgY2FsbGVkIHR3aWNlLlwiKTtcbiAgICAgICAgcmVxdWVzdC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAvLyBTZW5kaW5nIGFsbCBjb21wbGV0ZWQgcmVxdWVzdHMgaW4gb3JkZXIgb2YgaG93IHRoZXkgd2VyZSBxdWV1ZWQuXG4gICAgICAgIHdoaWxlIChjb250ZXh0LnJlcXVlc3RzLmxlbmd0aCA+IDAgJiYgY29udGV4dC5yZXF1ZXN0c1swXS5kb25lKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXJSZXF1ZXN0ID0gY29udGV4dC5yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgICAgIHNldFRpbWVvdXQob3RoZXJSZXF1ZXN0LmNhbGxiYWNrLCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5sb2FkaW5nQ29udGV4dDtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgIGlkOiBgcGRmanMtZm9udC1sb2FkaW5nLSR7Y29udGV4dC5uZXh0UmVxdWVzdElkKyt9YCxcbiAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVJlcXVlc3QsXG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgfTtcbiAgICAgIGNvbnRleHQucmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cblxuICAgIGdldCBfbG9hZFRlc3RGb250KCkge1xuICAgICAgY29uc3QgZ2V0TG9hZFRlc3RGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgQ0ZGIGZvbnQgd2l0aCAxIGdseXBoIGZvciAnLicgdGhhdCBmaWxscyBpdHMgZW50aXJlIHdpZHRoXG4gICAgICAgIC8vIGFuZCBoZWlnaHQuXG4gICAgICAgIHJldHVybiBhdG9iKFxuICAgICAgICAgIFwiVDFSVVR3QUxBSUFBQXdBd1EwWkdJREh0Wmc0QUFBT1lBQUFBZ1VaR1ZFMWxrelp3QUFBRUhBQUFBQnhIUkVWR0FCUUFcIiArXG4gICAgICAgICAgICBcIkZRQUFCRGdBQUFBZVQxTXZNbFlOWXdrQUFBRWdBQUFBWUdOdFlYQUJEUUxVQUFBQ05BQUFBVUpvWldGay94VkZEUUFBXCIgK1xuICAgICAgICAgICAgXCJBTHdBQUFBMmFHaGxZUWRrQStvQUFBRDBBQUFBSkdodGRIZ0Q2QUFBQUFBRVdBQUFBQVp0WVhod0FBSlFBQUFBQVJnQVwiICtcbiAgICAgICAgICAgIFwiQUFBR2JtRnRaVmptZEg0QUFBR0FBQUFBc1hCdmMzVC9oZ0F6QUFBRGVBQUFBQ0FBQVFBQUFBRUFBTFpSRnNSZkR6ejFcIiArXG4gICAgICAgICAgICBcIkFBc0Q2QUFBQUFET0JPVExBQUFBQU00S0hEd0FBQUFBQStnRElRQUFBQWdBQWdBQUFBQUFBQUFCQUFBRElRQUFBRm9EXCIgK1xuICAgICAgICAgICAgXCI2QUFBQUFBRDZBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFVQUFBQWdBQUFBUUQ2QUgwQUFVQUFBS0tBcndBQUFDTVwiICtcbiAgICAgICAgICAgIFwiQW9vQ3ZBQUFBZUFBTVFFQ0FBQUNBQVlKQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFGQm1SV1FBd0FBdUFDNERcIiArXG4gICAgICAgICAgICBcIklQODRBRm9ESVFBQUFBQUFBUUFBQUFBQUFBQUFBQ0FBSUFBQkFBQUFEZ0N1QUFFQUFBQUFBQUFBQVFBQUFBRUFBQUFBXCIgK1xuICAgICAgICAgICAgXCJBQUVBQVFBQUFBRUFBQUFBQUFJQUFRQUFBQUVBQUFBQUFBTUFBUUFBQUFFQUFBQUFBQVFBQVFBQUFBRUFBQUFBQUFVQVwiICtcbiAgICAgICAgICAgIFwiQVFBQUFBRUFBQUFBQUFZQUFRQUFBQU1BQVFRSkFBQUFBZ0FCQUFNQUFRUUpBQUVBQWdBQkFBTUFBUVFKQUFJQUFnQUJcIiArXG4gICAgICAgICAgICBcIkFBTUFBUVFKQUFNQUFnQUJBQU1BQVFRSkFBUUFBZ0FCQUFNQUFRUUpBQVVBQWdBQkFBTUFBUVFKQUFZQUFnQUJXQUJZXCIgK1xuICAgICAgICAgICAgXCJBQUFBQUFBQUF3QUFBQU1BQUFBY0FBRUFBQUFBQUR3QUF3QUJBQUFBSEFBRUFDQUFBQUFFQUFRQUFRQUFBQzcvL3dBQVwiICtcbiAgICAgICAgICAgIFwiQUM3Ly8vL1RBQUVBQUFBQUFBQUJCZ0FBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArXG4gICAgICAgICAgICBcIkFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgK1xuICAgICAgICAgICAgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICtcbiAgICAgICAgICAgIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArXG4gICAgICAgICAgICBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgK1xuICAgICAgICAgICAgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQUFBQUFBQUQvZ3dBeUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQVwiICtcbiAgICAgICAgICAgIFwiQUFBQkFBUUVBQUVCQVFKWUFBRUJBU0g0RHdENEd3SEVBdmdjQS9nWEJJd01BWXVMK256NXRRWGtENWozQ0JMbkVRQUNcIiArXG4gICAgICAgICAgICBcIkFRRUJJVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWUFBQUJBUUFBRHdBQ0FRRUVFL3QzXCIgK1xuICAgICAgICAgICAgXCJEb3Y2ZkFINmZBVCtmUHA4K253SERvc01Ddm0xQ3ZtMURBejZmQlFBQUFBQUFBQUJBQUFBQU1tSmJ6RUFBQUFBemdUalwiICtcbiAgICAgICAgICAgIFwiRlFBQUFBRE9CT1FwQUFFQUFBQUFBQUFBREFBVUFBUUFBQUFCQUFBQUFnQUJBQUFBQUFBQUFBQUQ2QUFBQUFBQUFBPT1cIlxuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfbG9hZFRlc3RGb250XCIsIGdldExvYWRUZXN0Rm9udCgpKTtcbiAgICB9XG5cbiAgICBfcHJlcGFyZUZvbnRMb2FkRXZlbnQocnVsZXMsIGZvbnRzLCByZXF1ZXN0KSB7XG4gICAgICAvKiogSGFjayBiZWdpbiAqL1xuICAgICAgLy8gVGhlcmUncyBjdXJyZW50bHkgbm8gZXZlbnQgd2hlbiBhIGZvbnQgaGFzIGZpbmlzaGVkIGRvd25sb2FkaW5nIHNvIHRoZVxuICAgICAgLy8gZm9sbG93aW5nIGNvZGUgaXMgYSBkaXJ0eSBoYWNrIHRvICdndWVzcycgd2hlbiBhIGZvbnQgaXMgcmVhZHkuXG4gICAgICAvLyBJdCdzIGFzc3VtZWQgZm9udHMgYXJlIGxvYWRlZCBpbiBvcmRlciwgc28gYWRkIGEga25vd24gdGVzdCBmb250IGFmdGVyXG4gICAgICAvLyB0aGUgZGVzaXJlZCBmb250cyBhbmQgdGhlbiB0ZXN0IGZvciB0aGUgbG9hZGluZyBvZiB0aGF0IHRlc3QgZm9udC5cblxuICAgICAgZnVuY3Rpb24gaW50MzIoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKGRhdGEuY2hhckNvZGVBdChvZmZzZXQpIDw8IDI0KSB8XG4gICAgICAgICAgKGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAxKSA8PCAxNikgfFxuICAgICAgICAgIChkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMikgPDwgOCkgfFxuICAgICAgICAgIChkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMykgJiAweGZmKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gc3BsaWNlU3RyaW5nKHMsIG9mZnNldCwgcmVtb3ZlLCBpbnNlcnQpIHtcbiAgICAgICAgY29uc3QgY2h1bmsxID0gcy5zdWJzdHJpbmcoMCwgb2Zmc2V0KTtcbiAgICAgICAgY29uc3QgY2h1bmsyID0gcy5zdWJzdHJpbmcob2Zmc2V0ICsgcmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuIGNodW5rMSArIGluc2VydCArIGNodW5rMjtcbiAgICAgIH1cbiAgICAgIGxldCBpLCBpaTtcblxuICAgICAgLy8gVGhlIHRlbXBvcmFyeSBjYW52YXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgZm9udHMgYXJlIGxvYWRlZC5cbiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjYW52YXMud2lkdGggPSAxO1xuICAgICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXG4gICAgICBsZXQgY2FsbGVkID0gMDtcbiAgICAgIGZ1bmN0aW9uIGlzRm9udFJlYWR5KG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxlZCsrO1xuICAgICAgICAvLyBXaXRoIHNldFRpbWVvdXQgY2xhbXBpbmcgdGhpcyBnaXZlcyB0aGUgZm9udCB+MTAwbXMgdG8gbG9hZC5cbiAgICAgICAgaWYgKGNhbGxlZCA+IDMwKSB7XG4gICAgICAgICAgd2FybihcIkxvYWQgdGVzdCBmb250IG5ldmVyIGxvYWRlZC5cIik7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmZvbnQgPSBcIjMwcHggXCIgKyBuYW1lO1xuICAgICAgICBjdHguZmlsbFRleHQoXCIuXCIsIDAsIDIwKTtcbiAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcbiAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhWzNdID4gMCkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoaXNGb250UmVhZHkuYmluZChudWxsLCBuYW1lLCBjYWxsYmFjaykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2FkVGVzdEZvbnRJZCA9IGBsdCR7RGF0ZS5ub3coKX0ke3RoaXMubG9hZFRlc3RGb250SWQrK31gO1xuICAgICAgLy8gQ2hyb21pdW0gc2VlbXMgdG8gY2FjaGUgZm9udHMgYmFzZWQgb24gYSBoYXNoIG9mIHRoZSBhY3R1YWwgZm9udCBkYXRhLFxuICAgICAgLy8gc28gdGhlIGZvbnQgbXVzdCBiZSBtb2RpZmllZCBmb3IgZWFjaCBsb2FkIHRlc3QgZWxzZSBpdCB3aWxsIGFwcGVhciB0b1xuICAgICAgLy8gYmUgbG9hZGVkIGFscmVhZHkuXG4gICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIG1heWJlIGJlIG1hZGUgZmFzdGVyIGJ5IGF2b2lkaW5nIHRoZSBidG9hIG9mIHRoZSBmdWxsXG4gICAgICAvLyBmb250IGJ5IHNwbGl0dGluZyBpdCBpbiBjaHVua3MgYmVmb3JlIGhhbmQgYW5kIHBhZGRpbmcgdGhlIGZvbnQgaWQuXG4gICAgICBsZXQgZGF0YSA9IHRoaXMuX2xvYWRUZXN0Rm9udDtcbiAgICAgIGNvbnN0IENPTU1FTlRfT0ZGU0VUID0gOTc2OyAvLyBoYXMgdG8gYmUgb24gNCBieXRlIGJvdW5kYXJ5IChmb3IgY2hlY2tzdW0pXG4gICAgICBkYXRhID0gc3BsaWNlU3RyaW5nKFxuICAgICAgICBkYXRhLFxuICAgICAgICBDT01NRU5UX09GRlNFVCxcbiAgICAgICAgbG9hZFRlc3RGb250SWQubGVuZ3RoLFxuICAgICAgICBsb2FkVGVzdEZvbnRJZFxuICAgICAgKTtcbiAgICAgIC8vIENGRiBjaGVja3N1bSBpcyBpbXBvcnRhbnQgZm9yIElFLCBhZGp1c3RpbmcgaXRcbiAgICAgIGNvbnN0IENGRl9DSEVDS1NVTV9PRkZTRVQgPSAxNjtcbiAgICAgIGNvbnN0IFhYWFhfVkFMVUUgPSAweDU4NTg1ODU4OyAvLyB0aGUgXCJjb21tZW50XCIgZmlsbGVkIHdpdGggJ1gnXG4gICAgICBsZXQgY2hlY2tzdW0gPSBpbnQzMihkYXRhLCBDRkZfQ0hFQ0tTVU1fT0ZGU0VUKTtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gbG9hZFRlc3RGb250SWQubGVuZ3RoIC0gMzsgaSA8IGlpOyBpICs9IDQpIHtcbiAgICAgICAgY2hlY2tzdW0gPSAoY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQsIGkpKSB8IDA7XG4gICAgICB9XG4gICAgICBpZiAoaSA8IGxvYWRUZXN0Rm9udElkLmxlbmd0aCkge1xuICAgICAgICAvLyBhbGlnbiB0byA0IGJ5dGVzIGJvdW5kYXJ5XG4gICAgICAgIGNoZWNrc3VtID1cbiAgICAgICAgICAoY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQgKyBcIlhYWFwiLCBpKSkgfCAwO1xuICAgICAgfVxuICAgICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDRkZfQ0hFQ0tTVU1fT0ZGU0VULCA0LCBzdHJpbmczMihjaGVja3N1bSkpO1xuXG4gICAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDtcbiAgICAgIGNvbnN0IHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke2xvYWRUZXN0Rm9udElkfVwiO3NyYzoke3VybH19YDtcbiAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTtcblxuICAgICAgY29uc3QgbmFtZXMgPSBbXTtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gZm9udHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBuYW1lcy5wdXNoKGZvbnRzW2ldLmxvYWRlZE5hbWUpO1xuICAgICAgfVxuICAgICAgbmFtZXMucHVzaChsb2FkVGVzdEZvbnRJZCk7XG5cbiAgICAgIGNvbnN0IGRpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXYuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICBkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUuaGVpZ2h0ID0gXCIxMHB4XCI7XG4gICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICBkaXYuc3R5bGUudG9wID0gZGl2LnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuXG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IG5hbWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gXCJIaVwiO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRGYW1pbHkgPSBuYW1lc1tpXTtcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgfVxuICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICBpc0ZvbnRSZWFkeShsb2FkVGVzdEZvbnRJZCwgKCkgPT4ge1xuICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7XG4gICAgICAgIHJlcXVlc3QuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgICAgLyoqIEhhY2sgZW5kICovXG4gICAgfVxuICB9O1xufSAvLyBFbmQgb2YgUERGSlNEZXYudGVzdCgnQ0hST01FIHx8IEdFTkVSSUMnKVxuXG5jbGFzcyBGb250RmFjZU9iamVjdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHRyYW5zbGF0ZWREYXRhLFxuICAgIHtcbiAgICAgIGlzRXZhbFN1cHBvcnRlZCA9IHRydWUsXG4gICAgICBkaXNhYmxlRm9udEZhY2UgPSBmYWxzZSxcbiAgICAgIGlnbm9yZUVycm9ycyA9IGZhbHNlLFxuICAgICAgb25VbnN1cHBvcnRlZEZlYXR1cmUgPSBudWxsLFxuICAgICAgZm9udFJlZ2lzdHJ5ID0gbnVsbCxcbiAgICB9XG4gICkge1xuICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIC8vIGltcG9ydGluZyB0cmFuc2xhdGVkIGRhdGFcbiAgICBmb3IgKGNvbnN0IGkgaW4gdHJhbnNsYXRlZERhdGEpIHtcbiAgICAgIHRoaXNbaV0gPSB0cmFuc2xhdGVkRGF0YVtpXTtcbiAgICB9XG4gICAgdGhpcy5pc0V2YWxTdXBwb3J0ZWQgPSBpc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlO1xuICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gZGlzYWJsZUZvbnRGYWNlID09PSB0cnVlO1xuICAgIHRoaXMuaWdub3JlRXJyb3JzID0gaWdub3JlRXJyb3JzID09PSB0cnVlO1xuICAgIHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlID0gb25VbnN1cHBvcnRlZEZlYXR1cmU7XG4gICAgdGhpcy5mb250UmVnaXN0cnkgPSBmb250UmVnaXN0cnk7XG4gIH1cblxuICBjcmVhdGVOYXRpdmVGb250RmFjZSgpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG5hdGl2ZUZvbnRGYWNlID0gbmV3IEZvbnRGYWNlKHRoaXMubG9hZGVkTmFtZSwgdGhpcy5kYXRhLCB7fSk7XG5cbiAgICBpZiAodGhpcy5mb250UmVnaXN0cnkpIHtcbiAgICAgIHRoaXMuZm9udFJlZ2lzdHJ5LnJlZ2lzdGVyRm9udCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hdGl2ZUZvbnRGYWNlO1xuICB9XG5cbiAgY3JlYXRlRm9udEZhY2VSdWxlKCkge1xuICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGJ5dGVzVG9TdHJpbmcobmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhKSk7XG4gICAgLy8gQWRkIHRoZSBAZm9udC1mYWNlIHJ1bGUgdG8gdGhlIGRvY3VtZW50LlxuICAgIGNvbnN0IHVybCA9IGB1cmwoZGF0YToke3RoaXMubWltZXR5cGV9O2Jhc2U2NCwke2J0b2EoZGF0YSl9KTtgO1xuICAgIGNvbnN0IHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke3RoaXMubG9hZGVkTmFtZX1cIjtzcmM6JHt1cmx9fWA7XG5cbiAgICBpZiAodGhpcy5mb250UmVnaXN0cnkpIHtcbiAgICAgIHRoaXMuZm9udFJlZ2lzdHJ5LnJlZ2lzdGVyRm9udCh0aGlzLCB1cmwpO1xuICAgIH1cbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuXG4gIGdldFBhdGhHZW5lcmF0b3Iob2JqcywgY2hhcmFjdGVyKSB7XG4gICAgaWYgKHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdO1xuICAgIH1cblxuICAgIGxldCBjbWRzLCBjdXJyZW50O1xuICAgIHRyeSB7XG4gICAgICBjbWRzID0gb2Jqcy5nZXQodGhpcy5sb2FkZWROYW1lICsgXCJfcGF0aF9cIiArIGNoYXJhY3Rlcik7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmICghdGhpcy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUpIHtcbiAgICAgICAgdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUoe1xuICAgICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250R2V0UGF0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB3YXJuKGBnZXRQYXRoR2VuZXJhdG9yIC0gaWdub3JpbmcgY2hhcmFjdGVyOiBcIiR7ZXh9XCIuYCk7XG5cbiAgICAgIHJldHVybiAodGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gZnVuY3Rpb24gKGMsIHNpemUpIHtcbiAgICAgICAgLy8gTm8tb3AgZnVuY3Rpb24sIHRvIGFsbG93IHJlbmRlcmluZyB0byBjb250aW51ZS5cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGNhbiwgY29tcGlsZSBjbWRzIGludG8gSlMgZm9yIE1BWElNVU0gU1BFRUQuLi5cbiAgICBpZiAodGhpcy5pc0V2YWxTdXBwb3J0ZWQgJiYgSXNFdmFsU3VwcG9ydGVkQ2FjaGVkLnZhbHVlKSB7XG4gICAgICBsZXQgYXJncyxcbiAgICAgICAganMgPSBcIlwiO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY21kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGN1cnJlbnQgPSBjbWRzW2ldO1xuXG4gICAgICAgIGlmIChjdXJyZW50LmFyZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFyZ3MgPSBjdXJyZW50LmFyZ3Muam9pbihcIixcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXJncyA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAganMgKz0gXCJjLlwiICsgY3VycmVudC5jbWQgKyBcIihcIiArIGFyZ3MgKyBcIik7XFxuXCI7XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIHJldHVybiAodGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gbmV3IEZ1bmN0aW9uKFwiY1wiLCBcInNpemVcIiwganMpKTtcbiAgICB9XG4gICAgLy8gLi4uIGJ1dCBmYWxsIGJhY2sgb24gdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KCkgaWYgd2UncmVcbiAgICAvLyBibG9ja2VkIGZyb20gdXNpbmcgZXZhbCgpIGZvciB3aGF0ZXZlciByZWFzb24gKGxpa2UgQ1NQIHBvbGljaWVzKS5cbiAgICByZXR1cm4gKHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSA9IGZ1bmN0aW9uIChjLCBzaXplKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjbWRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY3VycmVudCA9IGNtZHNbaV07XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuY21kID09PSBcInNjYWxlXCIpIHtcbiAgICAgICAgICBjdXJyZW50LmFyZ3MgPSBbc2l6ZSwgLXNpemVdO1xuICAgICAgICB9XG4gICAgICAgIGNbY3VycmVudC5jbWRdLmFwcGx5KGMsIGN1cnJlbnQuYXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9udEZhY2VPYmplY3QsIEZvbnRMb2FkZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFscyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgQmFzZUNhbnZhc0ZhY3RvcnksIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB9IGZyb20gXCIuL2Rpc3BsYXlfdXRpbHMuanNcIjtcbmltcG9ydCB7IGlzTm9kZUpTIH0gZnJvbSBcIi4uL3NoYXJlZC9pc19ub2RlLmpzXCI7XG5pbXBvcnQgeyB1bnJlYWNoYWJsZSB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG5sZXQgTm9kZUNhbnZhc0ZhY3RvcnkgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHVucmVhY2hhYmxlKFwiTm90IGltcGxlbWVudGVkOiBOb2RlQ2FudmFzRmFjdG9yeVwiKTtcbiAgfVxufTtcblxubGV0IE5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdW5yZWFjaGFibGUoXCJOb3QgaW1wbGVtZW50ZWQ6IE5vZGVDTWFwUmVhZGVyRmFjdG9yeVwiKTtcbiAgfVxufTtcblxuaWYgKCh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpICYmIGlzTm9kZUpTKSB7XG4gIE5vZGVDYW52YXNGYWN0b3J5ID0gY2xhc3MgZXh0ZW5kcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gICAgY3JlYXRlKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBDYW52YXMgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhcImNhbnZhc1wiKTtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IENhbnZhcy5jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW52YXMsXG4gICAgICAgIGNvbnRleHQ6IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiksXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICBOb2RlQ01hcFJlYWRlckZhY3RvcnkgPSBjbGFzcyBleHRlbmRzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gICAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZnMgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhcImZzXCIpO1xuICAgICAgICBmcy5yZWFkRmlsZSh1cmwsIChlcnJvciwgZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvciB8fCAhZGF0YSkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvcikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKHsgY01hcERhdGE6IG5ldyBVaW50OEFycmF5KGRhdGEpLCBjb21wcmVzc2lvblR5cGUgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgeyBOb2RlQ2FudmFzRmFjdG9yeSwgTm9kZUNNYXBSZWFkZXJGYWN0b3J5IH07XG4iLCIvKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBLZXkvdmFsdWUgc3RvcmFnZSBmb3IgYW5ub3RhdGlvbiBkYXRhIGluIGZvcm1zLlxuICovXG5jbGFzcyBBbm5vdGF0aW9uU3RvcmFnZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fbW9kaWZpZWQgPSBmYWxzZTtcblxuICAgIC8vIENhbGxiYWNrcyB0byBzaWduYWwgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIHN0YXRlIGlzIHNldCBvciByZXNldC5cbiAgICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHZpZXdlciB0byBvbmx5IGJpbmQgb24gYGJlZm9yZXVubG9hZGAgaWYgZm9ybXNcbiAgICAvLyBhcmUgYWN0dWFsbHkgZWRpdGVkIHRvIHByZXZlbnQgZG9pbmcgc28gdW5jb25kaXRpb25hbGx5IHNpbmNlIHRoYXRcbiAgICAvLyBjYW4gaGF2ZSB1bmRlc2lyYWJsZSBlZmZmZWN0cy5cbiAgICB0aGlzLm9uU2V0TW9kaWZpZWQgPSBudWxsO1xuICAgIHRoaXMub25SZXNldE1vZGlmaWVkID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGtleSBpZiBpdCBleGlzdHNcbiAgICogb3Igc3RvcmUgYW5kIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uU3RvcmFnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0VmFsdWVcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGdldE9yQ3JlYXRlVmFsdWUoa2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgICBpZiAodGhpcy5fc3RvcmFnZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcmFnZS5zZXQoa2V5LCBkZWZhdWx0VmFsdWUpO1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXlcbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvblN0b3JhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAgICovXG4gIHNldFZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodGhpcy5fc3RvcmFnZS5nZXQoa2V5KSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3NldE1vZGlmaWVkKCk7XG4gICAgfVxuICAgIHRoaXMuX3N0b3JhZ2Uuc2V0KGtleSwgdmFsdWUpO1xuICB9XG5cbiAgZ2V0QWxsKCkge1xuICAgIGlmICh0aGlzLl9zdG9yYWdlLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX3N0b3JhZ2UpO1xuICB9XG5cbiAgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2Uuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NldE1vZGlmaWVkKCkge1xuICAgIGlmICghdGhpcy5fbW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuX21vZGlmaWVkID0gdHJ1ZTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vblNldE1vZGlmaWVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhpcy5vblNldE1vZGlmaWVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVzZXRNb2RpZmllZCgpIHtcbiAgICBpZiAodGhpcy5fbW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuX21vZGlmaWVkID0gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIHRoaXMub25SZXNldE1vZGlmaWVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhpcy5vblJlc2V0TW9kaWZpZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgQW5ub3RhdGlvblN0b3JhZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE4IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBpc05vZGVKUyB9IGZyb20gXCIuLi9zaGFyZWQvaXNfbm9kZS5qc1wiO1xuXG5jb25zdCBjb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpIHtcbiAgLy8gU3VwcG9ydDogTm9kZS5qc1xuICAoZnVuY3Rpb24gY2hlY2tGb250RmFjZSgpIHtcbiAgICAvLyBOb2RlLmpzIGlzIG1pc3NpbmcgbmF0aXZlIHN1cHBvcnQgZm9yIGBAZm9udC1mYWNlYC5cbiAgICBpZiAoaXNOb2RlSlMpIHtcbiAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTtcbiAgICB9XG4gIH0pKCk7XG59XG5jb25zdCBhcGlDb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmZyZWV6ZShjb21wYXRpYmlsaXR5UGFyYW1zKTtcblxuZXhwb3J0IHsgYXBpQ29tcGF0aWJpbGl0eVBhcmFtcyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEZPTlRfSURFTlRJVFlfTUFUUklYLFxuICBJREVOVElUWV9NQVRSSVgsXG4gIEltYWdlS2luZCxcbiAgaW5mbyxcbiAgSXNMaXR0bGVFbmRpYW5DYWNoZWQsXG4gIGlzTnVtLFxuICBPUFMsXG4gIHNoYWRvdyxcbiAgVGV4dFJlbmRlcmluZ01vZGUsXG4gIHVucmVhY2hhYmxlLFxuICBVdGlsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IGdldFNoYWRpbmdQYXR0ZXJuRnJvbUlSLCBUaWxpbmdQYXR0ZXJuIH0gZnJvbSBcIi4vcGF0dGVybl9oZWxwZXIuanNcIjtcblxuLy8gPGNhbnZhcz4gY29udGV4dHMgc3RvcmUgbW9zdCBvZiB0aGUgc3RhdGUgd2UgbmVlZCBuYXRpdmVseS5cbi8vIEhvd2V2ZXIsIFBERiBuZWVkcyBhIGJpdCBtb3JlIHN0YXRlLCB3aGljaCB3ZSBzdG9yZSBoZXJlLlxuXG4vLyBNaW5pbWFsIGZvbnQgc2l6ZSB0aGF0IHdvdWxkIGJlIHVzZWQgZHVyaW5nIGNhbnZhcyBmaWxsVGV4dCBvcGVyYXRpb25zLlxudmFyIE1JTl9GT05UX1NJWkUgPSAxNjtcbi8vIE1heGltdW0gZm9udCBzaXplIHRoYXQgd291bGQgYmUgdXNlZCBkdXJpbmcgY2FudmFzIGZpbGxUZXh0IG9wZXJhdGlvbnMuXG52YXIgTUFYX0ZPTlRfU0laRSA9IDEwMDtcbnZhciBNQVhfR1JPVVBfU0laRSA9IDQwOTY7XG5cbi8vIEhldXJpc3RpYyB2YWx1ZSB1c2VkIHdoZW4gZW5mb3JjaW5nIG1pbmltdW0gbGluZSB3aWR0aHMuXG52YXIgTUlOX1dJRFRIX0ZBQ1RPUiA9IDAuNjU7XG5cbnZhciBDT01QSUxFX1RZUEUzX0dMWVBIUyA9IHRydWU7XG52YXIgTUFYX1NJWkVfVE9fQ09NUElMRSA9IDEwMDA7XG5cbnZhciBGVUxMX0NIVU5LX0hFSUdIVCA9IDE2O1xuXG5mdW5jdGlvbiBhZGRDb250ZXh0Q3VycmVudFRyYW5zZm9ybShjdHgpIHtcbiAgLy8gSWYgdGhlIGNvbnRleHQgZG9lc24ndCBleHBvc2UgYSBgbW96Q3VycmVudFRyYW5zZm9ybWAsIGFkZCBhIEpTIGJhc2VkIG9uZS5cbiAgaWYgKCFjdHgubW96Q3VycmVudFRyYW5zZm9ybSkge1xuICAgIGN0eC5fb3JpZ2luYWxTYXZlID0gY3R4LnNhdmU7XG4gICAgY3R4Ll9vcmlnaW5hbFJlc3RvcmUgPSBjdHgucmVzdG9yZTtcbiAgICBjdHguX29yaWdpbmFsUm90YXRlID0gY3R4LnJvdGF0ZTtcbiAgICBjdHguX29yaWdpbmFsU2NhbGUgPSBjdHguc2NhbGU7XG4gICAgY3R4Ll9vcmlnaW5hbFRyYW5zbGF0ZSA9IGN0eC50cmFuc2xhdGU7XG4gICAgY3R4Ll9vcmlnaW5hbFRyYW5zZm9ybSA9IGN0eC50cmFuc2Zvcm07XG4gICAgY3R4Ll9vcmlnaW5hbFNldFRyYW5zZm9ybSA9IGN0eC5zZXRUcmFuc2Zvcm07XG5cbiAgICBjdHguX3RyYW5zZm9ybU1hdHJpeCA9IGN0eC5fdHJhbnNmb3JtTWF0cml4IHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICBjdHguX3RyYW5zZm9ybVN0YWNrID0gW107XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBcIm1vekN1cnJlbnRUcmFuc2Zvcm1cIiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtTWF0cml4O1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIFwibW96Q3VycmVudFRyYW5zZm9ybUludmVyc2VcIiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSgpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRpb24gZG9uZSB1c2luZyBXb2xmcmFtQWxwaGE6XG4gICAgICAgIC8vIGh0dHA6Ly93d3cud29sZnJhbWFscGhhLmNvbS9pbnB1dC8/XG4gICAgICAgIC8vICAgaT1JbnZlcnNlK3t7YSUyQytjJTJDK2V9JTJDK3tiJTJDK2QlMkMrZn0lMkMrezAlMkMrMCUyQysxfX1cblxuICAgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDtcbiAgICAgICAgdmFyIGEgPSBtWzBdLFxuICAgICAgICAgIGIgPSBtWzFdLFxuICAgICAgICAgIGMgPSBtWzJdLFxuICAgICAgICAgIGQgPSBtWzNdLFxuICAgICAgICAgIGUgPSBtWzRdLFxuICAgICAgICAgIGYgPSBtWzVdO1xuXG4gICAgICAgIHZhciBhZF9iYyA9IGEgKiBkIC0gYiAqIGM7XG4gICAgICAgIHZhciBiY19hZCA9IGIgKiBjIC0gYSAqIGQ7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBkIC8gYWRfYmMsXG4gICAgICAgICAgYiAvIGJjX2FkLFxuICAgICAgICAgIGMgLyBiY19hZCxcbiAgICAgICAgICBhIC8gYWRfYmMsXG4gICAgICAgICAgKGQgKiBlIC0gYyAqIGYpIC8gYmNfYWQsXG4gICAgICAgICAgKGIgKiBlIC0gYSAqIGYpIC8gYWRfYmMsXG4gICAgICAgIF07XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY3R4LnNhdmUgPSBmdW5jdGlvbiBjdHhTYXZlKCkge1xuICAgICAgdmFyIG9sZCA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YWNrLnB1c2gob2xkKTtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IG9sZC5zbGljZSgwLCA2KTtcblxuICAgICAgdGhpcy5fb3JpZ2luYWxTYXZlKCk7XG4gICAgfTtcblxuICAgIGN0eC5yZXN0b3JlID0gZnVuY3Rpb24gY3R4UmVzdG9yZSgpIHtcbiAgICAgIHZhciBwcmV2ID0gdGhpcy5fdHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm1NYXRyaXggPSBwcmV2O1xuICAgICAgICB0aGlzLl9vcmlnaW5hbFJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY3R4LnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIGN0eFRyYW5zbGF0ZSh4LCB5KSB7XG4gICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDtcbiAgICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICAgIG1bNV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcblxuICAgICAgdGhpcy5fb3JpZ2luYWxUcmFuc2xhdGUoeCwgeSk7XG4gICAgfTtcblxuICAgIGN0eC5zY2FsZSA9IGZ1bmN0aW9uIGN0eFNjYWxlKHgsIHkpIHtcbiAgICAgIHZhciBtID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4O1xuICAgICAgbVswXSA9IG1bMF0gKiB4O1xuICAgICAgbVsxXSA9IG1bMV0gKiB4O1xuICAgICAgbVsyXSA9IG1bMl0gKiB5O1xuICAgICAgbVszXSA9IG1bM10gKiB5O1xuXG4gICAgICB0aGlzLl9vcmlnaW5hbFNjYWxlKHgsIHkpO1xuICAgIH07XG5cbiAgICBjdHgudHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIHZhciBtID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4O1xuICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gW1xuICAgICAgICBtWzBdICogYSArIG1bMl0gKiBiLFxuICAgICAgICBtWzFdICogYSArIG1bM10gKiBiLFxuICAgICAgICBtWzBdICogYyArIG1bMl0gKiBkLFxuICAgICAgICBtWzFdICogYyArIG1bM10gKiBkLFxuICAgICAgICBtWzBdICogZSArIG1bMl0gKiBmICsgbVs0XSxcbiAgICAgICAgbVsxXSAqIGUgKyBtWzNdICogZiArIG1bNV0sXG4gICAgICBdO1xuXG4gICAgICBjdHguX29yaWdpbmFsVHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIH07XG5cbiAgICBjdHguc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4U2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IFthLCBiLCBjLCBkLCBlLCBmXTtcblxuICAgICAgY3R4Ll9vcmlnaW5hbFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgICB9O1xuXG4gICAgY3R4LnJvdGF0ZSA9IGZ1bmN0aW9uIGN0eFJvdGF0ZShhbmdsZSkge1xuICAgICAgdmFyIGNvc1ZhbHVlID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgdmFyIHNpblZhbHVlID0gTWF0aC5zaW4oYW5nbGUpO1xuXG4gICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IFtcbiAgICAgICAgbVswXSAqIGNvc1ZhbHVlICsgbVsyXSAqIHNpblZhbHVlLFxuICAgICAgICBtWzFdICogY29zVmFsdWUgKyBtWzNdICogc2luVmFsdWUsXG4gICAgICAgIG1bMF0gKiAtc2luVmFsdWUgKyBtWzJdICogY29zVmFsdWUsXG4gICAgICAgIG1bMV0gKiAtc2luVmFsdWUgKyBtWzNdICogY29zVmFsdWUsXG4gICAgICAgIG1bNF0sXG4gICAgICAgIG1bNV0sXG4gICAgICBdO1xuXG4gICAgICB0aGlzLl9vcmlnaW5hbFJvdGF0ZShhbmdsZSk7XG4gICAgfTtcbiAgfVxufVxuXG52YXIgQ2FjaGVkQ2FudmFzZXMgPSAoZnVuY3Rpb24gQ2FjaGVkQ2FudmFzZXNDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIENhY2hlZENhbnZhc2VzKGNhbnZhc0ZhY3RvcnkpIHtcbiAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5O1xuICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIENhY2hlZENhbnZhc2VzLnByb3RvdHlwZSA9IHtcbiAgICBnZXRDYW52YXM6IGZ1bmN0aW9uIENhY2hlZENhbnZhc2VzX2dldENhbnZhcyhcbiAgICAgIGlkLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0cmFja1RyYW5zZm9ybVxuICAgICkge1xuICAgICAgdmFyIGNhbnZhc0VudHJ5O1xuICAgICAgaWYgKHRoaXMuY2FjaGVbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2FudmFzRW50cnkgPSB0aGlzLmNhY2hlW2lkXTtcbiAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5LnJlc2V0KGNhbnZhc0VudHJ5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgLy8gcmVzZXQgY2FudmFzIHRyYW5zZm9ybSBmb3IgZW11bGF0ZWQgbW96Q3VycmVudFRyYW5zZm9ybSwgaWYgbmVlZGVkXG4gICAgICAgIGNhbnZhc0VudHJ5LmNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzRW50cnkgPSB0aGlzLmNhbnZhc0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmNhY2hlW2lkXSA9IGNhbnZhc0VudHJ5O1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrVHJhbnNmb3JtKSB7XG4gICAgICAgIGFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGNhbnZhc0VudHJ5LmNvbnRleHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhbnZhc0VudHJ5O1xuICAgIH0sXG4gICAgY2xlYXIoKSB7XG4gICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICAgIHZhciBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdO1xuICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkuZGVzdHJveShjYW52YXNFbnRyeSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gQ2FjaGVkQ2FudmFzZXM7XG59KSgpO1xuXG5mdW5jdGlvbiBjb21waWxlVHlwZTNHbHlwaChpbWdEYXRhKSB7XG4gIHZhciBQT0lOVF9UT19QUk9DRVNTX0xJTUlUID0gMTAwMDtcblxuICB2YXIgd2lkdGggPSBpbWdEYXRhLndpZHRoLFxuICAgIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICB2YXIgaSxcbiAgICBqLFxuICAgIGowLFxuICAgIHdpZHRoMSA9IHdpZHRoICsgMTtcbiAgdmFyIHBvaW50cyA9IG5ldyBVaW50OEFycmF5KHdpZHRoMSAqIChoZWlnaHQgKyAxKSk7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgUE9JTlRfVFlQRVMgPVxuICAgICAgbmV3IFVpbnQ4QXJyYXkoWzAsIDIsIDQsIDAsIDEsIDAsIDUsIDQsIDgsIDEwLCAwLCA4LCAwLCAyLCAxLCAwXSk7XG5cbiAgLy8gZGVjb2RlcyBiaXQtcGFja2VkIG1hc2sgZGF0YVxuICB2YXIgbGluZVNpemUgPSAod2lkdGggKyA3KSAmIH43LFxuICAgIGRhdGEwID0gaW1nRGF0YS5kYXRhO1xuICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGxpbmVTaXplICogaGVpZ2h0KSxcbiAgICBwb3MgPSAwLFxuICAgIGlpO1xuICBmb3IgKGkgPSAwLCBpaSA9IGRhdGEwLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICB2YXIgbWFzayA9IDEyOCxcbiAgICAgIGVsZW0gPSBkYXRhMFtpXTtcbiAgICB3aGlsZSAobWFzayA+IDApIHtcbiAgICAgIGRhdGFbcG9zKytdID0gZWxlbSAmIG1hc2sgPyAwIDogMjU1O1xuICAgICAgbWFzayA+Pj0gMTtcbiAgICB9XG4gIH1cblxuICAvLyBmaW5kaW5nIGludGVyZXN0aW5nIHBvaW50czogZXZlcnkgcG9pbnQgaXMgbG9jYXRlZCBiZXR3ZWVuIG1hc2sgcGl4ZWxzLFxuICAvLyBzbyB0aGVyZSB3aWxsIGJlIHBvaW50cyBvZiB0aGUgKHdpZHRoICsgMSl4KGhlaWdodCArIDEpIGdyaWQuIEV2ZXJ5IHBvaW50XG4gIC8vIHdpbGwgaGF2ZSBmbGFncyBhc3NpZ25lZCBiYXNlZCBvbiBuZWlnaGJvcmluZyBtYXNrIHBpeGVsczpcbiAgLy8gICA0IHwgOFxuICAvLyAgIC0tUC0tXG4gIC8vICAgMiB8IDFcbiAgLy8gV2UgYXJlIGludGVyZXN0ZWQgb25seSBpbiBwb2ludHMgd2l0aCB0aGUgZmxhZ3M6XG4gIC8vICAgLSBvdXRzaWRlIGNvcm5lcnM6IDEsIDIsIDQsIDg7XG4gIC8vICAgLSBpbnNpZGUgY29ybmVyczogNywgMTEsIDEzLCAxNDtcbiAgLy8gICAtIGFuZCwgaW50ZXJzZWN0aW9uczogNSwgMTAuXG4gIHZhciBjb3VudCA9IDA7XG4gIHBvcyA9IDA7XG4gIGlmIChkYXRhW3Bvc10gIT09IDApIHtcbiAgICBwb2ludHNbMF0gPSAxO1xuICAgICsrY291bnQ7XG4gIH1cbiAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICBpZiAoZGF0YVtwb3NdICE9PSBkYXRhW3BvcyArIDFdKSB7XG4gICAgICBwb2ludHNbal0gPSBkYXRhW3Bvc10gPyAyIDogMTtcbiAgICAgICsrY291bnQ7XG4gICAgfVxuICAgIHBvcysrO1xuICB9XG4gIGlmIChkYXRhW3Bvc10gIT09IDApIHtcbiAgICBwb2ludHNbal0gPSAyO1xuICAgICsrY291bnQ7XG4gIH1cbiAgZm9yIChpID0gMTsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgcG9zID0gaSAqIGxpbmVTaXplO1xuICAgIGowID0gaSAqIHdpZHRoMTtcbiAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkge1xuICAgICAgcG9pbnRzW2owXSA9IGRhdGFbcG9zXSA/IDEgOiA4O1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgLy8gJ3N1bScgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHBpeGVsIGNvbmZpZ3VyYXRpb24gaW4gdGhlICdUWVBFUydcbiAgICAvLyBhcnJheSAoaW4gb3JkZXIgOC0xLTItNCwgc28gd2UgY2FuIHVzZSAnPj4yJyB0byBzaGlmdCB0aGUgY29sdW1uKS5cbiAgICB2YXIgc3VtID0gKGRhdGFbcG9zXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplXSA/IDggOiAwKTtcbiAgICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgc3VtID1cbiAgICAgICAgKHN1bSA+PiAyKSArXG4gICAgICAgIChkYXRhW3BvcyArIDFdID8gNCA6IDApICtcbiAgICAgICAgKGRhdGFbcG9zIC0gbGluZVNpemUgKyAxXSA/IDggOiAwKTtcbiAgICAgIGlmIChQT0lOVF9UWVBFU1tzdW1dKSB7XG4gICAgICAgIHBvaW50c1tqMCArIGpdID0gUE9JTlRfVFlQRVNbc3VtXTtcbiAgICAgICAgKytjb3VudDtcbiAgICAgIH1cbiAgICAgIHBvcysrO1xuICAgIH1cbiAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkge1xuICAgICAgcG9pbnRzW2owICsgal0gPSBkYXRhW3Bvc10gPyAyIDogNDtcbiAgICAgICsrY291bnQ7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcG9zID0gbGluZVNpemUgKiAoaGVpZ2h0IC0gMSk7XG4gIGowID0gaSAqIHdpZHRoMTtcbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1tqMF0gPSA4O1xuICAgICsrY291bnQ7XG4gIH1cbiAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICBpZiAoZGF0YVtwb3NdICE9PSBkYXRhW3BvcyArIDFdKSB7XG4gICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDQgOiA4O1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgcG9zKys7XG4gIH1cbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1tqMCArIGpdID0gNDtcbiAgICArK2NvdW50O1xuICB9XG4gIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGJ1aWxkaW5nIG91dGxpbmVzXG4gIHZhciBzdGVwcyA9IG5ldyBJbnQzMkFycmF5KFswLCB3aWR0aDEsIC0xLCAwLCAtd2lkdGgxLCAwLCAwLCAwLCAxXSk7XG4gIHZhciBvdXRsaW5lcyA9IFtdO1xuICBmb3IgKGkgPSAwOyBjb3VudCAmJiBpIDw9IGhlaWdodDsgaSsrKSB7XG4gICAgdmFyIHAgPSBpICogd2lkdGgxO1xuICAgIHZhciBlbmQgPSBwICsgd2lkdGg7XG4gICAgd2hpbGUgKHAgPCBlbmQgJiYgIXBvaW50c1twXSkge1xuICAgICAgcCsrO1xuICAgIH1cbiAgICBpZiAocCA9PT0gZW5kKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGNvb3JkcyA9IFtwICUgd2lkdGgxLCBpXTtcblxuICAgIHZhciB0eXBlID0gcG9pbnRzW3BdLFxuICAgICAgcDAgPSBwLFxuICAgICAgcHA7XG4gICAgZG8ge1xuICAgICAgdmFyIHN0ZXAgPSBzdGVwc1t0eXBlXTtcbiAgICAgIGRvIHtcbiAgICAgICAgcCArPSBzdGVwO1xuICAgICAgfSB3aGlsZSAoIXBvaW50c1twXSk7XG5cbiAgICAgIHBwID0gcG9pbnRzW3BdO1xuICAgICAgaWYgKHBwICE9PSA1ICYmIHBwICE9PSAxMCkge1xuICAgICAgICAvLyBzZXQgbmV3IGRpcmVjdGlvblxuICAgICAgICB0eXBlID0gcHA7XG4gICAgICAgIC8vIGRlbGV0ZSBtYXJrXG4gICAgICAgIHBvaW50c1twXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0eXBlIGlzIDUgb3IgMTAsIGllLCBhIGNyb3NzaW5nXG4gICAgICAgIC8vIHNldCBuZXcgZGlyZWN0aW9uXG4gICAgICAgIHR5cGUgPSBwcCAmICgoMHgzMyAqIHR5cGUpID4+IDQpO1xuICAgICAgICAvLyBzZXQgbmV3IHR5cGUgZm9yIFwiZnV0dXJlIGhpdFwiXG4gICAgICAgIHBvaW50c1twXSAmPSAodHlwZSA+PiAyKSB8ICh0eXBlIDw8IDIpO1xuICAgICAgfVxuXG4gICAgICBjb29yZHMucHVzaChwICUgd2lkdGgxKTtcbiAgICAgIGNvb3Jkcy5wdXNoKChwIC8gd2lkdGgxKSB8IDApO1xuXG4gICAgICBpZiAoIXBvaW50c1twXSkge1xuICAgICAgICAtLWNvdW50O1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHAwICE9PSBwKTtcbiAgICBvdXRsaW5lcy5wdXNoKGNvb3Jkcyk7XG4gICAgLS1pO1xuICB9XG5cbiAgdmFyIGRyYXdPdXRsaW5lID0gZnVuY3Rpb24gKGMpIHtcbiAgICBjLnNhdmUoKTtcbiAgICAvLyB0aGUgcGF0aCBzaGFsbCBiZSBwYWludGVkIGluIFswLi4xXXhbMC4uMV0gc3BhY2VcbiAgICBjLnNjYWxlKDEgLyB3aWR0aCwgLTEgLyBoZWlnaHQpO1xuICAgIGMudHJhbnNsYXRlKDAsIC1oZWlnaHQpO1xuICAgIGMuYmVnaW5QYXRoKCk7XG4gICAgZm9yIChsZXQgayA9IDAsIGtrID0gb3V0bGluZXMubGVuZ3RoOyBrIDwga2s7IGsrKykge1xuICAgICAgdmFyIG8gPSBvdXRsaW5lc1trXTtcbiAgICAgIGMubW92ZVRvKG9bMF0sIG9bMV0pO1xuICAgICAgZm9yIChsZXQgbCA9IDIsIGxsID0gby5sZW5ndGg7IGwgPCBsbDsgbCArPSAyKSB7XG4gICAgICAgIGMubGluZVRvKG9bbF0sIG9bbCArIDFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYy5maWxsKCk7XG4gICAgYy5iZWdpblBhdGgoKTtcbiAgICBjLnJlc3RvcmUoKTtcbiAgfTtcblxuICByZXR1cm4gZHJhd091dGxpbmU7XG59XG5cbnZhciBDYW52YXNFeHRyYVN0YXRlID0gKGZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGVDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGUoKSB7XG4gICAgLy8gQXJlIHNvZnQgbWFza3MgYW5kIGFscGhhIHZhbHVlcyBzaGFwZXMgb3Igb3BhY2l0aWVzP1xuICAgIHRoaXMuYWxwaGFJc1NoYXBlID0gZmFsc2U7XG4gICAgdGhpcy5mb250U2l6ZSA9IDA7XG4gICAgdGhpcy5mb250U2l6ZVNjYWxlID0gMTtcbiAgICB0aGlzLnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVg7XG4gICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgIHRoaXMuZm9udE1hdHJpeCA9IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgIHRoaXMubGVhZGluZyA9IDA7XG4gICAgLy8gQ3VycmVudCBwb2ludCAoaW4gdXNlciBjb29yZGluYXRlcylcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gICAgLy8gU3RhcnQgb2YgdGV4dCBsaW5lIChpbiB0ZXh0IGNvb3JkaW5hdGVzKVxuICAgIHRoaXMubGluZVggPSAwO1xuICAgIHRoaXMubGluZVkgPSAwO1xuICAgIC8vIENoYXJhY3RlciBhbmQgd29yZCBzcGFjaW5nXG4gICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG4gICAgdGhpcy53b3JkU3BhY2luZyA9IDA7XG4gICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcbiAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcbiAgICB0aGlzLnRleHRSaXNlID0gMDtcbiAgICAvLyBEZWZhdWx0IGZvcmUgYW5kIGJhY2tncm91bmQgY29sb3JzXG4gICAgdGhpcy5maWxsQ29sb3IgPSBcIiMwMDAwMDBcIjtcbiAgICB0aGlzLnN0cm9rZUNvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgdGhpcy5wYXR0ZXJuRmlsbCA9IGZhbHNlO1xuICAgIC8vIE5vdGU6IGZpbGwgYWxwaGEgYXBwbGllcyB0byBhbGwgbm9uLXN0cm9raW5nIG9wZXJhdGlvbnNcbiAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XG4gICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7XG4gICAgdGhpcy5saW5lV2lkdGggPSAxO1xuICAgIHRoaXMuYWN0aXZlU01hc2sgPSBudWxsO1xuICAgIHRoaXMucmVzdW1lU01hc2tDdHggPSBudWxsOyAvLyBub25jbG9uYWJsZSBmaWVsZCAoc2VlIHRoZSBzYXZlIG1ldGhvZCBiZWxvdylcbiAgICB0aGlzLnRyYW5zZmVyTWFwcyA9IG51bGw7XG4gIH1cblxuICBDYW52YXNFeHRyYVN0YXRlLnByb3RvdHlwZSA9IHtcbiAgICBjbG9uZTogZnVuY3Rpb24gQ2FudmFzRXh0cmFTdGF0ZV9jbG9uZSgpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0Q3VycmVudFBvaW50OiBmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlX3NldEN1cnJlbnRQb2ludCh4LCB5KSB7XG4gICAgICB0aGlzLnggPSB4O1xuICAgICAgdGhpcy55ID0geTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gQ2FudmFzRXh0cmFTdGF0ZTtcbn0pKCk7XG5cbi8qKlxuICogQHR5cGUge2FueX1cbiAqL1xudmFyIENhbnZhc0dyYXBoaWNzID0gKGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzQ2xvc3VyZSgpIHtcbiAgLy8gRGVmaW5lcyB0aGUgdGltZSB0aGUgZXhlY3V0ZU9wZXJhdG9yTGlzdCBpcyBnb2luZyB0byBiZSBleGVjdXRpbmdcbiAgLy8gYmVmb3JlIGl0IHN0b3BzIGFuZCBzaGVkdWxlcyBhIGNvbnRpbnVlIG9mIGV4ZWN1dGlvbi5cbiAgdmFyIEVYRUNVVElPTl9USU1FID0gMTU7XG4gIC8vIERlZmluZXMgdGhlIG51bWJlciBvZiBzdGVwcyBiZWZvcmUgY2hlY2tpbmcgdGhlIGV4ZWN1dGlvbiB0aW1lXG4gIHZhciBFWEVDVVRJT05fU1RFUFMgPSAxMDtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzKFxuICAgIGNhbnZhc0N0eCxcbiAgICBjb21tb25PYmpzLFxuICAgIG9ianMsXG4gICAgY2FudmFzRmFjdG9yeSxcbiAgICB3ZWJHTENvbnRleHQsXG4gICAgaW1hZ2VMYXllcixcbiAgICBvcHRpb25hbENvbnRlbnRDb25maWdcbiAgKSB7XG4gICAgdGhpcy5jdHggPSBjYW52YXNDdHg7XG4gICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUoKTtcbiAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTtcbiAgICB0aGlzLnJlcyA9IG51bGw7XG4gICAgdGhpcy54b2JqcyA9IG51bGw7XG4gICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqcztcbiAgICB0aGlzLm9ianMgPSBvYmpzO1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG4gICAgdGhpcy53ZWJHTENvbnRleHQgPSB3ZWJHTENvbnRleHQ7XG4gICAgdGhpcy5pbWFnZUxheWVyID0gaW1hZ2VMYXllcjtcbiAgICB0aGlzLmdyb3VwU3RhY2sgPSBbXTtcbiAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG4gICAgLy8gUGF0dGVybnMgYXJlIHBhaW50ZWQgcmVsYXRpdmUgdG8gdGhlIGluaXRpYWwgcGFnZS9mb3JtIHRyYW5zZm9ybSwgc2VlIHBkZlxuICAgIC8vIHNwZWMgOC43LjIgTk9URSAxLlxuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sgPSBbXTtcbiAgICB0aGlzLmdyb3VwTGV2ZWwgPSAwO1xuICAgIHRoaXMuc21hc2tTdGFjayA9IFtdO1xuICAgIHRoaXMuc21hc2tDb3VudGVyID0gMDtcbiAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7XG4gICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sgPSBbXTtcbiAgICB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZyA9IG9wdGlvbmFsQ29udGVudENvbmZpZztcbiAgICB0aGlzLmNhY2hlZENhbnZhc2VzID0gbmV3IENhY2hlZENhbnZhc2VzKHRoaXMuY2FudmFzRmFjdG9yeSk7XG4gICAgaWYgKGNhbnZhc0N0eCkge1xuICAgICAgLy8gTk9URTogaWYgbW96Q3VycmVudFRyYW5zZm9ybSBpcyBwb2x5ZmlsbGVkLCB0aGVuIHRoZSBjdXJyZW50IHN0YXRlIG9mXG4gICAgICAvLyB0aGUgdHJhbnNmb3JtYXRpb24gbXVzdCBhbHJlYWR5IGJlIHNldCBpbiBjYW52YXNDdHguX3RyYW5zZm9ybU1hdHJpeC5cbiAgICAgIGFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGNhbnZhc0N0eCk7XG4gICAgfVxuICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VEYXRhKGN0eCwgaW1nRGF0YSwgdHJhbnNmZXJNYXBzID0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgSW1hZ2VEYXRhICE9PSBcInVuZGVmaW5lZFwiICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwgMCwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHV0IHRoZSBpbWFnZSBkYXRhIHRvIHRoZSBjYW52YXMgaW4gY2h1bmtzLCByYXRoZXIgdGhhbiBwdXR0aW5nIHRoZVxuICAgIC8vIHdob2xlIGltYWdlIGF0IG9uY2UuICBUaGlzIHNhdmVzIEpTIG1lbW9yeSwgYmVjYXVzZSB0aGUgSW1hZ2VEYXRhIG9iamVjdFxuICAgIC8vIGlzIHNtYWxsZXIuIEl0IGFsc28gcG9zc2libHkgc2F2ZXMgQysrIG1lbW9yeSB3aXRoaW4gdGhlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gb2YgcHV0SW1hZ2VEYXRhKCkuIChFLmcuIGluIEZpcmVmb3ggd2UgbWFrZSB0d28gc2hvcnQtbGl2ZWQgY29waWVzIG9mXG4gICAgLy8gdGhlIGRhdGEgcGFzc2VkIHRvIHB1dEltYWdlRGF0YSgpKS4gfG58IHNob3VsZG4ndCBiZSB0b28gc21hbGwsIGhvd2V2ZXIsXG4gICAgLy8gYmVjYXVzZSB0b28gbWFueSBwdXRJbWFnZURhdGEoKSBjYWxscyB3aWxsIHNsb3cgdGhpbmdzIGRvd24uXG4gICAgLy9cbiAgICAvLyBOb3RlOiBhcyB3cml0dGVuLCBpZiB0aGUgbGFzdCBjaHVuayBpcyBwYXJ0aWFsLCB0aGUgcHV0SW1hZ2VEYXRhKCkgY2FsbFxuICAgIC8vIHdpbGwgKGNvbmNlcHR1YWxseSkgcHV0IHBpeGVscyBwYXN0IHRoZSBib3VuZHMgb2YgdGhlIGNhbnZhcy4gIEJ1dFxuICAgIC8vIHRoYXQncyBvazsgYW55IHN1Y2ggcGl4ZWxzIGFyZSBpZ25vcmVkLlxuXG4gICAgdmFyIGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LFxuICAgICAgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgIHZhciBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgICB2YXIgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgdmFyIHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxO1xuXG4gICAgdmFyIGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgICB2YXIgc3JjUG9zID0gMCxcbiAgICAgIGRlc3RQb3M7XG4gICAgdmFyIHNyYyA9IGltZ0RhdGEuZGF0YTtcbiAgICB2YXIgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhO1xuICAgIHZhciBpLCBqLCB0aGlzQ2h1bmtIZWlnaHQsIGVsZW1zSW5UaGlzQ2h1bms7XG5cbiAgICBsZXQgdHJhbnNmZXJNYXBSZWQsIHRyYW5zZmVyTWFwR3JlZW4sIHRyYW5zZmVyTWFwQmx1ZSwgdHJhbnNmZXJNYXBHcmF5O1xuICAgIGlmICh0cmFuc2Zlck1hcHMpIHtcbiAgICAgIHN3aXRjaCAodHJhbnNmZXJNYXBzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdHJhbnNmZXJNYXBSZWQgPSB0cmFuc2Zlck1hcHNbMF07XG4gICAgICAgICAgdHJhbnNmZXJNYXBHcmVlbiA9IHRyYW5zZmVyTWFwc1swXTtcbiAgICAgICAgICB0cmFuc2Zlck1hcEJsdWUgPSB0cmFuc2Zlck1hcHNbMF07XG4gICAgICAgICAgdHJhbnNmZXJNYXBHcmF5ID0gdHJhbnNmZXJNYXBzWzBdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgdHJhbnNmZXJNYXBSZWQgPSB0cmFuc2Zlck1hcHNbMF07XG4gICAgICAgICAgdHJhbnNmZXJNYXBHcmVlbiA9IHRyYW5zZmVyTWFwc1sxXTtcbiAgICAgICAgICB0cmFuc2Zlck1hcEJsdWUgPSB0cmFuc2Zlck1hcHNbMl07XG4gICAgICAgICAgdHJhbnNmZXJNYXBHcmF5ID0gdHJhbnNmZXJNYXBzWzNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXJlIGFyZSBtdWx0aXBsZSBmb3JtcyBpbiB3aGljaCB0aGUgcGl4ZWwgZGF0YSBjYW4gYmUgcGFzc2VkLCBhbmRcbiAgICAvLyBpbWdEYXRhLmtpbmQgdGVsbHMgdXMgd2hpY2ggb25lIHRoaXMgaXMuXG4gICAgaWYgKGltZ0RhdGEua2luZCA9PT0gSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7XG4gICAgICAvLyBHcmF5c2NhbGUsIDEgYml0IHBlciBwaXhlbCAoaS5lLiBibGFjay1hbmQtd2hpdGUpLlxuICAgICAgdmFyIHNyY0xlbmd0aCA9IHNyYy5ieXRlTGVuZ3RoO1xuICAgICAgdmFyIGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlciwgMCwgZGVzdC5ieXRlTGVuZ3RoID4+IDIpO1xuICAgICAgdmFyIGRlc3QzMkRhdGFMZW5ndGggPSBkZXN0MzIubGVuZ3RoO1xuICAgICAgdmFyIGZ1bGxTcmNEaWZmID0gKHdpZHRoICsgNykgPj4gMztcbiAgICAgIHZhciB3aGl0ZSA9IDB4ZmZmZmZmZmY7XG4gICAgICB2YXIgYmxhY2sgPSBJc0xpdHRsZUVuZGlhbkNhY2hlZC52YWx1ZSA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmO1xuXG4gICAgICBpZiAodHJhbnNmZXJNYXBHcmF5KSB7XG4gICAgICAgIGlmICh0cmFuc2Zlck1hcEdyYXlbMF0gPT09IDB4ZmYgJiYgdHJhbnNmZXJNYXBHcmF5WzB4ZmZdID09PSAwKSB7XG4gICAgICAgICAgW3doaXRlLCBibGFja10gPSBbYmxhY2ssIHdoaXRlXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuICAgICAgICB0aGlzQ2h1bmtIZWlnaHQgPVxuICAgICAgICAgIGkgPCBmdWxsQ2h1bmtzID8gRlVMTF9DSFVOS19IRUlHSFQgOiBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG4gICAgICAgIGRlc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGhpc0NodW5rSGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICB2YXIgc3JjRGlmZiA9IHNyY0xlbmd0aCAtIHNyY1BvcztcbiAgICAgICAgICBsZXQgayA9IDA7XG4gICAgICAgICAgdmFyIGtFbmQgPSBzcmNEaWZmID4gZnVsbFNyY0RpZmYgPyB3aWR0aCA6IHNyY0RpZmYgKiA4IC0gNztcbiAgICAgICAgICB2YXIga0VuZFVucm9sbGVkID0ga0VuZCAmIH43O1xuICAgICAgICAgIHZhciBtYXNrID0gMDtcbiAgICAgICAgICB2YXIgc3JjQnl0ZSA9IDA7XG4gICAgICAgICAgZm9yICg7IGsgPCBrRW5kVW5yb2xsZWQ7IGsgKz0gOCkge1xuICAgICAgICAgICAgc3JjQnl0ZSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxMjggPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgNjQgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMzIgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMTYgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgOCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA0ID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDIgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMSA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoOyBrIDwga0VuZDsgaysrKSB7XG4gICAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgICAgICAgbWFzayA9IDEyODtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgbWFzayA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSByYW4gb3V0IG9mIGlucHV0LiBNYWtlIGFsbCByZW1haW5pbmcgcGl4ZWxzIHRyYW5zcGFyZW50LlxuICAgICAgICB3aGlsZSAoZGVzdFBvcyA8IGRlc3QzMkRhdGFMZW5ndGgpIHtcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gSW1hZ2VLaW5kLlJHQkFfMzJCUFApIHtcbiAgICAgIC8vIFJHQkEsIDMyLWJpdHMgcGVyIHBpeGVsLlxuICAgICAgY29uc3QgaGFzVHJhbnNmZXJNYXBzID0gISEoXG4gICAgICAgIHRyYW5zZmVyTWFwUmVkIHx8XG4gICAgICAgIHRyYW5zZmVyTWFwR3JlZW4gfHxcbiAgICAgICAgdHJhbnNmZXJNYXBCbHVlXG4gICAgICApO1xuXG4gICAgICBqID0gMDtcbiAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIEZVTExfQ0hVTktfSEVJR0hUICogNDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBmdWxsQ2h1bmtzOyBpKyspIHtcbiAgICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY1Bvcywgc3JjUG9zICsgZWxlbXNJblRoaXNDaHVuaykpO1xuICAgICAgICBzcmNQb3MgKz0gZWxlbXNJblRoaXNDaHVuaztcblxuICAgICAgICBpZiAoaGFzVHJhbnNmZXJNYXBzKSB7XG4gICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBlbGVtc0luVGhpc0NodW5rOyBrICs9IDQpIHtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcFJlZCkge1xuICAgICAgICAgICAgICBkZXN0W2sgKyAwXSA9IHRyYW5zZmVyTWFwUmVkW2Rlc3RbayArIDBdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEdyZWVuKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W2sgKyAxXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBCbHVlKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDJdID0gdHJhbnNmZXJNYXBCbHVlW2Rlc3RbayArIDJdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaik7XG4gICAgICAgIGogKz0gRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgICB9XG4gICAgICBpZiAoaSA8IHRvdGFsQ2h1bmtzKSB7XG4gICAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHBhcnRpYWxDaHVua0hlaWdodCAqIDQ7XG4gICAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNQb3MsIHNyY1BvcyArIGVsZW1zSW5UaGlzQ2h1bmspKTtcblxuICAgICAgICBpZiAoaGFzVHJhbnNmZXJNYXBzKSB7XG4gICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBlbGVtc0luVGhpc0NodW5rOyBrICs9IDQpIHtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcFJlZCkge1xuICAgICAgICAgICAgICBkZXN0W2sgKyAwXSA9IHRyYW5zZmVyTWFwUmVkW2Rlc3RbayArIDBdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEdyZWVuKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W2sgKyAxXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBCbHVlKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDJdID0gdHJhbnNmZXJNYXBCbHVlW2Rlc3RbayArIDJdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbWdEYXRhLmtpbmQgPT09IEltYWdlS2luZC5SR0JfMjRCUFApIHtcbiAgICAgIC8vIFJHQiwgMjQtYml0cyBwZXIgcGl4ZWwuXG4gICAgICBjb25zdCBoYXNUcmFuc2Zlck1hcHMgPSAhIShcbiAgICAgICAgdHJhbnNmZXJNYXBSZWQgfHxcbiAgICAgICAgdHJhbnNmZXJNYXBHcmVlbiB8fFxuICAgICAgICB0cmFuc2Zlck1hcEJsdWVcbiAgICAgICk7XG5cbiAgICAgIHRoaXNDaHVua0hlaWdodCA9IEZVTExfQ0hVTktfSEVJR0hUO1xuICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogdGhpc0NodW5rSGVpZ2h0O1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPj0gZnVsbENodW5rcykge1xuICAgICAgICAgIHRoaXNDaHVua0hlaWdodCA9IHBhcnRpYWxDaHVua0hlaWdodDtcbiAgICAgICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiB0aGlzQ2h1bmtIZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0UG9zID0gMDtcbiAgICAgICAgZm9yIChqID0gZWxlbXNJblRoaXNDaHVuazsgai0tOyApIHtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzVHJhbnNmZXJNYXBzKSB7XG4gICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkZXN0UG9zOyBrICs9IDQpIHtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcFJlZCkge1xuICAgICAgICAgICAgICBkZXN0W2sgKyAwXSA9IHRyYW5zZmVyTWFwUmVkW2Rlc3RbayArIDBdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEdyZWVuKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W2sgKyAxXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBCbHVlKSB7XG4gICAgICAgICAgICAgIGRlc3RbayArIDJdID0gdHJhbnNmZXJNYXBCbHVlW2Rlc3RbayArIDJdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWQgaW1hZ2Uga2luZDogJHtpbWdEYXRhLmtpbmR9YCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VNYXNrKGN0eCwgaW1nRGF0YSkge1xuICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCxcbiAgICAgIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgICB2YXIgcGFydGlhbENodW5rSGVpZ2h0ID0gaGVpZ2h0ICUgRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgdmFyIGZ1bGxDaHVua3MgPSAoaGVpZ2h0IC0gcGFydGlhbENodW5rSGVpZ2h0KSAvIEZVTExfQ0hVTktfSEVJR0hUO1xuICAgIHZhciB0b3RhbENodW5rcyA9IHBhcnRpYWxDaHVua0hlaWdodCA9PT0gMCA/IGZ1bGxDaHVua3MgOiBmdWxsQ2h1bmtzICsgMTtcblxuICAgIHZhciBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gICAgdmFyIHNyY1BvcyA9IDA7XG4gICAgdmFyIHNyYyA9IGltZ0RhdGEuZGF0YTtcbiAgICB2YXIgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG4gICAgICB2YXIgdGhpc0NodW5rSGVpZ2h0ID1cbiAgICAgICAgaSA8IGZ1bGxDaHVua3MgPyBGVUxMX0NIVU5LX0hFSUdIVCA6IHBhcnRpYWxDaHVua0hlaWdodDtcblxuICAgICAgLy8gRXhwYW5kIHRoZSBtYXNrIHNvIGl0IGNhbiBiZSB1c2VkIGJ5IHRoZSBjYW52YXMuICBBbnkgcmVxdWlyZWRcbiAgICAgIC8vIGludmVyc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQuXG4gICAgICB2YXIgZGVzdFBvcyA9IDM7IC8vIGFscGhhIGNvbXBvbmVudCBvZmZzZXRcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpc0NodW5rSGVpZ2h0OyBqKyspIHtcbiAgICAgICAgdmFyIG1hc2sgPSAwO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHdpZHRoOyBrKyspIHtcbiAgICAgICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgICAgIHZhciBlbGVtID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgICAgIG1hc2sgPSAxMjg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlc3RbZGVzdFBvc10gPSBlbGVtICYgbWFzayA/IDAgOiAyNTU7XG4gICAgICAgICAgZGVzdFBvcyArPSA0O1xuICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlDdHhTdGF0ZShzb3VyY2VDdHgsIGRlc3RDdHgpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IFtcbiAgICAgIFwic3Ryb2tlU3R5bGVcIixcbiAgICAgIFwiZmlsbFN0eWxlXCIsXG4gICAgICBcImZpbGxSdWxlXCIsXG4gICAgICBcImdsb2JhbEFscGhhXCIsXG4gICAgICBcImxpbmVXaWR0aFwiLFxuICAgICAgXCJsaW5lQ2FwXCIsXG4gICAgICBcImxpbmVKb2luXCIsXG4gICAgICBcIm1pdGVyTGltaXRcIixcbiAgICAgIFwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXCIsXG4gICAgICBcImZvbnRcIixcbiAgICBdO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTtcbiAgICAgIGlmIChzb3VyY2VDdHhbcHJvcGVydHldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVzdEN0eFtwcm9wZXJ0eV0gPSBzb3VyY2VDdHhbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc291cmNlQ3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RDdHguc2V0TGluZURhc2goc291cmNlQ3R4LmdldExpbmVEYXNoKCkpO1xuICAgICAgZGVzdEN0eC5saW5lRGFzaE9mZnNldCA9IHNvdXJjZUN0eC5saW5lRGFzaE9mZnNldDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXNldEN0eFRvRGVmYXVsdChjdHgpIHtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBcIiMwMDAwMDBcIjtcbiAgICBjdHguZmlsbFN0eWxlID0gXCIjMDAwMDAwXCI7XG4gICAgY3R4LmZpbGxSdWxlID0gXCJub256ZXJvXCI7XG4gICAgY3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICBjdHgubGluZVdpZHRoID0gMTtcbiAgICBjdHgubGluZUNhcCA9IFwiYnV0dFwiO1xuICAgIGN0eC5saW5lSm9pbiA9IFwibWl0ZXJcIjtcbiAgICBjdHgubWl0ZXJMaW1pdCA9IDEwO1xuICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG4gICAgY3R4LmZvbnQgPSBcIjEwcHggc2Fucy1zZXJpZlwiO1xuICAgIGlmIChjdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY3R4LnNldExpbmVEYXNoKFtdKTtcbiAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IDA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcG9zZVNNYXNrQmFja2Ryb3AoYnl0ZXMsIHIwLCBnMCwgYjApIHtcbiAgICB2YXIgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIHZhciBhbHBoYSA9IGJ5dGVzW2ldO1xuICAgICAgaWYgKGFscGhhID09PSAwKSB7XG4gICAgICAgIGJ5dGVzW2kgLSAzXSA9IHIwO1xuICAgICAgICBieXRlc1tpIC0gMl0gPSBnMDtcbiAgICAgICAgYnl0ZXNbaSAtIDFdID0gYjA7XG4gICAgICB9IGVsc2UgaWYgKGFscGhhIDwgMjU1KSB7XG4gICAgICAgIHZhciBhbHBoYV8gPSAyNTUgLSBhbHBoYTtcbiAgICAgICAgYnl0ZXNbaSAtIDNdID0gKGJ5dGVzW2kgLSAzXSAqIGFscGhhICsgcjAgKiBhbHBoYV8pID4+IDg7XG4gICAgICAgIGJ5dGVzW2kgLSAyXSA9IChieXRlc1tpIC0gMl0gKiBhbHBoYSArIGcwICogYWxwaGFfKSA+PiA4O1xuICAgICAgICBieXRlc1tpIC0gMV0gPSAoYnl0ZXNbaSAtIDFdICogYWxwaGEgKyBiMCAqIGFscGhhXykgPj4gODtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYShtYXNrRGF0YSwgbGF5ZXJEYXRhLCB0cmFuc2Zlck1hcCkge1xuICAgIHZhciBsZW5ndGggPSBtYXNrRGF0YS5sZW5ndGg7XG4gICAgdmFyIHNjYWxlID0gMSAvIDI1NTtcbiAgICBmb3IgKHZhciBpID0gMzsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgYWxwaGEgPSB0cmFuc2Zlck1hcCA/IHRyYW5zZmVyTWFwW21hc2tEYXRhW2ldXSA6IG1hc2tEYXRhW2ldO1xuICAgICAgbGF5ZXJEYXRhW2ldID0gKGxheWVyRGF0YVtpXSAqIGFscGhhICogc2NhbGUpIHwgMDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb21wb3NlU01hc2tMdW1pbm9zaXR5KG1hc2tEYXRhLCBsYXllckRhdGEsIHRyYW5zZmVyTWFwKSB7XG4gICAgdmFyIGxlbmd0aCA9IG1hc2tEYXRhLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMzsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgeSA9XG4gICAgICAgIG1hc2tEYXRhW2kgLSAzXSAqIDc3ICsgLy8gKiAwLjMgLyAyNTUgKiAweDEwMDAwXG4gICAgICAgIG1hc2tEYXRhW2kgLSAyXSAqIDE1MiArIC8vICogMC41OSAuLi4uXG4gICAgICAgIG1hc2tEYXRhW2kgLSAxXSAqIDI4OyAvLyAqIDAuMTEgLi4uLlxuICAgICAgbGF5ZXJEYXRhW2ldID0gdHJhbnNmZXJNYXBcbiAgICAgICAgPyAobGF5ZXJEYXRhW2ldICogdHJhbnNmZXJNYXBbeSA+PiA4XSkgPj4gOFxuICAgICAgICA6IChsYXllckRhdGFbaV0gKiB5KSA+PiAxNjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmljQ29tcG9zZVNNYXNrKFxuICAgIG1hc2tDdHgsXG4gICAgbGF5ZXJDdHgsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHN1YnR5cGUsXG4gICAgYmFja2Ryb3AsXG4gICAgdHJhbnNmZXJNYXBcbiAgKSB7XG4gICAgdmFyIGhhc0JhY2tkcm9wID0gISFiYWNrZHJvcDtcbiAgICB2YXIgcjAgPSBoYXNCYWNrZHJvcCA/IGJhY2tkcm9wWzBdIDogMDtcbiAgICB2YXIgZzAgPSBoYXNCYWNrZHJvcCA/IGJhY2tkcm9wWzFdIDogMDtcbiAgICB2YXIgYjAgPSBoYXNCYWNrZHJvcCA/IGJhY2tkcm9wWzJdIDogMDtcblxuICAgIHZhciBjb21wb3NlRm47XG4gICAgaWYgKHN1YnR5cGUgPT09IFwiTHVtaW5vc2l0eVwiKSB7XG4gICAgICBjb21wb3NlRm4gPSBjb21wb3NlU01hc2tMdW1pbm9zaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb3NlRm4gPSBjb21wb3NlU01hc2tBbHBoYTtcbiAgICB9XG5cbiAgICAvLyBwcm9jZXNzaW5nIGltYWdlIGluIGNodW5rcyB0byBzYXZlIG1lbW9yeVxuICAgIHZhciBQSVhFTFNfVE9fUFJPQ0VTUyA9IDEwNDg1NzY7XG4gICAgdmFyIGNodW5rU2l6ZSA9IE1hdGgubWluKGhlaWdodCwgTWF0aC5jZWlsKFBJWEVMU19UT19QUk9DRVNTIC8gd2lkdGgpKTtcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArPSBjaHVua1NpemUpIHtcbiAgICAgIHZhciBjaHVua0hlaWdodCA9IE1hdGgubWluKGNodW5rU2l6ZSwgaGVpZ2h0IC0gcm93KTtcbiAgICAgIHZhciBtYXNrRGF0YSA9IG1hc2tDdHguZ2V0SW1hZ2VEYXRhKDAsIHJvdywgd2lkdGgsIGNodW5rSGVpZ2h0KTtcbiAgICAgIHZhciBsYXllckRhdGEgPSBsYXllckN0eC5nZXRJbWFnZURhdGEoMCwgcm93LCB3aWR0aCwgY2h1bmtIZWlnaHQpO1xuXG4gICAgICBpZiAoaGFzQmFja2Ryb3ApIHtcbiAgICAgICAgY29tcG9zZVNNYXNrQmFja2Ryb3AobWFza0RhdGEuZGF0YSwgcjAsIGcwLCBiMCk7XG4gICAgICB9XG4gICAgICBjb21wb3NlRm4obWFza0RhdGEuZGF0YSwgbGF5ZXJEYXRhLmRhdGEsIHRyYW5zZmVyTWFwKTtcblxuICAgICAgbWFza0N0eC5wdXRJbWFnZURhdGEobGF5ZXJEYXRhLCAwLCByb3cpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBvc2VTTWFzayhjdHgsIHNtYXNrLCBsYXllckN0eCwgd2ViR0xDb250ZXh0KSB7XG4gICAgdmFyIG1hc2sgPSBzbWFzay5jYW52YXM7XG4gICAgdmFyIG1hc2tDdHggPSBzbWFzay5jb250ZXh0O1xuXG4gICAgY3R4LnNldFRyYW5zZm9ybShcbiAgICAgIHNtYXNrLnNjYWxlWCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgc21hc2suc2NhbGVZLFxuICAgICAgc21hc2sub2Zmc2V0WCxcbiAgICAgIHNtYXNrLm9mZnNldFlcbiAgICApO1xuXG4gICAgdmFyIGJhY2tkcm9wID0gc21hc2suYmFja2Ryb3AgfHwgbnVsbDtcbiAgICBpZiAoIXNtYXNrLnRyYW5zZmVyTWFwICYmIHdlYkdMQ29udGV4dC5pc0VuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBvc2VkID0gd2ViR0xDb250ZXh0LmNvbXBvc2VTTWFzayh7XG4gICAgICAgIGxheWVyOiBsYXllckN0eC5jYW52YXMsXG4gICAgICAgIG1hc2ssXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBzdWJ0eXBlOiBzbWFzay5zdWJ0eXBlLFxuICAgICAgICAgIGJhY2tkcm9wLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3R4LmRyYXdJbWFnZShjb21wb3NlZCwgc21hc2sub2Zmc2V0WCwgc21hc2sub2Zmc2V0WSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdlbmVyaWNDb21wb3NlU01hc2soXG4gICAgICBtYXNrQ3R4LFxuICAgICAgbGF5ZXJDdHgsXG4gICAgICBtYXNrLndpZHRoLFxuICAgICAgbWFzay5oZWlnaHQsXG4gICAgICBzbWFzay5zdWJ0eXBlLFxuICAgICAgYmFja2Ryb3AsXG4gICAgICBzbWFzay50cmFuc2Zlck1hcFxuICAgICk7XG4gICAgY3R4LmRyYXdJbWFnZShtYXNrLCAwLCAwKTtcbiAgfVxuXG4gIHZhciBMSU5FX0NBUF9TVFlMRVMgPSBbXCJidXR0XCIsIFwicm91bmRcIiwgXCJzcXVhcmVcIl07XG4gIHZhciBMSU5FX0pPSU5fU1RZTEVTID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdO1xuICB2YXIgTk9STUFMX0NMSVAgPSB7fTtcbiAgdmFyIEVPX0NMSVAgPSB7fTtcblxuICBDYW52YXNHcmFwaGljcy5wcm90b3R5cGUgPSB7XG4gICAgYmVnaW5EcmF3aW5nKHtcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgdHJhbnNwYXJlbmN5ID0gZmFsc2UsXG4gICAgICBiYWNrZ3JvdW5kID0gbnVsbCxcbiAgICB9KSB7XG4gICAgICAvLyBGb3IgcGRmcyB0aGF0IHVzZSBibGVuZCBtb2RlcyB3ZSBoYXZlIHRvIGNsZWFyIHRoZSBjYW52YXMgZWxzZSBjZXJ0YWluXG4gICAgICAvLyBibGVuZCBtb2RlcyBjYW4gbG9vayB3cm9uZyBzaW5jZSB3ZSdkIGJlIGJsZW5kaW5nIHdpdGggYSB3aGl0ZVxuICAgICAgLy8gYmFja2Ryb3AuIFRoZSBwcm9ibGVtIHdpdGggYSB0cmFuc3BhcmVudCBiYWNrZHJvcCB0aG91Z2ggaXMgd2UgdGhlblxuICAgICAgLy8gZG9uJ3QgZ2V0IHN1YiBwaXhlbCBhbnRpIGFsaWFzaW5nIG9uIHRleHQsIGNyZWF0aW5nIHRlbXBvcmFyeVxuICAgICAgLy8gdHJhbnNwYXJlbnQgY2FudmFzIHdoZW4gd2UgaGF2ZSBibGVuZCBtb2Rlcy5cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMuY3R4LmNhbnZhcy53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0O1xuXG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kIHx8IFwicmdiKDI1NSwgMjU1LCAyNTUpXCI7XG4gICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcblxuICAgICAgaWYgKHRyYW5zcGFyZW5jeSkge1xuICAgICAgICB2YXIgdHJhbnNwYXJlbnRDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcbiAgICAgICAgICBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb21wb3NpdGVDdHggPSB0aGlzLmN0eDtcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudENhbnZhcyA9IHRyYW5zcGFyZW50Q2FudmFzLmNhbnZhcztcbiAgICAgICAgdGhpcy5jdHggPSB0cmFuc3BhcmVudENhbnZhcy5jb250ZXh0O1xuICAgICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgIC8vIFRoZSB0cmFuc2Zvcm0gY2FuIGJlIGFwcGxpZWQgYmVmb3JlIHJlbmRlcmluZywgdHJhbnNmZXJyaW5nIGl0IHRvXG4gICAgICAgIC8vIHRoZSBuZXcgY2FudmFzLlxuICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkoXG4gICAgICAgICAgdGhpcy5jdHgsXG4gICAgICAgICAgdGhpcy5jb21wb3NpdGVDdHgubW96Q3VycmVudFRyYW5zZm9ybVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgdHJhbnNmb3JtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgdmlld3BvcnQudHJhbnNmb3JtKTtcblxuICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gdGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybS5zbGljZSgpO1xuXG4gICAgICBpZiAodGhpcy5pbWFnZUxheWVyKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VMYXllci5iZWdpbkxheW91dCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBleGVjdXRlT3BlcmF0b3JMaXN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19leGVjdXRlT3BlcmF0b3JMaXN0KFxuICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgZXhlY3V0aW9uU3RhcnRJZHgsXG4gICAgICBjb250aW51ZUNhbGxiYWNrLFxuICAgICAgc3RlcHBlclxuICAgICkge1xuICAgICAgdmFyIGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7XG4gICAgICB2YXIgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5O1xuICAgICAgdmFyIGkgPSBleGVjdXRpb25TdGFydElkeCB8fCAwO1xuICAgICAgdmFyIGFyZ3NBcnJheUxlbiA9IGFyZ3NBcnJheS5sZW5ndGg7XG5cbiAgICAgIC8vIFNvbWV0aW1lcyB0aGUgT3BlcmF0b3JMaXN0IHRvIGV4ZWN1dGUgaXMgZW1wdHkuXG4gICAgICBpZiAoYXJnc0FycmF5TGVuID09PSBpKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2h1bmtPcGVyYXRpb25zID1cbiAgICAgICAgYXJnc0FycmF5TGVuIC0gaSA+IEVYRUNVVElPTl9TVEVQUyAmJlxuICAgICAgICB0eXBlb2YgY29udGludWVDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgdmFyIGVuZFRpbWUgPSBjaHVua09wZXJhdGlvbnMgPyBEYXRlLm5vdygpICsgRVhFQ1VUSU9OX1RJTUUgOiAwO1xuICAgICAgdmFyIHN0ZXBzID0gMDtcblxuICAgICAgdmFyIGNvbW1vbk9ianMgPSB0aGlzLmNvbW1vbk9ianM7XG4gICAgICB2YXIgb2JqcyA9IHRoaXMub2JqcztcbiAgICAgIHZhciBmbklkO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoc3RlcHBlciAhPT0gdW5kZWZpbmVkICYmIGkgPT09IHN0ZXBwZXIubmV4dEJyZWFrUG9pbnQpIHtcbiAgICAgICAgICBzdGVwcGVyLmJyZWFrSXQoaSwgY29udGludWVDYWxsYmFjayk7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cblxuICAgICAgICBmbklkID0gZm5BcnJheVtpXTtcblxuICAgICAgICBpZiAoZm5JZCAhPT0gT1BTLmRlcGVuZGVuY3kpIHtcbiAgICAgICAgICB0aGlzW2ZuSWRdLmFwcGx5KHRoaXMsIGFyZ3NBcnJheVtpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZXBPYmpJZCBvZiBhcmdzQXJyYXlbaV0pIHtcbiAgICAgICAgICAgIGNvbnN0IG9ianNQb29sID0gZGVwT2JqSWQuc3RhcnRzV2l0aChcImdfXCIpID8gY29tbW9uT2JqcyA6IG9ianM7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBwcm9taXNlIGlzbid0IHJlc29sdmVkIHlldCwgYWRkIHRoZSBjb250aW51ZUNhbGxiYWNrXG4gICAgICAgICAgICAvLyB0byB0aGUgcHJvbWlzZSBhbmQgYmFpbCBvdXQuXG4gICAgICAgICAgICBpZiAoIW9ianNQb29sLmhhcyhkZXBPYmpJZCkpIHtcbiAgICAgICAgICAgICAgb2Jqc1Bvb2wuZ2V0KGRlcE9iaklkLCBjb250aW51ZUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuXG4gICAgICAgIC8vIElmIHRoZSBlbnRpcmUgb3BlcmF0b3JMaXN0IHdhcyBleGVjdXRlZCwgc3RvcCBhcyB3ZXJlIGRvbmUuXG4gICAgICAgIGlmIChpID09PSBhcmdzQXJyYXlMZW4pIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBleGVjdXRpb24gdG9vayBsb25nZXIgdGhlbiBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUgYW5kXG4gICAgICAgIC8vIGBjb250aW51ZUNhbGxiYWNrYCBpcyBzcGVjaWZpZWQsIGludGVycnVwdCB0aGUgZXhlY3V0aW9uLlxuICAgICAgICBpZiAoY2h1bmtPcGVyYXRpb25zICYmICsrc3RlcHMgPiBFWEVDVVRJT05fU1RFUFMpIHtcbiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IGVuZFRpbWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGVwcyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgb3BlcmF0b3JMaXN0IGlzbid0IGV4ZWN1dGVkIGNvbXBsZXRlbHkgeWV0IE9SIHRoZSBleGVjdXRpb25cbiAgICAgICAgLy8gdGltZSB3YXMgc2hvcnQgZW5vdWdoLCBkbyBhbm90aGVyIGV4ZWN1dGlvbiByb3VuZC5cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZW5kRHJhd2luZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kRHJhd2luZygpIHtcbiAgICAgIC8vIEZpbmlzaGluZyBhbGwgb3BlbmVkIG9wZXJhdGlvbnMgc3VjaCBhcyBTTWFzayBncm91cCBwYWludGluZy5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbmRTTWFza0dyb3VwKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcblxuICAgICAgaWYgKHRoaXMudHJhbnNwYXJlbnRDYW52YXMpIHtcbiAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNvbXBvc2l0ZUN0eDtcbiAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7IC8vIEF2b2lkIGFwcGx5IHRyYW5zZm9ybSB0d2ljZVxuICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy50cmFuc3BhcmVudENhbnZhcywgMCwgMCk7XG4gICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudENhbnZhcyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuY2xlYXIoKTtcbiAgICAgIHRoaXMud2ViR0xDb250ZXh0LmNsZWFyKCk7XG5cbiAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5pbWFnZUxheWVyLmVuZExheW91dCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBHcmFwaGljcyBzdGF0ZVxuICAgIHNldExpbmVXaWR0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGluZVdpZHRoKHdpZHRoKSB7XG4gICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gd2lkdGg7XG4gICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB3aWR0aDtcbiAgICB9LFxuICAgIHNldExpbmVDYXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExpbmVDYXAoc3R5bGUpIHtcbiAgICAgIHRoaXMuY3R4LmxpbmVDYXAgPSBMSU5FX0NBUF9TVFlMRVNbc3R5bGVdO1xuICAgIH0sXG4gICAgc2V0TGluZUpvaW46IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExpbmVKb2luKHN0eWxlKSB7XG4gICAgICB0aGlzLmN0eC5saW5lSm9pbiA9IExJTkVfSk9JTl9TVFlMRVNbc3R5bGVdO1xuICAgIH0sXG4gICAgc2V0TWl0ZXJMaW1pdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TWl0ZXJMaW1pdChsaW1pdCkge1xuICAgICAgdGhpcy5jdHgubWl0ZXJMaW1pdCA9IGxpbWl0O1xuICAgIH0sXG4gICAgc2V0RGFzaDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0RGFzaChkYXNoQXJyYXksIGRhc2hQaGFzZSkge1xuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoQXJyYXkpO1xuICAgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBkYXNoUGhhc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KSB7XG4gICAgICAvLyBUaGlzIG9wZXJhdGlvbiBpcyBpZ25vcmVkIHNpbmNlIHdlIGhhdmVuJ3QgZm91bmQgYSB1c2UgY2FzZSBmb3IgaXQgeWV0LlxuICAgIH0sXG4gICAgc2V0RmxhdG5lc3MoZmxhdG5lc3MpIHtcbiAgICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIGlnbm9yZWQgc2luY2Ugd2UgaGF2ZW4ndCBmb3VuZCBhIHVzZSBjYXNlIGZvciBpdCB5ZXQuXG4gICAgfSxcbiAgICBzZXRHU3RhdGU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEdTdGF0ZShzdGF0ZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN0YXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0YXRlc1tpXTtcbiAgICAgICAgdmFyIGtleSA9IHN0YXRlWzBdO1xuICAgICAgICB2YXIgdmFsdWUgPSBzdGF0ZVsxXTtcblxuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgIGNhc2UgXCJMV1wiOlxuICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgICB0aGlzLnNldExpbmVDYXAodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkxKXCI6XG4gICAgICAgICAgICB0aGlzLnNldExpbmVKb2luKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJNTFwiOlxuICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgICB0aGlzLnNldERhc2godmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJSSVwiOlxuICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJGb250XCI6XG4gICAgICAgICAgICB0aGlzLnNldEZvbnQodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJDQVwiOlxuICAgICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhID0gc3RhdGVbMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiY2FcIjpcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPSBzdGF0ZVsxXTtcbiAgICAgICAgICAgIHRoaXMuY3R4Lmdsb2JhbEFscGhhID0gc3RhdGVbMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQk1cIjpcbiAgICAgICAgICAgIHRoaXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIlNNYXNrXCI6XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSB7XG4gICAgICAgICAgICAgIC8vIElmIFNNYXNrIGlzIGN1cnJyZW5seSB1c2VkLCBpdCBuZWVkcyB0byBiZSBzdXNwZW5kZWQgb3JcbiAgICAgICAgICAgICAgLy8gZmluaXNoZWQuIFN1c3BlbmQgb25seSBtYWtlcyBzZW5zZSB3aGVuIGF0IGxlYXN0IG9uZSBzYXZlKClcbiAgICAgICAgICAgICAgLy8gd2FzIHBlcmZvcm1lZCBhbmQgc3RhdGUgbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQgb24gcmVzdG9yZSgpLlxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlU3RhY2tbdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCAtIDFdLmFjdGl2ZVNNYXNrID09PVxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VzcGVuZFNNYXNrR3JvdXAoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFNNYXNrR3JvdXAoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gdmFsdWUgPyB0aGlzLnRlbXBTTWFzayA6IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSB7XG4gICAgICAgICAgICAgIHRoaXMuYmVnaW5TTWFza0dyb3VwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiVFJcIjpcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYmVnaW5TTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpblNNYXNrR3JvdXAoKSB7XG4gICAgICB2YXIgYWN0aXZlU01hc2sgPSB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s7XG4gICAgICB2YXIgZHJhd25XaWR0aCA9IGFjdGl2ZVNNYXNrLmNhbnZhcy53aWR0aDtcbiAgICAgIHZhciBkcmF3bkhlaWdodCA9IGFjdGl2ZVNNYXNrLmNhbnZhcy5oZWlnaHQ7XG4gICAgICB2YXIgY2FjaGVJZCA9IFwic21hc2tHcm91cEF0XCIgKyB0aGlzLmdyb3VwTGV2ZWw7XG4gICAgICB2YXIgc2NyYXRjaENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFxuICAgICAgICBjYWNoZUlkLFxuICAgICAgICBkcmF3bldpZHRoLFxuICAgICAgICBkcmF3bkhlaWdodCxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgdmFyIGN1cnJlbnRDdHggPSB0aGlzLmN0eDtcbiAgICAgIHZhciBjdXJyZW50VHJhbnNmb3JtID0gY3VycmVudEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtO1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuXG4gICAgICB2YXIgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG4gICAgICBncm91cEN0eC5zY2FsZSgxIC8gYWN0aXZlU01hc2suc2NhbGVYLCAxIC8gYWN0aXZlU01hc2suc2NhbGVZKTtcbiAgICAgIGdyb3VwQ3R4LnRyYW5zbGF0ZSgtYWN0aXZlU01hc2sub2Zmc2V0WCwgLWFjdGl2ZVNNYXNrLm9mZnNldFkpO1xuICAgICAgZ3JvdXBDdHgudHJhbnNmb3JtLmFwcGx5KGdyb3VwQ3R4LCBjdXJyZW50VHJhbnNmb3JtKTtcblxuICAgICAgYWN0aXZlU01hc2suc3RhcnRUcmFuc2Zvcm1JbnZlcnNlID0gZ3JvdXBDdHgubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7XG5cbiAgICAgIGNvcHlDdHhTdGF0ZShjdXJyZW50Q3R4LCBncm91cEN0eCk7XG4gICAgICB0aGlzLmN0eCA9IGdyb3VwQ3R4O1xuICAgICAgdGhpcy5zZXRHU3RhdGUoW1xuICAgICAgICBbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLFxuICAgICAgICBbXCJjYVwiLCAxXSxcbiAgICAgICAgW1wiQ0FcIiwgMV0sXG4gICAgICBdKTtcbiAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGN1cnJlbnRDdHgpO1xuICAgICAgdGhpcy5ncm91cExldmVsKys7XG4gICAgfSxcbiAgICBzdXNwZW5kU01hc2tHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kU01hc2tHcm91cCgpIHtcbiAgICAgIC8vIFNpbWlsYXIgdG8gZW5kU01hc2tHcm91cCwgdGhlIGludGVybWVkaWF0ZSBjYW52YXMgaGFzIHRvIGJlIGNvbXBvc2VkXG4gICAgICAvLyBhbmQgZnV0dXJlIGN0eCBzdGF0ZSByZXN0b3JlZC5cbiAgICAgIHZhciBncm91cEN0eCA9IHRoaXMuY3R4O1xuICAgICAgdGhpcy5ncm91cExldmVsLS07XG4gICAgICB0aGlzLmN0eCA9IHRoaXMuZ3JvdXBTdGFjay5wb3AoKTtcblxuICAgICAgY29tcG9zZVNNYXNrKFxuICAgICAgICB0aGlzLmN0eCxcbiAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLFxuICAgICAgICBncm91cEN0eCxcbiAgICAgICAgdGhpcy53ZWJHTENvbnRleHRcbiAgICAgICk7XG4gICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7IC8vIHNhdmUgaXMgbmVlZGVkIHNpbmNlIFNNYXNrIHdpbGwgYmUgcmVzdW1lZC5cbiAgICAgIGNvcHlDdHhTdGF0ZShncm91cEN0eCwgdGhpcy5jdHgpO1xuXG4gICAgICAvLyBTYXZpbmcgc3RhdGUgZm9yIHJlc3VtaW5nLlxuICAgICAgdGhpcy5jdXJyZW50LnJlc3VtZVNNYXNrQ3R4ID0gZ3JvdXBDdHg7XG4gICAgICAvLyBUcmFuc2Zvcm0gd2FzIGNoYW5nZWQgaW4gdGhlIFNNYXNrIGNhbnZhcywgcmVmbGVjdGluZyB0aGlzIGNoYW5nZSBvblxuICAgICAgLy8gdGhpcy5jdHguXG4gICAgICB2YXIgZGVsdGFUcmFuc2Zvcm0gPSBVdGlsLnRyYW5zZm9ybShcbiAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZSxcbiAgICAgICAgZ3JvdXBDdHgubW96Q3VycmVudFRyYW5zZm9ybVxuICAgICAgKTtcbiAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgZGVsdGFUcmFuc2Zvcm0pO1xuXG4gICAgICAvLyBTTWFzayB3YXMgY29tcG9zZWQsIHRoZSByZXN1bHRzIGF0IHRoZSBncm91cEN0eCBjYW4gYmUgY2xlYXJlZC5cbiAgICAgIGdyb3VwQ3R4LnNhdmUoKTtcbiAgICAgIGdyb3VwQ3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGdyb3VwQ3R4LmNsZWFyUmVjdCgwLCAwLCBncm91cEN0eC5jYW52YXMud2lkdGgsIGdyb3VwQ3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgZ3JvdXBDdHgucmVzdG9yZSgpO1xuICAgIH0sXG4gICAgcmVzdW1lU01hc2tHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kU01hc2tHcm91cCgpIHtcbiAgICAgIC8vIFJlc3VtaW5nIHN0YXRlIHNhdmVkIGJ5IHN1c3BlbmRTTWFza0dyb3VwLiBXZSBkb24ndCBuZWVkIHRvIHJlc3RvcmVcbiAgICAgIC8vIGFueSBncm91cEN0eCBzdGF0ZSBzaW5jZSByZXN0b3JlKCkgY29tbWFuZCAodGhlIG9ubHkgY2FsbGVyKSB3aWxsIGRvXG4gICAgICAvLyB0aGF0IGZvciB1cy4gU2VlIGFsc28gYmVnaW5TTWFza0dyb3VwLlxuICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdXJyZW50LnJlc3VtZVNNYXNrQ3R4O1xuICAgICAgdmFyIGN1cnJlbnRDdHggPSB0aGlzLmN0eDtcbiAgICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7XG4gICAgICB0aGlzLmdyb3VwU3RhY2sucHVzaChjdXJyZW50Q3R4KTtcbiAgICAgIHRoaXMuZ3JvdXBMZXZlbCsrO1xuICAgIH0sXG4gICAgZW5kU01hc2tHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kU01hc2tHcm91cCgpIHtcbiAgICAgIHZhciBncm91cEN0eCA9IHRoaXMuY3R4O1xuICAgICAgdGhpcy5ncm91cExldmVsLS07XG4gICAgICB0aGlzLmN0eCA9IHRoaXMuZ3JvdXBTdGFjay5wb3AoKTtcblxuICAgICAgY29tcG9zZVNNYXNrKFxuICAgICAgICB0aGlzLmN0eCxcbiAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLFxuICAgICAgICBncm91cEN0eCxcbiAgICAgICAgdGhpcy53ZWJHTENvbnRleHRcbiAgICAgICk7XG4gICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICBjb3B5Q3R4U3RhdGUoZ3JvdXBDdHgsIHRoaXMuY3R4KTtcbiAgICAgIC8vIFRyYW5zZm9ybSB3YXMgY2hhbmdlZCBpbiB0aGUgU01hc2sgY2FudmFzLCByZWZsZWN0aW5nIHRoaXMgY2hhbmdlIG9uXG4gICAgICAvLyB0aGlzLmN0eC5cbiAgICAgIHZhciBkZWx0YVRyYW5zZm9ybSA9IFV0aWwudHJhbnNmb3JtKFxuICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2suc3RhcnRUcmFuc2Zvcm1JbnZlcnNlLFxuICAgICAgICBncm91cEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtXG4gICAgICApO1xuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCBkZWx0YVRyYW5zZm9ybSk7XG4gICAgfSxcbiAgICBzYXZlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zYXZlKCkge1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgdmFyIG9sZCA9IHRoaXMuY3VycmVudDtcbiAgICAgIHRoaXMuc3RhdGVTdGFjay5wdXNoKG9sZCk7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBvbGQuY2xvbmUoKTtcbiAgICAgIHRoaXMuY3VycmVudC5yZXN1bWVTTWFza0N0eCA9IG51bGw7XG4gICAgfSxcbiAgICByZXN0b3JlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19yZXN0b3JlKCkge1xuICAgICAgLy8gU01hc2sgd2FzIHN1c3BlbmRlZCwgd2UganVzdCBuZWVkIHRvIHJlc3VtZSBpdC5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHgpIHtcbiAgICAgICAgdGhpcy5yZXN1bWVTTWFza0dyb3VwKCk7XG4gICAgICB9XG4gICAgICAvLyBTTWFzayBoYXMgdG8gYmUgZmluaXNoZWQgb25jZSB0aGVyZSBpcyBubyBzdGF0ZXMgdGhhdCBhcmUgdXNpbmcgdGhlXG4gICAgICAvLyBzYW1lIFNNYXNrLlxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgIT09IG51bGwgJiZcbiAgICAgICAgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlU3RhY2tbdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCAtIDFdLmFjdGl2ZVNNYXNrICE9PVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZW5kU01hc2tHcm91cCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnN0YXRlU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2xpcHBpbmcgcGF0aCBpcyByZXNldCAoZml4ZXMgaXNzdWU2NDEzLnBkZikuXG4gICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgdHJhbnNmb3JtOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc190cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuXG4gICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gUGF0aFxuICAgIGNvbnN0cnVjdFBhdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2NvbnN0cnVjdFBhdGgob3BzLCBhcmdzKSB7XG4gICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICAgIHZhciB4ID0gY3VycmVudC54LFxuICAgICAgICB5ID0gY3VycmVudC55O1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwLCBpaSA9IG9wcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHN3aXRjaCAob3BzW2ldIHwgMCkge1xuICAgICAgICAgIGNhc2UgT1BTLnJlY3RhbmdsZTpcbiAgICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICAgIGlmICh3aWR0aCA9PT0gMCAmJiBjdHgubGluZVdpZHRoIDwgdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpIHtcbiAgICAgICAgICAgICAgd2lkdGggPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWlnaHQgPT09IDAgJiYgY3R4LmxpbmVXaWR0aCA8IHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpKSB7XG4gICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHh3ID0geCArIHdpZHRoO1xuICAgICAgICAgICAgdmFyIHloID0geSArIGhlaWdodDtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeWgpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm1vdmVUbzpcbiAgICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmxpbmVUbzpcbiAgICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG86XG4gICAgICAgICAgICB4ID0gYXJnc1tqICsgNF07XG4gICAgICAgICAgICB5ID0gYXJnc1tqICsgNV07XG4gICAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgYXJnc1tqXSxcbiAgICAgICAgICAgICAgYXJnc1tqICsgMV0sXG4gICAgICAgICAgICAgIGFyZ3NbaiArIDJdLFxuICAgICAgICAgICAgICBhcmdzW2ogKyAzXSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGogKz0gNjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8yOlxuICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgIGFyZ3Nbal0sXG4gICAgICAgICAgICAgIGFyZ3NbaiArIDFdLFxuICAgICAgICAgICAgICBhcmdzW2ogKyAyXSxcbiAgICAgICAgICAgICAgYXJnc1tqICsgM11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG4gICAgICAgICAgICB5ID0gYXJnc1tqICsgM107XG4gICAgICAgICAgICBqICs9IDQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvMzpcbiAgICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcbiAgICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCB4LCB5LCB4LCB5KTtcbiAgICAgICAgICAgIGogKz0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXJyZW50LnNldEN1cnJlbnRQb2ludCh4LCB5KTtcbiAgICB9LFxuICAgIGNsb3NlUGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VQYXRoKCkge1xuICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gICAgfSxcbiAgICBzdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3N0cm9rZShjb25zdW1lUGF0aCkge1xuICAgICAgY29uc3VtZVBhdGggPSB0eXBlb2YgY29uc3VtZVBhdGggIT09IFwidW5kZWZpbmVkXCIgPyBjb25zdW1lUGF0aCA6IHRydWU7XG4gICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICB2YXIgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG4gICAgICAvLyBGb3Igc3Ryb2tlIHdlIHdhbnQgdG8gdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSBnbG9iYWwgYWxwaGEgdG8gdGhlXG4gICAgICAvLyBzdHJva2luZyBhbHBoYS5cbiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5zdHJva2VBbHBoYTtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzdHJva2VDb2xvciAmJlxuICAgICAgICAgIHN0cm9rZUNvbG9yLmhhc093blByb3BlcnR5KFwidHlwZVwiKSAmJlxuICAgICAgICAgIHN0cm9rZUNvbG9yLnR5cGUgPT09IFwiUGF0dGVyblwiXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGZvciBwYXR0ZXJucywgd2UgdHJhbnNmb3JtIHRvIHBhdHRlcm4gc3BhY2UsIGNhbGN1bGF0ZVxuICAgICAgICAgIC8vIHRoZSBwYXR0ZXJuLCBjYWxsIHN0cm9rZSwgYW5kIHJlc3RvcmUgdG8gdXNlciBzcGFjZVxuICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgLy8gVGhlIGN1cnJlbnQgdHJhbnNmb3JtIHdpbGwgYmUgcmVwbGFjZWQgd2hpbGUgYnVpbGRpbmcgdGhlIHBhdHRlcm4sXG4gICAgICAgICAgLy8gYnV0IHRoZSBsaW5lIHdpZHRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IHRoZSBjdXJyZW50IHRyYW5zZm9ybSxcbiAgICAgICAgICAvLyBzbyB3ZSBtdXN0IHNjYWxlIGl0LiBUbyBwcm9wZXJseSBmaXggdGhpcyB3ZSBzaG91bGQgYmUgdXNpbmcgYVxuICAgICAgICAgIC8vIHBhdHRlcm4gdHJhbnNmb3JtIGluc3RlYWQgKHNlZSAjMTA5NTUpLlxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtO1xuICAgICAgICAgIGNvbnN0IHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0cmFuc2Zvcm0pWzBdO1xuICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzKTtcbiAgICAgICAgICBjdHgubGluZVdpZHRoID0gTWF0aC5tYXgoXG4gICAgICAgICAgICB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSAqIE1JTl9XSURUSF9GQUNUT1IsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoICogc2NhbGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFByZXZlbnQgZHJhd2luZyB0b28gdGhpbiBsaW5lcyBieSBlbmZvcmNpbmcgYSBtaW5pbXVtIGxpbmUgd2lkdGguXG4gICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkgKiBNSU5fV0lEVEhfRkFDVE9SLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmxpbmVXaWR0aFxuICAgICAgICAgICk7XG4gICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uc3VtZVBhdGgpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICAgICAgfVxuICAgICAgLy8gUmVzdG9yZSB0aGUgZ2xvYmFsIGFscGhhIHRvIHRoZSBmaWxsIGFscGhhXG4gICAgICBjdHguZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuZmlsbEFscGhhO1xuICAgIH0sXG4gICAgY2xvc2VTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlU3Ryb2tlKCkge1xuICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgIHRoaXMuc3Ryb2tlKCk7XG4gICAgfSxcbiAgICBmaWxsOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19maWxsKGNvbnN1bWVQYXRoKSB7XG4gICAgICBjb25zdW1lUGF0aCA9IHR5cGVvZiBjb25zdW1lUGF0aCAhPT0gXCJ1bmRlZmluZWRcIiA/IGNvbnN1bWVQYXRoIDogdHJ1ZTtcbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgIHZhciBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgICAgdmFyIGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG4gICAgICB2YXIgbmVlZFJlc3RvcmUgPSBmYWxzZTtcblxuICAgICAgaWYgKGlzUGF0dGVybkZpbGwpIHtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVRyYW5zZm9ybSkge1xuICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3R4LCB0aGlzLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMpO1xuICAgICAgICBuZWVkUmVzdG9yZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdFT0ZpbGwpIHtcbiAgICAgICAgICBjdHguZmlsbChcImV2ZW5vZGRcIik7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmVlZFJlc3RvcmUpIHtcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25zdW1lUGF0aCkge1xuICAgICAgICB0aGlzLmNvbnN1bWVQYXRoKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBlb0ZpbGw6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VvRmlsbCgpIHtcbiAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7XG4gICAgICB0aGlzLmZpbGwoKTtcbiAgICB9LFxuICAgIGZpbGxTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2ZpbGxTdHJva2UoKSB7XG4gICAgICB0aGlzLmZpbGwoZmFsc2UpO1xuICAgICAgdGhpcy5zdHJva2UoZmFsc2UpO1xuXG4gICAgICB0aGlzLmNvbnN1bWVQYXRoKCk7XG4gICAgfSxcbiAgICBlb0ZpbGxTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VvRmlsbFN0cm9rZSgpIHtcbiAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7XG4gICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICB9LFxuICAgIGNsb3NlRmlsbFN0cm9rZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VGaWxsU3Ryb2tlKCkge1xuICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgIH0sXG4gICAgY2xvc2VFT0ZpbGxTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlRU9GaWxsU3Ryb2tlKCkge1xuICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICB9LFxuICAgIGVuZFBhdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFBhdGgoKSB7XG4gICAgICB0aGlzLmNvbnN1bWVQYXRoKCk7XG4gICAgfSxcblxuICAgIC8vIENsaXBwaW5nXG4gICAgY2xpcDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xpcCgpIHtcbiAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBOT1JNQUxfQ0xJUDtcbiAgICB9LFxuICAgIGVvQ2xpcDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW9DbGlwKCkge1xuICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IEVPX0NMSVA7XG4gICAgfSxcblxuICAgIC8vIFRleHRcbiAgICBiZWdpblRleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luVGV4dCgpIHtcbiAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gSURFTlRJVFlfTUFUUklYO1xuICAgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IDE7XG4gICAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gICAgfSxcbiAgICBlbmRUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRUZXh0KCkge1xuICAgICAgdmFyIHBhdGhzID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzO1xuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaV07XG4gICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3R4LCBwYXRoLnRyYW5zZm9ybSk7XG4gICAgICAgIGN0eC50cmFuc2xhdGUocGF0aC54LCBwYXRoLnkpO1xuICAgICAgICBwYXRoLmFkZFRvUGF0aChjdHgsIHBhdGguZm9udFNpemUpO1xuICAgICAgfVxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIGN0eC5jbGlwKCk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzO1xuICAgIH0sXG4gICAgc2V0Q2hhclNwYWNpbmc6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJTcGFjaW5nKHNwYWNpbmcpIHtcbiAgICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IHNwYWNpbmc7XG4gICAgfSxcbiAgICBzZXRXb3JkU3BhY2luZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0V29yZFNwYWNpbmcoc3BhY2luZykge1xuICAgICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gc3BhY2luZztcbiAgICB9LFxuICAgIHNldEhTY2FsZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0SFNjYWxlKHNjYWxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHNjYWxlIC8gMTAwO1xuICAgIH0sXG4gICAgc2V0TGVhZGluZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGVhZGluZyhsZWFkaW5nKSB7XG4gICAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC1sZWFkaW5nO1xuICAgIH0sXG4gICAgc2V0Rm9udDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Rm9udChmb250UmVmTmFtZSwgc2l6ZSkge1xuICAgICAgdmFyIGZvbnRPYmogPSB0aGlzLmNvbW1vbk9ianMuZ2V0KGZvbnRSZWZOYW1lKTtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXG4gICAgICBpZiAoIWZvbnRPYmopIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBmaW5kIGZvbnQgZm9yICR7Zm9udFJlZk5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQuZm9udE1hdHJpeCA9IGZvbnRPYmouZm9udE1hdHJpeFxuICAgICAgICA/IGZvbnRPYmouZm9udE1hdHJpeFxuICAgICAgICA6IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuXG4gICAgICAvLyBBIHZhbGlkIG1hdHJpeCBuZWVkcyBhbGwgbWFpbiBkaWFnb25hbCBlbGVtZW50cyB0byBiZSBub24temVyb1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgd2UgYnlwYXNzIEZGIGJ1Z3ppbGxhIGJ1ZyAjNzE5ODQ0LlxuICAgICAgaWYgKGN1cnJlbnQuZm9udE1hdHJpeFswXSA9PT0gMCB8fCBjdXJyZW50LmZvbnRNYXRyaXhbM10gPT09IDApIHtcbiAgICAgICAgd2FybihcIkludmFsaWQgZm9udCBtYXRyaXggZm9yIGZvbnQgXCIgKyBmb250UmVmTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBzcGVjIGZvciBUZiAoc2V0Rm9udCkgc2F5cyB0aGF0ICdzaXplJyBzcGVjaWZpZXMgdGhlIGZvbnQgJ3NjYWxlJyxcbiAgICAgIC8vIGFuZCBpbiBzb21lIGRvY3MgdGhpcyBjYW4gYmUgbmVnYXRpdmUgKGludmVydGVkIHgteSBheGVzKS5cbiAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICBzaXplID0gLXNpemU7XG4gICAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50LmZvbnQgPSBmb250T2JqO1xuICAgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplID0gc2l6ZTtcblxuICAgICAgaWYgKGZvbnRPYmouaXNUeXBlM0ZvbnQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyB3ZSBkb24ndCBuZWVkIGN0eC5mb250IGZvciBUeXBlMyBmb250c1xuICAgICAgfVxuXG4gICAgICB2YXIgbmFtZSA9IGZvbnRPYmoubG9hZGVkTmFtZSB8fCBcInNhbnMtc2VyaWZcIjtcblxuICAgICAgbGV0IGJvbGQgPSBcIm5vcm1hbFwiO1xuICAgICAgaWYgKGZvbnRPYmouYmxhY2spIHtcbiAgICAgICAgYm9sZCA9IFwiOTAwXCI7XG4gICAgICB9IGVsc2UgaWYgKGZvbnRPYmouYm9sZCkge1xuICAgICAgICBib2xkID0gXCJib2xkXCI7XG4gICAgICB9XG4gICAgICB2YXIgaXRhbGljID0gZm9udE9iai5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcbiAgICAgIHZhciB0eXBlZmFjZSA9IGBcIiR7bmFtZX1cIiwgJHtmb250T2JqLmZhbGxiYWNrTmFtZX1gO1xuXG4gICAgICAvLyBTb21lIGZvbnQgYmFja2VuZHMgY2Fubm90IGhhbmRsZSBmb250cyBiZWxvdyBjZXJ0YWluIHNpemUuXG4gICAgICAvLyBLZWVwaW5nIHRoZSBmb250IGF0IG1pbmltYWwgc2l6ZSBhbmQgdXNpbmcgdGhlIGZvbnRTaXplU2NhbGUgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYmVmb3JlIHRoZSBmaWxsVGV4dC9zdHJva2VUZXh0LlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjIyN1xuICAgICAgbGV0IGJyb3dzZXJGb250U2l6ZSA9IHNpemU7XG4gICAgICBpZiAoc2l6ZSA8IE1JTl9GT05UX1NJWkUpIHtcbiAgICAgICAgYnJvd3NlckZvbnRTaXplID0gTUlOX0ZPTlRfU0laRTtcbiAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IE1BWF9GT05UX1NJWkUpIHtcbiAgICAgICAgYnJvd3NlckZvbnRTaXplID0gTUFYX0ZPTlRfU0laRTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudC5mb250U2l6ZVNjYWxlID0gc2l6ZSAvIGJyb3dzZXJGb250U2l6ZTtcblxuICAgICAgdGhpcy5jdHguZm9udCA9IGAke2l0YWxpY30gJHtib2xkfSAke2Jyb3dzZXJGb250U2l6ZX1weCAke3R5cGVmYWNlfWA7XG4gICAgfSxcbiAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0VGV4dFJlbmRlcmluZ01vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gbW9kZTtcbiAgICB9LFxuICAgIHNldFRleHRSaXNlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRUZXh0UmlzZShyaXNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQudGV4dFJpc2UgPSByaXNlO1xuICAgIH0sXG4gICAgbW92ZVRleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21vdmVUZXh0KHgsIHkpIHtcbiAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYICs9IHg7XG4gICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSArPSB5O1xuICAgIH0sXG4gICAgc2V0TGVhZGluZ01vdmVUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMZWFkaW5nTW92ZVRleHQoeCwgeSkge1xuICAgICAgdGhpcy5zZXRMZWFkaW5nKC15KTtcbiAgICAgIHRoaXMubW92ZVRleHQoeCwgeSk7XG4gICAgfSxcbiAgICBzZXRUZXh0TWF0cml4OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcblxuICAgICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggPSAwO1xuICAgICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgPSAwO1xuICAgIH0sXG4gICAgbmV4dExpbmU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX25leHRMaW5lKCkge1xuICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gICAgfSxcblxuICAgIHBhaW50Q2hhcihjaGFyYWN0ZXIsIHgsIHksIHBhdHRlcm5UcmFuc2Zvcm0pIHtcbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgdmFyIGZvbnQgPSBjdXJyZW50LmZvbnQ7XG4gICAgICB2YXIgdGV4dFJlbmRlcmluZ01vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlO1xuICAgICAgdmFyIGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZSAvIGN1cnJlbnQuZm9udFNpemVTY2FsZTtcbiAgICAgIHZhciBmaWxsU3Ryb2tlTW9kZSA9XG4gICAgICAgIHRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICAgIHZhciBpc0FkZFRvUGF0aFNldCA9ICEhKFxuICAgICAgICB0ZXh0UmVuZGVyaW5nTW9kZSAmIFRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUdcbiAgICAgICk7XG4gICAgICBjb25zdCBwYXR0ZXJuRmlsbCA9IGN1cnJlbnQucGF0dGVybkZpbGwgJiYgIWZvbnQubWlzc2luZ0ZpbGU7XG5cbiAgICAgIHZhciBhZGRUb1BhdGg7XG4gICAgICBpZiAoZm9udC5kaXNhYmxlRm9udEZhY2UgfHwgaXNBZGRUb1BhdGhTZXQgfHwgcGF0dGVybkZpbGwpIHtcbiAgICAgICAgYWRkVG9QYXRoID0gZm9udC5nZXRQYXRoR2VuZXJhdG9yKHRoaXMuY29tbW9uT2JqcywgY2hhcmFjdGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IHBhdHRlcm5GaWxsKSB7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgYWRkVG9QYXRoKGN0eCwgZm9udFNpemUpO1xuICAgICAgICBpZiAocGF0dGVyblRyYW5zZm9ybSkge1xuICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3R4LCBwYXR0ZXJuVHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHxcbiAgICAgICAgICBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fFxuICAgICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRVxuICAgICAgICApIHtcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fFxuICAgICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRVxuICAgICAgICApIHtcbiAgICAgICAgICBjdHguZmlsbFRleHQoY2hhcmFjdGVyLCB4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fFxuICAgICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRVxuICAgICAgICApIHtcbiAgICAgICAgICBjdHguc3Ryb2tlVGV4dChjaGFyYWN0ZXIsIHgsIHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FkZFRvUGF0aFNldCkge1xuICAgICAgICB2YXIgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHMgfHwgKHRoaXMucGVuZGluZ1RleHRQYXRocyA9IFtdKTtcbiAgICAgICAgcGF0aHMucHVzaCh7XG4gICAgICAgICAgdHJhbnNmb3JtOiBjdHgubW96Q3VycmVudFRyYW5zZm9ybSxcbiAgICAgICAgICB4LFxuICAgICAgICAgIHksXG4gICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgYWRkVG9QYXRoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0IGlzRm9udFN1YnBpeGVsQUFFbmFibGVkKCkge1xuICAgICAgLy8gQ2hlY2tzIGlmIGFudGktYWxpYXNpbmcgaXMgZW5hYmxlZCB3aGVuIHNjYWxlZCB0ZXh0IGlzIHBhaW50ZWQuXG4gICAgICAvLyBPbiBXaW5kb3dzIEdESSBzY2FsZWQgZm9udHMgbG9va3MgYmFkLlxuICAgICAgY29uc3QgeyBjb250ZXh0OiBjdHggfSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFxuICAgICAgICBcImlzRm9udFN1YnBpeGVsQUFFbmFibGVkXCIsXG4gICAgICAgIDEwLFxuICAgICAgICAxMFxuICAgICAgKTtcbiAgICAgIGN0eC5zY2FsZSgxLjUsIDEpO1xuICAgICAgY3R4LmZpbGxUZXh0KFwiSVwiLCAwLCAxMCk7XG4gICAgICB2YXIgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMTAsIDEwKS5kYXRhO1xuICAgICAgdmFyIGVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAzOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBpZiAoZGF0YVtpXSA+IDAgJiYgZGF0YVtpXSA8IDI1NSkge1xuICAgICAgICAgIGVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIiwgZW5hYmxlZCk7XG4gICAgfSxcblxuICAgIHNob3dUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zaG93VGV4dChnbHlwaHMpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgdmFyIGZvbnQgPSBjdXJyZW50LmZvbnQ7XG4gICAgICBpZiAoZm9udC5pc1R5cGUzRm9udCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93VHlwZTNUZXh0KGdseXBocyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG4gICAgICBpZiAoZm9udFNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgdmFyIGZvbnRTaXplU2NhbGUgPSBjdXJyZW50LmZvbnRTaXplU2NhbGU7XG4gICAgICB2YXIgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nO1xuICAgICAgdmFyIHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZztcbiAgICAgIHZhciBmb250RGlyZWN0aW9uID0gY3VycmVudC5mb250RGlyZWN0aW9uO1xuICAgICAgdmFyIHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uO1xuICAgICAgdmFyIGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7XG4gICAgICB2YXIgdmVydGljYWwgPSBmb250LnZlcnRpY2FsO1xuICAgICAgdmFyIHNwYWNpbmdEaXIgPSB2ZXJ0aWNhbCA/IDEgOiAtMTtcbiAgICAgIHZhciBkZWZhdWx0Vk1ldHJpY3MgPSBmb250LmRlZmF1bHRWTWV0cmljcztcbiAgICAgIHZhciB3aWR0aEFkdmFuY2VTY2FsZSA9IGZvbnRTaXplICogY3VycmVudC5mb250TWF0cml4WzBdO1xuXG4gICAgICB2YXIgc2ltcGxlRmlsbFRleHQgPVxuICAgICAgICBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMICYmXG4gICAgICAgICFmb250LmRpc2FibGVGb250RmFjZSAmJlxuICAgICAgICAhY3VycmVudC5wYXR0ZXJuRmlsbDtcblxuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGxldCBwYXR0ZXJuVHJhbnNmb3JtO1xuICAgICAgaWYgKGN1cnJlbnQucGF0dGVybkZpbGwpIHtcbiAgICAgICAgLy8gVE9ETzogUGF0dGVybnMgYXJlIG5vdCBhcHBsaWVkIGNvcnJlY3RseSB0byB0ZXh0IGlmIGEgbm9uLWVtYmVkZGVkXG4gICAgICAgIC8vIGZvbnQgaXMgdXNlZC4gRS5nLiBpc3N1ZSA4MTExIGFuZCBTaG93VGV4dC1TaGFkaW5nUGF0dGVybi5wZGYuXG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBjdXJyZW50LmZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcyk7XG4gICAgICAgIHBhdHRlcm5UcmFuc2Zvcm0gPSBjdHgubW96Q3VycmVudFRyYW5zZm9ybTtcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm47XG4gICAgICB9XG4gICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgY3VycmVudC50ZXh0TWF0cml4KTtcbiAgICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkgKyBjdXJyZW50LnRleHRSaXNlKTtcblxuICAgICAgaWYgKGZvbnREaXJlY3Rpb24gPiAwKSB7XG4gICAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAtMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgMSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBsaW5lV2lkdGggPSBjdXJyZW50LmxpbmVXaWR0aDtcbiAgICAgIHZhciBzY2FsZSA9IGN1cnJlbnQudGV4dE1hdHJpeFNjYWxlO1xuICAgICAgaWYgKHNjYWxlID09PSAwIHx8IGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgICB2YXIgZmlsbFN0cm9rZU1vZGUgPVxuICAgICAgICAgIGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fFxuICAgICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICAgICAgICBsaW5lV2lkdGggPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSAqIE1JTl9XSURUSF9GQUNUT1I7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVXaWR0aCAvPSBzY2FsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvbnRTaXplU2NhbGUgIT09IDEuMCkge1xuICAgICAgICBjdHguc2NhbGUoZm9udFNpemVTY2FsZSwgZm9udFNpemVTY2FsZSk7XG4gICAgICAgIGxpbmVXaWR0aCAvPSBmb250U2l6ZVNjYWxlO1xuICAgICAgfVxuXG4gICAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuXG4gICAgICB2YXIgeCA9IDAsXG4gICAgICAgIGk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2ldO1xuICAgICAgICBpZiAoaXNOdW0oZ2x5cGgpKSB7XG4gICAgICAgICAgeCArPSAoc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUpIC8gMTAwMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN0b3JlTmVlZGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG4gICAgICAgIHZhciBjaGFyYWN0ZXIgPSBnbHlwaC5mb250Q2hhcjtcbiAgICAgICAgdmFyIGFjY2VudCA9IGdseXBoLmFjY2VudDtcbiAgICAgICAgdmFyIHNjYWxlZFgsIHNjYWxlZFksIHNjYWxlZEFjY2VudFgsIHNjYWxlZEFjY2VudFk7XG4gICAgICAgIHZhciB3aWR0aCA9IGdseXBoLndpZHRoO1xuICAgICAgICBpZiAodmVydGljYWwpIHtcbiAgICAgICAgICB2YXIgdm1ldHJpYywgdngsIHZ5O1xuICAgICAgICAgIHZtZXRyaWMgPSBnbHlwaC52bWV0cmljIHx8IGRlZmF1bHRWTWV0cmljcztcbiAgICAgICAgICB2eCA9IGdseXBoLnZtZXRyaWMgPyB2bWV0cmljWzFdIDogd2lkdGggKiAwLjU7XG4gICAgICAgICAgdnggPSAtdnggKiB3aWR0aEFkdmFuY2VTY2FsZTtcbiAgICAgICAgICB2eSA9IHZtZXRyaWNbMl0gKiB3aWR0aEFkdmFuY2VTY2FsZTtcblxuICAgICAgICAgIHdpZHRoID0gdm1ldHJpYyA/IC12bWV0cmljWzBdIDogd2lkdGg7XG4gICAgICAgICAgc2NhbGVkWCA9IHZ4IC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgICBzY2FsZWRZID0gKHggKyB2eSkgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjYWxlZFggPSB4IC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgICBzY2FsZWRZID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb250LnJlbWVhc3VyZSAmJiB3aWR0aCA+IDApIHtcbiAgICAgICAgICAvLyBTb21lIHN0YW5kYXJkIGZvbnRzIG1heSBub3QgaGF2ZSB0aGUgZXhhY3Qgd2lkdGg6IHJlc2NhbGUgcGVyXG4gICAgICAgICAgLy8gY2hhcmFjdGVyIGlmIG1lYXN1cmVkIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiBleHBlY3RlZCBnbHlwaCB3aWR0aFxuICAgICAgICAgIC8vIGFuZCBzdWJwaXhlbC1hYSBpcyBlbmFibGVkLCBvdGhlcndpc2UganVzdCBjZW50ZXIgdGhlIGdseXBoLlxuICAgICAgICAgIHZhciBtZWFzdXJlZFdpZHRoID1cbiAgICAgICAgICAgICgoY3R4Lm1lYXN1cmVUZXh0KGNoYXJhY3Rlcikud2lkdGggKiAxMDAwKSAvIGZvbnRTaXplKSAqXG4gICAgICAgICAgICBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgIGlmICh3aWR0aCA8IG1lYXN1cmVkV2lkdGggJiYgdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCkge1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlclNjYWxlWCA9IHdpZHRoIC8gbWVhc3VyZWRXaWR0aDtcbiAgICAgICAgICAgIHJlc3RvcmVOZWVkZWQgPSB0cnVlO1xuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGN0eC5zY2FsZShjaGFyYWN0ZXJTY2FsZVgsIDEpO1xuICAgICAgICAgICAgc2NhbGVkWCAvPSBjaGFyYWN0ZXJTY2FsZVg7XG4gICAgICAgICAgfSBlbHNlIGlmICh3aWR0aCAhPT0gbWVhc3VyZWRXaWR0aCkge1xuICAgICAgICAgICAgc2NhbGVkWCArPVxuICAgICAgICAgICAgICAoKCh3aWR0aCAtIG1lYXN1cmVkV2lkdGgpIC8gMjAwMCkgKiBmb250U2l6ZSkgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgYXR0ZW1wdCB0byBkcmF3IHRoZSBnbHlwaCBpZiBpdCBpcyBhY3R1YWxseSBpbiB0aGUgZW1iZWRkZWQgZm9udFxuICAgICAgICAvLyBmaWxlIG9yIGlmIHRoZXJlIGlzbid0IGEgZm9udCBmaWxlIHNvIHRoZSBmYWxsYmFjayBmb250IGlzIHNob3duLlxuICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZ2x5cGguaXNJbkZvbnQgfHwgZm9udC5taXNzaW5nRmlsZSkpIHtcbiAgICAgICAgICBpZiAoc2ltcGxlRmlsbFRleHQgJiYgIWFjY2VudCkge1xuICAgICAgICAgICAgLy8gY29tbW9uIGNhc2VcbiAgICAgICAgICAgIGN0eC5maWxsVGV4dChjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhaW50Q2hhcihjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFksIHBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgICAgICAgaWYgKGFjY2VudCkge1xuICAgICAgICAgICAgICBzY2FsZWRBY2NlbnRYID1cbiAgICAgICAgICAgICAgICBzY2FsZWRYICsgKGZvbnRTaXplICogYWNjZW50Lm9mZnNldC54KSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgICAgIHNjYWxlZEFjY2VudFkgPVxuICAgICAgICAgICAgICAgIHNjYWxlZFkgLSAoZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LnkpIC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgICAgICAgdGhpcy5wYWludENoYXIoXG4gICAgICAgICAgICAgICAgYWNjZW50LmZvbnRDaGFyLFxuICAgICAgICAgICAgICAgIHNjYWxlZEFjY2VudFgsXG4gICAgICAgICAgICAgICAgc2NhbGVkQWNjZW50WSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuVHJhbnNmb3JtXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYXJXaWR0aDtcbiAgICAgICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAtIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYXJXaWR0aCA9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgKyBzcGFjaW5nICogZm9udERpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB4ICs9IGNoYXJXaWR0aDtcblxuICAgICAgICBpZiAocmVzdG9yZU5lZWRlZCkge1xuICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICBjdXJyZW50LnkgLT0geDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQueCArPSB4ICogdGV4dEhTY2FsZTtcbiAgICAgIH1cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfSxcblxuICAgIHNob3dUeXBlM1RleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3Nob3dUeXBlM1RleHQoZ2x5cGhzKSB7XG4gICAgICAvLyBUeXBlMyBmb250cyAtIGVhY2ggZ2x5cGggaXMgYSBcIm1pbmktUERGXCJcbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgdmFyIGZvbnQgPSBjdXJyZW50LmZvbnQ7XG4gICAgICB2YXIgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplO1xuICAgICAgdmFyIGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG4gICAgICB2YXIgc3BhY2luZ0RpciA9IGZvbnQudmVydGljYWwgPyAxIDogLTE7XG4gICAgICB2YXIgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nO1xuICAgICAgdmFyIHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZztcbiAgICAgIHZhciB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjtcbiAgICAgIHZhciBmb250TWF0cml4ID0gY3VycmVudC5mb250TWF0cml4IHx8IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgICAgdmFyIGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7XG4gICAgICB2YXIgaXNUZXh0SW52aXNpYmxlID1cbiAgICAgICAgY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuSU5WSVNJQkxFO1xuICAgICAgdmFyIGksIGdseXBoLCB3aWR0aCwgc3BhY2luZ0xlbmd0aDtcblxuICAgICAgaWYgKGlzVGV4dEludmlzaWJsZSB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcblxuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCBjdXJyZW50LnRleHRNYXRyaXgpO1xuICAgICAgY3R4LnRyYW5zbGF0ZShjdXJyZW50LngsIGN1cnJlbnQueSk7XG5cbiAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCBmb250RGlyZWN0aW9uKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGdseXBoc0xlbmd0aDsgKytpKSB7XG4gICAgICAgIGdseXBoID0gZ2x5cGhzW2ldO1xuICAgICAgICBpZiAoaXNOdW0oZ2x5cGgpKSB7XG4gICAgICAgICAgc3BhY2luZ0xlbmd0aCA9IChzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSkgLyAxMDAwO1xuICAgICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZShzcGFjaW5nTGVuZ3RoLCAwKTtcbiAgICAgICAgICBjdXJyZW50LnggKz0gc3BhY2luZ0xlbmd0aCAqIHRleHRIU2NhbGU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nO1xuICAgICAgICB2YXIgb3BlcmF0b3JMaXN0ID0gZm9udC5jaGFyUHJvY09wZXJhdG9yTGlzdFtnbHlwaC5vcGVyYXRvckxpc3RJZF07XG4gICAgICAgIGlmICghb3BlcmF0b3JMaXN0KSB7XG4gICAgICAgICAgd2FybihgVHlwZTMgY2hhcmFjdGVyIFwiJHtnbHlwaC5vcGVyYXRvckxpc3RJZH1cIiBpcyBub3QgYXZhaWxhYmxlLmApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBnbHlwaDtcbiAgICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgICBjdHguc2NhbGUoZm9udFNpemUsIGZvbnRTaXplKTtcbiAgICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgZm9udE1hdHJpeCk7XG4gICAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHJhbnNmb3JtZWQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtnbHlwaC53aWR0aCwgMF0sIGZvbnRNYXRyaXgpO1xuICAgICAgICB3aWR0aCA9IHRyYW5zZm9ybWVkWzBdICogZm9udFNpemUgKyBzcGFjaW5nO1xuXG4gICAgICAgIGN0eC50cmFuc2xhdGUod2lkdGgsIDApO1xuICAgICAgICBjdXJyZW50LnggKz0gd2lkdGggKiB0ZXh0SFNjYWxlO1xuICAgICAgfVxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gVHlwZTMgZm9udHNcbiAgICBzZXRDaGFyV2lkdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJXaWR0aCh4V2lkdGgsIHlXaWR0aCkge1xuICAgICAgLy8gV2UgY2FuIHNhZmVseSBpZ25vcmUgdGhpcyBzaW5jZSB0aGUgd2lkdGggc2hvdWxkIGJlIHRoZSBzYW1lXG4gICAgICAvLyBhcyB0aGUgd2lkdGggaW4gdGhlIFdpZHRocyBhcnJheS5cbiAgICB9LFxuICAgIHNldENoYXJXaWR0aEFuZEJvdW5kczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Q2hhcldpZHRoQW5kQm91bmRzKFxuICAgICAgeFdpZHRoLFxuICAgICAgeVdpZHRoLFxuICAgICAgbGx4LFxuICAgICAgbGx5LFxuICAgICAgdXJ4LFxuICAgICAgdXJ5XG4gICAgKSB7XG4gICAgICAvLyBUT0RPIEFjY29yZGluZyB0byB0aGUgc3BlYyB3ZSdyZSBhbHNvIHN1cHBvc2UgdG8gaWdub3JlIGFueSBvcGVyYXRvcnNcbiAgICAgIC8vIHRoYXQgc2V0IGNvbG9yIG9yIGluY2x1ZGUgaW1hZ2VzIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0eXBlMyBmb250LlxuICAgICAgdGhpcy5jdHgucmVjdChsbHgsIGxseSwgdXJ4IC0gbGx4LCB1cnkgLSBsbHkpO1xuICAgICAgdGhpcy5jbGlwKCk7XG4gICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICB9LFxuXG4gICAgLy8gQ29sb3JcbiAgICBnZXRDb2xvck5fUGF0dGVybjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZ2V0Q29sb3JOX1BhdHRlcm4oSVIpIHtcbiAgICAgIHZhciBwYXR0ZXJuO1xuICAgICAgaWYgKElSWzBdID09PSBcIlRpbGluZ1BhdHRlcm5cIikge1xuICAgICAgICB2YXIgY29sb3IgPSBJUlsxXTtcbiAgICAgICAgdmFyIGJhc2VUcmFuc2Zvcm0gPVxuICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybSB8fCB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLnNsaWNlKCk7XG4gICAgICAgIHZhciBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB7XG4gICAgICAgICAgY3JlYXRlQ2FudmFzR3JhcGhpY3M6IGN0eCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENhbnZhc0dyYXBoaWNzKFxuICAgICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICAgIHRoaXMuY29tbW9uT2JqcyxcbiAgICAgICAgICAgICAgdGhpcy5vYmpzLFxuICAgICAgICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnksXG4gICAgICAgICAgICAgIHRoaXMud2ViR0xDb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHBhdHRlcm4gPSBuZXcgVGlsaW5nUGF0dGVybihcbiAgICAgICAgICBJUixcbiAgICAgICAgICBjb2xvcixcbiAgICAgICAgICB0aGlzLmN0eCxcbiAgICAgICAgICBjYW52YXNHcmFwaGljc0ZhY3RvcnksXG4gICAgICAgICAgYmFzZVRyYW5zZm9ybVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0dGVybiA9IGdldFNoYWRpbmdQYXR0ZXJuRnJvbUlSKElSKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXR0ZXJuO1xuICAgIH0sXG4gICAgc2V0U3Ryb2tlQ29sb3JOOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRTdHJva2VDb2xvck4oKSB7XG4gICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzZXRGaWxsQ29sb3JOOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRGaWxsQ29sb3JOKCkge1xuICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcbiAgICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IHRydWU7XG4gICAgfSxcbiAgICBzZXRTdHJva2VSR0JDb2xvcjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0U3Ryb2tlUkdCQ29sb3IociwgZywgYikge1xuICAgICAgdmFyIGNvbG9yID0gVXRpbC5tYWtlQ3NzUmdiKHIsIGcsIGIpO1xuICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IGNvbG9yO1xuICAgIH0sXG4gICAgc2V0RmlsbFJHQkNvbG9yOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRGaWxsUkdCQ29sb3IociwgZywgYikge1xuICAgICAgdmFyIGNvbG9yID0gVXRpbC5tYWtlQ3NzUmdiKHIsIGcsIGIpO1xuICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3I7XG4gICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gY29sb3I7XG4gICAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgc2hhZGluZ0ZpbGw6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NoYWRpbmdGaWxsKHBhdHRlcm5JUikge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcblxuICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICB2YXIgcGF0dGVybiA9IGdldFNoYWRpbmdQYXR0ZXJuRnJvbUlSKHBhdHRlcm5JUik7XG4gICAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybi5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgdHJ1ZSk7XG5cbiAgICAgIHZhciBpbnYgPSBjdHgubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7XG4gICAgICBpZiAoaW52KSB7XG4gICAgICAgIHZhciBjYW52YXMgPSBjdHguY2FudmFzO1xuICAgICAgICB2YXIgd2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuXG4gICAgICAgIHZhciBibCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBpbnYpO1xuICAgICAgICB2YXIgYnIgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFswLCBoZWlnaHRdLCBpbnYpO1xuICAgICAgICB2YXIgdWwgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFt3aWR0aCwgMF0sIGludik7XG4gICAgICAgIHZhciB1ciA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCBoZWlnaHRdLCBpbnYpO1xuXG4gICAgICAgIHZhciB4MCA9IE1hdGgubWluKGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTtcbiAgICAgICAgdmFyIHkwID0gTWF0aC5taW4oYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pO1xuICAgICAgICB2YXIgeDEgPSBNYXRoLm1heChibFswXSwgYnJbMF0sIHVsWzBdLCB1clswXSk7XG4gICAgICAgIHZhciB5MSA9IE1hdGgubWF4KGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTtcblxuICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSEFDSyB0byBkcmF3IHRoZSBncmFkaWVudCBvbnRvIGFuIGluZmluaXRlIHJlY3RhbmdsZS5cbiAgICAgICAgLy8gUERGIGdyYWRpZW50cyBhcmUgZHJhd24gYWNyb3NzIHRoZSBlbnRpcmUgaW1hZ2Ugd2hpbGVcbiAgICAgICAgLy8gQ2FudmFzIG9ubHkgYWxsb3dzIGdyYWRpZW50cyB0byBiZSBkcmF3biBpbiBhIHJlY3RhbmdsZVxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGJ1ZyBzaG91bGQgYWxsb3cgdXMgdG8gcmVtb3ZlIHRoaXMuXG4gICAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NDg4NFxuXG4gICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KC0xZTEwLCAtMWUxMCwgMmUxMCwgMmUxMCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH0sXG5cbiAgICAvLyBJbWFnZXNcbiAgICBiZWdpbklubGluZUltYWdlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbklubGluZUltYWdlKCkge1xuICAgICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbmxpbmVJbWFnZVwiKTtcbiAgICB9LFxuICAgIGJlZ2luSW1hZ2VEYXRhOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkltYWdlRGF0YSgpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiU2hvdWxkIG5vdCBjYWxsIGJlZ2luSW1hZ2VEYXRhXCIpO1xuICAgIH0sXG5cbiAgICBwYWludEZvcm1YT2JqZWN0QmVnaW46IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50Rm9ybVhPYmplY3RCZWdpbihcbiAgICAgIG1hdHJpeCxcbiAgICAgIGJib3hcbiAgICApIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNhdmUoKTtcbiAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5iYXNlVHJhbnNmb3JtKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0cml4KSAmJiBtYXRyaXgubGVuZ3RoID09PSA2KSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmFwcGx5KHRoaXMsIG1hdHJpeCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IHRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07XG5cbiAgICAgIGlmIChiYm94KSB7XG4gICAgICAgIHZhciB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07XG4gICAgICAgIHRoaXMuY3R4LnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuY2xpcCgpO1xuICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFpbnRGb3JtWE9iamVjdEVuZDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRGb3JtWE9iamVjdEVuZCgpIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnBvcCgpO1xuICAgIH0sXG5cbiAgICBiZWdpbkdyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkdyb3VwKGdyb3VwKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNhdmUoKTtcbiAgICAgIHZhciBjdXJyZW50Q3R4ID0gdGhpcy5jdHg7XG4gICAgICAvLyBUT0RPIG5vbi1pc29sYXRlZCBncm91cHMgLSBhY2NvcmRpbmcgdG8gUmlrIGF0IGFkb2JlIG5vbi1pc29sYXRlZFxuICAgICAgLy8gZ3JvdXAgcmVzdWx0cyBhcmVuJ3QgdXN1YWxseSB0aGF0IGRpZmZlcmVudCBhbmQgdGhleSBldmVuIGhhdmUgdG9vbHNcbiAgICAgIC8vIHRoYXQgaWdub3JlIHRoaXMgc2V0dGluZy4gTm90ZXMgZnJvbSBSaWsgb24gaW1wbGVtZW50aW5nOlxuICAgICAgLy8gLSBXaGVuIHlvdSBlbmNvdW50ZXIgYW4gdHJhbnNwYXJlbmN5IGdyb3VwLCBjcmVhdGUgYSBuZXcgY2FudmFzIHdpdGhcbiAgICAgIC8vIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBiYm94XG4gICAgICAvLyAtIGNvcHkgdGhlIGNvbnRlbnQgZnJvbSB0aGUgcHJldmlvdXMgY2FudmFzIHRvIHRoZSBuZXcgY2FudmFzXG4gICAgICAvLyAtIGRyYXcgYXMgdXN1YWxcbiAgICAgIC8vIC0gcmVtb3ZlIHRoZSBiYWNrZHJvcCBhbHBoYTpcbiAgICAgIC8vIGFscGhhTmV3ID0gMSAtICgxIC0gYWxwaGEpLygxIC0gYWxwaGFCYWNrZHJvcCkgd2l0aCAnYWxwaGEnIHRoZSBhbHBoYVxuICAgICAgLy8gdmFsdWUgb2YgeW91ciB0cmFuc3BhcmVuY3kgZ3JvdXAgYW5kICdhbHBoYUJhY2tkcm9wJyB0aGUgYWxwaGEgb2YgdGhlXG4gICAgICAvLyBiYWNrZHJvcFxuICAgICAgLy8gLSByZW1vdmUgYmFja2dyb3VuZCBjb2xvcjpcbiAgICAgIC8vIGNvbG9yTmV3ID0gY29sb3IgLSBhbHBoYU5ldyAqY29sb3JCYWNrZHJvcCAvKDEgLSBhbHBoYU5ldylcbiAgICAgIGlmICghZ3JvdXAuaXNvbGF0ZWQpIHtcbiAgICAgICAgaW5mbyhcIlRPRE86IFN1cHBvcnQgbm9uLWlzb2xhdGVkIGdyb3Vwcy5cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8ga25vY2tvdXQgLSBzdXBwb3NlZGx5IHBvc3NpYmxlIHdpdGggdGhlIGNsZXZlciB1c2Ugb2YgY29tcG9zaXRpbmdcbiAgICAgIC8vIG1vZGVzLlxuICAgICAgaWYgKGdyb3VwLmtub2Nrb3V0KSB7XG4gICAgICAgIHdhcm4oXCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50VHJhbnNmb3JtID0gY3VycmVudEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtO1xuICAgICAgaWYgKGdyb3VwLm1hdHJpeCkge1xuICAgICAgICBjdXJyZW50Q3R4LnRyYW5zZm9ybS5hcHBseShjdXJyZW50Q3R4LCBncm91cC5tYXRyaXgpO1xuICAgICAgfVxuICAgICAgaWYgKCFncm91cC5iYm94KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJvdW5kaW5nIGJveCBpcyByZXF1aXJlZC5cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2VkIG9uIHRoZSBjdXJyZW50IHRyYW5zZm9ybSBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIGJvdW5kaW5nIGJveFxuICAgICAgLy8gd2lsbCBhY3R1YWxseSBiZS5cbiAgICAgIHZhciBib3VuZHMgPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFxuICAgICAgICBncm91cC5iYm94LFxuICAgICAgICBjdXJyZW50Q3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1cbiAgICAgICk7XG4gICAgICAvLyBDbGlwIHRoZSBib3VuZGluZyBib3ggdG8gdGhlIGN1cnJlbnQgY2FudmFzLlxuICAgICAgdmFyIGNhbnZhc0JvdW5kcyA9IFtcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgY3VycmVudEN0eC5jYW52YXMud2lkdGgsXG4gICAgICAgIGN1cnJlbnRDdHguY2FudmFzLmhlaWdodCxcbiAgICAgIF07XG4gICAgICBib3VuZHMgPSBVdGlsLmludGVyc2VjdChib3VuZHMsIGNhbnZhc0JvdW5kcykgfHwgWzAsIDAsIDAsIDBdO1xuICAgICAgLy8gVXNlIGNlaWwgaW4gY2FzZSB3ZSdyZSBiZXR3ZWVuIHNpemVzIHNvIHdlIGRvbid0IGNyZWF0ZSBjYW52YXMgdGhhdCBpc1xuICAgICAgLy8gdG9vIHNtYWxsIGFuZCBtYWtlIHRoZSBjYW52YXMgYXQgbGVhc3QgMXgxIHBpeGVscy5cbiAgICAgIHZhciBvZmZzZXRYID0gTWF0aC5mbG9vcihib3VuZHNbMF0pO1xuICAgICAgdmFyIG9mZnNldFkgPSBNYXRoLmZsb29yKGJvdW5kc1sxXSk7XG4gICAgICB2YXIgZHJhd25XaWR0aCA9IE1hdGgubWF4KE1hdGguY2VpbChib3VuZHNbMl0pIC0gb2Zmc2V0WCwgMSk7XG4gICAgICB2YXIgZHJhd25IZWlnaHQgPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzNdKSAtIG9mZnNldFksIDEpO1xuICAgICAgdmFyIHNjYWxlWCA9IDEsXG4gICAgICAgIHNjYWxlWSA9IDE7XG4gICAgICBpZiAoZHJhd25XaWR0aCA+IE1BWF9HUk9VUF9TSVpFKSB7XG4gICAgICAgIHNjYWxlWCA9IGRyYXduV2lkdGggLyBNQVhfR1JPVVBfU0laRTtcbiAgICAgICAgZHJhd25XaWR0aCA9IE1BWF9HUk9VUF9TSVpFO1xuICAgICAgfVxuICAgICAgaWYgKGRyYXduSGVpZ2h0ID4gTUFYX0dST1VQX1NJWkUpIHtcbiAgICAgICAgc2NhbGVZID0gZHJhd25IZWlnaHQgLyBNQVhfR1JPVVBfU0laRTtcbiAgICAgICAgZHJhd25IZWlnaHQgPSBNQVhfR1JPVVBfU0laRTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhY2hlSWQgPSBcImdyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgICAvLyBVc2luZyB0d28gY2FjaGUgZW50cmllcyBpcyBjYXNlIGlmIG1hc2tzIGFyZSB1c2VkIG9uZSBhZnRlciBhbm90aGVyLlxuICAgICAgICBjYWNoZUlkICs9IFwiX3NtYXNrX1wiICsgKHRoaXMuc21hc2tDb3VudGVyKysgJSAyKTtcbiAgICAgIH1cbiAgICAgIHZhciBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXG4gICAgICAgIGNhY2hlSWQsXG4gICAgICAgIGRyYXduV2lkdGgsXG4gICAgICAgIGRyYXduSGVpZ2h0LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgdmFyIGdyb3VwQ3R4ID0gc2NyYXRjaENhbnZhcy5jb250ZXh0O1xuXG4gICAgICAvLyBTaW5jZSB3ZSBjcmVhdGVkIGEgbmV3IGNhbnZhcyB0aGF0IGlzIGp1c3QgdGhlIHNpemUgb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgICAgLy8gd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlIGdyb3VwIGN0eC5cbiAgICAgIGdyb3VwQ3R4LnNjYWxlKDEgLyBzY2FsZVgsIDEgLyBzY2FsZVkpO1xuICAgICAgZ3JvdXBDdHgudHJhbnNsYXRlKC1vZmZzZXRYLCAtb2Zmc2V0WSk7XG4gICAgICBncm91cEN0eC50cmFuc2Zvcm0uYXBwbHkoZ3JvdXBDdHgsIGN1cnJlbnRUcmFuc2Zvcm0pO1xuXG4gICAgICBpZiAoZ3JvdXAuc21hc2spIHtcbiAgICAgICAgLy8gU2F2aW5nIHN0YXRlIGFuZCBjYWNoZWQgbWFzayB0byBiZSB1c2VkIGluIHNldEdTdGF0ZS5cbiAgICAgICAgdGhpcy5zbWFza1N0YWNrLnB1c2goe1xuICAgICAgICAgIGNhbnZhczogc2NyYXRjaENhbnZhcy5jYW52YXMsXG4gICAgICAgICAgY29udGV4dDogZ3JvdXBDdHgsXG4gICAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZLFxuICAgICAgICAgIHNjYWxlWCxcbiAgICAgICAgICBzY2FsZVksXG4gICAgICAgICAgc3VidHlwZTogZ3JvdXAuc21hc2suc3VidHlwZSxcbiAgICAgICAgICBiYWNrZHJvcDogZ3JvdXAuc21hc2suYmFja2Ryb3AsXG4gICAgICAgICAgdHJhbnNmZXJNYXA6IGdyb3VwLnNtYXNrLnRyYW5zZmVyTWFwIHx8IG51bGwsXG4gICAgICAgICAgc3RhcnRUcmFuc2Zvcm1JbnZlcnNlOiBudWxsLCAvLyB1c2VkIGR1cmluZyBzdXNwZW5kIG9wZXJhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNldHVwIHRoZSBjdXJyZW50IGN0eCBzbyB3aGVuIHRoZSBncm91cCBpcyBwb3BwZWQgd2UgZHJhdyBpdCBhdCB0aGVcbiAgICAgICAgLy8gcmlnaHQgbG9jYXRpb24uXG4gICAgICAgIGN1cnJlbnRDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICBjdXJyZW50Q3R4LnRyYW5zbGF0ZShvZmZzZXRYLCBvZmZzZXRZKTtcbiAgICAgICAgY3VycmVudEN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgdHJhbnNwYXJlbmN5IGdyb3VwIGluaGVyaXRzIGFsbCBvZmYgdGhlIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGVcbiAgICAgIC8vIGV4Y2VwdCB0aGUgYmxlbmQgbW9kZSwgc29mdCBtYXNrLCBhbmQgYWxwaGEgY29uc3RhbnRzLlxuICAgICAgY29weUN0eFN0YXRlKGN1cnJlbnRDdHgsIGdyb3VwQ3R4KTtcbiAgICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7XG4gICAgICB0aGlzLnNldEdTdGF0ZShbXG4gICAgICAgIFtcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sXG4gICAgICAgIFtcImNhXCIsIDFdLFxuICAgICAgICBbXCJDQVwiLCAxXSxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5ncm91cFN0YWNrLnB1c2goY3VycmVudEN0eCk7XG4gICAgICB0aGlzLmdyb3VwTGV2ZWwrKztcblxuICAgICAgLy8gUmVzZXRpbmcgbWFzayBzdGF0ZSwgbWFza3Mgd2lsbCBiZSBhcHBsaWVkIG9uIHJlc3RvcmUgb2YgdGhlIGdyb3VwLlxuICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICB9LFxuXG4gICAgZW5kR3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEdyb3VwKGdyb3VwKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5ncm91cExldmVsLS07XG4gICAgICB2YXIgZ3JvdXBDdHggPSB0aGlzLmN0eDtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpO1xuICAgICAgLy8gVHVybiBvZmYgaW1hZ2Ugc21vb3RoaW5nIHRvIGF2b2lkIHN1YiBwaXhlbCBpbnRlcnBvbGF0aW9uIHdoaWNoIGNhblxuICAgICAgLy8gbG9vayBraW5kIG9mIGJsdXJyeSBmb3Igc29tZSBwZGZzLlxuICAgICAgaWYgKHRoaXMuY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdHgubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZ3JvdXAuc21hc2spIHtcbiAgICAgICAgdGhpcy50ZW1wU01hc2sgPSB0aGlzLnNtYXNrU3RhY2sucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UoZ3JvdXBDdHguY2FudmFzLCAwLCAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH0sXG5cbiAgICBiZWdpbkFubm90YXRpb25zOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkFubm90YXRpb25zKCkge1xuICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICBpZiAodGhpcy5iYXNlVHJhbnNmb3JtKSB7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgdGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZW5kQW5ub3RhdGlvbnM6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEFubm90YXRpb25zKCkge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSxcblxuICAgIGJlZ2luQW5ub3RhdGlvbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5Bbm5vdGF0aW9uKFxuICAgICAgcmVjdCxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIG1hdHJpeFxuICAgICkge1xuICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSgpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWN0KSAmJiByZWN0Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICB2YXIgd2lkdGggPSByZWN0WzJdIC0gcmVjdFswXTtcbiAgICAgICAgdmFyIGhlaWdodCA9IHJlY3RbM10gLSByZWN0WzFdO1xuICAgICAgICB0aGlzLmN0eC5yZWN0KHJlY3RbMF0sIHJlY3RbMV0sIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmNsaXAoKTtcbiAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJhbnNmb3JtLmFwcGx5KHRoaXMsIHRyYW5zZm9ybSk7XG4gICAgICB0aGlzLnRyYW5zZm9ybS5hcHBseSh0aGlzLCBtYXRyaXgpO1xuICAgIH0sXG5cbiAgICBlbmRBbm5vdGF0aW9uOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRBbm5vdGF0aW9uKCkge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSxcblxuICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZU1hc2tYT2JqZWN0KGltZykge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgIHZhciB3aWR0aCA9IGltZy53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICAgIHZhciBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgICAgdmFyIGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG5cbiAgICAgIHZhciBnbHlwaCA9IHRoaXMucHJvY2Vzc2luZ1R5cGUzO1xuXG4gICAgICBpZiAoQ09NUElMRV9UWVBFM19HTFlQSFMgJiYgZ2x5cGggJiYgZ2x5cGguY29tcGlsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAod2lkdGggPD0gTUFYX1NJWkVfVE9fQ09NUElMRSAmJiBoZWlnaHQgPD0gTUFYX1NJWkVfVE9fQ09NUElMRSkge1xuICAgICAgICAgIGdseXBoLmNvbXBpbGVkID0gY29tcGlsZVR5cGUzR2x5cGgoeyBkYXRhOiBpbWcuZGF0YSwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnbHlwaC5jb21waWxlZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGdseXBoICYmIGdseXBoLmNvbXBpbGVkKSB7XG4gICAgICAgIGdseXBoLmNvbXBpbGVkKGN0eCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcbiAgICAgICAgXCJtYXNrQ2FudmFzXCIsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgICk7XG4gICAgICB2YXIgbWFza0N0eCA9IG1hc2tDYW52YXMuY29udGV4dDtcbiAgICAgIG1hc2tDdHguc2F2ZSgpO1xuXG4gICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0N0eCwgaW1nKTtcblxuICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuXG4gICAgICBtYXNrQ3R4LmZpbGxTdHlsZSA9IGlzUGF0dGVybkZpbGxcbiAgICAgICAgPyBmaWxsQ29sb3IuZ2V0UGF0dGVybihtYXNrQ3R4LCB0aGlzKVxuICAgICAgICA6IGZpbGxDb2xvcjtcbiAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgIG1hc2tDdHgucmVzdG9yZSgpO1xuXG4gICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KG1hc2tDYW52YXMuY2FudmFzKTtcbiAgICB9LFxuXG4gICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KFxuICAgICAgaW1nRGF0YSxcbiAgICAgIHNjYWxlWCxcbiAgICAgIHNrZXdYID0gMCxcbiAgICAgIHNrZXdZID0gMCxcbiAgICAgIHNjYWxlWSxcbiAgICAgIHBvc2l0aW9uc1xuICAgICkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG4gICAgICB2YXIgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjtcbiAgICAgIHZhciBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuXG4gICAgICB2YXIgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFxuICAgICAgICBcIm1hc2tDYW52YXNcIixcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgKTtcbiAgICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0O1xuICAgICAgbWFza0N0eC5zYXZlKCk7XG5cbiAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ3R4LCBpbWdEYXRhKTtcblxuICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuXG4gICAgICBtYXNrQ3R4LmZpbGxTdHlsZSA9IGlzUGF0dGVybkZpbGxcbiAgICAgICAgPyBmaWxsQ29sb3IuZ2V0UGF0dGVybihtYXNrQ3R4LCB0aGlzKVxuICAgICAgICA6IGZpbGxDb2xvcjtcbiAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgIG1hc2tDdHgucmVzdG9yZSgpO1xuXG4gICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBjdHgudHJhbnNmb3JtKFxuICAgICAgICAgIHNjYWxlWCxcbiAgICAgICAgICBza2V3WCxcbiAgICAgICAgICBza2V3WSxcbiAgICAgICAgICBzY2FsZVksXG4gICAgICAgICAgcG9zaXRpb25zW2ldLFxuICAgICAgICAgIHBvc2l0aW9uc1tpICsgMV1cbiAgICAgICAgKTtcbiAgICAgICAgY3R4LnNjYWxlKDEsIC0xKTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShtYXNrQ2FudmFzLmNhbnZhcywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEsIDEpO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXAoXG4gICAgICBpbWFnZXNcbiAgICApIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG5cbiAgICAgIHZhciBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgICAgdmFyIGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbWFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICB2YXIgaW1hZ2UgPSBpbWFnZXNbaV07XG4gICAgICAgIHZhciB3aWR0aCA9IGltYWdlLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuICAgICAgICB2YXIgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFxuICAgICAgICAgIFwibWFza0NhbnZhc1wiLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodFxuICAgICAgICApO1xuICAgICAgICB2YXIgbWFza0N0eCA9IG1hc2tDYW52YXMuY29udGV4dDtcbiAgICAgICAgbWFza0N0eC5zYXZlKCk7XG5cbiAgICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDdHgsIGltYWdlKTtcblxuICAgICAgICBtYXNrQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWluXCI7XG5cbiAgICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsXG4gICAgICAgICAgPyBmaWxsQ29sb3IuZ2V0UGF0dGVybihtYXNrQ3R4LCB0aGlzKVxuICAgICAgICAgIDogZmlsbENvbG9yO1xuICAgICAgICBtYXNrQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIG1hc2tDdHgucmVzdG9yZSgpO1xuXG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCBpbWFnZS50cmFuc2Zvcm0pO1xuICAgICAgICBjdHguc2NhbGUoMSwgLTEpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKG1hc2tDYW52YXMuY2FudmFzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSwgMSk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhaW50SW1hZ2VYT2JqZWN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlWE9iamVjdChvYmpJZCkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltZ0RhdGEgPSBvYmpJZC5zdGFydHNXaXRoKFwiZ19cIilcbiAgICAgICAgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KG9iaklkKVxuICAgICAgICA6IHRoaXMub2Jqcy5nZXQob2JqSWQpO1xuICAgICAgaWYgKCFpbWdEYXRhKSB7XG4gICAgICAgIHdhcm4oXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSk7XG4gICAgfSxcblxuICAgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlWE9iamVjdFJlcGVhdChcbiAgICAgIG9iaklkLFxuICAgICAgc2NhbGVYLFxuICAgICAgc2NhbGVZLFxuICAgICAgcG9zaXRpb25zXG4gICAgKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW1nRGF0YSA9IG9iaklkLnN0YXJ0c1dpdGgoXCJnX1wiKVxuICAgICAgICA/IHRoaXMuY29tbW9uT2Jqcy5nZXQob2JqSWQpXG4gICAgICAgIDogdGhpcy5vYmpzLmdldChvYmpJZCk7XG4gICAgICBpZiAoIWltZ0RhdGEpIHtcbiAgICAgICAgd2FybihcIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcbiAgICAgIHZhciBtYXAgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICB0cmFuc2Zvcm06IFtzY2FsZVgsIDAsIDAsIHNjYWxlWSwgcG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdXSxcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgdzogd2lkdGgsXG4gICAgICAgICAgaDogaGVpZ2h0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cChpbWdEYXRhLCBtYXApO1xuICAgIH0sXG5cbiAgICBwYWludElubGluZUltYWdlWE9iamVjdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoXG4gICAgICBpbWdEYXRhXG4gICAgKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcblxuICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAvLyBzY2FsZSB0aGUgaW1hZ2UgdG8gdGhlIHVuaXQgc3F1YXJlXG4gICAgICBjdHguc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG5cbiAgICAgIHZhciBjdXJyZW50VHJhbnNmb3JtID0gY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlO1xuICAgICAgdmFyIGEgPSBjdXJyZW50VHJhbnNmb3JtWzBdLFxuICAgICAgICBiID0gY3VycmVudFRyYW5zZm9ybVsxXTtcbiAgICAgIHZhciB3aWR0aFNjYWxlID0gTWF0aC5tYXgoTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpLCAxKTtcbiAgICAgIHZhciBjID0gY3VycmVudFRyYW5zZm9ybVsyXSxcbiAgICAgICAgZCA9IGN1cnJlbnRUcmFuc2Zvcm1bM107XG4gICAgICB2YXIgaGVpZ2h0U2NhbGUgPSBNYXRoLm1heChNYXRoLnNxcnQoYyAqIGMgKyBkICogZCksIDEpO1xuXG4gICAgICB2YXIgaW1nVG9QYWludCwgdG1wQ2FudmFzO1xuICAgICAgLy8gdHlwZW9mIGNoZWNrIGlzIG5lZWRlZCBkdWUgdG8gbm9kZS5qcyBzdXBwb3J0LCBzZWUgaXNzdWUgIzg0ODlcbiAgICAgIGlmIChcbiAgICAgICAgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgfHxcbiAgICAgICAgIWltZ0RhdGEuZGF0YVxuICAgICAgKSB7XG4gICAgICAgIGltZ1RvUGFpbnQgPSBpbWdEYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhLCB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzKTtcbiAgICAgICAgaW1nVG9QYWludCA9IHRtcENhbnZhcy5jYW52YXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBwYWludFdpZHRoID0gd2lkdGgsXG4gICAgICAgIHBhaW50SGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgdmFyIHRtcENhbnZhc0lkID0gXCJwcmVzY2FsZTFcIjtcbiAgICAgIC8vIFZlcnRpY2FsIG9yIGhvcml6b250YWwgc2NhbGluZyBzaGFsbCBub3QgYmUgbW9yZSB0aGFuIDIgdG8gbm90IGxvc2UgdGhlXG4gICAgICAvLyBwaXhlbHMgZHVyaW5nIGRyYXdJbWFnZSBvcGVyYXRpb24sIHBhaW50aW5nIG9uIHRoZSB0ZW1wb3JhcnkgY2FudmFzKGVzKVxuICAgICAgLy8gdGhhdCBhcmUgdHdpY2Ugc21hbGxlciBpbiBzaXplLlxuICAgICAgd2hpbGUgKFxuICAgICAgICAod2lkdGhTY2FsZSA+IDIgJiYgcGFpbnRXaWR0aCA+IDEpIHx8XG4gICAgICAgIChoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBuZXdXaWR0aCA9IHBhaW50V2lkdGgsXG4gICAgICAgICAgbmV3SGVpZ2h0ID0gcGFpbnRIZWlnaHQ7XG4gICAgICAgIGlmICh3aWR0aFNjYWxlID4gMiAmJiBwYWludFdpZHRoID4gMSkge1xuICAgICAgICAgIG5ld1dpZHRoID0gTWF0aC5jZWlsKHBhaW50V2lkdGggLyAyKTtcbiAgICAgICAgICB3aWR0aFNjYWxlIC89IHBhaW50V2lkdGggLyBuZXdXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVpZ2h0U2NhbGUgPiAyICYmIHBhaW50SGVpZ2h0ID4gMSkge1xuICAgICAgICAgIG5ld0hlaWdodCA9IE1hdGguY2VpbChwYWludEhlaWdodCAvIDIpO1xuICAgICAgICAgIGhlaWdodFNjYWxlIC89IHBhaW50SGVpZ2h0IC8gbmV3SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFxuICAgICAgICAgIHRtcENhbnZhc0lkLFxuICAgICAgICAgIG5ld1dpZHRoLFxuICAgICAgICAgIG5ld0hlaWdodFxuICAgICAgICApO1xuICAgICAgICB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICAgICAgdG1wQ3R4LmNsZWFyUmVjdCgwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgICAgdG1wQ3R4LmRyYXdJbWFnZShcbiAgICAgICAgICBpbWdUb1BhaW50LFxuICAgICAgICAgIDAsXG4gICAgICAgICAgMCxcbiAgICAgICAgICBwYWludFdpZHRoLFxuICAgICAgICAgIHBhaW50SGVpZ2h0LFxuICAgICAgICAgIDAsXG4gICAgICAgICAgMCxcbiAgICAgICAgICBuZXdXaWR0aCxcbiAgICAgICAgICBuZXdIZWlnaHRcbiAgICAgICAgKTtcbiAgICAgICAgaW1nVG9QYWludCA9IHRtcENhbnZhcy5jYW52YXM7XG4gICAgICAgIHBhaW50V2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgcGFpbnRIZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgIHRtcENhbnZhc0lkID0gdG1wQ2FudmFzSWQgPT09IFwicHJlc2NhbGUxXCIgPyBcInByZXNjYWxlMlwiIDogXCJwcmVzY2FsZTFcIjtcbiAgICAgIH1cbiAgICAgIGN0eC5kcmF3SW1hZ2UoXG4gICAgICAgIGltZ1RvUGFpbnQsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIHBhaW50V2lkdGgsXG4gICAgICAgIHBhaW50SGVpZ2h0LFxuICAgICAgICAwLFxuICAgICAgICAtaGVpZ2h0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5pbWFnZUxheWVyKSB7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuZ2V0Q2FudmFzUG9zaXRpb24oMCwgLWhlaWdodCk7XG4gICAgICAgIHRoaXMuaW1hZ2VMYXllci5hcHBlbmRJbWFnZSh7XG4gICAgICAgICAgaW1nRGF0YSxcbiAgICAgICAgICBsZWZ0OiBwb3NpdGlvblswXSxcbiAgICAgICAgICB0b3A6IHBvc2l0aW9uWzFdLFxuICAgICAgICAgIHdpZHRoOiB3aWR0aCAvIGN1cnJlbnRUcmFuc2Zvcm1bMF0sXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLyBjdXJyZW50VHJhbnNmb3JtWzNdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH0sXG5cbiAgICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKFxuICAgICAgaW1nRGF0YSxcbiAgICAgIG1hcFxuICAgICkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgIHZhciB3ID0gaW1nRGF0YS53aWR0aDtcbiAgICAgIHZhciBoID0gaW1nRGF0YS5oZWlnaHQ7XG5cbiAgICAgIHZhciB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIHcsIGgpO1xuICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgcHV0QmluYXJ5SW1hZ2VEYXRhKHRtcEN0eCwgaW1nRGF0YSwgdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG1hcC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IG1hcFtpXTtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIGVudHJ5LnRyYW5zZm9ybSk7XG4gICAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoXG4gICAgICAgICAgdG1wQ2FudmFzLmNhbnZhcyxcbiAgICAgICAgICBlbnRyeS54LFxuICAgICAgICAgIGVudHJ5LnksXG4gICAgICAgICAgZW50cnkudyxcbiAgICAgICAgICBlbnRyeS5oLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgLTEsXG4gICAgICAgICAgMSxcbiAgICAgICAgICAxXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHtcbiAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldENhbnZhc1Bvc2l0aW9uKGVudHJ5LngsIGVudHJ5LnkpO1xuICAgICAgICAgIHRoaXMuaW1hZ2VMYXllci5hcHBlbmRJbWFnZSh7XG4gICAgICAgICAgICBpbWdEYXRhLFxuICAgICAgICAgICAgbGVmdDogcG9zaXRpb25bMF0sXG4gICAgICAgICAgICB0b3A6IHBvc2l0aW9uWzFdLFxuICAgICAgICAgICAgd2lkdGg6IHcsXG4gICAgICAgICAgICBoZWlnaHQ6IGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgfSxcblxuICAgIC8vIE1hcmtlZCBjb250ZW50XG5cbiAgICBtYXJrUG9pbnQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21hcmtQb2ludCh0YWcpIHtcbiAgICAgIC8vIFRPRE8gTWFya2VkIGNvbnRlbnQuXG4gICAgfSxcbiAgICBtYXJrUG9pbnRQcm9wczogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfbWFya1BvaW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBUT0RPIE1hcmtlZCBjb250ZW50LlxuICAgIH0sXG4gICAgYmVnaW5NYXJrZWRDb250ZW50OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbk1hcmtlZENvbnRlbnQodGFnKSB7XG4gICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luTWFya2VkQ29udGVudFByb3BzKFxuICAgICAgdGFnLFxuICAgICAgcHJvcGVydGllc1xuICAgICkge1xuICAgICAgaWYgKHRhZyA9PT0gXCJPQ1wiKSB7XG4gICAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuICAgICAgICAgIHZpc2libGU6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShwcm9wZXJ0aWVzKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgICB9LFxuICAgIGVuZE1hcmtlZENvbnRlbnQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZE1hcmtlZENvbnRlbnQoKSB7XG4gICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wb3AoKTtcbiAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgICB9LFxuXG4gICAgLy8gQ29tcGF0aWJpbGl0eVxuXG4gICAgYmVnaW5Db21wYXQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luQ29tcGF0KCkge1xuICAgICAgLy8gVE9ETyBpZ25vcmUgdW5kZWZpbmVkIG9wZXJhdG9ycyAoc2hvdWxkIHdlIGRvIHRoYXQgYW55d2F5PylcbiAgICB9LFxuICAgIGVuZENvbXBhdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kQ29tcGF0KCkge1xuICAgICAgLy8gVE9ETyBzdG9wIGlnbm9yaW5nIHVuZGVmaW5lZCBvcGVyYXRvcnNcbiAgICB9LFxuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuXG4gICAgY29uc3VtZVBhdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2NvbnN1bWVQYXRoKCkge1xuICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXAgPT09IEVPX0NMSVApIHtcbiAgICAgICAgICBjdHguY2xpcChcImV2ZW5vZGRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4LmNsaXAoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICB9LFxuICAgIGdldFNpbmdsZVBpeGVsV2lkdGgoc2NhbGUpIHtcbiAgICAgIGlmICh0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGludmVyc2UgPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTtcbiAgICAgICAgLy8gbWF4IG9mIHRoZSBjdXJyZW50IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHNjYWxlXG4gICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBNYXRoLnNxcnQoXG4gICAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgICBpbnZlcnNlWzBdICogaW52ZXJzZVswXSArIGludmVyc2VbMV0gKiBpbnZlcnNlWzFdLFxuICAgICAgICAgICAgaW52ZXJzZVsyXSAqIGludmVyc2VbMl0gKyBpbnZlcnNlWzNdICogaW52ZXJzZVszXVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoO1xuICAgIH0sXG4gICAgZ2V0Q2FudmFzUG9zaXRpb246IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2dldENhbnZhc1Bvc2l0aW9uKHgsIHkpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdHJhbnNmb3JtWzBdICogeCArIHRyYW5zZm9ybVsyXSAqIHkgKyB0cmFuc2Zvcm1bNF0sXG4gICAgICAgIHRyYW5zZm9ybVsxXSAqIHggKyB0cmFuc2Zvcm1bM10gKiB5ICsgdHJhbnNmb3JtWzVdLFxuICAgICAgXTtcbiAgICB9LFxuXG4gICAgaXNDb250ZW50VmlzaWJsZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfaXNDb250ZW50VmlzaWJsZSgpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoIXRoaXMubWFya2VkQ29udGVudFN0YWNrW2ldLnZpc2libGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG5cbiAgZm9yICh2YXIgb3AgaW4gT1BTKSB7XG4gICAgQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW09QU1tvcF1dID0gQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW29wXTtcbiAgfVxuXG4gIHJldHVybiBDYW52YXNHcmFwaGljcztcbn0pKCk7XG5cbmV4cG9ydCB7IENhbnZhc0dyYXBoaWNzIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRm9ybWF0RXJyb3IsIGluZm8sIFV0aWwgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxudmFyIFNoYWRpbmdJUnMgPSB7fTtcblxuZnVuY3Rpb24gYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpIHtcbiAgaWYgKCFiYm94IHx8IHR5cGVvZiBQYXRoMkQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTtcbiAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07XG4gIGNvbnN0IHJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcbiAgcmVnaW9uLnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gIGN0eC5jbGlwKHJlZ2lvbik7XG59XG5cblNoYWRpbmdJUnMuUmFkaWFsQXhpYWwgPSB7XG4gIGZyb21JUjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZnJvbUlSKHJhdykge1xuICAgIHZhciB0eXBlID0gcmF3WzFdO1xuICAgIHZhciBiYm94ID0gcmF3WzJdO1xuICAgIHZhciBjb2xvclN0b3BzID0gcmF3WzNdO1xuICAgIHZhciBwMCA9IHJhd1s0XTtcbiAgICB2YXIgcDEgPSByYXdbNV07XG4gICAgdmFyIHIwID0gcmF3WzZdO1xuICAgIHZhciByMSA9IHJhd1s3XTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJQYXR0ZXJuXCIsXG4gICAgICBnZXRQYXR0ZXJuOiBmdW5jdGlvbiBSYWRpYWxBeGlhbF9nZXRQYXR0ZXJuKGN0eCkge1xuICAgICAgICBhcHBseUJvdW5kaW5nQm94KGN0eCwgYmJveCk7XG4gICAgICAgIHZhciBncmFkO1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJheGlhbFwiKSB7XG4gICAgICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudChwMFswXSwgcDBbMV0sIHAxWzBdLCBwMVsxXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyYWRpYWxcIikge1xuICAgICAgICAgIGdyYWQgPSBjdHguY3JlYXRlUmFkaWFsR3JhZGllbnQocDBbMF0sIHAwWzFdLCByMCwgcDFbMF0sIHAxWzFdLCByMSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjb2xvclN0b3BzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICB2YXIgYyA9IGNvbG9yU3RvcHNbaV07XG4gICAgICAgICAgZ3JhZC5hZGRDb2xvclN0b3AoY1swXSwgY1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyYWQ7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuXG52YXIgY3JlYXRlTWVzaENhbnZhcyA9IChmdW5jdGlvbiBjcmVhdGVNZXNoQ2FudmFzQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHAxLCBwMiwgcDMsIGMxLCBjMiwgYzMpIHtcbiAgICAvLyBWZXJ5IGJhc2ljIEdvdXJhdWQtc2hhZGVkIHRyaWFuZ2xlIHJhc3Rlcml6YXRpb24gYWxnb3JpdGhtLlxuICAgIHZhciBjb29yZHMgPSBjb250ZXh0LmNvb3JkcyxcbiAgICAgIGNvbG9ycyA9IGNvbnRleHQuY29sb3JzO1xuICAgIHZhciBieXRlcyA9IGRhdGEuZGF0YSxcbiAgICAgIHJvd1NpemUgPSBkYXRhLndpZHRoICogNDtcbiAgICB2YXIgdG1wO1xuICAgIGlmIChjb29yZHNbcDEgKyAxXSA+IGNvb3Jkc1twMiArIDFdKSB7XG4gICAgICB0bXAgPSBwMTtcbiAgICAgIHAxID0gcDI7XG4gICAgICBwMiA9IHRtcDtcbiAgICAgIHRtcCA9IGMxO1xuICAgICAgYzEgPSBjMjtcbiAgICAgIGMyID0gdG1wO1xuICAgIH1cbiAgICBpZiAoY29vcmRzW3AyICsgMV0gPiBjb29yZHNbcDMgKyAxXSkge1xuICAgICAgdG1wID0gcDI7XG4gICAgICBwMiA9IHAzO1xuICAgICAgcDMgPSB0bXA7XG4gICAgICB0bXAgPSBjMjtcbiAgICAgIGMyID0gYzM7XG4gICAgICBjMyA9IHRtcDtcbiAgICB9XG4gICAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHtcbiAgICAgIHRtcCA9IHAxO1xuICAgICAgcDEgPSBwMjtcbiAgICAgIHAyID0gdG1wO1xuICAgICAgdG1wID0gYzE7XG4gICAgICBjMSA9IGMyO1xuICAgICAgYzIgPSB0bXA7XG4gICAgfVxuICAgIHZhciB4MSA9IChjb29yZHNbcDFdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuICAgIHZhciB5MSA9IChjb29yZHNbcDEgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcbiAgICB2YXIgeDIgPSAoY29vcmRzW3AyXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcbiAgICB2YXIgeTIgPSAoY29vcmRzW3AyICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG4gICAgdmFyIHgzID0gKGNvb3Jkc1twM10gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG4gICAgdmFyIHkzID0gKGNvb3Jkc1twMyArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuICAgIGlmICh5MSA+PSB5Mykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYzFyID0gY29sb3JzW2MxXSxcbiAgICAgIGMxZyA9IGNvbG9yc1tjMSArIDFdLFxuICAgICAgYzFiID0gY29sb3JzW2MxICsgMl07XG4gICAgdmFyIGMyciA9IGNvbG9yc1tjMl0sXG4gICAgICBjMmcgPSBjb2xvcnNbYzIgKyAxXSxcbiAgICAgIGMyYiA9IGNvbG9yc1tjMiArIDJdO1xuICAgIHZhciBjM3IgPSBjb2xvcnNbYzNdLFxuICAgICAgYzNnID0gY29sb3JzW2MzICsgMV0sXG4gICAgICBjM2IgPSBjb2xvcnNbYzMgKyAyXTtcblxuICAgIHZhciBtaW5ZID0gTWF0aC5yb3VuZCh5MSksXG4gICAgICBtYXhZID0gTWF0aC5yb3VuZCh5Myk7XG4gICAgdmFyIHhhLCBjYXIsIGNhZywgY2FiO1xuICAgIHZhciB4YiwgY2JyLCBjYmcsIGNiYjtcbiAgICBmb3IgKHZhciB5ID0gbWluWTsgeSA8PSBtYXhZOyB5KyspIHtcbiAgICAgIGlmICh5IDwgeTIpIHtcbiAgICAgICAgbGV0IGs7XG4gICAgICAgIGlmICh5IDwgeTEpIHtcbiAgICAgICAgICBrID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh5MSA9PT0geTIpIHtcbiAgICAgICAgICBrID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrID0gKHkxIC0geSkgLyAoeTEgLSB5Mik7XG4gICAgICAgIH1cbiAgICAgICAgeGEgPSB4MSAtICh4MSAtIHgyKSAqIGs7XG4gICAgICAgIGNhciA9IGMxciAtIChjMXIgLSBjMnIpICogaztcbiAgICAgICAgY2FnID0gYzFnIC0gKGMxZyAtIGMyZykgKiBrO1xuICAgICAgICBjYWIgPSBjMWIgLSAoYzFiIC0gYzJiKSAqIGs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgaztcbiAgICAgICAgaWYgKHkgPiB5Mykge1xuICAgICAgICAgIGsgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHkyID09PSB5Mykge1xuICAgICAgICAgIGsgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGsgPSAoeTIgLSB5KSAvICh5MiAtIHkzKTtcbiAgICAgICAgfVxuICAgICAgICB4YSA9IHgyIC0gKHgyIC0geDMpICogaztcbiAgICAgICAgY2FyID0gYzJyIC0gKGMyciAtIGMzcikgKiBrO1xuICAgICAgICBjYWcgPSBjMmcgLSAoYzJnIC0gYzNnKSAqIGs7XG4gICAgICAgIGNhYiA9IGMyYiAtIChjMmIgLSBjM2IpICogaztcbiAgICAgIH1cblxuICAgICAgbGV0IGs7XG4gICAgICBpZiAoeSA8IHkxKSB7XG4gICAgICAgIGsgPSAwO1xuICAgICAgfSBlbHNlIGlmICh5ID4geTMpIHtcbiAgICAgICAgayA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrID0gKHkxIC0geSkgLyAoeTEgLSB5Myk7XG4gICAgICB9XG4gICAgICB4YiA9IHgxIC0gKHgxIC0geDMpICogaztcbiAgICAgIGNiciA9IGMxciAtIChjMXIgLSBjM3IpICogaztcbiAgICAgIGNiZyA9IGMxZyAtIChjMWcgLSBjM2cpICogaztcbiAgICAgIGNiYiA9IGMxYiAtIChjMWIgLSBjM2IpICogaztcbiAgICAgIHZhciB4MV8gPSBNYXRoLnJvdW5kKE1hdGgubWluKHhhLCB4YikpO1xuICAgICAgdmFyIHgyXyA9IE1hdGgucm91bmQoTWF0aC5tYXgoeGEsIHhiKSk7XG4gICAgICB2YXIgaiA9IHJvd1NpemUgKiB5ICsgeDFfICogNDtcbiAgICAgIGZvciAodmFyIHggPSB4MV87IHggPD0geDJfOyB4KyspIHtcbiAgICAgICAgayA9ICh4YSAtIHgpIC8gKHhhIC0geGIpO1xuICAgICAgICBpZiAoayA8IDApIHtcbiAgICAgICAgICBrID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChrID4gMSkge1xuICAgICAgICAgIGsgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGVzW2orK10gPSAoY2FyIC0gKGNhciAtIGNicikgKiBrKSB8IDA7XG4gICAgICAgIGJ5dGVzW2orK10gPSAoY2FnIC0gKGNhZyAtIGNiZykgKiBrKSB8IDA7XG4gICAgICAgIGJ5dGVzW2orK10gPSAoY2FiIC0gKGNhYiAtIGNiYikgKiBrKSB8IDA7XG4gICAgICAgIGJ5dGVzW2orK10gPSAyNTU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmUsIGNvbnRleHQpIHtcbiAgICB2YXIgcHMgPSBmaWd1cmUuY29vcmRzO1xuICAgIHZhciBjcyA9IGZpZ3VyZS5jb2xvcnM7XG4gICAgdmFyIGksIGlpO1xuICAgIHN3aXRjaCAoZmlndXJlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJsYXR0aWNlXCI6XG4gICAgICAgIHZhciB2ZXJ0aWNlc1BlclJvdyA9IGZpZ3VyZS52ZXJ0aWNlc1BlclJvdztcbiAgICAgICAgdmFyIHJvd3MgPSBNYXRoLmZsb29yKHBzLmxlbmd0aCAvIHZlcnRpY2VzUGVyUm93KSAtIDE7XG4gICAgICAgIHZhciBjb2xzID0gdmVydGljZXNQZXJSb3cgLSAxO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICAgICAgdmFyIHEgPSBpICogdmVydGljZXNQZXJSb3c7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb2xzOyBqKyssIHErKykge1xuICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBwc1txXSxcbiAgICAgICAgICAgICAgcHNbcSArIDFdLFxuICAgICAgICAgICAgICBwc1txICsgdmVydGljZXNQZXJSb3ddLFxuICAgICAgICAgICAgICBjc1txXSxcbiAgICAgICAgICAgICAgY3NbcSArIDFdLFxuICAgICAgICAgICAgICBjc1txICsgdmVydGljZXNQZXJSb3ddXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBwc1txICsgdmVydGljZXNQZXJSb3cgKyAxXSxcbiAgICAgICAgICAgICAgcHNbcSArIDFdLFxuICAgICAgICAgICAgICBwc1txICsgdmVydGljZXNQZXJSb3ddLFxuICAgICAgICAgICAgICBjc1txICsgdmVydGljZXNQZXJSb3cgKyAxXSxcbiAgICAgICAgICAgICAgY3NbcSArIDFdLFxuICAgICAgICAgICAgICBjc1txICsgdmVydGljZXNQZXJSb3ddXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0cmlhbmdsZXNcIjpcbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBwcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7XG4gICAgICAgICAgZHJhd1RyaWFuZ2xlKFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBwc1tpXSxcbiAgICAgICAgICAgIHBzW2kgKyAxXSxcbiAgICAgICAgICAgIHBzW2kgKyAyXSxcbiAgICAgICAgICAgIGNzW2ldLFxuICAgICAgICAgICAgY3NbaSArIDFdLFxuICAgICAgICAgICAgY3NbaSArIDJdXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgZmlndXJlXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gY3JlYXRlTWVzaENhbnZhcyhcbiAgICBib3VuZHMsXG4gICAgY29tYmluZXNTY2FsZSxcbiAgICBjb29yZHMsXG4gICAgY29sb3JzLFxuICAgIGZpZ3VyZXMsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGNhY2hlZENhbnZhc2VzLFxuICAgIHdlYkdMQ29udGV4dFxuICApIHtcbiAgICAvLyB3ZSB3aWxsIGluY3JlYXNlIHNjYWxlIG9uIHNvbWUgd2VpcmQgZmFjdG9yIHRvIGxldCBhbnRpYWxpYXNpbmcgdGFrZVxuICAgIC8vIGNhcmUgb2YgXCJyb3VnaFwiIGVkZ2VzXG4gICAgdmFyIEVYUEVDVEVEX1NDQUxFID0gMS4xO1xuICAgIC8vIE1BWF9QQVRURVJOX1NJWkUgaXMgdXNlZCB0byBhdm9pZCBPT00gc2l0dWF0aW9uLlxuICAgIHZhciBNQVhfUEFUVEVSTl9TSVpFID0gMzAwMDsgLy8gMTBpbiBAIDMwMGRwaSBzaGFsbCBiZSBlbm91Z2hcbiAgICAvLyBXZSBuZWVkIHRvIGtlZXAgdHJhbnNwYXJlbnQgYm9yZGVyIGFyb3VuZCBvdXIgcGF0dGVybiBmb3IgZmlsbCgpOlxuICAgIC8vIGNyZWF0ZVBhdHRlcm4gd2l0aCAnbm8tcmVwZWF0JyB3aWxsIGJsZWVkIGVkZ2VzIGFjcm9zcyBlbnRpcmUgYXJlYS5cbiAgICB2YXIgQk9SREVSX1NJWkUgPSAyO1xuXG4gICAgdmFyIG9mZnNldFggPSBNYXRoLmZsb29yKGJvdW5kc1swXSk7XG4gICAgdmFyIG9mZnNldFkgPSBNYXRoLmZsb29yKGJvdW5kc1sxXSk7XG4gICAgdmFyIGJvdW5kc1dpZHRoID0gTWF0aC5jZWlsKGJvdW5kc1syXSkgLSBvZmZzZXRYO1xuICAgIHZhciBib3VuZHNIZWlnaHQgPSBNYXRoLmNlaWwoYm91bmRzWzNdKSAtIG9mZnNldFk7XG5cbiAgICB2YXIgd2lkdGggPSBNYXRoLm1pbihcbiAgICAgIE1hdGguY2VpbChNYXRoLmFicyhib3VuZHNXaWR0aCAqIGNvbWJpbmVzU2NhbGVbMF0gKiBFWFBFQ1RFRF9TQ0FMRSkpLFxuICAgICAgTUFYX1BBVFRFUk5fU0laRVxuICAgICk7XG4gICAgdmFyIGhlaWdodCA9IE1hdGgubWluKFxuICAgICAgTWF0aC5jZWlsKE1hdGguYWJzKGJvdW5kc0hlaWdodCAqIGNvbWJpbmVzU2NhbGVbMV0gKiBFWFBFQ1RFRF9TQ0FMRSkpLFxuICAgICAgTUFYX1BBVFRFUk5fU0laRVxuICAgICk7XG4gICAgdmFyIHNjYWxlWCA9IGJvdW5kc1dpZHRoIC8gd2lkdGg7XG4gICAgdmFyIHNjYWxlWSA9IGJvdW5kc0hlaWdodCAvIGhlaWdodDtcblxuICAgIHZhciBjb250ZXh0ID0ge1xuICAgICAgY29vcmRzLFxuICAgICAgY29sb3JzLFxuICAgICAgb2Zmc2V0WDogLW9mZnNldFgsXG4gICAgICBvZmZzZXRZOiAtb2Zmc2V0WSxcbiAgICAgIHNjYWxlWDogMSAvIHNjYWxlWCxcbiAgICAgIHNjYWxlWTogMSAvIHNjYWxlWSxcbiAgICB9O1xuXG4gICAgdmFyIHBhZGRlZFdpZHRoID0gd2lkdGggKyBCT1JERVJfU0laRSAqIDI7XG4gICAgdmFyIHBhZGRlZEhlaWdodCA9IGhlaWdodCArIEJPUkRFUl9TSVpFICogMjtcblxuICAgIHZhciBjYW52YXMsIHRtcENhbnZhcywgaSwgaWk7XG4gICAgaWYgKHdlYkdMQ29udGV4dC5pc0VuYWJsZWQpIHtcbiAgICAgIGNhbnZhcyA9IHdlYkdMQ29udGV4dC5kcmF3RmlndXJlcyh7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgZmlndXJlcyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgIH0pO1xuICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTcyMTI2XG4gICAgICB0bXBDYW52YXMgPSBjYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXG4gICAgICAgIFwibWVzaFwiLFxuICAgICAgICBwYWRkZWRXaWR0aCxcbiAgICAgICAgcGFkZGVkSGVpZ2h0LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIHRtcENhbnZhcy5jb250ZXh0LmRyYXdJbWFnZShjYW52YXMsIEJPUkRFUl9TSVpFLCBCT1JERVJfU0laRSk7XG4gICAgICBjYW52YXMgPSB0bXBDYW52YXMuY2FudmFzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0bXBDYW52YXMgPSBjYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXG4gICAgICAgIFwibWVzaFwiLFxuICAgICAgICBwYWRkZWRXaWR0aCxcbiAgICAgICAgcGFkZGVkSGVpZ2h0LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIHZhciB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcblxuICAgICAgdmFyIGRhdGEgPSB0bXBDdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgICB2YXIgYnl0ZXMgPSBkYXRhLmRhdGE7XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkge1xuICAgICAgICAgIGJ5dGVzW2ldID0gYmFja2dyb3VuZENvbG9yWzBdO1xuICAgICAgICAgIGJ5dGVzW2kgKyAxXSA9IGJhY2tncm91bmRDb2xvclsxXTtcbiAgICAgICAgICBieXRlc1tpICsgMl0gPSBiYWNrZ3JvdW5kQ29sb3JbMl07XG4gICAgICAgICAgYnl0ZXNbaSArIDNdID0gMjU1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZmlndXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZXNbaV0sIGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgdG1wQ3R4LnB1dEltYWdlRGF0YShkYXRhLCBCT1JERVJfU0laRSwgQk9SREVSX1NJWkUpO1xuICAgICAgY2FudmFzID0gdG1wQ2FudmFzLmNhbnZhcztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzLFxuICAgICAgb2Zmc2V0WDogb2Zmc2V0WCAtIEJPUkRFUl9TSVpFICogc2NhbGVYLFxuICAgICAgb2Zmc2V0WTogb2Zmc2V0WSAtIEJPUkRFUl9TSVpFICogc2NhbGVZLFxuICAgICAgc2NhbGVYLFxuICAgICAgc2NhbGVZLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZU1lc2hDYW52YXM7XG59KSgpO1xuXG5TaGFkaW5nSVJzLk1lc2ggPSB7XG4gIGZyb21JUjogZnVuY3Rpb24gTWVzaF9mcm9tSVIocmF3KSB7XG4gICAgLy8gdmFyIHR5cGUgPSByYXdbMV07XG4gICAgdmFyIGNvb3JkcyA9IHJhd1syXTtcbiAgICB2YXIgY29sb3JzID0gcmF3WzNdO1xuICAgIHZhciBmaWd1cmVzID0gcmF3WzRdO1xuICAgIHZhciBib3VuZHMgPSByYXdbNV07XG4gICAgdmFyIG1hdHJpeCA9IHJhd1s2XTtcbiAgICB2YXIgYmJveCA9IHJhd1s3XTtcbiAgICB2YXIgYmFja2dyb3VuZCA9IHJhd1s4XTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJQYXR0ZXJuXCIsXG4gICAgICBnZXRQYXR0ZXJuOiBmdW5jdGlvbiBNZXNoX2dldFBhdHRlcm4oY3R4LCBvd25lciwgc2hhZGluZ0ZpbGwpIHtcbiAgICAgICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpO1xuICAgICAgICB2YXIgc2NhbGU7XG4gICAgICAgIGlmIChzaGFkaW5nRmlsbCkge1xuICAgICAgICAgIHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShjdHgubW96Q3VycmVudFRyYW5zZm9ybSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT2J0YWluIHNjYWxlIGZyb20gbWF0cml4IGFuZCBjdXJyZW50IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cbiAgICAgICAgICBzY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUob3duZXIuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgICAgaWYgKG1hdHJpeCkge1xuICAgICAgICAgICAgdmFyIG1hdHJpeFNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtYXRyaXgpO1xuICAgICAgICAgICAgc2NhbGUgPSBbc2NhbGVbMF0gKiBtYXRyaXhTY2FsZVswXSwgc2NhbGVbMV0gKiBtYXRyaXhTY2FsZVsxXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmFzdGVyaXppbmcgb24gdGhlIG1haW4gdGhyZWFkIHNpbmNlIHNlbmRpbmcvcXVldWUgbGFyZ2UgY2FudmFzZXNcbiAgICAgICAgLy8gbWlnaHQgY2F1c2UgT09NLlxuICAgICAgICB2YXIgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IGNyZWF0ZU1lc2hDYW52YXMoXG4gICAgICAgICAgYm91bmRzLFxuICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgIGNvb3JkcyxcbiAgICAgICAgICBjb2xvcnMsXG4gICAgICAgICAgZmlndXJlcyxcbiAgICAgICAgICBzaGFkaW5nRmlsbCA/IG51bGwgOiBiYWNrZ3JvdW5kLFxuICAgICAgICAgIG93bmVyLmNhY2hlZENhbnZhc2VzLFxuICAgICAgICAgIG93bmVyLndlYkdMQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghc2hhZGluZ0ZpbGwpIHtcbiAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtLmFwcGx5KGN0eCwgb3duZXIuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgICAgaWYgKG1hdHJpeCkge1xuICAgICAgICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIG1hdHJpeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3R4LnRyYW5zbGF0ZShcbiAgICAgICAgICB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFgsXG4gICAgICAgICAgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZXG4gICAgICAgICk7XG4gICAgICAgIGN0eC5zY2FsZSh0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVkpO1xuXG4gICAgICAgIHJldHVybiBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuXG5TaGFkaW5nSVJzLkR1bW15ID0ge1xuICBmcm9tSVI6IGZ1bmN0aW9uIER1bW15X2Zyb21JUigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJQYXR0ZXJuXCIsXG4gICAgICBnZXRQYXR0ZXJuOiBmdW5jdGlvbiBEdW1teV9mcm9tSVJfZ2V0UGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFwiaG90cGlua1wiO1xuICAgICAgfSxcbiAgICB9O1xuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIocmF3KSB7XG4gIHZhciBzaGFkaW5nSVIgPSBTaGFkaW5nSVJzW3Jhd1swXV07XG4gIGlmICghc2hhZGluZ0lSKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIElSIHR5cGU6ICR7cmF3WzBdfWApO1xuICB9XG4gIHJldHVybiBzaGFkaW5nSVIuZnJvbUlSKHJhdyk7XG59XG5cbi8qKlxuICogQHR5cGUge2FueX1cbiAqL1xudmFyIFRpbGluZ1BhdHRlcm4gPSAoZnVuY3Rpb24gVGlsaW5nUGF0dGVybkNsb3N1cmUoKSB7XG4gIHZhciBQYWludFR5cGUgPSB7XG4gICAgQ09MT1JFRDogMSxcbiAgICBVTkNPTE9SRUQ6IDIsXG4gIH07XG5cbiAgdmFyIE1BWF9QQVRURVJOX1NJWkUgPSAzMDAwOyAvLyAxMGluIEAgMzAwZHBpIHNoYWxsIGJlIGVub3VnaFxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gVGlsaW5nUGF0dGVybihJUiwgY29sb3IsIGN0eCwgY2FudmFzR3JhcGhpY3NGYWN0b3J5LCBiYXNlVHJhbnNmb3JtKSB7XG4gICAgdGhpcy5vcGVyYXRvckxpc3QgPSBJUlsyXTtcbiAgICB0aGlzLm1hdHJpeCA9IElSWzNdIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICB0aGlzLmJib3ggPSBJUls0XTtcbiAgICB0aGlzLnhzdGVwID0gSVJbNV07XG4gICAgdGhpcy55c3RlcCA9IElSWzZdO1xuICAgIHRoaXMucGFpbnRUeXBlID0gSVJbN107XG4gICAgdGhpcy50aWxpbmdUeXBlID0gSVJbOF07XG4gICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5O1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IGJhc2VUcmFuc2Zvcm07XG4gICAgdGhpcy50eXBlID0gXCJQYXR0ZXJuXCI7XG4gICAgdGhpcy5jdHggPSBjdHg7XG4gIH1cblxuICBUaWxpbmdQYXR0ZXJuLnByb3RvdHlwZSA9IHtcbiAgICBjcmVhdGVQYXR0ZXJuQ2FudmFzOiBmdW5jdGlvbiBUaWxpblBhdHRlcm5fY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcikge1xuICAgICAgdmFyIG9wZXJhdG9yTGlzdCA9IHRoaXMub3BlcmF0b3JMaXN0O1xuICAgICAgdmFyIGJib3ggPSB0aGlzLmJib3g7XG4gICAgICB2YXIgeHN0ZXAgPSB0aGlzLnhzdGVwO1xuICAgICAgdmFyIHlzdGVwID0gdGhpcy55c3RlcDtcbiAgICAgIHZhciBwYWludFR5cGUgPSB0aGlzLnBhaW50VHlwZTtcbiAgICAgIHZhciB0aWxpbmdUeXBlID0gdGhpcy50aWxpbmdUeXBlO1xuICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcjtcbiAgICAgIHZhciBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcblxuICAgICAgaW5mbyhcIlRpbGluZ1R5cGU6IFwiICsgdGlsaW5nVHlwZSk7XG5cbiAgICAgIC8vIEEgdGlsaW5nIHBhdHRlcm4gYXMgZGVmaW5lZCBieSBQREYgc3BlYyA4LjcuMiBpcyBhIGNlbGwgd2hvc2Ugc2l6ZSBpc1xuICAgICAgLy8gZGVzY3JpYmVkIGJ5IGJib3gsIGFuZCBtYXkgcmVwZWF0IHJlZ3VsYXJseSBieSBzaGlmdGluZyB0aGUgY2VsbCBieVxuICAgICAgLy8geHN0ZXAgYW5kIHlzdGVwLlxuICAgICAgLy8gQmVjYXVzZSB0aGUgSFRNTDUgY2FudmFzIEFQSSBkb2VzIG5vdCBzdXBwb3J0IHBhdHRlcm4gcmVwZXRpdGlvbiB3aXRoXG4gICAgICAvLyBnYXBzIGluIGJldHdlZW4sIHdlIHVzZSB0aGUgeHN0ZXAveXN0ZXAgaW5zdGVhZCBvZiB0aGUgYmJveCdzIHNpemUuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBoYXMgdGhlIGZvbGxvd2luZyBjb25zZXF1ZW5jZXMgKHNpbWlsYXJseSBmb3IgeXN0ZXApOlxuICAgICAgLy9cbiAgICAgIC8vIC0gSWYgeHN0ZXAgaXMgdGhlIHNhbWUgYXMgYmJveCwgdGhlbiB0aGVyZSBpcyBubyBvYnNlcnZhYmxlIGRpZmZlcmVuY2UuXG4gICAgICAvL1xuICAgICAgLy8gLSBJZiB4c3RlcCBpcyBsYXJnZXIgdGhhbiBiYm94LCB0aGVuIHRoZSBwYXR0ZXJuIGNhbnZhcyBpcyBwYXJ0aWFsbHlcbiAgICAgIC8vICAgZW1wdHk6IHRoZSBhcmVhIGJvdW5kZWQgYnkgYmJveCBpcyBwYWludGVkLCB0aGUgb3V0c2lkZSBhcmVhIGlzIHZvaWQuXG4gICAgICAvL1xuICAgICAgLy8gLSBJZiB4c3RlcCBpcyBzbWFsbGVyIHRoYW4gYmJveCwgdGhlbiB0aGUgcGl4ZWxzIGJldHdlZW4geHN0ZXAgYW5kIHRoZVxuICAgICAgLy8gICBiYm94IGJvdW5kYXJ5IHdpbGwgYmUgbWlzc2luZy4gVGhpcyBpcyBJTkNPUlJFQ1QgYmVoYXZpb3IuXG4gICAgICAvLyAgIFwiRmlndXJlcyBvbiBhZGphY2VudCB0aWxlcyBzaG91bGQgbm90IG92ZXJsYXBcIiAoUERGIHNwZWMgOC43LjMuMSksXG4gICAgICAvLyAgIGJ1dCBvdmVybGFwcGluZyBjZWxscyB3aXRob3V0IGNvbW1vbiBwaXhlbHMgYXJlIHN0aWxsIHZhbGlkLlxuICAgICAgLy8gICBUT0RPOiBGaXggdGhlIGltcGxlbWVudGF0aW9uLCB0byBhbGxvdyB0aGlzIHNjZW5hcmlvIHRvIGJlIHBhaW50ZWRcbiAgICAgIC8vICAgY29ycmVjdGx5LlxuXG4gICAgICB2YXIgeDAgPSBiYm94WzBdLFxuICAgICAgICB5MCA9IGJib3hbMV0sXG4gICAgICAgIHgxID0gYmJveFsyXSxcbiAgICAgICAgeTEgPSBiYm94WzNdO1xuXG4gICAgICAvLyBPYnRhaW4gc2NhbGUgZnJvbSBtYXRyaXggYW5kIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxuICAgICAgdmFyIG1hdHJpeFNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG4gICAgICB2YXIgY3VyTWF0cml4U2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKFxuICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm1cbiAgICAgICk7XG4gICAgICB2YXIgY29tYmluZWRTY2FsZSA9IFtcbiAgICAgICAgbWF0cml4U2NhbGVbMF0gKiBjdXJNYXRyaXhTY2FsZVswXSxcbiAgICAgICAgbWF0cml4U2NhbGVbMV0gKiBjdXJNYXRyaXhTY2FsZVsxXSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFVzZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyB0aGF0IGFyZSBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgZW5kXG4gICAgICAvLyByZXN1bHQgd2hlbiB0aGUgcGF0dGVybiBpcyB1c2VkLiBUb28gbG93IHZhbHVlIG1ha2VzIHRoZSBwYXR0ZXJuIGxvb2tcbiAgICAgIC8vIGJsdXJyeS4gVG9vIGxhcmdlIHZhbHVlIG1ha2VzIGl0IGxvb2sgdG9vIGNyaXNweS5cbiAgICAgIHZhciBkaW14ID0gdGhpcy5nZXRTaXplQW5kU2NhbGUoXG4gICAgICAgIHhzdGVwLFxuICAgICAgICB0aGlzLmN0eC5jYW52YXMud2lkdGgsXG4gICAgICAgIGNvbWJpbmVkU2NhbGVbMF1cbiAgICAgICk7XG4gICAgICB2YXIgZGlteSA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKFxuICAgICAgICB5c3RlcCxcbiAgICAgICAgdGhpcy5jdHguY2FudmFzLmhlaWdodCxcbiAgICAgICAgY29tYmluZWRTY2FsZVsxXVxuICAgICAgKTtcblxuICAgICAgdmFyIHRtcENhbnZhcyA9IG93bmVyLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcbiAgICAgICAgXCJwYXR0ZXJuXCIsXG4gICAgICAgIGRpbXguc2l6ZSxcbiAgICAgICAgZGlteS5zaXplLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgdmFyIGdyYXBoaWNzID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5LmNyZWF0ZUNhbnZhc0dyYXBoaWNzKHRtcEN0eCk7XG4gICAgICBncmFwaGljcy5ncm91cExldmVsID0gb3duZXIuZ3JvdXBMZXZlbDtcblxuICAgICAgdGhpcy5zZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQoZ3JhcGhpY3MsIHBhaW50VHlwZSwgY29sb3IpO1xuXG4gICAgICBncmFwaGljcy50cmFuc2Zvcm0oZGlteC5zY2FsZSwgMCwgMCwgZGlteS5zY2FsZSwgMCwgMCk7XG5cbiAgICAgIC8vIHRyYW5zZm9ybSBjb29yZGluYXRlcyB0byBwYXR0ZXJuIHNwYWNlXG4gICAgICBncmFwaGljcy50cmFuc2Zvcm0oMSwgMCwgMCwgMSwgLXgwLCAteTApO1xuXG4gICAgICB0aGlzLmNsaXBCYm94KGdyYXBoaWNzLCBiYm94LCB4MCwgeTAsIHgxLCB5MSk7XG5cbiAgICAgIGdyYXBoaWNzLmV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0KTtcblxuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtKDEsIDAsIDAsIDEsIHgwLCB5MCk7XG5cbiAgICAgIC8vIFJlc2NhbGUgY2FudmFzIHNvIHRoYXQgdGhlIGN0eC5jcmVhdGVQYXR0ZXJuIGNhbGwgZ2VuZXJhdGVzIGEgcGF0dGVyblxuICAgICAgLy8gd2l0aCB0aGUgZGVzaXJlZCBzaXplLlxuICAgICAgdGhpcy5jdHguc2NhbGUoMSAvIGRpbXguc2NhbGUsIDEgLyBkaW15LnNjYWxlKTtcbiAgICAgIHJldHVybiB0bXBDYW52YXMuY2FudmFzO1xuICAgIH0sXG5cbiAgICBnZXRTaXplQW5kU2NhbGU6IGZ1bmN0aW9uIFRpbGluZ1BhdHRlcm5fZ2V0U2l6ZUFuZFNjYWxlKFxuICAgICAgc3RlcCxcbiAgICAgIHJlYWxPdXRwdXRTaXplLFxuICAgICAgc2NhbGVcbiAgICApIHtcbiAgICAgIC8vIHhzdGVwIC8geXN0ZXAgbWF5IGJlIG5lZ2F0aXZlIC0tIG5vcm1hbGl6ZS5cbiAgICAgIHN0ZXAgPSBNYXRoLmFicyhzdGVwKTtcbiAgICAgIC8vIE1BWF9QQVRURVJOX1NJWkUgaXMgdXNlZCB0byBhdm9pZCBPT00gc2l0dWF0aW9uLlxuICAgICAgLy8gVXNlIHRoZSBkZXN0aW5hdGlvbiBjYW52YXMncyBzaXplIGlmIGl0IGlzIGJpZ2dlciB0aGFuIHRoZSBoYXJkLWNvZGVkXG4gICAgICAvLyBsaW1pdCBvZiBNQVhfUEFUVEVSTl9TSVpFIHRvIGF2b2lkIGNsaXBwaW5nIHBhdHRlcm5zIHRoYXQgY292ZXIgdGhlXG4gICAgICAvLyB3aG9sZSBjYW52YXMuXG4gICAgICB2YXIgbWF4U2l6ZSA9IE1hdGgubWF4KE1BWF9QQVRURVJOX1NJWkUsIHJlYWxPdXRwdXRTaXplKTtcbiAgICAgIHZhciBzaXplID0gTWF0aC5jZWlsKHN0ZXAgKiBzY2FsZSk7XG4gICAgICBpZiAoc2l6ZSA+PSBtYXhTaXplKSB7XG4gICAgICAgIHNpemUgPSBtYXhTaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NhbGUgPSBzaXplIC8gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHNjYWxlLCBzaXplIH07XG4gICAgfSxcblxuICAgIGNsaXBCYm94OiBmdW5jdGlvbiBjbGlwQmJveChncmFwaGljcywgYmJveCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7XG4gICAgICAgIHZhciBiYm94V2lkdGggPSB4MSAtIHgwO1xuICAgICAgICB2YXIgYmJveEhlaWdodCA9IHkxIC0geTA7XG4gICAgICAgIGdyYXBoaWNzLmN0eC5yZWN0KHgwLCB5MCwgYmJveFdpZHRoLCBiYm94SGVpZ2h0KTtcbiAgICAgICAgZ3JhcGhpY3MuY2xpcCgpO1xuICAgICAgICBncmFwaGljcy5lbmRQYXRoKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dDogZnVuY3Rpb24gc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KFxuICAgICAgZ3JhcGhpY3MsXG4gICAgICBwYWludFR5cGUsXG4gICAgICBjb2xvclxuICAgICkge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdyYXBoaWNzLmN0eCxcbiAgICAgICAgY3VycmVudCA9IGdyYXBoaWNzLmN1cnJlbnQ7XG4gICAgICBzd2l0Y2ggKHBhaW50VHlwZSkge1xuICAgICAgICBjYXNlIFBhaW50VHlwZS5DT0xPUkVEOlxuICAgICAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGN0eC5maWxsU3R5bGU7XG4gICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGN0eC5zdHJva2VTdHlsZTtcbiAgICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGN0eC5maWxsU3R5bGU7XG4gICAgICAgICAgY3VycmVudC5zdHJva2VDb2xvciA9IGN0eC5zdHJva2VTdHlsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYWludFR5cGUuVU5DT0xPUkVEOlxuICAgICAgICAgIHZhciBjc3NDb2xvciA9IFV0aWwubWFrZUNzc1JnYihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcbiAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGNzc0NvbG9yO1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjc3NDb2xvcjtcbiAgICAgICAgICAvLyBTZXQgY29sb3IgbmVlZGVkIGJ5IGltYWdlIG1hc2tzIChmaXhlcyBpc3N1ZXMgMzIyNiBhbmQgODc0MSkuXG4gICAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjc3NDb2xvcjtcbiAgICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwYWludCB0eXBlOiAke3BhaW50VHlwZX1gKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gVGlsaW5nUGF0dGVybl9nZXRQYXR0ZXJuKGN0eCwgb3duZXIpIHtcbiAgICAgIGN0eCA9IHRoaXMuY3R4O1xuICAgICAgLy8gUERGIHNwZWMgOC43LjIgTk9URSAxOiBwYXR0ZXJuJ3MgbWF0cml4IGlzIHJlbGF0aXZlIHRvIGluaXRpYWwgbWF0cml4LlxuICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgdGhpcy5tYXRyaXgpO1xuXG4gICAgICB2YXIgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IHRoaXMuY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcik7XG5cbiAgICAgIHJldHVybiBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLCBcInJlcGVhdFwiKTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBUaWxpbmdQYXR0ZXJuO1xufSkoKTtcblxuZXhwb3J0IHsgZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIsIFRpbGluZ1BhdHRlcm4gfTtcbiIsIi8qIENvcHlyaWdodCAyMDE4IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdsb2JhbFdvcmtlck9wdGlvbnNUeXBlXG4gKiBAcHJvcGVydHkge1dvcmtlciB8IG51bGx9IHdvcmtlclBvcnQgLSBEZWZpbmVzIGdsb2JhbCBwb3J0IGZvciB3b3JrZXJcbiAqICAgcHJvY2Vzcy4gT3ZlcnJpZGVzIHRoZSBgd29ya2VyU3JjYCBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VyU3JjIC0gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgcGF0aCBhbmQgZmlsZW5hbWVcbiAqICAgb2YgdGhlIHdvcmtlciBmaWxlLlxuICpcbiAqICAgTk9URTogVGhlIGB3b3JrZXJTcmNgIG9wdGlvbiBzaG91bGQgYWx3YXlzIGJlIHNldCwgaW4gb3JkZXIgdG8gcHJldmVudCBhbnlcbiAqICAgICAgICAgaXNzdWVzIHdoZW4gdXNpbmcgdGhlIFBERi5qcyBsaWJyYXJ5LlxuICovXG5cbi8qKiBAdHlwZSB7R2xvYmFsV29ya2VyT3B0aW9uc1R5cGV9ICovXG5jb25zdCBHbG9iYWxXb3JrZXJPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0ID1cbiAgR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0ID09PSB1bmRlZmluZWRcbiAgICA/IG51bGxcbiAgICA6IEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydDtcblxuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgPVxuICBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9PT0gdW5kZWZpbmVkXG4gICAgPyBcIlwiXG4gICAgOiBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYztcblxuZXhwb3J0IHsgR2xvYmFsV29ya2VyT3B0aW9ucyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTggTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciwgcHJlZmVyLWNvbnN0OiBlcnJvciAqL1xuXG5pbXBvcnQge1xuICBBYm9ydEV4Y2VwdGlvbixcbiAgYXNzZXJ0LFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbixcbiAgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uLFxuICBVbmtub3duRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCIuL3V0aWwuanNcIjtcblxuY29uc3QgQ2FsbGJhY2tLaW5kID0ge1xuICBVTktOT1dOOiAwLFxuICBEQVRBOiAxLFxuICBFUlJPUjogMixcbn07XG5cbmNvbnN0IFN0cmVhbUtpbmQgPSB7XG4gIFVOS05PV046IDAsXG4gIENBTkNFTDogMSxcbiAgQ0FOQ0VMX0NPTVBMRVRFOiAyLFxuICBDTE9TRTogMyxcbiAgRU5RVUVVRTogNCxcbiAgRVJST1I6IDUsXG4gIFBVTEw6IDYsXG4gIFBVTExfQ09NUExFVEU6IDcsXG4gIFNUQVJUX0NPTVBMRVRFOiA4LFxufTtcblxuZnVuY3Rpb24gd3JhcFJlYXNvbihyZWFzb24pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICkge1xuICAgIGFzc2VydChcbiAgICAgIHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgICAgICh0eXBlb2YgcmVhc29uID09PSBcIm9iamVjdFwiICYmIHJlYXNvbiAhPT0gbnVsbCksXG4gICAgICAnd3JhcFJlYXNvbjogRXhwZWN0ZWQgXCJyZWFzb25cIiB0byBiZSBhIChwb3NzaWJseSBjbG9uZWQpIEVycm9yLidcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgcmVhc29uICE9PSBcIm9iamVjdFwiIHx8IHJlYXNvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHJlYXNvbjtcbiAgICB9XG4gIH1cbiAgc3dpdGNoIChyZWFzb24ubmFtZSkge1xuICAgIGNhc2UgXCJBYm9ydEV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBBYm9ydEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7XG4gICAgY2FzZSBcIk1pc3NpbmdQREZFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7XG4gICAgY2FzZSBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5zdGF0dXMpO1xuICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uZGV0YWlscyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBuZXcgVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24udG9TdHJpbmcoKSk7XG4gIH1cbn1cblxuY2xhc3MgTWVzc2FnZUhhbmRsZXIge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBjb21PYmopIHtcbiAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lO1xuICAgIHRoaXMudGFyZ2V0TmFtZSA9IHRhcmdldE5hbWU7XG4gICAgdGhpcy5jb21PYmogPSBjb21PYmo7XG4gICAgdGhpcy5jYWxsYmFja0lkID0gMTtcbiAgICB0aGlzLnN0cmVhbUlkID0gMTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gdHJ1ZTtcbiAgICB0aGlzLnN0cmVhbVNpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgIGlmIChkYXRhLnRhcmdldE5hbWUgIT09IHRoaXMuc291cmNlTmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5zdHJlYW0pIHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrSWQgPSBkYXRhLmNhbGxiYWNrSWQ7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdO1xuICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGNhbGxiYWNrICR7Y2FsbGJhY2tJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcblxuICAgICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHtcbiAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuRVJST1IpIHtcbiAgICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBjYWxsYmFjayBjYXNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07XG4gICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAke2RhdGEuYWN0aW9ufWApO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuY2FsbGJhY2tJZCkge1xuICAgICAgICBjb25zdCBjYlNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7XG4gICAgICAgIGNvbnN0IGNiVGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTtcbiAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEpKTtcbiAgICAgICAgfSkudGhlbihcbiAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWU6IGNiVGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLFxuICAgICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG4gICAgICAgICAgICAgIGRhdGE6IHJlc3VsdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuRVJST1IsXG4gICAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFjdGlvbihkYXRhLmRhdGEpO1xuICAgIH07XG4gICAgY29tT2JqLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgfVxuXG4gIG9uKGFjdGlvbk5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgICdNZXNzYWdlSGFuZGxlci5vbjogRXhwZWN0ZWQgXCJoYW5kbGVyXCIgdG8gYmUgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBhaCA9IHRoaXMuYWN0aW9uSGFuZGxlcjtcbiAgICBpZiAoYWhbYWN0aW9uTmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgYWxyZWFkeSBhbiBhY3Rpb25OYW1lIGNhbGxlZCBcIiR7YWN0aW9uTmFtZX1cImApO1xuICAgIH1cbiAgICBhaFthY3Rpb25OYW1lXSA9IGhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBjb21PYmogdG8gaW52b2tlIHRoZSBhY3Rpb24gd2l0aCB0aGUgc3VwcGxpZWQgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gdG8gY2FsbC5cbiAgICogQHBhcmFtIHtKU09OfSBkYXRhIC0gSlNPTiBkYXRhIHRvIHNlbmQuXG4gICAqIEBwYXJhbSB7QXJyYXl9IFt0cmFuc2ZlcnNdIC0gTGlzdCBvZiB0cmFuc2ZlcnMvQXJyYXlCdWZmZXJzLlxuICAgKi9cbiAgc2VuZChhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHtcbiAgICB0aGlzLl9wb3N0TWVzc2FnZShcbiAgICAgIHtcbiAgICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgICB0cmFuc2ZlcnNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY29tT2JqIHRvIGludm9rZSB0aGUgYWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGRhdGEuXG4gICAqIEV4cGVjdHMgdGhhdCB0aGUgb3RoZXIgc2lkZSB3aWxsIGNhbGxiYWNrIHdpdGggdGhlIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIEFjdGlvbiB0byBjYWxsLlxuICAgKiBAcGFyYW0ge0pTT059IGRhdGEgLSBKU09OIGRhdGEgdG8gc2VuZC5cbiAgICogQHBhcmFtIHtBcnJheX0gW3RyYW5zZmVyc10gLSBMaXN0IG9mIHRyYW5zZmVycy9BcnJheUJ1ZmZlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRvIGJlIHJlc29sdmVkIHdpdGggcmVzcG9uc2UgZGF0YS5cbiAgICovXG4gIHNlbmRXaXRoUHJvbWlzZShhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHtcbiAgICBjb25zdCBjYWxsYmFja0lkID0gdGhpcy5jYWxsYmFja0lkKys7XG4gICAgY29uc3QgY2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXSA9IGNhcGFiaWxpdHk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3Bvc3RNZXNzYWdlKFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG4gICAgICAgICAgY2FsbGJhY2tJZCxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2ZlcnNcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNhcGFiaWxpdHkucmVqZWN0KGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGNvbU9iaiB0byBpbnZva2UgdGhlIGFjdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBkYXRhLlxuICAgKiBFeHBlY3QgdGhhdCB0aGUgb3RoZXIgc2lkZSB3aWxsIGNhbGxiYWNrIHRvIHNpZ25hbCAnc3RhcnRfY29tcGxldGUnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIEFjdGlvbiB0byBjYWxsLlxuICAgKiBAcGFyYW0ge0pTT059IGRhdGEgLSBKU09OIGRhdGEgdG8gc2VuZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHF1ZXVlaW5nU3RyYXRlZ3kgLSBTdHJhdGVneSB0byBzaWduYWwgYmFja3ByZXNzdXJlIGJhc2VkIG9uXG4gICAqICAgICAgICAgICAgICAgICBpbnRlcm5hbCBxdWV1ZS5cbiAgICogQHBhcmFtIHtBcnJheX0gW3RyYW5zZmVyc10gLSBMaXN0IG9mIHRyYW5zZmVycy9BcnJheUJ1ZmZlcnMuXG4gICAqIEByZXR1cm5zIHtSZWFkYWJsZVN0cmVhbX0gUmVhZGFibGVTdHJlYW0gdG8gcmVhZCBkYXRhIGluIGNodW5rcy5cbiAgICovXG4gIHNlbmRXaXRoU3RyZWFtKGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXVlaW5nU3RyYXRlZ3ksIHRyYW5zZmVycykge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gdGhpcy5zdHJlYW1JZCsrO1xuICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7XG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IHRoaXMudGFyZ2V0TmFtZTtcbiAgICBjb25zdCBjb21PYmogPSB0aGlzLmNvbU9iajtcblxuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oXG4gICAgICB7XG4gICAgICAgIHN0YXJ0OiBjb250cm9sbGVyID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdID0ge1xuICAgICAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgICAgIHN0YXJ0Q2FsbDogc3RhcnRDYXBhYmlsaXR5LFxuICAgICAgICAgICAgcHVsbENhbGw6IG51bGwsXG4gICAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLFxuICAgICAgICAgICAgaXNDbG9zZWQ6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fcG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYW5zZmVyc1xuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gUmV0dXJuIFByb21pc2UgZm9yIEFzeW5jIHByb2Nlc3MsIHRvIHNpZ25hbCBzdWNjZXNzL2ZhaWx1cmUuXG4gICAgICAgICAgcmV0dXJuIHN0YXJ0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHB1bGw6IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IHB1bGxDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCA9IHB1bGxDYXBhYmlsaXR5O1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBSZXR1cm5pbmcgUHJvbWlzZSB3aWxsIG5vdCBjYWxsIFwicHVsbFwiXG4gICAgICAgICAgLy8gYWdhaW4gdW50aWwgY3VycmVudCBwdWxsIGlzIHJlc29sdmVkLlxuICAgICAgICAgIHJldHVybiBwdWxsQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNhbmNlbDogcmVhc29uID0+IHtcbiAgICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiY2FuY2VsIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvblwiKTtcbiAgICAgICAgICBjb25zdCBjYW5jZWxDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsID0gY2FuY2VsQ2FwYWJpbGl0eTtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTCxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gUmV0dXJuIFByb21pc2UgdG8gc2lnbmFsIHN1Y2Nlc3Mgb3IgZmFpbHVyZS5cbiAgICAgICAgICByZXR1cm4gY2FuY2VsQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHF1ZXVlaW5nU3RyYXRlZ3lcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlU3RyZWFtU2luayhkYXRhKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQ7XG4gICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lO1xuICAgIGNvbnN0IGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuXG4gICAgY29uc3Qgc3RyZWFtU2luayA9IHtcbiAgICAgIGVucXVldWUoY2h1bmssIHNpemUgPSAxLCB0cmFuc2ZlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTtcbiAgICAgICAgdGhpcy5kZXNpcmVkU2l6ZSAtPSBzaXplO1xuICAgICAgICAvLyBFbnF1ZXVlIGRlY3JlYXNlcyB0aGUgZGVzaXJlZFNpemUgcHJvcGVydHkgb2Ygc2luayxcbiAgICAgICAgLy8gc28gd2hlbiBpdCBjaGFuZ2VzIGZyb20gcG9zaXRpdmUgdG8gbmVnYXRpdmUsXG4gICAgICAgIC8vIHNldCByZWFkeSBhcyB1bnJlc29sdmVkIHByb21pc2UuXG4gICAgICAgIGlmIChsYXN0RGVzaXJlZFNpemUgPiAwICYmIHRoaXMuZGVzaXJlZFNpemUgPD0gMCkge1xuICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMucmVhZHkgPSB0aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5fcG9zdE1lc3NhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgY2h1bmssXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2ZlcnNcbiAgICAgICAgKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNMT1NFLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIHNlbGYuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IocmVhc29uKSB7XG4gICAgICAgIGFzc2VydChyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgXCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRVJST1IsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbiksXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgc2lua0NhcGFiaWxpdHk6IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCksXG4gICAgICBvblB1bGw6IG51bGwsXG4gICAgICBvbkNhbmNlbDogbnVsbCxcbiAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSxcbiAgICAgIGRlc2lyZWRTaXplOiBkYXRhLmRlc2lyZWRTaXplLFxuICAgICAgcmVhZHk6IG51bGwsXG4gICAgfTtcblxuICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIHN0cmVhbVNpbmsucmVhZHkgPSBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rO1xuICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEsIHN0cmVhbVNpbmspKTtcbiAgICB9KS50aGVuKFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkO1xuICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7XG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTtcbiAgICBjb25zdCBjb21PYmogPSB0aGlzLmNvbU9iajtcblxuICAgIHN3aXRjaCAoZGF0YS5zdHJlYW0pIHtcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnN0YXJ0Q2FsbC5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLnJlamVjdChcbiAgICAgICAgICAgIHdyYXBSZWFzb24oZGF0YS5yZWFzb24pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFOlxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsLnJlamVjdChcbiAgICAgICAgICAgIHdyYXBSZWFzb24oZGF0YS5yZWFzb24pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMOlxuICAgICAgICAvLyBJZ25vcmUgYW55IHB1bGwgYWZ0ZXIgY2xvc2UgaXMgY2FsbGVkLlxuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHVsbCBpbmNyZWFzZXMgdGhlIGRlc2lyZWRTaXplIHByb3BlcnR5IG9mIHNpbmssXG4gICAgICAgIC8vIHNvIHdoZW4gaXQgY2hhbmdlcyBmcm9tIG5lZ2F0aXZlIHRvIHBvc2l0aXZlLFxuICAgICAgICAvLyBzZXQgcmVhZHkgcHJvcGVydHkgYXMgcmVzb2x2ZWQgcHJvbWlzZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLmRlc2lyZWRTaXplIDw9IDAgJiZcbiAgICAgICAgICBkYXRhLmRlc2lyZWRTaXplID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzZXQgZGVzaXJlZFNpemUgcHJvcGVydHkgb2Ygc2luayBvbiBldmVyeSBwdWxsLlxuICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5kZXNpcmVkU2l6ZSA9IGRhdGEuZGVzaXJlZFNpemU7XG4gICAgICAgIGNvbnN0IHsgb25QdWxsIH0gPSB0aGlzLnN0cmVhbVNpbmtzW2RhdGEuc3RyZWFtSWRdO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUob25QdWxsICYmIG9uUHVsbCgpKTtcbiAgICAgICAgfSkudGhlbihcbiAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuICAgICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkVOUVVFVUU6XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSxcbiAgICAgICAgICBcImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIlxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jb250cm9sbGVyLmVucXVldWUoZGF0YS5jaHVuayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkNMT1NFOlxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sXG4gICAgICAgICAgXCJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSxcbiAgICAgICAgICBcImVycm9yIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICB3cmFwUmVhc29uKGRhdGEucmVhc29uKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOlxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbC5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbC5yZWplY3QoXG4gICAgICAgICAgICB3cmFwUmVhc29uKGRhdGEucmVhc29uKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTDpcbiAgICAgICAgaWYgKCF0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgb25DYW5jZWwgfSA9IHRoaXMuc3RyZWFtU2lua3NbZGF0YS5zdHJlYW1JZF07XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShvbkNhbmNlbCAmJiBvbkNhbmNlbCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSkpO1xuICAgICAgICB9KS50aGVuKFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG4gICAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLFxuICAgICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLnNpbmtDYXBhYmlsaXR5LnJlamVjdChcbiAgICAgICAgICB3cmFwUmVhc29uKGRhdGEucmVhc29uKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHN0cmVhbSBjYXNlXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXN5bmMgX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpIHtcbiAgICAvLyBEZWxldGUgdGhlIGBzdHJlYW1Db250cm9sbGVyYCBvbmx5IHdoZW4gdGhlIHN0YXJ0LCBwdWxsLCBhbmQgY2FuY2VsXG4gICAgLy8gY2FwYWJpbGl0aWVzIGhhdmUgc2V0dGxlZCwgdG8gcHJldmVudCBgVHlwZUVycm9yYHMuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgW1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5zdGFydENhbGwsXG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsLFxuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsLFxuICAgICAgXS5tYXAoZnVuY3Rpb24gKGNhcGFiaWxpdHkpIHtcbiAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHkgJiYgY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgfSlcbiAgICApO1xuICAgIGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyByYXcgbWVzc2FnZSB0byB0aGUgY29tT2JqLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlLlxuICAgKiBAcGFyYW0gdHJhbnNmZXJzIExpc3Qgb2YgdHJhbnNmZXJzL0FycmF5QnVmZmVycywgb3IgdW5kZWZpbmVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Bvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVycykge1xuICAgIGlmICh0cmFuc2ZlcnMgJiYgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycykge1xuICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTWVzc2FnZUhhbmRsZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IFNpbXBsZVhNTFBhcnNlciB9IGZyb20gXCIuL3htbF9wYXJzZXIuanNcIjtcblxuY2xhc3MgTWV0YWRhdGEge1xuICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiLCBcIk1ldGFkYXRhOiBpbnB1dCBpcyBub3QgYSBzdHJpbmdcIik7XG5cbiAgICAvLyBHaG9zdHNjcmlwdCBtYXkgcHJvZHVjZSBpbnZhbGlkIG1ldGFkYXRhLCBzbyB0cnkgdG8gcmVwYWlyIHRoYXQgZmlyc3QuXG4gICAgZGF0YSA9IHRoaXMuX3JlcGFpcihkYXRhKTtcblxuICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBhbiBYTUwgZG9jdW1lbnQuXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFNpbXBsZVhNTFBhcnNlcigpO1xuICAgIGNvbnN0IHhtbERvY3VtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhkYXRhKTtcblxuICAgIHRoaXMuX21ldGFkYXRhTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgaWYgKHhtbERvY3VtZW50KSB7XG4gICAgICB0aGlzLl9wYXJzZSh4bWxEb2N1bWVudCk7XG4gICAgfVxuICB9XG5cbiAgX3JlcGFpcihkYXRhKSB7XG4gICAgLy8gU3RhcnQgYnkgcmVtb3ZpbmcgYW55IFwianVua1wiIGJlZm9yZSB0aGUgZmlyc3QgdGFnIChzZWUgaXNzdWUgMTAzOTUpLlxuICAgIHJldHVybiBkYXRhXG4gICAgICAucmVwbGFjZSgvXltePF0rLywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC8+XFxcXDM3NlxcXFwzNzcoW148XSspL2csIGZ1bmN0aW9uIChhbGwsIGNvZGVzKSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gY29kZXNcbiAgICAgICAgICAucmVwbGFjZSgvXFxcXChbMC0zXSkoWzAtN10pKFswLTddKS9nLCBmdW5jdGlvbiAoY29kZSwgZDEsIGQyLCBkMykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZDEgKiA2NCArIGQyICogOCArIGQzICogMSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVwbGFjZSgvJihhbXB8YXBvc3xndHxsdHxxdW90KTsvZywgZnVuY3Rpb24gKHN0ciwgbmFtZSkge1xuICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJhbXBcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCImXCI7XG4gICAgICAgICAgICAgIGNhc2UgXCJhcG9zXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiJ1wiO1xuICAgICAgICAgICAgICBjYXNlIFwiZ3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCI+XCI7XG4gICAgICAgICAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIjxcIjtcbiAgICAgICAgICAgICAgY2FzZSBcInF1b3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgX3JlcGFpcjogJHtuYW1lfSBpc24ndCBkZWZpbmVkLmApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBjaGFycyA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCBjb2RlID0gYnl0ZXMuY2hhckNvZGVBdChpKSAqIDI1NiArIGJ5dGVzLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvZGUgPj0gLyogU3BhY2UgPSAqLyAzMiAmJlxuICAgICAgICAgICAgY29kZSA8IC8qIERlbGV0ZSA9ICovIDEyNyAmJlxuICAgICAgICAgICAgY29kZSAhPT0gLyogJzwnID0gKi8gNjAgJiZcbiAgICAgICAgICAgIGNvZGUgIT09IC8qICc+JyA9ICovIDYyICYmXG4gICAgICAgICAgICBjb2RlICE9PSAvKiAnJicgPSAqLyAzOFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY2hhcnMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hhcnMgKz0gXCImI3hcIiArICgweDEwMDAwICsgY29kZSkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKSArIFwiO1wiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIj5cIiArIGNoYXJzO1xuICAgICAgfSk7XG4gIH1cblxuICBfcGFyc2UoeG1sRG9jdW1lbnQpIHtcbiAgICBsZXQgcmRmID0geG1sRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgaWYgKHJkZi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInJkZjpyZGZcIikge1xuICAgICAgLy8gV3JhcHBlZCBpbiA8eG1wbWV0YT5cbiAgICAgIHJkZiA9IHJkZi5maXJzdENoaWxkO1xuICAgICAgd2hpbGUgKHJkZiAmJiByZGYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJyZGY6cmRmXCIpIHtcbiAgICAgICAgcmRmID0gcmRmLm5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5vZGVOYW1lID0gcmRmID8gcmRmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgIGlmICghcmRmIHx8IG5vZGVOYW1lICE9PSBcInJkZjpyZGZcIiB8fCAhcmRmLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gcmRmLmNoaWxkTm9kZXM7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgZGVzYyA9IGNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGRlc2Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJyZGY6ZGVzY3JpcHRpb25cIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gZGVzYy5jaGlsZE5vZGVzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgaWYgKGRlc2MuY2hpbGROb2Rlc1tqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRlc2MuY2hpbGROb2Rlc1tqXTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgIHRoaXMuX21ldGFkYXRhTWFwLnNldChuYW1lLCBlbnRyeS50ZXh0Q29udGVudC50cmltKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0KG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFNYXAuaGFzKG5hbWUpID8gdGhpcy5fbWV0YWRhdGFNYXAuZ2V0KG5hbWUpIDogbnVsbDtcbiAgfVxuXG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX21ldGFkYXRhTWFwKTtcbiAgfVxuXG4gIGhhcyhuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhTWFwLmhhcyhuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgeyBNZXRhZGF0YSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTggTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIFRoZSBjb2RlIGZvciBYTUxQYXJzZXJCYXNlIGNvcGllZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zaHVtd2F5L2Jsb2IvMTY0NTFkODgzNmZhODVmNGIxNmVlZGE4YjRiZGEyZmE5ZTJiMjJiMC9zcmMvYXZtMi9uYXRpdmVzL3htbC50c1xuXG5jb25zdCBYTUxQYXJzZXJFcnJvckNvZGUgPSB7XG4gIE5vRXJyb3I6IDAsXG4gIEVuZE9mRG9jdW1lbnQ6IC0xLFxuICBVbnRlcm1pbmF0ZWRDZGF0OiAtMixcbiAgVW50ZXJtaW5hdGVkWG1sRGVjbGFyYXRpb246IC0zLFxuICBVbnRlcm1pbmF0ZWREb2N0eXBlRGVjbGFyYXRpb246IC00LFxuICBVbnRlcm1pbmF0ZWRDb21tZW50OiAtNSxcbiAgTWFsZm9ybWVkRWxlbWVudDogLTYsXG4gIE91dE9mTWVtb3J5OiAtNyxcbiAgVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6IC04LFxuICBVbnRlcm1pbmF0ZWRFbGVtZW50OiAtOSxcbiAgRWxlbWVudE5ldmVyQmVndW46IC0xMCxcbn07XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShzLCBpbmRleCkge1xuICBjb25zdCBjaCA9IHNbaW5kZXhdO1xuICByZXR1cm4gY2ggPT09IFwiIFwiIHx8IGNoID09PSBcIlxcblwiIHx8IGNoID09PSBcIlxcclwiIHx8IGNoID09PSBcIlxcdFwiO1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcocykge1xuICBmb3IgKGxldCBpID0gMCwgaWkgPSBzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICBpZiAoIWlzV2hpdGVzcGFjZShzLCBpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY2xhc3MgWE1MUGFyc2VyQmFzZSB7XG4gIF9yZXNvbHZlRW50aXRpZXMocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoLyYoW147XSspOy9nLCAoYWxsLCBlbnRpdHkpID0+IHtcbiAgICAgIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDIpID09PSBcIiN4XCIpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygyKSwgMTYpKTtcbiAgICAgIH0gZWxzZSBpZiAoZW50aXR5LnN1YnN0cmluZygwLCAxKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygxKSwgMTApKTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZW50aXR5KSB7XG4gICAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICAgIHJldHVybiBcIjxcIjtcbiAgICAgICAgY2FzZSBcImd0XCI6XG4gICAgICAgICAgcmV0dXJuIFwiPlwiO1xuICAgICAgICBjYXNlIFwiYW1wXCI6XG4gICAgICAgICAgcmV0dXJuIFwiJlwiO1xuICAgICAgICBjYXNlIFwicXVvdFwiOlxuICAgICAgICAgIHJldHVybiAnXCInO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub25SZXNvbHZlRW50aXR5KGVudGl0eSk7XG4gICAgfSk7XG4gIH1cblxuICBfcGFyc2VDb250ZW50KHMsIHN0YXJ0KSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IFtdO1xuICAgIGxldCBwb3MgPSBzdGFydDtcblxuICAgIGZ1bmN0aW9uIHNraXBXcygpIHtcbiAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiBpc1doaXRlc3BhY2UocywgcG9zKSkge1xuICAgICAgICArK3BvcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3aGlsZSAoXG4gICAgICBwb3MgPCBzLmxlbmd0aCAmJlxuICAgICAgIWlzV2hpdGVzcGFjZShzLCBwb3MpICYmXG4gICAgICBzW3Bvc10gIT09IFwiPlwiICYmXG4gICAgICBzW3Bvc10gIT09IFwiL1wiXG4gICAgKSB7XG4gICAgICArK3BvcztcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IHMuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpO1xuICAgIHNraXBXcygpO1xuICAgIHdoaWxlIChcbiAgICAgIHBvcyA8IHMubGVuZ3RoICYmXG4gICAgICBzW3Bvc10gIT09IFwiPlwiICYmXG4gICAgICBzW3Bvc10gIT09IFwiL1wiICYmXG4gICAgICBzW3Bvc10gIT09IFwiP1wiXG4gICAgKSB7XG4gICAgICBza2lwV3MoKTtcbiAgICAgIGxldCBhdHRyTmFtZSA9IFwiXCIsXG4gICAgICAgIGF0dHJWYWx1ZSA9IFwiXCI7XG4gICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgIWlzV2hpdGVzcGFjZShzLCBwb3MpICYmIHNbcG9zXSAhPT0gXCI9XCIpIHtcbiAgICAgICAgYXR0ck5hbWUgKz0gc1twb3NdO1xuICAgICAgICArK3BvcztcbiAgICAgIH1cbiAgICAgIHNraXBXcygpO1xuICAgICAgaWYgKHNbcG9zXSAhPT0gXCI9XCIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICArK3BvcztcbiAgICAgIHNraXBXcygpO1xuICAgICAgY29uc3QgYXR0ckVuZENoYXIgPSBzW3Bvc107XG4gICAgICBpZiAoYXR0ckVuZENoYXIgIT09ICdcIicgJiYgYXR0ckVuZENoYXIgIT09IFwiJ1wiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgYXR0ckVuZEluZGV4ID0gcy5pbmRleE9mKGF0dHJFbmRDaGFyLCArK3Bvcyk7XG4gICAgICBpZiAoYXR0ckVuZEluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGF0dHJWYWx1ZSA9IHMuc3Vic3RyaW5nKHBvcywgYXR0ckVuZEluZGV4KTtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IGF0dHJOYW1lLFxuICAgICAgICB2YWx1ZTogdGhpcy5fcmVzb2x2ZUVudGl0aWVzKGF0dHJWYWx1ZSksXG4gICAgICB9KTtcbiAgICAgIHBvcyA9IGF0dHJFbmRJbmRleCArIDE7XG4gICAgICBza2lwV3MoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydCxcbiAgICB9O1xuICB9XG5cbiAgX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIHN0YXJ0KSB7XG4gICAgbGV0IHBvcyA9IHN0YXJ0O1xuXG4gICAgZnVuY3Rpb24gc2tpcFdzKCkge1xuICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7XG4gICAgICAgICsrcG9zO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdoaWxlIChcbiAgICAgIHBvcyA8IHMubGVuZ3RoICYmXG4gICAgICAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiZcbiAgICAgIHNbcG9zXSAhPT0gXCI+XCIgJiZcbiAgICAgIHNbcG9zXSAhPT0gXCIvXCJcbiAgICApIHtcbiAgICAgICsrcG9zO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7XG4gICAgc2tpcFdzKCk7XG4gICAgY29uc3QgYXR0clN0YXJ0ID0gcG9zO1xuICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAoc1twb3NdICE9PSBcIj9cIiB8fCBzW3BvcyArIDFdICE9PSBcIj5cIikpIHtcbiAgICAgICsrcG9zO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHMuc3Vic3RyaW5nKGF0dHJTdGFydCwgcG9zKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydCxcbiAgICB9O1xuICB9XG5cbiAgcGFyc2VYbWwocykge1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjaCA9IHNbaV07XG4gICAgICBsZXQgaiA9IGk7XG4gICAgICBpZiAoY2ggPT09IFwiPFwiKSB7XG4gICAgICAgICsrajtcbiAgICAgICAgY29uc3QgY2gyID0gc1tqXTtcbiAgICAgICAgbGV0IHE7XG4gICAgICAgIHN3aXRjaCAoY2gyKSB7XG4gICAgICAgICAgY2FzZSBcIi9cIjpcbiAgICAgICAgICAgICsrajtcbiAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoXCI+XCIsIGopO1xuICAgICAgICAgICAgaWYgKHEgPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRWxlbWVudCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25FbmRFbGVtZW50KHMuc3Vic3RyaW5nKGosIHEpKTtcbiAgICAgICAgICAgIGogPSBxICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCI/XCI6XG4gICAgICAgICAgICArK2o7XG4gICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIGopO1xuICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyBwaS5wYXJzZWQsIGogKyBwaS5wYXJzZWQgKyAyKSAhPT0gXCI/PlwiKSB7XG4gICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkWG1sRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uUGkocGkubmFtZSwgcGkudmFsdWUpO1xuICAgICAgICAgICAgaiArPSBwaS5wYXJzZWQgKyAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIiFcIjpcbiAgICAgICAgICAgIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDMpID09PSBcIi0tXCIpIHtcbiAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZihcIi0tPlwiLCBqICsgMyk7XG4gICAgICAgICAgICAgIGlmIChxIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkQ29tbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMub25Db21tZW50KHMuc3Vic3RyaW5nKGogKyAzLCBxKSk7XG4gICAgICAgICAgICAgIGogPSBxICsgMztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gXCJbQ0RBVEFbXCIpIHtcbiAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZihcIl1dPlwiLCBqICsgOCk7XG4gICAgICAgICAgICAgIGlmIChxIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkQ2RhdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMub25DZGF0YShzLnN1YnN0cmluZyhqICsgOCwgcSkpO1xuICAgICAgICAgICAgICBqID0gcSArIDM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgOCkgPT09IFwiRE9DVFlQRVwiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHEyID0gcy5pbmRleE9mKFwiW1wiLCBqICsgOCk7XG4gICAgICAgICAgICAgIGxldCBjb21wbGV4RG9jdHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKFwiPlwiLCBqICsgOCk7XG4gICAgICAgICAgICAgIGlmIChxIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHEyID4gMCAmJiBxID4gcTIpIHtcbiAgICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKFwiXT5cIiwgaiArIDgpO1xuICAgICAgICAgICAgICAgIGlmIChxIDwgMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFxuICAgICAgICAgICAgICAgICAgICBYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wbGV4RG9jdHlwZSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9jdHlwZUNvbnRlbnQgPSBzLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICBqICsgOCxcbiAgICAgICAgICAgICAgICBxICsgKGNvbXBsZXhEb2N0eXBlID8gMSA6IDApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMub25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KTtcbiAgICAgICAgICAgICAgaiA9IHEgKyAoY29tcGxleERvY3R5cGUgPyAyIDogMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLk1hbGZvcm1lZEVsZW1lbnQpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuX3BhcnNlQ29udGVudChzLCBqKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBzLnN1YnN0cmluZyhqICsgY29udGVudC5wYXJzZWQsIGogKyBjb250ZW50LnBhcnNlZCArIDIpID09PSBcIi8+XCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBzLnN1YnN0cmluZyhqICsgY29udGVudC5wYXJzZWQsIGogKyBjb250ZW50LnBhcnNlZCArIDEpICE9PSBcIj5cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRWxlbWVudCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25CZWdpbkVsZW1lbnQoY29udGVudC5uYW1lLCBjb250ZW50LmF0dHJpYnV0ZXMsIGlzQ2xvc2VkKTtcbiAgICAgICAgICAgIGogKz0gY29udGVudC5wYXJzZWQgKyAoaXNDbG9zZWQgPyAyIDogMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKGogPCBzLmxlbmd0aCAmJiBzW2pdICE9PSBcIjxcIikge1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0ID0gcy5zdWJzdHJpbmcoaSwgaik7XG4gICAgICAgIHRoaXMub25UZXh0KHRoaXMuX3Jlc29sdmVFbnRpdGllcyh0ZXh0KSk7XG4gICAgICB9XG4gICAgICBpID0gajtcbiAgICB9XG4gIH1cblxuICBvblJlc29sdmVFbnRpdHkobmFtZSkge1xuICAgIHJldHVybiBgJiR7bmFtZX07YDtcbiAgfVxuXG4gIG9uUGkobmFtZSwgdmFsdWUpIHt9XG5cbiAgb25Db21tZW50KHRleHQpIHt9XG5cbiAgb25DZGF0YSh0ZXh0KSB7fVxuXG4gIG9uRG9jdHlwZShkb2N0eXBlQ29udGVudCkge31cblxuICBvblRleHQodGV4dCkge31cblxuICBvbkJlZ2luRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCBpc0VtcHR5KSB7fVxuXG4gIG9uRW5kRWxlbWVudChuYW1lKSB7fVxuXG4gIG9uRXJyb3IoY29kZSkge31cbn1cblxuY2xhc3MgU2ltcGxlRE9NTm9kZSB7XG4gIGNvbnN0cnVjdG9yKG5vZGVOYW1lLCBub2RlVmFsdWUpIHtcbiAgICB0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7XG4gICAgdGhpcy5ub2RlVmFsdWUgPSBub2RlVmFsdWU7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJwYXJlbnROb2RlXCIsIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlIH0pO1xuICB9XG5cbiAgZ2V0IGZpcnN0Q2hpbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyAmJiB0aGlzLmNoaWxkTm9kZXNbMF07XG4gIH1cblxuICBnZXQgbmV4dFNpYmxpbmcoKSB7XG4gICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgIGlmICghY2hpbGROb2Rlcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBjaGlsZE5vZGVzLmluZGV4T2YodGhpcyk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkTm9kZXNbaW5kZXggKyAxXTtcbiAgfVxuXG4gIGdldCB0ZXh0Q29udGVudCgpIHtcbiAgICBpZiAoIXRoaXMuY2hpbGROb2Rlcykge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZVZhbHVlIHx8IFwiXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXNcbiAgICAgIC5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBjaGlsZC50ZXh0Q29udGVudDtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlwiKTtcbiAgfVxuXG4gIGhhc0NoaWxkTm9kZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyAmJiB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoID4gMDtcbiAgfVxufVxuXG5jbGFzcyBTaW1wbGVYTUxQYXJzZXIgZXh0ZW5kcyBYTUxQYXJzZXJCYXNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBudWxsO1xuICAgIHRoaXMuX3N0YWNrID0gbnVsbDtcbiAgICB0aGlzLl9lcnJvckNvZGUgPSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcjtcbiAgfVxuXG4gIHBhcnNlRnJvbVN0cmluZyhkYXRhKSB7XG4gICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gW107XG4gICAgdGhpcy5fc3RhY2sgPSBbXTtcbiAgICB0aGlzLl9lcnJvckNvZGUgPSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcjtcblxuICAgIHRoaXMucGFyc2VYbWwoZGF0YSk7XG5cbiAgICBpZiAodGhpcy5fZXJyb3JDb2RlICE9PSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gcmV0dXJuIHVuZGVmaW5lZCBvbiBlcnJvclxuICAgIH1cblxuICAgIC8vIFdlIHNob3VsZCBvbmx5IGhhdmUgb25lIHJvb3QuXG4gICAgY29uc3QgW2RvY3VtZW50RWxlbWVudF0gPSB0aGlzLl9jdXJyZW50RnJhZ21lbnQ7XG4gICAgaWYgKCFkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gcm9vdCB3YXMgZm91bmQuXG4gICAgfVxuICAgIHJldHVybiB7IGRvY3VtZW50RWxlbWVudCB9O1xuICB9XG5cbiAgb25SZXNvbHZlRW50aXR5KG5hbWUpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgXCJhcG9zXCI6XG4gICAgICAgIHJldHVybiBcIidcIjtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLm9uUmVzb2x2ZUVudGl0eShuYW1lKTtcbiAgfVxuXG4gIG9uVGV4dCh0ZXh0KSB7XG4gICAgaWYgKGlzV2hpdGVzcGFjZVN0cmluZyh0ZXh0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUoXCIjdGV4dFwiLCB0ZXh0KTtcbiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTtcbiAgfVxuXG4gIG9uQ2RhdGEodGV4dCkge1xuICAgIGNvbnN0IG5vZGUgPSBuZXcgU2ltcGxlRE9NTm9kZShcIiN0ZXh0XCIsIHRleHQpO1xuICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG5vZGUpO1xuICB9XG5cbiAgb25CZWdpbkVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgaXNFbXB0eSkge1xuICAgIGNvbnN0IG5vZGUgPSBuZXcgU2ltcGxlRE9NTm9kZShuYW1lKTtcbiAgICBub2RlLmNoaWxkTm9kZXMgPSBbXTtcbiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTtcbiAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnRGcmFnbWVudCk7XG4gICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gbm9kZS5jaGlsZE5vZGVzO1xuICB9XG5cbiAgb25FbmRFbGVtZW50KG5hbWUpIHtcbiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSB0aGlzLl9zdGFjay5wb3AoKSB8fCBbXTtcbiAgICBjb25zdCBsYXN0RWxlbWVudCA9IHRoaXMuX2N1cnJlbnRGcmFnbWVudFt0aGlzLl9jdXJyZW50RnJhZ21lbnQubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFsYXN0RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsYXN0RWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGxhc3RFbGVtZW50LmNoaWxkTm9kZXNbaV0ucGFyZW50Tm9kZSA9IGxhc3RFbGVtZW50O1xuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IoY29kZSkge1xuICAgIHRoaXMuX2Vycm9yQ29kZSA9IGNvZGU7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2ltcGxlWE1MUGFyc2VyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IHdhcm4gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuY2xhc3MgT3B0aW9uYWxDb250ZW50R3JvdXAge1xuICBjb25zdHJ1Y3RvcihuYW1lLCBpbnRlbnQpIHtcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5pbnRlbnQgPSBpbnRlbnQ7XG4gIH1cbn1cblxuY2xhc3MgT3B0aW9uYWxDb250ZW50Q29uZmlnIHtcbiAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5jcmVhdG9yID0gbnVsbDtcbiAgICB0aGlzLl9vcmRlciA9IG51bGw7XG4gICAgdGhpcy5fZ3JvdXBzID0gbmV3IE1hcCgpO1xuXG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY3JlYXRvciA9IGRhdGEuY3JlYXRvcjtcbiAgICB0aGlzLl9vcmRlciA9IGRhdGEub3JkZXI7XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBkYXRhLmdyb3Vwcykge1xuICAgICAgdGhpcy5fZ3JvdXBzLnNldChcbiAgICAgICAgZ3JvdXAuaWQsXG4gICAgICAgIG5ldyBPcHRpb25hbENvbnRlbnRHcm91cChncm91cC5uYW1lLCBncm91cC5pbnRlbnQpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmJhc2VTdGF0ZSA9PT0gXCJPRkZcIikge1xuICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9ncm91cHMpIHtcbiAgICAgICAgZ3JvdXAudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb24gb2YgZGF0YS5vbikge1xuICAgICAgdGhpcy5fZ3JvdXBzLmdldChvbikudmlzaWJsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvZmYgb2YgZGF0YS5vZmYpIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy5nZXQob2ZmKS52aXNpYmxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWaXNpYmxlKGdyb3VwKSB7XG4gICAgaWYgKGdyb3VwLnR5cGUgPT09IFwiT0NHXCIpIHtcbiAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhncm91cC5pZCkpIHtcbiAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7Z3JvdXAuaWR9YCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXAuaWQpLnZpc2libGU7XG4gICAgfSBlbHNlIGlmIChncm91cC50eXBlID09PSBcIk9DTURcIikge1xuICAgICAgLy8gUGVyIHRoZSBzcGVjLCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgcHJlZmVycmVkIGlmIGF2YWlsYWJsZS4gVW50aWxcbiAgICAgIC8vIHdlIGltcGxlbWVudCB0aGlzLCBqdXN0IGZhbGxiYWNrIHRvIHVzaW5nIHRoZSBncm91cCBwb2xpY3kgZm9yIG5vdy5cbiAgICAgIGlmIChncm91cC5leHByZXNzaW9uKSB7XG4gICAgICAgIHdhcm4oXCJWaXNpYmlsaXR5IGV4cHJlc3Npb24gbm90IHN1cHBvcnRlZCB5ZXQuXCIpO1xuICAgICAgfVxuICAgICAgaWYgKCFncm91cC5wb2xpY3kgfHwgZ3JvdXAucG9saWN5ID09PSBcIkFueU9uXCIpIHtcbiAgICAgICAgLy8gRGVmYXVsdFxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQWxsT25cIikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFueU9mZlwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQWxsT2ZmXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5fZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHdhcm4oYFVua25vd24gb3B0aW9uYWwgY29udGVudCBwb2xpY3kgJHtncm91cC5wb2xpY3l9LmApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHdhcm4oYFVua25vd24gZ3JvdXAgdHlwZSAke2dyb3VwLnR5cGV9LmApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2V0VmlzaWJpbGl0eShpZCwgdmlzaWJsZSA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZ3JvdXBzLmdldChpZCkudmlzaWJsZSA9ICEhdmlzaWJsZTtcbiAgfVxuXG4gIGdldE9yZGVyKCkge1xuICAgIGlmICghdGhpcy5fZ3JvdXBzLnNpemUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3JkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcmRlci5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9ncm91cHMua2V5cygpKTtcbiAgfVxuXG4gIGdldEdyb3VwcygpIHtcbiAgICBpZiAoIXRoaXMuX2dyb3Vwcy5zaXplKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLl9ncm91cHMpO1xuICB9XG5cbiAgZ2V0R3JvdXAoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBzLmdldChpZCkgfHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgeyBPcHRpb25hbENvbnRlbnRDb25maWcgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgYXNzZXJ0LCBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW19ICovXG5jbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtIHtcbiAgY29uc3RydWN0b3IocGFyYW1zLCBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQpIHtcbiAgICBhc3NlcnQoXG4gICAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQsXG4gICAgICAnUERGRGF0YVRyYW5zcG9ydFN0cmVhbSAtIG1pc3NpbmcgcmVxdWlyZWQgXCJwZGZEYXRhUmFuZ2VUcmFuc3BvcnRcIiBhcmd1bWVudC4nXG4gICAgKTtcblxuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHBhcmFtcy5wcm9ncmVzc2l2ZURvbmUgfHwgZmFsc2U7XG5cbiAgICBjb25zdCBpbml0aWFsRGF0YSA9IHBhcmFtcy5pbml0aWFsRGF0YTtcbiAgICBpZiAoaW5pdGlhbERhdGEgJiYgaW5pdGlhbERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoaW5pdGlhbERhdGEpLmJ1ZmZlcjtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0ID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0O1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXBhcmFtcy5kaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhcGFyYW1zLmRpc2FibGVSYW5nZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gcGFyYW1zLmxlbmd0aDtcblxuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlYWRlcnMgPSBbXTtcblxuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRSYW5nZUxpc3RlbmVyKChiZWdpbiwgY2h1bmspID0+IHtcbiAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoeyBiZWdpbiwgY2h1bmsgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NMaXN0ZW5lcigobG9hZGVkLCB0b3RhbCkgPT4ge1xuICAgICAgdGhpcy5fb25Qcm9ncmVzcyh7IGxvYWRlZCwgdG90YWwgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIoY2h1bmsgPT4ge1xuICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7IGNodW5rIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKCgpID0+IHtcbiAgICAgIHRoaXMuX29uUHJvZ3Jlc3NpdmVEb25lKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQudHJhbnNwb3J0UmVhZHkoKTtcbiAgfVxuXG4gIF9vblJlY2VpdmVEYXRhKGFyZ3MpIHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShhcmdzLmNodW5rKS5idWZmZXI7XG4gICAgaWYgKGFyZ3MuYmVnaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7XG4gICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKGJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChidWZmZXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX3JhbmdlUmVhZGVycy5zb21lKGZ1bmN0aW9uIChyYW5nZVJlYWRlcikge1xuICAgICAgICBpZiAocmFuZ2VSZWFkZXIuX2JlZ2luICE9PSBhcmdzLmJlZ2luKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJhbmdlUmVhZGVyLl9lbnF1ZXVlKGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGZvdW5kLFxuICAgICAgICBcIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID8gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2xvYWRlZCA6IDA7XG4gIH1cblxuICBfb25Qcm9ncmVzcyhldnQpIHtcbiAgICBpZiAoZXZ0LnRvdGFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlcG9ydGluZyB0byBmaXJzdCByYW5nZSByZWFkZXIsIGlmIGl0IGV4aXN0cy5cbiAgICAgIGNvbnN0IGZpcnN0UmVhZGVyID0gdGhpcy5fcmFuZ2VSZWFkZXJzWzBdO1xuICAgICAgaWYgKGZpcnN0UmVhZGVyICYmIGZpcnN0UmVhZGVyLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgZmlyc3RSZWFkZXIub25Qcm9ncmVzcyh7IGxvYWRlZDogZXZ0LmxvYWRlZCB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZnVsbFJlYWRlciA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICAgICAgaWYgKGZ1bGxSZWFkZXIgJiYgZnVsbFJlYWRlci5vblByb2dyZXNzKSB7XG4gICAgICAgIGZ1bGxSZWFkZXIub25Qcm9ncmVzcyh7IGxvYWRlZDogZXZ0LmxvYWRlZCwgdG90YWw6IGV2dC50b3RhbCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfb25Qcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7XG4gICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5wcm9ncmVzc2l2ZURvbmUoKTtcbiAgICB9XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gdHJ1ZTtcbiAgfVxuXG4gIF9yZW1vdmVSYW5nZVJlYWRlcihyZWFkZXIpIHtcbiAgICBjb25zdCBpID0gdGhpcy5fcmFuZ2VSZWFkZXJzLmluZGV4T2YocmVhZGVyKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9yYW5nZVJlYWRlcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuXG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLFxuICAgICAgXCJQREZEYXRhVHJhbnNwb3J0U3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCJcbiAgICApO1xuICAgIGNvbnN0IHF1ZXVlZENodW5rcyA9IHRoaXMuX3F1ZXVlZENodW5rcztcbiAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBudWxsO1xuICAgIHJldHVybiBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcihcbiAgICAgIHRoaXMsXG4gICAgICBxdWV1ZWRDaHVua3MsXG4gICAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVcbiAgICApO1xuICB9XG5cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZShiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cblxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHtcbiAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNsaWNlKDApO1xuICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmFuZ2VSZWFkZXIpIHtcbiAgICAgIHJhbmdlUmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH0pO1xuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hYm9ydCgpO1xuICB9XG59XG5cbi8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbVJlYWRlcn0gKi9cbmNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIHF1ZXVlZENodW5rcywgcHJvZ3Jlc3NpdmVEb25lID0gZmFsc2UpIHtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fZG9uZSA9IHByb2dyZXNzaXZlRG9uZSB8fCBmYWxzZTtcbiAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gcXVldWVkQ2h1bmtzIHx8IFtdO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiB0aGlzLl9xdWV1ZWRDaHVua3MpIHtcbiAgICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHN0cmVhbS5fZnVsbFJlcXVlc3RSZWFkZXIgPSB0aGlzO1xuXG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuXG4gIF9lbnF1ZXVlKGNodW5rKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjsgLy8gSWdub3JlIG5ldyBkYXRhLlxuICAgIH1cbiAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGNodW5rKTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gIH1cblxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVhZHk7XG4gIH1cblxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG5cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmVhbS5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuXG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuXG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2NvbnRlbnRMZW5ndGg7XG4gIH1cblxuICBhc3luYyByZWFkKCkge1xuICAgIGlmICh0aGlzLl9xdWV1ZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVua3Muc2hpZnQoKTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICB9XG5cbiAgcHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICB9XG59XG5cbi8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbVJhbmdlUmVhZGVyfSAqL1xuY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBiZWdpbiwgZW5kKSB7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX2JlZ2luID0gYmVnaW47XG4gICAgdGhpcy5fZW5kID0gZW5kO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcblxuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cblxuICBfZW5xdWV1ZShjaHVuaykge1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm47IC8vIGlnbm9yZSBuZXcgZGF0YVxuICAgIH1cbiAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IGNodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXF1ZXN0c0NhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgcmVxdWVzdHNDYXBhYmlsaXR5LnJlc29sdmUoeyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHtcbiAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIHRoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyk7XG4gIH1cblxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmspIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICByZXR1cm4geyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBERkRhdGFUcmFuc3BvcnRTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbXVsdGktc3RyICovXG5cbmltcG9ydCB7IHNoYWRvdyB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG5jbGFzcyBXZWJHTENvbnRleHQge1xuICBjb25zdHJ1Y3Rvcih7IGVuYWJsZSA9IGZhbHNlIH0pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZW5hYmxlID09PSB0cnVlO1xuICB9XG5cbiAgZ2V0IGlzRW5hYmxlZCgpIHtcbiAgICBsZXQgZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQ7XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIGVuYWJsZWQgPSBXZWJHTFV0aWxzLnRyeUluaXRHTCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNFbmFibGVkXCIsIGVuYWJsZWQpO1xuICB9XG5cbiAgY29tcG9zZVNNYXNrKHsgbGF5ZXIsIG1hc2ssIHByb3BlcnRpZXMgfSkge1xuICAgIHJldHVybiBXZWJHTFV0aWxzLmNvbXBvc2VTTWFzayhsYXllciwgbWFzaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBkcmF3RmlndXJlcyh7IHdpZHRoLCBoZWlnaHQsIGJhY2tncm91bmRDb2xvciwgZmlndXJlcywgY29udGV4dCB9KSB7XG4gICAgcmV0dXJuIFdlYkdMVXRpbHMuZHJhd0ZpZ3VyZXMoXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpZ3VyZXMsXG4gICAgICBjb250ZXh0XG4gICAgKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIFdlYkdMVXRpbHMuY2xlYW51cCgpO1xuICB9XG59XG5cbnZhciBXZWJHTFV0aWxzID0gKGZ1bmN0aW9uIFdlYkdMVXRpbHNDbG9zdXJlKCkge1xuICBmdW5jdGlvbiBsb2FkU2hhZGVyKGdsLCBjb2RlLCBzaGFkZXJUeXBlKSB7XG4gICAgdmFyIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTtcbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBjb2RlKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gICAgdmFyIGNvbXBpbGVkID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpO1xuICAgIGlmICghY29tcGlsZWQpIHtcbiAgICAgIHZhciBlcnJvck1zZyA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGR1cmluZyBzaGFkZXIgY29tcGlsYXRpb246IFwiICsgZXJyb3JNc2cpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZGVyO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZVZlcnRleFNoYWRlcihnbCwgY29kZSkge1xuICAgIHJldHVybiBsb2FkU2hhZGVyKGdsLCBjb2RlLCBnbC5WRVJURVhfU0hBREVSKTtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgY29kZSkge1xuICAgIHJldHVybiBsb2FkU2hhZGVyKGdsLCBjb2RlLCBnbC5GUkFHTUVOVF9TSEFERVIpO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oZ2wsIHNoYWRlcnMpIHtcbiAgICB2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzaGFkZXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXJzW2ldKTtcbiAgICB9XG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG4gICAgdmFyIGxpbmtlZCA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpO1xuICAgIGlmICghbGlua2VkKSB7XG4gICAgICB2YXIgZXJyb3JNc2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGR1cmluZyBwcm9ncmFtIGxpbmtpbmc6IFwiICsgZXJyb3JNc2cpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvZ3JhbTtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKGdsLCBpbWFnZSwgdGV4dHVyZUlkKSB7XG4gICAgZ2wuYWN0aXZlVGV4dHVyZSh0ZXh0dXJlSWQpO1xuICAgIHZhciB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuXG4gICAgLy8gU2V0IHRoZSBwYXJhbWV0ZXJzIHNvIHdlIGNhbiByZW5kZXIgYW55IHNpemUgaW1hZ2UuXG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcblxuICAgIC8vIFVwbG9hZCB0aGUgaW1hZ2UgaW50byB0aGUgdGV4dHVyZS5cbiAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlKTtcbiAgICByZXR1cm4gdGV4dHVyZTtcbiAgfVxuXG4gIHZhciBjdXJyZW50R0wsIGN1cnJlbnRDYW52YXM7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlR0woKSB7XG4gICAgaWYgKGN1cnJlbnRHTCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSB0ZW1wb3JhcnkgY2FudmFzIGlzIHVzZWQgaW4gdGhlIFdlYkdMIGNvbnRleHQuXG4gICAgY3VycmVudENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY3VycmVudEdMID0gY3VycmVudENhbnZhcy5nZXRDb250ZXh0KFwid2ViZ2xcIiwge1xuICAgICAgcHJlbXVsdGlwbGllZGFscGhhOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBzbWFza1ZlcnRleFNoYWRlckNvZGUgPVxuICAgIFwiXFxcbiAgYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICBhdHRyaWJ1dGUgdmVjMiBhX3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHZhcnlpbmcgdmVjMiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgdmVjMiBjbGlwU3BhY2UgPSAoYV9wb3NpdGlvbiAvIHVfcmVzb2x1dGlvbikgKiAyLjAgLSAxLjA7ICAgXFxcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoY2xpcFNwYWNlICogdmVjMigxLCAtMSksIDAsIDEpOyAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjtcblxuICB2YXIgc21hc2tGcmFnbWVudFNoYWRlckNvZGUgPVxuICAgIFwiXFxcbiAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHVuaWZvcm0gdmVjNCB1X2JhY2tkcm9wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdW5pZm9ybSBpbnQgdV9zdWJ0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgIHZlYzQgaW1hZ2VDb2xvciA9IHRleHR1cmUyRCh1X2ltYWdlLCB2X3RleENvb3JkKTsgICAgICAgICAgIFxcXG4gICAgdmVjNCBtYXNrQ29sb3IgPSB0ZXh0dXJlMkQodV9tYXNrLCB2X3RleENvb3JkKTsgICAgICAgICAgICAgXFxcbiAgICBpZiAodV9iYWNrZHJvcC5hID4gMC4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgbWFza0NvbG9yLnJnYiA9IG1hc2tDb2xvci5yZ2IgKiBtYXNrQ29sb3IuYSArICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgdV9iYWNrZHJvcC5yZ2IgKiAoMS4wIC0gbWFza0NvbG9yLmEpOyAgICAgXFxcbiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgIGZsb2F0IGx1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgaWYgKHVfc3VidHlwZSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICAgIGx1bSA9IG1hc2tDb2xvci5hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICBsdW0gPSBtYXNrQ29sb3IuciAqIDAuMyArIG1hc2tDb2xvci5nICogMC41OSArICAgICAgICAgICAgXFxcbiAgICAgICAgICAgIG1hc2tDb2xvci5iICogMC4xMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgaW1hZ2VDb2xvci5hICo9IGx1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICBpbWFnZUNvbG9yLnJnYiAqPSBpbWFnZUNvbG9yLmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgIGdsX0ZyYWdDb2xvciA9IGltYWdlQ29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI7XG5cbiAgdmFyIHNtYXNrQ2FjaGUgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGluaXRTbWFza0dMKCkge1xuICAgIHZhciBjYW52YXMsIGdsO1xuXG4gICAgZ2VuZXJhdGVHTCgpO1xuICAgIGNhbnZhcyA9IGN1cnJlbnRDYW52YXM7XG4gICAgY3VycmVudENhbnZhcyA9IG51bGw7XG4gICAgZ2wgPSBjdXJyZW50R0w7XG4gICAgY3VycmVudEdMID0gbnVsbDtcblxuICAgIC8vIHNldHVwIGEgR0xTTCBwcm9ncmFtXG4gICAgdmFyIHZlcnRleFNoYWRlciA9IGNyZWF0ZVZlcnRleFNoYWRlcihnbCwgc21hc2tWZXJ0ZXhTaGFkZXJDb2RlKTtcbiAgICB2YXIgZnJhZ21lbnRTaGFkZXIgPSBjcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgc21hc2tGcmFnbWVudFNoYWRlckNvZGUpO1xuICAgIHZhciBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnbCwgW3ZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXJdKTtcbiAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgdmFyIGNhY2hlID0ge307XG4gICAgY2FjaGUuZ2wgPSBnbDtcbiAgICBjYWNoZS5jYW52YXMgPSBjYW52YXM7XG4gICAgY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIFwidV9yZXNvbHV0aW9uXCIpO1xuICAgIGNhY2hlLnBvc2l0aW9uTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBcImFfcG9zaXRpb25cIik7XG4gICAgY2FjaGUuYmFja2Ryb3BMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBcInVfYmFja2Ryb3BcIik7XG4gICAgY2FjaGUuc3VidHlwZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIFwidV9zdWJ0eXBlXCIpO1xuXG4gICAgdmFyIHRleENvb3JkTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBcImFfdGV4Q29vcmRcIik7XG4gICAgdmFyIHRleExheWVyTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgXCJ1X2ltYWdlXCIpO1xuICAgIHZhciB0ZXhNYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgXCJ1X21hc2tcIik7XG5cbiAgICAvLyBwcm92aWRlIHRleHR1cmUgY29vcmRpbmF0ZXMgZm9yIHRoZSByZWN0YW5nbGUuXG4gICAgdmFyIHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRleENvb3JkQnVmZmVyKTtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAwLjAsIDAuMCxcbiAgICAgIDEuMCwgMC4wLFxuICAgICAgMC4wLCAxLjAsXG4gICAgICAwLjAsIDEuMCxcbiAgICAgIDEuMCwgMC4wLFxuICAgICAgMS4wLCAxLjBdKSwgZ2wuU1RBVElDX0RSQVcpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3JkTG9jYXRpb24pO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRMb2NhdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcblxuICAgIGdsLnVuaWZvcm0xaSh0ZXhMYXllckxvY2F0aW9uLCAwKTtcbiAgICBnbC51bmlmb3JtMWkodGV4TWFza0xvY2F0aW9uLCAxKTtcblxuICAgIHNtYXNrQ2FjaGUgPSBjYWNoZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBvc2VTTWFzayhsYXllciwgbWFzaywgcHJvcGVydGllcykge1xuICAgIHZhciB3aWR0aCA9IGxheWVyLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gbGF5ZXIuaGVpZ2h0O1xuXG4gICAgaWYgKCFzbWFza0NhY2hlKSB7XG4gICAgICBpbml0U21hc2tHTCgpO1xuICAgIH1cbiAgICB2YXIgY2FjaGUgPSBzbWFza0NhY2hlLFxuICAgICAgY2FudmFzID0gY2FjaGUuY2FudmFzLFxuICAgICAgZ2wgPSBjYWNoZS5nbDtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCk7XG4gICAgZ2wudW5pZm9ybTJmKGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBpZiAocHJvcGVydGllcy5iYWNrZHJvcCkge1xuICAgICAgZ2wudW5pZm9ybTRmKFxuICAgICAgICBjYWNoZS5yZXNvbHV0aW9uTG9jYXRpb24sXG4gICAgICAgIHByb3BlcnRpZXMuYmFja2Ryb3BbMF0sXG4gICAgICAgIHByb3BlcnRpZXMuYmFja2Ryb3BbMV0sXG4gICAgICAgIHByb3BlcnRpZXMuYmFja2Ryb3BbMl0sXG4gICAgICAgIDFcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLnVuaWZvcm00ZihjYWNoZS5yZXNvbHV0aW9uTG9jYXRpb24sIDAsIDAsIDAsIDApO1xuICAgIH1cbiAgICBnbC51bmlmb3JtMWkoXG4gICAgICBjYWNoZS5zdWJ0eXBlTG9jYXRpb24sXG4gICAgICBwcm9wZXJ0aWVzLnN1YnR5cGUgPT09IFwiTHVtaW5vc2l0eVwiID8gMSA6IDBcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGV4dHVyZXNcbiAgICB2YXIgdGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGxheWVyLCBnbC5URVhUVVJFMCk7XG4gICAgdmFyIG1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgbWFzaywgZ2wuVEVYVFVSRTEpO1xuXG4gICAgLy8gQ3JlYXRlIGEgYnVmZmVyIGFuZCBwdXQgYSBzaW5nbGUgY2xpcHNwYWNlIHJlY3RhbmdsZSBpblxuICAgIC8vIGl0ICgyIHRyaWFuZ2xlcylcbiAgICB2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgMCwgMCxcbiAgICAgIHdpZHRoLCAwLFxuICAgICAgMCwgaGVpZ2h0LFxuICAgICAgMCwgaGVpZ2h0LFxuICAgICAgd2lkdGgsIDAsXG4gICAgICB3aWR0aCwgaGVpZ2h0XSksIGdsLlNUQVRJQ19EUkFXKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjYWNoZS5wb3NpdGlvbkxvY2F0aW9uKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNhY2hlLnBvc2l0aW9uTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7XG5cbiAgICAvLyBkcmF3XG4gICAgZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAwKTtcbiAgICBnbC5lbmFibGUoZ2wuQkxFTkQpO1xuICAgIGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpO1xuXG4gICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRVMsIDAsIDYpO1xuXG4gICAgZ2wuZmx1c2goKTtcblxuICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gICAgZ2wuZGVsZXRlVGV4dHVyZShtYXNrVGV4dHVyZSk7XG4gICAgZ2wuZGVsZXRlQnVmZmVyKGJ1ZmZlcik7XG5cbiAgICByZXR1cm4gY2FudmFzO1xuICB9XG5cbiAgdmFyIGZpZ3VyZXNWZXJ0ZXhTaGFkZXJDb2RlID1cbiAgICBcIlxcXG4gIGF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgYXR0cmlidXRlIHZlYzMgYV9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdW5pZm9ybSB2ZWMyIHVfc2NhbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB1bmlmb3JtIHZlYzIgdV9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgdmFyeWluZyB2ZWM0IHZfY29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICB2ZWMyIHBvc2l0aW9uID0gKGFfcG9zaXRpb24gKyB1X29mZnNldCkgKiB1X3NjYWxlOyAgICAgICAgICBcXFxuICAgIHZlYzIgY2xpcFNwYWNlID0gKHBvc2l0aW9uIC8gdV9yZXNvbHV0aW9uKSAqIDIuMCAtIDEuMDsgICAgIFxcXG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNsaXBTcGFjZSAqIHZlYzIoMSwgLTEpLCAwLCAxKTsgICAgICAgICAgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgIHZfY29sb3IgPSB2ZWM0KGFfY29sb3IgLyAyNTUuMCwgMS4wKTsgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI7XG5cbiAgdmFyIGZpZ3VyZXNGcmFnbWVudFNoYWRlckNvZGUgPVxuICAgIFwiXFxcbiAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gIHZhcnlpbmcgdmVjNCB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjtcblxuICB2YXIgZmlndXJlc0NhY2hlID0gbnVsbDtcblxuICBmdW5jdGlvbiBpbml0RmlndXJlc0dMKCkge1xuICAgIHZhciBjYW52YXMsIGdsO1xuXG4gICAgZ2VuZXJhdGVHTCgpO1xuICAgIGNhbnZhcyA9IGN1cnJlbnRDYW52YXM7XG4gICAgY3VycmVudENhbnZhcyA9IG51bGw7XG4gICAgZ2wgPSBjdXJyZW50R0w7XG4gICAgY3VycmVudEdMID0gbnVsbDtcblxuICAgIC8vIHNldHVwIGEgR0xTTCBwcm9ncmFtXG4gICAgdmFyIHZlcnRleFNoYWRlciA9IGNyZWF0ZVZlcnRleFNoYWRlcihnbCwgZmlndXJlc1ZlcnRleFNoYWRlckNvZGUpO1xuICAgIHZhciBmcmFnbWVudFNoYWRlciA9IGNyZWF0ZUZyYWdtZW50U2hhZGVyKGdsLCBmaWd1cmVzRnJhZ21lbnRTaGFkZXJDb2RlKTtcbiAgICB2YXIgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ2wsIFt2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyXSk7XG4gICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTtcblxuICAgIHZhciBjYWNoZSA9IHt9O1xuICAgIGNhY2hlLmdsID0gZ2w7XG4gICAgY2FjaGUuY2FudmFzID0gY2FudmFzO1xuICAgIGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBcInVfcmVzb2x1dGlvblwiKTtcbiAgICBjYWNoZS5zY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIFwidV9zY2FsZVwiKTtcbiAgICBjYWNoZS5vZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBcInVfb2Zmc2V0XCIpO1xuICAgIGNhY2hlLnBvc2l0aW9uTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBcImFfcG9zaXRpb25cIik7XG4gICAgY2FjaGUuY29sb3JMb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIFwiYV9jb2xvclwiKTtcblxuICAgIGZpZ3VyZXNDYWNoZSA9IGNhY2hlO1xuICB9XG5cbiAgZnVuY3Rpb24gZHJhd0ZpZ3VyZXMod2lkdGgsIGhlaWdodCwgYmFja2dyb3VuZENvbG9yLCBmaWd1cmVzLCBjb250ZXh0KSB7XG4gICAgaWYgKCFmaWd1cmVzQ2FjaGUpIHtcbiAgICAgIGluaXRGaWd1cmVzR0woKTtcbiAgICB9XG4gICAgdmFyIGNhY2hlID0gZmlndXJlc0NhY2hlLFxuICAgICAgY2FudmFzID0gY2FjaGUuY2FudmFzLFxuICAgICAgZ2wgPSBjYWNoZS5nbDtcblxuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTtcbiAgICBnbC51bmlmb3JtMmYoY2FjaGUucmVzb2x1dGlvbkxvY2F0aW9uLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIC8vIGNvdW50IHRyaWFuZ2xlIHBvaW50c1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGksIGlpLCByb3dzO1xuICAgIGZvciAoaSA9IDAsIGlpID0gZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBzd2l0Y2ggKGZpZ3VyZXNbaV0udHlwZSkge1xuICAgICAgICBjYXNlIFwibGF0dGljZVwiOlxuICAgICAgICAgIHJvd3MgPSAoZmlndXJlc1tpXS5jb29yZHMubGVuZ3RoIC8gZmlndXJlc1tpXS52ZXJ0aWNlc1BlclJvdykgfCAwO1xuICAgICAgICAgIGNvdW50ICs9IChyb3dzIC0gMSkgKiAoZmlndXJlc1tpXS52ZXJ0aWNlc1BlclJvdyAtIDEpICogNjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRyaWFuZ2xlc1wiOlxuICAgICAgICAgIGNvdW50ICs9IGZpZ3VyZXNbaV0uY29vcmRzLmxlbmd0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdHJhbnNmZXIgZGF0YVxuICAgIHZhciBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gICAgdmFyIGNvbG9ycyA9IG5ldyBVaW50OEFycmF5KGNvdW50ICogMyk7XG4gICAgdmFyIGNvb3Jkc01hcCA9IGNvbnRleHQuY29vcmRzLFxuICAgICAgY29sb3JzTWFwID0gY29udGV4dC5jb2xvcnM7XG4gICAgdmFyIHBJbmRleCA9IDAsXG4gICAgICBjSW5kZXggPSAwO1xuICAgIGZvciAoaSA9IDAsIGlpID0gZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgZmlndXJlID0gZmlndXJlc1tpXSxcbiAgICAgICAgcHMgPSBmaWd1cmUuY29vcmRzLFxuICAgICAgICBjcyA9IGZpZ3VyZS5jb2xvcnM7XG4gICAgICBzd2l0Y2ggKGZpZ3VyZS50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJsYXR0aWNlXCI6XG4gICAgICAgICAgdmFyIGNvbHMgPSBmaWd1cmUudmVydGljZXNQZXJSb3c7XG4gICAgICAgICAgcm93cyA9IChwcy5sZW5ndGggLyBjb2xzKSB8IDA7XG4gICAgICAgICAgZm9yICh2YXIgcm93ID0gMTsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSByb3cgKiBjb2xzICsgMTtcbiAgICAgICAgICAgIGZvciAodmFyIGNvbCA9IDE7IGNvbCA8IGNvbHM7IGNvbCsrLCBvZmZzZXQrKykge1xuICAgICAgICAgICAgICBjb29yZHNbcEluZGV4XSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzIC0gMV1dO1xuICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMV0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gY29scyAtIDFdICsgMV07XG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAyXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzXV07XG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyAzXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXQgLSBjb2xzXSArIDFdO1xuICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgNF0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gMV1dO1xuICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgNV0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gMV0gKyAxXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleF0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29scyAtIDFdXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDFdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIGNvbHMgLSAxXSArIDFdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMl0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29scyAtIDFdICsgMl07XG4gICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAzXSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzXV07XG4gICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA0XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzXSArIDFdO1xuICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgNV0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29sc10gKyAyXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDZdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIDFdXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDddID0gY29sb3JzTWFwW2NzW29mZnNldCAtIDFdICsgMV07XG4gICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA4XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSAxXSArIDJdO1xuXG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyA2XSA9IGNvb3Jkc1twSW5kZXggKyAyXTtcbiAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDddID0gY29vcmRzW3BJbmRleCArIDNdO1xuICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgOF0gPSBjb29yZHNbcEluZGV4ICsgNF07XG4gICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyA5XSA9IGNvb3Jkc1twSW5kZXggKyA1XTtcbiAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDEwXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXRdXTtcbiAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDExXSA9IGNvb3Jkc01hcFtwc1tvZmZzZXRdICsgMV07XG4gICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA5XSA9IGNvbG9yc1tjSW5kZXggKyAzXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDEwXSA9IGNvbG9yc1tjSW5kZXggKyA0XTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDExXSA9IGNvbG9yc1tjSW5kZXggKyA1XTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDEyXSA9IGNvbG9yc1tjSW5kZXggKyA2XTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDEzXSA9IGNvbG9yc1tjSW5kZXggKyA3XTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDE0XSA9IGNvbG9yc1tjSW5kZXggKyA4XTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDE1XSA9IGNvbG9yc01hcFtjc1tvZmZzZXRdXTtcbiAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDE2XSA9IGNvbG9yc01hcFtjc1tvZmZzZXRdICsgMV07XG4gICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxN10gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0XSArIDJdO1xuICAgICAgICAgICAgICBwSW5kZXggKz0gMTI7XG4gICAgICAgICAgICAgIGNJbmRleCArPSAxODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ0cmlhbmdsZXNcIjpcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBwcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgICBjb29yZHNbcEluZGV4XSA9IGNvb3Jkc01hcFtwc1tqXV07XG4gICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMV0gPSBjb29yZHNNYXBbcHNbal0gKyAxXTtcbiAgICAgICAgICAgIGNvbG9yc1tjSW5kZXhdID0gY29sb3JzTWFwW2NzW2pdXTtcbiAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxXSA9IGNvbG9yc01hcFtjc1tqXSArIDFdO1xuICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDJdID0gY29sb3JzTWFwW2NzW2pdICsgMl07XG4gICAgICAgICAgICBwSW5kZXggKz0gMjtcbiAgICAgICAgICAgIGNJbmRleCArPSAzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkcmF3XG4gICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgZ2wuY2xlYXJDb2xvcihcbiAgICAgICAgYmFja2dyb3VuZENvbG9yWzBdIC8gMjU1LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JbMV0gLyAyNTUsXG4gICAgICAgIGJhY2tncm91bmRDb2xvclsyXSAvIDI1NSxcbiAgICAgICAgMS4wXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApO1xuICAgIH1cbiAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTtcblxuICAgIHZhciBjb29yZHNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgY29vcmRzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgY29vcmRzLCBnbC5TVEFUSUNfRFJBVyk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoY2FjaGUucG9zaXRpb25Mb2NhdGlvbik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihjYWNoZS5wb3NpdGlvbkxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuXG4gICAgdmFyIGNvbG9yc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBjb2xvcnNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBjb2xvcnMsIGdsLlNUQVRJQ19EUkFXKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjYWNoZS5jb2xvckxvY2F0aW9uKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgY2FjaGUuY29sb3JMb2NhdGlvbixcbiAgICAgIDMsXG4gICAgICBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgZmFsc2UsXG4gICAgICAwLFxuICAgICAgMFxuICAgICk7XG5cbiAgICBnbC51bmlmb3JtMmYoY2FjaGUuc2NhbGVMb2NhdGlvbiwgY29udGV4dC5zY2FsZVgsIGNvbnRleHQuc2NhbGVZKTtcbiAgICBnbC51bmlmb3JtMmYoY2FjaGUub2Zmc2V0TG9jYXRpb24sIGNvbnRleHQub2Zmc2V0WCwgY29udGV4dC5vZmZzZXRZKTtcblxuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVTLCAwLCBjb3VudCk7XG5cbiAgICBnbC5mbHVzaCgpO1xuXG4gICAgZ2wuZGVsZXRlQnVmZmVyKGNvb3Jkc0J1ZmZlcik7XG4gICAgZ2wuZGVsZXRlQnVmZmVyKGNvbG9yc0J1ZmZlcik7XG5cbiAgICByZXR1cm4gY2FudmFzO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0cnlJbml0R0woKSB7XG4gICAgICB0cnkge1xuICAgICAgICBnZW5lcmF0ZUdMKCk7XG4gICAgICAgIHJldHVybiAhIWN1cnJlbnRHTDtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7fVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBjb21wb3NlU01hc2ssXG5cbiAgICBkcmF3RmlndXJlcyxcblxuICAgIGNsZWFudXAoKSB7XG4gICAgICBpZiAoc21hc2tDYWNoZSAmJiBzbWFza0NhY2hlLmNhbnZhcykge1xuICAgICAgICBzbWFza0NhY2hlLmNhbnZhcy53aWR0aCA9IDA7XG4gICAgICAgIHNtYXNrQ2FjaGUuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICB9XG4gICAgICBpZiAoZmlndXJlc0NhY2hlICYmIGZpZ3VyZXNDYWNoZS5jYW52YXMpIHtcbiAgICAgICAgZmlndXJlc0NhY2hlLmNhbnZhcy53aWR0aCA9IDA7XG4gICAgICAgIGZpZ3VyZXNDYWNoZS5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgIH1cbiAgICAgIHNtYXNrQ2FjaGUgPSBudWxsO1xuICAgICAgZmlndXJlc0NhY2hlID0gbnVsbDtcbiAgICB9LFxuICB9O1xufSkoKTtcblxuZXhwb3J0IHsgV2ViR0xDb250ZXh0IH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7XG4gIGFkZExpbmtBdHRyaWJ1dGVzLFxuICBET01TVkdGYWN0b3J5LFxuICBnZXRGaWxlbmFtZUZyb21VcmwsXG4gIExpbmtUYXJnZXQsXG4gIFBERkRhdGVTdHJpbmcsXG59IGZyb20gXCIuL2Rpc3BsYXlfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUsXG4gIEFubm90YXRpb25UeXBlLFxuICBzdHJpbmdUb1BERlN0cmluZyxcbiAgdW5yZWFjaGFibGUsXG4gIFV0aWwsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgQW5ub3RhdGlvblN0b3JhZ2UgfSBmcm9tIFwiLi9hbm5vdGF0aW9uX3N0b3JhZ2UuanNcIjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBBbm5vdGF0aW9uRWxlbWVudFBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhXG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSBsYXllclxuICogQHByb3BlcnR5IHtQREZQYWdlfSBwYWdlXG4gKiBAcHJvcGVydHkge1BhZ2VWaWV3cG9ydH0gdmlld3BvcnRcbiAqIEBwcm9wZXJ0eSB7SVBERkxpbmtTZXJ2aWNlfSBsaW5rU2VydmljZVxuICogQHByb3BlcnR5IHtEb3dubG9hZE1hbmFnZXJ9IGRvd25sb2FkTWFuYWdlclxuICogQHByb3BlcnR5IHtBbm5vdGF0aW9uU3RvcmFnZX0gW2Fubm90YXRpb25TdG9yYWdlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbWFnZVJlc291cmNlc1BhdGhdIC0gUGF0aCBmb3IgaW1hZ2UgcmVzb3VyY2VzLCBtYWlubHlcbiAqICAgZm9yIGFubm90YXRpb24gaWNvbnMuIEluY2x1ZGUgdHJhaWxpbmcgc2xhc2guXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlbmRlckludGVyYWN0aXZlRm9ybXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzdmdGYWN0b3J5XG4gKi9cblxuY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QW5ub3RhdGlvbkVsZW1lbnRQYXJhbWV0ZXJzfSBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHtBbm5vdGF0aW9uRWxlbWVudH1cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHN1YnR5cGUgPSBwYXJhbWV0ZXJzLmRhdGEuYW5ub3RhdGlvblR5cGU7XG5cbiAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuTElOSzpcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuVEVYVDpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuV0lER0VUOlxuICAgICAgICBjb25zdCBmaWVsZFR5cGUgPSBwYXJhbWV0ZXJzLmRhdGEuZmllbGRUeXBlO1xuXG4gICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICAgICAgY2FzZSBcIlR4XCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiQnRuXCI6XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5kYXRhLnJhZGlvQnV0dG9uKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy5kYXRhLmNoZWNrQm94KSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgIGNhc2UgXCJDaFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlBPUFVQOlxuICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuRlJFRVRFWFQ6XG4gICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5MSU5FOlxuICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5TUVVBUkU6XG4gICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOlxuICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlBPTFlMSU5FOlxuICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuQ0FSRVQ6XG4gICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5JTks6XG4gICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuUE9MWUdPTjpcbiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuSElHSExJR0hUOlxuICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlVOREVSTElORTpcbiAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5TUVVJR0dMWTpcbiAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNUUklLRU9VVDpcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5TVEFNUDpcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UOlxuICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlID0gZmFsc2UsIGlnbm9yZUJvcmRlciA9IGZhbHNlKSB7XG4gICAgdGhpcy5pc1JlbmRlcmFibGUgPSBpc1JlbmRlcmFibGU7XG4gICAgdGhpcy5kYXRhID0gcGFyYW1ldGVycy5kYXRhO1xuICAgIHRoaXMubGF5ZXIgPSBwYXJhbWV0ZXJzLmxheWVyO1xuICAgIHRoaXMucGFnZSA9IHBhcmFtZXRlcnMucGFnZTtcbiAgICB0aGlzLnZpZXdwb3J0ID0gcGFyYW1ldGVycy52aWV3cG9ydDtcbiAgICB0aGlzLmxpbmtTZXJ2aWNlID0gcGFyYW1ldGVycy5saW5rU2VydmljZTtcbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IHBhcmFtZXRlcnMuZG93bmxvYWRNYW5hZ2VyO1xuICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gcGFyYW1ldGVycy5pbWFnZVJlc291cmNlc1BhdGg7XG4gICAgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zO1xuICAgIHRoaXMuc3ZnRmFjdG9yeSA9IHBhcmFtZXRlcnMuc3ZnRmFjdG9yeTtcbiAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlID0gcGFyYW1ldGVycy5hbm5vdGF0aW9uU3RvcmFnZTtcblxuICAgIGlmIChpc1JlbmRlcmFibGUpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5fY3JlYXRlQ29udGFpbmVyKGlnbm9yZUJvcmRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBlbXB0eSBjb250YWluZXIgZm9yIHRoZSBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUJvcmRlclxuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIF9jcmVhdGVDb250YWluZXIoaWdub3JlQm9yZGVyID0gZmFsc2UpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhLFxuICAgICAgcGFnZSA9IHRoaXMucGFnZSxcbiAgICAgIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydDtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiKTtcbiAgICBsZXQgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07XG4gICAgbGV0IGhlaWdodCA9IGRhdGEucmVjdFszXSAtIGRhdGEucmVjdFsxXTtcblxuICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFubm90YXRpb24taWRcIiwgZGF0YS5pZCk7XG5cbiAgICAvLyBEbyAqbm90KiBtb2RpZnkgYGRhdGEucmVjdGAsIHNpbmNlIHRoYXQgd2lsbCBjb3JydXB0IHRoZSBhbm5vdGF0aW9uXG4gICAgLy8gcG9zaXRpb24gb24gc3Vic2VxdWVudCBjYWxscyB0byBgX2NyZWF0ZUNvbnRhaW5lcmAgKHNlZSBpc3N1ZSA2ODA0KS5cbiAgICBjb25zdCByZWN0ID0gVXRpbC5ub3JtYWxpemVSZWN0KFtcbiAgICAgIGRhdGEucmVjdFswXSxcbiAgICAgIHBhZ2Uudmlld1szXSAtIGRhdGEucmVjdFsxXSArIHBhZ2Uudmlld1sxXSxcbiAgICAgIGRhdGEucmVjdFsyXSxcbiAgICAgIHBhZ2Uudmlld1szXSAtIGRhdGEucmVjdFszXSArIHBhZ2Uudmlld1sxXSxcbiAgICBdKTtcblxuICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSBgbWF0cml4KCR7dmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXCIsXCIpfSlgO1xuICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSBgLSR7cmVjdFswXX1weCAtJHtyZWN0WzFdfXB4YDtcblxuICAgIGlmICghaWdub3JlQm9yZGVyICYmIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggPiAwKSB7XG4gICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyV2lkdGggPSBgJHtkYXRhLmJvcmRlclN0eWxlLndpZHRofXB4YDtcbiAgICAgIGlmIChkYXRhLmJvcmRlclN0eWxlLnN0eWxlICE9PSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORSkge1xuICAgICAgICAvLyBVbmRlcmxpbmUgc3R5bGVzIG9ubHkgaGF2ZSBhIGJvdHRvbSBib3JkZXIsIHNvIHdlIGRvIG5vdCBuZWVkXG4gICAgICAgIC8vIHRvIGFkanVzdCBmb3IgYWxsIGJvcmRlcnMuIFRoaXMgeWllbGRzIGEgc2ltaWxhciByZXN1bHQgYXNcbiAgICAgICAgLy8gQWRvYmUgQWNyb2JhdC9SZWFkZXIuXG4gICAgICAgIHdpZHRoID0gd2lkdGggLSAyICogZGF0YS5ib3JkZXJTdHlsZS53aWR0aDtcbiAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC0gMiAqIGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvcml6b250YWxSYWRpdXMgPSBkYXRhLmJvcmRlclN0eWxlLmhvcml6b250YWxDb3JuZXJSYWRpdXM7XG4gICAgICBjb25zdCB2ZXJ0aWNhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUudmVydGljYWxDb3JuZXJSYWRpdXM7XG4gICAgICBpZiAoaG9yaXpvbnRhbFJhZGl1cyA+IDAgfHwgdmVydGljYWxSYWRpdXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IGAke2hvcml6b250YWxSYWRpdXN9cHggLyAke3ZlcnRpY2FsUmFkaXVzfXB4YDtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclJhZGl1cyA9IHJhZGl1cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkYXRhLmJvcmRlclN0eWxlLnN0eWxlKSB7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDpcbiAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDpcbiAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyU3R5bGUgPSBcImRhc2hlZFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEOlxuICAgICAgICAgIHdhcm4oXCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogYmV2ZWxlZFwiKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ6XG4gICAgICAgICAgd2FybihcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBpbnNldFwiKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOlxuICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJCb3R0b21TdHlsZSA9IFwic29saWRcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5jb2xvcikge1xuICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyQ29sb3IgPSBVdGlsLm1ha2VDc3NSZ2IoXG4gICAgICAgICAgZGF0YS5jb2xvclswXSB8IDAsXG4gICAgICAgICAgZGF0YS5jb2xvclsxXSB8IDAsXG4gICAgICAgICAgZGF0YS5jb2xvclsyXSB8IDBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRyYW5zcGFyZW50IChpbnZpc2libGUpIGJvcmRlciwgc28gZG8gbm90IGRyYXcgaXQgYXQgYWxsLlxuICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyV2lkdGggPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7cmVjdFswXX1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IGAke3JlY3RbMV19cHhgO1xuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHBvcHVwIGZvciB0aGUgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudC4gVGhpcyBpcyB1c2VkIGZvclxuICAgKiBhbm5vdGF0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIGEgUG9wdXAgZW50cnkgaW4gdGhlIGRpY3Rpb25hcnksIGJ1dFxuICAgKiBhcmUgb2YgYSB0eXBlIHRoYXQgd29ya3Mgd2l0aCBwb3B1cHMgKHN1Y2ggYXMgSGlnaGxpZ2h0IGFubm90YXRpb25zKS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtIVE1MU2VjdGlvbkVsZW1lbnR9IGNvbnRhaW5lclxuICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fEhUTUxJbWFnZUVsZW1lbnR8bnVsbH0gdHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvbkVsZW1lbnRcbiAgICovXG4gIF9jcmVhdGVQb3B1cChjb250YWluZXIsIHRyaWdnZXIsIGRhdGEpIHtcbiAgICAvLyBJZiBubyB0cmlnZ2VyIGVsZW1lbnQgaXMgc3BlY2lmaWVkLCBjcmVhdGUgaXQuXG4gICAgaWYgKCF0cmlnZ2VyKSB7XG4gICAgICB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRyaWdnZXIuc3R5bGUuaGVpZ2h0ID0gY29udGFpbmVyLnN0eWxlLmhlaWdodDtcbiAgICAgIHRyaWdnZXIuc3R5bGUud2lkdGggPSBjb250YWluZXIuc3R5bGUud2lkdGg7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodHJpZ2dlcik7XG4gICAgfVxuXG4gICAgY29uc3QgcG9wdXBFbGVtZW50ID0gbmV3IFBvcHVwRWxlbWVudCh7XG4gICAgICBjb250YWluZXIsXG4gICAgICB0cmlnZ2VyLFxuICAgICAgY29sb3I6IGRhdGEuY29sb3IsXG4gICAgICB0aXRsZTogZGF0YS50aXRsZSxcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IGRhdGEubW9kaWZpY2F0aW9uRGF0ZSxcbiAgICAgIGNvbnRlbnRzOiBkYXRhLmNvbnRlbnRzLFxuICAgICAgaGlkZVdyYXBwZXI6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgcG9wdXAgPSBwb3B1cEVsZW1lbnQucmVuZGVyKCk7XG5cbiAgICAvLyBQb3NpdGlvbiB0aGUgcG9wdXAgbmV4dCB0byB0aGUgYW5ub3RhdGlvbidzIGNvbnRhaW5lci5cbiAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gY29udGFpbmVyLnN0eWxlLndpZHRoO1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHBvcHVwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvbkVsZW1lbnRcbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWRcIik7XG4gIH1cbn1cblxuY2xhc3MgTGlua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudXJsIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuZGVzdCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmFjdGlvblxuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGxpbmsgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBMaW5rQW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImxpbmtBbm5vdGF0aW9uXCI7XG5cbiAgICBjb25zdCB7IGRhdGEsIGxpbmtTZXJ2aWNlIH0gPSB0aGlzO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcblxuICAgIGlmIChkYXRhLnVybCkge1xuICAgICAgYWRkTGlua0F0dHJpYnV0ZXMobGluaywge1xuICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICB0YXJnZXQ6IGRhdGEubmV3V2luZG93XG4gICAgICAgICAgPyBMaW5rVGFyZ2V0LkJMQU5LXG4gICAgICAgICAgOiBsaW5rU2VydmljZS5leHRlcm5hbExpbmtUYXJnZXQsXG4gICAgICAgIHJlbDogbGlua1NlcnZpY2UuZXh0ZXJuYWxMaW5rUmVsLFxuICAgICAgICBlbmFibGVkOiBsaW5rU2VydmljZS5leHRlcm5hbExpbmtFbmFibGVkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChkYXRhLmFjdGlvbikge1xuICAgICAgdGhpcy5fYmluZE5hbWVkQWN0aW9uKGxpbmssIGRhdGEuYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYmluZExpbmsobGluaywgZGF0YS5kZXN0KTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBpbnRlcm5hbCBsaW5rcyB0byB0aGUgbGluayBlbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGlua1xuICAgKiBAcGFyYW0ge09iamVjdH0gZGVzdGluYXRpb25cbiAgICogQG1lbWJlcm9mIExpbmtBbm5vdGF0aW9uRWxlbWVudFxuICAgKi9cbiAgX2JpbmRMaW5rKGxpbmssIGRlc3RpbmF0aW9uKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXREZXN0aW5hdGlvbkhhc2goZGVzdGluYXRpb24pO1xuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLm5hdmlnYXRlVG8oZGVzdGluYXRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgaWYgKGRlc3RpbmF0aW9uKSB7XG4gICAgICBsaW5rLmNsYXNzTmFtZSA9IFwiaW50ZXJuYWxMaW5rXCI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJpbmQgbmFtZWQgYWN0aW9ucyB0byB0aGUgbGluayBlbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGlua1xuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gICAqIEBtZW1iZXJvZiBMaW5rQW5ub3RhdGlvbkVsZW1lbnRcbiAgICovXG4gIF9iaW5kTmFtZWRBY3Rpb24obGluaywgYWN0aW9uKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGxpbmsuY2xhc3NOYW1lID0gXCJpbnRlcm5hbExpbmtcIjtcbiAgfVxufVxuXG5jbGFzcyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSB0ZXh0IGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgVGV4dEFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJ0ZXh0QW5ub3RhdGlvblwiO1xuXG4gICAgY29uc3QgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgIGltYWdlLnN0eWxlLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodDtcbiAgICBpbWFnZS5zdHlsZS53aWR0aCA9IHRoaXMuY29udGFpbmVyLnN0eWxlLndpZHRoO1xuICAgIGltYWdlLnNyYyA9XG4gICAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCArXG4gICAgICBcImFubm90YXRpb24tXCIgK1xuICAgICAgdGhpcy5kYXRhLm5hbWUudG9Mb3dlckNhc2UoKSArXG4gICAgICBcIi5zdmdcIjtcbiAgICBpbWFnZS5hbHQgPSBcIlt7e3R5cGV9fSBBbm5vdGF0aW9uXVwiO1xuICAgIGltYWdlLmRhdGFzZXQubDEwbklkID0gXCJ0ZXh0X2Fubm90YXRpb25fdHlwZVwiO1xuICAgIGltYWdlLmRhdGFzZXQubDEwbkFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7IHR5cGU6IHRoaXMuZGF0YS5uYW1lIH0pO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBpbWFnZSwgdGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChpbWFnZSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAvKipcbiAgICogUmVuZGVyIHRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIC8vIFNob3cgb25seSB0aGUgY29udGFpbmVyIGZvciB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlcy5cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID1cbiAgICAgIHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyB8fFxuICAgICAgKCFwYXJhbWV0ZXJzLmRhdGEuaGFzQXBwZWFyYW5jZSAmJiAhIXBhcmFtZXRlcnMuZGF0YS5maWVsZFZhbHVlKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgdGV4dCB3aWRnZXQgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBURVhUX0FMSUdOTUVOVCA9IFtcImxlZnRcIiwgXCJjZW50ZXJcIiwgXCJyaWdodFwiXTtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZGF0YS5pZDtcblxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwidGV4dFdpZGdldEFubm90YXRpb25cIjtcblxuICAgIGxldCBlbGVtZW50ID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zKSB7XG4gICAgICAvLyBOT1RFOiBXZSBjYW5ub3Qgc2V0IHRoZSB2YWx1ZXMgdXNpbmcgYGVsZW1lbnQudmFsdWVgIGJlbG93LCBzaW5jZSBpdFxuICAgICAgLy8gICAgICAgcHJldmVudHMgdGhlIEFubm90YXRpb25MYXllciByYXN0ZXJpemVyIGluIGB0ZXN0L2RyaXZlci5qc2BcbiAgICAgIC8vICAgICAgIGZyb20gcGFyc2luZyB0aGUgZWxlbWVudHMgY29ycmVjdGx5IGZvciB0aGUgcmVmZXJlbmNlIHRlc3RzLlxuICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBzdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoaWQsIHRoaXMuZGF0YS5maWVsZFZhbHVlKTtcblxuICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHRDb250ZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgZWxlbWVudC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgdGV4dENvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwgZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBlbGVtZW50LmRpc2FibGVkID0gdGhpcy5kYXRhLnJlYWRPbmx5O1xuICAgICAgZWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTtcblxuICAgICAgaWYgKHRoaXMuZGF0YS5tYXhMZW4gIT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5tYXhMZW5ndGggPSB0aGlzLmRhdGEubWF4TGVuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHtcbiAgICAgICAgY29uc3QgZmllbGRXaWR0aCA9IHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF07XG4gICAgICAgIGNvbnN0IGNvbWJXaWR0aCA9IGZpZWxkV2lkdGggLyB0aGlzLmRhdGEubWF4TGVuO1xuXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImNvbWJcIik7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUubGV0dGVyU3BhY2luZyA9IGBjYWxjKCR7Y29tYldpZHRofXB4IC0gMWNoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuZGF0YS5maWVsZFZhbHVlO1xuICAgICAgZWxlbWVudC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gXCJtaWRkbGVcIjtcbiAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwidGFibGUtY2VsbFwiO1xuXG4gICAgICBsZXQgZm9udCA9IG51bGw7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZGF0YS5mb250UmVmTmFtZSAmJlxuICAgICAgICB0aGlzLnBhZ2UuY29tbW9uT2Jqcy5oYXModGhpcy5kYXRhLmZvbnRSZWZOYW1lKVxuICAgICAgKSB7XG4gICAgICAgIGZvbnQgPSB0aGlzLnBhZ2UuY29tbW9uT2Jqcy5nZXQodGhpcy5kYXRhLmZvbnRSZWZOYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NldFRleHRTdHlsZShlbGVtZW50LCBmb250KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgIT09IG51bGwpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUudGV4dEFsaWduID0gVEVYVF9BTElHTk1FTlRbdGhpcy5kYXRhLnRleHRBbGlnbm1lbnRdO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0ZXh0IHN0eWxlcyB0byB0aGUgdGV4dCBpbiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZm9udFxuICAgKiBAbWVtYmVyb2YgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50XG4gICAqL1xuICBfc2V0VGV4dFN0eWxlKGVsZW1lbnQsIGZvbnQpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGR1cGxpY2F0ZXMgc29tZSBvZiB0aGUgbG9naWMgaW4gQ2FudmFzR3JhcGhpY3Muc2V0Rm9udCgpLlxuICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudC5zdHlsZTtcbiAgICBzdHlsZS5mb250U2l6ZSA9IGAke3RoaXMuZGF0YS5mb250U2l6ZX1weGA7XG4gICAgc3R5bGUuZGlyZWN0aW9uID0gdGhpcy5kYXRhLmZvbnREaXJlY3Rpb24gPCAwID8gXCJydGxcIiA6IFwibHRyXCI7XG5cbiAgICBpZiAoIWZvbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYm9sZCA9IFwibm9ybWFsXCI7XG4gICAgaWYgKGZvbnQuYmxhY2spIHtcbiAgICAgIGJvbGQgPSBcIjkwMFwiO1xuICAgIH0gZWxzZSBpZiAoZm9udC5ib2xkKSB7XG4gICAgICBib2xkID0gXCJib2xkXCI7XG4gICAgfVxuICAgIHN0eWxlLmZvbnRXZWlnaHQgPSBib2xkO1xuICAgIHN0eWxlLmZvbnRTdHlsZSA9IGZvbnQuaXRhbGljID8gXCJpdGFsaWNcIiA6IFwibm9ybWFsXCI7XG5cbiAgICAvLyBVc2UgYSByZWFzb25hYmxlIGRlZmF1bHQgZm9udCBpZiB0aGUgZm9udCBkb2Vzbid0IHNwZWNpZnkgYSBmYWxsYmFjay5cbiAgICBjb25zdCBmb250RmFtaWx5ID0gZm9udC5sb2FkZWROYW1lID8gYFwiJHtmb250LmxvYWRlZE5hbWV9XCIsIGAgOiBcIlwiO1xuICAgIGNvbnN0IGZhbGxiYWNrTmFtZSA9IGZvbnQuZmFsbGJhY2tOYW1lIHx8IFwiSGVsdmV0aWNhLCBzYW5zLXNlcmlmXCI7XG4gICAgc3R5bGUuZm9udEZhbWlseSA9IGZvbnRGYW1pbHkgKyBmYWxsYmFja05hbWU7XG4gIH1cbn1cblxuY2xhc3MgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjaGVja2JveCB3aWRnZXQgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudFxuICAgKiBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCBpZCA9IGRhdGEuaWQ7XG4gICAgY29uc3QgdmFsdWUgPSBzdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoXG4gICAgICBpZCxcbiAgICAgIGRhdGEuZmllbGRWYWx1ZSAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IFwiT2ZmXCJcbiAgICApO1xuXG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uIGNoZWNrQm94XCI7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5O1xuICAgIGVsZW1lbnQudHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuICAgIH1cblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIGV2ZW50LnRhcmdldC5jaGVja2VkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywgcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHJhZGlvIGJ1dHRvbiB3aWRnZXQgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudFxuICAgKiBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uIHJhZGlvQnV0dG9uXCI7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCBpZCA9IGRhdGEuaWQ7XG4gICAgY29uc3QgdmFsdWUgPSBzdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoXG4gICAgICBpZCxcbiAgICAgIGRhdGEuZmllbGRWYWx1ZSA9PT0gZGF0YS5idXR0b25WYWx1ZVxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5O1xuICAgIGVsZW1lbnQudHlwZSA9IFwicmFkaW9cIjtcbiAgICBlbGVtZW50Lm5hbWUgPSBkYXRhLmZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBjb25zdCBuYW1lID0gZXZlbnQudGFyZ2V0Lm5hbWU7XG4gICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKG5hbWUpKSB7XG4gICAgICAgIGlmIChyYWRpbyAhPT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShcbiAgICAgICAgICAgIHJhZGlvLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1hbm5vdGF0aW9uLWlkXCIpLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCBldmVudC50YXJnZXQuY2hlY2tlZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgTGlua0Fubm90YXRpb25FbGVtZW50IHtcbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgcHVzaCBidXR0b24gd2lkZ2V0IGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnRcbiAgICogaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgLy8gVGhlIHJlbmRlcmluZyBhbmQgZnVuY3Rpb25hbGl0eSBvZiBhIHB1c2ggYnV0dG9uIHdpZGdldCBhbm5vdGF0aW9uIGlzXG4gICAgLy8gZXF1YWwgdG8gdGhhdCBvZiBhIGxpbmsgYW5ub3RhdGlvbiwgYnV0IG1heSBoYXZlIG1vcmUgZnVuY3Rpb25hbGl0eSwgc3VjaFxuICAgIC8vIGFzIHBlcmZvcm1pbmcgYWN0aW9ucyBvbiBmb3JtIGZpZWxkcyAocmVzZXR0aW5nLCBzdWJtaXR0aW5nLCBldCBjZXRlcmEpLlxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHN1cGVyLnJlbmRlcigpO1xuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBcImJ1dHRvbldpZGdldEFubm90YXRpb24gcHVzaEJ1dHRvblwiO1xuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY2hvaWNlIHdpZGdldCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eVxuICAgKiBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uXCI7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgaWQgPSB0aGlzLmRhdGEuaWQ7XG5cbiAgICAvLyBGb3IgcHJpbnRpbmcvc2F2aW5nIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgY2hvaWNlIHdpZGdldHMgd2l0aCBvbmVcbiAgICAvLyBvcHRpb24gc2VsZWN0aW9uLiBUaGVyZWZvcmUsIGxpc3Rib3hlcyAoIzEyMTg5KSBhbmQgY29tYm9ib3hlcyAoIzEyMjI0KVxuICAgIC8vIGFyZSBub3QgcHJvcGVybHkgcHJpbnRlZC9zYXZlZCB5ZXQsIHNvIHdlIG9ubHkgc3RvcmUgdGhlIGZpcnN0IGl0ZW0gaW5cbiAgICAvLyB0aGUgZmllbGQgdmFsdWUgYXJyYXkgaW5zdGVhZCBvZiB0aGUgZW50aXJlIGFycmF5LiBPbmNlIHN1cHBvcnQgZm9yIHRob3NlXG4gICAgLy8gdHdvIGZpZWxkIHR5cGVzIGlzIGltcGxlbWVudGVkLCB3ZSBzaG91bGQgdXNlIHRoZSBzYW1lIHBhdHRlcm4gYXMgdGhlXG4gICAgLy8gb3RoZXIgaW50ZXJhY3RpdmUgd2lkZ2V0cyB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGBnZXRPckNyZWF0ZVZhbHVlYCBpc1xuICAgIC8vIHVzZWQgYW5kIHRoZSBmdWxsIGFycmF5IG9mIGZpZWxkIHZhbHVlcyBpcyBzdG9yZWQuXG4gICAgc3RvcmFnZS5nZXRPckNyZWF0ZVZhbHVlKFxuICAgICAgaWQsXG4gICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5kYXRhLmZpZWxkVmFsdWVbMF0gOiBudWxsXG4gICAgKTtcblxuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xuICAgIHNlbGVjdEVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgc2VsZWN0RWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTtcblxuICAgIGlmICghdGhpcy5kYXRhLmNvbWJvKSB7XG4gICAgICAvLyBMaXN0IGJveGVzIGhhdmUgYSBzaXplIGFuZCAob3B0aW9uYWxseSkgbXVsdGlwbGUgc2VsZWN0aW9uLlxuICAgICAgc2VsZWN0RWxlbWVudC5zaXplID0gdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aVNlbGVjdCkge1xuICAgICAgICBzZWxlY3RFbGVtZW50Lm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgdGhlIG9wdGlvbnMgaW50byB0aGUgY2hvaWNlIGZpZWxkLlxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHRoaXMuZGF0YS5vcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb24uZGlzcGxheVZhbHVlO1xuICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IG9wdGlvbi5leHBvcnRWYWx1ZTtcbiAgICAgIGlmICh0aGlzLmRhdGEuZmllbGRWYWx1ZS5pbmNsdWRlcyhvcHRpb24uZXhwb3J0VmFsdWUpKSB7XG4gICAgICAgIG9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpO1xuICAgIH1cblxuICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zO1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdGlvbnMuc2VsZWN0ZWRJbmRleF0udmFsdWU7XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChzZWxlY3RFbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBwb3B1cCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICAvLyBEbyBub3QgcmVuZGVyIHBvcHVwIGFubm90YXRpb25zIGZvciBwYXJlbnQgZWxlbWVudHMgd2l0aCB0aGVzZSB0eXBlcyBhc1xuICAgIC8vIHRoZXkgY3JlYXRlIHRoZSBwb3B1cHMgdGhlbXNlbHZlcyAoYmVjYXVzZSBvZiBjdXN0b20gdHJpZ2dlciBkaXZzKS5cbiAgICBjb25zdCBJR05PUkVfVFlQRVMgPSBbXG4gICAgICBcIkxpbmVcIixcbiAgICAgIFwiU3F1YXJlXCIsXG4gICAgICBcIkNpcmNsZVwiLFxuICAgICAgXCJQb2x5TGluZVwiLFxuICAgICAgXCJQb2x5Z29uXCIsXG4gICAgICBcIklua1wiLFxuICAgIF07XG5cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcInBvcHVwQW5ub3RhdGlvblwiO1xuXG4gICAgaWYgKElHTk9SRV9UWVBFUy5pbmNsdWRlcyh0aGlzLmRhdGEucGFyZW50VHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvciA9IGBbZGF0YS1hbm5vdGF0aW9uLWlkPVwiJHt0aGlzLmRhdGEucGFyZW50SWR9XCJdYDtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5sYXllci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICBpZiAoIXBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3B1cCA9IG5ldyBQb3B1cEVsZW1lbnQoe1xuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgIHRyaWdnZXI6IHBhcmVudEVsZW1lbnQsXG4gICAgICBjb2xvcjogdGhpcy5kYXRhLmNvbG9yLFxuICAgICAgdGl0bGU6IHRoaXMuZGF0YS50aXRsZSxcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgY29udGVudHM6IHRoaXMuZGF0YS5jb250ZW50cyxcbiAgICB9KTtcblxuICAgIC8vIFBvc2l0aW9uIHRoZSBwb3B1cCBuZXh0IHRvIHRoZSBwYXJlbnQgYW5ub3RhdGlvbidzIGNvbnRhaW5lci5cbiAgICAvLyBQREYgdmlld2VycyBpZ25vcmUgYSBwb3B1cCBhbm5vdGF0aW9uJ3MgcmVjdGFuZ2xlLlxuICAgIGNvbnN0IHBhcmVudExlZnQgPSBwYXJzZUZsb2F0KHBhcmVudEVsZW1lbnQuc3R5bGUubGVmdCk7XG4gICAgY29uc3QgcGFyZW50V2lkdGggPSBwYXJzZUZsb2F0KHBhcmVudEVsZW1lbnQuc3R5bGUud2lkdGgpO1xuICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGAtJHtwYXJlbnRMZWZ0ICsgcGFyZW50V2lkdGh9cHggLSR7XG4gICAgICBwYXJlbnRFbGVtZW50LnN0eWxlLnRvcFxuICAgIH1gO1xuICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHtwYXJlbnRMZWZ0ICsgcGFyZW50V2lkdGh9cHhgO1xuXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQocG9wdXAucmVuZGVyKCkpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBQb3B1cEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBwYXJhbWV0ZXJzLmNvbnRhaW5lcjtcbiAgICB0aGlzLnRyaWdnZXIgPSBwYXJhbWV0ZXJzLnRyaWdnZXI7XG4gICAgdGhpcy5jb2xvciA9IHBhcmFtZXRlcnMuY29sb3I7XG4gICAgdGhpcy50aXRsZSA9IHBhcmFtZXRlcnMudGl0bGU7XG4gICAgdGhpcy5tb2RpZmljYXRpb25EYXRlID0gcGFyYW1ldGVycy5tb2RpZmljYXRpb25EYXRlO1xuICAgIHRoaXMuY29udGVudHMgPSBwYXJhbWV0ZXJzLmNvbnRlbnRzO1xuICAgIHRoaXMuaGlkZVdyYXBwZXIgPSBwYXJhbWV0ZXJzLmhpZGVXcmFwcGVyIHx8IGZhbHNlO1xuXG4gICAgdGhpcy5waW5uZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHBvcHVwJ3MgSFRNTCBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBQb3B1cEVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBCQUNLR1JPVU5EX0VOTElHSFQgPSAwLjc7XG5cbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB3cmFwcGVyLmNsYXNzTmFtZSA9IFwicG9wdXBXcmFwcGVyXCI7XG5cbiAgICAvLyBGb3IgUG9wdXAgYW5ub3RhdGlvbnMgd2UgaGlkZSB0aGUgZW50aXJlIHNlY3Rpb24gYmVjYXVzZSBpdCBjb250YWluc1xuICAgIC8vIG9ubHkgdGhlIHBvcHVwLiBIb3dldmVyLCBmb3IgVGV4dCBhbm5vdGF0aW9ucyB3aXRob3V0IGEgc2VwYXJhdGUgUG9wdXBcbiAgICAvLyBhbm5vdGF0aW9uLCB3ZSBjYW5ub3QgaGlkZSB0aGUgZW50aXJlIGNvbnRhaW5lciBhcyB0aGUgaW1hZ2Ugd291bGRcbiAgICAvLyBkaXNhcHBlYXIgdG9vLiBJbiB0aGF0IHNwZWNpYWwgY2FzZSwgaGlkaW5nIHRoZSB3cmFwcGVyIHN1ZmZpY2VzLlxuICAgIHRoaXMuaGlkZUVsZW1lbnQgPSB0aGlzLmhpZGVXcmFwcGVyID8gd3JhcHBlciA6IHRoaXMuY29udGFpbmVyO1xuICAgIHRoaXMuaGlkZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIHRydWUpO1xuXG4gICAgY29uc3QgcG9wdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHBvcHVwLmNsYXNzTmFtZSA9IFwicG9wdXBcIjtcblxuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5jb2xvcjtcbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIC8vIEVubGlnaHRlbiB0aGUgY29sb3IuXG4gICAgICBjb25zdCByID0gQkFDS0dST1VORF9FTkxJR0hUICogKDI1NSAtIGNvbG9yWzBdKSArIGNvbG9yWzBdO1xuICAgICAgY29uc3QgZyA9IEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjb2xvclsxXSkgKyBjb2xvclsxXTtcbiAgICAgIGNvbnN0IGIgPSBCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gY29sb3JbMl0pICsgY29sb3JbMl07XG4gICAgICBwb3B1cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBVdGlsLm1ha2VDc3NSZ2IociB8IDAsIGcgfCAwLCBiIHwgMCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDFcIik7XG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSB0aGlzLnRpdGxlO1xuICAgIHBvcHVwLmFwcGVuZENoaWxkKHRpdGxlKTtcblxuICAgIC8vIFRoZSBtb2RpZmljYXRpb24gZGF0ZSBpcyBzaG93biBpbiB0aGUgcG9wdXAgaW5zdGVhZCBvZiB0aGUgY3JlYXRpb25cbiAgICAvLyBkYXRlIGlmIGl0IGlzIGF2YWlsYWJsZSBhbmQgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHksIHdoaWNoIGlzXG4gICAgLy8gY29uc2lzdGVudCB3aXRoIG90aGVyIHZpZXdlcnMgc3VjaCBhcyBBZG9iZSBBY3JvYmF0LlxuICAgIGNvbnN0IGRhdGVPYmplY3QgPSBQREZEYXRlU3RyaW5nLnRvRGF0ZU9iamVjdCh0aGlzLm1vZGlmaWNhdGlvbkRhdGUpO1xuICAgIGlmIChkYXRlT2JqZWN0KSB7XG4gICAgICBjb25zdCBtb2RpZmljYXRpb25EYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBtb2RpZmljYXRpb25EYXRlLnRleHRDb250ZW50ID0gXCJ7e2RhdGV9fSwge3t0aW1lfX1cIjtcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGUuZGF0YXNldC5sMTBuSWQgPSBcImFubm90YXRpb25fZGF0ZV9zdHJpbmdcIjtcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGUuZGF0YXNldC5sMTBuQXJncyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZGF0ZTogZGF0ZU9iamVjdC50b0xvY2FsZURhdGVTdHJpbmcoKSxcbiAgICAgICAgdGltZTogZGF0ZU9iamVjdC50b0xvY2FsZVRpbWVTdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQobW9kaWZpY2F0aW9uRGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudHMgPSB0aGlzLl9mb3JtYXRDb250ZW50cyh0aGlzLmNvbnRlbnRzKTtcbiAgICBwb3B1cC5hcHBlbmRDaGlsZChjb250ZW50cyk7XG5cbiAgICAvLyBBdHRhY2ggdGhlIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgdHJpZ2dlciBlbGVtZW50LlxuICAgIHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5fdG9nZ2xlLmJpbmQodGhpcykpO1xuICAgIHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIHRoaXMuX3Nob3cuYmluZCh0aGlzLCBmYWxzZSkpO1xuICAgIHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgdGhpcy5faGlkZS5iaW5kKHRoaXMsIGZhbHNlKSk7XG4gICAgcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hpZGUuYmluZCh0aGlzLCB0cnVlKSk7XG5cbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHBvcHVwKTtcbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwb3B1cCBieSBhZGRpbmcgbmV3bGluZXMgd2hlcmUgbmVjZXNzYXJ5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudHNcbiAgICogQG1lbWJlcm9mIFBvcHVwRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFBhcmFncmFwaEVsZW1lbnR9XG4gICAqL1xuICBfZm9ybWF0Q29udGVudHMoY29udGVudHMpIHtcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50cy5zcGxpdCgvKD86XFxyXFxuP3xcXG4pLyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSk7XG4gICAgICBpZiAoaSA8IGlpIC0gMSkge1xuICAgICAgICBwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcG9wdXAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQb3B1cEVsZW1lbnRcbiAgICovXG4gIF90b2dnbGUoKSB7XG4gICAgaWYgKHRoaXMucGlubmVkKSB7XG4gICAgICB0aGlzLl9oaWRlKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zaG93KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBwb3B1cC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwaW5cbiAgICogQG1lbWJlcm9mIFBvcHVwRWxlbWVudFxuICAgKi9cbiAgX3Nob3cocGluID0gZmFsc2UpIHtcbiAgICBpZiAocGluKSB7XG4gICAgICB0aGlzLnBpbm5lZCA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmhpZGVFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhpZGRlblwiKSkge1xuICAgICAgdGhpcy5oaWRlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggKz0gMTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgcG9wdXAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdW5waW5cbiAgICogQG1lbWJlcm9mIFBvcHVwRWxlbWVudFxuICAgKi9cbiAgX2hpZGUodW5waW4gPSB0cnVlKSB7XG4gICAgaWYgKHVucGluKSB7XG4gICAgICB0aGlzLnBpbm5lZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGlkZUVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaGlkZGVuXCIpICYmICF0aGlzLnBpbm5lZCkge1xuICAgICAgdGhpcy5oaWRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgdHJ1ZSk7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggLT0gMTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCAvKiBpZ25vcmVCb3JkZXIgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGZyZWUgdGV4dCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImZyZWVUZXh0QW5ub3RhdGlvblwiO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgTGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIC8qIGlnbm9yZUJvcmRlciA9ICovIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgbGluZSBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIExpbmVBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwibGluZUFubm90YXRpb25cIjtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnZpc2libGUgbGluZSB3aXRoIHRoZSBzYW1lIHN0YXJ0aW5nIGFuZCBlbmRpbmcgY29vcmRpbmF0ZXNcbiAgICAvLyB0aGF0IGFjdHMgYXMgdGhlIHRyaWdnZXIgZm9yIHRoZSBwb3B1cC4gT25seSB0aGUgbGluZSBpdHNlbGYgc2hvdWxkXG4gICAgLy8gdHJpZ2dlciB0aGUgcG9wdXAsIG5vdCB0aGUgZW50aXJlIGNvbnRhaW5lci5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gZGF0YS5yZWN0WzJdIC0gZGF0YS5yZWN0WzBdO1xuICAgIGNvbnN0IGhlaWdodCA9IGRhdGEucmVjdFszXSAtIGRhdGEucmVjdFsxXTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgLy8gUERGIGNvb3JkaW5hdGVzIGFyZSBjYWxjdWxhdGVkIGZyb20gYSBib3R0b20gbGVmdCBvcmlnaW4sIHNvIHRyYW5zZm9ybVxuICAgIC8vIHRoZSBsaW5lIGNvb3JkaW5hdGVzIHRvIGEgdG9wIGxlZnQgb3JpZ2luIGZvciB0aGUgU1ZHIGVsZW1lbnQuXG4gICAgY29uc3QgbGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmxpbmVcIik7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ4MVwiLCBkYXRhLnJlY3RbMl0gLSBkYXRhLmxpbmVDb29yZGluYXRlc1swXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ5MVwiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1sxXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ4MlwiLCBkYXRhLnJlY3RbMl0gLSBkYXRhLmxpbmVDb29yZGluYXRlc1syXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ5MlwiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1szXSk7XG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlICdzdHJva2Utd2lkdGgnIGlzIGFsd2F5cyBub24temVybywgc2luY2Ugb3RoZXJ3aXNlIGl0XG4gICAgLy8gd29uJ3QgYmUgcG9zc2libGUgdG8gb3Blbi9jbG9zZSB0aGUgcG9wdXAgKG5vdGUgZS5nLiBpc3N1ZSAxMTEyMikuXG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuXG4gICAgc3ZnLmFwcGVuZENoaWxkKGxpbmUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBwb3B1cCBvdXJzZWx2ZXMgc28gdGhhdCB3ZSBjYW4gYmluZCBpdCB0byB0aGUgbGluZSBpbnN0ZWFkXG4gICAgLy8gb2YgdG8gdGhlIGVudGlyZSBjb250YWluZXIgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS5cbiAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbGluZSwgZGF0YSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgLyogaWdub3JlQm9yZGVyID0gKi8gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBzcXVhcmUgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTFNlY3Rpb25FbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IFwic3F1YXJlQW5ub3RhdGlvblwiO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludmlzaWJsZSBzcXVhcmUgd2l0aCB0aGUgc2FtZSByZWN0YW5nbGUgdGhhdCBhY3RzIGFzIHRoZVxuICAgIC8vIHRyaWdnZXIgZm9yIHRoZSBwb3B1cC4gT25seSB0aGUgc3F1YXJlIGl0c2VsZiBzaG91bGQgdHJpZ2dlciB0aGVcbiAgICAvLyBwb3B1cCwgbm90IHRoZSBlbnRpcmUgY29udGFpbmVyLlxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07XG4gICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBUaGUgYnJvd3NlciBkcmF3cyBoYWxmIG9mIHRoZSBib3JkZXJzIGluc2lkZSB0aGUgc3F1YXJlIGFuZCBoYWxmIG9mXG4gICAgLy8gdGhlIGJvcmRlcnMgb3V0c2lkZSB0aGUgc3F1YXJlIGJ5IGRlZmF1bHQuIFRoaXMgYmVoYXZpb3IgY2Fubm90IGJlXG4gICAgLy8gY2hhbmdlZCBwcm9ncmFtbWF0aWNhbGx5LCBzbyBjb3JyZWN0IGZvciB0aGF0IGhlcmUuXG4gICAgY29uc3QgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoO1xuICAgIGNvbnN0IHNxdWFyZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInhcIiwgYm9yZGVyV2lkdGggLyAyKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwieVwiLCBib3JkZXJXaWR0aCAvIDIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3aWR0aCAtIGJvcmRlcldpZHRoKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGhlaWdodCAtIGJvcmRlcldpZHRoKTtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgJ3N0cm9rZS13aWR0aCcgaXMgYWx3YXlzIG5vbi16ZXJvLCBzaW5jZSBvdGhlcndpc2UgaXRcbiAgICAvLyB3b24ndCBiZSBwb3NzaWJsZSB0byBvcGVuL2Nsb3NlIHRoZSBwb3B1cCAobm90ZSBlLmcuIGlzc3VlIDExMTIyKS5cbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGJvcmRlcldpZHRoIHx8IDEpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cbiAgICBzdmcuYXBwZW5kQ2hpbGQoc3F1YXJlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcG9wdXAgb3Vyc2VsdmVzIHNvIHRoYXQgd2UgY2FuIGJpbmQgaXQgdG8gdGhlIHNxdWFyZSBpbnN0ZWFkXG4gICAgLy8gb2YgdG8gdGhlIGVudGlyZSBjb250YWluZXIgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS5cbiAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgc3F1YXJlLCBkYXRhKTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCAvKiBpZ25vcmVCb3JkZXIgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNpcmNsZSBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIENpcmNsZUFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJjaXJjbGVBbm5vdGF0aW9uXCI7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW52aXNpYmxlIGNpcmNsZSB3aXRoIHRoZSBzYW1lIGVsbGlwc2UgdGhhdCBhY3RzIGFzIHRoZVxuICAgIC8vIHRyaWdnZXIgZm9yIHRoZSBwb3B1cC4gT25seSB0aGUgY2lyY2xlIGl0c2VsZiBzaG91bGQgdHJpZ2dlciB0aGVcbiAgICAvLyBwb3B1cCwgbm90IHRoZSBlbnRpcmUgY29udGFpbmVyLlxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07XG4gICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBUaGUgYnJvd3NlciBkcmF3cyBoYWxmIG9mIHRoZSBib3JkZXJzIGluc2lkZSB0aGUgY2lyY2xlIGFuZCBoYWxmIG9mXG4gICAgLy8gdGhlIGJvcmRlcnMgb3V0c2lkZSB0aGUgY2lyY2xlIGJ5IGRlZmF1bHQuIFRoaXMgYmVoYXZpb3IgY2Fubm90IGJlXG4gICAgLy8gY2hhbmdlZCBwcm9ncmFtbWF0aWNhbGx5LCBzbyBjb3JyZWN0IGZvciB0aGF0IGhlcmUuXG4gICAgY29uc3QgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoO1xuICAgIGNvbnN0IGNpcmNsZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmVsbGlwc2VcIik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcImN4XCIsIHdpZHRoIC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcImN5XCIsIGhlaWdodCAvIDIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJyeFwiLCB3aWR0aCAvIDIgLSBib3JkZXJXaWR0aCAvIDIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJyeVwiLCBoZWlnaHQgLyAyIC0gYm9yZGVyV2lkdGggLyAyKTtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgJ3N0cm9rZS13aWR0aCcgaXMgYWx3YXlzIG5vbi16ZXJvLCBzaW5jZSBvdGhlcndpc2UgaXRcbiAgICAvLyB3b24ndCBiZSBwb3NzaWJsZSB0byBvcGVuL2Nsb3NlIHRoZSBwb3B1cCAobm90ZSBlLmcuIGlzc3VlIDExMTIyKS5cbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGJvcmRlcldpZHRoIHx8IDEpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cbiAgICBzdmcuYXBwZW5kQ2hpbGQoY2lyY2xlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcG9wdXAgb3Vyc2VsdmVzIHNvIHRoYXQgd2UgY2FuIGJpbmQgaXQgdG8gdGhlIGNpcmNsZSBpbnN0ZWFkXG4gICAgLy8gb2YgdG8gdGhlIGVudGlyZSBjb250YWluZXIgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS5cbiAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgY2lyY2xlLCBkYXRhKTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIC8qIGlnbm9yZUJvcmRlciA9ICovIHRydWUpO1xuXG4gICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcInBvbHlsaW5lQW5ub3RhdGlvblwiO1xuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgcG9seWxpbmUgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBQb2x5bGluZUFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy5jb250YWluZXJDbGFzc05hbWU7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW52aXNpYmxlIHBvbHlsaW5lIHdpdGggdGhlIHNhbWUgcG9pbnRzIHRoYXQgYWN0cyBhcyB0aGVcbiAgICAvLyB0cmlnZ2VyIGZvciB0aGUgcG9wdXAuIE9ubHkgdGhlIHBvbHlsaW5lIGl0c2VsZiBzaG91bGQgdHJpZ2dlciB0aGVcbiAgICAvLyBwb3B1cCwgbm90IHRoZSBlbnRpcmUgY29udGFpbmVyLlxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07XG4gICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBDb252ZXJ0IHRoZSB2ZXJ0aWNlcyBhcnJheSB0byBhIHNpbmdsZSBwb2ludHMgc3RyaW5nIHRoYXQgdGhlIFNWR1xuICAgIC8vIHBvbHlsaW5lIGVsZW1lbnQgZXhwZWN0cyAoXCJ4MSx5MSB4Mix5MiAuLi5cIikuIFBERiBjb29yZGluYXRlcyBhcmVcbiAgICAvLyBjYWxjdWxhdGVkIGZyb20gYSBib3R0b20gbGVmdCBvcmlnaW4sIHNvIHRyYW5zZm9ybSB0aGUgcG9seWxpbmVcbiAgICAvLyBjb29yZGluYXRlcyB0byBhIHRvcCBsZWZ0IG9yaWdpbiBmb3IgdGhlIFNWRyBlbGVtZW50LlxuICAgIGxldCBwb2ludHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvb3JkaW5hdGUgb2YgZGF0YS52ZXJ0aWNlcykge1xuICAgICAgY29uc3QgeCA9IGNvb3JkaW5hdGUueCAtIGRhdGEucmVjdFswXTtcbiAgICAgIGNvbnN0IHkgPSBkYXRhLnJlY3RbM10gLSBjb29yZGluYXRlLnk7XG4gICAgICBwb2ludHMucHVzaCh4ICsgXCIsXCIgKyB5KTtcbiAgICB9XG4gICAgcG9pbnRzID0gcG9pbnRzLmpvaW4oXCIgXCIpO1xuXG4gICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgcG9pbnRzKTtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgJ3N0cm9rZS13aWR0aCcgaXMgYWx3YXlzIG5vbi16ZXJvLCBzaW5jZSBvdGhlcndpc2UgaXRcbiAgICAvLyB3b24ndCBiZSBwb3NzaWJsZSB0byBvcGVuL2Nsb3NlIHRoZSBwb3B1cCAobm90ZSBlLmcuIGlzc3VlIDExMTIyKS5cbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwibm9uZVwiKTtcblxuICAgIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHBvcHVwIG91cnNlbHZlcyBzbyB0aGF0IHdlIGNhbiBiaW5kIGl0IHRvIHRoZSBwb2x5bGluZVxuICAgIC8vIGluc3RlYWQgb2YgdG8gdGhlIGVudGlyZSBjb250YWluZXIgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS5cbiAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgcG9seWxpbmUsIGRhdGEpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgLy8gUG9seWdvbnMgYXJlIHNwZWNpZmljIGZvcm1zIG9mIHBvbHlsaW5lcywgc28gcmV1c2UgdGhlaXIgbG9naWMuXG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWdvbkFubm90YXRpb25cIjtcbiAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWdvblwiO1xuICB9XG59XG5cbmNsYXNzIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgLyogaWdub3JlQm9yZGVyID0gKi8gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjYXJldCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIENhcmV0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImNhcmV0QW5ub3RhdGlvblwiO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgSW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgLyogaWdub3JlQm9yZGVyID0gKi8gdHJ1ZSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwiaW5rQW5ub3RhdGlvblwiO1xuXG4gICAgLy8gVXNlIHRoZSBwb2x5bGluZSBTVkcgZWxlbWVudCBzaW5jZSBpdCBhbGxvd3MgdXMgdG8gdXNlIGNvb3JkaW5hdGVzXG4gICAgLy8gZGlyZWN0bHkgYW5kIHRvIGRyYXcgYm90aCBzdHJhaWdodCBsaW5lcyBhbmQgY3VydmVzLlxuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgaW5rIGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSW5rQW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZTtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnZpc2libGUgcG9seWxpbmUgd2l0aCB0aGUgc2FtZSBwb2ludHMgdGhhdCBhY3RzIGFzIHRoZVxuICAgIC8vIHRyaWdnZXIgZm9yIHRoZSBwb3B1cC5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gZGF0YS5yZWN0WzJdIC0gZGF0YS5yZWN0WzBdO1xuICAgIGNvbnN0IGhlaWdodCA9IGRhdGEucmVjdFszXSAtIGRhdGEucmVjdFsxXTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgZm9yIChjb25zdCBpbmtMaXN0IG9mIGRhdGEuaW5rTGlzdHMpIHtcbiAgICAgIC8vIENvbnZlcnQgdGhlIGluayBsaXN0IHRvIGEgc2luZ2xlIHBvaW50cyBzdHJpbmcgdGhhdCB0aGUgU1ZHXG4gICAgICAvLyBwb2x5bGluZSBlbGVtZW50IGV4cGVjdHMgKFwieDEseTEgeDIseTIgLi4uXCIpLiBQREYgY29vcmRpbmF0ZXMgYXJlXG4gICAgICAvLyBjYWxjdWxhdGVkIGZyb20gYSBib3R0b20gbGVmdCBvcmlnaW4sIHNvIHRyYW5zZm9ybSB0aGUgcG9seWxpbmVcbiAgICAgIC8vIGNvb3JkaW5hdGVzIHRvIGEgdG9wIGxlZnQgb3JpZ2luIGZvciB0aGUgU1ZHIGVsZW1lbnQuXG4gICAgICBsZXQgcG9pbnRzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNvb3JkaW5hdGUgb2YgaW5rTGlzdCkge1xuICAgICAgICBjb25zdCB4ID0gY29vcmRpbmF0ZS54IC0gZGF0YS5yZWN0WzBdO1xuICAgICAgICBjb25zdCB5ID0gZGF0YS5yZWN0WzNdIC0gY29vcmRpbmF0ZS55O1xuICAgICAgICBwb2ludHMucHVzaChgJHt4fSwke3l9YCk7XG4gICAgICB9XG4gICAgICBwb2ludHMgPSBwb2ludHMuam9pbihcIiBcIik7XG5cbiAgICAgIGNvbnN0IHBvbHlsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgcG9pbnRzKTtcbiAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSAnc3Ryb2tlLXdpZHRoJyBpcyBhbHdheXMgbm9uLXplcm8sIHNpbmNlIG90aGVyd2lzZSBpdFxuICAgICAgLy8gd29uJ3QgYmUgcG9zc2libGUgdG8gb3Blbi9jbG9zZSB0aGUgcG9wdXAgKG5vdGUgZS5nLiBpc3N1ZSAxMTEyMikuXG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgcG9wdXAgb3Vyc2VsdmVzIHNvIHRoYXQgd2UgY2FuIGJpbmQgaXQgdG8gdGhlIHBvbHlsaW5lXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRvIHRoZSBlbnRpcmUgY29udGFpbmVyICh3aGljaCBpcyB0aGUgZGVmYXVsdCkuXG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgcG9seWxpbmUsIGRhdGEpO1xuXG4gICAgICBzdmcuYXBwZW5kQ2hpbGQocG9seWxpbmUpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCAvKiBpZ25vcmVCb3JkZXIgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGhpZ2hsaWdodCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJoaWdobGlnaHRBbm5vdGF0aW9uXCI7XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c1xuICAgICk7XG4gICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCAvKiBpZ25vcmVCb3JkZXIgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHVuZGVybGluZSBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFVuZGVybGluZUFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJ1bmRlcmxpbmVBbm5vdGF0aW9uXCI7XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuXG5jbGFzcyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIC8qIGlnbm9yZUJvcmRlciA9ICovIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgc3F1aWdnbHkgYW5ub3RhdGlvbidzIEhUTUwgZWxlbWVudCBpbiB0aGUgZW1wdHkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MU2VjdGlvbkVsZW1lbnR9XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gXCJzcXVpZ2dseUFubm90YXRpb25cIjtcblxuICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEoXG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHxcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzXG4gICAgKTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIC8qIGlnbm9yZUJvcmRlciA9ICovIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgc3RyaWtlb3V0IGFubm90YXRpb24ncyBIVE1MIGVsZW1lbnQgaW4gdGhlIGVtcHR5IGNvbnRhaW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcInN0cmlrZW91dEFubm90YXRpb25cIjtcblxuICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5cbmNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShcbiAgICAgIHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fFxuICAgICAgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8XG4gICAgICBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNcbiAgICApO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgLyogaWdub3JlQm9yZGVyID0gKi8gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBzdGFtcCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcInN0YW1wQW5ub3RhdGlvblwiO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cblxuY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIC8qIGlzUmVuZGVyYWJsZSA9ICovIHRydWUpO1xuXG4gICAgY29uc3QgeyBmaWxlbmFtZSwgY29udGVudCB9ID0gdGhpcy5kYXRhLmZpbGU7XG4gICAgdGhpcy5maWxlbmFtZSA9IGdldEZpbGVuYW1lRnJvbVVybChmaWxlbmFtZSk7XG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcblxuICAgIGlmICh0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSB7XG4gICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzLmRpc3BhdGNoKFwiZmlsZWF0dGFjaG1lbnRhbm5vdGF0aW9uXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBpZDogc3RyaW5nVG9QREZTdHJpbmcoZmlsZW5hbWUpLFxuICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgY29udGVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGZpbGUgYXR0YWNobWVudCBhbm5vdGF0aW9uJ3MgSFRNTCBlbGVtZW50IGluIHRoZSBlbXB0eVxuICAgKiBjb250YWluZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxTZWN0aW9uRWxlbWVudH1cbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSBcImZpbGVBdHRhY2htZW50QW5ub3RhdGlvblwiO1xuXG4gICAgY29uc3QgdHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdHJpZ2dlci5zdHlsZS5oZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5zdHlsZS5oZWlnaHQ7XG4gICAgdHJpZ2dlci5zdHlsZS53aWR0aCA9IHRoaXMuY29udGFpbmVyLnN0eWxlLndpZHRoO1xuICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsIHRoaXMuX2Rvd25sb2FkLmJpbmQodGhpcykpO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXAgJiYgKHRoaXMuZGF0YS50aXRsZSB8fCB0aGlzLmRhdGEuY29udGVudHMpKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgdHJpZ2dlciwgdGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0cmlnZ2VyKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgdGhlIGZpbGUgYXR0YWNobWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBhbm5vdGF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudFxuICAgKi9cbiAgX2Rvd25sb2FkKCkge1xuICAgIGlmICghdGhpcy5kb3dubG9hZE1hbmFnZXIpIHtcbiAgICAgIHdhcm4oXCJEb3dubG9hZCBjYW5ub3QgYmUgc3RhcnRlZCBkdWUgdG8gdW5hdmFpbGFibGUgZG93bmxvYWQgbWFuYWdlclwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kb3dubG9hZE1hbmFnZXIuZG93bmxvYWREYXRhKHRoaXMuY29udGVudCwgdGhpcy5maWxlbmFtZSwgXCJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBBbm5vdGF0aW9uTGF5ZXJQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge1BhZ2VWaWV3cG9ydH0gdmlld3BvcnRcbiAqIEBwcm9wZXJ0eSB7SFRNTERpdkVsZW1lbnR9IGRpdlxuICogQHByb3BlcnR5IHtBcnJheX0gYW5ub3RhdGlvbnNcbiAqIEBwcm9wZXJ0eSB7UERGUGFnZX0gcGFnZVxuICogQHByb3BlcnR5IHtJUERGTGlua1NlcnZpY2V9IGxpbmtTZXJ2aWNlXG4gKiBAcHJvcGVydHkge0Rvd25sb2FkTWFuYWdlcn0gZG93bmxvYWRNYW5hZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ltYWdlUmVzb3VyY2VzUGF0aF0gLSBQYXRoIGZvciBpbWFnZSByZXNvdXJjZXMsIG1haW5seVxuICogICBmb3IgYW5ub3RhdGlvbiBpY29ucy4gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVuZGVySW50ZXJhY3RpdmVGb3Jtc1xuICovXG5cbmNsYXNzIEFubm90YXRpb25MYXllciB7XG4gIC8qKlxuICAgKiBSZW5kZXIgYSBuZXcgYW5ub3RhdGlvbiBsYXllciB3aXRoIGFsbCBhbm5vdGF0aW9uIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7QW5ub3RhdGlvbkxheWVyUGFyYW1ldGVyc30gcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvbkxheWVyXG4gICAqL1xuICBzdGF0aWMgcmVuZGVyKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBzb3J0ZWRBbm5vdGF0aW9ucyA9IFtdLFxuICAgICAgcG9wdXBBbm5vdGF0aW9ucyA9IFtdO1xuICAgIC8vIEVuc3VyZSB0aGF0IFBvcHVwIGFubm90YXRpb25zIGFyZSBoYW5kbGVkIGxhc3QsIHNpbmNlIHRoZXkncmUgZGVwZW5kYW50XG4gICAgLy8gdXBvbiB0aGUgcGFyZW50IGFubm90YXRpb24gaGF2aW5nIGFscmVhZHkgYmVlbiByZW5kZXJlZCAocGxlYXNlIHJlZmVyIHRvXG4gICAgLy8gdGhlIGBQb3B1cEFubm90YXRpb25FbGVtZW50LnJlbmRlcmAgbWV0aG9kKTsgZml4ZXMgaXNzdWUgMTEzNjIuXG4gICAgZm9yIChjb25zdCBkYXRhIG9mIHBhcmFtZXRlcnMuYW5ub3RhdGlvbnMpIHtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmFubm90YXRpb25UeXBlID09PSBBbm5vdGF0aW9uVHlwZS5QT1BVUCkge1xuICAgICAgICBwb3B1cEFubm90YXRpb25zLnB1c2goZGF0YSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc29ydGVkQW5ub3RhdGlvbnMucHVzaChkYXRhKTtcbiAgICB9XG4gICAgaWYgKHBvcHVwQW5ub3RhdGlvbnMubGVuZ3RoKSB7XG4gICAgICBzb3J0ZWRBbm5vdGF0aW9ucy5wdXNoKC4uLnBvcHVwQW5ub3RhdGlvbnMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGF0YSBvZiBzb3J0ZWRBbm5vdGF0aW9ucykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICBkYXRhLFxuICAgICAgICBsYXllcjogcGFyYW1ldGVycy5kaXYsXG4gICAgICAgIHBhZ2U6IHBhcmFtZXRlcnMucGFnZSxcbiAgICAgICAgdmlld3BvcnQ6IHBhcmFtZXRlcnMudmlld3BvcnQsXG4gICAgICAgIGxpbmtTZXJ2aWNlOiBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlLFxuICAgICAgICBkb3dubG9hZE1hbmFnZXI6IHBhcmFtZXRlcnMuZG93bmxvYWRNYW5hZ2VyLFxuICAgICAgICBpbWFnZVJlc291cmNlc1BhdGg6IHBhcmFtZXRlcnMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8IFwiXCIsXG4gICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6XG4gICAgICAgICAgdHlwZW9mIHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zXG4gICAgICAgICAgICA6IHRydWUsXG4gICAgICAgIHN2Z0ZhY3Rvcnk6IG5ldyBET01TVkdGYWN0b3J5KCksXG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlOlxuICAgICAgICAgIHBhcmFtZXRlcnMuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbmV3IEFubm90YXRpb25TdG9yYWdlKCksXG4gICAgICB9KTtcbiAgICAgIGlmIChlbGVtZW50LmlzUmVuZGVyYWJsZSkge1xuICAgICAgICBwYXJhbWV0ZXJzLmRpdi5hcHBlbmRDaGlsZChlbGVtZW50LnJlbmRlcigpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBhbm5vdGF0aW9uIGVsZW1lbnRzIG9uIGV4aXN0aW5nIGFubm90YXRpb24gbGF5ZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtBbm5vdGF0aW9uTGF5ZXJQYXJhbWV0ZXJzfSBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uTGF5ZXJcbiAgICovXG4gIHN0YXRpYyB1cGRhdGUocGFyYW1ldGVycykge1xuICAgIGZvciAoY29uc3QgZGF0YSBvZiBwYXJhbWV0ZXJzLmFubm90YXRpb25zKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gcGFyYW1ldGVycy5kaXYucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYFtkYXRhLWFubm90YXRpb24taWQ9XCIke2RhdGEuaWR9XCJdYFxuICAgICAgKTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYG1hdHJpeCgke3BhcmFtZXRlcnMudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXG4gICAgICAgICAgXCIsXCJcbiAgICAgICAgKX0pYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyYW1ldGVycy5kaXYucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICB9XG59XG5cbmV4cG9ydCB7IEFubm90YXRpb25MYXllciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTUgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEFib3J0RXhjZXB0aW9uLFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgVXRpbCxcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbi8qKlxuICogVGV4dCBsYXllciByZW5kZXIgcGFyYW1ldGVycy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZXh0TGF5ZXJSZW5kZXJQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vYXBpXCIpLlRleHRDb250ZW50fSBbdGV4dENvbnRlbnRdIC0gVGV4dCBjb250ZW50IHRvXG4gKiAgIHJlbmRlciAodGhlIG9iamVjdCBpcyByZXR1cm5lZCBieSB0aGUgcGFnZSdzIGBnZXRUZXh0Q29udGVudGAgbWV0aG9kKS5cbiAqIEBwcm9wZXJ0eSB7UmVhZGFibGVTdHJlYW19IFt0ZXh0Q29udGVudFN0cmVhbV0gLSBUZXh0IGNvbnRlbnQgc3RyZWFtIHRvXG4gKiAgIHJlbmRlciAodGhlIHN0cmVhbSBpcyByZXR1cm5lZCBieSB0aGUgcGFnZSdzIGBzdHJlYW1UZXh0Q29udGVudGAgbWV0aG9kKS5cbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIEhUTUwgZWxlbWVudCB0aGF0IHdpbGwgY29udGFpbiB0ZXh0IHJ1bnMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vZGlzcGxheV91dGlsc1wiKS5QYWdlVmlld3BvcnR9IHZpZXdwb3J0IC0gVGhlIHRhcmdldFxuICogICB2aWV3cG9ydCB0byBwcm9wZXJseSBsYXlvdXQgdGhlIHRleHQgcnVucy5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8SFRNTEVsZW1lbnQ+fSBbdGV4dERpdnNdIC0gSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBjb3JyZXNwb25kXG4gKiAgIHRvIHRoZSB0ZXh0IGl0ZW1zIG9mIHRoZSB0ZXh0Q29udGVudCBpbnB1dC4gVGhpcyBpcyBvdXRwdXQgYW5kIHNoYWxsIGJlXG4gKiAgIGluaXRpYWxseSBiZSBzZXQgdG8gZW1wdHkgYXJyYXkuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IFt0ZXh0Q29udGVudEl0ZW1zU3RyXSAtIFN0cmluZ3MgdGhhdCBjb3JyZXNwb25kIHRvXG4gKiAgICB0aGUgYHN0cmAgcHJvcGVydHkgb2YgdGhlIHRleHQgaXRlbXMgb2YgdGV4dENvbnRlbnQgaW5wdXQuIFRoaXMgaXMgb3V0cHV0XG4gKiAgIGFuZCBzaGFsbCBiZSBpbml0aWFsbHkgYmUgc2V0IHRvIGVtcHR5IGFycmF5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSAtIERlbGF5IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVuZGVyaW5nIG9mIHRoZVxuICogICB0ZXh0IHJ1bnMgb2NjdXJzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5oYW5jZVRleHRTZWxlY3Rpb25dIC0gV2hldGhlciB0byB0dXJuIG9uIHRoZSB0ZXh0XG4gKiAgIHNlbGVjdGlvbiBlbmhhbmNlbWVudC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRMYXllclJlbmRlclRhc2tcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTx2b2lkPn0gcHJvbWlzZVxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjYW5jZWxcbiAqIEBwcm9wZXJ0eSB7KGV4cGFuZERpdnM6IGJvb2xlYW4pID0+IHZvaWR9IGV4cGFuZFRleHREaXZzXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7KHJlbmRlclBhcmFtZXRlcnM6IFRleHRMYXllclJlbmRlclBhcmFtZXRlcnMpID0+IFRleHRMYXllclJlbmRlclRhc2t9XG4gKi9cbnZhciByZW5kZXJUZXh0TGF5ZXIgPSAoZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyQ2xvc3VyZSgpIHtcbiAgdmFyIE1BWF9URVhUX0RJVlNfVE9fUkVOREVSID0gMTAwMDAwO1xuXG4gIHZhciBOb25XaGl0ZXNwYWNlUmVnZXhwID0gL1xcUy87XG5cbiAgZnVuY3Rpb24gaXNBbGxXaGl0ZXNwYWNlKHN0cikge1xuICAgIHJldHVybiAhTm9uV2hpdGVzcGFjZVJlZ2V4cC50ZXN0KHN0cik7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBlbmRUZXh0KHRhc2ssIGdlb20sIHN0eWxlcykge1xuICAgIC8vIEluaXRpYWxpemUgYWxsIHVzZWQgcHJvcGVydGllcyB0byBrZWVwIHRoZSBjYWNoZXMgbW9ub21vcnBoaWMuXG4gICAgdmFyIHRleHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICB2YXIgdGV4dERpdlByb3BlcnRpZXMgPSB7XG4gICAgICBhbmdsZTogMCxcbiAgICAgIGNhbnZhc1dpZHRoOiAwLFxuICAgICAgaXNXaGl0ZXNwYWNlOiBmYWxzZSxcbiAgICAgIG9yaWdpbmFsVHJhbnNmb3JtOiBudWxsLFxuICAgICAgcGFkZGluZ0JvdHRvbTogMCxcbiAgICAgIHBhZGRpbmdMZWZ0OiAwLFxuICAgICAgcGFkZGluZ1JpZ2h0OiAwLFxuICAgICAgcGFkZGluZ1RvcDogMCxcbiAgICAgIHNjYWxlOiAxLFxuICAgIH07XG5cbiAgICB0YXNrLl90ZXh0RGl2cy5wdXNoKHRleHREaXYpO1xuICAgIGlmIChpc0FsbFdoaXRlc3BhY2UoZ2VvbS5zdHIpKSB7XG4gICAgICB0ZXh0RGl2UHJvcGVydGllcy5pc1doaXRlc3BhY2UgPSB0cnVlO1xuICAgICAgdGFzay5fdGV4dERpdlByb3BlcnRpZXMuc2V0KHRleHREaXYsIHRleHREaXZQcm9wZXJ0aWVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdHggPSBVdGlsLnRyYW5zZm9ybSh0YXNrLl92aWV3cG9ydC50cmFuc2Zvcm0sIGdlb20udHJhbnNmb3JtKTtcbiAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKHR4WzFdLCB0eFswXSk7XG4gICAgdmFyIHN0eWxlID0gc3R5bGVzW2dlb20uZm9udE5hbWVdO1xuICAgIGlmIChzdHlsZS52ZXJ0aWNhbCkge1xuICAgICAgYW5nbGUgKz0gTWF0aC5QSSAvIDI7XG4gICAgfVxuICAgIHZhciBmb250SGVpZ2h0ID0gTWF0aC5zcXJ0KHR4WzJdICogdHhbMl0gKyB0eFszXSAqIHR4WzNdKTtcbiAgICB2YXIgZm9udEFzY2VudCA9IGZvbnRIZWlnaHQ7XG4gICAgaWYgKHN0eWxlLmFzY2VudCkge1xuICAgICAgZm9udEFzY2VudCA9IHN0eWxlLmFzY2VudCAqIGZvbnRBc2NlbnQ7XG4gICAgfSBlbHNlIGlmIChzdHlsZS5kZXNjZW50KSB7XG4gICAgICBmb250QXNjZW50ID0gKDEgKyBzdHlsZS5kZXNjZW50KSAqIGZvbnRBc2NlbnQ7XG4gICAgfVxuXG4gICAgbGV0IGxlZnQsIHRvcDtcbiAgICBpZiAoYW5nbGUgPT09IDApIHtcbiAgICAgIGxlZnQgPSB0eFs0XTtcbiAgICAgIHRvcCA9IHR4WzVdIC0gZm9udEFzY2VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVmdCA9IHR4WzRdICsgZm9udEFzY2VudCAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIHRvcCA9IHR4WzVdIC0gZm9udEFzY2VudCAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICB9XG4gICAgLy8gU2V0dGluZyB0aGUgc3R5bGUgcHJvcGVydGllcyBpbmRpdmlkdWFsbHksIHJhdGhlciB0aGFuIGFsbCBhdCBvbmNlLFxuICAgIC8vIHNob3VsZCBiZSBPSyBzaW5jZSB0aGUgYHRleHREaXZgIGlzbid0IGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudCB5ZXQuXG4gICAgdGV4dERpdi5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgdGV4dERpdi5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIHRleHREaXYuc3R5bGUuZm9udFNpemUgPSBgJHtmb250SGVpZ2h0fXB4YDtcbiAgICB0ZXh0RGl2LnN0eWxlLmZvbnRGYW1pbHkgPSBzdHlsZS5mb250RmFtaWx5O1xuXG4gICAgdGV4dERpdi50ZXh0Q29udGVudCA9IGdlb20uc3RyO1xuICAgIC8vIGBmb250TmFtZWAgaXMgb25seSB1c2VkIGJ5IHRoZSBGb250SW5zcGVjdG9yLCBhbmQgd2Ugb25seSB1c2UgYGRhdGFzZXRgXG4gICAgLy8gaGVyZSB0byBtYWtlIHRoZSBmb250IG5hbWUgYXZhaWxhYmxlIGluIHRoZSBkZWJ1Z2dlci5cbiAgICBpZiAodGFzay5fZm9udEluc3BlY3RvckVuYWJsZWQpIHtcbiAgICAgIHRleHREaXYuZGF0YXNldC5mb250TmFtZSA9IGdlb20uZm9udE5hbWU7XG4gICAgfVxuICAgIGlmIChhbmdsZSAhPT0gMCkge1xuICAgICAgdGV4dERpdlByb3BlcnRpZXMuYW5nbGUgPSBhbmdsZSAqICgxODAgLyBNYXRoLlBJKTtcbiAgICB9XG4gICAgLy8gV2UgZG9uJ3QgYm90aGVyIHNjYWxpbmcgc2luZ2xlLWNoYXIgdGV4dCBkaXZzLCBiZWNhdXNlIGl0IGhhcyB2ZXJ5XG4gICAgLy8gbGl0dGxlIGVmZmVjdCBvbiB0ZXh0IGhpZ2hsaWdodGluZy4gVGhpcyBtYWtlcyBzY3JvbGxpbmcgb24gZG9jcyB3aXRoXG4gICAgLy8gbG90cyBvZiBzdWNoIGRpdnMgYSBsb3QgZmFzdGVyLlxuICAgIGxldCBzaG91bGRTY2FsZVRleHQgPSBmYWxzZTtcbiAgICBpZiAoZ2VvbS5zdHIubGVuZ3RoID4gMSkge1xuICAgICAgc2hvdWxkU2NhbGVUZXh0ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGdlb20udHJhbnNmb3JtWzBdICE9PSBnZW9tLnRyYW5zZm9ybVszXSkge1xuICAgICAgY29uc3QgYWJzU2NhbGVYID0gTWF0aC5hYnMoZ2VvbS50cmFuc2Zvcm1bMF0pLFxuICAgICAgICBhYnNTY2FsZVkgPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVszXSk7XG4gICAgICAvLyBXaGVuIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsIHNjYWxpbmcgZGlmZmVycyBzaWduaWZpY2FudGx5LCBhbHNvIHNjYWxlXG4gICAgICAvLyBldmVuIHNpbmdsZS1jaGFyIHRleHQgdG8gaW1wcm92ZSBoaWdobGlnaHRpbmcgKGZpeGVzIGlzc3VlMTE3MTMucGRmKS5cbiAgICAgIGlmIChcbiAgICAgICAgYWJzU2NhbGVYICE9PSBhYnNTY2FsZVkgJiZcbiAgICAgICAgTWF0aC5tYXgoYWJzU2NhbGVYLCBhYnNTY2FsZVkpIC8gTWF0aC5taW4oYWJzU2NhbGVYLCBhYnNTY2FsZVkpID4gMS41XG4gICAgICApIHtcbiAgICAgICAgc2hvdWxkU2NhbGVUZXh0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFNjYWxlVGV4dCkge1xuICAgICAgaWYgKHN0eWxlLnZlcnRpY2FsKSB7XG4gICAgICAgIHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoID0gZ2VvbS5oZWlnaHQgKiB0YXNrLl92aWV3cG9ydC5zY2FsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoID0gZ2VvbS53aWR0aCAqIHRhc2suX3ZpZXdwb3J0LnNjYWxlO1xuICAgICAgfVxuICAgIH1cbiAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpO1xuICAgIGlmICh0YXNrLl90ZXh0Q29udGVudFN0cmVhbSkge1xuICAgICAgdGFzay5fbGF5b3V0VGV4dCh0ZXh0RGl2KTtcbiAgICB9XG5cbiAgICBpZiAodGFzay5fZW5oYW5jZVRleHRTZWxlY3Rpb24pIHtcbiAgICAgIHZhciBhbmdsZUNvcyA9IDEsXG4gICAgICAgIGFuZ2xlU2luID0gMDtcbiAgICAgIGlmIChhbmdsZSAhPT0gMCkge1xuICAgICAgICBhbmdsZUNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgYW5nbGVTaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgICB9XG4gICAgICB2YXIgZGl2V2lkdGggPVxuICAgICAgICAoc3R5bGUudmVydGljYWwgPyBnZW9tLmhlaWdodCA6IGdlb20ud2lkdGgpICogdGFzay5fdmlld3BvcnQuc2NhbGU7XG4gICAgICB2YXIgZGl2SGVpZ2h0ID0gZm9udEhlaWdodDtcblxuICAgICAgdmFyIG0sIGI7XG4gICAgICBpZiAoYW5nbGUgIT09IDApIHtcbiAgICAgICAgbSA9IFthbmdsZUNvcywgYW5nbGVTaW4sIC1hbmdsZVNpbiwgYW5nbGVDb3MsIGxlZnQsIHRvcF07XG4gICAgICAgIGIgPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCBkaXZXaWR0aCwgZGl2SGVpZ2h0XSwgbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiID0gW2xlZnQsIHRvcCwgbGVmdCArIGRpdldpZHRoLCB0b3AgKyBkaXZIZWlnaHRdO1xuICAgICAgfVxuXG4gICAgICB0YXNrLl9ib3VuZHMucHVzaCh7XG4gICAgICAgIGxlZnQ6IGJbMF0sXG4gICAgICAgIHRvcDogYlsxXSxcbiAgICAgICAgcmlnaHQ6IGJbMl0sXG4gICAgICAgIGJvdHRvbTogYlszXSxcbiAgICAgICAgZGl2OiB0ZXh0RGl2LFxuICAgICAgICBzaXplOiBbZGl2V2lkdGgsIGRpdkhlaWdodF0sXG4gICAgICAgIG0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXIodGFzaykge1xuICAgIGlmICh0YXNrLl9jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGV4dERpdnMgPSB0YXNrLl90ZXh0RGl2cztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IHRhc2suX2NhcGFiaWxpdHk7XG4gICAgdmFyIHRleHREaXZzTGVuZ3RoID0gdGV4dERpdnMubGVuZ3RoO1xuXG4gICAgLy8gTm8gcG9pbnQgaW4gcmVuZGVyaW5nIG1hbnkgZGl2cyBhcyBpdCB3b3VsZCBtYWtlIHRoZSBicm93c2VyXG4gICAgLy8gdW51c2FibGUgZXZlbiBhZnRlciB0aGUgZGl2cyBhcmUgcmVuZGVyZWQuXG4gICAgaWYgKHRleHREaXZzTGVuZ3RoID4gTUFYX1RFWFRfRElWU19UT19SRU5ERVIpIHtcbiAgICAgIHRhc2suX3JlbmRlcmluZ0RvbmUgPSB0cnVlO1xuICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0YXNrLl90ZXh0Q29udGVudFN0cmVhbSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0RGl2c0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRhc2suX2xheW91dFRleHQodGV4dERpdnNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRhc2suX3JlbmRlcmluZ0RvbmUgPSB0cnVlO1xuICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZFBvc2l0aXZlTWluKHRzLCBvZmZzZXQsIGNvdW50KSB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB0ID0gdHNbb2Zmc2V0KytdO1xuICAgICAgaWYgKHQgPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCA/IE1hdGgubWluKHQsIHJlc3VsdCkgOiB0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwYW5kKHRhc2spIHtcbiAgICB2YXIgYm91bmRzID0gdGFzay5fYm91bmRzO1xuICAgIHZhciB2aWV3cG9ydCA9IHRhc2suX3ZpZXdwb3J0O1xuXG4gICAgdmFyIGV4cGFuZGVkID0gZXhwYW5kQm91bmRzKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQsIGJvdW5kcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBhbmRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRpdiA9IGJvdW5kc1tpXS5kaXY7XG4gICAgICB2YXIgZGl2UHJvcGVydGllcyA9IHRhc2suX3RleHREaXZQcm9wZXJ0aWVzLmdldChkaXYpO1xuICAgICAgaWYgKGRpdlByb3BlcnRpZXMuYW5nbGUgPT09IDApIHtcbiAgICAgICAgZGl2UHJvcGVydGllcy5wYWRkaW5nTGVmdCA9IGJvdW5kc1tpXS5sZWZ0IC0gZXhwYW5kZWRbaV0ubGVmdDtcbiAgICAgICAgZGl2UHJvcGVydGllcy5wYWRkaW5nVG9wID0gYm91bmRzW2ldLnRvcCAtIGV4cGFuZGVkW2ldLnRvcDtcbiAgICAgICAgZGl2UHJvcGVydGllcy5wYWRkaW5nUmlnaHQgPSBleHBhbmRlZFtpXS5yaWdodCAtIGJvdW5kc1tpXS5yaWdodDtcbiAgICAgICAgZGl2UHJvcGVydGllcy5wYWRkaW5nQm90dG9tID0gZXhwYW5kZWRbaV0uYm90dG9tIC0gYm91bmRzW2ldLmJvdHRvbTtcbiAgICAgICAgdGFzay5fdGV4dERpdlByb3BlcnRpZXMuc2V0KGRpdiwgZGl2UHJvcGVydGllcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQm94IGlzIHJvdGF0ZWQgLS0gdHJ5aW5nIHRvIGZpbmQgcGFkZGluZyBzbyByb3RhdGVkIGRpdiB3aWxsIG5vdFxuICAgICAgLy8gZXhjZWVkIGl0cyBleHBhbmRlZCBib3VuZHMuXG4gICAgICB2YXIgZSA9IGV4cGFuZGVkW2ldLFxuICAgICAgICBiID0gYm91bmRzW2ldO1xuICAgICAgdmFyIG0gPSBiLm0sXG4gICAgICAgIGMgPSBtWzBdLFxuICAgICAgICBzID0gbVsxXTtcbiAgICAgIC8vIEZpbmRpbmcgaW50ZXJzZWN0aW9ucyB3aXRoIGV4cGFuZGVkIGJveC5cbiAgICAgIHZhciBwb2ludHMgPSBbWzAsIDBdLCBbMCwgYi5zaXplWzFdXSwgW2Iuc2l6ZVswXSwgMF0sIGIuc2l6ZV07XG4gICAgICB2YXIgdHMgPSBuZXcgRmxvYXQ2NEFycmF5KDY0KTtcbiAgICAgIHBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwLCBqKSB7XG4gICAgICAgIHZhciB0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShwLCBtKTtcbiAgICAgICAgdHNbaiArIDBdID0gYyAmJiAoZS5sZWZ0IC0gdFswXSkgLyBjO1xuICAgICAgICB0c1tqICsgNF0gPSBzICYmIChlLnRvcCAtIHRbMV0pIC8gcztcbiAgICAgICAgdHNbaiArIDhdID0gYyAmJiAoZS5yaWdodCAtIHRbMF0pIC8gYztcbiAgICAgICAgdHNbaiArIDEyXSA9IHMgJiYgKGUuYm90dG9tIC0gdFsxXSkgLyBzO1xuXG4gICAgICAgIHRzW2ogKyAxNl0gPSBzICYmIChlLmxlZnQgLSB0WzBdKSAvIC1zO1xuICAgICAgICB0c1tqICsgMjBdID0gYyAmJiAoZS50b3AgLSB0WzFdKSAvIGM7XG4gICAgICAgIHRzW2ogKyAyNF0gPSBzICYmIChlLnJpZ2h0IC0gdFswXSkgLyAtcztcbiAgICAgICAgdHNbaiArIDI4XSA9IGMgJiYgKGUuYm90dG9tIC0gdFsxXSkgLyBjO1xuXG4gICAgICAgIHRzW2ogKyAzMl0gPSBjICYmIChlLmxlZnQgLSB0WzBdKSAvIC1jO1xuICAgICAgICB0c1tqICsgMzZdID0gcyAmJiAoZS50b3AgLSB0WzFdKSAvIC1zO1xuICAgICAgICB0c1tqICsgNDBdID0gYyAmJiAoZS5yaWdodCAtIHRbMF0pIC8gLWM7XG4gICAgICAgIHRzW2ogKyA0NF0gPSBzICYmIChlLmJvdHRvbSAtIHRbMV0pIC8gLXM7XG5cbiAgICAgICAgdHNbaiArIDQ4XSA9IHMgJiYgKGUubGVmdCAtIHRbMF0pIC8gcztcbiAgICAgICAgdHNbaiArIDUyXSA9IGMgJiYgKGUudG9wIC0gdFsxXSkgLyAtYztcbiAgICAgICAgdHNbaiArIDU2XSA9IHMgJiYgKGUucmlnaHQgLSB0WzBdKSAvIHM7XG4gICAgICAgIHRzW2ogKyA2MF0gPSBjICYmIChlLmJvdHRvbSAtIHRbMV0pIC8gLWM7XG4gICAgICB9KTtcbiAgICAgIC8vIE5vdCBiYXNlZCBvbiBtYXRoLCBidXQgdG8gc2ltcGxpZnkgY2FsY3VsYXRpb25zLCB1c2luZyBjb3MgYW5kIHNpblxuICAgICAgLy8gYWJzb2x1dGUgdmFsdWVzIHRvIG5vdCBleGNlZWQgdGhlIGJveCAoaXQgY2FuIGJ1dCBpbnNpZ25pZmljYW50bHkpLlxuICAgICAgdmFyIGJveFNjYWxlID0gMSArIE1hdGgubWluKE1hdGguYWJzKGMpLCBNYXRoLmFicyhzKSk7XG4gICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdMZWZ0ID0gZmluZFBvc2l0aXZlTWluKHRzLCAzMiwgMTYpIC8gYm94U2NhbGU7XG4gICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdUb3AgPSBmaW5kUG9zaXRpdmVNaW4odHMsIDQ4LCAxNikgLyBib3hTY2FsZTtcbiAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ1JpZ2h0ID0gZmluZFBvc2l0aXZlTWluKHRzLCAwLCAxNikgLyBib3hTY2FsZTtcbiAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ0JvdHRvbSA9IGZpbmRQb3NpdGl2ZU1pbih0cywgMTYsIDE2KSAvIGJveFNjYWxlO1xuICAgICAgdGFzay5fdGV4dERpdlByb3BlcnRpZXMuc2V0KGRpdiwgZGl2UHJvcGVydGllcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXhwYW5kQm91bmRzKHdpZHRoLCBoZWlnaHQsIGJveGVzKSB7XG4gICAgdmFyIGJvdW5kcyA9IGJveGVzLm1hcChmdW5jdGlvbiAoYm94LCBpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4MTogYm94LmxlZnQsXG4gICAgICAgIHkxOiBib3gudG9wLFxuICAgICAgICB4MjogYm94LnJpZ2h0LFxuICAgICAgICB5MjogYm94LmJvdHRvbSxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIHgxTmV3OiB1bmRlZmluZWQsXG4gICAgICAgIHgyTmV3OiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGV4cGFuZEJvdW5kc0xUUih3aWR0aCwgYm91bmRzKTtcbiAgICB2YXIgZXhwYW5kZWQgPSBuZXcgQXJyYXkoYm94ZXMubGVuZ3RoKTtcbiAgICBib3VuZHMuZm9yRWFjaChmdW5jdGlvbiAoYikge1xuICAgICAgdmFyIGkgPSBiLmluZGV4O1xuICAgICAgZXhwYW5kZWRbaV0gPSB7XG4gICAgICAgIGxlZnQ6IGIueDFOZXcsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgcmlnaHQ6IGIueDJOZXcsXG4gICAgICAgIGJvdHRvbTogMCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBSb3RhdGluZyBvbiA5MCBkZWdyZWVzIGFuZCBleHRlbmRpbmcgZXh0ZW5kZWQgYm94ZXMuIFJldXNpbmcgdGhlIGJvdW5kc1xuICAgIC8vIGFycmF5IGFuZCBvYmplY3RzLlxuICAgIGJveGVzLm1hcChmdW5jdGlvbiAoYm94LCBpKSB7XG4gICAgICB2YXIgZSA9IGV4cGFuZGVkW2ldLFxuICAgICAgICBiID0gYm91bmRzW2ldO1xuICAgICAgYi54MSA9IGJveC50b3A7XG4gICAgICBiLnkxID0gd2lkdGggLSBlLnJpZ2h0O1xuICAgICAgYi54MiA9IGJveC5ib3R0b207XG4gICAgICBiLnkyID0gd2lkdGggLSBlLmxlZnQ7XG4gICAgICBiLmluZGV4ID0gaTtcbiAgICAgIGIueDFOZXcgPSB1bmRlZmluZWQ7XG4gICAgICBiLngyTmV3ID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGV4cGFuZEJvdW5kc0xUUihoZWlnaHQsIGJvdW5kcyk7XG5cbiAgICBib3VuZHMuZm9yRWFjaChmdW5jdGlvbiAoYikge1xuICAgICAgdmFyIGkgPSBiLmluZGV4O1xuICAgICAgZXhwYW5kZWRbaV0udG9wID0gYi54MU5ldztcbiAgICAgIGV4cGFuZGVkW2ldLmJvdHRvbSA9IGIueDJOZXc7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cGFuZGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwYW5kQm91bmRzTFRSKHdpZHRoLCBib3VuZHMpIHtcbiAgICAvLyBTb3J0aW5nIGJ5IHgxIGNvb3JkaW5hdGUgYW5kIHdhbGsgYnkgdGhlIGJvdW5kcyBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICBib3VuZHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEueDEgLSBiLngxIHx8IGEuaW5kZXggLSBiLmluZGV4O1xuICAgIH0pO1xuXG4gICAgLy8gRmlyc3Qgd2Ugc2VlIG9uIHRoZSBob3Jpem9uIGlzIGEgZmFrZSBib3VuZGFyeS5cbiAgICB2YXIgZmFrZUJvdW5kYXJ5ID0ge1xuICAgICAgeDE6IC1JbmZpbml0eSxcbiAgICAgIHkxOiAtSW5maW5pdHksXG4gICAgICB4MjogMCxcbiAgICAgIHkyOiBJbmZpbml0eSxcbiAgICAgIGluZGV4OiAtMSxcbiAgICAgIHgxTmV3OiAwLFxuICAgICAgeDJOZXc6IDAsXG4gICAgfTtcbiAgICB2YXIgaG9yaXpvbiA9IFtcbiAgICAgIHtcbiAgICAgICAgc3RhcnQ6IC1JbmZpbml0eSxcbiAgICAgICAgZW5kOiBJbmZpbml0eSxcbiAgICAgICAgYm91bmRhcnk6IGZha2VCb3VuZGFyeSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGJvdW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChib3VuZGFyeSkge1xuICAgICAgLy8gU2VhcmNoaW5nIGZvciB0aGUgYWZmZWN0ZWQgcGFydCBvZiBob3Jpem9uLlxuICAgICAgLy8gVE9ETyByZWQtYmxhY2sgdHJlZSBvciBzaW1wbGUgYmluYXJ5IHNlYXJjaFxuICAgICAgdmFyIGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCBob3Jpem9uLmxlbmd0aCAmJiBob3Jpem9uW2ldLmVuZCA8PSBib3VuZGFyeS55MSkge1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICB2YXIgaiA9IGhvcml6b24ubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChqID49IDAgJiYgaG9yaXpvbltqXS5zdGFydCA+PSBib3VuZGFyeS55Mikge1xuICAgICAgICBqLS07XG4gICAgICB9XG5cbiAgICAgIHZhciBob3Jpem9uUGFydCwgYWZmZWN0ZWRCb3VuZGFyeTtcbiAgICAgIHZhciBxLFxuICAgICAgICBrLFxuICAgICAgICBtYXhYTmV3ID0gLUluZmluaXR5O1xuICAgICAgZm9yIChxID0gaTsgcSA8PSBqOyBxKyspIHtcbiAgICAgICAgaG9yaXpvblBhcnQgPSBob3Jpem9uW3FdO1xuICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5ID0gaG9yaXpvblBhcnQuYm91bmRhcnk7XG4gICAgICAgIHZhciB4TmV3O1xuICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54MiA+IGJvdW5kYXJ5LngxKSB7XG4gICAgICAgICAgLy8gSW4gdGhlIG1pZGRsZSBvZiB0aGUgcHJldmlvdXMgZWxlbWVudCwgbmV3IHggc2hhbGwgYmUgYXQgdGhlXG4gICAgICAgICAgLy8gYm91bmRhcnkgc3RhcnQuIEV4dGVuZGluZyBpZiBmdXJ0aGVyIGlmIHRoZSBhZmZlY3RlZCBib3VuZGFyeVxuICAgICAgICAgIC8vIHBsYWNlZCBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgb25lLlxuICAgICAgICAgIHhOZXcgPVxuICAgICAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS5pbmRleCA+IGJvdW5kYXJ5LmluZGV4XG4gICAgICAgICAgICAgID8gYWZmZWN0ZWRCb3VuZGFyeS54MU5ld1xuICAgICAgICAgICAgICA6IGJvdW5kYXJ5LngxO1xuICAgICAgICB9IGVsc2UgaWYgKGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdlIGhhdmUgc29tZSBzcGFjZSBpbiBiZXR3ZWVuLCBuZXcgeCBpbiBtaWRkbGUgd2lsbCBiZSBhIGZhaXJcbiAgICAgICAgICAvLyBjaG9pY2UuXG4gICAgICAgICAgeE5ldyA9IChhZmZlY3RlZEJvdW5kYXJ5LngyICsgYm91bmRhcnkueDEpIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBZmZlY3RlZCBib3VuZGFyeSBoYXMgeDJuZXcgc2V0LCB1c2luZyBpdCBhcyBuZXcgeC5cbiAgICAgICAgICB4TmV3ID0gYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldztcbiAgICAgICAgfVxuICAgICAgICBpZiAoeE5ldyA+IG1heFhOZXcpIHtcbiAgICAgICAgICBtYXhYTmV3ID0geE5ldztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgbmV3IHgxIGZvciBjdXJyZW50IGJvdW5kYXJ5LlxuICAgICAgYm91bmRhcnkueDFOZXcgPSBtYXhYTmV3O1xuXG4gICAgICAvLyBBZGp1c3RzIG5ldyB4MiBmb3IgdGhlIGFmZmVjdGVkIGJvdW5kYXJpZXMuXG4gICAgICBmb3IgKHEgPSBpOyBxIDw9IGo7IHErKykge1xuICAgICAgICBob3Jpem9uUGFydCA9IGhvcml6b25bcV07XG4gICAgICAgIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTtcbiAgICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdhcyBub3Qgc2V0IHlldCwgY2hvb3NpbmcgbmV3IHggaWYgcG9zc2libGUuXG4gICAgICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkueDIgPiBib3VuZGFyeS54MSkge1xuICAgICAgICAgICAgLy8gQ3VycmVudCBhbmQgYWZmZWN0ZWQgYm91bmRhcmllcyBpbnRlcnNlY3QuIElmIGFmZmVjdGVkIGJvdW5kYXJ5XG4gICAgICAgICAgICAvLyBpcyBwbGFjZWQgb24gdG9wIG9mIHRoZSBjdXJyZW50LCBzaHJpbmtpbmcgdGhlIGFmZmVjdGVkLlxuICAgICAgICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkuaW5kZXggPiBib3VuZGFyeS5pbmRleCkge1xuICAgICAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gYWZmZWN0ZWRCb3VuZGFyeS54MjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IG1heFhOZXc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPiBtYXhYTmV3KSB7XG4gICAgICAgICAgLy8gQWZmZWN0ZWQgYm91bmRhcnkgaXMgdG91Y2hpbmcgbmV3IHgsIHB1c2hpbmcgaXQgYmFjay5cbiAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gTWF0aC5tYXgobWF4WE5ldywgYWZmZWN0ZWRCb3VuZGFyeS54Mik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRml4aW5nIHRoZSBob3Jpem9uLlxuICAgICAgdmFyIGNoYW5nZWRIb3Jpem9uID0gW10sXG4gICAgICAgIGxhc3RCb3VuZGFyeSA9IG51bGw7XG4gICAgICBmb3IgKHEgPSBpOyBxIDw9IGo7IHErKykge1xuICAgICAgICBob3Jpem9uUGFydCA9IGhvcml6b25bcV07XG4gICAgICAgIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTtcbiAgICAgICAgLy8gQ2hlY2tpbmcgd2hpY2ggYm91bmRhcnkgd2lsbCBiZSB2aXNpYmxlLlxuICAgICAgICB2YXIgdXNlQm91bmRhcnkgPVxuICAgICAgICAgIGFmZmVjdGVkQm91bmRhcnkueDIgPiBib3VuZGFyeS54MiA/IGFmZmVjdGVkQm91bmRhcnkgOiBib3VuZGFyeTtcbiAgICAgICAgaWYgKGxhc3RCb3VuZGFyeSA9PT0gdXNlQm91bmRhcnkpIHtcbiAgICAgICAgICAvLyBNZXJnaW5nIHdpdGggcHJldmlvdXMuXG4gICAgICAgICAgY2hhbmdlZEhvcml6b25bY2hhbmdlZEhvcml6b24ubGVuZ3RoIC0gMV0uZW5kID0gaG9yaXpvblBhcnQuZW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYW5nZWRIb3Jpem9uLnB1c2goe1xuICAgICAgICAgICAgc3RhcnQ6IGhvcml6b25QYXJ0LnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBob3Jpem9uUGFydC5lbmQsXG4gICAgICAgICAgICBib3VuZGFyeTogdXNlQm91bmRhcnksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGFzdEJvdW5kYXJ5ID0gdXNlQm91bmRhcnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChob3Jpem9uW2ldLnN0YXJ0IDwgYm91bmRhcnkueTEpIHtcbiAgICAgICAgY2hhbmdlZEhvcml6b25bMF0uc3RhcnQgPSBib3VuZGFyeS55MTtcbiAgICAgICAgY2hhbmdlZEhvcml6b24udW5zaGlmdCh7XG4gICAgICAgICAgc3RhcnQ6IGhvcml6b25baV0uc3RhcnQsXG4gICAgICAgICAgZW5kOiBib3VuZGFyeS55MSxcbiAgICAgICAgICBib3VuZGFyeTogaG9yaXpvbltpXS5ib3VuZGFyeSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYm91bmRhcnkueTIgPCBob3Jpem9uW2pdLmVuZCkge1xuICAgICAgICBjaGFuZ2VkSG9yaXpvbltjaGFuZ2VkSG9yaXpvbi5sZW5ndGggLSAxXS5lbmQgPSBib3VuZGFyeS55MjtcbiAgICAgICAgY2hhbmdlZEhvcml6b24ucHVzaCh7XG4gICAgICAgICAgc3RhcnQ6IGJvdW5kYXJ5LnkyLFxuICAgICAgICAgIGVuZDogaG9yaXpvbltqXS5lbmQsXG4gICAgICAgICAgYm91bmRhcnk6IGhvcml6b25bal0uYm91bmRhcnksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgeDIgbmV3IG9mIGJvdW5kYXJ5IHRoYXQgaXMgbm8gbG9uZ2VyIHZpc2libGUgKHNlZSBvdmVybGFwcGluZyBjYXNlXG4gICAgICAvLyBhYm92ZSkuXG4gICAgICAvLyBUT0RPIG1vcmUgZWZmaWNpZW50LCBlLmcuIHZpYSByZWZlcmVuY2UgY291bnRpbmcuXG4gICAgICBmb3IgKHEgPSBpOyBxIDw9IGo7IHErKykge1xuICAgICAgICBob3Jpem9uUGFydCA9IGhvcml6b25bcV07XG4gICAgICAgIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTtcbiAgICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkueDJOZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1c2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgayA9IGkgLSAxO1xuICAgICAgICAgICF1c2VkICYmIGsgPj0gMCAmJiBob3Jpem9uW2tdLnN0YXJ0ID49IGFmZmVjdGVkQm91bmRhcnkueTE7XG4gICAgICAgICAgay0tXG4gICAgICAgICkge1xuICAgICAgICAgIHVzZWQgPSBob3Jpem9uW2tdLmJvdW5kYXJ5ID09PSBhZmZlY3RlZEJvdW5kYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgayA9IGogKyAxO1xuICAgICAgICAgICF1c2VkICYmIGsgPCBob3Jpem9uLmxlbmd0aCAmJiBob3Jpem9uW2tdLmVuZCA8PSBhZmZlY3RlZEJvdW5kYXJ5LnkyO1xuICAgICAgICAgIGsrK1xuICAgICAgICApIHtcbiAgICAgICAgICB1c2VkID0gaG9yaXpvbltrXS5ib3VuZGFyeSA9PT0gYWZmZWN0ZWRCb3VuZGFyeTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGsgPSAwOyAhdXNlZCAmJiBrIDwgY2hhbmdlZEhvcml6b24ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB1c2VkID0gY2hhbmdlZEhvcml6b25ba10uYm91bmRhcnkgPT09IGFmZmVjdGVkQm91bmRhcnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF1c2VkKSB7XG4gICAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IG1heFhOZXc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgQXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShcbiAgICAgICAgaG9yaXpvbixcbiAgICAgICAgW2ksIGogLSBpICsgMV0uY29uY2F0KGNoYW5nZWRIb3Jpem9uKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIFNldCBuZXcgeDIgZm9yIGFsbCB1bnNldCBib3VuZGFyaWVzLlxuICAgIGhvcml6b24uZm9yRWFjaChmdW5jdGlvbiAoaG9yaXpvblBhcnQpIHtcbiAgICAgIHZhciBhZmZlY3RlZEJvdW5kYXJ5ID0gaG9yaXpvblBhcnQuYm91bmRhcnk7XG4gICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPSBNYXRoLm1heCh3aWR0aCwgYWZmZWN0ZWRCb3VuZGFyeS54Mik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGV4dCBsYXllciByZW5kZXJpbmcgdGFzay5cbiAgICpcbiAgICogQHBhcmFtIHtUZXh0Q29udGVudH0gdGV4dENvbnRlbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gICAqIEBwYXJhbSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydFxuICAgKiBAcGFyYW0ge0FycmF5fSB0ZXh0RGl2c1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuaGFuY2VUZXh0U2VsZWN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0TGF5ZXJSZW5kZXJUYXNrKHtcbiAgICB0ZXh0Q29udGVudCxcbiAgICB0ZXh0Q29udGVudFN0cmVhbSxcbiAgICBjb250YWluZXIsXG4gICAgdmlld3BvcnQsXG4gICAgdGV4dERpdnMsXG4gICAgdGV4dENvbnRlbnRJdGVtc1N0cixcbiAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbixcbiAgfSkge1xuICAgIHRoaXMuX3RleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XG4gICAgdGhpcy5fdGV4dENvbnRlbnRTdHJlYW0gPSB0ZXh0Q29udGVudFN0cmVhbTtcbiAgICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5fZG9jdW1lbnQgPSBjb250YWluZXIub3duZXJEb2N1bWVudDtcbiAgICB0aGlzLl92aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHRoaXMuX3RleHREaXZzID0gdGV4dERpdnMgfHwgW107XG4gICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRleHRDb250ZW50SXRlbXNTdHIgfHwgW107XG4gICAgdGhpcy5fZW5oYW5jZVRleHRTZWxlY3Rpb24gPSAhIWVuaGFuY2VUZXh0U2VsZWN0aW9uO1xuICAgIHRoaXMuX2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISEoXG4gICAgICBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IgJiYgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmVuYWJsZWRcbiAgICApO1xuXG4gICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRTaXplID0gbnVsbDtcbiAgICB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRGYW1pbHkgPSBudWxsO1xuICAgIHRoaXMuX2xheW91dFRleHRDdHggPSBudWxsO1xuICAgIHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcbiAgICB0aGlzLl9yZW5kZXJpbmdEb25lID0gZmFsc2U7XG4gICAgdGhpcy5fY2FuY2VsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9yZW5kZXJUaW1lciA9IG51bGw7XG4gICAgdGhpcy5fYm91bmRzID0gW107XG5cbiAgICAvLyBBbHdheXMgY2xlYW4tdXAgdGhlIHRlbXBvcmFyeSBjYW52YXMgb25jZSByZW5kZXJpbmcgaXMgbm8gbG9uZ2VyIHBlbmRpbmcuXG4gICAgdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRUZXh0Q3R4KSB7XG4gICAgICAgICAgLy8gWmVyb2luZyB0aGUgd2lkdGggYW5kIGhlaWdodCBjYXVzZSBGaXJlZm94IHRvIHJlbGVhc2UgZ3JhcGhpY3NcbiAgICAgICAgICAvLyByZXNvdXJjZXMgaW1tZWRpYXRlbHksIHdoaWNoIGNhbiBncmVhdGx5IHJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24uXG4gICAgICAgICAgdGhpcy5fbGF5b3V0VGV4dEN0eC5jYW52YXMud2lkdGggPSAwO1xuICAgICAgICAgIHRoaXMuX2xheW91dFRleHRDdHguY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgdGhpcy5fbGF5b3V0VGV4dEN0eCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvKiBBdm9pZCBcIlVuY2F1Z2h0IHByb21pc2VcIiBtZXNzYWdlcyBpbiB0aGUgY29uc29sZS4gKi9cbiAgICAgIH0pO1xuICB9XG4gIFRleHRMYXllclJlbmRlclRhc2sucHJvdG90eXBlID0ge1xuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9LFxuXG4gICAgY2FuY2VsOiBmdW5jdGlvbiBUZXh0TGF5ZXJfY2FuY2VsKCkge1xuICAgICAgdGhpcy5fY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuX3JlYWRlcikge1xuICAgICAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKG5ldyBBYm9ydEV4Y2VwdGlvbihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIikpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3JlbmRlclRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZW5kZXJUaW1lcik7XG4gICAgICAgIHRoaXMuX3JlbmRlclRpbWVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIikpO1xuICAgIH0sXG5cbiAgICBfcHJvY2Vzc0l0ZW1zKGl0ZW1zLCBzdHlsZUNhY2hlKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKGl0ZW1zW2ldLnN0cik7XG4gICAgICAgIGFwcGVuZFRleHQodGhpcywgaXRlbXNbaV0sIHN0eWxlQ2FjaGUpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfbGF5b3V0VGV4dCh0ZXh0RGl2KSB7XG4gICAgICBjb25zdCB0ZXh0RGl2UHJvcGVydGllcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldCh0ZXh0RGl2KTtcbiAgICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5pc1doaXRlc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgdHJhbnNmb3JtID0gXCJcIjtcbiAgICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCAhPT0gMCkge1xuICAgICAgICBjb25zdCB7IGZvbnRTaXplLCBmb250RmFtaWx5IH0gPSB0ZXh0RGl2LnN0eWxlO1xuXG4gICAgICAgIC8vIE9ubHkgYnVpbGQgZm9udCBzdHJpbmcgYW5kIHNldCB0byBjb250ZXh0IGlmIGRpZmZlcmVudCBmcm9tIGxhc3QuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBmb250U2l6ZSAhPT0gdGhpcy5fbGF5b3V0VGV4dExhc3RGb250U2l6ZSB8fFxuICAgICAgICAgIGZvbnRGYW1pbHkgIT09IHRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0Q3R4LmZvbnQgPSBgJHtmb250U2l6ZX0gJHtmb250RmFtaWx5fWA7XG4gICAgICAgICAgdGhpcy5fbGF5b3V0VGV4dExhc3RGb250U2l6ZSA9IGZvbnRTaXplO1xuICAgICAgICAgIHRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSA9IGZvbnRGYW1pbHk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBtZWFzdXJlIHRoZSB3aWR0aCBmb3IgbXVsdGktY2hhciB0ZXh0IGRpdnMsIHNlZSBgYXBwZW5kVGV4dGAuXG4gICAgICAgIGNvbnN0IHsgd2lkdGggfSA9IHRoaXMuX2xheW91dFRleHRDdHgubWVhc3VyZVRleHQodGV4dERpdi50ZXh0Q29udGVudCk7XG5cbiAgICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICAgIHRleHREaXZQcm9wZXJ0aWVzLnNjYWxlID0gdGV4dERpdlByb3BlcnRpZXMuY2FudmFzV2lkdGggLyB3aWR0aDtcbiAgICAgICAgICB0cmFuc2Zvcm0gPSBgc2NhbGVYKCR7dGV4dERpdlByb3BlcnRpZXMuc2NhbGV9KWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSAhPT0gMCkge1xuICAgICAgICB0cmFuc2Zvcm0gPSBgcm90YXRlKCR7dGV4dERpdlByb3BlcnRpZXMuYW5nbGV9ZGVnKSAke3RyYW5zZm9ybX1gO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zZm9ybS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbmhhbmNlVGV4dFNlbGVjdGlvbikge1xuICAgICAgICAgIHRleHREaXZQcm9wZXJ0aWVzLm9yaWdpbmFsVHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICB9XG4gICAgICAgIHRleHREaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgfVxuICAgICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMuc2V0KHRleHREaXYsIHRleHREaXZQcm9wZXJ0aWVzKTtcbiAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0ZXh0RGl2KTtcbiAgICB9LFxuXG4gICAgX3JlbmRlcjogZnVuY3Rpb24gVGV4dExheWVyX3JlbmRlcih0aW1lb3V0KSB7XG4gICAgICBjb25zdCBjYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIGxldCBzdHlsZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgLy8gVGhlIHRlbXBvcmFyeSBjYW52YXMgaXMgdXNlZCB0byBtZWFzdXJlIHRleHQgbGVuZ3RoIGluIHRoZSBET00uXG4gICAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUwgfHwgR0VORVJJQ1wiKVxuICAgICAgKSB7XG4gICAgICAgIGNhbnZhcy5tb3pPcGFxdWUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fbGF5b3V0VGV4dEN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwgeyBhbHBoYTogZmFsc2UgfSk7XG5cbiAgICAgIGlmICh0aGlzLl90ZXh0Q29udGVudCkge1xuICAgICAgICBjb25zdCB0ZXh0SXRlbXMgPSB0aGlzLl90ZXh0Q29udGVudC5pdGVtcztcbiAgICAgICAgY29uc3QgdGV4dFN0eWxlcyA9IHRoaXMuX3RleHRDb250ZW50LnN0eWxlcztcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKHRleHRJdGVtcywgdGV4dFN0eWxlcyk7XG4gICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXh0Q29udGVudFN0cmVhbSkge1xuICAgICAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoeyB2YWx1ZSwgZG9uZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlQ2FjaGUsIHZhbHVlLnN0eWxlcyk7XG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzSXRlbXModmFsdWUuaXRlbXMsIHN0eWxlQ2FjaGUpO1xuICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgIH0sIGNhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9yZWFkZXIgPSB0aGlzLl90ZXh0Q29udGVudFN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgcHVtcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdOZWl0aGVyIFwidGV4dENvbnRlbnRcIiBub3IgXCJ0ZXh0Q29udGVudFN0cmVhbVwiJyArXG4gICAgICAgICAgICBcIiBwYXJhbWV0ZXJzIHNwZWNpZmllZC5cIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgIHN0eWxlQ2FjaGUgPSBudWxsO1xuICAgICAgICBpZiAoIXRpbWVvdXQpIHtcbiAgICAgICAgICAvLyBSZW5kZXIgcmlnaHQgYXdheVxuICAgICAgICAgIHJlbmRlcih0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZVxuICAgICAgICAgIHRoaXMuX3JlbmRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXIodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUaW1lciA9IG51bGw7XG4gICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICB9LFxuXG4gICAgZXhwYW5kVGV4dERpdnM6IGZ1bmN0aW9uIFRleHRMYXllcl9leHBhbmRUZXh0RGl2cyhleHBhbmREaXZzKSB7XG4gICAgICBpZiAoIXRoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uIHx8ICF0aGlzLl9yZW5kZXJpbmdEb25lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9ib3VuZHMgIT09IG51bGwpIHtcbiAgICAgICAgZXhwYW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9ib3VuZHMgPSBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNmb3JtQnVmID0gW10sXG4gICAgICAgIHBhZGRpbmdCdWYgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5fdGV4dERpdnMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb25zdCBkaXYgPSB0aGlzLl90ZXh0RGl2c1tpXTtcbiAgICAgICAgY29uc3QgZGl2UHJvcHMgPSB0aGlzLl90ZXh0RGl2UHJvcGVydGllcy5nZXQoZGl2KTtcblxuICAgICAgICBpZiAoZGl2UHJvcHMuaXNXaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGFuZERpdnMpIHtcbiAgICAgICAgICB0cmFuc2Zvcm1CdWYubGVuZ3RoID0gMDtcbiAgICAgICAgICBwYWRkaW5nQnVmLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgICBpZiAoZGl2UHJvcHMub3JpZ2luYWxUcmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybUJ1Zi5wdXNoKGRpdlByb3BzLm9yaWdpbmFsVHJhbnNmb3JtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdUb3AgPiAwKSB7XG4gICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goYCR7ZGl2UHJvcHMucGFkZGluZ1RvcH1weGApO1xuICAgICAgICAgICAgdHJhbnNmb3JtQnVmLnB1c2goYHRyYW5zbGF0ZVkoJHstZGl2UHJvcHMucGFkZGluZ1RvcH1weClgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGl2UHJvcHMucGFkZGluZ1JpZ2h0ID4gMCkge1xuICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKGAke2RpdlByb3BzLnBhZGRpbmdSaWdodCAvIGRpdlByb3BzLnNjYWxlfXB4YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdCb3R0b20gPiAwKSB7XG4gICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goYCR7ZGl2UHJvcHMucGFkZGluZ0JvdHRvbX1weGApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkaXZQcm9wcy5wYWRkaW5nTGVmdCA+IDApIHtcbiAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaChgJHtkaXZQcm9wcy5wYWRkaW5nTGVmdCAvIGRpdlByb3BzLnNjYWxlfXB4YCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm1CdWYucHVzaChcbiAgICAgICAgICAgICAgYHRyYW5zbGF0ZVgoJHstZGl2UHJvcHMucGFkZGluZ0xlZnQgLyBkaXZQcm9wcy5zY2FsZX1weClgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGl2LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nQnVmLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIGlmICh0cmFuc2Zvcm1CdWYubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtQnVmLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXYuc3R5bGUucGFkZGluZyA9IG51bGw7XG4gICAgICAgICAgZGl2LnN0eWxlLnRyYW5zZm9ybSA9IGRpdlByb3BzLm9yaWdpbmFsVHJhbnNmb3JtO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIHJlbmRlclRleHRMYXllcihyZW5kZXJQYXJhbWV0ZXJzKSB7XG4gICAgdmFyIHRhc2sgPSBuZXcgVGV4dExheWVyUmVuZGVyVGFzayh7XG4gICAgICB0ZXh0Q29udGVudDogcmVuZGVyUGFyYW1ldGVycy50ZXh0Q29udGVudCxcbiAgICAgIHRleHRDb250ZW50U3RyZWFtOiByZW5kZXJQYXJhbWV0ZXJzLnRleHRDb250ZW50U3RyZWFtLFxuICAgICAgY29udGFpbmVyOiByZW5kZXJQYXJhbWV0ZXJzLmNvbnRhaW5lcixcbiAgICAgIHZpZXdwb3J0OiByZW5kZXJQYXJhbWV0ZXJzLnZpZXdwb3J0LFxuICAgICAgdGV4dERpdnM6IHJlbmRlclBhcmFtZXRlcnMudGV4dERpdnMsXG4gICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyOiByZW5kZXJQYXJhbWV0ZXJzLnRleHRDb250ZW50SXRlbXNTdHIsXG4gICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbjogcmVuZGVyUGFyYW1ldGVycy5lbmhhbmNlVGV4dFNlbGVjdGlvbixcbiAgICB9KTtcbiAgICB0YXNrLl9yZW5kZXIocmVuZGVyUGFyYW1ldGVycy50aW1lb3V0KTtcbiAgICByZXR1cm4gdGFzaztcbiAgfVxuXG4gIHJldHVybiByZW5kZXJUZXh0TGF5ZXI7XG59KSgpO1xuXG5leHBvcnQgeyByZW5kZXJUZXh0TGF5ZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFscyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgY3JlYXRlT2JqZWN0VVJMLFxuICBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgSURFTlRJVFlfTUFUUklYLFxuICBJbWFnZUtpbmQsXG4gIGlzTnVtLFxuICBPUFMsXG4gIFRleHRSZW5kZXJpbmdNb2RlLFxuICBVdGlsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IERPTVNWR0ZhY3RvcnkgfSBmcm9tIFwiLi9kaXNwbGF5X3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBpc05vZGVKUyB9IGZyb20gXCIuLi9zaGFyZWQvaXNfbm9kZS5qc1wiO1xuXG4vKiogQHR5cGUge2FueX0gKi9cbmxldCBTVkdHcmFwaGljcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkOiBTVkdHcmFwaGljc1wiKTtcbn07XG5cbmlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpIHtcbiAgY29uc3QgU1ZHX0RFRkFVTFRTID0ge1xuICAgIGZvbnRTdHlsZTogXCJub3JtYWxcIixcbiAgICBmb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgIGZpbGxDb2xvcjogXCIjMDAwMDAwXCIsXG4gIH07XG4gIGNvbnN0IFhNTF9OUyA9IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCI7XG4gIGNvbnN0IFhMSU5LX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG4gIGNvbnN0IExJTkVfQ0FQX1NUWUxFUyA9IFtcImJ1dHRcIiwgXCJyb3VuZFwiLCBcInNxdWFyZVwiXTtcbiAgY29uc3QgTElORV9KT0lOX1NUWUxFUyA9IFtcIm1pdGVyXCIsIFwicm91bmRcIiwgXCJiZXZlbFwiXTtcblxuICBjb25zdCBjb252ZXJ0SW1nRGF0YVRvUG5nID0gKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBQTkdfSEVBREVSID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMHg4OSxcbiAgICAgIDB4NTAsXG4gICAgICAweDRlLFxuICAgICAgMHg0NyxcbiAgICAgIDB4MGQsXG4gICAgICAweDBhLFxuICAgICAgMHgxYSxcbiAgICAgIDB4MGEsXG4gICAgXSk7XG4gICAgY29uc3QgQ0hVTktfV1JBUFBFUl9TSVpFID0gMTI7XG5cbiAgICBjb25zdCBjcmNUYWJsZSA9IG5ldyBJbnQzMkFycmF5KDI1Nik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICAgICAgbGV0IGMgPSBpO1xuICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCA4OyBoKyspIHtcbiAgICAgICAgaWYgKGMgJiAxKSB7XG4gICAgICAgICAgYyA9IDB4ZWRiODgzMjAgXiAoKGMgPj4gMSkgJiAweDdmZmZmZmZmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjID0gKGMgPj4gMSkgJiAweDdmZmZmZmZmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjcmNUYWJsZVtpXSA9IGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JjMzIoZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgICAgbGV0IGNyYyA9IC0xO1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgY29uc3QgYSA9IChjcmMgXiBkYXRhW2ldKSAmIDB4ZmY7XG4gICAgICAgIGNvbnN0IGIgPSBjcmNUYWJsZVthXTtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiBiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyYyBeIC0xO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdyaXRlUG5nQ2h1bmsodHlwZSwgYm9keSwgZGF0YSwgb2Zmc2V0KSB7XG4gICAgICBsZXQgcCA9IG9mZnNldDtcbiAgICAgIGNvbnN0IGxlbiA9IGJvZHkubGVuZ3RoO1xuXG4gICAgICBkYXRhW3BdID0gKGxlbiA+PiAyNCkgJiAweGZmO1xuICAgICAgZGF0YVtwICsgMV0gPSAobGVuID4+IDE2KSAmIDB4ZmY7XG4gICAgICBkYXRhW3AgKyAyXSA9IChsZW4gPj4gOCkgJiAweGZmO1xuICAgICAgZGF0YVtwICsgM10gPSBsZW4gJiAweGZmO1xuICAgICAgcCArPSA0O1xuXG4gICAgICBkYXRhW3BdID0gdHlwZS5jaGFyQ29kZUF0KDApICYgMHhmZjtcbiAgICAgIGRhdGFbcCArIDFdID0gdHlwZS5jaGFyQ29kZUF0KDEpICYgMHhmZjtcbiAgICAgIGRhdGFbcCArIDJdID0gdHlwZS5jaGFyQ29kZUF0KDIpICYgMHhmZjtcbiAgICAgIGRhdGFbcCArIDNdID0gdHlwZS5jaGFyQ29kZUF0KDMpICYgMHhmZjtcbiAgICAgIHAgKz0gNDtcblxuICAgICAgZGF0YS5zZXQoYm9keSwgcCk7XG4gICAgICBwICs9IGJvZHkubGVuZ3RoO1xuXG4gICAgICBjb25zdCBjcmMgPSBjcmMzMihkYXRhLCBvZmZzZXQgKyA0LCBwKTtcbiAgICAgIGRhdGFbcF0gPSAoY3JjID4+IDI0KSAmIDB4ZmY7XG4gICAgICBkYXRhW3AgKyAxXSA9IChjcmMgPj4gMTYpICYgMHhmZjtcbiAgICAgIGRhdGFbcCArIDJdID0gKGNyYyA+PiA4KSAmIDB4ZmY7XG4gICAgICBkYXRhW3AgKyAzXSA9IGNyYyAmIDB4ZmY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRsZXIzMihkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgICBsZXQgYSA9IDE7XG4gICAgICBsZXQgYiA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICBhID0gKGEgKyAoZGF0YVtpXSAmIDB4ZmYpKSAlIDY1NTIxO1xuICAgICAgICBiID0gKGIgKyBhKSAlIDY1NTIxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChiIDw8IDE2KSB8IGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBsaXRlcmFscyBUaGUgaW5wdXQgZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gVGhlIERFRkxBVEUtY29tcHJlc3NlZCBkYXRhIHN0cmVhbSBpbiB6bGliIGZvcm1hdC5cbiAgICAgKiAgIFRoaXMgaXMgdGhlIHJlcXVpcmVkIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBzdHJlYW1zIGluIHRoZSBQTkcgZm9ybWF0OlxuICAgICAqICAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvc3BlYy8xLjIvUE5HLUNvbXByZXNzaW9uLmh0bWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWZsYXRlU3luYyhsaXRlcmFscykge1xuICAgICAgaWYgKCFpc05vZGVKUykge1xuICAgICAgICAvLyB6bGliIGlzIGNlcnRhaW5seSBub3QgYXZhaWxhYmxlIG91dHNpZGUgb2YgTm9kZS5qcy4gV2UgY2FuIGVpdGhlciB1c2VcbiAgICAgICAgLy8gdGhlIHBha28gbGlicmFyeSBmb3IgY2xpZW50LXNpZGUgREVGTEFURSBjb21wcmVzc2lvbiwgb3IgdXNlIHRoZVxuICAgICAgICAvLyBjYW52YXMgQVBJIG9mIHRoZSBicm93c2VyIHRvIG9idGFpbiBhIG1vcmUgb3B0aW1hbCBQTkcgZmlsZS5cbiAgICAgICAgcmV0dXJuIGRlZmxhdGVTeW5jVW5jb21wcmVzc2VkKGxpdGVyYWxzKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZmFyIGZyb20gcGVyZmVjdCwgYnV0IGFscmVhZHkgd2F5IGJldHRlclxuICAgICAgICAvLyB0aGFuIG5vdCBhcHBseWluZyBhbnkgY29tcHJlc3Npb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEEgYmV0dGVyIGFsZ29yaXRobSB3aWxsIHRyeSB0byBjaG9vc2UgYSBnb29kIHByZWRpY3Rvci9maWx0ZXIgYW5kXG4gICAgICAgIC8vIHRoZW4gY2hvb3NlIGEgc3VpdGFibGUgemxpYiBjb21wcmVzc2lvbiBzdHJhdGVneSAoZS5nLiAzLFpfUkxFKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm9kZSB2MC4xMS4xMiB6bGliLmRlZmxhdGVTeW5jIGlzIGludHJvZHVjZWQgKGFuZCByZXR1cm5zIGEgQnVmZmVyKS5cbiAgICAgICAgLy8gTm9kZSB2My4wLjAgICBCdWZmZXIgaW5oZXJpdHMgZnJvbSBVaW50OEFycmF5LlxuICAgICAgICAvLyBOb2RlIHY4LjAuMCAgIHpsaWIuZGVmbGF0ZVN5bmMgYWNjZXB0cyBVaW50OEFycmF5IGFzIGlucHV0LlxuICAgICAgICBsZXQgaW5wdXQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICBpZiAocGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSA+PSA4KSB7XG4gICAgICAgICAgaW5wdXQgPSBsaXRlcmFscztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgICAgICBpbnB1dCA9IEJ1ZmZlci5mcm9tKGxpdGVyYWxzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRwdXQgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhcInpsaWJcIikuZGVmbGF0ZVN5bmMoaW5wdXQsIHtcbiAgICAgICAgICBsZXZlbDogOSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvdXRwdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gb3V0cHV0IDogbmV3IFVpbnQ4QXJyYXkob3V0cHV0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIk5vdCBjb21wcmVzc2luZyBQTkcgYmVjYXVzZSB6bGliLmRlZmxhdGVTeW5jIGlzIHVuYXZhaWxhYmxlOiBcIiArIGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmxhdGVTeW5jVW5jb21wcmVzc2VkKGxpdGVyYWxzKTtcbiAgICB9XG5cbiAgICAvLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBERUZMQVRFIHdpdGggY29tcHJlc3Npb24gbGV2ZWwgMCAoWl9OT19DT01QUkVTU0lPTikuXG4gICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQobGl0ZXJhbHMpIHtcbiAgICAgIGxldCBsZW4gPSBsaXRlcmFscy5sZW5ndGg7XG4gICAgICBjb25zdCBtYXhCbG9ja0xlbmd0aCA9IDB4ZmZmZjtcblxuICAgICAgY29uc3QgZGVmbGF0ZUJsb2NrcyA9IE1hdGguY2VpbChsZW4gLyBtYXhCbG9ja0xlbmd0aCk7XG4gICAgICBjb25zdCBpZGF0ID0gbmV3IFVpbnQ4QXJyYXkoMiArIGxlbiArIGRlZmxhdGVCbG9ja3MgKiA1ICsgNCk7XG4gICAgICBsZXQgcGkgPSAwO1xuICAgICAgaWRhdFtwaSsrXSA9IDB4Nzg7IC8vIGNvbXByZXNzaW9uIG1ldGhvZCBhbmQgZmxhZ3NcbiAgICAgIGlkYXRbcGkrK10gPSAweDljOyAvLyBmbGFnc1xuXG4gICAgICBsZXQgcG9zID0gMDtcbiAgICAgIHdoaWxlIChsZW4gPiBtYXhCbG9ja0xlbmd0aCkge1xuICAgICAgICAvLyB3cml0aW5nIG5vbi1maW5hbCBERUZMQVRFIGJsb2NrcyB0eXBlIDAgYW5kIGxlbmd0aCBvZiA2NTUzNVxuICAgICAgICBpZGF0W3BpKytdID0gMHgwMDtcbiAgICAgICAgaWRhdFtwaSsrXSA9IDB4ZmY7XG4gICAgICAgIGlkYXRbcGkrK10gPSAweGZmO1xuICAgICAgICBpZGF0W3BpKytdID0gMHgwMDtcbiAgICAgICAgaWRhdFtwaSsrXSA9IDB4MDA7XG4gICAgICAgIGlkYXQuc2V0KGxpdGVyYWxzLnN1YmFycmF5KHBvcywgcG9zICsgbWF4QmxvY2tMZW5ndGgpLCBwaSk7XG4gICAgICAgIHBpICs9IG1heEJsb2NrTGVuZ3RoO1xuICAgICAgICBwb3MgKz0gbWF4QmxvY2tMZW5ndGg7XG4gICAgICAgIGxlbiAtPSBtYXhCbG9ja0xlbmd0aDtcbiAgICAgIH1cblxuICAgICAgLy8gd3JpdGluZyBub24tZmluYWwgREVGTEFURSBibG9ja3MgdHlwZSAwXG4gICAgICBpZGF0W3BpKytdID0gMHgwMTtcbiAgICAgIGlkYXRbcGkrK10gPSBsZW4gJiAweGZmO1xuICAgICAgaWRhdFtwaSsrXSA9IChsZW4gPj4gOCkgJiAweGZmO1xuICAgICAgaWRhdFtwaSsrXSA9IH5sZW4gJiAweGZmZmYgJiAweGZmO1xuICAgICAgaWRhdFtwaSsrXSA9ICgofmxlbiAmIDB4ZmZmZikgPj4gOCkgJiAweGZmO1xuICAgICAgaWRhdC5zZXQobGl0ZXJhbHMuc3ViYXJyYXkocG9zKSwgcGkpO1xuICAgICAgcGkgKz0gbGl0ZXJhbHMubGVuZ3RoIC0gcG9zO1xuXG4gICAgICBjb25zdCBhZGxlciA9IGFkbGVyMzIobGl0ZXJhbHMsIDAsIGxpdGVyYWxzLmxlbmd0aCk7IC8vIGNoZWNrc3VtXG4gICAgICBpZGF0W3BpKytdID0gKGFkbGVyID4+IDI0KSAmIDB4ZmY7XG4gICAgICBpZGF0W3BpKytdID0gKGFkbGVyID4+IDE2KSAmIDB4ZmY7XG4gICAgICBpZGF0W3BpKytdID0gKGFkbGVyID4+IDgpICYgMHhmZjtcbiAgICAgIGlkYXRbcGkrK10gPSBhZGxlciAmIDB4ZmY7XG4gICAgICByZXR1cm4gaWRhdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmNvZGUoaW1nRGF0YSwga2luZCwgZm9yY2VEYXRhU2NoZW1hLCBpc01hc2spIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgICAgbGV0IGJpdERlcHRoLCBjb2xvclR5cGUsIGxpbmVTaXplO1xuICAgICAgY29uc3QgYnl0ZXMgPSBpbWdEYXRhLmRhdGE7XG5cbiAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpcbiAgICAgICAgICBjb2xvclR5cGUgPSAwO1xuICAgICAgICAgIGJpdERlcHRoID0gMTtcbiAgICAgICAgICBsaW5lU2l6ZSA9ICh3aWR0aCArIDcpID4+IDM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW1hZ2VLaW5kLlJHQl8yNEJQUDpcbiAgICAgICAgICBjb2xvclR5cGUgPSAyO1xuICAgICAgICAgIGJpdERlcHRoID0gODtcbiAgICAgICAgICBsaW5lU2l6ZSA9IHdpZHRoICogMztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbWFnZUtpbmQuUkdCQV8zMkJQUDpcbiAgICAgICAgICBjb2xvclR5cGUgPSA2O1xuICAgICAgICAgIGJpdERlcHRoID0gODtcbiAgICAgICAgICBsaW5lU2l6ZSA9IHdpZHRoICogNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gcHJlZml4IGV2ZXJ5IHJvdyB3aXRoIHByZWRpY3RvciAwXG4gICAgICBjb25zdCBsaXRlcmFscyA9IG5ldyBVaW50OEFycmF5KCgxICsgbGluZVNpemUpICogaGVpZ2h0KTtcbiAgICAgIGxldCBvZmZzZXRMaXRlcmFscyA9IDAsXG4gICAgICAgIG9mZnNldEJ5dGVzID0gMDtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHtcbiAgICAgICAgbGl0ZXJhbHNbb2Zmc2V0TGl0ZXJhbHMrK10gPSAwOyAvLyBubyBwcmVkaWN0aW9uXG4gICAgICAgIGxpdGVyYWxzLnNldChcbiAgICAgICAgICBieXRlcy5zdWJhcnJheShvZmZzZXRCeXRlcywgb2Zmc2V0Qnl0ZXMgKyBsaW5lU2l6ZSksXG4gICAgICAgICAgb2Zmc2V0TGl0ZXJhbHNcbiAgICAgICAgKTtcbiAgICAgICAgb2Zmc2V0Qnl0ZXMgKz0gbGluZVNpemU7XG4gICAgICAgIG9mZnNldExpdGVyYWxzICs9IGxpbmVTaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2luZCA9PT0gSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQICYmIGlzTWFzaykge1xuICAgICAgICAvLyBpbnZlcnRpbmcgZm9yIGltYWdlIG1hc2tzXG4gICAgICAgIG9mZnNldExpdGVyYWxzID0gMDtcbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICAgIG9mZnNldExpdGVyYWxzKys7IC8vIHNraXBwaW5nIHByZWRpY3RvclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVNpemU7IGkrKykge1xuICAgICAgICAgICAgbGl0ZXJhbHNbb2Zmc2V0TGl0ZXJhbHMrK10gXj0gMHhmZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaWhkciA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgKHdpZHRoID4+IDI0KSAmIDB4ZmYsXG4gICAgICAgICh3aWR0aCA+PiAxNikgJiAweGZmLFxuICAgICAgICAod2lkdGggPj4gOCkgJiAweGZmLFxuICAgICAgICB3aWR0aCAmIDB4ZmYsXG4gICAgICAgIChoZWlnaHQgPj4gMjQpICYgMHhmZixcbiAgICAgICAgKGhlaWdodCA+PiAxNikgJiAweGZmLFxuICAgICAgICAoaGVpZ2h0ID4+IDgpICYgMHhmZixcbiAgICAgICAgaGVpZ2h0ICYgMHhmZixcbiAgICAgICAgYml0RGVwdGgsIC8vIGJpdCBkZXB0aFxuICAgICAgICBjb2xvclR5cGUsIC8vIGNvbG9yIHR5cGVcbiAgICAgICAgMHgwMCwgLy8gY29tcHJlc3Npb24gbWV0aG9kXG4gICAgICAgIDB4MDAsIC8vIGZpbHRlciBtZXRob2RcbiAgICAgICAgMHgwMCwgLy8gaW50ZXJsYWNlIG1ldGhvZFxuICAgICAgXSk7XG4gICAgICBjb25zdCBpZGF0ID0gZGVmbGF0ZVN5bmMobGl0ZXJhbHMpO1xuXG4gICAgICAvLyBQTkcgY29uc2lzdHMgb2Y6IGhlYWRlciwgSUhEUitkYXRhLCBJREFUK2RhdGEsIGFuZCBJRU5ELlxuICAgICAgY29uc3QgcG5nTGVuZ3RoID1cbiAgICAgICAgUE5HX0hFQURFUi5sZW5ndGggKyBDSFVOS19XUkFQUEVSX1NJWkUgKiAzICsgaWhkci5sZW5ndGggKyBpZGF0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShwbmdMZW5ndGgpO1xuICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICBkYXRhLnNldChQTkdfSEVBREVSLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IFBOR19IRUFERVIubGVuZ3RoO1xuICAgICAgd3JpdGVQbmdDaHVuayhcIklIRFJcIiwgaWhkciwgZGF0YSwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSBDSFVOS19XUkFQUEVSX1NJWkUgKyBpaGRyLmxlbmd0aDtcbiAgICAgIHdyaXRlUG5nQ2h1bmsoXCJJREFUQVwiLCBpZGF0LCBkYXRhLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IENIVU5LX1dSQVBQRVJfU0laRSArIGlkYXQubGVuZ3RoO1xuICAgICAgd3JpdGVQbmdDaHVuayhcIklFTkRcIiwgbmV3IFVpbnQ4QXJyYXkoMCksIGRhdGEsIG9mZnNldCk7XG5cbiAgICAgIHJldHVybiBjcmVhdGVPYmplY3RVUkwoZGF0YSwgXCJpbWFnZS9wbmdcIiwgZm9yY2VEYXRhU2NoZW1hKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnZlcnRJbWdEYXRhVG9QbmcoaW1nRGF0YSwgZm9yY2VEYXRhU2NoZW1hLCBpc01hc2spIHtcbiAgICAgIGNvbnN0IGtpbmQgPVxuICAgICAgICBpbWdEYXRhLmtpbmQgPT09IHVuZGVmaW5lZCA/IEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCA6IGltZ0RhdGEua2luZDtcbiAgICAgIHJldHVybiBlbmNvZGUoaW1nRGF0YSwga2luZCwgZm9yY2VEYXRhU2NoZW1hLCBpc01hc2spO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgY2xhc3MgU1ZHRXh0cmFTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuICAgICAgdGhpcy5mb250V2VpZ2h0ID0gU1ZHX0RFRkFVTFRTLmZvbnRXZWlnaHQ7XG4gICAgICB0aGlzLmZvbnRTaXplID0gMDtcblxuICAgICAgdGhpcy50ZXh0TWF0cml4ID0gSURFTlRJVFlfTUFUUklYO1xuICAgICAgdGhpcy5mb250TWF0cml4ID0gRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICB0aGlzLmxlYWRpbmcgPSAwO1xuICAgICAgdGhpcy50ZXh0UmVuZGVyaW5nTW9kZSA9IFRleHRSZW5kZXJpbmdNb2RlLkZJTEw7XG4gICAgICB0aGlzLnRleHRNYXRyaXhTY2FsZSA9IDE7XG5cbiAgICAgIC8vIEN1cnJlbnQgcG9pbnQgKGluIHVzZXIgY29vcmRpbmF0ZXMpXG4gICAgICB0aGlzLnggPSAwO1xuICAgICAgdGhpcy55ID0gMDtcblxuICAgICAgLy8gU3RhcnQgb2YgdGV4dCBsaW5lIChpbiB0ZXh0IGNvb3JkaW5hdGVzKVxuICAgICAgdGhpcy5saW5lWCA9IDA7XG4gICAgICB0aGlzLmxpbmVZID0gMDtcblxuICAgICAgLy8gQ2hhcmFjdGVyIGFuZCB3b3JkIHNwYWNpbmdcbiAgICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwO1xuICAgICAgdGhpcy53b3JkU3BhY2luZyA9IDA7XG4gICAgICB0aGlzLnRleHRIU2NhbGUgPSAxO1xuICAgICAgdGhpcy50ZXh0UmlzZSA9IDA7XG5cbiAgICAgIC8vIERlZmF1bHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnNcbiAgICAgIHRoaXMuZmlsbENvbG9yID0gU1ZHX0RFRkFVTFRTLmZpbGxDb2xvcjtcbiAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBcIiMwMDAwMDBcIjtcblxuICAgICAgdGhpcy5maWxsQWxwaGEgPSAxO1xuICAgICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7XG4gICAgICB0aGlzLmxpbmVXaWR0aCA9IDE7XG4gICAgICB0aGlzLmxpbmVKb2luID0gXCJcIjtcbiAgICAgIHRoaXMubGluZUNhcCA9IFwiXCI7XG4gICAgICB0aGlzLm1pdGVyTGltaXQgPSAwO1xuXG4gICAgICB0aGlzLmRhc2hBcnJheSA9IFtdO1xuICAgICAgdGhpcy5kYXNoUGhhc2UgPSAwO1xuXG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdO1xuXG4gICAgICAvLyBDbGlwcGluZ1xuICAgICAgdGhpcy5hY3RpdmVDbGlwVXJsID0gbnVsbDtcbiAgICAgIHRoaXMuY2xpcEdyb3VwID0gbnVsbDtcblxuICAgICAgdGhpcy5tYXNrSWQgPSBcIlwiO1xuICAgIH1cblxuICAgIGNsb25lKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudFBvaW50KHgsIHkpIHtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbm5lci1kZWNsYXJhdGlvbnNcbiAgZnVuY3Rpb24gb3BMaXN0VG9UcmVlKG9wTGlzdCkge1xuICAgIGxldCBvcFRyZWUgPSBbXTtcbiAgICBjb25zdCB0bXAgPSBbXTtcblxuICAgIGZvciAoY29uc3Qgb3BMaXN0RWxlbWVudCBvZiBvcExpc3QpIHtcbiAgICAgIGlmIChvcExpc3RFbGVtZW50LmZuID09PSBcInNhdmVcIikge1xuICAgICAgICBvcFRyZWUucHVzaCh7IGZuSWQ6IDkyLCBmbjogXCJncm91cFwiLCBpdGVtczogW10gfSk7XG4gICAgICAgIHRtcC5wdXNoKG9wVHJlZSk7XG4gICAgICAgIG9wVHJlZSA9IG9wVHJlZVtvcFRyZWUubGVuZ3RoIC0gMV0uaXRlbXM7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3BMaXN0RWxlbWVudC5mbiA9PT0gXCJyZXN0b3JlXCIpIHtcbiAgICAgICAgb3BUcmVlID0gdG1wLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BUcmVlLnB1c2gob3BMaXN0RWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcFRyZWU7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgZmxvYXQgbnVtYmVyIGFzIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUge251bWJlcn0gLSBUaGUgZmxvYXQgbnVtYmVyIHRvIGZvcm1hdC5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbm5lci1kZWNsYXJhdGlvbnNcbiAgZnVuY3Rpb24gcGYodmFsdWUpIHtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCBzID0gdmFsdWUudG9GaXhlZCgxMCk7XG4gICAgbGV0IGkgPSBzLmxlbmd0aCAtIDE7XG4gICAgaWYgKHNbaV0gIT09IFwiMFwiKSB7XG4gICAgICByZXR1cm4gcztcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdHJhaWxpbmcgemVyb3MuXG4gICAgZG8ge1xuICAgICAgaS0tO1xuICAgIH0gd2hpbGUgKHNbaV0gPT09IFwiMFwiKTtcbiAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgc1tpXSA9PT0gXCIuXCIgPyBpIDogaSArIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBhIHRyYW5zZm9ybSBtYXRyaXggYXMgYSBzdHJpbmcuIFRoZSBzdGFuZGFyZCByb3RhdGlvbiwgc2NhbGUgYW5kXG4gICAqIHRyYW5zbGF0aW9uIG1hdHJpY2VzIGFyZSByZXBsYWNlZCBieSB0aGVpciBzaG9ydGVyIGZvcm1zLCBhbmQgZm9yXG4gICAqIGlkZW50aXR5IG1hdHJpY2VzIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCB0byBzYXZlIG1lbW9yeS5cbiAgICpcbiAgICogQHBhcmFtIG0ge0FycmF5fSAtIFRoZSB0cmFuc2Zvcm0gbWF0cml4IHRvIGZvcm1hdC5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbm5lci1kZWNsYXJhdGlvbnNcbiAgZnVuY3Rpb24gcG0obSkge1xuICAgIGlmIChtWzRdID09PSAwICYmIG1bNV0gPT09IDApIHtcbiAgICAgIGlmIChtWzFdID09PSAwICYmIG1bMl0gPT09IDApIHtcbiAgICAgICAgaWYgKG1bMF0gPT09IDEgJiYgbVszXSA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgc2NhbGUoJHtwZihtWzBdKX0gJHtwZihtWzNdKX0pYDtcbiAgICAgIH1cbiAgICAgIGlmIChtWzBdID09PSBtWzNdICYmIG1bMV0gPT09IC1tWzJdKSB7XG4gICAgICAgIGNvbnN0IGEgPSAoTWF0aC5hY29zKG1bMF0pICogMTgwKSAvIE1hdGguUEk7XG4gICAgICAgIHJldHVybiBgcm90YXRlKCR7cGYoYSl9KWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtWzBdID09PSAxICYmIG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCAmJiBtWzNdID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7cGYobVs0XSl9ICR7cGYobVs1XSl9KWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBgbWF0cml4KCR7cGYobVswXSl9ICR7cGYobVsxXSl9ICR7cGYobVsyXSl9ICR7cGYobVszXSl9ICR7cGYobVs0XSl9IGAgK1xuICAgICAgYCR7cGYobVs1XSl9KWBcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGNvdW50cyBiZWxvdyBhcmUgcmVsZXZhbnQgZm9yIGFsbCBwYWdlcywgc28gdGhleSBoYXZlIHRvIGJlIGdsb2JhbFxuICAvLyBpbnN0ZWFkIG9mIGJlaW5nIG1lbWJlcnMgb2YgYFNWR0dyYXBoaWNzYCAod2hpY2ggaXMgcmVjcmVhdGVkIGZvclxuICAvLyBlYWNoIHBhZ2UpLlxuICBsZXQgY2xpcENvdW50ID0gMDtcbiAgbGV0IG1hc2tDb3VudCA9IDA7XG4gIGxldCBzaGFkaW5nQ291bnQgPSAwO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgU1ZHR3JhcGhpY3MgPSBjbGFzcyBTVkdHcmFwaGljcyB7XG4gICAgY29uc3RydWN0b3IoY29tbW9uT2Jqcywgb2JqcywgZm9yY2VEYXRhU2NoZW1hID0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc3ZnRmFjdG9yeSA9IG5ldyBET01TVkdGYWN0b3J5KCk7XG5cbiAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBTVkdFeHRyYVN0YXRlKCk7XG4gICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IElERU5USVRZX01BVFJJWDsgLy8gR3JhcGhpY3Mgc3RhdGUgbWF0cml4XG4gICAgICB0aGlzLnRyYW5zZm9ybVN0YWNrID0gW107XG4gICAgICB0aGlzLmV4dHJhU3RhY2sgPSBbXTtcbiAgICAgIHRoaXMuY29tbW9uT2JqcyA9IGNvbW1vbk9ianM7XG4gICAgICB0aGlzLm9ianMgPSBvYmpzO1xuICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTtcblxuICAgICAgdGhpcy5lbWJlZEZvbnRzID0gZmFsc2U7XG4gICAgICB0aGlzLmVtYmVkZGVkRm9udHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdGhpcy5jc3NTdHlsZSA9IG51bGw7XG4gICAgICB0aGlzLmZvcmNlRGF0YVNjaGVtYSA9ICEhZm9yY2VEYXRhU2NoZW1hO1xuXG4gICAgICAvLyBJbiBgc3JjL3NoYXJlZC91dGlsLmpzYCB0aGUgb3BlcmF0b3IgbmFtZXMgYXJlIG1hcHBlZCB0byBJRHMuXG4gICAgICAvLyBUaGUgbGlzdCBiZWxvdyByZXByZXNlbnRzIHRoZSByZXZlcnNlIG9mIHRoYXQsIGkuZS4sIGl0IG1hcHMgSURzXG4gICAgICAvLyB0byBvcGVyYXRvciBuYW1lcy5cbiAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wIGluIE9QUykge1xuICAgICAgICB0aGlzLl9vcGVyYXRvcklkTWFwcGluZ1tPUFNbb3BdXSA9IG9wO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNhdmUoKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy50cmFuc2Zvcm1NYXRyaXgpO1xuICAgICAgY29uc3Qgb2xkID0gdGhpcy5jdXJyZW50O1xuICAgICAgdGhpcy5leHRyYVN0YWNrLnB1c2gob2xkKTtcbiAgICAgIHRoaXMuY3VycmVudCA9IG9sZC5jbG9uZSgpO1xuICAgIH1cblxuICAgIHJlc3RvcmUoKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHRoaXMudHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmV4dHJhU3RhY2sucG9wKCk7XG4gICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgIHRoaXMudGdycCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ3JvdXAoaXRlbXMpIHtcbiAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKGl0ZW1zKTtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH1cblxuICAgIGxvYWREZXBlbmRlbmNpZXMob3BlcmF0b3JMaXN0KSB7XG4gICAgICBjb25zdCBmbkFycmF5ID0gb3BlcmF0b3JMaXN0LmZuQXJyYXk7XG4gICAgICBjb25zdCBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5O1xuXG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IE9QUy5kZXBlbmRlbmN5KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG9iaiBvZiBhcmdzQXJyYXlbaV0pIHtcbiAgICAgICAgICBjb25zdCBvYmpzUG9vbCA9IG9iai5zdGFydHNXaXRoKFwiZ19cIikgPyB0aGlzLmNvbW1vbk9ianMgOiB0aGlzLm9ianM7XG4gICAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgb2Jqc1Bvb2wuZ2V0KG9iaiwgcmVzb2x2ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcy5wdXNoKHByb21pc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcyk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybU1hdHJpeCA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gVXRpbC50cmFuc2Zvcm0oXG4gICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4LFxuICAgICAgICB0cmFuc2Zvcm1NYXRyaXhcbiAgICAgICk7XG4gICAgICB0aGlzLnRncnAgPSBudWxsO1xuICAgIH1cblxuICAgIGdldFNWRyhvcGVyYXRvckxpc3QsIHZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG5cbiAgICAgIGNvbnN0IHN2Z0VsZW1lbnQgPSB0aGlzLl9pbml0aWFsaXplKHZpZXdwb3J0KTtcbiAgICAgIHJldHVybiB0aGlzLmxvYWREZXBlbmRlbmNpZXMob3BlcmF0b3JMaXN0KS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBJREVOVElUWV9NQVRSSVg7XG4gICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSk7XG4gICAgICAgIHJldHVybiBzdmdFbGVtZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29udmVydE9wTGlzdChvcGVyYXRvckxpc3QpIHtcbiAgICAgIGNvbnN0IG9wZXJhdG9ySWRNYXBwaW5nID0gdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmc7XG4gICAgICBjb25zdCBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5O1xuICAgICAgY29uc3QgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5O1xuICAgICAgY29uc3Qgb3BMaXN0ID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgZm5JZCA9IGZuQXJyYXlbaV07XG4gICAgICAgIG9wTGlzdC5wdXNoKHtcbiAgICAgICAgICBmbklkLFxuICAgICAgICAgIGZuOiBvcGVyYXRvcklkTWFwcGluZ1tmbklkXSxcbiAgICAgICAgICBhcmdzOiBhcmdzQXJyYXlbaV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wTGlzdFRvVHJlZShvcExpc3QpO1xuICAgIH1cblxuICAgIGV4ZWN1dGVPcFRyZWUob3BUcmVlKSB7XG4gICAgICBmb3IgKGNvbnN0IG9wVHJlZUVsZW1lbnQgb2Ygb3BUcmVlKSB7XG4gICAgICAgIGNvbnN0IGZuID0gb3BUcmVlRWxlbWVudC5mbjtcbiAgICAgICAgY29uc3QgZm5JZCA9IG9wVHJlZUVsZW1lbnQuZm5JZDtcbiAgICAgICAgY29uc3QgYXJncyA9IG9wVHJlZUVsZW1lbnQuYXJncztcblxuICAgICAgICBzd2l0Y2ggKGZuSWQgfCAwKSB7XG4gICAgICAgICAgY2FzZSBPUFMuYmVnaW5UZXh0OlxuICAgICAgICAgICAgdGhpcy5iZWdpblRleHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmRlcGVuZGVuY3k6XG4gICAgICAgICAgICAvLyBIYW5kbGVkIGluIGBsb2FkRGVwZW5kZW5jaWVzYCwgc28gbm8gd2FybmluZyBzaG91bGQgYmUgc2hvd24uXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRMZWFkaW5nOlxuICAgICAgICAgICAgdGhpcy5zZXRMZWFkaW5nKGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZ01vdmVUZXh0OlxuICAgICAgICAgICAgdGhpcy5zZXRMZWFkaW5nTW92ZVRleHQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRGb250OlxuICAgICAgICAgICAgdGhpcy5zZXRGb250KGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6XG4gICAgICAgICAgICB0aGlzLnNob3dUZXh0KGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2hvd1NwYWNlZFRleHQ6XG4gICAgICAgICAgICB0aGlzLnNob3dUZXh0KGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuZW5kVGV4dDpcbiAgICAgICAgICAgIHRoaXMuZW5kVGV4dCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubW92ZVRleHQ6XG4gICAgICAgICAgICB0aGlzLm1vdmVUZXh0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0Q2hhclNwYWNpbmc6XG4gICAgICAgICAgICB0aGlzLnNldENoYXJTcGFjaW5nKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0V29yZFNwYWNpbmc6XG4gICAgICAgICAgICB0aGlzLnNldFdvcmRTcGFjaW5nKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0SFNjYWxlOlxuICAgICAgICAgICAgdGhpcy5zZXRIU2NhbGUoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRUZXh0TWF0cml4OlxuICAgICAgICAgICAgdGhpcy5zZXRUZXh0TWF0cml4KFxuICAgICAgICAgICAgICBhcmdzWzBdLFxuICAgICAgICAgICAgICBhcmdzWzFdLFxuICAgICAgICAgICAgICBhcmdzWzJdLFxuICAgICAgICAgICAgICBhcmdzWzNdLFxuICAgICAgICAgICAgICBhcmdzWzRdLFxuICAgICAgICAgICAgICBhcmdzWzVdXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJpc2U6XG4gICAgICAgICAgICB0aGlzLnNldFRleHRSaXNlKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6XG4gICAgICAgICAgICB0aGlzLnNldFRleHRSZW5kZXJpbmdNb2RlKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0TGluZVdpZHRoOlxuICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRMaW5lSm9pbjpcbiAgICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4oYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRMaW5lQ2FwOlxuICAgICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0TWl0ZXJMaW1pdDpcbiAgICAgICAgICAgIHRoaXMuc2V0TWl0ZXJMaW1pdChhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjpcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsbFJHQkNvbG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlUkdCQ29sb3I6XG4gICAgICAgICAgICB0aGlzLnNldFN0cm9rZVJHQkNvbG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3JOOlxuICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VDb2xvck4oYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3JOOlxuICAgICAgICAgICAgdGhpcy5zZXRGaWxsQ29sb3JOKGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2hhZGluZ0ZpbGw6XG4gICAgICAgICAgICB0aGlzLnNoYWRpbmdGaWxsKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0RGFzaDpcbiAgICAgICAgICAgIHRoaXMuc2V0RGFzaChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFJlbmRlcmluZ0ludGVudDpcbiAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0RmxhdG5lc3M6XG4gICAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0R1N0YXRlOlxuICAgICAgICAgICAgdGhpcy5zZXRHU3RhdGUoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5maWxsOlxuICAgICAgICAgICAgdGhpcy5maWxsKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5lb0ZpbGw6XG4gICAgICAgICAgICB0aGlzLmVvRmlsbCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc3Ryb2tlOlxuICAgICAgICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmZpbGxTdHJva2U6XG4gICAgICAgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmVvRmlsbFN0cm9rZTpcbiAgICAgICAgICAgIHRoaXMuZW9GaWxsU3Ryb2tlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5jbGlwOlxuICAgICAgICAgICAgdGhpcy5jbGlwKFwibm9uemVyb1wiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmVvQ2xpcDpcbiAgICAgICAgICAgIHRoaXMuY2xpcChcImV2ZW5vZGRcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6XG4gICAgICAgICAgICB0aGlzLnBhaW50U29saWRDb2xvckltYWdlTWFzaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMucGFpbnRJbWFnZVhPYmplY3Q6XG4gICAgICAgICAgICB0aGlzLnBhaW50SW1hZ2VYT2JqZWN0KGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6XG4gICAgICAgICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OlxuICAgICAgICAgICAgdGhpcy5wYWludEltYWdlTWFza1hPYmplY3QoYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW46XG4gICAgICAgICAgICB0aGlzLnBhaW50Rm9ybVhPYmplY3RCZWdpbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQ6XG4gICAgICAgICAgICB0aGlzLnBhaW50Rm9ybVhPYmplY3RFbmQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5jbG9zZVN0cm9rZTpcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTdHJva2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmNsb3NlRmlsbFN0cm9rZTpcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGaWxsU3Ryb2tlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5jbG9zZUVPRmlsbFN0cm9rZTpcbiAgICAgICAgICAgIHRoaXMuY2xvc2VFT0ZpbGxTdHJva2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lOlxuICAgICAgICAgICAgdGhpcy5uZXh0TGluZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMudHJhbnNmb3JtOlxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgIGFyZ3NbMF0sXG4gICAgICAgICAgICAgIGFyZ3NbMV0sXG4gICAgICAgICAgICAgIGFyZ3NbMl0sXG4gICAgICAgICAgICAgIGFyZ3NbM10sXG4gICAgICAgICAgICAgIGFyZ3NbNF0sXG4gICAgICAgICAgICAgIGFyZ3NbNV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5jb25zdHJ1Y3RQYXRoOlxuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RQYXRoKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuZW5kUGF0aDpcbiAgICAgICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA5MjpcbiAgICAgICAgICAgIHRoaXMuZ3JvdXAob3BUcmVlRWxlbWVudC5pdGVtcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgd2FybihgVW5pbXBsZW1lbnRlZCBvcGVyYXRvciAke2ZufWApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRXb3JkU3BhY2luZyh3b3JkU3BhY2luZykge1xuICAgICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gd29yZFNwYWNpbmc7XG4gICAgfVxuXG4gICAgc2V0Q2hhclNwYWNpbmcoY2hhclNwYWNpbmcpIHtcbiAgICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IGNoYXJTcGFjaW5nO1xuICAgIH1cblxuICAgIG5leHRMaW5lKCkge1xuICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gICAgfVxuXG4gICAgc2V0VGV4dE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgY3VycmVudC50ZXh0TWF0cml4ID0gY3VycmVudC5saW5lTWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cbiAgICAgIGN1cnJlbnQueCA9IGN1cnJlbnQubGluZVggPSAwO1xuICAgICAgY3VycmVudC55ID0gY3VycmVudC5saW5lWSA9IDA7XG5cbiAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdO1xuICAgICAgY3VycmVudC55Y29vcmRzID0gW107XG4gICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1mYW1pbHlcIiwgY3VycmVudC5mb250RmFtaWx5KTtcbiAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwiZm9udC1zaXplXCIsXG4gICAgICAgIGAke3BmKGN1cnJlbnQuZm9udFNpemUpfXB4YFxuICAgICAgKTtcbiAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1jdXJyZW50LnkpKTtcblxuICAgICAgY3VycmVudC50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcbiAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5hcHBlbmRDaGlsZChjdXJyZW50LnRzcGFuKTtcbiAgICB9XG5cbiAgICBiZWdpblRleHQoKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgY3VycmVudC54ID0gY3VycmVudC5saW5lWCA9IDA7XG4gICAgICBjdXJyZW50LnkgPSBjdXJyZW50LmxpbmVZID0gMDtcbiAgICAgIGN1cnJlbnQudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWDtcbiAgICAgIGN1cnJlbnQubGluZU1hdHJpeCA9IElERU5USVRZX01BVFJJWDtcbiAgICAgIGN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICAgIGN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgIGN1cnJlbnQudHh0RWxlbWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRleHRcIik7XG4gICAgICBjdXJyZW50LnR4dGdycCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG4gICAgICBjdXJyZW50Lnhjb29yZHMgPSBbXTtcbiAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdO1xuICAgIH1cblxuICAgIG1vdmVUZXh0KHgsIHkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBjdXJyZW50LnggPSBjdXJyZW50LmxpbmVYICs9IHg7XG4gICAgICBjdXJyZW50LnkgPSBjdXJyZW50LmxpbmVZICs9IHk7XG5cbiAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdO1xuICAgICAgY3VycmVudC55Y29vcmRzID0gW107XG4gICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1mYW1pbHlcIiwgY3VycmVudC5mb250RmFtaWx5KTtcbiAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwiZm9udC1zaXplXCIsXG4gICAgICAgIGAke3BmKGN1cnJlbnQuZm9udFNpemUpfXB4YFxuICAgICAgKTtcbiAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1jdXJyZW50LnkpKTtcbiAgICB9XG5cbiAgICBzaG93VGV4dChnbHlwaHMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250O1xuICAgICAgY29uc3QgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplO1xuICAgICAgaWYgKGZvbnRTaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9udFNpemVTY2FsZSA9IGN1cnJlbnQuZm9udFNpemVTY2FsZTtcbiAgICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZztcbiAgICAgIGNvbnN0IHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZztcbiAgICAgIGNvbnN0IGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG4gICAgICBjb25zdCB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjtcbiAgICAgIGNvbnN0IHZlcnRpY2FsID0gZm9udC52ZXJ0aWNhbDtcbiAgICAgIGNvbnN0IHNwYWNpbmdEaXIgPSB2ZXJ0aWNhbCA/IDEgOiAtMTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWTWV0cmljcyA9IGZvbnQuZGVmYXVsdFZNZXRyaWNzO1xuICAgICAgY29uc3Qgd2lkdGhBZHZhbmNlU2NhbGUgPSBmb250U2l6ZSAqIGN1cnJlbnQuZm9udE1hdHJpeFswXTtcblxuICAgICAgbGV0IHggPSAwO1xuICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHtcbiAgICAgICAgaWYgKGdseXBoID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV29yZCBicmVha1xuICAgICAgICAgIHggKz0gZm9udERpcmVjdGlvbiAqIHdvcmRTcGFjaW5nO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtKGdseXBoKSkge1xuICAgICAgICAgIHggKz0gKHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplKSAvIDEwMDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG4gICAgICAgIGNvbnN0IGNoYXJhY3RlciA9IGdseXBoLmZvbnRDaGFyO1xuICAgICAgICBsZXQgc2NhbGVkWCwgc2NhbGVkWTtcbiAgICAgICAgbGV0IHdpZHRoID0gZ2x5cGgud2lkdGg7XG4gICAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICAgIGxldCB2eDtcbiAgICAgICAgICBjb25zdCB2bWV0cmljID0gZ2x5cGgudm1ldHJpYyB8fCBkZWZhdWx0Vk1ldHJpY3M7XG4gICAgICAgICAgdnggPSBnbHlwaC52bWV0cmljID8gdm1ldHJpY1sxXSA6IHdpZHRoICogMC41O1xuICAgICAgICAgIHZ4ID0gLXZ4ICogd2lkdGhBZHZhbmNlU2NhbGU7XG4gICAgICAgICAgY29uc3QgdnkgPSB2bWV0cmljWzJdICogd2lkdGhBZHZhbmNlU2NhbGU7XG5cbiAgICAgICAgICB3aWR0aCA9IHZtZXRyaWMgPyAtdm1ldHJpY1swXSA6IHdpZHRoO1xuICAgICAgICAgIHNjYWxlZFggPSB2eCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgc2NhbGVkWSA9ICh4ICsgdnkpIC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2FsZWRYID0geCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgc2NhbGVkWSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2x5cGguaXNJbkZvbnQgfHwgZm9udC5taXNzaW5nRmlsZSkge1xuICAgICAgICAgIGN1cnJlbnQueGNvb3Jkcy5wdXNoKGN1cnJlbnQueCArIHNjYWxlZFgpO1xuICAgICAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICAgICAgY3VycmVudC55Y29vcmRzLnB1c2goLWN1cnJlbnQueSArIHNjYWxlZFkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50LnRzcGFuLnRleHRDb250ZW50ICs9IGNoYXJhY3RlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUT0RPOiBUbyBhc3Npc3Qgd2l0aCB0ZXh0IHNlbGVjdGlvbiwgd2Ugc2hvdWxkIHJlcGxhY2UgdGhlIG1pc3NpbmdcbiAgICAgICAgICAvLyBjaGFyYWN0ZXIgd2l0aCBhIHNwYWNlIGNoYXJhY3RlciBpZiBjaGFyV2lkdGggaXMgbm90IHplcm8uXG4gICAgICAgICAgLy8gQnV0IHdlIGNhbm5vdCBqdXN0IGRvIFwiY2hhcmFjdGVyID0gJyAnXCIsIGJlY2F1c2UgdGhlICcgJyBjaGFyYWN0ZXJcbiAgICAgICAgICAvLyBtaWdodCBhY3R1YWxseSBtYXAgdG8gYSBkaWZmZXJlbnQgZ2x5cGguXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2hhcldpZHRoO1xuICAgICAgICBpZiAodmVydGljYWwpIHtcbiAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlIC0gc3BhY2luZyAqIGZvbnREaXJlY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSArIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgeCArPSBjaGFyV2lkdGg7XG4gICAgICB9XG4gICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgICBudWxsLFxuICAgICAgICBcInhcIixcbiAgICAgICAgY3VycmVudC54Y29vcmRzLm1hcChwZikuam9pbihcIiBcIilcbiAgICAgICk7XG4gICAgICBpZiAodmVydGljYWwpIHtcbiAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIFwieVwiLFxuICAgICAgICAgIGN1cnJlbnQueWNvb3Jkcy5tYXAocGYpLmpvaW4oXCIgXCIpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtY3VycmVudC55KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICBjdXJyZW50LnkgLT0geDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQueCArPSB4ICogdGV4dEhTY2FsZTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtZmFtaWx5XCIsIGN1cnJlbnQuZm9udEZhbWlseSk7XG4gICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgICBudWxsLFxuICAgICAgICBcImZvbnQtc2l6ZVwiLFxuICAgICAgICBgJHtwZihjdXJyZW50LmZvbnRTaXplKX1weGBcbiAgICAgICk7XG4gICAgICBpZiAoY3VycmVudC5mb250U3R5bGUgIT09IFNWR19ERUZBVUxUUy5mb250U3R5bGUpIHtcbiAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc3R5bGVcIiwgY3VycmVudC5mb250U3R5bGUpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnQuZm9udFdlaWdodCAhPT0gU1ZHX0RFRkFVTFRTLmZvbnRXZWlnaHQpIHtcbiAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtd2VpZ2h0XCIsIGN1cnJlbnQuZm9udFdlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGxTdHJva2VNb2RlID1cbiAgICAgICAgY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8XG4gICAgICAgIGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRVxuICAgICAgKSB7XG4gICAgICAgIGlmIChjdXJyZW50LmZpbGxDb2xvciAhPT0gU1ZHX0RFRkFVTFRTLmZpbGxDb2xvcikge1xuICAgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIGN1cnJlbnQuZmlsbENvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudC5maWxsQWxwaGEgPCAxKSB7XG4gICAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtb3BhY2l0eVwiLCBjdXJyZW50LmZpbGxBbHBoYSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEgpIHtcbiAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgRmlyZWZveDogV2UgbXVzdCBzZXQgZmlsbD1cInRyYW5zcGFyZW50XCIgYmVjYXVzZVxuICAgICAgICAvLyBmaWxsPVwibm9uZVwiIHdvdWxkIGdlbmVyYXRlIGFuIGVtcHR5IGNsaXBwaW5nIHBhdGguXG4gICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fFxuICAgICAgICBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VcbiAgICAgICkge1xuICAgICAgICBjb25zdCBsaW5lV2lkdGhTY2FsZSA9IDEgLyAoY3VycmVudC50ZXh0TWF0cml4U2NhbGUgfHwgMSk7XG4gICAgICAgIHRoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXMoY3VycmVudC50c3BhbiwgbGluZVdpZHRoU2NhbGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJbmNsdWRlIHRoZSB0ZXh0IHJpc2UgaW4gdGhlIHRleHQgbWF0cml4IHNpbmNlIHRoZSBgcG1gIGZ1bmN0aW9uXG4gICAgICAvLyBjcmVhdGVzIHRoZSBTVkcgZWxlbWVudCdzIGB0cmFuc2xhdGVgIGVudHJ5ICh3b3JrIG9uIGEgY29weSB0byBhdm9pZFxuICAgICAgLy8gYWx0ZXJpbmcgdGhlIG9yaWdpbmFsIHRleHQgbWF0cml4KS5cbiAgICAgIGxldCB0ZXh0TWF0cml4ID0gY3VycmVudC50ZXh0TWF0cml4O1xuICAgICAgaWYgKGN1cnJlbnQudGV4dFJpc2UgIT09IDApIHtcbiAgICAgICAgdGV4dE1hdHJpeCA9IHRleHRNYXRyaXguc2xpY2UoKTtcbiAgICAgICAgdGV4dE1hdHJpeFs1XSArPSBjdXJyZW50LnRleHRSaXNlO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LnR4dEVsZW1lbnQuc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgIGAke3BtKHRleHRNYXRyaXgpfSBzY2FsZSgke3BmKHRleHRIU2NhbGUpfSwgLTEpYFxuICAgICAgKTtcbiAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTlMsIFwieG1sOnNwYWNlXCIsIFwicHJlc2VydmVcIik7XG4gICAgICBjdXJyZW50LnR4dEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3VycmVudC50c3Bhbik7XG4gICAgICBjdXJyZW50LnR4dGdycC5hcHBlbmRDaGlsZChjdXJyZW50LnR4dEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKGN1cnJlbnQudHh0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgc2V0TGVhZGluZ01vdmVUZXh0KHgsIHkpIHtcbiAgICAgIHRoaXMuc2V0TGVhZGluZygteSk7XG4gICAgICB0aGlzLm1vdmVUZXh0KHgsIHkpO1xuICAgIH1cblxuICAgIGFkZEZvbnRTdHlsZShmb250T2JqKSB7XG4gICAgICBpZiAoIWZvbnRPYmouZGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJhZGRGb250U3R5bGU6IE5vIGZvbnQgZGF0YSBhdmFpbGFibGUsIFwiICtcbiAgICAgICAgICAgICdlbnN1cmUgdGhhdCB0aGUgXCJmb250RXh0cmFQcm9wZXJ0aWVzXCIgQVBJIHBhcmFtZXRlciBpcyBzZXQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNzc1N0eWxlKSB7XG4gICAgICAgIHRoaXMuY3NzU3R5bGUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpzdHlsZVwiKTtcbiAgICAgICAgdGhpcy5jc3NTdHlsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInR5cGVcIiwgXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgdGhpcy5kZWZzLmFwcGVuZENoaWxkKHRoaXMuY3NzU3R5bGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmwgPSBjcmVhdGVPYmplY3RVUkwoXG4gICAgICAgIGZvbnRPYmouZGF0YSxcbiAgICAgICAgZm9udE9iai5taW1ldHlwZSxcbiAgICAgICAgdGhpcy5mb3JjZURhdGFTY2hlbWFcbiAgICAgICk7XG4gICAgICB0aGlzLmNzc1N0eWxlLnRleHRDb250ZW50ICs9XG4gICAgICAgIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6IFwiJHtmb250T2JqLmxvYWRlZE5hbWV9XCI7YCArXG4gICAgICAgIGAgc3JjOiB1cmwoJHt1cmx9KTsgfVxcbmA7XG4gICAgfVxuXG4gICAgc2V0Rm9udChkZXRhaWxzKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgY29uc3QgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZGV0YWlsc1swXSk7XG4gICAgICBsZXQgc2l6ZSA9IGRldGFpbHNbMV07XG4gICAgICBjdXJyZW50LmZvbnQgPSBmb250T2JqO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZW1iZWRGb250cyAmJlxuICAgICAgICAhZm9udE9iai5taXNzaW5nRmlsZSAmJlxuICAgICAgICAhdGhpcy5lbWJlZGRlZEZvbnRzW2ZvbnRPYmoubG9hZGVkTmFtZV1cbiAgICAgICkge1xuICAgICAgICB0aGlzLmFkZEZvbnRTdHlsZShmb250T2JqKTtcbiAgICAgICAgdGhpcy5lbWJlZGRlZEZvbnRzW2ZvbnRPYmoubG9hZGVkTmFtZV0gPSBmb250T2JqO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LmZvbnRNYXRyaXggPSBmb250T2JqLmZvbnRNYXRyaXhcbiAgICAgICAgPyBmb250T2JqLmZvbnRNYXRyaXhcbiAgICAgICAgOiBGT05UX0lERU5USVRZX01BVFJJWDtcblxuICAgICAgbGV0IGJvbGQgPSBcIm5vcm1hbFwiO1xuICAgICAgaWYgKGZvbnRPYmouYmxhY2spIHtcbiAgICAgICAgYm9sZCA9IFwiOTAwXCI7XG4gICAgICB9IGVsc2UgaWYgKGZvbnRPYmouYm9sZCkge1xuICAgICAgICBib2xkID0gXCJib2xkXCI7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGFsaWMgPSBmb250T2JqLml0YWxpYyA/IFwiaXRhbGljXCIgOiBcIm5vcm1hbFwiO1xuXG4gICAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgICAgc2l6ZSA9IC1zaXplO1xuICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IDE7XG4gICAgICB9XG4gICAgICBjdXJyZW50LmZvbnRTaXplID0gc2l6ZTtcbiAgICAgIGN1cnJlbnQuZm9udEZhbWlseSA9IGZvbnRPYmoubG9hZGVkTmFtZTtcbiAgICAgIGN1cnJlbnQuZm9udFdlaWdodCA9IGJvbGQ7XG4gICAgICBjdXJyZW50LmZvbnRTdHlsZSA9IGl0YWxpYztcblxuICAgICAgY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgcGYoLWN1cnJlbnQueSkpO1xuICAgICAgY3VycmVudC54Y29vcmRzID0gW107XG4gICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTtcbiAgICB9XG5cbiAgICBlbmRUZXh0KCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICAgIGlmIChcbiAgICAgICAgY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIFRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcgJiZcbiAgICAgICAgY3VycmVudC50eHRFbGVtZW50ICYmXG4gICAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5oYXNDaGlsZE5vZGVzKClcbiAgICAgICkge1xuICAgICAgICAvLyBJZiBubyBnbHlwaHMgYXJlIHNob3duIChpLmUuIG5vIGNoaWxkIG5vZGVzKSwgbm8gY2xpcHBpbmcgb2NjdXJzLlxuICAgICAgICBjdXJyZW50LmVsZW1lbnQgPSBjdXJyZW50LnR4dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG4gICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBhdGggcHJvcGVydGllc1xuICAgIHNldExpbmVXaWR0aCh3aWR0aCkge1xuICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gd2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0TGluZUNhcChzdHlsZSkge1xuICAgICAgdGhpcy5jdXJyZW50LmxpbmVDYXAgPSBMSU5FX0NBUF9TVFlMRVNbc3R5bGVdO1xuICAgIH1cblxuICAgIHNldExpbmVKb2luKHN0eWxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQubGluZUpvaW4gPSBMSU5FX0pPSU5fU1RZTEVTW3N0eWxlXTtcbiAgICB9XG5cbiAgICBzZXRNaXRlckxpbWl0KGxpbWl0KSB7XG4gICAgICB0aGlzLmN1cnJlbnQubWl0ZXJMaW1pdCA9IGxpbWl0O1xuICAgIH1cblxuICAgIHNldFN0cm9rZUFscGhhKHN0cm9rZUFscGhhKSB7XG4gICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBzdHJva2VBbHBoYTtcbiAgICB9XG5cbiAgICBzZXRTdHJva2VSR0JDb2xvcihyLCBnLCBiKSB7XG4gICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBVdGlsLm1ha2VDc3NSZ2IociwgZywgYik7XG4gICAgfVxuXG4gICAgc2V0RmlsbEFscGhhKGZpbGxBbHBoYSkge1xuICAgICAgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSA9IGZpbGxBbHBoYTtcbiAgICB9XG5cbiAgICBzZXRGaWxsUkdCQ29sb3IociwgZywgYikge1xuICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IFV0aWwubWFrZUNzc1JnYihyLCBnLCBiKTtcbiAgICAgIHRoaXMuY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuICAgICAgdGhpcy5jdXJyZW50Lnhjb29yZHMgPSBbXTtcbiAgICAgIHRoaXMuY3VycmVudC55Y29vcmRzID0gW107XG4gICAgfVxuXG4gICAgc2V0U3Ryb2tlQ29sb3JOKGFyZ3MpIHtcbiAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuX21ha2VDb2xvck5fUGF0dGVybihhcmdzKTtcbiAgICB9XG5cbiAgICBzZXRGaWxsQ29sb3JOKGFyZ3MpIHtcbiAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLl9tYWtlQ29sb3JOX1BhdHRlcm4oYXJncyk7XG4gICAgfVxuXG4gICAgc2hhZGluZ0ZpbGwoYXJncykge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnZpZXdwb3J0LndpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy52aWV3cG9ydC5oZWlnaHQ7XG4gICAgICBjb25zdCBpbnYgPSBVdGlsLmludmVyc2VUcmFuc2Zvcm0odGhpcy50cmFuc2Zvcm1NYXRyaXgpO1xuICAgICAgY29uc3QgYmwgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFswLCAwXSwgaW52KTtcbiAgICAgIGNvbnN0IGJyID0gVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgaGVpZ2h0XSwgaW52KTtcbiAgICAgIGNvbnN0IHVsID0gVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIDBdLCBpbnYpO1xuICAgICAgY29uc3QgdXIgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFt3aWR0aCwgaGVpZ2h0XSwgaW52KTtcbiAgICAgIGNvbnN0IHgwID0gTWF0aC5taW4oYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pO1xuICAgICAgY29uc3QgeTAgPSBNYXRoLm1pbihibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7XG4gICAgICBjb25zdCB4MSA9IE1hdGgubWF4KGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTtcbiAgICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pO1xuXG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIHgwKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHkwKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCB4MSAtIHgwKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgeTEgLSB5MCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4oYXJncykpO1xuICAgICAgaWYgKHRoaXMuY3VycmVudC5maWxsQWxwaGEgPCAxKSB7XG4gICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKHJlY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX21ha2VDb2xvck5fUGF0dGVybihhcmdzKSB7XG4gICAgICBpZiAoYXJnc1swXSA9PT0gXCJUaWxpbmdQYXR0ZXJuXCIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VUaWxpbmdQYXR0ZXJuKGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX21ha2VTaGFkaW5nUGF0dGVybihhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9tYWtlVGlsaW5nUGF0dGVybihhcmdzKSB7XG4gICAgICBjb25zdCBjb2xvciA9IGFyZ3NbMV07XG4gICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBhcmdzWzJdO1xuICAgICAgY29uc3QgbWF0cml4ID0gYXJnc1szXSB8fCBJREVOVElUWV9NQVRSSVg7XG4gICAgICBjb25zdCBbeDAsIHkwLCB4MSwgeTFdID0gYXJnc1s0XTtcbiAgICAgIGNvbnN0IHhzdGVwID0gYXJnc1s1XTtcbiAgICAgIGNvbnN0IHlzdGVwID0gYXJnc1s2XTtcbiAgICAgIGNvbnN0IHBhaW50VHlwZSA9IGFyZ3NbN107XG5cbiAgICAgIGNvbnN0IHRpbGluZ0lkID0gYHNoYWRpbmcke3NoYWRpbmdDb3VudCsrfWA7XG4gICAgICBjb25zdCBbdHgwLCB0eTBdID0gVXRpbC5hcHBseVRyYW5zZm9ybShbeDAsIHkwXSwgbWF0cml4KTtcbiAgICAgIGNvbnN0IFt0eDEsIHR5MV0gPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFt4MSwgeTFdLCBtYXRyaXgpO1xuICAgICAgY29uc3QgW3hzY2FsZSwgeXNjYWxlXSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobWF0cml4KTtcbiAgICAgIGNvbnN0IHR4c3RlcCA9IHhzdGVwICogeHNjYWxlO1xuICAgICAgY29uc3QgdHlzdGVwID0geXN0ZXAgKiB5c2NhbGU7XG5cbiAgICAgIGNvbnN0IHRpbGluZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnBhdHRlcm5cIik7XG4gICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCB0aWxpbmdJZCk7XG4gICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJwYXR0ZXJuVW5pdHNcIiwgXCJ1c2VyU3BhY2VPblVzZVwiKTtcbiAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHR4c3RlcCk7XG4gICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgdHlzdGVwKTtcbiAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgYCR7dHgwfWApO1xuICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBgJHt0eTB9YCk7XG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBzdGF0ZS5cbiAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnO1xuICAgICAgY29uc3QgdHJhbnNmb3JtTWF0cml4ID0gdGhpcy50cmFuc2Zvcm1NYXRyaXg7XG4gICAgICBjb25zdCBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG5cbiAgICAgIGNvbnN0IGJib3ggPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHR4MSAtIHR4MCwgdHkxIC0gdHkwKTtcbiAgICAgIHRoaXMuc3ZnID0gYmJveDtcbiAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gbWF0cml4O1xuICAgICAgaWYgKHBhaW50VHlwZSA9PT0gMikge1xuICAgICAgICBjb25zdCBjc3NDb2xvciA9IFV0aWwubWFrZUNzc1JnYiguLi5jb2xvcik7XG4gICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBjc3NDb2xvcjtcbiAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7XG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWN1dGVPcFRyZWUodGhpcy5jb252ZXJ0T3BMaXN0KG9wZXJhdG9yTGlzdCkpO1xuXG4gICAgICAvLyBSZXN0b3JlIHNhdmVkIHN0YXRlLlxuICAgICAgdGhpcy5zdmcgPSBzdmc7XG4gICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHRyYW5zZm9ybU1hdHJpeDtcbiAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBmaWxsQ29sb3I7XG4gICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBzdHJva2VDb2xvcjtcblxuICAgICAgdGlsaW5nLmFwcGVuZENoaWxkKGJib3guY2hpbGROb2Rlc1swXSk7XG4gICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQodGlsaW5nKTtcbiAgICAgIHJldHVybiBgdXJsKCMke3RpbGluZ0lkfSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX21ha2VTaGFkaW5nUGF0dGVybihhcmdzKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3NbMF0pIHtcbiAgICAgICAgY2FzZSBcIlJhZGlhbEF4aWFsXCI6XG4gICAgICAgICAgY29uc3Qgc2hhZGluZ0lkID0gYHNoYWRpbmcke3NoYWRpbmdDb3VudCsrfWA7XG4gICAgICAgICAgY29uc3QgY29sb3JTdG9wcyA9IGFyZ3NbM107XG4gICAgICAgICAgbGV0IGdyYWRpZW50O1xuXG4gICAgICAgICAgc3dpdGNoIChhcmdzWzFdKSB7XG4gICAgICAgICAgICBjYXNlIFwiYXhpYWxcIjpcbiAgICAgICAgICAgICAgY29uc3QgcG9pbnQwID0gYXJnc1s0XTtcbiAgICAgICAgICAgICAgY29uc3QgcG9pbnQxID0gYXJnc1s1XTtcbiAgICAgICAgICAgICAgZ3JhZGllbnQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpsaW5lYXJHcmFkaWVudFwiKTtcbiAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBzaGFkaW5nSWQpO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImdyYWRpZW50VW5pdHNcIiwgXCJ1c2VyU3BhY2VPblVzZVwiKTtcbiAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4MVwiLCBwb2ludDBbMF0pO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInkxXCIsIHBvaW50MFsxXSk7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieDJcIiwgcG9pbnQxWzBdKTtcbiAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5MlwiLCBwb2ludDFbMV0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyYWRpYWxcIjpcbiAgICAgICAgICAgICAgY29uc3QgZm9jYWxQb2ludCA9IGFyZ3NbNF07XG4gICAgICAgICAgICAgIGNvbnN0IGNpcmNsZVBvaW50ID0gYXJnc1s1XTtcbiAgICAgICAgICAgICAgY29uc3QgZm9jYWxSYWRpdXMgPSBhcmdzWzZdO1xuICAgICAgICAgICAgICBjb25zdCBjaXJjbGVSYWRpdXMgPSBhcmdzWzddO1xuICAgICAgICAgICAgICBncmFkaWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJhZGlhbEdyYWRpZW50XCIpO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIHNoYWRpbmdJZCk7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZ3JhZGllbnRVbml0c1wiLCBcInVzZXJTcGFjZU9uVXNlXCIpO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN4XCIsIGNpcmNsZVBvaW50WzBdKTtcbiAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjeVwiLCBjaXJjbGVQb2ludFsxXSk7XG4gICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiclwiLCBjaXJjbGVSYWRpdXMpO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZ4XCIsIGZvY2FsUG9pbnRbMF0pO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZ5XCIsIGZvY2FsUG9pbnRbMV0pO1xuICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZyXCIsIGZvY2FsUmFkaXVzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUmFkaWFsQXhpYWwgdHlwZTogJHthcmdzWzFdfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbG9yU3RvcCBvZiBjb2xvclN0b3BzKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9wID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6c3RvcFwiKTtcbiAgICAgICAgICAgIHN0b3Auc2V0QXR0cmlidXRlTlMobnVsbCwgXCJvZmZzZXRcIiwgY29sb3JTdG9wWzBdKTtcbiAgICAgICAgICAgIHN0b3Auc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdG9wLWNvbG9yXCIsIGNvbG9yU3RvcFsxXSk7XG4gICAgICAgICAgICBncmFkaWVudC5hcHBlbmRDaGlsZChzdG9wKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZENoaWxkKGdyYWRpZW50KTtcbiAgICAgICAgICByZXR1cm4gYHVybCgjJHtzaGFkaW5nSWR9KWA7XG4gICAgICAgIGNhc2UgXCJNZXNoXCI6XG4gICAgICAgICAgd2FybihcIlVuaW1wbGVtZW50ZWQgcGF0dGVybiBNZXNoXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjYXNlIFwiRHVtbXlcIjpcbiAgICAgICAgICByZXR1cm4gXCJob3RwaW5rXCI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIElSIHR5cGU6ICR7YXJnc1swXX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXREYXNoKGRhc2hBcnJheSwgZGFzaFBoYXNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQuZGFzaEFycmF5ID0gZGFzaEFycmF5O1xuICAgICAgdGhpcy5jdXJyZW50LmRhc2hQaGFzZSA9IGRhc2hQaGFzZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RQYXRoKG9wcywgYXJncykge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICAgIGxldCB4ID0gY3VycmVudC54LFxuICAgICAgICB5ID0gY3VycmVudC55O1xuICAgICAgbGV0IGQgPSBbXTtcbiAgICAgIGxldCBqID0gMDtcblxuICAgICAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICAgICAgc3dpdGNoIChvcCB8IDApIHtcbiAgICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6XG4gICAgICAgICAgICB4ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgY29uc3QgeHcgPSB4ICsgd2lkdGg7XG4gICAgICAgICAgICBjb25zdCB5aCA9IHkgKyBoZWlnaHQ7XG4gICAgICAgICAgICBkLnB1c2goXG4gICAgICAgICAgICAgIFwiTVwiLFxuICAgICAgICAgICAgICBwZih4KSxcbiAgICAgICAgICAgICAgcGYoeSksXG4gICAgICAgICAgICAgIFwiTFwiLFxuICAgICAgICAgICAgICBwZih4dyksXG4gICAgICAgICAgICAgIHBmKHkpLFxuICAgICAgICAgICAgICBcIkxcIixcbiAgICAgICAgICAgICAgcGYoeHcpLFxuICAgICAgICAgICAgICBwZih5aCksXG4gICAgICAgICAgICAgIFwiTFwiLFxuICAgICAgICAgICAgICBwZih4KSxcbiAgICAgICAgICAgICAgcGYoeWgpLFxuICAgICAgICAgICAgICBcIlpcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm1vdmVUbzpcbiAgICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgICAgZC5wdXNoKFwiTVwiLCBwZih4KSwgcGYoeSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubGluZVRvOlxuICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgICBkLnB1c2goXCJMXCIsIHBmKHgpLCBwZih5KSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvOlxuICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDRdO1xuICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDVdO1xuICAgICAgICAgICAgZC5wdXNoKFxuICAgICAgICAgICAgICBcIkNcIixcbiAgICAgICAgICAgICAgcGYoYXJnc1tqXSksXG4gICAgICAgICAgICAgIHBmKGFyZ3NbaiArIDFdKSxcbiAgICAgICAgICAgICAgcGYoYXJnc1tqICsgMl0pLFxuICAgICAgICAgICAgICBwZihhcmdzW2ogKyAzXSksXG4gICAgICAgICAgICAgIHBmKHgpLFxuICAgICAgICAgICAgICBwZih5KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGogKz0gNjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8yOlxuICAgICAgICAgICAgZC5wdXNoKFxuICAgICAgICAgICAgICBcIkNcIixcbiAgICAgICAgICAgICAgcGYoeCksXG4gICAgICAgICAgICAgIHBmKHkpLFxuICAgICAgICAgICAgICBwZihhcmdzW2pdKSxcbiAgICAgICAgICAgICAgcGYoYXJnc1tqICsgMV0pLFxuICAgICAgICAgICAgICBwZihhcmdzW2ogKyAyXSksXG4gICAgICAgICAgICAgIHBmKGFyZ3NbaiArIDNdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcbiAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcbiAgICAgICAgICAgIGogKz0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8zOlxuICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDJdO1xuICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuICAgICAgICAgICAgZC5wdXNoKFxuICAgICAgICAgICAgICBcIkNcIixcbiAgICAgICAgICAgICAgcGYoYXJnc1tqXSksXG4gICAgICAgICAgICAgIHBmKGFyZ3NbaiArIDFdKSxcbiAgICAgICAgICAgICAgcGYoeCksXG4gICAgICAgICAgICAgIHBmKHkpLFxuICAgICAgICAgICAgICBwZih4KSxcbiAgICAgICAgICAgICAgcGYoeSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBqICs9IDQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6XG4gICAgICAgICAgICBkLnB1c2goXCJaXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZCA9IGQuam9pbihcIiBcIik7XG5cbiAgICAgIGlmIChcbiAgICAgICAgY3VycmVudC5wYXRoICYmXG4gICAgICAgIG9wcy5sZW5ndGggPiAwICYmXG4gICAgICAgIG9wc1swXSAhPT0gT1BTLnJlY3RhbmdsZSAmJlxuICAgICAgICBvcHNbMF0gIT09IE9QUy5tb3ZlVG9cbiAgICAgICkge1xuICAgICAgICAvLyBJZiBhIHBhdGggZG9lcyBub3Qgc3RhcnQgd2l0aCBhbiBPUFMucmVjdGFuZ2xlIG9yIE9QUy5tb3ZlVG8sIGl0IGhhc1xuICAgICAgICAvLyBwcm9iYWJseSBiZWVuIGRpdmlkZWQgaW50byB0d28gT1BTLmNvbnN0cnVjdFBhdGggb3BlcmF0b3JzIGJ5XG4gICAgICAgIC8vIE9wZXJhdG9yTGlzdC4gQXBwZW5kIHRoZSBjb21tYW5kcyB0byB0aGUgcHJldmlvdXMgcGF0aCBlbGVtZW50LlxuICAgICAgICBkID0gY3VycmVudC5wYXRoLmdldEF0dHJpYnV0ZU5TKG51bGwsIFwiZFwiKSArIGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50LnBhdGggPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpwYXRoXCIpO1xuICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKGN1cnJlbnQucGF0aCk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgZCk7XG4gICAgICBjdXJyZW50LnBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwibm9uZVwiKTtcblxuICAgICAgLy8gU2F2aW5nIGEgcmVmZXJlbmNlIGluIGN1cnJlbnQuZWxlbWVudCBzbyB0aGF0IGl0IGNhbiBiZSBhZGRyZXNzZWRcbiAgICAgIC8vIGluICdmaWxsJyBhbmQgJ3N0cm9rZSdcbiAgICAgIGN1cnJlbnQuZWxlbWVudCA9IGN1cnJlbnQucGF0aDtcbiAgICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpO1xuICAgIH1cblxuICAgIGVuZFBhdGgoKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXG4gICAgICAvLyBQYWludGluZyBvcGVyYXRvcnMgZW5kIGEgcGF0aC5cbiAgICAgIGN1cnJlbnQucGF0aCA9IG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWN1cnJlbnQuZWxlbWVudCkge1xuICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgcGF0aCB0byBhIGNsaXBwaW5nIHBhdGguXG4gICAgICBjb25zdCBjbGlwSWQgPSBgY2xpcHBhdGgke2NsaXBDb3VudCsrfWA7XG4gICAgICBjb25zdCBjbGlwUGF0aCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmNsaXBQYXRoXCIpO1xuICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBjbGlwSWQpO1xuICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgcG0odGhpcy50cmFuc2Zvcm1NYXRyaXgpKTtcblxuICAgICAgLy8gQSBkZWVwIGNsb25lIGlzIG5lZWRlZCB3aGVuIHRleHQgaXMgdXNlZCBhcyBhIGNsaXBwaW5nIHBhdGguXG4gICAgICBjb25zdCBjbGlwRWxlbWVudCA9IGN1cnJlbnQuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCA9PT0gXCJldmVub2RkXCIpIHtcbiAgICAgICAgY2xpcEVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xpcEVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXJ1bGVcIiwgXCJub256ZXJvXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICBjbGlwUGF0aC5hcHBlbmRDaGlsZChjbGlwRWxlbWVudCk7XG4gICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQoY2xpcFBhdGgpO1xuXG4gICAgICBpZiAoY3VycmVudC5hY3RpdmVDbGlwVXJsKSB7XG4gICAgICAgIC8vIFRoZSBwcmV2aW91cyBjbGlwcGluZyBncm91cCBjb250ZW50IGNhbiBnbyBvdXQgb2Ygb3JkZXIgLS0gcmVzZXR0aW5nXG4gICAgICAgIC8vIGNhY2hlZCBjbGlwR3JvdXBzLlxuICAgICAgICBjdXJyZW50LmNsaXBHcm91cCA9IG51bGw7XG4gICAgICAgIHRoaXMuZXh0cmFTdGFjay5mb3JFYWNoKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICAgICAgcHJldi5jbGlwR3JvdXAgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gSW50ZXJzZWN0IHdpdGggdGhlIHByZXZpb3VzIGNsaXBwaW5nIHBhdGguXG4gICAgICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY2xpcC1wYXRoXCIsIGN1cnJlbnQuYWN0aXZlQ2xpcFVybCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50LmFjdGl2ZUNsaXBVcmwgPSBgdXJsKCMke2NsaXBJZH0pYDtcblxuICAgICAgdGhpcy50Z3JwID0gbnVsbDtcbiAgICB9XG5cbiAgICBjbGlwKHR5cGUpIHtcbiAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSB0eXBlO1xuICAgIH1cblxuICAgIGNsb3NlUGF0aCgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBpZiAoY3VycmVudC5wYXRoKSB7XG4gICAgICAgIGNvbnN0IGQgPSBgJHtjdXJyZW50LnBhdGguZ2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIpfVpgO1xuICAgICAgICBjdXJyZW50LnBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldExlYWRpbmcobGVhZGluZykge1xuICAgICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZztcbiAgICB9XG5cbiAgICBzZXRUZXh0UmlzZSh0ZXh0UmlzZSkge1xuICAgICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gdGV4dFJpc2U7XG4gICAgfVxuXG4gICAgc2V0VGV4dFJlbmRlcmluZ01vZGUodGV4dFJlbmRlcmluZ01vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IHRleHRSZW5kZXJpbmdNb2RlO1xuICAgIH1cblxuICAgIHNldEhTY2FsZShzY2FsZSkge1xuICAgICAgdGhpcy5jdXJyZW50LnRleHRIU2NhbGUgPSBzY2FsZSAvIDEwMDtcbiAgICB9XG5cbiAgICBzZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KSB7XG4gICAgICAvLyBUaGlzIG9wZXJhdGlvbiBpcyBpZ25vcmVkIHNpbmNlIHdlIGhhdmVuJ3QgZm91bmQgYSB1c2UgY2FzZSBmb3IgaXQgeWV0LlxuICAgIH1cblxuICAgIHNldEZsYXRuZXNzKGZsYXRuZXNzKSB7XG4gICAgICAvLyBUaGlzIG9wZXJhdGlvbiBpcyBpZ25vcmVkIHNpbmNlIHdlIGhhdmVuJ3QgZm91bmQgYSB1c2UgY2FzZSBmb3IgaXQgeWV0LlxuICAgIH1cblxuICAgIHNldEdTdGF0ZShzdGF0ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0YXRlcykge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgIGNhc2UgXCJMV1wiOlxuICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgICB0aGlzLnNldExpbmVDYXAodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkxKXCI6XG4gICAgICAgICAgICB0aGlzLnNldExpbmVKb2luKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJNTFwiOlxuICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgICB0aGlzLnNldERhc2godmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJSSVwiOlxuICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJGb250XCI6XG4gICAgICAgICAgICB0aGlzLnNldEZvbnQodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkNBXCI6XG4gICAgICAgICAgICB0aGlzLnNldFN0cm9rZUFscGhhKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgICAgdGhpcy5zZXRGaWxsQWxwaGEodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHdhcm4oYFVuaW1wbGVtZW50ZWQgZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAke2tleX1gKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlsbCgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50KSB7XG4gICAgICAgIGN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgY3VycmVudC5maWxsQ29sb3IpO1xuICAgICAgICBjdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgY3VycmVudC5maWxsQWxwaGEpO1xuICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdHJva2UoKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudCkge1xuICAgICAgICB0aGlzLl9zZXRTdHJva2VBdHRyaWJ1dGVzKGN1cnJlbnQuZWxlbWVudCk7XG4gICAgICAgIGN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJub25lXCIpO1xuICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9zZXRTdHJva2VBdHRyaWJ1dGVzKGVsZW1lbnQsIGxpbmVXaWR0aFNjYWxlID0gMSkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICAgIGxldCBkYXNoQXJyYXkgPSBjdXJyZW50LmRhc2hBcnJheTtcbiAgICAgIGlmIChsaW5lV2lkdGhTY2FsZSAhPT0gMSAmJiBkYXNoQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICBkYXNoQXJyYXkgPSBkYXNoQXJyYXkubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBsaW5lV2lkdGhTY2FsZSAqIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2VcIiwgY3VycmVudC5zdHJva2VDb2xvcik7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLW9wYWNpdHlcIiwgY3VycmVudC5zdHJva2VBbHBoYSk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLW1pdGVybGltaXRcIiwgcGYoY3VycmVudC5taXRlckxpbWl0KSk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLWxpbmVjYXBcIiwgY3VycmVudC5saW5lQ2FwKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2UtbGluZWpvaW5cIiwgY3VycmVudC5saW5lSm9pbik7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKFxuICAgICAgICBudWxsLFxuICAgICAgICBcInN0cm9rZS13aWR0aFwiLFxuICAgICAgICBwZihsaW5lV2lkdGhTY2FsZSAqIGN1cnJlbnQubGluZVdpZHRoKSArIFwicHhcIlxuICAgICAgKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwic3Ryb2tlLWRhc2hhcnJheVwiLFxuICAgICAgICBkYXNoQXJyYXkubWFwKHBmKS5qb2luKFwiIFwiKVxuICAgICAgKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMoXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwic3Ryb2tlLWRhc2hvZmZzZXRcIixcbiAgICAgICAgcGYobGluZVdpZHRoU2NhbGUgKiBjdXJyZW50LmRhc2hQaGFzZSkgKyBcInB4XCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZW9GaWxsKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudC5lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1ydWxlXCIsIFwiZXZlbm9kZFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsbCgpO1xuICAgIH1cblxuICAgIGZpbGxTdHJva2UoKSB7XG4gICAgICAvLyBPcmRlciBpcyBpbXBvcnRhbnQgc2luY2Ugc3Ryb2tlIHdhbnRzIGZpbGwgdG8gYmUgbm9uZS5cbiAgICAgIC8vIEZpcnN0IHN0cm9rZSwgdGhlbiBpZiBmaWxsIG5lZWRlZCwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgIHRoaXMuc3Ryb2tlKCk7XG4gICAgICB0aGlzLmZpbGwoKTtcbiAgICB9XG5cbiAgICBlb0ZpbGxTdHJva2UoKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50LmVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgY2xvc2VTdHJva2UoKSB7XG4gICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICB9XG5cbiAgICBjbG9zZUZpbGxTdHJva2UoKSB7XG4gICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgY2xvc2VFT0ZpbGxTdHJva2UoKSB7XG4gICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgdGhpcy5lb0ZpbGxTdHJva2UoKTtcbiAgICB9XG5cbiAgICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKSB7XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBcIjFweFwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgXCIxcHhcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0aGlzLmN1cnJlbnQuZmlsbENvbG9yKTtcblxuICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChyZWN0KTtcbiAgICB9XG5cbiAgICBwYWludEltYWdlWE9iamVjdChvYmpJZCkge1xuICAgICAgY29uc3QgaW1nRGF0YSA9IG9iaklkLnN0YXJ0c1dpdGgoXCJnX1wiKVxuICAgICAgICA/IHRoaXMuY29tbW9uT2Jqcy5nZXQob2JqSWQpXG4gICAgICAgIDogdGhpcy5vYmpzLmdldChvYmpJZCk7XG4gICAgICBpZiAoIWltZ0RhdGEpIHtcbiAgICAgICAgd2FybihgRGVwZW5kZW50IGltYWdlIHdpdGggb2JqZWN0IElEICR7b2JqSWR9IGlzIG5vdCByZWFkeSB5ZXRgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKTtcbiAgICB9XG5cbiAgICBwYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhLCBtYXNrKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gICAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcblxuICAgICAgY29uc3QgaW1nU3JjID0gY29udmVydEltZ0RhdGFUb1BuZyhpbWdEYXRhLCB0aGlzLmZvcmNlRGF0YVNjaGVtYSwgISFtYXNrKTtcbiAgICAgIGNvbnN0IGNsaXByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjBcIik7XG4gICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIwXCIpO1xuICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBwZih3aWR0aCkpO1xuICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaGVpZ2h0KSk7XG4gICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGNsaXByZWN0O1xuICAgICAgdGhpcy5jbGlwKFwibm9uemVyb1wiKTtcblxuICAgICAgY29uc3QgaW1nRWwgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzppbWFnZVwiKTtcbiAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKFhMSU5LX05TLCBcInhsaW5rOmhyZWZcIiwgaW1nU3JjKTtcbiAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjBcIik7XG4gICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgcGYoLWhlaWdodCkpO1xuICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBwZih3aWR0aCkgKyBcInB4XCIpO1xuICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaGVpZ2h0KSArIFwicHhcIik7XG4gICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgICAgbnVsbCxcbiAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgYHNjYWxlKCR7cGYoMSAvIHdpZHRoKX0gJHtwZigtMSAvIGhlaWdodCl9KWBcbiAgICAgICk7XG4gICAgICBpZiAobWFzaykge1xuICAgICAgICBtYXNrLmFwcGVuZENoaWxkKGltZ0VsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoaW1nRWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdChpbWdEYXRhKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG4gICAgICBjb25zdCBmaWxsQ29sb3IgPSBjdXJyZW50LmZpbGxDb2xvcjtcblxuICAgICAgY3VycmVudC5tYXNrSWQgPSBgbWFzayR7bWFza0NvdW50Kyt9YDtcbiAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzptYXNrXCIpO1xuICAgICAgbWFzay5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIGN1cnJlbnQubWFza0lkKTtcblxuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjBcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjBcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYod2lkdGgpKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaGVpZ2h0KSk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBmaWxsQ29sb3IpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIm1hc2tcIiwgYHVybCgjJHtjdXJyZW50Lm1hc2tJZH0pYCk7XG5cbiAgICAgIHRoaXMuZGVmcy5hcHBlbmRDaGlsZChtYXNrKTtcbiAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQocmVjdCk7XG5cbiAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSwgbWFzayk7XG4gICAgfVxuXG4gICAgcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0cml4KSAmJiBtYXRyaXgubGVuZ3RoID09PSA2KSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtKFxuICAgICAgICAgIG1hdHJpeFswXSxcbiAgICAgICAgICBtYXRyaXhbMV0sXG4gICAgICAgICAgbWF0cml4WzJdLFxuICAgICAgICAgIG1hdHJpeFszXSxcbiAgICAgICAgICBtYXRyaXhbNF0sXG4gICAgICAgICAgbWF0cml4WzVdXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChiYm94KSB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdO1xuXG4gICAgICAgIGNvbnN0IGNsaXByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIGJib3hbMF0pO1xuICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgYmJveFsxXSk7XG4gICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYod2lkdGgpKTtcbiAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaGVpZ2h0KSk7XG4gICAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gY2xpcHJlY3Q7XG4gICAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG4gICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7fVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5pdGlhbGl6ZSh2aWV3cG9ydCkge1xuICAgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBkZWZpbml0aW9ucyBlbGVtZW50LlxuICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpkZWZzXCIpO1xuICAgICAgc3ZnLmFwcGVuZENoaWxkKGRlZmluaXRpb25zKTtcbiAgICAgIHRoaXMuZGVmcyA9IGRlZmluaXRpb25zO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHJvb3QgZ3JvdXAgZWxlbWVudCwgd2hpY2ggYWN0cyBhIGNvbnRhaW5lciBmb3IgYWxsIG90aGVyXG4gICAgICAvLyBncm91cHMgYW5kIGFwcGxpZXMgdGhlIHZpZXdwb3J0IHRyYW5zZm9ybS5cbiAgICAgIGNvbnN0IHJvb3RHcm91cCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG4gICAgICByb290R3JvdXAuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgcG0odmlld3BvcnQudHJhbnNmb3JtKSk7XG4gICAgICBzdmcuYXBwZW5kQ2hpbGQocm9vdEdyb3VwKTtcblxuICAgICAgLy8gRm9yIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIFNWRyBpbWFnZSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZVxuICAgICAgLy8gcm9vdCBncm91cCwgc28gd2UgZXhwb3NlIGl0IGFzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgU1ZHIGltYWdlIGZvclxuICAgICAgLy8gdGhlIG90aGVyIGNvZGUgaW4gdGhpcyBjbGFzcy5cbiAgICAgIHRoaXMuc3ZnID0gcm9vdEdyb3VwO1xuXG4gICAgICByZXR1cm4gc3ZnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Vuc3VyZUNsaXBHcm91cCgpIHtcbiAgICAgIGlmICghdGhpcy5jdXJyZW50LmNsaXBHcm91cCkge1xuICAgICAgICBjb25zdCBjbGlwR3JvdXAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpnXCIpO1xuICAgICAgICBjbGlwR3JvdXAuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXBhdGhcIiwgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpO1xuICAgICAgICB0aGlzLnN2Zy5hcHBlbmRDaGlsZChjbGlwR3JvdXApO1xuICAgICAgICB0aGlzLmN1cnJlbnQuY2xpcEdyb3VwID0gY2xpcEdyb3VwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC5jbGlwR3JvdXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZW5zdXJlVHJhbnNmb3JtR3JvdXAoKSB7XG4gICAgICBpZiAoIXRoaXMudGdycCkge1xuICAgICAgICB0aGlzLnRncnAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpnXCIpO1xuICAgICAgICB0aGlzLnRncnAuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgcG0odGhpcy50cmFuc2Zvcm1NYXRyaXgpKTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVDbGlwVXJsKSB7XG4gICAgICAgICAgdGhpcy5fZW5zdXJlQ2xpcEdyb3VwKCkuYXBwZW5kQ2hpbGQodGhpcy50Z3JwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN2Zy5hcHBlbmRDaGlsZCh0aGlzLnRncnApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50Z3JwO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IHsgU1ZHR3JhcGhpY3MgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFscyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyAqL1xuXG5pbXBvcnQge1xuICBBYm9ydEV4Y2VwdGlvbixcbiAgYXNzZXJ0LFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyLFxuICB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyxcbn0gZnJvbSBcIi4vbmV0d29ya191dGlscy5qc1wiO1xuXG5pZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMXCIpKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnTW9kdWxlIFwiLi9ub2RlX3N0cmVhbS5qc1wiIHNoYWxsIG5vdCBiZSB1c2VkIHdpdGggTU9aQ0VOVFJBTCBidWlsZHMuJ1xuICApO1xufVxuXG5jb25zdCBmcyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKFwiZnNcIik7XG5jb25zdCBodHRwID0gX19ub25fd2VicGFja19yZXF1aXJlX18oXCJodHRwXCIpO1xuY29uc3QgaHR0cHMgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhcImh0dHBzXCIpO1xuY29uc3QgdXJsID0gX19ub25fd2VicGFja19yZXF1aXJlX18oXCJ1cmxcIik7XG5cbmNvbnN0IGZpbGVVcmlSZWdleCA9IC9eZmlsZTpcXC9cXC9cXC9bYS16QS1aXTpcXC8vO1xuXG5mdW5jdGlvbiBwYXJzZVVybChzb3VyY2VVcmwpIHtcbiAgY29uc3QgcGFyc2VkVXJsID0gdXJsLnBhcnNlKHNvdXJjZVVybCk7XG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09IFwiZmlsZTpcIiB8fCBwYXJzZWRVcmwuaG9zdCkge1xuICAgIHJldHVybiBwYXJzZWRVcmw7XG4gIH1cbiAgLy8gUHJlcGVuZGluZyAnZmlsZTovLy8nIHRvIFdpbmRvd3MgYWJzb2x1dGUgcGF0aC5cbiAgaWYgKC9eW2Etel06Wy9cXFxcXS9pLnRlc3Qoc291cmNlVXJsKSkge1xuICAgIHJldHVybiB1cmwucGFyc2UoYGZpbGU6Ly8vJHtzb3VyY2VVcmx9YCk7XG4gIH1cbiAgLy8gQ2hhbmdlcyBwcm90b2NvbCB0byAnZmlsZTonIGlmIHVybCByZWZlcnMgdG8gZmlsZXN5c3RlbS5cbiAgaWYgKCFwYXJzZWRVcmwuaG9zdCkge1xuICAgIHBhcnNlZFVybC5wcm90b2NvbCA9IFwiZmlsZTpcIjtcbiAgfVxuICByZXR1cm4gcGFyc2VkVXJsO1xufVxuXG5jbGFzcyBQREZOb2RlU3RyZWFtIHtcbiAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy51cmwgPSBwYXJzZVVybChzb3VyY2UudXJsKTtcbiAgICB0aGlzLmlzSHR0cCA9XG4gICAgICB0aGlzLnVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHRoaXMudXJsLnByb3RvY29sID09PSBcImh0dHBzOlwiO1xuICAgIC8vIENoZWNrIGlmIHVybCByZWZlcnMgdG8gZmlsZXN5c3RlbS5cbiAgICB0aGlzLmlzRnNVcmwgPSB0aGlzLnVybC5wcm90b2NvbCA9PT0gXCJmaWxlOlwiO1xuICAgIHRoaXMuaHR0cEhlYWRlcnMgPSAodGhpcy5pc0h0dHAgJiYgc291cmNlLmh0dHBIZWFkZXJzKSB8fCB7fTtcblxuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107XG4gIH1cblxuICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPyB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5fbG9hZGVkIDogMDtcbiAgfVxuXG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLFxuICAgICAgXCJQREZOb2RlU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCJcbiAgICApO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcy5pc0ZzVXJsXG4gICAgICA/IG5ldyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyKHRoaXMpXG4gICAgICA6IG5ldyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlcih0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gIH1cblxuICBnZXRSYW5nZVJlYWRlcihzdGFydCwgZW5kKSB7XG4gICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMuaXNGc1VybFxuICAgICAgPyBuZXcgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIodGhpcywgc3RhcnQsIGVuZClcbiAgICAgIDogbmV3IFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmFuZ2VSZWFkZXIpO1xuICAgIHJldHVybiByYW5nZVJlYWRlcjtcbiAgfVxuXG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikge1xuICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZGVycyA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCk7XG4gICAgcmVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChyZWFkZXIpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBCYXNlRnVsbFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7IC8vIG9wdGlvbmFsXG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG5cbiAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7XG5cbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgfVxuXG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG5cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cblxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuXG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cblxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcbiAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7XG4gICAgICB0aGlzLm9uUHJvZ3Jlc3Moe1xuICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCxcbiAgICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gRW5zdXJlIHRoYXQgYHJlYWQoKWAgbWV0aG9kIHJldHVybnMgQXJyYXlCdWZmZXIuXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcbiAgICByZXR1cm4geyB2YWx1ZTogYnVmZmVyLCBkb25lOiBmYWxzZSB9O1xuICB9XG5cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIC8vIENhbGwgYHRoaXMuX2Vycm9yKClgIG1ldGhvZCB3aGVuIGNhbmNlbCBpcyBjYWxsZWRcbiAgICAvLyBiZWZvcmUgX3JlYWRhYmxlU3RyZWFtIGlzIHNldC5cbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RyZWFtKSB7XG4gICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHJlYXNvbik7XG4gIH1cblxuICBfZXJyb3IocmVhc29uKSB7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgX3NldFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcblxuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgIC8vIERlc3Ryb3kgcmVhZGFibGUgdG8gbWluaW1pemUgcmVzb3VyY2UgdXNhZ2UuXG4gICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcblxuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHN0b3AgcmVhZGluZyB3aGVuIHJhbmdlIGlzIHN1cHBvcnRlZCBhbmQgc3RyZWFtaW5nIGlzXG4gICAgLy8gZGlzYWJsZWQuXG4gICAgaWYgKCF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICB0aGlzLl9lcnJvcihuZXcgQWJvcnRFeGNlcHRpb24oXCJzdHJlYW1pbmcgaXMgZGlzYWJsZWRcIikpO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgUmVhZGFibGVTdHJlYW0gaWYgYWxyZWFkeSBpbiBlcnJvcmVkIHN0YXRlLlxuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEJhc2VSYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICB9XG5cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpO1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZCgpO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsubGVuZ3RoO1xuICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMub25Qcm9ncmVzcyh7IGxvYWRlZDogdGhpcy5fbG9hZGVkIH0pO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhhdCBgcmVhZCgpYCBtZXRob2QgcmV0dXJucyBBcnJheUJ1ZmZlci5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShjaHVuaykuYnVmZmVyO1xuICAgIHJldHVybiB7IHZhbHVlOiBidWZmZXIsIGRvbmU6IGZhbHNlIH07XG4gIH1cblxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgLy8gQ2FsbCBgdGhpcy5fZXJyb3IoKWAgbWV0aG9kIHdoZW4gY2FuY2VsIGlzIGNhbGxlZFxuICAgIC8vIGJlZm9yZSBfcmVhZGFibGVTdHJlYW0gaXMgc2V0LlxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTtcbiAgfVxuXG4gIF9lcnJvcihyZWFzb24pIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cblxuICBfc2V0UmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtO1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgLy8gRGVzdHJveSByZWFkYWJsZVN0cmVhbSB0byBtaW5pbWl6ZSByZXNvdXJjZSB1c2FnZS5cbiAgICAgIHJlYWRhYmxlU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICB9KTtcblxuICAgIC8vIERlc3Ryb3kgcmVhZGFibGVTdHJlYW0gaWYgYWxyZWFkeSBpbiBlcnJvcmVkIHN0YXRlLlxuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RPcHRpb25zKHBhcnNlZFVybCwgaGVhZGVycykge1xuICByZXR1cm4ge1xuICAgIHByb3RvY29sOiBwYXJzZWRVcmwucHJvdG9jb2wsXG4gICAgYXV0aDogcGFyc2VkVXJsLmF1dGgsXG4gICAgaG9zdDogcGFyc2VkVXJsLmhvc3RuYW1lLFxuICAgIHBvcnQ6IHBhcnNlZFVybC5wb3J0LFxuICAgIHBhdGg6IHBhcnNlZFVybC5wYXRoLFxuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBoZWFkZXJzLFxuICB9O1xufVxuXG5jbGFzcyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlciBleHRlbmRzIEJhc2VGdWxsUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgc3VwZXIoc3RyZWFtKTtcblxuICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gcmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiBcIiR7dGhpcy5fdXJsfVwiLmApO1xuICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuICAgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShyZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGhlYWRlcnMgbmFtZSBhcmUgaW4gbG93ZXIgY2FzZSwgYXMgbWVudGlvbmVkXG4gICAgICAgIC8vIGhlcmU6IGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzLlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdHJlYW0uaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuICAgICAgICBzdWdnZXN0ZWRMZW5ndGgsXG4gICAgICB9ID0gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICAgICAgICBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgaXNIdHRwOiBzdHJlYW0uaXNIdHRwLFxuICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBhbGxvd1JhbmdlUmVxdWVzdHM7XG4gICAgICAvLyBTZXR0aW5nIHJpZ2h0IGNvbnRlbnQgbGVuZ3RoLlxuICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuXG4gICAgICB0aGlzLl9maWxlbmFtZSA9IGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgIH07XG5cbiAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5fdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwLnJlcXVlc3QoXG4gICAgICAgIGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSxcbiAgICAgICAgaGFuZGxlUmVzcG9uc2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KFxuICAgICAgICBjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHN0cmVhbS5odHRwSGVhZGVycyksXG4gICAgICAgIGhhbmRsZVJlc3BvbnNlXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcXVlc3Qub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICB9KTtcbiAgICAvLyBOb3RlOiBgcmVxdWVzdC5lbmQoZGF0YSlgIGlzIHVzZWQgdG8gd3JpdGUgYGRhdGFgIHRvIHJlcXVlc3QgYm9keVxuICAgIC8vIGFuZCBub3RpZnkgZW5kIG9mIHJlcXVlc3QuIEJ1dCBvbmUgc2hvdWxkIGFsd2F5cyBjYWxsIGByZXF1ZXN0LmVuZCgpYFxuICAgIC8vIGV2ZW4gaWYgdGhlcmUgaXMgbm8gZGF0YSB0byB3cml0ZSAtLSAodG8gbm90aWZ5IHRoZSBlbmQgb2YgcmVxdWVzdCkuXG4gICAgdGhpcy5fcmVxdWVzdC5lbmQoKTtcbiAgfVxufVxuXG5jbGFzcyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIHN0YXJ0LCBlbmQpIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuXG4gICAgdGhpcy5faHR0cEhlYWRlcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHN0cmVhbS5odHRwSGVhZGVycykge1xuICAgICAgY29uc3QgdmFsdWUgPSBzdHJlYW0uaHR0cEhlYWRlcnNbcHJvcGVydHldO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2h0dHBIZWFkZXJzW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9odHRwSGVhZGVycy5SYW5nZSA9IGBieXRlcz0ke3N0YXJ0fS0ke2VuZCAtIDF9YDtcblxuICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gcmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiBcIiR7dGhpcy5fdXJsfVwiLmApO1xuICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShyZXNwb25zZSk7XG4gICAgfTtcblxuICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgIGlmICh0aGlzLl91cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIikge1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChcbiAgICAgICAgY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksXG4gICAgICAgIGhhbmRsZVJlc3BvbnNlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdChcbiAgICAgICAgY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksXG4gICAgICAgIGhhbmRsZVJlc3BvbnNlXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcXVlc3Qub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdC5lbmQoKTtcbiAgfVxufVxuXG5jbGFzcyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuXG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBleHRyYSBzbGFzaCB0byBnZXQgcmlnaHQgcGF0aCBmcm9tIHVybCBsaWtlIGBmaWxlOi8vL0M6L2BcbiAgICBpZiAoZmlsZVVyaVJlZ2V4LnRlc3QodGhpcy5fdXJsLmhyZWYpKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG4gICAgfVxuXG4gICAgZnMubHN0YXQocGF0aCwgKGVycm9yLCBzdGF0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiBcIiR7cGF0aH1cIi5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuICAgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTZXR0aW5nIHJpZ2h0IGNvbnRlbnQgbGVuZ3RoLlxuICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN0YXQuc2l6ZTtcblxuICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoKSk7XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIHN0YXJ0LCBlbmQpIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuXG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBleHRyYSBzbGFzaCB0byBnZXQgcmlnaHQgcGF0aCBmcm9tIHVybCBsaWtlIGBmaWxlOi8vL0M6L2BcbiAgICBpZiAoZmlsZVVyaVJlZ2V4LnRlc3QodGhpcy5fdXJsLmhyZWYpKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLCB7IHN0YXJ0LCBlbmQ6IGVuZCAtIDEgfSkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBERk5vZGVTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIE1pc3NpbmdQREZFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIgfSBmcm9tIFwiLi9jb250ZW50X2Rpc3Bvc2l0aW9uLmpzXCI7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcbiAgZ2V0UmVzcG9uc2VIZWFkZXIsXG4gIGlzSHR0cCxcbiAgcmFuZ2VDaHVua1NpemUsXG4gIGRpc2FibGVSYW5nZSxcbn0pIHtcbiAgYXNzZXJ0KHJhbmdlQ2h1bmtTaXplID4gMCwgXCJSYW5nZSBjaHVuayBzaXplIG11c3QgYmUgbGFyZ2VyIHRoYW4gemVyb1wiKTtcbiAgY29uc3QgcmV0dXJuVmFsdWVzID0ge1xuICAgIGFsbG93UmFuZ2VSZXF1ZXN0czogZmFsc2UsXG4gICAgc3VnZ2VzdGVkTGVuZ3RoOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKSwgMTApO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cblxuICByZXR1cm5WYWx1ZXMuc3VnZ2VzdGVkTGVuZ3RoID0gbGVuZ3RoO1xuXG4gIGlmIChsZW5ndGggPD0gMiAqIHJhbmdlQ2h1bmtTaXplKSB7XG4gICAgLy8gVGhlIGZpbGUgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHNpemUgb2YgdHdvIGNodW5rcywgc28gaXQgZG9lcyBub3RcbiAgICAvLyBtYWtlIGFueSBzZW5zZSB0byBhYm9ydCB0aGUgcmVxdWVzdCBhbmQgcmV0cnkgd2l0aCBhIHJhbmdlIHJlcXVlc3QuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuXG4gIGlmIChkaXNhYmxlUmFuZ2UgfHwgIWlzSHR0cCkge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cbiAgaWYgKGdldFJlc3BvbnNlSGVhZGVyKFwiQWNjZXB0LVJhbmdlc1wiKSAhPT0gXCJieXRlc1wiKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRFbmNvZGluZyA9IGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1FbmNvZGluZ1wiKSB8fCBcImlkZW50aXR5XCI7XG4gIGlmIChjb250ZW50RW5jb2RpbmcgIT09IFwiaWRlbnRpdHlcIikge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cblxuICByZXR1cm5WYWx1ZXMuYWxsb3dSYW5nZVJlcXVlc3RzID0gdHJ1ZTtcbiAgcmV0dXJuIHJldHVyblZhbHVlcztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcikge1xuICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSBnZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtRGlzcG9zaXRpb25cIik7XG4gIGlmIChjb250ZW50RGlzcG9zaXRpb24pIHtcbiAgICBsZXQgZmlsZW5hbWUgPSBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIoY29udGVudERpc3Bvc2l0aW9uKTtcbiAgICBpZiAoZmlsZW5hbWUuaW5jbHVkZXMoXCIlXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmaWxlbmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSk7XG4gICAgICB9IGNhdGNoIChleCkge31cbiAgICB9XG4gICAgaWYgKC9cXC5wZGYkL2kudGVzdChmaWxlbmFtZSkpIHtcbiAgICAgIHJldHVybiBmaWxlbmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB1cmwpIHtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IChzdGF0dXMgPT09IDAgJiYgdXJsLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkpIHtcbiAgICByZXR1cm4gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGIFwiJyArIHVybCArICdcIi4nKTtcbiAgfVxuICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihcbiAgICBcIlVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlIChcIiArXG4gICAgICBzdGF0dXMgK1xuICAgICAgJykgd2hpbGUgcmV0cmlldmluZyBQREYgXCInICtcbiAgICAgIHVybCArXG4gICAgICAnXCIuJyxcbiAgICBzdGF0dXNcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhzdGF0dXMpIHtcbiAgcmV0dXJuIHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2O1xufVxuXG5leHBvcnQge1xuICBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yLFxuICBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyLFxuICB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyxcbiAgdmFsaWRhdGVSZXNwb25zZVN0YXR1cyxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNyBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gVGhpcyBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIgZnVuY3Rpb24gaXMgYWRhcHRlZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vUm9iLS1XL29wZW4taW4tYnJvd3Nlci9ibG9iLzdlMmUzNWEzOGI4YjRlOTgxYjExZGE3YjJmMDFkZjAxNDkwNDllOTIvZXh0ZW5zaW9uL2NvbnRlbnQtZGlzcG9zaXRpb24uanNcbi8vIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2VzOlxuLy8gLSBNb2RpZmllZCB0byBjb25mb3JtIHRvIFBERi5qcydzIGNvZGluZyBzdHlsZS5cbi8vIC0gU3VwcG9ydCBVVEYtOCBkZWNvZGluZyB3aGVuIFRleHREZWNvZGVyIGlzIHVuc3VwcG9ydGVkLlxuLy8gLSBNb3ZlIHJldHVybiB0byB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiB0byBwcmV2ZW50IEJhYmVsIGZyb20gZHJvcHBpbmcgdGhlXG4vLyAgIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy5cblxuLyoqXG4gKiBFeHRyYWN0IGZpbGUgbmFtZSBmcm9tIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50RGlzcG9zaXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZpbGVuYW1lLCBpZiBmb3VuZCBpbiB0aGUgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIuXG4gKi9cbmZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcihjb250ZW50RGlzcG9zaXRpb24pIHtcbiAgbGV0IG5lZWRzRW5jb2RpbmdGaXh1cCA9IHRydWU7XG5cbiAgLy8gZmlsZW5hbWUqPWV4dC12YWx1ZSAoXCJleHQtdmFsdWVcIiBmcm9tIFJGQyA1OTg3LCByZWZlcmVuY2VkIGJ5IFJGQyA2MjY2KS5cbiAgbGV0IHRtcCA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqXCIsIFwiaVwiKS5leGVjKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICB0bXAgPSB0bXBbMV07XG4gICAgbGV0IGZpbGVuYW1lID0gcmZjMjYxNnVucXVvdGUodG1wKTtcbiAgICBmaWxlbmFtZSA9IHVuZXNjYXBlKGZpbGVuYW1lKTtcbiAgICBmaWxlbmFtZSA9IHJmYzU5ODdkZWNvZGUoZmlsZW5hbWUpO1xuICAgIGZpbGVuYW1lID0gcmZjMjA0N2RlY29kZShmaWxlbmFtZSk7XG4gICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpO1xuICB9XG5cbiAgLy8gQ29udGludWF0aW9ucyAoUkZDIDIyMzEgc2VjdGlvbiAzLCByZWZlcmVuY2VkIGJ5IFJGQyA1OTg3IHNlY3Rpb24gMy4xKS5cbiAgLy8gZmlsZW5hbWUqbio9cGFydFxuICAvLyBmaWxlbmFtZSpuPXBhcnRcbiAgdG1wID0gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICAvLyBSRkMgMjA0Nywgc2VjdGlvblxuICAgIGNvbnN0IGZpbGVuYW1lID0gcmZjMjA0N2RlY29kZSh0bXApO1xuICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTtcbiAgfVxuXG4gIC8vIGZpbGVuYW1lPXZhbHVlIChSRkMgNTk4Nywgc2VjdGlvbiA0LjEpLlxuICB0bXAgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcIiwgXCJpXCIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcbiAgaWYgKHRtcCkge1xuICAgIHRtcCA9IHRtcFsxXTtcbiAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApO1xuICAgIGZpbGVuYW1lID0gcmZjMjA0N2RlY29kZShmaWxlbmFtZSk7XG4gICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpO1xuICB9XG5cbiAgLy8gQWZ0ZXIgdGhpcyBsaW5lIHRoZXJlIGFyZSBvbmx5IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gV2UgY2Fubm90IHB1dFxuICAvLyBcInJldHVyblwiIGhlcmUgZm9yIHJlYWRhYmlsaXR5IGJlY2F1c2UgYmFiZWwgd291bGQgdGhlbiBkcm9wIHRoZSBmdW5jdGlvblxuICAvLyBkZWNsYXJhdGlvbnMuLi5cbiAgZnVuY3Rpb24gdG9QYXJhbVJlZ0V4cChhdHRyaWJ1dGVQYXR0ZXJuLCBmbGFncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgXCIoPzpefDspXFxcXHMqXCIgK1xuICAgICAgICBhdHRyaWJ1dGVQYXR0ZXJuICtcbiAgICAgICAgXCJcXFxccyo9XFxcXHMqXCIgK1xuICAgICAgICAvLyBDYXB0dXJlczogdmFsdWUgPSB0b2tlbiB8IHF1b3RlZC1zdHJpbmdcbiAgICAgICAgLy8gKFJGQyAyNjE2LCBzZWN0aW9uIDMuNiBhbmQgcmVmZXJlbmNlZCBieSBSRkMgNjI2NiA0LjEpXG4gICAgICAgIFwiKFwiICtcbiAgICAgICAgJ1teXCI7XFxcXHNdW147XFxcXHNdKicgK1xuICAgICAgICBcInxcIiArXG4gICAgICAgICdcIig/OlteXCJcXFxcXFxcXF18XFxcXFxcXFxcIj8pK1wiPycgK1xuICAgICAgICBcIilcIixcbiAgICAgIGZsYWdzXG4gICAgKTtcbiAgfVxuICBmdW5jdGlvbiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSkge1xuICAgIGlmIChlbmNvZGluZykge1xuICAgICAgaWYgKCEvXltcXHgwMC1cXHhGRl0rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywgeyBmYXRhbDogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBBcnJheS5mcm9tKHZhbHVlLCBmdW5jdGlvbiAoY2gpIHtcbiAgICAgICAgICByZXR1cm4gY2guY2hhckNvZGVBdCgwKSAmIDB4ZmY7XG4gICAgICAgIH0pO1xuICAgICAgICB2YWx1ZSA9IGRlY29kZXIuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7XG4gICAgICAgIG5lZWRzRW5jb2RpbmdGaXh1cCA9IGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUZXh0RGVjb2RlciBjb25zdHJ1Y3RvciB0aHJldyAtIHVucmVjb2duaXplZCBlbmNvZGluZy5cbiAgICAgICAgLy8gT3IgVGV4dERlY29kZXIgQVBJIGlzIG5vdCBhdmFpbGFibGUgKGluIElFIC8gRWRnZSkuXG4gICAgICAgIGlmICgvXnV0Zi0/OCQvaS50ZXN0KGVuY29kaW5nKSkge1xuICAgICAgICAgIC8vIFVURi04IGlzIGNvbW1vbmx5IHVzZWQsIHRyeSB0byBzdXBwb3J0IGl0IGluIGFub3RoZXIgd2F5OlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUodmFsdWUpKTtcbiAgICAgICAgICAgIG5lZWRzRW5jb2RpbmdGaXh1cCA9IGZhbHNlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gZml4dXBFbmNvZGluZyh2YWx1ZSkge1xuICAgIGlmIChuZWVkc0VuY29kaW5nRml4dXAgJiYgL1tcXHg4MC1cXHhmZl0vLnRlc3QodmFsdWUpKSB7XG4gICAgICAvLyBNYXliZSBtdWx0aS1ieXRlIFVURi04LlxuICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKFwidXRmLThcIiwgdmFsdWUpO1xuICAgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCkge1xuICAgICAgICAvLyBUcnkgaXNvLTg4NTktMSBlbmNvZGluZy5cbiAgICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKFwiaXNvLTg4NTktMVwiLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiByZmMyMjMxZ2V0cGFyYW0oY29udGVudERpc3Bvc2l0aW9uU3RyKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGxldCBtYXRjaDtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGZpbGVuYW1lKm49IGFuZCBmaWxlbmFtZSpuKj0gd2l0aCBuIGJlaW5nIGFuIGludGVnZXJcbiAgICAvLyBvZiBhdCBsZWFzdCB6ZXJvLiBBbnkgbm9uLXplcm8gbnVtYmVyIG11c3Qgbm90IHN0YXJ0IHdpdGggJzAnLlxuICAgIGNvbnN0IGl0ZXIgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcXFxcKigoPyEwXFxcXGQpXFxcXGQrKShcXFxcKj8pXCIsIFwiaWdcIik7XG4gICAgd2hpbGUgKChtYXRjaCA9IGl0ZXIuZXhlYyhjb250ZW50RGlzcG9zaXRpb25TdHIpKSAhPT0gbnVsbCkge1xuICAgICAgbGV0IFssIG4sIHF1b3QsIHBhcnRdID0gbWF0Y2g7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICBuID0gcGFyc2VJbnQobiwgMTApO1xuICAgICAgaWYgKG4gaW4gbWF0Y2hlcykge1xuICAgICAgICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgdGhlIGludmFsaWQgc2Vjb25kIGZpbGVuYW1lKjAuXG4gICAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBtYXRjaGVzW25dID0gW3F1b3QsIHBhcnRdO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbWF0Y2hlcy5sZW5ndGg7ICsrbikge1xuICAgICAgaWYgKCEobiBpbiBtYXRjaGVzKSkge1xuICAgICAgICAvLyBOdW1iZXJzIG11c3QgYmUgY29uc2VjdXRpdmUuIFRydW5jYXRlIHdoZW4gdGhlcmUgaXMgYSBob2xlLlxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGxldCBbcXVvdCwgcGFydF0gPSBtYXRjaGVzW25dOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1jb25zdFxuICAgICAgcGFydCA9IHJmYzI2MTZ1bnF1b3RlKHBhcnQpO1xuICAgICAgaWYgKHF1b3QpIHtcbiAgICAgICAgcGFydCA9IHVuZXNjYXBlKHBhcnQpO1xuICAgICAgICBpZiAobiA9PT0gMCkge1xuICAgICAgICAgIHBhcnQgPSByZmM1OTg3ZGVjb2RlKHBhcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbihcIlwiKTtcbiAgfVxuICBmdW5jdGlvbiByZmMyNjE2dW5xdW90ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNsaWNlKDEpLnNwbGl0KCdcXFxcXCInKTtcbiAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IHVuZXNjYXBlZCBcIiBhbmQgdGVybWluYXRlIHRoZXJlLlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBxdW90aW5kZXggPSBwYXJ0c1tpXS5pbmRleE9mKCdcIicpO1xuICAgICAgICBpZiAocXVvdGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0uc2xpY2UoMCwgcXVvdGluZGV4KTtcbiAgICAgICAgICBwYXJ0cy5sZW5ndGggPSBpICsgMTsgLy8gVHJ1bmNhdGVzIGFuZCBzdG9wIHRoZSBpdGVyYXRpb24uXG4gICAgICAgIH1cbiAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5yZXBsYWNlKC9cXFxcKC4pL2csIFwiJDFcIik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHBhcnRzLmpvaW4oJ1wiJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiByZmM1OTg3ZGVjb2RlKGV4dHZhbHVlKSB7XG4gICAgLy8gRGVjb2RlcyBcImV4dC12YWx1ZVwiIGZyb20gUkZDIDU5ODcuXG4gICAgY29uc3QgZW5jb2RpbmdlbmQgPSBleHR2YWx1ZS5pbmRleE9mKFwiJ1wiKTtcbiAgICBpZiAoZW5jb2RpbmdlbmQgPT09IC0xKSB7XG4gICAgICAvLyBTb21lIHNlcnZlcnMgc2VuZCBcImZpbGVuYW1lKj1cIiB3aXRob3V0IGVuY29kaW5nICdsYW5ndWFnZScgcHJlZml4LFxuICAgICAgLy8gZS5nLiBpbiBodHRwczovL2dpdGh1Yi5jb20vUm9iLS1XL29wZW4taW4tYnJvd3Nlci9pc3N1ZXMvMjZcbiAgICAgIC8vIExldCdzIGFjY2VwdCB0aGUgdmFsdWUgbGlrZSBGaXJlZm94ICg1NykgKENocm9tZSA2MiByZWplY3RzIGl0KS5cbiAgICAgIHJldHVybiBleHR2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgZW5jb2RpbmcgPSBleHR2YWx1ZS5zbGljZSgwLCBlbmNvZGluZ2VuZCk7XG4gICAgY29uc3QgbGFuZ3ZhbHVlID0gZXh0dmFsdWUuc2xpY2UoZW5jb2RpbmdlbmQgKyAxKTtcbiAgICAvLyBJZ25vcmUgbGFuZ3VhZ2UgKFJGQyA1OTg3IHNlY3Rpb24gMy4yLjEsIGFuZCBSRkMgNjI2NiBzZWN0aW9uIDQuMSApLlxuICAgIGNvbnN0IHZhbHVlID0gbGFuZ3ZhbHVlLnJlcGxhY2UoL15bXiddKicvLCBcIlwiKTtcbiAgICByZXR1cm4gdGV4dGRlY29kZShlbmNvZGluZywgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzIwNDdkZWNvZGUodmFsdWUpIHtcbiAgICAvLyBSRkMgMjA0Ny1kZWNvZGUgdGhlIHJlc3VsdC4gRmlyZWZveCB0cmllZCB0byBkcm9wIHN1cHBvcnQgZm9yIGl0LCBidXRcbiAgICAvLyBiYWNrZWQgb3V0IGJlY2F1c2Ugc29tZSBzZXJ2ZXJzIHVzZSBpdCAtIGh0dHBzOi8vYnVnemlsLmxhLzg3NTYxNVxuICAgIC8vIEZpcmVmb3gncyBjb25kaXRpb24gZm9yIGRlY29kaW5nIGlzIGhlcmU6IGh0dHBzOi8vc2VhcmNoZm94Lm9yZy9tb3ppbGxhLWNlbnRyYWwvcmV2LzRhNTkwYTVhMTVlMzVkODhhM2IyM2RkNmFjM2M0NzFjZjg1YjA0YTgvbmV0d2Vyay9taW1lL25zTUlNRUhlYWRlclBhcmFtSW1wbC5jcHAjNzQyLTc0OFxuXG4gICAgLy8gV2UgYXJlIG1vcmUgc3RyaWN0IGFuZCBvbmx5IHJlY29nbml6ZSBSRkMgMjA0Ny1lbmNvZGluZyBpZiB0aGUgdmFsdWVcbiAgICAvLyBzdGFydHMgd2l0aCBcIj0/XCIsIHNpbmNlIHRoZW4gaXQgaXMgbGlrZWx5IHRoYXQgdGhlIGZ1bGwgdmFsdWUgaXNcbiAgICAvLyBSRkMgMjA0Ny1lbmNvZGVkLlxuXG4gICAgLy8gRmlyZWZveCBhbHNvIGRlY29kZXMgd29yZHMgZXZlbiB3aGVyZSBSRkMgMjA0NyBzZWN0aW9uIDUgc3RhdGVzOlxuICAgIC8vIFwiQW4gJ2VuY29kZWQtd29yZCcgTVVTVCBOT1QgYXBwZWFyIHdpdGhpbiBhICdxdW90ZWQtc3RyaW5nJy5cIlxuICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChcIj0/XCIpIHx8IC9bXFx4MDAtXFx4MTlcXHg4MC1cXHhmZl0vLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8vIFJGQyAyMDQ3LCBzZWN0aW9uIDIuNFxuICAgIC8vIGVuY29kZWQtd29yZCA9IFwiPT9cIiBjaGFyc2V0IFwiP1wiIGVuY29kaW5nIFwiP1wiIGVuY29kZWQtdGV4dCBcIj89XCJcbiAgICAvLyBjaGFyc2V0ID0gdG9rZW4gKGJ1dCBsZXQncyByZXN0cmljdCB0byBjaGFyYWN0ZXJzIHRoYXQgZGVub3RlIGFcbiAgICAvLyAgICAgICBwb3NzaWJseSB2YWxpZCBlbmNvZGluZykuXG4gICAgLy8gZW5jb2RpbmcgPSBxIG9yIGJcbiAgICAvLyBlbmNvZGVkLXRleHQgPSBhbnkgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlciBvdGhlciB0aGFuID8gb3Igc3BhY2UuXG4gICAgLy8gICAgICAgIC4uLiBidXQgRmlyZWZveCBwZXJtaXRzID8gYW5kIHNwYWNlLlxuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKFxuICAgICAgLz1cXD8oW1xcdy1dKilcXD8oW1FxQmJdKVxcPygoPzpbXj9dfFxcPyg/IT0pKSopXFw/PS9nLFxuICAgICAgZnVuY3Rpb24gKG1hdGNoZXMsIGNoYXJzZXQsIGVuY29kaW5nLCB0ZXh0KSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gXCJxXCIgfHwgZW5jb2RpbmcgPT09IFwiUVwiKSB7XG4gICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA0LjIuXG4gICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXy9nLCBcIiBcIik7XG4gICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPShbMC05YS1mQS1GXXsyfSkvZywgZnVuY3Rpb24gKG1hdGNoLCBoZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTtcbiAgICAgICAgfSAvLyBlbHNlIGVuY29kaW5nIGlzIGIgb3IgQiAtIGJhc2U2NCAoUkZDIDIwNDcgc2VjdGlvbiA0LjEpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGV4dCA9IGF0b2IodGV4dCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKGNoYXJzZXQsIHRleHQpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gXCJcIjtcbn1cblxuZXhwb3J0IHsgZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7XG4gIGFzc2VydCxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG4gIHN0cmluZ1RvQnl0ZXMsXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcixcbiAgZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcixcbiAgdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMsXG59IGZyb20gXCIuL25ldHdvcmtfdXRpbHMuanNcIjtcblxuaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTFwiKSkge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ01vZHVsZSBcIi4vbmV0d29yay5qc1wiIHNoYWxsIG5vdCBiZSB1c2VkIHdpdGggTU9aQ0VOVFJBTCBidWlsZHMuJ1xuICApO1xufVxuXG5jb25zdCBPS19SRVNQT05TRSA9IDIwMDtcbmNvbnN0IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRSA9IDIwNjtcblxuZnVuY3Rpb24gZ2V0QXJyYXlCdWZmZXIoeGhyKSB7XG4gIGNvbnN0IGRhdGEgPSB4aHIucmVzcG9uc2U7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0IGFycmF5ID0gc3RyaW5nVG9CeXRlcyhkYXRhKTtcbiAgcmV0dXJuIGFycmF5LmJ1ZmZlcjtcbn1cblxuY2xhc3MgTmV0d29ya01hbmFnZXIge1xuICBjb25zdHJ1Y3Rvcih1cmwsIGFyZ3MpIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICBhcmdzID0gYXJncyB8fCB7fTtcbiAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3QodXJsKTtcbiAgICB0aGlzLmh0dHBIZWFkZXJzID0gKHRoaXMuaXNIdHRwICYmIGFyZ3MuaHR0cEhlYWRlcnMpIHx8IHt9O1xuICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gYXJncy53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG4gICAgdGhpcy5nZXRYaHIgPVxuICAgICAgYXJncy5nZXRYaHIgfHxcbiAgICAgIGZ1bmN0aW9uIE5ldHdvcmtNYW5hZ2VyX2dldFhocigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgfTtcblxuICAgIHRoaXMuY3VyclhocklkID0gMDtcbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCwgbGlzdGVuZXJzKSB7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIGJlZ2luLFxuICAgICAgZW5kLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBwcm9wIGluIGxpc3RlbmVycykge1xuICAgICAgYXJnc1twcm9wXSA9IGxpc3RlbmVyc1twcm9wXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChhcmdzKTtcbiAgfVxuXG4gIHJlcXVlc3RGdWxsKGxpc3RlbmVycykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobGlzdGVuZXJzKTtcbiAgfVxuXG4gIHJlcXVlc3QoYXJncykge1xuICAgIGNvbnN0IHhociA9IHRoaXMuZ2V0WGhyKCk7XG4gICAgY29uc3QgeGhySWQgPSB0aGlzLmN1cnJYaHJJZCsrO1xuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gKHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXSA9IHtcbiAgICAgIHhocixcbiAgICB9KTtcblxuICAgIHhoci5vcGVuKFwiR0VUXCIsIHRoaXMudXJsKTtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmh0dHBIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaHR0cEhlYWRlcnNbcHJvcGVydHldO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSHR0cCAmJiBcImJlZ2luXCIgaW4gYXJncyAmJiBcImVuZFwiIGluIGFyZ3MpIHtcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIiwgYGJ5dGVzPSR7YXJncy5iZWdpbn0tJHthcmdzLmVuZCAtIDF9YCk7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPSBPS19SRVNQT05TRTtcbiAgICB9XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcblxuICAgIGlmIChhcmdzLm9uRXJyb3IpIHtcbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICBhcmdzLm9uRXJyb3IoeGhyLnN0YXR1cyk7XG4gICAgICB9O1xuICAgIH1cbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcywgeGhySWQpO1xuICAgIHhoci5vbnByb2dyZXNzID0gdGhpcy5vblByb2dyZXNzLmJpbmQodGhpcywgeGhySWQpO1xuXG4gICAgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQgPSBhcmdzLm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSA9IGFyZ3Mub25Eb25lO1xuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IgPSBhcmdzLm9uRXJyb3I7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzcyA9IGFyZ3Mub25Qcm9ncmVzcztcblxuICAgIHhoci5zZW5kKG51bGwpO1xuXG4gICAgcmV0dXJuIHhocklkO1xuICB9XG5cbiAgb25Qcm9ncmVzcyh4aHJJZCwgZXZ0KSB7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgLy8gTWF5YmUgYWJvcnRSZXF1ZXN0IHdhcyBjYWxsZWQuLi5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzcykge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzcyhldnQpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RhdGVDaGFuZ2UoeGhySWQsIGV2dCkge1xuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuICAgIGlmICghcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgIC8vIE1heWJlIGFib3J0UmVxdWVzdCB3YXMgY2FsbGVkLi4uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gcGVuZGluZ1JlcXVlc3QueGhyO1xuICAgIGlmICh4aHIucmVhZHlTdGF0ZSA+PSAyICYmIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCgpO1xuICAgICAgZGVsZXRlIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgIH1cblxuICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghKHhocklkIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzKSkge1xuICAgICAgLy8gVGhlIFhIUiByZXF1ZXN0IG1pZ2h0IGhhdmUgYmVlbiBhYm9ydGVkIGluIG9uSGVhZGVyc1JlY2VpdmVkKClcbiAgICAgIC8vIGNhbGxiYWNrLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBhYm9ydCByZXF1ZXN0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG5cbiAgICAvLyBTdWNjZXNzIHN0YXR1cyA9PSAwIGNhbiBiZSBvbiBmdHAsIGZpbGUgYW5kIG90aGVyIHByb3RvY29scy5cbiAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMCAmJiB0aGlzLmlzSHR0cCkge1xuICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IpIHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcih4aHIuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeGhyU3RhdHVzID0geGhyLnN0YXR1cyB8fCBPS19SRVNQT05TRTtcblxuICAgIC8vIEZyb20gaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxNC5odG1sI3NlYzE0LjM1LjI6XG4gICAgLy8gXCJBIHNlcnZlciBNQVkgaWdub3JlIHRoZSBSYW5nZSBoZWFkZXJcIi4gVGhpcyBtZWFucyBpdCdzIHBvc3NpYmxlIHRvXG4gICAgLy8gZ2V0IGEgMjAwIHJhdGhlciB0aGFuIGEgMjA2IHJlc3BvbnNlIGZyb20gYSByYW5nZSByZXF1ZXN0LlxuICAgIGNvbnN0IG9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QgPVxuICAgICAgeGhyU3RhdHVzID09PSBPS19SRVNQT05TRSAmJlxuICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPT09IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRTtcblxuICAgIGlmIChcbiAgICAgICFva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ICYmXG4gICAgICB4aHJTdGF0dXMgIT09IHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzXG4gICAgKSB7XG4gICAgICBpZiAocGVuZGluZ1JlcXVlc3Qub25FcnJvcikge1xuICAgICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yKHhoci5zdGF0dXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNodW5rID0gZ2V0QXJyYXlCdWZmZXIoeGhyKTtcbiAgICBpZiAoeGhyU3RhdHVzID09PSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UpIHtcbiAgICAgIGNvbnN0IHJhbmdlSGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1SYW5nZVwiKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSAvYnl0ZXMgKFxcZCspLShcXGQrKVxcLyhcXGQrKS8uZXhlYyhyYW5nZUhlYWRlcik7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoe1xuICAgICAgICBiZWdpbjogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLFxuICAgICAgICBjaHVuayxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY2h1bmspIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSh7XG4gICAgICAgIGJlZ2luOiAwLFxuICAgICAgICBjaHVuayxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocGVuZGluZ1JlcXVlc3Qub25FcnJvcikge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcih4aHIuc3RhdHVzKTtcbiAgICB9XG4gIH1cblxuICBnZXRSZXF1ZXN0WGhyKHhocklkKSB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7XG4gIH1cblxuICBpc1BlbmRpbmdSZXF1ZXN0KHhocklkKSB7XG4gICAgcmV0dXJuIHhocklkIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzO1xuICB9XG5cbiAgYWJvcnRSZXF1ZXN0KHhocklkKSB7XG4gICAgY29uc3QgeGhyID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdLnhocjtcbiAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuICAgIHhoci5hYm9ydCgpO1xuICB9XG59XG5cbi8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbX0gKi9cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5fbWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcihzb3VyY2UudXJsLCB7XG4gICAgICBodHRwSGVhZGVyczogc291cmNlLmh0dHBIZWFkZXJzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBzb3VyY2Uud2l0aENyZWRlbnRpYWxzLFxuICAgIH0pO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107XG4gIH1cblxuICBfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQocmVhZGVyKSB7XG4gICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuXG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLFxuICAgICAgXCJQREZOZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCJcbiAgICApO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlcihcbiAgICAgIHRoaXMuX21hbmFnZXIsXG4gICAgICB0aGlzLl9zb3VyY2VcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuXG4gIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcihcbiAgICAgIHRoaXMuX21hbmFnZXIsXG4gICAgICBiZWdpbixcbiAgICAgIGVuZFxuICAgICk7XG4gICAgcmVhZGVyLm9uQ2xvc2VkID0gdGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9XG5cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7XG4gICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVycyA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCk7XG4gICAgcmVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChyZWFkZXIpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW1SZWFkZXJ9ICovXG5jbGFzcyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBzb3VyY2UpIHtcbiAgICB0aGlzLl9tYW5hZ2VyID0gbWFuYWdlcjtcblxuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICBvbkhlYWRlcnNSZWNlaXZlZDogdGhpcy5fb25IZWFkZXJzUmVjZWl2ZWQuYmluZCh0aGlzKSxcbiAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksXG4gICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcyksXG4gICAgfTtcbiAgICB0aGlzLl91cmwgPSBzb3VyY2UudXJsO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RGdWxsKGFyZ3MpO1xuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7IC8vIE9wdGlvbmFsXG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fY2FjaGVkQ2h1bmtzID0gW107XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuXG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuXG4gIF9vbkhlYWRlcnNSZWNlaXZlZCgpIHtcbiAgICBjb25zdCBmdWxsUmVxdWVzdFhocklkID0gdGhpcy5fZnVsbFJlcXVlc3RJZDtcbiAgICBjb25zdCBmdWxsUmVxdWVzdFhociA9IHRoaXMuX21hbmFnZXIuZ2V0UmVxdWVzdFhocihmdWxsUmVxdWVzdFhocklkKTtcblxuICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiB7XG4gICAgICByZXR1cm4gZnVsbFJlcXVlc3RYaHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7XG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsXG4gICAgICBzdWdnZXN0ZWRMZW5ndGgsXG4gICAgfSA9IHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcbiAgICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgaXNIdHRwOiB0aGlzLl9tYW5hZ2VyLmlzSHR0cCxcbiAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlLFxuICAgIH0pO1xuXG4gICAgaWYgKGFsbG93UmFuZ2VSZXF1ZXN0cykge1xuICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIC8vIFNldHRpbmcgcmlnaHQgY29udGVudCBsZW5ndGguXG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuXG4gICAgdGhpcy5fZmlsZW5hbWUgPSBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKTtcblxuICAgIGlmICh0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICAvLyBOT1RFOiBieSBjYW5jZWxsaW5nIHRoZSBmdWxsIHJlcXVlc3QsIGFuZCB0aGVuIGlzc3VpbmcgcmFuZ2VcbiAgICAgIC8vIHJlcXVlc3RzLCB0aGVyZSB3aWxsIGJlIGFuIGlzc3VlIGZvciBzaXRlcyB3aGVyZSB5b3UgY2FuIG9ubHlcbiAgICAgIC8vIHJlcXVlc3QgdGhlIHBkZiBvbmNlLiBIb3dldmVyLCBpZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVuIHRoZVxuICAgICAgLy8gc2VydmVyIHNob3VsZCBub3QgYmUgcmV0dXJuaW5nIHRoYXQgaXQgY2FuIHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMuXG4gICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdChmdWxsUmVxdWVzdFhocklkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIF9vbkRvbmUoYXJncykge1xuICAgIGlmIChhcmdzKSB7XG4gICAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeyB2YWx1ZTogYXJncy5jaHVuaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MucHVzaChhcmdzLmNodW5rKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICB9XG5cbiAgX29uRXJyb3Ioc3RhdHVzKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5fdXJsO1xuICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB1cmwpO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXhjZXB0aW9uO1xuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlamVjdChleGNlcHRpb24pO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5fY2FjaGVkQ2h1bmtzID0gW107XG4gIH1cblxuICBfb25Qcm9ncmVzcyhkYXRhKSB7XG4gICAgaWYgKHRoaXMub25Qcm9ncmVzcykge1xuICAgICAgdGhpcy5vblByb2dyZXNzKHtcbiAgICAgICAgbG9hZGVkOiBkYXRhLmxvYWRlZCxcbiAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoQ29tcHV0YWJsZSA/IGRhdGEudG90YWwgOiB0aGlzLl9jb250ZW50TGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuXG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG5cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuXG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fY2FjaGVkQ2h1bmtzLnNoaWZ0KCk7XG4gICAgICByZXR1cm4geyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCkpIHtcbiAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gIH1cbn1cblxuLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmFuZ2VSZWFkZXJ9ICovXG5jbGFzcyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyIHtcbiAgY29uc3RydWN0b3IobWFuYWdlciwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICBvbkRvbmU6IHRoaXMuX29uRG9uZS5iaW5kKHRoaXMpLFxuICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpLFxuICAgIH07XG4gICAgdGhpcy5fcmVxdWVzdElkID0gbWFuYWdlci5yZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCwgYXJncyk7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICB0aGlzLm9uQ2xvc2VkID0gbnVsbDtcbiAgfVxuXG4gIF9jbG9zZSgpIHtcbiAgICBpZiAodGhpcy5vbkNsb3NlZCkge1xuICAgICAgdGhpcy5vbkNsb3NlZCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBfb25Eb25lKGRhdGEpIHtcbiAgICBjb25zdCBjaHVuayA9IGRhdGEuY2h1bms7XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IGNodW5rO1xuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG5cbiAgX29uUHJvZ3Jlc3MoZXZ0KSB7XG4gICAgaWYgKCF0aGlzLmlzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMub25Qcm9ncmVzcykge1xuICAgICAgdGhpcy5vblByb2dyZXNzKHtcbiAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rO1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgaWYgKHRoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpKSB7XG4gICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpO1xuICAgIH1cbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBERk5ldHdvcmtTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgQWJvcnRFeGNlcHRpb24sXG4gIGFzc2VydCxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcixcbiAgZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcixcbiAgdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMsXG4gIHZhbGlkYXRlUmVzcG9uc2VTdGF0dXMsXG59IGZyb20gXCIuL25ldHdvcmtfdXRpbHMuanNcIjtcblxuaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTFwiKSkge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ01vZHVsZSBcIi4vZmV0Y2hfc3RyZWFtLmpzXCIgc2hhbGwgbm90IGJlIHVzZWQgd2l0aCBNT1pDRU5UUkFMIGJ1aWxkcy4nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZldGNoT3B0aW9ucyhoZWFkZXJzLCB3aXRoQ3JlZGVudGlhbHMsIGFib3J0Q29udHJvbGxlcikge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBoZWFkZXJzLFxuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyICYmIGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgbW9kZTogXCJjb3JzXCIsXG4gICAgY3JlZGVudGlhbHM6IHdpdGhDcmVkZW50aWFscyA/IFwiaW5jbHVkZVwiIDogXCJzYW1lLW9yaWdpblwiLFxuICAgIHJlZGlyZWN0OiBcImZvbGxvd1wiLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIZWFkZXJzKGh0dHBIZWFkZXJzKSB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGh0dHBIZWFkZXJzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGhlYWRlcnMuYXBwZW5kKHByb3BlcnR5LCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbX0gKi9cbmNsYXNzIFBERkZldGNoU3RyZWFtIHtcbiAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5pc0h0dHAgPSAvXmh0dHBzPzovaS50ZXN0KHNvdXJjZS51cmwpO1xuICAgIHRoaXMuaHR0cEhlYWRlcnMgPSAodGhpcy5pc0h0dHAgJiYgc291cmNlLmh0dHBIZWFkZXJzKSB8fCB7fTtcblxuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107XG4gIH1cblxuICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPyB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5fbG9hZGVkIDogMDtcbiAgfVxuXG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLFxuICAgICAgXCJQREZGZXRjaFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiXG4gICAgKTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZGZXRjaFN0cmVhbVJlYWRlcih0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gIH1cblxuICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7XG4gICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9XG5cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7XG4gICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVycyA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCk7XG4gICAgcmVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChyZWFkZXIpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW1SZWFkZXJ9ICovXG5jbGFzcyBQREZGZXRjaFN0cmVhbVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTtcbiAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcbiAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVJhbmdlO1xuXG4gICAgdGhpcy5faGVhZGVycyA9IGNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7XG4gICAgZmV0Y2goXG4gICAgICB1cmwsXG4gICAgICBjcmVhdGVGZXRjaE9wdGlvbnMoXG4gICAgICAgIHRoaXMuX2hlYWRlcnMsXG4gICAgICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyxcbiAgICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyXG4gICAgICApXG4gICAgKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAoIXZhbGlkYXRlUmVzcG9uc2VTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcblxuICAgICAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5oZWFkZXJzLmdldChuYW1lKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcbiAgICAgICAgICBzdWdnZXN0ZWRMZW5ndGgsXG4gICAgICAgIH0gPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7XG4gICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsXG4gICAgICAgICAgaXNIdHRwOiB0aGlzLl9zdHJlYW0uaXNIdHRwLFxuICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0cztcbiAgICAgICAgLy8gU2V0dGluZyByaWdodCBjb250ZW50IGxlbmd0aC5cbiAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuX2ZpbGVuYW1lID0gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcik7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBzdG9wIHJlYWRpbmcgd2hlbiByYW5nZSBpcyBzdXBwb3J0ZWQgYW5kIHN0cmVhbWluZyBpc1xuICAgICAgICAvLyBkaXNhYmxlZC5cbiAgICAgICAgaWYgKCF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICAgICAgdGhpcy5jYW5jZWwobmV3IEFib3J0RXhjZXB0aW9uKFwiU3RyZWFtaW5nIGlzIGRpc2FibGVkLlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTtcblxuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cblxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuXG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cblxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG5cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBhd2FpdCB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlLCBkb25lIH07XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMub25Qcm9ncmVzcyh7XG4gICAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkLFxuICAgICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh2YWx1ZSkuYnVmZmVyO1xuICAgIHJldHVybiB7IHZhbHVlOiBidWZmZXIsIGRvbmU6IGZhbHNlIH07XG4gIH1cblxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRlcikge1xuICAgICAgdGhpcy5fcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmFuZ2VSZWFkZXJ9ICovXG5jbGFzcyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBiZWdpbiwgZW5kKSB7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuXG4gICAgaWYgKHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuICAgIHRoaXMuX2hlYWRlcnMuYXBwZW5kKFwiUmFuZ2VcIiwgYGJ5dGVzPSR7YmVnaW59LSR7ZW5kIC0gMX1gKTtcblxuICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7XG4gICAgZmV0Y2goXG4gICAgICB1cmwsXG4gICAgICBjcmVhdGVGZXRjaE9wdGlvbnMoXG4gICAgICAgIHRoaXMuX2hlYWRlcnMsXG4gICAgICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyxcbiAgICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyXG4gICAgICApXG4gICAgKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAoIXZhbGlkYXRlUmVzcG9uc2VTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG5cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZSwgZG9uZSB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7XG4gICAgICB0aGlzLm9uUHJvZ3Jlc3MoeyBsb2FkZWQ6IHRoaXMuX2xvYWRlZCB9KTtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpLmJ1ZmZlcjtcbiAgICByZXR1cm4geyB2YWx1ZTogYnVmZmVyLCBkb25lOiBmYWxzZSB9O1xuICB9XG5cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIGlmICh0aGlzLl9yZWFkZXIpIHtcbiAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Fib3J0Q29udHJvbGxlcikge1xuICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBERkZldGNoU3RyZWFtIH07XG4iXSwic291cmNlUm9vdCI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXM1L2J1aWxkL3BkZi5taW4uanMgYi9lczUvYnVpbGQvcGRmLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzY2ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvZXM1L2J1aWxkL3BkZi5taW4uanMKQEAgLTAsMCArMSwyMiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworIWZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHQscil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1yKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoInBkZmpzLWRpc3QvYnVpbGQvcGRmIixbXSxyKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1sicGRmanMtZGlzdC9idWlsZC9wZGYiXT1yKCk6dFsicGRmanMtZGlzdC9idWlsZC9wZGYiXT10LnBkZmpzTGliPXIoKX0odGhpcywoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9e307ZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhhKXtpZihyW2FdKXJldHVybiByW2FdLmV4cG9ydHM7dmFyIG89clthXT17aTphLGw6ITEsZXhwb3J0czp7fX07dFthXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxfX3dfcGRmanNfcmVxdWlyZV9fKTtvLmw9ITA7cmV0dXJuIG8uZXhwb3J0c31fX3dfcGRmanNfcmVxdWlyZV9fLm09dDtfX3dfcGRmanNfcmVxdWlyZV9fLmM9cjtfX3dfcGRmanNfcmVxdWlyZV9fLmQ9ZnVuY3Rpb24odCxyLGEpe19fd19wZGZqc19yZXF1aXJlX18ubyh0LHIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHtlbnVtZXJhYmxlOiEwLGdldDphfSl9O19fd19wZGZqc19yZXF1aXJlX18ucj1mdW5jdGlvbih0KXsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfTtfX3dfcGRmanNfcmVxdWlyZV9fLnQ9ZnVuY3Rpb24odCxyKXsxJnImJih0PV9fd19wZGZqc19yZXF1aXJlX18odCkpO2lmKDgmcilyZXR1cm4gdDtpZig0JnImJiJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBhPU9iamVjdC5jcmVhdGUobnVsbCk7X193X3BkZmpzX3JlcXVpcmVfXy5yKGEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSk7aWYoMiZyJiYic3RyaW5nIiE9dHlwZW9mIHQpZm9yKHZhciBvIGluIHQpX193X3BkZmpzX3JlcXVpcmVfXy5kKGEsbyxmdW5jdGlvbihyKXtyZXR1cm4gdFtyXX0uYmluZChudWxsLG8pKTtyZXR1cm4gYX07X193X3BkZmpzX3JlcXVpcmVfXy5uPWZ1bmN0aW9uKHQpe3ZhciByPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbiBnZXREZWZhdWx0KCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpe3JldHVybiB0fTtfX3dfcGRmanNfcmVxdWlyZV9fLmQociwiYSIscik7cmV0dXJuIHJ9O19fd19wZGZqc19yZXF1aXJlX18ubz1mdW5jdGlvbih0LHIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKX07X193X3BkZmpzX3JlcXVpcmVfXy5wPSIiO3JldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucz0wKX0oW2Z1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJhZGRMaW5rQXR0cmlidXRlcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBvLmFkZExpbmtBdHRyaWJ1dGVzfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJnZXRGaWxlbmFtZUZyb21VcmwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gby5nZXRGaWxlbmFtZUZyb21Vcmx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIkxpbmtUYXJnZXQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gby5MaW5rVGFyZ2V0fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJsb2FkU2NyaXB0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG8ubG9hZFNjcmlwdH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiUERGRGF0ZVN0cmluZyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBvLlBERkRhdGVTdHJpbmd9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBvLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiYnVpbGQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gaS5idWlsZH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZ2V0RG9jdW1lbnQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gaS5nZXREb2N1bWVudH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiTG9vcGJhY2tQb3J0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGkuTG9vcGJhY2tQb3J0fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJQREZEYXRhUmFuZ2VUcmFuc3BvcnQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gaS5QREZEYXRhUmFuZ2VUcmFuc3BvcnR9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIlBERldvcmtlciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBpLlBERldvcmtlcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwidmVyc2lvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBpLnZlcnNpb259fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIkNNYXBDb21wcmVzc2lvblR5cGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbC5DTWFwQ29tcHJlc3Npb25UeXBlfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJjcmVhdGVPYmplY3RVUkwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbC5jcmVhdGVPYmplY3RVUkx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImNyZWF0ZVByb21pc2VDYXBhYmlsaXR5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJJbnZhbGlkUERGRXhjZXB0aW9uIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGwuSW52YWxpZFBERkV4Y2VwdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiTWlzc2luZ1BERkV4Y2VwdGlvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBsLk1pc3NpbmdQREZFeGNlcHRpb259fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIk9QUyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBsLk9QU319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiUGFzc3dvcmRSZXNwb25zZXMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbC5QYXNzd29yZFJlc3BvbnNlc319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiUGVybWlzc2lvbkZsYWciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbC5QZXJtaXNzaW9uRmxhZ319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwicmVtb3ZlTnVsbENoYXJhY3RlcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbC5yZW1vdmVOdWxsQ2hhcmFjdGVyc319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwic2hhZG93Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGwuc2hhZG93fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb259fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIlVOU1VQUE9SVEVEX0ZFQVRVUkVTIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGwuVU5TVVBQT1JURURfRkVBVFVSRVN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIlV0aWwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbC5VdGlsfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJWZXJib3NpdHlMZXZlbCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBsLlZlcmJvc2l0eUxldmVsfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJBbm5vdGF0aW9uTGF5ZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gYy5Bbm5vdGF0aW9uTGF5ZXJ9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImFwaUNvbXBhdGliaWxpdHlQYXJhbXMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdS5hcGlDb21wYXRpYmlsaXR5UGFyYW1zfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJHbG9iYWxXb3JrZXJPcHRpb25zIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGQuR2xvYmFsV29ya2VyT3B0aW9uc319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwicmVuZGVyVGV4dExheWVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGgucmVuZGVyVGV4dExheWVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJTVkdHcmFwaGljcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBwLlNWR0dyYXBoaWNzfX0pO3ZhciBvPWEoMSksaT1hKDIwMiksbD1hKDUpLGM9YSgyMTYpLHU9YSgyMDYpLGQ9YSgyMDkpLGg9YSgyMTcpLHA9YSgyMTgpO2lmKGEoNykuaXNOb2RlSlMpe3ZhciBtPWEoMjE5KS5QREZOb2RlU3RyZWFtOygwLGkuc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkpKChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG0odCl9KSl9ZWxzZXt2YXIgdixnPWEoMjIyKS5QREZOZXR3b3JrU3RyZWFtOygwLG8uaXNGZXRjaFN1cHBvcnRlZCkoKSYmKHY9YSgyMjMpLlBERkZldGNoU3RyZWFtKTsoMCxpLnNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KSgoZnVuY3Rpb24odCl7cmV0dXJuIHYmJigwLG8uaXNWYWxpZEZldGNoVXJsKSh0LnVybCk/bmV3IHYodCk6bmV3IGcodCl9KSl9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLmFkZExpbmtBdHRyaWJ1dGVzPWZ1bmN0aW9uIGFkZExpbmtBdHRyaWJ1dGVzKHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxhPXIudXJsLG89ci50YXJnZXQsbD1yLnJlbCxjPXIuZW5hYmxlZCx1PXZvaWQgMD09PWN8fGM7KDAsaS5hc3NlcnQpKGEmJiJzdHJpbmciPT10eXBlb2YgYSwnYWRkTGlua0F0dHJpYnV0ZXM6IEEgdmFsaWQgInVybCIgcGFyYW1ldGVyIG11c3QgcHJvdmlkZWQuJyk7dmFyIGQ9KDAsaS5yZW1vdmVOdWxsQ2hhcmFjdGVycykoYSk7aWYodSl0LmhyZWY9dC50aXRsZT1kO2Vsc2V7dC5ocmVmPSIiO3QudGl0bGU9IkRpc2FibGVkOiAiLmNvbmNhdChkKTt0Lm9uY2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4hMX19dmFyIGg9IiI7c3dpdGNoKG8pe2Nhc2UgZy5OT05FOmJyZWFrO2Nhc2UgZy5TRUxGOmg9Il9zZWxmIjticmVhaztjYXNlIGcuQkxBTks6aD0iX2JsYW5rIjticmVhaztjYXNlIGcuUEFSRU5UOmg9Il9wYXJlbnQiO2JyZWFrO2Nhc2UgZy5UT1A6aD0iX3RvcCJ9dC50YXJnZXQ9aDt0LnJlbD0ic3RyaW5nIj09dHlwZW9mIGw/bDoibm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdyJ9O3IuZ2V0RmlsZW5hbWVGcm9tVXJsPWZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbVVybCh0KXt2YXIgcj10LmluZGV4T2YoIiMiKSxhPXQuaW5kZXhPZigiPyIpLG89TWF0aC5taW4ocj4wP3I6dC5sZW5ndGgsYT4wP2E6dC5sZW5ndGgpO3JldHVybiB0LnN1YnN0cmluZyh0Lmxhc3RJbmRleE9mKCIvIixvKSsxLG8pfTtyLmlzRmV0Y2hTdXBwb3J0ZWQ9aXNGZXRjaFN1cHBvcnRlZDtyLmlzVmFsaWRGZXRjaFVybD1pc1ZhbGlkRmV0Y2hVcmw7ci5sb2FkU2NyaXB0PWZ1bmN0aW9uIGxvYWRTY3JpcHQodCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGEpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO28uc3JjPXQ7by5vbmxvYWQ9cjtvLm9uZXJyb3I9ZnVuY3Rpb24oKXthKG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgc2NyaXB0IGF0OiAiLmNvbmNhdChvLnNyYykpKX07KGRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQobyl9KSl9O3IuZGVwcmVjYXRlZD1mdW5jdGlvbiBkZXByZWNhdGVkKHQpe2NvbnNvbGUubG9nKCJEZXByZWNhdGVkIEFQSSB1c2FnZTogIit0KX07ci5QREZEYXRlU3RyaW5nPXIuU3RhdFRpbWVyPXIuRE9NU1ZHRmFjdG9yeT1yLkRPTUNNYXBSZWFkZXJGYWN0b3J5PXIuQmFzZUNNYXBSZWFkZXJGYWN0b3J5PXIuRE9NQ2FudmFzRmFjdG9yeT1yLkJhc2VDYW52YXNGYWN0b3J5PXIuREVGQVVMVF9MSU5LX1JFTD1yLkxpbmtUYXJnZXQ9ci5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb249ci5QYWdlVmlld3BvcnQ9dm9pZCAwO3ZhciBvPWZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShhKDIpKSxpPWEoNSk7ZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCxyKXt2YXIgYTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwoYT1mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1hfHwiU2V0Ij09PWEpcmV0dXJuIEFycmF5LmZyb20odCk7aWYoIkFyZ3VtZW50cyI9PT1hfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChhKSlyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKX0odCkpfHxyJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXthJiYodD1hKTt2YXIgbz0wLGk9ZnVuY3Rpb24gRigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uIG4oKXtyZXR1cm4gbz49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbbysrXX19LGU6ZnVuY3Rpb24gZSh0KXt0aHJvdyB0fSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgbCxjPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24gcygpe2E9dFtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24gbigpe3ZhciB0PWEubmV4dCgpO2M9dC5kb25lO3JldHVybiB0fSxlOmZ1bmN0aW9uIGUodCl7dT0hMDtsPXR9LGY6ZnVuY3Rpb24gZigpe3RyeXtjfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgbH19fX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLG89bmV3IEFycmF5KHIpO2E8cjthKyspb1thXT10W2FdO3JldHVybiBvfWZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcCh0LHIsYSxvLGksbCxjKXt0cnl7dmFyIHU9dFtsXShjKSxkPXUudmFsdWV9Y2F0Y2godCl7YSh0KTtyZXR1cm59dS5kb25lP3IoZCk6UHJvbWlzZS5yZXNvbHZlKGQpLnRoZW4obyxpKX1mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLGE9YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXt2YXIgbD10LmFwcGx5KHIsYSk7ZnVuY3Rpb24gX25leHQodCl7YXN5bmNHZW5lcmF0b3JTdGVwKGwsbyxpLF9uZXh0LF90aHJvdywibmV4dCIsdCl9ZnVuY3Rpb24gX3Rocm93KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChsLG8saSxfbmV4dCxfdGhyb3csInRocm93Iix0KX1fbmV4dCh2b2lkIDApfSkpfX1mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIF9pbmhlcml0cyh0LHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByJiZudWxsIT09cil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtyJiZfc2V0UHJvdG90eXBlT2YodCxyKX1mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXtyZXR1cm4oX3NldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7dC5fX3Byb3RvX189cjtyZXR1cm4gdH0pKHQscil9ZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKHQpe3ZhciByPWZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7RGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSk7cmV0dXJuITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpe3ZhciBhLG89X2dldFByb3RvdHlwZU9mKHQpO2lmKHIpe3ZhciBpPV9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjthPVJlZmxlY3QuY29uc3RydWN0KG8sYXJndW1lbnRzLGkpfWVsc2UgYT1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcyxhKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCxyKXtyZXR1cm4hcnx8Im9iamVjdCIhPT1fdHlwZW9mKHIpJiYiZnVuY3Rpb24iIT10eXBlb2Ygcj9mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH0odCk6cn1mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuKF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fXIuREVGQVVMVF9MSU5LX1JFTD0ibm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdyI7dmFyIGw9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQmFzZUNhbnZhc0ZhY3RvcnkoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxCYXNlQ2FudmFzRmFjdG9yeSk7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VDYW52YXNGYWN0b3J5JiYoMCxpLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNhbnZhc0ZhY3RvcnkuIil9X2NyZWF0ZUNsYXNzKEJhc2VDYW52YXNGYWN0b3J5LFt7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZSh0LHIpeygwLGkudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGNyZWF0ZWAgY2FsbGVkLiIpfX0se2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uIHJlc2V0KHQscixhKXtpZighdC5jYW52YXMpdGhyb3cgbmV3IEVycm9yKCJDYW52YXMgaXMgbm90IHNwZWNpZmllZCIpO2lmKHI8PTB8fGE8PTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIik7dC5jYW52YXMud2lkdGg9cjt0LmNhbnZhcy5oZWlnaHQ9YX19LHtrZXk6ImRlc3Ryb3kiLHZhbHVlOmZ1bmN0aW9uIGRlc3Ryb3kodCl7aWYoIXQuY2FudmFzKXRocm93IG5ldyBFcnJvcigiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWQiKTt0LmNhbnZhcy53aWR0aD0wO3QuY2FudmFzLmhlaWdodD0wO3QuY2FudmFzPW51bGw7dC5jb250ZXh0PW51bGx9fV0pO3JldHVybiBCYXNlQ2FudmFzRmFjdG9yeX0oKTtyLkJhc2VDYW52YXNGYWN0b3J5PWM7dmFyIHU9ZnVuY3Rpb24odCl7X2luaGVyaXRzKERPTUNhbnZhc0ZhY3RvcnksdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKERPTUNhbnZhc0ZhY3RvcnkpO2Z1bmN0aW9uIERPTUNhbnZhc0ZhY3RvcnkoKXt2YXIgdCxhPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxvPWEub3duZXJEb2N1bWVudCxpPXZvaWQgMD09PW8/Z2xvYmFsVGhpcy5kb2N1bWVudDpvO19jbGFzc0NhbGxDaGVjayh0aGlzLERPTUNhbnZhc0ZhY3RvcnkpOyh0PXIuY2FsbCh0aGlzKSkuX2RvY3VtZW50PWk7cmV0dXJuIHR9X2NyZWF0ZUNsYXNzKERPTUNhbnZhc0ZhY3RvcnksW3trZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24gY3JlYXRlKHQscil7aWYodDw9MHx8cjw9MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FudmFzIHNpemUiKTt2YXIgYT10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxvPWEuZ2V0Q29udGV4dCgiMmQiKTthLndpZHRoPXQ7YS5oZWlnaHQ9cjtyZXR1cm57Y2FudmFzOmEsY29udGV4dDpvfX19XSk7cmV0dXJuIERPTUNhbnZhc0ZhY3Rvcnl9KGMpO3IuRE9NQ2FudmFzRmFjdG9yeT11O3ZhciBkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQmFzZUNNYXBSZWFkZXJGYWN0b3J5KHQpe3ZhciByPXQuYmFzZVVybCxhPXZvaWQgMD09PXI/bnVsbDpyLG89dC5pc0NvbXByZXNzZWQsbD12b2lkIDAhPT1vJiZvO19jbGFzc0NhbGxDaGVjayh0aGlzLEJhc2VDTWFwUmVhZGVyRmFjdG9yeSk7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VDTWFwUmVhZGVyRmFjdG9yeSYmKDAsaS51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS4iKTt0aGlzLmJhc2VVcmw9YTt0aGlzLmlzQ29tcHJlc3NlZD1sfV9jcmVhdGVDbGFzcyhCYXNlQ01hcFJlYWRlckZhY3RvcnksW3trZXk6ImZldGNoIix2YWx1ZToodD1fYXN5bmNUb0dlbmVyYXRvcihvLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSh0KXt2YXIgcixhLGwsYz10aGlzO3JldHVybiBvLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZSQobyl7Zm9yKDs7KXN3aXRjaChvLnByZXY9by5uZXh0KXtjYXNlIDA6cj10Lm5hbWU7aWYodGhpcy5iYXNlVXJsKXtvLm5leHQ9MzticmVha310aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwICJiYXNlVXJsIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0IHRoZSAiY01hcFVybCIgYW5kICJjTWFwUGFja2VkIiBBUEkgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQuJyk7Y2FzZSAzOmlmKHIpe28ubmV4dD01O2JyZWFrfXRocm93IG5ldyBFcnJvcigiQ01hcCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLiIpO2Nhc2UgNTphPXRoaXMuYmFzZVVybCtyKyh0aGlzLmlzQ29tcHJlc3NlZD8iLmJjbWFwIjoiIik7bD10aGlzLmlzQ29tcHJlc3NlZD9pLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZOmkuQ01hcENvbXByZXNzaW9uVHlwZS5OT05FO3JldHVybiBvLmFicnVwdCgicmV0dXJuIix0aGlzLl9mZXRjaERhdGEoYSxsKS5jYXRjaCgoZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gbG9hZCAiLmNvbmNhdChjLmlzQ29tcHJlc3NlZD8iYmluYXJ5ICI6IiIsIkNNYXAgYXQ6ICIpLmNvbmNhdChhKSl9KSkpO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIG8uc3RvcCgpfX0pLF9jYWxsZWUsdGhpcyl9KSkpLGZ1bmN0aW9uIGZldGNoKHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJfZmV0Y2hEYXRhIix2YWx1ZTpmdW5jdGlvbiBfZmV0Y2hEYXRhKHQscil7KDAsaS51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLiIpfX1dKTt2YXIgdDtyZXR1cm4gQmFzZUNNYXBSZWFkZXJGYWN0b3J5fSgpO3IuQmFzZUNNYXBSZWFkZXJGYWN0b3J5PWQ7dmFyIGg9ZnVuY3Rpb24odCl7X2luaGVyaXRzKERPTUNNYXBSZWFkZXJGYWN0b3J5LHQpO3ZhciByPV9jcmVhdGVTdXBlcihET01DTWFwUmVhZGVyRmFjdG9yeSk7ZnVuY3Rpb24gRE9NQ01hcFJlYWRlckZhY3RvcnkoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxET01DTWFwUmVhZGVyRmFjdG9yeSk7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfV9jcmVhdGVDbGFzcyhET01DTWFwUmVhZGVyRmFjdG9yeSxbe2tleToiX2ZldGNoRGF0YSIsdmFsdWU6ZnVuY3Rpb24gX2ZldGNoRGF0YSh0LHIpe3ZhciBhPXRoaXM7cmV0dXJuIGlzRmV0Y2hTdXBwb3J0ZWQoKSYmaXNWYWxpZEZldGNoVXJsKHQsZG9jdW1lbnQuYmFzZVVSSSk/ZmV0Y2godCkudGhlbihmdW5jdGlvbigpe3ZhciB0PV9hc3luY1RvR2VuZXJhdG9yKG8uZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlMih0KXt2YXIgbDtyZXR1cm4gby5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUyJChvKXtmb3IoOzspc3dpdGNoKG8ucHJldj1vLm5leHQpe2Nhc2UgMDppZih0Lm9rKXtvLm5leHQ9MjticmVha310aHJvdyBuZXcgRXJyb3IodC5zdGF0dXNUZXh0KTtjYXNlIDI6aWYoIWEuaXNDb21wcmVzc2VkKXtvLm5leHQ9MTA7YnJlYWt9by50MD1VaW50OEFycmF5O28ubmV4dD02O3JldHVybiB0LmFycmF5QnVmZmVyKCk7Y2FzZSA2Om8udDE9by5zZW50O2w9bmV3IG8udDAoby50MSk7by5uZXh0PTE1O2JyZWFrO2Nhc2UgMTA6by50Mj1pLnN0cmluZ1RvQnl0ZXM7by5uZXh0PTEzO3JldHVybiB0LnRleHQoKTtjYXNlIDEzOm8udDM9by5zZW50O2w9KDAsby50Mikoby50Myk7Y2FzZSAxNTpyZXR1cm4gby5hYnJ1cHQoInJldHVybiIse2NNYXBEYXRhOmwsY29tcHJlc3Npb25UeXBlOnJ9KTtjYXNlIDE2OmNhc2UiZW5kIjpyZXR1cm4gby5zdG9wKCl9fSksX2NhbGxlZTIpfSkpKTtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSk6bmV3IFByb21pc2UoKGZ1bmN0aW9uKG8sbCl7dmFyIGM9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub3BlbigiR0VUIix0LCEwKTthLmlzQ29tcHJlc3NlZCYmKGMucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIpO2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoYy5yZWFkeVN0YXRlPT09WE1MSHR0cFJlcXVlc3QuRE9ORSl7aWYoMjAwPT09Yy5zdGF0dXN8fDA9PT1jLnN0YXR1cyl7dmFyIHQ7YS5pc0NvbXByZXNzZWQmJmMucmVzcG9uc2U/dD1uZXcgVWludDhBcnJheShjLnJlc3BvbnNlKTohYS5pc0NvbXByZXNzZWQmJmMucmVzcG9uc2VUZXh0JiYodD0oMCxpLnN0cmluZ1RvQnl0ZXMpKGMucmVzcG9uc2VUZXh0KSk7aWYodCl7byh7Y01hcERhdGE6dCxjb21wcmVzc2lvblR5cGU6cn0pO3JldHVybn19bChuZXcgRXJyb3IoYy5zdGF0dXNUZXh0KSl9fTtjLnNlbmQobnVsbCl9KSl9fV0pO3JldHVybiBET01DTWFwUmVhZGVyRmFjdG9yeX0oZCk7ci5ET01DTWFwUmVhZGVyRmFjdG9yeT1oO3ZhciBwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRE9NU1ZHRmFjdG9yeSgpe19jbGFzc0NhbGxDaGVjayh0aGlzLERPTVNWR0ZhY3RvcnkpfV9jcmVhdGVDbGFzcyhET01TVkdGYWN0b3J5LFt7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZSh0LHIpeygwLGkuYXNzZXJ0KSh0PjAmJnI+MCwiSW52YWxpZCBTVkcgZGltZW5zaW9ucyIpO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhsLCJzdmc6c3ZnIik7YS5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLCIxLjEiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLHQrInB4Iik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIscisicHgiKTthLnNldEF0dHJpYnV0ZSgicHJlc2VydmVBc3BlY3RSYXRpbyIsIm5vbmUiKTthLnNldEF0dHJpYnV0ZSgidmlld0JveCIsIjAgMCAiK3QrIiAiK3IpO3JldHVybiBhfX0se2tleToiY3JlYXRlRWxlbWVudCIsdmFsdWU6ZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0KXsoMCxpLmFzc2VydCkoInN0cmluZyI9PXR5cGVvZiB0LCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGUiKTtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGwsdCl9fV0pO3JldHVybiBET01TVkdGYWN0b3J5fSgpO3IuRE9NU1ZHRmFjdG9yeT1wO3ZhciBtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUGFnZVZpZXdwb3J0KHQpe3ZhciByPXQudmlld0JveCxhPXQuc2NhbGUsbz10LnJvdGF0aW9uLGk9dC5vZmZzZXRYLGw9dm9pZCAwPT09aT8wOmksYz10Lm9mZnNldFksdT12b2lkIDA9PT1jPzA6YyxkPXQuZG9udEZsaXAsaD12b2lkIDAhPT1kJiZkO19jbGFzc0NhbGxDaGVjayh0aGlzLFBhZ2VWaWV3cG9ydCk7dGhpcy52aWV3Qm94PXI7dGhpcy5zY2FsZT1hO3RoaXMucm90YXRpb249bzt0aGlzLm9mZnNldFg9bDt0aGlzLm9mZnNldFk9dTt2YXIgcCxtLHYsZyx5LGIsXyxTLEM9KHJbMl0rclswXSkvMixBPShyWzNdK3JbMV0pLzI7c3dpdGNoKG89KG8lPTM2MCk8MD9vKzM2MDpvKXtjYXNlIDE4MDpwPS0xO209MDt2PTA7Zz0xO2JyZWFrO2Nhc2UgOTA6cD0wO209MTt2PTE7Zz0wO2JyZWFrO2Nhc2UgMjcwOnA9MDttPS0xO3Y9LTE7Zz0wO2JyZWFrO2Nhc2UgMDpwPTE7bT0wO3Y9MDtnPS0xO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLiIpfWlmKGgpe3Y9LXY7Zz0tZ31pZigwPT09cCl7eT1NYXRoLmFicyhBLXJbMV0pKmErbDtiPU1hdGguYWJzKEMtclswXSkqYSt1O189TWF0aC5hYnMoclszXS1yWzFdKSphO1M9TWF0aC5hYnMoclsyXS1yWzBdKSphfWVsc2V7eT1NYXRoLmFicyhDLXJbMF0pKmErbDtiPU1hdGguYWJzKEEtclsxXSkqYSt1O189TWF0aC5hYnMoclsyXS1yWzBdKSphO1M9TWF0aC5hYnMoclszXS1yWzFdKSphfXRoaXMudHJhbnNmb3JtPVtwKmEsbSphLHYqYSxnKmEseS1wKmEqQy12KmEqQSxiLW0qYSpDLWcqYSpBXTt0aGlzLndpZHRoPV87dGhpcy5oZWlnaHQ9U31fY3JlYXRlQ2xhc3MoUGFnZVZpZXdwb3J0LFt7a2V5OiJjbG9uZSIsdmFsdWU6ZnVuY3Rpb24gY2xvbmUoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj10LnNjYWxlLGE9dm9pZCAwPT09cj90aGlzLnNjYWxlOnIsbz10LnJvdGF0aW9uLGk9dm9pZCAwPT09bz90aGlzLnJvdGF0aW9uOm8sbD10Lm9mZnNldFgsYz12b2lkIDA9PT1sP3RoaXMub2Zmc2V0WDpsLHU9dC5vZmZzZXRZLGQ9dm9pZCAwPT09dT90aGlzLm9mZnNldFk6dSxoPXQuZG9udEZsaXAscD12b2lkIDAhPT1oJiZoO3JldHVybiBuZXcgUGFnZVZpZXdwb3J0KHt2aWV3Qm94OnRoaXMudmlld0JveC5zbGljZSgpLHNjYWxlOmEscm90YXRpb246aSxvZmZzZXRYOmMsb2Zmc2V0WTpkLGRvbnRGbGlwOnB9KX19LHtrZXk6ImNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQiLHZhbHVlOmZ1bmN0aW9uIGNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQodCxyKXtyZXR1cm4gaS5VdGlsLmFwcGx5VHJhbnNmb3JtKFt0LHJdLHRoaXMudHJhbnNmb3JtKX19LHtrZXk6ImNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlIix2YWx1ZTpmdW5jdGlvbiBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZSh0KXt2YXIgcj1pLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3RbMF0sdFsxXV0sdGhpcy50cmFuc2Zvcm0pLGE9aS5VdGlsLmFwcGx5VHJhbnNmb3JtKFt0WzJdLHRbM11dLHRoaXMudHJhbnNmb3JtKTtyZXR1cm5bclswXSxyWzFdLGFbMF0sYVsxXV19fSx7a2V5OiJjb252ZXJ0VG9QZGZQb2ludCIsdmFsdWU6ZnVuY3Rpb24gY29udmVydFRvUGRmUG9pbnQodCxyKXtyZXR1cm4gaS5VdGlsLmFwcGx5SW52ZXJzZVRyYW5zZm9ybShbdCxyXSx0aGlzLnRyYW5zZm9ybSl9fV0pO3JldHVybiBQYWdlVmlld3BvcnR9KCk7ci5QYWdlVmlld3BvcnQ9bTt2YXIgdj1mdW5jdGlvbih0KXtfaW5oZXJpdHMoUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pO2Z1bmN0aW9uIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbih0LGEpe3ZhciBvO19jbGFzc0NhbGxDaGVjayh0aGlzLFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbik7KG89ci5jYWxsKHRoaXMsdCkpLnR5cGU9YTtyZXR1cm4gb31yZXR1cm4gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9ufShpLkJhc2VFeGNlcHRpb24pO3IuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uPXY7dmFyIGc9e05PTkU6MCxTRUxGOjEsQkxBTks6MixQQVJFTlQ6MyxUT1A6NH07ci5MaW5rVGFyZ2V0PWc7dmFyIHksYj1mdW5jdGlvbigpe2Z1bmN0aW9uIFN0YXRUaW1lcigpe19jbGFzc0NhbGxDaGVjayh0aGlzLFN0YXRUaW1lcik7dGhpcy5zdGFydGVkPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy50aW1lcz1bXX1fY3JlYXRlQ2xhc3MoU3RhdFRpbWVyLFt7a2V5OiJ0aW1lIix2YWx1ZTpmdW5jdGlvbiB0aW1lKHQpe3QgaW4gdGhpcy5zdGFydGVkJiYoMCxpLndhcm4pKCJUaW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yICIuY29uY2F0KHQpKTt0aGlzLnN0YXJ0ZWRbdF09RGF0ZS5ub3coKX19LHtrZXk6InRpbWVFbmQiLHZhbHVlOmZ1bmN0aW9uIHRpbWVFbmQodCl7dCBpbiB0aGlzLnN0YXJ0ZWR8fCgwLGkud2FybikoIlRpbWVyIGhhcyBub3QgYmVlbiBzdGFydGVkIGZvciAiLmNvbmNhdCh0KSk7dGhpcy50aW1lcy5wdXNoKHtuYW1lOnQsc3RhcnQ6dGhpcy5zdGFydGVkW3RdLGVuZDpEYXRlLm5vdygpfSk7ZGVsZXRlIHRoaXMuc3RhcnRlZFt0XX19LHtrZXk6InRvU3RyaW5nIix2YWx1ZTpmdW5jdGlvbiB0b1N0cmluZygpe3ZhciB0LHI9W10sYT0wLG89X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy50aW1lcyk7dHJ5e2ZvcihvLnMoKTshKHQ9by5uKCkpLmRvbmU7KXt2YXIgaT10LnZhbHVlLm5hbWU7aS5sZW5ndGg+YSYmKGE9aS5sZW5ndGgpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX12YXIgbCxjPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMudGltZXMpO3RyeXtmb3IoYy5zKCk7IShsPWMubigpKS5kb25lOyl7dmFyIHU9bC52YWx1ZSxkPXUuZW5kLXUuc3RhcnQ7ci5wdXNoKCIiLmNvbmNhdCh1Lm5hbWUucGFkRW5kKGEpLCIgIikuY29uY2F0KGQsIm1zXG4iKSl9fWNhdGNoKHQpe2MuZSh0KX1maW5hbGx5e2MuZigpfXJldHVybiByLmpvaW4oIiIpfX1dKTtyZXR1cm4gU3RhdFRpbWVyfSgpO3IuU3RhdFRpbWVyPWI7ZnVuY3Rpb24gaXNGZXRjaFN1cHBvcnRlZCgpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVzcG9uc2UmJiJib2R5ImluIFJlc3BvbnNlLnByb3RvdHlwZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBSZWFkYWJsZVN0cmVhbX1mdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodCxyKXt0cnl7dmFyIGE9KHI/bmV3IFVSTCh0LHIpOm5ldyBVUkwodCkpLnByb3RvY29sO3JldHVybiJodHRwOiI9PT1hfHwiaHR0cHM6Ij09PWF9Y2F0Y2godCl7cmV0dXJuITF9fXZhciBfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGRGF0ZVN0cmluZygpe19jbGFzc0NhbGxDaGVjayh0aGlzLFBERkRhdGVTdHJpbmcpfV9jcmVhdGVDbGFzcyhQREZEYXRlU3RyaW5nLG51bGwsW3trZXk6InRvRGF0ZU9iamVjdCIsdmFsdWU6ZnVuY3Rpb24gdG9EYXRlT2JqZWN0KHQpe2lmKCF0fHwhKDAsaS5pc1N0cmluZykodCkpcmV0dXJuIG51bGw7eXx8KHk9bmV3IFJlZ0V4cCgiXkQ6KFxcZHs0fSkoXFxkezJ9KT8oXFxkezJ9KT8oXFxkezJ9KT8oXFxkezJ9KT8oXFxkezJ9KT8oW1p8K3wtXSk/KFxcZHsyfSk/Jz8oXFxkezJ9KT8nPyIpKTt2YXIgcj15LmV4ZWModCk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIGE9cGFyc2VJbnQoclsxXSwxMCksbz1wYXJzZUludChyWzJdLDEwKTtvPW8+PTEmJm88PTEyP28tMTowO3ZhciBsPXBhcnNlSW50KHJbM10sMTApO2w9bD49MSYmbDw9MzE/bDoxO3ZhciBjPXBhcnNlSW50KHJbNF0sMTApO2M9Yz49MCYmYzw9MjM/YzowO3ZhciB1PXBhcnNlSW50KHJbNV0sMTApO3U9dT49MCYmdTw9NTk/dTowO3ZhciBkPXBhcnNlSW50KHJbNl0sMTApO2Q9ZD49MCYmZDw9NTk/ZDowO3ZhciBoPXJbN118fCJaIixwPXBhcnNlSW50KHJbOF0sMTApO3A9cD49MCYmcDw9MjM/cDowO3ZhciBtPXBhcnNlSW50KHJbOV0sMTApfHwwO209bT49MCYmbTw9NTk/bTowO2lmKCItIj09PWgpe2MrPXA7dSs9bX1lbHNlIGlmKCIrIj09PWgpe2MtPXA7dS09bX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoYSxvLGwsYyx1LGQpKX19XSk7cmV0dXJuIFBERkRhdGVTdHJpbmd9KCk7ci5QREZEYXRlU3RyaW5nPV99LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWEoMyl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9dmFyIHI9ZnVuY3Rpb24odCl7dmFyIHI9T2JqZWN0LnByb3RvdHlwZSxhPXIuaGFzT3duUHJvcGVydHksbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxpPW8uaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixsPW8uYXN5bmNJdGVyYXRvcnx8IkBAYXN5bmNJdGVyYXRvciIsYz1vLnRvU3RyaW5nVGFnfHwiQEB0b1N0cmluZ1RhZyI7ZnVuY3Rpb24gZGVmaW5lKHQscixhKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHt2YWx1ZTphLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk7cmV0dXJuIHRbcl19dHJ5e2RlZmluZSh7fSwiIil9Y2F0Y2godCl7ZGVmaW5lPWZ1bmN0aW9uIGRlZmluZSh0LHIsYSl7cmV0dXJuIHRbcl09YX19ZnVuY3Rpb24gd3JhcCh0LHIsYSxvKXt2YXIgaT1yJiZyLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvcj9yOkdlbmVyYXRvcixsPU9iamVjdC5jcmVhdGUoaS5wcm90b3R5cGUpLGM9bmV3IENvbnRleHQob3x8W10pO2wuX2ludm9rZT1mdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKHQscixhKXt2YXIgbz0ic3VzcGVuZGVkU3RhcnQiO3JldHVybiBmdW5jdGlvbiBpbnZva2UoaSxsKXtpZigiZXhlY3V0aW5nIj09PW8pdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoImNvbXBsZXRlZCI9PT1vKXtpZigidGhyb3ciPT09aSl0aHJvdyBsO3JldHVybiBkb25lUmVzdWx0KCl9YS5tZXRob2Q9aTthLmFyZz1sO2Zvcig7Oyl7dmFyIGM9YS5kZWxlZ2F0ZTtpZihjKXt2YXIgZD1tYXliZUludm9rZURlbGVnYXRlKGMsYSk7aWYoZCl7aWYoZD09PXUpY29udGludWU7cmV0dXJuIGR9fWlmKCJuZXh0Ij09PWEubWV0aG9kKWEuc2VudD1hLl9zZW50PWEuYXJnO2Vsc2UgaWYoInRocm93Ij09PWEubWV0aG9kKXtpZigic3VzcGVuZGVkU3RhcnQiPT09byl7bz0iY29tcGxldGVkIjt0aHJvdyBhLmFyZ31hLmRpc3BhdGNoRXhjZXB0aW9uKGEuYXJnKX1lbHNlInJldHVybiI9PT1hLm1ldGhvZCYmYS5hYnJ1cHQoInJldHVybiIsYS5hcmcpO289ImV4ZWN1dGluZyI7dmFyIGg9dHJ5Q2F0Y2godCxyLGEpO2lmKCJub3JtYWwiPT09aC50eXBlKXtvPWEuZG9uZT8iY29tcGxldGVkIjoic3VzcGVuZGVkWWllbGQiO2lmKGguYXJnPT09dSljb250aW51ZTtyZXR1cm57dmFsdWU6aC5hcmcsZG9uZTphLmRvbmV9fWlmKCJ0aHJvdyI9PT1oLnR5cGUpe289ImNvbXBsZXRlZCI7YS5tZXRob2Q9InRocm93IjthLmFyZz1oLmFyZ319fX0odCxhLGMpO3JldHVybiBsfXQud3JhcD13cmFwO2Z1bmN0aW9uIHRyeUNhdGNoKHQscixhKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOnQuY2FsbChyLGEpfX1jYXRjaCh0KXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzp0fX19dmFyIHU9e307ZnVuY3Rpb24gR2VuZXJhdG9yKCl7fWZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCl7fWZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCl7fXZhciBkPXt9O2RbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dmFyIGg9T2JqZWN0LmdldFByb3RvdHlwZU9mLHA9aCYmaChoKHZhbHVlcyhbXSkpKTtwJiZwIT09ciYmYS5jYWxsKHAsaSkmJihkPXApO3ZhciBtPUdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZT1HZW5lcmF0b3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZCk7R2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlPW0uY29uc3RydWN0b3I9R2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7R2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3I9R2VuZXJhdG9yRnVuY3Rpb247R2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWU9ZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLGMsIkdlbmVyYXRvckZ1bmN0aW9uIik7ZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaCgoZnVuY3Rpb24ocil7ZGVmaW5lKHQsciwoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZShyLHQpfSkpfSkpfXQuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbih0KXt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4hIXImJihyPT09R2VuZXJhdG9yRnVuY3Rpb258fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0oci5kaXNwbGF5TmFtZXx8ci5uYW1lKSl9O3QubWFyaz1mdW5jdGlvbih0KXtpZihPYmplY3Quc2V0UHJvdG90eXBlT2YpT2JqZWN0LnNldFByb3RvdHlwZU9mKHQsR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO2Vsc2V7dC5fX3Byb3RvX189R2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7ZGVmaW5lKHQsYywiR2VuZXJhdG9yRnVuY3Rpb24iKX10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG0pO3JldHVybiB0fTt0LmF3cmFwPWZ1bmN0aW9uKHQpe3JldHVybntfX2F3YWl0OnR9fTtmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKHQscil7dmFyIG87dGhpcy5faW52b2tlPWZ1bmN0aW9uIGVucXVldWUoaSxsKXtmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpe3JldHVybiBuZXcgcigoZnVuY3Rpb24obyxjKXshZnVuY3Rpb24gaW52b2tlKG8saSxsLGMpe3ZhciB1PXRyeUNhdGNoKHRbb10sdCxpKTtpZigidGhyb3ciIT09dS50eXBlKXt2YXIgZD11LmFyZyxoPWQudmFsdWU7cmV0dXJuIGgmJiJvYmplY3QiPT09X3R5cGVvZihoKSYmYS5jYWxsKGgsIl9fYXdhaXQiKT9yLnJlc29sdmUoaC5fX2F3YWl0KS50aGVuKChmdW5jdGlvbih0KXtpbnZva2UoIm5leHQiLHQsbCxjKX0pLChmdW5jdGlvbih0KXtpbnZva2UoInRocm93Iix0LGwsYyl9KSk6ci5yZXNvbHZlKGgpLnRoZW4oKGZ1bmN0aW9uKHQpe2QudmFsdWU9dDtsKGQpfSksKGZ1bmN0aW9uKHQpe3JldHVybiBpbnZva2UoInRocm93Iix0LGwsYyl9KSl9Yyh1LmFyZyl9KGksbCxvLGMpfSkpfXJldHVybiBvPW8/by50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKTpjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpfX1kZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO0FzeW5jSXRlcmF0b3IucHJvdG90eXBlW2xdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuQXN5bmNJdGVyYXRvcj1Bc3luY0l0ZXJhdG9yO3QuYXN5bmM9ZnVuY3Rpb24ocixhLG8saSxsKXt2b2lkIDA9PT1sJiYobD1Qcm9taXNlKTt2YXIgYz1uZXcgQXN5bmNJdGVyYXRvcih3cmFwKHIsYSxvLGkpLGwpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24oYSk/YzpjLm5leHQoKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6Yy5uZXh0KCl9KSl9O2Z1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUodCxyKXt2YXIgYT10Lml0ZXJhdG9yW3IubWV0aG9kXTtpZih2b2lkIDA9PT1hKXtyLmRlbGVnYXRlPW51bGw7aWYoInRocm93Ij09PXIubWV0aG9kKXtpZih0Lml0ZXJhdG9yLnJldHVybil7ci5tZXRob2Q9InJldHVybiI7ci5hcmc9dm9pZCAwO21heWJlSW52b2tlRGVsZWdhdGUodCxyKTtpZigidGhyb3ciPT09ci5tZXRob2QpcmV0dXJuIHV9ci5tZXRob2Q9InRocm93IjtyLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIHV9dmFyIG89dHJ5Q2F0Y2goYSx0Lml0ZXJhdG9yLHIuYXJnKTtpZigidGhyb3ciPT09by50eXBlKXtyLm1ldGhvZD0idGhyb3ciO3IuYXJnPW8uYXJnO3IuZGVsZWdhdGU9bnVsbDtyZXR1cm4gdX12YXIgaT1vLmFyZztpZighaSl7ci5tZXRob2Q9InRocm93IjtyLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpO3IuZGVsZWdhdGU9bnVsbDtyZXR1cm4gdX1pZighaS5kb25lKXJldHVybiBpO3JbdC5yZXN1bHROYW1lXT1pLnZhbHVlO3IubmV4dD10Lm5leHRMb2M7aWYoInJldHVybiIhPT1yLm1ldGhvZCl7ci5tZXRob2Q9Im5leHQiO3IuYXJnPXZvaWQgMH1yLmRlbGVnYXRlPW51bGw7cmV0dXJuIHV9ZGVmaW5lSXRlcmF0b3JNZXRob2RzKG0pO2RlZmluZShtLGMsIkdlbmVyYXRvciIpO21baV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307bS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifTtmdW5jdGlvbiBwdXNoVHJ5RW50cnkodCl7dmFyIHI9e3RyeUxvYzp0WzBdfTsxIGluIHQmJihyLmNhdGNoTG9jPXRbMV0pO2lmKDIgaW4gdCl7ci5maW5hbGx5TG9jPXRbMl07ci5hZnRlckxvYz10WzNdfXRoaXMudHJ5RW50cmllcy5wdXNoKHIpfWZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkodCl7dmFyIHI9dC5jb21wbGV0aW9ufHx7fTtyLnR5cGU9Im5vcm1hbCI7ZGVsZXRlIHIuYXJnO3QuY29tcGxldGlvbj1yfWZ1bmN0aW9uIENvbnRleHQodCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dO3QuZm9yRWFjaChwdXNoVHJ5RW50cnksdGhpcyk7dGhpcy5yZXNldCghMCl9dC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciByPVtdO2Zvcih2YXIgYSBpbiB0KXIucHVzaChhKTtyLnJldmVyc2UoKTtyZXR1cm4gZnVuY3Rpb24gbmV4dCgpe2Zvcig7ci5sZW5ndGg7KXt2YXIgYT1yLnBvcCgpO2lmKGEgaW4gdCl7bmV4dC52YWx1ZT1hO25leHQuZG9uZT0hMTtyZXR1cm4gbmV4dH19bmV4dC5kb25lPSEwO3JldHVybiBuZXh0fX07ZnVuY3Rpb24gdmFsdWVzKHQpe2lmKHQpe3ZhciByPXRbaV07aWYocilyZXR1cm4gci5jYWxsKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIG89LTEsbD1mdW5jdGlvbiBuZXh0KCl7Zm9yKDsrK288dC5sZW5ndGg7KWlmKGEuY2FsbCh0LG8pKXtuZXh0LnZhbHVlPXRbb107bmV4dC5kb25lPSExO3JldHVybiBuZXh0fW5leHQudmFsdWU9dm9pZCAwO25leHQuZG9uZT0hMDtyZXR1cm4gbmV4dH07cmV0dXJuIGwubmV4dD1sfX1yZXR1cm57bmV4dDpkb25lUmVzdWx0fX10LnZhbHVlcz12YWx1ZXM7ZnVuY3Rpb24gZG9uZVJlc3VsdCgpe3JldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19Q29udGV4dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkNvbnRleHQscmVzZXQ6ZnVuY3Rpb24gcmVzZXQodCl7dGhpcy5wcmV2PTA7dGhpcy5uZXh0PTA7dGhpcy5zZW50PXRoaXMuX3NlbnQ9dm9pZCAwO3RoaXMuZG9uZT0hMTt0aGlzLmRlbGVnYXRlPW51bGw7dGhpcy5tZXRob2Q9Im5leHQiO3RoaXMuYXJnPXZvaWQgMDt0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtpZighdClmb3IodmFyIHIgaW4gdGhpcykidCI9PT1yLmNoYXJBdCgwKSYmYS5jYWxsKHRoaXMscikmJiFpc05hTigrci5zbGljZSgxKSkmJih0aGlzW3JdPXZvaWQgMCl9LHN0b3A6ZnVuY3Rpb24gc3RvcCgpe3RoaXMuZG9uZT0hMDt2YXIgdD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKHQpe2lmKHRoaXMuZG9uZSl0aHJvdyB0O3ZhciByPXRoaXM7ZnVuY3Rpb24gaGFuZGxlKGEsbyl7bC50eXBlPSJ0aHJvdyI7bC5hcmc9dDtyLm5leHQ9YTtpZihvKXtyLm1ldGhvZD0ibmV4dCI7ci5hcmc9dm9pZCAwfXJldHVybiEhb31mb3IodmFyIG89dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO28+PTA7LS1vKXt2YXIgaT10aGlzLnRyeUVudHJpZXNbb10sbD1pLmNvbXBsZXRpb247aWYoInJvb3QiPT09aS50cnlMb2MpcmV0dXJuIGhhbmRsZSgiZW5kIik7aWYoaS50cnlMb2M8PXRoaXMucHJldil7dmFyIGM9YS5jYWxsKGksImNhdGNoTG9jIiksdT1hLmNhbGwoaSwiZmluYWxseUxvYyIpO2lmKGMmJnUpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiBoYW5kbGUoaS5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PGkuZmluYWxseUxvYylyZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyl9ZWxzZSBpZihjKXtpZih0aGlzLnByZXY8aS5jYXRjaExvYylyZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsITApfWVsc2V7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24gYWJydXB0KHQscil7Zm9yKHZhciBvPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtvPj0wOy0tbyl7dmFyIGk9dGhpcy50cnlFbnRyaWVzW29dO2lmKGkudHJ5TG9jPD10aGlzLnByZXYmJmEuY2FsbChpLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxpLmZpbmFsbHlMb2Mpe3ZhciBsPWk7YnJlYWt9fWwmJigiYnJlYWsiPT09dHx8ImNvbnRpbnVlIj09PXQpJiZsLnRyeUxvYzw9ciYmcjw9bC5maW5hbGx5TG9jJiYobD1udWxsKTt2YXIgYz1sP2wuY29tcGxldGlvbjp7fTtjLnR5cGU9dDtjLmFyZz1yO2lmKGwpe3RoaXMubWV0aG9kPSJuZXh0Ijt0aGlzLm5leHQ9bC5maW5hbGx5TG9jO3JldHVybiB1fXJldHVybiB0aGlzLmNvbXBsZXRlKGMpfSxjb21wbGV0ZTpmdW5jdGlvbiBjb21wbGV0ZSh0LHIpe2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7aWYoImJyZWFrIj09PXQudHlwZXx8ImNvbnRpbnVlIj09PXQudHlwZSl0aGlzLm5leHQ9dC5hcmc7ZWxzZSBpZigicmV0dXJuIj09PXQudHlwZSl7dGhpcy5ydmFsPXRoaXMuYXJnPXQuYXJnO3RoaXMubWV0aG9kPSJyZXR1cm4iO3RoaXMubmV4dD0iZW5kIn1lbHNlIm5vcm1hbCI9PT10LnR5cGUmJnImJih0aGlzLm5leHQ9cik7cmV0dXJuIHV9LGZpbmlzaDpmdW5jdGlvbiBmaW5pc2godCl7Zm9yKHZhciByPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtyPj0wOy0tcil7dmFyIGE9dGhpcy50cnlFbnRyaWVzW3JdO2lmKGEuZmluYWxseUxvYz09PXQpe3RoaXMuY29tcGxldGUoYS5jb21wbGV0aW9uLGEuYWZ0ZXJMb2MpO3Jlc2V0VHJ5RW50cnkoYSk7cmV0dXJuIHV9fX0sY2F0Y2g6ZnVuY3Rpb24gX2NhdGNoKHQpe2Zvcih2YXIgcj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7cj49MDstLXIpe3ZhciBhPXRoaXMudHJ5RW50cmllc1tyXTtpZihhLnRyeUxvYz09PXQpe3ZhciBvPWEuY29tcGxldGlvbjtpZigidGhyb3ciPT09by50eXBlKXt2YXIgaT1vLmFyZztyZXNldFRyeUVudHJ5KGEpfXJldHVybiBpfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uIGRlbGVnYXRlWWllbGQodCxyLGEpe3RoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOnZhbHVlcyh0KSxyZXN1bHROYW1lOnIsbmV4dExvYzphfTsibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPXZvaWQgMCk7cmV0dXJuIHV9fTtyZXR1cm4gdH0oIm9iamVjdCI9PT1fdHlwZW9mKHQpP3QuZXhwb3J0czp7fSk7dHJ5e3JlZ2VuZXJhdG9yUnVudGltZT1yfWNhdGNoKHQpe0Z1bmN0aW9uKCJyIiwicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHIpfX0pLmNhbGwodGhpcyxhKDQpKHQpKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXQud2VicGFja1BvbHlmaWxsKXt0LmRlcHJlY2F0ZT1mdW5jdGlvbigpe307dC5wYXRocz1bXTt0LmNoaWxkcmVufHwodC5jaGlsZHJlbj1bXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImxvYWRlZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0Lmx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImlkIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHQuaX19KTt0LndlYnBhY2tQb2x5ZmlsbD0xfXJldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5hcnJheUJ5dGVMZW5ndGg9YXJyYXlCeXRlTGVuZ3RoO3IuYXJyYXlzVG9CeXRlcz1mdW5jdGlvbiBhcnJheXNUb0J5dGVzKHQpe3ZhciByPXQubGVuZ3RoO2lmKDE9PT1yJiZ0WzBdaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiB0WzBdO2Zvcih2YXIgYT0wLG89MDtvPHI7bysrKWErPWFycmF5Qnl0ZUxlbmd0aCh0W29dKTtmb3IodmFyIGk9MCxsPW5ldyBVaW50OEFycmF5KGEpLGM9MDtjPHI7YysrKXt2YXIgdT10W2NdO3UgaW5zdGFuY2VvZiBVaW50OEFycmF5fHwodT0ic3RyaW5nIj09dHlwZW9mIHU/c3RyaW5nVG9CeXRlcyh1KTpuZXcgVWludDhBcnJheSh1KSk7dmFyIGQ9dS5ieXRlTGVuZ3RoO2wuc2V0KHUsaSk7aSs9ZH1yZXR1cm4gbH07ci5hc3NlcnQ9YXNzZXJ0O3IuYnl0ZXNUb1N0cmluZz1mdW5jdGlvbiBieXRlc1RvU3RyaW5nKHQpe2Fzc2VydChudWxsIT09dCYmIm9iamVjdCI9PT1fdHlwZW9mKHQpJiZ2b2lkIDAhPT10Lmxlbmd0aCwiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZyIpO3ZhciByPXQubGVuZ3RoO2lmKHI8ODE5MilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHQpO2Zvcih2YXIgYT1bXSxvPTA7bzxyO28rPTgxOTIpe3ZhciBpPU1hdGgubWluKG8rODE5MixyKSxsPXQuc3ViYXJyYXkobyxpKTthLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGwpKX1yZXR1cm4gYS5qb2luKCIiKX07ci5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCkscj0hMTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwic2V0dGxlZCIse2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gcn19KTt0LnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGEsbyl7dC5yZXNvbHZlPWZ1bmN0aW9uKHQpe3I9ITA7YSh0KX07dC5yZWplY3Q9ZnVuY3Rpb24odCl7cj0hMDtvKHQpfX0pKTtyZXR1cm4gdH07ci5lc2NhcGVTdHJpbmc9ZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHQpe3JldHVybiB0LnJlcGxhY2UoLyhbXChcKVxcXSkvZywiXFwkMSIpfTtyLmdldE1vZGlmaWNhdGlvbkRhdGU9ZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpuZXcgRGF0ZShEYXRlLm5vdygpKSxyPVt0LmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwodC5nZXRVVENNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLCh0LmdldFVUQ0RhdGUoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSx0LmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksdC5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksdC5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIildO3JldHVybiByLmpvaW4oIiIpfTtyLmdldFZlcmJvc2l0eUxldmVsPWZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCl7cmV0dXJuIGl9O3IuaW5mbz1mdW5jdGlvbiBpbmZvKHQpe2k+PW8uSU5GT1MmJmNvbnNvbGUubG9nKCJJbmZvOiAiLmNvbmNhdCh0KSl9O3IuaXNBcnJheUJ1ZmZlcj1mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHQpe3JldHVybiJvYmplY3QiPT09X3R5cGVvZih0KSYmbnVsbCE9PXQmJnZvaWQgMCE9PXQuYnl0ZUxlbmd0aH07ci5pc0FycmF5RXF1YWw9ZnVuY3Rpb24gaXNBcnJheUVxdWFsKHQscil7aWYodC5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4hMTtyZXR1cm4gdC5ldmVyeSgoZnVuY3Rpb24odCxhKXtyZXR1cm4gdD09PXJbYV19KSl9O3IuaXNCb29sPWZ1bmN0aW9uIGlzQm9vbCh0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fTtyLmlzTnVtPWZ1bmN0aW9uIGlzTnVtKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH07ci5pc1N0cmluZz1mdW5jdGlvbiBpc1N0cmluZyh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9O3IuaXNTYW1lT3JpZ2luPWZ1bmN0aW9uIGlzU2FtZU9yaWdpbih0LHIpe3ZhciBhO3RyeXtpZighKGE9bmV3IFVSTCh0KSkub3JpZ2lufHwibnVsbCI9PT1hLm9yaWdpbilyZXR1cm4hMX1jYXRjaCh0KXtyZXR1cm4hMX12YXIgbz1uZXcgVVJMKHIsYSk7cmV0dXJuIGEub3JpZ2luPT09by5vcmlnaW59O3IuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybD1mdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHQscil7aWYoIXQpcmV0dXJuIG51bGw7dHJ5e3ZhciBhPXI/bmV3IFVSTCh0LHIpOm5ldyBVUkwodCk7aWYoZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh0KXtpZighdClyZXR1cm4hMTtzd2l0Y2godC5wcm90b2NvbCl7Y2FzZSJodHRwOiI6Y2FzZSJodHRwczoiOmNhc2UiZnRwOiI6Y2FzZSJtYWlsdG86IjpjYXNlInRlbDoiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fShhKSlyZXR1cm4gYX1jYXRjaCh0KXt9cmV0dXJuIG51bGx9O3IucmVtb3ZlTnVsbENoYXJhY3RlcnM9ZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnModCl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXt3YXJuKCJUaGUgYXJndW1lbnQgZm9yIHJlbW92ZU51bGxDaGFyYWN0ZXJzIG11c3QgYmUgYSBzdHJpbmcuIik7cmV0dXJuIHR9cmV0dXJuIHQucmVwbGFjZShnLCIiKX07ci5zZXRWZXJib3NpdHlMZXZlbD1mdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbCh0KXtOdW1iZXIuaXNJbnRlZ2VyKHQpJiYoaT10KX07ci5zaGFkb3c9c2hhZG93O3Iuc3RyaW5nMzI9ZnVuY3Rpb24gc3RyaW5nMzIodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodD4+MjQmMjU1LHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCl9O3Iuc3RyaW5nVG9CeXRlcz1zdHJpbmdUb0J5dGVzO3Iuc3RyaW5nVG9QREZTdHJpbmc9ZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcodCl7dmFyIHI9dC5sZW5ndGgsYT1bXTtpZigiw74iPT09dFswXSYmIsO/Ij09PXRbMV0pZm9yKHZhciBvPTI7bzxyO28rPTIpYS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZUF0KG8pPDw4fHQuY2hhckNvZGVBdChvKzEpKSk7ZWxzZSBpZigiw78iPT09dFswXSYmIsO+Ij09PXRbMV0pZm9yKHZhciBpPTI7aTxyO2krPTIpYS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZUF0KGkrMSk8PDh8dC5jaGFyQ29kZUF0KGkpKSk7ZWxzZSBmb3IodmFyIGw9MDtsPHI7KytsKXt2YXIgYz1DW3QuY2hhckNvZGVBdChsKV07YS5wdXNoKGM/U3RyaW5nLmZyb21DaGFyQ29kZShjKTp0LmNoYXJBdChsKSl9cmV0dXJuIGEuam9pbigiIil9O3Iuc3RyaW5nVG9VVEY4U3RyaW5nPWZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyh0KXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh0KSl9O3IudXRmOFN0cmluZ1RvU3RyaW5nPWZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyh0KXtyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQpKX07ci53YXJuPXdhcm47ci51bnJlYWNoYWJsZT11bnJlYWNoYWJsZTtyLklzRXZhbFN1cHBvcnRlZENhY2hlZD1yLklzTGl0dGxlRW5kaWFuQ2FjaGVkPXIuY3JlYXRlT2JqZWN0VVJMPXIuRm9ybWF0RXJyb3I9ci5VdGlsPXIuVW5rbm93bkVycm9yRXhjZXB0aW9uPXIuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uPXIuVGV4dFJlbmRlcmluZ01vZGU9ci5TdHJlYW1UeXBlPXIuUGVybWlzc2lvbkZsYWc9ci5QYXNzd29yZFJlc3BvbnNlcz1yLlBhc3N3b3JkRXhjZXB0aW9uPXIuTWlzc2luZ1BERkV4Y2VwdGlvbj1yLkludmFsaWRQREZFeGNlcHRpb249ci5BYm9ydEV4Y2VwdGlvbj1yLkNNYXBDb21wcmVzc2lvblR5cGU9ci5JbWFnZUtpbmQ9ci5Gb250VHlwZT1yLkFubm90YXRpb25UeXBlPXIuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlPXIuQW5ub3RhdGlvblJldmlld1N0YXRlPXIuQW5ub3RhdGlvblJlcGx5VHlwZT1yLkFubm90YXRpb25NYXJrZWRTdGF0ZT1yLkFubm90YXRpb25GbGFnPXIuQW5ub3RhdGlvbkZpZWxkRmxhZz1yLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9ci5VTlNVUFBPUlRFRF9GRUFUVVJFUz1yLlZlcmJvc2l0eUxldmVsPXIuT1BTPXIuSURFTlRJVFlfTUFUUklYPXIuRk9OVF9JREVOVElUWV9NQVRSSVg9ci5CYXNlRXhjZXB0aW9uPXZvaWQgMDthKDYpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxvPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgaT1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChvLGFyZ3VtZW50cyxpKX1lbHNlIGE9by5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1yLklERU5USVRZX01BVFJJWD1bMSwwLDAsMSwwLDBdO3IuRk9OVF9JREVOVElUWV9NQVRSSVg9Wy4wMDEsMCwwLC4wMDEsMCwwXTtyLlBlcm1pc3Npb25GbGFnPXtQUklOVDo0LE1PRElGWV9DT05URU5UUzo4LENPUFk6MTYsTU9ESUZZX0FOTk9UQVRJT05TOjMyLEZJTExfSU5URVJBQ1RJVkVfRk9STVM6MjU2LENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6NTEyLEFTU0VNQkxFOjEwMjQsUFJJTlRfSElHSF9RVUFMSVRZOjIwNDh9O3IuVGV4dFJlbmRlcmluZ01vZGU9e0ZJTEw6MCxTVFJPS0U6MSxGSUxMX1NUUk9LRToyLElOVklTSUJMRTozLEZJTExfQUREX1RPX1BBVEg6NCxTVFJPS0VfQUREX1RPX1BBVEg6NSxGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDo2LEFERF9UT19QQVRIOjcsRklMTF9TVFJPS0VfTUFTSzozLEFERF9UT19QQVRIX0ZMQUc6NH07ci5JbWFnZUtpbmQ9e0dSQVlTQ0FMRV8xQlBQOjEsUkdCXzI0QlBQOjIsUkdCQV8zMkJQUDozfTtyLkFubm90YXRpb25UeXBlPXtURVhUOjEsTElOSzoyLEZSRUVURVhUOjMsTElORTo0LFNRVUFSRTo1LENJUkNMRTo2LFBPTFlHT046NyxQT0xZTElORTo4LEhJR0hMSUdIVDo5LFVOREVSTElORToxMCxTUVVJR0dMWToxMSxTVFJJS0VPVVQ6MTIsU1RBTVA6MTMsQ0FSRVQ6MTQsSU5LOjE1LFBPUFVQOjE2LEZJTEVBVFRBQ0hNRU5UOjE3LFNPVU5EOjE4LE1PVklFOjE5LFdJREdFVDoyMCxTQ1JFRU46MjEsUFJJTlRFUk1BUks6MjIsVFJBUE5FVDoyMyxXQVRFUk1BUks6MjQsVEhSRUVEOjI1LFJFREFDVDoyNn07ci5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGU9e01BUktFRDoiTWFya2VkIixSRVZJRVc6IlJldmlldyJ9O3IuQW5ub3RhdGlvbk1hcmtlZFN0YXRlPXtNQVJLRUQ6Ik1hcmtlZCIsVU5NQVJLRUQ6IlVubWFya2VkIn07ci5Bbm5vdGF0aW9uUmV2aWV3U3RhdGU9e0FDQ0VQVEVEOiJBY2NlcHRlZCIsUkVKRUNURUQ6IlJlamVjdGVkIixDQU5DRUxMRUQ6IkNhbmNlbGxlZCIsQ09NUExFVEVEOiJDb21wbGV0ZWQiLE5PTkU6Ik5vbmUifTtyLkFubm90YXRpb25SZXBseVR5cGU9e0dST1VQOiJHcm91cCIsUkVQTFk6IlIifTtyLkFubm90YXRpb25GbGFnPXtJTlZJU0lCTEU6MSxISURERU46MixQUklOVDo0LE5PWk9PTTo4LE5PUk9UQVRFOjE2LE5PVklFVzozMixSRUFET05MWTo2NCxMT0NLRUQ6MTI4LFRPR0dMRU5PVklFVzoyNTYsTE9DS0VEQ09OVEVOVFM6NTEyfTtyLkFubm90YXRpb25GaWVsZEZsYWc9e1JFQURPTkxZOjEsUkVRVUlSRUQ6MixOT0VYUE9SVDo0LE1VTFRJTElORTo0MDk2LFBBU1NXT1JEOjgxOTIsTk9UT0dHTEVUT09GRjoxNjM4NCxSQURJTzozMjc2OCxQVVNIQlVUVE9OOjY1NTM2LENPTUJPOjEzMTA3MixFRElUOjI2MjE0NCxTT1JUOjUyNDI4OCxGSUxFU0VMRUNUOjEwNDg1NzYsTVVMVElTRUxFQ1Q6MjA5NzE1MixET05PVFNQRUxMQ0hFQ0s6NDE5NDMwNCxET05PVFNDUk9MTDo4Mzg4NjA4LENPTUI6MTY3NzcyMTYsUklDSFRFWFQ6MzM1NTQ0MzIsUkFESU9TSU5VTklTT046MzM1NTQ0MzIsQ09NTUlUT05TRUxDSEFOR0U6NjcxMDg4NjR9O3IuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZT17U09MSUQ6MSxEQVNIRUQ6MixCRVZFTEVEOjMsSU5TRVQ6NCxVTkRFUkxJTkU6NX07ci5TdHJlYW1UeXBlPXtVTktOT1dOOiJVTktOT1dOIixGTEFURToiRkxBVEUiLExaVzoiTFpXIixEQ1Q6IkRDVCIsSlBYOiJKUFgiLEpCSUc6IkpCSUciLEE4NToiQTg1IixBSFg6IkFIWCIsQ0NGOiJDQ0YiLFJMWDoiUkxYIn07ci5Gb250VHlwZT17VU5LTk9XTjoiVU5LTk9XTiIsVFlQRTE6IlRZUEUxIixUWVBFMUM6IlRZUEUxQyIsQ0lERk9OVFRZUEUwOiJDSURGT05UVFlQRTAiLENJREZPTlRUWVBFMEM6IkNJREZPTlRUWVBFMEMiLFRSVUVUWVBFOiJUUlVFVFlQRSIsQ0lERk9OVFRZUEUyOiJDSURGT05UVFlQRTIiLFRZUEUzOiJUWVBFMyIsT1BFTlRZUEU6Ik9QRU5UWVBFIixUWVBFMDoiVFlQRTAiLE1NVFlQRTE6Ik1NVFlQRTEifTt2YXIgbz17RVJST1JTOjAsV0FSTklOR1M6MSxJTkZPUzo1fTtyLlZlcmJvc2l0eUxldmVsPW87ci5DTWFwQ29tcHJlc3Npb25UeXBlPXtOT05FOjAsQklOQVJZOjEsU1RSRUFNOjJ9O3IuT1BTPXtkZXBlbmRlbmN5OjEsc2V0TGluZVdpZHRoOjIsc2V0TGluZUNhcDozLHNldExpbmVKb2luOjQsc2V0TWl0ZXJMaW1pdDo1LHNldERhc2g6NixzZXRSZW5kZXJpbmdJbnRlbnQ6NyxzZXRGbGF0bmVzczo4LHNldEdTdGF0ZTo5LHNhdmU6MTAscmVzdG9yZToxMSx0cmFuc2Zvcm06MTIsbW92ZVRvOjEzLGxpbmVUbzoxNCxjdXJ2ZVRvOjE1LGN1cnZlVG8yOjE2LGN1cnZlVG8zOjE3LGNsb3NlUGF0aDoxOCxyZWN0YW5nbGU6MTksc3Ryb2tlOjIwLGNsb3NlU3Ryb2tlOjIxLGZpbGw6MjIsZW9GaWxsOjIzLGZpbGxTdHJva2U6MjQsZW9GaWxsU3Ryb2tlOjI1LGNsb3NlRmlsbFN0cm9rZToyNixjbG9zZUVPRmlsbFN0cm9rZToyNyxlbmRQYXRoOjI4LGNsaXA6MjksZW9DbGlwOjMwLGJlZ2luVGV4dDozMSxlbmRUZXh0OjMyLHNldENoYXJTcGFjaW5nOjMzLHNldFdvcmRTcGFjaW5nOjM0LHNldEhTY2FsZTozNSxzZXRMZWFkaW5nOjM2LHNldEZvbnQ6Mzcsc2V0VGV4dFJlbmRlcmluZ01vZGU6Mzgsc2V0VGV4dFJpc2U6MzksbW92ZVRleHQ6NDAsc2V0TGVhZGluZ01vdmVUZXh0OjQxLHNldFRleHRNYXRyaXg6NDIsbmV4dExpbmU6NDMsc2hvd1RleHQ6NDQsc2hvd1NwYWNlZFRleHQ6NDUsbmV4dExpbmVTaG93VGV4dDo0NixuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDo0NyxzZXRDaGFyV2lkdGg6NDgsc2V0Q2hhcldpZHRoQW5kQm91bmRzOjQ5LHNldFN0cm9rZUNvbG9yU3BhY2U6NTAsc2V0RmlsbENvbG9yU3BhY2U6NTEsc2V0U3Ryb2tlQ29sb3I6NTIsc2V0U3Ryb2tlQ29sb3JOOjUzLHNldEZpbGxDb2xvcjo1NCxzZXRGaWxsQ29sb3JOOjU1LHNldFN0cm9rZUdyYXk6NTYsc2V0RmlsbEdyYXk6NTcsc2V0U3Ryb2tlUkdCQ29sb3I6NTgsc2V0RmlsbFJHQkNvbG9yOjU5LHNldFN0cm9rZUNNWUtDb2xvcjo2MCxzZXRGaWxsQ01ZS0NvbG9yOjYxLHNoYWRpbmdGaWxsOjYyLGJlZ2luSW5saW5lSW1hZ2U6NjMsYmVnaW5JbWFnZURhdGE6NjQsZW5kSW5saW5lSW1hZ2U6NjUscGFpbnRYT2JqZWN0OjY2LG1hcmtQb2ludDo2NyxtYXJrUG9pbnRQcm9wczo2OCxiZWdpbk1hcmtlZENvbnRlbnQ6NjksYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6NzAsZW5kTWFya2VkQ29udGVudDo3MSxiZWdpbkNvbXBhdDo3MixlbmRDb21wYXQ6NzMscGFpbnRGb3JtWE9iamVjdEJlZ2luOjc0LHBhaW50Rm9ybVhPYmplY3RFbmQ6NzUsYmVnaW5Hcm91cDo3NixlbmRHcm91cDo3NyxiZWdpbkFubm90YXRpb25zOjc4LGVuZEFubm90YXRpb25zOjc5LGJlZ2luQW5ub3RhdGlvbjo4MCxlbmRBbm5vdGF0aW9uOjgxLHBhaW50SnBlZ1hPYmplY3Q6ODIscGFpbnRJbWFnZU1hc2tYT2JqZWN0OjgzLHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOjg0LHBhaW50SW1hZ2VYT2JqZWN0Ojg1LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0Ojg2LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6ODcscGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6ODgscGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0Ojg5LHBhaW50U29saWRDb2xvckltYWdlTWFzazo5MCxjb25zdHJ1Y3RQYXRoOjkxfTtyLlVOU1VQUE9SVEVEX0ZFQVRVUkVTPXt1bmtub3duOiJ1bmtub3duIixmb3JtczoiZm9ybXMiLGphdmFTY3JpcHQ6ImphdmFTY3JpcHQiLHNtYXNrOiJzbWFzayIsc2hhZGluZ1BhdHRlcm46InNoYWRpbmdQYXR0ZXJuIixmb250OiJmb250IixlcnJvclRpbGluZ1BhdHRlcm46ImVycm9yVGlsaW5nUGF0dGVybiIsZXJyb3JFeHRHU3RhdGU6ImVycm9yRXh0R1N0YXRlIixlcnJvclhPYmplY3Q6ImVycm9yWE9iamVjdCIsZXJyb3JGb250TG9hZFR5cGUzOiJlcnJvckZvbnRMb2FkVHlwZTMiLGVycm9yRm9udFN0YXRlOiJlcnJvckZvbnRTdGF0ZSIsZXJyb3JGb250TWlzc2luZzoiZXJyb3JGb250TWlzc2luZyIsZXJyb3JGb250VHJhbnNsYXRlOiJlcnJvckZvbnRUcmFuc2xhdGUiLGVycm9yQ29sb3JTcGFjZToiZXJyb3JDb2xvclNwYWNlIixlcnJvck9wZXJhdG9yTGlzdDoiZXJyb3JPcGVyYXRvckxpc3QiLGVycm9yRm9udFRvVW5pY29kZToiZXJyb3JGb250VG9Vbmljb2RlIixlcnJvckZvbnRMb2FkTmF0aXZlOiJlcnJvckZvbnRMb2FkTmF0aXZlIixlcnJvckZvbnRHZXRQYXRoOiJlcnJvckZvbnRHZXRQYXRoIixlcnJvck1hcmtlZENvbnRlbnQ6ImVycm9yTWFya2VkQ29udGVudCJ9O3IuUGFzc3dvcmRSZXNwb25zZXM9e05FRURfUEFTU1dPUkQ6MSxJTkNPUlJFQ1RfUEFTU1dPUkQ6Mn07dmFyIGk9by5XQVJOSU5HUztmdW5jdGlvbiB3YXJuKHQpe2k+PW8uV0FSTklOR1MmJmNvbnNvbGUubG9nKCJXYXJuaW5nOiAiLmNvbmNhdCh0KSl9ZnVuY3Rpb24gdW5yZWFjaGFibGUodCl7dGhyb3cgbmV3IEVycm9yKHQpfWZ1bmN0aW9uIGFzc2VydCh0LHIpe3R8fHVucmVhY2hhYmxlKHIpfWZ1bmN0aW9uIHNoYWRvdyh0LHIsYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQscix7dmFsdWU6YSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMX0pO3JldHVybiBhfXZhciBsPWZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCl7ZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbih0KXt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZUV4Y2VwdGlvbiYmdW5yZWFjaGFibGUoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uIik7dGhpcy5tZXNzYWdlPXQ7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZX1CYXNlRXhjZXB0aW9uLnByb3RvdHlwZT1uZXcgRXJyb3I7QmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3Rvcj1CYXNlRXhjZXB0aW9uO3JldHVybiBCYXNlRXhjZXB0aW9ufSgpO3IuQmFzZUV4Y2VwdGlvbj1sO3ZhciBjPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhQYXNzd29yZEV4Y2VwdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoUGFzc3dvcmRFeGNlcHRpb24pO2Z1bmN0aW9uIFBhc3N3b3JkRXhjZXB0aW9uKHQsYSl7dmFyIG87X2NsYXNzQ2FsbENoZWNrKHRoaXMsUGFzc3dvcmRFeGNlcHRpb24pOyhvPXIuY2FsbCh0aGlzLHQpKS5jb2RlPWE7cmV0dXJuIG99cmV0dXJuIFBhc3N3b3JkRXhjZXB0aW9ufShsKTtyLlBhc3N3b3JkRXhjZXB0aW9uPWM7dmFyIHU9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFVua25vd25FcnJvckV4Y2VwdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoVW5rbm93bkVycm9yRXhjZXB0aW9uKTtmdW5jdGlvbiBVbmtub3duRXJyb3JFeGNlcHRpb24odCxhKXt2YXIgbztfY2xhc3NDYWxsQ2hlY2sodGhpcyxVbmtub3duRXJyb3JFeGNlcHRpb24pOyhvPXIuY2FsbCh0aGlzLHQpKS5kZXRhaWxzPWE7cmV0dXJuIG99cmV0dXJuIFVua25vd25FcnJvckV4Y2VwdGlvbn0obCk7ci5Vbmtub3duRXJyb3JFeGNlcHRpb249dTt2YXIgZD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoSW52YWxpZFBERkV4Y2VwdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoSW52YWxpZFBERkV4Y2VwdGlvbik7ZnVuY3Rpb24gSW52YWxpZFBERkV4Y2VwdGlvbigpe19jbGFzc0NhbGxDaGVjayh0aGlzLEludmFsaWRQREZFeGNlcHRpb24pO3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSW52YWxpZFBERkV4Y2VwdGlvbn0obCk7ci5JbnZhbGlkUERGRXhjZXB0aW9uPWQ7dmFyIGg9ZnVuY3Rpb24odCl7X2luaGVyaXRzKE1pc3NpbmdQREZFeGNlcHRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKE1pc3NpbmdQREZFeGNlcHRpb24pO2Z1bmN0aW9uIE1pc3NpbmdQREZFeGNlcHRpb24oKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxNaXNzaW5nUERGRXhjZXB0aW9uKTtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE1pc3NpbmdQREZFeGNlcHRpb259KGwpO3IuTWlzc2luZ1BERkV4Y2VwdGlvbj1oO3ZhciBwPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbik7ZnVuY3Rpb24gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHQsYSl7dmFyIG87X2NsYXNzQ2FsbENoZWNrKHRoaXMsVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKTsobz1yLmNhbGwodGhpcyx0KSkuc3RhdHVzPWE7cmV0dXJuIG99cmV0dXJuIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbn0obCk7ci5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249cDt2YXIgbT1mdW5jdGlvbih0KXtfaW5oZXJpdHMoRm9ybWF0RXJyb3IsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKEZvcm1hdEVycm9yKTtmdW5jdGlvbiBGb3JtYXRFcnJvcigpe19jbGFzc0NhbGxDaGVjayh0aGlzLEZvcm1hdEVycm9yKTtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIEZvcm1hdEVycm9yfShsKTtyLkZvcm1hdEVycm9yPW07dmFyIHY9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEFib3J0RXhjZXB0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihBYm9ydEV4Y2VwdGlvbik7ZnVuY3Rpb24gQWJvcnRFeGNlcHRpb24oKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxBYm9ydEV4Y2VwdGlvbik7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBBYm9ydEV4Y2VwdGlvbn0obCk7ci5BYm9ydEV4Y2VwdGlvbj12O3ZhciBnPS9ceDAwL2c7ZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyh0KXthc3NlcnQoInN0cmluZyI9PXR5cGVvZiB0LCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzIik7Zm9yKHZhciByPXQubGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkociksbz0wO288cjsrK28pYVtvXT0yNTUmdC5jaGFyQ29kZUF0KG8pO3JldHVybiBhfWZ1bmN0aW9uIGFycmF5Qnl0ZUxlbmd0aCh0KXtpZih2b2lkIDAhPT10Lmxlbmd0aClyZXR1cm4gdC5sZW5ndGg7YXNzZXJ0KHZvaWQgMCE9PXQuYnl0ZUxlbmd0aCwiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC4iKTtyZXR1cm4gdC5ieXRlTGVuZ3RofXZhciB5PXtnZXQgdmFsdWUoKXtyZXR1cm4gc2hhZG93KHRoaXMsInZhbHVlIixmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpe3ZhciB0PW5ldyBVaW50OEFycmF5KDQpO3RbMF09MTtyZXR1cm4gMT09PW5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlciwwLDEpWzBdfSgpKX19O3IuSXNMaXR0bGVFbmRpYW5DYWNoZWQ9eTt2YXIgYj17Z2V0IHZhbHVlKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJ2YWx1ZSIsZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCl7dHJ5e25ldyBGdW5jdGlvbigiIik7cmV0dXJuITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpKX19O3IuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkPWI7dmFyIF89WyJyZ2IoIiwwLCIsIiwwLCIsIiwwLCIpIl0sUz1mdW5jdGlvbigpe2Z1bmN0aW9uIFV0aWwoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxVdGlsKX0hZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fShVdGlsLG51bGwsW3trZXk6Im1ha2VDc3NSZ2IiLHZhbHVlOmZ1bmN0aW9uIG1ha2VDc3NSZ2IodCxyLGEpe19bMV09dDtfWzNdPXI7X1s1XT1hO3JldHVybiBfLmpvaW4oIiIpfX0se2tleToidHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiB0cmFuc2Zvcm0odCxyKXtyZXR1cm5bdFswXSpyWzBdK3RbMl0qclsxXSx0WzFdKnJbMF0rdFszXSpyWzFdLHRbMF0qclsyXSt0WzJdKnJbM10sdFsxXSpyWzJdK3RbM10qclszXSx0WzBdKnJbNF0rdFsyXSpyWzVdK3RbNF0sdFsxXSpyWzRdK3RbM10qcls1XSt0WzVdXX19LHtrZXk6ImFwcGx5VHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiBhcHBseVRyYW5zZm9ybSh0LHIpe3JldHVyblt0WzBdKnJbMF0rdFsxXSpyWzJdK3JbNF0sdFswXSpyWzFdK3RbMV0qclszXStyWzVdXX19LHtrZXk6ImFwcGx5SW52ZXJzZVRyYW5zZm9ybSIsdmFsdWU6ZnVuY3Rpb24gYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHQscil7dmFyIGE9clswXSpyWzNdLXJbMV0qclsyXTtyZXR1cm5bKHRbMF0qclszXS10WzFdKnJbMl0rclsyXSpyWzVdLXJbNF0qclszXSkvYSwoLXRbMF0qclsxXSt0WzFdKnJbMF0rcls0XSpyWzFdLXJbNV0qclswXSkvYV19fSx7a2V5OiJnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24gZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3godCxyKXt2YXIgYT1VdGlsLmFwcGx5VHJhbnNmb3JtKHQsciksbz1VdGlsLmFwcGx5VHJhbnNmb3JtKHQuc2xpY2UoMiw0KSxyKSxpPVV0aWwuYXBwbHlUcmFuc2Zvcm0oW3RbMF0sdFszXV0sciksbD1VdGlsLmFwcGx5VHJhbnNmb3JtKFt0WzJdLHRbMV1dLHIpO3JldHVybltNYXRoLm1pbihhWzBdLG9bMF0saVswXSxsWzBdKSxNYXRoLm1pbihhWzFdLG9bMV0saVsxXSxsWzFdKSxNYXRoLm1heChhWzBdLG9bMF0saVswXSxsWzBdKSxNYXRoLm1heChhWzFdLG9bMV0saVsxXSxsWzFdKV19fSx7a2V5OiJpbnZlcnNlVHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiBpbnZlcnNlVHJhbnNmb3JtKHQpe3ZhciByPXRbMF0qdFszXS10WzFdKnRbMl07cmV0dXJuW3RbM10vciwtdFsxXS9yLC10WzJdL3IsdFswXS9yLCh0WzJdKnRbNV0tdFs0XSp0WzNdKS9yLCh0WzRdKnRbMV0tdFs1XSp0WzBdKS9yXX19LHtrZXk6ImFwcGx5M2RUcmFuc2Zvcm0iLHZhbHVlOmZ1bmN0aW9uIGFwcGx5M2RUcmFuc2Zvcm0odCxyKXtyZXR1cm5bdFswXSpyWzBdK3RbMV0qclsxXSt0WzJdKnJbMl0sdFszXSpyWzBdK3RbNF0qclsxXSt0WzVdKnJbMl0sdFs2XSpyWzBdK3RbN10qclsxXSt0WzhdKnJbMl1dfX0se2tleToic2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUiLHZhbHVlOmZ1bmN0aW9uIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHQpe3ZhciByPVt0WzBdLHRbMl0sdFsxXSx0WzNdXSxhPXRbMF0qclswXSt0WzFdKnJbMl0sbz10WzBdKnJbMV0rdFsxXSpyWzNdLGk9dFsyXSpyWzBdK3RbM10qclsyXSxsPXRbMl0qclsxXSt0WzNdKnJbM10sYz0oYStsKS8yLHU9TWF0aC5zcXJ0KChhK2wpKihhK2wpLTQqKGEqbC1pKm8pKS8yLGQ9Yyt1fHwxLGg9Yy11fHwxO3JldHVybltNYXRoLnNxcnQoZCksTWF0aC5zcXJ0KGgpXX19LHtrZXk6Im5vcm1hbGl6ZVJlY3QiLHZhbHVlOmZ1bmN0aW9uIG5vcm1hbGl6ZVJlY3QodCl7dmFyIHI9dC5zbGljZSgwKTtpZih0WzBdPnRbMl0pe3JbMF09dFsyXTtyWzJdPXRbMF19aWYodFsxXT50WzNdKXtyWzFdPXRbM107clszXT10WzFdfXJldHVybiByfX0se2tleToiaW50ZXJzZWN0Iix2YWx1ZTpmdW5jdGlvbiBpbnRlcnNlY3QodCxyKXtmdW5jdGlvbiBjb21wYXJlKHQscil7cmV0dXJuIHQtcn12YXIgYT1bdFswXSx0WzJdLHJbMF0sclsyXV0uc29ydChjb21wYXJlKSxvPVt0WzFdLHRbM10sclsxXSxyWzNdXS5zb3J0KGNvbXBhcmUpLGk9W107dD1VdGlsLm5vcm1hbGl6ZVJlY3QodCk7cj1VdGlsLm5vcm1hbGl6ZVJlY3Qocik7aWYoIShhWzBdPT09dFswXSYmYVsxXT09PXJbMF18fGFbMF09PT1yWzBdJiZhWzFdPT09dFswXSkpcmV0dXJuIG51bGw7aVswXT1hWzFdO2lbMl09YVsyXTtpZighKG9bMF09PT10WzFdJiZvWzFdPT09clsxXXx8b1swXT09PXJbMV0mJm9bMV09PT10WzFdKSlyZXR1cm4gbnVsbDtpWzFdPW9bMV07aVszXT1vWzJdO3JldHVybiBpfX1dKTtyZXR1cm4gVXRpbH0oKTtyLlV0aWw9Uzt2YXIgQz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzI4LDcxMSw3MTAsNzI5LDczMyw3MzEsNzMwLDczMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MjI2LDgyMjQsODIyNSw4MjMwLDgyMTIsODIxMSw0MDIsODI2MCw4MjQ5LDgyNTAsODcyMiw4MjQwLDgyMjIsODIyMCw4MjIxLDgyMTYsODIxNyw4MjE4LDg0ODIsNjQyNTcsNjQyNTgsMzIxLDMzOCwzNTIsMzc2LDM4MSwzMDUsMzIyLDMzOSwzNTMsMzgyLDAsODM2NF07dmFyIEE9ZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMQ2xvc3VyZSgpe3ZhciB0PSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7cmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChyLGEpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07aWYoIW8mJlVSTC5jcmVhdGVPYmplY3RVUkwpe3ZhciBpPW5ldyBCbG9iKFtyXSx7dHlwZTphfSk7cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoaSl9Zm9yKHZhciBsPSJkYXRhOiIuY29uY2F0KGEsIjtiYXNlNjQsIiksYz0wLHU9ci5sZW5ndGg7Yzx1O2MrPTMpe3ZhciBkPTI1NSZyW2NdLGg9MjU1JnJbYysxXSxwPTI1NSZyW2MrMl0sbT1kPj4yLHY9KDMmZCk8PDR8aD4+NCxnPWMrMTx1PygxNSZoKTw8MnxwPj42OjY0LHk9YysyPHU/NjMmcDo2NDtsKz10W21dK3Rbdl0rdFtnXSt0W3ldfXJldHVybiBsfX0oKTtyLmNyZWF0ZU9iamVjdFVSTD1BfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoNyk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1pZigidW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbFRoaXN8fCFnbG9iYWxUaGlzLl9wZGZqc0NvbXBhdGliaWxpdHlDaGVja2VkKXsidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMuTWF0aD09PU1hdGh8fChnbG9iYWxUaGlzPWEoOCkpO2dsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQ9ITA7dmFyIGk9Im9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3c/InVuZGVmaW5lZCI6X3R5cGVvZih3aW5kb3cpKSYmIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudD8idW5kZWZpbmVkIjpfdHlwZW9mKGRvY3VtZW50KSksbD0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yLnVzZXJBZ2VudHx8IiIsYz0vVHJpZGVudC8udGVzdChsKTshZnVuY3Rpb24gY2hlY2tOb2RlQnRvYSgpeyFnbG9iYWxUaGlzLmJ0b2EmJm8uaXNOb2RlSlMmJihnbG9iYWxUaGlzLmJ0b2E9ZnVuY3Rpb24odCl7cmV0dXJuIEJ1ZmZlci5mcm9tKHQsImJpbmFyeSIpLnRvU3RyaW5nKCJiYXNlNjQiKX0pfSgpOyFmdW5jdGlvbiBjaGVja05vZGVBdG9iKCl7IWdsb2JhbFRoaXMuYXRvYiYmby5pc05vZGVKUyYmKGdsb2JhbFRoaXMuYXRvYj1mdW5jdGlvbih0KXtyZXR1cm4gQnVmZmVyLmZyb20odCwiYmFzZTY0IikudG9TdHJpbmcoImJpbmFyeSIpfSl9KCk7IWZ1bmN0aW9uIGNoZWNrQ2hpbGROb2RlUmVtb3ZlKCl7aSYmdm9pZCAwPT09RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlJiYoRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyl9KX0oKTshZnVuY3Rpb24gY2hlY2tET01Ub2tlbkxpc3RBZGRSZW1vdmUoKXtpZihpJiYhby5pc05vZGVKUyl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc0xpc3QuYWRkKCJ0ZXN0T25lIiwidGVzdFR3byIpO2lmKCEwIT09dC5jbGFzc0xpc3QuY29udGFpbnMoInRlc3RPbmUiKXx8ITAhPT10LmNsYXNzTGlzdC5jb250YWlucygidGVzdFR3byIpKXt2YXIgcj1ET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCxhPURPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO0RPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkodCksbz0wO288dDtvKyspYVtvXT1hcmd1bWVudHNbb107Zm9yKHZhciBpPTAsbD1hO2k8bC5sZW5ndGg7aSsrKXt2YXIgYz1sW2ldO3IuY2FsbCh0aGlzLGMpfX07RE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheSh0KSxvPTA7bzx0O28rKylyW29dPWFyZ3VtZW50c1tvXTtmb3IodmFyIGk9MCxsPXI7aTxsLmxlbmd0aDtpKyspe3ZhciBjPWxbaV07YS5jYWxsKHRoaXMsYyl9fX19fSgpOyFmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpe2lmKGkmJiFvLmlzTm9kZUpTKXshMSE9PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmNsYXNzTGlzdC50b2dnbGUoInRlc3QiLDApJiYoRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24odCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xPyEhYXJndW1lbnRzWzFdOiF0aGlzLmNvbnRhaW5zKHQpO3JldHVybiB0aGlzW3I/ImFkZCI6InJlbW92ZSJdKHQpLHJ9KX19KCk7IWZ1bmN0aW9uIGNoZWNrV2luZG93SGlzdG9yeVB1c2hTdGF0ZVJlcGxhY2VTdGF0ZSgpe2lmKGkmJmMpe3ZhciB0PXdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSxyPXdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZTt3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU9ZnVuY3Rpb24ocixhLG8pe3ZhciBpPXZvaWQgMD09PW8/W3IsYV06W3IsYSxvXTt0LmFwcGx5KHRoaXMsaSl9O3dpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZT1mdW5jdGlvbih0LGEsbyl7dmFyIGk9dm9pZCAwPT09bz9bdCxhXTpbdCxhLG9dO3IuYXBwbHkodGhpcyxpKX19fSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ1N0YXJ0c1dpdGgoKXtTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGh8fGEoNTMpfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ0VuZHNXaXRoKCl7U3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aHx8YSg2NCl9KCk7IWZ1bmN0aW9uIGNoZWNrU3RyaW5nSW5jbHVkZXMoKXtTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzfHxhKDY2KX0oKTshZnVuY3Rpb24gY2hlY2tBcnJheUluY2x1ZGVzKCl7QXJyYXkucHJvdG90eXBlLmluY2x1ZGVzfHxhKDY4KX0oKTshZnVuY3Rpb24gY2hlY2tBcnJheUZyb20oKXtBcnJheS5mcm9tfHxhKDc2KX0oKTshZnVuY3Rpb24gY2hlY2tPYmplY3RBc3NpZ24oKXtPYmplY3QuYXNzaWdufHxhKDk4KX0oKTshZnVuY3Rpb24gY2hlY2tPYmplY3RGcm9tRW50cmllcygpe09iamVjdC5mcm9tRW50cmllc3x8YSgxMDEpfSgpOyFmdW5jdGlvbiBjaGVja01hdGhMb2cyKCl7TWF0aC5sb2cyfHwoTWF0aC5sb2cyPWEoMTA1KSl9KCk7IWZ1bmN0aW9uIGNoZWNrTnVtYmVySXNOYU4oKXtOdW1iZXIuaXNOYU58fChOdW1iZXIuaXNOYU49YSgxMDcpKX0oKTshZnVuY3Rpb24gY2hlY2tOdW1iZXJJc0ludGVnZXIoKXtOdW1iZXIuaXNJbnRlZ2VyfHwoTnVtYmVyLmlzSW50ZWdlcj1hKDEwOSkpfSgpOyFmdW5jdGlvbiBjaGVja1R5cGVkQXJyYXlTbGljZSgpe1VpbnQ4QXJyYXkucHJvdG90eXBlLnNsaWNlfHxhKDExMil9KCk7IWZ1bmN0aW9uIGNoZWNrUHJvbWlzZSgpe2dsb2JhbFRoaXMuUHJvbWlzZSYmZ2xvYmFsVGhpcy5Qcm9taXNlLmFsbFNldHRsZWR8fChnbG9iYWxUaGlzLlByb21pc2U9YSgxMTcpKX0oKTshZnVuY3Rpb24gY2hlY2tVUkwoKXtnbG9iYWxUaGlzLlVSTD1hKDEzOCl9KCk7IWZ1bmN0aW9uIGNoZWNrUmVhZGFibGVTdHJlYW0oKXt2YXIgdD0hMTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFJlYWRhYmxlU3RyZWFtKXRyeXtuZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0OmZ1bmN0aW9uIHN0YXJ0KHQpe3QuY2xvc2UoKX19KTt0PSEwfWNhdGNoKHQpe310fHwoZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbT1hKDE0NSkuUmVhZGFibGVTdHJlYW0pfSgpOyFmdW5jdGlvbiBjaGVja01hcEVudHJpZXMoKXtnbG9iYWxUaGlzLk1hcCYmZ2xvYmFsVGhpcy5NYXAucHJvdG90eXBlLmVudHJpZXN8fChnbG9iYWxUaGlzLk1hcD1hKDE0NikpfSgpOyFmdW5jdGlvbiBjaGVja1NldEVudHJpZXMoKXtnbG9iYWxUaGlzLlNldCYmZ2xvYmFsVGhpcy5TZXQucHJvdG90eXBlLmVudHJpZXN8fChnbG9iYWxUaGlzLlNldD1hKDE1MykpfSgpOyFmdW5jdGlvbiBjaGVja1dlYWtNYXAoKXtnbG9iYWxUaGlzLldlYWtNYXB8fChnbG9iYWxUaGlzLldlYWtNYXA9YSgxNTUpKX0oKTshZnVuY3Rpb24gY2hlY2tXZWFrU2V0KCl7Z2xvYmFsVGhpcy5XZWFrU2V0fHwoZ2xvYmFsVGhpcy5XZWFrU2V0PWEoMTYxKSl9KCk7IWZ1bmN0aW9uIGNoZWNrU3RyaW5nQ29kZVBvaW50QXQoKXtTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0fHxhKDE2Myl9KCk7IWZ1bmN0aW9uIGNoZWNrU3RyaW5nRnJvbUNvZGVQb2ludCgpe1N0cmluZy5mcm9tQ29kZVBvaW50fHwoU3RyaW5nLmZyb21Db2RlUG9pbnQ9YSgxNjUpKX0oKTshZnVuY3Rpb24gY2hlY2tTeW1ib2woKXtnbG9iYWxUaGlzLlN5bWJvbHx8YSgxNjcpfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ1BhZFN0YXJ0KCl7U3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydHx8YSgxOTApfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ1BhZEVuZCgpe1N0cmluZy5wcm90b3R5cGUucGFkRW5kfHxhKDE5NSl9KCk7IWZ1bmN0aW9uIGNoZWNrT2JqZWN0VmFsdWVzKCl7T2JqZWN0LnZhbHVlc3x8KE9iamVjdC52YWx1ZXM9YSgxOTcpKX0oKTshZnVuY3Rpb24gY2hlY2tPYmplY3RFbnRyaWVzKCl7T2JqZWN0LmVudHJpZXN8fChPYmplY3QuZW50cmllcz1hKDIwMCkpfSgpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5pc05vZGVKUz12b2lkIDA7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX12YXIgbz0hKCJvYmplY3QiIT09KCJ1bmRlZmluZWQiPT10eXBlb2YgcHJvY2Vzcz8idW5kZWZpbmVkIjpfdHlwZW9mKHByb2Nlc3MpKXx8cHJvY2VzcysiIiE9IltvYmplY3QgcHJvY2Vzc10ifHxwcm9jZXNzLnZlcnNpb25zLm53fHxwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uJiZwcm9jZXNzLnR5cGUmJiJicm93c2VyIiE9PXByb2Nlc3MudHlwZSk7ci5pc05vZGVKUz1vfSxmdW5jdGlvbih0LHIsYSl7YSg5KTt0LmV4cG9ydHM9YSgxMSl9LGZ1bmN0aW9uKHQscixhKXthKDEwKSh7Z2xvYmFsOiEwfSx7Z2xvYmFsVGhpczphKDExKX0pfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMSksaT1hKDEyKS5mLGw9YSgyNiksYz1hKDI5KSx1PWEoMzApLGQ9YSg0MCksaD1hKDUyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXt2YXIgYSxwLG0sdixnLHk9dC50YXJnZXQsYj10Lmdsb2JhbCxfPXQuc3RhdDtpZihhPWI/bzpfP29beV18fHUoeSx7fSk6KG9beV18fHt9KS5wcm90b3R5cGUpZm9yKHAgaW4gcil7dj1yW3BdO209dC5ub1RhcmdldEdldD8oZz1pKGEscCkpJiZnLnZhbHVlOmFbcF07aWYoIWgoYj9wOnkrKF8/Ii4iOiIjIikrcCx0LmZvcmNlZCkmJnZvaWQgMCE9PW0pe2lmKHR5cGVvZiB2PT10eXBlb2YgbSljb250aW51ZTtkKHYsbSl9KHQuc2hhbXx8bSYmbS5zaGFtKSYmbCh2LCJzaGFtIiwhMCk7YyhhLHAsdix0KX19fSxmdW5jdGlvbih0LHIpe3ZhciBjaGVjaz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5NYXRoPT1NYXRoJiZ0fTt0LmV4cG9ydHM9Y2hlY2soIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzKXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyl8fGNoZWNrKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZil8fGNoZWNrKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwpfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMyksaT1hKDE1KSxsPWEoMTYpLGM9YSgxNyksdT1hKDIxKSxkPWEoMjMpLGg9YSgyNCkscD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO3IuZj1vP3A6ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscil7dD1jKHQpO3I9dShyLCEwKTtpZihoKXRyeXtyZXR1cm4gcCh0LHIpfWNhdGNoKHQpe31pZihkKHQscikpcmV0dXJuIGwoIWkuZi5jYWxsKHQsciksdFtyXSl9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxNCk7dC5leHBvcnRzPSFvKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sMSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSlbMV19KSl9LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLGk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixsPWkmJiFvLmNhbGwoezE6Mn0sMSk7ci5mPWw/ZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUodCl7dmFyIHI9aSh0aGlzLHQpO3JldHVybiEhciYmci5lbnVtZXJhYmxlfTpvfSxmdW5jdGlvbih0LHIpe3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTpyfX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDE4KSxpPWEoMjApO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbyhpKHQpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDE0KSxpPWEoMTkpLGw9IiIuc3BsaXQ7dC5leHBvcnRzPW8oKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSkpP2Z1bmN0aW9uKHQpe3JldHVybiJTdHJpbmciPT1pKHQpP2wuY2FsbCh0LCIiKTpPYmplY3QodCl9Ok9iamVjdH0sZnVuY3Rpb24odCxyKXt2YXIgYT17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGEuY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe2lmKCFvKHQpKXJldHVybiB0O3ZhciBhLGk7aWYociYmImZ1bmN0aW9uIj09dHlwZW9mKGE9dC50b1N0cmluZykmJiFvKGk9YS5jYWxsKHQpKSlyZXR1cm4gaTtpZigiZnVuY3Rpb24iPT10eXBlb2YoYT10LnZhbHVlT2YpJiYhbyhpPWEuY2FsbCh0KSkpcmV0dXJuIGk7aWYoIXImJiJmdW5jdGlvbiI9PXR5cGVvZihhPXQudG9TdHJpbmcpJiYhbyhpPWEuY2FsbCh0KSkpcmV0dXJuIGk7dGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdD9udWxsIT09dDoiZnVuY3Rpb24iPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQscil7dmFyIGE9e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7cmV0dXJuIGEuY2FsbCh0LHIpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTMpLGk9YSgxNCksbD1hKDI1KTt0LmV4cG9ydHM9IW8mJiFpKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkobCgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMSksaT1hKDIyKSxsPW8uZG9jdW1lbnQsYz1pKGwpJiZpKGwuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBjP2wuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDEzKSxpPWEoMjcpLGw9YSgxNik7dC5leHBvcnRzPW8/ZnVuY3Rpb24odCxyLGEpe3JldHVybiBpLmYodCxyLGwoMSxhKSl9OmZ1bmN0aW9uKHQscixhKXt0W3JdPWE7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMyksaT1hKDI0KSxsPWEoMjgpLGM9YSgyMSksdT1PYmplY3QuZGVmaW5lUHJvcGVydHk7ci5mPW8/dTpmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LHIsYSl7bCh0KTtyPWMociwhMCk7bChhKTtpZihpKXRyeXtyZXR1cm4gdSh0LHIsYSl9Y2F0Y2godCl7fWlmKCJnZXQiaW4gYXx8InNldCJpbiBhKXRocm93IFR5cGVFcnJvcigiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQiKTsidmFsdWUiaW4gYSYmKHRbcl09YS52YWx1ZSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMSksaT1hKDI2KSxsPWEoMjMpLGM9YSgzMCksdT1hKDMxKSxkPWEoMzMpLGg9ZC5nZXQscD1kLmVuZm9yY2UsbT1TdHJpbmcoU3RyaW5nKS5zcGxpdCgiU3RyaW5nIik7KHQuZXhwb3J0cz1mdW5jdGlvbih0LHIsYSx1KXt2YXIgZD0hIXUmJiEhdS51bnNhZmUsaD0hIXUmJiEhdS5lbnVtZXJhYmxlLHY9ISF1JiYhIXUubm9UYXJnZXRHZXQ7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpeyJzdHJpbmciIT10eXBlb2Ygcnx8bChhLCJuYW1lIil8fGkoYSwibmFtZSIscik7cChhKS5zb3VyY2U9bS5qb2luKCJzdHJpbmciPT10eXBlb2Ygcj9yOiIiKX1pZih0IT09byl7ZD8hdiYmdFtyXSYmKGg9ITApOmRlbGV0ZSB0W3JdO2g/dFtyXT1hOmkodCxyLGEpfWVsc2UgaD90W3JdPWE6YyhyLGEpfSkoRnVuY3Rpb24ucHJvdG90eXBlLCJ0b1N0cmluZyIsKGZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMmJmgodGhpcykuc291cmNlfHx1KHRoaXMpfSkpfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMSksaT1hKDI2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXt0cnl7aShvLHQscil9Y2F0Y2goYSl7b1t0XT1yfXJldHVybiByfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMzIpLGk9RnVuY3Rpb24udG9TdHJpbmc7ImZ1bmN0aW9uIiE9dHlwZW9mIG8uaW5zcGVjdFNvdXJjZSYmKG8uaW5zcGVjdFNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gaS5jYWxsKHQpfSk7dC5leHBvcnRzPW8uaW5zcGVjdFNvdXJjZX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTEpLGk9YSgzMCksbD1vWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8aSgiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7dC5leHBvcnRzPWx9LGZ1bmN0aW9uKHQscixhKXt2YXIgbyxpLGwsYz1hKDM0KSx1PWEoMTEpLGQ9YSgyMiksaD1hKDI2KSxwPWEoMjMpLG09YSgzNSksdj1hKDM5KSxnPXUuV2Vha01hcDtpZihjKXt2YXIgeT1uZXcgZyxiPXkuZ2V0LF89eS5oYXMsUz15LnNldDtvPWZ1bmN0aW9uKHQscil7Uy5jYWxsKHksdCxyKTtyZXR1cm4gcn07aT1mdW5jdGlvbih0KXtyZXR1cm4gYi5jYWxsKHksdCl8fHt9fTtsPWZ1bmN0aW9uKHQpe3JldHVybiBfLmNhbGwoeSx0KX19ZWxzZXt2YXIgQz1tKCJzdGF0ZSIpO3ZbQ109ITA7bz1mdW5jdGlvbih0LHIpe2godCxDLHIpO3JldHVybiByfTtpPWZ1bmN0aW9uKHQpe3JldHVybiBwKHQsQyk/dFtDXTp7fX07bD1mdW5jdGlvbih0KXtyZXR1cm4gcCh0LEMpfX10LmV4cG9ydHM9e3NldDpvLGdldDppLGhhczpsLGVuZm9yY2U6ZnVuY3Rpb24odCl7cmV0dXJuIGwodCk/aSh0KTpvKHQse30pfSxnZXR0ZXJGb3I6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBhO2lmKCFkKHIpfHwoYT1pKHIpKS50eXBlIT09dCl0aHJvdyBUeXBlRXJyb3IoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIit0KyIgcmVxdWlyZWQiKTtyZXR1cm4gYX19fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTEpLGk9YSgzMSksbD1vLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBsJiYvbmF0aXZlIGNvZGUvLnRlc3QoaShsKSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDM2KSxpPWEoMzgpLGw9bygia2V5cyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbFt0XXx8KGxbdF09aSh0KSl9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgzNyksaT1hKDMyKTsodC5leHBvcnRzPWZ1bmN0aW9uKHQscil7cmV0dXJuIGlbdF18fChpW3RdPXZvaWQgMCE9PXI/cjp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjYuNSIsbW9kZTpvPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMjAgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPSExfSxmdW5jdGlvbih0LHIpe3ZhciBhPTAsbz1NYXRoLnJhbmRvbSgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4iU3ltYm9sKCIrU3RyaW5nKHZvaWQgMD09PXQ/IiI6dCkrIilfIisoKythK28pLnRvU3RyaW5nKDM2KX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgyMyksaT1hKDQxKSxsPWEoMTIpLGM9YSgyNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7Zm9yKHZhciBhPWkociksdT1jLmYsZD1sLmYsaD0wO2g8YS5sZW5ndGg7aCsrKXt2YXIgcD1hW2hdO28odCxwKXx8dSh0LHAsZChyLHApKX19fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSg0MiksaT1hKDQ0KSxsPWEoNTEpLGM9YSgyOCk7dC5leHBvcnRzPW8oIlJlZmxlY3QiLCJvd25LZXlzIil8fGZ1bmN0aW9uIG93bktleXModCl7dmFyIHI9aS5mKGModCkpLGE9bC5mO3JldHVybiBhP3IuY29uY2F0KGEodCkpOnJ9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSg0MyksaT1hKDExKSxhRnVuY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2b2lkIDB9O3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/YUZ1bmN0aW9uKG9bdF0pfHxhRnVuY3Rpb24oaVt0XSk6b1t0XSYmb1t0XVtyXXx8aVt0XSYmaVt0XVtyXX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDExKTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoNDUpLGk9YSg1MCkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTtyLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXModCl7cmV0dXJuIG8odCxpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDIzKSxpPWEoMTcpLGw9YSg0NikuaW5kZXhPZixjPWEoMzkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3ZhciBhLHU9aSh0KSxkPTAsaD1bXTtmb3IoYSBpbiB1KSFvKGMsYSkmJm8odSxhKSYmaC5wdXNoKGEpO2Zvcig7ci5sZW5ndGg+ZDspbyh1LGE9cltkKytdKSYmKH5sKGgsYSl8fGgucHVzaChhKSk7cmV0dXJuIGh9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxNyksaT1hKDQ3KSxsPWEoNDkpLGNyZWF0ZU1ldGhvZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocixhLGMpe3ZhciB1LGQ9byhyKSxoPWkoZC5sZW5ndGgpLHA9bChjLGgpO2lmKHQmJmEhPWEpe2Zvcig7aD5wOylpZigodT1kW3ArK10pIT11KXJldHVybiEwfWVsc2UgZm9yKDtoPnA7cCsrKWlmKCh0fHxwIGluIGQpJiZkW3BdPT09YSlyZXR1cm4gdHx8cHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmNyZWF0ZU1ldGhvZCghMCksaW5kZXhPZjpjcmVhdGVNZXRob2QoITEpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoNDgpLGk9TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/aShvKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LHIpe3ZhciBhPU1hdGguY2VpbCxvPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/bzphKSh0KX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDQ4KSxpPU1hdGgubWF4LGw9TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7dmFyIGE9byh0KTtyZXR1cm4gYTwwP2koYStyLDApOmwoYSxyKX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQscil7ci5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDE0KSxpPS8jfFwucHJvdG90eXBlXC4vLGlzRm9yY2VkPWZ1bmN0aW9uKHQscil7dmFyIGE9Y1tsKHQpXTtyZXR1cm4gYT09ZHx8YSE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiByP28ocik6ISFyKX0sbD1pc0ZvcmNlZC5ub3JtYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKGksIi4iKS50b0xvd2VyQ2FzZSgpfSxjPWlzRm9yY2VkLmRhdGE9e30sdT1pc0ZvcmNlZC5OQVRJVkU9Ik4iLGQ9aXNGb3JjZWQuUE9MWUZJTEw9IlAiO3QuZXhwb3J0cz1pc0ZvcmNlZH0sZnVuY3Rpb24odCxyLGEpe2EoNTQpO3ZhciBvPWEoNjEpO3QuZXhwb3J0cz1vKCJTdHJpbmciLCJzdGFydHNXaXRoIil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG8saT1hKDEwKSxsPWEoMTIpLmYsYz1hKDQ3KSx1PWEoNTUpLGQ9YSgyMCksaD1hKDYwKSxwPWEoMzcpLG09IiIuc3RhcnRzV2l0aCx2PU1hdGgubWluLGc9aCgic3RhcnRzV2l0aCIpO2koe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6ISghcCYmIWcmJiEhKG89bChTdHJpbmcucHJvdG90eXBlLCJzdGFydHNXaXRoIiksbyYmIW8ud3JpdGFibGUpKSYmIWd9LHtzdGFydHNXaXRoOmZ1bmN0aW9uIHN0YXJ0c1dpdGgodCl7dmFyIHI9U3RyaW5nKGQodGhpcykpO3UodCk7dmFyIGE9Yyh2KGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHIubGVuZ3RoKSksbz1TdHJpbmcodCk7cmV0dXJuIG0/bS5jYWxsKHIsbyxhKTpyLnNsaWNlKGEsYStvLmxlbmd0aCk9PT1vfX0pfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSg1Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG8odCkpdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDIyKSxpPWEoMTkpLGw9YSg1NykoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciByO3JldHVybiBvKHQpJiYodm9pZCAwIT09KHI9dFtsXSk/ISFyOiJSZWdFeHAiPT1pKHQpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDExKSxpPWEoMzYpLGw9YSgyMyksYz1hKDM4KSx1PWEoNTgpLGQ9YSg1OSksaD1pKCJ3a3MiKSxwPW8uU3ltYm9sLG09ZD9wOnAmJnAud2l0aG91dFNldHRlcnx8Yzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7bChoLHQpfHwodSYmbChwLHQpP2hbdF09cFt0XTpoW3RdPW0oIlN5bWJvbC4iK3QpKTtyZXR1cm4gaFt0XX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDE0KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhbygoZnVuY3Rpb24oKXtyZXR1cm4hU3RyaW5nKFN5bWJvbCgpKX0pKX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoNTgpO3QuZXhwb3J0cz1vJiYhU3ltYm9sLnNoYW0mJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSg1NykoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciByPS8uLzt0cnl7Ii8uLyJbdF0ocil9Y2F0Y2goYSl7dHJ5e3Jbb109ITE7cmV0dXJuIi8uLyJbdF0ocil9Y2F0Y2godCl7fX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDExKSxpPWEoNjIpLGw9RnVuY3Rpb24uY2FsbDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyLGEpe3JldHVybiBpKGwsb1t0XS5wcm90b3R5cGVbcl0sYSl9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSg2Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXtvKHQpO2lmKHZvaWQgMD09PXIpcmV0dXJuIHQ7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5jYWxsKHIpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiB0LmNhbGwocixhKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihhLG8pe3JldHVybiB0LmNhbGwocixhLG8pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGEsbyxpKXtyZXR1cm4gdC5jYWxsKHIsYSxvLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShyLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxyKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIsYSl7YSg2NSk7dmFyIG89YSg2MSk7dC5leHBvcnRzPW8oIlN0cmluZyIsImVuZHNXaXRoIil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG8saT1hKDEwKSxsPWEoMTIpLmYsYz1hKDQ3KSx1PWEoNTUpLGQ9YSgyMCksaD1hKDYwKSxwPWEoMzcpLG09IiIuZW5kc1dpdGgsdj1NYXRoLm1pbixnPWgoImVuZHNXaXRoIik7aSh7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohKCFwJiYhZyYmISEobz1sKFN0cmluZy5wcm90b3R5cGUsImVuZHNXaXRoIiksbyYmIW8ud3JpdGFibGUpKSYmIWd9LHtlbmRzV2l0aDpmdW5jdGlvbiBlbmRzV2l0aCh0KXt2YXIgcj1TdHJpbmcoZCh0aGlzKSk7dSh0KTt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCxvPWMoci5sZW5ndGgpLGk9dm9pZCAwPT09YT9vOnYoYyhhKSxvKSxsPVN0cmluZyh0KTtyZXR1cm4gbT9tLmNhbGwocixsLGkpOnIuc2xpY2UoaS1sLmxlbmd0aCxpKT09PWx9fSl9LGZ1bmN0aW9uKHQscixhKXthKDY3KTt2YXIgbz1hKDYxKTt0LmV4cG9ydHM9bygiU3RyaW5nIiwiaW5jbHVkZXMiKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDEwKSxpPWEoNTUpLGw9YSgyMCk7byh7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohYSg2MCkoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyh0KXtyZXR1cm4hIX5TdHJpbmcobCh0aGlzKSkuaW5kZXhPZihpKHQpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxyLGEpe2EoNjkpO3ZhciBvPWEoNjEpO3QuZXhwb3J0cz1vKCJBcnJheSIsImluY2x1ZGVzIil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG89YSgxMCksaT1hKDQ2KS5pbmNsdWRlcyxsPWEoNzApO28oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohYSg3NSkoImluZGV4T2YiLHtBQ0NFU1NPUlM6ITAsMTowfSl9LHtpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pO2woImluY2x1ZGVzIil9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDU3KSxpPWEoNzEpLGw9YSgyNyksYz1vKCJ1bnNjb3BhYmxlcyIpLHU9QXJyYXkucHJvdG90eXBlO251bGw9PXVbY10mJmwuZih1LGMse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTppKG51bGwpfSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3VbY11bdF09ITB9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG8saT1hKDI4KSxsPWEoNzIpLGM9YSg1MCksdT1hKDM5KSxkPWEoNzQpLGg9YSgyNSkscD1hKDM1KSxtPXAoIklFX1BST1RPIiksRW1wdHlDb25zdHJ1Y3Rvcj1mdW5jdGlvbigpe30sc2NyaXB0VGFnPWZ1bmN0aW9uKHQpe3JldHVybiI8c2NyaXB0PiIrdCsiPFwvc2NyaXB0PiJ9LE51bGxQcm90b09iamVjdD1mdW5jdGlvbigpe3RyeXtvPWRvY3VtZW50LmRvbWFpbiYmbmV3IEFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIil9Y2F0Y2godCl7fU51bGxQcm90b09iamVjdD1vP2Z1bmN0aW9uKHQpe3Qud3JpdGUoc2NyaXB0VGFnKCIiKSk7dC5jbG9zZSgpO3ZhciByPXQucGFyZW50V2luZG93Lk9iamVjdDt0PW51bGw7cmV0dXJuIHJ9KG8pOmZ1bmN0aW9uKCl7dmFyIHQscj1oKCJpZnJhbWUiKTtyLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2QuYXBwZW5kQ2hpbGQocik7ci5zcmM9U3RyaW5nKCJqYXZhc2NyaXB0OiIpOyh0PXIuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpO3Qud3JpdGUoc2NyaXB0VGFnKCJkb2N1bWVudC5GPU9iamVjdCIpKTt0LmNsb3NlKCk7cmV0dXJuIHQuRn0oKTtmb3IodmFyIHQ9Yy5sZW5ndGg7dC0tOylkZWxldGUgTnVsbFByb3RvT2JqZWN0LnByb3RvdHlwZVtjW3RdXTtyZXR1cm4gTnVsbFByb3RvT2JqZWN0KCl9O3VbbV09ITA7dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uIGNyZWF0ZSh0LHIpe3ZhciBhO2lmKG51bGwhPT10KXtFbXB0eUNvbnN0cnVjdG9yLnByb3RvdHlwZT1pKHQpO2E9bmV3IEVtcHR5Q29uc3RydWN0b3I7RW1wdHlDb25zdHJ1Y3Rvci5wcm90b3R5cGU9bnVsbDthW21dPXR9ZWxzZSBhPU51bGxQcm90b09iamVjdCgpO3JldHVybiB2b2lkIDA9PT1yP2E6bChhLHIpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTMpLGk9YSgyNyksbD1hKDI4KSxjPWEoNzMpO3QuZXhwb3J0cz1vP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModCxyKXtsKHQpO2Zvcih2YXIgYSxvPWMociksdT1vLmxlbmd0aCxkPTA7dT5kOylpLmYodCxhPW9bZCsrXSxyW2FdKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDQ1KSxpPWEoNTApO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ga2V5cyh0KXtyZXR1cm4gbyh0LGkpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoNDIpO3QuZXhwb3J0cz1vKCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIpfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMyksaT1hKDE0KSxsPWEoMjMpLGM9T2JqZWN0LmRlZmluZVByb3BlcnR5LHU9e30sdGhyb3dlcj1mdW5jdGlvbih0KXt0aHJvdyB0fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXtpZihsKHUsdCkpcmV0dXJuIHVbdF07cnx8KHI9e30pO3ZhciBhPVtdW3RdLGQ9ISFsKHIsIkFDQ0VTU09SUyIpJiZyLkFDQ0VTU09SUyxoPWwociwwKT9yWzBdOnRocm93ZXIscD1sKHIsMSk/clsxXTp2b2lkIDA7cmV0dXJuIHVbdF09ISFhJiYhaSgoZnVuY3Rpb24oKXtpZihkJiYhbylyZXR1cm4hMDt2YXIgdD17bGVuZ3RoOi0xfTtkP2ModCwxLHtlbnVtZXJhYmxlOiEwLGdldDp0aHJvd2VyfSk6dFsxXT0xO2EuY2FsbCh0LGgscCl9KSl9fSxmdW5jdGlvbih0LHIsYSl7YSg3Nyk7YSg4OSk7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uQXJyYXkuZnJvbX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDc4KS5jaGFyQXQsaT1hKDMzKSxsPWEoNzkpLGM9aS5zZXQsdT1pLmdldHRlckZvcigiU3RyaW5nIEl0ZXJhdG9yIik7bChTdHJpbmcsIlN0cmluZyIsKGZ1bmN0aW9uKHQpe2ModGhpcyx7dHlwZToiU3RyaW5nIEl0ZXJhdG9yIixzdHJpbmc6U3RyaW5nKHQpLGluZGV4OjB9KX0pLChmdW5jdGlvbiBuZXh0KCl7dmFyIHQscj11KHRoaXMpLGE9ci5zdHJpbmcsaT1yLmluZGV4O2lmKGk+PWEubGVuZ3RoKXJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH07dD1vKGEsaSk7ci5pbmRleCs9dC5sZW5ndGg7cmV0dXJue3ZhbHVlOnQsZG9uZTohMX19KSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDQ4KSxpPWEoMjApLGNyZWF0ZU1ldGhvZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocixhKXt2YXIgbCxjLHU9U3RyaW5nKGkocikpLGQ9byhhKSxoPXUubGVuZ3RoO3JldHVybiBkPDB8fGQ+PWg/dD8iIjp2b2lkIDA6KGw9dS5jaGFyQ29kZUF0KGQpKTw1NTI5Nnx8bD41NjMxOXx8ZCsxPT09aHx8KGM9dS5jaGFyQ29kZUF0KGQrMSkpPDU2MzIwfHxjPjU3MzQzP3Q/dS5jaGFyQXQoZCk6bDp0P3Uuc2xpY2UoZCxkKzIpOmMtNTYzMjArKGwtNTUyOTY8PDEwKSs2NTUzNn19O3QuZXhwb3J0cz17Y29kZUF0OmNyZWF0ZU1ldGhvZCghMSksY2hhckF0OmNyZWF0ZU1ldGhvZCghMCl9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTApLGk9YSg4MCksbD1hKDgyKSxjPWEoODcpLHU9YSg4NSksZD1hKDI2KSxoPWEoMjkpLHA9YSg1NyksbT1hKDM3KSx2PWEoODYpLGc9YSg4MSkseT1nLkl0ZXJhdG9yUHJvdG90eXBlLGI9Zy5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLF89cCgiaXRlcmF0b3IiKSxyZXR1cm5UaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LHIsYSxwLGcsUyxDKXtpKGEscixwKTt2YXIgQSxSLGssZ2V0SXRlcmF0aW9uTWV0aG9kPWZ1bmN0aW9uKHQpe2lmKHQ9PT1nJiZFKXJldHVybiBFO2lmKCFiJiZ0IGluIHgpcmV0dXJuIHhbdF07c3dpdGNoKHQpe2Nhc2Uia2V5cyI6cmV0dXJuIGZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gbmV3IGEodGhpcyx0KX07Y2FzZSJ2YWx1ZXMiOnJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXtyZXR1cm4gbmV3IGEodGhpcyx0KX07Y2FzZSJlbnRyaWVzIjpyZXR1cm4gZnVuY3Rpb24gZW50cmllcygpe3JldHVybiBuZXcgYSh0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEodGhpcyl9fSx3PXIrIiBJdGVyYXRvciIsUD0hMSx4PXQucHJvdG90eXBlLFQ9eFtfXXx8eFsiQEBpdGVyYXRvciJdfHxnJiZ4W2ddLEU9IWImJlR8fGdldEl0ZXJhdGlvbk1ldGhvZChnKSxPPSJBcnJheSI9PXImJnguZW50cmllc3x8VDtpZihPKXtBPWwoTy5jYWxsKG5ldyB0KSk7aWYoeSE9PU9iamVjdC5wcm90b3R5cGUmJkEubmV4dCl7bXx8bChBKT09PXl8fChjP2MoQSx5KToiZnVuY3Rpb24iIT10eXBlb2YgQVtfXSYmZChBLF8scmV0dXJuVGhpcykpO3UoQSx3LCEwLCEwKTttJiYodlt3XT1yZXR1cm5UaGlzKX19aWYoInZhbHVlcyI9PWcmJlQmJiJ2YWx1ZXMiIT09VC5uYW1lKXtQPSEwO0U9ZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIFQuY2FsbCh0aGlzKX19bSYmIUN8fHhbX109PT1FfHxkKHgsXyxFKTt2W3JdPUU7aWYoZyl7Uj17dmFsdWVzOmdldEl0ZXJhdGlvbk1ldGhvZCgidmFsdWVzIiksa2V5czpTP0U6Z2V0SXRlcmF0aW9uTWV0aG9kKCJrZXlzIiksZW50cmllczpnZXRJdGVyYXRpb25NZXRob2QoImVudHJpZXMiKX07aWYoQylmb3IoayBpbiBSKShifHxQfHwhKGsgaW4geCkpJiZoKHgsayxSW2tdKTtlbHNlIG8oe3RhcmdldDpyLHByb3RvOiEwLGZvcmNlZDpifHxQfSxSKX1yZXR1cm4gUn19LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG89YSg4MSkuSXRlcmF0b3JQcm90b3R5cGUsaT1hKDcxKSxsPWEoMTYpLGM9YSg4NSksdT1hKDg2KSxyZXR1cm5UaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LHIsYSl7dmFyIGQ9cisiIEl0ZXJhdG9yIjt0LnByb3RvdHlwZT1pKG8se25leHQ6bCgxLGEpfSk7Yyh0LGQsITEsITApO3VbZF09cmV0dXJuVGhpcztyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG8saSxsLGM9YSg4MiksdT1hKDI2KSxkPWEoMjMpLGg9YSg1NykscD1hKDM3KSxtPWgoIml0ZXJhdG9yIiksdj0hMTtbXS5rZXlzJiYoIm5leHQiaW4obD1bXS5rZXlzKCkpPyhpPWMoYyhsKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmKG89aSk6dj0hMCk7bnVsbD09byYmKG89e30pO3B8fGQobyxtKXx8dShvLG0sKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSk7dC5leHBvcnRzPXtJdGVyYXRvclByb3RvdHlwZTpvLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6dn19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDIzKSxpPWEoODMpLGw9YSgzNSksYz1hKDg0KSx1PWwoIklFX1BST1RPIiksZD1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1jP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXt0PWkodCk7cmV0dXJuIG8odCx1KT90W3VdOiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P2Q6bnVsbH19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDIwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChvKHQpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDE0KTt0LmV4cG9ydHM9IW8oKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gRigpe31GLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYpIT09Ri5wcm90b3R5cGV9KSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDI3KS5mLGk9YSgyMyksbD1hKDU3KSgidG9TdHJpbmdUYWciKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyLGEpe3QmJiFpKHQ9YT90OnQucHJvdG90eXBlLGwpJiZvKHQsbCx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnJ9KX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgyOCksaT1hKDg4KTt0LmV4cG9ydHM9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIHQscj0hMSxhPXt9O3RyeXsodD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLnNldCkuY2FsbChhLFtdKTtyPWEgaW5zdGFuY2VvZiBBcnJheX1jYXRjaCh0KXt9cmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKGEsbCl7byhhKTtpKGwpO3I/dC5jYWxsKGEsbCk6YS5fX3Byb3RvX189bDtyZXR1cm4gYX19KCk6dm9pZCAwKX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighbyh0KSYmbnVsbCE9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIitTdHJpbmcodCkrIiBhcyBhIHByb3RvdHlwZSIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTApLGk9YSg5MCk7byh7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IWEoOTcpKChmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSkpfSx7ZnJvbTppfSl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG89YSg2MiksaT1hKDgzKSxsPWEoOTEpLGM9YSg5MiksdT1hKDQ3KSxkPWEoOTMpLGg9YSg5NCk7dC5leHBvcnRzPWZ1bmN0aW9uIGZyb20odCl7dmFyIHIsYSxwLG0sdixnLHk9aSh0KSxiPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6QXJyYXksXz1hcmd1bWVudHMubGVuZ3RoLFM9Xz4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsQz12b2lkIDAhPT1TLEE9aCh5KSxSPTA7QyYmKFM9byhTLF8+Mj9hcmd1bWVudHNbMl06dm9pZCAwLDIpKTtpZihudWxsPT1BfHxiPT1BcnJheSYmYyhBKSl7YT1uZXcgYihyPXUoeS5sZW5ndGgpKTtmb3IoO3I+UjtSKyspe2c9Qz9TKHlbUl0sUik6eVtSXTtkKGEsUixnKX19ZWxzZXt2PShtPUEuY2FsbCh5KSkubmV4dDthPW5ldyBiO2Zvcig7IShwPXYuY2FsbChtKSkuZG9uZTtSKyspe2c9Qz9sKG0sUyxbcC52YWx1ZSxSXSwhMCk6cC52YWx1ZTtkKGEsUixnKX19YS5sZW5ndGg9UjtyZXR1cm4gYX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDI4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyLGEsaSl7dHJ5e3JldHVybiBpP3IobyhhKVswXSxhWzFdKTpyKGEpfWNhdGNoKHIpe3ZhciBsPXQucmV0dXJuO3ZvaWQgMCE9PWwmJm8obC5jYWxsKHQpKTt0aHJvdyByfX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDU3KSxpPWEoODYpLGw9bygiaXRlcmF0b3IiKSxjPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihpLkFycmF5PT09dHx8Y1tsXT09PXQpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDIxKSxpPWEoMjcpLGw9YSgxNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXt2YXIgYz1vKHIpO2MgaW4gdD9pLmYodCxjLGwoMCxhKSk6dFtjXT1hfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoOTUpLGk9YSg4NiksbD1hKDU3KSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtsXXx8dFsiQEBpdGVyYXRvciJdfHxpW28odCldfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoOTYpLGk9YSgxOSksbD1hKDU3KSgidG9TdHJpbmdUYWciKSxjPSJBcmd1bWVudHMiPT1pKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPW8/aTpmdW5jdGlvbih0KXt2YXIgcixhLG87cmV0dXJuIHZvaWQgMD09PXQ/IlVuZGVmaW5lZCI6bnVsbD09PXQ/Ik51bGwiOiJzdHJpbmciPT10eXBlb2YoYT1mdW5jdGlvbih0LHIpe3RyeXtyZXR1cm4gdFtyXX1jYXRjaCh0KXt9fShyPU9iamVjdCh0KSxsKSk/YTpjP2kocik6Ik9iamVjdCI9PShvPWkocikpJiYiZnVuY3Rpb24iPT10eXBlb2Ygci5jYWxsZWU/IkFyZ3VtZW50cyI6b319LGZ1bmN0aW9uKHQscixhKXt2YXIgbz17fTtvW2EoNTcpKCJ0b1N0cmluZ1RhZyIpXT0ieiI7dC5leHBvcnRzPSJbb2JqZWN0IHpdIj09PVN0cmluZyhvKX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoNTcpKCJpdGVyYXRvciIpLGk9ITE7dHJ5e3ZhciBsPTAsYz17bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOiEhbCsrfX0scmV0dXJuOmZ1bmN0aW9uKCl7aT0hMH19O2Nbb109ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307QXJyYXkuZnJvbShjLChmdW5jdGlvbigpe3Rocm93IDJ9KSl9Y2F0Y2godCl7fXQuZXhwb3J0cz1mdW5jdGlvbih0LHIpe2lmKCFyJiYhaSlyZXR1cm4hMTt2YXIgYT0hMTt0cnl7dmFyIGw9e307bFtvXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6YT0hMH19fX07dChsKX1jYXRjaCh0KXt9cmV0dXJuIGF9fSxmdW5jdGlvbih0LHIsYSl7YSg5OSk7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uT2JqZWN0LmFzc2lnbn0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTApLGk9YSgxMDApO28oe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuYXNzaWduIT09aX0se2Fzc2lnbjppfSl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG89YSgxMyksaT1hKDE0KSxsPWEoNzMpLGM9YSg1MSksdT1hKDE1KSxkPWEoODMpLGg9YSgxOCkscD1PYmplY3QuYXNzaWduLG09T2JqZWN0LmRlZmluZVByb3BlcnR5O3QuZXhwb3J0cz0hcHx8aSgoZnVuY3Rpb24oKXtpZihvJiYxIT09cCh7YjoxfSxwKG0oe30sImEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe20odGhpcywiYiIse3ZhbHVlOjMsZW51bWVyYWJsZTohMX0pfX0pLHtiOjJ9KSkuYilyZXR1cm4hMDt2YXIgdD17fSxyPXt9LGE9U3ltYm9sKCk7dFthXT03OyJhYmNkZWZnaGlqa2xtbm9wcXJzdCIuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbdF09dH0pKTtyZXR1cm4gNyE9cCh7fSx0KVthXXx8ImFiY2RlZmdoaWprbG1ub3BxcnN0IiE9bChwKHt9LHIpKS5qb2luKCIiKX0pKT9mdW5jdGlvbiBhc3NpZ24odCxyKXtmb3IodmFyIGE9ZCh0KSxpPWFyZ3VtZW50cy5sZW5ndGgscD0xLG09Yy5mLHY9dS5mO2k+cDspZm9yKHZhciBnLHk9aChhcmd1bWVudHNbcCsrXSksYj1tP2woeSkuY29uY2F0KG0oeSkpOmwoeSksXz1iLmxlbmd0aCxTPTA7Xz5TOyl7Zz1iW1MrK107byYmIXYuY2FsbCh5LGcpfHwoYVtnXT15W2ddKX1yZXR1cm4gYX06cH0sZnVuY3Rpb24odCxyLGEpe2EoMTAyKTthKDEwMyk7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uT2JqZWN0LmZyb21FbnRyaWVzfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTcpLGk9YSg3MCksbD1hKDg2KSxjPWEoMzMpLHU9YSg3OSksZD1jLnNldCxoPWMuZ2V0dGVyRm9yKCJBcnJheSBJdGVyYXRvciIpO3QuZXhwb3J0cz11KEFycmF5LCJBcnJheSIsKGZ1bmN0aW9uKHQscil7ZCh0aGlzLHt0eXBlOiJBcnJheSBJdGVyYXRvciIsdGFyZ2V0Om8odCksaW5kZXg6MCxraW5kOnJ9KX0pLChmdW5jdGlvbigpe3ZhciB0PWgodGhpcykscj10LnRhcmdldCxhPXQua2luZCxvPXQuaW5kZXgrKztpZighcnx8bz49ci5sZW5ndGgpe3QudGFyZ2V0PXZvaWQgMDtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fXJldHVybiJrZXlzIj09YT97dmFsdWU6byxkb25lOiExfToidmFsdWVzIj09YT97dmFsdWU6cltvXSxkb25lOiExfTp7dmFsdWU6W28scltvXV0sZG9uZTohMX19KSwidmFsdWVzIik7bC5Bcmd1bWVudHM9bC5BcnJheTtpKCJrZXlzIik7aSgidmFsdWVzIik7aSgiZW50cmllcyIpfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMCksaT1hKDEwNCksbD1hKDkzKTtvKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMH0se2Zyb21FbnRyaWVzOmZ1bmN0aW9uIGZyb21FbnRyaWVzKHQpe3ZhciByPXt9O2kodCwoZnVuY3Rpb24odCxhKXtsKHIsdCxhKX0pLHZvaWQgMCwhMCk7cmV0dXJuIHJ9fSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDI4KSxpPWEoOTIpLGw9YSg0NyksYz1hKDYyKSx1PWEoOTQpLGQ9YSg5MSksUmVzdWx0PWZ1bmN0aW9uKHQscil7dGhpcy5zdG9wcGVkPXQ7dGhpcy5yZXN1bHQ9cn07KHQuZXhwb3J0cz1mdW5jdGlvbih0LHIsYSxoLHApe3ZhciBtLHYsZyx5LGIsXyxTLEM9YyhyLGEsaD8yOjEpO2lmKHApbT10O2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mKHY9dSh0KSkpdGhyb3cgVHlwZUVycm9yKCJUYXJnZXQgaXMgbm90IGl0ZXJhYmxlIik7aWYoaSh2KSl7Zm9yKGc9MCx5PWwodC5sZW5ndGgpO3k+ZztnKyspaWYoKGI9aD9DKG8oUz10W2ddKVswXSxTWzFdKTpDKHRbZ10pKSYmYiBpbnN0YW5jZW9mIFJlc3VsdClyZXR1cm4gYjtyZXR1cm4gbmV3IFJlc3VsdCghMSl9bT12LmNhbGwodCl9Xz1tLm5leHQ7Zm9yKDshKFM9Xy5jYWxsKG0pKS5kb25lOylpZigib2JqZWN0Ij09dHlwZW9mKGI9ZChtLEMsUy52YWx1ZSxoKSkmJmImJmIgaW5zdGFuY2VvZiBSZXN1bHQpcmV0dXJuIGI7cmV0dXJuIG5ldyBSZXN1bHQoITEpfSkuc3RvcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFJlc3VsdCghMCx0KX19LGZ1bmN0aW9uKHQscixhKXthKDEwNik7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uTWF0aC5sb2cyfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMCksaT1NYXRoLmxvZyxsPU1hdGguTE4yO28oe3RhcmdldDoiTWF0aCIsc3RhdDohMH0se2xvZzI6ZnVuY3Rpb24gbG9nMih0KXtyZXR1cm4gaSh0KS9sfX0pfSxmdW5jdGlvbih0LHIsYSl7YSgxMDgpO3ZhciBvPWEoNDMpO3QuZXhwb3J0cz1vLk51bWJlci5pc05hTn0sZnVuY3Rpb24odCxyLGEpe2EoMTApKHt0YXJnZXQ6Ik51bWJlciIsc3RhdDohMH0se2lzTmFOOmZ1bmN0aW9uIGlzTmFOKHQpe3JldHVybiB0IT10fX0pfSxmdW5jdGlvbih0LHIsYSl7YSgxMTApO3ZhciBvPWEoNDMpO3QuZXhwb3J0cz1vLk51bWJlci5pc0ludGVnZXJ9LGZ1bmN0aW9uKHQscixhKXthKDEwKSh7dGFyZ2V0OiJOdW1iZXIiLHN0YXQ6ITB9LHtpc0ludGVnZXI6YSgxMTEpfSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDIyKSxpPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uIGlzSW50ZWdlcih0KXtyZXR1cm4hbyh0KSYmaXNGaW5pdGUodCkmJmkodCk9PT10fX0sZnVuY3Rpb24odCxyLGEpe2EoMTEzKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDExNCksaT1hKDExNiksbD1hKDE0KSxjPW8uYVR5cGVkQXJyYXksdT1vLmFUeXBlZEFycmF5Q29uc3RydWN0b3IsZD1vLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsaD1bXS5zbGljZTtkKCJzbGljZSIsKGZ1bmN0aW9uIHNsaWNlKHQscil7Zm9yKHZhciBhPWguY2FsbChjKHRoaXMpLHQsciksbz1pKHRoaXMsdGhpcy5jb25zdHJ1Y3RvciksbD0wLGQ9YS5sZW5ndGgscD1uZXcodShvKSkoZCk7ZD5sOylwW2xdPWFbbCsrXTtyZXR1cm4gcH0pLGwoKGZ1bmN0aW9uKCl7bmV3IEludDhBcnJheSgxKS5zbGljZSgpfSkpKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbyxpPWEoMTE1KSxsPWEoMTMpLGM9YSgxMSksdT1hKDIyKSxkPWEoMjMpLGg9YSg5NSkscD1hKDI2KSxtPWEoMjkpLHY9YSgyNykuZixnPWEoODIpLHk9YSg4NyksYj1hKDU3KSxfPWEoMzgpLFM9Yy5JbnQ4QXJyYXksQz1TJiZTLnByb3RvdHlwZSxBPWMuVWludDhDbGFtcGVkQXJyYXksUj1BJiZBLnByb3RvdHlwZSxrPVMmJmcoUyksdz1DJiZnKEMpLFA9T2JqZWN0LnByb3RvdHlwZSx4PVAuaXNQcm90b3R5cGVPZixUPWIoInRvU3RyaW5nVGFnIiksRT1fKCJUWVBFRF9BUlJBWV9UQUciKSxPPWkmJiEheSYmIk9wZXJhIiE9PWgoYy5vcGVyYSksST0hMSxEPXtJbnQ4QXJyYXk6MSxVaW50OEFycmF5OjEsVWludDhDbGFtcGVkQXJyYXk6MSxJbnQxNkFycmF5OjIsVWludDE2QXJyYXk6MixJbnQzMkFycmF5OjQsVWludDMyQXJyYXk6NCxGbG9hdDMyQXJyYXk6NCxGbG9hdDY0QXJyYXk6OH0saXNUeXBlZEFycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB1KHQpJiZkKEQsaCh0KSl9O2ZvcihvIGluIEQpY1tvXXx8KE89ITEpO2lmKCFPfHwiZnVuY3Rpb24iIT10eXBlb2Yga3x8az09PUZ1bmN0aW9uLnByb3RvdHlwZSl7az1mdW5jdGlvbiBUeXBlZEFycmF5KCl7dGhyb3cgVHlwZUVycm9yKCJJbmNvcnJlY3QgaW52b2NhdGlvbiIpfTtpZihPKWZvcihvIGluIEQpY1tvXSYmeShjW29dLGspfWlmKCFPfHwhd3x8dz09PVApe3c9ay5wcm90b3R5cGU7aWYoTylmb3IobyBpbiBEKWNbb10mJnkoY1tvXS5wcm90b3R5cGUsdyl9TyYmZyhSKSE9PXcmJnkoUix3KTtpZihsJiYhZCh3LFQpKXtJPSEwO3YodyxULHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdSh0aGlzKT90aGlzW0VdOnZvaWQgMH19KTtmb3IobyBpbiBEKWNbb10mJnAoY1tvXSxFLG8pfXQuZXhwb3J0cz17TkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzpPLFRZUEVEX0FSUkFZX1RBRzpJJiZFLGFUeXBlZEFycmF5OmZ1bmN0aW9uKHQpe2lmKGlzVHlwZWRBcnJheSh0KSlyZXR1cm4gdDt0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheSIpfSxhVHlwZWRBcnJheUNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe2lmKHkpe2lmKHguY2FsbChrLHQpKXJldHVybiB0fWVsc2UgZm9yKHZhciByIGluIEQpaWYoZChELG8pKXt2YXIgYT1jW3JdO2lmKGEmJih0PT09YXx8eC5jYWxsKGEsdCkpKXJldHVybiB0fXRocm93IFR5cGVFcnJvcigiVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIil9LGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6ZnVuY3Rpb24odCxyLGEpe2lmKGwpe2lmKGEpZm9yKHZhciBvIGluIEQpe3ZhciBpPWNbb107aSYmZChpLnByb3RvdHlwZSx0KSYmZGVsZXRlIGkucHJvdG90eXBlW3RdfXdbdF0mJiFhfHxtKHcsdCxhP3I6TyYmQ1t0XXx8cil9fSxleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOmZ1bmN0aW9uKHQscixhKXt2YXIgbyxpO2lmKGwpe2lmKHkpe2lmKGEpZm9yKG8gaW4gRCkoaT1jW29dKSYmZChpLHQpJiZkZWxldGUgaVt0XTtpZihrW3RdJiYhYSlyZXR1cm47dHJ5e3JldHVybiBtKGssdCxhP3I6TyYmU1t0XXx8cil9Y2F0Y2godCl7fX1mb3IobyBpbiBEKSEoaT1jW29dKXx8aVt0XSYmIWF8fG0oaSx0LHIpfX0saXNWaWV3OmZ1bmN0aW9uIGlzVmlldyh0KXt2YXIgcj1oKHQpO3JldHVybiJEYXRhVmlldyI9PT1yfHxkKEQscil9LGlzVHlwZWRBcnJheTppc1R5cGVkQXJyYXksVHlwZWRBcnJheTprLFR5cGVkQXJyYXlQcm90b3R5cGU6d319LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJ1bmRlZmluZWQiIT10eXBlb2YgRGF0YVZpZXd9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDI4KSxpPWEoNjMpLGw9YSg1NykoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXt2YXIgYSxjPW8odCkuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PWN8fG51bGw9PShhPW8oYylbbF0pP3I6aShhKX19LGZ1bmN0aW9uKHQscixhKXthKDExOCk7YSg3Nyk7YSgxMjApO2EoMTIyKTthKDEzNik7YSgxMzcpO3ZhciBvPWEoNDMpO3QuZXhwb3J0cz1vLlByb21pc2V9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDk2KSxpPWEoMjkpLGw9YSgxMTkpO298fGkoT2JqZWN0LnByb3RvdHlwZSwidG9TdHJpbmciLGwse3Vuc2FmZTohMH0pfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoOTYpLGk9YSg5NSk7dC5leHBvcnRzPW8/e30udG9TdHJpbmc6ZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4iW29iamVjdCAiK2kodGhpcykrIl0ifX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTEpLGk9YSgxMjEpLGw9YSgxMDIpLGM9YSgyNiksdT1hKDU3KSxkPXUoIml0ZXJhdG9yIiksaD11KCJ0b1N0cmluZ1RhZyIpLHA9bC52YWx1ZXM7Zm9yKHZhciBtIGluIGkpe3ZhciB2PW9bbV0sZz12JiZ2LnByb3RvdHlwZTtpZihnKXtpZihnW2RdIT09cCl0cnl7YyhnLGQscCl9Y2F0Y2godCl7Z1tkXT1wfWdbaF18fGMoZyxoLG0pO2lmKGlbbV0pZm9yKHZhciB5IGluIGwpaWYoZ1t5XSE9PWxbeV0pdHJ5e2MoZyx5LGxbeV0pfWNhdGNoKHQpe2dbeV09bFt5XX19fX0sZnVuY3Rpb24odCxyKXt0LmV4cG9ydHM9e0NTU1J1bGVMaXN0OjAsQ1NTU3R5bGVEZWNsYXJhdGlvbjowLENTU1ZhbHVlTGlzdDowLENsaWVudFJlY3RMaXN0OjAsRE9NUmVjdExpc3Q6MCxET01TdHJpbmdMaXN0OjAsRE9NVG9rZW5MaXN0OjEsRGF0YVRyYW5zZmVySXRlbUxpc3Q6MCxGaWxlTGlzdDowLEhUTUxBbGxDb2xsZWN0aW9uOjAsSFRNTENvbGxlY3Rpb246MCxIVE1MRm9ybUVsZW1lbnQ6MCxIVE1MU2VsZWN0RWxlbWVudDowLE1lZGlhTGlzdDowLE1pbWVUeXBlQXJyYXk6MCxOYW1lZE5vZGVNYXA6MCxOb2RlTGlzdDoxLFBhaW50UmVxdWVzdExpc3Q6MCxQbHVnaW46MCxQbHVnaW5BcnJheTowLFNWR0xlbmd0aExpc3Q6MCxTVkdOdW1iZXJMaXN0OjAsU1ZHUGF0aFNlZ0xpc3Q6MCxTVkdQb2ludExpc3Q6MCxTVkdTdHJpbmdMaXN0OjAsU1ZHVHJhbnNmb3JtTGlzdDowLFNvdXJjZUJ1ZmZlckxpc3Q6MCxTdHlsZVNoZWV0TGlzdDowLFRleHRUcmFja0N1ZUxpc3Q6MCxUZXh0VHJhY2tMaXN0OjAsVG91Y2hMaXN0OjB9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvLGksbCxjLHU9YSgxMCksZD1hKDM3KSxoPWEoMTEpLHA9YSg0MiksbT1hKDEyMyksdj1hKDI5KSxnPWEoMTI0KSx5PWEoODUpLGI9YSgxMjUpLF89YSgyMiksUz1hKDYzKSxDPWEoMTI2KSxBPWEoMTkpLFI9YSgzMSksaz1hKDEwNCksdz1hKDk3KSxQPWEoMTE2KSx4PWEoMTI3KS5zZXQsVD1hKDEzMCksRT1hKDEzMSksTz1hKDEzMyksST1hKDEzMiksRD1hKDEzNCksTD1hKDMzKSxNPWEoNTIpLFc9YSg1Nyksaj1hKDEzNSksTj1XKCJzcGVjaWVzIiksQj0iUHJvbWlzZSIscT1MLmdldCxHPUwuc2V0LFU9TC5nZXR0ZXJGb3IoQiksej1tLEg9aC5UeXBlRXJyb3IsVj1oLmRvY3VtZW50LFk9aC5wcm9jZXNzLFg9cCgiZmV0Y2giKSxRPUkuZixLPVEsSj0icHJvY2VzcyI9PUEoWSksJD0hIShWJiZWLmNyZWF0ZUV2ZW50JiZoLmRpc3BhdGNoRXZlbnQpLFo9TShCLChmdW5jdGlvbigpe2lmKCEoUih6KSE9PVN0cmluZyh6KSkpe2lmKDY2PT09ailyZXR1cm4hMDtpZighSiYmImZ1bmN0aW9uIiE9dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudClyZXR1cm4hMH1pZihkJiYhei5wcm90b3R5cGUuZmluYWxseSlyZXR1cm4hMDtpZihqPj01MSYmL25hdGl2ZSBjb2RlLy50ZXN0KHopKXJldHVybiExO3ZhciB0PXoucmVzb2x2ZSgxKSxGYWtlUHJvbWlzZT1mdW5jdGlvbih0KXt0KChmdW5jdGlvbigpe30pLChmdW5jdGlvbigpe30pKX07KHQuY29uc3RydWN0b3I9e30pW05dPUZha2VQcm9taXNlO3JldHVybiEodC50aGVuKChmdW5jdGlvbigpe30pKWluc3RhbmNlb2YgRmFrZVByb21pc2UpfSkpLGVlPVp8fCF3KChmdW5jdGlvbih0KXt6LmFsbCh0KS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9KSksaXNUaGVuYWJsZT1mdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4hKCFfKHQpfHwiZnVuY3Rpb24iIT10eXBlb2Yocj10LnRoZW4pKSYmcn0sbm90aWZ5PWZ1bmN0aW9uKHQscixhKXtpZighci5ub3RpZmllZCl7ci5ub3RpZmllZD0hMDt2YXIgbz1yLnJlYWN0aW9ucztUKChmdW5jdGlvbigpe2Zvcih2YXIgaT1yLnZhbHVlLGw9MT09ci5zdGF0ZSxjPTA7by5sZW5ndGg+Yzspe3ZhciB1LGQsaCxwPW9bYysrXSxtPWw/cC5vazpwLmZhaWwsdj1wLnJlc29sdmUsZz1wLnJlamVjdCx5PXAuZG9tYWluO3RyeXtpZihtKXtpZighbCl7Mj09PXIucmVqZWN0aW9uJiZvbkhhbmRsZVVuaGFuZGxlZCh0LHIpO3IucmVqZWN0aW9uPTF9aWYoITA9PT1tKXU9aTtlbHNle3kmJnkuZW50ZXIoKTt1PW0oaSk7aWYoeSl7eS5leGl0KCk7aD0hMH19dT09PXAucHJvbWlzZT9nKEgoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KGQ9aXNUaGVuYWJsZSh1KSk/ZC5jYWxsKHUsdixnKTp2KHUpfWVsc2UgZyhpKX1jYXRjaCh0KXt5JiYhaCYmeS5leGl0KCk7Zyh0KX19ci5yZWFjdGlvbnM9W107ci5ub3RpZmllZD0hMTthJiYhci5yZWplY3Rpb24mJm9uVW5oYW5kbGVkKHQscil9KSl9fSxkaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKHQscixhKXt2YXIgbyxpO2lmKCQpeyhvPVYuY3JlYXRlRXZlbnQoIkV2ZW50IikpLnByb21pc2U9cjtvLnJlYXNvbj1hO28uaW5pdEV2ZW50KHQsITEsITApO2guZGlzcGF0Y2hFdmVudChvKX1lbHNlIG89e3Byb21pc2U6cixyZWFzb246YX07KGk9aFsib24iK3RdKT9pKG8pOiJ1bmhhbmRsZWRyZWplY3Rpb24iPT09dCYmTygiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixhKX0sb25VbmhhbmRsZWQ9ZnVuY3Rpb24odCxyKXt4LmNhbGwoaCwoZnVuY3Rpb24oKXt2YXIgYSxvPXIudmFsdWU7aWYoaXNVbmhhbmRsZWQocikpe2E9RCgoZnVuY3Rpb24oKXtKP1kuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixvLHQpOmRpc3BhdGNoRXZlbnQoInVuaGFuZGxlZHJlamVjdGlvbiIsdCxvKX0pKTtyLnJlamVjdGlvbj1KfHxpc1VuaGFuZGxlZChyKT8yOjE7aWYoYS5lcnJvcil0aHJvdyBhLnZhbHVlfX0pKX0saXNVbmhhbmRsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEhPT10LnJlamVjdGlvbiYmIXQucGFyZW50fSxvbkhhbmRsZVVuaGFuZGxlZD1mdW5jdGlvbih0LHIpe3guY2FsbChoLChmdW5jdGlvbigpe0o/WS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpkaXNwYXRjaEV2ZW50KCJyZWplY3Rpb25oYW5kbGVkIix0LHIudmFsdWUpfSkpfSxiaW5kPWZ1bmN0aW9uKHQscixhLG8pe3JldHVybiBmdW5jdGlvbihpKXt0KHIsYSxpLG8pfX0saW50ZXJuYWxSZWplY3Q9ZnVuY3Rpb24odCxyLGEsbyl7aWYoIXIuZG9uZSl7ci5kb25lPSEwO28mJihyPW8pO3IudmFsdWU9YTtyLnN0YXRlPTI7bm90aWZ5KHQsciwhMCl9fSxpbnRlcm5hbFJlc29sdmU9ZnVuY3Rpb24odCxyLGEsbyl7aWYoIXIuZG9uZSl7ci5kb25lPSEwO28mJihyPW8pO3RyeXtpZih0PT09YSl0aHJvdyBIKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpO3ZhciBpPWlzVGhlbmFibGUoYSk7aWYoaSlUKChmdW5jdGlvbigpe3ZhciBvPXtkb25lOiExfTt0cnl7aS5jYWxsKGEsYmluZChpbnRlcm5hbFJlc29sdmUsdCxvLHIpLGJpbmQoaW50ZXJuYWxSZWplY3QsdCxvLHIpKX1jYXRjaChhKXtpbnRlcm5hbFJlamVjdCh0LG8sYSxyKX19KSk7ZWxzZXtyLnZhbHVlPWE7ci5zdGF0ZT0xO25vdGlmeSh0LHIsITEpfX1jYXRjaChhKXtpbnRlcm5hbFJlamVjdCh0LHtkb25lOiExfSxhLHIpfX19O2lmKFope3o9ZnVuY3Rpb24gUHJvbWlzZSh0KXtDKHRoaXMseixCKTtTKHQpO28uY2FsbCh0aGlzKTt2YXIgcj1xKHRoaXMpO3RyeXt0KGJpbmQoaW50ZXJuYWxSZXNvbHZlLHRoaXMsciksYmluZChpbnRlcm5hbFJlamVjdCx0aGlzLHIpKX1jYXRjaCh0KXtpbnRlcm5hbFJlamVjdCh0aGlzLHIsdCl9fTsobz1mdW5jdGlvbiBQcm9taXNlKHQpe0codGhpcyx7dHlwZTpCLGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpbXSxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT1nKHoucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uIHRoZW4odCxyKXt2YXIgYT1VKHRoaXMpLG89UShQKHRoaXMseikpO28ub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHQ7by5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiByJiZyO28uZG9tYWluPUo/WS5kb21haW46dm9pZCAwO2EucGFyZW50PSEwO2EucmVhY3Rpb25zLnB1c2gobyk7MCE9YS5zdGF0ZSYmbm90aWZ5KHRoaXMsYSwhMSk7cmV0dXJuIG8ucHJvbWlzZX0sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsdCl9fSk7aT1mdW5jdGlvbigpe3ZhciB0PW5ldyBvLHI9cSh0KTt0aGlzLnByb21pc2U9dDt0aGlzLnJlc29sdmU9YmluZChpbnRlcm5hbFJlc29sdmUsdCxyKTt0aGlzLnJlamVjdD1iaW5kKGludGVybmFsUmVqZWN0LHQscil9O0kuZj1RPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09enx8dD09PWw/bmV3IGkodCk6Syh0KX07aWYoIWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBtKXtjPW0ucHJvdG90eXBlLnRoZW47dihtLnByb3RvdHlwZSwidGhlbiIsKGZ1bmN0aW9uIHRoZW4odCxyKXt2YXIgYT10aGlzO3JldHVybiBuZXcgeigoZnVuY3Rpb24odCxyKXtjLmNhbGwoYSx0LHIpfSkpLnRoZW4odCxyKX0pLHt1bnNhZmU6ITB9KTsiZnVuY3Rpb24iPT10eXBlb2YgWCYmdSh7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24gZmV0Y2godCl7cmV0dXJuIEUoeixYLmFwcGx5KGgsYXJndW1lbnRzKSl9fSl9fXUoe2dsb2JhbDohMCx3cmFwOiEwLGZvcmNlZDpafSx7UHJvbWlzZTp6fSk7eSh6LEIsITEsITApO2IoQik7bD1wKEIpO3Uoe3RhcmdldDpCLHN0YXQ6ITAsZm9yY2VkOlp9LHtyZWplY3Q6ZnVuY3Rpb24gcmVqZWN0KHQpe3ZhciByPVEodGhpcyk7ci5yZWplY3QuY2FsbCh2b2lkIDAsdCk7cmV0dXJuIHIucHJvbWlzZX19KTt1KHt0YXJnZXQ6QixzdGF0OiEwLGZvcmNlZDpkfHxafSx7cmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlKHQpe3JldHVybiBFKGQmJnRoaXM9PT1sP3o6dGhpcyx0KX19KTt1KHt0YXJnZXQ6QixzdGF0OiEwLGZvcmNlZDplZX0se2FsbDpmdW5jdGlvbiBhbGwodCl7dmFyIHI9dGhpcyxhPVEociksbz1hLnJlc29sdmUsaT1hLnJlamVjdCxsPUQoKGZ1bmN0aW9uKCl7dmFyIGE9UyhyLnJlc29sdmUpLGw9W10sYz0wLHU9MTtrKHQsKGZ1bmN0aW9uKHQpe3ZhciBkPWMrKyxoPSExO2wucHVzaCh2b2lkIDApO3UrKzthLmNhbGwocix0KS50aGVuKChmdW5jdGlvbih0KXtpZighaCl7aD0hMDtsW2RdPXQ7LS11fHxvKGwpfX0pLGkpfSkpOy0tdXx8byhsKX0pKTtsLmVycm9yJiZpKGwudmFsdWUpO3JldHVybiBhLnByb21pc2V9LHJhY2U6ZnVuY3Rpb24gcmFjZSh0KXt2YXIgcj10aGlzLGE9UShyKSxvPWEucmVqZWN0LGk9RCgoZnVuY3Rpb24oKXt2YXIgaT1TKHIucmVzb2x2ZSk7ayh0LChmdW5jdGlvbih0KXtpLmNhbGwocix0KS50aGVuKGEucmVzb2x2ZSxvKX0pKX0pKTtpLmVycm9yJiZvKGkudmFsdWUpO3JldHVybiBhLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDExKTt0LmV4cG9ydHM9by5Qcm9taXNlfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgyOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXtmb3IodmFyIGkgaW4gcilvKHQsaSxyW2ldLGEpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDQyKSxpPWEoMjcpLGw9YSg1NyksYz1hKDEzKSx1PWwoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIHI9byh0KSxhPWkuZjtjJiZyJiYhclt1XSYmYShyLHUse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCAiKyhhP2ErIiAiOiIiKSsiaW52b2NhdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvLGksbCxjPWEoMTEpLHU9YSgxNCksZD1hKDE5KSxoPWEoNjIpLHA9YSg3NCksbT1hKDI1KSx2PWEoMTI4KSxnPWMubG9jYXRpb24seT1jLnNldEltbWVkaWF0ZSxiPWMuY2xlYXJJbW1lZGlhdGUsXz1jLnByb2Nlc3MsUz1jLk1lc3NhZ2VDaGFubmVsLEM9Yy5EaXNwYXRjaCxBPTAsUj17fSxydW49ZnVuY3Rpb24odCl7aWYoUi5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIHI9Ult0XTtkZWxldGUgUlt0XTtyKCl9fSxydW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cnVuKHQpfX0sbGlzdGVuZXI9ZnVuY3Rpb24odCl7cnVuKHQuZGF0YSl9LHBvc3Q9ZnVuY3Rpb24odCl7Yy5wb3N0TWVzc2FnZSh0KyIiLGcucHJvdG9jb2wrIi8vIitnLmhvc3QpfTtpZigheXx8IWIpe3k9ZnVuY3Rpb24gc2V0SW1tZWRpYXRlKHQpe2Zvcih2YXIgcj1bXSxhPTE7YXJndW1lbnRzLmxlbmd0aD5hOylyLnB1c2goYXJndW1lbnRzW2ErK10pO1JbKytBXT1mdW5jdGlvbigpeygiZnVuY3Rpb24iPT10eXBlb2YgdD90OkZ1bmN0aW9uKHQpKS5hcHBseSh2b2lkIDAscil9O28oQSk7cmV0dXJuIEF9O2I9ZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUodCl7ZGVsZXRlIFJbdF19O2lmKCJwcm9jZXNzIj09ZChfKSlvPWZ1bmN0aW9uKHQpe18ubmV4dFRpY2socnVubmVyKHQpKX07ZWxzZSBpZihDJiZDLm5vdylvPWZ1bmN0aW9uKHQpe0Mubm93KHJ1bm5lcih0KSl9O2Vsc2UgaWYoUyYmIXYpe2w9KGk9bmV3IFMpLnBvcnQyO2kucG9ydDEub25tZXNzYWdlPWxpc3RlbmVyO289aChsLnBvc3RNZXNzYWdlLGwsMSl9ZWxzZSBpZighYy5hZGRFdmVudExpc3RlbmVyfHwiZnVuY3Rpb24iIT10eXBlb2YgcG9zdE1lc3NhZ2V8fGMuaW1wb3J0U2NyaXB0c3x8dShwb3N0KXx8ImZpbGU6Ij09PWcucHJvdG9jb2wpbz0ib25yZWFkeXN0YXRlY2hhbmdlImluIG0oInNjcmlwdCIpP2Z1bmN0aW9uKHQpe3AuYXBwZW5kQ2hpbGQobSgic2NyaXB0IikpLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3AucmVtb3ZlQ2hpbGQodGhpcyk7cnVuKHQpfX06ZnVuY3Rpb24odCl7c2V0VGltZW91dChydW5uZXIodCksMCl9O2Vsc2V7bz1wb3N0O2MuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbGlzdGVuZXIsITEpfX10LmV4cG9ydHM9e3NldDp5LGNsZWFyOmJ9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMjkpO3QuZXhwb3J0cz0vKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3Qobyl9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDQyKTt0LmV4cG9ydHM9bygibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LHIsYSl7dmFyIG8saSxsLGMsdSxkLGgscCxtPWEoMTEpLHY9YSgxMikuZixnPWEoMTkpLHk9YSgxMjcpLnNldCxiPWEoMTI4KSxfPW0uTXV0YXRpb25PYnNlcnZlcnx8bS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLFM9bS5wcm9jZXNzLEM9bS5Qcm9taXNlLEE9InByb2Nlc3MiPT1nKFMpLFI9dihtLCJxdWV1ZU1pY3JvdGFzayIpLGs9UiYmUi52YWx1ZTtpZighayl7bz1mdW5jdGlvbigpe3ZhciB0LHI7QSYmKHQ9Uy5kb21haW4pJiZ0LmV4aXQoKTtmb3IoO2k7KXtyPWkuZm47aT1pLm5leHQ7dHJ5e3IoKX1jYXRjaCh0KXtpP2MoKTpsPXZvaWQgMDt0aHJvdyB0fX1sPXZvaWQgMDt0JiZ0LmVudGVyKCl9O2lmKEEpYz1mdW5jdGlvbigpe1MubmV4dFRpY2sobyl9O2Vsc2UgaWYoXyYmIWIpe3U9ITA7ZD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IF8obykub2JzZXJ2ZShkLHtjaGFyYWN0ZXJEYXRhOiEwfSk7Yz1mdW5jdGlvbigpe2QuZGF0YT11PSF1fX1lbHNlIGlmKEMmJkMucmVzb2x2ZSl7aD1DLnJlc29sdmUodm9pZCAwKTtwPWgudGhlbjtjPWZ1bmN0aW9uKCl7cC5jYWxsKGgsbyl9fWVsc2UgYz1mdW5jdGlvbigpe3kuY2FsbChtLG8pfX10LmV4cG9ydHM9a3x8ZnVuY3Rpb24odCl7dmFyIHI9e2ZuOnQsbmV4dDp2b2lkIDB9O2wmJihsLm5leHQ9cik7aWYoIWkpe2k9cjtjKCl9bD1yfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMjgpLGk9YSgyMiksbD1hKDEzMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7byh0KTtpZihpKHIpJiZyLmNvbnN0cnVjdG9yPT09dClyZXR1cm4gcjt2YXIgYT1sLmYodCk7KDAsYS5yZXNvbHZlKShyKTtyZXR1cm4gYS5wcm9taXNlfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDYzKSxQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbih0KXt2YXIgcixhO3RoaXMucHJvbWlzZT1uZXcgdCgoZnVuY3Rpb24odCxvKXtpZih2b2lkIDAhPT1yfHx2b2lkIDAhPT1hKXRocm93IFR5cGVFcnJvcigiQmFkIFByb21pc2UgY29uc3RydWN0b3IiKTtyPXQ7YT1vfSkpO3RoaXMucmVzb2x2ZT1vKHIpO3RoaXMucmVqZWN0PW8oYSl9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkodCl9fSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7dmFyIGE9by5jb25zb2xlO2EmJmEuZXJyb3ImJigxPT09YXJndW1lbnRzLmxlbmd0aD9hLmVycm9yKHQpOmEuZXJyb3IodCxyKSl9fSxmdW5jdGlvbih0LHIpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJue2Vycm9yOiExLHZhbHVlOnQoKX19Y2F0Y2godCl7cmV0dXJue2Vycm9yOiEwLHZhbHVlOnR9fX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbyxpLGw9YSgxMSksYz1hKDEyOSksdT1sLnByb2Nlc3MsZD11JiZ1LnZlcnNpb25zLGg9ZCYmZC52ODtoP2k9KG89aC5zcGxpdCgiLiIpKVswXStvWzFdOmMmJighKG89Yy5tYXRjaCgvRWRnZVwvKFxkKykvKSl8fG9bMV0+PTc0KSYmKG89Yy5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pKSYmKGk9b1sxXSk7dC5leHBvcnRzPWkmJitpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTApLGk9YSg2MyksbD1hKDEzMiksYz1hKDEzNCksdT1hKDEwNCk7byh7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YWxsU2V0dGxlZDpmdW5jdGlvbiBhbGxTZXR0bGVkKHQpe3ZhciByPXRoaXMsYT1sLmYociksbz1hLnJlc29sdmUsZD1hLnJlamVjdCxoPWMoKGZ1bmN0aW9uKCl7dmFyIGE9aShyLnJlc29sdmUpLGw9W10sYz0wLGQ9MTt1KHQsKGZ1bmN0aW9uKHQpe3ZhciBpPWMrKyx1PSExO2wucHVzaCh2b2lkIDApO2QrKzthLmNhbGwocix0KS50aGVuKChmdW5jdGlvbih0KXtpZighdSl7dT0hMDtsW2ldPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6dH07LS1kfHxvKGwpfX0pLChmdW5jdGlvbih0KXtpZighdSl7dT0hMDtsW2ldPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246dH07LS1kfHxvKGwpfX0pKX0pKTstLWR8fG8obCl9KSk7aC5lcnJvciYmZChoLnZhbHVlKTtyZXR1cm4gYS5wcm9taXNlfX0pfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTApLGk9YSgzNyksbD1hKDEyMyksYz1hKDE0KSx1PWEoNDIpLGQ9YSgxMTYpLGg9YSgxMzEpLHA9YSgyOSk7byh7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohIWwmJmMoKGZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuZmluYWxseS5jYWxsKHt0aGVuOmZ1bmN0aW9uKCl7fX0sKGZ1bmN0aW9uKCl7fSkpfSkpfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgcj1kKHRoaXMsdSgiUHJvbWlzZSIpKSxhPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4oYT9mdW5jdGlvbihhKXtyZXR1cm4gaChyLHQoKSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKX06dCxhP2Z1bmN0aW9uKGEpe3JldHVybiBoKHIsdCgpKS50aGVuKChmdW5jdGlvbigpe3Rocm93IGF9KSl9OnQpfX0pO2l8fCJmdW5jdGlvbiIhPXR5cGVvZiBsfHxsLnByb3RvdHlwZS5maW5hbGx5fHxwKGwucHJvdG90eXBlLCJmaW5hbGx5Iix1KCJQcm9taXNlIikucHJvdG90eXBlLmZpbmFsbHkpfSxmdW5jdGlvbih0LHIsYSl7YSgxMzkpO2EoMTQ0KTthKDE0Mik7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uVVJMfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO2EoNzcpO3ZhciBvLGk9YSgxMCksbD1hKDEzKSxjPWEoMTQwKSx1PWEoMTEpLGQ9YSg3MiksaD1hKDI5KSxwPWEoMTI2KSxtPWEoMjMpLHY9YSgxMDApLGc9YSg5MCkseT1hKDc4KS5jb2RlQXQsYj1hKDE0MSksXz1hKDg1KSxTPWEoMTQyKSxDPWEoMzMpLEE9dS5VUkwsUj1TLlVSTFNlYXJjaFBhcmFtcyxrPVMuZ2V0U3RhdGUsdz1DLnNldCxQPUMuZ2V0dGVyRm9yKCJVUkwiKSx4PU1hdGguZmxvb3IsVD1NYXRoLnBvdyxFPS9bQS1aYS16XS8sTz0vW1xkKy0uQS1aYS16XS8sST0vXGQvLEQ9L14oMHh8MFgpLyxMPS9eWzAtN10rJC8sTT0vXlxkKyQvLFc9L15bXGRBLUZhLWZdKyQvLGo9L1tcdTAwMDBcdTAwMDlcdTAwMEFcdTAwMEQgIyUvOj9AW1xcXV0vLE49L1tcdTAwMDBcdTAwMDlcdTAwMEFcdTAwMEQgIy86P0BbXFxdXS8sQj0vXltcdTAwMDAtXHUwMDFGIF0rfFtcdTAwMDAtXHUwMDFGIF0rJC9nLHE9L1tcdTAwMDlcdTAwMEFcdTAwMERdL2cscGFyc2VIb3N0PWZ1bmN0aW9uKHQscil7dmFyIGEsbyxpO2lmKCJbIj09ci5jaGFyQXQoMCkpe2lmKCJdIiE9ci5jaGFyQXQoci5sZW5ndGgtMSkpcmV0dXJuIkludmFsaWQgaG9zdCI7aWYoIShhPXBhcnNlSVB2NihyLnNsaWNlKDEsLTEpKSkpcmV0dXJuIkludmFsaWQgaG9zdCI7dC5ob3N0PWF9ZWxzZSBpZihpc1NwZWNpYWwodCkpe3I9YihyKTtpZihqLnRlc3QocikpcmV0dXJuIkludmFsaWQgaG9zdCI7aWYobnVsbD09PShhPXBhcnNlSVB2NChyKSkpcmV0dXJuIkludmFsaWQgaG9zdCI7dC5ob3N0PWF9ZWxzZXtpZihOLnRlc3QocikpcmV0dXJuIkludmFsaWQgaG9zdCI7YT0iIjtvPWcocik7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krKylhKz1wZXJjZW50RW5jb2RlKG9baV0sRyk7dC5ob3N0PWF9fSxwYXJzZUlQdjQ9ZnVuY3Rpb24odCl7dmFyIHIsYSxvLGksbCxjLHUsZD10LnNwbGl0KCIuIik7ZC5sZW5ndGgmJiIiPT1kW2QubGVuZ3RoLTFdJiZkLnBvcCgpO2lmKChyPWQubGVuZ3RoKT40KXJldHVybiB0O2E9W107Zm9yKG89MDtvPHI7bysrKXtpZigiIj09KGk9ZFtvXSkpcmV0dXJuIHQ7bD0xMDtpZihpLmxlbmd0aD4xJiYiMCI9PWkuY2hhckF0KDApKXtsPUQudGVzdChpKT8xNjo4O2k9aS5zbGljZSg4PT1sPzE6Mil9aWYoIiI9PT1pKWM9MDtlbHNle2lmKCEoMTA9PWw/TTo4PT1sP0w6VykudGVzdChpKSlyZXR1cm4gdDtjPXBhcnNlSW50KGksbCl9YS5wdXNoKGMpfWZvcihvPTA7bzxyO28rKyl7Yz1hW29dO2lmKG89PXItMSl7aWYoYz49VCgyNTYsNS1yKSlyZXR1cm4gbnVsbH1lbHNlIGlmKGM+MjU1KXJldHVybiBudWxsfXU9YS5wb3AoKTtmb3Iobz0wO288YS5sZW5ndGg7bysrKXUrPWFbb10qVCgyNTYsMy1vKTtyZXR1cm4gdX0scGFyc2VJUHY2PWZ1bmN0aW9uKHQpe3ZhciByLGEsbyxpLGwsYyx1LGQ9WzAsMCwwLDAsMCwwLDAsMF0saD0wLHA9bnVsbCxtPTAsY2hhcj1mdW5jdGlvbigpe3JldHVybiB0LmNoYXJBdChtKX07aWYoIjoiPT1jaGFyKCkpe2lmKCI6IiE9dC5jaGFyQXQoMSkpcmV0dXJuO20rPTI7cD0rK2h9Zm9yKDtjaGFyKCk7KXtpZig4PT1oKXJldHVybjtpZigiOiIhPWNoYXIoKSl7cj1hPTA7Zm9yKDthPDQmJlcudGVzdChjaGFyKCkpOyl7cj0xNipyK3BhcnNlSW50KGNoYXIoKSwxNik7bSsrO2ErK31pZigiLiI9PWNoYXIoKSl7aWYoMD09YSlyZXR1cm47bS09YTtpZihoPjYpcmV0dXJuO289MDtmb3IoO2NoYXIoKTspe2k9bnVsbDtpZihvPjApe2lmKCEoIi4iPT1jaGFyKCkmJm88NCkpcmV0dXJuO20rK31pZighSS50ZXN0KGNoYXIoKSkpcmV0dXJuO2Zvcig7SS50ZXN0KGNoYXIoKSk7KXtsPXBhcnNlSW50KGNoYXIoKSwxMCk7aWYobnVsbD09PWkpaT1sO2Vsc2V7aWYoMD09aSlyZXR1cm47aT0xMCppK2x9aWYoaT4yNTUpcmV0dXJuO20rK31kW2hdPTI1NipkW2hdK2k7MiE9KytvJiY0IT1vfHxoKyt9aWYoNCE9bylyZXR1cm47YnJlYWt9aWYoIjoiPT1jaGFyKCkpe20rKztpZighY2hhcigpKXJldHVybn1lbHNlIGlmKGNoYXIoKSlyZXR1cm47ZFtoKytdPXJ9ZWxzZXtpZihudWxsIT09cClyZXR1cm47bSsrO3A9KytofX1pZihudWxsIT09cCl7Yz1oLXA7aD03O2Zvcig7MCE9aCYmYz4wOyl7dT1kW2hdO2RbaC0tXT1kW3ArYy0xXTtkW3ArLS1jXT11fX1lbHNlIGlmKDghPWgpcmV0dXJuO3JldHVybiBkfSxzZXJpYWxpemVIb3N0PWZ1bmN0aW9uKHQpe3ZhciByLGEsbyxpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7cj1bXTtmb3IoYT0wO2E8NDthKyspe3IudW5zaGlmdCh0JTI1Nik7dD14KHQvMjU2KX1yZXR1cm4gci5qb2luKCIuIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtyPSIiO289ZnVuY3Rpb24odCl7Zm9yKHZhciByPW51bGwsYT0xLG89bnVsbCxpPTAsbD0wO2w8ODtsKyspaWYoMCE9PXRbbF0pe2lmKGk+YSl7cj1vO2E9aX1vPW51bGw7aT0wfWVsc2V7bnVsbD09PW8mJihvPWwpOysraX1pZihpPmEpe3I9bzthPWl9cmV0dXJuIHJ9KHQpO2ZvcihhPTA7YTw4O2ErKylpZighaXx8MCE9PXRbYV0pe2kmJihpPSExKTtpZihvPT09YSl7cis9YT8iOiI6Ijo6IjtpPSEwfWVsc2V7cis9dFthXS50b1N0cmluZygxNik7YTw3JiYocis9IjoiKX19cmV0dXJuIlsiK3IrIl0ifXJldHVybiB0fSxHPXt9LFU9dih7fSxHLHsiICI6MSwnIic6MSwiPCI6MSwiPiI6MSwiYCI6MX0pLHo9dih7fSxVLHsiIyI6MSwiPyI6MSwieyI6MSwifSI6MX0pLEg9dih7fSx6LHsiLyI6MSwiOiI6MSwiOyI6MSwiPSI6MSwiQCI6MSwiWyI6MSwiXFwiOjEsIl0iOjEsIl4iOjEsInwiOjF9KSxwZXJjZW50RW5jb2RlPWZ1bmN0aW9uKHQscil7dmFyIGE9eSh0LDApO3JldHVybiBhPjMyJiZhPDEyNyYmIW0ocix0KT90OmVuY29kZVVSSUNvbXBvbmVudCh0KX0sVj17ZnRwOjIxLGZpbGU6bnVsbCxodHRwOjgwLGh0dHBzOjQ0Myx3czo4MCx3c3M6NDQzfSxpc1NwZWNpYWw9ZnVuY3Rpb24odCl7cmV0dXJuIG0oVix0LnNjaGVtZSl9LGluY2x1ZGVzQ3JlZGVudGlhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIiIhPXQudXNlcm5hbWV8fCIiIT10LnBhc3N3b3JkfSxjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIXQuaG9zdHx8dC5jYW5ub3RCZUFCYXNlVVJMfHwiZmlsZSI9PXQuc2NoZW1lfSxpc1dpbmRvd3NEcml2ZUxldHRlcj1mdW5jdGlvbih0LHIpe3ZhciBhO3JldHVybiAyPT10Lmxlbmd0aCYmRS50ZXN0KHQuY2hhckF0KDApKSYmKCI6Ij09KGE9dC5jaGFyQXQoMSkpfHwhciYmInwiPT1hKX0sc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcj1mdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4gdC5sZW5ndGg+MSYmaXNXaW5kb3dzRHJpdmVMZXR0ZXIodC5zbGljZSgwLDIpKSYmKDI9PXQubGVuZ3RofHwiLyI9PT0ocj10LmNoYXJBdCgyKSl8fCJcXCI9PT1yfHwiPyI9PT1yfHwiIyI9PT1yKX0sc2hvcnRlblVSTHNQYXRoPWZ1bmN0aW9uKHQpe3ZhciByPXQucGF0aCxhPXIubGVuZ3RoOyFhfHwiZmlsZSI9PXQuc2NoZW1lJiYxPT1hJiZpc1dpbmRvd3NEcml2ZUxldHRlcihyWzBdLCEwKXx8ci5wb3AoKX0saXNTaW5nbGVEb3Q9ZnVuY3Rpb24odCl7cmV0dXJuIi4iPT09dHx8IiUyZSI9PT10LnRvTG93ZXJDYXNlKCl9LFk9e30sWD17fSxRPXt9LEs9e30sSj17fSwkPXt9LFo9e30sZWU9e30sdGU9e30scmU9e30sbmU9e30sYWU9e30sb2U9e30saWU9e30sc2U9e30sbGU9e30sY2U9e30sdWU9e30sZmU9e30sZGU9e30saGU9e30scGFyc2VVUkw9ZnVuY3Rpb24odCxyLGEsaSl7dmFyIGwsYyx1LGQsaCxwPWF8fFksdj0wLHk9IiIsYj0hMSxfPSExLFM9ITE7aWYoIWEpe3Quc2NoZW1lPSIiO3QudXNlcm5hbWU9IiI7dC5wYXNzd29yZD0iIjt0Lmhvc3Q9bnVsbDt0LnBvcnQ9bnVsbDt0LnBhdGg9W107dC5xdWVyeT1udWxsO3QuZnJhZ21lbnQ9bnVsbDt0LmNhbm5vdEJlQUJhc2VVUkw9ITE7cj1yLnJlcGxhY2UoQiwiIil9cj1yLnJlcGxhY2UocSwiIik7bD1nKHIpO2Zvcig7djw9bC5sZW5ndGg7KXtjPWxbdl07c3dpdGNoKHApe2Nhc2UgWTppZighY3x8IUUudGVzdChjKSl7aWYoYSlyZXR1cm4iSW52YWxpZCBzY2hlbWUiO3A9UTtjb250aW51ZX15Kz1jLnRvTG93ZXJDYXNlKCk7cD1YO2JyZWFrO2Nhc2UgWDppZihjJiYoTy50ZXN0KGMpfHwiKyI9PWN8fCItIj09Y3x8Ii4iPT1jKSl5Kz1jLnRvTG93ZXJDYXNlKCk7ZWxzZXtpZigiOiIhPWMpe2lmKGEpcmV0dXJuIkludmFsaWQgc2NoZW1lIjt5PSIiO3A9UTt2PTA7Y29udGludWV9aWYoYSYmKGlzU3BlY2lhbCh0KSE9bShWLHkpfHwiZmlsZSI9PXkmJihpbmNsdWRlc0NyZWRlbnRpYWxzKHQpfHxudWxsIT09dC5wb3J0KXx8ImZpbGUiPT10LnNjaGVtZSYmIXQuaG9zdCkpcmV0dXJuO3Quc2NoZW1lPXk7aWYoYSl7aXNTcGVjaWFsKHQpJiZWW3Quc2NoZW1lXT09dC5wb3J0JiYodC5wb3J0PW51bGwpO3JldHVybn15PSIiO2lmKCJmaWxlIj09dC5zY2hlbWUpcD1pZTtlbHNlIGlmKGlzU3BlY2lhbCh0KSYmaSYmaS5zY2hlbWU9PXQuc2NoZW1lKXA9SztlbHNlIGlmKGlzU3BlY2lhbCh0KSlwPWVlO2Vsc2UgaWYoIi8iPT1sW3YrMV0pe3A9Sjt2Kyt9ZWxzZXt0LmNhbm5vdEJlQUJhc2VVUkw9ITA7dC5wYXRoLnB1c2goIiIpO3A9ZmV9fWJyZWFrO2Nhc2UgUTppZighaXx8aS5jYW5ub3RCZUFCYXNlVVJMJiYiIyIhPWMpcmV0dXJuIkludmFsaWQgc2NoZW1lIjtpZihpLmNhbm5vdEJlQUJhc2VVUkwmJiIjIj09Yyl7dC5zY2hlbWU9aS5zY2hlbWU7dC5wYXRoPWkucGF0aC5zbGljZSgpO3QucXVlcnk9aS5xdWVyeTt0LmZyYWdtZW50PSIiO3QuY2Fubm90QmVBQmFzZVVSTD0hMDtwPWhlO2JyZWFrfXA9ImZpbGUiPT1pLnNjaGVtZT9pZTokO2NvbnRpbnVlO2Nhc2UgSzppZigiLyIhPWN8fCIvIiE9bFt2KzFdKXtwPSQ7Y29udGludWV9cD10ZTt2Kys7YnJlYWs7Y2FzZSBKOmlmKCIvIj09Yyl7cD1yZTticmVha31wPXVlO2NvbnRpbnVlO2Nhc2UgJDp0LnNjaGVtZT1pLnNjaGVtZTtpZihjPT1vKXt0LnVzZXJuYW1lPWkudXNlcm5hbWU7dC5wYXNzd29yZD1pLnBhc3N3b3JkO3QuaG9zdD1pLmhvc3Q7dC5wb3J0PWkucG9ydDt0LnBhdGg9aS5wYXRoLnNsaWNlKCk7dC5xdWVyeT1pLnF1ZXJ5fWVsc2UgaWYoIi8iPT1jfHwiXFwiPT1jJiZpc1NwZWNpYWwodCkpcD1aO2Vsc2UgaWYoIj8iPT1jKXt0LnVzZXJuYW1lPWkudXNlcm5hbWU7dC5wYXNzd29yZD1pLnBhc3N3b3JkO3QuaG9zdD1pLmhvc3Q7dC5wb3J0PWkucG9ydDt0LnBhdGg9aS5wYXRoLnNsaWNlKCk7dC5xdWVyeT0iIjtwPWRlfWVsc2V7aWYoIiMiIT1jKXt0LnVzZXJuYW1lPWkudXNlcm5hbWU7dC5wYXNzd29yZD1pLnBhc3N3b3JkO3QuaG9zdD1pLmhvc3Q7dC5wb3J0PWkucG9ydDt0LnBhdGg9aS5wYXRoLnNsaWNlKCk7dC5wYXRoLnBvcCgpO3A9dWU7Y29udGludWV9dC51c2VybmFtZT1pLnVzZXJuYW1lO3QucGFzc3dvcmQ9aS5wYXNzd29yZDt0Lmhvc3Q9aS5ob3N0O3QucG9ydD1pLnBvcnQ7dC5wYXRoPWkucGF0aC5zbGljZSgpO3QucXVlcnk9aS5xdWVyeTt0LmZyYWdtZW50PSIiO3A9aGV9YnJlYWs7Y2FzZSBaOmlmKCFpc1NwZWNpYWwodCl8fCIvIiE9YyYmIlxcIiE9Yyl7aWYoIi8iIT1jKXt0LnVzZXJuYW1lPWkudXNlcm5hbWU7dC5wYXNzd29yZD1pLnBhc3N3b3JkO3QuaG9zdD1pLmhvc3Q7dC5wb3J0PWkucG9ydDtwPXVlO2NvbnRpbnVlfXA9cmV9ZWxzZSBwPXRlO2JyZWFrO2Nhc2UgZWU6cD10ZTtpZigiLyIhPWN8fCIvIiE9eS5jaGFyQXQodisxKSljb250aW51ZTt2Kys7YnJlYWs7Y2FzZSB0ZTppZigiLyIhPWMmJiJcXCIhPWMpe3A9cmU7Y29udGludWV9YnJlYWs7Y2FzZSByZTppZigiQCI9PWMpe2ImJih5PSIlNDAiK3kpO2I9ITA7dT1nKHkpO2Zvcih2YXIgQz0wO0M8dS5sZW5ndGg7QysrKXt2YXIgQT11W0NdO2lmKCI6IiE9QXx8Uyl7dmFyIFI9cGVyY2VudEVuY29kZShBLEgpO1M/dC5wYXNzd29yZCs9Ujp0LnVzZXJuYW1lKz1SfWVsc2UgUz0hMH15PSIifWVsc2UgaWYoYz09b3x8Ii8iPT1jfHwiPyI9PWN8fCIjIj09Y3x8IlxcIj09YyYmaXNTcGVjaWFsKHQpKXtpZihiJiYiIj09eSlyZXR1cm4iSW52YWxpZCBhdXRob3JpdHkiO3YtPWcoeSkubGVuZ3RoKzE7eT0iIjtwPW5lfWVsc2UgeSs9YzticmVhaztjYXNlIG5lOmNhc2UgYWU6aWYoYSYmImZpbGUiPT10LnNjaGVtZSl7cD1sZTtjb250aW51ZX1pZigiOiIhPWN8fF8pe2lmKGM9PW98fCIvIj09Y3x8Ij8iPT1jfHwiIyI9PWN8fCJcXCI9PWMmJmlzU3BlY2lhbCh0KSl7aWYoaXNTcGVjaWFsKHQpJiYiIj09eSlyZXR1cm4iSW52YWxpZCBob3N0IjtpZihhJiYiIj09eSYmKGluY2x1ZGVzQ3JlZGVudGlhbHModCl8fG51bGwhPT10LnBvcnQpKXJldHVybjtpZihkPXBhcnNlSG9zdCh0LHkpKXJldHVybiBkO3k9IiI7cD1jZTtpZihhKXJldHVybjtjb250aW51ZX0iWyI9PWM/Xz0hMDoiXSI9PWMmJihfPSExKTt5Kz1jfWVsc2V7aWYoIiI9PXkpcmV0dXJuIkludmFsaWQgaG9zdCI7aWYoZD1wYXJzZUhvc3QodCx5KSlyZXR1cm4gZDt5PSIiO3A9b2U7aWYoYT09YWUpcmV0dXJufWJyZWFrO2Nhc2Ugb2U6aWYoIUkudGVzdChjKSl7aWYoYz09b3x8Ii8iPT1jfHwiPyI9PWN8fCIjIj09Y3x8IlxcIj09YyYmaXNTcGVjaWFsKHQpfHxhKXtpZigiIiE9eSl7dmFyIGs9cGFyc2VJbnQoeSwxMCk7aWYoaz42NTUzNSlyZXR1cm4iSW52YWxpZCBwb3J0Ijt0LnBvcnQ9aXNTcGVjaWFsKHQpJiZrPT09Vlt0LnNjaGVtZV0/bnVsbDprO3k9IiJ9aWYoYSlyZXR1cm47cD1jZTtjb250aW51ZX1yZXR1cm4iSW52YWxpZCBwb3J0In15Kz1jO2JyZWFrO2Nhc2UgaWU6dC5zY2hlbWU9ImZpbGUiO2lmKCIvIj09Y3x8IlxcIj09YylwPXNlO2Vsc2V7aWYoIWl8fCJmaWxlIiE9aS5zY2hlbWUpe3A9dWU7Y29udGludWV9aWYoYz09byl7dC5ob3N0PWkuaG9zdDt0LnBhdGg9aS5wYXRoLnNsaWNlKCk7dC5xdWVyeT1pLnF1ZXJ5fWVsc2UgaWYoIj8iPT1jKXt0Lmhvc3Q9aS5ob3N0O3QucGF0aD1pLnBhdGguc2xpY2UoKTt0LnF1ZXJ5PSIiO3A9ZGV9ZWxzZXtpZigiIyIhPWMpe2lmKCFzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGwuc2xpY2Uodikuam9pbigiIikpKXt0Lmhvc3Q9aS5ob3N0O3QucGF0aD1pLnBhdGguc2xpY2UoKTtzaG9ydGVuVVJMc1BhdGgodCl9cD11ZTtjb250aW51ZX10Lmhvc3Q9aS5ob3N0O3QucGF0aD1pLnBhdGguc2xpY2UoKTt0LnF1ZXJ5PWkucXVlcnk7dC5mcmFnbWVudD0iIjtwPWhlfX1icmVhaztjYXNlIHNlOmlmKCIvIj09Y3x8IlxcIj09Yyl7cD1sZTticmVha31pJiYiZmlsZSI9PWkuc2NoZW1lJiYhc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihsLnNsaWNlKHYpLmpvaW4oIiIpKSYmKGlzV2luZG93c0RyaXZlTGV0dGVyKGkucGF0aFswXSwhMCk/dC5wYXRoLnB1c2goaS5wYXRoWzBdKTp0Lmhvc3Q9aS5ob3N0KTtwPXVlO2NvbnRpbnVlO2Nhc2UgbGU6aWYoYz09b3x8Ii8iPT1jfHwiXFwiPT1jfHwiPyI9PWN8fCIjIj09Yyl7aWYoIWEmJmlzV2luZG93c0RyaXZlTGV0dGVyKHkpKXA9dWU7ZWxzZSBpZigiIj09eSl7dC5ob3N0PSIiO2lmKGEpcmV0dXJuO3A9Y2V9ZWxzZXtpZihkPXBhcnNlSG9zdCh0LHkpKXJldHVybiBkOyJsb2NhbGhvc3QiPT10Lmhvc3QmJih0Lmhvc3Q9IiIpO2lmKGEpcmV0dXJuO3k9IiI7cD1jZX1jb250aW51ZX15Kz1jO2JyZWFrO2Nhc2UgY2U6aWYoaXNTcGVjaWFsKHQpKXtwPXVlO2lmKCIvIiE9YyYmIlxcIiE9Yyljb250aW51ZX1lbHNlIGlmKGF8fCI/IiE9YylpZihhfHwiIyIhPWMpe2lmKGMhPW8pe3A9dWU7aWYoIi8iIT1jKWNvbnRpbnVlfX1lbHNle3QuZnJhZ21lbnQ9IiI7cD1oZX1lbHNle3QucXVlcnk9IiI7cD1kZX1icmVhaztjYXNlIHVlOmlmKGM9PW98fCIvIj09Y3x8IlxcIj09YyYmaXNTcGVjaWFsKHQpfHwhYSYmKCI/Ij09Y3x8IiMiPT1jKSl7aWYoIi4uIj09PShoPShoPXkpLnRvTG93ZXJDYXNlKCkpfHwiJTJlLiI9PT1ofHwiLiUyZSI9PT1ofHwiJTJlJTJlIj09PWgpe3Nob3J0ZW5VUkxzUGF0aCh0KTsiLyI9PWN8fCJcXCI9PWMmJmlzU3BlY2lhbCh0KXx8dC5wYXRoLnB1c2goIiIpfWVsc2UgaWYoaXNTaW5nbGVEb3QoeSkpIi8iPT1jfHwiXFwiPT1jJiZpc1NwZWNpYWwodCl8fHQucGF0aC5wdXNoKCIiKTtlbHNle2lmKCJmaWxlIj09dC5zY2hlbWUmJiF0LnBhdGgubGVuZ3RoJiZpc1dpbmRvd3NEcml2ZUxldHRlcih5KSl7dC5ob3N0JiYodC5ob3N0PSIiKTt5PXkuY2hhckF0KDApKyI6In10LnBhdGgucHVzaCh5KX15PSIiO2lmKCJmaWxlIj09dC5zY2hlbWUmJihjPT1vfHwiPyI9PWN8fCIjIj09YykpZm9yKDt0LnBhdGgubGVuZ3RoPjEmJiIiPT09dC5wYXRoWzBdOyl0LnBhdGguc2hpZnQoKTtpZigiPyI9PWMpe3QucXVlcnk9IiI7cD1kZX1lbHNlIGlmKCIjIj09Yyl7dC5mcmFnbWVudD0iIjtwPWhlfX1lbHNlIHkrPXBlcmNlbnRFbmNvZGUoYyx6KTticmVhaztjYXNlIGZlOmlmKCI/Ij09Yyl7dC5xdWVyeT0iIjtwPWRlfWVsc2UgaWYoIiMiPT1jKXt0LmZyYWdtZW50PSIiO3A9aGV9ZWxzZSBjIT1vJiYodC5wYXRoWzBdKz1wZXJjZW50RW5jb2RlKGMsRykpO2JyZWFrO2Nhc2UgZGU6aWYoYXx8IiMiIT1jKWMhPW8mJigiJyI9PWMmJmlzU3BlY2lhbCh0KT90LnF1ZXJ5Kz0iJTI3Ijp0LnF1ZXJ5Kz0iIyI9PWM/IiUyMyI6cGVyY2VudEVuY29kZShjLEcpKTtlbHNle3QuZnJhZ21lbnQ9IiI7cD1oZX1icmVhaztjYXNlIGhlOmMhPW8mJih0LmZyYWdtZW50Kz1wZXJjZW50RW5jb2RlKGMsVSkpfXYrK319LHBlPWZ1bmN0aW9uIFVSTCh0KXt2YXIgcixhLG89cCh0aGlzLHBlLCJVUkwiKSxpPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLGM9U3RyaW5nKHQpLHU9dyhvLHt0eXBlOiJVUkwifSk7aWYodm9pZCAwIT09aSlpZihpIGluc3RhbmNlb2YgcGUpcj1QKGkpO2Vsc2UgaWYoYT1wYXJzZVVSTChyPXt9LFN0cmluZyhpKSkpdGhyb3cgVHlwZUVycm9yKGEpO2lmKGE9cGFyc2VVUkwodSxjLG51bGwscikpdGhyb3cgVHlwZUVycm9yKGEpO3ZhciBkPXUuc2VhcmNoUGFyYW1zPW5ldyBSLGg9ayhkKTtoLnVwZGF0ZVNlYXJjaFBhcmFtcyh1LnF1ZXJ5KTtoLnVwZGF0ZVVSTD1mdW5jdGlvbigpe3UucXVlcnk9U3RyaW5nKGQpfHxudWxsfTtpZighbCl7by5ocmVmPXNlcmlhbGl6ZVVSTC5jYWxsKG8pO28ub3JpZ2luPWdldE9yaWdpbi5jYWxsKG8pO28ucHJvdG9jb2w9Z2V0UHJvdG9jb2wuY2FsbChvKTtvLnVzZXJuYW1lPWdldFVzZXJuYW1lLmNhbGwobyk7by5wYXNzd29yZD1nZXRQYXNzd29yZC5jYWxsKG8pO28uaG9zdD1nZXRIb3N0LmNhbGwobyk7by5ob3N0bmFtZT1nZXRIb3N0bmFtZS5jYWxsKG8pO28ucG9ydD1nZXRQb3J0LmNhbGwobyk7by5wYXRobmFtZT1nZXRQYXRobmFtZS5jYWxsKG8pO28uc2VhcmNoPWdldFNlYXJjaC5jYWxsKG8pO28uc2VhcmNoUGFyYW1zPWdldFNlYXJjaFBhcmFtcy5jYWxsKG8pO28uaGFzaD1nZXRIYXNoLmNhbGwobyl9fSxtZT1wZS5wcm90b3R5cGUsc2VyaWFsaXplVVJMPWZ1bmN0aW9uKCl7dmFyIHQ9UCh0aGlzKSxyPXQuc2NoZW1lLGE9dC51c2VybmFtZSxvPXQucGFzc3dvcmQsaT10Lmhvc3QsbD10LnBvcnQsYz10LnBhdGgsdT10LnF1ZXJ5LGQ9dC5mcmFnbWVudCxoPXIrIjoiO2lmKG51bGwhPT1pKXtoKz0iLy8iO2luY2x1ZGVzQ3JlZGVudGlhbHModCkmJihoKz1hKyhvPyI6IitvOiIiKSsiQCIpO2grPXNlcmlhbGl6ZUhvc3QoaSk7bnVsbCE9PWwmJihoKz0iOiIrbCl9ZWxzZSJmaWxlIj09ciYmKGgrPSIvLyIpO2grPXQuY2Fubm90QmVBQmFzZVVSTD9jWzBdOmMubGVuZ3RoPyIvIitjLmpvaW4oIi8iKToiIjtudWxsIT09dSYmKGgrPSI/Iit1KTtudWxsIT09ZCYmKGgrPSIjIitkKTtyZXR1cm4gaH0sZ2V0T3JpZ2luPWZ1bmN0aW9uKCl7dmFyIHQ9UCh0aGlzKSxyPXQuc2NoZW1lLGE9dC5wb3J0O2lmKCJibG9iIj09cil0cnl7cmV0dXJuIG5ldyBVUkwoci5wYXRoWzBdKS5vcmlnaW59Y2F0Y2godCl7cmV0dXJuIm51bGwifXJldHVybiJmaWxlIiE9ciYmaXNTcGVjaWFsKHQpP3IrIjovLyIrc2VyaWFsaXplSG9zdCh0Lmhvc3QpKyhudWxsIT09YT8iOiIrYToiIik6Im51bGwifSxnZXRQcm90b2NvbD1mdW5jdGlvbigpe3JldHVybiBQKHRoaXMpLnNjaGVtZSsiOiJ9LGdldFVzZXJuYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFAodGhpcykudXNlcm5hbWV9LGdldFBhc3N3b3JkPWZ1bmN0aW9uKCl7cmV0dXJuIFAodGhpcykucGFzc3dvcmR9LGdldEhvc3Q9ZnVuY3Rpb24oKXt2YXIgdD1QKHRoaXMpLHI9dC5ob3N0LGE9dC5wb3J0O3JldHVybiBudWxsPT09cj8iIjpudWxsPT09YT9zZXJpYWxpemVIb3N0KHIpOnNlcmlhbGl6ZUhvc3QocikrIjoiK2F9LGdldEhvc3RuYW1lPWZ1bmN0aW9uKCl7dmFyIHQ9UCh0aGlzKS5ob3N0O3JldHVybiBudWxsPT09dD8iIjpzZXJpYWxpemVIb3N0KHQpfSxnZXRQb3J0PWZ1bmN0aW9uKCl7dmFyIHQ9UCh0aGlzKS5wb3J0O3JldHVybiBudWxsPT09dD8iIjpTdHJpbmcodCl9LGdldFBhdGhuYW1lPWZ1bmN0aW9uKCl7dmFyIHQ9UCh0aGlzKSxyPXQucGF0aDtyZXR1cm4gdC5jYW5ub3RCZUFCYXNlVVJMP3JbMF06ci5sZW5ndGg/Ii8iK3Iuam9pbigiLyIpOiIifSxnZXRTZWFyY2g9ZnVuY3Rpb24oKXt2YXIgdD1QKHRoaXMpLnF1ZXJ5O3JldHVybiB0PyI/Iit0OiIifSxnZXRTZWFyY2hQYXJhbXM9ZnVuY3Rpb24oKXtyZXR1cm4gUCh0aGlzKS5zZWFyY2hQYXJhbXN9LGdldEhhc2g9ZnVuY3Rpb24oKXt2YXIgdD1QKHRoaXMpLmZyYWdtZW50O3JldHVybiB0PyIjIit0OiIifSxhY2Nlc3NvckRlc2NyaXB0b3I9ZnVuY3Rpb24odCxyKXtyZXR1cm57Z2V0OnQsc2V0OnIsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9fTtsJiZkKG1lLHtocmVmOmFjY2Vzc29yRGVzY3JpcHRvcihzZXJpYWxpemVVUkwsKGZ1bmN0aW9uKHQpe3ZhciByPVAodGhpcyksYT1TdHJpbmcodCksbz1wYXJzZVVSTChyLGEpO2lmKG8pdGhyb3cgVHlwZUVycm9yKG8pO2soci5zZWFyY2hQYXJhbXMpLnVwZGF0ZVNlYXJjaFBhcmFtcyhyLnF1ZXJ5KX0pKSxvcmlnaW46YWNjZXNzb3JEZXNjcmlwdG9yKGdldE9yaWdpbikscHJvdG9jb2w6YWNjZXNzb3JEZXNjcmlwdG9yKGdldFByb3RvY29sLChmdW5jdGlvbih0KXt2YXIgcj1QKHRoaXMpO3BhcnNlVVJMKHIsU3RyaW5nKHQpKyI6IixZKX0pKSx1c2VybmFtZTphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0VXNlcm5hbWUsKGZ1bmN0aW9uKHQpe3ZhciByPVAodGhpcyksYT1nKFN0cmluZyh0KSk7aWYoIWNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydChyKSl7ci51c2VybmFtZT0iIjtmb3IodmFyIG89MDtvPGEubGVuZ3RoO28rKylyLnVzZXJuYW1lKz1wZXJjZW50RW5jb2RlKGFbb10sSCl9fSkpLHBhc3N3b3JkOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXNzd29yZCwoZnVuY3Rpb24odCl7dmFyIHI9UCh0aGlzKSxhPWcoU3RyaW5nKHQpKTtpZighY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHIpKXtyLnBhc3N3b3JkPSIiO2Zvcih2YXIgbz0wO288YS5sZW5ndGg7bysrKXIucGFzc3dvcmQrPXBlcmNlbnRFbmNvZGUoYVtvXSxIKX19KSksaG9zdDphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdCwoZnVuY3Rpb24odCl7dmFyIHI9UCh0aGlzKTtyLmNhbm5vdEJlQUJhc2VVUkx8fHBhcnNlVVJMKHIsU3RyaW5nKHQpLG5lKX0pKSxob3N0bmFtZTphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdG5hbWUsKGZ1bmN0aW9uKHQpe3ZhciByPVAodGhpcyk7ci5jYW5ub3RCZUFCYXNlVVJMfHxwYXJzZVVSTChyLFN0cmluZyh0KSxhZSl9KSkscG9ydDphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UG9ydCwoZnVuY3Rpb24odCl7dmFyIHI9UCh0aGlzKTtjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQocil8fCgiIj09KHQ9U3RyaW5nKHQpKT9yLnBvcnQ9bnVsbDpwYXJzZVVSTChyLHQsb2UpKX0pKSxwYXRobmFtZTphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UGF0aG5hbWUsKGZ1bmN0aW9uKHQpe3ZhciByPVAodGhpcyk7aWYoIXIuY2Fubm90QmVBQmFzZVVSTCl7ci5wYXRoPVtdO3BhcnNlVVJMKHIsdCsiIixjZSl9fSkpLHNlYXJjaDphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0U2VhcmNoLChmdW5jdGlvbih0KXt2YXIgcj1QKHRoaXMpO2lmKCIiPT0odD1TdHJpbmcodCkpKXIucXVlcnk9bnVsbDtlbHNleyI/Ij09dC5jaGFyQXQoMCkmJih0PXQuc2xpY2UoMSkpO3IucXVlcnk9IiI7cGFyc2VVUkwocix0LGRlKX1rKHIuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXMoci5xdWVyeSl9KSksc2VhcmNoUGFyYW1zOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRTZWFyY2hQYXJhbXMpLGhhc2g6YWNjZXNzb3JEZXNjcmlwdG9yKGdldEhhc2gsKGZ1bmN0aW9uKHQpe3ZhciByPVAodGhpcyk7aWYoIiIhPSh0PVN0cmluZyh0KSkpeyIjIj09dC5jaGFyQXQoMCkmJih0PXQuc2xpY2UoMSkpO3IuZnJhZ21lbnQ9IiI7cGFyc2VVUkwocix0LGhlKX1lbHNlIHIuZnJhZ21lbnQ9bnVsbH0pKX0pO2gobWUsInRvSlNPTiIsKGZ1bmN0aW9uIHRvSlNPTigpe3JldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKX0pLHtlbnVtZXJhYmxlOiEwfSk7aChtZSwidG9TdHJpbmciLChmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKX0pLHtlbnVtZXJhYmxlOiEwfSk7aWYoQSl7dmFyIHZlPUEuY3JlYXRlT2JqZWN0VVJMLGdlPUEucmV2b2tlT2JqZWN0VVJMO3ZlJiZoKHBlLCJjcmVhdGVPYmplY3RVUkwiLChmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwodCl7cmV0dXJuIHZlLmFwcGx5KEEsYXJndW1lbnRzKX0pKTtnZSYmaChwZSwicmV2b2tlT2JqZWN0VVJMIiwoZnVuY3Rpb24gcmV2b2tlT2JqZWN0VVJMKHQpe3JldHVybiBnZS5hcHBseShBLGFyZ3VtZW50cyl9KSl9XyhwZSwiVVJMIik7aSh7Z2xvYmFsOiEwLGZvcmNlZDohYyxzaGFtOiFsfSx7VVJMOnBlfSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDE0KSxpPWEoNTcpLGw9YSgzNyksYz1pKCJpdGVyYXRvciIpO3QuZXhwb3J0cz0hbygoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2E9MSZiPTImYz0zIiwiaHR0cDovL2EiKSxyPXQuc2VhcmNoUGFyYW1zLGE9IiI7dC5wYXRobmFtZT0iYyUyMGQiO3IuZm9yRWFjaCgoZnVuY3Rpb24odCxvKXtyLmRlbGV0ZSgiYiIpO2ErPW8rdH0pKTtyZXR1cm4gbCYmIXQudG9KU09OfHwhci5zb3J0fHwiaHR0cDovL2EvYyUyMGQ/YT0xJmM9MyIhPT10LmhyZWZ8fCIzIiE9PXIuZ2V0KCJjIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFyW2NdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofHwiYTFjMyIhPT1hfHwieCIhPT1uZXcgVVJMKCJodHRwOi8veCIsdm9pZCAwKS5ob3N0fSkpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPS9bXlwwLVx1MDA3RV0vLGk9L1suXHUzMDAyXHVGRjBFXHVGRjYxXS9nLGw9Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIixjPU1hdGguZmxvb3IsdT1TdHJpbmcuZnJvbUNoYXJDb2RlLGRpZ2l0VG9CYXNpYz1mdW5jdGlvbih0KXtyZXR1cm4gdCsyMis3NSoodDwyNil9LGFkYXB0PWZ1bmN0aW9uKHQscixhKXt2YXIgbz0wO3Q9YT9jKHQvNzAwKTp0Pj4xO3QrPWModC9yKTtmb3IoO3Q+NDU1O28rPTM2KXQ9Yyh0LzM1KTtyZXR1cm4gYyhvKzM2KnQvKHQrMzgpKX0sZW5jb2RlPWZ1bmN0aW9uKHQpe3ZhciByLGEsbz1bXSxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXSxhPTAsbz10Lmxlbmd0aDthPG87KXt2YXIgaT10LmNoYXJDb2RlQXQoYSsrKTtpZihpPj01NTI5NiYmaTw9NTYzMTkmJmE8byl7dmFyIGw9dC5jaGFyQ29kZUF0KGErKyk7aWYoNTYzMjA9PSg2NDUxMiZsKSlyLnB1c2goKCgxMDIzJmkpPDwxMCkrKDEwMjMmbCkrNjU1MzYpO2Vsc2V7ci5wdXNoKGkpO2EtLX19ZWxzZSByLnB1c2goaSl9cmV0dXJuIHJ9KHQpKS5sZW5ndGgsZD0xMjgsaD0wLHA9NzI7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKykoYT10W3JdKTwxMjgmJm8ucHVzaCh1KGEpKTt2YXIgbT1vLmxlbmd0aCx2PW07bSYmby5wdXNoKCItIik7Zm9yKDt2PGk7KXt2YXIgZz0yMTQ3NDgzNjQ3O2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspKGE9dFtyXSk+PWQmJmE8ZyYmKGc9YSk7dmFyIHk9disxO2lmKGctZD5jKCgyMTQ3NDgzNjQ3LWgpL3kpKXRocm93IFJhbmdlRXJyb3IobCk7aCs9KGctZCkqeTtkPWc7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7aWYoKGE9dFtyXSk8ZCYmKytoPjIxNDc0ODM2NDcpdGhyb3cgUmFuZ2VFcnJvcihsKTtpZihhPT1kKXtmb3IodmFyIGI9aCxfPTM2OztfKz0zNil7dmFyIFM9Xzw9cD8xOl8+PXArMjY/MjY6Xy1wO2lmKGI8UylicmVhazt2YXIgQz1iLVMsQT0zNi1TO28ucHVzaCh1KGRpZ2l0VG9CYXNpYyhTK0MlQSkpKTtiPWMoQy9BKX1vLnB1c2godShkaWdpdFRvQmFzaWMoYikpKTtwPWFkYXB0KGgseSx2PT1tKTtoPTA7Kyt2fX0rK2g7KytkfXJldHVybiBvLmpvaW4oIiIpfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIHIsYSxsPVtdLGM9dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoaSwiLiIpLnNwbGl0KCIuIik7Zm9yKHI9MDtyPGMubGVuZ3RoO3IrKyl7YT1jW3JdO2wucHVzaChvLnRlc3QoYSk/InhuLS0iK2VuY29kZShhKTphKX1yZXR1cm4gbC5qb2luKCIuIil9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO2EoMTAyKTt2YXIgbz1hKDEwKSxpPWEoNDIpLGw9YSgxNDApLGM9YSgyOSksdT1hKDEyNCksZD1hKDg1KSxoPWEoODApLHA9YSgzMyksbT1hKDEyNiksdj1hKDIzKSxnPWEoNjIpLHk9YSg5NSksYj1hKDI4KSxfPWEoMjIpLFM9YSg3MSksQz1hKDE2KSxBPWEoMTQzKSxSPWEoOTQpLGs9YSg1Nyksdz1pKCJmZXRjaCIpLFA9aSgiSGVhZGVycyIpLHg9aygiaXRlcmF0b3IiKSxUPXAuc2V0LEU9cC5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLE89cC5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksST0vXCsvZyxEPUFycmF5KDQpLHBlcmNlbnRTZXF1ZW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gRFt0LTFdfHwoRFt0LTFdPVJlZ0V4cCgiKCg/OiVbXFxkYS1mXXsyfSl7Iit0KyJ9KSIsImdpIikpfSxwZXJjZW50RGVjb2RlPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQpfWNhdGNoKHIpe3JldHVybiB0fX0sZGVzZXJpYWxpemU9ZnVuY3Rpb24odCl7dmFyIHI9dC5yZXBsYWNlKEksIiAiKSxhPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQocil9Y2F0Y2godCl7Zm9yKDthOylyPXIucmVwbGFjZShwZXJjZW50U2VxdWVuY2UoYS0tKSxwZXJjZW50RGVjb2RlKTtyZXR1cm4gcn19LEw9L1shJygpfl18JTIwL2csTT17IiEiOiIlMjEiLCInIjoiJTI3IiwiKCI6IiUyOCIsIikiOiIlMjkiLCJ+IjoiJTdFIiwiJTIwIjoiKyJ9LHJlcGxhY2VyPWZ1bmN0aW9uKHQpe3JldHVybiBNW3RdfSxzZXJpYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKEwscmVwbGFjZXIpfSxwYXJzZVNlYXJjaFBhcmFtcz1mdW5jdGlvbih0LHIpe2lmKHIpZm9yKHZhciBhLG8saT1yLnNwbGl0KCImIiksbD0wO2w8aS5sZW5ndGg7KWlmKChhPWlbbCsrXSkubGVuZ3RoKXtvPWEuc3BsaXQoIj0iKTt0LnB1c2goe2tleTpkZXNlcmlhbGl6ZShvLnNoaWZ0KCkpLHZhbHVlOmRlc2VyaWFsaXplKG8uam9pbigiPSIpKX0pfX0sdXBkYXRlU2VhcmNoUGFyYW1zPWZ1bmN0aW9uKHQpe3RoaXMuZW50cmllcy5sZW5ndGg9MDtwYXJzZVNlYXJjaFBhcmFtcyh0aGlzLmVudHJpZXMsdCl9LHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoPWZ1bmN0aW9uKHQscil7aWYodDxyKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sVz1oKChmdW5jdGlvbiBJdGVyYXRvcih0LHIpe1QodGhpcyx7dHlwZToiVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IiLGl0ZXJhdG9yOkEoRSh0KS5lbnRyaWVzKSxraW5kOnJ9KX0pLCJJdGVyYXRvciIsKGZ1bmN0aW9uIG5leHQoKXt2YXIgdD1PKHRoaXMpLHI9dC5raW5kLGE9dC5pdGVyYXRvci5uZXh0KCksbz1hLnZhbHVlO2EuZG9uZXx8KGEudmFsdWU9ImtleXMiPT09cj9vLmtleToidmFsdWVzIj09PXI/by52YWx1ZTpbby5rZXksby52YWx1ZV0pO3JldHVybiBhfSkpLGo9ZnVuY3Rpb24gVVJMU2VhcmNoUGFyYW1zKCl7bSh0aGlzLGosIlVSTFNlYXJjaFBhcmFtcyIpO3ZhciB0LHIsYSxvLGksbCxjLHUsZCxoPWFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwLHA9dGhpcyxnPVtdO1QocCx7dHlwZToiVVJMU2VhcmNoUGFyYW1zIixlbnRyaWVzOmcsdXBkYXRlVVJMOmZ1bmN0aW9uKCl7fSx1cGRhdGVTZWFyY2hQYXJhbXM6dXBkYXRlU2VhcmNoUGFyYW1zfSk7aWYodm9pZCAwIT09aClpZihfKGgpKWlmKCJmdW5jdGlvbiI9PXR5cGVvZih0PVIoaCkpKXthPShyPXQuY2FsbChoKSkubmV4dDtmb3IoOyEobz1hLmNhbGwocikpLmRvbmU7KXtpZigoYz0obD0oaT1BKGIoby52YWx1ZSkpKS5uZXh0KS5jYWxsKGkpKS5kb25lfHwodT1sLmNhbGwoaSkpLmRvbmV8fCFsLmNhbGwoaSkuZG9uZSl0aHJvdyBUeXBlRXJyb3IoIkV4cGVjdGVkIHNlcXVlbmNlIHdpdGggbGVuZ3RoIDIiKTtnLnB1c2goe2tleTpjLnZhbHVlKyIiLHZhbHVlOnUudmFsdWUrIiJ9KX19ZWxzZSBmb3IoZCBpbiBoKXYoaCxkKSYmZy5wdXNoKHtrZXk6ZCx2YWx1ZTpoW2RdKyIifSk7ZWxzZSBwYXJzZVNlYXJjaFBhcmFtcyhnLCJzdHJpbmciPT10eXBlb2YgaD8iPyI9PT1oLmNoYXJBdCgwKT9oLnNsaWNlKDEpOmg6aCsiIil9LE49ai5wcm90b3R5cGU7dShOLHthcHBlbmQ6ZnVuY3Rpb24gYXBwZW5kKHQscil7dmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwyKTt2YXIgYT1FKHRoaXMpO2EuZW50cmllcy5wdXNoKHtrZXk6dCsiIix2YWx1ZTpyKyIifSk7YS51cGRhdGVVUkwoKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe3ZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciByPUUodGhpcyksYT1yLmVudHJpZXMsbz10KyIiLGk9MDtpPGEubGVuZ3RoOylhW2ldLmtleT09PW8/YS5zcGxpY2UoaSwxKTppKys7ci51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uIGdldCh0KXt2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1FKHRoaXMpLmVudHJpZXMsYT10KyIiLG89MDtvPHIubGVuZ3RoO28rKylpZihyW29dLmtleT09PWEpcmV0dXJuIHJbb10udmFsdWU7cmV0dXJuIG51bGx9LGdldEFsbDpmdW5jdGlvbiBnZXRBbGwodCl7dmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIHI9RSh0aGlzKS5lbnRyaWVzLGE9dCsiIixvPVtdLGk9MDtpPHIubGVuZ3RoO2krKylyW2ldLmtleT09PWEmJm8ucHVzaChyW2ldLnZhbHVlKTtyZXR1cm4gb30saGFzOmZ1bmN0aW9uIGhhcyh0KXt2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1FKHRoaXMpLmVudHJpZXMsYT10KyIiLG89MDtvPHIubGVuZ3RoOylpZihyW28rK10ua2V5PT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uIHNldCh0LHIpe3ZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBhLG89RSh0aGlzKSxpPW8uZW50cmllcyxsPSExLGM9dCsiIix1PXIrIiIsZD0wO2Q8aS5sZW5ndGg7ZCsrKWlmKChhPWlbZF0pLmtleT09PWMpaWYobClpLnNwbGljZShkLS0sMSk7ZWxzZXtsPSEwO2EudmFsdWU9dX1sfHxpLnB1c2goe2tleTpjLHZhbHVlOnV9KTtvLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uIHNvcnQoKXt2YXIgdCxyLGEsbz1FKHRoaXMpLGk9by5lbnRyaWVzLGw9aS5zbGljZSgpO2kubGVuZ3RoPTA7Zm9yKGE9MDthPGwubGVuZ3RoO2ErKyl7dD1sW2FdO2ZvcihyPTA7cjxhO3IrKylpZihpW3JdLmtleT50LmtleSl7aS5zcGxpY2UociwwLHQpO2JyZWFrfXI9PT1hJiZpLnB1c2godCl9by51cGRhdGVVUkwoKX0sZm9yRWFjaDpmdW5jdGlvbiBmb3JFYWNoKHQpe2Zvcih2YXIgcixhPUUodGhpcykuZW50cmllcyxvPWcodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxpPTA7aTxhLmxlbmd0aDspbygocj1hW2krK10pLnZhbHVlLHIua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gbmV3IFcodGhpcywia2V5cyIpfSx2YWx1ZXM6ZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIG5ldyBXKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uIGVudHJpZXMoKXtyZXR1cm4gbmV3IFcodGhpcywiZW50cmllcyIpfX0se2VudW1lcmFibGU6ITB9KTtjKE4seCxOLmVudHJpZXMpO2MoTiwidG9TdHJpbmciLChmdW5jdGlvbiB0b1N0cmluZygpe2Zvcih2YXIgdCxyPUUodGhpcykuZW50cmllcyxhPVtdLG89MDtvPHIubGVuZ3RoOyl7dD1yW28rK107YS5wdXNoKHNlcmlhbGl6ZSh0LmtleSkrIj0iK3NlcmlhbGl6ZSh0LnZhbHVlKSl9cmV0dXJuIGEuam9pbigiJiIpfSkse2VudW1lcmFibGU6ITB9KTtkKGosIlVSTFNlYXJjaFBhcmFtcyIpO28oe2dsb2JhbDohMCxmb3JjZWQ6IWx9LHtVUkxTZWFyY2hQYXJhbXM6an0pO2x8fCJmdW5jdGlvbiIhPXR5cGVvZiB3fHwiZnVuY3Rpb24iIT10eXBlb2YgUHx8byh7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24gZmV0Y2godCl7dmFyIHIsYSxvLGk9W3RdO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7aWYoXyhyPWFyZ3VtZW50c1sxXSkpe2E9ci5ib2R5O2lmKCJVUkxTZWFyY2hQYXJhbXMiPT09eShhKSl7KG89ci5oZWFkZXJzP25ldyBQKHIuaGVhZGVycyk6bmV3IFApLmhhcygiY29udGVudC10eXBlIil8fG8uc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpO3I9UyhyLHtib2R5OkMoMCxTdHJpbmcoYSkpLGhlYWRlcnM6QygwLG8pfSl9fWkucHVzaChyKX1yZXR1cm4gdy5hcHBseSh0aGlzLGkpfX0pO3QuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOmosZ2V0U3RhdGU6RX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDI4KSxpPWEoOTQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgcj1pKHQpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gbyhyLmNhbGwodCkpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjthKDEwKSh7dGFyZ2V0OiJVUkwiLHByb3RvOiEwLGVudW1lcmFibGU6ITB9LHt0b0pTT046ZnVuY3Rpb24gdG9KU09OKCl7cmV0dXJuIFVSTC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKX19KX0sZnVuY3Rpb24odCxyLGEpeyFmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/U3ltYm9sOmZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIit0KyIpIn07ZnVuY3Rpb24gbm9vcCgpe312YXIgYT1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT10fSxvPW5vb3A7ZnVuY3Rpb24gdHlwZUlzT2JqZWN0KHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGNyZWF0ZUFycmF5RnJvbUxpc3QodCl7cmV0dXJuIHQuc2xpY2UoKX1mdW5jdGlvbiBJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHQpe3JldHVybiExIT09ZnVuY3Rpb24gSXNOb25OZWdhdGl2ZU51bWJlcih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJighYSh0KSYmISh0PDApKX0odCkmJnQhPT0xLzB9ZnVuY3Rpb24gQ2FsbCh0LHIsYSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgaXMgbm90IGEgZnVuY3Rpb24iKTtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodCxyLGEpfWZ1bmN0aW9uIENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHQscixhLG8pe3ZhciBpPXRbcl07aWYodm9pZCAwIT09aSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcihpKyIgaXMgbm90IGEgbWV0aG9kIik7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZUNhbGwoaSx0LG8pfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBhPVtyXS5jb25jYXQobyk7cmV0dXJuIFByb21pc2VDYWxsKGksdCxhKX19fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHZvaWQgMCl9fWZ1bmN0aW9uIEludm9rZU9yTm9vcCh0LHIsYSl7dmFyIG89dFtyXTtpZih2b2lkIDAhPT1vKXJldHVybiBDYWxsKG8sdCxhKX1mdW5jdGlvbiBQcm9taXNlQ2FsbCh0LHIsYSl7dHJ5e3JldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKENhbGwodCxyLGEpKX1jYXRjaCh0KXtyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh0KX19ZnVuY3Rpb24gVmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKHQpe3Q9TnVtYmVyKHQpO2lmKGEodCl8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiaGlnaFdhdGVyTWFyayBwcm9wZXJ0eSBvZiBhIHF1ZXVpbmcgc3RyYXRlZ3kgbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIG5vbi1OYU4iKTtyZXR1cm4gdH1mdW5jdGlvbiBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gMX07aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZSBwcm9wZXJ0eSBvZiBhIHF1ZXVpbmcgc3RyYXRlZ3kgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0KHIpfX12YXIgaT1Qcm9taXNlLGw9UHJvbWlzZS5wcm90b3R5cGUudGhlbixjPVByb21pc2UucmVzb2x2ZS5iaW5kKGkpLHU9UHJvbWlzZS5yZWplY3QuYmluZChpKTtmdW5jdGlvbiBuZXdQcm9taXNlKHQpe3JldHVybiBuZXcgaSh0KX1mdW5jdGlvbiBwcm9taXNlUmVzb2x2ZWRXaXRoKHQpe3JldHVybiBjKHQpfWZ1bmN0aW9uIHByb21pc2VSZWplY3RlZFdpdGgodCl7cmV0dXJuIHUodCl9ZnVuY3Rpb24gUGVyZm9ybVByb21pc2VUaGVuKHQscixhKXtyZXR1cm4gbC5jYWxsKHQscixhKX1mdW5jdGlvbiB1cG9uUHJvbWlzZSh0LHIsYSl7UGVyZm9ybVByb21pc2VUaGVuKFBlcmZvcm1Qcm9taXNlVGhlbih0LHIsYSksdm9pZCAwLG8pfWZ1bmN0aW9uIHVwb25GdWxmaWxsbWVudCh0LHIpe3Vwb25Qcm9taXNlKHQscil9ZnVuY3Rpb24gdXBvblJlamVjdGlvbih0LHIpe3Vwb25Qcm9taXNlKHQsdm9pZCAwLHIpfWZ1bmN0aW9uIHRyYW5zZm9ybVByb21pc2VXaXRoKHQscixhKXtyZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHQscixhKX1mdW5jdGlvbiBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHQpe1BlcmZvcm1Qcm9taXNlVGhlbih0LHZvaWQgMCxvKX12YXIgZD1mdW5jdGlvbigpe2Z1bmN0aW9uIFNpbXBsZVF1ZXVlKCl7dGhpcy5fY3Vyc29yPTA7dGhpcy5fc2l6ZT0wO3RoaXMuX2Zyb250PXtfZWxlbWVudHM6W10sX25leHQ6dm9pZCAwfTt0aGlzLl9iYWNrPXRoaXMuX2Zyb250O3RoaXMuX2N1cnNvcj0wO3RoaXMuX3NpemU9MH1PYmplY3QuZGVmaW5lUHJvcGVydHkoU2ltcGxlUXVldWUucHJvdG90eXBlLCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtTaW1wbGVRdWV1ZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt2YXIgcj10aGlzLl9iYWNrLGE9cjsxNjM4Mz09PXIuX2VsZW1lbnRzLmxlbmd0aCYmKGE9e19lbGVtZW50czpbXSxfbmV4dDp2b2lkIDB9KTtyLl9lbGVtZW50cy5wdXNoKHQpO2lmKGEhPT1yKXt0aGlzLl9iYWNrPWE7ci5fbmV4dD1hfSsrdGhpcy5fc2l6ZX07U2ltcGxlUXVldWUucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZnJvbnQscj10LGE9dGhpcy5fY3Vyc29yLG89YSsxLGk9dC5fZWxlbWVudHMsbD1pW2FdO2lmKDE2Mzg0PT09byl7cj10Ll9uZXh0O289MH0tLXRoaXMuX3NpemU7dGhpcy5fY3Vyc29yPW87dCE9PXImJih0aGlzLl9mcm9udD1yKTtpW2FdPXZvaWQgMDtyZXR1cm4gbH07U2ltcGxlUXVldWUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7Zm9yKHZhciByPXRoaXMuX2N1cnNvcixhPXRoaXMuX2Zyb250LG89YS5fZWxlbWVudHM7ciE9PW8ubGVuZ3RofHx2b2lkIDAhPT1hLl9uZXh0Oyl7aWYocj09PW8ubGVuZ3RoKXtyPTA7aWYoMD09PShvPShhPWEuX25leHQpLl9lbGVtZW50cykubGVuZ3RoKWJyZWFrfXQob1tyXSk7KytyfX07U2ltcGxlUXVldWUucHJvdG90eXBlLnBlZWs9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9mcm9udCxyPXRoaXMuX2N1cnNvcjtyZXR1cm4gdC5fZWxlbWVudHNbcl19O3JldHVybiBTaW1wbGVRdWV1ZX0oKTtmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodCxyLGEpe3ZhciBvPW51bGw7ITA9PT1hJiYobz1PYmplY3QucHJvdG90eXBlKTt2YXIgaT1PYmplY3QuY3JlYXRlKG8pO2kudmFsdWU9dDtpLmRvbmU9cjtyZXR1cm4gaX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHQscil7dC5fZm9yQXV0aG9yQ29kZT0hMDt0Ll9vd25lclJlYWRhYmxlU3RyZWFtPXI7ci5fcmVhZGVyPXQ7InJlYWRhYmxlIj09PXIuX3N0YXRlP2RlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0KToiY2xvc2VkIj09PXIuX3N0YXRlP2Z1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodCl7ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHQpO2RlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh0KX0odCk6ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0LHIuX3N0b3JlZEVycm9yKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwodCxyKXtyZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwodC5fb3duZXJSZWFkYWJsZVN0cmVhbSxyKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHQpeyJyZWFkYWJsZSI9PT10Ll9vd25lclJlYWRhYmxlU3RyZWFtLl9zdGF0ZT9kZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh0LG5ldyBUeXBlRXJyb3IoIlJlYWRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzIikpOmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHQscil7ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0LHIpfSh0LG5ldyBUeXBlRXJyb3IoIlJlYWRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzIikpO3QuX293bmVyUmVhZGFibGVTdHJlYW0uX3JlYWRlcj12b2lkIDA7dC5fb3duZXJSZWFkYWJsZVN0cmVhbT12b2lkIDB9ZnVuY3Rpb24gcmVhZGVyTG9ja0V4Y2VwdGlvbih0KXtyZXR1cm4gbmV3IFR5cGVFcnJvcigiQ2Fubm90ICIrdCsiIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgcmVhZGVyIil9ZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHQpe3QuX2Nsb3NlZFByb21pc2U9bmV3UHJvbWlzZSgoZnVuY3Rpb24ocixhKXt0Ll9jbG9zZWRQcm9taXNlX3Jlc29sdmU9cjt0Ll9jbG9zZWRQcm9taXNlX3JlamVjdD1hfSkpfWZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodCxyKXtkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUodCk7ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QodCxyKX1mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh0LHIpe3NldFByb21pc2VJc0hhbmRsZWRUb1RydWUodC5fY2xvc2VkUHJvbWlzZSk7dC5fY2xvc2VkUHJvbWlzZV9yZWplY3Qocik7dC5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlPXZvaWQgMDt0Ll9jbG9zZWRQcm9taXNlX3JlamVjdD12b2lkIDB9ZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHQpe3QuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSh2b2lkIDApO3QuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZT12b2lkIDA7dC5fY2xvc2VkUHJvbWlzZV9yZWplY3Q9dm9pZCAwfXZhciBoPXIoIltbQ2FuY2VsU3RlcHNdXSIpLHA9cigiW1tQdWxsU3RlcHNdXSIpO2Z1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodCxyKXt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGE9bmV3IGcodCk7YS5fZm9yQXV0aG9yQ29kZT1yO3JldHVybiBhfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3QodCl7cmV0dXJuIG5ld1Byb21pc2UoKGZ1bmN0aW9uKHIsYSl7dmFyIG89e19yZXNvbHZlOnIsX3JlamVjdDphfTt0Ll9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5wdXNoKG8pfSkpfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHQscixhKXt2YXIgbz10Ll9yZWFkZXI7by5fcmVhZFJlcXVlc3RzLnNoaWZ0KCkuX3Jlc29sdmUoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHIsYSxvLl9mb3JBdXRob3JDb2RlKSl9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHModCl7cmV0dXJuIHQuX3JlYWRlci5fcmVhZFJlcXVlc3RzLmxlbmd0aH1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIodCl7dmFyIHI9dC5fcmVhZGVyO3JldHVybiB2b2lkIDAhPT1yJiYhIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHIpfXZhciBtLHYsZz1mdW5jdGlvbigpe2Z1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0KXtpZighMT09PUlzUmVhZGFibGVTdHJlYW0odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIGNhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBSZWFkYWJsZVN0cmVhbSBpbnN0YW5jZSIpO2lmKCEwPT09SXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHJlYWRpbmcgYnkgYW5vdGhlciByZWFkZXIiKTtSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsdCk7dGhpcy5fcmVhZFJlcXVlc3RzPW5ldyBkfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLCJjbG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcyk/dGhpcy5fY2xvc2VkUHJvbWlzZTpwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJjbG9zZWQiKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk7UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24odCl7cmV0dXJuIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpP3ZvaWQgMD09PXRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0/cHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCJjYW5jZWwiKSk6UmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHRoaXMsdCk6cHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiY2FuY2VsIikpfTtSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcyk/dm9pZCAwPT09dGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbT9wcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oInJlYWQgZnJvbSIpKTpSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHRoaXMpOnByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oInJlYWQiKSl9O1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUucmVsZWFzZUxvY2s9ZnVuY3Rpb24oKXtpZighSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykpdGhyb3cgZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oInJlbGVhc2VMb2NrIik7aWYodm9pZCAwIT09dGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSl7aWYodGhpcy5fcmVhZFJlcXVlc3RzLmxlbmd0aD4wKXRocm93IG5ldyBUeXBlRXJyb3IoIlRyaWVkIHRvIHJlbGVhc2UgYSByZWFkZXIgbG9jayB3aGVuIHRoYXQgcmVhZGVyIGhhcyBwZW5kaW5nIHJlYWQoKSBjYWxscyB1bi1zZXR0bGVkIik7UmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSh0aGlzKX19O3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJ9KCk7ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodCl7cmV0dXJuISF0eXBlSXNPYmplY3QodCkmJiEhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIl9yZWFkUmVxdWVzdHMiKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHQpe3ZhciByPXQuX293bmVyUmVhZGFibGVTdHJlYW07ci5fZGlzdHVyYmVkPSEwO3JldHVybiJjbG9zZWQiPT09ci5fc3RhdGU/cHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodm9pZCAwLCEwLHQuX2ZvckF1dGhvckNvZGUpKToiZXJyb3JlZCI9PT1yLl9zdGF0ZT9wcm9taXNlUmVqZWN0ZWRXaXRoKHIuX3N0b3JlZEVycm9yKTpyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXJbcF0oKX1mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbih0KXtyZXR1cm4gbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS4iK3QrIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIil9aWYoInN5bWJvbCI9PXR5cGVvZiByLmFzeW5jSXRlcmF0b3Ipe3Y9KChtPXt9KVtyLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh2LHIuYXN5bmNJdGVyYXRvcix7ZW51bWVyYWJsZTohMX0pfXZhciB5PXtuZXh0OmZ1bmN0aW9uKCl7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbigibmV4dCIpKTt2YXIgdD10aGlzLl9hc3luY0l0ZXJhdG9yUmVhZGVyO3JldHVybiB2b2lkIDA9PT10Ll9vd25lclJlYWRhYmxlU3RyZWFtP3Byb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigiaXRlcmF0ZSIpKTp0cmFuc2Zvcm1Qcm9taXNlV2l0aChSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHQpLChmdW5jdGlvbihyKXt2YXIgYT1yLmRvbmU7YSYmUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSh0KTtyZXR1cm4gUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHIudmFsdWUsYSwhMCl9KSl9LHJldHVybjpmdW5jdGlvbih0KXtpZighMT09PUlzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpKXJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKCJuZXh0IikpO3ZhciByPXRoaXMuX2FzeW5jSXRlcmF0b3JSZWFkZXI7aWYodm9pZCAwPT09ci5fb3duZXJSZWFkYWJsZVN0cmVhbSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCJmaW5pc2ggaXRlcmF0aW5nIikpO2lmKHIuX3JlYWRSZXF1ZXN0cy5sZW5ndGg+MClyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCIpKTtpZighMT09PXRoaXMuX3ByZXZlbnRDYW5jZWwpe3ZhciBhPVJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbChyLHQpO1JlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2Uocik7cmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKGEsKGZ1bmN0aW9uKCl7cmV0dXJuIFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh0LCEwLCEwKX0pKX1SZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHIpO3JldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh0LCEwLCEwKSl9fTt2b2lkIDAhPT12JiZPYmplY3Quc2V0UHJvdG90eXBlT2YoeSx2KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwibmV4dCIse2VudW1lcmFibGU6ITF9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwicmV0dXJuIix7ZW51bWVyYWJsZTohMX0pO2Z1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfYXN5bmNJdGVyYXRvclJlYWRlciIpfWZ1bmN0aW9uIHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RlYW1Bc3luY0l0ZXJhdG9yIil9ZnVuY3Rpb24gRGVxdWV1ZVZhbHVlKHQpe3ZhciByPXQuX3F1ZXVlLnNoaWZ0KCk7dC5fcXVldWVUb3RhbFNpemUtPXIuc2l6ZTt0Ll9xdWV1ZVRvdGFsU2l6ZTwwJiYodC5fcXVldWVUb3RhbFNpemU9MCk7cmV0dXJuIHIudmFsdWV9ZnVuY3Rpb24gRW5xdWV1ZVZhbHVlV2l0aFNpemUodCxyLGEpe2lmKCFJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKGE9TnVtYmVyKGEpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiU2l6ZSBtdXN0IGJlIGEgZmluaXRlLCBub24tTmFOLCBub24tbmVnYXRpdmUgbnVtYmVyLiIpO3QuX3F1ZXVlLnB1c2goe3ZhbHVlOnIsc2l6ZTphfSk7dC5fcXVldWVUb3RhbFNpemUrPWF9ZnVuY3Rpb24gUmVzZXRRdWV1ZSh0KXt0Ll9xdWV1ZT1uZXcgZDt0Ll9xdWV1ZVRvdGFsU2l6ZT0wfXZhciBiPXIoIltbQWJvcnRTdGVwc11dIiksXz1yKCJbW0Vycm9yU3RlcHNdXSIpLFM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBXcml0YWJsZVN0cmVhbSh0LHIpe3ZvaWQgMD09PXQmJih0PXt9KTt2b2lkIDA9PT1yJiYocj17fSk7SW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHRoaXMpO3ZhciBhPXIuc2l6ZSxvPXIuaGlnaFdhdGVyTWFyaztpZih2b2lkIDAhPT10LnR5cGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQiKTt2YXIgaT1NYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oYSk7dm9pZCAwPT09byYmKG89MSk7IWZ1bmN0aW9uIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU2luayh0LHIsYSxvKXt2YXIgaT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSxsPUNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHIsIndyaXRlIiwxLFtpXSksYz1DcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZChyLCJjbG9zZSIsMCxbXSksdT1DcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZChyLCJhYm9ydCIsMSxbXSk7U2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHQsaSwoZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKXtyZXR1cm4gSW52b2tlT3JOb29wKHIsInN0YXJ0IixbaV0pfSksbCxjLHUsYSxvKX0odGhpcyx0LG89VmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKG8pLGkpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUsImxvY2tlZCIse2dldDpmdW5jdGlvbigpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbSh0aGlzKSl0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCJsb2NrZWQiKTtyZXR1cm4gSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuITE9PT1Jc1dyaXRhYmxlU3RyZWFtKHRoaXMpP3Byb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbigiYWJvcnQiKSk6ITA9PT1Jc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpP3Byb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiQ2Fubm90IGFib3J0IGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXIiKSk6V3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLHQpfTtXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PUlzV3JpdGFibGVTdHJlYW0odGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCJjbG9zZSIpKTohMD09PUlzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2xvc2UgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHdyaXRlciIpKTohMD09PVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHRoaXMpP3Byb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiQ2Fubm90IGNsb3NlIGFuIGFscmVhZHktY2xvc2luZyBzdHJlYW0iKSk6V3JpdGFibGVTdHJlYW1DbG9zZSh0aGlzKX07V3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLmdldFdyaXRlcj1mdW5jdGlvbigpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbSh0aGlzKSl0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCJnZXRXcml0ZXIiKTtyZXR1cm4gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKX07cmV0dXJuIFdyaXRhYmxlU3RyZWFtfSgpO2Z1bmN0aW9uIEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodCl7cmV0dXJuIG5ldyBDKHQpfWZ1bmN0aW9uIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbSh0KXt0Ll9zdGF0ZT0id3JpdGFibGUiO3QuX3N0b3JlZEVycm9yPXZvaWQgMDt0Ll93cml0ZXI9dm9pZCAwO3QuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcj12b2lkIDA7dC5fd3JpdGVSZXF1ZXN0cz1uZXcgZDt0Ll9pbkZsaWdodFdyaXRlUmVxdWVzdD12b2lkIDA7dC5fY2xvc2VSZXF1ZXN0PXZvaWQgMDt0Ll9pbkZsaWdodENsb3NlUmVxdWVzdD12b2lkIDA7dC5fcGVuZGluZ0Fib3J0UmVxdWVzdD12b2lkIDA7dC5fYmFja3ByZXNzdXJlPSExfWZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW0odCl7cmV0dXJuISF0eXBlSXNPYmplY3QodCkmJiEhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIiKX1mdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHQpe3JldHVybiB2b2lkIDAhPT10Ll93cml0ZXJ9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BYm9ydCh0LHIpe3ZhciBhPXQuX3N0YXRlO2lmKCJjbG9zZWQiPT09YXx8ImVycm9yZWQiPT09YSlyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApO2lmKHZvaWQgMCE9PXQuX3BlbmRpbmdBYm9ydFJlcXVlc3QpcmV0dXJuIHQuX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2U7dmFyIG89ITE7aWYoImVycm9yaW5nIj09PWEpe289ITA7cj12b2lkIDB9dmFyIGk9bmV3UHJvbWlzZSgoZnVuY3Rpb24oYSxpKXt0Ll9wZW5kaW5nQWJvcnRSZXF1ZXN0PXtfcHJvbWlzZTp2b2lkIDAsX3Jlc29sdmU6YSxfcmVqZWN0OmksX3JlYXNvbjpyLF93YXNBbHJlYWR5RXJyb3Jpbmc6b319KSk7dC5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcHJvbWlzZT1pOyExPT09byYmV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHQscik7cmV0dXJuIGl9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZSh0KXt2YXIgcj10Ll9zdGF0ZTtpZigiY2xvc2VkIj09PXJ8fCJlcnJvcmVkIj09PXIpcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiVGhlIHN0cmVhbSAoaW4gIityKyIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgd3JpdGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBjbG9zZWQiKSk7dmFyIGE9bmV3UHJvbWlzZSgoZnVuY3Rpb24ocixhKXt2YXIgbz17X3Jlc29sdmU6cixfcmVqZWN0OmF9O3QuX2Nsb3NlUmVxdWVzdD1vfSkpLG89dC5fd3JpdGVyO3ZvaWQgMCE9PW8mJiEwPT09dC5fYmFja3ByZXNzdXJlJiYid3JpdGFibGUiPT09ciYmZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUobyk7IWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0KXtFbnF1ZXVlVmFsdWVXaXRoU2l6ZSh0LCJjbG9zZSIsMCk7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKHQpfSh0Ll93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIpO3JldHVybiBhfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24odCxyKXsid3JpdGFibGUiIT09dC5fc3RhdGU/V3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyh0KTpXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3JpbmcodCxyKX1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3JpbmcodCxyKXt2YXIgYT10Ll93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXI7dC5fc3RhdGU9ImVycm9yaW5nIjt0Ll9zdG9yZWRFcnJvcj1yO3ZhciBvPXQuX3dyaXRlcjt2b2lkIDAhPT1vJiZXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZChvLHIpOyExPT09ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1IYXNPcGVyYXRpb25NYXJrZWRJbkZsaWdodCh0KXtyZXR1cm4gdm9pZCAwIT09dC5faW5GbGlnaHRXcml0ZVJlcXVlc3R8fHZvaWQgMCE9PXQuX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0fSh0KSYmITA9PT1hLl9zdGFydGVkJiZXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHQpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3JpbmcodCl7dC5fc3RhdGU9ImVycm9yZWQiO3QuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltfXSgpO3ZhciByPXQuX3N0b3JlZEVycm9yO3QuX3dyaXRlUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5fcmVqZWN0KHIpfSkpO3QuX3dyaXRlUmVxdWVzdHM9bmV3IGQ7aWYodm9pZCAwIT09dC5fcGVuZGluZ0Fib3J0UmVxdWVzdCl7dmFyIGE9dC5fcGVuZGluZ0Fib3J0UmVxdWVzdDt0Ll9wZW5kaW5nQWJvcnRSZXF1ZXN0PXZvaWQgMDtpZighMCE9PWEuX3dhc0FscmVhZHlFcnJvcmluZyl1cG9uUHJvbWlzZSh0Ll93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXJbYl0oYS5fcmVhc29uKSwoZnVuY3Rpb24oKXthLl9yZXNvbHZlKCk7V3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZCh0KX0pLChmdW5jdGlvbihyKXthLl9yZWplY3Qocik7V3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZCh0KX0pKTtlbHNle2EuX3JlamVjdChyKTtXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHQpfX1lbHNlIFdyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQodCl9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQodCl7cmV0dXJuIHZvaWQgMCE9PXQuX2Nsb3NlUmVxdWVzdHx8dm9pZCAwIT09dC5faW5GbGlnaHRDbG9zZVJlcXVlc3R9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZCh0KXtpZih2b2lkIDAhPT10Ll9jbG9zZVJlcXVlc3Qpe3QuX2Nsb3NlUmVxdWVzdC5fcmVqZWN0KHQuX3N0b3JlZEVycm9yKTt0Ll9jbG9zZVJlcXVlc3Q9dm9pZCAwfXZhciByPXQuX3dyaXRlcjt2b2lkIDAhPT1yJiZkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyLHQuX3N0b3JlZEVycm9yKX1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZSh0LHIpe3ZhciBhPXQuX3dyaXRlcjt2b2lkIDAhPT1hJiZyIT09dC5fYmFja3ByZXNzdXJlJiYoITA9PT1yP2Z1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCh0KXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0KX0oYSk6ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUoYSkpO3QuX2JhY2twcmVzc3VyZT1yfXZhciBDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHQpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFdyaXRhYmxlU3RyZWFtIGluc3RhbmNlIik7aWYoITA9PT1Jc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgd3JpdGluZyBieSBhbm90aGVyIHdyaXRlciIpO3RoaXMuX293bmVyV3JpdGFibGVTdHJlYW09dDt0Ll93cml0ZXI9dGhpczt2YXIgcj10Ll9zdGF0ZTtpZigid3JpdGFibGUiPT09cil7ITE9PT1Xcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodCh0KSYmITA9PT10Ll9iYWNrcHJlc3N1cmU/ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUodGhpcyk6ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO2RlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKX1lbHNlIGlmKCJlcnJvcmluZyI9PT1yKXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcyx0Ll9zdG9yZWRFcnJvcik7ZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpfWVsc2UgaWYoImNsb3NlZCI9PT1yKXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7IWZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodCl7ZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHQpO2RlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh0KX0odGhpcyl9ZWxzZXt2YXIgYT10Ll9zdG9yZWRFcnJvcjtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcyxhKTtkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsYSl9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCJjbG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMT09PUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpP3Byb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oImNsb3NlZCIpKTp0aGlzLl9jbG9zZWRQcm9taXNlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCJkZXNpcmVkU2l6ZSIse2dldDpmdW5jdGlvbigpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykpdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oImRlc2lyZWRTaXplIik7aWYodm9pZCAwPT09dGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbSl0aHJvdyBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbigiZGVzaXJlZFNpemUiKTtyZXR1cm4gZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUodCl7dmFyIHI9dC5fb3duZXJXcml0YWJsZVN0cmVhbSxhPXIuX3N0YXRlO3JldHVybiJlcnJvcmVkIj09PWF8fCJlcnJvcmluZyI9PT1hP251bGw6ImNsb3NlZCI9PT1hPzA6V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHIuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcil9KHRoaXMpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCJyZWFkeSIse2dldDpmdW5jdGlvbigpe3JldHVybiExPT09SXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigicmVhZHkiKSk6dGhpcy5fcmVhZHlQcm9taXNlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuITE9PT1Jc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKT9wcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJhYm9ydCIpKTp2b2lkIDA9PT10aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtP3Byb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oImFib3J0IikpOmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckFib3J0KHQscil7cmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQodC5fb3duZXJXcml0YWJsZVN0cmVhbSxyKX0odGhpcyx0KX07V3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykpcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oImNsb3NlIikpO3ZhciB0PXRoaXMuX293bmVyV3JpdGFibGVTdHJlYW07cmV0dXJuIHZvaWQgMD09PXQ/cHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbigiY2xvc2UiKSk6ITA9PT1Xcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodCh0KT9wcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjbG9zZSBhbiBhbHJlYWR5LWNsb3Npbmcgc3RyZWFtIikpOldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHRoaXMpfTtXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLnJlbGVhc2VMb2NrPWZ1bmN0aW9uKCl7aWYoITE9PT1Jc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSl0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigicmVsZWFzZUxvY2siKTt2b2lkIDAhPT10aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtJiZXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHRoaXMpfTtXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiExPT09SXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigid3JpdGUiKSk6dm9pZCAwPT09dGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbT9wcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCJ3cml0ZSB0byIpKTpXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh0aGlzLHQpfTtyZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyfSgpO2Z1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfb3duZXJXcml0YWJsZVN0cmVhbSIpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHQpe3JldHVybiBXcml0YWJsZVN0cmVhbUNsb3NlKHQuX293bmVyV3JpdGFibGVTdHJlYW0pfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZUNsb3NlZFByb21pc2VSZWplY3RlZCh0LHIpeyJwZW5kaW5nIj09PXQuX2Nsb3NlZFByb21pc2VTdGF0ZT9kZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh0LHIpOmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHQscil7ZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0LHIpfSh0LHIpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHQscil7InBlbmRpbmciPT09dC5fcmVhZHlQcm9taXNlU3RhdGU/ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh0LHIpOmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQodCxyKXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodCxyKX0odCxyKX1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHQpe3ZhciByPXQuX293bmVyV3JpdGFibGVTdHJlYW0sYT1uZXcgVHlwZUVycm9yKCJXcml0ZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtJ3MgY2xvc2VkbmVzcyIpO1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHQsYSk7V3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHQsYSk7ci5fd3JpdGVyPXZvaWQgMDt0Ll9vd25lcldyaXRhYmxlU3RyZWFtPXZvaWQgMH1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh0LHIpe3ZhciBhPXQuX293bmVyV3JpdGFibGVTdHJlYW0sbz1hLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIsaT1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0Q2h1bmtTaXplKHQscil7dHJ5e3JldHVybiB0Ll9zdHJhdGVneVNpemVBbGdvcml0aG0ocil9Y2F0Y2gocil7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQodCxyKTtyZXR1cm4gMX19KG8scik7aWYoYSE9PXQuX293bmVyV3JpdGFibGVTdHJlYW0pcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oIndyaXRlIHRvIikpO3ZhciBsPWEuX3N0YXRlO2lmKCJlcnJvcmVkIj09PWwpcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYS5fc3RvcmVkRXJyb3IpO2lmKCEwPT09V3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoYSl8fCJjbG9zZWQiPT09bClyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJUaGUgc3RyZWFtIGlzIGNsb3Npbmcgb3IgY2xvc2VkIGFuZCBjYW5ub3QgYmUgd3JpdHRlbiB0byIpKTtpZigiZXJyb3JpbmciPT09bClyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChhLl9zdG9yZWRFcnJvcik7dmFyIGM9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3QodCl7cmV0dXJuIG5ld1Byb21pc2UoKGZ1bmN0aW9uKHIsYSl7dmFyIG89e19yZXNvbHZlOnIsX3JlamVjdDphfTt0Ll93cml0ZVJlcXVlc3RzLnB1c2gobyl9KSl9KGEpOyFmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyV3JpdGUodCxyLGEpe3ZhciBvPXtjaHVuazpyfTt0cnl7RW5xdWV1ZVZhbHVlV2l0aFNpemUodCxvLGEpfWNhdGNoKHIpe1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKHQscik7cmV0dXJufXZhciBpPXQuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtpZighMT09PVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGkpJiYid3JpdGFibGUiPT09aS5fc3RhdGUpe3ZhciBsPVdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUodCk7V3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoaSxsKX1Xcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQodCl9KG8scixpKTtyZXR1cm4gY312YXIgQT1mdW5jdGlvbigpe2Z1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBleHBsaWNpdGx5Iil9V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7aWYoITE9PT1mdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodCl7cmV0dXJuISF0eXBlSXNPYmplY3QodCkmJiEhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0iKX0odGhpcykpdGhyb3cgbmV3IFR5cGVFcnJvcigiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiKTsid3JpdGFibGUiPT09dGhpcy5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZSYmV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHRoaXMsdCl9O1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW2JdPWZ1bmN0aW9uKHQpe3ZhciByPXRoaXMuX2Fib3J0QWxnb3JpdGhtKHQpO1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7cmV0dXJuIHJ9O1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW19dPWZ1bmN0aW9uKCl7UmVzZXRRdWV1ZSh0aGlzKX07cmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJ9KCk7ZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHQscixhLG8saSxsLGMsdSl7ci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtPXQ7dC5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyPXI7ci5fcXVldWU9dm9pZCAwO3IuX3F1ZXVlVG90YWxTaXplPXZvaWQgMDtSZXNldFF1ZXVlKHIpO3IuX3N0YXJ0ZWQ9ITE7ci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtPXU7ci5fc3RyYXRlZ3lIV009YztyLl93cml0ZUFsZ29yaXRobT1vO3IuX2Nsb3NlQWxnb3JpdGhtPWk7ci5fYWJvcnRBbGdvcml0aG09bDt2YXIgZD1Xcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKHIpO1dyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlKHQsZCk7dXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChhKCkpLChmdW5jdGlvbigpe3IuX3N0YXJ0ZWQ9ITA7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKHIpfSksKGZ1bmN0aW9uKGEpe3IuX3N0YXJ0ZWQ9ITA7V3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbih0LGEpfSkpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCl7dC5fd3JpdGVBbGdvcml0aG09dm9pZCAwO3QuX2Nsb3NlQWxnb3JpdGhtPXZvaWQgMDt0Ll9hYm9ydEFsZ29yaXRobT12b2lkIDA7dC5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtPXZvaWQgMH1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodCl7cmV0dXJuIHQuX3N0cmF0ZWd5SFdNLXQuX3F1ZXVlVG90YWxTaXplfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZCh0KXt2YXIgcj10Ll9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07aWYoITEhPT10Ll9zdGFydGVkJiZ2b2lkIDA9PT1yLl9pbkZsaWdodFdyaXRlUmVxdWVzdClpZigiZXJyb3JpbmciIT09ci5fc3RhdGUpe2lmKDAhPT10Ll9xdWV1ZS5sZW5ndGgpe3ZhciBhPWZ1bmN0aW9uIFBlZWtRdWV1ZVZhbHVlKHQpe3JldHVybiB0Ll9xdWV1ZS5wZWVrKCkudmFsdWV9KHQpOyJjbG9zZSI9PT1hP2Z1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UodCl7dmFyIHI9dC5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtOyFmdW5jdGlvbiBXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodCh0KXt0Ll9pbkZsaWdodENsb3NlUmVxdWVzdD10Ll9jbG9zZVJlcXVlc3Q7dC5fY2xvc2VSZXF1ZXN0PXZvaWQgMH0ocik7RGVxdWV1ZVZhbHVlKHQpO3ZhciBhPXQuX2Nsb3NlQWxnb3JpdGhtKCk7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTt1cG9uUHJvbWlzZShhLChmdW5jdGlvbigpeyFmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2UodCl7dC5faW5GbGlnaHRDbG9zZVJlcXVlc3QuX3Jlc29sdmUodm9pZCAwKTt0Ll9pbkZsaWdodENsb3NlUmVxdWVzdD12b2lkIDA7aWYoImVycm9yaW5nIj09PXQuX3N0YXRlKXt0Ll9zdG9yZWRFcnJvcj12b2lkIDA7aWYodm9pZCAwIT09dC5fcGVuZGluZ0Fib3J0UmVxdWVzdCl7dC5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVzb2x2ZSgpO3QuX3BlbmRpbmdBYm9ydFJlcXVlc3Q9dm9pZCAwfX10Ll9zdGF0ZT0iY2xvc2VkIjt2YXIgcj10Ll93cml0ZXI7dm9pZCAwIT09ciYmZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHIpfShyKX0pLChmdW5jdGlvbih0KXshZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHQscil7dC5faW5GbGlnaHRDbG9zZVJlcXVlc3QuX3JlamVjdChyKTt0Ll9pbkZsaWdodENsb3NlUmVxdWVzdD12b2lkIDA7aWYodm9pZCAwIT09dC5fcGVuZGluZ0Fib3J0UmVxdWVzdCl7dC5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVqZWN0KHIpO3QuX3BlbmRpbmdBYm9ydFJlcXVlc3Q9dm9pZCAwfVdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24odCxyKX0ocix0KX0pKX0odCk6ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZSh0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTshZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodCh0KXt0Ll9pbkZsaWdodFdyaXRlUmVxdWVzdD10Ll93cml0ZVJlcXVlc3RzLnNoaWZ0KCl9KGEpO3Vwb25Qcm9taXNlKHQuX3dyaXRlQWxnb3JpdGhtKHIpLChmdW5jdGlvbigpeyFmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUodCl7dC5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3Jlc29sdmUodm9pZCAwKTt0Ll9pbkZsaWdodFdyaXRlUmVxdWVzdD12b2lkIDB9KGEpO3ZhciByPWEuX3N0YXRlO0RlcXVldWVWYWx1ZSh0KTtpZighMT09PVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGEpJiYid3JpdGFibGUiPT09cil7dmFyIG89V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZSh0KTtXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShhLG8pfVdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZCh0KX0pLChmdW5jdGlvbihyKXsid3JpdGFibGUiPT09YS5fc3RhdGUmJldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCk7IWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZVdpdGhFcnJvcih0LHIpe3QuX2luRmxpZ2h0V3JpdGVSZXF1ZXN0Ll9yZWplY3Qocik7dC5faW5GbGlnaHRXcml0ZVJlcXVlc3Q9dm9pZCAwO1dyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24odCxyKX0oYSxyKX0pKX0odCxhLmNodW5rKX19ZWxzZSBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHIpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKHQscil7IndyaXRhYmxlIj09PXQuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbS5fc3RhdGUmJldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0LHIpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUodCl7cmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0KTw9MH1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodCxyKXt2YXIgYT10Ll9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3JpbmcoYSxyKX1mdW5jdGlvbiBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtIil9ZnVuY3Rpb24gZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24odCl7cmV0dXJuIG5ldyBUeXBlRXJyb3IoIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIpfWZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJDYW5ub3QgIit0KyIgYSBzdHJlYW0gdXNpbmcgYSByZWxlYXNlZCB3cml0ZXIiKX1mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUodCl7dC5fY2xvc2VkUHJvbWlzZT1uZXdQcm9taXNlKChmdW5jdGlvbihyLGEpe3QuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZT1yO3QuX2Nsb3NlZFByb21pc2VfcmVqZWN0PWE7dC5fY2xvc2VkUHJvbWlzZVN0YXRlPSJwZW5kaW5nIn0pKX1mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHQscil7ZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHQpO2RlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHQscil9ZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3QodCxyKXtzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHQuX2Nsb3NlZFByb21pc2UpO3QuX2Nsb3NlZFByb21pc2VfcmVqZWN0KHIpO3QuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZT12b2lkIDA7dC5fY2xvc2VkUHJvbWlzZV9yZWplY3Q9dm9pZCAwO3QuX2Nsb3NlZFByb21pc2VTdGF0ZT0icmVqZWN0ZWQifWZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh0KXt0Ll9jbG9zZWRQcm9taXNlX3Jlc29sdmUodm9pZCAwKTt0Ll9jbG9zZWRQcm9taXNlX3Jlc29sdmU9dm9pZCAwO3QuX2Nsb3NlZFByb21pc2VfcmVqZWN0PXZvaWQgMDt0Ll9jbG9zZWRQcm9taXNlU3RhdGU9InJlc29sdmVkIn1mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0KXt0Ll9yZWFkeVByb21pc2U9bmV3UHJvbWlzZSgoZnVuY3Rpb24ocixhKXt0Ll9yZWFkeVByb21pc2VfcmVzb2x2ZT1yO3QuX3JlYWR5UHJvbWlzZV9yZWplY3Q9YX0pKTt0Ll9yZWFkeVByb21pc2VTdGF0ZT0icGVuZGluZyJ9ZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHQscil7ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUodCk7ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh0LHIpfWZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0KXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0KTtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh0KX1mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVqZWN0KHQscil7c2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh0Ll9yZWFkeVByb21pc2UpO3QuX3JlYWR5UHJvbWlzZV9yZWplY3Qocik7dC5fcmVhZHlQcm9taXNlX3Jlc29sdmU9dm9pZCAwO3QuX3JlYWR5UHJvbWlzZV9yZWplY3Q9dm9pZCAwO3QuX3JlYWR5UHJvbWlzZVN0YXRlPSJyZWplY3RlZCJ9ZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUodCl7dC5fcmVhZHlQcm9taXNlX3Jlc29sdmUodm9pZCAwKTt0Ll9yZWFkeVByb21pc2VfcmVzb2x2ZT12b2lkIDA7dC5fcmVhZHlQcm9taXNlX3JlamVjdD12b2lkIDA7dC5fcmVhZHlQcm9taXNlU3RhdGU9ImZ1bGZpbGxlZCJ9ZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh0KXtpZigib2JqZWN0IiE9dHlwZW9mIHR8fG51bGw9PT10KXJldHVybiExO3RyeXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0LmFib3J0ZWR9Y2F0Y2godCl7cmV0dXJuITF9fXZhciBSPSJ1bmRlZmluZWQiIT10eXBlb2YgRE9NRXhjZXB0aW9uP0RPTUV4Y2VwdGlvbjp2b2lkIDAsaz1mdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuITE7dHJ5e25ldyB0O3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oUik/UjpmdW5jdGlvbiBjcmVhdGVET01FeGNlcHRpb25Qb2x5ZmlsbCgpe3ZhciB0PWZ1bmN0aW9uIERPTUV4Y2VwdGlvbih0LHIpe3RoaXMubWVzc2FnZT10fHwiIjt0aGlzLm5hbWU9cnx8IkVycm9yIjtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKX07dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3JldHVybiB0fSgpO2Z1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUGlwZVRvKHQscixhLG8saSxsKXt2YXIgYz1BY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHQpLHU9QWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihyKTt0Ll9kaXN0dXJiZWQ9ITA7dmFyIGQ9ITEsaD1wcm9taXNlUmVzb2x2ZWRXaXRoKHZvaWQgMCk7cmV0dXJuIG5ld1Byb21pc2UoKGZ1bmN0aW9uKHAsbSl7dmFyIHY7aWYodm9pZCAwIT09bCl7dj1mdW5jdGlvbigpe3ZhciBhPW5ldyBrKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpLGw9W107ITE9PT1vJiZsLnB1c2goKGZ1bmN0aW9uKCl7cmV0dXJuIndyaXRhYmxlIj09PXIuX3N0YXRlP1dyaXRhYmxlU3RyZWFtQWJvcnQocixhKTpwcm9taXNlUmVzb2x2ZWRXaXRoKHZvaWQgMCl9KSk7ITE9PT1pJiZsLnB1c2goKGZ1bmN0aW9uKCl7cmV0dXJuInJlYWRhYmxlIj09PXQuX3N0YXRlP1JlYWRhYmxlU3RyZWFtQ2FuY2VsKHQsYSk6cHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApfSkpO3NodXRkb3duV2l0aEFjdGlvbigoZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5hbGwobC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSkpfSksITAsYSl9O2lmKCEwPT09bC5hYm9ydGVkKXt2KCk7cmV0dXJufWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHYpfWlzT3JCZWNvbWVzRXJyb3JlZCh0LGMuX2Nsb3NlZFByb21pc2UsKGZ1bmN0aW9uKHQpeyExPT09bz9zaHV0ZG93bldpdGhBY3Rpb24oKGZ1bmN0aW9uKCl7cmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQocix0KX0pLCEwLHQpOnNodXRkb3duKCEwLHQpfSkpO2lzT3JCZWNvbWVzRXJyb3JlZChyLHUuX2Nsb3NlZFByb21pc2UsKGZ1bmN0aW9uKHIpeyExPT09aT9zaHV0ZG93bldpdGhBY3Rpb24oKGZ1bmN0aW9uKCl7cmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHQscil9KSwhMCxyKTpzaHV0ZG93bighMCxyKX0pKTshZnVuY3Rpb24gaXNPckJlY29tZXNDbG9zZWQodCxyLGEpeyJjbG9zZWQiPT09dC5fc3RhdGU/YSgpOnVwb25GdWxmaWxsbWVudChyLGEpfSh0LGMuX2Nsb3NlZFByb21pc2UsKGZ1bmN0aW9uKCl7ITE9PT1hP3NodXRkb3duV2l0aEFjdGlvbigoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih0KXt2YXIgcj10Ll9vd25lcldyaXRhYmxlU3RyZWFtLGE9ci5fc3RhdGU7cmV0dXJuITA9PT1Xcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChyKXx8ImNsb3NlZCI9PT1hP3Byb21pc2VSZXNvbHZlZFdpdGgodm9pZCAwKToiZXJyb3JlZCI9PT1hP3Byb21pc2VSZWplY3RlZFdpdGgoci5fc3RvcmVkRXJyb3IpOldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHQpfSh1KX0pKTpzaHV0ZG93bigpfSkpO2lmKCEwPT09V3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQocil8fCJjbG9zZWQiPT09ci5fc3RhdGUpe3ZhciBnPW5ldyBUeXBlRXJyb3IoInRoZSBkZXN0aW5hdGlvbiB3cml0YWJsZSBzdHJlYW0gY2xvc2VkIGJlZm9yZSBhbGwgZGF0YSBjb3VsZCBiZSBwaXBlZCB0byBpdCIpOyExPT09aT9zaHV0ZG93bldpdGhBY3Rpb24oKGZ1bmN0aW9uKCl7cmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHQsZyl9KSwhMCxnKTpzaHV0ZG93bighMCxnKX1zZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKGZ1bmN0aW9uIHBpcGVMb29wKCl7cmV0dXJuIG5ld1Byb21pc2UoKGZ1bmN0aW9uKHQscil7IWZ1bmN0aW9uIG5leHQoYSl7YT90KCk6UGVyZm9ybVByb21pc2VUaGVuKGZ1bmN0aW9uIHBpcGVTdGVwKCl7cmV0dXJuITA9PT1kP3Byb21pc2VSZXNvbHZlZFdpdGgoITApOlBlcmZvcm1Qcm9taXNlVGhlbih1Ll9yZWFkeVByb21pc2UsKGZ1bmN0aW9uKCl7cmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKGMpLChmdW5jdGlvbih0KXtpZighMD09PXQuZG9uZSlyZXR1cm4hMDtoPVBlcmZvcm1Qcm9taXNlVGhlbihXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh1LHQudmFsdWUpLHZvaWQgMCxub29wKTtyZXR1cm4hMX0pKX0pKX0oKSxuZXh0LHIpfSghMSl9KSl9KCkpO2Z1bmN0aW9uIHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpe3ZhciB0PWg7cmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihoLChmdW5jdGlvbigpe3JldHVybiB0IT09aD93YWl0Rm9yV3JpdGVzVG9GaW5pc2goKTp2b2lkIDB9KSl9ZnVuY3Rpb24gaXNPckJlY29tZXNFcnJvcmVkKHQscixhKXsiZXJyb3JlZCI9PT10Ll9zdGF0ZT9hKHQuX3N0b3JlZEVycm9yKTp1cG9uUmVqZWN0aW9uKHIsYSl9ZnVuY3Rpb24gc2h1dGRvd25XaXRoQWN0aW9uKHQsYSxvKXtpZighMCE9PWQpe2Q9ITA7IndyaXRhYmxlIj09PXIuX3N0YXRlJiYhMT09PVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHIpP3Vwb25GdWxmaWxsbWVudCh3YWl0Rm9yV3JpdGVzVG9GaW5pc2goKSxkb1RoZVJlc3QpOmRvVGhlUmVzdCgpfWZ1bmN0aW9uIGRvVGhlUmVzdCgpe3Vwb25Qcm9taXNlKHQoKSwoZnVuY3Rpb24oKXtyZXR1cm4gZmluYWxpemUoYSxvKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gZmluYWxpemUoITAsdCl9KSl9fWZ1bmN0aW9uIHNodXRkb3duKHQsYSl7aWYoITAhPT1kKXtkPSEwOyJ3cml0YWJsZSI9PT1yLl9zdGF0ZSYmITE9PT1Xcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChyKT91cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksKGZ1bmN0aW9uKCl7cmV0dXJuIGZpbmFsaXplKHQsYSl9KSk6ZmluYWxpemUodCxhKX19ZnVuY3Rpb24gZmluYWxpemUodCxyKXtXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHUpO1JlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UoYyk7dm9pZCAwIT09bCYmbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsdik7dD9tKHIpOnAodm9pZCAwKX19KSl9dmFyIHc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKCl7dGhyb3cgbmV3IFR5cGVFcnJvcn1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsImRlc2lyZWRTaXplIix7Z2V0OmZ1bmN0aW9uKCl7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJkZXNpcmVkU2l6ZSIpO3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtpZighMT09PUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSl0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oImNsb3NlIik7aWYoITE9PT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgY2xvc2UiKTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UodGhpcyl9O1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24odCl7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJlbnF1ZXVlIik7aWYoITE9PT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZSIpO3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLHQpfTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXtpZighMT09PUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSl0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oImVycm9yIik7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHRoaXMsdCl9O1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW2hdPWZ1bmN0aW9uKHQpe1Jlc2V0UXVldWUodGhpcyk7dmFyIHI9dGhpcy5fY2FuY2VsQWxnb3JpdGhtKHQpO1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7cmV0dXJuIHJ9O1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW3BdPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO2lmKHRoaXMuX3F1ZXVlLmxlbmd0aD4wKXt2YXIgcj1EZXF1ZXVlVmFsdWUodGhpcyk7aWYoITA9PT10aGlzLl9jbG9zZVJlcXVlc3RlZCYmMD09PXRoaXMuX3F1ZXVlLmxlbmd0aCl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtSZWFkYWJsZVN0cmVhbUNsb3NlKHQpfWVsc2UgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodGhpcyk7cmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHIsITEsdC5fcmVhZGVyLl9mb3JBdXRob3JDb2RlKSl9dmFyIGE9UmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdCh0KTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0aGlzKTtyZXR1cm4gYX07cmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJ9KCk7ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtIil9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl7aWYoITEhPT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwodCkpaWYoITAhPT10Ll9wdWxsaW5nKXt0Ll9wdWxsaW5nPSEwO3Vwb25Qcm9taXNlKHQuX3B1bGxBbGdvcml0aG0oKSwoZnVuY3Rpb24oKXt0Ll9wdWxsaW5nPSExO2lmKCEwPT09dC5fcHVsbEFnYWluKXt0Ll9wdWxsQWdhaW49ITE7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl9fSksKGZ1bmN0aW9uKHIpe1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0LHIpfSkpfWVsc2UgdC5fcHVsbEFnYWluPSEwfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCh0KXt2YXIgcj10Ll9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07cmV0dXJuITEhPT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodCkmJiExIT09dC5fc3RhcnRlZCYmKCEwPT09SXNSZWFkYWJsZVN0cmVhbUxvY2tlZChyKSYmUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMocik+MHx8UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHQpPjApfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCl7dC5fcHVsbEFsZ29yaXRobT12b2lkIDA7dC5fY2FuY2VsQWxnb3JpdGhtPXZvaWQgMDt0Ll9zdHJhdGVneVNpemVBbGdvcml0aG09dm9pZCAwfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0KXt2YXIgcj10Ll9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07dC5fY2xvc2VSZXF1ZXN0ZWQ9ITA7aWYoMD09PXQuX3F1ZXVlLmxlbmd0aCl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtSZWFkYWJsZVN0cmVhbUNsb3NlKHIpfX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtpZighMD09PUlzUmVhZGFibGVTdHJlYW1Mb2NrZWQoYSkmJlJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKGEpPjApUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3QoYSxyLCExKTtlbHNle3ZhciBvPXZvaWQgMDt0cnl7bz10Ll9zdHJhdGVneVNpemVBbGdvcml0aG0ocil9Y2F0Y2gocil7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHQscik7dGhyb3cgcn10cnl7RW5xdWV1ZVZhbHVlV2l0aFNpemUodCxyLG8pfWNhdGNoKHIpe1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0LHIpO3Rocm93IHJ9fVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHQpfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtpZigicmVhZGFibGUiPT09YS5fc3RhdGUpe1Jlc2V0UXVldWUodCk7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtSZWFkYWJsZVN0cmVhbUVycm9yKGEscil9fWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0KXt2YXIgcj10Ll9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0uX3N0YXRlO3JldHVybiJlcnJvcmVkIj09PXI/bnVsbDoiY2xvc2VkIj09PXI/MDp0Ll9zdHJhdGVneUhXTS10Ll9xdWV1ZVRvdGFsU2l6ZX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodCl7dmFyIHI9dC5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTtyZXR1cm4hMT09PXQuX2Nsb3NlUmVxdWVzdGVkJiYicmVhZGFibGUiPT09cn1mdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodCxyLGEsbyxpLGwsYyl7ci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtPXQ7ci5fcXVldWU9dm9pZCAwO3IuX3F1ZXVlVG90YWxTaXplPXZvaWQgMDtSZXNldFF1ZXVlKHIpO3IuX3N0YXJ0ZWQ9ITE7ci5fY2xvc2VSZXF1ZXN0ZWQ9ITE7ci5fcHVsbEFnYWluPSExO3IuX3B1bGxpbmc9ITE7ci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtPWM7ci5fc3RyYXRlZ3lIV009bDtyLl9wdWxsQWxnb3JpdGhtPW87ci5fY2FuY2VsQWxnb3JpdGhtPWk7dC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyPXI7dXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChhKCkpLChmdW5jdGlvbigpe3IuX3N0YXJ0ZWQ9ITA7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQocil9KSwoZnVuY3Rpb24odCl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHIsdCl9KSl9ZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS4iK3QrIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIpfXZhciBQPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmaXNGaW5pdGUodCkmJk1hdGguZmxvb3IodCk9PT10fSx4PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QgY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkiKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUsInZpZXciLHtnZXQ6ZnVuY3Rpb24oKXtpZighMT09PUlzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCh0aGlzKSl0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oInZpZXciKTtyZXR1cm4gdGhpcy5fdmlld30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS5yZXNwb25kPWZ1bmN0aW9uKHQpe2lmKCExPT09SXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKXRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigicmVzcG9uZCIpO2lmKHZvaWQgMD09PXRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoaXMgQllPQiByZXF1ZXN0IGhhcyBiZWVuIGludmFsaWRhdGVkIik7dGhpcy5fdmlldy5idWZmZXI7IWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKHQscil7aWYoITE9PT1Jc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHI9TnVtYmVyKHIpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiYnl0ZXNXcml0dGVuIG11c3QgYmUgYSBmaW5pdGUiKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEludGVybmFsKHQscil9KHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLHQpfTtSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS5yZXNwb25kV2l0aE5ld1ZpZXc9ZnVuY3Rpb24odCl7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QodGhpcykpdGhyb3cgYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKCJyZXNwb25kIik7aWYodm9pZCAwPT09dGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQiKTtpZighQXJyYXlCdWZmZXIuaXNWaWV3KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIllvdSBjYW4gb25seSByZXNwb25kIHdpdGggYXJyYXkgYnVmZmVyIHZpZXdzIik7dC5idWZmZXI7IWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcodCxyKXt2YXIgYT10Ll9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtpZihhLmJ5dGVPZmZzZXQrYS5ieXRlc0ZpbGxlZCE9PXIuYnl0ZU9mZnNldCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVGhlIHJlZ2lvbiBzcGVjaWZpZWQgYnkgdmlldyBkb2VzIG5vdCBtYXRjaCBieW9iUmVxdWVzdCIpO2lmKGEuYnl0ZUxlbmd0aCE9PXIuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVGhlIGJ1ZmZlciBvZiB2aWV3IGhhcyBkaWZmZXJlbnQgY2FwYWNpdHkgdGhhbiBieW9iUmVxdWVzdCIpO2EuYnVmZmVyPXIuYnVmZmVyO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwodCxyLmJ5dGVMZW5ndGgpfSh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcix0KX07cmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3R9KCksVD1mdW5jdGlvbigpe2Z1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5Iil9T2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCJieW9iUmVxdWVzdCIse2dldDpmdW5jdGlvbigpe2lmKCExPT09SXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKXRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiYnlvYlJlcXVlc3QiKTtpZih2b2lkIDA9PT10aGlzLl9ieW9iUmVxdWVzdCYmdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MCl7dmFyIHQ9dGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCkscj1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrdC5ieXRlc0ZpbGxlZCx0LmJ5dGVMZW5ndGgtdC5ieXRlc0ZpbGxlZCksYT1PYmplY3QuY3JlYXRlKHgucHJvdG90eXBlKTshZnVuY3Rpb24gU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHQscixhKXt0Ll9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcj1yO3QuX3ZpZXc9YX0oYSx0aGlzLHIpO3RoaXMuX2J5b2JSZXF1ZXN0PWF9cmV0dXJuIHRoaXMuX2J5b2JSZXF1ZXN0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSwiZGVzaXJlZFNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtpZighMT09PUlzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSl0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oImRlc2lyZWRTaXplIik7cmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe2lmKCExPT09SXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKXRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiY2xvc2UiKTtpZighMD09PXRoaXMuX2Nsb3NlUmVxdWVzdGVkKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQ7IGRvIG5vdCBjbG9zZSBpdCBhZ2FpbiEiKTt2YXIgdD10aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtpZigicmVhZGFibGUiIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgc3RyZWFtIChpbiAiK3QrIiBzdGF0ZSkgaXMgbm90IGluIHRoZSByZWFkYWJsZSBzdGF0ZSBhbmQgY2Fubm90IGJlIGNsb3NlZCIpOyFmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UodCl7dmFyIHI9dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtpZih0Ll9xdWV1ZVRvdGFsU2l6ZT4wKXQuX2Nsb3NlUmVxdWVzdGVkPSEwO2Vsc2V7aWYodC5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MCYmdC5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCkuYnl0ZXNGaWxsZWQ+MCl7dmFyIGE9bmV3IFR5cGVFcnJvcigiSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlciIpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcih0LGEpO3Rocm93IGF9UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtSZWFkYWJsZVN0cmVhbUNsb3NlKHIpfX0odGhpcyl9O1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24odCl7aWYoITE9PT1Jc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJlbnF1ZXVlIik7aWYoITA9PT10aGlzLl9jbG9zZVJlcXVlc3RlZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nIik7dmFyIHI9dGhpcy5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7aWYoInJlYWRhYmxlIiE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHN0cmVhbSAoaW4gIityKyIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBlbnF1ZXVlZCB0byIpO2lmKCFBcnJheUJ1ZmZlci5pc1ZpZXcodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IGNhbiBvbmx5IGVucXVldWUgYXJyYXkgYnVmZmVyIHZpZXdzIHdoZW4gdXNpbmcgYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIik7dC5idWZmZXI7IWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKHQscil7dmFyIGE9dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSxvPXIuYnVmZmVyLGk9ci5ieXRlT2Zmc2V0LGw9ci5ieXRlTGVuZ3RoLGM9bztpZighMD09PVJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihhKSlpZigwPT09UmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoYSkpUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUodCxjLGksbCk7ZWxzZXt2YXIgdT1uZXcgVWludDhBcnJheShjLGksbCk7UmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3QoYSx1LCExKX1lbHNlIGlmKCEwPT09UmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKGEpKXtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZSh0LGMsaSxsKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKHQpfWVsc2UgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUodCxjLGksbCk7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl9KHRoaXMsdCl9O1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKHQpe2lmKCExPT09SXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKXRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiZXJyb3IiKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IodGhpcyx0KX07UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGVbaF09ZnVuY3Rpb24odCl7dGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MCYmKHRoaXMuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpLmJ5dGVzRmlsbGVkPTApO1Jlc2V0UXVldWUodGhpcyk7dmFyIHI9dGhpcy5fY2FuY2VsQWxnb3JpdGhtKHQpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7cmV0dXJuIHJ9O1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlW3BdPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtpZih0aGlzLl9xdWV1ZVRvdGFsU2l6ZT4wKXt2YXIgcj10aGlzLl9xdWV1ZS5zaGlmdCgpO3RoaXMuX3F1ZXVlVG90YWxTaXplLT1yLmJ5dGVMZW5ndGg7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4odGhpcyk7dmFyIGE9dm9pZCAwO3RyeXthPW5ldyBVaW50OEFycmF5KHIuYnVmZmVyLHIuYnl0ZU9mZnNldCxyLmJ5dGVMZW5ndGgpfWNhdGNoKHQpe3JldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHQpfXJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChhLCExLHQuX3JlYWRlci5fZm9yQXV0aG9yQ29kZSkpfXZhciBvPXRoaXMuX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZTtpZih2b2lkIDAhPT1vKXt2YXIgaT12b2lkIDA7dHJ5e2k9bmV3IEFycmF5QnVmZmVyKG8pfWNhdGNoKHQpe3JldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHQpfXZhciBsPXtidWZmZXI6aSxieXRlT2Zmc2V0OjAsYnl0ZUxlbmd0aDpvLGJ5dGVzRmlsbGVkOjAsZWxlbWVudFNpemU6MSxjdG9yOlVpbnQ4QXJyYXkscmVhZGVyVHlwZToiZGVmYXVsdCJ9O3RoaXMuX3BlbmRpbmdQdWxsSW50b3MucHVzaChsKX12YXIgYz1SZWFkYWJsZVN0cmVhbUFkZFJlYWRSZXF1ZXN0KHQpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO3JldHVybiBjfTtyZXR1cm4gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcn0oKTtmdW5jdGlvbiBJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodCl7cmV0dXJuISF0eXBlSXNPYmplY3QodCkmJiEhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtIil9ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiKX1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0KXtpZighMSE9PWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCh0KXt2YXIgcj10Ll9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO3JldHVybiJyZWFkYWJsZSI9PT1yLl9zdGF0ZSYmKCEwIT09dC5fY2xvc2VSZXF1ZXN0ZWQmJighMSE9PXQuX3N0YXJ0ZWQmJighMD09PVJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihyKSYmUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMocik+MHx8KCEwPT09UmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHIpJiZSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMocik+MHx8UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKHQpPjApKSkpfSh0KSlpZighMCE9PXQuX3B1bGxpbmcpe3QuX3B1bGxpbmc9ITA7dXBvblByb21pc2UodC5fcHVsbEFsZ29yaXRobSgpLChmdW5jdGlvbigpe3QuX3B1bGxpbmc9ITE7aWYoITA9PT10Ll9wdWxsQWdhaW4pe3QuX3B1bGxBZ2Fpbj0hMTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0KX19KSwoZnVuY3Rpb24ocil7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKHQscil9KSl9ZWxzZSB0Ll9wdWxsQWdhaW49ITB9ZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcih0LHIpe3ZhciBhPSExOyJjbG9zZWQiPT09dC5fc3RhdGUmJihhPSEwKTt2YXIgbz1SZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihyKTsiZGVmYXVsdCI9PT1yLnJlYWRlclR5cGU/UmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3QodCxvLGEpOmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRJbnRvUmVxdWVzdCh0LHIsYSl7dmFyIG89dC5fcmVhZGVyO28uX3JlYWRJbnRvUmVxdWVzdHMuc2hpZnQoKS5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQocixhLG8uX2ZvckF1dGhvckNvZGUpKX0odCxvLGEpfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yKHQpe3ZhciByPXQuYnl0ZXNGaWxsZWQsYT10LmVsZW1lbnRTaXplO3JldHVybiBuZXcgdC5jdG9yKHQuYnVmZmVyLHQuYnl0ZU9mZnNldCxyL2EpfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKHQscixhLG8pe3QuX3F1ZXVlLnB1c2goe2J1ZmZlcjpyLGJ5dGVPZmZzZXQ6YSxieXRlTGVuZ3RoOm99KTt0Ll9xdWV1ZVRvdGFsU2l6ZSs9b31mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSh0LHIpe3ZhciBhPXIuZWxlbWVudFNpemUsbz1yLmJ5dGVzRmlsbGVkLXIuYnl0ZXNGaWxsZWQlYSxpPU1hdGgubWluKHQuX3F1ZXVlVG90YWxTaXplLHIuYnl0ZUxlbmd0aC1yLmJ5dGVzRmlsbGVkKSxsPXIuYnl0ZXNGaWxsZWQraSxjPWwtbCVhLHU9aSxkPSExO2lmKGM+byl7dT1jLXIuYnl0ZXNGaWxsZWQ7ZD0hMH1mb3IodmFyIGgscCxtLHYsZyx5PXQuX3F1ZXVlO3U+MDspe3ZhciBiPXkucGVlaygpLF89TWF0aC5taW4odSxiLmJ5dGVMZW5ndGgpLFM9ci5ieXRlT2Zmc2V0K3IuYnl0ZXNGaWxsZWQ7aD1yLmJ1ZmZlcixwPVMsbT1iLmJ1ZmZlcix2PWIuYnl0ZU9mZnNldCxnPV8sbmV3IFVpbnQ4QXJyYXkoaCkuc2V0KG5ldyBVaW50OEFycmF5KG0sdixnKSxwKTtpZihiLmJ5dGVMZW5ndGg9PT1fKXkuc2hpZnQoKTtlbHNle2IuYnl0ZU9mZnNldCs9XztiLmJ5dGVMZW5ndGgtPV99dC5fcXVldWVUb3RhbFNpemUtPV87UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKHQsXyxyKTt1LT1ffXJldHVybiBkfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvcih0LHIsYSl7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdCh0KTthLmJ5dGVzRmlsbGVkKz1yfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKHQpe2lmKDA9PT10Ll9xdWV1ZVRvdGFsU2l6ZSYmITA9PT10Ll9jbG9zZVJlcXVlc3RlZCl7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtSZWFkYWJsZVN0cmVhbUNsb3NlKHQuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0pfWVsc2UgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl9ZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdCh0KXtpZih2b2lkIDAhPT10Ll9ieW9iUmVxdWVzdCl7dC5fYnlvYlJlcXVlc3QuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyPXZvaWQgMDt0Ll9ieW9iUmVxdWVzdC5fdmlldz12b2lkIDA7dC5fYnlvYlJlcXVlc3Q9dm9pZCAwfX1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKHQpe2Zvcig7dC5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MDspe2lmKDA9PT10Ll9xdWV1ZVRvdGFsU2l6ZSlyZXR1cm47dmFyIHI9dC5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7aWYoITA9PT1SZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSh0LHIpKXtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8odCk7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcih0Ll9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLHIpfX19ZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbCh0LHIpe3ZhciBhPXQuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO2lmKCJjbG9zZWQiPT09dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGUpe2lmKDAhPT1yKXRocm93IG5ldyBUeXBlRXJyb3IoImJ5dGVzV3JpdHRlbiBtdXN0IGJlIDAgd2hlbiBjYWxsaW5nIHJlc3BvbmQoKSBvbiBhIGNsb3NlZCBzdHJlYW0iKTshZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlKHQscil7ci5idWZmZXI9ci5idWZmZXI7dmFyIGE9dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtpZighMD09PVJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihhKSlmb3IoO1JlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyhhKT4wOylSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGEsUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKHQpKX0odCxhKX1lbHNlIWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKHQscixhKXtpZihhLmJ5dGVzRmlsbGVkK3I+YS5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJieXRlc1dyaXR0ZW4gb3V0IG9mIHJhbmdlIik7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKHQscixhKTtpZighKGEuYnl0ZXNGaWxsZWQ8YS5lbGVtZW50U2l6ZSkpe1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byh0KTt2YXIgbz1hLmJ5dGVzRmlsbGVkJWEuZWxlbWVudFNpemU7aWYobz4wKXt2YXIgaT1hLmJ5dGVPZmZzZXQrYS5ieXRlc0ZpbGxlZCxsPWEuYnVmZmVyLnNsaWNlKGktbyxpKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZSh0LGwsMCxsLmJ5dGVMZW5ndGgpfWEuYnVmZmVyPWEuYnVmZmVyO2EuYnl0ZXNGaWxsZWQtPW87UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcih0Ll9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLGEpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUodCl9fSh0LHIsYSk7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl9ZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKHQpe3ZhciByPXQuX3BlbmRpbmdQdWxsSW50b3Muc2hpZnQoKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KHQpO3JldHVybiByfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCl7dC5fcHVsbEFsZ29yaXRobT12b2lkIDA7dC5fY2FuY2VsQWxnb3JpdGhtPXZvaWQgMH1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IodCxyKXt2YXIgYT10Ll9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO2lmKCJyZWFkYWJsZSI9PT1hLl9zdGF0ZSl7IWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3ModCl7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdCh0KTt0Ll9wZW5kaW5nUHVsbEludG9zPW5ldyBkfSh0KTtSZXNldFF1ZXVlKHQpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCk7UmVhZGFibGVTdHJlYW1FcnJvcihhLHIpfX1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUodCl7dmFyIHI9dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7cmV0dXJuImVycm9yZWQiPT09cj9udWxsOiJjbG9zZWQiPT09cj8wOnQuX3N0cmF0ZWd5SFdNLXQuX3F1ZXVlVG90YWxTaXplfWZ1bmN0aW9uIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHQscixhKXt2YXIgbz1PYmplY3QuY3JlYXRlKFQucHJvdG90eXBlKSxpPUNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHIsInB1bGwiLDAsW29dKSxsPUNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHIsImNhbmNlbCIsMSxbXSksYz1yLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtpZih2b2lkIDAhPT1jKXtjPU51bWJlcihjKTtpZighMT09PVAoYyl8fGM8PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoImF1dG9BbGxvY2F0ZUNodW5rU2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpfSFmdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodCxyLGEsbyxpLGwsYyl7ci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbT10O3IuX3B1bGxBZ2Fpbj0hMTtyLl9wdWxsaW5nPSExO3IuX2J5b2JSZXF1ZXN0PXZvaWQgMDtyLl9xdWV1ZT1yLl9xdWV1ZVRvdGFsU2l6ZT12b2lkIDA7UmVzZXRRdWV1ZShyKTtyLl9jbG9zZVJlcXVlc3RlZD0hMTtyLl9zdGFydGVkPSExO3IuX3N0cmF0ZWd5SFdNPVZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhsKTtyLl9wdWxsQWxnb3JpdGhtPW87ci5fY2FuY2VsQWxnb3JpdGhtPWk7ci5fYXV0b0FsbG9jYXRlQ2h1bmtTaXplPWM7ci5fcGVuZGluZ1B1bGxJbnRvcz1uZXcgZDt0Ll9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI9cjt1cG9uUHJvbWlzZShwcm9taXNlUmVzb2x2ZWRXaXRoKGEoKSksKGZ1bmN0aW9uKCl7ci5fc3RhcnRlZD0hMDtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChyKX0pLChmdW5jdGlvbih0KXtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3Iocix0KX0pKX0odCxvLChmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpe3JldHVybiBJbnZva2VPck5vb3Aociwic3RhcnQiLFtvXSl9KSxpLGwsYSxjKX1mdW5jdGlvbiBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24odCl7cmV0dXJuIG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLiIrdCsiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0Iil9ZnVuY3Rpb24gYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS4iK3QrIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIpfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHQpe3JldHVybiBuZXdQcm9taXNlKChmdW5jdGlvbihyLGEpe3ZhciBvPXtfcmVzb2x2ZTpyLF9yZWplY3Q6YX07dC5fcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLnB1c2gobyl9KSl9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzKHQpe3JldHVybiB0Ll9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RofWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcih0KXt2YXIgcj10Ll9yZWFkZXI7cmV0dXJuIHZvaWQgMCE9PXImJiEhSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIocil9dmFyIEU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodCl7aWYoIUlzUmVhZGFibGVTdHJlYW0odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIGNhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBSZWFkYWJsZVN0cmVhbSBpbnN0YW5jZSBnaXZlbiBhIGJ5dGUgc291cmNlIik7aWYoITE9PT1Jc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29uc3RydWN0IGEgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIGZvciBhIHN0cmVhbSBub3QgY29uc3RydWN0ZWQgd2l0aCBhIGJ5dGUgc291cmNlIik7aWYoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHJlYWRpbmcgYnkgYW5vdGhlciByZWFkZXIiKTtSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsdCk7dGhpcy5fcmVhZEludG9SZXF1ZXN0cz1uZXcgZH1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZSwiY2xvc2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIElzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpP3RoaXMuX2Nsb3NlZFByb21pc2U6cHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiY2xvc2VkIikpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiBJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKT92b2lkIDA9PT10aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtP3Byb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigiY2FuY2VsIikpOlJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLHQpOnByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oImNhbmNlbCIpKX07UmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe2lmKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigicmVhZCIpKTtpZih2b2lkIDA9PT10aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtKXJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oInJlYWQgZnJvbSIpKTtpZighQXJyYXlCdWZmZXIuaXNWaWV3KHQpKXJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoInZpZXcgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldyIpKTt0LmJ1ZmZlcjtyZXR1cm4gMD09PXQuYnl0ZUxlbmd0aD9wcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoInZpZXcgbXVzdCBoYXZlIG5vbi16ZXJvIGJ5dGVMZW5ndGgiKSk6ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyUmVhZCh0LHIpe3ZhciBhPXQuX293bmVyUmVhZGFibGVTdHJlYW07YS5fZGlzdHVyYmVkPSEwO3JldHVybiJlcnJvcmVkIj09PWEuX3N0YXRlP3Byb21pc2VSZWplY3RlZFdpdGgoYS5fc3RvcmVkRXJyb3IpOmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byh0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0sbz0xO3IuY29uc3RydWN0b3IhPT1EYXRhVmlldyYmKG89ci5jb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVCk7dmFyIGk9ci5jb25zdHJ1Y3RvcixsPXtidWZmZXI6ci5idWZmZXIsYnl0ZU9mZnNldDpyLmJ5dGVPZmZzZXQsYnl0ZUxlbmd0aDpyLmJ5dGVMZW5ndGgsYnl0ZXNGaWxsZWQ6MCxlbGVtZW50U2l6ZTpvLGN0b3I6aSxyZWFkZXJUeXBlOiJieW9iIn07aWYodC5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MCl7dC5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKGwpO3JldHVybiBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChhKX1pZigiY2xvc2VkIj09PWEuX3N0YXRlKXJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChuZXcgaShsLmJ1ZmZlcixsLmJ5dGVPZmZzZXQsMCksITAsYS5fcmVhZGVyLl9mb3JBdXRob3JDb2RlKSk7aWYodC5fcXVldWVUb3RhbFNpemU+MCl7aWYoITA9PT1SZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSh0LGwpKXt2YXIgYz1SZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihsKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbih0KTtyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoYywhMSxhLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKX1pZighMD09PXQuX2Nsb3NlUmVxdWVzdGVkKXt2YXIgdT1uZXcgVHlwZUVycm9yKCJJbnN1ZmZpY2llbnQgYnl0ZXMgdG8gZmlsbCBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gYnVmZmVyIik7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKHQsdSk7cmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgodSl9fXQuX3BlbmRpbmdQdWxsSW50b3MucHVzaChsKTt2YXIgZD1SZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChhKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0KTtyZXR1cm4gZH0oYS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLHIpfSh0aGlzLHQpfTtSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLnJlbGVhc2VMb2NrPWZ1bmN0aW9uKCl7aWYoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKXRocm93IGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJyZWxlYXNlTG9jayIpO2lmKHZvaWQgMCE9PXRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0pe2lmKHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoPjApdGhyb3cgbmV3IFR5cGVFcnJvcigiVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQiKTtSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpfX07cmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcn0oKTtmdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0KXtyZXR1cm4hIXR5cGVJc09iamVjdCh0KSYmISFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiX3JlYWRJbnRvUmVxdWVzdHMiKX1mdW5jdGlvbiBieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbih0KXtyZXR1cm4gbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZS4iK3QrIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIil9dmFyIE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbSh0LHIpe3ZvaWQgMD09PXQmJih0PXt9KTt2b2lkIDA9PT1yJiYocj17fSk7SW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHRoaXMpO3ZhciBhPXIuc2l6ZSxvPXIuaGlnaFdhdGVyTWFyayxpPXQudHlwZTtpZigiYnl0ZXMiPT09U3RyaW5nKGkpKXtpZih2b2lkIDAhPT1hKXRocm93IG5ldyBSYW5nZUVycm9yKCJUaGUgc3RyYXRlZ3kgZm9yIGEgYnl0ZSBzdHJlYW0gY2Fubm90IGhhdmUgYSBzaXplIGZ1bmN0aW9uIik7dm9pZCAwPT09byYmKG89MCk7U2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRnJvbVVuZGVybHlpbmdTb3VyY2UodGhpcyx0LG89VmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKG8pKX1lbHNle2lmKHZvaWQgMCE9PWkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQiKTt2YXIgbD1NYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oYSk7dm9pZCAwPT09byYmKG89MSk7IWZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHQscixhLG8pe3ZhciBpPU9iamVjdC5jcmVhdGUody5wcm90b3R5cGUpLGw9Q3JlYXRlQWxnb3JpdGhtRnJvbVVuZGVybHlpbmdNZXRob2QociwicHVsbCIsMCxbaV0pLGM9Q3JlYXRlQWxnb3JpdGhtRnJvbVVuZGVybHlpbmdNZXRob2QociwiY2FuY2VsIiwxLFtdKTtTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodCxpLChmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpe3JldHVybiBJbnZva2VPck5vb3Aociwic3RhcnQiLFtpXSl9KSxsLGMsYSxvKX0odGhpcyx0LG89VmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKG8pLGwpfX1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCJsb2NrZWQiLHtnZXQ6ZnVuY3Rpb24oKXtpZighMT09PUlzUmVhZGFibGVTdHJlYW0odGhpcykpdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCJsb2NrZWQiKTtyZXR1cm4gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiExPT09SXNSZWFkYWJsZVN0cmVhbSh0aGlzKT9wcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgiY2FuY2VsIikpOiEwPT09SXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKT9wcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYW5jZWwgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHJlYWRlciIpKTpSZWFkYWJsZVN0cmVhbUNhbmNlbCh0aGlzLHQpfTtSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuZ2V0UmVhZGVyPWZ1bmN0aW9uKHQpe3ZhciByPSh2b2lkIDA9PT10P3t9OnQpLm1vZGU7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtKHRoaXMpKXRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgiZ2V0UmVhZGVyIik7aWYodm9pZCAwPT09cilyZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzLCEwKTtpZigiYnlvYiI9PT0ocj1TdHJpbmcocikpKXJldHVybiBmdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHQscil7dm9pZCAwPT09ciYmKHI9ITEpO3ZhciBhPW5ldyBFKHQpO2EuX2ZvckF1dGhvckNvZGU9cjtyZXR1cm4gYX0odGhpcywhMCk7dGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgbW9kZSBpcyBzcGVjaWZpZWQiKX07UmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUaHJvdWdoPWZ1bmN0aW9uKHQscil7dmFyIGE9dC53cml0YWJsZSxvPXQucmVhZGFibGUsaT12b2lkIDA9PT1yP3t9OnIsbD1pLnByZXZlbnRDbG9zZSxjPWkucHJldmVudEFib3J0LHU9aS5wcmV2ZW50Q2FuY2VsLGQ9aS5zaWduYWw7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtKHRoaXMpKXRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgicGlwZVRocm91Z2giKTtpZighMT09PUlzV3JpdGFibGVTdHJlYW0oYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigid3JpdGFibGUgYXJndW1lbnQgdG8gcGlwZVRocm91Z2ggbXVzdCBiZSBhIFdyaXRhYmxlU3RyZWFtIik7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoInJlYWRhYmxlIGFyZ3VtZW50IHRvIHBpcGVUaHJvdWdoIG11c3QgYmUgYSBSZWFkYWJsZVN0cmVhbSIpO2w9Qm9vbGVhbihsKTtjPUJvb2xlYW4oYyk7dT1Cb29sZWFuKHUpO2lmKHZvaWQgMCE9PWQmJiFpc0Fib3J0U2lnbmFsKGQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVGhyb3VnaCdzIHNpZ25hbCBvcHRpb24gbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCIpO2lmKCEwPT09SXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0iKTtpZighMD09PUlzV3JpdGFibGVTdHJlYW1Mb2NrZWQoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUaHJvdWdoIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFdyaXRhYmxlU3RyZWFtIik7c2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShSZWFkYWJsZVN0cmVhbVBpcGVUbyh0aGlzLGEsbCxjLHUsZCkpO3JldHVybiBvfTtSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvPWZ1bmN0aW9uKHQscil7dmFyIGE9dm9pZCAwPT09cj97fTpyLG89YS5wcmV2ZW50Q2xvc2UsaT1hLnByZXZlbnRBYm9ydCxsPWEucHJldmVudENhbmNlbCxjPWEuc2lnbmFsO2lmKCExPT09SXNSZWFkYWJsZVN0cmVhbSh0aGlzKSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoInBpcGVUbyIpKTtpZighMT09PUlzV3JpdGFibGVTdHJlYW0odCkpcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUbydzIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBXcml0YWJsZVN0cmVhbSIpKTtvPUJvb2xlYW4obyk7aT1Cb29sZWFuKGkpO2w9Qm9vbGVhbihsKTtyZXR1cm4gdm9pZCAwPT09Y3x8aXNBYm9ydFNpZ25hbChjKT8hMD09PUlzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFJlYWRhYmxlU3RyZWFtIikpOiEwPT09SXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0KT9wcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0iKSk6UmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcyx0LG8saSxsLGMpOnByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUbydzIHNpZ25hbCBvcHRpb24gbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCIpKX07UmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnRlZT1mdW5jdGlvbigpe2lmKCExPT09SXNSZWFkYWJsZVN0cmVhbSh0aGlzKSl0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoInRlZSIpO3ZhciB0PWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtVGVlKHQscil7dmFyIGEsbyxpLGwsYyx1PUFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodCksZD0hMSxoPSExLHA9ITEsbT1uZXdQcm9taXNlKChmdW5jdGlvbih0KXtjPXR9KSk7ZnVuY3Rpb24gcHVsbEFsZ29yaXRobSgpe2lmKCEwPT09ZClyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApO2Q9ITA7c2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh0cmFuc2Zvcm1Qcm9taXNlV2l0aChSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHUpLChmdW5jdGlvbih0KXtkPSExO2lmKCEwIT09dC5kb25lKXt2YXIgcj10LnZhbHVlLGE9cixvPXI7ITE9PT1oJiZSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShpLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsYSk7ITE9PT1wJiZSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShsLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsbyl9ZWxzZXshMT09PWgmJlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShpLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpOyExPT09cCYmUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGwuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcil9fSkpKTtyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApfWZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCl7fWk9Q3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0scHVsbEFsZ29yaXRobSwoZnVuY3Rpb24gY2FuY2VsMUFsZ29yaXRobShyKXtoPSEwO2E9cjtpZighMD09PXApe3ZhciBpPWNyZWF0ZUFycmF5RnJvbUxpc3QoW2Esb10pLGw9UmVhZGFibGVTdHJlYW1DYW5jZWwodCxpKTtjKGwpfXJldHVybiBtfSkpO2w9Q3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0scHVsbEFsZ29yaXRobSwoZnVuY3Rpb24gY2FuY2VsMkFsZ29yaXRobShyKXtwPSEwO289cjtpZighMD09PWgpe3ZhciBpPWNyZWF0ZUFycmF5RnJvbUxpc3QoW2Esb10pLGw9UmVhZGFibGVTdHJlYW1DYW5jZWwodCxpKTtjKGwpfXJldHVybiBtfSkpO3Vwb25SZWplY3Rpb24odS5fY2xvc2VkUHJvbWlzZSwoZnVuY3Rpb24odCl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGkuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcix0KTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IobC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLHQpfSkpO3JldHVybltpLGxdfSh0aGlzKTtyZXR1cm4gY3JlYXRlQXJyYXlGcm9tTGlzdCh0KX07UmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLmdldEl0ZXJhdG9yPWZ1bmN0aW9uKHQpe3ZhciByPSh2b2lkIDA9PT10P3t9OnQpLnByZXZlbnRDYW5jZWwsYT12b2lkIDAhPT1yJiZyO2lmKCExPT09SXNSZWFkYWJsZVN0cmVhbSh0aGlzKSl0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoImdldEl0ZXJhdG9yIik7cmV0dXJuIGZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodCxyKXt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGE9QWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0KSxvPU9iamVjdC5jcmVhdGUoeSk7by5fYXN5bmNJdGVyYXRvclJlYWRlcj1hO28uX3ByZXZlbnRDYW5jZWw9Qm9vbGVhbihyKTtyZXR1cm4gb30odGhpcyxhKX07cmV0dXJuIFJlYWRhYmxlU3RyZWFtfSgpOyJzeW1ib2wiPT10eXBlb2Ygci5hc3luY0l0ZXJhdG9yJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoTy5wcm90b3R5cGUsci5hc3luY0l0ZXJhdG9yLHt2YWx1ZTpPLnByb3RvdHlwZS5nZXRJdGVyYXRvcixlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO2Z1bmN0aW9uIENyZWF0ZVJlYWRhYmxlU3RyZWFtKHQscixhLG8saSl7dm9pZCAwPT09byYmKG89MSk7dm9pZCAwPT09aSYmKGk9ZnVuY3Rpb24oKXtyZXR1cm4gMX0pO3ZhciBsPU9iamVjdC5jcmVhdGUoTy5wcm90b3R5cGUpO0luaXRpYWxpemVSZWFkYWJsZVN0cmVhbShsKTtTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIobCxPYmplY3QuY3JlYXRlKHcucHJvdG90eXBlKSx0LHIsYSxvLGkpO3JldHVybiBsfWZ1bmN0aW9uIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbSh0KXt0Ll9zdGF0ZT0icmVhZGFibGUiO3QuX3JlYWRlcj12b2lkIDA7dC5fc3RvcmVkRXJyb3I9dm9pZCAwO3QuX2Rpc3R1cmJlZD0hMX1mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyIil9ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0KXtyZXR1cm4gdm9pZCAwIT09dC5fcmVhZGVyfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHQscil7dC5fZGlzdHVyYmVkPSEwO2lmKCJjbG9zZWQiPT09dC5fc3RhdGUpcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodm9pZCAwKTtpZigiZXJyb3JlZCI9PT10Ll9zdGF0ZSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh0Ll9zdG9yZWRFcnJvcik7UmVhZGFibGVTdHJlYW1DbG9zZSh0KTtyZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgodC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyW2hdKHIpLG5vb3ApfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2xvc2UodCl7dC5fc3RhdGU9ImNsb3NlZCI7dmFyIHI9dC5fcmVhZGVyO2lmKHZvaWQgMCE9PXIpe2lmKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHIpKXtyLl9yZWFkUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodm9pZCAwLCEwLHIuX2ZvckF1dGhvckNvZGUpKX0pKTtyLl9yZWFkUmVxdWVzdHM9bmV3IGR9ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHIpfX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUVycm9yKHQscil7dC5fc3RhdGU9ImVycm9yZWQiO3QuX3N0b3JlZEVycm9yPXI7dmFyIGE9dC5fcmVhZGVyO2lmKHZvaWQgMCE9PWEpe2lmKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKGEpKXthLl9yZWFkUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5fcmVqZWN0KHIpfSkpO2EuX3JlYWRSZXF1ZXN0cz1uZXcgZH1lbHNle2EuX3JlYWRJbnRvUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5fcmVqZWN0KHIpfSkpO2EuX3JlYWRJbnRvUmVxdWVzdHM9bmV3IGR9ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QoYSxyKX19ZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtIil9dmFyIEk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5KHQpe3ZhciByPXQuaGlnaFdhdGVyTWFyazt0aGlzLmhpZ2hXYXRlck1hcms9cn1CeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiB0LmJ5dGVMZW5ndGh9O3JldHVybiBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5fSgpLEQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBDb3VudFF1ZXVpbmdTdHJhdGVneSh0KXt2YXIgcj10LmhpZ2hXYXRlck1hcms7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ9Q291bnRRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gMX07cmV0dXJuIENvdW50UXVldWluZ1N0cmF0ZWd5fSgpLEw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0odCxyLGEpe3ZvaWQgMD09PXQmJih0PXt9KTt2b2lkIDA9PT1yJiYocj17fSk7dm9pZCAwPT09YSYmKGE9e30pO3ZhciBvPXIuc2l6ZSxpPXIuaGlnaFdhdGVyTWFyayxsPWEuc2l6ZSxjPWEuaGlnaFdhdGVyTWFyaztpZih2b2lkIDAhPT10LndyaXRhYmxlVHlwZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB3cml0YWJsZSB0eXBlIHNwZWNpZmllZCIpO3ZhciB1PU1ha2VTaXplQWxnb3JpdGhtRnJvbVNpemVGdW5jdGlvbihvKTt2b2lkIDA9PT1pJiYoaT0xKTtpPVZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhpKTtpZih2b2lkIDAhPT10LnJlYWRhYmxlVHlwZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCByZWFkYWJsZSB0eXBlIHNwZWNpZmllZCIpO3ZhciBkLGg9TWFrZVNpemVBbGdvcml0aG1Gcm9tU2l6ZUZ1bmN0aW9uKGwpO3ZvaWQgMD09PWMmJihjPTApO2M9VmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGMpOyFmdW5jdGlvbiBJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtKHQscixhLG8saSxsKXtmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpe3JldHVybiByfXQuX3dyaXRhYmxlPWZ1bmN0aW9uIENyZWF0ZVdyaXRhYmxlU3RyZWFtKHQscixhLG8saSxsKXt2b2lkIDA9PT1pJiYoaT0xKTt2b2lkIDA9PT1sJiYobD1mdW5jdGlvbigpe3JldHVybiAxfSk7dmFyIGM9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7SW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKGMpO1NldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihjLE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHQscixhLG8saSxsKTtyZXR1cm4gY30oc3RhcnRBbGdvcml0aG0sKGZ1bmN0aW9uIHdyaXRlQWxnb3JpdGhtKHIpe3JldHVybiBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua1dyaXRlQWxnb3JpdGhtKHQscil7dmFyIGE9dC5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcjtyZXR1cm4hMD09PXQuX2JhY2twcmVzc3VyZT90cmFuc2Zvcm1Qcm9taXNlV2l0aCh0Ll9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlLChmdW5jdGlvbigpe3ZhciBvPXQuX3dyaXRhYmxlO2lmKCJlcnJvcmluZyI9PT1vLl9zdGF0ZSl0aHJvdyBvLl9zdG9yZWRFcnJvcjtyZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGEscil9KSk6VHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGEscil9KHQscil9KSwoZnVuY3Rpb24gY2xvc2VBbGdvcml0aG0oKXtyZXR1cm4gZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobSh0KXt2YXIgcj10Ll9yZWFkYWJsZSxhPXQuX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIsbz1hLl9mbHVzaEFsZ29yaXRobSgpO1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGEpO3JldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChvLChmdW5jdGlvbigpe2lmKCJlcnJvcmVkIj09PXIuX3N0YXRlKXRocm93IHIuX3N0b3JlZEVycm9yO3ZhciB0PXIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjshMD09PVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZSh0KSYmUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHQpfSksKGZ1bmN0aW9uKGEpe1RyYW5zZm9ybVN0cmVhbUVycm9yKHQsYSk7dGhyb3cgci5fc3RvcmVkRXJyb3J9KSl9KHQpfSksKGZ1bmN0aW9uIGFib3J0QWxnb3JpdGhtKHIpe3JldHVybiBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Fib3J0QWxnb3JpdGhtKHQscil7VHJhbnNmb3JtU3RyZWFtRXJyb3IodCxyKTtyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApfSh0LHIpfSksYSxvKTt0Ll9yZWFkYWJsZT1DcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwoZnVuY3Rpb24gcHVsbEFsZ29yaXRobSgpe3JldHVybiBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobSh0KXtUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUodCwhMSk7cmV0dXJuIHQuX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2V9KHQpfSksKGZ1bmN0aW9uIGNhbmNlbEFsZ29yaXRobShyKXtUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHQscik7cmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodm9pZCAwKX0pLGksbCk7dC5fYmFja3ByZXNzdXJlPXZvaWQgMDt0Ll9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlPXZvaWQgMDt0Ll9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmU9dm9pZCAwO1RyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSh0LCEwKTt0Ll90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyPXZvaWQgMH0odGhpcyxuZXdQcm9taXNlKChmdW5jdGlvbih0KXtkPXR9KSksaSx1LGMsaCk7IWZ1bmN0aW9uIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIodCxyKXt2YXIgYT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKSx0cmFuc2Zvcm1BbGdvcml0aG09ZnVuY3Rpb24odCl7dHJ5e1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShhLHQpO3JldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHZvaWQgMCl9Y2F0Y2godCl7cmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgodCl9fSxvPXIudHJhbnNmb3JtO2lmKHZvaWQgMCE9PW8pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXRocm93IG5ldyBUeXBlRXJyb3IoInRyYW5zZm9ybSBpcyBub3QgYSBtZXRob2QiKTt0cmFuc2Zvcm1BbGdvcml0aG09ZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2VDYWxsKG8scixbdCxhXSl9fXZhciBpPUNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHIsImZsdXNoIiwwLFthXSk7IWZ1bmN0aW9uIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodCxyLGEsbyl7ci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbT10O3QuX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXI9cjtyLl90cmFuc2Zvcm1BbGdvcml0aG09YTtyLl9mbHVzaEFsZ29yaXRobT1vfSh0LGEsdHJhbnNmb3JtQWxnb3JpdGhtLGkpfSh0aGlzLHQpO3ZhciBwPUludm9rZU9yTm9vcCh0LCJzdGFydCIsW3RoaXMuX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXJdKTtkKHApfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLCJyZWFkYWJsZSIse2dldDpmdW5jdGlvbigpe2lmKCExPT09SXNUcmFuc2Zvcm1TdHJlYW0odGhpcykpdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCJyZWFkYWJsZSIpO3JldHVybiB0aGlzLl9yZWFkYWJsZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZSwid3JpdGFibGUiLHtnZXQ6ZnVuY3Rpb24oKXtpZighMT09PUlzVHJhbnNmb3JtU3RyZWFtKHRoaXMpKXRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMigid3JpdGFibGUiKTtyZXR1cm4gdGhpcy5fd3JpdGFibGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk7cmV0dXJuIFRyYW5zZm9ybVN0cmVhbX0oKTtmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbSh0KXtyZXR1cm4hIXR5cGVJc09iamVjdCh0KSYmISFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIiKX1mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcih0LHIpe1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0Ll9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLHIpO1RyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUodCxyKX1mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHQscil7VHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModC5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcik7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQodC5fd3JpdGFibGUuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcixyKTshMD09PXQuX2JhY2twcmVzc3VyZSYmVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHQsITEpfWZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSh0LHIpe3ZvaWQgMCE9PXQuX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UmJnQuX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSgpO3QuX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2U9bmV3UHJvbWlzZSgoZnVuY3Rpb24ocil7dC5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlPXJ9KSk7dC5fYmFja3ByZXNzdXJlPXJ9dmFyIE09ZnVuY3Rpb24oKXtmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIGluc3RhbmNlcyBjYW5ub3QgYmUgY3JlYXRlZCBkaXJlY3RseSIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsImRlc2lyZWRTaXplIix7Z2V0OmZ1bmN0aW9uKCl7aWYoITE9PT1Jc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKXRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCJkZXNpcmVkU2l6ZSIpO3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcy5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcil9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk7VHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24odCl7aWYoITE9PT1Jc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKXRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCJlbnF1ZXVlIik7VHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsdCl9O1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXtpZighMT09PUlzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoImVycm9yIik7IWZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodCxyKXtUcmFuc2Zvcm1TdHJlYW1FcnJvcih0Ll9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLHIpfSh0aGlzLHQpfTtUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUudGVybWluYXRlPWZ1bmN0aW9uKCl7aWYoITE9PT1Jc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKXRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCJ0ZXJtaW5hdGUiKTshZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUodCl7dmFyIHI9dC5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSxhPXIuX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7ITA9PT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoYSkmJlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShhKTt2YXIgbz1uZXcgVHlwZUVycm9yKCJUcmFuc2Zvcm1TdHJlYW0gdGVybWluYXRlZCIpO1RyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUocixvKX0odGhpcyl9O3JldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcn0oKTtmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSIpfWZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHQpe3QuX3RyYW5zZm9ybUFsZ29yaXRobT12b2lkIDA7dC5fZmx1c2hBbGdvcml0aG09dm9pZCAwfWZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0sbz1hLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyO2lmKCExPT09UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlIHNpZGUgaXMgbm90IGluIGEgc3RhdGUgdGhhdCBwZXJtaXRzIGVucXVldWUiKTt0cnl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUobyxyKX1jYXRjaCh0KXtUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKGEsdCk7dGhyb3cgYS5fcmVhZGFibGUuX3N0b3JlZEVycm9yfShmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVySGFzQmFja3ByZXNzdXJlKHQpe3JldHVybiEwIT09UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKHQpfSkobykhPT1hLl9iYWNrcHJlc3N1cmUmJlRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShhLCEwKX1mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0odCxyKXtyZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgodC5fdHJhbnNmb3JtQWxnb3JpdGhtKHIpLHZvaWQgMCwoZnVuY3Rpb24ocil7VHJhbnNmb3JtU3RyZWFtRXJyb3IodC5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSxyKTt0aHJvdyByfSkpfWZ1bmN0aW9uIGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIil9ZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLiIrdCsiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW0iKX10LkJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3k9STt0LkNvdW50UXVldWluZ1N0cmF0ZWd5PUQ7dC5SZWFkYWJsZVN0cmVhbT1PO3QuVHJhbnNmb3JtU3RyZWFtPUw7dC5Xcml0YWJsZVN0cmVhbT1TO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0ocil9LGZ1bmN0aW9uKHQscixhKXthKDE0Nyk7YSgxMTgpO2EoNzcpO2EoMTIwKTt2YXIgbz1hKDQzKTt0LmV4cG9ydHM9by5NYXB9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG89YSgxNDgpLGk9YSgxNTIpO3QuZXhwb3J0cz1vKCJNYXAiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gTWFwKCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTp2b2lkIDApfX0pLGkpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTApLGk9YSgxMSksbD1hKDUyKSxjPWEoMjkpLHU9YSgxNDkpLGQ9YSgxMDQpLGg9YSgxMjYpLHA9YSgyMiksbT1hKDE0KSx2PWEoOTcpLGc9YSg4NSkseT1hKDE1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXt2YXIgYj0tMSE9PXQuaW5kZXhPZigiTWFwIiksXz0tMSE9PXQuaW5kZXhPZigiV2VhayIpLFM9Yj8ic2V0IjoiYWRkIixDPWlbdF0sQT1DJiZDLnByb3RvdHlwZSxSPUMsaz17fSxmaXhNZXRob2Q9ZnVuY3Rpb24odCl7dmFyIHI9QVt0XTtjKEEsdCwiYWRkIj09dD9mdW5jdGlvbiBhZGQodCl7ci5jYWxsKHRoaXMsMD09PXQ/MDp0KTtyZXR1cm4gdGhpc306ImRlbGV0ZSI9PXQ/ZnVuY3Rpb24odCl7cmV0dXJuIShfJiYhcCh0KSkmJnIuY2FsbCh0aGlzLDA9PT10PzA6dCl9OiJnZXQiPT10P2Z1bmN0aW9uIGdldCh0KXtyZXR1cm4gXyYmIXAodCk/dm9pZCAwOnIuY2FsbCh0aGlzLDA9PT10PzA6dCl9OiJoYXMiPT10P2Z1bmN0aW9uIGhhcyh0KXtyZXR1cm4hKF8mJiFwKHQpKSYmci5jYWxsKHRoaXMsMD09PXQ/MDp0KX06ZnVuY3Rpb24gc2V0KHQsYSl7ci5jYWxsKHRoaXMsMD09PXQ/MDp0LGEpO3JldHVybiB0aGlzfSl9O2lmKGwodCwiZnVuY3Rpb24iIT10eXBlb2YgQ3x8IShffHxBLmZvckVhY2gmJiFtKChmdW5jdGlvbigpeyhuZXcgQykuZW50cmllcygpLm5leHQoKX0pKSkpKXtSPWEuZ2V0Q29uc3RydWN0b3Iocix0LGIsUyk7dS5SRVFVSVJFRD0hMH1lbHNlIGlmKGwodCwhMCkpe3ZhciB3PW5ldyBSLFA9d1tTXShfP3t9Oi0wLDEpIT13LHg9bSgoZnVuY3Rpb24oKXt3LmhhcygxKX0pKSxUPXYoKGZ1bmN0aW9uKHQpe25ldyBDKHQpfSkpLEU9IV8mJm0oKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBDLHI9NTtyLS07KXRbU10ocixyKTtyZXR1cm4hdC5oYXMoLTApfSkpO2lmKCFUKXsoUj1yKChmdW5jdGlvbihyLGEpe2gocixSLHQpO3ZhciBvPXkobmV3IEMscixSKTtudWxsIT1hJiZkKGEsb1tTXSxvLGIpO3JldHVybiBvfSkpKS5wcm90b3R5cGU9QTtBLmNvbnN0cnVjdG9yPVJ9aWYoeHx8RSl7Zml4TWV0aG9kKCJkZWxldGUiKTtmaXhNZXRob2QoImhhcyIpO2ImJmZpeE1ldGhvZCgiZ2V0Iil9KEV8fFApJiZmaXhNZXRob2QoUyk7XyYmQS5jbGVhciYmZGVsZXRlIEEuY2xlYXJ9a1t0XT1SO28oe2dsb2JhbDohMCxmb3JjZWQ6UiE9Q30sayk7ZyhSLHQpO198fGEuc2V0U3Ryb25nKFIsdCxiKTtyZXR1cm4gUn19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDM5KSxpPWEoMjIpLGw9YSgyMyksYz1hKDI3KS5mLHU9YSgzOCksZD1hKDE1MCksaD11KCJtZXRhIikscD0wLG09T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2V0TWV0YWRhdGE9ZnVuY3Rpb24odCl7Yyh0LGgse3ZhbHVlOntvYmplY3RJRDoiTyIrICsrcCx3ZWFrRGF0YTp7fX19KX0sdj10LmV4cG9ydHM9e1JFUVVJUkVEOiExLGZhc3RLZXk6ZnVuY3Rpb24odCxyKXtpZighaSh0KSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHQ/dDooInN0cmluZyI9PXR5cGVvZiB0PyJTIjoiUCIpK3Q7aWYoIWwodCxoKSl7aWYoIW0odCkpcmV0dXJuIkYiO2lmKCFyKXJldHVybiJFIjtzZXRNZXRhZGF0YSh0KX1yZXR1cm4gdFtoXS5vYmplY3RJRH0sZ2V0V2Vha0RhdGE6ZnVuY3Rpb24odCxyKXtpZighbCh0LGgpKXtpZighbSh0KSlyZXR1cm4hMDtpZighcilyZXR1cm4hMTtzZXRNZXRhZGF0YSh0KX1yZXR1cm4gdFtoXS53ZWFrRGF0YX0sb25GcmVlemU6ZnVuY3Rpb24odCl7ZCYmdi5SRVFVSVJFRCYmbSh0KSYmIWwodCxoKSYmc2V0TWV0YWRhdGEodCk7cmV0dXJuIHR9fTtvW2hdPSEwfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxNCk7dC5leHBvcnRzPSFvKChmdW5jdGlvbigpe3JldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpfSkpfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgyMiksaT1hKDg3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyLGEpe3ZhciBsLGM7aSYmImZ1bmN0aW9uIj09dHlwZW9mKGw9ci5jb25zdHJ1Y3RvcikmJmwhPT1hJiZvKGM9bC5wcm90b3R5cGUpJiZjIT09YS5wcm90b3R5cGUmJmkodCxjKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG89YSgyNykuZixpPWEoNzEpLGw9YSgxMjQpLGM9YSg2MiksdT1hKDEyNiksZD1hKDEwNCksaD1hKDc5KSxwPWEoMTI1KSxtPWEoMTMpLHY9YSgxNDkpLmZhc3RLZXksZz1hKDMzKSx5PWcuc2V0LGI9Zy5nZXR0ZXJGb3I7dC5leHBvcnRzPXtnZXRDb25zdHJ1Y3RvcjpmdW5jdGlvbih0LHIsYSxoKXt2YXIgcD10KChmdW5jdGlvbih0LG8pe3UodCxwLHIpO3kodCx7dHlwZTpyLGluZGV4OmkobnVsbCksZmlyc3Q6dm9pZCAwLGxhc3Q6dm9pZCAwLHNpemU6MH0pO218fCh0LnNpemU9MCk7bnVsbCE9byYmZChvLHRbaF0sdCxhKX0pKSxnPWIociksZGVmaW5lPWZ1bmN0aW9uKHQscixhKXt2YXIgbyxpLGw9Zyh0KSxjPWdldEVudHJ5KHQscik7aWYoYyljLnZhbHVlPWE7ZWxzZXtsLmxhc3Q9Yz17aW5kZXg6aT12KHIsITApLGtleTpyLHZhbHVlOmEscHJldmlvdXM6bz1sLmxhc3QsbmV4dDp2b2lkIDAscmVtb3ZlZDohMX07bC5maXJzdHx8KGwuZmlyc3Q9Yyk7byYmKG8ubmV4dD1jKTttP2wuc2l6ZSsrOnQuc2l6ZSsrOyJGIiE9PWkmJihsLmluZGV4W2ldPWMpfXJldHVybiB0fSxnZXRFbnRyeT1mdW5jdGlvbih0LHIpe3ZhciBhLG89Zyh0KSxpPXYocik7aWYoIkYiIT09aSlyZXR1cm4gby5pbmRleFtpXTtmb3IoYT1vLmZpcnN0O2E7YT1hLm5leHQpaWYoYS5rZXk9PXIpcmV0dXJuIGF9O2wocC5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uIGNsZWFyKCl7Zm9yKHZhciB0PWcodGhpcykscj10LmluZGV4LGE9dC5maXJzdDthOyl7YS5yZW1vdmVkPSEwO2EucHJldmlvdXMmJihhLnByZXZpb3VzPWEucHJldmlvdXMubmV4dD12b2lkIDApO2RlbGV0ZSByW2EuaW5kZXhdO2E9YS5uZXh0fXQuZmlyc3Q9dC5sYXN0PXZvaWQgMDttP3Quc2l6ZT0wOnRoaXMuc2l6ZT0wfSxkZWxldGU6ZnVuY3Rpb24odCl7dmFyIHI9Zyh0aGlzKSxhPWdldEVudHJ5KHRoaXMsdCk7aWYoYSl7dmFyIG89YS5uZXh0LGk9YS5wcmV2aW91cztkZWxldGUgci5pbmRleFthLmluZGV4XTthLnJlbW92ZWQ9ITA7aSYmKGkubmV4dD1vKTtvJiYoby5wcmV2aW91cz1pKTtyLmZpcnN0PT1hJiYoci5maXJzdD1vKTtyLmxhc3Q9PWEmJihyLmxhc3Q9aSk7bT9yLnNpemUtLTp0aGlzLnNpemUtLX1yZXR1cm4hIWF9LGZvckVhY2g6ZnVuY3Rpb24gZm9yRWFjaCh0KXtmb3IodmFyIHIsYT1nKHRoaXMpLG89Yyh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3I9cj9yLm5leHQ6YS5maXJzdDspe28oci52YWx1ZSxyLmtleSx0aGlzKTtmb3IoO3ImJnIucmVtb3ZlZDspcj1yLnByZXZpb3VzfX0saGFzOmZ1bmN0aW9uIGhhcyh0KXtyZXR1cm4hIWdldEVudHJ5KHRoaXMsdCl9fSk7bChwLnByb3RvdHlwZSxhP3tnZXQ6ZnVuY3Rpb24gZ2V0KHQpe3ZhciByPWdldEVudHJ5KHRoaXMsdCk7cmV0dXJuIHImJnIudmFsdWV9LHNldDpmdW5jdGlvbiBzZXQodCxyKXtyZXR1cm4gZGVmaW5lKHRoaXMsMD09PXQ/MDp0LHIpfX06e2FkZDpmdW5jdGlvbiBhZGQodCl7cmV0dXJuIGRlZmluZSh0aGlzLHQ9MD09PXQ/MDp0LHQpfX0pO20mJm8ocC5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZyh0aGlzKS5zaXplfX0pO3JldHVybiBwfSxzZXRTdHJvbmc6ZnVuY3Rpb24odCxyLGEpe3ZhciBvPXIrIiBJdGVyYXRvciIsaT1iKHIpLGw9YihvKTtoKHQsciwoZnVuY3Rpb24odCxyKXt5KHRoaXMse3R5cGU6byx0YXJnZXQ6dCxzdGF0ZTppKHQpLGtpbmQ6cixsYXN0OnZvaWQgMH0pfSksKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWwodGhpcykscj10LmtpbmQsYT10Lmxhc3Q7YSYmYS5yZW1vdmVkOylhPWEucHJldmlvdXM7aWYoIXQudGFyZ2V0fHwhKHQubGFzdD1hPWE/YS5uZXh0OnQuc3RhdGUuZmlyc3QpKXt0LnRhcmdldD12b2lkIDA7cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX1yZXR1cm4ia2V5cyI9PXI/e3ZhbHVlOmEua2V5LGRvbmU6ITF9OiJ2YWx1ZXMiPT1yP3t2YWx1ZTphLnZhbHVlLGRvbmU6ITF9Ont2YWx1ZTpbYS5rZXksYS52YWx1ZV0sZG9uZTohMX19KSxhPyJlbnRyaWVzIjoidmFsdWVzIiwhYSwhMCk7cChyKX19fSxmdW5jdGlvbih0LHIsYSl7YSgxNTQpO2EoMTE4KTthKDc3KTthKDEyMCk7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uU2V0fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTQ4KSxpPWEoMTUyKTt0LmV4cG9ydHM9bygiU2V0IiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFNldCgpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19KSxpKX0sZnVuY3Rpb24odCxyLGEpe2EoMTE4KTthKDE1Nik7YSgxMjApO3ZhciBvPWEoNDMpO3QuZXhwb3J0cz1vLldlYWtNYXB9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG8saT1hKDExKSxsPWEoMTI0KSxjPWEoMTQ5KSx1PWEoMTQ4KSxkPWEoMTU3KSxoPWEoMjIpLHA9YSgzMykuZW5mb3JjZSxtPWEoMzQpLHY9IWkuQWN0aXZlWE9iamVjdCYmIkFjdGl2ZVhPYmplY3QiaW4gaSxnPU9iamVjdC5pc0V4dGVuc2libGUsd3JhcHBlcj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19LHk9dC5leHBvcnRzPXUoIldlYWtNYXAiLHdyYXBwZXIsZCk7aWYobSYmdil7bz1kLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIldlYWtNYXAiLCEwKTtjLlJFUVVJUkVEPSEwO3ZhciBiPXkucHJvdG90eXBlLF89Yi5kZWxldGUsUz1iLmhhcyxDPWIuZ2V0LEE9Yi5zZXQ7bChiLHtkZWxldGU6ZnVuY3Rpb24odCl7aWYoaCh0KSYmIWcodCkpe3ZhciByPXAodGhpcyk7ci5mcm96ZW58fChyLmZyb3plbj1uZXcgbyk7cmV0dXJuIF8uY2FsbCh0aGlzLHQpfHxyLmZyb3plbi5kZWxldGUodCl9cmV0dXJuIF8uY2FsbCh0aGlzLHQpfSxoYXM6ZnVuY3Rpb24gaGFzKHQpe2lmKGgodCkmJiFnKHQpKXt2YXIgcj1wKHRoaXMpO3IuZnJvemVufHwoci5mcm96ZW49bmV3IG8pO3JldHVybiBTLmNhbGwodGhpcyx0KXx8ci5mcm96ZW4uaGFzKHQpfXJldHVybiBTLmNhbGwodGhpcyx0KX0sZ2V0OmZ1bmN0aW9uIGdldCh0KXtpZihoKHQpJiYhZyh0KSl7dmFyIHI9cCh0aGlzKTtyLmZyb3plbnx8KHIuZnJvemVuPW5ldyBvKTtyZXR1cm4gUy5jYWxsKHRoaXMsdCk/Qy5jYWxsKHRoaXMsdCk6ci5mcm96ZW4uZ2V0KHQpfXJldHVybiBDLmNhbGwodGhpcyx0KX0sc2V0OmZ1bmN0aW9uIHNldCh0LHIpe2lmKGgodCkmJiFnKHQpKXt2YXIgYT1wKHRoaXMpO2EuZnJvemVufHwoYS5mcm96ZW49bmV3IG8pO1MuY2FsbCh0aGlzLHQpP0EuY2FsbCh0aGlzLHQscik6YS5mcm96ZW4uc2V0KHQscil9ZWxzZSBBLmNhbGwodGhpcyx0LHIpO3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDEyNCksaT1hKDE0OSkuZ2V0V2Vha0RhdGEsbD1hKDI4KSxjPWEoMjIpLHU9YSgxMjYpLGQ9YSgxMDQpLGg9YSgxNTgpLHA9YSgyMyksbT1hKDMzKSx2PW0uc2V0LGc9bS5nZXR0ZXJGb3IseT1oLmZpbmQsYj1oLmZpbmRJbmRleCxfPTAsdW5jYXVnaHRGcm96ZW5TdG9yZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5mcm96ZW58fCh0LmZyb3plbj1uZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSl9LFVuY2F1Z2h0RnJvemVuU3RvcmU9ZnVuY3Rpb24oKXt0aGlzLmVudHJpZXM9W119LGZpbmRVbmNhdWdodEZyb3plbj1mdW5jdGlvbih0LHIpe3JldHVybiB5KHQuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT1yfSkpfTtVbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKHQpe3ZhciByPWZpbmRVbmNhdWdodEZyb3plbih0aGlzLHQpO2lmKHIpcmV0dXJuIHJbMV19LGhhczpmdW5jdGlvbih0KXtyZXR1cm4hIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLHQpfSxzZXQ6ZnVuY3Rpb24odCxyKXt2YXIgYT1maW5kVW5jYXVnaHRGcm96ZW4odGhpcyx0KTthP2FbMV09cjp0aGlzLmVudHJpZXMucHVzaChbdCxyXSl9LGRlbGV0ZTpmdW5jdGlvbih0KXt2YXIgcj1iKHRoaXMuZW50cmllcywoZnVuY3Rpb24ocil7cmV0dXJuIHJbMF09PT10fSkpO35yJiZ0aGlzLmVudHJpZXMuc3BsaWNlKHIsMSk7cmV0dXJuISF+cn19O3QuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24odCxyLGEsaCl7dmFyIG09dCgoZnVuY3Rpb24odCxvKXt1KHQsbSxyKTt2KHQse3R5cGU6cixpZDpfKyssZnJvemVuOnZvaWQgMH0pO251bGwhPW8mJmQobyx0W2hdLHQsYSl9KSkseT1nKHIpLGRlZmluZT1mdW5jdGlvbih0LHIsYSl7dmFyIG89eSh0KSxjPWkobChyKSwhMCk7ITA9PT1jP3VuY2F1Z2h0RnJvemVuU3RvcmUobykuc2V0KHIsYSk6Y1tvLmlkXT1hO3JldHVybiB0fTtvKG0ucHJvdG90eXBlLHtkZWxldGU6ZnVuY3Rpb24odCl7dmFyIHI9eSh0aGlzKTtpZighYyh0KSlyZXR1cm4hMTt2YXIgYT1pKHQpO3JldHVybiEwPT09YT91bmNhdWdodEZyb3plblN0b3JlKHIpLmRlbGV0ZSh0KTphJiZwKGEsci5pZCkmJmRlbGV0ZSBhW3IuaWRdfSxoYXM6ZnVuY3Rpb24gaGFzKHQpe3ZhciByPXkodGhpcyk7aWYoIWModCkpcmV0dXJuITE7dmFyIGE9aSh0KTtyZXR1cm4hMD09PWE/dW5jYXVnaHRGcm96ZW5TdG9yZShyKS5oYXModCk6YSYmcChhLHIuaWQpfX0pO28obS5wcm90b3R5cGUsYT97Z2V0OmZ1bmN0aW9uIGdldCh0KXt2YXIgcj15KHRoaXMpO2lmKGModCkpe3ZhciBhPWkodCk7cmV0dXJuITA9PT1hP3VuY2F1Z2h0RnJvemVuU3RvcmUocikuZ2V0KHQpOmE/YVtyLmlkXTp2b2lkIDB9fSxzZXQ6ZnVuY3Rpb24gc2V0KHQscil7cmV0dXJuIGRlZmluZSh0aGlzLHQscil9fTp7YWRkOmZ1bmN0aW9uIGFkZCh0KXtyZXR1cm4gZGVmaW5lKHRoaXMsdCwhMCl9fSk7cmV0dXJuIG19fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoNjIpLGk9YSgxOCksbD1hKDgzKSxjPWEoNDcpLHU9YSgxNTkpLGQ9W10ucHVzaCxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24odCl7dmFyIHI9MT09dCxhPTI9PXQsaD0zPT10LHA9ND09dCxtPTY9PXQsdj01PT10fHxtO3JldHVybiBmdW5jdGlvbihnLHksYixfKXtmb3IodmFyIFMsQyxBPWwoZyksUj1pKEEpLGs9byh5LGIsMyksdz1jKFIubGVuZ3RoKSxQPTAseD1ffHx1LFQ9cj94KGcsdyk6YT94KGcsMCk6dm9pZCAwO3c+UDtQKyspaWYodnx8UCBpbiBSKXtDPWsoUz1SW1BdLFAsQSk7aWYodClpZihyKVRbUF09QztlbHNlIGlmKEMpc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIFM7Y2FzZSA2OnJldHVybiBQO2Nhc2UgMjpkLmNhbGwoVCxTKX1lbHNlIGlmKHApcmV0dXJuITF9cmV0dXJuIG0/LTE6aHx8cD9wOlR9fTt0LmV4cG9ydHM9e2ZvckVhY2g6Y3JlYXRlTWV0aG9kKDApLG1hcDpjcmVhdGVNZXRob2QoMSksZmlsdGVyOmNyZWF0ZU1ldGhvZCgyKSxzb21lOmNyZWF0ZU1ldGhvZCgzKSxldmVyeTpjcmVhdGVNZXRob2QoNCksZmluZDpjcmVhdGVNZXRob2QoNSksZmluZEluZGV4OmNyZWF0ZU1ldGhvZCg2KX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDIyKSxpPWEoMTYwKSxsPWEoNTcpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7dmFyIGE7aSh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihhPXQuY29uc3RydWN0b3IpfHxhIT09QXJyYXkmJiFpKGEucHJvdG90eXBlKT9vKGEpJiZudWxsPT09KGE9YVtsXSkmJihhPXZvaWQgMCk6YT12b2lkIDApO3JldHVybiBuZXcodm9pZCAwPT09YT9BcnJheTphKSgwPT09cj8wOnIpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTkpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbiBpc0FycmF5KHQpe3JldHVybiJBcnJheSI9PW8odCl9fSxmdW5jdGlvbih0LHIsYSl7YSgxMTgpO2EoMTYyKTthKDEyMCk7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uV2Vha1NldH0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjthKDE0OCkoIldlYWtTZXQiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19KSxhKDE1NykpfSxmdW5jdGlvbih0LHIsYSl7YSgxNjQpO3ZhciBvPWEoNjEpO3QuZXhwb3J0cz1vKCJTdHJpbmciLCJjb2RlUG9pbnRBdCIpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTApLGk9YSg3OCkuY29kZUF0O28oe3RhcmdldDoiU3RyaW5nIixwcm90bzohMH0se2NvZGVQb2ludEF0OmZ1bmN0aW9uIGNvZGVQb2ludEF0KHQpe3JldHVybiBpKHRoaXMsdCl9fSl9LGZ1bmN0aW9uKHQscixhKXthKDE2Nik7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uU3RyaW5nLmZyb21Db2RlUG9pbnR9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDEwKSxpPWEoNDkpLGw9U3RyaW5nLmZyb21DaGFyQ29kZSxjPVN0cmluZy5mcm9tQ29kZVBvaW50O28oe3RhcmdldDoiU3RyaW5nIixzdGF0OiEwLGZvcmNlZDohIWMmJjEhPWMubGVuZ3RofSx7ZnJvbUNvZGVQb2ludDpmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHQpe2Zvcih2YXIgcixhPVtdLG89YXJndW1lbnRzLmxlbmd0aCxjPTA7bz5jOyl7cj0rYXJndW1lbnRzW2MrK107aWYoaShyLDExMTQxMTEpIT09cil0aHJvdyBSYW5nZUVycm9yKHIrIiBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Iik7YS5wdXNoKHI8NjU1MzY/bChyKTpsKDU1Mjk2Kygoci09NjU1MzYpPj4xMCksciUxMDI0KzU2MzIwKSl9cmV0dXJuIGEuam9pbigiIil9fSl9LGZ1bmN0aW9uKHQscixhKXthKDE2OCk7YSgxMTgpO2EoMTcwKTthKDE3NCk7YSgxNzUpO2EoMTc2KTthKDE3Nyk7YSgxNzgpO2EoMTc5KTthKDE4MCk7YSgxODEpO2EoMTgyKTthKDE4Myk7YSgxODQpO2EoMTg1KTthKDE4Nik7YSgxODcpO2EoMTg4KTthKDE4OSk7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uU3ltYm9sfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTApLGk9YSgxNCksbD1hKDE2MCksYz1hKDIyKSx1PWEoODMpLGQ9YSg0NyksaD1hKDkzKSxwPWEoMTU5KSxtPWEoMTY5KSx2PWEoNTcpLGc9YSgxMzUpLHk9digiaXNDb25jYXRTcHJlYWRhYmxlIiksYj1nPj01MXx8IWkoKGZ1bmN0aW9uKCl7dmFyIHQ9W107dFt5XT0hMTtyZXR1cm4gdC5jb25jYXQoKVswXSE9PXR9KSksXz1tKCJjb25jYXQiKSxpc0NvbmNhdFNwcmVhZGFibGU9ZnVuY3Rpb24odCl7aWYoIWModCkpcmV0dXJuITE7dmFyIHI9dFt5XTtyZXR1cm4gdm9pZCAwIT09cj8hIXI6bCh0KX07byh7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFifHwhX30se2NvbmNhdDpmdW5jdGlvbiBjb25jYXQodCl7dmFyIHIsYSxvLGksbCxjPXUodGhpcyksbT1wKGMsMCksdj0wO2ZvcihyPS0xLG89YXJndW1lbnRzLmxlbmd0aDtyPG87cisrKWlmKGlzQ29uY2F0U3ByZWFkYWJsZShsPS0xPT09cj9jOmFyZ3VtZW50c1tyXSkpe2lmKHYrKGk9ZChsLmxlbmd0aCkpPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgVHlwZUVycm9yKCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQiKTtmb3IoYT0wO2E8aTthKyssdisrKWEgaW4gbCYmaChtLHYsbFthXSl9ZWxzZXtpZih2Pj05MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7aChtLHYrKyxsKX1tLmxlbmd0aD12O3JldHVybiBtfX0pfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxNCksaT1hKDU3KSxsPWEoMTM1KSxjPWkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGw+PTUxfHwhbygoZnVuY3Rpb24oKXt2YXIgcj1bXTsoci5jb25zdHJ1Y3Rvcj17fSlbY109ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fTtyZXR1cm4gMSE9PXJbdF0oQm9vbGVhbikuZm9vfSkpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDEwKSxpPWEoMTEpLGw9YSg0MiksYz1hKDM3KSx1PWEoMTMpLGQ9YSg1OCksaD1hKDU5KSxwPWEoMTQpLG09YSgyMyksdj1hKDE2MCksZz1hKDIyKSx5PWEoMjgpLGI9YSg4MyksXz1hKDE3KSxTPWEoMjEpLEM9YSgxNiksQT1hKDcxKSxSPWEoNzMpLGs9YSg0NCksdz1hKDE3MSksUD1hKDUxKSx4PWEoMTIpLFQ9YSgyNyksRT1hKDE1KSxPPWEoMjYpLEk9YSgyOSksRD1hKDM2KSxMPWEoMzUpLE09YSgzOSksVz1hKDM4KSxqPWEoNTcpLE49YSgxNzIpLEI9YSgxNzMpLHE9YSg4NSksRz1hKDMzKSxVPWEoMTU4KS5mb3JFYWNoLHo9TCgiaGlkZGVuIiksSD1qKCJ0b1ByaW1pdGl2ZSIpLFY9Ry5zZXQsWT1HLmdldHRlckZvcigiU3ltYm9sIiksWD1PYmplY3QucHJvdG90eXBlLFE9aS5TeW1ib2wsSz1sKCJKU09OIiwic3RyaW5naWZ5IiksSj14LmYsJD1ULmYsWj13LmYsZWU9RS5mLHRlPUQoInN5bWJvbHMiKSxyZT1EKCJvcC1zeW1ib2xzIiksbmU9RCgic3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeSIpLGFlPUQoInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnkiKSxvZT1EKCJ3a3MiKSxpZT1pLlFPYmplY3Qsc2U9IWllfHwhaWUucHJvdG90eXBlfHwhaWUucHJvdG90eXBlLmZpbmRDaGlsZCxsZT11JiZwKChmdW5jdGlvbigpe3JldHVybiA3IT1BKCQoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gJCh0aGlzLCJhIix7dmFsdWU6N30pLmF9fSkpLmF9KSk/ZnVuY3Rpb24odCxyLGEpe3ZhciBvPUooWCxyKTtvJiZkZWxldGUgWFtyXTskKHQscixhKTtvJiZ0IT09WCYmJChYLHIsbyl9OiQsd3JhcD1mdW5jdGlvbih0LHIpe3ZhciBhPXRlW3RdPUEoUS5wcm90b3R5cGUpO1YoYSx7dHlwZToiU3ltYm9sIix0YWc6dCxkZXNjcmlwdGlvbjpyfSk7dXx8KGEuZGVzY3JpcHRpb249cik7cmV0dXJuIGF9LGNlPWg/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBRfSx1ZT1mdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LHIsYSl7dD09PVgmJnVlKHJlLHIsYSk7eSh0KTt2YXIgbz1TKHIsITApO3koYSk7aWYobSh0ZSxvKSl7aWYoYS5lbnVtZXJhYmxlKXttKHQseikmJnRbel1bb10mJih0W3pdW29dPSExKTthPUEoYSx7ZW51bWVyYWJsZTpDKDAsITEpfSl9ZWxzZXttKHQseil8fCQodCx6LEMoMSx7fSkpO3Rbel1bb109ITB9cmV0dXJuIGxlKHQsbyxhKX1yZXR1cm4gJCh0LG8sYSl9LGZlPWZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModCxyKXt5KHQpO3ZhciBhPV8ociksbz1SKGEpLmNvbmNhdChtZShhKSk7VShvLChmdW5jdGlvbihyKXt1JiYhZGUuY2FsbChhLHIpfHx1ZSh0LHIsYVtyXSl9KSk7cmV0dXJuIHR9LGRlPWZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKHQpe3ZhciByPVModCwhMCksYT1lZS5jYWxsKHRoaXMscik7cmV0dXJuISh0aGlzPT09WCYmbSh0ZSxyKSYmIW0ocmUscikpJiYoIShhfHwhbSh0aGlzLHIpfHwhbSh0ZSxyKXx8bSh0aGlzLHopJiZ0aGlzW3pdW3JdKXx8YSl9LGhlPWZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpe3ZhciBhPV8odCksbz1TKHIsITApO2lmKGEhPT1YfHwhbSh0ZSxvKXx8bShyZSxvKSl7dmFyIGk9SihhLG8pOyFpfHwhbSh0ZSxvKXx8bShhLHopJiZhW3pdW29dfHwoaS5lbnVtZXJhYmxlPSEwKTtyZXR1cm4gaX19LHBlPWZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXModCl7dmFyIHI9WihfKHQpKSxhPVtdO1UociwoZnVuY3Rpb24odCl7bSh0ZSx0KXx8bShNLHQpfHxhLnB1c2godCl9KSk7cmV0dXJuIGF9LG1lPWZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyh0KXt2YXIgcj10PT09WCxhPVoocj9yZTpfKHQpKSxvPVtdO1UoYSwoZnVuY3Rpb24odCl7IW0odGUsdCl8fHImJiFtKFgsdCl8fG8ucHVzaCh0ZVt0XSl9KSk7cmV0dXJuIG99O2lmKCFkKXtJKChRPWZ1bmN0aW9uIFN5bWJvbCgpe2lmKHRoaXMgaW5zdGFuY2VvZiBRKXRocm93IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP1N0cmluZyhhcmd1bWVudHNbMF0pOnZvaWQgMCxyPVcodCksc2V0dGVyPWZ1bmN0aW9uKHQpe3RoaXM9PT1YJiZzZXR0ZXIuY2FsbChyZSx0KTttKHRoaXMseikmJm0odGhpc1t6XSxyKSYmKHRoaXNbel1bcl09ITEpO2xlKHRoaXMscixDKDEsdCkpfTt1JiZzZSYmbGUoWCxyLHtjb25maWd1cmFibGU6ITAsc2V0OnNldHRlcn0pO3JldHVybiB3cmFwKHIsdCl9KS5wcm90b3R5cGUsInRvU3RyaW5nIiwoZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4gWSh0aGlzKS50YWd9KSk7SShRLCJ3aXRob3V0U2V0dGVyIiwoZnVuY3Rpb24odCl7cmV0dXJuIHdyYXAoVyh0KSx0KX0pKTtFLmY9ZGU7VC5mPXVlO3guZj1oZTtrLmY9dy5mPXBlO1AuZj1tZTtOLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHdyYXAoaih0KSx0KX07aWYodSl7JChRLnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGRlc2NyaXB0aW9uKCl7cmV0dXJuIFkodGhpcykuZGVzY3JpcHRpb259fSk7Y3x8SShYLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsZGUse3Vuc2FmZTohMH0pfX1vKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IWQsc2hhbTohZH0se1N5bWJvbDpRfSk7VShSKG9lKSwoZnVuY3Rpb24odCl7Qih0KX0pKTtvKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IWR9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIHI9U3RyaW5nKHQpO2lmKG0obmUscikpcmV0dXJuIG5lW3JdO3ZhciBhPVEocik7bmVbcl09YTthZVthXT1yO3JldHVybiBhfSxrZXlGb3I6ZnVuY3Rpb24ga2V5Rm9yKHQpe2lmKCFjZSh0KSl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIHN5bWJvbCIpO2lmKG0oYWUsdCkpcmV0dXJuIGFlW3RdfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtzZT0hMH0sdXNlU2ltcGxlOmZ1bmN0aW9uKCl7c2U9ITF9fSk7byh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFkLHNoYW06IXV9LHtjcmVhdGU6ZnVuY3Rpb24gY3JlYXRlKHQscil7cmV0dXJuIHZvaWQgMD09PXI/QSh0KTpmZShBKHQpLHIpfSxkZWZpbmVQcm9wZXJ0eTp1ZSxkZWZpbmVQcm9wZXJ0aWVzOmZlLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpoZX0pO28oe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohZH0se2dldE93blByb3BlcnR5TmFtZXM6cGUsZ2V0T3duUHJvcGVydHlTeW1ib2xzOm1lfSk7byh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOnAoKGZ1bmN0aW9uKCl7UC5mKDEpfSkpfSx7Z2V0T3duUHJvcGVydHlTeW1ib2xzOmZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyh0KXtyZXR1cm4gUC5mKGIodCkpfX0pO2lmKEspe28oe3RhcmdldDoiSlNPTiIsc3RhdDohMCxmb3JjZWQ6IWR8fHAoKGZ1bmN0aW9uKCl7dmFyIHQ9USgpO3JldHVybiJbbnVsbF0iIT1LKFt0XSl8fCJ7fSIhPUsoe2E6dH0pfHwie30iIT1LKE9iamVjdCh0KSl9KSl9LHtzdHJpbmdpZnk6ZnVuY3Rpb24gc3RyaW5naWZ5KHQscixhKXtmb3IodmFyIG8saT1bdF0sbD0xO2FyZ3VtZW50cy5sZW5ndGg+bDspaS5wdXNoKGFyZ3VtZW50c1tsKytdKTtvPXI7aWYoKGcocil8fHZvaWQgMCE9PXQpJiYhY2UodCkpe3Yocil8fChyPWZ1bmN0aW9uKHQscil7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJihyPW8uY2FsbCh0aGlzLHQscikpO2lmKCFjZShyKSlyZXR1cm4gcn0pO2lbMV09cjtyZXR1cm4gSy5hcHBseShudWxsLGkpfX19KX1RLnByb3RvdHlwZVtIXXx8TyhRLnByb3RvdHlwZSxILFEucHJvdG90eXBlLnZhbHVlT2YpO3EoUSwiU3ltYm9sIik7TVt6XT0hMH0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTcpLGk9YSg0NCkuZixsPXt9LnRvU3RyaW5nLGM9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKHQpe3JldHVybiBjJiYiW29iamVjdCBXaW5kb3ddIj09bC5jYWxsKHQpP2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gaSh0KX1jYXRjaCh0KXtyZXR1cm4gYy5zbGljZSgpfX0odCk6aShvKHQpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDU3KTtyLmY9b30sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoNDMpLGk9YSgyMyksbD1hKDE3MiksYz1hKDI3KS5mO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgcj1vLlN5bWJvbHx8KG8uU3ltYm9sPXt9KTtpKHIsdCl8fGMocix0LHt2YWx1ZTpsLmYodCl9KX19LGZ1bmN0aW9uKHQscixhKXthKDE3MykoImFzeW5jSXRlcmF0b3IiKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDEwKSxpPWEoMTMpLGw9YSgxMSksYz1hKDIzKSx1PWEoMjIpLGQ9YSgyNykuZixoPWEoNDApLHA9bC5TeW1ib2w7aWYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIHAmJighKCJkZXNjcmlwdGlvbiJpbiBwLnByb3RvdHlwZSl8fHZvaWQgMCE9PXAoKS5kZXNjcmlwdGlvbikpe3ZhciBtPXt9LHY9ZnVuY3Rpb24gU3ltYm9sKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDwxfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/dm9pZCAwOlN0cmluZyhhcmd1bWVudHNbMF0pLHI9dGhpcyBpbnN0YW5jZW9mIHY/bmV3IHAodCk6dm9pZCAwPT09dD9wKCk6cCh0KTsiIj09PXQmJihtW3JdPSEwKTtyZXR1cm4gcn07aCh2LHApO3ZhciBnPXYucHJvdG90eXBlPXAucHJvdG90eXBlO2cuY29uc3RydWN0b3I9djt2YXIgeT1nLnRvU3RyaW5nLGI9IlN5bWJvbCh0ZXN0KSI9PVN0cmluZyhwKCJ0ZXN0IikpLF89L15TeW1ib2xcKCguKilcKVteKV0rJC87ZChnLCJkZXNjcmlwdGlvbiIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZGVzY3JpcHRpb24oKXt2YXIgdD11KHRoaXMpP3RoaXMudmFsdWVPZigpOnRoaXMscj15LmNhbGwodCk7aWYoYyhtLHQpKXJldHVybiIiO3ZhciBhPWI/ci5zbGljZSg3LC0xKTpyLnJlcGxhY2UoXywiJDEiKTtyZXR1cm4iIj09PWE/dm9pZCAwOmF9fSk7byh7Z2xvYmFsOiEwLGZvcmNlZDohMH0se1N5bWJvbDp2fSl9fSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJoYXNJbnN0YW5jZSIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgibWF0Y2giKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgibWF0Y2hBbGwiKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJzZWFyY2giKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgic3BlY2llcyIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJ0b1ByaW1pdGl2ZSIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJ0b1N0cmluZ1RhZyIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LHIsYSl7YSg4NSkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMSk7YSg4NSkoby5KU09OLCJKU09OIiwhMCl9LGZ1bmN0aW9uKHQscixhKXthKDE5MSk7dmFyIG89YSg2MSk7dC5leHBvcnRzPW8oIlN0cmluZyIsInBhZFN0YXJ0Iil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIG89YSgxMCksaT1hKDE5Mikuc3RhcnQ7byh7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDphKDE5NCl9LHtwYWRTdGFydDpmdW5jdGlvbiBwYWRTdGFydCh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSg0NyksaT1hKDE5MyksbD1hKDIwKSxjPU1hdGguY2VpbCxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHIsYSx1KXt2YXIgZCxoLHA9U3RyaW5nKGwocikpLG09cC5sZW5ndGgsdj12b2lkIDA9PT11PyIgIjpTdHJpbmcodSksZz1vKGEpO2lmKGc8PW18fCIiPT12KXJldHVybiBwO2Q9Zy1tOyhoPWkuY2FsbCh2LGMoZC92Lmxlbmd0aCkpKS5sZW5ndGg+ZCYmKGg9aC5zbGljZSgwLGQpKTtyZXR1cm4gdD9wK2g6aCtwfX07dC5leHBvcnRzPXtzdGFydDpjcmVhdGVNZXRob2QoITEpLGVuZDpjcmVhdGVNZXRob2QoITApfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1hKDQ4KSxpPWEoMjApO3QuZXhwb3J0cz0iIi5yZXBlYXR8fGZ1bmN0aW9uIHJlcGVhdCh0KXt2YXIgcj1TdHJpbmcoaSh0aGlzKSksYT0iIixsPW8odCk7aWYobDwwfHxsPT0xLzApdGhyb3cgUmFuZ2VFcnJvcigiV3JvbmcgbnVtYmVyIG9mIHJlcGV0aXRpb25zIik7Zm9yKDtsPjA7KGw+Pj49MSkmJihyKz1yKSkxJmwmJihhKz1yKTtyZXR1cm4gYX19LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDEyOSk7dC5leHBvcnRzPS9WZXJzaW9uXC8xMFwuXGQrKFwuXGQrKT8oIE1vYmlsZVwvXHcrKT8gU2FmYXJpXC8vLnRlc3Qobyl9LGZ1bmN0aW9uKHQscixhKXthKDE5Nik7dmFyIG89YSg2MSk7dC5leHBvcnRzPW8oIlN0cmluZyIsInBhZEVuZCIpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBvPWEoMTApLGk9YSgxOTIpLmVuZDtvKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOmEoMTk0KX0se3BhZEVuZDpmdW5jdGlvbiBwYWRFbmQodCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxyLGEpe2EoMTk4KTt2YXIgbz1hKDQzKTt0LmV4cG9ydHM9by5PYmplY3QudmFsdWVzfSxmdW5jdGlvbih0LHIsYSl7dmFyIG89YSgxMCksaT1hKDE5OSkudmFsdWVzO28oe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7dmFsdWVzOmZ1bmN0aW9uIHZhbHVlcyh0KXtyZXR1cm4gaSh0KX19KX0sZnVuY3Rpb24odCxyLGEpe3ZhciBvPWEoMTMpLGk9YSg3MyksbD1hKDE3KSxjPWEoMTUpLmYsY3JlYXRlTWV0aG9kPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihyKXtmb3IodmFyIGEsdT1sKHIpLGQ9aSh1KSxoPWQubGVuZ3RoLHA9MCxtPVtdO2g+cDspe2E9ZFtwKytdO28mJiFjLmNhbGwodSxhKXx8bS5wdXNoKHQ/W2EsdVthXV06dVthXSl9cmV0dXJuIG19fTt0LmV4cG9ydHM9e2VudHJpZXM6Y3JlYXRlTWV0aG9kKCEwKSx2YWx1ZXM6Y3JlYXRlTWV0aG9kKCExKX19LGZ1bmN0aW9uKHQscixhKXthKDIwMSk7dmFyIG89YSg0Myk7dC5leHBvcnRzPW8uT2JqZWN0LmVudHJpZXN9LGZ1bmN0aW9uKHQscixhKXt2YXIgbz1hKDEwKSxpPWEoMTk5KS5lbnRyaWVzO28oe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7ZW50cmllczpmdW5jdGlvbiBlbnRyaWVzKHQpe3JldHVybiBpKHQpfX0pfSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dfcGRmanNfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2V4cG9ydHMuZ2V0RG9jdW1lbnQ9Z2V0RG9jdW1lbnQ7ZXhwb3J0cy5zZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeT1zZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeTtleHBvcnRzLmJ1aWxkPWV4cG9ydHMudmVyc2lvbj1leHBvcnRzLlBERlBhZ2VQcm94eT1leHBvcnRzLlBERkRvY3VtZW50UHJveHk9ZXhwb3J0cy5QREZXb3JrZXI9ZXhwb3J0cy5QREZEYXRhUmFuZ2VUcmFuc3BvcnQ9ZXhwb3J0cy5Mb29wYmFja1BvcnQ9dm9pZCAwO3ZhciBfcmVnZW5lcmF0b3I9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dfcGRmanNfcmVxdWlyZV9fKDIpKSxfdXRpbD1fX3dfcGRmanNfcmVxdWlyZV9fKDUpLF9kaXNwbGF5X3V0aWxzPV9fd19wZGZqc19yZXF1aXJlX18oMSksX2ZvbnRfbG9hZGVyPV9fd19wZGZqc19yZXF1aXJlX18oMjAzKSxfbm9kZV91dGlscz1fX3dfcGRmanNfcmVxdWlyZV9fKDIwNCksX2Fubm90YXRpb25fc3RvcmFnZT1fX3dfcGRmanNfcmVxdWlyZV9fKDIwNSksX2FwaV9jb21wYXRpYmlsaXR5PV9fd19wZGZqc19yZXF1aXJlX18oMjA2KSxfY2FudmFzPV9fd19wZGZqc19yZXF1aXJlX18oMjA3KSxfd29ya2VyX29wdGlvbnM9X193X3BkZmpzX3JlcXVpcmVfXygyMDkpLF9pc19ub2RlPV9fd19wZGZqc19yZXF1aXJlX18oNyksX21lc3NhZ2VfaGFuZGxlcj1fX3dfcGRmanNfcmVxdWlyZV9fKDIxMCksX21ldGFkYXRhPV9fd19wZGZqc19yZXF1aXJlX18oMjExKSxfb3B0aW9uYWxfY29udGVudF9jb25maWc9X193X3BkZmpzX3JlcXVpcmVfXygyMTMpLF90cmFuc3BvcnRfc3RyZWFtPV9fd19wZGZqc19yZXF1aXJlX18oMjE0KSxfd2ViZ2w9X193X3BkZmpzX3JlcXVpcmVfXygyMTUpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcCh0LHIsYSxvLGksbCxjKXt0cnl7dmFyIHU9dFtsXShjKSxkPXUudmFsdWV9Y2F0Y2godCl7YSh0KTtyZXR1cm59dS5kb25lP3IoZCk6UHJvbWlzZS5yZXNvbHZlKGQpLnRoZW4obyxpKX1mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLGE9YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXt2YXIgbD10LmFwcGx5KHIsYSk7ZnVuY3Rpb24gX25leHQodCl7YXN5bmNHZW5lcmF0b3JTdGVwKGwsbyxpLF9uZXh0LF90aHJvdywibmV4dCIsdCl9ZnVuY3Rpb24gX3Rocm93KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChsLG8saSxfbmV4dCxfdGhyb3csInRocm93Iix0KX1fbmV4dCh2b2lkIDApfSkpfX1mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkodCl7cmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyh0KXx8X2l0ZXJhYmxlVG9BcnJheSh0KXx8X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQpfHxfbm9uSXRlcmFibGVTcHJlYWQoKX1mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX1mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKXJldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyh0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0KX1mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0LHIpe3ZhciBhO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgU3ltYm9sfHxudWxsPT10W1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkodCl8fChhPV91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSh0KSl8fHImJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe2EmJih0PWEpO3ZhciBvPTAsaT1mdW5jdGlvbiBGKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24gbigpe3JldHVybiBvPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtvKytdfX0sZTpmdW5jdGlvbiBlKHQpe3Rocm93IHR9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBsLGM9ITAsdT0hMTtyZXR1cm57czpmdW5jdGlvbiBzKCl7YT10W1N5bWJvbC5pdGVyYXRvcl0oKX0sbjpmdW5jdGlvbiBuKCl7dmFyIHQ9YS5uZXh0KCk7Yz10LmRvbmU7cmV0dXJuIHR9LGU6ZnVuY3Rpb24gZSh0KXt1PSEwO2w9dH0sZjpmdW5jdGlvbiBmKCl7dHJ5e2N8fG51bGw9PWEucmV0dXJufHxhLnJldHVybigpfWZpbmFsbHl7aWYodSl0aHJvdyBsfX19fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fWZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHQscil7cmV0dXJuIF9hcnJheVdpdGhIb2xlcyh0KXx8X2l0ZXJhYmxlVG9BcnJheUxpbWl0KHQscil8fF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSh0LHIpfHxfbm9uSXRlcmFibGVSZXN0KCl9ZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7cmV0dXJuIk1hcCI9PT1hfHwiU2V0Ij09PWE/QXJyYXkuZnJvbSh0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP19hcnJheUxpa2VUb0FycmF5KHQscik6dm9pZCAwfX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLG89bmV3IEFycmF5KHIpO2E8cjthKyspb1thXT10W2FdO3JldHVybiBvfWZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdCh0LHIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKXt2YXIgYT1bXSxvPSEwLGk9ITEsbD12b2lkIDA7dHJ5e2Zvcih2YXIgYyx1PXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEobz0oYz11Lm5leHQoKSkuZG9uZSk7bz0hMCl7YS5wdXNoKGMudmFsdWUpO2lmKHImJmEubGVuZ3RoPT09cilicmVha319Y2F0Y2godCl7aT0hMDtsPXR9ZmluYWxseXt0cnl7b3x8bnVsbD09dS5yZXR1cm58fHUucmV0dXJuKCl9ZmluYWxseXtpZihpKXRocm93IGx9fXJldHVybiBhfX1mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXModCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH1mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfXZhciBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU9NjU1MzYsUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUPTEwMCxEZWZhdWx0Q2FudmFzRmFjdG9yeT1faXNfbm9kZS5pc05vZGVKUz9fbm9kZV91dGlscy5Ob2RlQ2FudmFzRmFjdG9yeTpfZGlzcGxheV91dGlscy5ET01DYW52YXNGYWN0b3J5LERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeT1faXNfbm9kZS5pc05vZGVKUz9fbm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3Rvcnk6X2Rpc3BsYXlfdXRpbHMuRE9NQ01hcFJlYWRlckZhY3RvcnksY3JlYXRlUERGTmV0d29ya1N0cmVhbTtmdW5jdGlvbiBzZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeSh0KXtjcmVhdGVQREZOZXR3b3JrU3RyZWFtPXR9ZnVuY3Rpb24gZ2V0RG9jdW1lbnQodCl7dmFyIHIsYT1uZXcgUERGRG9jdW1lbnRMb2FkaW5nVGFzaztpZigic3RyaW5nIj09dHlwZW9mIHQpcj17dXJsOnR9O2Vsc2UgaWYoKDAsX3V0aWwuaXNBcnJheUJ1ZmZlcikodCkpcj17ZGF0YTp0fTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQpcj17cmFuZ2U6dH07ZWxzZXtpZigib2JqZWN0IiE9PV90eXBlb2YodCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciBpbiBnZXREb2N1bWVudCwgbmVlZCBlaXRoZXIgVWludDhBcnJheSwgc3RyaW5nIG9yIGEgcGFyYW1ldGVyIG9iamVjdCIpO2lmKCF0LnVybCYmIXQuZGF0YSYmIXQucmFuZ2UpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciBvYmplY3Q6IG5lZWQgZWl0aGVyIC5kYXRhLCAucmFuZ2Ugb3IgLnVybCIpO3I9dH12YXIgbz1PYmplY3QuY3JlYXRlKG51bGwpLGk9bnVsbCxsPW51bGw7Zm9yKHZhciBjIGluIHIpaWYoInVybCIhPT1jfHwidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdylpZigicmFuZ2UiIT09YylpZigid29ya2VyIiE9PWMpaWYoImRhdGEiIT09Y3x8cltjXWluc3RhbmNlb2YgVWludDhBcnJheSlvW2NdPXJbY107ZWxzZXt2YXIgdT1yW2NdO2lmKCJzdHJpbmciPT10eXBlb2YgdSlvW2NdPSgwLF91dGlsLnN0cmluZ1RvQnl0ZXMpKHUpO2Vsc2UgaWYoIm9iamVjdCIhPT1fdHlwZW9mKHUpfHxudWxsPT09dXx8aXNOYU4odS5sZW5ndGgpKXtpZighKDAsX3V0aWwuaXNBcnJheUJ1ZmZlcikodSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFBERiBiaW5hcnkgZGF0YTogZWl0aGVyIHR5cGVkIGFycmF5LCBzdHJpbmcgb3IgYXJyYXktbGlrZSBvYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIGRhdGEgcHJvcGVydHkuIik7b1tjXT1uZXcgVWludDhBcnJheSh1KX1lbHNlIG9bY109bmV3IFVpbnQ4QXJyYXkodSl9ZWxzZSBsPXJbY107ZWxzZSBpPXJbY107ZWxzZSBvW2NdPW5ldyBVUkwocltjXSx3aW5kb3cubG9jYXRpb24pLmhyZWY7by5yYW5nZUNodW5rU2l6ZT1vLnJhbmdlQ2h1bmtTaXplfHxERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU7by5DTWFwUmVhZGVyRmFjdG9yeT1vLkNNYXBSZWFkZXJGYWN0b3J5fHxEZWZhdWx0Q01hcFJlYWRlckZhY3Rvcnk7by5pZ25vcmVFcnJvcnM9ITAhPT1vLnN0b3BBdEVycm9ycztvLmZvbnRFeHRyYVByb3BlcnRpZXM9ITA9PT1vLmZvbnRFeHRyYVByb3BlcnRpZXM7by5wZGZCdWc9ITA9PT1vLnBkZkJ1ZztOdW1iZXIuaXNJbnRlZ2VyKG8ubWF4SW1hZ2VTaXplKXx8KG8ubWF4SW1hZ2VTaXplPS0xKTsiYm9vbGVhbiIhPXR5cGVvZiBvLmlzRXZhbFN1cHBvcnRlZCYmKG8uaXNFdmFsU3VwcG9ydGVkPSEwKTsiYm9vbGVhbiIhPXR5cGVvZiBvLmRpc2FibGVGb250RmFjZSYmKG8uZGlzYWJsZUZvbnRGYWNlPV9hcGlfY29tcGF0aWJpbGl0eS5hcGlDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVGb250RmFjZXx8ITEpO3ZvaWQgMD09PW8ub3duZXJEb2N1bWVudCYmKG8ub3duZXJEb2N1bWVudD1nbG9iYWxUaGlzLmRvY3VtZW50KTsiYm9vbGVhbiIhPXR5cGVvZiBvLmRpc2FibGVSYW5nZSYmKG8uZGlzYWJsZVJhbmdlPSExKTsiYm9vbGVhbiIhPXR5cGVvZiBvLmRpc2FibGVTdHJlYW0mJihvLmRpc2FibGVTdHJlYW09ITEpOyJib29sZWFuIiE9dHlwZW9mIG8uZGlzYWJsZUF1dG9GZXRjaCYmKG8uZGlzYWJsZUF1dG9GZXRjaD0hMSk7KDAsX3V0aWwuc2V0VmVyYm9zaXR5TGV2ZWwpKG8udmVyYm9zaXR5KTtpZighbCl7dmFyIGQ9e3ZlcmJvc2l0eTpvLnZlcmJvc2l0eSxwb3J0Ol93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnR9O2w9ZC5wb3J0P1BERldvcmtlci5mcm9tUG9ydChkKTpuZXcgUERGV29ya2VyKGQpO2EuX3dvcmtlcj1sfXZhciBoPWEuZG9jSWQ7bC5wcm9taXNlLnRoZW4oKGZ1bmN0aW9uKCl7aWYoYS5kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJMb2FkaW5nIGFib3J0ZWQiKTt2YXIgdD1fZmV0Y2hEb2N1bWVudChsLG8saSxoKSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbih0KXt2YXIgcjtpP3I9bmV3IF90cmFuc3BvcnRfc3RyZWFtLlBERkRhdGFUcmFuc3BvcnRTdHJlYW0oe2xlbmd0aDpvLmxlbmd0aCxpbml0aWFsRGF0YTpvLmluaXRpYWxEYXRhLHByb2dyZXNzaXZlRG9uZTpvLnByb2dyZXNzaXZlRG9uZSxkaXNhYmxlUmFuZ2U6by5kaXNhYmxlUmFuZ2UsZGlzYWJsZVN0cmVhbTpvLmRpc2FibGVTdHJlYW19LGkpOm8uZGF0YXx8KHI9Y3JlYXRlUERGTmV0d29ya1N0cmVhbSh7dXJsOm8udXJsLGxlbmd0aDpvLmxlbmd0aCxodHRwSGVhZGVyczpvLmh0dHBIZWFkZXJzLHdpdGhDcmVkZW50aWFsczpvLndpdGhDcmVkZW50aWFscyxyYW5nZUNodW5rU2l6ZTpvLnJhbmdlQ2h1bmtTaXplLGRpc2FibGVSYW5nZTpvLmRpc2FibGVSYW5nZSxkaXNhYmxlU3RyZWFtOm8uZGlzYWJsZVN0cmVhbX0pKTt0KHIpfSkpO3JldHVybiBQcm9taXNlLmFsbChbdCxyXSkudGhlbigoZnVuY3Rpb24odCl7dmFyIHI9X3NsaWNlZFRvQXJyYXkodCwyKSxpPXJbMF0sYz1yWzFdO2lmKGEuZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiTG9hZGluZyBhYm9ydGVkIik7dmFyIHU9bmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoaCxpLGwucG9ydCk7dS5wb3N0TWVzc2FnZVRyYW5zZmVycz1sLnBvc3RNZXNzYWdlVHJhbnNmZXJzO3ZhciBkPW5ldyBXb3JrZXJUcmFuc3BvcnQodSxhLGMsbyk7YS5fdHJhbnNwb3J0PWQ7dS5zZW5kKCJSZWFkeSIsbnVsbCl9KSl9KSkuY2F0Y2goYS5fY2FwYWJpbGl0eS5yZWplY3QpO3JldHVybiBhfWZ1bmN0aW9uIF9mZXRjaERvY3VtZW50KHQscixhLG8pe2lmKHQuZGVzdHJveWVkKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpO2lmKGEpe3IubGVuZ3RoPWEubGVuZ3RoO3IuaW5pdGlhbERhdGE9YS5pbml0aWFsRGF0YTtyLnByb2dyZXNzaXZlRG9uZT1hLnByb2dyZXNzaXZlRG9uZX1yZXR1cm4gdC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERvY1JlcXVlc3QiLHtkb2NJZDpvLGFwaVZlcnNpb246IjIuNi4zNDciLHNvdXJjZTp7ZGF0YTpyLmRhdGEsdXJsOnIudXJsLHBhc3N3b3JkOnIucGFzc3dvcmQsZGlzYWJsZUF1dG9GZXRjaDpyLmRpc2FibGVBdXRvRmV0Y2gscmFuZ2VDaHVua1NpemU6ci5yYW5nZUNodW5rU2l6ZSxsZW5ndGg6ci5sZW5ndGh9LG1heEltYWdlU2l6ZTpyLm1heEltYWdlU2l6ZSxkaXNhYmxlRm9udEZhY2U6ci5kaXNhYmxlRm9udEZhY2UscG9zdE1lc3NhZ2VUcmFuc2ZlcnM6dC5wb3N0TWVzc2FnZVRyYW5zZmVycyxkb2NCYXNlVXJsOnIuZG9jQmFzZVVybCxpZ25vcmVFcnJvcnM6ci5pZ25vcmVFcnJvcnMsaXNFdmFsU3VwcG9ydGVkOnIuaXNFdmFsU3VwcG9ydGVkLGZvbnRFeHRyYVByb3BlcnRpZXM6ci5mb250RXh0cmFQcm9wZXJ0aWVzfSkudGhlbigoZnVuY3Rpb24ocil7aWYodC5kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpO3JldHVybiByfSkpfXZhciBQREZEb2N1bWVudExvYWRpbmdUYXNrPWZ1bmN0aW9uIFBERkRvY3VtZW50TG9hZGluZ1Rhc2tDbG9zdXJlKCl7dmFyIHQ9MDtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZEb2N1bWVudExvYWRpbmdUYXNrKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUERGRG9jdW1lbnRMb2FkaW5nVGFzayk7dGhpcy5fY2FwYWJpbGl0eT0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl90cmFuc3BvcnQ9bnVsbDt0aGlzLl93b3JrZXI9bnVsbDt0aGlzLmRvY0lkPSJkIit0Kys7dGhpcy5kZXN0cm95ZWQ9ITE7dGhpcy5vblBhc3N3b3JkPW51bGw7dGhpcy5vblByb2dyZXNzPW51bGw7dGhpcy5vblVuc3VwcG9ydGVkRmVhdHVyZT1udWxsfV9jcmVhdGVDbGFzcyhQREZEb2N1bWVudExvYWRpbmdUYXNrLFt7a2V5OiJkZXN0cm95Iix2YWx1ZTpmdW5jdGlvbiBkZXN0cm95KCl7dmFyIHQ9dGhpczt0aGlzLmRlc3Ryb3llZD0hMDtyZXR1cm4odGhpcy5fdHJhbnNwb3J0P3RoaXMuX3RyYW5zcG9ydC5kZXN0cm95KCk6UHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oKGZ1bmN0aW9uKCl7dC5fdHJhbnNwb3J0PW51bGw7aWYodC5fd29ya2VyKXt0Ll93b3JrZXIuZGVzdHJveSgpO3QuX3dvcmtlcj1udWxsfX0pKX19LHtrZXk6InByb21pc2UiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlfX1dKTtyZXR1cm4gUERGRG9jdW1lbnRMb2FkaW5nVGFza30oKX0oKSxQREZEYXRhUmFuZ2VUcmFuc3BvcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQodCxyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO19jbGFzc0NhbGxDaGVjayh0aGlzLFBERkRhdGFSYW5nZVRyYW5zcG9ydCk7dGhpcy5sZW5ndGg9dDt0aGlzLmluaXRpYWxEYXRhPXI7dGhpcy5wcm9ncmVzc2l2ZURvbmU9YTt0aGlzLl9yYW5nZUxpc3RlbmVycz1bXTt0aGlzLl9wcm9ncmVzc0xpc3RlbmVycz1bXTt0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnM9W107dGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzPVtdO3RoaXMuX3JlYWR5Q2FwYWJpbGl0eT0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKX1fY3JlYXRlQ2xhc3MoUERGRGF0YVJhbmdlVHJhbnNwb3J0LFt7a2V5OiJhZGRSYW5nZUxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbiBhZGRSYW5nZUxpc3RlbmVyKHQpe3RoaXMuX3JhbmdlTGlzdGVuZXJzLnB1c2godCl9fSx7a2V5OiJhZGRQcm9ncmVzc0xpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbiBhZGRQcm9ncmVzc0xpc3RlbmVyKHQpe3RoaXMuX3Byb2dyZXNzTGlzdGVuZXJzLnB1c2godCl9fSx7a2V5OiJhZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24gYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIodCl7dGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzLnB1c2godCl9fSx7a2V5OiJhZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24gYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIodCl7dGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzLnB1c2godCl9fSx7a2V5OiJvbkRhdGFSYW5nZSIsdmFsdWU6ZnVuY3Rpb24gb25EYXRhUmFuZ2UodCxyKXt2YXIgYSxvPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX3JhbmdlTGlzdGVuZXJzKTt0cnl7Zm9yKG8ucygpOyEoYT1vLm4oKSkuZG9uZTspeygwLGEudmFsdWUpKHQscil9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX19LHtrZXk6Im9uRGF0YVByb2dyZXNzIix2YWx1ZTpmdW5jdGlvbiBvbkRhdGFQcm9ncmVzcyh0LHIpe3ZhciBhPXRoaXM7dGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoZnVuY3Rpb24oKXt2YXIgbyxpPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGEuX3Byb2dyZXNzTGlzdGVuZXJzKTt0cnl7Zm9yKGkucygpOyEobz1pLm4oKSkuZG9uZTspeygwLG8udmFsdWUpKHQscil9fWNhdGNoKHQpe2kuZSh0KX1maW5hbGx5e2kuZigpfX0pKX19LHtrZXk6Im9uRGF0YVByb2dyZXNzaXZlUmVhZCIsdmFsdWU6ZnVuY3Rpb24gb25EYXRhUHJvZ3Jlc3NpdmVSZWFkKHQpe3ZhciByPXRoaXM7dGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoZnVuY3Rpb24oKXt2YXIgYSxvPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHIuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycyk7dHJ5e2ZvcihvLnMoKTshKGE9by5uKCkpLmRvbmU7KXsoMCxhLnZhbHVlKSh0KX19Y2F0Y2godCl7by5lKHQpfWZpbmFsbHl7by5mKCl9fSkpfX0se2tleToib25EYXRhUHJvZ3Jlc3NpdmVEb25lIix2YWx1ZTpmdW5jdGlvbiBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKXt2YXIgdD10aGlzO3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKGZ1bmN0aW9uKCl7dmFyIHIsYT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0Ll9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMpO3RyeXtmb3IoYS5zKCk7IShyPWEubigpKS5kb25lOyl7KDAsci52YWx1ZSkoKX19Y2F0Y2godCl7YS5lKHQpfWZpbmFsbHl7YS5mKCl9fSkpfX0se2tleToidHJhbnNwb3J0UmVhZHkiLHZhbHVlOmZ1bmN0aW9uIHRyYW5zcG9ydFJlYWR5KCl7dGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKX19LHtrZXk6InJlcXVlc3REYXRhUmFuZ2UiLHZhbHVlOmZ1bmN0aW9uIHJlcXVlc3REYXRhUmFuZ2UodCxyKXsoMCxfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBQREZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZSIpfX0se2tleToiYWJvcnQiLHZhbHVlOmZ1bmN0aW9uIGFib3J0KCl7fX1dKTtyZXR1cm4gUERGRGF0YVJhbmdlVHJhbnNwb3J0fSgpO2V4cG9ydHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0PVBERkRhdGFSYW5nZVRyYW5zcG9ydDt2YXIgUERGRG9jdW1lbnRQcm94eT1mdW5jdGlvbigpe2Z1bmN0aW9uIFBERkRvY3VtZW50UHJveHkodCxyKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZEb2N1bWVudFByb3h5KTt0aGlzLl9wZGZJbmZvPXQ7dGhpcy5fdHJhbnNwb3J0PXJ9X2NyZWF0ZUNsYXNzKFBERkRvY3VtZW50UHJveHksW3trZXk6ImdldFBhZ2UiLHZhbHVlOmZ1bmN0aW9uIGdldFBhZ2UodCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlKHQpfX0se2tleToiZ2V0UGFnZUluZGV4Iix2YWx1ZTpmdW5jdGlvbiBnZXRQYWdlSW5kZXgodCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSW5kZXgodCl9fSx7a2V5OiJnZXREZXN0aW5hdGlvbnMiLHZhbHVlOmZ1bmN0aW9uIGdldERlc3RpbmF0aW9ucygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCl9fSx7a2V5OiJnZXREZXN0aW5hdGlvbiIsdmFsdWU6ZnVuY3Rpb24gZ2V0RGVzdGluYXRpb24odCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbih0KX19LHtrZXk6ImdldFBhZ2VMYWJlbHMiLHZhbHVlOmZ1bmN0aW9uIGdldFBhZ2VMYWJlbHMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKX19LHtrZXk6ImdldFBhZ2VMYXlvdXQiLHZhbHVlOmZ1bmN0aW9uIGdldFBhZ2VMYXlvdXQoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYXlvdXQoKX19LHtrZXk6ImdldFBhZ2VNb2RlIix2YWx1ZTpmdW5jdGlvbiBnZXRQYWdlTW9kZSgpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZU1vZGUoKX19LHtrZXk6ImdldFZpZXdlclByZWZlcmVuY2VzIix2YWx1ZTpmdW5jdGlvbiBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKX19LHtrZXk6ImdldE9wZW5BY3Rpb24iLHZhbHVlOmZ1bmN0aW9uIGdldE9wZW5BY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wZW5BY3Rpb24oKX19LHtrZXk6ImdldEF0dGFjaG1lbnRzIix2YWx1ZTpmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QXR0YWNobWVudHMoKX19LHtrZXk6ImdldEphdmFTY3JpcHQiLHZhbHVlOmZ1bmN0aW9uIGdldEphdmFTY3JpcHQoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEphdmFTY3JpcHQoKX19LHtrZXk6ImdldE91dGxpbmUiLHZhbHVlOmZ1bmN0aW9uIGdldE91dGxpbmUoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE91dGxpbmUoKX19LHtrZXk6ImdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsdmFsdWU6ZnVuY3Rpb24gZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKX19LHtrZXk6ImdldFBlcm1pc3Npb25zIix2YWx1ZTpmdW5jdGlvbiBnZXRQZXJtaXNzaW9ucygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKX19LHtrZXk6ImdldE1ldGFkYXRhIix2YWx1ZTpmdW5jdGlvbiBnZXRNZXRhZGF0YSgpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0TWV0YWRhdGEoKX19LHtrZXk6ImdldERhdGEiLHZhbHVlOmZ1bmN0aW9uIGdldERhdGEoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERhdGEoKX19LHtrZXk6ImdldERvd25sb2FkSW5mbyIsdmFsdWU6ZnVuY3Rpb24gZ2V0RG93bmxvYWRJbmZvKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnByb21pc2V9fSx7a2V5OiJnZXRTdGF0cyIsdmFsdWU6ZnVuY3Rpb24gZ2V0U3RhdHMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFN0YXRzKCl9fSx7a2V5OiJjbGVhbnVwIix2YWx1ZTpmdW5jdGlvbiBjbGVhbnVwKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAoKX19LHtrZXk6ImRlc3Ryb3kiLHZhbHVlOmZ1bmN0aW9uIGRlc3Ryb3koKXtyZXR1cm4gdGhpcy5sb2FkaW5nVGFzay5kZXN0cm95KCl9fSx7a2V5OiJzYXZlRG9jdW1lbnQiLHZhbHVlOmZ1bmN0aW9uIHNhdmVEb2N1bWVudCh0KXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnNhdmVEb2N1bWVudCh0KX19LHtrZXk6ImFubm90YXRpb25TdG9yYWdlIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsX3V0aWwuc2hhZG93KSh0aGlzLCJhbm5vdGF0aW9uU3RvcmFnZSIsbmV3IF9hbm5vdGF0aW9uX3N0b3JhZ2UuQW5ub3RhdGlvblN0b3JhZ2UpfX0se2tleToibnVtUGFnZXMiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fcGRmSW5mby5udW1QYWdlc319LHtrZXk6ImZpbmdlcnByaW50IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3BkZkluZm8uZmluZ2VycHJpbnR9fSx7a2V5OiJsb2FkaW5nUGFyYW1zIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zfX0se2tleToibG9hZGluZ1Rhc2siLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdUYXNrfX1dKTtyZXR1cm4gUERGRG9jdW1lbnRQcm94eX0oKTtleHBvcnRzLlBERkRvY3VtZW50UHJveHk9UERGRG9jdW1lbnRQcm94eTt2YXIgUERGUGFnZVByb3h5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGUGFnZVByb3h5KHQscixhLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdJiZhcmd1bWVudHNbNF07X2NsYXNzQ2FsbENoZWNrKHRoaXMsUERGUGFnZVByb3h5KTt0aGlzLl9wYWdlSW5kZXg9dDt0aGlzLl9wYWdlSW5mbz1yO3RoaXMuX293bmVyRG9jdW1lbnQ9bzt0aGlzLl90cmFuc3BvcnQ9YTt0aGlzLl9zdGF0cz1pP25ldyBfZGlzcGxheV91dGlscy5TdGF0VGltZXI6bnVsbDt0aGlzLl9wZGZCdWc9aTt0aGlzLmNvbW1vbk9ianM9YS5jb21tb25PYmpzO3RoaXMub2Jqcz1uZXcgUERGT2JqZWN0czt0aGlzLmNsZWFudXBBZnRlclJlbmRlcj0hMTt0aGlzLnBlbmRpbmdDbGVhbnVwPSExO3RoaXMuX2ludGVudFN0YXRlcz1uZXcgTWFwO3RoaXMuZGVzdHJveWVkPSExfV9jcmVhdGVDbGFzcyhQREZQYWdlUHJveHksW3trZXk6ImdldFZpZXdwb3J0Iix2YWx1ZTpmdW5jdGlvbiBnZXRWaWV3cG9ydCgpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxyPXQuc2NhbGUsYT10LnJvdGF0aW9uLG89dm9pZCAwPT09YT90aGlzLnJvdGF0ZTphLGk9dC5vZmZzZXRYLGw9dm9pZCAwPT09aT8wOmksYz10Lm9mZnNldFksdT12b2lkIDA9PT1jPzA6YyxkPXQuZG9udEZsaXAsaD12b2lkIDAhPT1kJiZkO3JldHVybiBuZXcgX2Rpc3BsYXlfdXRpbHMuUGFnZVZpZXdwb3J0KHt2aWV3Qm94OnRoaXMudmlldyxzY2FsZTpyLHJvdGF0aW9uOm8sb2Zmc2V0WDpsLG9mZnNldFk6dSxkb250RmxpcDpofSl9fSx7a2V5OiJnZXRBbm5vdGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24gZ2V0QW5ub3RhdGlvbnMoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj10LmludGVudCxhPXZvaWQgMD09PXI/bnVsbDpyO2lmKCF0aGlzLmFubm90YXRpb25zUHJvbWlzZXx8dGhpcy5hbm5vdGF0aW9uc0ludGVudCE9PWEpe3RoaXMuYW5ub3RhdGlvbnNQcm9taXNlPXRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyh0aGlzLl9wYWdlSW5kZXgsYSk7dGhpcy5hbm5vdGF0aW9uc0ludGVudD1hfXJldHVybiB0aGlzLmFubm90YXRpb25zUHJvbWlzZX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKHQpe3ZhciByPXRoaXMsYT10LmNhbnZhc0NvbnRleHQsbz10LnZpZXdwb3J0LGk9dC5pbnRlbnQsbD12b2lkIDA9PT1pPyJkaXNwbGF5IjppLGM9dC5lbmFibGVXZWJHTCx1PXZvaWQgMCE9PWMmJmMsZD10LnJlbmRlckludGVyYWN0aXZlRm9ybXMsaD12b2lkIDAhPT1kJiZkLHA9dC50cmFuc2Zvcm0sbT12b2lkIDA9PT1wP251bGw6cCx2PXQuaW1hZ2VMYXllcixnPXZvaWQgMD09PXY/bnVsbDp2LHk9dC5jYW52YXNGYWN0b3J5LGI9dm9pZCAwPT09eT9udWxsOnksXz10LmJhY2tncm91bmQsUz12b2lkIDA9PT1fP251bGw6XyxDPXQuYW5ub3RhdGlvblN0b3JhZ2UsQT12b2lkIDA9PT1DP251bGw6QyxSPXQub3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSxrPXZvaWQgMD09PVI/bnVsbDpSO3RoaXMuX3N0YXRzJiZ0aGlzLl9zdGF0cy50aW1lKCJPdmVyYWxsIik7dmFyIHc9InByaW50Ij09PWw/InByaW50IjoiZGlzcGxheSI7dGhpcy5wZW5kaW5nQ2xlYW51cD0hMTtrfHwoaz10aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCkpO3ZhciBQPXRoaXMuX2ludGVudFN0YXRlcy5nZXQodyk7aWYoIVApe1A9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KHcsUCl9aWYoUC5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KXtjbGVhclRpbWVvdXQoUC5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtQLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQ9bnVsbH12YXIgeD1ifHxuZXcgRGVmYXVsdENhbnZhc0ZhY3Rvcnkoe293bmVyRG9jdW1lbnQ6dGhpcy5fb3duZXJEb2N1bWVudH0pLFQ9bmV3IF93ZWJnbC5XZWJHTENvbnRleHQoe2VuYWJsZTp1fSk7aWYoIVAuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSl7UC5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5PSgwLF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO1Aub3BlcmF0b3JMaXN0PXtmbkFycmF5OltdLGFyZ3NBcnJheTpbXSxsYXN0Q2h1bms6ITF9O3RoaXMuX3N0YXRzJiZ0aGlzLl9zdGF0cy50aW1lKCJQYWdlIFJlcXVlc3QiKTt0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KHtwYWdlSW5kZXg6dGhpcy5fcGFnZUluZGV4LGludGVudDp3LHJlbmRlckludGVyYWN0aXZlRm9ybXM6ITA9PT1oLGFubm90YXRpb25TdG9yYWdlOkEmJkEuZ2V0QWxsKCl8fG51bGx9KX12YXIgRT1mdW5jdGlvbiBjb21wbGV0ZSh0KXt2YXIgYT1QLnJlbmRlclRhc2tzLmluZGV4T2YoTyk7YT49MCYmUC5yZW5kZXJUYXNrcy5zcGxpY2UoYSwxKTsoci5jbGVhbnVwQWZ0ZXJSZW5kZXJ8fCJwcmludCI9PT13KSYmKHIucGVuZGluZ0NsZWFudXA9ITApO3IuX3RyeUNsZWFudXAoKTtpZih0KXtPLmNhcGFiaWxpdHkucmVqZWN0KHQpO3IuX2Fib3J0T3BlcmF0b3JMaXN0KHtpbnRlbnRTdGF0ZTpQLHJlYXNvbjp0fSl9ZWxzZSBPLmNhcGFiaWxpdHkucmVzb2x2ZSgpO2lmKHIuX3N0YXRzKXtyLl9zdGF0cy50aW1lRW5kKCJSZW5kZXJpbmciKTtyLl9zdGF0cy50aW1lRW5kKCJPdmVyYWxsIil9fSxPPW5ldyBJbnRlcm5hbFJlbmRlclRhc2soe2NhbGxiYWNrOkUscGFyYW1zOntjYW52YXNDb250ZXh0OmEsdmlld3BvcnQ6byx0cmFuc2Zvcm06bSxpbWFnZUxheWVyOmcsYmFja2dyb3VuZDpTfSxvYmpzOnRoaXMub2Jqcyxjb21tb25PYmpzOnRoaXMuY29tbW9uT2JqcyxvcGVyYXRvckxpc3Q6UC5vcGVyYXRvckxpc3QscGFnZUluZGV4OnRoaXMuX3BhZ2VJbmRleCxjYW52YXNGYWN0b3J5Ongsd2ViR0xDb250ZXh0OlQsdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiJwcmludCIhPT13LHBkZkJ1Zzp0aGlzLl9wZGZCdWd9KTtQLnJlbmRlclRhc2tzfHwoUC5yZW5kZXJUYXNrcz1bXSk7UC5yZW5kZXJUYXNrcy5wdXNoKE8pO3ZhciBJPU8udGFzaztQcm9taXNlLmFsbChbUC5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2Usa10pLnRoZW4oKGZ1bmN0aW9uKHQpe3ZhciBhPV9zbGljZWRUb0FycmF5KHQsMiksbz1hWzBdLGk9YVsxXTtpZihyLnBlbmRpbmdDbGVhbnVwKUUoKTtlbHNle3IuX3N0YXRzJiZyLl9zdGF0cy50aW1lKCJSZW5kZXJpbmciKTtPLmluaXRpYWxpemVHcmFwaGljcyh7dHJhbnNwYXJlbmN5Om8sb3B0aW9uYWxDb250ZW50Q29uZmlnOml9KTtPLm9wZXJhdG9yTGlzdENoYW5nZWQoKX19KSkuY2F0Y2goRSk7cmV0dXJuIEl9fSx7a2V5OiJnZXRPcGVyYXRvckxpc3QiLHZhbHVlOmZ1bmN0aW9uIGdldE9wZXJhdG9yTGlzdCgpe3ZhciB0LHI9dGhpcy5faW50ZW50U3RhdGVzLmdldCgib3BsaXN0Iik7aWYoIXIpe3I9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KCJvcGxpc3QiLHIpfWlmKCFyLm9wTGlzdFJlYWRDYXBhYmlsaXR5KXsodD1PYmplY3QuY3JlYXRlKG51bGwpKS5vcGVyYXRvckxpc3RDaGFuZ2VkPWZ1bmN0aW9uIG9wZXJhdG9yTGlzdENoYW5nZWQoKXtpZihyLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspe3Iub3BMaXN0UmVhZENhcGFiaWxpdHkucmVzb2x2ZShyLm9wZXJhdG9yTGlzdCk7dmFyIGE9ci5yZW5kZXJUYXNrcy5pbmRleE9mKHQpO2E+PTAmJnIucmVuZGVyVGFza3Muc3BsaWNlKGEsMSl9fTtyLm9wTGlzdFJlYWRDYXBhYmlsaXR5PSgwLF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3IucmVuZGVyVGFza3M9W107ci5yZW5kZXJUYXNrcy5wdXNoKHQpO3Iub3BlcmF0b3JMaXN0PXtmbkFycmF5OltdLGFyZ3NBcnJheTpbXSxsYXN0Q2h1bms6ITF9O3RoaXMuX3N0YXRzJiZ0aGlzLl9zdGF0cy50aW1lKCJQYWdlIFJlcXVlc3QiKTt0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KHtwYWdlSW5kZXg6dGhpcy5fcGFnZUluZGV4LGludGVudDoib3BsaXN0In0pfXJldHVybiByLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnByb21pc2V9fSx7a2V5OiJzdHJlYW1UZXh0Q29udGVudCIsdmFsdWU6ZnVuY3Rpb24gc3RyZWFtVGV4dENvbnRlbnQoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj10Lm5vcm1hbGl6ZVdoaXRlc3BhY2UsYT12b2lkIDAhPT1yJiZyLG89dC5kaXNhYmxlQ29tYmluZVRleHRJdGVtcyxpPXZvaWQgMCE9PW8mJm8sbD0xMDA7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0VGV4dENvbnRlbnQiLHtwYWdlSW5kZXg6dGhpcy5fcGFnZUluZGV4LG5vcm1hbGl6ZVdoaXRlc3BhY2U6ITA9PT1hLGNvbWJpbmVUZXh0SXRlbXM6ITAhPT1pfSx7aGlnaFdhdGVyTWFyazpsLHNpemU6ZnVuY3Rpb24gc2l6ZSh0KXtyZXR1cm4gdC5pdGVtcy5sZW5ndGh9fSl9fSx7a2V5OiJnZXRUZXh0Q29udGVudCIsdmFsdWU6ZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnQoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj10aGlzLnN0cmVhbVRleHRDb250ZW50KHQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxhKXt2YXIgbz1yLmdldFJlYWRlcigpLGk9e2l0ZW1zOltdLHN0eWxlczpPYmplY3QuY3JlYXRlKG51bGwpfTshZnVuY3Rpb24gcHVtcCgpe28ucmVhZCgpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBhLG89ci52YWx1ZTtpZihyLmRvbmUpdChpKTtlbHNle09iamVjdC5hc3NpZ24oaS5zdHlsZXMsby5zdHlsZXMpOyhhPWkuaXRlbXMpLnB1c2guYXBwbHkoYSxfdG9Db25zdW1hYmxlQXJyYXkoby5pdGVtcykpO3B1bXAoKX19KSxhKX0oKX0pKX19LHtrZXk6Il9kZXN0cm95Iix2YWx1ZTpmdW5jdGlvbiBfZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwO3RoaXMuX3RyYW5zcG9ydC5wYWdlQ2FjaGVbdGhpcy5fcGFnZUluZGV4XT1udWxsO3ZhciB0LHI9W10sYT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLl9pbnRlbnRTdGF0ZXMpO3RyeXtmb3IoYS5zKCk7ISh0PWEubigpKS5kb25lOyl7dmFyIG89X3NsaWNlZFRvQXJyYXkodC52YWx1ZSwyKSxpPW9bMF0sbD1vWzFdO3RoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtpbnRlbnRTdGF0ZTpsLHJlYXNvbjpuZXcgRXJyb3IoIlBhZ2Ugd2FzIGRlc3Ryb3llZC4iKSxmb3JjZTohMH0pO2lmKCJvcGxpc3QiIT09aSl7dmFyIGMsdT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihsLnJlbmRlclRhc2tzKTt0cnl7Zm9yKHUucygpOyEoYz11Lm4oKSkuZG9uZTspe3ZhciBkPWMudmFsdWU7ci5wdXNoKGQuY29tcGxldGVkKTtkLmNhbmNlbCgpfX1jYXRjaCh0KXt1LmUodCl9ZmluYWxseXt1LmYoKX19fX1jYXRjaCh0KXthLmUodCl9ZmluYWxseXthLmYoKX10aGlzLm9ianMuY2xlYXIoKTt0aGlzLmFubm90YXRpb25zUHJvbWlzZT1udWxsO3RoaXMucGVuZGluZ0NsZWFudXA9ITE7cmV0dXJuIFByb21pc2UuYWxsKHIpfX0se2tleToiY2xlYW51cCIsdmFsdWU6ZnVuY3Rpb24gY2xlYW51cCgpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07dGhpcy5wZW5kaW5nQ2xlYW51cD0hMDtyZXR1cm4gdGhpcy5fdHJ5Q2xlYW51cCh0KX19LHtrZXk6Il90cnlDbGVhbnVwIix2YWx1ZTpmdW5jdGlvbiBfdHJ5Q2xlYW51cCgpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07aWYoIXRoaXMucGVuZGluZ0NsZWFudXApcmV0dXJuITE7dmFyIHIsYT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpO3RyeXtmb3IoYS5zKCk7IShyPWEubigpKS5kb25lOyl7dmFyIG89ci52YWx1ZSxpPW8ucmVuZGVyVGFza3MsbD1vLm9wZXJhdG9yTGlzdDtpZigwIT09aS5sZW5ndGh8fCFsLmxhc3RDaHVuaylyZXR1cm4hMX19Y2F0Y2godCl7YS5lKHQpfWZpbmFsbHl7YS5mKCl9dGhpcy5faW50ZW50U3RhdGVzLmNsZWFyKCk7dGhpcy5vYmpzLmNsZWFyKCk7dGhpcy5hbm5vdGF0aW9uc1Byb21pc2U9bnVsbDt0JiZ0aGlzLl9zdGF0cyYmKHRoaXMuX3N0YXRzPW5ldyBfZGlzcGxheV91dGlscy5TdGF0VGltZXIpO3RoaXMucGVuZGluZ0NsZWFudXA9ITE7cmV0dXJuITB9fSx7a2V5OiJfc3RhcnRSZW5kZXJQYWdlIix2YWx1ZTpmdW5jdGlvbiBfc3RhcnRSZW5kZXJQYWdlKHQscil7dmFyIGE9dGhpcy5faW50ZW50U3RhdGVzLmdldChyKTtpZihhKXt0aGlzLl9zdGF0cyYmdGhpcy5fc3RhdHMudGltZUVuZCgiUGFnZSBSZXF1ZXN0Iik7YS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5JiZhLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSh0KX19fSx7a2V5OiJfcmVuZGVyUGFnZUNodW5rIix2YWx1ZTpmdW5jdGlvbiBfcmVuZGVyUGFnZUNodW5rKHQscil7Zm9yKHZhciBhPTAsbz10Lmxlbmd0aDthPG87YSsrKXtyLm9wZXJhdG9yTGlzdC5mbkFycmF5LnB1c2godC5mbkFycmF5W2FdKTtyLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkucHVzaCh0LmFyZ3NBcnJheVthXSl9ci5vcGVyYXRvckxpc3QubGFzdENodW5rPXQubGFzdENodW5rO2Zvcih2YXIgaT0wO2k8ci5yZW5kZXJUYXNrcy5sZW5ndGg7aSsrKXIucmVuZGVyVGFza3NbaV0ub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO3QubGFzdENodW5rJiZ0aGlzLl90cnlDbGVhbnVwKCl9fSx7a2V5OiJfcHVtcE9wZXJhdG9yTGlzdCIsdmFsdWU6ZnVuY3Rpb24gX3B1bXBPcGVyYXRvckxpc3QodCl7dmFyIHI9dGhpczsoMCxfdXRpbC5hc3NlcnQpKHQuaW50ZW50LCdQREZQYWdlUHJveHkuX3B1bXBPcGVyYXRvckxpc3Q6IEV4cGVjdGVkICJpbnRlbnQiIGFyZ3VtZW50LicpO3ZhciBhPXRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0T3BlcmF0b3JMaXN0Iix0KS5nZXRSZWFkZXIoKSxvPXRoaXMuX2ludGVudFN0YXRlcy5nZXQodC5pbnRlbnQpO28uc3RyZWFtUmVhZGVyPWE7IWZ1bmN0aW9uIHB1bXAoKXthLnJlYWQoKS50aGVuKChmdW5jdGlvbih0KXt2YXIgYT10LnZhbHVlO2lmKHQuZG9uZSlvLnN0cmVhbVJlYWRlcj1udWxsO2Vsc2UgaWYoIXIuX3RyYW5zcG9ydC5kZXN0cm95ZWQpe3IuX3JlbmRlclBhZ2VDaHVuayhhLG8pO3B1bXAoKX19KSwoZnVuY3Rpb24odCl7by5zdHJlYW1SZWFkZXI9bnVsbDtpZighci5fdHJhbnNwb3J0LmRlc3Ryb3llZCl7aWYoby5vcGVyYXRvckxpc3Qpe28ub3BlcmF0b3JMaXN0Lmxhc3RDaHVuaz0hMDtmb3IodmFyIGE9MDthPG8ucmVuZGVyVGFza3MubGVuZ3RoO2ErKylvLnJlbmRlclRhc2tzW2FdLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtyLl90cnlDbGVhbnVwKCl9aWYoby5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KW8uZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QodCk7ZWxzZXtpZighby5vcExpc3RSZWFkQ2FwYWJpbGl0eSl0aHJvdyB0O28ub3BMaXN0UmVhZENhcGFiaWxpdHkucmVqZWN0KHQpfX19KSl9KCl9fSx7a2V5OiJfYWJvcnRPcGVyYXRvckxpc3QiLHZhbHVlOmZ1bmN0aW9uIF9hYm9ydE9wZXJhdG9yTGlzdCh0KXt2YXIgcj10aGlzLGE9dC5pbnRlbnRTdGF0ZSxvPXQucmVhc29uLGk9dC5mb3JjZSxsPXZvaWQgMCE9PWkmJmk7KDAsX3V0aWwuYXNzZXJ0KShvIGluc3RhbmNlb2YgRXJyb3J8fCJvYmplY3QiPT09X3R5cGVvZihvKSYmbnVsbCE9PW8sJ1BERlBhZ2VQcm94eS5fYWJvcnRPcGVyYXRvckxpc3Q6IEV4cGVjdGVkICJyZWFzb24iIGFyZ3VtZW50LicpO2lmKGEuc3RyZWFtUmVhZGVyKXtpZighbCl7aWYoMCE9PWEucmVuZGVyVGFza3MubGVuZ3RoKXJldHVybjtpZihvIGluc3RhbmNlb2YgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKXthLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLl9hYm9ydE9wZXJhdG9yTGlzdCh7aW50ZW50U3RhdGU6YSxyZWFzb246byxmb3JjZTohMH0pO2Euc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dD1udWxsfSksUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUKTtyZXR1cm59fWEuc3RyZWFtUmVhZGVyLmNhbmNlbChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24obyYmby5tZXNzYWdlKSk7YS5zdHJlYW1SZWFkZXI9bnVsbDtpZighdGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCl7dmFyIGMsdT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLl9pbnRlbnRTdGF0ZXMpO3RyeXtmb3IodS5zKCk7IShjPXUubigpKS5kb25lOyl7dmFyIGQ9X3NsaWNlZFRvQXJyYXkoYy52YWx1ZSwyKSxoPWRbMF07aWYoZFsxXT09PWEpe3RoaXMuX2ludGVudFN0YXRlcy5kZWxldGUoaCk7YnJlYWt9fX1jYXRjaCh0KXt1LmUodCl9ZmluYWxseXt1LmYoKX10aGlzLmNsZWFudXAoKX19fX0se2tleToicGFnZU51bWJlciIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9wYWdlSW5kZXgrMX19LHtrZXk6InJvdGF0ZSIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9wYWdlSW5mby5yb3RhdGV9fSx7a2V5OiJyZWYiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fcGFnZUluZm8ucmVmfX0se2tleToidXNlclVuaXQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fcGFnZUluZm8udXNlclVuaXR9fSx7a2V5OiJ2aWV3IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnZpZXd9fSx7a2V5OiJzdGF0cyIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9zdGF0c319XSk7cmV0dXJuIFBERlBhZ2VQcm94eX0oKTtleHBvcnRzLlBERlBhZ2VQcm94eT1QREZQYWdlUHJveHk7dmFyIExvb3BiYWNrUG9ydD1mdW5jdGlvbigpe2Z1bmN0aW9uIExvb3BiYWNrUG9ydCgpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF07X2NsYXNzQ2FsbENoZWNrKHRoaXMsTG9vcGJhY2tQb3J0KTt0aGlzLl9saXN0ZW5lcnM9W107dGhpcy5fZGVmZXI9dDt0aGlzLl9kZWZlcnJlZD1Qcm9taXNlLnJlc29sdmUodm9pZCAwKX1fY3JlYXRlQ2xhc3MoTG9vcGJhY2tQb3J0LFt7a2V5OiJwb3N0TWVzc2FnZSIsdmFsdWU6ZnVuY3Rpb24gcG9zdE1lc3NhZ2UodCxyKXt2YXIgYT10aGlzO2lmKHRoaXMuX2RlZmVyKXt2YXIgbz1uZXcgV2Vha01hcCxpPXtkYXRhOmZ1bmN0aW9uIGNsb25lVmFsdWUodCl7aWYoIm9iamVjdCIhPT1fdHlwZW9mKHQpfHxudWxsPT09dClyZXR1cm4gdDtpZihvLmhhcyh0KSlyZXR1cm4gby5nZXQodCk7dmFyIGEsaTtpZigoYT10LmJ1ZmZlcikmJigwLF91dGlsLmlzQXJyYXlCdWZmZXIpKGEpKXtpPXImJnIuaW5jbHVkZXMoYSk/bmV3IHQuY29uc3RydWN0b3IoYSx0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKTpuZXcgdC5jb25zdHJ1Y3Rvcih0KTtvLnNldCh0LGkpO3JldHVybiBpfWk9QXJyYXkuaXNBcnJheSh0KT9bXTp7fTtvLnNldCh0LGkpO2Zvcih2YXIgbCBpbiB0KXtmb3IodmFyIGM9dm9pZCAwLHU9dDshKGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih1LGwpKTspdT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodSk7aWYodm9pZCAwIT09Yy52YWx1ZSlpZigiZnVuY3Rpb24iIT10eXBlb2YgYy52YWx1ZSlpW2xdPWNsb25lVmFsdWUoYy52YWx1ZSk7ZWxzZSBpZih0Lmhhc093blByb3BlcnR5JiZ0Lmhhc093blByb3BlcnR5KGwpKXRocm93IG5ldyBFcnJvcigiTG9vcGJhY2tQb3J0LnBvc3RNZXNzYWdlIC0gY2Fubm90IGNsb25lOiAiLmNvbmNhdCh0W2xdKSl9cmV0dXJuIGl9KHQpfTt0aGlzLl9kZWZlcnJlZC50aGVuKChmdW5jdGlvbigpe2EuX2xpc3RlbmVycy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNhbGwoYSxpKX0pKX0pKX1lbHNlIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKChmdW5jdGlvbihyKXtyLmNhbGwoYSx7ZGF0YTp0fSl9KSl9fSx7a2V5OiJhZGRFdmVudExpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHQscil7dGhpcy5fbGlzdGVuZXJzLnB1c2gocil9fSx7a2V5OiJyZW1vdmVFdmVudExpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHQscil7dmFyIGE9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2Yocik7dGhpcy5fbGlzdGVuZXJzLnNwbGljZShhLDEpfX0se2tleToidGVybWluYXRlIix2YWx1ZTpmdW5jdGlvbiB0ZXJtaW5hdGUoKXt0aGlzLl9saXN0ZW5lcnMubGVuZ3RoPTB9fV0pO3JldHVybiBMb29wYmFja1BvcnR9KCk7ZXhwb3J0cy5Mb29wYmFja1BvcnQ9TG9vcGJhY2tQb3J0O3ZhciBQREZXb3JrZXI9ZnVuY3Rpb24gUERGV29ya2VyQ2xvc3VyZSgpe3ZhciBwZGZXb3JrZXJQb3J0cz1uZXcgV2Vha01hcCxpc1dvcmtlckRpc2FibGVkPSExLGZhbGxiYWNrV29ya2VyU3JjLG5leHRGYWtlV29ya2VySWQ9MCxmYWtlV29ya2VyQ2FwYWJpbGl0eTtpZihfaXNfbm9kZS5pc05vZGVKUyYmImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUpe2lzV29ya2VyRGlzYWJsZWQ9ITA7ZmFsbGJhY2tXb3JrZXJTcmM9Ii4vcGRmLndvcmtlci5qcyJ9ZWxzZSBpZigib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIGRvY3VtZW50PyJ1bmRlZmluZWQiOl90eXBlb2YoZG9jdW1lbnQpKSYmImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQpe3ZhciBwZGZqc0ZpbGVQYXRoPWRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO3BkZmpzRmlsZVBhdGgmJihmYWxsYmFja1dvcmtlclNyYz1wZGZqc0ZpbGVQYXRoLnJlcGxhY2UoLyhcLig/Om1pblwuKT9qcykoXD8uKik/JC9pLCIud29ya2VyJDEkMiIpKX1mdW5jdGlvbiBfZ2V0V29ya2VyU3JjKCl7aWYoX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKXJldHVybiBfd29ya2VyX29wdGlvbnMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmM7aWYodm9pZCAwIT09ZmFsbGJhY2tXb3JrZXJTcmMpe19pc19ub2RlLmlzTm9kZUpTfHwoMCxfZGlzcGxheV91dGlscy5kZXByZWNhdGVkKSgnTm8gIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjIiBzcGVjaWZpZWQuJyk7cmV0dXJuIGZhbGxiYWNrV29ya2VyU3JjfXRocm93IG5ldyBFcnJvcignTm8gIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjIiBzcGVjaWZpZWQuJyl9ZnVuY3Rpb24gZ2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCl7dmFyIHQ7dHJ5e3Q9Z2xvYmFsVGhpcy5wZGZqc1dvcmtlciYmZ2xvYmFsVGhpcy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcn1jYXRjaCh0KXt9cmV0dXJuIHR8fG51bGx9ZnVuY3Rpb24gc2V0dXBGYWtlV29ya2VyR2xvYmFsKCl7aWYoZmFrZVdvcmtlckNhcGFiaWxpdHkpcmV0dXJuIGZha2VXb3JrZXJDYXBhYmlsaXR5LnByb21pc2U7ZmFrZVdvcmtlckNhcGFiaWxpdHk9KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dmFyIGxvYWRlcj1mdW5jdGlvbigpe3ZhciBfcmVmMTI9X2FzeW5jVG9HZW5lcmF0b3IoX3JlZ2VuZXJhdG9yLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSgpe3ZhciBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIsd29ya2VyO3JldHVybiBfcmVnZW5lcmF0b3IuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCl7Zm9yKDs7KXN3aXRjaChfY29udGV4dC5wcmV2PV9jb250ZXh0Lm5leHQpe2Nhc2UgMDptYWluV29ya2VyTWVzc2FnZUhhbmRsZXI9Z2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCk7aWYoIW1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcil7X2NvbnRleHQubmV4dD0zO2JyZWFrfXJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyKTtjYXNlIDM6aWYoIV9pc19ub2RlLmlzTm9kZUpTfHwiZnVuY3Rpb24iIT10eXBlb2YgcmVxdWlyZSl7X2NvbnRleHQubmV4dD02O2JyZWFrfXdvcmtlcj1ldmFsKCJyZXF1aXJlIikoX2dldFdvcmtlclNyYygpKTtyZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLHdvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcik7Y2FzZSA2Ol9jb250ZXh0Lm5leHQ9ODtyZXR1cm4oMCxfZGlzcGxheV91dGlscy5sb2FkU2NyaXB0KShfZ2V0V29ya2VyU3JjKCkpO2Nhc2UgODpyZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLHdpbmRvdy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcik7Y2FzZSA5OmNhc2UiZW5kIjpyZXR1cm4gX2NvbnRleHQuc3RvcCgpfX0pLF9jYWxsZWUpfSkpKTtyZXR1cm4gZnVuY3Rpb24gbG9hZGVyKCl7cmV0dXJuIF9yZWYxMi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpO2xvYWRlcigpLnRoZW4oZmFrZVdvcmtlckNhcGFiaWxpdHkucmVzb2x2ZSxmYWtlV29ya2VyQ2FwYWJpbGl0eS5yZWplY3QpO3JldHVybiBmYWtlV29ya2VyQ2FwYWJpbGl0eS5wcm9taXNlfWZ1bmN0aW9uIGNyZWF0ZUNETldyYXBwZXIodCl7dmFyIHI9ImltcG9ydFNjcmlwdHMoJyIrdCsiJyk7IjtyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbcl0pKX12YXIgUERGV29ya2VyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGV29ya2VyKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9dC5uYW1lLGE9dm9pZCAwPT09cj9udWxsOnIsbz10LnBvcnQsaT12b2lkIDA9PT1vP251bGw6byxsPXQudmVyYm9zaXR5LGM9dm9pZCAwPT09bD8oMCxfdXRpbC5nZXRWZXJib3NpdHlMZXZlbCkoKTpsO19jbGFzc0NhbGxDaGVjayh0aGlzLFBERldvcmtlcik7aWYoaSYmcGRmV29ya2VyUG9ydHMuaGFzKGkpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVzZSBtb3JlIHRoYW4gb25lIFBERldvcmtlciBwZXIgcG9ydCIpO3RoaXMubmFtZT1hO3RoaXMuZGVzdHJveWVkPSExO3RoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM9ITA7dGhpcy52ZXJib3NpdHk9Yzt0aGlzLl9yZWFkeUNhcGFiaWxpdHk9KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5fcG9ydD1udWxsO3RoaXMuX3dlYldvcmtlcj1udWxsO3RoaXMuX21lc3NhZ2VIYW5kbGVyPW51bGw7aWYoaSl7cGRmV29ya2VyUG9ydHMuc2V0KGksdGhpcyk7dGhpcy5faW5pdGlhbGl6ZUZyb21Qb3J0KGkpfWVsc2UgdGhpcy5faW5pdGlhbGl6ZSgpfV9jcmVhdGVDbGFzcyhQREZXb3JrZXIsW3trZXk6Il9pbml0aWFsaXplRnJvbVBvcnQiLHZhbHVlOmZ1bmN0aW9uIF9pbml0aWFsaXplRnJvbVBvcnQodCl7dGhpcy5fcG9ydD10O3RoaXMuX21lc3NhZ2VIYW5kbGVyPW5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJtYWluIiwid29ya2VyIix0KTt0aGlzLl9tZXNzYWdlSGFuZGxlci5vbigicmVhZHkiLChmdW5jdGlvbigpe30pKTt0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpfX0se2tleToiX2luaXRpYWxpemUiLHZhbHVlOmZ1bmN0aW9uIF9pbml0aWFsaXplKCl7dmFyIHQ9dGhpcztpZigidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlciYmIWlzV29ya2VyRGlzYWJsZWQmJiFnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKSl7dmFyIHI9X2dldFdvcmtlclNyYygpO3RyeXsoMCxfdXRpbC5pc1NhbWVPcmlnaW4pKHdpbmRvdy5sb2NhdGlvbi5ocmVmLHIpfHwocj1jcmVhdGVDRE5XcmFwcGVyKG5ldyBVUkwocix3aW5kb3cubG9jYXRpb24pLmhyZWYpKTt2YXIgYT1uZXcgV29ya2VyKHIpLG89bmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIm1haW4iLCJ3b3JrZXIiLGEpLGk9ZnVuY3Rpb24gdGVybWluYXRlRWFybHkoKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixsKTtvLmRlc3Ryb3koKTthLnRlcm1pbmF0ZSgpO3QuZGVzdHJveWVkP3QuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpKTp0Ll9zZXR1cEZha2VXb3JrZXIoKX0sbD1mdW5jdGlvbiBvbldvcmtlckVycm9yKCl7dC5fd2ViV29ya2VyfHxpKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGwpO28ub24oInRlc3QiLChmdW5jdGlvbihyKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixsKTtpZih0LmRlc3Ryb3llZClpKCk7ZWxzZSBpZihyKXt0Ll9tZXNzYWdlSGFuZGxlcj1vO3QuX3BvcnQ9YTt0Ll93ZWJXb3JrZXI9YTtyLnN1cHBvcnRUcmFuc2ZlcnN8fCh0LnBvc3RNZXNzYWdlVHJhbnNmZXJzPSExKTt0Ll9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO28uc2VuZCgiY29uZmlndXJlIix7dmVyYm9zaXR5OnQudmVyYm9zaXR5fSl9ZWxzZXt0Ll9zZXR1cEZha2VXb3JrZXIoKTtvLmRlc3Ryb3koKTthLnRlcm1pbmF0ZSgpfX0pKTtvLm9uKCJyZWFkeSIsKGZ1bmN0aW9uKHIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGwpO2lmKHQuZGVzdHJveWVkKWkoKTtlbHNlIHRyeXtjKCl9Y2F0Y2gocil7dC5fc2V0dXBGYWtlV29ya2VyKCl9fSkpO3ZhciBjPWZ1bmN0aW9uIHNlbmRUZXN0KCl7dmFyIHI9bmV3IFVpbnQ4QXJyYXkoW3QucG9zdE1lc3NhZ2VUcmFuc2ZlcnM/MjU1OjBdKTt0cnl7by5zZW5kKCJ0ZXN0IixyLFtyLmJ1ZmZlcl0pfWNhdGNoKHQpeygwLF91dGlsLndhcm4pKCJDYW5ub3QgdXNlIHBvc3RNZXNzYWdlIHRyYW5zZmVycy4iKTtyWzBdPTA7by5zZW5kKCJ0ZXN0IixyKX19O2MoKTtyZXR1cm59Y2F0Y2godCl7KDAsX3V0aWwuaW5mbykoIlRoZSB3b3JrZXIgaGFzIGJlZW4gZGlzYWJsZWQuIil9fXRoaXMuX3NldHVwRmFrZVdvcmtlcigpfX0se2tleToiX3NldHVwRmFrZVdvcmtlciIsdmFsdWU6ZnVuY3Rpb24gX3NldHVwRmFrZVdvcmtlcigpe3ZhciB0PXRoaXM7aWYoIWlzV29ya2VyRGlzYWJsZWQpeygwLF91dGlsLndhcm4pKCJTZXR0aW5nIHVwIGZha2Ugd29ya2VyLiIpO2lzV29ya2VyRGlzYWJsZWQ9ITB9c2V0dXBGYWtlV29ya2VyR2xvYmFsKCkudGhlbigoZnVuY3Rpb24ocil7aWYodC5kZXN0cm95ZWQpdC5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpO2Vsc2V7dmFyIGE9bmV3IExvb3BiYWNrUG9ydDt0Ll9wb3J0PWE7dmFyIG89ImZha2UiK25leHRGYWtlV29ya2VySWQrKyxpPW5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG8rIl93b3JrZXIiLG8sYSk7ci5zZXR1cChpLGEpO3ZhciBsPW5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG8sbysiX3dvcmtlciIsYSk7dC5fbWVzc2FnZUhhbmRsZXI9bDt0Ll9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO2wuc2VuZCgiY29uZmlndXJlIix7dmVyYm9zaXR5OnQudmVyYm9zaXR5fSl9fSkpLmNhdGNoKChmdW5jdGlvbihyKXt0Ll9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcignU2V0dGluZyB1cCBmYWtlIHdvcmtlciBmYWlsZWQ6ICInLmNvbmNhdChyLm1lc3NhZ2UsJyIuJykpKX0pKX19LHtrZXk6ImRlc3Ryb3kiLHZhbHVlOmZ1bmN0aW9uIGRlc3Ryb3koKXt0aGlzLmRlc3Ryb3llZD0hMDtpZih0aGlzLl93ZWJXb3JrZXIpe3RoaXMuX3dlYldvcmtlci50ZXJtaW5hdGUoKTt0aGlzLl93ZWJXb3JrZXI9bnVsbH1wZGZXb3JrZXJQb3J0cy5kZWxldGUodGhpcy5fcG9ydCk7dGhpcy5fcG9ydD1udWxsO2lmKHRoaXMuX21lc3NhZ2VIYW5kbGVyKXt0aGlzLl9tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7dGhpcy5fbWVzc2FnZUhhbmRsZXI9bnVsbH19fSx7a2V5OiJwcm9taXNlIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlfX0se2tleToicG9ydCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9wb3J0fX0se2tleToibWVzc2FnZUhhbmRsZXIiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fbWVzc2FnZUhhbmRsZXJ9fV0sW3trZXk6ImZyb21Qb3J0Iix2YWx1ZTpmdW5jdGlvbiBmcm9tUG9ydCh0KXtpZighdHx8IXQucG9ydCl0aHJvdyBuZXcgRXJyb3IoIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS4iKTtyZXR1cm4gcGRmV29ya2VyUG9ydHMuaGFzKHQucG9ydCk/cGRmV29ya2VyUG9ydHMuZ2V0KHQucG9ydCk6bmV3IFBERldvcmtlcih0KX19LHtrZXk6ImdldFdvcmtlclNyYyIsdmFsdWU6ZnVuY3Rpb24gZ2V0V29ya2VyU3JjKCl7cmV0dXJuIF9nZXRXb3JrZXJTcmMoKX19XSk7cmV0dXJuIFBERldvcmtlcn0oKTtyZXR1cm4gUERGV29ya2VyfSgpO2V4cG9ydHMuUERGV29ya2VyPVBERldvcmtlcjt2YXIgV29ya2VyVHJhbnNwb3J0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gV29ya2VyVHJhbnNwb3J0KHQscixhLG8pe19jbGFzc0NhbGxDaGVjayh0aGlzLFdvcmtlclRyYW5zcG9ydCk7dGhpcy5tZXNzYWdlSGFuZGxlcj10O3RoaXMubG9hZGluZ1Rhc2s9cjt0aGlzLmNvbW1vbk9ianM9bmV3IFBERk9iamVjdHM7dGhpcy5mb250TG9hZGVyPW5ldyBfZm9udF9sb2FkZXIuRm9udExvYWRlcih7ZG9jSWQ6ci5kb2NJZCxvblVuc3VwcG9ydGVkRmVhdHVyZTp0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZS5iaW5kKHRoaXMpLG93bmVyRG9jdW1lbnQ6by5vd25lckRvY3VtZW50fSk7dGhpcy5fcGFyYW1zPW87dGhpcy5DTWFwUmVhZGVyRmFjdG9yeT1uZXcgby5DTWFwUmVhZGVyRmFjdG9yeSh7YmFzZVVybDpvLmNNYXBVcmwsaXNDb21wcmVzc2VkOm8uY01hcFBhY2tlZH0pO3RoaXMuZGVzdHJveWVkPSExO3RoaXMuZGVzdHJveUNhcGFiaWxpdHk9bnVsbDt0aGlzLl9wYXNzd29yZENhcGFiaWxpdHk9bnVsbDt0aGlzLl9uZXR3b3JrU3RyZWFtPWE7dGhpcy5fZnVsbFJlYWRlcj1udWxsO3RoaXMuX2xhc3RQcm9ncmVzcz1udWxsO3RoaXMucGFnZUNhY2hlPVtdO3RoaXMucGFnZVByb21pc2VzPVtdO3RoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eT0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLnNldHVwTWVzc2FnZUhhbmRsZXIoKX1fY3JlYXRlQ2xhc3MoV29ya2VyVHJhbnNwb3J0LFt7a2V5OiJkZXN0cm95Iix2YWx1ZTpmdW5jdGlvbiBkZXN0cm95KCl7dmFyIHQ9dGhpcztpZih0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5KXJldHVybiB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnByb21pc2U7dGhpcy5kZXN0cm95ZWQ9ITA7dGhpcy5kZXN0cm95Q2FwYWJpbGl0eT0oMCxfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkmJnRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCBkdXJpbmcgb25QYXNzd29yZCBjYWxsYmFjayIpKTt2YXIgcj1bXTt0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0JiZyLnB1c2godC5fZGVzdHJveSgpKX0pKTt0aGlzLnBhZ2VDYWNoZS5sZW5ndGg9MDt0aGlzLnBhZ2VQcm9taXNlcy5sZW5ndGg9MDt2YXIgYT10aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiVGVybWluYXRlIixudWxsKTtyLnB1c2goYSk7UHJvbWlzZS5hbGwocikudGhlbigoZnVuY3Rpb24oKXt0LmZvbnRMb2FkZXIuY2xlYXIoKTt0Ll9uZXR3b3JrU3RyZWFtJiZ0Ll9uZXR3b3JrU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTtpZih0Lm1lc3NhZ2VIYW5kbGVyKXt0Lm1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTt0Lm1lc3NhZ2VIYW5kbGVyPW51bGx9dC5kZXN0cm95Q2FwYWJpbGl0eS5yZXNvbHZlKCl9KSx0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlamVjdCk7cmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZX19LHtrZXk6InNldHVwTWVzc2FnZUhhbmRsZXIiLHZhbHVlOmZ1bmN0aW9uIHNldHVwTWVzc2FnZUhhbmRsZXIoKXt2YXIgdD10aGlzLHI9dGhpcy5tZXNzYWdlSGFuZGxlcixhPXRoaXMubG9hZGluZ1Rhc2s7ci5vbigiR2V0UmVhZGVyIiwoZnVuY3Rpb24ocixhKXsoMCxfdXRpbC5hc3NlcnQpKHQuX25ldHdvcmtTdHJlYW0sIkdldFJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuIik7dC5fZnVsbFJlYWRlcj10Ll9uZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIoKTt0Ll9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3M9ZnVuY3Rpb24ocil7dC5fbGFzdFByb2dyZXNzPXtsb2FkZWQ6ci5sb2FkZWQsdG90YWw6ci50b3RhbH19O2Eub25QdWxsPWZ1bmN0aW9uKCl7dC5fZnVsbFJlYWRlci5yZWFkKCkudGhlbigoZnVuY3Rpb24odCl7dmFyIHI9dC52YWx1ZTtpZih0LmRvbmUpYS5jbG9zZSgpO2Vsc2V7KDAsX3V0aWwuYXNzZXJ0KSgoMCxfdXRpbC5pc0FycmF5QnVmZmVyKShyKSwiR2V0UmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuIik7YS5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHIpLDEsW3JdKX19KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2EuZXJyb3IodCl9KSl9O2Eub25DYW5jZWw9ZnVuY3Rpb24ocil7dC5fZnVsbFJlYWRlci5jYW5jZWwocik7YS5yZWFkeS5jYXRjaCgoZnVuY3Rpb24ocil7aWYoIXQuZGVzdHJveWVkKXRocm93IHJ9KSl9fSkpO3Iub24oIlJlYWRlckhlYWRlcnNSZWFkeSIsKGZ1bmN0aW9uKHIpe3ZhciBvPSgwLF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpLGk9dC5fZnVsbFJlYWRlcjtpLmhlYWRlcnNSZWFkeS50aGVuKChmdW5jdGlvbigpe2lmKCFpLmlzU3RyZWFtaW5nU3VwcG9ydGVkfHwhaS5pc1JhbmdlU3VwcG9ydGVkKXt0Ll9sYXN0UHJvZ3Jlc3MmJmEub25Qcm9ncmVzcyYmYS5vblByb2dyZXNzKHQuX2xhc3RQcm9ncmVzcyk7aS5vblByb2dyZXNzPWZ1bmN0aW9uKHQpe2Eub25Qcm9ncmVzcyYmYS5vblByb2dyZXNzKHtsb2FkZWQ6dC5sb2FkZWQsdG90YWw6dC50b3RhbH0pfX1vLnJlc29sdmUoe2lzU3RyZWFtaW5nU3VwcG9ydGVkOmkuaXNTdHJlYW1pbmdTdXBwb3J0ZWQsaXNSYW5nZVN1cHBvcnRlZDppLmlzUmFuZ2VTdXBwb3J0ZWQsY29udGVudExlbmd0aDppLmNvbnRlbnRMZW5ndGh9KX0pLG8ucmVqZWN0KTtyZXR1cm4gby5wcm9taXNlfSkpO3Iub24oIkdldFJhbmdlUmVhZGVyIiwoZnVuY3Rpb24ocixhKXsoMCxfdXRpbC5hc3NlcnQpKHQuX25ldHdvcmtTdHJlYW0sIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS4iKTt2YXIgbz10Ll9uZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKHIuYmVnaW4sci5lbmQpO2lmKG8pe2Eub25QdWxsPWZ1bmN0aW9uKCl7by5yZWFkKCkudGhlbigoZnVuY3Rpb24odCl7dmFyIHI9dC52YWx1ZTtpZih0LmRvbmUpYS5jbG9zZSgpO2Vsc2V7KDAsX3V0aWwuYXNzZXJ0KSgoMCxfdXRpbC5pc0FycmF5QnVmZmVyKShyKSwiR2V0UmFuZ2VSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci4iKTthLmVucXVldWUobmV3IFVpbnQ4QXJyYXkociksMSxbcl0pfX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7YS5lcnJvcih0KX0pKX07YS5vbkNhbmNlbD1mdW5jdGlvbihyKXtvLmNhbmNlbChyKTthLnJlYWR5LmNhdGNoKChmdW5jdGlvbihyKXtpZighdC5kZXN0cm95ZWQpdGhyb3cgcn0pKX19ZWxzZSBhLmNsb3NlKCl9KSk7ci5vbigiR2V0RG9jIiwoZnVuY3Rpb24ocil7dmFyIG89ci5wZGZJbmZvO3QuX251bVBhZ2VzPW8ubnVtUGFnZXM7YS5fY2FwYWJpbGl0eS5yZXNvbHZlKG5ldyBQREZEb2N1bWVudFByb3h5KG8sdCkpfSkpO3Iub24oIkRvY0V4Y2VwdGlvbiIsKGZ1bmN0aW9uKHQpe3ZhciByO3N3aXRjaCh0Lm5hbWUpe2Nhc2UiUGFzc3dvcmRFeGNlcHRpb24iOnI9bmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKHQubWVzc2FnZSx0LmNvZGUpO2JyZWFrO2Nhc2UiSW52YWxpZFBERkV4Y2VwdGlvbiI6cj1uZXcgX3V0aWwuSW52YWxpZFBERkV4Y2VwdGlvbih0Lm1lc3NhZ2UpO2JyZWFrO2Nhc2UiTWlzc2luZ1BERkV4Y2VwdGlvbiI6cj1uZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbih0Lm1lc3NhZ2UpO2JyZWFrO2Nhc2UiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjpyPW5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24odC5tZXNzYWdlLHQuc3RhdHVzKTticmVhaztjYXNlIlVua25vd25FcnJvckV4Y2VwdGlvbiI6cj1uZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSx0LmRldGFpbHMpfWlmKCEociBpbnN0YW5jZW9mIEVycm9yKSl7KDAsX3V0aWwud2FybikoIkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuIil9YS5fY2FwYWJpbGl0eS5yZWplY3Qocil9KSk7ci5vbigiUGFzc3dvcmRSZXF1ZXN0IiwoZnVuY3Rpb24ocil7dC5fcGFzc3dvcmRDYXBhYmlsaXR5PSgwLF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO2lmKGEub25QYXNzd29yZCl7dHJ5e2Eub25QYXNzd29yZCgoZnVuY3Rpb24gdXBkYXRlUGFzc3dvcmQocil7dC5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlc29sdmUoe3Bhc3N3b3JkOnJ9KX0pLHIuY29kZSl9Y2F0Y2gocil7dC5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChyKX19ZWxzZSB0Ll9wYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbihyLm1lc3NhZ2Usci5jb2RlKSk7cmV0dXJuIHQuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5wcm9taXNlfSkpO3Iub24oIkRhdGFMb2FkZWQiLChmdW5jdGlvbihyKXthLm9uUHJvZ3Jlc3MmJmEub25Qcm9ncmVzcyh7bG9hZGVkOnIubGVuZ3RoLHRvdGFsOnIubGVuZ3RofSk7dC5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnJlc29sdmUocil9KSk7ci5vbigiU3RhcnRSZW5kZXJQYWdlIiwoZnVuY3Rpb24ocil7aWYoIXQuZGVzdHJveWVkKXt0LnBhZ2VDYWNoZVtyLnBhZ2VJbmRleF0uX3N0YXJ0UmVuZGVyUGFnZShyLnRyYW5zcGFyZW5jeSxyLmludGVudCl9fSkpO3Iub24oImNvbW1vbm9iaiIsKGZ1bmN0aW9uKGEpe2lmKCF0LmRlc3Ryb3llZCl7dmFyIG89X3NsaWNlZFRvQXJyYXkoYSwzKSxpPW9bMF0sbD1vWzFdLGM9b1syXTtpZighdC5jb21tb25PYmpzLmhhcyhpKSlzd2l0Y2gobCl7Y2FzZSJGb250Ijp2YXIgdT10Ll9wYXJhbXM7aWYoImVycm9yImluIGMpe3ZhciBkPWMuZXJyb3I7KDAsX3V0aWwud2FybikoIkVycm9yIGR1cmluZyBmb250IGxvYWRpbmc6ICIuY29uY2F0KGQpKTt0LmNvbW1vbk9ianMucmVzb2x2ZShpLGQpO2JyZWFrfXZhciBoPW51bGw7dS5wZGZCdWcmJmdsb2JhbFRoaXMuRm9udEluc3BlY3RvciYmZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmVuYWJsZWQmJihoPXtyZWdpc3RlckZvbnQ6ZnVuY3Rpb24gcmVnaXN0ZXJGb250KHQscil7Z2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmZvbnRBZGRlZCh0LHIpfX0pO3ZhciBwPW5ldyBfZm9udF9sb2FkZXIuRm9udEZhY2VPYmplY3QoYyx7aXNFdmFsU3VwcG9ydGVkOnUuaXNFdmFsU3VwcG9ydGVkLGRpc2FibGVGb250RmFjZTp1LmRpc2FibGVGb250RmFjZSxpZ25vcmVFcnJvcnM6dS5pZ25vcmVFcnJvcnMsb25VbnN1cHBvcnRlZEZlYXR1cmU6dC5fb25VbnN1cHBvcnRlZEZlYXR1cmUuYmluZCh0KSxmb250UmVnaXN0cnk6aH0pO3QuZm9udExvYWRlci5iaW5kKHApLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gci5zZW5kV2l0aFByb21pc2UoIkZvbnRGYWxsYmFjayIse2lkOml9KX0pKS5maW5hbGx5KChmdW5jdGlvbigpeyF1LmZvbnRFeHRyYVByb3BlcnRpZXMmJnAuZGF0YSYmKHAuZGF0YT1udWxsKTt0LmNvbW1vbk9ianMucmVzb2x2ZShpLHApfSkpO2JyZWFrO2Nhc2UiRm9udFBhdGgiOmNhc2UiSW1hZ2UiOnQuY29tbW9uT2Jqcy5yZXNvbHZlKGksYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkdvdCB1bmtub3duIGNvbW1vbiBvYmplY3QgdHlwZSAiLmNvbmNhdChsKSl9fX0pKTtyLm9uKCJvYmoiLChmdW5jdGlvbihyKXtpZighdC5kZXN0cm95ZWQpe3ZhciBhPV9zbGljZWRUb0FycmF5KHIsNCksbz1hWzBdLGk9YVsxXSxsPWFbMl0sYz1hWzNdLHU9dC5wYWdlQ2FjaGVbaV07aWYoIXUub2Jqcy5oYXMobykpc3dpdGNoKGwpe2Nhc2UiSW1hZ2UiOnUub2Jqcy5yZXNvbHZlKG8sYyk7YyYmImRhdGEiaW4gYyYmYy5kYXRhLmxlbmd0aD44ZTYmJih1LmNsZWFudXBBZnRlclJlbmRlcj0hMCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkdvdCB1bmtub3duIG9iamVjdCB0eXBlICIuY29uY2F0KGwpKX19fSkpO3Iub24oIkRvY1Byb2dyZXNzIiwoZnVuY3Rpb24ocil7dC5kZXN0cm95ZWR8fGEub25Qcm9ncmVzcyYmYS5vblByb2dyZXNzKHtsb2FkZWQ6ci5sb2FkZWQsdG90YWw6ci50b3RhbH0pfSkpO3Iub24oIlVuc3VwcG9ydGVkRmVhdHVyZSIsdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUuYmluZCh0aGlzKSk7ci5vbigiRmV0Y2hCdWlsdEluQ01hcCIsKGZ1bmN0aW9uKHIsYSl7aWYodC5kZXN0cm95ZWQpYS5lcnJvcihuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpO2Vsc2V7dmFyIG89ITE7YS5vblB1bGw9ZnVuY3Rpb24oKXtpZihvKWEuY2xvc2UoKTtlbHNle289ITA7dC5DTWFwUmVhZGVyRmFjdG9yeS5mZXRjaChyKS50aGVuKChmdW5jdGlvbih0KXthLmVucXVldWUodCwxLFt0LmNNYXBEYXRhLmJ1ZmZlcl0pfSkpLmNhdGNoKChmdW5jdGlvbih0KXthLmVycm9yKHQpfSkpfX19fSkpfX0se2tleToiX29uVW5zdXBwb3J0ZWRGZWF0dXJlIix2YWx1ZTpmdW5jdGlvbiBfb25VbnN1cHBvcnRlZEZlYXR1cmUodCl7dmFyIHI9dC5mZWF0dXJlSWQ7dGhpcy5kZXN0cm95ZWR8fHRoaXMubG9hZGluZ1Rhc2sub25VbnN1cHBvcnRlZEZlYXR1cmUmJnRoaXMubG9hZGluZ1Rhc2sub25VbnN1cHBvcnRlZEZlYXR1cmUocil9fSx7a2V5OiJnZXREYXRhIix2YWx1ZTpmdW5jdGlvbiBnZXREYXRhKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREYXRhIixudWxsKX19LHtrZXk6ImdldFBhZ2UiLHZhbHVlOmZ1bmN0aW9uIGdldFBhZ2UodCl7dmFyIHI9dGhpcztpZighTnVtYmVyLmlzSW50ZWdlcih0KXx8dDw9MHx8dD50aGlzLl9udW1QYWdlcylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJJbnZhbGlkIHBhZ2UgcmVxdWVzdCIpKTt2YXIgYT10LTE7aWYoYSBpbiB0aGlzLnBhZ2VQcm9taXNlcylyZXR1cm4gdGhpcy5wYWdlUHJvbWlzZXNbYV07dmFyIG89dGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2UiLHtwYWdlSW5kZXg6YX0pLnRoZW4oKGZ1bmN0aW9uKHQpe2lmKHIuZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiVHJhbnNwb3J0IGRlc3Ryb3llZCIpO3ZhciBvPW5ldyBQREZQYWdlUHJveHkoYSx0LHIsci5fcGFyYW1zLm93bmVyRG9jdW1lbnQsci5fcGFyYW1zLnBkZkJ1Zyk7ci5wYWdlQ2FjaGVbYV09bztyZXR1cm4gb30pKTt0aGlzLnBhZ2VQcm9taXNlc1thXT1vO3JldHVybiBvfX0se2tleToiZ2V0UGFnZUluZGV4Iix2YWx1ZTpmdW5jdGlvbiBnZXRQYWdlSW5kZXgodCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlSW5kZXgiLHtyZWY6dH0pLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKHQpKX0pKX19LHtrZXk6ImdldEFubm90YXRpb25zIix2YWx1ZTpmdW5jdGlvbiBnZXRBbm5vdGF0aW9ucyh0LHIpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0QW5ub3RhdGlvbnMiLHtwYWdlSW5kZXg6dCxpbnRlbnQ6cn0pfX0se2tleToic2F2ZURvY3VtZW50Iix2YWx1ZTpmdW5jdGlvbiBzYXZlRG9jdW1lbnQodCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJTYXZlRG9jdW1lbnQiLHtudW1QYWdlczp0aGlzLl9udW1QYWdlcyxhbm5vdGF0aW9uU3RvcmFnZTp0JiZ0LmdldEFsbCgpfHxudWxsLGZpbGVuYW1lOnRoaXMuX2Z1bGxSZWFkZXI/dGhpcy5fZnVsbFJlYWRlci5maWxlbmFtZTpudWxsfSkuZmluYWxseSgoZnVuY3Rpb24oKXt0JiZ0LnJlc2V0TW9kaWZpZWQoKX0pKX19LHtrZXk6ImdldERlc3RpbmF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24gZ2V0RGVzdGluYXRpb25zKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREZXN0aW5hdGlvbnMiLG51bGwpfX0se2tleToiZ2V0RGVzdGluYXRpb24iLHZhbHVlOmZ1bmN0aW9uIGdldERlc3RpbmF0aW9uKHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgdD9Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkludmFsaWQgZGVzdGluYXRpb24gcmVxdWVzdC4iKSk6dGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERlc3RpbmF0aW9uIix7aWQ6dH0pfX0se2tleToiZ2V0UGFnZUxhYmVscyIsdmFsdWU6ZnVuY3Rpb24gZ2V0UGFnZUxhYmVscygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGFnZUxhYmVscyIsbnVsbCl9fSx7a2V5OiJnZXRQYWdlTGF5b3V0Iix2YWx1ZTpmdW5jdGlvbiBnZXRQYWdlTGF5b3V0KCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlTGF5b3V0IixudWxsKX19LHtrZXk6ImdldFBhZ2VNb2RlIix2YWx1ZTpmdW5jdGlvbiBnZXRQYWdlTW9kZSgpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGFnZU1vZGUiLG51bGwpfX0se2tleToiZ2V0Vmlld2VyUHJlZmVyZW5jZXMiLHZhbHVlOmZ1bmN0aW9uIGdldFZpZXdlclByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRWaWV3ZXJQcmVmZXJlbmNlcyIsbnVsbCl9fSx7a2V5OiJnZXRPcGVuQWN0aW9uIix2YWx1ZTpmdW5jdGlvbiBnZXRPcGVuQWN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRPcGVuQWN0aW9uIixudWxsKX19LHtrZXk6ImdldEF0dGFjaG1lbnRzIix2YWx1ZTpmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0QXR0YWNobWVudHMiLG51bGwpfX0se2tleToiZ2V0SmF2YVNjcmlwdCIsdmFsdWU6ZnVuY3Rpb24gZ2V0SmF2YVNjcmlwdCgpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0SmF2YVNjcmlwdCIsbnVsbCl9fSx7a2V5OiJnZXRPdXRsaW5lIix2YWx1ZTpmdW5jdGlvbiBnZXRPdXRsaW5lKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRPdXRsaW5lIixudWxsKX19LHtrZXk6ImdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsdmFsdWU6ZnVuY3Rpb24gZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRPcHRpb25hbENvbnRlbnRDb25maWciLG51bGwpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLk9wdGlvbmFsQ29udGVudENvbmZpZyh0KX0pKX19LHtrZXk6ImdldFBlcm1pc3Npb25zIix2YWx1ZTpmdW5jdGlvbiBnZXRQZXJtaXNzaW9ucygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGVybWlzc2lvbnMiLG51bGwpfX0se2tleToiZ2V0TWV0YWRhdGEiLHZhbHVlOmZ1bmN0aW9uIGdldE1ldGFkYXRhKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldE1ldGFkYXRhIixudWxsKS50aGVuKChmdW5jdGlvbihyKXtyZXR1cm57aW5mbzpyWzBdLG1ldGFkYXRhOnJbMV0/bmV3IF9tZXRhZGF0YS5NZXRhZGF0YShyWzFdKTpudWxsLGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOnQuX2Z1bGxSZWFkZXI/dC5fZnVsbFJlYWRlci5maWxlbmFtZTpudWxsfX0pKX19LHtrZXk6ImdldFN0YXRzIix2YWx1ZTpmdW5jdGlvbiBnZXRTdGF0cygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0U3RhdHMiLG51bGwpfX0se2tleToic3RhcnRDbGVhbnVwIix2YWx1ZTpmdW5jdGlvbiBzdGFydENsZWFudXAoKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiQ2xlYW51cCIsbnVsbCkudGhlbigoZnVuY3Rpb24oKXtmb3IodmFyIHI9MCxhPXQucGFnZUNhY2hlLmxlbmd0aDtyPGE7cisrKXt2YXIgbz10LnBhZ2VDYWNoZVtyXTtpZihvKXtpZighby5jbGVhbnVwKCkpdGhyb3cgbmV3IEVycm9yKCJzdGFydENsZWFudXA6IFBhZ2UgIi5jb25jYXQocisxLCIgaXMgY3VycmVudGx5IHJlbmRlcmluZy4iKSl9fXQuY29tbW9uT2Jqcy5jbGVhcigpO3QuZm9udExvYWRlci5jbGVhcigpfSkpfX0se2tleToibG9hZGluZ1BhcmFtcyIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXRoaXMuX3BhcmFtcztyZXR1cm4oMCxfdXRpbC5zaGFkb3cpKHRoaXMsImxvYWRpbmdQYXJhbXMiLHtkaXNhYmxlQXV0b0ZldGNoOnQuZGlzYWJsZUF1dG9GZXRjaCxkaXNhYmxlRm9udEZhY2U6dC5kaXNhYmxlRm9udEZhY2V9KX19XSk7cmV0dXJuIFdvcmtlclRyYW5zcG9ydH0oKSxQREZPYmplY3RzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGT2JqZWN0cygpe19jbGFzc0NhbGxDaGVjayh0aGlzLFBERk9iamVjdHMpO3RoaXMuX29ianM9T2JqZWN0LmNyZWF0ZShudWxsKX1fY3JlYXRlQ2xhc3MoUERGT2JqZWN0cyxbe2tleToiX2Vuc3VyZU9iaiIsdmFsdWU6ZnVuY3Rpb24gX2Vuc3VyZU9iaih0KXtyZXR1cm4gdGhpcy5fb2Jqc1t0XT90aGlzLl9vYmpzW3RdOnRoaXMuX29ianNbdF09e2NhcGFiaWxpdHk6KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCksZGF0YTpudWxsLHJlc29sdmVkOiExfX19LHtrZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24gZ2V0KHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO2lmKHIpe3RoaXMuX2Vuc3VyZU9iaih0KS5jYXBhYmlsaXR5LnByb21pc2UudGhlbihyKTtyZXR1cm4gbnVsbH12YXIgYT10aGlzLl9vYmpzW3RdO2lmKCFhfHwhYS5yZXNvbHZlZCl0aHJvdyBuZXcgRXJyb3IoIlJlcXVlc3Rpbmcgb2JqZWN0IHRoYXQgaXNuJ3QgcmVzb2x2ZWQgeWV0ICIuY29uY2F0KHQsIi4iKSk7cmV0dXJuIGEuZGF0YX19LHtrZXk6ImhhcyIsdmFsdWU6ZnVuY3Rpb24gaGFzKHQpe3ZhciByPXRoaXMuX29ianNbdF07cmV0dXJuISFyJiZyLnJlc29sdmVkfX0se2tleToicmVzb2x2ZSIsdmFsdWU6ZnVuY3Rpb24gcmVzb2x2ZSh0LHIpe3ZhciBhPXRoaXMuX2Vuc3VyZU9iaih0KTthLnJlc29sdmVkPSEwO2EuZGF0YT1yO2EuY2FwYWJpbGl0eS5yZXNvbHZlKHIpfX0se2tleToiY2xlYXIiLHZhbHVlOmZ1bmN0aW9uIGNsZWFyKCl7dGhpcy5fb2Jqcz1PYmplY3QuY3JlYXRlKG51bGwpfX1dKTtyZXR1cm4gUERGT2JqZWN0c30oKSxSZW5kZXJUYXNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUmVuZGVyVGFzayh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxSZW5kZXJUYXNrKTt0aGlzLl9pbnRlcm5hbFJlbmRlclRhc2s9dDt0aGlzLm9uQ29udGludWU9bnVsbH1fY3JlYXRlQ2xhc3MoUmVuZGVyVGFzayxbe2tleToiY2FuY2VsIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWwoKXt0aGlzLl9pbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKCl9fSx7a2V5OiJwcm9taXNlIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2ludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnByb21pc2V9fV0pO3JldHVybiBSZW5kZXJUYXNrfSgpLEludGVybmFsUmVuZGVyVGFzaz1mdW5jdGlvbiBJbnRlcm5hbFJlbmRlclRhc2tDbG9zdXJlKCl7dmFyIHQ9bmV3IFdlYWtTZXQ7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gSW50ZXJuYWxSZW5kZXJUYXNrKHQpe3ZhciByPXQuY2FsbGJhY2ssYT10LnBhcmFtcyxvPXQub2JqcyxpPXQuY29tbW9uT2JqcyxsPXQub3BlcmF0b3JMaXN0LGM9dC5wYWdlSW5kZXgsdT10LmNhbnZhc0ZhY3RvcnksZD10LndlYkdMQ29udGV4dCxoPXQudXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lLHA9dm9pZCAwIT09aCYmaCxtPXQucGRmQnVnLHY9dm9pZCAwIT09bSYmbTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxJbnRlcm5hbFJlbmRlclRhc2spO3RoaXMuY2FsbGJhY2s9cjt0aGlzLnBhcmFtcz1hO3RoaXMub2Jqcz1vO3RoaXMuY29tbW9uT2Jqcz1pO3RoaXMub3BlcmF0b3JMaXN0SWR4PW51bGw7dGhpcy5vcGVyYXRvckxpc3Q9bDt0aGlzLl9wYWdlSW5kZXg9Yzt0aGlzLmNhbnZhc0ZhY3Rvcnk9dTt0aGlzLndlYkdMQ29udGV4dD1kO3RoaXMuX3BkZkJ1Zz12O3RoaXMucnVubmluZz0hMTt0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaz1udWxsO3RoaXMuZ3JhcGhpY3NSZWFkeT0hMTt0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ITA9PT1wJiYidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdzt0aGlzLmNhbmNlbGxlZD0hMTt0aGlzLmNhcGFiaWxpdHk9KDAsX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy50YXNrPW5ldyBSZW5kZXJUYXNrKHRoaXMpO3RoaXMuX2NvbnRpbnVlQm91bmQ9dGhpcy5fY29udGludWUuYmluZCh0aGlzKTt0aGlzLl9zY2hlZHVsZU5leHRCb3VuZD10aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTt0aGlzLl9uZXh0Qm91bmQ9dGhpcy5fbmV4dC5iaW5kKHRoaXMpO3RoaXMuX2NhbnZhcz1hLmNhbnZhc0NvbnRleHQuY2FudmFzfV9jcmVhdGVDbGFzcyhJbnRlcm5hbFJlbmRlclRhc2ssW3trZXk6ImluaXRpYWxpemVHcmFwaGljcyIsdmFsdWU6ZnVuY3Rpb24gaW5pdGlhbGl6ZUdyYXBoaWNzKHIpe3ZhciBhPXIudHJhbnNwYXJlbmN5LG89dm9pZCAwIT09YSYmYSxpPXIub3B0aW9uYWxDb250ZW50Q29uZmlnO2lmKCF0aGlzLmNhbmNlbGxlZCl7aWYodGhpcy5fY2FudmFzKXtpZih0Lmhhcyh0aGlzLl9jYW52YXMpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuIFVzZSBkaWZmZXJlbnQgY2FudmFzIG9yIGVuc3VyZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC4iKTt0LmFkZCh0aGlzLl9jYW52YXMpfWlmKHRoaXMuX3BkZkJ1ZyYmZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlciYmZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5lbmFibGVkKXt0aGlzLnN0ZXBwZXI9Z2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5jcmVhdGUodGhpcy5fcGFnZUluZGV4KTt0aGlzLnN0ZXBwZXIuaW5pdCh0aGlzLm9wZXJhdG9yTGlzdCk7dGhpcy5zdGVwcGVyLm5leHRCcmVha1BvaW50PXRoaXMuc3RlcHBlci5nZXROZXh0QnJlYWtQb2ludCgpfXZhciBsPXRoaXMucGFyYW1zLGM9bC5jYW52YXNDb250ZXh0LHU9bC52aWV3cG9ydCxkPWwudHJhbnNmb3JtLGg9bC5pbWFnZUxheWVyLHA9bC5iYWNrZ3JvdW5kO3RoaXMuZ2Z4PW5ldyBfY2FudmFzLkNhbnZhc0dyYXBoaWNzKGMsdGhpcy5jb21tb25PYmpzLHRoaXMub2Jqcyx0aGlzLmNhbnZhc0ZhY3RvcnksdGhpcy53ZWJHTENvbnRleHQsaCxpKTt0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe3RyYW5zZm9ybTpkLHZpZXdwb3J0OnUsdHJhbnNwYXJlbmN5Om8sYmFja2dyb3VuZDpwfSk7dGhpcy5vcGVyYXRvckxpc3RJZHg9MDt0aGlzLmdyYXBoaWNzUmVhZHk9ITA7dGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2smJnRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrKCl9fX0se2tleToiY2FuY2VsIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWwoKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDt0aGlzLnJ1bm5pbmc9ITE7dGhpcy5jYW5jZWxsZWQ9ITA7dGhpcy5nZngmJnRoaXMuZ2Z4LmVuZERyYXdpbmcoKTt0aGlzLl9jYW52YXMmJnQuZGVsZXRlKHRoaXMuX2NhbnZhcyk7dGhpcy5jYWxsYmFjayhyfHxuZXcgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKCJSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICIuY29uY2F0KHRoaXMuX3BhZ2VJbmRleCsxKSwiY2FudmFzIikpfX0se2tleToib3BlcmF0b3JMaXN0Q2hhbmdlZCIsdmFsdWU6ZnVuY3Rpb24gb3BlcmF0b3JMaXN0Q2hhbmdlZCgpe2lmKHRoaXMuZ3JhcGhpY3NSZWFkeSl7dGhpcy5zdGVwcGVyJiZ0aGlzLnN0ZXBwZXIudXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTt0aGlzLnJ1bm5pbmd8fHRoaXMuX2NvbnRpbnVlKCl9ZWxzZSB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFja3x8KHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrPXRoaXMuX2NvbnRpbnVlQm91bmQpfX0se2tleToiX2NvbnRpbnVlIix2YWx1ZTpmdW5jdGlvbiBfY29udGludWUoKXt0aGlzLnJ1bm5pbmc9ITA7dGhpcy5jYW5jZWxsZWR8fCh0aGlzLnRhc2sub25Db250aW51ZT90aGlzLnRhc2sub25Db250aW51ZSh0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCk6dGhpcy5fc2NoZWR1bGVOZXh0KCkpfX0se2tleToiX3NjaGVkdWxlTmV4dCIsdmFsdWU6ZnVuY3Rpb24gX3NjaGVkdWxlTmV4dCgpe3ZhciB0PXRoaXM7dGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dC5fbmV4dEJvdW5kKCkuY2F0Y2godC5jYW5jZWwuYmluZCh0KSl9KSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbih0aGlzLl9uZXh0Qm91bmQpLmNhdGNoKHRoaXMuY2FuY2VsLmJpbmQodGhpcykpfX0se2tleToiX25leHQiLHZhbHVlOihyPV9hc3luY1RvR2VuZXJhdG9yKF9yZWdlbmVyYXRvci5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUyKCl7cmV0dXJuIF9yZWdlbmVyYXRvci5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUyJChyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDppZighdGhpcy5jYW5jZWxsZWQpe3IubmV4dD0yO2JyZWFrfXJldHVybiByLmFicnVwdCgicmV0dXJuIik7Y2FzZSAyOnRoaXMub3BlcmF0b3JMaXN0SWR4PXRoaXMuZ2Z4LmV4ZWN1dGVPcGVyYXRvckxpc3QodGhpcy5vcGVyYXRvckxpc3QsdGhpcy5vcGVyYXRvckxpc3RJZHgsdGhpcy5fY29udGludWVCb3VuZCx0aGlzLnN0ZXBwZXIpO2lmKHRoaXMub3BlcmF0b3JMaXN0SWR4PT09dGhpcy5vcGVyYXRvckxpc3QuYXJnc0FycmF5Lmxlbmd0aCl7dGhpcy5ydW5uaW5nPSExO2lmKHRoaXMub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayl7dGhpcy5nZnguZW5kRHJhd2luZygpO3RoaXMuX2NhbnZhcyYmdC5kZWxldGUodGhpcy5fY2FudmFzKTt0aGlzLmNhbGxiYWNrKCl9fWNhc2UgNDpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLF9jYWxsZWUyLHRoaXMpfSkpKSxmdW5jdGlvbiBfbmV4dCgpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJjb21wbGV0ZWQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5jYXBhYmlsaXR5LnByb21pc2UuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpfX1dKTt2YXIgcjtyZXR1cm4gSW50ZXJuYWxSZW5kZXJUYXNrfSgpfSgpLHZlcnNpb249IjIuNi4zNDciO2V4cG9ydHMudmVyc2lvbj12ZXJzaW9uO3ZhciBidWlsZD0iM2JlOWM2NWYiO2V4cG9ydHMuYnVpbGQ9YnVpbGR9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuRm9udExvYWRlcj1yLkZvbnRGYWNlT2JqZWN0PXZvaWQgMDt2YXIgbz1mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oYSgyKSksaT1hKDUpO2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxvPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgaT1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChvLGFyZ3VtZW50cyxpKX1lbHNlIGE9by5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxyLGEsbyxpLGwsYyl7dHJ5e3ZhciB1PXRbbF0oYyksZD11LnZhbHVlfWNhdGNoKHQpe2EodCk7cmV0dXJufXUuZG9uZT9yKGQpOlByb21pc2UucmVzb2x2ZShkKS50aGVuKG8saSl9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIG89clthXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMTtvLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9dmFyIGwsYz1mdW5jdGlvbigpe2Z1bmN0aW9uIEJhc2VGb250TG9hZGVyKHQpe3ZhciByPXQuZG9jSWQsYT10Lm9uVW5zdXBwb3J0ZWRGZWF0dXJlLG89dC5vd25lckRvY3VtZW50LGw9dm9pZCAwPT09bz9nbG9iYWxUaGlzLmRvY3VtZW50Om87X2NsYXNzQ2FsbENoZWNrKHRoaXMsQmFzZUZvbnRMb2FkZXIpO3RoaXMuY29uc3RydWN0b3I9PT1CYXNlRm9udExvYWRlciYmKDAsaS51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGb250TG9hZGVyLiIpO3RoaXMuZG9jSWQ9cjt0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZT1hO3RoaXMuX2RvY3VtZW50PWw7dGhpcy5uYXRpdmVGb250RmFjZXM9W107dGhpcy5zdHlsZUVsZW1lbnQ9bnVsbH1fY3JlYXRlQ2xhc3MoQmFzZUZvbnRMb2FkZXIsW3trZXk6ImFkZE5hdGl2ZUZvbnRGYWNlIix2YWx1ZTpmdW5jdGlvbiBhZGROYXRpdmVGb250RmFjZSh0KXt0aGlzLm5hdGl2ZUZvbnRGYWNlcy5wdXNoKHQpO3RoaXMuX2RvY3VtZW50LmZvbnRzLmFkZCh0KX19LHtrZXk6Imluc2VydFJ1bGUiLHZhbHVlOmZ1bmN0aW9uIGluc2VydFJ1bGUodCl7dmFyIHI9dGhpcy5zdHlsZUVsZW1lbnQ7aWYoIXIpeyhyPXRoaXMuc3R5bGVFbGVtZW50PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmlkPSJQREZKU19GT05UX1NUWUxFX1RBR18iLmNvbmNhdCh0aGlzLmRvY0lkKTt0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChyKX12YXIgYT1yLnNoZWV0O2EuaW5zZXJ0UnVsZSh0LGEuY3NzUnVsZXMubGVuZ3RoKX19LHtrZXk6ImNsZWFyIix2YWx1ZTpmdW5jdGlvbiBjbGVhcigpe3ZhciB0PXRoaXM7dGhpcy5uYXRpdmVGb250RmFjZXMuZm9yRWFjaCgoZnVuY3Rpb24ocil7dC5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKHIpfSkpO3RoaXMubmF0aXZlRm9udEZhY2VzLmxlbmd0aD0wO2lmKHRoaXMuc3R5bGVFbGVtZW50KXt0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTt0aGlzLnN0eWxlRWxlbWVudD1udWxsfX19LHtrZXk6ImJpbmQiLHZhbHVlOih0PWZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsYT1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe3ZhciBsPXQuYXBwbHkocixhKTtmdW5jdGlvbiBfbmV4dCh0KXthc3luY0dlbmVyYXRvclN0ZXAobCxvLGksX25leHQsX3Rocm93LCJuZXh0Iix0KX1mdW5jdGlvbiBfdGhyb3codCl7YXN5bmNHZW5lcmF0b3JTdGVwKGwsbyxpLF9uZXh0LF90aHJvdywidGhyb3ciLHQpfV9uZXh0KHZvaWQgMCl9KSl9fShvLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSh0KXt2YXIgcixhLGw9dGhpcztyZXR1cm4gby5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUkKG8pe2Zvcig7Oylzd2l0Y2goby5wcmV2PW8ubmV4dCl7Y2FzZSAwOmlmKCF0LmF0dGFjaGVkJiYhdC5taXNzaW5nRmlsZSl7by5uZXh0PTI7YnJlYWt9cmV0dXJuIG8uYWJydXB0KCJyZXR1cm4iKTtjYXNlIDI6dC5hdHRhY2hlZD0hMDtpZighdGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKXtvLm5leHQ9MTk7YnJlYWt9aWYoIShyPXQuY3JlYXRlTmF0aXZlRm9udEZhY2UoKSkpe28ubmV4dD0xODticmVha310aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKHIpO28ucHJldj03O28ubmV4dD0xMDtyZXR1cm4gci5sb2FkZWQ7Y2FzZSAxMDpvLm5leHQ9MTg7YnJlYWs7Y2FzZSAxMjpvLnByZXY9MTI7by50MD1vLmNhdGNoKDcpO3RoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlKHtmZWF0dXJlSWQ6aS5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRMb2FkTmF0aXZlfSk7KDAsaS53YXJuKSgiRmFpbGVkIHRvIGxvYWQgZm9udCAnIi5jb25jYXQoci5mYW1pbHksIic6ICciKS5jb25jYXQoby50MCwiJy4iKSk7dC5kaXNhYmxlRm9udEZhY2U9ITA7dGhyb3cgby50MDtjYXNlIDE4OnJldHVybiBvLmFicnVwdCgicmV0dXJuIik7Y2FzZSAxOTppZighKGE9dC5jcmVhdGVGb250RmFjZVJ1bGUoKSkpe28ubmV4dD0yNjticmVha310aGlzLmluc2VydFJ1bGUoYSk7aWYoIXRoaXMuaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQpe28ubmV4dD0yNDticmVha31yZXR1cm4gby5hYnJ1cHQoInJldHVybiIpO2Nhc2UgMjQ6by5uZXh0PTI2O3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocil7dmFyIG89bC5fcXVldWVMb2FkaW5nQ2FsbGJhY2socik7bC5fcHJlcGFyZUZvbnRMb2FkRXZlbnQoW2FdLFt0XSxvKX0pKTtjYXNlIDI2OmNhc2UiZW5kIjpyZXR1cm4gby5zdG9wKCl9fSksX2NhbGxlZSx0aGlzLFtbNywxMl1dKX0pKSksZnVuY3Rpb24gYmluZChyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiX3F1ZXVlTG9hZGluZ0NhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbiBfcXVldWVMb2FkaW5nQ2FsbGJhY2sodCl7KDAsaS51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrYC4iKX19LHtrZXk6Il9wcmVwYXJlRm9udExvYWRFdmVudCIsdmFsdWU6ZnVuY3Rpb24gX3ByZXBhcmVGb250TG9hZEV2ZW50KHQscixhKXsoMCxpLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfcHJlcGFyZUZvbnRMb2FkRXZlbnRgLiIpfX0se2tleToiaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXZvaWQgMCE9PXRoaXMuX2RvY3VtZW50JiYhIXRoaXMuX2RvY3VtZW50LmZvbnRzO3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkIix0KX19LHtrZXk6ImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7KDAsaS51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRgLiIpfX0se2tleToiX2xvYWRUZXN0Rm9udCIsZ2V0OmZ1bmN0aW9uIGdldCgpeygwLGkudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYF9sb2FkVGVzdEZvbnRgLiIpfX1dKTt2YXIgdDtyZXR1cm4gQmFzZUZvbnRMb2FkZXJ9KCk7ci5Gb250TG9hZGVyPWw7ci5Gb250TG9hZGVyPWw9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uIF9pbmhlcml0cyh0LHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByJiZudWxsIT09cil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtyJiZfc2V0UHJvdG90eXBlT2YodCxyKX0oR2VuZXJpY0ZvbnRMb2FkZXIsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKEdlbmVyaWNGb250TG9hZGVyKTtmdW5jdGlvbiBHZW5lcmljRm9udExvYWRlcih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxHZW5lcmljRm9udExvYWRlcik7KGE9ci5jYWxsKHRoaXMsdCkpLmxvYWRpbmdDb250ZXh0PXtyZXF1ZXN0czpbXSxuZXh0UmVxdWVzdElkOjB9O2EubG9hZFRlc3RGb250SWQ9MDtyZXR1cm4gYX1fY3JlYXRlQ2xhc3MoR2VuZXJpY0ZvbnRMb2FkZXIsW3trZXk6Il9xdWV1ZUxvYWRpbmdDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24gX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHQpe3ZhciByPXRoaXMubG9hZGluZ0NvbnRleHQsYT17aWQ6InBkZmpzLWZvbnQtbG9hZGluZy0iLmNvbmNhdChyLm5leHRSZXF1ZXN0SWQrKyksZG9uZTohMSxjb21wbGV0ZTpmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKXsoMCxpLmFzc2VydCkoIWEuZG9uZSwiY29tcGxldGVSZXF1ZXN0KCkgY2Fubm90IGJlIGNhbGxlZCB0d2ljZS4iKTthLmRvbmU9ITA7Zm9yKDtyLnJlcXVlc3RzLmxlbmd0aD4wJiZyLnJlcXVlc3RzWzBdLmRvbmU7KXt2YXIgdD1yLnJlcXVlc3RzLnNoaWZ0KCk7c2V0VGltZW91dCh0LmNhbGxiYWNrLDApfX0sY2FsbGJhY2s6dH07ci5yZXF1ZXN0cy5wdXNoKGEpO3JldHVybiBhfX0se2tleToiX3ByZXBhcmVGb250TG9hZEV2ZW50Iix2YWx1ZTpmdW5jdGlvbiBfcHJlcGFyZUZvbnRMb2FkRXZlbnQodCxyLGEpe3ZhciBvLGwsYz10aGlzO2Z1bmN0aW9uIGludDMyKHQscil7cmV0dXJuIHQuY2hhckNvZGVBdChyKTw8MjR8dC5jaGFyQ29kZUF0KHIrMSk8PDE2fHQuY2hhckNvZGVBdChyKzIpPDw4fDI1NSZ0LmNoYXJDb2RlQXQociszKX1mdW5jdGlvbiBzcGxpY2VTdHJpbmcodCxyLGEsbyl7cmV0dXJuIHQuc3Vic3RyaW5nKDAscikrbyt0LnN1YnN0cmluZyhyK2EpfXZhciB1PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Uud2lkdGg9MTt1LmhlaWdodD0xO3ZhciBkPXUuZ2V0Q29udGV4dCgiMmQiKSxoPTA7dmFyIHA9Imx0Ii5jb25jYXQoRGF0ZS5ub3coKSkuY29uY2F0KHRoaXMubG9hZFRlc3RGb250SWQrKyksbT10aGlzLl9sb2FkVGVzdEZvbnQsdj1pbnQzMihtPXNwbGljZVN0cmluZyhtLDk3NixwLmxlbmd0aCxwKSwxNik7Zm9yKG89MCxsPXAubGVuZ3RoLTM7bzxsO28rPTQpdj12LTE0ODIxODQ3OTIraW50MzIocCxvKXwwO288cC5sZW5ndGgmJih2PXYtMTQ4MjE4NDc5MitpbnQzMihwKyJYWFgiLG8pfDApO209c3BsaWNlU3RyaW5nKG0sMTYsNCwoMCxpLnN0cmluZzMyKSh2KSk7dmFyIGc9InVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCIuY29uY2F0KGJ0b2EobSksIik7IikseT0nQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6IicuY29uY2F0KHAsJyI7c3JjOicpLmNvbmNhdChnLCJ9Iik7dGhpcy5pbnNlcnRSdWxlKHkpO3ZhciBiPVtdO2ZvcihvPTAsbD1yLmxlbmd0aDtvPGw7bysrKWIucHVzaChyW29dLmxvYWRlZE5hbWUpO2IucHVzaChwKTt2YXIgXz10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtfLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiI7Xy5zdHlsZS53aWR0aD1fLnN0eWxlLmhlaWdodD0iMTBweCI7Xy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO18uc3R5bGUudG9wPV8uc3R5bGUubGVmdD0iMHB4Ijtmb3Iobz0wLGw9Yi5sZW5ndGg7bzxsOysrbyl7dmFyIFM9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO1MudGV4dENvbnRlbnQ9IkhpIjtTLnN0eWxlLmZvbnRGYW1pbHk9YltvXTtfLmFwcGVuZENoaWxkKFMpfXRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoXyk7IWZ1bmN0aW9uIGlzRm9udFJlYWR5KHQscil7aWYoKytoPjMwKXsoMCxpLndhcm4pKCJMb2FkIHRlc3QgZm9udCBuZXZlciBsb2FkZWQuIik7cigpfWVsc2V7ZC5mb250PSIzMHB4ICIrdDtkLmZpbGxUZXh0KCIuIiwwLDIwKTtkLmdldEltYWdlRGF0YSgwLDAsMSwxKS5kYXRhWzNdPjA/cigpOnNldFRpbWVvdXQoaXNGb250UmVhZHkuYmluZChudWxsLHQscikpfX0ocCwoZnVuY3Rpb24oKXtjLl9kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKF8pO2EuY29tcGxldGUoKX0pKX19LHtrZXk6ImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9ITE7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBuYXZpZ2F0b3IpdD0hMDtlbHNle3ZhciByPS9Nb3ppbGxhXC81LjAuKj9ydjooXGQrKS4qPyBHZWNrby8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KTtyJiZyWzFdPj0xNCYmKHQ9ITApfXJldHVybigwLGkuc2hhZG93KSh0aGlzLCJpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCIsdCl9fSx7a2V5OiJfbG9hZFRlc3RGb250IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsIl9sb2FkVGVzdEZvbnQiLGZ1bmN0aW9uIGdldExvYWRUZXN0Rm9udCgpe3JldHVybiBhdG9iKCJUMVJVVHdBTEFJQUFBd0F3UTBaR0lESHRaZzRBQUFPWUFBQUFnVVpHVkUxbGt6WndBQUFFSEFBQUFCeEhSRVZHQUJRQUZRQUFCRGdBQUFBZVQxTXZNbFlOWXdrQUFBRWdBQUFBWUdOdFlYQUJEUUxVQUFBQ05BQUFBVUpvWldGay94VkZEUUFBQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0FBQUFHYm1GdFpWam1kSDRBQUFHQUFBQUFzWEJ2YzNUL2hnQXpBQUFEZUFBQUFDQUFBUUFBQUFFQUFMWlJGc1JmRHp6MUFBc0Q2QUFBQUFET0JPVExBQUFBQU00S0hEd0FBQUFBQStnRElRQUFBQWdBQWdBQUFBQUFBQUFCQUFBRElRQUFBRm9ENkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ01Bb29DdkFBQUFlQUFNUUVDQUFBQ0FBWUpBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUZCbVJXUUF3QUF1QUM0RElQODRBRm9ESVFBQUFBQUFBUUFBQUFBQUFBQUFBQ0FBSUFBQkFBQUFEZ0N1QUFFQUFBQUFBQUFBQVFBQUFBRUFBQUFBQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUFBUUFBQUFFQUFBQUFBQVlBQVFBQUFBTUFBUVFKQUFBQUFnQUJBQU1BQVFRSkFBRUFBZ0FCQUFNQUFRUUpBQUlBQWdBQkFBTUFBUVFKQUFNQUFnQUJBQU1BQVFRSkFBUUFBZ0FCQUFNQUFRUUpBQVVBQWdBQkFBTUFBUVFKQUFZQUFnQUJXQUJZQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUFBQzcvLy8vVEFBRUFBQUFBQUFBQkJnQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFRRUFBRUJBUUpZQUFFQkFTSDREd0Q0R3dIRUF2Z2NBL2dYQkl3TUFZdUwrbno1dFFYa0Q1ajNDQkxuRVFBQ0FRRUJJVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWUFBQUJBUUFBRHdBQ0FRRUVFL3QzRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGpGUUFBQUFET0JPUXBBQUVBQUFBQUFBQUFEQUFVQUFRQUFBQUJBQUFBQWdBQkFBQUFBQUFBQUFBRDZBQUFBQUFBQUE9PSIpfSgpKX19XSk7cmV0dXJuIEdlbmVyaWNGb250TG9hZGVyfShjKTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIEZvbnRGYWNlT2JqZWN0KHQscil7dmFyIGE9ci5pc0V2YWxTdXBwb3J0ZWQsbz12b2lkIDA9PT1hfHxhLGk9ci5kaXNhYmxlRm9udEZhY2UsbD12b2lkIDAhPT1pJiZpLGM9ci5pZ25vcmVFcnJvcnMsdT12b2lkIDAhPT1jJiZjLGQ9ci5vblVuc3VwcG9ydGVkRmVhdHVyZSxoPXZvaWQgMD09PWQ/bnVsbDpkLHA9ci5mb250UmVnaXN0cnksbT12b2lkIDA9PT1wP251bGw6cDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxGb250RmFjZU9iamVjdCk7dGhpcy5jb21waWxlZEdseXBocz1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcih2YXIgdiBpbiB0KXRoaXNbdl09dFt2XTt0aGlzLmlzRXZhbFN1cHBvcnRlZD0hMSE9PW87dGhpcy5kaXNhYmxlRm9udEZhY2U9ITA9PT1sO3RoaXMuaWdub3JlRXJyb3JzPSEwPT09dTt0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZT1oO3RoaXMuZm9udFJlZ2lzdHJ5PW19X2NyZWF0ZUNsYXNzKEZvbnRGYWNlT2JqZWN0LFt7a2V5OiJjcmVhdGVOYXRpdmVGb250RmFjZSIsdmFsdWU6ZnVuY3Rpb24gY3JlYXRlTmF0aXZlRm9udEZhY2UoKXtpZighdGhpcy5kYXRhfHx0aGlzLmRpc2FibGVGb250RmFjZSlyZXR1cm4gbnVsbDt2YXIgdD1uZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLHRoaXMuZGF0YSx7fSk7dGhpcy5mb250UmVnaXN0cnkmJnRoaXMuZm9udFJlZ2lzdHJ5LnJlZ2lzdGVyRm9udCh0aGlzKTtyZXR1cm4gdH19LHtrZXk6ImNyZWF0ZUZvbnRGYWNlUnVsZSIsdmFsdWU6ZnVuY3Rpb24gY3JlYXRlRm9udEZhY2VSdWxlKCl7aWYoIXRoaXMuZGF0YXx8dGhpcy5kaXNhYmxlRm9udEZhY2UpcmV0dXJuIG51bGw7dmFyIHQ9KDAsaS5ieXRlc1RvU3RyaW5nKShuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKSxyPSJ1cmwoZGF0YToiLmNvbmNhdCh0aGlzLm1pbWV0eXBlLCI7YmFzZTY0LCIpLmNvbmNhdChidG9hKHQpLCIpOyIpLGE9J0Bmb250LWZhY2Uge2ZvbnQtZmFtaWx5OiInLmNvbmNhdCh0aGlzLmxvYWRlZE5hbWUsJyI7c3JjOicpLmNvbmNhdChyLCJ9Iik7dGhpcy5mb250UmVnaXN0cnkmJnRoaXMuZm9udFJlZ2lzdHJ5LnJlZ2lzdGVyRm9udCh0aGlzLHIpO3JldHVybiBhfX0se2tleToiZ2V0UGF0aEdlbmVyYXRvciIsdmFsdWU6ZnVuY3Rpb24gZ2V0UGF0aEdlbmVyYXRvcih0LHIpe2lmKHZvaWQgMCE9PXRoaXMuY29tcGlsZWRHbHlwaHNbcl0pcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbcl07dmFyIGEsbzt0cnl7YT10LmdldCh0aGlzLmxvYWRlZE5hbWUrIl9wYXRoXyIrcil9Y2F0Y2godCl7aWYoIXRoaXMuaWdub3JlRXJyb3JzKXRocm93IHQ7dGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUmJnRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlKHtmZWF0dXJlSWQ6aS5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRHZXRQYXRofSk7KDAsaS53YXJuKSgnZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogIicuY29uY2F0KHQsJyIuJykpO3JldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW3JdPWZ1bmN0aW9uKHQscil7fX1pZih0aGlzLmlzRXZhbFN1cHBvcnRlZCYmaS5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQudmFsdWUpe2Zvcih2YXIgbCxjPSIiLHU9MCxkPWEubGVuZ3RoO3U8ZDt1Kyspe2w9dm9pZCAwIT09KG89YVt1XSkuYXJncz9vLmFyZ3Muam9pbigiLCIpOiIiO2MrPSJjLiIrby5jbWQrIigiK2wrIik7XG4ifXJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW3JdPW5ldyBGdW5jdGlvbigiYyIsInNpemUiLGMpfXJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW3JdPWZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPTAsbD1hLmxlbmd0aDtpPGw7aSsrKXsic2NhbGUiPT09KG89YVtpXSkuY21kJiYoby5hcmdzPVtyLC1yXSk7dFtvLmNtZF0uYXBwbHkodCxvLmFyZ3MpfX19fV0pO3JldHVybiBGb250RmFjZU9iamVjdH0oKTtyLkZvbnRGYWNlT2JqZWN0PXV9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuTm9kZUNNYXBSZWFkZXJGYWN0b3J5PXIuTm9kZUNhbnZhc0ZhY3Rvcnk9dm9pZCAwO3ZhciBvPWEoMSksaT1hKDcpLGw9YSg1KTtmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fWZ1bmN0aW9uIF9pbmhlcml0cyh0LHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByJiZudWxsIT09cil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtyJiZfc2V0UHJvdG90eXBlT2YodCxyKX1mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXtyZXR1cm4oX3NldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7dC5fX3Byb3RvX189cjtyZXR1cm4gdH0pKHQscil9ZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKHQpe3ZhciByPWZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7RGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSk7cmV0dXJuITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpe3ZhciBhLG89X2dldFByb3RvdHlwZU9mKHQpO2lmKHIpe3ZhciBpPV9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjthPVJlZmxlY3QuY29uc3RydWN0KG8sYXJndW1lbnRzLGkpfWVsc2UgYT1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcyxhKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCxyKXtyZXR1cm4hcnx8Im9iamVjdCIhPT1fdHlwZW9mKHIpJiYiZnVuY3Rpb24iIT10eXBlb2Ygcj9mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH0odCk6cn1mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuKF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciBjPWZ1bmN0aW9uIE5vZGVDYW52YXNGYWN0b3J5KCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTm9kZUNhbnZhc0ZhY3RvcnkpOygwLGwudW5yZWFjaGFibGUpKCJOb3QgaW1wbGVtZW50ZWQ6IE5vZGVDYW52YXNGYWN0b3J5Iil9O3IuTm9kZUNhbnZhc0ZhY3Rvcnk9Yzt2YXIgdT1mdW5jdGlvbiBOb2RlQ01hcFJlYWRlckZhY3RvcnkoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxOb2RlQ01hcFJlYWRlckZhY3RvcnkpOygwLGwudW5yZWFjaGFibGUpKCJOb3QgaW1wbGVtZW50ZWQ6IE5vZGVDTWFwUmVhZGVyRmFjdG9yeSIpfTtyLk5vZGVDTWFwUmVhZGVyRmFjdG9yeT11O2lmKGkuaXNOb2RlSlMpe3IuTm9kZUNhbnZhc0ZhY3Rvcnk9Yz1mdW5jdGlvbih0KXtfaW5oZXJpdHMoTm9kZUNhbnZhc0ZhY3RvcnksdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKE5vZGVDYW52YXNGYWN0b3J5KTtmdW5jdGlvbiBOb2RlQ2FudmFzRmFjdG9yeSgpe19jbGFzc0NhbGxDaGVjayh0aGlzLE5vZGVDYW52YXNGYWN0b3J5KTtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9X2NyZWF0ZUNsYXNzKE5vZGVDYW52YXNGYWN0b3J5LFt7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZSh0LHIpe2lmKHQ8PTB8fHI8PTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIik7dmFyIGE9cmVxdWlyZSgiY2FudmFzIikuY3JlYXRlQ2FudmFzKHQscik7cmV0dXJue2NhbnZhczphLGNvbnRleHQ6YS5nZXRDb250ZXh0KCIyZCIpfX19XSk7cmV0dXJuIE5vZGVDYW52YXNGYWN0b3J5fShvLkJhc2VDYW52YXNGYWN0b3J5KTtyLk5vZGVDTWFwUmVhZGVyRmFjdG9yeT11PWZ1bmN0aW9uKHQpe19pbmhlcml0cyhOb2RlQ01hcFJlYWRlckZhY3RvcnksdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKE5vZGVDTWFwUmVhZGVyRmFjdG9yeSk7ZnVuY3Rpb24gTm9kZUNNYXBSZWFkZXJGYWN0b3J5KCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTm9kZUNNYXBSZWFkZXJGYWN0b3J5KTtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9X2NyZWF0ZUNsYXNzKE5vZGVDTWFwUmVhZGVyRmFjdG9yeSxbe2tleToiX2ZldGNoRGF0YSIsdmFsdWU6ZnVuY3Rpb24gX2ZldGNoRGF0YSh0LHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oYSxvKXtyZXF1aXJlKCJmcyIpLnJlYWRGaWxlKHQsKGZ1bmN0aW9uKHQsaSl7IXQmJmk/YSh7Y01hcERhdGE6bmV3IFVpbnQ4QXJyYXkoaSksY29tcHJlc3Npb25UeXBlOnJ9KTpvKG5ldyBFcnJvcih0KSl9KSl9KSl9fV0pO3JldHVybiBOb2RlQ01hcFJlYWRlckZhY3Rvcnl9KG8uQmFzZUNNYXBSZWFkZXJGYWN0b3J5KX19LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuQW5ub3RhdGlvblN0b3JhZ2U9dm9pZCAwO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBBbm5vdGF0aW9uU3RvcmFnZSgpeyFmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxBbm5vdGF0aW9uU3RvcmFnZSk7dGhpcy5fc3RvcmFnZT1uZXcgTWFwO3RoaXMuX21vZGlmaWVkPSExO3RoaXMub25TZXRNb2RpZmllZD1udWxsO3RoaXMub25SZXNldE1vZGlmaWVkPW51bGx9IWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH0oQW5ub3RhdGlvblN0b3JhZ2UsW3trZXk6ImdldE9yQ3JlYXRlVmFsdWUiLHZhbHVlOmZ1bmN0aW9uIGdldE9yQ3JlYXRlVmFsdWUodCxyKXtpZih0aGlzLl9zdG9yYWdlLmhhcyh0KSlyZXR1cm4gdGhpcy5fc3RvcmFnZS5nZXQodCk7dGhpcy5fc3RvcmFnZS5zZXQodCxyKTtyZXR1cm4gcn19LHtrZXk6InNldFZhbHVlIix2YWx1ZTpmdW5jdGlvbiBzZXRWYWx1ZSh0LHIpe3RoaXMuX3N0b3JhZ2UuZ2V0KHQpIT09ciYmdGhpcy5fc2V0TW9kaWZpZWQoKTt0aGlzLl9zdG9yYWdlLnNldCh0LHIpfX0se2tleToiZ2V0QWxsIix2YWx1ZTpmdW5jdGlvbiBnZXRBbGwoKXtyZXR1cm4gMD09PXRoaXMuX3N0b3JhZ2Uuc2l6ZT9udWxsOk9iamVjdC5mcm9tRW50cmllcyh0aGlzLl9zdG9yYWdlKX19LHtrZXk6Il9zZXRNb2RpZmllZCIsdmFsdWU6ZnVuY3Rpb24gX3NldE1vZGlmaWVkKCl7aWYoIXRoaXMuX21vZGlmaWVkKXt0aGlzLl9tb2RpZmllZD0hMDsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vblNldE1vZGlmaWVkJiZ0aGlzLm9uU2V0TW9kaWZpZWQoKX19fSx7a2V5OiJyZXNldE1vZGlmaWVkIix2YWx1ZTpmdW5jdGlvbiByZXNldE1vZGlmaWVkKCl7aWYodGhpcy5fbW9kaWZpZWQpe3RoaXMuX21vZGlmaWVkPSExOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9uUmVzZXRNb2RpZmllZCYmdGhpcy5vblJlc2V0TW9kaWZpZWQoKX19fSx7a2V5OiJzaXplIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3N0b3JhZ2Uuc2l6ZX19XSk7cmV0dXJuIEFubm90YXRpb25TdG9yYWdlfSgpO3IuQW5ub3RhdGlvblN0b3JhZ2U9b30sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5hcGlDb21wYXRpYmlsaXR5UGFyYW1zPXZvaWQgMDt2YXIgbz1hKDcpLGk9T2JqZWN0LmNyZWF0ZShudWxsKTshZnVuY3Rpb24gY2hlY2tGb250RmFjZSgpe28uaXNOb2RlSlMmJihpLmRpc2FibGVGb250RmFjZT0hMCl9KCk7dmFyIGw9T2JqZWN0LmZyZWV6ZShpKTtyLmFwaUNvbXBhdGliaWxpdHlQYXJhbXM9bH0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5DYW52YXNHcmFwaGljcz12b2lkIDA7dmFyIG89YSg1KSxpPWEoMjA4KTtmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0LHIpe3ZhciBhO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgU3ltYm9sfHxudWxsPT10W1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkodCl8fChhPWZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSh0LHIpe2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscik7dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpOyJPYmplY3QiPT09YSYmdC5jb25zdHJ1Y3RvciYmKGE9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PWF8fCJTZXQiPT09YSlyZXR1cm4gQXJyYXkuZnJvbSh0KTtpZigiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpKXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpfSh0KSl8fHImJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe2EmJih0PWEpO3ZhciBvPTAsaT1mdW5jdGlvbiBGKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24gbigpe3JldHVybiBvPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtvKytdfX0sZTpmdW5jdGlvbiBlKHQpe3Rocm93IHR9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBsLGM9ITAsdT0hMTtyZXR1cm57czpmdW5jdGlvbiBzKCl7YT10W1N5bWJvbC5pdGVyYXRvcl0oKX0sbjpmdW5jdGlvbiBuKCl7dmFyIHQ9YS5uZXh0KCk7Yz10LmRvbmU7cmV0dXJuIHR9LGU6ZnVuY3Rpb24gZSh0KXt1PSEwO2w9dH0sZjpmdW5jdGlvbiBmKCl7dHJ5e2N8fG51bGw9PWEucmV0dXJufHxhLnJldHVybigpfWZpbmFsbHl7aWYodSl0aHJvdyBsfX19fWZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHQscil7KG51bGw9PXJ8fHI+dC5sZW5ndGgpJiYocj10Lmxlbmd0aCk7Zm9yKHZhciBhPTAsbz1uZXcgQXJyYXkocik7YTxyO2ErKylvW2FdPXRbYV07cmV0dXJuIG99ZnVuY3Rpb24gYWRkQ29udGV4dEN1cnJlbnRUcmFuc2Zvcm0odCl7aWYoIXQubW96Q3VycmVudFRyYW5zZm9ybSl7dC5fb3JpZ2luYWxTYXZlPXQuc2F2ZTt0Ll9vcmlnaW5hbFJlc3RvcmU9dC5yZXN0b3JlO3QuX29yaWdpbmFsUm90YXRlPXQucm90YXRlO3QuX29yaWdpbmFsU2NhbGU9dC5zY2FsZTt0Ll9vcmlnaW5hbFRyYW5zbGF0ZT10LnRyYW5zbGF0ZTt0Ll9vcmlnaW5hbFRyYW5zZm9ybT10LnRyYW5zZm9ybTt0Ll9vcmlnaW5hbFNldFRyYW5zZm9ybT10LnNldFRyYW5zZm9ybTt0Ll90cmFuc2Zvcm1NYXRyaXg9dC5fdHJhbnNmb3JtTWF0cml4fHxbMSwwLDAsMSwwLDBdO3QuX3RyYW5zZm9ybVN0YWNrPVtdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJtb3pDdXJyZW50VHJhbnNmb3JtIix7Z2V0OmZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm0oKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtTWF0cml4fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJtb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSIse2dldDpmdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSgpe3ZhciB0PXRoaXMuX3RyYW5zZm9ybU1hdHJpeCxyPXRbMF0sYT10WzFdLG89dFsyXSxpPXRbM10sbD10WzRdLGM9dFs1XSx1PXIqaS1hKm8sZD1hKm8tcippO3JldHVybltpL3UsYS9kLG8vZCxyL3UsKGkqbC1vKmMpL2QsKGEqbC1yKmMpL3VdfX0pO3Quc2F2ZT1mdW5jdGlvbiBjdHhTYXZlKCl7dmFyIHQ9dGhpcy5fdHJhbnNmb3JtTWF0cml4O3RoaXMuX3RyYW5zZm9ybVN0YWNrLnB1c2godCk7dGhpcy5fdHJhbnNmb3JtTWF0cml4PXQuc2xpY2UoMCw2KTt0aGlzLl9vcmlnaW5hbFNhdmUoKX07dC5yZXN0b3JlPWZ1bmN0aW9uIGN0eFJlc3RvcmUoKXt2YXIgdD10aGlzLl90cmFuc2Zvcm1TdGFjay5wb3AoKTtpZih0KXt0aGlzLl90cmFuc2Zvcm1NYXRyaXg9dDt0aGlzLl9vcmlnaW5hbFJlc3RvcmUoKX19O3QudHJhbnNsYXRlPWZ1bmN0aW9uIGN0eFRyYW5zbGF0ZSh0LHIpe3ZhciBhPXRoaXMuX3RyYW5zZm9ybU1hdHJpeDthWzRdPWFbMF0qdCthWzJdKnIrYVs0XTthWzVdPWFbMV0qdCthWzNdKnIrYVs1XTt0aGlzLl9vcmlnaW5hbFRyYW5zbGF0ZSh0LHIpfTt0LnNjYWxlPWZ1bmN0aW9uIGN0eFNjYWxlKHQscil7dmFyIGE9dGhpcy5fdHJhbnNmb3JtTWF0cml4O2FbMF09YVswXSp0O2FbMV09YVsxXSp0O2FbMl09YVsyXSpyO2FbM109YVszXSpyO3RoaXMuX29yaWdpbmFsU2NhbGUodCxyKX07dC50cmFuc2Zvcm09ZnVuY3Rpb24gY3R4VHJhbnNmb3JtKHIsYSxvLGksbCxjKXt2YXIgdT10aGlzLl90cmFuc2Zvcm1NYXRyaXg7dGhpcy5fdHJhbnNmb3JtTWF0cml4PVt1WzBdKnIrdVsyXSphLHVbMV0qcit1WzNdKmEsdVswXSpvK3VbMl0qaSx1WzFdKm8rdVszXSppLHVbMF0qbCt1WzJdKmMrdVs0XSx1WzFdKmwrdVszXSpjK3VbNV1dO3QuX29yaWdpbmFsVHJhbnNmb3JtKHIsYSxvLGksbCxjKX07dC5zZXRUcmFuc2Zvcm09ZnVuY3Rpb24gY3R4U2V0VHJhbnNmb3JtKHIsYSxvLGksbCxjKXt0aGlzLl90cmFuc2Zvcm1NYXRyaXg9W3IsYSxvLGksbCxjXTt0Ll9vcmlnaW5hbFNldFRyYW5zZm9ybShyLGEsbyxpLGwsYyl9O3Qucm90YXRlPWZ1bmN0aW9uIGN0eFJvdGF0ZSh0KXt2YXIgcj1NYXRoLmNvcyh0KSxhPU1hdGguc2luKHQpLG89dGhpcy5fdHJhbnNmb3JtTWF0cml4O3RoaXMuX3RyYW5zZm9ybU1hdHJpeD1bb1swXSpyK29bMl0qYSxvWzFdKnIrb1szXSphLG9bMF0qLWErb1syXSpyLG9bMV0qLWErb1szXSpyLG9bNF0sb1s1XV07dGhpcy5fb3JpZ2luYWxSb3RhdGUodCl9fX12YXIgbD1mdW5jdGlvbiBDYWNoZWRDYW52YXNlc0Nsb3N1cmUoKXtmdW5jdGlvbiBDYWNoZWRDYW52YXNlcyh0KXt0aGlzLmNhbnZhc0ZhY3Rvcnk9dDt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCl9Q2FjaGVkQ2FudmFzZXMucHJvdG90eXBlPXtnZXRDYW52YXM6ZnVuY3Rpb24gQ2FjaGVkQ2FudmFzZXNfZ2V0Q2FudmFzKHQscixhLG8pe3ZhciBpO2lmKHZvaWQgMCE9PXRoaXMuY2FjaGVbdF0pe2k9dGhpcy5jYWNoZVt0XTt0aGlzLmNhbnZhc0ZhY3RvcnkucmVzZXQoaSxyLGEpO2kuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApfWVsc2V7aT10aGlzLmNhbnZhc0ZhY3RvcnkuY3JlYXRlKHIsYSk7dGhpcy5jYWNoZVt0XT1pfW8mJmFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGkuY29udGV4dCk7cmV0dXJuIGl9LGNsZWFyOmZ1bmN0aW9uIGNsZWFyKCl7Zm9yKHZhciB0IGluIHRoaXMuY2FjaGUpe3ZhciByPXRoaXMuY2FjaGVbdF07dGhpcy5jYW52YXNGYWN0b3J5LmRlc3Ryb3kocik7ZGVsZXRlIHRoaXMuY2FjaGVbdF19fX07cmV0dXJuIENhY2hlZENhbnZhc2VzfSgpO3ZhciBjPWZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGVDbG9zdXJlKCl7ZnVuY3Rpb24gQ2FudmFzRXh0cmFTdGF0ZSgpe3RoaXMuYWxwaGFJc1NoYXBlPSExO3RoaXMuZm9udFNpemU9MDt0aGlzLmZvbnRTaXplU2NhbGU9MTt0aGlzLnRleHRNYXRyaXg9by5JREVOVElUWV9NQVRSSVg7dGhpcy50ZXh0TWF0cml4U2NhbGU9MTt0aGlzLmZvbnRNYXRyaXg9by5GT05UX0lERU5USVRZX01BVFJJWDt0aGlzLmxlYWRpbmc9MDt0aGlzLng9MDt0aGlzLnk9MDt0aGlzLmxpbmVYPTA7dGhpcy5saW5lWT0wO3RoaXMuY2hhclNwYWNpbmc9MDt0aGlzLndvcmRTcGFjaW5nPTA7dGhpcy50ZXh0SFNjYWxlPTE7dGhpcy50ZXh0UmVuZGVyaW5nTW9kZT1vLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7dGhpcy50ZXh0UmlzZT0wO3RoaXMuZmlsbENvbG9yPSIjMDAwMDAwIjt0aGlzLnN0cm9rZUNvbG9yPSIjMDAwMDAwIjt0aGlzLnBhdHRlcm5GaWxsPSExO3RoaXMuZmlsbEFscGhhPTE7dGhpcy5zdHJva2VBbHBoYT0xO3RoaXMubGluZVdpZHRoPTE7dGhpcy5hY3RpdmVTTWFzaz1udWxsO3RoaXMucmVzdW1lU01hc2tDdHg9bnVsbDt0aGlzLnRyYW5zZmVyTWFwcz1udWxsfUNhbnZhc0V4dHJhU3RhdGUucHJvdG90eXBlPXtjbG9uZTpmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlX2Nsb25lKCl7cmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyl9LHNldEN1cnJlbnRQb2ludDpmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlX3NldEN1cnJlbnRQb2ludCh0LHIpe3RoaXMueD10O3RoaXMueT1yfX07cmV0dXJuIENhbnZhc0V4dHJhU3RhdGV9KCksdT1mdW5jdGlvbiBDYW52YXNHcmFwaGljc0Nsb3N1cmUoKXtmdW5jdGlvbiBDYW52YXNHcmFwaGljcyh0LHIsYSxvLGksdSxkKXt0aGlzLmN0eD10O3RoaXMuY3VycmVudD1uZXcgYzt0aGlzLnN0YXRlU3RhY2s9W107dGhpcy5wZW5kaW5nQ2xpcD1udWxsO3RoaXMucGVuZGluZ0VPRmlsbD0hMTt0aGlzLnJlcz1udWxsO3RoaXMueG9ianM9bnVsbDt0aGlzLmNvbW1vbk9ianM9cjt0aGlzLm9ianM9YTt0aGlzLmNhbnZhc0ZhY3Rvcnk9bzt0aGlzLndlYkdMQ29udGV4dD1pO3RoaXMuaW1hZ2VMYXllcj11O3RoaXMuZ3JvdXBTdGFjaz1bXTt0aGlzLnByb2Nlc3NpbmdUeXBlMz1udWxsO3RoaXMuYmFzZVRyYW5zZm9ybT1udWxsO3RoaXMuYmFzZVRyYW5zZm9ybVN0YWNrPVtdO3RoaXMuZ3JvdXBMZXZlbD0wO3RoaXMuc21hc2tTdGFjaz1bXTt0aGlzLnNtYXNrQ291bnRlcj0wO3RoaXMudGVtcFNNYXNrPW51bGw7dGhpcy5jb250ZW50VmlzaWJsZT0hMDt0aGlzLm1hcmtlZENvbnRlbnRTdGFjaz1bXTt0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZz1kO3RoaXMuY2FjaGVkQ2FudmFzZXM9bmV3IGwodGhpcy5jYW52YXNGYWN0b3J5KTt0JiZhZGRDb250ZXh0Q3VycmVudFRyYW5zZm9ybSh0KTt0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoPW51bGx9ZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VEYXRhKHQscil7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZURhdGEmJnIgaW5zdGFuY2VvZiBJbWFnZURhdGEpdC5wdXRJbWFnZURhdGEociwwLDApO2Vsc2V7dmFyIGksbCxjLHUsZCxoLHAsbSx2LGc9ci5oZWlnaHQseT1yLndpZHRoLGI9ZyUxNixfPShnLWIpLzE2LFM9MD09PWI/XzpfKzEsQz10LmNyZWF0ZUltYWdlRGF0YSh5LDE2KSxBPTAsUj1yLmRhdGEsaz1DLmRhdGE7aWYoYSlzd2l0Y2goYS5sZW5ndGgpe2Nhc2UgMTpoPWFbMF07cD1hWzBdO209YVswXTt2PWFbMF07YnJlYWs7Y2FzZSA0Omg9YVswXTtwPWFbMV07bT1hWzJdO3Y9YVszXX1pZihyLmtpbmQ9PT1vLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCl7dmFyIHc9Ui5ieXRlTGVuZ3RoLFA9bmV3IFVpbnQzMkFycmF5KGsuYnVmZmVyLDAsay5ieXRlTGVuZ3RoPj4yKSx4PVAubGVuZ3RoLFQ9eSs3Pj4zLEU9NDI5NDk2NzI5NSxPPW8uSXNMaXR0bGVFbmRpYW5DYWNoZWQudmFsdWU/NDI3ODE5MDA4MDoyNTU7aWYodiYmMjU1PT09dlswXSYmMD09PXZbMjU1XSl7dmFyIEk9W08sRV07RT1JWzBdO089SVsxXX1mb3IobD0wO2w8UztsKyspe3U9bDxfPzE2OmI7aT0wO2ZvcihjPTA7Yzx1O2MrKyl7Zm9yKHZhciBEPXctQSxMPTAsTT1EPlQ/eTo4KkQtNyxXPS04Jk0saj0wLE49MDtMPFc7TCs9OCl7Tj1SW0ErK107UFtpKytdPTEyOCZOP0U6TztQW2krK109NjQmTj9FOk87UFtpKytdPTMyJk4/RTpPO1BbaSsrXT0xNiZOP0U6TztQW2krK109OCZOP0U6TztQW2krK109NCZOP0U6TztQW2krK109MiZOP0U6TztQW2krK109MSZOP0U6T31mb3IoO0w8TTtMKyspe2lmKDA9PT1qKXtOPVJbQSsrXTtqPTEyOH1QW2krK109TiZqP0U6TztqPj49MX19Zm9yKDtpPHg7KVBbaSsrXT0wO3QucHV0SW1hZ2VEYXRhKEMsMCwxNipsKX19ZWxzZSBpZihyLmtpbmQ9PT1vLkltYWdlS2luZC5SR0JBXzMyQlBQKXt2YXIgQj0hIShofHxwfHxtKTtjPTA7ZD0xNip5KjQ7Zm9yKGw9MDtsPF87bCsrKXtrLnNldChSLnN1YmFycmF5KEEsQStkKSk7QSs9ZDtpZihCKWZvcih2YXIgcT0wO3E8ZDtxKz00KXtoJiYoa1txKzBdPWhba1txKzBdXSk7cCYmKGtbcSsxXT1wW2tbcSsxXV0pO20mJihrW3ErMl09bVtrW3ErMl1dKX10LnB1dEltYWdlRGF0YShDLDAsYyk7Yys9MTZ9aWYobDxTKXtkPXkqYio0O2suc2V0KFIuc3ViYXJyYXkoQSxBK2QpKTtpZihCKWZvcih2YXIgRz0wO0c8ZDtHKz00KXtoJiYoa1tHKzBdPWhba1tHKzBdXSk7cCYmKGtbRysxXT1wW2tbRysxXV0pO20mJihrW0crMl09bVtrW0crMl1dKX10LnB1dEltYWdlRGF0YShDLDAsYyl9fWVsc2V7aWYoci5raW5kIT09by5JbWFnZUtpbmQuUkdCXzI0QlBQKXRocm93IG5ldyBFcnJvcigiYmFkIGltYWdlIGtpbmQ6ICIuY29uY2F0KHIua2luZCkpO3ZhciBVPSEhKGh8fHB8fG0pO2Q9eSoodT0xNik7Zm9yKGw9MDtsPFM7bCsrKXtsPj1fJiYoZD15Kih1PWIpKTtpPTA7Zm9yKGM9ZDtjLS07KXtrW2krK109UltBKytdO2tbaSsrXT1SW0ErK107a1tpKytdPVJbQSsrXTtrW2krK109MjU1fWlmKFUpZm9yKHZhciB6PTA7ejxpO3orPTQpe2gmJihrW3orMF09aFtrW3orMF1dKTtwJiYoa1t6KzFdPXBba1t6KzFdXSk7bSYmKGtbeisyXT1tW2tbeisyXV0pfXQucHV0SW1hZ2VEYXRhKEMsMCwxNipsKX19fX1mdW5jdGlvbiBwdXRCaW5hcnlJbWFnZU1hc2sodCxyKXtmb3IodmFyIGE9ci5oZWlnaHQsbz1yLndpZHRoLGk9YSUxNixsPShhLWkpLzE2LGM9MD09PWk/bDpsKzEsdT10LmNyZWF0ZUltYWdlRGF0YShvLDE2KSxkPTAsaD1yLmRhdGEscD11LmRhdGEsbT0wO208YzttKyspe2Zvcih2YXIgdj1tPGw/MTY6aSxnPTMseT0wO3k8djt5KyspZm9yKHZhciBiPTAsXz0wO188bztfKyspe2lmKCFiKXt2YXIgUz1oW2QrK107Yj0xMjh9cFtnXT1TJmI/MDoyNTU7Zys9NDtiPj49MX10LnB1dEltYWdlRGF0YSh1LDAsMTYqbSl9fWZ1bmN0aW9uIGNvcHlDdHhTdGF0ZSh0LHIpe2Zvcih2YXIgYT1bInN0cm9rZVN0eWxlIiwiZmlsbFN0eWxlIiwiZmlsbFJ1bGUiLCJnbG9iYWxBbHBoYSIsImxpbmVXaWR0aCIsImxpbmVDYXAiLCJsaW5lSm9pbiIsIm1pdGVyTGltaXQiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJmb250Il0sbz0wLGk9YS5sZW5ndGg7bzxpO28rKyl7dmFyIGw9YVtvXTt2b2lkIDAhPT10W2xdJiYocltsXT10W2xdKX1pZih2b2lkIDAhPT10LnNldExpbmVEYXNoKXtyLnNldExpbmVEYXNoKHQuZ2V0TGluZURhc2goKSk7ci5saW5lRGFzaE9mZnNldD10LmxpbmVEYXNoT2Zmc2V0fX1mdW5jdGlvbiByZXNldEN0eFRvRGVmYXVsdCh0KXt0LnN0cm9rZVN0eWxlPSIjMDAwMDAwIjt0LmZpbGxTdHlsZT0iIzAwMDAwMCI7dC5maWxsUnVsZT0ibm9uemVybyI7dC5nbG9iYWxBbHBoYT0xO3QubGluZVdpZHRoPTE7dC5saW5lQ2FwPSJidXR0Ijt0LmxpbmVKb2luPSJtaXRlciI7dC5taXRlckxpbWl0PTEwO3QuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2Utb3ZlciI7dC5mb250PSIxMHB4IHNhbnMtc2VyaWYiO2lmKHZvaWQgMCE9PXQuc2V0TGluZURhc2gpe3Quc2V0TGluZURhc2goW10pO3QubGluZURhc2hPZmZzZXQ9MH19ZnVuY3Rpb24gY29tcG9zZVNNYXNrQmFja2Ryb3AodCxyLGEsbyl7Zm9yKHZhciBpPXQubGVuZ3RoLGw9MztsPGk7bCs9NCl7dmFyIGM9dFtsXTtpZigwPT09Yyl7dFtsLTNdPXI7dFtsLTJdPWE7dFtsLTFdPW99ZWxzZSBpZihjPDI1NSl7dmFyIHU9MjU1LWM7dFtsLTNdPXRbbC0zXSpjK3IqdT4+ODt0W2wtMl09dFtsLTJdKmMrYSp1Pj44O3RbbC0xXT10W2wtMV0qYytvKnU+Pjh9fX1mdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYSh0LHIsYSl7Zm9yKHZhciBvPXQubGVuZ3RoLGk9MztpPG87aSs9NCl7dmFyIGw9YT9hW3RbaV1dOnRbaV07cltpXT1yW2ldKmwqKDEvMjU1KXwwfX1mdW5jdGlvbiBjb21wb3NlU01hc2tMdW1pbm9zaXR5KHQscixhKXtmb3IodmFyIG89dC5sZW5ndGgsaT0zO2k8bztpKz00KXt2YXIgbD03Nyp0W2ktM10rMTUyKnRbaS0yXSsyOCp0W2ktMV07cltpXT1hP3JbaV0qYVtsPj44XT4+ODpyW2ldKmw+PjE2fX1mdW5jdGlvbiBjb21wb3NlU01hc2sodCxyLGEsbyl7dmFyIGk9ci5jYW52YXMsbD1yLmNvbnRleHQ7dC5zZXRUcmFuc2Zvcm0oci5zY2FsZVgsMCwwLHIuc2NhbGVZLHIub2Zmc2V0WCxyLm9mZnNldFkpO3ZhciBjPXIuYmFja2Ryb3B8fG51bGw7aWYoci50cmFuc2Zlck1hcHx8IW8uaXNFbmFibGVkKXshZnVuY3Rpb24gZ2VuZXJpY0NvbXBvc2VTTWFzayh0LHIsYSxvLGksbCxjKXt2YXIgdSxkPSEhbCxoPWQ/bFswXTowLHA9ZD9sWzFdOjAsbT1kP2xbMl06MDt1PSJMdW1pbm9zaXR5Ij09PWk/Y29tcG9zZVNNYXNrTHVtaW5vc2l0eTpjb21wb3NlU01hc2tBbHBoYTtmb3IodmFyIHY9TWF0aC5taW4obyxNYXRoLmNlaWwoMTA0ODU3Ni9hKSksZz0wO2c8bztnKz12KXt2YXIgeT1NYXRoLm1pbih2LG8tZyksYj10LmdldEltYWdlRGF0YSgwLGcsYSx5KSxfPXIuZ2V0SW1hZ2VEYXRhKDAsZyxhLHkpO2QmJmNvbXBvc2VTTWFza0JhY2tkcm9wKGIuZGF0YSxoLHAsbSk7dShiLmRhdGEsXy5kYXRhLGMpO3QucHV0SW1hZ2VEYXRhKF8sMCxnKX19KGwsYSxpLndpZHRoLGkuaGVpZ2h0LHIuc3VidHlwZSxjLHIudHJhbnNmZXJNYXApO3QuZHJhd0ltYWdlKGksMCwwKX1lbHNle3ZhciB1PW8uY29tcG9zZVNNYXNrKHtsYXllcjphLmNhbnZhcyxtYXNrOmkscHJvcGVydGllczp7c3VidHlwZTpyLnN1YnR5cGUsYmFja2Ryb3A6Y319KTt0LnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7dC5kcmF3SW1hZ2UodSxyLm9mZnNldFgsci5vZmZzZXRZKX19dmFyIHQ9WyJidXR0Iiwicm91bmQiLCJzcXVhcmUiXSxyPVsibWl0ZXIiLCJyb3VuZCIsImJldmVsIl0sYT17fSx1PXt9O0NhbnZhc0dyYXBoaWNzLnByb3RvdHlwZT17YmVnaW5EcmF3aW5nOmZ1bmN0aW9uIGJlZ2luRHJhd2luZyh0KXt2YXIgcj10LnRyYW5zZm9ybSxhPXQudmlld3BvcnQsbz10LnRyYW5zcGFyZW5jeSxpPXZvaWQgMCE9PW8mJm8sbD10LmJhY2tncm91bmQsYz12b2lkIDA9PT1sP251bGw6bCx1PXRoaXMuY3R4LmNhbnZhcy53aWR0aCxkPXRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7dGhpcy5jdHguc2F2ZSgpO3RoaXMuY3R4LmZpbGxTdHlsZT1jfHwicmdiKDI1NSwgMjU1LCAyNTUpIjt0aGlzLmN0eC5maWxsUmVjdCgwLDAsdSxkKTt0aGlzLmN0eC5yZXN0b3JlKCk7aWYoaSl7dmFyIGg9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoInRyYW5zcGFyZW50Iix1LGQsITApO3RoaXMuY29tcG9zaXRlQ3R4PXRoaXMuY3R4O3RoaXMudHJhbnNwYXJlbnRDYW52YXM9aC5jYW52YXM7dGhpcy5jdHg9aC5jb250ZXh0O3RoaXMuY3R4LnNhdmUoKTt0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsdGhpcy5jb21wb3NpdGVDdHgubW96Q3VycmVudFRyYW5zZm9ybSl9dGhpcy5jdHguc2F2ZSgpO3Jlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtyJiZ0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgscik7dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LGEudHJhbnNmb3JtKTt0aGlzLmJhc2VUcmFuc2Zvcm09dGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybS5zbGljZSgpO3RoaXMuaW1hZ2VMYXllciYmdGhpcy5pbWFnZUxheWVyLmJlZ2luTGF5b3V0KCl9LGV4ZWN1dGVPcGVyYXRvckxpc3Q6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZXhlY3V0ZU9wZXJhdG9yTGlzdCh0LHIsYSxpKXt2YXIgbD10LmFyZ3NBcnJheSxjPXQuZm5BcnJheSx1PXJ8fDAsZD1sLmxlbmd0aDtpZihkPT09dSlyZXR1cm4gdTtmb3IodmFyIGgscD1kLXU+MTAmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLG09cD9EYXRlLm5vdygpKzE1OjAsdj0wLGc9dGhpcy5jb21tb25PYmpzLHk9dGhpcy5vYmpzOzspe2lmKHZvaWQgMCE9PWkmJnU9PT1pLm5leHRCcmVha1BvaW50KXtpLmJyZWFrSXQodSxhKTtyZXR1cm4gdX1pZigoaD1jW3VdKSE9PW8uT1BTLmRlcGVuZGVuY3kpdGhpc1toXS5hcHBseSh0aGlzLGxbdV0pO2Vsc2V7dmFyIGIsXz1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihsW3VdKTt0cnl7Zm9yKF8ucygpOyEoYj1fLm4oKSkuZG9uZTspe3ZhciBTPWIudmFsdWUsQz1TLnN0YXJ0c1dpdGgoImdfIik/Zzp5O2lmKCFDLmhhcyhTKSl7Qy5nZXQoUyxhKTtyZXR1cm4gdX19fWNhdGNoKHQpe18uZSh0KX1maW5hbGx5e18uZigpfX1pZigrK3U9PT1kKXJldHVybiB1O2lmKHAmJisrdj4xMCl7aWYoRGF0ZS5ub3coKT5tKXthKCk7cmV0dXJuIHV9dj0wfX19LGVuZERyYXdpbmc6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kRHJhd2luZygpe251bGwhPT10aGlzLmN1cnJlbnQuYWN0aXZlU01hc2smJnRoaXMuZW5kU01hc2tHcm91cCgpO3RoaXMuY3R4LnJlc3RvcmUoKTtpZih0aGlzLnRyYW5zcGFyZW50Q2FudmFzKXt0aGlzLmN0eD10aGlzLmNvbXBvc2l0ZUN0eDt0aGlzLmN0eC5zYXZlKCk7dGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTt0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy50cmFuc3BhcmVudENhbnZhcywwLDApO3RoaXMuY3R4LnJlc3RvcmUoKTt0aGlzLnRyYW5zcGFyZW50Q2FudmFzPW51bGx9dGhpcy5jYWNoZWRDYW52YXNlcy5jbGVhcigpO3RoaXMud2ViR0xDb250ZXh0LmNsZWFyKCk7dGhpcy5pbWFnZUxheWVyJiZ0aGlzLmltYWdlTGF5ZXIuZW5kTGF5b3V0KCl9LHNldExpbmVXaWR0aDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMaW5lV2lkdGgodCl7dGhpcy5jdXJyZW50LmxpbmVXaWR0aD10O3RoaXMuY3R4LmxpbmVXaWR0aD10fSxzZXRMaW5lQ2FwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExpbmVDYXAocil7dGhpcy5jdHgubGluZUNhcD10W3JdfSxzZXRMaW5lSm9pbjpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMaW5lSm9pbih0KXt0aGlzLmN0eC5saW5lSm9pbj1yW3RdfSxzZXRNaXRlckxpbWl0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldE1pdGVyTGltaXQodCl7dGhpcy5jdHgubWl0ZXJMaW1pdD10fSxzZXREYXNoOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldERhc2godCxyKXt2YXIgYT10aGlzLmN0eDtpZih2b2lkIDAhPT1hLnNldExpbmVEYXNoKXthLnNldExpbmVEYXNoKHQpO2EubGluZURhc2hPZmZzZXQ9cn19LHNldFJlbmRlcmluZ0ludGVudDpmdW5jdGlvbiBzZXRSZW5kZXJpbmdJbnRlbnQodCl7fSxzZXRGbGF0bmVzczpmdW5jdGlvbiBzZXRGbGF0bmVzcyh0KXt9LHNldEdTdGF0ZTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRHU3RhdGUodCl7Zm9yKHZhciByPTAsYT10Lmxlbmd0aDtyPGE7cisrKXt2YXIgbz10W3JdLGk9b1swXSxsPW9bMV07c3dpdGNoKGkpe2Nhc2UiTFciOnRoaXMuc2V0TGluZVdpZHRoKGwpO2JyZWFrO2Nhc2UiTEMiOnRoaXMuc2V0TGluZUNhcChsKTticmVhaztjYXNlIkxKIjp0aGlzLnNldExpbmVKb2luKGwpO2JyZWFrO2Nhc2UiTUwiOnRoaXMuc2V0TWl0ZXJMaW1pdChsKTticmVhaztjYXNlIkQiOnRoaXMuc2V0RGFzaChsWzBdLGxbMV0pO2JyZWFrO2Nhc2UiUkkiOnRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KGwpO2JyZWFrO2Nhc2UiRkwiOnRoaXMuc2V0RmxhdG5lc3MobCk7YnJlYWs7Y2FzZSJGb250Ijp0aGlzLnNldEZvbnQobFswXSxsWzFdKTticmVhaztjYXNlIkNBIjp0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGE9b1sxXTticmVhaztjYXNlImNhIjp0aGlzLmN1cnJlbnQuZmlsbEFscGhhPW9bMV07dGhpcy5jdHguZ2xvYmFsQWxwaGE9b1sxXTticmVhaztjYXNlIkJNIjp0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249bDticmVhaztjYXNlIlNNYXNrIjp0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2smJih0aGlzLnN0YXRlU3RhY2subGVuZ3RoPjAmJnRoaXMuc3RhdGVTdGFja1t0aGlzLnN0YXRlU3RhY2subGVuZ3RoLTFdLmFjdGl2ZVNNYXNrPT09dGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrP3RoaXMuc3VzcGVuZFNNYXNrR3JvdXAoKTp0aGlzLmVuZFNNYXNrR3JvdXAoKSk7dGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrPWw/dGhpcy50ZW1wU01hc2s6bnVsbDt0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2smJnRoaXMuYmVnaW5TTWFza0dyb3VwKCk7dGhpcy50ZW1wU01hc2s9bnVsbDticmVhaztjYXNlIlRSIjp0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzPWx9fX0sYmVnaW5TTWFza0dyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luU01hc2tHcm91cCgpe3ZhciB0PXRoaXMuY3VycmVudC5hY3RpdmVTTWFzayxyPXQuY2FudmFzLndpZHRoLGE9dC5jYW52YXMuaGVpZ2h0LG89InNtYXNrR3JvdXBBdCIrdGhpcy5ncm91cExldmVsLGk9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMobyxyLGEsITApLGw9dGhpcy5jdHgsYz1sLm1vekN1cnJlbnRUcmFuc2Zvcm07dGhpcy5jdHguc2F2ZSgpO3ZhciB1PWkuY29udGV4dDt1LnNjYWxlKDEvdC5zY2FsZVgsMS90LnNjYWxlWSk7dS50cmFuc2xhdGUoLXQub2Zmc2V0WCwtdC5vZmZzZXRZKTt1LnRyYW5zZm9ybS5hcHBseSh1LGMpO3Quc3RhcnRUcmFuc2Zvcm1JbnZlcnNlPXUubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7Y29weUN0eFN0YXRlKGwsdSk7dGhpcy5jdHg9dTt0aGlzLnNldEdTdGF0ZShbWyJCTSIsInNvdXJjZS1vdmVyIl0sWyJjYSIsMV0sWyJDQSIsMV1dKTt0aGlzLmdyb3VwU3RhY2sucHVzaChsKTt0aGlzLmdyb3VwTGV2ZWwrK30sc3VzcGVuZFNNYXNrR3JvdXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kU01hc2tHcm91cCgpe3ZhciB0PXRoaXMuY3R4O3RoaXMuZ3JvdXBMZXZlbC0tO3RoaXMuY3R4PXRoaXMuZ3JvdXBTdGFjay5wb3AoKTtjb21wb3NlU01hc2sodGhpcy5jdHgsdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLHQsdGhpcy53ZWJHTENvbnRleHQpO3RoaXMuY3R4LnJlc3RvcmUoKTt0aGlzLmN0eC5zYXZlKCk7Y29weUN0eFN0YXRlKHQsdGhpcy5jdHgpO3RoaXMuY3VycmVudC5yZXN1bWVTTWFza0N0eD10O3ZhciByPW8uVXRpbC50cmFuc2Zvcm0odGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZSx0Lm1vekN1cnJlbnRUcmFuc2Zvcm0pO3RoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCxyKTt0LnNhdmUoKTt0LnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7dC5jbGVhclJlY3QoMCwwLHQuY2FudmFzLndpZHRoLHQuY2FudmFzLmhlaWdodCk7dC5yZXN0b3JlKCl9LHJlc3VtZVNNYXNrR3JvdXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kU01hc2tHcm91cCgpe3ZhciB0PXRoaXMuY3VycmVudC5yZXN1bWVTTWFza0N0eCxyPXRoaXMuY3R4O3RoaXMuY3R4PXQ7dGhpcy5ncm91cFN0YWNrLnB1c2gocik7dGhpcy5ncm91cExldmVsKyt9LGVuZFNNYXNrR3JvdXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kU01hc2tHcm91cCgpe3ZhciB0PXRoaXMuY3R4O3RoaXMuZ3JvdXBMZXZlbC0tO3RoaXMuY3R4PXRoaXMuZ3JvdXBTdGFjay5wb3AoKTtjb21wb3NlU01hc2sodGhpcy5jdHgsdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLHQsdGhpcy53ZWJHTENvbnRleHQpO3RoaXMuY3R4LnJlc3RvcmUoKTtjb3B5Q3R4U3RhdGUodCx0aGlzLmN0eCk7dmFyIHI9by5VdGlsLnRyYW5zZm9ybSh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2suc3RhcnRUcmFuc2Zvcm1JbnZlcnNlLHQubW96Q3VycmVudFRyYW5zZm9ybSk7dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LHIpfSxzYXZlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NhdmUoKXt0aGlzLmN0eC5zYXZlKCk7dmFyIHQ9dGhpcy5jdXJyZW50O3RoaXMuc3RhdGVTdGFjay5wdXNoKHQpO3RoaXMuY3VycmVudD10LmNsb25lKCk7dGhpcy5jdXJyZW50LnJlc3VtZVNNYXNrQ3R4PW51bGx9LHJlc3RvcmU6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcmVzdG9yZSgpe3RoaXMuY3VycmVudC5yZXN1bWVTTWFza0N0eCYmdGhpcy5yZXN1bWVTTWFza0dyb3VwKCk7bnVsbD09PXRoaXMuY3VycmVudC5hY3RpdmVTTWFza3x8MCE9PXRoaXMuc3RhdGVTdGFjay5sZW5ndGgmJnRoaXMuc3RhdGVTdGFja1t0aGlzLnN0YXRlU3RhY2subGVuZ3RoLTFdLmFjdGl2ZVNNYXNrPT09dGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrfHx0aGlzLmVuZFNNYXNrR3JvdXAoKTtpZigwIT09dGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCl7dGhpcy5jdXJyZW50PXRoaXMuc3RhdGVTdGFjay5wb3AoKTt0aGlzLmN0eC5yZXN0b3JlKCk7dGhpcy5wZW5kaW5nQ2xpcD1udWxsO3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbH19LHRyYW5zZm9ybTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc190cmFuc2Zvcm0odCxyLGEsbyxpLGwpe3RoaXMuY3R4LnRyYW5zZm9ybSh0LHIsYSxvLGksbCk7dGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aD1udWxsfSxjb25zdHJ1Y3RQYXRoOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2NvbnN0cnVjdFBhdGgodCxyKXtmb3IodmFyIGE9dGhpcy5jdHgsaT10aGlzLmN1cnJlbnQsbD1pLngsYz1pLnksdT0wLGQ9MCxoPXQubGVuZ3RoO3U8aDt1Kyspc3dpdGNoKDB8dFt1XSl7Y2FzZSBvLk9QUy5yZWN0YW5nbGU6bD1yW2QrK107Yz1yW2QrK107dmFyIHA9cltkKytdLG09cltkKytdOzA9PT1wJiZhLmxpbmVXaWR0aDx0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSYmKHA9dGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpOzA9PT1tJiZhLmxpbmVXaWR0aDx0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKSYmKG09dGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpO3ZhciB2PWwrcCxnPWMrbTthLm1vdmVUbyhsLGMpO2EubGluZVRvKHYsYyk7YS5saW5lVG8odixnKTthLmxpbmVUbyhsLGcpO2EubGluZVRvKGwsYyk7YS5jbG9zZVBhdGgoKTticmVhaztjYXNlIG8uT1BTLm1vdmVUbzpsPXJbZCsrXTtjPXJbZCsrXTthLm1vdmVUbyhsLGMpO2JyZWFrO2Nhc2Ugby5PUFMubGluZVRvOmw9cltkKytdO2M9cltkKytdO2EubGluZVRvKGwsYyk7YnJlYWs7Y2FzZSBvLk9QUy5jdXJ2ZVRvOmw9cltkKzRdO2M9cltkKzVdO2EuYmV6aWVyQ3VydmVUbyhyW2RdLHJbZCsxXSxyW2QrMl0scltkKzNdLGwsYyk7ZCs9NjticmVhaztjYXNlIG8uT1BTLmN1cnZlVG8yOmEuYmV6aWVyQ3VydmVUbyhsLGMscltkXSxyW2QrMV0scltkKzJdLHJbZCszXSk7bD1yW2QrMl07Yz1yW2QrM107ZCs9NDticmVhaztjYXNlIG8uT1BTLmN1cnZlVG8zOmw9cltkKzJdO2M9cltkKzNdO2EuYmV6aWVyQ3VydmVUbyhyW2RdLHJbZCsxXSxsLGMsbCxjKTtkKz00O2JyZWFrO2Nhc2Ugby5PUFMuY2xvc2VQYXRoOmEuY2xvc2VQYXRoKCl9aS5zZXRDdXJyZW50UG9pbnQobCxjKX0sY2xvc2VQYXRoOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlUGF0aCgpe3RoaXMuY3R4LmNsb3NlUGF0aCgpfSxzdHJva2U6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc3Ryb2tlKHQpe3Q9dm9pZCAwPT09dHx8dDt2YXIgcj10aGlzLmN0eCxhPXRoaXMuY3VycmVudC5zdHJva2VDb2xvcjtyLmdsb2JhbEFscGhhPXRoaXMuY3VycmVudC5zdHJva2VBbHBoYTtpZih0aGlzLmNvbnRlbnRWaXNpYmxlKWlmKGEmJmEuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmIlBhdHRlcm4iPT09YS50eXBlKXtyLnNhdmUoKTt2YXIgaT1yLm1vekN1cnJlbnRUcmFuc2Zvcm0sbD1vLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoaSlbMF07ci5zdHJva2VTdHlsZT1hLmdldFBhdHRlcm4ocix0aGlzKTtyLmxpbmVXaWR0aD1NYXRoLm1heCguNjUqdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCksdGhpcy5jdXJyZW50LmxpbmVXaWR0aCpsKTtyLnN0cm9rZSgpO3IucmVzdG9yZSgpfWVsc2V7ci5saW5lV2lkdGg9TWF0aC5tYXgoLjY1KnRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpLHRoaXMuY3VycmVudC5saW5lV2lkdGgpO3Iuc3Ryb2tlKCl9dCYmdGhpcy5jb25zdW1lUGF0aCgpO3IuZ2xvYmFsQWxwaGE9dGhpcy5jdXJyZW50LmZpbGxBbHBoYX0sY2xvc2VTdHJva2U6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VTdHJva2UoKXt0aGlzLmNsb3NlUGF0aCgpO3RoaXMuc3Ryb2tlKCl9LGZpbGw6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZmlsbCh0KXt0PXZvaWQgMD09PXR8fHQ7dmFyIHI9dGhpcy5jdHgsYT10aGlzLmN1cnJlbnQuZmlsbENvbG9yLG89ITE7aWYodGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsKXtyLnNhdmUoKTt0aGlzLmJhc2VUcmFuc2Zvcm0mJnIuc2V0VHJhbnNmb3JtLmFwcGx5KHIsdGhpcy5iYXNlVHJhbnNmb3JtKTtyLmZpbGxTdHlsZT1hLmdldFBhdHRlcm4ocix0aGlzKTtvPSEwfWlmKHRoaXMuY29udGVudFZpc2libGUpaWYodGhpcy5wZW5kaW5nRU9GaWxsKXtyLmZpbGwoImV2ZW5vZGQiKTt0aGlzLnBlbmRpbmdFT0ZpbGw9ITF9ZWxzZSByLmZpbGwoKTtvJiZyLnJlc3RvcmUoKTt0JiZ0aGlzLmNvbnN1bWVQYXRoKCl9LGVvRmlsbDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lb0ZpbGwoKXt0aGlzLnBlbmRpbmdFT0ZpbGw9ITA7dGhpcy5maWxsKCl9LGZpbGxTdHJva2U6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZmlsbFN0cm9rZSgpe3RoaXMuZmlsbCghMSk7dGhpcy5zdHJva2UoITEpO3RoaXMuY29uc3VtZVBhdGgoKX0sZW9GaWxsU3Ryb2tlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VvRmlsbFN0cm9rZSgpe3RoaXMucGVuZGluZ0VPRmlsbD0hMDt0aGlzLmZpbGxTdHJva2UoKX0sY2xvc2VGaWxsU3Ryb2tlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlRmlsbFN0cm9rZSgpe3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5maWxsU3Ryb2tlKCl9LGNsb3NlRU9GaWxsU3Ryb2tlOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlRU9GaWxsU3Ryb2tlKCl7dGhpcy5wZW5kaW5nRU9GaWxsPSEwO3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5maWxsU3Ryb2tlKCl9LGVuZFBhdGg6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kUGF0aCgpe3RoaXMuY29uc3VtZVBhdGgoKX0sY2xpcDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbGlwKCl7dGhpcy5wZW5kaW5nQ2xpcD1hfSxlb0NsaXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW9DbGlwKCl7dGhpcy5wZW5kaW5nQ2xpcD11fSxiZWdpblRleHQ6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5UZXh0KCl7dGhpcy5jdXJyZW50LnRleHRNYXRyaXg9by5JREVOVElUWV9NQVRSSVg7dGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZT0xO3RoaXMuY3VycmVudC54PXRoaXMuY3VycmVudC5saW5lWD0wO3RoaXMuY3VycmVudC55PXRoaXMuY3VycmVudC5saW5lWT0wfSxlbmRUZXh0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZFRleHQoKXt2YXIgdD10aGlzLnBlbmRpbmdUZXh0UGF0aHMscj10aGlzLmN0eDtpZih2b2lkIDAhPT10KXtyLnNhdmUoKTtyLmJlZ2luUGF0aCgpO2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKXt2YXIgbz10W2FdO3Iuc2V0VHJhbnNmb3JtLmFwcGx5KHIsby50cmFuc2Zvcm0pO3IudHJhbnNsYXRlKG8ueCxvLnkpO28uYWRkVG9QYXRoKHIsby5mb250U2l6ZSl9ci5yZXN0b3JlKCk7ci5jbGlwKCk7ci5iZWdpblBhdGgoKTtkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzfWVsc2Ugci5iZWdpblBhdGgoKX0sc2V0Q2hhclNwYWNpbmc6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Q2hhclNwYWNpbmcodCl7dGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nPXR9LHNldFdvcmRTcGFjaW5nOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFdvcmRTcGFjaW5nKHQpe3RoaXMuY3VycmVudC53b3JkU3BhY2luZz10fSxzZXRIU2NhbGU6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0SFNjYWxlKHQpe3RoaXMuY3VycmVudC50ZXh0SFNjYWxlPXQvMTAwfSxzZXRMZWFkaW5nOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExlYWRpbmcodCl7dGhpcy5jdXJyZW50LmxlYWRpbmc9LXR9LHNldEZvbnQ6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Rm9udCh0LHIpe3ZhciBhPXRoaXMuY29tbW9uT2Jqcy5nZXQodCksaT10aGlzLmN1cnJlbnQ7aWYoIWEpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBmaW5kIGZvbnQgZm9yICIuY29uY2F0KHQpKTtpLmZvbnRNYXRyaXg9YS5mb250TWF0cml4P2EuZm9udE1hdHJpeDpvLkZPTlRfSURFTlRJVFlfTUFUUklYOzAhPT1pLmZvbnRNYXRyaXhbMF0mJjAhPT1pLmZvbnRNYXRyaXhbM118fCgwLG8ud2FybikoIkludmFsaWQgZm9udCBtYXRyaXggZm9yIGZvbnQgIit0KTtpZihyPDApe3I9LXI7aS5mb250RGlyZWN0aW9uPS0xfWVsc2UgaS5mb250RGlyZWN0aW9uPTE7dGhpcy5jdXJyZW50LmZvbnQ9YTt0aGlzLmN1cnJlbnQuZm9udFNpemU9cjtpZighYS5pc1R5cGUzRm9udCl7dmFyIGw9YS5sb2FkZWROYW1lfHwic2Fucy1zZXJpZiIsYz0ibm9ybWFsIjthLmJsYWNrP2M9IjkwMCI6YS5ib2xkJiYoYz0iYm9sZCIpO3ZhciB1PWEuaXRhbGljPyJpdGFsaWMiOiJub3JtYWwiLGQ9JyInLmNvbmNhdChsLCciLCAnKS5jb25jYXQoYS5mYWxsYmFja05hbWUpLGg9cjtyPDE2P2g9MTY6cj4xMDAmJihoPTEwMCk7dGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGU9ci9oO3RoaXMuY3R4LmZvbnQ9IiIuY29uY2F0KHUsIiAiKS5jb25jYXQoYywiICIpLmNvbmNhdChoLCJweCAiKS5jb25jYXQoZCl9fSxzZXRUZXh0UmVuZGVyaW5nTW9kZTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRUZXh0UmVuZGVyaW5nTW9kZSh0KXt0aGlzLmN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGU9dH0sc2V0VGV4dFJpc2U6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0VGV4dFJpc2UodCl7dGhpcy5jdXJyZW50LnRleHRSaXNlPXR9LG1vdmVUZXh0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21vdmVUZXh0KHQscil7dGhpcy5jdXJyZW50Lng9dGhpcy5jdXJyZW50LmxpbmVYKz10O3RoaXMuY3VycmVudC55PXRoaXMuY3VycmVudC5saW5lWSs9cn0sc2V0TGVhZGluZ01vdmVUZXh0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldExlYWRpbmdNb3ZlVGV4dCh0LHIpe3RoaXMuc2V0TGVhZGluZygtcik7dGhpcy5tb3ZlVGV4dCh0LHIpfSxzZXRUZXh0TWF0cml4OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFRleHRNYXRyaXgodCxyLGEsbyxpLGwpe3RoaXMuY3VycmVudC50ZXh0TWF0cml4PVt0LHIsYSxvLGksbF07dGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZT1NYXRoLnNxcnQodCp0K3Iqcik7dGhpcy5jdXJyZW50Lng9dGhpcy5jdXJyZW50LmxpbmVYPTA7dGhpcy5jdXJyZW50Lnk9dGhpcy5jdXJyZW50LmxpbmVZPTB9LG5leHRMaW5lOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX25leHRMaW5lKCl7dGhpcy5tb3ZlVGV4dCgwLHRoaXMuY3VycmVudC5sZWFkaW5nKX0scGFpbnRDaGFyOmZ1bmN0aW9uIHBhaW50Q2hhcih0LHIsYSxpKXt2YXIgbCxjPXRoaXMuY3R4LHU9dGhpcy5jdXJyZW50LGQ9dS5mb250LGg9dS50ZXh0UmVuZGVyaW5nTW9kZSxwPXUuZm9udFNpemUvdS5mb250U2l6ZVNjYWxlLG09aCZvLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0ssdj0hIShoJm8uVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBRyksZz11LnBhdHRlcm5GaWxsJiYhZC5taXNzaW5nRmlsZTsoZC5kaXNhYmxlRm9udEZhY2V8fHZ8fGcpJiYobD1kLmdldFBhdGhHZW5lcmF0b3IodGhpcy5jb21tb25PYmpzLHQpKTtpZihkLmRpc2FibGVGb250RmFjZXx8Zyl7Yy5zYXZlKCk7Yy50cmFuc2xhdGUocixhKTtjLmJlZ2luUGF0aCgpO2woYyxwKTtpJiZjLnNldFRyYW5zZm9ybS5hcHBseShjLGkpO20hPT1vLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwmJm0hPT1vLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFfHxjLmZpbGwoKTttIT09by5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UmJm0hPT1vLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFfHxjLnN0cm9rZSgpO2MucmVzdG9yZSgpfWVsc2V7bSE9PW8uVGV4dFJlbmRlcmluZ01vZGUuRklMTCYmbSE9PW8uVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0V8fGMuZmlsbFRleHQodCxyLGEpO20hPT1vLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSYmbSE9PW8uVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0V8fGMuc3Ryb2tlVGV4dCh0LHIsYSl9aWYodil7KHRoaXMucGVuZGluZ1RleHRQYXRoc3x8KHRoaXMucGVuZGluZ1RleHRQYXRocz1bXSkpLnB1c2goe3RyYW5zZm9ybTpjLm1vekN1cnJlbnRUcmFuc2Zvcm0seDpyLHk6YSxmb250U2l6ZTpwLGFkZFRvUGF0aDpsfSl9fSxnZXQgaXNGb250U3VicGl4ZWxBQUVuYWJsZWQoKXt2YXIgdD10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygiaXNGb250U3VicGl4ZWxBQUVuYWJsZWQiLDEwLDEwKS5jb250ZXh0O3Quc2NhbGUoMS41LDEpO3QuZmlsbFRleHQoIkkiLDAsMTApO2Zvcih2YXIgcj10LmdldEltYWdlRGF0YSgwLDAsMTAsMTApLmRhdGEsYT0hMSxpPTM7aTxyLmxlbmd0aDtpKz00KWlmKHJbaV0+MCYmcltpXTwyNTUpe2E9ITA7YnJlYWt9cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsImlzRm9udFN1YnBpeGVsQUFFbmFibGVkIixhKX0sc2hvd1RleHQ6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2hvd1RleHQodCl7dmFyIHI9dGhpcy5jdXJyZW50LGE9ci5mb250O2lmKGEuaXNUeXBlM0ZvbnQpcmV0dXJuIHRoaXMuc2hvd1R5cGUzVGV4dCh0KTt2YXIgaT1yLmZvbnRTaXplO2lmKDAhPT1pKXt2YXIgbCxjPXRoaXMuY3R4LHU9ci5mb250U2l6ZVNjYWxlLGQ9ci5jaGFyU3BhY2luZyxoPXIud29yZFNwYWNpbmcscD1yLmZvbnREaXJlY3Rpb24sbT1yLnRleHRIU2NhbGUqcCx2PXQubGVuZ3RoLGc9YS52ZXJ0aWNhbCx5PWc/MTotMSxiPWEuZGVmYXVsdFZNZXRyaWNzLF89aSpyLmZvbnRNYXRyaXhbMF0sUz1yLnRleHRSZW5kZXJpbmdNb2RlPT09by5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMJiYhYS5kaXNhYmxlRm9udEZhY2UmJiFyLnBhdHRlcm5GaWxsO2Muc2F2ZSgpO2lmKHIucGF0dGVybkZpbGwpe2Muc2F2ZSgpO3ZhciBDPXIuZmlsbENvbG9yLmdldFBhdHRlcm4oYyx0aGlzKTtsPWMubW96Q3VycmVudFRyYW5zZm9ybTtjLnJlc3RvcmUoKTtjLmZpbGxTdHlsZT1DfWMudHJhbnNmb3JtLmFwcGx5KGMsci50ZXh0TWF0cml4KTtjLnRyYW5zbGF0ZShyLngsci55K3IudGV4dFJpc2UpO3A+MD9jLnNjYWxlKG0sLTEpOmMuc2NhbGUobSwxKTt2YXIgQT1yLmxpbmVXaWR0aCxSPXIudGV4dE1hdHJpeFNjYWxlO2lmKDA9PT1SfHwwPT09QSl7dmFyIGs9ci50ZXh0UmVuZGVyaW5nTW9kZSZvLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7aWYoaz09PW8uVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFfHxrPT09by5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSl7dGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aD1udWxsO0E9LjY1KnRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpfX1lbHNlIEEvPVI7aWYoMSE9PXUpe2Muc2NhbGUodSx1KTtBLz11fWMubGluZVdpZHRoPUE7dmFyIHcsUD0wO2Zvcih3PTA7dzx2Oysrdyl7dmFyIHg9dFt3XTtpZigoMCxvLmlzTnVtKSh4KSlQKz15KngqaS8xZTM7ZWxzZXt2YXIgVCxFLE8sSSxEPSExLEw9KHguaXNTcGFjZT9oOjApK2QsTT14LmZvbnRDaGFyLFc9eC5hY2NlbnQsaj14LndpZHRoO2lmKGcpe3ZhciBOLEIscTtOPXgudm1ldHJpY3x8YjtCPS0oQj14LnZtZXRyaWM/TlsxXTouNSpqKSpfO3E9TlsyXSpfO2o9Tj8tTlswXTpqO1Q9Qi91O0U9KFArcSkvdX1lbHNle1Q9UC91O0U9MH1pZihhLnJlbWVhc3VyZSYmaj4wKXt2YXIgRz0xZTMqYy5tZWFzdXJlVGV4dChNKS53aWR0aC9pKnU7aWYoajxHJiZ0aGlzLmlzRm9udFN1YnBpeGVsQUFFbmFibGVkKXt2YXIgVT1qL0c7RD0hMDtjLnNhdmUoKTtjLnNjYWxlKFUsMSk7VC89VX1lbHNlIGohPT1HJiYoVCs9KGotRykvMmUzKmkvdSl9aWYodGhpcy5jb250ZW50VmlzaWJsZSYmKHguaXNJbkZvbnR8fGEubWlzc2luZ0ZpbGUpKWlmKFMmJiFXKWMuZmlsbFRleHQoTSxULEUpO2Vsc2V7dGhpcy5wYWludENoYXIoTSxULEUsbCk7aWYoVyl7Tz1UK2kqVy5vZmZzZXQueC91O0k9RS1pKlcub2Zmc2V0LnkvdTt0aGlzLnBhaW50Q2hhcihXLmZvbnRDaGFyLE8sSSxsKX19UCs9Zz9qKl8tTCpwOmoqXytMKnA7RCYmYy5yZXN0b3JlKCl9fWc/ci55LT1QOnIueCs9UCptO2MucmVzdG9yZSgpfX0sc2hvd1R5cGUzVGV4dDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zaG93VHlwZTNUZXh0KHQpe3ZhciByLGEsaSxsLGM9dGhpcy5jdHgsdT10aGlzLmN1cnJlbnQsZD11LmZvbnQsaD11LmZvbnRTaXplLHA9dS5mb250RGlyZWN0aW9uLG09ZC52ZXJ0aWNhbD8xOi0xLHY9dS5jaGFyU3BhY2luZyxnPXUud29yZFNwYWNpbmcseT11LnRleHRIU2NhbGUqcCxiPXUuZm9udE1hdHJpeHx8by5GT05UX0lERU5USVRZX01BVFJJWCxfPXQubGVuZ3RoO2lmKCEodS50ZXh0UmVuZGVyaW5nTW9kZT09PW8uVGV4dFJlbmRlcmluZ01vZGUuSU5WSVNJQkxFKSYmMCE9PWgpe3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbDtjLnNhdmUoKTtjLnRyYW5zZm9ybS5hcHBseShjLHUudGV4dE1hdHJpeCk7Yy50cmFuc2xhdGUodS54LHUueSk7Yy5zY2FsZSh5LHApO2ZvcihyPTA7cjxfOysrcil7YT10W3JdO2lmKCgwLG8uaXNOdW0pKGEpKXtsPW0qYSpoLzFlMzt0aGlzLmN0eC50cmFuc2xhdGUobCwwKTt1LngrPWwqeX1lbHNle3ZhciBTPShhLmlzU3BhY2U/ZzowKSt2LEM9ZC5jaGFyUHJvY09wZXJhdG9yTGlzdFthLm9wZXJhdG9yTGlzdElkXTtpZihDKXtpZih0aGlzLmNvbnRlbnRWaXNpYmxlKXt0aGlzLnByb2Nlc3NpbmdUeXBlMz1hO3RoaXMuc2F2ZSgpO2Muc2NhbGUoaCxoKTtjLnRyYW5zZm9ybS5hcHBseShjLGIpO3RoaXMuZXhlY3V0ZU9wZXJhdG9yTGlzdChDKTt0aGlzLnJlc3RvcmUoKX1pPW8uVXRpbC5hcHBseVRyYW5zZm9ybShbYS53aWR0aCwwXSxiKVswXSpoK1M7Yy50cmFuc2xhdGUoaSwwKTt1LngrPWkqeX1lbHNlKDAsby53YXJuKSgnVHlwZTMgY2hhcmFjdGVyICInLmNvbmNhdChhLm9wZXJhdG9yTGlzdElkLCciIGlzIG5vdCBhdmFpbGFibGUuJykpfX1jLnJlc3RvcmUoKTt0aGlzLnByb2Nlc3NpbmdUeXBlMz1udWxsfX0sc2V0Q2hhcldpZHRoOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJXaWR0aCh0LHIpe30sc2V0Q2hhcldpZHRoQW5kQm91bmRzOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJXaWR0aEFuZEJvdW5kcyh0LHIsYSxvLGksbCl7dGhpcy5jdHgucmVjdChhLG8saS1hLGwtbyk7dGhpcy5jbGlwKCk7dGhpcy5lbmRQYXRoKCl9LGdldENvbG9yTl9QYXR0ZXJuOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2dldENvbG9yTl9QYXR0ZXJuKHQpe3ZhciByLGE9dGhpcztpZigiVGlsaW5nUGF0dGVybiI9PT10WzBdKXt2YXIgbz10WzFdLGw9dGhpcy5iYXNlVHJhbnNmb3JtfHx0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtLnNsaWNlKCksYz17Y3JlYXRlQ2FudmFzR3JhcGhpY3M6ZnVuY3Rpb24gY3JlYXRlQ2FudmFzR3JhcGhpY3ModCl7cmV0dXJuIG5ldyBDYW52YXNHcmFwaGljcyh0LGEuY29tbW9uT2JqcyxhLm9ianMsYS5jYW52YXNGYWN0b3J5LGEud2ViR0xDb250ZXh0KX19O3I9bmV3IGkuVGlsaW5nUGF0dGVybih0LG8sdGhpcy5jdHgsYyxsKX1lbHNlIHI9KDAsaS5nZXRTaGFkaW5nUGF0dGVybkZyb21JUikodCk7cmV0dXJuIHJ9LHNldFN0cm9rZUNvbG9yTjpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRTdHJva2VDb2xvck4oKXt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9dGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpfSxzZXRGaWxsQ29sb3JOOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEZpbGxDb2xvck4oKXt0aGlzLmN1cnJlbnQuZmlsbENvbG9yPXRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTt0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw9ITB9LHNldFN0cm9rZVJHQkNvbG9yOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFN0cm9rZVJHQkNvbG9yKHQscixhKXt2YXIgaT1vLlV0aWwubWFrZUNzc1JnYih0LHIsYSk7dGhpcy5jdHguc3Ryb2tlU3R5bGU9aTt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9aX0sc2V0RmlsbFJHQkNvbG9yOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldEZpbGxSR0JDb2xvcih0LHIsYSl7dmFyIGk9by5VdGlsLm1ha2VDc3NSZ2IodCxyLGEpO3RoaXMuY3R4LmZpbGxTdHlsZT1pO3RoaXMuY3VycmVudC5maWxsQ29sb3I9aTt0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw9ITF9LHNoYWRpbmdGaWxsOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NoYWRpbmdGaWxsKHQpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciByPXRoaXMuY3R4O3RoaXMuc2F2ZSgpO3ZhciBhPSgwLGkuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIpKHQpO3IuZmlsbFN0eWxlPWEuZ2V0UGF0dGVybihyLHRoaXMsITApO3ZhciBsPXIubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7aWYobCl7dmFyIGM9ci5jYW52YXMsdT1jLndpZHRoLGQ9Yy5oZWlnaHQsaD1vLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsMF0sbCkscD1vLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsZF0sbCksbT1vLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3UsMF0sbCksdj1vLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3UsZF0sbCksZz1NYXRoLm1pbihoWzBdLHBbMF0sbVswXSx2WzBdKSx5PU1hdGgubWluKGhbMV0scFsxXSxtWzFdLHZbMV0pLGI9TWF0aC5tYXgoaFswXSxwWzBdLG1bMF0sdlswXSksXz1NYXRoLm1heChoWzFdLHBbMV0sbVsxXSx2WzFdKTt0aGlzLmN0eC5maWxsUmVjdChnLHksYi1nLF8teSl9ZWxzZSB0aGlzLmN0eC5maWxsUmVjdCgtMWUxMCwtMWUxMCwyZTEwLDJlMTApO3RoaXMucmVzdG9yZSgpfX0sYmVnaW5JbmxpbmVJbWFnZTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbklubGluZUltYWdlKCl7KDAsby51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlIil9LGJlZ2luSW1hZ2VEYXRhOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luSW1hZ2VEYXRhKCl7KDAsby51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YSIpfSxwYWludEZvcm1YT2JqZWN0QmVnaW46ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRGb3JtWE9iamVjdEJlZ2luKHQscil7aWYodGhpcy5jb250ZW50VmlzaWJsZSl7dGhpcy5zYXZlKCk7dGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLmJhc2VUcmFuc2Zvcm0pO0FycmF5LmlzQXJyYXkodCkmJjY9PT10Lmxlbmd0aCYmdGhpcy50cmFuc2Zvcm0uYXBwbHkodGhpcyx0KTt0aGlzLmJhc2VUcmFuc2Zvcm09dGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybTtpZihyKXt2YXIgYT1yWzJdLXJbMF0sbz1yWzNdLXJbMV07dGhpcy5jdHgucmVjdChyWzBdLHJbMV0sYSxvKTt0aGlzLmNsaXAoKTt0aGlzLmVuZFBhdGgoKX19fSxwYWludEZvcm1YT2JqZWN0RW5kOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50Rm9ybVhPYmplY3RFbmQoKXtpZih0aGlzLmNvbnRlbnRWaXNpYmxlKXt0aGlzLnJlc3RvcmUoKTt0aGlzLmJhc2VUcmFuc2Zvcm09dGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucG9wKCl9fSxiZWdpbkdyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luR3JvdXAodCl7aWYodGhpcy5jb250ZW50VmlzaWJsZSl7dGhpcy5zYXZlKCk7dmFyIHI9dGhpcy5jdHg7dC5pc29sYXRlZHx8KDAsby5pbmZvKSgiVE9ETzogU3VwcG9ydCBub24taXNvbGF0ZWQgZ3JvdXBzLiIpO3Qua25vY2tvdXQmJigwLG8ud2FybikoIktub2Nrb3V0IGdyb3VwcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBhPXIubW96Q3VycmVudFRyYW5zZm9ybTt0Lm1hdHJpeCYmci50cmFuc2Zvcm0uYXBwbHkocix0Lm1hdHJpeCk7aWYoIXQuYmJveCl0aHJvdyBuZXcgRXJyb3IoIkJvdW5kaW5nIGJveCBpcyByZXF1aXJlZC4iKTt2YXIgaT1vLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3godC5iYm94LHIubW96Q3VycmVudFRyYW5zZm9ybSksbD1bMCwwLHIuY2FudmFzLndpZHRoLHIuY2FudmFzLmhlaWdodF07aT1vLlV0aWwuaW50ZXJzZWN0KGksbCl8fFswLDAsMCwwXTt2YXIgYz1NYXRoLmZsb29yKGlbMF0pLHU9TWF0aC5mbG9vcihpWzFdKSxkPU1hdGgubWF4KE1hdGguY2VpbChpWzJdKS1jLDEpLGg9TWF0aC5tYXgoTWF0aC5jZWlsKGlbM10pLXUsMSkscD0xLG09MTtpZihkPjQwOTYpe3A9ZC80MDk2O2Q9NDA5Nn1pZihoPjQwOTYpe209aC80MDk2O2g9NDA5Nn12YXIgdj0iZ3JvdXBBdCIrdGhpcy5ncm91cExldmVsO3Quc21hc2smJih2Kz0iX3NtYXNrXyIrdGhpcy5zbWFza0NvdW50ZXIrKyUyKTt2YXIgZz10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyh2LGQsaCwhMCkseT1nLmNvbnRleHQ7eS5zY2FsZSgxL3AsMS9tKTt5LnRyYW5zbGF0ZSgtYywtdSk7eS50cmFuc2Zvcm0uYXBwbHkoeSxhKTtpZih0LnNtYXNrKXRoaXMuc21hc2tTdGFjay5wdXNoKHtjYW52YXM6Zy5jYW52YXMsY29udGV4dDp5LG9mZnNldFg6YyxvZmZzZXRZOnUsc2NhbGVYOnAsc2NhbGVZOm0sc3VidHlwZTp0LnNtYXNrLnN1YnR5cGUsYmFja2Ryb3A6dC5zbWFzay5iYWNrZHJvcCx0cmFuc2Zlck1hcDp0LnNtYXNrLnRyYW5zZmVyTWFwfHxudWxsLHN0YXJ0VHJhbnNmb3JtSW52ZXJzZTpudWxsfSk7ZWxzZXtyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7ci50cmFuc2xhdGUoYyx1KTtyLnNjYWxlKHAsbSl9Y29weUN0eFN0YXRlKHIseSk7dGhpcy5jdHg9eTt0aGlzLnNldEdTdGF0ZShbWyJCTSIsInNvdXJjZS1vdmVyIl0sWyJjYSIsMV0sWyJDQSIsMV1dKTt0aGlzLmdyb3VwU3RhY2sucHVzaChyKTt0aGlzLmdyb3VwTGV2ZWwrKzt0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s9bnVsbH19LGVuZEdyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEdyb3VwKHQpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3RoaXMuZ3JvdXBMZXZlbC0tO3ZhciByPXRoaXMuY3R4O3RoaXMuY3R4PXRoaXMuZ3JvdXBTdGFjay5wb3AoKTt2b2lkIDAhPT10aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQ/dGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExOnRoaXMuY3R4Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZD0hMTt0LnNtYXNrP3RoaXMudGVtcFNNYXNrPXRoaXMuc21hc2tTdGFjay5wb3AoKTp0aGlzLmN0eC5kcmF3SW1hZ2Uoci5jYW52YXMsMCwwKTt0aGlzLnJlc3RvcmUoKX19LGJlZ2luQW5ub3RhdGlvbnM6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5Bbm5vdGF0aW9ucygpe3RoaXMuc2F2ZSgpO3RoaXMuYmFzZVRyYW5zZm9ybSYmdGhpcy5jdHguc2V0VHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LHRoaXMuYmFzZVRyYW5zZm9ybSl9LGVuZEFubm90YXRpb25zOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEFubm90YXRpb25zKCl7dGhpcy5yZXN0b3JlKCl9LGJlZ2luQW5ub3RhdGlvbjpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkFubm90YXRpb24odCxyLGEpe3RoaXMuc2F2ZSgpO3Jlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTt0aGlzLmN1cnJlbnQ9bmV3IGM7aWYoQXJyYXkuaXNBcnJheSh0KSYmND09PXQubGVuZ3RoKXt2YXIgbz10WzJdLXRbMF0saT10WzNdLXRbMV07dGhpcy5jdHgucmVjdCh0WzBdLHRbMV0sbyxpKTt0aGlzLmNsaXAoKTt0aGlzLmVuZFBhdGgoKX10aGlzLnRyYW5zZm9ybS5hcHBseSh0aGlzLHIpO3RoaXMudHJhbnNmb3JtLmFwcGx5KHRoaXMsYSl9LGVuZEFubm90YXRpb246ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kQW5ub3RhdGlvbigpe3RoaXMucmVzdG9yZSgpfSxwYWludEltYWdlTWFza1hPYmplY3Q6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbWFnZU1hc2tYT2JqZWN0KHQpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciByPXRoaXMuY3R4LGE9dC53aWR0aCxvPXQuaGVpZ2h0LGk9dGhpcy5jdXJyZW50LmZpbGxDb2xvcixsPXRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCxjPXRoaXMucHJvY2Vzc2luZ1R5cGUzO2MmJnZvaWQgMD09PWMuY29tcGlsZWQmJihjLmNvbXBpbGVkPWE8PTFlMyYmbzw9MWUzP2Z1bmN0aW9uIGNvbXBpbGVUeXBlM0dseXBoKHQpe3ZhciByLGEsbyxpLGw9dC53aWR0aCxjPXQuaGVpZ2h0LHU9bCsxLGQ9bmV3IFVpbnQ4QXJyYXkodSooYysxKSksaD1uZXcgVWludDhBcnJheShbMCwyLDQsMCwxLDAsNSw0LDgsMTAsMCw4LDAsMiwxLDBdKSxwPWwrNyYtOCxtPXQuZGF0YSx2PW5ldyBVaW50OEFycmF5KHAqYyksZz0wO2ZvcihyPTAsaT1tLmxlbmd0aDtyPGk7cisrKWZvcih2YXIgeT0xMjgsYj1tW3JdO3k+MDspe3ZbZysrXT1iJnk/MDoyNTU7eT4+PTF9dmFyIF89MDtpZigwIT09dltnPTBdKXtkWzBdPTE7KytffWZvcihhPTE7YTxsO2ErKyl7aWYodltnXSE9PXZbZysxXSl7ZFthXT12W2ddPzI6MTsrK199ZysrfWlmKDAhPT12W2ddKXtkW2FdPTI7KytffWZvcihyPTE7cjxjO3IrKyl7bz1yKnU7aWYodlsoZz1yKnApLXBdIT09dltnXSl7ZFtvXT12W2ddPzE6ODsrK199dmFyIFM9KHZbZ10/NDowKSsodltnLXBdPzg6MCk7Zm9yKGE9MTthPGw7YSsrKXtpZihoW1M9KFM+PjIpKyh2W2crMV0/NDowKSsodltnLXArMV0/ODowKV0pe2RbbythXT1oW1NdOysrX31nKyt9aWYodltnLXBdIT09dltnXSl7ZFtvK2FdPXZbZ10/Mjo0OysrX31pZihfPjFlMylyZXR1cm4gbnVsbH1vPXIqdTtpZigwIT09dltnPXAqKGMtMSldKXtkW29dPTg7KytffWZvcihhPTE7YTxsO2ErKyl7aWYodltnXSE9PXZbZysxXSl7ZFtvK2FdPXZbZ10/NDo4OysrX31nKyt9aWYoMCE9PXZbZ10pe2RbbythXT00OysrX31pZihfPjFlMylyZXR1cm4gbnVsbDt2YXIgQz1uZXcgSW50MzJBcnJheShbMCx1LC0xLDAsLXUsMCwwLDAsMV0pLEE9W107Zm9yKHI9MDtfJiZyPD1jO3IrKyl7Zm9yKHZhciBSPXIqdSxrPVIrbDtSPGsmJiFkW1JdOylSKys7aWYoUiE9PWspe3ZhciB3LFA9W1IldSxyXSx4PWRbUl0sVD1SO2Rve3ZhciBFPUNbeF07ZG97Uis9RX13aGlsZSghZFtSXSk7aWYoNSE9PSh3PWRbUl0pJiYxMCE9PXcpe3g9dztkW1JdPTB9ZWxzZXt4PXcmNTEqeD4+NDtkW1JdJj14Pj4yfHg8PDJ9UC5wdXNoKFIldSk7UC5wdXNoKFIvdXwwKTtkW1JdfHwtLV99d2hpbGUoVCE9PVIpO0EucHVzaChQKTstLXJ9fXJldHVybiBmdW5jdGlvbiBkcmF3T3V0bGluZSh0KXt0LnNhdmUoKTt0LnNjYWxlKDEvbCwtMS9jKTt0LnRyYW5zbGF0ZSgwLC1jKTt0LmJlZ2luUGF0aCgpO2Zvcih2YXIgcj0wLGE9QS5sZW5ndGg7cjxhO3IrKyl7dmFyIG89QVtyXTt0Lm1vdmVUbyhvWzBdLG9bMV0pO2Zvcih2YXIgaT0yLHU9by5sZW5ndGg7aTx1O2krPTIpdC5saW5lVG8ob1tpXSxvW2krMV0pfXQuZmlsbCgpO3QuYmVnaW5QYXRoKCk7dC5yZXN0b3JlKCl9fSh7ZGF0YTp0LmRhdGEsd2lkdGg6YSxoZWlnaHQ6b30pOm51bGwpO2lmKGMmJmMuY29tcGlsZWQpYy5jb21waWxlZChyKTtlbHNle3ZhciB1PXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtYXNrQ2FudmFzIixhLG8pLGQ9dS5jb250ZXh0O2Quc2F2ZSgpO3B1dEJpbmFyeUltYWdlTWFzayhkLHQpO2QuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iO2QuZmlsbFN0eWxlPWw/aS5nZXRQYXR0ZXJuKGQsdGhpcyk6aTtkLmZpbGxSZWN0KDAsMCxhLG8pO2QucmVzdG9yZSgpO3RoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QodS5jYW52YXMpfX19LHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDpmdW5jdGlvbiBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQodCxyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MCxvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLGk9YXJndW1lbnRzLmxlbmd0aD40P2FyZ3VtZW50c1s0XTp2b2lkIDAsbD1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtpZih0aGlzLmNvbnRlbnRWaXNpYmxlKXt2YXIgYz10LndpZHRoLHU9dC5oZWlnaHQsZD10aGlzLmN1cnJlbnQuZmlsbENvbG9yLGg9dGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsLHA9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoIm1hc2tDYW52YXMiLGMsdSksbT1wLmNvbnRleHQ7bS5zYXZlKCk7cHV0QmluYXJ5SW1hZ2VNYXNrKG0sdCk7bS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1pbiI7bS5maWxsU3R5bGU9aD9kLmdldFBhdHRlcm4obSx0aGlzKTpkO20uZmlsbFJlY3QoMCwwLGMsdSk7bS5yZXN0b3JlKCk7Zm9yKHZhciB2PXRoaXMuY3R4LGc9MCx5PWwubGVuZ3RoO2c8eTtnKz0yKXt2LnNhdmUoKTt2LnRyYW5zZm9ybShyLGEsbyxpLGxbZ10sbFtnKzFdKTt2LnNjYWxlKDEsLTEpO3YuZHJhd0ltYWdlKHAuY2FudmFzLDAsMCxjLHUsMCwtMSwxLDEpO3YucmVzdG9yZSgpfX19LHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwKHQpe2lmKHRoaXMuY29udGVudFZpc2libGUpZm9yKHZhciByPXRoaXMuY3R4LGE9dGhpcy5jdXJyZW50LmZpbGxDb2xvcixvPXRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCxpPTAsbD10Lmxlbmd0aDtpPGw7aSsrKXt2YXIgYz10W2ldLHU9Yy53aWR0aCxkPWMuaGVpZ2h0LGg9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoIm1hc2tDYW52YXMiLHUsZCkscD1oLmNvbnRleHQ7cC5zYXZlKCk7cHV0QmluYXJ5SW1hZ2VNYXNrKHAsYyk7cC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1pbiI7cC5maWxsU3R5bGU9bz9hLmdldFBhdHRlcm4ocCx0aGlzKTphO3AuZmlsbFJlY3QoMCwwLHUsZCk7cC5yZXN0b3JlKCk7ci5zYXZlKCk7ci50cmFuc2Zvcm0uYXBwbHkocixjLnRyYW5zZm9ybSk7ci5zY2FsZSgxLC0xKTtyLmRyYXdJbWFnZShoLmNhbnZhcywwLDAsdSxkLDAsLTEsMSwxKTtyLnJlc3RvcmUoKX19LHBhaW50SW1hZ2VYT2JqZWN0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VYT2JqZWN0KHQpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciByPXQuc3RhcnRzV2l0aCgiZ18iKT90aGlzLmNvbW1vbk9ianMuZ2V0KHQpOnRoaXMub2Jqcy5nZXQodCk7cj90aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KHIpOigwLG8ud2FybikoIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXQiKX19LHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KHQscixhLGkpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciBsPXQuc3RhcnRzV2l0aCgiZ18iKT90aGlzLmNvbW1vbk9ianMuZ2V0KHQpOnRoaXMub2Jqcy5nZXQodCk7aWYobCl7Zm9yKHZhciBjPWwud2lkdGgsdT1sLmhlaWdodCxkPVtdLGg9MCxwPWkubGVuZ3RoO2g8cDtoKz0yKWQucHVzaCh7dHJhbnNmb3JtOltyLDAsMCxhLGlbaF0saVtoKzFdXSx4OjAseTowLHc6YyxoOnV9KTt0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAobCxkKX1lbHNlKDAsby53YXJuKSgiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldCIpfX0scGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QodCl7aWYodGhpcy5jb250ZW50VmlzaWJsZSl7dmFyIHI9dC53aWR0aCxhPXQuaGVpZ2h0LG89dGhpcy5jdHg7dGhpcy5zYXZlKCk7by5zY2FsZSgxL3IsLTEvYSk7dmFyIGksbCxjPW8ubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2UsdT1jWzBdLGQ9Y1sxXSxoPU1hdGgubWF4KE1hdGguc3FydCh1KnUrZCpkKSwxKSxwPWNbMl0sbT1jWzNdLHY9TWF0aC5tYXgoTWF0aC5zcXJ0KHAqcCttKm0pLDEpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBIVE1MRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fHwhdC5kYXRhKWk9dDtlbHNle3ZhciBnPShsPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJpbmxpbmVJbWFnZSIscixhKSkuY29udGV4dDtwdXRCaW5hcnlJbWFnZURhdGEoZyx0LHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMpO2k9bC5jYW52YXN9Zm9yKHZhciB5PXIsYj1hLF89InByZXNjYWxlMSI7aD4yJiZ5PjF8fHY+MiYmYj4xOyl7dmFyIFM9eSxDPWI7aD4yJiZ5PjEmJihoLz15LyhTPU1hdGguY2VpbCh5LzIpKSk7dj4yJiZiPjEmJih2Lz1iLyhDPU1hdGguY2VpbChiLzIpKSk7KGc9KGw9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXyxTLEMpKS5jb250ZXh0KS5jbGVhclJlY3QoMCwwLFMsQyk7Zy5kcmF3SW1hZ2UoaSwwLDAseSxiLDAsMCxTLEMpO2k9bC5jYW52YXM7eT1TO2I9QztfPSJwcmVzY2FsZTEiPT09Xz8icHJlc2NhbGUyIjoicHJlc2NhbGUxIn1vLmRyYXdJbWFnZShpLDAsMCx5LGIsMCwtYSxyLGEpO2lmKHRoaXMuaW1hZ2VMYXllcil7dmFyIEE9dGhpcy5nZXRDYW52YXNQb3NpdGlvbigwLC1hKTt0aGlzLmltYWdlTGF5ZXIuYXBwZW5kSW1hZ2Uoe2ltZ0RhdGE6dCxsZWZ0OkFbMF0sdG9wOkFbMV0sd2lkdGg6ci9jWzBdLGhlaWdodDphL2NbM119KX10aGlzLnJlc3RvcmUoKX19LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cCh0LHIpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3ZhciBhPXRoaXMuY3R4LG89dC53aWR0aCxpPXQuaGVpZ2h0LGw9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoImlubGluZUltYWdlIixvLGkpO3B1dEJpbmFyeUltYWdlRGF0YShsLmNvbnRleHQsdCx0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzKTtmb3IodmFyIGM9MCx1PXIubGVuZ3RoO2M8dTtjKyspe3ZhciBkPXJbY107YS5zYXZlKCk7YS50cmFuc2Zvcm0uYXBwbHkoYSxkLnRyYW5zZm9ybSk7YS5zY2FsZSgxLC0xKTthLmRyYXdJbWFnZShsLmNhbnZhcyxkLngsZC55LGQudyxkLmgsMCwtMSwxLDEpO2lmKHRoaXMuaW1hZ2VMYXllcil7dmFyIGg9dGhpcy5nZXRDYW52YXNQb3NpdGlvbihkLngsZC55KTt0aGlzLmltYWdlTGF5ZXIuYXBwZW5kSW1hZ2Uoe2ltZ0RhdGE6dCxsZWZ0OmhbMF0sdG9wOmhbMV0sd2lkdGg6byxoZWlnaHQ6aX0pfWEucmVzdG9yZSgpfX19LHBhaW50U29saWRDb2xvckltYWdlTWFzazpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKXt0aGlzLmNvbnRlbnRWaXNpYmxlJiZ0aGlzLmN0eC5maWxsUmVjdCgwLDAsMSwxKX0sbWFya1BvaW50OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21hcmtQb2ludCh0KXt9LG1hcmtQb2ludFByb3BzOmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21hcmtQb2ludFByb3BzKHQscil7fSxiZWdpbk1hcmtlZENvbnRlbnQ6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5NYXJrZWRDb250ZW50KHQpe3RoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe3Zpc2libGU6ITB9KX0sYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5NYXJrZWRDb250ZW50UHJvcHModCxyKXsiT0MiPT09dD90aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHt2aXNpYmxlOnRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShyKX0pOnRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe3Zpc2libGU6ITB9KTt0aGlzLmNvbnRlbnRWaXNpYmxlPXRoaXMuaXNDb250ZW50VmlzaWJsZSgpfSxlbmRNYXJrZWRDb250ZW50OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZE1hcmtlZENvbnRlbnQoKXt0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wb3AoKTt0aGlzLmNvbnRlbnRWaXNpYmxlPXRoaXMuaXNDb250ZW50VmlzaWJsZSgpfSxiZWdpbkNvbXBhdDpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkNvbXBhdCgpe30sZW5kQ29tcGF0OmZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZENvbXBhdCgpe30sY29uc3VtZVBhdGg6ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY29uc3VtZVBhdGgoKXt2YXIgdD10aGlzLmN0eDtpZih0aGlzLnBlbmRpbmdDbGlwKXt0aGlzLnBlbmRpbmdDbGlwPT09dT90LmNsaXAoImV2ZW5vZGQiKTp0LmNsaXAoKTt0aGlzLnBlbmRpbmdDbGlwPW51bGx9dC5iZWdpblBhdGgoKX0sZ2V0U2luZ2xlUGl4ZWxXaWR0aDpmdW5jdGlvbiBnZXRTaW5nbGVQaXhlbFdpZHRoKHQpe2lmKG51bGw9PT10aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoKXt2YXIgcj10aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTt0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoPU1hdGguc3FydChNYXRoLm1heChyWzBdKnJbMF0rclsxXSpyWzFdLHJbMl0qclsyXStyWzNdKnJbM10pKX1yZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aH0sZ2V0Q2FudmFzUG9zaXRpb246ZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZ2V0Q2FudmFzUG9zaXRpb24odCxyKXt2YXIgYT10aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtO3JldHVyblthWzBdKnQrYVsyXSpyK2FbNF0sYVsxXSp0K2FbM10qcithWzVdXX0saXNDb250ZW50VmlzaWJsZTpmdW5jdGlvbiBDYW52YXNHcmFwaGljc19pc0NvbnRlbnRWaXNpYmxlKCl7Zm9yKHZhciB0PXRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aC0xO3Q+PTA7dC0tKWlmKCF0aGlzLm1hcmtlZENvbnRlbnRTdGFja1t0XS52aXNpYmxlKXJldHVybiExO3JldHVybiEwfX07Zm9yKHZhciBkIGluIG8uT1BTKUNhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtvLk9QU1tkXV09Q2FudmFzR3JhcGhpY3MucHJvdG90eXBlW2RdO3JldHVybiBDYW52YXNHcmFwaGljc30oKTtyLkNhbnZhc0dyYXBoaWNzPXV9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVI9ZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIodCl7dmFyIHI9aVt0WzBdXTtpZighcil0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gSVIgdHlwZTogIi5jb25jYXQodFswXSkpO3JldHVybiByLmZyb21JUih0KX07ci5UaWxpbmdQYXR0ZXJuPXZvaWQgMDt2YXIgbz1hKDUpLGk9e307ZnVuY3Rpb24gYXBwbHlCb3VuZGluZ0JveCh0LHIpe2lmKHImJiJ1bmRlZmluZWQiIT10eXBlb2YgUGF0aDJEKXt2YXIgYT1yWzJdLXJbMF0sbz1yWzNdLXJbMV0saT1uZXcgUGF0aDJEO2kucmVjdChyWzBdLHJbMV0sYSxvKTt0LmNsaXAoaSl9fWkuUmFkaWFsQXhpYWw9e2Zyb21JUjpmdW5jdGlvbiBSYWRpYWxBeGlhbF9mcm9tSVIodCl7dmFyIHI9dFsxXSxhPXRbMl0sbz10WzNdLGk9dFs0XSxsPXRbNV0sYz10WzZdLHU9dFs3XTtyZXR1cm57dHlwZToiUGF0dGVybiIsZ2V0UGF0dGVybjpmdW5jdGlvbiBSYWRpYWxBeGlhbF9nZXRQYXR0ZXJuKHQpe2FwcGx5Qm91bmRpbmdCb3godCxhKTt2YXIgZDsiYXhpYWwiPT09cj9kPXQuY3JlYXRlTGluZWFyR3JhZGllbnQoaVswXSxpWzFdLGxbMF0sbFsxXSk6InJhZGlhbCI9PT1yJiYoZD10LmNyZWF0ZVJhZGlhbEdyYWRpZW50KGlbMF0saVsxXSxjLGxbMF0sbFsxXSx1KSk7Zm9yKHZhciBoPTAscD1vLmxlbmd0aDtoPHA7KytoKXt2YXIgbT1vW2hdO2QuYWRkQ29sb3JTdG9wKG1bMF0sbVsxXSl9cmV0dXJuIGR9fX19O3ZhciBsPWZ1bmN0aW9uIGNyZWF0ZU1lc2hDYW52YXNDbG9zdXJlKCl7ZnVuY3Rpb24gZHJhd1RyaWFuZ2xlKHQscixhLG8saSxsLGMsdSl7dmFyIGQsaD1yLmNvb3JkcyxwPXIuY29sb3JzLG09dC5kYXRhLHY9NCp0LndpZHRoO2lmKGhbYSsxXT5oW28rMV0pe2Q9YTthPW87bz1kO2Q9bDtsPWM7Yz1kfWlmKGhbbysxXT5oW2krMV0pe2Q9bztvPWk7aT1kO2Q9YztjPXU7dT1kfWlmKGhbYSsxXT5oW28rMV0pe2Q9YTthPW87bz1kO2Q9bDtsPWM7Yz1kfXZhciBnPShoW2FdK3Iub2Zmc2V0WCkqci5zY2FsZVgseT0oaFthKzFdK3Iub2Zmc2V0WSkqci5zY2FsZVksYj0oaFtvXStyLm9mZnNldFgpKnIuc2NhbGVYLF89KGhbbysxXStyLm9mZnNldFkpKnIuc2NhbGVZLFM9KGhbaV0rci5vZmZzZXRYKSpyLnNjYWxlWCxDPShoW2krMV0rci5vZmZzZXRZKSpyLnNjYWxlWTtpZighKHk+PUMpKWZvcih2YXIgQSxSLGssdyxQLHgsVCxFLE89cFtsXSxJPXBbbCsxXSxEPXBbbCsyXSxMPXBbY10sTT1wW2MrMV0sVz1wW2MrMl0saj1wW3VdLE49cFt1KzFdLEI9cFt1KzJdLHE9TWF0aC5yb3VuZCh5KSxHPU1hdGgucm91bmQoQyksVT1xO1U8PUc7VSsrKXtpZihVPF8pe3ZhciB6PXZvaWQgMDtBPWctKGctYikqKHo9VTx5PzA6eT09PV8/MTooeS1VKS8oeS1fKSk7Uj1PLShPLUwpKno7az1JLShJLU0pKno7dz1ELShELVcpKnp9ZWxzZXt2YXIgSD12b2lkIDA7QT1iLShiLVMpKihIPVU+Qz8xOl89PT1DPzA6KF8tVSkvKF8tQykpO1I9TC0oTC1qKSpIO2s9TS0oTS1OKSpIO3c9Vy0oVy1CKSpIfXZhciBWPXZvaWQgMDtQPWctKGctUykqKFY9VTx5PzA6VT5DPzE6KHktVSkvKHktQykpO3g9Ty0oTy1qKSpWO1Q9SS0oSS1OKSpWO0U9RC0oRC1CKSpWO2Zvcih2YXIgWT1NYXRoLnJvdW5kKE1hdGgubWluKEEsUCkpLFg9TWF0aC5yb3VuZChNYXRoLm1heChBLFApKSxRPXYqVSs0KlksSz1ZO0s8PVg7SysrKXsoVj0oQS1LKS8oQS1QKSk8MD9WPTA6Vj4xJiYoVj0xKTttW1ErK109Ui0oUi14KSpWfDA7bVtRKytdPWstKGstVCkqVnwwO21bUSsrXT13LSh3LUUpKlZ8MDttW1ErK109MjU1fX19ZnVuY3Rpb24gZHJhd0ZpZ3VyZSh0LHIsYSl7dmFyIG8saSxsPXIuY29vcmRzLGM9ci5jb2xvcnM7c3dpdGNoKHIudHlwZSl7Y2FzZSJsYXR0aWNlIjp2YXIgdT1yLnZlcnRpY2VzUGVyUm93LGQ9TWF0aC5mbG9vcihsLmxlbmd0aC91KS0xLGg9dS0xO2ZvcihvPTA7bzxkO28rKylmb3IodmFyIHA9byp1LG09MDttPGg7bSsrLHArKyl7ZHJhd1RyaWFuZ2xlKHQsYSxsW3BdLGxbcCsxXSxsW3ArdV0sY1twXSxjW3ArMV0sY1twK3VdKTtkcmF3VHJpYW5nbGUodCxhLGxbcCt1KzFdLGxbcCsxXSxsW3ArdV0sY1twK3UrMV0sY1twKzFdLGNbcCt1XSl9YnJlYWs7Y2FzZSJ0cmlhbmdsZXMiOmZvcihvPTAsaT1sLmxlbmd0aDtvPGk7bys9MylkcmF3VHJpYW5nbGUodCxhLGxbb10sbFtvKzFdLGxbbysyXSxjW29dLGNbbysxXSxjW28rMl0pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGZpZ3VyZSIpfX1yZXR1cm4gZnVuY3Rpb24gY3JlYXRlTWVzaENhbnZhcyh0LHIsYSxvLGksbCxjLHUpe3ZhciBkLGgscCxtLHY9TWF0aC5mbG9vcih0WzBdKSxnPU1hdGguZmxvb3IodFsxXSkseT1NYXRoLmNlaWwodFsyXSktdixiPU1hdGguY2VpbCh0WzNdKS1nLF89TWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKHkqclswXSoxLjEpKSwzZTMpLFM9TWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGIqclsxXSoxLjEpKSwzZTMpLEM9eS9fLEE9Yi9TLFI9e2Nvb3JkczphLGNvbG9yczpvLG9mZnNldFg6LXYsb2Zmc2V0WTotZyxzY2FsZVg6MS9DLHNjYWxlWToxL0F9LGs9Xys0LHc9Uys0O2lmKHUuaXNFbmFibGVkKXtkPXUuZHJhd0ZpZ3VyZXMoe3dpZHRoOl8saGVpZ2h0OlMsYmFja2dyb3VuZENvbG9yOmwsZmlndXJlczppLGNvbnRleHQ6Un0pOyhoPWMuZ2V0Q2FudmFzKCJtZXNoIixrLHcsITEpKS5jb250ZXh0LmRyYXdJbWFnZShkLDIsMik7ZD1oLmNhbnZhc31lbHNle3ZhciBQPShoPWMuZ2V0Q2FudmFzKCJtZXNoIixrLHcsITEpKS5jb250ZXh0LHg9UC5jcmVhdGVJbWFnZURhdGEoXyxTKTtpZihsKXt2YXIgVD14LmRhdGE7Zm9yKHA9MCxtPVQubGVuZ3RoO3A8bTtwKz00KXtUW3BdPWxbMF07VFtwKzFdPWxbMV07VFtwKzJdPWxbMl07VFtwKzNdPTI1NX19Zm9yKHA9MDtwPGkubGVuZ3RoO3ArKylkcmF3RmlndXJlKHgsaVtwXSxSKTtQLnB1dEltYWdlRGF0YSh4LDIsMik7ZD1oLmNhbnZhc31yZXR1cm57Y2FudmFzOmQsb2Zmc2V0WDp2LTIqQyxvZmZzZXRZOmctMipBLHNjYWxlWDpDLHNjYWxlWTpBfX19KCk7aS5NZXNoPXtmcm9tSVI6ZnVuY3Rpb24gTWVzaF9mcm9tSVIodCl7dmFyIHI9dFsyXSxhPXRbM10saT10WzRdLGM9dFs1XSx1PXRbNl0sZD10WzddLGg9dFs4XTtyZXR1cm57dHlwZToiUGF0dGVybiIsZ2V0UGF0dGVybjpmdW5jdGlvbiBNZXNoX2dldFBhdHRlcm4odCxwLG0pe2FwcGx5Qm91bmRpbmdCb3godCxkKTt2YXIgdjtpZihtKXY9by5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHQubW96Q3VycmVudFRyYW5zZm9ybSk7ZWxzZXt2PW8uVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShwLmJhc2VUcmFuc2Zvcm0pO2lmKHUpe3ZhciBnPW8uVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh1KTt2PVt2WzBdKmdbMF0sdlsxXSpnWzFdXX19dmFyIHk9bChjLHYscixhLGksbT9udWxsOmgscC5jYWNoZWRDYW52YXNlcyxwLndlYkdMQ29udGV4dCk7aWYoIW0pe3Quc2V0VHJhbnNmb3JtLmFwcGx5KHQscC5iYXNlVHJhbnNmb3JtKTt1JiZ0LnRyYW5zZm9ybS5hcHBseSh0LHUpfXQudHJhbnNsYXRlKHkub2Zmc2V0WCx5Lm9mZnNldFkpO3Quc2NhbGUoeS5zY2FsZVgseS5zY2FsZVkpO3JldHVybiB0LmNyZWF0ZVBhdHRlcm4oeS5jYW52YXMsIm5vLXJlcGVhdCIpfX19fTtpLkR1bW15PXtmcm9tSVI6ZnVuY3Rpb24gRHVtbXlfZnJvbUlSKCl7cmV0dXJue3R5cGU6IlBhdHRlcm4iLGdldFBhdHRlcm46ZnVuY3Rpb24gRHVtbXlfZnJvbUlSX2dldFBhdHRlcm4oKXtyZXR1cm4iaG90cGluayJ9fX19O3ZhciBjPWZ1bmN0aW9uIFRpbGluZ1BhdHRlcm5DbG9zdXJlKCl7dmFyIHQ9MSxyPTI7ZnVuY3Rpb24gVGlsaW5nUGF0dGVybih0LHIsYSxvLGkpe3RoaXMub3BlcmF0b3JMaXN0PXRbMl07dGhpcy5tYXRyaXg9dFszXXx8WzEsMCwwLDEsMCwwXTt0aGlzLmJib3g9dFs0XTt0aGlzLnhzdGVwPXRbNV07dGhpcy55c3RlcD10WzZdO3RoaXMucGFpbnRUeXBlPXRbN107dGhpcy50aWxpbmdUeXBlPXRbOF07dGhpcy5jb2xvcj1yO3RoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5PW87dGhpcy5iYXNlVHJhbnNmb3JtPWk7dGhpcy50eXBlPSJQYXR0ZXJuIjt0aGlzLmN0eD1hfVRpbGluZ1BhdHRlcm4ucHJvdG90eXBlPXtjcmVhdGVQYXR0ZXJuQ2FudmFzOmZ1bmN0aW9uIFRpbGluUGF0dGVybl9jcmVhdGVQYXR0ZXJuQ2FudmFzKHQpe3ZhciByPXRoaXMub3BlcmF0b3JMaXN0LGE9dGhpcy5iYm94LGk9dGhpcy54c3RlcCxsPXRoaXMueXN0ZXAsYz10aGlzLnBhaW50VHlwZSx1PXRoaXMudGlsaW5nVHlwZSxkPXRoaXMuY29sb3IsaD10aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTsoMCxvLmluZm8pKCJUaWxpbmdUeXBlOiAiK3UpO3ZhciBwPWFbMF0sbT1hWzFdLHY9YVsyXSxnPWFbM10seT1vLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5tYXRyaXgpLGI9by5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMuYmFzZVRyYW5zZm9ybSksXz1beVswXSpiWzBdLHlbMV0qYlsxXV0sUz10aGlzLmdldFNpemVBbmRTY2FsZShpLHRoaXMuY3R4LmNhbnZhcy53aWR0aCxfWzBdKSxDPXRoaXMuZ2V0U2l6ZUFuZFNjYWxlKGwsdGhpcy5jdHguY2FudmFzLmhlaWdodCxfWzFdKSxBPXQuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJwYXR0ZXJuIixTLnNpemUsQy5zaXplLCEwKSxSPUEuY29udGV4dCxrPWguY3JlYXRlQ2FudmFzR3JhcGhpY3MoUik7ay5ncm91cExldmVsPXQuZ3JvdXBMZXZlbDt0aGlzLnNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChrLGMsZCk7ay50cmFuc2Zvcm0oUy5zY2FsZSwwLDAsQy5zY2FsZSwwLDApO2sudHJhbnNmb3JtKDEsMCwwLDEsLXAsLW0pO3RoaXMuY2xpcEJib3goayxhLHAsbSx2LGcpO2suZXhlY3V0ZU9wZXJhdG9yTGlzdChyKTt0aGlzLmN0eC50cmFuc2Zvcm0oMSwwLDAsMSxwLG0pO3RoaXMuY3R4LnNjYWxlKDEvUy5zY2FsZSwxL0Muc2NhbGUpO3JldHVybiBBLmNhbnZhc30sZ2V0U2l6ZUFuZFNjYWxlOmZ1bmN0aW9uIFRpbGluZ1BhdHRlcm5fZ2V0U2l6ZUFuZFNjYWxlKHQscixhKXt0PU1hdGguYWJzKHQpO3ZhciBvPU1hdGgubWF4KDNlMyxyKSxpPU1hdGguY2VpbCh0KmEpO2k+PW8/aT1vOmE9aS90O3JldHVybntzY2FsZTphLHNpemU6aX19LGNsaXBCYm94OmZ1bmN0aW9uIGNsaXBCYm94KHQscixhLG8saSxsKXtpZihBcnJheS5pc0FycmF5KHIpJiY0PT09ci5sZW5ndGgpe3ZhciBjPWktYSx1PWwtbzt0LmN0eC5yZWN0KGEsbyxjLHUpO3QuY2xpcCgpO3QuZW5kUGF0aCgpfX0sc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0OmZ1bmN0aW9uIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChhLGksbCl7dmFyIGM9YS5jdHgsdT1hLmN1cnJlbnQ7c3dpdGNoKGkpe2Nhc2UgdDp2YXIgZD10aGlzLmN0eDtjLmZpbGxTdHlsZT1kLmZpbGxTdHlsZTtjLnN0cm9rZVN0eWxlPWQuc3Ryb2tlU3R5bGU7dS5maWxsQ29sb3I9ZC5maWxsU3R5bGU7dS5zdHJva2VDb2xvcj1kLnN0cm9rZVN0eWxlO2JyZWFrO2Nhc2Ugcjp2YXIgaD1vLlV0aWwubWFrZUNzc1JnYihsWzBdLGxbMV0sbFsyXSk7Yy5maWxsU3R5bGU9aDtjLnN0cm9rZVN0eWxlPWg7dS5maWxsQ29sb3I9aDt1LnN0cm9rZUNvbG9yPWg7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgcGFpbnQgdHlwZTogIi5jb25jYXQoaSkpfX0sZ2V0UGF0dGVybjpmdW5jdGlvbiBUaWxpbmdQYXR0ZXJuX2dldFBhdHRlcm4odCxyKXsodD10aGlzLmN0eCkuc2V0VHJhbnNmb3JtLmFwcGx5KHQsdGhpcy5iYXNlVHJhbnNmb3JtKTt0LnRyYW5zZm9ybS5hcHBseSh0LHRoaXMubWF0cml4KTt2YXIgYT10aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMocik7cmV0dXJuIHQuY3JlYXRlUGF0dGVybihhLCJyZXBlYXQiKX19O3JldHVybiBUaWxpbmdQYXR0ZXJufSgpO3IuVGlsaW5nUGF0dGVybj1jfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLkdsb2JhbFdvcmtlck9wdGlvbnM9dm9pZCAwO3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCk7ci5HbG9iYWxXb3JrZXJPcHRpb25zPW87by53b3JrZXJQb3J0PXZvaWQgMD09PW8ud29ya2VyUG9ydD9udWxsOm8ud29ya2VyUG9ydDtvLndvcmtlclNyYz12b2lkIDA9PT1vLndvcmtlclNyYz8iIjpvLndvcmtlclNyY30sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5NZXNzYWdlSGFuZGxlcj12b2lkIDA7dmFyIG89ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KGEoMikpLGk9YSg1KTtmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxyLGEsbyxpLGwsYyl7dHJ5e3ZhciB1PXRbbF0oYyksZD11LnZhbHVlfWNhdGNoKHQpe2EodCk7cmV0dXJufXUuZG9uZT9yKGQpOlByb21pc2UucmVzb2x2ZShkKS50aGVuKG8saSl9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIG89clthXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMTtvLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfXZhciBsPTEsYz0yLHU9MSxkPTIsaD0zLHA9NCxtPTUsdj02LGc9Nyx5PTg7ZnVuY3Rpb24gd3JhcFJlYXNvbih0KXtpZigib2JqZWN0IiE9PV90eXBlb2YodCl8fG51bGw9PT10KXJldHVybiB0O3N3aXRjaCh0Lm5hbWUpe2Nhc2UiQWJvcnRFeGNlcHRpb24iOnJldHVybiBuZXcgaS5BYm9ydEV4Y2VwdGlvbih0Lm1lc3NhZ2UpO2Nhc2UiTWlzc2luZ1BERkV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24odC5tZXNzYWdlKTtjYXNlIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBpLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbih0Lm1lc3NhZ2UsdC5zdGF0dXMpO2Nhc2UiVW5rbm93bkVycm9yRXhjZXB0aW9uIjpyZXR1cm4gbmV3IGkuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSx0LmRldGFpbHMpO2RlZmF1bHQ6cmV0dXJuIG5ldyBpLlVua25vd25FcnJvckV4Y2VwdGlvbih0Lm1lc3NhZ2UsdC50b1N0cmluZygpKX19dmFyIGI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBNZXNzYWdlSGFuZGxlcih0LHIsYSl7dmFyIG89dGhpczshZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsTWVzc2FnZUhhbmRsZXIpO3RoaXMuc291cmNlTmFtZT10O3RoaXMudGFyZ2V0TmFtZT1yO3RoaXMuY29tT2JqPWE7dGhpcy5jYWxsYmFja0lkPTE7dGhpcy5zdHJlYW1JZD0xO3RoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM9ITA7dGhpcy5zdHJlYW1TaW5rcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuc3RyZWFtQ29udHJvbGxlcnM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5hY3Rpb25IYW5kbGVyPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5fb25Db21PYmpPbk1lc3NhZ2U9ZnVuY3Rpb24odCl7dmFyIHI9dC5kYXRhO2lmKHIudGFyZ2V0TmFtZT09PW8uc291cmNlTmFtZSlpZihyLnN0cmVhbSlvLl9wcm9jZXNzU3RyZWFtTWVzc2FnZShyKTtlbHNlIGlmKHIuY2FsbGJhY2spe3ZhciBpPXIuY2FsbGJhY2tJZCx1PW8uY2FsbGJhY2tDYXBhYmlsaXRpZXNbaV07aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayAiLmNvbmNhdChpKSk7ZGVsZXRlIG8uY2FsbGJhY2tDYXBhYmlsaXRpZXNbaV07aWYoci5jYWxsYmFjaz09PWwpdS5yZXNvbHZlKHIuZGF0YSk7ZWxzZXtpZihyLmNhbGxiYWNrIT09Yyl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZSIpO3UucmVqZWN0KHdyYXBSZWFzb24oci5yZWFzb24pKX19ZWxzZXt2YXIgZD1vLmFjdGlvbkhhbmRsZXJbci5hY3Rpb25dO2lmKCFkKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBhY3Rpb24gZnJvbSB3b3JrZXI6ICIuY29uY2F0KHIuYWN0aW9uKSk7aWYoci5jYWxsYmFja0lkKXt2YXIgaD1vLnNvdXJjZU5hbWUscD1yLnNvdXJjZU5hbWU7bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3QoZChyLmRhdGEpKX0pKS50aGVuKChmdW5jdGlvbih0KXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmgsdGFyZ2V0TmFtZTpwLGNhbGxiYWNrOmwsY2FsbGJhY2tJZDpyLmNhbGxiYWNrSWQsZGF0YTp0fSl9KSwoZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpoLHRhcmdldE5hbWU6cCxjYWxsYmFjazpjLGNhbGxiYWNrSWQ6ci5jYWxsYmFja0lkLHJlYXNvbjp3cmFwUmVhc29uKHQpfSl9KSl9ZWxzZSByLnN0cmVhbUlkP28uX2NyZWF0ZVN0cmVhbVNpbmsocik6ZChyLmRhdGEpfX07YS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSl9IWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH0oTWVzc2FnZUhhbmRsZXIsW3trZXk6Im9uIix2YWx1ZTpmdW5jdGlvbiBvbih0LHIpe3ZhciBhPXRoaXMuYWN0aW9uSGFuZGxlcjtpZihhW3RdKXRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhbiBhY3Rpb25OYW1lIGNhbGxlZCAiJy5jb25jYXQodCwnIicpKTthW3RdPXJ9fSx7a2V5OiJzZW5kIix2YWx1ZTpmdW5jdGlvbiBzZW5kKHQscixhKXt0aGlzLl9wb3N0TWVzc2FnZSh7c291cmNlTmFtZTp0aGlzLnNvdXJjZU5hbWUsdGFyZ2V0TmFtZTp0aGlzLnRhcmdldE5hbWUsYWN0aW9uOnQsZGF0YTpyfSxhKX19LHtrZXk6InNlbmRXaXRoUHJvbWlzZSIsdmFsdWU6ZnVuY3Rpb24gc2VuZFdpdGhQcm9taXNlKHQscixhKXt2YXIgbz10aGlzLmNhbGxiYWNrSWQrKyxsPSgwLGkuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tvXT1sO3RyeXt0aGlzLl9wb3N0TWVzc2FnZSh7c291cmNlTmFtZTp0aGlzLnNvdXJjZU5hbWUsdGFyZ2V0TmFtZTp0aGlzLnRhcmdldE5hbWUsYWN0aW9uOnQsY2FsbGJhY2tJZDpvLGRhdGE6cn0sYSl9Y2F0Y2godCl7bC5yZWplY3QodCl9cmV0dXJuIGwucHJvbWlzZX19LHtrZXk6InNlbmRXaXRoU3RyZWFtIix2YWx1ZTpmdW5jdGlvbiBzZW5kV2l0aFN0cmVhbSh0LHIsYSxvKXt2YXIgbD10aGlzLGM9dGhpcy5zdHJlYW1JZCsrLGQ9dGhpcy5zb3VyY2VOYW1lLGg9dGhpcy50YXJnZXROYW1lLHA9dGhpcy5jb21PYmo7cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQ6ZnVuY3Rpb24gc3RhcnQoYSl7dmFyIHU9KDAsaS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtsLnN0cmVhbUNvbnRyb2xsZXJzW2NdPXtjb250cm9sbGVyOmEsc3RhcnRDYWxsOnUscHVsbENhbGw6bnVsbCxjYW5jZWxDYWxsOm51bGwsaXNDbG9zZWQ6ITF9O2wuX3Bvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmQsdGFyZ2V0TmFtZTpoLGFjdGlvbjp0LHN0cmVhbUlkOmMsZGF0YTpyLGRlc2lyZWRTaXplOmEuZGVzaXJlZFNpemV9LG8pO3JldHVybiB1LnByb21pc2V9LHB1bGw6ZnVuY3Rpb24gcHVsbCh0KXt2YXIgcj0oMCxpLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO2wuc3RyZWFtQ29udHJvbGxlcnNbY10ucHVsbENhbGw9cjtwLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmQsdGFyZ2V0TmFtZTpoLHN0cmVhbTp2LHN0cmVhbUlkOmMsZGVzaXJlZFNpemU6dC5kZXNpcmVkU2l6ZX0pO3JldHVybiByLnByb21pc2V9LGNhbmNlbDpmdW5jdGlvbiBjYW5jZWwodCl7KDAsaS5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvciwiY2FuY2VsIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvbiIpO3ZhciByPSgwLGkuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7bC5zdHJlYW1Db250cm9sbGVyc1tjXS5jYW5jZWxDYWxsPXI7bC5zdHJlYW1Db250cm9sbGVyc1tjXS5pc0Nsb3NlZD0hMDtwLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmQsdGFyZ2V0TmFtZTpoLHN0cmVhbTp1LHN0cmVhbUlkOmMscmVhc29uOndyYXBSZWFzb24odCl9KTtyZXR1cm4gci5wcm9taXNlfX0sYSl9fSx7a2V5OiJfY3JlYXRlU3RyZWFtU2luayIsdmFsdWU6ZnVuY3Rpb24gX2NyZWF0ZVN0cmVhbVNpbmsodCl7dmFyIHI9dGhpcyxhPXRoaXMuYWN0aW9uSGFuZGxlclt0LmFjdGlvbl0sbz10LnN0cmVhbUlkLGw9dGhpcy5zb3VyY2VOYW1lLGM9dC5zb3VyY2VOYW1lLHU9dGhpcy5jb21PYmosZD17ZW5xdWV1ZTpmdW5jdGlvbiBlbnF1ZXVlKHQpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxLHU9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoIXRoaXMuaXNDYW5jZWxsZWQpe3ZhciBkPXRoaXMuZGVzaXJlZFNpemU7dGhpcy5kZXNpcmVkU2l6ZS09YTtpZihkPjAmJnRoaXMuZGVzaXJlZFNpemU8PTApe3RoaXMuc2lua0NhcGFiaWxpdHk9KDAsaS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLnJlYWR5PXRoaXMuc2lua0NhcGFiaWxpdHkucHJvbWlzZX1yLl9wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpsLHRhcmdldE5hbWU6YyxzdHJlYW06cCxzdHJlYW1JZDpvLGNodW5rOnR9LHUpfX0sY2xvc2U6ZnVuY3Rpb24gY2xvc2UoKXtpZighdGhpcy5pc0NhbmNlbGxlZCl7dGhpcy5pc0NhbmNlbGxlZD0hMDt1LnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmwsdGFyZ2V0TmFtZTpjLHN0cmVhbTpoLHN0cmVhbUlkOm99KTtkZWxldGUgci5zdHJlYW1TaW5rc1tvXX19LGVycm9yOmZ1bmN0aW9uIGVycm9yKHQpeygwLGkuYXNzZXJ0KSh0IGluc3RhbmNlb2YgRXJyb3IsImVycm9yIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvbiIpO2lmKCF0aGlzLmlzQ2FuY2VsbGVkKXt0aGlzLmlzQ2FuY2VsbGVkPSEwO3UucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6bCx0YXJnZXROYW1lOmMsc3RyZWFtOm0sc3RyZWFtSWQ6byxyZWFzb246d3JhcFJlYXNvbih0KX0pfX0sc2lua0NhcGFiaWxpdHk6KDAsaS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSxvblB1bGw6bnVsbCxvbkNhbmNlbDpudWxsLGlzQ2FuY2VsbGVkOiExLGRlc2lyZWRTaXplOnQuZGVzaXJlZFNpemUscmVhZHk6bnVsbH07ZC5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7ZC5yZWFkeT1kLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7dGhpcy5zdHJlYW1TaW5rc1tvXT1kO25ldyBQcm9taXNlKChmdW5jdGlvbihyKXtyKGEodC5kYXRhLGQpKX0pKS50aGVuKChmdW5jdGlvbigpe3UucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6bCx0YXJnZXROYW1lOmMsc3RyZWFtOnksc3RyZWFtSWQ6byxzdWNjZXNzOiEwfSl9KSwoZnVuY3Rpb24odCl7dS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpsLHRhcmdldE5hbWU6YyxzdHJlYW06eSxzdHJlYW1JZDpvLHJlYXNvbjp3cmFwUmVhc29uKHQpfSl9KSl9fSx7a2V5OiJfcHJvY2Vzc1N0cmVhbU1lc3NhZ2UiLHZhbHVlOmZ1bmN0aW9uIF9wcm9jZXNzU3RyZWFtTWVzc2FnZSh0KXt2YXIgcj10LnN0cmVhbUlkLGE9dGhpcy5zb3VyY2VOYW1lLG89dC5zb3VyY2VOYW1lLGw9dGhpcy5jb21PYmo7c3dpdGNoKHQuc3RyZWFtKXtjYXNlIHk6dC5zdWNjZXNzP3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0uc3RhcnRDYWxsLnJlc29sdmUoKTp0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLnN0YXJ0Q2FsbC5yZWplY3Qod3JhcFJlYXNvbih0LnJlYXNvbikpO2JyZWFrO2Nhc2UgZzp0LnN1Y2Nlc3M/dGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5wdWxsQ2FsbC5yZXNvbHZlKCk6dGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbih0LnJlYXNvbikpO2JyZWFrO2Nhc2UgdjppZighdGhpcy5zdHJlYW1TaW5rc1tyXSl7bC5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6byxzdHJlYW06ZyxzdHJlYW1JZDpyLHN1Y2Nlc3M6ITB9KTticmVha310aGlzLnN0cmVhbVNpbmtzW3JdLmRlc2lyZWRTaXplPD0wJiZ0LmRlc2lyZWRTaXplPjAmJnRoaXMuc3RyZWFtU2lua3Nbcl0uc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO3RoaXMuc3RyZWFtU2lua3Nbcl0uZGVzaXJlZFNpemU9dC5kZXNpcmVkU2l6ZTt2YXIgYz10aGlzLnN0cmVhbVNpbmtzW3Quc3RyZWFtSWRdLm9uUHVsbDtuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCl7dChjJiZjKCkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7bC5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6byxzdHJlYW06ZyxzdHJlYW1JZDpyLHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbih0KXtsLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmEsdGFyZ2V0TmFtZTpvLHN0cmVhbTpnLHN0cmVhbUlkOnIscmVhc29uOndyYXBSZWFzb24odCl9KX0pKTticmVhaztjYXNlIHA6KDAsaS5hc3NlcnQpKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0sImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTtpZih0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLmlzQ2xvc2VkKWJyZWFrO3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0uY29udHJvbGxlci5lbnF1ZXVlKHQuY2h1bmspO2JyZWFrO2Nhc2UgaDooMCxpLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXSwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTtpZih0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLmlzQ2xvc2VkKWJyZWFrO3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0uaXNDbG9zZWQ9ITA7dGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5jb250cm9sbGVyLmNsb3NlKCk7dGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihyKTticmVhaztjYXNlIG06KDAsaS5hc3NlcnQpKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0sImVycm9yIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7dGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5jb250cm9sbGVyLmVycm9yKHdyYXBSZWFzb24odC5yZWFzb24pKTt0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHIpO2JyZWFrO2Nhc2UgZDp0LnN1Y2Nlc3M/dGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5jYW5jZWxDYWxsLnJlc29sdmUoKTp0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTt0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHIpO2JyZWFrO2Nhc2UgdTppZighdGhpcy5zdHJlYW1TaW5rc1tyXSlicmVhazt2YXIgYj10aGlzLnN0cmVhbVNpbmtzW3Quc3RyZWFtSWRdLm9uQ2FuY2VsO25ldyBQcm9taXNlKChmdW5jdGlvbihyKXtyKGImJmIod3JhcFJlYXNvbih0LnJlYXNvbikpKX0pKS50aGVuKChmdW5jdGlvbigpe2wucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6YSx0YXJnZXROYW1lOm8sc3RyZWFtOmQsc3RyZWFtSWQ6cixzdWNjZXNzOiEwfSl9KSwoZnVuY3Rpb24odCl7bC5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6byxzdHJlYW06ZCxzdHJlYW1JZDpyLHJlYXNvbjp3cmFwUmVhc29uKHQpfSl9KSk7dGhpcy5zdHJlYW1TaW5rc1tyXS5zaW5rQ2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbih0LnJlYXNvbikpO3RoaXMuc3RyZWFtU2lua3Nbcl0uaXNDYW5jZWxsZWQ9ITA7ZGVsZXRlIHRoaXMuc3RyZWFtU2lua3Nbcl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2UiKX19fSx7a2V5OiJfZGVsZXRlU3RyZWFtQ29udHJvbGxlciIsdmFsdWU6KHQ9ZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8saSl7dmFyIGw9dC5hcHBseShyLGEpO2Z1bmN0aW9uIF9uZXh0KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChsLG8saSxfbmV4dCxfdGhyb3csIm5leHQiLHQpfWZ1bmN0aW9uIF90aHJvdyh0KXthc3luY0dlbmVyYXRvclN0ZXAobCxvLGksX25leHQsX3Rocm93LCJ0aHJvdyIsdCl9X25leHQodm9pZCAwKX0pKX19KG8uZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlKHQpe3JldHVybiBvLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZSQocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6ci5uZXh0PTI7cmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChbdGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5zdGFydENhbGwsdGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5wdWxsQ2FsbCx0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLmNhbmNlbENhbGxdLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQucHJvbWlzZX0pKSk7Y2FzZSAyOmRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLF9jYWxsZWUsdGhpcyl9KSkpLGZ1bmN0aW9uIF9kZWxldGVTdHJlYW1Db250cm9sbGVyKHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJfcG9zdE1lc3NhZ2UiLHZhbHVlOmZ1bmN0aW9uIF9wb3N0TWVzc2FnZSh0LHIpe3ImJnRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM/dGhpcy5jb21PYmoucG9zdE1lc3NhZ2UodCxyKTp0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh0KX19LHtrZXk6ImRlc3Ryb3kiLHZhbHVlOmZ1bmN0aW9uIGRlc3Ryb3koKXt0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSl9fV0pO3ZhciB0O3JldHVybiBNZXNzYWdlSGFuZGxlcn0oKTtyLk1lc3NhZ2VIYW5kbGVyPWJ9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuTWV0YWRhdGE9dm9pZCAwO3ZhciBvPWEoNSksaT1hKDIxMik7ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIG89clthXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMTtvLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX12YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIE1ldGFkYXRhKHQpeyFmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxNZXRhZGF0YSk7KDAsby5hc3NlcnQpKCJzdHJpbmciPT10eXBlb2YgdCwiTWV0YWRhdGE6IGlucHV0IGlzIG5vdCBhIHN0cmluZyIpO3Q9dGhpcy5fcmVwYWlyKHQpO3ZhciByPShuZXcgaS5TaW1wbGVYTUxQYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0KTt0aGlzLl9tZXRhZGF0YU1hcD1uZXcgTWFwO3ImJnRoaXMuX3BhcnNlKHIpfSFmdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9KE1ldGFkYXRhLFt7a2V5OiJfcmVwYWlyIix2YWx1ZTpmdW5jdGlvbiBfcmVwYWlyKHQpe3JldHVybiB0LnJlcGxhY2UoL15bXjxdKy8sIiIpLnJlcGxhY2UoLz5cXDM3NlxcMzc3KFtePF0rKS9nLChmdW5jdGlvbih0LHIpe2Zvcih2YXIgYT1yLnJlcGxhY2UoL1xcKFswLTNdKShbMC03XSkoWzAtN10pL2csKGZ1bmN0aW9uKHQscixhLG8pe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDY0KnIrOCphKzEqbyl9KSkucmVwbGFjZSgvJihhbXB8YXBvc3xndHxsdHxxdW90KTsvZywoZnVuY3Rpb24odCxyKXtzd2l0Y2gocil7Y2FzZSJhbXAiOnJldHVybiImIjtjYXNlImFwb3MiOnJldHVybiInIjtjYXNlImd0IjpyZXR1cm4iPiI7Y2FzZSJsdCI6cmV0dXJuIjwiO2Nhc2UicXVvdCI6cmV0dXJuJyInfXRocm93IG5ldyBFcnJvcigiX3JlcGFpcjogIi5jb25jYXQociwiIGlzbid0IGRlZmluZWQuIikpfSkpLG89IiIsaT0wLGw9YS5sZW5ndGg7aTxsO2krPTIpe3ZhciBjPTI1NiphLmNoYXJDb2RlQXQoaSkrYS5jaGFyQ29kZUF0KGkrMSk7bys9Yz49MzImJmM8MTI3JiY2MCE9PWMmJjYyIT09YyYmMzghPT1jP1N0cmluZy5mcm9tQ2hhckNvZGUoYyk6IiYjeCIrKDY1NTM2K2MpLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSkrIjsifXJldHVybiI+IitvfSkpfX0se2tleToiX3BhcnNlIix2YWx1ZTpmdW5jdGlvbiBfcGFyc2UodCl7dmFyIHI9dC5kb2N1bWVudEVsZW1lbnQ7aWYoInJkZjpyZGYiIT09ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtyPXIuZmlyc3RDaGlsZDtmb3IoO3ImJiJyZGY6cmRmIiE9PXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTspcj1yLm5leHRTaWJsaW5nfXZhciBhPXI/ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOm51bGw7aWYociYmInJkZjpyZGYiPT09YSYmci5oYXNDaGlsZE5vZGVzKCkpZm9yKHZhciBvPXIuY2hpbGROb2RlcyxpPTAsbD1vLmxlbmd0aDtpPGw7aSsrKXt2YXIgYz1vW2ldO2lmKCJyZGY6ZGVzY3JpcHRpb24iPT09Yy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWZvcih2YXIgdT0wLGQ9Yy5jaGlsZE5vZGVzLmxlbmd0aDt1PGQ7dSsrKWlmKCIjdGV4dCIhPT1jLmNoaWxkTm9kZXNbdV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGg9Yy5jaGlsZE5vZGVzW3VdLHA9aC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3RoaXMuX21ldGFkYXRhTWFwLnNldChwLGgudGV4dENvbnRlbnQudHJpbSgpKX19fX0se2tleToiZ2V0Iix2YWx1ZTpmdW5jdGlvbiBnZXQodCl7cmV0dXJuIHRoaXMuX21ldGFkYXRhTWFwLmhhcyh0KT90aGlzLl9tZXRhZGF0YU1hcC5nZXQodCk6bnVsbH19LHtrZXk6ImdldEFsbCIsdmFsdWU6ZnVuY3Rpb24gZ2V0QWxsKCl7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLl9tZXRhZGF0YU1hcCl9fSx7a2V5OiJoYXMiLHZhbHVlOmZ1bmN0aW9uIGhhcyh0KXtyZXR1cm4gdGhpcy5fbWV0YWRhdGFNYXAuaGFzKHQpfX1dKTtyZXR1cm4gTWV0YWRhdGF9KCk7ci5NZXRhZGF0YT1sfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlNpbXBsZVhNTFBhcnNlcj12b2lkIDA7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfc2xpY2VkVG9BcnJheSh0LHIpe3JldHVybiBmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXModCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH0odCl8fGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdCh0LHIpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpKXJldHVybjt2YXIgYT1bXSxvPSEwLGk9ITEsbD12b2lkIDA7dHJ5e2Zvcih2YXIgYyx1PXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEobz0oYz11Lm5leHQoKSkuZG9uZSk7bz0hMCl7YS5wdXNoKGMudmFsdWUpO2lmKHImJmEubGVuZ3RoPT09cilicmVha319Y2F0Y2godCl7aT0hMDtsPXR9ZmluYWxseXt0cnl7b3x8bnVsbD09dS5yZXR1cm58fHUucmV0dXJuKCl9ZmluYWxseXtpZihpKXRocm93IGx9fXJldHVybiBhfSh0LHIpfHxmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1hfHwiU2V0Ij09PWEpcmV0dXJuIEFycmF5LmZyb20odCk7aWYoIkFyZ3VtZW50cyI9PT1hfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChhKSlyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKX0odCxyKXx8ZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkodCxyKXsobnVsbD09cnx8cj50Lmxlbmd0aCkmJihyPXQubGVuZ3RoKTtmb3IodmFyIGE9MCxvPW5ldyBBcnJheShyKTthPHI7YSsrKW9bYV09dFthXTtyZXR1cm4gb31mdW5jdGlvbiBfZ2V0KHQscixhKXtyZXR1cm4oX2dldD0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuZ2V0P1JlZmxlY3QuZ2V0OmZ1bmN0aW9uIF9nZXQodCxyLGEpe3ZhciBvPWZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKHQscil7Zm9yKDshT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJm51bGwhPT0odD1fZ2V0UHJvdG90eXBlT2YodCkpOyk7cmV0dXJuIHR9KHQscik7aWYobyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLHIpO3JldHVybiBpLmdldD9pLmdldC5jYWxsKGEpOmkudmFsdWV9fSkodCxyLGF8fHQpfWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3JldHVybihfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXt0Ll9fcHJvdG9fXz1yO3JldHVybiB0fSkodCxyKX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIodCl7dmFyIHI9ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKTtyZXR1cm4hMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIGEsbz1fZ2V0UHJvdG90eXBlT2YodCk7aWYocil7dmFyIGk9X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO2E9UmVmbGVjdC5jb25zdHJ1Y3Qobyxhcmd1bWVudHMsaSl9ZWxzZSBhPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLGEpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LHIpe3JldHVybiFyfHwib2JqZWN0IiE9PV90eXBlb2YocikmJiJmdW5jdGlvbiIhPXR5cGVvZiByP2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiB0fSh0KTpyfWZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KXtyZXR1cm4oX2dldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIG89clthXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMTtvLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9dmFyIG89MCxpPS0yLGw9LTMsYz0tNCx1PS01LGQ9LTYsaD0tOTtmdW5jdGlvbiBpc1doaXRlc3BhY2UodCxyKXt2YXIgYT10W3JdO3JldHVybiIgIj09PWF8fCJcbiI9PT1hfHwiXHIiPT09YXx8Ilx0Ij09PWF9dmFyIHA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBYTUxQYXJzZXJCYXNlKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsWE1MUGFyc2VyQmFzZSl9X2NyZWF0ZUNsYXNzKFhNTFBhcnNlckJhc2UsW3trZXk6Il9yZXNvbHZlRW50aXRpZXMiLHZhbHVlOmZ1bmN0aW9uIF9yZXNvbHZlRW50aXRpZXModCl7dmFyIHI9dGhpcztyZXR1cm4gdC5yZXBsYWNlKC8mKFteO10rKTsvZywoZnVuY3Rpb24odCxhKXtpZigiI3giPT09YS5zdWJzdHJpbmcoMCwyKSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChhLnN1YnN0cmluZygyKSwxNikpO2lmKCIjIj09PWEuc3Vic3RyaW5nKDAsMSkpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoYS5zdWJzdHJpbmcoMSksMTApKTtzd2l0Y2goYSl7Y2FzZSJsdCI6cmV0dXJuIjwiO2Nhc2UiZ3QiOnJldHVybiI+IjtjYXNlImFtcCI6cmV0dXJuIiYiO2Nhc2UicXVvdCI6cmV0dXJuJyInfXJldHVybiByLm9uUmVzb2x2ZUVudGl0eShhKX0pKX19LHtrZXk6Il9wYXJzZUNvbnRlbnQiLHZhbHVlOmZ1bmN0aW9uIF9wYXJzZUNvbnRlbnQodCxyKXt2YXIgYT1bXSxvPXI7ZnVuY3Rpb24gc2tpcFdzKCl7Zm9yKDtvPHQubGVuZ3RoJiZpc1doaXRlc3BhY2UodCxvKTspKytvfWZvcig7bzx0Lmxlbmd0aCYmIWlzV2hpdGVzcGFjZSh0LG8pJiYiPiIhPT10W29dJiYiLyIhPT10W29dOykrK287dmFyIGk9dC5zdWJzdHJpbmcocixvKTtza2lwV3MoKTtmb3IoO288dC5sZW5ndGgmJiI+IiE9PXRbb10mJiIvIiE9PXRbb10mJiI/IiE9PXRbb107KXtza2lwV3MoKTtmb3IodmFyIGwsYz0iIjtvPHQubGVuZ3RoJiYhaXNXaGl0ZXNwYWNlKHQsbykmJiI9IiE9PXRbb107KXtjKz10W29dOysrb31za2lwV3MoKTtpZigiPSIhPT10W29dKXJldHVybiBudWxsOysrbztza2lwV3MoKTt2YXIgdT10W29dO2lmKCciJyE9PXUmJiInIiE9PXUpcmV0dXJuIG51bGw7dmFyIGQ9dC5pbmRleE9mKHUsKytvKTtpZihkPDApcmV0dXJuIG51bGw7bD10LnN1YnN0cmluZyhvLGQpO2EucHVzaCh7bmFtZTpjLHZhbHVlOnRoaXMuX3Jlc29sdmVFbnRpdGllcyhsKX0pO289ZCsxO3NraXBXcygpfXJldHVybntuYW1lOmksYXR0cmlidXRlczphLHBhcnNlZDpvLXJ9fX0se2tleToiX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uIix2YWx1ZTpmdW5jdGlvbiBfcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odCxyKXt2YXIgYT1yO2Zvcig7YTx0Lmxlbmd0aCYmIWlzV2hpdGVzcGFjZSh0LGEpJiYiPiIhPT10W2FdJiYiLyIhPT10W2FdOykrK2E7dmFyIG89dC5zdWJzdHJpbmcocixhKTshZnVuY3Rpb24gc2tpcFdzKCl7Zm9yKDthPHQubGVuZ3RoJiZpc1doaXRlc3BhY2UodCxhKTspKythfSgpO2Zvcih2YXIgaT1hO2E8dC5sZW5ndGgmJigiPyIhPT10W2FdfHwiPiIhPT10W2ErMV0pOykrK2E7cmV0dXJue25hbWU6byx2YWx1ZTp0LnN1YnN0cmluZyhpLGEpLHBhcnNlZDphLXJ9fX0se2tleToicGFyc2VYbWwiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlWG1sKHQpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7KXt2YXIgYT1yO2lmKCI8Ij09PXRbcl0pe3ZhciBvPXZvaWQgMDtzd2l0Y2godFsrK2FdKXtjYXNlIi8iOisrYTtpZigobz10LmluZGV4T2YoIj4iLGEpKTwwKXt0aGlzLm9uRXJyb3IoaCk7cmV0dXJufXRoaXMub25FbmRFbGVtZW50KHQuc3Vic3RyaW5nKGEsbykpO2E9bysxO2JyZWFrO2Nhc2UiPyI6KythO3ZhciBwPXRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHQsYSk7aWYoIj8+IiE9PXQuc3Vic3RyaW5nKGErcC5wYXJzZWQsYStwLnBhcnNlZCsyKSl7dGhpcy5vbkVycm9yKGwpO3JldHVybn10aGlzLm9uUGkocC5uYW1lLHAudmFsdWUpO2ErPXAucGFyc2VkKzI7YnJlYWs7Y2FzZSIhIjppZigiLS0iPT09dC5zdWJzdHJpbmcoYSsxLGErMykpe2lmKChvPXQuaW5kZXhPZigiLS1ceDNlIixhKzMpKTwwKXt0aGlzLm9uRXJyb3IodSk7cmV0dXJufXRoaXMub25Db21tZW50KHQuc3Vic3RyaW5nKGErMyxvKSk7YT1vKzN9ZWxzZSBpZigiW0NEQVRBWyI9PT10LnN1YnN0cmluZyhhKzEsYSs4KSl7aWYoKG89dC5pbmRleE9mKCJdXT4iLGErOCkpPDApe3RoaXMub25FcnJvcihpKTtyZXR1cm59dGhpcy5vbkNkYXRhKHQuc3Vic3RyaW5nKGErOCxvKSk7YT1vKzN9ZWxzZXtpZigiRE9DVFlQRSIhPT10LnN1YnN0cmluZyhhKzEsYSs4KSl7dGhpcy5vbkVycm9yKGQpO3JldHVybn12YXIgbT10LmluZGV4T2YoIlsiLGErOCksdj0hMTtpZigobz10LmluZGV4T2YoIj4iLGErOCkpPDApe3RoaXMub25FcnJvcihjKTtyZXR1cm59aWYobT4wJiZvPm0pe2lmKChvPXQuaW5kZXhPZigiXT4iLGErOCkpPDApe3RoaXMub25FcnJvcihjKTtyZXR1cm59dj0hMH12YXIgZz10LnN1YnN0cmluZyhhKzgsbysodj8xOjApKTt0aGlzLm9uRG9jdHlwZShnKTthPW8rKHY/MjoxKX1icmVhaztkZWZhdWx0OnZhciB5PXRoaXMuX3BhcnNlQ29udGVudCh0LGEpO2lmKG51bGw9PT15KXt0aGlzLm9uRXJyb3IoZCk7cmV0dXJufXZhciBiPSExO2lmKCIvPiI9PT10LnN1YnN0cmluZyhhK3kucGFyc2VkLGEreS5wYXJzZWQrMikpYj0hMDtlbHNlIGlmKCI+IiE9PXQuc3Vic3RyaW5nKGEreS5wYXJzZWQsYSt5LnBhcnNlZCsxKSl7dGhpcy5vbkVycm9yKGgpO3JldHVybn10aGlzLm9uQmVnaW5FbGVtZW50KHkubmFtZSx5LmF0dHJpYnV0ZXMsYik7YSs9eS5wYXJzZWQrKGI/MjoxKX19ZWxzZXtmb3IoO2E8dC5sZW5ndGgmJiI8IiE9PXRbYV07KWErKzt2YXIgXz10LnN1YnN0cmluZyhyLGEpO3RoaXMub25UZXh0KHRoaXMuX3Jlc29sdmVFbnRpdGllcyhfKSl9cj1hfX19LHtrZXk6Im9uUmVzb2x2ZUVudGl0eSIsdmFsdWU6ZnVuY3Rpb24gb25SZXNvbHZlRW50aXR5KHQpe3JldHVybiImIi5jb25jYXQodCwiOyIpfX0se2tleToib25QaSIsdmFsdWU6ZnVuY3Rpb24gb25QaSh0LHIpe319LHtrZXk6Im9uQ29tbWVudCIsdmFsdWU6ZnVuY3Rpb24gb25Db21tZW50KHQpe319LHtrZXk6Im9uQ2RhdGEiLHZhbHVlOmZ1bmN0aW9uIG9uQ2RhdGEodCl7fX0se2tleToib25Eb2N0eXBlIix2YWx1ZTpmdW5jdGlvbiBvbkRvY3R5cGUodCl7fX0se2tleToib25UZXh0Iix2YWx1ZTpmdW5jdGlvbiBvblRleHQodCl7fX0se2tleToib25CZWdpbkVsZW1lbnQiLHZhbHVlOmZ1bmN0aW9uIG9uQmVnaW5FbGVtZW50KHQscixhKXt9fSx7a2V5OiJvbkVuZEVsZW1lbnQiLHZhbHVlOmZ1bmN0aW9uIG9uRW5kRWxlbWVudCh0KXt9fSx7a2V5OiJvbkVycm9yIix2YWx1ZTpmdW5jdGlvbiBvbkVycm9yKHQpe319XSk7cmV0dXJuIFhNTFBhcnNlckJhc2V9KCksbT1mdW5jdGlvbigpe2Z1bmN0aW9uIFNpbXBsZURPTU5vZGUodCxyKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTaW1wbGVET01Ob2RlKTt0aGlzLm5vZGVOYW1lPXQ7dGhpcy5ub2RlVmFsdWU9cjtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFyZW50Tm9kZSIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX1fY3JlYXRlQ2xhc3MoU2ltcGxlRE9NTm9kZSxbe2tleToiaGFzQ2hpbGROb2RlcyIsdmFsdWU6ZnVuY3Rpb24gaGFzQ2hpbGROb2Rlcygpe3JldHVybiB0aGlzLmNoaWxkTm9kZXMmJnRoaXMuY2hpbGROb2Rlcy5sZW5ndGg+MH19LHtrZXk6ImZpcnN0Q2hpbGQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzJiZ0aGlzLmNoaWxkTm9kZXNbMF19fSx7a2V5OiJuZXh0U2libGluZyIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzO2lmKHQpe3ZhciByPXQuaW5kZXhPZih0aGlzKTtpZigtMSE9PXIpcmV0dXJuIHRbcisxXX19fSx7a2V5OiJ0ZXh0Q29udGVudCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmNoaWxkTm9kZXM/dGhpcy5jaGlsZE5vZGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudGV4dENvbnRlbnR9KSkuam9pbigiIik6dGhpcy5ub2RlVmFsdWV8fCIifX1dKTtyZXR1cm4gU2ltcGxlRE9NTm9kZX0oKSx2PWZ1bmN0aW9uKHQpeyFmdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9KFNpbXBsZVhNTFBhcnNlcix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoU2ltcGxlWE1MUGFyc2VyKTtmdW5jdGlvbiBTaW1wbGVYTUxQYXJzZXIoKXt2YXIgdDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTaW1wbGVYTUxQYXJzZXIpOyh0PXIuY2FsbCh0aGlzKSkuX2N1cnJlbnRGcmFnbWVudD1udWxsO3QuX3N0YWNrPW51bGw7dC5fZXJyb3JDb2RlPW87cmV0dXJuIHR9X2NyZWF0ZUNsYXNzKFNpbXBsZVhNTFBhcnNlcixbe2tleToicGFyc2VGcm9tU3RyaW5nIix2YWx1ZTpmdW5jdGlvbiBwYXJzZUZyb21TdHJpbmcodCl7dGhpcy5fY3VycmVudEZyYWdtZW50PVtdO3RoaXMuX3N0YWNrPVtdO3RoaXMuX2Vycm9yQ29kZT1vO3RoaXMucGFyc2VYbWwodCk7aWYodGhpcy5fZXJyb3JDb2RlPT09byl7dmFyIHI9X3NsaWNlZFRvQXJyYXkodGhpcy5fY3VycmVudEZyYWdtZW50LDEpWzBdO2lmKHIpcmV0dXJue2RvY3VtZW50RWxlbWVudDpyfX19fSx7a2V5OiJvblJlc29sdmVFbnRpdHkiLHZhbHVlOmZ1bmN0aW9uIG9uUmVzb2x2ZUVudGl0eSh0KXtzd2l0Y2godCl7Y2FzZSJhcG9zIjpyZXR1cm4iJyJ9cmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKFNpbXBsZVhNTFBhcnNlci5wcm90b3R5cGUpLCJvblJlc29sdmVFbnRpdHkiLHRoaXMpLmNhbGwodGhpcyx0KX19LHtrZXk6Im9uVGV4dCIsdmFsdWU6ZnVuY3Rpb24gb25UZXh0KHQpe2lmKCFmdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcodCl7Zm9yKHZhciByPTAsYT10Lmxlbmd0aDtyPGE7cisrKWlmKCFpc1doaXRlc3BhY2UodCxyKSlyZXR1cm4hMTtyZXR1cm4hMH0odCkpe3ZhciByPW5ldyBtKCIjdGV4dCIsdCk7dGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gocil9fX0se2tleToib25DZGF0YSIsdmFsdWU6ZnVuY3Rpb24gb25DZGF0YSh0KXt2YXIgcj1uZXcgbSgiI3RleHQiLHQpO3RoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKHIpfX0se2tleToib25CZWdpbkVsZW1lbnQiLHZhbHVlOmZ1bmN0aW9uIG9uQmVnaW5FbGVtZW50KHQscixhKXt2YXIgbz1uZXcgbSh0KTtvLmNoaWxkTm9kZXM9W107dGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobyk7aWYoIWEpe3RoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudEZyYWdtZW50KTt0aGlzLl9jdXJyZW50RnJhZ21lbnQ9by5jaGlsZE5vZGVzfX19LHtrZXk6Im9uRW5kRWxlbWVudCIsdmFsdWU6ZnVuY3Rpb24gb25FbmRFbGVtZW50KHQpe3RoaXMuX2N1cnJlbnRGcmFnbWVudD10aGlzLl9zdGFjay5wb3AoKXx8W107dmFyIHI9dGhpcy5fY3VycmVudEZyYWdtZW50W3RoaXMuX2N1cnJlbnRGcmFnbWVudC5sZW5ndGgtMV07aWYocilmb3IodmFyIGE9MCxvPXIuY2hpbGROb2Rlcy5sZW5ndGg7YTxvO2ErKylyLmNoaWxkTm9kZXNbYV0ucGFyZW50Tm9kZT1yfX0se2tleToib25FcnJvciIsdmFsdWU6ZnVuY3Rpb24gb25FcnJvcih0KXt0aGlzLl9lcnJvckNvZGU9dH19XSk7cmV0dXJuIFNpbXBsZVhNTFBhcnNlcn0ocCk7ci5TaW1wbGVYTUxQYXJzZXI9dn0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5PcHRpb25hbENvbnRlbnRDb25maWc9dm9pZCAwO3ZhciBvPWEoNSk7ZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCxyKXt2YXIgYTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwoYT1mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1hfHwiU2V0Ij09PWEpcmV0dXJuIEFycmF5LmZyb20odCk7aWYoIkFyZ3VtZW50cyI9PT1hfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChhKSlyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKX0odCkpfHxyJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXthJiYodD1hKTt2YXIgbz0wLGk9ZnVuY3Rpb24gRigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uIG4oKXtyZXR1cm4gbz49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbbysrXX19LGU6ZnVuY3Rpb24gZSh0KXt0aHJvdyB0fSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgbCxjPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24gcygpe2E9dFtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24gbigpe3ZhciB0PWEubmV4dCgpO2M9dC5kb25lO3JldHVybiB0fSxlOmZ1bmN0aW9uIGUodCl7dT0hMDtsPXR9LGY6ZnVuY3Rpb24gZigpe3RyeXtjfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgbH19fX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLG89bmV3IEFycmF5KHIpO2E8cjthKyspb1thXT10W2FdO3JldHVybiBvfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIGk9ZnVuY3Rpb24gT3B0aW9uYWxDb250ZW50R3JvdXAodCxyKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxPcHRpb25hbENvbnRlbnRHcm91cCk7dGhpcy52aXNpYmxlPSEwO3RoaXMubmFtZT10O3RoaXMuaW50ZW50PXJ9LGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBPcHRpb25hbENvbnRlbnRDb25maWcodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsT3B0aW9uYWxDb250ZW50Q29uZmlnKTt0aGlzLm5hbWU9bnVsbDt0aGlzLmNyZWF0b3I9bnVsbDt0aGlzLl9vcmRlcj1udWxsO3RoaXMuX2dyb3Vwcz1uZXcgTWFwO2lmKG51bGwhPT10KXt0aGlzLm5hbWU9dC5uYW1lO3RoaXMuY3JlYXRvcj10LmNyZWF0b3I7dGhpcy5fb3JkZXI9dC5vcmRlcjt2YXIgcixhPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQuZ3JvdXBzKTt0cnl7Zm9yKGEucygpOyEocj1hLm4oKSkuZG9uZTspe3ZhciBvPXIudmFsdWU7dGhpcy5fZ3JvdXBzLnNldChvLmlkLG5ldyBpKG8ubmFtZSxvLmludGVudCkpfX1jYXRjaCh0KXthLmUodCl9ZmluYWxseXthLmYoKX1pZigiT0ZGIj09PXQuYmFzZVN0YXRlKXt2YXIgbCxjPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX2dyb3Vwcyk7dHJ5e2ZvcihjLnMoKTshKGw9Yy5uKCkpLmRvbmU7KXtsLnZhbHVlLnZpc2libGU9ITF9fWNhdGNoKHQpe2MuZSh0KX1maW5hbGx5e2MuZigpfX12YXIgdSxkPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQub24pO3RyeXtmb3IoZC5zKCk7ISh1PWQubigpKS5kb25lOyl7dmFyIGg9dS52YWx1ZTt0aGlzLl9ncm91cHMuZ2V0KGgpLnZpc2libGU9ITB9fWNhdGNoKHQpe2QuZSh0KX1maW5hbGx5e2QuZigpfXZhciBwLG09X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodC5vZmYpO3RyeXtmb3IobS5zKCk7IShwPW0ubigpKS5kb25lOyl7dmFyIHY9cC52YWx1ZTt0aGlzLl9ncm91cHMuZ2V0KHYpLnZpc2libGU9ITF9fWNhdGNoKHQpe20uZSh0KX1maW5hbGx5e20uZigpfX19IWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH0oT3B0aW9uYWxDb250ZW50Q29uZmlnLFt7a2V5OiJpc1Zpc2libGUiLHZhbHVlOmZ1bmN0aW9uIGlzVmlzaWJsZSh0KXtpZigiT0NHIj09PXQudHlwZSl7aWYoIXRoaXMuX2dyb3Vwcy5oYXModC5pZCkpeygwLG8ud2FybikoIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAiLmNvbmNhdCh0LmlkKSk7cmV0dXJuITB9cmV0dXJuIHRoaXMuX2dyb3Vwcy5nZXQodC5pZCkudmlzaWJsZX1pZigiT0NNRCI9PT10LnR5cGUpe3QuZXhwcmVzc2lvbiYmKDAsby53YXJuKSgiVmlzaWJpbGl0eSBleHByZXNzaW9uIG5vdCBzdXBwb3J0ZWQgeWV0LiIpO2lmKCF0LnBvbGljeXx8IkFueU9uIj09PXQucG9saWN5KXt2YXIgcixhPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQuaWRzKTt0cnl7Zm9yKGEucygpOyEocj1hLm4oKSkuZG9uZTspe3ZhciBpPXIudmFsdWU7aWYoIXRoaXMuX2dyb3Vwcy5oYXMoaSkpeygwLG8ud2FybikoIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAiLmNvbmNhdChpKSk7cmV0dXJuITB9aWYodGhpcy5fZ3JvdXBzLmdldChpKS52aXNpYmxlKXJldHVybiEwfX1jYXRjaCh0KXthLmUodCl9ZmluYWxseXthLmYoKX1yZXR1cm4hMX1pZigiQWxsT24iPT09dC5wb2xpY3kpe3ZhciBsLGM9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodC5pZHMpO3RyeXtmb3IoYy5zKCk7IShsPWMubigpKS5kb25lOyl7dmFyIHU9bC52YWx1ZTtpZighdGhpcy5fZ3JvdXBzLmhhcyh1KSl7KDAsby53YXJuKSgiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICIuY29uY2F0KHUpKTtyZXR1cm4hMH1pZighdGhpcy5fZ3JvdXBzLmdldCh1KS52aXNpYmxlKXJldHVybiExfX1jYXRjaCh0KXtjLmUodCl9ZmluYWxseXtjLmYoKX1yZXR1cm4hMH1pZigiQW55T2ZmIj09PXQucG9saWN5KXt2YXIgZCxoPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQuaWRzKTt0cnl7Zm9yKGgucygpOyEoZD1oLm4oKSkuZG9uZTspe3ZhciBwPWQudmFsdWU7aWYoIXRoaXMuX2dyb3Vwcy5oYXMocCkpeygwLG8ud2FybikoIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAiLmNvbmNhdChwKSk7cmV0dXJuITB9aWYoIXRoaXMuX2dyb3Vwcy5nZXQocCkudmlzaWJsZSlyZXR1cm4hMH19Y2F0Y2godCl7aC5lKHQpfWZpbmFsbHl7aC5mKCl9cmV0dXJuITF9aWYoIkFsbE9mZiI9PT10LnBvbGljeSl7dmFyIG0sdj1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0Lmlkcyk7dHJ5e2Zvcih2LnMoKTshKG09di5uKCkpLmRvbmU7KXt2YXIgZz1tLnZhbHVlO2lmKCF0aGlzLl9ncm91cHMuaGFzKGcpKXsoMCxvLndhcm4pKCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogIi5jb25jYXQoZykpO3JldHVybiEwfWlmKHRoaXMuX2dyb3Vwcy5nZXQoZykudmlzaWJsZSlyZXR1cm4hMX19Y2F0Y2godCl7di5lKHQpfWZpbmFsbHl7di5mKCl9cmV0dXJuITB9KDAsby53YXJuKSgiVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSAiLmNvbmNhdCh0LnBvbGljeSwiLiIpKTtyZXR1cm4hMH0oMCxvLndhcm4pKCJVbmtub3duIGdyb3VwIHR5cGUgIi5jb25jYXQodC50eXBlLCIuIikpO3JldHVybiEwfX0se2tleToic2V0VmlzaWJpbGl0eSIsdmFsdWU6ZnVuY3Rpb24gc2V0VmlzaWJpbGl0eSh0KXt2YXIgcj0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO3RoaXMuX2dyb3Vwcy5oYXModCk/dGhpcy5fZ3JvdXBzLmdldCh0KS52aXNpYmxlPSEhcjooMCxvLndhcm4pKCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogIi5jb25jYXQodCkpfX0se2tleToiZ2V0T3JkZXIiLHZhbHVlOmZ1bmN0aW9uIGdldE9yZGVyKCl7cmV0dXJuIHRoaXMuX2dyb3Vwcy5zaXplP3RoaXMuX29yZGVyP3RoaXMuX29yZGVyLnNsaWNlKCk6QXJyYXkuZnJvbSh0aGlzLl9ncm91cHMua2V5cygpKTpudWxsfX0se2tleToiZ2V0R3JvdXBzIix2YWx1ZTpmdW5jdGlvbiBnZXRHcm91cHMoKXtyZXR1cm4gdGhpcy5fZ3JvdXBzLnNpemU/T2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX2dyb3Vwcyk6bnVsbH19LHtrZXk6ImdldEdyb3VwIix2YWx1ZTpmdW5jdGlvbiBnZXRHcm91cCh0KXtyZXR1cm4gdGhpcy5fZ3JvdXBzLmdldCh0KXx8bnVsbH19XSk7cmV0dXJuIE9wdGlvbmFsQ29udGVudENvbmZpZ30oKTtyLk9wdGlvbmFsQ29udGVudENvbmZpZz1sfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBERkRhdGFUcmFuc3BvcnRTdHJlYW09dm9pZCAwO3ZhciBvPWZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShhKDIpKSxpPWEoNSk7ZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKHQscixhLG8saSxsLGMpe3RyeXt2YXIgdT10W2xdKGMpLGQ9dS52YWx1ZX1jYXRjaCh0KXthKHQpO3JldHVybn11LmRvbmU/cihkKTpQcm9taXNlLnJlc29sdmUoZCkudGhlbihvLGkpfWZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsYT1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe3ZhciBsPXQuYXBwbHkocixhKTtmdW5jdGlvbiBfbmV4dCh0KXthc3luY0dlbmVyYXRvclN0ZXAobCxvLGksX25leHQsX3Rocm93LCJuZXh0Iix0KX1mdW5jdGlvbiBfdGhyb3codCl7YXN5bmNHZW5lcmF0b3JTdGVwKGwsbyxpLF9uZXh0LF90aHJvdywidGhyb3ciLHQpfV9uZXh0KHZvaWQgMCl9KSl9fWZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQscil7dmFyIGE7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KGE9ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYoIXQpcmV0dXJuO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKTt2YXIgYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7Ik9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09YXx8IlNldCI9PT1hKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKCJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSkpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscil9KHQpKXx8ciYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7YSYmKHQ9YSk7dmFyIG89MCxpPWZ1bmN0aW9uIEYoKXt9O3JldHVybntzOmksbjpmdW5jdGlvbiBuKCl7cmV0dXJuIG8+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W28rK119fSxlOmZ1bmN0aW9uIGUodCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGwsYz0hMCx1PSExO3JldHVybntzOmZ1bmN0aW9uIHMoKXthPXRbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uIG4oKXt2YXIgdD1hLm5leHQoKTtjPXQuZG9uZTtyZXR1cm4gdH0sZTpmdW5jdGlvbiBlKHQpe3U9ITA7bD10fSxmOmZ1bmN0aW9uIGYoKXt0cnl7Y3x8bnVsbD09YS5yZXR1cm58fGEucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IGx9fX19ZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkodCxyKXsobnVsbD09cnx8cj50Lmxlbmd0aCkmJihyPXQubGVuZ3RoKTtmb3IodmFyIGE9MCxvPW5ldyBBcnJheShyKTthPHI7YSsrKW9bYV09dFthXTtyZXR1cm4gb31mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgbz1yW2FdO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExO28uY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0odCxyKXt2YXIgYT10aGlzO19jbGFzc0NhbGxDaGVjayh0aGlzLFBERkRhdGFUcmFuc3BvcnRTdHJlYW0pOygwLGkuYXNzZXJ0KShyLCdQREZEYXRhVHJhbnNwb3J0U3RyZWFtIC0gbWlzc2luZyByZXF1aXJlZCAicGRmRGF0YVJhbmdlVHJhbnNwb3J0IiBhcmd1bWVudC4nKTt0aGlzLl9xdWV1ZWRDaHVua3M9W107dGhpcy5fcHJvZ3Jlc3NpdmVEb25lPXQucHJvZ3Jlc3NpdmVEb25lfHwhMTt2YXIgbz10LmluaXRpYWxEYXRhO2lmKG8mJm8ubGVuZ3RoPjApe3ZhciBsPW5ldyBVaW50OEFycmF5KG8pLmJ1ZmZlcjt0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChsKX10aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQ9cjt0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZD0hdC5kaXNhYmxlU3RyZWFtO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9IXQuZGlzYWJsZVJhbmdlO3RoaXMuX2NvbnRlbnRMZW5ndGg9dC5sZW5ndGg7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbDt0aGlzLl9yYW5nZVJlYWRlcnM9W107dGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFJhbmdlTGlzdGVuZXIoKGZ1bmN0aW9uKHQscil7YS5fb25SZWNlaXZlRGF0YSh7YmVnaW46dCxjaHVuazpyfSl9KSk7dGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzTGlzdGVuZXIoKGZ1bmN0aW9uKHQscil7YS5fb25Qcm9ncmVzcyh7bG9hZGVkOnQsdG90YWw6cn0pfSkpO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcigoZnVuY3Rpb24odCl7YS5fb25SZWNlaXZlRGF0YSh7Y2h1bms6dH0pfSkpO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcigoZnVuY3Rpb24oKXthLl9vblByb2dyZXNzaXZlRG9uZSgpfSkpO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpfV9jcmVhdGVDbGFzcyhQREZEYXRhVHJhbnNwb3J0U3RyZWFtLFt7a2V5OiJfb25SZWNlaXZlRGF0YSIsdmFsdWU6ZnVuY3Rpb24gX29uUmVjZWl2ZURhdGEodCl7dmFyIHI9bmV3IFVpbnQ4QXJyYXkodC5jaHVuaykuYnVmZmVyO2lmKHZvaWQgMD09PXQuYmVnaW4pdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2VucXVldWUocik6dGhpcy5fcXVldWVkQ2h1bmtzLnB1c2gocik7ZWxzZXt2YXIgYT10aGlzLl9yYW5nZVJlYWRlcnMuc29tZSgoZnVuY3Rpb24oYSl7aWYoYS5fYmVnaW4hPT10LmJlZ2luKXJldHVybiExO2EuX2VucXVldWUocik7cmV0dXJuITB9KSk7KDAsaS5hc3NlcnQpKGEsIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuIil9fX0se2tleToiX29uUHJvZ3Jlc3MiLHZhbHVlOmZ1bmN0aW9uIF9vblByb2dyZXNzKHQpe2lmKHZvaWQgMD09PXQudG90YWwpe3ZhciByPXRoaXMuX3JhbmdlUmVhZGVyc1swXTtyJiZyLm9uUHJvZ3Jlc3MmJnIub25Qcm9ncmVzcyh7bG9hZGVkOnQubG9hZGVkfSl9ZWxzZXt2YXIgYT10aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjthJiZhLm9uUHJvZ3Jlc3MmJmEub25Qcm9ncmVzcyh7bG9hZGVkOnQubG9hZGVkLHRvdGFsOnQudG90YWx9KX19fSx7a2V5OiJfb25Qcm9ncmVzc2l2ZURvbmUiLHZhbHVlOmZ1bmN0aW9uIF9vblByb2dyZXNzaXZlRG9uZSgpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyJiZ0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5wcm9ncmVzc2l2ZURvbmUoKTt0aGlzLl9wcm9ncmVzc2l2ZURvbmU9ITB9fSx7a2V5OiJfcmVtb3ZlUmFuZ2VSZWFkZXIiLHZhbHVlOmZ1bmN0aW9uIF9yZW1vdmVSYW5nZVJlYWRlcih0KXt2YXIgcj10aGlzLl9yYW5nZVJlYWRlcnMuaW5kZXhPZih0KTtyPj0wJiZ0aGlzLl9yYW5nZVJlYWRlcnMuc3BsaWNlKHIsMSl9fSx7a2V5OiJnZXRGdWxsUmVhZGVyIix2YWx1ZTpmdW5jdGlvbiBnZXRGdWxsUmVhZGVyKCl7KDAsaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGRGF0YVRyYW5zcG9ydFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpO3ZhciB0PXRoaXMuX3F1ZXVlZENodW5rczt0aGlzLl9xdWV1ZWRDaHVua3M9bnVsbDtyZXR1cm4gbmV3IGModGhpcyx0LHRoaXMuX3Byb2dyZXNzaXZlRG9uZSl9fSx7a2V5OiJnZXRSYW5nZVJlYWRlciIsdmFsdWU6ZnVuY3Rpb24gZ2V0UmFuZ2VSZWFkZXIodCxyKXtpZihyPD10aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpcmV0dXJuIG51bGw7dmFyIGE9bmV3IHUodGhpcyx0LHIpO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlKHQscik7dGhpcy5fcmFuZ2VSZWFkZXJzLnB1c2goYSk7cmV0dXJuIGF9fSx7a2V5OiJjYW5jZWxBbGxSZXF1ZXN0cyIsdmFsdWU6ZnVuY3Rpb24gY2FuY2VsQWxsUmVxdWVzdHModCl7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXImJnRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbCh0KTt0aGlzLl9yYW5nZVJlYWRlcnMuc2xpY2UoMCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7ci5jYW5jZWwodCl9KSk7dGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFib3J0KCl9fSx7a2V5OiJfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyP3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQ6MH19XSk7cmV0dXJuIFBERkRhdGFUcmFuc3BvcnRTdHJlYW19KCk7ci5QREZEYXRhVHJhbnNwb3J0U3RyZWFtPWw7dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyKHQscil7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyKTt0aGlzLl9zdHJlYW09dDt0aGlzLl9kb25lPWF8fCExO3RoaXMuX2ZpbGVuYW1lPW51bGw7dGhpcy5fcXVldWVkQ2h1bmtzPXJ8fFtdO3RoaXMuX2xvYWRlZD0wO3ZhciBvLGk9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5fcXVldWVkQ2h1bmtzKTt0cnl7Zm9yKGkucygpOyEobz1pLm4oKSkuZG9uZTspe3ZhciBsPW8udmFsdWU7dGhpcy5fbG9hZGVkKz1sLmJ5dGVMZW5ndGh9fWNhdGNoKHQpe2kuZSh0KX1maW5hbGx5e2kuZigpfXRoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX2hlYWRlcnNSZWFkeT1Qcm9taXNlLnJlc29sdmUoKTt0Ll9mdWxsUmVxdWVzdFJlYWRlcj10aGlzO3RoaXMub25Qcm9ncmVzcz1udWxsfV9jcmVhdGVDbGFzcyhQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyLFt7a2V5OiJfZW5xdWV1ZSIsdmFsdWU6ZnVuY3Rpb24gX2VucXVldWUodCl7aWYoIXRoaXMuX2RvbmUpe2lmKHRoaXMuX3JlcXVlc3RzLmxlbmd0aD4wKXt0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpLnJlc29sdmUoe3ZhbHVlOnQsZG9uZTohMX0pfWVsc2UgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2godCk7dGhpcy5fbG9hZGVkKz10LmJ5dGVMZW5ndGh9fX0se2tleToicmVhZCIsdmFsdWU6KHQ9X2FzeW5jVG9HZW5lcmF0b3Ioby5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUoKXt2YXIgdCxyO3JldHVybiBvLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZSQoYSl7Zm9yKDs7KXN3aXRjaChhLnByZXY9YS5uZXh0KXtjYXNlIDA6aWYoISh0aGlzLl9xdWV1ZWRDaHVua3MubGVuZ3RoPjApKXthLm5leHQ9MzticmVha310PXRoaXMuX3F1ZXVlZENodW5rcy5zaGlmdCgpO3JldHVybiBhLmFicnVwdCgicmV0dXJuIix7dmFsdWU6dCxkb25lOiExfSk7Y2FzZSAzOmlmKCF0aGlzLl9kb25lKXthLm5leHQ9NTticmVha31yZXR1cm4gYS5hYnJ1cHQoInJldHVybiIse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk7Y2FzZSA1OnI9KDAsaS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9yZXF1ZXN0cy5wdXNoKHIpO3JldHVybiBhLmFicnVwdCgicmV0dXJuIixyLnByb21pc2UpO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIGEuc3RvcCgpfX0pLF9jYWxsZWUsdGhpcyl9KSkpLGZ1bmN0aW9uIHJlYWQoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiY2FuY2VsIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWwodCl7dGhpcy5fZG9uZT0hMDt0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlc29sdmUoe3ZhbHVlOnZvaWQgMCxkb25lOiEwfSl9KSk7dGhpcy5fcmVxdWVzdHM9W119fSx7a2V5OiJwcm9ncmVzc2l2ZURvbmUiLHZhbHVlOmZ1bmN0aW9uIHByb2dyZXNzaXZlRG9uZSgpe3RoaXMuX2RvbmV8fCh0aGlzLl9kb25lPSEwKX19LHtrZXk6ImhlYWRlcnNSZWFkeSIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9oZWFkZXJzUmVhZHl9fSx7a2V5OiJmaWxlbmFtZSIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9maWxlbmFtZX19LHtrZXk6ImlzUmFuZ2VTdXBwb3J0ZWQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkfX0se2tleToiaXNTdHJlYW1pbmdTdXBwb3J0ZWQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZH19LHtrZXk6ImNvbnRlbnRMZW5ndGgiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RofX1dKTt2YXIgdDtyZXR1cm4gUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcn0oKSx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyKHQscixhKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIpO3RoaXMuX3N0cmVhbT10O3RoaXMuX2JlZ2luPXI7dGhpcy5fZW5kPWE7dGhpcy5fcXVldWVkQ2h1bms9bnVsbDt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9kb25lPSExO3RoaXMub25Qcm9ncmVzcz1udWxsfV9jcmVhdGVDbGFzcyhQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIsW3trZXk6Il9lbnF1ZXVlIix2YWx1ZTpmdW5jdGlvbiBfZW5xdWV1ZSh0KXtpZighdGhpcy5fZG9uZSl7aWYoMD09PXRoaXMuX3JlcXVlc3RzLmxlbmd0aCl0aGlzLl9xdWV1ZWRDaHVuaz10O2Vsc2V7dGhpcy5fcmVxdWVzdHMuc2hpZnQoKS5yZXNvbHZlKHt2YWx1ZTp0LGRvbmU6ITF9KTt0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlc29sdmUoe3ZhbHVlOnZvaWQgMCxkb25lOiEwfSl9KSk7dGhpcy5fcmVxdWVzdHM9W119dGhpcy5fZG9uZT0hMDt0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpfX19LHtrZXk6InJlYWQiLHZhbHVlOih0PV9hc3luY1RvR2VuZXJhdG9yKG8uZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlMigpe3ZhciB0LHI7cmV0dXJuIG8uZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMiQoYSl7Zm9yKDs7KXN3aXRjaChhLnByZXY9YS5uZXh0KXtjYXNlIDA6aWYoIXRoaXMuX3F1ZXVlZENodW5rKXthLm5leHQ9NDticmVha310PXRoaXMuX3F1ZXVlZENodW5rO3RoaXMuX3F1ZXVlZENodW5rPW51bGw7cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHt2YWx1ZTp0LGRvbmU6ITF9KTtjYXNlIDQ6aWYoIXRoaXMuX2RvbmUpe2EubmV4dD02O2JyZWFrfXJldHVybiBhLmFicnVwdCgicmV0dXJuIix7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KTtjYXNlIDY6cj0oMCxpLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMuX3JlcXVlc3RzLnB1c2gocik7cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHIucHJvbWlzZSk7Y2FzZSA5OmNhc2UiZW5kIjpyZXR1cm4gYS5zdG9wKCl9fSksX2NhbGxlZTIsdGhpcyl9KSkpLGZ1bmN0aW9uIHJlYWQoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiY2FuY2VsIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWwodCl7dGhpcy5fZG9uZT0hMDt0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlc29sdmUoe3ZhbHVlOnZvaWQgMCxkb25lOiEwfSl9KSk7dGhpcy5fcmVxdWVzdHM9W107dGhpcy5fc3RyZWFtLl9yZW1vdmVSYW5nZVJlYWRlcih0aGlzKX19LHtrZXk6ImlzU3RyZWFtaW5nU3VwcG9ydGVkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuITF9fV0pO3ZhciB0O3JldHVybiBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXJ9KCl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuV2ViR0xDb250ZXh0PXZvaWQgMDt2YXIgbz1hKDUpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBXZWJHTENvbnRleHQodCl7dmFyIHI9dC5lbmFibGUsYT12b2lkIDAhPT1yJiZyOyFmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxXZWJHTENvbnRleHQpO3RoaXMuX2VuYWJsZWQ9ITA9PT1hfSFmdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9KFdlYkdMQ29udGV4dCxbe2tleToiY29tcG9zZVNNYXNrIix2YWx1ZTpmdW5jdGlvbiBjb21wb3NlU01hc2sodCl7dmFyIHI9dC5sYXllcixhPXQubWFzayxvPXQucHJvcGVydGllcztyZXR1cm4gbC5jb21wb3NlU01hc2socixhLG8pfX0se2tleToiZHJhd0ZpZ3VyZXMiLHZhbHVlOmZ1bmN0aW9uIGRyYXdGaWd1cmVzKHQpe3ZhciByPXQud2lkdGgsYT10LmhlaWdodCxvPXQuYmFja2dyb3VuZENvbG9yLGk9dC5maWd1cmVzLGM9dC5jb250ZXh0O3JldHVybiBsLmRyYXdGaWd1cmVzKHIsYSxvLGksYyl9fSx7a2V5OiJjbGVhciIsdmFsdWU6ZnVuY3Rpb24gY2xlYXIoKXtsLmNsZWFudXAoKX19LHtrZXk6ImlzRW5hYmxlZCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXRoaXMuX2VuYWJsZWQ7dCYmKHQ9bC50cnlJbml0R0woKSk7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsImlzRW5hYmxlZCIsdCl9fV0pO3JldHVybiBXZWJHTENvbnRleHR9KCk7ci5XZWJHTENvbnRleHQ9aTt2YXIgbD1mdW5jdGlvbiBXZWJHTFV0aWxzQ2xvc3VyZSgpe2Z1bmN0aW9uIGxvYWRTaGFkZXIodCxyLGEpe3ZhciBvPXQuY3JlYXRlU2hhZGVyKGEpO3Quc2hhZGVyU291cmNlKG8scik7dC5jb21waWxlU2hhZGVyKG8pO2lmKCF0LmdldFNoYWRlclBhcmFtZXRlcihvLHQuQ09NUElMRV9TVEFUVVMpKXt2YXIgaT10LmdldFNoYWRlckluZm9Mb2cobyk7dGhyb3cgbmV3IEVycm9yKCJFcnJvciBkdXJpbmcgc2hhZGVyIGNvbXBpbGF0aW9uOiAiK2kpfXJldHVybiBvfWZ1bmN0aW9uIGNyZWF0ZVZlcnRleFNoYWRlcih0LHIpe3JldHVybiBsb2FkU2hhZGVyKHQscix0LlZFUlRFWF9TSEFERVIpfWZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50U2hhZGVyKHQscil7cmV0dXJuIGxvYWRTaGFkZXIodCxyLHQuRlJBR01FTlRfU0hBREVSKX1mdW5jdGlvbiBjcmVhdGVQcm9ncmFtKHQscil7Zm9yKHZhciBhPXQuY3JlYXRlUHJvZ3JhbSgpLG89MCxpPXIubGVuZ3RoO288aTsrK28pdC5hdHRhY2hTaGFkZXIoYSxyW29dKTt0LmxpbmtQcm9ncmFtKGEpO2lmKCF0LmdldFByb2dyYW1QYXJhbWV0ZXIoYSx0LkxJTktfU1RBVFVTKSl7dmFyIGw9dC5nZXRQcm9ncmFtSW5mb0xvZyhhKTt0aHJvdyBuZXcgRXJyb3IoIkVycm9yIGR1cmluZyBwcm9ncmFtIGxpbmtpbmc6ICIrbCl9cmV0dXJuIGF9ZnVuY3Rpb24gY3JlYXRlVGV4dHVyZSh0LHIsYSl7dC5hY3RpdmVUZXh0dXJlKGEpO3ZhciBvPXQuY3JlYXRlVGV4dHVyZSgpO3QuYmluZFRleHR1cmUodC5URVhUVVJFXzJELG8pO3QudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX1dSQVBfUyx0LkNMQU1QX1RPX0VER0UpO3QudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX1dSQVBfVCx0LkNMQU1QX1RPX0VER0UpO3QudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01JTl9GSUxURVIsdC5ORUFSRVNUKTt0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NQUdfRklMVEVSLHQuTkVBUkVTVCk7dC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSx0LlJHQkEsdC5VTlNJR05FRF9CWVRFLHIpO3JldHVybiBvfXZhciB0LHI7ZnVuY3Rpb24gZ2VuZXJhdGVHTCgpe2lmKCF0KXtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Q9ci5nZXRDb250ZXh0KCJ3ZWJnbCIse3ByZW11bHRpcGxpZWRhbHBoYTohMX0pfX12YXIgYT1udWxsO3ZhciBvPW51bGw7cmV0dXJue3RyeUluaXRHTDpmdW5jdGlvbiB0cnlJbml0R0woKXt0cnl7Z2VuZXJhdGVHTCgpO3JldHVybiEhdH1jYXRjaCh0KXt9cmV0dXJuITF9LGNvbXBvc2VTTWFzazpmdW5jdGlvbiBjb21wb3NlU01hc2sobyxpLGwpe3ZhciBjPW8ud2lkdGgsdT1vLmhlaWdodDthfHxmdW5jdGlvbiBpbml0U21hc2tHTCgpe3ZhciBvLGk7Z2VuZXJhdGVHTCgpO289cjtyPW51bGw7aT10O3Q9bnVsbDt2YXIgbD1jcmVhdGVQcm9ncmFtKGksW2NyZWF0ZVZlcnRleFNoYWRlcihpLCIgIGF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMiBhX3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyIGNsaXBTcGFjZSA9IChhX3Bvc2l0aW9uIC8gdV9yZXNvbHV0aW9uKSAqIDIuMCAtIDEuMDsgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNsaXBTcGFjZSAqIHZlYzIoMSwgLTEpLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksY3JlYXRlRnJhZ21lbnRTaGFkZXIoaSwiICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm0gdmVjNCB1X2JhY2tkcm9wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtIGludCB1X3N1YnR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0IGltYWdlQ29sb3IgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdl90ZXhDb29yZCk7ICAgICAgICAgICAgICAgdmVjNCBtYXNrQ29sb3IgPSB0ZXh0dXJlMkQodV9tYXNrLCB2X3RleENvb3JkKTsgICAgICAgICAgICAgICAgIGlmICh1X2JhY2tkcm9wLmEgPiAwLjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tDb2xvci5yZ2IgPSBtYXNrQ29sb3IucmdiICogbWFza0NvbG9yLmEgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9iYWNrZHJvcC5yZ2IgKiAoMS4wIC0gbWFza0NvbG9yLmEpOyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVfc3VidHlwZSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVtID0gbWFza0NvbG9yLmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdW0gPSBtYXNrQ29sb3IuciAqIDAuMyArIG1hc2tDb2xvci5nICogMC41OSArICAgICAgICAgICAgICAgICAgICAgICAgbWFza0NvbG9yLmIgKiAwLjExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb2xvci5hICo9IGx1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQ29sb3IucmdiICo9IGltYWdlQ29sb3IuYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSBpbWFnZUNvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIildKTtpLnVzZVByb2dyYW0obCk7dmFyIGM9e307Yy5nbD1pO2MuY2FudmFzPW87Yy5yZXNvbHV0aW9uTG9jYXRpb249aS5nZXRVbmlmb3JtTG9jYXRpb24obCwidV9yZXNvbHV0aW9uIik7Yy5wb3NpdGlvbkxvY2F0aW9uPWkuZ2V0QXR0cmliTG9jYXRpb24obCwiYV9wb3NpdGlvbiIpO2MuYmFja2Ryb3BMb2NhdGlvbj1pLmdldFVuaWZvcm1Mb2NhdGlvbihsLCJ1X2JhY2tkcm9wIik7Yy5zdWJ0eXBlTG9jYXRpb249aS5nZXRVbmlmb3JtTG9jYXRpb24obCwidV9zdWJ0eXBlIik7dmFyIHU9aS5nZXRBdHRyaWJMb2NhdGlvbihsLCJhX3RleENvb3JkIiksZD1pLmdldFVuaWZvcm1Mb2NhdGlvbihsLCJ1X2ltYWdlIiksaD1pLmdldFVuaWZvcm1Mb2NhdGlvbihsLCJ1X21hc2siKSxwPWkuY3JlYXRlQnVmZmVyKCk7aS5iaW5kQnVmZmVyKGkuQVJSQVlfQlVGRkVSLHApO2kuYnVmZmVyRGF0YShpLkFSUkFZX0JVRkZFUixuZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDAsMSwwLDEsMSwwLDEsMV0pLGkuU1RBVElDX0RSQVcpO2kuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodSk7aS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHUsMixpLkZMT0FULCExLDAsMCk7aS51bmlmb3JtMWkoZCwwKTtpLnVuaWZvcm0xaShoLDEpO2E9Y30oKTt2YXIgZD1hLGg9ZC5jYW52YXMscD1kLmdsO2gud2lkdGg9YztoLmhlaWdodD11O3Audmlld3BvcnQoMCwwLHAuZHJhd2luZ0J1ZmZlcldpZHRoLHAuZHJhd2luZ0J1ZmZlckhlaWdodCk7cC51bmlmb3JtMmYoZC5yZXNvbHV0aW9uTG9jYXRpb24sYyx1KTtsLmJhY2tkcm9wP3AudW5pZm9ybTRmKGQucmVzb2x1dGlvbkxvY2F0aW9uLGwuYmFja2Ryb3BbMF0sbC5iYWNrZHJvcFsxXSxsLmJhY2tkcm9wWzJdLDEpOnAudW5pZm9ybTRmKGQucmVzb2x1dGlvbkxvY2F0aW9uLDAsMCwwLDApO3AudW5pZm9ybTFpKGQuc3VidHlwZUxvY2F0aW9uLCJMdW1pbm9zaXR5Ij09PWwuc3VidHlwZT8xOjApO3ZhciBtPWNyZWF0ZVRleHR1cmUocCxvLHAuVEVYVFVSRTApLHY9Y3JlYXRlVGV4dHVyZShwLGkscC5URVhUVVJFMSksZz1wLmNyZWF0ZUJ1ZmZlcigpO3AuYmluZEJ1ZmZlcihwLkFSUkFZX0JVRkZFUixnKTtwLmJ1ZmZlckRhdGEocC5BUlJBWV9CVUZGRVIsbmV3IEZsb2F0MzJBcnJheShbMCwwLGMsMCwwLHUsMCx1LGMsMCxjLHVdKSxwLlNUQVRJQ19EUkFXKTtwLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGQucG9zaXRpb25Mb2NhdGlvbik7cC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGQucG9zaXRpb25Mb2NhdGlvbiwyLHAuRkxPQVQsITEsMCwwKTtwLmNsZWFyQ29sb3IoMCwwLDAsMCk7cC5lbmFibGUocC5CTEVORCk7cC5ibGVuZEZ1bmMocC5PTkUscC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtwLmNsZWFyKHAuQ09MT1JfQlVGRkVSX0JJVCk7cC5kcmF3QXJyYXlzKHAuVFJJQU5HTEVTLDAsNik7cC5mbHVzaCgpO3AuZGVsZXRlVGV4dHVyZShtKTtwLmRlbGV0ZVRleHR1cmUodik7cC5kZWxldGVCdWZmZXIoZyk7cmV0dXJuIGh9LGRyYXdGaWd1cmVzOmZ1bmN0aW9uIGRyYXdGaWd1cmVzKGEsaSxsLGMsdSl7b3x8ZnVuY3Rpb24gaW5pdEZpZ3VyZXNHTCgpe3ZhciBhLGk7Z2VuZXJhdGVHTCgpO2E9cjtyPW51bGw7aT10O3Q9bnVsbDt2YXIgbD1jcmVhdGVQcm9ncmFtKGksW2NyZWF0ZVZlcnRleFNoYWRlcihpLCIgIGF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMyBhX2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtIHZlYzIgdV9zY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdl9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIgcG9zaXRpb24gPSAoYV9wb3NpdGlvbiArIHVfb2Zmc2V0KSAqIHVfc2NhbGU7ICAgICAgICAgICAgICB2ZWMyIGNsaXBTcGFjZSA9IChwb3NpdGlvbiAvIHVfcmVzb2x1dGlvbikgKiAyLjAgLSAxLjA7ICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNsaXBTcGFjZSAqIHZlYzIoMSwgLTEpLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2NvbG9yID0gdmVjNChhX2NvbG9yIC8gMjU1LjAsIDEuMCk7ICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksY3JlYXRlRnJhZ21lbnRTaGFkZXIoaSwiICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpXSk7aS51c2VQcm9ncmFtKGwpO3ZhciBjPXt9O2MuZ2w9aTtjLmNhbnZhcz1hO2MucmVzb2x1dGlvbkxvY2F0aW9uPWkuZ2V0VW5pZm9ybUxvY2F0aW9uKGwsInVfcmVzb2x1dGlvbiIpO2Muc2NhbGVMb2NhdGlvbj1pLmdldFVuaWZvcm1Mb2NhdGlvbihsLCJ1X3NjYWxlIik7Yy5vZmZzZXRMb2NhdGlvbj1pLmdldFVuaWZvcm1Mb2NhdGlvbihsLCJ1X29mZnNldCIpO2MucG9zaXRpb25Mb2NhdGlvbj1pLmdldEF0dHJpYkxvY2F0aW9uKGwsImFfcG9zaXRpb24iKTtjLmNvbG9yTG9jYXRpb249aS5nZXRBdHRyaWJMb2NhdGlvbihsLCJhX2NvbG9yIik7bz1jfSgpO3ZhciBkPW8saD1kLmNhbnZhcyxwPWQuZ2w7aC53aWR0aD1hO2guaGVpZ2h0PWk7cC52aWV3cG9ydCgwLDAscC5kcmF3aW5nQnVmZmVyV2lkdGgscC5kcmF3aW5nQnVmZmVySGVpZ2h0KTtwLnVuaWZvcm0yZihkLnJlc29sdXRpb25Mb2NhdGlvbixhLGkpO3ZhciBtLHYsZyx5PTA7Zm9yKG09MCx2PWMubGVuZ3RoO208djttKyspc3dpdGNoKGNbbV0udHlwZSl7Y2FzZSJsYXR0aWNlIjp5Kz0oKGc9Y1ttXS5jb29yZHMubGVuZ3RoL2NbbV0udmVydGljZXNQZXJSb3d8MCktMSkqKGNbbV0udmVydGljZXNQZXJSb3ctMSkqNjticmVhaztjYXNlInRyaWFuZ2xlcyI6eSs9Y1ttXS5jb29yZHMubGVuZ3RofXZhciBiPW5ldyBGbG9hdDMyQXJyYXkoMip5KSxfPW5ldyBVaW50OEFycmF5KDMqeSksUz11LmNvb3JkcyxDPXUuY29sb3JzLEE9MCxSPTA7Zm9yKG09MCx2PWMubGVuZ3RoO208djttKyspe3ZhciBrPWNbbV0sdz1rLmNvb3JkcyxQPWsuY29sb3JzO3N3aXRjaChrLnR5cGUpe2Nhc2UibGF0dGljZSI6dmFyIHg9ay52ZXJ0aWNlc1BlclJvdztnPXcubGVuZ3RoL3h8MDtmb3IodmFyIFQ9MTtUPGc7VCsrKWZvcih2YXIgRT1UKngrMSxPPTE7Tzx4O08rKyxFKyspe2JbQV09U1t3W0UteC0xXV07YltBKzFdPVNbd1tFLXgtMV0rMV07YltBKzJdPVNbd1tFLXhdXTtiW0ErM109U1t3W0UteF0rMV07YltBKzRdPVNbd1tFLTFdXTtiW0ErNV09U1t3W0UtMV0rMV07X1tSXT1DW1BbRS14LTFdXTtfW1IrMV09Q1tQW0UteC0xXSsxXTtfW1IrMl09Q1tQW0UteC0xXSsyXTtfW1IrM109Q1tQW0UteF1dO19bUis0XT1DW1BbRS14XSsxXTtfW1IrNV09Q1tQW0UteF0rMl07X1tSKzZdPUNbUFtFLTFdXTtfW1IrN109Q1tQW0UtMV0rMV07X1tSKzhdPUNbUFtFLTFdKzJdO2JbQSs2XT1iW0ErMl07YltBKzddPWJbQSszXTtiW0ErOF09YltBKzRdO2JbQSs5XT1iW0ErNV07YltBKzEwXT1TW3dbRV1dO2JbQSsxMV09U1t3W0VdKzFdO19bUis5XT1fW1IrM107X1tSKzEwXT1fW1IrNF07X1tSKzExXT1fW1IrNV07X1tSKzEyXT1fW1IrNl07X1tSKzEzXT1fW1IrN107X1tSKzE0XT1fW1IrOF07X1tSKzE1XT1DW1BbRV1dO19bUisxNl09Q1tQW0VdKzFdO19bUisxN109Q1tQW0VdKzJdO0ErPTEyO1IrPTE4fWJyZWFrO2Nhc2UidHJpYW5nbGVzIjpmb3IodmFyIEk9MCxEPXcubGVuZ3RoO0k8RDtJKyspe2JbQV09U1t3W0ldXTtiW0ErMV09U1t3W0ldKzFdO19bUl09Q1tQW0ldXTtfW1IrMV09Q1tQW0ldKzFdO19bUisyXT1DW1BbSV0rMl07QSs9MjtSKz0zfX19bD9wLmNsZWFyQ29sb3IobFswXS8yNTUsbFsxXS8yNTUsbFsyXS8yNTUsMSk6cC5jbGVhckNvbG9yKDAsMCwwLDApO3AuY2xlYXIocC5DT0xPUl9CVUZGRVJfQklUKTt2YXIgTD1wLmNyZWF0ZUJ1ZmZlcigpO3AuYmluZEJ1ZmZlcihwLkFSUkFZX0JVRkZFUixMKTtwLmJ1ZmZlckRhdGEocC5BUlJBWV9CVUZGRVIsYixwLlNUQVRJQ19EUkFXKTtwLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGQucG9zaXRpb25Mb2NhdGlvbik7cC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGQucG9zaXRpb25Mb2NhdGlvbiwyLHAuRkxPQVQsITEsMCwwKTt2YXIgTT1wLmNyZWF0ZUJ1ZmZlcigpO3AuYmluZEJ1ZmZlcihwLkFSUkFZX0JVRkZFUixNKTtwLmJ1ZmZlckRhdGEocC5BUlJBWV9CVUZGRVIsXyxwLlNUQVRJQ19EUkFXKTtwLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGQuY29sb3JMb2NhdGlvbik7cC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGQuY29sb3JMb2NhdGlvbiwzLHAuVU5TSUdORURfQllURSwhMSwwLDApO3AudW5pZm9ybTJmKGQuc2NhbGVMb2NhdGlvbix1LnNjYWxlWCx1LnNjYWxlWSk7cC51bmlmb3JtMmYoZC5vZmZzZXRMb2NhdGlvbix1Lm9mZnNldFgsdS5vZmZzZXRZKTtwLmRyYXdBcnJheXMocC5UUklBTkdMRVMsMCx5KTtwLmZsdXNoKCk7cC5kZWxldGVCdWZmZXIoTCk7cC5kZWxldGVCdWZmZXIoTSk7cmV0dXJuIGh9LGNsZWFudXA6ZnVuY3Rpb24gY2xlYW51cCgpe2lmKGEmJmEuY2FudmFzKXthLmNhbnZhcy53aWR0aD0wO2EuY2FudmFzLmhlaWdodD0wfWlmKG8mJm8uY2FudmFzKXtvLmNhbnZhcy53aWR0aD0wO28uY2FudmFzLmhlaWdodD0wfWE9bnVsbDtvPW51bGx9fX0oKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5Bbm5vdGF0aW9uTGF5ZXI9dm9pZCAwO3ZhciBvPWEoMSksaT1hKDUpLGw9YSgyMDUpO2Z1bmN0aW9uIF9nZXQodCxyLGEpe3JldHVybihfZ2V0PSJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5nZXQ/UmVmbGVjdC5nZXQ6ZnVuY3Rpb24gX2dldCh0LHIsYSl7dmFyIG89ZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2UodCxyKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmbnVsbCE9PSh0PV9nZXRQcm90b3R5cGVPZih0KSk7KTtyZXR1cm4gdH0odCxyKTtpZihvKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8scik7cmV0dXJuIGkuZ2V0P2kuZ2V0LmNhbGwoYSk6aS52YWx1ZX19KSh0LHIsYXx8dCl9ZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCxyKXt2YXIgYTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwoYT1mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1hfHwiU2V0Ij09PWEpcmV0dXJuIEFycmF5LmZyb20odCk7aWYoIkFyZ3VtZW50cyI9PT1hfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChhKSlyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKX0odCkpfHxyJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXthJiYodD1hKTt2YXIgbz0wLGk9ZnVuY3Rpb24gRigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uIG4oKXtyZXR1cm4gbz49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbbysrXX19LGU6ZnVuY3Rpb24gZSh0KXt0aHJvdyB0fSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgbCxjPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24gcygpe2E9dFtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24gbigpe3ZhciB0PWEubmV4dCgpO2M9dC5kb25lO3JldHVybiB0fSxlOmZ1bmN0aW9uIGUodCl7dT0hMDtsPXR9LGY6ZnVuY3Rpb24gZigpe3RyeXtjfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgbH19fX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLG89bmV3IEFycmF5KHIpO2E8cjthKyspb1thXT10W2FdO3JldHVybiBvfWZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gX2luaGVyaXRzKHQscil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHImJm51bGwhPT1yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyJiZyLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pO3ImJl9zZXRQcm90b3R5cGVPZih0LHIpfWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3JldHVybihfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXt0Ll9fcHJvdG9fXz1yO3JldHVybiB0fSkodCxyKX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIodCl7dmFyIHI9ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKTtyZXR1cm4hMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIGEsbz1fZ2V0UHJvdG90eXBlT2YodCk7aWYocil7dmFyIGk9X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO2E9UmVmbGVjdC5jb25zdHJ1Y3Qobyxhcmd1bWVudHMsaSl9ZWxzZSBhPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLGEpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LHIpe3JldHVybiFyfHwib2JqZWN0IiE9PV90eXBlb2YocikmJiJmdW5jdGlvbiIhPXR5cGVvZiByP19hc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCk6cn1mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuKF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fXZhciBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5KCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5KX1fY3JlYXRlQ2xhc3MoQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5LG51bGwsW3trZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24gY3JlYXRlKHQpe3N3aXRjaCh0LmRhdGEuYW5ub3RhdGlvblR5cGUpe2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5MSU5LOnJldHVybiBuZXcgZCh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuVEVYVDpyZXR1cm4gbmV3IGgodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLldJREdFVDpzd2l0Y2godC5kYXRhLmZpZWxkVHlwZSl7Y2FzZSJUeCI6cmV0dXJuIG5ldyBtKHQpO2Nhc2UiQnRuIjpyZXR1cm4gdC5kYXRhLnJhZGlvQnV0dG9uP25ldyBnKHQpOnQuZGF0YS5jaGVja0JveD9uZXcgdih0KTpuZXcgeSh0KTtjYXNlIkNoIjpyZXR1cm4gbmV3IGIodCl9cmV0dXJuIG5ldyBwKHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5QT1BVUDpyZXR1cm4gbmV3IF8odCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLkZSRUVURVhUOnJldHVybiBuZXcgQyh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuTElORTpyZXR1cm4gbmV3IEEodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUFSRTpyZXR1cm4gbmV3IFIodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLkNJUkNMRTpyZXR1cm4gbmV3IGsodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLlBPTFlMSU5FOnJldHVybiBuZXcgdyh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuQ0FSRVQ6cmV0dXJuIG5ldyB4KHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5JTks6cmV0dXJuIG5ldyBUKHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5QT0xZR09OOnJldHVybiBuZXcgUCh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuSElHSExJR0hUOnJldHVybiBuZXcgRSh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOnJldHVybiBuZXcgTyh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk6cmV0dXJuIG5ldyBJKHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ6cmV0dXJuIG5ldyBEKHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5TVEFNUDpyZXR1cm4gbmV3IEwodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UOnJldHVybiBuZXcgTSh0KTtkZWZhdWx0OnJldHVybiBuZXcgdSh0KX19fV0pO3JldHVybiBBbm5vdGF0aW9uRWxlbWVudEZhY3Rvcnl9KCksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIEFubm90YXRpb25FbGVtZW50KHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO19jbGFzc0NhbGxDaGVjayh0aGlzLEFubm90YXRpb25FbGVtZW50KTt0aGlzLmlzUmVuZGVyYWJsZT1yO3RoaXMuZGF0YT10LmRhdGE7dGhpcy5sYXllcj10LmxheWVyO3RoaXMucGFnZT10LnBhZ2U7dGhpcy52aWV3cG9ydD10LnZpZXdwb3J0O3RoaXMubGlua1NlcnZpY2U9dC5saW5rU2VydmljZTt0aGlzLmRvd25sb2FkTWFuYWdlcj10LmRvd25sb2FkTWFuYWdlcjt0aGlzLmltYWdlUmVzb3VyY2VzUGF0aD10LmltYWdlUmVzb3VyY2VzUGF0aDt0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXM9dC5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zO3RoaXMuc3ZnRmFjdG9yeT10LnN2Z0ZhY3Rvcnk7dGhpcy5hbm5vdGF0aW9uU3RvcmFnZT10LmFubm90YXRpb25TdG9yYWdlO3ImJih0aGlzLmNvbnRhaW5lcj10aGlzLl9jcmVhdGVDb250YWluZXIoYSkpfV9jcmVhdGVDbGFzcyhBbm5vdGF0aW9uRWxlbWVudCxbe2tleToiX2NyZWF0ZUNvbnRhaW5lciIsdmFsdWU6ZnVuY3Rpb24gX2NyZWF0ZUNvbnRhaW5lcigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF0scj10aGlzLmRhdGEsYT10aGlzLnBhZ2Usbz10aGlzLnZpZXdwb3J0LGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIpLGM9ci5yZWN0WzJdLXIucmVjdFswXSx1PXIucmVjdFszXS1yLnJlY3RbMV07bC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5ub3RhdGlvbi1pZCIsci5pZCk7dmFyIGQ9aS5VdGlsLm5vcm1hbGl6ZVJlY3QoW3IucmVjdFswXSxhLnZpZXdbM10tci5yZWN0WzFdK2Eudmlld1sxXSxyLnJlY3RbMl0sYS52aWV3WzNdLXIucmVjdFszXSthLnZpZXdbMV1dKTtsLnN0eWxlLnRyYW5zZm9ybT0ibWF0cml4KCIuY29uY2F0KG8udHJhbnNmb3JtLmpvaW4oIiwiKSwiKSIpO2wuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSItIi5jb25jYXQoZFswXSwicHggLSIpLmNvbmNhdChkWzFdLCJweCIpO2lmKCF0JiZyLmJvcmRlclN0eWxlLndpZHRoPjApe2wuc3R5bGUuYm9yZGVyV2lkdGg9IiIuY29uY2F0KHIuYm9yZGVyU3R5bGUud2lkdGgsInB4Iik7aWYoci5ib3JkZXJTdHlsZS5zdHlsZSE9PWkuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkUpe2MtPTIqci5ib3JkZXJTdHlsZS53aWR0aDt1LT0yKnIuYm9yZGVyU3R5bGUud2lkdGh9dmFyIGg9ci5ib3JkZXJTdHlsZS5ob3Jpem9udGFsQ29ybmVyUmFkaXVzLHA9ci5ib3JkZXJTdHlsZS52ZXJ0aWNhbENvcm5lclJhZGl1cztpZihoPjB8fHA+MCl7dmFyIG09IiIuY29uY2F0KGgsInB4IC8gIikuY29uY2F0KHAsInB4Iik7bC5zdHlsZS5ib3JkZXJSYWRpdXM9bX1zd2l0Y2goci5ib3JkZXJTdHlsZS5zdHlsZSl7Y2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ6bC5zdHlsZS5ib3JkZXJTdHlsZT0ic29saWQiO2JyZWFrO2Nhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDpsLnN0eWxlLmJvcmRlclN0eWxlPSJkYXNoZWQiO2JyZWFrO2Nhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ6KDAsaS53YXJuKSgiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGJldmVsZWQiKTticmVhaztjYXNlIGkuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDooMCxpLndhcm4pKCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogaW5zZXQiKTticmVhaztjYXNlIGkuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU6bC5zdHlsZS5ib3JkZXJCb3R0b21TdHlsZT0ic29saWQifXIuY29sb3I/bC5zdHlsZS5ib3JkZXJDb2xvcj1pLlV0aWwubWFrZUNzc1JnYigwfHIuY29sb3JbMF0sMHxyLmNvbG9yWzFdLDB8ci5jb2xvclsyXSk6bC5zdHlsZS5ib3JkZXJXaWR0aD0wfWwuc3R5bGUubGVmdD0iIi5jb25jYXQoZFswXSwicHgiKTtsLnN0eWxlLnRvcD0iIi5jb25jYXQoZFsxXSwicHgiKTtsLnN0eWxlLndpZHRoPSIiLmNvbmNhdChjLCJweCIpO2wuc3R5bGUuaGVpZ2h0PSIiLmNvbmNhdCh1LCJweCIpO3JldHVybiBsfX0se2tleToiX2NyZWF0ZVBvcHVwIix2YWx1ZTpmdW5jdGlvbiBfY3JlYXRlUG9wdXAodCxyLGEpe2lmKCFyKXsocj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUuaGVpZ2h0PXQuc3R5bGUuaGVpZ2h0O3Iuc3R5bGUud2lkdGg9dC5zdHlsZS53aWR0aDt0LmFwcGVuZENoaWxkKHIpfXZhciBvPW5ldyBTKHtjb250YWluZXI6dCx0cmlnZ2VyOnIsY29sb3I6YS5jb2xvcix0aXRsZTphLnRpdGxlLG1vZGlmaWNhdGlvbkRhdGU6YS5tb2RpZmljYXRpb25EYXRlLGNvbnRlbnRzOmEuY29udGVudHMsaGlkZVdyYXBwZXI6ITB9KS5yZW5kZXIoKTtvLnN0eWxlLmxlZnQ9dC5zdHlsZS53aWR0aDt0LmFwcGVuZENoaWxkKG8pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXsoMCxpLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBBbm5vdGF0aW9uRWxlbWVudC5yZW5kZXJgIGNhbGxlZCIpfX1dKTtyZXR1cm4gQW5ub3RhdGlvbkVsZW1lbnR9KCksZD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoTGlua0Fubm90YXRpb25FbGVtZW50LHQpO3ZhciByPV9jcmVhdGVTdXBlcihMaW5rQW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIExpbmtBbm5vdGF0aW9uRWxlbWVudCh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxMaW5rQW5ub3RhdGlvbkVsZW1lbnQpO3ZhciBhPSEhKHQuZGF0YS51cmx8fHQuZGF0YS5kZXN0fHx0LmRhdGEuYWN0aW9uKTtyZXR1cm4gci5jYWxsKHRoaXMsdCxhKX1fY3JlYXRlQ2xhc3MoTGlua0Fubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0ibGlua0Fubm90YXRpb24iO3ZhciB0PXRoaXMuZGF0YSxyPXRoaXMubGlua1NlcnZpY2UsYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7dC51cmw/KDAsby5hZGRMaW5rQXR0cmlidXRlcykoYSx7dXJsOnQudXJsLHRhcmdldDp0Lm5ld1dpbmRvdz9vLkxpbmtUYXJnZXQuQkxBTks6ci5leHRlcm5hbExpbmtUYXJnZXQscmVsOnIuZXh0ZXJuYWxMaW5rUmVsLGVuYWJsZWQ6ci5leHRlcm5hbExpbmtFbmFibGVkfSk6dC5hY3Rpb24/dGhpcy5fYmluZE5hbWVkQWN0aW9uKGEsdC5hY3Rpb24pOnRoaXMuX2JpbmRMaW5rKGEsdC5kZXN0KTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChhKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSx7a2V5OiJfYmluZExpbmsiLHZhbHVlOmZ1bmN0aW9uIF9iaW5kTGluayh0LHIpe3ZhciBhPXRoaXM7dC5ocmVmPXRoaXMubGlua1NlcnZpY2UuZ2V0RGVzdGluYXRpb25IYXNoKHIpO3Qub25jbGljaz1mdW5jdGlvbigpe3ImJmEubGlua1NlcnZpY2UubmF2aWdhdGVUbyhyKTtyZXR1cm4hMX07ciYmKHQuY2xhc3NOYW1lPSJpbnRlcm5hbExpbmsiKX19LHtrZXk6Il9iaW5kTmFtZWRBY3Rpb24iLHZhbHVlOmZ1bmN0aW9uIF9iaW5kTmFtZWRBY3Rpb24odCxyKXt2YXIgYT10aGlzO3QuaHJlZj10aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybCgiIik7dC5vbmNsaWNrPWZ1bmN0aW9uKCl7YS5saW5rU2VydmljZS5leGVjdXRlTmFtZWRBY3Rpb24ocik7cmV0dXJuITF9O3QuY2xhc3NOYW1lPSJpbnRlcm5hbExpbmsifX1dKTtyZXR1cm4gTGlua0Fubm90YXRpb25FbGVtZW50fSh1KSxoPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhUZXh0QW5ub3RhdGlvbkVsZW1lbnQsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFRleHRBbm5vdGF0aW9uRWxlbWVudCk7ZnVuY3Rpb24gVGV4dEFubm90YXRpb25FbGVtZW50KHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLFRleHRBbm5vdGF0aW9uRWxlbWVudCk7dmFyIGE9ISEodC5kYXRhLmhhc1BvcHVwfHx0LmRhdGEudGl0bGV8fHQuZGF0YS5jb250ZW50cyk7cmV0dXJuIHIuY2FsbCh0aGlzLHQsYSl9X2NyZWF0ZUNsYXNzKFRleHRBbm5vdGF0aW9uRWxlbWVudCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9InRleHRBbm5vdGF0aW9uIjt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTt0LnN0eWxlLmhlaWdodD10aGlzLmNvbnRhaW5lci5zdHlsZS5oZWlnaHQ7dC5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lci5zdHlsZS53aWR0aDt0LnNyYz10aGlzLmltYWdlUmVzb3VyY2VzUGF0aCsiYW5ub3RhdGlvbi0iK3RoaXMuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkrIi5zdmciO3QuYWx0PSJbe3t0eXBlfX0gQW5ub3RhdGlvbl0iO3QuZGF0YXNldC5sMTBuSWQ9InRleHRfYW5ub3RhdGlvbl90eXBlIjt0LmRhdGFzZXQubDEwbkFyZ3M9SlNPTi5zdHJpbmdpZnkoe3R5cGU6dGhpcy5kYXRhLm5hbWV9KTt0aGlzLmRhdGEuaGFzUG9wdXB8fHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLHQsdGhpcy5kYXRhKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0KTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fV0pO3JldHVybiBUZXh0QW5ub3RhdGlvbkVsZW1lbnR9KHUpLHA9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFdpZGdldEFubm90YXRpb25FbGVtZW50LHQpO3ZhciByPV9jcmVhdGVTdXBlcihXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7ZnVuY3Rpb24gV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfV9jcmVhdGVDbGFzcyhXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gdGhpcy5jb250YWluZXJ9fV0pO3JldHVybiBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudH0odSksbT1mdW5jdGlvbih0KXtfaW5oZXJpdHMoVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50LHQpO3ZhciByPV9jcmVhdGVTdXBlcihUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpO3ZhciBhPXQucmVuZGVySW50ZXJhY3RpdmVGb3Jtc3x8IXQuZGF0YS5oYXNBcHBlYXJhbmNlJiYhIXQuZGF0YS5maWVsZFZhbHVlO3JldHVybiByLmNhbGwodGhpcyx0LGEpfV9jcmVhdGVDbGFzcyhUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIHQ9dGhpcy5hbm5vdGF0aW9uU3RvcmFnZSxyPXRoaXMuZGF0YS5pZDt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9InRleHRXaWRnZXRBbm5vdGF0aW9uIjt2YXIgYT1udWxsO2lmKHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyl7dmFyIG89dC5nZXRPckNyZWF0ZVZhbHVlKHIsdGhpcy5kYXRhLmZpZWxkVmFsdWUpO2lmKHRoaXMuZGF0YS5tdWx0aUxpbmUpKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSkudGV4dENvbnRlbnQ9bztlbHNleyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnR5cGU9InRleHQiO2Euc2V0QXR0cmlidXRlKCJ2YWx1ZSIsbyl9YS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsKGZ1bmN0aW9uKGEpe3Quc2V0VmFsdWUocixhLnRhcmdldC52YWx1ZSl9KSk7YS5kaXNhYmxlZD10aGlzLmRhdGEucmVhZE9ubHk7YS5uYW1lPXRoaXMuZGF0YS5maWVsZE5hbWU7bnVsbCE9PXRoaXMuZGF0YS5tYXhMZW4mJihhLm1heExlbmd0aD10aGlzLmRhdGEubWF4TGVuKTtpZih0aGlzLmRhdGEuY29tYil7dmFyIGk9KHRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdKS90aGlzLmRhdGEubWF4TGVuO2EuY2xhc3NMaXN0LmFkZCgiY29tYiIpO2Euc3R5bGUubGV0dGVyU3BhY2luZz0iY2FsYygiLmNvbmNhdChpLCJweCAtIDFjaCkiKX19ZWxzZXsoYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkudGV4dENvbnRlbnQ9dGhpcy5kYXRhLmZpZWxkVmFsdWU7YS5zdHlsZS52ZXJ0aWNhbEFsaWduPSJtaWRkbGUiO2Euc3R5bGUuZGlzcGxheT0idGFibGUtY2VsbCI7dmFyIGw9bnVsbDt0aGlzLmRhdGEuZm9udFJlZk5hbWUmJnRoaXMucGFnZS5jb21tb25PYmpzLmhhcyh0aGlzLmRhdGEuZm9udFJlZk5hbWUpJiYobD10aGlzLnBhZ2UuY29tbW9uT2Jqcy5nZXQodGhpcy5kYXRhLmZvbnRSZWZOYW1lKSk7dGhpcy5fc2V0VGV4dFN0eWxlKGEsbCl9bnVsbCE9PXRoaXMuZGF0YS50ZXh0QWxpZ25tZW50JiYoYS5zdHlsZS50ZXh0QWxpZ249WyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXVt0aGlzLmRhdGEudGV4dEFsaWdubWVudF0pO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19LHtrZXk6Il9zZXRUZXh0U3R5bGUiLHZhbHVlOmZ1bmN0aW9uIF9zZXRUZXh0U3R5bGUodCxyKXt2YXIgYT10LnN0eWxlO2EuZm9udFNpemU9IiIuY29uY2F0KHRoaXMuZGF0YS5mb250U2l6ZSwicHgiKTthLmRpcmVjdGlvbj10aGlzLmRhdGEuZm9udERpcmVjdGlvbjwwPyJydGwiOiJsdHIiO2lmKHIpe3ZhciBvPSJub3JtYWwiO3IuYmxhY2s/bz0iOTAwIjpyLmJvbGQmJihvPSJib2xkIik7YS5mb250V2VpZ2h0PW87YS5mb250U3R5bGU9ci5pdGFsaWM/Iml0YWxpYyI6Im5vcm1hbCI7dmFyIGk9ci5sb2FkZWROYW1lPyciJy5jb25jYXQoci5sb2FkZWROYW1lLCciLCAnKToiIixsPXIuZmFsbGJhY2tOYW1lfHwiSGVsdmV0aWNhLCBzYW5zLXNlcmlmIjthLmZvbnRGYW1pbHk9aStsfX19XSk7cmV0dXJuIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudH0ocCksdj1mdW5jdGlvbih0KXtfaW5oZXJpdHMoQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7ZnVuY3Rpb24gQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50KTtyZXR1cm4gci5jYWxsKHRoaXMsdCx0LnJlbmRlckludGVyYWN0aXZlRm9ybXMpfV9jcmVhdGVDbGFzcyhDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciB0PXRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uscj10aGlzLmRhdGEsYT1yLmlkLG89dC5nZXRPckNyZWF0ZVZhbHVlKGEsci5maWVsZFZhbHVlJiYiT2ZmIiE9PXIuZmllbGRWYWx1ZSk7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJidXR0b25XaWRnZXRBbm5vdGF0aW9uIGNoZWNrQm94Ijt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2kuZGlzYWJsZWQ9ci5yZWFkT25seTtpLnR5cGU9ImNoZWNrYm94IjtpLm5hbWU9dGhpcy5kYXRhLmZpZWxkTmFtZTtvJiZpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsITApO2kuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwoZnVuY3Rpb24ocil7dC5zZXRWYWx1ZShhLHIudGFyZ2V0LmNoZWNrZWQpfSkpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGkpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19XSk7cmV0dXJuIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnR9KHApLGc9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7cmV0dXJuIHIuY2FsbCh0aGlzLHQsdC5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zKX1fY3JlYXRlQ2xhc3MoUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9ImJ1dHRvbldpZGdldEFubm90YXRpb24gcmFkaW9CdXR0b24iO3ZhciB0PXRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uscj10aGlzLmRhdGEsYT1yLmlkLG89dC5nZXRPckNyZWF0ZVZhbHVlKGEsci5maWVsZFZhbHVlPT09ci5idXR0b25WYWx1ZSksaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2kuZGlzYWJsZWQ9ci5yZWFkT25seTtpLnR5cGU9InJhZGlvIjtpLm5hbWU9ci5maWVsZE5hbWU7byYmaS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCEwKTtpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKGZ1bmN0aW9uKHIpe3ZhciBvLGk9ci50YXJnZXQubmFtZSxsPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKGkpKTt0cnl7Zm9yKGwucygpOyEobz1sLm4oKSkuZG9uZTspe3ZhciBjPW8udmFsdWU7YyE9PXIudGFyZ2V0JiZ0LnNldFZhbHVlKGMucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5ub3RhdGlvbi1pZCIpLCExKX19Y2F0Y2godCl7bC5lKHQpfWZpbmFsbHl7bC5mKCl9dC5zZXRWYWx1ZShhLHIudGFyZ2V0LmNoZWNrZWQpfSkpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGkpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19XSk7cmV0dXJuIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnR9KHApLHk9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KTtmdW5jdGlvbiBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpO3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1fY3JlYXRlQ2xhc3MoUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciB0PV9nZXQoX2dldFByb3RvdHlwZU9mKFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudC5wcm90b3R5cGUpLCJyZW5kZXIiLHRoaXMpLmNhbGwodGhpcyk7dC5jbGFzc05hbWU9ImJ1dHRvbldpZGdldEFubm90YXRpb24gcHVzaEJ1dHRvbiI7cmV0dXJuIHR9fV0pO3JldHVybiBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnR9KGQpLGI9ZnVuY3Rpb24odCl7X2luaGVyaXRzKENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50LHQpO3ZhciByPV9jcmVhdGVTdXBlcihDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCk7ZnVuY3Rpb24gQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpO3JldHVybiByLmNhbGwodGhpcyx0LHQucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyl9X2NyZWF0ZUNsYXNzKENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0iY2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiI7dmFyIHQ9dGhpcy5hbm5vdGF0aW9uU3RvcmFnZSxyPXRoaXMuZGF0YS5pZDt0LmdldE9yQ3JlYXRlVmFsdWUocix0aGlzLmRhdGEuZmllbGRWYWx1ZS5sZW5ndGg+MD90aGlzLmRhdGEuZmllbGRWYWx1ZVswXTpudWxsKTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTthLmRpc2FibGVkPXRoaXMuZGF0YS5yZWFkT25seTthLm5hbWU9dGhpcy5kYXRhLmZpZWxkTmFtZTtpZighdGhpcy5kYXRhLmNvbWJvKXthLnNpemU9dGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO3RoaXMuZGF0YS5tdWx0aVNlbGVjdCYmKGEubXVsdGlwbGU9ITApfXZhciBvLGk9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5kYXRhLm9wdGlvbnMpO3RyeXtmb3IoaS5zKCk7IShvPWkubigpKS5kb25lOyl7dmFyIGw9by52YWx1ZSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO2MudGV4dENvbnRlbnQ9bC5kaXNwbGF5VmFsdWU7Yy52YWx1ZT1sLmV4cG9ydFZhbHVlO3RoaXMuZGF0YS5maWVsZFZhbHVlLmluY2x1ZGVzKGwuZXhwb3J0VmFsdWUpJiZjLnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCEwKTthLmFwcGVuZENoaWxkKGMpfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1hLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwoZnVuY3Rpb24oYSl7dmFyIG89YS50YXJnZXQub3B0aW9ucyxpPW9bby5zZWxlY3RlZEluZGV4XS52YWx1ZTt0LnNldFZhbHVlKHIsaSl9KSk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoYSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1dKTtyZXR1cm4gQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnR9KHApLF89ZnVuY3Rpb24odCl7X2luaGVyaXRzKFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUG9wdXBBbm5vdGF0aW9uRWxlbWVudCk7dmFyIGE9ISghdC5kYXRhLnRpdGxlJiYhdC5kYXRhLmNvbnRlbnRzKTtyZXR1cm4gci5jYWxsKHRoaXMsdCxhKX1fY3JlYXRlQ2xhc3MoUG9wdXBBbm5vdGF0aW9uRWxlbWVudCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9InBvcHVwQW5ub3RhdGlvbiI7aWYoWyJMaW5lIiwiU3F1YXJlIiwiQ2lyY2xlIiwiUG9seUxpbmUiLCJQb2x5Z29uIiwiSW5rIl0uaW5jbHVkZXModGhpcy5kYXRhLnBhcmVudFR5cGUpKXJldHVybiB0aGlzLmNvbnRhaW5lcjt2YXIgdD0nW2RhdGEtYW5ub3RhdGlvbi1pZD0iJy5jb25jYXQodGhpcy5kYXRhLnBhcmVudElkLCciXScpLHI9dGhpcy5sYXllci5xdWVyeVNlbGVjdG9yKHQpO2lmKCFyKXJldHVybiB0aGlzLmNvbnRhaW5lcjt2YXIgYT1uZXcgUyh7Y29udGFpbmVyOnRoaXMuY29udGFpbmVyLHRyaWdnZXI6cixjb2xvcjp0aGlzLmRhdGEuY29sb3IsdGl0bGU6dGhpcy5kYXRhLnRpdGxlLG1vZGlmaWNhdGlvbkRhdGU6dGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUsY29udGVudHM6dGhpcy5kYXRhLmNvbnRlbnRzfSksbz1wYXJzZUZsb2F0KHIuc3R5bGUubGVmdCksaT1wYXJzZUZsb2F0KHIuc3R5bGUud2lkdGgpO3RoaXMuY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbj0iLSIuY29uY2F0KG8raSwicHggLSIpLmNvbmNhdChyLnN0eWxlLnRvcCk7dGhpcy5jb250YWluZXIuc3R5bGUubGVmdD0iIi5jb25jYXQobytpLCJweCIpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGEucmVuZGVyKCkpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19XSk7cmV0dXJuIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnR9KHUpLFM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQb3B1cEVsZW1lbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUG9wdXBFbGVtZW50KTt0aGlzLmNvbnRhaW5lcj10LmNvbnRhaW5lcjt0aGlzLnRyaWdnZXI9dC50cmlnZ2VyO3RoaXMuY29sb3I9dC5jb2xvcjt0aGlzLnRpdGxlPXQudGl0bGU7dGhpcy5tb2RpZmljYXRpb25EYXRlPXQubW9kaWZpY2F0aW9uRGF0ZTt0aGlzLmNvbnRlbnRzPXQuY29udGVudHM7dGhpcy5oaWRlV3JhcHBlcj10LmhpZGVXcmFwcGVyfHwhMTt0aGlzLnBpbm5lZD0hMX1fY3JlYXRlQ2xhc3MoUG9wdXBFbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NOYW1lPSJwb3B1cFdyYXBwZXIiO3RoaXMuaGlkZUVsZW1lbnQ9dGhpcy5oaWRlV3JhcHBlcj90OnRoaXMuY29udGFpbmVyO3RoaXMuaGlkZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLmNsYXNzTmFtZT0icG9wdXAiO3ZhciBhPXRoaXMuY29sb3I7aWYoYSl7dmFyIGw9LjcqKDI1NS1hWzBdKSthWzBdLGM9LjcqKDI1NS1hWzFdKSthWzFdLHU9LjcqKDI1NS1hWzJdKSthWzJdO3Iuc3R5bGUuYmFja2dyb3VuZENvbG9yPWkuVXRpbC5tYWtlQ3NzUmdiKDB8bCwwfGMsMHx1KX12YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoMSIpO2QudGV4dENvbnRlbnQ9dGhpcy50aXRsZTtyLmFwcGVuZENoaWxkKGQpO3ZhciBoPW8uUERGRGF0ZVN0cmluZy50b0RhdGVPYmplY3QodGhpcy5tb2RpZmljYXRpb25EYXRlKTtpZihoKXt2YXIgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7cC50ZXh0Q29udGVudD0ie3tkYXRlfX0sIHt7dGltZX19IjtwLmRhdGFzZXQubDEwbklkPSJhbm5vdGF0aW9uX2RhdGVfc3RyaW5nIjtwLmRhdGFzZXQubDEwbkFyZ3M9SlNPTi5zdHJpbmdpZnkoe2RhdGU6aC50b0xvY2FsZURhdGVTdHJpbmcoKSx0aW1lOmgudG9Mb2NhbGVUaW1lU3RyaW5nKCl9KTtyLmFwcGVuZENoaWxkKHApfXZhciBtPXRoaXMuX2Zvcm1hdENvbnRlbnRzKHRoaXMuY29udGVudHMpO3IuYXBwZW5kQ2hpbGQobSk7dGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLl90b2dnbGUuYmluZCh0aGlzKSk7dGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5fc2hvdy5iaW5kKHRoaXMsITEpKTt0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuX2hpZGUuYmluZCh0aGlzLCExKSk7ci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5faGlkZS5iaW5kKHRoaXMsITApKTt0LmFwcGVuZENoaWxkKHIpO3JldHVybiB0fX0se2tleToiX2Zvcm1hdENvbnRlbnRzIix2YWx1ZTpmdW5jdGlvbiBfZm9ybWF0Q29udGVudHModCl7Zm9yKHZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKSxhPXQuc3BsaXQoLyg/OlxyXG4/fFxuKS8pLG89MCxpPWEubGVuZ3RoO288aTsrK28pe3ZhciBsPWFbb107ci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsKSk7bzxpLTEmJnIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSl9cmV0dXJuIHJ9fSx7a2V5OiJfdG9nZ2xlIix2YWx1ZTpmdW5jdGlvbiBfdG9nZ2xlKCl7dGhpcy5waW5uZWQ/dGhpcy5faGlkZSghMCk6dGhpcy5fc2hvdyghMCl9fSx7a2V5OiJfc2hvdyIsdmFsdWU6ZnVuY3Rpb24gX3Nob3coKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO3QmJih0aGlzLnBpbm5lZD0hMCk7aWYodGhpcy5oaWRlRWxlbWVudC5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpKXt0aGlzLmhpZGVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIik7dGhpcy5jb250YWluZXIuc3R5bGUuekluZGV4Kz0xfX19LHtrZXk6Il9oaWRlIix2YWx1ZTpmdW5jdGlvbiBfaGlkZSgpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF07dCYmKHRoaXMucGlubmVkPSExKTtpZighdGhpcy5oaWRlRWxlbWVudC5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpJiYhdGhpcy5waW5uZWQpe3RoaXMuaGlkZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTt0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXgtPTF9fX1dKTtyZXR1cm4gUG9wdXBFbGVtZW50fSgpLEM9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCk7dmFyIGE9ISEodC5kYXRhLmhhc1BvcHVwfHx0LmRhdGEudGl0bGV8fHQuZGF0YS5jb250ZW50cyk7cmV0dXJuIHIuY2FsbCh0aGlzLHQsYSwhMCl9X2NyZWF0ZUNsYXNzKEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJmcmVlVGV4dEFubm90YXRpb24iO3RoaXMuZGF0YS5oYXNQb3B1cHx8dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsbnVsbCx0aGlzLmRhdGEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19XSk7cmV0dXJuIEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnR9KHUpLEE9ZnVuY3Rpb24odCl7X2luaGVyaXRzKExpbmVBbm5vdGF0aW9uRWxlbWVudCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoTGluZUFubm90YXRpb25FbGVtZW50KTtmdW5jdGlvbiBMaW5lQW5ub3RhdGlvbkVsZW1lbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTGluZUFubm90YXRpb25FbGVtZW50KTt2YXIgYT0hISh0LmRhdGEuaGFzUG9wdXB8fHQuZGF0YS50aXRsZXx8dC5kYXRhLmNvbnRlbnRzKTtyZXR1cm4gci5jYWxsKHRoaXMsdCxhLCEwKX1fY3JlYXRlQ2xhc3MoTGluZUFubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0ibGluZUFubm90YXRpb24iO3ZhciB0PXRoaXMuZGF0YSxyPXQucmVjdFsyXS10LnJlY3RbMF0sYT10LnJlY3RbM10tdC5yZWN0WzFdLG89dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShyLGEpLGk9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpsaW5lIik7aS5zZXRBdHRyaWJ1dGUoIngxIix0LnJlY3RbMl0tdC5saW5lQ29vcmRpbmF0ZXNbMF0pO2kuc2V0QXR0cmlidXRlKCJ5MSIsdC5yZWN0WzNdLXQubGluZUNvb3JkaW5hdGVzWzFdKTtpLnNldEF0dHJpYnV0ZSgieDIiLHQucmVjdFsyXS10LmxpbmVDb29yZGluYXRlc1syXSk7aS5zZXRBdHRyaWJ1dGUoInkyIix0LnJlY3RbM10tdC5saW5lQ29vcmRpbmF0ZXNbM10pO2kuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLHQuYm9yZGVyU3R5bGUud2lkdGh8fDEpO2kuc2V0QXR0cmlidXRlKCJzdHJva2UiLCJ0cmFuc3BhcmVudCIpO28uYXBwZW5kQ2hpbGQoaSk7dGhpcy5jb250YWluZXIuYXBwZW5kKG8pO3RoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLGksdCk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1dKTtyZXR1cm4gTGluZUFubm90YXRpb25FbGVtZW50fSh1KSxSPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIFNxdWFyZUFubm90YXRpb25FbGVtZW50KHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLFNxdWFyZUFubm90YXRpb25FbGVtZW50KTt2YXIgYT0hISh0LmRhdGEuaGFzUG9wdXB8fHQuZGF0YS50aXRsZXx8dC5kYXRhLmNvbnRlbnRzKTtyZXR1cm4gci5jYWxsKHRoaXMsdCxhLCEwKX1fY3JlYXRlQ2xhc3MoU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJzcXVhcmVBbm5vdGF0aW9uIjt2YXIgdD10aGlzLmRhdGEscj10LnJlY3RbMl0tdC5yZWN0WzBdLGE9dC5yZWN0WzNdLXQucmVjdFsxXSxvPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUocixhKSxpPXQuYm9yZGVyU3R5bGUud2lkdGgsbD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTtsLnNldEF0dHJpYnV0ZSgieCIsaS8yKTtsLnNldEF0dHJpYnV0ZSgieSIsaS8yKTtsLnNldEF0dHJpYnV0ZSgid2lkdGgiLHItaSk7bC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsYS1pKTtsLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIixpfHwxKTtsLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwidHJhbnNwYXJlbnQiKTtsLnNldEF0dHJpYnV0ZSgiZmlsbCIsIm5vbmUiKTtvLmFwcGVuZENoaWxkKGwpO3RoaXMuY29udGFpbmVyLmFwcGVuZChvKTt0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcixsLHQpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19XSk7cmV0dXJuIFNxdWFyZUFubm90YXRpb25FbGVtZW50fSh1KSxrPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIENpcmNsZUFubm90YXRpb25FbGVtZW50KHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLENpcmNsZUFubm90YXRpb25FbGVtZW50KTt2YXIgYT0hISh0LmRhdGEuaGFzUG9wdXB8fHQuZGF0YS50aXRsZXx8dC5kYXRhLmNvbnRlbnRzKTtyZXR1cm4gci5jYWxsKHRoaXMsdCxhLCEwKX1fY3JlYXRlQ2xhc3MoQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJjaXJjbGVBbm5vdGF0aW9uIjt2YXIgdD10aGlzLmRhdGEscj10LnJlY3RbMl0tdC5yZWN0WzBdLGE9dC5yZWN0WzNdLXQucmVjdFsxXSxvPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUocixhKSxpPXQuYm9yZGVyU3R5bGUud2lkdGgsbD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmVsbGlwc2UiKTtsLnNldEF0dHJpYnV0ZSgiY3giLHIvMik7bC5zZXRBdHRyaWJ1dGUoImN5IixhLzIpO2wuc2V0QXR0cmlidXRlKCJyeCIsci8yLWkvMik7bC5zZXRBdHRyaWJ1dGUoInJ5IixhLzItaS8yKTtsLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIixpfHwxKTtsLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwidHJhbnNwYXJlbnQiKTtsLnNldEF0dHJpYnV0ZSgiZmlsbCIsIm5vbmUiKTtvLmFwcGVuZENoaWxkKGwpO3RoaXMuY29udGFpbmVyLmFwcGVuZChvKTt0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcixsLHQpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19XSk7cmV0dXJuIENpcmNsZUFubm90YXRpb25FbGVtZW50fSh1KSx3PWZ1bmN0aW9uKHQpe19pbmhlcml0cyhQb2x5bGluZUFubm90YXRpb25FbGVtZW50LHQpO3ZhciByPV9jcmVhdGVTdXBlcihQb2x5bGluZUFubm90YXRpb25FbGVtZW50KTtmdW5jdGlvbiBQb2x5bGluZUFubm90YXRpb25FbGVtZW50KHQpe3ZhciBhO19jbGFzc0NhbGxDaGVjayh0aGlzLFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQpO3ZhciBvPSEhKHQuZGF0YS5oYXNQb3B1cHx8dC5kYXRhLnRpdGxlfHx0LmRhdGEuY29udGVudHMpOyhhPXIuY2FsbCh0aGlzLHQsbywhMCkpLmNvbnRhaW5lckNsYXNzTmFtZT0icG9seWxpbmVBbm5vdGF0aW9uIjthLnN2Z0VsZW1lbnROYW1lPSJzdmc6cG9seWxpbmUiO3JldHVybiBhfV9jcmVhdGVDbGFzcyhQb2x5bGluZUFubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT10aGlzLmNvbnRhaW5lckNsYXNzTmFtZTt2YXIgdCxyPXRoaXMuZGF0YSxhPXIucmVjdFsyXS1yLnJlY3RbMF0sbz1yLnJlY3RbM10tci5yZWN0WzFdLGk9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShhLG8pLGw9W10sYz1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyLnZlcnRpY2VzKTt0cnl7Zm9yKGMucygpOyEodD1jLm4oKSkuZG9uZTspe3ZhciB1PXQudmFsdWUsZD11Lngtci5yZWN0WzBdLGg9ci5yZWN0WzNdLXUueTtsLnB1c2goZCsiLCIraCl9fWNhdGNoKHQpe2MuZSh0KX1maW5hbGx5e2MuZigpfWw9bC5qb2luKCIgIik7dmFyIHA9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7cC5zZXRBdHRyaWJ1dGUoInBvaW50cyIsbCk7cC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsci5ib3JkZXJTdHlsZS53aWR0aHx8MSk7cC5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsInRyYW5zcGFyZW50Iik7cC5zZXRBdHRyaWJ1dGUoImZpbGwiLCJub25lIik7aS5hcHBlbmRDaGlsZChwKTt0aGlzLmNvbnRhaW5lci5hcHBlbmQoaSk7dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIscCxyKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fV0pO3JldHVybiBQb2x5bGluZUFubm90YXRpb25FbGVtZW50fSh1KSxQPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCk7ZnVuY3Rpb24gUG9seWdvbkFubm90YXRpb25FbGVtZW50KHQpe3ZhciBhO19jbGFzc0NhbGxDaGVjayh0aGlzLFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCk7KGE9ci5jYWxsKHRoaXMsdCkpLmNvbnRhaW5lckNsYXNzTmFtZT0icG9seWdvbkFubm90YXRpb24iO2Euc3ZnRWxlbWVudE5hbWU9InN2Zzpwb2x5Z29uIjtyZXR1cm4gYX1yZXR1cm4gUG9seWdvbkFubm90YXRpb25FbGVtZW50fSh3KSx4PWZ1bmN0aW9uKHQpe19pbmhlcml0cyhDYXJldEFubm90YXRpb25FbGVtZW50LHQpO3ZhciByPV9jcmVhdGVTdXBlcihDYXJldEFubm90YXRpb25FbGVtZW50KTtmdW5jdGlvbiBDYXJldEFubm90YXRpb25FbGVtZW50KHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLENhcmV0QW5ub3RhdGlvbkVsZW1lbnQpO3ZhciBhPSEhKHQuZGF0YS5oYXNQb3B1cHx8dC5kYXRhLnRpdGxlfHx0LmRhdGEuY29udGVudHMpO3JldHVybiByLmNhbGwodGhpcyx0LGEsITApfV9jcmVhdGVDbGFzcyhDYXJldEFubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0iY2FyZXRBbm5vdGF0aW9uIjt0aGlzLmRhdGEuaGFzUG9wdXB8fHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLG51bGwsdGhpcy5kYXRhKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fV0pO3JldHVybiBDYXJldEFubm90YXRpb25FbGVtZW50fSh1KSxUPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhJbmtBbm5vdGF0aW9uRWxlbWVudCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoSW5rQW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIElua0Fubm90YXRpb25FbGVtZW50KHQpe3ZhciBhO19jbGFzc0NhbGxDaGVjayh0aGlzLElua0Fubm90YXRpb25FbGVtZW50KTt2YXIgbz0hISh0LmRhdGEuaGFzUG9wdXB8fHQuZGF0YS50aXRsZXx8dC5kYXRhLmNvbnRlbnRzKTsoYT1yLmNhbGwodGhpcyx0LG8sITApKS5jb250YWluZXJDbGFzc05hbWU9Imlua0Fubm90YXRpb24iO2Euc3ZnRWxlbWVudE5hbWU9InN2Zzpwb2x5bGluZSI7cmV0dXJuIGF9X2NyZWF0ZUNsYXNzKElua0Fubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT10aGlzLmNvbnRhaW5lckNsYXNzTmFtZTt2YXIgdCxyPXRoaXMuZGF0YSxhPXIucmVjdFsyXS1yLnJlY3RbMF0sbz1yLnJlY3RbM10tci5yZWN0WzFdLGk9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShhLG8pLGw9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoci5pbmtMaXN0cyk7dHJ5e2ZvcihsLnMoKTshKHQ9bC5uKCkpLmRvbmU7KXt2YXIgYyx1PXQudmFsdWUsZD1bXSxoPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHUpO3RyeXtmb3IoaC5zKCk7IShjPWgubigpKS5kb25lOyl7dmFyIHA9Yy52YWx1ZSxtPXAueC1yLnJlY3RbMF0sdj1yLnJlY3RbM10tcC55O2QucHVzaCgiIi5jb25jYXQobSwiLCIpLmNvbmNhdCh2KSl9fWNhdGNoKHQpe2guZSh0KX1maW5hbGx5e2guZigpfWQ9ZC5qb2luKCIgIik7dmFyIGc9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7Zy5zZXRBdHRyaWJ1dGUoInBvaW50cyIsZCk7Zy5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsci5ib3JkZXJTdHlsZS53aWR0aHx8MSk7Zy5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsInRyYW5zcGFyZW50Iik7Zy5zZXRBdHRyaWJ1dGUoImZpbGwiLCJub25lIik7dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsZyxyKTtpLmFwcGVuZENoaWxkKGcpfX1jYXRjaCh0KXtsLmUodCl9ZmluYWxseXtsLmYoKX10aGlzLmNvbnRhaW5lci5hcHBlbmQoaSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1dKTtyZXR1cm4gSW5rQW5ub3RhdGlvbkVsZW1lbnR9KHUpLEU9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50LHQpO3ZhciByPV9jcmVhdGVTdXBlcihIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudCk7ZnVuY3Rpb24gSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQpO3ZhciBhPSEhKHQuZGF0YS5oYXNQb3B1cHx8dC5kYXRhLnRpdGxlfHx0LmRhdGEuY29udGVudHMpO3JldHVybiByLmNhbGwodGhpcyx0LGEsITApfV9jcmVhdGVDbGFzcyhIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9ImhpZ2hsaWdodEFubm90YXRpb24iO3RoaXMuZGF0YS5oYXNQb3B1cHx8dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsbnVsbCx0aGlzLmRhdGEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19XSk7cmV0dXJuIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50fSh1KSxPPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KTt2YXIgYT0hISh0LmRhdGEuaGFzUG9wdXB8fHQuZGF0YS50aXRsZXx8dC5kYXRhLmNvbnRlbnRzKTtyZXR1cm4gci5jYWxsKHRoaXMsdCxhLCEwKX1fY3JlYXRlQ2xhc3MoVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJ1bmRlcmxpbmVBbm5vdGF0aW9uIjt0aGlzLmRhdGEuaGFzUG9wdXB8fHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLG51bGwsdGhpcy5kYXRhKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fV0pO3JldHVybiBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudH0odSksST1mdW5jdGlvbih0KXtfaW5oZXJpdHMoU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCk7ZnVuY3Rpb24gU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTcXVpZ2dseUFubm90YXRpb25FbGVtZW50KTt2YXIgYT0hISh0LmRhdGEuaGFzUG9wdXB8fHQuZGF0YS50aXRsZXx8dC5kYXRhLmNvbnRlbnRzKTtyZXR1cm4gci5jYWxsKHRoaXMsdCxhLCEwKX1fY3JlYXRlQ2xhc3MoU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9InNxdWlnZ2x5QW5ub3RhdGlvbiI7dGhpcy5kYXRhLmhhc1BvcHVwfHx0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcixudWxsLHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1dKTtyZXR1cm4gU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudH0odSksRD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnQsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50KTtmdW5jdGlvbiBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCk7dmFyIGE9ISEodC5kYXRhLmhhc1BvcHVwfHx0LmRhdGEudGl0bGV8fHQuZGF0YS5jb250ZW50cyk7cmV0dXJuIHIuY2FsbCh0aGlzLHQsYSwhMCl9X2NyZWF0ZUNsYXNzKFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT0ic3RyaWtlb3V0QW5ub3RhdGlvbiI7dGhpcy5kYXRhLmhhc1BvcHVwfHx0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcixudWxsLHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1dKTtyZXR1cm4gU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnR9KHUpLEw9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsU3RhbXBBbm5vdGF0aW9uRWxlbWVudCk7dmFyIGE9ISEodC5kYXRhLmhhc1BvcHVwfHx0LmRhdGEudGl0bGV8fHQuZGF0YS5jb250ZW50cyk7cmV0dXJuIHIuY2FsbCh0aGlzLHQsYSwhMCl9X2NyZWF0ZUNsYXNzKFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NOYW1lPSJzdGFtcEFubm90YXRpb24iO3RoaXMuZGF0YS5oYXNQb3B1cHx8dGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsbnVsbCx0aGlzLmRhdGEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19XSk7cmV0dXJuIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnR9KHUpLE09ZnVuY3Rpb24odCl7X2luaGVyaXRzKEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQpO2Z1bmN0aW9uIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQodCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCk7dmFyIGw9KGE9ci5jYWxsKHRoaXMsdCwhMCkpLmRhdGEuZmlsZSxjPWwuZmlsZW5hbWUsdT1sLmNvbnRlbnQ7YS5maWxlbmFtZT0oMCxvLmdldEZpbGVuYW1lRnJvbVVybCkoYyk7YS5jb250ZW50PXU7YS5saW5rU2VydmljZS5ldmVudEJ1cyYmYS5saW5rU2VydmljZS5ldmVudEJ1cy5kaXNwYXRjaCgiZmlsZWF0dGFjaG1lbnRhbm5vdGF0aW9uIix7c291cmNlOl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYSksaWQ6KDAsaS5zdHJpbmdUb1BERlN0cmluZykoYyksZmlsZW5hbWU6Yyxjb250ZW50OnV9KTtyZXR1cm4gYX1fY3JlYXRlQ2xhc3MoRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc05hbWU9ImZpbGVBdHRhY2htZW50QW5ub3RhdGlvbiI7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0O3Quc3R5bGUud2lkdGg9dGhpcy5jb250YWluZXIuc3R5bGUud2lkdGg7dC5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsdGhpcy5fZG93bmxvYWQuYmluZCh0aGlzKSk7dGhpcy5kYXRhLmhhc1BvcHVwfHwhdGhpcy5kYXRhLnRpdGxlJiYhdGhpcy5kYXRhLmNvbnRlbnRzfHx0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lcix0LHRoaXMuZGF0YSk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodCk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0se2tleToiX2Rvd25sb2FkIix2YWx1ZTpmdW5jdGlvbiBfZG93bmxvYWQoKXt0aGlzLmRvd25sb2FkTWFuYWdlcj90aGlzLmRvd25sb2FkTWFuYWdlci5kb3dubG9hZERhdGEodGhpcy5jb250ZW50LHRoaXMuZmlsZW5hbWUsIiIpOigwLGkud2FybikoIkRvd25sb2FkIGNhbm5vdCBiZSBzdGFydGVkIGR1ZSB0byB1bmF2YWlsYWJsZSBkb3dubG9hZCBtYW5hZ2VyIil9fV0pO3JldHVybiBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50fSh1KSxXPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQW5ub3RhdGlvbkxheWVyKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQW5ub3RhdGlvbkxheWVyKX1fY3JlYXRlQ2xhc3MoQW5ub3RhdGlvbkxheWVyLG51bGwsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKHQpe3ZhciByLGE9W10sdT1bXSxkPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQuYW5ub3RhdGlvbnMpO3RyeXtmb3IoZC5zKCk7IShyPWQubigpKS5kb25lOyl7dmFyIGg9ci52YWx1ZTtoJiYoaC5hbm5vdGF0aW9uVHlwZSE9PWkuQW5ub3RhdGlvblR5cGUuUE9QVVA/YS5wdXNoKGgpOnUucHVzaChoKSl9fWNhdGNoKHQpe2QuZSh0KX1maW5hbGx5e2QuZigpfXUubGVuZ3RoJiZhLnB1c2guYXBwbHkoYSx1KTtmb3IodmFyIHA9MCxtPWE7cDxtLmxlbmd0aDtwKyspe3ZhciB2PW1bcF0sZz1jLmNyZWF0ZSh7ZGF0YTp2LGxheWVyOnQuZGl2LHBhZ2U6dC5wYWdlLHZpZXdwb3J0OnQudmlld3BvcnQsbGlua1NlcnZpY2U6dC5saW5rU2VydmljZSxkb3dubG9hZE1hbmFnZXI6dC5kb3dubG9hZE1hbmFnZXIsaW1hZ2VSZXNvdXJjZXNQYXRoOnQuaW1hZ2VSZXNvdXJjZXNQYXRofHwiIixyZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiJib29sZWFuIiE9dHlwZW9mIHQucmVuZGVySW50ZXJhY3RpdmVGb3Jtc3x8dC5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLHN2Z0ZhY3Rvcnk6bmV3IG8uRE9NU1ZHRmFjdG9yeSxhbm5vdGF0aW9uU3RvcmFnZTp0LmFubm90YXRpb25TdG9yYWdlfHxuZXcgbC5Bbm5vdGF0aW9uU3RvcmFnZX0pO2cuaXNSZW5kZXJhYmxlJiZ0LmRpdi5hcHBlbmRDaGlsZChnLnJlbmRlcigpKX19fSx7a2V5OiJ1cGRhdGUiLHZhbHVlOmZ1bmN0aW9uIHVwZGF0ZSh0KXt2YXIgcixhPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQuYW5ub3RhdGlvbnMpO3RyeXtmb3IoYS5zKCk7IShyPWEubigpKS5kb25lOyl7dmFyIG89ci52YWx1ZSxpPXQuZGl2LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFubm90YXRpb24taWQ9IicuY29uY2F0KG8uaWQsJyJdJykpO2kmJihpLnN0eWxlLnRyYW5zZm9ybT0ibWF0cml4KCIuY29uY2F0KHQudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oIiwiKSwiKSIpKX19Y2F0Y2godCl7YS5lKHQpfWZpbmFsbHl7YS5mKCl9dC5kaXYucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX19XSk7cmV0dXJuIEFubm90YXRpb25MYXllcn0oKTtyLkFubm90YXRpb25MYXllcj1XfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLnJlbmRlclRleHRMYXllcj12b2lkIDA7dmFyIG89YSg1KSxpPWZ1bmN0aW9uIHJlbmRlclRleHRMYXllckNsb3N1cmUoKXt2YXIgdD0vXFMvO2Z1bmN0aW9uIGFwcGVuZFRleHQocixhLGkpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSxjPXthbmdsZTowLGNhbnZhc1dpZHRoOjAsaXNXaGl0ZXNwYWNlOiExLG9yaWdpbmFsVHJhbnNmb3JtOm51bGwscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ1RvcDowLHNjYWxlOjF9O3IuX3RleHREaXZzLnB1c2gobCk7aWYoZnVuY3Rpb24gaXNBbGxXaGl0ZXNwYWNlKHIpe3JldHVybiF0LnRlc3Qocil9KGEuc3RyKSl7Yy5pc1doaXRlc3BhY2U9ITA7ci5fdGV4dERpdlByb3BlcnRpZXMuc2V0KGwsYyl9ZWxzZXt2YXIgdT1vLlV0aWwudHJhbnNmb3JtKHIuX3ZpZXdwb3J0LnRyYW5zZm9ybSxhLnRyYW5zZm9ybSksZD1NYXRoLmF0YW4yKHVbMV0sdVswXSksaD1pW2EuZm9udE5hbWVdO2gudmVydGljYWwmJihkKz1NYXRoLlBJLzIpO3ZhciBwLG0sdj1NYXRoLnNxcnQodVsyXSp1WzJdK3VbM10qdVszXSksZz12O2guYXNjZW50P2c9aC5hc2NlbnQqZzpoLmRlc2NlbnQmJihnPSgxK2guZGVzY2VudCkqZyk7aWYoMD09PWQpe3A9dVs0XTttPXVbNV0tZ31lbHNle3A9dVs0XStnKk1hdGguc2luKGQpO209dVs1XS1nKk1hdGguY29zKGQpfWwuc3R5bGUubGVmdD0iIi5jb25jYXQocCwicHgiKTtsLnN0eWxlLnRvcD0iIi5jb25jYXQobSwicHgiKTtsLnN0eWxlLmZvbnRTaXplPSIiLmNvbmNhdCh2LCJweCIpO2wuc3R5bGUuZm9udEZhbWlseT1oLmZvbnRGYW1pbHk7bC50ZXh0Q29udGVudD1hLnN0cjtyLl9mb250SW5zcGVjdG9yRW5hYmxlZCYmKGwuZGF0YXNldC5mb250TmFtZT1hLmZvbnROYW1lKTswIT09ZCYmKGMuYW5nbGU9ZCooMTgwL01hdGguUEkpKTt2YXIgeT0hMTtpZihhLnN0ci5sZW5ndGg+MSl5PSEwO2Vsc2UgaWYoYS50cmFuc2Zvcm1bMF0hPT1hLnRyYW5zZm9ybVszXSl7dmFyIGI9TWF0aC5hYnMoYS50cmFuc2Zvcm1bMF0pLF89TWF0aC5hYnMoYS50cmFuc2Zvcm1bM10pO2IhPT1fJiZNYXRoLm1heChiLF8pL01hdGgubWluKGIsXyk+MS41JiYoeT0hMCl9eSYmKGgudmVydGljYWw/Yy5jYW52YXNXaWR0aD1hLmhlaWdodCpyLl92aWV3cG9ydC5zY2FsZTpjLmNhbnZhc1dpZHRoPWEud2lkdGgqci5fdmlld3BvcnQuc2NhbGUpO3IuX3RleHREaXZQcm9wZXJ0aWVzLnNldChsLGMpO3IuX3RleHRDb250ZW50U3RyZWFtJiZyLl9sYXlvdXRUZXh0KGwpO2lmKHIuX2VuaGFuY2VUZXh0U2VsZWN0aW9uKXt2YXIgUz0xLEM9MDtpZigwIT09ZCl7Uz1NYXRoLmNvcyhkKTtDPU1hdGguc2luKGQpfXZhciBBLFIsaz0oaC52ZXJ0aWNhbD9hLmhlaWdodDphLndpZHRoKSpyLl92aWV3cG9ydC5zY2FsZSx3PXY7aWYoMCE9PWQpe0E9W1MsQywtQyxTLHAsbV07Uj1vLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsMCxrLHddLEEpfWVsc2UgUj1bcCxtLHArayxtK3ddO3IuX2JvdW5kcy5wdXNoKHtsZWZ0OlJbMF0sdG9wOlJbMV0scmlnaHQ6UlsyXSxib3R0b206UlszXSxkaXY6bCxzaXplOltrLHddLG06QX0pfX19ZnVuY3Rpb24gcmVuZGVyKHQpe2lmKCF0Ll9jYW5jZWxlZCl7dmFyIHI9dC5fdGV4dERpdnMsYT10Ll9jYXBhYmlsaXR5LG89ci5sZW5ndGg7aWYobz4xZTUpe3QuX3JlbmRlcmluZ0RvbmU9ITA7YS5yZXNvbHZlKCl9ZWxzZXtpZighdC5fdGV4dENvbnRlbnRTdHJlYW0pZm9yKHZhciBpPTA7aTxvO2krKyl0Ll9sYXlvdXRUZXh0KHJbaV0pO3QuX3JlbmRlcmluZ0RvbmU9ITA7YS5yZXNvbHZlKCl9fX1mdW5jdGlvbiBmaW5kUG9zaXRpdmVNaW4odCxyLGEpe2Zvcih2YXIgbz0wLGk9MDtpPGE7aSsrKXt2YXIgbD10W3IrK107bD4wJiYobz1vP01hdGgubWluKGwsbyk6bCl9cmV0dXJuIG99ZnVuY3Rpb24gZXhwYW5kKHQpe2Zvcih2YXIgcj10Ll9ib3VuZHMsYT10Ll92aWV3cG9ydCxpPWZ1bmN0aW9uIGV4cGFuZEJvdW5kcyh0LHIsYSl7dmFyIG89YS5tYXAoKGZ1bmN0aW9uKHQscil7cmV0dXJue3gxOnQubGVmdCx5MTp0LnRvcCx4Mjp0LnJpZ2h0LHkyOnQuYm90dG9tLGluZGV4OnIseDFOZXc6dm9pZCAwLHgyTmV3OnZvaWQgMH19KSk7ZXhwYW5kQm91bmRzTFRSKHQsbyk7dmFyIGk9bmV3IEFycmF5KGEubGVuZ3RoKTtvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPXQuaW5kZXg7aVtyXT17bGVmdDp0LngxTmV3LHRvcDowLHJpZ2h0OnQueDJOZXcsYm90dG9tOjB9fSkpO2EubWFwKChmdW5jdGlvbihyLGEpe3ZhciBsPWlbYV0sYz1vW2FdO2MueDE9ci50b3A7Yy55MT10LWwucmlnaHQ7Yy54Mj1yLmJvdHRvbTtjLnkyPXQtbC5sZWZ0O2MuaW5kZXg9YTtjLngxTmV3PXZvaWQgMDtjLngyTmV3PXZvaWQgMH0pKTtleHBhbmRCb3VuZHNMVFIocixvKTtvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPXQuaW5kZXg7aVtyXS50b3A9dC54MU5ldztpW3JdLmJvdHRvbT10LngyTmV3fSkpO3JldHVybiBpfShhLndpZHRoLGEuaGVpZ2h0LHIpLGw9MDtsPGkubGVuZ3RoO2wrKyl7dmFyIGM9cltsXS5kaXYsdT10Ll90ZXh0RGl2UHJvcGVydGllcy5nZXQoYyk7aWYoMCE9PXUuYW5nbGUpe3ZhciBkPWlbbF0saD1yW2xdLHA9aC5tLG09cFswXSx2PXBbMV0sZz1bWzAsMF0sWzAsaC5zaXplWzFdXSxbaC5zaXplWzBdLDBdLGguc2l6ZV0seT1uZXcgRmxvYXQ2NEFycmF5KDY0KTtnLmZvckVhY2goKGZ1bmN0aW9uKHQscil7dmFyIGE9by5VdGlsLmFwcGx5VHJhbnNmb3JtKHQscCk7eVtyKzBdPW0mJihkLmxlZnQtYVswXSkvbTt5W3IrNF09diYmKGQudG9wLWFbMV0pL3Y7eVtyKzhdPW0mJihkLnJpZ2h0LWFbMF0pL207eVtyKzEyXT12JiYoZC5ib3R0b20tYVsxXSkvdjt5W3IrMTZdPXYmJihkLmxlZnQtYVswXSkvLXY7eVtyKzIwXT1tJiYoZC50b3AtYVsxXSkvbTt5W3IrMjRdPXYmJihkLnJpZ2h0LWFbMF0pLy12O3lbcisyOF09bSYmKGQuYm90dG9tLWFbMV0pL207eVtyKzMyXT1tJiYoZC5sZWZ0LWFbMF0pLy1tO3lbciszNl09diYmKGQudG9wLWFbMV0pLy12O3lbcis0MF09bSYmKGQucmlnaHQtYVswXSkvLW07eVtyKzQ0XT12JiYoZC5ib3R0b20tYVsxXSkvLXY7eVtyKzQ4XT12JiYoZC5sZWZ0LWFbMF0pL3Y7eVtyKzUyXT1tJiYoZC50b3AtYVsxXSkvLW07eVtyKzU2XT12JiYoZC5yaWdodC1hWzBdKS92O3lbcis2MF09bSYmKGQuYm90dG9tLWFbMV0pLy1tfSkpO3ZhciBiPTErTWF0aC5taW4oTWF0aC5hYnMobSksTWF0aC5hYnModikpO3UucGFkZGluZ0xlZnQ9ZmluZFBvc2l0aXZlTWluKHksMzIsMTYpL2I7dS5wYWRkaW5nVG9wPWZpbmRQb3NpdGl2ZU1pbih5LDQ4LDE2KS9iO3UucGFkZGluZ1JpZ2h0PWZpbmRQb3NpdGl2ZU1pbih5LDAsMTYpL2I7dS5wYWRkaW5nQm90dG9tPWZpbmRQb3NpdGl2ZU1pbih5LDE2LDE2KS9iO3QuX3RleHREaXZQcm9wZXJ0aWVzLnNldChjLHUpfWVsc2V7dS5wYWRkaW5nTGVmdD1yW2xdLmxlZnQtaVtsXS5sZWZ0O3UucGFkZGluZ1RvcD1yW2xdLnRvcC1pW2xdLnRvcDt1LnBhZGRpbmdSaWdodD1pW2xdLnJpZ2h0LXJbbF0ucmlnaHQ7dS5wYWRkaW5nQm90dG9tPWlbbF0uYm90dG9tLXJbbF0uYm90dG9tO3QuX3RleHREaXZQcm9wZXJ0aWVzLnNldChjLHUpfX19ZnVuY3Rpb24gZXhwYW5kQm91bmRzTFRSKHQscil7ci5zb3J0KChmdW5jdGlvbih0LHIpe3JldHVybiB0LngxLXIueDF8fHQuaW5kZXgtci5pbmRleH0pKTt2YXIgYT1be3N0YXJ0Oi0xLzAsZW5kOjEvMCxib3VuZGFyeTp7eDE6LTEvMCx5MTotMS8wLHgyOjAseTI6MS8wLGluZGV4Oi0xLHgxTmV3OjAseDJOZXc6MH19XTtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wO3I8YS5sZW5ndGgmJmFbcl0uZW5kPD10LnkxOylyKys7Zm9yKHZhciBvLGksbD1hLmxlbmd0aC0xO2w+PTAmJmFbbF0uc3RhcnQ+PXQueTI7KWwtLTt2YXIgYyx1LGQ9LTEvMDtmb3IoYz1yO2M8PWw7YysrKXt2YXIgaDsoaD0oaT0obz1hW2NdKS5ib3VuZGFyeSkueDI+dC54MT9pLmluZGV4PnQuaW5kZXg/aS54MU5ldzp0LngxOnZvaWQgMD09PWkueDJOZXc/KGkueDIrdC54MSkvMjppLngyTmV3KT5kJiYoZD1oKX10LngxTmV3PWQ7Zm9yKGM9cjtjPD1sO2MrKyl2b2lkIDA9PT0oaT0obz1hW2NdKS5ib3VuZGFyeSkueDJOZXc/aS54Mj50LngxP2kuaW5kZXg+dC5pbmRleCYmKGkueDJOZXc9aS54Mik6aS54Mk5ldz1kOmkueDJOZXc+ZCYmKGkueDJOZXc9TWF0aC5tYXgoZCxpLngyKSk7dmFyIHA9W10sbT1udWxsO2ZvcihjPXI7Yzw9bDtjKyspe3ZhciB2PShpPShvPWFbY10pLmJvdW5kYXJ5KS54Mj50LngyP2k6dDtpZihtPT09dilwW3AubGVuZ3RoLTFdLmVuZD1vLmVuZDtlbHNle3AucHVzaCh7c3RhcnQ6by5zdGFydCxlbmQ6by5lbmQsYm91bmRhcnk6dn0pO209dn19aWYoYVtyXS5zdGFydDx0LnkxKXtwWzBdLnN0YXJ0PXQueTE7cC51bnNoaWZ0KHtzdGFydDphW3JdLnN0YXJ0LGVuZDp0LnkxLGJvdW5kYXJ5OmFbcl0uYm91bmRhcnl9KX1pZih0LnkyPGFbbF0uZW5kKXtwW3AubGVuZ3RoLTFdLmVuZD10LnkyO3AucHVzaCh7c3RhcnQ6dC55MixlbmQ6YVtsXS5lbmQsYm91bmRhcnk6YVtsXS5ib3VuZGFyeX0pfWZvcihjPXI7Yzw9bDtjKyspaWYodm9pZCAwPT09KGk9KG89YVtjXSkuYm91bmRhcnkpLngyTmV3KXt2YXIgZz0hMTtmb3IodT1yLTE7IWcmJnU+PTAmJmFbdV0uc3RhcnQ+PWkueTE7dS0tKWc9YVt1XS5ib3VuZGFyeT09PWk7Zm9yKHU9bCsxOyFnJiZ1PGEubGVuZ3RoJiZhW3VdLmVuZDw9aS55Mjt1KyspZz1hW3VdLmJvdW5kYXJ5PT09aTtmb3IodT0wOyFnJiZ1PHAubGVuZ3RoO3UrKylnPXBbdV0uYm91bmRhcnk9PT1pO2d8fChpLngyTmV3PWQpfUFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoYSxbcixsLXIrMV0uY29uY2F0KHApKX0pKTthLmZvckVhY2goKGZ1bmN0aW9uKHIpe3ZhciBhPXIuYm91bmRhcnk7dm9pZCAwPT09YS54Mk5ldyYmKGEueDJOZXc9TWF0aC5tYXgodCxhLngyKSl9KSl9ZnVuY3Rpb24gVGV4dExheWVyUmVuZGVyVGFzayh0KXt2YXIgcj10aGlzLGE9dC50ZXh0Q29udGVudCxpPXQudGV4dENvbnRlbnRTdHJlYW0sbD10LmNvbnRhaW5lcixjPXQudmlld3BvcnQsdT10LnRleHREaXZzLGQ9dC50ZXh0Q29udGVudEl0ZW1zU3RyLGg9dC5lbmhhbmNlVGV4dFNlbGVjdGlvbjt0aGlzLl90ZXh0Q29udGVudD1hO3RoaXMuX3RleHRDb250ZW50U3RyZWFtPWk7dGhpcy5fY29udGFpbmVyPWw7dGhpcy5fZG9jdW1lbnQ9bC5vd25lckRvY3VtZW50O3RoaXMuX3ZpZXdwb3J0PWM7dGhpcy5fdGV4dERpdnM9dXx8W107dGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0cj1kfHxbXTt0aGlzLl9lbmhhbmNlVGV4dFNlbGVjdGlvbj0hIWg7dGhpcy5fZm9udEluc3BlY3RvckVuYWJsZWQ9ISghZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yfHwhZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmVuYWJsZWQpO3RoaXMuX3JlYWRlcj1udWxsO3RoaXMuX2xheW91dFRleHRMYXN0Rm9udFNpemU9bnVsbDt0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRGYW1pbHk9bnVsbDt0aGlzLl9sYXlvdXRUZXh0Q3R4PW51bGw7dGhpcy5fdGV4dERpdlByb3BlcnRpZXM9bmV3IFdlYWtNYXA7dGhpcy5fcmVuZGVyaW5nRG9uZT0hMTt0aGlzLl9jYW5jZWxlZD0hMTt0aGlzLl9jYXBhYmlsaXR5PSgwLG8uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5fcmVuZGVyVGltZXI9bnVsbDt0aGlzLl9ib3VuZHM9W107dGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlLmZpbmFsbHkoKGZ1bmN0aW9uKCl7aWYoci5fbGF5b3V0VGV4dEN0eCl7ci5fbGF5b3V0VGV4dEN0eC5jYW52YXMud2lkdGg9MDtyLl9sYXlvdXRUZXh0Q3R4LmNhbnZhcy5oZWlnaHQ9MDtyLl9sYXlvdXRUZXh0Q3R4PW51bGx9fSkpLmNhdGNoKChmdW5jdGlvbigpe30pKX1UZXh0TGF5ZXJSZW5kZXJUYXNrLnByb3RvdHlwZT17Z2V0IHByb21pc2UoKXtyZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlfSxjYW5jZWw6ZnVuY3Rpb24gVGV4dExheWVyX2NhbmNlbCgpe3RoaXMuX2NhbmNlbGVkPSEwO2lmKHRoaXMuX3JlYWRlcil7dGhpcy5fcmVhZGVyLmNhbmNlbChuZXcgby5BYm9ydEV4Y2VwdGlvbigiVGV4dExheWVyIHRhc2sgY2FuY2VsbGVkLiIpKTt0aGlzLl9yZWFkZXI9bnVsbH1pZihudWxsIT09dGhpcy5fcmVuZGVyVGltZXIpe2NsZWFyVGltZW91dCh0aGlzLl9yZW5kZXJUaW1lcik7dGhpcy5fcmVuZGVyVGltZXI9bnVsbH10aGlzLl9jYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC4iKSl9LF9wcm9jZXNzSXRlbXM6ZnVuY3Rpb24gX3Byb2Nlc3NJdGVtcyh0LHIpe2Zvcih2YXIgYT0wLG89dC5sZW5ndGg7YTxvO2ErKyl7dGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKHRbYV0uc3RyKTthcHBlbmRUZXh0KHRoaXMsdFthXSxyKX19LF9sYXlvdXRUZXh0OmZ1bmN0aW9uIF9sYXlvdXRUZXh0KHQpe3ZhciByPXRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldCh0KTtpZighci5pc1doaXRlc3BhY2Upe3ZhciBhPSIiO2lmKDAhPT1yLmNhbnZhc1dpZHRoKXt2YXIgbz10LnN0eWxlLGk9by5mb250U2l6ZSxsPW8uZm9udEZhbWlseTtpZihpIT09dGhpcy5fbGF5b3V0VGV4dExhc3RGb250U2l6ZXx8bCE9PXRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSl7dGhpcy5fbGF5b3V0VGV4dEN0eC5mb250PSIiLmNvbmNhdChpLCIgIikuY29uY2F0KGwpO3RoaXMuX2xheW91dFRleHRMYXN0Rm9udFNpemU9aTt0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRGYW1pbHk9bH12YXIgYz10aGlzLl9sYXlvdXRUZXh0Q3R4Lm1lYXN1cmVUZXh0KHQudGV4dENvbnRlbnQpLndpZHRoO2lmKGM+MCl7ci5zY2FsZT1yLmNhbnZhc1dpZHRoL2M7YT0ic2NhbGVYKCIuY29uY2F0KHIuc2NhbGUsIikiKX19MCE9PXIuYW5nbGUmJihhPSJyb3RhdGUoIi5jb25jYXQoci5hbmdsZSwiZGVnKSAiKS5jb25jYXQoYSkpO2lmKGEubGVuZ3RoPjApe3RoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uJiYoci5vcmlnaW5hbFRyYW5zZm9ybT1hKTt0LnN0eWxlLnRyYW5zZm9ybT1hfXRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLnNldCh0LHIpO3RoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0KX19LF9yZW5kZXI6ZnVuY3Rpb24gVGV4dExheWVyX3JlbmRlcih0KXt2YXIgcj10aGlzLGE9KDAsby5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSxpPU9iamVjdC5jcmVhdGUobnVsbCksbD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtsLm1vek9wYXF1ZT0hMDt0aGlzLl9sYXlvdXRUZXh0Q3R4PWwuZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMX0pO2lmKHRoaXMuX3RleHRDb250ZW50KXt2YXIgYz10aGlzLl90ZXh0Q29udGVudC5pdGVtcyx1PXRoaXMuX3RleHRDb250ZW50LnN0eWxlczt0aGlzLl9wcm9jZXNzSXRlbXMoYyx1KTthLnJlc29sdmUoKX1lbHNle2lmKCF0aGlzLl90ZXh0Q29udGVudFN0cmVhbSl0aHJvdyBuZXcgRXJyb3IoJ05laXRoZXIgInRleHRDb250ZW50IiBub3IgInRleHRDb250ZW50U3RyZWFtIiBwYXJhbWV0ZXJzIHNwZWNpZmllZC4nKTt0aGlzLl9yZWFkZXI9dGhpcy5fdGV4dENvbnRlbnRTdHJlYW0uZ2V0UmVhZGVyKCk7IWZ1bmN0aW9uIHB1bXAoKXtyLl9yZWFkZXIucmVhZCgpLnRoZW4oKGZ1bmN0aW9uKHQpe3ZhciBvPXQudmFsdWU7aWYodC5kb25lKWEucmVzb2x2ZSgpO2Vsc2V7T2JqZWN0LmFzc2lnbihpLG8uc3R5bGVzKTtyLl9wcm9jZXNzSXRlbXMoby5pdGVtcyxpKTtwdW1wKCl9fSksYS5yZWplY3QpfSgpfWEucHJvbWlzZS50aGVuKChmdW5jdGlvbigpe2k9bnVsbDt0P3IuX3JlbmRlclRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmVuZGVyKHIpO3IuX3JlbmRlclRpbWVyPW51bGx9KSx0KTpyZW5kZXIocil9KSx0aGlzLl9jYXBhYmlsaXR5LnJlamVjdCl9LGV4cGFuZFRleHREaXZzOmZ1bmN0aW9uIFRleHRMYXllcl9leHBhbmRUZXh0RGl2cyh0KXtpZih0aGlzLl9lbmhhbmNlVGV4dFNlbGVjdGlvbiYmdGhpcy5fcmVuZGVyaW5nRG9uZSl7aWYobnVsbCE9PXRoaXMuX2JvdW5kcyl7ZXhwYW5kKHRoaXMpO3RoaXMuX2JvdW5kcz1udWxsfWZvcih2YXIgcj1bXSxhPVtdLG89MCxpPXRoaXMuX3RleHREaXZzLmxlbmd0aDtvPGk7bysrKXt2YXIgbD10aGlzLl90ZXh0RGl2c1tvXSxjPXRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldChsKTtpZighYy5pc1doaXRlc3BhY2UpaWYodCl7ci5sZW5ndGg9MDthLmxlbmd0aD0wO2Mub3JpZ2luYWxUcmFuc2Zvcm0mJnIucHVzaChjLm9yaWdpbmFsVHJhbnNmb3JtKTtpZihjLnBhZGRpbmdUb3A+MCl7YS5wdXNoKCIiLmNvbmNhdChjLnBhZGRpbmdUb3AsInB4IikpO3IucHVzaCgidHJhbnNsYXRlWSgiLmNvbmNhdCgtYy5wYWRkaW5nVG9wLCJweCkiKSl9ZWxzZSBhLnB1c2goMCk7Yy5wYWRkaW5nUmlnaHQ+MD9hLnB1c2goIiIuY29uY2F0KGMucGFkZGluZ1JpZ2h0L2Muc2NhbGUsInB4IikpOmEucHVzaCgwKTtjLnBhZGRpbmdCb3R0b20+MD9hLnB1c2goIiIuY29uY2F0KGMucGFkZGluZ0JvdHRvbSwicHgiKSk6YS5wdXNoKDApO2lmKGMucGFkZGluZ0xlZnQ+MCl7YS5wdXNoKCIiLmNvbmNhdChjLnBhZGRpbmdMZWZ0L2Muc2NhbGUsInB4IikpO3IucHVzaCgidHJhbnNsYXRlWCgiLmNvbmNhdCgtYy5wYWRkaW5nTGVmdC9jLnNjYWxlLCJweCkiKSl9ZWxzZSBhLnB1c2goMCk7bC5zdHlsZS5wYWRkaW5nPWEuam9pbigiICIpO3IubGVuZ3RoJiYobC5zdHlsZS50cmFuc2Zvcm09ci5qb2luKCIgIikpfWVsc2V7bC5zdHlsZS5wYWRkaW5nPW51bGw7bC5zdHlsZS50cmFuc2Zvcm09Yy5vcmlnaW5hbFRyYW5zZm9ybX19fX19O3JldHVybiBmdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXIodCl7dmFyIHI9bmV3IFRleHRMYXllclJlbmRlclRhc2soe3RleHRDb250ZW50OnQudGV4dENvbnRlbnQsdGV4dENvbnRlbnRTdHJlYW06dC50ZXh0Q29udGVudFN0cmVhbSxjb250YWluZXI6dC5jb250YWluZXIsdmlld3BvcnQ6dC52aWV3cG9ydCx0ZXh0RGl2czp0LnRleHREaXZzLHRleHRDb250ZW50SXRlbXNTdHI6dC50ZXh0Q29udGVudEl0ZW1zU3RyLGVuaGFuY2VUZXh0U2VsZWN0aW9uOnQuZW5oYW5jZVRleHRTZWxlY3Rpb259KTtyLl9yZW5kZXIodC50aW1lb3V0KTtyZXR1cm4gcn19KCk7ci5yZW5kZXJUZXh0TGF5ZXI9aX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5TVkdHcmFwaGljcz12b2lkIDA7dmFyIG89YSg1KSxpPWEoMSksbD1hKDcpO2Z1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheSh0KXtyZXR1cm4gZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQpfSh0KXx8ZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheSh0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KSlyZXR1cm4gQXJyYXkuZnJvbSh0KX0odCl8fF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSh0KXx8ZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkodCxyKXtyZXR1cm4gZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9KHQpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQodCxyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIGE9W10sbz0hMCxpPSExLGw9dm9pZCAwO3RyeXtmb3IodmFyIGMsdT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKG89KGM9dS5uZXh0KCkpLmRvbmUpO289ITApe2EucHVzaChjLnZhbHVlKTtpZihyJiZhLmxlbmd0aD09PXIpYnJlYWt9fWNhdGNoKHQpe2k9ITA7bD10fWZpbmFsbHl7dHJ5e298fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYoaSl0aHJvdyBsfX1yZXR1cm4gYX0odCxyKXx8X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil8fGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQscil7dmFyIGE7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KGE9X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQpKXx8ciYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7YSYmKHQ9YSk7dmFyIG89MCxpPWZ1bmN0aW9uIEYoKXt9O3JldHVybntzOmksbjpmdW5jdGlvbiBuKCl7cmV0dXJuIG8+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W28rK119fSxlOmZ1bmN0aW9uIGUodCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGwsYz0hMCx1PSExO3JldHVybntzOmZ1bmN0aW9uIHMoKXthPXRbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uIG4oKXt2YXIgdD1hLm5leHQoKTtjPXQuZG9uZTtyZXR1cm4gdH0sZTpmdW5jdGlvbiBlKHQpe3U9ITA7bD10fSxmOmZ1bmN0aW9uIGYoKXt0cnl7Y3x8bnVsbD09YS5yZXR1cm58fGEucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IGx9fX19ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7cmV0dXJuIk1hcCI9PT1hfHwiU2V0Ij09PWE/QXJyYXkuZnJvbSh0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP19hcnJheUxpa2VUb0FycmF5KHQscik6dm9pZCAwfX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLG89bmV3IEFycmF5KHIpO2E8cjthKyspb1thXT10W2FdO3JldHVybiBvfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fXZhciBjPWZ1bmN0aW9uIFNWR0dyYXBoaWNzKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IFNWR0dyYXBoaWNzIil9O3IuU1ZHR3JhcGhpY3M9Yzt2YXIgdT1mdW5jdGlvbiBwZih0KXtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpKXJldHVybiB0LnRvU3RyaW5nKCk7dmFyIHI9dC50b0ZpeGVkKDEwKSxhPXIubGVuZ3RoLTE7aWYoIjAiIT09clthXSlyZXR1cm4gcjtkb3thLS19d2hpbGUoIjAiPT09clthXSk7cmV0dXJuIHIuc3Vic3RyaW5nKDAsIi4iPT09clthXT9hOmErMSl9LGQ9ZnVuY3Rpb24gcG0odCl7aWYoMD09PXRbNF0mJjA9PT10WzVdKXtpZigwPT09dFsxXSYmMD09PXRbMl0pcmV0dXJuIDE9PT10WzBdJiYxPT09dFszXT8iIjoic2NhbGUoIi5jb25jYXQodSh0WzBdKSwiICIpLmNvbmNhdCh1KHRbM10pLCIpIik7aWYodFswXT09PXRbM10mJnRbMV09PT0tdFsyXSl7dmFyIHI9MTgwKk1hdGguYWNvcyh0WzBdKS9NYXRoLlBJO3JldHVybiJyb3RhdGUoIi5jb25jYXQodShyKSwiKSIpfX1lbHNlIGlmKDE9PT10WzBdJiYwPT09dFsxXSYmMD09PXRbMl0mJjE9PT10WzNdKXJldHVybiJ0cmFuc2xhdGUoIi5jb25jYXQodSh0WzRdKSwiICIpLmNvbmNhdCh1KHRbNV0pLCIpIik7cmV0dXJuIm1hdHJpeCgiLmNvbmNhdCh1KHRbMF0pLCIgIikuY29uY2F0KHUodFsxXSksIiAiKS5jb25jYXQodSh0WzJdKSwiICIpLmNvbmNhdCh1KHRbM10pLCIgIikuY29uY2F0KHUodFs0XSksIiAiKSsiIi5jb25jYXQodSh0WzVdKSwiKSIpfSxoPXtmb250U3R5bGU6Im5vcm1hbCIsZm9udFdlaWdodDoibm9ybWFsIixmaWxsQ29sb3I6IiMwMDAwMDAifSxwPVsiYnV0dCIsInJvdW5kIiwic3F1YXJlIl0sbT1bIm1pdGVyIiwicm91bmQiLCJiZXZlbCJdLHY9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IFVpbnQ4QXJyYXkoWzEzNyw4MCw3OCw3MSwxMywxMCwyNiwxMF0pLHI9bmV3IEludDMyQXJyYXkoMjU2KSxhPTA7YTwyNTY7YSsrKXtmb3IodmFyIGk9YSxjPTA7Yzw4O2MrKylpPTEmaT8zOTg4MjkyMzg0Xmk+PjEmMjE0NzQ4MzY0NzppPj4xJjIxNDc0ODM2NDc7clthXT1pfWZ1bmN0aW9uIHdyaXRlUG5nQ2h1bmsodCxhLG8saSl7dmFyIGw9aSxjPWEubGVuZ3RoO29bbF09Yz4+MjQmMjU1O29bbCsxXT1jPj4xNiYyNTU7b1tsKzJdPWM+PjgmMjU1O29bbCszXT0yNTUmYztvW2wrPTRdPTI1NSZ0LmNoYXJDb2RlQXQoMCk7b1tsKzFdPTI1NSZ0LmNoYXJDb2RlQXQoMSk7b1tsKzJdPTI1NSZ0LmNoYXJDb2RlQXQoMik7b1tsKzNdPTI1NSZ0LmNoYXJDb2RlQXQoMyk7bCs9NDtvLnNldChhLGwpO3ZhciB1PWZ1bmN0aW9uIGNyYzMyKHQsYSxvKXtmb3IodmFyIGk9LTEsbD1hO2w8bztsKyspe3ZhciBjPTI1NSYoaV50W2xdKTtpPWk+Pj44XnJbY119cmV0dXJuLTFeaX0obyxpKzQsbCs9YS5sZW5ndGgpO29bbF09dT4+MjQmMjU1O29bbCsxXT11Pj4xNiYyNTU7b1tsKzJdPXU+PjgmMjU1O29bbCszXT0yNTUmdX1mdW5jdGlvbiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZCh0KXt2YXIgcj10Lmxlbmd0aCxhPU1hdGguY2VpbChyLzY1NTM1KSxvPW5ldyBVaW50OEFycmF5KDIrcis1KmErNCksaT0wO29baSsrXT0xMjA7b1tpKytdPTE1Njtmb3IodmFyIGw9MDtyPjY1NTM1Oyl7b1tpKytdPTA7b1tpKytdPTI1NTtvW2krK109MjU1O29baSsrXT0wO29baSsrXT0wO28uc2V0KHQuc3ViYXJyYXkobCxsKzY1NTM1KSxpKTtpKz02NTUzNTtsKz02NTUzNTtyLT02NTUzNX1vW2krK109MTtvW2krK109MjU1JnI7b1tpKytdPXI+PjgmMjU1O29baSsrXT0yNTUmfnI7b1tpKytdPSg2NTUzNSZ+cik+PjgmMjU1O28uc2V0KHQuc3ViYXJyYXkobCksaSk7aSs9dC5sZW5ndGgtbDt2YXIgYz1mdW5jdGlvbiBhZGxlcjMyKHQscixhKXtmb3IodmFyIG89MSxpPTAsbD1yO2w8YTsrK2wpaT0oaSsobz0obysoMjU1JnRbbF0pKSU2NTUyMSkpJTY1NTIxO3JldHVybiBpPDwxNnxvfSh0LDAsdC5sZW5ndGgpO29baSsrXT1jPj4yNCYyNTU7b1tpKytdPWM+PjE2JjI1NTtvW2krK109Yz4+OCYyNTU7b1tpKytdPTI1NSZjO3JldHVybiBvfWZ1bmN0aW9uIGVuY29kZShyLGEsaSxjKXt2YXIgdSxkLGgscD1yLndpZHRoLG09ci5oZWlnaHQsdj1yLmRhdGE7c3dpdGNoKGEpe2Nhc2Ugby5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6ZD0wO3U9MTtoPXArNz4+MzticmVhaztjYXNlIG8uSW1hZ2VLaW5kLlJHQl8yNEJQUDpkPTI7dT04O2g9MypwO2JyZWFrO2Nhc2Ugby5JbWFnZUtpbmQuUkdCQV8zMkJQUDpkPTY7dT04O2g9NCpwO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpfWZvcih2YXIgZz1uZXcgVWludDhBcnJheSgoMStoKSptKSx5PTAsYj0wLF89MDtfPG07KytfKXtnW3krK109MDtnLnNldCh2LnN1YmFycmF5KGIsYitoKSx5KTtiKz1oO3krPWh9aWYoYT09PW8uSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQJiZjKXt5PTA7Zm9yKHZhciBTPTA7UzxtO1MrKyl7eSsrO2Zvcih2YXIgQz0wO0M8aDtDKyspZ1t5KytdXj0yNTV9fXZhciBBPW5ldyBVaW50OEFycmF5KFtwPj4yNCYyNTUscD4+MTYmMjU1LHA+PjgmMjU1LDI1NSZwLG0+PjI0JjI1NSxtPj4xNiYyNTUsbT4+OCYyNTUsMjU1Jm0sdSxkLDAsMCwwXSksUj1mdW5jdGlvbiBkZWZsYXRlU3luYyh0KXtpZighbC5pc05vZGVKUylyZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCk7dHJ5e3ZhciByO3I9cGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKT49OD90OkJ1ZmZlci5mcm9tKHQpO3ZhciBhPXJlcXVpcmUoInpsaWIiKS5kZWZsYXRlU3luYyhyLHtsZXZlbDo5fSk7cmV0dXJuIGEgaW5zdGFuY2VvZiBVaW50OEFycmF5P2E6bmV3IFVpbnQ4QXJyYXkoYSl9Y2F0Y2godCl7KDAsby53YXJuKSgiTm90IGNvbXByZXNzaW5nIFBORyBiZWNhdXNlIHpsaWIuZGVmbGF0ZVN5bmMgaXMgdW5hdmFpbGFibGU6ICIrdCl9cmV0dXJuIGRlZmxhdGVTeW5jVW5jb21wcmVzc2VkKHQpfShnKSxrPXQubGVuZ3RoKzM2K0EubGVuZ3RoK1IubGVuZ3RoLHc9bmV3IFVpbnQ4QXJyYXkoayksUD0wO3cuc2V0KHQsUCk7d3JpdGVQbmdDaHVuaygiSUhEUiIsQSx3LFArPXQubGVuZ3RoKTt3cml0ZVBuZ0NodW5rKCJJREFUQSIsUix3LFArPTEyK0EubGVuZ3RoKTtQKz0xMitSLmxlbmd0aDt3cml0ZVBuZ0NodW5rKCJJRU5EIixuZXcgVWludDhBcnJheSgwKSx3LFApO3JldHVybigwLG8uY3JlYXRlT2JqZWN0VVJMKSh3LCJpbWFnZS9wbmciLGkpfXJldHVybiBmdW5jdGlvbiBjb252ZXJ0SW1nRGF0YVRvUG5nKHQscixhKXtyZXR1cm4gZW5jb2RlKHQsdm9pZCAwPT09dC5raW5kP28uSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOnQua2luZCxyLGEpfX0oKSxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gU1ZHRXh0cmFTdGF0ZSgpe19jbGFzc0NhbGxDaGVjayh0aGlzLFNWR0V4dHJhU3RhdGUpO3RoaXMuZm9udFNpemVTY2FsZT0xO3RoaXMuZm9udFdlaWdodD1oLmZvbnRXZWlnaHQ7dGhpcy5mb250U2l6ZT0wO3RoaXMudGV4dE1hdHJpeD1vLklERU5USVRZX01BVFJJWDt0aGlzLmZvbnRNYXRyaXg9by5GT05UX0lERU5USVRZX01BVFJJWDt0aGlzLmxlYWRpbmc9MDt0aGlzLnRleHRSZW5kZXJpbmdNb2RlPW8uVGV4dFJlbmRlcmluZ01vZGUuRklMTDt0aGlzLnRleHRNYXRyaXhTY2FsZT0xO3RoaXMueD0wO3RoaXMueT0wO3RoaXMubGluZVg9MDt0aGlzLmxpbmVZPTA7dGhpcy5jaGFyU3BhY2luZz0wO3RoaXMud29yZFNwYWNpbmc9MDt0aGlzLnRleHRIU2NhbGU9MTt0aGlzLnRleHRSaXNlPTA7dGhpcy5maWxsQ29sb3I9aC5maWxsQ29sb3I7dGhpcy5zdHJva2VDb2xvcj0iIzAwMDAwMCI7dGhpcy5maWxsQWxwaGE9MTt0aGlzLnN0cm9rZUFscGhhPTE7dGhpcy5saW5lV2lkdGg9MTt0aGlzLmxpbmVKb2luPSIiO3RoaXMubGluZUNhcD0iIjt0aGlzLm1pdGVyTGltaXQ9MDt0aGlzLmRhc2hBcnJheT1bXTt0aGlzLmRhc2hQaGFzZT0wO3RoaXMuZGVwZW5kZW5jaWVzPVtdO3RoaXMuYWN0aXZlQ2xpcFVybD1udWxsO3RoaXMuY2xpcEdyb3VwPW51bGw7dGhpcy5tYXNrSWQ9IiJ9X2NyZWF0ZUNsYXNzKFNWR0V4dHJhU3RhdGUsW3trZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbiBjbG9uZSgpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpfX0se2tleToic2V0Q3VycmVudFBvaW50Iix2YWx1ZTpmdW5jdGlvbiBzZXRDdXJyZW50UG9pbnQodCxyKXt0aGlzLng9dDt0aGlzLnk9cn19XSk7cmV0dXJuIFNWR0V4dHJhU3RhdGV9KCkseT0wLGI9MCxfPTA7ci5TVkdHcmFwaGljcz1jPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gU1ZHR3JhcGhpY3ModCxyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO19jbGFzc0NhbGxDaGVjayh0aGlzLFNWR0dyYXBoaWNzKTt0aGlzLnN2Z0ZhY3Rvcnk9bmV3IGkuRE9NU1ZHRmFjdG9yeTt0aGlzLmN1cnJlbnQ9bmV3IGc7dGhpcy50cmFuc2Zvcm1NYXRyaXg9by5JREVOVElUWV9NQVRSSVg7dGhpcy50cmFuc2Zvcm1TdGFjaz1bXTt0aGlzLmV4dHJhU3RhY2s9W107dGhpcy5jb21tb25PYmpzPXQ7dGhpcy5vYmpzPXI7dGhpcy5wZW5kaW5nQ2xpcD1udWxsO3RoaXMucGVuZGluZ0VPRmlsbD0hMTt0aGlzLmVtYmVkRm9udHM9ITE7dGhpcy5lbWJlZGRlZEZvbnRzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5jc3NTdHlsZT1udWxsO3RoaXMuZm9yY2VEYXRhU2NoZW1hPSEhYTt0aGlzLl9vcGVyYXRvcklkTWFwcGluZz1bXTtmb3IodmFyIGwgaW4gby5PUFMpdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmdbby5PUFNbbF1dPWx9X2NyZWF0ZUNsYXNzKFNWR0dyYXBoaWNzLFt7a2V5OiJzYXZlIix2YWx1ZTpmdW5jdGlvbiBzYXZlKCl7dGhpcy50cmFuc2Zvcm1TdGFjay5wdXNoKHRoaXMudHJhbnNmb3JtTWF0cml4KTt2YXIgdD10aGlzLmN1cnJlbnQ7dGhpcy5leHRyYVN0YWNrLnB1c2godCk7dGhpcy5jdXJyZW50PXQuY2xvbmUoKX19LHtrZXk6InJlc3RvcmUiLHZhbHVlOmZ1bmN0aW9uIHJlc3RvcmUoKXt0aGlzLnRyYW5zZm9ybU1hdHJpeD10aGlzLnRyYW5zZm9ybVN0YWNrLnBvcCgpO3RoaXMuY3VycmVudD10aGlzLmV4dHJhU3RhY2sucG9wKCk7dGhpcy5wZW5kaW5nQ2xpcD1udWxsO3RoaXMudGdycD1udWxsfX0se2tleToiZ3JvdXAiLHZhbHVlOmZ1bmN0aW9uIGdyb3VwKHQpe3RoaXMuc2F2ZSgpO3RoaXMuZXhlY3V0ZU9wVHJlZSh0KTt0aGlzLnJlc3RvcmUoKX19LHtrZXk6ImxvYWREZXBlbmRlbmNpZXMiLHZhbHVlOmZ1bmN0aW9uIGxvYWREZXBlbmRlbmNpZXModCl7Zm9yKHZhciByPXRoaXMsYT10LmZuQXJyYXksaT10LmFyZ3NBcnJheSxsPTAsYz1hLmxlbmd0aDtsPGM7bCsrKWlmKGFbbF09PT1vLk9QUy5kZXBlbmRlbmN5KXt2YXIgdSxkPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGlbbF0pO3RyeXt2YXIgaD1mdW5jdGlvbiBfbG9vcCgpe3ZhciB0PXUudmFsdWUsYT10LnN0YXJ0c1dpdGgoImdfIik/ci5jb21tb25PYmpzOnIub2JqcyxvPW5ldyBQcm9taXNlKChmdW5jdGlvbihyKXthLmdldCh0LHIpfSkpO3IuY3VycmVudC5kZXBlbmRlbmNpZXMucHVzaChvKX07Zm9yKGQucygpOyEodT1kLm4oKSkuZG9uZTspaCgpfWNhdGNoKHQpe2QuZSh0KX1maW5hbGx5e2QuZigpfX1yZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcyl9fSx7a2V5OiJ0cmFuc2Zvcm0iLHZhbHVlOmZ1bmN0aW9uIHRyYW5zZm9ybSh0LHIsYSxpLGwsYyl7dmFyIHU9W3QscixhLGksbCxjXTt0aGlzLnRyYW5zZm9ybU1hdHJpeD1vLlV0aWwudHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4LHUpO3RoaXMudGdycD1udWxsfX0se2tleToiZ2V0U1ZHIix2YWx1ZTpmdW5jdGlvbiBnZXRTVkcodCxyKXt2YXIgYT10aGlzO3RoaXMudmlld3BvcnQ9cjt2YXIgaT10aGlzLl9pbml0aWFsaXplKHIpO3JldHVybiB0aGlzLmxvYWREZXBlbmRlbmNpZXModCkudGhlbigoZnVuY3Rpb24oKXthLnRyYW5zZm9ybU1hdHJpeD1vLklERU5USVRZX01BVFJJWDthLmV4ZWN1dGVPcFRyZWUoYS5jb252ZXJ0T3BMaXN0KHQpKTtyZXR1cm4gaX0pKX19LHtrZXk6ImNvbnZlcnRPcExpc3QiLHZhbHVlOmZ1bmN0aW9uIGNvbnZlcnRPcExpc3QodCl7Zm9yKHZhciByPXRoaXMuX29wZXJhdG9ySWRNYXBwaW5nLGE9dC5hcmdzQXJyYXksbz10LmZuQXJyYXksaT1bXSxsPTAsYz1vLmxlbmd0aDtsPGM7bCsrKXt2YXIgdT1vW2xdO2kucHVzaCh7Zm5JZDp1LGZuOnJbdV0sYXJnczphW2xdfSl9cmV0dXJuIGZ1bmN0aW9uIG9wTGlzdFRvVHJlZSh0KXt2YXIgcixhPVtdLG89W10saT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0KTt0cnl7Zm9yKGkucygpOyEocj1pLm4oKSkuZG9uZTspe3ZhciBsPXIudmFsdWU7aWYoInNhdmUiIT09bC5mbikicmVzdG9yZSI9PT1sLmZuP2E9by5wb3AoKTphLnB1c2gobCk7ZWxzZXthLnB1c2goe2ZuSWQ6OTIsZm46Imdyb3VwIixpdGVtczpbXX0pO28ucHVzaChhKTthPWFbYS5sZW5ndGgtMV0uaXRlbXN9fX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm4gYX0oaSl9fSx7a2V5OiJleGVjdXRlT3BUcmVlIix2YWx1ZTpmdW5jdGlvbiBleGVjdXRlT3BUcmVlKHQpe3ZhciByLGE9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCk7dHJ5e2ZvcihhLnMoKTshKHI9YS5uKCkpLmRvbmU7KXt2YXIgaT1yLnZhbHVlLGw9aS5mbixjPWkuZm5JZCx1PWkuYXJncztzd2l0Y2goMHxjKXtjYXNlIG8uT1BTLmJlZ2luVGV4dDp0aGlzLmJlZ2luVGV4dCgpO2JyZWFrO2Nhc2Ugby5PUFMuZGVwZW5kZW5jeTpicmVhaztjYXNlIG8uT1BTLnNldExlYWRpbmc6dGhpcy5zZXRMZWFkaW5nKHUpO2JyZWFrO2Nhc2Ugby5PUFMuc2V0TGVhZGluZ01vdmVUZXh0OnRoaXMuc2V0TGVhZGluZ01vdmVUZXh0KHVbMF0sdVsxXSk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRGb250OnRoaXMuc2V0Rm9udCh1KTticmVhaztjYXNlIG8uT1BTLnNob3dUZXh0OmNhc2Ugby5PUFMuc2hvd1NwYWNlZFRleHQ6dGhpcy5zaG93VGV4dCh1WzBdKTticmVhaztjYXNlIG8uT1BTLmVuZFRleHQ6dGhpcy5lbmRUZXh0KCk7YnJlYWs7Y2FzZSBvLk9QUy5tb3ZlVGV4dDp0aGlzLm1vdmVUZXh0KHVbMF0sdVsxXSk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRDaGFyU3BhY2luZzp0aGlzLnNldENoYXJTcGFjaW5nKHVbMF0pO2JyZWFrO2Nhc2Ugby5PUFMuc2V0V29yZFNwYWNpbmc6dGhpcy5zZXRXb3JkU3BhY2luZyh1WzBdKTticmVhaztjYXNlIG8uT1BTLnNldEhTY2FsZTp0aGlzLnNldEhTY2FsZSh1WzBdKTticmVhaztjYXNlIG8uT1BTLnNldFRleHRNYXRyaXg6dGhpcy5zZXRUZXh0TWF0cml4KHVbMF0sdVsxXSx1WzJdLHVbM10sdVs0XSx1WzVdKTticmVhaztjYXNlIG8uT1BTLnNldFRleHRSaXNlOnRoaXMuc2V0VGV4dFJpc2UodVswXSk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZTp0aGlzLnNldFRleHRSZW5kZXJpbmdNb2RlKHVbMF0pO2JyZWFrO2Nhc2Ugby5PUFMuc2V0TGluZVdpZHRoOnRoaXMuc2V0TGluZVdpZHRoKHVbMF0pO2JyZWFrO2Nhc2Ugby5PUFMuc2V0TGluZUpvaW46dGhpcy5zZXRMaW5lSm9pbih1WzBdKTticmVhaztjYXNlIG8uT1BTLnNldExpbmVDYXA6dGhpcy5zZXRMaW5lQ2FwKHVbMF0pO2JyZWFrO2Nhc2Ugby5PUFMuc2V0TWl0ZXJMaW1pdDp0aGlzLnNldE1pdGVyTGltaXQodVswXSk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRGaWxsUkdCQ29sb3I6dGhpcy5zZXRGaWxsUkdCQ29sb3IodVswXSx1WzFdLHVbMl0pO2JyZWFrO2Nhc2Ugby5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I6dGhpcy5zZXRTdHJva2VSR0JDb2xvcih1WzBdLHVbMV0sdVsyXSk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRTdHJva2VDb2xvck46dGhpcy5zZXRTdHJva2VDb2xvck4odSk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRGaWxsQ29sb3JOOnRoaXMuc2V0RmlsbENvbG9yTih1KTticmVhaztjYXNlIG8uT1BTLnNoYWRpbmdGaWxsOnRoaXMuc2hhZGluZ0ZpbGwodVswXSk7YnJlYWs7Y2FzZSBvLk9QUy5zZXREYXNoOnRoaXMuc2V0RGFzaCh1WzBdLHVbMV0pO2JyZWFrO2Nhc2Ugby5PUFMuc2V0UmVuZGVyaW5nSW50ZW50OnRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KHVbMF0pO2JyZWFrO2Nhc2Ugby5PUFMuc2V0RmxhdG5lc3M6dGhpcy5zZXRGbGF0bmVzcyh1WzBdKTticmVhaztjYXNlIG8uT1BTLnNldEdTdGF0ZTp0aGlzLnNldEdTdGF0ZSh1WzBdKTticmVhaztjYXNlIG8uT1BTLmZpbGw6dGhpcy5maWxsKCk7YnJlYWs7Y2FzZSBvLk9QUy5lb0ZpbGw6dGhpcy5lb0ZpbGwoKTticmVhaztjYXNlIG8uT1BTLnN0cm9rZTp0aGlzLnN0cm9rZSgpO2JyZWFrO2Nhc2Ugby5PUFMuZmlsbFN0cm9rZTp0aGlzLmZpbGxTdHJva2UoKTticmVhaztjYXNlIG8uT1BTLmVvRmlsbFN0cm9rZTp0aGlzLmVvRmlsbFN0cm9rZSgpO2JyZWFrO2Nhc2Ugby5PUFMuY2xpcDp0aGlzLmNsaXAoIm5vbnplcm8iKTticmVhaztjYXNlIG8uT1BTLmVvQ2xpcDp0aGlzLmNsaXAoImV2ZW5vZGQiKTticmVhaztjYXNlIG8uT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazp0aGlzLnBhaW50U29saWRDb2xvckltYWdlTWFzaygpO2JyZWFrO2Nhc2Ugby5PUFMucGFpbnRJbWFnZVhPYmplY3Q6dGhpcy5wYWludEltYWdlWE9iamVjdCh1WzBdKTticmVhaztjYXNlIG8uT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OnRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QodVswXSk7YnJlYWs7Y2FzZSBvLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q6dGhpcy5wYWludEltYWdlTWFza1hPYmplY3QodVswXSk7YnJlYWs7Y2FzZSBvLk9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW46dGhpcy5wYWludEZvcm1YT2JqZWN0QmVnaW4odVswXSx1WzFdKTticmVhaztjYXNlIG8uT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQ6dGhpcy5wYWludEZvcm1YT2JqZWN0RW5kKCk7YnJlYWs7Y2FzZSBvLk9QUy5jbG9zZVBhdGg6dGhpcy5jbG9zZVBhdGgoKTticmVhaztjYXNlIG8uT1BTLmNsb3NlU3Ryb2tlOnRoaXMuY2xvc2VTdHJva2UoKTticmVhaztjYXNlIG8uT1BTLmNsb3NlRmlsbFN0cm9rZTp0aGlzLmNsb3NlRmlsbFN0cm9rZSgpO2JyZWFrO2Nhc2Ugby5PUFMuY2xvc2VFT0ZpbGxTdHJva2U6dGhpcy5jbG9zZUVPRmlsbFN0cm9rZSgpO2JyZWFrO2Nhc2Ugby5PUFMubmV4dExpbmU6dGhpcy5uZXh0TGluZSgpO2JyZWFrO2Nhc2Ugby5PUFMudHJhbnNmb3JtOnRoaXMudHJhbnNmb3JtKHVbMF0sdVsxXSx1WzJdLHVbM10sdVs0XSx1WzVdKTticmVhaztjYXNlIG8uT1BTLmNvbnN0cnVjdFBhdGg6dGhpcy5jb25zdHJ1Y3RQYXRoKHVbMF0sdVsxXSk7YnJlYWs7Y2FzZSBvLk9QUy5lbmRQYXRoOnRoaXMuZW5kUGF0aCgpO2JyZWFrO2Nhc2UgOTI6dGhpcy5ncm91cChpLml0ZW1zKTticmVhaztkZWZhdWx0OigwLG8ud2FybikoIlVuaW1wbGVtZW50ZWQgb3BlcmF0b3IgIi5jb25jYXQobCkpfX19Y2F0Y2godCl7YS5lKHQpfWZpbmFsbHl7YS5mKCl9fX0se2tleToic2V0V29yZFNwYWNpbmciLHZhbHVlOmZ1bmN0aW9uIHNldFdvcmRTcGFjaW5nKHQpe3RoaXMuY3VycmVudC53b3JkU3BhY2luZz10fX0se2tleToic2V0Q2hhclNwYWNpbmciLHZhbHVlOmZ1bmN0aW9uIHNldENoYXJTcGFjaW5nKHQpe3RoaXMuY3VycmVudC5jaGFyU3BhY2luZz10fX0se2tleToibmV4dExpbmUiLHZhbHVlOmZ1bmN0aW9uIG5leHRMaW5lKCl7dGhpcy5tb3ZlVGV4dCgwLHRoaXMuY3VycmVudC5sZWFkaW5nKX19LHtrZXk6InNldFRleHRNYXRyaXgiLHZhbHVlOmZ1bmN0aW9uIHNldFRleHRNYXRyaXgodCxyLGEsbyxpLGwpe3ZhciBjPXRoaXMuY3VycmVudDtjLnRleHRNYXRyaXg9Yy5saW5lTWF0cml4PVt0LHIsYSxvLGksbF07Yy50ZXh0TWF0cml4U2NhbGU9TWF0aC5zcXJ0KHQqdCtyKnIpO2MueD1jLmxpbmVYPTA7Yy55PWMubGluZVk9MDtjLnhjb29yZHM9W107Yy55Y29vcmRzPVtdO2MudHNwYW49dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpO2MudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC1mYW1pbHkiLGMuZm9udEZhbWlseSk7Yy50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LXNpemUiLCIiLmNvbmNhdCh1KGMuZm9udFNpemUpLCJweCIpKTtjLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHUoLWMueSkpO2MudHh0RWxlbWVudD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRleHQiKTtjLnR4dEVsZW1lbnQuYXBwZW5kQ2hpbGQoYy50c3Bhbil9fSx7a2V5OiJiZWdpblRleHQiLHZhbHVlOmZ1bmN0aW9uIGJlZ2luVGV4dCgpe3ZhciB0PXRoaXMuY3VycmVudDt0Lng9dC5saW5lWD0wO3QueT10LmxpbmVZPTA7dC50ZXh0TWF0cml4PW8uSURFTlRJVFlfTUFUUklYO3QubGluZU1hdHJpeD1vLklERU5USVRZX01BVFJJWDt0LnRleHRNYXRyaXhTY2FsZT0xO3QudHNwYW49dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpO3QudHh0RWxlbWVudD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRleHQiKTt0LnR4dGdycD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTt0Lnhjb29yZHM9W107dC55Y29vcmRzPVtdfX0se2tleToibW92ZVRleHQiLHZhbHVlOmZ1bmN0aW9uIG1vdmVUZXh0KHQscil7dmFyIGE9dGhpcy5jdXJyZW50O2EueD1hLmxpbmVYKz10O2EueT1hLmxpbmVZKz1yO2EueGNvb3Jkcz1bXTthLnljb29yZHM9W107YS50c3Bhbj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7YS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LWZhbWlseSIsYS5mb250RmFtaWx5KTthLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZvbnQtc2l6ZSIsIiIuY29uY2F0KHUoYS5mb250U2l6ZSksInB4IikpO2EudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwieSIsdSgtYS55KSl9fSx7a2V5OiJzaG93VGV4dCIsdmFsdWU6ZnVuY3Rpb24gc2hvd1RleHQodCl7dmFyIHI9dGhpcy5jdXJyZW50LGE9ci5mb250LGk9ci5mb250U2l6ZTtpZigwIT09aSl7dmFyIGwsYz1yLmZvbnRTaXplU2NhbGUscD1yLmNoYXJTcGFjaW5nLG09ci53b3JkU3BhY2luZyx2PXIuZm9udERpcmVjdGlvbixnPXIudGV4dEhTY2FsZSp2LHk9YS52ZXJ0aWNhbCxiPXk/MTotMSxfPWEuZGVmYXVsdFZNZXRyaWNzLFM9aSpyLmZvbnRNYXRyaXhbMF0sQz0wLEE9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCk7dHJ5e2ZvcihBLnMoKTshKGw9QS5uKCkpLmRvbmU7KXt2YXIgUj1sLnZhbHVlO2lmKG51bGwhPT1SKWlmKCgwLG8uaXNOdW0pKFIpKUMrPWIqUippLzFlMztlbHNle3ZhciBrPShSLmlzU3BhY2U/bTowKStwLHc9Ui5mb250Q2hhcixQPXZvaWQgMCx4PXZvaWQgMCxUPVIud2lkdGg7aWYoeSl7dmFyIEU9dm9pZCAwLE89Ui52bWV0cmljfHxfO0U9LShFPVIudm1ldHJpYz9PWzFdOi41KlQpKlM7dmFyIEk9T1syXSpTO1Q9Tz8tT1swXTpUO1A9RS9jO3g9KEMrSSkvY31lbHNle1A9Qy9jO3g9MH1pZihSLmlzSW5Gb250fHxhLm1pc3NpbmdGaWxlKXtyLnhjb29yZHMucHVzaChyLngrUCk7eSYmci55Y29vcmRzLnB1c2goLXIueSt4KTtyLnRzcGFuLnRleHRDb250ZW50Kz13fUMrPXk/VCpTLWsqdjpUKlMrayp2fWVsc2UgQys9diptfX1jYXRjaCh0KXtBLmUodCl9ZmluYWxseXtBLmYoKX1yLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLHIueGNvb3Jkcy5tYXAodSkuam9pbigiICIpKTt5P3IudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwieSIsci55Y29vcmRzLm1hcCh1KS5qb2luKCIgIikpOnIudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwieSIsdSgtci55KSk7eT9yLnktPUM6ci54Kz1DKmc7ci50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LWZhbWlseSIsci5mb250RmFtaWx5KTtyLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZvbnQtc2l6ZSIsIiIuY29uY2F0KHUoci5mb250U2l6ZSksInB4IikpO3IuZm9udFN0eWxlIT09aC5mb250U3R5bGUmJnIudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC1zdHlsZSIsci5mb250U3R5bGUpO3IuZm9udFdlaWdodCE9PWguZm9udFdlaWdodCYmci50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LXdlaWdodCIsci5mb250V2VpZ2h0KTt2YXIgRD1yLnRleHRSZW5kZXJpbmdNb2RlJm8uVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztpZihEPT09by5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMfHxEPT09by5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSl7ci5maWxsQ29sb3IhPT1oLmZpbGxDb2xvciYmci50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIixyLmZpbGxDb2xvcik7ci5maWxsQWxwaGE8MSYmci50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsLW9wYWNpdHkiLHIuZmlsbEFscGhhKX1lbHNlIHIudGV4dFJlbmRlcmluZ01vZGU9PT1vLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIP3IudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsInRyYW5zcGFyZW50Iik6ci50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIiwibm9uZSIpO2lmKEQ9PT1vLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRXx8RD09PW8uVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0Upe3ZhciBMPTEvKHIudGV4dE1hdHJpeFNjYWxlfHwxKTt0aGlzLl9zZXRTdHJva2VBdHRyaWJ1dGVzKHIudHNwYW4sTCl9dmFyIE09ci50ZXh0TWF0cml4OzAhPT1yLnRleHRSaXNlJiYoKE09TS5zbGljZSgpKVs1XSs9ci50ZXh0UmlzZSk7ci50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsInRyYW5zZm9ybSIsIiIuY29uY2F0KGQoTSksIiBzY2FsZSgiKS5jb25jYXQodShnKSwiLCAtMSkiKSk7ci50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpO3IudHh0RWxlbWVudC5hcHBlbmRDaGlsZChyLnRzcGFuKTtyLnR4dGdycC5hcHBlbmRDaGlsZChyLnR4dEVsZW1lbnQpO3RoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoci50eHRFbGVtZW50KX19fSx7a2V5OiJzZXRMZWFkaW5nTW92ZVRleHQiLHZhbHVlOmZ1bmN0aW9uIHNldExlYWRpbmdNb3ZlVGV4dCh0LHIpe3RoaXMuc2V0TGVhZGluZygtcik7dGhpcy5tb3ZlVGV4dCh0LHIpfX0se2tleToiYWRkRm9udFN0eWxlIix2YWx1ZTpmdW5jdGlvbiBhZGRGb250U3R5bGUodCl7aWYoIXQuZGF0YSl0aHJvdyBuZXcgRXJyb3IoJ2FkZEZvbnRTdHlsZTogTm8gZm9udCBkYXRhIGF2YWlsYWJsZSwgZW5zdXJlIHRoYXQgdGhlICJmb250RXh0cmFQcm9wZXJ0aWVzIiBBUEkgcGFyYW1ldGVyIGlzIHNldC4nKTtpZighdGhpcy5jc3NTdHlsZSl7dGhpcy5jc3NTdHlsZT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnN0eWxlIik7dGhpcy5jc3NTdHlsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0eXBlIiwidGV4dC9jc3MiKTt0aGlzLmRlZnMuYXBwZW5kQ2hpbGQodGhpcy5jc3NTdHlsZSl9dmFyIHI9KDAsby5jcmVhdGVPYmplY3RVUkwpKHQuZGF0YSx0Lm1pbWV0eXBlLHRoaXMuZm9yY2VEYXRhU2NoZW1hKTt0aGlzLmNzc1N0eWxlLnRleHRDb250ZW50Kz0nQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAiJy5jb25jYXQodC5sb2FkZWROYW1lLCciOycpKyIgc3JjOiB1cmwoIi5jb25jYXQociwiKTsgfVxuIil9fSx7a2V5OiJzZXRGb250Iix2YWx1ZTpmdW5jdGlvbiBzZXRGb250KHQpe3ZhciByPXRoaXMuY3VycmVudCxhPXRoaXMuY29tbW9uT2Jqcy5nZXQodFswXSksaT10WzFdO3IuZm9udD1hO2lmKHRoaXMuZW1iZWRGb250cyYmIWEubWlzc2luZ0ZpbGUmJiF0aGlzLmVtYmVkZGVkRm9udHNbYS5sb2FkZWROYW1lXSl7dGhpcy5hZGRGb250U3R5bGUoYSk7dGhpcy5lbWJlZGRlZEZvbnRzW2EubG9hZGVkTmFtZV09YX1yLmZvbnRNYXRyaXg9YS5mb250TWF0cml4P2EuZm9udE1hdHJpeDpvLkZPTlRfSURFTlRJVFlfTUFUUklYO3ZhciBsPSJub3JtYWwiO2EuYmxhY2s/bD0iOTAwIjphLmJvbGQmJihsPSJib2xkIik7dmFyIGM9YS5pdGFsaWM/Iml0YWxpYyI6Im5vcm1hbCI7aWYoaTwwKXtpPS1pO3IuZm9udERpcmVjdGlvbj0tMX1lbHNlIHIuZm9udERpcmVjdGlvbj0xO3IuZm9udFNpemU9aTtyLmZvbnRGYW1pbHk9YS5sb2FkZWROYW1lO3IuZm9udFdlaWdodD1sO3IuZm9udFN0eWxlPWM7ci50c3Bhbj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7ci50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5Iix1KC1yLnkpKTtyLnhjb29yZHM9W107ci55Y29vcmRzPVtdfX0se2tleToiZW5kVGV4dCIsdmFsdWU6ZnVuY3Rpb24gZW5kVGV4dCgpe3ZhciB0PXRoaXMuY3VycmVudDtpZih0LnRleHRSZW5kZXJpbmdNb2RlJm8uVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBRyYmdC50eHRFbGVtZW50JiZ0LnR4dEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKXt0LmVsZW1lbnQ9dC50eHRFbGVtZW50O3RoaXMuY2xpcCgibm9uemVybyIpO3RoaXMuZW5kUGF0aCgpfX19LHtrZXk6InNldExpbmVXaWR0aCIsdmFsdWU6ZnVuY3Rpb24gc2V0TGluZVdpZHRoKHQpe3Q+MCYmKHRoaXMuY3VycmVudC5saW5lV2lkdGg9dCl9fSx7a2V5OiJzZXRMaW5lQ2FwIix2YWx1ZTpmdW5jdGlvbiBzZXRMaW5lQ2FwKHQpe3RoaXMuY3VycmVudC5saW5lQ2FwPXBbdF19fSx7a2V5OiJzZXRMaW5lSm9pbiIsdmFsdWU6ZnVuY3Rpb24gc2V0TGluZUpvaW4odCl7dGhpcy5jdXJyZW50LmxpbmVKb2luPW1bdF19fSx7a2V5OiJzZXRNaXRlckxpbWl0Iix2YWx1ZTpmdW5jdGlvbiBzZXRNaXRlckxpbWl0KHQpe3RoaXMuY3VycmVudC5taXRlckxpbWl0PXR9fSx7a2V5OiJzZXRTdHJva2VBbHBoYSIsdmFsdWU6ZnVuY3Rpb24gc2V0U3Ryb2tlQWxwaGEodCl7dGhpcy5jdXJyZW50LnN0cm9rZUFscGhhPXR9fSx7a2V5OiJzZXRTdHJva2VSR0JDb2xvciIsdmFsdWU6ZnVuY3Rpb24gc2V0U3Ryb2tlUkdCQ29sb3IodCxyLGEpe3RoaXMuY3VycmVudC5zdHJva2VDb2xvcj1vLlV0aWwubWFrZUNzc1JnYih0LHIsYSl9fSx7a2V5OiJzZXRGaWxsQWxwaGEiLHZhbHVlOmZ1bmN0aW9uIHNldEZpbGxBbHBoYSh0KXt0aGlzLmN1cnJlbnQuZmlsbEFscGhhPXR9fSx7a2V5OiJzZXRGaWxsUkdCQ29sb3IiLHZhbHVlOmZ1bmN0aW9uIHNldEZpbGxSR0JDb2xvcih0LHIsYSl7dGhpcy5jdXJyZW50LmZpbGxDb2xvcj1vLlV0aWwubWFrZUNzc1JnYih0LHIsYSk7dGhpcy5jdXJyZW50LnRzcGFuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTt0aGlzLmN1cnJlbnQueGNvb3Jkcz1bXTt0aGlzLmN1cnJlbnQueWNvb3Jkcz1bXX19LHtrZXk6InNldFN0cm9rZUNvbG9yTiIsdmFsdWU6ZnVuY3Rpb24gc2V0U3Ryb2tlQ29sb3JOKHQpe3RoaXMuY3VycmVudC5zdHJva2VDb2xvcj10aGlzLl9tYWtlQ29sb3JOX1BhdHRlcm4odCl9fSx7a2V5OiJzZXRGaWxsQ29sb3JOIix2YWx1ZTpmdW5jdGlvbiBzZXRGaWxsQ29sb3JOKHQpe3RoaXMuY3VycmVudC5maWxsQ29sb3I9dGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKHQpfX0se2tleToic2hhZGluZ0ZpbGwiLHZhbHVlOmZ1bmN0aW9uIHNoYWRpbmdGaWxsKHQpe3ZhciByPXRoaXMudmlld3BvcnQud2lkdGgsYT10aGlzLnZpZXdwb3J0LmhlaWdodCxpPW8uVXRpbC5pbnZlcnNlVHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4KSxsPW8uVXRpbC5hcHBseVRyYW5zZm9ybShbMCwwXSxpKSxjPW8uVXRpbC5hcHBseVRyYW5zZm9ybShbMCxhXSxpKSx1PW8uVXRpbC5hcHBseVRyYW5zZm9ybShbciwwXSxpKSxkPW8uVXRpbC5hcHBseVRyYW5zZm9ybShbcixhXSxpKSxoPU1hdGgubWluKGxbMF0sY1swXSx1WzBdLGRbMF0pLHA9TWF0aC5taW4obFsxXSxjWzFdLHVbMV0sZFsxXSksbT1NYXRoLm1heChsWzBdLGNbMF0sdVswXSxkWzBdKSx2PU1hdGgubWF4KGxbMV0sY1sxXSx1WzFdLGRbMV0pLGc9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4IixoKTtnLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHApO2cuc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLG0taCk7Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLHYtcCk7Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIix0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4odCkpO3RoaXMuY3VycmVudC5maWxsQWxwaGE8MSYmZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsLW9wYWNpdHkiLHRoaXMuY3VycmVudC5maWxsQWxwaGEpO3RoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoZyl9fSx7a2V5OiJfbWFrZUNvbG9yTl9QYXR0ZXJuIix2YWx1ZTpmdW5jdGlvbiBfbWFrZUNvbG9yTl9QYXR0ZXJuKHQpe3JldHVybiJUaWxpbmdQYXR0ZXJuIj09PXRbMF0/dGhpcy5fbWFrZVRpbGluZ1BhdHRlcm4odCk6dGhpcy5fbWFrZVNoYWRpbmdQYXR0ZXJuKHQpfX0se2tleToiX21ha2VUaWxpbmdQYXR0ZXJuIix2YWx1ZTpmdW5jdGlvbiBfbWFrZVRpbGluZ1BhdHRlcm4odCl7dmFyIHI9dFsxXSxhPXRbMl0saT10WzNdfHxvLklERU5USVRZX01BVFJJWCxsPV9zbGljZWRUb0FycmF5KHRbNF0sNCksYz1sWzBdLHU9bFsxXSxkPWxbMl0saD1sWzNdLHA9dFs1XSxtPXRbNl0sdj10WzddLGc9InNoYWRpbmciLmNvbmNhdChfKyspLHk9X3NsaWNlZFRvQXJyYXkoby5VdGlsLmFwcGx5VHJhbnNmb3JtKFtjLHVdLGkpLDIpLGI9eVswXSxTPXlbMV0sQz1fc2xpY2VkVG9BcnJheShvLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW2QsaF0saSksMiksQT1DWzBdLFI9Q1sxXSxrPV9zbGljZWRUb0FycmF5KG8uVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShpKSwyKSx3PXAqa1swXSxQPW0qa1sxXSx4PXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cGF0dGVybiIpO3guc2V0QXR0cmlidXRlTlMobnVsbCwiaWQiLGcpO3guc2V0QXR0cmlidXRlTlMobnVsbCwicGF0dGVyblVuaXRzIiwidXNlclNwYWNlT25Vc2UiKTt4LnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIix3KTt4LnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsUCk7eC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4IiwiIi5jb25jYXQoYikpO3guc2V0QXR0cmlidXRlTlMobnVsbCwieSIsIiIuY29uY2F0KFMpKTt2YXIgVD10aGlzLnN2ZyxFPXRoaXMudHJhbnNmb3JtTWF0cml4LE89dGhpcy5jdXJyZW50LmZpbGxDb2xvcixJPXRoaXMuY3VycmVudC5zdHJva2VDb2xvcixEPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoQS1iLFItUyk7dGhpcy5zdmc9RDt0aGlzLnRyYW5zZm9ybU1hdHJpeD1pO2lmKDI9PT12KXt2YXIgTD1vLlV0aWwubWFrZUNzc1JnYi5hcHBseShvLlV0aWwsX3RvQ29uc3VtYWJsZUFycmF5KHIpKTt0aGlzLmN1cnJlbnQuZmlsbENvbG9yPUw7dGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yPUx9dGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdChhKSk7dGhpcy5zdmc9VDt0aGlzLnRyYW5zZm9ybU1hdHJpeD1FO3RoaXMuY3VycmVudC5maWxsQ29sb3I9Tzt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9STt4LmFwcGVuZENoaWxkKEQuY2hpbGROb2Rlc1swXSk7dGhpcy5kZWZzLmFwcGVuZENoaWxkKHgpO3JldHVybiJ1cmwoIyIuY29uY2F0KGcsIikiKX19LHtrZXk6Il9tYWtlU2hhZGluZ1BhdHRlcm4iLHZhbHVlOmZ1bmN0aW9uIF9tYWtlU2hhZGluZ1BhdHRlcm4odCl7c3dpdGNoKHRbMF0pe2Nhc2UiUmFkaWFsQXhpYWwiOnZhciByLGE9InNoYWRpbmciLmNvbmNhdChfKyspLGk9dFszXTtzd2l0Y2godFsxXSl7Y2FzZSJheGlhbCI6dmFyIGw9dFs0XSxjPXRbNV07KHI9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpsaW5lYXJHcmFkaWVudCIpKS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJpZCIsYSk7ci5zZXRBdHRyaWJ1dGVOUyhudWxsLCJncmFkaWVudFVuaXRzIiwidXNlclNwYWNlT25Vc2UiKTtyLnNldEF0dHJpYnV0ZU5TKG51bGwsIngxIixsWzBdKTtyLnNldEF0dHJpYnV0ZU5TKG51bGwsInkxIixsWzFdKTtyLnNldEF0dHJpYnV0ZU5TKG51bGwsIngyIixjWzBdKTtyLnNldEF0dHJpYnV0ZU5TKG51bGwsInkyIixjWzFdKTticmVhaztjYXNlInJhZGlhbCI6dmFyIHU9dFs0XSxkPXRbNV0saD10WzZdLHA9dFs3XTsocj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJhZGlhbEdyYWRpZW50IikpLnNldEF0dHJpYnV0ZU5TKG51bGwsImlkIixhKTtyLnNldEF0dHJpYnV0ZU5TKG51bGwsImdyYWRpZW50VW5pdHMiLCJ1c2VyU3BhY2VPblVzZSIpO3Iuc2V0QXR0cmlidXRlTlMobnVsbCwiY3giLGRbMF0pO3Iuc2V0QXR0cmlidXRlTlMobnVsbCwiY3kiLGRbMV0pO3Iuc2V0QXR0cmlidXRlTlMobnVsbCwiciIscCk7ci5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmeCIsdVswXSk7ci5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmeSIsdVsxXSk7ci5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmciIsaCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gUmFkaWFsQXhpYWwgdHlwZTogIi5jb25jYXQodFsxXSkpfXZhciBtLHY9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaSk7dHJ5e2Zvcih2LnMoKTshKG09di5uKCkpLmRvbmU7KXt2YXIgZz1tLnZhbHVlLHk9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpzdG9wIik7eS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJvZmZzZXQiLGdbMF0pO3kuc2V0QXR0cmlidXRlTlMobnVsbCwic3RvcC1jb2xvciIsZ1sxXSk7ci5hcHBlbmRDaGlsZCh5KX19Y2F0Y2godCl7di5lKHQpfWZpbmFsbHl7di5mKCl9dGhpcy5kZWZzLmFwcGVuZENoaWxkKHIpO3JldHVybiJ1cmwoIyIuY29uY2F0KGEsIikiKTtjYXNlIk1lc2giOigwLG8ud2FybikoIlVuaW1wbGVtZW50ZWQgcGF0dGVybiBNZXNoIik7cmV0dXJuIG51bGw7Y2FzZSJEdW1teSI6cmV0dXJuImhvdHBpbmsiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIElSIHR5cGU6ICIuY29uY2F0KHRbMF0pKX19fSx7a2V5OiJzZXREYXNoIix2YWx1ZTpmdW5jdGlvbiBzZXREYXNoKHQscil7dGhpcy5jdXJyZW50LmRhc2hBcnJheT10O3RoaXMuY3VycmVudC5kYXNoUGhhc2U9cn19LHtrZXk6ImNvbnN0cnVjdFBhdGgiLHZhbHVlOmZ1bmN0aW9uIGNvbnN0cnVjdFBhdGgodCxyKXt2YXIgYSxpPXRoaXMuY3VycmVudCxsPWkueCxjPWkueSxkPVtdLGg9MCxwPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQpO3RyeXtmb3IocC5zKCk7IShhPXAubigpKS5kb25lOyl7c3dpdGNoKDB8YS52YWx1ZSl7Y2FzZSBvLk9QUy5yZWN0YW5nbGU6bD1yW2grK107Yz1yW2grK107dmFyIG09cltoKytdLHY9cltoKytdLGc9bCttLHk9Yyt2O2QucHVzaCgiTSIsdShsKSx1KGMpLCJMIix1KGcpLHUoYyksIkwiLHUoZyksdSh5KSwiTCIsdShsKSx1KHkpLCJaIik7YnJlYWs7Y2FzZSBvLk9QUy5tb3ZlVG86bD1yW2grK107Yz1yW2grK107ZC5wdXNoKCJNIix1KGwpLHUoYykpO2JyZWFrO2Nhc2Ugby5PUFMubGluZVRvOmw9cltoKytdO2M9cltoKytdO2QucHVzaCgiTCIsdShsKSx1KGMpKTticmVhaztjYXNlIG8uT1BTLmN1cnZlVG86bD1yW2grNF07Yz1yW2grNV07ZC5wdXNoKCJDIix1KHJbaF0pLHUocltoKzFdKSx1KHJbaCsyXSksdShyW2grM10pLHUobCksdShjKSk7aCs9NjticmVhaztjYXNlIG8uT1BTLmN1cnZlVG8yOmQucHVzaCgiQyIsdShsKSx1KGMpLHUocltoXSksdShyW2grMV0pLHUocltoKzJdKSx1KHJbaCszXSkpO2w9cltoKzJdO2M9cltoKzNdO2grPTQ7YnJlYWs7Y2FzZSBvLk9QUy5jdXJ2ZVRvMzpsPXJbaCsyXTtjPXJbaCszXTtkLnB1c2goIkMiLHUocltoXSksdShyW2grMV0pLHUobCksdShjKSx1KGwpLHUoYykpO2grPTQ7YnJlYWs7Y2FzZSBvLk9QUy5jbG9zZVBhdGg6ZC5wdXNoKCJaIil9fX1jYXRjaCh0KXtwLmUodCl9ZmluYWxseXtwLmYoKX1kPWQuam9pbigiICIpO2lmKGkucGF0aCYmdC5sZW5ndGg+MCYmdFswXSE9PW8uT1BTLnJlY3RhbmdsZSYmdFswXSE9PW8uT1BTLm1vdmVUbylkPWkucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCJkIikrZDtlbHNle2kucGF0aD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnBhdGgiKTt0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKGkucGF0aCl9aS5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsImQiLGQpO2kucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIiwibm9uZSIpO2kuZWxlbWVudD1pLnBhdGg7aS5zZXRDdXJyZW50UG9pbnQobCxjKX19LHtrZXk6ImVuZFBhdGgiLHZhbHVlOmZ1bmN0aW9uIGVuZFBhdGgoKXt2YXIgdD10aGlzLmN1cnJlbnQ7dC5wYXRoPW51bGw7aWYodGhpcy5wZW5kaW5nQ2xpcClpZih0LmVsZW1lbnQpe3ZhciByPSJjbGlwcGF0aCIuY29uY2F0KHkrKyksYT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmNsaXBQYXRoIik7YS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJpZCIscik7YS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0cmFuc2Zvcm0iLGQodGhpcy50cmFuc2Zvcm1NYXRyaXgpKTt2YXIgbz10LmVsZW1lbnQuY2xvbmVOb2RlKCEwKTsiZXZlbm9kZCI9PT10aGlzLnBlbmRpbmdDbGlwP28uc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1ydWxlIiwiZXZlbm9kZCIpOm8uc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1ydWxlIiwibm9uemVybyIpO3RoaXMucGVuZGluZ0NsaXA9bnVsbDthLmFwcGVuZENoaWxkKG8pO3RoaXMuZGVmcy5hcHBlbmRDaGlsZChhKTtpZih0LmFjdGl2ZUNsaXBVcmwpe3QuY2xpcEdyb3VwPW51bGw7dGhpcy5leHRyYVN0YWNrLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xpcEdyb3VwPW51bGx9KSk7YS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGlwLXBhdGgiLHQuYWN0aXZlQ2xpcFVybCl9dC5hY3RpdmVDbGlwVXJsPSJ1cmwoIyIuY29uY2F0KHIsIikiKTt0aGlzLnRncnA9bnVsbH1lbHNlIHRoaXMucGVuZGluZ0NsaXA9bnVsbH19LHtrZXk6ImNsaXAiLHZhbHVlOmZ1bmN0aW9uIGNsaXAodCl7dGhpcy5wZW5kaW5nQ2xpcD10fX0se2tleToiY2xvc2VQYXRoIix2YWx1ZTpmdW5jdGlvbiBjbG9zZVBhdGgoKXt2YXIgdD10aGlzLmN1cnJlbnQ7aWYodC5wYXRoKXt2YXIgcj0iIi5jb25jYXQodC5wYXRoLmdldEF0dHJpYnV0ZU5TKG51bGwsImQiKSwiWiIpO3QucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJkIixyKX19fSx7a2V5OiJzZXRMZWFkaW5nIix2YWx1ZTpmdW5jdGlvbiBzZXRMZWFkaW5nKHQpe3RoaXMuY3VycmVudC5sZWFkaW5nPS10fX0se2tleToic2V0VGV4dFJpc2UiLHZhbHVlOmZ1bmN0aW9uIHNldFRleHRSaXNlKHQpe3RoaXMuY3VycmVudC50ZXh0UmlzZT10fX0se2tleToic2V0VGV4dFJlbmRlcmluZ01vZGUiLHZhbHVlOmZ1bmN0aW9uIHNldFRleHRSZW5kZXJpbmdNb2RlKHQpe3RoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZT10fX0se2tleToic2V0SFNjYWxlIix2YWx1ZTpmdW5jdGlvbiBzZXRIU2NhbGUodCl7dGhpcy5jdXJyZW50LnRleHRIU2NhbGU9dC8xMDB9fSx7a2V5OiJzZXRSZW5kZXJpbmdJbnRlbnQiLHZhbHVlOmZ1bmN0aW9uIHNldFJlbmRlcmluZ0ludGVudCh0KXt9fSx7a2V5OiJzZXRGbGF0bmVzcyIsdmFsdWU6ZnVuY3Rpb24gc2V0RmxhdG5lc3ModCl7fX0se2tleToic2V0R1N0YXRlIix2YWx1ZTpmdW5jdGlvbiBzZXRHU3RhdGUodCl7dmFyIHIsYT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0KTt0cnl7Zm9yKGEucygpOyEocj1hLm4oKSkuZG9uZTspe3ZhciBpPV9zbGljZWRUb0FycmF5KHIudmFsdWUsMiksbD1pWzBdLGM9aVsxXTtzd2l0Y2gobCl7Y2FzZSJMVyI6dGhpcy5zZXRMaW5lV2lkdGgoYyk7YnJlYWs7Y2FzZSJMQyI6dGhpcy5zZXRMaW5lQ2FwKGMpO2JyZWFrO2Nhc2UiTEoiOnRoaXMuc2V0TGluZUpvaW4oYyk7YnJlYWs7Y2FzZSJNTCI6dGhpcy5zZXRNaXRlckxpbWl0KGMpO2JyZWFrO2Nhc2UiRCI6dGhpcy5zZXREYXNoKGNbMF0sY1sxXSk7YnJlYWs7Y2FzZSJSSSI6dGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQoYyk7YnJlYWs7Y2FzZSJGTCI6dGhpcy5zZXRGbGF0bmVzcyhjKTticmVhaztjYXNlIkZvbnQiOnRoaXMuc2V0Rm9udChjKTticmVhaztjYXNlIkNBIjp0aGlzLnNldFN0cm9rZUFscGhhKGMpO2JyZWFrO2Nhc2UiY2EiOnRoaXMuc2V0RmlsbEFscGhhKGMpO2JyZWFrO2RlZmF1bHQ6KDAsby53YXJuKSgiVW5pbXBsZW1lbnRlZCBncmFwaGljIHN0YXRlIG9wZXJhdG9yICIuY29uY2F0KGwpKX19fWNhdGNoKHQpe2EuZSh0KX1maW5hbGx5e2EuZigpfX19LHtrZXk6ImZpbGwiLHZhbHVlOmZ1bmN0aW9uIGZpbGwoKXt2YXIgdD10aGlzLmN1cnJlbnQ7aWYodC5lbGVtZW50KXt0LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsdC5maWxsQ29sb3IpO3QuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsLW9wYWNpdHkiLHQuZmlsbEFscGhhKTt0aGlzLmVuZFBhdGgoKX19fSx7a2V5OiJzdHJva2UiLHZhbHVlOmZ1bmN0aW9uIHN0cm9rZSgpe3ZhciB0PXRoaXMuY3VycmVudDtpZih0LmVsZW1lbnQpe3RoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXModC5lbGVtZW50KTt0LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsIm5vbmUiKTt0aGlzLmVuZFBhdGgoKX19fSx7a2V5OiJfc2V0U3Ryb2tlQXR0cmlidXRlcyIsdmFsdWU6ZnVuY3Rpb24gX3NldFN0cm9rZUF0dHJpYnV0ZXModCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjEsYT10aGlzLmN1cnJlbnQsbz1hLmRhc2hBcnJheTsxIT09ciYmby5sZW5ndGg+MCYmKG89by5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiByKnR9KSkpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlIixhLnN0cm9rZUNvbG9yKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZS1vcGFjaXR5IixhLnN0cm9rZUFscGhhKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZS1taXRlcmxpbWl0Iix1KGEubWl0ZXJMaW1pdCkpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLWxpbmVjYXAiLGEubGluZUNhcCk7dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHJva2UtbGluZWpvaW4iLGEubGluZUpvaW4pO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLXdpZHRoIix1KHIqYS5saW5lV2lkdGgpKyJweCIpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLWRhc2hhcnJheSIsby5tYXAodSkuam9pbigiICIpKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZS1kYXNob2Zmc2V0Iix1KHIqYS5kYXNoUGhhc2UpKyJweCIpfX0se2tleToiZW9GaWxsIix2YWx1ZTpmdW5jdGlvbiBlb0ZpbGwoKXt0aGlzLmN1cnJlbnQuZWxlbWVudCYmdGhpcy5jdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbC1ydWxlIiwiZXZlbm9kZCIpO3RoaXMuZmlsbCgpfX0se2tleToiZmlsbFN0cm9rZSIsdmFsdWU6ZnVuY3Rpb24gZmlsbFN0cm9rZSgpe3RoaXMuc3Ryb2tlKCk7dGhpcy5maWxsKCl9fSx7a2V5OiJlb0ZpbGxTdHJva2UiLHZhbHVlOmZ1bmN0aW9uIGVvRmlsbFN0cm9rZSgpe3RoaXMuY3VycmVudC5lbGVtZW50JiZ0aGlzLmN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsLXJ1bGUiLCJldmVub2RkIik7dGhpcy5maWxsU3Ryb2tlKCl9fSx7a2V5OiJjbG9zZVN0cm9rZSIsdmFsdWU6ZnVuY3Rpb24gY2xvc2VTdHJva2UoKXt0aGlzLmNsb3NlUGF0aCgpO3RoaXMuc3Ryb2tlKCl9fSx7a2V5OiJjbG9zZUZpbGxTdHJva2UiLHZhbHVlOmZ1bmN0aW9uIGNsb3NlRmlsbFN0cm9rZSgpe3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5maWxsU3Ryb2tlKCl9fSx7a2V5OiJjbG9zZUVPRmlsbFN0cm9rZSIsdmFsdWU6ZnVuY3Rpb24gY2xvc2VFT0ZpbGxTdHJva2UoKXt0aGlzLmNsb3NlUGF0aCgpO3RoaXMuZW9GaWxsU3Ryb2tlKCl9fSx7a2V5OiJwYWludFNvbGlkQ29sb3JJbWFnZU1hc2siLHZhbHVlOmZ1bmN0aW9uIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpe3ZhciB0PXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwieCIsIjAiKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLCIwIik7dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIsIjFweCIpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0IiwiMXB4Iik7dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIix0aGlzLmN1cnJlbnQuZmlsbENvbG9yKTt0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKHQpfX0se2tleToicGFpbnRJbWFnZVhPYmplY3QiLHZhbHVlOmZ1bmN0aW9uIHBhaW50SW1hZ2VYT2JqZWN0KHQpe3ZhciByPXQuc3RhcnRzV2l0aCgiZ18iKT90aGlzLmNvbW1vbk9ianMuZ2V0KHQpOnRoaXMub2Jqcy5nZXQodCk7cj90aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KHIpOigwLG8ud2FybikoIkRlcGVuZGVudCBpbWFnZSB3aXRoIG9iamVjdCBJRCAiLmNvbmNhdCh0LCIgaXMgbm90IHJlYWR5IHlldCIpKX19LHtrZXk6InBhaW50SW5saW5lSW1hZ2VYT2JqZWN0Iix2YWx1ZTpmdW5jdGlvbiBwYWludElubGluZUltYWdlWE9iamVjdCh0LHIpe3ZhciBhPXQud2lkdGgsbz10LmhlaWdodCxpPXYodCx0aGlzLmZvcmNlRGF0YVNjaGVtYSwhIXIpLGw9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7bC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4IiwiMCIpO2wuc2V0QXR0cmlidXRlTlMobnVsbCwieSIsIjAiKTtsLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIix1KGEpKTtsLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsdShvKSk7dGhpcy5jdXJyZW50LmVsZW1lbnQ9bDt0aGlzLmNsaXAoIm5vbnplcm8iKTt2YXIgYz10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmltYWdlIik7Yy5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsInhsaW5rOmhyZWYiLGkpO2Muc2V0QXR0cmlidXRlTlMobnVsbCwieCIsIjAiKTtjLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHUoLW8pKTtjLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIix1KGEpKyJweCIpO2Muc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0Iix1KG8pKyJweCIpO2Muc2V0QXR0cmlidXRlTlMobnVsbCwidHJhbnNmb3JtIiwic2NhbGUoIi5jb25jYXQodSgxL2EpLCIgIikuY29uY2F0KHUoLTEvbyksIikiKSk7cj9yLmFwcGVuZENoaWxkKGMpOnRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoYyl9fSx7a2V5OiJwYWludEltYWdlTWFza1hPYmplY3QiLHZhbHVlOmZ1bmN0aW9uIHBhaW50SW1hZ2VNYXNrWE9iamVjdCh0KXt2YXIgcj10aGlzLmN1cnJlbnQsYT10LndpZHRoLG89dC5oZWlnaHQsaT1yLmZpbGxDb2xvcjtyLm1hc2tJZD0ibWFzayIuY29uY2F0KGIrKyk7dmFyIGw9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzptYXNrIik7bC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJpZCIsci5tYXNrSWQpO3ZhciBjPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpO2Muc2V0QXR0cmlidXRlTlMobnVsbCwieCIsIjAiKTtjLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLCIwIik7Yy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIsdShhKSk7Yy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLHUobykpO2Muc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsaSk7Yy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJtYXNrIiwidXJsKCMiLmNvbmNhdChyLm1hc2tJZCwiKSIpKTt0aGlzLmRlZnMuYXBwZW5kQ2hpbGQobCk7dGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChjKTt0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KHQsbCl9fSx7a2V5OiJwYWludEZvcm1YT2JqZWN0QmVnaW4iLHZhbHVlOmZ1bmN0aW9uIHBhaW50Rm9ybVhPYmplY3RCZWdpbih0LHIpe0FycmF5LmlzQXJyYXkodCkmJjY9PT10Lmxlbmd0aCYmdGhpcy50cmFuc2Zvcm0odFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0pO2lmKHIpe3ZhciBhPXJbMl0tclswXSxvPXJbM10tclsxXSxpPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpO2kuc2V0QXR0cmlidXRlTlMobnVsbCwieCIsclswXSk7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixyWzFdKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIix1KGEpKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsdShvKSk7dGhpcy5jdXJyZW50LmVsZW1lbnQ9aTt0aGlzLmNsaXAoIm5vbnplcm8iKTt0aGlzLmVuZFBhdGgoKX19fSx7a2V5OiJwYWludEZvcm1YT2JqZWN0RW5kIix2YWx1ZTpmdW5jdGlvbiBwYWludEZvcm1YT2JqZWN0RW5kKCl7fX0se2tleToiX2luaXRpYWxpemUiLHZhbHVlOmZ1bmN0aW9uIF9pbml0aWFsaXplKHQpe3ZhciByPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodC53aWR0aCx0LmhlaWdodCksYT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmRlZnMiKTtyLmFwcGVuZENoaWxkKGEpO3RoaXMuZGVmcz1hO3ZhciBvPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZyIpO28uc2V0QXR0cmlidXRlTlMobnVsbCwidHJhbnNmb3JtIixkKHQudHJhbnNmb3JtKSk7ci5hcHBlbmRDaGlsZChvKTt0aGlzLnN2Zz1vO3JldHVybiByfX0se2tleToiX2Vuc3VyZUNsaXBHcm91cCIsdmFsdWU6ZnVuY3Rpb24gX2Vuc3VyZUNsaXBHcm91cCgpe2lmKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKXt2YXIgdD10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsImNsaXAtcGF0aCIsdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpO3RoaXMuc3ZnLmFwcGVuZENoaWxkKHQpO3RoaXMuY3VycmVudC5jbGlwR3JvdXA9dH1yZXR1cm4gdGhpcy5jdXJyZW50LmNsaXBHcm91cH19LHtrZXk6Il9lbnN1cmVUcmFuc2Zvcm1Hcm91cCIsdmFsdWU6ZnVuY3Rpb24gX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCl7aWYoIXRoaXMudGdycCl7dGhpcy50Z3JwPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZyIpO3RoaXMudGdycC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0cmFuc2Zvcm0iLGQodGhpcy50cmFuc2Zvcm1NYXRyaXgpKTt0aGlzLmN1cnJlbnQuYWN0aXZlQ2xpcFVybD90aGlzLl9lbnN1cmVDbGlwR3JvdXAoKS5hcHBlbmRDaGlsZCh0aGlzLnRncnApOnRoaXMuc3ZnLmFwcGVuZENoaWxkKHRoaXMudGdycCl9cmV0dXJuIHRoaXMudGdycH19XSk7cmV0dXJuIFNWR0dyYXBoaWNzfSgpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBERk5vZGVTdHJlYW09dm9pZCAwO3ZhciBvPWZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShhKDIpKSxpPWEoNSksbD1hKDIyMCk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxvPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgaT1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChvLGFyZ3VtZW50cyxpKX1lbHNlIGE9by5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxyLGEsbyxpLGwsYyl7dHJ5e3ZhciB1PXRbbF0oYyksZD11LnZhbHVlfWNhdGNoKHQpe2EodCk7cmV0dXJufXUuZG9uZT9yKGQpOlByb21pc2UucmVzb2x2ZShkKS50aGVuKG8saSl9ZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8saSl7dmFyIGw9dC5hcHBseShyLGEpO2Z1bmN0aW9uIF9uZXh0KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChsLG8saSxfbmV4dCxfdGhyb3csIm5leHQiLHQpfWZ1bmN0aW9uIF90aHJvdyh0KXthc3luY0dlbmVyYXRvclN0ZXAobCxvLGksX25leHQsX3Rocm93LCJ0aHJvdyIsdCl9X25leHQodm9pZCAwKX0pKX19ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIG89clthXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMTtvLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9dmFyIGM9cmVxdWlyZSgiZnMiKSx1PXJlcXVpcmUoImh0dHAiKSxkPXJlcXVpcmUoImh0dHBzIiksaD1yZXF1aXJlKCJ1cmwiKSxwPS9eZmlsZTpcL1wvXC9bYS16QS1aXTpcLy87dmFyIG09ZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZOb2RlU3RyZWFtKHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLFBERk5vZGVTdHJlYW0pO3RoaXMuc291cmNlPXQ7dGhpcy51cmw9ZnVuY3Rpb24gcGFyc2VVcmwodCl7dmFyIHI9aC5wYXJzZSh0KTtpZigiZmlsZToiPT09ci5wcm90b2NvbHx8ci5ob3N0KXJldHVybiByO2lmKC9eW2Etel06Wy9cXF0vaS50ZXN0KHQpKXJldHVybiBoLnBhcnNlKCJmaWxlOi8vLyIuY29uY2F0KHQpKTtyLmhvc3R8fChyLnByb3RvY29sPSJmaWxlOiIpO3JldHVybiByfSh0LnVybCk7dGhpcy5pc0h0dHA9Imh0dHA6Ij09PXRoaXMudXJsLnByb3RvY29sfHwiaHR0cHM6Ij09PXRoaXMudXJsLnByb3RvY29sO3RoaXMuaXNGc1VybD0iZmlsZToiPT09dGhpcy51cmwucHJvdG9jb2w7dGhpcy5odHRwSGVhZGVycz10aGlzLmlzSHR0cCYmdC5odHRwSGVhZGVyc3x8e307dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbDt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzPVtdfV9jcmVhdGVDbGFzcyhQREZOb2RlU3RyZWFtLFt7a2V5OiJnZXRGdWxsUmVhZGVyIix2YWx1ZTpmdW5jdGlvbiBnZXRGdWxsUmVhZGVyKCl7KDAsaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGTm9kZVN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpO3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPXRoaXMuaXNGc1VybD9uZXcgXyh0aGlzKTpuZXcgeSh0aGlzKTtyZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXJ9fSx7a2V5OiJnZXRSYW5nZVJlYWRlciIsdmFsdWU6ZnVuY3Rpb24gZ2V0UmFuZ2VSZWFkZXIodCxyKXtpZihyPD10aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpcmV0dXJuIG51bGw7dmFyIGE9dGhpcy5pc0ZzVXJsP25ldyBTKHRoaXMsdCxyKTpuZXcgYih0aGlzLHQscik7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKGEpO3JldHVybiBhfX0se2tleToiY2FuY2VsQWxsUmVxdWVzdHMiLHZhbHVlOmZ1bmN0aW9uIGNhbmNlbEFsbFJlcXVlc3RzKHQpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyJiZ0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwodCk7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKS5mb3JFYWNoKChmdW5jdGlvbihyKXtyLmNhbmNlbCh0KX0pKX19LHtrZXk6Il9wcm9ncmVzc2l2ZURhdGFMZW5ndGgiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2xvYWRlZDowfX1dKTtyZXR1cm4gUERGTm9kZVN0cmVhbX0oKTtyLlBERk5vZGVTdHJlYW09bTt2YXIgdj1mdW5jdGlvbigpe2Z1bmN0aW9uIEJhc2VGdWxsUmVhZGVyKHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLEJhc2VGdWxsUmVhZGVyKTt0aGlzLl91cmw9dC51cmw7dGhpcy5fZG9uZT0hMTt0aGlzLl9zdG9yZWRFcnJvcj1udWxsO3RoaXMub25Qcm9ncmVzcz1udWxsO3ZhciByPXQuc291cmNlO3RoaXMuX2NvbnRlbnRMZW5ndGg9ci5sZW5ndGg7dGhpcy5fbG9hZGVkPTA7dGhpcy5fZmlsZW5hbWU9bnVsbDt0aGlzLl9kaXNhYmxlUmFuZ2U9ci5kaXNhYmxlUmFuZ2V8fCExO3RoaXMuX3JhbmdlQ2h1bmtTaXplPXIucmFuZ2VDaHVua1NpemU7dGhpcy5fcmFuZ2VDaHVua1NpemV8fHRoaXMuX2Rpc2FibGVSYW5nZXx8KHRoaXMuX2Rpc2FibGVSYW5nZT0hMCk7dGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9IXIuZGlzYWJsZVN0cmVhbTt0aGlzLl9pc1JhbmdlU3VwcG9ydGVkPSFyLmRpc2FibGVSYW5nZTt0aGlzLl9yZWFkYWJsZVN0cmVhbT1udWxsO3RoaXMuX3JlYWRDYXBhYmlsaXR5PSgwLGkuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5faGVhZGVyc0NhcGFiaWxpdHk9KDAsaS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKX1fY3JlYXRlQ2xhc3MoQmFzZUZ1bGxSZWFkZXIsW3trZXk6InJlYWQiLHZhbHVlOih0PV9hc3luY1RvR2VuZXJhdG9yKG8uZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlKCl7dmFyIHQscjtyZXR1cm4gby5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUkKGEpe2Zvcig7Oylzd2l0Y2goYS5wcmV2PWEubmV4dCl7Y2FzZSAwOmEubmV4dD0yO3JldHVybiB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO2Nhc2UgMjppZighdGhpcy5fZG9uZSl7YS5uZXh0PTQ7YnJlYWt9cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pO2Nhc2UgNDppZighdGhpcy5fc3RvcmVkRXJyb3Ipe2EubmV4dD02O2JyZWFrfXRocm93IHRoaXMuX3N0b3JlZEVycm9yO2Nhc2UgNjppZihudWxsIT09KHQ9dGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpKSl7YS5uZXh0PTEwO2JyZWFrfXRoaXMuX3JlYWRDYXBhYmlsaXR5PSgwLGkuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHRoaXMucmVhZCgpKTtjYXNlIDEwOnRoaXMuX2xvYWRlZCs9dC5sZW5ndGg7dGhpcy5vblByb2dyZXNzJiZ0aGlzLm9uUHJvZ3Jlc3Moe2xvYWRlZDp0aGlzLl9sb2FkZWQsdG90YWw6dGhpcy5fY29udGVudExlbmd0aH0pO3I9bmV3IFVpbnQ4QXJyYXkodCkuYnVmZmVyO3JldHVybiBhLmFicnVwdCgicmV0dXJuIix7dmFsdWU6cixkb25lOiExfSk7Y2FzZSAxNDpjYXNlImVuZCI6cmV0dXJuIGEuc3RvcCgpfX0pLF9jYWxsZWUsdGhpcyl9KSkpLGZ1bmN0aW9uIHJlYWQoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiY2FuY2VsIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWwodCl7dGhpcy5fcmVhZGFibGVTdHJlYW0/dGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0KTp0aGlzLl9lcnJvcih0KX19LHtrZXk6Il9lcnJvciIsdmFsdWU6ZnVuY3Rpb24gX2Vycm9yKHQpe3RoaXMuX3N0b3JlZEVycm9yPXQ7dGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpfX0se2tleToiX3NldFJlYWRhYmxlU3RyZWFtIix2YWx1ZTpmdW5jdGlvbiBfc2V0UmVhZGFibGVTdHJlYW0odCl7dmFyIHI9dGhpczt0aGlzLl9yZWFkYWJsZVN0cmVhbT10O3Qub24oInJlYWRhYmxlIiwoZnVuY3Rpb24oKXtyLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCl9KSk7dC5vbigiZW5kIiwoZnVuY3Rpb24oKXt0LmRlc3Ryb3koKTtyLl9kb25lPSEwO3IuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKX0pKTt0Lm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe3IuX2Vycm9yKHQpfSkpOyF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCYmdGhpcy5faXNSYW5nZVN1cHBvcnRlZCYmdGhpcy5fZXJyb3IobmV3IGkuQWJvcnRFeGNlcHRpb24oInN0cmVhbWluZyBpcyBkaXNhYmxlZCIpKTt0aGlzLl9zdG9yZWRFcnJvciYmdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcil9fSx7a2V5OiJoZWFkZXJzUmVhZHkiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZX19LHtrZXk6ImZpbGVuYW1lIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2ZpbGVuYW1lfX0se2tleToiY29udGVudExlbmd0aCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofX0se2tleToiaXNSYW5nZVN1cHBvcnRlZCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkfX0se2tleToiaXNTdHJlYW1pbmdTdXBwb3J0ZWQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9fV0pO3ZhciB0O3JldHVybiBCYXNlRnVsbFJlYWRlcn0oKSxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQmFzZVJhbmdlUmVhZGVyKHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLEJhc2VSYW5nZVJlYWRlcik7dGhpcy5fdXJsPXQudXJsO3RoaXMuX2RvbmU9ITE7dGhpcy5fc3RvcmVkRXJyb3I9bnVsbDt0aGlzLm9uUHJvZ3Jlc3M9bnVsbDt0aGlzLl9sb2FkZWQ9MDt0aGlzLl9yZWFkYWJsZVN0cmVhbT1udWxsO3RoaXMuX3JlYWRDYXBhYmlsaXR5PSgwLGkuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dmFyIHI9dC5zb3VyY2U7dGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9IXIuZGlzYWJsZVN0cmVhbX1fY3JlYXRlQ2xhc3MoQmFzZVJhbmdlUmVhZGVyLFt7a2V5OiJyZWFkIix2YWx1ZToodD1fYXN5bmNUb0dlbmVyYXRvcihvLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZTIoKXt2YXIgdCxyO3JldHVybiBvLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZTIkKGEpe2Zvcig7Oylzd2l0Y2goYS5wcmV2PWEubmV4dCl7Y2FzZSAwOmEubmV4dD0yO3JldHVybiB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO2Nhc2UgMjppZighdGhpcy5fZG9uZSl7YS5uZXh0PTQ7YnJlYWt9cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pO2Nhc2UgNDppZighdGhpcy5fc3RvcmVkRXJyb3Ipe2EubmV4dD02O2JyZWFrfXRocm93IHRoaXMuX3N0b3JlZEVycm9yO2Nhc2UgNjppZihudWxsIT09KHQ9dGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpKSl7YS5uZXh0PTEwO2JyZWFrfXRoaXMuX3JlYWRDYXBhYmlsaXR5PSgwLGkuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHRoaXMucmVhZCgpKTtjYXNlIDEwOnRoaXMuX2xvYWRlZCs9dC5sZW5ndGg7dGhpcy5vblByb2dyZXNzJiZ0aGlzLm9uUHJvZ3Jlc3Moe2xvYWRlZDp0aGlzLl9sb2FkZWR9KTtyPW5ldyBVaW50OEFycmF5KHQpLmJ1ZmZlcjtyZXR1cm4gYS5hYnJ1cHQoInJldHVybiIse3ZhbHVlOnIsZG9uZTohMX0pO2Nhc2UgMTQ6Y2FzZSJlbmQiOnJldHVybiBhLnN0b3AoKX19KSxfY2FsbGVlMix0aGlzKX0pKSksZnVuY3Rpb24gcmVhZCgpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJjYW5jZWwiLHZhbHVlOmZ1bmN0aW9uIGNhbmNlbCh0KXt0aGlzLl9yZWFkYWJsZVN0cmVhbT90aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHQpOnRoaXMuX2Vycm9yKHQpfX0se2tleToiX2Vycm9yIix2YWx1ZTpmdW5jdGlvbiBfZXJyb3IodCl7dGhpcy5fc3RvcmVkRXJyb3I9dDt0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCl9fSx7a2V5OiJfc2V0UmVhZGFibGVTdHJlYW0iLHZhbHVlOmZ1bmN0aW9uIF9zZXRSZWFkYWJsZVN0cmVhbSh0KXt2YXIgcj10aGlzO3RoaXMuX3JlYWRhYmxlU3RyZWFtPXQ7dC5vbigicmVhZGFibGUiLChmdW5jdGlvbigpe3IuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKX0pKTt0Lm9uKCJlbmQiLChmdW5jdGlvbigpe3QuZGVzdHJveSgpO3IuX2RvbmU9ITA7ci5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpfSkpO3Qub24oImVycm9yIiwoZnVuY3Rpb24odCl7ci5fZXJyb3IodCl9KSk7dGhpcy5fc3RvcmVkRXJyb3ImJnRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpfX0se2tleToiaXNTdHJlYW1pbmdTdXBwb3J0ZWQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9fV0pO3ZhciB0O3JldHVybiBCYXNlUmFuZ2VSZWFkZXJ9KCk7ZnVuY3Rpb24gY3JlYXRlUmVxdWVzdE9wdGlvbnModCxyKXtyZXR1cm57cHJvdG9jb2w6dC5wcm90b2NvbCxhdXRoOnQuYXV0aCxob3N0OnQuaG9zdG5hbWUscG9ydDp0LnBvcnQscGF0aDp0LnBhdGgsbWV0aG9kOiJHRVQiLGhlYWRlcnM6cn19dmFyIHk9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyLHQpO3ZhciByPV9jcmVhdGVTdXBlcihQREZOb2RlU3RyZWFtRnVsbFJlYWRlcik7ZnVuY3Rpb24gUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIpO3ZhciBvPWZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlKHIpe2lmKDQwNCE9PXIuc3RhdHVzQ29kZSl7YS5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO2EuX3NldFJlYWRhYmxlU3RyZWFtKHIpO3ZhciBvPWZ1bmN0aW9uIGdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBhLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW3QudG9Mb3dlckNhc2UoKV19LGM9KDAsbC52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe2dldFJlc3BvbnNlSGVhZGVyOm8saXNIdHRwOnQuaXNIdHRwLHJhbmdlQ2h1bmtTaXplOmEuX3JhbmdlQ2h1bmtTaXplLGRpc2FibGVSYW5nZTphLl9kaXNhYmxlUmFuZ2V9KSx1PWMuYWxsb3dSYW5nZVJlcXVlc3RzLGQ9Yy5zdWdnZXN0ZWRMZW5ndGg7YS5faXNSYW5nZVN1cHBvcnRlZD11O2EuX2NvbnRlbnRMZW5ndGg9ZHx8YS5fY29udGVudExlbmd0aDthLl9maWxlbmFtZT0oMCxsLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKG8pfWVsc2V7dmFyIGg9bmV3IGkuTWlzc2luZ1BERkV4Y2VwdGlvbignTWlzc2luZyBQREYgIicuY29uY2F0KGEuX3VybCwnIi4nKSk7YS5fc3RvcmVkRXJyb3I9aDthLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QoaCl9fTsoYT1yLmNhbGwodGhpcyx0KSkuX3JlcXVlc3Q9bnVsbDsiaHR0cDoiPT09YS5fdXJsLnByb3RvY29sP2EuX3JlcXVlc3Q9dS5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKGEuX3VybCx0Lmh0dHBIZWFkZXJzKSxvKTphLl9yZXF1ZXN0PWQucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyhhLl91cmwsdC5odHRwSGVhZGVycyksbyk7YS5fcmVxdWVzdC5vbigiZXJyb3IiLChmdW5jdGlvbih0KXthLl9zdG9yZWRFcnJvcj10O2EuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCh0KX0pKTthLl9yZXF1ZXN0LmVuZCgpO3JldHVybiBhfXJldHVybiBQREZOb2RlU3RyZWFtRnVsbFJlYWRlcn0odiksYj1mdW5jdGlvbih0KXtfaW5oZXJpdHMoUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyLHQpO3ZhciByPV9jcmVhdGVTdXBlcihQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIpO2Z1bmN0aW9uIFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlcih0LGEsbyl7dmFyIGw7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKTsobD1yLmNhbGwodGhpcyx0KSkuX2h0dHBIZWFkZXJzPXt9O2Zvcih2YXIgYyBpbiB0Lmh0dHBIZWFkZXJzKXt2YXIgaD10Lmh0dHBIZWFkZXJzW2NdO3ZvaWQgMCE9PWgmJihsLl9odHRwSGVhZGVyc1tjXT1oKX1sLl9odHRwSGVhZGVycy5SYW5nZT0iYnl0ZXM9Ii5jb25jYXQoYSwiLSIpLmNvbmNhdChvLTEpO3ZhciBwPWZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlKHQpe2lmKDQwNCE9PXQuc3RhdHVzQ29kZSlsLl9zZXRSZWFkYWJsZVN0cmVhbSh0KTtlbHNle3ZhciByPW5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGICInLmNvbmNhdChsLl91cmwsJyIuJykpO2wuX3N0b3JlZEVycm9yPXJ9fTtsLl9yZXF1ZXN0PW51bGw7Imh0dHA6Ij09PWwuX3VybC5wcm90b2NvbD9sLl9yZXF1ZXN0PXUucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyhsLl91cmwsbC5faHR0cEhlYWRlcnMpLHApOmwuX3JlcXVlc3Q9ZC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKGwuX3VybCxsLl9odHRwSGVhZGVycykscCk7bC5fcmVxdWVzdC5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtsLl9zdG9yZWRFcnJvcj10fSkpO2wuX3JlcXVlc3QuZW5kKCk7cmV0dXJuIGx9cmV0dXJuIFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlcn0oZyksXz1mdW5jdGlvbih0KXtfaW5oZXJpdHMoUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcik7ZnVuY3Rpb24gUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyKTthPXIuY2FsbCh0aGlzLHQpO3ZhciBvPWRlY29kZVVSSUNvbXBvbmVudChhLl91cmwucGF0aCk7cC50ZXN0KGEuX3VybC5ocmVmKSYmKG89by5yZXBsYWNlKC9eXC8vLCIiKSk7Yy5sc3RhdChvLChmdW5jdGlvbih0LHIpe2lmKHQpeyJFTk9FTlQiPT09dC5jb2RlJiYodD1uZXcgaS5NaXNzaW5nUERGRXhjZXB0aW9uKCdNaXNzaW5nIFBERiAiJy5jb25jYXQobywnIi4nKSkpO2EuX3N0b3JlZEVycm9yPXQ7YS5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHQpfWVsc2V7YS5fY29udGVudExlbmd0aD1yLnNpemU7YS5fc2V0UmVhZGFibGVTdHJlYW0oYy5jcmVhdGVSZWFkU3RyZWFtKG8pKTthLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCl9fSkpO3JldHVybiBhfXJldHVybiBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyfSh2KSxTPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIpO2Z1bmN0aW9uIFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyKHQsYSxvKXt2YXIgaTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcik7aT1yLmNhbGwodGhpcyx0KTt2YXIgbD1kZWNvZGVVUklDb21wb25lbnQoaS5fdXJsLnBhdGgpO3AudGVzdChpLl91cmwuaHJlZikmJihsPWwucmVwbGFjZSgvXlwvLywiIikpO2kuX3NldFJlYWRhYmxlU3RyZWFtKGMuY3JlYXRlUmVhZFN0cmVhbShsLHtzdGFydDphLGVuZDpvLTF9KSk7cmV0dXJuIGl9cmV0dXJuIFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyfShnKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yPWZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IodCxyKXtpZig0MDQ9PT10fHwwPT09dCYmci5zdGFydHNXaXRoKCJmaWxlOiIpKXJldHVybiBuZXcgby5NaXNzaW5nUERGRXhjZXB0aW9uKCdNaXNzaW5nIFBERiAiJytyKyciLicpO3JldHVybiBuZXcgby5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlICgiK3QrJykgd2hpbGUgcmV0cmlldmluZyBQREYgIicrcisnIi4nLHQpfTtyLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXI9ZnVuY3Rpb24gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcih0KXt2YXIgcj10KCJDb250ZW50LURpc3Bvc2l0aW9uIik7aWYocil7dmFyIGE9KDAsaS5nZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIpKHIpO2lmKGEuaW5jbHVkZXMoIiUiKSl0cnl7YT1kZWNvZGVVUklDb21wb25lbnQoYSl9Y2F0Y2godCl7fWlmKC9cLnBkZiQvaS50ZXN0KGEpKXJldHVybiBhfXJldHVybiBudWxsfTtyLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzPWZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHQpe3ZhciByPXQuZ2V0UmVzcG9uc2VIZWFkZXIsYT10LmlzSHR0cCxpPXQucmFuZ2VDaHVua1NpemUsbD10LmRpc2FibGVSYW5nZTsoMCxvLmFzc2VydCkoaT4wLCJSYW5nZSBjaHVuayBzaXplIG11c3QgYmUgbGFyZ2VyIHRoYW4gemVybyIpO3ZhciBjPXthbGxvd1JhbmdlUmVxdWVzdHM6ITEsc3VnZ2VzdGVkTGVuZ3RoOnZvaWQgMH0sdT1wYXJzZUludChyKCJDb250ZW50LUxlbmd0aCIpLDEwKTtpZighTnVtYmVyLmlzSW50ZWdlcih1KSlyZXR1cm4gYztjLnN1Z2dlc3RlZExlbmd0aD11O2lmKHU8PTIqaSlyZXR1cm4gYztpZihsfHwhYSlyZXR1cm4gYztpZigiYnl0ZXMiIT09cigiQWNjZXB0LVJhbmdlcyIpKXJldHVybiBjO2lmKCJpZGVudGl0eSIhPT0ocigiQ29udGVudC1FbmNvZGluZyIpfHwiaWRlbnRpdHkiKSlyZXR1cm4gYztjLmFsbG93UmFuZ2VSZXF1ZXN0cz0hMDtyZXR1cm4gY307ci52YWxpZGF0ZVJlc3BvbnNlU3RhdHVzPWZ1bmN0aW9uIHZhbGlkYXRlUmVzcG9uc2VTdGF0dXModCl7cmV0dXJuIDIwMD09PXR8fDIwNj09PXR9O3ZhciBvPWEoNSksaT1hKDIyMSl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyPWZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcih0KXt2YXIgcj0hMCxhPXRvUGFyYW1SZWdFeHAoImZpbGVuYW1lXFwqIiwiaSIpLmV4ZWModCk7aWYoYSl7dmFyIG89cmZjMjYxNnVucXVvdGUoYT1hWzFdKTtyZXR1cm4gZml4dXBFbmNvZGluZyhvPXJmYzIwNDdkZWNvZGUobz1yZmM1OTg3ZGVjb2RlKG89dW5lc2NhcGUobykpKSl9aWYoYT1mdW5jdGlvbiByZmMyMjMxZ2V0cGFyYW0odCl7dmFyIHIsYT1bXSxvPXRvUGFyYW1SZWdFeHAoImZpbGVuYW1lXFwqKCg/ITBcXGQpXFxkKykoXFwqPykiLCJpZyIpO2Zvcig7bnVsbCE9PShyPW8uZXhlYyh0KSk7KXt2YXIgaT1fc2xpY2VkVG9BcnJheShyLDQpLGw9aVsxXSxjPWlbMl0sdT1pWzNdO2lmKChsPXBhcnNlSW50KGwsMTApKWluIGEpe2lmKDA9PT1sKWJyZWFrfWVsc2UgYVtsXT1bYyx1XX1mb3IodmFyIGQ9W10saD0wO2g8YS5sZW5ndGgmJmggaW4gYTsrK2gpe3ZhciBwPV9zbGljZWRUb0FycmF5KGFbaF0sMiksbT1wWzBdLHY9cFsxXTt2PXJmYzI2MTZ1bnF1b3RlKHYpO2lmKG0pe3Y9dW5lc2NhcGUodik7MD09PWgmJih2PXJmYzU5ODdkZWNvZGUodikpfWQucHVzaCh2KX1yZXR1cm4gZC5qb2luKCIiKX0odCkpe3JldHVybiBmaXh1cEVuY29kaW5nKHJmYzIwNDdkZWNvZGUoYSkpfWlmKGE9dG9QYXJhbVJlZ0V4cCgiZmlsZW5hbWUiLCJpIikuZXhlYyh0KSl7dmFyIGk9cmZjMjYxNnVucXVvdGUoYT1hWzFdKTtyZXR1cm4gZml4dXBFbmNvZGluZyhpPXJmYzIwNDdkZWNvZGUoaSkpfWZ1bmN0aW9uIHRvUGFyYW1SZWdFeHAodCxyKXtyZXR1cm4gbmV3IFJlZ0V4cCgiKD86Xnw7KVxccyoiK3QrJ1xccyo9XFxzKihbXiI7XFxzXVteO1xcc10qfCIoPzpbXiJcXFxcXXxcXFxcIj8pKyI/KScscil9ZnVuY3Rpb24gdGV4dGRlY29kZSh0LGEpe2lmKHQpe2lmKCEvXltceDAwLVx4RkZdKyQvLnRlc3QoYSkpcmV0dXJuIGE7dHJ5e3ZhciBvPW5ldyBUZXh0RGVjb2Rlcih0LHtmYXRhbDohMH0pLGk9QXJyYXkuZnJvbShhLChmdW5jdGlvbih0KXtyZXR1cm4gMjU1JnQuY2hhckNvZGVBdCgwKX0pKTthPW8uZGVjb2RlKG5ldyBVaW50OEFycmF5KGkpKTtyPSExfWNhdGNoKG8pe2lmKC9edXRmLT84JC9pLnRlc3QodCkpdHJ5e2E9ZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShhKSk7cj0hMX1jYXRjaCh0KXt9fX1yZXR1cm4gYX1mdW5jdGlvbiBmaXh1cEVuY29kaW5nKHQpe2lmKHImJi9bXHg4MC1ceGZmXS8udGVzdCh0KSl7dD10ZXh0ZGVjb2RlKCJ1dGYtOCIsdCk7ciYmKHQ9dGV4dGRlY29kZSgiaXNvLTg4NTktMSIsdCkpfXJldHVybiB0fWZ1bmN0aW9uIHJmYzI2MTZ1bnF1b3RlKHQpe2lmKHQuc3RhcnRzV2l0aCgnIicpKXtmb3IodmFyIHI9dC5zbGljZSgxKS5zcGxpdCgnXFwiJyksYT0wO2E8ci5sZW5ndGg7KythKXt2YXIgbz1yW2FdLmluZGV4T2YoJyInKTtpZigtMSE9PW8pe3JbYV09clthXS5zbGljZSgwLG8pO3IubGVuZ3RoPWErMX1yW2FdPXJbYV0ucmVwbGFjZSgvXFwoLikvZywiJDEiKX10PXIuam9pbignIicpfXJldHVybiB0fWZ1bmN0aW9uIHJmYzU5ODdkZWNvZGUodCl7dmFyIHI9dC5pbmRleE9mKCInIik7cmV0dXJuLTE9PT1yP3Q6dGV4dGRlY29kZSh0LnNsaWNlKDAsciksdC5zbGljZShyKzEpLnJlcGxhY2UoL15bXiddKicvLCIiKSl9ZnVuY3Rpb24gcmZjMjA0N2RlY29kZSh0KXtyZXR1cm4hdC5zdGFydHNXaXRoKCI9PyIpfHwvW1x4MDAtXHgxOVx4ODAtXHhmZl0vLnRlc3QodCk/dDp0LnJlcGxhY2UoLz1cPyhbXHctXSopXD8oW1FxQmJdKVw/KCg/OlteP118XD8oPyE9KSkqKVw/PS9nLChmdW5jdGlvbih0LHIsYSxvKXtpZigicSI9PT1hfHwiUSI9PT1hKXJldHVybiB0ZXh0ZGVjb2RlKHIsbz0obz1vLnJlcGxhY2UoL18vZywiICIpKS5yZXBsYWNlKC89KFswLTlhLWZBLUZdezJ9KS9nLChmdW5jdGlvbih0LHIpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHIsMTYpKX0pKSk7dHJ5e289YXRvYihvKX1jYXRjaCh0KXt9cmV0dXJuIHRleHRkZWNvZGUocixvKX0pKX1yZXR1cm4iIn07ZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkodCxyKXtyZXR1cm4gZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9KHQpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQodCxyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIGE9W10sbz0hMCxpPSExLGw9dm9pZCAwO3RyeXtmb3IodmFyIGMsdT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKG89KGM9dS5uZXh0KCkpLmRvbmUpO289ITApe2EucHVzaChjLnZhbHVlKTtpZihyJiZhLmxlbmd0aD09PXIpYnJlYWt9fWNhdGNoKHQpe2k9ITA7bD10fWZpbmFsbHl7dHJ5e298fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYoaSl0aHJvdyBsfX1yZXR1cm4gYX0odCxyKXx8ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYoIXQpcmV0dXJuO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKTt2YXIgYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7Ik9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09YXx8IlNldCI9PT1hKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKCJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSkpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscil9KHQscil8fGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHQscil7KG51bGw9PXJ8fHI+dC5sZW5ndGgpJiYocj10Lmxlbmd0aCk7Zm9yKHZhciBhPTAsbz1uZXcgQXJyYXkocik7YTxyO2ErKylvW2FdPXRbYV07cmV0dXJuIG99fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBERk5ldHdvcmtTdHJlYW09dm9pZCAwO3ZhciBvPWZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShhKDIpKSxpPWEoNSksbD1hKDIyMCk7ZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKHQscixhLG8saSxsLGMpe3RyeXt2YXIgdT10W2xdKGMpLGQ9dS52YWx1ZX1jYXRjaCh0KXthKHQpO3JldHVybn11LmRvbmU/cihkKTpQcm9taXNlLnJlc29sdmUoZCkudGhlbihvLGkpfWZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsYT1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe3ZhciBsPXQuYXBwbHkocixhKTtmdW5jdGlvbiBfbmV4dCh0KXthc3luY0dlbmVyYXRvclN0ZXAobCxvLGksX25leHQsX3Rocm93LCJuZXh0Iix0KX1mdW5jdGlvbiBfdGhyb3codCl7YXN5bmNHZW5lcmF0b3JTdGVwKGwsbyxpLF9uZXh0LF90aHJvdywidGhyb3ciLHQpfV9uZXh0KHZvaWQgMCl9KSl9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBvPXJbYV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITE7by5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fXZhciBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTmV0d29ya01hbmFnZXIodCxyKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxOZXR3b3JrTWFuYWdlcik7dGhpcy51cmw9dDtyPXJ8fHt9O3RoaXMuaXNIdHRwPS9eaHR0cHM/Oi9pLnRlc3QodCk7dGhpcy5odHRwSGVhZGVycz10aGlzLmlzSHR0cCYmci5odHRwSGVhZGVyc3x8e307dGhpcy53aXRoQ3JlZGVudGlhbHM9ci53aXRoQ3JlZGVudGlhbHN8fCExO3RoaXMuZ2V0WGhyPXIuZ2V0WGhyfHxmdW5jdGlvbiBOZXR3b3JrTWFuYWdlcl9nZXRYaHIoKXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fTt0aGlzLmN1cnJYaHJJZD0wO3RoaXMucGVuZGluZ1JlcXVlc3RzPU9iamVjdC5jcmVhdGUobnVsbCl9X2NyZWF0ZUNsYXNzKE5ldHdvcmtNYW5hZ2VyLFt7a2V5OiJyZXF1ZXN0UmFuZ2UiLHZhbHVlOmZ1bmN0aW9uIHJlcXVlc3RSYW5nZSh0LHIsYSl7dmFyIG89e2JlZ2luOnQsZW5kOnJ9O2Zvcih2YXIgaSBpbiBhKW9baV09YVtpXTtyZXR1cm4gdGhpcy5yZXF1ZXN0KG8pfX0se2tleToicmVxdWVzdEZ1bGwiLHZhbHVlOmZ1bmN0aW9uIHJlcXVlc3RGdWxsKHQpe3JldHVybiB0aGlzLnJlcXVlc3QodCl9fSx7a2V5OiJyZXF1ZXN0Iix2YWx1ZTpmdW5jdGlvbiByZXF1ZXN0KHQpe3ZhciByPXRoaXMuZ2V0WGhyKCksYT10aGlzLmN1cnJYaHJJZCsrLG89dGhpcy5wZW5kaW5nUmVxdWVzdHNbYV09e3hocjpyfTtyLm9wZW4oIkdFVCIsdGhpcy51cmwpO3Iud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzO2Zvcih2YXIgaSBpbiB0aGlzLmh0dHBIZWFkZXJzKXt2YXIgbD10aGlzLmh0dHBIZWFkZXJzW2ldO3ZvaWQgMCE9PWwmJnIuc2V0UmVxdWVzdEhlYWRlcihpLGwpfWlmKHRoaXMuaXNIdHRwJiYiYmVnaW4iaW4gdCYmImVuZCJpbiB0KXtyLnNldFJlcXVlc3RIZWFkZXIoIlJhbmdlIiwiYnl0ZXM9Ii5jb25jYXQodC5iZWdpbiwiLSIpLmNvbmNhdCh0LmVuZC0xKSk7by5leHBlY3RlZFN0YXR1cz0yMDZ9ZWxzZSBvLmV4cGVjdGVkU3RhdHVzPTIwMDtyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO3Qub25FcnJvciYmKHIub25lcnJvcj1mdW5jdGlvbihhKXt0Lm9uRXJyb3Ioci5zdGF0dXMpfSk7ci5vbnJlYWR5c3RhdGVjaGFuZ2U9dGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcyxhKTtyLm9ucHJvZ3Jlc3M9dGhpcy5vblByb2dyZXNzLmJpbmQodGhpcyxhKTtvLm9uSGVhZGVyc1JlY2VpdmVkPXQub25IZWFkZXJzUmVjZWl2ZWQ7by5vbkRvbmU9dC5vbkRvbmU7by5vbkVycm9yPXQub25FcnJvcjtvLm9uUHJvZ3Jlc3M9dC5vblByb2dyZXNzO3Iuc2VuZChudWxsKTtyZXR1cm4gYX19LHtrZXk6Im9uUHJvZ3Jlc3MiLHZhbHVlOmZ1bmN0aW9uIG9uUHJvZ3Jlc3ModCxyKXt2YXIgYT10aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XTthJiZhLm9uUHJvZ3Jlc3MmJmEub25Qcm9ncmVzcyhyKX19LHtrZXk6Im9uU3RhdGVDaGFuZ2UiLHZhbHVlOmZ1bmN0aW9uIG9uU3RhdGVDaGFuZ2UodCxyKXt2YXIgYT10aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XTtpZihhKXt2YXIgbz1hLnhocjtpZihvLnJlYWR5U3RhdGU+PTImJmEub25IZWFkZXJzUmVjZWl2ZWQpe2Eub25IZWFkZXJzUmVjZWl2ZWQoKTtkZWxldGUgYS5vbkhlYWRlcnNSZWNlaXZlZH1pZig0PT09by5yZWFkeVN0YXRlJiZ0IGluIHRoaXMucGVuZGluZ1JlcXVlc3RzKXtkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbdF07aWYoMD09PW8uc3RhdHVzJiZ0aGlzLmlzSHR0cClhLm9uRXJyb3ImJmEub25FcnJvcihvLnN0YXR1cyk7ZWxzZXt2YXIgbD1vLnN0YXR1c3x8MjAwO2lmKDIwMD09PWwmJjIwNj09PWEuZXhwZWN0ZWRTdGF0dXN8fGw9PT1hLmV4cGVjdGVkU3RhdHVzKXt2YXIgYz1mdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih0KXt2YXIgcj10LnJlc3BvbnNlO3JldHVybiJzdHJpbmciIT10eXBlb2Ygcj9yOigwLGkuc3RyaW5nVG9CeXRlcykocikuYnVmZmVyfShvKTtpZigyMDY9PT1sKXt2YXIgdT1vLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVJhbmdlIiksZD0vYnl0ZXMgKFxkKyktKFxkKylcLyhcZCspLy5leGVjKHUpO2Eub25Eb25lKHtiZWdpbjpwYXJzZUludChkWzFdLDEwKSxjaHVuazpjfSl9ZWxzZSBjP2Eub25Eb25lKHtiZWdpbjowLGNodW5rOmN9KTphLm9uRXJyb3ImJmEub25FcnJvcihvLnN0YXR1cyl9ZWxzZSBhLm9uRXJyb3ImJmEub25FcnJvcihvLnN0YXR1cyl9fX19fSx7a2V5OiJnZXRSZXF1ZXN0WGhyIix2YWx1ZTpmdW5jdGlvbiBnZXRSZXF1ZXN0WGhyKHQpe3JldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XS54aHJ9fSx7a2V5OiJpc1BlbmRpbmdSZXF1ZXN0Iix2YWx1ZTpmdW5jdGlvbiBpc1BlbmRpbmdSZXF1ZXN0KHQpe3JldHVybiB0IGluIHRoaXMucGVuZGluZ1JlcXVlc3RzfX0se2tleToiYWJvcnRSZXF1ZXN0Iix2YWx1ZTpmdW5jdGlvbiBhYm9ydFJlcXVlc3QodCl7dmFyIHI9dGhpcy5wZW5kaW5nUmVxdWVzdHNbdF0ueGhyO2RlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XTtyLmFib3J0KCl9fV0pO3JldHVybiBOZXR3b3JrTWFuYWdlcn0oKSx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGTmV0d29ya1N0cmVhbSh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZOZXR3b3JrU3RyZWFtKTt0aGlzLl9zb3VyY2U9dDt0aGlzLl9tYW5hZ2VyPW5ldyBjKHQudXJsLHtodHRwSGVhZGVyczp0Lmh0dHBIZWFkZXJzLHdpdGhDcmVkZW50aWFsczp0LndpdGhDcmVkZW50aWFsc30pO3RoaXMuX3JhbmdlQ2h1bmtTaXplPXQucmFuZ2VDaHVua1NpemU7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbDt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzPVtdfV9jcmVhdGVDbGFzcyhQREZOZXR3b3JrU3RyZWFtLFt7a2V5OiJfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQiLHZhbHVlOmZ1bmN0aW9uIF9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZCh0KXt2YXIgcj10aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLmluZGV4T2YodCk7cj49MCYmdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zcGxpY2UociwxKX19LHtrZXk6ImdldEZ1bGxSZWFkZXIiLHZhbHVlOmZ1bmN0aW9uIGdldEZ1bGxSZWFkZXIoKXsoMCxpLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCJQREZOZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bmV3IGQodGhpcy5fbWFuYWdlcix0aGlzLl9zb3VyY2UpO3JldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcn19LHtrZXk6ImdldFJhbmdlUmVhZGVyIix2YWx1ZTpmdW5jdGlvbiBnZXRSYW5nZVJlYWRlcih0LHIpe3ZhciBhPW5ldyBoKHRoaXMuX21hbmFnZXIsdCxyKTthLm9uQ2xvc2VkPXRoaXMuX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkLmJpbmQodGhpcyk7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKGEpO3JldHVybiBhfX0se2tleToiY2FuY2VsQWxsUmVxdWVzdHMiLHZhbHVlOmZ1bmN0aW9uIGNhbmNlbEFsbFJlcXVlc3RzKHQpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyJiZ0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwodCk7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKS5mb3JFYWNoKChmdW5jdGlvbihyKXtyLmNhbmNlbCh0KX0pKX19XSk7cmV0dXJuIFBERk5ldHdvcmtTdHJlYW19KCk7ci5QREZOZXR3b3JrU3RyZWFtPXU7dmFyIGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodCxyKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIpO3RoaXMuX21hbmFnZXI9dDt2YXIgYT17b25IZWFkZXJzUmVjZWl2ZWQ6dGhpcy5fb25IZWFkZXJzUmVjZWl2ZWQuYmluZCh0aGlzKSxvbkRvbmU6dGhpcy5fb25Eb25lLmJpbmQodGhpcyksb25FcnJvcjp0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksb25Qcm9ncmVzczp0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcyl9O3RoaXMuX3VybD1yLnVybDt0aGlzLl9mdWxsUmVxdWVzdElkPXQucmVxdWVzdEZ1bGwoYSk7dGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eT0oMCxpLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMuX2Rpc2FibGVSYW5nZT1yLmRpc2FibGVSYW5nZXx8ITE7dGhpcy5fY29udGVudExlbmd0aD1yLmxlbmd0aDt0aGlzLl9yYW5nZUNodW5rU2l6ZT1yLnJhbmdlQ2h1bmtTaXplO3RoaXMuX3JhbmdlQ2h1bmtTaXplfHx0aGlzLl9kaXNhYmxlUmFuZ2V8fCh0aGlzLl9kaXNhYmxlUmFuZ2U9ITApO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSExO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9ITE7dGhpcy5fY2FjaGVkQ2h1bmtzPVtdO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX2RvbmU9ITE7dGhpcy5fc3RvcmVkRXJyb3I9dm9pZCAwO3RoaXMuX2ZpbGVuYW1lPW51bGw7dGhpcy5vblByb2dyZXNzPW51bGx9X2NyZWF0ZUNsYXNzKFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlcixbe2tleToiX29uSGVhZGVyc1JlY2VpdmVkIix2YWx1ZTpmdW5jdGlvbiBfb25IZWFkZXJzUmVjZWl2ZWQoKXt2YXIgdD10aGlzLl9mdWxsUmVxdWVzdElkLHI9dGhpcy5fbWFuYWdlci5nZXRSZXF1ZXN0WGhyKHQpLGE9ZnVuY3Rpb24gZ2V0UmVzcG9uc2VIZWFkZXIodCl7cmV0dXJuIHIuZ2V0UmVzcG9uc2VIZWFkZXIodCl9LG89KDAsbC52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe2dldFJlc3BvbnNlSGVhZGVyOmEsaXNIdHRwOnRoaXMuX21hbmFnZXIuaXNIdHRwLHJhbmdlQ2h1bmtTaXplOnRoaXMuX3JhbmdlQ2h1bmtTaXplLGRpc2FibGVSYW5nZTp0aGlzLl9kaXNhYmxlUmFuZ2V9KSxpPW8uYWxsb3dSYW5nZVJlcXVlc3RzLGM9by5zdWdnZXN0ZWRMZW5ndGg7aSYmKHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9ITApO3RoaXMuX2NvbnRlbnRMZW5ndGg9Y3x8dGhpcy5fY29udGVudExlbmd0aDt0aGlzLl9maWxlbmFtZT0oMCxsLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGEpO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQmJnRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHQpO3RoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVzb2x2ZSgpfX0se2tleToiX29uRG9uZSIsdmFsdWU6ZnVuY3Rpb24gX29uRG9uZSh0KXtpZih0KWlmKHRoaXMuX3JlcXVlc3RzLmxlbmd0aD4wKXt0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpLnJlc29sdmUoe3ZhbHVlOnQuY2h1bmssZG9uZTohMX0pfWVsc2UgdGhpcy5fY2FjaGVkQ2h1bmtzLnB1c2godC5jaHVuayk7dGhpcy5fZG9uZT0hMDtpZighKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGg+MCkpe3RoaXMuX3JlcXVlc3RzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVzb2x2ZSh7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KX0pKTt0aGlzLl9yZXF1ZXN0cz1bXX19fSx7a2V5OiJfb25FcnJvciIsdmFsdWU6ZnVuY3Rpb24gX29uRXJyb3IodCl7dmFyIHI9dGhpcy5fdXJsLGE9KDAsbC5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSh0LHIpO3RoaXMuX3N0b3JlZEVycm9yPWE7dGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QoYSk7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZWplY3QoYSl9KSk7dGhpcy5fcmVxdWVzdHM9W107dGhpcy5fY2FjaGVkQ2h1bmtzPVtdfX0se2tleToiX29uUHJvZ3Jlc3MiLHZhbHVlOmZ1bmN0aW9uIF9vblByb2dyZXNzKHQpe3RoaXMub25Qcm9ncmVzcyYmdGhpcy5vblByb2dyZXNzKHtsb2FkZWQ6dC5sb2FkZWQsdG90YWw6dC5sZW5ndGhDb21wdXRhYmxlP3QudG90YWw6dGhpcy5fY29udGVudExlbmd0aH0pfX0se2tleToicmVhZCIsdmFsdWU6KHQ9X2FzeW5jVG9HZW5lcmF0b3Ioby5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUoKXt2YXIgdCxyO3JldHVybiBvLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZSQoYSl7Zm9yKDs7KXN3aXRjaChhLnByZXY9YS5uZXh0KXtjYXNlIDA6aWYoIXRoaXMuX3N0b3JlZEVycm9yKXthLm5leHQ9MjticmVha310aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtjYXNlIDI6aWYoISh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoPjApKXthLm5leHQ9NTticmVha310PXRoaXMuX2NhY2hlZENodW5rcy5zaGlmdCgpO3JldHVybiBhLmFicnVwdCgicmV0dXJuIix7dmFsdWU6dCxkb25lOiExfSk7Y2FzZSA1OmlmKCF0aGlzLl9kb25lKXthLm5leHQ9NzticmVha31yZXR1cm4gYS5hYnJ1cHQoInJldHVybiIse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk7Y2FzZSA3OnI9KDAsaS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9yZXF1ZXN0cy5wdXNoKHIpO3JldHVybiBhLmFicnVwdCgicmV0dXJuIixyLnByb21pc2UpO2Nhc2UgMTA6Y2FzZSJlbmQiOnJldHVybiBhLnN0b3AoKX19KSxfY2FsbGVlLHRoaXMpfSkpKSxmdW5jdGlvbiByZWFkKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6ImNhbmNlbCIsdmFsdWU6ZnVuY3Rpb24gY2FuY2VsKHQpe3RoaXMuX2RvbmU9ITA7dGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QodCk7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSkpO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKSYmdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCk7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbH19LHtrZXk6ImZpbGVuYW1lIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2ZpbGVuYW1lfX0se2tleToiaXNSYW5nZVN1cHBvcnRlZCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkfX0se2tleToiaXNTdHJlYW1pbmdTdXBwb3J0ZWQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9fSx7a2V5OiJjb250ZW50TGVuZ3RoIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGh9fSx7a2V5OiJoZWFkZXJzUmVhZHkiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5wcm9taXNlfX1dKTt2YXIgdDtyZXR1cm4gUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyfSgpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKHQscixhKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKTt0aGlzLl9tYW5hZ2VyPXQ7dmFyIG89e29uRG9uZTp0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxvblByb2dyZXNzOnRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKX07dGhpcy5fcmVxdWVzdElkPXQucmVxdWVzdFJhbmdlKHIsYSxvKTt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9xdWV1ZWRDaHVuaz1udWxsO3RoaXMuX2RvbmU9ITE7dGhpcy5vblByb2dyZXNzPW51bGw7dGhpcy5vbkNsb3NlZD1udWxsfV9jcmVhdGVDbGFzcyhQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyLFt7a2V5OiJfY2xvc2UiLHZhbHVlOmZ1bmN0aW9uIF9jbG9zZSgpe3RoaXMub25DbG9zZWQmJnRoaXMub25DbG9zZWQodGhpcyl9fSx7a2V5OiJfb25Eb25lIix2YWx1ZTpmdW5jdGlvbiBfb25Eb25lKHQpe3ZhciByPXQuY2h1bms7aWYodGhpcy5fcmVxdWVzdHMubGVuZ3RoPjApe3RoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7dmFsdWU6cixkb25lOiExfSl9ZWxzZSB0aGlzLl9xdWV1ZWRDaHVuaz1yO3RoaXMuX2RvbmU9ITA7dGhpcy5fcmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSkpO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX2Nsb3NlKCl9fSx7a2V5OiJfb25Qcm9ncmVzcyIsdmFsdWU6ZnVuY3Rpb24gX29uUHJvZ3Jlc3ModCl7IXRoaXMuaXNTdHJlYW1pbmdTdXBwb3J0ZWQmJnRoaXMub25Qcm9ncmVzcyYmdGhpcy5vblByb2dyZXNzKHtsb2FkZWQ6dC5sb2FkZWR9KX19LHtrZXk6InJlYWQiLHZhbHVlOih0PV9hc3luY1RvR2VuZXJhdG9yKG8uZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlMigpe3ZhciB0LHI7cmV0dXJuIG8uZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMiQoYSl7Zm9yKDs7KXN3aXRjaChhLnByZXY9YS5uZXh0KXtjYXNlIDA6aWYobnVsbD09PXRoaXMuX3F1ZXVlZENodW5rKXthLm5leHQ9NDticmVha310PXRoaXMuX3F1ZXVlZENodW5rO3RoaXMuX3F1ZXVlZENodW5rPW51bGw7cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHt2YWx1ZTp0LGRvbmU6ITF9KTtjYXNlIDQ6aWYoIXRoaXMuX2RvbmUpe2EubmV4dD02O2JyZWFrfXJldHVybiBhLmFicnVwdCgicmV0dXJuIix7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KTtjYXNlIDY6cj0oMCxpLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMuX3JlcXVlc3RzLnB1c2gocik7cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHIucHJvbWlzZSk7Y2FzZSA5OmNhc2UiZW5kIjpyZXR1cm4gYS5zdG9wKCl9fSksX2NhbGxlZTIsdGhpcyl9KSkpLGZ1bmN0aW9uIHJlYWQoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiY2FuY2VsIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWwodCl7dGhpcy5fZG9uZT0hMDt0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlc29sdmUoe3ZhbHVlOnZvaWQgMCxkb25lOiEwfSl9KSk7dGhpcy5fcmVxdWVzdHM9W107dGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCkmJnRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCk7dGhpcy5fY2xvc2UoKX19LHtrZXk6ImlzU3RyZWFtaW5nU3VwcG9ydGVkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuITF9fV0pO3ZhciB0O3JldHVybiBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyfSgpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBERkZldGNoU3RyZWFtPXZvaWQgMDt2YXIgbz1mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oYSgyKSksaT1hKDUpLGw9YSgyMjApO2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcCh0LHIsYSxvLGksbCxjKXt0cnl7dmFyIHU9dFtsXShjKSxkPXUudmFsdWV9Y2F0Y2godCl7YSh0KTtyZXR1cm59dS5kb25lP3IoZCk6UHJvbWlzZS5yZXNvbHZlKGQpLnRoZW4obyxpKX1mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLGE9YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXt2YXIgbD10LmFwcGx5KHIsYSk7ZnVuY3Rpb24gX25leHQodCl7YXN5bmNHZW5lcmF0b3JTdGVwKGwsbyxpLF9uZXh0LF90aHJvdywibmV4dCIsdCl9ZnVuY3Rpb24gX3Rocm93KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChsLG8saSxfbmV4dCxfdGhyb3csInRocm93Iix0KX1fbmV4dCh2b2lkIDApfSkpfX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgbz1yW2FdO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExO28uY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH1mdW5jdGlvbiBjcmVhdGVGZXRjaE9wdGlvbnModCxyLGEpe3JldHVybnttZXRob2Q6IkdFVCIsaGVhZGVyczp0LHNpZ25hbDphJiZhLnNpZ25hbCxtb2RlOiJjb3JzIixjcmVkZW50aWFsczpyPyJpbmNsdWRlIjoic2FtZS1vcmlnaW4iLHJlZGlyZWN0OiJmb2xsb3cifX1mdW5jdGlvbiBjcmVhdGVIZWFkZXJzKHQpe3ZhciByPW5ldyBIZWFkZXJzO2Zvcih2YXIgYSBpbiB0KXt2YXIgbz10W2FdO3ZvaWQgMCE9PW8mJnIuYXBwZW5kKGEsbyl9cmV0dXJuIHJ9dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZGZXRjaFN0cmVhbSh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZGZXRjaFN0cmVhbSk7dGhpcy5zb3VyY2U9dDt0aGlzLmlzSHR0cD0vXmh0dHBzPzovaS50ZXN0KHQudXJsKTt0aGlzLmh0dHBIZWFkZXJzPXRoaXMuaXNIdHRwJiZ0Lmh0dHBIZWFkZXJzfHx7fTt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1udWxsO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnM9W119X2NyZWF0ZUNsYXNzKFBERkZldGNoU3RyZWFtLFt7a2V5OiJnZXRGdWxsUmVhZGVyIix2YWx1ZTpmdW5jdGlvbiBnZXRGdWxsUmVhZGVyKCl7KDAsaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGRmV0Y2hTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1uZXcgdSh0aGlzKTtyZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXJ9fSx7a2V5OiJnZXRSYW5nZVJlYWRlciIsdmFsdWU6ZnVuY3Rpb24gZ2V0UmFuZ2VSZWFkZXIodCxyKXtpZihyPD10aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpcmV0dXJuIG51bGw7dmFyIGE9bmV3IGQodGhpcyx0LHIpO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChhKTtyZXR1cm4gYX19LHtrZXk6ImNhbmNlbEFsbFJlcXVlc3RzIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWxBbGxSZXF1ZXN0cyh0KXt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciYmdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHQpO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7ci5jYW5jZWwodCl9KSl9fSx7a2V5OiJfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyP3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQ6MH19XSk7cmV0dXJuIFBERkZldGNoU3RyZWFtfSgpO3IuUERGRmV0Y2hTdHJlYW09Yzt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIFBERkZldGNoU3RyZWFtUmVhZGVyKHQpe3ZhciByPXRoaXM7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUERGRmV0Y2hTdHJlYW1SZWFkZXIpO3RoaXMuX3N0cmVhbT10O3RoaXMuX3JlYWRlcj1udWxsO3RoaXMuX2xvYWRlZD0wO3RoaXMuX2ZpbGVuYW1lPW51bGw7dmFyIGE9dC5zb3VyY2U7dGhpcy5fd2l0aENyZWRlbnRpYWxzPWEud2l0aENyZWRlbnRpYWxzfHwhMTt0aGlzLl9jb250ZW50TGVuZ3RoPWEubGVuZ3RoO3RoaXMuX2hlYWRlcnNDYXBhYmlsaXR5PSgwLGkuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5fZGlzYWJsZVJhbmdlPWEuZGlzYWJsZVJhbmdlfHwhMTt0aGlzLl9yYW5nZUNodW5rU2l6ZT1hLnJhbmdlQ2h1bmtTaXplO3RoaXMuX3JhbmdlQ2h1bmtTaXplfHx0aGlzLl9kaXNhYmxlUmFuZ2V8fCh0aGlzLl9kaXNhYmxlUmFuZ2U9ITApOyJ1bmRlZmluZWQiIT10eXBlb2YgQWJvcnRDb250cm9sbGVyJiYodGhpcy5fYWJvcnRDb250cm9sbGVyPW5ldyBBYm9ydENvbnRyb2xsZXIpO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSFhLmRpc2FibGVTdHJlYW07dGhpcy5faXNSYW5nZVN1cHBvcnRlZD0hYS5kaXNhYmxlUmFuZ2U7dGhpcy5faGVhZGVycz1jcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7dmFyIG89YS51cmw7ZmV0Y2gobyxjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycyx0aGlzLl93aXRoQ3JlZGVudGlhbHMsdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbigoZnVuY3Rpb24odCl7aWYoISgwLGwudmFsaWRhdGVSZXNwb25zZVN0YXR1cykodC5zdGF0dXMpKXRocm93KDAsbC5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSh0LnN0YXR1cyxvKTtyLl9yZWFkZXI9dC5ib2R5LmdldFJlYWRlcigpO3IuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTt2YXIgYT1mdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcihyKXtyZXR1cm4gdC5oZWFkZXJzLmdldChyKX0sYz0oMCxsLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7Z2V0UmVzcG9uc2VIZWFkZXI6YSxpc0h0dHA6ci5fc3RyZWFtLmlzSHR0cCxyYW5nZUNodW5rU2l6ZTpyLl9yYW5nZUNodW5rU2l6ZSxkaXNhYmxlUmFuZ2U6ci5fZGlzYWJsZVJhbmdlfSksdT1jLmFsbG93UmFuZ2VSZXF1ZXN0cyxkPWMuc3VnZ2VzdGVkTGVuZ3RoO3IuX2lzUmFuZ2VTdXBwb3J0ZWQ9dTtyLl9jb250ZW50TGVuZ3RoPWR8fHIuX2NvbnRlbnRMZW5ndGg7ci5fZmlsZW5hbWU9KDAsbC5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShhKTshci5faXNTdHJlYW1pbmdTdXBwb3J0ZWQmJnIuX2lzUmFuZ2VTdXBwb3J0ZWQmJnIuY2FuY2VsKG5ldyBpLkFib3J0RXhjZXB0aW9uKCJTdHJlYW1pbmcgaXMgZGlzYWJsZWQuIikpfSkpLmNhdGNoKHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7dGhpcy5vblByb2dyZXNzPW51bGx9X2NyZWF0ZUNsYXNzKFBERkZldGNoU3RyZWFtUmVhZGVyLFt7a2V5OiJyZWFkIix2YWx1ZToodD1fYXN5bmNUb0dlbmVyYXRvcihvLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSgpe3ZhciB0LHIsYSxpO3JldHVybiBvLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZSQobyl7Zm9yKDs7KXN3aXRjaChvLnByZXY9by5uZXh0KXtjYXNlIDA6by5uZXh0PTI7cmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7Y2FzZSAyOm8ubmV4dD00O3JldHVybiB0aGlzLl9yZWFkZXIucmVhZCgpO2Nhc2UgNDp0PW8uc2VudDtyPXQudmFsdWU7aWYoIShhPXQuZG9uZSkpe28ubmV4dD05O2JyZWFrfXJldHVybiBvLmFicnVwdCgicmV0dXJuIix7dmFsdWU6cixkb25lOmF9KTtjYXNlIDk6dGhpcy5fbG9hZGVkKz1yLmJ5dGVMZW5ndGg7dGhpcy5vblByb2dyZXNzJiZ0aGlzLm9uUHJvZ3Jlc3Moe2xvYWRlZDp0aGlzLl9sb2FkZWQsdG90YWw6dGhpcy5fY29udGVudExlbmd0aH0pO2k9bmV3IFVpbnQ4QXJyYXkocikuYnVmZmVyO3JldHVybiBvLmFicnVwdCgicmV0dXJuIix7dmFsdWU6aSxkb25lOiExfSk7Y2FzZSAxMzpjYXNlImVuZCI6cmV0dXJuIG8uc3RvcCgpfX0pLF9jYWxsZWUsdGhpcyl9KSkpLGZ1bmN0aW9uIHJlYWQoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiY2FuY2VsIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWwodCl7dGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKHQpO3RoaXMuX2Fib3J0Q29udHJvbGxlciYmdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCl9fSx7a2V5OiJoZWFkZXJzUmVhZHkiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZX19LHtrZXk6ImZpbGVuYW1lIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2ZpbGVuYW1lfX0se2tleToiY29udGVudExlbmd0aCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofX0se2tleToiaXNSYW5nZVN1cHBvcnRlZCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkfX0se2tleToiaXNTdHJlYW1pbmdTdXBwb3J0ZWQiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9fV0pO3ZhciB0O3JldHVybiBQREZGZXRjaFN0cmVhbVJlYWRlcn0oKSxkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0LHIsYSl7dmFyIG89dGhpcztfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyKTt0aGlzLl9zdHJlYW09dDt0aGlzLl9yZWFkZXI9bnVsbDt0aGlzLl9sb2FkZWQ9MDt2YXIgYz10LnNvdXJjZTt0aGlzLl93aXRoQ3JlZGVudGlhbHM9Yy53aXRoQ3JlZGVudGlhbHN8fCExO3RoaXMuX3JlYWRDYXBhYmlsaXR5PSgwLGkuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9IWMuZGlzYWJsZVN0cmVhbTsidW5kZWZpbmVkIiE9dHlwZW9mIEFib3J0Q29udHJvbGxlciYmKHRoaXMuX2Fib3J0Q29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyKTt0aGlzLl9oZWFkZXJzPWNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTt0aGlzLl9oZWFkZXJzLmFwcGVuZCgiUmFuZ2UiLCJieXRlcz0iLmNvbmNhdChyLCItIikuY29uY2F0KGEtMSkpO3ZhciB1PWMudXJsO2ZldGNoKHUsY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsdGhpcy5fd2l0aENyZWRlbnRpYWxzLHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4oKGZ1bmN0aW9uKHQpe2lmKCEoMCxsLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHQuc3RhdHVzKSl0aHJvdygwLGwuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodC5zdGF0dXMsdSk7by5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO28uX3JlYWRlcj10LmJvZHkuZ2V0UmVhZGVyKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2lmKCF0fHwiQWJvcnRFcnJvciIhPT10Lm5hbWUpdGhyb3cgdH0pKTt0aGlzLm9uUHJvZ3Jlc3M9bnVsbH1fY3JlYXRlQ2xhc3MoUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcixbe2tleToicmVhZCIsdmFsdWU6KHQ9X2FzeW5jVG9HZW5lcmF0b3Ioby5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUyKCl7dmFyIHQscixhLGk7cmV0dXJuIG8uZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMiQobyl7Zm9yKDs7KXN3aXRjaChvLnByZXY9by5uZXh0KXtjYXNlIDA6by5uZXh0PTI7cmV0dXJuIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7Y2FzZSAyOm8ubmV4dD00O3JldHVybiB0aGlzLl9yZWFkZXIucmVhZCgpO2Nhc2UgNDp0PW8uc2VudDtyPXQudmFsdWU7aWYoIShhPXQuZG9uZSkpe28ubmV4dD05O2JyZWFrfXJldHVybiBvLmFicnVwdCgicmV0dXJuIix7dmFsdWU6cixkb25lOmF9KTtjYXNlIDk6dGhpcy5fbG9hZGVkKz1yLmJ5dGVMZW5ndGg7dGhpcy5vblByb2dyZXNzJiZ0aGlzLm9uUHJvZ3Jlc3Moe2xvYWRlZDp0aGlzLl9sb2FkZWR9KTtpPW5ldyBVaW50OEFycmF5KHIpLmJ1ZmZlcjtyZXR1cm4gby5hYnJ1cHQoInJldHVybiIse3ZhbHVlOmksZG9uZTohMX0pO2Nhc2UgMTM6Y2FzZSJlbmQiOnJldHVybiBvLnN0b3AoKX19KSxfY2FsbGVlMix0aGlzKX0pKSksZnVuY3Rpb24gcmVhZCgpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJjYW5jZWwiLHZhbHVlOmZ1bmN0aW9uIGNhbmNlbCh0KXt0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwodCk7dGhpcy5fYWJvcnRDb250cm9sbGVyJiZ0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKX19LHtrZXk6ImlzU3RyZWFtaW5nU3VwcG9ydGVkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkfX1dKTt2YXIgdDtyZXR1cm4gUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcn0oKX1dKX0pKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9lczUvYnVpbGQvcGRmLndvcmtlci5lbnRyeS5qcyBiL2VzNS9idWlsZC9wZGYud29ya2VyLmVudHJ5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMDBmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9lczUvYnVpbGQvcGRmLndvcmtlci5lbnRyeS5qcwpAQCAtMCwwICsxLDE5IEBACisvKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisodHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIKKyAgPyB3aW5kb3cKKyAgOiB7fQorKS5wZGZqc1dvcmtlciA9IHJlcXVpcmUoIi4vcGRmLndvcmtlci5qcyIpOwpkaWZmIC0tZ2l0IGEvZXM1L2J1aWxkL3BkZi53b3JrZXIuanMgYi9lczUvYnVpbGQvcGRmLndvcmtlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzhkYTkwCi0tLSAvZGV2L251bGwKKysrIGIvZXM1L2J1aWxkL3BkZi53b3JrZXIuanMKQEAgLTAsMCArMSw2MTIzMSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworCisoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgeworCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKKwkJbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CisJZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCisJCWRlZmluZSgicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyIiwgW10sIGZhY3RvcnkpOworCWVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKQorCQlleHBvcnRzWyJwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIiXSA9IGZhY3RvcnkoKTsKKwllbHNlCisJCXJvb3RbInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciJdID0gcm9vdC5wZGZqc1dvcmtlciA9IGZhY3RvcnkoKTsKK30pKHRoaXMsIGZ1bmN0aW9uKCkgeworcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKKy8qKioqKiovIAkvLyBUaGUgbW9kdWxlIGNhY2hlCisvKioqKioqLyAJdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KKy8qKioqKiovIAlmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CisvKioqKioqLworLyoqKioqKi8gCQkvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKKy8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHsKKy8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOworLyoqKioqKi8gCQl9CisvKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCisvKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKKy8qKioqKiovIAkJCWk6IG1vZHVsZUlkLAorLyoqKioqKi8gCQkJbDogZmFsc2UsCisvKioqKioqLyAJCQlleHBvcnRzOiB7fQorLyoqKioqKi8gCQl9OworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCisvKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pOworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZAorLyoqKioqKi8gCQltb2R1bGUubCA9IHRydWU7CisvKioqKioqLworLyoqKioqKi8gCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQorLyoqKioqKi8gCQlyZXR1cm4gbW9kdWxlLmV4cG9ydHM7CisvKioqKioqLyAJfQorLyoqKioqKi8KKy8qKioqKiovCisvKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXykKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm0gPSBtb2R1bGVzOworLyoqKioqKi8KKy8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7CisvKioqKioqLworLyoqKioqKi8gCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0cworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikgeworLyoqKioqKi8gCQlpZighX193X3BkZmpzX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7CisvKioqKioqLyAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTsKKy8qKioqKiovIAkJfQorLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7CisvKioqKioqLyAJCWlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykgeworLyoqKioqKi8gCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7CisvKioqKioqLyAJCX0KKy8qKioqKiovIAkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3QKKy8qKioqKiovIAkvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXQKKy8qKioqKiovIAkvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnMKKy8qKioqKiovIAkvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3QKKy8qKioqKiovIAkvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHsKKy8qKioqKiovIAkJaWYobW9kZSAmIDEpIHZhbHVlID0gX193X3BkZmpzX3JlcXVpcmVfXyh2YWx1ZSk7CisvKioqKioqLyAJCWlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7CisvKioqKioqLyAJCWlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7CisvKioqKioqLyAJCXZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisvKioqKioqLyAJCV9fd19wZGZqc19yZXF1aXJlX18ucihucyk7CisvKioqKioqLyAJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTsKKy8qKioqKiovIAkJaWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193X3BkZmpzX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpOworLyoqKioqKi8gCQlyZXR1cm4gbnM7CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHsKKy8qKioqKiovIAkJdmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/CisvKioqKioqLyAJCQlmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOgorLyoqKioqKi8gCQkJZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTsKKy8qKioqKiovIAkJX193X3BkZmpzX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpOworLyoqKioqKi8gCQlyZXR1cm4gZ2V0dGVyOworLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbAorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX18KKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLnAgPSAiIjsKKy8qKioqKiovCisvKioqKioqLworLyoqKioqKi8gCS8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0cworLyoqKioqKi8gCXJldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucyA9IDApOworLyoqKioqKi8gfSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqLyAoWworLyogMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIldvcmtlck1lc3NhZ2VIYW5kbGVyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjsKKyAgfQorfSk7CisKK3ZhciBfd29ya2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTsKKwordmFyIHBkZmpzVmVyc2lvbiA9ICcyLjYuMzQ3JzsKK3ZhciBwZGZqc0J1aWxkID0gJzNiZTljNjVmJzsKKworLyoqKi8gfSksCisvKiAxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBleHBvcnRzLldvcmtlclRhc2sgPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oMikpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMik7CisKK3ZhciBfcGRmX21hbmFnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMyk7CisKK3ZhciBfd3JpdGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjQpOworCit2YXIgX2lzX25vZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOworCit2YXIgX21lc3NhZ2VfaGFuZGxlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjQzKTsKKwordmFyIF93b3JrZXJfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygyNDQpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IHRocm93IF9lMjsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTMpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UzOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CisKK2Z1bmN0aW9uIF90b0FycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfQorCitmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9CisKK2Z1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9CisKK2Z1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0KKworZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KKworZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9CisKK2Z1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJ1bmRlZmluZWQiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuOyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVkOyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVsicmV0dXJuIl0gIT0gbnVsbCkgX2lbInJldHVybiJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfQorCitmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIFdvcmtlclRhc2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBXb3JrZXJUYXNrKG5hbWUpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV29ya2VyVGFzayk7CisKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMudGVybWluYXRlZCA9IGZhbHNlOworICAgIHRoaXMuX2NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoV29ya2VyVGFzaywgW3sKKyAgICBrZXk6ICJmaW5pc2giLAorICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5pc2goKSB7CisgICAgICB0aGlzLl9jYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ0ZXJtaW5hdGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB0ZXJtaW5hdGUoKSB7CisgICAgICB0aGlzLnRlcm1pbmF0ZWQgPSB0cnVlOworICAgIH0KKyAgfSwgeworICAgIGtleTogImVuc3VyZU5vdFRlcm1pbmF0ZWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCkgeworICAgICAgaWYgKHRoaXMudGVybWluYXRlZCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB0YXNrIHdhcyB0ZXJtaW5hdGVkIik7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmluaXNoZWQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gV29ya2VyVGFzazsKK30oKTsKKworZXhwb3J0cy5Xb3JrZXJUYXNrID0gV29ya2VyVGFzazsKKwordmFyIFdvcmtlck1lc3NhZ2VIYW5kbGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gV29ya2VyTWVzc2FnZUhhbmRsZXIoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdvcmtlck1lc3NhZ2VIYW5kbGVyKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhXb3JrZXJNZXNzYWdlSGFuZGxlciwgbnVsbCwgW3sKKyAgICBrZXk6ICJzZXR1cCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldHVwKGhhbmRsZXIsIHBvcnQpIHsKKyAgICAgIHZhciB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IGZhbHNlOworICAgICAgaGFuZGxlci5vbigidGVzdCIsIGZ1bmN0aW9uIHdwaFNldHVwVGVzdChkYXRhKSB7CisgICAgICAgIGlmICh0ZXN0TWVzc2FnZVByb2Nlc3NlZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gdHJ1ZTsKKworICAgICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHsKKyAgICAgICAgICBoYW5kbGVyLnNlbmQoInRlc3QiLCBudWxsKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3VwcG9ydFRyYW5zZmVycyA9IGRhdGFbMF0gPT09IDI1NTsKKyAgICAgICAgaGFuZGxlci5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHN1cHBvcnRUcmFuc2ZlcnM7CisgICAgICAgIGhhbmRsZXIuc2VuZCgidGVzdCIsIHsKKyAgICAgICAgICBzdXBwb3J0VHJhbnNmZXJzOiBzdXBwb3J0VHJhbnNmZXJzCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJjb25maWd1cmUiLCBmdW5jdGlvbiB3cGhDb25maWd1cmUoZGF0YSkgeworICAgICAgICAoMCwgX3V0aWwuc2V0VmVyYm9zaXR5TGV2ZWwpKGRhdGEudmVyYm9zaXR5KTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiR2V0RG9jUmVxdWVzdCIsIGZ1bmN0aW9uIHdwaFNldHVwRG9jKGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIFdvcmtlck1lc3NhZ2VIYW5kbGVyLmNyZWF0ZURvY3VtZW50SGFuZGxlcihkYXRhLCBwb3J0KTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNyZWF0ZURvY3VtZW50SGFuZGxlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50SGFuZGxlcihkb2NQYXJhbXMsIHBvcnQpIHsKKyAgICAgIHZhciBwZGZNYW5hZ2VyOworICAgICAgdmFyIHRlcm1pbmF0ZWQgPSBmYWxzZTsKKyAgICAgIHZhciBjYW5jZWxYSFJzID0gbnVsbDsKKyAgICAgIHZhciBXb3JrZXJUYXNrcyA9IFtdOworICAgICAgdmFyIHZlcmJvc2l0eSA9ICgwLCBfdXRpbC5nZXRWZXJib3NpdHlMZXZlbCkoKTsKKyAgICAgIHZhciBhcGlWZXJzaW9uID0gZG9jUGFyYW1zLmFwaVZlcnNpb247CisgICAgICB2YXIgd29ya2VyVmVyc2lvbiA9ICcyLjYuMzQ3JzsKKworICAgICAgaWYgKGFwaVZlcnNpb24gIT09IHdvcmtlclZlcnNpb24pIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgQVBJIHZlcnNpb24gXCIiLmNvbmNhdChhcGlWZXJzaW9uLCAiXCIgZG9lcyBub3QgbWF0Y2ggIikgKyAidGhlIFdvcmtlciB2ZXJzaW9uIFwiIi5jb25jYXQod29ya2VyVmVyc2lvbiwgIlwiLiIpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGVudW1lcmFibGVQcm9wZXJ0aWVzID0gW107CisKKyAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIFtdKSB7CisgICAgICAgIGVudW1lcmFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpOworICAgICAgfQorCisgICAgICBpZiAoZW51bWVyYWJsZVByb3BlcnRpZXMubGVuZ3RoKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIGBBcnJheS5wcm90b3R5cGVgIGNvbnRhaW5zIHVuZXhwZWN0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzOiAiICsgZW51bWVyYWJsZVByb3BlcnRpZXMuam9pbigiLCAiKSArICI7IHRodXMgYnJlYWtpbmcgZS5nLiBgZm9yLi4uaW5gIGl0ZXJhdGlvbiBvZiBgQXJyYXlgcy4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRvY0lkID0gZG9jUGFyYW1zLmRvY0lkOworICAgICAgdmFyIGRvY0Jhc2VVcmwgPSBkb2NQYXJhbXMuZG9jQmFzZVVybDsKKyAgICAgIHZhciB3b3JrZXJIYW5kbGVyTmFtZSA9IGRvY1BhcmFtcy5kb2NJZCArICJfd29ya2VyIjsKKyAgICAgIHZhciBoYW5kbGVyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIod29ya2VySGFuZGxlck5hbWUsIGRvY0lkLCBwb3J0KTsKKyAgICAgIGhhbmRsZXIucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSBkb2NQYXJhbXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM7CisKKyAgICAgIGZ1bmN0aW9uIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKSB7CisgICAgICAgIGlmICh0ZXJtaW5hdGVkKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzdGFydFdvcmtlclRhc2sodGFzaykgeworICAgICAgICBXb3JrZXJUYXNrcy5wdXNoKHRhc2spOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBmaW5pc2hXb3JrZXJUYXNrKHRhc2spIHsKKyAgICAgICAgdGFzay5maW5pc2goKTsKKyAgICAgICAgdmFyIGkgPSBXb3JrZXJUYXNrcy5pbmRleE9mKHRhc2spOworICAgICAgICBXb3JrZXJUYXNrcy5zcGxpY2UoaSwgMSk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIGxvYWREb2N1bWVudChfeCkgeworICAgICAgICByZXR1cm4gX2xvYWREb2N1bWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBfbG9hZERvY3VtZW50KCkgeworICAgICAgICBfbG9hZERvY3VtZW50ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVjb3ZlcnlNb2RlKSB7CisgICAgICAgICAgdmFyIF95aWVsZCRQcm9taXNlJGFsbCwgX3lpZWxkJFByb21pc2UkYWxsMiwgbnVtUGFnZXMsIGZpbmdlcnByaW50OworCisgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tIZWFkZXIiKTsKKworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0OworICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJwYXJzZVN0YXJ0WFJlZiIpOworCisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7CisgICAgICAgICAgICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVEb2MoInBhcnNlIiwgW3JlY292ZXJ5TW9kZV0pOworCisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgaWYgKHJlY292ZXJ5TW9kZSkgeworICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5OworICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0ZpcnN0UGFnZSIpOworCisgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExOworICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygibnVtUGFnZXMiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoImZpbmdlcnByaW50IildKTsKKworICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICBfeWllbGQkUHJvbWlzZSRhbGwgPSBfY29udGV4dC5zZW50OworICAgICAgICAgICAgICAgICAgX3lpZWxkJFByb21pc2UkYWxsMiA9IF9zbGljZWRUb0FycmF5KF95aWVsZCRQcm9taXNlJGFsbCwgMik7CisgICAgICAgICAgICAgICAgICBudW1QYWdlcyA9IF95aWVsZCRQcm9taXNlJGFsbDJbMF07CisgICAgICAgICAgICAgICAgICBmaW5nZXJwcmludCA9IF95aWVsZCRQcm9taXNlJGFsbDJbMV07CisgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CisgICAgICAgICAgICAgICAgICAgIG51bVBhZ2VzOiBudW1QYWdlcywKKyAgICAgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQ6IGZpbmdlcnByaW50CisgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCBfY2FsbGVlKTsKKyAgICAgICAgfSkpOworICAgICAgICByZXR1cm4gX2xvYWREb2N1bWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBnZXRQZGZNYW5hZ2VyKGRhdGEsIGV2YWx1YXRvck9wdGlvbnMpIHsKKyAgICAgICAgdmFyIHBkZk1hbmFnZXJDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICB2YXIgbmV3UGRmTWFuYWdlcjsKKyAgICAgICAgdmFyIHNvdXJjZSA9IGRhdGEuc291cmNlOworCisgICAgICAgIGlmIChzb3VyY2UuZGF0YSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyID0gbmV3IF9wZGZfbWFuYWdlci5Mb2NhbFBkZk1hbmFnZXIoZG9jSWQsIHNvdXJjZS5kYXRhLCBzb3VyY2UucGFzc3dvcmQsIGV2YWx1YXRvck9wdGlvbnMsIGRvY0Jhc2VVcmwpOworICAgICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVzb2x2ZShuZXdQZGZNYW5hZ2VyKTsKKyAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGV4KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gcGRmTWFuYWdlckNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwZGZTdHJlYW0sCisgICAgICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIHBkZlN0cmVhbSA9IG5ldyBfd29ya2VyX3N0cmVhbS5QREZXb3JrZXJTdHJlYW0oaGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGV4KTsKKyAgICAgICAgICByZXR1cm4gcGRmTWFuYWdlckNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmdWxsUmVxdWVzdCA9IHBkZlN0cmVhbS5nZXRGdWxsUmVhZGVyKCk7CisgICAgICAgIGZ1bGxSZXF1ZXN0LmhlYWRlcnNSZWFkeS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBpZiAoIWZ1bGxSZXF1ZXN0LmlzUmFuZ2VTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgZGlzYWJsZUF1dG9GZXRjaCA9IHNvdXJjZS5kaXNhYmxlQXV0b0ZldGNoIHx8IGZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkOworICAgICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgX3BkZl9tYW5hZ2VyLk5ldHdvcmtQZGZNYW5hZ2VyKGRvY0lkLCBwZGZTdHJlYW0sIHsKKyAgICAgICAgICAgIG1zZ0hhbmRsZXI6IGhhbmRsZXIsCisgICAgICAgICAgICBwYXNzd29yZDogc291cmNlLnBhc3N3b3JkLAorICAgICAgICAgICAgbGVuZ3RoOiBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoLAorICAgICAgICAgICAgZGlzYWJsZUF1dG9GZXRjaDogZGlzYWJsZUF1dG9GZXRjaCwKKyAgICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiBzb3VyY2UucmFuZ2VDaHVua1NpemUKKyAgICAgICAgICB9LCBldmFsdWF0b3JPcHRpb25zLCBkb2NCYXNlVXJsKTsKKworICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FjaGVkQ2h1bmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEoY2FjaGVkQ2h1bmtzW2ldKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKKyAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOworICAgICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOworICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CisgICAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CisgICAgICAgIH0pOworICAgICAgICB2YXIgbG9hZGVkID0gMDsKKworICAgICAgICB2YXIgZmx1c2hDaHVua3MgPSBmdW5jdGlvbiBmbHVzaENodW5rcygpIHsKKyAgICAgICAgICB2YXIgcGRmRmlsZSA9ICgwLCBfdXRpbC5hcnJheXNUb0J5dGVzKShjYWNoZWRDaHVua3MpOworCisgICAgICAgICAgaWYgKHNvdXJjZS5sZW5ndGggJiYgcGRmRmlsZS5sZW5ndGggIT09IHNvdXJjZS5sZW5ndGgpIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicmVwb3J0ZWQgSFRUUCBsZW5ndGggaXMgZGlmZmVyZW50IGZyb20gYWN0dWFsIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgX3BkZl9tYW5hZ2VyLkxvY2FsUGRmTWFuYWdlcihkb2NJZCwgcGRmRmlsZSwgc291cmNlLnBhc3N3b3JkLCBldmFsdWF0b3JPcHRpb25zLCBkb2NCYXNlVXJsKTsKKyAgICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlc29sdmUobmV3UGRmTWFuYWdlcik7CisgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChleCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgY2FjaGVkQ2h1bmtzID0gW107CisgICAgICAgIH07CisKKyAgICAgICAgdmFyIHJlYWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgICAgICAgIHZhciByZWFkQ2h1bmsgPSBmdW5jdGlvbiByZWFkQ2h1bmsoX3JlZikgeworICAgICAgICAgICAgdmFyIHZhbHVlID0gX3JlZi52YWx1ZSwKKyAgICAgICAgICAgICAgICBkb25lID0gX3JlZi5kb25lOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisKKyAgICAgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5ld1BkZk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgIGZsdXNoQ2h1bmtzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbG9hZGVkICs9ICgwLCBfdXRpbC5hcnJheUJ5dGVMZW5ndGgpKHZhbHVlKTsKKworICAgICAgICAgICAgICBpZiAoIWZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKKyAgICAgICAgICAgICAgICAgIGxvYWRlZDogbG9hZGVkLAorICAgICAgICAgICAgICAgICAgdG90YWw6IE1hdGgubWF4KGxvYWRlZCwgZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCB8fCAwKQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKG5ld1BkZk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEodmFsdWUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhY2hlZENodW5rcy5wdXNoKHZhbHVlKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZ1bGxSZXF1ZXN0LnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgICAgcmVqZWN0KGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisKKyAgICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CisgICAgICAgIH0pOworICAgICAgICByZWFkUHJvbWlzZVsiY2F0Y2giXShmdW5jdGlvbiAoZSkgeworICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChlKTsKKyAgICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDsKKyAgICAgICAgfSk7CisKKyAgICAgICAgY2FuY2VsWEhScyA9IGZ1bmN0aW9uIGNhbmNlbFhIUnMocmVhc29uKSB7CisgICAgICAgICAgcGRmU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbik7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHNldHVwRG9jKGRhdGEpIHsKKyAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKGRvYykgeworICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKyAgICAgICAgICBoYW5kbGVyLnNlbmQoIkdldERvYyIsIHsKKyAgICAgICAgICAgIHBkZkluZm86IGRvYworICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gb25GYWlsdXJlKGV4KSB7CisgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOworCisgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHZhciB0YXNrID0gbmV3IFdvcmtlclRhc2soIlBhc3N3b3JkRXhjZXB0aW9uOiByZXNwb25zZSAiLmNvbmNhdChleC5jb2RlKSk7CisgICAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CisgICAgICAgICAgICBoYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiUGFzc3dvcmRSZXF1ZXN0IiwgZXgpLnRoZW4oZnVuY3Rpb24gKF9yZWYyKSB7CisgICAgICAgICAgICAgIHZhciBwYXNzd29yZCA9IF9yZWYyLnBhc3N3b3JkOworICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOworICAgICAgICAgICAgICBwZGZNYW5hZ2VyLnVwZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgcGRmTWFuYWdlclJlYWR5KCk7CisgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisgICAgICAgICAgICAgIGhhbmRsZXIuc2VuZCgiRG9jRXhjZXB0aW9uIiwgZXgpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIF91dGlsLkludmFsaWRQREZFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIGV4KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlci5zZW5kKCJEb2NFeGNlcHRpb24iLCBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBwZGZNYW5hZ2VyUmVhZHkoKSB7CisgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOworICAgICAgICAgIGxvYWREb2N1bWVudChmYWxzZSkudGhlbihvblN1Y2Nlc3MsIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKworICAgICAgICAgICAgaWYgKCEocmVhc29uIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuWFJlZlBhcnNlRXhjZXB0aW9uKSkgeworICAgICAgICAgICAgICBvbkZhaWx1cmUocmVhc29uKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKTsKKyAgICAgICAgICAgIHBkZk1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOworICAgICAgICAgICAgICBsb2FkRG9jdW1lbnQodHJ1ZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKyAgICAgICAgdmFyIGV2YWx1YXRvck9wdGlvbnMgPSB7CisgICAgICAgICAgbWF4SW1hZ2VTaXplOiBkYXRhLm1heEltYWdlU2l6ZSwKKyAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IGRhdGEuZGlzYWJsZUZvbnRGYWNlLAorICAgICAgICAgIGlnbm9yZUVycm9yczogZGF0YS5pZ25vcmVFcnJvcnMsCisgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBkYXRhLmlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICBmb250RXh0cmFQcm9wZXJ0aWVzOiBkYXRhLmZvbnRFeHRyYVByb3BlcnRpZXMKKyAgICAgICAgfTsKKyAgICAgICAgZ2V0UGRmTWFuYWdlcihkYXRhLCBldmFsdWF0b3JPcHRpb25zKS50aGVuKGZ1bmN0aW9uIChuZXdQZGZNYW5hZ2VyKSB7CisgICAgICAgICAgaWYgKHRlcm1pbmF0ZWQpIHsKKyAgICAgICAgICAgIG5ld1BkZk1hbmFnZXIudGVybWluYXRlKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgcGRmTWFuYWdlciA9IG5ld1BkZk1hbmFnZXI7CisgICAgICAgICAgcGRmTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpLnRoZW4oZnVuY3Rpb24gKHN0cmVhbSkgeworICAgICAgICAgICAgaGFuZGxlci5zZW5kKCJEYXRhTG9hZGVkIiwgeworICAgICAgICAgICAgICBsZW5ndGg6IHN0cmVhbS5ieXRlcy5ieXRlTGVuZ3RoCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSkudGhlbihwZGZNYW5hZ2VyUmVhZHksIG9uRmFpbHVyZSk7CisgICAgICB9CisKKyAgICAgIGhhbmRsZXIub24oIkdldFBhZ2UiLCBmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2UoZGF0YSkgeworICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKGRhdGEucGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAicm90YXRlIiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJyZWYiKSwgcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInVzZXJVbml0IiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJ2aWV3IildKS50aGVuKGZ1bmN0aW9uIChfcmVmMykgeworICAgICAgICAgICAgdmFyIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDQpLAorICAgICAgICAgICAgICAgIHJvdGF0ZSA9IF9yZWY0WzBdLAorICAgICAgICAgICAgICAgIHJlZiA9IF9yZWY0WzFdLAorICAgICAgICAgICAgICAgIHVzZXJVbml0ID0gX3JlZjRbMl0sCisgICAgICAgICAgICAgICAgdmlldyA9IF9yZWY0WzNdOworCisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICByb3RhdGU6IHJvdGF0ZSwKKyAgICAgICAgICAgICAgcmVmOiByZWYsCisgICAgICAgICAgICAgIHVzZXJVbml0OiB1c2VyVW5pdCwKKyAgICAgICAgICAgICAgdmlldzogdmlldworICAgICAgICAgICAgfTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGhhbmRsZXIub24oIkdldFBhZ2VJbmRleCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUluZGV4KF9yZWY1KSB7CisgICAgICAgIHZhciByZWYgPSBfcmVmNS5yZWY7CisKKyAgICAgICAgdmFyIHBhZ2VSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KHJlZi5udW0sIHJlZi5nZW4pOworCisgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CisgICAgICB9KTsKKyAgICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9ucyIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0RGVzdGluYXRpb25zKGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZGVzdGluYXRpb25zIik7CisgICAgICB9KTsKKyAgICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9uIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXREZXN0aW5hdGlvbihkYXRhKSB7CisgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldERlc3RpbmF0aW9uIiwgW2RhdGEuaWRdKTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiR2V0UGFnZUxhYmVscyIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUxhYmVscyhkYXRhKSB7CisgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYWJlbHMiKTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiR2V0UGFnZUxheW91dCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUxheW91dChkYXRhKSB7CisgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYXlvdXQiKTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiR2V0UGFnZU1vZGUiLCBmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2VNb2RlKGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygicGFnZU1vZGUiKTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiR2V0Vmlld2VyUHJlZmVyZW5jZXMiLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJ2aWV3ZXJQcmVmZXJlbmNlcyIpOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJHZXRPcGVuQWN0aW9uIiwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygib3BlbkFjdGlvbiIpOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJHZXRBdHRhY2htZW50cyIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0QXR0YWNobWVudHMoZGF0YSkgeworICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhdHRhY2htZW50cyIpOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJHZXRKYXZhU2NyaXB0IiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRKYXZhU2NyaXB0KGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiamF2YVNjcmlwdCIpOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJHZXRPdXRsaW5lIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRPdXRsaW5lKGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZG9jdW1lbnRPdXRsaW5lIik7CisgICAgICB9KTsKKyAgICAgIGhhbmRsZXIub24oIkdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm9wdGlvbmFsQ29udGVudENvbmZpZyIpOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJHZXRQZXJtaXNzaW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBlcm1pc3Npb25zIik7CisgICAgICB9KTsKKyAgICAgIGhhbmRsZXIub24oIkdldE1ldGFkYXRhIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRNZXRhZGF0YShkYXRhKSB7CisgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmVEb2MoImRvY3VtZW50SW5mbyIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm1ldGFkYXRhIildKTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiR2V0RGF0YSIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0RGF0YShkYXRhKSB7CisgICAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpOworICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpLnRoZW4oZnVuY3Rpb24gKHN0cmVhbSkgeworICAgICAgICAgIHJldHVybiBzdHJlYW0uYnl0ZXM7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJHZXRTdGF0cyIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0U3RhdHMoZGF0YSkgeworICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVYUmVmKCJzdGF0cyIpOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJHZXRBbm5vdGF0aW9ucyIsIGZ1bmN0aW9uIChfcmVmNikgeworICAgICAgICB2YXIgcGFnZUluZGV4ID0gX3JlZjYucGFnZUluZGV4LAorICAgICAgICAgICAgaW50ZW50ID0gX3JlZjYuaW50ZW50OworICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgeworICAgICAgICAgIHJldHVybiBwYWdlLmdldEFubm90YXRpb25zRGF0YShpbnRlbnQpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiU2F2ZURvY3VtZW50IiwgZnVuY3Rpb24gKF9yZWY3KSB7CisgICAgICAgIHZhciBudW1QYWdlcyA9IF9yZWY3Lm51bVBhZ2VzLAorICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2UgPSBfcmVmNy5hbm5vdGF0aW9uU3RvcmFnZSwKKyAgICAgICAgICAgIGZpbGVuYW1lID0gX3JlZjcuZmlsZW5hbWU7CisgICAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpOworICAgICAgICB2YXIgcHJvbWlzZXMgPSBbcGRmTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpXTsKKyAgICAgICAgdmFyIGRvY3VtZW50ID0gcGRmTWFuYWdlci5wZGZEb2N1bWVudDsKKworICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChwYWdlSW5kZXgpIHsKKyAgICAgICAgICBwcm9taXNlcy5wdXNoKHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKKyAgICAgICAgICAgIHZhciB0YXNrID0gbmV3IFdvcmtlclRhc2soIlNhdmU6IHBhZ2UgIi5jb25jYXQocGFnZUluZGV4KSk7CisgICAgICAgICAgICByZXR1cm4gcGFnZS5zYXZlKGhhbmRsZXIsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICAgICAgICB9KSk7CisgICAgICAgIH07CisKKyAgICAgICAgZm9yICh2YXIgcGFnZUluZGV4ID0gMDsgcGFnZUluZGV4IDwgbnVtUGFnZXM7IHBhZ2VJbmRleCsrKSB7CisgICAgICAgICAgX2xvb3AocGFnZUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoX3JlZjgpIHsKKyAgICAgICAgICB2YXIgX3JlZjkgPSBfdG9BcnJheShfcmVmOCksCisgICAgICAgICAgICAgIHN0cmVhbSA9IF9yZWY5WzBdLAorICAgICAgICAgICAgICByZWZzID0gX3JlZjkuc2xpY2UoMSk7CisKKyAgICAgICAgICB2YXIgbmV3UmVmcyA9IFtdOworCisgICAgICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHJlZnMpLAorICAgICAgICAgICAgICBfc3RlcDsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgeworICAgICAgICAgICAgICB2YXIgcmVmID0gX3N0ZXAudmFsdWU7CisgICAgICAgICAgICAgIG5ld1JlZnMgPSByZWYuZmlsdGVyKGZ1bmN0aW9uICh4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHggIT09IG51bGw7CisgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeworICAgICAgICAgICAgICAgIHJldHVybiBhLmNvbmNhdChiKTsKKyAgICAgICAgICAgICAgfSwgbmV3UmVmcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgICBfaXRlcmF0b3IuZShlcnIpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfaXRlcmF0b3IuZigpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChuZXdSZWZzLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgeHJlZiA9IGRvY3VtZW50LnhyZWY7CisgICAgICAgICAgdmFyIG5ld1hyZWZJbmZvID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgICAgIGlmICh4cmVmLnRyYWlsZXIpIHsKKyAgICAgICAgICAgIHZhciBfaW5mbyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgICAgIHZhciB4cmVmSW5mbyA9IHhyZWYudHJhaWxlci5nZXQoIkluZm8iKSB8fCBudWxsOworCisgICAgICAgICAgICBpZiAoeHJlZkluZm8pIHsKKyAgICAgICAgICAgICAgeHJlZkluZm8uZm9yRWFjaChmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKGtleSkgJiYgKDAsIF91dGlsLmlzU3RyaW5nKSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgIF9pbmZvW2tleV0gPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXdYcmVmSW5mbyA9IHsKKyAgICAgICAgICAgICAgcm9vdFJlZjogeHJlZi50cmFpbGVyLmdldFJhdygiUm9vdCIpIHx8IG51bGwsCisgICAgICAgICAgICAgIGVuY3J5cHQ6IHhyZWYudHJhaWxlci5nZXRSYXcoIkVuY3J5cHQiKSB8fCBudWxsLAorICAgICAgICAgICAgICBuZXdSZWY6IHhyZWYuZ2V0TmV3UmVmKCksCisgICAgICAgICAgICAgIGluZm9SZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoIkluZm8iKSB8fCBudWxsLAorICAgICAgICAgICAgICBpbmZvOiBfaW5mbywKKyAgICAgICAgICAgICAgZmlsZUlkczogeHJlZi50cmFpbGVyLmdldFJhdygiSUQiKSB8fCBudWxsLAorICAgICAgICAgICAgICBzdGFydFhSZWY6IGRvY3VtZW50LnN0YXJ0WFJlZiwKKyAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lCisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKworICAgICAgICAgIHhyZWYucmVzZXROZXdSZWYoKTsKKyAgICAgICAgICByZXR1cm4gKDAsIF93cml0ZXIuaW5jcmVtZW50YWxVcGRhdGUpKHN0cmVhbS5ieXRlcywgbmV3WHJlZkluZm8sIG5ld1JlZnMpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiR2V0T3BlcmF0b3JMaXN0IiwgZnVuY3Rpb24gd3BoU2V0dXBSZW5kZXJQYWdlKGRhdGEsIHNpbmspIHsKKyAgICAgICAgdmFyIHBhZ2VJbmRleCA9IGRhdGEucGFnZUluZGV4OworICAgICAgICBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICAgICAgdmFyIHRhc2sgPSBuZXcgV29ya2VyVGFzaygiR2V0T3BlcmF0b3JMaXN0OiBwYWdlICIuY29uY2F0KHBhZ2VJbmRleCkpOworICAgICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKKyAgICAgICAgICB2YXIgc3RhcnQgPSB2ZXJib3NpdHkgPj0gX3V0aWwuVmVyYm9zaXR5TGV2ZWwuSU5GT1MgPyBEYXRlLm5vdygpIDogMDsKKyAgICAgICAgICBwYWdlLmdldE9wZXJhdG9yTGlzdCh7CisgICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLAorICAgICAgICAgICAgc2luazogc2luaywKKyAgICAgICAgICAgIHRhc2s6IHRhc2ssCisgICAgICAgICAgICBpbnRlbnQ6IGRhdGEuaW50ZW50LAorICAgICAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogZGF0YS5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IGRhdGEuYW5ub3RhdGlvblN0b3JhZ2UKKyAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChvcGVyYXRvckxpc3RJbmZvKSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOworCisgICAgICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJwYWdlPSIuY29uY2F0KHBhZ2VJbmRleCArIDEsICIgLSBnZXRPcGVyYXRvckxpc3Q6IHRpbWU9IikgKyAiIi5jb25jYXQoRGF0ZS5ub3coKSAtIHN0YXJ0LCAibXMsIGxlbj0iKS5jb25jYXQob3BlcmF0b3JMaXN0SW5mby5sZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisKKyAgICAgICAgICAgIGlmICh0YXNrLnRlcm1pbmF0ZWQpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvck9wZXJhdG9yTGlzdAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfSwgdGhpcyk7CisgICAgICBoYW5kbGVyLm9uKCJHZXRUZXh0Q29udGVudCIsIGZ1bmN0aW9uIHdwaEV4dHJhY3RUZXh0KGRhdGEsIHNpbmspIHsKKyAgICAgICAgdmFyIHBhZ2VJbmRleCA9IGRhdGEucGFnZUluZGV4OworCisgICAgICAgIHNpbmsub25QdWxsID0gZnVuY3Rpb24gKGRlc2lyZWRTaXplKSB7fTsKKworICAgICAgICBzaW5rLm9uQ2FuY2VsID0gZnVuY3Rpb24gKHJlYXNvbikge307CisKKyAgICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgeworICAgICAgICAgIHZhciB0YXNrID0gbmV3IFdvcmtlclRhc2soIkdldFRleHRDb250ZW50OiBwYWdlICIgKyBwYWdlSW5kZXgpOworICAgICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKKyAgICAgICAgICB2YXIgc3RhcnQgPSB2ZXJib3NpdHkgPj0gX3V0aWwuVmVyYm9zaXR5TGV2ZWwuSU5GT1MgPyBEYXRlLm5vdygpIDogMDsKKyAgICAgICAgICBwYWdlLmV4dHJhY3RUZXh0Q29udGVudCh7CisgICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLAorICAgICAgICAgICAgdGFzazogdGFzaywKKyAgICAgICAgICAgIHNpbms6IHNpbmssCisgICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiBkYXRhLm5vcm1hbGl6ZVdoaXRlc3BhY2UsCisgICAgICAgICAgICBjb21iaW5lVGV4dEl0ZW1zOiBkYXRhLmNvbWJpbmVUZXh0SXRlbXMKKyAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisKKyAgICAgICAgICAgIGlmIChzdGFydCkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoInBhZ2U9Ii5jb25jYXQocGFnZUluZGV4ICsgMSwgIiAtIGdldFRleHRDb250ZW50OiB0aW1lPSIpICsgIiIuY29uY2F0KERhdGUubm93KCkgLSBzdGFydCwgIm1zIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaW5rLmNsb3NlKCk7CisgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKKworICAgICAgICAgICAgaWYgKHRhc2sudGVybWluYXRlZCkgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGhhbmRsZXIub24oIkZvbnRGYWxsYmFjayIsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmZvbnRGYWxsYmFjayhkYXRhLmlkLCBoYW5kbGVyKTsKKyAgICAgIH0pOworICAgICAgaGFuZGxlci5vbigiQ2xlYW51cCIsIGZ1bmN0aW9uIHdwaENsZWFudXAoZGF0YSkgeworICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5jbGVhbnVwKHRydWUpOworICAgICAgfSk7CisgICAgICBoYW5kbGVyLm9uKCJUZXJtaW5hdGUiLCBmdW5jdGlvbiB3cGhUZXJtaW5hdGUoZGF0YSkgeworICAgICAgICB0ZXJtaW5hdGVkID0gdHJ1ZTsKKyAgICAgICAgdmFyIHdhaXRPbiA9IFtdOworCisgICAgICAgIGlmIChwZGZNYW5hZ2VyKSB7CisgICAgICAgICAgcGRmTWFuYWdlci50ZXJtaW5hdGUobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOworICAgICAgICAgIHZhciBjbGVhbnVwUHJvbWlzZSA9IHBkZk1hbmFnZXIuY2xlYW51cCgpOworICAgICAgICAgIHdhaXRPbi5wdXNoKGNsZWFudXBQcm9taXNlKTsKKyAgICAgICAgICBwZGZNYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3ByaW1pdGl2ZXMuY2xlYXJQcmltaXRpdmVDYWNoZXMpKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FuY2VsWEhScykgeworICAgICAgICAgIGNhbmNlbFhIUnMobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOworICAgICAgICB9CisKKyAgICAgICAgV29ya2VyVGFza3MuZm9yRWFjaChmdW5jdGlvbiAodGFzaykgeworICAgICAgICAgIHdhaXRPbi5wdXNoKHRhc2suZmluaXNoZWQpOworICAgICAgICAgIHRhc2sudGVybWluYXRlKCk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBoYW5kbGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICBoYW5kbGVyID0gbnVsbDsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGhhbmRsZXIub24oIlJlYWR5IiwgZnVuY3Rpb24gd3BoUmVhZHkoZGF0YSkgeworICAgICAgICBzZXR1cERvYyhkb2NQYXJhbXMpOworICAgICAgICBkb2NQYXJhbXMgPSBudWxsOworICAgICAgfSk7CisgICAgICByZXR1cm4gd29ya2VySGFuZGxlck5hbWU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaW5pdGlhbGl6ZUZyb21Qb3J0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpIHsKKyAgICAgIHZhciBoYW5kbGVyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIndvcmtlciIsICJtYWluIiwgcG9ydCk7CisgICAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cChoYW5kbGVyLCBwb3J0KTsKKyAgICAgIGhhbmRsZXIuc2VuZCgicmVhZHkiLCBudWxsKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gV29ya2VyTWVzc2FnZUhhbmRsZXI7Cit9KCk7CisKK2V4cG9ydHMuV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBXb3JrZXJNZXNzYWdlSGFuZGxlcjsKKworZnVuY3Rpb24gaXNNZXNzYWdlUG9ydChtYXliZVBvcnQpIHsKKyAgcmV0dXJuIHR5cGVvZiBtYXliZVBvcnQucG9zdE1lc3NhZ2UgPT09ICJmdW5jdGlvbiIgJiYgIm9ubWVzc2FnZSIgaW4gbWF5YmVQb3J0OworfQorCitpZiAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgJiYgIV9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiBpc01lc3NhZ2VQb3J0KHNlbGYpKSB7CisgIFdvcmtlck1lc3NhZ2VIYW5kbGVyLmluaXRpYWxpemVGcm9tUG9ydChzZWxmKTsKK30KKworLyoqKi8gfSksCisvKiAyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCittb2R1bGUuZXhwb3J0cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CisKKy8qKiovIH0pLAorLyogMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24obW9kdWxlKSB7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCit2YXIgcnVudGltZSA9IGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlOworICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7CisgIHZhciB1bmRlZmluZWQ7CisgIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiA/IFN5bWJvbCA6IHt9OworICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIjsKKyAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciI7CisgIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOworCisgIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKKyAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgIGVudW1lcmFibGU6IHRydWUsCisgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICB3cml0YWJsZTogdHJ1ZQorICAgIH0pOworICAgIHJldHVybiBvYmpba2V5XTsKKyAgfQorCisgIHRyeSB7CisgICAgZGVmaW5lKHt9LCAiIik7CisgIH0gY2F0Y2ggKGVycikgeworICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7CisgICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7CisgICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTsKKyAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTsKKyAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CisgICAgcmV0dXJuIGdlbmVyYXRvcjsKKyAgfQorCisgIGV4cG9ydHMud3JhcCA9IHdyYXA7CisKKyAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHR5cGU6ICJub3JtYWwiLAorICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpCisgICAgICB9OworICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdHlwZTogInRocm93IiwKKyAgICAgICAgYXJnOiBlcnIKKyAgICAgIH07CisgICAgfQorICB9CisKKyAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSAic3VzcGVuZGVkU3RhcnQiOworICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9ICJzdXNwZW5kZWRZaWVsZCI7CisgIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9ICJleGVjdXRpbmciOworICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSAiY29tcGxldGVkIjsKKyAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTsKKworICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fQorCisgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KKworICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9CisKKyAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CisKKyAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzOworICB9OworCisgIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKKyAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOworCisgIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJiBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiYgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkgeworICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7CisgIH0KKworICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CisgIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7CisgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247CisgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvckZ1bmN0aW9uIik7CisKKyAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgeworICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsKKyAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgeworICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgeworICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gImZ1bmN0aW9uIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7CisgICAgcmV0dXJuIGN0b3IgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSAiR2VuZXJhdG9yRnVuY3Rpb24iIDogZmFsc2U7CisgIH07CisKKyAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgeworICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHsKKyAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlOworICAgICAgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpOworICAgIH0KKworICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTsKKyAgICByZXR1cm4gZ2VuRnVuOworICB9OworCisgIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIF9fYXdhaXQ6IGFyZworICAgIH07CisgIH07CisKKyAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CisgICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpOworCisgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKKyAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7CisgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKKworICAgICAgICBpZiAodmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09ICJvYmplY3QiICYmIGhhc093bi5jYWxsKHZhbHVlLCAiX19hd2FpdCIpKSB7CisgICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgICAgIGludm9rZSgibmV4dCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOworICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAgICAgIGludm9rZSgidGhyb3ciLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7CisgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkOworICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKKworICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHsKKyAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkgeworICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7CisgICAgfQorCisgICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTsKKyAgfQorCisgIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7CisKKyAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjsKKworICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24gKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkgeworICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7CisgICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOworICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikgPyBpdGVyIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsKKyAgICB9KTsKKyAgfTsKKworICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHsKKyAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0OworICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHsKKyAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHsKKyAgICAgICAgaWYgKG1ldGhvZCA9PT0gInRocm93IikgeworICAgICAgICAgIHRocm93IGFyZzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7CisgICAgICB9CisKKyAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kOworICAgICAgY29udGV4dC5hcmcgPSBhcmc7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7CisKKyAgICAgICAgaWYgKGRlbGVnYXRlKSB7CisgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CisKKyAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAibmV4dCIpIHsKKyAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09ICJ0aHJvdyIpIHsKKyAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7CisgICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gInJldHVybiIpIHsKKyAgICAgICAgICBjb250ZXh0LmFicnVwdCgicmV0dXJuIiwgY29udGV4dC5hcmcpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZzsKKyAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOworCisgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gIm5vcm1hbCIpIHsKKyAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IEdlblN0YXRlQ29tcGxldGVkIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDsKKworICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsCisgICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmUKKyAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CisgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDsKKyAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsKKyAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdOworCisgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKworICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAidGhyb3ciKSB7CisgICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvclsicmV0dXJuIl0pIHsKKyAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iOworICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOworICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOworCisgICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAidGhyb3ciKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpOworICAgICAgfQorCisgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICB9CisKKyAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpOworCisgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CisgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7CisgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKyAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgIH0KKworICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZzsKKworICAgIGlmICghaW5mbykgeworICAgICAgY29udGV4dC5tZXRob2QgPSAidGhyb3ciOworICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpOworICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7CisgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICB9CisKKyAgICBpZiAoaW5mby5kb25lKSB7CisgICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTsKKyAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7CisKKyAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gInJldHVybiIpIHsKKyAgICAgICAgY29udGV4dC5tZXRob2QgPSAibmV4dCI7CisgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKyAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgfQorCisgIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7CisgIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKTsKKworICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOworICB9OworCisgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CisgICAgdmFyIGVudHJ5ID0geworICAgICAgdHJ5TG9jOiBsb2NzWzBdCisgICAgfTsKKworICAgIGlmICgxIGluIGxvY3MpIHsKKyAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTsKKyAgICB9CisKKyAgICBpZiAoMiBpbiBsb2NzKSB7CisgICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTsKKyAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTsKKyAgICB9CisKKyAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7CisgIH0KKworICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CisgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307CisgICAgcmVjb3JkLnR5cGUgPSAibm9ybWFsIjsKKyAgICBkZWxldGUgcmVjb3JkLmFyZzsKKyAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOworICB9CisKKyAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkgeworICAgIHRoaXMudHJ5RW50cmllcyA9IFt7CisgICAgICB0cnlMb2M6ICJyb290IgorICAgIH1dOworICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTsKKyAgICB0aGlzLnJlc2V0KHRydWUpOworICB9CisKKyAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKG9iamVjdCkgeworICAgIHZhciBrZXlzID0gW107CisKKyAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7CisgICAgICBrZXlzLnB1c2goa2V5KTsKKyAgICB9CisKKyAgICBrZXlzLnJldmVyc2UoKTsKKyAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHsKKyAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkgeworICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKKworICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgeworICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7CisgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7CisgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbmV4dC5kb25lID0gdHJ1ZTsKKyAgICAgIHJldHVybiBuZXh0OworICAgIH07CisgIH07CisKKyAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7CisgICAgaWYgKGl0ZXJhYmxlKSB7CisgICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07CisKKyAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgeworICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gImZ1bmN0aW9uIikgeworICAgICAgICByZXR1cm4gaXRlcmFibGU7CisgICAgICB9CisKKyAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgeworICAgICAgICB2YXIgaSA9IC0xLAorICAgICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7CisgICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkgeworICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgeworICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07CisgICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkOworICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIG5leHQ6IGRvbmVSZXN1bHQKKyAgICB9OworICB9CisKKyAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7CisKKyAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHsKKyAgICByZXR1cm4geworICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgIGRvbmU6IHRydWUKKyAgICB9OworICB9CisKKyAgQ29udGV4dC5wcm90b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6IENvbnRleHQsCisgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsKKyAgICAgIHRoaXMucHJldiA9IDA7CisgICAgICB0aGlzLm5leHQgPSAwOworICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMuZG9uZSA9IGZhbHNlOworICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7CisgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKKyAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkOworICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7CisKKyAgICAgIGlmICghc2tpcFRlbXBSZXNldCkgeworICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHsKKyAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICJ0IiAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7CisgICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKKyAgICAgIHRoaXMuZG9uZSA9IHRydWU7CisgICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdOworICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjsKKworICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMucnZhbDsKKyAgICB9LAorICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHsKKyAgICAgIGlmICh0aGlzLmRvbmUpIHsKKyAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworICAgICAgfQorCisgICAgICB2YXIgY29udGV4dCA9IHRoaXM7CisKKyAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgeworICAgICAgICByZWNvcmQudHlwZSA9ICJ0aHJvdyI7CisgICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247CisgICAgICAgIGNvbnRleHQubmV4dCA9IGxvYzsKKworICAgICAgICBpZiAoY2F1Z2h0KSB7CisgICAgICAgICAgY29udGV4dC5tZXRob2QgPSAibmV4dCI7CisgICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gISFjYXVnaHQ7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOworICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSAicm9vdCIpIHsKKyAgICAgICAgICByZXR1cm4gaGFuZGxlKCJlbmQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7CisgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpOworICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksICJmaW5hbGx5TG9jIik7CisKKyAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmaW5hbGx5RW50cnkgJiYgKHR5cGUgPT09ICJicmVhayIgfHwgdHlwZSA9PT0gImNvbnRpbnVlIikgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OworICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlOworICAgICAgcmVjb3JkLmFyZyA9IGFyZzsKKworICAgICAgaWYgKGZpbmFsbHlFbnRyeSkgeworICAgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKKyAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7CisgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpOworICAgIH0sCisgICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJlY29yZCwgYWZ0ZXJMb2MpIHsKKyAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICB0aHJvdyByZWNvcmQuYXJnOworICAgICAgfQorCisgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJicmVhayIgfHwgcmVjb3JkLnR5cGUgPT09ICJjb250aW51ZSIpIHsKKyAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZzsKKyAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09ICJyZXR1cm4iKSB7CisgICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZzsKKyAgICAgICAgdGhpcy5tZXRob2QgPSAicmV0dXJuIjsKKyAgICAgICAgdGhpcy5uZXh0ID0gImVuZCI7CisgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAibm9ybWFsIiAmJiBhZnRlckxvYykgeworICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CisgICAgfSwKKyAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgeworICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpOworICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpOworICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKKyAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKKworICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7CisgICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdGhyb3duOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CisgICAgfSwKKyAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7CisgICAgICB0aGlzLmRlbGVnYXRlID0geworICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSwKKyAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKKyAgICAgICAgbmV4dExvYzogbmV4dExvYworICAgICAgfTsKKworICAgICAgaWYgKHRoaXMubWV0aG9kID09PSAibmV4dCIpIHsKKyAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIGV4cG9ydHM7Cit9KCggZmFsc2UgPyB1bmRlZmluZWQgOiBfdHlwZW9mKG1vZHVsZSkpID09PSAib2JqZWN0IiA/IG1vZHVsZS5leHBvcnRzIDoge30pOworCit0cnkgeworICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOworfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKKyAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOworfQorLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKHRoaXMsIF9fd19wZGZqc19yZXF1aXJlX18oNCkobW9kdWxlKSkpCisKKy8qKiovIH0pLAorLyogNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobW9kdWxlKSB7CisgIGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkgeworICAgIG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbiAoKSB7fTsKKworICAgIG1vZHVsZS5wYXRocyA9IFtdOworICAgIGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAibG9hZGVkIiwgeworICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbW9kdWxlLmw7CisgICAgICB9CisgICAgfSk7CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgImlkIiwgeworICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbW9kdWxlLmk7CisgICAgICB9CisgICAgfSk7CisgICAgbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7CisgIH0KKworICByZXR1cm4gbW9kdWxlOworfTsKKworLyoqKi8gfSksCisvKiA1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuYXJyYXlCeXRlTGVuZ3RoID0gYXJyYXlCeXRlTGVuZ3RoOworZXhwb3J0cy5hcnJheXNUb0J5dGVzID0gYXJyYXlzVG9CeXRlczsKK2V4cG9ydHMuYXNzZXJ0ID0gYXNzZXJ0OworZXhwb3J0cy5ieXRlc1RvU3RyaW5nID0gYnl0ZXNUb1N0cmluZzsKK2V4cG9ydHMuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eTsKK2V4cG9ydHMuZXNjYXBlU3RyaW5nID0gZXNjYXBlU3RyaW5nOworZXhwb3J0cy5nZXRNb2RpZmljYXRpb25EYXRlID0gZ2V0TW9kaWZpY2F0aW9uRGF0ZTsKK2V4cG9ydHMuZ2V0VmVyYm9zaXR5TGV2ZWwgPSBnZXRWZXJib3NpdHlMZXZlbDsKK2V4cG9ydHMuaW5mbyA9IGluZm87CitleHBvcnRzLmlzQXJyYXlCdWZmZXIgPSBpc0FycmF5QnVmZmVyOworZXhwb3J0cy5pc0FycmF5RXF1YWwgPSBpc0FycmF5RXF1YWw7CitleHBvcnRzLmlzQm9vbCA9IGlzQm9vbDsKK2V4cG9ydHMuaXNOdW0gPSBpc051bTsKK2V4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZzsKK2V4cG9ydHMuaXNTYW1lT3JpZ2luID0gaXNTYW1lT3JpZ2luOworZXhwb3J0cy5jcmVhdGVWYWxpZEFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDsKK2V4cG9ydHMucmVtb3ZlTnVsbENoYXJhY3RlcnMgPSByZW1vdmVOdWxsQ2hhcmFjdGVyczsKK2V4cG9ydHMuc2V0VmVyYm9zaXR5TGV2ZWwgPSBzZXRWZXJib3NpdHlMZXZlbDsKK2V4cG9ydHMuc2hhZG93ID0gc2hhZG93OworZXhwb3J0cy5zdHJpbmczMiA9IHN0cmluZzMyOworZXhwb3J0cy5zdHJpbmdUb0J5dGVzID0gc3RyaW5nVG9CeXRlczsKK2V4cG9ydHMuc3RyaW5nVG9QREZTdHJpbmcgPSBzdHJpbmdUb1BERlN0cmluZzsKK2V4cG9ydHMuc3RyaW5nVG9VVEY4U3RyaW5nID0gc3RyaW5nVG9VVEY4U3RyaW5nOworZXhwb3J0cy51dGY4U3RyaW5nVG9TdHJpbmcgPSB1dGY4U3RyaW5nVG9TdHJpbmc7CitleHBvcnRzLndhcm4gPSB3YXJuOworZXhwb3J0cy51bnJlYWNoYWJsZSA9IHVucmVhY2hhYmxlOworZXhwb3J0cy5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSBleHBvcnRzLklzTGl0dGxlRW5kaWFuQ2FjaGVkID0gZXhwb3J0cy5jcmVhdGVPYmplY3RVUkwgPSBleHBvcnRzLkZvcm1hdEVycm9yID0gZXhwb3J0cy5VdGlsID0gZXhwb3J0cy5Vbmtub3duRXJyb3JFeGNlcHRpb24gPSBleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IGV4cG9ydHMuVGV4dFJlbmRlcmluZ01vZGUgPSBleHBvcnRzLlN0cmVhbVR5cGUgPSBleHBvcnRzLlBlcm1pc3Npb25GbGFnID0gZXhwb3J0cy5QYXNzd29yZFJlc3BvbnNlcyA9IGV4cG9ydHMuUGFzc3dvcmRFeGNlcHRpb24gPSBleHBvcnRzLk1pc3NpbmdQREZFeGNlcHRpb24gPSBleHBvcnRzLkludmFsaWRQREZFeGNlcHRpb24gPSBleHBvcnRzLkFib3J0RXhjZXB0aW9uID0gZXhwb3J0cy5DTWFwQ29tcHJlc3Npb25UeXBlID0gZXhwb3J0cy5JbWFnZUtpbmQgPSBleHBvcnRzLkZvbnRUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSBleHBvcnRzLkFubm90YXRpb25SZXBseVR5cGUgPSBleHBvcnRzLkFubm90YXRpb25NYXJrZWRTdGF0ZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkZsYWcgPSBleHBvcnRzLkFubm90YXRpb25GaWVsZEZsYWcgPSBleHBvcnRzLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSBleHBvcnRzLlVOU1VQUE9SVEVEX0ZFQVRVUkVTID0gZXhwb3J0cy5WZXJib3NpdHlMZXZlbCA9IGV4cG9ydHMuT1BTID0gZXhwb3J0cy5JREVOVElUWV9NQVRSSVggPSBleHBvcnRzLkZPTlRfSURFTlRJVFlfTUFUUklYID0gZXhwb3J0cy5CYXNlRXhjZXB0aW9uID0gdm9pZCAwOworCitfX3dfcGRmanNfcmVxdWlyZV9fKDYpOworCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKwordmFyIElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKK2V4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gSURFTlRJVFlfTUFUUklYOwordmFyIEZPTlRfSURFTlRJVFlfTUFUUklYID0gWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF07CitleHBvcnRzLkZPTlRfSURFTlRJVFlfTUFUUklYID0gRk9OVF9JREVOVElUWV9NQVRSSVg7Cit2YXIgUGVybWlzc2lvbkZsYWcgPSB7CisgIFBSSU5UOiAweDA0LAorICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsCisgIENPUFk6IDB4MTAsCisgIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCwKKyAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsCisgIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLAorICBBU1NFTUJMRTogMHg0MDAsCisgIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAKK307CitleHBvcnRzLlBlcm1pc3Npb25GbGFnID0gUGVybWlzc2lvbkZsYWc7Cit2YXIgVGV4dFJlbmRlcmluZ01vZGUgPSB7CisgIEZJTEw6IDAsCisgIFNUUk9LRTogMSwKKyAgRklMTF9TVFJPS0U6IDIsCisgIElOVklTSUJMRTogMywKKyAgRklMTF9BRERfVE9fUEFUSDogNCwKKyAgU1RST0tFX0FERF9UT19QQVRIOiA1LAorICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNiwKKyAgQUREX1RPX1BBVEg6IDcsCisgIEZJTExfU1RST0tFX01BU0s6IDMsCisgIEFERF9UT19QQVRIX0ZMQUc6IDQKK307CitleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGU7Cit2YXIgSW1hZ2VLaW5kID0geworICBHUkFZU0NBTEVfMUJQUDogMSwKKyAgUkdCXzI0QlBQOiAyLAorICBSR0JBXzMyQlBQOiAzCit9OworZXhwb3J0cy5JbWFnZUtpbmQgPSBJbWFnZUtpbmQ7Cit2YXIgQW5ub3RhdGlvblR5cGUgPSB7CisgIFRFWFQ6IDEsCisgIExJTks6IDIsCisgIEZSRUVURVhUOiAzLAorICBMSU5FOiA0LAorICBTUVVBUkU6IDUsCisgIENJUkNMRTogNiwKKyAgUE9MWUdPTjogNywKKyAgUE9MWUxJTkU6IDgsCisgIEhJR0hMSUdIVDogOSwKKyAgVU5ERVJMSU5FOiAxMCwKKyAgU1FVSUdHTFk6IDExLAorICBTVFJJS0VPVVQ6IDEyLAorICBTVEFNUDogMTMsCisgIENBUkVUOiAxNCwKKyAgSU5LOiAxNSwKKyAgUE9QVVA6IDE2LAorICBGSUxFQVRUQUNITUVOVDogMTcsCisgIFNPVU5EOiAxOCwKKyAgTU9WSUU6IDE5LAorICBXSURHRVQ6IDIwLAorICBTQ1JFRU46IDIxLAorICBQUklOVEVSTUFSSzogMjIsCisgIFRSQVBORVQ6IDIzLAorICBXQVRFUk1BUks6IDI0LAorICBUSFJFRUQ6IDI1LAorICBSRURBQ1Q6IDI2Cit9OworZXhwb3J0cy5Bbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlOwordmFyIEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHsKKyAgTUFSS0VEOiAiTWFya2VkIiwKKyAgUkVWSUVXOiAiUmV2aWV3IgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0gQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlOwordmFyIEFubm90YXRpb25NYXJrZWRTdGF0ZSA9IHsKKyAgTUFSS0VEOiAiTWFya2VkIiwKKyAgVU5NQVJLRUQ6ICJVbm1hcmtlZCIKK307CitleHBvcnRzLkFubm90YXRpb25NYXJrZWRTdGF0ZSA9IEFubm90YXRpb25NYXJrZWRTdGF0ZTsKK3ZhciBBbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSB7CisgIEFDQ0VQVEVEOiAiQWNjZXB0ZWQiLAorICBSRUpFQ1RFRDogIlJlamVjdGVkIiwKKyAgQ0FOQ0VMTEVEOiAiQ2FuY2VsbGVkIiwKKyAgQ09NUExFVEVEOiAiQ29tcGxldGVkIiwKKyAgTk9ORTogIk5vbmUiCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSBBbm5vdGF0aW9uUmV2aWV3U3RhdGU7Cit2YXIgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHsKKyAgR1JPVVA6ICJHcm91cCIsCisgIFJFUExZOiAiUiIKK307CitleHBvcnRzLkFubm90YXRpb25SZXBseVR5cGUgPSBBbm5vdGF0aW9uUmVwbHlUeXBlOwordmFyIEFubm90YXRpb25GbGFnID0geworICBJTlZJU0lCTEU6IDB4MDEsCisgIEhJRERFTjogMHgwMiwKKyAgUFJJTlQ6IDB4MDQsCisgIE5PWk9PTTogMHgwOCwKKyAgTk9ST1RBVEU6IDB4MTAsCisgIE5PVklFVzogMHgyMCwKKyAgUkVBRE9OTFk6IDB4NDAsCisgIExPQ0tFRDogMHg4MCwKKyAgVE9HR0xFTk9WSUVXOiAweDEwMCwKKyAgTE9DS0VEQ09OVEVOVFM6IDB4MjAwCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uRmxhZyA9IEFubm90YXRpb25GbGFnOwordmFyIEFubm90YXRpb25GaWVsZEZsYWcgPSB7CisgIFJFQURPTkxZOiAweDAwMDAwMDEsCisgIFJFUVVJUkVEOiAweDAwMDAwMDIsCisgIE5PRVhQT1JUOiAweDAwMDAwMDQsCisgIE1VTFRJTElORTogMHgwMDAxMDAwLAorICBQQVNTV09SRDogMHgwMDAyMDAwLAorICBOT1RPR0dMRVRPT0ZGOiAweDAwMDQwMDAsCisgIFJBRElPOiAweDAwMDgwMDAsCisgIFBVU0hCVVRUT046IDB4MDAxMDAwMCwKKyAgQ09NQk86IDB4MDAyMDAwMCwKKyAgRURJVDogMHgwMDQwMDAwLAorICBTT1JUOiAweDAwODAwMDAsCisgIEZJTEVTRUxFQ1Q6IDB4MDEwMDAwMCwKKyAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKKyAgRE9OT1RTUEVMTENIRUNLOiAweDA0MDAwMDAsCisgIERPTk9UU0NST0xMOiAweDA4MDAwMDAsCisgIENPTUI6IDB4MTAwMDAwMCwKKyAgUklDSFRFWFQ6IDB4MjAwMDAwMCwKKyAgUkFESU9TSU5VTklTT046IDB4MjAwMDAwMCwKKyAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IEFubm90YXRpb25GaWVsZEZsYWc7Cit2YXIgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IHsKKyAgU09MSUQ6IDEsCisgIERBU0hFRDogMiwKKyAgQkVWRUxFRDogMywKKyAgSU5TRVQ6IDQsCisgIFVOREVSTElORTogNQorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU7Cit2YXIgU3RyZWFtVHlwZSA9IHsKKyAgVU5LTk9XTjogIlVOS05PV04iLAorICBGTEFURTogIkZMQVRFIiwKKyAgTFpXOiAiTFpXIiwKKyAgRENUOiAiRENUIiwKKyAgSlBYOiAiSlBYIiwKKyAgSkJJRzogIkpCSUciLAorICBBODU6ICJBODUiLAorICBBSFg6ICJBSFgiLAorICBDQ0Y6ICJDQ0YiLAorICBSTFg6ICJSTFgiCit9OworZXhwb3J0cy5TdHJlYW1UeXBlID0gU3RyZWFtVHlwZTsKK3ZhciBGb250VHlwZSA9IHsKKyAgVU5LTk9XTjogIlVOS05PV04iLAorICBUWVBFMTogIlRZUEUxIiwKKyAgVFlQRTFDOiAiVFlQRTFDIiwKKyAgQ0lERk9OVFRZUEUwOiAiQ0lERk9OVFRZUEUwIiwKKyAgQ0lERk9OVFRZUEUwQzogIkNJREZPTlRUWVBFMEMiLAorICBUUlVFVFlQRTogIlRSVUVUWVBFIiwKKyAgQ0lERk9OVFRZUEUyOiAiQ0lERk9OVFRZUEUyIiwKKyAgVFlQRTM6ICJUWVBFMyIsCisgIE9QRU5UWVBFOiAiT1BFTlRZUEUiLAorICBUWVBFMDogIlRZUEUwIiwKKyAgTU1UWVBFMTogIk1NVFlQRTEiCit9OworZXhwb3J0cy5Gb250VHlwZSA9IEZvbnRUeXBlOwordmFyIFZlcmJvc2l0eUxldmVsID0geworICBFUlJPUlM6IDAsCisgIFdBUk5JTkdTOiAxLAorICBJTkZPUzogNQorfTsKK2V4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBWZXJib3NpdHlMZXZlbDsKK3ZhciBDTWFwQ29tcHJlc3Npb25UeXBlID0geworICBOT05FOiAwLAorICBCSU5BUlk6IDEsCisgIFNUUkVBTTogMgorfTsKK2V4cG9ydHMuQ01hcENvbXByZXNzaW9uVHlwZSA9IENNYXBDb21wcmVzc2lvblR5cGU7Cit2YXIgT1BTID0geworICBkZXBlbmRlbmN5OiAxLAorICBzZXRMaW5lV2lkdGg6IDIsCisgIHNldExpbmVDYXA6IDMsCisgIHNldExpbmVKb2luOiA0LAorICBzZXRNaXRlckxpbWl0OiA1LAorICBzZXREYXNoOiA2LAorICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsCisgIHNldEZsYXRuZXNzOiA4LAorICBzZXRHU3RhdGU6IDksCisgIHNhdmU6IDEwLAorICByZXN0b3JlOiAxMSwKKyAgdHJhbnNmb3JtOiAxMiwKKyAgbW92ZVRvOiAxMywKKyAgbGluZVRvOiAxNCwKKyAgY3VydmVUbzogMTUsCisgIGN1cnZlVG8yOiAxNiwKKyAgY3VydmVUbzM6IDE3LAorICBjbG9zZVBhdGg6IDE4LAorICByZWN0YW5nbGU6IDE5LAorICBzdHJva2U6IDIwLAorICBjbG9zZVN0cm9rZTogMjEsCisgIGZpbGw6IDIyLAorICBlb0ZpbGw6IDIzLAorICBmaWxsU3Ryb2tlOiAyNCwKKyAgZW9GaWxsU3Ryb2tlOiAyNSwKKyAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKKyAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LAorICBlbmRQYXRoOiAyOCwKKyAgY2xpcDogMjksCisgIGVvQ2xpcDogMzAsCisgIGJlZ2luVGV4dDogMzEsCisgIGVuZFRleHQ6IDMyLAorICBzZXRDaGFyU3BhY2luZzogMzMsCisgIHNldFdvcmRTcGFjaW5nOiAzNCwKKyAgc2V0SFNjYWxlOiAzNSwKKyAgc2V0TGVhZGluZzogMzYsCisgIHNldEZvbnQ6IDM3LAorICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsCisgIHNldFRleHRSaXNlOiAzOSwKKyAgbW92ZVRleHQ6IDQwLAorICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAorICBzZXRUZXh0TWF0cml4OiA0MiwKKyAgbmV4dExpbmU6IDQzLAorICBzaG93VGV4dDogNDQsCisgIHNob3dTcGFjZWRUZXh0OiA0NSwKKyAgbmV4dExpbmVTaG93VGV4dDogNDYsCisgIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKKyAgc2V0Q2hhcldpZHRoOiA0OCwKKyAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSwKKyAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCisgIHNldEZpbGxDb2xvclNwYWNlOiA1MSwKKyAgc2V0U3Ryb2tlQ29sb3I6IDUyLAorICBzZXRTdHJva2VDb2xvck46IDUzLAorICBzZXRGaWxsQ29sb3I6IDU0LAorICBzZXRGaWxsQ29sb3JOOiA1NSwKKyAgc2V0U3Ryb2tlR3JheTogNTYsCisgIHNldEZpbGxHcmF5OiA1NywKKyAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LAorICBzZXRGaWxsUkdCQ29sb3I6IDU5LAorICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLAorICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSwKKyAgc2hhZGluZ0ZpbGw6IDYyLAorICBiZWdpbklubGluZUltYWdlOiA2MywKKyAgYmVnaW5JbWFnZURhdGE6IDY0LAorICBlbmRJbmxpbmVJbWFnZTogNjUsCisgIHBhaW50WE9iamVjdDogNjYsCisgIG1hcmtQb2ludDogNjcsCisgIG1hcmtQb2ludFByb3BzOiA2OCwKKyAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSwKKyAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLAorICBlbmRNYXJrZWRDb250ZW50OiA3MSwKKyAgYmVnaW5Db21wYXQ6IDcyLAorICBlbmRDb21wYXQ6IDczLAorICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAorICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSwKKyAgYmVnaW5Hcm91cDogNzYsCisgIGVuZEdyb3VwOiA3NywKKyAgYmVnaW5Bbm5vdGF0aW9uczogNzgsCisgIGVuZEFubm90YXRpb25zOiA3OSwKKyAgYmVnaW5Bbm5vdGF0aW9uOiA4MCwKKyAgZW5kQW5ub3RhdGlvbjogODEsCisgIHBhaW50SnBlZ1hPYmplY3Q6IDgyLAorICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLAorICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsCisgIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKKyAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LAorICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NywKKyAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAorICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LAorICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLAorICBjb25zdHJ1Y3RQYXRoOiA5MQorfTsKK2V4cG9ydHMuT1BTID0gT1BTOwordmFyIFVOU1VQUE9SVEVEX0ZFQVRVUkVTID0geworICB1bmtub3duOiAidW5rbm93biIsCisgIGZvcm1zOiAiZm9ybXMiLAorICBqYXZhU2NyaXB0OiAiamF2YVNjcmlwdCIsCisgIHNtYXNrOiAic21hc2siLAorICBzaGFkaW5nUGF0dGVybjogInNoYWRpbmdQYXR0ZXJuIiwKKyAgZm9udDogImZvbnQiLAorICBlcnJvclRpbGluZ1BhdHRlcm46ICJlcnJvclRpbGluZ1BhdHRlcm4iLAorICBlcnJvckV4dEdTdGF0ZTogImVycm9yRXh0R1N0YXRlIiwKKyAgZXJyb3JYT2JqZWN0OiAiZXJyb3JYT2JqZWN0IiwKKyAgZXJyb3JGb250TG9hZFR5cGUzOiAiZXJyb3JGb250TG9hZFR5cGUzIiwKKyAgZXJyb3JGb250U3RhdGU6ICJlcnJvckZvbnRTdGF0ZSIsCisgIGVycm9yRm9udE1pc3Npbmc6ICJlcnJvckZvbnRNaXNzaW5nIiwKKyAgZXJyb3JGb250VHJhbnNsYXRlOiAiZXJyb3JGb250VHJhbnNsYXRlIiwKKyAgZXJyb3JDb2xvclNwYWNlOiAiZXJyb3JDb2xvclNwYWNlIiwKKyAgZXJyb3JPcGVyYXRvckxpc3Q6ICJlcnJvck9wZXJhdG9yTGlzdCIsCisgIGVycm9yRm9udFRvVW5pY29kZTogImVycm9yRm9udFRvVW5pY29kZSIsCisgIGVycm9yRm9udExvYWROYXRpdmU6ICJlcnJvckZvbnRMb2FkTmF0aXZlIiwKKyAgZXJyb3JGb250R2V0UGF0aDogImVycm9yRm9udEdldFBhdGgiLAorICBlcnJvck1hcmtlZENvbnRlbnQ6ICJlcnJvck1hcmtlZENvbnRlbnQiCit9OworZXhwb3J0cy5VTlNVUFBPUlRFRF9GRUFUVVJFUyA9IFVOU1VQUE9SVEVEX0ZFQVRVUkVTOwordmFyIFBhc3N3b3JkUmVzcG9uc2VzID0geworICBORUVEX1BBU1NXT1JEOiAxLAorICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIKK307CitleHBvcnRzLlBhc3N3b3JkUmVzcG9uc2VzID0gUGFzc3dvcmRSZXNwb25zZXM7Cit2YXIgdmVyYm9zaXR5ID0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1M7CisKK2Z1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGxldmVsKSB7CisgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkgeworICAgIHZlcmJvc2l0eSA9IGxldmVsOworICB9Cit9CisKK2Z1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkgeworICByZXR1cm4gdmVyYm9zaXR5OworfQorCitmdW5jdGlvbiBpbmZvKG1zZykgeworICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLklORk9TKSB7CisgICAgY29uc29sZS5sb2coIkluZm86ICIuY29uY2F0KG1zZykpOworICB9Cit9CisKK2Z1bmN0aW9uIHdhcm4obXNnKSB7CisgIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1MpIHsKKyAgICBjb25zb2xlLmxvZygiV2FybmluZzogIi5jb25jYXQobXNnKSk7CisgIH0KK30KKworZnVuY3Rpb24gdW5yZWFjaGFibGUobXNnKSB7CisgIHRocm93IG5ldyBFcnJvcihtc2cpOworfQorCitmdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7CisgIGlmICghY29uZCkgeworICAgIHVucmVhY2hhYmxlKG1zZyk7CisgIH0KK30KKworZnVuY3Rpb24gaXNTYW1lT3JpZ2luKGJhc2VVcmwsIG90aGVyVXJsKSB7CisgIHZhciBiYXNlOworCisgIHRyeSB7CisgICAgYmFzZSA9IG5ldyBVUkwoYmFzZVVybCk7CisKKyAgICBpZiAoIWJhc2Uub3JpZ2luIHx8IGJhc2Uub3JpZ2luID09PSAibnVsbCIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2YXIgb3RoZXIgPSBuZXcgVVJMKG90aGVyVXJsLCBiYXNlKTsKKyAgcmV0dXJuIGJhc2Uub3JpZ2luID09PSBvdGhlci5vcmlnaW47Cit9CisKK2Z1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2wodXJsKSB7CisgIGlmICghdXJsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHsKKyAgICBjYXNlICJodHRwOiI6CisgICAgY2FzZSAiaHR0cHM6IjoKKyAgICBjYXNlICJmdHA6IjoKKyAgICBjYXNlICJtYWlsdG86IjoKKyAgICBjYXNlICJ0ZWw6IjoKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitmdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgYmFzZVVybCkgeworICBpZiAoIXVybCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgdHJ5IHsKKyAgICB2YXIgYWJzb2x1dGVVcmwgPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpOworCisgICAgaWYgKF9pc1ZhbGlkUHJvdG9jb2woYWJzb2x1dGVVcmwpKSB7CisgICAgICByZXR1cm4gYWJzb2x1dGVVcmw7CisgICAgfQorICB9IGNhdGNoIChleCkge30KKworICByZXR1cm4gbnVsbDsKK30KKworZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUpIHsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgeworICAgIHZhbHVlOiB2YWx1ZSwKKyAgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICB3cml0YWJsZTogZmFsc2UKKyAgfSk7CisgIHJldHVybiB2YWx1ZTsKK30KKwordmFyIEJhc2VFeGNlcHRpb24gPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VFeGNlcHRpb24pIHsKKyAgICAgIHVucmVhY2hhYmxlKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLiIpOworICAgIH0KKworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB9CisKKyAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKKyAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247CisgIHJldHVybiBCYXNlRXhjZXB0aW9uOworfSgpOworCitleHBvcnRzLkJhc2VFeGNlcHRpb24gPSBCYXNlRXhjZXB0aW9uOworCit2YXIgUGFzc3dvcmRFeGNlcHRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlRXhjZXB0aW9uKSB7CisgIF9pbmhlcml0cyhQYXNzd29yZEV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24pOworCisgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUGFzc3dvcmRFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIFBhc3N3b3JkRXhjZXB0aW9uKG1zZywgY29kZSkgeworICAgIHZhciBfdGhpczsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXNzd29yZEV4Y2VwdGlvbik7CisKKyAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZyk7CisgICAgX3RoaXMuY29kZSA9IGNvZGU7CisgICAgcmV0dXJuIF90aGlzOworICB9CisKKyAgcmV0dXJuIFBhc3N3b3JkRXhjZXB0aW9uOworfShCYXNlRXhjZXB0aW9uKTsKKworZXhwb3J0cy5QYXNzd29yZEV4Y2VwdGlvbiA9IFBhc3N3b3JkRXhjZXB0aW9uOworCit2YXIgVW5rbm93bkVycm9yRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjIpIHsKKyAgX2luaGVyaXRzKFVua25vd25FcnJvckV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24yKTsKKworICB2YXIgX3N1cGVyMiA9IF9jcmVhdGVTdXBlcihVbmtub3duRXJyb3JFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIFVua25vd25FcnJvckV4Y2VwdGlvbihtc2csIGRldGFpbHMpIHsKKyAgICB2YXIgX3RoaXMyOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVua25vd25FcnJvckV4Y2VwdGlvbik7CisKKyAgICBfdGhpczIgPSBfc3VwZXIyLmNhbGwodGhpcywgbXNnKTsKKyAgICBfdGhpczIuZGV0YWlscyA9IGRldGFpbHM7CisgICAgcmV0dXJuIF90aGlzMjsKKyAgfQorCisgIHJldHVybiBVbmtub3duRXJyb3JFeGNlcHRpb247Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IFVua25vd25FcnJvckV4Y2VwdGlvbjsKKwordmFyIEludmFsaWRQREZFeGNlcHRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlRXhjZXB0aW9uMykgeworICBfaW5oZXJpdHMoSW52YWxpZFBERkV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24zKTsKKworICB2YXIgX3N1cGVyMyA9IF9jcmVhdGVTdXBlcihJbnZhbGlkUERGRXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBJbnZhbGlkUERGRXhjZXB0aW9uKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZhbGlkUERGRXhjZXB0aW9uKTsKKworICAgIHJldHVybiBfc3VwZXIzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICByZXR1cm4gSW52YWxpZFBERkV4Y2VwdGlvbjsKK30oQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IEludmFsaWRQREZFeGNlcHRpb247CisKK3ZhciBNaXNzaW5nUERGRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjQpIHsKKyAgX2luaGVyaXRzKE1pc3NpbmdQREZFeGNlcHRpb24sIF9CYXNlRXhjZXB0aW9uNCk7CisKKyAgdmFyIF9zdXBlcjQgPSBfY3JlYXRlU3VwZXIoTWlzc2luZ1BERkV4Y2VwdGlvbik7CisKKyAgZnVuY3Rpb24gTWlzc2luZ1BERkV4Y2VwdGlvbigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWlzc2luZ1BERkV4Y2VwdGlvbik7CisKKyAgICByZXR1cm4gX3N1cGVyNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9CisKKyAgcmV0dXJuIE1pc3NpbmdQREZFeGNlcHRpb247Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLk1pc3NpbmdQREZFeGNlcHRpb24gPSBNaXNzaW5nUERGRXhjZXB0aW9uOworCit2YXIgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjUpIHsKKyAgX2luaGVyaXRzKFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb241KTsKKworICB2YXIgX3N1cGVyNSA9IF9jcmVhdGVTdXBlcihVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihtc2csIHN0YXR1cykgeworICAgIHZhciBfdGhpczM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKTsKKworICAgIF90aGlzMyA9IF9zdXBlcjUuY2FsbCh0aGlzLCBtc2cpOworICAgIF90aGlzMy5zdGF0dXMgPSBzdGF0dXM7CisgICAgcmV0dXJuIF90aGlzMzsKKyAgfQorCisgIHJldHVybiBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb247Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjsKKwordmFyIEZvcm1hdEVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjYpIHsKKyAgX2luaGVyaXRzKEZvcm1hdEVycm9yLCBfQmFzZUV4Y2VwdGlvbjYpOworCisgIHZhciBfc3VwZXI2ID0gX2NyZWF0ZVN1cGVyKEZvcm1hdEVycm9yKTsKKworICBmdW5jdGlvbiBGb3JtYXRFcnJvcigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0RXJyb3IpOworCisgICAgcmV0dXJuIF9zdXBlcjYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfQorCisgIHJldHVybiBGb3JtYXRFcnJvcjsKK30oQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuRm9ybWF0RXJyb3IgPSBGb3JtYXRFcnJvcjsKKwordmFyIEFib3J0RXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjcpIHsKKyAgX2luaGVyaXRzKEFib3J0RXhjZXB0aW9uLCBfQmFzZUV4Y2VwdGlvbjcpOworCisgIHZhciBfc3VwZXI3ID0gX2NyZWF0ZVN1cGVyKEFib3J0RXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBBYm9ydEV4Y2VwdGlvbigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWJvcnRFeGNlcHRpb24pOworCisgICAgcmV0dXJuIF9zdXBlcjcuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfQorCisgIHJldHVybiBBYm9ydEV4Y2VwdGlvbjsKK30oQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuQWJvcnRFeGNlcHRpb24gPSBBYm9ydEV4Y2VwdGlvbjsKK3ZhciBOdWxsQ2hhcmFjdGVyc1JlZ0V4cCA9IC9ceDAwL2c7CisKK2Z1bmN0aW9uIHJlbW92ZU51bGxDaGFyYWN0ZXJzKHN0cikgeworICBpZiAodHlwZW9mIHN0ciAhPT0gInN0cmluZyIpIHsKKyAgICB3YXJuKCJUaGUgYXJndW1lbnQgZm9yIHJlbW92ZU51bGxDaGFyYWN0ZXJzIG11c3QgYmUgYSBzdHJpbmcuIik7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIHJldHVybiBzdHIucmVwbGFjZShOdWxsQ2hhcmFjdGVyc1JlZ0V4cCwgIiIpOworfQorCitmdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7CisgIGFzc2VydChieXRlcyAhPT0gbnVsbCAmJiBfdHlwZW9mKGJ5dGVzKSA9PT0gIm9iamVjdCIgJiYgYnl0ZXMubGVuZ3RoICE9PSB1bmRlZmluZWQsICJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7CisgIHZhciBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisgIHZhciBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyOworCisgIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKKyAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7CisgIH0KKworICB2YXIgc3RyQnVmID0gW107CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7CisgICAgdmFyIGNodW5rRW5kID0gTWF0aC5taW4oaSArIE1BWF9BUkdVTUVOVF9DT1VOVCwgbGVuZ3RoKTsKKyAgICB2YXIgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7CisgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpOworICB9CisKKyAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHsKKyAgYXNzZXJ0KHR5cGVvZiBzdHIgPT09ICJzdHJpbmciLCAiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpOworICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDsKKyAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKKworICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7CisgIH0KKworICByZXR1cm4gYnl0ZXM7Cit9CisKK2Z1bmN0aW9uIGFycmF5Qnl0ZUxlbmd0aChhcnIpIHsKKyAgaWYgKGFyci5sZW5ndGggIT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybiBhcnIubGVuZ3RoOworICB9CisKKyAgYXNzZXJ0KGFyci5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQsICJhcnJheUJ5dGVMZW5ndGggLSBpbnZhbGlkIGFyZ3VtZW50LiIpOworICByZXR1cm4gYXJyLmJ5dGVMZW5ndGg7Cit9CisKK2Z1bmN0aW9uIGFycmF5c1RvQnl0ZXMoYXJyKSB7CisgIHZhciBsZW5ndGggPSBhcnIubGVuZ3RoOworCisgIGlmIChsZW5ndGggPT09IDEgJiYgYXJyWzBdIGluc3RhbmNlb2YgVWludDhBcnJheSkgeworICAgIHJldHVybiBhcnJbMF07CisgIH0KKworICB2YXIgcmVzdWx0TGVuZ3RoID0gMDsKKworICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgcmVzdWx0TGVuZ3RoICs9IGFycmF5Qnl0ZUxlbmd0aChhcnJbaV0pOworICB9CisKKyAgdmFyIHBvcyA9IDA7CisgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0TGVuZ3RoKTsKKworICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuZ3RoOyBfaSsrKSB7CisgICAgdmFyIGl0ZW0gPSBhcnJbX2ldOworCisgICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7CisgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CisgICAgICAgIGl0ZW0gPSBzdHJpbmdUb0J5dGVzKGl0ZW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaXRlbSA9IG5ldyBVaW50OEFycmF5KGl0ZW0pOworICAgICAgfQorICAgIH0KKworICAgIHZhciBpdGVtTGVuZ3RoID0gaXRlbS5ieXRlTGVuZ3RoOworICAgIGRhdGEuc2V0KGl0ZW0sIHBvcyk7CisgICAgcG9zICs9IGl0ZW1MZW5ndGg7CisgIH0KKworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHsKKyAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOworfQorCitmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHsKKyAgdmFyIGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTsKKyAgYnVmZmVyOFswXSA9IDE7CisgIHZhciB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpOworICByZXR1cm4gdmlldzMyWzBdID09PSAxOworfQorCit2YXIgSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSB7CisgIGdldCB2YWx1ZSgpIHsKKyAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2YWx1ZSIsIGlzTGl0dGxlRW5kaWFuKCkpOworICB9CisKK307CitleHBvcnRzLklzTGl0dGxlRW5kaWFuQ2FjaGVkID0gSXNMaXR0bGVFbmRpYW5DYWNoZWQ7CisKK2Z1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHsKKyAgdHJ5IHsKKyAgICBuZXcgRnVuY3Rpb24oIiIpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZhciBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSB7CisgIGdldCB2YWx1ZSgpIHsKKyAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2YWx1ZSIsIGlzRXZhbFN1cHBvcnRlZCgpKTsKKyAgfQorCit9OworZXhwb3J0cy5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQ7Cit2YXIgcmdiQnVmID0gWyJyZ2IoIiwgMCwgIiwiLCAwLCAiLCIsIDAsICIpIl07CisKK3ZhciBVdGlsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gVXRpbCgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVXRpbCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoVXRpbCwgbnVsbCwgW3sKKyAgICBrZXk6ICJtYWtlQ3NzUmdiIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbWFrZUNzc1JnYihyLCBnLCBiKSB7CisgICAgICByZ2JCdWZbMV0gPSByOworICAgICAgcmdiQnVmWzNdID0gZzsKKyAgICAgIHJnYkJ1Zls1XSA9IGI7CisgICAgICByZXR1cm4gcmdiQnVmLmpvaW4oIiIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRyYW5zZm9ybSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHRyYW5zZm9ybShtMSwgbTIpIHsKKyAgICAgIHJldHVybiBbbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLCBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSwgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV1dOworICAgIH0KKyAgfSwgeworICAgIGtleTogImFwcGx5VHJhbnNmb3JtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm0ocCwgbSkgeworICAgICAgdmFyIHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07CisgICAgICB2YXIgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTsKKyAgICAgIHJldHVybiBbeHQsIHl0XTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJhcHBseUludmVyc2VUcmFuc2Zvcm0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseUludmVyc2VUcmFuc2Zvcm0ocCwgbSkgeworICAgICAgdmFyIGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOworICAgICAgdmFyIHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7CisgICAgICB2YXIgeXQgPSAoLXBbMF0gKiBtWzFdICsgcFsxXSAqIG1bMF0gKyBtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQ7CisgICAgICByZXR1cm4gW3h0LCB5dF07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3giLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChyLCBtKSB7CisgICAgICB2YXIgcDEgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHIsIG0pOworICAgICAgdmFyIHAyID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLnNsaWNlKDIsIDQpLCBtKTsKKyAgICAgIHZhciBwMyA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JbMF0sIHJbM11dLCBtKTsKKyAgICAgIHZhciBwNCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JbMl0sIHJbMV1dLCBtKTsKKyAgICAgIHJldHVybiBbTWF0aC5taW4ocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1pbihwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5tYXgocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpbnZlcnNlVHJhbnNmb3JtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaW52ZXJzZVRyYW5zZm9ybShtKSB7CisgICAgICB2YXIgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07CisgICAgICByZXR1cm4gW21bM10gLyBkLCAtbVsxXSAvIGQsIC1tWzJdIC8gZCwgbVswXSAvIGQsIChtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQsIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGRdOworICAgIH0KKyAgfSwgeworICAgIGtleTogImFwcGx5M2RUcmFuc2Zvcm0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseTNkVHJhbnNmb3JtKG0sIHYpIHsKKyAgICAgIHJldHVybiBbbVswXSAqIHZbMF0gKyBtWzFdICogdlsxXSArIG1bMl0gKiB2WzJdLCBtWzNdICogdlswXSArIG1bNF0gKiB2WzFdICsgbVs1XSAqIHZbMl0sIG1bNl0gKiB2WzBdICsgbVs3XSAqIHZbMV0gKyBtWzhdICogdlsyXV07CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7CisgICAgICB2YXIgdHJhbnNwb3NlID0gW21bMF0sIG1bMl0sIG1bMV0sIG1bM11dOworICAgICAgdmFyIGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTsKKyAgICAgIHZhciBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107CisgICAgICB2YXIgYyA9IG1bMl0gKiB0cmFuc3Bvc2VbMF0gKyBtWzNdICogdHJhbnNwb3NlWzJdOworICAgICAgdmFyIGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTsKKyAgICAgIHZhciBmaXJzdCA9IChhICsgZCkgLyAyOworICAgICAgdmFyIHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICogKGEgKyBkKSAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjsKKyAgICAgIHZhciBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7CisgICAgICB2YXIgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxOworICAgICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJub3JtYWxpemVSZWN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbm9ybWFsaXplUmVjdChyZWN0KSB7CisgICAgICB2YXIgciA9IHJlY3Quc2xpY2UoMCk7CisKKyAgICAgIGlmIChyZWN0WzBdID4gcmVjdFsyXSkgeworICAgICAgICByWzBdID0gcmVjdFsyXTsKKyAgICAgICAgclsyXSA9IHJlY3RbMF07CisgICAgICB9CisKKyAgICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkgeworICAgICAgICByWzFdID0gcmVjdFszXTsKKyAgICAgICAgclszXSA9IHJlY3RbMV07CisgICAgICB9CisKKyAgICAgIHJldHVybiByOworICAgIH0KKyAgfSwgeworICAgIGtleTogImludGVyc2VjdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHsKKyAgICAgIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikgeworICAgICAgICByZXR1cm4gYSAtIGI7CisgICAgICB9CisKKyAgICAgIHZhciBvcmRlcmVkWCA9IFtyZWN0MVswXSwgcmVjdDFbMl0sIHJlY3QyWzBdLCByZWN0MlsyXV0uc29ydChjb21wYXJlKTsKKyAgICAgIHZhciBvcmRlcmVkWSA9IFtyZWN0MVsxXSwgcmVjdDFbM10sIHJlY3QyWzFdLCByZWN0MlszXV0uc29ydChjb21wYXJlKTsKKyAgICAgIHZhciByZXN1bHQgPSBbXTsKKyAgICAgIHJlY3QxID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QxKTsKKyAgICAgIHJlY3QyID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QyKTsKKworICAgICAgaWYgKG9yZGVyZWRYWzBdID09PSByZWN0MVswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDJbMF0gfHwgb3JkZXJlZFhbMF0gPT09IHJlY3QyWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MVswXSkgeworICAgICAgICByZXN1bHRbMF0gPSBvcmRlcmVkWFsxXTsKKyAgICAgICAgcmVzdWx0WzJdID0gb3JkZXJlZFhbMl07CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKG9yZGVyZWRZWzBdID09PSByZWN0MVsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDJbMV0gfHwgb3JkZXJlZFlbMF0gPT09IHJlY3QyWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MVsxXSkgeworICAgICAgICByZXN1bHRbMV0gPSBvcmRlcmVkWVsxXTsKKyAgICAgICAgcmVzdWx0WzNdID0gb3JkZXJlZFlbMl07CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gVXRpbDsKK30oKTsKKworZXhwb3J0cy5VdGlsID0gVXRpbDsKK3ZhciBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJEOCwgMHgyQzcsIDB4MkM2LCAweDJEOSwgMHgyREQsIDB4MkRCLCAweDJEQSwgMHgyREMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNBLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFFLCAweDIwMUMsIDB4MjAxRCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQSwgMHgyMTIyLCAweEZCMDEsIDB4RkIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdELCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN0UsIDAsIDB4MjBBQ107CisKK2Z1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikgeworICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aCwKKyAgICAgIHN0ckJ1ZiA9IFtdOworCisgIGlmIChzdHJbMF0gPT09ICJceEZFIiAmJiBzdHJbMV0gPT09ICJceEZGIikgeworICAgIGZvciAodmFyIGkgPSAyOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoaSkgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkgKyAxKSkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJbMF0gPT09ICJceEZGIiAmJiBzdHJbMV0gPT09ICJceEZFIikgeworICAgIGZvciAodmFyIF9pMiA9IDI7IF9pMiA8IGxlbmd0aDsgX2kyICs9IDIpIHsKKyAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoX2kyICsgMSkgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KF9pMikpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbGVuZ3RoOyArK19pMykgeworICAgICAgdmFyIGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChfaTMpXTsKKyAgICAgIHN0ckJ1Zi5wdXNoKGNvZGUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpIDogc3RyLmNoYXJBdChfaTMpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyQnVmLmpvaW4oIiIpOworfQorCitmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKSB7CisgIHJldHVybiBzdHIucmVwbGFjZSgvKFtcKFwpXFxdKS9nLCAiXFwkMSIpOworfQorCitmdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7CisgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpOworfQorCitmdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7CisgIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7Cit9CisKK2Z1bmN0aW9uIGlzQm9vbCh2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gImJvb2xlYW4iOworfQorCitmdW5jdGlvbiBpc051bSh2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gIm51bWJlciI7Cit9CisKK2Z1bmN0aW9uIGlzU3RyaW5nKHYpIHsKKyAgcmV0dXJuIHR5cGVvZiB2ID09PSAic3RyaW5nIjsKK30KKworZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2KSB7CisgIHJldHVybiBfdHlwZW9mKHYpID09PSAib2JqZWN0IiAmJiB2ICE9PSBudWxsICYmIHYuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkOworfQorCitmdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikgeworICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIGFycjEuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7CisgICAgcmV0dXJuIGVsZW1lbnQgPT09IGFycjJbaW5kZXhdOworICB9KTsKK30KKworZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpIHsKKyAgdmFyIGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBEYXRlKERhdGUubm93KCkpOworICB2YXIgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCAoZGF0ZS5nZXRVVENEYXRlKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpXTsKKyAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKSB7CisgIHZhciBjYXBhYmlsaXR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgdmFyIGlzU2V0dGxlZCA9IGZhbHNlOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2FwYWJpbGl0eSwgInNldHRsZWQiLCB7CisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gaXNTZXR0bGVkOworICAgIH0KKyAgfSk7CisgIGNhcGFiaWxpdHkucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICBjYXBhYmlsaXR5LnJlc29sdmUgPSBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgaXNTZXR0bGVkID0gdHJ1ZTsKKyAgICAgIHJlc29sdmUoZGF0YSk7CisgICAgfTsKKworICAgIGNhcGFiaWxpdHkucmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgaXNTZXR0bGVkID0gdHJ1ZTsKKyAgICAgIHJlamVjdChyZWFzb24pOworICAgIH07CisgIH0pOworICByZXR1cm4gY2FwYWJpbGl0eTsKK30KKwordmFyIGNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTENsb3N1cmUoKSB7CisgIHZhciBkaWdpdHMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iOworICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGRhdGEsIGNvbnRlbnRUeXBlKSB7CisgICAgdmFyIGZvcmNlRGF0YVNjaGVtYSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7CisKKyAgICBpZiAoIWZvcmNlRGF0YVNjaGVtYSAmJiBVUkwuY3JlYXRlT2JqZWN0VVJMKSB7CisgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgICB0eXBlOiBjb250ZW50VHlwZQorICAgICAgfSk7CisgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKKyAgICB9CisKKyAgICB2YXIgYnVmZmVyID0gImRhdGE6Ii5jb25jYXQoY29udGVudFR5cGUsICI7YmFzZTY0LCIpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7CisgICAgICB2YXIgYjEgPSBkYXRhW2ldICYgMHhmZjsKKyAgICAgIHZhciBiMiA9IGRhdGFbaSArIDFdICYgMHhmZjsKKyAgICAgIHZhciBiMyA9IGRhdGFbaSArIDJdICYgMHhmZjsKKyAgICAgIHZhciBkMSA9IGIxID4+IDIsCisgICAgICAgICAgZDIgPSAoYjEgJiAzKSA8PCA0IHwgYjIgPj4gNDsKKyAgICAgIHZhciBkMyA9IGkgKyAxIDwgaWkgPyAoYjIgJiAweGYpIDw8IDIgfCBiMyA+PiA2IDogNjQ7CisgICAgICB2YXIgZDQgPSBpICsgMiA8IGlpID8gYjMgJiAweDNmIDogNjQ7CisgICAgICBidWZmZXIgKz0gZGlnaXRzW2QxXSArIGRpZ2l0c1tkMl0gKyBkaWdpdHNbZDNdICsgZGlnaXRzW2Q0XTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworICB9OworfSgpOworCitleHBvcnRzLmNyZWF0ZU9iamVjdFVSTCA9IGNyZWF0ZU9iamVjdFVSTDsKKworLyoqKi8gfSksCisvKiA2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCit2YXIgX2lzX25vZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAidW5kZWZpbmVkIiB8fCAhZ2xvYmFsVGhpcy5fcGRmanNDb21wYXRpYmlsaXR5Q2hlY2tlZCkgeworICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICJ1bmRlZmluZWQiIHx8IGdsb2JhbFRoaXMuTWF0aCAhPT0gTWF0aCkgeworICAgIGdsb2JhbFRoaXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOworICB9CisKKyAgZ2xvYmFsVGhpcy5fcGRmanNDb21wYXRpYmlsaXR5Q2hlY2tlZCA9IHRydWU7CisgIHZhciBoYXNET00gPSAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2Yod2luZG93KSkgPT09ICJvYmplY3QiICYmICh0eXBlb2YgZG9jdW1lbnQgPT09ICJ1bmRlZmluZWQiID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKGRvY3VtZW50KSkgPT09ICJvYmplY3QiOworICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gInVuZGVmaW5lZCIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAiIjsKKyAgdmFyIGlzSUUgPSAvVHJpZGVudC8udGVzdCh1c2VyQWdlbnQpOworCisgIChmdW5jdGlvbiBjaGVja05vZGVCdG9hKCkgeworICAgIGlmIChnbG9iYWxUaGlzLmJ0b2EgfHwgIV9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5idG9hID0gZnVuY3Rpb24gKGNoYXJzKSB7CisgICAgICByZXR1cm4gQnVmZmVyLmZyb20oY2hhcnMsICJiaW5hcnkiKS50b1N0cmluZygiYmFzZTY0Iik7CisgICAgfTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tOb2RlQXRvYigpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5hdG9iIHx8ICFfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuYXRvYiA9IGZ1bmN0aW9uIChpbnB1dCkgeworICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGlucHV0LCAiYmFzZTY0IikudG9TdHJpbmcoImJpbmFyeSIpOworICAgIH07CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrQ2hpbGROb2RlUmVtb3ZlKCkgeworICAgIGlmICghaGFzRE9NKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHR5cGVvZiBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgeworICAgICAgICB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7CisgICAgICB9CisgICAgfTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tET01Ub2tlbkxpc3RBZGRSZW1vdmUoKSB7CisgICAgaWYgKCFoYXNET00gfHwgX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgZGl2LmNsYXNzTGlzdC5hZGQoInRlc3RPbmUiLCAidGVzdFR3byIpOworCisgICAgaWYgKGRpdi5jbGFzc0xpc3QuY29udGFpbnMoInRlc3RPbmUiKSA9PT0gdHJ1ZSAmJiBkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0ZXN0VHdvIikgPT09IHRydWUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgT3JpZ2luYWxET01Ub2tlbkxpc3RBZGQgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZDsKKyAgICB2YXIgT3JpZ2luYWxET01Ub2tlbkxpc3RSZW1vdmUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZTsKKworICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKCkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHRva2VucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKKyAgICAgICAgdG9rZW5zW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBfaSA9IDAsIF90b2tlbnMgPSB0b2tlbnM7IF9pIDwgX3Rva2Vucy5sZW5ndGg7IF9pKyspIHsKKyAgICAgICAgdmFyIHRva2VuID0gX3Rva2Vuc1tfaV07CisgICAgICAgIE9yaWdpbmFsRE9NVG9rZW5MaXN0QWRkLmNhbGwodGhpcywgdG9rZW4pOworICAgICAgfQorICAgIH07CisKKyAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgdG9rZW5zID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CisgICAgICAgIHRva2Vuc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBfaTIgPSAwLCBfdG9rZW5zMiA9IHRva2VuczsgX2kyIDwgX3Rva2VuczIubGVuZ3RoOyBfaTIrKykgeworICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5zMltfaTJdOworICAgICAgICBPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZS5jYWxsKHRoaXMsIHRva2VuKTsKKyAgICAgIH0KKyAgICB9OworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpIHsKKyAgICBpZiAoIWhhc0RPTSB8fCBfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworICAgIGlmIChkaXYuY2xhc3NMaXN0LnRvZ2dsZSgidGVzdCIsIDApID09PSBmYWxzZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHRva2VuKSB7CisgICAgICB2YXIgZm9yY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/ICEhYXJndW1lbnRzWzFdIDogIXRoaXMuY29udGFpbnModG9rZW4pOworICAgICAgcmV0dXJuIHRoaXNbZm9yY2UgPyAiYWRkIiA6ICJyZW1vdmUiXSh0b2tlbiksIGZvcmNlOworICAgIH07CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrV2luZG93SGlzdG9yeVB1c2hTdGF0ZVJlcGxhY2VTdGF0ZSgpIHsKKyAgICBpZiAoIWhhc0RPTSB8fCAhaXNJRSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBPcmlnaW5hbFB1c2hTdGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZTsKKyAgICB2YXIgT3JpZ2luYWxSZXBsYWNlU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGU7CisKKyAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHsKKyAgICAgIHZhciBhcmdzID0gdXJsID09PSB1bmRlZmluZWQgPyBbc3RhdGUsIHRpdGxlXSA6IFtzdGF0ZSwgdGl0bGUsIHVybF07CisgICAgICBPcmlnaW5hbFB1c2hTdGF0ZS5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICB9OworCisgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7CisgICAgICB2YXIgYXJncyA9IHVybCA9PT0gdW5kZWZpbmVkID8gW3N0YXRlLCB0aXRsZV0gOiBbc3RhdGUsIHRpdGxlLCB1cmxdOworICAgICAgT3JpZ2luYWxSZXBsYWNlU3RhdGUuYXBwbHkodGhpcywgYXJncyk7CisgICAgfTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdTdGFydHNXaXRoKCkgeworICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdFbmRzV2l0aCgpIHsKKyAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oNjQpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1N0cmluZ0luY2x1ZGVzKCkgeworICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg2Nik7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlJbmNsdWRlcygpIHsKKyAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg2OCk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlGcm9tKCkgeworICAgIGlmIChBcnJheS5mcm9tKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg3Nik7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0QXNzaWduKCkgeworICAgIGlmIChPYmplY3QuYXNzaWduKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg5OCk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0RnJvbUVudHJpZXMoKSB7CisgICAgaWYgKE9iamVjdC5mcm9tRW50cmllcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTAxKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tNYXRoTG9nMigpIHsKKyAgICBpZiAoTWF0aC5sb2cyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTWF0aC5sb2cyID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDUpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja051bWJlcklzTmFOKCkgeworICAgIGlmIChOdW1iZXIuaXNOYU4pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBOdW1iZXIuaXNOYU4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNyk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrTnVtYmVySXNJbnRlZ2VyKCkgeworICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTnVtYmVyLmlzSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA5KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tUeXBlZEFycmF5U2xpY2UoKSB7CisgICAgaWYgKFVpbnQ4QXJyYXkucHJvdG90eXBlLnNsaWNlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXygxMTIpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1Byb21pc2UoKSB7CisgICAgaWYgKGdsb2JhbFRoaXMuUHJvbWlzZSAmJiBnbG9iYWxUaGlzLlByb21pc2UuYWxsU2V0dGxlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuUHJvbWlzZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE3KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tVUkwoKSB7CisgICAgZ2xvYmFsVGhpcy5VUkwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzOCk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrUmVhZGFibGVTdHJlYW0oKSB7CisgICAgdmFyIGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIGlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICB0cnkgeworICAgICAgICBuZXcgUmVhZGFibGVTdHJlYW0oeworICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiBzdGFydChjb250cm9sbGVyKSB7CisgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCA9IHRydWU7CisgICAgICB9IGNhdGNoIChlKSB7fQorICAgIH0KKworICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ1KS5SZWFkYWJsZVN0cmVhbTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tNYXBFbnRyaWVzKCkgeworICAgIGlmIChnbG9iYWxUaGlzLk1hcCAmJiBnbG9iYWxUaGlzLk1hcC5wcm90b3R5cGUuZW50cmllcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuTWFwID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDYpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1NldEVudHJpZXMoKSB7CisgICAgaWYgKGdsb2JhbFRoaXMuU2V0ICYmIGdsb2JhbFRoaXMuU2V0LnByb3RvdHlwZS5lbnRyaWVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5TZXQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1Myk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrV2Vha01hcCgpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5XZWFrTWFwID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTUpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1dlYWtTZXQoKSB7CisgICAgaWYgKGdsb2JhbFRoaXMuV2Vha1NldCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuV2Vha1NldCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYxKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdDb2RlUG9pbnRBdCgpIHsKKyAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTYzKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdGcm9tQ29kZVBvaW50KCkgeworICAgIGlmIChTdHJpbmcuZnJvbUNvZGVQb2ludCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZy5mcm9tQ29kZVBvaW50ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjUpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1N5bWJvbCgpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5TeW1ib2wpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDE2Nyk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nUGFkU3RhcnQoKSB7CisgICAgaWYgKFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDE5MCk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nUGFkRW5kKCkgeworICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnBhZEVuZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTk1KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tPYmplY3RWYWx1ZXMoKSB7CisgICAgaWYgKE9iamVjdC52YWx1ZXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPYmplY3QudmFsdWVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTcpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja09iamVjdEVudHJpZXMoKSB7CisgICAgaWYgKE9iamVjdC5lbnRyaWVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgT2JqZWN0LmVudHJpZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMCk7CisgIH0pKCk7Cit9CisKKy8qKiovIH0pLAorLyogNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmlzTm9kZUpTID0gdm9pZCAwOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKwordmFyIGlzTm9kZUpTID0gKHR5cGVvZiBwcm9jZXNzID09PSAidW5kZWZpbmVkIiA/ICJ1bmRlZmluZWQiIDogX3R5cGVvZihwcm9jZXNzKSkgPT09ICJvYmplY3QiICYmIHByb2Nlc3MgKyAiIiA9PT0gIltvYmplY3QgcHJvY2Vzc10iICYmICFwcm9jZXNzLnZlcnNpb25zLm53ICYmICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSAiYnJvd3NlciIpOworZXhwb3J0cy5pc05vZGVKUyA9IGlzTm9kZUpTOworCisvKioqLyB9KSwKKy8qIDggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXyg5KTsKK21vZHVsZS5leHBvcnRzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7CisKKy8qKiovIH0pLAorLyogOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOworJCh7IGdsb2JhbDogdHJ1ZSB9LCB7IGdsb2JhbFRoaXM6IGdsb2JhbCB9KTsKKworLyoqKi8gfSksCisvKiAxMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxMikuZjsKK3ZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI2KTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHNldEdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzApOwordmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQwKTsKK3ZhciBpc0ZvcmNlZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTIpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7CisgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0OworIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDsKKyB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0OworIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7CisgaWYgKEdMT0JBTCkgeworICB0YXJnZXQgPSBnbG9iYWw7CisgfSBlbHNlIGlmIChTVEFUSUMpIHsKKyAgdGFyZ2V0ID0gZ2xvYmFsW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pOworIH0gZWxzZSB7CisgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlOworIH0KKyBpZiAodGFyZ2V0KQorICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKKyAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07CisgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkgeworICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpOworICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlOworICAgfSBlbHNlCisgICAgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTsKKyAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7CisgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7CisgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KQorICAgICBjb250aW51ZTsKKyAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7CisgICB9CisgICBpZiAob3B0aW9ucy5zaGFtIHx8IHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pIHsKKyAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7CisgICB9CisgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpOworICB9Cit9OworCisvKioqLyB9KSwKKy8qIDExICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK3ZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiBpdCAmJiBpdC5NYXRoID09IE1hdGggJiYgaXQ7Cit9OworbW9kdWxlLmV4cG9ydHMgPSBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fCBjaGVjayh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdykgfHwgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHwgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7CisKKy8qKiovIH0pLAorLyogMTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1KTsKK3ZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTsKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciB0b1ByaW1pdGl2ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjEpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIElFOF9ET01fREVGSU5FID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cit2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKK2V4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHsKKyBPID0gdG9JbmRleGVkT2JqZWN0KE8pOworIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKKyBpZiAoSUU4X0RPTV9ERUZJTkUpCisgIHRyeSB7CisgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApOworICB9IGNhdGNoIChlcnJvcikgeworICB9CisgaWYgKGhhcyhPLCBQKSkKKyAgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTsKK307CisKKy8qKiovIH0pLAorLyogMTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cittb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CisgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeworICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiA3OworICB9CisgfSlbMV0gIT0gNzsKK30pOworCisvKioqLyB9KSwKKy8qIDE0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHsKKyB0cnkgeworICByZXR1cm4gISFleGVjKCk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgcmV0dXJuIHRydWU7CisgfQorfTsKKworLyoqKi8gfSksCisvKiAxNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlOwordmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7Cit2YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgIW5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpOworZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7CisgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7CisgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7Cit9IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7CisKKy8qKiovIH0pLAorLyogMTYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkgeworIHJldHVybiB7CisgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksCisgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSwKKyAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksCisgIHZhbHVlOiB2YWx1ZQorIH07Cit9OworCisvKioqLyB9KSwKKy8qIDE3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBJbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjApOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7Cit9OworCisvKioqLyB9KSwKKy8qIDE4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOwordmFyIGNsYXNzb2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciBzcGxpdCA9ICcnLnNwbGl0OworbW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7CisgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTsKK30pID8gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQuY2FsbChpdCwgJycpIDogT2JqZWN0KGl0KTsKK30gOiBPYmplY3Q7CisKKy8qKiovIH0pLAorLyogMTkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKwordmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7Cit9OworCisvKioqLyB9KSwKKy8qIDIwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgaWYgKGl0ID09IHVuZGVmaW5lZCkKKyAgdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiICsgaXQpOworIHJldHVybiBpdDsKK307CisKKy8qKiovIH0pLAorLyogMjEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykgeworIGlmICghaXNPYmplY3QoaW5wdXQpKQorICByZXR1cm4gaW5wdXQ7CisgdmFyIGZuLCB2YWw7CisgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpCisgIHJldHVybiB2YWw7CisgaWYgKHR5cGVvZiAoZm4gPSBpbnB1dC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpCisgIHJldHVybiB2YWw7CisgaWYgKCFQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKQorICByZXR1cm4gdmFsOworIHRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIik7Cit9OworCisvKioqLyB9KSwKKy8qIDIyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJzsKK307CisKKy8qKiovIH0pLAorLyogMjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKwordmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CisgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7Cit9OworCisvKioqLyB9KSwKKy8qIDI0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgY3JlYXRlRWxlbWVudCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpOworbW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHsKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gNzsKKyAgfQorIH0pLmEgIT0gNzsKK30pOworCisvKioqLyB9KSwKKy8qIDI1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50OwordmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307Cit9OworCisvKioqLyB9KSwKKy8qIDI2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyNyk7Cit2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cittb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkgeworIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTsKK30gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7Cisgb2JqZWN0W2tleV0gPSB2YWx1ZTsKKyByZXR1cm4gb2JqZWN0OworfTsKKworLyoqKi8gfSksCisvKiAyNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBJRThfRE9NX0RFRklORSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjQpOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7Cit2YXIgdG9QcmltaXRpdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxKTsKK3ZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK2V4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7CisgYW5PYmplY3QoTyk7CisgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpOworIGFuT2JqZWN0KEF0dHJpYnV0ZXMpOworIGlmIChJRThfRE9NX0RFRklORSkKKyAgdHJ5IHsKKyAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgfQorIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpCisgIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTsKKyBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKQorICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTsKKyByZXR1cm4gTzsKK307CisKKy8qKiovIH0pLAorLyogMjggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIGlmICghaXNPYmplY3QoaXQpKSB7CisgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7CisgfQorIHJldHVybiBpdDsKK307CisKKy8qKiovIH0pLAorLyogMjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIHNldEdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzApOwordmFyIGluc3BlY3RTb3VyY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMxKTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0OwordmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlOwordmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpOworKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHsKKyB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTsKKyB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7CisgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlOworIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgeworICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiAhaGFzKHZhbHVlLCAnbmFtZScpKQorICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIGtleSk7CisgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7CisgfQorIGlmIChPID09PSBnbG9iYWwpIHsKKyAgaWYgKHNpbXBsZSkKKyAgIE9ba2V5XSA9IHZhbHVlOworICBlbHNlCisgICBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7CisgIHJldHVybjsKKyB9IGVsc2UgaWYgKCF1bnNhZmUpIHsKKyAgZGVsZXRlIE9ba2V5XTsKKyB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHsKKyAgc2ltcGxlID0gdHJ1ZTsKKyB9CisgaWYgKHNpbXBsZSkKKyAgT1trZXldID0gdmFsdWU7CisgZWxzZQorICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7Cit9KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7Cit9KTsKKworLyoqKi8gfSksCisvKiAzMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgdHJ5IHsKKyAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbCwga2V5LCB2YWx1ZSk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgZ2xvYmFsW2tleV0gPSB2YWx1ZTsKKyB9CisgcmV0dXJuIHZhbHVlOworfTsKKworLyoqKi8gfSksCisvKiAzMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgc3RvcmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMyKTsKK3ZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmc7CitpZiAodHlwZW9mIHN0b3JlLmluc3BlY3RTb3VyY2UgIT0gJ2Z1bmN0aW9uJykgeworIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7CisgfTsKK30KK21vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTsKKworLyoqKi8gfSksCisvKiAzMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgc2V0R2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygzMCk7Cit2YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7Cit2YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7Cittb2R1bGUuZXhwb3J0cyA9IHN0b3JlOworCisvKioqLyB9KSwKKy8qIDMzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBOQVRJVkVfV0VBS19NQVAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM0KTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIG9iamVjdEhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIHNoYXJlZEtleSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzUpOwordmFyIGhpZGRlbktleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK3ZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7Cit2YXIgc2V0LCBnZXQsIGhhczsKK3ZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7Cit9OwordmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7CisgcmV0dXJuIGZ1bmN0aW9uIChpdCkgeworICB2YXIgc3RhdGU7CisgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHsKKyAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTsKKyAgfQorICByZXR1cm4gc3RhdGU7CisgfTsKK307CitpZiAoTkFUSVZFX1dFQUtfTUFQKSB7CisgdmFyIHN0b3JlID0gbmV3IFdlYWtNYXAoKTsKKyB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7CisgdmFyIHdtaGFzID0gc3RvcmUuaGFzOworIHZhciB3bXNldCA9IHN0b3JlLnNldDsKKyBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7CisgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7CisgIHJldHVybiBtZXRhZGF0YTsKKyB9OworIGdldCA9IGZ1bmN0aW9uIChpdCkgeworICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSwgaXQpIHx8IHt9OworIH07CisgaGFzID0gZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7CisgfTsKK30gZWxzZSB7CisgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpOworIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTsKKyBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7CisgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTsKKyAgcmV0dXJuIG1ldGFkYXRhOworIH07CisgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9OworIH07CisgaGFzID0gZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTsKKyB9OworfQorbW9kdWxlLmV4cG9ydHMgPSB7Cisgc2V0OiBzZXQsCisgZ2V0OiBnZXQsCisgaGFzOiBoYXMsCisgZW5mb3JjZTogZW5mb3JjZSwKKyBnZXR0ZXJGb3I6IGdldHRlckZvcgorfTsKKworLyoqKi8gfSksCisvKiAzNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgaW5zcGVjdFNvdXJjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzEpOwordmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDsKK21vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCkpOworCisvKioqLyB9KSwKKy8qIDM1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBzaGFyZWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM2KTsKK3ZhciB1aWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKK3ZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHsKKyByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7Cit9OworCisvKioqLyB9KSwKKy8qIDM2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBJU19QVVJFID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7Cit2YXIgc3RvcmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMyKTsKKyhtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7Cit9KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7CisgdmVyc2lvbjogJzMuNi41JywKKyBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsCisgY29weXJpZ2h0OiAnwqkgMjAyMCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScKK30pOworCisvKioqLyB9KSwKKy8qIDM3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZmFsc2U7CisKKy8qKiovIH0pLAorLyogMzggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKwordmFyIGlkID0gMDsKK3ZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkgeworIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNik7Cit9OworCisvKioqLyB9KSwKKy8qIDM5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0ge307CisKKy8qKiovIH0pLAorLyogNDAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIG93bktleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQxKTsKK3ZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjcpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHsKKyB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTsKKyB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOworIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjsKKyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgdmFyIGtleSA9IGtleXNbaV07CisgIGlmICghaGFzKHRhcmdldCwga2V5KSkKKyAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsKKyB9Cit9OworCisvKioqLyB9KSwKKy8qIDQxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Mik7Cit2YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNDQpOwordmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNTEpOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7Cittb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHsKKyB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpOworIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjsKKyByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzOworfTsKKworLyoqKi8gfSksCisvKiA0MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkgeworIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkOworfTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7CisgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKSA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdOworfTsKKworLyoqKi8gfSksCisvKiA0MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cittb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDsKKworLyoqKi8gfSksCisvKiA0NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NSk7Cit2YXIgZW51bUJ1Z0tleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUwKTsKK3ZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7CitleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHsKKyByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpOworfTsKKworLyoqKi8gfSksCisvKiA0NSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNyk7Cit2YXIgaW5kZXhPZiA9IF9fd19wZGZqc19yZXF1aXJlX18oNDYpLmluZGV4T2Y7Cit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykgeworIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7CisgdmFyIGkgPSAwOworIHZhciByZXN1bHQgPSBbXTsKKyB2YXIga2V5OworIGZvciAoa2V5IGluIE8pCisgICFoYXMoaGlkZGVuS2V5cywga2V5KSAmJiBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpOworIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKQorICBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7CisgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTsKKyAgfQorIHJldHVybiByZXN1bHQ7Cit9OworCisvKioqLyB9KSwKKy8qIDQ2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDkpOwordmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykgeworIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHsKKyAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpOworICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpOworICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpOworICB2YXIgdmFsdWU7CisgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkKKyAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgeworICAgIHZhbHVlID0gT1tpbmRleCsrXTsKKyAgICBpZiAodmFsdWUgIT0gdmFsdWUpCisgICAgIHJldHVybiB0cnVlOworICAgfQorICBlbHNlCisgICBmb3IgKDsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHsKKyAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkKKyAgICAgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7CisgICB9CisgIHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7CisgfTsKK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLAorIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSkKK307CisKKy8qKiovIH0pLAorLyogNDcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHRvSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNDgpOwordmFyIG1pbiA9IE1hdGgubWluOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKKyByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlcihhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsKK307CisKKy8qKiovIH0pLAorLyogNDggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKwordmFyIGNlaWwgPSBNYXRoLmNlaWw7Cit2YXIgZmxvb3IgPSBNYXRoLmZsb29yOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKKyByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTsKK307CisKKy8qKiovIH0pLAorLyogNDkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHRvSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNDgpOwordmFyIG1heCA9IE1hdGgubWF4OwordmFyIG1pbiA9IE1hdGgubWluOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkgeworIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTsKKyByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTsKK307CisKKy8qKiovIH0pLAorLyogNTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBbCisgJ2NvbnN0cnVjdG9yJywKKyAnaGFzT3duUHJvcGVydHknLAorICdpc1Byb3RvdHlwZU9mJywKKyAncHJvcGVydHlJc0VudW1lcmFibGUnLAorICd0b0xvY2FsZVN0cmluZycsCisgJ3RvU3RyaW5nJywKKyAndmFsdWVPZicKK107CisKKy8qKiovIH0pLAorLyogNTEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczsKKworLyoqKi8gfSksCisvKiA1MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciByZXBsYWNlbWVudCA9IC8jfFwucHJvdG90eXBlXC4vOwordmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikgeworIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTsKKyByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2UgOiB0eXBlb2YgZGV0ZWN0aW9uID09ICdmdW5jdGlvbicgPyBmYWlscyhkZXRlY3Rpb24pIDogISFkZXRlY3Rpb247Cit9OwordmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKKyByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpOworfTsKK3ZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9OwordmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJzsKK3ZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnOworbW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDsKKworLyoqKi8gfSksCisvKiA1MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDU0KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjEpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3N0YXJ0c1dpdGgnKTsKKworLyoqKi8gfSksCisvKiA1NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxMikuZjsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIG5vdEFSZWdFeHAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU1KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7Cit2YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYwKTsKK3ZhciBJU19QVVJFID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7Cit2YXIgbmF0aXZlU3RhcnRzV2l0aCA9ICcnLnN0YXJ0c1dpdGg7Cit2YXIgbWluID0gTWF0aC5taW47Cit2YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpOwordmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7CisgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSwgJ3N0YXJ0c1dpdGgnKTsKKyByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTsKK30oKTsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMKK30sIHsKKyBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZykgeworICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTsKKyAgbm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpOworICB2YXIgaW5kZXggPSB0b0xlbmd0aChtaW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7CisgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTsKKyAgcmV0dXJuIG5hdGl2ZVN0YXJ0c1dpdGggPyBuYXRpdmVTdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleCkgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogNTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzUmVnRXhwID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIGlmIChpc1JlZ0V4cChpdCkpIHsKKyAgdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTsKKyB9CisgcmV0dXJuIGl0OworfTsKKworLyoqKi8gfSksCisvKiA1NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaXNPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyKTsKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIHZhciBpc1JlZ0V4cDsKKyByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT0gJ1JlZ0V4cCcpOworfTsKKworLyoqKi8gfSksCisvKiA1NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgc2hhcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygzNik7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgdWlkID0gX193X3BkZmpzX3JlcXVpcmVfXygzOCk7Cit2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTgpOwordmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OSk7Cit2YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTsKK3ZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sOwordmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHsKKyBpZiAoIWhhcyhXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpKSB7CisgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKQorICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gU3ltYm9sW25hbWVdOworICBlbHNlCisgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7CisgfQorIHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07Cit9OworCisvKioqLyB9KSwKKy8qIDU4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOworbW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gIVN0cmluZyhTeW1ib2woKSk7Cit9KTsKKworLyoqKi8gfSksCisvKiA1OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTgpOworbW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MICYmICFTeW1ib2wuc2hhbSAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnOworCisvKioqLyB9KSwKKy8qIDYwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7CisgdmFyIHJlZ2V4cCA9IC8uLzsKKyB0cnkgeworICAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTsKKyB9IGNhdGNoIChlKSB7CisgIHRyeSB7CisgICByZWdleHBbTUFUQ0hdID0gZmFsc2U7CisgICByZXR1cm4gJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7CisgIH0gY2F0Y2ggKGYpIHsKKyAgfQorIH0KKyByZXR1cm4gZmFsc2U7Cit9OworCisvKioqLyB9KSwKKy8qIDYxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBiaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Mik7Cit2YXIgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9ELCBsZW5ndGgpIHsKKyByZXR1cm4gYmluZChjYWxsLCBnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdLCBsZW5ndGgpOworfTsKKworLyoqKi8gfSksCisvKiA2MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYUZ1bmN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Myk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7CisgYUZ1bmN0aW9uKGZuKTsKKyBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKQorICByZXR1cm4gZm47Cisgc3dpdGNoIChsZW5ndGgpIHsKKyBjYXNlIDA6CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gZm4uY2FsbCh0aGF0KTsKKyAgfTsKKyBjYXNlIDE6CisgIHJldHVybiBmdW5jdGlvbiAoYSkgeworICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7CisgIH07CisgY2FzZSAyOgorICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHsKKyAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpOworICB9OworIGNhc2UgMzoKKyAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7CisgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTsKKyAgfTsKKyB9CisgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7CisgfTsKK307CisKKy8qKiovIH0pLAorLyogNjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHsKKyAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7CisgfQorIHJldHVybiBpdDsKK307CisKKy8qKiovIH0pLAorLyogNjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXyg2NSk7Cit2YXIgZW50cnlVbmJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYxKTsKK21vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdlbmRzV2l0aCcpOworCisvKioqLyB9KSwKKy8qIDY1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKS5mOwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nyk7Cit2YXIgbm90QVJlZ0V4cCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTUpOwordmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwKTsKK3ZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IF9fd19wZGZqc19yZXF1aXJlX18oNjApOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBuYXRpdmVFbmRzV2l0aCA9ICcnLmVuZHNXaXRoOwordmFyIG1pbiA9IE1hdGgubWluOwordmFyIENPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDID0gY29ycmVjdElzUmVnRXhwTG9naWMoJ2VuZHNXaXRoJyk7Cit2YXIgTUROX1BPTFlGSUxMX0JVRyA9ICFJU19QVVJFICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyAmJiAhIWZ1bmN0aW9uICgpIHsKKyB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnKTsKKyByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTsKK30oKTsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMKK30sIHsKKyBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nKSB7CisgIHZhciB0aGF0ID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpOworICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7CisgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOworICB2YXIgbGVuID0gdG9MZW5ndGgodGhhdC5sZW5ndGgpOworICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IG1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7CisgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTsKKyAgcmV0dXJuIG5hdGl2ZUVuZHNXaXRoID8gbmF0aXZlRW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZCkgOiB0aGF0LnNsaWNlKGVuZCAtIHNlYXJjaC5sZW5ndGgsIGVuZCkgPT09IHNlYXJjaDsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiA2NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDY3KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjEpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ2luY2x1ZGVzJyk7CisKKy8qKiovIH0pLAorLyogNjcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIG5vdEFSZWdFeHAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU1KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7Cit2YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYwKTsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykKK30sIHsKKyBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nKSB7CisgIHJldHVybiAhIX5TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSkuaW5kZXhPZihub3RBUmVnRXhwKHNlYXJjaFN0cmluZyksIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiA2OCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDY5KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjEpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnaW5jbHVkZXMnKTsKKworLyoqKi8gfSksCisvKiA2OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgJGluY2x1ZGVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NikuaW5jbHVkZXM7Cit2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzApOwordmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg3NSk7Cit2YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnaW5kZXhPZicsIHsKKyBBQ0NFU1NPUlM6IHRydWUsCisgMTogMAorfSk7CiskKHsKKyB0YXJnZXQ6ICdBcnJheScsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhVVNFU19UT19MRU5HVEgKK30sIHsKKyBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwpIHsKKyAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOworIH0KK30pOworYWRkVG9VbnNjb3BhYmxlcygnaW5jbHVkZXMnKTsKKworLyoqKi8gfSksCisvKiA3MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgY3JlYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXyg3MSk7Cit2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KTsKK3ZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTsKK3ZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTsKK2lmIChBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSB7CisgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHsKKyAgY29uZmlndXJhYmxlOiB0cnVlLAorICB2YWx1ZTogY3JlYXRlKG51bGwpCisgfSk7Cit9Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHsKKyBBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7Cit9OworCisvKioqLyB9KSwKKy8qIDcxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjgpOwordmFyIGRlZmluZVByb3BlcnRpZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcyKTsKK3ZhciBlbnVtQnVnS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTApOwordmFyIGhpZGRlbktleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK3ZhciBodG1sID0gX193X3BkZmpzX3JlcXVpcmVfXyg3NCk7Cit2YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7Cit2YXIgc2hhcmVkS2V5ID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7Cit2YXIgR1QgPSAnPic7Cit2YXIgTFQgPSAnPCc7Cit2YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7Cit2YXIgU0NSSVBUID0gJ3NjcmlwdCc7Cit2YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7Cit2YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsKK307Cit2YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHsKKyByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUOworfTsKK3ZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkgeworIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTsKKyBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTsKKyB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0OworIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7CisgcmV0dXJuIHRlbXA7Cit9OwordmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKKyB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7CisgdmFyIGlmcmFtZURvY3VtZW50OworIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTsKKyBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTsKKyBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OworIGlmcmFtZURvY3VtZW50Lm9wZW4oKTsKKyBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpOworIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7CisgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7Cit9OwordmFyIGFjdGl2ZVhEb2N1bWVudDsKK3ZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7CisgdHJ5IHsKKyAgYWN0aXZlWERvY3VtZW50ID0gZG9jdW1lbnQuZG9tYWluICYmIG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpOworIH0gY2F0Y2ggKGVycm9yKSB7CisgfQorIE51bGxQcm90b09iamVjdCA9IGFjdGl2ZVhEb2N1bWVudCA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpOworIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7Cisgd2hpbGUgKGxlbmd0aC0tKQorICBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07CisgcmV0dXJuIE51bGxQcm90b09iamVjdCgpOworfTsKK2hpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTsKK21vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykgeworIHZhciByZXN1bHQ7CisgaWYgKE8gIT09IG51bGwpIHsKKyAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7CisgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7CisgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7CisgIHJlc3VsdFtJRV9QUk9UT10gPSBPOworIH0gZWxzZQorICByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTsKKyByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpOworfTsKKworLyoqKi8gfSksCisvKiA3MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjcpOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7Cit2YXIgb2JqZWN0S2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzMpOworbW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7CisgYW5PYmplY3QoTyk7CisgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpOworIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKKyB2YXIgaW5kZXggPSAwOworIHZhciBrZXk7Cisgd2hpbGUgKGxlbmd0aCA+IGluZGV4KQorICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7CisgcmV0dXJuIE87Cit9OworCisvKioqLyB9KSwKKy8qIDczICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ1KTsKK3ZhciBlbnVtQnVnS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTApOworbW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHsKKyByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTsKK307CisKKy8qKiovIH0pLAorLyogNzQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKTsKK21vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7CisKKy8qKiovIH0pLAorLyogNzUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK3ZhciBjYWNoZSA9IHt9OwordmFyIHRocm93ZXIgPSBmdW5jdGlvbiAoaXQpIHsKKyB0aHJvdyBpdDsKK307Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgb3B0aW9ucykgeworIGlmIChoYXMoY2FjaGUsIE1FVEhPRF9OQU1FKSkKKyAgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXTsKKyBpZiAoIW9wdGlvbnMpCisgIG9wdGlvbnMgPSB7fTsKKyB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdOworIHZhciBBQ0NFU1NPUlMgPSBoYXMob3B0aW9ucywgJ0FDQ0VTU09SUycpID8gb3B0aW9ucy5BQ0NFU1NPUlMgOiBmYWxzZTsKKyB2YXIgYXJndW1lbnQwID0gaGFzKG9wdGlvbnMsIDApID8gb3B0aW9uc1swXSA6IHRocm93ZXI7CisgdmFyIGFyZ3VtZW50MSA9IGhhcyhvcHRpb25zLCAxKSA/IG9wdGlvbnNbMV0gOiB1bmRlZmluZWQ7CisgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXSA9ICEhbWV0aG9kICYmICFmYWlscyhmdW5jdGlvbiAoKSB7CisgIGlmIChBQ0NFU1NPUlMgJiYgIURFU0NSSVBUT1JTKQorICAgcmV0dXJuIHRydWU7CisgIHZhciBPID0geyBsZW5ndGg6IC0xIH07CisgIGlmIChBQ0NFU1NPUlMpCisgICBkZWZpbmVQcm9wZXJ0eShPLCAxLCB7CisgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICBnZXQ6IHRocm93ZXIKKyAgIH0pOworICBlbHNlCisgICBPWzFdID0gMTsKKyAgbWV0aG9kLmNhbGwoTywgYXJndW1lbnQwLCBhcmd1bWVudDEpOworIH0pOworfTsKKworLyoqKi8gfSksCisvKiA3NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDc3KTsKK19fd19wZGZqc19yZXF1aXJlX18oODkpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tOworCisvKioqLyB9KSwKKy8qIDc3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGNoYXJBdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzgpLmNoYXJBdDsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc5KTsKK3ZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJzsKK3ZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7Cit2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7CitkZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHsKKyBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKKyAgdHlwZTogU1RSSU5HX0lURVJBVE9SLAorICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksCisgIGluZGV4OiAwCisgfSk7Cit9LCBmdW5jdGlvbiBuZXh0KCkgeworIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CisgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZzsKKyB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDsKKyB2YXIgcG9pbnQ7CisgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpCisgIHJldHVybiB7CisgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgZG9uZTogdHJ1ZQorICB9OworIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpOworIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDsKKyByZXR1cm4geworICB2YWx1ZTogcG9pbnQsCisgIGRvbmU6IGZhbHNlCisgfTsKK30pOworCisvKioqLyB9KSwKKy8qIDc4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0ludGVnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ4KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7Cit2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7CisgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7CisgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTsKKyAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7CisgIHZhciBzaXplID0gUy5sZW5ndGg7CisgIHZhciBmaXJzdCwgc2Vjb25kOworICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpCisgICByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDsKKyAgZmlyc3QgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24pOworICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGID8gQ09OVkVSVF9UT19TVFJJTkcgPyBTLmNoYXJBdChwb3NpdGlvbikgOiBmaXJzdCA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7CisgfTsKK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksCisgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSkKK307CisKKy8qKiovIH0pLAorLyogNzkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgwKTsKK3ZhciBnZXRQcm90b3R5cGVPZiA9IF9fd19wZGZqc19yZXF1aXJlX18oODIpOwordmFyIHNldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nyk7Cit2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg1KTsKK3ZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI2KTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBJdGVyYXRvcnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg2KTsKK3ZhciBJdGVyYXRvcnNDb3JlID0gX193X3BkZmpzX3JlcXVpcmVfXyg4MSk7Cit2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlOwordmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7Cit2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7Cit2YXIgS0VZUyA9ICdrZXlzJzsKK3ZhciBWQUxVRVMgPSAndmFsdWVzJzsKK3ZhciBFTlRSSUVTID0gJ2VudHJpZXMnOwordmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7CisgcmV0dXJuIHRoaXM7Cit9OworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7CisgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTsKKyB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHsKKyAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKQorICAgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjsKKyAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpCisgICByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07CisgIHN3aXRjaCAoS0lORCkgeworICBjYXNlIEtFWVM6CisgICByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7CisgICB9OworICBjYXNlIFZBTFVFUzoKKyAgIHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOworICAgfTsKKyAgY2FzZSBFTlRSSUVTOgorICAgcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOworICAgfTsKKyAgfQorICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOworICB9OworIH07CisgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7CisgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlOworIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTsKKyB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXSB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdOworIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7CisgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yOworIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTsKKyBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHsKKyAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpOworICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHsKKyAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkgeworICAgIGlmIChzZXRQcm90b3R5cGVPZikgeworICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHsKKyAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpOworICAgIH0KKyAgIH0KKyAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7CisgICBpZiAoSVNfUFVSRSkKKyAgICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzOworICB9CisgfQorIGlmIChERUZBVUxUID09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHsKKyAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTsKKyAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeworICAgcmV0dXJuIG5hdGl2ZUl0ZXJhdG9yLmNhbGwodGhpcyk7CisgIH07CisgfQorIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikgeworICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpOworIH0KKyBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7CisgaWYgKERFRkFVTFQpIHsKKyAgbWV0aG9kcyA9IHsKKyAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksCisgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksCisgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUykKKyAgfTsKKyAgaWYgKEZPUkNFRCkKKyAgIGZvciAoS0VZIGluIG1ldGhvZHMpIHsKKyAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7CisgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7CisgICAgfQorICAgfQorICBlbHNlCisgICAkKHsKKyAgICB0YXJnZXQ6IE5BTUUsCisgICAgcHJvdG86IHRydWUsCisgICAgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRQorICAgfSwgbWV0aG9kcyk7CisgfQorIHJldHVybiBtZXRob2RzOworfTsKKworLyoqKi8gfSksCisvKiA4MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBJdGVyYXRvclByb3RvdHlwZSA9IF9fd19wZGZqc19yZXF1aXJlX18oODEpLkl0ZXJhdG9yUHJvdG90eXBlOwordmFyIGNyZWF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNzEpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7Cit2YXIgSXRlcmF0b3JzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nik7Cit2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gdGhpczsKK307Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7CisgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7CisgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pOworIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTsKKyBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzOworIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yOworfTsKKworLyoqKi8gfSksCisvKiA4MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBnZXRQcm90b3R5cGVPZiA9IF9fd19wZGZqc19yZXF1aXJlX18oODIpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKK3ZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7Cit2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gdGhpczsKK307Cit2YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjsKK2lmIChbXS5rZXlzKSB7CisgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTsKKyBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpCisgIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlOworIGVsc2UgeworICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7CisgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpCisgICBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTsKKyB9Cit9CitpZiAoSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkKQorIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CitpZiAoIUlTX1BVUkUgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSB7CisgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7Cit9Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsCisgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SUworfTsKKworLyoqKi8gfSksCisvKiA4MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgdG9PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgzKTsKK3ZhciBzaGFyZWRLZXkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM1KTsKK3ZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg0KTsKK3ZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTsKK3ZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlOworbW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykgeworIE8gPSB0b09iamVjdChPKTsKKyBpZiAoaGFzKE8sIElFX1BST1RPKSkKKyAgcmV0dXJuIE9bSUVfUFJPVE9dOworIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7CisgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsKKyB9CisgcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsOworfTsKKworLyoqKi8gfSksCisvKiA4MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjApOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKKyByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTsKK307CisKKy8qKiovIH0pLAorLyogODQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cittb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CisgZnVuY3Rpb24gRigpIHsKKyB9CisgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsOworIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlOworfSk7CisKKy8qKiovIH0pLAorLyogODUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNykuZjsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7CisgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHsKKyAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgIHZhbHVlOiBUQUcKKyAgfSk7CisgfQorfTsKKworLyoqKi8gfSksCisvKiA4NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IHt9OworCisvKioqLyB9KSwKKy8qIDg3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjgpOwordmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IF9fd19wZGZqc19yZXF1aXJlX18oODgpOworbW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkgeworIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlOworIHZhciB0ZXN0ID0ge307CisgdmFyIHNldHRlcjsKKyB0cnkgeworICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7CisgIHNldHRlci5jYWxsKHRlc3QsIFtdKTsKKyAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyB9CisgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7CisgIGFuT2JqZWN0KE8pOworICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pOworICBpZiAoQ09SUkVDVF9TRVRURVIpCisgICBzZXR0ZXIuY2FsbChPLCBwcm90byk7CisgIGVsc2UKKyAgIE8uX19wcm90b19fID0gcHJvdG87CisgIHJldHVybiBPOworIH07Cit9KCkgOiB1bmRlZmluZWQpOworCisvKioqLyB9KSwKKy8qIDg4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAoIWlzT2JqZWN0KGl0KSAmJiBpdCAhPT0gbnVsbCkgeworICB0aHJvdyBUeXBlRXJyb3IoIkNhbid0IHNldCAiICsgU3RyaW5nKGl0KSArICcgYXMgYSBwcm90b3R5cGUnKTsKKyB9CisgcmV0dXJuIGl0OworfTsKKworLyoqKi8gfSksCisvKiA4OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGZyb20gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkwKTsKK3ZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk3KTsKK3ZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsKKyBBcnJheS5mcm9tKGl0ZXJhYmxlKTsKK30pOworJCh7CisgdGFyZ2V0OiAnQXJyYXknLAorIHN0YXQ6IHRydWUsCisgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OCit9LCB7IGZyb206IGZyb20gfSk7CisKKy8qKiovIH0pLAorLyogOTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjIpOwordmFyIHRvT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Myk7Cit2YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd19wZGZqc19yZXF1aXJlX18oOTEpOwordmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTIpOwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nyk7Cit2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkzKTsKK3ZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTQpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSkgeworIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTsKKyB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7CisgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKKyB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7CisgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7CisgdmFyIGluZGV4ID0gMDsKKyB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTsKKyBpZiAobWFwcGluZykKKyAgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTsKKyBpZiAoaXRlcmF0b3JNZXRob2QgIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkgeworICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7CisgIG5leHQgPSBpdGVyYXRvci5uZXh0OworICByZXN1bHQgPSBuZXcgQygpOworICBmb3IgKDsgIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykgeworICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFsKKyAgICBzdGVwLnZhbHVlLAorICAgIGluZGV4CisgICBdLCB0cnVlKSA6IHN0ZXAudmFsdWU7CisgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7CisgIH0KKyB9IGVsc2UgeworICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7CisgIHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7CisgIGZvciAoOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgeworICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdOworICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpOworICB9CisgfQorIHJlc3VsdC5sZW5ndGggPSBpbmRleDsKKyByZXR1cm4gcmVzdWx0OworfTsKKworLyoqKi8gfSksCisvKiA5MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHsKKyB0cnkgeworICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpOworIH0gY2F0Y2ggKGVycm9yKSB7CisgIHZhciByZXR1cm5NZXRob2QgPSBpdGVyYXRvclsncmV0dXJuJ107CisgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkKKyAgIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSk7CisgIHRocm93IGVycm9yOworIH0KK307CisKKy8qKiovIH0pLAorLyogOTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIEl0ZXJhdG9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oODYpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTsKK307CisKKy8qKiovIH0pLAorLyogOTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgdG9QcmltaXRpdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxKTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjcpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7CisgdmFyIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUoa2V5KTsKKyBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KQorICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpOworIGVsc2UKKyAgb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlOworfTsKKworLyoqKi8gfSksCisvKiA5NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oOTUpOwordmFyIEl0ZXJhdG9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oODYpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAoaXQgIT0gdW5kZWZpbmVkKQorICByZXR1cm4gaXRbSVRFUkFUT1JdIHx8IGl0WydAQGl0ZXJhdG9yJ10gfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTsKK307CisKKy8qKiovIH0pLAorLyogOTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTYpOwordmFyIGNsYXNzb2ZSYXcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwordmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7CisgcmV0dXJuIGFyZ3VtZW50czsKK30oKSkgPT0gJ0FyZ3VtZW50cyc7Cit2YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHsKKyB0cnkgeworICByZXR1cm4gaXRba2V5XTsKKyB9IGNhdGNoIChlcnJvcikgeworIH0KK307Cittb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHsKKyB2YXIgTywgdGFnLCByZXN1bHQ7CisgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZyA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKSA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0OworfTsKKworLyoqKi8gfSksCisvKiA5NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKK3ZhciB0ZXN0ID0ge307Cit0ZXN0W1RPX1NUUklOR19UQUddID0gJ3onOworbW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJzsKKworLyoqKi8gfSksCisvKiA5NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7Cit2YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7Cit0cnkgeworIHZhciBjYWxsZWQgPSAwOworIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7CisgIG5leHQ6IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTsKKyAgfSwKKyAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHsKKyAgIFNBRkVfQ0xPU0lORyA9IHRydWU7CisgIH0KKyB9OworIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0aGlzOworIH07CisgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsKKyAgdGhyb3cgMjsKKyB9KTsKK30gY2F0Y2ggKGVycm9yKSB7Cit9Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHsKKyBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKQorICByZXR1cm4gZmFsc2U7CisgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7CisgdHJ5IHsKKyAgdmFyIG9iamVjdCA9IHt9OworICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeworICAgcmV0dXJuIHsKKyAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CisgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9OworICAgIH0KKyAgIH07CisgIH07CisgIGV4ZWMob2JqZWN0KTsKKyB9IGNhdGNoIChlcnJvcikgeworIH0KKyByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7Cit9OworCisvKioqLyB9KSwKKy8qIDk4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oOTkpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuYXNzaWduOworCisvKioqLyB9KSwKKy8qIDk5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgYXNzaWduID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDApOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduCit9LCB7IGFzc2lnbjogYXNzaWduIH0pOworCisvKioqLyB9KSwKKy8qIDEwMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgb2JqZWN0S2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzMpOwordmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNTEpOwordmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7Cit2YXIgdG9PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgzKTsKK3ZhciBJbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjsKK3ZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK21vZHVsZS5leHBvcnRzID0gIW5hdGl2ZUFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CisgaWYgKERFU0NSSVBUT1JTICYmIG5hdGl2ZUFzc2lnbih7IGI6IDEgfSwgbmF0aXZlQXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHsKKyAgICAgdmFsdWU6IDMsCisgICAgIGVudW1lcmFibGU6IGZhbHNlCisgICAgfSk7CisgICB9CisgIH0pLCB7IGI6IDIgfSkpLmIgIT09IDEpCisgIHJldHVybiB0cnVlOworIHZhciBBID0ge307CisgdmFyIEIgPSB7fTsKKyB2YXIgc3ltYm9sID0gU3ltYm9sKCk7CisgdmFyIGFscGhhYmV0ID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JzsKKyBBW3N5bWJvbF0gPSA3OworIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsKKyAgQltjaHJdID0gY2hyOworIH0pOworIHJldHVybiBuYXRpdmVBc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKG5hdGl2ZUFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IGFscGhhYmV0OworfSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsKKyB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7CisgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgdmFyIGluZGV4ID0gMTsKKyB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7CisgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjsKKyB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHsKKyAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7CisgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gb2JqZWN0S2V5cyhTKS5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKFMpKSA6IG9iamVjdEtleXMoUyk7CisgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKKyAgdmFyIGogPSAwOworICB2YXIga2V5OworICB3aGlsZSAobGVuZ3RoID4gaikgeworICAga2V5ID0ga2V5c1tqKytdOworICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpCisgICAgVFtrZXldID0gU1trZXldOworICB9CisgfQorIHJldHVybiBUOworfSA6IG5hdGl2ZUFzc2lnbjsKKworLyoqKi8gfSksCisvKiAxMDEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMDIpOworX193X3BkZmpzX3JlcXVpcmVfXygxMDMpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZnJvbUVudHJpZXM7CisKKy8qKiovIH0pLAorLyogMTAyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcpOwordmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcwKTsKK3ZhciBJdGVyYXRvcnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg2KTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc5KTsKK3ZhciBBUlJBWV9JVEVSQVRPUiA9ICdBcnJheSBJdGVyYXRvcic7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7Cittb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHsKKyBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKKyAgdHlwZTogQVJSQVlfSVRFUkFUT1IsCisgIHRhcmdldDogdG9JbmRleGVkT2JqZWN0KGl0ZXJhdGVkKSwKKyAgaW5kZXg6IDAsCisgIGtpbmQ6IGtpbmQKKyB9KTsKK30sIGZ1bmN0aW9uICgpIHsKKyB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOworIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7CisgdmFyIGtpbmQgPSBzdGF0ZS5raW5kOworIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7CisgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkgeworICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7CisgIHJldHVybiB7CisgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgZG9uZTogdHJ1ZQorICB9OworIH0KKyBpZiAoa2luZCA9PSAna2V5cycpCisgIHJldHVybiB7CisgICB2YWx1ZTogaW5kZXgsCisgICBkb25lOiBmYWxzZQorICB9OworIGlmIChraW5kID09ICd2YWx1ZXMnKQorICByZXR1cm4geworICAgdmFsdWU6IHRhcmdldFtpbmRleF0sCisgICBkb25lOiBmYWxzZQorICB9OworIHJldHVybiB7CisgIHZhbHVlOiBbCisgICBpbmRleCwKKyAgIHRhcmdldFtpbmRleF0KKyAgXSwKKyAgZG9uZTogZmFsc2UKKyB9OworfSwgJ3ZhbHVlcycpOworSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTsKK2FkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTsKK2FkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpOworYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOworCisvKioqLyB9KSwKKy8qIDEwMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGl0ZXJhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNCk7Cit2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkzKTsKKyQoeworIHRhcmdldDogJ09iamVjdCcsCisgc3RhdDogdHJ1ZQorfSwgeworIGZyb21FbnRyaWVzOiBmdW5jdGlvbiBmcm9tRW50cmllcyhpdGVyYWJsZSkgeworICB2YXIgb2JqID0ge307CisgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChrLCB2KSB7CisgICBjcmVhdGVQcm9wZXJ0eShvYmosIGssIHYpOworICB9LCB1bmRlZmluZWQsIHRydWUpOworICByZXR1cm4gb2JqOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDEwNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkyKTsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIGJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYyKTsKK3ZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTQpOwordmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkxKTsKK3ZhciBSZXN1bHQgPSBmdW5jdGlvbiAoc3RvcHBlZCwgcmVzdWx0KSB7CisgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDsKKyB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKK307Cit2YXIgaXRlcmF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgQVNfRU5UUklFUywgSVNfSVRFUkFUT1IpIHsKKyB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoZm4sIHRoYXQsIEFTX0VOVFJJRVMgPyAyIDogMSk7CisgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDsKKyBpZiAoSVNfSVRFUkFUT1IpIHsKKyAgaXRlcmF0b3IgPSBpdGVyYWJsZTsKKyB9IGVsc2UgeworICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7CisgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpCisgICB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTsKKyAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7CisgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHsKKyAgICByZXN1bHQgPSBBU19FTlRSSUVTID8gYm91bmRGdW5jdGlvbihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBib3VuZEZ1bmN0aW9uKGl0ZXJhYmxlW2luZGV4XSk7CisgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpCisgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisgICByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7CisgIH0KKyAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7CisgfQorIG5leHQgPSBpdGVyYXRvci5uZXh0OworIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7CisgIHJlc3VsdCA9IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIGJvdW5kRnVuY3Rpb24sIHN0ZXAudmFsdWUsIEFTX0VOVFJJRVMpOworICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KQorICAgcmV0dXJuIHJlc3VsdDsKKyB9CisgcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOworfTsKK2l0ZXJhdGUuc3RvcCA9IGZ1bmN0aW9uIChyZXN1bHQpIHsKKyByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCByZXN1bHQpOworfTsKKworLyoqKi8gfSksCisvKiAxMDUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMDYpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5NYXRoLmxvZzI7CisKKy8qKiovIH0pLAorLyogMTA2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgbG9nID0gTWF0aC5sb2c7Cit2YXIgTE4yID0gTWF0aC5MTjI7CiskKHsKKyB0YXJnZXQ6ICdNYXRoJywKKyBzdGF0OiB0cnVlCit9LCB7CisgbG9nMjogZnVuY3Rpb24gbG9nMih4KSB7CisgIHJldHVybiBsb2coeCkgLyBMTjI7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTA3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTA4KTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzTmFOOworCisvKioqLyB9KSwKKy8qIDEwOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOworJCh7CisgdGFyZ2V0OiAnTnVtYmVyJywKKyBzdGF0OiB0cnVlCit9LCB7CisgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikgeworICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxMDkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMTApOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyOworCisvKioqLyB9KSwKKy8qIDExMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGlzSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTExKTsKKyQoeworIHRhcmdldDogJ051bWJlcicsCisgc3RhdDogdHJ1ZQorfSwgeyBpc0ludGVnZXI6IGlzSW50ZWdlciB9KTsKKworLyoqKi8gfSksCisvKiAxMTEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgZmxvb3IgPSBNYXRoLmZsb29yOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHsKKyByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDsKK307CisKKy8qKiovIH0pLAorLyogMTEyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTEzKTsKKworLyoqKi8gfSksCisvKiAxMTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE0KTsKK3ZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7Cit2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKK3ZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwordmFyICRzbGljZSA9IFtdLnNsaWNlOwordmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKKyBuZXcgSW50OEFycmF5KDEpLnNsaWNlKCk7Cit9KTsKK2V4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkgeworIHZhciBsaXN0ID0gJHNsaWNlLmNhbGwoYVR5cGVkQXJyYXkodGhpcyksIHN0YXJ0LCBlbmQpOworIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworIHZhciBpbmRleCA9IDA7CisgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoOworIHZhciByZXN1bHQgPSBuZXcgKGFUeXBlZEFycmF5Q29uc3RydWN0b3IoQykpKGxlbmd0aCk7Cisgd2hpbGUgKGxlbmd0aCA+IGluZGV4KQorICByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTsKKyByZXR1cm4gcmVzdWx0OworfSwgRk9SQ0VEKTsKKworLyoqKi8gfSksCisvKiAxMTQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE1KTsKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oOTUpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIHJlZGVmaW5lID0gX193X3BkZmpzX3JlcXVpcmVfXygyOSk7Cit2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KS5mOwordmFyIGdldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Mik7Cit2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg3KTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciB1aWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKK3ZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5OwordmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlOwordmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5OwordmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlOwordmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTsKK3ZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7Cit2YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTsKK3ZhciBpc1Byb3RvdHlwZU9mID0gT2JqZWN0UHJvdG90eXBlLmlzUHJvdG90eXBlT2Y7Cit2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKK3ZhciBUWVBFRF9BUlJBWV9UQUcgPSB1aWQoJ1RZUEVEX0FSUkFZX1RBRycpOwordmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBOQVRJVkVfQVJSQVlfQlVGRkVSICYmICEhc2V0UHJvdG90eXBlT2YgJiYgY2xhc3NvZihnbG9iYWwub3BlcmEpICE9PSAnT3BlcmEnOwordmFyIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gZmFsc2U7Cit2YXIgTkFNRTsKK3ZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCA9IHsKKyBJbnQ4QXJyYXk6IDEsCisgVWludDhBcnJheTogMSwKKyBVaW50OENsYW1wZWRBcnJheTogMSwKKyBJbnQxNkFycmF5OiAyLAorIFVpbnQxNkFycmF5OiAyLAorIEludDMyQXJyYXk6IDQsCisgVWludDMyQXJyYXk6IDQsCisgRmxvYXQzMkFycmF5OiA0LAorIEZsb2F0NjRBcnJheTogOAorfTsKK3ZhciBpc1ZpZXcgPSBmdW5jdGlvbiBpc1ZpZXcoaXQpIHsKKyB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTsKKyByZXR1cm4ga2xhc3MgPT09ICdEYXRhVmlldycgfHwgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBrbGFzcyk7Cit9OwordmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiBpc09iamVjdChpdCkgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBjbGFzc29mKGl0KSk7Cit9OwordmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7CisgaWYgKGlzVHlwZWRBcnJheShpdCkpCisgIHJldHVybiBpdDsKKyB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheScpOworfTsKK3ZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKEMpIHsKKyBpZiAoc2V0UHJvdG90eXBlT2YpIHsKKyAgaWYgKGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5LCBDKSkKKyAgIHJldHVybiBDOworIH0gZWxzZQorICBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkKKyAgIGlmIChoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIE5BTUUpKSB7CisgICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07CisgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiAoQyA9PT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yIHx8IGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5Q29uc3RydWN0b3IsIEMpKSkgeworICAgICByZXR1cm4gQzsKKyAgICB9CisgICB9CisgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3InKTsKK307Cit2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQpIHsKKyBpZiAoIURFU0NSSVBUT1JTKQorICByZXR1cm47CisgaWYgKGZvcmNlZCkKKyAgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKKyAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldOworICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZSwgS0VZKSkgeworICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlW0tFWV07CisgICB9CisgIH0KKyBpZiAoIVR5cGVkQXJyYXlQcm90b3R5cGVbS0VZXSB8fCBmb3JjZWQpIHsKKyAgcmVkZWZpbmUoVHlwZWRBcnJheVByb3RvdHlwZSwgS0VZLCBmb3JjZWQgPyBwcm9wZXJ0eSA6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgSW50OEFycmF5UHJvdG90eXBlW0tFWV0gfHwgcHJvcGVydHkpOworIH0KK307Cit2YXIgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQpIHsKKyB2YXIgQVJSQVksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKKyBpZiAoIURFU0NSSVBUT1JTKQorICByZXR1cm47CisgaWYgKHNldFByb3RvdHlwZU9mKSB7CisgIGlmIChmb3JjZWQpCisgICBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CisgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTsKKyAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSkpIHsKKyAgICAgZGVsZXRlIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcltLRVldOworICAgIH0KKyAgIH0KKyAgaWYgKCFUeXBlZEFycmF5W0tFWV0gfHwgZm9yY2VkKSB7CisgICB0cnkgeworICAgIHJldHVybiByZWRlZmluZShUeXBlZEFycmF5LCBLRVksIGZvcmNlZCA/IHByb3BlcnR5IDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlbS0VZXSB8fCBwcm9wZXJ0eSk7CisgICB9IGNhdGNoIChlcnJvcikgeworICAgfQorICB9IGVsc2UKKyAgIHJldHVybjsKKyB9CisgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgeworICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldOworICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkgeworICAgcmVkZWZpbmUoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVksIHByb3BlcnR5KTsKKyAgfQorIH0KK307Citmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKKyBpZiAoIWdsb2JhbFtOQU1FXSkKKyAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IGZhbHNlOworfQoraWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8IHR5cGVvZiBUeXBlZEFycmF5ICE9ICdmdW5jdGlvbicgfHwgVHlwZWRBcnJheSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7CisgVHlwZWRBcnJheSA9IGZ1bmN0aW9uIFR5cGVkQXJyYXkoKSB7CisgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTsKKyB9OworIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKQorICBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKKyAgIGlmIChnbG9iYWxbTkFNRV0pCisgICAgc2V0UHJvdG90eXBlT2YoZ2xvYmFsW05BTUVdLCBUeXBlZEFycmF5KTsKKyAgfQorfQoraWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8ICFUeXBlZEFycmF5UHJvdG90eXBlIHx8IFR5cGVkQXJyYXlQcm90b3R5cGUgPT09IE9iamVjdFByb3RvdHlwZSkgeworIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5LnByb3RvdHlwZTsKKyBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykKKyAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CisgICBpZiAoZ2xvYmFsW05BTUVdKQorICAgIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXS5wcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOworICB9Cit9CitpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBnZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSkgIT09IFR5cGVkQXJyYXlQcm90b3R5cGUpIHsKKyBzZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7Cit9CitpZiAoREVTQ1JJUFRPUlMgJiYgIWhhcyhUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkgeworIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gdHJ1ZTsKKyBkZWZpbmVQcm9wZXJ0eShUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7CisgIGdldDogZnVuY3Rpb24gKCkgeworICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMpID8gdGhpc1tUWVBFRF9BUlJBWV9UQUddIDogdW5kZWZpbmVkOworICB9CisgfSk7CisgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KQorICBpZiAoZ2xvYmFsW05BTUVdKSB7CisgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsW05BTUVdLCBUWVBFRF9BUlJBWV9UQUcsIE5BTUUpOworICB9Cit9Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTLAorIFRZUEVEX0FSUkFZX1RBRzogVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQgJiYgVFlQRURfQVJSQVlfVEFHLAorIGFUeXBlZEFycmF5OiBhVHlwZWRBcnJheSwKKyBhVHlwZWRBcnJheUNvbnN0cnVjdG9yOiBhVHlwZWRBcnJheUNvbnN0cnVjdG9yLAorIGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlNZXRob2QsCisgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDogZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCwKKyBpc1ZpZXc6IGlzVmlldywKKyBpc1R5cGVkQXJyYXk6IGlzVHlwZWRBcnJheSwKKyBUeXBlZEFycmF5OiBUeXBlZEFycmF5LAorIFR5cGVkQXJyYXlQcm90b3R5cGU6IFR5cGVkQXJyYXlQcm90b3R5cGUKK307CisKKy8qKiovIH0pLAorLyogMTE1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnOworCisvKioqLyB9KSwKKy8qIDExNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciBhRnVuY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYzKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHsKKyB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yOworIHZhciBTOworIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpOworfTsKKworLyoqKi8gfSksCisvKiAxMTcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMTgpOworX193X3BkZmpzX3JlcXVpcmVfXyg3Nyk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEyMCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEyMik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEzNik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEzNyk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLlByb21pc2U7CisKKy8qKiovIH0pLAorLyogMTE4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk2KTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHRvU3RyaW5nID0gX193X3BkZmpzX3JlcXVpcmVfXygxMTkpOworaWYgKCFUT19TVFJJTkdfVEFHX1NVUFBPUlQpIHsKKyByZWRlZmluZShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCB0b1N0cmluZywgeyB1bnNhZmU6IHRydWUgfSk7Cit9CisKKy8qKiovIH0pLAorLyogMTE5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTYpOwordmFyIGNsYXNzb2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk1KTsKK21vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8ge30udG9TdHJpbmcgOiBmdW5jdGlvbiB0b1N0cmluZygpIHsKKyByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7Cit9OworCisvKioqLyB9KSwKKy8qIDEyMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgRE9NSXRlcmFibGVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjEpOwordmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDIpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Cit2YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7Citmb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7CisgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTsKKyB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7CisgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGUpIHsKKyAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykKKyAgIHRyeSB7CisgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7CisgICB9IGNhdGNoIChlcnJvcikgeworICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7CisgICB9CisgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkgeworICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIENPTExFQ1RJT05fTkFNRSk7CisgIH0KKyAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKQorICAgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHsKKyAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkKKyAgICAgdHJ5IHsKKyAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBNRVRIT0RfTkFNRSwgQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKTsKKyAgICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdOworICAgICB9CisgICB9CisgfQorfQorCisvKioqLyB9KSwKKy8qIDEyMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IHsKKyBDU1NSdWxlTGlzdDogMCwKKyBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLAorIENTU1ZhbHVlTGlzdDogMCwKKyBDbGllbnRSZWN0TGlzdDogMCwKKyBET01SZWN0TGlzdDogMCwKKyBET01TdHJpbmdMaXN0OiAwLAorIERPTVRva2VuTGlzdDogMSwKKyBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCwKKyBGaWxlTGlzdDogMCwKKyBIVE1MQWxsQ29sbGVjdGlvbjogMCwKKyBIVE1MQ29sbGVjdGlvbjogMCwKKyBIVE1MRm9ybUVsZW1lbnQ6IDAsCisgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsCisgTWVkaWFMaXN0OiAwLAorIE1pbWVUeXBlQXJyYXk6IDAsCisgTmFtZWROb2RlTWFwOiAwLAorIE5vZGVMaXN0OiAxLAorIFBhaW50UmVxdWVzdExpc3Q6IDAsCisgUGx1Z2luOiAwLAorIFBsdWdpbkFycmF5OiAwLAorIFNWR0xlbmd0aExpc3Q6IDAsCisgU1ZHTnVtYmVyTGlzdDogMCwKKyBTVkdQYXRoU2VnTGlzdDogMCwKKyBTVkdQb2ludExpc3Q6IDAsCisgU1ZHU3RyaW5nTGlzdDogMCwKKyBTVkdUcmFuc2Zvcm1MaXN0OiAwLAorIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsCisgU3R5bGVTaGVldExpc3Q6IDAsCisgVGV4dFRyYWNrQ3VlTGlzdDogMCwKKyBUZXh0VHJhY2tMaXN0OiAwLAorIFRvdWNoTGlzdDogMAorfTsKKworLyoqKi8gfSksCisvKiAxMjIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Mik7Cit2YXIgTmF0aXZlUHJvbWlzZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIzKTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHJlZGVmaW5lQWxsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjQpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7Cit2YXIgc2V0U3BlY2llcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI1KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGFGdW5jdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oNjMpOwordmFyIGFuSW5zdGFuY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNik7Cit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIGluc3BlY3RTb3VyY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMxKTsKK3ZhciBpdGVyYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDQpOwordmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oOTcpOwordmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE2KTsKK3ZhciB0YXNrID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjcpLnNldDsKK3ZhciBtaWNyb3Rhc2sgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMCk7Cit2YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMSk7Cit2YXIgaG9zdFJlcG9ydEVycm9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMzKTsKK3ZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMyKTsKK3ZhciBwZXJmb3JtID0gX193X3BkZmpzX3JlcXVpcmVfXygxMzQpOwordmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMzKTsKK3ZhciBpc0ZvcmNlZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTIpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIFY4X1ZFUlNJT04gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzNSk7Cit2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwordmFyIFBST01JU0UgPSAnUHJvbWlzZSc7Cit2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0OwordmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKK3ZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpOwordmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2U7Cit2YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjsKK3ZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDsKK3ZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7Cit2YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTsKK3ZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7Cit2YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7Cit2YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnOwordmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpOwordmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJzsKK3ZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJzsKK3ZhciBQRU5ESU5HID0gMDsKK3ZhciBGVUxGSUxMRUQgPSAxOwordmFyIFJFSkVDVEVEID0gMjsKK3ZhciBIQU5ETEVEID0gMTsKK3ZhciBVTkhBTkRMRUQgPSAyOwordmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47Cit2YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkgeworIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gaW5zcGVjdFNvdXJjZShQcm9taXNlQ29uc3RydWN0b3IpICE9PSBTdHJpbmcoUHJvbWlzZUNvbnN0cnVjdG9yKTsKKyBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UpIHsKKyAgaWYgKFY4X1ZFUlNJT04gPT09IDY2KQorICAgcmV0dXJuIHRydWU7CisgIGlmICghSVNfTk9ERSAmJiB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ICE9ICdmdW5jdGlvbicpCisgICByZXR1cm4gdHJ1ZTsKKyB9CisgaWYgKElTX1BVUkUgJiYgIVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGVbJ2ZpbmFsbHknXSkKKyAgcmV0dXJuIHRydWU7CisgaWYgKFY4X1ZFUlNJT04gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFByb21pc2VDb25zdHJ1Y3RvcikpCisgIHJldHVybiBmYWxzZTsKKyB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpOworIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7CisgIGV4ZWMoZnVuY3Rpb24gKCkgeworICB9LCBmdW5jdGlvbiAoKSB7CisgIH0pOworIH07CisgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9OworIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7CisgcmV0dXJuICEocHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyB9KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlKTsKK30pOwordmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsKKyBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7CisgfSk7Cit9KTsKK3ZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7CisgdmFyIHRoZW47CisgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlOworfTsKK3ZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIGlzUmVqZWN0KSB7CisgaWYgKHN0YXRlLm5vdGlmaWVkKQorICByZXR1cm47Cisgc3RhdGUubm90aWZpZWQgPSB0cnVlOworIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9uczsKKyBtaWNyb3Rhc2soZnVuY3Rpb24gKCkgeworICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTsKKyAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEOworICB2YXIgaW5kZXggPSAwOworICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHsKKyAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdOworICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDsKKyAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTsKKyAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7CisgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluOworICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkOworICAgdHJ5IHsKKyAgICBpZiAoaGFuZGxlcikgeworICAgICBpZiAoIW9rKSB7CisgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpCisgICAgICAgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpOworICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDsKKyAgICAgfQorICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkKKyAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICBlbHNlIHsKKyAgICAgIGlmIChkb21haW4pCisgICAgICAgZG9tYWluLmVudGVyKCk7CisgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsKKyAgICAgIGlmIChkb21haW4pIHsKKyAgICAgICBkb21haW4uZXhpdCgpOworICAgICAgIGV4aXRlZCA9IHRydWU7CisgICAgICB9CisgICAgIH0KKyAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkgeworICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTsKKyAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7CisgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpOworICAgICB9IGVsc2UKKyAgICAgIHJlc29sdmUocmVzdWx0KTsKKyAgICB9IGVsc2UKKyAgICAgcmVqZWN0KHZhbHVlKTsKKyAgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKQorICAgICBkb21haW4uZXhpdCgpOworICAgIHJlamVjdChlcnJvcik7CisgICB9CisgIH0KKyAgc3RhdGUucmVhY3Rpb25zID0gW107CisgIHN0YXRlLm5vdGlmaWVkID0gZmFsc2U7CisgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKQorICAgb25VbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpOworIH0pOworfTsKK3ZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikgeworIHZhciBldmVudCwgaGFuZGxlcjsKKyBpZiAoRElTUEFUQ0hfRVZFTlQpIHsKKyAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTsKKyAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7CisgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjsKKyAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTsKKyAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworIH0gZWxzZQorICBldmVudCA9IHsKKyAgIHByb21pc2U6IHByb21pc2UsCisgICByZWFzb246IHJlYXNvbgorICB9OworIGlmIChoYW5kbGVyID0gZ2xvYmFsWydvbicgKyBuYW1lXSkKKyAgaGFuZGxlcihldmVudCk7CisgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikKKyAgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTsKK307Cit2YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHsKKyB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7CisgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlOworICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpOworICB2YXIgcmVzdWx0OworICBpZiAoSVNfVU5IQU5ETEVEKSB7CisgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSVNfTk9ERSkgeworICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTsKKyAgICB9IGVsc2UKKyAgICAgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7CisgICB9KTsKKyAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDsKKyAgIGlmIChyZXN1bHQuZXJyb3IpCisgICAgdGhyb3cgcmVzdWx0LnZhbHVlOworICB9CisgfSk7Cit9OwordmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7CisgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50OworfTsKK3ZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSkgeworIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHsKKyAgaWYgKElTX05PREUpIHsKKyAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpOworICB9IGVsc2UKKyAgIGRpc3BhdGNoRXZlbnQoUkVKRUNUSU9OX0hBTkRMRUQsIHByb21pc2UsIHN0YXRlLnZhbHVlKTsKKyB9KTsKK307Cit2YXIgYmluZCA9IGZ1bmN0aW9uIChmbiwgcHJvbWlzZSwgc3RhdGUsIHVud3JhcCkgeworIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHsKKyAgZm4ocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApOworIH07Cit9OwordmFyIGludGVybmFsUmVqZWN0ID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7CisgaWYgKHN0YXRlLmRvbmUpCisgIHJldHVybjsKKyBzdGF0ZS5kb25lID0gdHJ1ZTsKKyBpZiAodW53cmFwKQorICBzdGF0ZSA9IHVud3JhcDsKKyBzdGF0ZS52YWx1ZSA9IHZhbHVlOworIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7Cisgbm90aWZ5KHByb21pc2UsIHN0YXRlLCB0cnVlKTsKK307Cit2YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7CisgaWYgKHN0YXRlLmRvbmUpCisgIHJldHVybjsKKyBzdGF0ZS5kb25lID0gdHJ1ZTsKKyBpZiAodW53cmFwKQorICBzdGF0ZSA9IHVud3JhcDsKKyB0cnkgeworICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpCisgICB0aHJvdyBUeXBlRXJyb3IoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7CisgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7CisgIGlmICh0aGVuKSB7CisgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkgeworICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9OworICAgIHRyeSB7CisgICAgIHRoZW4uY2FsbCh2YWx1ZSwgYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHdyYXBwZXIsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpKTsKKyAgICB9IGNhdGNoIChlcnJvcikgeworICAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB3cmFwcGVyLCBlcnJvciwgc3RhdGUpOworICAgIH0KKyAgIH0pOworICB9IGVsc2UgeworICAgc3RhdGUudmFsdWUgPSB2YWx1ZTsKKyAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEOworICAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCBmYWxzZSk7CisgIH0KKyB9IGNhdGNoIChlcnJvcikgeworICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7CisgfQorfTsKK2lmIChGT1JDRUQpIHsKKyBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7CisgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTsKKyAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTsKKyAgSW50ZXJuYWwuY2FsbCh0aGlzKTsKKyAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgdHJ5IHsKKyAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB0aGlzLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHRoaXMsIHN0YXRlKSk7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICBpbnRlcm5hbFJlamVjdCh0aGlzLCBzdGF0ZSwgZXJyb3IpOworICB9CisgfTsKKyBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHsKKyAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CisgICB0eXBlOiBQUk9NSVNFLAorICAgZG9uZTogZmFsc2UsCisgICBub3RpZmllZDogZmFsc2UsCisgICBwYXJlbnQ6IGZhbHNlLAorICAgcmVhY3Rpb25zOiBbXSwKKyAgIHJlamVjdGlvbjogZmFsc2UsCisgICBzdGF0ZTogUEVORElORywKKyAgIHZhbHVlOiB1bmRlZmluZWQKKyAgfSk7CisgfTsKKyBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7CisgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHsKKyAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpOworICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpOworICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTsKKyAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7CisgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7CisgICBzdGF0ZS5wYXJlbnQgPSB0cnVlOworICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pOworICAgaWYgKHN0YXRlLnN0YXRlICE9IFBFTkRJTkcpCisgICAgbm90aWZ5KHRoaXMsIHN0YXRlLCBmYWxzZSk7CisgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTsKKyAgfSwKKyAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHsKKyAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTsKKyAgfQorIH0pOworIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkgeworICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpOworICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpOworICB0aGlzLnByb21pc2UgPSBwcm9taXNlOworICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgcHJvbWlzZSwgc3RhdGUpOworICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHN0YXRlKTsKKyB9OworIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7CisgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQykgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7CisgfTsKKyBpZiAoIUlTX1BVUkUgJiYgdHlwZW9mIE5hdGl2ZVByb21pc2UgPT0gJ2Z1bmN0aW9uJykgeworICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUudGhlbjsKKyAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgeworICAgdmFyIHRoYXQgPSB0aGlzOworICAgcmV0dXJuIG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgIG5hdGl2ZVRoZW4uY2FsbCh0aGF0LCByZXNvbHZlLCByZWplY3QpOworICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7CisgIH0sIHsgdW5zYWZlOiB0cnVlIH0pOworICBpZiAodHlwZW9mICRmZXRjaCA9PSAnZnVuY3Rpb24nKQorICAgJCh7CisgICAgZ2xvYmFsOiB0cnVlLAorICAgIGVudW1lcmFibGU6IHRydWUsCisgICAgZm9yY2VkOiB0cnVlCisgICB9LCB7CisgICAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0KSB7CisgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShQcm9taXNlQ29uc3RydWN0b3IsICRmZXRjaC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cykpOworICAgIH0KKyAgIH0pOworIH0KK30KKyQoeworIGdsb2JhbDogdHJ1ZSwKKyB3cmFwOiB0cnVlLAorIGZvcmNlZDogRk9SQ0VECit9LCB7IFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvciB9KTsKK3NldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpOworc2V0U3BlY2llcyhQUk9NSVNFKTsKK1Byb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTsKKyQoeworIHRhcmdldDogUFJPTUlTRSwKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogRk9SQ0VECit9LCB7CisgcmVqZWN0OiBmdW5jdGlvbiByZWplY3QocikgeworICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpOworICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7CisgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CisgfQorfSk7CiskKHsKKyB0YXJnZXQ6IFBST01JU0UsCisgc3RhdDogdHJ1ZSwKKyBmb3JjZWQ6IElTX1BVUkUgfHwgRk9SQ0VECit9LCB7CisgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7CisgIHJldHVybiBwcm9taXNlUmVzb2x2ZShJU19QVVJFICYmIHRoaXMgPT09IFByb21pc2VXcmFwcGVyID8gUHJvbWlzZUNvbnN0cnVjdG9yIDogdGhpcywgeCk7CisgfQorfSk7CiskKHsKKyB0YXJnZXQ6IFBST01JU0UsCisgc3RhdDogdHJ1ZSwKKyBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04KK30sIHsKKyBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkgeworICB2YXIgQyA9IHRoaXM7CisgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7CisgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlOworICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7CisgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKKyAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTsKKyAgIHZhciB2YWx1ZXMgPSBbXTsKKyAgIHZhciBjb3VudGVyID0gMDsKKyAgIHZhciByZW1haW5pbmcgPSAxOworICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHsKKyAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7CisgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTsKKyAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpOworICAgIHJlbWFpbmluZysrOworICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgIGlmIChhbHJlYWR5Q2FsbGVkKQorICAgICAgcmV0dXJuOworICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTsKKyAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlOworICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7CisgICAgfSwgcmVqZWN0KTsKKyAgIH0pOworICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpOworICB9KTsKKyAgaWYgKHJlc3VsdC5lcnJvcikKKyAgIHJlamVjdChyZXN1bHQudmFsdWUpOworICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOworIH0sCisgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkgeworICB2YXIgQyA9IHRoaXM7CisgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7CisgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDsKKyAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkgeworICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpOworICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHsKKyAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTsKKyAgIH0pOworICB9KTsKKyAgaWYgKHJlc3VsdC5lcnJvcikKKyAgIHJlamVjdChyZXN1bHQudmFsdWUpOworICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDEyMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cittb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlOworCisvKioqLyB9KSwKKy8qIDEyNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgcmVkZWZpbmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7CisgZm9yICh2YXIga2V5IGluIHNyYykKKyAgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTsKKyByZXR1cm4gdGFyZ2V0OworfTsKKworLyoqKi8gfSksCisvKiAxMjUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgZ2V0QnVpbHRJbiA9IF9fd19wZGZqc19yZXF1aXJlX18oNDIpOwordmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyNyk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7CisgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTsKKyB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOworIGlmIChERVNDUklQVE9SUyAmJiBDb25zdHJ1Y3RvciAmJiAhQ29uc3RydWN0b3JbU1BFQ0lFU10pIHsKKyAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHsKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzOworICAgfQorICB9KTsKKyB9Cit9OworCisvKioqLyB9KSwKKy8qIDEyNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUpIHsKKyBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeworICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTsKKyB9CisgcmV0dXJuIGl0OworfTsKKworLyoqKi8gfSksCisvKiAxMjcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIGJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYyKTsKK3ZhciBodG1sID0gX193X3BkZmpzX3JlcXVpcmVfXyg3NCk7Cit2YXIgY3JlYXRlRWxlbWVudCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpOwordmFyIElTX0lPUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI4KTsKK3ZhciBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjsKK3ZhciBzZXQgPSBnbG9iYWwuc2V0SW1tZWRpYXRlOwordmFyIGNsZWFyID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlOwordmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKK3ZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDsKK3ZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDsKK3ZhciBjb3VudGVyID0gMDsKK3ZhciBxdWV1ZSA9IHt9OwordmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnOwordmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0OwordmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkgeworIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHsKKyAgdmFyIGZuID0gcXVldWVbaWRdOworICBkZWxldGUgcXVldWVbaWRdOworICBmbigpOworIH0KK307Cit2YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7CisgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgcnVuKGlkKTsKKyB9OworfTsKK3ZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkgeworIHJ1bihldmVudC5kYXRhKTsKK307Cit2YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkgeworIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTsKK307CitpZiAoIXNldCB8fCAhY2xlYXIpIHsKKyBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHsKKyAgdmFyIGFyZ3MgPSBbXTsKKyAgdmFyIGkgPSAxOworICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpCisgICBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pOworICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkgeworICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CisgIH07CisgIGRlZmVyKGNvdW50ZXIpOworICByZXR1cm4gY291bnRlcjsKKyB9OworIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHsKKyAgZGVsZXRlIHF1ZXVlW2lkXTsKKyB9OworIGlmIChjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJykgeworICBkZWZlciA9IGZ1bmN0aW9uIChpZCkgeworICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTsKKyAgfTsKKyB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykgeworICBkZWZlciA9IGZ1bmN0aW9uIChpZCkgeworICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpOworICB9OworIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwgJiYgIUlTX0lPUykgeworICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7CisgIHBvcnQgPSBjaGFubmVsLnBvcnQyOworICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyOworICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7CisgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiYgIWZhaWxzKHBvc3QpICYmIGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonKSB7CisgIGRlZmVyID0gcG9zdDsKKyAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpOworIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSB7CisgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7CisgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkgeworICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7CisgICAgcnVuKGlkKTsKKyAgIH07CisgIH07CisgfSBlbHNlIHsKKyAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHsKKyAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7CisgIH07CisgfQorfQorbW9kdWxlLmV4cG9ydHMgPSB7Cisgc2V0OiBzZXQsCisgY2xlYXI6IGNsZWFyCit9OworCisvKioqLyB9KSwKKy8qIDEyOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgdXNlckFnZW50ID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjkpOworbW9kdWxlLmV4cG9ydHMgPSAvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KTsKKworLyoqKi8gfSksCisvKiAxMjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKTsKK21vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnOworCisvKioqLyB9KSwKKy8qIDEzMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxMikuZjsKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgbWFjcm90YXNrID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjcpLnNldDsKK3ZhciBJU19JT1MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyOCk7Cit2YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyOwordmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKK3ZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7Cit2YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnOwordmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpOwordmFyIHF1ZXVlTWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTsKK3ZhciBmbHVzaCwgaGVhZCwgbGFzdCwgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47CitpZiAoIXF1ZXVlTWljcm90YXNrKSB7CisgZmx1c2ggPSBmdW5jdGlvbiAoKSB7CisgIHZhciBwYXJlbnQsIGZuOworICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKQorICAgcGFyZW50LmV4aXQoKTsKKyAgd2hpbGUgKGhlYWQpIHsKKyAgIGZuID0gaGVhZC5mbjsKKyAgIGhlYWQgPSBoZWFkLm5leHQ7CisgICB0cnkgeworICAgIGZuKCk7CisgICB9IGNhdGNoIChlcnJvcikgeworICAgIGlmIChoZWFkKQorICAgICBub3RpZnkoKTsKKyAgICBlbHNlCisgICAgIGxhc3QgPSB1bmRlZmluZWQ7CisgICAgdGhyb3cgZXJyb3I7CisgICB9CisgIH0KKyAgbGFzdCA9IHVuZGVmaW5lZDsKKyAgaWYgKHBhcmVudCkKKyAgIHBhcmVudC5lbnRlcigpOworIH07CisgaWYgKElTX05PREUpIHsKKyAgbm90aWZ5ID0gZnVuY3Rpb24gKCkgeworICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7CisgIH07CisgfSBlbHNlIGlmIChNdXRhdGlvbk9ic2VydmVyICYmICFJU19JT1MpIHsKKyAgdG9nZ2xlID0gdHJ1ZTsKKyAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKKyAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOworICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7CisgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlOworICB9OworIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHsKKyAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOworICB0aGVuID0gcHJvbWlzZS50aGVuOworICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7CisgICB0aGVuLmNhbGwocHJvbWlzZSwgZmx1c2gpOworICB9OworIH0gZWxzZSB7CisgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHsKKyAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpOworICB9OworIH0KK30KK21vZHVsZS5leHBvcnRzID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7CisgdmFyIHRhc2sgPSB7CisgIGZuOiBmbiwKKyAgbmV4dDogdW5kZWZpbmVkCisgfTsKKyBpZiAobGFzdCkKKyAgbGFzdC5uZXh0ID0gdGFzazsKKyBpZiAoIWhlYWQpIHsKKyAgaGVhZCA9IHRhc2s7CisgIG5vdGlmeSgpOworIH0KKyBsYXN0ID0gdGFzazsKK307CisKKy8qKiovIH0pLAorLyogMTMxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjgpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7CisgYW5PYmplY3QoQyk7CisgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpCisgIHJldHVybiB4OworIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7CisgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlOworIHJlc29sdmUoeCk7CisgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7Cit9OworCisvKioqLyB9KSwKKy8qIDEzMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBhRnVuY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYzKTsKK3ZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7CisgdmFyIHJlc29sdmUsIHJlamVjdDsKKyB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkgeworICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKQorICAgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpOworICByZXNvbHZlID0gJCRyZXNvbHZlOworICByZWplY3QgPSAkJHJlamVjdDsKKyB9KTsKKyB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7CisgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTsKK307Cittb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHsKKyByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpOworfTsKKworLyoqKi8gfSksCisvKiAxMzMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikgeworIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7CisgaWYgKGNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgeworICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7CisgfQorfTsKKworLyoqKi8gfSksCisvKiAxMzQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykgeworIHRyeSB7CisgIHJldHVybiB7CisgICBlcnJvcjogZmFsc2UsCisgICB2YWx1ZTogZXhlYygpCisgIH07CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgcmV0dXJuIHsKKyAgIGVycm9yOiB0cnVlLAorICAgdmFsdWU6IGVycm9yCisgIH07CisgfQorfTsKKworLyoqKi8gfSksCisvKiAxMzUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIHVzZXJBZ2VudCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI5KTsKK3ZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7Cit2YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7Cit2YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODsKK3ZhciBtYXRjaCwgdmVyc2lvbjsKK2lmICh2OCkgeworIG1hdGNoID0gdjguc3BsaXQoJy4nKTsKKyB2ZXJzaW9uID0gbWF0Y2hbMF0gKyBtYXRjaFsxXTsKK30gZWxzZSBpZiAodXNlckFnZW50KSB7CisgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcLyhcZCspLyk7CisgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkgeworICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pOworICBpZiAobWF0Y2gpCisgICB2ZXJzaW9uID0gbWF0Y2hbMV07CisgfQorfQorbW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uICYmICt2ZXJzaW9uOworCisvKioqLyB9KSwKKy8qIDEzNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgYUZ1bmN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Myk7Cit2YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMik7Cit2YXIgcGVyZm9ybSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTM0KTsKK3ZhciBpdGVyYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDQpOworJCh7CisgdGFyZ2V0OiAnUHJvbWlzZScsCisgc3RhdDogdHJ1ZQorfSwgeworIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHsKKyAgdmFyIEMgPSB0aGlzOworICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7CisgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlOworICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7CisgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKKyAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpOworICAgdmFyIHZhbHVlcyA9IFtdOworICAgdmFyIGNvdW50ZXIgPSAwOworICAgdmFyIHJlbWFpbmluZyA9IDE7CisgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkgeworICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKzsKKyAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlOworICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7CisgICAgcmVtYWluaW5nKys7CisgICAgcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICBpZiAoYWxyZWFkeUNhbGxlZCkKKyAgICAgIHJldHVybjsKKyAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7CisgICAgIHZhbHVlc1tpbmRleF0gPSB7CisgICAgICBzdGF0dXM6ICdmdWxmaWxsZWQnLAorICAgICAgdmFsdWU6IHZhbHVlCisgICAgIH07CisgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKKyAgICB9LCBmdW5jdGlvbiAoZSkgeworICAgICBpZiAoYWxyZWFkeUNhbGxlZCkKKyAgICAgIHJldHVybjsKKyAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7CisgICAgIHZhbHVlc1tpbmRleF0gPSB7CisgICAgICBzdGF0dXM6ICdyZWplY3RlZCcsCisgICAgICByZWFzb246IGUKKyAgICAgfTsKKyAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpOworICAgIH0pOworICAgfSk7CisgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7CisgIH0pOworICBpZiAocmVzdWx0LmVycm9yKQorICAgcmVqZWN0KHJlc3VsdC52YWx1ZSk7CisgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTM3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBJU19QVVJFID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7Cit2YXIgTmF0aXZlUHJvbWlzZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIzKTsKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKTsKK3ZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7Cit2YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMSk7Cit2YXIgcmVkZWZpbmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK3ZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7CisgTmF0aXZlUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXS5jYWxsKHsKKyAgdGhlbjogZnVuY3Rpb24gKCkgeworICB9CisgfSwgZnVuY3Rpb24gKCkgeworIH0pOworfSk7CiskKHsKKyB0YXJnZXQ6ICdQcm9taXNlJywKKyBwcm90bzogdHJ1ZSwKKyByZWFsOiB0cnVlLAorIGZvcmNlZDogTk9OX0dFTkVSSUMKK30sIHsKKyAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHsKKyAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTsKKyAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7CisgIHJldHVybiB0aGlzLnRoZW4oaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB4OworICAgfSk7CisgIH0gOiBvbkZpbmFsbHksIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkgeworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICB0aHJvdyBlOworICAgfSk7CisgIH0gOiBvbkZpbmFsbHkpOworIH0KK30pOworaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHsKKyByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J10pOworfQorCisvKioqLyB9KSwKKy8qIDEzOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDEzOSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE0NCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE0Mik7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLlVSTDsKKworLyoqKi8gfSksCisvKiAxMzkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCitfX3dfcGRmanNfcmVxdWlyZV9fKDc3KTsKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQwKTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBkZWZpbmVQcm9wZXJ0aWVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg3Mik7Cit2YXIgcmVkZWZpbmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK3ZhciBhbkluc3RhbmNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjYpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIGFzc2lnbiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTAwKTsKK3ZhciBhcnJheUZyb20gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkwKTsKK3ZhciBjb2RlQXQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc4KS5jb2RlQXQ7Cit2YXIgdG9BU0NJSSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQxKTsKK3ZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd19wZGZqc19yZXF1aXJlX18oODUpOwordmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQyKTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgTmF0aXZlVVJMID0gZ2xvYmFsLlVSTDsKK3ZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zOwordmFyIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuZ2V0U3RhdGU7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsVVJMU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignVVJMJyk7Cit2YXIgZmxvb3IgPSBNYXRoLmZsb29yOwordmFyIHBvdyA9IE1hdGgucG93OwordmFyIElOVkFMSURfQVVUSE9SSVRZID0gJ0ludmFsaWQgYXV0aG9yaXR5JzsKK3ZhciBJTlZBTElEX1NDSEVNRSA9ICdJbnZhbGlkIHNjaGVtZSc7Cit2YXIgSU5WQUxJRF9IT1NUID0gJ0ludmFsaWQgaG9zdCc7Cit2YXIgSU5WQUxJRF9QT1JUID0gJ0ludmFsaWQgcG9ydCc7Cit2YXIgQUxQSEEgPSAvW0EtWmEtel0vOwordmFyIEFMUEhBTlVNRVJJQyA9IC9bXGQrLS5BLVphLXpdLzsKK3ZhciBESUdJVCA9IC9cZC87Cit2YXIgSEVYX1NUQVJUID0gL14oMHh8MFgpLzsKK3ZhciBPQ1QgPSAvXlswLTddKyQvOwordmFyIERFQyA9IC9eXGQrJC87Cit2YXIgSEVYID0gL15bXGRBLUZhLWZdKyQvOwordmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQgPSAvW1x1MDAwMFx1MDAwOVx1MDAwQVx1MDAwRCAjJS86P0BbXFxdXS87Cit2YXIgRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVF9FWENMVURJTkdfUEVSQ0VOVCA9IC9bXHUwMDAwXHUwMDA5XHUwMDBBXHUwMDBEICMvOj9AW1xcXV0vOwordmFyIExFQURJTkdfQU5EX1RSQUlMSU5HX0MwX0NPTlRST0xfT1JfU1BBQ0UgPSAvXltcdTAwMDAtXHUwMDFGIF0rfFtcdTAwMDAtXHUwMDFGIF0rJC9nOwordmFyIFRBQl9BTkRfTkVXX0xJTkUgPSAvW1x1MDAwOVx1MDAwQVx1MDAwRF0vZzsKK3ZhciBFT0Y7Cit2YXIgcGFyc2VIb3N0ID0gZnVuY3Rpb24gKHVybCwgaW5wdXQpIHsKKyB2YXIgcmVzdWx0LCBjb2RlUG9pbnRzLCBpbmRleDsKKyBpZiAoaW5wdXQuY2hhckF0KDApID09ICdbJykgeworICBpZiAoaW5wdXQuY2hhckF0KGlucHV0Lmxlbmd0aCAtIDEpICE9ICddJykKKyAgIHJldHVybiBJTlZBTElEX0hPU1Q7CisgIHJlc3VsdCA9IHBhcnNlSVB2NihpbnB1dC5zbGljZSgxLCAtMSkpOworICBpZiAoIXJlc3VsdCkKKyAgIHJldHVybiBJTlZBTElEX0hPU1Q7CisgIHVybC5ob3N0ID0gcmVzdWx0OworIH0gZWxzZSBpZiAoIWlzU3BlY2lhbCh1cmwpKSB7CisgIGlmIChGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5ULnRlc3QoaW5wdXQpKQorICAgcmV0dXJuIElOVkFMSURfSE9TVDsKKyAgcmVzdWx0ID0gJyc7CisgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb2RlUG9pbnRzLmxlbmd0aDsgaW5kZXgrKykgeworICAgcmVzdWx0ICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpbmRleF0sIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpOworICB9CisgIHVybC5ob3N0ID0gcmVzdWx0OworIH0gZWxzZSB7CisgIGlucHV0ID0gdG9BU0NJSShpbnB1dCk7CisgIGlmIChGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5ULnRlc3QoaW5wdXQpKQorICAgcmV0dXJuIElOVkFMSURfSE9TVDsKKyAgcmVzdWx0ID0gcGFyc2VJUHY0KGlucHV0KTsKKyAgaWYgKHJlc3VsdCA9PT0gbnVsbCkKKyAgIHJldHVybiBJTlZBTElEX0hPU1Q7CisgIHVybC5ob3N0ID0gcmVzdWx0OworIH0KK307Cit2YXIgcGFyc2VJUHY0ID0gZnVuY3Rpb24gKGlucHV0KSB7CisgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJy4nKTsKKyB2YXIgcGFydHNMZW5ndGgsIG51bWJlcnMsIGluZGV4LCBwYXJ0LCByYWRpeCwgbnVtYmVyLCBpcHY0OworIGlmIChwYXJ0cy5sZW5ndGggJiYgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT0gJycpIHsKKyAgcGFydHMucG9wKCk7CisgfQorIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoOworIGlmIChwYXJ0c0xlbmd0aCA+IDQpCisgIHJldHVybiBpbnB1dDsKKyBudW1iZXJzID0gW107CisgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGFydHNMZW5ndGg7IGluZGV4KyspIHsKKyAgcGFydCA9IHBhcnRzW2luZGV4XTsKKyAgaWYgKHBhcnQgPT0gJycpCisgICByZXR1cm4gaW5wdXQ7CisgIHJhZGl4ID0gMTA7CisgIGlmIChwYXJ0Lmxlbmd0aCA+IDEgJiYgcGFydC5jaGFyQXQoMCkgPT0gJzAnKSB7CisgICByYWRpeCA9IEhFWF9TVEFSVC50ZXN0KHBhcnQpID8gMTYgOiA4OworICAgcGFydCA9IHBhcnQuc2xpY2UocmFkaXggPT0gOCA/IDEgOiAyKTsKKyAgfQorICBpZiAocGFydCA9PT0gJycpIHsKKyAgIG51bWJlciA9IDA7CisgIH0gZWxzZSB7CisgICBpZiAoIShyYWRpeCA9PSAxMCA/IERFQyA6IHJhZGl4ID09IDggPyBPQ1QgOiBIRVgpLnRlc3QocGFydCkpCisgICAgcmV0dXJuIGlucHV0OworICAgbnVtYmVyID0gcGFyc2VJbnQocGFydCwgcmFkaXgpOworICB9CisgIG51bWJlcnMucHVzaChudW1iZXIpOworIH0KKyBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0c0xlbmd0aDsgaW5kZXgrKykgeworICBudW1iZXIgPSBudW1iZXJzW2luZGV4XTsKKyAgaWYgKGluZGV4ID09IHBhcnRzTGVuZ3RoIC0gMSkgeworICAgaWYgKG51bWJlciA+PSBwb3coMjU2LCA1IC0gcGFydHNMZW5ndGgpKQorICAgIHJldHVybiBudWxsOworICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkKKyAgIHJldHVybiBudWxsOworIH0KKyBpcHY0ID0gbnVtYmVycy5wb3AoKTsKKyBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJzLmxlbmd0aDsgaW5kZXgrKykgeworICBpcHY0ICs9IG51bWJlcnNbaW5kZXhdICogcG93KDI1NiwgMyAtIGluZGV4KTsKKyB9CisgcmV0dXJuIGlwdjQ7Cit9OwordmFyIHBhcnNlSVB2NiA9IGZ1bmN0aW9uIChpbnB1dCkgeworIHZhciBhZGRyZXNzID0gWworICAwLAorICAwLAorICAwLAorICAwLAorICAwLAorICAwLAorICAwLAorICAwCisgXTsKKyB2YXIgcGllY2VJbmRleCA9IDA7CisgdmFyIGNvbXByZXNzID0gbnVsbDsKKyB2YXIgcG9pbnRlciA9IDA7CisgdmFyIHZhbHVlLCBsZW5ndGgsIG51bWJlcnNTZWVuLCBpcHY0UGllY2UsIG51bWJlciwgc3dhcHMsIHN3YXA7CisgdmFyIGNoYXIgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBpbnB1dC5jaGFyQXQocG9pbnRlcik7CisgfTsKKyBpZiAoY2hhcigpID09ICc6JykgeworICBpZiAoaW5wdXQuY2hhckF0KDEpICE9ICc6JykKKyAgIHJldHVybjsKKyAgcG9pbnRlciArPSAyOworICBwaWVjZUluZGV4Kys7CisgIGNvbXByZXNzID0gcGllY2VJbmRleDsKKyB9Cisgd2hpbGUgKGNoYXIoKSkgeworICBpZiAocGllY2VJbmRleCA9PSA4KQorICAgcmV0dXJuOworICBpZiAoY2hhcigpID09ICc6JykgeworICAgaWYgKGNvbXByZXNzICE9PSBudWxsKQorICAgIHJldHVybjsKKyAgIHBvaW50ZXIrKzsKKyAgIHBpZWNlSW5kZXgrKzsKKyAgIGNvbXByZXNzID0gcGllY2VJbmRleDsKKyAgIGNvbnRpbnVlOworICB9CisgIHZhbHVlID0gbGVuZ3RoID0gMDsKKyAgd2hpbGUgKGxlbmd0aCA8IDQgJiYgSEVYLnRlc3QoY2hhcigpKSkgeworICAgdmFsdWUgPSB2YWx1ZSAqIDE2ICsgcGFyc2VJbnQoY2hhcigpLCAxNik7CisgICBwb2ludGVyKys7CisgICBsZW5ndGgrKzsKKyAgfQorICBpZiAoY2hhcigpID09ICcuJykgeworICAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHJldHVybjsKKyAgIHBvaW50ZXIgLT0gbGVuZ3RoOworICAgaWYgKHBpZWNlSW5kZXggPiA2KQorICAgIHJldHVybjsKKyAgIG51bWJlcnNTZWVuID0gMDsKKyAgIHdoaWxlIChjaGFyKCkpIHsKKyAgICBpcHY0UGllY2UgPSBudWxsOworICAgIGlmIChudW1iZXJzU2VlbiA+IDApIHsKKyAgICAgaWYgKGNoYXIoKSA9PSAnLicgJiYgbnVtYmVyc1NlZW4gPCA0KQorICAgICAgcG9pbnRlcisrOworICAgICBlbHNlCisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghRElHSVQudGVzdChjaGFyKCkpKQorICAgICByZXR1cm47CisgICAgd2hpbGUgKERJR0lULnRlc3QoY2hhcigpKSkgeworICAgICBudW1iZXIgPSBwYXJzZUludChjaGFyKCksIDEwKTsKKyAgICAgaWYgKGlwdjRQaWVjZSA9PT0gbnVsbCkKKyAgICAgIGlwdjRQaWVjZSA9IG51bWJlcjsKKyAgICAgZWxzZSBpZiAoaXB2NFBpZWNlID09IDApCisgICAgICByZXR1cm47CisgICAgIGVsc2UKKyAgICAgIGlwdjRQaWVjZSA9IGlwdjRQaWVjZSAqIDEwICsgbnVtYmVyOworICAgICBpZiAoaXB2NFBpZWNlID4gMjU1KQorICAgICAgcmV0dXJuOworICAgICBwb2ludGVyKys7CisgICAgfQorICAgIGFkZHJlc3NbcGllY2VJbmRleF0gPSBhZGRyZXNzW3BpZWNlSW5kZXhdICogMjU2ICsgaXB2NFBpZWNlOworICAgIG51bWJlcnNTZWVuKys7CisgICAgaWYgKG51bWJlcnNTZWVuID09IDIgfHwgbnVtYmVyc1NlZW4gPT0gNCkKKyAgICAgcGllY2VJbmRleCsrOworICAgfQorICAgaWYgKG51bWJlcnNTZWVuICE9IDQpCisgICAgcmV0dXJuOworICAgYnJlYWs7CisgIH0gZWxzZSBpZiAoY2hhcigpID09ICc6JykgeworICAgcG9pbnRlcisrOworICAgaWYgKCFjaGFyKCkpCisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKGNoYXIoKSkKKyAgIHJldHVybjsKKyAgYWRkcmVzc1twaWVjZUluZGV4KytdID0gdmFsdWU7CisgfQorIGlmIChjb21wcmVzcyAhPT0gbnVsbCkgeworICBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzczsKKyAgcGllY2VJbmRleCA9IDc7CisgIHdoaWxlIChwaWVjZUluZGV4ICE9IDAgJiYgc3dhcHMgPiAwKSB7CisgICBzd2FwID0gYWRkcmVzc1twaWVjZUluZGV4XTsKKyAgIGFkZHJlc3NbcGllY2VJbmRleC0tXSA9IGFkZHJlc3NbY29tcHJlc3MgKyBzd2FwcyAtIDFdOworICAgYWRkcmVzc1tjb21wcmVzcyArIC0tc3dhcHNdID0gc3dhcDsKKyAgfQorIH0gZWxzZSBpZiAocGllY2VJbmRleCAhPSA4KQorICByZXR1cm47CisgcmV0dXJuIGFkZHJlc3M7Cit9OwordmFyIGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlID0gZnVuY3Rpb24gKGlwdjYpIHsKKyB2YXIgbWF4SW5kZXggPSBudWxsOworIHZhciBtYXhMZW5ndGggPSAxOworIHZhciBjdXJyU3RhcnQgPSBudWxsOworIHZhciBjdXJyTGVuZ3RoID0gMDsKKyB2YXIgaW5kZXggPSAwOworIGZvciAoOyBpbmRleCA8IDg7IGluZGV4KyspIHsKKyAgaWYgKGlwdjZbaW5kZXhdICE9PSAwKSB7CisgICBpZiAoY3Vyckxlbmd0aCA+IG1heExlbmd0aCkgeworICAgIG1heEluZGV4ID0gY3VyclN0YXJ0OworICAgIG1heExlbmd0aCA9IGN1cnJMZW5ndGg7CisgICB9CisgICBjdXJyU3RhcnQgPSBudWxsOworICAgY3Vyckxlbmd0aCA9IDA7CisgIH0gZWxzZSB7CisgICBpZiAoY3VyclN0YXJ0ID09PSBudWxsKQorICAgIGN1cnJTdGFydCA9IGluZGV4OworICAgKytjdXJyTGVuZ3RoOworICB9CisgfQorIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7CisgIG1heEluZGV4ID0gY3VyclN0YXJ0OworICBtYXhMZW5ndGggPSBjdXJyTGVuZ3RoOworIH0KKyByZXR1cm4gbWF4SW5kZXg7Cit9OwordmFyIHNlcmlhbGl6ZUhvc3QgPSBmdW5jdGlvbiAoaG9zdCkgeworIHZhciByZXN1bHQsIGluZGV4LCBjb21wcmVzcywgaWdub3JlMDsKKyBpZiAodHlwZW9mIGhvc3QgPT0gJ251bWJlcicpIHsKKyAgcmVzdWx0ID0gW107CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIHsKKyAgIHJlc3VsdC51bnNoaWZ0KGhvc3QgJSAyNTYpOworICAgaG9zdCA9IGZsb29yKGhvc3QgLyAyNTYpOworICB9CisgIHJldHVybiByZXN1bHQuam9pbignLicpOworIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHsKKyAgcmVzdWx0ID0gJyc7CisgIGNvbXByZXNzID0gZmluZExvbmdlc3RaZXJvU2VxdWVuY2UoaG9zdCk7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHsKKyAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKQorICAgIGNvbnRpbnVlOworICAgaWYgKGlnbm9yZTApCisgICAgaWdub3JlMCA9IGZhbHNlOworICAgaWYgKGNvbXByZXNzID09PSBpbmRleCkgeworICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7CisgICAgaWdub3JlMCA9IHRydWU7CisgICB9IGVsc2UgeworICAgIHJlc3VsdCArPSBob3N0W2luZGV4XS50b1N0cmluZygxNik7CisgICAgaWYgKGluZGV4IDwgNykKKyAgICAgcmVzdWx0ICs9ICc6JzsKKyAgIH0KKyAgfQorICByZXR1cm4gJ1snICsgcmVzdWx0ICsgJ10nOworIH0KKyByZXR1cm4gaG9zdDsKK307Cit2YXIgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCA9IHt9OwordmFyIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCwgeworICcgJzogMSwKKyAnIic6IDEsCisgJzwnOiAxLAorICc+JzogMSwKKyAnYCc6IDEKK30pOwordmFyIHBhdGhQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQsIHsKKyAnIyc6IDEsCisgJz8nOiAxLAorICd7JzogMSwKKyAnfSc6IDEKK30pOwordmFyIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgcGF0aFBlcmNlbnRFbmNvZGVTZXQsIHsKKyAnLyc6IDEsCisgJzonOiAxLAorICc7JzogMSwKKyAnPSc6IDEsCisgJ0AnOiAxLAorICdbJzogMSwKKyAnXFwnOiAxLAorICddJzogMSwKKyAnXic6IDEsCisgJ3wnOiAxCit9KTsKK3ZhciBwZXJjZW50RW5jb2RlID0gZnVuY3Rpb24gKGNoYXIsIHNldCkgeworIHZhciBjb2RlID0gY29kZUF0KGNoYXIsIDApOworIHJldHVybiBjb2RlID4gMHgyMCAmJiBjb2RlIDwgMHg3RiAmJiAhaGFzKHNldCwgY2hhcikgPyBjaGFyIDogZW5jb2RlVVJJQ29tcG9uZW50KGNoYXIpOworfTsKK3ZhciBzcGVjaWFsU2NoZW1lcyA9IHsKKyBmdHA6IDIxLAorIGZpbGU6IG51bGwsCisgaHR0cDogODAsCisgaHR0cHM6IDQ0MywKKyB3czogODAsCisgd3NzOiA0NDMKK307Cit2YXIgaXNTcGVjaWFsID0gZnVuY3Rpb24gKHVybCkgeworIHJldHVybiBoYXMoc3BlY2lhbFNjaGVtZXMsIHVybC5zY2hlbWUpOworfTsKK3ZhciBpbmNsdWRlc0NyZWRlbnRpYWxzID0gZnVuY3Rpb24gKHVybCkgeworIHJldHVybiB1cmwudXNlcm5hbWUgIT0gJycgfHwgdXJsLnBhc3N3b3JkICE9ICcnOworfTsKK3ZhciBjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQgPSBmdW5jdGlvbiAodXJsKSB7CisgcmV0dXJuICF1cmwuaG9zdCB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09ICdmaWxlJzsKK307Cit2YXIgaXNXaW5kb3dzRHJpdmVMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nLCBub3JtYWxpemVkKSB7CisgdmFyIHNlY29uZDsKKyByZXR1cm4gc3RyaW5nLmxlbmd0aCA9PSAyICYmIEFMUEhBLnRlc3Qoc3RyaW5nLmNoYXJBdCgwKSkgJiYgKChzZWNvbmQgPSBzdHJpbmcuY2hhckF0KDEpKSA9PSAnOicgfHwgIW5vcm1hbGl6ZWQgJiYgc2Vjb25kID09ICd8Jyk7Cit9OwordmFyIHN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CisgdmFyIHRoaXJkOworIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmcuc2xpY2UoMCwgMikpICYmIChzdHJpbmcubGVuZ3RoID09IDIgfHwgKCh0aGlyZCA9IHN0cmluZy5jaGFyQXQoMikpID09PSAnLycgfHwgdGhpcmQgPT09ICdcXCcgfHwgdGhpcmQgPT09ICc/JyB8fCB0aGlyZCA9PT0gJyMnKSk7Cit9OwordmFyIHNob3J0ZW5VUkxzUGF0aCA9IGZ1bmN0aW9uICh1cmwpIHsKKyB2YXIgcGF0aCA9IHVybC5wYXRoOworIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoOworIGlmIChwYXRoU2l6ZSAmJiAodXJsLnNjaGVtZSAhPSAnZmlsZScgfHwgcGF0aFNpemUgIT0gMSB8fCAhaXNXaW5kb3dzRHJpdmVMZXR0ZXIocGF0aFswXSwgdHJ1ZSkpKSB7CisgIHBhdGgucG9wKCk7CisgfQorfTsKK3ZhciBpc1NpbmdsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7CisgcmV0dXJuIHNlZ21lbnQgPT09ICcuJyB8fCBzZWdtZW50LnRvTG93ZXJDYXNlKCkgPT09ICclMmUnOworfTsKK3ZhciBpc0RvdWJsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7Cisgc2VnbWVudCA9IHNlZ21lbnQudG9Mb3dlckNhc2UoKTsKKyByZXR1cm4gc2VnbWVudCA9PT0gJy4uJyB8fCBzZWdtZW50ID09PSAnJTJlLicgfHwgc2VnbWVudCA9PT0gJy4lMmUnIHx8IHNlZ21lbnQgPT09ICclMmUlMmUnOworfTsKK3ZhciBTQ0hFTUVfU1RBUlQgPSB7fTsKK3ZhciBTQ0hFTUUgPSB7fTsKK3ZhciBOT19TQ0hFTUUgPSB7fTsKK3ZhciBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWSA9IHt9OwordmFyIFBBVEhfT1JfQVVUSE9SSVRZID0ge307Cit2YXIgUkVMQVRJVkUgPSB7fTsKK3ZhciBSRUxBVElWRV9TTEFTSCA9IHt9OwordmFyIFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVMgPSB7fTsKK3ZhciBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUyA9IHt9OwordmFyIEFVVEhPUklUWSA9IHt9OwordmFyIEhPU1QgPSB7fTsKK3ZhciBIT1NUTkFNRSA9IHt9OwordmFyIFBPUlQgPSB7fTsKK3ZhciBGSUxFID0ge307Cit2YXIgRklMRV9TTEFTSCA9IHt9OwordmFyIEZJTEVfSE9TVCA9IHt9OwordmFyIFBBVEhfU1RBUlQgPSB7fTsKK3ZhciBQQVRIID0ge307Cit2YXIgQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSCA9IHt9OwordmFyIFFVRVJZID0ge307Cit2YXIgRlJBR01FTlQgPSB7fTsKK3ZhciBwYXJzZVVSTCA9IGZ1bmN0aW9uICh1cmwsIGlucHV0LCBzdGF0ZU92ZXJyaWRlLCBiYXNlKSB7CisgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBTQ0hFTUVfU1RBUlQ7CisgdmFyIHBvaW50ZXIgPSAwOworIHZhciBidWZmZXIgPSAnJzsKKyB2YXIgc2VlbkF0ID0gZmFsc2U7CisgdmFyIHNlZW5CcmFja2V0ID0gZmFsc2U7CisgdmFyIHNlZW5QYXNzd29yZFRva2VuID0gZmFsc2U7CisgdmFyIGNvZGVQb2ludHMsIGNoYXIsIGJ1ZmZlckNvZGVQb2ludHMsIGZhaWx1cmU7CisgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7CisgIHVybC5zY2hlbWUgPSAnJzsKKyAgdXJsLnVzZXJuYW1lID0gJyc7CisgIHVybC5wYXNzd29yZCA9ICcnOworICB1cmwuaG9zdCA9IG51bGw7CisgIHVybC5wb3J0ID0gbnVsbDsKKyAgdXJsLnBhdGggPSBbXTsKKyAgdXJsLnF1ZXJ5ID0gbnVsbDsKKyAgdXJsLmZyYWdtZW50ID0gbnVsbDsKKyAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSBmYWxzZTsKKyAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKExFQURJTkdfQU5EX1RSQUlMSU5HX0MwX0NPTlRST0xfT1JfU1BBQ0UsICcnKTsKKyB9CisgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFRBQl9BTkRfTkVXX0xJTkUsICcnKTsKKyBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKGlucHV0KTsKKyB3aGlsZSAocG9pbnRlciA8PSBjb2RlUG9pbnRzLmxlbmd0aCkgeworICBjaGFyID0gY29kZVBvaW50c1twb2ludGVyXTsKKyAgc3dpdGNoIChzdGF0ZSkgeworICBjYXNlIFNDSEVNRV9TVEFSVDoKKyAgIGlmIChjaGFyICYmIEFMUEhBLnRlc3QoY2hhcikpIHsKKyAgICBidWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpOworICAgIHN0YXRlID0gU0NIRU1FOworICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkgeworICAgIHN0YXRlID0gTk9fU0NIRU1FOworICAgIGNvbnRpbnVlOworICAgfSBlbHNlCisgICAgcmV0dXJuIElOVkFMSURfU0NIRU1FOworICAgYnJlYWs7CisgIGNhc2UgU0NIRU1FOgorICAgaWYgKGNoYXIgJiYgKEFMUEhBTlVNRVJJQy50ZXN0KGNoYXIpIHx8IGNoYXIgPT0gJysnIHx8IGNoYXIgPT0gJy0nIHx8IGNoYXIgPT0gJy4nKSkgeworICAgIGJ1ZmZlciArPSBjaGFyLnRvTG93ZXJDYXNlKCk7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonKSB7CisgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgKGlzU3BlY2lhbCh1cmwpICE9IGhhcyhzcGVjaWFsU2NoZW1lcywgYnVmZmVyKSB8fCBidWZmZXIgPT0gJ2ZpbGUnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpIHx8IHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwuaG9zdCkpCisgICAgIHJldHVybjsKKyAgICB1cmwuc2NoZW1lID0gYnVmZmVyOworICAgIGlmIChzdGF0ZU92ZXJyaWRlKSB7CisgICAgIGlmIChpc1NwZWNpYWwodXJsKSAmJiBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSA9PSB1cmwucG9ydCkKKyAgICAgIHVybC5wb3J0ID0gbnVsbDsKKyAgICAgcmV0dXJuOworICAgIH0KKyAgICBidWZmZXIgPSAnJzsKKyAgICBpZiAodXJsLnNjaGVtZSA9PSAnZmlsZScpIHsKKyAgICAgc3RhdGUgPSBGSUxFOworICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHVybCkgJiYgYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSB1cmwuc2NoZW1lKSB7CisgICAgIHN0YXRlID0gU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFk7CisgICAgfSBlbHNlIGlmIChpc1NwZWNpYWwodXJsKSkgeworICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVM7CisgICAgfSBlbHNlIGlmIChjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHsKKyAgICAgc3RhdGUgPSBQQVRIX09SX0FVVEhPUklUWTsKKyAgICAgcG9pbnRlcisrOworICAgIH0gZWxzZSB7CisgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTsKKyAgICAgdXJsLnBhdGgucHVzaCgnJyk7CisgICAgIHN0YXRlID0gQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSDsKKyAgICB9CisgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7CisgICAgYnVmZmVyID0gJyc7CisgICAgc3RhdGUgPSBOT19TQ0hFTUU7CisgICAgcG9pbnRlciA9IDA7CisgICAgY29udGludWU7CisgICB9IGVsc2UKKyAgICByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7CisgICBicmVhazsKKyAgY2FzZSBOT19TQ0hFTUU6CisgICBpZiAoIWJhc2UgfHwgYmFzZS5jYW5ub3RCZUFCYXNlVVJMICYmIGNoYXIgIT0gJyMnKQorICAgIHJldHVybiBJTlZBTElEX1NDSEVNRTsKKyAgIGlmIChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciA9PSAnIycpIHsKKyAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7CisgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKKyAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OworICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTsKKyAgICBzdGF0ZSA9IEZSQUdNRU5UOworICAgIGJyZWFrOworICAgfQorICAgc3RhdGUgPSBiYXNlLnNjaGVtZSA9PSAnZmlsZScgPyBGSUxFIDogUkVMQVRJVkU7CisgICBjb250aW51ZTsKKyAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWToKKyAgIGlmIChjaGFyID09ICcvJyAmJiBjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHsKKyAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOworICAgIHBvaW50ZXIrKzsKKyAgIH0gZWxzZSB7CisgICAgc3RhdGUgPSBSRUxBVElWRTsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIFBBVEhfT1JfQVVUSE9SSVRZOgorICAgaWYgKGNoYXIgPT0gJy8nKSB7CisgICAgc3RhdGUgPSBBVVRIT1JJVFk7CisgICAgYnJlYWs7CisgICB9IGVsc2UgeworICAgIHN0YXRlID0gUEFUSDsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgY2FzZSBSRUxBVElWRToKKyAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTsKKyAgIGlmIChjaGFyID09IEVPRikgeworICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7CisgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDsKKyAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKKyAgICB1cmwucG9ydCA9IGJhc2UucG9ydDsKKyAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOworICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkgeworICAgIHN0YXRlID0gUkVMQVRJVkVfU0xBU0g7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJz8nKSB7CisgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTsKKyAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkOworICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OworICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0OworICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CisgICAgdXJsLnF1ZXJ5ID0gJyc7CisgICAgc3RhdGUgPSBRVUVSWTsKKyAgIH0gZWxzZSBpZiAoY2hhciA9PSAnIycpIHsKKyAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lOworICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7CisgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7CisgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKKyAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OworICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgIHN0YXRlID0gRlJBR01FTlQ7CisgICB9IGVsc2UgeworICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7CisgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDsKKyAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKKyAgICB1cmwucG9ydCA9IGJhc2UucG9ydDsKKyAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOworICAgIHVybC5wYXRoLnBvcCgpOworICAgIHN0YXRlID0gUEFUSDsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIFJFTEFUSVZFX1NMQVNIOgorICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXCcpKSB7CisgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUzsKKyAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycpIHsKKyAgICBzdGF0ZSA9IEFVVEhPUklUWTsKKyAgIH0gZWxzZSB7CisgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTsKKyAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkOworICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OworICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0OworICAgIHN0YXRlID0gUEFUSDsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVM6CisgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOworICAgaWYgKGNoYXIgIT0gJy8nIHx8IGJ1ZmZlci5jaGFyQXQocG9pbnRlciArIDEpICE9ICcvJykKKyAgICBjb250aW51ZTsKKyAgIHBvaW50ZXIrKzsKKyAgIGJyZWFrOworICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOgorICAgaWYgKGNoYXIgIT0gJy8nICYmIGNoYXIgIT0gJ1xcJykgeworICAgIHN0YXRlID0gQVVUSE9SSVRZOworICAgIGNvbnRpbnVlOworICAgfQorICAgYnJlYWs7CisgIGNhc2UgQVVUSE9SSVRZOgorICAgaWYgKGNoYXIgPT0gJ0AnKSB7CisgICAgaWYgKHNlZW5BdCkKKyAgICAgYnVmZmVyID0gJyU0MCcgKyBidWZmZXI7CisgICAgc2VlbkF0ID0gdHJ1ZTsKKyAgICBidWZmZXJDb2RlUG9pbnRzID0gYXJyYXlGcm9tKGJ1ZmZlcik7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJDb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgIHZhciBjb2RlUG9pbnQgPSBidWZmZXJDb2RlUG9pbnRzW2ldOworICAgICBpZiAoY29kZVBvaW50ID09ICc6JyAmJiAhc2VlblBhc3N3b3JkVG9rZW4pIHsKKyAgICAgIHNlZW5QYXNzd29yZFRva2VuID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgICB9CisgICAgIHZhciBlbmNvZGVkQ29kZVBvaW50cyA9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50LCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpOworICAgICBpZiAoc2VlblBhc3N3b3JkVG9rZW4pCisgICAgICB1cmwucGFzc3dvcmQgKz0gZW5jb2RlZENvZGVQb2ludHM7CisgICAgIGVsc2UKKyAgICAgIHVybC51c2VybmFtZSArPSBlbmNvZGVkQ29kZVBvaW50czsKKyAgICB9CisgICAgYnVmZmVyID0gJyc7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnIHx8IGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkgeworICAgIGlmIChzZWVuQXQgJiYgYnVmZmVyID09ICcnKQorICAgICByZXR1cm4gSU5WQUxJRF9BVVRIT1JJVFk7CisgICAgcG9pbnRlciAtPSBhcnJheUZyb20oYnVmZmVyKS5sZW5ndGggKyAxOworICAgIGJ1ZmZlciA9ICcnOworICAgIHN0YXRlID0gSE9TVDsKKyAgIH0gZWxzZQorICAgIGJ1ZmZlciArPSBjaGFyOworICAgYnJlYWs7CisgIGNhc2UgSE9TVDoKKyAgY2FzZSBIT1NUTkFNRToKKyAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7CisgICAgc3RhdGUgPSBGSUxFX0hPU1Q7CisgICAgY29udGludWU7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonICYmICFzZWVuQnJhY2tldCkgeworICAgIGlmIChidWZmZXIgPT0gJycpCisgICAgIHJldHVybiBJTlZBTElEX0hPU1Q7CisgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7CisgICAgaWYgKGZhaWx1cmUpCisgICAgIHJldHVybiBmYWlsdXJlOworICAgIGJ1ZmZlciA9ICcnOworICAgIHN0YXRlID0gUE9SVDsKKyAgICBpZiAoc3RhdGVPdmVycmlkZSA9PSBIT1NUTkFNRSkKKyAgICAgcmV0dXJuOworICAgfSBlbHNlIGlmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICcvJyB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJyB8fCBjaGFyID09ICdcXCcgJiYgaXNTcGVjaWFsKHVybCkpIHsKKyAgICBpZiAoaXNTcGVjaWFsKHVybCkgJiYgYnVmZmVyID09ICcnKQorICAgICByZXR1cm4gSU5WQUxJRF9IT1NUOworICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIGJ1ZmZlciA9PSAnJyAmJiAoaW5jbHVkZXNDcmVkZW50aWFscyh1cmwpIHx8IHVybC5wb3J0ICE9PSBudWxsKSkKKyAgICAgcmV0dXJuOworICAgIGZhaWx1cmUgPSBwYXJzZUhvc3QodXJsLCBidWZmZXIpOworICAgIGlmIChmYWlsdXJlKQorICAgICByZXR1cm4gZmFpbHVyZTsKKyAgICBidWZmZXIgPSAnJzsKKyAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CisgICAgaWYgKHN0YXRlT3ZlcnJpZGUpCisgICAgIHJldHVybjsKKyAgICBjb250aW51ZTsKKyAgIH0gZWxzZSB7CisgICAgaWYgKGNoYXIgPT0gJ1snKQorICAgICBzZWVuQnJhY2tldCA9IHRydWU7CisgICAgZWxzZSBpZiAoY2hhciA9PSAnXScpCisgICAgIHNlZW5CcmFja2V0ID0gZmFsc2U7CisgICAgYnVmZmVyICs9IGNoYXI7CisgICB9CisgICBicmVhazsKKyAgY2FzZSBQT1JUOgorICAgaWYgKERJR0lULnRlc3QoY2hhcikpIHsKKyAgICBidWZmZXIgKz0gY2hhcjsKKyAgIH0gZWxzZSBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHwgY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpIHx8IHN0YXRlT3ZlcnJpZGUpIHsKKyAgICBpZiAoYnVmZmVyICE9ICcnKSB7CisgICAgIHZhciBwb3J0ID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7CisgICAgIGlmIChwb3J0ID4gMHhGRkZGKQorICAgICAgcmV0dXJuIElOVkFMSURfUE9SVDsKKyAgICAgdXJsLnBvcnQgPSBpc1NwZWNpYWwodXJsKSAmJiBwb3J0ID09PSBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSA/IG51bGwgOiBwb3J0OworICAgICBidWZmZXIgPSAnJzsKKyAgICB9CisgICAgaWYgKHN0YXRlT3ZlcnJpZGUpCisgICAgIHJldHVybjsKKyAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CisgICAgY29udGludWU7CisgICB9IGVsc2UKKyAgICByZXR1cm4gSU5WQUxJRF9QT1JUOworICAgYnJlYWs7CisgIGNhc2UgRklMRToKKyAgIHVybC5zY2hlbWUgPSAnZmlsZSc7CisgICBpZiAoY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnKQorICAgIHN0YXRlID0gRklMRV9TTEFTSDsKKyAgIGVsc2UgaWYgKGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnKSB7CisgICAgaWYgKGNoYXIgPT0gRU9GKSB7CisgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OworICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOworICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OworICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnPycpIHsKKyAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CisgICAgIHVybC5xdWVyeSA9ICcnOworICAgICBzdGF0ZSA9IFFVRVJZOworICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnIycpIHsKKyAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CisgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7CisgICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgICBzdGF0ZSA9IEZSQUdNRU5UOworICAgIH0gZWxzZSB7CisgICAgIGlmICghc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihjb2RlUG9pbnRzLnNsaWNlKHBvaW50ZXIpLmpvaW4oJycpKSkgeworICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOworICAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7CisgICAgIH0KKyAgICAgc3RhdGUgPSBQQVRIOworICAgICBjb250aW51ZTsKKyAgICB9CisgICB9IGVsc2UgeworICAgIHN0YXRlID0gUEFUSDsKKyAgICBjb250aW51ZTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIEZJTEVfU0xBU0g6CisgICBpZiAoY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnKSB7CisgICAgc3RhdGUgPSBGSUxFX0hPU1Q7CisgICAgYnJlYWs7CisgICB9CisgICBpZiAoYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSAnZmlsZScgJiYgIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoY29kZVBvaW50cy5zbGljZShwb2ludGVyKS5qb2luKCcnKSkpIHsKKyAgICBpZiAoaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYmFzZS5wYXRoWzBdLCB0cnVlKSkKKyAgICAgdXJsLnBhdGgucHVzaChiYXNlLnBhdGhbMF0pOworICAgIGVsc2UKKyAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CisgICB9CisgICBzdGF0ZSA9IFBBVEg7CisgICBjb250aW51ZTsKKyAgY2FzZSBGSUxFX0hPU1Q6CisgICBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnKSB7CisgICAgaWYgKCFzdGF0ZU92ZXJyaWRlICYmIGlzV2luZG93c0RyaXZlTGV0dGVyKGJ1ZmZlcikpIHsKKyAgICAgc3RhdGUgPSBQQVRIOworICAgIH0gZWxzZSBpZiAoYnVmZmVyID09ICcnKSB7CisgICAgIHVybC5ob3N0ID0gJyc7CisgICAgIGlmIChzdGF0ZU92ZXJyaWRlKQorICAgICAgcmV0dXJuOworICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CisgICAgfSBlbHNlIHsKKyAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7CisgICAgIGlmIChmYWlsdXJlKQorICAgICAgcmV0dXJuIGZhaWx1cmU7CisgICAgIGlmICh1cmwuaG9zdCA9PSAnbG9jYWxob3N0JykKKyAgICAgIHVybC5ob3N0ID0gJyc7CisgICAgIGlmIChzdGF0ZU92ZXJyaWRlKQorICAgICAgcmV0dXJuOworICAgICBidWZmZXIgPSAnJzsKKyAgICAgc3RhdGUgPSBQQVRIX1NUQVJUOworICAgIH0KKyAgICBjb250aW51ZTsKKyAgIH0gZWxzZQorICAgIGJ1ZmZlciArPSBjaGFyOworICAgYnJlYWs7CisgIGNhc2UgUEFUSF9TVEFSVDoKKyAgIGlmIChpc1NwZWNpYWwodXJsKSkgeworICAgIHN0YXRlID0gUEFUSDsKKyAgICBpZiAoY2hhciAhPSAnLycgJiYgY2hhciAhPSAnXFwnKQorICAgICBjb250aW51ZTsKKyAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnPycpIHsKKyAgICB1cmwucXVlcnkgPSAnJzsKKyAgICBzdGF0ZSA9IFFVRVJZOworICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICcjJykgeworICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgIHN0YXRlID0gRlJBR01FTlQ7CisgICB9IGVsc2UgaWYgKGNoYXIgIT0gRU9GKSB7CisgICAgc3RhdGUgPSBQQVRIOworICAgIGlmIChjaGFyICE9ICcvJykKKyAgICAgY29udGludWU7CisgICB9CisgICBicmVhazsKKyAgY2FzZSBQQVRIOgorICAgaWYgKGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSB8fCAhc3RhdGVPdmVycmlkZSAmJiAoY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycpKSB7CisgICAgaWYgKGlzRG91YmxlRG90KGJ1ZmZlcikpIHsKKyAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7CisgICAgIGlmIChjaGFyICE9ICcvJyAmJiAhKGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHsKKyAgICAgIHVybC5wYXRoLnB1c2goJycpOworICAgICB9CisgICAgfSBlbHNlIGlmIChpc1NpbmdsZURvdChidWZmZXIpKSB7CisgICAgIGlmIChjaGFyICE9ICcvJyAmJiAhKGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHsKKyAgICAgIHVybC5wYXRoLnB1c2goJycpOworICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwucGF0aC5sZW5ndGggJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkgeworICAgICAgaWYgKHVybC5ob3N0KQorICAgICAgIHVybC5ob3N0ID0gJyc7CisgICAgICBidWZmZXIgPSBidWZmZXIuY2hhckF0KDApICsgJzonOworICAgICB9CisgICAgIHVybC5wYXRoLnB1c2goYnVmZmVyKTsKKyAgICB9CisgICAgYnVmZmVyID0gJyc7CisgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpIHsKKyAgICAgd2hpbGUgKHVybC5wYXRoLmxlbmd0aCA+IDEgJiYgdXJsLnBhdGhbMF0gPT09ICcnKSB7CisgICAgICB1cmwucGF0aC5zaGlmdCgpOworICAgICB9CisgICAgfQorICAgIGlmIChjaGFyID09ICc/JykgeworICAgICB1cmwucXVlcnkgPSAnJzsKKyAgICAgc3RhdGUgPSBRVUVSWTsKKyAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7CisgICAgIHVybC5mcmFnbWVudCA9ICcnOworICAgICBzdGF0ZSA9IEZSQUdNRU5UOworICAgIH0KKyAgIH0gZWxzZSB7CisgICAgYnVmZmVyICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgcGF0aFBlcmNlbnRFbmNvZGVTZXQpOworICAgfQorICAgYnJlYWs7CisgIGNhc2UgQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSDoKKyAgIGlmIChjaGFyID09ICc/JykgeworICAgIHVybC5xdWVyeSA9ICcnOworICAgIHN0YXRlID0gUVVFUlk7CisgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7CisgICAgdXJsLmZyYWdtZW50ID0gJyc7CisgICAgc3RhdGUgPSBGUkFHTUVOVDsKKyAgIH0gZWxzZSBpZiAoY2hhciAhPSBFT0YpIHsKKyAgICB1cmwucGF0aFswXSArPSBwZXJjZW50RW5jb2RlKGNoYXIsIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpOworICAgfQorICAgYnJlYWs7CisgIGNhc2UgUVVFUlk6CisgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnIycpIHsKKyAgICB1cmwuZnJhZ21lbnQgPSAnJzsKKyAgICBzdGF0ZSA9IEZSQUdNRU5UOworICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikgeworICAgIGlmIChjaGFyID09ICInIiAmJiBpc1NwZWNpYWwodXJsKSkKKyAgICAgdXJsLnF1ZXJ5ICs9ICclMjcnOworICAgIGVsc2UgaWYgKGNoYXIgPT0gJyMnKQorICAgICB1cmwucXVlcnkgKz0gJyUyMyc7CisgICAgZWxzZQorICAgICB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaGFyLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTsKKyAgIH0KKyAgIGJyZWFrOworICBjYXNlIEZSQUdNRU5UOgorICAgaWYgKGNoYXIgIT0gRU9GKQorICAgIHVybC5mcmFnbWVudCArPSBwZXJjZW50RW5jb2RlKGNoYXIsIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCk7CisgICBicmVhazsKKyAgfQorICBwb2ludGVyKys7CisgfQorfTsKK3ZhciBVUkxDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFVSTCh1cmwpIHsKKyB2YXIgdGhhdCA9IGFuSW5zdGFuY2UodGhpcywgVVJMQ29uc3RydWN0b3IsICdVUkwnKTsKKyB2YXIgYmFzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOworIHZhciB1cmxTdHJpbmcgPSBTdHJpbmcodXJsKTsKKyB2YXIgc3RhdGUgPSBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHsgdHlwZTogJ1VSTCcgfSk7CisgdmFyIGJhc2VTdGF0ZSwgZmFpbHVyZTsKKyBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7CisgIGlmIChiYXNlIGluc3RhbmNlb2YgVVJMQ29uc3RydWN0b3IpCisgICBiYXNlU3RhdGUgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKGJhc2UpOworICBlbHNlIHsKKyAgIGZhaWx1cmUgPSBwYXJzZVVSTChiYXNlU3RhdGUgPSB7fSwgU3RyaW5nKGJhc2UpKTsKKyAgIGlmIChmYWlsdXJlKQorICAgIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTsKKyAgfQorIH0KKyBmYWlsdXJlID0gcGFyc2VVUkwoc3RhdGUsIHVybFN0cmluZywgbnVsbCwgYmFzZVN0YXRlKTsKKyBpZiAoZmFpbHVyZSkKKyAgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpOworIHZhciBzZWFyY2hQYXJhbXMgPSBzdGF0ZS5zZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7CisgdmFyIHNlYXJjaFBhcmFtc1N0YXRlID0gZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZShzZWFyY2hQYXJhbXMpOworIHNlYXJjaFBhcmFtc1N0YXRlLnVwZGF0ZVNlYXJjaFBhcmFtcyhzdGF0ZS5xdWVyeSk7Cisgc2VhcmNoUGFyYW1zU3RhdGUudXBkYXRlVVJMID0gZnVuY3Rpb24gKCkgeworICBzdGF0ZS5xdWVyeSA9IFN0cmluZyhzZWFyY2hQYXJhbXMpIHx8IG51bGw7CisgfTsKKyBpZiAoIURFU0NSSVBUT1JTKSB7CisgIHRoYXQuaHJlZiA9IHNlcmlhbGl6ZVVSTC5jYWxsKHRoYXQpOworICB0aGF0Lm9yaWdpbiA9IGdldE9yaWdpbi5jYWxsKHRoYXQpOworICB0aGF0LnByb3RvY29sID0gZ2V0UHJvdG9jb2wuY2FsbCh0aGF0KTsKKyAgdGhhdC51c2VybmFtZSA9IGdldFVzZXJuYW1lLmNhbGwodGhhdCk7CisgIHRoYXQucGFzc3dvcmQgPSBnZXRQYXNzd29yZC5jYWxsKHRoYXQpOworICB0aGF0Lmhvc3QgPSBnZXRIb3N0LmNhbGwodGhhdCk7CisgIHRoYXQuaG9zdG5hbWUgPSBnZXRIb3N0bmFtZS5jYWxsKHRoYXQpOworICB0aGF0LnBvcnQgPSBnZXRQb3J0LmNhbGwodGhhdCk7CisgIHRoYXQucGF0aG5hbWUgPSBnZXRQYXRobmFtZS5jYWxsKHRoYXQpOworICB0aGF0LnNlYXJjaCA9IGdldFNlYXJjaC5jYWxsKHRoYXQpOworICB0aGF0LnNlYXJjaFBhcmFtcyA9IGdldFNlYXJjaFBhcmFtcy5jYWxsKHRoYXQpOworICB0aGF0Lmhhc2ggPSBnZXRIYXNoLmNhbGwodGhhdCk7CisgfQorfTsKK3ZhciBVUkxQcm90b3R5cGUgPSBVUkxDb25zdHJ1Y3Rvci5wcm90b3R5cGU7Cit2YXIgc2VyaWFsaXplVVJMID0gZnVuY3Rpb24gKCkgeworIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOworIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lOworIHZhciB1c2VybmFtZSA9IHVybC51c2VybmFtZTsKKyB2YXIgcGFzc3dvcmQgPSB1cmwucGFzc3dvcmQ7CisgdmFyIGhvc3QgPSB1cmwuaG9zdDsKKyB2YXIgcG9ydCA9IHVybC5wb3J0OworIHZhciBwYXRoID0gdXJsLnBhdGg7CisgdmFyIHF1ZXJ5ID0gdXJsLnF1ZXJ5OworIHZhciBmcmFnbWVudCA9IHVybC5mcmFnbWVudDsKKyB2YXIgb3V0cHV0ID0gc2NoZW1lICsgJzonOworIGlmIChob3N0ICE9PSBudWxsKSB7CisgIG91dHB1dCArPSAnLy8nOworICBpZiAoaW5jbHVkZXNDcmVkZW50aWFscyh1cmwpKSB7CisgICBvdXRwdXQgKz0gdXNlcm5hbWUgKyAocGFzc3dvcmQgPyAnOicgKyBwYXNzd29yZCA6ICcnKSArICdAJzsKKyAgfQorICBvdXRwdXQgKz0gc2VyaWFsaXplSG9zdChob3N0KTsKKyAgaWYgKHBvcnQgIT09IG51bGwpCisgICBvdXRwdXQgKz0gJzonICsgcG9ydDsKKyB9IGVsc2UgaWYgKHNjaGVtZSA9PSAnZmlsZScpCisgIG91dHB1dCArPSAnLy8nOworIG91dHB1dCArPSB1cmwuY2Fubm90QmVBQmFzZVVSTCA/IHBhdGhbMF0gOiBwYXRoLmxlbmd0aCA/ICcvJyArIHBhdGguam9pbignLycpIDogJyc7CisgaWYgKHF1ZXJ5ICE9PSBudWxsKQorICBvdXRwdXQgKz0gJz8nICsgcXVlcnk7CisgaWYgKGZyYWdtZW50ICE9PSBudWxsKQorICBvdXRwdXQgKz0gJyMnICsgZnJhZ21lbnQ7CisgcmV0dXJuIG91dHB1dDsKK307Cit2YXIgZ2V0T3JpZ2luID0gZnVuY3Rpb24gKCkgeworIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOworIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lOworIHZhciBwb3J0ID0gdXJsLnBvcnQ7CisgaWYgKHNjaGVtZSA9PSAnYmxvYicpCisgIHRyeSB7CisgICByZXR1cm4gbmV3IFVSTChzY2hlbWUucGF0aFswXSkub3JpZ2luOworICB9IGNhdGNoIChlcnJvcikgeworICAgcmV0dXJuICdudWxsJzsKKyAgfQorIGlmIChzY2hlbWUgPT0gJ2ZpbGUnIHx8ICFpc1NwZWNpYWwodXJsKSkKKyAgcmV0dXJuICdudWxsJzsKKyByZXR1cm4gc2NoZW1lICsgJzovLycgKyBzZXJpYWxpemVIb3N0KHVybC5ob3N0KSArIChwb3J0ICE9PSBudWxsID8gJzonICsgcG9ydCA6ICcnKTsKK307Cit2YXIgZ2V0UHJvdG9jb2wgPSBmdW5jdGlvbiAoKSB7CisgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2NoZW1lICsgJzonOworfTsKK3ZhciBnZXRVc2VybmFtZSA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS51c2VybmFtZTsKK307Cit2YXIgZ2V0UGFzc3dvcmQgPSBmdW5jdGlvbiAoKSB7CisgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykucGFzc3dvcmQ7Cit9OwordmFyIGdldEhvc3QgPSBmdW5jdGlvbiAoKSB7CisgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgdmFyIGhvc3QgPSB1cmwuaG9zdDsKKyB2YXIgcG9ydCA9IHVybC5wb3J0OworIHJldHVybiBob3N0ID09PSBudWxsID8gJycgOiBwb3J0ID09PSBudWxsID8gc2VyaWFsaXplSG9zdChob3N0KSA6IHNlcmlhbGl6ZUhvc3QoaG9zdCkgKyAnOicgKyBwb3J0OworfTsKK3ZhciBnZXRIb3N0bmFtZSA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgaG9zdCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykuaG9zdDsKKyByZXR1cm4gaG9zdCA9PT0gbnVsbCA/ICcnIDogc2VyaWFsaXplSG9zdChob3N0KTsKK307Cit2YXIgZ2V0UG9ydCA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgcG9ydCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykucG9ydDsKKyByZXR1cm4gcG9ydCA9PT0gbnVsbCA/ICcnIDogU3RyaW5nKHBvcnQpOworfTsKK3ZhciBnZXRQYXRobmFtZSA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKKyB2YXIgcGF0aCA9IHVybC5wYXRoOworIHJldHVybiB1cmwuY2Fubm90QmVBQmFzZVVSTCA/IHBhdGhbMF0gOiBwYXRoLmxlbmd0aCA/ICcvJyArIHBhdGguam9pbignLycpIDogJyc7Cit9OwordmFyIGdldFNlYXJjaCA9IGZ1bmN0aW9uICgpIHsKKyB2YXIgcXVlcnkgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnF1ZXJ5OworIHJldHVybiBxdWVyeSA/ICc/JyArIHF1ZXJ5IDogJyc7Cit9OwordmFyIGdldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5zZWFyY2hQYXJhbXM7Cit9OwordmFyIGdldEhhc2ggPSBmdW5jdGlvbiAoKSB7CisgdmFyIGZyYWdtZW50ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5mcmFnbWVudDsKKyByZXR1cm4gZnJhZ21lbnQgPyAnIycgKyBmcmFnbWVudCA6ICcnOworfTsKK3ZhciBhY2Nlc3NvckRlc2NyaXB0b3IgPSBmdW5jdGlvbiAoZ2V0dGVyLCBzZXR0ZXIpIHsKKyByZXR1cm4geworICBnZXQ6IGdldHRlciwKKyAgc2V0OiBzZXR0ZXIsCisgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgZW51bWVyYWJsZTogdHJ1ZQorIH07Cit9OworaWYgKERFU0NSSVBUT1JTKSB7CisgZGVmaW5lUHJvcGVydGllcyhVUkxQcm90b3R5cGUsIHsKKyAgaHJlZjogYWNjZXNzb3JEZXNjcmlwdG9yKHNlcmlhbGl6ZVVSTCwgZnVuY3Rpb24gKGhyZWYpIHsKKyAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOworICAgdmFyIHVybFN0cmluZyA9IFN0cmluZyhocmVmKTsKKyAgIHZhciBmYWlsdXJlID0gcGFyc2VVUkwodXJsLCB1cmxTdHJpbmcpOworICAgaWYgKGZhaWx1cmUpCisgICAgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpOworICAgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSh1cmwuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXModXJsLnF1ZXJ5KTsKKyAgfSksCisgIG9yaWdpbjogYWNjZXNzb3JEZXNjcmlwdG9yKGdldE9yaWdpbiksCisgIHByb3RvY29sOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UHJvdG9jb2wsIGZ1bmN0aW9uIChwcm90b2NvbCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhwcm90b2NvbCkgKyAnOicsIFNDSEVNRV9TVEFSVCk7CisgIH0pLAorICB1c2VybmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFVzZXJuYW1lLCBmdW5jdGlvbiAodXNlcm5hbWUpIHsKKyAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOworICAgdmFyIGNvZGVQb2ludHMgPSBhcnJheUZyb20oU3RyaW5nKHVzZXJuYW1lKSk7CisgICBpZiAoY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkpCisgICAgcmV0dXJuOworICAgdXJsLnVzZXJuYW1lID0gJyc7CisgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHsKKyAgICB1cmwudXNlcm5hbWUgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2ldLCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpOworICAgfQorICB9KSwKKyAgcGFzc3dvcmQ6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXNzd29yZCwgZnVuY3Rpb24gKHBhc3N3b3JkKSB7CisgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKKyAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKFN0cmluZyhwYXNzd29yZCkpOworICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKQorICAgIHJldHVybjsKKyAgIHVybC5wYXNzd29yZCA9ICcnOworICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgdXJsLnBhc3N3b3JkICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpXSwgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0KTsKKyAgIH0KKyAgfSksCisgIGhvc3Q6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRIb3N0LCBmdW5jdGlvbiAoaG9zdCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBpZiAodXJsLmNhbm5vdEJlQUJhc2VVUkwpCisgICAgcmV0dXJuOworICAgcGFyc2VVUkwodXJsLCBTdHJpbmcoaG9zdCksIEhPU1QpOworICB9KSwKKyAgaG9zdG5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRIb3N0bmFtZSwgZnVuY3Rpb24gKGhvc3RuYW1lKSB7CisgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKKyAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkKKyAgICByZXR1cm47CisgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhob3N0bmFtZSksIEhPU1ROQU1FKTsKKyAgfSksCisgIHBvcnQ6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQb3J0LCBmdW5jdGlvbiAocG9ydCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBpZiAoY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkpCisgICAgcmV0dXJuOworICAgcG9ydCA9IFN0cmluZyhwb3J0KTsKKyAgIGlmIChwb3J0ID09ICcnKQorICAgIHVybC5wb3J0ID0gbnVsbDsKKyAgIGVsc2UKKyAgICBwYXJzZVVSTCh1cmwsIHBvcnQsIFBPUlQpOworICB9KSwKKyAgcGF0aG5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXRobmFtZSwgZnVuY3Rpb24gKHBhdGhuYW1lKSB7CisgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKKyAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkKKyAgICByZXR1cm47CisgICB1cmwucGF0aCA9IFtdOworICAgcGFyc2VVUkwodXJsLCBwYXRobmFtZSArICcnLCBQQVRIX1NUQVJUKTsKKyAgfSksCisgIHNlYXJjaDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFNlYXJjaCwgZnVuY3Rpb24gKHNlYXJjaCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTsKKyAgIGlmIChzZWFyY2ggPT0gJycpIHsKKyAgICB1cmwucXVlcnkgPSBudWxsOworICAgfSBlbHNlIHsKKyAgICBpZiAoJz8nID09IHNlYXJjaC5jaGFyQXQoMCkpCisgICAgIHNlYXJjaCA9IHNlYXJjaC5zbGljZSgxKTsKKyAgICB1cmwucXVlcnkgPSAnJzsKKyAgICBwYXJzZVVSTCh1cmwsIHNlYXJjaCwgUVVFUlkpOworICAgfQorICAgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSh1cmwuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXModXJsLnF1ZXJ5KTsKKyAgfSksCisgIHNlYXJjaFBhcmFtczogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFNlYXJjaFBhcmFtcyksCisgIGhhc2g6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRIYXNoLCBmdW5jdGlvbiAoaGFzaCkgeworICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CisgICBoYXNoID0gU3RyaW5nKGhhc2gpOworICAgaWYgKGhhc2ggPT0gJycpIHsKKyAgICB1cmwuZnJhZ21lbnQgPSBudWxsOworICAgIHJldHVybjsKKyAgIH0KKyAgIGlmICgnIycgPT0gaGFzaC5jaGFyQXQoMCkpCisgICAgaGFzaCA9IGhhc2guc2xpY2UoMSk7CisgICB1cmwuZnJhZ21lbnQgPSAnJzsKKyAgIHBhcnNlVVJMKHVybCwgaGFzaCwgRlJBR01FTlQpOworICB9KQorIH0pOworfQorcmVkZWZpbmUoVVJMUHJvdG90eXBlLCAndG9KU09OJywgZnVuY3Rpb24gdG9KU09OKCkgeworIHJldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKTsKK30sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTsKK3JlZGVmaW5lKFVSTFByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7CisgcmV0dXJuIHNlcmlhbGl6ZVVSTC5jYWxsKHRoaXMpOworfSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pOworaWYgKE5hdGl2ZVVSTCkgeworIHZhciBuYXRpdmVDcmVhdGVPYmplY3RVUkwgPSBOYXRpdmVVUkwuY3JlYXRlT2JqZWN0VVJMOworIHZhciBuYXRpdmVSZXZva2VPYmplY3RVUkwgPSBOYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMOworIGlmIChuYXRpdmVDcmVhdGVPYmplY3RVUkwpCisgIHJlZGVmaW5lKFVSTENvbnN0cnVjdG9yLCAnY3JlYXRlT2JqZWN0VVJMJywgZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGJsb2IpIHsKKyAgIHJldHVybiBuYXRpdmVDcmVhdGVPYmplY3RVUkwuYXBwbHkoTmF0aXZlVVJMLCBhcmd1bWVudHMpOworICB9KTsKKyBpZiAobmF0aXZlUmV2b2tlT2JqZWN0VVJMKQorICByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHsKKyAgIHJldHVybiBuYXRpdmVSZXZva2VPYmplY3RVUkwuYXBwbHkoTmF0aXZlVVJMLCBhcmd1bWVudHMpOworICB9KTsKK30KK3NldFRvU3RyaW5nVGFnKFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7CiskKHsKKyBnbG9iYWw6IHRydWUsCisgZm9yY2VkOiAhVVNFX05BVElWRV9VUkwsCisgc2hhbTogIURFU0NSSVBUT1JTCit9LCB7IFVSTDogVVJMQ29uc3RydWN0b3IgfSk7CisKKy8qKiovIH0pLAorLyogMTQwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKK3ZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKK21vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKKyB2YXIgdXJsID0gbmV3IFVSTCgnYj9hPTEmYj0yJmM9MycsICdodHRwOi8vYScpOworIHZhciBzZWFyY2hQYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zOworIHZhciByZXN1bHQgPSAnJzsKKyB1cmwucGF0aG5hbWUgPSAnYyUyMGQnOworIHNlYXJjaFBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7CisgIHNlYXJjaFBhcmFtc1snZGVsZXRlJ10oJ2InKTsKKyAgcmVzdWx0ICs9IGtleSArIHZhbHVlOworIH0pOworIHJldHVybiBJU19QVVJFICYmICF1cmwudG9KU09OIHx8ICFzZWFyY2hQYXJhbXMuc29ydCB8fCB1cmwuaHJlZiAhPT0gJ2h0dHA6Ly9hL2MlMjBkP2E9MSZjPTMnIHx8IHNlYXJjaFBhcmFtcy5nZXQoJ2MnKSAhPT0gJzMnIHx8IFN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKCc/YT0xJykpICE9PSAnYT0xJyB8fCAhc2VhcmNoUGFyYW1zW0lURVJBVE9SXSB8fCBuZXcgVVJMKCdodHRwczovL2FAYicpLnVzZXJuYW1lICE9PSAnYScgfHwgbmV3IFVSTFNlYXJjaFBhcmFtcyhuZXcgVVJMU2VhcmNoUGFyYW1zKCdhPWInKSkuZ2V0KCdhJykgIT09ICdiJyB8fCBuZXcgVVJMKCdodHRwOi8v0YLQtdGB0YInKS5ob3N0ICE9PSAneG4tLWUxYXliYycgfHwgbmV3IFVSTCgnaHR0cDovL2Ej0LEnKS5oYXNoICE9PSAnIyVEMCVCMScgfHwgcmVzdWx0ICE9PSAnYTFjMycgfHwgbmV3IFVSTCgnaHR0cDovL3gnLCB1bmRlZmluZWQpLmhvc3QgIT09ICd4JzsKK30pOworCisvKioqLyB9KSwKKy8qIDE0MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBtYXhJbnQgPSAyMTQ3NDgzNjQ3OwordmFyIGJhc2UgPSAzNjsKK3ZhciB0TWluID0gMTsKK3ZhciB0TWF4ID0gMjY7Cit2YXIgc2tldyA9IDM4OwordmFyIGRhbXAgPSA3MDA7Cit2YXIgaW5pdGlhbEJpYXMgPSA3MjsKK3ZhciBpbml0aWFsTiA9IDEyODsKK3ZhciBkZWxpbWl0ZXIgPSAnLSc7Cit2YXIgcmVnZXhOb25BU0NJSSA9IC9bXlwwLVx1MDA3RV0vOwordmFyIHJlZ2V4U2VwYXJhdG9ycyA9IC9bLlx1MzAwMlx1RkYwRVx1RkY2MV0vZzsKK3ZhciBPVkVSRkxPV19FUlJPUiA9ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzcyc7Cit2YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluOwordmFyIGZsb29yID0gTWF0aC5mbG9vcjsKK3ZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwordmFyIHVjczJkZWNvZGUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CisgdmFyIG91dHB1dCA9IFtdOworIHZhciBjb3VudGVyID0gMDsKKyB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKKyB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgeworICB2YXIgdmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspOworICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7CisgICB2YXIgZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspOworICAgaWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7CisgICAgb3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTsKKyAgIH0gZWxzZSB7CisgICAgb3V0cHV0LnB1c2godmFsdWUpOworICAgIGNvdW50ZXItLTsKKyAgIH0KKyAgfSBlbHNlIHsKKyAgIG91dHB1dC5wdXNoKHZhbHVlKTsKKyAgfQorIH0KKyByZXR1cm4gb3V0cHV0OworfTsKK3ZhciBkaWdpdFRvQmFzaWMgPSBmdW5jdGlvbiAoZGlnaXQpIHsKKyByZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpOworfTsKK3ZhciBhZGFwdCA9IGZ1bmN0aW9uIChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHsKKyB2YXIgayA9IDA7CisgZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTsKKyBkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7CisgZm9yICg7IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7CisgIGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTsKKyB9CisgcmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7Cit9OwordmFyIGVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCkgeworIHZhciBvdXRwdXQgPSBbXTsKKyBpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpOworIHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDsKKyB2YXIgbiA9IGluaXRpYWxOOworIHZhciBkZWx0YSA9IDA7CisgdmFyIGJpYXMgPSBpbml0aWFsQmlhczsKKyB2YXIgaSwgY3VycmVudFZhbHVlOworIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTsKKyAgaWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHsKKyAgIG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTsKKyAgfQorIH0KKyB2YXIgYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoOworIHZhciBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoOworIGlmIChiYXNpY0xlbmd0aCkgeworICBvdXRwdXQucHVzaChkZWxpbWl0ZXIpOworIH0KKyB3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkgeworICB2YXIgbSA9IG1heEludDsKKyAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CisgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTsKKyAgIGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7CisgICAgbSA9IGN1cnJlbnRWYWx1ZTsKKyAgIH0KKyAgfQorICB2YXIgaGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxOworICBpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkgeworICAgdGhyb3cgUmFuZ2VFcnJvcihPVkVSRkxPV19FUlJPUik7CisgIH0KKyAgZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTsKKyAgbiA9IG07CisgIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgY3VycmVudFZhbHVlID0gaW5wdXRbaV07CisgICBpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7CisgICAgdGhyb3cgUmFuZ2VFcnJvcihPVkVSRkxPV19FUlJPUik7CisgICB9CisgICBpZiAoY3VycmVudFZhbHVlID09IG4pIHsKKyAgICB2YXIgcSA9IGRlbHRhOworICAgIGZvciAodmFyIGsgPSBiYXNlOzsgayArPSBiYXNlKSB7CisgICAgIHZhciB0ID0gayA8PSBiaWFzID8gdE1pbiA6IGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXM7CisgICAgIGlmIChxIDwgdCkKKyAgICAgIGJyZWFrOworICAgICB2YXIgcU1pbnVzVCA9IHEgLSB0OworICAgICB2YXIgYmFzZU1pbnVzVCA9IGJhc2UgLSB0OworICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCkpKTsKKyAgICAgcSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTsKKyAgICB9CisgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxKSkpOworICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7CisgICAgZGVsdGEgPSAwOworICAgICsraGFuZGxlZENQQ291bnQ7CisgICB9CisgIH0KKyAgKytkZWx0YTsKKyAgKytuOworIH0KKyByZXR1cm4gb3V0cHV0LmpvaW4oJycpOworfTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7CisgdmFyIGVuY29kZWQgPSBbXTsKKyB2YXIgbGFiZWxzID0gaW5wdXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1x1MDAyRScpLnNwbGl0KCcuJyk7CisgdmFyIGksIGxhYmVsOworIGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHsKKyAgbGFiZWwgPSBsYWJlbHNbaV07CisgIGVuY29kZWQucHVzaChyZWdleE5vbkFTQ0lJLnRlc3QobGFiZWwpID8gJ3huLS0nICsgZW5jb2RlKGxhYmVsKSA6IGxhYmVsKTsKKyB9CisgcmV0dXJuIGVuY29kZWQuam9pbignLicpOworfTsKKworLyoqKi8gfSksCisvKiAxNDIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCitfX3dfcGRmanNfcmVxdWlyZV9fKDEwMik7Cit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKTsKK3ZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQwKTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIHJlZGVmaW5lQWxsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjQpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7Cit2YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwordmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMzKTsKK3ZhciBhbkluc3RhbmNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjYpOwordmFyIGhhc093biA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIGJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYyKTsKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXyg5NSk7Cit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGNyZWF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNzEpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOwordmFyIGdldEl0ZXJhdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDMpOwordmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193X3BkZmpzX3JlcXVpcmVfXyg5NCk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTsKK3ZhciBIZWFkZXJzID0gZ2V0QnVpbHRJbignSGVhZGVycycpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIFVSTF9TRUFSQ0hfUEFSQU1TID0gJ1VSTFNlYXJjaFBhcmFtcyc7Cit2YXIgVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IgPSBVUkxfU0VBUkNIX1BBUkFNUyArICdJdGVyYXRvcic7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsUGFyYW1zU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihVUkxfU0VBUkNIX1BBUkFNUyk7Cit2YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IpOwordmFyIHBsdXMgPSAvXCsvZzsKK3ZhciBzZXF1ZW5jZXMgPSBBcnJheSg0KTsKK3ZhciBwZXJjZW50U2VxdWVuY2UgPSBmdW5jdGlvbiAoYnl0ZXMpIHsKKyByZXR1cm4gc2VxdWVuY2VzW2J5dGVzIC0gMV0gfHwgKHNlcXVlbmNlc1tieXRlcyAtIDFdID0gUmVnRXhwKCcoKD86JVtcXGRhLWZdezJ9KXsnICsgYnl0ZXMgKyAnfSknLCAnZ2knKSk7Cit9OwordmFyIHBlcmNlbnREZWNvZGUgPSBmdW5jdGlvbiAoc2VxdWVuY2UpIHsKKyB0cnkgeworICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHNlcXVlbmNlKTsKKyB9IGNhdGNoIChlcnJvcikgeworICByZXR1cm4gc2VxdWVuY2U7CisgfQorfTsKK3ZhciBkZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChpdCkgeworIHZhciByZXN1bHQgPSBpdC5yZXBsYWNlKHBsdXMsICcgJyk7CisgdmFyIGJ5dGVzID0gNDsKKyB0cnkgeworICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdCk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgd2hpbGUgKGJ5dGVzKSB7CisgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpOworICB9CisgIHJldHVybiByZXN1bHQ7CisgfQorfTsKK3ZhciBmaW5kID0gL1shJygpfl18JTIwL2c7Cit2YXIgcmVwbGFjZSA9IHsKKyAnISc6ICclMjEnLAorICInIjogJyUyNycsCisgJygnOiAnJTI4JywKKyAnKSc6ICclMjknLAorICd+JzogJyU3RScsCisgJyUyMCc6ICcrJworfTsKK3ZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkgeworIHJldHVybiByZXBsYWNlW21hdGNoXTsKK307Cit2YXIgc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChpdCkucmVwbGFjZShmaW5kLCByZXBsYWNlcik7Cit9OwordmFyIHBhcnNlU2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHJlc3VsdCwgcXVlcnkpIHsKKyBpZiAocXVlcnkpIHsKKyAgdmFyIGF0dHJpYnV0ZXMgPSBxdWVyeS5zcGxpdCgnJicpOworICB2YXIgaW5kZXggPSAwOworICB2YXIgYXR0cmlidXRlLCBlbnRyeTsKKyAgd2hpbGUgKGluZGV4IDwgYXR0cmlidXRlcy5sZW5ndGgpIHsKKyAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaW5kZXgrK107CisgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkgeworICAgIGVudHJ5ID0gYXR0cmlidXRlLnNwbGl0KCc9Jyk7CisgICAgcmVzdWx0LnB1c2goeworICAgICBrZXk6IGRlc2VyaWFsaXplKGVudHJ5LnNoaWZ0KCkpLAorICAgICB2YWx1ZTogZGVzZXJpYWxpemUoZW50cnkuam9pbignPScpKQorICAgIH0pOworICAgfQorICB9CisgfQorfTsKK3ZhciB1cGRhdGVTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAocXVlcnkpIHsKKyB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDsKKyBwYXJzZVNlYXJjaFBhcmFtcyh0aGlzLmVudHJpZXMsIHF1ZXJ5KTsKK307Cit2YXIgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGggPSBmdW5jdGlvbiAocGFzc2VkLCByZXF1aXJlZCkgeworIGlmIChwYXNzZWQgPCByZXF1aXJlZCkKKyAgdGhyb3cgVHlwZUVycm9yKCdOb3QgZW5vdWdoIGFyZ3VtZW50cycpOworfTsKK3ZhciBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciA9IGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoZnVuY3Rpb24gSXRlcmF0b3IocGFyYW1zLCBraW5kKSB7Cisgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CisgIHR5cGU6IFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SLAorICBpdGVyYXRvcjogZ2V0SXRlcmF0b3IoZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZShwYXJhbXMpLmVudHJpZXMpLAorICBraW5kOiBraW5kCisgfSk7Cit9LCAnSXRlcmF0b3InLCBmdW5jdGlvbiBuZXh0KCkgeworIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTsKKyB2YXIga2luZCA9IHN0YXRlLmtpbmQ7CisgdmFyIHN0ZXAgPSBzdGF0ZS5pdGVyYXRvci5uZXh0KCk7CisgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTsKKyBpZiAoIXN0ZXAuZG9uZSkgeworICBzdGVwLnZhbHVlID0ga2luZCA9PT0gJ2tleXMnID8gZW50cnkua2V5IDoga2luZCA9PT0gJ3ZhbHVlcycgPyBlbnRyeS52YWx1ZSA6IFsKKyAgIGVudHJ5LmtleSwKKyAgIGVudHJ5LnZhbHVlCisgIF07CisgfQorIHJldHVybiBzdGVwOworfSk7Cit2YXIgVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBVUkxTZWFyY2hQYXJhbXMoKSB7CisgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciwgVVJMX1NFQVJDSF9QQVJBTVMpOworIHZhciBpbml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQ7CisgdmFyIHRoYXQgPSB0aGlzOworIHZhciBlbnRyaWVzID0gW107CisgdmFyIGl0ZXJhdG9yTWV0aG9kLCBpdGVyYXRvciwgbmV4dCwgc3RlcCwgZW50cnlJdGVyYXRvciwgZW50cnlOZXh0LCBmaXJzdCwgc2Vjb25kLCBrZXk7Cisgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CisgIHR5cGU6IFVSTF9TRUFSQ0hfUEFSQU1TLAorICBlbnRyaWVzOiBlbnRyaWVzLAorICB1cGRhdGVVUkw6IGZ1bmN0aW9uICgpIHsKKyAgfSwKKyAgdXBkYXRlU2VhcmNoUGFyYW1zOiB1cGRhdGVTZWFyY2hQYXJhbXMKKyB9KTsKKyBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7CisgIGlmIChpc09iamVjdChpbml0KSkgeworICAgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChpbml0KTsKKyAgIGlmICh0eXBlb2YgaXRlcmF0b3JNZXRob2QgPT09ICdmdW5jdGlvbicpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoaW5pdCk7CisgICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7CisgICAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHsKKyAgICAgZW50cnlJdGVyYXRvciA9IGdldEl0ZXJhdG9yKGFuT2JqZWN0KHN0ZXAudmFsdWUpKTsKKyAgICAgZW50cnlOZXh0ID0gZW50cnlJdGVyYXRvci5uZXh0OworICAgICBpZiAoKGZpcnN0ID0gZW50cnlOZXh0LmNhbGwoZW50cnlJdGVyYXRvcikpLmRvbmUgfHwgKHNlY29uZCA9IGVudHJ5TmV4dC5jYWxsKGVudHJ5SXRlcmF0b3IpKS5kb25lIHx8ICFlbnRyeU5leHQuY2FsbChlbnRyeUl0ZXJhdG9yKS5kb25lKQorICAgICAgdGhyb3cgVHlwZUVycm9yKCdFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyJyk7CisgICAgIGVudHJpZXMucHVzaCh7CisgICAgICBrZXk6IGZpcnN0LnZhbHVlICsgJycsCisgICAgICB2YWx1ZTogc2Vjb25kLnZhbHVlICsgJycKKyAgICAgfSk7CisgICAgfQorICAgfSBlbHNlCisgICAgZm9yIChrZXkgaW4gaW5pdCkKKyAgICAgaWYgKGhhc093bihpbml0LCBrZXkpKQorICAgICAgZW50cmllcy5wdXNoKHsKKyAgICAgICBrZXk6IGtleSwKKyAgICAgICB2YWx1ZTogaW5pdFtrZXldICsgJycKKyAgICAgIH0pOworICB9IGVsc2UgeworICAgcGFyc2VTZWFyY2hQYXJhbXMoZW50cmllcywgdHlwZW9mIGluaXQgPT09ICdzdHJpbmcnID8gaW5pdC5jaGFyQXQoMCkgPT09ICc/JyA/IGluaXQuc2xpY2UoMSkgOiBpbml0IDogaW5pdCArICcnKTsKKyAgfQorIH0KK307Cit2YXIgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlID0gVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IucHJvdG90eXBlOworcmVkZWZpbmVBbGwoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7CisgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHsKKyAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMik7CisgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7CisgIHN0YXRlLmVudHJpZXMucHVzaCh7CisgICBrZXk6IG5hbWUgKyAnJywKKyAgIHZhbHVlOiB2YWx1ZSArICcnCisgIH0pOworICBzdGF0ZS51cGRhdGVVUkwoKTsKKyB9LAorICdkZWxldGUnOiBmdW5jdGlvbiAobmFtZSkgeworICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKKyAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTsKKyAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzOworICB2YXIga2V5ID0gbmFtZSArICcnOworICB2YXIgaW5kZXggPSAwOworICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgeworICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KQorICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTsKKyAgIGVsc2UKKyAgICBpbmRleCsrOworICB9CisgIHN0YXRlLnVwZGF0ZVVSTCgpOworIH0sCisgZ2V0OiBmdW5jdGlvbiBnZXQobmFtZSkgeworICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKKyAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7CisgIHZhciBrZXkgPSBuYW1lICsgJyc7CisgIHZhciBpbmRleCA9IDA7CisgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7CisgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpCisgICAgcmV0dXJuIGVudHJpZXNbaW5kZXhdLnZhbHVlOworICB9CisgIHJldHVybiBudWxsOworIH0sCisgZ2V0QWxsOiBmdW5jdGlvbiBnZXRBbGwobmFtZSkgeworICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKKyAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7CisgIHZhciBrZXkgPSBuYW1lICsgJyc7CisgIHZhciByZXN1bHQgPSBbXTsKKyAgdmFyIGluZGV4ID0gMDsKKyAgZm9yICg7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKKyAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkKKyAgICByZXN1bHQucHVzaChlbnRyaWVzW2luZGV4XS52YWx1ZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKKyB9LAorIGhhczogZnVuY3Rpb24gaGFzKG5hbWUpIHsKKyAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7CisgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOworICB2YXIga2V5ID0gbmFtZSArICcnOworICB2YXIgaW5kZXggPSAwOworICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgeworICAgaWYgKGVudHJpZXNbaW5kZXgrK10ua2V5ID09PSBrZXkpCisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworIH0sCisgc2V0OiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHsKKyAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7CisgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7CisgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllczsKKyAgdmFyIGZvdW5kID0gZmFsc2U7CisgIHZhciBrZXkgPSBuYW1lICsgJyc7CisgIHZhciB2YWwgPSB2YWx1ZSArICcnOworICB2YXIgaW5kZXggPSAwOworICB2YXIgZW50cnk7CisgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7CisgICBlbnRyeSA9IGVudHJpZXNbaW5kZXhdOworICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7CisgICAgaWYgKGZvdW5kKQorICAgICBlbnRyaWVzLnNwbGljZShpbmRleC0tLCAxKTsKKyAgICBlbHNlIHsKKyAgICAgZm91bmQgPSB0cnVlOworICAgICBlbnRyeS52YWx1ZSA9IHZhbDsKKyAgICB9CisgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkKKyAgIGVudHJpZXMucHVzaCh7CisgICAga2V5OiBrZXksCisgICAgdmFsdWU6IHZhbAorICAgfSk7CisgIHN0YXRlLnVwZGF0ZVVSTCgpOworIH0sCisgc29ydDogZnVuY3Rpb24gc29ydCgpIHsKKyAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTsKKyAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzOworICB2YXIgc2xpY2UgPSBlbnRyaWVzLnNsaWNlKCk7CisgIHZhciBlbnRyeSwgZW50cmllc0luZGV4LCBzbGljZUluZGV4OworICBlbnRyaWVzLmxlbmd0aCA9IDA7CisgIGZvciAoc2xpY2VJbmRleCA9IDA7IHNsaWNlSW5kZXggPCBzbGljZS5sZW5ndGg7IHNsaWNlSW5kZXgrKykgeworICAgZW50cnkgPSBzbGljZVtzbGljZUluZGV4XTsKKyAgIGZvciAoZW50cmllc0luZGV4ID0gMDsgZW50cmllc0luZGV4IDwgc2xpY2VJbmRleDsgZW50cmllc0luZGV4KyspIHsKKyAgICBpZiAoZW50cmllc1tlbnRyaWVzSW5kZXhdLmtleSA+IGVudHJ5LmtleSkgeworICAgICBlbnRyaWVzLnNwbGljZShlbnRyaWVzSW5kZXgsIDAsIGVudHJ5KTsKKyAgICAgYnJlYWs7CisgICAgfQorICAgfQorICAgaWYgKGVudHJpZXNJbmRleCA9PT0gc2xpY2VJbmRleCkKKyAgICBlbnRyaWVzLnB1c2goZW50cnkpOworICB9CisgIHN0YXRlLnVwZGF0ZVVSTCgpOworIH0sCisgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaykgeworICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllczsKKyAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CisgIHZhciBpbmRleCA9IDA7CisgIHZhciBlbnRyeTsKKyAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHsKKyAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTsKKyAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7CisgIH0KKyB9LAorIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7CisgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IodGhpcywgJ2tleXMnKTsKKyB9LAorIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkgeworICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICd2YWx1ZXMnKTsKKyB9LAorIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7CisgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IodGhpcywgJ2VudHJpZXMnKTsKKyB9Cit9LCB7IGVudW1lcmFibGU6IHRydWUgfSk7CityZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsIElURVJBVE9SLCBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZW50cmllcyk7CityZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOworIHZhciByZXN1bHQgPSBbXTsKKyB2YXIgaW5kZXggPSAwOworIHZhciBlbnRyeTsKKyB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgeworICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107CisgIHJlc3VsdC5wdXNoKHNlcmlhbGl6ZShlbnRyeS5rZXkpICsgJz0nICsgc2VyaWFsaXplKGVudHJ5LnZhbHVlKSk7CisgfQorIHJldHVybiByZXN1bHQuam9pbignJicpOworfSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pOworc2V0VG9TdHJpbmdUYWcoVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTsKKyQoeworIGdsb2JhbDogdHJ1ZSwKKyBmb3JjZWQ6ICFVU0VfTkFUSVZFX1VSTAorfSwgeyBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yIH0pOworaWYgKCFVU0VfTkFUSVZFX1VSTCAmJiB0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIEhlYWRlcnMgPT0gJ2Z1bmN0aW9uJykgeworICQoeworICBnbG9iYWw6IHRydWUsCisgIGVudW1lcmFibGU6IHRydWUsCisgIGZvcmNlZDogdHJ1ZQorIH0sIHsKKyAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0KSB7CisgICB2YXIgYXJncyA9IFtpbnB1dF07CisgICB2YXIgaW5pdCwgYm9keSwgaGVhZGVyczsKKyAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworICAgIGluaXQgPSBhcmd1bWVudHNbMV07CisgICAgaWYgKGlzT2JqZWN0KGluaXQpKSB7CisgICAgIGJvZHkgPSBpbml0LmJvZHk7CisgICAgIGlmIChjbGFzc29mKGJvZHkpID09PSBVUkxfU0VBUkNIX1BBUkFNUykgeworICAgICAgaGVhZGVycyA9IGluaXQuaGVhZGVycyA/IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycykgOiBuZXcgSGVhZGVycygpOworICAgICAgaWYgKCFoZWFkZXJzLmhhcygnY29udGVudC10eXBlJykpIHsKKyAgICAgICBoZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jyk7CisgICAgICB9CisgICAgICBpbml0ID0gY3JlYXRlKGluaXQsIHsKKyAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgU3RyaW5nKGJvZHkpKSwKKyAgICAgICBoZWFkZXJzOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgaGVhZGVycykKKyAgICAgIH0pOworICAgICB9CisgICAgfQorICAgIGFyZ3MucHVzaChpbml0KTsKKyAgIH0KKyAgIHJldHVybiAkZmV0Y2guYXBwbHkodGhpcywgYXJncyk7CisgIH0KKyB9KTsKK30KK21vZHVsZS5leHBvcnRzID0geworIFVSTFNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsCisgZ2V0U3RhdGU6IGdldEludGVybmFsUGFyYW1zU3RhdGUKK307CisKKy8qKiovIH0pLAorLyogMTQzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjgpOwordmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193X3BkZmpzX3JlcXVpcmVfXyg5NCk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0KTsKKyBpZiAodHlwZW9mIGl0ZXJhdG9yTWV0aG9kICE9ICdmdW5jdGlvbicpIHsKKyAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpOworIH0KKyByZXR1cm4gYW5PYmplY3QoaXRlcmF0b3JNZXRob2QuY2FsbChpdCkpOworfTsKKworLyoqKi8gfSksCisvKiAxNDQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOworJCh7CisgdGFyZ2V0OiAnVVJMJywKKyBwcm90bzogdHJ1ZSwKKyBlbnVtZXJhYmxlOiB0cnVlCit9LCB7CisgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7CisgIHJldHVybiBVUkwucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTQ1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CisgIHRydWUgPyBmYWN0b3J5KGV4cG9ydHMpIDogdW5kZWZpbmVkOworfSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICd1c2Ugc3RyaWN0JzsKKyB2YXIgU3ltYm9sUG9seWZpbGwgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnID8gU3ltYm9sIDogZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7CisgIHJldHVybiAiU3ltYm9sKCIgKyBkZXNjcmlwdGlvbiArICIpIjsKKyB9OworIGZ1bmN0aW9uIG5vb3AoKSB7CisgfQorIHZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoeCkgeworICByZXR1cm4geCAhPT0geDsKKyB9OworIHZhciByZXRocm93QXNzZXJ0aW9uRXJyb3JSZWplY3Rpb24gPSBub29wOworIGZ1bmN0aW9uIHR5cGVJc09iamVjdCh4KSB7CisgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJzsKKyB9CisgZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTGlzdChlbGVtZW50cykgeworICByZXR1cm4gZWxlbWVudHMuc2xpY2UoKTsKKyB9CisgZnVuY3Rpb24gQXJyYXlCdWZmZXJDb3B5KGRlc3QsIGRlc3RPZmZzZXQsIHNyYywgc3JjT2Zmc2V0LCBuKSB7CisgIG5ldyBVaW50OEFycmF5KGRlc3QpLnNldChuZXcgVWludDhBcnJheShzcmMsIHNyY09mZnNldCwgbiksIGRlc3RPZmZzZXQpOworIH0KKyBmdW5jdGlvbiBJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHYpIHsKKyAgaWYgKElzTm9uTmVnYXRpdmVOdW1iZXIodikgPT09IGZhbHNlKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHYgPT09IEluZmluaXR5KSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIElzTm9uTmVnYXRpdmVOdW1iZXIodikgeworICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKE51bWJlcklzTmFOKHYpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHYgPCAwKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIENhbGwoRiwgViwgYXJncykgeworICBpZiAodHlwZW9mIEYgIT09ICdmdW5jdGlvbicpIHsKKyAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhIGZ1bmN0aW9uJyk7CisgIH0KKyAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKEYsIFYsIGFyZ3MpOworIH0KKyBmdW5jdGlvbiBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nT2JqZWN0LCBtZXRob2ROYW1lLCBhbGdvQXJnQ291bnQsIGV4dHJhQXJncykgeworICB2YXIgbWV0aG9kID0gdW5kZXJseWluZ09iamVjdFttZXRob2ROYW1lXTsKKyAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7CisgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IobWV0aG9kICsgIiBpcyBub3QgYSBtZXRob2QiKTsKKyAgIH0KKyAgIHN3aXRjaCAoYWxnb0FyZ0NvdW50KSB7CisgICBjYXNlIDA6IHsKKyAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBQcm9taXNlQ2FsbChtZXRob2QsIHVuZGVybHlpbmdPYmplY3QsIGV4dHJhQXJncyk7CisgICAgIH07CisgICAgfQorICAgY2FzZSAxOiB7CisgICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7CisgICAgICB2YXIgZnVsbEFyZ3MgPSBbYXJnXS5jb25jYXQoZXh0cmFBcmdzKTsKKyAgICAgIHJldHVybiBQcm9taXNlQ2FsbChtZXRob2QsIHVuZGVybHlpbmdPYmplY3QsIGZ1bGxBcmdzKTsKKyAgICAgfTsKKyAgICB9CisgICB9CisgIH0KKyAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgIH07CisgfQorIGZ1bmN0aW9uIEludm9rZU9yTm9vcChPLCBQLCBhcmdzKSB7CisgIHZhciBtZXRob2QgPSBPW1BdOworICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHsKKyAgIHJldHVybiB1bmRlZmluZWQ7CisgIH0KKyAgcmV0dXJuIENhbGwobWV0aG9kLCBPLCBhcmdzKTsKKyB9CisgZnVuY3Rpb24gUHJvbWlzZUNhbGwoRiwgViwgYXJncykgeworICB0cnkgeworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoQ2FsbChGLCBWLCBhcmdzKSk7CisgIH0gY2F0Y2ggKHZhbHVlKSB7CisgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2YWx1ZSk7CisgIH0KKyB9CisgZnVuY3Rpb24gVHJhbnNmZXJBcnJheUJ1ZmZlcihPKSB7CisgIHJldHVybiBPOworIH0KKyBmdW5jdGlvbiBJc0RldGFjaGVkQnVmZmVyKE8pIHsKKyAgcmV0dXJuIGZhbHNlOworIH0KKyBmdW5jdGlvbiBWYWxpZGF0ZUFuZE5vcm1hbGl6ZUhpZ2hXYXRlck1hcmsoaGlnaFdhdGVyTWFyaykgeworICBoaWdoV2F0ZXJNYXJrID0gTnVtYmVyKGhpZ2hXYXRlck1hcmspOworICBpZiAoTnVtYmVySXNOYU4oaGlnaFdhdGVyTWFyaykgfHwgaGlnaFdhdGVyTWFyayA8IDApIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdoaWdoV2F0ZXJNYXJrIHByb3BlcnR5IG9mIGEgcXVldWluZyBzdHJhdGVneSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm9uLU5hTicpOworICB9CisgIHJldHVybiBoaWdoV2F0ZXJNYXJrOworIH0KKyBmdW5jdGlvbiBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oc2l6ZSkgeworICBpZiAoc2l6ZSA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiAxOworICAgfTsKKyAgfQorICBpZiAodHlwZW9mIHNpemUgIT09ICdmdW5jdGlvbicpIHsKKyAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgcHJvcGVydHkgb2YgYSBxdWV1aW5nIHN0cmF0ZWd5IG11c3QgYmUgYSBmdW5jdGlvbicpOworICB9CisgIHJldHVybiBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIHJldHVybiBzaXplKGNodW5rKTsKKyAgfTsKKyB9CisgdmFyIG9yaWdpbmFsUHJvbWlzZSA9IFByb21pc2U7CisgdmFyIG9yaWdpbmFsUHJvbWlzZVRoZW4gPSBQcm9taXNlLnByb3RvdHlwZS50aGVuOworIHZhciBvcmlnaW5hbFByb21pc2VSZXNvbHZlID0gUHJvbWlzZS5yZXNvbHZlLmJpbmQob3JpZ2luYWxQcm9taXNlKTsKKyB2YXIgb3JpZ2luYWxQcm9taXNlUmVqZWN0ID0gUHJvbWlzZS5yZWplY3QuYmluZChvcmlnaW5hbFByb21pc2UpOworIGZ1bmN0aW9uIG5ld1Byb21pc2UoZXhlY3V0b3IpIHsKKyAgcmV0dXJuIG5ldyBvcmlnaW5hbFByb21pc2UoZXhlY3V0b3IpOworIH0KKyBmdW5jdGlvbiBwcm9taXNlUmVzb2x2ZWRXaXRoKHZhbHVlKSB7CisgIHJldHVybiBvcmlnaW5hbFByb21pc2VSZXNvbHZlKHZhbHVlKTsKKyB9CisgZnVuY3Rpb24gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFzb24pIHsKKyAgcmV0dXJuIG9yaWdpbmFsUHJvbWlzZVJlamVjdChyZWFzb24pOworIH0KKyBmdW5jdGlvbiBQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHsKKyAgcmV0dXJuIG9yaWdpbmFsUHJvbWlzZVRoZW4uY2FsbChwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7CisgfQorIGZ1bmN0aW9uIHVwb25Qcm9taXNlKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7CisgIFBlcmZvcm1Qcm9taXNlVGhlbihQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpLCB1bmRlZmluZWQsIHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbik7CisgfQorIGZ1bmN0aW9uIHVwb25GdWxmaWxsbWVudChwcm9taXNlLCBvbkZ1bGZpbGxlZCkgeworICB1cG9uUHJvbWlzZShwcm9taXNlLCBvbkZ1bGZpbGxlZCk7CisgfQorIGZ1bmN0aW9uIHVwb25SZWplY3Rpb24ocHJvbWlzZSwgb25SZWplY3RlZCkgeworICB1cG9uUHJvbWlzZShwcm9taXNlLCB1bmRlZmluZWQsIG9uUmVqZWN0ZWQpOworIH0KKyBmdW5jdGlvbiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChwcm9taXNlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHsKKyAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpOworIH0KKyBmdW5jdGlvbiBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHByb21pc2UpIHsKKyAgUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIHVuZGVmaW5lZCwgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKTsKKyB9CisgdmFyIFFVRVVFX01BWF9BUlJBWV9TSVpFID0gMTYzODQ7CisgdmFyIFNpbXBsZVF1ZXVlID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBTaW1wbGVRdWV1ZSgpIHsKKyAgIHRoaXMuX2N1cnNvciA9IDA7CisgICB0aGlzLl9zaXplID0gMDsKKyAgIHRoaXMuX2Zyb250ID0geworICAgIF9lbGVtZW50czogW10sCisgICAgX25leHQ6IHVuZGVmaW5lZAorICAgfTsKKyAgIHRoaXMuX2JhY2sgPSB0aGlzLl9mcm9udDsKKyAgIHRoaXMuX2N1cnNvciA9IDA7CisgICB0aGlzLl9zaXplID0gMDsKKyAgfQorICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2ltcGxlUXVldWUucHJvdG90eXBlLCAibGVuZ3RoIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXMuX3NpemU7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgU2ltcGxlUXVldWUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZWxlbWVudCkgeworICAgdmFyIG9sZEJhY2sgPSB0aGlzLl9iYWNrOworICAgdmFyIG5ld0JhY2sgPSBvbGRCYWNrOworICAgaWYgKG9sZEJhY2suX2VsZW1lbnRzLmxlbmd0aCA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUgLSAxKSB7CisgICAgbmV3QmFjayA9IHsKKyAgICAgX2VsZW1lbnRzOiBbXSwKKyAgICAgX25leHQ6IHVuZGVmaW5lZAorICAgIH07CisgICB9CisgICBvbGRCYWNrLl9lbGVtZW50cy5wdXNoKGVsZW1lbnQpOworICAgaWYgKG5ld0JhY2sgIT09IG9sZEJhY2spIHsKKyAgICB0aGlzLl9iYWNrID0gbmV3QmFjazsKKyAgICBvbGRCYWNrLl9uZXh0ID0gbmV3QmFjazsKKyAgIH0KKyAgICsrdGhpcy5fc2l6ZTsKKyAgfTsKKyAgU2ltcGxlUXVldWUucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gKCkgeworICAgdmFyIG9sZEZyb250ID0gdGhpcy5fZnJvbnQ7CisgICB2YXIgbmV3RnJvbnQgPSBvbGRGcm9udDsKKyAgIHZhciBvbGRDdXJzb3IgPSB0aGlzLl9jdXJzb3I7CisgICB2YXIgbmV3Q3Vyc29yID0gb2xkQ3Vyc29yICsgMTsKKyAgIHZhciBlbGVtZW50cyA9IG9sZEZyb250Ll9lbGVtZW50czsKKyAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbb2xkQ3Vyc29yXTsKKyAgIGlmIChuZXdDdXJzb3IgPT09IFFVRVVFX01BWF9BUlJBWV9TSVpFKSB7CisgICAgbmV3RnJvbnQgPSBvbGRGcm9udC5fbmV4dDsKKyAgICBuZXdDdXJzb3IgPSAwOworICAgfQorICAgLS10aGlzLl9zaXplOworICAgdGhpcy5fY3Vyc29yID0gbmV3Q3Vyc29yOworICAgaWYgKG9sZEZyb250ICE9PSBuZXdGcm9udCkgeworICAgIHRoaXMuX2Zyb250ID0gbmV3RnJvbnQ7CisgICB9CisgICBlbGVtZW50c1tvbGRDdXJzb3JdID0gdW5kZWZpbmVkOworICAgcmV0dXJuIGVsZW1lbnQ7CisgIH07CisgIFNpbXBsZVF1ZXVlLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICB2YXIgaSA9IHRoaXMuX2N1cnNvcjsKKyAgIHZhciBub2RlID0gdGhpcy5fZnJvbnQ7CisgICB2YXIgZWxlbWVudHMgPSBub2RlLl9lbGVtZW50czsKKyAgIHdoaWxlIChpICE9PSBlbGVtZW50cy5sZW5ndGggfHwgbm9kZS5fbmV4dCAhPT0gdW5kZWZpbmVkKSB7CisgICAgaWYgKGkgPT09IGVsZW1lbnRzLmxlbmd0aCkgeworICAgICBub2RlID0gbm9kZS5fbmV4dDsKKyAgICAgZWxlbWVudHMgPSBub2RlLl9lbGVtZW50czsKKyAgICAgaSA9IDA7CisgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHsKKyAgICAgIGJyZWFrOworICAgICB9CisgICAgfQorICAgIGNhbGxiYWNrKGVsZW1lbnRzW2ldKTsKKyAgICArK2k7CisgICB9CisgIH07CisgIFNpbXBsZVF1ZXVlLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkgeworICAgdmFyIGZyb250ID0gdGhpcy5fZnJvbnQ7CisgICB2YXIgY3Vyc29yID0gdGhpcy5fY3Vyc29yOworICAgcmV0dXJuIGZyb250Ll9lbGVtZW50c1tjdXJzb3JdOworICB9OworICByZXR1cm4gU2ltcGxlUXVldWU7CisgfSgpOworIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh2YWx1ZSwgZG9uZSwgZm9yQXV0aG9yQ29kZSkgeworICB2YXIgcHJvdG90eXBlID0gbnVsbDsKKyAgaWYgKGZvckF1dGhvckNvZGUgPT09IHRydWUpIHsKKyAgIHByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7CisgIH0KKyAgdmFyIG9iaiA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTsKKyAgb2JqLnZhbHVlID0gdmFsdWU7CisgIG9iai5kb25lID0gZG9uZTsKKyAgcmV0dXJuIG9iajsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZShyZWFkZXIsIHN0cmVhbSkgeworICByZWFkZXIuX2ZvckF1dGhvckNvZGUgPSB0cnVlOworICByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPSBzdHJlYW07CisgIHN0cmVhbS5fcmVhZGVyID0gcmVhZGVyOworICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykgeworICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHJlYWRlcik7CisgIH0gZWxzZSBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQocmVhZGVyKTsKKyAgfSBlbHNlIHsKKyAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQocmVhZGVyLCBzdHJlYW0uX3N0b3JlZEVycm9yKTsKKyAgfQorIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwocmVhZGVyLCByZWFzb24pIHsKKyAgdmFyIHN0cmVhbSA9IHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbTsKKyAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgcmVhc29uKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpIHsKKyAgaWYgKHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbS5fc3RhdGUgPT09ICdyZWFkYWJsZScpIHsKKyAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgbmV3IFR5cGVFcnJvcignUmVhZGVyIHdhcyByZWxlYXNlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIHN0cmVhbVwncyBjbG9zZWRuZXNzJykpOworICB9IGVsc2UgeworICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCBuZXcgVHlwZUVycm9yKCdSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtXCdzIGNsb3NlZG5lc3MnKSk7CisgIH0KKyAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7CisgIHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9IHVuZGVmaW5lZDsKKyB9CisgZnVuY3Rpb24gcmVhZGVyTG9ja0V4Y2VwdGlvbihuYW1lKSB7CisgIHJldHVybiBuZXcgVHlwZUVycm9yKCdDYW5ub3QgJyArIG5hbWUgKyAnIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgcmVhZGVyJyk7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpIHsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7CisgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0OworICB9KTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbikgeworICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTsKKyAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCByZWFzb24pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHJlYWRlcikgeworICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTsKKyAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcik7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgcmVhc29uKSB7CisgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocmVhZGVyLl9jbG9zZWRQcm9taXNlKTsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pOworICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCByZWFzb24pIHsKKyAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbik7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZShyZWFkZXIpIHsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTsKKyAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7CisgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7CisgfQorIHZhciBDYW5jZWxTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0NhbmNlbFN0ZXBzXV0nKTsKKyB2YXIgUHVsbFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbUHVsbFN0ZXBzXV0nKTsKKyBmdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSwgZm9yQXV0aG9yQ29kZSkgeworICBpZiAoZm9yQXV0aG9yQ29kZSA9PT0gdm9pZCAwKSB7CisgICBmb3JBdXRob3JDb2RlID0gZmFsc2U7CisgIH0KKyAgdmFyIHJlYWRlciA9IG5ldyBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTsKKyAgcmVhZGVyLl9mb3JBdXRob3JDb2RlID0gZm9yQXV0aG9yQ29kZTsKKyAgcmV0dXJuIHJlYWRlcjsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0pIHsKKyAgdmFyIHByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgIHZhciByZWFkUmVxdWVzdCA9IHsKKyAgICBfcmVzb2x2ZTogcmVzb2x2ZSwKKyAgICBfcmVqZWN0OiByZWplY3QKKyAgIH07CisgICBzdHJlYW0uX3JlYWRlci5fcmVhZFJlcXVlc3RzLnB1c2gocmVhZFJlcXVlc3QpOworICB9KTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHsKKyAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyOworICB2YXIgcmVhZFJlcXVlc3QgPSByZWFkZXIuX3JlYWRSZXF1ZXN0cy5zaGlmdCgpOworICByZWFkUmVxdWVzdC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoY2h1bmssIGRvbmUsIHJlYWRlci5fZm9yQXV0aG9yQ29kZSkpOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pIHsKKyAgcmV0dXJuIHN0cmVhbS5fcmVhZGVyLl9yZWFkUmVxdWVzdHMubGVuZ3RoOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSB7CisgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjsKKyAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIHZhciBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pIHsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHN0cmVhbSkgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIGNhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBSZWFkYWJsZVN0cmVhbSBpbnN0YW5jZScpOworICAgfQorICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSA9PT0gdHJ1ZSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgcmVhZGluZyBieSBhbm90aGVyIHJlYWRlcicpOworICAgfQorICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZSh0aGlzLCBzdHJlYW0pOworICAgdGhpcy5fcmVhZFJlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIH0KKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUsICJjbG9zZWQiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7CisgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZWQnKSk7CisgICAgfQorICAgIHJldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlOworICAgfSwKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjYW5jZWwnKSk7CisgICB9CisgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbignY2FuY2VsJykpOworICAgfQorICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLCByZWFzb24pOworICB9OworICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7CisgICB9CisgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigncmVhZCBmcm9tJykpOworICAgfQorICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQodGhpcyk7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUucmVsZWFzZUxvY2sgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7CisgICAgdGhyb3cgZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7CisgICB9CisgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuOworICAgfQorICAgaWYgKHRoaXMuX3JlYWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQnKTsKKyAgIH0KKyAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UodGhpcyk7CisgIH07CisgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI7CisgfSgpOworIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3JlYWRSZXF1ZXN0cycpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSB7CisgIHZhciBzdHJlYW0gPSByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW07CisgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodW5kZWZpbmVkLCB0cnVlLCByZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgfQorICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW0uX3N0b3JlZEVycm9yKTsKKyAgfQorICByZXR1cm4gc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXJbUHVsbFN0ZXBzXSgpOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7CisgIHJldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLiIgKyBuYW1lICsgIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIik7CisgfQorIHZhciBfYTsKKyB2YXIgQXN5bmNJdGVyYXRvclByb3RvdHlwZTsKKyBpZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLmFzeW5jSXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7CisgIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSAoX2EgPSB7fSwgX2FbU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gdGhpczsKKyAgfSwgX2EpOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvciwgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTsKKyB9CisgdmFyIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IHsKKyAgbmV4dDogZnVuY3Rpb24gKCkgeworICAgaWYgKElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpID09PSBmYWxzZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKCduZXh0JykpOworICAgfQorICAgdmFyIHJlYWRlciA9IHRoaXMuX2FzeW5jSXRlcmF0b3JSZWFkZXI7CisgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdpdGVyYXRlJykpOworICAgfQorICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSwgZnVuY3Rpb24gKHJlc3VsdCkgeworICAgIHZhciBkb25lID0gcmVzdWx0LmRvbmU7CisgICAgaWYgKGRvbmUpIHsKKyAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpOworICAgIH0KKyAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7CisgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh2YWx1ZSwgZG9uZSwgdHJ1ZSk7CisgICB9KTsKKyAgfSwKKyAgcmV0dXJuOiBmdW5jdGlvbiAodmFsdWUpIHsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbignbmV4dCcpKTsKKyAgIH0KKyAgIHZhciByZWFkZXIgPSB0aGlzLl9hc3luY0l0ZXJhdG9yUmVhZGVyOworICAgaWYgKHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbignZmluaXNoIGl0ZXJhdGluZycpKTsKKyAgIH0KKyAgIGlmIChyZWFkZXIuX3JlYWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQnKSk7CisgICB9CisgICBpZiAodGhpcy5fcHJldmVudENhbmNlbCA9PT0gZmFsc2UpIHsKKyAgICB2YXIgcmVzdWx0ID0gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHJlYWRlciwgdmFsdWUpOworICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UocmVhZGVyKTsKKyAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgocmVzdWx0LCBmdW5jdGlvbiAoKSB7CisgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodmFsdWUsIHRydWUsIHRydWUpOworICAgIH0pOworICAgfQorICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpOworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZhbHVlLCB0cnVlLCB0cnVlKSk7CisgIH0KKyB9OworIGlmIChBc3luY0l0ZXJhdG9yUHJvdG90eXBlICE9PSB1bmRlZmluZWQpIHsKKyAgT2JqZWN0LnNldFByb3RvdHlwZU9mKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7CisgfQorIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUsICduZXh0JywgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTsKKyBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlLCAncmV0dXJuJywgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTsKKyBmdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgcHJldmVudENhbmNlbCkgeworICBpZiAocHJldmVudENhbmNlbCA9PT0gdm9pZCAwKSB7CisgICBwcmV2ZW50Q2FuY2VsID0gZmFsc2U7CisgIH0KKyAgdmFyIHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTsKKyAgdmFyIGl0ZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUpOworICBpdGVyYXRvci5fYXN5bmNJdGVyYXRvclJlYWRlciA9IHJlYWRlcjsKKyAgaXRlcmF0b3IuX3ByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpOworICByZXR1cm4gaXRlcmF0b3I7CisgfQorIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2FzeW5jSXRlcmF0b3JSZWFkZXInKSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworIH0KKyBmdW5jdGlvbiBzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7CisgIHJldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0ZWFtQXN5bmNJdGVyYXRvciIpOworIH0KKyBmdW5jdGlvbiBEZXF1ZXVlVmFsdWUoY29udGFpbmVyKSB7CisgIHZhciBwYWlyID0gY29udGFpbmVyLl9xdWV1ZS5zaGlmdCgpOworICBjb250YWluZXIuX3F1ZXVlVG90YWxTaXplIC09IHBhaXIuc2l6ZTsKKyAgaWYgKGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPCAwKSB7CisgICBjb250YWluZXIuX3F1ZXVlVG90YWxTaXplID0gMDsKKyAgfQorICByZXR1cm4gcGFpci52YWx1ZTsKKyB9CisgZnVuY3Rpb24gRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udGFpbmVyLCB2YWx1ZSwgc2l6ZSkgeworICBzaXplID0gTnVtYmVyKHNpemUpOworICBpZiAoIUlzRmluaXRlTm9uTmVnYXRpdmVOdW1iZXIoc2l6ZSkpIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdTaXplIG11c3QgYmUgYSBmaW5pdGUsIG5vbi1OYU4sIG5vbi1uZWdhdGl2ZSBudW1iZXIuJyk7CisgIH0KKyAgY29udGFpbmVyLl9xdWV1ZS5wdXNoKHsKKyAgIHZhbHVlOiB2YWx1ZSwKKyAgIHNpemU6IHNpemUKKyAgfSk7CisgIGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgKz0gc2l6ZTsKKyB9CisgZnVuY3Rpb24gUGVla1F1ZXVlVmFsdWUoY29udGFpbmVyKSB7CisgIHZhciBwYWlyID0gY29udGFpbmVyLl9xdWV1ZS5wZWVrKCk7CisgIHJldHVybiBwYWlyLnZhbHVlOworIH0KKyBmdW5jdGlvbiBSZXNldFF1ZXVlKGNvbnRhaW5lcikgeworICBjb250YWluZXIuX3F1ZXVlID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPSAwOworIH0KKyB2YXIgQWJvcnRTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0Fib3J0U3RlcHNdXScpOworIHZhciBFcnJvclN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbRXJyb3JTdGVwc11dJyk7CisgdmFyIFdyaXRhYmxlU3RyZWFtID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbSh1bmRlcmx5aW5nU2luaywgc3RyYXRlZ3kpIHsKKyAgIGlmICh1bmRlcmx5aW5nU2luayA9PT0gdm9pZCAwKSB7CisgICAgdW5kZXJseWluZ1NpbmsgPSB7fTsKKyAgIH0KKyAgIGlmIChzdHJhdGVneSA9PT0gdm9pZCAwKSB7CisgICAgc3RyYXRlZ3kgPSB7fTsKKyAgIH0KKyAgIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbSh0aGlzKTsKKyAgIHZhciBzaXplID0gc3RyYXRlZ3kuc2l6ZTsKKyAgIHZhciBoaWdoV2F0ZXJNYXJrID0gc3RyYXRlZ3kuaGlnaFdhdGVyTWFyazsKKyAgIHZhciB0eXBlID0gdW5kZXJseWluZ1NpbmsudHlwZTsKKyAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlIGlzIHNwZWNpZmllZCcpOworICAgfQorICAgdmFyIHNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oc2l6ZSk7CisgICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7CisgICAgaGlnaFdhdGVyTWFyayA9IDE7CisgICB9CisgICBoaWdoV2F0ZXJNYXJrID0gVmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGhpZ2hXYXRlck1hcmspOworICAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHRoaXMsIHVuZGVybHlpbmdTaW5rLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTsKKyAgfQorICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCAibG9ja2VkIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKElzV3JpdGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7CisgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24oJ2xvY2tlZCcpOworICAgIH0KKyAgICByZXR1cm4gSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0aGlzKTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdhYm9ydCcpKTsKKyAgIH0KKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGFib3J0IGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7CisgICB9CisgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLCByZWFzb24pOworICB9OworICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpKTsKKyAgIH0KKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7CisgICB9CisgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQodGhpcykgPT09IHRydWUpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2xvc2UgYW4gYWxyZWFkeS1jbG9zaW5nIHN0cmVhbScpKTsKKyAgIH0KKyAgIHJldHVybiBXcml0YWJsZVN0cmVhbUNsb3NlKHRoaXMpOworICB9OworICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuZ2V0V3JpdGVyID0gZnVuY3Rpb24gKCkgeworICAgaWYgKElzV3JpdGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbignZ2V0V3JpdGVyJyk7CisgICB9CisgICByZXR1cm4gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKTsKKyAgfTsKKyAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtOworIH0oKTsKKyBmdW5jdGlvbiBBY3F1aXJlV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSkgeworICByZXR1cm4gbmV3IFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihzdHJlYW0pOworIH0KKyBmdW5jdGlvbiBDcmVhdGVXcml0YWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkgeworICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdm9pZCAwKSB7CisgICBoaWdoV2F0ZXJNYXJrID0gMTsKKyAgfQorICBpZiAoc2l6ZUFsZ29yaXRobSA9PT0gdm9pZCAwKSB7CisgICBzaXplQWxnb3JpdGhtID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiAxOworICAgfTsKKyAgfQorICB2YXIgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUpOworICBJbml0aWFsaXplV3JpdGFibGVTdHJlYW0oc3RyZWFtKTsKKyAgdmFyIGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTsKKyAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pOworICByZXR1cm4gc3RyZWFtOworIH0KKyBmdW5jdGlvbiBJbml0aWFsaXplV3JpdGFibGVTdHJlYW0oc3RyZWFtKSB7CisgIHN0cmVhbS5fc3RhdGUgPSAnd3JpdGFibGUnOworICBzdHJlYW0uX3N0b3JlZEVycm9yID0gdW5kZWZpbmVkOworICBzdHJlYW0uX3dyaXRlciA9IHVuZGVmaW5lZDsKKyAgc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7CisgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpOworICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkOworICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkOworICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGZhbHNlOworIH0KKyBmdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtKHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcicpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSB7CisgIGlmIChzdHJlYW0uX3dyaXRlciA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtQWJvcnQoc3RyZWFtLCByZWFzb24pIHsKKyAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTsKKyAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpOworICB9CisgIGlmIChzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgIT09IHVuZGVmaW5lZCkgeworICAgcmV0dXJuIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcHJvbWlzZTsKKyAgfQorICB2YXIgd2FzQWxyZWFkeUVycm9yaW5nID0gZmFsc2U7CisgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykgeworICAgd2FzQWxyZWFkeUVycm9yaW5nID0gdHJ1ZTsKKyAgIHJlYXNvbiA9IHVuZGVmaW5lZDsKKyAgfQorICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0geworICAgIF9wcm9taXNlOiB1bmRlZmluZWQsCisgICAgX3Jlc29sdmU6IHJlc29sdmUsCisgICAgX3JlamVjdDogcmVqZWN0LAorICAgIF9yZWFzb246IHJlYXNvbiwKKyAgICBfd2FzQWxyZWFkeUVycm9yaW5nOiB3YXNBbHJlYWR5RXJyb3JpbmcKKyAgIH07CisgIH0pOworICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2UgPSBwcm9taXNlOworICBpZiAod2FzQWxyZWFkeUVycm9yaW5nID09PSBmYWxzZSkgeworICAgV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKTsKKyAgfQorICByZXR1cm4gcHJvbWlzZTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pIHsKKyAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTsKKyAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJUaGUgc3RyZWFtIChpbiAiICsgc3RhdGUgKyAiIHN0YXRlKSBpcyBub3QgaW4gdGhlIHdyaXRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkIikpOworICB9CisgIHZhciBwcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICB2YXIgY2xvc2VSZXF1ZXN0ID0geworICAgIF9yZXNvbHZlOiByZXNvbHZlLAorICAgIF9yZWplY3Q6IHJlamVjdAorICAgfTsKKyAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gY2xvc2VSZXF1ZXN0OworICB9KTsKKyAgdmFyIHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyOworICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQgJiYgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPT09IHRydWUgJiYgc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7CisgIH0KKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyKTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtQWRkV3JpdGVSZXF1ZXN0KHN0cmVhbSkgeworICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgdmFyIHdyaXRlUmVxdWVzdCA9IHsKKyAgICBfcmVzb2x2ZTogcmVzb2x2ZSwKKyAgICBfcmVqZWN0OiByZWplY3QKKyAgIH07CisgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMucHVzaCh3cml0ZVJlcXVlc3QpOworICB9KTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24oc3RyZWFtLCBlcnJvcikgeworICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICBpZiAoc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIGVycm9yKTsKKyAgIHJldHVybjsKKyAgfQorICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIHJlYXNvbikgeworICB2YXIgY29udHJvbGxlciA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyOworICBzdHJlYW0uX3N0YXRlID0gJ2Vycm9yaW5nJzsKKyAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHJlYXNvbjsKKyAgdmFyIHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyOworICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQpIHsKKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVhc29uKTsKKyAgfQorICBpZiAoV3JpdGFibGVTdHJlYW1IYXNPcGVyYXRpb25NYXJrZWRJbkZsaWdodChzdHJlYW0pID09PSBmYWxzZSAmJiBjb250cm9sbGVyLl9zdGFydGVkID09PSB0cnVlKSB7CisgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pIHsKKyAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmVkJzsKKyAgc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXJbRXJyb3JTdGVwc10oKTsKKyAgdmFyIHN0b3JlZEVycm9yID0gc3RyZWFtLl9zdG9yZWRFcnJvcjsKKyAgc3RyZWFtLl93cml0ZVJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHdyaXRlUmVxdWVzdCkgeworICAgd3JpdGVSZXF1ZXN0Ll9yZWplY3Qoc3RvcmVkRXJyb3IpOworICB9KTsKKyAgc3RyZWFtLl93cml0ZVJlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIGlmIChzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPT09IHVuZGVmaW5lZCkgeworICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pOworICAgcmV0dXJuOworICB9CisgIHZhciBhYm9ydFJlcXVlc3QgPSBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3Q7CisgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgaWYgKGFib3J0UmVxdWVzdC5fd2FzQWxyZWFkeUVycm9yaW5nID09PSB0cnVlKSB7CisgICBhYm9ydFJlcXVlc3QuX3JlamVjdChzdG9yZWRFcnJvcik7CisgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7CisgICByZXR1cm47CisgIH0KKyAgdmFyIHByb21pc2UgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltBYm9ydFN0ZXBzXShhYm9ydFJlcXVlc3QuX3JlYXNvbik7CisgIHVwb25Qcm9taXNlKHByb21pc2UsIGZ1bmN0aW9uICgpIHsKKyAgIGFib3J0UmVxdWVzdC5fcmVzb2x2ZSgpOworICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pOworICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICBhYm9ydFJlcXVlc3QuX3JlamVjdChyZWFzb24pOworICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pOworICB9KTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlKHN0cmVhbSkgeworICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0Ll9yZXNvbHZlKHVuZGVmaW5lZCk7CisgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZVdpdGhFcnJvcihzdHJlYW0sIGVycm9yKSB7CisgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3JlamVjdChlcnJvcik7CisgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7CisgIFdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24oc3RyZWFtLCBlcnJvcik7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZShzdHJlYW0pIHsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdC5fcmVzb2x2ZSh1bmRlZmluZWQpOworICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkOworICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHsKKyAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7CisgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHsKKyAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Jlc29sdmUoKTsKKyAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7CisgICB9CisgIH0KKyAgc3RyZWFtLl9zdGF0ZSA9ICdjbG9zZWQnOworICB2YXIgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7CisgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkgeworICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcik7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdC5fcmVqZWN0KGVycm9yKTsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7CisgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3JlamVjdChlcnJvcik7CisgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7CisgIH0KKyAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSB7CisgIGlmIChzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworIH0KKyBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0KHN0cmVhbSkgeworICBpZiAoc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworIH0KKyBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pIHsKKyAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHN0cmVhbS5fY2xvc2VSZXF1ZXN0OworICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pIHsKKyAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5zaGlmdCgpOworIH0KKyBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSkgeworICBpZiAoc3RyZWFtLl9jbG9zZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkgeworICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QuX3JlamVjdChzdHJlYW0uX3N0b3JlZEVycm9yKTsKKyAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkOworICB9CisgIHZhciB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjsKKyAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7CisgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIHN0cmVhbS5fc3RvcmVkRXJyb3IpOworICB9CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKSB7CisgIHZhciB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjsKKyAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkICYmIGJhY2twcmVzc3VyZSAhPT0gc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHsKKyAgIGlmIChiYWNrcHJlc3N1cmUgPT09IHRydWUpIHsKKyAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQod3JpdGVyKTsKKyAgIH0gZWxzZSB7CisgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKTsKKyAgIH0KKyAgfQorICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTsKKyB9CisgdmFyIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciA9IGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSkgeworICAgaWYgKElzV3JpdGFibGVTdHJlYW0oc3RyZWFtKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFdyaXRhYmxlU3RyZWFtIGluc3RhbmNlJyk7CisgICB9CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSB3cml0aW5nIGJ5IGFub3RoZXIgd3JpdGVyJyk7CisgICB9CisgICB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID0gc3RyZWFtOworICAgc3RyZWFtLl93cml0ZXIgPSB0aGlzOworICAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTsKKyAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykgeworICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pID09PSBmYWxzZSAmJiBzdHJlYW0uX2JhY2twcmVzc3VyZSA9PT0gdHJ1ZSkgeworICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7CisgICAgfQorICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTsKKyAgIH0gZWxzZSBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHsKKyAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpOworICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7CisgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTsKKyAgIH0gZWxzZSB7CisgICAgdmFyIHN0b3JlZEVycm9yID0gc3RyZWFtLl9zdG9yZWRFcnJvcjsKKyAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RvcmVkRXJyb3IpOworICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RvcmVkRXJyb3IpOworICAgfQorICB9CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCAiY2xvc2VkIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZSwgImRlc2lyZWRTaXplIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTsKKyAgICB9CisgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTsKKyAgICB9CisgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHRoaXMpOworICAgfSwKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCAicmVhZHkiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWFkeScpKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdhYm9ydCcpKTsKKyAgIH0KKyAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignYWJvcnQnKSk7CisgICB9CisgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQWJvcnQodGhpcywgcmVhc29uKTsKKyAgfTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHsKKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKSk7CisgICB9CisgICB2YXIgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTsKKyAgIGlmIChzdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCdjbG9zZScpKTsKKyAgIH0KKyAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pID09PSB0cnVlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGFuIGFscmVhZHktY2xvc2luZyBzdHJlYW0nKSk7CisgICB9CisgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2UodGhpcyk7CisgIH07CisgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUucmVsZWFzZUxvY2sgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7CisgICB9CisgICB2YXIgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTsKKyAgIGlmIChzdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybjsKKyAgIH0KKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2UodGhpcyk7CisgIH07CisgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignd3JpdGUnKSk7CisgICB9CisgICBpZiAodGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ3dyaXRlIHRvJykpOworICAgfQorICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHRoaXMsIGNodW5rKTsKKyAgfTsKKyAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcjsKKyB9KCk7CisgZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoeCkgeworICBpZiAoIXR5cGVJc09iamVjdCh4KSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfb3duZXJXcml0YWJsZVN0cmVhbScpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckFib3J0KHdyaXRlciwgcmVhc29uKSB7CisgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07CisgIHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KHN0cmVhbSwgcmVhc29uKTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2Uod3JpdGVyKSB7CisgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07CisgIHJldHVybiBXcml0YWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24od3JpdGVyKSB7CisgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07CisgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7CisgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pID09PSB0cnVlIHx8IHN0YXRlID09PSAnY2xvc2VkJykgeworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTsKKyAgfQorICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgIH0KKyAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHdyaXRlcik7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZUNsb3NlZFByb21pc2VSZWplY3RlZCh3cml0ZXIsIGVycm9yKSB7CisgIGlmICh3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7CisgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIGVycm9yKTsKKyAgfSBlbHNlIHsKKyAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpOworICB9CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgZXJyb3IpIHsKKyAgaWYgKHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPT09ICdwZW5kaW5nJykgeworICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIGVycm9yKTsKKyAgfSBlbHNlIHsKKyAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQod3JpdGVyLCBlcnJvcik7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUod3JpdGVyKSB7CisgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07CisgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7CisgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnIHx8IHN0YXRlID09PSAnZXJyb3JpbmcnKSB7CisgICByZXR1cm4gbnVsbDsKKyAgfQorICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyKTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh3cml0ZXIpIHsKKyAgdmFyIHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTsKKyAgdmFyIHJlbGVhc2VkRXJyb3IgPSBuZXcgVHlwZUVycm9yKCdXcml0ZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtXCdzIGNsb3NlZG5lc3MnKTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCByZWxlYXNlZEVycm9yKTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVsZWFzZWRFcnJvcik7CisgIHN0cmVhbS5fd3JpdGVyID0gdW5kZWZpbmVkOworICB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW0gPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspIHsKKyAgdmFyIHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTsKKyAgdmFyIGNvbnRyb2xsZXIgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcjsKKyAgdmFyIGNodW5rU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspOworICBpZiAoc3RyZWFtICE9PSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW0pIHsKKyAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCd3cml0ZSB0bycpKTsKKyAgfQorICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgIH0KKyAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IHRydWUgfHwgc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGlzIGNsb3Npbmcgb3IgY2xvc2VkIGFuZCBjYW5ub3QgYmUgd3JpdHRlbiB0bycpKTsKKyAgfQorICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHsKKyAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpOworICB9CisgIHZhciBwcm9taXNlID0gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpOworICByZXR1cm4gcHJvbWlzZTsKKyB9CisgdmFyIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKSB7CisgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBleHBsaWNpdGx5Jyk7CisgIH0KKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeworICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvciBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcicpOworICAgfQorICAgdmFyIHN0YXRlID0gdGhpcy5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZTsKKyAgIGlmIChzdGF0ZSAhPT0gJ3dyaXRhYmxlJykgeworICAgIHJldHVybjsKKyAgIH0KKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCBlKTsKKyAgfTsKKyAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGVbQWJvcnRTdGVwc10gPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICB2YXIgcmVzdWx0ID0gdGhpcy5fYWJvcnRBbGdvcml0aG0ocmVhc29uKTsKKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7CisgICByZXR1cm4gcmVzdWx0OworICB9OworICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZVtFcnJvclN0ZXBzXSA9IGZ1bmN0aW9uICgpIHsKKyAgIFJlc2V0UXVldWUodGhpcyk7CisgIH07CisgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyOworIH0oKTsKKyBmdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoeCkgeworICBpZiAoIXR5cGVJc09iamVjdCh4KSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHsKKyAgY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtID0gc3RyZWFtOworICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisgIGNvbnRyb2xsZXIuX3F1ZXVlID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDsKKyAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTsKKyAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlOworICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSBzaXplQWxnb3JpdGhtOworICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7CisgIGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtID0gd3JpdGVBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtID0gY2xvc2VBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gYWJvcnRBbGdvcml0aG07CisgIHZhciBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpOworICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7CisgIHZhciBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7CisgIHZhciBzdGFydFByb21pc2UgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KTsKKyAgdXBvblByb21pc2Uoc3RhcnRQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTsKKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgfSwgZnVuY3Rpb24gKHIpIHsKKyAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlOworICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIHIpOworICB9KTsKKyB9CisgZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHN0cmVhbSwgdW5kZXJseWluZ1NpbmssIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHsKKyAgdmFyIGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTsKKyAgZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKSB7CisgICByZXR1cm4gSW52b2tlT3JOb29wKHVuZGVybHlpbmdTaW5rLCAnc3RhcnQnLCBbY29udHJvbGxlcl0pOworICB9CisgIHZhciB3cml0ZUFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTaW5rLCAnd3JpdGUnLCAxLCBbY29udHJvbGxlcl0pOworICB2YXIgY2xvc2VBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nU2luaywgJ2Nsb3NlJywgMCwgW10pOworICB2YXIgYWJvcnRBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nU2luaywgJ2Fib3J0JywgMSwgW10pOworICBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikgeworICBjb250cm9sbGVyLl93cml0ZUFsZ29yaXRobSA9IHVuZGVmaW5lZDsKKyAgY29udHJvbGxlci5fY2xvc2VBbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7CisgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsICdjbG9zZScsIDApOworICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspIHsKKyAgdHJ5IHsKKyAgIHJldHVybiBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0oY2h1bmspOworICB9IGNhdGNoIChjaHVua1NpemVFKSB7CisgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBjaHVua1NpemVFKTsKKyAgIHJldHVybiAxOworICB9CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7CisgIHJldHVybiBjb250cm9sbGVyLl9zdHJhdGVneUhXTSAtIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplOworIH0KKyBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyV3JpdGUoY29udHJvbGxlciwgY2h1bmssIGNodW5rU2l6ZSkgeworICB2YXIgd3JpdGVSZWNvcmQgPSB7IGNodW5rOiBjaHVuayB9OworICB0cnkgeworICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgd3JpdGVSZWNvcmQsIGNodW5rU2l6ZSk7CisgIH0gY2F0Y2ggKGVucXVldWVFKSB7CisgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBlbnF1ZXVlRSk7CisgICByZXR1cm47CisgIH0KKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTsKKyAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IGZhbHNlICYmIHN0cmVhbS5fc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgIHZhciBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpOworICAgV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpOworICB9CisgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTsKKyAgaWYgKGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPT09IGZhbHNlKSB7CisgICByZXR1cm47CisgIH0KKyAgaWYgKHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkgeworICAgcmV0dXJuOworICB9CisgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7CisgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykgeworICAgV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pOworICAgcmV0dXJuOworICB9CisgIGlmIChjb250cm9sbGVyLl9xdWV1ZS5sZW5ndGggPT09IDApIHsKKyAgIHJldHVybjsKKyAgfQorICB2YXIgd3JpdGVSZWNvcmQgPSBQZWVrUXVldWVWYWx1ZShjb250cm9sbGVyKTsKKyAgaWYgKHdyaXRlUmVjb3JkID09PSAnY2xvc2UnKSB7CisgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc0Nsb3NlKGNvbnRyb2xsZXIpOworICB9IGVsc2UgeworICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZShjb250cm9sbGVyLCB3cml0ZVJlY29yZC5jaHVuayk7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoY29udHJvbGxlciwgZXJyb3IpIHsKKyAgaWYgKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbS5fc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlcnJvcik7CisgIH0KKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NDbG9zZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07CisgIFdyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSk7CisgIERlcXVldWVWYWx1ZShjb250cm9sbGVyKTsKKyAgdmFyIHNpbmtDbG9zZVByb21pc2UgPSBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSgpOworICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpOworICB1cG9uUHJvbWlzZShzaW5rQ2xvc2VQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2Uoc3RyZWFtKTsKKyAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHN0cmVhbSwgcmVhc29uKTsKKyAgfSk7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzV3JpdGUoY29udHJvbGxlciwgY2h1bmspIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTsKKyAgV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pOworICB2YXIgc2lua1dyaXRlUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtKGNodW5rKTsKKyAgdXBvblByb21pc2Uoc2lua1dyaXRlUHJvbWlzZSwgZnVuY3Rpb24gKCkgeworICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlKHN0cmVhbSk7CisgICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICAgRGVxdWV1ZVZhbHVlKGNvbnRyb2xsZXIpOworICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IGZhbHNlICYmIHN0YXRlID09PSAnd3JpdGFibGUnKSB7CisgICAgdmFyIGJhY2twcmVzc3VyZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcik7CisgICAgV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpOworICAgfQorICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpOworICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykgeworICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7CisgICB9CisgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGVXaXRoRXJyb3Ioc3RyZWFtLCByZWFzb24pOworICB9KTsKKyB9CisgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKSB7CisgIHZhciBkZXNpcmVkU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTsKKyAgcmV0dXJuIGRlc2lyZWRTaXplIDw9IDA7CisgfQorIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlcnJvcikgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtOworICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpOworICBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3Jpbmcoc3RyZWFtLCBlcnJvcik7CisgfQorIGZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLiIgKyBuYW1lICsgIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW0iKTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS4iICsgbmFtZSArICIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIpOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbihuYW1lKSB7CisgIHJldHVybiBuZXcgVHlwZUVycm9yKCdDYW5ub3QgJyArIG5hbWUgKyAnIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgd3JpdGVyJyk7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpIHsKKyAgd3JpdGVyLl9jbG9zZWRQcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7CisgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0OworICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncGVuZGluZyc7CisgIH0pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7CisgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpOworICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbik7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQod3JpdGVyKSB7CisgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpOworICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pIHsKKyAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh3cml0ZXIuX2Nsb3NlZFByb21pc2UpOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0KHJlYXNvbik7CisgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9ICdyZWplY3RlZCc7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7CisgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKSB7CisgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7CisgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkOworICB3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9ICdyZXNvbHZlZCc7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcikgeworICB3cml0ZXIuX3JlYWR5UHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7CisgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSByZWplY3Q7CisgIH0pOworICB3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID0gJ3BlbmRpbmcnOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pIHsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbik7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh3cml0ZXIpIHsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbikgeworICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHdyaXRlci5fcmVhZHlQcm9taXNlKTsKKyAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0KHJlYXNvbik7CisgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7CisgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDsKKyAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdyZWplY3RlZCc7CisgfQorIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCh3cml0ZXIpIHsKKyAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIHJlYXNvbikgeworICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpIHsKKyAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpOworICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkOworICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7CisgIHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPSAnZnVsZmlsbGVkJzsKKyB9CisgZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh2YWx1ZSkgeworICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIHRyeSB7CisgICByZXR1cm4gdHlwZW9mIHZhbHVlLmFib3J0ZWQgPT09ICdib29sZWFuJzsKKyAgfSBjYXRjaCAoX2EpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorIH0KKyB2YXIgTmF0aXZlRE9NRXhjZXB0aW9uID0gdHlwZW9mIERPTUV4Y2VwdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBET01FeGNlcHRpb24gOiB1bmRlZmluZWQ7CisgZnVuY3Rpb24gaXNET01FeGNlcHRpb25Db25zdHJ1Y3RvcihjdG9yKSB7CisgIGlmICghKHR5cGVvZiBjdG9yID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBjdG9yID09PSAnb2JqZWN0JykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICB0cnkgeworICAgbmV3IGN0b3IoKTsKKyAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChfYSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgfQorIGZ1bmN0aW9uIGNyZWF0ZURPTUV4Y2VwdGlvblBvbHlmaWxsKCkgeworICB2YXIgY3RvciA9IGZ1bmN0aW9uIERPTUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKSB7CisgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICcnOworICAgdGhpcy5uYW1lID0gbmFtZSB8fCAnRXJyb3InOworICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7CisgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgICB9CisgIH07CisgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3Rvci5wcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIHsKKyAgIHZhbHVlOiBjdG9yLAorICAgd3JpdGFibGU6IHRydWUsCisgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisgIHJldHVybiBjdG9yOworIH0KKyB2YXIgRE9NRXhjZXB0aW9uJDEgPSBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKE5hdGl2ZURPTUV4Y2VwdGlvbikgPyBOYXRpdmVET01FeGNlcHRpb24gOiBjcmVhdGVET01FeGNlcHRpb25Qb2x5ZmlsbCgpOworIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUGlwZVRvKHNvdXJjZSwgZGVzdCwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCkgeworICB2YXIgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzb3VyY2UpOworICB2YXIgd3JpdGVyID0gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihkZXN0KTsKKyAgc291cmNlLl9kaXN0dXJiZWQgPSB0cnVlOworICB2YXIgc2h1dHRpbmdEb3duID0gZmFsc2U7CisgIHZhciBjdXJyZW50V3JpdGUgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgIHJldHVybiBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgIHZhciBhYm9ydEFsZ29yaXRobTsKKyAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkgeworICAgIGFib3J0QWxnb3JpdGhtID0gZnVuY3Rpb24gKCkgeworICAgICB2YXIgZXJyb3IgPSBuZXcgRE9NRXhjZXB0aW9uJDEoJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpOworICAgICB2YXIgYWN0aW9ucyA9IFtdOworICAgICBpZiAocHJldmVudEFib3J0ID09PSBmYWxzZSkgeworICAgICAgYWN0aW9ucy5wdXNoKGZ1bmN0aW9uICgpIHsKKyAgICAgICBpZiAoZGVzdC5fc3RhdGUgPT09ICd3cml0YWJsZScpIHsKKyAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQoZGVzdCwgZXJyb3IpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpOworICAgICAgfSk7CisgICAgIH0KKyAgICAgaWYgKHByZXZlbnRDYW5jZWwgPT09IGZhbHNlKSB7CisgICAgICBhY3Rpb25zLnB1c2goZnVuY3Rpb24gKCkgeworICAgICAgIGlmIChzb3VyY2UuX3N0YXRlID09PSAncmVhZGFibGUnKSB7CisgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIGVycm9yKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTsKKyAgICAgIH0pOworICAgICB9CisgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYWN0aW9ucy5tYXAoZnVuY3Rpb24gKGFjdGlvbikgeworICAgICAgIHJldHVybiBhY3Rpb24oKTsKKyAgICAgIH0pKTsKKyAgICAgfSwgdHJ1ZSwgZXJyb3IpOworICAgIH07CisgICAgaWYgKHNpZ25hbC5hYm9ydGVkID09PSB0cnVlKSB7CisgICAgIGFib3J0QWxnb3JpdGhtKCk7CisgICAgIHJldHVybjsKKyAgICB9CisgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbGdvcml0aG0pOworICAgfQorICAgZnVuY3Rpb24gcGlwZUxvb3AoKSB7CisgICAgcmV0dXJuIG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmVMb29wLCByZWplY3RMb29wKSB7CisgICAgIGZ1bmN0aW9uIG5leHQoZG9uZSkgeworICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICByZXNvbHZlTG9vcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocGlwZVN0ZXAoKSwgbmV4dCwgcmVqZWN0TG9vcCk7CisgICAgICB9CisgICAgIH0KKyAgICAgbmV4dChmYWxzZSk7CisgICAgfSk7CisgICB9CisgICBmdW5jdGlvbiBwaXBlU3RlcCgpIHsKKyAgICBpZiAoc2h1dHRpbmdEb3duID09PSB0cnVlKSB7CisgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHdyaXRlci5fcmVhZHlQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4oUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpLCBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICBpZiAocmVzdWx0LmRvbmUgPT09IHRydWUpIHsKKyAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRXcml0ZSA9IFBlcmZvcm1Qcm9taXNlVGhlbihXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh3cml0ZXIsIHJlc3VsdC52YWx1ZSksIHVuZGVmaW5lZCwgbm9vcCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgIH0pOworICAgIH0pOworICAgfQorICAgaXNPckJlY29tZXNFcnJvcmVkKHNvdXJjZSwgcmVhZGVyLl9jbG9zZWRQcm9taXNlLCBmdW5jdGlvbiAoc3RvcmVkRXJyb3IpIHsKKyAgICBpZiAocHJldmVudEFib3J0ID09PSBmYWxzZSkgeworICAgICBzaHV0ZG93bldpdGhBY3Rpb24oZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQoZGVzdCwgc3RvcmVkRXJyb3IpOworICAgICB9LCB0cnVlLCBzdG9yZWRFcnJvcik7CisgICAgfSBlbHNlIHsKKyAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpOworICAgIH0KKyAgIH0pOworICAgaXNPckJlY29tZXNFcnJvcmVkKGRlc3QsIHdyaXRlci5fY2xvc2VkUHJvbWlzZSwgZnVuY3Rpb24gKHN0b3JlZEVycm9yKSB7CisgICAgaWYgKHByZXZlbnRDYW5jZWwgPT09IGZhbHNlKSB7CisgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBzdG9yZWRFcnJvcik7CisgICAgIH0sIHRydWUsIHN0b3JlZEVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICBzaHV0ZG93bih0cnVlLCBzdG9yZWRFcnJvcik7CisgICAgfQorICAgfSk7CisgICBpc09yQmVjb21lc0Nsb3NlZChzb3VyY2UsIHJlYWRlci5fY2xvc2VkUHJvbWlzZSwgZnVuY3Rpb24gKCkgeworICAgIGlmIChwcmV2ZW50Q2xvc2UgPT09IGZhbHNlKSB7CisgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih3cml0ZXIpOworICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICBzaHV0ZG93bigpOworICAgIH0KKyAgIH0pOworICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSB0cnVlIHx8IGRlc3QuX3N0YXRlID09PSAnY2xvc2VkJykgeworICAgIHZhciBkZXN0Q2xvc2VkXzEgPSBuZXcgVHlwZUVycm9yKCd0aGUgZGVzdGluYXRpb24gd3JpdGFibGUgc3RyZWFtIGNsb3NlZCBiZWZvcmUgYWxsIGRhdGEgY291bGQgYmUgcGlwZWQgdG8gaXQnKTsKKyAgICBpZiAocHJldmVudENhbmNlbCA9PT0gZmFsc2UpIHsKKyAgICAgc2h1dGRvd25XaXRoQWN0aW9uKGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIGRlc3RDbG9zZWRfMSk7CisgICAgIH0sIHRydWUsIGRlc3RDbG9zZWRfMSk7CisgICAgfSBlbHNlIHsKKyAgICAgc2h1dGRvd24odHJ1ZSwgZGVzdENsb3NlZF8xKTsKKyAgICB9CisgICB9CisgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHBpcGVMb29wKCkpOworICAgZnVuY3Rpb24gd2FpdEZvcldyaXRlc1RvRmluaXNoKCkgeworICAgIHZhciBvbGRDdXJyZW50V3JpdGUgPSBjdXJyZW50V3JpdGU7CisgICAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihjdXJyZW50V3JpdGUsIGZ1bmN0aW9uICgpIHsKKyAgICAgcmV0dXJuIG9sZEN1cnJlbnRXcml0ZSAhPT0gY3VycmVudFdyaXRlID8gd2FpdEZvcldyaXRlc1RvRmluaXNoKCkgOiB1bmRlZmluZWQ7CisgICAgfSk7CisgICB9CisgICBmdW5jdGlvbiBpc09yQmVjb21lc0Vycm9yZWQoc3RyZWFtLCBwcm9taXNlLCBhY3Rpb24pIHsKKyAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICAgIGFjdGlvbihzdHJlYW0uX3N0b3JlZEVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICB1cG9uUmVqZWN0aW9uKHByb21pc2UsIGFjdGlvbik7CisgICAgfQorICAgfQorICAgZnVuY3Rpb24gaXNPckJlY29tZXNDbG9zZWQoc3RyZWFtLCBwcm9taXNlLCBhY3Rpb24pIHsKKyAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgICAgYWN0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgdXBvbkZ1bGZpbGxtZW50KHByb21pc2UsIGFjdGlvbik7CisgICAgfQorICAgfQorICAgZnVuY3Rpb24gc2h1dGRvd25XaXRoQWN0aW9uKGFjdGlvbiwgb3JpZ2luYWxJc0Vycm9yLCBvcmlnaW5hbEVycm9yKSB7CisgICAgaWYgKHNodXR0aW5nRG93biA9PT0gdHJ1ZSkgeworICAgICByZXR1cm47CisgICAgfQorICAgIHNodXR0aW5nRG93biA9IHRydWU7CisgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSBmYWxzZSkgeworICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGRvVGhlUmVzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgZG9UaGVSZXN0KCk7CisgICAgfQorICAgIGZ1bmN0aW9uIGRvVGhlUmVzdCgpIHsKKyAgICAgdXBvblByb21pc2UoYWN0aW9uKCksIGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmaW5hbGl6ZShvcmlnaW5hbElzRXJyb3IsIG9yaWdpbmFsRXJyb3IpOworICAgICB9LCBmdW5jdGlvbiAobmV3RXJyb3IpIHsKKyAgICAgIHJldHVybiBmaW5hbGl6ZSh0cnVlLCBuZXdFcnJvcik7CisgICAgIH0pOworICAgIH0KKyAgIH0KKyAgIGZ1bmN0aW9uIHNodXRkb3duKGlzRXJyb3IsIGVycm9yKSB7CisgICAgaWYgKHNodXR0aW5nRG93biA9PT0gdHJ1ZSkgeworICAgICByZXR1cm47CisgICAgfQorICAgIHNodXR0aW5nRG93biA9IHRydWU7CisgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSBmYWxzZSkgeworICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcik7CisgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgIGZpbmFsaXplKGlzRXJyb3IsIGVycm9yKTsKKyAgICB9CisgICB9CisgICBmdW5jdGlvbiBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcikgeworICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2Uod3JpdGVyKTsKKyAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7CisgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7CisgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QWxnb3JpdGhtKTsKKyAgICB9CisgICAgaWYgKGlzRXJyb3IpIHsKKyAgICAgcmVqZWN0KGVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICByZXNvbHZlKHVuZGVmaW5lZCk7CisgICAgfQorICAgfQorICB9KTsKKyB9CisgdmFyIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKSB7CisgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgIH0KKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCAiZGVzaXJlZFNpemUiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7CisgICAgfQorICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyk7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKTsKKyAgIH0KKyAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgY2xvc2UnKTsKKyAgIH0KKyAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0aGlzKTsKKyAgfTsKKyAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChjaHVuaykgeworICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2VucXVldWUnKTsKKyAgIH0KKyAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZScpOworICAgfQorICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTsKKyAgfTsKKyAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeworICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7CisgICB9CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgZSk7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW0NhbmNlbFN0ZXBzXSA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgIFJlc2V0UXVldWUodGhpcyk7CisgICB2YXIgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpOworICAgcmV0dXJuIHJlc3VsdDsKKyAgfTsKKyAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGVbUHVsbFN0ZXBzXSA9IGZ1bmN0aW9uICgpIHsKKyAgIHZhciBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07CisgICBpZiAodGhpcy5fcXVldWUubGVuZ3RoID4gMCkgeworICAgIHZhciBjaHVuayA9IERlcXVldWVWYWx1ZSh0aGlzKTsKKyAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUgJiYgdGhpcy5fcXVldWUubGVuZ3RoID09PSAwKSB7CisgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7CisgICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTsKKyAgICB9IGVsc2UgeworICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KGNodW5rLCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgIH0KKyAgIHZhciBwZW5kaW5nUHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtKTsKKyAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpOworICAgcmV0dXJuIHBlbmRpbmdQcm9taXNlOworICB9OworICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcjsKKyB9KCk7CisgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbScpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpIHsKKyAgdmFyIHNob3VsZFB1bGwgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcik7CisgIGlmIChzaG91bGRQdWxsID09PSBmYWxzZSkgeworICAgcmV0dXJuOworICB9CisgIGlmIChjb250cm9sbGVyLl9wdWxsaW5nID09PSB0cnVlKSB7CisgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSB0cnVlOworICAgcmV0dXJuOworICB9CisgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSB0cnVlOworICB2YXIgcHVsbFByb21pc2UgPSBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtKCk7CisgIHVwb25Qcm9taXNlKHB1bGxQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7CisgICBpZiAoY29udHJvbGxlci5fcHVsbEFnYWluID09PSB0cnVlKSB7CisgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gZmFsc2U7CisgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7CisgICB9CisgIH0sIGZ1bmN0aW9uIChlKSB7CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSk7CisgIH0pOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtOworICBpZiAoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpID09PSBmYWxzZSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjb250cm9sbGVyLl9zdGFydGVkID09PSBmYWxzZSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkgPT09IHRydWUgJiYgUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA+IDApIHsKKyAgIHJldHVybiB0cnVlOworICB9CisgIHZhciBkZXNpcmVkU2l6ZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTsKKyAgaWYgKGRlc2lyZWRTaXplID4gMCkgeworICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHsKKyAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHVuZGVmaW5lZDsKKyAgY29udHJvbGxlci5fY2FuY2VsQWxnb3JpdGhtID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07CisgIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID0gdHJ1ZTsKKyAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlLmxlbmd0aCA9PT0gMCkgeworICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTsKKyAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTsKKyAgfQorIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtOworICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7CisgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGNodW5rLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICB2YXIgY2h1bmtTaXplID0gdm9pZCAwOworICAgdHJ5IHsKKyAgICBjaHVua1NpemUgPSBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0oY2h1bmspOworICAgfSBjYXRjaCAoY2h1bmtTaXplRSkgeworICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBjaHVua1NpemVFKTsKKyAgICB0aHJvdyBjaHVua1NpemVFOworICAgfQorICAgdHJ5IHsKKyAgICBFbnF1ZXVlVmFsdWVXaXRoU2l6ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKTsKKyAgIH0gY2F0Y2ggKGVucXVldWVFKSB7CisgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVucXVldWVFKTsKKyAgICB0aHJvdyBlbnF1ZXVlRTsKKyAgIH0KKyAgfQorICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHsKKyAgIHJldHVybjsKKyAgfQorICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpOworICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpOworICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07CisgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7CisgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7CisgICByZXR1cm4gbnVsbDsKKyAgfQorICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZShjb250cm9sbGVyKSB7CisgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikgPT09IHRydWUpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpIHsKKyAgdmFyIHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTsKKyAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID09PSBmYWxzZSAmJiBzdGF0ZSA9PT0gJ3JlYWRhYmxlJykgeworICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworIH0KKyBmdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7CisgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbSA9IHN0cmVhbTsKKyAgY29udHJvbGxlci5fcXVldWUgPSB1bmRlZmluZWQ7CisgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkOworICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpOworICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7CisgIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID0gZmFsc2U7CisgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlOworICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7CisgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHNpemVBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNID0gaGlnaFdhdGVyTWFyazsKKyAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTsKKyAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICB2YXIgc3RhcnRSZXN1bHQgPSBzdGFydEFsZ29yaXRobSgpOworICB1cG9uUHJvbWlzZShwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KSwgZnVuY3Rpb24gKCkgeworICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgfSwgZnVuY3Rpb24gKHIpIHsKKyAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCByKTsKKyAgfSk7CisgfQorIGZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHN0cmVhbSwgdW5kZXJseWluZ1NvdXJjZSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkgeworICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpOworICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHsKKyAgIHJldHVybiBJbnZva2VPck5vb3AodW5kZXJseWluZ1NvdXJjZSwgJ3N0YXJ0JywgW2NvbnRyb2xsZXJdKTsKKyAgfQorICB2YXIgcHVsbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTb3VyY2UsICdwdWxsJywgMCwgW2NvbnRyb2xsZXJdKTsKKyAgdmFyIGNhbmNlbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTb3VyY2UsICdjYW5jZWwnLCAxLCBbXSk7CisgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pOworIH0KKyBmdW5jdGlvbiBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIik7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtVGVlKHN0cmVhbSwgY2xvbmVGb3JCcmFuY2gyKSB7CisgIHZhciByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7CisgIHZhciByZWFkaW5nID0gZmFsc2U7CisgIHZhciBjYW5jZWxlZDEgPSBmYWxzZTsKKyAgdmFyIGNhbmNlbGVkMiA9IGZhbHNlOworICB2YXIgcmVhc29uMTsKKyAgdmFyIHJlYXNvbjI7CisgIHZhciBicmFuY2gxOworICB2YXIgYnJhbmNoMjsKKyAgdmFyIHJlc29sdmVDYW5jZWxQcm9taXNlOworICB2YXIgY2FuY2VsUHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgIHJlc29sdmVDYW5jZWxQcm9taXNlID0gcmVzb2x2ZTsKKyAgfSk7CisgIGZ1bmN0aW9uIHB1bGxBbGdvcml0aG0oKSB7CisgICBpZiAocmVhZGluZyA9PT0gdHJ1ZSkgeworICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgICB9CisgICByZWFkaW5nID0gdHJ1ZTsKKyAgIHZhciByZWFkUHJvbWlzZSA9IHRyYW5zZm9ybVByb21pc2VXaXRoKFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSwgZnVuY3Rpb24gKHJlc3VsdCkgeworICAgIHJlYWRpbmcgPSBmYWxzZTsKKyAgICB2YXIgZG9uZSA9IHJlc3VsdC5kb25lOworICAgIGlmIChkb25lID09PSB0cnVlKSB7CisgICAgIGlmIChjYW5jZWxlZDEgPT09IGZhbHNlKSB7CisgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTsKKyAgICAgfQorICAgICBpZiAoY2FuY2VsZWQyID09PSBmYWxzZSkgeworICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7CisgICAgIH0KKyAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7CisgICAgdmFyIHZhbHVlMSA9IHZhbHVlOworICAgIHZhciB2YWx1ZTIgPSB2YWx1ZTsKKyAgICBpZiAoY2FuY2VsZWQxID09PSBmYWxzZSkgeworICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShicmFuY2gxLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHZhbHVlMSk7CisgICAgfQorICAgIGlmIChjYW5jZWxlZDIgPT09IGZhbHNlKSB7CisgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmFsdWUyKTsKKyAgICB9CisgICB9KTsKKyAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocmVhZFByb21pc2UpOworICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTsKKyAgfQorICBmdW5jdGlvbiBjYW5jZWwxQWxnb3JpdGhtKHJlYXNvbikgeworICAgY2FuY2VsZWQxID0gdHJ1ZTsKKyAgIHJlYXNvbjEgPSByZWFzb247CisgICBpZiAoY2FuY2VsZWQyID09PSB0cnVlKSB7CisgICAgdmFyIGNvbXBvc2l0ZVJlYXNvbiA9IGNyZWF0ZUFycmF5RnJvbUxpc3QoWworICAgICByZWFzb24xLAorICAgICByZWFzb24yCisgICAgXSk7CisgICAgdmFyIGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTsKKyAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpOworICAgfQorICAgcmV0dXJuIGNhbmNlbFByb21pc2U7CisgIH0KKyAgZnVuY3Rpb24gY2FuY2VsMkFsZ29yaXRobShyZWFzb24pIHsKKyAgIGNhbmNlbGVkMiA9IHRydWU7CisgICByZWFzb24yID0gcmVhc29uOworICAgaWYgKGNhbmNlbGVkMSA9PT0gdHJ1ZSkgeworICAgIHZhciBjb21wb3NpdGVSZWFzb24gPSBjcmVhdGVBcnJheUZyb21MaXN0KFsKKyAgICAgcmVhc29uMSwKKyAgICAgcmVhc29uMgorICAgIF0pOworICAgIHZhciBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7CisgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoY2FuY2VsUmVzdWx0KTsKKyAgIH0KKyAgIHJldHVybiBjYW5jZWxQcm9taXNlOworICB9CisgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkgeworICB9CisgIGJyYW5jaDEgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMUFsZ29yaXRobSk7CisgIGJyYW5jaDIgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7CisgIHVwb25SZWplY3Rpb24ocmVhZGVyLl9jbG9zZWRQcm9taXNlLCBmdW5jdGlvbiAocikgeworICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgcik7CisgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTsKKyAgfSk7CisgIHJldHVybiBbCisgICBicmFuY2gxLAorICAgYnJhbmNoMgorICBdOworIH0KKyB2YXIgTnVtYmVySXNJbnRlZ2VyID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiAodmFsdWUpIHsKKyAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZTsKKyB9OworIHZhciBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0ID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KCkgeworICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseScpOworICB9CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSwgInZpZXciLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpID09PSBmYWxzZSkgeworICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3ZpZXcnKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuX3ZpZXc7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUucmVzcG9uZCA9IGZ1bmN0aW9uIChieXRlc1dyaXR0ZW4pIHsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKCdyZXNwb25kJyk7CisgICB9CisgICBpZiAodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgQllPQiByZXF1ZXN0IGhhcyBiZWVuIGludmFsaWRhdGVkJyk7CisgICB9CisgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih0aGlzLl92aWV3LmJ1ZmZlcikgPT09IHRydWUpOworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbik7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLnJlc3BvbmRXaXRoTmV3VmlldyA9IGZ1bmN0aW9uICh2aWV3KSB7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpID09PSBmYWxzZSkgeworICAgIHRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigncmVzcG9uZCcpOworICAgfQorICAgaWYgKHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID09PSB1bmRlZmluZWQpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIEJZT0IgcmVxdWVzdCBoYXMgYmVlbiBpbnZhbGlkYXRlZCcpOworICAgfQorICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgY2FuIG9ubHkgcmVzcG9uZCB3aXRoIGFycmF5IGJ1ZmZlciB2aWV3cycpOworICAgfQorICAgaWYgKElzRGV0YWNoZWRCdWZmZXIodmlldy5idWZmZXIpID09PSB0cnVlKTsKKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIHZpZXcpOworICB9OworICByZXR1cm4gUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdDsKKyB9KCk7CisgdmFyIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoKSB7CisgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5Jyk7CisgIH0KKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCAiYnlvYlJlcXVlc3QiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2J5b2JSZXF1ZXN0Jyk7CisgICAgfQorICAgIGlmICh0aGlzLl9ieW9iUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkgeworICAgICB2YXIgZmlyc3REZXNjcmlwdG9yID0gdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7CisgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciwgZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQsIGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTsKKyAgICAgdmFyIGJ5b2JSZXF1ZXN0ID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSk7CisgICAgIFNldFVwUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdChieW9iUmVxdWVzdCwgdGhpcywgdmlldyk7CisgICAgIHRoaXMuX2J5b2JSZXF1ZXN0ID0gYnlvYlJlcXVlc3Q7CisgICAgfQorICAgIHJldHVybiB0aGlzLl9ieW9iUmVxdWVzdDsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUsICJkZXNpcmVkU2l6ZSIsIHsKKyAgIGdldDogZnVuY3Rpb24gKCkgeworICAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTsKKyAgICB9CisgICAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0aGlzKTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHsKKyAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpOworICAgfQorICAgaWYgKHRoaXMuX2Nsb3NlUmVxdWVzdGVkID09PSB0cnVlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZDsgZG8gbm90IGNsb3NlIGl0IGFnYWluIScpOworICAgfQorICAgdmFyIHN0YXRlID0gdGhpcy5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7CisgICBpZiAoc3RhdGUgIT09ICdyZWFkYWJsZScpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgc3RyZWFtIChpbiAiICsgc3RhdGUgKyAiIHN0YXRlKSBpcyBub3QgaW4gdGhlIHJlYWRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkIik7CisgICB9CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UodGhpcyk7CisgIH07CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdlbnF1ZXVlJyk7CisgICB9CisgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nJyk7CisgICB9CisgICB2YXIgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTsKKyAgIGlmIChzdGF0ZSAhPT0gJ3JlYWRhYmxlJykgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBzdHJlYW0gKGluICIgKyBzdGF0ZSArICIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBlbnF1ZXVlZCB0byIpOworICAgfQorICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IGNhbiBvbmx5IGVucXVldWUgYXJyYXkgYnVmZmVyIHZpZXdzIHdoZW4gdXNpbmcgYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyJyk7CisgICB9CisgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcihjaHVuay5idWZmZXIpID09PSB0cnVlKTsKKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTsKKyAgfTsKKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkgeworICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7CisgICB9CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IodGhpcywgZSk7CisgIH07CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlW0NhbmNlbFN0ZXBzXSA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgIGlmICh0aGlzLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHsKKyAgICB2YXIgZmlyc3REZXNjcmlwdG9yID0gdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7CisgICAgZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkID0gMDsKKyAgIH0KKyAgIFJlc2V0UXVldWUodGhpcyk7CisgICB2YXIgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpOworICAgcmV0dXJuIHJlc3VsdDsKKyAgfTsKKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGVbUHVsbFN0ZXBzXSA9IGZ1bmN0aW9uICgpIHsKKyAgIHZhciBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICAgaWYgKHRoaXMuX3F1ZXVlVG90YWxTaXplID4gMCkgeworICAgIHZhciBlbnRyeSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7CisgICAgdGhpcy5fcXVldWVUb3RhbFNpemUgLT0gZW50cnkuYnl0ZUxlbmd0aDsKKyAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbih0aGlzKTsKKyAgICB2YXIgdmlldyA9IHZvaWQgMDsKKyAgICB0cnkgeworICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW50cnkuYnVmZmVyLCBlbnRyeS5ieXRlT2Zmc2V0LCBlbnRyeS5ieXRlTGVuZ3RoKTsKKyAgICB9IGNhdGNoICh2aWV3RSkgeworICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2aWV3RSk7CisgICAgfQorICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh2aWV3LCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgIH0KKyAgIHZhciBhdXRvQWxsb2NhdGVDaHVua1NpemUgPSB0aGlzLl9hdXRvQWxsb2NhdGVDaHVua1NpemU7CisgICBpZiAoYXV0b0FsbG9jYXRlQ2h1bmtTaXplICE9PSB1bmRlZmluZWQpIHsKKyAgICB2YXIgYnVmZmVyID0gdm9pZCAwOworICAgIHRyeSB7CisgICAgIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihhdXRvQWxsb2NhdGVDaHVua1NpemUpOworICAgIH0gY2F0Y2ggKGJ1ZmZlckUpIHsKKyAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnVmZmVyRSk7CisgICAgfQorICAgIHZhciBwdWxsSW50b0Rlc2NyaXB0b3IgPSB7CisgICAgIGJ1ZmZlcjogYnVmZmVyLAorICAgICBieXRlT2Zmc2V0OiAwLAorICAgICBieXRlTGVuZ3RoOiBhdXRvQWxsb2NhdGVDaHVua1NpemUsCisgICAgIGJ5dGVzRmlsbGVkOiAwLAorICAgICBlbGVtZW50U2l6ZTogMSwKKyAgICAgY3RvcjogVWludDhBcnJheSwKKyAgICAgcmVhZGVyVHlwZTogJ2RlZmF1bHQnCisgICAgfTsKKyAgICB0aGlzLl9wZW5kaW5nUHVsbEludG9zLnB1c2gocHVsbEludG9EZXNjcmlwdG9yKTsKKyAgIH0KKyAgIHZhciBwcm9taXNlID0gUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0pOworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodGhpcyk7CisgICByZXR1cm4gcHJvbWlzZTsKKyAgfTsKKyAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXI7CisgfSgpOworIGZ1bmN0aW9uIElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih4KSB7CisgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHgpIHsKKyAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcikgeworICB2YXIgc2hvdWxkUHVsbCA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKTsKKyAgaWYgKHNob3VsZFB1bGwgPT09IGZhbHNlKSB7CisgICByZXR1cm47CisgIH0KKyAgaWYgKGNvbnRyb2xsZXIuX3B1bGxpbmcgPT09IHRydWUpIHsKKyAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IHRydWU7CisgICByZXR1cm47CisgIH0KKyAgY29udHJvbGxlci5fcHVsbGluZyA9IHRydWU7CisgIHZhciBwdWxsUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0oKTsKKyAgdXBvblByb21pc2UocHVsbFByb21pc2UsIGZ1bmN0aW9uICgpIHsKKyAgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSBmYWxzZTsKKyAgIGlmIChjb250cm9sbGVyLl9wdWxsQWdhaW4gPT09IHRydWUpIHsKKyAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTsKKyAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgIH0KKyAgfSwgZnVuY3Rpb24gKGUpIHsKKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTsKKyAgfSk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcikgeworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpOworICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHsKKyAgdmFyIGRvbmUgPSBmYWxzZTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7CisgICBkb25lID0gdHJ1ZTsKKyAgfQorICB2YXIgZmlsbGVkVmlldyA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yKHB1bGxJbnRvRGVzY3JpcHRvcik7CisgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IucmVhZGVyVHlwZSA9PT0gJ2RlZmF1bHQnKSB7CisgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGZpbGxlZFZpZXcsIGRvbmUpOworICB9IGVsc2UgeworICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgZmlsbGVkVmlldywgZG9uZSk7CisgIH0KKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKSB7CisgIHZhciBieXRlc0ZpbGxlZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDsKKyAgdmFyIGVsZW1lbnRTaXplID0gcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplOworICByZXR1cm4gbmV3IHB1bGxJbnRvRGVzY3JpcHRvci5jdG9yKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0LCBieXRlc0ZpbGxlZCAvIGVsZW1lbnRTaXplKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7CisgIGNvbnRyb2xsZXIuX3F1ZXVlLnB1c2goeworICAgYnVmZmVyOiBidWZmZXIsCisgICBieXRlT2Zmc2V0OiBieXRlT2Zmc2V0LAorICAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aAorICB9KTsKKyAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgKz0gYnl0ZUxlbmd0aDsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSB7CisgIHZhciBlbGVtZW50U2l6ZSA9IHB1bGxJbnRvRGVzY3JpcHRvci5lbGVtZW50U2l6ZTsKKyAgdmFyIGN1cnJlbnRBbGlnbmVkQnl0ZXMgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBlbGVtZW50U2l6ZTsKKyAgdmFyIG1heEJ5dGVzVG9Db3B5ID0gTWF0aC5taW4oY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTsKKyAgdmFyIG1heEJ5dGVzRmlsbGVkID0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgbWF4Qnl0ZXNUb0NvcHk7CisgIHZhciBtYXhBbGlnbmVkQnl0ZXMgPSBtYXhCeXRlc0ZpbGxlZCAtIG1heEJ5dGVzRmlsbGVkICUgZWxlbWVudFNpemU7CisgIHZhciB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nID0gbWF4Qnl0ZXNUb0NvcHk7CisgIHZhciByZWFkeSA9IGZhbHNlOworICBpZiAobWF4QWxpZ25lZEJ5dGVzID4gY3VycmVudEFsaWduZWRCeXRlcykgeworICAgdG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyA9IG1heEFsaWduZWRCeXRlcyAtIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDsKKyAgIHJlYWR5ID0gdHJ1ZTsKKyAgfQorICB2YXIgcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZTsKKyAgd2hpbGUgKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPiAwKSB7CisgICB2YXIgaGVhZE9mUXVldWUgPSBxdWV1ZS5wZWVrKCk7CisgICB2YXIgYnl0ZXNUb0NvcHkgPSBNYXRoLm1pbih0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nLCBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoKTsKKyAgIHZhciBkZXN0U3RhcnQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCArIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDsKKyAgIEFycmF5QnVmZmVyQ29weShwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBkZXN0U3RhcnQsIGhlYWRPZlF1ZXVlLmJ1ZmZlciwgaGVhZE9mUXVldWUuYnl0ZU9mZnNldCwgYnl0ZXNUb0NvcHkpOworICAgaWYgKGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGggPT09IGJ5dGVzVG9Db3B5KSB7CisgICAgcXVldWUuc2hpZnQoKTsKKyAgIH0gZWxzZSB7CisgICAgaGVhZE9mUXVldWUuYnl0ZU9mZnNldCArPSBieXRlc1RvQ29weTsKKyAgICBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoIC09IGJ5dGVzVG9Db3B5OworICAgfQorICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgLT0gYnl0ZXNUb0NvcHk7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNUb0NvcHksIHB1bGxJbnRvRGVzY3JpcHRvcik7CisgICB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nIC09IGJ5dGVzVG9Db3B5OworICB9CisgIHJldHVybiByZWFkeTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIsIHNpemUsIHB1bGxJbnRvRGVzY3JpcHRvcikgeworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpOworICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKz0gc2l6ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4oY29udHJvbGxlcikgeworICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDAgJiYgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHsKKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7CisgICBSZWFkYWJsZVN0cmVhbUNsb3NlKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0pOworICB9IGVsc2UgeworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7CisgIH0KKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKSB7CisgIGlmIChjb250cm9sbGVyLl9ieW9iUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm47CisgIH0KKyAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9ieW9iUmVxdWVzdC5fdmlldyA9IHVuZGVmaW5lZDsKKyAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcikgeworICB3aGlsZSAoY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7CisgICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDApIHsKKyAgICByZXR1cm47CisgICB9CisgICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7CisgICBpZiAoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSA9PT0gdHJ1ZSkgeworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTsKKyAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcik7CisgICB9CisgIH0KKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclB1bGxJbnRvKGNvbnRyb2xsZXIsIHZpZXcpIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07CisgIHZhciBlbGVtZW50U2l6ZSA9IDE7CisgIGlmICh2aWV3LmNvbnN0cnVjdG9yICE9PSBEYXRhVmlldykgeworICAgZWxlbWVudFNpemUgPSB2aWV3LmNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UOworICB9CisgIHZhciBjdG9yID0gdmlldy5jb25zdHJ1Y3RvcjsKKyAgdmFyIGJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIodmlldy5idWZmZXIpOworICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0geworICAgYnVmZmVyOiBidWZmZXIsCisgICBieXRlT2Zmc2V0OiB2aWV3LmJ5dGVPZmZzZXQsCisgICBieXRlTGVuZ3RoOiB2aWV3LmJ5dGVMZW5ndGgsCisgICBieXRlc0ZpbGxlZDogMCwKKyAgIGVsZW1lbnRTaXplOiBlbGVtZW50U2l6ZSwKKyAgIGN0b3I6IGN0b3IsCisgICByZWFkZXJUeXBlOiAnYnlvYicKKyAgfTsKKyAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkgeworICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7CisgICByZXR1cm4gUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtKTsKKyAgfQorICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgIHZhciBlbXB0eVZpZXcgPSBuZXcgY3RvcihwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCwgMCk7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoZW1wdHlWaWV3LCB0cnVlLCBzdHJlYW0uX3JlYWRlci5fZm9yQXV0aG9yQ29kZSkpOworICB9CisgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHsKKyAgIGlmIChSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZShjb250cm9sbGVyLCBwdWxsSW50b0Rlc2NyaXB0b3IpID09PSB0cnVlKSB7CisgICAgdmFyIGZpbGxlZFZpZXcgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpOworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpOworICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChmaWxsZWRWaWV3LCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgIH0KKyAgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9PT0gdHJ1ZSkgeworICAgIHZhciBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpOworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChlKTsKKyAgIH0KKyAgfQorICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnB1c2gocHVsbEludG9EZXNjcmlwdG9yKTsKKyAgdmFyIHByb21pc2UgPSBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChzdHJlYW0pOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpIHsKKyAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlcik7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkgPT09IHRydWUpIHsKKyAgIHdoaWxlIChSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSA+IDApIHsKKyAgICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpOworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpOworICAgfQorICB9CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKSB7CisgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKyBieXRlc1dyaXR0ZW4gPiBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZUxlbmd0aCkgeworICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2J5dGVzV3JpdHRlbiBvdXQgb2YgcmFuZ2UnKTsKKyAgfQorICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBwdWxsSW50b0Rlc2NyaXB0b3IpOworICBpZiAocHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkIDwgcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplKSB7CisgICByZXR1cm47CisgIH0KKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpOworICB2YXIgcmVtYWluZGVyU2l6ZSA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAlIHB1bGxJbnRvRGVzY3JpcHRvci5lbGVtZW50U2l6ZTsKKyAgaWYgKHJlbWFpbmRlclNpemUgPiAwKSB7CisgICB2YXIgZW5kID0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQ7CisgICB2YXIgcmVtYWluZGVyID0gcHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlci5zbGljZShlbmQgLSByZW1haW5kZXJTaXplLCBlbmQpOworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgcmVtYWluZGVyLCAwLCByZW1haW5kZXIuYnl0ZUxlbmd0aCk7CisgIH0KKyAgcHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIocHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlcik7CisgIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAtPSByZW1haW5kZXJTaXplOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcik7CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcik7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKSB7CisgIHZhciBmaXJzdERlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07CisgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykgeworICAgaWYgKGJ5dGVzV3JpdHRlbiAhPT0gMCkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J5dGVzV3JpdHRlbiBtdXN0IGJlIDAgd2hlbiBjYWxsaW5nIHJlc3BvbmQoKSBvbiBhIGNsb3NlZCBzdHJlYW0nKTsKKyAgIH0KKyAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpOworICB9IGVsc2UgeworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBmaXJzdERlc2NyaXB0b3IpOworICB9CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcikgeworICB2YXIgZGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3Muc2hpZnQoKTsKKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTsKKyAgcmV0dXJuIGRlc2NyaXB0b3I7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9PT0gdHJ1ZSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjb250cm9sbGVyLl9zdGFydGVkID09PSBmYWxzZSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSA9PT0gdHJ1ZSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkgeworICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pID09PSB0cnVlICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyhzdHJlYW0pID4gMCkgeworICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdmFyIGRlc2lyZWRTaXplID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpOworICBpZiAoZGVzaXJlZFNpemUgPiAwKSB7CisgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikgeworICBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtID0gdW5kZWZpbmVkOworICBjb250cm9sbGVyLl9jYW5jZWxBbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPiAwKSB7CisgICBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9IHRydWU7CisgICByZXR1cm47CisgIH0KKyAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkgeworICAgdmFyIGZpcnN0UGVuZGluZ1B1bGxJbnRvID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7CisgICBpZiAoZmlyc3RQZW5kaW5nUHVsbEludG8uYnl0ZXNGaWxsZWQgPiAwKSB7CisgICAgdmFyIGUgPSBuZXcgVHlwZUVycm9yKCdJbnN1ZmZpY2llbnQgYnl0ZXMgdG8gZmlsbCBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gYnVmZmVyJyk7CisgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpOworICAgIHRocm93IGU7CisgICB9CisgIH0KKyAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTsKKyAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTsKKyAgdmFyIGJ1ZmZlciA9IGNodW5rLmJ1ZmZlcjsKKyAgdmFyIGJ5dGVPZmZzZXQgPSBjaHVuay5ieXRlT2Zmc2V0OworICB2YXIgYnl0ZUxlbmd0aCA9IGNodW5rLmJ5dGVMZW5ndGg7CisgIHZhciB0cmFuc2ZlcnJlZEJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoYnVmZmVyKTsKKyAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihzdHJlYW0pID09PSB0cnVlKSB7CisgICBpZiAoUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA9PT0gMCkgeworICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTsKKyAgIH0gZWxzZSB7CisgICAgdmFyIHRyYW5zZmVycmVkVmlldyA9IG5ldyBVaW50OEFycmF5KHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTsKKyAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIHRyYW5zZmVycmVkVmlldywgZmFsc2UpOworICAgfQorICB9IGVsc2UgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pID09PSB0cnVlKSB7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpOworICB9IGVsc2UgeworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgdHJhbnNmZXJyZWRCdWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpOworICB9CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSkgeworICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHsKKyAgIHJldHVybjsKKyAgfQorICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJQZW5kaW5nUHVsbEludG9zKGNvbnRyb2xsZXIpOworICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpOworICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtOworICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlOworICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIG51bGw7CisgIH0KKyAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykgeworICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbikgeworICBieXRlc1dyaXR0ZW4gPSBOdW1iZXIoYnl0ZXNXcml0dGVuKTsKKyAgaWYgKElzRmluaXRlTm9uTmVnYXRpdmVOdW1iZXIoYnl0ZXNXcml0dGVuKSA9PT0gZmFsc2UpIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdieXRlc1dyaXR0ZW4gbXVzdCBiZSBhIGZpbml0ZScpOworICB9CisgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3Vmlldyhjb250cm9sbGVyLCB2aWV3KSB7CisgIHZhciBmaXJzdERlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTsKKyAgaWYgKGZpcnN0RGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICE9PSB2aWV3LmJ5dGVPZmZzZXQpIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgcmVnaW9uIHNwZWNpZmllZCBieSB2aWV3IGRvZXMgbm90IG1hdGNoIGJ5b2JSZXF1ZXN0Jyk7CisgIH0KKyAgaWYgKGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoICE9PSB2aWV3LmJ5dGVMZW5ndGgpIHsKKyAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgYnVmZmVyIG9mIHZpZXcgaGFzIGRpZmZlcmVudCBjYXBhY2l0eSB0aGFuIGJ5b2JSZXF1ZXN0Jyk7CisgIH0KKyAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IHZpZXcuYnVmZmVyOworICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEludGVybmFsKGNvbnRyb2xsZXIsIHZpZXcuYnl0ZUxlbmd0aCk7CisgfQorIGZ1bmN0aW9uIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSkgeworICBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtID0gc3RyZWFtOworICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTsKKyAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlOworICBjb250cm9sbGVyLl9ieW9iUmVxdWVzdCA9IHVuZGVmaW5lZDsKKyAgY29udHJvbGxlci5fcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDsKKyAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTsKKyAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlOworICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTsKKyAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07CisgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTsKKyAgY29udHJvbGxlci5fYXV0b0FsbG9jYXRlQ2h1bmtTaXplID0gYXV0b0FsbG9jYXRlQ2h1bmtTaXplOworICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgdmFyIHN0YXJ0UmVzdWx0ID0gc3RhcnRBbGdvcml0aG0oKTsKKyAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksIGZ1bmN0aW9uICgpIHsKKyAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlOworICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7CisgIH0sIGZ1bmN0aW9uIChyKSB7CisgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7CisgIH0pOworIH0KKyBmdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdCeXRlU291cmNlLCBoaWdoV2F0ZXJNYXJrKSB7CisgIHZhciBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSk7CisgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkgeworICAgcmV0dXJuIEludm9rZU9yTm9vcCh1bmRlcmx5aW5nQnl0ZVNvdXJjZSwgJ3N0YXJ0JywgW2NvbnRyb2xsZXJdKTsKKyAgfQorICB2YXIgcHVsbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdCeXRlU291cmNlLCAncHVsbCcsIDAsIFtjb250cm9sbGVyXSk7CisgIHZhciBjYW5jZWxBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nQnl0ZVNvdXJjZSwgJ2NhbmNlbCcsIDEsIFtdKTsKKyAgdmFyIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHVuZGVybHlpbmdCeXRlU291cmNlLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTsKKyAgaWYgKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSAhPT0gdW5kZWZpbmVkKSB7CisgICBhdXRvQWxsb2NhdGVDaHVua1NpemUgPSBOdW1iZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTsKKyAgIGlmIChOdW1iZXJJc0ludGVnZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKSA9PT0gZmFsc2UgfHwgYXV0b0FsbG9jYXRlQ2h1bmtTaXplIDw9IDApIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXV0b0FsbG9jYXRlQ2h1bmtTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7CisgICB9CisgIH0KKyAgU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTsKKyB9CisgZnVuY3Rpb24gU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHJlcXVlc3QsIGNvbnRyb2xsZXIsIHZpZXcpIHsKKyAgcmVxdWVzdC5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICByZXF1ZXN0Ll92aWV3ID0gdmlldzsKKyB9CisgZnVuY3Rpb24gYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHsKKyAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLiIgKyBuYW1lICsgIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCIpOworIH0KKyBmdW5jdGlvbiBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIik7CisgfQorIGZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtLCBmb3JBdXRob3JDb2RlKSB7CisgIGlmIChmb3JBdXRob3JDb2RlID09PSB2b2lkIDApIHsKKyAgIGZvckF1dGhvckNvZGUgPSBmYWxzZTsKKyAgfQorICB2YXIgcmVhZGVyID0gbmV3IFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0pOworICByZWFkZXIuX2ZvckF1dGhvckNvZGUgPSBmb3JBdXRob3JDb2RlOworICByZXR1cm4gcmVhZGVyOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChzdHJlYW0pIHsKKyAgdmFyIHByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgIHZhciByZWFkSW50b1JlcXVlc3QgPSB7CisgICAgX3Jlc29sdmU6IHJlc29sdmUsCisgICAgX3JlamVjdDogcmVqZWN0CisgICB9OworICAgc3RyZWFtLl9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMucHVzaChyZWFkSW50b1JlcXVlc3QpOworICB9KTsKKyAgcmV0dXJuIHByb21pc2U7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRJbnRvUmVxdWVzdChzdHJlYW0sIGNodW5rLCBkb25lKSB7CisgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjsKKyAgdmFyIHJlYWRJbnRvUmVxdWVzdCA9IHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5zaGlmdCgpOworICByZWFkSW50b1JlcXVlc3QuX3Jlc29sdmUoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KGNodW5rLCBkb25lLCByZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzKHN0cmVhbSkgeworICByZXR1cm4gc3RyZWFtLl9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoOworIH0KKyBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0JZT0JSZWFkZXIoc3RyZWFtKSB7CisgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjsKKyAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihyZWFkZXIpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIHZhciBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0pIHsKKyAgIGlmICghSXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIGNhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBSZWFkYWJsZVN0cmVhbSBpbnN0YW5jZSBnaXZlbiBhICcgKyAnYnl0ZSBzb3VyY2UnKTsKKyAgIH0KKyAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpID09PSBmYWxzZSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgYSBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgZm9yIGEgc3RyZWFtIG5vdCBjb25zdHJ1Y3RlZCB3aXRoIGEgYnl0ZSAnICsgJ3NvdXJjZScpOworICAgfQorICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgcmVhZGluZyBieSBhbm90aGVyIHJlYWRlcicpOworICAgfQorICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZSh0aGlzLCBzdHJlYW0pOworICAgdGhpcy5fcmVhZEludG9SZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpOworICB9CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLCAiY2xvc2VkIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkgeworICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2FuY2VsJykpOworICAgfQorICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTsKKyAgIH0KKyAgIHJldHVybiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwodGhpcywgcmVhc29uKTsKKyAgfTsKKyAgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVhZCcpKTsKKyAgIH0KKyAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdyZWFkIGZyb20nKSk7CisgICB9CisgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyh2aWV3KSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ3ZpZXcgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldycpKTsKKyAgIH0KKyAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHZpZXcuYnVmZmVyKSA9PT0gdHJ1ZSk7CisgICBpZiAodmlldy5ieXRlTGVuZ3RoID09PSAwKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigndmlldyBtdXN0IGhhdmUgbm9uLXplcm8gYnl0ZUxlbmd0aCcpKTsKKyAgIH0KKyAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXJSZWFkKHRoaXMsIHZpZXcpOworICB9OworICBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLnJlbGVhc2VMb2NrID0gZnVuY3Rpb24gKCkgeworICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkgeworICAgIHRocm93IGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWxlYXNlTG9jaycpOworICAgfQorICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybjsKKyAgIH0KKyAgIGlmICh0aGlzLl9yZWFkSW50b1JlcXVlc3RzLmxlbmd0aCA+IDApIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCcpOworICAgfQorICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSh0aGlzKTsKKyAgfTsKKyAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcjsKKyB9KCk7CisgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoeCkgeworICBpZiAoIXR5cGVJc09iamVjdCh4KSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZEludG9SZXF1ZXN0cycpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQocmVhZGVyLCB2aWV3KSB7CisgIHZhciBzdHJlYW0gPSByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW07CisgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTsKKyAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgIH0KKyAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmlldyk7CisgfQorIGZ1bmN0aW9uIGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHsKKyAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIiKTsKKyB9CisgdmFyIFJlYWRhYmxlU3RyZWFtID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbSh1bmRlcmx5aW5nU291cmNlLCBzdHJhdGVneSkgeworICAgaWYgKHVuZGVybHlpbmdTb3VyY2UgPT09IHZvaWQgMCkgeworICAgIHVuZGVybHlpbmdTb3VyY2UgPSB7fTsKKyAgIH0KKyAgIGlmIChzdHJhdGVneSA9PT0gdm9pZCAwKSB7CisgICAgc3RyYXRlZ3kgPSB7fTsKKyAgIH0KKyAgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbSh0aGlzKTsKKyAgIHZhciBzaXplID0gc3RyYXRlZ3kuc2l6ZTsKKyAgIHZhciBoaWdoV2F0ZXJNYXJrID0gc3RyYXRlZ3kuaGlnaFdhdGVyTWFyazsKKyAgIHZhciB0eXBlID0gdW5kZXJseWluZ1NvdXJjZS50eXBlOworICAgdmFyIHR5cGVTdHJpbmcgPSBTdHJpbmcodHlwZSk7CisgICBpZiAodHlwZVN0cmluZyA9PT0gJ2J5dGVzJykgeworICAgIGlmIChzaXplICE9PSB1bmRlZmluZWQpIHsKKyAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBzdHJhdGVneSBmb3IgYSBieXRlIHN0cmVhbSBjYW5ub3QgaGF2ZSBhIHNpemUgZnVuY3Rpb24nKTsKKyAgICB9CisgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkgeworICAgICBoaWdoV2F0ZXJNYXJrID0gMDsKKyAgICB9CisgICAgaGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTsKKyAgICBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrKTsKKyAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgdmFyIHNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oc2l6ZSk7CisgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkgeworICAgICBoaWdoV2F0ZXJNYXJrID0gMTsKKyAgICB9CisgICAgaGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTsKKyAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTsKKyAgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQnKTsKKyAgIH0KKyAgfQorICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCAibG9ja2VkIiwgeworICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKElzUmVhZGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7CisgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnbG9ja2VkJyk7CisgICAgfQorICAgIHJldHVybiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpOworICAgfSwKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2NhbmNlbCcpKTsKKyAgIH0KKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbmNlbCBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgcmVhZGVyJykpOworICAgfQorICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHRoaXMsIHJlYXNvbik7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5nZXRSZWFkZXIgPSBmdW5jdGlvbiAoX2EpIHsKKyAgIHZhciBtb2RlID0gKF9hID09PSB2b2lkIDAgPyB7fSA6IF9hKS5tb2RlOworICAgaWYgKElzUmVhZGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdnZXRSZWFkZXInKTsKKyAgIH0KKyAgIGlmIChtb2RlID09PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzLCB0cnVlKTsKKyAgIH0KKyAgIG1vZGUgPSBTdHJpbmcobW9kZSk7CisgICBpZiAobW9kZSA9PT0gJ2J5b2InKSB7CisgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcywgdHJ1ZSk7CisgICB9CisgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBtb2RlIGlzIHNwZWNpZmllZCcpOworICB9OworICBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggPSBmdW5jdGlvbiAoX2EsIF9iKSB7CisgICB2YXIgd3JpdGFibGUgPSBfYS53cml0YWJsZSwgcmVhZGFibGUgPSBfYS5yZWFkYWJsZTsKKyAgIHZhciBfYyA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iLCBwcmV2ZW50Q2xvc2UgPSBfYy5wcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCA9IF9jLnByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCA9IF9jLnByZXZlbnRDYW5jZWwsIHNpZ25hbCA9IF9jLnNpZ25hbDsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHRoaXMpID09PSBmYWxzZSkgeworICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRocm91Z2gnKTsKKyAgIH0KKyAgIGlmIChJc1dyaXRhYmxlU3RyZWFtKHdyaXRhYmxlKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd3cml0YWJsZSBhcmd1bWVudCB0byBwaXBlVGhyb3VnaCBtdXN0IGJlIGEgV3JpdGFibGVTdHJlYW0nKTsKKyAgIH0KKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHJlYWRhYmxlKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWFkYWJsZSBhcmd1bWVudCB0byBwaXBlVGhyb3VnaCBtdXN0IGJlIGEgUmVhZGFibGVTdHJlYW0nKTsKKyAgIH0KKyAgIHByZXZlbnRDbG9zZSA9IEJvb2xlYW4ocHJldmVudENsb3NlKTsKKyAgIHByZXZlbnRBYm9ydCA9IEJvb2xlYW4ocHJldmVudEFib3J0KTsKKyAgIHByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpOworICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2hcJ3Mgc2lnbmFsIG9wdGlvbiBtdXN0IGJlIGFuIEFib3J0U2lnbmFsJyk7CisgICB9CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSA9PT0gdHJ1ZSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVGhyb3VnaCBjYW5ub3QgYmUgdXNlZCBvbiBhIGxvY2tlZCBSZWFkYWJsZVN0cmVhbScpOworICAgfQorICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQod3JpdGFibGUpID09PSB0cnVlKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUaHJvdWdoIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFdyaXRhYmxlU3RyZWFtJyk7CisgICB9CisgICB2YXIgcHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtUGlwZVRvKHRoaXMsIHdyaXRhYmxlLCBwcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCwgc2lnbmFsKTsKKyAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocHJvbWlzZSk7CisgICByZXR1cm4gcmVhZGFibGU7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gPSBmdW5jdGlvbiAoZGVzdCwgX2EpIHsKKyAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCBwcmV2ZW50Q2xvc2UgPSBfYi5wcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCA9IF9iLnByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCA9IF9iLnByZXZlbnRDYW5jZWwsIHNpZ25hbCA9IF9iLnNpZ25hbDsKKyAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHRoaXMpID09PSBmYWxzZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRvJykpOworICAgfQorICAgaWYgKElzV3JpdGFibGVTdHJlYW0oZGVzdCkgPT09IGZhbHNlKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUb1wncyBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgV3JpdGFibGVTdHJlYW0nKSk7CisgICB9CisgICBwcmV2ZW50Q2xvc2UgPSBCb29sZWFuKHByZXZlbnRDbG9zZSk7CisgICBwcmV2ZW50QWJvcnQgPSBCb29sZWFuKHByZXZlbnRBYm9ydCk7CisgICBwcmV2ZW50Q2FuY2VsID0gQm9vbGVhbihwcmV2ZW50Q2FuY2VsKTsKKyAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCAmJiAhaXNBYm9ydFNpZ25hbChzaWduYWwpKSB7CisgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUb1wncyBzaWduYWwgb3B0aW9uIG11c3QgYmUgYW4gQWJvcnRTaWduYWwnKSk7CisgICB9CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSA9PT0gdHJ1ZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKSk7CisgICB9CisgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChkZXN0KSA9PT0gdHJ1ZSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0nKSk7CisgICB9CisgICByZXR1cm4gUmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcywgZGVzdCwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCk7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS50ZWUgPSBmdW5jdGlvbiAoKSB7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3RlZScpOworICAgfQorICAgdmFyIGJyYW5jaGVzID0gUmVhZGFibGVTdHJlYW1UZWUodGhpcyk7CisgICByZXR1cm4gY3JlYXRlQXJyYXlGcm9tTGlzdChicmFuY2hlcyk7CisgIH07CisgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChfYSkgeworICAgdmFyIF9iID0gKF9hID09PSB2b2lkIDAgPyB7fSA6IF9hKS5wcmV2ZW50Q2FuY2VsLCBwcmV2ZW50Q2FuY2VsID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7CisgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2dldEl0ZXJhdG9yJyk7CisgICB9CisgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzLCBwcmV2ZW50Q2FuY2VsKTsKKyAgfTsKKyAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtOworIH0oKTsKKyBpZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLmFzeW5jSXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLmFzeW5jSXRlcmF0b3IsIHsKKyAgIHZhbHVlOiBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuZ2V0SXRlcmF0b3IsCisgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAgIHdyaXRhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworIH0KKyBmdW5jdGlvbiBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7CisgIGlmIChoaWdoV2F0ZXJNYXJrID09PSB2b2lkIDApIHsKKyAgIGhpZ2hXYXRlck1hcmsgPSAxOworICB9CisgIGlmIChzaXplQWxnb3JpdGhtID09PSB2b2lkIDApIHsKKyAgIHNpemVBbGdvcml0aG0gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIDE7CisgICB9OworICB9CisgIHZhciBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSk7CisgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbShzdHJlYW0pOworICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpOworICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTsKKyAgcmV0dXJuIHN0cmVhbTsKKyB9CisgZnVuY3Rpb24gSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHN0cmVhbSkgeworICBzdHJlYW0uX3N0YXRlID0gJ3JlYWRhYmxlJzsKKyAgc3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7CisgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7CisgIHN0cmVhbS5fZGlzdHVyYmVkID0gZmFsc2U7CisgfQorIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW0oeCkgeworICBpZiAoIXR5cGVJc09iamVjdCh4KSkgeworICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pIHsKKyAgaWYgKHN0cmVhbS5fcmVhZGVyID09PSB1bmRlZmluZWQpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pIHsKKyAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlOworICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHsKKyAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgIH0KKyAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7CisgIH0KKyAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pOworICB2YXIgc291cmNlQ2FuY2VsUHJvbWlzZSA9IHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyW0NhbmNlbFN0ZXBzXShyZWFzb24pOworICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoc291cmNlQ2FuY2VsUHJvbWlzZSwgbm9vcCk7CisgfQorIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKSB7CisgIHN0cmVhbS5fc3RhdGUgPSAnY2xvc2VkJzsKKyAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyOworICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHsKKyAgIHJldHVybjsKKyAgfQorICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKSkgeworICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVhZFJlcXVlc3QpIHsKKyAgICByZWFkUmVxdWVzdC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodW5kZWZpbmVkLCB0cnVlLCByZWFkZXIuX2ZvckF1dGhvckNvZGUpKTsKKyAgIH0pOworICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTsKKyAgfQorICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUocmVhZGVyKTsKKyB9CisgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpIHsKKyAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmVkJzsKKyAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IGU7CisgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjsKKyAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7CisgICByZXR1cm47CisgIH0KKyAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHsKKyAgIHJlYWRlci5fcmVhZFJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRSZXF1ZXN0KSB7CisgICAgcmVhZFJlcXVlc3QuX3JlamVjdChlKTsKKyAgIH0pOworICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTsKKyAgfSBlbHNlIHsKKyAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWFkSW50b1JlcXVlc3QpIHsKKyAgICByZWFkSW50b1JlcXVlc3QuX3JlamVjdChlKTsKKyAgIH0pOworICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7CisgIH0KKyAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCBlKTsKKyB9CisgZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKG5hbWUpIHsKKyAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS4iICsgbmFtZSArICIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtIik7CisgfQorIHZhciBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5ID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5KF9hKSB7CisgICB2YXIgaGlnaFdhdGVyTWFyayA9IF9hLmhpZ2hXYXRlck1hcms7CisgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrOworICB9CisgIEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIHJldHVybiBjaHVuay5ieXRlTGVuZ3RoOworICB9OworICByZXR1cm4gQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneTsKKyB9KCk7CisgdmFyIENvdW50UXVldWluZ1N0cmF0ZWd5ID0gZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDb3VudFF1ZXVpbmdTdHJhdGVneShfYSkgeworICAgdmFyIGhpZ2hXYXRlck1hcmsgPSBfYS5oaWdoV2F0ZXJNYXJrOworICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyazsKKyAgfQorICBDb3VudFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiAxOworICB9OworICByZXR1cm4gQ291bnRRdWV1aW5nU3RyYXRlZ3k7CisgfSgpOworIHZhciBUcmFuc2Zvcm1TdHJlYW0gPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbSh0cmFuc2Zvcm1lciwgd3JpdGFibGVTdHJhdGVneSwgcmVhZGFibGVTdHJhdGVneSkgeworICAgaWYgKHRyYW5zZm9ybWVyID09PSB2b2lkIDApIHsKKyAgICB0cmFuc2Zvcm1lciA9IHt9OworICAgfQorICAgaWYgKHdyaXRhYmxlU3RyYXRlZ3kgPT09IHZvaWQgMCkgeworICAgIHdyaXRhYmxlU3RyYXRlZ3kgPSB7fTsKKyAgIH0KKyAgIGlmIChyZWFkYWJsZVN0cmF0ZWd5ID09PSB2b2lkIDApIHsKKyAgICByZWFkYWJsZVN0cmF0ZWd5ID0ge307CisgICB9CisgICB2YXIgd3JpdGFibGVTaXplRnVuY3Rpb24gPSB3cml0YWJsZVN0cmF0ZWd5LnNpemU7CisgICB2YXIgd3JpdGFibGVIaWdoV2F0ZXJNYXJrID0gd3JpdGFibGVTdHJhdGVneS5oaWdoV2F0ZXJNYXJrOworICAgdmFyIHJlYWRhYmxlU2l6ZUZ1bmN0aW9uID0gcmVhZGFibGVTdHJhdGVneS5zaXplOworICAgdmFyIHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IHJlYWRhYmxlU3RyYXRlZ3kuaGlnaFdhdGVyTWFyazsKKyAgIHZhciB3cml0YWJsZVR5cGUgPSB0cmFuc2Zvcm1lci53cml0YWJsZVR5cGU7CisgICBpZiAod3JpdGFibGVUeXBlICE9PSB1bmRlZmluZWQpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB3cml0YWJsZSB0eXBlIHNwZWNpZmllZCcpOworICAgfQorICAgdmFyIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSA9IE1ha2VTaXplQWxnb3JpdGhtRnJvbVNpemVGdW5jdGlvbih3cml0YWJsZVNpemVGdW5jdGlvbik7CisgICBpZiAod3JpdGFibGVIaWdoV2F0ZXJNYXJrID09PSB1bmRlZmluZWQpIHsKKyAgICB3cml0YWJsZUhpZ2hXYXRlck1hcmsgPSAxOworICAgfQorICAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrID0gVmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKHdyaXRhYmxlSGlnaFdhdGVyTWFyayk7CisgICB2YXIgcmVhZGFibGVUeXBlID0gdHJhbnNmb3JtZXIucmVhZGFibGVUeXBlOworICAgaWYgKHJlYWRhYmxlVHlwZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgcmVhZGFibGUgdHlwZSBzcGVjaWZpZWQnKTsKKyAgIH0KKyAgIHZhciByZWFkYWJsZVNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24ocmVhZGFibGVTaXplRnVuY3Rpb24pOworICAgaWYgKHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmVhZGFibGVIaWdoV2F0ZXJNYXJrID0gMDsKKyAgIH0KKyAgIHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhyZWFkYWJsZUhpZ2hXYXRlck1hcmspOworICAgdmFyIHN0YXJ0UHJvbWlzZV9yZXNvbHZlOworICAgdmFyIHN0YXJ0UHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICBzdGFydFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7CisgICB9KTsKKyAgIEluaXRpYWxpemVUcmFuc2Zvcm1TdHJlYW0odGhpcywgc3RhcnRQcm9taXNlLCB3cml0YWJsZUhpZ2hXYXRlck1hcmssIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSwgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLCByZWFkYWJsZVNpemVBbGdvcml0aG0pOworICAgU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21UcmFuc2Zvcm1lcih0aGlzLCB0cmFuc2Zvcm1lcik7CisgICB2YXIgc3RhcnRSZXN1bHQgPSBJbnZva2VPck5vb3AodHJhbnNmb3JtZXIsICdzdGFydCcsIFt0aGlzLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyXSk7CisgICBzdGFydFByb21pc2VfcmVzb2x2ZShzdGFydFJlc3VsdCk7CisgIH0KKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUsICJyZWFkYWJsZSIsIHsKKyAgIGdldDogZnVuY3Rpb24gKCkgeworICAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdyZWFkYWJsZScpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fcmVhZGFibGU7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUsICJ3cml0YWJsZSIsIHsKKyAgIGdldDogZnVuY3Rpb24gKCkgeworICAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCd3cml0YWJsZScpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fd3JpdGFibGU7CisgICB9LAorICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKyAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbTsKKyB9KCk7CisgZnVuY3Rpb24gSW5pdGlhbGl6ZVRyYW5zZm9ybVN0cmVhbShzdHJlYW0sIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKSB7CisgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkgeworICAgcmV0dXJuIHN0YXJ0UHJvbWlzZTsKKyAgfQorICBmdW5jdGlvbiB3cml0ZUFsZ29yaXRobShjaHVuaykgeworICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuayk7CisgIH0KKyAgZnVuY3Rpb24gYWJvcnRBbGdvcml0aG0ocmVhc29uKSB7CisgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobShzdHJlYW0sIHJlYXNvbik7CisgIH0KKyAgZnVuY3Rpb24gY2xvc2VBbGdvcml0aG0oKSB7CisgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobShzdHJlYW0pOworICB9CisgIHN0cmVhbS5fd3JpdGFibGUgPSBDcmVhdGVXcml0YWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0pOworICBmdW5jdGlvbiBwdWxsQWxnb3JpdGhtKCkgeworICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtKHN0cmVhbSk7CisgIH0KKyAgZnVuY3Rpb24gY2FuY2VsQWxnb3JpdGhtKHJlYXNvbikgeworICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIHJlYXNvbik7CisgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpOworICB9CisgIHN0cmVhbS5fcmVhZGFibGUgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCByZWFkYWJsZUhpZ2hXYXRlck1hcmssIHJlYWRhYmxlU2l6ZUFsZ29yaXRobSk7CisgIHN0cmVhbS5fYmFja3ByZXNzdXJlID0gdW5kZWZpbmVkOworICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSB1bmRlZmluZWQ7CisgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkOworICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTsKKyAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkOworIH0KKyBmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbSh4KSB7CisgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ190cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKSB7CisgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihzdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGUpOworICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSk7CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKSB7CisgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcik7CisgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKHN0cmVhbS5fd3JpdGFibGUuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciwgZSk7CisgIGlmIChzdHJlYW0uX2JhY2twcmVzc3VyZSA9PT0gdHJ1ZSkgeworICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgZmFsc2UpOworICB9CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSkgeworICBpZiAoc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHsKKyAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlKCk7CisgIH0KKyAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlOworICB9KTsKKyAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSBiYWNrcHJlc3N1cmU7CisgfQorIHZhciBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciA9IGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKSB7CisgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciBpbnN0YW5jZXMgY2Fubm90IGJlIGNyZWF0ZWQgZGlyZWN0bHknKTsKKyAgfQorICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCAiZGVzaXJlZFNpemUiLCB7CisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHsKKyAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Rlc2lyZWRTaXplJyk7CisgICAgfQorICAgIHZhciByZWFkYWJsZUNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyOworICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUocmVhZGFibGVDb250cm9sbGVyKTsKKyAgIH0sCisgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChjaHVuaykgeworICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2VucXVldWUnKTsKKyAgIH0KKyAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLCBjaHVuayk7CisgIH07CisgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkgeworICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdlcnJvcicpOworICAgfQorICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCByZWFzb24pOworICB9OworICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUudGVybWluYXRlID0gZnVuY3Rpb24gKCkgeworICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7CisgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3Rlcm1pbmF0ZScpOworICAgfQorICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUodGhpcyk7CisgIH07CisgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcjsKKyB9KCk7CisgZnVuY3Rpb24gSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7CisgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7CisgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtJykpIHsKKyAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyB9CisgZnVuY3Rpb24gU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHRyYW5zZm9ybUFsZ29yaXRobSwgZmx1c2hBbGdvcml0aG0pIHsKKyAgY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSA9IHN0cmVhbTsKKyAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgY29udHJvbGxlci5fdHJhbnNmb3JtQWxnb3JpdGhtID0gdHJhbnNmb3JtQWxnb3JpdGhtOworICBjb250cm9sbGVyLl9mbHVzaEFsZ29yaXRobSA9IGZsdXNoQWxnb3JpdGhtOworIH0KKyBmdW5jdGlvbiBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVRyYW5zZm9ybWVyKHN0cmVhbSwgdHJhbnNmb3JtZXIpIHsKKyAgdmFyIGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7CisgIHZhciB0cmFuc2Zvcm1BbGdvcml0aG0gPSBmdW5jdGlvbiAoY2h1bmspIHsKKyAgIHRyeSB7CisgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGNvbnRyb2xsZXIsIGNodW5rKTsKKyAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpOworICAgfSBjYXRjaCAodHJhbnNmb3JtUmVzdWx0RSkgeworICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHRyYW5zZm9ybVJlc3VsdEUpOworICAgfQorICB9OworICB2YXIgdHJhbnNmb3JtTWV0aG9kID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtOworICBpZiAodHJhbnNmb3JtTWV0aG9kICE9PSB1bmRlZmluZWQpIHsKKyAgIGlmICh0eXBlb2YgdHJhbnNmb3JtTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJhbnNmb3JtIGlzIG5vdCBhIG1ldGhvZCcpOworICAgfQorICAgdHJhbnNmb3JtQWxnb3JpdGhtID0gZnVuY3Rpb24gKGNodW5rKSB7CisgICAgcmV0dXJuIFByb21pc2VDYWxsKHRyYW5zZm9ybU1ldGhvZCwgdHJhbnNmb3JtZXIsIFsKKyAgICAgY2h1bmssCisgICAgIGNvbnRyb2xsZXIKKyAgICBdKTsKKyAgIH07CisgIH0KKyAgdmFyIGZsdXNoQWxnb3JpdGhtID0gQ3JlYXRlQWxnb3JpdGhtRnJvbVVuZGVybHlpbmdNZXRob2QodHJhbnNmb3JtZXIsICdmbHVzaCcsIDAsIFtjb250cm9sbGVyXSk7CisgIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCB0cmFuc2Zvcm1BbGdvcml0aG0sIGZsdXNoQWxnb3JpdGhtKTsKKyB9CisgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikgeworICBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0gPSB1bmRlZmluZWQ7CisgIGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtID0gdW5kZWZpbmVkOworIH0KKyBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspIHsKKyAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW07CisgIHZhciByZWFkYWJsZUNvbnRyb2xsZXIgPSBzdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7CisgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUocmVhZGFibGVDb250cm9sbGVyKSA9PT0gZmFsc2UpIHsKKyAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlIHNpZGUgaXMgbm90IGluIGEgc3RhdGUgdGhhdCBwZXJtaXRzIGVucXVldWUnKTsKKyAgfQorICB0cnkgeworICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUocmVhZGFibGVDb250cm9sbGVyLCBjaHVuayk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKTsKKyAgIHRocm93IHN0cmVhbS5fcmVhZGFibGUuX3N0b3JlZEVycm9yOworICB9CisgIHZhciBiYWNrcHJlc3N1cmUgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVySGFzQmFja3ByZXNzdXJlKHJlYWRhYmxlQ29udHJvbGxlcik7CisgIGlmIChiYWNrcHJlc3N1cmUgIT09IHN0cmVhbS5fYmFja3ByZXNzdXJlKSB7CisgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTsKKyAgfQorIH0KKyBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHsKKyAgVHJhbnNmb3JtU3RyZWFtRXJyb3IoY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSwgZSk7CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuaykgeworICB2YXIgdHJhbnNmb3JtUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3RyYW5zZm9ybUFsZ29yaXRobShjaHVuayk7CisgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aCh0cmFuc2Zvcm1Qcm9taXNlLCB1bmRlZmluZWQsIGZ1bmN0aW9uIChyKSB7CisgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLCByKTsKKyAgIHRocm93IHI7CisgIH0pOworIH0KKyBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclRlcm1pbmF0ZShjb250cm9sbGVyKSB7CisgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtOworICB2YXIgcmVhZGFibGVDb250cm9sbGVyID0gc3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyOworICBpZiAoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlcikgPT09IHRydWUpIHsKKyAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShyZWFkYWJsZUNvbnRyb2xsZXIpOworICB9CisgIHZhciBlcnJvciA9IG5ldyBUeXBlRXJyb3IoJ1RyYW5zZm9ybVN0cmVhbSB0ZXJtaW5hdGVkJyk7CisgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlcnJvcik7CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuaykgeworICB2YXIgY29udHJvbGxlciA9IHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcjsKKyAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlID09PSB0cnVlKSB7CisgICB2YXIgYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSA9IHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZTsKKyAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChiYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHdyaXRhYmxlID0gc3RyZWFtLl93cml0YWJsZTsKKyAgICB2YXIgc3RhdGUgPSB3cml0YWJsZS5fc3RhdGU7CisgICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7CisgICAgIHRocm93IHdyaXRhYmxlLl9zdG9yZWRFcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuayk7CisgICB9KTsKKyAgfQorICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGNvbnRyb2xsZXIsIGNodW5rKTsKKyB9CisgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobShzdHJlYW0sIHJlYXNvbikgeworICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIHJlYXNvbik7CisgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7CisgfQorIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQ2xvc2VBbGdvcml0aG0oc3RyZWFtKSB7CisgIHZhciByZWFkYWJsZSA9IHN0cmVhbS5fcmVhZGFibGU7CisgIHZhciBjb250cm9sbGVyID0gc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyOworICB2YXIgZmx1c2hQcm9taXNlID0gY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0oKTsKKyAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7CisgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChmbHVzaFByb21pc2UsIGZ1bmN0aW9uICgpIHsKKyAgIGlmIChyZWFkYWJsZS5fc3RhdGUgPT09ICdlcnJvcmVkJykgeworICAgIHRocm93IHJlYWRhYmxlLl9zdG9yZWRFcnJvcjsKKyAgIH0KKyAgIHZhciByZWFkYWJsZUNvbnRyb2xsZXIgPSByZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyOworICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShyZWFkYWJsZUNvbnRyb2xsZXIpID09PSB0cnVlKSB7CisgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHJlYWRhYmxlQ29udHJvbGxlcik7CisgICB9CisgIH0sIGZ1bmN0aW9uIChyKSB7CisgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIHIpOworICAgdGhyb3cgcmVhZGFibGUuX3N0b3JlZEVycm9yOworICB9KTsKKyB9CisgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNvdXJjZVB1bGxBbGdvcml0aG0oc3RyZWFtKSB7CisgIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIGZhbHNlKTsKKyAgcmV0dXJuIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZTsKKyB9CisgZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEobmFtZSkgeworICByZXR1cm4gbmV3IFR5cGVFcnJvcigiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLiIgKyBuYW1lICsgIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiKTsKKyB9CisgZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKG5hbWUpIHsKKyAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIlRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUuIiArIG5hbWUgKyAiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW0iKTsKKyB9CisgZXhwb3J0cy5CeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5ID0gQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneTsKKyBleHBvcnRzLkNvdW50UXVldWluZ1N0cmF0ZWd5ID0gQ291bnRRdWV1aW5nU3RyYXRlZ3k7CisgZXhwb3J0cy5SZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlU3RyZWFtOworIGV4cG9ydHMuVHJhbnNmb3JtU3RyZWFtID0gVHJhbnNmb3JtU3RyZWFtOworIGV4cG9ydHMuV3JpdGFibGVTdHJlYW0gPSBXcml0YWJsZVN0cmVhbTsKKyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOworfSkpOworCisvKioqLyB9KSwKKy8qIDE0NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDE0Nyk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDExOCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDc3KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTIwKTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguTWFwOworCisvKioqLyB9KSwKKy8qIDE0NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBjb2xsZWN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDgpOwordmFyIGNvbGxlY3Rpb25TdHJvbmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1Mik7Cittb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7CisgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsKKyAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7CisgfTsKK30sIGNvbGxlY3Rpb25TdHJvbmcpOworCisvKioqLyB9KSwKKy8qIDE0OCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgaXNGb3JjZWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUyKTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSk7Cit2YXIgaXRlcmF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA0KTsKK3ZhciBhbkluc3RhbmNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjYpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk3KTsKK3ZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd19wZGZqc19yZXF1aXJlX18oODUpOwordmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTEpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7CisgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xOworIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xOworIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7CisgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdOworIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7CisgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7CisgdmFyIGV4cG9ydGVkID0ge307CisgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHsKKyAgdmFyIG5hdGl2ZU1ldGhvZCA9IE5hdGl2ZVByb3RvdHlwZVtLRVldOworICByZWRlZmluZShOYXRpdmVQcm90b3R5cGUsIEtFWSwgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7CisgICBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSk7CisgICByZXR1cm4gdGhpczsKKyAgfSA6IEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChrZXkpIHsKKyAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTsKKyAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gdW5kZWZpbmVkIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7CisgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7CisgIH0gOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkgeworICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpOworICAgcmV0dXJuIHRoaXM7CisgIH0pOworIH07CisgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHR5cGVvZiBOYXRpdmVDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeworICAgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTsKKyAgfSkpKSkgeworICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTsKKyAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7CisgfSBlbHNlIGlmIChpc0ZvcmNlZChDT05TVFJVQ1RPUl9OQU1FLCB0cnVlKSkgeworICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTsKKyAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTsKKyAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeworICAgaW5zdGFuY2UuaGFzKDEpOworICB9KTsKKyAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7CisgICBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOworICB9KTsKKyAgdmFyIEJVR0dZX1pFUk8gPSAhSVNfV0VBSyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7CisgICB2YXIgJGluc3RhbmNlID0gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7CisgICB2YXIgaW5kZXggPSA1OworICAgd2hpbGUgKGluZGV4LS0pCisgICAgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpOworICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTsKKyAgfSk7CisgIGlmICghQUNDRVBUX0lURVJBQkxFUykgeworICAgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uIChkdW1teSwgaXRlcmFibGUpIHsKKyAgICBhbkluc3RhbmNlKGR1bW15LCBDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7CisgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlQ29uc3RydWN0b3IoKSwgZHVtbXksIENvbnN0cnVjdG9yKTsKKyAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKQorICAgICBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKKyAgICByZXR1cm4gdGhhdDsKKyAgIH0pOworICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlOworICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7CisgIH0KKyAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHsKKyAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7CisgICBmaXhNZXRob2QoJ2hhcycpOworICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7CisgIH0KKyAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpCisgICBmaXhNZXRob2QoQURERVIpOworICBpZiAoSVNfV0VBSyAmJiBOYXRpdmVQcm90b3R5cGUuY2xlYXIpCisgICBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyOworIH0KKyBleHBvcnRlZFtDT05TVFJVQ1RPUl9OQU1FXSA9IENvbnN0cnVjdG9yOworICQoeworICBnbG9iYWw6IHRydWUsCisgIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IKKyB9LCBleHBvcnRlZCk7Cisgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOworIGlmICghSVNfV0VBSykKKyAgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTsKKyByZXR1cm4gQ29uc3RydWN0b3I7Cit9OworCisvKioqLyB9KSwKKy8qIDE0OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KS5mOwordmFyIHVpZCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzgpOwordmFyIEZSRUVaSU5HID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTApOwordmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7Cit2YXIgaWQgPSAwOwordmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkgeworIHJldHVybiB0cnVlOworfTsKK3ZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkgeworIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeworICB2YWx1ZTogeworICAgb2JqZWN0SUQ6ICdPJyArICsraWQsCisgICB3ZWFrRGF0YToge30KKyAgfQorIH0pOworfTsKK3ZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHsKKyBpZiAoIWlzT2JqZWN0KGl0KSkKKyAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDsKKyBpZiAoIWhhcyhpdCwgTUVUQURBVEEpKSB7CisgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkKKyAgIHJldHVybiAnRic7CisgIGlmICghY3JlYXRlKQorICAgcmV0dXJuICdFJzsKKyAgc2V0TWV0YWRhdGEoaXQpOworIH0KKyByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEOworfTsKK3ZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7CisgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkgeworICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpCisgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFjcmVhdGUpCisgICByZXR1cm4gZmFsc2U7CisgIHNldE1ldGFkYXRhKGl0KTsKKyB9CisgcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTsKK307Cit2YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAoRlJFRVpJTkcgJiYgbWV0YS5SRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEFEQVRBKSkKKyAgc2V0TWV0YWRhdGEoaXQpOworIHJldHVybiBpdDsKK307Cit2YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0geworIFJFUVVJUkVEOiBmYWxzZSwKKyBmYXN0S2V5OiBmYXN0S2V5LAorIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSwKKyBvbkZyZWV6ZTogb25GcmVlemUKK307CitoaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7CisKKy8qKiovIH0pLAorLyogMTUwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOworbW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeworIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpOworfSk7CisKKy8qKiovIH0pLAorLyogMTUxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIHNldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHsKKyB2YXIgTmV3VGFyZ2V0LCBOZXdUYXJnZXRQcm90b3R5cGU7CisgaWYgKHNldFByb3RvdHlwZU9mICYmIHR5cGVvZiAoTmV3VGFyZ2V0ID0gZHVtbXkuY29uc3RydWN0b3IpID09ICdmdW5jdGlvbicgJiYgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmIGlzT2JqZWN0KE5ld1RhcmdldFByb3RvdHlwZSA9IE5ld1RhcmdldC5wcm90b3R5cGUpICYmIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGUpCisgIHNldFByb3RvdHlwZU9mKCR0aGlzLCBOZXdUYXJnZXRQcm90b3R5cGUpOworIHJldHVybiAkdGhpczsKK307CisKKy8qKiovIH0pLAorLyogMTUyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNykuZjsKK3ZhciBjcmVhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcxKTsKK3ZhciByZWRlZmluZUFsbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI0KTsKK3ZhciBiaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Mik7Cit2YXIgYW5JbnN0YW5jZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI2KTsKK3ZhciBpdGVyYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDQpOwordmFyIGRlZmluZUl0ZXJhdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OSk7Cit2YXIgc2V0U3BlY2llcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI1KTsKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGZhc3RLZXkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSkuZmFzdEtleTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjsKK21vZHVsZS5leHBvcnRzID0geworIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikgeworICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7CisgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpOworICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CisgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSwKKyAgICBpbmRleDogY3JlYXRlKG51bGwpLAorICAgIGZpcnN0OiB1bmRlZmluZWQsCisgICAgbGFzdDogdW5kZWZpbmVkLAorICAgIHNpemU6IDAKKyAgIH0pOworICAgaWYgKCFERVNDUklQVE9SUykKKyAgICB0aGF0LnNpemUgPSAwOworICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkKKyAgICBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKKyAgfSk7CisgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKKyAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTsKKyAgIHZhciBwcmV2aW91cywgaW5kZXg7CisgICBpZiAoZW50cnkpIHsKKyAgICBlbnRyeS52YWx1ZSA9IHZhbHVlOworICAgfSBlbHNlIHsKKyAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7CisgICAgIGluZGV4OiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwKKyAgICAga2V5OiBrZXksCisgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgcHJldmlvdXM6IHByZXZpb3VzID0gc3RhdGUubGFzdCwKKyAgICAgbmV4dDogdW5kZWZpbmVkLAorICAgICByZW1vdmVkOiBmYWxzZQorICAgIH07CisgICAgaWYgKCFzdGF0ZS5maXJzdCkKKyAgICAgc3RhdGUuZmlyc3QgPSBlbnRyeTsKKyAgICBpZiAocHJldmlvdXMpCisgICAgIHByZXZpb3VzLm5leHQgPSBlbnRyeTsKKyAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgIHN0YXRlLnNpemUrKzsKKyAgICBlbHNlCisgICAgIHRoYXQuc2l6ZSsrOworICAgIGlmIChpbmRleCAhPT0gJ0YnKQorICAgICBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTsKKyAgIH0KKyAgIHJldHVybiB0aGF0OworICB9OworICB2YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpOworICAgdmFyIGVudHJ5OworICAgaWYgKGluZGV4ICE9PSAnRicpCisgICAgcmV0dXJuIHN0YXRlLmluZGV4W2luZGV4XTsKKyAgIGZvciAoZW50cnkgPSBzdGF0ZS5maXJzdDsgZW50cnk7IGVudHJ5ID0gZW50cnkubmV4dCkgeworICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KQorICAgICByZXR1cm4gZW50cnk7CisgICB9CisgIH07CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7CisgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7CisgICAgdmFyIHRoYXQgPSB0aGlzOworICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7CisgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDsKKyAgICB2YXIgZW50cnkgPSBzdGF0ZS5maXJzdDsKKyAgICB3aGlsZSAoZW50cnkpIHsKKyAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7CisgICAgIGlmIChlbnRyeS5wcmV2aW91cykKKyAgICAgIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDsKKyAgICAgZGVsZXRlIGRhdGFbZW50cnkuaW5kZXhdOworICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CisgICAgfQorICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDsKKyAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgIHN0YXRlLnNpemUgPSAwOworICAgIGVsc2UKKyAgICAgdGhhdC5zaXplID0gMDsKKyAgIH0sCisgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgeworICAgIHZhciB0aGF0ID0gdGhpczsKKyAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7CisgICAgaWYgKGVudHJ5KSB7CisgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDsKKyAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91czsKKyAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTsKKyAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7CisgICAgIGlmIChwcmV2KQorICAgICAgcHJldi5uZXh0ID0gbmV4dDsKKyAgICAgaWYgKG5leHQpCisgICAgICBuZXh0LnByZXZpb3VzID0gcHJldjsKKyAgICAgaWYgKHN0YXRlLmZpcnN0ID09IGVudHJ5KQorICAgICAgc3RhdGUuZmlyc3QgPSBuZXh0OworICAgICBpZiAoc3RhdGUubGFzdCA9PSBlbnRyeSkKKyAgICAgIHN0YXRlLmxhc3QgPSBwcmV2OworICAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgICBzdGF0ZS5zaXplLS07CisgICAgIGVsc2UKKyAgICAgIHRoYXQuc2l6ZS0tOworICAgIH0KKyAgICByZXR1cm4gISFlbnRyeTsKKyAgIH0sCisgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4pIHsKKyAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOworICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CisgICAgdmFyIGVudHJ5OworICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7CisgICAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7CisgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKQorICAgICAgZW50cnkgPSBlbnRyeS5wcmV2aW91czsKKyAgICB9CisgICB9LAorICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTsKKyAgIH0KKyAgfSk7CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CisgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGlzLCBrZXkpOworICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTsKKyAgIH0sCisgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CisgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7CisgICB9CisgIH0gOiB7CisgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkgeworICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpOworICAgfQorICB9KTsKKyAgaWYgKERFU0NSSVBUT1JTKQorICAgZGVmaW5lUHJvcGVydHkoQy5wcm90b3R5cGUsICdzaXplJywgeworICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplOworICAgIH0KKyAgIH0pOworICByZXR1cm4gQzsKKyB9LAorIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkgeworICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJzsKKyAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKKyAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7CisgIGRlZmluZUl0ZXJhdG9yKEMsIENPTlNUUlVDVE9SX05BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkgeworICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CisgICAgdHlwZTogSVRFUkFUT1JfTkFNRSwKKyAgICB0YXJnZXQ6IGl0ZXJhdGVkLAorICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksCisgICAga2luZDoga2luZCwKKyAgICBsYXN0OiB1bmRlZmluZWQKKyAgIH0pOworICB9LCBmdW5jdGlvbiAoKSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7CisgICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7CisgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0OworICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpCisgICAgZW50cnkgPSBlbnRyeS5wcmV2aW91czsKKyAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7CisgICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkOworICAgIHJldHVybiB7CisgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgIGRvbmU6IHRydWUKKyAgICB9OworICAgfQorICAgaWYgKGtpbmQgPT0gJ2tleXMnKQorICAgIHJldHVybiB7CisgICAgIHZhbHVlOiBlbnRyeS5rZXksCisgICAgIGRvbmU6IGZhbHNlCisgICAgfTsKKyAgIGlmIChraW5kID09ICd2YWx1ZXMnKQorICAgIHJldHVybiB7CisgICAgIHZhbHVlOiBlbnRyeS52YWx1ZSwKKyAgICAgZG9uZTogZmFsc2UKKyAgICB9OworICAgcmV0dXJuIHsKKyAgICB2YWx1ZTogWworICAgICBlbnRyeS5rZXksCisgICAgIGVudHJ5LnZhbHVlCisgICAgXSwKKyAgICBkb25lOiBmYWxzZQorICAgfTsKKyAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpOworICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpOworIH0KK307CisKKy8qKiovIH0pLAorLyogMTUzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTU0KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTE4KTsKK19fd19wZGZqc19yZXF1aXJlX18oNzcpOworX193X3BkZmpzX3JlcXVpcmVfXygxMjApOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5TZXQ7CisKKy8qKiovIH0pLAorLyogMTU0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGNvbGxlY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OCk7Cit2YXIgY29sbGVjdGlvblN0cm9uZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTUyKTsKK21vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignU2V0JywgZnVuY3Rpb24gKGluaXQpIHsKKyByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeworICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsKKyB9OworfSwgY29sbGVjdGlvblN0cm9uZyk7CisKKy8qKiovIH0pLAorLyogMTU1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTE4KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTU2KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTIwKTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguV2Vha01hcDsKKworLyoqKi8gfSksCisvKiAxNTYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgcmVkZWZpbmVBbGwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNCk7Cit2YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK3ZhciBjb2xsZWN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDgpOwordmFyIGNvbGxlY3Rpb25XZWFrID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTcpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgZW5mb3JjZUl0ZXJuYWxTdGF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpLmVuZm9yY2U7Cit2YXIgTkFUSVZFX1dFQUtfTUFQID0gX193X3BkZmpzX3JlcXVpcmVfXygzNCk7Cit2YXIgSVNfSUUxMSA9ICFnbG9iYWwuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gZ2xvYmFsOwordmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7Cit2YXIgSW50ZXJuYWxXZWFrTWFwOwordmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkgeworIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkgeworICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsKKyB9OworfTsKK3ZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignV2Vha01hcCcsIHdyYXBwZXIsIGNvbGxlY3Rpb25XZWFrKTsKK2lmIChOQVRJVkVfV0VBS19NQVAgJiYgSVNfSUUxMSkgeworIEludGVybmFsV2Vha01hcCA9IGNvbGxlY3Rpb25XZWFrLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsICdXZWFrTWFwJywgdHJ1ZSk7CisgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7CisgdmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7CisgdmFyIG5hdGl2ZURlbGV0ZSA9IFdlYWtNYXBQcm90b3R5cGVbJ2RlbGV0ZSddOworIHZhciBuYXRpdmVIYXMgPSBXZWFrTWFwUHJvdG90eXBlLmhhczsKKyB2YXIgbmF0aXZlR2V0ID0gV2Vha01hcFByb3RvdHlwZS5nZXQ7CisgdmFyIG5hdGl2ZVNldCA9IFdlYWtNYXBQcm90b3R5cGUuc2V0OworIHJlZGVmaW5lQWxsKFdlYWtNYXBQcm90b3R5cGUsIHsKKyAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHsKKyAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkgeworICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7CisgICAgaWYgKCFzdGF0ZS5mcm96ZW4pCisgICAgIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTsKKyAgICByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW5bJ2RlbGV0ZSddKGtleSk7CisgICB9CisgICByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KTsKKyAgfSwKKyAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHsKKyAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpOworICAgIGlmICghc3RhdGUuZnJvemVuKQorICAgICBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7CisgICAgcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuLmhhcyhrZXkpOworICAgfQorICAgcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSk7CisgIH0sCisgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkgeworICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CisgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoIXN0YXRlLmZyb3plbikKKyAgICAgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOworICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpID8gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTsKKyAgIH0KKyAgIHJldHVybiBuYXRpdmVHZXQuY2FsbCh0aGlzLCBrZXkpOworICB9LAorICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CisgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHsKKyAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpOworICAgIGlmICghc3RhdGUuZnJvemVuKQorICAgICBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7CisgICAgbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KSA/IG5hdGl2ZVNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpIDogc3RhdGUuZnJvemVuLnNldChrZXksIHZhbHVlKTsKKyAgIH0gZWxzZQorICAgIG5hdGl2ZVNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpOworICAgcmV0dXJuIHRoaXM7CisgIH0KKyB9KTsKK30KKworLyoqKi8gfSksCisvKiAxNTcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgcmVkZWZpbmVBbGwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNCk7Cit2YXIgZ2V0V2Vha0RhdGEgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSkuZ2V0V2Vha0RhdGE7Cit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGFuSW5zdGFuY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNik7Cit2YXIgaXRlcmF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA0KTsKK3ZhciBBcnJheUl0ZXJhdGlvbk1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTU4KTsKK3ZhciAkaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7Cit2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpOwordmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKK3ZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7Cit2YXIgZmluZCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmQ7Cit2YXIgZmluZEluZGV4ID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZEluZGV4OwordmFyIGlkID0gMDsKK3ZhciB1bmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKHN0b3JlKSB7CisgcmV0dXJuIHN0b3JlLmZyb3plbiB8fCAoc3RvcmUuZnJvemVuID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7Cit9OwordmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7CisgdGhpcy5lbnRyaWVzID0gW107Cit9OwordmFyIGZpbmRVbmNhdWdodEZyb3plbiA9IGZ1bmN0aW9uIChzdG9yZSwga2V5KSB7CisgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiBpdFswXSA9PT0ga2V5OworIH0pOworfTsKK1VuY2F1Z2h0RnJvemVuU3RvcmUucHJvdG90eXBlID0geworIGdldDogZnVuY3Rpb24gKGtleSkgeworICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTsKKyAgaWYgKGVudHJ5KQorICAgcmV0dXJuIGVudHJ5WzFdOworIH0sCisgaGFzOiBmdW5jdGlvbiAoa2V5KSB7CisgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpOworIH0sCisgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTsKKyAgaWYgKGVudHJ5KQorICAgZW50cnlbMV0gPSB2YWx1ZTsKKyAgZWxzZQorICAgdGhpcy5lbnRyaWVzLnB1c2goWworICAgIGtleSwKKyAgICB2YWx1ZQorICAgXSk7CisgfSwKKyAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgeworICB2YXIgaW5kZXggPSBmaW5kSW5kZXgodGhpcy5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHsKKyAgIHJldHVybiBpdFswXSA9PT0ga2V5OworICB9KTsKKyAgaWYgKH5pbmRleCkKKyAgIHRoaXMuZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpOworICByZXR1cm4gISF+aW5kZXg7CisgfQorfTsKK21vZHVsZS5leHBvcnRzID0geworIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikgeworICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7CisgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpOworICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CisgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSwKKyAgICBpZDogaWQrKywKKyAgICBmcm96ZW46IHVuZGVmaW5lZAorICAgfSk7CisgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKQorICAgIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB0aGF0LCBJU19NQVApOworICB9KTsKKyAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpOworICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHsKKyAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7CisgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpOworICAgaWYgKGRhdGEgPT09IHRydWUpCisgICAgdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuc2V0KGtleSwgdmFsdWUpOworICAgZWxzZQorICAgIGRhdGFbc3RhdGUuaWRdID0gdmFsdWU7CisgICByZXR1cm4gdGhhdDsKKyAgfTsKKyAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHsKKyAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoIWlzT2JqZWN0KGtleSkpCisgICAgIHJldHVybiBmYWxzZTsKKyAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7CisgICAgaWYgKGRhdGEgPT09IHRydWUpCisgICAgIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKVsnZGVsZXRlJ10oa2V5KTsKKyAgICByZXR1cm4gZGF0YSAmJiAkaGFzKGRhdGEsIHN0YXRlLmlkKSAmJiBkZWxldGUgZGF0YVtzdGF0ZS5pZF07CisgICB9LAorICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoIWlzT2JqZWN0KGtleSkpCisgICAgIHJldHVybiBmYWxzZTsKKyAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7CisgICAgaWYgKGRhdGEgPT09IHRydWUpCisgICAgIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5oYXMoa2V5KTsKKyAgICByZXR1cm4gZGF0YSAmJiAkaGFzKGRhdGEsIHN0YXRlLmlkKTsKKyAgIH0KKyAgfSk7CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CisgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOworICAgIGlmIChpc09iamVjdChrZXkpKSB7CisgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTsKKyAgICAgaWYgKGRhdGEgPT09IHRydWUpCisgICAgICByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuZ2V0KGtleSk7CisgICAgIHJldHVybiBkYXRhID8gZGF0YVtzdGF0ZS5pZF0gOiB1bmRlZmluZWQ7CisgICAgfQorICAgfSwKKyAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpOworICAgfQorICB9IDogeworICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHsKKyAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlLCB0cnVlKTsKKyAgIH0KKyAgfSk7CisgIHJldHVybiBDOworIH0KK307CisKKy8qKiovIH0pLAorLyogMTU4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBiaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Mik7Cit2YXIgSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwordmFyIHRvT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Myk7Cit2YXIgdG9MZW5ndGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ3KTsKK3ZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1OSk7Cit2YXIgcHVzaCA9IFtdLnB1c2g7Cit2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHsKKyB2YXIgSVNfTUFQID0gVFlQRSA9PSAxOworIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7CisgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7CisgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0OworIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2OworIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYOworIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7CisgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpOworICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7CisgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTsKKyAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTsKKyAgdmFyIGluZGV4ID0gMDsKKyAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTsKKyAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7CisgIHZhciB2YWx1ZSwgcmVzdWx0OworICBmb3IgKDsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspCisgICBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikgeworICAgIHZhbHVlID0gc2VsZltpbmRleF07CisgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pOworICAgIGlmIChUWVBFKSB7CisgICAgIGlmIChJU19NQVApCisgICAgICB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OworICAgICBlbHNlIGlmIChyZXN1bHQpCisgICAgICBzd2l0Y2ggKFRZUEUpIHsKKyAgICAgIGNhc2UgMzoKKyAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgNToKKyAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICBjYXNlIDY6CisgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgY2FzZSAyOgorICAgICAgIHB1c2guY2FsbCh0YXJnZXQsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgZWxzZSBpZiAoSVNfRVZFUlkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgfQorICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogdGFyZ2V0OworIH07Cit9OworbW9kdWxlLmV4cG9ydHMgPSB7CisgZm9yRWFjaDogY3JlYXRlTWV0aG9kKDApLAorIG1hcDogY3JlYXRlTWV0aG9kKDEpLAorIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLAorIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSwKKyBldmVyeTogY3JlYXRlTWV0aG9kKDQpLAorIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSwKKyBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KQorfTsKKworLyoqKi8gfSksCisvKiAxNTkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgaXNBcnJheSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYwKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK3ZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHsKKyB2YXIgQzsKKyBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkgeworICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjsKKyAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkKKyAgIEMgPSB1bmRlZmluZWQ7CisgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7CisgICBDID0gQ1tTUEVDSUVTXTsKKyAgIGlmIChDID09PSBudWxsKQorICAgIEMgPSB1bmRlZmluZWQ7CisgIH0KKyB9CisgcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTsKK307CisKKy8qKiovIH0pLAorLyogMTYwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cittb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHsKKyByZXR1cm4gY2xhc3NvZihhcmcpID09ICdBcnJheSc7Cit9OworCisvKioqLyB9KSwKKy8qIDE2MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDExOCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE2Mik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEyMCk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLldlYWtTZXQ7CisKKy8qKiovIH0pLAorLyogMTYyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGNvbGxlY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OCk7Cit2YXIgY29sbGVjdGlvbldlYWsgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1Nyk7Citjb2xsZWN0aW9uKCdXZWFrU2V0JywgZnVuY3Rpb24gKGluaXQpIHsKKyByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpIHsKKyAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7CisgfTsKK30sIGNvbGxlY3Rpb25XZWFrKTsKKworLyoqKi8gfSksCisvKiAxNjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxNjQpOwordmFyIGVudHJ5VW5iaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2MSk7Cittb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAnY29kZVBvaW50QXQnKTsKKworLyoqKi8gfSksCisvKiAxNjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGNvZGVBdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzgpLmNvZGVBdDsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUKK30sIHsKKyBjb2RlUG9pbnRBdDogZnVuY3Rpb24gY29kZVBvaW50QXQocG9zKSB7CisgIHJldHVybiBjb2RlQXQodGhpcywgcG9zKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxNjUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxNjYpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5TdHJpbmcuZnJvbUNvZGVQb2ludDsKKworLyoqKi8gfSksCisvKiAxNjYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ5KTsKK3ZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwordmFyIG5hdGl2ZUZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDsKK3ZhciBJTkNPUlJFQ1RfTEVOR1RIID0gISFuYXRpdmVGcm9tQ29kZVBvaW50ICYmIG5hdGl2ZUZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDE7CiskKHsKKyB0YXJnZXQ6ICdTdHJpbmcnLAorIHN0YXQ6IHRydWUsCisgZm9yY2VkOiBJTkNPUlJFQ1RfTEVOR1RICit9LCB7CisgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludCh4KSB7CisgIHZhciBlbGVtZW50cyA9IFtdOworICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKyAgdmFyIGkgPSAwOworICB2YXIgY29kZTsKKyAgd2hpbGUgKGxlbmd0aCA+IGkpIHsKKyAgIGNvZGUgPSArYXJndW1lbnRzW2krK107CisgICBpZiAodG9BYnNvbHV0ZUluZGV4KGNvZGUsIDB4MTBGRkZGKSAhPT0gY29kZSkKKyAgICB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTsKKyAgIGVsZW1lbnRzLnB1c2goY29kZSA8IDB4MTAwMDAgPyBmcm9tQ2hhckNvZGUoY29kZSkgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4RDgwMCwgY29kZSAlIDB4NDAwICsgMHhEQzAwKSk7CisgIH0KKyAgcmV0dXJuIGVsZW1lbnRzLmpvaW4oJycpOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDE2NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDE2OCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDExOCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3MCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3NCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3NSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3Nik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3Nyk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3OCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE3OSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4MCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4MSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4Mik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4Myk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4NCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4NSk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4Nik7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4Nyk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4OCk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDE4OSk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN5bWJvbDsKKworLyoqKi8gfSksCisvKiAxNjggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgaXNBcnJheSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYwKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIHRvT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Myk7Cit2YXIgdG9MZW5ndGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ3KTsKK3ZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oOTMpOwordmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTU5KTsKK3ZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjkpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIFY4X1ZFUlNJT04gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzNSk7Cit2YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEUgPSB3ZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpOwordmFyIE1BWF9TQUZFX0lOVEVHRVIgPSAweDFGRkZGRkZGRkZGRkZGOwordmFyIE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCA9ICdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnOwordmFyIElTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgPSBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CisgdmFyIGFycmF5ID0gW107CisgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7CisgcmV0dXJuIGFycmF5LmNvbmNhdCgpWzBdICE9PSBhcnJheTsKK30pOwordmFyIFNQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ2NvbmNhdCcpOwordmFyIGlzQ29uY2F0U3ByZWFkYWJsZSA9IGZ1bmN0aW9uIChPKSB7CisgaWYgKCFpc09iamVjdChPKSkKKyAgcmV0dXJuIGZhbHNlOworIHZhciBzcHJlYWRhYmxlID0gT1tJU19DT05DQVRfU1BSRUFEQUJMRV07CisgcmV0dXJuIHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/ICEhc3ByZWFkYWJsZSA6IGlzQXJyYXkoTyk7Cit9OwordmFyIEZPUkNFRCA9ICFJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUIHx8ICFTUEVDSUVTX1NVUFBPUlQ7CiskKHsKKyB0YXJnZXQ6ICdBcnJheScsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiBGT1JDRUQKK30sIHsKKyBjb25jYXQ6IGZ1bmN0aW9uIGNvbmNhdChhcmcpIHsKKyAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTsKKyAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7CisgIHZhciBuID0gMDsKKyAgdmFyIGksIGssIGxlbmd0aCwgbGVuLCBFOworICBmb3IgKGkgPSAtMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICBFID0gaSA9PT0gLTEgPyBPIDogYXJndW1lbnRzW2ldOworICAgaWYgKGlzQ29uY2F0U3ByZWFkYWJsZShFKSkgeworICAgIGxlbiA9IHRvTGVuZ3RoKEUubGVuZ3RoKTsKKyAgICBpZiAobiArIGxlbiA+IE1BWF9TQUZFX0lOVEVHRVIpCisgICAgIHRocm93IFR5cGVFcnJvcihNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQpOworICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsrKywgbisrKQorICAgICBpZiAoayBpbiBFKQorICAgICAgY3JlYXRlUHJvcGVydHkoQSwgbiwgRVtrXSk7CisgICB9IGVsc2UgeworICAgIGlmIChuID49IE1BWF9TQUZFX0lOVEVHRVIpCisgICAgIHRocm93IFR5cGVFcnJvcihNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQpOworICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4rKywgRSk7CisgICB9CisgIH0KKyAgQS5sZW5ndGggPSBuOworICByZXR1cm4gQTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxNjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Nyk7Cit2YXIgVjhfVkVSU0lPTiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTM1KTsKK3ZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgeworIHJldHVybiBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CisgIHZhciBhcnJheSA9IFtdOworICB2YXIgY29uc3RydWN0b3IgPSBhcnJheS5jb25zdHJ1Y3RvciA9IHt9OworICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiB7IGZvbzogMSB9OworICB9OworICByZXR1cm4gYXJyYXlbTUVUSE9EX05BTUVdKEJvb2xlYW4pLmZvbyAhPT0gMTsKKyB9KTsKK307CisKKy8qKiovIH0pLAorLyogMTcwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Mik7Cit2YXIgSVNfUFVSRSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzcpOwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTgpOwordmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OSk7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBpc0FycmF5ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjApOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKK3ZhciB0b09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oODMpOwordmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcpOwordmFyIHRvUHJpbWl0aXZlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMSk7Cit2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cit2YXIgbmF0aXZlT2JqZWN0Q3JlYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXyg3MSk7Cit2YXIgb2JqZWN0S2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzMpOwordmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ0KTsKK3ZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3MSk7Cit2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXyg1MSk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7Cit2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KTsKK3ZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTUpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwordmFyIHJlZGVmaW5lID0gX193X3BkZmpzX3JlcXVpcmVfXygyOSk7Cit2YXIgc2hhcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygzNik7Cit2YXIgc2hhcmVkS2V5ID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7Cit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOwordmFyIHVpZCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzgpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOwordmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Mik7Cit2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzMpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7Cit2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpOwordmFyICRmb3JFYWNoID0gX193X3BkZmpzX3JlcXVpcmVfXygxNTgpLmZvckVhY2g7Cit2YXIgSElEREVOID0gc2hhcmVkS2V5KCdoaWRkZW4nKTsKK3ZhciBTWU1CT0wgPSAnU3ltYm9sJzsKK3ZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJzsKK3ZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpOwordmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdFtQUk9UT1RZUEVdOwordmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sOwordmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpOwordmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mOwordmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjsKK3ZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7Cit2YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mOwordmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTsKK3ZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7Cit2YXIgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeScpOwordmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTsKK3ZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwordmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDsKK3ZhciBVU0VfU0VUVEVSID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDsKK3ZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkgeworIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywgeworICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsKKyAgfQorIH0pKS5hICE9IDc7Cit9KSA/IGZ1bmN0aW9uIChPLCBQLCBBdHRyaWJ1dGVzKSB7CisgdmFyIE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCBQKTsKKyBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvcikKKyAgZGVsZXRlIE9iamVjdFByb3RvdHlwZVtQXTsKKyBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTsKKyBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciAmJiBPICE9PSBPYmplY3RQcm90b3R5cGUpIHsKKyAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTsKKyB9Cit9IDogbmF0aXZlRGVmaW5lUHJvcGVydHk7Cit2YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcsIGRlc2NyaXB0aW9uKSB7CisgdmFyIHN5bWJvbCA9IEFsbFN5bWJvbHNbdGFnXSA9IG5hdGl2ZU9iamVjdENyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pOworIHNldEludGVybmFsU3RhdGUoc3ltYm9sLCB7CisgIHR5cGU6IFNZTUJPTCwKKyAgdGFnOiB0YWcsCisgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbgorIH0pOworIGlmICghREVTQ1JJUFRPUlMpCisgIHN5bWJvbC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworIHJldHVybiBzeW1ib2w7Cit9OwordmFyIGlzU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnOworfSA6IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiBPYmplY3QoaXQpIGluc3RhbmNlb2YgJFN5bWJvbDsKK307Cit2YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykgeworIGlmIChPID09PSBPYmplY3RQcm90b3R5cGUpCisgICRkZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQLCBBdHRyaWJ1dGVzKTsKKyBhbk9iamVjdChPKTsKKyB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CisgYW5PYmplY3QoQXR0cmlidXRlcyk7CisgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7CisgIGlmICghQXR0cmlidXRlcy5lbnVtZXJhYmxlKSB7CisgICBpZiAoIWhhcyhPLCBISURERU4pKQorICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIEhJRERFTiwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHt9KSk7CisgICBPW0hJRERFTl1ba2V5XSA9IHRydWU7CisgIH0gZWxzZSB7CisgICBpZiAoaGFzKE8sIEhJRERFTikgJiYgT1tISURERU5dW2tleV0pCisgICAgT1tISURERU5dW2tleV0gPSBmYWxzZTsKKyAgIEF0dHJpYnV0ZXMgPSBuYXRpdmVPYmplY3RDcmVhdGUoQXR0cmlidXRlcywgeyBlbnVtZXJhYmxlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgZmFsc2UpIH0pOworICB9CisgIHJldHVybiBzZXRTeW1ib2xEZXNjcmlwdG9yKE8sIGtleSwgQXR0cmlidXRlcyk7CisgfQorIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBrZXksIEF0dHJpYnV0ZXMpOworfTsKK3ZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykgeworIGFuT2JqZWN0KE8pOworIHZhciBwcm9wZXJ0aWVzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpOworIHZhciBrZXlzID0gb2JqZWN0S2V5cyhwcm9wZXJ0aWVzKS5jb25jYXQoJGdldE93blByb3BlcnR5U3ltYm9scyhwcm9wZXJ0aWVzKSk7CisgJGZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkgeworICBpZiAoIURFU0NSSVBUT1JTIHx8ICRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHByb3BlcnRpZXMsIGtleSkpCisgICAkZGVmaW5lUHJvcGVydHkoTywga2V5LCBwcm9wZXJ0aWVzW2tleV0pOworIH0pOworIHJldHVybiBPOworfTsKK3ZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHsKKyByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gbmF0aXZlT2JqZWN0Q3JlYXRlKE8pIDogJGRlZmluZVByb3BlcnRpZXMobmF0aXZlT2JqZWN0Q3JlYXRlKE8pLCBQcm9wZXJ0aWVzKTsKK307Cit2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgeworIHZhciBQID0gdG9QcmltaXRpdmUoViwgdHJ1ZSk7CisgdmFyIGVudW1lcmFibGUgPSBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRoaXMsIFApOworIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIFApICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCkpCisgIHJldHVybiBmYWxzZTsKKyByZXR1cm4gZW51bWVyYWJsZSB8fCAhaGFzKHRoaXMsIFApIHx8ICFoYXMoQWxsU3ltYm9scywgUCkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW1BdID8gZW51bWVyYWJsZSA6IHRydWU7Cit9OwordmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkgeworIHZhciBpdCA9IHRvSW5kZXhlZE9iamVjdChPKTsKKyB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CisgaWYgKGl0ID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBrZXkpKQorICByZXR1cm47CisgdmFyIGRlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7CisgaWYgKGRlc2NyaXB0b3IgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgeworICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlOworIH0KKyByZXR1cm4gZGVzY3JpcHRvcjsKK307Cit2YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHsKKyB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChPKSk7CisgdmFyIHJlc3VsdCA9IFtdOworICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7CisgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhoaWRkZW5LZXlzLCBrZXkpKQorICAgcmVzdWx0LnB1c2goa2V5KTsKKyB9KTsKKyByZXR1cm4gcmVzdWx0OworfTsKK3ZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pIHsKKyB2YXIgSVNfT0JKRUNUX1BST1RPVFlQRSA9IE8gPT09IE9iamVjdFByb3RvdHlwZTsKKyB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKElTX09CSkVDVF9QUk9UT1RZUEUgPyBPYmplY3RQcm90b3R5cGVTeW1ib2xzIDogdG9JbmRleGVkT2JqZWN0KE8pKTsKKyB2YXIgcmVzdWx0ID0gW107CisgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHsKKyAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICghSVNfT0JKRUNUX1BST1RPVFlQRSB8fCBoYXMoT2JqZWN0UHJvdG90eXBlLCBrZXkpKSkgeworICAgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTsKKyAgfQorIH0pOworIHJldHVybiByZXN1bHQ7Cit9OworaWYgKCFOQVRJVkVfU1lNQk9MKSB7CisgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHsKKyAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKQorICAgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTsKKyAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTsKKyAgdmFyIHRhZyA9IHVpZChkZXNjcmlwdGlvbik7CisgIHZhciBzZXR0ZXIgPSBmdW5jdGlvbiAodmFsdWUpIHsKKyAgIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUpCisgICAgc2V0dGVyLmNhbGwoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgdmFsdWUpOworICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpCisgICAgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTsKKyAgIHNldFN5bWJvbERlc2NyaXB0b3IodGhpcywgdGFnLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTsKKyAgfTsKKyAgaWYgKERFU0NSSVBUT1JTICYmIFVTRV9TRVRURVIpCisgICBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7CisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIHNldDogc2V0dGVyCisgICB9KTsKKyAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7CisgfTsKKyByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7CisgfSk7CisgcmVkZWZpbmUoJFN5bWJvbCwgJ3dpdGhvdXRTZXR0ZXInLCBmdW5jdGlvbiAoZGVzY3JpcHRpb24pIHsKKyAgcmV0dXJuIHdyYXAodWlkKGRlc2NyaXB0aW9uKSwgZGVzY3JpcHRpb24pOworIH0pOworIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7CisgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0eTsKKyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CisgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lczsKKyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7Cisgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAgcmV0dXJuIHdyYXAod2VsbEtub3duU3ltYm9sKG5hbWUpLCBuYW1lKTsKKyB9OworIGlmIChERVNDUklQVE9SUykgeworICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sICdkZXNjcmlwdGlvbicsIHsKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuZGVzY3JpcHRpb247CisgICB9CisgIH0pOworICBpZiAoIUlTX1BVUkUpIHsKKyAgIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB7IHVuc2FmZTogdHJ1ZSB9KTsKKyAgfQorIH0KK30KKyQoeworIGdsb2JhbDogdHJ1ZSwKKyB3cmFwOiB0cnVlLAorIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsCisgc2hhbTogIU5BVElWRV9TWU1CT0wKK30sIHsgU3ltYm9sOiAkU3ltYm9sIH0pOworJGZvckVhY2gob2JqZWN0S2V5cyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBmdW5jdGlvbiAobmFtZSkgeworIGRlZmluZVdlbGxLbm93blN5bWJvbChuYW1lKTsKK30pOworJCh7CisgdGFyZ2V0OiBTWU1CT0wsCisgc3RhdDogdHJ1ZSwKKyBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MCit9LCB7CisgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHsKKyAgdmFyIHN0cmluZyA9IFN0cmluZyhrZXkpOworICBpZiAoaGFzKFN0cmluZ1RvU3ltYm9sUmVnaXN0cnksIHN0cmluZykpCisgICByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddOworICB2YXIgc3ltYm9sID0gJFN5bWJvbChzdHJpbmcpOworICBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5W3N0cmluZ10gPSBzeW1ib2w7CisgIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltYm9sXSA9IHN0cmluZzsKKyAgcmV0dXJuIHN5bWJvbDsKKyB9LAorIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkgeworICBpZiAoIWlzU3ltYm9sKHN5bSkpCisgICB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2wnKTsKKyAgaWYgKGhhcyhTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5LCBzeW0pKQorICAgcmV0dXJuIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltXTsKKyB9LAorIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeworICBVU0VfU0VUVEVSID0gdHJ1ZTsKKyB9LAorIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeworICBVU0VfU0VUVEVSID0gZmFsc2U7CisgfQorfSk7CiskKHsKKyB0YXJnZXQ6ICdPYmplY3QnLAorIHN0YXQ6IHRydWUsCisgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwKKyBzaGFtOiAhREVTQ1JJUFRPUlMKK30sIHsKKyBjcmVhdGU6ICRjcmVhdGUsCisgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSwKKyBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcywKKyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKK30pOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogIU5BVElWRV9TWU1CT0wKK30sIHsKKyBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcywKKyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMKK30pOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogZmFpbHMoZnVuY3Rpb24gKCkgeworICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZigxKTsKKyB9KQorfSwgeworIGdldE93blByb3BlcnR5U3ltYm9sczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7CisgIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZih0b09iamVjdChpdCkpOworIH0KK30pOworaWYgKCRzdHJpbmdpZnkpIHsKKyB2YXIgRk9SQ0VEX0pTT05fU1RSSU5HSUZZID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkgeworICB2YXIgc3ltYm9sID0gJFN5bWJvbCgpOworICByZXR1cm4gJHN0cmluZ2lmeShbc3ltYm9sXSkgIT0gJ1tudWxsXScgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPSAne30nIHx8ICRzdHJpbmdpZnkoT2JqZWN0KHN5bWJvbCkpICE9ICd7fSc7CisgfSk7CisgJCh7CisgIHRhcmdldDogJ0pTT04nLAorICBzdGF0OiB0cnVlLAorICBmb3JjZWQ6IEZPUkNFRF9KU09OX1NUUklOR0lGWQorIH0sIHsKKyAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkgeworICAgdmFyIGFyZ3MgPSBbaXRdOworICAgdmFyIGluZGV4ID0gMTsKKyAgIHZhciAkcmVwbGFjZXI7CisgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGluZGV4KQorICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaW5kZXgrK10pOworICAgJHJlcGxhY2VyID0gcmVwbGFjZXI7CisgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkKKyAgICByZXR1cm47CisgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKQorICAgIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykKKyAgICAgIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7CisgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKQorICAgICAgcmV0dXJuIHZhbHVlOworICAgIH07CisgICBhcmdzWzFdID0gcmVwbGFjZXI7CisgICByZXR1cm4gJHN0cmluZ2lmeS5hcHBseShudWxsLCBhcmdzKTsKKyAgfQorIH0pOworfQoraWYgKCEkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSkgeworIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpOworfQorc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgU1lNQk9MKTsKK2hpZGRlbktleXNbSElEREVOXSA9IHRydWU7CisKKy8qKiovIH0pLAorLyogMTcxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NCkuZjsKK3ZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nOwordmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107Cit2YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHsKKyB0cnkgeworICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhpdCk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7CisgfQorfTsKK21vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7CisgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTsKK307CisKKy8qKiovIH0pLAorLyogMTcyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK2V4cG9ydHMuZiA9IHdlbGxLbm93blN5bWJvbDsKKworLyoqKi8gfSksCisvKiAxNzMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzIpOwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNykuZjsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHsKKyB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pOworIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpCisgIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwgeyB2YWx1ZTogd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKE5BTUUpIH0pOworfTsKKworLyoqKi8gfSksCisvKiAxNzQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpOworCisvKioqLyB9KSwKKy8qIDE3NSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNykuZjsKK3ZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MCk7Cit2YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKK2lmIChERVNDUklQVE9SUyAmJiB0eXBlb2YgTmF0aXZlU3ltYm9sID09ICdmdW5jdGlvbicgJiYgKCEoJ2Rlc2NyaXB0aW9uJyBpbiBOYXRpdmVTeW1ib2wucHJvdG90eXBlKSB8fCBOYXRpdmVTeW1ib2woKS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSkgeworIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTsKKyB2YXIgU3ltYm9sV3JhcHBlciA9IGZ1bmN0aW9uIFN5bWJvbCgpIHsKKyAgdmFyIGRlc2NyaXB0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTsKKyAgdmFyIHJlc3VsdCA9IHRoaXMgaW5zdGFuY2VvZiBTeW1ib2xXcmFwcGVyID8gbmV3IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbikgOiBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gTmF0aXZlU3ltYm9sKCkgOiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pOworICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKQorICAgRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlW3Jlc3VsdF0gPSB0cnVlOworICByZXR1cm4gcmVzdWx0OworIH07CisgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhTeW1ib2xXcmFwcGVyLCBOYXRpdmVTeW1ib2wpOworIHZhciBzeW1ib2xQcm90b3R5cGUgPSBTeW1ib2xXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZVN5bWJvbC5wcm90b3R5cGU7Cisgc3ltYm9sUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ltYm9sV3JhcHBlcjsKKyB2YXIgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90b3R5cGUudG9TdHJpbmc7CisgdmFyIG5hdGl2ZSA9IFN0cmluZyhOYXRpdmVTeW1ib2woJ3Rlc3QnKSkgPT0gJ1N5bWJvbCh0ZXN0KSc7CisgdmFyIHJlZ2V4cCA9IC9eU3ltYm9sXCgoLiopXClbXildKyQvOworIGRlZmluZVByb3BlcnR5KHN5bWJvbFByb3RvdHlwZSwgJ2Rlc2NyaXB0aW9uJywgeworICBjb25maWd1cmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7CisgICB2YXIgc3ltYm9sID0gaXNPYmplY3QodGhpcykgPyB0aGlzLnZhbHVlT2YoKSA6IHRoaXM7CisgICB2YXIgc3RyaW5nID0gc3ltYm9sVG9TdHJpbmcuY2FsbChzeW1ib2wpOworICAgaWYgKGhhcyhFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUsIHN5bWJvbCkpCisgICAgcmV0dXJuICcnOworICAgdmFyIGRlc2MgPSBuYXRpdmUgPyBzdHJpbmcuc2xpY2UoNywgLTEpIDogc3RyaW5nLnJlcGxhY2UocmVnZXhwLCAnJDEnKTsKKyAgIHJldHVybiBkZXNjID09PSAnJyA/IHVuZGVmaW5lZCA6IGRlc2M7CisgIH0KKyB9KTsKKyAkKHsKKyAgZ2xvYmFsOiB0cnVlLAorICBmb3JjZWQ6IHRydWUKKyB9LCB7IFN5bWJvbDogU3ltYm9sV3JhcHBlciB9KTsKK30KKworLyoqKi8gfSksCisvKiAxNzYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTsKKworLyoqKi8gfSksCisvKiAxNzcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7CisKKy8qKiovIH0pLAorLyogMTc4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CisKKy8qKiovIH0pLAorLyogMTc5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoJyk7CisKKy8qKiovIH0pLAorLyogMTgwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoQWxsJyk7CisKKy8qKiovIH0pLAorLyogMTgxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTsKKworLyoqKi8gfSksCisvKiAxODIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnc2VhcmNoJyk7CisKKy8qKiovIH0pLAorLyogMTgzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKKworLyoqKi8gfSksCisvKiAxODQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnc3BsaXQnKTsKKworLyoqKi8gfSksCisvKiAxODUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTsKKworLyoqKi8gfSksCisvKiAxODYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKKworLyoqKi8gfSksCisvKiAxODcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTczKTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTsKKworLyoqKi8gfSksCisvKiAxODggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NSk7CitzZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpOworCisvKioqLyB9KSwKKy8qIDE4OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg1KTsKK3NldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpOworCisvKioqLyB9KSwKKy8qIDE5MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDE5MSk7Cit2YXIgZW50cnlVbmJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYxKTsKK21vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdwYWRTdGFydCcpOworCisvKioqLyB9KSwKKy8qIDE5MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgJHBhZFN0YXJ0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTIpLnN0YXJ0OwordmFyIFdFQktJVF9CVUcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5NCk7CiskKHsKKyB0YXJnZXQ6ICdTdHJpbmcnLAorIHByb3RvOiB0cnVlLAorIGZvcmNlZDogV0VCS0lUX0JVRworfSwgeworIHBhZFN0YXJ0OiBmdW5jdGlvbiBwYWRTdGFydChtYXhMZW5ndGgpIHsKKyAgcmV0dXJuICRwYWRTdGFydCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxOTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nyk7Cit2YXIgcmVwZWF0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTMpOwordmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwKTsKK3ZhciBjZWlsID0gTWF0aC5jZWlsOwordmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19FTkQpIHsKKyByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHsKKyAgdmFyIFMgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpOworICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7CisgIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpOworICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTsKKyAgdmFyIGZpbGxMZW4sIHN0cmluZ0ZpbGxlcjsKKyAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykKKyAgIHJldHVybiBTOworICBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoOworICBzdHJpbmdGaWxsZXIgPSByZXBlYXQuY2FsbChmaWxsU3RyLCBjZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpOworICBpZiAoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pCisgICBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7CisgIHJldHVybiBJU19FTkQgPyBTICsgc3RyaW5nRmlsbGVyIDogc3RyaW5nRmlsbGVyICsgUzsKKyB9OworfTsKK21vZHVsZS5leHBvcnRzID0geworIHN0YXJ0OiBjcmVhdGVNZXRob2QoZmFsc2UpLAorIGVuZDogY3JlYXRlTWV0aG9kKHRydWUpCit9OworCisvKioqLyB9KSwKKy8qIDE5MyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciB0b0ludGVnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ4KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7Cittb2R1bGUuZXhwb3J0cyA9ICcnLnJlcGVhdCB8fCBmdW5jdGlvbiByZXBlYXQoY291bnQpIHsKKyB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpOworIHZhciByZXN1bHQgPSAnJzsKKyB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7CisgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpCisgIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpOworIGZvciAoOyBuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpCisgIGlmIChuICYgMSkKKyAgIHJlc3VsdCArPSBzdHI7CisgcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKiovIH0pLAorLyogMTk0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB1c2VyQWdlbnQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyOSk7Cittb2R1bGUuZXhwb3J0cyA9IC9WZXJzaW9uXC8xMFwuXGQrKFwuXGQrKT8oIE1vYmlsZVwvXHcrKT8gU2FmYXJpXC8vLnRlc3QodXNlckFnZW50KTsKKworLyoqKi8gfSksCisvKiAxOTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxOTYpOwordmFyIGVudHJ5VW5iaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg2MSk7Cittb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAncGFkRW5kJyk7CisKKy8qKiovIH0pLAorLyogMTk2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciAkcGFkRW5kID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTIpLmVuZDsKK3ZhciBXRUJLSVRfQlVHID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTQpOworJCh7CisgdGFyZ2V0OiAnU3RyaW5nJywKKyBwcm90bzogdHJ1ZSwKKyBmb3JjZWQ6IFdFQktJVF9CVUcKK30sIHsKKyBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGgpIHsKKyAgcmV0dXJuICRwYWRFbmQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTk3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTk4KTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LnZhbHVlczsKKworLyoqKi8gfSksCisvKiAxOTggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciAkdmFsdWVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTkpLnZhbHVlczsKKyQoeworIHRhcmdldDogJ09iamVjdCcsCisgc3RhdDogdHJ1ZQorfSwgeworIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKE8pIHsKKyAgcmV0dXJuICR2YWx1ZXMoTyk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTk5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIG9iamVjdEtleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDczKTsKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTUpLmY7Cit2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRPX0VOVFJJRVMpIHsKKyByZXR1cm4gZnVuY3Rpb24gKGl0KSB7CisgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTsKKyAgdmFyIGtleXMgPSBvYmplY3RLZXlzKE8pOworICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7CisgIHZhciBpID0gMDsKKyAgdmFyIHJlc3VsdCA9IFtdOworICB2YXIga2V5OworICB3aGlsZSAobGVuZ3RoID4gaSkgeworICAga2V5ID0ga2V5c1tpKytdOworICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKE8sIGtleSkpIHsKKyAgICByZXN1bHQucHVzaChUT19FTlRSSUVTID8gWworICAgICBrZXksCisgICAgIE9ba2V5XQorICAgIF0gOiBPW2tleV0pOworICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7CisgfTsKK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBlbnRyaWVzOiBjcmVhdGVNZXRob2QodHJ1ZSksCisgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpCit9OworCisvKioqLyB9KSwKKy8qIDIwMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDIwMSk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzOworCisvKioqLyB9KSwKKy8qIDIwMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyICRlbnRyaWVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOTkpLmVudHJpZXM7CiskKHsKKyB0YXJnZXQ6ICdPYmplY3QnLAorIHN0YXQ6IHRydWUKK30sIHsKKyBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHsKKyAgcmV0dXJuICRlbnRyaWVzKE8pOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDIwMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmNsZWFyUHJpbWl0aXZlQ2FjaGVzID0gY2xlYXJQcmltaXRpdmVDYWNoZXM7CitleHBvcnRzLmlzRU9GID0gaXNFT0Y7CitleHBvcnRzLmlzQ21kID0gaXNDbWQ7CitleHBvcnRzLmlzRGljdCA9IGlzRGljdDsKK2V4cG9ydHMuaXNOYW1lID0gaXNOYW1lOworZXhwb3J0cy5pc1JlZiA9IGlzUmVmOworZXhwb3J0cy5pc1JlZnNFcXVhbCA9IGlzUmVmc0VxdWFsOworZXhwb3J0cy5pc1N0cmVhbSA9IGlzU3RyZWFtOworZXhwb3J0cy5SZWZTZXRDYWNoZSA9IGV4cG9ydHMuUmVmU2V0ID0gZXhwb3J0cy5SZWYgPSBleHBvcnRzLk5hbWUgPSBleHBvcnRzLkRpY3QgPSBleHBvcnRzLkNtZCA9IGV4cG9ydHMuRU9GID0gdm9pZCAwOworCit2YXIgX3JlZ2VuZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dfcGRmanNfcmVxdWlyZV9fKDIpKTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKworZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCitmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfQorCitmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9CisKK2Z1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJ1bmRlZmluZWQiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuOyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVkOyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVsicmV0dXJuIl0gIT0gbnVsbCkgX2lbInJldHVybiJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfQorCitmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH0KKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IHRocm93IF9lMjsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTMpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UzOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CisKK2Z1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCitmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9CisKK2Z1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9CisKK3ZhciBFT0YgPSB7fTsKK2V4cG9ydHMuRU9GID0gRU9GOworCit2YXIgTmFtZSA9IGZ1bmN0aW9uIE5hbWVDbG9zdXJlKCkgeworICB2YXIgbmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICBmdW5jdGlvbiBOYW1lKG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgTmFtZS5wcm90b3R5cGUgPSB7fTsKKworICBOYW1lLmdldCA9IGZ1bmN0aW9uIE5hbWVfZ2V0KG5hbWUpIHsKKyAgICB2YXIgbmFtZVZhbHVlID0gbmFtZUNhY2hlW25hbWVdOworICAgIHJldHVybiBuYW1lVmFsdWUgPyBuYW1lVmFsdWUgOiBuYW1lQ2FjaGVbbmFtZV0gPSBuZXcgTmFtZShuYW1lKTsKKyAgfTsKKworICBOYW1lLl9jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkgeworICAgIG5hbWVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH07CisKKyAgcmV0dXJuIE5hbWU7Cit9KCk7CisKK2V4cG9ydHMuTmFtZSA9IE5hbWU7CisKK3ZhciBDbWQgPSBmdW5jdGlvbiBDbWRDbG9zdXJlKCkgeworICB2YXIgY21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgIGZ1bmN0aW9uIENtZChjbWQpIHsKKyAgICB0aGlzLmNtZCA9IGNtZDsKKyAgfQorCisgIENtZC5wcm90b3R5cGUgPSB7fTsKKworICBDbWQuZ2V0ID0gZnVuY3Rpb24gQ21kX2dldChjbWQpIHsKKyAgICB2YXIgY21kVmFsdWUgPSBjbWRDYWNoZVtjbWRdOworICAgIHJldHVybiBjbWRWYWx1ZSA/IGNtZFZhbHVlIDogY21kQ2FjaGVbY21kXSA9IG5ldyBDbWQoY21kKTsKKyAgfTsKKworICBDbWQuX2NsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7CisgICAgY21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9OworCisgIHJldHVybiBDbWQ7Cit9KCk7CisKK2V4cG9ydHMuQ21kID0gQ21kOworCit2YXIgRGljdCA9IGZ1bmN0aW9uIERpY3RDbG9zdXJlKCkgeworICB2YXIgbm9uU2VyaWFsaXphYmxlID0gZnVuY3Rpb24gbm9uU2VyaWFsaXphYmxlQ2xvc3VyZSgpIHsKKyAgICByZXR1cm4gbm9uU2VyaWFsaXphYmxlOworICB9OworCisgIGZ1bmN0aW9uIERpY3QoeHJlZikgeworICAgIHRoaXMuX21hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLm9iaklkID0gbnVsbDsKKyAgICB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlOworICAgIHRoaXMuX19ub25TZXJpYWxpemFibGVfXyA9IG5vblNlcmlhbGl6YWJsZTsKKyAgfQorCisgIERpY3QucHJvdG90eXBlID0geworICAgIGFzc2lnblhyZWY6IGZ1bmN0aW9uIERpY3RfYXNzaWduWHJlZihuZXdYcmVmKSB7CisgICAgICB0aGlzLnhyZWYgPSBuZXdYcmVmOworICAgIH0sCisKKyAgICBnZXQgc2l6ZSgpIHsKKyAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApLmxlbmd0aDsKKyAgICB9LAorCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5MSwga2V5Miwga2V5MykgeworICAgICAgdmFyIHZhbHVlID0gdGhpcy5fbWFwW2tleTFdOworCisgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrZXkyICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5Ml07CisKKyAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5M107CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgeworICAgICAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9LAorICAgIGdldEFzeW5jOiBmdW5jdGlvbiBnZXRBc3luYyhrZXkxLCBrZXkyLCBrZXkzKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CisgICAgICAgIHZhciB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBfdGhpcy5fbWFwW2tleTFdOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLl9tYXBba2V5Ml07CisKKyAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLl9tYXBba2V5M107CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgX3RoaXMueHJlZikpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgX3RoaXMueHJlZi5mZXRjaEFzeW5jKHZhbHVlLCBfdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pKTsKKworICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgdmFsdWUpOworCisgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSk7CisgICAgICB9KSkoKTsKKyAgICB9LAorICAgIGdldEFycmF5OiBmdW5jdGlvbiBnZXRBcnJheShrZXkxLCBrZXkyLCBrZXkzKSB7CisgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldChrZXkxLCBrZXkyLCBrZXkzKTsKKworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCAhdGhpcy54cmVmKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKworICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgpOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB2YWx1ZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGlmICghKHZhbHVlW2ldIGluc3RhbmNlb2YgUmVmKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWVbaV0gPSB0aGlzLnhyZWYuZmV0Y2godmFsdWVbaV0sIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0sCisgICAgZ2V0UmF3OiBmdW5jdGlvbiBEaWN0X2dldFJhdyhrZXkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBba2V5XTsKKyAgICB9LAorICAgIGdldEtleXM6IGZ1bmN0aW9uIERpY3RfZ2V0S2V5cygpIHsKKyAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApOworICAgIH0sCisgICAgZ2V0UmF3VmFsdWVzOiBmdW5jdGlvbiBEaWN0X2dldFJhd1ZhbHVlcygpIHsKKyAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX21hcCk7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uIERpY3Rfc2V0KGtleSwgdmFsdWUpIHsKKyAgICAgIHRoaXMuX21hcFtrZXldID0gdmFsdWU7CisgICAgfSwKKyAgICBoYXM6IGZ1bmN0aW9uIERpY3RfaGFzKGtleSkgeworICAgICAgcmV0dXJuIHRoaXMuX21hcFtrZXldICE9PSB1bmRlZmluZWQ7CisgICAgfSwKKyAgICBmb3JFYWNoOiBmdW5jdGlvbiBEaWN0X2ZvckVhY2goY2FsbGJhY2spIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9tYXApIHsKKyAgICAgICAgY2FsbGJhY2soa2V5LCB0aGlzLmdldChrZXkpKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisgIERpY3QuZW1wdHkgPSBuZXcgRGljdChudWxsKTsKKworICBEaWN0Lm1lcmdlID0gZnVuY3Rpb24gKF9yZWYpIHsKKyAgICB2YXIgeHJlZiA9IF9yZWYueHJlZiwKKyAgICAgICAgZGljdEFycmF5ID0gX3JlZi5kaWN0QXJyYXksCisgICAgICAgIF9yZWYkbWVyZ2VTdWJEaWN0cyA9IF9yZWYubWVyZ2VTdWJEaWN0cywKKyAgICAgICAgbWVyZ2VTdWJEaWN0cyA9IF9yZWYkbWVyZ2VTdWJEaWN0cyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJG1lcmdlU3ViRGljdHM7CisgICAgdmFyIG1lcmdlZERpY3QgPSBuZXcgRGljdCh4cmVmKTsKKworICAgIGlmICghbWVyZ2VTdWJEaWN0cykgeworICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRpY3RBcnJheSksCisgICAgICAgICAgX3N0ZXA7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgdmFyIGRpY3QgPSBfc3RlcC52YWx1ZTsKKworICAgICAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfT2JqZWN0JGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhkaWN0Ll9tYXApOyBfaSA8IF9PYmplY3QkZW50cmllcy5sZW5ndGg7IF9pKyspIHsKKyAgICAgICAgICAgIHZhciBfT2JqZWN0JGVudHJpZXMkX2kgPSBfc2xpY2VkVG9BcnJheShfT2JqZWN0JGVudHJpZXNbX2ldLCAyKSwKKyAgICAgICAgICAgICAgICBrZXkgPSBfT2JqZWN0JGVudHJpZXMkX2lbMF0sCisgICAgICAgICAgICAgICAgdmFsdWUgPSBfT2JqZWN0JGVudHJpZXMkX2lbMV07CisKKyAgICAgICAgICAgIGlmIChtZXJnZWREaWN0Ll9tYXBba2V5XSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgIG1lcmdlZERpY3QuX21hcFtrZXldID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvci5mKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBtZXJnZWREaWN0LnNpemUgPiAwID8gbWVyZ2VkRGljdCA6IERpY3QuZW1wdHk7CisgICAgfQorCisgICAgdmFyIHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7CisKKyAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRpY3RBcnJheSksCisgICAgICAgIF9zdGVwMjsKKworICAgIHRyeSB7CisgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykgeworICAgICAgICB2YXIgX2RpY3QgPSBfc3RlcDIudmFsdWU7CisKKyAgICAgICAgaWYgKCEoX2RpY3QgaW5zdGFuY2VvZiBEaWN0KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh2YXIgX2kyID0gMCwgX09iamVjdCRlbnRyaWVzMiA9IE9iamVjdC5lbnRyaWVzKF9kaWN0Ll9tYXApOyBfaTIgPCBfT2JqZWN0JGVudHJpZXMyLmxlbmd0aDsgX2kyKyspIHsKKyAgICAgICAgICB2YXIgX09iamVjdCRlbnRyaWVzMiRfaSA9IF9zbGljZWRUb0FycmF5KF9PYmplY3QkZW50cmllczJbX2kyXSwgMiksCisgICAgICAgICAgICAgIF9rZXkgPSBfT2JqZWN0JGVudHJpZXMyJF9pWzBdLAorICAgICAgICAgICAgICBfdmFsdWUgPSBfT2JqZWN0JGVudHJpZXMyJF9pWzFdOworCisgICAgICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllcy5nZXQoX2tleSk7CisKKyAgICAgICAgICBpZiAocHJvcGVydHkgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgcHJvcGVydHkgPSBbXTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0KF9rZXksIHByb3BlcnR5KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcm9wZXJ0eS5wdXNoKF92YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgIF9pdGVyYXRvcjIuZShlcnIpOworICAgIH0gZmluYWxseSB7CisgICAgICBfaXRlcmF0b3IyLmYoKTsKKyAgICB9CisKKyAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHByb3BlcnRpZXMpLAorICAgICAgICBfc3RlcDM7CisKKyAgICB0cnkgeworICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHsKKyAgICAgICAgdmFyIF9zdGVwMyR2YWx1ZSA9IF9zbGljZWRUb0FycmF5KF9zdGVwMy52YWx1ZSwgMiksCisgICAgICAgICAgICBuYW1lID0gX3N0ZXAzJHZhbHVlWzBdLAorICAgICAgICAgICAgdmFsdWVzID0gX3N0ZXAzJHZhbHVlWzFdOworCisgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxIHx8ICEodmFsdWVzWzBdIGluc3RhbmNlb2YgRGljdCkpIHsKKyAgICAgICAgICBtZXJnZWREaWN0Ll9tYXBbbmFtZV0gPSB2YWx1ZXNbMF07CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3ViRGljdCA9IG5ldyBEaWN0KHhyZWYpOworCisgICAgICAgIHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodmFsdWVzKSwKKyAgICAgICAgICAgIF9zdGVwNDsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNC5zKCk7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICB2YXIgX2RpY3QyID0gX3N0ZXA0LnZhbHVlOworCisgICAgICAgICAgICBpZiAoIShfZGljdDIgaW5zdGFuY2VvZiBEaWN0KSkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh2YXIgX2kzID0gMCwgX09iamVjdCRlbnRyaWVzMyA9IE9iamVjdC5lbnRyaWVzKF9kaWN0Mi5fbWFwKTsgX2kzIDwgX09iamVjdCRlbnRyaWVzMy5sZW5ndGg7IF9pMysrKSB7CisgICAgICAgICAgICAgIHZhciBfT2JqZWN0JGVudHJpZXMzJF9pID0gX3NsaWNlZFRvQXJyYXkoX09iamVjdCRlbnRyaWVzM1tfaTNdLCAyKSwKKyAgICAgICAgICAgICAgICAgIF9rZXkyID0gX09iamVjdCRlbnRyaWVzMyRfaVswXSwKKyAgICAgICAgICAgICAgICAgIF92YWx1ZTIgPSBfT2JqZWN0JGVudHJpZXMzJF9pWzFdOworCisgICAgICAgICAgICAgIGlmIChzdWJEaWN0Ll9tYXBbX2tleTJdID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgICAgICBzdWJEaWN0Ll9tYXBbX2tleTJdID0gX3ZhbHVlMjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgX2l0ZXJhdG9yNC5lKGVycik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgX2l0ZXJhdG9yNC5mKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ViRGljdC5zaXplID4gMCkgeworICAgICAgICAgIG1lcmdlZERpY3QuX21hcFtuYW1lXSA9IHN1YkRpY3Q7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgIF9pdGVyYXRvcjMuZShlcnIpOworICAgIH0gZmluYWxseSB7CisgICAgICBfaXRlcmF0b3IzLmYoKTsKKyAgICB9CisKKyAgICBwcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgcmV0dXJuIG1lcmdlZERpY3Quc2l6ZSA+IDAgPyBtZXJnZWREaWN0IDogRGljdC5lbXB0eTsKKyAgfTsKKworICByZXR1cm4gRGljdDsKK30oKTsKKworZXhwb3J0cy5EaWN0ID0gRGljdDsKKwordmFyIFJlZiA9IGZ1bmN0aW9uIFJlZkNsb3N1cmUoKSB7CisgIHZhciByZWZDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgZnVuY3Rpb24gUmVmKG51bSwgZ2VuKSB7CisgICAgdGhpcy5udW0gPSBudW07CisgICAgdGhpcy5nZW4gPSBnZW47CisgIH0KKworICBSZWYucHJvdG90eXBlID0geworICAgIHRvU3RyaW5nOiBmdW5jdGlvbiBSZWZfdG9TdHJpbmcoKSB7CisgICAgICBpZiAodGhpcy5nZW4gPT09IDApIHsKKyAgICAgICAgcmV0dXJuICIiLmNvbmNhdCh0aGlzLm51bSwgIlIiKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICIiLmNvbmNhdCh0aGlzLm51bSwgIlIiKS5jb25jYXQodGhpcy5nZW4pOworICAgIH0KKyAgfTsKKworICBSZWYuZ2V0ID0gZnVuY3Rpb24gKG51bSwgZ2VuKSB7CisgICAgdmFyIGtleSA9IGdlbiA9PT0gMCA/ICIiLmNvbmNhdChudW0sICJSIikgOiAiIi5jb25jYXQobnVtLCAiUiIpLmNvbmNhdChnZW4pOworICAgIHZhciByZWZWYWx1ZSA9IHJlZkNhY2hlW2tleV07CisgICAgcmV0dXJuIHJlZlZhbHVlID8gcmVmVmFsdWUgOiByZWZDYWNoZVtrZXldID0gbmV3IFJlZihudW0sIGdlbik7CisgIH07CisKKyAgUmVmLl9jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkgeworICAgIHJlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfTsKKworICByZXR1cm4gUmVmOworfSgpOworCitleHBvcnRzLlJlZiA9IFJlZjsKKwordmFyIFJlZlNldCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFJlZlNldCgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVmU2V0KTsKKworICAgIHRoaXMuX3NldCA9IG5ldyBTZXQoKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhSZWZTZXQsIFt7CisgICAga2V5OiAiaGFzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKHJlZikgeworICAgICAgcmV0dXJuIHRoaXMuX3NldC5oYXMocmVmLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInB1dCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHB1dChyZWYpIHsKKyAgICAgIHRoaXMuX3NldC5hZGQocmVmLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlbW92ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZShyZWYpIHsKKyAgICAgIHRoaXMuX3NldFsiZGVsZXRlIl0ocmVmLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBSZWZTZXQ7Cit9KCk7CisKK2V4cG9ydHMuUmVmU2V0ID0gUmVmU2V0OworCit2YXIgUmVmU2V0Q2FjaGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBSZWZTZXRDYWNoZSgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVmU2V0Q2FjaGUpOworCisgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFJlZlNldENhY2hlLCBbeworICAgIGtleTogImdldCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldChyZWYpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KHJlZi50b1N0cmluZygpKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoYXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMocmVmKSB7CisgICAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhyZWYudG9TdHJpbmcoKSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicHV0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcHV0KHJlZiwgb2JqKSB7CisgICAgICB0aGlzLl9tYXAuc2V0KHJlZi50b1N0cmluZygpLCBvYmopOworICAgIH0KKyAgfSwgeworICAgIGtleTogInB1dEFsaWFzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcHV0QWxpYXMocmVmLCBhbGlhc1JlZikgeworICAgICAgdGhpcy5fbWFwLnNldChyZWYudG9TdHJpbmcoKSwgdGhpcy5nZXQoYWxpYXNSZWYpKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmb3JFYWNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaykgeworICAgICAgdmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLl9tYXAudmFsdWVzKCkpLAorICAgICAgICAgIF9zdGVwNTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3I1LnMoKTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBfc3RlcDUudmFsdWU7CisgICAgICAgICAgY2FsbGJhY2sodmFsdWUpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yNS5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3I1LmYoKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjbGVhciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgeworICAgICAgdGhpcy5fbWFwLmNsZWFyKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2l6ZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fbWFwLnNpemU7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFJlZlNldENhY2hlOworfSgpOworCitleHBvcnRzLlJlZlNldENhY2hlID0gUmVmU2V0Q2FjaGU7CisKK2Z1bmN0aW9uIGlzRU9GKHYpIHsKKyAgcmV0dXJuIHYgPT09IEVPRjsKK30KKworZnVuY3Rpb24gaXNOYW1lKHYsIG5hbWUpIHsKKyAgcmV0dXJuIHYgaW5zdGFuY2VvZiBOYW1lICYmIChuYW1lID09PSB1bmRlZmluZWQgfHwgdi5uYW1lID09PSBuYW1lKTsKK30KKworZnVuY3Rpb24gaXNDbWQodiwgY21kKSB7CisgIHJldHVybiB2IGluc3RhbmNlb2YgQ21kICYmIChjbWQgPT09IHVuZGVmaW5lZCB8fCB2LmNtZCA9PT0gY21kKTsKK30KKworZnVuY3Rpb24gaXNEaWN0KHYsIHR5cGUpIHsKKyAgcmV0dXJuIHYgaW5zdGFuY2VvZiBEaWN0ICYmICh0eXBlID09PSB1bmRlZmluZWQgfHwgaXNOYW1lKHYuZ2V0KCJUeXBlIiksIHR5cGUpKTsKK30KKworZnVuY3Rpb24gaXNSZWYodikgeworICByZXR1cm4gdiBpbnN0YW5jZW9mIFJlZjsKK30KKworZnVuY3Rpb24gaXNSZWZzRXF1YWwodjEsIHYyKSB7CisgIHJldHVybiB2MS5udW0gPT09IHYyLm51bSAmJiB2MS5nZW4gPT09IHYyLmdlbjsKK30KKworZnVuY3Rpb24gaXNTdHJlYW0odikgeworICByZXR1cm4gX3R5cGVvZih2KSA9PT0gIm9iamVjdCIgJiYgdiAhPT0gbnVsbCAmJiB2LmdldEJ5dGVzICE9PSB1bmRlZmluZWQ7Cit9CisKK2Z1bmN0aW9uIGNsZWFyUHJpbWl0aXZlQ2FjaGVzKCkgeworICBDbWQuX2NsZWFyQ2FjaGUoKTsKKworICBOYW1lLl9jbGVhckNhY2hlKCk7CisKKyAgUmVmLl9jbGVhckNhY2hlKCk7Cit9CisKKy8qKiovIH0pLAorLyogMjAzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuTmV0d29ya1BkZk1hbmFnZXIgPSBleHBvcnRzLkxvY2FsUGRmTWFuYWdlciA9IHZvaWQgMDsKKwordmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXygyKSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY2h1bmtlZF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNCk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA1KTsKKwordmFyIF9kb2N1bWVudCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA2KTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOSk7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIEJhc2VQZGZNYW5hZ2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQmFzZVBkZk1hbmFnZXIoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJhc2VQZGZNYW5hZ2VyKTsKKworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlUGRmTWFuYWdlcikgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZVBkZk1hbmFnZXIuIik7CisgICAgfQorICB9CisKKyAgX2NyZWF0ZUNsYXNzKEJhc2VQZGZNYW5hZ2VyLCBbeworICAgIGtleTogIm9uTG9hZGVkU3RyZWFtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25Mb2FkZWRTdHJlYW0oKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYG9uTG9hZGVkU3RyZWFtYCBjYWxsZWQiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJlbnN1cmVEb2MiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBlbnN1cmVEb2MocHJvcCwgYXJncykgeworICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQsIHByb3AsIGFyZ3MpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImVuc3VyZVhSZWYiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBlbnN1cmVYUmVmKHByb3AsIGFyZ3MpIHsKKyAgICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LnhyZWYsIHByb3AsIGFyZ3MpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImVuc3VyZUNhdGFsb2ciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBlbnN1cmVDYXRhbG9nKHByb3AsIGFyZ3MpIHsKKyAgICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LmNhdGFsb2csIHByb3AsIGFyZ3MpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFBhZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlKHBhZ2VJbmRleCkgeworICAgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShwYWdlSW5kZXgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImZvbnRGYWxsYmFjayIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikgeworICAgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjbGVhbnVwIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYW51cCgpIHsKKyAgICAgIHZhciBtYW51YWxseVRyaWdnZXJlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CisgICAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJlbnN1cmUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX2Vuc3VyZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKG9iaiwgcHJvcCwgYXJncykgeworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGVuc3VyZWAgY2FsbGVkIik7CisKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gZW5zdXJlKF94LCBfeDIsIF94MykgeworICAgICAgICByZXR1cm4gX2Vuc3VyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gZW5zdXJlOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAicmVxdWVzdFJhbmdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdFJhbmdlYCBjYWxsZWQiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZXF1ZXN0TG9hZGVkU3RyZWFtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVxdWVzdExvYWRlZFN0cmVhbSgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdExvYWRlZFN0cmVhbWAgY2FsbGVkIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2VuZFByb2dyZXNzaXZlRGF0YSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAidXBkYXRlUGFzc3dvcmQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVQYXNzd29yZChwYXNzd29yZCkgeworICAgICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ0ZXJtaW5hdGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB0ZXJtaW5hdGUocmVhc29uKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHRlcm1pbmF0ZWAgY2FsbGVkIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZG9jSWQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2RvY0lkOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBhc3N3b3JkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYXNzd29yZDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJkb2NCYXNlVXJsIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBkb2NCYXNlVXJsID0gbnVsbDsKKworICAgICAgaWYgKHRoaXMuX2RvY0Jhc2VVcmwpIHsKKyAgICAgICAgdmFyIGFic29sdXRlVXJsID0gKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKHRoaXMuX2RvY0Jhc2VVcmwpOworCisgICAgICAgIGlmIChhYnNvbHV0ZVVybCkgeworICAgICAgICAgIGRvY0Jhc2VVcmwgPSBhYnNvbHV0ZVVybC5ocmVmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBhYnNvbHV0ZSBkb2NCYXNlVXJsOiBcIiIuY29uY2F0KHRoaXMuX2RvY0Jhc2VVcmwsICJcIi4iKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJkb2NCYXNlVXJsIiwgZG9jQmFzZVVybCk7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEJhc2VQZGZNYW5hZ2VyOworfSgpOworCit2YXIgTG9jYWxQZGZNYW5hZ2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZVBkZk1hbmFnZXIpIHsKKyAgX2luaGVyaXRzKExvY2FsUGRmTWFuYWdlciwgX0Jhc2VQZGZNYW5hZ2VyKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKExvY2FsUGRmTWFuYWdlcik7CisKKyAgZnVuY3Rpb24gTG9jYWxQZGZNYW5hZ2VyKGRvY0lkLCBkYXRhLCBwYXNzd29yZCwgZXZhbHVhdG9yT3B0aW9ucywgZG9jQmFzZVVybCkgeworICAgIHZhciBfdGhpczsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhbFBkZk1hbmFnZXIpOworCisgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKKyAgICBfdGhpcy5fZG9jSWQgPSBkb2NJZDsKKyAgICBfdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICBfdGhpcy5fZG9jQmFzZVVybCA9IGRvY0Jhc2VVcmw7CisgICAgX3RoaXMuZXZhbHVhdG9yT3B0aW9ucyA9IGV2YWx1YXRvck9wdGlvbnM7CisgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmVhbShkYXRhKTsKKyAgICBfdGhpcy5wZGZEb2N1bWVudCA9IG5ldyBfZG9jdW1lbnQuUERGRG9jdW1lbnQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIHN0cmVhbSk7CisgICAgX3RoaXMuX2xvYWRlZFN0cmVhbVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoc3RyZWFtKTsKKyAgICByZXR1cm4gX3RoaXM7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoTG9jYWxQZGZNYW5hZ2VyLCBbeworICAgIGtleTogImVuc3VyZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfZW5zdXJlMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMihvYmosIHByb3AsIGFyZ3MpIHsKKyAgICAgICAgdmFyIHZhbHVlOworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBvYmpbcHJvcF07CisKKyAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgdmFsdWUuYXBwbHkob2JqLCBhcmdzKSk7CisKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCB2YWx1ZSk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTIpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBlbnN1cmUoX3g0LCBfeDUsIF94NikgeworICAgICAgICByZXR1cm4gX2Vuc3VyZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGVuc3VyZTsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogInJlcXVlc3RSYW5nZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVxdWVzdExvYWRlZFN0cmVhbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlcXVlc3RMb2FkZWRTdHJlYW0oKSB7fQorICB9LCB7CisgICAga2V5OiAib25Mb2FkZWRTdHJlYW0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbkxvYWRlZFN0cmVhbSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1Qcm9taXNlOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRlcm1pbmF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHRlcm1pbmF0ZShyZWFzb24pIHt9CisgIH1dKTsKKworICByZXR1cm4gTG9jYWxQZGZNYW5hZ2VyOworfShCYXNlUGRmTWFuYWdlcik7CisKK2V4cG9ydHMuTG9jYWxQZGZNYW5hZ2VyID0gTG9jYWxQZGZNYW5hZ2VyOworCit2YXIgTmV0d29ya1BkZk1hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlUGRmTWFuYWdlcjIpIHsKKyAgX2luaGVyaXRzKE5ldHdvcmtQZGZNYW5hZ2VyLCBfQmFzZVBkZk1hbmFnZXIyKTsKKworICB2YXIgX3N1cGVyMiA9IF9jcmVhdGVTdXBlcihOZXR3b3JrUGRmTWFuYWdlcik7CisKKyAgZnVuY3Rpb24gTmV0d29ya1BkZk1hbmFnZXIoZG9jSWQsIHBkZk5ldHdvcmtTdHJlYW0sIGFyZ3MsIGV2YWx1YXRvck9wdGlvbnMsIGRvY0Jhc2VVcmwpIHsKKyAgICB2YXIgX3RoaXMyOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5ldHdvcmtQZGZNYW5hZ2VyKTsKKworICAgIF90aGlzMiA9IF9zdXBlcjIuY2FsbCh0aGlzKTsKKyAgICBfdGhpczIuX2RvY0lkID0gZG9jSWQ7CisgICAgX3RoaXMyLl9wYXNzd29yZCA9IGFyZ3MucGFzc3dvcmQ7CisgICAgX3RoaXMyLl9kb2NCYXNlVXJsID0gZG9jQmFzZVVybDsKKyAgICBfdGhpczIubXNnSGFuZGxlciA9IGFyZ3MubXNnSGFuZGxlcjsKKyAgICBfdGhpczIuZXZhbHVhdG9yT3B0aW9ucyA9IGV2YWx1YXRvck9wdGlvbnM7CisgICAgX3RoaXMyLnN0cmVhbU1hbmFnZXIgPSBuZXcgX2NodW5rZWRfc3RyZWFtLkNodW5rZWRTdHJlYW1NYW5hZ2VyKHBkZk5ldHdvcmtTdHJlYW0sIHsKKyAgICAgIG1zZ0hhbmRsZXI6IGFyZ3MubXNnSGFuZGxlciwKKyAgICAgIGxlbmd0aDogYXJncy5sZW5ndGgsCisgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBhcmdzLmRpc2FibGVBdXRvRmV0Y2gsCisgICAgICByYW5nZUNodW5rU2l6ZTogYXJncy5yYW5nZUNodW5rU2l6ZQorICAgIH0pOworICAgIF90aGlzMi5wZGZEb2N1bWVudCA9IG5ldyBfZG9jdW1lbnQuUERGRG9jdW1lbnQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczIpLCBfdGhpczIuc3RyZWFtTWFuYWdlci5nZXRTdHJlYW0oKSk7CisgICAgcmV0dXJuIF90aGlzMjsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhOZXR3b3JrUGRmTWFuYWdlciwgW3sKKyAgICBrZXk6ICJlbnN1cmUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX2Vuc3VyZTMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMob2JqLCBwcm9wLCBhcmdzKSB7CisgICAgICAgIHZhciB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gMDsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG9ialtwcm9wXTsKKworICAgICAgICAgICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCB2YWx1ZS5hcHBseShvYmosIGFyZ3MpKTsKKworICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHZhbHVlKTsKKworICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSA3OworICAgICAgICAgICAgICAgIF9jb250ZXh0My50MCA9IF9jb250ZXh0M1siY2F0Y2giXSgwKTsKKworICAgICAgICAgICAgICAgIGlmIChfY29udGV4dDMudDAgaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRocm93IF9jb250ZXh0My50MDsKKworICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTM7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdFJhbmdlKF9jb250ZXh0My50MC5iZWdpbiwgX2NvbnRleHQzLnQwLmVuZCk7CisKKyAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgdGhpcy5lbnN1cmUob2JqLCBwcm9wLCBhcmdzKSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzLCBbWzAsIDddXSk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIGVuc3VyZShfeDcsIF94OCwgX3g5KSB7CisgICAgICAgIHJldHVybiBfZW5zdXJlMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gZW5zdXJlOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAicmVxdWVzdFJhbmdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKKyAgICAgIHJldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlcXVlc3RMb2FkZWRTdHJlYW0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZXF1ZXN0TG9hZGVkU3RyZWFtKCkgeworICAgICAgdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RBbGxDaHVua3MoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZW5kUHJvZ3Jlc3NpdmVEYXRhIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2VuZFByb2dyZXNzaXZlRGF0YShjaHVuaykgeworICAgICAgdGhpcy5zdHJlYW1NYW5hZ2VyLm9uUmVjZWl2ZURhdGEoeworICAgICAgICBjaHVuazogY2h1bmsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uTG9hZGVkU3RyZWFtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25Mb2FkZWRTdHJlYW0oKSB7CisgICAgICByZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLm9uTG9hZGVkU3RyZWFtKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAidGVybWluYXRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gdGVybWluYXRlKHJlYXNvbikgeworICAgICAgdGhpcy5zdHJlYW1NYW5hZ2VyLmFib3J0KHJlYXNvbik7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIE5ldHdvcmtQZGZNYW5hZ2VyOworfShCYXNlUGRmTWFuYWdlcik7CisKK2V4cG9ydHMuTmV0d29ya1BkZk1hbmFnZXIgPSBOZXR3b3JrUGRmTWFuYWdlcjsKKworLyoqKi8gfSksCisvKiAyMDQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DaHVua2VkU3RyZWFtTWFuYWdlciA9IGV4cG9ydHMuQ2h1bmtlZFN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDUpOworCitmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CisKK2Z1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIENodW5rZWRTdHJlYW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDaHVua2VkU3RyZWFtKGxlbmd0aCwgY2h1bmtTaXplLCBtYW5hZ2VyKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENodW5rZWRTdHJlYW0pOworCisgICAgdGhpcy5ieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisgICAgdGhpcy5zdGFydCA9IDA7CisgICAgdGhpcy5wb3MgPSAwOworICAgIHRoaXMuZW5kID0gbGVuZ3RoOworICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplOworICAgIHRoaXMuX2xvYWRlZENodW5rcyA9IG5ldyBTZXQoKTsKKyAgICB0aGlzLm51bUNodW5rcyA9IE1hdGguY2VpbChsZW5ndGggLyBjaHVua1NpemUpOworICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisgICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSAwOworICAgIHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmsgPSAtMTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhDaHVua2VkU3RyZWFtLCBbeworICAgIGtleTogImdldE1pc3NpbmdDaHVua3MiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNaXNzaW5nQ2h1bmtzKCkgeworICAgICAgdmFyIGNodW5rcyA9IFtdOworCisgICAgICBmb3IgKHZhciBjaHVuayA9IDAsIG4gPSB0aGlzLm51bUNodW5rczsgY2h1bmsgPCBuOyArK2NodW5rKSB7CisgICAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKKyAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGNodW5rczsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRCYXNlU3RyZWFtcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJhc2VTdHJlYW1zKCkgeworICAgICAgcmV0dXJuIFt0aGlzXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJhbGxDaHVua3NMb2FkZWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhbGxDaHVua3NMb2FkZWQoKSB7CisgICAgICByZXR1cm4gdGhpcy5udW1DaHVua3NMb2FkZWQgPT09IHRoaXMubnVtQ2h1bmtzOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uUmVjZWl2ZURhdGEiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuaykgeworICAgICAgdmFyIGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplOworCisgICAgICBpZiAoYmVnaW4gJSBjaHVua1NpemUgIT09IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQgYmVnaW4gb2Zmc2V0OiAiLmNvbmNhdChiZWdpbikpOworICAgICAgfQorCisgICAgICB2YXIgZW5kID0gYmVnaW4gKyBjaHVuay5ieXRlTGVuZ3RoOworCisgICAgICBpZiAoZW5kICUgY2h1bmtTaXplICE9PSAwICYmIGVuZCAhPT0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQgZW5kIG9mZnNldDogIi5jb25jYXQoZW5kKSk7CisgICAgICB9CisKKyAgICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgYmVnaW4pOworICAgICAgdmFyIGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTsKKyAgICAgIHZhciBlbmRDaHVuayA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gY2h1bmtTaXplKSArIDE7CisKKyAgICAgIGZvciAodmFyIGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPCBlbmRDaHVuazsgKytjdXJDaHVuaykgeworICAgICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEoZGF0YSkgeworICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg7CisgICAgICB2YXIgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CisgICAgICB0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShkYXRhKSwgcG9zaXRpb24pOworICAgICAgcG9zaXRpb24gKz0gZGF0YS5ieXRlTGVuZ3RoOworICAgICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBwb3NpdGlvbjsKKyAgICAgIHZhciBlbmRDaHVuayA9IHBvc2l0aW9uID49IHRoaXMuZW5kID8gdGhpcy5udW1DaHVua3MgOiBNYXRoLmZsb29yKHBvc2l0aW9uIC8gdGhpcy5jaHVua1NpemUpOworCisgICAgICBmb3IgKHZhciBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHsKKyAgICAgICAgdGhpcy5fbG9hZGVkQ2h1bmtzLmFkZChjdXJDaHVuayk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZW5zdXJlQnl0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGVuc3VyZUJ5dGUocG9zKSB7CisgICAgICBpZiAocG9zIDwgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgY2h1bmsgPSBNYXRoLmZsb29yKHBvcyAvIHRoaXMuY2h1bmtTaXplKTsKKworICAgICAgaWYgKGNodW5rID09PSB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgeworICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24ocG9zLCBwb3MgKyAxKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayA9IGNodW5rOworICAgIH0KKyAgfSwgeworICAgIGtleTogImVuc3VyZVJhbmdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZW5zdXJlUmFuZ2UoYmVnaW4sIGVuZCkgeworICAgICAgaWYgKGJlZ2luID49IGVuZCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChlbmQgPD0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemU7CisgICAgICB2YXIgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyBjaHVua1NpemUpOworICAgICAgdmFyIGVuZENodW5rID0gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTsKKworICAgICAgZm9yICh2YXIgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7CisgICAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24oYmVnaW4sIGVuZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJuZXh0RW1wdHlDaHVuayIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG5leHRFbXB0eUNodW5rKGJlZ2luQ2h1bmspIHsKKyAgICAgIHZhciBudW1DaHVua3MgPSB0aGlzLm51bUNodW5rczsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1DaHVua3M7ICsraSkgeworICAgICAgICB2YXIgY2h1bmsgPSAoYmVnaW5DaHVuayArIGkpICUgbnVtQ2h1bmtzOworCisgICAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKKyAgICAgICAgICByZXR1cm4gY2h1bms7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaGFzQ2h1bmsiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNDaHVuayhjaHVuaykgeworICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEJ5dGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCeXRlKCkgeworICAgICAgdmFyIHBvcyA9IHRoaXMucG9zOworCisgICAgICBpZiAocG9zID49IHRoaXMuZW5kKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgaWYgKHBvcyA+PSB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgeworICAgICAgICB0aGlzLmVuc3VyZUJ5dGUocG9zKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0VWludDE2IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VWludDE2KCkgeworICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTsKKworICAgICAgaWYgKGIwID09PSAtMSB8fCBiMSA9PT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0SW50MzIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJbnQzMigpIHsKKyAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjIgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMyA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0Qnl0ZXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCeXRlcyhsZW5ndGgpIHsKKyAgICAgIHZhciBmb3JjZUNsYW1wZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOworICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlczsKKyAgICAgIHZhciBwb3MgPSB0aGlzLnBvczsKKyAgICAgIHZhciBzdHJFbmQgPSB0aGlzLmVuZDsKKworICAgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgaWYgKHN0ckVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIHN0ckVuZCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgX3N1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpOworCisgICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoX3N1YmFycmF5KSA6IF9zdWJhcnJheTsKKyAgICAgIH0KKworICAgICAgdmFyIGVuZCA9IHBvcyArIGxlbmd0aDsKKworICAgICAgaWYgKGVuZCA+IHN0ckVuZCkgeworICAgICAgICBlbmQgPSBzdHJFbmQ7CisgICAgICB9CisKKyAgICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgeworICAgICAgICB0aGlzLmVuc3VyZVJhbmdlKHBvcywgZW5kKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5wb3MgPSBlbmQ7CisgICAgICB2YXIgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7CisgICAgICByZXR1cm4gZm9yY2VDbGFtcGVkID8gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN1YmFycmF5KSA6IHN1YmFycmF5OworICAgIH0KKyAgfSwgeworICAgIGtleTogInBlZWtCeXRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcGVla0J5dGUoKSB7CisgICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpOworCisgICAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKKyAgICAgICAgdGhpcy5wb3MtLTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicGVla0J5dGVzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcGVla0J5dGVzKGxlbmd0aCkgeworICAgICAgdmFyIGZvcmNlQ2xhbXBlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTsKKyAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDsKKyAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRCeXRlUmFuZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgeworICAgICAgaWYgKGJlZ2luIDwgMCkgeworICAgICAgICBiZWdpbiA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChlbmQgPiB0aGlzLmVuZCkgeworICAgICAgICBlbmQgPSB0aGlzLmVuZDsKKyAgICAgIH0KKworICAgICAgaWYgKGVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlUmFuZ2UoYmVnaW4sIGVuZCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KGJlZ2luLCBlbmQpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNraXAiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBza2lwKG4pIHsKKyAgICAgIGlmICghbikgeworICAgICAgICBuID0gMTsKKyAgICAgIH0KKworICAgICAgdGhpcy5wb3MgKz0gbjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZXNldCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkgeworICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0OworICAgIH0KKyAgfSwgeworICAgIGtleTogIm1vdmVTdGFydCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVTdGFydCgpIHsKKyAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJtYWtlU3ViU3RyZWFtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0KSB7CisgICAgICBpZiAobGVuZ3RoKSB7CisgICAgICAgIGlmIChzdGFydCArIGxlbmd0aCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgICAgdGhpcy5lbnN1cmVSYW5nZShzdGFydCwgc3RhcnQgKyBsZW5ndGgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3RhcnQgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgICAgICB0aGlzLmVuc3VyZUJ5dGUoc3RhcnQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKSB7fQorCisgICAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CisKKyAgICAgIENodW5rZWRTdHJlYW1TdWJzdHJlYW0ucHJvdG90eXBlLmdldE1pc3NpbmdDaHVua3MgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZTsKKyAgICAgICAgdmFyIGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKHRoaXMuc3RhcnQgLyBjaHVua1NpemUpOworICAgICAgICB2YXIgZW5kQ2h1bmsgPSBNYXRoLmZsb29yKCh0aGlzLmVuZCAtIDEpIC8gY2h1bmtTaXplKSArIDE7CisgICAgICAgIHZhciBtaXNzaW5nQ2h1bmtzID0gW107CisKKyAgICAgICAgZm9yICh2YXIgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7CisgICAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgeworICAgICAgICAgICAgbWlzc2luZ0NodW5rcy5wdXNoKGNodW5rKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWlzc2luZ0NodW5rczsKKyAgICAgIH07CisKKyAgICAgIENodW5rZWRTdHJlYW1TdWJzdHJlYW0ucHJvdG90eXBlLmFsbENodW5rc0xvYWRlZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKHRoaXMubnVtQ2h1bmtzTG9hZGVkID09PSB0aGlzLm51bUNodW5rcykgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWlzc2luZ0NodW5rcygpLmxlbmd0aCA9PT0gMDsKKyAgICAgIH07CisKKyAgICAgIHZhciBzdWJTdHJlYW0gPSBuZXcgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbSgpOworICAgICAgc3ViU3RyZWFtLnBvcyA9IHN1YlN0cmVhbS5zdGFydCA9IHN0YXJ0OworICAgICAgc3ViU3RyZWFtLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIHx8IHRoaXMuZW5kOworICAgICAgc3ViU3RyZWFtLmRpY3QgPSBkaWN0OworICAgICAgcmV0dXJuIHN1YlN0cmVhbTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJudW1DaHVua3NMb2FkZWQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5zaXplOworICAgIH0KKyAgfSwgeworICAgIGtleTogImxlbmd0aCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5lbmQgLSB0aGlzLnN0YXJ0OworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzRW1wdHkiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBDaHVua2VkU3RyZWFtOworfSgpOworCitleHBvcnRzLkNodW5rZWRTdHJlYW0gPSBDaHVua2VkU3RyZWFtOworCit2YXIgQ2h1bmtlZFN0cmVhbU1hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDaHVua2VkU3RyZWFtTWFuYWdlcihwZGZOZXR3b3JrU3RyZWFtLCBhcmdzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENodW5rZWRTdHJlYW1NYW5hZ2VyKTsKKworICAgIHRoaXMubGVuZ3RoID0gYXJncy5sZW5ndGg7CisgICAgdGhpcy5jaHVua1NpemUgPSBhcmdzLnJhbmdlQ2h1bmtTaXplOworICAgIHRoaXMuc3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW0odGhpcy5sZW5ndGgsIHRoaXMuY2h1bmtTaXplLCB0aGlzKTsKKyAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0gPSBwZGZOZXR3b3JrU3RyZWFtOworICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaCA9IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaDsKKyAgICB0aGlzLm1zZ0hhbmRsZXIgPSBhcmdzLm1zZ0hhbmRsZXI7CisgICAgdGhpcy5jdXJyUmVxdWVzdElkID0gMDsKKyAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QgPSBuZXcgTWFwKCk7CisgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rID0gbmV3IE1hcCgpOworICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0ID0gbmV3IE1hcCgpOworICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gMDsKKyAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKENodW5rZWRTdHJlYW1NYW5hZ2VyLCBbeworICAgIGtleTogIm9uTG9hZGVkU3RyZWFtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25Mb2FkZWRTdHJlYW0oKSB7CisgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNlbmRSZXF1ZXN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2VuZFJlcXVlc3QoYmVnaW4sIGVuZCkgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdmFyIHJhbmdlUmVhZGVyID0gdGhpcy5wZGZOZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpOworCisgICAgICBpZiAoIXJhbmdlUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7CisgICAgICAgIHJhbmdlUmVhZGVyLm9uUHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNodW5rcyA9IFtdLAorICAgICAgICAgIGxvYWRlZCA9IDA7CisgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgICAgdmFyIHJlYWRDaHVuayA9IGZ1bmN0aW9uIHJlYWRDaHVuayhjaHVuaykgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWNodW5rLmRvbmUpIHsKKyAgICAgICAgICAgICAgdmFyIGRhdGEgPSBjaHVuay52YWx1ZTsKKyAgICAgICAgICAgICAgY2h1bmtzLnB1c2goZGF0YSk7CisgICAgICAgICAgICAgIGxvYWRlZCArPSAoMCwgX3V0aWwuYXJyYXlCeXRlTGVuZ3RoKShkYXRhKTsKKworICAgICAgICAgICAgICBpZiAocmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBfdGhpcy5vblByb2dyZXNzKHsKKyAgICAgICAgICAgICAgICAgIGxvYWRlZDogbG9hZGVkCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICByYW5nZVJlYWRlci5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGNodW5rRGF0YSA9ICgwLCBfdXRpbC5hcnJheXNUb0J5dGVzKShjaHVua3MpOworICAgICAgICAgICAgY2h1bmtzID0gbnVsbDsKKyAgICAgICAgICAgIHJlc29sdmUoY2h1bmtEYXRhKTsKKyAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICByZWplY3QoZSk7CisgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKKyAgICAgIH0pOworICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIGlmIChfdGhpcy5hYm9ydGVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgX3RoaXMub25SZWNlaXZlRGF0YSh7CisgICAgICAgICAgY2h1bms6IGRhdGEsCisgICAgICAgICAgYmVnaW46IGJlZ2luCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVxdWVzdEFsbENodW5rcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlcXVlc3RBbGxDaHVua3MoKSB7CisgICAgICB2YXIgbWlzc2luZ0NodW5rcyA9IHRoaXMuc3RyZWFtLmdldE1pc3NpbmdDaHVua3MoKTsKKworICAgICAgdGhpcy5fcmVxdWVzdENodW5rcyhtaXNzaW5nQ2h1bmtzKTsKKworICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcmVxdWVzdENodW5rcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXF1ZXN0Q2h1bmtzKGNodW5rcykgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHZhciByZXF1ZXN0SWQgPSB0aGlzLmN1cnJSZXF1ZXN0SWQrKzsKKyAgICAgIHZhciBjaHVua3NOZWVkZWQgPSBuZXcgU2V0KCk7CisKKyAgICAgIHRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdC5zZXQocmVxdWVzdElkLCBjaHVua3NOZWVkZWQpOworCisgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY2h1bmtzKSwKKyAgICAgICAgICBfc3RlcDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgY2h1bmsgPSBfc3RlcC52YWx1ZTsKKworICAgICAgICAgIGlmICghdGhpcy5zdHJlYW0uaGFzQ2h1bmsoY2h1bmspKSB7CisgICAgICAgICAgICBjaHVua3NOZWVkZWQuYWRkKGNodW5rKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3IuZShlcnIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgX2l0ZXJhdG9yLmYoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNodW5rc05lZWRlZC5zaXplID09PSAwKSB7CisgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LnNldChyZXF1ZXN0SWQsIGNhcGFiaWxpdHkpOworCisgICAgICB2YXIgY2h1bmtzVG9SZXF1ZXN0ID0gW107CisKKyAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY2h1bmtzTmVlZGVkKSwKKyAgICAgICAgICBfc3RlcDI7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgdmFyIF9jaHVuayA9IF9zdGVwMi52YWx1ZTsKKworICAgICAgICAgIHZhciByZXF1ZXN0SWRzID0gdGhpcy5fcmVxdWVzdHNCeUNodW5rLmdldChfY2h1bmspOworCisgICAgICAgICAgaWYgKCFyZXF1ZXN0SWRzKSB7CisgICAgICAgICAgICByZXF1ZXN0SWRzID0gW107CisKKyAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zZXQoX2NodW5rLCByZXF1ZXN0SWRzKTsKKworICAgICAgICAgICAgY2h1bmtzVG9SZXF1ZXN0LnB1c2goX2NodW5rKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXF1ZXN0SWRzLnB1c2gocmVxdWVzdElkKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvcjIuZShlcnIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgX2l0ZXJhdG9yMi5mKCk7CisgICAgICB9CisKKyAgICAgIGlmIChjaHVua3NUb1JlcXVlc3QubGVuZ3RoID4gMCkgeworICAgICAgICB2YXIgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCA9IHRoaXMuZ3JvdXBDaHVua3MoY2h1bmtzVG9SZXF1ZXN0KTsKKworICAgICAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGdyb3VwZWRDaHVua3NUb1JlcXVlc3QpLAorICAgICAgICAgICAgX3N0ZXAzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBncm91cGVkQ2h1bmsgPSBfc3RlcDMudmFsdWU7CisgICAgICAgICAgICB2YXIgYmVnaW4gPSBncm91cGVkQ2h1bmsuYmVnaW5DaHVuayAqIHRoaXMuY2h1bmtTaXplOworICAgICAgICAgICAgdmFyIGVuZCA9IE1hdGgubWluKGdyb3VwZWRDaHVuay5lbmRDaHVuayAqIHRoaXMuY2h1bmtTaXplLCB0aGlzLmxlbmd0aCk7CisgICAgICAgICAgICB0aGlzLnNlbmRSZXF1ZXN0KGJlZ2luLCBlbmQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgX2l0ZXJhdG9yMy5lKGVycik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgX2l0ZXJhdG9yMy5mKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGlmIChfdGhpczIuYWJvcnRlZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFN0cmVhbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN0cmVhbSgpIHsKKyAgICAgIHJldHVybiB0aGlzLnN0cmVhbTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZXF1ZXN0UmFuZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkgeworICAgICAgZW5kID0gTWF0aC5taW4oZW5kLCB0aGlzLmxlbmd0aCk7CisgICAgICB2YXIgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhiZWdpbik7CisgICAgICB2YXIgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKGVuZCk7CisgICAgICB2YXIgY2h1bmtzID0gW107CisKKyAgICAgIGZvciAodmFyIGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgeworICAgICAgICBjaHVua3MucHVzaChjaHVuayk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rcyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVxdWVzdFJhbmdlcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlcXVlc3RSYW5nZXMoKSB7CisgICAgICB2YXIgcmFuZ2VzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTsKKyAgICAgIHZhciBjaHVua3NUb1JlcXVlc3QgPSBbXTsKKworICAgICAgdmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyYW5nZXMpLAorICAgICAgICAgIF9zdGVwNDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgcmFuZ2UgPSBfc3RlcDQudmFsdWU7CisgICAgICAgICAgdmFyIGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsocmFuZ2UuYmVnaW4pOworICAgICAgICAgIHZhciBlbmRDaHVuayA9IHRoaXMuZ2V0RW5kQ2h1bmsocmFuZ2UuZW5kKTsKKworICAgICAgICAgIGZvciAodmFyIGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgeworICAgICAgICAgICAgaWYgKCFjaHVua3NUb1JlcXVlc3QuaW5jbHVkZXMoY2h1bmspKSB7CisgICAgICAgICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3I0LmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjQuZigpOworICAgICAgfQorCisgICAgICBjaHVua3NUb1JlcXVlc3Quc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgICByZXR1cm4gYSAtIGI7CisgICAgICB9KTsKKyAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rc1RvUmVxdWVzdCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ3JvdXBDaHVua3MiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBncm91cENodW5rcyhjaHVua3MpIHsKKyAgICAgIHZhciBncm91cGVkQ2h1bmtzID0gW107CisgICAgICB2YXIgYmVnaW5DaHVuayA9IC0xOworICAgICAgdmFyIHByZXZDaHVuayA9IC0xOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICB2YXIgY2h1bmsgPSBjaHVua3NbaV07CisKKyAgICAgICAgaWYgKGJlZ2luQ2h1bmsgPCAwKSB7CisgICAgICAgICAgYmVnaW5DaHVuayA9IGNodW5rOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZXZDaHVuayA+PSAwICYmIHByZXZDaHVuayArIDEgIT09IGNodW5rKSB7CisgICAgICAgICAgZ3JvdXBlZENodW5rcy5wdXNoKHsKKyAgICAgICAgICAgIGJlZ2luQ2h1bms6IGJlZ2luQ2h1bmssCisgICAgICAgICAgICBlbmRDaHVuazogcHJldkNodW5rICsgMQorICAgICAgICAgIH0pOworICAgICAgICAgIGJlZ2luQ2h1bmsgPSBjaHVuazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpICsgMSA9PT0gY2h1bmtzLmxlbmd0aCkgeworICAgICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7CisgICAgICAgICAgICBiZWdpbkNodW5rOiBiZWdpbkNodW5rLAorICAgICAgICAgICAgZW5kQ2h1bms6IGNodW5rICsgMQorICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcHJldkNodW5rID0gY2h1bms7CisgICAgICB9CisKKyAgICAgIHJldHVybiBncm91cGVkQ2h1bmtzOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uUHJvZ3Jlc3MiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvblByb2dyZXNzKGFyZ3MpIHsKKyAgICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKKyAgICAgICAgbG9hZGVkOiB0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgKiB0aGlzLmNodW5rU2l6ZSArIGFyZ3MubG9hZGVkLAorICAgICAgICB0b3RhbDogdGhpcy5sZW5ndGgKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9uUmVjZWl2ZURhdGEiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlY2VpdmVEYXRhKGFyZ3MpIHsKKyAgICAgIHZhciBjaHVuayA9IGFyZ3MuY2h1bms7CisgICAgICB2YXIgaXNQcm9ncmVzc2l2ZSA9IGFyZ3MuYmVnaW4gPT09IHVuZGVmaW5lZDsKKyAgICAgIHZhciBiZWdpbiA9IGlzUHJvZ3Jlc3NpdmUgPyB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA6IGFyZ3MuYmVnaW47CisgICAgICB2YXIgZW5kID0gYmVnaW4gKyBjaHVuay5ieXRlTGVuZ3RoOworICAgICAgdmFyIGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gdGhpcy5jaHVua1NpemUpOworICAgICAgdmFyIGVuZENodW5rID0gZW5kIDwgdGhpcy5sZW5ndGggPyBNYXRoLmZsb29yKGVuZCAvIHRoaXMuY2h1bmtTaXplKSA6IE1hdGguY2VpbChlbmQgLyB0aGlzLmNodW5rU2l6ZSk7CisKKyAgICAgIGlmIChpc1Byb2dyZXNzaXZlKSB7CisgICAgICAgIHRoaXMuc3RyZWFtLm9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YShjaHVuayk7CisgICAgICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gZW5kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlRGF0YShiZWdpbiwgY2h1bmspOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkKCkpIHsKKyAgICAgICAgdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5yZXNvbHZlKHRoaXMuc3RyZWFtKTsKKyAgICAgIH0KKworICAgICAgdmFyIGxvYWRlZFJlcXVlc3RzID0gW107CisKKyAgICAgIGZvciAodmFyIGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPCBlbmRDaHVuazsgKytjdXJDaHVuaykgeworICAgICAgICB2YXIgcmVxdWVzdElkcyA9IHRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoY3VyQ2h1bmspOworCisgICAgICAgIGlmICghcmVxdWVzdElkcykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rWyJkZWxldGUiXShjdXJDaHVuayk7CisKKyAgICAgICAgdmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyZXF1ZXN0SWRzKSwKKyAgICAgICAgICAgIF9zdGVwNTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNS5zKCk7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICB2YXIgcmVxdWVzdElkID0gX3N0ZXA1LnZhbHVlOworCisgICAgICAgICAgICB2YXIgY2h1bmtzTmVlZGVkID0gdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0LmdldChyZXF1ZXN0SWQpOworCisgICAgICAgICAgICBpZiAoY2h1bmtzTmVlZGVkLmhhcyhjdXJDaHVuaykpIHsKKyAgICAgICAgICAgICAgY2h1bmtzTmVlZGVkWyJkZWxldGUiXShjdXJDaHVuayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaHVua3NOZWVkZWQuc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvYWRlZFJlcXVlc3RzLnB1c2gocmVxdWVzdElkKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIF9pdGVyYXRvcjUuZShlcnIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIF9pdGVyYXRvcjUuZigpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghdGhpcy5kaXNhYmxlQXV0b0ZldGNoICYmIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zaXplID09PSAwKSB7CisgICAgICAgIHZhciBuZXh0RW1wdHlDaHVuazsKKworICAgICAgICBpZiAodGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkID09PSAxKSB7CisgICAgICAgICAgdmFyIGxhc3RDaHVuayA9IHRoaXMuc3RyZWFtLm51bUNodW5rcyAtIDE7CisKKyAgICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHsKKyAgICAgICAgICAgIG5leHRFbXB0eUNodW5rID0gbGFzdENodW5rOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXh0RW1wdHlDaHVuayA9IHRoaXMuc3RyZWFtLm5leHRFbXB0eUNodW5rKGVuZENodW5rKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG5leHRFbXB0eUNodW5rKSkgeworICAgICAgICAgIHRoaXMuX3JlcXVlc3RDaHVua3MoW25leHRFbXB0eUNodW5rXSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgX2kgPSAwLCBfbG9hZGVkUmVxdWVzdHMgPSBsb2FkZWRSZXF1ZXN0czsgX2kgPCBfbG9hZGVkUmVxdWVzdHMubGVuZ3RoOyBfaSsrKSB7CisgICAgICAgIHZhciBfcmVxdWVzdElkID0gX2xvYWRlZFJlcXVlc3RzW19pXTsKKworICAgICAgICB2YXIgY2FwYWJpbGl0eSA9IHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmdldChfcmVxdWVzdElkKTsKKworICAgICAgICB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdFsiZGVsZXRlIl0oX3JlcXVlc3RJZCk7CisKKyAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKKyAgICAgICAgbG9hZGVkOiB0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgKiB0aGlzLmNodW5rU2l6ZSwKKyAgICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvbkVycm9yIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb25FcnJvcihlcnIpIHsKKyAgICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0QmVnaW5DaHVuayIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJlZ2luQ2h1bmsoYmVnaW4pIHsKKyAgICAgIHJldHVybiBNYXRoLmZsb29yKGJlZ2luIC8gdGhpcy5jaHVua1NpemUpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEVuZENodW5rIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RW5kQ2h1bmsoZW5kKSB7CisgICAgICByZXR1cm4gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyB0aGlzLmNodW5rU2l6ZSkgKyAxOworICAgIH0KKyAgfSwgeworICAgIGtleTogImFib3J0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYWJvcnQocmVhc29uKSB7CisgICAgICB0aGlzLmFib3J0ZWQgPSB0cnVlOworCisgICAgICBpZiAodGhpcy5wZGZOZXR3b3JrU3RyZWFtKSB7CisgICAgICAgIHRoaXMucGRmTmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pOworICAgICAgfQorCisgICAgICB2YXIgX2l0ZXJhdG9yNiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LnZhbHVlcygpKSwKKyAgICAgICAgICBfc3RlcDY7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoX2l0ZXJhdG9yNi5zKCk7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgdmFyIGNhcGFiaWxpdHkgPSBfc3RlcDYudmFsdWU7CisgICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvcjYuZShlcnIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgX2l0ZXJhdG9yNi5mKCk7CisgICAgICB9CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIENodW5rZWRTdHJlYW1NYW5hZ2VyOworfSgpOworCitleHBvcnRzLkNodW5rZWRTdHJlYW1NYW5hZ2VyID0gQ2h1bmtlZFN0cmVhbU1hbmFnZXI7CisKKy8qKiovIH0pLAorLyogMjA1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5ID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5OworZXhwb3J0cy5nZXRJbmhlcml0YWJsZVByb3BlcnR5ID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTsKK2V4cG9ydHMudG9Sb21hbk51bWVyYWxzID0gdG9Sb21hbk51bWVyYWxzOworZXhwb3J0cy5sb2cyID0gbG9nMjsKK2V4cG9ydHMucmVhZEludDggPSByZWFkSW50ODsKK2V4cG9ydHMucmVhZFVpbnQxNiA9IHJlYWRVaW50MTY7CitleHBvcnRzLnJlYWRVaW50MzIgPSByZWFkVWludDMyOworZXhwb3J0cy5pc1doaXRlU3BhY2UgPSBpc1doaXRlU3BhY2U7CitleHBvcnRzLlhSZWZQYXJzZUV4Y2VwdGlvbiA9IGV4cG9ydHMuWFJlZkVudHJ5RXhjZXB0aW9uID0gZXhwb3J0cy5NaXNzaW5nRGF0YUV4Y2VwdGlvbiA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK2Z1bmN0aW9uIGdldExvb2t1cFRhYmxlRmFjdG9yeShpbml0aWFsaXplcikgeworICB2YXIgbG9va3VwOworICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIGlmIChpbml0aWFsaXplcikgeworICAgICAgbG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIGluaXRpYWxpemVyKGxvb2t1cCk7CisgICAgICBpbml0aWFsaXplciA9IG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIGxvb2t1cDsKKyAgfTsKK30KKwordmFyIE1pc3NpbmdEYXRhRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbikgeworICBfaW5oZXJpdHMoTWlzc2luZ0RhdGFFeGNlcHRpb24sIF9CYXNlRXhjZXB0aW9uKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE1pc3NpbmdEYXRhRXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBNaXNzaW5nRGF0YUV4Y2VwdGlvbihiZWdpbiwgZW5kKSB7CisgICAgdmFyIF90aGlzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1pc3NpbmdEYXRhRXhjZXB0aW9uKTsKKworICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgIk1pc3NpbmcgZGF0YSBbIi5jb25jYXQoYmVnaW4sICIsICIpLmNvbmNhdChlbmQsICIpIikpOworICAgIF90aGlzLmJlZ2luID0gYmVnaW47CisgICAgX3RoaXMuZW5kID0gZW5kOworICAgIHJldHVybiBfdGhpczsKKyAgfQorCisgIHJldHVybiBNaXNzaW5nRGF0YUV4Y2VwdGlvbjsKK30oX3V0aWwuQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuTWlzc2luZ0RhdGFFeGNlcHRpb24gPSBNaXNzaW5nRGF0YUV4Y2VwdGlvbjsKKwordmFyIFhSZWZFbnRyeUV4Y2VwdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24yKSB7CisgIF9pbmhlcml0cyhYUmVmRW50cnlFeGNlcHRpb24sIF9CYXNlRXhjZXB0aW9uMik7CisKKyAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoWFJlZkVudHJ5RXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBYUmVmRW50cnlFeGNlcHRpb24oKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFhSZWZFbnRyeUV4Y2VwdGlvbik7CisKKyAgICByZXR1cm4gX3N1cGVyMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9CisKKyAgcmV0dXJuIFhSZWZFbnRyeUV4Y2VwdGlvbjsKK30oX3V0aWwuQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuWFJlZkVudHJ5RXhjZXB0aW9uID0gWFJlZkVudHJ5RXhjZXB0aW9uOworCit2YXIgWFJlZlBhcnNlRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjMpIHsKKyAgX2luaGVyaXRzKFhSZWZQYXJzZUV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24zKTsKKworICB2YXIgX3N1cGVyMyA9IF9jcmVhdGVTdXBlcihYUmVmUGFyc2VFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIFhSZWZQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWFJlZlBhcnNlRXhjZXB0aW9uKTsKKworICAgIHJldHVybiBfc3VwZXIzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICByZXR1cm4gWFJlZlBhcnNlRXhjZXB0aW9uOworfShfdXRpbC5CYXNlRXhjZXB0aW9uKTsKKworZXhwb3J0cy5YUmVmUGFyc2VFeGNlcHRpb24gPSBYUmVmUGFyc2VFeGNlcHRpb247CisKK2Z1bmN0aW9uIGdldEluaGVyaXRhYmxlUHJvcGVydHkoX3JlZikgeworICB2YXIgZGljdCA9IF9yZWYuZGljdCwKKyAgICAgIGtleSA9IF9yZWYua2V5LAorICAgICAgX3JlZiRnZXRBcnJheSA9IF9yZWYuZ2V0QXJyYXksCisgICAgICBnZXRBcnJheSA9IF9yZWYkZ2V0QXJyYXkgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRnZXRBcnJheSwKKyAgICAgIF9yZWYkc3RvcFdoZW5Gb3VuZCA9IF9yZWYuc3RvcFdoZW5Gb3VuZCwKKyAgICAgIHN0b3BXaGVuRm91bmQgPSBfcmVmJHN0b3BXaGVuRm91bmQgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJHN0b3BXaGVuRm91bmQ7CisgIHZhciBMT09QX0xJTUlUID0gMTAwOworICB2YXIgbG9vcENvdW50ID0gMDsKKyAgdmFyIHZhbHVlczsKKworICB3aGlsZSAoZGljdCkgeworICAgIHZhciB2YWx1ZSA9IGdldEFycmF5ID8gZGljdC5nZXRBcnJheShrZXkpIDogZGljdC5nZXQoa2V5KTsKKworICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBpZiAoc3RvcFdoZW5Gb3VuZCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlmICghdmFsdWVzKSB7CisgICAgICAgIHZhbHVlcyA9IFtdOworICAgICAgfQorCisgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CisgICAgfQorCisgICAgaWYgKCsrbG9vcENvdW50ID4gTE9PUF9MSU1JVCkgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJnZXRJbmhlcml0YWJsZVByb3BlcnR5OiBtYXhpbXVtIGxvb3AgY291bnQgZXhjZWVkZWQgZm9yIFwiIi5jb25jYXQoa2V5LCAiXCIiKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkaWN0ID0gZGljdC5nZXQoIlBhcmVudCIpOworICB9CisKKyAgcmV0dXJuIHZhbHVlczsKK30KKwordmFyIFJPTUFOX05VTUJFUl9NQVAgPSBbIiIsICJDIiwgIkNDIiwgIkNDQyIsICJDRCIsICJEIiwgIkRDIiwgIkRDQyIsICJEQ0NDIiwgIkNNIiwgIiIsICJYIiwgIlhYIiwgIlhYWCIsICJYTCIsICJMIiwgIkxYIiwgIkxYWCIsICJMWFhYIiwgIlhDIiwgIiIsICJJIiwgIklJIiwgIklJSSIsICJJViIsICJWIiwgIlZJIiwgIlZJSSIsICJWSUlJIiwgIklYIl07CisKK2Z1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhudW1iZXIpIHsKKyAgdmFyIGxvd2VyQ2FzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisgICgwLCBfdXRpbC5hc3NlcnQpKE51bWJlci5pc0ludGVnZXIobnVtYmVyKSAmJiBudW1iZXIgPiAwLCAiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOworICB2YXIgcm9tYW5CdWYgPSBbXTsKKyAgdmFyIHBvczsKKworICB3aGlsZSAobnVtYmVyID49IDEwMDApIHsKKyAgICBudW1iZXIgLT0gMTAwMDsKKyAgICByb21hbkJ1Zi5wdXNoKCJNIik7CisgIH0KKworICBwb3MgPSBudW1iZXIgLyAxMDAgfCAwOworICBudW1iZXIgJT0gMTAwOworICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbcG9zXSk7CisgIHBvcyA9IG51bWJlciAvIDEwIHwgMDsKKyAgbnVtYmVyICU9IDEwOworICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbMTAgKyBwb3NdKTsKKyAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyXSk7CisgIHZhciByb21hblN0ciA9IHJvbWFuQnVmLmpvaW4oIiIpOworICByZXR1cm4gbG93ZXJDYXNlID8gcm9tYW5TdHIudG9Mb3dlckNhc2UoKSA6IHJvbWFuU3RyOworfQorCitmdW5jdGlvbiBsb2cyKHgpIHsKKyAgaWYgKHggPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZzIoeCkpOworfQorCitmdW5jdGlvbiByZWFkSW50OChkYXRhLCBvZmZzZXQpIHsKKyAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCAyNCA+PiAyNDsKK30KKworZnVuY3Rpb24gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpIHsKKyAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAxXTsKK30KKworZnVuY3Rpb24gcmVhZFVpbnQzMihkYXRhLCBvZmZzZXQpIHsKKyAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXSkgPj4+IDA7Cit9CisKK2Z1bmN0aW9uIGlzV2hpdGVTcGFjZShjaCkgeworICByZXR1cm4gY2ggPT09IDB4MjAgfHwgY2ggPT09IDB4MDkgfHwgY2ggPT09IDB4MGQgfHwgY2ggPT09IDB4MGE7Cit9CisKKy8qKiovIH0pLAorLyogMjA2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGRG9jdW1lbnQgPSBleHBvcnRzLlBhZ2UgPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oMikpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX29iaiA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA3KTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDIpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK3ZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDkpOworCit2YXIgX2Fubm90YXRpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyMik7CisKK3ZhciBfY3J5cHRvID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTkpOworCit2YXIgX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA4KTsKKwordmFyIF9vcGVyYXRvcl9saXN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjMpOworCit2YXIgX2V2YWx1YXRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjI1KTsKKworZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH0KKworZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfQorCitmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbInJldHVybiJdICE9IG51bGwpIF9pWyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0KKworZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJ1bmRlZmluZWQiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyB0aHJvdyBfZTI7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UzKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMzsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIERFRkFVTFRfVVNFUl9VTklUID0gMS4wOwordmFyIExFVFRFUl9TSVpFX01FRElBQk9YID0gWzAsIDAsIDYxMiwgNzkyXTsKKworZnVuY3Rpb24gaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uLCBpbnRlbnQpIHsKKyAgcmV0dXJuIGludGVudCA9PT0gImRpc3BsYXkiICYmIGFubm90YXRpb24udmlld2FibGUgfHwgaW50ZW50ID09PSAicHJpbnQiICYmIGFubm90YXRpb24ucHJpbnRhYmxlOworfQorCit2YXIgUGFnZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBhZ2UoX3JlZikgeworICAgIHZhciBwZGZNYW5hZ2VyID0gX3JlZi5wZGZNYW5hZ2VyLAorICAgICAgICB4cmVmID0gX3JlZi54cmVmLAorICAgICAgICBwYWdlSW5kZXggPSBfcmVmLnBhZ2VJbmRleCwKKyAgICAgICAgcGFnZURpY3QgPSBfcmVmLnBhZ2VEaWN0LAorICAgICAgICByZWYgPSBfcmVmLnJlZiwKKyAgICAgICAgZ2xvYmFsSWRGYWN0b3J5ID0gX3JlZi5nbG9iYWxJZEZhY3RvcnksCisgICAgICAgIGZvbnRDYWNoZSA9IF9yZWYuZm9udENhY2hlLAorICAgICAgICBidWlsdEluQ01hcENhY2hlID0gX3JlZi5idWlsdEluQ01hcENhY2hlLAorICAgICAgICBnbG9iYWxJbWFnZUNhY2hlID0gX3JlZi5nbG9iYWxJbWFnZUNhY2hlOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhZ2UpOworCisgICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKKyAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKKyAgICB0aGlzLnBhZ2VEaWN0ID0gcGFnZURpY3Q7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLnJlZiA9IHJlZjsKKyAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKKyAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBidWlsdEluQ01hcENhY2hlOworICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IGdsb2JhbEltYWdlQ2FjaGU7CisgICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zOworICAgIHRoaXMucmVzb3VyY2VzUHJvbWlzZSA9IG51bGw7CisgICAgdmFyIGlkQ291bnRlcnMgPSB7CisgICAgICBvYmo6IDAKKyAgICB9OworCisgICAgdGhpcy5fbG9jYWxJZEZhY3RvcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9nbG9iYWxJZEZhY3RvcnkpIHsKKyAgICAgIF9pbmhlcml0cyhfY2xhc3MsIF9nbG9iYWxJZEZhY3RvcnkpOworCisgICAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKF9jbGFzcyk7CisKKyAgICAgIGZ1bmN0aW9uIF9jbGFzcygpIHsKKyAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIF9jbGFzcyk7CisKKyAgICAgICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICBfY3JlYXRlQ2xhc3MoX2NsYXNzLCBudWxsLCBbeworICAgICAgICBrZXk6ICJjcmVhdGVPYmpJZCIsCisgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVPYmpJZCgpIHsKKyAgICAgICAgICByZXR1cm4gInAiLmNvbmNhdChwYWdlSW5kZXgsICJfIikuY29uY2F0KCsraWRDb3VudGVycy5vYmopOworICAgICAgICB9CisgICAgICB9XSk7CisKKyAgICAgIHJldHVybiBfY2xhc3M7CisgICAgfShnbG9iYWxJZEZhY3RvcnkpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBhZ2UsIFt7CisgICAga2V5OiAiX2dldEluaGVyaXRhYmxlUHJvcGVydHkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShrZXkpIHsKKyAgICAgIHZhciBnZXRBcnJheSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisgICAgICB2YXIgdmFsdWUgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgICBkaWN0OiB0aGlzLnBhZ2VEaWN0LAorICAgICAgICBrZXk6IGtleSwKKyAgICAgICAgZ2V0QXJyYXk6IGdldEFycmF5LAorICAgICAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQorICAgICAgfSk7CisKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorCisgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAxIHx8ICEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh2YWx1ZVswXSkpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlWzBdOworICAgICAgfQorCisgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuRGljdC5tZXJnZSh7CisgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgICAgZGljdEFycmF5OiB2YWx1ZQorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2dldEJvdW5kaW5nQm94IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2dldEJvdW5kaW5nQm94KG5hbWUpIHsKKyAgICAgIHZhciBib3ggPSB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KG5hbWUsIHRydWUpOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShib3gpICYmIGJveC5sZW5ndGggPT09IDQpIHsKKyAgICAgICAgaWYgKGJveFsyXSAtIGJveFswXSAhPT0gMCAmJiBib3hbM10gLSBib3hbMV0gIT09IDApIHsKKyAgICAgICAgICByZXR1cm4gYm94OworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJFbXB0eSAvIi5jb25jYXQobmFtZSwgIiBlbnRyeS4iKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldENvbnRlbnRTdHJlYW0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb250ZW50U3RyZWFtKCkgeworICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7CisgICAgICB2YXIgc3RyZWFtOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkgeworICAgICAgICB2YXIgeHJlZiA9IHRoaXMueHJlZjsKKyAgICAgICAgdmFyIHN0cmVhbXMgPSBbXTsKKworICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY29udGVudCksCisgICAgICAgICAgICBfc3RlcDsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICB2YXIgc3ViU3RyZWFtID0gX3N0ZXAudmFsdWU7CisgICAgICAgICAgICBzdHJlYW1zLnB1c2goeHJlZi5mZXRjaElmUmVmKHN1YlN0cmVhbSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3IuZigpOworICAgICAgICB9CisKKyAgICAgICAgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyZWFtc1NlcXVlbmNlU3RyZWFtKHN0cmVhbXMpOworICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGNvbnRlbnQpKSB7CisgICAgICAgIHN0cmVhbSA9IGNvbnRlbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0gPSBuZXcgX3N0cmVhbS5OdWxsU3RyZWFtKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBzdHJlYW07CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2F2ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNhdmUoaGFuZGxlciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICAgIHZhciBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IF9ldmFsdWF0b3IuUGFydGlhbEV2YWx1YXRvcih7CisgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgICAgaGFuZGxlcjogaGFuZGxlciwKKyAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKKyAgICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKKyAgICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKKyAgICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAorICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCisgICAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucworICAgICAgfSk7CisgICAgICByZXR1cm4gdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdmFyIG5ld1JlZnNQcm9taXNlcyA9IFtdOworCisgICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYW5ub3RhdGlvbnMpLAorICAgICAgICAgICAgX3N0ZXAyOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uID0gX3N0ZXAyLnZhbHVlOworCisgICAgICAgICAgICBpZiAoIWlzQW5ub3RhdGlvblJlbmRlcmFibGUoYW5ub3RhdGlvbiwgInByaW50IikpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ld1JlZnNQcm9taXNlcy5wdXNoKGFubm90YXRpb24uc2F2ZShwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSlbImNhdGNoIl0oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoInNhdmUgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyAiXCIiLmNvbmNhdCh0YXNrLm5hbWUsICJcIiB0YXNrOiBcIiIpLmNvbmNhdChyZWFzb24sICJcIi4iKSk7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgX2l0ZXJhdG9yMi5mKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmV3UmVmc1Byb21pc2VzKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImxvYWRSZXNvdXJjZXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkUmVzb3VyY2VzKGtleXMpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIGlmICghdGhpcy5yZXNvdXJjZXNQcm9taXNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywgInJlc291cmNlcyIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXNQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgb2JqZWN0TG9hZGVyID0gbmV3IF9vYmouT2JqZWN0TG9hZGVyKF90aGlzLnJlc291cmNlcywga2V5cywgX3RoaXMueHJlZik7CisgICAgICAgIHJldHVybiBvYmplY3RMb2FkZXIubG9hZCgpOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0T3BlcmF0b3JMaXN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3BlcmF0b3JMaXN0KF9yZWYyKSB7CisgICAgICB2YXIgX3RoaXMyID0gdGhpczsKKworICAgICAgdmFyIGhhbmRsZXIgPSBfcmVmMi5oYW5kbGVyLAorICAgICAgICAgIHNpbmsgPSBfcmVmMi5zaW5rLAorICAgICAgICAgIHRhc2sgPSBfcmVmMi50YXNrLAorICAgICAgICAgIGludGVudCA9IF9yZWYyLmludGVudCwKKyAgICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gX3JlZjIucmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZSA9IF9yZWYyLmFubm90YXRpb25TdG9yYWdlOworICAgICAgdmFyIGNvbnRlbnRTdHJlYW1Qcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiZ2V0Q29udGVudFN0cmVhbSIpOworICAgICAgdmFyIHJlc291cmNlc1Byb21pc2UgPSB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCAiQ29sb3JTcGFjZSIsICJQYXR0ZXJuIiwgIlNoYWRpbmciLCAiWE9iamVjdCIsICJGb250Il0pOworICAgICAgdmFyIHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgX2V2YWx1YXRvci5QYXJ0aWFsRXZhbHVhdG9yKHsKKyAgICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLAorICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAorICAgICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAorICAgICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAorICAgICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCisgICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKKyAgICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCisgICAgICB9KTsKKyAgICAgIHZhciBkYXRhUHJvbWlzZXMgPSBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2VdKTsKKyAgICAgIHZhciBwYWdlTGlzdFByb21pc2UgPSBkYXRhUHJvbWlzZXMudGhlbihmdW5jdGlvbiAoX3JlZjMpIHsKKyAgICAgICAgdmFyIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDEpLAorICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IF9yZWY0WzBdOworCisgICAgICAgIHZhciBvcExpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KGludGVudCwgc2luayk7CisgICAgICAgIGhhbmRsZXIuc2VuZCgiU3RhcnRSZW5kZXJQYWdlIiwgeworICAgICAgICAgIHRyYW5zcGFyZW5jeTogcGFydGlhbEV2YWx1YXRvci5oYXNCbGVuZE1vZGVzKF90aGlzMi5yZXNvdXJjZXMpLAorICAgICAgICAgIHBhZ2VJbmRleDogX3RoaXMyLnBhZ2VJbmRleCwKKyAgICAgICAgICBpbnRlbnQ6IGludGVudAorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgICBzdHJlYW06IGNvbnRlbnRTdHJlYW0sCisgICAgICAgICAgdGFzazogdGFzaywKKyAgICAgICAgICByZXNvdXJjZXM6IF90aGlzMi5yZXNvdXJjZXMsCisgICAgICAgICAgb3BlcmF0b3JMaXN0OiBvcExpc3QKKyAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuIG9wTGlzdDsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiBQcm9taXNlLmFsbChbcGFnZUxpc3RQcm9taXNlLCB0aGlzLl9wYXJzZWRBbm5vdGF0aW9uc10pLnRoZW4oZnVuY3Rpb24gKF9yZWY1KSB7CisgICAgICAgIHZhciBfcmVmNiA9IF9zbGljZWRUb0FycmF5KF9yZWY1LCAyKSwKKyAgICAgICAgICAgIHBhZ2VPcExpc3QgPSBfcmVmNlswXSwKKyAgICAgICAgICAgIGFubm90YXRpb25zID0gX3JlZjZbMV07CisKKyAgICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIHBhZ2VPcExpc3QuZmx1c2godHJ1ZSk7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIGxlbmd0aDogcGFnZU9wTGlzdC50b3RhbExlbmd0aAorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICB2YXIgb3BMaXN0UHJvbWlzZXMgPSBbXTsKKworICAgICAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGFubm90YXRpb25zKSwKKyAgICAgICAgICAgIF9zdGVwMzsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbiA9IF9zdGVwMy52YWx1ZTsKKworICAgICAgICAgICAgaWYgKGlzQW5ub3RhdGlvblJlbmRlcmFibGUoYW5ub3RhdGlvbiwgaW50ZW50KSkgeworICAgICAgICAgICAgICBvcExpc3RQcm9taXNlcy5wdXNoKGFubm90YXRpb24uZ2V0T3BlcmF0b3JMaXN0KHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIHJlbmRlckludGVyYWN0aXZlRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyAiXCIiLmNvbmNhdCh0YXNrLm5hbWUsICJcIiB0YXNrOiBcIiIpLmNvbmNhdChyZWFzb24sICJcIi4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIF9pdGVyYXRvcjMuZShlcnIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIF9pdGVyYXRvcjMuZigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wTGlzdFByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChvcExpc3RzKSB7CisgICAgICAgICAgcGFnZU9wTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9ucywgW10pOworCisgICAgICAgICAgdmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvcExpc3RzKSwKKyAgICAgICAgICAgICAgX3N0ZXA0OworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNC5zKCk7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICAgIHZhciBvcExpc3QgPSBfc3RlcDQudmFsdWU7CisgICAgICAgICAgICAgIHBhZ2VPcExpc3QuYWRkT3BMaXN0KG9wTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgICBfaXRlcmF0b3I0LmUoZXJyKTsKKyAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2l0ZXJhdG9yNC5mKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcGFnZU9wTGlzdC5hZGRPcChfdXRpbC5PUFMuZW5kQW5ub3RhdGlvbnMsIFtdKTsKKyAgICAgICAgICBwYWdlT3BMaXN0LmZsdXNoKHRydWUpOworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGgKKyAgICAgICAgICB9OworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImV4dHJhY3RUZXh0Q29udGVudCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGV4dHJhY3RUZXh0Q29udGVudChfcmVmNykgeworICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CisKKyAgICAgIHZhciBoYW5kbGVyID0gX3JlZjcuaGFuZGxlciwKKyAgICAgICAgICB0YXNrID0gX3JlZjcudGFzaywKKyAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlID0gX3JlZjcubm9ybWFsaXplV2hpdGVzcGFjZSwKKyAgICAgICAgICBzaW5rID0gX3JlZjcuc2luaywKKyAgICAgICAgICBjb21iaW5lVGV4dEl0ZW1zID0gX3JlZjcuY29tYmluZVRleHRJdGVtczsKKyAgICAgIHZhciBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywgImdldENvbnRlbnRTdHJlYW0iKTsKKyAgICAgIHZhciByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIlhPYmplY3QiLCAiRm9udCJdKTsKKyAgICAgIHZhciBkYXRhUHJvbWlzZXMgPSBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2VdKTsKKyAgICAgIHJldHVybiBkYXRhUHJvbWlzZXMudGhlbihmdW5jdGlvbiAoX3JlZjgpIHsKKyAgICAgICAgdmFyIF9yZWY5ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjgsIDEpLAorICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IF9yZWY5WzBdOworCisgICAgICAgIHZhciBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IF9ldmFsdWF0b3IuUGFydGlhbEV2YWx1YXRvcih7CisgICAgICAgICAgeHJlZjogX3RoaXMzLnhyZWYsCisgICAgICAgICAgaGFuZGxlcjogaGFuZGxlciwKKyAgICAgICAgICBwYWdlSW5kZXg6IF90aGlzMy5wYWdlSW5kZXgsCisgICAgICAgICAgaWRGYWN0b3J5OiBfdGhpczMuX2xvY2FsSWRGYWN0b3J5LAorICAgICAgICAgIGZvbnRDYWNoZTogX3RoaXMzLmZvbnRDYWNoZSwKKyAgICAgICAgICBidWlsdEluQ01hcENhY2hlOiBfdGhpczMuYnVpbHRJbkNNYXBDYWNoZSwKKyAgICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiBfdGhpczMuZ2xvYmFsSW1hZ2VDYWNoZSwKKyAgICAgICAgICBvcHRpb25zOiBfdGhpczMuZXZhbHVhdG9yT3B0aW9ucworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoeworICAgICAgICAgIHN0cmVhbTogY29udGVudFN0cmVhbSwKKyAgICAgICAgICB0YXNrOiB0YXNrLAorICAgICAgICAgIHJlc291cmNlczogX3RoaXMzLnJlc291cmNlcywKKyAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiBub3JtYWxpemVXaGl0ZXNwYWNlLAorICAgICAgICAgIGNvbWJpbmVUZXh0SXRlbXM6IGNvbWJpbmVUZXh0SXRlbXMsCisgICAgICAgICAgc2luazogc2luaworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEFubm90YXRpb25zRGF0YSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFubm90YXRpb25zRGF0YShpbnRlbnQpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucy50aGVuKGZ1bmN0aW9uIChhbm5vdGF0aW9ucykgeworICAgICAgICB2YXIgYW5ub3RhdGlvbnNEYXRhID0gW107CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGlmICghaW50ZW50IHx8IGlzQW5ub3RhdGlvblJlbmRlcmFibGUoYW5ub3RhdGlvbnNbaV0sIGludGVudCkpIHsKKyAgICAgICAgICAgIGFubm90YXRpb25zRGF0YS5wdXNoKGFubm90YXRpb25zW2ldLmRhdGEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uc0RhdGE7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjb250ZW50IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnBhZ2VEaWN0LmdldCgiQ29udGVudHMiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZXNvdXJjZXMiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJyZXNvdXJjZXMiLCB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJSZXNvdXJjZXMiKSB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJtZWRpYUJveCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm1lZGlhQm94IiwgdGhpcy5fZ2V0Qm91bmRpbmdCb3goIk1lZGlhQm94IikgfHwgTEVUVEVSX1NJWkVfTUVESUFCT1gpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNyb3BCb3giLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjcm9wQm94IiwgdGhpcy5fZ2V0Qm91bmRpbmdCb3goIkNyb3BCb3giKSB8fCB0aGlzLm1lZGlhQm94KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ1c2VyVW5pdCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5wYWdlRGljdC5nZXQoIlVzZXJVbml0Iik7CisKKyAgICAgIGlmICghKDAsIF91dGlsLmlzTnVtKShvYmopIHx8IG9iaiA8PSAwKSB7CisgICAgICAgIG9iaiA9IERFRkFVTFRfVVNFUl9VTklUOworICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInVzZXJVbml0Iiwgb2JqKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ2aWV3IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBjcm9wQm94ID0gdGhpcy5jcm9wQm94LAorICAgICAgICAgIG1lZGlhQm94ID0gdGhpcy5tZWRpYUJveDsKKyAgICAgIHZhciB2aWV3OworCisgICAgICBpZiAoY3JvcEJveCA9PT0gbWVkaWFCb3ggfHwgKDAsIF91dGlsLmlzQXJyYXlFcXVhbCkoY3JvcEJveCwgbWVkaWFCb3gpKSB7CisgICAgICAgIHZpZXcgPSBtZWRpYUJveDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBib3ggPSBfdXRpbC5VdGlsLmludGVyc2VjdChjcm9wQm94LCBtZWRpYUJveCk7CisKKyAgICAgICAgaWYgKGJveCAmJiBib3hbMl0gLSBib3hbMF0gIT09IDAgJiYgYm94WzNdIC0gYm94WzFdICE9PSAwKSB7CisgICAgICAgICAgdmlldyA9IGJveDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkVtcHR5IC9Dcm9wQm94IGFuZCAvTWVkaWFCb3ggaW50ZXJzZWN0aW9uLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidmlldyIsIHZpZXcgfHwgbWVkaWFCb3gpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJvdGF0ZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgcm90YXRlID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiUm90YXRlIikgfHwgMDsKKworICAgICAgaWYgKHJvdGF0ZSAlIDkwICE9PSAwKSB7CisgICAgICAgIHJvdGF0ZSA9IDA7CisgICAgICB9IGVsc2UgaWYgKHJvdGF0ZSA+PSAzNjApIHsKKyAgICAgICAgcm90YXRlID0gcm90YXRlICUgMzYwOworICAgICAgfSBlbHNlIGlmIChyb3RhdGUgPCAwKSB7CisgICAgICAgIHJvdGF0ZSA9IChyb3RhdGUgJSAzNjAgKyAzNjApICUgMzYwOworICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInJvdGF0ZSIsIHJvdGF0ZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYW5ub3RhdGlvbnMiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJhbm5vdGF0aW9ucyIsIHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIkFubm90cyIpIHx8IFtdKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcGFyc2VkQW5ub3RhdGlvbnMiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CisKKyAgICAgIHZhciBwYXJzZWRBbm5vdGF0aW9ucyA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywgImFubm90YXRpb25zIikudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBhbm5vdGF0aW9uUHJvbWlzZXMgPSBbXTsKKworICAgICAgICB2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKF90aGlzNC5hbm5vdGF0aW9ucyksCisgICAgICAgICAgICBfc3RlcDU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmb3IgKF9pdGVyYXRvcjUucygpOyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUubigpKS5kb25lOykgeworICAgICAgICAgICAgdmFyIGFubm90YXRpb25SZWYgPSBfc3RlcDUudmFsdWU7CisgICAgICAgICAgICBhbm5vdGF0aW9uUHJvbWlzZXMucHVzaChfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoX3RoaXM0LnhyZWYsIGFubm90YXRpb25SZWYsIF90aGlzNC5wZGZNYW5hZ2VyLCBfdGhpczQuX2xvY2FsSWRGYWN0b3J5KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiX3BhcnNlZEFubm90YXRpb25zOiBcIiIuY29uY2F0KHJlYXNvbiwgIlwiLiIpKTsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3I1LmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3I1LmYoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChhbm5vdGF0aW9uUHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGFubm90YXRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25zLmZpbHRlcihmdW5jdGlvbiAoYW5ub3RhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICEhYW5ub3RhdGlvbjsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiX3BhcnNlZEFubm90YXRpb25zIiwgcGFyc2VkQW5ub3RhdGlvbnMpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQYWdlOworfSgpOworCitleHBvcnRzLlBhZ2UgPSBQYWdlOwordmFyIFBERl9IRUFERVJfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4MjUsIDB4NTAsIDB4NDQsIDB4NDYsIDB4MmRdKTsKK3ZhciBTVEFSVFhSRUZfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4NzQsIDB4NzgsIDB4NzIsIDB4NjUsIDB4NjZdKTsKK3ZhciBFTkRPQkpfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NmUsIDB4NjQsIDB4NmYsIDB4NjIsIDB4NmFdKTsKK3ZhciBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyA9IDEwMjQ7Cit2YXIgRU1QVFlfRklOR0VSUFJJTlQgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCI7Cit2YXIgUERGX0hFQURFUl9WRVJTSU9OX1JFR0VYUCA9IC9eWzEtOV1cLlswLTldJC87CisKK2Z1bmN0aW9uIGZpbmQoc3RyZWFtLCBzaWduYXR1cmUpIHsKKyAgdmFyIGxpbWl0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxMDI0OworICB2YXIgYmFja3dhcmRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTsKKyAgdmFyIHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CisgIHZhciBzY2FuQnl0ZXMgPSBzdHJlYW0ucGVla0J5dGVzKGxpbWl0KTsKKyAgdmFyIHNjYW5MZW5ndGggPSBzY2FuQnl0ZXMubGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOworCisgIGlmIChzY2FuTGVuZ3RoIDw9IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoYmFja3dhcmRzKSB7CisgICAgdmFyIHNpZ25hdHVyZUVuZCA9IHNpZ25hdHVyZUxlbmd0aCAtIDE7CisgICAgdmFyIHBvcyA9IHNjYW5CeXRlcy5sZW5ndGggLSAxOworCisgICAgd2hpbGUgKHBvcyA+PSBzaWduYXR1cmVFbmQpIHsKKyAgICAgIHZhciBqID0gMDsKKworICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyAtIGpdID09PSBzaWduYXR1cmVbc2lnbmF0dXJlRW5kIC0gal0pIHsKKyAgICAgICAgaisrOworICAgICAgfQorCisgICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKKyAgICAgICAgc3RyZWFtLnBvcyArPSBwb3MgLSBzaWduYXR1cmVFbmQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBwb3MtLTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdmFyIF9wb3MgPSAwOworCisgICAgd2hpbGUgKF9wb3MgPD0gc2Nhbkxlbmd0aCkgeworICAgICAgdmFyIF9qID0gMDsKKworICAgICAgd2hpbGUgKF9qIDwgc2lnbmF0dXJlTGVuZ3RoICYmIHNjYW5CeXRlc1tfcG9zICsgX2pdID09PSBzaWduYXR1cmVbX2pdKSB7CisgICAgICAgIF9qKys7CisgICAgICB9CisKKyAgICAgIGlmIChfaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKKyAgICAgICAgc3RyZWFtLnBvcyArPSBfcG9zOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgX3BvcysrOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKwordmFyIFBERkRvY3VtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGRG9jdW1lbnQocGRmTWFuYWdlciwgYXJnKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERkRvY3VtZW50KTsKKworICAgIHZhciBzdHJlYW07CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShhcmcpKSB7CisgICAgICBzdHJlYW0gPSBhcmc7CisgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNBcnJheUJ1ZmZlcikoYXJnKSkgeworICAgICAgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyZWFtKGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiUERGRG9jdW1lbnQ6IFVua25vd24gYXJndW1lbnQgdHlwZSIpOworICAgIH0KKworICAgIGlmIChzdHJlYW0ubGVuZ3RoIDw9IDApIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKCJUaGUgUERGIGZpbGUgaXMgZW1wdHksIGkuZS4gaXRzIHNpemUgaXMgemVybyBieXRlcy4iKTsKKyAgICB9CisKKyAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMueHJlZiA9IG5ldyBfb2JqLlhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKTsKKyAgICB0aGlzLl9wYWdlUHJvbWlzZXMgPSBbXTsKKyAgICB0aGlzLl92ZXJzaW9uID0gbnVsbDsKKyAgICB2YXIgaWRDb3VudGVycyA9IHsKKyAgICAgIGZvbnQ6IDAKKyAgICB9OworCisgICAgdGhpcy5fZ2xvYmFsSWRGYWN0b3J5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgICAgIGZ1bmN0aW9uIF9jbGFzczIoKSB7CisgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBfY2xhc3MyKTsKKyAgICAgIH0KKworICAgICAgX2NyZWF0ZUNsYXNzKF9jbGFzczIsIG51bGwsIFt7CisgICAgICAgIGtleTogImdldERvY0lkIiwKKyAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERvY0lkKCkgeworICAgICAgICAgIHJldHVybiAiZ18iLmNvbmNhdChwZGZNYW5hZ2VyLmRvY0lkKTsKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICBrZXk6ICJjcmVhdGVGb250SWQiLAorICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlRm9udElkKCkgeworICAgICAgICAgIHJldHVybiAiZiIuY29uY2F0KCsraWRDb3VudGVycy5mb250KTsKKyAgICAgICAgfQorICAgICAgfSwgeworICAgICAgICBrZXk6ICJjcmVhdGVPYmpJZCIsCisgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVPYmpJZCgpIHsKKyAgICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGNyZWF0ZU9iaklkYCBjYWxsZWQuIik7CisgICAgICAgIH0KKyAgICAgIH1dKTsKKworICAgICAgcmV0dXJuIF9jbGFzczI7CisgICAgfSgpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERkRvY3VtZW50LCBbeworICAgIGtleTogInBhcnNlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2UocmVjb3ZlcnlNb2RlKSB7CisgICAgICB0aGlzLnhyZWYucGFyc2UocmVjb3ZlcnlNb2RlKTsKKyAgICAgIHRoaXMuY2F0YWxvZyA9IG5ldyBfb2JqLkNhdGFsb2codGhpcy5wZGZNYW5hZ2VyLCB0aGlzLnhyZWYpOworCisgICAgICBpZiAodGhpcy5jYXRhbG9nLnZlcnNpb24pIHsKKyAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHRoaXMuY2F0YWxvZy52ZXJzaW9uOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImNoZWNrSGVhZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2hlY2tIZWFkZXIoKSB7CisgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07CisgICAgICBzdHJlYW0ucmVzZXQoKTsKKworICAgICAgaWYgKCFmaW5kKHN0cmVhbSwgUERGX0hFQURFUl9TSUdOQVRVUkUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgc3RyZWFtLm1vdmVTdGFydCgpOworICAgICAgdmFyIE1BWF9QREZfVkVSU0lPTl9MRU5HVEggPSAxMjsKKyAgICAgIHZhciB2ZXJzaW9uID0gIiIsCisgICAgICAgICAgY2g7CisKKyAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSA+IDB4MjApIHsKKyAgICAgICAgaWYgKHZlcnNpb24ubGVuZ3RoID49IE1BWF9QREZfVkVSU0lPTl9MRU5HVEgpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZlcnNpb24gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisgICAgICB9CisKKyAgICAgIGlmICghdGhpcy5fdmVyc2lvbikgeworICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbi5zdWJzdHJpbmcoNSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAicGFyc2VTdGFydFhSZWYiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVN0YXJ0WFJlZigpIHsKKyAgICAgIHRoaXMueHJlZi5zZXRTdGFydFhSZWYodGhpcy5zdGFydFhSZWYpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoZmllbGRzKSB7CisgICAgICB2YXIgX3RoaXM1ID0gdGhpczsKKworICAgICAgdmFyIHJlY3Vyc2lvbkRlcHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwOworICAgICAgdmFyIFJFQ1VSU0lPTl9MSU1JVCA9IDEwOworICAgICAgcmV0dXJuIGZpZWxkcy5ldmVyeShmdW5jdGlvbiAoZmllbGQpIHsKKyAgICAgICAgZmllbGQgPSBfdGhpczUueHJlZi5mZXRjaElmUmVmKGZpZWxkKTsKKworICAgICAgICBpZiAoZmllbGQuaGFzKCJLaWRzIikpIHsKKyAgICAgICAgICBpZiAoKytyZWN1cnNpb25EZXB0aCA+IFJFQ1VSU0lPTl9MSU1JVCkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJfaGFzT25seURvY3VtZW50U2lnbmF0dXJlczogbWF4aW11bSByZWN1cnNpb24gZGVwdGggcmVhY2hlZCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBfdGhpczUuX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoZmllbGQuZ2V0KCJLaWRzIiksIHJlY3Vyc2lvbkRlcHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBpc1NpZ25hdHVyZSA9ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpZWxkLmdldCgiRlQiKSwgIlNpZyIpOworICAgICAgICB2YXIgcmVjdGFuZ2xlID0gZmllbGQuZ2V0KCJSZWN0Iik7CisgICAgICAgIHZhciBpc0ludmlzaWJsZSA9IEFycmF5LmlzQXJyYXkocmVjdGFuZ2xlKSAmJiByZWN0YW5nbGUuZXZlcnkoZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGlzU2lnbmF0dXJlICYmIGlzSW52aXNpYmxlOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2dldExpbmVhcml6YXRpb25QYWdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCkgeworICAgICAgdmFyIGNhdGFsb2cgPSB0aGlzLmNhdGFsb2csCisgICAgICAgICAgbGluZWFyaXphdGlvbiA9IHRoaXMubGluZWFyaXphdGlvbjsKKworICAgICAgdmFyIHJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQobGluZWFyaXphdGlvbi5vYmplY3ROdW1iZXJGaXJzdCwgMCk7CisKKyAgICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2hBc3luYyhyZWYpLnRoZW4oZnVuY3Rpb24gKG9iaikgeworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqLCAiUGFnZSIpIHx8ICgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaikgJiYgIW9iai5oYXMoIlR5cGUiKSAmJiBvYmouaGFzKCJDb250ZW50cyIpKSB7CisgICAgICAgICAgaWYgKHJlZiAmJiAhY2F0YWxvZy5wYWdlS2lkc0NvdW50Q2FjaGUuaGFzKHJlZikpIHsKKyAgICAgICAgICAgIGNhdGFsb2cucGFnZUtpZHNDb3VudENhY2hlLnB1dChyZWYsIDEpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBbb2JqLCByZWZdOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJUaGUgTGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgcG9pbnQgIiArICJ0byBhIHZhbGlkIFBhZ2UgZGljdGlvbmFyeS4iKTsKKyAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKHJlYXNvbik7CisgICAgICAgIHJldHVybiBjYXRhbG9nLmdldFBhZ2VEaWN0KHBhZ2VJbmRleCk7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRQYWdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGFnZShwYWdlSW5kZXgpIHsKKyAgICAgIHZhciBfdGhpczYgPSB0aGlzOworCisgICAgICBpZiAodGhpcy5fcGFnZVByb21pc2VzW3BhZ2VJbmRleF0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVByb21pc2VzW3BhZ2VJbmRleF07CisgICAgICB9CisKKyAgICAgIHZhciBjYXRhbG9nID0gdGhpcy5jYXRhbG9nLAorICAgICAgICAgIGxpbmVhcml6YXRpb24gPSB0aGlzLmxpbmVhcml6YXRpb247CisgICAgICB2YXIgcHJvbWlzZSA9IGxpbmVhcml6YXRpb24gJiYgbGluZWFyaXphdGlvbi5wYWdlRmlyc3QgPT09IHBhZ2VJbmRleCA/IHRoaXMuX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCkgOiBjYXRhbG9nLmdldFBhZ2VEaWN0KHBhZ2VJbmRleCk7CisgICAgICByZXR1cm4gdGhpcy5fcGFnZVByb21pc2VzW3BhZ2VJbmRleF0gPSBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKF9yZWYxMCkgeworICAgICAgICB2YXIgX3JlZjExID0gX3NsaWNlZFRvQXJyYXkoX3JlZjEwLCAyKSwKKyAgICAgICAgICAgIHBhZ2VEaWN0ID0gX3JlZjExWzBdLAorICAgICAgICAgICAgcmVmID0gX3JlZjExWzFdOworCisgICAgICAgIHJldHVybiBuZXcgUGFnZSh7CisgICAgICAgICAgcGRmTWFuYWdlcjogX3RoaXM2LnBkZk1hbmFnZXIsCisgICAgICAgICAgeHJlZjogX3RoaXM2LnhyZWYsCisgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsCisgICAgICAgICAgcGFnZURpY3Q6IHBhZ2VEaWN0LAorICAgICAgICAgIHJlZjogcmVmLAorICAgICAgICAgIGdsb2JhbElkRmFjdG9yeTogX3RoaXM2Ll9nbG9iYWxJZEZhY3RvcnksCisgICAgICAgICAgZm9udENhY2hlOiBjYXRhbG9nLmZvbnRDYWNoZSwKKyAgICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCisgICAgICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogY2F0YWxvZy5nbG9iYWxJbWFnZUNhY2hlCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2hlY2tGaXJzdFBhZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjaGVja0ZpcnN0UGFnZSgpIHsKKyAgICAgIHZhciBfdGhpczcgPSB0aGlzOworCisgICAgICByZXR1cm4gdGhpcy5nZXRQYWdlKDApWyJjYXRjaCJdKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgX3JlZjEyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVhc29uKSB7CisgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgX3RoaXM3Ll9wYWdlUHJvbWlzZXMubGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0OworICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNy5jbGVhbnVwKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZlBhcnNlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCBfY2FsbGVlKTsKKyAgICAgICAgfSkpOworCisgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gpIHsKKyAgICAgICAgICByZXR1cm4gX3JlZjEyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgIH07CisgICAgICB9KCkpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImZvbnRGYWxsYmFjayIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikgeworICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZy5mb250RmFsbGJhY2soaWQsIGhhbmRsZXIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNsZWFudXAiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX2NsZWFudXAgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7CisgICAgICAgIHZhciBtYW51YWxseVRyaWdnZXJlZCwKKyAgICAgICAgICAgIF9hcmdzMiA9IGFyZ3VtZW50czsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG1hbnVhbGx5VHJpZ2dlcmVkID0gX2FyZ3MyLmxlbmd0aCA+IDAgJiYgX2FyZ3MyWzBdICE9PSB1bmRlZmluZWQgPyBfYXJnczJbMF0gOiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgdGhpcy5jYXRhbG9nID8gdGhpcy5jYXRhbG9nLmNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQpIDogKDAsIF9wcmltaXRpdmVzLmNsZWFyUHJpbWl0aXZlQ2FjaGVzKSgpKTsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIGNhc2UgImVuZCI6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIGNsZWFudXAoKSB7CisgICAgICAgIHJldHVybiBfY2xlYW51cC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2xlYW51cDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImxpbmVhcml6YXRpb24iLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgdmFyIGxpbmVhcml6YXRpb24gPSBudWxsOworCisgICAgICB0cnkgeworICAgICAgICBsaW5lYXJpemF0aW9uID0gX3BhcnNlci5MaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSk7CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKGVycik7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAibGluZWFyaXphdGlvbiIsIGxpbmVhcml6YXRpb24pOworICAgIH0KKyAgfSwgeworICAgIGtleTogInN0YXJ0WFJlZiIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07CisgICAgICB2YXIgc3RhcnRYUmVmID0gMDsKKworICAgICAgaWYgKHRoaXMubGluZWFyaXphdGlvbikgeworICAgICAgICBzdHJlYW0ucmVzZXQoKTsKKworICAgICAgICBpZiAoZmluZChzdHJlYW0sIEVORE9CSl9TSUdOQVRVUkUpKSB7CisgICAgICAgICAgc3RhcnRYUmVmID0gc3RyZWFtLnBvcyArIDYgLSBzdHJlYW0uc3RhcnQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBzdGVwID0gMTAyNDsKKyAgICAgICAgdmFyIHN0YXJ0WFJlZkxlbmd0aCA9IFNUQVJUWFJFRl9TSUdOQVRVUkUubGVuZ3RoOworICAgICAgICB2YXIgZm91bmQgPSBmYWxzZSwKKyAgICAgICAgICAgIHBvcyA9IHN0cmVhbS5lbmQ7CisKKyAgICAgICAgd2hpbGUgKCFmb3VuZCAmJiBwb3MgPiAwKSB7CisgICAgICAgICAgcG9zIC09IHN0ZXAgLSBzdGFydFhSZWZMZW5ndGg7CisKKyAgICAgICAgICBpZiAocG9zIDwgMCkgeworICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHJlYW0ucG9zID0gcG9zOworICAgICAgICAgIGZvdW5kID0gZmluZChzdHJlYW0sIFNUQVJUWFJFRl9TSUdOQVRVUkUsIHN0ZXAsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgc3RyZWFtLnNraXAoOSk7CisgICAgICAgICAgdmFyIGNoOworCisgICAgICAgICAgZG8geworICAgICAgICAgICAgY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICAgIH0gd2hpbGUgKCgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGNoKSk7CisKKyAgICAgICAgICB2YXIgc3RyID0gIiI7CisKKyAgICAgICAgICB3aGlsZSAoY2ggPj0gMHgyMCAmJiBjaCA8PSAweDM5KSB7CisgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisgICAgICAgICAgICBjaCA9IHN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3RhcnRYUmVmID0gcGFyc2VJbnQoc3RyLCAxMCk7CisKKyAgICAgICAgICBpZiAoaXNOYU4oc3RhcnRYUmVmKSkgeworICAgICAgICAgICAgc3RhcnRYUmVmID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJzdGFydFhSZWYiLCBzdGFydFhSZWYpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm51bVBhZ2VzIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBsaW5lYXJpemF0aW9uID0gdGhpcy5saW5lYXJpemF0aW9uOworICAgICAgdmFyIG51bSA9IGxpbmVhcml6YXRpb24gPyBsaW5lYXJpemF0aW9uLm51bVBhZ2VzIDogdGhpcy5jYXRhbG9nLm51bVBhZ2VzOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJudW1QYWdlcyIsIG51bSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZm9ybUluZm8iLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgdmFyIGZvcm1JbmZvID0geworICAgICAgICBoYXNBY3JvRm9ybTogZmFsc2UsCisgICAgICAgIGhhc1hmYTogZmFsc2UKKyAgICAgIH07CisgICAgICB2YXIgYWNyb0Zvcm0gPSB0aGlzLmNhdGFsb2cuYWNyb0Zvcm07CisKKyAgICAgIGlmICghYWNyb0Zvcm0pIHsKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgdmFyIHhmYSA9IGFjcm9Gb3JtLmdldCgiWEZBIik7CisgICAgICAgIHZhciBoYXNYZmEgPSBBcnJheS5pc0FycmF5KHhmYSkgJiYgeGZhLmxlbmd0aCA+IDAgfHwgKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh4ZmEpICYmICF4ZmEuaXNFbXB0eTsKKyAgICAgICAgZm9ybUluZm8uaGFzWGZhID0gaGFzWGZhOworICAgICAgICB2YXIgZmllbGRzID0gYWNyb0Zvcm0uZ2V0KCJGaWVsZHMiKTsKKyAgICAgICAgdmFyIGhhc0ZpZWxkcyA9IEFycmF5LmlzQXJyYXkoZmllbGRzKSAmJiBmaWVsZHMubGVuZ3RoID4gMDsKKyAgICAgICAgdmFyIHNpZ0ZsYWdzID0gYWNyb0Zvcm0uZ2V0KCJTaWdGbGFncyIpOworCisgICAgICAgIHZhciBoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzID0gISEoc2lnRmxhZ3MgJiAweDEpICYmIHRoaXMuX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoZmllbGRzKTsKKworICAgICAgICBmb3JtSW5mby5oYXNBY3JvRm9ybSA9IGhhc0ZpZWxkcyAmJiAhaGFzT25seURvY3VtZW50U2lnbmF0dXJlczsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkNhbm5vdCBmZXRjaCBmb3JtIGluZm9ybWF0aW9uLiIpOworICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImZvcm1JbmZvIiwgZm9ybUluZm8pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImRvY3VtZW50SW5mbyIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgRG9jdW1lbnRJbmZvVmFsaWRhdG9ycyA9IHsKKyAgICAgICAgVGl0bGU6IF91dGlsLmlzU3RyaW5nLAorICAgICAgICBBdXRob3I6IF91dGlsLmlzU3RyaW5nLAorICAgICAgICBTdWJqZWN0OiBfdXRpbC5pc1N0cmluZywKKyAgICAgICAgS2V5d29yZHM6IF91dGlsLmlzU3RyaW5nLAorICAgICAgICBDcmVhdG9yOiBfdXRpbC5pc1N0cmluZywKKyAgICAgICAgUHJvZHVjZXI6IF91dGlsLmlzU3RyaW5nLAorICAgICAgICBDcmVhdGlvbkRhdGU6IF91dGlsLmlzU3RyaW5nLAorICAgICAgICBNb2REYXRlOiBfdXRpbC5pc1N0cmluZywKKyAgICAgICAgVHJhcHBlZDogX3ByaW1pdGl2ZXMuaXNOYW1lCisgICAgICB9OworICAgICAgdmFyIHZlcnNpb24gPSB0aGlzLl92ZXJzaW9uOworCisgICAgICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICJzdHJpbmciIHx8ICFQREZfSEVBREVSX1ZFUlNJT05fUkVHRVhQLnRlc3QodmVyc2lvbikpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIFBERiBoZWFkZXIgdmVyc2lvbiBudW1iZXI6ICIuY29uY2F0KHZlcnNpb24pKTsKKyAgICAgICAgdmVyc2lvbiA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciBkb2NJbmZvID0geworICAgICAgICBQREZGb3JtYXRWZXJzaW9uOiB2ZXJzaW9uLAorICAgICAgICBJc0xpbmVhcml6ZWQ6ICEhdGhpcy5saW5lYXJpemF0aW9uLAorICAgICAgICBJc0Fjcm9Gb3JtUHJlc2VudDogdGhpcy5mb3JtSW5mby5oYXNBY3JvRm9ybSwKKyAgICAgICAgSXNYRkFQcmVzZW50OiB0aGlzLmZvcm1JbmZvLmhhc1hmYSwKKyAgICAgICAgSXNDb2xsZWN0aW9uUHJlc2VudDogISF0aGlzLmNhdGFsb2cuY29sbGVjdGlvbgorICAgICAgfTsKKyAgICAgIHZhciBpbmZvRGljdDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgaW5mb0RpY3QgPSB0aGlzLnhyZWYudHJhaWxlci5nZXQoIkluZm8iKTsKKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CisgICAgICB9CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShpbmZvRGljdCkpIHsKKyAgICAgICAgdmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpbmZvRGljdC5nZXRLZXlzKCkpLAorICAgICAgICAgICAgX3N0ZXA2OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3I2LnMoKTsgIShfc3RlcDYgPSBfaXRlcmF0b3I2Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDYudmFsdWU7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBpbmZvRGljdC5nZXQoa2V5KTsKKworICAgICAgICAgICAgaWYgKERvY3VtZW50SW5mb1ZhbGlkYXRvcnNba2V5XSkgeworICAgICAgICAgICAgICBpZiAoRG9jdW1lbnRJbmZvVmFsaWRhdG9yc1trZXldKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIGRvY0luZm9ba2V5XSA9IHR5cGVvZiB2YWx1ZSAhPT0gInN0cmluZyIgPyB2YWx1ZSA6ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykodmFsdWUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiQmFkIHZhbHVlIGluIGRvY3VtZW50IGluZm8gZm9yIFwiIi5jb25jYXQoa2V5LCAiXCIuIikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgICAgIHZhciBjdXN0b21WYWx1ZSA9IHZvaWQgMDsKKworICAgICAgICAgICAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBjdXN0b21WYWx1ZSA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykodmFsdWUpOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHZhbHVlKSB8fCAoMCwgX3V0aWwuaXNOdW0pKHZhbHVlKSB8fCAoMCwgX3V0aWwuaXNCb29sKSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBjdXN0b21WYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVW5zdXBwb3J0ZWQgdmFsdWUgaW4gZG9jdW1lbnQgaW5mbyBmb3IgKGN1c3RvbSkgXCIiLmNvbmNhdChrZXksICJcIi4iKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIWRvY0luZm8uQ3VzdG9tKSB7CisgICAgICAgICAgICAgICAgZG9jSW5mby5DdXN0b20gPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZG9jSW5mby5DdXN0b21ba2V5XSA9IGN1c3RvbVZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgX2l0ZXJhdG9yNi5lKGVycik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgX2l0ZXJhdG9yNi5mKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJkb2N1bWVudEluZm8iLCBkb2NJbmZvKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmaW5nZXJwcmludCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgaGFzaDsKKyAgICAgIHZhciBpZEFycmF5ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJRCIpOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZEFycmF5KSAmJiBpZEFycmF5WzBdICYmICgwLCBfdXRpbC5pc1N0cmluZykoaWRBcnJheVswXSkgJiYgaWRBcnJheVswXSAhPT0gRU1QVFlfRklOR0VSUFJJTlQpIHsKKyAgICAgICAgaGFzaCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShpZEFycmF5WzBdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhhc2ggPSAoMCwgX2NyeXB0by5jYWxjdWxhdGVNRDUpKHRoaXMuc3RyZWFtLmdldEJ5dGVSYW5nZSgwLCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyksIDAsIEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTKTsKKyAgICAgIH0KKworICAgICAgdmFyIGZpbmdlcnByaW50QnVmID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGhhc2gubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgaGV4ID0gaGFzaFtpXS50b1N0cmluZygxNik7CisgICAgICAgIGZpbmdlcnByaW50QnVmLnB1c2goaGV4LnBhZFN0YXJ0KDIsICIwIikpOworICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImZpbmdlcnByaW50IiwgZmluZ2VycHJpbnRCdWYuam9pbigiIikpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQREZEb2N1bWVudDsKK30oKTsKKworZXhwb3J0cy5QREZEb2N1bWVudCA9IFBERkRvY3VtZW50OworCisvKioqLyB9KSwKKy8qIDIwNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkZpbGVTcGVjID0gZXhwb3J0cy5YUmVmID0gZXhwb3J0cy5PYmplY3RMb2FkZXIgPSBleHBvcnRzLkNhdGFsb2cgPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oMikpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMik7CisKK3ZhciBfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDgpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK3ZhciBfY3J5cHRvID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTkpOworCit2YXIgX2NvbG9yc3BhY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyMCk7CisKK3ZhciBfaW1hZ2VfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyMSk7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCitmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9CisKK2Z1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9CisKK2Z1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9CisKK2Z1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0KKworZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pWyJyZXR1cm4iXSAhPSBudWxsKSBfaVsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9CisKK2Z1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfQorCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IHRocm93IF9lMjsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTMpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UzOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CisKK2Z1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKworZnVuY3Rpb24gZmV0Y2hEZXN0aW5hdGlvbihkZXN0KSB7CisgIHJldHVybiAoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkZXN0KSA/IGRlc3QuZ2V0KCJEIikgOiBkZXN0OworfQorCit2YXIgQ2F0YWxvZyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIENhdGFsb2cocGRmTWFuYWdlciwgeHJlZikgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDYXRhbG9nKTsKKworICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLl9jYXREaWN0ID0geHJlZi5nZXRDYXRhbG9nT2JqKCk7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHRoaXMuX2NhdERpY3QpKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkNhdGFsb2cgb2JqZWN0IGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CisgICAgfQorCisgICAgdGhpcy5mb250Q2FjaGUgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKTsKKyAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBuZXcgTWFwKCk7CisgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5HbG9iYWxJbWFnZUNhY2hlKCk7CisgICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhDYXRhbG9nLCBbeworICAgIGtleTogIl9yZWFkRG9jdW1lbnRPdXRsaW5lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3JlYWREb2N1bWVudE91dGxpbmUoKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgb2JqID0gb2JqLmdldFJhdygiRmlyc3QiKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKG9iaikpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciByb290ID0geworICAgICAgICBpdGVtczogW10KKyAgICAgIH07CisgICAgICB2YXIgcXVldWUgPSBbeworICAgICAgICBvYmo6IG9iaiwKKyAgICAgICAgcGFyZW50OiByb290CisgICAgICB9XTsKKyAgICAgIHZhciBwcm9jZXNzZWQgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CisgICAgICBwcm9jZXNzZWQucHV0KG9iaik7CisgICAgICB2YXIgeHJlZiA9IHRoaXMueHJlZiwKKyAgICAgICAgICBibGFja0NvbG9yID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpOworCisgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgeworICAgICAgICB2YXIgaSA9IHF1ZXVlLnNoaWZ0KCk7CisgICAgICAgIHZhciBvdXRsaW5lRGljdCA9IHhyZWYuZmV0Y2hJZlJlZihpLm9iaik7CisKKyAgICAgICAgaWYgKG91dGxpbmVEaWN0ID09PSBudWxsKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW91dGxpbmVEaWN0LmhhcygiVGl0bGUiKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YSA9IHsKKyAgICAgICAgICB1cmw6IG51bGwsCisgICAgICAgICAgZGVzdDogbnVsbAorICAgICAgICB9OworICAgICAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoeworICAgICAgICAgIGRlc3REaWN0OiBvdXRsaW5lRGljdCwKKyAgICAgICAgICByZXN1bHRPYmo6IGRhdGEsCisgICAgICAgICAgZG9jQmFzZVVybDogdGhpcy5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwKKyAgICAgICAgfSk7CisgICAgICAgIHZhciB0aXRsZSA9IG91dGxpbmVEaWN0LmdldCgiVGl0bGUiKTsKKyAgICAgICAgdmFyIGZsYWdzID0gb3V0bGluZURpY3QuZ2V0KCJGIikgfHwgMDsKKyAgICAgICAgdmFyIGNvbG9yID0gb3V0bGluZURpY3QuZ2V0QXJyYXkoIkMiKTsKKyAgICAgICAgdmFyIGNvdW50ID0gb3V0bGluZURpY3QuZ2V0KCJDb3VudCIpOworICAgICAgICB2YXIgcmdiQ29sb3IgPSBibGFja0NvbG9yOworCisgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbG9yKSAmJiBjb2xvci5sZW5ndGggPT09IDMgJiYgKGNvbG9yWzBdICE9PSAwIHx8IGNvbG9yWzFdICE9PSAwIHx8IGNvbG9yWzJdICE9PSAwKSkgeworICAgICAgICAgIHJnYkNvbG9yID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoY29sb3IsIDApOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG91dGxpbmVJdGVtID0geworICAgICAgICAgIGRlc3Q6IGRhdGEuZGVzdCwKKyAgICAgICAgICB1cmw6IGRhdGEudXJsLAorICAgICAgICAgIHVuc2FmZVVybDogZGF0YS51bnNhZmVVcmwsCisgICAgICAgICAgbmV3V2luZG93OiBkYXRhLm5ld1dpbmRvdywKKyAgICAgICAgICB0aXRsZTogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKSh0aXRsZSksCisgICAgICAgICAgY29sb3I6IHJnYkNvbG9yLAorICAgICAgICAgIGNvdW50OiBOdW1iZXIuaXNJbnRlZ2VyKGNvdW50KSA/IGNvdW50IDogdW5kZWZpbmVkLAorICAgICAgICAgIGJvbGQ6ICEhKGZsYWdzICYgMiksCisgICAgICAgICAgaXRhbGljOiAhIShmbGFncyAmIDEpLAorICAgICAgICAgIGl0ZW1zOiBbXQorICAgICAgICB9OworICAgICAgICBpLnBhcmVudC5pdGVtcy5wdXNoKG91dGxpbmVJdGVtKTsKKyAgICAgICAgb2JqID0gb3V0bGluZURpY3QuZ2V0UmF3KCJGaXJzdCIpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKG9iaikgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkgeworICAgICAgICAgIHF1ZXVlLnB1c2goeworICAgICAgICAgICAgb2JqOiBvYmosCisgICAgICAgICAgICBwYXJlbnQ6IG91dGxpbmVJdGVtCisgICAgICAgICAgfSk7CisgICAgICAgICAgcHJvY2Vzc2VkLnB1dChvYmopOworICAgICAgICB9CisKKyAgICAgICAgb2JqID0gb3V0bGluZURpY3QuZ2V0UmF3KCJOZXh0Iik7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikob2JqKSAmJiAhcHJvY2Vzc2VkLmhhcyhvYmopKSB7CisgICAgICAgICAgcXVldWUucHVzaCh7CisgICAgICAgICAgICBvYmo6IG9iaiwKKyAgICAgICAgICAgIHBhcmVudDogaS5wYXJlbnQKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBwcm9jZXNzZWQucHV0KG9iaik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJvb3QuaXRlbXMubGVuZ3RoID4gMCA/IHJvb3QuaXRlbXMgOiBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9yZWFkUGVybWlzc2lvbnMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVhZFBlcm1pc3Npb25zKCkgeworICAgICAgdmFyIGVuY3J5cHQgPSB0aGlzLnhyZWYudHJhaWxlci5nZXQoIkVuY3J5cHQiKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShlbmNyeXB0KSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIGZsYWdzID0gZW5jcnlwdC5nZXQoIlAiKTsKKworICAgICAgaWYgKCEoMCwgX3V0aWwuaXNOdW0pKGZsYWdzKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgZmxhZ3MgKz0gTWF0aC5wb3coMiwgMzIpOworICAgICAgdmFyIHBlcm1pc3Npb25zID0gW107CisKKyAgICAgIGZvciAodmFyIGtleSBpbiBfdXRpbC5QZXJtaXNzaW9uRmxhZykgeworICAgICAgICB2YXIgdmFsdWUgPSBfdXRpbC5QZXJtaXNzaW9uRmxhZ1trZXldOworCisgICAgICAgIGlmIChmbGFncyAmIHZhbHVlKSB7CisgICAgICAgICAgcGVybWlzc2lvbnMucHVzaCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHBlcm1pc3Npb25zOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3JlYWRPcHRpb25hbENvbnRlbnRDb25maWcoY29uZmlnLCBjb250ZW50R3JvdXBSZWZzKSB7CisgICAgICBmdW5jdGlvbiBwYXJzZU9uT2ZmKHJlZnMpIHsKKyAgICAgICAgdmFyIG9uUGFyc2VkID0gW107CisKKyAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVmcykpIHsKKyAgICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocmVmcyksCisgICAgICAgICAgICAgIF9zdGVwOworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF9zdGVwLnZhbHVlOworCisgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzUmVmKSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb250ZW50R3JvdXBSZWZzLmluY2x1ZGVzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIG9uUGFyc2VkLnB1c2godmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9uUGFyc2VkOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBwYXJzZU9yZGVyKHJlZnMpIHsKKyAgICAgICAgdmFyIG5lc3RlZExldmVscyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDsKKworICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVmcykpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBvcmRlciA9IFtdOworCisgICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocmVmcyksCisgICAgICAgICAgICBfc3RlcDI7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykgeworICAgICAgICAgICAgdmFyIHZhbHVlID0gX3N0ZXAyLnZhbHVlOworCisgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKSh2YWx1ZSkgJiYgY29udGVudEdyb3VwUmVmcy5pbmNsdWRlcyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgcGFyc2VkT3JkZXJSZWZzLnB1dCh2YWx1ZSk7CisgICAgICAgICAgICAgIG9yZGVyLnB1c2godmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbmVzdGVkT3JkZXIgPSBwYXJzZU5lc3RlZE9yZGVyKHZhbHVlLCBuZXN0ZWRMZXZlbHMpOworCisgICAgICAgICAgICBpZiAobmVzdGVkT3JkZXIpIHsKKyAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXN0ZWRPcmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3IyLmYoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXN0ZWRMZXZlbHMgPiAwKSB7CisgICAgICAgICAgcmV0dXJuIG9yZGVyOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGhpZGRlbkdyb3VwcyA9IFtdOworCisgICAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY29udGVudEdyb3VwUmVmcyksCisgICAgICAgICAgICBfc3RlcDM7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykgeworICAgICAgICAgICAgdmFyIGdyb3VwUmVmID0gX3N0ZXAzLnZhbHVlOworCisgICAgICAgICAgICBpZiAocGFyc2VkT3JkZXJSZWZzLmhhcyhncm91cFJlZikpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhpZGRlbkdyb3Vwcy5wdXNoKGdyb3VwUmVmLnRvU3RyaW5nKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgX2l0ZXJhdG9yMy5lKGVycik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgX2l0ZXJhdG9yMy5mKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGlkZGVuR3JvdXBzLmxlbmd0aCkgeworICAgICAgICAgIG9yZGVyLnB1c2goeworICAgICAgICAgICAgbmFtZTogbnVsbCwKKyAgICAgICAgICAgIG9yZGVyOiBoaWRkZW5Hcm91cHMKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvcmRlcjsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcGFyc2VOZXN0ZWRPcmRlcihyZWYsIG5lc3RlZExldmVscykgeworICAgICAgICBpZiAoKytuZXN0ZWRMZXZlbHMgPiBNQVhfTkVTVEVEX0xFVkVMUykgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicGFyc2VOZXN0ZWRPcmRlciAtIHJlYWNoZWQgTUFYX05FU1RFRF9MRVZFTFMuIik7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWUgPSB4cmVmLmZldGNoSWZSZWYocmVmKTsKKworICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbmVzdGVkTmFtZSA9IHhyZWYuZmV0Y2hJZlJlZih2YWx1ZVswXSk7CisKKyAgICAgICAgaWYgKHR5cGVvZiBuZXN0ZWROYW1lICE9PSAic3RyaW5nIikgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG5lc3RlZE9yZGVyID0gcGFyc2VPcmRlcih2YWx1ZS5zbGljZSgxKSwgbmVzdGVkTGV2ZWxzKTsKKworICAgICAgICBpZiAoIW5lc3RlZE9yZGVyIHx8ICFuZXN0ZWRPcmRlci5sZW5ndGgpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgbmFtZTogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShuZXN0ZWROYW1lKSwKKyAgICAgICAgICBvcmRlcjogbmVzdGVkT3JkZXIKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWYsCisgICAgICAgICAgcGFyc2VkT3JkZXJSZWZzID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpLAorICAgICAgICAgIE1BWF9ORVNURURfTEVWRUxTID0gMTA7CisgICAgICByZXR1cm4geworICAgICAgICBuYW1lOiAoMCwgX3V0aWwuaXNTdHJpbmcpKGNvbmZpZy5nZXQoIk5hbWUiKSkgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGNvbmZpZy5nZXQoIk5hbWUiKSkgOiBudWxsLAorICAgICAgICBjcmVhdG9yOiAoMCwgX3V0aWwuaXNTdHJpbmcpKGNvbmZpZy5nZXQoIkNyZWF0b3IiKSkgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGNvbmZpZy5nZXQoIkNyZWF0b3IiKSkgOiBudWxsLAorICAgICAgICBiYXNlU3RhdGU6ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpKSA/IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpLm5hbWUgOiBudWxsLAorICAgICAgICBvbjogcGFyc2VPbk9mZihjb25maWcuZ2V0KCJPTiIpKSwKKyAgICAgICAgb2ZmOiBwYXJzZU9uT2ZmKGNvbmZpZy5nZXQoIk9GRiIpKSwKKyAgICAgICAgb3JkZXI6IHBhcnNlT3JkZXIoY29uZmlnLmdldCgiT3JkZXIiKSksCisgICAgICAgIGdyb3VwczogbnVsbAorICAgICAgfTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXREZXN0aW5hdGlvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlc3RpbmF0aW9uKGRlc3RpbmF0aW9uSWQpIHsKKyAgICAgIHZhciBvYmogPSB0aGlzLl9yZWFkRGVzdHMoKTsKKworICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVUcmVlIHx8IG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoRGVzdGluYXRpb24ob2JqLmdldChkZXN0aW5hdGlvbklkKSB8fCBudWxsKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3JlYWREZXN0cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9yZWFkRGVzdHMoKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CisKKyAgICAgIGlmIChvYmogJiYgb2JqLmhhcygiRGVzdHMiKSkgeworICAgICAgICByZXR1cm4gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIkRlc3RzIiksIHRoaXMueHJlZik7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NhdERpY3QuaGFzKCJEZXN0cyIpKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9jYXREaWN0LmdldCgiRGVzdHMiKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcmVhZFBhZ2VMYWJlbHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVhZFBhZ2VMYWJlbHMoKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoIlBhZ2VMYWJlbHMiKTsKKworICAgICAgaWYgKCFvYmopIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciBwYWdlTGFiZWxzID0gbmV3IEFycmF5KHRoaXMubnVtUGFnZXMpOworICAgICAgdmFyIHN0eWxlID0gbnVsbCwKKyAgICAgICAgICBwcmVmaXggPSAiIjsKKyAgICAgIHZhciBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUob2JqLCB0aGlzLnhyZWYpOworICAgICAgdmFyIG51bXMgPSBudW1iZXJUcmVlLmdldEFsbCgpOworICAgICAgdmFyIGN1cnJlbnRMYWJlbCA9ICIiLAorICAgICAgICAgIGN1cnJlbnRJbmRleCA9IDE7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMubnVtUGFnZXM7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGlmIChpIGluIG51bXMpIHsKKyAgICAgICAgICB2YXIgbGFiZWxEaWN0ID0gbnVtc1tpXTsKKworICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobGFiZWxEaWN0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJQYWdlTGFiZWwgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobGFiZWxEaWN0LmhhcygiVHlwZSIpICYmICEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShsYWJlbERpY3QuZ2V0KCJUeXBlIiksICJQYWdlTGFiZWwiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHR5cGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlMiKSkgeworICAgICAgICAgICAgdmFyIHMgPSBsYWJlbERpY3QuZ2V0KCJTIik7CisKKyAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkocykpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHN0eWxlIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHlsZSA9IHMubmFtZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3R5bGUgPSBudWxsOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJQIikpIHsKKyAgICAgICAgICAgIHZhciBwID0gbGFiZWxEaWN0LmdldCgiUCIpOworCisgICAgICAgICAgICBpZiAoISgwLCBfdXRpbC5pc1N0cmluZykocCkpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJlZml4ID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShwKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJlZml4ID0gIiI7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlN0IikpIHsKKyAgICAgICAgICAgIHZhciBzdCA9IGxhYmVsRGljdC5nZXQoIlN0Iik7CisKKyAgICAgICAgICAgIGlmICghKE51bWJlci5pc0ludGVnZXIoc3QpICYmIHN0ID49IDEpKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBzdGFydCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VycmVudEluZGV4ID0gc3Q7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChzdHlsZSkgeworICAgICAgICAgIGNhc2UgIkQiOgorICAgICAgICAgICAgY3VycmVudExhYmVsID0gY3VycmVudEluZGV4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJSIjoKKyAgICAgICAgICBjYXNlICJyIjoKKyAgICAgICAgICAgIGN1cnJlbnRMYWJlbCA9ICgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKGN1cnJlbnRJbmRleCwgc3R5bGUgPT09ICJyIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkEiOgorICAgICAgICAgIGNhc2UgImEiOgorICAgICAgICAgICAgdmFyIExJTUlUID0gMjY7CisgICAgICAgICAgICB2YXIgQV9VUFBFUl9DQVNFID0gMHg0MSwKKyAgICAgICAgICAgICAgICBBX0xPV0VSX0NBU0UgPSAweDYxOworICAgICAgICAgICAgdmFyIGJhc2VDaGFyQ29kZSA9IHN0eWxlID09PSAiYSIgPyBBX0xPV0VSX0NBU0UgOiBBX1VQUEVSX0NBU0U7CisgICAgICAgICAgICB2YXIgbGV0dGVySW5kZXggPSBjdXJyZW50SW5kZXggLSAxOworICAgICAgICAgICAgdmFyIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYmFzZUNoYXJDb2RlICsgbGV0dGVySW5kZXggJSBMSU1JVCk7CisgICAgICAgICAgICB2YXIgY2hhckJ1ZiA9IFtdOworCisgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBsZXR0ZXJJbmRleCAvIExJTUlUIHwgMDsgaiA8PSBqajsgaisrKSB7CisgICAgICAgICAgICAgIGNoYXJCdWYucHVzaChjaGFyYWN0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZW50TGFiZWwgPSBjaGFyQnVmLmpvaW4oIiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHN0eWxlKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBzdHlsZSBcIiIuY29uY2F0KHN0eWxlLCAiXCIgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZW50TGFiZWwgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHBhZ2VMYWJlbHNbaV0gPSBwcmVmaXggKyBjdXJyZW50TGFiZWw7CisgICAgICAgIGN1cnJlbnRJbmRleCsrOworICAgICAgfQorCisgICAgICByZXR1cm4gcGFnZUxhYmVsczsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmb250RmFsbGJhY2siLAorICAgIHZhbHVlOiBmdW5jdGlvbiBmb250RmFsbGJhY2soaWQsIGhhbmRsZXIpIHsKKyAgICAgIHZhciBwcm9taXNlcyA9IFtdOworICAgICAgdGhpcy5mb250Q2FjaGUuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSkgeworICAgICAgICBwcm9taXNlcy5wdXNoKHByb21pc2UpOworICAgICAgfSk7CisgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKHRyYW5zbGF0ZWRGb250cykgeworICAgICAgICB2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRyYW5zbGF0ZWRGb250cyksCisgICAgICAgICAgICBfc3RlcDQ7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmb3IgKF9pdGVyYXRvcjQucygpOyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQubigpKS5kb25lOykgeworICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZWRGb250ID0gX3N0ZXA0LnZhbHVlOworCisgICAgICAgICAgICBpZiAodHJhbnNsYXRlZEZvbnQubG9hZGVkTmFtZSA9PT0gaWQpIHsKKyAgICAgICAgICAgICAgdHJhbnNsYXRlZEZvbnQuZmFsbGJhY2soaGFuZGxlcik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIF9pdGVyYXRvcjQuZShlcnIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIF9pdGVyYXRvcjQuZigpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjbGVhbnVwIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYW51cCgpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHZhciBtYW51YWxseVRyaWdnZXJlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CisgICAgICAoMCwgX3ByaW1pdGl2ZXMuY2xlYXJQcmltaXRpdmVDYWNoZXMpKCk7CisgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIobWFudWFsbHlUcmlnZ2VyZWQpOworICAgICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTsKKyAgICAgIHZhciBwcm9taXNlcyA9IFtdOworICAgICAgdGhpcy5mb250Q2FjaGUuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSkgeworICAgICAgICBwcm9taXNlcy5wdXNoKHByb21pc2UpOworICAgICAgfSk7CisgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKHRyYW5zbGF0ZWRGb250cykgeworICAgICAgICB2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRyYW5zbGF0ZWRGb250cyksCisgICAgICAgICAgICBfc3RlcDU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmb3IgKF9pdGVyYXRvcjUucygpOyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUubigpKS5kb25lOykgeworICAgICAgICAgICAgdmFyIGRpY3QgPSBfc3RlcDUudmFsdWUuZGljdDsKKyAgICAgICAgICAgIGRlbGV0ZSBkaWN0LnRyYW5zbGF0ZWQ7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3I1LmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3I1LmYoKTsKKyAgICAgICAgfQorCisgICAgICAgIF90aGlzLmZvbnRDYWNoZS5jbGVhcigpOworCisgICAgICAgIF90aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuY2xlYXIoKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFBhZ2VEaWN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGFnZURpY3QocGFnZUluZGV4KSB7CisgICAgICB2YXIgY2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHZhciBub2Rlc1RvVmlzaXQgPSBbdGhpcy5fY2F0RGljdC5nZXRSYXcoIlBhZ2VzIildOworICAgICAgdmFyIHZpc2l0ZWROb2RlcyA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKTsKKyAgICAgIHZhciB4cmVmID0gdGhpcy54cmVmLAorICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZSA9IHRoaXMucGFnZUtpZHNDb3VudENhY2hlOworICAgICAgdmFyIGNvdW50LAorICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggPSAwOworCisgICAgICBmdW5jdGlvbiBuZXh0KCkgeworICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHsKKyAgICAgICAgICB2YXIgY3VycmVudE5vZGUgPSBub2Rlc1RvVmlzaXQucG9wKCk7CisKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKShjdXJyZW50Tm9kZSkpIHsKKyAgICAgICAgICAgIGNvdW50ID0gcGFnZUtpZHNDb3VudENhY2hlLmdldChjdXJyZW50Tm9kZSk7CisKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgY3VycmVudFBhZ2VJbmRleCArIGNvdW50IDwgcGFnZUluZGV4KSB7CisgICAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CisgICAgICAgICAgICAgIHJldHVybiAiY29udGludWUiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmlzaXRlZE5vZGVzLmhhcyhjdXJyZW50Tm9kZSkpIHsKKyAgICAgICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3QobmV3IF91dGlsLkZvcm1hdEVycm9yKCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS4iKSk7CisgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgdjogdm9pZCAwCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXQoY3VycmVudE5vZGUpOworICAgICAgICAgICAgeHJlZi5mZXRjaEFzeW5jKGN1cnJlbnROb2RlKS50aGVuKGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaiwgIlBhZ2UiKSB8fCAoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopICYmICFvYmouaGFzKCJLaWRzIikpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFnZUluZGV4ID09PSBjdXJyZW50UGFnZUluZGV4KSB7CisgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUgJiYgIXBhZ2VLaWRzQ291bnRDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQoY3VycmVudE5vZGUsIDEpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoW29iaiwgY3VycmVudE5vZGVdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2VJbmRleCsrOworICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKG9iaik7CisgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0sIGNhcGFiaWxpdHkucmVqZWN0KTsKKyAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgIHY6IHZvaWQgMAorICAgICAgICAgICAgfTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGN1cnJlbnROb2RlKSkgeworICAgICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3QobmV3IF91dGlsLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkIHJlZmVyZW5jZSBwb2ludHMgdG8gd3JvbmcgdHlwZSBvZiBvYmplY3QuIikpOworICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgdjogdm9pZCAwCisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKworICAgICAgICAgIGNvdW50ID0gY3VycmVudE5vZGUuZ2V0KCJDb3VudCIpOworCisgICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoY291bnQpICYmIGNvdW50ID49IDApIHsKKyAgICAgICAgICAgIHZhciBvYmpJZCA9IGN1cnJlbnROb2RlLm9iaklkOworCisgICAgICAgICAgICBpZiAob2JqSWQgJiYgIXBhZ2VLaWRzQ291bnRDYWNoZS5oYXMob2JqSWQpKSB7CisgICAgICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQob2JqSWQsIGNvdW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKKyAgICAgICAgICAgICAgY3VycmVudFBhZ2VJbmRleCArPSBjb3VudDsKKyAgICAgICAgICAgICAgcmV0dXJuICJjb250aW51ZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIGtpZHMgPSBjdXJyZW50Tm9kZS5nZXQoIktpZHMiKTsKKworICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgeworICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGN1cnJlbnROb2RlLmdldCgiVHlwZSIpLCAiUGFnZSIpIHx8ICFjdXJyZW50Tm9kZS5oYXMoIlR5cGUiKSAmJiBjdXJyZW50Tm9kZS5oYXMoIkNvbnRlbnRzIikpIHsKKyAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggPT09IHBhZ2VJbmRleCkgeworICAgICAgICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZShbY3VycmVudE5vZGUsIG51bGxdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgdjogdm9pZCAwCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXgrKzsKKyAgICAgICAgICAgICAgcmV0dXJuICJjb250aW51ZSI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS4iKSk7CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICB2OiB2b2lkIDAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yICh2YXIgbGFzdCA9IGtpZHMubGVuZ3RoIC0gMTsgbGFzdCA+PSAwOyBsYXN0LS0pIHsKKyAgICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKGtpZHNbbGFzdF0pOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB3aGlsZSAobm9kZXNUb1Zpc2l0Lmxlbmd0aCkgeworICAgICAgICAgIHZhciBfcmV0ID0gX2xvb3AoKTsKKworICAgICAgICAgIGlmIChfcmV0ID09PSAiY29udGludWUiKSBjb250aW51ZTsKKyAgICAgICAgICBpZiAoX3R5cGVvZihfcmV0KSA9PT0gIm9iamVjdCIpIHJldHVybiBfcmV0LnY7CisgICAgICAgIH0KKworICAgICAgICBjYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIlBhZ2UgaW5kZXggIi5jb25jYXQocGFnZUluZGV4LCAiIG5vdCBmb3VuZC4iKSkpOworICAgICAgfQorCisgICAgICBuZXh0KCk7CisgICAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFBhZ2VJbmRleCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBhZ2VJbmRleChwYWdlUmVmKSB7CisgICAgICB2YXIgeHJlZiA9IHRoaXMueHJlZjsKKworICAgICAgZnVuY3Rpb24gcGFnZXNCZWZvcmVSZWYoa2lkUmVmKSB7CisgICAgICAgIHZhciB0b3RhbCA9IDAsCisgICAgICAgICAgICBwYXJlbnRSZWY7CisgICAgICAgIHJldHVybiB4cmVmLmZldGNoQXN5bmMoa2lkUmVmKS50aGVuKGZ1bmN0aW9uIChub2RlKSB7CisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZnNFcXVhbCkoa2lkUmVmLCBwYWdlUmVmKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9kZSwgIlBhZ2UiKSAmJiAhKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG5vZGUpICYmICFub2RlLmhhcygiVHlwZSIpICYmIG5vZGUuaGFzKCJDb250ZW50cyIpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJUaGUgcmVmZXJlbmNlIGRvZXMgbm90IHBvaW50IHRvIGEgL1BhZ2UgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9kZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwYXJlbnRSZWYgPSBub2RlLmdldFJhdygiUGFyZW50Iik7CisgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXN5bmMoIlBhcmVudCIpOworICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChwYXJlbnQpIHsKKyAgICAgICAgICBpZiAoIXBhcmVudCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShwYXJlbnQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhcmVudCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gcGFyZW50LmdldEFzeW5jKCJLaWRzIik7CisgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGtpZHMpIHsKKyAgICAgICAgICBpZiAoIWtpZHMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBraWRQcm9taXNlcyA9IFtdOworICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlOworCisgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0ga2lkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICB2YXIga2lkID0ga2lkc1tpXTsKKworICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGtpZCkpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJLaWQgbXVzdCBiZSBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZnNFcXVhbCkoa2lkLCBraWRSZWYpKSB7CisgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtpZFByb21pc2VzLnB1c2goeHJlZi5mZXRjaEFzeW5jKGtpZCkudGhlbihmdW5jdGlvbiAob2JqKSB7CisgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiS2lkIG5vZGUgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAob2JqLmhhcygiQ291bnQiKSkgeworICAgICAgICAgICAgICAgIHRvdGFsICs9IG9iai5nZXQoIkNvdW50Iik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiS2lkIHJlZmVyZW5jZSBub3QgZm91bmQgaW4gcGFyZW50J3Mga2lkcy4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoa2lkUHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIFt0b3RhbCwgcGFyZW50UmVmXTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHZhciB0b3RhbCA9IDA7CisKKyAgICAgIGZ1bmN0aW9uIG5leHQocmVmKSB7CisgICAgICAgIHJldHVybiBwYWdlc0JlZm9yZVJlZihyZWYpLnRoZW4oZnVuY3Rpb24gKGFyZ3MpIHsKKyAgICAgICAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgX2FyZ3MgPSBfc2xpY2VkVG9BcnJheShhcmdzLCAyKSwKKyAgICAgICAgICAgICAgY291bnQgPSBfYXJnc1swXSwKKyAgICAgICAgICAgICAgcGFyZW50UmVmID0gX2FyZ3NbMV07CisKKyAgICAgICAgICB0b3RhbCArPSBjb3VudDsKKyAgICAgICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5leHQocGFnZVJlZik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAidmVyc2lvbiIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgdmVyc2lvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJWZXJzaW9uIik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodmVyc2lvbikpIHsKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ2ZXJzaW9uIiwgbnVsbCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidmVyc2lvbiIsIHZlcnNpb24ubmFtZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29sbGVjdGlvbiIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgY29sbGVjdGlvbiA9IG51bGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQ29sbGVjdGlvbiIpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopICYmIG9iai5zaXplID4gMCkgeworICAgICAgICAgIGNvbGxlY3Rpb24gPSBvYmo7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkNhbm5vdCBmZXRjaCBDb2xsZWN0aW9uIGVudHJ5OyBhc3N1bWluZyBubyBjb2xsZWN0aW9uIGlzIHByZXNlbnQuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiY29sbGVjdGlvbiIsIGNvbGxlY3Rpb24pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImFjcm9Gb3JtIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBhY3JvRm9ybSA9IG51bGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQWNyb0Zvcm0iKTsKKworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSAmJiBvYmouc2l6ZSA+IDApIHsKKyAgICAgICAgICBhY3JvRm9ybSA9IG9iajsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiQ2Fubm90IGZldGNoIEFjcm9Gb3JtIGVudHJ5OyBhc3N1bWluZyBubyBmb3JtcyBhcmUgcHJlc2VudC4iKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJhY3JvRm9ybSIsIGFjcm9Gb3JtKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJtZXRhZGF0YSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgc3RyZWFtUmVmID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoIk1ldGFkYXRhIik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzUmVmKShzdHJlYW1SZWYpKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAibWV0YWRhdGEiLCBudWxsKTsKKyAgICAgIH0KKworICAgICAgdmFyIHN1cHByZXNzRW5jcnlwdGlvbiA9ICEodGhpcy54cmVmLmVuY3J5cHQgJiYgdGhpcy54cmVmLmVuY3J5cHQuZW5jcnlwdE1ldGFkYXRhKTsKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnhyZWYuZmV0Y2goc3RyZWFtUmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOworICAgICAgdmFyIG1ldGFkYXRhOworCisgICAgICBpZiAoc3RyZWFtICYmICgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHN0cmVhbS5kaWN0KSkgeworICAgICAgICB2YXIgdHlwZSA9IHN0cmVhbS5kaWN0LmdldCgiVHlwZSIpOworICAgICAgICB2YXIgc3VidHlwZSA9IHN0cmVhbS5kaWN0LmdldCgiU3VidHlwZSIpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh0eXBlLCAiTWV0YWRhdGEiKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShzdWJ0eXBlLCAiWE1MIikpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0YWRhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9VVEY4U3RyaW5nKSgoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoc3RyZWFtLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiU2tpcHBpbmcgaW52YWxpZCBtZXRhZGF0YS4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJtZXRhZGF0YSIsIG1ldGFkYXRhKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ0b3BsZXZlbFBhZ2VzRGljdCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgcGFnZXNPYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZXMiKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShwYWdlc09iaikpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHRvcC1sZXZlbCBwYWdlcyBkaWN0aW9uYXJ5LiIpOworICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInRvcGxldmVsUGFnZXNEaWN0IiwgcGFnZXNPYmopOworICAgIH0KKyAgfSwgeworICAgIGtleTogImRvY3VtZW50T3V0bGluZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgb2JqID0gbnVsbDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgb2JqID0gdGhpcy5fcmVhZERvY3VtZW50T3V0bGluZSgpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5hYmxlIHRvIHJlYWQgZG9jdW1lbnQgb3V0bGluZS4iKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJkb2N1bWVudE91dGxpbmUiLCBvYmopOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBlcm1pc3Npb25zIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBwZXJtaXNzaW9ucyA9IG51bGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHBlcm1pc3Npb25zID0gdGhpcy5fcmVhZFBlcm1pc3Npb25zKCk7CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmFibGUgdG8gcmVhZCBwZXJtaXNzaW9ucy4iKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJwZXJtaXNzaW9ucyIsIHBlcm1pc3Npb25zKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvcHRpb25hbENvbnRlbnRDb25maWciLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgdmFyIGNvbmZpZyA9IG51bGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5fY2F0RGljdC5nZXQoIk9DUHJvcGVydGllcyIpOworCisgICAgICAgIGlmICghcHJvcGVydGllcykgeworICAgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGVmYXVsdENvbmZpZyA9IHByb3BlcnRpZXMuZ2V0KCJEIik7CisKKyAgICAgICAgaWYgKCFkZWZhdWx0Q29uZmlnKSB7CisgICAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBncm91cHNEYXRhID0gcHJvcGVydGllcy5nZXQoIk9DR3MiKTsKKworICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ3JvdXBzRGF0YSkpIHsKKyAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGdyb3VwcyA9IFtdOworICAgICAgICB2YXIgZ3JvdXBSZWZzID0gW107CisKKyAgICAgICAgdmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihncm91cHNEYXRhKSwKKyAgICAgICAgICAgIF9zdGVwNjsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNi5zKCk7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICB2YXIgZ3JvdXBSZWYgPSBfc3RlcDYudmFsdWU7CisKKyAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzUmVmKShncm91cFJlZikpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdyb3VwUmVmcy5wdXNoKGdyb3VwUmVmKTsKKyAgICAgICAgICAgIHZhciBncm91cCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGdyb3VwUmVmKTsKKyAgICAgICAgICAgIGdyb3Vwcy5wdXNoKHsKKyAgICAgICAgICAgICAgaWQ6IGdyb3VwUmVmLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgIG5hbWU6ICgwLCBfdXRpbC5pc1N0cmluZykoZ3JvdXAuZ2V0KCJOYW1lIikpID8gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShncm91cC5nZXQoIk5hbWUiKSkgOiBudWxsLAorICAgICAgICAgICAgICBpbnRlbnQ6ICgwLCBfdXRpbC5pc1N0cmluZykoZ3JvdXAuZ2V0KCJJbnRlbnQiKSkgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGdyb3VwLmdldCgiSW50ZW50IikpIDogbnVsbAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3I2LmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3I2LmYoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbmZpZyA9IHRoaXMuX3JlYWRPcHRpb25hbENvbnRlbnRDb25maWcoZGVmYXVsdENvbmZpZywgZ3JvdXBSZWZzKTsKKyAgICAgICAgY29uZmlnLmdyb3VwcyA9IGdyb3VwczsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKworICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuYWJsZSB0byByZWFkIG9wdGlvbmFsIGNvbnRlbnQgY29uZmlnOiAiLmNvbmNhdChleCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIGNvbmZpZyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAibnVtUGFnZXMiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgdmFyIG9iaiA9IHRoaXMudG9wbGV2ZWxQYWdlc0RpY3QuZ2V0KCJDb3VudCIpOworCisgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2JqKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhZ2UgY291bnQgaW4gdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkgaXMgbm90IGFuIGludGVnZXIuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAibnVtUGFnZXMiLCBvYmopOworICAgIH0KKyAgfSwgeworICAgIGtleTogImRlc3RpbmF0aW9ucyIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5fcmVhZERlc3RzKCksCisgICAgICAgICAgZGVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTmFtZVRyZWUpIHsKKyAgICAgICAgdmFyIG5hbWVzID0gb2JqLmdldEFsbCgpOworCisgICAgICAgIGZvciAodmFyIG5hbWUgaW4gbmFtZXMpIHsKKyAgICAgICAgICBkZXN0c1tuYW1lXSA9IGZldGNoRGVzdGluYXRpb24obmFtZXNbbmFtZV0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKKyAgICAgICAgb2JqLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIGRlc3RzW2tleV0gPSBmZXRjaERlc3RpbmF0aW9uKHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRlc3RpbmF0aW9ucyIsIGRlc3RzKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwYWdlTGFiZWxzIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBvYmogPSBudWxsOworCisgICAgICB0cnkgeworICAgICAgICBvYmogPSB0aGlzLl9yZWFkUGFnZUxhYmVscygpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5hYmxlIHRvIHJlYWQgcGFnZSBsYWJlbHMuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAicGFnZUxhYmVscyIsIG9iaik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicGFnZUxheW91dCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VMYXlvdXQiKTsKKworICAgICAgdmFyIHBhZ2VMYXlvdXQgPSAiIjsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG9iaikpIHsKKyAgICAgICAgc3dpdGNoIChvYmoubmFtZSkgeworICAgICAgICAgIGNhc2UgIlNpbmdsZVBhZ2UiOgorICAgICAgICAgIGNhc2UgIk9uZUNvbHVtbiI6CisgICAgICAgICAgY2FzZSAiVHdvQ29sdW1uTGVmdCI6CisgICAgICAgICAgY2FzZSAiVHdvQ29sdW1uUmlnaHQiOgorICAgICAgICAgIGNhc2UgIlR3b1BhZ2VMZWZ0IjoKKyAgICAgICAgICBjYXNlICJUd29QYWdlUmlnaHQiOgorICAgICAgICAgICAgcGFnZUxheW91dCA9IG9iai5uYW1lOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAicGFnZUxheW91dCIsIHBhZ2VMYXlvdXQpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBhZ2VNb2RlIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZU1vZGUiKTsKKworICAgICAgdmFyIHBhZ2VNb2RlID0gIlVzZU5vbmUiOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkob2JqKSkgeworICAgICAgICBzd2l0Y2ggKG9iai5uYW1lKSB7CisgICAgICAgICAgY2FzZSAiVXNlTm9uZSI6CisgICAgICAgICAgY2FzZSAiVXNlT3V0bGluZXMiOgorICAgICAgICAgIGNhc2UgIlVzZVRodW1icyI6CisgICAgICAgICAgY2FzZSAiRnVsbFNjcmVlbiI6CisgICAgICAgICAgY2FzZSAiVXNlT0MiOgorICAgICAgICAgIGNhc2UgIlVzZUF0dGFjaG1lbnRzIjoKKyAgICAgICAgICAgIHBhZ2VNb2RlID0gb2JqLm5hbWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJwYWdlTW9kZSIsIHBhZ2VNb2RlKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ2aWV3ZXJQcmVmZXJlbmNlcyIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgX3RoaXMyID0gdGhpczsKKworICAgICAgdmFyIFZpZXdlclByZWZlcmVuY2VzVmFsaWRhdG9ycyA9IHsKKyAgICAgICAgSGlkZVRvb2xiYXI6IF91dGlsLmlzQm9vbCwKKyAgICAgICAgSGlkZU1lbnViYXI6IF91dGlsLmlzQm9vbCwKKyAgICAgICAgSGlkZVdpbmRvd1VJOiBfdXRpbC5pc0Jvb2wsCisgICAgICAgIEZpdFdpbmRvdzogX3V0aWwuaXNCb29sLAorICAgICAgICBDZW50ZXJXaW5kb3c6IF91dGlsLmlzQm9vbCwKKyAgICAgICAgRGlzcGxheURvY1RpdGxlOiBfdXRpbC5pc0Jvb2wsCisgICAgICAgIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZTogX3ByaW1pdGl2ZXMuaXNOYW1lLAorICAgICAgICBEaXJlY3Rpb246IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgICAgVmlld0FyZWE6IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgICAgVmlld0NsaXA6IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgICAgUHJpbnRBcmVhOiBfcHJpbWl0aXZlcy5pc05hbWUsCisgICAgICAgIFByaW50Q2xpcDogX3ByaW1pdGl2ZXMuaXNOYW1lLAorICAgICAgICBQcmludFNjYWxpbmc6IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgICAgRHVwbGV4OiBfcHJpbWl0aXZlcy5pc05hbWUsCisgICAgICAgIFBpY2tUcmF5QnlQREZTaXplOiBfdXRpbC5pc0Jvb2wsCisgICAgICAgIFByaW50UGFnZVJhbmdlOiBBcnJheS5pc0FycmF5LAorICAgICAgICBOdW1Db3BpZXM6IE51bWJlci5pc0ludGVnZXIKKyAgICAgIH07CisKKyAgICAgIHZhciBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiVmlld2VyUHJlZmVyZW5jZXMiKTsKKworICAgICAgdmFyIHByZWZzID0gbnVsbDsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaikpIHsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIFZpZXdlclByZWZlcmVuY2VzVmFsaWRhdG9ycykgeworICAgICAgICAgIGlmICghb2JqLmhhcyhrZXkpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgdmFsdWUgPSBvYmouZ2V0KGtleSk7CisKKyAgICAgICAgICBpZiAoIVZpZXdlclByZWZlcmVuY2VzVmFsaWRhdG9yc1trZXldKHZhbHVlKSkgeworICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJCYWQgdmFsdWUgaW4gVmlld2VyUHJlZmVyZW5jZXMgZm9yIFwiIi5jb25jYXQoa2V5LCAiXCIuIikpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIHByZWZWYWx1ZSA9IHZvaWQgMDsKKworICAgICAgICAgIHN3aXRjaCAoa2V5KSB7CisgICAgICAgICAgICBjYXNlICJOb25GdWxsU2NyZWVuUGFnZU1vZGUiOgorICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlICJVc2VOb25lIjoKKyAgICAgICAgICAgICAgICBjYXNlICJVc2VPdXRsaW5lcyI6CisgICAgICAgICAgICAgICAgY2FzZSAiVXNlVGh1bWJzIjoKKyAgICAgICAgICAgICAgICBjYXNlICJVc2VPQyI6CisgICAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIlVzZU5vbmUiOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgIkRpcmVjdGlvbiI6CisgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgeworICAgICAgICAgICAgICAgIGNhc2UgIkwyUiI6CisgICAgICAgICAgICAgICAgY2FzZSAiUjJMIjoKKyAgICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiTDJSIjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJWaWV3QXJlYSI6CisgICAgICAgICAgICBjYXNlICJWaWV3Q2xpcCI6CisgICAgICAgICAgICBjYXNlICJQcmludEFyZWEiOgorICAgICAgICAgICAgY2FzZSAiUHJpbnRDbGlwIjoKKyAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CisgICAgICAgICAgICAgICAgY2FzZSAiTWVkaWFCb3giOgorICAgICAgICAgICAgICAgIGNhc2UgIkNyb3BCb3giOgorICAgICAgICAgICAgICAgIGNhc2UgIkJsZWVkQm94IjoKKyAgICAgICAgICAgICAgICBjYXNlICJUcmltQm94IjoKKyAgICAgICAgICAgICAgICBjYXNlICJBcnRCb3giOgorICAgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJDcm9wQm94IjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJQcmludFNjYWxpbmciOgorICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlICJOb25lIjoKKyAgICAgICAgICAgICAgICBjYXNlICJBcHBEZWZhdWx0IjoKKyAgICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiQXBwRGVmYXVsdCI7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiRHVwbGV4IjoKKyAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CisgICAgICAgICAgICAgICAgY2FzZSAiU2ltcGxleCI6CisgICAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcFNob3J0RWRnZSI6CisgICAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcExvbmdFZGdlIjoKKyAgICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiTm9uZSI7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiUHJpbnRQYWdlUmFuZ2UiOgorICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoOworCisgICAgICAgICAgICAgIGlmIChsZW5ndGggJSAyICE9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHZhbHVlLmV2ZXJ5KGZ1bmN0aW9uIChwYWdlLCBpLCBhcnIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID4gMCAmJiAoaSA9PT0gMCB8fCBwYWdlID49IGFycltpIC0gMV0pICYmIHBhZ2UgPD0gX3RoaXMyLm51bVBhZ2VzOworICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkgeworICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgIk51bUNvcGllcyI6CisgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiYm9vbGVhbiIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoInZpZXdlclByZWZlcmVuY2VzIC0gZXhwZWN0ZWQgYSBib29sZWFuIHZhbHVlIGZvcjogIi5jb25jYXQoa2V5KSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocHJlZlZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIGlmICghcHJlZnMpIHsKKyAgICAgICAgICAgICAgcHJlZnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmVmc1trZXldID0gcHJlZlZhbHVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkJhZCB2YWx1ZSBpbiBWaWV3ZXJQcmVmZXJlbmNlcyBmb3IgXCIiLmNvbmNhdChrZXksICJcIi4iKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidmlld2VyUHJlZmVyZW5jZXMiLCBwcmVmcyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAib3BlbkFjdGlvbiIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTsKKworICAgICAgdmFyIG9wZW5BY3Rpb24gPSBudWxsOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSkgeworICAgICAgICB2YXIgZGVzdERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOworICAgICAgICBkZXN0RGljdC5zZXQoIkEiLCBvYmopOworICAgICAgICB2YXIgcmVzdWx0T2JqID0geworICAgICAgICAgIHVybDogbnVsbCwKKyAgICAgICAgICBkZXN0OiBudWxsLAorICAgICAgICAgIGFjdGlvbjogbnVsbAorICAgICAgICB9OworICAgICAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoeworICAgICAgICAgIGRlc3REaWN0OiBkZXN0RGljdCwKKyAgICAgICAgICByZXN1bHRPYmo6IHJlc3VsdE9iagorICAgICAgICB9KTsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRPYmouZGVzdCkpIHsKKyAgICAgICAgICBpZiAoIW9wZW5BY3Rpb24pIHsKKyAgICAgICAgICAgIG9wZW5BY3Rpb24gPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICAgIH0KKworICAgICAgICAgIG9wZW5BY3Rpb24uZGVzdCA9IHJlc3VsdE9iai5kZXN0OworICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdE9iai5hY3Rpb24pIHsKKyAgICAgICAgICBpZiAoIW9wZW5BY3Rpb24pIHsKKyAgICAgICAgICAgIG9wZW5BY3Rpb24gPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICAgIH0KKworICAgICAgICAgIG9wZW5BY3Rpb24uYWN0aW9uID0gcmVzdWx0T2JqLmFjdGlvbjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHsKKyAgICAgICAgaWYgKCFvcGVuQWN0aW9uKSB7CisgICAgICAgICAgb3BlbkFjdGlvbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBvcGVuQWN0aW9uLmRlc3QgPSBvYmo7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3BlbkFjdGlvbiIsIG9wZW5BY3Rpb24pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImF0dGFjaG1lbnRzIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKKworICAgICAgdmFyIGF0dGFjaG1lbnRzID0gbnVsbDsKKworICAgICAgaWYgKG9iaiAmJiBvYmouaGFzKCJFbWJlZGRlZEZpbGVzIikpIHsKKyAgICAgICAgdmFyIG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIkVtYmVkZGVkRmlsZXMiKSwgdGhpcy54cmVmKTsKKyAgICAgICAgdmFyIG5hbWVzID0gbmFtZVRyZWUuZ2V0QWxsKCk7CisKKyAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBuYW1lcykgeworICAgICAgICAgIHZhciBmcyA9IG5ldyBGaWxlU3BlYyhuYW1lc1tuYW1lXSwgdGhpcy54cmVmKTsKKworICAgICAgICAgIGlmICghYXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgIGF0dGFjaG1lbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBhdHRhY2htZW50c1soMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKG5hbWUpXSA9IGZzLnNlcmlhbGl6YWJsZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImF0dGFjaG1lbnRzIiwgYXR0YWNobWVudHMpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImphdmFTY3JpcHQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgdmFyIG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOworCisgICAgICB2YXIgamF2YVNjcmlwdCA9IG51bGw7CisKKyAgICAgIGZ1bmN0aW9uIGFwcGVuZElmSmF2YVNjcmlwdERpY3QoanNEaWN0KSB7CisgICAgICAgIHZhciB0eXBlID0ganNEaWN0LmdldCgiUyIpOworCisgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSwgIkphdmFTY3JpcHQiKSkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBqcyA9IGpzRGljdC5nZXQoIkpTIik7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoanMpKSB7CisgICAgICAgICAganMgPSAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoanMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoISgwLCBfdXRpbC5pc1N0cmluZykoanMpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFqYXZhU2NyaXB0KSB7CisgICAgICAgICAgamF2YVNjcmlwdCA9IFtdOworICAgICAgICB9CisKKyAgICAgICAgamF2YVNjcmlwdC5wdXNoKCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoanMpKTsKKyAgICAgIH0KKworICAgICAgaWYgKG9iaiAmJiBvYmouaGFzKCJKYXZhU2NyaXB0IikpIHsKKyAgICAgICAgdmFyIG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIkphdmFTY3JpcHQiKSwgdGhpcy54cmVmKTsKKyAgICAgICAgdmFyIG5hbWVzID0gbmFtZVRyZWUuZ2V0QWxsKCk7CisKKyAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBuYW1lcykgeworICAgICAgICAgIHZhciBqc0RpY3QgPSBuYW1lc1tuYW1lXTsKKworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShqc0RpY3QpKSB7CisgICAgICAgICAgICBhcHBlbmRJZkphdmFTY3JpcHREaWN0KGpzRGljdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBvcGVuQWN0aW9uID0gdGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9wZW5BY3Rpb24pICYmICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG9wZW5BY3Rpb24uZ2V0KCJTIiksICJKYXZhU2NyaXB0IikpIHsKKyAgICAgICAgYXBwZW5kSWZKYXZhU2NyaXB0RGljdChvcGVuQWN0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJqYXZhU2NyaXB0IiwgamF2YVNjcmlwdCk7CisgICAgfQorICB9XSwgW3sKKyAgICBrZXk6ICJwYXJzZURlc3REaWN0aW9uYXJ5IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VEZXN0RGljdGlvbmFyeShwYXJhbXMpIHsKKyAgICAgIGZ1bmN0aW9uIGFkZERlZmF1bHRQcm90b2NvbFRvVXJsKHVybCkgeworICAgICAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSA/ICJodHRwOi8vIi5jb25jYXQodXJsKSA6IHVybDsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gdHJ5Q29udmVydFVybEVuY29kaW5nKHVybCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9VVEY4U3RyaW5nKSh1cmwpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgcmV0dXJuIHVybDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgZGVzdERpY3QgPSBwYXJhbXMuZGVzdERpY3Q7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGVzdERpY3QpKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcmVzdWx0T2JqID0gcGFyYW1zLnJlc3VsdE9iajsKKworICAgICAgaWYgKF90eXBlb2YocmVzdWx0T2JqKSAhPT0gIm9iamVjdCIpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgcmVzdWx0T2JqYCBtdXN0IGJlIGFuIG9iamVjdC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgZG9jQmFzZVVybCA9IHBhcmFtcy5kb2NCYXNlVXJsIHx8IG51bGw7CisgICAgICB2YXIgYWN0aW9uID0gZGVzdERpY3QuZ2V0KCJBIiksCisgICAgICAgICAgdXJsLAorICAgICAgICAgIGRlc3Q7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoYWN0aW9uKSAmJiBkZXN0RGljdC5oYXMoIkRlc3QiKSkgeworICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGFjdGlvbikpIHsKKyAgICAgICAgdmFyIGFjdGlvblR5cGUgPSBhY3Rpb24uZ2V0KCJTIik7CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShhY3Rpb25UeXBlKSkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicGFyc2VEZXN0RGljdGlvbmFyeTogSW52YWxpZCB0eXBlIGluIEFjdGlvbiBkaWN0aW9uYXJ5LiIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBhY3Rpb25OYW1lID0gYWN0aW9uVHlwZS5uYW1lOworCisgICAgICAgIHN3aXRjaCAoYWN0aW9uTmFtZSkgeworICAgICAgICAgIGNhc2UgIlVSSSI6CisgICAgICAgICAgICB1cmwgPSBhY3Rpb24uZ2V0KCJVUkkiKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHVybCkpIHsKKyAgICAgICAgICAgICAgdXJsID0gIi8iICsgdXJsLm5hbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykodXJsKSkgeworICAgICAgICAgICAgICB1cmwgPSBhZGREZWZhdWx0UHJvdG9jb2xUb1VybCh1cmwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkdvVG8iOgorICAgICAgICAgICAgZGVzdCA9IGFjdGlvbi5nZXQoIkQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiTGF1bmNoIjoKKyAgICAgICAgICBjYXNlICJHb1RvUiI6CisgICAgICAgICAgICB2YXIgdXJsRGljdCA9IGFjdGlvbi5nZXQoIkYiKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHVybERpY3QpKSB7CisgICAgICAgICAgICAgIHVybCA9IHVybERpY3QuZ2V0KCJGIikgfHwgbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKSh1cmxEaWN0KSkgeworICAgICAgICAgICAgICB1cmwgPSB1cmxEaWN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVtb3RlRGVzdCA9IGFjdGlvbi5nZXQoIkQiKTsKKworICAgICAgICAgICAgaWYgKHJlbW90ZURlc3QpIHsKKyAgICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHJlbW90ZURlc3QpKSB7CisgICAgICAgICAgICAgICAgcmVtb3RlRGVzdCA9IHJlbW90ZURlc3QubmFtZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKHVybCkpIHsKKyAgICAgICAgICAgICAgICB2YXIgYmFzZVVybCA9IHVybC5zcGxpdCgiIyIpWzBdOworCisgICAgICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykocmVtb3RlRGVzdCkpIHsKKyAgICAgICAgICAgICAgICAgIHVybCA9IGJhc2VVcmwgKyAiIyIgKyByZW1vdGVEZXN0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZW1vdGVEZXN0KSkgeworICAgICAgICAgICAgICAgICAgdXJsID0gYmFzZVVybCArICIjIiArIEpTT04uc3RyaW5naWZ5KHJlbW90ZURlc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbmV3V2luZG93ID0gYWN0aW9uLmdldCgiTmV3V2luZG93Iik7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShuZXdXaW5kb3cpKSB7CisgICAgICAgICAgICAgIHJlc3VsdE9iai5uZXdXaW5kb3cgPSBuZXdXaW5kb3c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiTmFtZWQiOgorICAgICAgICAgICAgdmFyIG5hbWVkQWN0aW9uID0gYWN0aW9uLmdldCgiTiIpOworCisgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkobmFtZWRBY3Rpb24pKSB7CisgICAgICAgICAgICAgIHJlc3VsdE9iai5hY3Rpb24gPSBuYW1lZEFjdGlvbi5uYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkphdmFTY3JpcHQiOgorICAgICAgICAgICAgdmFyIGpzQWN0aW9uID0gYWN0aW9uLmdldCgiSlMiKTsKKyAgICAgICAgICAgIHZhciBqczsKKworICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoanNBY3Rpb24pKSB7CisgICAgICAgICAgICAgIGpzID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGpzQWN0aW9uLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKGpzQWN0aW9uKSkgeworICAgICAgICAgICAgICBqcyA9IGpzQWN0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoanMpIHsKKyAgICAgICAgICAgICAgdmFyIFVSTF9PUEVOX01FVEhPRFMgPSBbImFwcC5sYXVuY2hVUkwiLCAid2luZG93Lm9wZW4iXTsKKyAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgiXlxccyooIiArIFVSTF9PUEVOX01FVEhPRFMuam9pbigifCIpLnNwbGl0KCIuIikuam9pbigiXFwuIikgKyAiKVxcKCg/Oid8XCIpKFteJ1wiXSopKD86J3xcIikoPzosXFxzKihcXHcrKVxcKXxcXCkpIiwgImkiKTsKKyAgICAgICAgICAgICAgdmFyIGpzVXJsID0gcmVnZXguZXhlYygoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGpzKSk7CisKKyAgICAgICAgICAgICAgaWYgKGpzVXJsICYmIGpzVXJsWzJdKSB7CisgICAgICAgICAgICAgICAgdXJsID0ganNVcmxbMl07CisKKyAgICAgICAgICAgICAgICBpZiAoanNVcmxbM10gPT09ICJ0cnVlIiAmJiBqc1VybFsxXSA9PT0gImFwcC5sYXVuY2hVUkwiKSB7CisgICAgICAgICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicGFyc2VEZXN0RGljdGlvbmFyeTogdW5zdXBwb3J0ZWQgYWN0aW9uIHR5cGUgXCIiLmNvbmNhdChhY3Rpb25OYW1lLCAiXCIuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZGVzdERpY3QuaGFzKCJEZXN0IikpIHsKKyAgICAgICAgZGVzdCA9IGRlc3REaWN0LmdldCgiRGVzdCIpOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKSh1cmwpKSB7CisgICAgICAgIHVybCA9IHRyeUNvbnZlcnRVcmxFbmNvZGluZyh1cmwpOworICAgICAgICB2YXIgYWJzb2x1dGVVcmwgPSAoMCwgX3V0aWwuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodXJsLCBkb2NCYXNlVXJsKTsKKworICAgICAgICBpZiAoYWJzb2x1dGVVcmwpIHsKKyAgICAgICAgICByZXN1bHRPYmoudXJsID0gYWJzb2x1dGVVcmwuaHJlZjsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdE9iai51bnNhZmVVcmwgPSB1cmw7CisgICAgICB9CisKKyAgICAgIGlmIChkZXN0KSB7CisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShkZXN0KSkgeworICAgICAgICAgIGRlc3QgPSBkZXN0Lm5hbWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShkZXN0KSB8fCBBcnJheS5pc0FycmF5KGRlc3QpKSB7CisgICAgICAgICAgcmVzdWx0T2JqLmRlc3QgPSBkZXN0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIENhdGFsb2c7Cit9KCk7CisKK2V4cG9ydHMuQ2F0YWxvZyA9IENhdGFsb2c7CisKK3ZhciBYUmVmID0gZnVuY3Rpb24gWFJlZkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKSB7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKKyAgICB0aGlzLmVudHJpZXMgPSBbXTsKKyAgICB0aGlzLnhyZWZzdG1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLl9jYWNoZU1hcCA9IG5ldyBNYXAoKTsKKyAgICB0aGlzLnN0YXRzID0geworICAgICAgc3RyZWFtVHlwZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCisgICAgICBmb250VHlwZXM6IE9iamVjdC5jcmVhdGUobnVsbCkKKyAgICB9OworICAgIHRoaXMuX25ld1JlZk51bSA9IG51bGw7CisgIH0KKworICBYUmVmLnByb3RvdHlwZSA9IHsKKyAgICBnZXROZXdSZWY6IGZ1bmN0aW9uIFhSZWZfZ2V0TmV3UmVmKCkgeworICAgICAgaWYgKHRoaXMuX25ld1JlZk51bSA9PT0gbnVsbCkgeworICAgICAgICB0aGlzLl9uZXdSZWZOdW0gPSB0aGlzLmVudHJpZXMubGVuZ3RoOworICAgICAgfQorCisgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuUmVmLmdldCh0aGlzLl9uZXdSZWZOdW0rKywgMCk7CisgICAgfSwKKyAgICByZXNldE5ld1JlZjogZnVuY3Rpb24gWFJlZl9yZXNldE5ld1JlZigpIHsKKyAgICAgIHRoaXMuX25ld1JlZk51bSA9IG51bGw7CisgICAgfSwKKyAgICBzZXRTdGFydFhSZWY6IGZ1bmN0aW9uIFhSZWZfc2V0U3RhcnRYUmVmKHN0YXJ0WFJlZikgeworICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZSA9IFtzdGFydFhSZWZdOworICAgIH0sCisgICAgcGFyc2U6IGZ1bmN0aW9uIFhSZWZfcGFyc2UocmVjb3ZlcnlNb2RlKSB7CisgICAgICB2YXIgdHJhaWxlckRpY3Q7CisKKyAgICAgIGlmICghcmVjb3ZlcnlNb2RlKSB7CisgICAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5yZWFkWFJlZigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbmRleGluZyBhbGwgUERGIG9iamVjdHMiKTsKKyAgICAgICAgdHJhaWxlckRpY3QgPSB0aGlzLmluZGV4T2JqZWN0cygpOworICAgICAgfQorCisgICAgICB0cmFpbGVyRGljdC5hc3NpZ25YcmVmKHRoaXMpOworICAgICAgdGhpcy50cmFpbGVyID0gdHJhaWxlckRpY3Q7CisgICAgICB2YXIgZW5jcnlwdDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZW5jcnlwdCA9IHRyYWlsZXJEaWN0LmdldCgiRW5jcnlwdCIpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiWFJlZi5wYXJzZSAtIEludmFsaWQgXCJFbmNyeXB0XCIgcmVmZXJlbmNlOiBcIiIuY29uY2F0KGV4LCAiXCIuIikpOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZW5jcnlwdCkpIHsKKyAgICAgICAgdmFyIGlkcyA9IHRyYWlsZXJEaWN0LmdldCgiSUQiKTsKKyAgICAgICAgdmFyIGZpbGVJZCA9IGlkcyAmJiBpZHMubGVuZ3RoID8gaWRzWzBdIDogIiI7CisgICAgICAgIGVuY3J5cHQuc3VwcHJlc3NFbmNyeXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5lbmNyeXB0ID0gbmV3IF9jcnlwdG8uQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShlbmNyeXB0LCBmaWxlSWQsIHRoaXMucGRmTWFuYWdlci5wYXNzd29yZCk7CisgICAgICB9CisKKyAgICAgIHZhciByb290OworCisgICAgICB0cnkgeworICAgICAgICByb290ID0gdHJhaWxlckRpY3QuZ2V0KCJSb290Iik7CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJYUmVmLnBhcnNlIC0gSW52YWxpZCBcIlJvb3RcIiByZWZlcmVuY2U6IFwiIi5jb25jYXQoZXgsICJcIi4iKSk7CisgICAgICB9CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShyb290KSAmJiByb290LmhhcygiUGFnZXMiKSkgeworICAgICAgICB0aGlzLnJvb3QgPSByb290OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFyZWNvdmVyeU1vZGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZlBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgcm9vdCByZWZlcmVuY2UiKTsKKyAgICAgIH0KKyAgICB9LAorICAgIHByb2Nlc3NYUmVmVGFibGU6IGZ1bmN0aW9uIFhSZWZfcHJvY2Vzc1hSZWZUYWJsZShwYXJzZXIpIHsKKyAgICAgIGlmICghKCJ0YWJsZVN0YXRlIiBpbiB0aGlzKSkgeworICAgICAgICB0aGlzLnRhYmxlU3RhdGUgPSB7CisgICAgICAgICAgZW50cnlOdW06IDAsCisgICAgICAgICAgc3RyZWFtUG9zOiBwYXJzZXIubGV4ZXIuc3RyZWFtLnBvcywKKyAgICAgICAgICBwYXJzZXJCdWYxOiBwYXJzZXIuYnVmMSwKKyAgICAgICAgICBwYXJzZXJCdWYyOiBwYXJzZXIuYnVmMgorICAgICAgICB9OworICAgICAgfQorCisgICAgICB2YXIgb2JqID0gdGhpcy5yZWFkWFJlZlRhYmxlKHBhcnNlcik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJ0cmFpbGVyIikpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBmaW5kIHRyYWlsZXIgZGljdGlvbmFyeSIpOworICAgICAgfQorCisgICAgICB2YXIgZGljdCA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0KSAmJiBkaWN0LmRpY3QpIHsKKyAgICAgICAgZGljdCA9IGRpY3QuZGljdDsKKyAgICAgIH0KKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0KSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogY291bGQgbm90IHBhcnNlIHRyYWlsZXIgZGljdGlvbmFyeSIpOworICAgICAgfQorCisgICAgICBkZWxldGUgdGhpcy50YWJsZVN0YXRlOworICAgICAgcmV0dXJuIGRpY3Q7CisgICAgfSwKKyAgICByZWFkWFJlZlRhYmxlOiBmdW5jdGlvbiBYUmVmX3JlYWRYUmVmVGFibGUocGFyc2VyKSB7CisgICAgICB2YXIgc3RyZWFtID0gcGFyc2VyLmxleGVyLnN0cmVhbTsKKyAgICAgIHZhciB0YWJsZVN0YXRlID0gdGhpcy50YWJsZVN0YXRlOworICAgICAgc3RyZWFtLnBvcyA9IHRhYmxlU3RhdGUuc3RyZWFtUG9zOworICAgICAgcGFyc2VyLmJ1ZjEgPSB0YWJsZVN0YXRlLnBhcnNlckJ1ZjE7CisgICAgICBwYXJzZXIuYnVmMiA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMjsKKyAgICAgIHZhciBvYmo7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICghKCJmaXJzdEVudHJ5TnVtIiBpbiB0YWJsZVN0YXRlKSB8fCAhKCJlbnRyeUNvdW50IiBpbiB0YWJsZVN0YXRlKSkgeworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiA9IHBhcnNlci5nZXRPYmooKSwgInRyYWlsZXIiKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtID0gb2JqOworICAgICAgICAgIHRhYmxlU3RhdGUuZW50cnlDb3VudCA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmaXJzdCA9IHRhYmxlU3RhdGUuZmlyc3RFbnRyeU51bTsKKyAgICAgICAgdmFyIGNvdW50ID0gdGFibGVTdGF0ZS5lbnRyeUNvdW50OworCisgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIoY291bnQpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHdyb25nIHR5cGVzIGluIHN1YnNlY3Rpb24gaGVhZGVyIik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHZhciBpID0gdGFibGVTdGF0ZS5lbnRyeU51bTsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICB0YWJsZVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CisgICAgICAgICAgdGFibGVTdGF0ZS5lbnRyeU51bSA9IGk7CisgICAgICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYxID0gcGFyc2VyLmJ1ZjE7CisgICAgICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYyID0gcGFyc2VyLmJ1ZjI7CisgICAgICAgICAgdmFyIGVudHJ5ID0ge307CisgICAgICAgICAgZW50cnkub2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpOworICAgICAgICAgIGVudHJ5LmdlbiA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgICAgICB2YXIgdHlwZSA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuY21kKSB7CisgICAgICAgICAgICAgIGNhc2UgImYiOgorICAgICAgICAgICAgICAgIGVudHJ5LmZyZWUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgIm4iOgorICAgICAgICAgICAgICAgIGVudHJ5LnVuY29tcHJlc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGVudHJ5Lm9mZnNldCkgfHwgIU51bWJlci5pc0ludGVnZXIoZW50cnkuZ2VuKSB8fCAhKGVudHJ5LmZyZWUgfHwgZW50cnkudW5jb21wcmVzc2VkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIGVudHJ5IGluIFhSZWYgc3Vic2VjdGlvbjogIi5jb25jYXQoZmlyc3QsICIsICIpLmNvbmNhdChjb3VudCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpID09PSAwICYmIGVudHJ5LmZyZWUgJiYgZmlyc3QgPT09IDEpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tpICsgZmlyc3RdKSB7CisgICAgICAgICAgICB0aGlzLmVudHJpZXNbaSArIGZpcnN0XSA9IGVudHJ5OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRhYmxlU3RhdGUuZW50cnlOdW0gPSAwOworICAgICAgICB0YWJsZVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CisgICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMSA9IHBhcnNlci5idWYxOworICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjIgPSBwYXJzZXIuYnVmMjsKKyAgICAgICAgZGVsZXRlIHRhYmxlU3RhdGUuZmlyc3RFbnRyeU51bTsKKyAgICAgICAgZGVsZXRlIHRhYmxlU3RhdGUuZW50cnlDb3VudDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuZW50cmllc1swXSAmJiAhdGhpcy5lbnRyaWVzWzBdLmZyZWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0Iik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvYmo7CisgICAgfSwKKyAgICBwcm9jZXNzWFJlZlN0cmVhbTogZnVuY3Rpb24gWFJlZl9wcm9jZXNzWFJlZlN0cmVhbShzdHJlYW0pIHsKKyAgICAgIGlmICghKCJzdHJlYW1TdGF0ZSIgaW4gdGhpcykpIHsKKyAgICAgICAgdmFyIHN0cmVhbVBhcmFtZXRlcnMgPSBzdHJlYW0uZGljdDsKKyAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSBzdHJlYW1QYXJhbWV0ZXJzLmdldCgiVyIpOworICAgICAgICB2YXIgcmFuZ2UgPSBzdHJlYW1QYXJhbWV0ZXJzLmdldCgiSW5kZXgiKTsKKworICAgICAgICBpZiAoIXJhbmdlKSB7CisgICAgICAgICAgcmFuZ2UgPSBbMCwgc3RyZWFtUGFyYW1ldGVycy5nZXQoIlNpemUiKV07CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN0cmVhbVN0YXRlID0geworICAgICAgICAgIGVudHJ5UmFuZ2VzOiByYW5nZSwKKyAgICAgICAgICBieXRlV2lkdGhzOiBieXRlV2lkdGhzLAorICAgICAgICAgIGVudHJ5TnVtOiAwLAorICAgICAgICAgIHN0cmVhbVBvczogc3RyZWFtLnBvcworICAgICAgICB9OworICAgICAgfQorCisgICAgICB0aGlzLnJlYWRYUmVmU3RyZWFtKHN0cmVhbSk7CisgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TdGF0ZTsKKyAgICAgIHJldHVybiBzdHJlYW0uZGljdDsKKyAgICB9LAorICAgIHJlYWRYUmVmU3RyZWFtOiBmdW5jdGlvbiBYUmVmX3JlYWRYUmVmU3RyZWFtKHN0cmVhbSkgeworICAgICAgdmFyIGksIGo7CisgICAgICB2YXIgc3RyZWFtU3RhdGUgPSB0aGlzLnN0cmVhbVN0YXRlOworICAgICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXRlLnN0cmVhbVBvczsKKyAgICAgIHZhciBieXRlV2lkdGhzID0gc3RyZWFtU3RhdGUuYnl0ZVdpZHRoczsKKyAgICAgIHZhciB0eXBlRmllbGRXaWR0aCA9IGJ5dGVXaWR0aHNbMF07CisgICAgICB2YXIgb2Zmc2V0RmllbGRXaWR0aCA9IGJ5dGVXaWR0aHNbMV07CisgICAgICB2YXIgZ2VuZXJhdGlvbkZpZWxkV2lkdGggPSBieXRlV2lkdGhzWzJdOworICAgICAgdmFyIGVudHJ5UmFuZ2VzID0gc3RyZWFtU3RhdGUuZW50cnlSYW5nZXM7CisKKyAgICAgIHdoaWxlIChlbnRyeVJhbmdlcy5sZW5ndGggPiAwKSB7CisgICAgICAgIHZhciBmaXJzdCA9IGVudHJ5UmFuZ2VzWzBdOworICAgICAgICB2YXIgbiA9IGVudHJ5UmFuZ2VzWzFdOworCisgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIobikpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiByYW5nZSBmaWVsZHM6ICIuY29uY2F0KGZpcnN0LCAiLCAiKS5jb25jYXQobikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHR5cGVGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihvZmZzZXRGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihnZW5lcmF0aW9uRmllbGRXaWR0aCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAiLmNvbmNhdChmaXJzdCwgIiwgIikuY29uY2F0KG4pKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IHN0cmVhbVN0YXRlLmVudHJ5TnVtOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgc3RyZWFtU3RhdGUuZW50cnlOdW0gPSBpOworICAgICAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CisgICAgICAgICAgdmFyIHR5cGUgPSAwLAorICAgICAgICAgICAgICBvZmZzZXQgPSAwLAorICAgICAgICAgICAgICBnZW5lcmF0aW9uID0gMDsKKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0eXBlRmllbGRXaWR0aDsgKytqKSB7CisgICAgICAgICAgICB0eXBlID0gdHlwZSA8PCA4IHwgc3RyZWFtLmdldEJ5dGUoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodHlwZUZpZWxkV2lkdGggPT09IDApIHsKKyAgICAgICAgICAgIHR5cGUgPSAxOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvZmZzZXRGaWVsZFdpZHRoOyArK2opIHsKKyAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCA8PCA4IHwgc3RyZWFtLmdldEJ5dGUoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VuZXJhdGlvbkZpZWxkV2lkdGg7ICsraikgeworICAgICAgICAgICAgZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb24gPDwgOCB8IHN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIGVudHJ5ID0ge307CisgICAgICAgICAgZW50cnkub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgIGVudHJ5LmdlbiA9IGdlbmVyYXRpb247CisKKyAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgZW50cnkuZnJlZSA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIGVudHJ5LnVuY29tcHJlc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBlbnRyeSB0eXBlOiAiLmNvbmNhdCh0eXBlKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNbZmlyc3QgKyBpXSkgeworICAgICAgICAgICAgdGhpcy5lbnRyaWVzW2ZpcnN0ICsgaV0gPSBlbnRyeTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW1TdGF0ZS5lbnRyeU51bSA9IDA7CisgICAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CisgICAgICAgIGVudHJ5UmFuZ2VzLnNwbGljZSgwLCAyKTsKKyAgICAgIH0KKyAgICB9LAorICAgIGluZGV4T2JqZWN0czogZnVuY3Rpb24gWFJlZl9pbmRleE9iamVjdHMoKSB7CisgICAgICB2YXIgVEFCID0gMHg5LAorICAgICAgICAgIExGID0gMHhhLAorICAgICAgICAgIENSID0gMHhkLAorICAgICAgICAgIFNQQUNFID0gMHgyMDsKKyAgICAgIHZhciBQRVJDRU5UID0gMHgyNSwKKyAgICAgICAgICBMVCA9IDB4M2M7CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUb2tlbihkYXRhLCBvZmZzZXQpIHsKKyAgICAgICAgdmFyIHRva2VuID0gIiIsCisgICAgICAgICAgICBjaCA9IGRhdGFbb2Zmc2V0XTsKKworICAgICAgICB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUiAmJiBjaCAhPT0gTFQpIHsKKyAgICAgICAgICBpZiAoKytvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOworICAgICAgICAgIGNoID0gZGF0YVtvZmZzZXRdOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBza2lwVW50aWwoZGF0YSwgb2Zmc2V0LCB3aGF0KSB7CisgICAgICAgIHZhciBsZW5ndGggPSB3aGF0Lmxlbmd0aCwKKyAgICAgICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKKyAgICAgICAgdmFyIHNraXBwZWQgPSAwOworCisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBkYXRhTGVuZ3RoKSB7CisgICAgICAgICAgdmFyIGkgPSAwOworCisgICAgICAgICAgd2hpbGUgKGkgPCBsZW5ndGggJiYgZGF0YVtvZmZzZXQgKyBpXSA9PT0gd2hhdFtpXSkgeworICAgICAgICAgICAgKytpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpID49IGxlbmd0aCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgc2tpcHBlZCsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNraXBwZWQ7CisgICAgICB9CisKKyAgICAgIHZhciBvYmpSZWdFeHAgPSAvXihcZCspXHMrKFxkKylccytvYmpcYi87CisgICAgICB2YXIgZW5kb2JqUmVnRXhwID0gL1xiZW5kb2JqW1xiXHNdJC87CisgICAgICB2YXIgbmVzdGVkT2JqUmVnRXhwID0gL1xzKyhcZCtccytcZCtccytvYmpbXGJcczxdKSQvOworICAgICAgdmFyIENIRUNLX0NPTlRFTlRfTEVOR1RIID0gMjU7CisgICAgICB2YXIgdHJhaWxlckJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExNiwgMTE0LCA5NywgMTA1LCAxMDgsIDEwMSwgMTE0XSk7CisgICAgICB2YXIgc3RhcnR4cmVmQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE1LCAxMTYsIDk3LCAxMTQsIDExNiwgMTIwLCAxMTQsIDEwMSwgMTAyXSk7CisgICAgICB2YXIgb2JqQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTExLCA5OCwgMTA2XSk7CisgICAgICB2YXIgeHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzQ3LCA4OCwgODIsIDEwMSwgMTAyXSk7CisgICAgICB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDsKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKKyAgICAgIHN0cmVhbS5wb3MgPSAwOworICAgICAgdmFyIGJ1ZmZlciA9IHN0cmVhbS5nZXRCeXRlcygpOworICAgICAgdmFyIHBvc2l0aW9uID0gc3RyZWFtLnN0YXJ0LAorICAgICAgICAgIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7CisgICAgICB2YXIgdHJhaWxlcnMgPSBbXSwKKyAgICAgICAgICB4cmVmU3RtcyA9IFtdOworCisgICAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGNoID0gYnVmZmVyW3Bvc2l0aW9uXTsKKworICAgICAgICBpZiAoY2ggPT09IFRBQiB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSIHx8IGNoID09PSBTUEFDRSkgeworICAgICAgICAgICsrcG9zaXRpb247CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2ggPT09IFBFUkNFTlQpIHsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICArK3Bvc2l0aW9uOworCisgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaCA9IGJ1ZmZlcltwb3NpdGlvbl07CisgICAgICAgICAgfSB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUik7CisKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0b2tlbiA9IHJlYWRUb2tlbihidWZmZXIsIHBvc2l0aW9uKTsKKyAgICAgICAgdmFyIG07CisKKyAgICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoInhyZWYiKSAmJiAodG9rZW4ubGVuZ3RoID09PSA0IHx8IC9ccy8udGVzdCh0b2tlbls0XSkpKSB7CisgICAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHRyYWlsZXJCeXRlcyk7CisgICAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7CisgICAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHN0YXJ0eHJlZkJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChtID0gb2JqUmVnRXhwLmV4ZWModG9rZW4pKSB7CisgICAgICAgICAgdmFyIG51bSA9IG1bMV0gfCAwLAorICAgICAgICAgICAgICBnZW4gPSBtWzJdIHwgMDsKKworICAgICAgICAgIGlmICghdGhpcy5lbnRyaWVzW251bV0gfHwgdGhpcy5lbnRyaWVzW251bV0uZ2VuID09PSBnZW4pIHsKKyAgICAgICAgICAgIHRoaXMuZW50cmllc1tudW1dID0geworICAgICAgICAgICAgICBvZmZzZXQ6IHBvc2l0aW9uIC0gc3RyZWFtLnN0YXJ0LAorICAgICAgICAgICAgICBnZW46IGdlbiwKKyAgICAgICAgICAgICAgdW5jb21wcmVzc2VkOiB0cnVlCisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBjb250ZW50TGVuZ3RoID0gdm9pZCAwLAorICAgICAgICAgICAgICBzdGFydFBvcyA9IHBvc2l0aW9uICsgdG9rZW4ubGVuZ3RoOworCisgICAgICAgICAgd2hpbGUgKHN0YXJ0UG9zIDwgYnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgdmFyIGVuZFBvcyA9IHN0YXJ0UG9zICsgc2tpcFVudGlsKGJ1ZmZlciwgc3RhcnRQb3MsIG9iakJ5dGVzKSArIDQ7CisgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZW5kUG9zIC0gcG9zaXRpb247CisgICAgICAgICAgICB2YXIgY2hlY2tQb3MgPSBNYXRoLm1heChlbmRQb3MgLSBDSEVDS19DT05URU5UX0xFTkdUSCwgc3RhcnRQb3MpOworICAgICAgICAgICAgdmFyIHRva2VuU3RyID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGJ1ZmZlci5zdWJhcnJheShjaGVja1BvcywgZW5kUG9zKSk7CisKKyAgICAgICAgICAgIGlmIChlbmRvYmpSZWdFeHAudGVzdCh0b2tlblN0cikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB2YXIgb2JqVG9rZW4gPSBuZXN0ZWRPYmpSZWdFeHAuZXhlYyh0b2tlblN0cik7CisKKyAgICAgICAgICAgICAgaWYgKG9ialRva2VuICYmIG9ialRva2VuWzFdKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCdpbmRleE9iamVjdHM6IEZvdW5kIG5ldyAib2JqIiBpbnNpZGUgb2YgYW5vdGhlciAib2JqIiwgJyArICdjYXVzZWQgYnkgbWlzc2luZyAiZW5kb2JqIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKKyAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoIC09IG9ialRva2VuWzFdLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFydFBvcyA9IGVuZFBvczsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgY29udGVudCA9IGJ1ZmZlci5zdWJhcnJheShwb3NpdGlvbiwgcG9zaXRpb24gKyBjb250ZW50TGVuZ3RoKTsKKyAgICAgICAgICB2YXIgeHJlZlRhZ09mZnNldCA9IHNraXBVbnRpbChjb250ZW50LCAwLCB4cmVmQnl0ZXMpOworCisgICAgICAgICAgaWYgKHhyZWZUYWdPZmZzZXQgPCBjb250ZW50TGVuZ3RoICYmIGNvbnRlbnRbeHJlZlRhZ09mZnNldCArIDVdIDwgNjQpIHsKKyAgICAgICAgICAgIHhyZWZTdG1zLnB1c2gocG9zaXRpb24gLSBzdHJlYW0uc3RhcnQpOworICAgICAgICAgICAgdGhpcy54cmVmc3Rtc1twb3NpdGlvbiAtIHN0cmVhbS5zdGFydF0gPSAxOworICAgICAgICAgIH0KKworICAgICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CisgICAgICAgIH0gZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgidHJhaWxlciIpICYmICh0b2tlbi5sZW5ndGggPT09IDcgfHwgL1xzLy50ZXN0KHRva2VuWzddKSkpIHsKKyAgICAgICAgICB0cmFpbGVycy5wdXNoKHBvc2l0aW9uKTsKKyAgICAgICAgICBwb3NpdGlvbiArPSBza2lwVW50aWwoYnVmZmVyLCBwb3NpdGlvbiwgc3RhcnR4cmVmQnl0ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBvc2l0aW9uICs9IHRva2VuLmxlbmd0aCArIDE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGksIGlpOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHhyZWZTdG1zLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKHhyZWZTdG1zW2ldKTsKKyAgICAgICAgdGhpcy5yZWFkWFJlZih0cnVlKTsKKyAgICAgIH0KKworICAgICAgdmFyIHRyYWlsZXJEaWN0OworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHRyYWlsZXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgc3RyZWFtLnBvcyA9IHRyYWlsZXJzW2ldOworICAgICAgICB2YXIgcGFyc2VyID0gbmV3IF9wYXJzZXIuUGFyc2VyKHsKKyAgICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICB4cmVmOiB0aGlzLAorICAgICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSwKKyAgICAgICAgICByZWNvdmVyeU1vZGU6IHRydWUKKyAgICAgICAgfSk7CisgICAgICAgIHZhciBvYmogPSBwYXJzZXIuZ2V0T2JqKCk7CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgInRyYWlsZXIiKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJvb3REaWN0ID0gdm9pZCAwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgcm9vdERpY3QgPSBkaWN0LmdldCgiUm9vdCIpOworICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkocm9vdERpY3QpIHx8ICFyb290RGljdC5oYXMoIlBhZ2VzIikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaWN0LmhhcygiSUQiKSkgeworICAgICAgICAgIHJldHVybiBkaWN0OworICAgICAgICB9CisKKyAgICAgICAgdHJhaWxlckRpY3QgPSBkaWN0OworICAgICAgfQorCisgICAgICBpZiAodHJhaWxlckRpY3QpIHsKKyAgICAgICAgcmV0dXJuIHRyYWlsZXJEaWN0OworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgX3V0aWwuSW52YWxpZFBERkV4Y2VwdGlvbigiSW52YWxpZCBQREYgc3RydWN0dXJlLiIpOworICAgIH0sCisgICAgcmVhZFhSZWY6IGZ1bmN0aW9uIFhSZWZfcmVhZFhSZWYocmVjb3ZlcnlNb2RlKSB7CisgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07CisgICAgICB2YXIgc3RhcnRYUmVmUGFyc2VkQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAodGhpcy5zdGFydFhSZWZRdWV1ZS5sZW5ndGgpIHsKKyAgICAgICAgICB2YXIgc3RhcnRYUmVmID0gdGhpcy5zdGFydFhSZWZRdWV1ZVswXTsKKworICAgICAgICAgIGlmIChzdGFydFhSZWZQYXJzZWRDYWNoZVtzdGFydFhSZWZdKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoInJlYWRYUmVmIC0gc2tpcHBpbmcgWFJlZiB0YWJsZSBzaW5jZSBpdCB3YXMgYWxyZWFkeSBwYXJzZWQuIik7CisgICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdGFydFhSZWZQYXJzZWRDYWNoZVtzdGFydFhSZWZdID0gdHJ1ZTsKKyAgICAgICAgICBzdHJlYW0ucG9zID0gc3RhcnRYUmVmICsgc3RyZWFtLnN0YXJ0OworICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKHN0cmVhbSksCisgICAgICAgICAgICB4cmVmOiB0aGlzLAorICAgICAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgICAgdmFyIG9iaiA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgICAgICB2YXIgZGljdDsKKworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgInhyZWYiKSkgeworICAgICAgICAgICAgZGljdCA9IHRoaXMucHJvY2Vzc1hSZWZUYWJsZShwYXJzZXIpOworCisgICAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkgeworICAgICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvYmogPSBkaWN0LmdldCgiWFJlZlN0bSIpOworCisgICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CisgICAgICAgICAgICAgIHZhciBwb3MgPSBvYmo7CisKKyAgICAgICAgICAgICAgaWYgKCEocG9zIGluIHRoaXMueHJlZnN0bXMpKSB7CisgICAgICAgICAgICAgICAgdGhpcy54cmVmc3Rtc1twb3NdID0gMTsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gocG9zKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CisgICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyc2VyLmdldE9iaigpKSB8fCAhKDAsIF9wcmltaXRpdmVzLmlzQ21kKShwYXJzZXIuZ2V0T2JqKCksICJvYmoiKSB8fCAhKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShvYmogPSBwYXJzZXIuZ2V0T2JqKCkpKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlN0cmVhbShvYmopOworCisgICAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkgeworICAgICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJGYWlsZWQgdG8gcmVhZCBYUmVmIHN0cmVhbSIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBzdHJlYW0gaGVhZGVyIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgb2JqID0gZGljdC5nZXQoIlByZXYiKTsKKworICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChvYmopOworICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKShvYmopKSB7CisgICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqLm51bSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMudG9wRGljdDsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiICsgZSk7CisgICAgICB9CisKKyAgICAgIGlmIChyZWNvdmVyeU1vZGUpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLlhSZWZQYXJzZUV4Y2VwdGlvbigpOworICAgIH0sCisgICAgZ2V0RW50cnk6IGZ1bmN0aW9uIFhSZWZfZ2V0RW50cnkoaSkgeworICAgICAgdmFyIHhyZWZFbnRyeSA9IHRoaXMuZW50cmllc1tpXTsKKworICAgICAgaWYgKHhyZWZFbnRyeSAmJiAheHJlZkVudHJ5LmZyZWUgJiYgeHJlZkVudHJ5Lm9mZnNldCkgeworICAgICAgICByZXR1cm4geHJlZkVudHJ5OworICAgICAgfQorCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorICAgIGZldGNoSWZSZWY6IGZ1bmN0aW9uIFhSZWZfZmV0Y2hJZlJlZihvYmosIHN1cHByZXNzRW5jcnlwdGlvbikgeworICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgeworICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChvYmosIHN1cHByZXNzRW5jcnlwdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvYmo7CisgICAgfSwKKyAgICBmZXRjaDogZnVuY3Rpb24gWFJlZl9mZXRjaChyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikgeworICAgICAgaWYgKCEocmVmIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInJlZiBvYmplY3QgaXMgbm90IGEgcmVmZXJlbmNlIik7CisgICAgICB9CisKKyAgICAgIHZhciBudW0gPSByZWYubnVtOworCisgICAgICB2YXIgY2FjaGVFbnRyeSA9IHRoaXMuX2NhY2hlTWFwLmdldChudW0pOworCisgICAgICBpZiAoY2FjaGVFbnRyeSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGlmIChjYWNoZUVudHJ5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCAmJiAhY2FjaGVFbnRyeS5vYmpJZCkgeworICAgICAgICAgIGNhY2hlRW50cnkub2JqSWQgPSByZWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjYWNoZUVudHJ5OworICAgICAgfQorCisgICAgICB2YXIgeHJlZkVudHJ5ID0gdGhpcy5nZXRFbnRyeShudW0pOworCisgICAgICBpZiAoeHJlZkVudHJ5ID09PSBudWxsKSB7CisgICAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIHhyZWZFbnRyeSk7CisKKyAgICAgICAgcmV0dXJuIHhyZWZFbnRyeTsKKyAgICAgIH0KKworICAgICAgaWYgKHhyZWZFbnRyeS51bmNvbXByZXNzZWQpIHsKKyAgICAgICAgeHJlZkVudHJ5ID0gdGhpcy5mZXRjaFVuY29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHhyZWZFbnRyeSA9IHRoaXMuZmV0Y2hDb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoeHJlZkVudHJ5KSkgeworICAgICAgICB4cmVmRW50cnkub2JqSWQgPSByZWYudG9TdHJpbmcoKTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh4cmVmRW50cnkpKSB7CisgICAgICAgIHhyZWZFbnRyeS5kaWN0Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB4cmVmRW50cnk7CisgICAgfSwKKyAgICBmZXRjaFVuY29tcHJlc3NlZDogZnVuY3Rpb24gZmV0Y2hVbmNvbXByZXNzZWQocmVmLCB4cmVmRW50cnkpIHsKKyAgICAgIHZhciBzdXBwcmVzc0VuY3J5cHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlOworICAgICAgdmFyIGdlbiA9IHJlZi5nZW47CisgICAgICB2YXIgbnVtID0gcmVmLm51bTsKKworICAgICAgaWYgKHhyZWZFbnRyeS5nZW4gIT09IGdlbikgeworICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZkVudHJ5RXhjZXB0aW9uKCJJbmNvbnNpc3RlbnQgZ2VuZXJhdGlvbiBpbiBYUmVmOiAiLmNvbmNhdChyZWYpKTsKKyAgICAgIH0KKworICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0oeHJlZkVudHJ5Lm9mZnNldCArIHRoaXMuc3RyZWFtLnN0YXJ0KTsKKyAgICAgIHZhciBwYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgeHJlZjogdGhpcywKKyAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCisgICAgICB9KTsKKyAgICAgIHZhciBvYmoxID0gcGFyc2VyLmdldE9iaigpOworICAgICAgdmFyIG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgICB2YXIgb2JqMyA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgaWYgKG9iajEgIT09IG51bSB8fCBvYmoyICE9PSBnZW4gfHwgIShvYmozIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSkgeworICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZkVudHJ5RXhjZXB0aW9uKCJCYWQgKHVuY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogIi5jb25jYXQocmVmKSk7CisgICAgICB9CisKKyAgICAgIGlmIChvYmozLmNtZCAhPT0gIm9iaiIpIHsKKyAgICAgICAgaWYgKG9iajMuY21kLnN0YXJ0c1dpdGgoIm9iaiIpKSB7CisgICAgICAgICAgbnVtID0gcGFyc2VJbnQob2JqMy5jbWQuc3Vic3RyaW5nKDMpLCAxMCk7CisKKyAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW0pKSB7CisgICAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24oIkJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAiLmNvbmNhdChyZWYpKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuZW5jcnlwdCAmJiAhc3VwcHJlc3NFbmNyeXB0aW9uKSB7CisgICAgICAgIHhyZWZFbnRyeSA9IHBhcnNlci5nZXRPYmoodGhpcy5lbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShudW0sIGdlbikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeHJlZkVudHJ5ID0gcGFyc2VyLmdldE9iaigpOworICAgICAgfQorCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoeHJlZkVudHJ5KSkgeworICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCB4cmVmRW50cnkpOworICAgICAgfQorCisgICAgICByZXR1cm4geHJlZkVudHJ5OworICAgIH0sCisgICAgZmV0Y2hDb21wcmVzc2VkOiBmdW5jdGlvbiBmZXRjaENvbXByZXNzZWQocmVmLCB4cmVmRW50cnkpIHsKKyAgICAgIHZhciBzdXBwcmVzc0VuY3J5cHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlOworICAgICAgdmFyIHRhYmxlT2Zmc2V0ID0geHJlZkVudHJ5Lm9mZnNldDsKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLmZldGNoKF9wcmltaXRpdmVzLlJlZi5nZXQodGFibGVPZmZzZXQsIDApKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKHN0cmVhbSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJiYWQgT2JqU3RtIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICB2YXIgZmlyc3QgPSBzdHJlYW0uZGljdC5nZXQoIkZpcnN0Iik7CisgICAgICB2YXIgbiA9IHN0cmVhbS5kaWN0LmdldCgiTiIpOworCisgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBmaXJzdCBhbmQgbiBwYXJhbWV0ZXJzIGZvciBPYmpTdG0gc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIHZhciBwYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgeHJlZjogdGhpcywKKyAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCisgICAgICB9KTsKKyAgICAgIHZhciBudW1zID0gbmV3IEFycmF5KG4pOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICB2YXIgbnVtID0gcGFyc2VyLmdldE9iaigpOworCisgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihudW0pKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIG9iamVjdCBudW1iZXIgaW4gdGhlIE9ialN0bSBzdHJlYW06ICIuY29uY2F0KG51bSkpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG9mZnNldCA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBvYmplY3Qgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtOiAiLmNvbmNhdChvZmZzZXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIG51bXNbaV0gPSBudW07CisgICAgICB9CisKKyAgICAgIHZhciBlbnRyaWVzID0gbmV3IEFycmF5KG4pOworCisgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuOyArK19pMikgeworICAgICAgICB2YXIgb2JqID0gcGFyc2VyLmdldE9iaigpOworICAgICAgICBlbnRyaWVzW19pMl0gPSBvYmo7CisKKyAgICAgICAgaWYgKHBhcnNlci5idWYxIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kICYmIHBhcnNlci5idWYxLmNtZCA9PT0gImVuZG9iaiIpIHsKKyAgICAgICAgICBwYXJzZXIuc2hpZnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKG9iaikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBfbnVtID0gbnVtc1tfaTJdLAorICAgICAgICAgICAgZW50cnkgPSB0aGlzLmVudHJpZXNbX251bV07CisKKyAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5Lm9mZnNldCA9PT0gdGFibGVPZmZzZXQgJiYgZW50cnkuZ2VuID09PSBfaTIpIHsKKyAgICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQoX251bSwgb2JqKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB4cmVmRW50cnkgPSBlbnRyaWVzW3hyZWZFbnRyeS5nZW5dOworCisgICAgICBpZiAoeHJlZkVudHJ5ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLlhSZWZFbnRyeUV4Y2VwdGlvbigiQmFkIChjb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAiLmNvbmNhdChyZWYpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHhyZWZFbnRyeTsKKyAgICB9LAorICAgIGZldGNoSWZSZWZBc3luYzogZnVuY3Rpb24gZmV0Y2hJZlJlZkFzeW5jKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKSB7CisgICAgICB2YXIgX3RoaXMzID0gdGhpczsKKworICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgeworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIF90aGlzMy5mZXRjaEFzeW5jKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKSk7CisKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIG9iaik7CisKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlKTsKKyAgICAgIH0pKSgpOworICAgIH0sCisgICAgZmV0Y2hBc3luYzogZnVuY3Rpb24gZmV0Y2hBc3luYyhyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikgeworICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CisKKyAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIF90aGlzNC5mZXRjaChyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikpOworCisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDQ7CisgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NvbnRleHQyWyJjYXRjaCJdKDApOworCisgICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0Mi50MCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyBfY29udGV4dDIudDA7CisKKyAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTA7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5wZGZNYW5hZ2VyLnJlcXVlc3RSYW5nZShfY29udGV4dDIudDAuYmVnaW4sIF9jb250ZXh0Mi50MC5lbmQpOworCisgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIF90aGlzNC5mZXRjaEFzeW5jKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUyLCBudWxsLCBbWzAsIDRdXSk7CisgICAgICB9KSkoKTsKKyAgICB9LAorICAgIGdldENhdGFsb2dPYmo6IGZ1bmN0aW9uIFhSZWZfZ2V0Q2F0YWxvZ09iaigpIHsKKyAgICAgIHJldHVybiB0aGlzLnJvb3Q7CisgICAgfQorICB9OworICByZXR1cm4gWFJlZjsKK30oKTsKKworZXhwb3J0cy5YUmVmID0gWFJlZjsKKwordmFyIE5hbWVPck51bWJlclRyZWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBOYW1lT3JOdW1iZXJUcmVlKHJvb3QsIHhyZWYsIHR5cGUpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTmFtZU9yTnVtYmVyVHJlZSk7CisKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gTmFtZU9yTnVtYmVyVHJlZSkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgTmFtZU9yTnVtYmVyVHJlZS4iKTsKKyAgICB9CisKKyAgICB0aGlzLnJvb3QgPSByb290OworICAgIHRoaXMueHJlZiA9IHhyZWY7CisgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoTmFtZU9yTnVtYmVyVHJlZSwgW3sKKyAgICBrZXk6ICJnZXRBbGwiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGwoKSB7CisgICAgICB2YXIgZGljdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgIGlmICghdGhpcy5yb290KSB7CisgICAgICAgIHJldHVybiBkaWN0OworICAgICAgfQorCisgICAgICB2YXIgeHJlZiA9IHRoaXMueHJlZjsKKyAgICAgIHZhciBwcm9jZXNzZWQgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CisgICAgICBwcm9jZXNzZWQucHV0KHRoaXMucm9vdCk7CisgICAgICB2YXIgcXVldWUgPSBbdGhpcy5yb290XTsKKworICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdmFyIG9iaiA9IHhyZWYuZmV0Y2hJZlJlZihxdWV1ZS5zaGlmdCgpKTsKKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvYmouaGFzKCJLaWRzIikpIHsKKyAgICAgICAgICB2YXIga2lkcyA9IG9iai5nZXQoIktpZHMiKTsKKworICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGtpZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgdmFyIGtpZCA9IGtpZHNbaV07CisKKyAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGtpZCkpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJEdXBsaWNhdGUgZW50cnkgaW4gXCIiLmNvbmNhdCh0aGlzLl90eXBlLCAiXCIgdHJlZS4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHF1ZXVlLnB1c2goa2lkKTsKKyAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoa2lkKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBlbnRyaWVzID0gb2JqLmdldCh0aGlzLl90eXBlKTsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgeworICAgICAgICAgIGZvciAodmFyIF9pMyA9IDAsIF9paSA9IGVudHJpZXMubGVuZ3RoOyBfaTMgPCBfaWk7IF9pMyArPSAyKSB7CisgICAgICAgICAgICBkaWN0W3hyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW19pM10pXSA9IHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW19pMyArIDFdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRpY3Q7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkgeworICAgICAgaWYgKCF0aGlzLnJvb3QpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciB4cmVmID0gdGhpcy54cmVmOworICAgICAgdmFyIGtpZHNPckVudHJpZXMgPSB4cmVmLmZldGNoSWZSZWYodGhpcy5yb290KTsKKyAgICAgIHZhciBsb29wQ291bnQgPSAwOworICAgICAgdmFyIE1BWF9MRVZFTFMgPSAxMDsKKworICAgICAgd2hpbGUgKGtpZHNPckVudHJpZXMuaGFzKCJLaWRzIikpIHsKKyAgICAgICAgaWYgKCsrbG9vcENvdW50ID4gTUFYX0xFVkVMUykgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiU2VhcmNoIGRlcHRoIGxpbWl0IHJlYWNoZWQgZm9yIFwiIi5jb25jYXQodGhpcy5fdHlwZSwgIlwiIHRyZWUuIikpOworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGtpZHMgPSBraWRzT3JFbnRyaWVzLmdldCgiS2lkcyIpOworCisgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGwgPSAwLAorICAgICAgICAgICAgciA9IGtpZHMubGVuZ3RoIC0gMTsKKworICAgICAgICB3aGlsZSAobCA8PSByKSB7CisgICAgICAgICAgdmFyIG0gPSBsICsgciA+PiAxOworICAgICAgICAgIHZhciBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkc1ttXSk7CisgICAgICAgICAgdmFyIGxpbWl0cyA9IGtpZC5nZXQoIkxpbWl0cyIpOworCisgICAgICAgICAgaWYgKGtleSA8IHhyZWYuZmV0Y2hJZlJlZihsaW1pdHNbMF0pKSB7CisgICAgICAgICAgICByID0gbSAtIDE7CisgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPiB4cmVmLmZldGNoSWZSZWYobGltaXRzWzFdKSkgeworICAgICAgICAgICAgbCA9IG0gKyAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBraWRzT3JFbnRyaWVzID0geHJlZi5mZXRjaElmUmVmKGtpZHNbbV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGwgPiByKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGVudHJpZXMgPSBraWRzT3JFbnRyaWVzLmdldCh0aGlzLl90eXBlKTsKKworICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cmllcykpIHsKKyAgICAgICAgdmFyIF9sID0gMCwKKyAgICAgICAgICAgIF9yID0gZW50cmllcy5sZW5ndGggLSAyOworCisgICAgICAgIHdoaWxlIChfbCA8PSBfcikgeworICAgICAgICAgIHZhciB0bXAgPSBfbCArIF9yID4+IDEsCisgICAgICAgICAgICAgIF9tID0gdG1wICsgKHRtcCAmIDEpOworCisgICAgICAgICAgdmFyIGN1cnJlbnRLZXkgPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tfbV0pOworCisgICAgICAgICAgaWYgKGtleSA8IGN1cnJlbnRLZXkpIHsKKyAgICAgICAgICAgIF9yID0gX20gLSAyOworICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID4gY3VycmVudEtleSkgeworICAgICAgICAgICAgX2wgPSBfbSArIDI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tfbSArIDFdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkZhbGxpbmcgYmFjayB0byBhbiBleGhhdXN0aXZlIHNlYXJjaCwgZm9yIGtleSBcIiIuY29uY2F0KGtleSwgIlwiLCAiKSArICJpbiBcIiIuY29uY2F0KHRoaXMuX3R5cGUsICJcIiB0cmVlLiIpKTsKKworICAgICAgICBmb3IgKHZhciBfbTIgPSAwLCBtbSA9IGVudHJpZXMubGVuZ3RoOyBfbTIgPCBtbTsgX20yICs9IDIpIHsKKyAgICAgICAgICB2YXIgX2N1cnJlbnRLZXkgPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tfbTJdKTsKKworICAgICAgICAgIGlmIChfY3VycmVudEtleSA9PT0ga2V5KSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRoZSBcIiIuY29uY2F0KGtleSwgIlwiIGtleSB3YXMgZm91bmQgYXQgYW4gaW5jb3JyZWN0LCAiKSArICJpLmUuIG91dC1vZi1vcmRlciwgcG9zaXRpb24gaW4gXCIiLmNvbmNhdCh0aGlzLl90eXBlLCAiXCIgdHJlZS4iKSk7CisgICAgICAgICAgICByZXR1cm4geHJlZi5mZXRjaElmUmVmKGVudHJpZXNbX20yICsgMV0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gTmFtZU9yTnVtYmVyVHJlZTsKK30oKTsKKwordmFyIE5hbWVUcmVlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTmFtZU9yTnVtYmVyVHJlZSkgeworICBfaW5oZXJpdHMoTmFtZVRyZWUsIF9OYW1lT3JOdW1iZXJUcmVlKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE5hbWVUcmVlKTsKKworICBmdW5jdGlvbiBOYW1lVHJlZShyb290LCB4cmVmKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5hbWVUcmVlKTsKKworICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCByb290LCB4cmVmLCAiTmFtZXMiKTsKKyAgfQorCisgIHJldHVybiBOYW1lVHJlZTsKK30oTmFtZU9yTnVtYmVyVHJlZSk7CisKK3ZhciBOdW1iZXJUcmVlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTmFtZU9yTnVtYmVyVHJlZTIpIHsKKyAgX2luaGVyaXRzKE51bWJlclRyZWUsIF9OYW1lT3JOdW1iZXJUcmVlMik7CisKKyAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoTnVtYmVyVHJlZSk7CisKKyAgZnVuY3Rpb24gTnVtYmVyVHJlZShyb290LCB4cmVmKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE51bWJlclRyZWUpOworCisgICAgcmV0dXJuIF9zdXBlcjIuY2FsbCh0aGlzLCByb290LCB4cmVmLCAiTnVtcyIpOworICB9CisKKyAgcmV0dXJuIE51bWJlclRyZWU7Cit9KE5hbWVPck51bWJlclRyZWUpOworCit2YXIgRmlsZVNwZWMgPSBmdW5jdGlvbiBGaWxlU3BlY0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEZpbGVTcGVjKHJvb3QsIHhyZWYpIHsKKyAgICBpZiAoIXJvb3QgfHwgISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHJvb3QpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLnJvb3QgPSByb290OworCisgICAgaWYgKHJvb3QuaGFzKCJGUyIpKSB7CisgICAgICB0aGlzLmZzID0gcm9vdC5nZXQoIkZTIik7CisgICAgfQorCisgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHJvb3QuaGFzKCJEZXNjIikgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHJvb3QuZ2V0KCJEZXNjIikpIDogIiI7CisKKyAgICBpZiAocm9vdC5oYXMoIlJGIikpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiUmVsYXRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgdGhpcy5jb250ZW50QXZhaWxhYmxlID0gdHJ1ZTsKKworICAgIGlmICghcm9vdC5oYXMoIkVGIikpIHsKKyAgICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgKDAsIF91dGlsLndhcm4pKCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBpY2tQbGF0Zm9ybUl0ZW0oZGljdCkgeworICAgIGlmIChkaWN0LmhhcygiVUYiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJVRiIpOworICAgIH0gZWxzZSBpZiAoZGljdC5oYXMoIkYiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJGIik7CisgICAgfSBlbHNlIGlmIChkaWN0LmhhcygiVW5peCIpKSB7CisgICAgICByZXR1cm4gZGljdC5nZXQoIlVuaXgiKTsKKyAgICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJNYWMiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJNYWMiKTsKKyAgICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJET1MiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJET1MiKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEZpbGVTcGVjLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgZmlsZW5hbWUoKSB7CisgICAgICBpZiAoIXRoaXMuX2ZpbGVuYW1lICYmIHRoaXMucm9vdCkgeworICAgICAgICB2YXIgZmlsZW5hbWUgPSBwaWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdCkgfHwgInVubmFtZWQiOworICAgICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZmlsZW5hbWUpLnJlcGxhY2UoL1xcXFwvZywgIlxcIikucmVwbGFjZSgvXFxcLy9nLCAiLyIpLnJlcGxhY2UoL1xcL2csICIvIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTsKKyAgICB9LAorCisgICAgZ2V0IGNvbnRlbnQoKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudEF2YWlsYWJsZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRSZWYgJiYgdGhpcy5yb290KSB7CisgICAgICAgIHRoaXMuY29udGVudFJlZiA9IHBpY2tQbGF0Zm9ybUl0ZW0odGhpcy5yb290LmdldCgiRUYiKSk7CisgICAgICB9CisKKyAgICAgIHZhciBjb250ZW50ID0gbnVsbDsKKworICAgICAgaWYgKHRoaXMuY29udGVudFJlZikgeworICAgICAgICB2YXIgeHJlZiA9IHRoaXMueHJlZjsKKyAgICAgICAgdmFyIGZpbGVPYmogPSB4cmVmLmZldGNoSWZSZWYodGhpcy5jb250ZW50UmVmKTsKKworICAgICAgICBpZiAoZmlsZU9iaiAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGZpbGVPYmopKSB7CisgICAgICAgICAgY29udGVudCA9IGZpbGVPYmouZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkVtYmVkZGVkIGZpbGUgc3BlY2lmaWNhdGlvbiBwb2ludHMgdG8gbm9uLWV4aXN0aW5nL2ludmFsaWQgIiArICJjb250ZW50Iik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50Iik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjb250ZW50OworICAgIH0sCisKKyAgICBnZXQgc2VyaWFsaXphYmxlKCkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsCisgICAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudAorICAgICAgfTsKKyAgICB9CisKKyAgfTsKKyAgcmV0dXJuIEZpbGVTcGVjOworfSgpOworCitleHBvcnRzLkZpbGVTcGVjID0gRmlsZVNwZWM7CisKK3ZhciBPYmplY3RMb2FkZXIgPSBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIG1heUhhdmVDaGlsZHJlbih2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZiB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh2YWx1ZSk7CisgIH0KKworICBmdW5jdGlvbiBhZGRDaGlsZHJlbihub2RlLCBub2Rlc1RvVmlzaXQpIHsKKyAgICBpZiAobm9kZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKKyAgICAgIG5vZGUgPSBub2RlLmdldFJhd1ZhbHVlcygpOworICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShub2RlKSkgeworICAgICAgbm9kZSA9IG5vZGUuZGljdC5nZXRSYXdWYWx1ZXMoKTsKKyAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIF9pdGVyYXRvcjcgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihub2RlKSwKKyAgICAgICAgX3N0ZXA3OworCisgICAgdHJ5IHsKKyAgICAgIGZvciAoX2l0ZXJhdG9yNy5zKCk7ICEoX3N0ZXA3ID0gX2l0ZXJhdG9yNy5uKCkpLmRvbmU7KSB7CisgICAgICAgIHZhciByYXdWYWx1ZSA9IF9zdGVwNy52YWx1ZTsKKworICAgICAgICBpZiAobWF5SGF2ZUNoaWxkcmVuKHJhd1ZhbHVlKSkgeworICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKHJhd1ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgX2l0ZXJhdG9yNy5lKGVycik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIF9pdGVyYXRvcjcuZigpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIE9iamVjdExvYWRlcihkaWN0LCBrZXlzLCB4cmVmKSB7CisgICAgdGhpcy5kaWN0ID0gZGljdDsKKyAgICB0aGlzLmtleXMgPSBrZXlzOworICAgIHRoaXMueHJlZiA9IHhyZWY7CisgICAgdGhpcy5yZWZTZXQgPSBudWxsOworICB9CisKKyAgT2JqZWN0TG9hZGVyLnByb3RvdHlwZSA9IHsKKyAgICBsb2FkOiBmdW5jdGlvbiBsb2FkKCkgeworICAgICAgdmFyIF90aGlzNSA9IHRoaXM7CisKKyAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoKSB7CisgICAgICAgIHZhciBrZXlzLCBkaWN0LCBub2Rlc1RvVmlzaXQsIGksIGlpLCByYXdWYWx1ZTsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmICghKCFfdGhpczUueHJlZi5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkIHx8IF90aGlzNS54cmVmLnN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCB1bmRlZmluZWQpOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBrZXlzID0gX3RoaXM1LmtleXMsIGRpY3QgPSBfdGhpczUuZGljdDsKKyAgICAgICAgICAgICAgICBfdGhpczUucmVmU2V0ID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOworICAgICAgICAgICAgICAgIG5vZGVzVG9WaXNpdCA9IFtdOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaWkgPSBrZXlzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlID0gZGljdC5nZXRSYXcoa2V5c1tpXSk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKHJhd1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgX3RoaXM1Ll93YWxrKG5vZGVzVG9WaXNpdCkpOworCisgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUzKTsKKyAgICAgIH0pKSgpOworICAgIH0sCisgICAgX3dhbGs6IGZ1bmN0aW9uIF93YWxrKG5vZGVzVG9WaXNpdCkgeworICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CisKKyAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoKSB7CisgICAgICAgIHZhciBub2Rlc1RvUmV2aXNpdCwgcGVuZGluZ1JlcXVlc3RzLCBjdXJyZW50Tm9kZSwgYmFzZVN0cmVhbXMsIGZvdW5kTWlzc2luZ0RhdGEsIGksIGlpLCBzdHJlYW0sIF9pNCwgX2lpMiwgbm9kZTsKKworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgbm9kZXNUb1JldmlzaXQgPSBbXTsKKyAgICAgICAgICAgICAgICBwZW5kaW5nUmVxdWVzdHMgPSBbXTsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKCFub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDIyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBub2Rlc1RvVmlzaXQucG9wKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIV90aGlzNi5yZWZTZXQuaGFzKGN1cnJlbnROb2RlKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA3OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoImNvbnRpbnVlIiwgMik7CisKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gNzsKKworICAgICAgICAgICAgICAgIF90aGlzNi5yZWZTZXQucHV0KGN1cnJlbnROb2RlKTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gX3RoaXM2LnhyZWYuZmV0Y2goY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICBfY29udGV4dDQucHJldiA9IDEyOworICAgICAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsiY2F0Y2giXSg3KTsKKworICAgICAgICAgICAgICAgIGlmIChfY29udGV4dDQudDAgaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRocm93IF9jb250ZXh0NC50MDsKKworICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIG5vZGVzVG9SZXZpc2l0LnB1c2goY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKKyAgICAgICAgICAgICAgICAgIGJlZ2luOiBfY29udGV4dDQudDAuYmVnaW4sCisgICAgICAgICAgICAgICAgICBlbmQ6IF9jb250ZXh0NC50MC5lbmQKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZS5nZXRCYXNlU3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgYmFzZVN0cmVhbXMgPSBjdXJyZW50Tm9kZS5nZXRCYXNlU3RyZWFtcygpOworICAgICAgICAgICAgICAgICAgZm91bmRNaXNzaW5nRGF0YSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGJhc2VTdHJlYW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gYmFzZVN0cmVhbXNbaV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5hbGxDaHVua3NMb2FkZWQgJiYgIXN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTWlzc2luZ0RhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBzdHJlYW0uc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHN0cmVhbS5lbmQKKyAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoZm91bmRNaXNzaW5nRGF0YSkgeworICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUmV2aXNpdC5wdXNoKGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhZGRDaGlsZHJlbihjdXJyZW50Tm9kZSwgbm9kZXNUb1Zpc2l0KTsKKyAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0cy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMjc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI1OworICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczYueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKHBlbmRpbmdSZXF1ZXN0cyk7CisKKyAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICBmb3IgKF9pNCA9IDAsIF9paTIgPSBub2Rlc1RvUmV2aXNpdC5sZW5ndGg7IF9pNCA8IF9paTI7IF9pNCsrKSB7CisgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZXNUb1JldmlzaXRbX2k0XTsKKworICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgX3RoaXM2LnJlZlNldC5yZW1vdmUobm9kZSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIF90aGlzNi5fd2Fsayhub2Rlc1RvUmV2aXNpdCkpOworCisgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgX3RoaXM2LnJlZlNldCA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHVuZGVmaW5lZCk7CisKKyAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWU0LCBudWxsLCBbWzcsIDEyXV0pOworICAgICAgfSkpKCk7CisgICAgfQorICB9OworICByZXR1cm4gT2JqZWN0TG9hZGVyOworfSgpOworCitleHBvcnRzLk9iamVjdExvYWRlciA9IE9iamVjdExvYWRlcjsKKworLyoqKi8gfSksCisvKiAyMDggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QYXJzZXIgPSBleHBvcnRzLkxpbmVhcml6YXRpb24gPSBleHBvcnRzLkxleGVyID0gdm9pZCAwOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA5KTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDIpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK3ZhciBfY2NpdHRfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTApOworCit2YXIgX2piaWcyX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjEyKTsKKwordmFyIF9qcGVnX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjE1KTsKKwordmFyIF9qcHhfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTcpOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIE1BWF9MRU5HVEhfVE9fQ0FDSEUgPSAxMDAwOwordmFyIE1BWF9BRExFUjMyX0xFTkdUSCA9IDU1NTI7CisKK2Z1bmN0aW9uIGNvbXB1dGVBZGxlcjMyKGJ5dGVzKSB7CisgIHZhciBieXRlc0xlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgdmFyIGEgPSAxLAorICAgICAgYiA9IDA7CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlc0xlbmd0aDsgKytpKSB7CisgICAgYSArPSBieXRlc1tpXSAmIDB4ZmY7CisgICAgYiArPSBhOworICB9CisKKyAgcmV0dXJuIGIgJSA2NTUyMSA8PCAxNiB8IGEgJSA2NTUyMTsKK30KKwordmFyIFBhcnNlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBhcnNlcihfcmVmKSB7CisgICAgdmFyIGxleGVyID0gX3JlZi5sZXhlciwKKyAgICAgICAgeHJlZiA9IF9yZWYueHJlZiwKKyAgICAgICAgX3JlZiRhbGxvd1N0cmVhbXMgPSBfcmVmLmFsbG93U3RyZWFtcywKKyAgICAgICAgYWxsb3dTdHJlYW1zID0gX3JlZiRhbGxvd1N0cmVhbXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRhbGxvd1N0cmVhbXMsCisgICAgICAgIF9yZWYkcmVjb3ZlcnlNb2RlID0gX3JlZi5yZWNvdmVyeU1vZGUsCisgICAgICAgIHJlY292ZXJ5TW9kZSA9IF9yZWYkcmVjb3ZlcnlNb2RlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkcmVjb3ZlcnlNb2RlOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhcnNlcik7CisKKyAgICB0aGlzLmxleGVyID0gbGV4ZXI7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLmFsbG93U3RyZWFtcyA9IGFsbG93U3RyZWFtczsKKyAgICB0aGlzLnJlY292ZXJ5TW9kZSA9IHJlY292ZXJ5TW9kZTsKKyAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHRoaXMucmVmaWxsKCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUGFyc2VyLCBbeworICAgIGtleTogInJlZmlsbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlZmlsbCgpIHsKKyAgICAgIHRoaXMuYnVmMSA9IHRoaXMubGV4ZXIuZ2V0T2JqKCk7CisgICAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNoaWZ0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7CisgICAgICBpZiAodGhpcy5idWYyIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kICYmIHRoaXMuYnVmMi5jbWQgPT09ICJJRCIpIHsKKyAgICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOworICAgICAgICB0aGlzLmJ1ZjIgPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOworICAgICAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInRyeVNoaWZ0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gdHJ5U2hpZnQoKSB7CisgICAgICB0cnkgeworICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRPYmoiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPYmooKSB7CisgICAgICB2YXIgY2lwaGVyVHJhbnNmb3JtID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsOworICAgICAgdmFyIGJ1ZjEgPSB0aGlzLmJ1ZjE7CisgICAgICB0aGlzLnNoaWZ0KCk7CisKKyAgICAgIGlmIChidWYxIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSB7CisgICAgICAgIHN3aXRjaCAoYnVmMS5jbWQpIHsKKyAgICAgICAgICBjYXNlICJCSSI6CisgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlSW5saW5lSW1hZ2UoY2lwaGVyVHJhbnNmb3JtKTsKKworICAgICAgICAgIGNhc2UgIlsiOgorICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgICAgICAgIHdoaWxlICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjEsICJdIikgJiYgISgwLCBfcHJpbWl0aXZlcy5pc0VPRikodGhpcy5idWYxKSkgeworICAgICAgICAgICAgICBhcnJheS5wdXNoKHRoaXMuZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKSh0aGlzLmJ1ZjEpKSB7CisgICAgICAgICAgICAgIGlmICghdGhpcy5yZWNvdmVyeU1vZGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkVuZCBvZiBmaWxlIGluc2lkZSBhcnJheSIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisKKyAgICAgICAgICBjYXNlICI8PCI6CisgICAgICAgICAgICB2YXIgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CisKKyAgICAgICAgICAgIHdoaWxlICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjEsICI+PiIpICYmICEoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh0aGlzLmJ1ZjEpKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJNYWxmb3JtZWQgZGljdGlvbmFyeToga2V5IG11c3QgYmUgYSBuYW1lIG9iamVjdCIpOworICAgICAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLmJ1ZjEubmFtZTsKKyAgICAgICAgICAgICAgdGhpcy5zaGlmdCgpOworCisgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGRpY3Quc2V0KGtleSwgdGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlY292ZXJ5TW9kZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRW5kIG9mIGZpbGUgaW5zaWRlIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHJldHVybiBkaWN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjIsICJzdHJlYW0iKSkgeworICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxvd1N0cmVhbXMgPyB0aGlzLm1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKSA6IGRpY3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKKyAgICAgICAgICAgIHJldHVybiBkaWN0OworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBidWYxOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGJ1ZjEpKSB7CisgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuYnVmMSkgJiYgKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjIsICJSIikpIHsKKyAgICAgICAgICB2YXIgcmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldChidWYxLCB0aGlzLmJ1ZjEpOworCisgICAgICAgICAgdGhpcy5zaGlmdCgpOworICAgICAgICAgIHRoaXMuc2hpZnQoKTsKKyAgICAgICAgICByZXR1cm4gcmVmOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1ZjE7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlb2YgYnVmMSA9PT0gInN0cmluZyIpIHsKKyAgICAgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgeworICAgICAgICAgIHJldHVybiBjaXBoZXJUcmFuc2Zvcm0uZGVjcnlwdFN0cmluZyhidWYxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWYxOworICAgICAgfQorCisgICAgICByZXR1cm4gYnVmMTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSkgeworICAgICAgdmFyIEUgPSAweDQ1LAorICAgICAgICAgIEkgPSAweDQ5LAorICAgICAgICAgIFNQQUNFID0gMHgyMCwKKyAgICAgICAgICBMRiA9IDB4YSwKKyAgICAgICAgICBDUiA9IDB4ZCwKKyAgICAgICAgICBOVUwgPSAweDA7CisgICAgICB2YXIgbGV4ZXIgPSB0aGlzLmxleGVyLAorICAgICAgICAgIHN0YXJ0UG9zID0gc3RyZWFtLnBvcywKKyAgICAgICAgICBuID0gMTA7CisgICAgICB2YXIgc3RhdGUgPSAwLAorICAgICAgICAgIGNoLAorICAgICAgICAgIG1heWJlRUlQb3M7CisKKyAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKKyAgICAgICAgaWYgKHN0YXRlID09PSAwKSB7CisgICAgICAgICAgc3RhdGUgPSBjaCA9PT0gRSA/IDEgOiAwOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAxKSB7CisgICAgICAgICAgc3RhdGUgPSBjaCA9PT0gSSA/IDIgOiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHN0YXRlID09PSAyLCAiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQgLSBpbnZhbGlkIHN0YXRlLiIpOworCisgICAgICAgICAgaWYgKGNoID09PSBTUEFDRSB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSKSB7CisgICAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgICAgIHZhciBmb2xsb3dpbmdCeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMobik7CisKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGZvbGxvd2luZ0J5dGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICAgICAgY2ggPSBmb2xsb3dpbmdCeXRlc1tpXTsKKworICAgICAgICAgICAgICBpZiAoY2ggPT09IE5VTCAmJiBmb2xsb3dpbmdCeXRlc1tpICsgMV0gIT09IE5VTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkgeworICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhdGUgIT09IDIpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZXhlci5rbm93bkNvbW1hbmRzKSB7CisgICAgICAgICAgICAgIHZhciBuZXh0T2JqID0gbGV4ZXIucGVla09iaigpOworCisgICAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kICYmICFsZXhlci5rbm93bkNvbW1hbmRzW25leHRPYmouY21kXSkgeworICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCAtIGBsZXhlci5rbm93bkNvbW1hbmRzYCBpcyB1bmRlZmluZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMikgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdGUgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2ggPT09IC0xKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6ICIgKyAiUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aG91dCBmaW5kaW5nIGEgdmFsaWQgRUkgbWFya2VyIik7CisKKyAgICAgICAgaWYgKG1heWJlRUlQb3MpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoJy4uLiB0cnlpbmcgdG8gcmVjb3ZlciBieSB1c2luZyB0aGUgbGFzdCAiRUkiIG9jY3VycmVuY2UuJyk7CisgICAgICAgICAgc3RyZWFtLnNraXAoLShzdHJlYW0ucG9zIC0gbWF5YmVFSVBvcykpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBlbmRPZmZzZXQgPSA0OworICAgICAgc3RyZWFtLnNraXAoLWVuZE9mZnNldCk7CisgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOworICAgICAgc3RyZWFtLnNraXAoZW5kT2Zmc2V0KTsKKworICAgICAgaWYgKCEoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjaCkpIHsKKyAgICAgICAgZW5kT2Zmc2V0LS07CisgICAgICB9CisKKyAgICAgIHJldHVybiBzdHJlYW0ucG9zIC0gZW5kT2Zmc2V0IC0gc3RhcnRQb3M7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7CisgICAgICB2YXIgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOworICAgICAgdmFyIGZvdW5kRU9JID0gZmFsc2UsCisgICAgICAgICAgYiwKKyAgICAgICAgICBtYXJrZXJMZW5ndGg7CisKKyAgICAgIHdoaWxlICgoYiA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgICBpZiAoYiAhPT0gMHhmZikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChzdHJlYW0uZ2V0Qnl0ZSgpKSB7CisgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmY6CisgICAgICAgICAgICBzdHJlYW0uc2tpcCgtMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhkOToKKyAgICAgICAgICAgIGZvdW5kRU9JID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGMwOgorICAgICAgICAgIGNhc2UgMHhjMToKKyAgICAgICAgICBjYXNlIDB4YzI6CisgICAgICAgICAgY2FzZSAweGMzOgorICAgICAgICAgIGNhc2UgMHhjNToKKyAgICAgICAgICBjYXNlIDB4YzY6CisgICAgICAgICAgY2FzZSAweGM3OgorICAgICAgICAgIGNhc2UgMHhjOToKKyAgICAgICAgICBjYXNlIDB4Y2E6CisgICAgICAgICAgY2FzZSAweGNiOgorICAgICAgICAgIGNhc2UgMHhjZDoKKyAgICAgICAgICBjYXNlIDB4Y2U6CisgICAgICAgICAgY2FzZSAweGNmOgorICAgICAgICAgIGNhc2UgMHhjNDoKKyAgICAgICAgICBjYXNlIDB4Y2M6CisgICAgICAgICAgY2FzZSAweGRhOgorICAgICAgICAgIGNhc2UgMHhkYjoKKyAgICAgICAgICBjYXNlIDB4ZGM6CisgICAgICAgICAgY2FzZSAweGRkOgorICAgICAgICAgIGNhc2UgMHhkZToKKyAgICAgICAgICBjYXNlIDB4ZGY6CisgICAgICAgICAgY2FzZSAweGUwOgorICAgICAgICAgIGNhc2UgMHhlMToKKyAgICAgICAgICBjYXNlIDB4ZTI6CisgICAgICAgICAgY2FzZSAweGUzOgorICAgICAgICAgIGNhc2UgMHhlNDoKKyAgICAgICAgICBjYXNlIDB4ZTU6CisgICAgICAgICAgY2FzZSAweGU2OgorICAgICAgICAgIGNhc2UgMHhlNzoKKyAgICAgICAgICBjYXNlIDB4ZTg6CisgICAgICAgICAgY2FzZSAweGU5OgorICAgICAgICAgIGNhc2UgMHhlYToKKyAgICAgICAgICBjYXNlIDB4ZWI6CisgICAgICAgICAgY2FzZSAweGVjOgorICAgICAgICAgIGNhc2UgMHhlZDoKKyAgICAgICAgICBjYXNlIDB4ZWU6CisgICAgICAgICAgY2FzZSAweGVmOgorICAgICAgICAgIGNhc2UgMHhmZToKKyAgICAgICAgICAgIG1hcmtlckxlbmd0aCA9IHN0cmVhbS5nZXRVaW50MTYoKTsKKworICAgICAgICAgICAgaWYgKG1hcmtlckxlbmd0aCA+IDIpIHsKKyAgICAgICAgICAgICAgc3RyZWFtLnNraXAobWFya2VyTGVuZ3RoIC0gMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdHJlYW0uc2tpcCgtMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvdW5kRU9JKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGxlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdGFydFBvczsKKworICAgICAgaWYgKGIgPT09IC0xKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW5saW5lIERDVERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9JIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOworICAgICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKKyAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmluZEFTQ0lJODVEZWNvZGVJbmxpbmVTdHJlYW1FbmQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKKyAgICAgIHZhciBUSUxERSA9IDB4N2UsCisgICAgICAgICAgR1QgPSAweDNlOworICAgICAgdmFyIHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKKyAgICAgIHZhciBjaDsKKworICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgICBpZiAoY2ggPT09IFRJTERFKSB7CisgICAgICAgICAgdmFyIHRpbGRlUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOworCisgICAgICAgICAgd2hpbGUgKCgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGNoKSkgeworICAgICAgICAgICAgc3RyZWFtLnNraXAoKTsKKyAgICAgICAgICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGNoID09PSBHVCkgeworICAgICAgICAgICAgc3RyZWFtLnNraXAoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdHJlYW0ucG9zID4gdGlsZGVQb3MpIHsKKyAgICAgICAgICAgIHZhciBtYXliZUVJID0gc3RyZWFtLnBlZWtCeXRlcygyKTsKKworICAgICAgICAgICAgaWYgKG1heWJlRUlbMF0gPT09IDB4NDUgJiYgbWF5YmVFSVsxXSA9PT0gMHg0OSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGxlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdGFydFBvczsKKworICAgICAgaWYgKGNoID09PSAtMSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CisgICAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOworICAgICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgICAgfQorCisgICAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pOworICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmaW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7CisgICAgICB2YXIgR1QgPSAweDNlOworICAgICAgdmFyIHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKKyAgICAgIHZhciBjaDsKKworICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgICBpZiAoY2ggPT09IEdUKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGxlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdGFydFBvczsKKworICAgICAgaWYgKGNoID09PSAtMSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOworICAgICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKKyAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaW5saW5lU3RyZWFtU2tpcEVJIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSkgeworICAgICAgdmFyIEUgPSAweDQ1LAorICAgICAgICAgIEkgPSAweDQ5OworICAgICAgdmFyIHN0YXRlID0gMCwKKyAgICAgICAgICBjaDsKKworICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgICBpZiAoc3RhdGUgPT09IDApIHsKKyAgICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDEpIHsKKyAgICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIm1ha2VJbmxpbmVJbWFnZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG1ha2VJbmxpbmVJbWFnZShjaXBoZXJUcmFuc2Zvcm0pIHsKKyAgICAgIHZhciBsZXhlciA9IHRoaXMubGV4ZXI7CisgICAgICB2YXIgc3RyZWFtID0gbGV4ZXIuc3RyZWFtOworICAgICAgdmFyIGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOworICAgICAgdmFyIGRpY3RMZW5ndGg7CisKKyAgICAgIHdoaWxlICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjEsICJJRCIpICYmICEoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh0aGlzLmJ1ZjEpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJEaWN0aW9uYXJ5IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBrZXkgPSB0aGlzLmJ1ZjEubmFtZTsKKyAgICAgICAgdGhpcy5zaGlmdCgpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRpY3Quc2V0KGtleSwgdGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7CisgICAgICB9CisKKyAgICAgIGlmIChsZXhlci5iZWdpbklubGluZUltYWdlUG9zICE9PSAtMSkgeworICAgICAgICBkaWN0TGVuZ3RoID0gc3RyZWFtLnBvcyAtIGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7CisgICAgICB9CisKKyAgICAgIHZhciBmaWx0ZXIgPSBkaWN0LmdldCgiRmlsdGVyIiwgIkYiKTsKKyAgICAgIHZhciBmaWx0ZXJOYW1lOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmlsdGVyKSkgeworICAgICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7CisgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgeworICAgICAgICB2YXIgZmlsdGVyWmVybyA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZpbHRlclswXSk7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpbHRlclplcm8pKSB7CisgICAgICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlclplcm8ubmFtZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOworICAgICAgdmFyIGxlbmd0aDsKKworICAgICAgaWYgKGZpbHRlck5hbWUgPT09ICJEQ1REZWNvZGUiIHx8IGZpbHRlck5hbWUgPT09ICJEQ1QiKSB7CisgICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgICAgfSBlbHNlIGlmIChmaWx0ZXJOYW1lID09PSAiQVNDSUk4NURlY29kZSIgfHwgZmlsdGVyTmFtZSA9PT0gIkE4NSIpIHsKKyAgICAgICAgbGVuZ3RoID0gdGhpcy5maW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgICAgfSBlbHNlIGlmIChmaWx0ZXJOYW1lID09PSAiQVNDSUlIZXhEZWNvZGUiIHx8IGZpbHRlck5hbWUgPT09ICJBSHgiKSB7CisgICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZEFTQ0lJSGV4RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CisgICAgICB9CisKKyAgICAgIHZhciBpbWFnZVN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOworICAgICAgdmFyIGNhY2hlS2V5OworCisgICAgICBpZiAobGVuZ3RoIDwgTUFYX0xFTkdUSF9UT19DQUNIRSAmJiBkaWN0TGVuZ3RoIDwgTUFYX0FETEVSMzJfTEVOR1RIKSB7CisgICAgICAgIHZhciBpbWFnZUJ5dGVzID0gaW1hZ2VTdHJlYW0uZ2V0Qnl0ZXMoKTsKKyAgICAgICAgaW1hZ2VTdHJlYW0ucmVzZXQoKTsKKyAgICAgICAgdmFyIGluaXRpYWxTdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOworICAgICAgICBzdHJlYW0ucG9zID0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvczsKKyAgICAgICAgdmFyIGRpY3RCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcyhkaWN0TGVuZ3RoKTsKKyAgICAgICAgc3RyZWFtLnBvcyA9IGluaXRpYWxTdHJlYW1Qb3M7CisgICAgICAgIGNhY2hlS2V5ID0gY29tcHV0ZUFkbGVyMzIoaW1hZ2VCeXRlcykgKyAiXyIgKyBjb21wdXRlQWRsZXIzMihkaWN0Qnl0ZXMpOworICAgICAgICB2YXIgY2FjaGVFbnRyeSA9IHRoaXMuaW1hZ2VDYWNoZVtjYWNoZUtleV07CisKKyAgICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIHRoaXMuYnVmMiA9IF9wcmltaXRpdmVzLkNtZC5nZXQoIkVJIik7CisgICAgICAgICAgdGhpcy5zaGlmdCgpOworICAgICAgICAgIGNhY2hlRW50cnkucmVzZXQoKTsKKyAgICAgICAgICByZXR1cm4gY2FjaGVFbnRyeTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2lwaGVyVHJhbnNmb3JtKSB7CisgICAgICAgIGltYWdlU3RyZWFtID0gY2lwaGVyVHJhbnNmb3JtLmNyZWF0ZVN0cmVhbShpbWFnZVN0cmVhbSwgbGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgaW1hZ2VTdHJlYW0gPSB0aGlzLmZpbHRlcihpbWFnZVN0cmVhbSwgZGljdCwgbGVuZ3RoKTsKKyAgICAgIGltYWdlU3RyZWFtLmRpY3QgPSBkaWN0OworCisgICAgICBpZiAoY2FjaGVLZXkgIT09IHVuZGVmaW5lZCkgeworICAgICAgICBpbWFnZVN0cmVhbS5jYWNoZUtleSA9ICJpbmxpbmVfIi5jb25jYXQobGVuZ3RoLCAiXyIpLmNvbmNhdChjYWNoZUtleSk7CisgICAgICAgIHRoaXMuaW1hZ2VDYWNoZVtjYWNoZUtleV0gPSBpbWFnZVN0cmVhbTsKKyAgICAgIH0KKworICAgICAgdGhpcy5idWYyID0gX3ByaW1pdGl2ZXMuQ21kLmdldCgiRUkiKTsKKyAgICAgIHRoaXMuc2hpZnQoKTsKKyAgICAgIHJldHVybiBpbWFnZVN0cmVhbTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfZmluZFN0cmVhbUxlbmd0aCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9maW5kU3RyZWFtTGVuZ3RoKHN0YXJ0UG9zLCBzaWduYXR1cmUpIHsKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLmxleGVyLnN0cmVhbTsKKyAgICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvczsKKyAgICAgIHZhciBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7CisgICAgICB2YXIgc2lnbmF0dXJlTGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aDsKKworICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBzdHJlYW0uZW5kKSB7CisgICAgICAgIHZhciBzY2FuQnl0ZXMgPSBzdHJlYW0ucGVla0J5dGVzKFNDQU5fQkxPQ0tfTEVOR1RIKTsKKyAgICAgICAgdmFyIHNjYW5MZW5ndGggPSBzY2FuQnl0ZXMubGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOworCisgICAgICAgIGlmIChzY2FuTGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwb3MgPSAwOworCisgICAgICAgIHdoaWxlIChwb3MgPCBzY2FuTGVuZ3RoKSB7CisgICAgICAgICAgdmFyIGogPSAwOworCisgICAgICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyArIGpdID09PSBzaWduYXR1cmVbal0pIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKKyAgICAgICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zOworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBzdGFydFBvczsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwb3MrKzsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmVhbS5wb3MgKz0gc2Nhbkxlbmd0aDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm1ha2VTdHJlYW0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBtYWtlU3RyZWFtKGRpY3QsIGNpcGhlclRyYW5zZm9ybSkgeworICAgICAgdmFyIGxleGVyID0gdGhpcy5sZXhlcjsKKyAgICAgIHZhciBzdHJlYW0gPSBsZXhlci5zdHJlYW07CisgICAgICBsZXhlci5za2lwVG9OZXh0TGluZSgpOworICAgICAgdmFyIHN0YXJ0UG9zID0gc3RyZWFtLnBvcyAtIDE7CisgICAgICB2YXIgbGVuZ3RoID0gZGljdC5nZXQoIkxlbmd0aCIpOworCisgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkJhZCBsZW5ndGggXCIiLmNvbmNhdChsZW5ndGgsICJcIiBpbiBzdHJlYW0iKSk7CisgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICB9CisKKyAgICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvcyArIGxlbmd0aDsKKyAgICAgIGxleGVyLm5leHRDaGFyKCk7CisKKyAgICAgIGlmICh0aGlzLnRyeVNoaWZ0KCkgJiYgKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjIsICJlbmRzdHJlYW0iKSkgeworICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgRU5EU1RSRUFNX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDY1LCAweDZFLCAweDY0LCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDYxLCAweDZEXSk7CisKKyAgICAgICAgdmFyIGFjdHVhbExlbmd0aCA9IHRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MsIEVORFNUUkVBTV9TSUdOQVRVUkUpOworCisgICAgICAgIGlmIChhY3R1YWxMZW5ndGggPCAwKSB7CisgICAgICAgICAgdmFyIE1BWF9UUlVOQ0FUSU9OID0gMTsKKworICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IE1BWF9UUlVOQ0FUSU9OOyBpKyspIHsKKyAgICAgICAgICAgIHZhciBlbmQgPSBFTkRTVFJFQU1fU0lHTkFUVVJFLmxlbmd0aCAtIGk7CisgICAgICAgICAgICB2YXIgVFJVTkNBVEVEX1NJR05BVFVSRSA9IEVORFNUUkVBTV9TSUdOQVRVUkUuc2xpY2UoMCwgZW5kKTsKKworICAgICAgICAgICAgdmFyIG1heWJlTGVuZ3RoID0gdGhpcy5fZmluZFN0cmVhbUxlbmd0aChzdGFydFBvcywgVFJVTkNBVEVEX1NJR05BVFVSRSk7CisKKyAgICAgICAgICAgIGlmIChtYXliZUxlbmd0aCA+PSAwKSB7CisgICAgICAgICAgICAgIHZhciBsYXN0Qnl0ZSA9IHN0cmVhbS5wZWVrQnl0ZXMoZW5kICsgMSlbZW5kXTsKKworICAgICAgICAgICAgICBpZiAoISgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGxhc3RCeXRlKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJGb3VuZCBcIiIuY29uY2F0KCgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShUUlVOQ0FURURfU0lHTkFUVVJFKSwgIlwiIHdoZW4gIikgKyAic2VhcmNoaW5nIGZvciBlbmRzdHJlYW0gY29tbWFuZC4iKTsKKyAgICAgICAgICAgICAgYWN0dWFsTGVuZ3RoID0gbWF5YmVMZW5ndGg7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChhY3R1YWxMZW5ndGggPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1pc3NpbmcgZW5kc3RyZWFtIGNvbW1hbmQuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGVuZ3RoID0gYWN0dWFsTGVuZ3RoOworICAgICAgICBsZXhlci5uZXh0Q2hhcigpOworICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgIHRoaXMuc2hpZnQoKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5zaGlmdCgpOworICAgICAgc3RyZWFtID0gc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MsIGxlbmd0aCwgZGljdCk7CisKKyAgICAgIGlmIChjaXBoZXJUcmFuc2Zvcm0pIHsKKyAgICAgICAgc3RyZWFtID0gY2lwaGVyVHJhbnNmb3JtLmNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCk7CisgICAgICB9CisKKyAgICAgIHN0cmVhbSA9IHRoaXMuZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKTsKKyAgICAgIHN0cmVhbS5kaWN0ID0gZGljdDsKKyAgICAgIHJldHVybiBzdHJlYW07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmlsdGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKSB7CisgICAgICB2YXIgZmlsdGVyID0gZGljdC5nZXQoIkZpbHRlciIsICJGIik7CisgICAgICB2YXIgcGFyYW1zID0gZGljdC5nZXQoIkRlY29kZVBhcm1zIiwgIkRQIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmaWx0ZXIpKSB7CisgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcykpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIi9EZWNvZGVQYXJtcyBzaG91bGQgbm90IGNvbnRhaW4gYW4gQXJyYXksICIgKyAid2hlbiAvRmlsdGVyIGNvbnRhaW5zIGEgTmFtZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzLm1ha2VGaWx0ZXIoc3RyZWFtLCBmaWx0ZXIubmFtZSwgbGVuZ3RoLCBwYXJhbXMpOworICAgICAgfQorCisgICAgICB2YXIgbWF5YmVMZW5ndGggPSBsZW5ndGg7CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHsKKyAgICAgICAgdmFyIGZpbHRlckFycmF5ID0gZmlsdGVyOworICAgICAgICB2YXIgcGFyYW1zQXJyYXkgPSBwYXJhbXM7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZmlsdGVyQXJyYXkubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIGZpbHRlciA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZpbHRlckFycmF5W2ldKTsKKworICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmlsdGVyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgZmlsdGVyIG5hbWUgXCIiLmNvbmNhdChmaWx0ZXIsICJcIiIpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwYXJhbXMgPSBudWxsOworCisgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zQXJyYXkpICYmIGkgaW4gcGFyYW1zQXJyYXkpIHsKKyAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHBhcmFtc0FycmF5W2ldKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHJlYW0gPSB0aGlzLm1ha2VGaWx0ZXIoc3RyZWFtLCBmaWx0ZXIubmFtZSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CisgICAgICAgICAgbWF5YmVMZW5ndGggPSBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBzdHJlYW07CisgICAgfQorICB9LCB7CisgICAga2V5OiAibWFrZUZpbHRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG1ha2VGaWx0ZXIoc3RyZWFtLCBuYW1lLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CisgICAgICBpZiAobWF5YmVMZW5ndGggPT09IDApIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJFbXB0eSBcIiIuY29uY2F0KG5hbWUsICJcIiBzdHJlYW0uIikpOworICAgICAgICByZXR1cm4gbmV3IF9zdHJlYW0uTnVsbFN0cmVhbSgpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICB2YXIgeHJlZlN0cmVhbVN0YXRzID0gdGhpcy54cmVmLnN0YXRzLnN0cmVhbVR5cGVzOworCisgICAgICAgIGlmIChuYW1lID09PSAiRmxhdGVEZWNvZGUiIHx8IG5hbWUgPT09ICJGbCIpIHsKKyAgICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5GTEFURV0gPSB0cnVlOworCisgICAgICAgICAgaWYgKHBhcmFtcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLlByZWRpY3RvclN0cmVhbShuZXcgX3N0cmVhbS5GbGF0ZVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLkZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgPT09ICJMWldEZWNvZGUiIHx8IG5hbWUgPT09ICJMWlciKSB7CisgICAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuTFpXXSA9IHRydWU7CisgICAgICAgICAgdmFyIGVhcmx5Q2hhbmdlID0gMTsKKworICAgICAgICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzKCJFYXJseUNoYW5nZSIpKSB7CisgICAgICAgICAgICAgIGVhcmx5Q2hhbmdlID0gcGFyYW1zLmdldCgiRWFybHlDaGFuZ2UiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLlByZWRpY3RvclN0cmVhbShuZXcgX3N0cmVhbS5MWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gbmV3IF9zdHJlYW0uTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09PSAiRENURGVjb2RlIiB8fCBuYW1lID09PSAiRENUIikgeworICAgICAgICAgIHhyZWZTdHJlYW1TdGF0c1tfdXRpbC5TdHJlYW1UeXBlLkRDVF0gPSB0cnVlOworICAgICAgICAgIHJldHVybiBuZXcgX2pwZWdfc3RyZWFtLkpwZWdTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgc3RyZWFtLmRpY3QsIHBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmFtZSA9PT0gIkpQWERlY29kZSIgfHwgbmFtZSA9PT0gIkpQWCIpIHsKKyAgICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5KUFhdID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gbmV3IF9qcHhfc3RyZWFtLkpweFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBzdHJlYW0uZGljdCwgcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09PSAiQVNDSUk4NURlY29kZSIgfHwgbmFtZSA9PT0gIkE4NSIpIHsKKyAgICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5BODVdID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gbmV3IF9zdHJlYW0uQXNjaWk4NVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09PSAiQVNDSUlIZXhEZWNvZGUiIHx8IG5hbWUgPT09ICJBSHgiKSB7CisgICAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuQUhYXSA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLkFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgPT09ICJDQ0lUVEZheERlY29kZSIgfHwgbmFtZSA9PT0gIkNDRiIpIHsKKyAgICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5DQ0ZdID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gbmV3IF9jY2l0dF9zdHJlYW0uQ0NJVFRGYXhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09PSAiUnVuTGVuZ3RoRGVjb2RlIiB8fCBuYW1lID09PSAiUkwiKSB7CisgICAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuUkxYXSA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLlJ1bkxlbmd0aFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09PSAiSkJJRzJEZWNvZGUiKSB7CisgICAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuSkJJR10gPSB0cnVlOworICAgICAgICAgIHJldHVybiBuZXcgX2piaWcyX3N0cmVhbS5KYmlnMlN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBzdHJlYW0uZGljdCwgcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRmlsdGVyIFwiIi5jb25jYXQobmFtZSwgIlwiIGlzIG5vdCBzdXBwb3J0ZWQuIikpOworICAgICAgICByZXR1cm4gc3RyZWFtOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBzdHJlYW06IFwiIi5jb25jYXQoZXgsICJcIiIpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLk51bGxTdHJlYW0oKTsKKyAgICAgIH0KKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUGFyc2VyOworfSgpOworCitleHBvcnRzLlBhcnNlciA9IFBhcnNlcjsKK3ZhciBzcGVjaWFsQ2hhcnMgPSBbMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07CisKK2Z1bmN0aW9uIHRvSGV4RGlnaXQoY2gpIHsKKyAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkgeworICAgIHJldHVybiBjaCAmIDB4MGY7CisgIH0KKworICBpZiAoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDQ2IHx8IGNoID49IDB4NjEgJiYgY2ggPD0gMHg2NikgeworICAgIHJldHVybiAoY2ggJiAweDBmKSArIDk7CisgIH0KKworICByZXR1cm4gLTE7Cit9CisKK3ZhciBMZXhlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIExleGVyKHN0cmVhbSkgeworICAgIHZhciBrbm93bkNvbW1hbmRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExleGVyKTsKKworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICB0aGlzLnN0ckJ1ZiA9IFtdOworICAgIHRoaXMua25vd25Db21tYW5kcyA9IGtub3duQ29tbWFuZHM7CisgICAgdGhpcy5faGV4U3RyaW5nTnVtV2FybiA9IDA7CisgICAgdGhpcy5iZWdpbklubGluZUltYWdlUG9zID0gLTE7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoTGV4ZXIsIFt7CisgICAga2V5OiAibmV4dENoYXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBuZXh0Q2hhcigpIHsKKyAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBlZWtDaGFyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcGVla0NoYXIoKSB7CisgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucGVla0J5dGUoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXROdW1iZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROdW1iZXIoKSB7CisgICAgICB2YXIgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworICAgICAgdmFyIGVOb3RhdGlvbiA9IGZhbHNlOworICAgICAgdmFyIGRpdmlkZUJ5ID0gMDsKKyAgICAgIHZhciBzaWduID0gMDsKKworICAgICAgaWYgKGNoID09PSAweDJkKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisKKyAgICAgICAgaWYgKGNoID09PSAweDJkKSB7CisgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MmIpIHsKKyAgICAgICAgc2lnbiA9IDE7CisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgfQorCisgICAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKKyAgICAgICAgZG8geworICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICB9IHdoaWxlIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCk7CisgICAgICB9CisKKyAgICAgIGlmIChjaCA9PT0gMHgyZSkgeworICAgICAgICBkaXZpZGVCeSA9IDEwOworICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNoIDwgMHgzMCB8fCBjaCA+IDB4MzkpIHsKKyAgICAgICAgaWYgKGRpdmlkZUJ5ID09PSAxMCAmJiBzaWduID09PSAwICYmICgoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjaCkgfHwgY2ggPT09IC0xKSkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTGV4ZXIuZ2V0TnVtYmVyIC0gdHJlYXRpbmcgYSBzaW5nbGUgZGVjaW1hbCBwb2ludCBhcyB6ZXJvLiIpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIG51bWJlcjogIi5jb25jYXQoU3RyaW5nLmZyb21DaGFyQ29kZShjaCksICIgKGNoYXJDb2RlICIpLmNvbmNhdChjaCwgIikiKSk7CisgICAgICB9CisKKyAgICAgIHNpZ24gPSBzaWduIHx8IDE7CisgICAgICB2YXIgYmFzZVZhbHVlID0gY2ggLSAweDMwOworICAgICAgdmFyIHBvd2VyVmFsdWUgPSAwOworICAgICAgdmFyIHBvd2VyVmFsdWVTaWduID0gMTsKKworICAgICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgeworICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB7CisgICAgICAgICAgdmFyIGN1cnJlbnREaWdpdCA9IGNoIC0gMHgzMDsKKworICAgICAgICAgIGlmIChlTm90YXRpb24pIHsKKyAgICAgICAgICAgIHBvd2VyVmFsdWUgPSBwb3dlclZhbHVlICogMTAgKyBjdXJyZW50RGlnaXQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkaXZpZGVCeSAhPT0gMCkgeworICAgICAgICAgICAgICBkaXZpZGVCeSAqPSAxMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmFzZVZhbHVlID0gYmFzZVZhbHVlICogMTAgKyBjdXJyZW50RGlnaXQ7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDJlKSB7CisgICAgICAgICAgaWYgKGRpdmlkZUJ5ID09PSAwKSB7CisgICAgICAgICAgICBkaXZpZGVCeSA9IDE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyZCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlIik7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NDUgfHwgY2ggPT09IDB4NjUpIHsKKyAgICAgICAgICBjaCA9IHRoaXMucGVla0NoYXIoKTsKKworICAgICAgICAgIGlmIChjaCA9PT0gMHgyYiB8fCBjaCA9PT0gMHgyZCkgeworICAgICAgICAgICAgcG93ZXJWYWx1ZVNpZ24gPSBjaCA9PT0gMHgyZCA/IC0xIDogMTsKKyAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoIDwgMHgzMCB8fCBjaCA+IDB4MzkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGVOb3RhdGlvbiA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CisgICAgICAgIGJhc2VWYWx1ZSAvPSBkaXZpZGVCeTsKKyAgICAgIH0KKworICAgICAgaWYgKGVOb3RhdGlvbikgeworICAgICAgICBiYXNlVmFsdWUgKj0gTWF0aC5wb3coMTAsIHBvd2VyVmFsdWVTaWduICogcG93ZXJWYWx1ZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBzaWduICogYmFzZVZhbHVlOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFN0cmluZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN0cmluZygpIHsKKyAgICAgIHZhciBudW1QYXJlbiA9IDE7CisgICAgICB2YXIgZG9uZSA9IGZhbHNlOworICAgICAgdmFyIHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOworICAgICAgc3RyQnVmLmxlbmd0aCA9IDA7CisgICAgICB2YXIgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciBjaGFyQnVmZmVyZWQgPSBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKGNoIHwgMCkgeworICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4Mjg6CisgICAgICAgICAgICArK251bVBhcmVuOworICAgICAgICAgICAgc3RyQnVmLnB1c2goIigiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDI5OgorICAgICAgICAgICAgaWYgKC0tbnVtUGFyZW4gPT09IDApIHsKKyAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDVjOgorICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDB4NmU6CisgICAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAweDcyOgorICAgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcciIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMHg3NDoKKyAgICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXHQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDB4NjI6CisgICAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxiIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAweDY2OgorICAgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcZiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMHg1YzoKKyAgICAgICAgICAgICAgY2FzZSAweDI4OgorICAgICAgICAgICAgICBjYXNlIDB4Mjk6CisgICAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMHgzMDoKKyAgICAgICAgICAgICAgY2FzZSAweDMxOgorICAgICAgICAgICAgICBjYXNlIDB4MzI6CisgICAgICAgICAgICAgIGNhc2UgMHgzMzoKKyAgICAgICAgICAgICAgY2FzZSAweDM0OgorICAgICAgICAgICAgICBjYXNlIDB4MzU6CisgICAgICAgICAgICAgIGNhc2UgMHgzNjoKKyAgICAgICAgICAgICAgY2FzZSAweDM3OgorICAgICAgICAgICAgICAgIHZhciB4ID0gY2ggJiAweDBmOworICAgICAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM3KSB7CisgICAgICAgICAgICAgICAgICB4ID0gKHggPDwgMykgKyAoY2ggJiAweDBmKTsKKyAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM3KSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB4ID0gKHggPDwgMykgKyAoY2ggJiAweDBmKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDB4MGQ6CisgICAgICAgICAgICAgICAgaWYgKHRoaXMucGVla0NoYXIoKSA9PT0gMHgwYSkgeworICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMHgwYToKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjaGFyQnVmZmVyZWQpIHsKKyAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gc3RyQnVmLmpvaW4oIiIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldE5hbWUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYW1lKCkgeworICAgICAgdmFyIGNoLCBwcmV2aW91c0NoOworICAgICAgdmFyIHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOworICAgICAgc3RyQnVmLmxlbmd0aCA9IDA7CisKKyAgICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgIXNwZWNpYWxDaGFyc1tjaF0pIHsKKyAgICAgICAgaWYgKGNoID09PSAweDIzKSB7CisgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisKKyAgICAgICAgICBpZiAoc3BlY2lhbENoYXJzW2NoXSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJMZXhlcl9nZXROYW1lOiAiICsgIk5VTUJFUiBTSUdOICgjKSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBoZXhhZGVjaW1hbCBudW1iZXIuIik7CisgICAgICAgICAgICBzdHJCdWYucHVzaCgiIyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIHggPSB0b0hleERpZ2l0KGNoKTsKKworICAgICAgICAgIGlmICh4ICE9PSAtMSkgeworICAgICAgICAgICAgcHJldmlvdXNDaCA9IGNoOworICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICB2YXIgeDIgPSB0b0hleERpZ2l0KGNoKTsKKworICAgICAgICAgICAgaWYgKHgyID09PSAtMSkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkxleGVyX2dldE5hbWU6IElsbGVnYWwgZGlnaXQgKCIuY29uY2F0KFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpLCAiKSAiKSArICJpbiBoZXhhZGVjaW1hbCBudW1iZXIuIik7CisgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIiwgU3RyaW5nLmZyb21DaGFyQ29kZShwcmV2aW91c0NoKSk7CisKKyAgICAgICAgICAgICAgaWYgKHNwZWNpYWxDaGFyc1tjaF0pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoeCA8PCA0IHwgeDIpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyQnVmLnB1c2goIiMiLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc3RyQnVmLmxlbmd0aCA+IDEyNykgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIk5hbWUgdG9rZW4gaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZCBieSB0aGUgc3BlYzogIi5jb25jYXQoc3RyQnVmLmxlbmd0aCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoc3RyQnVmLmpvaW4oIiIpKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfaGV4U3RyaW5nV2FybiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9oZXhTdHJpbmdXYXJuKGNoKSB7CisgICAgICB2YXIgTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4gPSA1OworCisgICAgICBpZiAodGhpcy5faGV4U3RyaW5nTnVtV2FybisrID09PSBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgeworICAgICAgICAoMCwgX3V0aWwud2FybikoImdldEhleFN0cmluZyAtIGlnbm9yaW5nIGFkZGl0aW9uYWwgaW52YWxpZCBjaGFyYWN0ZXJzLiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID4gTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4pIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAoMCwgX3V0aWwud2FybikoImdldEhleFN0cmluZyAtIGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyOiAiLmNvbmNhdChjaCkpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEhleFN0cmluZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEhleFN0cmluZygpIHsKKyAgICAgIHZhciBzdHJCdWYgPSB0aGlzLnN0ckJ1ZjsKKyAgICAgIHN0ckJ1Zi5sZW5ndGggPSAwOworICAgICAgdmFyIGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKKyAgICAgIHZhciBpc0ZpcnN0SGV4ID0gdHJ1ZTsKKyAgICAgIHZhciBmaXJzdERpZ2l0LCBzZWNvbmREaWdpdDsKKyAgICAgIHRoaXMuX2hleFN0cmluZ051bVdhcm4gPSAwOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoY2ggPCAwKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnRlcm1pbmF0ZWQgaGV4IHN0cmluZyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDNlKSB7CisgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHNwZWNpYWxDaGFyc1tjaF0gPT09IDEpIHsKKyAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaXNGaXJzdEhleCkgeworICAgICAgICAgICAgZmlyc3REaWdpdCA9IHRvSGV4RGlnaXQoY2gpOworCisgICAgICAgICAgICBpZiAoZmlyc3REaWdpdCA9PT0gLTEpIHsKKyAgICAgICAgICAgICAgdGhpcy5faGV4U3RyaW5nV2FybihjaCk7CisKKyAgICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWNvbmREaWdpdCA9IHRvSGV4RGlnaXQoY2gpOworCisgICAgICAgICAgICBpZiAoc2Vjb25kRGlnaXQgPT09IC0xKSB7CisgICAgICAgICAgICAgIHRoaXMuX2hleFN0cmluZ1dhcm4oY2gpOworCisgICAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShmaXJzdERpZ2l0IDw8IDQgfCBzZWNvbmREaWdpdCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlzRmlyc3RIZXggPSAhaXNGaXJzdEhleDsKKyAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gc3RyQnVmLmpvaW4oIiIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldE9iaiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9iaigpIHsKKyAgICAgIHZhciBjb21tZW50ID0gZmFsc2U7CisgICAgICB2YXIgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoY2ggPCAwKSB7CisgICAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkVPRjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb21tZW50KSB7CisgICAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CisgICAgICAgICAgICBjb21tZW50ID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CisgICAgICAgICAgY29tbWVudCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3BlY2lhbENoYXJzW2NoXSAhPT0gMSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoY2ggfCAwKSB7CisgICAgICAgIGNhc2UgMHgzMDoKKyAgICAgICAgY2FzZSAweDMxOgorICAgICAgICBjYXNlIDB4MzI6CisgICAgICAgIGNhc2UgMHgzMzoKKyAgICAgICAgY2FzZSAweDM0OgorICAgICAgICBjYXNlIDB4MzU6CisgICAgICAgIGNhc2UgMHgzNjoKKyAgICAgICAgY2FzZSAweDM3OgorICAgICAgICBjYXNlIDB4Mzg6CisgICAgICAgIGNhc2UgMHgzOToKKyAgICAgICAgY2FzZSAweDJiOgorICAgICAgICBjYXNlIDB4MmQ6CisgICAgICAgIGNhc2UgMHgyZToKKyAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTsKKworICAgICAgICBjYXNlIDB4Mjg6CisgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCk7CisKKyAgICAgICAgY2FzZSAweDJmOgorICAgICAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoKTsKKworICAgICAgICBjYXNlIDB4NWI6CisgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJbIik7CisKKyAgICAgICAgY2FzZSAweDVkOgorICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgiXSIpOworCisgICAgICAgIGNhc2UgMHgzYzoKKyAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICAgIGlmIChjaCA9PT0gMHgzYykgeworICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIjw8Iik7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGV4U3RyaW5nKCk7CisKKyAgICAgICAgY2FzZSAweDNlOgorICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgICAgICAgaWYgKGNoID09PSAweDNlKSB7CisgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgiPj4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgiPiIpOworCisgICAgICAgIGNhc2UgMHg3YjoKKyAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoInsiKTsKKworICAgICAgICBjYXNlIDB4N2Q6CisgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJ9Iik7CisKKyAgICAgICAgY2FzZSAweDI5OgorICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIklsbGVnYWwgY2hhcmFjdGVyOiAiLmNvbmNhdChjaCkpOworICAgICAgfQorCisgICAgICB2YXIgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisgICAgICB2YXIga25vd25Db21tYW5kcyA9IHRoaXMua25vd25Db21tYW5kczsKKyAgICAgIHZhciBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHMgJiYga25vd25Db21tYW5kc1tzdHJdICE9PSB1bmRlZmluZWQ7CisKKyAgICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgIXNwZWNpYWxDaGFyc1tjaF0pIHsKKyAgICAgICAgdmFyIHBvc3NpYmxlQ29tbWFuZCA9IHN0ciArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOworCisgICAgICAgIGlmIChrbm93bkNvbW1hbmRGb3VuZCAmJiBrbm93bkNvbW1hbmRzW3Bvc3NpYmxlQ29tbWFuZF0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEyOCkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogIi5jb25jYXQoc3RyLmxlbmd0aCkpOworICAgICAgICB9CisKKyAgICAgICAgc3RyID0gcG9zc2libGVDb21tYW5kOworICAgICAgICBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHMgJiYga25vd25Db21tYW5kc1tzdHJdICE9PSB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIGlmIChzdHIgPT09ICJ0cnVlIikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0ciA9PT0gImZhbHNlIikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChzdHIgPT09ICJudWxsIikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHN0ciA9PT0gIkJJIikgeworICAgICAgICB0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3MgPSB0aGlzLnN0cmVhbS5wb3M7CisgICAgICB9CisKKyAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KHN0cik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicGVla09iaiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHBlZWtPYmooKSB7CisgICAgICB2YXIgc3RyZWFtUG9zID0gdGhpcy5zdHJlYW0ucG9zLAorICAgICAgICAgIGN1cnJlbnRDaGFyID0gdGhpcy5jdXJyZW50Q2hhciwKKyAgICAgICAgICBiZWdpbklubGluZUltYWdlUG9zID0gdGhpcy5iZWdpbklubGluZUltYWdlUG9zOworICAgICAgdmFyIG5leHRPYmo7CisKKyAgICAgIHRyeSB7CisgICAgICAgIG5leHRPYmogPSB0aGlzLmdldE9iaigpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgicGVla09iajogIi5jb25jYXQoZXgpKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5zdHJlYW0ucG9zID0gc3RyZWFtUG9zOworICAgICAgdGhpcy5jdXJyZW50Q2hhciA9IGN1cnJlbnRDaGFyOworICAgICAgdGhpcy5iZWdpbklubGluZUltYWdlUG9zID0gYmVnaW5JbmxpbmVJbWFnZVBvczsKKyAgICAgIHJldHVybiBuZXh0T2JqOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNraXBUb05leHRMaW5lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2tpcFRvTmV4dExpbmUoKSB7CisgICAgICB2YXIgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworCisgICAgICB3aGlsZSAoY2ggPj0gMCkgeworICAgICAgICBpZiAoY2ggPT09IDB4MGQpIHsKKyAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICAgIGlmIChjaCA9PT0gMHgwYSkgeworICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDBhKSB7CisgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICB9CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIExleGVyOworfSgpOworCitleHBvcnRzLkxleGVyID0gTGV4ZXI7CisKK3ZhciBMaW5lYXJpemF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gTGluZWFyaXphdGlvbigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGluZWFyaXphdGlvbik7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoTGluZWFyaXphdGlvbiwgbnVsbCwgW3sKKyAgICBrZXk6ICJjcmVhdGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoc3RyZWFtKSB7CisgICAgICBmdW5jdGlvbiBnZXRJbnQobGluRGljdCwgbmFtZSkgeworICAgICAgICB2YXIgYWxsb3daZXJvVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlOworICAgICAgICB2YXIgb2JqID0gbGluRGljdC5nZXQobmFtZSk7CisKKyAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSAmJiAoYWxsb3daZXJvVmFsdWUgPyBvYmogPj0gMCA6IG9iaiA+IDApKSB7CisgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIFwiIi5jb25jYXQobmFtZSwgIlwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiAiKSArICJkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIGdldEhpbnRzKGxpbkRpY3QpIHsKKyAgICAgICAgdmFyIGhpbnRzID0gbGluRGljdC5nZXQoIkgiKTsKKyAgICAgICAgdmFyIGhpbnRzTGVuZ3RoOworCisgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhpbnRzKSAmJiAoKGhpbnRzTGVuZ3RoID0gaGludHMubGVuZ3RoKSA9PT0gMiB8fCBoaW50c0xlbmd0aCA9PT0gNCkpIHsKKyAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgaGludHNMZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIHZhciBoaW50ID0gaGludHNbaW5kZXhdOworCisgICAgICAgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKGhpbnQpICYmIGhpbnQgPiAwKSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhpbnQgKCIuY29uY2F0KGluZGV4LCAiKSBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBoaW50czsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSGludCBhcnJheSBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CisgICAgICB9CisKKyAgICAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKHsKKyAgICAgICAgbGV4ZXI6IG5ldyBMZXhlcihzdHJlYW0pLAorICAgICAgICB4cmVmOiBudWxsCisgICAgICB9KTsKKyAgICAgIHZhciBvYmoxID0gcGFyc2VyLmdldE9iaigpOworICAgICAgdmFyIG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgICB2YXIgb2JqMyA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgIHZhciBsaW5EaWN0ID0gcGFyc2VyLmdldE9iaigpOworICAgICAgdmFyIG9iaiwgbGVuZ3RoOworCisgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKG9iajEpICYmIE51bWJlci5pc0ludGVnZXIob2JqMikgJiYgKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmozLCAib2JqIikgJiYgKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobGluRGljdCkgJiYgKDAsIF91dGlsLmlzTnVtKShvYmogPSBsaW5EaWN0LmdldCgiTGluZWFyaXplZCIpKSAmJiBvYmogPiAwKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0gZWxzZSBpZiAoKGxlbmd0aCA9IGdldEludChsaW5EaWN0LCAiTCIpKSAhPT0gc3RyZWFtLmxlbmd0aCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSAiTCIgcGFyYW1ldGVyIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgJyArICJkb2VzIG5vdCBlcXVhbCB0aGUgc3RyZWFtIGxlbmd0aC4iKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgbGVuZ3RoOiBsZW5ndGgsCisgICAgICAgIGhpbnRzOiBnZXRIaW50cyhsaW5EaWN0KSwKKyAgICAgICAgb2JqZWN0TnVtYmVyRmlyc3Q6IGdldEludChsaW5EaWN0LCAiTyIpLAorICAgICAgICBlbmRGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJFIiksCisgICAgICAgIG51bVBhZ2VzOiBnZXRJbnQobGluRGljdCwgIk4iKSwKKyAgICAgICAgbWFpblhSZWZFbnRyaWVzT2Zmc2V0OiBnZXRJbnQobGluRGljdCwgIlQiKSwKKyAgICAgICAgcGFnZUZpcnN0OiBsaW5EaWN0LmhhcygiUCIpID8gZ2V0SW50KGxpbkRpY3QsICJQIiwgdHJ1ZSkgOiAwCisgICAgICB9OworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBMaW5lYXJpemF0aW9uOworfSgpOworCitleHBvcnRzLkxpbmVhcml6YXRpb24gPSBMaW5lYXJpemF0aW9uOworCisvKioqLyB9KSwKKy8qIDIwOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkxaV1N0cmVhbSA9IGV4cG9ydHMuU3RyaW5nU3RyZWFtID0gZXhwb3J0cy5TdHJlYW1zU2VxdWVuY2VTdHJlYW0gPSBleHBvcnRzLlN0cmVhbSA9IGV4cG9ydHMuUnVuTGVuZ3RoU3RyZWFtID0gZXhwb3J0cy5QcmVkaWN0b3JTdHJlYW0gPSBleHBvcnRzLk51bGxTdHJlYW0gPSBleHBvcnRzLkZsYXRlU3RyZWFtID0gZXhwb3J0cy5EZWNvZGVTdHJlYW0gPSBleHBvcnRzLkRlY3J5cHRTdHJlYW0gPSBleHBvcnRzLkFzY2lpSGV4U3RyZWFtID0gZXhwb3J0cy5Bc2NpaTg1U3RyZWFtID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMik7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA1KTsKKworZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9CisKK2Z1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0KKworZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KKworZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfQorCitmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCit2YXIgU3RyZWFtID0gZnVuY3Rpb24gU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gU3RyZWFtKGFycmF5QnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KSB7CisgICAgdGhpcy5ieXRlcyA9IGFycmF5QnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGFycmF5QnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpOworICAgIHRoaXMuc3RhcnQgPSBzdGFydCB8fCAwOworICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDsKKyAgICB0aGlzLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIHx8IHRoaXMuYnl0ZXMubGVuZ3RoOworICAgIHRoaXMuZGljdCA9IGRpY3Q7CisgIH0KKworICBTdHJlYW0ucHJvdG90eXBlID0geworICAgIGdldCBsZW5ndGgoKSB7CisgICAgICByZXR1cm4gdGhpcy5lbmQgLSB0aGlzLnN0YXJ0OworICAgIH0sCisKKyAgICBnZXQgaXNFbXB0eSgpIHsKKyAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDsKKyAgICB9LAorCisgICAgZ2V0Qnl0ZTogZnVuY3Rpb24gU3RyZWFtX2dldEJ5dGUoKSB7CisgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLnBvcysrXTsKKyAgICB9LAorICAgIGdldFVpbnQxNjogZnVuY3Rpb24gU3RyZWFtX2dldFVpbnQxNigpIHsKKyAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7CisKKyAgICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxOworICAgIH0sCisgICAgZ2V0SW50MzI6IGZ1bmN0aW9uIFN0cmVhbV9nZXRJbnQzMigpIHsKKyAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjIgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMyA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7CisgICAgfSwKKyAgICBnZXRCeXRlczogZnVuY3Rpb24gZ2V0Qnl0ZXMobGVuZ3RoKSB7CisgICAgICB2YXIgZm9yY2VDbGFtcGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKKyAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7CisgICAgICB2YXIgcG9zID0gdGhpcy5wb3M7CisgICAgICB2YXIgc3RyRW5kID0gdGhpcy5lbmQ7CisKKyAgICAgIGlmICghbGVuZ3RoKSB7CisgICAgICAgIHZhciBfc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIHN0ckVuZCk7CisKKyAgICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShfc3ViYXJyYXkpIDogX3N1YmFycmF5OworICAgICAgfQorCisgICAgICB2YXIgZW5kID0gcG9zICsgbGVuZ3RoOworCisgICAgICBpZiAoZW5kID4gc3RyRW5kKSB7CisgICAgICAgIGVuZCA9IHN0ckVuZDsKKyAgICAgIH0KKworICAgICAgdGhpcy5wb3MgPSBlbmQ7CisgICAgICB2YXIgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7CisgICAgICByZXR1cm4gZm9yY2VDbGFtcGVkID8gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN1YmFycmF5KSA6IHN1YmFycmF5OworICAgIH0sCisgICAgcGVla0J5dGU6IGZ1bmN0aW9uIFN0cmVhbV9wZWVrQnl0ZSgpIHsKKyAgICAgIHZhciBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7CisKKyAgICAgIGlmIChwZWVrZWRCeXRlICE9PSAtMSkgeworICAgICAgICB0aGlzLnBvcy0tOworICAgICAgfQorCisgICAgICByZXR1cm4gcGVla2VkQnl0ZTsKKyAgICB9LAorICAgIHBlZWtCeXRlczogZnVuY3Rpb24gcGVla0J5dGVzKGxlbmd0aCkgeworICAgICAgdmFyIGZvcmNlQ2xhbXBlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTsKKyAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDsKKyAgICAgIHJldHVybiBieXRlczsKKyAgICB9LAorICAgIGdldEJ5dGVSYW5nZTogZnVuY3Rpb24gZ2V0Qnl0ZVJhbmdlKGJlZ2luLCBlbmQpIHsKKyAgICAgIGlmIChiZWdpbiA8IDApIHsKKyAgICAgICAgYmVnaW4gPSAwOworICAgICAgfQorCisgICAgICBpZiAoZW5kID4gdGhpcy5lbmQpIHsKKyAgICAgICAgZW5kID0gdGhpcy5lbmQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KGJlZ2luLCBlbmQpOworICAgIH0sCisgICAgc2tpcDogZnVuY3Rpb24gU3RyZWFtX3NraXAobikgeworICAgICAgaWYgKCFuKSB7CisgICAgICAgIG4gPSAxOworICAgICAgfQorCisgICAgICB0aGlzLnBvcyArPSBuOworICAgIH0sCisgICAgcmVzZXQ6IGZ1bmN0aW9uIFN0cmVhbV9yZXNldCgpIHsKKyAgICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDsKKyAgICB9LAorICAgIG1vdmVTdGFydDogZnVuY3Rpb24gU3RyZWFtX21vdmVTdGFydCgpIHsKKyAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKKyAgICB9LAorICAgIG1ha2VTdWJTdHJlYW06IGZ1bmN0aW9uIFN0cmVhbV9tYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QpIHsKKyAgICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnl0ZXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KTsKKyAgICB9CisgIH07CisgIHJldHVybiBTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuU3RyZWFtID0gU3RyZWFtOworCit2YXIgU3RyaW5nU3RyZWFtID0gZnVuY3Rpb24gU3RyaW5nU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gU3RyaW5nU3RyZWFtKHN0cikgeworICAgIHZhciBieXRlcyA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShzdHIpOworICAgIFN0cmVhbS5jYWxsKHRoaXMsIGJ5dGVzKTsKKyAgfQorCisgIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUgPSBTdHJlYW0ucHJvdG90eXBlOworICByZXR1cm4gU3RyaW5nU3RyZWFtOworfSgpOworCitleHBvcnRzLlN0cmluZ1N0cmVhbSA9IFN0cmluZ1N0cmVhbTsKKwordmFyIERlY29kZVN0cmVhbSA9IGZ1bmN0aW9uIERlY29kZVN0cmVhbUNsb3N1cmUoKSB7CisgIHZhciBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApOworCisgIGZ1bmN0aW9uIERlY29kZVN0cmVhbShtYXliZU1pbkJ1ZmZlckxlbmd0aCkgeworICAgIHRoaXMuX3Jhd01pbkJ1ZmZlckxlbmd0aCA9IG1heWJlTWluQnVmZmVyTGVuZ3RoIHx8IDA7CisgICAgdGhpcy5wb3MgPSAwOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKKyAgICB0aGlzLmVvZiA9IGZhbHNlOworICAgIHRoaXMuYnVmZmVyID0gZW1wdHlCdWZmZXI7CisgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggPSA1MTI7CisKKyAgICBpZiAobWF5YmVNaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgIHdoaWxlICh0aGlzLm1pbkJ1ZmZlckxlbmd0aCA8IG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CisgICAgICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoICo9IDI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgaXNFbXB0eSgpIHsKKyAgICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPT09IDApIHsKKyAgICAgICAgdGhpcy5yZWFkQmxvY2soKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwOworICAgIH0sCisKKyAgICBlbnN1cmVCdWZmZXI6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9lbnN1cmVCdWZmZXIocmVxdWVzdGVkKSB7CisgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CisKKyAgICAgIGlmIChyZXF1ZXN0ZWQgPD0gYnVmZmVyLmJ5dGVMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgIH0KKworICAgICAgdmFyIHNpemUgPSB0aGlzLm1pbkJ1ZmZlckxlbmd0aDsKKworICAgICAgd2hpbGUgKHNpemUgPCByZXF1ZXN0ZWQpIHsKKyAgICAgICAgc2l6ZSAqPSAyOworICAgICAgfQorCisgICAgICB2YXIgYnVmZmVyMiA9IG5ldyBVaW50OEFycmF5KHNpemUpOworICAgICAgYnVmZmVyMi5zZXQoYnVmZmVyKTsKKyAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjI7CisgICAgfSwKKyAgICBnZXRCeXRlOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0Qnl0ZSgpIHsKKyAgICAgIHZhciBwb3MgPSB0aGlzLnBvczsKKworICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IHBvcykgeworICAgICAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJlYWRCbG9jaygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107CisgICAgfSwKKyAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9nZXRVaW50MTYoKSB7CisgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpOworCisgICAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTsKKyAgICB9LAorICAgIGdldEludDMyOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0SW50MzIoKSB7CisgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIyID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOworICAgIH0sCisgICAgZ2V0Qnl0ZXM6IGZ1bmN0aW9uIGdldEJ5dGVzKGxlbmd0aCkgeworICAgICAgdmFyIGZvcmNlQ2xhbXBlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisgICAgICB2YXIgZW5kLAorICAgICAgICAgIHBvcyA9IHRoaXMucG9zOworCisgICAgICBpZiAobGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbmd0aCk7CisgICAgICAgIGVuZCA9IHBvcyArIGxlbmd0aDsKKworICAgICAgICB3aGlsZSAoIXRoaXMuZW9mICYmIHRoaXMuYnVmZmVyTGVuZ3RoIDwgZW5kKSB7CisgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKworICAgICAgICBpZiAoZW5kID4gYnVmRW5kKSB7CisgICAgICAgICAgZW5kID0gYnVmRW5kOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKSB7CisgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIGVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgICAgfQorCisgICAgICB0aGlzLnBvcyA9IGVuZDsKKyAgICAgIHZhciBzdWJhcnJheSA9IHRoaXMuYnVmZmVyLnN1YmFycmF5KHBvcywgZW5kKTsKKyAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgJiYgIShzdWJhcnJheSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTsKKyAgICB9LAorICAgIHBlZWtCeXRlOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fcGVla0J5dGUoKSB7CisgICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpOworCisgICAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKKyAgICAgICAgdGhpcy5wb3MtLTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7CisgICAgfSwKKyAgICBwZWVrQnl0ZXM6IGZ1bmN0aW9uIHBlZWtCeXRlcyhsZW5ndGgpIHsKKyAgICAgIHZhciBmb3JjZUNsYW1wZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOworICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7CisgICAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7CisgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfSwKKyAgICBtYWtlU3ViU3RyZWFtOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0KSB7CisgICAgICB2YXIgZW5kID0gc3RhcnQgKyBsZW5ndGg7CisKKyAgICAgIHdoaWxlICh0aGlzLmJ1ZmZlckxlbmd0aCA8PSBlbmQgJiYgIXRoaXMuZW9mKSB7CisgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KTsKKyAgICB9LAorICAgIGdldEJ5dGVSYW5nZTogZnVuY3Rpb24gZ2V0Qnl0ZVJhbmdlKGJlZ2luLCBlbmQpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBEZWNvZGVTdHJlYW0uZ2V0Qnl0ZVJhbmdlIik7CisgICAgfSwKKyAgICBza2lwOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fc2tpcChuKSB7CisgICAgICBpZiAoIW4pIHsKKyAgICAgICAgbiA9IDE7CisgICAgICB9CisKKyAgICAgIHRoaXMucG9zICs9IG47CisgICAgfSwKKyAgICByZXNldDogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3Jlc2V0KCkgeworICAgICAgdGhpcy5wb3MgPSAwOworICAgIH0sCisgICAgZ2V0QmFzZVN0cmVhbXM6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9nZXRCYXNlU3RyZWFtcygpIHsKKyAgICAgIGlmICh0aGlzLnN0ciAmJiB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcykgeworICAgICAgICByZXR1cm4gdGhpcy5zdHIuZ2V0QmFzZVN0cmVhbXMoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFtdOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIERlY29kZVN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5EZWNvZGVTdHJlYW0gPSBEZWNvZGVTdHJlYW07CisKK3ZhciBTdHJlYW1zU2VxdWVuY2VTdHJlYW0gPSBmdW5jdGlvbiBTdHJlYW1zU2VxdWVuY2VTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBTdHJlYW1zU2VxdWVuY2VTdHJlYW0oc3RyZWFtcykgeworICAgIHRoaXMuc3RyZWFtcyA9IHN0cmVhbXM7CisgICAgdmFyIG1heWJlTGVuZ3RoID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN0cmVhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIHN0cmVhbSA9IHN0cmVhbXNbaV07CisKKyAgICAgIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEZWNvZGVTdHJlYW0pIHsKKyAgICAgICAgbWF5YmVMZW5ndGggKz0gc3RyZWFtLl9yYXdNaW5CdWZmZXJMZW5ndGg7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXliZUxlbmd0aCArPSBzdHJlYW0ubGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gc3RyZWFtU2VxdWVuY2VTdHJlYW1SZWFkQmxvY2soKSB7CisgICAgdmFyIHN0cmVhbXMgPSB0aGlzLnN0cmVhbXM7CisKKyAgICBpZiAoc3RyZWFtcy5sZW5ndGggPT09IDApIHsKKyAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpOworICAgIHZhciBjaHVuayA9IHN0cmVhbS5nZXRCeXRlcygpOworICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKyAgICB2YXIgbmV3TGVuZ3RoID0gYnVmZmVyTGVuZ3RoICsgY2h1bmsubGVuZ3RoOworICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihuZXdMZW5ndGgpOworICAgIGJ1ZmZlci5zZXQoY2h1bmssIGJ1ZmZlckxlbmd0aCk7CisgICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CisgIH07CisKKyAgU3RyZWFtc1NlcXVlbmNlU3RyZWFtLnByb3RvdHlwZS5nZXRCYXNlU3RyZWFtcyA9IGZ1bmN0aW9uIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbV9nZXRCYXNlU3RyZWFtcygpIHsKKyAgICB2YXIgYmFzZVN0cmVhbXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuc3RyZWFtcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW1zW2ldOworCisgICAgICBpZiAoc3RyZWFtLmdldEJhc2VTdHJlYW1zKSB7CisgICAgICAgIGJhc2VTdHJlYW1zLnB1c2guYXBwbHkoYmFzZVN0cmVhbXMsIF90b0NvbnN1bWFibGVBcnJheShzdHJlYW0uZ2V0QmFzZVN0cmVhbXMoKSkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiYXNlU3RyZWFtczsKKyAgfTsKKworICByZXR1cm4gU3RyZWFtc1NlcXVlbmNlU3RyZWFtOworfSgpOworCitleHBvcnRzLlN0cmVhbXNTZXF1ZW5jZVN0cmVhbSA9IFN0cmVhbXNTZXF1ZW5jZVN0cmVhbTsKKwordmFyIEZsYXRlU3RyZWFtID0gZnVuY3Rpb24gRmxhdGVTdHJlYW1DbG9zdXJlKCkgeworICB2YXIgY29kZUxlbkNvZGVNYXAgPSBuZXcgSW50MzJBcnJheShbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV0pOworICB2YXIgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoWzB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsIDB4MTAwMGIsIDB4MTAwMGQsIDB4MTAwMGYsIDB4MTAwMTEsIDB4MjAwMTMsIDB4MjAwMTcsIDB4MjAwMWIsIDB4MjAwMWYsIDB4MzAwMjMsIDB4MzAwMmIsIDB4MzAwMzMsIDB4MzAwM2IsIDB4NDAwNDMsIDB4NDAwNTMsIDB4NDAwNjMsIDB4NDAwNzMsIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJdKTsKKyAgdmFyIGRpc3REZWNvZGUgPSBuZXcgSW50MzJBcnJheShbMHgwMDAwMSwgMHgwMDAwMiwgMHgwMDAwMywgMHgwMDAwNCwgMHgxMDAwNSwgMHgxMDAwNywgMHgyMDAwOSwgMHgyMDAwZCwgMHgzMDAxMSwgMHgzMDAxOSwgMHg0MDAyMSwgMHg0MDAzMSwgMHg1MDA0MSwgMHg1MDA2MSwgMHg2MDA4MSwgMHg2MDBjMSwgMHg3MDEwMSwgMHg3MDE4MSwgMHg4MDIwMSwgMHg4MDMwMSwgMHg5MDQwMSwgMHg5MDYwMSwgMHhhMDgwMSwgMHhhMGMwMSwgMHhiMTAwMSwgMHhiMTgwMSwgMHhjMjAwMSwgMHhjMzAwMSwgMHhkNDAwMSwgMHhkNjAwMV0pOworICB2YXIgZml4ZWRMaXRDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFsweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMwLCAweDcwMTA4LCAweDgwMDYwLCAweDgwMDIwLCAweDkwMGEwLCAweDgwMDAwLCAweDgwMDgwLCAweDgwMDQwLCAweDkwMGUwLCAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkwLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQwLCAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIwLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYwLCAweDcwMTAyLCAweDgwMDU0LCAweDgwMDE0LCAweDgwMTFjLCAweDcwMTEyLCAweDgwMDc0LCAweDgwMDM0LCAweDkwMGM4LCAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE4LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU4LCAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk4LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ4LCAweDcwMTBlLCAweDgwMDZjLCAweDgwMDJjLCAweDkwMGI4LCAweDgwMDBjLCAweDgwMDhjLCAweDgwMDRjLCAweDkwMGY4LCAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM0LCAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE0LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU0LCAweDcwMTA1LCAweDgwMDVhLCAweDgwMDFhLCAweDkwMDk0LCAweDcwMTE1LCAweDgwMDdhLCAweDgwMDNhLCAweDkwMGQ0LCAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI0LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY0LCAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNjLCAweDcwMTBiLCAweDgwMDY2LCAweDgwMDI2LCAweDkwMGFjLCAweDgwMDA2LCAweDgwMDg2LCAweDgwMDQ2LCAweDkwMGVjLCAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDljLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRjLCAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJjLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZjLCAweDcwMTAwLCAweDgwMDUxLCAweDgwMDExLCAweDgwMTE5LCAweDcwMTEwLCAweDgwMDcxLCAweDgwMDMxLCAweDkwMGMyLCAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEyLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUyLCAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkyLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQyLCAweDcwMTBjLCAweDgwMDY5LCAweDgwMDI5LCAweDkwMGIyLCAweDgwMDA5LCAweDgwMDg5LCAweDgwMDQ5LCAweDkwMGYyLCAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNhLCAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFhLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGVhLCAweDcwMTA2LCAweDgwMDVkLCAweDgwMDFkLCAweDkwMDlhLCAweDcwMTE2LCAweDgwMDdkLCAweDgwMDNkLCAweDkwMGRhLCAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJhLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZhLCAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM2LCAweDcwMTA5LCAweDgwMDYzLCAweDgwMDIzLCAweDkwMGE2LCAweDgwMDAzLCAweDgwMDgzLCAweDgwMDQzLCAweDkwMGU2LCAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk2LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ2LCAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI2LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY2LCAweDcwMTAzLCAweDgwMDU3LCAweDgwMDE3LCAweDgwMTFmLCAweDcwMTEzLCAweDgwMDc3LCAweDgwMDM3LCAweDkwMGNlLCAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFlLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVlLCAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDllLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRlLCAweDcwMTBmLCAweDgwMDZmLCAweDgwMDJmLCAweDkwMGJlLCAweDgwMDBmLCAweDgwMDhmLCAweDgwMDRmLCAweDkwMGZlLCAweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMxLCAweDcwMTA4LCAweDgwMDYwLCAweDgwMDIwLCAweDkwMGExLCAweDgwMDAwLCAweDgwMDgwLCAweDgwMDQwLCAweDkwMGUxLCAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkxLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQxLCAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIxLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYxLCAweDcwMTAyLCAweDgwMDU0LCAweDgwMDE0LCAweDgwMTFjLCAweDcwMTEyLCAweDgwMDc0LCAweDgwMDM0LCAweDkwMGM5LCAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE5LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU5LCAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk5LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ5LCAweDcwMTBlLCAweDgwMDZjLCAweDgwMDJjLCAweDkwMGI5LCAweDgwMDBjLCAweDgwMDhjLCAweDgwMDRjLCAweDkwMGY5LCAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM1LCAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE1LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU1LCAweDcwMTA1LCAweDgwMDVhLCAweDgwMDFhLCAweDkwMDk1LCAweDcwMTE1LCAweDgwMDdhLCAweDgwMDNhLCAweDkwMGQ1LCAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI1LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY1LCAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNkLCAweDcwMTBiLCAweDgwMDY2LCAweDgwMDI2LCAweDkwMGFkLCAweDgwMDA2LCAweDgwMDg2LCAweDgwMDQ2LCAweDkwMGVkLCAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDlkLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRkLCAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJkLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZkLCAweDcwMTAwLCAweDgwMDUxLCAweDgwMDExLCAweDgwMTE5LCAweDcwMTEwLCAweDgwMDcxLCAweDgwMDMxLCAweDkwMGMzLCAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEzLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUzLCAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkzLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQzLCAweDcwMTBjLCAweDgwMDY5LCAweDgwMDI5LCAweDkwMGIzLCAweDgwMDA5LCAweDgwMDg5LCAweDgwMDQ5LCAweDkwMGYzLCAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNiLCAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFiLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGViLCAweDcwMTA2LCAweDgwMDVkLCAweDgwMDFkLCAweDkwMDliLCAweDcwMTE2LCAweDgwMDdkLCAweDgwMDNkLCAweDkwMGRiLCAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJiLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZiLCAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM3LCAweDcwMTA5LCAweDgwMDYzLCAweDgwMDIzLCAweDkwMGE3LCAweDgwMDAzLCAweDgwMDgzLCAweDgwMDQzLCAweDkwMGU3LCAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk3LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ3LCAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI3LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY3LCAweDcwMTAzLCAweDgwMDU3LCAweDgwMDE3LCAweDgwMTFmLCAweDcwMTEzLCAweDgwMDc3LCAweDgwMDM3LCAweDkwMGNmLCAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFmLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVmLCAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDlmLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRmLCAweDcwMTBmLCAweDgwMDZmLCAweDgwMDJmLCAweDkwMGJmLCAweDgwMDBmLCAweDgwMDhmLCAweDgwMDRmLCAweDkwMGZmXSksIDldOworICB2YXIgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYywgMHg1MDAwMiwgMHg1MDAxMiwgMHg1MDAwYSwgMHg1MDAxYSwgMHg1MDAwNiwgMHg1MDAxNiwgMHg1MDAwZSwgMHgwMDAwMCwgMHg1MDAwMSwgMHg1MDAxMSwgMHg1MDAwOSwgMHg1MDAxOSwgMHg1MDAwNSwgMHg1MDAxNSwgMHg1MDAwZCwgMHg1MDAxZCwgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMF0pLCA1XTsKKworICBmdW5jdGlvbiBGbGF0ZVN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7CisgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CisgICAgdmFyIGNtZiA9IHN0ci5nZXRCeXRlKCk7CisgICAgdmFyIGZsZyA9IHN0ci5nZXRCeXRlKCk7CisKKyAgICBpZiAoY21mID09PSAtMSB8fCBmbGcgPT09IC0xKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogIi5jb25jYXQoY21mLCAiLCAiKS5jb25jYXQoZmxnKSk7CisgICAgfQorCisgICAgaWYgKChjbWYgJiAweDBmKSAhPT0gMHgwOCkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCBpbiBmbGF0ZSBzdHJlYW06ICIuY29uY2F0KGNtZiwgIiwgIikuY29uY2F0KGZsZykpOworICAgIH0KKworICAgIGlmICgoKGNtZiA8PCA4KSArIGZsZykgJSAzMSAhPT0gMCkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgRkNIRUNLIGluIGZsYXRlIHN0cmVhbTogIi5jb25jYXQoY21mLCAiLCAiKS5jb25jYXQoZmxnKSk7CisgICAgfQorCisgICAgaWYgKGZsZyAmIDB4MjApIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06ICIuY29uY2F0KGNtZiwgIiwgIikuY29uY2F0KGZsZykpOworICAgIH0KKworICAgIHRoaXMuY29kZVNpemUgPSAwOworICAgIHRoaXMuY29kZUJ1ZiA9IDA7CisgICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgRmxhdGVTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKworICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Qml0cyA9IGZ1bmN0aW9uIEZsYXRlU3RyZWFtX2dldEJpdHMoYml0cykgeworICAgIHZhciBzdHIgPSB0aGlzLnN0cjsKKyAgICB2YXIgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplOworICAgIHZhciBjb2RlQnVmID0gdGhpcy5jb2RlQnVmOworICAgIHZhciBiOworCisgICAgd2hpbGUgKGNvZGVTaXplIDwgYml0cykgeworICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7CisgICAgICBjb2RlU2l6ZSArPSA4OworICAgIH0KKworICAgIGIgPSBjb2RlQnVmICYgKDEgPDwgYml0cykgLSAxOworICAgIHRoaXMuY29kZUJ1ZiA9IGNvZGVCdWYgPj4gYml0czsKKyAgICB0aGlzLmNvZGVTaXplID0gY29kZVNpemUgLT0gYml0czsKKyAgICByZXR1cm4gYjsKKyAgfTsKKworICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29kZSA9IGZ1bmN0aW9uIEZsYXRlU3RyZWFtX2dldENvZGUodGFibGUpIHsKKyAgICB2YXIgc3RyID0gdGhpcy5zdHI7CisgICAgdmFyIGNvZGVzID0gdGFibGVbMF07CisgICAgdmFyIG1heExlbiA9IHRhYmxlWzFdOworICAgIHZhciBjb2RlU2l6ZSA9IHRoaXMuY29kZVNpemU7CisgICAgdmFyIGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7CisgICAgdmFyIGI7CisKKyAgICB3aGlsZSAoY29kZVNpemUgPCBtYXhMZW4pIHsKKyAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY29kZUJ1ZiB8PSBiIDw8IGNvZGVTaXplOworICAgICAgY29kZVNpemUgKz0gODsKKyAgICB9CisKKyAgICB2YXIgY29kZSA9IGNvZGVzW2NvZGVCdWYgJiAoMSA8PCBtYXhMZW4pIC0gMV07CisgICAgdmFyIGNvZGVMZW4gPSBjb2RlID4+IDE2OworICAgIHZhciBjb2RlVmFsID0gY29kZSAmIDB4ZmZmZjsKKworICAgIGlmIChjb2RlTGVuIDwgMSB8fCBjb2RlU2l6ZSA8IGNvZGVMZW4pIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOworICAgIH0KKworICAgIHRoaXMuY29kZUJ1ZiA9IGNvZGVCdWYgPj4gY29kZUxlbjsKKyAgICB0aGlzLmNvZGVTaXplID0gY29kZVNpemUgLSBjb2RlTGVuOworICAgIHJldHVybiBjb2RlVmFsOworICB9OworCisgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZW5lcmF0ZUh1ZmZtYW5UYWJsZSA9IGZ1bmN0aW9uIGZsYXRlU3RyZWFtR2VuZXJhdGVIdWZmbWFuVGFibGUobGVuZ3RocykgeworICAgIHZhciBuID0gbGVuZ3Rocy5sZW5ndGg7CisgICAgdmFyIG1heExlbiA9IDA7CisgICAgdmFyIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICBpZiAobGVuZ3Roc1tpXSA+IG1heExlbikgeworICAgICAgICBtYXhMZW4gPSBsZW5ndGhzW2ldOworICAgICAgfQorICAgIH0KKworICAgIHZhciBzaXplID0gMSA8PCBtYXhMZW47CisgICAgdmFyIGNvZGVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7CisKKyAgICBmb3IgKHZhciBsZW4gPSAxLCBjb2RlID0gMCwgc2tpcCA9IDI7IGxlbiA8PSBtYXhMZW47ICsrbGVuLCBjb2RlIDw8PSAxLCBza2lwIDw8PSAxKSB7CisgICAgICBmb3IgKHZhciB2YWwgPSAwOyB2YWwgPCBuOyArK3ZhbCkgeworICAgICAgICBpZiAobGVuZ3Roc1t2YWxdID09PSBsZW4pIHsKKyAgICAgICAgICB2YXIgY29kZTIgPSAwOworICAgICAgICAgIHZhciB0ID0gY29kZTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgY29kZTIgPSBjb2RlMiA8PCAxIHwgdCAmIDE7CisgICAgICAgICAgICB0ID4+PSAxOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoaSA9IGNvZGUyOyBpIDwgc2l6ZTsgaSArPSBza2lwKSB7CisgICAgICAgICAgICBjb2Rlc1tpXSA9IGxlbiA8PCAxNiB8IHZhbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICArK2NvZGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dOworICB9OworCisgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBGbGF0ZVN0cmVhbV9yZWFkQmxvY2soKSB7CisgICAgdmFyIGJ1ZmZlciwgbGVuOworICAgIHZhciBzdHIgPSB0aGlzLnN0cjsKKyAgICB2YXIgaGRyID0gdGhpcy5nZXRCaXRzKDMpOworCisgICAgaWYgKGhkciAmIDEpIHsKKyAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICB9CisKKyAgICBoZHIgPj49IDE7CisKKyAgICBpZiAoaGRyID09PSAwKSB7CisgICAgICB2YXIgYjsKKworICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGJsb2NrTGVuID0gYjsKKworICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKKyAgICAgIH0KKworICAgICAgYmxvY2tMZW4gfD0gYiA8PCA4OworCisgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICB2YXIgY2hlY2sgPSBiOworCisgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICBjaGVjayB8PSBiIDw8IDg7CisKKyAgICAgIGlmIChjaGVjayAhPT0gKH5ibG9ja0xlbiAmIDB4ZmZmZikgJiYgKGJsb2NrTGVuICE9PSAwIHx8IGNoZWNrICE9PSAwKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICB0aGlzLmNvZGVCdWYgPSAwOworICAgICAgdGhpcy5jb2RlU2l6ZSA9IDA7CisgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGgsCisgICAgICAgICAgZW5kID0gYnVmZmVyTGVuZ3RoICsgYmxvY2tMZW47CisgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihlbmQpOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmQ7CisKKyAgICAgIGlmIChibG9ja0xlbiA9PT0gMCkgeworICAgICAgICBpZiAoc3RyLnBlZWtCeXRlKCkgPT09IC0xKSB7CisgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgYmxvY2sgPSBzdHIuZ2V0Qnl0ZXMoYmxvY2tMZW4pOworICAgICAgICBidWZmZXIuc2V0KGJsb2NrLCBidWZmZXJMZW5ndGgpOworCisgICAgICAgIGlmIChibG9jay5sZW5ndGggPCBibG9ja0xlbikgeworICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGxpdENvZGVUYWJsZTsKKyAgICB2YXIgZGlzdENvZGVUYWJsZTsKKworICAgIGlmIChoZHIgPT09IDEpIHsKKyAgICAgIGxpdENvZGVUYWJsZSA9IGZpeGVkTGl0Q29kZVRhYjsKKyAgICAgIGRpc3RDb2RlVGFibGUgPSBmaXhlZERpc3RDb2RlVGFiOworICAgIH0gZWxzZSBpZiAoaGRyID09PSAyKSB7CisgICAgICB2YXIgbnVtTGl0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAyNTc7CisgICAgICB2YXIgbnVtRGlzdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMTsKKyAgICAgIHZhciBudW1Db2RlTGVuQ29kZXMgPSB0aGlzLmdldEJpdHMoNCkgKyA0OworICAgICAgdmFyIGNvZGVMZW5Db2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGNvZGVMZW5Db2RlTWFwLmxlbmd0aCk7CisgICAgICB2YXIgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVMZW5Db2RlczsgKytpKSB7CisgICAgICAgIGNvZGVMZW5Db2RlTGVuZ3Roc1tjb2RlTGVuQ29kZU1hcFtpXV0gPSB0aGlzLmdldEJpdHMoMyk7CisgICAgICB9CisKKyAgICAgIHZhciBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTsKKyAgICAgIGxlbiA9IDA7CisgICAgICBpID0gMDsKKyAgICAgIHZhciBjb2RlcyA9IG51bUxpdENvZGVzICsgbnVtRGlzdENvZGVzOworICAgICAgdmFyIGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMpOworICAgICAgdmFyIGJpdHNMZW5ndGgsIGJpdHNPZmZzZXQsIHdoYXQ7CisKKyAgICAgIHdoaWxlIChpIDwgY29kZXMpIHsKKyAgICAgICAgdmFyIGNvZGUgPSB0aGlzLmdldENvZGUoY29kZUxlbkNvZGVUYWIpOworCisgICAgICAgIGlmIChjb2RlID09PSAxNikgeworICAgICAgICAgIGJpdHNMZW5ndGggPSAyOworICAgICAgICAgIGJpdHNPZmZzZXQgPSAzOworICAgICAgICAgIHdoYXQgPSBsZW47CisgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTcpIHsKKyAgICAgICAgICBiaXRzTGVuZ3RoID0gMzsKKyAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKKyAgICAgICAgICB3aGF0ID0gbGVuID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAxOCkgeworICAgICAgICAgIGJpdHNMZW5ndGggPSA3OworICAgICAgICAgIGJpdHNPZmZzZXQgPSAxMTsKKyAgICAgICAgICB3aGF0ID0gbGVuID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gbGVuID0gY29kZTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZXBlYXRMZW5ndGggPSB0aGlzLmdldEJpdHMoYml0c0xlbmd0aCkgKyBiaXRzT2Zmc2V0OworCisgICAgICAgIHdoaWxlIChyZXBlYXRMZW5ndGgtLSA+IDApIHsKKyAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gd2hhdDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBsaXRDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KDAsIG51bUxpdENvZGVzKSk7CisgICAgICBkaXN0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuZ3Rocy5zdWJhcnJheShudW1MaXRDb2RlcywgY29kZXMpKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtIik7CisgICAgfQorCisgICAgYnVmZmVyID0gdGhpcy5idWZmZXI7CisgICAgdmFyIGxpbWl0ID0gYnVmZmVyID8gYnVmZmVyLmxlbmd0aCA6IDA7CisgICAgdmFyIHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBjb2RlMSA9IHRoaXMuZ2V0Q29kZShsaXRDb2RlVGFibGUpOworCisgICAgICBpZiAoY29kZTEgPCAyNTYpIHsKKyAgICAgICAgaWYgKHBvcyArIDEgPj0gbGltaXQpIHsKKyAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyAxKTsKKyAgICAgICAgICBsaW1pdCA9IGJ1ZmZlci5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXJbcG9zKytdID0gY29kZTE7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoY29kZTEgPT09IDI1NikgeworICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IHBvczsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb2RlMSAtPSAyNTc7CisgICAgICBjb2RlMSA9IGxlbmd0aERlY29kZVtjb2RlMV07CisgICAgICB2YXIgY29kZTIgPSBjb2RlMSA+PiAxNjsKKworICAgICAgaWYgKGNvZGUyID4gMCkgeworICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7CisgICAgICB9CisKKyAgICAgIGxlbiA9IChjb2RlMSAmIDB4ZmZmZikgKyBjb2RlMjsKKyAgICAgIGNvZGUxID0gdGhpcy5nZXRDb2RlKGRpc3RDb2RlVGFibGUpOworICAgICAgY29kZTEgPSBkaXN0RGVjb2RlW2NvZGUxXTsKKyAgICAgIGNvZGUyID0gY29kZTEgPj4gMTY7CisKKyAgICAgIGlmIChjb2RlMiA+IDApIHsKKyAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpOworICAgICAgfQorCisgICAgICB2YXIgZGlzdCA9IChjb2RlMSAmIDB4ZmZmZikgKyBjb2RlMjsKKworICAgICAgaWYgKHBvcyArIGxlbiA+PSBsaW1pdCkgeworICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW4pOworICAgICAgICBsaW1pdCA9IGJ1ZmZlci5sZW5ndGg7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbGVuOyArK2ssICsrcG9zKSB7CisgICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGRpc3RdOworICAgICAgfQorICAgIH0KKyAgfTsKKworICByZXR1cm4gRmxhdGVTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuRmxhdGVTdHJlYW0gPSBGbGF0ZVN0cmVhbTsKKwordmFyIFByZWRpY3RvclN0cmVhbSA9IGZ1bmN0aW9uIFByZWRpY3RvclN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFByZWRpY3RvclN0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHBhcmFtcykpIHsKKyAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgdmFyIHByZWRpY3RvciA9IHRoaXMucHJlZGljdG9yID0gcGFyYW1zLmdldCgiUHJlZGljdG9yIikgfHwgMTsKKworICAgIGlmIChwcmVkaWN0b3IgPD0gMSkgeworICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICBpZiAocHJlZGljdG9yICE9PSAyICYmIChwcmVkaWN0b3IgPCAxMCB8fCBwcmVkaWN0b3IgPiAxNSkpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAiLmNvbmNhdChwcmVkaWN0b3IpKTsKKyAgICB9CisKKyAgICBpZiAocHJlZGljdG9yID09PSAyKSB7CisgICAgICB0aGlzLnJlYWRCbG9jayA9IHRoaXMucmVhZEJsb2NrVGlmZjsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5yZWFkQmxvY2sgPSB0aGlzLnJlYWRCbG9ja1BuZzsKKyAgICB9CisKKyAgICB0aGlzLnN0ciA9IHN0cjsKKyAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKKyAgICB2YXIgY29sb3JzID0gdGhpcy5jb2xvcnMgPSBwYXJhbXMuZ2V0KCJDb2xvcnMiKSB8fCAxOworICAgIHZhciBiaXRzID0gdGhpcy5iaXRzID0gcGFyYW1zLmdldCgiQml0c1BlckNvbXBvbmVudCIpIHx8IDg7CisgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMgPSBwYXJhbXMuZ2V0KCJDb2x1bW5zIikgfHwgMTsKKyAgICB0aGlzLnBpeEJ5dGVzID0gY29sb3JzICogYml0cyArIDcgPj4gMzsKKyAgICB0aGlzLnJvd0J5dGVzID0gY29sdW1ucyAqIGNvbG9ycyAqIGJpdHMgKyA3ID4+IDM7CisgICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgUHJlZGljdG9yU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisKKyAgUHJlZGljdG9yU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2tUaWZmID0gZnVuY3Rpb24gcHJlZGljdG9yU3RyZWFtUmVhZEJsb2NrVGlmZigpIHsKKyAgICB2YXIgcm93Qnl0ZXMgPSB0aGlzLnJvd0J5dGVzOworICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKyAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgcm93Qnl0ZXMpOworICAgIHZhciBiaXRzID0gdGhpcy5iaXRzOworICAgIHZhciBjb2xvcnMgPSB0aGlzLmNvbG9yczsKKyAgICB2YXIgcmF3Qnl0ZXMgPSB0aGlzLnN0ci5nZXRCeXRlcyhyb3dCeXRlcyk7CisgICAgdGhpcy5lb2YgPSAhcmF3Qnl0ZXMubGVuZ3RoOworCisgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGluYnVmID0gMCwKKyAgICAgICAgb3V0YnVmID0gMDsKKyAgICB2YXIgaW5iaXRzID0gMCwKKyAgICAgICAgb3V0Yml0cyA9IDA7CisgICAgdmFyIHBvcyA9IGJ1ZmZlckxlbmd0aDsKKyAgICB2YXIgaTsKKworICAgIGlmIChiaXRzID09PSAxICYmIGNvbG9ycyA9PT0gMSkgeworICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKKyAgICAgICAgdmFyIGMgPSByYXdCeXRlc1tpXSBeIGluYnVmOworICAgICAgICBjIF49IGMgPj4gMTsKKyAgICAgICAgYyBePSBjID4+IDI7CisgICAgICAgIGMgXj0gYyA+PiA0OworICAgICAgICBpbmJ1ZiA9IChjICYgMSkgPDwgNzsKKyAgICAgICAgYnVmZmVyW3BvcysrXSA9IGM7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChiaXRzID09PSA4KSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyArK2kpIHsKKyAgICAgICAgYnVmZmVyW3BvcysrXSA9IHJhd0J5dGVzW2ldOworICAgICAgfQorCisgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKKyAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gY29sb3JzXSArIHJhd0J5dGVzW2ldOworICAgICAgICBwb3MrKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJpdHMgPT09IDE2KSB7CisgICAgICB2YXIgYnl0ZXNQZXJQaXhlbCA9IGNvbG9ycyAqIDI7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBieXRlc1BlclBpeGVsOyArK2kpIHsKKyAgICAgICAgYnVmZmVyW3BvcysrXSA9IHJhd0J5dGVzW2ldOworICAgICAgfQorCisgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyBpICs9IDIpIHsKKyAgICAgICAgdmFyIHN1bSA9ICgocmF3Qnl0ZXNbaV0gJiAweGZmKSA8PCA4KSArIChyYXdCeXRlc1tpICsgMV0gJiAweGZmKSArICgoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWxdICYgMHhmZikgPDwgOCkgKyAoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWwgKyAxXSAmIDB4ZmYpOworICAgICAgICBidWZmZXJbcG9zKytdID0gc3VtID4+IDggJiAweGZmOworICAgICAgICBidWZmZXJbcG9zKytdID0gc3VtICYgMHhmZjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFyIGNvbXBBcnJheSA9IG5ldyBVaW50OEFycmF5KGNvbG9ycyArIDEpOworICAgICAgdmFyIGJpdE1hc2sgPSAoMSA8PCBiaXRzKSAtIDE7CisgICAgICB2YXIgaiA9IDAsCisgICAgICAgICAgayA9IGJ1ZmZlckxlbmd0aDsKKyAgICAgIHZhciBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sdW1uczsgKytpKSB7CisgICAgICAgIGZvciAodmFyIGtrID0gMDsga2sgPCBjb2xvcnM7ICsra2spIHsKKyAgICAgICAgICBpZiAoaW5iaXRzIDwgYml0cykgeworICAgICAgICAgICAgaW5idWYgPSBpbmJ1ZiA8PCA4IHwgcmF3Qnl0ZXNbaisrXSAmIDB4ZmY7CisgICAgICAgICAgICBpbmJpdHMgKz0gODsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb21wQXJyYXlba2tdID0gY29tcEFycmF5W2trXSArIChpbmJ1ZiA+PiBpbmJpdHMgLSBiaXRzKSAmIGJpdE1hc2s7CisgICAgICAgICAgaW5iaXRzIC09IGJpdHM7CisgICAgICAgICAgb3V0YnVmID0gb3V0YnVmIDw8IGJpdHMgfCBjb21wQXJyYXlba2tdOworICAgICAgICAgIG91dGJpdHMgKz0gYml0czsKKworICAgICAgICAgIGlmIChvdXRiaXRzID49IDgpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltrKytdID0gb3V0YnVmID4+IG91dGJpdHMgLSA4ICYgMHhmZjsKKyAgICAgICAgICAgIG91dGJpdHMgLT0gODsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKG91dGJpdHMgPiAwKSB7CisgICAgICAgIGJ1ZmZlcltrKytdID0gKG91dGJ1ZiA8PCA4IC0gb3V0Yml0cykgKyAoaW5idWYgJiAoMSA8PCA4IC0gb3V0Yml0cykgLSAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlczsKKyAgfTsKKworICBQcmVkaWN0b3JTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9ja1BuZyA9IGZ1bmN0aW9uIHByZWRpY3RvclN0cmVhbVJlYWRCbG9ja1BuZygpIHsKKyAgICB2YXIgcm93Qnl0ZXMgPSB0aGlzLnJvd0J5dGVzOworICAgIHZhciBwaXhCeXRlcyA9IHRoaXMucGl4Qnl0ZXM7CisgICAgdmFyIHByZWRpY3RvciA9IHRoaXMuc3RyLmdldEJ5dGUoKTsKKyAgICB2YXIgcmF3Qnl0ZXMgPSB0aGlzLnN0ci5nZXRCeXRlcyhyb3dCeXRlcyk7CisgICAgdGhpcy5lb2YgPSAhcmF3Qnl0ZXMubGVuZ3RoOworCisgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyByb3dCeXRlcyk7CisgICAgdmFyIHByZXZSb3cgPSBidWZmZXIuc3ViYXJyYXkoYnVmZmVyTGVuZ3RoIC0gcm93Qnl0ZXMsIGJ1ZmZlckxlbmd0aCk7CisKKyAgICBpZiAocHJldlJvdy5sZW5ndGggPT09IDApIHsKKyAgICAgIHByZXZSb3cgPSBuZXcgVWludDhBcnJheShyb3dCeXRlcyk7CisgICAgfQorCisgICAgdmFyIGksCisgICAgICAgIGogPSBidWZmZXJMZW5ndGgsCisgICAgICAgIHVwLAorICAgICAgICBjOworCisgICAgc3dpdGNoIChwcmVkaWN0b3IpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKKyAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHsKKyAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CisgICAgICAgICAgYnVmZmVyW2pdID0gYnVmZmVyW2ogLSBwaXhCeXRlc10gKyByYXdCeXRlc1tpXSAmIDB4ZmY7CisgICAgICAgICAgaisrOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKKyAgICAgICAgICBidWZmZXJbaisrXSA9IHByZXZSb3dbaV0gKyByYXdCeXRlc1tpXSAmIDB4ZmY7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4Qnl0ZXM7ICsraSkgeworICAgICAgICAgIGJ1ZmZlcltqKytdID0gKHByZXZSb3dbaV0gPj4gMSkgKyByYXdCeXRlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkgeworICAgICAgICAgIGJ1ZmZlcltqXSA9IChwcmV2Um93W2ldICsgYnVmZmVyW2ogLSBwaXhCeXRlc10gPj4gMSkgKyByYXdCeXRlc1tpXSAmIDB4ZmY7CisgICAgICAgICAgaisrOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHsKKyAgICAgICAgICB1cCA9IHByZXZSb3dbaV07CisgICAgICAgICAgYyA9IHJhd0J5dGVzW2ldOworICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXAgKyBjOworICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CisgICAgICAgICAgdXAgPSBwcmV2Um93W2ldOworICAgICAgICAgIHZhciB1cExlZnQgPSBwcmV2Um93W2kgLSBwaXhCeXRlc107CisgICAgICAgICAgdmFyIGxlZnQgPSBidWZmZXJbaiAtIHBpeEJ5dGVzXTsKKyAgICAgICAgICB2YXIgcCA9IGxlZnQgKyB1cCAtIHVwTGVmdDsKKyAgICAgICAgICB2YXIgcGEgPSBwIC0gbGVmdDsKKworICAgICAgICAgIGlmIChwYSA8IDApIHsKKyAgICAgICAgICAgIHBhID0gLXBhOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBwYiA9IHAgLSB1cDsKKworICAgICAgICAgIGlmIChwYiA8IDApIHsKKyAgICAgICAgICAgIHBiID0gLXBiOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBwYyA9IHAgLSB1cExlZnQ7CisKKyAgICAgICAgICBpZiAocGMgPCAwKSB7CisgICAgICAgICAgICBwYyA9IC1wYzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gcmF3Qnl0ZXNbaV07CisKKyAgICAgICAgICBpZiAocGEgPD0gcGIgJiYgcGEgPD0gcGMpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbGVmdCArIGM7CisgICAgICAgICAgfSBlbHNlIGlmIChwYiA8PSBwYykgeworICAgICAgICAgICAgYnVmZmVyW2orK10gPSB1cCArIGM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXBMZWZ0ICsgYzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICIuY29uY2F0KHByZWRpY3RvcikpOworICAgIH0KKworICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IHJvd0J5dGVzOworICB9OworCisgIHJldHVybiBQcmVkaWN0b3JTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuUHJlZGljdG9yU3RyZWFtID0gUHJlZGljdG9yU3RyZWFtOworCit2YXIgRGVjcnlwdFN0cmVhbSA9IGZ1bmN0aW9uIERlY3J5cHRTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBEZWNyeXB0U3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgsIGRlY3J5cHQpIHsKKyAgICB0aGlzLnN0ciA9IHN0cjsKKyAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKKyAgICB0aGlzLmRlY3J5cHQgPSBkZWNyeXB0OworICAgIHRoaXMubmV4dENodW5rID0gbnVsbDsKKyAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7CisgICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgdmFyIGNodW5rU2l6ZSA9IDUxMjsKKyAgRGVjcnlwdFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIERlY3J5cHRTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIERlY3J5cHRTdHJlYW1fcmVhZEJsb2NrKCkgeworICAgIHZhciBjaHVuazsKKworICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7CisgICAgICBjaHVuayA9IHRoaXMubmV4dENodW5rOworICAgIH0gZWxzZSB7CisgICAgICBjaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7CisgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWNodW5rIHx8IGNodW5rLmxlbmd0aCA9PT0gMCkgeworICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMubmV4dENodW5rID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoY2h1bmtTaXplKTsKKyAgICB2YXIgaGFzTW9yZURhdGEgPSB0aGlzLm5leHRDaHVuayAmJiB0aGlzLm5leHRDaHVuay5sZW5ndGggPiAwOworICAgIHZhciBkZWNyeXB0ID0gdGhpcy5kZWNyeXB0OworICAgIGNodW5rID0gZGVjcnlwdChjaHVuaywgIWhhc01vcmVEYXRhKTsKKyAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CisgICAgdmFyIGksCisgICAgICAgIG4gPSBjaHVuay5sZW5ndGg7CisgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4pOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGNodW5rW2ldOworICAgIH0KKworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICB9OworCisgIHJldHVybiBEZWNyeXB0U3RyZWFtOworfSgpOworCitleHBvcnRzLkRlY3J5cHRTdHJlYW0gPSBEZWNyeXB0U3RyZWFtOworCit2YXIgQXNjaWk4NVN0cmVhbSA9IGZ1bmN0aW9uIEFzY2lpODVTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBBc2NpaTg1U3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgpIHsKKyAgICB0aGlzLnN0ciA9IHN0cjsKKyAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKKyAgICB0aGlzLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoNSk7CisKKyAgICBpZiAobWF5YmVMZW5ndGgpIHsKKyAgICAgIG1heWJlTGVuZ3RoID0gMC44ICogbWF5YmVMZW5ndGg7CisgICAgfQorCisgICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgQXNjaWk4NVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIEFzY2lpODVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIEFzY2lpODVTdHJlYW1fcmVhZEJsb2NrKCkgeworICAgIHZhciBUSUxEQV9DSEFSID0gMHg3ZTsKKyAgICB2YXIgWl9MT1dFUl9DSEFSID0gMHg3YTsKKyAgICB2YXIgRU9GID0gLTE7CisgICAgdmFyIHN0ciA9IHRoaXMuc3RyOworICAgIHZhciBjID0gc3RyLmdldEJ5dGUoKTsKKworICAgIHdoaWxlICgoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjKSkgeworICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CisgICAgfQorCisgICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7CisgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoLAorICAgICAgICBidWZmZXI7CisgICAgdmFyIGk7CisKKyAgICBpZiAoYyA9PT0gWl9MT1dFUl9DSEFSKSB7CisgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyA0KTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSAwOworICAgICAgfQorCisgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSA0OworICAgIH0gZWxzZSB7CisgICAgICB2YXIgaW5wdXQgPSB0aGlzLmlucHV0OworICAgICAgaW5wdXRbMF0gPSBjOworCisgICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSB7CisgICAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpOworCisgICAgICAgIHdoaWxlICgoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjKSkgeworICAgICAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXRbaV0gPSBjOworCisgICAgICAgIGlmIChjID09PSBFT0YgfHwgYyA9PT0gVElMREFfQ0hBUikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIGkgLSAxKTsKKyAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxOworCisgICAgICBpZiAoaSA8IDUpIHsKKyAgICAgICAgZm9yICg7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgICBpbnB1dFtpXSA9IDB4MjEgKyA4NDsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdmFyIHQgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICAgIHQgPSB0ICogODUgKyAoaW5wdXRbaV0gLSAweDIxKTsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gdCAmIDB4ZmY7CisgICAgICAgIHQgPj49IDg7CisgICAgICB9CisgICAgfQorICB9OworCisgIHJldHVybiBBc2NpaTg1U3RyZWFtOworfSgpOworCitleHBvcnRzLkFzY2lpODVTdHJlYW0gPSBBc2NpaTg1U3RyZWFtOworCit2YXIgQXNjaWlIZXhTdHJlYW0gPSBmdW5jdGlvbiBBc2NpaUhleFN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEFzY2lpSGV4U3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgpIHsKKyAgICB0aGlzLnN0ciA9IHN0cjsKKyAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKKyAgICB0aGlzLmZpcnN0RGlnaXQgPSAtMTsKKworICAgIGlmIChtYXliZUxlbmd0aCkgeworICAgICAgbWF5YmVMZW5ndGggPSAwLjUgKiBtYXliZUxlbmd0aDsKKyAgICB9CisKKyAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBBc2NpaUhleFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIEFzY2lpSGV4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBBc2NpaUhleFN0cmVhbV9yZWFkQmxvY2soKSB7CisgICAgdmFyIFVQU1RSRUFNX0JMT0NLX1NJWkUgPSA4MDAwOworICAgIHZhciBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKFVQU1RSRUFNX0JMT0NLX1NJWkUpOworCisgICAgaWYgKCFieXRlcy5sZW5ndGgpIHsKKyAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbWF4RGVjb2RlTGVuZ3RoID0gYnl0ZXMubGVuZ3RoICsgMSA+PiAxOworICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIG1heERlY29kZUxlbmd0aCk7CisgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgIHZhciBmaXJzdERpZ2l0ID0gdGhpcy5maXJzdERpZ2l0OworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIGNoID0gYnl0ZXNbaV0sCisgICAgICAgICAgZGlnaXQ7CisKKyAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKKyAgICAgICAgZGlnaXQgPSBjaCAmIDB4MGY7CisgICAgICB9IGVsc2UgaWYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg0NiB8fCBjaCA+PSAweDYxICYmIGNoIDw9IDB4NjYpIHsKKyAgICAgICAgZGlnaXQgPSAoY2ggJiAweDBmKSArIDk7CisgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDNlKSB7CisgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpcnN0RGlnaXQgPCAwKSB7CisgICAgICAgIGZpcnN0RGlnaXQgPSBkaWdpdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBmaXJzdERpZ2l0IDw8IDQgfCBkaWdpdDsKKyAgICAgICAgZmlyc3REaWdpdCA9IC0xOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmaXJzdERpZ2l0ID49IDAgJiYgdGhpcy5lb2YpIHsKKyAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBmaXJzdERpZ2l0IDw8IDQ7CisgICAgICBmaXJzdERpZ2l0ID0gLTE7CisgICAgfQorCisgICAgdGhpcy5maXJzdERpZ2l0ID0gZmlyc3REaWdpdDsKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgfTsKKworICByZXR1cm4gQXNjaWlIZXhTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuQXNjaWlIZXhTdHJlYW0gPSBBc2NpaUhleFN0cmVhbTsKKwordmFyIFJ1bkxlbmd0aFN0cmVhbSA9IGZ1bmN0aW9uIFJ1bkxlbmd0aFN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFJ1bkxlbmd0aFN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7CisgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CisgICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgUnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisKKyAgUnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW1fcmVhZEJsb2NrKCkgeworICAgIHZhciByZXBlYXRIZWFkZXIgPSB0aGlzLnN0ci5nZXRCeXRlcygyKTsKKworICAgIGlmICghcmVwZWF0SGVhZGVyIHx8IHJlcGVhdEhlYWRlci5sZW5ndGggPCAyIHx8IHJlcGVhdEhlYWRlclswXSA9PT0gMTI4KSB7CisgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGJ1ZmZlcjsKKyAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CisgICAgdmFyIG4gPSByZXBlYXRIZWFkZXJbMF07CisKKyAgICBpZiAobiA8IDEyOCkgeworICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpOworICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IHJlcGVhdEhlYWRlclsxXTsKKworICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnN0ci5nZXRCeXRlcyhuKTsKKyAgICAgICAgYnVmZmVyLnNldChzb3VyY2UsIGJ1ZmZlckxlbmd0aCk7CisgICAgICAgIGJ1ZmZlckxlbmd0aCArPSBuOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBuID0gMjU3IC0gbjsKKyAgICAgIHZhciBiID0gcmVwZWF0SGVhZGVyWzFdOworICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gYjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgfTsKKworICByZXR1cm4gUnVuTGVuZ3RoU3RyZWFtOworfSgpOworCitleHBvcnRzLlJ1bkxlbmd0aFN0cmVhbSA9IFJ1bkxlbmd0aFN0cmVhbTsKKwordmFyIExaV1N0cmVhbSA9IGZ1bmN0aW9uIExaV1N0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIExaV1N0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBlYXJseUNoYW5nZSkgeworICAgIHRoaXMuc3RyID0gc3RyOworICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OworICAgIHRoaXMuY2FjaGVkRGF0YSA9IDA7CisgICAgdGhpcy5iaXRzQ2FjaGVkID0gMDsKKyAgICB2YXIgbWF4THp3RGljdGlvbmFyeVNpemUgPSA0MDk2OworICAgIHZhciBsendTdGF0ZSA9IHsKKyAgICAgIGVhcmx5Q2hhbmdlOiBlYXJseUNoYW5nZSwKKyAgICAgIGNvZGVMZW5ndGg6IDksCisgICAgICBuZXh0Q29kZTogMjU4LAorICAgICAgZGljdGlvbmFyeVZhbHVlczogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAorICAgICAgZGljdGlvbmFyeUxlbmd0aHM6IG5ldyBVaW50MTZBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCisgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAorICAgICAgY3VycmVudFNlcXVlbmNlOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCisgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGg6IDAKKyAgICB9OworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlc1tpXSA9IGk7CisgICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3Roc1tpXSA9IDE7CisgICAgfQorCisgICAgdGhpcy5sendTdGF0ZSA9IGx6d1N0YXRlOworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIExaV1N0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJpdHMgPSBmdW5jdGlvbiBMWldTdHJlYW1fcmVhZEJpdHMobikgeworICAgIHZhciBiaXRzQ2FjaGVkID0gdGhpcy5iaXRzQ2FjaGVkOworICAgIHZhciBjYWNoZWREYXRhID0gdGhpcy5jYWNoZWREYXRhOworCisgICAgd2hpbGUgKGJpdHNDYWNoZWQgPCBuKSB7CisgICAgICB2YXIgYyA9IHRoaXMuc3RyLmdldEJ5dGUoKTsKKworICAgICAgaWYgKGMgPT09IC0xKSB7CisgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNhY2hlZERhdGEgPSBjYWNoZWREYXRhIDw8IDggfCBjOworICAgICAgYml0c0NhY2hlZCArPSA4OworICAgIH0KKworICAgIHRoaXMuYml0c0NhY2hlZCA9IGJpdHNDYWNoZWQgLT0gbjsKKyAgICB0aGlzLmNhY2hlZERhdGEgPSBjYWNoZWREYXRhOworICAgIHRoaXMubGFzdENvZGUgPSBudWxsOworICAgIHJldHVybiBjYWNoZWREYXRhID4+PiBiaXRzQ2FjaGVkICYgKDEgPDwgbikgLSAxOworICB9OworCisgIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gTFpXU3RyZWFtX3JlYWRCbG9jaygpIHsKKyAgICB2YXIgYmxvY2tTaXplID0gNTEyOworICAgIHZhciBlc3RpbWF0ZWREZWNvZGVkU2l6ZSA9IGJsb2NrU2l6ZSAqIDIsCisgICAgICAgIGRlY29kZWRTaXplRGVsdGEgPSBibG9ja1NpemU7CisgICAgdmFyIGksIGosIHE7CisgICAgdmFyIGx6d1N0YXRlID0gdGhpcy5sendTdGF0ZTsKKworICAgIGlmICghbHp3U3RhdGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZWFybHlDaGFuZ2UgPSBsendTdGF0ZS5lYXJseUNoYW5nZTsKKyAgICB2YXIgbmV4dENvZGUgPSBsendTdGF0ZS5uZXh0Q29kZTsKKyAgICB2YXIgZGljdGlvbmFyeVZhbHVlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXM7CisgICAgdmFyIGRpY3Rpb25hcnlMZW5ndGhzID0gbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHM7CisgICAgdmFyIGRpY3Rpb25hcnlQcmV2Q29kZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5UHJldkNvZGVzOworICAgIHZhciBjb2RlTGVuZ3RoID0gbHp3U3RhdGUuY29kZUxlbmd0aDsKKyAgICB2YXIgcHJldkNvZGUgPSBsendTdGF0ZS5wcmV2Q29kZTsKKyAgICB2YXIgY3VycmVudFNlcXVlbmNlID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlOworICAgIHZhciBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGg7CisgICAgdmFyIGRlY29kZWRMZW5ndGggPSAwOworICAgIHZhciBjdXJyZW50QnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CisgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7CisgICAgICB2YXIgY29kZSA9IHRoaXMucmVhZEJpdHMoY29kZUxlbmd0aCk7CisgICAgICB2YXIgaGFzUHJldiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA+IDA7CisKKyAgICAgIGlmIChjb2RlIDwgMjU2KSB7CisgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVswXSA9IGNvZGU7CisgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDE7CisgICAgICB9IGVsc2UgaWYgKGNvZGUgPj0gMjU4KSB7CisgICAgICAgIGlmIChjb2RlIDwgbmV4dENvZGUpIHsKKyAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBkaWN0aW9uYXJ5TGVuZ3Roc1tjb2RlXTsKKworICAgICAgICAgIGZvciAoaiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCAtIDEsIHEgPSBjb2RlOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlW2pdID0gZGljdGlvbmFyeVZhbHVlc1txXTsKKyAgICAgICAgICAgIHEgPSBkaWN0aW9uYXJ5UHJldkNvZGVzW3FdOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdXJyZW50U2VxdWVuY2VbY3VycmVudFNlcXVlbmNlTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlWzBdOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDI1NikgeworICAgICAgICBjb2RlTGVuZ3RoID0gOTsKKyAgICAgICAgbmV4dENvZGUgPSAyNTg7CisgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICBkZWxldGUgdGhpcy5sendTdGF0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChoYXNQcmV2KSB7CisgICAgICAgIGRpY3Rpb25hcnlQcmV2Q29kZXNbbmV4dENvZGVdID0gcHJldkNvZGU7CisgICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzW25leHRDb2RlXSA9IGRpY3Rpb25hcnlMZW5ndGhzW3ByZXZDb2RlXSArIDE7CisgICAgICAgIGRpY3Rpb25hcnlWYWx1ZXNbbmV4dENvZGVdID0gY3VycmVudFNlcXVlbmNlWzBdOworICAgICAgICBuZXh0Q29kZSsrOworICAgICAgICBjb2RlTGVuZ3RoID0gbmV4dENvZGUgKyBlYXJseUNoYW5nZSAmIG5leHRDb2RlICsgZWFybHlDaGFuZ2UgLSAxID8gY29kZUxlbmd0aCA6IE1hdGgubWluKE1hdGgubG9nKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpIC8gMC42OTMxNDcxODA1NTk5NDUzICsgMSwgMTIpIHwgMDsKKyAgICAgIH0KKworICAgICAgcHJldkNvZGUgPSBjb2RlOworICAgICAgZGVjb2RlZExlbmd0aCArPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7CisKKyAgICAgIGlmIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpIHsKKyAgICAgICAgZG8geworICAgICAgICAgIGVzdGltYXRlZERlY29kZWRTaXplICs9IGRlY29kZWRTaXplRGVsdGE7CisgICAgICAgIH0gd2hpbGUgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCk7CisKKyAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBlc3RpbWF0ZWREZWNvZGVkU2l6ZSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50U2VxdWVuY2VMZW5ndGg7IGorKykgeworICAgICAgICBidWZmZXJbY3VycmVudEJ1ZmZlckxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVtqXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBsendTdGF0ZS5uZXh0Q29kZSA9IG5leHRDb2RlOworICAgIGx6d1N0YXRlLmNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoOworICAgIGx6d1N0YXRlLnByZXZDb2RlID0gcHJldkNvZGU7CisgICAgbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gY3VycmVudEJ1ZmZlckxlbmd0aDsKKyAgfTsKKworICByZXR1cm4gTFpXU3RyZWFtOworfSgpOworCitleHBvcnRzLkxaV1N0cmVhbSA9IExaV1N0cmVhbTsKKwordmFyIE51bGxTdHJlYW0gPSBmdW5jdGlvbiBOdWxsU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gTnVsbFN0cmVhbSgpIHsKKyAgICBTdHJlYW0uY2FsbCh0aGlzLCBuZXcgVWludDhBcnJheSgwKSk7CisgIH0KKworICBOdWxsU3RyZWFtLnByb3RvdHlwZSA9IFN0cmVhbS5wcm90b3R5cGU7CisgIHJldHVybiBOdWxsU3RyZWFtOworfSgpOworCitleHBvcnRzLk51bGxTdHJlYW0gPSBOdWxsU3RyZWFtOworCisvKioqLyB9KSwKKy8qIDIxMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNDSVRURmF4U3RyZWFtID0gdm9pZCAwOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMik7CisKK3ZhciBfY2NpdHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxMSk7CisKK3ZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDkpOworCit2YXIgQ0NJVFRGYXhTdHJlYW0gPSBmdW5jdGlvbiBDQ0lUVEZheFN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENDSVRURmF4U3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgsIHBhcmFtcykgeworICAgIHRoaXMuc3RyID0gc3RyOworICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShwYXJhbXMpKSB7CisgICAgICBwYXJhbXMgPSBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworICAgIH0KKworICAgIHZhciBzb3VyY2UgPSB7CisgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgeworICAgICAgICByZXR1cm4gc3RyLmdldEJ5dGUoKTsKKyAgICAgIH0KKyAgICB9OworICAgIHRoaXMuY2NpdHRGYXhEZWNvZGVyID0gbmV3IF9jY2l0dC5DQ0lUVEZheERlY29kZXIoc291cmNlLCB7CisgICAgICBLOiBwYXJhbXMuZ2V0KCJLIiksCisgICAgICBFbmRPZkxpbmU6IHBhcmFtcy5nZXQoIkVuZE9mTGluZSIpLAorICAgICAgRW5jb2RlZEJ5dGVBbGlnbjogcGFyYW1zLmdldCgiRW5jb2RlZEJ5dGVBbGlnbiIpLAorICAgICAgQ29sdW1uczogcGFyYW1zLmdldCgiQ29sdW1ucyIpLAorICAgICAgUm93czogcGFyYW1zLmdldCgiUm93cyIpLAorICAgICAgRW5kT2ZCbG9jazogcGFyYW1zLmdldCgiRW5kT2ZCbG9jayIpLAorICAgICAgQmxhY2tJczE6IHBhcmFtcy5nZXQoIkJsYWNrSXMxIikKKyAgICB9KTsKKworICAgIF9zdHJlYW0uRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgQ0NJVFRGYXhTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShfc3RyZWFtLkRlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIENDSVRURmF4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7CisgICAgd2hpbGUgKCF0aGlzLmVvZikgeworICAgICAgdmFyIGMgPSB0aGlzLmNjaXR0RmF4RGVjb2Rlci5yZWFkTmV4dENoYXIoKTsKKworICAgICAgaWYgKGMgPT09IC0xKSB7CisgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIDEpOworICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK10gPSBjOworICAgIH0KKyAgfTsKKworICByZXR1cm4gQ0NJVFRGYXhTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuQ0NJVFRGYXhTdHJlYW0gPSBDQ0lUVEZheFN0cmVhbTsKKworLyoqKi8gfSksCisvKiAyMTEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DQ0lUVEZheERlY29kZXIgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBDQ0lUVEZheERlY29kZXIgPSBmdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoKSB7CisgIHZhciBjY2l0dEVPTCA9IC0yOworICB2YXIgY2NpdHRFT0YgPSAtMTsKKyAgdmFyIHR3b0RpbVBhc3MgPSAwOworICB2YXIgdHdvRGltSG9yaXogPSAxOworICB2YXIgdHdvRGltVmVydDAgPSAyOworICB2YXIgdHdvRGltVmVydFIxID0gMzsKKyAgdmFyIHR3b0RpbVZlcnRMMSA9IDQ7CisgIHZhciB0d29EaW1WZXJ0UjIgPSA1OworICB2YXIgdHdvRGltVmVydEwyID0gNjsKKyAgdmFyIHR3b0RpbVZlcnRSMyA9IDc7CisgIHZhciB0d29EaW1WZXJ0TDMgPSA4OworICB2YXIgdHdvRGltVGFibGUgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbNywgdHdvRGltVmVydEwzXSwgWzcsIHR3b0RpbVZlcnRSM10sIFs2LCB0d29EaW1WZXJ0TDJdLCBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRSMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdXTsKKyAgdmFyIHdoaXRlVGFibGUxID0gW1stMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdXTsKKyAgdmFyIHdoaXRlVGFibGUyID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbOCwgMjldLCBbOCwgMjldLCBbOCwgMzBdLCBbOCwgMzBdLCBbOCwgNDVdLCBbOCwgNDVdLCBbOCwgNDZdLCBbOCwgNDZdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjNdLCBbNywgMjNdLCBbNywgMjNdLCBbNywgMjNdLCBbOCwgNDddLCBbOCwgNDddLCBbOCwgNDhdLCBbOCwgNDhdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbOCwgMzNdLCBbOCwgMzNdLCBbOCwgMzRdLCBbOCwgMzRdLCBbOCwgMzVdLCBbOCwgMzVdLCBbOCwgMzZdLCBbOCwgMzZdLCBbOCwgMzddLCBbOCwgMzddLCBbOCwgMzhdLCBbOCwgMzhdLCBbNywgMTldLCBbNywgMTldLCBbNywgMTldLCBbNywgMTldLCBbOCwgMzFdLCBbOCwgMzFdLCBbOCwgMzJdLCBbOCwgMzJdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzgsIDUzXSwgWzgsIDUzXSwgWzgsIDU0XSwgWzgsIDU0XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzgsIDM5XSwgWzgsIDM5XSwgWzgsIDQwXSwgWzgsIDQwXSwgWzgsIDQxXSwgWzgsIDQxXSwgWzgsIDQyXSwgWzgsIDQyXSwgWzgsIDQzXSwgWzgsIDQzXSwgWzgsIDQ0XSwgWzgsIDQ0XSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzgsIDYxXSwgWzgsIDYxXSwgWzgsIDYyXSwgWzgsIDYyXSwgWzgsIDYzXSwgWzgsIDYzXSwgWzgsIDBdLCBbOCwgMF0sIFs4LCAzMjBdLCBbOCwgMzIwXSwgWzgsIDM4NF0sIFs4LCAzODRdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNywgMjddLCBbNywgMjddLCBbNywgMjddLCBbNywgMjddLCBbOCwgNTldLCBbOCwgNTldLCBbOCwgNjBdLCBbOCwgNjBdLCBbOSwgMTQ3Ml0sIFs5LCAxNTM2XSwgWzksIDE2MDBdLCBbOSwgMTcyOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs4LCA0OV0sIFs4LCA0OV0sIFs4LCA1MF0sIFs4LCA1MF0sIFs4LCA1MV0sIFs4LCA1MV0sIFs4LCA1Ml0sIFs4LCA1Ml0sIFs3LCAyNV0sIFs3LCAyNV0sIFs3LCAyNV0sIFs3LCAyNV0sIFs4LCA1NV0sIFs4LCA1NV0sIFs4LCA1Nl0sIFs4LCA1Nl0sIFs4LCA1N10sIFs4LCA1N10sIFs4LCA1OF0sIFs4LCA1OF0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs4LCA0NDhdLCBbOCwgNDQ4XSwgWzgsIDUxMl0sIFs4LCA1MTJdLCBbOSwgNzA0XSwgWzksIDc2OF0sIFs4LCA2NDBdLCBbOCwgNjQwXSwgWzgsIDU3Nl0sIFs4LCA1NzZdLCBbOSwgODMyXSwgWzksIDg5Nl0sIFs5LCA5NjBdLCBbOSwgMTAyNF0sIFs5LCAxMDg4XSwgWzksIDExNTJdLCBbOSwgMTIxNl0sIFs5LCAxMjgwXSwgWzksIDEzNDRdLCBbOSwgMTQwOF0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN11dOworICB2YXIgYmxhY2tUYWJsZTEgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWzEyLCBjY2l0dEVPTF0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdLCBbMTIsIDI1NjBdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMiwgNTJdLCBbMTIsIDUyXSwgWzEzLCA2NDBdLCBbMTMsIDcwNF0sIFsxMywgNzY4XSwgWzEzLCA4MzJdLCBbMTIsIDU1XSwgWzEyLCA1NV0sIFsxMiwgNTZdLCBbMTIsIDU2XSwgWzEzLCAxMjgwXSwgWzEzLCAxMzQ0XSwgWzEzLCAxNDA4XSwgWzEzLCAxNDcyXSwgWzEyLCA1OV0sIFsxMiwgNTldLCBbMTIsIDYwXSwgWzEyLCA2MF0sIFsxMywgMTUzNl0sIFsxMywgMTYwMF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzEzLCAxNjY0XSwgWzEzLCAxNzI4XSwgWzEyLCAzMjBdLCBbMTIsIDMyMF0sIFsxMiwgMzg0XSwgWzEyLCAzODRdLCBbMTIsIDQ0OF0sIFsxMiwgNDQ4XSwgWzEzLCA1MTJdLCBbMTMsIDU3Nl0sIFsxMiwgNTNdLCBbMTIsIDUzXSwgWzEyLCA1NF0sIFsxMiwgNTRdLCBbMTMsIDg5Nl0sIFsxMywgOTYwXSwgWzEzLCAxMDI0XSwgWzEzLCAxMDg4XSwgWzEzLCAxMTUyXSwgWzEzLCAxMjE2XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdXTsKKyAgdmFyIGJsYWNrVGFibGUyID0gW1s4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFsxMSwgMjNdLCBbMTEsIDIzXSwgWzEyLCA1MF0sIFsxMiwgNTFdLCBbMTIsIDQ0XSwgWzEyLCA0NV0sIFsxMiwgNDZdLCBbMTIsIDQ3XSwgWzEyLCA1N10sIFsxMiwgNThdLCBbMTIsIDYxXSwgWzEyLCAyNTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMiwgNDhdLCBbMTIsIDQ5XSwgWzEyLCA2Ml0sIFsxMiwgNjNdLCBbMTIsIDMwXSwgWzEyLCAzMV0sIFsxMiwgMzJdLCBbMTIsIDMzXSwgWzEyLCA0MF0sIFsxMiwgNDFdLCBbMTEsIDIyXSwgWzExLCAyMl0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFsxMiwgMTI4XSwgWzEyLCAxOTJdLCBbMTIsIDI2XSwgWzEyLCAyN10sIFsxMiwgMjhdLCBbMTIsIDI5XSwgWzExLCAxOV0sIFsxMSwgMTldLCBbMTEsIDIwXSwgWzExLCAyMF0sIFsxMiwgMzRdLCBbMTIsIDM1XSwgWzEyLCAzNl0sIFsxMiwgMzddLCBbMTIsIDM4XSwgWzEyLCAzOV0sIFsxMSwgMjFdLCBbMTEsIDIxXSwgWzEyLCA0Ml0sIFsxMiwgNDNdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXTsKKyAgdmFyIGJsYWNrVGFibGUzID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbNiwgOV0sIFs2LCA4XSwgWzUsIDddLCBbNSwgN10sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdXTsKKworICBmdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoc291cmNlKSB7CisgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9OworCisgICAgaWYgKCFzb3VyY2UgfHwgdHlwZW9mIHNvdXJjZS5uZXh0ICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgInNvdXJjZSIgcGFyYW1ldGVyLicpOworICAgIH0KKworICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgIHRoaXMuZW9mID0gZmFsc2U7CisgICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuSyB8fCAwOworICAgIHRoaXMuZW9saW5lID0gb3B0aW9ucy5FbmRPZkxpbmUgfHwgZmFsc2U7CisgICAgdGhpcy5ieXRlQWxpZ24gPSBvcHRpb25zLkVuY29kZWRCeXRlQWxpZ24gfHwgZmFsc2U7CisgICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5Db2x1bW5zIHx8IDE3Mjg7CisgICAgdGhpcy5yb3dzID0gb3B0aW9ucy5Sb3dzIHx8IDA7CisgICAgdmFyIGVvYmxvY2sgPSBvcHRpb25zLkVuZE9mQmxvY2s7CisKKyAgICBpZiAoZW9ibG9jayA9PT0gbnVsbCB8fCBlb2Jsb2NrID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGVvYmxvY2sgPSB0cnVlOworICAgIH0KKworICAgIHRoaXMuZW9ibG9jayA9IGVvYmxvY2s7CisgICAgdGhpcy5ibGFjayA9IG9wdGlvbnMuQmxhY2tJczEgfHwgZmFsc2U7CisgICAgdGhpcy5jb2RpbmdMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDEpOworICAgIHRoaXMucmVmTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAyKTsKKyAgICB0aGlzLmNvZGluZ0xpbmVbMF0gPSB0aGlzLmNvbHVtbnM7CisgICAgdGhpcy5jb2RpbmdQb3MgPSAwOworICAgIHRoaXMucm93ID0gMDsKKyAgICB0aGlzLm5leHRMaW5lMkQgPSB0aGlzLmVuY29kaW5nIDwgMDsKKyAgICB0aGlzLmlucHV0Qml0cyA9IDA7CisgICAgdGhpcy5pbnB1dEJ1ZiA9IDA7CisgICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKKyAgICB0aGlzLnJvd3NEb25lID0gZmFsc2U7CisgICAgdmFyIGNvZGUxOworCisgICAgd2hpbGUgKChjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKSkgPT09IDApIHsKKyAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisgICAgfQorCisgICAgaWYgKGNvZGUxID09PSAxKSB7CisgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgIHRoaXMubmV4dExpbmUyRCA9ICF0aGlzLl9sb29rQml0cygxKTsKKworICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICB9CisgIH0KKworICBDQ0lUVEZheERlY29kZXIucHJvdG90eXBlID0geworICAgIHJlYWROZXh0Q2hhcjogZnVuY3Rpb24gcmVhZE5leHRDaGFyKCkgeworICAgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlZkxpbmUgPSB0aGlzLnJlZkxpbmU7CisgICAgICB2YXIgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKKyAgICAgIHZhciBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOworICAgICAgdmFyIHJlZlBvcywgYmxhY2tQaXhlbHMsIGJpdHMsIGk7CisKKyAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDApIHsKKyAgICAgICAgaWYgKHRoaXMucm93c0RvbmUpIHsKKyAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmVyciA9IGZhbHNlOworICAgICAgICB2YXIgY29kZTEsIGNvZGUyLCBjb2RlMzsKKworICAgICAgICBpZiAodGhpcy5uZXh0TGluZTJEKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgY29kaW5nTGluZVtpXSA8IGNvbHVtbnM7ICsraSkgeworICAgICAgICAgICAgcmVmTGluZVtpXSA9IGNvZGluZ0xpbmVbaV07CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVmTGluZVtpKytdID0gY29sdW1uczsKKyAgICAgICAgICByZWZMaW5lW2ldID0gY29sdW1uczsKKyAgICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKKyAgICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CisgICAgICAgICAgcmVmUG9zID0gMDsKKyAgICAgICAgICBibGFja1BpeGVscyA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2dldFR3b0RpbUNvZGUoKTsKKworICAgICAgICAgICAgc3dpdGNoIChjb2RlMSkgeworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVBhc3M6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zICsgMV0sIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWZMaW5lW3JlZlBvcyArIDFdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1Ib3JpejoKKyAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUyID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgeworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworCisgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CisgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKKyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMiwgYmxhY2tQaXhlbHMgXiAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIzOgorICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAzLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOworCisgICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRSMjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdICsgMiwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjE6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICArK3JlZlBvczsKKworICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydDA6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDM6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDMsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDI6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDIsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDE6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBjY2l0dEVPRjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoImJhZCAyZCBjb2RlIik7CisKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVyciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOworICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKKyAgICAgICAgICBibGFja1BpeGVscyA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICBjb2RlMSA9IDA7CisKKyAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgeworICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CisgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ290RU9MID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHRoaXMuYnl0ZUFsaWduKSB7CisgICAgICAgICAgdGhpcy5pbnB1dEJpdHMgJj0gfjc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuZW9ibG9jayAmJiB0aGlzLnJvdyA9PT0gdGhpcy5yb3dzIC0gMSkgeworICAgICAgICAgIHRoaXMucm93c0RvbmUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOworCisgICAgICAgICAgaWYgKHRoaXMuZW9saW5lKSB7CisgICAgICAgICAgICB3aGlsZSAoY29kZTEgIT09IGNjaXR0RU9GICYmIGNvZGUxICE9PSAxKSB7CisgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdoaWxlIChjb2RlMSA9PT0gMCkgeworICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjb2RlMSA9PT0gMSkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICAgIGdvdEVPTCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuZW9mICYmIHRoaXMuZW5jb2RpbmcgPiAwICYmICF0aGlzLnJvd3NEb25lKSB7CisgICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOworCisgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmVvYmxvY2sgJiYgZ290RU9MICYmIHRoaXMuYnl0ZUFsaWduKSB7CisgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICBpZiAoY29kZTEgPT09IDEpIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworCisgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7CisKKyAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPj0gMCkgeworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHsKKyAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIHJ0YyBjb2RlOiAiICsgY29kZTEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKKworICAgICAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVyciAmJiB0aGlzLmVvbGluZSkgeworICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKKworICAgICAgICAgICAgaWYgKGNvZGUxID09PSBjY2l0dEVPRikgeworICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGUxID4+IDEgPT09IDEpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgIHRoaXMubmV4dExpbmUyRCA9ICEoY29kZTEgJiAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kaW5nTGluZVswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zID0gMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyA9IDFdOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5yb3crKzsKKyAgICAgIH0KKworICAgICAgdmFyIGM7CisKKyAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPj0gOCkgeworICAgICAgICBjID0gdGhpcy5jb2RpbmdQb3MgJiAxID8gMCA6IDB4ZmY7CisgICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSA4OworCisgICAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDAgJiYgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYml0cyA9IDg7CisgICAgICAgIGMgPSAwOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykgeworICAgICAgICAgICAgYyA8PD0gYml0czsKKworICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgeworICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIGJpdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSBiaXRzOworICAgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMgPDw9IHRoaXMub3V0cHV0Qml0czsKKworICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgeworICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIHRoaXMub3V0cHV0Qml0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0cyAtPSB0aGlzLm91dHB1dEJpdHM7CisgICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSAwOworCisgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7CisgICAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdOworICAgICAgICAgICAgfSBlbHNlIGlmIChiaXRzID4gMCkgeworICAgICAgICAgICAgICBjIDw8PSBiaXRzOworICAgICAgICAgICAgICBiaXRzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGJpdHMpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5ibGFjaykgeworICAgICAgICBjIF49IDB4ZmY7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjOworICAgIH0sCisgICAgX2FkZFBpeGVsczogZnVuY3Rpb24gX2FkZFBpeGVscyhhMSwgYmxhY2tQaXhlbHMpIHsKKyAgICAgIHZhciBjb2RpbmdMaW5lID0gdGhpcy5jb2RpbmdMaW5lOworICAgICAgdmFyIGNvZGluZ1BvcyA9IHRoaXMuY29kaW5nUG9zOworCisgICAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKKyAgICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7CisgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOworICAgICAgICAgIGExID0gdGhpcy5jb2x1bW5zOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGluZ1BvcyAmIDEgXiBibGFja1BpeGVscykgeworICAgICAgICAgICsrY29kaW5nUG9zOworICAgICAgICB9CisKKyAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zOworICAgIH0sCisgICAgX2FkZFBpeGVsc05lZzogZnVuY3Rpb24gX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHsKKyAgICAgIHZhciBjb2RpbmdMaW5lID0gdGhpcy5jb2RpbmdMaW5lOworICAgICAgdmFyIGNvZGluZ1BvcyA9IHRoaXMuY29kaW5nUG9zOworCisgICAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKKyAgICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7CisgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOworICAgICAgICAgIGExID0gdGhpcy5jb2x1bW5zOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGluZ1BvcyAmIDEgXiBibGFja1BpeGVscykgeworICAgICAgICAgICsrY29kaW5nUG9zOworICAgICAgICB9CisKKyAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CisgICAgICB9IGVsc2UgaWYgKGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7CisgICAgICAgIGlmIChhMSA8IDApIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoImludmFsaWQgY29kZSIpOworICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKKyAgICAgICAgICBhMSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoY29kaW5nUG9zID4gMCAmJiBhMSA8IGNvZGluZ0xpbmVbY29kaW5nUG9zIC0gMV0pIHsKKyAgICAgICAgICAtLWNvZGluZ1BvczsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOworICAgICAgfQorCisgICAgICB0aGlzLmNvZGluZ1BvcyA9IGNvZGluZ1BvczsKKyAgICB9LAorICAgIF9maW5kVGFibGVDb2RlOiBmdW5jdGlvbiBfZmluZFRhYmxlQ29kZShzdGFydCwgZW5kLCB0YWJsZSwgbGltaXQpIHsKKyAgICAgIHZhciBsaW1pdFZhbHVlID0gbGltaXQgfHwgMDsKKworICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgKytpKSB7CisgICAgICAgIHZhciBjb2RlID0gdGhpcy5fbG9va0JpdHMoaSk7CisKKyAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CisgICAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IGVuZCkgeworICAgICAgICAgIGNvZGUgPDw9IGVuZCAtIGk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpbWl0VmFsdWUgfHwgY29kZSA+PSBsaW1pdFZhbHVlKSB7CisgICAgICAgICAgdmFyIHAgPSB0YWJsZVtjb2RlIC0gbGltaXRWYWx1ZV07CisKKyAgICAgICAgICBpZiAocFswXSA9PT0gaSkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cyhpKTsKKworICAgICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIFtmYWxzZSwgMCwgZmFsc2VdOworICAgIH0sCisgICAgX2dldFR3b0RpbUNvZGU6IGZ1bmN0aW9uIF9nZXRUd29EaW1Db2RlKCkgeworICAgICAgdmFyIGNvZGUgPSAwOworICAgICAgdmFyIHA7CisKKyAgICAgIGlmICh0aGlzLmVvYmxvY2spIHsKKyAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDcpOworICAgICAgICBwID0gdHdvRGltVGFibGVbY29kZV07CisKKyAgICAgICAgaWYgKHAgJiYgcFswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOworCisgICAgICAgICAgcmV0dXJuIHBbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDcsIHR3b0RpbVRhYmxlKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdICYmIHJlc3VsdFsyXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJCYWQgdHdvIGRpbSBjb2RlIik7CisgICAgICByZXR1cm4gY2NpdHRFT0Y7CisgICAgfSwKKyAgICBfZ2V0V2hpdGVDb2RlOiBmdW5jdGlvbiBfZ2V0V2hpdGVDb2RlKCkgeworICAgICAgdmFyIGNvZGUgPSAwOworICAgICAgdmFyIHA7CisKKyAgICAgIGlmICh0aGlzLmVvYmxvY2spIHsKKyAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKKworICAgICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RlID4+IDUgPT09IDApIHsKKyAgICAgICAgICBwID0gd2hpdGVUYWJsZTFbY29kZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcCA9IHdoaXRlVGFibGUyW2NvZGUgPj4gM107CisgICAgICAgIH0KKworICAgICAgICBpZiAocFswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOworCisgICAgICAgICAgcmV0dXJuIHBbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsIDEyLCB3aGl0ZVRhYmxlMSk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJiYWQgd2hpdGUgY29kZSIpOworCisgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICByZXR1cm4gMTsKKyAgICB9LAorICAgIF9nZXRCbGFja0NvZGU6IGZ1bmN0aW9uIF9nZXRCbGFja0NvZGUoKSB7CisgICAgICB2YXIgY29kZSwgcDsKKworICAgICAgaWYgKHRoaXMuZW9ibG9jaykgeworICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoMTMpOworCisgICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkgeworICAgICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7CisgICAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBbMF0gPiAwKSB7CisgICAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKKworICAgICAgICAgIHJldHVybiBwWzFdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgyLCA2LCBibGFja1RhYmxlMyk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDcsIDEyLCBibGFja1RhYmxlMiwgNjQpOworCisgICAgICAgIGlmIChyZXN1bHRbMF0pIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoImJhZCBibGFjayBjb2RlIik7CisKKyAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgIHJldHVybiAxOworICAgIH0sCisgICAgX2xvb2tCaXRzOiBmdW5jdGlvbiBfbG9va0JpdHMobikgeworICAgICAgdmFyIGM7CisKKyAgICAgIHdoaWxlICh0aGlzLmlucHV0Qml0cyA8IG4pIHsKKyAgICAgICAgaWYgKChjID0gdGhpcy5zb3VyY2UubmV4dCgpKSA9PT0gLTEpIHsKKyAgICAgICAgICBpZiAodGhpcy5pbnB1dEJpdHMgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjY2l0dEVPRjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dEJ1ZiA8PCBuIC0gdGhpcy5pbnB1dEJpdHMgJiAweGZmZmYgPj4gMTYgLSBuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pbnB1dEJ1ZiA9IHRoaXMuaW5wdXRCdWYgPDwgOCB8IGM7CisgICAgICAgIHRoaXMuaW5wdXRCaXRzICs9IDg7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmlucHV0QnVmID4+IHRoaXMuaW5wdXRCaXRzIC0gbiAmIDB4ZmZmZiA+PiAxNiAtIG47CisgICAgfSwKKyAgICBfZWF0Qml0czogZnVuY3Rpb24gX2VhdEJpdHMobikgeworICAgICAgaWYgKCh0aGlzLmlucHV0Qml0cyAtPSBuKSA8IDApIHsKKyAgICAgICAgdGhpcy5pbnB1dEJpdHMgPSAwOworICAgICAgfQorICAgIH0KKyAgfTsKKyAgcmV0dXJuIENDSVRURmF4RGVjb2RlcjsKK30oKTsKKworZXhwb3J0cy5DQ0lUVEZheERlY29kZXIgPSBDQ0lUVEZheERlY29kZXI7CisKKy8qKiovIH0pLAorLyogMjEyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSmJpZzJTdHJlYW0gPSB2b2lkIDA7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjAyKTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOSk7CisKK3ZhciBfamJpZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjEzKTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIEpiaWcyU3RyZWFtID0gZnVuY3Rpb24gSmJpZzJTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBKYmlnMlN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBkaWN0LCBwYXJhbXMpIHsKKyAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CisgICAgdGhpcy5kaWN0ID0gZGljdDsKKyAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKworICAgIF9zdHJlYW0uRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgSmJpZzJTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShfc3RyZWFtLkRlY29kZVN0cmVhbS5wcm90b3R5cGUpOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSmJpZzJTdHJlYW0ucHJvdG90eXBlLCAiYnl0ZXMiLCB7CisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImJ5dGVzIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpOworICAgIH0sCisgICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworCisgIEpiaWcyU3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7fTsKKworICBKYmlnMlN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkgeworICAgIGlmICh0aGlzLmVvZikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBqYmlnMkltYWdlID0gbmV3IF9qYmlnLkpiaWcySW1hZ2UoKTsKKyAgICB2YXIgY2h1bmtzID0gW107CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkodGhpcy5wYXJhbXMpKSB7CisgICAgICB2YXIgZ2xvYmFsc1N0cmVhbSA9IHRoaXMucGFyYW1zLmdldCgiSkJJRzJHbG9iYWxzIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGdsb2JhbHNTdHJlYW0pKSB7CisgICAgICAgIHZhciBnbG9iYWxzID0gZ2xvYmFsc1N0cmVhbS5nZXRCeXRlcygpOworICAgICAgICBjaHVua3MucHVzaCh7CisgICAgICAgICAgZGF0YTogZ2xvYmFscywKKyAgICAgICAgICBzdGFydDogMCwKKyAgICAgICAgICBlbmQ6IGdsb2JhbHMubGVuZ3RoCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIGNodW5rcy5wdXNoKHsKKyAgICAgIGRhdGE6IHRoaXMuYnl0ZXMsCisgICAgICBzdGFydDogMCwKKyAgICAgIGVuZDogdGhpcy5ieXRlcy5sZW5ndGgKKyAgICB9KTsKKyAgICB2YXIgZGF0YSA9IGpiaWcySW1hZ2UucGFyc2VDaHVua3MoY2h1bmtzKTsKKyAgICB2YXIgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHsKKyAgICAgIGRhdGFbaV0gXj0gMHhmZjsKKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7CisgICAgdGhpcy5idWZmZXJMZW5ndGggPSBkYXRhTGVuZ3RoOworICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgfTsKKworICByZXR1cm4gSmJpZzJTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuSmJpZzJTdHJlYW0gPSBKYmlnMlN0cmVhbTsKKworLyoqKi8gfSksCisvKiAyMTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5KYmlnMkltYWdlID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK3ZhciBfYXJpdGhtZXRpY19kZWNvZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTQpOworCit2YXIgX2NjaXR0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTEpOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKwordmFyIEpiaWcyRXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlRXhjZXB0aW9uKSB7CisgIF9pbmhlcml0cyhKYmlnMkVycm9yLCBfQmFzZUV4Y2VwdGlvbik7CisKKyAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKYmlnMkVycm9yKTsKKworICBmdW5jdGlvbiBKYmlnMkVycm9yKG1zZykgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBKYmlnMkVycm9yKTsKKworICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAiSkJJRzIgZXJyb3I6ICIuY29uY2F0KG1zZykpOworICB9CisKKyAgcmV0dXJuIEpiaWcyRXJyb3I7Cit9KF91dGlsLkJhc2VFeGNlcHRpb24pOworCit2YXIgSmJpZzJJbWFnZSA9IGZ1bmN0aW9uIEpiaWcySW1hZ2VDbG9zdXJlKCkgeworICBmdW5jdGlvbiBDb250ZXh0Q2FjaGUoKSB7fQorCisgIENvbnRleHRDYWNoZS5wcm90b3R5cGUgPSB7CisgICAgZ2V0Q29udGV4dHM6IGZ1bmN0aW9uIGdldENvbnRleHRzKGlkKSB7CisgICAgICBpZiAoaWQgaW4gdGhpcykgeworICAgICAgICByZXR1cm4gdGhpc1tpZF07CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzW2lkXSA9IG5ldyBJbnQ4QXJyYXkoMSA8PCAxNik7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgdGhpcy5lbmQgPSBlbmQ7CisgIH0KKworICBEZWNvZGluZ0NvbnRleHQucHJvdG90eXBlID0geworICAgIGdldCBkZWNvZGVyKCkgeworICAgICAgdmFyIGRlY29kZXIgPSBuZXcgX2FyaXRobWV0aWNfZGVjb2Rlci5Bcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZGVjb2RlciIsIGRlY29kZXIpOworICAgIH0sCisKKyAgICBnZXQgY29udGV4dENhY2hlKCkgeworICAgICAgdmFyIGNhY2hlID0gbmV3IENvbnRleHRDYWNoZSgpOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjb250ZXh0Q2FjaGUiLCBjYWNoZSk7CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIHByb2NlZHVyZSwgZGVjb2RlcikgeworICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpOworICAgIHZhciBwcmV2ID0gMTsKKworICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGxlbmd0aCkgeworICAgICAgdmFyIHYgPSAwOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpOworICAgICAgICBwcmV2ID0gcHJldiA8IDI1NiA/IHByZXYgPDwgMSB8IGJpdCA6IChwcmV2IDw8IDEgfCBiaXQpICYgNTExIHwgMjU2OworICAgICAgICB2ID0gdiA8PCAxIHwgYml0OworICAgICAgfQorCisgICAgICByZXR1cm4gdiA+Pj4gMDsKKyAgICB9CisKKyAgICB2YXIgc2lnbiA9IHJlYWRCaXRzKDEpOworICAgIHZhciB2YWx1ZSA9IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygzMikgKyA0NDM2IDogcmVhZEJpdHMoMTIpICsgMzQwIDogcmVhZEJpdHMoOCkgKyA4NCA6IHJlYWRCaXRzKDYpICsgMjAgOiByZWFkQml0cyg0KSArIDQgOiByZWFkQml0cygyKTsKKworICAgIGlmIChzaWduID09PSAwKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgIHJldHVybiAtdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkgeworICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiSUFJRCIpOworICAgIHZhciBwcmV2ID0gMTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZUxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKKyAgICAgIHByZXYgPSBwcmV2IDw8IDEgfCBiaXQ7CisgICAgfQorCisgICAgaWYgKGNvZGVMZW5ndGggPCAzMSkgeworICAgICAgcmV0dXJuIHByZXYgJiAoMSA8PCBjb2RlTGVuZ3RoKSAtIDE7CisgICAgfQorCisgICAgcmV0dXJuIHByZXYgJiAweDdmZmZmZmZmOworICB9CisKKyAgdmFyIFNlZ21lbnRUeXBlcyA9IFsiU3ltYm9sRGljdGlvbmFyeSIsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVUZXh0UmVnaW9uIiwgbnVsbCwgIkltbWVkaWF0ZVRleHRSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlBhdHRlcm5EaWN0aW9uYXJ5IiwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwgbnVsbCwgIkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVHZW5lcmljUmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbiIsICJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWZpbmVtZW50UmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlBhZ2VJbmZvcm1hdGlvbiIsICJFbmRPZlBhZ2UiLCAiRW5kT2ZTdHJpcGUiLCAiRW5kT2ZGaWxlIiwgIlByb2ZpbGVzIiwgIlRhYmxlcyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJFeHRlbnNpb24iXTsKKyAgdmFyIENvZGluZ1RlbXBsYXRlcyA9IFtbeworICAgIHg6IC0xLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC00LAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0zLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IDAKKyAgfV0sIFt7CisgICAgeDogLTEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDIsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTMsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogMAorICB9XSwgW3sKKyAgICB4OiAtMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAwCisgIH1dLCBbeworICAgIHg6IC0zLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC00LAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0zLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IDAKKyAgfV1dOworICB2YXIgUmVmaW5lbWVudFRlbXBsYXRlcyA9IFt7CisgICAgY29kaW5nOiBbeworICAgICAgeDogMCwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogLTEsCisgICAgICB5OiAwCisgICAgfV0sCisgICAgcmVmZXJlbmNlOiBbeworICAgICAgeDogMCwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogLTEsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMCwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMQorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAxCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IDEKKyAgICB9XQorICB9LCB7CisgICAgY29kaW5nOiBbeworICAgICAgeDogLTEsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMAorICAgIH1dLAorICAgIHJlZmVyZW5jZTogW3sKKyAgICAgIHg6IDAsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAxCisgICAgfV0KKyAgfV07CisgIHZhciBSZXVzZWRDb250ZXh0cyA9IFsweDliMjUsIDB4MDc5NSwgMHgwMGU1LCAweDAxOTVdOworICB2YXIgUmVmaW5lbWVudFJldXNlZENvbnRleHRzID0gWzB4MDAyMCwgMHgwMDA4XTsKKworICBmdW5jdGlvbiBkZWNvZGVCaXRtYXBUZW1wbGF0ZTAod2lkdGgsIGhlaWdodCwgZGVjb2RpbmdDb250ZXh0KSB7CisgICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKKyAgICB2YXIgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOworICAgIHZhciBjb250ZXh0TGFiZWwsCisgICAgICAgIGksCisgICAgICAgIGosCisgICAgICAgIHBpeGVsLAorICAgICAgICByb3csCisgICAgICAgIHJvdzEsCisgICAgICAgIHJvdzIsCisgICAgICAgIGJpdG1hcCA9IFtdOworICAgIHZhciBPTERfUElYRUxfTUFTSyA9IDB4N2JmNzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgcm93ID0gYml0bWFwW2ldID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgcm93MSA9IGkgPCAxID8gcm93IDogYml0bWFwW2kgLSAxXTsKKyAgICAgIHJvdzIgPSBpIDwgMiA/IHJvdyA6IGJpdG1hcFtpIC0gMl07CisgICAgICBjb250ZXh0TGFiZWwgPSByb3cyWzBdIDw8IDEzIHwgcm93MlsxXSA8PCAxMiB8IHJvdzJbMl0gPDwgMTEgfCByb3cxWzBdIDw8IDcgfCByb3cxWzFdIDw8IDYgfCByb3cxWzJdIDw8IDUgfCByb3cxWzNdIDw8IDQ7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIHJvd1tqXSA9IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICBjb250ZXh0TGFiZWwgPSAoY29udGV4dExhYmVsICYgT0xEX1BJWEVMX01BU0spIDw8IDEgfCAoaiArIDMgPCB3aWR0aCA/IHJvdzJbaiArIDNdIDw8IDExIDogMCkgfCAoaiArIDQgPCB3aWR0aCA/IHJvdzFbaiArIDRdIDw8IDQgOiAwKSB8IHBpeGVsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVCaXRtYXAobW1yLCB3aWR0aCwgaGVpZ2h0LCB0ZW1wbGF0ZUluZGV4LCBwcmVkaWN0aW9uLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KSB7CisgICAgaWYgKG1tcikgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKKyAgICAgIHJldHVybiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAodGVtcGxhdGVJbmRleCA9PT0gMCAmJiAhc2tpcCAmJiAhcHJlZGljdGlvbiAmJiBhdC5sZW5ndGggPT09IDQgJiYgYXRbMF0ueCA9PT0gMyAmJiBhdFswXS55ID09PSAtMSAmJiBhdFsxXS54ID09PSAtMyAmJiBhdFsxXS55ID09PSAtMSAmJiBhdFsyXS54ID09PSAyICYmIGF0WzJdLnkgPT09IC0yICYmIGF0WzNdLnggPT09IC0yICYmIGF0WzNdLnkgPT09IC0yKSB7CisgICAgICByZXR1cm4gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgfQorCisgICAgdmFyIHVzZXNraXAgPSAhIXNraXA7CisgICAgdmFyIHRlbXBsYXRlID0gQ29kaW5nVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvbmNhdChhdCk7CisgICAgdGVtcGxhdGUuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgcmV0dXJuIGEueSAtIGIueSB8fCBhLnggLSBiLng7CisgICAgfSk7CisgICAgdmFyIHRlbXBsYXRlTGVuZ3RoID0gdGVtcGxhdGUubGVuZ3RoOworICAgIHZhciB0ZW1wbGF0ZVggPSBuZXcgSW50OEFycmF5KHRlbXBsYXRlTGVuZ3RoKTsKKyAgICB2YXIgdGVtcGxhdGVZID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CisgICAgdmFyIGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzID0gW107CisgICAgdmFyIHJldXNlTWFzayA9IDAsCisgICAgICAgIG1pblggPSAwLAorICAgICAgICBtYXhYID0gMCwKKyAgICAgICAgbWluWSA9IDA7CisgICAgdmFyIGMsIGs7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgdGVtcGxhdGVYW2tdID0gdGVtcGxhdGVba10ueDsKKyAgICAgIHRlbXBsYXRlWVtrXSA9IHRlbXBsYXRlW2tdLnk7CisgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgdGVtcGxhdGVba10ueCk7CisgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgdGVtcGxhdGVba10ueCk7CisgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgdGVtcGxhdGVba10ueSk7CisKKyAgICAgIGlmIChrIDwgdGVtcGxhdGVMZW5ndGggLSAxICYmIHRlbXBsYXRlW2tdLnkgPT09IHRlbXBsYXRlW2sgKyAxXS55ICYmIHRlbXBsYXRlW2tdLnggPT09IHRlbXBsYXRlW2sgKyAxXS54IC0gMSkgeworICAgICAgICByZXVzZU1hc2sgfD0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMucHVzaChrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMubGVuZ3RoOworICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKKyAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CisgICAgdmFyIGNoYW5naW5nVGVtcGxhdGVCaXQgPSBuZXcgVWludDE2QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKKworICAgIGZvciAoYyA9IDA7IGMgPCBjaGFuZ2luZ0VudHJpZXNMZW5ndGg7IGMrKykgeworICAgICAgayA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzW2NdOworICAgICAgY2hhbmdpbmdUZW1wbGF0ZVhbY10gPSB0ZW1wbGF0ZVtrXS54OworICAgICAgY2hhbmdpbmdUZW1wbGF0ZVlbY10gPSB0ZW1wbGF0ZVtrXS55OworICAgICAgY2hhbmdpbmdUZW1wbGF0ZUJpdFtjXSA9IDEgPDwgdGVtcGxhdGVMZW5ndGggLSAxIC0gazsKKyAgICB9CisKKyAgICB2YXIgc2JiX2xlZnQgPSAtbWluWDsKKyAgICB2YXIgc2JiX3RvcCA9IC1taW5ZOworICAgIHZhciBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7CisgICAgdmFyIHBzZXVkb1BpeGVsQ29udGV4dCA9IFJldXNlZENvbnRleHRzW3RlbXBsYXRlSW5kZXhdOworICAgIHZhciByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKTsKKyAgICB2YXIgbHRwID0gMCwKKyAgICAgICAgaiwKKyAgICAgICAgaTAsCisgICAgICAgIGowLAorICAgICAgICBjb250ZXh0TGFiZWwgPSAwLAorICAgICAgICBiaXQsCisgICAgICAgIHNoaWZ0OworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgaWYgKHByZWRpY3Rpb24pIHsKKyAgICAgICAgdmFyIHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7CisgICAgICAgIGx0cCBePSBzbHRwOworCisgICAgICAgIGlmIChsdHApIHsKKyAgICAgICAgICBiaXRtYXAucHVzaChyb3cpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHJvdyk7CisgICAgICBiaXRtYXAucHVzaChyb3cpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICBpZiAodXNlc2tpcCAmJiBza2lwW2ldW2pdKSB7CisgICAgICAgICAgcm93W2pdID0gMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqID49IHNiYl9sZWZ0ICYmIGogPCBzYmJfcmlnaHQgJiYgaSA+PSBzYmJfdG9wKSB7CisgICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgJiByZXVzZU1hc2s7CisKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIGkwID0gaSArIGNoYW5naW5nVGVtcGxhdGVZW2tdOworICAgICAgICAgICAgajAgPSBqICsgY2hhbmdpbmdUZW1wbGF0ZVhba107CisgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTsKKworICAgICAgICAgICAgaWYgKGJpdCkgeworICAgICAgICAgICAgICBiaXQgPSBjaGFuZ2luZ1RlbXBsYXRlQml0W2tdOworICAgICAgICAgICAgICBjb250ZXh0TGFiZWwgfD0gYml0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSAwOworICAgICAgICAgIHNoaWZ0ID0gdGVtcGxhdGVMZW5ndGggLSAxOworCisgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyssIHNoaWZ0LS0pIHsKKyAgICAgICAgICAgIGowID0gaiArIHRlbXBsYXRlWFtrXTsKKworICAgICAgICAgICAgaWYgKGowID49IDAgJiYgajAgPCB3aWR0aCkgeworICAgICAgICAgICAgICBpMCA9IGkgKyB0ZW1wbGF0ZVlba107CisKKyAgICAgICAgICAgICAgaWYgKGkwID49IDApIHsKKyAgICAgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTsKKworICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKKyAgICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICByb3dbal0gPSBwaXhlbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlUmVmaW5lbWVudCh3aWR0aCwgaGVpZ2h0LCB0ZW1wbGF0ZUluZGV4LCByZWZlcmVuY2VCaXRtYXAsIG9mZnNldFgsIG9mZnNldFksIHByZWRpY3Rpb24sIGF0LCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICB2YXIgY29kaW5nVGVtcGxhdGUgPSBSZWZpbmVtZW50VGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvZGluZzsKKworICAgIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CisgICAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTsKKyAgICB9CisKKyAgICB2YXIgY29kaW5nVGVtcGxhdGVMZW5ndGggPSBjb2RpbmdUZW1wbGF0ZS5sZW5ndGg7CisgICAgdmFyIGNvZGluZ1RlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTsKKyAgICB2YXIgY29kaW5nVGVtcGxhdGVZID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOworICAgIHZhciBrOworCisgICAgZm9yIChrID0gMDsgayA8IGNvZGluZ1RlbXBsYXRlTGVuZ3RoOyBrKyspIHsKKyAgICAgIGNvZGluZ1RlbXBsYXRlWFtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLng7CisgICAgICBjb2RpbmdUZW1wbGF0ZVlba10gPSBjb2RpbmdUZW1wbGF0ZVtrXS55OworICAgIH0KKworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0ucmVmZXJlbmNlOworCisgICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHsKKyAgICAgIHJlZmVyZW5jZVRlbXBsYXRlID0gcmVmZXJlbmNlVGVtcGxhdGUuY29uY2F0KFthdFsxXV0pOworICAgIH0KKworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCA9IHJlZmVyZW5jZVRlbXBsYXRlLmxlbmd0aDsKKyAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpOworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZVkgPSBuZXcgSW50MzJBcnJheShyZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCk7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgcmVmZXJlbmNlVGVtcGxhdGVYW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueDsKKyAgICAgIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLnk7CisgICAgfQorCisgICAgdmFyIHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDsKKyAgICB2YXIgcmVmZXJlbmNlSGVpZ2h0ID0gcmVmZXJlbmNlQml0bWFwLmxlbmd0aDsKKyAgICB2YXIgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmVmaW5lbWVudFJldXNlZENvbnRleHRzW3RlbXBsYXRlSW5kZXhdOworICAgIHZhciBiaXRtYXAgPSBbXTsKKyAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOworICAgIHZhciBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdSIik7CisgICAgdmFyIGx0cCA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBpZiAocHJlZGljdGlvbikgeworICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKKyAgICAgICAgbHRwIF49IHNsdHA7CisKKyAgICAgICAgaWYgKGx0cCkgeworICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJwcmVkaWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgYml0bWFwLnB1c2gocm93KTsKKworICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIHZhciBpMCwgajA7CisgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSAwOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb2RpbmdUZW1wbGF0ZUxlbmd0aDsgaysrKSB7CisgICAgICAgICAgaTAgPSBpICsgY29kaW5nVGVtcGxhdGVZW2tdOworICAgICAgICAgIGowID0gaiArIGNvZGluZ1RlbXBsYXRlWFtrXTsKKworICAgICAgICAgIGlmIChpMCA8IDAgfHwgajAgPCAwIHx8IGowID49IHdpZHRoKSB7CisgICAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxIHwgYml0bWFwW2kwXVtqMF07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICBpMCA9IGkgKyByZWZlcmVuY2VUZW1wbGF0ZVlba10gLSBvZmZzZXRZOworICAgICAgICAgIGowID0gaiArIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSAtIG9mZnNldFg7CisKKyAgICAgICAgICBpZiAoaTAgPCAwIHx8IGkwID49IHJlZmVyZW5jZUhlaWdodCB8fCBqMCA8IDAgfHwgajAgPj0gcmVmZXJlbmNlV2lkdGgpIHsKKyAgICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCByZWZlcmVuY2VCaXRtYXBbaTBdW2owXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgIHJvd1tqXSA9IHBpeGVsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGh1ZmZtYW4sIHJlZmluZW1lbnQsIHN5bWJvbHMsIG51bWJlck9mTmV3U3ltYm9scywgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIHRlbXBsYXRlSW5kZXgsIGF0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGh1ZmZtYW5JbnB1dCkgeworICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIHZhciBuZXdTeW1ib2xzID0gW107CisgICAgdmFyIGN1cnJlbnRIZWlnaHQgPSAwOworICAgIHZhciBzeW1ib2xDb2RlTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzKTsKKyAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOworICAgIHZhciBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOworICAgIHZhciB0YWJsZUIxLCBzeW1ib2xXaWR0aHM7CisKKyAgICBpZiAoaHVmZm1hbikgeworICAgICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CisgICAgICBzeW1ib2xXaWR0aHMgPSBbXTsKKyAgICAgIHN5bWJvbENvZGVMZW5ndGggPSBNYXRoLm1heChzeW1ib2xDb2RlTGVuZ3RoLCAxKTsKKyAgICB9CisKKyAgICB3aGlsZSAobmV3U3ltYm9scy5sZW5ndGggPCBudW1iZXJPZk5ld1N5bWJvbHMpIHsKKyAgICAgIHZhciBkZWx0YUhlaWdodCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFIZWlnaHQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBREgiLCBkZWNvZGVyKTsKKyAgICAgIGN1cnJlbnRIZWlnaHQgKz0gZGVsdGFIZWlnaHQ7CisgICAgICB2YXIgY3VycmVudFdpZHRoID0gMCwKKyAgICAgICAgICB0b3RhbFdpZHRoID0gMDsKKyAgICAgIHZhciBmaXJzdFN5bWJvbCA9IGh1ZmZtYW4gPyBzeW1ib2xXaWR0aHMubGVuZ3RoIDogMDsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGRlbHRhV2lkdGggPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhV2lkdGguZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFciLCBkZWNvZGVyKTsKKworICAgICAgICBpZiAoZGVsdGFXaWR0aCA9PT0gbnVsbCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudFdpZHRoICs9IGRlbHRhV2lkdGg7CisgICAgICAgIHRvdGFsV2lkdGggKz0gY3VycmVudFdpZHRoOworICAgICAgICB2YXIgYml0bWFwOworCisgICAgICAgIGlmIChyZWZpbmVtZW50KSB7CisgICAgICAgICAgdmFyIG51bWJlck9mSW5zdGFuY2VzID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUFJIiwgZGVjb2Rlcik7CisKKyAgICAgICAgICBpZiAobnVtYmVyT2ZJbnN0YW5jZXMgPiAxKSB7CisgICAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKGh1ZmZtYW4sIHJlZmluZW1lbnQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgMCwgbnVtYmVyT2ZJbnN0YW5jZXMsIDEsIHN5bWJvbHMuY29uY2F0KG5ld1N5bWJvbHMpLCBzeW1ib2xDb2RlTGVuZ3RoLCAwLCAwLCAxLCAwLCBodWZmbWFuVGFibGVzLCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIDAsIGh1ZmZtYW5JbnB1dCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBzeW1ib2xJZCA9IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTsKKyAgICAgICAgICAgIHZhciByZHggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRYIiwgZGVjb2Rlcik7CisgICAgICAgICAgICB2YXIgcmR5ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWSIsIGRlY29kZXIpOworICAgICAgICAgICAgdmFyIHN5bWJvbCA9IHN5bWJvbElkIDwgc3ltYm9scy5sZW5ndGggPyBzeW1ib2xzW3N5bWJvbElkXSA6IG5ld1N5bWJvbHNbc3ltYm9sSWQgLSBzeW1ib2xzLmxlbmd0aF07CisgICAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHN5bWJvbCwgcmR4LCByZHksIGZhbHNlLCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7CisgICAgICAgIH0gZWxzZSBpZiAoaHVmZm1hbikgeworICAgICAgICAgIHN5bWJvbFdpZHRocy5wdXNoKGN1cnJlbnRXaWR0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYml0bWFwID0gZGVjb2RlQml0bWFwKGZhbHNlLCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIHRlbXBsYXRlSW5kZXgsIGZhbHNlLCBudWxsLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaHVmZm1hbiAmJiAhcmVmaW5lbWVudCkgeworICAgICAgICB2YXIgYml0bWFwU2l6ZSA9IGh1ZmZtYW5UYWJsZXMudGFibGVCaXRtYXBTaXplLmRlY29kZShodWZmbWFuSW5wdXQpOworICAgICAgICBodWZmbWFuSW5wdXQuYnl0ZUFsaWduKCk7CisgICAgICAgIHZhciBjb2xsZWN0aXZlQml0bWFwID0gdm9pZCAwOworCisgICAgICAgIGlmIChiaXRtYXBTaXplID09PSAwKSB7CisgICAgICAgICAgY29sbGVjdGl2ZUJpdG1hcCA9IHJlYWRVbmNvbXByZXNzZWRCaXRtYXAoaHVmZm1hbklucHV0LCB0b3RhbFdpZHRoLCBjdXJyZW50SGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kOworICAgICAgICAgIHZhciBiaXRtYXBFbmQgPSBodWZmbWFuSW5wdXQucG9zaXRpb24gKyBiaXRtYXBTaXplOworICAgICAgICAgIGh1ZmZtYW5JbnB1dC5lbmQgPSBiaXRtYXBFbmQ7CisgICAgICAgICAgY29sbGVjdGl2ZUJpdG1hcCA9IGRlY29kZU1NUkJpdG1hcChodWZmbWFuSW5wdXQsIHRvdGFsV2lkdGgsIGN1cnJlbnRIZWlnaHQsIGZhbHNlKTsKKyAgICAgICAgICBodWZmbWFuSW5wdXQuZW5kID0gb3JpZ2luYWxFbmQ7CisgICAgICAgICAgaHVmZm1hbklucHV0LnBvc2l0aW9uID0gYml0bWFwRW5kOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG51bWJlck9mU3ltYm9sc0RlY29kZWQgPSBzeW1ib2xXaWR0aHMubGVuZ3RoOworCisgICAgICAgIGlmIChmaXJzdFN5bWJvbCA9PT0gbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCAtIDEpIHsKKyAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goY29sbGVjdGl2ZUJpdG1hcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIF9pID0gdm9pZCAwLAorICAgICAgICAgICAgICB5ID0gdm9pZCAwLAorICAgICAgICAgICAgICB4TWluID0gMCwKKyAgICAgICAgICAgICAgeE1heCA9IHZvaWQgMCwKKyAgICAgICAgICAgICAgYml0bWFwV2lkdGggPSB2b2lkIDAsCisgICAgICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IHZvaWQgMDsKKworICAgICAgICAgIGZvciAoX2kgPSBmaXJzdFN5bWJvbDsgX2kgPCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkOyBfaSsrKSB7CisgICAgICAgICAgICBiaXRtYXBXaWR0aCA9IHN5bWJvbFdpZHRoc1tfaV07CisgICAgICAgICAgICB4TWF4ID0geE1pbiArIGJpdG1hcFdpZHRoOworICAgICAgICAgICAgc3ltYm9sQml0bWFwID0gW107CisKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBjdXJyZW50SGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgc3ltYm9sQml0bWFwLnB1c2goY29sbGVjdGl2ZUJpdG1hcFt5XS5zdWJhcnJheSh4TWluLCB4TWF4KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChzeW1ib2xCaXRtYXApOworICAgICAgICAgICAgeE1pbiA9IHhNYXg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGV4cG9ydGVkU3ltYm9scyA9IFtdOworICAgIHZhciBmbGFncyA9IFtdLAorICAgICAgICBjdXJyZW50RmxhZyA9IGZhbHNlOworICAgIHZhciB0b3RhbFN5bWJvbHNMZW5ndGggPSBzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9sczsKKworICAgIHdoaWxlIChmbGFncy5sZW5ndGggPCB0b3RhbFN5bWJvbHNMZW5ndGgpIHsKKyAgICAgIHZhciBydW5MZW5ndGggPSBodWZmbWFuID8gdGFibGVCMS5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFFWCIsIGRlY29kZXIpOworCisgICAgICB3aGlsZSAocnVuTGVuZ3RoLS0pIHsKKyAgICAgICAgZmxhZ3MucHVzaChjdXJyZW50RmxhZyk7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnRGbGFnID0gIWN1cnJlbnRGbGFnOworICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN5bWJvbHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgaWYgKGZsYWdzW2ldKSB7CisgICAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKHN5bWJvbHNbaV0pOworICAgICAgfQorICAgIH0KKworICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtYmVyT2ZOZXdTeW1ib2xzOyBpKyssIGorKykgeworICAgICAgaWYgKGZsYWdzW2ldKSB7CisgICAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKG5ld1N5bWJvbHNbal0pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBleHBvcnRlZFN5bWJvbHM7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVUZXh0UmVnaW9uKGh1ZmZtYW4sIHJlZmluZW1lbnQsIHdpZHRoLCBoZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcywgc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHRyYW5zcG9zZWQsIGRzT2Zmc2V0LCByZWZlcmVuY2VDb3JuZXIsIGNvbWJpbmF0aW9uT3BlcmF0b3IsIGh1ZmZtYW5UYWJsZXMsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgbG9nU3RyaXBTaXplLCBodWZmbWFuSW5wdXQpIHsKKyAgICBpZiAoaHVmZm1hbiAmJiByZWZpbmVtZW50KSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIHZhciBiaXRtYXAgPSBbXTsKKyAgICB2YXIgaSwgcm93OworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisKKyAgICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkgeworICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICByb3dbal0gPSBkZWZhdWx0UGl4ZWxWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBiaXRtYXAucHVzaChyb3cpOworICAgIH0KKworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7CisgICAgdmFyIHN0cmlwVCA9IGh1ZmZtYW4gPyAtaHVmZm1hblRhYmxlcy50YWJsZURlbHRhVC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IC1kZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFQiLCBkZWNvZGVyKTsKKyAgICB2YXIgZmlyc3RTID0gMDsKKyAgICBpID0gMDsKKworICAgIHdoaWxlIChpIDwgbnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMpIHsKKyAgICAgIHZhciBkZWx0YVQgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhVC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVCIsIGRlY29kZXIpOworICAgICAgc3RyaXBUICs9IGRlbHRhVDsKKyAgICAgIHZhciBkZWx0YUZpcnN0UyA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRmlyc3RTLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUZTIiwgZGVjb2Rlcik7CisgICAgICBmaXJzdFMgKz0gZGVsdGFGaXJzdFM7CisgICAgICB2YXIgY3VycmVudFMgPSBmaXJzdFM7CisKKyAgICAgIGRvIHsKKyAgICAgICAgdmFyIGN1cnJlbnRUID0gMDsKKworICAgICAgICBpZiAoc3RyaXBTaXplID4gMSkgeworICAgICAgICAgIGN1cnJlbnRUID0gaHVmZm1hbiA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0cyhsb2dTdHJpcFNpemUpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUlUIiwgZGVjb2Rlcik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdCA9IHN0cmlwU2l6ZSAqIHN0cmlwVCArIGN1cnJlbnRUOworICAgICAgICB2YXIgc3ltYm9sSWQgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy5zeW1ib2xJRFRhYmxlLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpOworICAgICAgICB2YXIgYXBwbHlSZWZpbmVtZW50ID0gcmVmaW5lbWVudCAmJiAoaHVmZm1hbiA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0KCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkkiLCBkZWNvZGVyKSk7CisgICAgICAgIHZhciBzeW1ib2xCaXRtYXAgPSBpbnB1dFN5bWJvbHNbc3ltYm9sSWRdOworICAgICAgICB2YXIgc3ltYm9sV2lkdGggPSBzeW1ib2xCaXRtYXBbMF0ubGVuZ3RoOworICAgICAgICB2YXIgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sQml0bWFwLmxlbmd0aDsKKworICAgICAgICBpZiAoYXBwbHlSZWZpbmVtZW50KSB7CisgICAgICAgICAgdmFyIHJkdyA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFciLCBkZWNvZGVyKTsKKyAgICAgICAgICB2YXIgcmRoID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJESCIsIGRlY29kZXIpOworICAgICAgICAgIHZhciByZHggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRYIiwgZGVjb2Rlcik7CisgICAgICAgICAgdmFyIHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFkiLCBkZWNvZGVyKTsKKyAgICAgICAgICBzeW1ib2xXaWR0aCArPSByZHc7CisgICAgICAgICAgc3ltYm9sSGVpZ2h0ICs9IHJkaDsKKyAgICAgICAgICBzeW1ib2xCaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KHN5bWJvbFdpZHRoLCBzeW1ib2xIZWlnaHQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCBzeW1ib2xCaXRtYXAsIChyZHcgPj4gMSkgKyByZHgsIChyZGggPj4gMSkgKyByZHksIGZhbHNlLCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgb2Zmc2V0VCA9IHQgLSAocmVmZXJlbmNlQ29ybmVyICYgMSA/IDAgOiBzeW1ib2xIZWlnaHQgLSAxKTsKKyAgICAgICAgdmFyIG9mZnNldFMgPSBjdXJyZW50UyAtIChyZWZlcmVuY2VDb3JuZXIgJiAyID8gc3ltYm9sV2lkdGggLSAxIDogMCk7CisgICAgICAgIHZhciBzMiwgdDIsIHN5bWJvbFJvdzsKKworICAgICAgICBpZiAodHJhbnNwb3NlZCkgeworICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbEhlaWdodDsgczIrKykgeworICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFMgKyBzMl07CisKKyAgICAgICAgICAgIGlmICghcm93KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW1ib2xSb3cgPSBzeW1ib2xCaXRtYXBbczJdOworICAgICAgICAgICAgdmFyIG1heFdpZHRoID0gTWF0aC5taW4od2lkdGggLSBvZmZzZXRULCBzeW1ib2xXaWR0aCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHsKKyAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIHw9IHN5bWJvbFJvd1t0Ml07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7CisgICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSBePSBzeW1ib2xSb3dbdDJdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm9wZXJhdG9yICIuY29uY2F0KGNvbWJpbmF0aW9uT3BlcmF0b3IsICIgaXMgbm90IHN1cHBvcnRlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xIZWlnaHQgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykgeworICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07CisKKyAgICAgICAgICAgIGlmICghcm93KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW1ib2xSb3cgPSBzeW1ib2xCaXRtYXBbdDJdOworCisgICAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CisgICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xXaWR0aDsgczIrKykgeworICAgICAgICAgICAgICAgICAgcm93W29mZnNldFMgKyBzMl0gXj0gc3ltYm9sUm93W3MyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJvcGVyYXRvciAiLmNvbmNhdChjb21iaW5hdGlvbk9wZXJhdG9yLCAiIGlzIG5vdCBzdXBwb3J0ZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudFMgKz0gc3ltYm9sV2lkdGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgaSsrOworICAgICAgICB2YXIgZGVsdGFTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFMiLCBkZWNvZGVyKTsKKworICAgICAgICBpZiAoZGVsdGFTID09PSBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50UyArPSBkZWx0YVMgKyBkc09mZnNldDsKKyAgICAgIH0gd2hpbGUgKHRydWUpOworICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShtbXIsIHBhdHRlcm5XaWR0aCwgcGF0dGVybkhlaWdodCwgbWF4UGF0dGVybkluZGV4LCB0ZW1wbGF0ZSwgZGVjb2RpbmdDb250ZXh0KSB7CisgICAgdmFyIGF0ID0gW107CisKKyAgICBpZiAoIW1tcikgeworICAgICAgYXQucHVzaCh7CisgICAgICAgIHg6IC1wYXR0ZXJuV2lkdGgsCisgICAgICAgIHk6IDAKKyAgICAgIH0pOworCisgICAgICBpZiAodGVtcGxhdGUgPT09IDApIHsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogLTMsCisgICAgICAgICAgeTogLTEKKyAgICAgICAgfSk7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IDIsCisgICAgICAgICAgeTogLTIKKyAgICAgICAgfSk7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IC0yLAorICAgICAgICAgIHk6IC0yCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIHZhciBjb2xsZWN0aXZlV2lkdGggPSAobWF4UGF0dGVybkluZGV4ICsgMSkgKiBwYXR0ZXJuV2lkdGg7CisgICAgdmFyIGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVCaXRtYXAobW1yLCBjb2xsZWN0aXZlV2lkdGgsIHBhdHRlcm5IZWlnaHQsIHRlbXBsYXRlLCBmYWxzZSwgbnVsbCwgYXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgdmFyIHBhdHRlcm5zID0gW107CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBtYXhQYXR0ZXJuSW5kZXg7IGkrKykgeworICAgICAgdmFyIHBhdHRlcm5CaXRtYXAgPSBbXTsKKyAgICAgIHZhciB4TWluID0gcGF0dGVybldpZHRoICogaTsKKyAgICAgIHZhciB4TWF4ID0geE1pbiArIHBhdHRlcm5XaWR0aDsKKworICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBwYXR0ZXJuSGVpZ2h0OyB5KyspIHsKKyAgICAgICAgcGF0dGVybkJpdG1hcC5wdXNoKGNvbGxlY3RpdmVCaXRtYXBbeV0uc3ViYXJyYXkoeE1pbiwgeE1heCkpOworICAgICAgfQorCisgICAgICBwYXR0ZXJucy5wdXNoKHBhdHRlcm5CaXRtYXApOworICAgIH0KKworICAgIHJldHVybiBwYXR0ZXJuczsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZUhhbGZ0b25lUmVnaW9uKG1tciwgcGF0dGVybnMsIHRlbXBsYXRlLCByZWdpb25XaWR0aCwgcmVnaW9uSGVpZ2h0LCBkZWZhdWx0UGl4ZWxWYWx1ZSwgZW5hYmxlU2tpcCwgY29tYmluYXRpb25PcGVyYXRvciwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCBncmlkT2Zmc2V0WCwgZ3JpZE9mZnNldFksIGdyaWRWZWN0b3JYLCBncmlkVmVjdG9yWSwgZGVjb2RpbmdDb250ZXh0KSB7CisgICAgdmFyIHNraXAgPSBudWxsOworCisgICAgaWYgKGVuYWJsZVNraXApIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJza2lwIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoY29tYmluYXRpb25PcGVyYXRvciAhPT0gMCkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm9wZXJhdG9yICIgKyBjb21iaW5hdGlvbk9wZXJhdG9yICsgIiBpcyBub3Qgc3VwcG9ydGVkIGluIGhhbGZ0b25lIHJlZ2lvbiIpOworICAgIH0KKworICAgIHZhciByZWdpb25CaXRtYXAgPSBbXTsKKyAgICB2YXIgaSwgaiwgcm93OworCisgICAgZm9yIChpID0gMDsgaSA8IHJlZ2lvbkhlaWdodDsgaSsrKSB7CisgICAgICByb3cgPSBuZXcgVWludDhBcnJheShyZWdpb25XaWR0aCk7CisKKyAgICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVnaW9uV2lkdGg7IGorKykgeworICAgICAgICAgIHJvd1tqXSA9IGRlZmF1bHRQaXhlbFZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7CisgICAgfQorCisgICAgdmFyIG51bWJlck9mUGF0dGVybnMgPSBwYXR0ZXJucy5sZW5ndGg7CisgICAgdmFyIHBhdHRlcm4wID0gcGF0dGVybnNbMF07CisgICAgdmFyIHBhdHRlcm5XaWR0aCA9IHBhdHRlcm4wWzBdLmxlbmd0aCwKKyAgICAgICAgcGF0dGVybkhlaWdodCA9IHBhdHRlcm4wLmxlbmd0aDsKKyAgICB2YXIgYml0c1BlclZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKG51bWJlck9mUGF0dGVybnMpOworICAgIHZhciBhdCA9IFtdOworCisgICAgaWYgKCFtbXIpIHsKKyAgICAgIGF0LnB1c2goeworICAgICAgICB4OiB0ZW1wbGF0ZSA8PSAxID8gMyA6IDIsCisgICAgICAgIHk6IC0xCisgICAgICB9KTsKKworICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IC0zLAorICAgICAgICAgIHk6IC0xCisgICAgICAgIH0pOworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAyLAorICAgICAgICAgIHk6IC0yCisgICAgICAgIH0pOworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAtMiwKKyAgICAgICAgICB5OiAtMgorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZ3JheVNjYWxlQml0UGxhbmVzID0gW107CisgICAgdmFyIG1tcklucHV0LCBiaXRtYXA7CisKKyAgICBpZiAobW1yKSB7CisgICAgICBtbXJJbnB1dCA9IG5ldyBSZWFkZXIoZGVjb2RpbmdDb250ZXh0LmRhdGEsIGRlY29kaW5nQ29udGV4dC5zdGFydCwgZGVjb2RpbmdDb250ZXh0LmVuZCk7CisgICAgfQorCisgICAgZm9yIChpID0gYml0c1BlclZhbHVlIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmIChtbXIpIHsKKyAgICAgICAgYml0bWFwID0gZGVjb2RlTU1SQml0bWFwKG1tcklucHV0LCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIHRydWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYml0bWFwID0gZGVjb2RlQml0bWFwKGZhbHNlLCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIHRlbXBsYXRlLCBmYWxzZSwgc2tpcCwgYXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgICB9CisKKyAgICAgIGdyYXlTY2FsZUJpdFBsYW5lc1tpXSA9IGJpdG1hcDsKKyAgICB9CisKKyAgICB2YXIgbWcsIG5nLCBiaXQsIHBhdHRlcm5JbmRleCwgcGF0dGVybkJpdG1hcCwgeCwgeSwgcGF0dGVyblJvdywgcmVnaW9uUm93OworCisgICAgZm9yIChtZyA9IDA7IG1nIDwgZ3JpZEhlaWdodDsgbWcrKykgeworICAgICAgZm9yIChuZyA9IDA7IG5nIDwgZ3JpZFdpZHRoOyBuZysrKSB7CisgICAgICAgIGJpdCA9IDA7CisgICAgICAgIHBhdHRlcm5JbmRleCA9IDA7CisKKyAgICAgICAgZm9yIChqID0gYml0c1BlclZhbHVlIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICBiaXQgPSBncmF5U2NhbGVCaXRQbGFuZXNbal1bbWddW25nXSBeIGJpdDsKKyAgICAgICAgICBwYXR0ZXJuSW5kZXggfD0gYml0IDw8IGo7CisgICAgICAgIH0KKworICAgICAgICBwYXR0ZXJuQml0bWFwID0gcGF0dGVybnNbcGF0dGVybkluZGV4XTsKKyAgICAgICAgeCA9IGdyaWRPZmZzZXRYICsgbWcgKiBncmlkVmVjdG9yWSArIG5nICogZ3JpZFZlY3RvclggPj4gODsKKyAgICAgICAgeSA9IGdyaWRPZmZzZXRZICsgbWcgKiBncmlkVmVjdG9yWCAtIG5nICogZ3JpZFZlY3RvclkgPj4gODsKKworICAgICAgICBpZiAoeCA+PSAwICYmIHggKyBwYXR0ZXJuV2lkdGggPD0gcmVnaW9uV2lkdGggJiYgeSA+PSAwICYmIHkgKyBwYXR0ZXJuSGVpZ2h0IDw9IHJlZ2lvbkhlaWdodCkgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFt5ICsgaV07CisgICAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CisgICAgICAgICAgICAgIHJlZ2lvblJvd1t4ICsgal0gfD0gcGF0dGVyblJvd1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIHJlZ2lvblggPSB2b2lkIDAsCisgICAgICAgICAgICAgIHJlZ2lvblkgPSB2b2lkIDA7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGF0dGVybkhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICByZWdpb25ZID0geSArIGk7CisKKyAgICAgICAgICAgIGlmIChyZWdpb25ZIDwgMCB8fCByZWdpb25ZID49IHJlZ2lvbkhlaWdodCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVnaW9uUm93ID0gcmVnaW9uQml0bWFwW3JlZ2lvblldOworICAgICAgICAgICAgcGF0dGVyblJvdyA9IHBhdHRlcm5CaXRtYXBbaV07CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykgeworICAgICAgICAgICAgICByZWdpb25YID0geCArIGo7CisKKyAgICAgICAgICAgICAgaWYgKHJlZ2lvblggPj0gMCAmJiByZWdpb25YIDwgcmVnaW9uV2lkdGgpIHsKKyAgICAgICAgICAgICAgICByZWdpb25Sb3dbcmVnaW9uWF0gfD0gcGF0dGVyblJvd1tqXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZWdpb25CaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiByZWFkU2VnbWVudEhlYWRlcihkYXRhLCBzdGFydCkgeworICAgIHZhciBzZWdtZW50SGVhZGVyID0ge307CisgICAgc2VnbWVudEhlYWRlci5udW1iZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQpOworICAgIHZhciBmbGFncyA9IGRhdGFbc3RhcnQgKyA0XTsKKyAgICB2YXIgc2VnbWVudFR5cGUgPSBmbGFncyAmIDB4M2Y7CisKKyAgICBpZiAoIVNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV0pIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHNlZ21lbnQgdHlwZTogIiArIHNlZ21lbnRUeXBlKTsKKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLnR5cGUgPSBzZWdtZW50VHlwZTsKKyAgICBzZWdtZW50SGVhZGVyLnR5cGVOYW1lID0gU2VnbWVudFR5cGVzW3NlZ21lbnRUeXBlXTsKKyAgICBzZWdtZW50SGVhZGVyLmRlZmVycmVkTm9uUmV0YWluID0gISEoZmxhZ3MgJiAweDgwKTsKKyAgICB2YXIgcGFnZUFzc29jaWF0aW9uRmllbGRTaXplID0gISEoZmxhZ3MgJiAweDQwKTsKKyAgICB2YXIgcmVmZXJyZWRGbGFncyA9IGRhdGFbc3RhcnQgKyA1XTsKKyAgICB2YXIgcmVmZXJyZWRUb0NvdW50ID0gcmVmZXJyZWRGbGFncyA+PiA1ICYgNzsKKyAgICB2YXIgcmV0YWluQml0cyA9IFtyZWZlcnJlZEZsYWdzICYgMzFdOworICAgIHZhciBwb3NpdGlvbiA9IHN0YXJ0ICsgNjsKKworICAgIGlmIChyZWZlcnJlZEZsYWdzID09PSA3KSB7CisgICAgICByZWZlcnJlZFRvQ291bnQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gLSAxKSAmIDB4MWZmZmZmZmY7CisgICAgICBwb3NpdGlvbiArPSAzOworICAgICAgdmFyIGJ5dGVzID0gcmVmZXJyZWRUb0NvdW50ICsgNyA+PiAzOworICAgICAgcmV0YWluQml0c1swXSA9IGRhdGFbcG9zaXRpb24rK107CisKKyAgICAgIHdoaWxlICgtLWJ5dGVzID4gMCkgeworICAgICAgICByZXRhaW5CaXRzLnB1c2goZGF0YVtwb3NpdGlvbisrXSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZWZlcnJlZEZsYWdzID09PSA1IHx8IHJlZmVycmVkRmxhZ3MgPT09IDYpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHJlZmVycmVkLXRvIGZsYWdzIik7CisgICAgfQorCisgICAgc2VnbWVudEhlYWRlci5yZXRhaW5CaXRzID0gcmV0YWluQml0czsKKyAgICB2YXIgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gNDsKKworICAgIGlmIChzZWdtZW50SGVhZGVyLm51bWJlciA8PSAyNTYpIHsKKyAgICAgIHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDE7CisgICAgfSBlbHNlIGlmIChzZWdtZW50SGVhZGVyLm51bWJlciA8PSA2NTUzNikgeworICAgICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMjsKKyAgICB9CisKKyAgICB2YXIgcmVmZXJyZWRUbyA9IFtdOworICAgIHZhciBpLCBpaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCByZWZlcnJlZFRvQ291bnQ7IGkrKykgeworICAgICAgdmFyIG51bWJlciA9IHZvaWQgMDsKKworICAgICAgaWYgKHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9PT0gMSkgeworICAgICAgICBudW1iZXIgPSBkYXRhW3Bvc2l0aW9uXTsKKyAgICAgIH0gZWxzZSBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAyKSB7CisgICAgICAgIG51bWJlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBudW1iZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgfQorCisgICAgICByZWZlcnJlZFRvLnB1c2gobnVtYmVyKTsKKyAgICAgIHBvc2l0aW9uICs9IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZTsKKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLnJlZmVycmVkVG8gPSByZWZlcnJlZFRvOworCisgICAgaWYgKCFwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUpIHsKKyAgICAgIHNlZ21lbnRIZWFkZXIucGFnZUFzc29jaWF0aW9uID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICB9IGVsc2UgeworICAgICAgc2VnbWVudEhlYWRlci5wYWdlQXNzb2NpYXRpb24gPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgcG9zaXRpb24gKz0gNDsKKworICAgIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikgeworICAgICAgaWYgKHNlZ21lbnRUeXBlID09PSAzOCkgeworICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvbkluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uICsgUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGhdOworICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvbk1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKKyAgICAgICAgdmFyIHNlYXJjaFBhdHRlcm5MZW5ndGggPSA2OworICAgICAgICB2YXIgc2VhcmNoUGF0dGVybiA9IG5ldyBVaW50OEFycmF5KHNlYXJjaFBhdHRlcm5MZW5ndGgpOworCisgICAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbk1tcikgeworICAgICAgICAgIHNlYXJjaFBhdHRlcm5bMF0gPSAweGZmOworICAgICAgICAgIHNlYXJjaFBhdHRlcm5bMV0gPSAweGFjOworICAgICAgICB9CisKKyAgICAgICAgc2VhcmNoUGF0dGVyblsyXSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+Pj4gMjQgJiAweGZmOworICAgICAgICBzZWFyY2hQYXR0ZXJuWzNdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDE2ICYgMHhmZjsKKyAgICAgICAgc2VhcmNoUGF0dGVybls0XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiA4ICYgMHhmZjsKKyAgICAgICAgc2VhcmNoUGF0dGVybls1XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCAmIDB4ZmY7CisKKyAgICAgICAgZm9yIChpID0gcG9zaXRpb24sIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgdmFyIGogPSAwOworCisgICAgICAgICAgd2hpbGUgKGogPCBzZWFyY2hQYXR0ZXJuTGVuZ3RoICYmIHNlYXJjaFBhdHRlcm5bal0gPT09IGRhdGFbaSArIGpdKSB7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGogPT09IHNlYXJjaFBhdHRlcm5MZW5ndGgpIHsKKyAgICAgICAgICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gaSArIHNlYXJjaFBhdHRlcm5MZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VnbWVudEhlYWRlci5sZW5ndGggPT09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigic2VnbWVudCBlbmQgd2FzIG5vdCBmb3VuZCIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCB1bmtub3duIHNlZ21lbnQgbGVuZ3RoIik7CisgICAgICB9CisgICAgfQorCisgICAgc2VnbWVudEhlYWRlci5oZWFkZXJFbmQgPSBwb3NpdGlvbjsKKyAgICByZXR1cm4gc2VnbWVudEhlYWRlcjsKKyAgfQorCisgIGZ1bmN0aW9uIHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICB2YXIgc2VnbWVudHMgPSBbXTsKKyAgICB2YXIgcG9zaXRpb24gPSBzdGFydDsKKworICAgIHdoaWxlIChwb3NpdGlvbiA8IGVuZCkgeworICAgICAgdmFyIHNlZ21lbnRIZWFkZXIgPSByZWFkU2VnbWVudEhlYWRlcihkYXRhLCBwb3NpdGlvbik7CisgICAgICBwb3NpdGlvbiA9IHNlZ21lbnRIZWFkZXIuaGVhZGVyRW5kOworICAgICAgdmFyIHNlZ21lbnQgPSB7CisgICAgICAgIGhlYWRlcjogc2VnbWVudEhlYWRlciwKKyAgICAgICAgZGF0YTogZGF0YQorICAgICAgfTsKKworICAgICAgaWYgKCFoZWFkZXIucmFuZG9tQWNjZXNzKSB7CisgICAgICAgIHNlZ21lbnQuc3RhcnQgPSBwb3NpdGlvbjsKKyAgICAgICAgcG9zaXRpb24gKz0gc2VnbWVudEhlYWRlci5sZW5ndGg7CisgICAgICAgIHNlZ21lbnQuZW5kID0gcG9zaXRpb247CisgICAgICB9CisKKyAgICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7CisKKyAgICAgIGlmIChzZWdtZW50SGVhZGVyLnR5cGUgPT09IDUxKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChoZWFkZXIucmFuZG9tQWNjZXNzKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHNlZ21lbnRzW2ldLnN0YXJ0ID0gcG9zaXRpb247CisgICAgICAgIHBvc2l0aW9uICs9IHNlZ21lbnRzW2ldLmhlYWRlci5sZW5ndGg7CisgICAgICAgIHNlZ21lbnRzW2ldLmVuZCA9IHBvc2l0aW9uOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzZWdtZW50czsKKyAgfQorCisgIGZ1bmN0aW9uIHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgc3RhcnQpIHsKKyAgICByZXR1cm4geworICAgICAgd2lkdGg6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCksCisgICAgICBoZWlnaHQ6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDQpLAorICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgOCksCisgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyAxMiksCisgICAgICBjb21iaW5hdGlvbk9wZXJhdG9yOiBkYXRhW3N0YXJ0ICsgMTZdICYgNworICAgIH07CisgIH0KKworICB2YXIgUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGggPSAxNzsKKworICBmdW5jdGlvbiBwcm9jZXNzU2VnbWVudChzZWdtZW50LCB2aXNpdG9yKSB7CisgICAgdmFyIGhlYWRlciA9IHNlZ21lbnQuaGVhZGVyOworICAgIHZhciBkYXRhID0gc2VnbWVudC5kYXRhLAorICAgICAgICBwb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQsCisgICAgICAgIGVuZCA9IHNlZ21lbnQuZW5kOworICAgIHZhciBhcmdzLCBhdCwgaSwgYXRMZW5ndGg7CisKKyAgICBzd2l0Y2ggKGhlYWRlci50eXBlKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHZhciBkaWN0aW9uYXJ5ID0ge307CisgICAgICAgIHZhciBkaWN0aW9uYXJ5RmxhZ3MgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW4gPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAxKTsKKyAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50ID0gISEoZGljdGlvbmFyeUZsYWdzICYgMik7CisgICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gMiAmIDM7CisgICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNCAmIDM7CisgICAgICAgIGRpY3Rpb25hcnkuYml0bWFwU2l6ZVNlbGVjdG9yID0gZGljdGlvbmFyeUZsYWdzID4+IDYgJiAxOworICAgICAgICBkaWN0aW9uYXJ5LmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNyAmIDE7CisgICAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFVzZWQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyNTYpOworICAgICAgICBkaWN0aW9uYXJ5LmJpdG1hcENvZGluZ0NvbnRleHRSZXRhaW5lZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDUxMik7CisgICAgICAgIGRpY3Rpb25hcnkudGVtcGxhdGUgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gMTAgJiAzOworICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSA9IGRpY3Rpb25hcnlGbGFncyA+PiAxMiAmIDE7CisgICAgICAgIHBvc2l0aW9uICs9IDI7CisKKyAgICAgICAgaWYgKCFkaWN0aW9uYXJ5Lmh1ZmZtYW4pIHsKKyAgICAgICAgICBhdExlbmd0aCA9IGRpY3Rpb25hcnkudGVtcGxhdGUgPT09IDAgPyA0IDogMTsKKyAgICAgICAgICBhdCA9IFtdOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0TGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGF0LnB1c2goeworICAgICAgICAgICAgICB4OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uKSwKKyAgICAgICAgICAgICAgeTogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiArIDEpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGljdGlvbmFyeS5hdCA9IGF0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpY3Rpb25hcnkucmVmaW5lbWVudCAmJiAhZGljdGlvbmFyeS5yZWZpbmVtZW50VGVtcGxhdGUpIHsKKyAgICAgICAgICBhdCA9IFtdOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCA9IGF0OworICAgICAgICB9CisKKyAgICAgICAgZGljdGlvbmFyeS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZOZXdTeW1ib2xzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgYXJncyA9IFtkaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDY6CisgICAgICBjYXNlIDc6CisgICAgICAgIHZhciB0ZXh0UmVnaW9uID0ge307CisgICAgICAgIHRleHRSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKKyAgICAgICAgdmFyIHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW4gPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CisgICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudCA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAyKTsKKyAgICAgICAgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemUgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDIgJiAzOworICAgICAgICB0ZXh0UmVnaW9uLnN0cmlwU2l6ZSA9IDEgPDwgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemU7CisgICAgICAgIHRleHRSZWdpb24ucmVmZXJlbmNlQ29ybmVyID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA0ICYgMzsKKyAgICAgICAgdGV4dFJlZ2lvbi50cmFuc3Bvc2VkID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDY0KTsKKyAgICAgICAgdGV4dFJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA3ICYgMzsKKyAgICAgICAgdGV4dFJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gOSAmIDE7CisgICAgICAgIHRleHRSZWdpb24uZHNPZmZzZXQgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzIDw8IDE3ID4+IDI3OworICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMTUgJiAxOworCisgICAgICAgIGlmICh0ZXh0UmVnaW9uLmh1ZmZtYW4pIHsKKyAgICAgICAgICB2YXIgdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5GUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRTID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAyICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5EVCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNCAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERXID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA2ICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50REggPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDggJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREWCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTAgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREWSA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTIgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRTaXplU2VsZWN0b3IgPSAhISh0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzICYgMHg0MDAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0ZXh0UmVnaW9uLnJlZmluZW1lbnQgJiYgIXRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlKSB7CisgICAgICAgICAgYXQgPSBbXTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGF0LnB1c2goeworICAgICAgICAgICAgICB4OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uKSwKKyAgICAgICAgICAgICAgeTogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiArIDEpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50QXQgPSBhdDsKKyAgICAgICAgfQorCisgICAgICAgIHRleHRSZWdpb24ubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBhcmdzID0gW3RleHRSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIHZhciBwYXR0ZXJuRGljdGlvbmFyeSA9IHt9OworICAgICAgICB2YXIgcGF0dGVybkRpY3Rpb25hcnlGbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1tciA9ICEhKHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgJiAxKTsKKyAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkudGVtcGxhdGUgPSBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID4+IDEgJiAzOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuV2lkdGggPSBkYXRhW3Bvc2l0aW9uKytdOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0ID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgYXJncyA9IFtwYXR0ZXJuRGljdGlvbmFyeSwgaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDIyOgorICAgICAgY2FzZSAyMzoKKyAgICAgICAgdmFyIGhhbGZ0b25lUmVnaW9uID0ge307CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CisgICAgICAgIHZhciBoYWxmdG9uZVJlZ2lvbkZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24ubW1yID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDEpOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi50ZW1wbGF0ZSA9IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gMSAmIDM7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmVuYWJsZVNraXAgPSAhIShoYWxmdG9uZVJlZ2lvbkZsYWdzICYgOCk7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDQgJiA3OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gNyAmIDE7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRXaWR0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRIZWlnaHQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgJiAweGZmZmZmZmZmOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgJiAweGZmZmZmZmZmOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkVmVjdG9yWCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JZID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgYXJncyA9IFtoYWxmdG9uZVJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzODoKKyAgICAgIGNhc2UgMzk6CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uID0ge307CisgICAgICAgIGdlbmVyaWNSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKKyAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOworICAgICAgICBnZW5lcmljUmVnaW9uLm1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKKyAgICAgICAgZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPj4gMSAmIDM7CisgICAgICAgIGdlbmVyaWNSZWdpb24ucHJlZGljdGlvbiA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiA4KTsKKworICAgICAgICBpZiAoIWdlbmVyaWNSZWdpb24ubW1yKSB7CisgICAgICAgICAgYXRMZW5ndGggPSBnZW5lcmljUmVnaW9uLnRlbXBsYXRlID09PSAwID8gNCA6IDE7CisgICAgICAgICAgYXQgPSBbXTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICAgIGdlbmVyaWNSZWdpb24uYXQgPSBhdDsKKyAgICAgICAgfQorCisgICAgICAgIGFyZ3MgPSBbZ2VuZXJpY1JlZ2lvbiwgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQ4OgorICAgICAgICB2YXIgcGFnZUluZm8gPSB7CisgICAgICAgICAgd2lkdGg6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgaGVpZ2h0OiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KSwKKyAgICAgICAgICByZXNvbHV0aW9uWDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgOCksCisgICAgICAgICAgcmVzb2x1dGlvblk6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDEyKQorICAgICAgICB9OworCisgICAgICAgIGlmIChwYWdlSW5mby5oZWlnaHQgPT09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICBkZWxldGUgcGFnZUluZm8uaGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgdmFyIHBhZ2VTZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uICsgMTZdOworICAgICAgICAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24gKyAxNyk7CisgICAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpOworICAgICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpOworICAgICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHBhZ2VTZWdtZW50RmxhZ3MgPj4gMiAmIDE7CisgICAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlU2VnbWVudEZsYWdzID4+IDMgJiAzOworICAgICAgICBwYWdlSW5mby5yZXF1aXJlc0J1ZmZlciA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAzMik7CisgICAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiA2NCk7CisgICAgICAgIGFyZ3MgPSBbcGFnZUluZm9dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0OToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNTA6CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDUxOgorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA1MzoKKyAgICAgICAgYXJncyA9IFtoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNjI6CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigic2VnbWVudCB0eXBlICIuY29uY2F0KGhlYWRlci50eXBlTmFtZSwgIigiKS5jb25jYXQoaGVhZGVyLnR5cGUsICIpIikgKyAiIGlzIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHZhciBjYWxsYmFja05hbWUgPSAib24iICsgaGVhZGVyLnR5cGVOYW1lOworCisgICAgaWYgKGNhbGxiYWNrTmFtZSBpbiB2aXNpdG9yKSB7CisgICAgICB2aXNpdG9yW2NhbGxiYWNrTmFtZV0uYXBwbHkodmlzaXRvciwgYXJncyk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgcHJvY2Vzc1NlZ21lbnQoc2VnbWVudHNbaV0sIHZpc2l0b3IpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlSmJpZzJDaHVua3MoY2h1bmtzKSB7CisgICAgdmFyIHZpc2l0b3IgPSBuZXcgU2ltcGxlU2VnbWVudFZpc2l0b3IoKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNodW5rcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgY2h1bmsgPSBjaHVua3NbaV07CisgICAgICB2YXIgc2VnbWVudHMgPSByZWFkU2VnbWVudHMoe30sIGNodW5rLmRhdGEsIGNodW5rLnN0YXJ0LCBjaHVuay5lbmQpOworICAgICAgcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmlzaXRvci5idWZmZXI7CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUpiaWcyKGRhdGEpIHsKKyAgICB2YXIgZW5kID0gZGF0YS5sZW5ndGg7CisgICAgdmFyIHBvc2l0aW9uID0gMDsKKworICAgIGlmIChkYXRhW3Bvc2l0aW9uXSAhPT0gMHg5NyB8fCBkYXRhW3Bvc2l0aW9uICsgMV0gIT09IDB4NGEgfHwgZGF0YVtwb3NpdGlvbiArIDJdICE9PSAweDQyIHx8IGRhdGFbcG9zaXRpb24gKyAzXSAhPT0gMHgzMiB8fCBkYXRhW3Bvc2l0aW9uICsgNF0gIT09IDB4MGQgfHwgZGF0YVtwb3NpdGlvbiArIDVdICE9PSAweDBhIHx8IGRhdGFbcG9zaXRpb24gKyA2XSAhPT0gMHgxYSB8fCBkYXRhW3Bvc2l0aW9uICsgN10gIT09IDB4MGEpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJwYXJzZUpiaWcyIC0gaW52YWxpZCBoZWFkZXIuIik7CisgICAgfQorCisgICAgdmFyIGhlYWRlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgcG9zaXRpb24gKz0gODsKKyAgICB2YXIgZmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOworICAgIGhlYWRlci5yYW5kb21BY2Nlc3MgPSAhKGZsYWdzICYgMSk7CisKKyAgICBpZiAoIShmbGFncyAmIDIpKSB7CisgICAgICBoZWFkZXIubnVtYmVyT2ZQYWdlcyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICBwb3NpdGlvbiArPSA0OworICAgIH0KKworICAgIHZhciBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmQpOworICAgIHZhciB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7CisgICAgcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKTsKKyAgICB2YXIgX3Zpc2l0b3IkY3VycmVudFBhZ2VJID0gdmlzaXRvci5jdXJyZW50UGFnZUluZm8sCisgICAgICAgIHdpZHRoID0gX3Zpc2l0b3IkY3VycmVudFBhZ2VJLndpZHRoLAorICAgICAgICBoZWlnaHQgPSBfdmlzaXRvciRjdXJyZW50UGFnZUkuaGVpZ2h0OworICAgIHZhciBiaXRQYWNrZWQgPSB2aXNpdG9yLmJ1ZmZlcjsKKyAgICB2YXIgaW1nRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCk7CisgICAgdmFyIHEgPSAwLAorICAgICAgICBrID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHZhciBtYXNrID0gMCwKKyAgICAgICAgICBidWZmZXIgPSB2b2lkIDA7CisKKyAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICBpZiAoIW1hc2spIHsKKyAgICAgICAgICBtYXNrID0gMTI4OworICAgICAgICAgIGJ1ZmZlciA9IGJpdFBhY2tlZFtrKytdOworICAgICAgICB9CisKKyAgICAgICAgaW1nRGF0YVtxKytdID0gYnVmZmVyICYgbWFzayA/IDAgOiAyNTU7CisgICAgICAgIG1hc2sgPj49IDE7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGltZ0RhdGE6IGltZ0RhdGEsCisgICAgICB3aWR0aDogd2lkdGgsCisgICAgICBoZWlnaHQ6IGhlaWdodAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcigpIHt9CisKKyAgU2ltcGxlU2VnbWVudFZpc2l0b3IucHJvdG90eXBlID0geworICAgIG9uUGFnZUluZm9ybWF0aW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vblBhZ2VJbmZvcm1hdGlvbihpbmZvKSB7CisgICAgICB0aGlzLmN1cnJlbnRQYWdlSW5mbyA9IGluZm87CisgICAgICB2YXIgcm93U2l6ZSA9IGluZm8ud2lkdGggKyA3ID4+IDM7CisgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHJvd1NpemUgKiBpbmZvLmhlaWdodCk7CisKKyAgICAgIGlmIChpbmZvLmRlZmF1bHRQaXhlbFZhbHVlKSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgYnVmZmVyW2ldID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICB9LAorICAgIGRyYXdCaXRtYXA6IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX2RyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKSB7CisgICAgICB2YXIgcGFnZUluZm8gPSB0aGlzLmN1cnJlbnRQYWdlSW5mbzsKKyAgICAgIHZhciB3aWR0aCA9IHJlZ2lvbkluZm8ud2lkdGgsCisgICAgICAgICAgaGVpZ2h0ID0gcmVnaW9uSW5mby5oZWlnaHQ7CisgICAgICB2YXIgcm93U2l6ZSA9IHBhZ2VJbmZvLndpZHRoICsgNyA+PiAzOworICAgICAgdmFyIGNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGUgPyByZWdpb25JbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3IgOiBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yOworICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOworICAgICAgdmFyIG1hc2swID0gMTI4ID4+IChyZWdpb25JbmZvLnggJiA3KTsKKyAgICAgIHZhciBvZmZzZXQwID0gcmVnaW9uSW5mby55ICogcm93U2l6ZSArIChyZWdpb25JbmZvLnggPj4gMyk7CisgICAgICB2YXIgaSwgaiwgbWFzaywgb2Zmc2V0OworCisgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgbWFzayA9IG1hc2swOworICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJpdG1hcFtpXVtqXSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXRdIHw9IG1hc2s7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBtYXNrID4+PSAxOworCisgICAgICAgICAgICAgIGlmICghbWFzaykgeworICAgICAgICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0MCArPSByb3dTaXplOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIG1hc2sgPSBtYXNrMDsKKyAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSBePSBtYXNrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbWFzayA+Pj0gMTsKKworICAgICAgICAgICAgICBpZiAoIW1hc2spIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gMTI4OworICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJvcGVyYXRvciAiLmNvbmNhdChjb21iaW5hdGlvbk9wZXJhdG9yLCAiIGlzIG5vdCBzdXBwb3J0ZWQiKSk7CisgICAgICB9CisgICAgfSwKKyAgICBvbkltbWVkaWF0ZUdlbmVyaWNSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihyZWdpb24sIGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIHZhciByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CisgICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVCaXRtYXAocmVnaW9uLm1tciwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi50ZW1wbGF0ZSwgcmVnaW9uLnByZWRpY3Rpb24sIG51bGwsIHJlZ2lvbi5hdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApOworICAgIH0sCisgICAgb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCkgeworICAgICAgdGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9LAorICAgIG9uU3ltYm9sRGljdGlvbmFyeTogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25TeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OworCisgICAgICBpZiAoZGljdGlvbmFyeS5odWZmbWFuKSB7CisgICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhkaWN0aW9uYXJ5LCByZWZlcnJlZFNlZ21lbnRzLCB0aGlzLmN1c3RvbVRhYmxlcyk7CisgICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICB9CisKKyAgICAgIHZhciBzeW1ib2xzID0gdGhpcy5zeW1ib2xzOworCisgICAgICBpZiAoIXN5bWJvbHMpIHsKKyAgICAgICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scyA9IHt9OworICAgICAgfQorCisgICAgICB2YXIgaW5wdXRTeW1ib2xzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHJlZmVycmVkU2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRzW2ldXTsKKworICAgICAgICBpZiAocmVmZXJyZWRTeW1ib2xzKSB7CisgICAgICAgICAgaW5wdXRTeW1ib2xzID0gaW5wdXRTeW1ib2xzLmNvbmNhdChyZWZlcnJlZFN5bWJvbHMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgc3ltYm9sc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnkuaHVmZm1hbiwgZGljdGlvbmFyeS5yZWZpbmVtZW50LCBpbnB1dFN5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZOZXdTeW1ib2xzLCBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLCBodWZmbWFuVGFibGVzLCBkaWN0aW9uYXJ5LnRlbXBsYXRlLCBkaWN0aW9uYXJ5LmF0LCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSwgZGljdGlvbmFyeS5yZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgaHVmZm1hbklucHV0KTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlVGV4dFJlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVUZXh0UmVnaW9uKHJlZ2lvbiwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKKyAgICAgIHZhciBodWZmbWFuVGFibGVzLCBodWZmbWFuSW5wdXQ7CisgICAgICB2YXIgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKKyAgICAgIHZhciBpbnB1dFN5bWJvbHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVmZXJyZWRTZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHZhciByZWZlcnJlZFN5bWJvbHMgPSBzeW1ib2xzW3JlZmVycmVkU2VnbWVudHNbaV1dOworCisgICAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHsKKyAgICAgICAgICBpbnB1dFN5bWJvbHMgPSBpbnB1dFN5bWJvbHMuY29uY2F0KHJlZmVycmVkU3ltYm9scyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoaW5wdXRTeW1ib2xzLmxlbmd0aCk7CisKKyAgICAgIGlmIChyZWdpb24uaHVmZm1hbikgeworICAgICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgICBodWZmbWFuVGFibGVzID0gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCB0aGlzLmN1c3RvbVRhYmxlcywgaW5wdXRTeW1ib2xzLmxlbmd0aCwgaHVmZm1hbklucHV0KTsKKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICB2YXIgYml0bWFwID0gZGVjb2RlVGV4dFJlZ2lvbihyZWdpb24uaHVmZm1hbiwgcmVnaW9uLnJlZmluZW1lbnQsIHJlZ2lvbkluZm8ud2lkdGgsIHJlZ2lvbkluZm8uaGVpZ2h0LCByZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUsIHJlZ2lvbi5udW1iZXJPZlN5bWJvbEluc3RhbmNlcywgcmVnaW9uLnN0cmlwU2l6ZSwgaW5wdXRTeW1ib2xzLCBzeW1ib2xDb2RlTGVuZ3RoLCByZWdpb24udHJhbnNwb3NlZCwgcmVnaW9uLmRzT2Zmc2V0LCByZWdpb24ucmVmZXJlbmNlQ29ybmVyLCByZWdpb24uY29tYmluYXRpb25PcGVyYXRvciwgaHVmZm1hblRhYmxlcywgcmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSwgcmVnaW9uLnJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCByZWdpb24ubG9nU3RyaXBTaXplLCBodWZmbWFuSW5wdXQpOworICAgICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CisgICAgfSwKKyAgICBvbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKSB7CisgICAgICB0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisgICAgb25QYXR0ZXJuRGljdGlvbmFyeTogZnVuY3Rpb24gb25QYXR0ZXJuRGljdGlvbmFyeShkaWN0aW9uYXJ5LCBjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIHBhdHRlcm5zID0gdGhpcy5wYXR0ZXJuczsKKworICAgICAgaWYgKCFwYXR0ZXJucykgeworICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnMgPSB7fTsKKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShkaWN0aW9uYXJ5Lm1tciwgZGljdGlvbmFyeS5wYXR0ZXJuV2lkdGgsIGRpY3Rpb25hcnkucGF0dGVybkhlaWdodCwgZGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXgsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCk7CisgICAgfSwKKyAgICBvbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uOiBmdW5jdGlvbiBvbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uKHJlZ2lvbiwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIHBhdHRlcm5zID0gdGhpcy5wYXR0ZXJuc1tyZWZlcnJlZFNlZ21lbnRzWzBdXTsKKyAgICAgIHZhciByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CisgICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVIYWxmdG9uZVJlZ2lvbihyZWdpb24ubW1yLCBwYXR0ZXJucywgcmVnaW9uLnRlbXBsYXRlLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLCByZWdpb24uZW5hYmxlU2tpcCwgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsIHJlZ2lvbi5ncmlkV2lkdGgsIHJlZ2lvbi5ncmlkSGVpZ2h0LCByZWdpb24uZ3JpZE9mZnNldFgsIHJlZ2lvbi5ncmlkT2Zmc2V0WSwgcmVnaW9uLmdyaWRWZWN0b3JYLCByZWdpb24uZ3JpZFZlY3RvclksIGRlY29kaW5nQ29udGV4dCk7CisgICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbjogZnVuY3Rpb24gb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uKCkgeworICAgICAgdGhpcy5vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKyAgICBvblRhYmxlczogZnVuY3Rpb24gb25UYWJsZXMoY3VycmVudFNlZ21lbnQsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIHZhciBjdXN0b21UYWJsZXMgPSB0aGlzLmN1c3RvbVRhYmxlczsKKworICAgICAgaWYgKCFjdXN0b21UYWJsZXMpIHsKKyAgICAgICAgdGhpcy5jdXN0b21UYWJsZXMgPSBjdXN0b21UYWJsZXMgPSB7fTsKKyAgICAgIH0KKworICAgICAgY3VzdG9tVGFibGVzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIEh1ZmZtYW5MaW5lKGxpbmVEYXRhKSB7CisgICAgaWYgKGxpbmVEYXRhLmxlbmd0aCA9PT0gMikgeworICAgICAgdGhpcy5pc09PQiA9IHRydWU7CisgICAgICB0aGlzLnJhbmdlTG93ID0gMDsKKyAgICAgIHRoaXMucHJlZml4TGVuZ3RoID0gbGluZURhdGFbMF07CisgICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gMDsKKyAgICAgIHRoaXMucHJlZml4Q29kZSA9IGxpbmVEYXRhWzFdOworICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5pc09PQiA9IGZhbHNlOworICAgICAgdGhpcy5yYW5nZUxvdyA9IGxpbmVEYXRhWzBdOworICAgICAgdGhpcy5wcmVmaXhMZW5ndGggPSBsaW5lRGF0YVsxXTsKKyAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSBsaW5lRGF0YVsyXTsKKyAgICAgIHRoaXMucHJlZml4Q29kZSA9IGxpbmVEYXRhWzNdOworICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lRGF0YVs0XSA9PT0gImxvd2VyIjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBIdWZmbWFuVHJlZU5vZGUobGluZSkgeworICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKKworICAgIGlmIChsaW5lKSB7CisgICAgICB0aGlzLmlzTGVhZiA9IHRydWU7CisgICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gbGluZS5yYW5nZUxlbmd0aDsKKyAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lLnJhbmdlTG93OworICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lLmlzTG93ZXJSYW5nZTsKKyAgICAgIHRoaXMuaXNPT0IgPSBsaW5lLmlzT09COworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmlzTGVhZiA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIEh1ZmZtYW5UcmVlTm9kZS5wcm90b3R5cGUgPSB7CisgICAgYnVpbGRUcmVlOiBmdW5jdGlvbiBidWlsZFRyZWUobGluZSwgc2hpZnQpIHsKKyAgICAgIHZhciBiaXQgPSBsaW5lLnByZWZpeENvZGUgPj4gc2hpZnQgJiAxOworCisgICAgICBpZiAoc2hpZnQgPD0gMCkgeworICAgICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBuZXcgSHVmZm1hblRyZWVOb2RlKGxpbmUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNoaWxkcmVuW2JpdF07CisKKyAgICAgICAgaWYgKCFub2RlKSB7CisgICAgICAgICAgdGhpcy5jaGlsZHJlbltiaXRdID0gbm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBub2RlLmJ1aWxkVHJlZShsaW5lLCBzaGlmdCAtIDEpOworICAgICAgfQorICAgIH0sCisgICAgZGVjb2RlTm9kZTogZnVuY3Rpb24gZGVjb2RlTm9kZShyZWFkZXIpIHsKKyAgICAgIGlmICh0aGlzLmlzTGVhZikgeworICAgICAgICBpZiAodGhpcy5pc09PQikgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGh0T2Zmc2V0ID0gcmVhZGVyLnJlYWRCaXRzKHRoaXMucmFuZ2VMZW5ndGgpOworICAgICAgICByZXR1cm4gdGhpcy5yYW5nZUxvdyArICh0aGlzLmlzTG93ZXJSYW5nZSA/IC1odE9mZnNldCA6IGh0T2Zmc2V0KTsKKyAgICAgIH0KKworICAgICAgdmFyIG5vZGUgPSB0aGlzLmNoaWxkcmVuW3JlYWRlci5yZWFkQml0KCldOworCisgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBkYXRhIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBub2RlLmRlY29kZU5vZGUocmVhZGVyKTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gSHVmZm1hblRhYmxlKGxpbmVzLCBwcmVmaXhDb2Rlc0RvbmUpIHsKKyAgICBpZiAoIXByZWZpeENvZGVzRG9uZSkgeworICAgICAgdGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhsaW5lcyk7CisgICAgfQorCisgICAgdGhpcy5yb290Tm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgbGluZSA9IGxpbmVzW2ldOworCisgICAgICBpZiAobGluZS5wcmVmaXhMZW5ndGggPiAwKSB7CisgICAgICAgIHRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKGxpbmUsIGxpbmUucHJlZml4TGVuZ3RoIC0gMSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgSHVmZm1hblRhYmxlLnByb3RvdHlwZSA9IHsKKyAgICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZShyZWFkZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTsKKyAgICB9LAorICAgIGFzc2lnblByZWZpeENvZGVzOiBmdW5jdGlvbiBhc3NpZ25QcmVmaXhDb2RlcyhsaW5lcykgeworICAgICAgdmFyIGxpbmVzTGVuZ3RoID0gbGluZXMubGVuZ3RoOworICAgICAgdmFyIHByZWZpeExlbmd0aE1heCA9IDA7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXNMZW5ndGg7IGkrKykgeworICAgICAgICBwcmVmaXhMZW5ndGhNYXggPSBNYXRoLm1heChwcmVmaXhMZW5ndGhNYXgsIGxpbmVzW2ldLnByZWZpeExlbmd0aCk7CisgICAgICB9CisKKyAgICAgIHZhciBoaXN0b2dyYW0gPSBuZXcgVWludDMyQXJyYXkocHJlZml4TGVuZ3RoTWF4ICsgMSk7CisKKyAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGxpbmVzTGVuZ3RoOyBfaTIrKykgeworICAgICAgICBoaXN0b2dyYW1bbGluZXNbX2kyXS5wcmVmaXhMZW5ndGhdKys7CisgICAgICB9CisKKyAgICAgIHZhciBjdXJyZW50TGVuZ3RoID0gMSwKKyAgICAgICAgICBmaXJzdENvZGUgPSAwLAorICAgICAgICAgIGN1cnJlbnRDb2RlLAorICAgICAgICAgIGN1cnJlbnRUZW1wLAorICAgICAgICAgIGxpbmU7CisgICAgICBoaXN0b2dyYW1bMF0gPSAwOworCisgICAgICB3aGlsZSAoY3VycmVudExlbmd0aCA8PSBwcmVmaXhMZW5ndGhNYXgpIHsKKyAgICAgICAgZmlyc3RDb2RlID0gZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSA8PCAxOworICAgICAgICBjdXJyZW50Q29kZSA9IGZpcnN0Q29kZTsKKyAgICAgICAgY3VycmVudFRlbXAgPSAwOworCisgICAgICAgIHdoaWxlIChjdXJyZW50VGVtcCA8IGxpbmVzTGVuZ3RoKSB7CisgICAgICAgICAgbGluZSA9IGxpbmVzW2N1cnJlbnRUZW1wXTsKKworICAgICAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA9PT0gY3VycmVudExlbmd0aCkgeworICAgICAgICAgICAgbGluZS5wcmVmaXhDb2RlID0gY3VycmVudENvZGU7CisgICAgICAgICAgICBjdXJyZW50Q29kZSsrOworICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnRUZW1wKys7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50TGVuZ3RoKys7CisgICAgICB9CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHZhciBmbGFncyA9IGRhdGFbc3RhcnRdOworICAgIHZhciBsb3dlc3RWYWx1ZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDEpICYgMHhmZmZmZmZmZjsKKyAgICB2YXIgaGlnaGVzdFZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgNSkgJiAweGZmZmZmZmZmOworICAgIHZhciByZWFkZXIgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0ICsgOSwgZW5kKTsKKyAgICB2YXIgcHJlZml4U2l6ZUJpdHMgPSAoZmxhZ3MgPj4gMSAmIDcpICsgMTsKKyAgICB2YXIgcmFuZ2VTaXplQml0cyA9IChmbGFncyA+PiA0ICYgNykgKyAxOworICAgIHZhciBsaW5lcyA9IFtdOworICAgIHZhciBwcmVmaXhMZW5ndGgsCisgICAgICAgIHJhbmdlTGVuZ3RoLAorICAgICAgICBjdXJyZW50UmFuZ2VMb3cgPSBsb3dlc3RWYWx1ZTsKKworICAgIGRvIHsKKyAgICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CisgICAgICByYW5nZUxlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhyYW5nZVNpemVCaXRzKTsKKyAgICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtjdXJyZW50UmFuZ2VMb3csIHByZWZpeExlbmd0aCwgcmFuZ2VMZW5ndGgsIDBdKSk7CisgICAgICBjdXJyZW50UmFuZ2VMb3cgKz0gMSA8PCByYW5nZUxlbmd0aDsKKyAgICB9IHdoaWxlIChjdXJyZW50UmFuZ2VMb3cgPCBoaWdoZXN0VmFsdWUpOworCisgICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKKyAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbbG93ZXN0VmFsdWUgLSAxLCBwcmVmaXhMZW5ndGgsIDMyLCAwLCAibG93ZXIiXSkpOworICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CisgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2hpZ2hlc3RWYWx1ZSwgcHJlZml4TGVuZ3RoLCAzMiwgMF0pKTsKKworICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CisgICAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbcHJlZml4TGVuZ3RoLCAwXSkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgSHVmZm1hblRhYmxlKGxpbmVzLCBmYWxzZSk7CisgIH0KKworICB2YXIgc3RhbmRhcmRUYWJsZXNDYWNoZSA9IHt9OworCisgIGZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7CisgICAgdmFyIHRhYmxlID0gc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdOworCisgICAgaWYgKHRhYmxlKSB7CisgICAgICByZXR1cm4gdGFibGU7CisgICAgfQorCisgICAgdmFyIGxpbmVzOworCisgICAgc3dpdGNoIChudW1iZXIpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgbGluZXMgPSBbWzAsIDEsIDQsIDB4MF0sIFsxNiwgMiwgOCwgMHgyXSwgWzI3MiwgMywgMTYsIDB4Nl0sIFs2NTgwOCwgMywgMzIsIDB4N11dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAyOgorICAgICAgICBsaW5lcyA9IFtbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWzc1LCA2LCAzMiwgMHgzZV0sIFs2LCAweDNmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIGxpbmVzID0gW1stMjU2LCA4LCA4LCAweGZlXSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAyLCAwLCAweDJdLCBbMiwgMywgMCwgMHg2XSwgWzMsIDQsIDMsIDB4ZV0sIFsxMSwgNSwgNiwgMHgxZV0sIFstMjU3LCA4LCAzMiwgMHhmZiwgImxvd2VyIl0sIFs3NSwgNywgMzIsIDB4N2VdLCBbNiwgMHgzZV1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0OgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWzc2LCA1LCAzMiwgMHgxZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA1OgorICAgICAgICBsaW5lcyA9IFtbLTI1NSwgNywgOCwgMHg3ZV0sIFsxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDAsIDB4Nl0sIFs0LCA0LCAzLCAweGVdLCBbMTIsIDUsIDYsIDB4MWVdLCBbLTI1NiwgNywgMzIsIDB4N2YsICJsb3dlciJdLCBbNzYsIDYsIDMyLCAweDNlXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDY6CisgICAgICAgIGxpbmVzID0gW1stMjA0OCwgNSwgMTAsIDB4MWNdLCBbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCA0LCA4LCAweDldLCBbLTI1NiwgNCwgNywgMHhhXSwgWy0xMjgsIDUsIDYsIDB4MWRdLCBbLTY0LCA1LCA1LCAweDFlXSwgWy0zMiwgNCwgNSwgMHhiXSwgWzAsIDIsIDcsIDB4MF0sIFsxMjgsIDMsIDcsIDB4Ml0sIFsyNTYsIDMsIDgsIDB4M10sIFs1MTIsIDQsIDksIDB4Y10sIFsxMDI0LCA0LCAxMCwgMHhkXSwgWy0yMDQ5LCA2LCAzMiwgMHgzZSwgImxvd2VyIl0sIFsyMDQ4LCA2LCAzMiwgMHgzZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA3OgorICAgICAgICBsaW5lcyA9IFtbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCAzLCA4LCAweDBdLCBbLTI1NiwgNCwgNywgMHg5XSwgWy0xMjgsIDUsIDYsIDB4MWFdLCBbLTY0LCA1LCA1LCAweDFiXSwgWy0zMiwgNCwgNSwgMHhhXSwgWzAsIDQsIDUsIDB4Yl0sIFszMiwgNSwgNSwgMHgxY10sIFs2NCwgNSwgNiwgMHgxZF0sIFsxMjgsIDQsIDcsIDB4Y10sIFsyNTYsIDMsIDgsIDB4MV0sIFs1MTIsIDMsIDksIDB4Ml0sIFsxMDI0LCAzLCAxMCwgMHgzXSwgWy0xMDI1LCA1LCAzMiwgMHgxZSwgImxvd2VyIl0sIFsyMDQ4LCA1LCAzMiwgMHgxZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA4OgorICAgICAgICBsaW5lcyA9IFtbLTE1LCA4LCAzLCAweGZjXSwgWy03LCA5LCAxLCAweDFmY10sIFstNSwgOCwgMSwgMHhmZF0sIFstMywgOSwgMCwgMHgxZmRdLCBbLTIsIDcsIDAsIDB4N2NdLCBbLTEsIDQsIDAsIDB4YV0sIFswLCAyLCAxLCAweDBdLCBbMiwgNSwgMCwgMHgxYV0sIFszLCA2LCAwLCAweDNhXSwgWzQsIDMsIDQsIDB4NF0sIFsyMCwgNiwgMSwgMHgzYl0sIFsyMiwgNCwgNCwgMHhiXSwgWzM4LCA0LCA1LCAweGNdLCBbNzAsIDUsIDYsIDB4MWJdLCBbMTM0LCA1LCA3LCAweDFjXSwgWzI2MiwgNiwgNywgMHgzY10sIFszOTAsIDcsIDgsIDB4N2RdLCBbNjQ2LCA2LCAxMCwgMHgzZF0sIFstMTYsIDksIDMyLCAweDFmZSwgImxvd2VyIl0sIFsxNjcwLCA5LCAzMiwgMHgxZmZdLCBbMiwgMHgxXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDk6CisgICAgICAgIGxpbmVzID0gW1stMzEsIDgsIDQsIDB4ZmNdLCBbLTE1LCA5LCAyLCAweDFmY10sIFstMTEsIDgsIDIsIDB4ZmRdLCBbLTcsIDksIDEsIDB4MWZkXSwgWy01LCA3LCAxLCAweDdjXSwgWy0zLCA0LCAxLCAweGFdLCBbLTEsIDMsIDEsIDB4Ml0sIFsxLCAzLCAxLCAweDNdLCBbMywgNSwgMSwgMHgxYV0sIFs1LCA2LCAxLCAweDNhXSwgWzcsIDMsIDUsIDB4NF0sIFszOSwgNiwgMiwgMHgzYl0sIFs0MywgNCwgNSwgMHhiXSwgWzc1LCA0LCA2LCAweGNdLCBbMTM5LCA1LCA3LCAweDFiXSwgWzI2NywgNSwgOCwgMHgxY10sIFs1MjMsIDYsIDgsIDB4M2NdLCBbNzc5LCA3LCA5LCAweDdkXSwgWzEyOTEsIDYsIDExLCAweDNkXSwgWy0zMiwgOSwgMzIsIDB4MWZlLCAibG93ZXIiXSwgWzMzMzksIDksIDMyLCAweDFmZl0sIFsyLCAweDBdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIGxpbmVzID0gW1stMjEsIDcsIDQsIDB4N2FdLCBbLTUsIDgsIDAsIDB4ZmNdLCBbLTQsIDcsIDAsIDB4N2JdLCBbLTMsIDUsIDAsIDB4MThdLCBbLTIsIDIsIDIsIDB4MF0sIFsyLCA1LCAwLCAweDE5XSwgWzMsIDYsIDAsIDB4MzZdLCBbNCwgNywgMCwgMHg3Y10sIFs1LCA4LCAwLCAweGZkXSwgWzYsIDIsIDYsIDB4MV0sIFs3MCwgNSwgNSwgMHgxYV0sIFsxMDIsIDYsIDUsIDB4MzddLCBbMTM0LCA2LCA2LCAweDM4XSwgWzE5OCwgNiwgNywgMHgzOV0sIFszMjYsIDYsIDgsIDB4M2FdLCBbNTgyLCA2LCA5LCAweDNiXSwgWzEwOTQsIDYsIDEwLCAweDNjXSwgWzIxMTgsIDcsIDExLCAweDdkXSwgWy0yMiwgOCwgMzIsIDB4ZmUsICJsb3dlciJdLCBbNDE2NiwgOCwgMzIsIDB4ZmZdLCBbMiwgMHgyXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDExOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDEsIDB4Ml0sIFs0LCA0LCAwLCAweGNdLCBbNSwgNCwgMSwgMHhkXSwgWzcsIDUsIDEsIDB4MWNdLCBbOSwgNSwgMiwgMHgxZF0sIFsxMywgNiwgMiwgMHgzY10sIFsxNywgNywgMiwgMHg3YV0sIFsyMSwgNywgMywgMHg3Yl0sIFsyOSwgNywgNCwgMHg3Y10sIFs0NSwgNywgNSwgMHg3ZF0sIFs3NywgNywgNiwgMHg3ZV0sIFsxNDEsIDcsIDMyLCAweDdmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDEyOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAxLCAweDZdLCBbNSwgNSwgMCwgMHgxY10sIFs2LCA1LCAxLCAweDFkXSwgWzgsIDYsIDEsIDB4M2NdLCBbMTAsIDcsIDAsIDB4N2FdLCBbMTEsIDcsIDEsIDB4N2JdLCBbMTMsIDcsIDIsIDB4N2NdLCBbMTcsIDcsIDMsIDB4N2RdLCBbMjUsIDcsIDQsIDB4N2VdLCBbNDEsIDgsIDUsIDB4ZmVdLCBbNzMsIDgsIDMyLCAweGZmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDEzOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDMsIDAsIDB4NF0sIFszLCA0LCAwLCAweGNdLCBbNCwgNSwgMCwgMHgxY10sIFs1LCA0LCAxLCAweGRdLCBbNywgMywgMywgMHg1XSwgWzE1LCA2LCAxLCAweDNhXSwgWzE3LCA2LCAyLCAweDNiXSwgWzIxLCA2LCAzLCAweDNjXSwgWzI5LCA2LCA0LCAweDNkXSwgWzQ1LCA2LCA1LCAweDNlXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTQ6CisgICAgICAgIGxpbmVzID0gW1stMiwgMywgMCwgMHg0XSwgWy0xLCAzLCAwLCAweDVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4Nl0sIFsyLCAzLCAwLCAweDddXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIGxpbmVzID0gW1stMjQsIDcsIDQsIDB4N2NdLCBbLTgsIDYsIDIsIDB4M2NdLCBbLTQsIDUsIDEsIDB4MWNdLCBbLTIsIDQsIDAsIDB4Y10sIFstMSwgMywgMCwgMHg0XSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAzLCAwLCAweDVdLCBbMiwgNCwgMCwgMHhkXSwgWzMsIDUsIDEsIDB4MWRdLCBbNSwgNiwgMiwgMHgzZF0sIFs5LCA3LCA0LCAweDdkXSwgWy0yNSwgNywgMzIsIDB4N2UsICJsb3dlciJdLCBbMjUsIDcsIDMyLCAweDdmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigic3RhbmRhcmQgdGFibGUgQi4iLmNvbmNhdChudW1iZXIsICIgZG9lcyBub3QgZXhpc3QiKSk7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgbGluZXNbaV0gPSBuZXcgSHVmZm1hbkxpbmUobGluZXNbaV0pOworICAgIH0KKworICAgIHRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgdHJ1ZSk7CisgICAgc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdID0gdGFibGU7CisgICAgcmV0dXJuIHRhYmxlOworICB9CisKKyAgZnVuY3Rpb24gUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICB0aGlzLmVuZCA9IGVuZDsKKyAgICB0aGlzLnBvc2l0aW9uID0gc3RhcnQ7CisgICAgdGhpcy5zaGlmdCA9IC0xOworICAgIHRoaXMuY3VycmVudEJ5dGUgPSAwOworICB9CisKKyAgUmVhZGVyLnByb3RvdHlwZSA9IHsKKyAgICByZWFkQml0OiBmdW5jdGlvbiByZWFkQml0KCkgeworICAgICAgaWYgKHRoaXMuc2hpZnQgPCAwKSB7CisgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImVuZCBvZiBkYXRhIHdoaWxlIHJlYWRpbmcgYml0Iik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRCeXRlID0gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107CisgICAgICAgIHRoaXMuc2hpZnQgPSA3OworICAgICAgfQorCisgICAgICB2YXIgYml0ID0gdGhpcy5jdXJyZW50Qnl0ZSA+PiB0aGlzLnNoaWZ0ICYgMTsKKyAgICAgIHRoaXMuc2hpZnQtLTsKKyAgICAgIHJldHVybiBiaXQ7CisgICAgfSwKKyAgICByZWFkQml0czogZnVuY3Rpb24gcmVhZEJpdHMobnVtQml0cykgeworICAgICAgdmFyIHJlc3VsdCA9IDAsCisgICAgICAgICAgaTsKKworICAgICAgZm9yIChpID0gbnVtQml0cyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHJlc3VsdCB8PSB0aGlzLnJlYWRCaXQoKSA8PCBpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0sCisgICAgYnl0ZUFsaWduOiBmdW5jdGlvbiBieXRlQWxpZ24oKSB7CisgICAgICB0aGlzLnNoaWZ0ID0gLTE7CisgICAgfSwKKyAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgeworICAgICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5lbmQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGdldEN1c3RvbUh1ZmZtYW5UYWJsZShpbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CisgICAgdmFyIGN1cnJlbnRJbmRleCA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFRvLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciB0YWJsZSA9IGN1c3RvbVRhYmxlc1tyZWZlcnJlZFRvW2ldXTsKKworICAgICAgaWYgKHRhYmxlKSB7CisgICAgICAgIGlmIChpbmRleCA9PT0gY3VycmVudEluZGV4KSB7CisgICAgICAgICAgcmV0dXJuIHRhYmxlOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudEluZGV4Kys7CisgICAgICB9CisgICAgfQorCisgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImNhbid0IGZpbmQgY3VzdG9tIEh1ZmZtYW4gdGFibGUiKTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKHRleHRSZWdpb24sIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcywgbnVtYmVyT2ZTeW1ib2xzLCByZWFkZXIpIHsKKyAgICB2YXIgY29kZXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IDM0OyBpKyspIHsKKyAgICAgIHZhciBjb2RlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKDQpOworICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIGNvZGVMZW5ndGgsIDAsIDBdKSk7CisgICAgfQorCisgICAgdmFyIHJ1bkNvZGVzVGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGNvZGVzLCBmYWxzZSk7CisgICAgY29kZXMubGVuZ3RoID0gMDsKKworICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG51bWJlck9mU3ltYm9sczspIHsKKyAgICAgIHZhciBfY29kZUxlbmd0aCA9IHJ1bkNvZGVzVGFibGUuZGVjb2RlKHJlYWRlcik7CisKKyAgICAgIGlmIChfY29kZUxlbmd0aCA+PSAzMikgeworICAgICAgICB2YXIgcmVwZWF0ZWRMZW5ndGggPSB2b2lkIDAsCisgICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSB2b2lkIDAsCisgICAgICAgICAgICBqID0gdm9pZCAwOworCisgICAgICAgIHN3aXRjaCAoX2NvZGVMZW5ndGgpIHsKKyAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgaWYgKF9pMyA9PT0gMCkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigibm8gcHJldmlvdXMgdmFsdWUgaW4gc3ltYm9sIElEIHRhYmxlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygyKSArIDM7CisgICAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IGNvZGVzW19pMyAtIDFdLnByZWZpeExlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygzKSArIDM7CisgICAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTsKKyAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIGNvZGUgbGVuZ3RoIGluIHN5bWJvbCBJRCB0YWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUmVwZWF0czsgaisrKSB7CisgICAgICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW19pMywgcmVwZWF0ZWRMZW5ndGgsIDAsIDBdKSk7CisgICAgICAgICAgX2kzKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtfaTMsIF9jb2RlTGVuZ3RoLCAwLCAwXSkpOworICAgICAgICBfaTMrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZWFkZXIuYnl0ZUFsaWduKCk7CisgICAgdmFyIHN5bWJvbElEVGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGNvZGVzLCBmYWxzZSk7CisgICAgdmFyIGN1c3RvbUluZGV4ID0gMCwKKyAgICAgICAgdGFibGVGaXJzdFMsCisgICAgICAgIHRhYmxlRGVsdGFTLAorICAgICAgICB0YWJsZURlbHRhVDsKKworICAgIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRlMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGFibGVGaXJzdFMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkZTICsgNik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRmlyc3RTID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgICBjdXN0b21JbmRleCsrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBGUyBzZWxlY3RvciIpOworICAgIH0KKworICAgIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgdGFibGVEZWx0YVMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRTICsgOCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRGVsdGFTID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgICBjdXN0b21JbmRleCsrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEUyBzZWxlY3RvciIpOworICAgIH0KKworICAgIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFQpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgdGFibGVEZWx0YVQgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRUICsgMTEpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzOgorICAgICAgICB0YWJsZURlbHRhVCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFQgc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50KSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBzeW1ib2xJRFRhYmxlOiBzeW1ib2xJRFRhYmxlLAorICAgICAgdGFibGVGaXJzdFM6IHRhYmxlRmlyc3RTLAorICAgICAgdGFibGVEZWx0YVM6IHRhYmxlRGVsdGFTLAorICAgICAgdGFibGVEZWx0YVQ6IHRhYmxlRGVsdGFUCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFN5bWJvbERpY3Rpb25hcnlIdWZmbWFuVGFibGVzKGRpY3Rpb25hcnksIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcykgeworICAgIHZhciBjdXN0b21JbmRleCA9IDAsCisgICAgICAgIHRhYmxlRGVsdGFIZWlnaHQsCisgICAgICAgIHRhYmxlRGVsdGFXaWR0aDsKKworICAgIHN3aXRjaCAoZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvcikgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgICB0YWJsZURlbHRhSGVpZ2h0ID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yICsgNCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERIIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldFN0YW5kYXJkVGFibGUoZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvciArIDIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzOgorICAgICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERXIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgdmFyIHRhYmxlQml0bWFwU2l6ZSwgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXM7CisKKyAgICBpZiAoZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IpIHsKKyAgICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CisgICAgfQorCisgICAgaWYgKGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvcikgeworICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgdGFibGVEZWx0YUhlaWdodDogdGFibGVEZWx0YUhlaWdodCwKKyAgICAgIHRhYmxlRGVsdGFXaWR0aDogdGFibGVEZWx0YVdpZHRoLAorICAgICAgdGFibGVCaXRtYXBTaXplOiB0YWJsZUJpdG1hcFNpemUsCisgICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczogdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChyZWFkZXIsIHdpZHRoLCBoZWlnaHQpIHsKKyAgICB2YXIgYml0bWFwID0gW107CisKKyAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICB2YXIgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgYml0bWFwLnB1c2gocm93KTsKKworICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgIHJvd1t4XSA9IHJlYWRlci5yZWFkQml0KCk7CisgICAgICB9CisKKyAgICAgIHJlYWRlci5ieXRlQWxpZ24oKTsKKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlTU1SQml0bWFwKGlucHV0LCB3aWR0aCwgaGVpZ2h0LCBlbmRPZkJsb2NrKSB7CisgICAgdmFyIHBhcmFtcyA9IHsKKyAgICAgIEs6IC0xLAorICAgICAgQ29sdW1uczogd2lkdGgsCisgICAgICBSb3dzOiBoZWlnaHQsCisgICAgICBCbGFja0lzMTogdHJ1ZSwKKyAgICAgIEVuZE9mQmxvY2s6IGVuZE9mQmxvY2sKKyAgICB9OworICAgIHZhciBkZWNvZGVyID0gbmV3IF9jY2l0dC5DQ0lUVEZheERlY29kZXIoaW5wdXQsIHBhcmFtcyk7CisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBjdXJyZW50Qnl0ZSwKKyAgICAgICAgZW9mID0gZmFsc2U7CisKKyAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICB2YXIgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgYml0bWFwLnB1c2gocm93KTsKKyAgICAgIHZhciBzaGlmdCA9IC0xOworCisgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgaWYgKHNoaWZ0IDwgMCkgeworICAgICAgICAgIGN1cnJlbnRCeXRlID0gZGVjb2Rlci5yZWFkTmV4dENoYXIoKTsKKworICAgICAgICAgIGlmIChjdXJyZW50Qnl0ZSA9PT0gLTEpIHsKKyAgICAgICAgICAgIGN1cnJlbnRCeXRlID0gMDsKKyAgICAgICAgICAgIGVvZiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2hpZnQgPSA3OworICAgICAgICB9CisKKyAgICAgICAgcm93W3hdID0gY3VycmVudEJ5dGUgPj4gc2hpZnQgJiAxOworICAgICAgICBzaGlmdC0tOworICAgICAgfQorICAgIH0KKworICAgIGlmIChlbmRPZkJsb2NrICYmICFlb2YpIHsKKyAgICAgIHZhciBsb29rRm9yRU9GTGltaXQgPSA1OworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvb2tGb3JFT0ZMaW1pdDsgaSsrKSB7CisgICAgICAgIGlmIChkZWNvZGVyLnJlYWROZXh0Q2hhcigpID09PSAtMSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIEpiaWcySW1hZ2UoKSB7fQorCisgIEpiaWcySW1hZ2UucHJvdG90eXBlID0geworICAgIHBhcnNlQ2h1bmtzOiBmdW5jdGlvbiBwYXJzZUNodW5rcyhjaHVua3MpIHsKKyAgICAgIHJldHVybiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcyk7CisgICAgfSwKKyAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoZGF0YSkgeworICAgICAgdmFyIF9wYXJzZUpiaWcgPSBwYXJzZUpiaWcyKGRhdGEpLAorICAgICAgICAgIGltZ0RhdGEgPSBfcGFyc2VKYmlnLmltZ0RhdGEsCisgICAgICAgICAgd2lkdGggPSBfcGFyc2VKYmlnLndpZHRoLAorICAgICAgICAgIGhlaWdodCA9IF9wYXJzZUpiaWcuaGVpZ2h0OworCisgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKKyAgICAgIHJldHVybiBpbWdEYXRhOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIEpiaWcySW1hZ2U7Cit9KCk7CisKK2V4cG9ydHMuSmJpZzJJbWFnZSA9IEpiaWcySW1hZ2U7CisKKy8qKiovIH0pLAorLyogMjE0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQXJpdGhtZXRpY0RlY29kZXIgPSB2b2lkIDA7CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgUWVUYWJsZSA9IFt7CisgIHFlOiAweDU2MDEsCisgIG5tcHM6IDEsCisgIG5scHM6IDEsCisgIHN3aXRjaEZsYWc6IDEKK30sIHsKKyAgcWU6IDB4MzQwMSwKKyAgbm1wczogMiwKKyAgbmxwczogNiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxODAxLAorICBubXBzOiAzLAorICBubHBzOiA5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDBhYzEsCisgIG5tcHM6IDQsCisgIG5scHM6IDEyLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA1MjEsCisgIG5tcHM6IDUsCisgIG5scHM6IDI5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAyMjEsCisgIG5tcHM6IDM4LAorICBubHBzOiAzMywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg1NjAxLAorICBubXBzOiA3LAorICBubHBzOiA2LAorICBzd2l0Y2hGbGFnOiAxCit9LCB7CisgIHFlOiAweDU0MDEsCisgIG5tcHM6IDgsCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDQ4MDEsCisgIG5tcHM6IDksCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDM4MDEsCisgIG5tcHM6IDEwLAorICBubHBzOiAxNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgzMDAxLAorICBubXBzOiAxMSwKKyAgbmxwczogMTcsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MjQwMSwKKyAgbm1wczogMTIsCisgIG5scHM6IDE4LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDFjMDEsCisgIG5tcHM6IDEzLAorICBubHBzOiAyMCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxNjAxLAorICBubXBzOiAyOSwKKyAgbmxwczogMjEsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NTYwMSwKKyAgbm1wczogMTUsCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAxCit9LCB7CisgIHFlOiAweDU0MDEsCisgIG5tcHM6IDE2LAorICBubHBzOiAxNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg1MTAxLAorICBubXBzOiAxNywKKyAgbmxwczogMTUsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NDgwMSwKKyAgbm1wczogMTgsCisgIG5scHM6IDE2LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDM4MDEsCisgIG5tcHM6IDE5LAorICBubHBzOiAxNywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgzNDAxLAorICBubXBzOiAyMCwKKyAgbmxwczogMTgsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MzAwMSwKKyAgbm1wczogMjEsCisgIG5scHM6IDE5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDI4MDEsCisgIG5tcHM6IDIyLAorICBubHBzOiAxOSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgyNDAxLAorICBubXBzOiAyMywKKyAgbmxwczogMjAsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MjIwMSwKKyAgbm1wczogMjQsCisgIG5scHM6IDIxLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDFjMDEsCisgIG5tcHM6IDI1LAorICBubHBzOiAyMiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxODAxLAorICBubXBzOiAyNiwKKyAgbmxwczogMjMsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTYwMSwKKyAgbm1wczogMjcsCisgIG5scHM6IDI0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE0MDEsCisgIG5tcHM6IDI4LAorICBubHBzOiAyNSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxMjAxLAorICBubXBzOiAyOSwKKyAgbmxwczogMjYsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTEwMSwKKyAgbm1wczogMzAsCisgIG5scHM6IDI3LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDBhYzEsCisgIG5tcHM6IDMxLAorICBubHBzOiAyOCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwOWMxLAorICBubXBzOiAzMiwKKyAgbmxwczogMjksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDhhMSwKKyAgbm1wczogMzMsCisgIG5scHM6IDMwLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA1MjEsCisgIG5tcHM6IDM0LAorICBubHBzOiAzMSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwNDQxLAorICBubXBzOiAzNSwKKyAgbmxwczogMzIsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDJhMSwKKyAgbm1wczogMzYsCisgIG5scHM6IDMzLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAyMjEsCisgIG5tcHM6IDM3LAorICBubHBzOiAzNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMTQxLAorICBubXBzOiAzOCwKKyAgbmxwczogMzUsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDExMSwKKyAgbm1wczogMzksCisgIG5scHM6IDM2LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwODUsCisgIG5tcHM6IDQwLAorICBubHBzOiAzNywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDQ5LAorICBubXBzOiA0MSwKKyAgbmxwczogMzgsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAyNSwKKyAgbm1wczogNDIsCisgIG5scHM6IDM5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwMTUsCisgIG5tcHM6IDQzLAorICBubHBzOiA0MCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDA5LAorICBubXBzOiA0NCwKKyAgbmxwczogNDEsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAwNSwKKyAgbm1wczogNDUsCisgIG5scHM6IDQyLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwMDEsCisgIG5tcHM6IDQ1LAorICBubHBzOiA0MywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg1NjAxLAorICBubXBzOiA0NiwKKyAgbmxwczogNDYsCisgIHN3aXRjaEZsYWc6IDAKK31dOworCit2YXIgQXJpdGhtZXRpY0RlY29kZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBBcml0aG1ldGljRGVjb2RlcihkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFyaXRobWV0aWNEZWNvZGVyKTsKKworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5icCA9IHN0YXJ0OworICAgIHRoaXMuZGF0YUVuZCA9IGVuZDsKKyAgICB0aGlzLmNoaWdoID0gZGF0YVtzdGFydF07CisgICAgdGhpcy5jbG93ID0gMDsKKyAgICB0aGlzLmJ5dGVJbigpOworICAgIHRoaXMuY2hpZ2ggPSB0aGlzLmNoaWdoIDw8IDcgJiAweGZmZmYgfCB0aGlzLmNsb3cgPj4gOSAmIDB4N2Y7CisgICAgdGhpcy5jbG93ID0gdGhpcy5jbG93IDw8IDcgJiAweGZmZmY7CisgICAgdGhpcy5jdCAtPSA3OworICAgIHRoaXMuYSA9IDB4ODAwMDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhBcml0aG1ldGljRGVjb2RlciwgW3sKKyAgICBrZXk6ICJieXRlSW4iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBieXRlSW4oKSB7CisgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICAgIHZhciBicCA9IHRoaXMuYnA7CisKKyAgICAgIGlmIChkYXRhW2JwXSA9PT0gMHhmZikgeworICAgICAgICBpZiAoZGF0YVticCArIDFdID4gMHg4ZikgeworICAgICAgICAgIHRoaXMuY2xvdyArPSAweGZmMDA7CisgICAgICAgICAgdGhpcy5jdCA9IDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnArKzsKKyAgICAgICAgICB0aGlzLmNsb3cgKz0gZGF0YVticF0gPDwgOTsKKyAgICAgICAgICB0aGlzLmN0ID0gNzsKKyAgICAgICAgICB0aGlzLmJwID0gYnA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJwKys7CisgICAgICAgIHRoaXMuY2xvdyArPSBicCA8IHRoaXMuZGF0YUVuZCA/IGRhdGFbYnBdIDw8IDggOiAweGZmMDA7CisgICAgICAgIHRoaXMuY3QgPSA4OworICAgICAgICB0aGlzLmJwID0gYnA7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmNsb3cgPiAweGZmZmYpIHsKKyAgICAgICAgdGhpcy5jaGlnaCArPSB0aGlzLmNsb3cgPj4gMTY7CisgICAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVhZEJpdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWRCaXQoY29udGV4dHMsIHBvcykgeworICAgICAgdmFyIGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLAorICAgICAgICAgIGN4X21wcyA9IGNvbnRleHRzW3Bvc10gJiAxOworICAgICAgdmFyIHFlVGFibGVJY3ggPSBRZVRhYmxlW2N4X2luZGV4XTsKKyAgICAgIHZhciBxZUljeCA9IHFlVGFibGVJY3gucWU7CisgICAgICB2YXIgZDsKKyAgICAgIHZhciBhID0gdGhpcy5hIC0gcWVJY3g7CisKKyAgICAgIGlmICh0aGlzLmNoaWdoIDwgcWVJY3gpIHsKKyAgICAgICAgaWYgKGEgPCBxZUljeCkgeworICAgICAgICAgIGEgPSBxZUljeDsKKyAgICAgICAgICBkID0gY3hfbXBzOworICAgICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGEgPSBxZUljeDsKKyAgICAgICAgICBkID0gMSBeIGN4X21wczsKKworICAgICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHsKKyAgICAgICAgICAgIGN4X21wcyA9IGQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5scHM7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuY2hpZ2ggLT0gcWVJY3g7CisKKyAgICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkgeworICAgICAgICAgIHRoaXMuYSA9IGE7CisgICAgICAgICAgcmV0dXJuIGN4X21wczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhIDwgcWVJY3gpIHsKKyAgICAgICAgICBkID0gMSBeIGN4X21wczsKKworICAgICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHsKKyAgICAgICAgICAgIGN4X21wcyA9IGQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5scHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZCA9IGN4X21wczsKKyAgICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBkbyB7CisgICAgICAgIGlmICh0aGlzLmN0ID09PSAwKSB7CisgICAgICAgICAgdGhpcy5ieXRlSW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGEgPDw9IDE7CisgICAgICAgIHRoaXMuY2hpZ2ggPSB0aGlzLmNoaWdoIDw8IDEgJiAweGZmZmYgfCB0aGlzLmNsb3cgPj4gMTUgJiAxOworICAgICAgICB0aGlzLmNsb3cgPSB0aGlzLmNsb3cgPDwgMSAmIDB4ZmZmZjsKKyAgICAgICAgdGhpcy5jdC0tOworICAgICAgfSB3aGlsZSAoKGEgJiAweDgwMDApID09PSAwKTsKKworICAgICAgdGhpcy5hID0gYTsKKyAgICAgIGNvbnRleHRzW3Bvc10gPSBjeF9pbmRleCA8PCAxIHwgY3hfbXBzOworICAgICAgcmV0dXJuIGQ7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEFyaXRobWV0aWNEZWNvZGVyOworfSgpOworCitleHBvcnRzLkFyaXRobWV0aWNEZWNvZGVyID0gQXJpdGhtZXRpY0RlY29kZXI7CisKKy8qKiovIH0pLAorLyogMjE1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSnBlZ1N0cmVhbSA9IHZvaWQgMDsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOSk7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjAyKTsKKwordmFyIF9qcGcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxNik7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBKcGVnU3RyZWFtID0gZnVuY3Rpb24gSnBlZ1N0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEpwZWdTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZGljdCwgcGFyYW1zKSB7CisgICAgdmFyIGNoOworCisgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgaWYgKGNoID09PSAweGZmKSB7CisgICAgICAgIHN0cmVhbS5za2lwKC0xKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5tYXliZUxlbmd0aCA9IG1heWJlTGVuZ3RoOworICAgIHRoaXMuZGljdCA9IGRpY3Q7CisgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisKKyAgICBfc3RyZWFtLkRlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIEpwZWdTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShfc3RyZWFtLkRlY29kZVN0cmVhbS5wcm90b3R5cGUpOworICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSnBlZ1N0cmVhbS5wcm90b3R5cGUsICJieXRlcyIsIHsKKyAgICBnZXQ6IGZ1bmN0aW9uIEpwZWdTdHJlYW1fYnl0ZXMoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImJ5dGVzIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpOworICAgIH0sCisgICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworCisgIEpwZWdTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlciA9IGZ1bmN0aW9uIChyZXF1ZXN0ZWQpIHt9OworCisgIEpwZWdTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIganBlZ09wdGlvbnMgPSB7CisgICAgICBkZWNvZGVUcmFuc2Zvcm06IHVuZGVmaW5lZCwKKyAgICAgIGNvbG9yVHJhbnNmb3JtOiB1bmRlZmluZWQKKyAgICB9OworICAgIHZhciBkZWNvZGVBcnIgPSB0aGlzLmRpY3QuZ2V0QXJyYXkoIkRlY29kZSIsICJEIik7CisKKyAgICBpZiAodGhpcy5mb3JjZVJHQiAmJiBBcnJheS5pc0FycmF5KGRlY29kZUFycikpIHsKKyAgICAgIHZhciBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5kaWN0LmdldCgiQml0c1BlckNvbXBvbmVudCIpIHx8IDg7CisgICAgICB2YXIgZGVjb2RlQXJyTGVuZ3RoID0gZGVjb2RlQXJyLmxlbmd0aDsKKyAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShkZWNvZGVBcnJMZW5ndGgpOworICAgICAgdmFyIHRyYW5zZm9ybU5lZWRlZCA9IGZhbHNlOworICAgICAgdmFyIG1heFZhbHVlID0gKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlY29kZUFyckxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgIHRyYW5zZm9ybVtpXSA9IChkZWNvZGVBcnJbaSArIDFdIC0gZGVjb2RlQXJyW2ldKSAqIDI1NiB8IDA7CisgICAgICAgIHRyYW5zZm9ybVtpICsgMV0gPSBkZWNvZGVBcnJbaV0gKiBtYXhWYWx1ZSB8IDA7CisKKyAgICAgICAgaWYgKHRyYW5zZm9ybVtpXSAhPT0gMjU2IHx8IHRyYW5zZm9ybVtpICsgMV0gIT09IDApIHsKKyAgICAgICAgICB0cmFuc2Zvcm1OZWVkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0cmFuc2Zvcm1OZWVkZWQpIHsKKyAgICAgICAganBlZ09wdGlvbnMuZGVjb2RlVHJhbnNmb3JtID0gdHJhbnNmb3JtOworICAgICAgfQorICAgIH0KKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh0aGlzLnBhcmFtcykpIHsKKyAgICAgIHZhciBjb2xvclRyYW5zZm9ybSA9IHRoaXMucGFyYW1zLmdldCgiQ29sb3JUcmFuc2Zvcm0iKTsKKworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoY29sb3JUcmFuc2Zvcm0pKSB7CisgICAgICAgIGpwZWdPcHRpb25zLmNvbG9yVHJhbnNmb3JtID0gY29sb3JUcmFuc2Zvcm07CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGpwZWdJbWFnZSA9IG5ldyBfanBnLkpwZWdJbWFnZShqcGVnT3B0aW9ucyk7CisgICAganBlZ0ltYWdlLnBhcnNlKHRoaXMuYnl0ZXMpOworICAgIHZhciBkYXRhID0ganBlZ0ltYWdlLmdldERhdGEoeworICAgICAgd2lkdGg6IHRoaXMuZHJhd1dpZHRoLAorICAgICAgaGVpZ2h0OiB0aGlzLmRyYXdIZWlnaHQsCisgICAgICBmb3JjZVJHQjogdGhpcy5mb3JjZVJHQiwKKyAgICAgIGlzU291cmNlUERGOiB0cnVlCisgICAgfSk7CisgICAgdGhpcy5idWZmZXIgPSBkYXRhOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgdGhpcy5lb2YgPSB0cnVlOworICB9OworCisgIHJldHVybiBKcGVnU3RyZWFtOworfSgpOworCitleHBvcnRzLkpwZWdTdHJlYW0gPSBKcGVnU3RyZWFtOworCisvKioqLyB9KSwKKy8qIDIxNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkpwZWdJbWFnZSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDUpOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKwordmFyIEpwZWdFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24pIHsKKyAgX2luaGVyaXRzKEpwZWdFcnJvciwgX0Jhc2VFeGNlcHRpb24pOworCisgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoSnBlZ0Vycm9yKTsKKworICBmdW5jdGlvbiBKcGVnRXJyb3IobXNnKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpwZWdFcnJvcik7CisKKyAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgIkpQRUcgZXJyb3I6ICIuY29uY2F0KG1zZykpOworICB9CisKKyAgcmV0dXJuIEpwZWdFcnJvcjsKK30oX3V0aWwuQmFzZUV4Y2VwdGlvbik7CisKK3ZhciBETkxNYXJrZXJFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24yKSB7CisgIF9pbmhlcml0cyhETkxNYXJrZXJFcnJvciwgX0Jhc2VFeGNlcHRpb24yKTsKKworICB2YXIgX3N1cGVyMiA9IF9jcmVhdGVTdXBlcihETkxNYXJrZXJFcnJvcik7CisKKyAgZnVuY3Rpb24gRE5MTWFya2VyRXJyb3IobWVzc2FnZSwgc2NhbkxpbmVzKSB7CisgICAgdmFyIF90aGlzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEROTE1hcmtlckVycm9yKTsKKworICAgIF90aGlzID0gX3N1cGVyMi5jYWxsKHRoaXMsIG1lc3NhZ2UpOworICAgIF90aGlzLnNjYW5MaW5lcyA9IHNjYW5MaW5lczsKKyAgICByZXR1cm4gX3RoaXM7CisgIH0KKworICByZXR1cm4gRE5MTWFya2VyRXJyb3I7Cit9KF91dGlsLkJhc2VFeGNlcHRpb24pOworCit2YXIgRU9JTWFya2VyRXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlRXhjZXB0aW9uMykgeworICBfaW5oZXJpdHMoRU9JTWFya2VyRXJyb3IsIF9CYXNlRXhjZXB0aW9uMyk7CisKKyAgdmFyIF9zdXBlcjMgPSBfY3JlYXRlU3VwZXIoRU9JTWFya2VyRXJyb3IpOworCisgIGZ1bmN0aW9uIEVPSU1hcmtlckVycm9yKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFT0lNYXJrZXJFcnJvcik7CisKKyAgICByZXR1cm4gX3N1cGVyMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9CisKKyAgcmV0dXJuIEVPSU1hcmtlckVycm9yOworfShfdXRpbC5CYXNlRXhjZXB0aW9uKTsKKwordmFyIEpwZWdJbWFnZSA9IGZ1bmN0aW9uIEpwZWdJbWFnZUNsb3N1cmUoKSB7CisgIHZhciBkY3RaaWdaYWcgPSBuZXcgVWludDhBcnJheShbMCwgMSwgOCwgMTYsIDksIDIsIDMsIDEwLCAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCA0LCA1LCAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsIDI3LCAyMCwgMTMsIDYsIDcsIDE0LCAyMSwgMjgsIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLCA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2M10pOworICB2YXIgZGN0Q29zMSA9IDQwMTc7CisgIHZhciBkY3RTaW4xID0gNzk5OworICB2YXIgZGN0Q29zMyA9IDM0MDY7CisgIHZhciBkY3RTaW4zID0gMjI3NjsKKyAgdmFyIGRjdENvczYgPSAxNTY3OworICB2YXIgZGN0U2luNiA9IDM3ODQ7CisgIHZhciBkY3RTcXJ0MiA9IDU3OTM7CisgIHZhciBkY3RTcXJ0MWQyID0gMjg5NjsKKworICBmdW5jdGlvbiBKcGVnSW1hZ2UoKSB7CisgICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LAorICAgICAgICBfcmVmJGRlY29kZVRyYW5zZm9ybSA9IF9yZWYuZGVjb2RlVHJhbnNmb3JtLAorICAgICAgICBkZWNvZGVUcmFuc2Zvcm0gPSBfcmVmJGRlY29kZVRyYW5zZm9ybSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkZGVjb2RlVHJhbnNmb3JtLAorICAgICAgICBfcmVmJGNvbG9yVHJhbnNmb3JtID0gX3JlZi5jb2xvclRyYW5zZm9ybSwKKyAgICAgICAgY29sb3JUcmFuc2Zvcm0gPSBfcmVmJGNvbG9yVHJhbnNmb3JtID09PSB2b2lkIDAgPyAtMSA6IF9yZWYkY29sb3JUcmFuc2Zvcm07CisKKyAgICB0aGlzLl9kZWNvZGVUcmFuc2Zvcm0gPSBkZWNvZGVUcmFuc2Zvcm07CisgICAgdGhpcy5fY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCB2YWx1ZXMpIHsKKyAgICB2YXIgayA9IDAsCisgICAgICAgIGNvZGUgPSBbXSwKKyAgICAgICAgaSwKKyAgICAgICAgaiwKKyAgICAgICAgbGVuZ3RoID0gMTY7CisKKyAgICB3aGlsZSAobGVuZ3RoID4gMCAmJiAhY29kZUxlbmd0aHNbbGVuZ3RoIC0gMV0pIHsKKyAgICAgIGxlbmd0aC0tOworICAgIH0KKworICAgIGNvZGUucHVzaCh7CisgICAgICBjaGlsZHJlbjogW10sCisgICAgICBpbmRleDogMAorICAgIH0pOworICAgIHZhciBwID0gY29kZVswXSwKKyAgICAgICAgcTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGVMZW5ndGhzW2ldOyBqKyspIHsKKyAgICAgICAgcCA9IGNvZGUucG9wKCk7CisgICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSB2YWx1ZXNba107CisKKyAgICAgICAgd2hpbGUgKHAuaW5kZXggPiAwKSB7CisgICAgICAgICAgcCA9IGNvZGUucG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwLmluZGV4Kys7CisgICAgICAgIGNvZGUucHVzaChwKTsKKworICAgICAgICB3aGlsZSAoY29kZS5sZW5ndGggPD0gaSkgeworICAgICAgICAgIGNvZGUucHVzaChxID0geworICAgICAgICAgICAgY2hpbGRyZW46IFtdLAorICAgICAgICAgICAgaW5kZXg6IDAKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKKyAgICAgICAgICBwID0gcTsKKyAgICAgICAgfQorCisgICAgICAgIGsrKzsKKyAgICAgIH0KKworICAgICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7CisgICAgICAgIGNvZGUucHVzaChxID0geworICAgICAgICAgIGNoaWxkcmVuOiBbXSwKKyAgICAgICAgICBpbmRleDogMAorICAgICAgICB9KTsKKyAgICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHEuY2hpbGRyZW47CisgICAgICAgIHAgPSBxOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb2RlWzBdLmNoaWxkcmVuOworICB9CisKKyAgZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkgeworICAgIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlUHJldiwgc3VjY2Vzc2l2ZSkgeworICAgIHZhciBwYXJzZUROTE1hcmtlciA9IGFyZ3VtZW50cy5sZW5ndGggPiA5ICYmIGFyZ3VtZW50c1s5XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzldIDogZmFsc2U7CisgICAgdmFyIG1jdXNQZXJMaW5lID0gZnJhbWUubWN1c1BlckxpbmU7CisgICAgdmFyIHByb2dyZXNzaXZlID0gZnJhbWUucHJvZ3Jlc3NpdmU7CisgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OworICAgIHZhciBiaXRzRGF0YSA9IDAsCisgICAgICAgIGJpdHNDb3VudCA9IDA7CisKKyAgICBmdW5jdGlvbiByZWFkQml0KCkgeworICAgICAgaWYgKGJpdHNDb3VudCA+IDApIHsKKyAgICAgICAgYml0c0NvdW50LS07CisgICAgICAgIHJldHVybiBiaXRzRGF0YSA+PiBiaXRzQ291bnQgJiAxOworICAgICAgfQorCisgICAgICBiaXRzRGF0YSA9IGRhdGFbb2Zmc2V0KytdOworCisgICAgICBpZiAoYml0c0RhdGEgPT09IDB4ZmYpIHsKKyAgICAgICAgdmFyIG5leHRCeXRlID0gZGF0YVtvZmZzZXQrK107CisKKyAgICAgICAgaWYgKG5leHRCeXRlKSB7CisgICAgICAgICAgaWYgKG5leHRCeXRlID09PSAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHZhciBzY2FuTGluZXMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgICAgICBpZiAoc2NhbkxpbmVzID4gMCAmJiBzY2FuTGluZXMgIT09IGZyYW1lLnNjYW5MaW5lcykgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoIkZvdW5kIEROTCBtYXJrZXIgKDB4RkZEQykgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiLCBzY2FuTGluZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAobmV4dEJ5dGUgPT09IDB4ZDkpIHsKKyAgICAgICAgICAgIGlmIChwYXJzZUROTE1hcmtlcikgeworICAgICAgICAgICAgICB2YXIgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7CisKKyAgICAgICAgICAgICAgaWYgKG1heWJlU2NhbkxpbmVzID4gMCAmJiBNYXRoLnJvdW5kKGZyYW1lLnNjYW5MaW5lcyAvIG1heWJlU2NhbkxpbmVzKSA+PSAxMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgIiArICJwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsIG1heWJlU2NhbkxpbmVzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgRU9JTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJ1bmV4cGVjdGVkIG1hcmtlciAiLmNvbmNhdCgoYml0c0RhdGEgPDwgOCB8IG5leHRCeXRlKS50b1N0cmluZygxNikpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBiaXRzQ291bnQgPSA3OworICAgICAgcmV0dXJuIGJpdHNEYXRhID4+PiA3OworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZUh1ZmZtYW4odHJlZSkgeworICAgICAgdmFyIG5vZGUgPSB0cmVlOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBub2RlID0gbm9kZVtyZWFkQml0KCldOworCisgICAgICAgIHN3aXRjaCAoX3R5cGVvZihub2RlKSkgeworICAgICAgICAgIGNhc2UgIm51bWJlciI6CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKworICAgICAgICAgIGNhc2UgIm9iamVjdCI6CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZSIpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHJlY2VpdmUobGVuZ3RoKSB7CisgICAgICB2YXIgbiA9IDA7CisKKyAgICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIG4gPSBuIDw8IDEgfCByZWFkQml0KCk7CisgICAgICAgIGxlbmd0aC0tOworICAgICAgfQorCisgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBmdW5jdGlvbiByZWNlaXZlQW5kRXh0ZW5kKGxlbmd0aCkgeworICAgICAgaWYgKGxlbmd0aCA9PT0gMSkgeworICAgICAgICByZXR1cm4gcmVhZEJpdCgpID09PSAxID8gMSA6IC0xOworICAgICAgfQorCisgICAgICB2YXIgbiA9IHJlY2VpdmUobGVuZ3RoKTsKKworICAgICAgaWYgKG4gPj0gMSA8PCBsZW5ndGggLSAxKSB7CisgICAgICAgIHJldHVybiBuOworICAgICAgfQorCisgICAgICByZXR1cm4gbiArICgtMSA8PCBsZW5ndGgpICsgMTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBkZWNvZGVCYXNlbGluZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICB2YXIgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKKyAgICAgIHZhciBkaWZmID0gdCA9PT0gMCA/IDAgOiByZWNlaXZlQW5kRXh0ZW5kKHQpOworICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmOworICAgICAgdmFyIGsgPSAxOworCisgICAgICB3aGlsZSAoayA8IDY0KSB7CisgICAgICAgIHZhciBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKKyAgICAgICAgdmFyIHMgPSBycyAmIDE1LAorICAgICAgICAgICAgciA9IHJzID4+IDQ7CisKKyAgICAgICAgaWYgKHMgPT09IDApIHsKKyAgICAgICAgICBpZiAociA8IDE1KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBrICs9IDE2OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgayArPSByOworICAgICAgICB2YXIgeiA9IGRjdFppZ1phZ1trXTsKKyAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldCArIHpdID0gcmVjZWl2ZUFuZEV4dGVuZChzKTsKKyAgICAgICAgaysrOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZURDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkgeworICAgICAgdmFyIHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7CisgICAgICB2YXIgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlOworICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZURDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSB8PSByZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZTsKKyAgICB9CisKKyAgICB2YXIgZW9icnVuID0gMDsKKworICAgIGZ1bmN0aW9uIGRlY29kZUFDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkgeworICAgICAgaWYgKGVvYnJ1biA+IDApIHsKKyAgICAgICAgZW9icnVuLS07CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGsgPSBzcGVjdHJhbFN0YXJ0LAorICAgICAgICAgIGUgPSBzcGVjdHJhbEVuZDsKKworICAgICAgd2hpbGUgKGsgPD0gZSkgeworICAgICAgICB2YXIgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CisgICAgICAgIHZhciBzID0gcnMgJiAxNSwKKyAgICAgICAgICAgIHIgPSBycyA+PiA0OworCisgICAgICAgIGlmIChzID09PSAwKSB7CisgICAgICAgICAgaWYgKHIgPCAxNSkgeworICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpIC0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGsgKz0gMTY7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBrICs9IHI7CisgICAgICAgIHZhciB6ID0gZGN0WmlnWmFnW2tdOworICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0ICsgel0gPSByZWNlaXZlQW5kRXh0ZW5kKHMpICogKDEgPDwgc3VjY2Vzc2l2ZSk7CisgICAgICAgIGsrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwLAorICAgICAgICBzdWNjZXNzaXZlQUNOZXh0VmFsdWU7CisKKyAgICBmdW5jdGlvbiBkZWNvZGVBQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgeworICAgICAgdmFyIGsgPSBzcGVjdHJhbFN0YXJ0OworICAgICAgdmFyIGUgPSBzcGVjdHJhbEVuZDsKKyAgICAgIHZhciByID0gMDsKKyAgICAgIHZhciBzOworICAgICAgdmFyIHJzOworCisgICAgICB3aGlsZSAoayA8PSBlKSB7CisgICAgICAgIHZhciBvZmZzZXRaID0gYmxvY2tPZmZzZXQgKyBkY3RaaWdaYWdba107CisgICAgICAgIHZhciBzaWduID0gY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA8IDAgPyAtMSA6IDE7CisKKyAgICAgICAgc3dpdGNoIChzdWNjZXNzaXZlQUNTdGF0ZSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOworICAgICAgICAgICAgcyA9IHJzICYgMTU7CisgICAgICAgICAgICByID0gcnMgPj4gNDsKKworICAgICAgICAgICAgaWYgKHMgPT09IDApIHsKKyAgICAgICAgICAgICAgaWYgKHIgPCAxNSkgeworICAgICAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKTsKKyAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDQ7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgciA9IDE2OworICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHMgIT09IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIEFDbiBlbmNvZGluZyIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTsKKyAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CisgICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByLS07CisKKyAgICAgICAgICAgICAgaWYgKHIgPT09IDApIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSAyID8gMyA6IDA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkgeworICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA9IHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZSA8PCBzdWNjZXNzaXZlOworICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBrKys7CisgICAgICB9CisKKyAgICAgIGlmIChzdWNjZXNzaXZlQUNTdGF0ZSA9PT0gNCkgeworICAgICAgICBlb2JydW4tLTsKKworICAgICAgICBpZiAoZW9icnVuID09PSAwKSB7CisgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGJsb2NrUm93ID0gMDsKKworICAgIGZ1bmN0aW9uIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZSwgbWN1LCByb3csIGNvbCkgeworICAgICAgdmFyIG1jdVJvdyA9IG1jdSAvIG1jdXNQZXJMaW5lIHwgMDsKKyAgICAgIHZhciBtY3VDb2wgPSBtY3UgJSBtY3VzUGVyTGluZTsKKyAgICAgIGJsb2NrUm93ID0gbWN1Um93ICogY29tcG9uZW50LnYgKyByb3c7CisgICAgICB2YXIgYmxvY2tDb2wgPSBtY3VDb2wgKiBjb21wb25lbnQuaCArIGNvbDsKKyAgICAgIHZhciBibG9ja09mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKKyAgICAgIGRlY29kZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBkZWNvZGVCbG9jayhjb21wb25lbnQsIGRlY29kZSwgbWN1KSB7CisgICAgICBibG9ja1JvdyA9IG1jdSAvIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lIHwgMDsKKyAgICAgIHZhciBibG9ja0NvbCA9IG1jdSAlIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOworICAgICAgdmFyIGJsb2NrT2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpOworICAgICAgZGVjb2RlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpOworICAgIH0KKworICAgIHZhciBjb21wb25lbnRzTGVuZ3RoID0gY29tcG9uZW50cy5sZW5ndGg7CisgICAgdmFyIGNvbXBvbmVudCwgaSwgaiwgaywgbjsKKyAgICB2YXIgZGVjb2RlRm47CisKKyAgICBpZiAocHJvZ3Jlc3NpdmUpIHsKKyAgICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7CisgICAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7CisgICAgfQorCisgICAgdmFyIG1jdSA9IDAsCisgICAgICAgIGZpbGVNYXJrZXI7CisgICAgdmFyIG1jdUV4cGVjdGVkOworCisgICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHsKKyAgICAgIG1jdUV4cGVjdGVkID0gY29tcG9uZW50c1swXS5ibG9ja3NQZXJMaW5lICogY29tcG9uZW50c1swXS5ibG9ja3NQZXJDb2x1bW47CisgICAgfSBlbHNlIHsKKyAgICAgIG1jdUV4cGVjdGVkID0gbWN1c1BlckxpbmUgKiBmcmFtZS5tY3VzUGVyQ29sdW1uOworICAgIH0KKworICAgIHZhciBoLCB2OworCisgICAgd2hpbGUgKG1jdSA8PSBtY3VFeHBlY3RlZCkgeworICAgICAgdmFyIG1jdVRvUmVhZCA9IHJlc2V0SW50ZXJ2YWwgPyBNYXRoLm1pbihtY3VFeHBlY3RlZCAtIG1jdSwgcmVzZXRJbnRlcnZhbCkgOiBtY3VFeHBlY3RlZDsKKworICAgICAgaWYgKG1jdVRvUmVhZCA+IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgeworICAgICAgICAgIGNvbXBvbmVudHNbaV0ucHJlZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBlb2JydW4gPSAwOworCisgICAgICAgIGlmIChjb21wb25lbnRzTGVuZ3RoID09PSAxKSB7CisgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1swXTsKKworICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykgeworICAgICAgICAgICAgZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1KTsKKyAgICAgICAgICAgIG1jdSsrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTsKKyAgICAgICAgICAgICAgaCA9IGNvbXBvbmVudC5oOworICAgICAgICAgICAgICB2ID0gY29tcG9uZW50LnY7CisKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHY7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZUZuLCBtY3UsIGosIGspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtY3UrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYml0c0NvdW50ID0gMDsKKyAgICAgIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgb2Zmc2V0KTsKKworICAgICAgaWYgKCFmaWxlTWFya2VyKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZmlsZU1hcmtlci5pbnZhbGlkKSB7CisgICAgICAgIHZhciBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/ICJ1bmV4cGVjdGVkIiA6ICJleGNlc3NpdmUiOworICAgICAgICAoMCwgX3V0aWwud2FybikoImRlY29kZVNjYW4gLSAiLmNvbmNhdChwYXJ0aWFsTXNnLCAiIE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIikuY29uY2F0KGZpbGVNYXJrZXIuaW52YWxpZCkpOworICAgICAgICBvZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKKyAgICAgIH0KKworICAgICAgaWYgKGZpbGVNYXJrZXIubWFya2VyID49IDB4ZmZkMCAmJiBmaWxlTWFya2VyLm1hcmtlciA8PSAweGZmZDcpIHsKKyAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0IC0gc3RhcnRPZmZzZXQ7CisgIH0KKworICBmdW5jdGlvbiBxdWFudGl6ZUFuZEludmVyc2UoY29tcG9uZW50LCBibG9ja0J1ZmZlck9mZnNldCwgcCkgeworICAgIHZhciBxdCA9IGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSwKKyAgICAgICAgYmxvY2tEYXRhID0gY29tcG9uZW50LmJsb2NrRGF0YTsKKyAgICB2YXIgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3OworICAgIHZhciBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDc7CisgICAgdmFyIHQ7CisKKyAgICBpZiAoIXF0KSB7CisgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJtaXNzaW5nIHJlcXVpcmVkIFF1YW50aXphdGlvbiBUYWJsZS4iKTsKKyAgICB9CisKKyAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCA2NDsgcm93ICs9IDgpIHsKKyAgICAgIHAwID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93XTsKKyAgICAgIHAxID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMV07CisgICAgICBwMiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDJdOworICAgICAgcDMgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAzXTsKKyAgICAgIHA0ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNF07CisgICAgICBwNSA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDVdOworICAgICAgcDYgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA2XTsKKyAgICAgIHA3ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgN107CisgICAgICBwMCAqPSBxdFtyb3ddOworCisgICAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkgeworICAgICAgICB0ID0gZGN0U3FydDIgKiBwMCArIDUxMiA+PiAxMDsKKyAgICAgICAgcFtyb3ddID0gdDsKKyAgICAgICAgcFtyb3cgKyAxXSA9IHQ7CisgICAgICAgIHBbcm93ICsgMl0gPSB0OworICAgICAgICBwW3JvdyArIDNdID0gdDsKKyAgICAgICAgcFtyb3cgKyA0XSA9IHQ7CisgICAgICAgIHBbcm93ICsgNV0gPSB0OworICAgICAgICBwW3JvdyArIDZdID0gdDsKKyAgICAgICAgcFtyb3cgKyA3XSA9IHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBwMSAqPSBxdFtyb3cgKyAxXTsKKyAgICAgIHAyICo9IHF0W3JvdyArIDJdOworICAgICAgcDMgKj0gcXRbcm93ICsgM107CisgICAgICBwNCAqPSBxdFtyb3cgKyA0XTsKKyAgICAgIHA1ICo9IHF0W3JvdyArIDVdOworICAgICAgcDYgKj0gcXRbcm93ICsgNl07CisgICAgICBwNyAqPSBxdFtyb3cgKyA3XTsKKyAgICAgIHYwID0gZGN0U3FydDIgKiBwMCArIDEyOCA+PiA4OworICAgICAgdjEgPSBkY3RTcXJ0MiAqIHA0ICsgMTI4ID4+IDg7CisgICAgICB2MiA9IHAyOworICAgICAgdjMgPSBwNjsKKyAgICAgIHY0ID0gZGN0U3FydDFkMiAqIChwMSAtIHA3KSArIDEyOCA+PiA4OworICAgICAgdjcgPSBkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMTI4ID4+IDg7CisgICAgICB2NSA9IHAzIDw8IDQ7CisgICAgICB2NiA9IHA1IDw8IDQ7CisgICAgICB2MCA9IHYwICsgdjEgKyAxID4+IDE7CisgICAgICB2MSA9IHYwIC0gdjE7CisgICAgICB0ID0gdjIgKiBkY3RTaW42ICsgdjMgKiBkY3RDb3M2ICsgMTI4ID4+IDg7CisgICAgICB2MiA9IHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDEyOCA+PiA4OworICAgICAgdjMgPSB0OworICAgICAgdjQgPSB2NCArIHY2ICsgMSA+PiAxOworICAgICAgdjYgPSB2NCAtIHY2OworICAgICAgdjcgPSB2NyArIHY1ICsgMSA+PiAxOworICAgICAgdjUgPSB2NyAtIHY1OworICAgICAgdjAgPSB2MCArIHYzICsgMSA+PiAxOworICAgICAgdjMgPSB2MCAtIHYzOworICAgICAgdjEgPSB2MSArIHYyICsgMSA+PiAxOworICAgICAgdjIgPSB2MSAtIHYyOworICAgICAgdCA9IHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDggPj4gMTI7CisgICAgICB2NCA9IHY0ICogZGN0Q29zMyAtIHY3ICogZGN0U2luMyArIDIwNDggPj4gMTI7CisgICAgICB2NyA9IHQ7CisgICAgICB0ID0gdjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCA+PiAxMjsKKyAgICAgIHY1ID0gdjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCA+PiAxMjsKKyAgICAgIHY2ID0gdDsKKyAgICAgIHBbcm93XSA9IHYwICsgdjc7CisgICAgICBwW3JvdyArIDddID0gdjAgLSB2NzsKKyAgICAgIHBbcm93ICsgMV0gPSB2MSArIHY2OworICAgICAgcFtyb3cgKyA2XSA9IHYxIC0gdjY7CisgICAgICBwW3JvdyArIDJdID0gdjIgKyB2NTsKKyAgICAgIHBbcm93ICsgNV0gPSB2MiAtIHY1OworICAgICAgcFtyb3cgKyAzXSA9IHYzICsgdjQ7CisgICAgICBwW3JvdyArIDRdID0gdjMgLSB2NDsKKyAgICB9CisKKyAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCA4OyArK2NvbCkgeworICAgICAgcDAgPSBwW2NvbF07CisgICAgICBwMSA9IHBbY29sICsgOF07CisgICAgICBwMiA9IHBbY29sICsgMTZdOworICAgICAgcDMgPSBwW2NvbCArIDI0XTsKKyAgICAgIHA0ID0gcFtjb2wgKyAzMl07CisgICAgICBwNSA9IHBbY29sICsgNDBdOworICAgICAgcDYgPSBwW2NvbCArIDQ4XTsKKyAgICAgIHA3ID0gcFtjb2wgKyA1Nl07CisKKyAgICAgIGlmICgocDEgfCBwMiB8IHAzIHwgcDQgfCBwNSB8IHA2IHwgcDcpID09PSAwKSB7CisgICAgICAgIHQgPSBkY3RTcXJ0MiAqIHAwICsgODE5MiA+PiAxNDsKKworICAgICAgICBpZiAodCA8IC0yMDQwKSB7CisgICAgICAgICAgdCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodCA+PSAyMDI0KSB7CisgICAgICAgICAgdCA9IDI1NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0ID0gdCArIDIwNTYgPj4gNDsKKyAgICAgICAgfQorCisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbF0gPSB0OworICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA4XSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDE2XSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDI0XSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDMyXSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQwXSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQ4XSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDU2XSA9IHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2MCA9IGRjdFNxcnQyICogcDAgKyAyMDQ4ID4+IDEyOworICAgICAgdjEgPSBkY3RTcXJ0MiAqIHA0ICsgMjA0OCA+PiAxMjsKKyAgICAgIHYyID0gcDI7CisgICAgICB2MyA9IHA2OworICAgICAgdjQgPSBkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMjA0OCA+PiAxMjsKKyAgICAgIHY3ID0gZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDIwNDggPj4gMTI7CisgICAgICB2NSA9IHAzOworICAgICAgdjYgPSBwNTsKKyAgICAgIHYwID0gKHYwICsgdjEgKyAxID4+IDEpICsgNDExMjsKKyAgICAgIHYxID0gdjAgLSB2MTsKKyAgICAgIHQgPSB2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAyMDQ4ID4+IDEyOworICAgICAgdjIgPSB2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAyMDQ4ID4+IDEyOworICAgICAgdjMgPSB0OworICAgICAgdjQgPSB2NCArIHY2ICsgMSA+PiAxOworICAgICAgdjYgPSB2NCAtIHY2OworICAgICAgdjcgPSB2NyArIHY1ICsgMSA+PiAxOworICAgICAgdjUgPSB2NyAtIHY1OworICAgICAgdjAgPSB2MCArIHYzICsgMSA+PiAxOworICAgICAgdjMgPSB2MCAtIHYzOworICAgICAgdjEgPSB2MSArIHYyICsgMSA+PiAxOworICAgICAgdjIgPSB2MSAtIHYyOworICAgICAgdCA9IHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDggPj4gMTI7CisgICAgICB2NCA9IHY0ICogZGN0Q29zMyAtIHY3ICogZGN0U2luMyArIDIwNDggPj4gMTI7CisgICAgICB2NyA9IHQ7CisgICAgICB0ID0gdjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCA+PiAxMjsKKyAgICAgIHY1ID0gdjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCA+PiAxMjsKKyAgICAgIHY2ID0gdDsKKyAgICAgIHAwID0gdjAgKyB2NzsKKyAgICAgIHA3ID0gdjAgLSB2NzsKKyAgICAgIHAxID0gdjEgKyB2NjsKKyAgICAgIHA2ID0gdjEgLSB2NjsKKyAgICAgIHAyID0gdjIgKyB2NTsKKyAgICAgIHA1ID0gdjIgLSB2NTsKKyAgICAgIHAzID0gdjMgKyB2NDsKKyAgICAgIHA0ID0gdjMgLSB2NDsKKworICAgICAgaWYgKHAwIDwgMTYpIHsKKyAgICAgICAgcDAgPSAwOworICAgICAgfSBlbHNlIGlmIChwMCA+PSA0MDgwKSB7CisgICAgICAgIHAwID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDAgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwMSA8IDE2KSB7CisgICAgICAgIHAxID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDEgPj0gNDA4MCkgeworICAgICAgICBwMSA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHAxID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDIgPCAxNikgeworICAgICAgICBwMiA9IDA7CisgICAgICB9IGVsc2UgaWYgKHAyID49IDQwODApIHsKKyAgICAgICAgcDIgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwMiA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHAzIDwgMTYpIHsKKyAgICAgICAgcDMgPSAwOworICAgICAgfSBlbHNlIGlmIChwMyA+PSA0MDgwKSB7CisgICAgICAgIHAzID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDMgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwNCA8IDE2KSB7CisgICAgICAgIHA0ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDQgPj0gNDA4MCkgeworICAgICAgICBwNCA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHA0ID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDUgPCAxNikgeworICAgICAgICBwNSA9IDA7CisgICAgICB9IGVsc2UgaWYgKHA1ID49IDQwODApIHsKKyAgICAgICAgcDUgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwNSA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHA2IDwgMTYpIHsKKyAgICAgICAgcDYgPSAwOworICAgICAgfSBlbHNlIGlmIChwNiA+PSA0MDgwKSB7CisgICAgICAgIHA2ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDYgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwNyA8IDE2KSB7CisgICAgICAgIHA3ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDcgPj0gNDA4MCkgeworICAgICAgICBwNyA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHA3ID4+PSA0OworICAgICAgfQorCisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gcDA7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA4XSA9IHAxOworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gcDI7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSBwMzsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDMyXSA9IHA0OworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gcDU7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSBwNjsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDU2XSA9IHA3OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50RGF0YShmcmFtZSwgY29tcG9uZW50KSB7CisgICAgdmFyIGJsb2Nrc1BlckxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZTsKKyAgICB2YXIgYmxvY2tzUGVyQ29sdW1uID0gY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbjsKKyAgICB2YXIgY29tcHV0YXRpb25CdWZmZXIgPSBuZXcgSW50MTZBcnJheSg2NCk7CisKKyAgICBmb3IgKHZhciBibG9ja1JvdyA9IDA7IGJsb2NrUm93IDwgYmxvY2tzUGVyQ29sdW1uOyBibG9ja1JvdysrKSB7CisgICAgICBmb3IgKHZhciBibG9ja0NvbCA9IDA7IGJsb2NrQ29sIDwgYmxvY2tzUGVyTGluZTsgYmxvY2tDb2wrKykgeworICAgICAgICB2YXIgb2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpOworICAgICAgICBxdWFudGl6ZUFuZEludmVyc2UoY29tcG9uZW50LCBvZmZzZXQsIGNvbXB1dGF0aW9uQnVmZmVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29tcG9uZW50LmJsb2NrRGF0YTsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBjdXJyZW50UG9zKSB7CisgICAgdmFyIHN0YXJ0UG9zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBjdXJyZW50UG9zOworICAgIHZhciBtYXhQb3MgPSBkYXRhLmxlbmd0aCAtIDE7CisgICAgdmFyIG5ld1BvcyA9IHN0YXJ0UG9zIDwgY3VycmVudFBvcyA/IHN0YXJ0UG9zIDogY3VycmVudFBvczsKKworICAgIGlmIChjdXJyZW50UG9zID49IG1heFBvcykgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdmFyIGN1cnJlbnRNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgY3VycmVudFBvcyk7CisKKyAgICBpZiAoY3VycmVudE1hcmtlciA+PSAweGZmYzAgJiYgY3VycmVudE1hcmtlciA8PSAweGZmZmUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIGludmFsaWQ6IG51bGwsCisgICAgICAgIG1hcmtlcjogY3VycmVudE1hcmtlciwKKyAgICAgICAgb2Zmc2V0OiBjdXJyZW50UG9zCisgICAgICB9OworICAgIH0KKworICAgIHZhciBuZXdNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgbmV3UG9zKTsKKworICAgIHdoaWxlICghKG5ld01hcmtlciA+PSAweGZmYzAgJiYgbmV3TWFya2VyIDw9IDB4ZmZmZSkpIHsKKyAgICAgIGlmICgrK25ld1BvcyA+PSBtYXhQb3MpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIG5ld01hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBuZXdQb3MpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBpbnZhbGlkOiBjdXJyZW50TWFya2VyLnRvU3RyaW5nKDE2KSwKKyAgICAgIG1hcmtlcjogbmV3TWFya2VyLAorICAgICAgb2Zmc2V0OiBuZXdQb3MKKyAgICB9OworICB9CisKKyAgSnBlZ0ltYWdlLnByb3RvdHlwZSA9IHsKKyAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoZGF0YSkgeworICAgICAgdmFyIF9yZWYyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSwKKyAgICAgICAgICBfcmVmMiRkbmxTY2FuTGluZXMgPSBfcmVmMi5kbmxTY2FuTGluZXMsCisgICAgICAgICAgZG5sU2NhbkxpbmVzID0gX3JlZjIkZG5sU2NhbkxpbmVzID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjIkZG5sU2NhbkxpbmVzOworCisgICAgICBmdW5jdGlvbiByZWFkRGF0YUJsb2NrKCkgeworICAgICAgICB2YXIgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICB2YXIgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoIC0gMjsKKyAgICAgICAgdmFyIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgZW5kT2Zmc2V0LCBvZmZzZXQpOworCisgICAgICAgIGlmIChmaWxlTWFya2VyICYmIGZpbGVNYXJrZXIuaW52YWxpZCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicmVhZERhdGFCbG9jayAtIGluY29ycmVjdCBsZW5ndGgsIGN1cnJlbnQgbWFya2VyIGlzOiAiICsgZmlsZU1hcmtlci5pbnZhbGlkKTsKKyAgICAgICAgICBlbmRPZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBhcnJheSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBlbmRPZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoOworICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7CisgICAgICAgIHZhciBtY3VzUGVyTGluZSA9IE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDggLyBmcmFtZS5tYXhIKTsKKyAgICAgICAgdmFyIG1jdXNQZXJDb2x1bW4gPSBNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCAvIGZyYW1lLm1heFYpOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZnJhbWUuY29tcG9uZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbaV07CisgICAgICAgICAgdmFyIGJsb2Nrc1BlckxpbmUgPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNhbXBsZXNQZXJMaW5lIC8gOCkgKiBjb21wb25lbnQuaCAvIGZyYW1lLm1heEgpOworICAgICAgICAgIHZhciBibG9ja3NQZXJDb2x1bW4gPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDgpICogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWKTsKKyAgICAgICAgICB2YXIgYmxvY2tzUGVyTGluZUZvck1jdSA9IG1jdXNQZXJMaW5lICogY29tcG9uZW50Lmg7CisgICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbkZvck1jdSA9IG1jdXNQZXJDb2x1bW4gKiBjb21wb25lbnQudjsKKyAgICAgICAgICB2YXIgYmxvY2tzQnVmZmVyU2l6ZSA9IDY0ICogYmxvY2tzUGVyQ29sdW1uRm9yTWN1ICogKGJsb2Nrc1BlckxpbmVGb3JNY3UgKyAxKTsKKyAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhID0gbmV3IEludDE2QXJyYXkoYmxvY2tzQnVmZmVyU2l6ZSk7CisgICAgICAgICAgY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgPSBibG9ja3NQZXJMaW5lOworICAgICAgICAgIGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4gPSBibG9ja3NQZXJDb2x1bW47CisgICAgICAgIH0KKworICAgICAgICBmcmFtZS5tY3VzUGVyTGluZSA9IG1jdXNQZXJMaW5lOworICAgICAgICBmcmFtZS5tY3VzUGVyQ29sdW1uID0gbWN1c1BlckNvbHVtbjsKKyAgICAgIH0KKworICAgICAgdmFyIG9mZnNldCA9IDA7CisgICAgICB2YXIgamZpZiA9IG51bGw7CisgICAgICB2YXIgYWRvYmUgPSBudWxsOworICAgICAgdmFyIGZyYW1lLCByZXNldEludGVydmFsOworICAgICAgdmFyIG51bVNPU01hcmtlcnMgPSAwOworICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlcyA9IFtdOworICAgICAgdmFyIGh1ZmZtYW5UYWJsZXNBQyA9IFtdLAorICAgICAgICAgIGh1ZmZtYW5UYWJsZXNEQyA9IFtdOworICAgICAgdmFyIGZpbGVNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCArPSAyOworCisgICAgICBpZiAoZmlsZU1hcmtlciAhPT0gMHhmZmQ4KSB7CisgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTsKKyAgICAgIH0KKworICAgICAgZmlsZU1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAweGZmZDkpIHsKKyAgICAgICAgdmFyIGksIGosIGw7CisKKyAgICAgICAgc3dpdGNoIChmaWxlTWFya2VyKSB7CisgICAgICAgICAgY2FzZSAweGZmZTA6CisgICAgICAgICAgY2FzZSAweGZmZTE6CisgICAgICAgICAgY2FzZSAweGZmZTI6CisgICAgICAgICAgY2FzZSAweGZmZTM6CisgICAgICAgICAgY2FzZSAweGZmZTQ6CisgICAgICAgICAgY2FzZSAweGZmZTU6CisgICAgICAgICAgY2FzZSAweGZmZTY6CisgICAgICAgICAgY2FzZSAweGZmZTc6CisgICAgICAgICAgY2FzZSAweGZmZTg6CisgICAgICAgICAgY2FzZSAweGZmZTk6CisgICAgICAgICAgY2FzZSAweGZmZWE6CisgICAgICAgICAgY2FzZSAweGZmZWI6CisgICAgICAgICAgY2FzZSAweGZmZWM6CisgICAgICAgICAgY2FzZSAweGZmZWQ6CisgICAgICAgICAgY2FzZSAweGZmZWU6CisgICAgICAgICAgY2FzZSAweGZmZWY6CisgICAgICAgICAgY2FzZSAweGZmZmU6CisgICAgICAgICAgICB2YXIgYXBwRGF0YSA9IHJlYWREYXRhQmxvY2soKTsKKworICAgICAgICAgICAgaWYgKGZpbGVNYXJrZXIgPT09IDB4ZmZlMCkgeworICAgICAgICAgICAgICBpZiAoYXBwRGF0YVswXSA9PT0gMHg0YSAmJiBhcHBEYXRhWzFdID09PSAweDQ2ICYmIGFwcERhdGFbMl0gPT09IDB4NDkgJiYgYXBwRGF0YVszXSA9PT0gMHg0NiAmJiBhcHBEYXRhWzRdID09PSAwKSB7CisgICAgICAgICAgICAgICAgamZpZiA9IHsKKyAgICAgICAgICAgICAgICAgIHZlcnNpb246IHsKKyAgICAgICAgICAgICAgICAgICAgbWFqb3I6IGFwcERhdGFbNV0sCisgICAgICAgICAgICAgICAgICAgIG1pbm9yOiBhcHBEYXRhWzZdCisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgZGVuc2l0eVVuaXRzOiBhcHBEYXRhWzddLAorICAgICAgICAgICAgICAgICAgeERlbnNpdHk6IGFwcERhdGFbOF0gPDwgOCB8IGFwcERhdGFbOV0sCisgICAgICAgICAgICAgICAgICB5RGVuc2l0eTogYXBwRGF0YVsxMF0gPDwgOCB8IGFwcERhdGFbMTFdLAorICAgICAgICAgICAgICAgICAgdGh1bWJXaWR0aDogYXBwRGF0YVsxMl0sCisgICAgICAgICAgICAgICAgICB0aHVtYkhlaWdodDogYXBwRGF0YVsxM10sCisgICAgICAgICAgICAgICAgICB0aHVtYkRhdGE6IGFwcERhdGEuc3ViYXJyYXkoMTQsIDE0ICsgMyAqIGFwcERhdGFbMTJdICogYXBwRGF0YVsxM10pCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmVlKSB7CisgICAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDQxICYmIGFwcERhdGFbMV0gPT09IDB4NjQgJiYgYXBwRGF0YVsyXSA9PT0gMHg2ZiAmJiBhcHBEYXRhWzNdID09PSAweDYyICYmIGFwcERhdGFbNF0gPT09IDB4NjUpIHsKKyAgICAgICAgICAgICAgICBhZG9iZSA9IHsKKyAgICAgICAgICAgICAgICAgIHZlcnNpb246IGFwcERhdGFbNV0gPDwgOCB8IGFwcERhdGFbNl0sCisgICAgICAgICAgICAgICAgICBmbGFnczA6IGFwcERhdGFbN10gPDwgOCB8IGFwcERhdGFbOF0sCisgICAgICAgICAgICAgICAgICBmbGFnczE6IGFwcERhdGFbOV0gPDwgOCB8IGFwcERhdGFbMTBdLAorICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtQ29kZTogYXBwRGF0YVsxMV0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZGI6CisgICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXNFbmQgPSBxdWFudGl6YXRpb25UYWJsZXNMZW5ndGggKyBvZmZzZXQgLSAyOworICAgICAgICAgICAgdmFyIHo7CisKKyAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBxdWFudGl6YXRpb25UYWJsZXNFbmQpIHsKKyAgICAgICAgICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICB2YXIgdGFibGVEYXRhID0gbmV3IFVpbnQxNkFycmF5KDY0KTsKKworICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTsKKyAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisgICAgICAgICAgICAgICAgICB6ID0gZGN0WmlnWmFnW2pdOworICAgICAgICAgICAgICAgICAgdGFibGVEYXRhW3pdID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiRFFUIC0gaW52YWxpZCB0YWJsZSBzcGVjIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmMwOgorICAgICAgICAgIGNhc2UgMHhmZmMxOgorICAgICAgICAgIGNhc2UgMHhmZmMyOgorICAgICAgICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIk9ubHkgc2luZ2xlIGZyYW1lIEpQRUdzIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGZyYW1lID0ge307CisgICAgICAgICAgICBmcmFtZS5leHRlbmRlZCA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMTsKKyAgICAgICAgICAgIGZyYW1lLnByb2dyZXNzaXZlID0gZmlsZU1hcmtlciA9PT0gMHhmZmMyOworICAgICAgICAgICAgZnJhbWUucHJlY2lzaW9uID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICB2YXIgc29mU2NhbkxpbmVzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGZyYW1lLnNjYW5MaW5lcyA9IGRubFNjYW5MaW5lcyB8fCBzb2ZTY2FuTGluZXM7CisgICAgICAgICAgICBmcmFtZS5zYW1wbGVzUGVyTGluZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICBmcmFtZS5jb21wb25lbnRzID0gW107CisgICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHMgPSB7fTsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBkYXRhW29mZnNldCsrXSwKKyAgICAgICAgICAgICAgICBjb21wb25lbnRJZDsKKyAgICAgICAgICAgIHZhciBtYXhIID0gMCwKKyAgICAgICAgICAgICAgICBtYXhWID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGNvbXBvbmVudElkID0gZGF0YVtvZmZzZXRdOworICAgICAgICAgICAgICB2YXIgaCA9IGRhdGFbb2Zmc2V0ICsgMV0gPj4gNDsKKyAgICAgICAgICAgICAgdmFyIHYgPSBkYXRhW29mZnNldCArIDFdICYgMTU7CisKKyAgICAgICAgICAgICAgaWYgKG1heEggPCBoKSB7CisgICAgICAgICAgICAgICAgbWF4SCA9IGg7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAobWF4ViA8IHYpIHsKKyAgICAgICAgICAgICAgICBtYXhWID0gdjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBxSWQgPSBkYXRhW29mZnNldCArIDJdOworICAgICAgICAgICAgICBsID0gZnJhbWUuY29tcG9uZW50cy5wdXNoKHsKKyAgICAgICAgICAgICAgICBoOiBoLAorICAgICAgICAgICAgICAgIHY6IHYsCisgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uSWQ6IHFJZCwKKyAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZTogbnVsbAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgZnJhbWUuY29tcG9uZW50SWRzW2NvbXBvbmVudElkXSA9IGwgLSAxOworICAgICAgICAgICAgICBvZmZzZXQgKz0gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnJhbWUubWF4SCA9IG1heEg7CisgICAgICAgICAgICBmcmFtZS5tYXhWID0gbWF4VjsKKyAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmYzQ6CisgICAgICAgICAgICB2YXIgaHVmZm1hbkxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPCBodWZmbWFuTGVuZ3RoOykgeworICAgICAgICAgICAgICB2YXIgaHVmZm1hblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICB2YXIgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgICAgICAgICAgIHZhciBjb2RlTGVuZ3RoU3VtID0gMDsKKworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKywgb2Zmc2V0KyspIHsKKyAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoU3VtICs9IGNvZGVMZW5ndGhzW2pdID0gZGF0YVtvZmZzZXRdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIGh1ZmZtYW5WYWx1ZXMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuZ3RoU3VtKTsKKworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aFN1bTsgaisrLCBvZmZzZXQrKykgeworICAgICAgICAgICAgICAgIGh1ZmZtYW5WYWx1ZXNbal0gPSBkYXRhW29mZnNldF07CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTsKKyAgICAgICAgICAgICAgKGh1ZmZtYW5UYWJsZVNwZWMgPj4gNCA9PT0gMCA/IGh1ZmZtYW5UYWJsZXNEQyA6IGh1ZmZtYW5UYWJsZXNBQylbaHVmZm1hblRhYmxlU3BlYyAmIDE1XSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZkZDoKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgcmVzZXRJbnRlcnZhbCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmRhOgorICAgICAgICAgICAgdmFyIHBhcnNlRE5MTWFya2VyID0gKytudW1TT1NNYXJrZXJzID09PSAxICYmICFkbmxTY2FuTGluZXM7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHZhciBzZWxlY3RvcnNDb3VudCA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXSwKKyAgICAgICAgICAgICAgICBjb21wb25lbnQ7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIHZhciBpbmRleCA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICB2YXIgY29tcG9uZW50SW5kZXggPSBmcmFtZS5jb21wb25lbnRJZHNbaW5kZXhdOworICAgICAgICAgICAgICBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2NvbXBvbmVudEluZGV4XTsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgIHZhciB0YWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDID0gaHVmZm1hblRhYmxlc0RDW3RhYmxlU3BlYyA+PiA0XTsKKyAgICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDID0gaHVmZm1hblRhYmxlc0FDW3RhYmxlU3BlYyAmIDE1XTsKKyAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzcGVjdHJhbFN0YXJ0ID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICB2YXIgc3BlY3RyYWxFbmQgPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgIHZhciBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA9IGRhdGFbb2Zmc2V0KytdOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkID0gZGVjb2RlU2NhbihkYXRhLCBvZmZzZXQsIGZyYW1lLCBjb21wb25lbnRzLCByZXNldEludGVydmFsLCBzcGVjdHJhbFN0YXJ0LCBzcGVjdHJhbEVuZCwgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPj4gNCwgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gJiAxNSwgcGFyc2VETkxNYXJrZXIpOworICAgICAgICAgICAgICBvZmZzZXQgKz0gcHJvY2Vzc2VkOworICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRE5MTWFya2VyRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIiIuY29uY2F0KGV4Lm1lc3NhZ2UsICIgLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoZGF0YSwgeworICAgICAgICAgICAgICAgICAgZG5sU2NhbkxpbmVzOiBleC5zY2FuTGluZXMKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIEVPSU1hcmtlckVycm9yKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCIiLmNvbmNhdChleC5tZXNzYWdlLCAiIC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLiIpKTsKKyAgICAgICAgICAgICAgICBicmVhayBtYXJrZXJMb29wOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZGM6CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZmY6CisgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CisgICAgICAgICAgICAgIG9mZnNldC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2YXIgbmV4dEZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgb2Zmc2V0IC0gMiwgb2Zmc2V0IC0gMyk7CisKKyAgICAgICAgICAgIGlmIChuZXh0RmlsZU1hcmtlciAmJiBuZXh0RmlsZU1hcmtlci5pbnZhbGlkKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gdW5leHBlY3RlZCBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIiArIG5leHRGaWxlTWFya2VyLmludmFsaWQpOworICAgICAgICAgICAgICBvZmZzZXQgPSBuZXh0RmlsZU1hcmtlci5vZmZzZXQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGRhdGEubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkpwZWdJbWFnZS5wYXJzZSAtIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UgZGF0YSAiICsgIndpdGhvdXQgZmluZGluZyBhbiBFT0kgbWFya2VyICgweEZGRDkpLiIpOworICAgICAgICAgICAgICBicmVhayBtYXJrZXJMb29wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmtub3duIG1hcmtlcjogIiArIGZpbGVNYXJrZXIudG9TdHJpbmcoMTYpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbGVNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICB9CisKKyAgICAgIHRoaXMud2lkdGggPSBmcmFtZS5zYW1wbGVzUGVyTGluZTsKKyAgICAgIHRoaXMuaGVpZ2h0ID0gZnJhbWUuc2NhbkxpbmVzOworICAgICAgdGhpcy5qZmlmID0gamZpZjsKKyAgICAgIHRoaXMuYWRvYmUgPSBhZG9iZTsKKyAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUuY29tcG9uZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2ldOworICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGUgPSBxdWFudGl6YXRpb25UYWJsZXNbY29tcG9uZW50LnF1YW50aXphdGlvbklkXTsKKworICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGUpIHsKKyAgICAgICAgICBjb21wb25lbnQucXVhbnRpemF0aW9uVGFibGUgPSBxdWFudGl6YXRpb25UYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHsKKyAgICAgICAgICBpbmRleDogY29tcG9uZW50LmluZGV4LAorICAgICAgICAgIG91dHB1dDogYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpLAorICAgICAgICAgIHNjYWxlWDogY29tcG9uZW50LmggLyBmcmFtZS5tYXhILAorICAgICAgICAgIHNjYWxlWTogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWLAorICAgICAgICAgIGJsb2Nrc1BlckxpbmU6IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lLAorICAgICAgICAgIGJsb2Nrc1BlckNvbHVtbjogY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbgorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5udW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfSwKKyAgICBfZ2V0TGluZWFyaXplZEJsb2NrRGF0YTogZnVuY3Rpb24gX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCkgeworICAgICAgdmFyIGlzU291cmNlUERGID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTsKKyAgICAgIHZhciBzY2FsZVggPSB0aGlzLndpZHRoIC8gd2lkdGgsCisgICAgICAgICAgc2NhbGVZID0gdGhpcy5oZWlnaHQgLyBoZWlnaHQ7CisgICAgICB2YXIgY29tcG9uZW50LCBjb21wb25lbnRTY2FsZVgsIGNvbXBvbmVudFNjYWxlWSwgYmxvY2tzUGVyU2NhbmxpbmU7CisgICAgICB2YXIgeCwgeSwgaSwgaiwgazsKKyAgICAgIHZhciBpbmRleDsKKyAgICAgIHZhciBvZmZzZXQgPSAwOworICAgICAgdmFyIG91dHB1dDsKKyAgICAgIHZhciBudW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDsKKyAgICAgIHZhciBkYXRhTGVuZ3RoID0gd2lkdGggKiBoZWlnaHQgKiBudW1Db21wb25lbnRzOworICAgICAgdmFyIGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YUxlbmd0aCk7CisgICAgICB2YXIgeFNjYWxlQmxvY2tPZmZzZXQgPSBuZXcgVWludDMyQXJyYXkod2lkdGgpOworICAgICAgdmFyIG1hc2szTFNCID0gMHhmZmZmZmZmODsKKyAgICAgIHZhciBsYXN0Q29tcG9uZW50U2NhbGVYOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7CisgICAgICAgIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpXTsKKyAgICAgICAgY29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50LnNjYWxlWCAqIHNjYWxlWDsKKyAgICAgICAgY29tcG9uZW50U2NhbGVZID0gY29tcG9uZW50LnNjYWxlWSAqIHNjYWxlWTsKKyAgICAgICAgb2Zmc2V0ID0gaTsKKyAgICAgICAgb3V0cHV0ID0gY29tcG9uZW50Lm91dHB1dDsKKyAgICAgICAgYmxvY2tzUGVyU2NhbmxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZSArIDEgPDwgMzsKKworICAgICAgICBpZiAoY29tcG9uZW50U2NhbGVYICE9PSBsYXN0Q29tcG9uZW50U2NhbGVYKSB7CisgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGogPSAwIHwgeCAqIGNvbXBvbmVudFNjYWxlWDsKKyAgICAgICAgICAgIHhTY2FsZUJsb2NrT2Zmc2V0W3hdID0gKGogJiBtYXNrM0xTQikgPDwgMyB8IGogJiA3OworICAgICAgICAgIH0KKworICAgICAgICAgIGxhc3RDb21wb25lbnRTY2FsZVggPSBjb21wb25lbnRTY2FsZVg7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICBqID0gMCB8IHkgKiBjb21wb25lbnRTY2FsZVk7CisgICAgICAgICAgaW5kZXggPSBibG9ja3NQZXJTY2FubGluZSAqIChqICYgbWFzazNMU0IpIHwgKGogJiA3KSA8PCAzOworCisgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9IG91dHB1dFtpbmRleCArIHhTY2FsZUJsb2NrT2Zmc2V0W3hdXTsKKyAgICAgICAgICAgIG9mZnNldCArPSBudW1Db21wb25lbnRzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5fZGVjb2RlVHJhbnNmb3JtOworCisgICAgICBpZiAoIWlzU291cmNlUERGICYmIG51bUNvbXBvbmVudHMgPT09IDQgJiYgIXRyYW5zZm9ybSkgeworICAgICAgICB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShbLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1XSk7CisgICAgICB9CisKKyAgICAgIGlmICh0cmFuc2Zvcm0pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7KSB7CisgICAgICAgICAgZm9yIChqID0gMCwgayA9IDA7IGogPCBudW1Db21wb25lbnRzOyBqKyssIGkrKywgayArPSAyKSB7CisgICAgICAgICAgICBkYXRhW2ldID0gKGRhdGFbaV0gKiB0cmFuc2Zvcm1ba10gPj4gOCkgKyB0cmFuc2Zvcm1bayArIDFdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YTsKKyAgICB9LAorCisgICAgZ2V0IF9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCgpIHsKKyAgICAgIGlmICh0aGlzLmFkb2JlKSB7CisgICAgICAgIHJldHVybiAhIXRoaXMuYWRvYmUudHJhbnNmb3JtQ29kZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMykgeworICAgICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDApIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRzWzBdLmluZGV4ID09PSAweDUyICYmIHRoaXMuY29tcG9uZW50c1sxXS5pbmRleCA9PT0gMHg0NyAmJiB0aGlzLmNvbXBvbmVudHNbMl0uaW5kZXggPT09IDB4NDIpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2NvbG9yVHJhbnNmb3JtID09PSAxKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIF9jb252ZXJ0WWNjVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRZY2NUb1JnYihkYXRhKSB7CisgICAgICB2YXIgWSwgQ2IsIENyOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gMykgeworICAgICAgICBZID0gZGF0YVtpXTsKKyAgICAgICAgQ2IgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgQ3IgPSBkYXRhW2kgKyAyXTsKKyAgICAgICAgZGF0YVtpXSA9IFkgLSAxNzkuNDU2ICsgMS40MDIgKiBDcjsKKyAgICAgICAgZGF0YVtpICsgMV0gPSBZICsgMTM1LjQ1OSAtIDAuMzQ0ICogQ2IgLSAwLjcxNCAqIENyOworICAgICAgICBkYXRhW2kgKyAyXSA9IFkgLSAyMjYuODE2ICsgMS43NzIgKiBDYjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfSwKKyAgICBfY29udmVydFljY2tUb1JnYjogZnVuY3Rpb24gY29udmVydFljY2tUb1JnYihkYXRhKSB7CisgICAgICB2YXIgWSwgQ2IsIENyLCBrOworICAgICAgdmFyIG9mZnNldCA9IDA7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CisgICAgICAgIFkgPSBkYXRhW2ldOworICAgICAgICBDYiA9IGRhdGFbaSArIDFdOworICAgICAgICBDciA9IGRhdGFbaSArIDJdOworICAgICAgICBrID0gZGF0YVtpICsgM107CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gLTEyMi42NzE5NTQwNjg5NCArIENiICogKC02LjYwNjM1NjY5NDIwMzY0ZS01ICogQ2IgKyAwLjAwMDQzNzEzMDQ3NTkyNjIzMiAqIENyIC0gNS40MDgwNjEwMDY0NTk5ZS01ICogWSArIDAuMDAwNDg0NDk3OTcxMjAyODEgKiBrIC0gMC4xNTQzNjIxNTE4NzExMjYpICsgQ3IgKiAoLTAuMDAwOTU3OTY0Mzc4NDQ1NzczICogQ3IgKyAwLjAwMDgxNzA3NjkxMTM0NjYyNSAqIFkgLSAwLjAwNDc3MjcxNDA1NDA4NzQ3ICogayArIDEuNTMzODAyNTMyMjE3MzQpICsgWSAqICgwLjAwMDk2MTI1MDE4NDEzMDY4OCAqIFkgLSAwLjAwMjY2MjU3MzMyMjgzOTMzICogayArIDAuNDgzNTcwODg0NTEyNjUpICsgayAqICgtMC4wMDAzMzYxOTcxNzc2MTgzOTQgKiBrICsgMC40ODQ3OTE1NjE0OTA3NzYpOworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDEwNy4yNjgwMzkzOTc3MjQgKyBDYiAqICgyLjE5OTI3MTA0NTI1NzQxZS01ICogQ2IgLSAwLjAwMDY0MDk5MjAxODI5Nzk0NSAqIENyICsgMC4wMDA2NTkzOTcwMDEyNDU1NzcgKiBZICsgMC4wMDA0MjYxMDU2NTI5Mzg4MzcgKiBrIC0gMC4xNzY0OTE3OTI0NjI4NzUpICsgQ3IgKiAoLTAuMDAwNzc4MjY5OTQxNTEzNjgzICogQ3IgKyAwLjAwMTMwODcyMjYxNDA4Mjc1ICogWSArIDAuMDAwNzcwNDgyNjMxODAxMTMyICogayAtIDAuMTUxMDUxNDkyNzc1NTYyKSArIFkgKiAoMC4wMDEyNjkzNTM2ODExNDg0MyAqIFkgLSAwLjAwMjY1MDkwMTg5MDEwODk4ICogayArIDAuMjU4MDI5MTAyMDY4NDUpICsgayAqICgtMC4wMDAzMTg5MTMxMTc1ODgzMjggKiBrIC0gMC4yMTM3NDI0MDAzMjM2NjUpOworICAgICAgICBkYXRhW29mZnNldCsrXSA9IC0yMC44MTAwMTI1NDY5NDcgKyBDYiAqICgtMC4wMDA1NzAxMTUxOTY5NzM2NzcgKiBDYiAtIDIuNjM0MDkwNTEwMDQ1ODllLTUgKiBDciArIDAuMDAyMDc0MTA4ODExNTAxMiAqIFkgLSAwLjAwMjg4MjYwMjM2ODUzNDQyICogayArIDAuODE0MjcyOTY4MzU5Mjk1KSArIENyICogKC0xLjUzNDk2MDU3NDQwOTc1ZS01ICogQ3IgLSAwLjAwMDEzMjY4OTA0Mzk2MTQ0NiAqIFkgKyAwLjAwMDU2MDgzMzY5MTI0MjgxMiAqIGsgLSAwLjE5NTE1MjAyNzUzNDA0OSkgKyBZICogKDAuMDAxNzQ0MTgxMzI5Mjc1ODIgKiBZIC0gMC4wMDI1NTI0MzMyMTQzOTM0NyAqIGsgKyAwLjExNjkzNTAyMDQ2NTE0NSkgKyBrICogKC0wLjAwMDM0MzUzMTk5NjUxMDU1NSAqIGsgKyAwLjI0MTY1MjYwMjMyNDA3KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgb2Zmc2V0KTsKKyAgICB9LAorICAgIF9jb252ZXJ0WWNja1RvQ215azogZnVuY3Rpb24gY29udmVydFljY2tUb0NteWsoZGF0YSkgeworICAgICAgdmFyIFksIENiLCBDcjsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgICAgWSA9IGRhdGFbaV07CisgICAgICAgIENiID0gZGF0YVtpICsgMV07CisgICAgICAgIENyID0gZGF0YVtpICsgMl07CisgICAgICAgIGRhdGFbaV0gPSA0MzQuNDU2IC0gWSAtIDEuNDAyICogQ3I7CisgICAgICAgIGRhdGFbaSArIDFdID0gMTE5LjU0MSAtIFkgKyAwLjM0NCAqIENiICsgMC43MTQgKiBDcjsKKyAgICAgICAgZGF0YVtpICsgMl0gPSA0ODEuODE2IC0gWSAtIDEuNzcyICogQ2I7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisgICAgX2NvbnZlcnRDbXlrVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRDbXlrVG9SZ2IoZGF0YSkgeworICAgICAgdmFyIGMsIG0sIHksIGs7CisgICAgICB2YXIgb2Zmc2V0ID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgICAgYyA9IGRhdGFbaV07CisgICAgICAgIG0gPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgeSA9IGRhdGFbaSArIDJdOworICAgICAgICBrID0gZGF0YVtpICsgM107CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMjU1ICsgYyAqICgtMC4wMDAwNjc0NzE0NzA3MzYwMjQ0MSAqIGMgKyAwLjAwMDgzNzkyNjIxMjEwMTM3MjcgKiBtICsgMC4wMDAyODk0NzE4MTg4NjQzMjk0ICogeSArIDAuMDAzMjY0MjMxMDU3NTM3ODA2ICogayAtIDEuMTE4NTYxMTg2NzIwMzkzNykgKyBtICogKDAuMDAwMDI2Mzc0MTA3NjE2MDg5NDA1ICogbSAtIDAuMDAwMDg2MjY5NDkxNTg2Mzg1NzIgKiB5IC0gMC4wMDAyNzQ4NzY5MDY3NDk5NDkxICogayAtIDAuMDIxNTU2ODg3OTQ5Nzg5NjcpICsgeSAqICgtMC4wMDAwMzg3ODA5OTIxMjg2OTM2MyAqIHkgLSAwLjAwMDMyNjc4MDgyNzk0ODUyODYgKiBrICsgMC4wNjg2NzQyMjM4NTk1MzQ1KSAtIGsgKiAoMC4wMDAzMzYxOTcxNzc2MTgzOTM3ICogayArIDAuNzQzMDY1OTE1MTM0MjI1NCk7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMjU1ICsgYyAqICgwLjAwMDEzNTk2MzcyODEzNTg4ODQ4ICogYyArIDAuMDAwOTI0NTM3MTMyNTczNTg1ICogbSArIDAuMDAwMTA1NjczNTk2MTg2ODM1OTMgKiB5ICsgMC4wMDA0NzkxODY0Njg3NDM2NTEyICogayAtIDAuMzEwOTY4OTU4NzUxNTg3NSkgKyBtICogKC0wLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0ICogbSArIDAuMDAwMjcwMjg0NTI1MzUzNDcxNCAqIHkgKyAwLjAwMjAyMDAzMDg5NzczMDcxNTYgKiBrIC0gMC43NDg4MDUyMTY3MDE1NDk0KSArIHkgKiAoMC4wMDAwNjgzNDgxNTk5ODIzNTY2MiAqIHkgKyAwLjAwMDE1MTY4NDUyMzYzNDYwOTczICogayAtIDAuMDk3NTE5Mjc3NzQ3Mjg5MzMpIC0gayAqICgwLjAwMDMxODkxMzExNzU4ODMyODE0ICogayArIDAuNzM2NDg4MzgwNzczMzE2OCk7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMjU1ICsgYyAqICgwLjAwMDAxMzU5ODY1MDQxMTM4NTMwNyAqIGMgKyAwLjAwMDEyNDIzOTU2MTc1NDkwODUxICogbSArIDAuMDAwNDc1MTk4NTA5NzU4MzU4OSAqIHkgLSAwLjAwMDAwMzY3MjkzMTc0NzY2MzA0MjIgKiBrIC0gMC4wNTU2MjE4Njk4MDI2NDAzNCkgKyBtICogKDAuMDAwMTYxNDEzODA1OTg3MjQ2NzYgKiBtICsgMC4wMDA5NjkyMjM5MTMwNzI1MTg2ICogeSArIDAuMDAwNzc4MjY5MjQ1MDAzNjI1MyAqIGsgLSAwLjQ0MDE1MjMyMzY3NTI2NDYzKSArIHkgKiAoNS4wNjg4ODI5MTQwNjg3NjllLTcgKiB5ICsgMC4wMDE3Nzc4MzY5MDExMzc1MDcxICogayAtIDAuNzU5MTQ1NDY0OTc0OTYwOSkgLSBrICogKDAuMDAwMzQzNTMxOTk2NTEwNTU1MyAqIGsgKyAwLjcwNjM3NzAxODYxNjAxNDQpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YS5zdWJhcnJheSgwLCBvZmZzZXQpOworICAgIH0sCisgICAgZ2V0RGF0YTogZnVuY3Rpb24gZ2V0RGF0YShfcmVmMykgeworICAgICAgdmFyIHdpZHRoID0gX3JlZjMud2lkdGgsCisgICAgICAgICAgaGVpZ2h0ID0gX3JlZjMuaGVpZ2h0LAorICAgICAgICAgIF9yZWYzJGZvcmNlUkdCID0gX3JlZjMuZm9yY2VSR0IsCisgICAgICAgICAgZm9yY2VSR0IgPSBfcmVmMyRmb3JjZVJHQiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRmb3JjZVJHQiwKKyAgICAgICAgICBfcmVmMyRpc1NvdXJjZVBERiA9IF9yZWYzLmlzU291cmNlUERGLAorICAgICAgICAgIGlzU291cmNlUERGID0gX3JlZjMkaXNTb3VyY2VQREYgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjMkaXNTb3VyY2VQREY7CisKKyAgICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPiA0KSB7CisgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTsKKworICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMSAmJiBmb3JjZVJHQikgeworICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgICAgICB2YXIgcmdiRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoICogMyk7CisgICAgICAgIHZhciBvZmZzZXQgPSAwOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgdmFyIGdyYXlDb2xvciA9IGRhdGFbaV07CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmdiRGF0YTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzICYmIHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2IoZGF0YSk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gNCkgeworICAgICAgICBpZiAodGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKKyAgICAgICAgICBpZiAoZm9yY2VSR0IpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvUmdiKGRhdGEpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JjZVJHQikgeworICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIEpwZWdJbWFnZTsKK30oKTsKKworZXhwb3J0cy5KcGVnSW1hZ2UgPSBKcGVnSW1hZ2U7CisKKy8qKiovIH0pLAorLyogMjE3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSnB4U3RyZWFtID0gdm9pZCAwOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA5KTsKKwordmFyIF9qcHggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxOCk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBKcHhTdHJlYW0gPSBmdW5jdGlvbiBKcHhTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBKcHhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZGljdCwgcGFyYW1zKSB7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5tYXliZUxlbmd0aCA9IG1heWJlTGVuZ3RoOworICAgIHRoaXMuZGljdCA9IGRpY3Q7CisgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisKKyAgICBfc3RyZWFtLkRlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIEpweFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKF9zdHJlYW0uRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKcHhTdHJlYW0ucHJvdG90eXBlLCAiYnl0ZXMiLCB7CisgICAgZ2V0OiBmdW5jdGlvbiBKcHhTdHJlYW1fYnl0ZXMoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImJ5dGVzIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpOworICAgIH0sCisgICAgY29uZmlndXJhYmxlOiB0cnVlCisgIH0pOworCisgIEpweFN0cmVhbS5wcm90b3R5cGUuZW5zdXJlQnVmZmVyID0gZnVuY3Rpb24gKHJlcXVlc3RlZCkge307CisKKyAgSnB4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGpweEltYWdlID0gbmV3IF9qcHguSnB4SW1hZ2UoKTsKKyAgICBqcHhJbWFnZS5wYXJzZSh0aGlzLmJ5dGVzKTsKKyAgICB2YXIgd2lkdGggPSBqcHhJbWFnZS53aWR0aDsKKyAgICB2YXIgaGVpZ2h0ID0ganB4SW1hZ2UuaGVpZ2h0OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBqcHhJbWFnZS5jb21wb25lbnRzQ291bnQ7CisgICAgdmFyIHRpbGVDb3VudCA9IGpweEltYWdlLnRpbGVzLmxlbmd0aDsKKworICAgIGlmICh0aWxlQ291bnQgPT09IDEpIHsKKyAgICAgIHRoaXMuYnVmZmVyID0ganB4SW1hZ2UudGlsZXNbMF0uaXRlbXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogY29tcG9uZW50c0NvdW50KTsKKworICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aWxlQ291bnQ7IGsrKykgeworICAgICAgICB2YXIgdGlsZUNvbXBvbmVudHMgPSBqcHhJbWFnZS50aWxlc1trXTsKKyAgICAgICAgdmFyIHRpbGVXaWR0aCA9IHRpbGVDb21wb25lbnRzLndpZHRoOworICAgICAgICB2YXIgdGlsZUhlaWdodCA9IHRpbGVDb21wb25lbnRzLmhlaWdodDsKKyAgICAgICAgdmFyIHRpbGVMZWZ0ID0gdGlsZUNvbXBvbmVudHMubGVmdDsKKyAgICAgICAgdmFyIHRpbGVUb3AgPSB0aWxlQ29tcG9uZW50cy50b3A7CisgICAgICAgIHZhciBzcmMgPSB0aWxlQ29tcG9uZW50cy5pdGVtczsKKyAgICAgICAgdmFyIHNyY1Bvc2l0aW9uID0gMDsKKyAgICAgICAgdmFyIGRhdGFQb3NpdGlvbiA9ICh3aWR0aCAqIHRpbGVUb3AgKyB0aWxlTGVmdCkgKiBjb21wb25lbnRzQ291bnQ7CisgICAgICAgIHZhciBpbWdSb3dTaXplID0gd2lkdGggKiBjb21wb25lbnRzQ291bnQ7CisgICAgICAgIHZhciB0aWxlUm93U2l6ZSA9IHRpbGVXaWR0aCAqIGNvbXBvbmVudHNDb3VudDsKKworICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRpbGVIZWlnaHQ7IGorKykgeworICAgICAgICAgIHZhciByb3dCeXRlcyA9IHNyYy5zdWJhcnJheShzcmNQb3NpdGlvbiwgc3JjUG9zaXRpb24gKyB0aWxlUm93U2l6ZSk7CisgICAgICAgICAgZGF0YS5zZXQocm93Qnl0ZXMsIGRhdGFQb3NpdGlvbik7CisgICAgICAgICAgc3JjUG9zaXRpb24gKz0gdGlsZVJvd1NpemU7CisgICAgICAgICAgZGF0YVBvc2l0aW9uICs9IGltZ1Jvd1NpemU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5idWZmZXIgPSBkYXRhOworICAgIH0KKworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXIubGVuZ3RoOworICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgfTsKKworICByZXR1cm4gSnB4U3RyZWFtOworfSgpOworCitleHBvcnRzLkpweFN0cmVhbSA9IEpweFN0cmVhbTsKKworLyoqKi8gfSksCisvKiAyMTggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5KcHhJbWFnZSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDUpOworCit2YXIgX2FyaXRobWV0aWNfZGVjb2RlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjE0KTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK3ZhciBKcHhFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24pIHsKKyAgX2luaGVyaXRzKEpweEVycm9yLCBfQmFzZUV4Y2VwdGlvbik7CisKKyAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKcHhFcnJvcik7CisKKyAgZnVuY3Rpb24gSnB4RXJyb3IobXNnKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpweEVycm9yKTsKKworICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAiSlBYIGVycm9yOiAiLmNvbmNhdChtc2cpKTsKKyAgfQorCisgIHJldHVybiBKcHhFcnJvcjsKK30oX3V0aWwuQmFzZUV4Y2VwdGlvbik7CisKK3ZhciBKcHhJbWFnZSA9IGZ1bmN0aW9uIEpweEltYWdlQ2xvc3VyZSgpIHsKKyAgdmFyIFN1YmJhbmRzR2FpbkxvZzIgPSB7CisgICAgTEw6IDAsCisgICAgTEg6IDEsCisgICAgSEw6IDEsCisgICAgSEg6IDIKKyAgfTsKKworICBmdW5jdGlvbiBKcHhJbWFnZSgpIHsKKyAgICB0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlID0gZmFsc2U7CisgIH0KKworICBKcHhJbWFnZS5wcm90b3R5cGUgPSB7CisgICAgcGFyc2U6IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlKGRhdGEpIHsKKyAgICAgIHZhciBoZWFkID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIDApOworCisgICAgICBpZiAoaGVhZCA9PT0gMHhmZjRmKSB7CisgICAgICAgIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcG9zaXRpb24gPSAwLAorICAgICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoOworCisgICAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGhlYWRlclNpemUgPSA4OworICAgICAgICB2YXIgbGJveCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHZhciB0Ym94ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CisgICAgICAgIHBvc2l0aW9uICs9IGhlYWRlclNpemU7CisKKyAgICAgICAgaWYgKGxib3ggPT09IDEpIHsKKyAgICAgICAgICBsYm94ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSAqIDQyOTQ5NjcyOTYgKyAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KTsKKyAgICAgICAgICBwb3NpdGlvbiArPSA4OworICAgICAgICAgIGhlYWRlclNpemUgKz0gODsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYm94ID09PSAwKSB7CisgICAgICAgICAgbGJveCA9IGxlbmd0aCAtIHBvc2l0aW9uICsgaGVhZGVyU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYm94IDwgaGVhZGVyU2l6ZSkgeworICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiSW52YWxpZCBib3ggZmllbGQgc2l6ZSIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRhdGFMZW5ndGggPSBsYm94IC0gaGVhZGVyU2l6ZTsKKyAgICAgICAgdmFyIGp1bXBEYXRhTGVuZ3RoID0gdHJ1ZTsKKworICAgICAgICBzd2l0Y2ggKHRib3gpIHsKKyAgICAgICAgICBjYXNlIDB4NmE3MDMyNjg6CisgICAgICAgICAgICBqdW1wRGF0YUxlbmd0aCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4NjM2ZjZjNzI6CisgICAgICAgICAgICB2YXIgbWV0aG9kID0gZGF0YVtwb3NpdGlvbl07CisKKyAgICAgICAgICAgIGlmIChtZXRob2QgPT09IDEpIHsKKyAgICAgICAgICAgICAgdmFyIGNvbG9yc3BhY2UgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAzKTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKGNvbG9yc3BhY2UpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5rbm93biBjb2xvcnNwYWNlICIgKyBjb2xvcnNwYWNlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gMikgeworICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIklDQyBwcm9maWxlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4NmE3MDMyNjM6CisgICAgICAgICAgICB0aGlzLnBhcnNlQ29kZXN0cmVhbShkYXRhLCBwb3NpdGlvbiwgcG9zaXRpb24gKyBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDZhNTAyMDIwOgorICAgICAgICAgICAgaWYgKCgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgIT09IDB4MGQwYTg3MGEpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIEpQMiBzaWduYXR1cmUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4NmE1MDFhMWE6CisgICAgICAgICAgY2FzZSAweDY2NzQ3OTcwOgorICAgICAgICAgIGNhc2UgMHg3MjcyNjU3MToKKyAgICAgICAgICBjYXNlIDB4NzI2NTczMjA6CisgICAgICAgICAgY2FzZSAweDY5Njg2NDcyOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdmFyIGhlYWRlclR5cGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRib3ggPj4gMjQgJiAweGZmLCB0Ym94ID4+IDE2ICYgMHhmZiwgdGJveCA+PiA4ICYgMHhmZiwgdGJveCAmIDB4ZmYpOworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnN1cHBvcnRlZCBoZWFkZXIgdHlwZSAiICsgdGJveCArICIgKCIgKyBoZWFkZXJUeXBlICsgIikiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGp1bXBEYXRhTGVuZ3RoKSB7CisgICAgICAgICAgcG9zaXRpb24gKz0gZGF0YUxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgcGFyc2VJbWFnZVByb3BlcnRpZXM6IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlSW1hZ2VQcm9wZXJ0aWVzKHN0cmVhbSkgeworICAgICAgdmFyIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOworCisgICAgICB3aGlsZSAobmV3Qnl0ZSA+PSAwKSB7CisgICAgICAgIHZhciBvbGRCeXRlID0gbmV3Qnl0ZTsKKyAgICAgICAgbmV3Qnl0ZSA9IHN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgIHZhciBjb2RlID0gb2xkQnl0ZSA8PCA4IHwgbmV3Qnl0ZTsKKworICAgICAgICBpZiAoY29kZSA9PT0gMHhmZjUxKSB7CisgICAgICAgICAgc3RyZWFtLnNraXAoNCk7CisgICAgICAgICAgdmFyIFhzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICB2YXIgWXNpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgIHZhciBYT3NpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgIHZhciBZT3NpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgIHN0cmVhbS5za2lwKDE2KTsKKyAgICAgICAgICB2YXIgQ3NpeiA9IHN0cmVhbS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB0aGlzLndpZHRoID0gWHNpeiAtIFhPc2l6OworICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gWXNpeiAtIFlPc2l6OworICAgICAgICAgIHRoaXMuY29tcG9uZW50c0NvdW50ID0gQ3NpejsKKyAgICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSA4OworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk5vIHNpemUgbWFya2VyIGZvdW5kIGluIEpQWCBzdHJlYW0iKTsKKyAgICB9LAorICAgIHBhcnNlQ29kZXN0cmVhbTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIHZhciBjb250ZXh0ID0ge307CisgICAgICB2YXIgZG9Ob3RSZWNvdmVyID0gZmFsc2U7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBwb3NpdGlvbiA9IHN0YXJ0OworCisgICAgICAgIHdoaWxlIChwb3NpdGlvbiArIDEgPCBlbmQpIHsKKyAgICAgICAgICB2YXIgY29kZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB2YXIgbGVuZ3RoID0gMCwKKyAgICAgICAgICAgICAgaiwKKyAgICAgICAgICAgICAgc3FjZCwKKyAgICAgICAgICAgICAgc3BxY2RzLAorICAgICAgICAgICAgICBzcHFjZFNpemUsCisgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCwKKyAgICAgICAgICAgICAgdGlsZTsKKworICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgY2FzZSAweGZmNGY6CisgICAgICAgICAgICAgIGNvbnRleHQubWFpbkhlYWRlciA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmZkOToKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjUxOgorICAgICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgICAgICB2YXIgc2l6ID0ge307CisgICAgICAgICAgICAgIHNpei5Yc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CisgICAgICAgICAgICAgIHNpei5Zc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgOCk7CisgICAgICAgICAgICAgIHNpei5YT3NpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDEyKTsKKyAgICAgICAgICAgICAgc2l6LllPc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMTYpOworICAgICAgICAgICAgICBzaXouWFRzaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAyMCk7CisgICAgICAgICAgICAgIHNpei5ZVHNpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDI0KTsKKyAgICAgICAgICAgICAgc2l6LlhUT3NpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDI4KTsKKyAgICAgICAgICAgICAgc2l6LllUT3NpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDMyKTsKKyAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbiArIDM2KTsKKyAgICAgICAgICAgICAgc2l6LkNzaXogPSBjb21wb25lbnRzQ291bnQ7CisgICAgICAgICAgICAgIHZhciBjb21wb25lbnRzID0gW107CisgICAgICAgICAgICAgIGogPSBwb3NpdGlvbiArIDM4OworCisgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0geworICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAoZGF0YVtqXSAmIDB4N2YpICsgMSwKKyAgICAgICAgICAgICAgICAgIGlzU2lnbmVkOiAhIShkYXRhW2pdICYgMHg4MCksCisgICAgICAgICAgICAgICAgICBYUnNpejogZGF0YVtqICsgMV0sCisgICAgICAgICAgICAgICAgICBZUnNpejogZGF0YVtqICsgMl0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGogKz0gMzsKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGNvbXBvbmVudCwgc2l6KTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnRleHQuU0laID0gc2l6OworICAgICAgICAgICAgICBjb250ZXh0LmNvbXBvbmVudHMgPSBjb21wb25lbnRzOworICAgICAgICAgICAgICBjYWxjdWxhdGVUaWxlR3JpZHMoY29udGV4dCwgY29tcG9uZW50cyk7CisgICAgICAgICAgICAgIGNvbnRleHQuUUNDID0gW107CisgICAgICAgICAgICAgIGNvbnRleHQuQ09DID0gW107CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1YzoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdmFyIHFjZCA9IHt9OworICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyOworICAgICAgICAgICAgICBzcWNkID0gZGF0YVtqKytdOworCisgICAgICAgICAgICAgIHN3aXRjaCAoc3FjZCAmIDB4MWYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSA4OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNRY2QgdmFsdWUgIiArIHNxY2QpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNkLm5vUXVhbnRpemF0aW9uID0gc3BxY2RTaXplID09PSA4OworICAgICAgICAgICAgICBxY2Quc2NhbGFyRXhwb3VuZGVkID0gc2NhbGFyRXhwb3VuZGVkOworICAgICAgICAgICAgICBxY2QuZ3VhcmRCaXRzID0gc3FjZCA+PiA1OworICAgICAgICAgICAgICBzcHFjZHMgPSBbXTsKKworICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgdmFyIHNwcWNkID0ge307CisKKyAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7CisgICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7CisgICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7CisgICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IChkYXRhW2pdICYgMHg3KSA8PCA4IHwgZGF0YVtqICsgMV07CisgICAgICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNkLlNQcWNkcyA9IHNwcWNkczsKKworICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5RQ0QgPSBxY2Q7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0QgPSBxY2Q7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0MgPSBbXTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1ZDoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdmFyIHFjYyA9IHt9OworICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyOworICAgICAgICAgICAgICB2YXIgY3FjYzsKKworICAgICAgICAgICAgICBpZiAoY29udGV4dC5TSVouQ3NpeiA8IDI1NykgeworICAgICAgICAgICAgICAgIGNxY2MgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3FjYyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBqKTsKKyAgICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzcWNkID0gZGF0YVtqKytdOworCisgICAgICAgICAgICAgIHN3aXRjaCAoc3FjZCAmIDB4MWYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSA4OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNRY2QgdmFsdWUgIiArIHNxY2QpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNjLm5vUXVhbnRpemF0aW9uID0gc3BxY2RTaXplID09PSA4OworICAgICAgICAgICAgICBxY2Muc2NhbGFyRXhwb3VuZGVkID0gc2NhbGFyRXhwb3VuZGVkOworICAgICAgICAgICAgICBxY2MuZ3VhcmRCaXRzID0gc3FjZCA+PiA1OworICAgICAgICAgICAgICBzcHFjZHMgPSBbXTsKKworICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgc3BxY2QgPSB7fTsKKworICAgICAgICAgICAgICAgIGlmIChzcHFjZFNpemUgPT09IDgpIHsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2orK10gPj4gMzsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLm11ID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbal0gPj4gMzsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLm11ID0gKGRhdGFbal0gJiAweDcpIDw8IDggfCBkYXRhW2ogKyAxXTsKKyAgICAgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcHFjZHMucHVzaChzcHFjZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBxY2MuU1BxY2RzID0gc3BxY2RzOworCisgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LlFDQ1tjcWNjXSA9IHFjYzsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjcWNjXSA9IHFjYzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1MjoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdmFyIGNvZCA9IHt9OworICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyOworICAgICAgICAgICAgICB2YXIgc2NvZCA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgY29kLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMgPSAhIShzY29kICYgMSk7CisgICAgICAgICAgICAgIGNvZC5zb3BNYXJrZXJVc2VkID0gISEoc2NvZCAmIDIpOworICAgICAgICAgICAgICBjb2QuZXBoTWFya2VyVXNlZCA9ICEhKHNjb2QgJiA0KTsKKyAgICAgICAgICAgICAgY29kLnByb2dyZXNzaW9uT3JkZXIgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC5sYXllcnNDb3VudCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBqKTsKKyAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICBjb2QubXVsdGlwbGVDb21wb25lbnRUcmFuc2Zvcm0gPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC54Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7CisgICAgICAgICAgICAgIGNvZC55Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7CisgICAgICAgICAgICAgIHZhciBibG9ja1N0eWxlID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2Quc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyA9ICEhKGJsb2NrU3R5bGUgJiAxKTsKKyAgICAgICAgICAgICAgY29kLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMgPSAhIShibG9ja1N0eWxlICYgMik7CisgICAgICAgICAgICAgIGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MgPSAhIShibG9ja1N0eWxlICYgNCk7CisgICAgICAgICAgICAgIGNvZC52ZXJ0aWNhbGx5U3RyaXBlID0gISEoYmxvY2tTdHlsZSAmIDgpOworICAgICAgICAgICAgICBjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbiA9ICEhKGJsb2NrU3R5bGUgJiAxNik7CisgICAgICAgICAgICAgIGNvZC5zZWdtZW50YXRpb25TeW1ib2xVc2VkID0gISEoYmxvY2tTdHlsZSAmIDMyKTsKKyAgICAgICAgICAgICAgY29kLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbiA9IGRhdGFbaisrXTsKKworICAgICAgICAgICAgICBpZiAoY29kLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpIHsKKyAgICAgICAgICAgICAgICB2YXIgcHJlY2luY3RzU2l6ZXMgPSBbXTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICsgcG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgIHZhciBwcmVjaW5jdHNTaXplID0gZGF0YVtqKytdOworICAgICAgICAgICAgICAgICAgcHJlY2luY3RzU2l6ZXMucHVzaCh7CisgICAgICAgICAgICAgICAgICAgIFBQeDogcHJlY2luY3RzU2l6ZSAmIDB4ZiwKKyAgICAgICAgICAgICAgICAgICAgUFB5OiBwcmVjaW5jdHNTaXplID4+IDQKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvZC5wcmVjaW5jdHNTaXplcyA9IHByZWNpbmN0c1NpemVzOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIHVuc3VwcG9ydGVkID0gW107CisKKyAgICAgICAgICAgICAgaWYgKGNvZC5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgic2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgicmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcyIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MpIHsKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKCJ0ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb2QudmVydGljYWxseVN0cmlwZSkgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInZlcnRpY2FsbHlTdHJpcGUiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbikgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInByZWRpY3RhYmxlVGVybWluYXRpb24iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZG9Ob3RSZWNvdmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIENPRCBvcHRpb25zICgiICsgdW5zdXBwb3J0ZWQuam9pbigiLCAiKSArICIpIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5DT0QgPSBjb2Q7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0QgPSBjb2Q7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0MgPSBbXTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY5MDoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdGlsZSA9IHt9OworICAgICAgICAgICAgICB0aWxlLmluZGV4ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uICsgMik7CisgICAgICAgICAgICAgIHRpbGUubGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CisgICAgICAgICAgICAgIHRpbGUuZGF0YUVuZCA9IHRpbGUubGVuZ3RoICsgcG9zaXRpb24gLSAyOworICAgICAgICAgICAgICB0aWxlLnBhcnRJbmRleCA9IGRhdGFbcG9zaXRpb24gKyA4XTsKKyAgICAgICAgICAgICAgdGlsZS5wYXJ0c0NvdW50ID0gZGF0YVtwb3NpdGlvbiArIDldOworICAgICAgICAgICAgICBjb250ZXh0Lm1haW5IZWFkZXIgPSBmYWxzZTsKKworICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHsKKyAgICAgICAgICAgICAgICB0aWxlLkNPRCA9IGNvbnRleHQuQ09EOworICAgICAgICAgICAgICAgIHRpbGUuQ09DID0gY29udGV4dC5DT0Muc2xpY2UoMCk7CisgICAgICAgICAgICAgICAgdGlsZS5RQ0QgPSBjb250ZXh0LlFDRDsKKyAgICAgICAgICAgICAgICB0aWxlLlFDQyA9IGNvbnRleHQuUUNDLnNsaWNlKDApOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZSA9IHRpbGU7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY5MzoKKyAgICAgICAgICAgICAgdGlsZSA9IGNvbnRleHQuY3VycmVudFRpbGU7CisKKyAgICAgICAgICAgICAgaWYgKHRpbGUucGFydEluZGV4ID09PSAwKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVRpbGUoY29udGV4dCwgdGlsZS5pbmRleCk7CisgICAgICAgICAgICAgICAgYnVpbGRQYWNrZXRzKGNvbnRleHQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGVuZ3RoID0gdGlsZS5kYXRhRW5kIC0gcG9zaXRpb247CisgICAgICAgICAgICAgIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgcG9zaXRpb24sIGxlbmd0aCk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1NToKKyAgICAgICAgICAgIGNhc2UgMHhmZjU3OgorICAgICAgICAgICAgY2FzZSAweGZmNTg6CisgICAgICAgICAgICBjYXNlIDB4ZmY2NDoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjUzOgorICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvZGVzdHJlYW0gY29kZSAweEZGNTMgKENPQykgaXMgbm90IGltcGxlbWVudGVkIik7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb2Rlc3RyZWFtIGNvZGU6ICIgKyBjb2RlLnRvU3RyaW5nKDE2KSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGlmIChkb05vdFJlY292ZXIgfHwgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSkgeworICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihlLm1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSlBYOiBUcnlpbmcgdG8gcmVjb3ZlciBmcm9tOiAiICsgZS5tZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLnRpbGVzID0gdHJhbnNmb3JtQ29tcG9uZW50cyhjb250ZXh0KTsKKyAgICAgIHRoaXMud2lkdGggPSBjb250ZXh0LlNJWi5Yc2l6IC0gY29udGV4dC5TSVouWE9zaXo7CisgICAgICB0aGlzLmhlaWdodCA9IGNvbnRleHQuU0laLllzaXogLSBjb250ZXh0LlNJWi5ZT3NpejsKKyAgICAgIHRoaXMuY29tcG9uZW50c0NvdW50ID0gY29udGV4dC5TSVouQ3NpejsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhjb21wb25lbnQsIHNpeikgeworICAgIGNvbXBvbmVudC54MCA9IE1hdGguY2VpbChzaXouWE9zaXogLyBjb21wb25lbnQuWFJzaXopOworICAgIGNvbXBvbmVudC54MSA9IE1hdGguY2VpbChzaXouWHNpeiAvIGNvbXBvbmVudC5YUnNpeik7CisgICAgY29tcG9uZW50LnkwID0gTWF0aC5jZWlsKHNpei5ZT3NpeiAvIGNvbXBvbmVudC5ZUnNpeik7CisgICAgY29tcG9uZW50LnkxID0gTWF0aC5jZWlsKHNpei5Zc2l6IC8gY29tcG9uZW50LllSc2l6KTsKKyAgICBjb21wb25lbnQud2lkdGggPSBjb21wb25lbnQueDEgLSBjb21wb25lbnQueDA7CisgICAgY29tcG9uZW50LmhlaWdodCA9IGNvbXBvbmVudC55MSAtIGNvbXBvbmVudC55MDsKKyAgfQorCisgIGZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVHcmlkcyhjb250ZXh0LCBjb21wb25lbnRzKSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciB0aWxlLAorICAgICAgICB0aWxlcyA9IFtdOworICAgIHZhciBudW1YdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Yc2l6IC0gc2l6LlhUT3NpeikgLyBzaXouWFRzaXopOworICAgIHZhciBudW1ZdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Zc2l6IC0gc2l6LllUT3NpeikgLyBzaXouWVRzaXopOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBudW1ZdGlsZXM7IHErKykgeworICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBudW1YdGlsZXM7IHArKykgeworICAgICAgICB0aWxlID0ge307CisgICAgICAgIHRpbGUudHgwID0gTWF0aC5tYXgoc2l6LlhUT3NpeiArIHAgKiBzaXouWFRzaXosIHNpei5YT3Npeik7CisgICAgICAgIHRpbGUudHkwID0gTWF0aC5tYXgoc2l6LllUT3NpeiArIHEgKiBzaXouWVRzaXosIHNpei5ZT3Npeik7CisgICAgICAgIHRpbGUudHgxID0gTWF0aC5taW4oc2l6LlhUT3NpeiArIChwICsgMSkgKiBzaXouWFRzaXosIHNpei5Yc2l6KTsKKyAgICAgICAgdGlsZS50eTEgPSBNYXRoLm1pbihzaXouWVRPc2l6ICsgKHEgKyAxKSAqIHNpei5ZVHNpeiwgc2l6LllzaXopOworICAgICAgICB0aWxlLndpZHRoID0gdGlsZS50eDEgLSB0aWxlLnR4MDsKKyAgICAgICAgdGlsZS5oZWlnaHQgPSB0aWxlLnR5MSAtIHRpbGUudHkwOworICAgICAgICB0aWxlLmNvbXBvbmVudHMgPSBbXTsKKyAgICAgICAgdGlsZXMucHVzaCh0aWxlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb250ZXh0LnRpbGVzID0gdGlsZXM7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29tcG9uZW50c0NvdW50OyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHRpbGVzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgdmFyIHRpbGVDb21wb25lbnQgPSB7fTsKKyAgICAgICAgdGlsZSA9IHRpbGVzW2pdOworICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDAgPSBNYXRoLmNlaWwodGlsZS50eDAgLyBjb21wb25lbnQuWFJzaXopOworICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTAgPSBNYXRoLmNlaWwodGlsZS50eTAgLyBjb21wb25lbnQuWVJzaXopOworICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDEgPSBNYXRoLmNlaWwodGlsZS50eDEgLyBjb21wb25lbnQuWFJzaXopOworICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTEgPSBNYXRoLmNlaWwodGlsZS50eTEgLyBjb21wb25lbnQuWVJzaXopOworICAgICAgICB0aWxlQ29tcG9uZW50LndpZHRoID0gdGlsZUNvbXBvbmVudC50Y3gxIC0gdGlsZUNvbXBvbmVudC50Y3gwOworICAgICAgICB0aWxlQ29tcG9uZW50LmhlaWdodCA9IHRpbGVDb21wb25lbnQudGN5MSAtIHRpbGVDb21wb25lbnQudGN5MDsKKyAgICAgICAgdGlsZS5jb21wb25lbnRzW2ldID0gdGlsZUNvbXBvbmVudDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZXRCbG9ja3NEaW1lbnNpb25zKGNvbnRleHQsIGNvbXBvbmVudCwgcikgeworICAgIHZhciBjb2RPckNvYyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7CisgICAgdmFyIHJlc3VsdCA9IHt9OworCisgICAgaWYgKCFjb2RPckNvYy5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7CisgICAgICByZXN1bHQuUFB4ID0gMTU7CisgICAgICByZXN1bHQuUFB5ID0gMTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5QUHggPSBjb2RPckNvYy5wcmVjaW5jdHNTaXplc1tyXS5QUHg7CisgICAgICByZXN1bHQuUFB5ID0gY29kT3JDb2MucHJlY2luY3RzU2l6ZXNbcl0uUFB5OworICAgIH0KKworICAgIHJlc3VsdC54Y2JfID0gciA+IDAgPyBNYXRoLm1pbihjb2RPckNvYy54Y2IsIHJlc3VsdC5QUHggLSAxKSA6IE1hdGgubWluKGNvZE9yQ29jLnhjYiwgcmVzdWx0LlBQeCk7CisgICAgcmVzdWx0LnljYl8gPSByID4gMCA/IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSAtIDEpIDogTWF0aC5taW4oY29kT3JDb2MueWNiLCByZXN1bHQuUFB5KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgZGltZW5zaW9ucykgeworICAgIHZhciBwcmVjaW5jdFdpZHRoID0gMSA8PCBkaW1lbnNpb25zLlBQeDsKKyAgICB2YXIgcHJlY2luY3RIZWlnaHQgPSAxIDw8IGRpbWVuc2lvbnMuUFB5OworICAgIHZhciBpc1plcm9SZXMgPSByZXNvbHV0aW9uLnJlc0xldmVsID09PSAwOworICAgIHZhciBwcmVjaW5jdFdpZHRoSW5TdWJiYW5kID0gMSA8PCBkaW1lbnNpb25zLlBQeCArIChpc1plcm9SZXMgPyAwIDogLTEpOworICAgIHZhciBwcmVjaW5jdEhlaWdodEluU3ViYmFuZCA9IDEgPDwgZGltZW5zaW9ucy5QUHkgKyAoaXNaZXJvUmVzID8gMCA6IC0xKTsKKyAgICB2YXIgbnVtcHJlY2luY3Rzd2lkZSA9IHJlc29sdXRpb24udHJ4MSA+IHJlc29sdXRpb24udHJ4MCA/IE1hdGguY2VpbChyZXNvbHV0aW9uLnRyeDEgLyBwcmVjaW5jdFdpZHRoKSAtIE1hdGguZmxvb3IocmVzb2x1dGlvbi50cngwIC8gcHJlY2luY3RXaWR0aCkgOiAwOworICAgIHZhciBudW1wcmVjaW5jdHNoaWdoID0gcmVzb2x1dGlvbi50cnkxID4gcmVzb2x1dGlvbi50cnkwID8gTWF0aC5jZWlsKHJlc29sdXRpb24udHJ5MSAvIHByZWNpbmN0SGVpZ2h0KSAtIE1hdGguZmxvb3IocmVzb2x1dGlvbi50cnkwIC8gcHJlY2luY3RIZWlnaHQpIDogMDsKKyAgICB2YXIgbnVtcHJlY2luY3RzID0gbnVtcHJlY2luY3Rzd2lkZSAqIG51bXByZWNpbmN0c2hpZ2g7CisgICAgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMgPSB7CisgICAgICBwcmVjaW5jdFdpZHRoOiBwcmVjaW5jdFdpZHRoLAorICAgICAgcHJlY2luY3RIZWlnaHQ6IHByZWNpbmN0SGVpZ2h0LAorICAgICAgbnVtcHJlY2luY3Rzd2lkZTogbnVtcHJlY2luY3Rzd2lkZSwKKyAgICAgIG51bXByZWNpbmN0c2hpZ2g6IG51bXByZWNpbmN0c2hpZ2gsCisgICAgICBudW1wcmVjaW5jdHM6IG51bXByZWNpbmN0cywKKyAgICAgIHByZWNpbmN0V2lkdGhJblN1YmJhbmQ6IHByZWNpbmN0V2lkdGhJblN1YmJhbmQsCisgICAgICBwcmVjaW5jdEhlaWdodEluU3ViYmFuZDogcHJlY2luY3RIZWlnaHRJblN1YmJhbmQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGRpbWVuc2lvbnMpIHsKKyAgICB2YXIgeGNiXyA9IGRpbWVuc2lvbnMueGNiXzsKKyAgICB2YXIgeWNiXyA9IGRpbWVuc2lvbnMueWNiXzsKKyAgICB2YXIgY29kZWJsb2NrV2lkdGggPSAxIDw8IHhjYl87CisgICAgdmFyIGNvZGVibG9ja0hlaWdodCA9IDEgPDwgeWNiXzsKKyAgICB2YXIgY2J4MCA9IHN1YmJhbmQudGJ4MCA+PiB4Y2JfOworICAgIHZhciBjYnkwID0gc3ViYmFuZC50YnkwID4+IHljYl87CisgICAgdmFyIGNieDEgPSBzdWJiYW5kLnRieDEgKyBjb2RlYmxvY2tXaWR0aCAtIDEgPj4geGNiXzsKKyAgICB2YXIgY2J5MSA9IHN1YmJhbmQudGJ5MSArIGNvZGVibG9ja0hlaWdodCAtIDEgPj4geWNiXzsKKyAgICB2YXIgcHJlY2luY3RQYXJhbWV0ZXJzID0gc3ViYmFuZC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVyczsKKyAgICB2YXIgY29kZWJsb2NrcyA9IFtdOworICAgIHZhciBwcmVjaW5jdHMgPSBbXTsKKyAgICB2YXIgaSwgaiwgY29kZWJsb2NrLCBwcmVjaW5jdE51bWJlcjsKKworICAgIGZvciAoaiA9IGNieTA7IGogPCBjYnkxOyBqKyspIHsKKyAgICAgIGZvciAoaSA9IGNieDA7IGkgPCBjYngxOyBpKyspIHsKKyAgICAgICAgY29kZWJsb2NrID0geworICAgICAgICAgIGNieDogaSwKKyAgICAgICAgICBjYnk6IGosCisgICAgICAgICAgdGJ4MDogY29kZWJsb2NrV2lkdGggKiBpLAorICAgICAgICAgIHRieTA6IGNvZGVibG9ja0hlaWdodCAqIGosCisgICAgICAgICAgdGJ4MTogY29kZWJsb2NrV2lkdGggKiAoaSArIDEpLAorICAgICAgICAgIHRieTE6IGNvZGVibG9ja0hlaWdodCAqIChqICsgMSkKKyAgICAgICAgfTsKKyAgICAgICAgY29kZWJsb2NrLnRieDBfID0gTWF0aC5tYXgoc3ViYmFuZC50YngwLCBjb2RlYmxvY2sudGJ4MCk7CisgICAgICAgIGNvZGVibG9jay50YnkwXyA9IE1hdGgubWF4KHN1YmJhbmQudGJ5MCwgY29kZWJsb2NrLnRieTApOworICAgICAgICBjb2RlYmxvY2sudGJ4MV8gPSBNYXRoLm1pbihzdWJiYW5kLnRieDEsIGNvZGVibG9jay50YngxKTsKKyAgICAgICAgY29kZWJsb2NrLnRieTFfID0gTWF0aC5taW4oc3ViYmFuZC50YnkxLCBjb2RlYmxvY2sudGJ5MSk7CisgICAgICAgIHZhciBwaSA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YngwXyAtIHN1YmJhbmQudGJ4MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aEluU3ViYmFuZCk7CisgICAgICAgIHZhciBwaiA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YnkwXyAtIHN1YmJhbmQudGJ5MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHRJblN1YmJhbmQpOworICAgICAgICBwcmVjaW5jdE51bWJlciA9IHBpICsgcGogKiBwcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTsKKyAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyID0gcHJlY2luY3ROdW1iZXI7CisgICAgICAgIGNvZGVibG9jay5zdWJiYW5kVHlwZSA9IHN1YmJhbmQudHlwZTsKKyAgICAgICAgY29kZWJsb2NrLkxibG9jayA9IDM7CisKKyAgICAgICAgaWYgKGNvZGVibG9jay50YngxXyA8PSBjb2RlYmxvY2sudGJ4MF8gfHwgY29kZWJsb2NrLnRieTFfIDw9IGNvZGVibG9jay50YnkwXykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7CisgICAgICAgIHZhciBwcmVjaW5jdCA9IHByZWNpbmN0c1twcmVjaW5jdE51bWJlcl07CisKKyAgICAgICAgaWYgKHByZWNpbmN0ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBpZiAoaSA8IHByZWNpbmN0LmNieE1pbikgeworICAgICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gaTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBwcmVjaW5jdC5jYnhNYXgpIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1heCA9IGk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGogPCBwcmVjaW5jdC5jYnlNaW4pIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1pbiA9IGo7CisgICAgICAgICAgfSBlbHNlIGlmIChqID4gcHJlY2luY3QuY2J5TWF4KSB7CisgICAgICAgICAgICBwcmVjaW5jdC5jYnlNYXggPSBqOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmVjaW5jdHNbcHJlY2luY3ROdW1iZXJdID0gcHJlY2luY3QgPSB7CisgICAgICAgICAgICBjYnhNaW46IGksCisgICAgICAgICAgICBjYnlNaW46IGosCisgICAgICAgICAgICBjYnhNYXg6IGksCisgICAgICAgICAgICBjYnlNYXg6IGoKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0ID0gcHJlY2luY3Q7CisgICAgICB9CisgICAgfQorCisgICAgc3ViYmFuZC5jb2RlYmxvY2tQYXJhbWV0ZXJzID0geworICAgICAgY29kZWJsb2NrV2lkdGg6IHhjYl8sCisgICAgICBjb2RlYmxvY2tIZWlnaHQ6IHljYl8sCisgICAgICBudW1jb2RlYmxvY2t3aWRlOiBjYngxIC0gY2J4MCArIDEsCisgICAgICBudW1jb2RlYmxvY2toaWdoOiBjYnkxIC0gY2J5MCArIDEKKyAgICB9OworICAgIHN1YmJhbmQuY29kZWJsb2NrcyA9IGNvZGVibG9ja3M7CisgICAgc3ViYmFuZC5wcmVjaW5jdHMgPSBwcmVjaW5jdHM7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcHJlY2luY3ROdW1iZXIsIGxheWVyTnVtYmVyKSB7CisgICAgdmFyIHByZWNpbmN0Q29kZWJsb2NrcyA9IFtdOworICAgIHZhciBzdWJiYW5kcyA9IHJlc29sdXRpb24uc3ViYmFuZHM7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdWJiYW5kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgc3ViYmFuZCA9IHN1YmJhbmRzW2ldOworICAgICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGNvZGVibG9ja3MubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICB2YXIgY29kZWJsb2NrID0gY29kZWJsb2Nrc1tqXTsKKworICAgICAgICBpZiAoY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyICE9PSBwcmVjaW5jdE51bWJlcikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJlY2luY3RDb2RlYmxvY2tzLnB1c2goY29kZWJsb2NrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgbGF5ZXJOdW1iZXI6IGxheWVyTnVtYmVyLAorICAgICAgY29kZWJsb2NrczogcHJlY2luY3RDb2RlYmxvY2tzCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBjb21wb25lbnRzQ291bnQ7IHErKykgeworICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CisgICAgfQorCisgICAgdmFyIGwgPSAwLAorICAgICAgICByID0gMCwKKyAgICAgICAgaSA9IDAsCisgICAgICAgIGsgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7IGwrKykgeworICAgICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgeworICAgICAgICAgIGZvciAoOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbaV07CisKKyAgICAgICAgICAgIGlmIChyID4gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgdmFyIG51bXByZWNpbmN0cyA9IHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0czsKKworICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7KSB7CisgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7CisgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICByID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gMDsKKworICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHsKKyAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCwgdGlsZS5jb21wb25lbnRzW3FdLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpOworICAgIH0KKworICAgIHZhciByID0gMCwKKyAgICAgICAgbCA9IDAsCisgICAgICAgIGkgPSAwLAorICAgICAgICBrID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgeworICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHsKKyAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldOworCisgICAgICAgICAgICBpZiAociA+IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKKyAgICAgICAgICAgIHZhciBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CisKKyAgICAgICAgICAgIGZvciAoOyBrIDwgbnVtcHJlY2luY3RzOykgeworICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpOworICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGsgPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbCA9IDA7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihjb250ZXh0KSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIGwsIHIsIGMsIHA7CisgICAgdmFyIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IDA7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBNYXRoLm1heChtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KTsKKyAgICB9CisKKyAgICB2YXIgbWF4TnVtUHJlY2luY3RzSW5MZXZlbCA9IG5ldyBJbnQzMkFycmF5KG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCArIDEpOworCisgICAgZm9yIChyID0gMDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7ICsrcikgeworICAgICAgdmFyIG1heE51bVByZWNpbmN0cyA9IDA7CisKKyAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7ICsrYykgeworICAgICAgICB2YXIgcmVzb2x1dGlvbnMgPSB0aWxlLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnM7CisKKyAgICAgICAgaWYgKHIgPCByZXNvbHV0aW9ucy5sZW5ndGgpIHsKKyAgICAgICAgICBtYXhOdW1QcmVjaW5jdHMgPSBNYXRoLm1heChtYXhOdW1QcmVjaW5jdHMsIHJlc29sdXRpb25zW3JdLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1heE51bVByZWNpbmN0c0luTGV2ZWxbcl0gPSBtYXhOdW1QcmVjaW5jdHM7CisgICAgfQorCisgICAgbCA9IDA7CisgICAgciA9IDA7CisgICAgYyA9IDA7CisgICAgcCA9IDA7CisKKyAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgeworICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgZm9yICg7IHAgPCBtYXhOdW1QcmVjaW5jdHNJbkxldmVsW3JdOyBwKyspIHsKKyAgICAgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICAgICAgICB2YXIgX2NvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKworICAgICAgICAgICAgaWYgKHIgPiBfY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gX2NvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKKyAgICAgICAgICAgIHZhciBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CisKKyAgICAgICAgICAgIGlmIChwID49IG51bXByZWNpbmN0cykgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDspIHsKKyAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBwLCBsKTsKKyAgICAgICAgICAgICAgbCsrOworICAgICAgICAgICAgICByZXR1cm4gcGFja2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7CisgICAgdmFyIHByZWNpbmN0c0l0ZXJhdGlvblNpemVzID0gcHJlY2luY3RzU2l6ZXM7CisgICAgdmFyIGwgPSAwLAorICAgICAgICByID0gMCwKKyAgICAgICAgYyA9IDAsCisgICAgICAgIHB4ID0gMCwKKyAgICAgICAgcHkgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyBweSA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bUhpZ2g7IHB5KyspIHsKKyAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykgeworICAgICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisKKyAgICAgICAgICAgIGZvciAoOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgICB2YXIgc2l6ZUluSW1hZ2VTY2FsZSA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHgsIHB5LCBzaXplSW5JbWFnZVNjYWxlLCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB4ID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgcHJlY2luY3RzU2l6ZXMgPSBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpOworICAgIHZhciBsID0gMCwKKyAgICAgICAgciA9IDAsCisgICAgICAgIGMgPSAwLAorICAgICAgICBweCA9IDAsCisgICAgICAgIHB5ID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7CisgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICAgIHZhciBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY107CisgICAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKKworICAgICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7CisgICAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykgeworICAgICAgICAgICAgZm9yICg7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHgsIHB5LCBzaXplSW5JbWFnZVNjYWxlLCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBweCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBweSA9IDA7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHhJbmRleCwgcHlJbmRleCwgc2l6ZUluSW1hZ2VTY2FsZSwgcHJlY2luY3RJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbikgeworICAgIHZhciBwb3NYID0gcHhJbmRleCAqIHByZWNpbmN0SXRlcmF0aW9uU2l6ZXMubWluV2lkdGg7CisgICAgdmFyIHBvc1kgPSBweUluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5IZWlnaHQ7CisKKyAgICBpZiAocG9zWCAlIHNpemVJbkltYWdlU2NhbGUud2lkdGggIT09IDAgfHwgcG9zWSAlIHNpemVJbkltYWdlU2NhbGUuaGVpZ2h0ICE9PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgc3RhcnRQcmVjaW5jdFJvd0luZGV4ID0gcG9zWSAvIHNpemVJbkltYWdlU2NhbGUud2lkdGggKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlOworICAgIHJldHVybiBwb3NYIC8gc2l6ZUluSW1hZ2VTY2FsZS5oZWlnaHQgKyBzdGFydFByZWNpbmN0Um93SW5kZXg7CisgIH0KKworICBmdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpIHsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gdGlsZS5jb21wb25lbnRzLmxlbmd0aDsKKyAgICB2YXIgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFOworICAgIHZhciBtaW5IZWlnaHQgPSBOdW1iZXIuTUFYX1ZBTFVFOworICAgIHZhciBtYXhOdW1XaWRlID0gMDsKKyAgICB2YXIgbWF4TnVtSGlnaCA9IDA7CisgICAgdmFyIHNpemVQZXJDb21wb25lbnQgPSBuZXcgQXJyYXkoY29tcG9uZW50c0NvdW50KTsKKworICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisgICAgICB2YXIgc2l6ZVBlclJlc29sdXRpb24gPSBuZXcgQXJyYXkoZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ICsgMSk7CisgICAgICB2YXIgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgIHZhciBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgIHZhciBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IDA7CisgICAgICB2YXIgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSAwOworICAgICAgdmFyIHNjYWxlID0gMTsKKworICAgICAgZm9yICh2YXIgciA9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgciA+PSAwOyAtLXIpIHsKKyAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgIHZhciB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uID0gc2NhbGUgKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdFdpZHRoOworICAgICAgICB2YXIgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24gPSBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0OworICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1pbihtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsIHdpZHRoQ3VycmVudFJlc29sdXRpb24pOworICAgICAgICBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4obWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24pOworICAgICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IE1hdGgubWF4KG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LCByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlKTsKKyAgICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCwgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzaGlnaCk7CisgICAgICAgIHNpemVQZXJSZXNvbHV0aW9uW3JdID0geworICAgICAgICAgIHdpZHRoOiB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uLAorICAgICAgICAgIGhlaWdodDogaGVpZ2h0Q3VycmVudFJlc29sdXRpb24KKyAgICAgICAgfTsKKyAgICAgICAgc2NhbGUgPDw9IDE7CisgICAgICB9CisKKyAgICAgIG1pbldpZHRoID0gTWF0aC5taW4obWluV2lkdGgsIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCk7CisgICAgICBtaW5IZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQpOworICAgICAgbWF4TnVtV2lkZSA9IE1hdGgubWF4KG1heE51bVdpZGUsIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50KTsKKyAgICAgIG1heE51bUhpZ2ggPSBNYXRoLm1heChtYXhOdW1IaWdoLCBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCk7CisgICAgICBzaXplUGVyQ29tcG9uZW50W2NdID0geworICAgICAgICByZXNvbHV0aW9uczogc2l6ZVBlclJlc29sdXRpb24sCisgICAgICAgIG1pbldpZHRoOiBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1pbkhlaWdodDogbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwKKyAgICAgICAgbWF4TnVtV2lkZTogbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1heE51bUhpZ2g6IG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50CisgICAgICB9OworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBjb21wb25lbnRzOiBzaXplUGVyQ29tcG9uZW50LAorICAgICAgbWluV2lkdGg6IG1pbldpZHRoLAorICAgICAgbWluSGVpZ2h0OiBtaW5IZWlnaHQsCisgICAgICBtYXhOdW1XaWRlOiBtYXhOdW1XaWRlLAorICAgICAgbWF4TnVtSGlnaDogbWF4TnVtSGlnaAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBidWlsZFBhY2tldHMoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisKKyAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OworICAgICAgdmFyIHJlc29sdXRpb25zID0gW107CisgICAgICB2YXIgc3ViYmFuZHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgciA9IDA7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgdmFyIGJsb2Nrc0RpbWVuc2lvbnMgPSBnZXRCbG9ja3NEaW1lbnNpb25zKGNvbnRleHQsIGNvbXBvbmVudCwgcik7CisgICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CisgICAgICAgIHZhciBzY2FsZSA9IDEgPDwgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50IC0gcjsKKyAgICAgICAgcmVzb2x1dGlvbi50cngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnRyeTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7CisgICAgICAgIHJlc29sdXRpb24udHJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTsKKyAgICAgICAgcmVzb2x1dGlvbi50cnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnJlc0xldmVsID0gcjsKKyAgICAgICAgYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgIHJlc29sdXRpb25zLnB1c2gocmVzb2x1dGlvbik7CisgICAgICAgIHZhciBzdWJiYW5kOworCisgICAgICAgIGlmIChyID09PSAwKSB7CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJMTCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIHNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IFtzdWJiYW5kXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgYnNjYWxlID0gMSA8PCBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByICsgMTsKKyAgICAgICAgICB2YXIgcmVzb2x1dGlvblN1YmJhbmRzID0gW107CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJITCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOworICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTsKKyAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHN1YmJhbmQgPSB7fTsKKyAgICAgICAgICBzdWJiYW5kLnR5cGUgPSAiTEgiOworICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKyAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICBzdWJiYW5kID0ge307CisgICAgICAgICAgc3ViYmFuZC50eXBlID0gIkhIIjsKKyAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IHJlc29sdXRpb25TdWJiYW5kczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb21wb25lbnQucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uczsKKyAgICAgIGNvbXBvbmVudC5zdWJiYW5kcyA9IHN1YmJhbmRzOworICAgIH0KKworICAgIHZhciBwcm9ncmVzc2lvbk9yZGVyID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7CisKKyAgICBzd2l0Y2ggKHByb2dyZXNzaW9uT3JkZXIpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvbkxheWVyQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiVW5zdXBwb3J0ZWQgcHJvZ3Jlc3Npb24gb3JkZXIgIi5jb25jYXQocHJvZ3Jlc3Npb25PcmRlcikpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgb2Zmc2V0LCBkYXRhTGVuZ3RoKSB7CisgICAgdmFyIHBvc2l0aW9uID0gMDsKKyAgICB2YXIgYnVmZmVyLAorICAgICAgICBidWZmZXJTaXplID0gMCwKKyAgICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTsKKworICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGNvdW50KSB7CisgICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IGNvdW50KSB7CisgICAgICAgIHZhciBiID0gZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl07CisgICAgICAgIHBvc2l0aW9uKys7CisKKyAgICAgICAgaWYgKHNraXBOZXh0Qml0KSB7CisgICAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDcgfCBiOworICAgICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKKyAgICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCA4IHwgYjsKKyAgICAgICAgICBidWZmZXJTaXplICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYiA9PT0gMHhmZikgeworICAgICAgICAgIHNraXBOZXh0Qml0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBidWZmZXJTaXplIC09IGNvdW50OworICAgICAgcmV0dXJuIGJ1ZmZlciA+Pj4gYnVmZmVyU2l6ZSAmICgxIDw8IGNvdW50KSAtIDE7CisgICAgfQorCisgICAgZnVuY3Rpb24gc2tpcE1hcmtlcklmRXF1YWwodmFsdWUpIHsKKyAgICAgIGlmIChkYXRhW29mZnNldCArIHBvc2l0aW9uIC0gMV0gPT09IDB4ZmYgJiYgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl0gPT09IHZhbHVlKSB7CisgICAgICAgIHNraXBCeXRlcygxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSAweGZmICYmIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb24gKyAxXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgc2tpcEJ5dGVzKDIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIHNraXBCeXRlcyhjb3VudCkgeworICAgICAgcG9zaXRpb24gKz0gY291bnQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKSB7CisgICAgICBidWZmZXJTaXplID0gMDsKKworICAgICAgaWYgKHNraXBOZXh0Qml0KSB7CisgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgIHNraXBOZXh0Qml0ID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVhZENvZGluZ3Bhc3NlcygpIHsKKyAgICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7CisgICAgICAgIHJldHVybiAyOworICAgICAgfQorCisgICAgICB2YXIgdmFsdWUgPSByZWFkQml0cygyKTsKKworICAgICAgaWYgKHZhbHVlIDwgMykgeworICAgICAgICByZXR1cm4gdmFsdWUgKyAzOworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHJlYWRCaXRzKDUpOworCisgICAgICBpZiAodmFsdWUgPCAzMSkgeworICAgICAgICByZXR1cm4gdmFsdWUgKyA2OworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHJlYWRCaXRzKDcpOworICAgICAgcmV0dXJuIHZhbHVlICsgMzc7CisgICAgfQorCisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIHNvcE1hcmtlclVzZWQgPSBjb250ZXh0LkNPRC5zb3BNYXJrZXJVc2VkOworICAgIHZhciBlcGhNYXJrZXJVc2VkID0gY29udGV4dC5DT0QuZXBoTWFya2VyVXNlZDsKKyAgICB2YXIgcGFja2V0c0l0ZXJhdG9yID0gdGlsZS5wYWNrZXRzSXRlcmF0b3I7CisKKyAgICB3aGlsZSAocG9zaXRpb24gPCBkYXRhTGVuZ3RoKSB7CisgICAgICBhbGlnblRvQnl0ZSgpOworCisgICAgICBpZiAoc29wTWFya2VyVXNlZCAmJiBza2lwTWFya2VySWZFcXVhbCgweDkxKSkgeworICAgICAgICBza2lwQnl0ZXMoNCk7CisgICAgICB9CisKKyAgICAgIHZhciBwYWNrZXQgPSBwYWNrZXRzSXRlcmF0b3IubmV4dFBhY2tldCgpOworCisgICAgICBpZiAoIXJlYWRCaXRzKDEpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgbGF5ZXJOdW1iZXIgPSBwYWNrZXQubGF5ZXJOdW1iZXI7CisgICAgICB2YXIgcXVldWUgPSBbXSwKKyAgICAgICAgICBjb2RlYmxvY2s7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhY2tldC5jb2RlYmxvY2tzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29kZWJsb2NrID0gcGFja2V0LmNvZGVibG9ja3NbaV07CisgICAgICAgIHZhciBwcmVjaW5jdCA9IGNvZGVibG9jay5wcmVjaW5jdDsKKyAgICAgICAgdmFyIGNvZGVibG9ja0NvbHVtbiA9IGNvZGVibG9jay5jYnggLSBwcmVjaW5jdC5jYnhNaW47CisgICAgICAgIHZhciBjb2RlYmxvY2tSb3cgPSBjb2RlYmxvY2suY2J5IC0gcHJlY2luY3QuY2J5TWluOworICAgICAgICB2YXIgY29kZWJsb2NrSW5jbHVkZWQgPSBmYWxzZTsKKyAgICAgICAgdmFyIGZpcnN0VGltZUluY2x1c2lvbiA9IGZhbHNlOworICAgICAgICB2YXIgdmFsdWVSZWFkeTsKKworICAgICAgICBpZiAoY29kZWJsb2NrLmluY2x1ZGVkICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBjb2RlYmxvY2tJbmNsdWRlZCA9ICEhcmVhZEJpdHMoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJlY2luY3QgPSBjb2RlYmxvY2sucHJlY2luY3Q7CisgICAgICAgICAgdmFyIGluY2x1c2lvblRyZWUsIHplcm9CaXRQbGFuZXNUcmVlOworCisgICAgICAgICAgaWYgKHByZWNpbmN0LmluY2x1c2lvblRyZWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgaW5jbHVzaW9uVHJlZSA9IHByZWNpbmN0LmluY2x1c2lvblRyZWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciB3aWR0aCA9IHByZWNpbmN0LmNieE1heCAtIHByZWNpbmN0LmNieE1pbiArIDE7CisgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcHJlY2luY3QuY2J5TWF4IC0gcHJlY2luY3QuY2J5TWluICsgMTsKKyAgICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBuZXcgSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBsYXllck51bWJlcik7CisgICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IG5ldyBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgcHJlY2luY3QuaW5jbHVzaW9uVHJlZSA9IGluY2x1c2lvblRyZWU7CisgICAgICAgICAgICBwcmVjaW5jdC56ZXJvQml0UGxhbmVzVHJlZSA9IHplcm9CaXRQbGFuZXNUcmVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpbmNsdXNpb25UcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93LCBsYXllck51bWJlcikpIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgeworICAgICAgICAgICAgICAgIHZhbHVlUmVhZHkgPSAhaW5jbHVzaW9uVHJlZS5uZXh0TGV2ZWwoKTsKKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CisgICAgICAgICAgICAgICAgICBjb2RlYmxvY2suaW5jbHVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgY29kZWJsb2NrSW5jbHVkZWQgPSBmaXJzdFRpbWVJbmNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluY2x1c2lvblRyZWUuaW5jcmVtZW50VmFsdWUobGF5ZXJOdW1iZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb2RlYmxvY2tJbmNsdWRlZCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0VGltZUluY2x1c2lvbikgeworICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlID0gcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWU7CisgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUucmVzZXQoY29kZWJsb2NrQ29sdW1uLCBjb2RlYmxvY2tSb3cpOworCisgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgeworICAgICAgICAgICAgICB2YWx1ZVJlYWR5ID0gIXplcm9CaXRQbGFuZXNUcmVlLm5leHRMZXZlbCgpOworCisgICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlLmluY3JlbWVudFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMgPSB6ZXJvQml0UGxhbmVzVHJlZS52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBjb2RpbmdwYXNzZXMgPSByZWFkQ29kaW5ncGFzc2VzKCk7CisKKyAgICAgICAgd2hpbGUgKHJlYWRCaXRzKDEpKSB7CisgICAgICAgICAgY29kZWJsb2NrLkxibG9jaysrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNvZGluZ3Bhc3Nlc0xvZzIgPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoY29kaW5ncGFzc2VzKTsKKyAgICAgICAgdmFyIGJpdHMgPSAoY29kaW5ncGFzc2VzIDwgMSA8PCBjb2RpbmdwYXNzZXNMb2cyID8gY29kaW5ncGFzc2VzTG9nMiAtIDEgOiBjb2RpbmdwYXNzZXNMb2cyKSArIGNvZGVibG9jay5MYmxvY2s7CisgICAgICAgIHZhciBjb2RlZERhdGFMZW5ndGggPSByZWFkQml0cyhiaXRzKTsKKyAgICAgICAgcXVldWUucHVzaCh7CisgICAgICAgICAgY29kZWJsb2NrOiBjb2RlYmxvY2ssCisgICAgICAgICAgY29kaW5ncGFzc2VzOiBjb2RpbmdwYXNzZXMsCisgICAgICAgICAgZGF0YUxlbmd0aDogY29kZWREYXRhTGVuZ3RoCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBhbGlnblRvQnl0ZSgpOworCisgICAgICBpZiAoZXBoTWFya2VyVXNlZCkgeworICAgICAgICBza2lwTWFya2VySWZFcXVhbCgweDkyKTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdmFyIHBhY2tldEl0ZW0gPSBxdWV1ZS5zaGlmdCgpOworICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXRJdGVtLmNvZGVibG9jazsKKworICAgICAgICBpZiAoY29kZWJsb2NrLmRhdGEgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGNvZGVibG9jay5kYXRhID0gW107CisgICAgICAgIH0KKworICAgICAgICBjb2RlYmxvY2suZGF0YS5wdXNoKHsKKyAgICAgICAgICBkYXRhOiBkYXRhLAorICAgICAgICAgIHN0YXJ0OiBvZmZzZXQgKyBwb3NpdGlvbiwKKyAgICAgICAgICBlbmQ6IG9mZnNldCArIHBvc2l0aW9uICsgcGFja2V0SXRlbS5kYXRhTGVuZ3RoLAorICAgICAgICAgIGNvZGluZ3Bhc3NlczogcGFja2V0SXRlbS5jb2RpbmdwYXNzZXMKKyAgICAgICAgfSk7CisgICAgICAgIHBvc2l0aW9uICs9IHBhY2tldEl0ZW0uZGF0YUxlbmd0aDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcG9zaXRpb247CisgIH0KKworICBmdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKGNvZWZmaWNpZW50cywgbGV2ZWxXaWR0aCwgbGV2ZWxIZWlnaHQsIHN1YmJhbmQsIGRlbHRhLCBtYiwgcmV2ZXJzaWJsZSwgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCkgeworICAgIHZhciB4MCA9IHN1YmJhbmQudGJ4MDsKKyAgICB2YXIgeTAgPSBzdWJiYW5kLnRieTA7CisgICAgdmFyIHdpZHRoID0gc3ViYmFuZC50YngxIC0gc3ViYmFuZC50YngwOworICAgIHZhciBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzOworICAgIHZhciByaWdodCA9IHN1YmJhbmQudHlwZS5jaGFyQXQoMCkgPT09ICJIIiA/IDEgOiAwOworICAgIHZhciBib3R0b20gPSBzdWJiYW5kLnR5cGUuY2hhckF0KDEpID09PSAiSCIgPyBsZXZlbFdpZHRoIDogMDsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgdmFyIGNvZGVibG9jayA9IGNvZGVibG9ja3NbaV07CisgICAgICB2YXIgYmxvY2tXaWR0aCA9IGNvZGVibG9jay50YngxXyAtIGNvZGVibG9jay50YngwXzsKKyAgICAgIHZhciBibG9ja0hlaWdodCA9IGNvZGVibG9jay50YnkxXyAtIGNvZGVibG9jay50YnkwXzsKKworICAgICAgaWYgKGJsb2NrV2lkdGggPT09IDAgfHwgYmxvY2tIZWlnaHQgPT09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjb2RlYmxvY2suZGF0YSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgYml0TW9kZWwsIGN1cnJlbnRDb2RpbmdwYXNzVHlwZTsKKyAgICAgIGJpdE1vZGVsID0gbmV3IEJpdE1vZGVsKGJsb2NrV2lkdGgsIGJsb2NrSGVpZ2h0LCBjb2RlYmxvY2suc3ViYmFuZFR5cGUsIGNvZGVibG9jay56ZXJvQml0UGxhbmVzLCBtYik7CisgICAgICBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAyOworICAgICAgdmFyIGRhdGEgPSBjb2RlYmxvY2suZGF0YSwKKyAgICAgICAgICB0b3RhbExlbmd0aCA9IDAsCisgICAgICAgICAgY29kaW5ncGFzc2VzID0gMDsKKyAgICAgIHZhciBqLCBqaiwgZGF0YUl0ZW07CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTsKKyAgICAgICAgdG90YWxMZW5ndGggKz0gZGF0YUl0ZW0uZW5kIC0gZGF0YUl0ZW0uc3RhcnQ7CisgICAgICAgIGNvZGluZ3Bhc3NlcyArPSBkYXRhSXRlbS5jb2RpbmdwYXNzZXM7CisgICAgICB9CisKKyAgICAgIHZhciBlbmNvZGVkRGF0YSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKKyAgICAgIHZhciBwb3NpdGlvbiA9IDA7CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTsKKyAgICAgICAgdmFyIGNodW5rID0gZGF0YUl0ZW0uZGF0YS5zdWJhcnJheShkYXRhSXRlbS5zdGFydCwgZGF0YUl0ZW0uZW5kKTsKKyAgICAgICAgZW5jb2RlZERhdGEuc2V0KGNodW5rLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IGNodW5rLmxlbmd0aDsKKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kZXIgPSBuZXcgX2FyaXRobWV0aWNfZGVjb2Rlci5Bcml0aG1ldGljRGVjb2RlcihlbmNvZGVkRGF0YSwgMCwgdG90YWxMZW5ndGgpOworICAgICAgYml0TW9kZWwuc2V0RGVjb2RlcihkZWNvZGVyKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGluZ3Bhc3NlczsgaisrKSB7CisgICAgICAgIHN3aXRjaCAoY3VycmVudENvZGluZ3Bhc3NUeXBlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgYml0TW9kZWwucnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGJpdE1vZGVsLnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGJpdE1vZGVsLnJ1bkNsZWFudXBQYXNzKCk7CisKKyAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25TeW1ib2xVc2VkKSB7CisgICAgICAgICAgICAgIGJpdE1vZGVsLmNoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudENvZGluZ3Bhc3NUeXBlID0gKGN1cnJlbnRDb2RpbmdwYXNzVHlwZSArIDEpICUgMzsKKyAgICAgIH0KKworICAgICAgdmFyIG9mZnNldCA9IGNvZGVibG9jay50YngwXyAtIHgwICsgKGNvZGVibG9jay50YnkwXyAtIHkwKSAqIHdpZHRoOworICAgICAgdmFyIHNpZ24gPSBiaXRNb2RlbC5jb2VmZmljZW50c1NpZ247CisgICAgICB2YXIgbWFnbml0dWRlID0gYml0TW9kZWwuY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICB2YXIgYml0c0RlY29kZWQgPSBiaXRNb2RlbC5iaXRzRGVjb2RlZDsKKyAgICAgIHZhciBtYWduaXR1ZGVDb3JyZWN0aW9uID0gcmV2ZXJzaWJsZSA/IDAgOiAwLjU7CisgICAgICB2YXIgaywgbiwgbmI7CisgICAgICBwb3NpdGlvbiA9IDA7CisgICAgICB2YXIgaW50ZXJsZWF2ZSA9IHN1YmJhbmQudHlwZSAhPT0gIkxMIjsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2NrSGVpZ2h0OyBqKyspIHsKKyAgICAgICAgdmFyIHJvdyA9IG9mZnNldCAvIHdpZHRoIHwgMDsKKyAgICAgICAgdmFyIGxldmVsT2Zmc2V0ID0gMiAqIHJvdyAqIChsZXZlbFdpZHRoIC0gd2lkdGgpICsgcmlnaHQgKyBib3R0b207CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGJsb2NrV2lkdGg7IGsrKykgeworICAgICAgICAgIG4gPSBtYWduaXR1ZGVbcG9zaXRpb25dOworCisgICAgICAgICAgaWYgKG4gIT09IDApIHsKKyAgICAgICAgICAgIG4gPSAobiArIG1hZ25pdHVkZUNvcnJlY3Rpb24pICogZGVsdGE7CisKKyAgICAgICAgICAgIGlmIChzaWduW3Bvc2l0aW9uXSAhPT0gMCkgeworICAgICAgICAgICAgICBuID0gLW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5iID0gYml0c0RlY29kZWRbcG9zaXRpb25dOworICAgICAgICAgICAgdmFyIHBvcyA9IGludGVybGVhdmUgPyBsZXZlbE9mZnNldCArIChvZmZzZXQgPDwgMSkgOiBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChyZXZlcnNpYmxlICYmIG5iID49IG1iKSB7CisgICAgICAgICAgICAgIGNvZWZmaWNpZW50c1twb3NdID0gbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNvZWZmaWNpZW50c1twb3NdID0gbiAqICgxIDw8IG1iIC0gbmIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gd2lkdGggLSBibG9ja1dpZHRoOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYykgeworICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgdmFyIGNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7CisgICAgdmFyIHF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVyczsKKyAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKKyAgICB2YXIgc3BxY2RzID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5TUHFjZHM7CisgICAgdmFyIHNjYWxhckV4cG91bmRlZCA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuc2NhbGFyRXhwb3VuZGVkOworICAgIHZhciBndWFyZEJpdHMgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLmd1YXJkQml0czsKKyAgICB2YXIgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCA9IGNvZGluZ1N0eWxlUGFyYW1ldGVycy5zZWdtZW50YXRpb25TeW1ib2xVc2VkOworICAgIHZhciBwcmVjaXNpb24gPSBjb250ZXh0LmNvbXBvbmVudHNbY10ucHJlY2lzaW9uOworICAgIHZhciByZXZlcnNpYmxlID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbjsKKyAgICB2YXIgdHJhbnNmb3JtID0gcmV2ZXJzaWJsZSA/IG5ldyBSZXZlcnNpYmxlVHJhbnNmb3JtKCkgOiBuZXcgSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCk7CisgICAgdmFyIHN1YmJhbmRDb2VmZmljaWVudHMgPSBbXTsKKyAgICB2YXIgYiA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IGkrKykgeworICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbaV07CisgICAgICB2YXIgd2lkdGggPSByZXNvbHV0aW9uLnRyeDEgLSByZXNvbHV0aW9uLnRyeDA7CisgICAgICB2YXIgaGVpZ2h0ID0gcmVzb2x1dGlvbi50cnkxIC0gcmVzb2x1dGlvbi50cnkwOworICAgICAgdmFyIGNvZWZmaWNpZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiBoZWlnaHQpOworCisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSByZXNvbHV0aW9uLnN1YmJhbmRzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgdmFyIG11LCBlcHNpbG9uOworCisgICAgICAgIGlmICghc2NhbGFyRXhwb3VuZGVkKSB7CisgICAgICAgICAgbXUgPSBzcHFjZHNbMF0ubXU7CisgICAgICAgICAgZXBzaWxvbiA9IHNwcWNkc1swXS5lcHNpbG9uICsgKGkgPiAwID8gMSAtIGkgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtdSA9IHNwcWNkc1tiXS5tdTsKKyAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzW2JdLmVwc2lsb247CisgICAgICAgICAgYisrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN1YmJhbmQgPSByZXNvbHV0aW9uLnN1YmJhbmRzW2pdOworICAgICAgICB2YXIgZ2FpbkxvZzIgPSBTdWJiYW5kc0dhaW5Mb2cyW3N1YmJhbmQudHlwZV07CisgICAgICAgIHZhciBkZWx0YSA9IHJldmVyc2libGUgPyAxIDogTWF0aC5wb3coMiwgcHJlY2lzaW9uICsgZ2FpbkxvZzIgLSBlcHNpbG9uKSAqICgxICsgbXUgLyAyMDQ4KTsKKyAgICAgICAgdmFyIG1iID0gZ3VhcmRCaXRzICsgZXBzaWxvbiAtIDE7CisgICAgICAgIGNvcHlDb2VmZmljaWVudHMoY29lZmZpY2llbnRzLCB3aWR0aCwgaGVpZ2h0LCBzdWJiYW5kLCBkZWx0YSwgbWIsIHJldmVyc2libGUsIHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpOworICAgICAgfQorCisgICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLnB1c2goeworICAgICAgICB3aWR0aDogd2lkdGgsCisgICAgICAgIGhlaWdodDogaGVpZ2h0LAorICAgICAgICBpdGVtczogY29lZmZpY2llbnRzCisgICAgICB9KTsKKyAgICB9CisKKyAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtLmNhbGN1bGF0ZShzdWJiYW5kQ29lZmZpY2llbnRzLCBjb21wb25lbnQudGN4MCwgY29tcG9uZW50LnRjeTApOworICAgIHJldHVybiB7CisgICAgICBsZWZ0OiBjb21wb25lbnQudGN4MCwKKyAgICAgIHRvcDogY29tcG9uZW50LnRjeTAsCisgICAgICB3aWR0aDogcmVzdWx0LndpZHRoLAorICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LAorICAgICAgaXRlbXM6IHJlc3VsdC5pdGVtcworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB0cmFuc2Zvcm1Db21wb25lbnRzKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIGNvbXBvbmVudHMgPSBjb250ZXh0LmNvbXBvbmVudHM7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciByZXN1bHRJbWFnZXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbnRleHQudGlsZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW2ldOworICAgICAgdmFyIHRyYW5zZm9ybWVkVGlsZXMgPSBbXTsKKyAgICAgIHZhciBjOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgdHJhbnNmb3JtZWRUaWxlc1tjXSA9IHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYyk7CisgICAgICB9CisKKyAgICAgIHZhciB0aWxlMCA9IHRyYW5zZm9ybWVkVGlsZXNbMF07CisgICAgICB2YXIgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRpbGUwLml0ZW1zLmxlbmd0aCAqIGNvbXBvbmVudHNDb3VudCk7CisgICAgICB2YXIgcmVzdWx0ID0geworICAgICAgICBsZWZ0OiB0aWxlMC5sZWZ0LAorICAgICAgICB0b3A6IHRpbGUwLnRvcCwKKyAgICAgICAgd2lkdGg6IHRpbGUwLndpZHRoLAorICAgICAgICBoZWlnaHQ6IHRpbGUwLmhlaWdodCwKKyAgICAgICAgaXRlbXM6IG91dAorICAgICAgfTsKKyAgICAgIHZhciBzaGlmdCwgb2Zmc2V0OworICAgICAgdmFyIHBvcyA9IDAsCisgICAgICAgICAgaiwKKyAgICAgICAgICBqaiwKKyAgICAgICAgICB5MCwKKyAgICAgICAgICB5MSwKKyAgICAgICAgICB5MjsKKworICAgICAgaWYgKHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSkgeworICAgICAgICB2YXIgZm91ckNvbXBvbmVudHMgPSBjb21wb25lbnRzQ291bnQgPT09IDQ7CisgICAgICAgIHZhciB5MGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1swXS5pdGVtczsKKyAgICAgICAgdmFyIHkxaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzFdLml0ZW1zOworICAgICAgICB2YXIgeTJpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMl0uaXRlbXM7CisgICAgICAgIHZhciB5M2l0ZW1zID0gZm91ckNvbXBvbmVudHMgPyB0cmFuc2Zvcm1lZFRpbGVzWzNdLml0ZW1zIDogbnVsbDsKKyAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzWzBdLnByZWNpc2lvbiAtIDg7CisgICAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41OworICAgICAgICB2YXIgY29tcG9uZW50MCA9IHRpbGUuY29tcG9uZW50c1swXTsKKyAgICAgICAgdmFyIGFscGhhMDEgPSBjb21wb25lbnRzQ291bnQgLSAzOworICAgICAgICBqaiA9IHkwaXRlbXMubGVuZ3RoOworCisgICAgICAgIGlmICghY29tcG9uZW50MC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7CisgICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7CisgICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07CisgICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07CisgICAgICAgICAgICBvdXRbcG9zKytdID0geTAgKyAxLjQwMiAqIHkyID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IHkwIC0gMC4zNDQxMyAqIHkxIC0gMC43MTQxNCAqIHkyID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IHkwICsgMS43NzIgKiB5MSA+PiBzaGlmdDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7CisgICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7CisgICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07CisgICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07CisgICAgICAgICAgICB2YXIgZyA9IHkwIC0gKHkyICsgeTEgPj4gMik7CisgICAgICAgICAgICBvdXRbcG9zKytdID0gZyArIHkyID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IGcgPj4gc2hpZnQ7CisgICAgICAgICAgICBvdXRbcG9zKytdID0gZyArIHkxID4+IHNoaWZ0OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3VyQ29tcG9uZW50cykgeworICAgICAgICAgIGZvciAoaiA9IDAsIHBvcyA9IDM7IGogPCBqajsgaisrLCBwb3MgKz0gNCkgeworICAgICAgICAgICAgb3V0W3Bvc10gPSB5M2l0ZW1zW2pdICsgb2Zmc2V0ID4+IHNoaWZ0OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICAgICAgdmFyIGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1tjXS5pdGVtczsKKyAgICAgICAgICBzaGlmdCA9IGNvbXBvbmVudHNbY10ucHJlY2lzaW9uIC0gODsKKyAgICAgICAgICBvZmZzZXQgPSAoMTI4IDw8IHNoaWZ0KSArIDAuNTsKKworICAgICAgICAgIGZvciAocG9zID0gYywgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgb3V0W3Bvc10gPSBpdGVtc1tqXSArIG9mZnNldCA+PiBzaGlmdDsKKyAgICAgICAgICAgIHBvcyArPSBjb21wb25lbnRzQ291bnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlc3VsdEltYWdlcy5wdXNoKHJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdEltYWdlczsKKyAgfQorCisgIGZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGNvbnRleHQsIHRpbGVJbmRleCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisKKyAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgdmFyIHFjZE9yUWNjID0gY29udGV4dC5jdXJyZW50VGlsZS5RQ0NbY10gIT09IHVuZGVmaW5lZCA/IGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdIDogY29udGV4dC5jdXJyZW50VGlsZS5RQ0Q7CisgICAgICBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVycyA9IHFjZE9yUWNjOworICAgICAgdmFyIGNvZE9yQ29jID0gY29udGV4dC5jdXJyZW50VGlsZS5DT0NbY10gIT09IHVuZGVmaW5lZCA/IGNvbnRleHQuY3VycmVudFRpbGUuQ09DW2NdIDogY29udGV4dC5jdXJyZW50VGlsZS5DT0Q7CisgICAgICBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzID0gY29kT3JDb2M7CisgICAgfQorCisgICAgdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzID0gY29udGV4dC5jdXJyZW50VGlsZS5DT0Q7CisgIH0KKworICB2YXIgVGFnVHJlZSA9IGZ1bmN0aW9uIFRhZ1RyZWVDbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFRhZ1RyZWUod2lkdGgsIGhlaWdodCkgeworICAgICAgdmFyIGxldmVsc0xlbmd0aCA9ICgwLCBfY29yZV91dGlscy5sb2cyKShNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSkgKyAxOworICAgICAgdGhpcy5sZXZlbHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgbGV2ZWwgPSB7CisgICAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAorICAgICAgICAgIGl0ZW1zOiBbXQorICAgICAgICB9OworICAgICAgICB0aGlzLmxldmVscy5wdXNoKGxldmVsKTsKKyAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwod2lkdGggLyAyKTsKKyAgICAgICAgaGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCAvIDIpOworICAgICAgfQorICAgIH0KKworICAgIFRhZ1RyZWUucHJvdG90eXBlID0geworICAgICAgcmVzZXQ6IGZ1bmN0aW9uIFRhZ1RyZWVfcmVzZXQoaSwgaikgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gMCwKKyAgICAgICAgICAgIHZhbHVlID0gMCwKKyAgICAgICAgICAgIGxldmVsOworCisgICAgICAgIHdoaWxlIChjdXJyZW50TGV2ZWwgPCB0aGlzLmxldmVscy5sZW5ndGgpIHsKKyAgICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgICAgdmFyIGluZGV4ID0gaSArIGogKiBsZXZlbC53aWR0aDsKKworICAgICAgICAgIGlmIChsZXZlbC5pdGVtc1tpbmRleF0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsZXZlbC5pbmRleCA9IGluZGV4OworICAgICAgICAgIGkgPj49IDE7CisgICAgICAgICAgaiA+Pj0gMTsKKyAgICAgICAgICBjdXJyZW50TGV2ZWwrKzsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRMZXZlbC0tOworICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlOworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgZGVsZXRlIHRoaXMudmFsdWU7CisgICAgICB9LAorICAgICAgaW5jcmVtZW50VmFsdWU6IGZ1bmN0aW9uIFRhZ1RyZWVfaW5jcmVtZW50VmFsdWUoKSB7CisgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdKys7CisgICAgICB9LAorICAgICAgbmV4dExldmVsOiBmdW5jdGlvbiBUYWdUcmVlX25leHRMZXZlbCgpIHsKKyAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IHRoaXMuY3VycmVudExldmVsOworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07CisgICAgICAgIGN1cnJlbnRMZXZlbC0tOworCisgICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPCAwKSB7CisgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsOworICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9OworICAgIHJldHVybiBUYWdUcmVlOworICB9KCk7CisKKyAgdmFyIEluY2x1c2lvblRyZWUgPSBmdW5jdGlvbiBJbmNsdXNpb25UcmVlQ2xvc3VyZSgpIHsKKyAgICBmdW5jdGlvbiBJbmNsdXNpb25UcmVlKHdpZHRoLCBoZWlnaHQsIGRlZmF1bHRWYWx1ZSkgeworICAgICAgdmFyIGxldmVsc0xlbmd0aCA9ICgwLCBfY29yZV91dGlscy5sb2cyKShNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSkgKyAxOworICAgICAgdGhpcy5sZXZlbHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgaXRlbXMgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7CisKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgIGl0ZW1zW2pdID0gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxldmVsID0geworICAgICAgICAgIHdpZHRoOiB3aWR0aCwKKyAgICAgICAgICBoZWlnaHQ6IGhlaWdodCwKKyAgICAgICAgICBpdGVtczogaXRlbXMKKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7CisgICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7CisgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBJbmNsdXNpb25UcmVlLnByb3RvdHlwZSA9IHsKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Jlc2V0KGksIGosIHN0b3BWYWx1ZSkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gMDsKKworICAgICAgICB3aGlsZSAoY3VycmVudExldmVsIDwgdGhpcy5sZXZlbHMubGVuZ3RoKSB7CisgICAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoOworICAgICAgICAgIGxldmVsLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgdmFyIHZhbHVlID0gbGV2ZWwuaXRlbXNbaW5kZXhdOworCisgICAgICAgICAgaWYgKHZhbHVlID09PSAweGZmKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodmFsdWUgPiBzdG9wVmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsOworICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpID4+PSAxOworICAgICAgICAgIGogPj49IDE7CisgICAgICAgICAgY3VycmVudExldmVsKys7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbCAtIDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSwKKyAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKHN0b3BWYWx1ZSkgeworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHN0b3BWYWx1ZSArIDE7CisgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7CisgICAgICB9LAorICAgICAgcHJvcGFnYXRlVmFsdWVzOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Byb3BhZ2F0ZVZhbHVlcygpIHsKKyAgICAgICAgdmFyIGxldmVsSW5kZXggPSB0aGlzLmN1cnJlbnRMZXZlbDsKKyAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07CisgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07CisKKyAgICAgICAgd2hpbGUgKC0tbGV2ZWxJbmRleCA+PSAwKSB7CisgICAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tsZXZlbEluZGV4XTsKKyAgICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSBjdXJyZW50VmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBuZXh0TGV2ZWw6IGZ1bmN0aW9uIEluY2x1c2lvblRyZWVfbmV4dExldmVsKCkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gdGhpcy5jdXJyZW50TGV2ZWw7CisgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gMHhmZjsKKyAgICAgICAgY3VycmVudExldmVsLS07CisKKyAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA8IDApIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gSW5jbHVzaW9uVHJlZTsKKyAgfSgpOworCisgIHZhciBCaXRNb2RlbCA9IGZ1bmN0aW9uIEJpdE1vZGVsQ2xvc3VyZSgpIHsKKyAgICB2YXIgVU5JRk9STV9DT05URVhUID0gMTc7CisgICAgdmFyIFJVTkxFTkdUSF9DT05URVhUID0gMTg7CisgICAgdmFyIExMQW5kTEhDb250ZXh0c0xhYmVsID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDUsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDEsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDhdKTsKKyAgICB2YXIgSExDb250ZXh0TGFiZWwgPSBuZXcgVWludDhBcnJheShbMCwgMywgNCwgMCwgNSwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMSwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOF0pOworICAgIHZhciBISENvbnRleHRMYWJlbCA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAyLCAwLCAxLCAyLCAyLCAwLCAyLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAzLCA0LCA1LCAwLCA0LCA1LCA1LCAwLCA1LCA1LCA1LCAwLCAwLCAwLCAwLCAwLCA2LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4XSk7CisKKyAgICBmdW5jdGlvbiBCaXRNb2RlbCh3aWR0aCwgaGVpZ2h0LCBzdWJiYW5kLCB6ZXJvQml0UGxhbmVzLCBtYikgeworICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICB2YXIgY29udGV4dExhYmVsVGFibGU7CisKKyAgICAgIGlmIChzdWJiYW5kID09PSAiSEgiKSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gSEhDb250ZXh0TGFiZWw7CisgICAgICB9IGVsc2UgaWYgKHN1YmJhbmQgPT09ICJITCIpIHsKKyAgICAgICAgY29udGV4dExhYmVsVGFibGUgPSBITENvbnRleHRMYWJlbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gTExBbmRMSENvbnRleHRzTGFiZWw7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29udGV4dExhYmVsVGFibGUgPSBjb250ZXh0TGFiZWxUYWJsZTsKKyAgICAgIHZhciBjb2VmZmljaWVudENvdW50ID0gd2lkdGggKiBoZWlnaHQ7CisgICAgICB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpOworICAgICAgdGhpcy5jb2VmZmljZW50c1NpZ24gPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZTsKKworICAgICAgaWYgKG1iID4gMTQpIHsKKyAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDMyQXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9IGVsc2UgaWYgKG1iID4gNikgeworICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50MTZBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUgPSBjb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgIHRoaXMucHJvY2Vzc2luZ0ZsYWdzID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB2YXIgYml0c0RlY29kZWQgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKworICAgICAgaWYgKHplcm9CaXRQbGFuZXMgIT09IDApIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2VmZmljaWVudENvdW50OyBpKyspIHsKKyAgICAgICAgICBiaXRzRGVjb2RlZFtpXSA9IHplcm9CaXRQbGFuZXM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5iaXRzRGVjb2RlZCA9IGJpdHNEZWNvZGVkOworICAgICAgdGhpcy5yZXNldCgpOworICAgIH0KKworICAgIEJpdE1vZGVsLnByb3RvdHlwZSA9IHsKKyAgICAgIHNldERlY29kZXI6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldERlY29kZXIoZGVjb2RlcikgeworICAgICAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyOworICAgICAgfSwKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBCaXRNb2RlbF9yZXNldCgpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0cyA9IG5ldyBJbnQ4QXJyYXkoMTkpOworICAgICAgICB0aGlzLmNvbnRleHRzWzBdID0gNCA8PCAxIHwgMDsKKyAgICAgICAgdGhpcy5jb250ZXh0c1tVTklGT1JNX0NPTlRFWFRdID0gNDYgPDwgMSB8IDA7CisgICAgICAgIHRoaXMuY29udGV4dHNbUlVOTEVOR1RIX0NPTlRFWFRdID0gMyA8PCAxIHwgMDsKKyAgICAgIH0sCisgICAgICBzZXROZWlnaGJvcnNTaWduaWZpY2FuY2U6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldE5laWdoYm9yc1NpZ25pZmljYW5jZShyb3csIGNvbHVtbiwgaW5kZXgpIHsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBsZWZ0ID0gY29sdW1uID4gMDsKKyAgICAgICAgdmFyIHJpZ2h0ID0gY29sdW1uICsgMSA8IHdpZHRoOworICAgICAgICB2YXIgaTsKKworICAgICAgICBpZiAocm93ID4gMCkgeworICAgICAgICAgIGkgPSBpbmRleCAtIHdpZHRoOworCisgICAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmlnaHQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaV0gKz0gMHgwNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0KSB7CisgICAgICAgICAgaSA9IGluZGV4ICsgd2lkdGg7CisKKyAgICAgICAgICBpZiAobGVmdCkgeworICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgLSAxXSArPSAweDEwOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyaWdodCkgeworICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgKyAxXSArPSAweDEwOworICAgICAgICAgIH0KKworICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpXSArPSAweDA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXggLSAxXSArPSAweDAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJpZ2h0KSB7CisgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4ICsgMV0gKz0gMHgwMTsKKyAgICAgICAgfQorCisgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gfD0gMHg4MDsKKyAgICAgIH0sCisgICAgICBydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduOworICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CisgICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKKyAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0czsKKyAgICAgICAgdmFyIGxhYmVscyA9IHRoaXMuY29udGV4dExhYmVsVGFibGU7CisgICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CisgICAgICAgIHZhciBwcm9jZXNzZWRJbnZlcnNlTWFzayA9IH4xOworICAgICAgICB2YXIgcHJvY2Vzc2VkTWFzayA9IDE7CisgICAgICAgIHZhciBmaXJzdE1hZ25pdHVkZUJpdE1hc2sgPSAyOworCisgICAgICAgIGZvciAodmFyIGkwID0gMDsgaTAgPCBoZWlnaHQ7IGkwICs9IDQpIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBpbmRleCA9IGkwICogd2lkdGggKyBqOworCisgICAgICAgICAgICBmb3IgKHZhciBpMSA9IDA7IGkxIDwgNDsgaTErKywgaW5kZXggKz0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgdmFyIGkgPSBpMCArIGkxOworCisgICAgICAgICAgICAgIGlmIChpID49IGhlaWdodCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmPSBwcm9jZXNzZWRJbnZlcnNlTWFzazsKKworICAgICAgICAgICAgICBpZiAoY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8ICFuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dOworICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisKKyAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uKSB7CisgICAgICAgICAgICAgICAgdmFyIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gcHJvY2Vzc2VkTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBkZWNvZGVTaWduQml0OiBmdW5jdGlvbiBCaXRNb2RlbF9kZWNvZGVTaWduQml0KHJvdywgY29sdW1uLCBpbmRleCkgeworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjsKKyAgICAgICAgdmFyIGNvbnRyaWJ1dGlvbiwgc2lnbjAsIHNpZ24xLCBzaWduaWZpY2FuY2UxOworICAgICAgICB2YXIgY29udGV4dExhYmVsLCBkZWNvZGVkOworICAgICAgICBzaWduaWZpY2FuY2UxID0gY29sdW1uID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIDFdICE9PSAwOworCisgICAgICAgIGlmIChjb2x1bW4gKyAxIDwgd2lkdGggJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyAxXSAhPT0gMCkgeworICAgICAgICAgIHNpZ24xID0gY29lZmZpY2VudHNTaWduW2luZGV4ICsgMV07CisKKyAgICAgICAgICBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSAxXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gMV07CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBob3Jpem9udGFsQ29udHJpYnV0aW9uID0gMyAqIGNvbnRyaWJ1dGlvbjsKKyAgICAgICAgc2lnbmlmaWNhbmNlMSA9IHJvdyA+IDAgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggLSB3aWR0aF0gIT09IDA7CisKKyAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyB3aWR0aF0gIT09IDApIHsKKyAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIHdpZHRoXTsKKworICAgICAgICAgIGlmIChzaWduaWZpY2FuY2UxKSB7CisgICAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIHdpZHRoXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjEgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzaWduaWZpY2FuY2UxKSB7CisgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSB3aWR0aF07CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjAgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IGhvcml6b250YWxDb250cmlidXRpb247CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udHJpYnV0aW9uID49IDApIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSA5ICsgY29udHJpYnV0aW9uOworICAgICAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRleHRMYWJlbCA9IDkgLSBjb250cmlidXRpb247CisgICAgICAgICAgZGVjb2RlZCA9IHRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsIGNvbnRleHRMYWJlbCkgXiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlY29kZWQ7CisgICAgICB9LAorICAgICAgcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCkgeworICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjsKKyAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CisgICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKKyAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxOworICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjsKKyAgICAgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB2YXIgd2lkdGg0ID0gd2lkdGggKiA0OworCisgICAgICAgIGZvciAodmFyIGluZGV4MCA9IDAsIGluZGV4TmV4dDsgaW5kZXgwIDwgbGVuZ3RoOyBpbmRleDAgPSBpbmRleE5leHQpIHsKKyAgICAgICAgICBpbmRleE5leHQgPSBNYXRoLm1pbihsZW5ndGgsIGluZGV4MCArIHdpZHRoNCk7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gaW5kZXgwICsgajsgaW5kZXggPCBpbmRleE5leHQ7IGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgIGlmICghY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8IChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSAxNjsKKworICAgICAgICAgICAgICBpZiAoKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBmaXJzdE1hZ25pdHVkZUJpdE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSBePSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gJiAxMjc7CisgICAgICAgICAgICAgICAgY29udGV4dExhYmVsID0gc2lnbmlmaWNhbmNlID09PSAwID8gMTUgOiAxNDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA8PCAxIHwgYml0OworICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBwcm9jZXNzZWRNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHJ1bkNsZWFudXBQYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5DbGVhbnVwUGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBsYWJlbHMgPSB0aGlzLmNvbnRleHRMYWJlbFRhYmxlOworICAgICAgICB2YXIgYml0c0RlY29kZWQgPSB0aGlzLmJpdHNEZWNvZGVkOworICAgICAgICB2YXIgcHJvY2Vzc2luZ0ZsYWdzID0gdGhpcy5wcm9jZXNzaW5nRmxhZ3M7CisgICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTsKKyAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7CisgICAgICAgIHZhciBvbmVSb3dEb3duID0gd2lkdGg7CisgICAgICAgIHZhciB0d29Sb3dzRG93biA9IHdpZHRoICogMjsKKyAgICAgICAgdmFyIHRocmVlUm93c0Rvd24gPSB3aWR0aCAqIDM7CisgICAgICAgIHZhciBpTmV4dDsKKworICAgICAgICBmb3IgKHZhciBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCA9IGlOZXh0KSB7CisgICAgICAgICAgaU5leHQgPSBNYXRoLm1pbihpMCArIDQsIGhlaWdodCk7CisgICAgICAgICAgdmFyIGluZGV4QmFzZSA9IGkwICogd2lkdGg7CisgICAgICAgICAgdmFyIGNoZWNrQWxsRW1wdHkgPSBpMCArIDMgPCBoZWlnaHQ7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBpbmRleDAgPSBpbmRleEJhc2UgKyBqOworICAgICAgICAgICAgdmFyIGFsbEVtcHR5ID0gY2hlY2tBbGxFbXB0eSAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwXSA9PT0gMCAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgb25lUm93RG93bl0gPT09IDAgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHR3b1Jvd3NEb3duXSA9PT0gMCAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgdGhyZWVSb3dzRG93bl0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MF0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwOworICAgICAgICAgICAgdmFyIGkxID0gMCwKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4MDsKKyAgICAgICAgICAgIHZhciBpID0gaTAsCisgICAgICAgICAgICAgICAgc2lnbjsKKworICAgICAgICAgICAgaWYgKGFsbEVtcHR5KSB7CisgICAgICAgICAgICAgIHZhciBoYXNTaWduaWZpY2FudENvZWZmaWNlbnQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFJVTkxFTkdUSF9DT05URVhUKTsKKworICAgICAgICAgICAgICBpZiAoIWhhc1NpZ25pZmljYW50Q29lZmZpY2VudCkgeworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MF0rKzsKKyAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleDAgKyBvbmVSb3dEb3duXSsrOworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHR3b1Jvd3NEb3duXSsrOworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHRocmVlUm93c0Rvd25dKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpMSA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpOworCisgICAgICAgICAgICAgIGlmIChpMSAhPT0gMCkgeworICAgICAgICAgICAgICAgIGkgPSBpMCArIGkxOworICAgICAgICAgICAgICAgIGluZGV4ICs9IGkxICogd2lkdGg7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzaWduID0gdGhpcy5kZWNvZGVTaWduQml0KGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgIHRoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwOworCisgICAgICAgICAgICAgIGZvciAodmFyIGkyID0gaTA7IGkyIDw9IGk7IGkyKyssIGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpMSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSBpMCArIGkxOyBpIDwgaU5leHQ7IGkrKywgaW5kZXggKz0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fCAocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIHByb2Nlc3NlZE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dOworICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisKKyAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uID09PSAxKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CisgICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBjaGVja1NlZ21lbnRhdGlvblN5bWJvbDogZnVuY3Rpb24gQml0TW9kZWxfY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKSB7CisgICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyOworICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOworICAgICAgICB2YXIgc3ltYm9sID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpIDw8IDMgfCBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMiB8IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpOworCisgICAgICAgIGlmIChzeW1ib2wgIT09IDB4YSkgeworICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiSW52YWxpZCBzZWdtZW50YXRpb24gc3ltYm9sIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIHJldHVybiBCaXRNb2RlbDsKKyAgfSgpOworCisgIHZhciBUcmFuc2Zvcm0gPSBmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFRyYW5zZm9ybSgpIHt9CisKKyAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLmNhbGN1bGF0ZSA9IGZ1bmN0aW9uIHRyYW5zZm9ybUNhbGN1bGF0ZShzdWJiYW5kcywgdTAsIHYwKSB7CisgICAgICB2YXIgbGwgPSBzdWJiYW5kc1swXTsKKworICAgICAgZm9yICh2YXIgaSA9IDEsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBsbCA9IHRoaXMuaXRlcmF0ZShsbCwgc3ViYmFuZHNbaV0sIHUwLCB2MCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBsbDsKKyAgICB9OworCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbiBleHRlbmQoYnVmZmVyLCBvZmZzZXQsIHNpemUpIHsKKyAgICAgIHZhciBpMSA9IG9mZnNldCAtIDEsCisgICAgICAgICAgajEgPSBvZmZzZXQgKyAxOworICAgICAgdmFyIGkyID0gb2Zmc2V0ICsgc2l6ZSAtIDIsCisgICAgICAgICAgajIgPSBvZmZzZXQgKyBzaXplOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxXSA9IGJ1ZmZlcltqMV07CisgICAgICBidWZmZXJbajJdID0gYnVmZmVyW2kyXTsKKyAgICB9OworCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24gVHJhbnNmb3JtX2l0ZXJhdGUobGwsIGhsX2xoX2hoLCB1MCwgdjApIHsKKyAgICAgIHZhciBsbFdpZHRoID0gbGwud2lkdGgsCisgICAgICAgICAgbGxIZWlnaHQgPSBsbC5oZWlnaHQsCisgICAgICAgICAgbGxJdGVtcyA9IGxsLml0ZW1zOworICAgICAgdmFyIHdpZHRoID0gaGxfbGhfaGgud2lkdGg7CisgICAgICB2YXIgaGVpZ2h0ID0gaGxfbGhfaGguaGVpZ2h0OworICAgICAgdmFyIGl0ZW1zID0gaGxfbGhfaGguaXRlbXM7CisgICAgICB2YXIgaSwgaiwgaywgbCwgdSwgdjsKKworICAgICAgZm9yIChrID0gMCwgaSA9IDA7IGkgPCBsbEhlaWdodDsgaSsrKSB7CisgICAgICAgIGwgPSBpICogMiAqIHdpZHRoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsbFdpZHRoOyBqKyssIGsrKywgbCArPSAyKSB7CisgICAgICAgICAgaXRlbXNbbF0gPSBsbEl0ZW1zW2tdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxsSXRlbXMgPSBsbC5pdGVtcyA9IG51bGw7CisgICAgICB2YXIgYnVmZmVyUGFkZGluZyA9IDQ7CisgICAgICB2YXIgcm93QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCArIDIgKiBidWZmZXJQYWRkaW5nKTsKKworICAgICAgaWYgKHdpZHRoID09PSAxKSB7CisgICAgICAgIGlmICgodTAgJiAxKSAhPT0gMCkgeworICAgICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKKyAgICAgICAgICAgIGl0ZW1zW2tdICo9IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKKyAgICAgICAgICByb3dCdWZmZXIuc2V0KGl0ZW1zLnN1YmFycmF5KGssIGsgKyB3aWR0aCksIGJ1ZmZlclBhZGRpbmcpOworICAgICAgICAgIHRoaXMuZXh0ZW5kKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOworICAgICAgICAgIHRoaXMuZmlsdGVyKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOworICAgICAgICAgIGl0ZW1zLnNldChyb3dCdWZmZXIuc3ViYXJyYXkoYnVmZmVyUGFkZGluZywgYnVmZmVyUGFkZGluZyArIHdpZHRoKSwgayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIG51bUJ1ZmZlcnMgPSAxNjsKKyAgICAgIHZhciBjb2xCdWZmZXJzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspIHsKKyAgICAgICAgY29sQnVmZmVycy5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoaGVpZ2h0ICsgMiAqIGJ1ZmZlclBhZGRpbmcpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGIsCisgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IDA7CisgICAgICBsbCA9IGJ1ZmZlclBhZGRpbmcgKyBoZWlnaHQ7CisKKyAgICAgIGlmIChoZWlnaHQgPT09IDEpIHsKKyAgICAgICAgaWYgKCh2MCAmIDEpICE9PSAwKSB7CisgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHsKKyAgICAgICAgICAgIGl0ZW1zW3VdICo9IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodSA9IDA7IHUgPCB3aWR0aDsgdSsrKSB7CisgICAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXIgPT09IDApIHsKKyAgICAgICAgICAgIG51bUJ1ZmZlcnMgPSBNYXRoLm1pbih3aWR0aCAtIHUsIG51bUJ1ZmZlcnMpOworCisgICAgICAgICAgICBmb3IgKGsgPSB1LCBsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGNvbEJ1ZmZlcnNbYl1bbF0gPSBpdGVtc1trICsgYl07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IG51bUJ1ZmZlcnM7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudEJ1ZmZlci0tOworICAgICAgICAgIHZhciBidWZmZXIgPSBjb2xCdWZmZXJzW2N1cnJlbnRCdWZmZXJdOworICAgICAgICAgIHRoaXMuZXh0ZW5kKGJ1ZmZlciwgYnVmZmVyUGFkZGluZywgaGVpZ2h0KTsKKyAgICAgICAgICB0aGlzLmZpbHRlcihidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7CisKKyAgICAgICAgICBpZiAoY3VycmVudEJ1ZmZlciA9PT0gMCkgeworICAgICAgICAgICAgayA9IHUgLSBudW1CdWZmZXJzICsgMTsKKworICAgICAgICAgICAgZm9yIChsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGl0ZW1zW2sgKyBiXSA9IGNvbEJ1ZmZlcnNbYl1bbF07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICBoZWlnaHQ6IGhlaWdodCwKKyAgICAgICAgaXRlbXM6IGl0ZW1zCisgICAgICB9OworICAgIH07CisKKyAgICByZXR1cm4gVHJhbnNmb3JtOworICB9KCk7CisKKyAgdmFyIElycmV2ZXJzaWJsZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIElycmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCkgeworICAgICAgVHJhbnNmb3JtLmNhbGwodGhpcyk7CisgICAgfQorCisgICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7CisKKyAgICBJcnJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGlycmV2ZXJzaWJsZVRyYW5zZm9ybUZpbHRlcih4LCBvZmZzZXQsIGxlbmd0aCkgeworICAgICAgdmFyIGxlbiA9IGxlbmd0aCA+PiAxOworICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDsKKyAgICAgIHZhciBqLCBuLCBjdXJyZW50LCBuZXh0OworICAgICAgdmFyIGFscGhhID0gLTEuNTg2MTM0MzQyMDU5OTI0OworICAgICAgdmFyIGJldGEgPSAtMC4wNTI5ODAxMTg1NzI5NjE7CisgICAgICB2YXIgZ2FtbWEgPSAwLjg4MjkxMTA3NTUzMDkzNDsKKyAgICAgIHZhciBkZWx0YSA9IDAuNDQzNTA2ODUyMDQzOTcxOworICAgICAgdmFyIEsgPSAxLjIzMDE3NDEwNDkxNDAwMTsKKyAgICAgIHZhciBLXyA9IDEgLyBLOworICAgICAgaiA9IG9mZnNldCAtIDM7CisKKyAgICAgIGZvciAobiA9IGxlbiArIDQ7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIHhbal0gKj0gS187CisgICAgICB9CisKKyAgICAgIGogPSBvZmZzZXQgLSAyOworICAgICAgY3VycmVudCA9IGRlbHRhICogeFtqIC0gMV07CisKKyAgICAgIGZvciAobiA9IGxlbiArIDM7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIG5leHQgPSBkZWx0YSAqIHhbaiArIDFdOworICAgICAgICB4W2pdID0gSyAqIHhbal0gLSBjdXJyZW50IC0gbmV4dDsKKworICAgICAgICBpZiAobi0tKSB7CisgICAgICAgICAgaiArPSAyOworICAgICAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiArIDFdOworICAgICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGogPSBvZmZzZXQgLSAxOworICAgICAgY3VycmVudCA9IGdhbW1hICogeFtqIC0gMV07CisKKyAgICAgIGZvciAobiA9IGxlbiArIDI7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIG5leHQgPSBnYW1tYSAqIHhbaiArIDFdOworICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworCisgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgY3VycmVudCA9IGdhbW1hICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBqID0gb2Zmc2V0OworICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogLSAxXTsKKworICAgICAgZm9yIChuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgbmV4dCA9IGJldGEgKiB4W2ogKyAxXTsKKyAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKworICAgICAgICBpZiAobi0tKSB7CisgICAgICAgICAgaiArPSAyOworICAgICAgICAgIGN1cnJlbnQgPSBiZXRhICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobGVuICE9PSAwKSB7CisgICAgICAgIGogPSBvZmZzZXQgKyAxOworICAgICAgICBjdXJyZW50ID0gYWxwaGEgKiB4W2ogLSAxXTsKKworICAgICAgICBmb3IgKG4gPSBsZW47IG4tLTsgaiArPSAyKSB7CisgICAgICAgICAgbmV4dCA9IGFscGhhICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKworICAgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiArIDFdOworICAgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIHJldHVybiBJcnJldmVyc2libGVUcmFuc2Zvcm07CisgIH0oKTsKKworICB2YXIgUmV2ZXJzaWJsZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm1DbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm0oKSB7CisgICAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTsKKyAgICB9CisKKyAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7CisKKyAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiByZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKHgsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7CisgICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwOworICAgICAgdmFyIGosIG47CisKKyAgICAgIGZvciAoaiA9IG9mZnNldCwgbiA9IGxlbiArIDE7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIHhbal0gLT0geFtqIC0gMV0gKyB4W2ogKyAxXSArIDIgPj4gMjsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gb2Zmc2V0ICsgMSwgbiA9IGxlbjsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgeFtqXSArPSB4W2ogLSAxXSArIHhbaiArIDFdID4+IDE7CisgICAgICB9CisgICAgfTsKKworICAgIHJldHVybiBSZXZlcnNpYmxlVHJhbnNmb3JtOworICB9KCk7CisKKyAgcmV0dXJuIEpweEltYWdlOworfSgpOworCitleHBvcnRzLkpweEltYWdlID0gSnB4SW1hZ2U7CisKKy8qKiovIH0pLAorLyogMjE5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuY2FsY3VsYXRlU0hBNTEyID0gZXhwb3J0cy5jYWxjdWxhdGVTSEEzODQgPSBleHBvcnRzLmNhbGN1bGF0ZVNIQTI1NiA9IGV4cG9ydHMuY2FsY3VsYXRlTUQ1ID0gZXhwb3J0cy5QREYyMCA9IGV4cG9ydHMuUERGMTcgPSBleHBvcnRzLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkgPSBleHBvcnRzLkFSQ0ZvdXJDaXBoZXIgPSBleHBvcnRzLkFFUzI1NkNpcGhlciA9IGV4cG9ydHMuQUVTMTI4Q2lwaGVyID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMik7CisKK3ZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDkpOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIEFSQ0ZvdXJDaXBoZXIgPSBmdW5jdGlvbiBBUkNGb3VyQ2lwaGVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQVJDRm91ckNpcGhlcihrZXkpIHsKKyAgICB0aGlzLmEgPSAwOworICAgIHRoaXMuYiA9IDA7CisgICAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgyNTYpOworICAgIHZhciBpLAorICAgICAgICBqID0gMCwKKyAgICAgICAgdG1wLAorICAgICAgICBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICBzW2ldID0gaTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgIHRtcCA9IHNbaV07CisgICAgICBqID0gaiArIHRtcCArIGtleVtpICUga2V5TGVuZ3RoXSAmIDB4ZmY7CisgICAgICBzW2ldID0gc1tqXTsKKyAgICAgIHNbal0gPSB0bXA7CisgICAgfQorCisgICAgdGhpcy5zID0gczsKKyAgfQorCisgIEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlID0geworICAgIGVuY3J5cHRCbG9jazogZnVuY3Rpb24gQVJDRm91ckNpcGhlcl9lbmNyeXB0QmxvY2soZGF0YSkgeworICAgICAgdmFyIGksCisgICAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAorICAgICAgICAgIHRtcCwKKyAgICAgICAgICB0bXAyOworICAgICAgdmFyIGEgPSB0aGlzLmEsCisgICAgICAgICAgYiA9IHRoaXMuYiwKKyAgICAgICAgICBzID0gdGhpcy5zOworICAgICAgdmFyIG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG4pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGEgPSBhICsgMSAmIDB4ZmY7CisgICAgICAgIHRtcCA9IHNbYV07CisgICAgICAgIGIgPSBiICsgdG1wICYgMHhmZjsKKyAgICAgICAgdG1wMiA9IHNbYl07CisgICAgICAgIHNbYV0gPSB0bXAyOworICAgICAgICBzW2JdID0gdG1wOworICAgICAgICBvdXRwdXRbaV0gPSBkYXRhW2ldIF4gc1t0bXAgKyB0bXAyICYgMHhmZl07CisgICAgICB9CisKKyAgICAgIHRoaXMuYSA9IGE7CisgICAgICB0aGlzLmIgPSBiOworICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisgIH07CisgIEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmRlY3J5cHRCbG9jayA9IEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHRCbG9jazsKKyAgQVJDRm91ckNpcGhlci5wcm90b3R5cGUuZW5jcnlwdCA9IEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHRCbG9jazsKKyAgcmV0dXJuIEFSQ0ZvdXJDaXBoZXI7Cit9KCk7CisKK2V4cG9ydHMuQVJDRm91ckNpcGhlciA9IEFSQ0ZvdXJDaXBoZXI7CisKK3ZhciBjYWxjdWxhdGVNRDUgPSBmdW5jdGlvbiBjYWxjdWxhdGVNRDVDbG9zdXJlKCkgeworICB2YXIgciA9IG5ldyBVaW50OEFycmF5KFs3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjFdKTsKKyAgdmFyIGsgPSBuZXcgSW50MzJBcnJheShbLTY4MDg3NjkzNiwgLTM4OTU2NDU4NiwgNjA2MTA1ODE5LCAtMTA0NDUyNTMzMCwgLTE3NjQxODg5NywgMTIwMDA4MDQyNiwgLTE0NzMyMzEzNDEsIC00NTcwNTk4MywgMTc3MDAzNTQxNiwgLTE5NTg0MTQ0MTcsIC00MjA2MywgLTE5OTA0MDQxNjIsIDE4MDQ2MDM2ODIsIC00MDM0MTEwMSwgLTE1MDIwMDIyOTAsIDEyMzY1MzUzMjksIC0xNjU3OTY1MTAsIC0xMDY5NTAxNjMyLCA2NDM3MTc3MTMsIC0zNzM4OTczMDIsIC03MDE1NTg2OTEsIDM4MDE2MDgzLCAtNjYwNDc4MzM1LCAtNDA1NTM3ODQ4LCA1Njg0NDY0MzgsIC0xMDE5ODAzNjkwLCAtMTg3MzYzOTYxLCAxMTYzNTMxNTAxLCAtMTQ0NDY4MTQ2NywgLTUxNDAzNzg0LCAxNzM1MzI4NDczLCAtMTkyNjYwNzczNCwgLTM3ODU1OCwgLTIwMjI1NzQ0NjMsIDE4MzkwMzA1NjIsIC0zNTMwOTU1NiwgLTE1MzA5OTIwNjAsIDEyNzI4OTMzNTMsIC0xNTU0OTc2MzIsIC0xMDk0NzMwNjQwLCA2ODEyNzkxNzQsIC0zNTg1MzcyMjIsIC03MjI1MjE5NzksIDc2MDI5MTg5LCAtNjQwMzY0NDg3LCAtNDIxODE1ODM1LCA1MzA3NDI1MjAsIC05OTUzMzg2NTEsIC0xOTg2MzA4NDQsIDExMjY4OTE0MTUsIC0xNDE2MzU0OTA1LCAtNTc0MzQwNTUsIDE3MDA0ODU1NzEsIC0xODk0OTg2NjA2LCAtMTA1MTUyMywgLTIwNTQ5MjI3OTksIDE4NzMzMTMzNTksIC0zMDYxMTc0NCwgLTE1NjAxOTgzODAsIDEzMDkxNTE2NDksIC0xNDU1MjMwNzAsIC0xMTIwMjEwMzc5LCA3MTg3ODcyNTksIC0zNDM0ODU1NTFdKTsKKworICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgdmFyIGgwID0gMTczMjU4NDE5MywKKyAgICAgICAgaDEgPSAtMjcxNzMzODc5LAorICAgICAgICBoMiA9IC0xNzMyNTg0MTk0LAorICAgICAgICBoMyA9IDI3MTczMzg3ODsKKyAgICB2YXIgcGFkZGVkTGVuZ3RoID0gbGVuZ3RoICsgNzIgJiB+NjM7CisgICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7CisgICAgdmFyIGksIGosIG47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIHBhZGRlZFtpXSA9IGRhdGFbb2Zmc2V0KytdOworICAgIH0KKworICAgIHBhZGRlZFtpKytdID0gMHg4MDsKKyAgICBuID0gcGFkZGVkTGVuZ3RoIC0gODsKKworICAgIHdoaWxlIChpIDwgbikgeworICAgICAgcGFkZGVkW2krK10gPSAwOworICAgIH0KKworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoIDw8IDMgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDUgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAyMSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4+IDI5ICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICB2YXIgdyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraiwgaSArPSA0KSB7CisgICAgICAgIHdbal0gPSBwYWRkZWRbaV0gfCBwYWRkZWRbaSArIDFdIDw8IDggfCBwYWRkZWRbaSArIDJdIDw8IDE2IHwgcGFkZGVkW2kgKyAzXSA8PCAyNDsKKyAgICAgIH0KKworICAgICAgdmFyIGEgPSBoMCwKKyAgICAgICAgICBiID0gaDEsCisgICAgICAgICAgYyA9IGgyLAorICAgICAgICAgIGQgPSBoMywKKyAgICAgICAgICBmLAorICAgICAgICAgIGc7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgKytqKSB7CisgICAgICAgIGlmIChqIDwgMTYpIHsKKyAgICAgICAgICBmID0gYiAmIGMgfCB+YiAmIGQ7CisgICAgICAgICAgZyA9IGo7CisgICAgICAgIH0gZWxzZSBpZiAoaiA8IDMyKSB7CisgICAgICAgICAgZiA9IGQgJiBiIHwgfmQgJiBjOworICAgICAgICAgIGcgPSA1ICogaiArIDEgJiAxNTsKKyAgICAgICAgfSBlbHNlIGlmIChqIDwgNDgpIHsKKyAgICAgICAgICBmID0gYiBeIGMgXiBkOworICAgICAgICAgIGcgPSAzICogaiArIDUgJiAxNTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmID0gYyBeIChiIHwgfmQpOworICAgICAgICAgIGcgPSA3ICogaiAmIDE1OworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRtcCA9IGQsCisgICAgICAgICAgICByb3RhdGVBcmcgPSBhICsgZiArIGtbal0gKyB3W2ddIHwgMCwKKyAgICAgICAgICAgIHJvdGF0ZSA9IHJbal07CisgICAgICAgIGQgPSBjOworICAgICAgICBjID0gYjsKKyAgICAgICAgYiA9IGIgKyAocm90YXRlQXJnIDw8IHJvdGF0ZSB8IHJvdGF0ZUFyZyA+Pj4gMzIgLSByb3RhdGUpIHwgMDsKKyAgICAgICAgYSA9IHRtcDsKKyAgICAgIH0KKworICAgICAgaDAgPSBoMCArIGEgfCAwOworICAgICAgaDEgPSBoMSArIGIgfCAwOworICAgICAgaDIgPSBoMiArIGMgfCAwOworICAgICAgaDMgPSBoMyArIGQgfCAwOworICAgIH0KKworICAgIHJldHVybiBuZXcgVWludDhBcnJheShbaDAgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+Pj4gMjQgJiAweEZGLCBoMSAmIDB4RkYsIGgxID4+IDggJiAweEZGLCBoMSA+PiAxNiAmIDB4RkYsIGgxID4+PiAyNCAmIDB4RkYsIGgyICYgMHhGRiwgaDIgPj4gOCAmIDB4RkYsIGgyID4+IDE2ICYgMHhGRiwgaDIgPj4+IDI0ICYgMHhGRiwgaDMgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+Pj4gMjQgJiAweEZGXSk7CisgIH0KKworICByZXR1cm4gaGFzaDsKK30oKTsKKworZXhwb3J0cy5jYWxjdWxhdGVNRDUgPSBjYWxjdWxhdGVNRDU7CisKK3ZhciBXb3JkNjQgPSBmdW5jdGlvbiBXb3JkNjRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBXb3JkNjQoaGlnaEludGVnZXIsIGxvd0ludGVnZXIpIHsKKyAgICB0aGlzLmhpZ2ggPSBoaWdoSW50ZWdlciB8IDA7CisgICAgdGhpcy5sb3cgPSBsb3dJbnRlZ2VyIHwgMDsKKyAgfQorCisgIFdvcmQ2NC5wcm90b3R5cGUgPSB7CisgICAgYW5kOiBmdW5jdGlvbiBXb3JkNjRfYW5kKHdvcmQpIHsKKyAgICAgIHRoaXMuaGlnaCAmPSB3b3JkLmhpZ2g7CisgICAgICB0aGlzLmxvdyAmPSB3b3JkLmxvdzsKKyAgICB9LAorICAgIHhvcjogZnVuY3Rpb24gV29yZDY0X3hvcih3b3JkKSB7CisgICAgICB0aGlzLmhpZ2ggXj0gd29yZC5oaWdoOworICAgICAgdGhpcy5sb3cgXj0gd29yZC5sb3c7CisgICAgfSwKKyAgICBvcjogZnVuY3Rpb24gV29yZDY0X29yKHdvcmQpIHsKKyAgICAgIHRoaXMuaGlnaCB8PSB3b3JkLmhpZ2g7CisgICAgICB0aGlzLmxvdyB8PSB3b3JkLmxvdzsKKyAgICB9LAorICAgIHNoaWZ0UmlnaHQ6IGZ1bmN0aW9uIFdvcmQ2NF9zaGlmdFJpZ2h0KHBsYWNlcykgeworICAgICAgaWYgKHBsYWNlcyA+PSAzMikgeworICAgICAgICB0aGlzLmxvdyA9IHRoaXMuaGlnaCA+Pj4gcGxhY2VzIC0gMzIgfCAwOworICAgICAgICB0aGlzLmhpZ2ggPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5sb3cgPSB0aGlzLmxvdyA+Pj4gcGxhY2VzIHwgdGhpcy5oaWdoIDw8IDMyIC0gcGxhY2VzOworICAgICAgICB0aGlzLmhpZ2ggPSB0aGlzLmhpZ2ggPj4+IHBsYWNlcyB8IDA7CisgICAgICB9CisgICAgfSwKKyAgICBzaGlmdExlZnQ6IGZ1bmN0aW9uIFdvcmQ2NF9zaGlmdExlZnQocGxhY2VzKSB7CisgICAgICBpZiAocGxhY2VzID49IDMyKSB7CisgICAgICAgIHRoaXMuaGlnaCA9IHRoaXMubG93IDw8IHBsYWNlcyAtIDMyOworICAgICAgICB0aGlzLmxvdyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmhpZ2ggPSB0aGlzLmhpZ2ggPDwgcGxhY2VzIHwgdGhpcy5sb3cgPj4+IDMyIC0gcGxhY2VzOworICAgICAgICB0aGlzLmxvdyA9IHRoaXMubG93IDw8IHBsYWNlczsKKyAgICAgIH0KKyAgICB9LAorICAgIHJvdGF0ZVJpZ2h0OiBmdW5jdGlvbiBXb3JkNjRfcm90YXRlUmlnaHQocGxhY2VzKSB7CisgICAgICB2YXIgbG93LCBoaWdoOworCisgICAgICBpZiAocGxhY2VzICYgMzIpIHsKKyAgICAgICAgaGlnaCA9IHRoaXMubG93OworICAgICAgICBsb3cgPSB0aGlzLmhpZ2g7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb3cgPSB0aGlzLmxvdzsKKyAgICAgICAgaGlnaCA9IHRoaXMuaGlnaDsKKyAgICAgIH0KKworICAgICAgcGxhY2VzICY9IDMxOworICAgICAgdGhpcy5sb3cgPSBsb3cgPj4+IHBsYWNlcyB8IGhpZ2ggPDwgMzIgLSBwbGFjZXM7CisgICAgICB0aGlzLmhpZ2ggPSBoaWdoID4+PiBwbGFjZXMgfCBsb3cgPDwgMzIgLSBwbGFjZXM7CisgICAgfSwKKyAgICBub3Q6IGZ1bmN0aW9uIFdvcmQ2NF9ub3QoKSB7CisgICAgICB0aGlzLmhpZ2ggPSB+dGhpcy5oaWdoOworICAgICAgdGhpcy5sb3cgPSB+dGhpcy5sb3c7CisgICAgfSwKKyAgICBhZGQ6IGZ1bmN0aW9uIFdvcmQ2NF9hZGQod29yZCkgeworICAgICAgdmFyIGxvd0FkZCA9ICh0aGlzLmxvdyA+Pj4gMCkgKyAod29yZC5sb3cgPj4+IDApOworICAgICAgdmFyIGhpZ2hBZGQgPSAodGhpcy5oaWdoID4+PiAwKSArICh3b3JkLmhpZ2ggPj4+IDApOworCisgICAgICBpZiAobG93QWRkID4gMHhmZmZmZmZmZikgeworICAgICAgICBoaWdoQWRkICs9IDE7CisgICAgICB9CisKKyAgICAgIHRoaXMubG93ID0gbG93QWRkIHwgMDsKKyAgICAgIHRoaXMuaGlnaCA9IGhpZ2hBZGQgfCAwOworICAgIH0sCisgICAgY29weVRvOiBmdW5jdGlvbiBXb3JkNjRfY29weVRvKGJ5dGVzLCBvZmZzZXQpIHsKKyAgICAgIGJ5dGVzW29mZnNldF0gPSB0aGlzLmhpZ2ggPj4+IDI0ICYgMHhmZjsKKyAgICAgIGJ5dGVzW29mZnNldCArIDFdID0gdGhpcy5oaWdoID4+IDE2ICYgMHhmZjsKKyAgICAgIGJ5dGVzW29mZnNldCArIDJdID0gdGhpcy5oaWdoID4+IDggJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgM10gPSB0aGlzLmhpZ2ggJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgNF0gPSB0aGlzLmxvdyA+Pj4gMjQgJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgNV0gPSB0aGlzLmxvdyA+PiAxNiAmIDB4ZmY7CisgICAgICBieXRlc1tvZmZzZXQgKyA2XSA9IHRoaXMubG93ID4+IDggJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgN10gPSB0aGlzLmxvdyAmIDB4ZmY7CisgICAgfSwKKyAgICBhc3NpZ246IGZ1bmN0aW9uIFdvcmQ2NF9hc3NpZ24od29yZCkgeworICAgICAgdGhpcy5oaWdoID0gd29yZC5oaWdoOworICAgICAgdGhpcy5sb3cgPSB3b3JkLmxvdzsKKyAgICB9CisgIH07CisgIHJldHVybiBXb3JkNjQ7Cit9KCk7CisKK3ZhciBjYWxjdWxhdGVTSEEyNTYgPSBmdW5jdGlvbiBjYWxjdWxhdGVTSEEyNTZDbG9zdXJlKCkgeworICBmdW5jdGlvbiByb3RyKHgsIG4pIHsKKyAgICByZXR1cm4geCA+Pj4gbiB8IHggPDwgMzIgLSBuOworICB9CisKKyAgZnVuY3Rpb24gY2goeCwgeSwgeikgeworICAgIHJldHVybiB4ICYgeSBeIH54ICYgejsKKyAgfQorCisgIGZ1bmN0aW9uIG1haih4LCB5LCB6KSB7CisgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejsKKyAgfQorCisgIGZ1bmN0aW9uIHNpZ21hKHgpIHsKKyAgICByZXR1cm4gcm90cih4LCAyKSBeIHJvdHIoeCwgMTMpIF4gcm90cih4LCAyMik7CisgIH0KKworICBmdW5jdGlvbiBzaWdtYVByaW1lKHgpIHsKKyAgICByZXR1cm4gcm90cih4LCA2KSBeIHJvdHIoeCwgMTEpIF4gcm90cih4LCAyNSk7CisgIH0KKworICBmdW5jdGlvbiBsaXR0bGVTaWdtYSh4KSB7CisgICAgcmV0dXJuIHJvdHIoeCwgNykgXiByb3RyKHgsIDE4KSBeIHggPj4+IDM7CisgIH0KKworICBmdW5jdGlvbiBsaXR0bGVTaWdtYVByaW1lKHgpIHsKKyAgICByZXR1cm4gcm90cih4LCAxNykgXiByb3RyKHgsIDE5KSBeIHggPj4+IDEwOworICB9CisKKyAgdmFyIGsgPSBbMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCwgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NywgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMywgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMl07CisKKyAgZnVuY3Rpb24gaGFzaChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgeworICAgIHZhciBoMCA9IDB4NmEwOWU2NjcsCisgICAgICAgIGgxID0gMHhiYjY3YWU4NSwKKyAgICAgICAgaDIgPSAweDNjNmVmMzcyLAorICAgICAgICBoMyA9IDB4YTU0ZmY1M2EsCisgICAgICAgIGg0ID0gMHg1MTBlNTI3ZiwKKyAgICAgICAgaDUgPSAweDliMDU2ODhjLAorICAgICAgICBoNiA9IDB4MWY4M2Q5YWIsCisgICAgICAgIGg3ID0gMHg1YmUwY2QxOTsKKyAgICB2YXIgcGFkZGVkTGVuZ3RoID0gTWF0aC5jZWlsKChsZW5ndGggKyA5KSAvIDY0KSAqIDY0OworICAgIHZhciBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOworICAgIHZhciBpLCBqLCBuOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTsKKyAgICB9CisKKyAgICBwYWRkZWRbaSsrXSA9IDB4ODA7CisgICAgbiA9IHBhZGRlZExlbmd0aCAtIDg7CisKKyAgICB3aGlsZSAoaSA8IG4pIHsKKyAgICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICB9CisKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+Pj4gMjkgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDIxICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gNSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPDwgMyAmIDB4ZmY7CisgICAgdmFyIHcgPSBuZXcgVWludDMyQXJyYXkoNjQpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICAgIHdbal0gPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKKyAgICAgICAgaSArPSA0OworICAgICAgfQorCisgICAgICBmb3IgKGogPSAxNjsgaiA8IDY0OyArK2opIHsKKyAgICAgICAgd1tqXSA9IGxpdHRsZVNpZ21hUHJpbWUod1tqIC0gMl0pICsgd1tqIC0gN10gKyBsaXR0bGVTaWdtYSh3W2ogLSAxNV0pICsgd1tqIC0gMTZdIHwgMDsKKyAgICAgIH0KKworICAgICAgdmFyIGEgPSBoMCwKKyAgICAgICAgICBiID0gaDEsCisgICAgICAgICAgYyA9IGgyLAorICAgICAgICAgIGQgPSBoMywKKyAgICAgICAgICBlID0gaDQsCisgICAgICAgICAgZiA9IGg1LAorICAgICAgICAgIGcgPSBoNiwKKyAgICAgICAgICBoID0gaDcsCisgICAgICAgICAgdDEsCisgICAgICAgICAgdDI7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgKytqKSB7CisgICAgICAgIHQxID0gaCArIHNpZ21hUHJpbWUoZSkgKyBjaChlLCBmLCBnKSArIGtbal0gKyB3W2pdOworICAgICAgICB0MiA9IHNpZ21hKGEpICsgbWFqKGEsIGIsIGMpOworICAgICAgICBoID0gZzsKKyAgICAgICAgZyA9IGY7CisgICAgICAgIGYgPSBlOworICAgICAgICBlID0gZCArIHQxIHwgMDsKKyAgICAgICAgZCA9IGM7CisgICAgICAgIGMgPSBiOworICAgICAgICBiID0gYTsKKyAgICAgICAgYSA9IHQxICsgdDIgfCAwOworICAgICAgfQorCisgICAgICBoMCA9IGgwICsgYSB8IDA7CisgICAgICBoMSA9IGgxICsgYiB8IDA7CisgICAgICBoMiA9IGgyICsgYyB8IDA7CisgICAgICBoMyA9IGgzICsgZCB8IDA7CisgICAgICBoNCA9IGg0ICsgZSB8IDA7CisgICAgICBoNSA9IGg1ICsgZiB8IDA7CisgICAgICBoNiA9IGg2ICsgZyB8IDA7CisgICAgICBoNyA9IGg3ICsgaCB8IDA7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtoMCA+PiAyNCAmIDB4RkYsIGgwID4+IDE2ICYgMHhGRiwgaDAgPj4gOCAmIDB4RkYsIGgwICYgMHhGRiwgaDEgPj4gMjQgJiAweEZGLCBoMSA+PiAxNiAmIDB4RkYsIGgxID4+IDggJiAweEZGLCBoMSAmIDB4RkYsIGgyID4+IDI0ICYgMHhGRiwgaDIgPj4gMTYgJiAweEZGLCBoMiA+PiA4ICYgMHhGRiwgaDIgJiAweEZGLCBoMyA+PiAyNCAmIDB4RkYsIGgzID4+IDE2ICYgMHhGRiwgaDMgPj4gOCAmIDB4RkYsIGgzICYgMHhGRiwgaDQgPj4gMjQgJiAweEZGLCBoNCA+PiAxNiAmIDB4RkYsIGg0ID4+IDggJiAweEZGLCBoNCAmIDB4RkYsIGg1ID4+IDI0ICYgMHhGRiwgaDUgPj4gMTYgJiAweEZGLCBoNSA+PiA4ICYgMHhGRiwgaDUgJiAweEZGLCBoNiA+PiAyNCAmIDB4RkYsIGg2ID4+IDE2ICYgMHhGRiwgaDYgPj4gOCAmIDB4RkYsIGg2ICYgMHhGRiwgaDcgPj4gMjQgJiAweEZGLCBoNyA+PiAxNiAmIDB4RkYsIGg3ID4+IDggJiAweEZGLCBoNyAmIDB4RkZdKTsKKyAgfQorCisgIHJldHVybiBoYXNoOworfSgpOworCitleHBvcnRzLmNhbGN1bGF0ZVNIQTI1NiA9IGNhbGN1bGF0ZVNIQTI1NjsKKwordmFyIGNhbGN1bGF0ZVNIQTUxMiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTUxMkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGNoKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CisgICAgcmVzdWx0LmFzc2lnbih4KTsKKyAgICByZXN1bHQuYW5kKHkpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLm5vdCgpOworICAgIHRtcC5hbmQoeik7CisgICAgcmVzdWx0Lnhvcih0bXApOworICB9CisKKyAgZnVuY3Rpb24gbWFqKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CisgICAgcmVzdWx0LmFzc2lnbih4KTsKKyAgICByZXN1bHQuYW5kKHkpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLmFuZCh6KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgICAgdG1wLmFzc2lnbih5KTsKKyAgICB0bXAuYW5kKHopOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgfQorCisgIGZ1bmN0aW9uIHNpZ21hKHJlc3VsdCwgeCwgdG1wKSB7CisgICAgcmVzdWx0LmFzc2lnbih4KTsKKyAgICByZXN1bHQucm90YXRlUmlnaHQoMjgpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLnJvdGF0ZVJpZ2h0KDM0KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAucm90YXRlUmlnaHQoMzkpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgfQorCisgIGZ1bmN0aW9uIHNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKKyAgICByZXN1bHQuYXNzaWduKHgpOworICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxNCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAucm90YXRlUmlnaHQoMTgpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgICB0bXAuYXNzaWduKHgpOworICAgIHRtcC5yb3RhdGVSaWdodCg0MSk7CisgICAgcmVzdWx0Lnhvcih0bXApOworICB9CisKKyAgZnVuY3Rpb24gbGl0dGxlU2lnbWEocmVzdWx0LCB4LCB0bXApIHsKKyAgICByZXN1bHQuYXNzaWduKHgpOworICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxKTsKKyAgICB0bXAuYXNzaWduKHgpOworICAgIHRtcC5yb3RhdGVSaWdodCg4KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAuc2hpZnRSaWdodCg3KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgIH0KKworICBmdW5jdGlvbiBsaXR0bGVTaWdtYVByaW1lKHJlc3VsdCwgeCwgdG1wKSB7CisgICAgcmVzdWx0LmFzc2lnbih4KTsKKyAgICByZXN1bHQucm90YXRlUmlnaHQoMTkpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLnJvdGF0ZVJpZ2h0KDYxKTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAuc2hpZnRSaWdodCg2KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgIH0KKworICB2YXIgayA9IFtuZXcgV29yZDY0KDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIpLCBuZXcgV29yZDY0KDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QpLCBuZXcgV29yZDY0KDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYpLCBuZXcgV29yZDY0KDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMpLCBuZXcgV29yZDY0KDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgpLCBuZXcgV29yZDY0KDB4NTlmMTExZjEsIDB4YjYwNWQwMTkpLCBuZXcgV29yZDY0KDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIpLCBuZXcgV29yZDY0KDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgpLCBuZXcgV29yZDY0KDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIpLCBuZXcgV29yZDY0KDB4MTI4MzViMDEsIDB4NDU3MDZmYmUpLCBuZXcgV29yZDY0KDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMpLCBuZXcgV29yZDY0KDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIpLCBuZXcgV29yZDY0KDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYpLCBuZXcgV29yZDY0KDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEpLCBuZXcgV29yZDY0KDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUpLCBuZXcgV29yZDY0KDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQpLCBuZXcgV29yZDY0KDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIpLCBuZXcgV29yZDY0KDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMpLCBuZXcgV29yZDY0KDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUpLCBuZXcgV29yZDY0KDB4MjQwY2ExY2MsIDB4NzdhYzljNjUpLCBuZXcgV29yZDY0KDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUpLCBuZXcgV29yZDY0KDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMpLCBuZXcgV29yZDY0KDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQpLCBuZXcgV29yZDY0KDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUpLCBuZXcgV29yZDY0KDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIpLCBuZXcgV29yZDY0KDB4YTgzMWM2NmQsIDB4MmRiNDMyMTApLCBuZXcgV29yZDY0KDB4YjAwMzI3YzgsIDB4OThmYjIxM2YpLCBuZXcgV29yZDY0KDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQpLCBuZXcgV29yZDY0KDB4YzZlMDBiZjMsIDB4M2RhODhmYzIpLCBuZXcgV29yZDY0KDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUpLCBuZXcgV29yZDY0KDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYpLCBuZXcgV29yZDY0KDB4MTQyOTI5NjcsIDB4MGEwZTZlNzApLCBuZXcgV29yZDY0KDB4MjdiNzBhODUsIDB4NDZkMjJmZmMpLCBuZXcgV29yZDY0KDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYpLCBuZXcgV29yZDY0KDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQpLCBuZXcgV29yZDY0KDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYpLCBuZXcgV29yZDY0KDB4NjUwYTczNTQsIDB4OGJhZjYzZGUpLCBuZXcgV29yZDY0KDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgpLCBuZXcgV29yZDY0KDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYpLCBuZXcgV29yZDY0KDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IpLCBuZXcgV29yZDY0KDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQpLCBuZXcgV29yZDY0KDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEpLCBuZXcgV29yZDY0KDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEpLCBuZXcgV29yZDY0KDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzApLCBuZXcgV29yZDY0KDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgpLCBuZXcgV29yZDY0KDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTApLCBuZXcgV29yZDY0KDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEpLCBuZXcgV29yZDY0KDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgpLCBuZXcgV29yZDY0KDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgpLCBuZXcgV29yZDY0KDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMpLCBuZXcgV29yZDY0KDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTkpLCBuZXcgV29yZDY0KDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgpLCBuZXcgV29yZDY0KDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMpLCBuZXcgV29yZDY0KDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IpLCBuZXcgV29yZDY0KDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMpLCBuZXcgV29yZDY0KDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMpLCBuZXcgV29yZDY0KDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMpLCBuZXcgV29yZDY0KDB4NzhhNTYzNmYsIDB4NDMxNzJmNjApLCBuZXcgV29yZDY0KDB4ODRjODc4MTQsIDB4YTFmMGFiNzIpLCBuZXcgV29yZDY0KDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMpLCBuZXcgV29yZDY0KDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgpLCBuZXcgV29yZDY0KDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTkpLCBuZXcgV29yZDY0KDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUpLCBuZXcgV29yZDY0KDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIpLCBuZXcgV29yZDY0KDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMpLCBuZXcgV29yZDY0KDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcpLCBuZXcgV29yZDY0KDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUpLCBuZXcgV29yZDY0KDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgpLCBuZXcgV29yZDY0KDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEpLCBuZXcgV29yZDY0KDB4MGE2MzdkYzUsIDB4YTJjODk4YTYpLCBuZXcgV29yZDY0KDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUpLCBuZXcgV29yZDY0KDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIpLCBuZXcgV29yZDY0KDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQpLCBuZXcgV29yZDY0KDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMpLCBuZXcgV29yZDY0KDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMpLCBuZXcgV29yZDY0KDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMpLCBuZXcgV29yZDY0KDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYpLCBuZXcgV29yZDY0KDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEpLCBuZXcgV29yZDY0KDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMpLCBuZXcgV29yZDY0KDB4NmM0NDE5OGMsIDB4NGE0NzU4MTcpXTsKKworICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCBtb2RlMzg0KSB7CisgICAgbW9kZTM4NCA9ICEhbW9kZTM4NDsKKyAgICB2YXIgaDAsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIGg3OworCisgICAgaWYgKCFtb2RlMzg0KSB7CisgICAgICBoMCA9IG5ldyBXb3JkNjQoMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCk7CisgICAgICBoMSA9IG5ldyBXb3JkNjQoMHhiYjY3YWU4NSwgMHg4NGNhYTczYik7CisgICAgICBoMiA9IG5ldyBXb3JkNjQoMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYik7CisgICAgICBoMyA9IG5ldyBXb3JkNjQoMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSk7CisgICAgICBoNCA9IG5ldyBXb3JkNjQoMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSk7CisgICAgICBoNSA9IG5ldyBXb3JkNjQoMHg5YjA1Njg4YywgMHgyYjNlNmMxZik7CisgICAgICBoNiA9IG5ldyBXb3JkNjQoMHgxZjgzZDlhYiwgMHhmYjQxYmQ2Yik7CisgICAgICBoNyA9IG5ldyBXb3JkNjQoMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGgwID0gbmV3IFdvcmQ2NCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KTsKKyAgICAgIGgxID0gbmV3IFdvcmQ2NCgweDYyOWEyOTJhLCAweDM2N2NkNTA3KTsKKyAgICAgIGgyID0gbmV3IFdvcmQ2NCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KTsKKyAgICAgIGgzID0gbmV3IFdvcmQ2NCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KTsKKyAgICAgIGg0ID0gbmV3IFdvcmQ2NCgweDY3MzMyNjY3LCAweGZmYzAwYjMxKTsKKyAgICAgIGg1ID0gbmV3IFdvcmQ2NCgweDhlYjQ0YTg3LCAweDY4NTgxNTExKTsKKyAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KTsKKyAgICAgIGg3ID0gbmV3IFdvcmQ2NCgweDQ3YjU0ODFkLCAweGJlZmE0ZmE0KTsKKyAgICB9CisKKyAgICB2YXIgcGFkZGVkTGVuZ3RoID0gTWF0aC5jZWlsKChsZW5ndGggKyAxNykgLyAxMjgpICogMTI4OworICAgIHZhciBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOworICAgIHZhciBpLCBqLCBuOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTsKKyAgICB9CisKKyAgICBwYWRkZWRbaSsrXSA9IDB4ODA7CisgICAgbiA9IHBhZGRlZExlbmd0aCAtIDE2OworCisgICAgd2hpbGUgKGkgPCBuKSB7CisgICAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgfQorCisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+Pj4gMjkgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDIxICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gNSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPDwgMyAmIDB4ZmY7CisgICAgdmFyIHcgPSBuZXcgQXJyYXkoODApOworCisgICAgZm9yIChpID0gMDsgaSA8IDgwOyBpKyspIHsKKyAgICAgIHdbaV0gPSBuZXcgV29yZDY0KDAsIDApOworICAgIH0KKworICAgIHZhciBhID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgYiA9IG5ldyBXb3JkNjQoMCwgMCksCisgICAgICAgIGMgPSBuZXcgV29yZDY0KDAsIDApOworICAgIHZhciBkID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgZSA9IG5ldyBXb3JkNjQoMCwgMCksCisgICAgICAgIGYgPSBuZXcgV29yZDY0KDAsIDApOworICAgIHZhciBnID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgaCA9IG5ldyBXb3JkNjQoMCwgMCk7CisgICAgdmFyIHQxID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgdDIgPSBuZXcgV29yZDY0KDAsIDApOworICAgIHZhciB0bXAxID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgdG1wMiA9IG5ldyBXb3JkNjQoMCwgMCksCisgICAgICAgIHRtcDM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFkZGVkTGVuZ3RoOykgeworICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgd1tqXS5oaWdoID0gcGFkZGVkW2ldIDw8IDI0IHwgcGFkZGVkW2kgKyAxXSA8PCAxNiB8IHBhZGRlZFtpICsgMl0gPDwgOCB8IHBhZGRlZFtpICsgM107CisgICAgICAgIHdbal0ubG93ID0gcGFkZGVkW2kgKyA0XSA8PCAyNCB8IHBhZGRlZFtpICsgNV0gPDwgMTYgfCBwYWRkZWRbaSArIDZdIDw8IDggfCBwYWRkZWRbaSArIDddOworICAgICAgICBpICs9IDg7CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IDE2OyBqIDwgODA7ICsraikgeworICAgICAgICB0bXAzID0gd1tqXTsKKyAgICAgICAgbGl0dGxlU2lnbWFQcmltZSh0bXAzLCB3W2ogLSAyXSwgdG1wMik7CisgICAgICAgIHRtcDMuYWRkKHdbaiAtIDddKTsKKyAgICAgICAgbGl0dGxlU2lnbWEodG1wMSwgd1tqIC0gMTVdLCB0bXAyKTsKKyAgICAgICAgdG1wMy5hZGQodG1wMSk7CisgICAgICAgIHRtcDMuYWRkKHdbaiAtIDE2XSk7CisgICAgICB9CisKKyAgICAgIGEuYXNzaWduKGgwKTsKKyAgICAgIGIuYXNzaWduKGgxKTsKKyAgICAgIGMuYXNzaWduKGgyKTsKKyAgICAgIGQuYXNzaWduKGgzKTsKKyAgICAgIGUuYXNzaWduKGg0KTsKKyAgICAgIGYuYXNzaWduKGg1KTsKKyAgICAgIGcuYXNzaWduKGg2KTsKKyAgICAgIGguYXNzaWduKGg3KTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IDgwOyArK2opIHsKKyAgICAgICAgdDEuYXNzaWduKGgpOworICAgICAgICBzaWdtYVByaW1lKHRtcDEsIGUsIHRtcDIpOworICAgICAgICB0MS5hZGQodG1wMSk7CisgICAgICAgIGNoKHRtcDEsIGUsIGYsIGcsIHRtcDIpOworICAgICAgICB0MS5hZGQodG1wMSk7CisgICAgICAgIHQxLmFkZChrW2pdKTsKKyAgICAgICAgdDEuYWRkKHdbal0pOworICAgICAgICBzaWdtYSh0MiwgYSwgdG1wMik7CisgICAgICAgIG1haih0bXAxLCBhLCBiLCBjLCB0bXAyKTsKKyAgICAgICAgdDIuYWRkKHRtcDEpOworICAgICAgICB0bXAzID0gaDsKKyAgICAgICAgaCA9IGc7CisgICAgICAgIGcgPSBmOworICAgICAgICBmID0gZTsKKyAgICAgICAgZC5hZGQodDEpOworICAgICAgICBlID0gZDsKKyAgICAgICAgZCA9IGM7CisgICAgICAgIGMgPSBiOworICAgICAgICBiID0gYTsKKyAgICAgICAgdG1wMy5hc3NpZ24odDEpOworICAgICAgICB0bXAzLmFkZCh0Mik7CisgICAgICAgIGEgPSB0bXAzOworICAgICAgfQorCisgICAgICBoMC5hZGQoYSk7CisgICAgICBoMS5hZGQoYik7CisgICAgICBoMi5hZGQoYyk7CisgICAgICBoMy5hZGQoZCk7CisgICAgICBoNC5hZGQoZSk7CisgICAgICBoNS5hZGQoZik7CisgICAgICBoNi5hZGQoZyk7CisgICAgICBoNy5hZGQoaCk7CisgICAgfQorCisgICAgdmFyIHJlc3VsdDsKKworICAgIGlmICghbW9kZTM4NCkgeworICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoNjQpOworICAgICAgaDAuY29weVRvKHJlc3VsdCwgMCk7CisgICAgICBoMS5jb3B5VG8ocmVzdWx0LCA4KTsKKyAgICAgIGgyLmNvcHlUbyhyZXN1bHQsIDE2KTsKKyAgICAgIGgzLmNvcHlUbyhyZXN1bHQsIDI0KTsKKyAgICAgIGg0LmNvcHlUbyhyZXN1bHQsIDMyKTsKKyAgICAgIGg1LmNvcHlUbyhyZXN1bHQsIDQwKTsKKyAgICAgIGg2LmNvcHlUbyhyZXN1bHQsIDQ4KTsKKyAgICAgIGg3LmNvcHlUbyhyZXN1bHQsIDU2KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoNDgpOworICAgICAgaDAuY29weVRvKHJlc3VsdCwgMCk7CisgICAgICBoMS5jb3B5VG8ocmVzdWx0LCA4KTsKKyAgICAgIGgyLmNvcHlUbyhyZXN1bHQsIDE2KTsKKyAgICAgIGgzLmNvcHlUbyhyZXN1bHQsIDI0KTsKKyAgICAgIGg0LmNvcHlUbyhyZXN1bHQsIDMyKTsKKyAgICAgIGg1LmNvcHlUbyhyZXN1bHQsIDQwKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIGhhc2g7Cit9KCk7CisKK2V4cG9ydHMuY2FsY3VsYXRlU0hBNTEyID0gY2FsY3VsYXRlU0hBNTEyOworCit2YXIgY2FsY3VsYXRlU0hBMzg0ID0gZnVuY3Rpb24gY2FsY3VsYXRlU0hBMzg0Q2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gaGFzaChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgeworICAgIHJldHVybiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOworICB9CisKKyAgcmV0dXJuIGhhc2g7Cit9KCk7CisKK2V4cG9ydHMuY2FsY3VsYXRlU0hBMzg0ID0gY2FsY3VsYXRlU0hBMzg0OworCit2YXIgTnVsbENpcGhlciA9IGZ1bmN0aW9uIE51bGxDaXBoZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiBOdWxsQ2lwaGVyKCkge30KKworICBOdWxsQ2lwaGVyLnByb3RvdHlwZSA9IHsKKyAgICBkZWNyeXB0QmxvY2s6IGZ1bmN0aW9uIE51bGxDaXBoZXJfZGVjcnlwdEJsb2NrKGRhdGEpIHsKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisgICAgZW5jcnlwdDogZnVuY3Rpb24gTnVsbENpcGhlcl9lbmNyeXB0KGRhdGEpIHsKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIE51bGxDaXBoZXI7Cit9KCk7CisKK3ZhciBBRVNCYXNlQ2lwaGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQUVTQmFzZUNpcGhlcigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQUVTQmFzZUNpcGhlcik7CisKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQUVTQmFzZUNpcGhlcikgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQUVTQmFzZUNpcGhlci4iKTsKKyAgICB9CisKKyAgICB0aGlzLl9zID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsIDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsIDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsIDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsIDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsIDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsIDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsIDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksIDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsIDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTZdKTsKKyAgICB0aGlzLl9pbnZfcyA9IG5ldyBVaW50OEFycmF5KFsweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiLCAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LCAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkLCAweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlLCAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLCAweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1LCAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LCAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhLCAweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0LCAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2LCAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLCAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhLCAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLCAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LCAweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlLCAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LCAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwLCAweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0LCAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLCAweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmLCAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLCAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwLCAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLCAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkXSk7CisgICAgdGhpcy5fbWl4ID0gbmV3IFVpbnQzMkFycmF5KFsweDAwMDAwMDAwLCAweDBlMDkwZDBiLCAweDFjMTIxYTE2LCAweDEyMWIxNzFkLCAweDM4MjQzNDJjLCAweDM2MmQzOTI3LCAweDI0MzYyZTNhLCAweDJhM2YyMzMxLCAweDcwNDg2ODU4LCAweDdlNDE2NTUzLCAweDZjNWE3MjRlLCAweDYyNTM3ZjQ1LCAweDQ4NmM1Yzc0LCAweDQ2NjU1MTdmLCAweDU0N2U0NjYyLCAweDVhNzc0YjY5LCAweGUwOTBkMGIwLCAweGVlOTlkZGJiLCAweGZjODJjYWE2LCAweGYyOGJjN2FkLCAweGQ4YjRlNDljLCAweGQ2YmRlOTk3LCAweGM0YTZmZThhLCAweGNhYWZmMzgxLCAweDkwZDhiOGU4LCAweDllZDFiNWUzLCAweDhjY2FhMmZlLCAweDgyYzNhZmY1LCAweGE4ZmM4Y2M0LCAweGE2ZjU4MWNmLCAweGI0ZWU5NmQyLCAweGJhZTc5YmQ5LCAweGRiM2JiYjdiLCAweGQ1MzJiNjcwLCAweGM3MjlhMTZkLCAweGM5MjBhYzY2LCAweGUzMWY4ZjU3LCAweGVkMTY4MjVjLCAweGZmMGQ5NTQxLCAweGYxMDQ5ODRhLCAweGFiNzNkMzIzLCAweGE1N2FkZTI4LCAweGI3NjFjOTM1LCAweGI5NjhjNDNlLCAweDkzNTdlNzBmLCAweDlkNWVlYTA0LCAweDhmNDVmZDE5LCAweDgxNGNmMDEyLCAweDNiYWI2YmNiLCAweDM1YTI2NmMwLCAweDI3Yjk3MWRkLCAweDI5YjA3Y2Q2LCAweDAzOGY1ZmU3LCAweDBkODY1MmVjLCAweDFmOWQ0NWYxLCAweDExOTQ0OGZhLCAweDRiZTMwMzkzLCAweDQ1ZWEwZTk4LCAweDU3ZjExOTg1LCAweDU5ZjgxNDhlLCAweDczYzczN2JmLCAweDdkY2UzYWI0LCAweDZmZDUyZGE5LCAweDYxZGMyMGEyLCAweGFkNzY2ZGY2LCAweGEzN2Y2MGZkLCAweGIxNjQ3N2UwLCAweGJmNmQ3YWViLCAweDk1NTI1OWRhLCAweDliNWI1NGQxLCAweDg5NDA0M2NjLCAweDg3NDk0ZWM3LCAweGRkM2UwNWFlLCAweGQzMzcwOGE1LCAweGMxMmMxZmI4LCAweGNmMjUxMmIzLCAweGU1MWEzMTgyLCAweGViMTMzYzg5LCAweGY5MDgyYjk0LCAweGY3MDEyNjlmLCAweDRkZTZiZDQ2LCAweDQzZWZiMDRkLCAweDUxZjRhNzUwLCAweDVmZmRhYTViLCAweDc1YzI4OTZhLCAweDdiY2I4NDYxLCAweDY5ZDA5MzdjLCAweDY3ZDk5ZTc3LCAweDNkYWVkNTFlLCAweDMzYTdkODE1LCAweDIxYmNjZjA4LCAweDJmYjVjMjAzLCAweDA1OGFlMTMyLCAweDBiODNlYzM5LCAweDE5OThmYjI0LCAweDE3OTFmNjJmLCAweDc2NGRkNjhkLCAweDc4NDRkYjg2LCAweDZhNWZjYzliLCAweDY0NTZjMTkwLCAweDRlNjllMmExLCAweDQwNjBlZmFhLCAweDUyN2JmOGI3LCAweDVjNzJmNWJjLCAweDA2MDViZWQ1LCAweDA4MGNiM2RlLCAweDFhMTdhNGMzLCAweDE0MWVhOWM4LCAweDNlMjE4YWY5LCAweDMwMjg4N2YyLCAweDIyMzM5MGVmLCAweDJjM2E5ZGU0LCAweDk2ZGQwNjNkLCAweDk4ZDQwYjM2LCAweDhhY2YxYzJiLCAweDg0YzYxMTIwLCAweGFlZjkzMjExLCAweGEwZjAzZjFhLCAweGIyZWIyODA3LCAweGJjZTIyNTBjLCAweGU2OTU2ZTY1LCAweGU4OWM2MzZlLCAweGZhODc3NDczLCAweGY0OGU3OTc4LCAweGRlYjE1YTQ5LCAweGQwYjg1NzQyLCAweGMyYTM0MDVmLCAweGNjYWE0ZDU0LCAweDQxZWNkYWY3LCAweDRmZTVkN2ZjLCAweDVkZmVjMGUxLCAweDUzZjdjZGVhLCAweDc5YzhlZWRiLCAweDc3YzFlM2QwLCAweDY1ZGFmNGNkLCAweDZiZDNmOWM2LCAweDMxYTRiMmFmLCAweDNmYWRiZmE0LCAweDJkYjZhOGI5LCAweDIzYmZhNWIyLCAweDA5ODA4NjgzLCAweDA3ODk4Yjg4LCAweDE1OTI5Yzk1LCAweDFiOWI5MTllLCAweGExN2MwYTQ3LCAweGFmNzUwNzRjLCAweGJkNmUxMDUxLCAweGIzNjcxZDVhLCAweDk5NTgzZTZiLCAweDk3NTEzMzYwLCAweDg1NGEyNDdkLCAweDhiNDMyOTc2LCAweGQxMzQ2MjFmLCAweGRmM2Q2ZjE0LCAweGNkMjY3ODA5LCAweGMzMmY3NTAyLCAweGU5MTA1NjMzLCAweGU3MTk1YjM4LCAweGY1MDI0YzI1LCAweGZiMGI0MTJlLCAweDlhZDc2MThjLCAweDk0ZGU2Yzg3LCAweDg2YzU3YjlhLCAweDg4Y2M3NjkxLCAweGEyZjM1NWEwLCAweGFjZmE1OGFiLCAweGJlZTE0ZmI2LCAweGIwZTg0MmJkLCAweGVhOWYwOWQ0LCAweGU0OTYwNGRmLCAweGY2OGQxM2MyLCAweGY4ODQxZWM5LCAweGQyYmIzZGY4LCAweGRjYjIzMGYzLCAweGNlYTkyN2VlLCAweGMwYTAyYWU1LCAweDdhNDdiMTNjLCAweDc0NGViYzM3LCAweDY2NTVhYjJhLCAweDY4NWNhNjIxLCAweDQyNjM4NTEwLCAweDRjNmE4ODFiLCAweDVlNzE5ZjA2LCAweDUwNzg5MjBkLCAweDBhMGZkOTY0LCAweDA0MDZkNDZmLCAweDE2MWRjMzcyLCAweDE4MTRjZTc5LCAweDMyMmJlZDQ4LCAweDNjMjJlMDQzLCAweDJlMzlmNzVlLCAweDIwMzBmYTU1LCAweGVjOWFiNzAxLCAweGUyOTNiYTBhLCAweGYwODhhZDE3LCAweGZlODFhMDFjLCAweGQ0YmU4MzJkLCAweGRhYjc4ZTI2LCAweGM4YWM5OTNiLCAweGM2YTU5NDMwLCAweDljZDJkZjU5LCAweDkyZGJkMjUyLCAweDgwYzBjNTRmLCAweDhlYzljODQ0LCAweGE0ZjZlYjc1LCAweGFhZmZlNjdlLCAweGI4ZTRmMTYzLCAweGI2ZWRmYzY4LCAweDBjMGE2N2IxLCAweDAyMDM2YWJhLCAweDEwMTg3ZGE3LCAweDFlMTE3MGFjLCAweDM0MmU1MzlkLCAweDNhMjc1ZTk2LCAweDI4M2M0OThiLCAweDI2MzU0NDgwLCAweDdjNDIwZmU5LCAweDcyNGIwMmUyLCAweDYwNTAxNWZmLCAweDZlNTkxOGY0LCAweDQ0NjYzYmM1LCAweDRhNmYzNmNlLCAweDU4NzQyMWQzLCAweDU2N2QyY2Q4LCAweDM3YTEwYzdhLCAweDM5YTgwMTcxLCAweDJiYjMxNjZjLCAweDI1YmExYjY3LCAweDBmODUzODU2LCAweDAxOGMzNTVkLCAweDEzOTcyMjQwLCAweDFkOWUyZjRiLCAweDQ3ZTk2NDIyLCAweDQ5ZTA2OTI5LCAweDViZmI3ZTM0LCAweDU1ZjI3MzNmLCAweDdmY2Q1MDBlLCAweDcxYzQ1ZDA1LCAweDYzZGY0YTE4LCAweDZkZDY0NzEzLCAweGQ3MzFkY2NhLCAweGQ5MzhkMWMxLCAweGNiMjNjNmRjLCAweGM1MmFjYmQ3LCAweGVmMTVlOGU2LCAweGUxMWNlNWVkLCAweGYzMDdmMmYwLCAweGZkMGVmZmZiLCAweGE3NzliNDkyLCAweGE5NzBiOTk5LCAweGJiNmJhZTg0LCAweGI1NjJhMzhmLCAweDlmNWQ4MGJlLCAweDkxNTQ4ZGI1LCAweDgzNGY5YWE4LCAweDhkNDY5N2EzXSk7CisgICAgdGhpcy5fbWl4Q29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIGlmIChpIDwgMTI4KSB7CisgICAgICAgIHRoaXMuX21peENvbFtpXSA9IGkgPDwgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX21peENvbFtpXSA9IGkgPDwgMSBeIDB4MWI7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgdGhpcy5idWZmZXJQb3NpdGlvbiA9IDA7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQUVTQmFzZUNpcGhlciwgW3sKKyAgICBrZXk6ICJfZXhwYW5kS2V5IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBjYWxsIGBfZXhwYW5kS2V5YCBvbiB0aGUgYmFzZSBjbGFzcyIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9kZWNyeXB0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2RlY3J5cHQoaW5wdXQsIGtleSkgeworICAgICAgdmFyIHQsIHUsIHY7CisgICAgICB2YXIgc3RhdGUgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgICBzdGF0ZS5zZXQoaW5wdXQpOworCisgICAgICBmb3IgKHZhciBqID0gMCwgayA9IHRoaXMuX2tleVNpemU7IGogPCAxNjsgKytqLCArK2spIHsKKyAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0gdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uIC0gMTsgaSA+PSAxOyAtLWkpIHsKKyAgICAgICAgdCA9IHN0YXRlWzEzXTsKKyAgICAgICAgc3RhdGVbMTNdID0gc3RhdGVbOV07CisgICAgICAgIHN0YXRlWzldID0gc3RhdGVbNV07CisgICAgICAgIHN0YXRlWzVdID0gc3RhdGVbMV07CisgICAgICAgIHN0YXRlWzFdID0gdDsKKyAgICAgICAgdCA9IHN0YXRlWzE0XTsKKyAgICAgICAgdSA9IHN0YXRlWzEwXTsKKyAgICAgICAgc3RhdGVbMTRdID0gc3RhdGVbNl07CisgICAgICAgIHN0YXRlWzEwXSA9IHN0YXRlWzJdOworICAgICAgICBzdGF0ZVs2XSA9IHQ7CisgICAgICAgIHN0YXRlWzJdID0gdTsKKyAgICAgICAgdCA9IHN0YXRlWzE1XTsKKyAgICAgICAgdSA9IHN0YXRlWzExXTsKKyAgICAgICAgdiA9IHN0YXRlWzddOworICAgICAgICBzdGF0ZVsxNV0gPSBzdGF0ZVszXTsKKyAgICAgICAgc3RhdGVbMTFdID0gdDsKKyAgICAgICAgc3RhdGVbN10gPSB1OworICAgICAgICBzdGF0ZVszXSA9IHY7CisKKyAgICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IDE2OyArK19qKSB7CisgICAgICAgICAgc3RhdGVbX2pdID0gdGhpcy5faW52X3Nbc3RhdGVbX2pdXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIF9qMiA9IDAsIF9rID0gaSAqIDE2OyBfajIgPCAxNjsgKytfajIsICsrX2spIHsKKyAgICAgICAgICBzdGF0ZVtfajJdIF49IGtleVtfa107CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHZhciBfajMgPSAwOyBfajMgPCAxNjsgX2ozICs9IDQpIHsKKyAgICAgICAgICB2YXIgczAgPSB0aGlzLl9taXhbc3RhdGVbX2ozXV07CisgICAgICAgICAgdmFyIHMxID0gdGhpcy5fbWl4W3N0YXRlW19qMyArIDFdXTsKKyAgICAgICAgICB2YXIgczIgPSB0aGlzLl9taXhbc3RhdGVbX2ozICsgMl1dOworICAgICAgICAgIHZhciBzMyA9IHRoaXMuX21peFtzdGF0ZVtfajMgKyAzXV07CisgICAgICAgICAgdCA9IHMwIF4gczEgPj4+IDggXiBzMSA8PCAyNCBeIHMyID4+PiAxNiBeIHMyIDw8IDE2IF4gczMgPj4+IDI0IF4gczMgPDwgODsKKyAgICAgICAgICBzdGF0ZVtfajNdID0gdCA+Pj4gMjQgJiAweGZmOworICAgICAgICAgIHN0YXRlW19qMyArIDFdID0gdCA+PiAxNiAmIDB4ZmY7CisgICAgICAgICAgc3RhdGVbX2ozICsgMl0gPSB0ID4+IDggJiAweGZmOworICAgICAgICAgIHN0YXRlW19qMyArIDNdID0gdCAmIDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdCA9IHN0YXRlWzEzXTsKKyAgICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldOworICAgICAgc3RhdGVbOV0gPSBzdGF0ZVs1XTsKKyAgICAgIHN0YXRlWzVdID0gc3RhdGVbMV07CisgICAgICBzdGF0ZVsxXSA9IHQ7CisgICAgICB0ID0gc3RhdGVbMTRdOworICAgICAgdSA9IHN0YXRlWzEwXTsKKyAgICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdOworICAgICAgc3RhdGVbMTBdID0gc3RhdGVbMl07CisgICAgICBzdGF0ZVs2XSA9IHQ7CisgICAgICBzdGF0ZVsyXSA9IHU7CisgICAgICB0ID0gc3RhdGVbMTVdOworICAgICAgdSA9IHN0YXRlWzExXTsKKyAgICAgIHYgPSBzdGF0ZVs3XTsKKyAgICAgIHN0YXRlWzE1XSA9IHN0YXRlWzNdOworICAgICAgc3RhdGVbMTFdID0gdDsKKyAgICAgIHN0YXRlWzddID0gdTsKKyAgICAgIHN0YXRlWzNdID0gdjsKKworICAgICAgZm9yICh2YXIgX2o0ID0gMDsgX2o0IDwgMTY7ICsrX2o0KSB7CisgICAgICAgIHN0YXRlW19qNF0gPSB0aGlzLl9pbnZfc1tzdGF0ZVtfajRdXTsKKyAgICAgICAgc3RhdGVbX2o0XSBePSBrZXlbX2o0XTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9lbmNyeXB0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2VuY3J5cHQoaW5wdXQsIGtleSkgeworICAgICAgdmFyIHMgPSB0aGlzLl9zOworICAgICAgdmFyIHQsIHUsIHY7CisgICAgICB2YXIgc3RhdGUgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgICBzdGF0ZS5zZXQoaW5wdXQpOworCisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgc3RhdGVbal0gXj0ga2V5W2pdOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbjsgaSsrKSB7CisgICAgICAgIGZvciAodmFyIF9qNSA9IDA7IF9qNSA8IDE2OyArK19qNSkgeworICAgICAgICAgIHN0YXRlW19qNV0gPSBzW3N0YXRlW19qNV1dOworICAgICAgICB9CisKKyAgICAgICAgdiA9IHN0YXRlWzFdOworICAgICAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdOworICAgICAgICBzdGF0ZVs1XSA9IHN0YXRlWzldOworICAgICAgICBzdGF0ZVs5XSA9IHN0YXRlWzEzXTsKKyAgICAgICAgc3RhdGVbMTNdID0gdjsKKyAgICAgICAgdiA9IHN0YXRlWzJdOworICAgICAgICB1ID0gc3RhdGVbNl07CisgICAgICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdOworICAgICAgICBzdGF0ZVs2XSA9IHN0YXRlWzE0XTsKKyAgICAgICAgc3RhdGVbMTBdID0gdjsKKyAgICAgICAgc3RhdGVbMTRdID0gdTsKKyAgICAgICAgdiA9IHN0YXRlWzNdOworICAgICAgICB1ID0gc3RhdGVbN107CisgICAgICAgIHQgPSBzdGF0ZVsxMV07CisgICAgICAgIHN0YXRlWzNdID0gc3RhdGVbMTVdOworICAgICAgICBzdGF0ZVs3XSA9IHY7CisgICAgICAgIHN0YXRlWzExXSA9IHU7CisgICAgICAgIHN0YXRlWzE1XSA9IHQ7CisKKyAgICAgICAgZm9yICh2YXIgX2o2ID0gMDsgX2o2IDwgMTY7IF9qNiArPSA0KSB7CisgICAgICAgICAgdmFyIHMwID0gc3RhdGVbX2o2ICsgMF07CisgICAgICAgICAgdmFyIHMxID0gc3RhdGVbX2o2ICsgMV07CisgICAgICAgICAgdmFyIHMyID0gc3RhdGVbX2o2ICsgMl07CisgICAgICAgICAgdmFyIHMzID0gc3RhdGVbX2o2ICsgM107CisgICAgICAgICAgdCA9IHMwIF4gczEgXiBzMiBeIHMzOworICAgICAgICAgIHN0YXRlW19qNiArIDBdIF49IHQgXiB0aGlzLl9taXhDb2xbczAgXiBzMV07CisgICAgICAgICAgc3RhdGVbX2o2ICsgMV0gXj0gdCBeIHRoaXMuX21peENvbFtzMSBeIHMyXTsKKyAgICAgICAgICBzdGF0ZVtfajYgKyAyXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MyIF4gczNdOworICAgICAgICAgIHN0YXRlW19qNiArIDNdIF49IHQgXiB0aGlzLl9taXhDb2xbczMgXiBzMF07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHZhciBfajcgPSAwLCBrID0gaSAqIDE2OyBfajcgPCAxNjsgKytfajcsICsraykgeworICAgICAgICAgIHN0YXRlW19qN10gXj0ga2V5W2tdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIF9qOCA9IDA7IF9qOCA8IDE2OyArK19qOCkgeworICAgICAgICBzdGF0ZVtfajhdID0gc1tzdGF0ZVtfajhdXTsKKyAgICAgIH0KKworICAgICAgdiA9IHN0YXRlWzFdOworICAgICAgc3RhdGVbMV0gPSBzdGF0ZVs1XTsKKyAgICAgIHN0YXRlWzVdID0gc3RhdGVbOV07CisgICAgICBzdGF0ZVs5XSA9IHN0YXRlWzEzXTsKKyAgICAgIHN0YXRlWzEzXSA9IHY7CisgICAgICB2ID0gc3RhdGVbMl07CisgICAgICB1ID0gc3RhdGVbNl07CisgICAgICBzdGF0ZVsyXSA9IHN0YXRlWzEwXTsKKyAgICAgIHN0YXRlWzZdID0gc3RhdGVbMTRdOworICAgICAgc3RhdGVbMTBdID0gdjsKKyAgICAgIHN0YXRlWzE0XSA9IHU7CisgICAgICB2ID0gc3RhdGVbM107CisgICAgICB1ID0gc3RhdGVbN107CisgICAgICB0ID0gc3RhdGVbMTFdOworICAgICAgc3RhdGVbM10gPSBzdGF0ZVsxNV07CisgICAgICBzdGF0ZVs3XSA9IHY7CisgICAgICBzdGF0ZVsxMV0gPSB1OworICAgICAgc3RhdGVbMTVdID0gdDsKKworICAgICAgZm9yICh2YXIgX2o5ID0gMCwgX2syID0gdGhpcy5fa2V5U2l6ZTsgX2o5IDwgMTY7ICsrX2o5LCArK19rMikgeworICAgICAgICBzdGF0ZVtfajldIF49IGtleVtfazJdOworICAgICAgfQorCisgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2RlY3J5cHRCbG9jazIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVjcnlwdEJsb2NrMihkYXRhLCBmaW5hbGl6ZSkgeworICAgICAgdmFyIHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAorICAgICAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CisgICAgICB2YXIgcmVzdWx0ID0gW107CisgICAgICB2YXIgaXYgPSB0aGlzLml2OworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgKytpKSB7CisgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKKyAgICAgICAgKytidWZmZXJMZW5ndGg7CisKKyAgICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDE2KSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGxhaW4gPSB0aGlzLl9kZWNyeXB0KGJ1ZmZlciwgdGhpcy5fa2V5KTsKKworICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgICBwbGFpbltqXSBePSBpdltqXTsKKyAgICAgICAgfQorCisgICAgICAgIGl2ID0gYnVmZmVyOworICAgICAgICByZXN1bHQucHVzaChwbGFpbik7CisgICAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKKyAgICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKKyAgICAgIH0KKworICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CisgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgICAgIHRoaXMuaXYgPSBpdjsKKworICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOworICAgICAgfQorCisgICAgICB2YXIgb3V0cHV0TGVuZ3RoID0gMTYgKiByZXN1bHQubGVuZ3RoOworCisgICAgICBpZiAoZmluYWxpemUpIHsKKyAgICAgICAgdmFyIGxhc3RCbG9jayA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07CisgICAgICAgIHZhciBwc0xlbiA9IGxhc3RCbG9ja1sxNV07CisKKyAgICAgICAgaWYgKHBzTGVuIDw9IDE2KSB7CisgICAgICAgICAgZm9yICh2YXIgX2kgPSAxNSwgaWkgPSAxNiAtIHBzTGVuOyBfaSA+PSBpaTsgLS1faSkgeworICAgICAgICAgICAgaWYgKGxhc3RCbG9ja1tfaV0gIT09IHBzTGVuKSB7CisgICAgICAgICAgICAgIHBzTGVuID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgb3V0cHV0TGVuZ3RoIC09IHBzTGVuOworICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBsYXN0QmxvY2suc3ViYXJyYXkoMCwgMTYgLSBwc0xlbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG91dHB1dExlbmd0aCk7CisKKyAgICAgIGZvciAodmFyIF9pMiA9IDAsIF9qMTAgPSAwLCBfaWkgPSByZXN1bHQubGVuZ3RoOyBfaTIgPCBfaWk7ICsrX2kyLCBfajEwICs9IDE2KSB7CisgICAgICAgIG91dHB1dC5zZXQocmVzdWx0W19pMl0sIF9qMTApOworICAgICAgfQorCisgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKyAgfSwgeworICAgIGtleTogImRlY3J5cHRCbG9jayIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSkgeworICAgICAgdmFyIGl2ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsOworICAgICAgdmFyIHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOworICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CisKKyAgICAgIGlmIChpdikgeworICAgICAgICB0aGlzLml2ID0gaXY7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHZhciBpID0gMDsgYnVmZmVyTGVuZ3RoIDwgMTYgJiYgaSA8IHNvdXJjZUxlbmd0aDsgKytpLCArK2J1ZmZlckxlbmd0aCkgeworICAgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgeworICAgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuaXYgPSBidWZmZXI7CisgICAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KDE2KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7CisgICAgICB0aGlzLmRlY3J5cHRCbG9jayA9IHRoaXMuX2RlY3J5cHRCbG9jazI7CisgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImVuY3J5cHQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBlbmNyeXB0KGRhdGEsIGl2KSB7CisgICAgICB2YXIgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsCisgICAgICAgICAgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJQb3NpdGlvbjsKKyAgICAgIHZhciByZXN1bHQgPSBbXTsKKworICAgICAgaWYgKCFpdikgeworICAgICAgICBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7ICsraSkgeworICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CisgICAgICAgICsrYnVmZmVyTGVuZ3RoOworCisgICAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICAgICAgYnVmZmVyW2pdIF49IGl2W2pdOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2VuY3J5cHQoYnVmZmVyLCB0aGlzLl9rZXkpOworCisgICAgICAgIGl2ID0gY2lwaGVyOworICAgICAgICByZXN1bHQucHVzaChjaXBoZXIpOworICAgICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICB0aGlzLml2ID0gaXY7CisKKyAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7CisgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKKyAgICAgIH0KKworICAgICAgdmFyIG91dHB1dExlbmd0aCA9IDE2ICogcmVzdWx0Lmxlbmd0aDsKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgVWludDhBcnJheShvdXRwdXRMZW5ndGgpOworCisgICAgICBmb3IgKHZhciBfaTMgPSAwLCBfajExID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBfaTMgPCBpaTsgKytfaTMsIF9qMTEgKz0gMTYpIHsKKyAgICAgICAgb3V0cHV0LnNldChyZXN1bHRbX2kzXSwgX2oxMSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEFFU0Jhc2VDaXBoZXI7Cit9KCk7CisKK3ZhciBBRVMxMjhDaXBoZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9BRVNCYXNlQ2lwaGVyKSB7CisgIF9pbmhlcml0cyhBRVMxMjhDaXBoZXIsIF9BRVNCYXNlQ2lwaGVyKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEFFUzEyOENpcGhlcik7CisKKyAgZnVuY3Rpb24gQUVTMTI4Q2lwaGVyKGtleSkgeworICAgIHZhciBfdGhpczsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBRVMxMjhDaXBoZXIpOworCisgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKKyAgICBfdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uID0gMTA7CisgICAgX3RoaXMuX2tleVNpemUgPSAxNjA7CisgICAgX3RoaXMuX3Jjb24gPSBuZXcgVWludDhBcnJheShbMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZF0pOworICAgIF90aGlzLl9rZXkgPSBfdGhpcy5fZXhwYW5kS2V5KGtleSk7CisgICAgcmV0dXJuIF90aGlzOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEFFUzEyOENpcGhlciwgW3sKKyAgICBrZXk6ICJfZXhwYW5kS2V5IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKKyAgICAgIHZhciBiID0gMTc2OworICAgICAgdmFyIHMgPSB0aGlzLl9zOworICAgICAgdmFyIHJjb24gPSB0aGlzLl9yY29uOworICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGIpOworICAgICAgcmVzdWx0LnNldChjaXBoZXJLZXkpOworCisgICAgICBmb3IgKHZhciBqID0gMTYsIGkgPSAxOyBqIDwgYjsgKytpKSB7CisgICAgICAgIHZhciB0MSA9IHJlc3VsdFtqIC0gM107CisgICAgICAgIHZhciB0MiA9IHJlc3VsdFtqIC0gMl07CisgICAgICAgIHZhciB0MyA9IHJlc3VsdFtqIC0gMV07CisgICAgICAgIHZhciB0NCA9IHJlc3VsdFtqIC0gNF07CisgICAgICAgIHQxID0gc1t0MV07CisgICAgICAgIHQyID0gc1t0Ml07CisgICAgICAgIHQzID0gc1t0M107CisgICAgICAgIHQ0ID0gc1t0NF07CisgICAgICAgIHQxID0gdDEgXiByY29uW2ldOworCisgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgNDsgKytuKSB7CisgICAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAxNl07CisgICAgICAgICAgaisrOworICAgICAgICAgIHJlc3VsdFtqXSA9IHQyIF49IHJlc3VsdFtqIC0gMTZdOworICAgICAgICAgIGorKzsKKyAgICAgICAgICByZXN1bHRbal0gPSB0MyBePSByZXN1bHRbaiAtIDE2XTsKKyAgICAgICAgICBqKys7CisgICAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAxNl07CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEFFUzEyOENpcGhlcjsKK30oQUVTQmFzZUNpcGhlcik7CisKK2V4cG9ydHMuQUVTMTI4Q2lwaGVyID0gQUVTMTI4Q2lwaGVyOworCit2YXIgQUVTMjU2Q2lwaGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQUVTQmFzZUNpcGhlcjIpIHsKKyAgX2luaGVyaXRzKEFFUzI1NkNpcGhlciwgX0FFU0Jhc2VDaXBoZXIyKTsKKworICB2YXIgX3N1cGVyMiA9IF9jcmVhdGVTdXBlcihBRVMyNTZDaXBoZXIpOworCisgIGZ1bmN0aW9uIEFFUzI1NkNpcGhlcihrZXkpIHsKKyAgICB2YXIgX3RoaXMyOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFFUzI1NkNpcGhlcik7CisKKyAgICBfdGhpczIgPSBfc3VwZXIyLmNhbGwodGhpcyk7CisgICAgX3RoaXMyLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxNDsKKyAgICBfdGhpczIuX2tleVNpemUgPSAyMjQ7CisgICAgX3RoaXMyLl9rZXkgPSBfdGhpczIuX2V4cGFuZEtleShrZXkpOworICAgIHJldHVybiBfdGhpczI7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQUVTMjU2Q2lwaGVyLCBbeworICAgIGtleTogIl9leHBhbmRLZXkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZXhwYW5kS2V5KGNpcGhlcktleSkgeworICAgICAgdmFyIGIgPSAyNDA7CisgICAgICB2YXIgcyA9IHRoaXMuX3M7CisgICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYik7CisgICAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7CisgICAgICB2YXIgciA9IDE7CisgICAgICB2YXIgdDEsIHQyLCB0MywgdDQ7CisKKyAgICAgIGZvciAodmFyIGogPSAzMiwgaSA9IDE7IGogPCBiOyArK2kpIHsKKyAgICAgICAgaWYgKGogJSAzMiA9PT0gMTYpIHsKKyAgICAgICAgICB0MSA9IHNbdDFdOworICAgICAgICAgIHQyID0gc1t0Ml07CisgICAgICAgICAgdDMgPSBzW3QzXTsKKyAgICAgICAgICB0NCA9IHNbdDRdOworICAgICAgICB9IGVsc2UgaWYgKGogJSAzMiA9PT0gMCkgeworICAgICAgICAgIHQxID0gcmVzdWx0W2ogLSAzXTsKKyAgICAgICAgICB0MiA9IHJlc3VsdFtqIC0gMl07CisgICAgICAgICAgdDMgPSByZXN1bHRbaiAtIDFdOworICAgICAgICAgIHQ0ID0gcmVzdWx0W2ogLSA0XTsKKyAgICAgICAgICB0MSA9IHNbdDFdOworICAgICAgICAgIHQyID0gc1t0Ml07CisgICAgICAgICAgdDMgPSBzW3QzXTsKKyAgICAgICAgICB0NCA9IHNbdDRdOworICAgICAgICAgIHQxID0gdDEgXiByOworCisgICAgICAgICAgaWYgKChyIDw8PSAxKSA+PSAyNTYpIHsKKyAgICAgICAgICAgIHIgPSAociBeIDB4MWIpICYgMHhmZjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IDQ7ICsrbikgeworICAgICAgICAgIHJlc3VsdFtqXSA9IHQxIF49IHJlc3VsdFtqIC0gMzJdOworICAgICAgICAgIGorKzsKKyAgICAgICAgICByZXN1bHRbal0gPSB0MiBePSByZXN1bHRbaiAtIDMyXTsKKyAgICAgICAgICBqKys7CisgICAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAzMl07CisgICAgICAgICAgaisrOworICAgICAgICAgIHJlc3VsdFtqXSA9IHQ0IF49IHJlc3VsdFtqIC0gMzJdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBBRVMyNTZDaXBoZXI7Cit9KEFFU0Jhc2VDaXBoZXIpOworCitleHBvcnRzLkFFUzI1NkNpcGhlciA9IEFFUzI1NkNpcGhlcjsKKwordmFyIFBERjE3ID0gZnVuY3Rpb24gUERGMTdDbG9zdXJlKCkgeworICBmdW5jdGlvbiBjb21wYXJlQnl0ZUFycmF5cyhhcnJheTEsIGFycmF5MikgeworICAgIGlmIChhcnJheTEubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChhcnJheTFbaV0gIT09IGFycmF5MltpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmdW5jdGlvbiBQREYxNygpIHt9CisKKyAgUERGMTcucHJvdG90eXBlID0geworICAgIGNoZWNrT3duZXJQYXNzd29yZDogZnVuY3Rpb24gUERGMTdfY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1c2VyQnl0ZXMsIG93bmVyUGFzc3dvcmQpIHsKKyAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDU2KTsKKyAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CisgICAgICBoYXNoRGF0YS5zZXQob3duZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyVmFsaWRhdGlvblNhbHQubGVuZ3RoKTsKKyAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7CisgICAgICByZXR1cm4gY29tcGFyZUJ5dGVBcnJheXMocmVzdWx0LCBvd25lclBhc3N3b3JkKTsKKyAgICB9LAorICAgIGNoZWNrVXNlclBhc3N3b3JkOiBmdW5jdGlvbiBQREYxN19jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpIHsKKyAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOworICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKKyAgICAgIGhhc2hEYXRhLnNldCh1c2VyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlU0hBMjU2KGhhc2hEYXRhLCAwLCBoYXNoRGF0YS5sZW5ndGgpOworICAgICAgcmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKHJlc3VsdCwgdXNlclBhc3N3b3JkKTsKKyAgICB9LAorICAgIGdldE93bmVyS2V5OiBmdW5jdGlvbiBQREYxN19nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1c2VyQnl0ZXMsIG93bmVyRW5jcnlwdGlvbikgeworICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOworICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKKyAgICAgIGhhc2hEYXRhLnNldChvd25lcktleVNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lcktleVNhbHQubGVuZ3RoKTsKKyAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7CisgICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpOworICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKKyAgICB9LAorICAgIGdldFVzZXJLZXk6IGZ1bmN0aW9uIFBERjE3X2dldFVzZXJLZXkocGFzc3dvcmQsIHVzZXJLZXlTYWx0LCB1c2VyRW5jcnlwdGlvbikgeworICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CisgICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOworICAgICAgaGFzaERhdGEuc2V0KHVzZXJLZXlTYWx0LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgdmFyIGtleSA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTsKKyAgICAgIHZhciBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CisgICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayh1c2VyRW5jcnlwdGlvbiwgZmFsc2UsIG5ldyBVaW50OEFycmF5KDE2KSk7CisgICAgfQorICB9OworICByZXR1cm4gUERGMTc7Cit9KCk7CisKK2V4cG9ydHMuUERGMTcgPSBQREYxNzsKKwordmFyIFBERjIwID0gZnVuY3Rpb24gUERGMjBDbG9zdXJlKCkgeworICBmdW5jdGlvbiBjb25jYXRBcnJheXMoYXJyYXkxLCBhcnJheTIpIHsKKyAgICB2YXIgdCA9IG5ldyBVaW50OEFycmF5KGFycmF5MS5sZW5ndGggKyBhcnJheTIubGVuZ3RoKTsKKyAgICB0LnNldChhcnJheTEsIDApOworICAgIHQuc2V0KGFycmF5MiwgYXJyYXkxLmxlbmd0aCk7CisgICAgcmV0dXJuIHQ7CisgIH0KKworICBmdW5jdGlvbiBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGlucHV0LCB1c2VyQnl0ZXMpIHsKKyAgICB2YXIgayA9IGNhbGN1bGF0ZVNIQTI1NihpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKS5zdWJhcnJheSgwLCAzMik7CisgICAgdmFyIGUgPSBbMF07CisgICAgdmFyIGkgPSAwOworCisgICAgd2hpbGUgKGkgPCA2NCB8fCBlW2UubGVuZ3RoIC0gMV0gPiBpIC0gMzIpIHsKKyAgICAgIHZhciBhcnJheUxlbmd0aCA9IHBhc3N3b3JkLmxlbmd0aCArIGsubGVuZ3RoICsgdXNlckJ5dGVzLmxlbmd0aDsKKyAgICAgIHZhciBrMSA9IG5ldyBVaW50OEFycmF5KGFycmF5TGVuZ3RoICogNjQpOworICAgICAgdmFyIGFycmF5ID0gY29uY2F0QXJyYXlzKHBhc3N3b3JkLCBrKTsKKyAgICAgIGFycmF5ID0gY29uY2F0QXJyYXlzKGFycmF5LCB1c2VyQnl0ZXMpOworCisgICAgICBmb3IgKHZhciBqID0gMCwgcG9zID0gMDsgaiA8IDY0OyBqKyssIHBvcyArPSBhcnJheUxlbmd0aCkgeworICAgICAgICBrMS5zZXQoYXJyYXksIHBvcyk7CisgICAgICB9CisKKyAgICAgIHZhciBjaXBoZXIgPSBuZXcgQUVTMTI4Q2lwaGVyKGsuc3ViYXJyYXkoMCwgMTYpKTsKKyAgICAgIGUgPSBjaXBoZXIuZW5jcnlwdChrMSwgay5zdWJhcnJheSgxNiwgMzIpKTsKKyAgICAgIHZhciByZW1haW5kZXIgPSAwOworCisgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IDE2OyB6KyspIHsKKyAgICAgICAgcmVtYWluZGVyICo9IDI1NiAlIDM7CisgICAgICAgIHJlbWFpbmRlciAlPSAzOworICAgICAgICByZW1haW5kZXIgKz0gKGVbel0gPj4+IDApICUgMzsKKyAgICAgICAgcmVtYWluZGVyICU9IDM7CisgICAgICB9CisKKyAgICAgIGlmIChyZW1haW5kZXIgPT09IDApIHsKKyAgICAgICAgayA9IGNhbGN1bGF0ZVNIQTI1NihlLCAwLCBlLmxlbmd0aCk7CisgICAgICB9IGVsc2UgaWYgKHJlbWFpbmRlciA9PT0gMSkgeworICAgICAgICBrID0gY2FsY3VsYXRlU0hBMzg0KGUsIDAsIGUubGVuZ3RoKTsKKyAgICAgIH0gZWxzZSBpZiAocmVtYWluZGVyID09PSAyKSB7CisgICAgICAgIGsgPSBjYWxjdWxhdGVTSEE1MTIoZSwgMCwgZS5sZW5ndGgpOworICAgICAgfQorCisgICAgICBpKys7CisgICAgfQorCisgICAgcmV0dXJuIGsuc3ViYXJyYXkoMCwgMzIpOworICB9CisKKyAgZnVuY3Rpb24gUERGMjAoKSB7fQorCisgIGZ1bmN0aW9uIGNvbXBhcmVCeXRlQXJyYXlzKGFycmF5MSwgYXJyYXkyKSB7CisgICAgaWYgKGFycmF5MS5sZW5ndGggIT09IGFycmF5Mi5sZW5ndGgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5MS5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFBERjIwLnByb3RvdHlwZSA9IHsKKyAgICBoYXNoOiBmdW5jdGlvbiBQREYyMF9oYXNoKHBhc3N3b3JkLCBjb25jYXRCeXRlcywgdXNlckJ5dGVzKSB7CisgICAgICByZXR1cm4gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBjb25jYXRCeXRlcywgdXNlckJ5dGVzKTsKKyAgICB9LAorICAgIGNoZWNrT3duZXJQYXNzd29yZDogZnVuY3Rpb24gUERGMjBfY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1c2VyQnl0ZXMsIG93bmVyUGFzc3dvcmQpIHsKKyAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDU2KTsKKyAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CisgICAgICBoYXNoRGF0YS5zZXQob3duZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyVmFsaWRhdGlvblNhbHQubGVuZ3RoKTsKKyAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCB1c2VyQnl0ZXMpOworICAgICAgcmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKHJlc3VsdCwgb3duZXJQYXNzd29yZCk7CisgICAgfSwKKyAgICBjaGVja1VzZXJQYXNzd29yZDogZnVuY3Rpb24gUERGMjBfY2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlclBhc3N3b3JkKSB7CisgICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTsKKyAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CisgICAgICBoYXNoRGF0YS5zZXQodXNlclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaGFzaERhdGEsIFtdKTsKKyAgICAgIHJldHVybiBjb21wYXJlQnl0ZUFycmF5cyhyZXN1bHQsIHVzZXJQYXNzd29yZCk7CisgICAgfSwKKyAgICBnZXRPd25lcktleTogZnVuY3Rpb24gUERGMjBfZ2V0T3duZXJLZXkocGFzc3dvcmQsIG93bmVyS2V5U2FsdCwgdXNlckJ5dGVzLCBvd25lckVuY3J5cHRpb24pIHsKKyAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDU2KTsKKyAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CisgICAgICBoYXNoRGF0YS5zZXQob3duZXJLZXlTYWx0LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJLZXlTYWx0Lmxlbmd0aCk7CisgICAgICB2YXIga2V5ID0gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgdXNlckJ5dGVzKTsKKyAgICAgIHZhciBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CisgICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhvd25lckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpOworICAgIH0sCisgICAgZ2V0VXNlcktleTogZnVuY3Rpb24gUERGMjBfZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKSB7CisgICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTsKKyAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CisgICAgICBoYXNoRGF0YS5zZXQodXNlcktleVNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICB2YXIga2V5ID0gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgW10pOworICAgICAgdmFyIGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKKyAgICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKHVzZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKKyAgICB9CisgIH07CisgIHJldHVybiBQREYyMDsKK30oKTsKKworZXhwb3J0cy5QREYyMCA9IFBERjIwOworCit2YXIgQ2lwaGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtKHN0cmluZ0NpcGhlckNvbnN0cnVjdG9yLCBzdHJlYW1DaXBoZXJDb25zdHJ1Y3RvcikgeworICAgIHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IgPSBzdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcjsKKyAgICB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yID0gc3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I7CisgIH0KKworICBDaXBoZXJUcmFuc2Zvcm0ucHJvdG90eXBlID0geworICAgIGNyZWF0ZVN0cmVhbTogZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtX2NyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCkgeworICAgICAgdmFyIGNpcGhlciA9IG5ldyB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yKCk7CisgICAgICByZXR1cm4gbmV3IF9zdHJlYW0uRGVjcnlwdFN0cmVhbShzdHJlYW0sIGxlbmd0aCwgZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRGVjcnlwdFN0cmVhbShkYXRhLCBmaW5hbGl6ZSkgeworICAgICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CisgICAgICB9KTsKKyAgICB9LAorICAgIGRlY3J5cHRTdHJpbmc6IGZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybV9kZWNyeXB0U3RyaW5nKHMpIHsKKyAgICAgIHZhciBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOworICAgICAgdmFyIGRhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykocyk7CisgICAgICBkYXRhID0gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCB0cnVlKTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZGF0YSk7CisgICAgfSwKKyAgICBlbmNyeXB0U3RyaW5nOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fZW5jcnlwdFN0cmluZyhzKSB7CisgICAgICB2YXIgY2lwaGVyID0gbmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IoKTsKKworICAgICAgaWYgKGNpcGhlciBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpIHsKKyAgICAgICAgdmFyIHN0ckxlbiA9IHMubGVuZ3RoOworICAgICAgICB2YXIgcGFkID0gMTYgLSBzdHJMZW4gJSAxNjsKKworICAgICAgICBpZiAocGFkICE9PSAxNikgeworICAgICAgICAgIHMgPSBzLnBhZEVuZCgxNiAqIE1hdGguY2VpbChzdHJMZW4gLyAxNiksIFN0cmluZy5mcm9tQ2hhckNvZGUocGFkKSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgaXYgPSBuZXcgVWludDhBcnJheSgxNik7CisKKyAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBpdltpXSA9IE1hdGguZmxvb3IoMjU2ICogTWF0aC5yYW5kb20oKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIF9kYXRhID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHMpOworCisgICAgICAgIF9kYXRhID0gY2lwaGVyLmVuY3J5cHQoX2RhdGEsIGl2KTsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KDE2ICsgX2RhdGEubGVuZ3RoKTsKKyAgICAgICAgYnVmLnNldChpdik7CisgICAgICAgIGJ1Zi5zZXQoX2RhdGEsIDE2KTsKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShidWYpOworICAgICAgfQorCisgICAgICB2YXIgZGF0YSA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShzKTsKKyAgICAgIGRhdGEgPSBjaXBoZXIuZW5jcnlwdChkYXRhKTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZGF0YSk7CisgICAgfQorICB9OworICByZXR1cm4gQ2lwaGVyVHJhbnNmb3JtOworfSgpOworCit2YXIgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeSA9IGZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybUZhY3RvcnlDbG9zdXJlKCkgeworICB2YXIgZGVmYXVsdFBhc3N3b3JkQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMHgyOCwgMHhCRiwgMHg0RSwgMHg1RSwgMHg0RSwgMHg3NSwgMHg4QSwgMHg0MSwgMHg2NCwgMHgwMCwgMHg0RSwgMHg1NiwgMHhGRiwgMHhGQSwgMHgwMSwgMHgwOCwgMHgyRSwgMHgyRSwgMHgwMCwgMHhCNiwgMHhEMCwgMHg2OCwgMHgzRSwgMHg4MCwgMHgyRiwgMHgwQywgMHhBOSwgMHhGRSwgMHg2NCwgMHg1MywgMHg2OSwgMHg3QV0pOworCisgIGZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRpb25LZXkyMChyZXZpc2lvbiwgcGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIG93bmVyS2V5U2FsdCwgdUJ5dGVzLCB1c2VyUGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlcktleVNhbHQsIG93bmVyRW5jcnlwdGlvbiwgdXNlckVuY3J5cHRpb24sIHBlcm1zKSB7CisgICAgaWYgKHBhc3N3b3JkKSB7CisgICAgICB2YXIgcGFzc3dvcmRMZW5ndGggPSBNYXRoLm1pbigxMjcsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICBwYXNzd29yZCA9IHBhc3N3b3JkLnN1YmFycmF5KDAsIHBhc3N3b3JkTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgcGFzc3dvcmQgPSBbXTsKKyAgICB9CisKKyAgICB2YXIgcGRmQWxnb3JpdGhtOworCisgICAgaWYgKHJldmlzaW9uID09PSA2KSB7CisgICAgICBwZGZBbGdvcml0aG0gPSBuZXcgUERGMjAoKTsKKyAgICB9IGVsc2UgeworICAgICAgcGRmQWxnb3JpdGhtID0gbmV3IFBERjE3KCk7CisgICAgfQorCisgICAgaWYgKHBkZkFsZ29yaXRobS5jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpKSB7CisgICAgICByZXR1cm4gcGRmQWxnb3JpdGhtLmdldFVzZXJLZXkocGFzc3dvcmQsIHVzZXJLZXlTYWx0LCB1c2VyRW5jcnlwdGlvbik7CisgICAgfSBlbHNlIGlmIChwYXNzd29yZC5sZW5ndGggJiYgcGRmQWxnb3JpdGhtLmNoZWNrT3duZXJQYXNzd29yZChwYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgdUJ5dGVzLCBvd25lclBhc3N3b3JkKSkgeworICAgICAgcmV0dXJuIHBkZkFsZ29yaXRobS5nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIG93bmVyRW5jcnlwdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBmdW5jdGlvbiBwcmVwYXJlS2V5RGF0YShmaWxlSWQsIHBhc3N3b3JkLCBvd25lclBhc3N3b3JkLCB1c2VyUGFzc3dvcmQsIGZsYWdzLCByZXZpc2lvbiwga2V5TGVuZ3RoLCBlbmNyeXB0TWV0YWRhdGEpIHsKKyAgICB2YXIgaGFzaERhdGFTaXplID0gNDAgKyBvd25lclBhc3N3b3JkLmxlbmd0aCArIGZpbGVJZC5sZW5ndGg7CisgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkoaGFzaERhdGFTaXplKSwKKyAgICAgICAgaSA9IDAsCisgICAgICAgIGosCisgICAgICAgIG47CisKKyAgICBpZiAocGFzc3dvcmQpIHsKKyAgICAgIG4gPSBNYXRoLm1pbigzMiwgcGFzc3dvcmQubGVuZ3RoKTsKKworICAgICAgZm9yICg7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgaGFzaERhdGFbaV0gPSBwYXNzd29yZFtpXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBqID0gMDsKKworICAgIHdoaWxlIChpIDwgMzIpIHsKKyAgICAgIGhhc2hEYXRhW2krK10gPSBkZWZhdWx0UGFzc3dvcmRCeXRlc1tqKytdOworICAgIH0KKworICAgIGZvciAoaiA9IDAsIG4gPSBvd25lclBhc3N3b3JkLmxlbmd0aDsgaiA8IG47ICsraikgeworICAgICAgaGFzaERhdGFbaSsrXSA9IG93bmVyUGFzc3dvcmRbal07CisgICAgfQorCisgICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzICYgMHhmZjsKKyAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgPj4gOCAmIDB4ZmY7CisgICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+IDE2ICYgMHhmZjsKKyAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgPj4+IDI0ICYgMHhmZjsKKworICAgIGZvciAoaiA9IDAsIG4gPSBmaWxlSWQubGVuZ3RoOyBqIDwgbjsgKytqKSB7CisgICAgICBoYXNoRGF0YVtpKytdID0gZmlsZUlkW2pdOworICAgIH0KKworICAgIGlmIChyZXZpc2lvbiA+PSA0ICYmICFlbmNyeXB0TWV0YWRhdGEpIHsKKyAgICAgIGhhc2hEYXRhW2krK10gPSAweGZmOworICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7CisgICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjsKKyAgICAgIGhhc2hEYXRhW2krK10gPSAweGZmOworICAgIH0KKworICAgIHZhciBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTsKKyAgICB2YXIga2V5TGVuZ3RoSW5CeXRlcyA9IGtleUxlbmd0aCA+PiAzOworCisgICAgaWYgKHJldmlzaW9uID49IDMpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCA1MDsgKytqKSB7CisgICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaCwgMCwga2V5TGVuZ3RoSW5CeXRlcyk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGVuY3J5cHRpb25LZXkgPSBoYXNoLnN1YmFycmF5KDAsIGtleUxlbmd0aEluQnl0ZXMpOworICAgIHZhciBjaXBoZXIsIGNoZWNrRGF0YTsKKworICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkgeworICAgICAgICBoYXNoRGF0YVtpXSA9IGRlZmF1bHRQYXNzd29yZEJ5dGVzW2ldOworICAgICAgfQorCisgICAgICBmb3IgKGogPSAwLCBuID0gZmlsZUlkLmxlbmd0aDsgaiA8IG47ICsraikgeworICAgICAgICBoYXNoRGF0YVtpKytdID0gZmlsZUlkW2pdOworICAgICAgfQorCisgICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihlbmNyeXB0aW9uS2V5KTsKKyAgICAgIGNoZWNrRGF0YSA9IGNpcGhlci5lbmNyeXB0QmxvY2soY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKSk7CisgICAgICBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7CisgICAgICB2YXIgZGVyaXZlZEtleSA9IG5ldyBVaW50OEFycmF5KG4pLAorICAgICAgICAgIGs7CisKKyAgICAgIGZvciAoaiA9IDE7IGogPD0gMTk7ICsraikgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgICAgICAgZGVyaXZlZEtleVtrXSA9IGVuY3J5cHRpb25LZXlba10gXiBqOworICAgICAgICB9CisKKyAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7CisgICAgICAgIGNoZWNrRGF0YSA9IGNpcGhlci5lbmNyeXB0QmxvY2soY2hlY2tEYXRhKTsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gMCwgbiA9IGNoZWNrRGF0YS5sZW5ndGg7IGogPCBuOyArK2opIHsKKyAgICAgICAgaWYgKHVzZXJQYXNzd29yZFtqXSAhPT0gY2hlY2tEYXRhW2pdKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZW5jcnlwdGlvbktleSk7CisgICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGRlZmF1bHRQYXNzd29yZEJ5dGVzKTsKKworICAgICAgZm9yIChqID0gMCwgbiA9IGNoZWNrRGF0YS5sZW5ndGg7IGogPCBuOyArK2opIHsKKyAgICAgICAgaWYgKHVzZXJQYXNzd29yZFtqXSAhPT0gY2hlY2tEYXRhW2pdKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZW5jcnlwdGlvbktleTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVVzZXJQYXNzd29yZChwYXNzd29yZCwgb3duZXJQYXNzd29yZCwgcmV2aXNpb24sIGtleUxlbmd0aCkgeworICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KDMyKSwKKyAgICAgICAgaSA9IDAsCisgICAgICAgIGosCisgICAgICAgIG47CisgICAgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOworCisgICAgZm9yICg7IGkgPCBuOyArK2kpIHsKKyAgICAgIGhhc2hEYXRhW2ldID0gcGFzc3dvcmRbaV07CisgICAgfQorCisgICAgaiA9IDA7CisKKyAgICB3aGlsZSAoaSA8IDMyKSB7CisgICAgICBoYXNoRGF0YVtpKytdID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTsKKyAgICB9CisKKyAgICB2YXIgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CisgICAgdmFyIGtleUxlbmd0aEluQnl0ZXMgPSBrZXlMZW5ndGggPj4gMzsKKworICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgeworICAgICAgICBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2gsIDAsIGhhc2gubGVuZ3RoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY2lwaGVyLCB1c2VyUGFzc3dvcmQ7CisKKyAgICBpZiAocmV2aXNpb24gPj0gMykgeworICAgICAgdXNlclBhc3N3b3JkID0gb3duZXJQYXNzd29yZDsKKyAgICAgIHZhciBkZXJpdmVkS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5TGVuZ3RoSW5CeXRlcyksCisgICAgICAgICAgazsKKworICAgICAgZm9yIChqID0gMTk7IGogPj0gMDsgai0tKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBrZXlMZW5ndGhJbkJ5dGVzOyArK2spIHsKKyAgICAgICAgICBkZXJpdmVkS2V5W2tdID0gaGFzaFtrXSBeIGo7CisgICAgICAgIH0KKworICAgICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihkZXJpdmVkS2V5KTsKKyAgICAgICAgdXNlclBhc3N3b3JkID0gY2lwaGVyLmVuY3J5cHRCbG9jayh1c2VyUGFzc3dvcmQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihoYXNoLnN1YmFycmF5KDAsIGtleUxlbmd0aEluQnl0ZXMpKTsKKyAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sob3duZXJQYXNzd29yZCk7CisgICAgfQorCisgICAgcmV0dXJuIHVzZXJQYXNzd29yZDsKKyAgfQorCisgIHZhciBpZGVudGl0eU5hbWUgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSWRlbnRpdHkiKTsKKworICBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KGRpY3QsIGZpbGVJZCwgcGFzc3dvcmQpIHsKKyAgICB2YXIgZmlsdGVyID0gZGljdC5nZXQoIkZpbHRlciIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmaWx0ZXIsICJTdGFuZGFyZCIpKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoInVua25vd24gZW5jcnlwdGlvbiBtZXRob2QiKTsKKyAgICB9CisKKyAgICB0aGlzLmRpY3QgPSBkaWN0OworICAgIHZhciBhbGdvcml0aG0gPSBkaWN0LmdldCgiViIpOworCisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGFsZ29yaXRobSkgfHwgYWxnb3JpdGhtICE9PSAxICYmIGFsZ29yaXRobSAhPT0gMiAmJiBhbGdvcml0aG0gIT09IDQgJiYgYWxnb3JpdGhtICE9PSA1KSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoInVuc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnb3JpdGhtIik7CisgICAgfQorCisgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CisgICAgdmFyIGtleUxlbmd0aCA9IGRpY3QuZ2V0KCJMZW5ndGgiKTsKKworICAgIGlmICgha2V5TGVuZ3RoKSB7CisgICAgICBpZiAoYWxnb3JpdGhtIDw9IDMpIHsKKyAgICAgICAga2V5TGVuZ3RoID0gNDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgY2ZEaWN0ID0gZGljdC5nZXQoIkNGIik7CisgICAgICAgIHZhciBzdHJlYW1DcnlwdG9OYW1lID0gZGljdC5nZXQoIlN0bUYiKTsKKworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY2ZEaWN0KSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShzdHJlYW1DcnlwdG9OYW1lKSkgeworICAgICAgICAgIGNmRGljdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOworICAgICAgICAgIHZhciBoYW5kbGVyRGljdCA9IGNmRGljdC5nZXQoc3RyZWFtQ3J5cHRvTmFtZS5uYW1lKTsKKyAgICAgICAgICBrZXlMZW5ndGggPSBoYW5kbGVyRGljdCAmJiBoYW5kbGVyRGljdC5nZXQoIkxlbmd0aCIpIHx8IDEyODsKKworICAgICAgICAgIGlmIChrZXlMZW5ndGggPCA0MCkgeworICAgICAgICAgICAga2V5TGVuZ3RoIDw8PSAzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihrZXlMZW5ndGgpIHx8IGtleUxlbmd0aCA8IDQwIHx8IGtleUxlbmd0aCAlIDggIT09IDApIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBrZXkgbGVuZ3RoIik7CisgICAgfQorCisgICAgdmFyIG93bmVyUGFzc3dvcmQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIk8iKSkuc3ViYXJyYXkoMCwgMzIpOworICAgIHZhciB1c2VyUGFzc3dvcmQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIlUiKSkuc3ViYXJyYXkoMCwgMzIpOworICAgIHZhciBmbGFncyA9IGRpY3QuZ2V0KCJQIik7CisgICAgdmFyIHJldmlzaW9uID0gZGljdC5nZXQoIlIiKTsKKyAgICB2YXIgZW5jcnlwdE1ldGFkYXRhID0gKGFsZ29yaXRobSA9PT0gNCB8fCBhbGdvcml0aG0gPT09IDUpICYmIGRpY3QuZ2V0KCJFbmNyeXB0TWV0YWRhdGEiKSAhPT0gZmFsc2U7CisgICAgdGhpcy5lbmNyeXB0TWV0YWRhdGEgPSBlbmNyeXB0TWV0YWRhdGE7CisgICAgdmFyIGZpbGVJZEJ5dGVzID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGZpbGVJZCk7CisgICAgdmFyIHBhc3N3b3JkQnl0ZXM7CisKKyAgICBpZiAocGFzc3dvcmQpIHsKKyAgICAgIGlmIChyZXZpc2lvbiA9PT0gNikgeworICAgICAgICB0cnkgeworICAgICAgICAgIHBhc3N3b3JkID0gKDAsIF91dGlsLnV0ZjhTdHJpbmdUb1N0cmluZykocGFzc3dvcmQpOworICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeTogIiArICJVbmFibGUgdG8gY29udmVydCBVVEY4IGVuY29kZWQgcGFzc3dvcmQuIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcGFzc3dvcmRCeXRlcyA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShwYXNzd29yZCk7CisgICAgfQorCisgICAgdmFyIGVuY3J5cHRpb25LZXk7CisKKyAgICBpZiAoYWxnb3JpdGhtICE9PSA1KSB7CisgICAgICBlbmNyeXB0aW9uS2V5ID0gcHJlcGFyZUtleURhdGEoZmlsZUlkQnl0ZXMsIHBhc3N3b3JkQnl0ZXMsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBvd25lclZhbGlkYXRpb25TYWx0ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJPIikpLnN1YmFycmF5KDMyLCA0MCk7CisgICAgICB2YXIgb3duZXJLZXlTYWx0ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJPIikpLnN1YmFycmF5KDQwLCA0OCk7CisgICAgICB2YXIgdUJ5dGVzID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJVIikpLnN1YmFycmF5KDAsIDQ4KTsKKyAgICAgIHZhciB1c2VyVmFsaWRhdGlvblNhbHQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIlUiKSkuc3ViYXJyYXkoMzIsIDQwKTsKKyAgICAgIHZhciB1c2VyS2V5U2FsdCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiVSIpKS5zdWJhcnJheSg0MCwgNDgpOworICAgICAgdmFyIG93bmVyRW5jcnlwdGlvbiA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiT0UiKSk7CisgICAgICB2YXIgdXNlckVuY3J5cHRpb24gPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIlVFIikpOworICAgICAgdmFyIHBlcm1zID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJQZXJtcyIpKTsKKyAgICAgIGVuY3J5cHRpb25LZXkgPSBjcmVhdGVFbmNyeXB0aW9uS2V5MjAocmV2aXNpb24sIHBhc3N3b3JkQnl0ZXMsIG93bmVyUGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIG93bmVyS2V5U2FsdCwgdUJ5dGVzLCB1c2VyUGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlcktleVNhbHQsIG93bmVyRW5jcnlwdGlvbiwgdXNlckVuY3J5cHRpb24sIHBlcm1zKTsKKyAgICB9CisKKyAgICBpZiAoIWVuY3J5cHRpb25LZXkgJiYgIXBhc3N3b3JkKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24oIk5vIHBhc3N3b3JkIGdpdmVuIiwgX3V0aWwuUGFzc3dvcmRSZXNwb25zZXMuTkVFRF9QQVNTV09SRCk7CisgICAgfSBlbHNlIGlmICghZW5jcnlwdGlvbktleSAmJiBwYXNzd29yZCkgeworICAgICAgdmFyIGRlY29kZWRQYXNzd29yZCA9IGRlY29kZVVzZXJQYXNzd29yZChwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCByZXZpc2lvbiwga2V5TGVuZ3RoKTsKKyAgICAgIGVuY3J5cHRpb25LZXkgPSBwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgZGVjb2RlZFBhc3N3b3JkLCBvd25lclBhc3N3b3JkLCB1c2VyUGFzc3dvcmQsIGZsYWdzLCByZXZpc2lvbiwga2V5TGVuZ3RoLCBlbmNyeXB0TWV0YWRhdGEpOworICAgIH0KKworICAgIGlmICghZW5jcnlwdGlvbktleSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKCJJbmNvcnJlY3QgUGFzc3dvcmQiLCBfdXRpbC5QYXNzd29yZFJlc3BvbnNlcy5JTkNPUlJFQ1RfUEFTU1dPUkQpOworICAgIH0KKworICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXk7CisKKyAgICBpZiAoYWxnb3JpdGhtID49IDQpIHsKKyAgICAgIHZhciBjZiA9IGRpY3QuZ2V0KCJDRiIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY2YpKSB7CisgICAgICAgIGNmLnN1cHByZXNzRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHRoaXMuY2YgPSBjZjsKKyAgICAgIHRoaXMuc3RtZiA9IGRpY3QuZ2V0KCJTdG1GIikgfHwgaWRlbnRpdHlOYW1lOworICAgICAgdGhpcy5zdHJmID0gZGljdC5nZXQoIlN0ckYiKSB8fCBpZGVudGl0eU5hbWU7CisgICAgICB0aGlzLmVmZiA9IGRpY3QuZ2V0KCJFRkYiKSB8fCB0aGlzLnN0bWY7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGVuY3J5cHRpb25LZXksIGlzQWVzKSB7CisgICAgdmFyIGtleSA9IG5ldyBVaW50OEFycmF5KGVuY3J5cHRpb25LZXkubGVuZ3RoICsgOSksCisgICAgICAgIGksCisgICAgICAgIG47CisKKyAgICBmb3IgKGkgPSAwLCBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKKyAgICAgIGtleVtpXSA9IGVuY3J5cHRpb25LZXlbaV07CisgICAgfQorCisgICAga2V5W2krK10gPSBudW0gJiAweGZmOworICAgIGtleVtpKytdID0gbnVtID4+IDggJiAweGZmOworICAgIGtleVtpKytdID0gbnVtID4+IDE2ICYgMHhmZjsKKyAgICBrZXlbaSsrXSA9IGdlbiAmIDB4ZmY7CisgICAga2V5W2krK10gPSBnZW4gPj4gOCAmIDB4ZmY7CisKKyAgICBpZiAoaXNBZXMpIHsKKyAgICAgIGtleVtpKytdID0gMHg3MzsKKyAgICAgIGtleVtpKytdID0gMHg0MTsKKyAgICAgIGtleVtpKytdID0gMHg2YzsKKyAgICAgIGtleVtpKytdID0gMHg1NDsKKyAgICB9CisKKyAgICB2YXIgaGFzaCA9IGNhbGN1bGF0ZU1ENShrZXksIDAsIGkpOworICAgIHJldHVybiBoYXNoLnN1YmFycmF5KDAsIE1hdGgubWluKGVuY3J5cHRpb25LZXkubGVuZ3RoICsgNSwgMTYpKTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkQ2lwaGVyQ29uc3RydWN0b3IoY2YsIG5hbWUsIG51bSwgZ2VuLCBrZXkpIHsKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG5hbWUpKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgY3J5cHQgZmlsdGVyIG5hbWUuIik7CisgICAgfQorCisgICAgdmFyIGNyeXB0RmlsdGVyID0gY2YuZ2V0KG5hbWUubmFtZSk7CisgICAgdmFyIGNmbTsKKworICAgIGlmIChjcnlwdEZpbHRlciAhPT0gbnVsbCAmJiBjcnlwdEZpbHRlciAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBjZm0gPSBjcnlwdEZpbHRlci5nZXQoIkNGTSIpOworICAgIH0KKworICAgIGlmICghY2ZtIHx8IGNmbS5uYW1lID09PSAiTm9uZSIpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1GYWN0b3J5QnVpbGRDaXBoZXJDb25zdHJ1Y3Rvck5vbmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTnVsbENpcGhlcigpOworICAgICAgfTsKKyAgICB9CisKKyAgICBpZiAoY2ZtLm5hbWUgPT09ICJWMiIpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1GYWN0b3J5QnVpbGRDaXBoZXJDb25zdHJ1Y3RvclYyKCkgeworICAgICAgICByZXR1cm4gbmV3IEFSQ0ZvdXJDaXBoZXIoYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGtleSwgZmFsc2UpKTsKKyAgICAgIH07CisgICAgfQorCisgICAgaWYgKGNmbS5uYW1lID09PSAiQUVTVjIiKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JBRVNWMigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBRVMxMjhDaXBoZXIoYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGtleSwgdHJ1ZSkpOworICAgICAgfTsKKyAgICB9CisKKyAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMyIpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1GYWN0b3J5QnVpbGRDaXBoZXJDb25zdHJ1Y3RvckFFU1YzKCkgeworICAgICAgICByZXR1cm4gbmV3IEFFUzI1NkNpcGhlcihrZXkpOworICAgICAgfTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVua25vd24gY3J5cHRvIG1ldGhvZCIpOworICB9CisKKyAgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeS5wcm90b3R5cGUgPSB7CisgICAgY3JlYXRlQ2lwaGVyVHJhbnNmb3JtOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5X2NyZWF0ZUNpcGhlclRyYW5zZm9ybShudW0sIGdlbikgeworICAgICAgaWYgKHRoaXMuYWxnb3JpdGhtID09PSA0IHx8IHRoaXMuYWxnb3JpdGhtID09PSA1KSB7CisgICAgICAgIHJldHVybiBuZXcgQ2lwaGVyVHJhbnNmb3JtKGJ1aWxkQ2lwaGVyQ29uc3RydWN0b3IodGhpcy5jZiwgdGhpcy5zdG1mLCBudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5KSwgYnVpbGRDaXBoZXJDb25zdHJ1Y3Rvcih0aGlzLmNmLCB0aGlzLnN0cmYsIG51bSwgZ2VuLCB0aGlzLmVuY3J5cHRpb25LZXkpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGtleSA9IGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCB0aGlzLmVuY3J5cHRpb25LZXksIGZhbHNlKTsKKworICAgICAgdmFyIGNpcGhlckNvbnN0cnVjdG9yID0gZnVuY3Rpb24gYnVpbGRDaXBoZXJDaXBoZXJDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGtleSk7CisgICAgICB9OworCisgICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShjaXBoZXJDb25zdHJ1Y3RvciwgY2lwaGVyQ29uc3RydWN0b3IpOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIENpcGhlclRyYW5zZm9ybUZhY3Rvcnk7Cit9KCk7CisKK2V4cG9ydHMuQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeSA9IENpcGhlclRyYW5zZm9ybUZhY3Rvcnk7CisKKy8qKiovIH0pLAorLyogMjIwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQ29sb3JTcGFjZSA9IHZvaWQgMDsKKwordmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXygyKSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjAyKTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDUpOworCitmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAiZGVmYXVsdCI6IG9iaiB9OyB9CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH0KKworZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7IGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK2Z1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKHNyYywgZGVzdCwgdzEsIGgxLCB3MiwgaDIsIGFscGhhMDEpIHsKKyAgdmFyIENPTVBPTkVOVFMgPSAzOworICBhbHBoYTAxID0gYWxwaGEwMSAhPT0gMSA/IDAgOiBhbHBoYTAxOworICB2YXIgeFJhdGlvID0gdzEgLyB3MjsKKyAgdmFyIHlSYXRpbyA9IGgxIC8gaDI7CisgIHZhciBuZXdJbmRleCA9IDAsCisgICAgICBvbGRJbmRleDsKKyAgdmFyIHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpOworICB2YXIgdzFTY2FubGluZSA9IHcxICogQ09NUE9ORU5UUzsKKworICBmb3IgKHZhciBpID0gMDsgaSA8IHcyOyBpKyspIHsKKyAgICB4U2NhbGVkW2ldID0gTWF0aC5mbG9vcihpICogeFJhdGlvKSAqIENPTVBPTkVOVFM7CisgIH0KKworICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgaDI7IF9pKyspIHsKKyAgICB2YXIgcHkgPSBNYXRoLmZsb29yKF9pICogeVJhdGlvKSAqIHcxU2NhbmxpbmU7CisKKyAgICBmb3IgKHZhciBqID0gMDsgaiA8IHcyOyBqKyspIHsKKyAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOworICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IHNyY1tvbGRJbmRleCsrXTsKKyAgICAgIGRlc3RbbmV3SW5kZXgrK10gPSBzcmNbb2xkSW5kZXgrK107CisgICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOworICAgICAgbmV3SW5kZXggKz0gYWxwaGEwMTsKKyAgICB9CisgIH0KK30KKwordmFyIENvbG9yU3BhY2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDb2xvclNwYWNlKG5hbWUsIG51bUNvbXBzKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbG9yU3BhY2UpOworCisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IENvbG9yU3BhY2UpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIENvbG9yU3BhY2UuIik7CisgICAgfQorCisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB0aGlzLm51bUNvbXBzID0gbnVtQ29tcHM7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQ29sb3JTcGFjZSwgW3sKKyAgICBrZXk6ICJnZXRSZ2IiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZ2Ioc3JjLCBzcmNPZmZzZXQpIHsKKyAgICAgIHZhciByZ2IgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7CisgICAgICB0aGlzLmdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIHJnYiwgMCk7CisgICAgICByZXR1cm4gcmdiOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFJnYkl0ZW0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UmdiQnVmZmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0UmdiQnVmZmVyIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0T3V0cHV0TGVuZ3RoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGgiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1Bhc3N0aHJvdWdoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaXNQYXNzdGhyb3VnaChiaXRzKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNEZWZhdWx0RGVjb2RlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CisgICAgICByZXR1cm4gQ29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCB0aGlzLm51bUNvbXBzKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmaWxsUmdiIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZmlsbFJnYihkZXN0LCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgd2lkdGgsIGhlaWdodCwgYWN0dWFsSGVpZ2h0LCBicGMsIGNvbXBzLCBhbHBoYTAxKSB7CisgICAgICB2YXIgY291bnQgPSBvcmlnaW5hbFdpZHRoICogb3JpZ2luYWxIZWlnaHQ7CisgICAgICB2YXIgcmdiQnVmID0gbnVsbDsKKyAgICAgIHZhciBudW1Db21wb25lbnRDb2xvcnMgPSAxIDw8IGJwYzsKKyAgICAgIHZhciBuZWVkc1Jlc2l6aW5nID0gb3JpZ2luYWxIZWlnaHQgIT09IGhlaWdodCB8fCBvcmlnaW5hbFdpZHRoICE9PSB3aWR0aDsKKworICAgICAgaWYgKHRoaXMuaXNQYXNzdGhyb3VnaChicGMpKSB7CisgICAgICAgIHJnYkJ1ZiA9IGNvbXBzOworICAgICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBzID09PSAxICYmIGNvdW50ID4gbnVtQ29tcG9uZW50Q29sb3JzICYmIHRoaXMubmFtZSAhPT0gIkRldmljZUdyYXkiICYmIHRoaXMubmFtZSAhPT0gIkRldmljZVJHQiIpIHsKKyAgICAgICAgdmFyIGFsbENvbG9ycyA9IGJwYyA8PSA4ID8gbmV3IFVpbnQ4QXJyYXkobnVtQ29tcG9uZW50Q29sb3JzKSA6IG5ldyBVaW50MTZBcnJheShudW1Db21wb25lbnRDb2xvcnMpOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50Q29sb3JzOyBpKyspIHsKKyAgICAgICAgICBhbGxDb2xvcnNbaV0gPSBpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNvbG9yTWFwID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG51bUNvbXBvbmVudENvbG9ycyAqIDMpOworICAgICAgICB0aGlzLmdldFJnYkJ1ZmZlcihhbGxDb2xvcnMsIDAsIG51bUNvbXBvbmVudENvbG9ycywgY29sb3JNYXAsIDAsIGJwYywgMCk7CisKKyAgICAgICAgaWYgKCFuZWVkc1Jlc2l6aW5nKSB7CisgICAgICAgICAgdmFyIGRlc3RQb3MgPSAwOworCisgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgY291bnQ7ICsrX2kyKSB7CisgICAgICAgICAgICB2YXIga2V5ID0gY29tcHNbX2kyXSAqIDM7CisgICAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXldOworICAgICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gY29sb3JNYXBba2V5ICsgMV07CisgICAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAyXTsKKyAgICAgICAgICAgIGRlc3RQb3MgKz0gYWxwaGEwMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmdiQnVmID0gbmV3IFVpbnQ4QXJyYXkoY291bnQgKiAzKTsKKyAgICAgICAgICB2YXIgcmdiUG9zID0gMDsKKworICAgICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGNvdW50OyArK19pMykgeworICAgICAgICAgICAgdmFyIF9rZXkgPSBjb21wc1tfaTNdICogMzsKKworICAgICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW19rZXldOworICAgICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW19rZXkgKyAxXTsKKyAgICAgICAgICAgIHJnYkJ1ZltyZ2JQb3MrK10gPSBjb2xvck1hcFtfa2V5ICsgMl07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW5lZWRzUmVzaXppbmcpIHsKKyAgICAgICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgd2lkdGggKiBhY3R1YWxIZWlnaHQsIGRlc3QsIDAsIGJwYywgYWxwaGEwMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmdiQnVmID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGNvdW50ICogMyk7CisgICAgICAgICAgdGhpcy5nZXRSZ2JCdWZmZXIoY29tcHMsIDAsIGNvdW50LCByZ2JCdWYsIDAsIGJwYywgMCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHJnYkJ1ZikgeworICAgICAgICBpZiAobmVlZHNSZXNpemluZykgeworICAgICAgICAgIHJlc2l6ZVJnYkltYWdlKHJnYkJ1ZiwgZGVzdCwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIGFscGhhMDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhciBfZGVzdFBvcyA9IDAsCisgICAgICAgICAgICAgIF9yZ2JQb3MgPSAwOworCisgICAgICAgICAgZm9yICh2YXIgX2k0ID0gMCwgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgX2k0IDwgaWk7IF9pNCsrKSB7CisgICAgICAgICAgICBkZXN0W19kZXN0UG9zKytdID0gcmdiQnVmW19yZ2JQb3MrK107CisgICAgICAgICAgICBkZXN0W19kZXN0UG9zKytdID0gcmdiQnVmW19yZ2JQb3MrK107CisgICAgICAgICAgICBkZXN0W19kZXN0UG9zKytdID0gcmdiQnVmW19yZ2JQb3MrK107CisgICAgICAgICAgICBfZGVzdFBvcyArPSBhbHBoYTAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInVzZXNaZXJvVG9PbmVSYW5nZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInVzZXNaZXJvVG9PbmVSYW5nZSIsIHRydWUpOworICAgIH0KKyAgfV0sIFt7CisgICAga2V5OiAiX2NhY2hlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2NhY2hlKGNhY2hlS2V5LCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSkgeworICAgICAgaWYgKCFsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFwYXJzZWRDb2xvclNwYWNlKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkQ29sb3JTcGFjZSIgYXJndW1lbnQuJyk7CisgICAgICB9CisKKyAgICAgIHZhciBjc05hbWUsIGNzUmVmOworCisgICAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgY3NSZWYgPSBjYWNoZUtleTsKKyAgICAgICAgY2FjaGVLZXkgPSB4cmVmLmZldGNoKGNhY2hlS2V5KTsKKyAgICAgIH0KKworICAgICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgeworICAgICAgICBjc05hbWUgPSBjYWNoZUtleS5uYW1lOworICAgICAgfQorCisgICAgICBpZiAoY3NOYW1lIHx8IGNzUmVmKSB7CisgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLnNldChjc05hbWUsIGNzUmVmLCBwYXJzZWRDb2xvclNwYWNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRDYWNoZWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZWQoY2FjaGVLZXksIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CisgICAgICBpZiAoIWxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5nZXRDYWNoZWQgLSBleHBlY3RlZCAibG9jYWxDb2xvclNwYWNlQ2FjaGUiIGFyZ3VtZW50LicpOworICAgICAgfQorCisgICAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgdmFyIGxvY2FsQ29sb3JTcGFjZSA9IGxvY2FsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNhY2hlS2V5KTsKKworICAgICAgICBpZiAobG9jYWxDb2xvclNwYWNlKSB7CisgICAgICAgICAgcmV0dXJuIGxvY2FsQ29sb3JTcGFjZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgY2FjaGVLZXkgPSB4cmVmLmZldGNoKGNhY2hlS2V5KTsKKyAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKKyAgICAgICAgdmFyIF9sb2NhbENvbG9yU3BhY2UgPSBsb2NhbENvbG9yU3BhY2VDYWNoZS5nZXRCeU5hbWUoY2FjaGVLZXkubmFtZSk7CisKKyAgICAgICAgaWYgKF9sb2NhbENvbG9yU3BhY2UpIHsKKyAgICAgICAgICByZXR1cm4gX2xvY2FsQ29sb3JTcGFjZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwYXJzZUFzeW5jIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9wYXJzZUFzeW5jID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoX3JlZikgeworICAgICAgICB2YXIgY3MsIHhyZWYsIF9yZWYkcmVzb3VyY2VzLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIHBhcnNlZENvbG9yU3BhY2U7CisKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY3MgPSBfcmVmLmNzLCB4cmVmID0gX3JlZi54cmVmLCBfcmVmJHJlc291cmNlcyA9IF9yZWYucmVzb3VyY2VzLCByZXNvdXJjZXMgPSBfcmVmJHJlc291cmNlcyA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBfcmVmLnBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBfcmVmLmxvY2FsQ29sb3JTcGFjZUNhY2hlOworICAgICAgICAgICAgICAgIHBhcnNlZENvbG9yU3BhY2UgPSB0aGlzLl9wYXJzZShjcywgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworCisgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGUoY3MsIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHBhcnNlZENvbG9yU3BhY2UpOworCisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIHBhcnNlQXN5bmMoX3gpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBwYXJzZUFzeW5jOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAicGFyc2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShfcmVmMikgeworICAgICAgdmFyIGNzID0gX3JlZjIuY3MsCisgICAgICAgICAgeHJlZiA9IF9yZWYyLnhyZWYsCisgICAgICAgICAgX3JlZjIkcmVzb3VyY2VzID0gX3JlZjIucmVzb3VyY2VzLAorICAgICAgICAgIHJlc291cmNlcyA9IF9yZWYyJHJlc291cmNlcyA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYyJHJlc291cmNlcywKKyAgICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnkgPSBfcmVmMi5wZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBfcmVmMi5sb2NhbENvbG9yU3BhY2VDYWNoZTsKKyAgICAgIHZhciBjYWNoZWRDb2xvclNwYWNlID0gdGhpcy5nZXRDYWNoZWQoY3MsIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKworICAgICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlZENvbG9yU3BhY2U7CisgICAgICB9CisKKyAgICAgIHZhciBwYXJzZWRDb2xvclNwYWNlID0gdGhpcy5fcGFyc2UoY3MsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKKworICAgICAgdGhpcy5fY2FjaGUoY3MsIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKTsKKworICAgICAgcmV0dXJuIHBhcnNlZENvbG9yU3BhY2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3BhcnNlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3BhcnNlKGNzLCB4cmVmKSB7CisgICAgICB2YXIgcmVzb3VyY2VzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsOworICAgICAgdmFyIHBkZkZ1bmN0aW9uRmFjdG9yeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogdW5kZWZpbmVkOworICAgICAgY3MgPSB4cmVmLmZldGNoSWZSZWYoY3MpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoY3MpKSB7CisgICAgICAgIHN3aXRjaCAoY3MubmFtZSkgeworICAgICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgorICAgICAgICAgIGNhc2UgIkciOgorICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5OworCisgICAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKKyAgICAgICAgICBjYXNlICJSR0IiOgorICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5yZ2I7CisKKyAgICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKKyAgICAgICAgICBjYXNlICJDTVlLIjoKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuY215azsKKworICAgICAgICAgIGNhc2UgIlBhdHRlcm4iOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXR0ZXJuQ1MobnVsbCk7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHJlc291cmNlcykpIHsKKyAgICAgICAgICAgICAgdmFyIGNvbG9yU3BhY2VzID0gcmVzb3VyY2VzLmdldCgiQ29sb3JTcGFjZSIpOworCisgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShjb2xvclNwYWNlcykpIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2VzQ1MgPSBjb2xvclNwYWNlcy5nZXQoY3MubmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzQ1MpIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShyZXNvdXJjZXNDUykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlKHJlc291cmNlc0NTLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGNzID0gcmVzb3VyY2VzQ1M7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbnJlY29nbml6ZWQgQ29sb3JTcGFjZTogIi5jb25jYXQoY3MubmFtZSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGNzKSkgeworICAgICAgICB2YXIgbW9kZSA9IHhyZWYuZmV0Y2hJZlJlZihjc1swXSkubmFtZTsKKyAgICAgICAgdmFyIHBhcmFtcywgbnVtQ29tcHMsIGJhc2VDUywgd2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWE7CisKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CisgICAgICAgICAgY2FzZSAiRyI6CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7CisKKyAgICAgICAgICBjYXNlICJEZXZpY2VSR0IiOgorICAgICAgICAgIGNhc2UgIlJHQiI6CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjsKKworICAgICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgorICAgICAgICAgIGNhc2UgIkNNWUsiOgorICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOworCisgICAgICAgICAgY2FzZSAiQ2FsR3JheSI6CisgICAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOworICAgICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOworICAgICAgICAgICAgYmxhY2tQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiQmxhY2tQb2ludCIpOworICAgICAgICAgICAgZ2FtbWEgPSBwYXJhbXMuZ2V0KCJHYW1tYSIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWxHcmF5Q1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEpOworCisgICAgICAgICAgY2FzZSAiQ2FsUkdCIjoKKyAgICAgICAgICAgIHBhcmFtcyA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CisgICAgICAgICAgICB3aGl0ZVBvaW50ID0gcGFyYW1zLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7CisgICAgICAgICAgICBibGFja1BvaW50ID0gcGFyYW1zLmdldEFycmF5KCJCbGFja1BvaW50Iik7CisgICAgICAgICAgICBnYW1tYSA9IHBhcmFtcy5nZXRBcnJheSgiR2FtbWEiKTsKKyAgICAgICAgICAgIHZhciBtYXRyaXggPSBwYXJhbXMuZ2V0QXJyYXkoIk1hdHJpeCIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWxSR0JDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KTsKKworICAgICAgICAgIGNhc2UgIklDQ0Jhc2VkIjoKKyAgICAgICAgICAgIHZhciBzdHJlYW0gPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOworICAgICAgICAgICAgdmFyIGRpY3QgPSBzdHJlYW0uZGljdDsKKyAgICAgICAgICAgIG51bUNvbXBzID0gZGljdC5nZXQoIk4iKTsKKyAgICAgICAgICAgIHZhciBhbHQgPSBkaWN0LmdldCgiQWx0ZXJuYXRlIik7CisKKyAgICAgICAgICAgIGlmIChhbHQpIHsKKyAgICAgICAgICAgICAgdmFyIGFsdENTID0gdGhpcy5fcGFyc2UoYWx0LCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CisKKyAgICAgICAgICAgICAgaWYgKGFsdENTLm51bUNvbXBzID09PSBudW1Db21wcykgeworICAgICAgICAgICAgICAgIHJldHVybiBhbHRDUzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSUNDQmFzZWQgY29sb3Igc3BhY2U6IElnbm9yaW5nIGluY29ycmVjdCAvQWx0ZXJuYXRlIGVudHJ5LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobnVtQ29tcHMgPT09IDEpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5OworICAgICAgICAgICAgfSBlbHNlIGlmIChudW1Db21wcyA9PT0gMykgeworICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtQ29tcHMgPT09IDQpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlBhdHRlcm4iOgorICAgICAgICAgICAgYmFzZUNTID0gY3NbMV0gfHwgbnVsbDsKKworICAgICAgICAgICAgaWYgKGJhc2VDUykgeworICAgICAgICAgICAgICBiYXNlQ1MgPSB0aGlzLl9wYXJzZShiYXNlQ1MsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXR0ZXJuQ1MoYmFzZUNTKTsKKworICAgICAgICAgIGNhc2UgIkluZGV4ZWQiOgorICAgICAgICAgIGNhc2UgIkkiOgorICAgICAgICAgICAgYmFzZUNTID0gdGhpcy5fcGFyc2UoY3NbMV0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKKyAgICAgICAgICAgIHZhciBoaVZhbCA9IHhyZWYuZmV0Y2hJZlJlZihjc1syXSkgKyAxOworICAgICAgICAgICAgdmFyIGxvb2t1cCA9IHhyZWYuZmV0Y2hJZlJlZihjc1szXSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRDUyhiYXNlQ1MsIGhpVmFsLCBsb29rdXApOworCisgICAgICAgICAgY2FzZSAiU2VwYXJhdGlvbiI6CisgICAgICAgICAgY2FzZSAiRGV2aWNlTiI6CisgICAgICAgICAgICB2YXIgbmFtZSA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CisgICAgICAgICAgICBudW1Db21wcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lLmxlbmd0aCA6IDE7CisgICAgICAgICAgICBiYXNlQ1MgPSB0aGlzLl9wYXJzZShjc1syXSwgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworICAgICAgICAgICAgdmFyIHRpbnRGbiA9IHBkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUoY3NbM10pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBBbHRlcm5hdGVDUyhudW1Db21wcywgYmFzZUNTLCB0aW50Rm4pOworCisgICAgICAgICAgY2FzZSAiTGFiIjoKKyAgICAgICAgICAgIHBhcmFtcyA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CisgICAgICAgICAgICB3aGl0ZVBvaW50ID0gcGFyYW1zLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7CisgICAgICAgICAgICBibGFja1BvaW50ID0gcGFyYW1zLmdldEFycmF5KCJCbGFja1BvaW50Iik7CisgICAgICAgICAgICB2YXIgcmFuZ2UgPSBwYXJhbXMuZ2V0QXJyYXkoIlJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gbmV3IExhYkNTKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIHJhbmdlKTsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVuaW1wbGVtZW50ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICIuY29uY2F0KG1vZGUpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogIi5jb25jYXQoY3MpKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc0RlZmF1bHREZWNvZGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBpc0RlZmF1bHREZWNvZGUoZGVjb2RlLCBudW1Db21wcykgeworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChudW1Db21wcyAqIDIgIT09IGRlY29kZS5sZW5ndGgpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUaGUgZGVjb2RlIG1hcCBpcyBub3QgdGhlIGNvcnJlY3QgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkZWNvZGUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgeworICAgICAgICBpZiAoZGVjb2RlW2ldICE9PSAwIHx8IGRlY29kZVtpICsgMV0gIT09IDEpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2luZ2xldG9ucyIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInNpbmdsZXRvbnMiLCB7CisgICAgICAgIGdldCBncmF5KCkgeworICAgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZ3JheSIsIG5ldyBEZXZpY2VHcmF5Q1MoKSk7CisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0IHJnYigpIHsKKyAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInJnYiIsIG5ldyBEZXZpY2VSZ2JDUygpKTsKKyAgICAgICAgfSwKKworICAgICAgICBnZXQgY215aygpIHsKKyAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImNteWsiLCBuZXcgRGV2aWNlQ215a0NTKCkpOworICAgICAgICB9CisKKyAgICAgIH0pOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBDb2xvclNwYWNlOworfSgpOworCitleHBvcnRzLkNvbG9yU3BhY2UgPSBDb2xvclNwYWNlOworCit2YXIgQWx0ZXJuYXRlQ1MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db2xvclNwYWNlKSB7CisgIF9pbmhlcml0cyhBbHRlcm5hdGVDUywgX0NvbG9yU3BhY2UpOworCisgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQWx0ZXJuYXRlQ1MpOworCisgIGZ1bmN0aW9uIEFsdGVybmF0ZUNTKG51bUNvbXBzLCBiYXNlLCB0aW50Rm4pIHsKKyAgICB2YXIgX3RoaXM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWx0ZXJuYXRlQ1MpOworCisgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCAiQWx0ZXJuYXRlIiwgbnVtQ29tcHMpOworICAgIF90aGlzLmJhc2UgPSBiYXNlOworICAgIF90aGlzLnRpbnRGbiA9IHRpbnRGbjsKKyAgICBfdGhpcy50bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KGJhc2UubnVtQ29tcHMpOworICAgIHJldHVybiBfdGhpczsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhBbHRlcm5hdGVDUywgW3sKKyAgICBrZXk6ICJnZXRSZ2JJdGVtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgdmFyIHRtcEJ1ZiA9IHRoaXMudG1wQnVmOworICAgICAgdGhpcy50aW50Rm4oc3JjLCBzcmNPZmZzZXQsIHRtcEJ1ZiwgMCk7CisgICAgICB0aGlzLmJhc2UuZ2V0UmdiSXRlbSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFJnYkJ1ZmZlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICAgIHZhciB0aW50Rm4gPSB0aGlzLnRpbnRGbjsKKyAgICAgIHZhciBiYXNlID0gdGhpcy5iYXNlOworICAgICAgdmFyIHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOworICAgICAgdmFyIGJhc2VOdW1Db21wcyA9IGJhc2UubnVtQ29tcHM7CisgICAgICB2YXIgdXNlc1plcm9Ub09uZVJhbmdlID0gYmFzZS51c2VzWmVyb1RvT25lUmFuZ2U7CisgICAgICB2YXIgaXNQYXNzdGhyb3VnaCA9IChiYXNlLmlzUGFzc3Rocm91Z2goOCkgfHwgIXVzZXNaZXJvVG9PbmVSYW5nZSkgJiYgYWxwaGEwMSA9PT0gMDsKKyAgICAgIHZhciBwb3MgPSBpc1Bhc3N0aHJvdWdoID8gZGVzdE9mZnNldCA6IDA7CisgICAgICB2YXIgYmFzZUJ1ZiA9IGlzUGFzc3Rocm91Z2ggPyBkZXN0IDogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJhc2VOdW1Db21wcyAqIGNvdW50KTsKKyAgICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CisgICAgICB2YXIgc2NhbGVkID0gbmV3IEZsb2F0MzJBcnJheShudW1Db21wcyk7CisgICAgICB2YXIgdGludGVkID0gbmV3IEZsb2F0MzJBcnJheShiYXNlTnVtQ29tcHMpOworICAgICAgdmFyIGksIGo7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1Db21wczsgaisrKSB7CisgICAgICAgICAgc2NhbGVkW2pdID0gc3JjW3NyY09mZnNldCsrXSAqIHNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgdGludEZuKHNjYWxlZCwgMCwgdGludGVkLCAwKTsKKworICAgICAgICBpZiAodXNlc1plcm9Ub09uZVJhbmdlKSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJhc2VOdW1Db21wczsgaisrKSB7CisgICAgICAgICAgICBiYXNlQnVmW3BvcysrXSA9IHRpbnRlZFtqXSAqIDI1NTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYmFzZS5nZXRSZ2JJdGVtKHRpbnRlZCwgMCwgYmFzZUJ1ZiwgcG9zKTsKKyAgICAgICAgICBwb3MgKz0gYmFzZU51bUNvbXBzOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghaXNQYXNzdGhyb3VnaCkgeworICAgICAgICBiYXNlLmdldFJnYkJ1ZmZlcihiYXNlQnVmLCAwLCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0T3V0cHV0TGVuZ3RoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCAqIHRoaXMuYmFzZS5udW1Db21wcyAvIHRoaXMubnVtQ29tcHMsIGFscGhhMDEpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBBbHRlcm5hdGVDUzsKK30oQ29sb3JTcGFjZSk7CisKK3ZhciBQYXR0ZXJuQ1MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db2xvclNwYWNlMikgeworICBfaW5oZXJpdHMoUGF0dGVybkNTLCBfQ29sb3JTcGFjZTIpOworCisgIHZhciBfc3VwZXIyID0gX2NyZWF0ZVN1cGVyKFBhdHRlcm5DUyk7CisKKyAgZnVuY3Rpb24gUGF0dGVybkNTKGJhc2VDUykgeworICAgIHZhciBfdGhpczI7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGF0dGVybkNTKTsKKworICAgIF90aGlzMiA9IF9zdXBlcjIuY2FsbCh0aGlzLCAiUGF0dGVybiIsIG51bGwpOworICAgIF90aGlzMi5iYXNlID0gYmFzZUNTOworICAgIHJldHVybiBfdGhpczI7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUGF0dGVybkNTLCBbeworICAgIGtleTogImlzRGVmYXVsdERlY29kZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm5DUy5pc0RlZmF1bHREZWNvZGUiKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUGF0dGVybkNTOworfShDb2xvclNwYWNlKTsKKwordmFyIEluZGV4ZWRDUyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbG9yU3BhY2UzKSB7CisgIF9pbmhlcml0cyhJbmRleGVkQ1MsIF9Db2xvclNwYWNlMyk7CisKKyAgdmFyIF9zdXBlcjMgPSBfY3JlYXRlU3VwZXIoSW5kZXhlZENTKTsKKworICBmdW5jdGlvbiBJbmRleGVkQ1MoYmFzZSwgaGlnaFZhbCwgbG9va3VwKSB7CisgICAgdmFyIF90aGlzMzsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbmRleGVkQ1MpOworCisgICAgX3RoaXMzID0gX3N1cGVyMy5jYWxsKHRoaXMsICJJbmRleGVkIiwgMSk7CisgICAgX3RoaXMzLmJhc2UgPSBiYXNlOworICAgIF90aGlzMy5oaWdoVmFsID0gaGlnaFZhbDsKKyAgICB2YXIgbGVuZ3RoID0gYmFzZS5udW1Db21wcyAqIGhpZ2hWYWw7CisgICAgX3RoaXMzLmxvb2t1cCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShsb29rdXApKSB7CisgICAgICB2YXIgYnl0ZXMgPSBsb29rdXAuZ2V0Qnl0ZXMobGVuZ3RoKTsKKworICAgICAgX3RoaXMzLmxvb2t1cC5zZXQoYnl0ZXMpOworICAgIH0gZWxzZSBpZiAodHlwZW9mIGxvb2t1cCA9PT0gInN0cmluZyIpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgX3RoaXMzLmxvb2t1cFtpXSA9IGxvb2t1cC5jaGFyQ29kZUF0KGkpICYgMHhmZjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbmRleGVkQ1MgLSB1bnJlY29nbml6ZWQgbG9va3VwIHRhYmxlOiAiLmNvbmNhdChsb29rdXApKTsKKyAgICB9CisKKyAgICByZXR1cm4gX3RoaXMzOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEluZGV4ZWRDUywgW3sKKyAgICBrZXk6ICJnZXRSZ2JJdGVtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgdmFyIG51bUNvbXBzID0gdGhpcy5iYXNlLm51bUNvbXBzOworICAgICAgdmFyIHN0YXJ0ID0gc3JjW3NyY09mZnNldF0gKiBudW1Db21wczsKKyAgICAgIHRoaXMuYmFzZS5nZXRSZ2JCdWZmZXIodGhpcy5sb29rdXAsIHN0YXJ0LCAxLCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCAwKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRSZ2JCdWZmZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CisgICAgICB2YXIgYmFzZSA9IHRoaXMuYmFzZTsKKyAgICAgIHZhciBudW1Db21wcyA9IGJhc2UubnVtQ29tcHM7CisgICAgICB2YXIgb3V0cHV0RGVsdGEgPSBiYXNlLmdldE91dHB1dExlbmd0aChudW1Db21wcywgYWxwaGEwMSk7CisgICAgICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICB2YXIgbG9va3VwUG9zID0gc3JjW3NyY09mZnNldCsrXSAqIG51bUNvbXBzOworICAgICAgICBiYXNlLmdldFJnYkJ1ZmZlcihsb29rdXAsIGxvb2t1cFBvcywgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7CisgICAgICAgIGRlc3RPZmZzZXQgKz0gb3V0cHV0RGVsdGE7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0T3V0cHV0TGVuZ3RoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCAqIHRoaXMuYmFzZS5udW1Db21wcywgYWxwaGEwMSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNEZWZhdWx0RGVjb2RlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CisgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjb2RlTWFwKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlY29kZU1hcC5sZW5ndGggIT09IDIpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJEZWNvZGUgbWFwIGxlbmd0aCBpcyBub3QgY29ycmVjdCIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGJwYykgfHwgYnBjIDwgMSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIkJpdHMgcGVyIGNvbXBvbmVudCBpcyBub3QgY29ycmVjdCIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRlY29kZU1hcFswXSA9PT0gMCAmJiBkZWNvZGVNYXBbMV0gPT09ICgxIDw8IGJwYykgLSAxOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBJbmRleGVkQ1M7Cit9KENvbG9yU3BhY2UpOworCit2YXIgRGV2aWNlR3JheUNTID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29sb3JTcGFjZTQpIHsKKyAgX2luaGVyaXRzKERldmljZUdyYXlDUywgX0NvbG9yU3BhY2U0KTsKKworICB2YXIgX3N1cGVyNCA9IF9jcmVhdGVTdXBlcihEZXZpY2VHcmF5Q1MpOworCisgIGZ1bmN0aW9uIERldmljZUdyYXlDUygpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGV2aWNlR3JheUNTKTsKKworICAgIHJldHVybiBfc3VwZXI0LmNhbGwodGhpcywgIkRldmljZUdyYXkiLCAxKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhEZXZpY2VHcmF5Q1MsIFt7CisgICAga2V5OiAiZ2V0UmdiSXRlbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgIHZhciBjID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CisgICAgICBkZXN0W2Rlc3RPZmZzZXRdID0gZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGM7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UmdiQnVmZmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgICAgdmFyIHNjYWxlID0gMjU1IC8gKCgxIDw8IGJpdHMpIC0gMSk7CisgICAgICB2YXIgaiA9IHNyY09mZnNldCwKKyAgICAgICAgICBxID0gZGVzdE9mZnNldDsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIHZhciBjID0gc2NhbGUgKiBzcmNbaisrXTsKKyAgICAgICAgZGVzdFtxKytdID0gYzsKKyAgICAgICAgZGVzdFtxKytdID0gYzsKKyAgICAgICAgZGVzdFtxKytdID0gYzsKKyAgICAgICAgcSArPSBhbHBoYTAxOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImdldE91dHB1dExlbmd0aCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgeworICAgICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gRGV2aWNlR3JheUNTOworfShDb2xvclNwYWNlKTsKKwordmFyIERldmljZVJnYkNTID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29sb3JTcGFjZTUpIHsKKyAgX2luaGVyaXRzKERldmljZVJnYkNTLCBfQ29sb3JTcGFjZTUpOworCisgIHZhciBfc3VwZXI1ID0gX2NyZWF0ZVN1cGVyKERldmljZVJnYkNTKTsKKworICBmdW5jdGlvbiBEZXZpY2VSZ2JDUygpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGV2aWNlUmdiQ1MpOworCisgICAgcmV0dXJuIF9zdXBlcjUuY2FsbCh0aGlzLCAiRGV2aWNlUkdCIiwgMyk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoRGV2aWNlUmdiQ1MsIFt7CisgICAga2V5OiAiZ2V0UmdiSXRlbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgIGRlc3RbZGVzdE9mZnNldF0gPSBzcmNbc3JjT2Zmc2V0XSAqIDI1NTsKKyAgICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gc3JjW3NyY09mZnNldCArIDFdICogMjU1OworICAgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBzcmNbc3JjT2Zmc2V0ICsgMl0gKiAyNTU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UmdiQnVmZmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgICAgaWYgKGJpdHMgPT09IDggJiYgYWxwaGEwMSA9PT0gMCkgeworICAgICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjT2Zmc2V0LCBzcmNPZmZzZXQgKyBjb3VudCAqIDMpLCBkZXN0T2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYml0cykgLSAxKTsKKyAgICAgIHZhciBqID0gc3JjT2Zmc2V0LAorICAgICAgICAgIHEgPSBkZXN0T2Zmc2V0OworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgZGVzdFtxKytdID0gc2NhbGUgKiBzcmNbaisrXTsKKyAgICAgICAgZGVzdFtxKytdID0gc2NhbGUgKiBzcmNbaisrXTsKKyAgICAgICAgZGVzdFtxKytdID0gc2NhbGUgKiBzcmNbaisrXTsKKyAgICAgICAgcSArPSBhbHBoYTAxOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImdldE91dHB1dExlbmd0aCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgeworICAgICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSAvIDMgfCAwOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzUGFzc3Rocm91Z2giLAorICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Bhc3N0aHJvdWdoKGJpdHMpIHsKKyAgICAgIHJldHVybiBiaXRzID09PSA4OworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBEZXZpY2VSZ2JDUzsKK30oQ29sb3JTcGFjZSk7CisKK3ZhciBEZXZpY2VDbXlrQ1MgPSBmdW5jdGlvbiBEZXZpY2VDbXlrQ1NDbG9zdXJlKCkgeworICBmdW5jdGlvbiBjb252ZXJ0VG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIHNyY1NjYWxlLCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgdmFyIGMgPSBzcmNbc3JjT2Zmc2V0XSAqIHNyY1NjYWxlOworICAgIHZhciBtID0gc3JjW3NyY09mZnNldCArIDFdICogc3JjU2NhbGU7CisgICAgdmFyIHkgPSBzcmNbc3JjT2Zmc2V0ICsgMl0gKiBzcmNTY2FsZTsKKyAgICB2YXIgayA9IHNyY1tzcmNPZmZzZXQgKyAzXSAqIHNyY1NjYWxlOworICAgIGRlc3RbZGVzdE9mZnNldF0gPSAyNTUgKyBjICogKC00LjM4NzMzMjM4NDYwOTk4OCAqIGMgKyA1NC40ODYxNTE5NDE4OTE3NiAqIG0gKyAxOC44MjI5MDUwMjE2NTMwMiAqIHkgKyAyMTIuMjU2NjI0NTE2Mzk1ODUgKiBrICsgLTI4NS4yMzMxMDI2MTM3MDA0KSArIG0gKiAoMS43MTQ5NzYzNDc3MzYyMTM0ICogbSAtIDUuNjA5NjczNjkwNDA0NzMxNSAqIHkgKyAtMTcuODczODcwODYxNDE1NDQ0ICogayAtIDUuNDk3MDA2NDI3MTk2MzY2KSArIHkgKiAoLTIuNTIxNzM0MDEzMTY4MzAzMyAqIHkgLSAyMS4yNDg5MjMzMzczNTMwNzMgKiBrICsgMTcuNTExOTI3MDg0MTgxMykgKyBrICogKC0yMS44NjEyMjE0NzQ2MzYwNSAqIGsgLSAxODkuNDgxODA4MzU5MjI3NDcpOworICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gMjU1ICsgYyAqICg4Ljg0MTA0MTQyMjAzNjE0OSAqIGMgKyA2MC4xMTgwMjcwNDU1OTczNjYgKiBtICsgNi44NzE0MjU1OTIwNDkwMDcgKiB5ICsgMzEuMTU5MTAwMTMwMDU1OTIyICogayArIC03OS4yOTcwODQ0ODE2NTQ4KSArIG0gKiAoLTE1LjMxMDM2MTMwNjk2NzgxNyAqIG0gKyAxNy41NzUyNTEyNjExMDk0ODIgKiB5ICsgMTMxLjM1MjUwOTEyNDkzOTc2ICogayAtIDE5MC45NDUzMzAyNTg4OTUxKSArIHkgKiAoNC40NDQzMzkxMDI4NTI3MzkgKiB5ICsgOS44NjMyODYxNDkzNDA1ICogayAtIDI0Ljg2NzQxNTgyNTU1ODc4KSArIGsgKiAoLTIwLjczNzMyNTQ3MTE4MTAzNCAqIGsgLSAxODcuODA0NTM3MDk3MTk1NzgpOworICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gMjU1ICsgYyAqICgwLjg4NDI1MjI0MzAwMDMyOTYgKiBjICsgOC4wNzg2Nzc1MDMxMTI5MjggKiBtICsgMzAuODk5NzgzMDk3MDM3MjkgKiB5IC0gMC4yMzg4MzIzODY4OTE3ODkzNCAqIGsgKyAtMTQuMTgzNTc2Nzk5NjczMjg2KSArIG0gKiAoMTAuNDk1OTMyNzM0MzIwNzIgKiBtICsgNjMuMDIzNzg0OTQ3NTQwNTIgKiB5ICsgNTAuNjA2OTU3NjU2MzYwNzM0ICogayAtIDExMi4yMzg4NDI1MzcxOTI0OCkgKyB5ICogKDAuMDMyOTYwNDExMTQ4NzMyMTcgKiB5ICsgMTE1LjYwMzg0NDQ5NjQ2NjQxICogayArIC0xOTMuNTgyMDkzNTY4NjE1MDUpICsgayAqICgtMjIuMzM4MTY4MDczMDk4ODYgKiBrIC0gMTgwLjEyNjEzOTc0NzA4MzY3KTsKKyAgfQorCisgIHZhciBEZXZpY2VDbXlrQ1MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db2xvclNwYWNlNikgeworICAgIF9pbmhlcml0cyhEZXZpY2VDbXlrQ1MsIF9Db2xvclNwYWNlNik7CisKKyAgICB2YXIgX3N1cGVyNiA9IF9jcmVhdGVTdXBlcihEZXZpY2VDbXlrQ1MpOworCisgICAgZnVuY3Rpb24gRGV2aWNlQ215a0NTKCkgeworICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERldmljZUNteWtDUyk7CisKKyAgICAgIHJldHVybiBfc3VwZXI2LmNhbGwodGhpcywgIkRldmljZUNNWUsiLCA0KTsKKyAgICB9CisKKyAgICBfY3JlYXRlQ2xhc3MoRGV2aWNlQ215a0NTLCBbeworICAgICAga2V5OiAiZ2V0UmdiSXRlbSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgICBjb252ZXJ0VG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIDEsIGRlc3QsIGRlc3RPZmZzZXQpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImdldFJnYkJ1ZmZlciIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgICAgICB2YXIgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzY2FsZSwgZGVzdCwgZGVzdE9mZnNldCk7CisgICAgICAgICAgc3JjT2Zmc2V0ICs9IDQ7CisgICAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImdldE91dHB1dExlbmd0aCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICAgIHJldHVybiBpbnB1dExlbmd0aCAvIDQgKiAoMyArIGFscGhhMDEpIHwgMDsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gRGV2aWNlQ215a0NTOworICB9KENvbG9yU3BhY2UpOworCisgIHJldHVybiBEZXZpY2VDbXlrQ1M7Cit9KCk7CisKK3ZhciBDYWxHcmF5Q1MgPSBmdW5jdGlvbiBDYWxHcmF5Q1NDbG9zdXJlKCkgeworICBmdW5jdGlvbiBjb252ZXJ0VG9SZ2IoY3MsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSkgeworICAgIHZhciBBID0gc3JjW3NyY09mZnNldF0gKiBzY2FsZTsKKyAgICB2YXIgQUcgPSBNYXRoLnBvdyhBLCBjcy5HKTsKKyAgICB2YXIgTCA9IGNzLllXICogQUc7CisgICAgdmFyIHZhbCA9IE1hdGgubWF4KDI5NS44ICogTWF0aC5wb3coTCwgMC4zMzMzMzMzMzMzMzMzMzMzMzMpIC0gNDAuOCwgMCk7CisgICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHZhbDsKKyAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHZhbDsKKyAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IHZhbDsKKyAgfQorCisgIHZhciBDYWxHcmF5Q1MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db2xvclNwYWNlNykgeworICAgIF9pbmhlcml0cyhDYWxHcmF5Q1MsIF9Db2xvclNwYWNlNyk7CisKKyAgICB2YXIgX3N1cGVyNyA9IF9jcmVhdGVTdXBlcihDYWxHcmF5Q1MpOworCisgICAgZnVuY3Rpb24gQ2FsR3JheUNTKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hKSB7CisgICAgICB2YXIgX3RoaXM0OworCisgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FsR3JheUNTKTsKKworICAgICAgX3RoaXM0ID0gX3N1cGVyNy5jYWxsKHRoaXMsICJDYWxHcmF5IiwgMSk7CisKKyAgICAgIGlmICghd2hpdGVQb2ludCkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxHcmF5Iik7CisgICAgICB9CisKKyAgICAgIGJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IFswLCAwLCAwXTsKKyAgICAgIGdhbW1hID0gZ2FtbWEgfHwgMTsKKyAgICAgIF90aGlzNC5YVyA9IHdoaXRlUG9pbnRbMF07CisgICAgICBfdGhpczQuWVcgPSB3aGl0ZVBvaW50WzFdOworICAgICAgX3RoaXM0LlpXID0gd2hpdGVQb2ludFsyXTsKKyAgICAgIF90aGlzNC5YQiA9IGJsYWNrUG9pbnRbMF07CisgICAgICBfdGhpczQuWUIgPSBibGFja1BvaW50WzFdOworICAgICAgX3RoaXM0LlpCID0gYmxhY2tQb2ludFsyXTsKKyAgICAgIF90aGlzNC5HID0gZ2FtbWE7CisKKyAgICAgIGlmIChfdGhpczQuWFcgPCAwIHx8IF90aGlzNC5aVyA8IDAgfHwgX3RoaXM0LllXICE9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMgZm9yICIuY29uY2F0KF90aGlzNC5uYW1lKSArICIsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpOworICAgICAgfQorCisgICAgICBpZiAoX3RoaXM0LlhCIDwgMCB8fCBfdGhpczQuWUIgPCAwIHx8IF90aGlzNC5aQiA8IDApIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICIuY29uY2F0KF90aGlzNC5uYW1lLCAiLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC4iKSk7CisgICAgICAgIF90aGlzNC5YQiA9IF90aGlzNC5ZQiA9IF90aGlzNC5aQiA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChfdGhpczQuWEIgIT09IDAgfHwgX3RoaXM0LllCICE9PSAwIHx8IF90aGlzNC5aQiAhPT0gMCkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIiIuY29uY2F0KF90aGlzNC5uYW1lLCAiLCBCbGFja1BvaW50OiBYQjogIikuY29uY2F0KF90aGlzNC5YQiwgIiwgWUI6ICIpLmNvbmNhdChfdGhpczQuWUIsICIsICIpICsgIlpCOiAiLmNvbmNhdChfdGhpczQuWkIsICIsIG9ubHkgZGVmYXVsdCB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4iKSk7CisgICAgICB9CisKKyAgICAgIGlmIChfdGhpczQuRyA8IDEpIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJJbnZhbGlkIEdhbW1hOiAiLmNvbmNhdChfdGhpczQuRywgIiBmb3IgIikuY29uY2F0KF90aGlzNC5uYW1lLCAiLCAiKSArICJmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC4iKTsKKyAgICAgICAgX3RoaXM0LkcgPSAxOworICAgICAgfQorCisgICAgICByZXR1cm4gX3RoaXM0OworICAgIH0KKworICAgIF9jcmVhdGVDbGFzcyhDYWxHcmF5Q1MsIFt7CisgICAgICBrZXk6ICJnZXRSZ2JJdGVtIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiZ2V0UmdiQnVmZmVyIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CisgICAgICAgIHZhciBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKTsKKyAgICAgICAgICBzcmNPZmZzZXQgKz0gMTsKKyAgICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOworICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiZ2V0T3V0cHV0TGVuZ3RoIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gQ2FsR3JheUNTOworICB9KENvbG9yU3BhY2UpOworCisgIHJldHVybiBDYWxHcmF5Q1M7Cit9KCk7CisKK3ZhciBDYWxSR0JDUyA9IGZ1bmN0aW9uIENhbFJHQkNTQ2xvc3VyZSgpIHsKKyAgdmFyIEJSQURGT1JEX1NDQUxFX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzAuODk1MSwgMC4yNjY0LCAtMC4xNjE0LCAtMC43NTAyLCAxLjcxMzUsIDAuMDM2NywgMC4wMzg5LCAtMC4wNjg1LCAxLjAyOTZdKTsKKyAgdmFyIEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMC45ODY5OTI5LCAtMC4xNDcwNTQzLCAwLjE1OTk2MjcsIDAuNDMyMzA1MywgMC41MTgzNjAzLCAwLjA0OTI5MTIsIC0wLjAwODUyODcsIDAuMDQwMDQyOCwgMC45Njg0ODY3XSk7CisgIHZhciBTUkdCX0Q2NV9YWVpfVE9fUkdCX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzMuMjQwNDU0MiwgLTEuNTM3MTM4NSwgLTAuNDk4NTMxNCwgLTAuOTY5MjY2MCwgMS44NzYwMTA4LCAwLjA0MTU1NjAsIDAuMDU1NjQzNCwgLTAuMjA0MDI1OSwgMS4wNTcyMjUyXSk7CisgIHZhciBGTEFUX1dISVRFUE9JTlRfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMSwgMSwgMV0pOworICB2YXIgdGVtcE5vcm1hbGl6ZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CisgIHZhciB0ZW1wQ29udmVydE1hdHJpeDEgPSBuZXcgRmxvYXQzMkFycmF5KDMpOworICB2YXIgdGVtcENvbnZlcnRNYXRyaXgyID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKKyAgdmFyIERFQ09ERV9MX0NPTlNUQU5UID0gTWF0aC5wb3coKDggKyAxNikgLyAxMTYsIDMpIC8gOC4wOworCisgIGZ1bmN0aW9uIG1hdHJpeFByb2R1Y3QoYSwgYiwgcmVzdWx0KSB7CisgICAgcmVzdWx0WzBdID0gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdOworICAgIHJlc3VsdFsxXSA9IGFbM10gKiBiWzBdICsgYVs0XSAqIGJbMV0gKyBhWzVdICogYlsyXTsKKyAgICByZXN1bHRbMl0gPSBhWzZdICogYlswXSArIGFbN10gKiBiWzFdICsgYVs4XSAqIGJbMl07CisgIH0KKworICBmdW5jdGlvbiBjb252ZXJ0VG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgcmVzdWx0KSB7CisgICAgcmVzdWx0WzBdID0gTE1TWzBdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMF07CisgICAgcmVzdWx0WzFdID0gTE1TWzFdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMV07CisgICAgcmVzdWx0WzJdID0gTE1TWzJdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMl07CisgIH0KKworICBmdW5jdGlvbiBjb252ZXJ0VG9ENjUoc291cmNlV2hpdGVQb2ludCwgTE1TLCByZXN1bHQpIHsKKyAgICB2YXIgRDY1WCA9IDAuOTUwNDc7CisgICAgdmFyIEQ2NVkgPSAxOworICAgIHZhciBENjVaID0gMS4wODg4MzsKKyAgICByZXN1bHRbMF0gPSBMTVNbMF0gKiBENjVYIC8gc291cmNlV2hpdGVQb2ludFswXTsKKyAgICByZXN1bHRbMV0gPSBMTVNbMV0gKiBENjVZIC8gc291cmNlV2hpdGVQb2ludFsxXTsKKyAgICByZXN1bHRbMl0gPSBMTVNbMl0gKiBENjVaIC8gc291cmNlV2hpdGVQb2ludFsyXTsKKyAgfQorCisgIGZ1bmN0aW9uIHNSR0JUcmFuc2ZlckZ1bmN0aW9uKGNvbG9yKSB7CisgICAgaWYgKGNvbG9yIDw9IDAuMDAzMTMwOCkgeworICAgICAgcmV0dXJuIGFkanVzdFRvUmFuZ2UoMCwgMSwgMTIuOTIgKiBjb2xvcik7CisgICAgfQorCisgICAgaWYgKGNvbG9yID49IDAuOTk1NTQ1MjUpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiBhZGp1c3RUb1JhbmdlKDAsIDEsICgxICsgMC4wNTUpICogTWF0aC5wb3coY29sb3IsIDEgLyAyLjQpIC0gMC4wNTUpOworICB9CisKKyAgZnVuY3Rpb24gYWRqdXN0VG9SYW5nZShtaW4sIG1heCwgdmFsdWUpIHsKKyAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVMKEwpIHsKKyAgICBpZiAoTCA8IDApIHsKKyAgICAgIHJldHVybiAtZGVjb2RlTCgtTCk7CisgICAgfQorCisgICAgaWYgKEwgPiA4LjApIHsKKyAgICAgIHJldHVybiBNYXRoLnBvdygoTCArIDE2KSAvIDExNiwgMyk7CisgICAgfQorCisgICAgcmV0dXJuIEwgKiBERUNPREVfTF9DT05TVEFOVDsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbXBlbnNhdGVCbGFja1BvaW50KHNvdXJjZUJsYWNrUG9pbnQsIFhZWl9GbGF0LCByZXN1bHQpIHsKKyAgICBpZiAoc291cmNlQmxhY2tQb2ludFswXSA9PT0gMCAmJiBzb3VyY2VCbGFja1BvaW50WzFdID09PSAwICYmIHNvdXJjZUJsYWNrUG9pbnRbMl0gPT09IDApIHsKKyAgICAgIHJlc3VsdFswXSA9IFhZWl9GbGF0WzBdOworICAgICAgcmVzdWx0WzFdID0gWFlaX0ZsYXRbMV07CisgICAgICByZXN1bHRbMl0gPSBYWVpfRmxhdFsyXTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgemVyb0RlY29kZUwgPSBkZWNvZGVMKDApOworICAgIHZhciBYX0RTVCA9IHplcm9EZWNvZGVMOworICAgIHZhciBYX1NSQyA9IGRlY29kZUwoc291cmNlQmxhY2tQb2ludFswXSk7CisgICAgdmFyIFlfRFNUID0gemVyb0RlY29kZUw7CisgICAgdmFyIFlfU1JDID0gZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzFdKTsKKyAgICB2YXIgWl9EU1QgPSB6ZXJvRGVjb2RlTDsKKyAgICB2YXIgWl9TUkMgPSBkZWNvZGVMKHNvdXJjZUJsYWNrUG9pbnRbMl0pOworICAgIHZhciBYX1NjYWxlID0gKDEgLSBYX0RTVCkgLyAoMSAtIFhfU1JDKTsKKyAgICB2YXIgWF9PZmZzZXQgPSAxIC0gWF9TY2FsZTsKKyAgICB2YXIgWV9TY2FsZSA9ICgxIC0gWV9EU1QpIC8gKDEgLSBZX1NSQyk7CisgICAgdmFyIFlfT2Zmc2V0ID0gMSAtIFlfU2NhbGU7CisgICAgdmFyIFpfU2NhbGUgPSAoMSAtIFpfRFNUKSAvICgxIC0gWl9TUkMpOworICAgIHZhciBaX09mZnNldCA9IDEgLSBaX1NjYWxlOworICAgIHJlc3VsdFswXSA9IFhZWl9GbGF0WzBdICogWF9TY2FsZSArIFhfT2Zmc2V0OworICAgIHJlc3VsdFsxXSA9IFhZWl9GbGF0WzFdICogWV9TY2FsZSArIFlfT2Zmc2V0OworICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdICogWl9TY2FsZSArIFpfT2Zmc2V0OworICB9CisKKyAgZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkgeworICAgIGlmIChzb3VyY2VXaGl0ZVBvaW50WzBdID09PSAxICYmIHNvdXJjZVdoaXRlUG9pbnRbMl0gPT09IDEpIHsKKyAgICAgIHJlc3VsdFswXSA9IFhZWl9JblswXTsKKyAgICAgIHJlc3VsdFsxXSA9IFhZWl9JblsxXTsKKyAgICAgIHJlc3VsdFsyXSA9IFhZWl9JblsyXTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgTE1TID0gcmVzdWx0OworICAgIG1hdHJpeFByb2R1Y3QoQlJBREZPUkRfU0NBTEVfTUFUUklYLCBYWVpfSW4sIExNUyk7CisgICAgdmFyIExNU19GbGF0ID0gdGVtcE5vcm1hbGl6ZU1hdHJpeDsKKyAgICBjb252ZXJ0VG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgTE1TX0ZsYXQpOworICAgIG1hdHJpeFByb2R1Y3QoQlJBREZPUkRfU0NBTEVfSU5WRVJTRV9NQVRSSVgsIExNU19GbGF0LCByZXN1bHQpOworICB9CisKKyAgZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIFhZWl9JbiwgcmVzdWx0KSB7CisgICAgdmFyIExNUyA9IHJlc3VsdDsKKyAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpOworICAgIHZhciBMTVNfRDY1ID0gdGVtcE5vcm1hbGl6ZU1hdHJpeDsKKyAgICBjb252ZXJ0VG9ENjUoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRDY1KTsKKyAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRDY1LCByZXN1bHQpOworICB9CisKKyAgZnVuY3Rpb24gY29udmVydFRvUmdiKGNzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpIHsKKyAgICB2YXIgQSA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldF0gKiBzY2FsZSk7CisgICAgdmFyIEIgPSBhZGp1c3RUb1JhbmdlKDAsIDEsIHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNjYWxlKTsKKyAgICB2YXIgQyA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldCArIDJdICogc2NhbGUpOworICAgIHZhciBBR1IgPSBBID09PSAxID8gMSA6IE1hdGgucG93KEEsIGNzLkdSKTsKKyAgICB2YXIgQkdHID0gQiA9PT0gMSA/IDEgOiBNYXRoLnBvdyhCLCBjcy5HRyk7CisgICAgdmFyIENHQiA9IEMgPT09IDEgPyAxIDogTWF0aC5wb3coQywgY3MuR0IpOworICAgIHZhciBYID0gY3MuTVhBICogQUdSICsgY3MuTVhCICogQkdHICsgY3MuTVhDICogQ0dCOworICAgIHZhciBZID0gY3MuTVlBICogQUdSICsgY3MuTVlCICogQkdHICsgY3MuTVlDICogQ0dCOworICAgIHZhciBaID0gY3MuTVpBICogQUdSICsgY3MuTVpCICogQkdHICsgY3MuTVpDICogQ0dCOworICAgIHZhciBYWVogPSB0ZW1wQ29udmVydE1hdHJpeDE7CisgICAgWFlaWzBdID0gWDsKKyAgICBYWVpbMV0gPSBZOworICAgIFhZWlsyXSA9IFo7CisgICAgdmFyIFhZWl9GbGF0ID0gdGVtcENvbnZlcnRNYXRyaXgyOworICAgIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQoY3Mud2hpdGVQb2ludCwgWFlaLCBYWVpfRmxhdCk7CisgICAgdmFyIFhZWl9CbGFjayA9IHRlbXBDb252ZXJ0TWF0cml4MTsKKyAgICBjb21wZW5zYXRlQmxhY2tQb2ludChjcy5ibGFja1BvaW50LCBYWVpfRmxhdCwgWFlaX0JsYWNrKTsKKyAgICB2YXIgWFlaX0Q2NSA9IHRlbXBDb252ZXJ0TWF0cml4MjsKKyAgICBub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUoRkxBVF9XSElURVBPSU5UX01BVFJJWCwgWFlaX0JsYWNrLCBYWVpfRDY1KTsKKyAgICB2YXIgU1JHQiA9IHRlbXBDb252ZXJ0TWF0cml4MTsKKyAgICBtYXRyaXhQcm9kdWN0KFNSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYLCBYWVpfRDY1LCBTUkdCKTsKKyAgICBkZXN0W2Rlc3RPZmZzZXRdID0gc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlswXSkgKiAyNTU7CisgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzFdKSAqIDI1NTsKKyAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IHNSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMl0pICogMjU1OworICB9CisKKyAgdmFyIENhbFJHQkNTID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29sb3JTcGFjZTgpIHsKKyAgICBfaW5oZXJpdHMoQ2FsUkdCQ1MsIF9Db2xvclNwYWNlOCk7CisKKyAgICB2YXIgX3N1cGVyOCA9IF9jcmVhdGVTdXBlcihDYWxSR0JDUyk7CisKKyAgICBmdW5jdGlvbiBDYWxSR0JDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KSB7CisgICAgICB2YXIgX3RoaXM1OworCisgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FsUkdCQ1MpOworCisgICAgICBfdGhpczUgPSBfc3VwZXI4LmNhbGwodGhpcywgIkNhbFJHQiIsIDMpOworCisgICAgICBpZiAoIXdoaXRlUG9pbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsUkdCIik7CisgICAgICB9CisKKyAgICAgIGJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IG5ldyBGbG9hdDMyQXJyYXkoMyk7CisgICAgICBnYW1tYSA9IGdhbW1hIHx8IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDFdKTsKKyAgICAgIG1hdHJpeCA9IG1hdHJpeCB8fCBuZXcgRmxvYXQzMkFycmF5KFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXSk7CisgICAgICB2YXIgWFcgPSB3aGl0ZVBvaW50WzBdOworICAgICAgdmFyIFlXID0gd2hpdGVQb2ludFsxXTsKKyAgICAgIHZhciBaVyA9IHdoaXRlUG9pbnRbMl07CisgICAgICBfdGhpczUud2hpdGVQb2ludCA9IHdoaXRlUG9pbnQ7CisgICAgICB2YXIgWEIgPSBibGFja1BvaW50WzBdOworICAgICAgdmFyIFlCID0gYmxhY2tQb2ludFsxXTsKKyAgICAgIHZhciBaQiA9IGJsYWNrUG9pbnRbMl07CisgICAgICBfdGhpczUuYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQ7CisgICAgICBfdGhpczUuR1IgPSBnYW1tYVswXTsKKyAgICAgIF90aGlzNS5HRyA9IGdhbW1hWzFdOworICAgICAgX3RoaXM1LkdCID0gZ2FtbWFbMl07CisgICAgICBfdGhpczUuTVhBID0gbWF0cml4WzBdOworICAgICAgX3RoaXM1Lk1ZQSA9IG1hdHJpeFsxXTsKKyAgICAgIF90aGlzNS5NWkEgPSBtYXRyaXhbMl07CisgICAgICBfdGhpczUuTVhCID0gbWF0cml4WzNdOworICAgICAgX3RoaXM1Lk1ZQiA9IG1hdHJpeFs0XTsKKyAgICAgIF90aGlzNS5NWkIgPSBtYXRyaXhbNV07CisgICAgICBfdGhpczUuTVhDID0gbWF0cml4WzZdOworICAgICAgX3RoaXM1Lk1ZQyA9IG1hdHJpeFs3XTsKKyAgICAgIF90aGlzNS5NWkMgPSBtYXRyaXhbOF07CisKKyAgICAgIGlmIChYVyA8IDAgfHwgWlcgPCAwIHx8IFlXICE9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMgZm9yICIuY29uY2F0KF90aGlzNS5uYW1lKSArICIsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpOworICAgICAgfQorCisgICAgICBpZiAoWEIgPCAwIHx8IFlCIDwgMCB8fCBaQiA8IDApIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICIuY29uY2F0KF90aGlzNS5uYW1lLCAiIFsiKS5jb25jYXQoWEIsICIsICIpLmNvbmNhdChZQiwgIiwgIikuY29uY2F0KFpCLCAiXSwgIikgKyAiZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIik7CisgICAgICAgIF90aGlzNS5ibGFja1BvaW50ID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKKyAgICAgIH0KKworICAgICAgaWYgKF90aGlzNS5HUiA8IDAgfHwgX3RoaXM1LkdHIDwgMCB8fCBfdGhpczUuR0IgPCAwKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW52YWxpZCBHYW1tYSBbIi5jb25jYXQoX3RoaXM1LkdSLCAiLCAiKS5jb25jYXQoX3RoaXM1LkdHLCAiLCAiKS5jb25jYXQoX3RoaXM1LkdCLCAiXSBmb3IgIikgKyAiIi5jb25jYXQoX3RoaXM1Lm5hbWUsICIsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpKTsKKyAgICAgICAgX3RoaXM1LkdSID0gX3RoaXM1LkdHID0gX3RoaXM1LkdCID0gMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIF90aGlzNTsKKyAgICB9CisKKyAgICBfY3JlYXRlQ2xhc3MoQ2FsUkdCQ1MsIFt7CisgICAgICBrZXk6ICJnZXRSZ2JJdGVtIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiZ2V0UmdiQnVmZmVyIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CisgICAgICAgIHZhciBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKTsKKyAgICAgICAgICBzcmNPZmZzZXQgKz0gMzsKKyAgICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOworICAgICAgICB9CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiZ2V0T3V0cHV0TGVuZ3RoIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSAvIDMgfCAwOworICAgICAgfQorICAgIH1dKTsKKworICAgIHJldHVybiBDYWxSR0JDUzsKKyAgfShDb2xvclNwYWNlKTsKKworICByZXR1cm4gQ2FsUkdCQ1M7Cit9KCk7CisKK3ZhciBMYWJDUyA9IGZ1bmN0aW9uIExhYkNTQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gZm5fZyh4KSB7CisgICAgdmFyIHJlc3VsdDsKKworICAgIGlmICh4ID49IDYgLyAyOSkgeworICAgICAgcmVzdWx0ID0geCAqIHggKiB4OworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSAxMDggLyA4NDEgKiAoeCAtIDQgLyAyOSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZSh2YWx1ZSwgaGlnaDEsIGxvdzIsIGhpZ2gyKSB7CisgICAgcmV0dXJuIGxvdzIgKyB2YWx1ZSAqIChoaWdoMiAtIGxvdzIpIC8gaGlnaDE7CisgIH0KKworICBmdW5jdGlvbiBjb252ZXJ0VG9SZ2IoY3MsIHNyYywgc3JjT2Zmc2V0LCBtYXhWYWwsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICB2YXIgTHMgPSBzcmNbc3JjT2Zmc2V0XTsKKyAgICB2YXIgYXMgPSBzcmNbc3JjT2Zmc2V0ICsgMV07CisgICAgdmFyIGJzID0gc3JjW3NyY09mZnNldCArIDJdOworCisgICAgaWYgKG1heFZhbCAhPT0gZmFsc2UpIHsKKyAgICAgIExzID0gZGVjb2RlKExzLCBtYXhWYWwsIDAsIDEwMCk7CisgICAgICBhcyA9IGRlY29kZShhcywgbWF4VmFsLCBjcy5hbWluLCBjcy5hbWF4KTsKKyAgICAgIGJzID0gZGVjb2RlKGJzLCBtYXhWYWwsIGNzLmJtaW4sIGNzLmJtYXgpOworICAgIH0KKworICAgIGlmIChhcyA+IGNzLmFtYXgpIHsKKyAgICAgIGFzID0gY3MuYW1heDsKKyAgICB9IGVsc2UgaWYgKGFzIDwgY3MuYW1pbikgeworICAgICAgYXMgPSBjcy5hbWluOworICAgIH0KKworICAgIGlmIChicyA+IGNzLmJtYXgpIHsKKyAgICAgIGJzID0gY3MuYm1heDsKKyAgICB9IGVsc2UgaWYgKGJzIDwgY3MuYm1pbikgeworICAgICAgYnMgPSBjcy5ibWluOworICAgIH0KKworICAgIHZhciBNID0gKExzICsgMTYpIC8gMTE2OworICAgIHZhciBMID0gTSArIGFzIC8gNTAwOworICAgIHZhciBOID0gTSAtIGJzIC8gMjAwOworICAgIHZhciBYID0gY3MuWFcgKiBmbl9nKEwpOworICAgIHZhciBZID0gY3MuWVcgKiBmbl9nKE0pOworICAgIHZhciBaID0gY3MuWlcgKiBmbl9nKE4pOworICAgIHZhciByLCBnLCBiOworCisgICAgaWYgKGNzLlpXIDwgMSkgeworICAgICAgciA9IFggKiAzLjEzMzkgKyBZICogLTEuNjE3ICsgWiAqIC0wLjQ5MDY7CisgICAgICBnID0gWCAqIC0wLjk3ODUgKyBZICogMS45MTYgKyBaICogMC4wMzMzOworICAgICAgYiA9IFggKiAwLjA3MiArIFkgKiAtMC4yMjkgKyBaICogMS40MDU3OworICAgIH0gZWxzZSB7CisgICAgICByID0gWCAqIDMuMjQwNiArIFkgKiAtMS41MzcyICsgWiAqIC0wLjQ5ODY7CisgICAgICBnID0gWCAqIC0wLjk2ODkgKyBZICogMS44NzU4ICsgWiAqIDAuMDQxNTsKKyAgICAgIGIgPSBYICogMC4wNTU3ICsgWSAqIC0wLjIwNCArIFogKiAxLjA1NzsKKyAgICB9CisKKyAgICBkZXN0W2Rlc3RPZmZzZXRdID0gTWF0aC5zcXJ0KHIpICogMjU1OworICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gTWF0aC5zcXJ0KGcpICogMjU1OworICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gTWF0aC5zcXJ0KGIpICogMjU1OworICB9CisKKyAgdmFyIExhYkNTID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29sb3JTcGFjZTkpIHsKKyAgICBfaW5oZXJpdHMoTGFiQ1MsIF9Db2xvclNwYWNlOSk7CisKKyAgICB2YXIgX3N1cGVyOSA9IF9jcmVhdGVTdXBlcihMYWJDUyk7CisKKyAgICBmdW5jdGlvbiBMYWJDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSkgeworICAgICAgdmFyIF90aGlzNjsKKworICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExhYkNTKTsKKworICAgICAgX3RoaXM2ID0gX3N1cGVyOS5jYWxsKHRoaXMsICJMYWIiLCAzKTsKKworICAgICAgaWYgKCF3aGl0ZVBvaW50KSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIExhYiIpOworICAgICAgfQorCisgICAgICBibGFja1BvaW50ID0gYmxhY2tQb2ludCB8fCBbMCwgMCwgMF07CisgICAgICByYW5nZSA9IHJhbmdlIHx8IFstMTAwLCAxMDAsIC0xMDAsIDEwMF07CisgICAgICBfdGhpczYuWFcgPSB3aGl0ZVBvaW50WzBdOworICAgICAgX3RoaXM2LllXID0gd2hpdGVQb2ludFsxXTsKKyAgICAgIF90aGlzNi5aVyA9IHdoaXRlUG9pbnRbMl07CisgICAgICBfdGhpczYuYW1pbiA9IHJhbmdlWzBdOworICAgICAgX3RoaXM2LmFtYXggPSByYW5nZVsxXTsKKyAgICAgIF90aGlzNi5ibWluID0gcmFuZ2VbMl07CisgICAgICBfdGhpczYuYm1heCA9IHJhbmdlWzNdOworICAgICAgX3RoaXM2LlhCID0gYmxhY2tQb2ludFswXTsKKyAgICAgIF90aGlzNi5ZQiA9IGJsYWNrUG9pbnRbMV07CisgICAgICBfdGhpczYuWkIgPSBibGFja1BvaW50WzJdOworCisgICAgICBpZiAoX3RoaXM2LlhXIDwgMCB8fCBfdGhpczYuWlcgPCAwIHx8IF90aGlzNi5ZVyAhPT0gMSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzLCBubyBmYWxsYmFjayBhdmFpbGFibGUiKTsKKyAgICAgIH0KKworICAgICAgaWYgKF90aGlzNi5YQiA8IDAgfHwgX3RoaXM2LllCIDwgMCB8fCBfdGhpczYuWkIgPCAwKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCIpOworICAgICAgICBfdGhpczYuWEIgPSBfdGhpczYuWUIgPSBfdGhpczYuWkIgPSAwOworICAgICAgfQorCisgICAgICBpZiAoX3RoaXM2LmFtaW4gPiBfdGhpczYuYW1heCB8fCBfdGhpczYuYm1pbiA+IF90aGlzNi5ibWF4KSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW52YWxpZCBSYW5nZSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzIik7CisgICAgICAgIF90aGlzNi5hbWluID0gLTEwMDsKKyAgICAgICAgX3RoaXM2LmFtYXggPSAxMDA7CisgICAgICAgIF90aGlzNi5ibWluID0gLTEwMDsKKyAgICAgICAgX3RoaXM2LmJtYXggPSAxMDA7CisgICAgICB9CisKKyAgICAgIHJldHVybiBfdGhpczY7CisgICAgfQorCisgICAgX2NyZWF0ZUNsYXNzKExhYkNTLCBbeworICAgICAga2V5OiAiZ2V0UmdiSXRlbSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGZhbHNlLCBkZXN0LCBkZXN0T2Zmc2V0KTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJnZXRSZ2JCdWZmZXIiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICAgICAgdmFyIG1heFZhbCA9ICgxIDw8IGJpdHMpIC0gMTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIG1heFZhbCwgZGVzdCwgZGVzdE9mZnNldCk7CisgICAgICAgICAgc3JjT2Zmc2V0ICs9IDM7CisgICAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImdldE91dHB1dExlbmd0aCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSkgLyAzIHwgMDsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJpc0RlZmF1bHREZWNvZGUiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJ1c2VzWmVyb1RvT25lUmFuZ2UiLAorICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidXNlc1plcm9Ub09uZVJhbmdlIiwgZmFsc2UpOworICAgICAgfQorICAgIH1dKTsKKworICAgIHJldHVybiBMYWJDUzsKKyAgfShDb2xvclNwYWNlKTsKKworICByZXR1cm4gTGFiQ1M7Cit9KCk7CisKKy8qKiovIH0pLAorLyogMjIxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuR2xvYmFsSW1hZ2VDYWNoZSA9IGV4cG9ydHMuTG9jYWxHU3RhdGVDYWNoZSA9IGV4cG9ydHMuTG9jYWxGdW5jdGlvbkNhY2hlID0gZXhwb3J0cy5Mb2NhbENvbG9yU3BhY2VDYWNoZSA9IGV4cG9ydHMuTG9jYWxJbWFnZUNhY2hlID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMik7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgQmFzZUxvY2FsQ2FjaGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBCYXNlTG9jYWxDYWNoZShvcHRpb25zKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJhc2VMb2NhbENhY2hlKTsKKworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlTG9jYWxDYWNoZSkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUxvY2FsQ2FjaGUuIik7CisgICAgfQorCisgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm9ubHlSZWZzKSB7CisgICAgICB0aGlzLl9uYW1lUmVmTWFwID0gbmV3IE1hcCgpOworICAgICAgdGhpcy5faW1hZ2VNYXAgPSBuZXcgTWFwKCk7CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEJhc2VMb2NhbENhY2hlLCBbeworICAgIGtleTogImdldEJ5TmFtZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJ5TmFtZShuYW1lKSB7CisgICAgICB2YXIgcmVmID0gdGhpcy5fbmFtZVJlZk1hcC5nZXQobmFtZSk7CisKKyAgICAgIGlmIChyZWYpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlSZWYocmVmKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX2ltYWdlTWFwLmdldChuYW1lKSB8fCBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEJ5UmVmIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QnlSZWYocmVmKSB7CisgICAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKSB8fCBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldChuYW1lLCByZWYsIGRhdGEpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgc2V0YCBjYWxsZWQuIik7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEJhc2VMb2NhbENhY2hlOworfSgpOworCit2YXIgTG9jYWxJbWFnZUNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUxvY2FsQ2FjaGUpIHsKKyAgX2luaGVyaXRzKExvY2FsSW1hZ2VDYWNoZSwgX0Jhc2VMb2NhbENhY2hlKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKExvY2FsSW1hZ2VDYWNoZSk7CisKKyAgZnVuY3Rpb24gTG9jYWxJbWFnZUNhY2hlKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhbEltYWdlQ2FjaGUpOworCisgICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKExvY2FsSW1hZ2VDYWNoZSwgW3sKKyAgICBrZXk6ICJzZXQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQobmFtZSkgeworICAgICAgdmFyIHJlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDsKKyAgICAgIHZhciBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7CisKKyAgICAgIGlmICghbmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7CisgICAgICB9CisKKyAgICAgIGlmIChyZWYpIHsKKyAgICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9uYW1lUmVmTWFwLnNldChuYW1lLCByZWYpOworCisgICAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBMb2NhbEltYWdlQ2FjaGU7Cit9KEJhc2VMb2NhbENhY2hlKTsKKworZXhwb3J0cy5Mb2NhbEltYWdlQ2FjaGUgPSBMb2NhbEltYWdlQ2FjaGU7CisKK3ZhciBMb2NhbENvbG9yU3BhY2VDYWNoZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VMb2NhbENhY2hlMikgeworICBfaW5oZXJpdHMoTG9jYWxDb2xvclNwYWNlQ2FjaGUsIF9CYXNlTG9jYWxDYWNoZTIpOworCisgIHZhciBfc3VwZXIyID0gX2NyZWF0ZVN1cGVyKExvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKworICBmdW5jdGlvbiBMb2NhbENvbG9yU3BhY2VDYWNoZSgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgcmV0dXJuIF9zdXBlcjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhMb2NhbENvbG9yU3BhY2VDYWNoZSwgW3sKKyAgICBrZXk6ICJzZXQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoKSB7CisgICAgICB2YXIgbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDsKKyAgICAgIHZhciByZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7CisgICAgICB2YXIgZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkOworCisgICAgICBpZiAoIW5hbWUgJiYgIXJlZikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7CisgICAgICB9CisKKyAgICAgIGlmIChyZWYpIHsKKyAgICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gTG9jYWxDb2xvclNwYWNlQ2FjaGU7Cit9KEJhc2VMb2NhbENhY2hlKTsKKworZXhwb3J0cy5Mb2NhbENvbG9yU3BhY2VDYWNoZSA9IExvY2FsQ29sb3JTcGFjZUNhY2hlOworCit2YXIgTG9jYWxGdW5jdGlvbkNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUxvY2FsQ2FjaGUzKSB7CisgIF9pbmhlcml0cyhMb2NhbEZ1bmN0aW9uQ2FjaGUsIF9CYXNlTG9jYWxDYWNoZTMpOworCisgIHZhciBfc3VwZXIzID0gX2NyZWF0ZVN1cGVyKExvY2FsRnVuY3Rpb25DYWNoZSk7CisKKyAgZnVuY3Rpb24gTG9jYWxGdW5jdGlvbkNhY2hlKG9wdGlvbnMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9jYWxGdW5jdGlvbkNhY2hlKTsKKworICAgIHJldHVybiBfc3VwZXIzLmNhbGwodGhpcywgeworICAgICAgb25seVJlZnM6IHRydWUKKyAgICB9KTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhMb2NhbEZ1bmN0aW9uQ2FjaGUsIFt7CisgICAga2V5OiAiZ2V0QnlOYW1lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QnlOYW1lKG5hbWUpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBgZ2V0QnlOYW1lYCBtZXRob2QuIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KCkgeworICAgICAgdmFyIG5hbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7CisgICAgICB2YXIgcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7CisgICAgICB2YXIgZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkOworCisgICAgICBpZiAoIXJlZikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsRnVuY3Rpb25DYWNoZS5zZXQgLSBleHBlY3RlZCAicmVmIiBhcmd1bWVudC4nKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBMb2NhbEZ1bmN0aW9uQ2FjaGU7Cit9KEJhc2VMb2NhbENhY2hlKTsKKworZXhwb3J0cy5Mb2NhbEZ1bmN0aW9uQ2FjaGUgPSBMb2NhbEZ1bmN0aW9uQ2FjaGU7CisKK3ZhciBMb2NhbEdTdGF0ZUNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUxvY2FsQ2FjaGU0KSB7CisgIF9pbmhlcml0cyhMb2NhbEdTdGF0ZUNhY2hlLCBfQmFzZUxvY2FsQ2FjaGU0KTsKKworICB2YXIgX3N1cGVyNCA9IF9jcmVhdGVTdXBlcihMb2NhbEdTdGF0ZUNhY2hlKTsKKworICBmdW5jdGlvbiBMb2NhbEdTdGF0ZUNhY2hlKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhbEdTdGF0ZUNhY2hlKTsKKworICAgIHJldHVybiBfc3VwZXI0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoTG9jYWxHU3RhdGVDYWNoZSwgW3sKKyAgICBrZXk6ICJzZXQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQobmFtZSkgeworICAgICAgdmFyIHJlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDsKKyAgICAgIHZhciBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7CisKKyAgICAgIGlmICghbmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsR1N0YXRlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFyZ3VtZW50LicpOworICAgICAgfQorCisgICAgICBpZiAocmVmKSB7CisgICAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKKworICAgICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gTG9jYWxHU3RhdGVDYWNoZTsKK30oQmFzZUxvY2FsQ2FjaGUpOworCitleHBvcnRzLkxvY2FsR1N0YXRlQ2FjaGUgPSBMb2NhbEdTdGF0ZUNhY2hlOworCit2YXIgR2xvYmFsSW1hZ2VDYWNoZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIF9jcmVhdGVDbGFzcyhHbG9iYWxJbWFnZUNhY2hlLCBudWxsLCBbeworICAgIGtleTogIk5VTV9QQUdFU19USFJFU0hPTEQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJOVU1fUEFHRVNfVEhSRVNIT0xEIiwgMik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiTUFYX0lNQUdFU19UT19DQUNIRSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIk1BWF9JTUFHRVNfVE9fQ0FDSEUiLCAxMCk7CisgICAgfQorICB9XSk7CisKKyAgZnVuY3Rpb24gR2xvYmFsSW1hZ2VDYWNoZSgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgR2xvYmFsSW1hZ2VDYWNoZSk7CisKKyAgICB0aGlzLl9yZWZDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOworICAgIHRoaXMuX2ltYWdlQ2FjaGUgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhHbG9iYWxJbWFnZUNhY2hlLCBbeworICAgIGtleTogInNob3VsZENhY2hlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ2FjaGUocmVmLCBwYWdlSW5kZXgpIHsKKyAgICAgIHZhciBwYWdlSW5kZXhTZXQgPSB0aGlzLl9yZWZDYWNoZS5nZXQocmVmKTsKKworICAgICAgdmFyIG51bVBhZ2VzID0gcGFnZUluZGV4U2V0ID8gcGFnZUluZGV4U2V0LnNpemUgKyAocGFnZUluZGV4U2V0LmhhcyhwYWdlSW5kZXgpID8gMCA6IDEpIDogMTsKKworICAgICAgaWYgKG51bVBhZ2VzIDwgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpICYmIHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA+PSBHbG9iYWxJbWFnZUNhY2hlLk1BWF9JTUFHRVNfVE9fQ0FDSEUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJhZGRQYWdlSW5kZXgiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRQYWdlSW5kZXgocmVmLCBwYWdlSW5kZXgpIHsKKyAgICAgIHZhciBwYWdlSW5kZXhTZXQgPSB0aGlzLl9yZWZDYWNoZS5nZXQocmVmKTsKKworICAgICAgaWYgKCFwYWdlSW5kZXhTZXQpIHsKKyAgICAgICAgcGFnZUluZGV4U2V0ID0gbmV3IFNldCgpOworCisgICAgICAgIHRoaXMuX3JlZkNhY2hlLnB1dChyZWYsIHBhZ2VJbmRleFNldCk7CisgICAgICB9CisKKyAgICAgIHBhZ2VJbmRleFNldC5hZGQocGFnZUluZGV4KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXREYXRhIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGF0YShyZWYsIHBhZ2VJbmRleCkgeworICAgICAgdmFyIHBhZ2VJbmRleFNldCA9IHRoaXMuX3JlZkNhY2hlLmdldChyZWYpOworCisgICAgICBpZiAoIXBhZ2VJbmRleFNldCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHBhZ2VJbmRleFNldC5zaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHBhZ2VJbmRleFNldC5hZGQocGFnZUluZGV4KTsKKyAgICAgIHJldHVybiB0aGlzLl9pbWFnZUNhY2hlLmdldChyZWYpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldERhdGEiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREYXRhKHJlZiwgZGF0YSkgeworICAgICAgaWYgKCF0aGlzLl9yZWZDYWNoZS5oYXMocmVmKSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YSAtIGV4cGVjdGVkICJhZGRQYWdlSW5kZXgiIHRvIGhhdmUgYmVlbiBjYWxsZWQuJyk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA+PSBHbG9iYWxJbWFnZUNhY2hlLk1BWF9JTUFHRVNfVE9fQ0FDSEUpIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBpZ25vcmluZyBpbWFnZSBhYm92ZSBNQVhfSU1BR0VTX1RPX0NBQ0hFLiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2xlYXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHsKKyAgICAgIHZhciBvbmx5RGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CisKKyAgICAgIGlmICghb25seURhdGEpIHsKKyAgICAgICAgdGhpcy5fcmVmQ2FjaGUuY2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5faW1hZ2VDYWNoZS5jbGVhcigpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBHbG9iYWxJbWFnZUNhY2hlOworfSgpOworCitleHBvcnRzLkdsb2JhbEltYWdlQ2FjaGUgPSBHbG9iYWxJbWFnZUNhY2hlOworCisvKioqLyB9KSwKKy8qIDIyMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldFF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzOworZXhwb3J0cy5NYXJrdXBBbm5vdGF0aW9uID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmFjdG9yeSA9IGV4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlID0gZXhwb3J0cy5Bbm5vdGF0aW9uID0gdm9pZCAwOworCit2YXIgX3JlZ2VuZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dfcGRmanNfcmVxdWlyZV9fKDIpKTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9vYmogPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNyk7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjAyKTsKKwordmFyIF9jb2xvcnNwYWNlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjApOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK3ZhciBfb3BlcmF0b3JfbGlzdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIzKTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOSk7CisKK3ZhciBfd3JpdGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjQpOworCitmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAiZGVmYXVsdCI6IG9iaiB9OyB9CisKK2Z1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSAidW5kZWZpbmVkIiAmJiBSZWZsZWN0LmdldCkgeyBfZ2V0ID0gUmVmbGVjdC5nZXQ7IH0gZWxzZSB7IF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBiYXNlID0gX3N1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7IGlmICghYmFzZSkgcmV0dXJuOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOyBpZiAoZGVzYy5nZXQpIHsgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpOyB9IHJldHVybiBkZXNjLnZhbHVlOyB9OyB9IHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7IH0KKworZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkgeyB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkgeyBvYmplY3QgPSBfZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7IH0gcmV0dXJuIG9iamVjdDsgfQorCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgdGhyb3cgX2UyOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMykgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTM7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFsicmV0dXJuIl0gIT0gbnVsbCkgaXRbInJldHVybiJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfQorCitmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9CisKK2Z1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCitmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbInJldHVybiJdICE9IG51bGwpIF9pWyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0KKworZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgQW5ub3RhdGlvbkZhY3RvcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBBbm5vdGF0aW9uRmFjdG9yeSgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5ub3RhdGlvbkZhY3RvcnkpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEFubm90YXRpb25GYWN0b3J5LCBudWxsLCBbeworICAgIGtleTogImNyZWF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZSh4cmVmLCByZWYsIHBkZk1hbmFnZXIsIGlkRmFjdG9yeSkgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKS50aGVuKGZ1bmN0aW9uIChhY3JvRm9ybSkgeworICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmUoX3RoaXMsICJfY3JlYXRlIiwgW3hyZWYsIHJlZiwgcGRmTWFuYWdlciwgaWRGYWN0b3J5LCBhY3JvRm9ybV0pOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2NyZWF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9jcmVhdGUoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyLCBpZEZhY3RvcnksIGFjcm9Gb3JtKSB7CisgICAgICB2YXIgZGljdCA9IHhyZWYuZmV0Y2hJZlJlZihyZWYpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QpKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHZhciBpZCA9ICgwLCBfcHJpbWl0aXZlcy5pc1JlZikocmVmKSA/IHJlZi50b1N0cmluZygpIDogImFubm90XyIuY29uY2F0KGlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpKTsKKyAgICAgIHZhciBzdWJ0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKKyAgICAgIHN1YnR5cGUgPSAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShzdWJ0eXBlKSA/IHN1YnR5cGUubmFtZSA6IG51bGw7CisgICAgICB2YXIgcGFyYW1ldGVycyA9IHsKKyAgICAgICAgeHJlZjogeHJlZiwKKyAgICAgICAgcmVmOiByZWYsCisgICAgICAgIGRpY3Q6IGRpY3QsCisgICAgICAgIHN1YnR5cGU6IHN1YnR5cGUsCisgICAgICAgIGlkOiBpZCwKKyAgICAgICAgcGRmTWFuYWdlcjogcGRmTWFuYWdlciwKKyAgICAgICAgYWNyb0Zvcm06IGFjcm9Gb3JtIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCA/IGFjcm9Gb3JtIDogX3ByaW1pdGl2ZXMuRGljdC5lbXB0eQorICAgICAgfTsKKworICAgICAgc3dpdGNoIChzdWJ0eXBlKSB7CisgICAgICAgIGNhc2UgIkxpbmsiOgorICAgICAgICAgIHJldHVybiBuZXcgTGlua0Fubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSAiVGV4dCI6CisgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlICJXaWRnZXQiOgorICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgICAgICAgZGljdDogZGljdCwKKyAgICAgICAgICAgIGtleTogIkZUIgorICAgICAgICAgIH0pOworICAgICAgICAgIGZpZWxkVHlwZSA9ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpZWxkVHlwZSkgPyBmaWVsZFR5cGUubmFtZSA6IG51bGw7CisKKyAgICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgY2FzZSAiVHgiOgorICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICAgICAgICBjYXNlICJCdG4iOgorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbldpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgICAgIGNhc2UgIkNoIjoKKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworICAgICAgICAgIH0KKworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgnVW5pbXBsZW1lbnRlZCB3aWRnZXQgZmllbGQgdHlwZSAiJyArIGZpZWxkVHlwZSArICciLCAnICsgImZhbGxpbmcgYmFjayB0byBiYXNlIGZpZWxkIHR5cGUuIik7CisgICAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICAgIGNhc2UgIlBvcHVwIjoKKyAgICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlICJGcmVlVGV4dCI6CisgICAgICAgICAgcmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSAiTGluZSI6CisgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlICJTcXVhcmUiOgorICAgICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlICJDaXJjbGUiOgorICAgICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlICJQb2x5TGluZSI6CisgICAgICAgICAgcmV0dXJuIG5ldyBQb2x5bGluZUFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSAiUG9seWdvbiI6CisgICAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlICJDYXJldCI6CisgICAgICAgICAgcmV0dXJuIG5ldyBDYXJldEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSAiSW5rIjoKKyAgICAgICAgICByZXR1cm4gbmV3IElua0Fubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSAiSGlnaGxpZ2h0IjoKKyAgICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSAiVW5kZXJsaW5lIjoKKyAgICAgICAgICByZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgY2FzZSAiU3F1aWdnbHkiOgorICAgICAgICAgIHJldHVybiBuZXcgU3F1aWdnbHlBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICAgIGNhc2UgIlN0cmlrZU91dCI6CisgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICAgIGNhc2UgIlN0YW1wIjoKKyAgICAgICAgICByZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgICBjYXNlICJGaWxlQXR0YWNobWVudCI6CisgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlQXR0YWNobWVudEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoIXN1YnR5cGUpIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQW5ub3RhdGlvbiBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCAvU3VidHlwZS4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCdVbmltcGxlbWVudGVkIGFubm90YXRpb24gdHlwZSAiJyArIHN1YnR5cGUgKyAnIiwgJyArICJmYWxsaW5nIGJhY2sgdG8gYmFzZSBhbm5vdGF0aW9uLiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKyAgICAgIH0KKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQW5ub3RhdGlvbkZhY3Rvcnk7Cit9KCk7CisKK2V4cG9ydHMuQW5ub3RhdGlvbkZhY3RvcnkgPSBBbm5vdGF0aW9uRmFjdG9yeTsKKworZnVuY3Rpb24gZ2V0UXVhZFBvaW50cyhkaWN0LCByZWN0KSB7CisgIGlmICghZGljdC5oYXMoIlF1YWRQb2ludHMiKSkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgdmFyIHF1YWRQb2ludHMgPSBkaWN0LmdldEFycmF5KCJRdWFkUG9pbnRzIik7CisKKyAgaWYgKCFBcnJheS5pc0FycmF5KHF1YWRQb2ludHMpIHx8IHF1YWRQb2ludHMubGVuZ3RoICUgOCA+IDApIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHZhciBxdWFkUG9pbnRzTGlzdHMgPSBbXTsKKworICBmb3IgKHZhciBpID0gMCwgaWkgPSBxdWFkUG9pbnRzLmxlbmd0aCAvIDg7IGkgPCBpaTsgaSsrKSB7CisgICAgcXVhZFBvaW50c0xpc3RzLnB1c2goW10pOworCisgICAgZm9yICh2YXIgaiA9IGkgKiA4LCBqaiA9IGkgKiA4ICsgODsgaiA8IGpqOyBqICs9IDIpIHsKKyAgICAgIHZhciB4ID0gcXVhZFBvaW50c1tqXTsKKyAgICAgIHZhciB5ID0gcXVhZFBvaW50c1tqICsgMV07CisKKyAgICAgIGlmICh4IDwgcmVjdFswXSB8fCB4ID4gcmVjdFsyXSB8fCB5IDwgcmVjdFsxXSB8fCB5ID4gcmVjdFszXSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgcXVhZFBvaW50c0xpc3RzW2ldLnB1c2goeworICAgICAgICB4OiB4LAorICAgICAgICB5OiB5CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcXVhZFBvaW50c0xpc3RzOworfQorCitmdW5jdGlvbiBnZXRUcmFuc2Zvcm1NYXRyaXgocmVjdCwgYmJveCwgbWF0cml4KSB7CisgIHZhciBfVXRpbCRnZXRBeGlhbEFsaWduZWQgPSBfdXRpbC5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KGJib3gsIG1hdHJpeCksCisgICAgICBfVXRpbCRnZXRBeGlhbEFsaWduZWQyID0gX3NsaWNlZFRvQXJyYXkoX1V0aWwkZ2V0QXhpYWxBbGlnbmVkLCA0KSwKKyAgICAgIG1pblggPSBfVXRpbCRnZXRBeGlhbEFsaWduZWQyWzBdLAorICAgICAgbWluWSA9IF9VdGlsJGdldEF4aWFsQWxpZ25lZDJbMV0sCisgICAgICBtYXhYID0gX1V0aWwkZ2V0QXhpYWxBbGlnbmVkMlsyXSwKKyAgICAgIG1heFkgPSBfVXRpbCRnZXRBeGlhbEFsaWduZWQyWzNdOworCisgIGlmIChtaW5YID09PSBtYXhYIHx8IG1pblkgPT09IG1heFkpIHsKKyAgICByZXR1cm4gWzEsIDAsIDAsIDEsIHJlY3RbMF0sIHJlY3RbMV1dOworICB9CisKKyAgdmFyIHhSYXRpbyA9IChyZWN0WzJdIC0gcmVjdFswXSkgLyAobWF4WCAtIG1pblgpOworICB2YXIgeVJhdGlvID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIChtYXhZIC0gbWluWSk7CisgIHJldHVybiBbeFJhdGlvLCAwLCAwLCB5UmF0aW8sIHJlY3RbMF0gLSBtaW5YICogeFJhdGlvLCByZWN0WzFdIC0gbWluWSAqIHlSYXRpb107Cit9CisKK3ZhciBBbm5vdGF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQW5ub3RhdGlvbihwYXJhbXMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5ub3RhdGlvbik7CisKKyAgICB2YXIgZGljdCA9IHBhcmFtcy5kaWN0OworICAgIHRoaXMuc2V0Q29udGVudHMoZGljdC5nZXQoIkNvbnRlbnRzIikpOworICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShkaWN0LmdldCgiTSIpKTsKKyAgICB0aGlzLnNldEZsYWdzKGRpY3QuZ2V0KCJGIikpOworICAgIHRoaXMuc2V0UmVjdGFuZ2xlKGRpY3QuZ2V0QXJyYXkoIlJlY3QiKSk7CisgICAgdGhpcy5zZXRDb2xvcihkaWN0LmdldEFycmF5KCJDIikpOworICAgIHRoaXMuc2V0Qm9yZGVyU3R5bGUoZGljdCk7CisgICAgdGhpcy5zZXRBcHBlYXJhbmNlKGRpY3QpOworICAgIHRoaXMuZGF0YSA9IHsKKyAgICAgIGFubm90YXRpb25GbGFnczogdGhpcy5mbGFncywKKyAgICAgIGJvcmRlclN0eWxlOiB0aGlzLmJvcmRlclN0eWxlLAorICAgICAgY29sb3I6IHRoaXMuY29sb3IsCisgICAgICBjb250ZW50czogdGhpcy5jb250ZW50cywKKyAgICAgIGhhc0FwcGVhcmFuY2U6ICEhdGhpcy5hcHBlYXJhbmNlLAorICAgICAgaWQ6IHBhcmFtcy5pZCwKKyAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMubW9kaWZpY2F0aW9uRGF0ZSwKKyAgICAgIHJlY3Q6IHRoaXMucmVjdGFuZ2xlLAorICAgICAgc3VidHlwZTogcGFyYW1zLnN1YnR5cGUKKyAgICB9OworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEFubm90YXRpb24sIFt7CisgICAga2V5OiAiX2hhc0ZsYWciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFzRmxhZyhmbGFncywgZmxhZykgeworICAgICAgcmV0dXJuICEhKGZsYWdzICYgZmxhZyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2lzVmlld2FibGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfaXNWaWV3YWJsZShmbGFncykgeworICAgICAgcmV0dXJuICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5ISURERU4pICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5OT1ZJRVcpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9pc1ByaW50YWJsZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9pc1ByaW50YWJsZShmbGFncykgeworICAgICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcoZmxhZ3MsIF91dGlsLkFubm90YXRpb25GbGFnLlBSSU5UKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuSElEREVOKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRDb250ZW50cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbnRlbnRzKGNvbnRlbnRzKSB7CisgICAgICB0aGlzLmNvbnRlbnRzID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShjb250ZW50cyB8fCAiIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0TW9kaWZpY2F0aW9uRGF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldE1vZGlmaWNhdGlvbkRhdGUobW9kaWZpY2F0aW9uRGF0ZSkgeworICAgICAgdGhpcy5tb2RpZmljYXRpb25EYXRlID0gKDAsIF91dGlsLmlzU3RyaW5nKShtb2RpZmljYXRpb25EYXRlKSA/IG1vZGlmaWNhdGlvbkRhdGUgOiBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldEZsYWdzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RmxhZ3MoZmxhZ3MpIHsKKyAgICAgIHRoaXMuZmxhZ3MgPSBOdW1iZXIuaXNJbnRlZ2VyKGZsYWdzKSAmJiBmbGFncyA+IDAgPyBmbGFncyA6IDA7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaGFzRmxhZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0ZsYWcoZmxhZykgeworICAgICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgZmxhZyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0UmVjdGFuZ2xlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UmVjdGFuZ2xlKHJlY3RhbmdsZSkgeworICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVjdGFuZ2xlKSAmJiByZWN0YW5nbGUubGVuZ3RoID09PSA0KSB7CisgICAgICAgIHRoaXMucmVjdGFuZ2xlID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KHJlY3RhbmdsZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnJlY3RhbmdsZSA9IFswLCAwLCAwLCAwXTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRDb2xvciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbG9yKGNvbG9yKSB7CisgICAgICB2YXIgcmdiQ29sb3IgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7CisKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2xvcikpIHsKKyAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoY29sb3IubGVuZ3RoKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICB0aGlzLmNvbG9yID0gbnVsbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOworCisgICAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKKworICAgICAgICAgIHRoaXMuY29sb3IgPSByZ2JDb2xvcjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOworCisgICAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInNldEJvcmRlclN0eWxlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Qm9yZGVyU3R5bGUoYm9yZGVyU3R5bGUpIHsKKyAgICAgIHRoaXMuYm9yZGVyU3R5bGUgPSBuZXcgQW5ub3RhdGlvbkJvcmRlclN0eWxlKCk7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoYm9yZGVyU3R5bGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGJvcmRlclN0eWxlLmhhcygiQlMiKSkgeworICAgICAgICB2YXIgZGljdCA9IGJvcmRlclN0eWxlLmdldCgiQlMiKTsKKyAgICAgICAgdmFyIGRpY3RUeXBlID0gZGljdC5nZXQoIlR5cGUiKTsKKworICAgICAgICBpZiAoIWRpY3RUeXBlIHx8ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGRpY3RUeXBlLCAiQm9yZGVyIikpIHsKKyAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGRpY3QuZ2V0KCJXIiksIHRoaXMucmVjdGFuZ2xlKTsKKyAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFN0eWxlKGRpY3QuZ2V0KCJTIikpOworICAgICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0RGFzaEFycmF5KGRpY3QuZ2V0QXJyYXkoIkQiKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoYm9yZGVyU3R5bGUuaGFzKCJCb3JkZXIiKSkgeworICAgICAgICB2YXIgYXJyYXkgPSBib3JkZXJTdHlsZS5nZXRBcnJheSgiQm9yZGVyIik7CisKKyAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCA+PSAzKSB7CisgICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKGFycmF5WzBdKTsKKyAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKGFycmF5WzFdKTsKKyAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGFycmF5WzJdLCB0aGlzLnJlY3RhbmdsZSk7CisKKyAgICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSA0KSB7CisgICAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldERhc2hBcnJheShhcnJheVszXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKDApOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInNldEFwcGVhcmFuY2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRBcHBlYXJhbmNlKGRpY3QpIHsKKyAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IG51bGw7CisgICAgICB2YXIgYXBwZWFyYW5jZVN0YXRlcyA9IGRpY3QuZ2V0KCJBUCIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGFwcGVhcmFuY2VTdGF0ZXMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KCJOIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSkpIHsKKyAgICAgICAgdGhpcy5hcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZVN0YXRlOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9ybWFsQXBwZWFyYW5jZVN0YXRlKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBhcyA9IGRpY3QuZ2V0KCJBUyIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGFzKSB8fCAhbm9ybWFsQXBwZWFyYW5jZVN0YXRlLmhhcyhhcy5uYW1lKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZS5nZXQoYXMubmFtZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAibG9hZFJlc291cmNlcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWRSZXNvdXJjZXMoa2V5cykgeworICAgICAgcmV0dXJuIHRoaXMuYXBwZWFyYW5jZS5kaWN0LmdldEFzeW5jKCJSZXNvdXJjZXMiKS50aGVuKGZ1bmN0aW9uIChyZXNvdXJjZXMpIHsKKyAgICAgICAgaWYgKCFyZXNvdXJjZXMpIHsKKyAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG9iamVjdExvYWRlciA9IG5ldyBfb2JqLk9iamVjdExvYWRlcihyZXNvdXJjZXMsIGtleXMsIHJlc291cmNlcy54cmVmKTsKKyAgICAgICAgcmV0dXJuIG9iamVjdExvYWRlci5sb2FkKCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuIHJlc291cmNlczsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRPcGVyYXRvckxpc3QiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CisgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGFwcGVhcmFuY2UgPSB0aGlzLmFwcGVhcmFuY2U7CisgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICAgIHZhciBhcHBlYXJhbmNlRGljdCA9IGFwcGVhcmFuY2UuZGljdDsKKyAgICAgIHZhciByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIkNvbG9yU3BhY2UiLCAiUGF0dGVybiIsICJTaGFkaW5nIiwgIlhPYmplY3QiLCAiRm9udCJdKTsKKyAgICAgIHZhciBiYm94ID0gYXBwZWFyYW5jZURpY3QuZ2V0QXJyYXkoIkJCb3giKSB8fCBbMCwgMCwgMSwgMV07CisgICAgICB2YXIgbWF0cml4ID0gYXBwZWFyYW5jZURpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTsKKyAgICAgIHZhciB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgoZGF0YS5yZWN0LCBiYm94LCBtYXRyaXgpOworICAgICAgcmV0dXJuIHJlc291cmNlc1Byb21pc2UudGhlbihmdW5jdGlvbiAocmVzb3VyY2VzKSB7CisgICAgICAgIHZhciBvcExpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CisgICAgICAgIG9wTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9uLCBbZGF0YS5yZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeF0pOworICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CisgICAgICAgICAgc3RyZWFtOiBhcHBlYXJhbmNlLAorICAgICAgICAgIHRhc2s6IHRhc2ssCisgICAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsCisgICAgICAgICAgb3BlcmF0b3JMaXN0OiBvcExpc3QKKyAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgb3BMaXN0LmFkZE9wKF91dGlsLk9QUy5lbmRBbm5vdGF0aW9uLCBbXSk7CisgICAgICAgICAgYXBwZWFyYW5jZS5yZXNldCgpOworICAgICAgICAgIHJldHVybiBvcExpc3Q7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2F2ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfc2F2ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgbnVsbCk7CisKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gc2F2ZShfeCwgX3gyLCBfeDMpIHsKKyAgICAgICAgcmV0dXJuIF9zYXZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBzYXZlOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAidmlld2FibGUiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgaWYgKHRoaXMuZmxhZ3MgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9pc1ZpZXdhYmxlKHRoaXMuZmxhZ3MpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInByaW50YWJsZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICBpZiAodGhpcy5mbGFncyA9PT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9pc1ByaW50YWJsZSh0aGlzLmZsYWdzKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQW5ub3RhdGlvbjsKK30oKTsKKworZXhwb3J0cy5Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbjsKKwordmFyIEFubm90YXRpb25Cb3JkZXJTdHlsZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEFubm90YXRpb25Cb3JkZXJTdHlsZSgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5ub3RhdGlvbkJvcmRlclN0eWxlKTsKKworICAgIHRoaXMud2lkdGggPSAxOworICAgIHRoaXMuc3R5bGUgPSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOworICAgIHRoaXMuZGFzaEFycmF5ID0gWzNdOworICAgIHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cyA9IDA7CisgICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IDA7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQW5ub3RhdGlvbkJvcmRlclN0eWxlLCBbeworICAgIGtleTogInNldFdpZHRoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0V2lkdGgod2lkdGgpIHsKKyAgICAgIHZhciByZWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbMCwgMCwgMCwgMF07CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh3aWR0aCkpIHsKKyAgICAgICAgdGhpcy53aWR0aCA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIod2lkdGgpKSB7CisgICAgICAgIGlmICh3aWR0aCA+IDApIHsKKyAgICAgICAgICB2YXIgbWF4V2lkdGggPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gMjsKKyAgICAgICAgICB2YXIgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7CisKKyAgICAgICAgICBpZiAobWF4V2lkdGggPiAwICYmIG1heEhlaWdodCA+IDAgJiYgKHdpZHRoID4gbWF4V2lkdGggfHwgd2lkdGggPiBtYXhIZWlnaHQpKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkFubm90YXRpb25Cb3JkZXJTdHlsZS5zZXRXaWR0aCAtIGlnbm9yaW5nIHdpZHRoOiAiLmNvbmNhdCh3aWR0aCkpOworICAgICAgICAgICAgd2lkdGggPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRTdHlsZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlKSB7CisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHN0eWxlKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoc3R5bGUubmFtZSkgeworICAgICAgICBjYXNlICJTIjoKKyAgICAgICAgICB0aGlzLnN0eWxlID0gX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJEIjoKKyAgICAgICAgICB0aGlzLnN0eWxlID0gX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiQiI6CisgICAgICAgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJJIjoKKyAgICAgICAgICB0aGlzLnN0eWxlID0gX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJVIjoKKyAgICAgICAgICB0aGlzLnN0eWxlID0gX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXREYXNoQXJyYXkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREYXNoQXJyYXkoZGFzaEFycmF5KSB7CisgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXNoQXJyYXkpICYmIGRhc2hBcnJheS5sZW5ndGggPiAwKSB7CisgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgdmFyIGFsbFplcm9zID0gdHJ1ZTsKKworICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGFzaEFycmF5KSwKKyAgICAgICAgICAgIF9zdGVwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3N0ZXAudmFsdWU7CisgICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSArZWxlbWVudCA+PSAwOworCisgICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKSB7CisgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPiAwKSB7CisgICAgICAgICAgICAgIGFsbFplcm9zID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3IuZShlcnIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIF9pdGVyYXRvci5mKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHsKKyAgICAgICAgICB0aGlzLmRhc2hBcnJheSA9IGRhc2hBcnJheTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLndpZHRoID0gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChkYXNoQXJyYXkpIHsKKyAgICAgICAgdGhpcy53aWR0aCA9IDA7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEhvcml6b250YWxDb3JuZXJSYWRpdXMocmFkaXVzKSB7CisgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihyYWRpdXMpKSB7CisgICAgICAgIHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cyA9IHJhZGl1czsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRWZXJ0aWNhbENvcm5lclJhZGl1cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKHJhZGl1cykgeworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgeworICAgICAgICB0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzID0gcmFkaXVzOworICAgICAgfQorICAgIH0KKyAgfV0pOworCisgIHJldHVybiBBbm5vdGF0aW9uQm9yZGVyU3R5bGU7Cit9KCk7CisKK2V4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlOworCit2YXIgTWFya3VwQW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Fubm90YXRpb24pIHsKKyAgX2luaGVyaXRzKE1hcmt1cEFubm90YXRpb24sIF9Bbm5vdGF0aW9uKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE1hcmt1cEFubm90YXRpb24pOworCisgIGZ1bmN0aW9uIE1hcmt1cEFubm90YXRpb24ocGFyYW1ldGVycykgeworICAgIHZhciBfdGhpczI7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFya3VwQW5ub3RhdGlvbik7CisKKyAgICBfdGhpczIgPSBfc3VwZXIuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzKTsKKyAgICB2YXIgZGljdCA9IHBhcmFtZXRlcnMuZGljdDsKKworICAgIGlmIChkaWN0LmhhcygiSVJUIikpIHsKKyAgICAgIHZhciByYXdJUlQgPSBkaWN0LmdldFJhdygiSVJUIik7CisgICAgICBfdGhpczIuZGF0YS5pblJlcGx5VG8gPSAoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKHJhd0lSVCkgPyByYXdJUlQudG9TdHJpbmcoKSA6IG51bGw7CisgICAgICB2YXIgcnQgPSBkaWN0LmdldCgiUlQiKTsKKyAgICAgIF90aGlzMi5kYXRhLnJlcGx5VHlwZSA9ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHJ0KSA/IHJ0Lm5hbWUgOiBfdXRpbC5Bbm5vdGF0aW9uUmVwbHlUeXBlLlJFUExZOworICAgIH0KKworICAgIGlmIChfdGhpczIuZGF0YS5yZXBseVR5cGUgPT09IF91dGlsLkFubm90YXRpb25SZXBseVR5cGUuR1JPVVApIHsKKyAgICAgIHZhciBwYXJlbnQgPSBkaWN0LmdldCgiSVJUIik7CisgICAgICBfdGhpczIuZGF0YS50aXRsZSA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykocGFyZW50LmdldCgiVCIpIHx8ICIiKTsKKworICAgICAgX3RoaXMyLnNldENvbnRlbnRzKHBhcmVudC5nZXQoIkNvbnRlbnRzIikpOworCisgICAgICBfdGhpczIuZGF0YS5jb250ZW50cyA9IF90aGlzMi5jb250ZW50czsKKworICAgICAgaWYgKCFwYXJlbnQuaGFzKCJDcmVhdGlvbkRhdGUiKSkgeworICAgICAgICBfdGhpczIuZGF0YS5jcmVhdGlvbkRhdGUgPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3RoaXMyLnNldENyZWF0aW9uRGF0ZShwYXJlbnQuZ2V0KCJDcmVhdGlvbkRhdGUiKSk7CisKKyAgICAgICAgX3RoaXMyLmRhdGEuY3JlYXRpb25EYXRlID0gX3RoaXMyLmNyZWF0aW9uRGF0ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFwYXJlbnQuaGFzKCJNIikpIHsKKyAgICAgICAgX3RoaXMyLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IG51bGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBfdGhpczIuc2V0TW9kaWZpY2F0aW9uRGF0ZShwYXJlbnQuZ2V0KCJNIikpOworCisgICAgICAgIF90aGlzMi5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSBfdGhpczIubW9kaWZpY2F0aW9uRGF0ZTsKKyAgICAgIH0KKworICAgICAgX3RoaXMyLmRhdGEuaGFzUG9wdXAgPSBwYXJlbnQuaGFzKCJQb3B1cCIpOworCisgICAgICBpZiAoIXBhcmVudC5oYXMoIkMiKSkgeworICAgICAgICBfdGhpczIuZGF0YS5jb2xvciA9IG51bGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBfdGhpczIuc2V0Q29sb3IocGFyZW50LmdldEFycmF5KCJDIikpOworCisgICAgICAgIF90aGlzMi5kYXRhLmNvbG9yID0gX3RoaXMyLmNvbG9yOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfdGhpczIuZGF0YS50aXRsZSA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZGljdC5nZXQoIlQiKSB8fCAiIik7CisKKyAgICAgIF90aGlzMi5zZXRDcmVhdGlvbkRhdGUoZGljdC5nZXQoIkNyZWF0aW9uRGF0ZSIpKTsKKworICAgICAgX3RoaXMyLmRhdGEuY3JlYXRpb25EYXRlID0gX3RoaXMyLmNyZWF0aW9uRGF0ZTsKKyAgICAgIF90aGlzMi5kYXRhLmhhc1BvcHVwID0gZGljdC5oYXMoIlBvcHVwIik7CisKKyAgICAgIGlmICghZGljdC5oYXMoIkMiKSkgeworICAgICAgICBfdGhpczIuZGF0YS5jb2xvciA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIF90aGlzMjsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhNYXJrdXBBbm5vdGF0aW9uLCBbeworICAgIGtleTogInNldENyZWF0aW9uRGF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldENyZWF0aW9uRGF0ZShjcmVhdGlvbkRhdGUpIHsKKyAgICAgIHRoaXMuY3JlYXRpb25EYXRlID0gKDAsIF91dGlsLmlzU3RyaW5nKShjcmVhdGlvbkRhdGUpID8gY3JlYXRpb25EYXRlIDogbnVsbDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gTWFya3VwQW5ub3RhdGlvbjsKK30oQW5ub3RhdGlvbik7CisKK2V4cG9ydHMuTWFya3VwQW5ub3RhdGlvbiA9IE1hcmt1cEFubm90YXRpb247CisKK3ZhciBXaWRnZXRBbm5vdGF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5ub3RhdGlvbjIpIHsKKyAgX2luaGVyaXRzKFdpZGdldEFubm90YXRpb24sIF9Bbm5vdGF0aW9uMik7CisKKyAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoV2lkZ2V0QW5ub3RhdGlvbik7CisKKyAgZnVuY3Rpb24gV2lkZ2V0QW5ub3RhdGlvbihwYXJhbXMpIHsKKyAgICB2YXIgX3RoaXMzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdpZGdldEFubm90YXRpb24pOworCisgICAgX3RoaXMzID0gX3N1cGVyMi5jYWxsKHRoaXMsIHBhcmFtcyk7CisgICAgdmFyIGRpY3QgPSBwYXJhbXMuZGljdDsKKyAgICB2YXIgZGF0YSA9IF90aGlzMy5kYXRhOworICAgIF90aGlzMy5yZWYgPSBwYXJhbXMucmVmOworICAgIGRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQ7CisgICAgZGF0YS5maWVsZE5hbWUgPSBfdGhpczMuX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KTsKKyAgICB2YXIgZmllbGRWYWx1ZSA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0OiBkaWN0LAorICAgICAga2V5OiAiViIsCisgICAgICBnZXRBcnJheTogdHJ1ZQorICAgIH0pOworICAgIGRhdGEuZmllbGRWYWx1ZSA9IF90aGlzMy5fZGVjb2RlRm9ybVZhbHVlKGZpZWxkVmFsdWUpOworICAgIGRhdGEuYWx0ZXJuYXRpdmVUZXh0ID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShkaWN0LmdldCgiVFUiKSB8fCAiIik7CisgICAgZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0OiBkaWN0LAorICAgICAga2V5OiAiREEiCisgICAgfSkgfHwgcGFyYW1zLmFjcm9Gb3JtLmdldCgiREEiKSB8fCAiIjsKKyAgICB2YXIgZmllbGRUeXBlID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3Q6IGRpY3QsCisgICAgICBrZXk6ICJGVCIKKyAgICB9KTsKKyAgICBkYXRhLmZpZWxkVHlwZSA9ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpZWxkVHlwZSkgPyBmaWVsZFR5cGUubmFtZSA6IG51bGw7CisgICAgX3RoaXMzLmZpZWxkUmVzb3VyY2VzID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3Q6IGRpY3QsCisgICAgICBrZXk6ICJEUiIKKyAgICB9KSB8fCBwYXJhbXMuYWNyb0Zvcm0uZ2V0KCJEUiIpIHx8IF9wcmltaXRpdmVzLkRpY3QuZW1wdHk7CisgICAgZGF0YS5maWVsZEZsYWdzID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3Q6IGRpY3QsCisgICAgICBrZXk6ICJGZiIKKyAgICB9KTsKKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRhLmZpZWxkRmxhZ3MpIHx8IGRhdGEuZmllbGRGbGFncyA8IDApIHsKKyAgICAgIGRhdGEuZmllbGRGbGFncyA9IDA7CisgICAgfQorCisgICAgZGF0YS5yZWFkT25seSA9IF90aGlzMy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5SRUFET05MWSk7CisKKyAgICBpZiAoZGF0YS5maWVsZFR5cGUgPT09ICJTaWciKSB7CisgICAgICBkYXRhLmZpZWxkVmFsdWUgPSBudWxsOworCisgICAgICBfdGhpczMuc2V0RmxhZ3MoX3V0aWwuQW5ub3RhdGlvbkZsYWcuSElEREVOKTsKKyAgICB9CisKKyAgICByZXR1cm4gX3RoaXMzOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFdpZGdldEFubm90YXRpb24sIFt7CisgICAga2V5OiAiX2NvbnN0cnVjdEZpZWxkTmFtZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9jb25zdHJ1Y3RGaWVsZE5hbWUoZGljdCkgeworICAgICAgaWYgKCFkaWN0LmhhcygiVCIpICYmICFkaWN0LmhhcygiUGFyZW50IikpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpOworICAgICAgICByZXR1cm4gIiI7CisgICAgICB9CisKKyAgICAgIGlmICghZGljdC5oYXMoIlBhcmVudCIpKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRpY3QuZ2V0KCJUIikpOworICAgICAgfQorCisgICAgICB2YXIgZmllbGROYW1lID0gW107CisKKyAgICAgIGlmIChkaWN0LmhhcygiVCIpKSB7CisgICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZGljdC5nZXQoIlQiKSkpOworICAgICAgfQorCisgICAgICB2YXIgbG9vcERpY3QgPSBkaWN0OworCisgICAgICB3aGlsZSAobG9vcERpY3QuaGFzKCJQYXJlbnQiKSkgeworICAgICAgICBsb29wRGljdCA9IGxvb3BEaWN0LmdldCgiUGFyZW50Iik7CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShsb29wRGljdCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb29wRGljdC5oYXMoIlQiKSkgeworICAgICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykobG9vcERpY3QuZ2V0KCJUIikpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZmllbGROYW1lLmpvaW4oIi4iKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfZGVjb2RlRm9ybVZhbHVlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2RlY29kZUZvcm1WYWx1ZShmb3JtVmFsdWUpIHsKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZvcm1WYWx1ZS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLmlzU3RyaW5nKShpdGVtKTsKKyAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoaXRlbSk7CisgICAgICAgIH0pOworICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmb3JtVmFsdWUpKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGZvcm1WYWx1ZS5uYW1lKTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShmb3JtVmFsdWUpKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGZvcm1WYWx1ZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogImhhc0ZpZWxkRmxhZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0ZpZWxkRmxhZyhmbGFnKSB7CisgICAgICByZXR1cm4gISEodGhpcy5kYXRhLmZpZWxkRmxhZ3MgJiBmbGFnKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRPcGVyYXRvckxpc3QiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICAgIHZhciBfdGhpczQgPSB0aGlzOworCisgICAgICBpZiAocmVuZGVyRm9ybXMpIHsKKyAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCkpOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMuX2hhc1RleHQpIHsKKyAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKFdpZGdldEFubm90YXRpb24ucHJvdG90eXBlKSwgImdldE9wZXJhdG9yTGlzdCIsIHRoaXMpLmNhbGwodGhpcywgZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5fZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKS50aGVuKGZ1bmN0aW9uIChjb250ZW50KSB7CisgICAgICAgIGlmIChfdGhpczQuYXBwZWFyYW5jZSAmJiBjb250ZW50ID09PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKFdpZGdldEFubm90YXRpb24ucHJvdG90eXBlKSwgImdldE9wZXJhdG9yTGlzdCIsIF90aGlzNCkuY2FsbChfdGhpczQsIGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBvcGVyYXRvckxpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CisKKyAgICAgICAgaWYgKCFfdGhpczQuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSB8fCBjb250ZW50ID09PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBtYXRyaXggPSBbMSwgMCwgMCwgMSwgMCwgMF07CisgICAgICAgIHZhciBiYm94ID0gWzAsIDAsIF90aGlzNC5kYXRhLnJlY3RbMl0gLSBfdGhpczQuZGF0YS5yZWN0WzBdLCBfdGhpczQuZGF0YS5yZWN0WzNdIC0gX3RoaXM0LmRhdGEucmVjdFsxXV07CisgICAgICAgIHZhciB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgoX3RoaXM0LmRhdGEucmVjdCwgYmJveCwgbWF0cml4KTsKKyAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5iZWdpbkFubm90YXRpb24sIFtfdGhpczQuZGF0YS5yZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeF0pOworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKGNvbnRlbnQpOworICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CisgICAgICAgICAgc3RyZWFtOiBzdHJlYW0sCisgICAgICAgICAgdGFzazogdGFzaywKKyAgICAgICAgICByZXNvdXJjZXM6IF90aGlzNC5maWVsZFJlc291cmNlcywKKyAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wZXJhdG9yTGlzdAorICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLmVuZEFubm90YXRpb24sIFtdKTsKKyAgICAgICAgICByZXR1cm4gb3BlcmF0b3JMaXN0OworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNhdmUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3NhdmUyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICAgICAgdmFyIGFwcGVhcmFuY2UsIGRpY3QsIGJib3gsIG5ld1JlZiwgQVAsIHZhbHVlLCBlbmNyeXB0LCBvcmlnaW5hbFRyYW5zZm9ybSwgbmV3VHJhbnNmb3JtLCBhcHBlYXJhbmNlRGljdCwgYnVmZmVyT3JpZ2luYWwsIGJ1ZmZlck5ldzsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSBhbm5vdGF0aW9uU3RvcmFnZVt0aGlzLmRhdGEuaWRdKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIG51bGwpOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGFwcGVhcmFuY2UgPSBfY29udGV4dDIuc2VudDsKKworICAgICAgICAgICAgICAgIGlmICghKGFwcGVhcmFuY2UgPT09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgbnVsbCk7CisKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIGRpY3QgPSBldmFsdWF0b3IueHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTsKKworICAgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0KSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCBudWxsKTsKKworICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgIGJib3ggPSBbMCwgMCwgdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXSwgdGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXV07CisgICAgICAgICAgICAgICAgbmV3UmVmID0gZXZhbHVhdG9yLnhyZWYuZ2V0TmV3UmVmKCk7CisgICAgICAgICAgICAgICAgQVAgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChldmFsdWF0b3IueHJlZik7CisgICAgICAgICAgICAgICAgQVAuc2V0KCJOIiwgbmV3UmVmKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF07CisgICAgICAgICAgICAgICAgZW5jcnlwdCA9IGV2YWx1YXRvci54cmVmLmVuY3J5cHQ7CisgICAgICAgICAgICAgICAgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsOworICAgICAgICAgICAgICAgIG5ld1RyYW5zZm9ybSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdCkgeworICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUcmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnJlZi5udW0sIHRoaXMucmVmLmdlbik7CisgICAgICAgICAgICAgICAgICBuZXdUcmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShuZXdSZWYubnVtLCBuZXdSZWYuZ2VuKTsKKyAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2UgPSBuZXdUcmFuc2Zvcm0uZW5jcnlwdFN0cmluZyhhcHBlYXJhbmNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkaWN0LnNldCgiViIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBkaWN0LnNldCgiQVAiLCBBUCk7CisgICAgICAgICAgICAgICAgZGljdC5zZXQoIk0iLCAiRDoiLmNvbmNhdCgoMCwgX3V0aWwuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKSkpOworICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoZXZhbHVhdG9yLnhyZWYpOworICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb3JtIikpOworICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiUmVzb3VyY2VzIiwgdGhpcy5maWVsZFJlc291cmNlcyk7CisgICAgICAgICAgICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KCJCQm94IiwgYmJveCk7CisgICAgICAgICAgICAgICAgYnVmZmVyT3JpZ2luYWwgPSBbIiIuY29uY2F0KHRoaXMucmVmLm51bSwgIiAiKS5jb25jYXQodGhpcy5yZWYuZ2VuLCAiIG9ialxuIildOworICAgICAgICAgICAgICAgICgwLCBfd3JpdGVyLndyaXRlRGljdCkoZGljdCwgYnVmZmVyT3JpZ2luYWwsIG9yaWdpbmFsVHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICBidWZmZXJPcmlnaW5hbC5wdXNoKCJcbmVuZG9ialxuIik7CisgICAgICAgICAgICAgICAgYnVmZmVyTmV3ID0gWyIiLmNvbmNhdChuZXdSZWYubnVtLCAiICIpLmNvbmNhdChuZXdSZWYuZ2VuLCAiIG9ialxuIildOworICAgICAgICAgICAgICAgICgwLCBfd3JpdGVyLndyaXRlRGljdCkoYXBwZWFyYW5jZURpY3QsIGJ1ZmZlck5ldywgbmV3VHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICBidWZmZXJOZXcucHVzaCgiIHN0cmVhbVxuIik7CisgICAgICAgICAgICAgICAgYnVmZmVyTmV3LnB1c2goYXBwZWFyYW5jZSk7CisgICAgICAgICAgICAgICAgYnVmZmVyTmV3LnB1c2goIlxuZW5kc3RyZWFtXG5lbmRvYmpcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCBbeworICAgICAgICAgICAgICAgICAgcmVmOiB0aGlzLnJlZiwKKyAgICAgICAgICAgICAgICAgIGRhdGE6IGJ1ZmZlck9yaWdpbmFsLmpvaW4oIiIpCisgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgcmVmOiBuZXdSZWYsCisgICAgICAgICAgICAgICAgICBkYXRhOiBidWZmZXJOZXcuam9pbigiIikKKyAgICAgICAgICAgICAgICB9XSk7CisKKyAgICAgICAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gc2F2ZShfeDQsIF94NSwgX3g2KSB7CisgICAgICAgIHJldHVybiBfc2F2ZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHNhdmU7CisgICAgfSgpCisgIH0sIHsKKyAgICBrZXk6ICJfZ2V0QXBwZWFyYW5jZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfZ2V0QXBwZWFyYW5jZTIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgICAgICB2YXIgaXNQYXNzd29yZCwgdmFsdWUsIGRlZmF1bHRQYWRkaW5nLCBoUGFkZGluZywgdG90YWxIZWlnaHQsIHRvdGFsV2lkdGgsIGZvbnRJbmZvLCBfZm9udEluZm8sIGZvbnQsIGZvbnROYW1lLCBmb250U2l6ZSwgZGVzY2VudCwgdlBhZGRpbmcsIGRlZmF1bHRBcHBlYXJhbmNlLCBhbGlnbm1lbnQsIHJlbmRlcmVkVGV4dDsKKworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaXNQYXNzd29yZCA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpOworCisgICAgICAgICAgICAgICAgaWYgKCEoIWFubm90YXRpb25TdG9yYWdlIHx8IGlzUGFzc3dvcmQpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgbnVsbCk7CisKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXTsKKworICAgICAgICAgICAgICAgIGlmICghKHZhbHVlID09PSAiIikpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCAiIik7CisKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIGRlZmF1bHRQYWRkaW5nID0gMjsKKyAgICAgICAgICAgICAgICBoUGFkZGluZyA9IGRlZmF1bHRQYWRkaW5nOworICAgICAgICAgICAgICAgIHRvdGFsSGVpZ2h0ID0gdGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXTsKKyAgICAgICAgICAgICAgICB0b3RhbFdpZHRoID0gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTsKKyAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDEyOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2spOworCisgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgZm9udEluZm8gPSBfY29udGV4dDMuc2VudDsKKyAgICAgICAgICAgICAgICBfZm9udEluZm8gPSBfc2xpY2VkVG9BcnJheShmb250SW5mbywgMiksIGZvbnQgPSBfZm9udEluZm9bMF0sIGZvbnROYW1lID0gX2ZvbnRJbmZvWzFdOworICAgICAgICAgICAgICAgIGZvbnRTaXplID0gZm9udEluZm9bMl07CisgICAgICAgICAgICAgICAgZm9udFNpemUgPSB0aGlzLl9jb21wdXRlRm9udFNpemUoZm9udCwgZm9udE5hbWUsIGZvbnRTaXplLCB0b3RhbEhlaWdodCk7CisgICAgICAgICAgICAgICAgZGVzY2VudCA9IGZvbnQuZGVzY2VudDsKKworICAgICAgICAgICAgICAgIGlmIChpc05hTihkZXNjZW50KSkgeworICAgICAgICAgICAgICAgICAgZGVzY2VudCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdlBhZGRpbmcgPSBkZWZhdWx0UGFkZGluZyArIE1hdGguYWJzKGRlc2NlbnQpICogZm9udFNpemU7CisgICAgICAgICAgICAgICAgZGVmYXVsdEFwcGVhcmFuY2UgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2U7CisgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gdGhpcy5kYXRhLnRleHRBbGlnbm1lbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5jb21iKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDIzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCB2YWx1ZSwgdG90YWxXaWR0aCwgaFBhZGRpbmcsIHZQYWRkaW5nKSk7CisKKyAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgdGhpcy5fZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSwgdmFsdWUsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoLCB0b3RhbEhlaWdodCwgYWxpZ25tZW50LCBoUGFkZGluZywgdlBhZGRpbmcpKTsKKworICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgIGlmICghKGFsaWdubWVudCA9PT0gMCB8fCBhbGlnbm1lbnQgPiAyKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCAiL1R4IEJNQyBxIEJUICIgKyBkZWZhdWx0QXBwZWFyYW5jZSArICIgMSAwIDAgMSAiLmNvbmNhdChoUGFkZGluZywgIiAiKS5jb25jYXQodlBhZGRpbmcsICIgVG0gKCIpLmNvbmNhdCgoMCwgX3V0aWwuZXNjYXBlU3RyaW5nKSh2YWx1ZSksICIpIFRqIikgKyAiIEVUIFEgRU1DIik7CisKKyAgICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICByZW5kZXJlZFRleHQgPSB0aGlzLl9yZW5kZXJUZXh0KHZhbHVlLCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCwgYWxpZ25tZW50LCBoUGFkZGluZywgdlBhZGRpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCAiL1R4IEJNQyBxIEJUICIgKyBkZWZhdWx0QXBwZWFyYW5jZSArICIgMSAwIDAgMSAwIDAgVG0gIi5jb25jYXQocmVuZGVyZWRUZXh0KSArICIgRVQgUSBFTUMiKTsKKworICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTMsIHRoaXMpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBfZ2V0QXBwZWFyYW5jZShfeDcsIF94OCwgX3g5KSB7CisgICAgICAgIHJldHVybiBfZ2V0QXBwZWFyYW5jZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIF9nZXRBcHBlYXJhbmNlOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiX2dldEZvbnREYXRhIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9nZXRGb250RGF0YTIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoZXZhbHVhdG9yLCB0YXNrKSB7CisgICAgICAgIHZhciBvcGVyYXRvckxpc3QsIGluaXRpYWxTdGF0ZTsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKKyAgICAgICAgICAgICAgICBpbml0aWFsU3RhdGUgPSB7CisgICAgICAgICAgICAgICAgICBmb250U2l6ZTogMCwKKyAgICAgICAgICAgICAgICAgIGZvbnQ6IG51bGwsCisgICAgICAgICAgICAgICAgICBmb250TmFtZTogbnVsbCwKKyAgICAgICAgICAgICAgICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5nZXRPcGVyYXRvckxpc3QoeworICAgICAgICAgICAgICAgICAgc3RyZWFtOiBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0odGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlKSwKKyAgICAgICAgICAgICAgICAgIHRhc2s6IHRhc2ssCisgICAgICAgICAgICAgICAgICByZXNvdXJjZXM6IHRoaXMuZmllbGRSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wZXJhdG9yTGlzdCwKKyAgICAgICAgICAgICAgICAgIGluaXRpYWxTdGF0ZTogaW5pdGlhbFN0YXRlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuYWJydXB0KCJyZXR1cm4iLCBbaW5pdGlhbFN0YXRlLmZvbnQsIGluaXRpYWxTdGF0ZS5mb250TmFtZSwgaW5pdGlhbFN0YXRlLmZvbnRTaXplXSk7CisKKyAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTQsIHRoaXMpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBfZ2V0Rm9udERhdGEoX3gxMCwgX3gxMSkgeworICAgICAgICByZXR1cm4gX2dldEZvbnREYXRhMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gX2dldEZvbnREYXRhOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiX2NvbXB1dGVGb250U2l6ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9jb21wdXRlRm9udFNpemUoZm9udCwgZm9udE5hbWUsIGZvbnRTaXplLCBoZWlnaHQpIHsKKyAgICAgIGlmIChmb250U2l6ZSA9PT0gbnVsbCB8fCBmb250U2l6ZSA9PT0gMCkgeworICAgICAgICB2YXIgZW0gPSBmb250LmNoYXJzVG9HbHlwaHMoIk0iLCB0cnVlKVswXS53aWR0aCAvIDEwMDA7CisgICAgICAgIHZhciBjYXBIZWlnaHQgPSAwLjcgKiBlbTsKKyAgICAgICAgZm9udFNpemUgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGhlaWdodCAvICgxLjUgKiBjYXBIZWlnaHQpKSk7CisgICAgICAgIHZhciBmb250UmVnZXggPSBuZXcgUmVnRXhwKCIvIi5jb25jYXQoZm9udE5hbWUsICJcXHMrWzAtOS5dK1xccytUZiIpKTsKKworICAgICAgICBpZiAodGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlLnNlYXJjaChmb250UmVnZXgpID09PSAtMSkgeworICAgICAgICAgIGZvbnRSZWdleCA9IG5ldyBSZWdFeHAoIi8iLmNvbmNhdChmb250TmFtZSwgIlxccytUZiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZS5yZXBsYWNlKGZvbnRSZWdleCwgIi8iLmNvbmNhdChmb250TmFtZSwgIiAiKS5jb25jYXQoZm9udFNpemUsICIgVGYiKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmb250U2l6ZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcmVuZGVyVGV4dCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9yZW5kZXJUZXh0KHRleHQsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoLCBhbGlnbm1lbnQsIGhQYWRkaW5nLCB2UGFkZGluZykgeworICAgICAgdmFyIGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyh0ZXh0KTsKKyAgICAgIHZhciBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKKyAgICAgIHZhciB3aWR0aCA9IDA7CisKKyAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZ2x5cGhzKSwKKyAgICAgICAgICBfc3RlcDI7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgdmFyIGdseXBoID0gX3N0ZXAyLnZhbHVlOworICAgICAgICAgIHdpZHRoICs9IGdseXBoLndpZHRoICogc2NhbGU7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjIuZigpOworICAgICAgfQorCisgICAgICB2YXIgc2hpZnQ7CisKKyAgICAgIGlmIChhbGlnbm1lbnQgPT09IDEpIHsKKyAgICAgICAgc2hpZnQgPSAodG90YWxXaWR0aCAtIHdpZHRoKSAvIDI7CisgICAgICB9IGVsc2UgaWYgKGFsaWdubWVudCA9PT0gMikgeworICAgICAgICBzaGlmdCA9IHRvdGFsV2lkdGggLSB3aWR0aCAtIGhQYWRkaW5nOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2hpZnQgPSBoUGFkZGluZzsKKyAgICAgIH0KKworICAgICAgc2hpZnQgPSBzaGlmdC50b0ZpeGVkKDIpOworICAgICAgdlBhZGRpbmcgPSB2UGFkZGluZy50b0ZpeGVkKDIpOworICAgICAgcmV0dXJuICIiLmNvbmNhdChzaGlmdCwgIiAiKS5jb25jYXQodlBhZGRpbmcsICIgVGQgKCIpLmNvbmNhdCgoMCwgX3V0aWwuZXNjYXBlU3RyaW5nKSh0ZXh0KSwgIikgVGoiKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gV2lkZ2V0QW5ub3RhdGlvbjsKK30oQW5ub3RhdGlvbik7CisKK3ZhciBUZXh0V2lkZ2V0QW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1dpZGdldEFubm90YXRpb24pIHsKKyAgX2luaGVyaXRzKFRleHRXaWRnZXRBbm5vdGF0aW9uLCBfV2lkZ2V0QW5ub3RhdGlvbik7CisKKyAgdmFyIF9zdXBlcjMgPSBfY3JlYXRlU3VwZXIoVGV4dFdpZGdldEFubm90YXRpb24pOworCisgIGZ1bmN0aW9uIFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtcykgeworICAgIHZhciBfdGhpczU7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFdpZGdldEFubm90YXRpb24pOworCisgICAgX3RoaXM1ID0gX3N1cGVyMy5jYWxsKHRoaXMsIHBhcmFtcyk7CisgICAgX3RoaXM1Ll9oYXNUZXh0ID0gdHJ1ZTsKKyAgICB2YXIgZGljdCA9IHBhcmFtcy5kaWN0OworCisgICAgaWYgKCEoMCwgX3V0aWwuaXNTdHJpbmcpKF90aGlzNS5kYXRhLmZpZWxkVmFsdWUpKSB7CisgICAgICBfdGhpczUuZGF0YS5maWVsZFZhbHVlID0gIiI7CisgICAgfQorCisgICAgdmFyIGFsaWdubWVudCA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0OiBkaWN0LAorICAgICAga2V5OiAiUSIKKyAgICB9KTsKKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhbGlnbm1lbnQpIHx8IGFsaWdubWVudCA8IDAgfHwgYWxpZ25tZW50ID4gMikgeworICAgICAgYWxpZ25tZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICBfdGhpczUuZGF0YS50ZXh0QWxpZ25tZW50ID0gYWxpZ25tZW50OworICAgIHZhciBtYXhpbXVtTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3Q6IGRpY3QsCisgICAgICBrZXk6ICJNYXhMZW4iCisgICAgfSk7CisKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4aW11bUxlbmd0aCkgfHwgbWF4aW11bUxlbmd0aCA8IDApIHsKKyAgICAgIG1heGltdW1MZW5ndGggPSBudWxsOworICAgIH0KKworICAgIF90aGlzNS5kYXRhLm1heExlbiA9IG1heGltdW1MZW5ndGg7CisgICAgX3RoaXM1LmRhdGEubXVsdGlMaW5lID0gX3RoaXM1Lmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7CisgICAgX3RoaXM1LmRhdGEuY29tYiA9IF90aGlzNS5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSAmJiAhX3RoaXM1Lmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSkgJiYgIV90aGlzNS5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCkgJiYgIV90aGlzNS5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSAmJiBfdGhpczUuZGF0YS5tYXhMZW4gIT09IG51bGw7CisgICAgcmV0dXJuIF90aGlzNTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhUZXh0V2lkZ2V0QW5ub3RhdGlvbiwgW3sKKyAgICBrZXk6ICJfZ2V0Q29tYkFwcGVhcmFuY2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0Q29tYkFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIHRleHQsIHdpZHRoLCBoUGFkZGluZywgdlBhZGRpbmcpIHsKKyAgICAgIHZhciBjb21iV2lkdGggPSAod2lkdGggLyB0aGlzLmRhdGEubWF4TGVuKS50b0ZpeGVkKDIpOworICAgICAgdmFyIGJ1ZiA9IFtdOworCisgICAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRleHQpLAorICAgICAgICAgIF9zdGVwMzsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgY2hhcmFjdGVyID0gX3N0ZXAzLnZhbHVlOworICAgICAgICAgIGJ1Zi5wdXNoKCIoIi5jb25jYXQoKDAsIF91dGlsLmVzY2FwZVN0cmluZykoY2hhcmFjdGVyKSwgIikgVGoiKSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjMuZigpOworICAgICAgfQorCisgICAgICB2YXIgcmVuZGVyZWRDb21iID0gYnVmLmpvaW4oIiAiLmNvbmNhdChjb21iV2lkdGgsICIgMCBUZCAiKSk7CisgICAgICByZXR1cm4gIi9UeCBCTUMgcSBCVCAiICsgZGVmYXVsdEFwcGVhcmFuY2UgKyAiIDEgMCAwIDEgIi5jb25jYXQoaFBhZGRpbmcsICIgIikuY29uY2F0KHZQYWRkaW5nLCAiIFRtICIpLmNvbmNhdChyZW5kZXJlZENvbWIpICsgIiBFVCBRIEVNQyI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2dldE11bHRpbGluZUFwcGVhcmFuY2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSwgdGV4dCwgZm9udCwgZm9udFNpemUsIHdpZHRoLCBoZWlnaHQsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nKSB7CisgICAgICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KC9cclxufFxyfFxuLyk7CisgICAgICB2YXIgYnVmID0gW107CisgICAgICB2YXIgdG90YWxXaWR0aCA9IHdpZHRoIC0gMiAqIGhQYWRkaW5nOworCisgICAgICB2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGxpbmVzKSwKKyAgICAgICAgICBfc3RlcDQ7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoX2l0ZXJhdG9yNC5zKCk7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgdmFyIGxpbmUgPSBfc3RlcDQudmFsdWU7CisKKyAgICAgICAgICB2YXIgY2h1bmtzID0gdGhpcy5fc3BsaXRMaW5lKGxpbmUsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoKTsKKworICAgICAgICAgIHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY2h1bmtzKSwKKyAgICAgICAgICAgICAgX3N0ZXA1OworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNS5zKCk7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICAgIHZhciBjaHVuayA9IF9zdGVwNS52YWx1ZTsKKyAgICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSBidWYubGVuZ3RoID09PSAwID8gaFBhZGRpbmcgOiAwOworICAgICAgICAgICAgICBidWYucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGNodW5rLCBmb250LCBmb250U2l6ZSwgd2lkdGgsIGFsaWdubWVudCwgcGFkZGluZywgLWZvbnRTaXplKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgICBfaXRlcmF0b3I1LmUoZXJyKTsKKyAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2l0ZXJhdG9yNS5mKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yNC5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3I0LmYoKTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlbmRlcmVkVGV4dCA9IGJ1Zi5qb2luKCJcbiIpOworICAgICAgcmV0dXJuICIvVHggQk1DIHEgQlQgIiArIGRlZmF1bHRBcHBlYXJhbmNlICsgIiAxIDAgMCAxIDAgIi5jb25jYXQoaGVpZ2h0LCAiIFRtICIpLmNvbmNhdChyZW5kZXJlZFRleHQpICsgIiBFVCBRIEVNQyI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3NwbGl0TGluZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoKSB7CisgICAgICBpZiAobGluZS5sZW5ndGggPD0gMSkgeworICAgICAgICByZXR1cm4gW2xpbmVdOworICAgICAgfQorCisgICAgICB2YXIgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7CisgICAgICB2YXIgd2hpdGVzcGFjZSA9IGZvbnQuY2hhcnNUb0dseXBocygiICIsIHRydWUpWzBdLndpZHRoICogc2NhbGU7CisgICAgICB2YXIgY2h1bmtzID0gW107CisgICAgICB2YXIgbGFzdFNwYWNlUG9zID0gLTEsCisgICAgICAgICAgc3RhcnRDaHVuayA9IDAsCisgICAgICAgICAgY3VycmVudFdpZHRoID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbGluZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHZhciBjaGFyYWN0ZXIgPSBsaW5lLmNoYXJBdChpKTsKKworICAgICAgICBpZiAoY2hhcmFjdGVyID09PSAiICIpIHsKKyAgICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgd2hpdGVzcGFjZSA+IHdpZHRoKSB7CisgICAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBpKSk7CisgICAgICAgICAgICBzdGFydENodW5rID0gaTsKKyAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IHdoaXRlc3BhY2U7CisgICAgICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VycmVudFdpZHRoICs9IHdoaXRlc3BhY2U7CisgICAgICAgICAgICBsYXN0U3BhY2VQb3MgPSBpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgY2hhcldpZHRoID0gZm9udC5jaGFyc1RvR2x5cGhzKGNoYXJhY3RlciwgZmFsc2UpWzBdLndpZHRoICogc2NhbGU7CisKKyAgICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgY2hhcldpZHRoID4gd2lkdGgpIHsKKyAgICAgICAgICAgIGlmIChsYXN0U3BhY2VQb3MgIT09IC0xKSB7CisgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q2h1bmssIGxhc3RTcGFjZVBvcyArIDEpKTsKKyAgICAgICAgICAgICAgc3RhcnRDaHVuayA9IGkgPSBsYXN0U3BhY2VQb3MgKyAxOworICAgICAgICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTsKKyAgICAgICAgICAgICAgY3VycmVudFdpZHRoID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q2h1bmssIGkpKTsKKyAgICAgICAgICAgICAgc3RhcnRDaHVuayA9IGk7CisgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IGNoYXJXaWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VycmVudFdpZHRoICs9IGNoYXJXaWR0aDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN0YXJ0Q2h1bmsgPCBsaW5lLmxlbmd0aCkgeworICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsaW5lLmxlbmd0aCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2h1bmtzOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBUZXh0V2lkZ2V0QW5ub3RhdGlvbjsKK30oV2lkZ2V0QW5ub3RhdGlvbik7CisKK3ZhciBCdXR0b25XaWRnZXRBbm5vdGF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfV2lkZ2V0QW5ub3RhdGlvbjIpIHsKKyAgX2luaGVyaXRzKEJ1dHRvbldpZGdldEFubm90YXRpb24sIF9XaWRnZXRBbm5vdGF0aW9uMik7CisKKyAgdmFyIF9zdXBlcjQgPSBfY3JlYXRlU3VwZXIoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbik7CisKKyAgZnVuY3Rpb24gQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbihwYXJhbXMpIHsKKyAgICB2YXIgX3RoaXM2OworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1dHRvbldpZGdldEFubm90YXRpb24pOworCisgICAgX3RoaXM2ID0gX3N1cGVyNC5jYWxsKHRoaXMsIHBhcmFtcyk7CisgICAgX3RoaXM2LmNoZWNrZWRBcHBlYXJhbmNlID0gbnVsbDsKKyAgICBfdGhpczYudW5jaGVja2VkQXBwZWFyYW5jZSA9IG51bGw7CisgICAgX3RoaXM2LmRhdGEuY2hlY2tCb3ggPSAhX3RoaXM2Lmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlJBRElPKSAmJiAhX3RoaXM2Lmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pOworICAgIF90aGlzNi5kYXRhLnJhZGlvQnV0dG9uID0gX3RoaXM2Lmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlJBRElPKSAmJiAhX3RoaXM2Lmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pOworICAgIF90aGlzNi5kYXRhLnB1c2hCdXR0b24gPSBfdGhpczYuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7CisKKyAgICBpZiAoX3RoaXM2LmRhdGEuY2hlY2tCb3gpIHsKKyAgICAgIF90aGlzNi5fcHJvY2Vzc0NoZWNrQm94KHBhcmFtcyk7CisgICAgfSBlbHNlIGlmIChfdGhpczYuZGF0YS5yYWRpb0J1dHRvbikgeworICAgICAgX3RoaXM2Ll9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKTsKKyAgICB9IGVsc2UgaWYgKF90aGlzNi5kYXRhLnB1c2hCdXR0b24pIHsKKyAgICAgIF90aGlzNi5fcHJvY2Vzc1B1c2hCdXR0b24ocGFyYW1zKTsKKyAgICB9IGVsc2UgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGZpZWxkIGZsYWdzIGZvciBidXR0b24gd2lkZ2V0IGFubm90YXRpb24iKTsKKyAgICB9CisKKyAgICByZXR1cm4gX3RoaXM2OworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEJ1dHRvbldpZGdldEFubm90YXRpb24sIFt7CisgICAga2V5OiAiZ2V0T3BlcmF0b3JMaXN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgICBpZiAodGhpcy5kYXRhLnB1c2hCdXR0b24pIHsKKyAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKEJ1dHRvbldpZGdldEFubm90YXRpb24ucHJvdG90eXBlKSwgImdldE9wZXJhdG9yTGlzdCIsIHRoaXMpLmNhbGwodGhpcywgZXZhbHVhdG9yLCB0YXNrLCBmYWxzZSwgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfQorCisgICAgICBpZiAoYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXSB8fCBmYWxzZTsKKyAgICAgICAgdmFyIGFwcGVhcmFuY2U7CisKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgYXBwZWFyYW5jZSA9IHRoaXMuY2hlY2tlZEFwcGVhcmFuY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXBwZWFyYW5jZSA9IHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcHBlYXJhbmNlKSB7CisgICAgICAgICAgdmFyIHNhdmVkQXBwZWFyYW5jZSA9IHRoaXMuYXBwZWFyYW5jZTsKKyAgICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlOworCisgICAgICAgICAgdmFyIG9wZXJhdG9yTGlzdCA9IF9nZXQoX2dldFByb3RvdHlwZU9mKEJ1dHRvbldpZGdldEFubm90YXRpb24ucHJvdG90eXBlKSwgImdldE9wZXJhdG9yTGlzdCIsIHRoaXMpLmNhbGwodGhpcywgZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpOworCisgICAgICAgICAgdGhpcy5hcHBlYXJhbmNlID0gc2F2ZWRBcHBlYXJhbmNlOworICAgICAgICAgIHJldHVybiBvcGVyYXRvckxpc3Q7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBfZ2V0KF9nZXRQcm90b3R5cGVPZihCdXR0b25XaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZSksICJnZXRPcGVyYXRvckxpc3QiLCB0aGlzKS5jYWxsKHRoaXMsIGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzYXZlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9zYXZlMyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlNShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5jaGVja0JveCkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoInJldHVybiIsIHRoaXMuX3NhdmVDaGVja2JveChldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSk7CisKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLnJhZGlvQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgicmV0dXJuIiwgdGhpcy5fc2F2ZVJhZGlvQnV0dG9uKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpKTsKKworICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoInJldHVybiIsIF9nZXQoX2dldFByb3RvdHlwZU9mKEJ1dHRvbldpZGdldEFubm90YXRpb24ucHJvdG90eXBlKSwgInNhdmUiLCB0aGlzKS5jYWxsKHRoaXMsIGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpKTsKKworICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgIGNhc2UgImVuZCI6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlNSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIHNhdmUoX3gxMiwgX3gxMywgX3gxNCkgeworICAgICAgICByZXR1cm4gX3NhdmUzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBzYXZlOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiX3NhdmVDaGVja2JveCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfc2F2ZUNoZWNrYm94MiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlNihldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgICAgIHZhciBkZWZhdWx0VmFsdWUsIHZhbHVlLCBkaWN0LCBuYW1lLCBlbmNyeXB0LCBvcmlnaW5hbFRyYW5zZm9ybSwgYnVmZmVyOworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgJiYgdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09ICJPZmYiOworICAgICAgICAgICAgICAgIHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXTsKKworICAgICAgICAgICAgICAgIGlmICghKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgicmV0dXJuIiwgbnVsbCk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGRpY3QgPSBldmFsdWF0b3IueHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTsKKworICAgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0KSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSA3OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoInJldHVybiIsIG51bGwpOworCisgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBuYW1lID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiAiT2ZmIik7CisgICAgICAgICAgICAgICAgZGljdC5zZXQoIlYiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBkaWN0LnNldCgiTSIsICJEOiIuY29uY2F0KCgwLCBfdXRpbC5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSk7CisgICAgICAgICAgICAgICAgZW5jcnlwdCA9IGV2YWx1YXRvci54cmVmLmVuY3J5cHQ7CisgICAgICAgICAgICAgICAgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHQpIHsKKyAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVHJhbnNmb3JtID0gZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLCB0aGlzLnJlZi5nZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFsiIi5jb25jYXQodGhpcy5yZWYubnVtLCAiICIpLmNvbmNhdCh0aGlzLnJlZi5nZW4sICIgb2JqXG4iKV07CisgICAgICAgICAgICAgICAgKDAsIF93cml0ZXIud3JpdGVEaWN0KShkaWN0LCBidWZmZXIsIG9yaWdpbmFsVHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucHVzaCgiXG5lbmRvYmpcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuYWJydXB0KCJyZXR1cm4iLCBbeworICAgICAgICAgICAgICAgICAgcmVmOiB0aGlzLnJlZiwKKyAgICAgICAgICAgICAgICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQorICAgICAgICAgICAgICAgIH1dKTsKKworICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTYsIHRoaXMpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBfc2F2ZUNoZWNrYm94KF94MTUsIF94MTYsIF94MTcpIHsKKyAgICAgICAgcmV0dXJuIF9zYXZlQ2hlY2tib3gyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBfc2F2ZUNoZWNrYm94OworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiX3NhdmVSYWRpb0J1dHRvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfc2F2ZVJhZGlvQnV0dG9uMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlNyhldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgICAgIHZhciBkZWZhdWx0VmFsdWUsIHZhbHVlLCBkaWN0LCBuYW1lLCBwYXJlbnRCdWZmZXIsIGVuY3J5cHQsIHBhcmVudCwgcGFyZW50VHJhbnNmb3JtLCBvcmlnaW5hbFRyYW5zZm9ybSwgYnVmZmVyLCBuZXdSZWZzOworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlNyQoX2NvbnRleHQ3KSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF07CisKKyAgICAgICAgICAgICAgICBpZiAoIShkZWZhdWx0VmFsdWUgPT09IHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5hYnJ1cHQoInJldHVybiIsIG51bGwpOworCisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CisKKyAgICAgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGljdCkpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuYWJydXB0KCJyZXR1cm4iLCBudWxsKTsKKworICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgbmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KHZhbHVlID8gdGhpcy5kYXRhLmJ1dHRvblZhbHVlIDogIk9mZiIpOworICAgICAgICAgICAgICAgIHBhcmVudEJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgZW5jcnlwdCA9IGV2YWx1YXRvci54cmVmLmVuY3J5cHQ7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKHRoaXMucGFyZW50KSkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBldmFsdWF0b3IueHJlZi5mZXRjaCh0aGlzLnBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudFRyYW5zZm9ybSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUcmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnBhcmVudC5udW0sIHRoaXMucGFyZW50Lmdlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwYXJlbnQuc2V0KCJWIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudEJ1ZmZlciA9IFsiIi5jb25jYXQodGhpcy5wYXJlbnQubnVtLCAiICIpLmNvbmNhdCh0aGlzLnBhcmVudC5nZW4sICIgb2JqXG4iKV07CisgICAgICAgICAgICAgICAgICAgICgwLCBfd3JpdGVyLndyaXRlRGljdCkocGFyZW50LCBwYXJlbnRCdWZmZXIsIHBhcmVudFRyYW5zZm9ybSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudEJ1ZmZlci5wdXNoKCJcbmVuZG9ialxuIik7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHRoaXMucGFyZW50KSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5zZXQoIlYiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBkaWN0LnNldCgiTSIsICJEOiIuY29uY2F0KCgwLCBfdXRpbC5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSk7CisgICAgICAgICAgICAgICAgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHQpIHsKKyAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVHJhbnNmb3JtID0gZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLCB0aGlzLnJlZi5nZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFsiIi5jb25jYXQodGhpcy5yZWYubnVtLCAiICIpLmNvbmNhdCh0aGlzLnJlZi5nZW4sICIgb2JqXG4iKV07CisgICAgICAgICAgICAgICAgKDAsIF93cml0ZXIud3JpdGVEaWN0KShkaWN0LCBidWZmZXIsIG9yaWdpbmFsVHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucHVzaCgiXG5lbmRvYmpcbiIpOworICAgICAgICAgICAgICAgIG5ld1JlZnMgPSBbeworICAgICAgICAgICAgICAgICAgcmVmOiB0aGlzLnJlZiwKKyAgICAgICAgICAgICAgICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQorICAgICAgICAgICAgICAgIH1dOworCisgICAgICAgICAgICAgICAgaWYgKHBhcmVudEJ1ZmZlciAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgbmV3UmVmcy5wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgcmVmOiB0aGlzLnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YTogcGFyZW50QnVmZmVyLmpvaW4oIiIpCisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdCgicmV0dXJuIiwgbmV3UmVmcyk7CisKKyAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWU3LCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gX3NhdmVSYWRpb0J1dHRvbihfeDE4LCBfeDE5LCBfeDIwKSB7CisgICAgICAgIHJldHVybiBfc2F2ZVJhZGlvQnV0dG9uMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gX3NhdmVSYWRpb0J1dHRvbjsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogIl9wcm9jZXNzQ2hlY2tCb3giLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc0NoZWNrQm94KHBhcmFtcykgeworICAgICAgdmFyIGN1c3RvbUFwcGVhcmFuY2UgPSBwYXJhbXMuZGljdC5nZXQoIkFQIik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY3VzdG9tQXBwZWFyYW5jZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgbm9ybWFsQXBwZWFyYW5jZSA9IGN1c3RvbUFwcGVhcmFuY2UuZ2V0KCJOIik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9ybWFsQXBwZWFyYW5jZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgZXhwb3J0VmFsdWVzID0gbm9ybWFsQXBwZWFyYW5jZS5nZXRLZXlzKCk7CisKKyAgICAgIGlmICghZXhwb3J0VmFsdWVzLmluY2x1ZGVzKCJPZmYiKSkgeworICAgICAgICBleHBvcnRWYWx1ZXMucHVzaCgiT2ZmIik7CisgICAgICB9CisKKyAgICAgIGlmIChleHBvcnRWYWx1ZXMubGVuZ3RoICE9PSAyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5kYXRhLmV4cG9ydFZhbHVlID0gZXhwb3J0VmFsdWVzWzBdID09PSAiT2ZmIiA/IGV4cG9ydFZhbHVlc1sxXSA6IGV4cG9ydFZhbHVlc1swXTsKKyAgICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuZXhwb3J0VmFsdWUpOworICAgICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQoIk9mZiIpIHx8IG51bGw7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3Byb2Nlc3NSYWRpb0J1dHRvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKSB7CisgICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuZGF0YS5idXR0b25WYWx1ZSA9IG51bGw7CisgICAgICB2YXIgZmllbGRQYXJlbnQgPSBwYXJhbXMuZGljdC5nZXQoIlBhcmVudCIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZmllbGRQYXJlbnQpICYmIGZpZWxkUGFyZW50LmhhcygiViIpKSB7CisgICAgICAgIHZhciBmaWVsZFBhcmVudFZhbHVlID0gZmllbGRQYXJlbnQuZ2V0KCJWIik7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpZWxkUGFyZW50VmFsdWUpKSB7CisgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMuZGljdC5nZXRSYXcoIlBhcmVudCIpOworICAgICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGZpZWxkUGFyZW50VmFsdWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBhcHBlYXJhbmNlU3RhdGVzID0gcGFyYW1zLmRpY3QuZ2V0KCJBUCIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGFwcGVhcmFuY2VTdGF0ZXMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIG5vcm1hbEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlU3RhdGVzLmdldCgiTiIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG5vcm1hbEFwcGVhcmFuY2UpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihub3JtYWxBcHBlYXJhbmNlLmdldEtleXMoKSksCisgICAgICAgICAgX3N0ZXA2OworCisgICAgICB0cnkgeworICAgICAgICBmb3IgKF9pdGVyYXRvcjYucygpOyAhKF9zdGVwNiA9IF9pdGVyYXRvcjYubigpKS5kb25lOykgeworICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDYudmFsdWU7CisKKyAgICAgICAgICBpZiAoa2V5ICE9PSAiT2ZmIikgeworICAgICAgICAgICAgdGhpcy5kYXRhLmJ1dHRvblZhbHVlID0ga2V5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yNi5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3I2LmYoKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KHRoaXMuZGF0YS5idXR0b25WYWx1ZSk7CisgICAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIikgfHwgbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcHJvY2Vzc1B1c2hCdXR0b24iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc1B1c2hCdXR0b24ocGFyYW1zKSB7CisgICAgICBpZiAoIXBhcmFtcy5kaWN0LmhhcygiQSIpKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIF9vYmouQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKKyAgICAgICAgZGVzdERpY3Q6IHBhcmFtcy5kaWN0LAorICAgICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSwKKyAgICAgICAgZG9jQmFzZVVybDogcGFyYW1zLnBkZk1hbmFnZXIuZG9jQmFzZVVybAorICAgICAgfSk7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEJ1dHRvbldpZGdldEFubm90YXRpb247Cit9KFdpZGdldEFubm90YXRpb24pOworCit2YXIgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1dpZGdldEFubm90YXRpb24zKSB7CisgIF9pbmhlcml0cyhDaG9pY2VXaWRnZXRBbm5vdGF0aW9uLCBfV2lkZ2V0QW5ub3RhdGlvbjMpOworCisgIHZhciBfc3VwZXI1ID0gX2NyZWF0ZVN1cGVyKENob2ljZVdpZGdldEFubm90YXRpb24pOworCisgIGZ1bmN0aW9uIENob2ljZVdpZGdldEFubm90YXRpb24ocGFyYW1zKSB7CisgICAgdmFyIF90aGlzNzsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uKTsKKworICAgIF90aGlzNyA9IF9zdXBlcjUuY2FsbCh0aGlzLCBwYXJhbXMpOworICAgIF90aGlzNy5kYXRhLm9wdGlvbnMgPSBbXTsKKyAgICB2YXIgb3B0aW9ucyA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0OiBwYXJhbXMuZGljdCwKKyAgICAgIGtleTogIk9wdCIKKyAgICB9KTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7CisgICAgICB2YXIgeHJlZiA9IHBhcmFtcy54cmVmOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBvcHRpb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIG9wdGlvbiA9IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25zW2ldKTsKKyAgICAgICAgdmFyIGlzT3B0aW9uQXJyYXkgPSBBcnJheS5pc0FycmF5KG9wdGlvbik7CisgICAgICAgIF90aGlzNy5kYXRhLm9wdGlvbnNbaV0gPSB7CisgICAgICAgICAgZXhwb3J0VmFsdWU6IF90aGlzNy5fZGVjb2RlRm9ybVZhbHVlKGlzT3B0aW9uQXJyYXkgPyB4cmVmLmZldGNoSWZSZWYob3B0aW9uWzBdKSA6IG9wdGlvbiksCisgICAgICAgICAgZGlzcGxheVZhbHVlOiBfdGhpczcuX2RlY29kZUZvcm1WYWx1ZShpc09wdGlvbkFycmF5ID8geHJlZi5mZXRjaElmUmVmKG9wdGlvblsxXSkgOiBvcHRpb24pCisgICAgICAgIH07CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykoX3RoaXM3LmRhdGEuZmllbGRWYWx1ZSkpIHsKKyAgICAgIF90aGlzNy5kYXRhLmZpZWxkVmFsdWUgPSBbX3RoaXM3LmRhdGEuZmllbGRWYWx1ZV07CisgICAgfSBlbHNlIGlmICghX3RoaXM3LmRhdGEuZmllbGRWYWx1ZSkgeworICAgICAgX3RoaXM3LmRhdGEuZmllbGRWYWx1ZSA9IFtdOworICAgIH0KKworICAgIF90aGlzNy5kYXRhLmNvbWJvID0gX3RoaXM3Lmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLkNPTUJPKTsKKyAgICBfdGhpczcuZGF0YS5tdWx0aVNlbGVjdCA9IF90aGlzNy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSVNFTEVDVCk7CisgICAgX3RoaXM3Ll9oYXNUZXh0ID0gdHJ1ZTsKKyAgICByZXR1cm4gX3RoaXM3OworICB9CisKKyAgcmV0dXJuIENob2ljZVdpZGdldEFubm90YXRpb247Cit9KFdpZGdldEFubm90YXRpb24pOworCit2YXIgVGV4dEFubm90YXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9NYXJrdXBBbm5vdGF0aW9uKSB7CisgIF9pbmhlcml0cyhUZXh0QW5ub3RhdGlvbiwgX01hcmt1cEFubm90YXRpb24pOworCisgIHZhciBfc3VwZXI2ID0gX2NyZWF0ZVN1cGVyKFRleHRBbm5vdGF0aW9uKTsKKworICBmdW5jdGlvbiBUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKSB7CisgICAgdmFyIF90aGlzODsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0QW5ub3RhdGlvbik7CisKKyAgICB2YXIgREVGQVVMVF9JQ09OX1NJWkUgPSAyMjsKKyAgICBfdGhpczggPSBfc3VwZXI2LmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgdmFyIGRpY3QgPSBwYXJhbWV0ZXJzLmRpY3Q7CisgICAgX3RoaXM4LmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5URVhUOworCisgICAgaWYgKF90aGlzOC5kYXRhLmhhc0FwcGVhcmFuY2UpIHsKKyAgICAgIF90aGlzOC5kYXRhLm5hbWUgPSAiTm9JY29uIjsKKyAgICB9IGVsc2UgeworICAgICAgX3RoaXM4LmRhdGEucmVjdFsxXSA9IF90aGlzOC5kYXRhLnJlY3RbM10gLSBERUZBVUxUX0lDT05fU0laRTsKKyAgICAgIF90aGlzOC5kYXRhLnJlY3RbMl0gPSBfdGhpczguZGF0YS5yZWN0WzBdICsgREVGQVVMVF9JQ09OX1NJWkU7CisgICAgICBfdGhpczguZGF0YS5uYW1lID0gZGljdC5oYXMoIk5hbWUiKSA/IGRpY3QuZ2V0KCJOYW1lIikubmFtZSA6ICJOb3RlIjsKKyAgICB9CisKKyAgICBpZiAoZGljdC5oYXMoIlN0YXRlIikpIHsKKyAgICAgIF90aGlzOC5kYXRhLnN0YXRlID0gZGljdC5nZXQoIlN0YXRlIikgfHwgbnVsbDsKKyAgICAgIF90aGlzOC5kYXRhLnN0YXRlTW9kZWwgPSBkaWN0LmdldCgiU3RhdGVNb2RlbCIpIHx8IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIF90aGlzOC5kYXRhLnN0YXRlID0gbnVsbDsKKyAgICAgIF90aGlzOC5kYXRhLnN0YXRlTW9kZWwgPSBudWxsOworICAgIH0KKworICAgIHJldHVybiBfdGhpczg7CisgIH0KKworICByZXR1cm4gVGV4dEFubm90YXRpb247Cit9KE1hcmt1cEFubm90YXRpb24pOworCit2YXIgTGlua0Fubm90YXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Bbm5vdGF0aW9uMykgeworICBfaW5oZXJpdHMoTGlua0Fubm90YXRpb24sIF9Bbm5vdGF0aW9uMyk7CisKKyAgdmFyIF9zdXBlcjcgPSBfY3JlYXRlU3VwZXIoTGlua0Fubm90YXRpb24pOworCisgIGZ1bmN0aW9uIExpbmtBbm5vdGF0aW9uKHBhcmFtcykgeworICAgIHZhciBfdGhpczk7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlua0Fubm90YXRpb24pOworCisgICAgX3RoaXM5ID0gX3N1cGVyNy5jYWxsKHRoaXMsIHBhcmFtcyk7CisgICAgX3RoaXM5LmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LOworICAgIHZhciBxdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhwYXJhbXMuZGljdCwgX3RoaXM5LnJlY3RhbmdsZSk7CisKKyAgICBpZiAocXVhZFBvaW50cykgeworICAgICAgX3RoaXM5LmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7CisgICAgfQorCisgICAgX29iai5DYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoeworICAgICAgZGVzdERpY3Q6IHBhcmFtcy5kaWN0LAorICAgICAgcmVzdWx0T2JqOiBfdGhpczkuZGF0YSwKKyAgICAgIGRvY0Jhc2VVcmw6IHBhcmFtcy5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwKKyAgICB9KTsKKworICAgIHJldHVybiBfdGhpczk7CisgIH0KKworICByZXR1cm4gTGlua0Fubm90YXRpb247Cit9KEFubm90YXRpb24pOworCit2YXIgUG9wdXBBbm5vdGF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5ub3RhdGlvbjQpIHsKKyAgX2luaGVyaXRzKFBvcHVwQW5ub3RhdGlvbiwgX0Fubm90YXRpb240KTsKKworICB2YXIgX3N1cGVyOCA9IF9jcmVhdGVTdXBlcihQb3B1cEFubm90YXRpb24pOworCisgIGZ1bmN0aW9uIFBvcHVwQW5ub3RhdGlvbihwYXJhbWV0ZXJzKSB7CisgICAgdmFyIF90aGlzMTA7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9wdXBBbm5vdGF0aW9uKTsKKworICAgIF90aGlzMTAgPSBfc3VwZXI4LmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgX3RoaXMxMC5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9QVVA7CisgICAgdmFyIHBhcmVudEl0ZW0gPSBwYXJhbWV0ZXJzLmRpY3QuZ2V0KCJQYXJlbnQiKTsKKworICAgIGlmICghcGFyZW50SXRlbSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJQb3B1cCBhbm5vdGF0aW9uIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBwYXJlbnQgYW5ub3RhdGlvbi4iKTsKKyAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpczEwKTsKKyAgICB9CisKKyAgICB2YXIgcGFyZW50U3VidHlwZSA9IHBhcmVudEl0ZW0uZ2V0KCJTdWJ0eXBlIik7CisgICAgX3RoaXMxMC5kYXRhLnBhcmVudFR5cGUgPSAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShwYXJlbnRTdWJ0eXBlKSA/IHBhcmVudFN1YnR5cGUubmFtZSA6IG51bGw7CisgICAgdmFyIHJhd1BhcmVudCA9IHBhcmFtZXRlcnMuZGljdC5nZXRSYXcoIlBhcmVudCIpOworICAgIF90aGlzMTAuZGF0YS5wYXJlbnRJZCA9ICgwLCBfcHJpbWl0aXZlcy5pc1JlZikocmF3UGFyZW50KSA/IHJhd1BhcmVudC50b1N0cmluZygpIDogbnVsbDsKKyAgICB2YXIgcnQgPSBwYXJlbnRJdGVtLmdldCgiUlQiKTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShydCwgX3V0aWwuQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkpIHsKKyAgICAgIHBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtLmdldCgiSVJUIik7CisgICAgfQorCisgICAgaWYgKCFwYXJlbnRJdGVtLmhhcygiTSIpKSB7CisgICAgICBfdGhpczEwLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIF90aGlzMTAuc2V0TW9kaWZpY2F0aW9uRGF0ZShwYXJlbnRJdGVtLmdldCgiTSIpKTsKKworICAgICAgX3RoaXMxMC5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSBfdGhpczEwLm1vZGlmaWNhdGlvbkRhdGU7CisgICAgfQorCisgICAgaWYgKCFwYXJlbnRJdGVtLmhhcygiQyIpKSB7CisgICAgICBfdGhpczEwLmRhdGEuY29sb3IgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICBfdGhpczEwLnNldENvbG9yKHBhcmVudEl0ZW0uZ2V0QXJyYXkoIkMiKSk7CisKKyAgICAgIF90aGlzMTAuZGF0YS5jb2xvciA9IF90aGlzMTAuY29sb3I7CisgICAgfQorCisgICAgaWYgKCFfdGhpczEwLnZpZXdhYmxlKSB7CisgICAgICB2YXIgcGFyZW50RmxhZ3MgPSBwYXJlbnRJdGVtLmdldCgiRiIpOworCisgICAgICBpZiAoX3RoaXMxMC5faXNWaWV3YWJsZShwYXJlbnRGbGFncykpIHsKKyAgICAgICAgX3RoaXMxMC5zZXRGbGFncyhwYXJlbnRGbGFncyk7CisgICAgICB9CisgICAgfQorCisgICAgX3RoaXMxMC5kYXRhLnRpdGxlID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShwYXJlbnRJdGVtLmdldCgiVCIpIHx8ICIiKTsKKyAgICBfdGhpczEwLmRhdGEuY29udGVudHMgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHBhcmVudEl0ZW0uZ2V0KCJDb250ZW50cyIpIHx8ICIiKTsKKyAgICByZXR1cm4gX3RoaXMxMDsKKyAgfQorCisgIHJldHVybiBQb3B1cEFubm90YXRpb247Cit9KEFubm90YXRpb24pOworCit2YXIgRnJlZVRleHRBbm5vdGF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTWFya3VwQW5ub3RhdGlvbjIpIHsKKyAgX2luaGVyaXRzKEZyZWVUZXh0QW5ub3RhdGlvbiwgX01hcmt1cEFubm90YXRpb24yKTsKKworICB2YXIgX3N1cGVyOSA9IF9jcmVhdGVTdXBlcihGcmVlVGV4dEFubm90YXRpb24pOworCisgIGZ1bmN0aW9uIEZyZWVUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKSB7CisgICAgdmFyIF90aGlzMTE7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRnJlZVRleHRBbm5vdGF0aW9uKTsKKworICAgIF90aGlzMTEgPSBfc3VwZXI5LmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgX3RoaXMxMS5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuRlJFRVRFWFQ7CisgICAgcmV0dXJuIF90aGlzMTE7CisgIH0KKworICByZXR1cm4gRnJlZVRleHRBbm5vdGF0aW9uOworfShNYXJrdXBBbm5vdGF0aW9uKTsKKwordmFyIExpbmVBbm5vdGF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTWFya3VwQW5ub3RhdGlvbjMpIHsKKyAgX2luaGVyaXRzKExpbmVBbm5vdGF0aW9uLCBfTWFya3VwQW5ub3RhdGlvbjMpOworCisgIHZhciBfc3VwZXIxMCA9IF9jcmVhdGVTdXBlcihMaW5lQW5ub3RhdGlvbik7CisKKyAgZnVuY3Rpb24gTGluZUFubm90YXRpb24ocGFyYW1ldGVycykgeworICAgIHZhciBfdGhpczEyOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpbmVBbm5vdGF0aW9uKTsKKworICAgIF90aGlzMTIgPSBfc3VwZXIxMC5jYWxsKHRoaXMsIHBhcmFtZXRlcnMpOworICAgIF90aGlzMTIuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLkxJTkU7CisgICAgX3RoaXMxMi5kYXRhLmxpbmVDb29yZGluYXRlcyA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChwYXJhbWV0ZXJzLmRpY3QuZ2V0QXJyYXkoIkwiKSk7CisgICAgcmV0dXJuIF90aGlzMTI7CisgIH0KKworICByZXR1cm4gTGluZUFubm90YXRpb247Cit9KE1hcmt1cEFubm90YXRpb24pOworCit2YXIgU3F1YXJlQW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX01hcmt1cEFubm90YXRpb240KSB7CisgIF9pbmhlcml0cyhTcXVhcmVBbm5vdGF0aW9uLCBfTWFya3VwQW5ub3RhdGlvbjQpOworCisgIHZhciBfc3VwZXIxMSA9IF9jcmVhdGVTdXBlcihTcXVhcmVBbm5vdGF0aW9uKTsKKworICBmdW5jdGlvbiBTcXVhcmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpIHsKKyAgICB2YXIgX3RoaXMxMzsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTcXVhcmVBbm5vdGF0aW9uKTsKKworICAgIF90aGlzMTMgPSBfc3VwZXIxMS5jYWxsKHRoaXMsIHBhcmFtZXRlcnMpOworICAgIF90aGlzMTMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlNRVUFSRTsKKyAgICByZXR1cm4gX3RoaXMxMzsKKyAgfQorCisgIHJldHVybiBTcXVhcmVBbm5vdGF0aW9uOworfShNYXJrdXBBbm5vdGF0aW9uKTsKKwordmFyIENpcmNsZUFubm90YXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9NYXJrdXBBbm5vdGF0aW9uNSkgeworICBfaW5oZXJpdHMoQ2lyY2xlQW5ub3RhdGlvbiwgX01hcmt1cEFubm90YXRpb241KTsKKworICB2YXIgX3N1cGVyMTIgPSBfY3JlYXRlU3VwZXIoQ2lyY2xlQW5ub3RhdGlvbik7CisKKyAgZnVuY3Rpb24gQ2lyY2xlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKSB7CisgICAgdmFyIF90aGlzMTQ7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2lyY2xlQW5ub3RhdGlvbik7CisKKyAgICBfdGhpczE0ID0gX3N1cGVyMTIuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzKTsKKyAgICBfdGhpczE0LmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5DSVJDTEU7CisgICAgcmV0dXJuIF90aGlzMTQ7CisgIH0KKworICByZXR1cm4gQ2lyY2xlQW5ub3RhdGlvbjsKK30oTWFya3VwQW5ub3RhdGlvbik7CisKK3ZhciBQb2x5bGluZUFubm90YXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9NYXJrdXBBbm5vdGF0aW9uNikgeworICBfaW5oZXJpdHMoUG9seWxpbmVBbm5vdGF0aW9uLCBfTWFya3VwQW5ub3RhdGlvbjYpOworCisgIHZhciBfc3VwZXIxMyA9IF9jcmVhdGVTdXBlcihQb2x5bGluZUFubm90YXRpb24pOworCisgIGZ1bmN0aW9uIFBvbHlsaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKSB7CisgICAgdmFyIF90aGlzMTU7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9seWxpbmVBbm5vdGF0aW9uKTsKKworICAgIF90aGlzMTUgPSBfc3VwZXIxMy5jYWxsKHRoaXMsIHBhcmFtZXRlcnMpOworICAgIF90aGlzMTUuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlBPTFlMSU5FOworICAgIHZhciByYXdWZXJ0aWNlcyA9IHBhcmFtZXRlcnMuZGljdC5nZXRBcnJheSgiVmVydGljZXMiKTsKKyAgICBfdGhpczE1LmRhdGEudmVydGljZXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHJhd1ZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgIF90aGlzMTUuZGF0YS52ZXJ0aWNlcy5wdXNoKHsKKyAgICAgICAgeDogcmF3VmVydGljZXNbaV0sCisgICAgICAgIHk6IHJhd1ZlcnRpY2VzW2kgKyAxXQorICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIF90aGlzMTU7CisgIH0KKworICByZXR1cm4gUG9seWxpbmVBbm5vdGF0aW9uOworfShNYXJrdXBBbm5vdGF0aW9uKTsKKwordmFyIFBvbHlnb25Bbm5vdGF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUG9seWxpbmVBbm5vdGF0aW9uKSB7CisgIF9pbmhlcml0cyhQb2x5Z29uQW5ub3RhdGlvbiwgX1BvbHlsaW5lQW5ub3RhdGlvbik7CisKKyAgdmFyIF9zdXBlcjE0ID0gX2NyZWF0ZVN1cGVyKFBvbHlnb25Bbm5vdGF0aW9uKTsKKworICBmdW5jdGlvbiBQb2x5Z29uQW5ub3RhdGlvbihwYXJhbWV0ZXJzKSB7CisgICAgdmFyIF90aGlzMTY7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9seWdvbkFubm90YXRpb24pOworCisgICAgX3RoaXMxNiA9IF9zdXBlcjE0LmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgX3RoaXMxNi5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9MWUdPTjsKKyAgICByZXR1cm4gX3RoaXMxNjsKKyAgfQorCisgIHJldHVybiBQb2x5Z29uQW5ub3RhdGlvbjsKK30oUG9seWxpbmVBbm5vdGF0aW9uKTsKKwordmFyIENhcmV0QW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX01hcmt1cEFubm90YXRpb243KSB7CisgIF9pbmhlcml0cyhDYXJldEFubm90YXRpb24sIF9NYXJrdXBBbm5vdGF0aW9uNyk7CisKKyAgdmFyIF9zdXBlcjE1ID0gX2NyZWF0ZVN1cGVyKENhcmV0QW5ub3RhdGlvbik7CisKKyAgZnVuY3Rpb24gQ2FyZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpIHsKKyAgICB2YXIgX3RoaXMxNzsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDYXJldEFubm90YXRpb24pOworCisgICAgX3RoaXMxNyA9IF9zdXBlcjE1LmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgX3RoaXMxNy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuQ0FSRVQ7CisgICAgcmV0dXJuIF90aGlzMTc7CisgIH0KKworICByZXR1cm4gQ2FyZXRBbm5vdGF0aW9uOworfShNYXJrdXBBbm5vdGF0aW9uKTsKKwordmFyIElua0Fubm90YXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9NYXJrdXBBbm5vdGF0aW9uOCkgeworICBfaW5oZXJpdHMoSW5rQW5ub3RhdGlvbiwgX01hcmt1cEFubm90YXRpb244KTsKKworICB2YXIgX3N1cGVyMTYgPSBfY3JlYXRlU3VwZXIoSW5rQW5ub3RhdGlvbik7CisKKyAgZnVuY3Rpb24gSW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKSB7CisgICAgdmFyIF90aGlzMTg7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5rQW5ub3RhdGlvbik7CisKKyAgICBfdGhpczE4ID0gX3N1cGVyMTYuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzKTsKKyAgICBfdGhpczE4LmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5JTks7CisgICAgdmFyIHhyZWYgPSBwYXJhbWV0ZXJzLnhyZWY7CisgICAgdmFyIG9yaWdpbmFsSW5rTGlzdHMgPSBwYXJhbWV0ZXJzLmRpY3QuZ2V0QXJyYXkoIklua0xpc3QiKTsKKyAgICBfdGhpczE4LmRhdGEuaW5rTGlzdHMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG9yaWdpbmFsSW5rTGlzdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgX3RoaXMxOC5kYXRhLmlua0xpc3RzLnB1c2goW10pOworCisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBvcmlnaW5hbElua0xpc3RzW2ldLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKKyAgICAgICAgX3RoaXMxOC5kYXRhLmlua0xpc3RzW2ldLnB1c2goeworICAgICAgICAgIHg6IHhyZWYuZmV0Y2hJZlJlZihvcmlnaW5hbElua0xpc3RzW2ldW2pdKSwKKyAgICAgICAgICB5OiB4cmVmLmZldGNoSWZSZWYob3JpZ2luYWxJbmtMaXN0c1tpXVtqICsgMV0pCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBfdGhpczE4OworICB9CisKKyAgcmV0dXJuIElua0Fubm90YXRpb247Cit9KE1hcmt1cEFubm90YXRpb24pOworCit2YXIgSGlnaGxpZ2h0QW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX01hcmt1cEFubm90YXRpb245KSB7CisgIF9pbmhlcml0cyhIaWdobGlnaHRBbm5vdGF0aW9uLCBfTWFya3VwQW5ub3RhdGlvbjkpOworCisgIHZhciBfc3VwZXIxNyA9IF9jcmVhdGVTdXBlcihIaWdobGlnaHRBbm5vdGF0aW9uKTsKKworICBmdW5jdGlvbiBIaWdobGlnaHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpIHsKKyAgICB2YXIgX3RoaXMxOTsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIaWdobGlnaHRBbm5vdGF0aW9uKTsKKworICAgIF90aGlzMTkgPSBfc3VwZXIxNy5jYWxsKHRoaXMsIHBhcmFtZXRlcnMpOworICAgIF90aGlzMTkuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVDsKKyAgICB2YXIgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1ldGVycy5kaWN0LCBfdGhpczE5LnJlY3RhbmdsZSk7CisKKyAgICBpZiAocXVhZFBvaW50cykgeworICAgICAgX3RoaXMxOS5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzOworICAgIH0KKworICAgIHJldHVybiBfdGhpczE5OworICB9CisKKyAgcmV0dXJuIEhpZ2hsaWdodEFubm90YXRpb247Cit9KE1hcmt1cEFubm90YXRpb24pOworCit2YXIgVW5kZXJsaW5lQW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX01hcmt1cEFubm90YXRpb24xMCkgeworICBfaW5oZXJpdHMoVW5kZXJsaW5lQW5ub3RhdGlvbiwgX01hcmt1cEFubm90YXRpb24xMCk7CisKKyAgdmFyIF9zdXBlcjE4ID0gX2NyZWF0ZVN1cGVyKFVuZGVybGluZUFubm90YXRpb24pOworCisgIGZ1bmN0aW9uIFVuZGVybGluZUFubm90YXRpb24ocGFyYW1ldGVycykgeworICAgIHZhciBfdGhpczIwOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVuZGVybGluZUFubm90YXRpb24pOworCisgICAgX3RoaXMyMCA9IF9zdXBlcjE4LmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgX3RoaXMyMC5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOworICAgIHZhciBxdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhwYXJhbWV0ZXJzLmRpY3QsIF90aGlzMjAucmVjdGFuZ2xlKTsKKworICAgIGlmIChxdWFkUG9pbnRzKSB7CisgICAgICBfdGhpczIwLmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7CisgICAgfQorCisgICAgcmV0dXJuIF90aGlzMjA7CisgIH0KKworICByZXR1cm4gVW5kZXJsaW5lQW5ub3RhdGlvbjsKK30oTWFya3VwQW5ub3RhdGlvbik7CisKK3ZhciBTcXVpZ2dseUFubm90YXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9NYXJrdXBBbm5vdGF0aW9uMTEpIHsKKyAgX2luaGVyaXRzKFNxdWlnZ2x5QW5ub3RhdGlvbiwgX01hcmt1cEFubm90YXRpb24xMSk7CisKKyAgdmFyIF9zdXBlcjE5ID0gX2NyZWF0ZVN1cGVyKFNxdWlnZ2x5QW5ub3RhdGlvbik7CisKKyAgZnVuY3Rpb24gU3F1aWdnbHlBbm5vdGF0aW9uKHBhcmFtZXRlcnMpIHsKKyAgICB2YXIgX3RoaXMyMTsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTcXVpZ2dseUFubm90YXRpb24pOworCisgICAgX3RoaXMyMSA9IF9zdXBlcjE5LmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgX3RoaXMyMS5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk7CisgICAgdmFyIHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKHBhcmFtZXRlcnMuZGljdCwgX3RoaXMyMS5yZWN0YW5nbGUpOworCisgICAgaWYgKHF1YWRQb2ludHMpIHsKKyAgICAgIF90aGlzMjEuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50czsKKyAgICB9CisKKyAgICByZXR1cm4gX3RoaXMyMTsKKyAgfQorCisgIHJldHVybiBTcXVpZ2dseUFubm90YXRpb247Cit9KE1hcmt1cEFubm90YXRpb24pOworCit2YXIgU3RyaWtlT3V0QW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX01hcmt1cEFubm90YXRpb24xMikgeworICBfaW5oZXJpdHMoU3RyaWtlT3V0QW5ub3RhdGlvbiwgX01hcmt1cEFubm90YXRpb24xMik7CisKKyAgdmFyIF9zdXBlcjIwID0gX2NyZWF0ZVN1cGVyKFN0cmlrZU91dEFubm90YXRpb24pOworCisgIGZ1bmN0aW9uIFN0cmlrZU91dEFubm90YXRpb24ocGFyYW1ldGVycykgeworICAgIHZhciBfdGhpczIyOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0cmlrZU91dEFubm90YXRpb24pOworCisgICAgX3RoaXMyMiA9IF9zdXBlcjIwLmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgX3RoaXMyMi5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOworICAgIHZhciBxdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhwYXJhbWV0ZXJzLmRpY3QsIF90aGlzMjIucmVjdGFuZ2xlKTsKKworICAgIGlmIChxdWFkUG9pbnRzKSB7CisgICAgICBfdGhpczIyLmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7CisgICAgfQorCisgICAgcmV0dXJuIF90aGlzMjI7CisgIH0KKworICByZXR1cm4gU3RyaWtlT3V0QW5ub3RhdGlvbjsKK30oTWFya3VwQW5ub3RhdGlvbik7CisKK3ZhciBTdGFtcEFubm90YXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9NYXJrdXBBbm5vdGF0aW9uMTMpIHsKKyAgX2luaGVyaXRzKFN0YW1wQW5ub3RhdGlvbiwgX01hcmt1cEFubm90YXRpb24xMyk7CisKKyAgdmFyIF9zdXBlcjIxID0gX2NyZWF0ZVN1cGVyKFN0YW1wQW5ub3RhdGlvbik7CisKKyAgZnVuY3Rpb24gU3RhbXBBbm5vdGF0aW9uKHBhcmFtZXRlcnMpIHsKKyAgICB2YXIgX3RoaXMyMzsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdGFtcEFubm90YXRpb24pOworCisgICAgX3RoaXMyMyA9IF9zdXBlcjIxLmNhbGwodGhpcywgcGFyYW1ldGVycyk7CisgICAgX3RoaXMyMy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RBTVA7CisgICAgcmV0dXJuIF90aGlzMjM7CisgIH0KKworICByZXR1cm4gU3RhbXBBbm5vdGF0aW9uOworfShNYXJrdXBBbm5vdGF0aW9uKTsKKwordmFyIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX01hcmt1cEFubm90YXRpb24xNCkgeworICBfaW5oZXJpdHMoRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uLCBfTWFya3VwQW5ub3RhdGlvbjE0KTsKKworICB2YXIgX3N1cGVyMjIgPSBfY3JlYXRlU3VwZXIoRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uKTsKKworICBmdW5jdGlvbiBGaWxlQXR0YWNobWVudEFubm90YXRpb24ocGFyYW1ldGVycykgeworICAgIHZhciBfdGhpczI0OworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbik7CisKKyAgICBfdGhpczI0ID0gX3N1cGVyMjIuY2FsbCh0aGlzLCBwYXJhbWV0ZXJzKTsKKyAgICB2YXIgZmlsZSA9IG5ldyBfb2JqLkZpbGVTcGVjKHBhcmFtZXRlcnMuZGljdC5nZXQoIkZTIiksIHBhcmFtZXRlcnMueHJlZik7CisgICAgX3RoaXMyNC5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ7CisgICAgX3RoaXMyNC5kYXRhLmZpbGUgPSBmaWxlLnNlcmlhbGl6YWJsZTsKKyAgICByZXR1cm4gX3RoaXMyNDsKKyAgfQorCisgIHJldHVybiBGaWxlQXR0YWNobWVudEFubm90YXRpb247Cit9KE1hcmt1cEFubm90YXRpb24pOworCisvKioqLyB9KSwKKy8qIDIyMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk9wZXJhdG9yTGlzdCA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKwordmFyIFF1ZXVlT3B0aW1pemVyID0gZnVuY3Rpb24gUXVldWVPcHRpbWl6ZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiBhZGRTdGF0ZShwYXJlbnRTdGF0ZSwgcGF0dGVybiwgY2hlY2tGbiwgaXRlcmF0ZUZuLCBwcm9jZXNzRm4pIHsKKyAgICB2YXIgc3RhdGUgPSBwYXJlbnRTdGF0ZTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhdHRlcm4ubGVuZ3RoIC0gMTsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBpdGVtID0gcGF0dGVybltpXTsKKyAgICAgIHN0YXRlID0gc3RhdGVbaXRlbV0gfHwgKHN0YXRlW2l0ZW1dID0gW10pOworICAgIH0KKworICAgIHN0YXRlW3BhdHRlcm5bcGF0dGVybi5sZW5ndGggLSAxXV0gPSB7CisgICAgICBjaGVja0ZuOiBjaGVja0ZuLAorICAgICAgaXRlcmF0ZUZuOiBpdGVyYXRlRm4sCisgICAgICBwcm9jZXNzRm46IHByb2Nlc3NGbgorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBoYW5kbGVQYWludFNvbGlkQ29sb3JJbWFnZU1hc2soaUZpcnN0U2F2ZSwgY291bnQsIGZuQXJyYXksIGFyZ3NBcnJheSkgeworICAgIHZhciBpRmlyc3RQSU1YTyA9IGlGaXJzdFNhdmUgKyAyOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICB2YXIgYXJnID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPICsgNCAqIGldOworICAgICAgdmFyIGltYWdlTWFzayA9IGFyZy5sZW5ndGggPT09IDEgJiYgYXJnWzBdOworCisgICAgICBpZiAoaW1hZ2VNYXNrICYmIGltYWdlTWFzay53aWR0aCA9PT0gMSAmJiBpbWFnZU1hc2suaGVpZ2h0ID09PSAxICYmICghaW1hZ2VNYXNrLmRhdGEubGVuZ3RoIHx8IGltYWdlTWFzay5kYXRhLmxlbmd0aCA9PT0gMSAmJiBpbWFnZU1hc2suZGF0YVswXSA9PT0gMCkpIHsKKyAgICAgICAgZm5BcnJheVtpRmlyc3RQSU1YTyArIDQgKiBpXSA9IF91dGlsLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2s7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQgLSBpOworICB9CisKKyAgdmFyIEluaXRpYWxTdGF0ZSA9IFtdOworICBhZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtfdXRpbC5PUFMuc2F2ZSwgX3V0aWwuT1BTLnRyYW5zZm9ybSwgX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0LCBfdXRpbC5PUFMucmVzdG9yZV0sIG51bGwsIGZ1bmN0aW9uIGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHsKKyAgICB2YXIgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheTsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOworICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKKworICAgIHN3aXRjaCAocG9zKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2F2ZTsKKworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnRyYW5zZm9ybTsKKworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OworCisgICAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMucmVzdG9yZTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KHBvcykpOworICB9LCBmdW5jdGlvbiBmb3VuZElubGluZUltYWdlR3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAxMDsKKyAgICB2YXIgTUFYX0lNQUdFU19JTl9JTkxJTkVfSU1BR0VTX0JMT0NLID0gMjAwOworICAgIHZhciBNQVhfV0lEVEggPSAxMDAwOworICAgIHZhciBJTUFHRV9QQURESU5HID0gMTsKKyAgICB2YXIgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKKyAgICAgICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CisgICAgdmFyIGN1cnIgPSBjb250ZXh0LmlDdXJyOworICAgIHZhciBpRmlyc3RTYXZlID0gY3VyciAtIDM7CisgICAgdmFyIGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOworICAgIHZhciBpRmlyc3RQSUlYTyA9IGN1cnIgLSAxOworICAgIHZhciBjb3VudCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgLSBpRmlyc3RTYXZlKSAvIDQpLCBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0spOworCisgICAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9JTkxJTkVfSU1BR0VTX0JMT0NLKSB7CisgICAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0U2F2ZSkgJSA0OworICAgIH0KKworICAgIHZhciBtYXhYID0gMDsKKyAgICB2YXIgbWFwID0gW10sCisgICAgICAgIG1heExpbmVIZWlnaHQgPSAwOworICAgIHZhciBjdXJyZW50WCA9IElNQUdFX1BBRERJTkcsCisgICAgICAgIGN1cnJlbnRZID0gSU1BR0VfUEFERElORzsKKyAgICB2YXIgcTsKKworICAgIGZvciAocSA9IDA7IHEgPCBjb3VudDsgcSsrKSB7CisgICAgICB2YXIgdHJhbnNmb3JtID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybSArIChxIDw8IDIpXTsKKyAgICAgIHZhciBpbWcgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF07CisKKyAgICAgIGlmIChjdXJyZW50WCArIGltZy53aWR0aCA+IE1BWF9XSURUSCkgeworICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpOworICAgICAgICBjdXJyZW50WSArPSBtYXhMaW5lSGVpZ2h0ICsgMiAqIElNQUdFX1BBRERJTkc7CisgICAgICAgIGN1cnJlbnRYID0gMDsKKyAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7CisgICAgICB9CisKKyAgICAgIG1hcC5wdXNoKHsKKyAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sCisgICAgICAgIHg6IGN1cnJlbnRYLAorICAgICAgICB5OiBjdXJyZW50WSwKKyAgICAgICAgdzogaW1nLndpZHRoLAorICAgICAgICBoOiBpbWcuaGVpZ2h0CisgICAgICB9KTsKKyAgICAgIGN1cnJlbnRYICs9IGltZy53aWR0aCArIDIgKiBJTUFHRV9QQURESU5HOworICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIGltZy5oZWlnaHQpOworICAgIH0KKworICAgIHZhciBpbWdXaWR0aCA9IE1hdGgubWF4KG1heFgsIGN1cnJlbnRYKSArIElNQUdFX1BBRERJTkc7CisgICAgdmFyIGltZ0hlaWdodCA9IGN1cnJlbnRZICsgbWF4TGluZUhlaWdodCArIElNQUdFX1BBRERJTkc7CisgICAgdmFyIGltZ0RhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoaW1nV2lkdGggKiBpbWdIZWlnaHQgKiA0KTsKKyAgICB2YXIgaW1nUm93U2l6ZSA9IGltZ1dpZHRoIDw8IDI7CisKKyAgICBmb3IgKHEgPSAwOyBxIDwgY291bnQ7IHErKykgeworICAgICAgdmFyIGRhdGEgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF0uZGF0YTsKKyAgICAgIHZhciByb3dTaXplID0gbWFwW3FdLncgPDwgMjsKKyAgICAgIHZhciBkYXRhT2Zmc2V0ID0gMDsKKyAgICAgIHZhciBvZmZzZXQgPSBtYXBbcV0ueCArIG1hcFtxXS55ICogaW1nV2lkdGggPDwgMjsKKyAgICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoMCwgcm93U2l6ZSksIG9mZnNldCAtIGltZ1Jvd1NpemUpOworCisgICAgICBmb3IgKHZhciBrID0gMCwga2sgPSBtYXBbcV0uaDsgayA8IGtrOyBrKyspIHsKKyAgICAgICAgaW1nRGF0YS5zZXQoZGF0YS5zdWJhcnJheShkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0ICsgcm93U2l6ZSksIG9mZnNldCk7CisgICAgICAgIGRhdGFPZmZzZXQgKz0gcm93U2l6ZTsKKyAgICAgICAgb2Zmc2V0ICs9IGltZ1Jvd1NpemU7CisgICAgICB9CisKKyAgICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoZGF0YU9mZnNldCAtIHJvd1NpemUsIGRhdGFPZmZzZXQpLCBvZmZzZXQpOworCisgICAgICB3aGlsZSAob2Zmc2V0ID49IDApIHsKKyAgICAgICAgZGF0YVtvZmZzZXQgLSA0XSA9IGRhdGFbb2Zmc2V0XTsKKyAgICAgICAgZGF0YVtvZmZzZXQgLSAzXSA9IGRhdGFbb2Zmc2V0ICsgMV07CisgICAgICAgIGRhdGFbb2Zmc2V0IC0gMl0gPSBkYXRhW29mZnNldCArIDJdOworICAgICAgICBkYXRhW29mZnNldCAtIDFdID0gZGF0YVtvZmZzZXQgKyAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDRdOworICAgICAgICBkYXRhW29mZnNldCArIHJvd1NpemUgKyAxXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDNdOworICAgICAgICBkYXRhW29mZnNldCArIHJvd1NpemUgKyAyXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDJdOworICAgICAgICBkYXRhW29mZnNldCArIHJvd1NpemUgKyAzXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDFdOworICAgICAgICBvZmZzZXQgLT0gaW1nUm93U2l6ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKTsKKyAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW3sKKyAgICAgIHdpZHRoOiBpbWdXaWR0aCwKKyAgICAgIGhlaWdodDogaW1nSGVpZ2h0LAorICAgICAga2luZDogX3V0aWwuSW1hZ2VLaW5kLlJHQkFfMzJCUFAsCisgICAgICBkYXRhOiBpbWdEYXRhCisgICAgfSwgbWFwXSk7CisgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOworICB9KTsKKyAgYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbX3V0aWwuT1BTLnNhdmUsIF91dGlsLk9QUy50cmFuc2Zvcm0sIF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsIF91dGlsLk9QUy5yZXN0b3JlXSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZUltYWdlTWFza0dyb3VwKGNvbnRleHQsIGkpIHsKKyAgICB2YXIgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheTsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOworICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKKworICAgIHN3aXRjaCAocG9zKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2F2ZTsKKworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnRyYW5zZm9ybTsKKworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDsKKworICAgICAgY2FzZSAzOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnJlc3RvcmU7CisgICAgfQorCisgICAgdGhyb3cgbmV3IEVycm9yKCJpdGVyYXRlSW1hZ2VNYXNrR3JvdXAgLSBpbnZhbGlkIHBvczogIi5jb25jYXQocG9zKSk7CisgIH0sIGZ1bmN0aW9uIGZvdW5kSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTA7CisgICAgdmFyIE1BWF9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDA7CisgICAgdmFyIE1BWF9TQU1FX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwMDA7CisgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OworICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOworICAgIHZhciBpRmlyc3RUcmFuc2Zvcm0gPSBjdXJyIC0gMjsKKyAgICB2YXIgaUZpcnN0UElNWE8gPSBjdXJyIC0gMTsKKyAgICB2YXIgY291bnQgPSBNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KTsKKyAgICBjb3VudCA9IGhhbmRsZVBhaW50U29saWRDb2xvckltYWdlTWFzayhpRmlyc3RTYXZlLCBjb3VudCwgZm5BcnJheSwgYXJnc0FycmF5KTsKKworICAgIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spIHsKKyAgICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CisgICAgfQorCisgICAgdmFyIHE7CisgICAgdmFyIGlzU2FtZUltYWdlID0gZmFsc2U7CisgICAgdmFyIGlUcmFuc2Zvcm0sIHRyYW5zZm9ybUFyZ3M7CisgICAgdmFyIGZpcnN0UElNWE9BcmcwID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPXVswXTsKKyAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF0sCisgICAgICAgIGZpcnN0VHJhbnNmb3JtQXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzFdLAorICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzIgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSwKKyAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CisKKyAgICBpZiAoZmlyc3RUcmFuc2Zvcm1BcmcxID09PSBmaXJzdFRyYW5zZm9ybUFyZzIpIHsKKyAgICAgIGlzU2FtZUltYWdlID0gdHJ1ZTsKKyAgICAgIGlUcmFuc2Zvcm0gPSBpRmlyc3RUcmFuc2Zvcm0gKyA0OworICAgICAgdmFyIGlQSU1YTyA9IGlGaXJzdFBJTVhPICsgNDsKKworICAgICAgZm9yIChxID0gMTsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCwgaVBJTVhPICs9IDQpIHsKKyAgICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKKworICAgICAgICBpZiAoYXJnc0FycmF5W2lQSU1YT11bMF0gIT09IGZpcnN0UElNWE9BcmcwIHx8IHRyYW5zZm9ybUFyZ3NbMF0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMCB8fCB0cmFuc2Zvcm1BcmdzWzFdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzEgfHwgdHJhbnNmb3JtQXJnc1syXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcyIHx8IHRyYW5zZm9ybUFyZ3NbM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnMykgeworICAgICAgICAgIGlmIChxIDwgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSykgeworICAgICAgICAgICAgaXNTYW1lSW1hZ2UgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY291bnQgPSBxOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzU2FtZUltYWdlKSB7CisgICAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOworICAgICAgdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTsKKyAgICAgIGlUcmFuc2Zvcm0gPSBpRmlyc3RUcmFuc2Zvcm07CisKKyAgICAgIGZvciAocSA9IDA7IHEgPCBjb3VudDsgcSsrLCBpVHJhbnNmb3JtICs9IDQpIHsKKyAgICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKKyAgICAgICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdOworICAgICAgICBwb3NpdGlvbnNbKHEgPDwgMSkgKyAxXSA9IHRyYW5zZm9ybUFyZ3NbNV07CisgICAgICB9CisKKyAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCk7CisgICAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ZpcnN0UElNWE9BcmcwLCBmaXJzdFRyYW5zZm9ybUFyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMSwgZmlyc3RUcmFuc2Zvcm1BcmcyLCBmaXJzdFRyYW5zZm9ybUFyZzMsIHBvc2l0aW9uc10pOworICAgIH0gZWxzZSB7CisgICAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTsKKyAgICAgIHZhciBpbWFnZXMgPSBbXTsKKworICAgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKKyAgICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm0gKyAocSA8PCAyKV07CisgICAgICAgIHZhciBtYXNrUGFyYW1zID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPICsgKHEgPDwgMildWzBdOworICAgICAgICBpbWFnZXMucHVzaCh7CisgICAgICAgICAgZGF0YTogbWFza1BhcmFtcy5kYXRhLAorICAgICAgICAgIHdpZHRoOiBtYXNrUGFyYW1zLndpZHRoLAorICAgICAgICAgIGhlaWdodDogbWFza1BhcmFtcy5oZWlnaHQsCisgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1BcmdzCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3RHcm91cCk7CisgICAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ltYWdlc10pOworICAgIH0KKworICAgIHJldHVybiBpRmlyc3RTYXZlICsgMTsKKyAgfSk7CisgIGFkZFN0YXRlKEluaXRpYWxTdGF0ZSwgW191dGlsLk9QUy5zYXZlLCBfdXRpbC5PUFMudHJhbnNmb3JtLCBfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QsIF91dGlsLk9QUy5yZXN0b3JlXSwgZnVuY3Rpb24gKGNvbnRleHQpIHsKKyAgICB2YXIgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CisgICAgdmFyIGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyOworICAgIHJldHVybiBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSA9PT0gMCAmJiBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSA9PT0gMDsKKyAgfSwgZnVuY3Rpb24gaXRlcmF0ZUltYWdlR3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOworICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKKworICAgIHN3aXRjaCAocG9zKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2F2ZTsKKworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLnRyYW5zZm9ybSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBpRmlyc3RUcmFuc2Zvcm0gPSBjb250ZXh0LmlDdXJyIC0gMjsKKyAgICAgICAgdmFyIGZpcnN0VHJhbnNmb3JtQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzBdOworICAgICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CisKKyAgICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcwIHx8IGFyZ3NBcnJheVtpXVsxXSAhPT0gMCB8fCBhcmdzQXJyYXlbaV1bMl0gIT09IDAgfHwgYXJnc0FycmF5W2ldWzNdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzMpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0KSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGlGaXJzdFBJWE8gPSBjb250ZXh0LmlDdXJyIC0gMTsKKyAgICAgICAgdmFyIGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07CisKKyAgICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RQSVhPQXJnMCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMucmVzdG9yZTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KHBvcykpOworICB9LCBmdW5jdGlvbiAoY29udGV4dCwgaSkgeworICAgIHZhciBNSU5fSU1BR0VTX0lOX0JMT0NLID0gMzsKKyAgICB2YXIgTUFYX0lNQUdFU19JTl9CTE9DSyA9IDEwMDA7CisgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OworICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOworICAgIHZhciBpRmlyc3RUcmFuc2Zvcm0gPSBjdXJyIC0gMjsKKyAgICB2YXIgaUZpcnN0UElYTyA9IGN1cnIgLSAxOworICAgIHZhciBmaXJzdFBJWE9BcmcwID0gYXJnc0FycmF5W2lGaXJzdFBJWE9dWzBdOworICAgIHZhciBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXTsKKyAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CisgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCksIE1BWF9JTUFHRVNfSU5fQkxPQ0spOworCisgICAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9CTE9DSykgeworICAgICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKKyAgICB9CisKKyAgICB2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOworICAgIHZhciBpVHJhbnNmb3JtID0gaUZpcnN0VHJhbnNmb3JtOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBjb3VudDsgcSsrLCBpVHJhbnNmb3JtICs9IDQpIHsKKyAgICAgIHZhciB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOworICAgICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdOworICAgICAgcG9zaXRpb25zWyhxIDw8IDEpICsgMV0gPSB0cmFuc2Zvcm1BcmdzWzVdOworICAgIH0KKworICAgIHZhciBhcmdzID0gW2ZpcnN0UElYT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmczLCBwb3NpdGlvbnNdOworICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KTsKKyAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgYXJncyk7CisgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOworICB9KTsKKyAgYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbX3V0aWwuT1BTLmJlZ2luVGV4dCwgX3V0aWwuT1BTLnNldEZvbnQsIF91dGlsLk9QUy5zZXRUZXh0TWF0cml4LCBfdXRpbC5PUFMuc2hvd1RleHQsIF91dGlsLk9QUy5lbmRUZXh0XSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZVNob3dUZXh0R3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSA0OworICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNTsKKworICAgIHN3aXRjaCAocG9zKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuYmVnaW5UZXh0OworCisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2V0Rm9udDsKKworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnNldFRleHRNYXRyaXg7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IF91dGlsLk9QUy5zaG93VGV4dCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBpRmlyc3RTZXRGb250ID0gY29udGV4dC5pQ3VyciAtIDM7CisgICAgICAgIHZhciBmaXJzdFNldEZvbnRBcmcwID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzBdOworICAgICAgICB2YXIgZmlyc3RTZXRGb250QXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVsxXTsKKworICAgICAgICBpZiAoYXJnc0FycmF5W2ldWzBdICE9PSBmaXJzdFNldEZvbnRBcmcwIHx8IGFyZ3NBcnJheVtpXVsxXSAhPT0gZmlyc3RTZXRGb250QXJnMSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBjYXNlIDQ6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuZW5kVGV4dDsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVTaG93VGV4dEdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KHBvcykpOworICB9LCBmdW5jdGlvbiAoY29udGV4dCwgaSkgeworICAgIHZhciBNSU5fQ0hBUlNfSU5fQkxPQ0sgPSAzOworICAgIHZhciBNQVhfQ0hBUlNfSU5fQkxPQ0sgPSAxMDAwOworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgY3VyciA9IGNvbnRleHQuaUN1cnI7CisgICAgdmFyIGlGaXJzdEJlZ2luVGV4dCA9IGN1cnIgLSA0OworICAgIHZhciBpRmlyc3RTZXRGb250ID0gY3VyciAtIDM7CisgICAgdmFyIGlGaXJzdFNldFRleHRNYXRyaXggPSBjdXJyIC0gMjsKKyAgICB2YXIgaUZpcnN0U2hvd1RleHQgPSBjdXJyIC0gMTsKKyAgICB2YXIgaUZpcnN0RW5kVGV4dCA9IGN1cnI7CisgICAgdmFyIGZpcnN0U2V0Rm9udEFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMF07CisgICAgdmFyIGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07CisgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdEJlZ2luVGV4dCkgLyA1KSwgTUFYX0NIQVJTX0lOX0JMT0NLKTsKKworICAgIGlmIChjb3VudCA8IE1JTl9DSEFSU19JTl9CTE9DSykgeworICAgICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdEJlZ2luVGV4dCkgJSA1OworICAgIH0KKworICAgIHZhciBpRmlyc3QgPSBpRmlyc3RCZWdpblRleHQ7CisKKyAgICBpZiAoaUZpcnN0QmVnaW5UZXh0ID49IDQgJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XSA9PT0gZm5BcnJheVtpRmlyc3RTZXRGb250XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDNdID09PSBmbkFycmF5W2lGaXJzdFNldFRleHRNYXRyaXhdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMl0gPT09IGZuQXJyYXlbaUZpcnN0U2hvd1RleHRdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMV0gPT09IGZuQXJyYXlbaUZpcnN0RW5kVGV4dF0gJiYgYXJnc0FycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdWzBdID09PSBmaXJzdFNldEZvbnRBcmcwICYmIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVsxXSA9PT0gZmlyc3RTZXRGb250QXJnMSkgeworICAgICAgY291bnQrKzsKKyAgICAgIGlGaXJzdCAtPSA1OworICAgIH0KKworICAgIHZhciBpRW5kVGV4dCA9IGlGaXJzdCArIDQ7CisKKyAgICBmb3IgKHZhciBxID0gMTsgcSA8IGNvdW50OyBxKyspIHsKKyAgICAgIGZuQXJyYXkuc3BsaWNlKGlFbmRUZXh0LCAzKTsKKyAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUVuZFRleHQsIDMpOworICAgICAgaUVuZFRleHQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gaUVuZFRleHQgKyAxOworICB9KTsKKworICBmdW5jdGlvbiBRdWV1ZU9wdGltaXplcihxdWV1ZSkgeworICAgIHRoaXMucXVldWUgPSBxdWV1ZTsKKyAgICB0aGlzLnN0YXRlID0gbnVsbDsKKyAgICB0aGlzLmNvbnRleHQgPSB7CisgICAgICBpQ3VycjogMCwKKyAgICAgIGZuQXJyYXk6IHF1ZXVlLmZuQXJyYXksCisgICAgICBhcmdzQXJyYXk6IHF1ZXVlLmFyZ3NBcnJheQorICAgIH07CisgICAgdGhpcy5tYXRjaCA9IG51bGw7CisgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gMDsKKyAgfQorCisgIFF1ZXVlT3B0aW1pemVyLnByb3RvdHlwZSA9IHsKKyAgICBfb3B0aW1pemU6IGZ1bmN0aW9uIF9vcHRpbWl6ZSgpIHsKKyAgICAgIHZhciBmbkFycmF5ID0gdGhpcy5xdWV1ZS5mbkFycmF5OworICAgICAgdmFyIGkgPSB0aGlzLmxhc3RQcm9jZXNzZWQsCisgICAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKKyAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc3RhdGU7CisgICAgICB2YXIgbWF0Y2ggPSB0aGlzLm1hdGNoOworCisgICAgICBpZiAoIXN0YXRlICYmICFtYXRjaCAmJiBpICsgMSA9PT0gaWkgJiYgIUluaXRpYWxTdGF0ZVtmbkFycmF5W2ldXSkgeworICAgICAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSBpaTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgY29udGV4dCA9IHRoaXMuY29udGV4dDsKKworICAgICAgd2hpbGUgKGkgPCBpaSkgeworICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICB2YXIgaXRlcmF0ZSA9ICgwLCBtYXRjaC5pdGVyYXRlRm4pKGNvbnRleHQsIGkpOworCisgICAgICAgICAgaWYgKGl0ZXJhdGUpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGkgPSAoMCwgbWF0Y2gucHJvY2Vzc0ZuKShjb250ZXh0LCBpICsgMSk7CisgICAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKKyAgICAgICAgICBtYXRjaCA9IG51bGw7CisgICAgICAgICAgc3RhdGUgPSBudWxsOworCisgICAgICAgICAgaWYgKGkgPj0gaWkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlID0gKHN0YXRlIHx8IEluaXRpYWxTdGF0ZSlbZm5BcnJheVtpXV07CisKKyAgICAgICAgaWYgKCFzdGF0ZSB8fCBBcnJheS5pc0FycmF5KHN0YXRlKSkgeworICAgICAgICAgIGkrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQuaUN1cnIgPSBpOworICAgICAgICBpKys7CisKKyAgICAgICAgaWYgKHN0YXRlLmNoZWNrRm4gJiYgISgwLCBzdGF0ZS5jaGVja0ZuKShjb250ZXh0KSkgeworICAgICAgICAgIHN0YXRlID0gbnVsbDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoID0gc3RhdGU7CisgICAgICAgIHN0YXRlID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoOworICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gaTsKKyAgICB9LAorICAgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZm4sIGFyZ3MpIHsKKyAgICAgIHRoaXMucXVldWUuZm5BcnJheS5wdXNoKGZuKTsKKyAgICAgIHRoaXMucXVldWUuYXJnc0FycmF5LnB1c2goYXJncyk7CisKKyAgICAgIHRoaXMuX29wdGltaXplKCk7CisgICAgfSwKKyAgICBmbHVzaDogZnVuY3Rpb24gZmx1c2goKSB7CisgICAgICB3aGlsZSAodGhpcy5tYXRjaCkgeworICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDsKKyAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gKDAsIHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsIGxlbmd0aCk7CisgICAgICAgIHRoaXMubWF0Y2ggPSBudWxsOworICAgICAgICB0aGlzLnN0YXRlID0gbnVsbDsKKworICAgICAgICB0aGlzLl9vcHRpbWl6ZSgpOworICAgICAgfQorICAgIH0sCisgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkgeworICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7CisgICAgICB0aGlzLm1hdGNoID0gbnVsbDsKKyAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7CisgICAgfQorICB9OworICByZXR1cm4gUXVldWVPcHRpbWl6ZXI7Cit9KCk7CisKK3ZhciBOdWxsT3B0aW1pemVyID0gZnVuY3Rpb24gTnVsbE9wdGltaXplckNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIE51bGxPcHRpbWl6ZXIocXVldWUpIHsKKyAgICB0aGlzLnF1ZXVlID0gcXVldWU7CisgIH0KKworICBOdWxsT3B0aW1pemVyLnByb3RvdHlwZSA9IHsKKyAgICBwdXNoOiBmdW5jdGlvbiBwdXNoKGZuLCBhcmdzKSB7CisgICAgICB0aGlzLnF1ZXVlLmZuQXJyYXkucHVzaChmbik7CisgICAgICB0aGlzLnF1ZXVlLmFyZ3NBcnJheS5wdXNoKGFyZ3MpOworICAgIH0sCisgICAgZmx1c2g6IGZ1bmN0aW9uIGZsdXNoKCkge30sCisgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge30KKyAgfTsKKyAgcmV0dXJuIE51bGxPcHRpbWl6ZXI7Cit9KCk7CisKK3ZhciBPcGVyYXRvckxpc3QgPSBmdW5jdGlvbiBPcGVyYXRvckxpc3RDbG9zdXJlKCkgeworICB2YXIgQ0hVTktfU0laRSA9IDEwMDA7CisgIHZhciBDSFVOS19TSVpFX0FCT1VUID0gQ0hVTktfU0laRSAtIDU7CisKKyAgZnVuY3Rpb24gT3BlcmF0b3JMaXN0KGludGVudCwgc3RyZWFtU2luaykgeworICAgIHRoaXMuX3N0cmVhbVNpbmsgPSBzdHJlYW1TaW5rOworICAgIHRoaXMuZm5BcnJheSA9IFtdOworICAgIHRoaXMuYXJnc0FycmF5ID0gW107CisKKyAgICBpZiAoc3RyZWFtU2luayAmJiBpbnRlbnQgIT09ICJvcGxpc3QiKSB7CisgICAgICB0aGlzLm9wdGltaXplciA9IG5ldyBRdWV1ZU9wdGltaXplcih0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5vcHRpbWl6ZXIgPSBuZXcgTnVsbE9wdGltaXplcih0aGlzKTsKKyAgICB9CisKKyAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBTZXQoKTsKKyAgICB0aGlzLl90b3RhbExlbmd0aCA9IDA7CisgICAgdGhpcy53ZWlnaHQgPSAwOworICAgIHRoaXMuX3Jlc29sdmVkID0gc3RyZWFtU2luayA/IG51bGwgOiBQcm9taXNlLnJlc29sdmUoKTsKKyAgfQorCisgIE9wZXJhdG9yTGlzdC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGxlbmd0aCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmFyZ3NBcnJheS5sZW5ndGg7CisgICAgfSwKKworICAgIGdldCByZWFkeSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZCB8fCB0aGlzLl9zdHJlYW1TaW5rLnJlYWR5OworICAgIH0sCisKKyAgICBnZXQgdG90YWxMZW5ndGgoKSB7CisgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGggKyB0aGlzLmxlbmd0aDsKKyAgICB9LAorCisgICAgYWRkT3A6IGZ1bmN0aW9uIGFkZE9wKGZuLCBhcmdzKSB7CisgICAgICB0aGlzLm9wdGltaXplci5wdXNoKGZuLCBhcmdzKTsKKyAgICAgIHRoaXMud2VpZ2h0Kys7CisKKyAgICAgIGlmICh0aGlzLl9zdHJlYW1TaW5rKSB7CisgICAgICAgIGlmICh0aGlzLndlaWdodCA+PSBDSFVOS19TSVpFKSB7CisgICAgICAgICAgdGhpcy5mbHVzaCgpOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2VpZ2h0ID49IENIVU5LX1NJWkVfQUJPVVQgJiYgKGZuID09PSBfdXRpbC5PUFMucmVzdG9yZSB8fCBmbiA9PT0gX3V0aWwuT1BTLmVuZFRleHQpKSB7CisgICAgICAgICAgdGhpcy5mbHVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBhZGREZXBlbmRlbmN5OiBmdW5jdGlvbiBhZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpIHsKKyAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CisgICAgICB0aGlzLmFkZE9wKF91dGlsLk9QUy5kZXBlbmRlbmN5LCBbZGVwZW5kZW5jeV0pOworICAgIH0sCisgICAgYWRkRGVwZW5kZW5jaWVzOiBmdW5jdGlvbiBhZGREZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKSB7CisgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGVwZW5kZW5jaWVzKSwKKyAgICAgICAgICBfc3RlcDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgZGVwZW5kZW5jeSA9IF9zdGVwLnZhbHVlOworICAgICAgICAgIHRoaXMuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvci5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3IuZigpOworICAgICAgfQorICAgIH0sCisgICAgYWRkT3BMaXN0OiBmdW5jdGlvbiBhZGRPcExpc3Qob3BMaXN0KSB7CisgICAgICBpZiAoIShvcExpc3QgaW5zdGFuY2VvZiBPcGVyYXRvckxpc3QpKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgnYWRkT3BMaXN0IC0gaWdub3JpbmcgaW52YWxpZCAib3BMaXN0IiBwYXJhbWV0ZXIuJyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvcExpc3QuZGVwZW5kZW5jaWVzKSwKKyAgICAgICAgICBfc3RlcDI7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgdmFyIGRlcGVuZGVuY3kgPSBfc3RlcDIudmFsdWU7CisgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3IyLmYoKTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gb3BMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdGhpcy5hZGRPcChvcExpc3QuZm5BcnJheVtpXSwgb3BMaXN0LmFyZ3NBcnJheVtpXSk7CisgICAgICB9CisgICAgfSwKKyAgICBnZXRJUjogZnVuY3Rpb24gZ2V0SVIoKSB7CisgICAgICByZXR1cm4geworICAgICAgICBmbkFycmF5OiB0aGlzLmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksCisgICAgICAgIGxlbmd0aDogdGhpcy5sZW5ndGgKKyAgICAgIH07CisgICAgfSwKKworICAgIGdldCBfdHJhbnNmZXJzKCkgeworICAgICAgdmFyIHRyYW5zZmVycyA9IFtdOworICAgICAgdmFyIGZuQXJyYXkgPSB0aGlzLmZuQXJyYXksCisgICAgICAgICAgYXJnc0FycmF5ID0gdGhpcy5hcmdzQXJyYXksCisgICAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChmbkFycmF5W2ldKSB7CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6CisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q6CisgICAgICAgICAgICB2YXIgYXJnID0gYXJnc0FycmF5W2ldWzBdOworICAgICAgICAgICAgOworCisgICAgICAgICAgICBpZiAoIWFyZy5jYWNoZWQpIHsKKyAgICAgICAgICAgICAgdHJhbnNmZXJzLnB1c2goYXJnLmRhdGEuYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRyYW5zZmVyczsKKyAgICB9LAorCisgICAgZmx1c2g6IGZ1bmN0aW9uIGZsdXNoKCkgeworICAgICAgdmFyIGxhc3RDaHVuayA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CisgICAgICB0aGlzLm9wdGltaXplci5mbHVzaCgpOworICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgdGhpcy5fdG90YWxMZW5ndGggKz0gbGVuZ3RoOworCisgICAgICB0aGlzLl9zdHJlYW1TaW5rLmVucXVldWUoeworICAgICAgICBmbkFycmF5OiB0aGlzLmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksCisgICAgICAgIGxhc3RDaHVuazogbGFzdENodW5rLAorICAgICAgICBsZW5ndGg6IGxlbmd0aAorICAgICAgfSwgMSwgdGhpcy5fdHJhbnNmZXJzKTsKKworICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuY2xlYXIoKTsKKyAgICAgIHRoaXMuZm5BcnJheS5sZW5ndGggPSAwOworICAgICAgdGhpcy5hcmdzQXJyYXkubGVuZ3RoID0gMDsKKyAgICAgIHRoaXMud2VpZ2h0ID0gMDsKKyAgICAgIHRoaXMub3B0aW1pemVyLnJlc2V0KCk7CisgICAgfQorICB9OworICByZXR1cm4gT3BlcmF0b3JMaXN0OworfSgpOworCitleHBvcnRzLk9wZXJhdG9yTGlzdCA9IE9wZXJhdG9yTGlzdDsKKworLyoqKi8gfSksCisvKiAyMjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy53cml0ZURpY3QgPSB3cml0ZURpY3Q7CitleHBvcnRzLmluY3JlbWVudGFsVXBkYXRlID0gaW5jcmVtZW50YWxVcGRhdGU7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjAyKTsKKwordmFyIF9jcnlwdG8gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxOSk7CisKK2Z1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9CisKK2Z1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0KKworZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pWyJyZXR1cm4iXSAhPSBudWxsKSBfaVsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9CisKK2Z1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfQorCitmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgdGhyb3cgX2UyOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMykgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTM7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFsicmV0dXJuIl0gIT0gbnVsbCkgaXRbInJldHVybiJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH0KKworZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KKworZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9CisKK2Z1bmN0aW9uIHdyaXRlRGljdChkaWN0LCBidWZmZXIsIHRyYW5zZm9ybSkgeworICBidWZmZXIucHVzaCgiPDwiKTsKKworICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGljdC5nZXRLZXlzKCkpLAorICAgICAgX3N0ZXA7CisKKyAgdHJ5IHsKKyAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgeworICAgICAgdmFyIGtleSA9IF9zdGVwLnZhbHVlOworICAgICAgYnVmZmVyLnB1c2goIiAvIi5jb25jYXQoa2V5LCAiICIpKTsKKyAgICAgIHdyaXRlVmFsdWUoZGljdC5nZXRSYXcoa2V5KSwgYnVmZmVyLCB0cmFuc2Zvcm0pOworICAgIH0KKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgX2l0ZXJhdG9yLmUoZXJyKTsKKyAgfSBmaW5hbGx5IHsKKyAgICBfaXRlcmF0b3IuZigpOworICB9CisKKyAgYnVmZmVyLnB1c2goIj4+Iik7Cit9CisKK2Z1bmN0aW9uIHdyaXRlU3RyZWFtKHN0cmVhbSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKKyAgd3JpdGVEaWN0KHN0cmVhbS5kaWN0LCBidWZmZXIsIHRyYW5zZm9ybSk7CisgIGJ1ZmZlci5wdXNoKCIgc3RyZWFtXG4iKTsKKyAgdmFyIHN0cmluZyA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShzdHJlYW0uZ2V0Qnl0ZXMoKSk7CisKKyAgaWYgKHRyYW5zZm9ybSAhPT0gbnVsbCkgeworICAgIHN0cmluZyA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHN0cmluZyk7CisgIH0KKworICBidWZmZXIucHVzaChzdHJpbmcpOworICBidWZmZXIucHVzaCgiXG5lbmRzdHJlYW1cbiIpOworfQorCitmdW5jdGlvbiB3cml0ZUFycmF5KGFycmF5LCBidWZmZXIsIHRyYW5zZm9ybSkgeworICBidWZmZXIucHVzaCgiWyIpOworICB2YXIgZmlyc3QgPSB0cnVlOworCisgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYXJyYXkpLAorICAgICAgX3N0ZXAyOworCisgIHRyeSB7CisgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHsKKyAgICAgIHZhciB2YWwgPSBfc3RlcDIudmFsdWU7CisKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgYnVmZmVyLnB1c2goIiAiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHdyaXRlVmFsdWUodmFsLCBidWZmZXIsIHRyYW5zZm9ybSk7CisgICAgfQorICB9IGNhdGNoIChlcnIpIHsKKyAgICBfaXRlcmF0b3IyLmUoZXJyKTsKKyAgfSBmaW5hbGx5IHsKKyAgICBfaXRlcmF0b3IyLmYoKTsKKyAgfQorCisgIGJ1ZmZlci5wdXNoKCJdIik7Cit9CisKK2Z1bmN0aW9uIG51bWJlclRvU3RyaW5nKHZhbHVlKSB7CisgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkgeworICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICB9CisKKyAgdmFyIHJvdW5kZWRWYWx1ZSA9IE1hdGgucm91bmQodmFsdWUgKiAxMDApOworCisgIGlmIChyb3VuZGVkVmFsdWUgJSAxMDAgPT09IDApIHsKKyAgICByZXR1cm4gKHJvdW5kZWRWYWx1ZSAvIDEwMCkudG9TdHJpbmcoKTsKKyAgfQorCisgIGlmIChyb3VuZGVkVmFsdWUgJSAxMCA9PT0gMCkgeworICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKDEpOworICB9CisKKyAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoMik7Cit9CisKK2Z1bmN0aW9uIHdyaXRlVmFsdWUodmFsdWUsIGJ1ZmZlciwgdHJhbnNmb3JtKSB7CisgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh2YWx1ZSkpIHsKKyAgICBidWZmZXIucHVzaCgiLyIuY29uY2F0KHZhbHVlLm5hbWUpKTsKKyAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKHZhbHVlKSkgeworICAgIGJ1ZmZlci5wdXNoKCIiLmNvbmNhdCh2YWx1ZS5udW0sICIgIikuY29uY2F0KHZhbHVlLmdlbiwgIiBSIikpOworICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CisgICAgd3JpdGVBcnJheSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pOworICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIpIHsKKyAgICBpZiAodHJhbnNmb3JtICE9PSBudWxsKSB7CisgICAgICB2YWx1ZSA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHZhbHVlKTsKKyAgICB9CisKKyAgICBidWZmZXIucHVzaCgiKCIuY29uY2F0KCgwLCBfdXRpbC5lc2NhcGVTdHJpbmcpKHZhbHVlKSwgIikiKSk7CisgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikgeworICAgIGJ1ZmZlci5wdXNoKG51bWJlclRvU3RyaW5nKHZhbHVlKSk7CisgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkodmFsdWUpKSB7CisgICAgd3JpdGVEaWN0KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CisgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh2YWx1ZSkpIHsKKyAgICB3cml0ZVN0cmVhbSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pOworICB9Cit9CisKK2Z1bmN0aW9uIHdyaXRlSW50KG51bWJlciwgc2l6ZSwgb2Zmc2V0LCBidWZmZXIpIHsKKyAgZm9yICh2YXIgaSA9IHNpemUgKyBvZmZzZXQgLSAxOyBpID4gb2Zmc2V0IC0gMTsgaS0tKSB7CisgICAgYnVmZmVyW2ldID0gbnVtYmVyICYgMHhmZjsKKyAgICBudW1iZXIgPj49IDg7CisgIH0KKworICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTsKK30KKworZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyaW5nLCBvZmZzZXQsIGJ1ZmZlcikgeworICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgYnVmZmVyW29mZnNldCArIGldID0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweGZmOworICB9Cit9CisKK2Z1bmN0aW9uIGNvbXB1dGVNRDUoZmlsZXNpemUsIHhyZWZJbmZvKSB7CisgIHZhciB0aW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7CisgIHZhciBmaWxlbmFtZSA9IHhyZWZJbmZvLmZpbGVuYW1lIHx8ICIiOworICB2YXIgbWQ1QnVmZmVyID0gW3RpbWUudG9TdHJpbmcoKSwgZmlsZW5hbWUsIGZpbGVzaXplLnRvU3RyaW5nKCldOworICB2YXIgbWQ1QnVmZmVyTGVuID0gbWQ1QnVmZmVyLnJlZHVjZShmdW5jdGlvbiAoYSwgc3RyKSB7CisgICAgcmV0dXJuIGEgKyBzdHIubGVuZ3RoOworICB9LCAwKTsKKworICBmb3IgKHZhciBfaSA9IDAsIF9PYmplY3QkdmFsdWVzID0gT2JqZWN0LnZhbHVlcyh4cmVmSW5mby5pbmZvKTsgX2kgPCBfT2JqZWN0JHZhbHVlcy5sZW5ndGg7IF9pKyspIHsKKyAgICB2YXIgdmFsdWUgPSBfT2JqZWN0JHZhbHVlc1tfaV07CisgICAgbWQ1QnVmZmVyLnB1c2godmFsdWUpOworICAgIG1kNUJ1ZmZlckxlbiArPSB2YWx1ZS5sZW5ndGg7CisgIH0KKworICB2YXIgYXJyYXkgPSBuZXcgVWludDhBcnJheShtZDVCdWZmZXJMZW4pOworICB2YXIgb2Zmc2V0ID0gMDsKKworICBmb3IgKHZhciBfaTIgPSAwLCBfbWQ1QnVmZmVyID0gbWQ1QnVmZmVyOyBfaTIgPCBfbWQ1QnVmZmVyLmxlbmd0aDsgX2kyKyspIHsKKyAgICB2YXIgc3RyID0gX21kNUJ1ZmZlcltfaTJdOworICAgIHdyaXRlU3RyaW5nKHN0ciwgb2Zmc2V0LCBhcnJheSk7CisgICAgb2Zmc2V0ICs9IHN0ci5sZW5ndGg7CisgIH0KKworICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKCgwLCBfY3J5cHRvLmNhbGN1bGF0ZU1ENSkoYXJyYXkpKTsKK30KKworZnVuY3Rpb24gaW5jcmVtZW50YWxVcGRhdGUob3JpZ2luYWxEYXRhLCB4cmVmSW5mbywgbmV3UmVmcykgeworICB2YXIgbmV3WHJlZiA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KG51bGwpOworICB2YXIgcmVmRm9yWHJlZlRhYmxlID0geHJlZkluZm8ubmV3UmVmOworICB2YXIgYnVmZmVyLCBiYXNlT2Zmc2V0OworICB2YXIgbGFzdEJ5dGUgPSBvcmlnaW5hbERhdGFbb3JpZ2luYWxEYXRhLmxlbmd0aCAtIDFdOworCisgIGlmIChsYXN0Qnl0ZSA9PT0gMHgwYSB8fCBsYXN0Qnl0ZSA9PT0gMHgwZCkgeworICAgIGJ1ZmZlciA9IFtdOworICAgIGJhc2VPZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoOworICB9IGVsc2UgeworICAgIGJ1ZmZlciA9IFsiXG4iXTsKKyAgICBiYXNlT2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aCArIDE7CisgIH0KKworICBuZXdYcmVmLnNldCgiU2l6ZSIsIHJlZkZvclhyZWZUYWJsZS5udW0gKyAxKTsKKyAgbmV3WHJlZi5zZXQoIlByZXYiLCB4cmVmSW5mby5zdGFydFhSZWYpOworICBuZXdYcmVmLnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJYUmVmIikpOworCisgIGlmICh4cmVmSW5mby5yb290UmVmICE9PSBudWxsKSB7CisgICAgbmV3WHJlZi5zZXQoIlJvb3QiLCB4cmVmSW5mby5yb290UmVmKTsKKyAgfQorCisgIGlmICh4cmVmSW5mby5pbmZvUmVmICE9PSBudWxsKSB7CisgICAgbmV3WHJlZi5zZXQoIkluZm8iLCB4cmVmSW5mby5pbmZvUmVmKTsKKyAgfQorCisgIGlmICh4cmVmSW5mby5lbmNyeXB0ICE9PSBudWxsKSB7CisgICAgbmV3WHJlZi5zZXQoIkVuY3J5cHQiLCB4cmVmSW5mby5lbmNyeXB0KTsKKyAgfQorCisgIG5ld1JlZnMucHVzaCh7CisgICAgcmVmOiByZWZGb3JYcmVmVGFibGUsCisgICAgZGF0YTogIiIKKyAgfSk7CisgIG5ld1JlZnMgPSBuZXdSZWZzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKKyAgICByZXR1cm4gYS5yZWYubnVtIC0gYi5yZWYubnVtOworICB9KTsKKyAgdmFyIHhyZWZUYWJsZURhdGEgPSBbWzAsIDEsIDB4ZmZmZl1dOworICB2YXIgaW5kZXhlcyA9IFswLCAxXTsKKyAgdmFyIG1heE9mZnNldCA9IDA7CisKKyAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihuZXdSZWZzKSwKKyAgICAgIF9zdGVwMzsKKworICB0cnkgeworICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7CisgICAgICB2YXIgX3N0ZXAzJHZhbHVlID0gX3N0ZXAzLnZhbHVlLAorICAgICAgICAgIHJlZiA9IF9zdGVwMyR2YWx1ZS5yZWYsCisgICAgICAgICAgZGF0YSA9IF9zdGVwMyR2YWx1ZS5kYXRhOworICAgICAgbWF4T2Zmc2V0ID0gTWF0aC5tYXgobWF4T2Zmc2V0LCBiYXNlT2Zmc2V0KTsKKyAgICAgIHhyZWZUYWJsZURhdGEucHVzaChbMSwgYmFzZU9mZnNldCwgTWF0aC5taW4ocmVmLmdlbiwgMHhmZmZmKV0pOworICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKKyAgICAgIGluZGV4ZXMucHVzaChyZWYubnVtKTsKKyAgICAgIGluZGV4ZXMucHVzaCgxKTsKKyAgICAgIGJ1ZmZlci5wdXNoKGRhdGEpOworICAgIH0KKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgX2l0ZXJhdG9yMy5lKGVycik7CisgIH0gZmluYWxseSB7CisgICAgX2l0ZXJhdG9yMy5mKCk7CisgIH0KKworICBuZXdYcmVmLnNldCgiSW5kZXgiLCBpbmRleGVzKTsKKworICBpZiAoeHJlZkluZm8uZmlsZUlkcy5sZW5ndGggIT09IDApIHsKKyAgICB2YXIgbWQ1ID0gY29tcHV0ZU1ENShiYXNlT2Zmc2V0LCB4cmVmSW5mbyk7CisgICAgbmV3WHJlZi5zZXQoIklEIiwgW3hyZWZJbmZvLmZpbGVJZHNbMF0sIG1kNV0pOworICB9CisKKyAgdmFyIG9mZnNldFNpemUgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKG1heE9mZnNldCkgLyA4KTsKKyAgdmFyIHNpemVzID0gWzEsIG9mZnNldFNpemUsIDJdOworICB2YXIgc3RydWN0U2l6ZSA9IHNpemVzWzBdICsgc2l6ZXNbMV0gKyBzaXplc1syXTsKKyAgdmFyIHRhYmxlTGVuZ3RoID0gc3RydWN0U2l6ZSAqIHhyZWZUYWJsZURhdGEubGVuZ3RoOworICBuZXdYcmVmLnNldCgiVyIsIHNpemVzKTsKKyAgbmV3WHJlZi5zZXQoIkxlbmd0aCIsIHRhYmxlTGVuZ3RoKTsKKyAgYnVmZmVyLnB1c2goIiIuY29uY2F0KHJlZkZvclhyZWZUYWJsZS5udW0sICIgIikuY29uY2F0KHJlZkZvclhyZWZUYWJsZS5nZW4sICIgb2JqXG4iKSk7CisgIHdyaXRlRGljdChuZXdYcmVmLCBidWZmZXIsIG51bGwpOworICBidWZmZXIucHVzaCgiIHN0cmVhbVxuIik7CisgIHZhciBidWZmZXJMZW4gPSBidWZmZXIucmVkdWNlKGZ1bmN0aW9uIChhLCBzdHIpIHsKKyAgICByZXR1cm4gYSArIHN0ci5sZW5ndGg7CisgIH0sIDApOworICB2YXIgZm9vdGVyID0gIlxuZW5kc3RyZWFtXG5lbmRvYmpcbnN0YXJ0eHJlZlxuIi5jb25jYXQoYmFzZU9mZnNldCwgIlxuJSVFT0ZcbiIpOworICB2YXIgYXJyYXkgPSBuZXcgVWludDhBcnJheShvcmlnaW5hbERhdGEubGVuZ3RoICsgYnVmZmVyTGVuICsgdGFibGVMZW5ndGggKyBmb290ZXIubGVuZ3RoKTsKKyAgYXJyYXkuc2V0KG9yaWdpbmFsRGF0YSk7CisgIHZhciBvZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoOworCisgIHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYnVmZmVyKSwKKyAgICAgIF9zdGVwNDsKKworICB0cnkgeworICAgIGZvciAoX2l0ZXJhdG9yNC5zKCk7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uKCkpLmRvbmU7KSB7CisgICAgICB2YXIgc3RyID0gX3N0ZXA0LnZhbHVlOworICAgICAgd3JpdGVTdHJpbmcoc3RyLCBvZmZzZXQsIGFycmF5KTsKKyAgICAgIG9mZnNldCArPSBzdHIubGVuZ3RoOworICAgIH0KKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgX2l0ZXJhdG9yNC5lKGVycik7CisgIH0gZmluYWxseSB7CisgICAgX2l0ZXJhdG9yNC5mKCk7CisgIH0KKworICBmb3IgKHZhciBfaTMgPSAwLCBfeHJlZlRhYmxlRGF0YSA9IHhyZWZUYWJsZURhdGE7IF9pMyA8IF94cmVmVGFibGVEYXRhLmxlbmd0aDsgX2kzKyspIHsKKyAgICB2YXIgX3hyZWZUYWJsZURhdGEkX2kgPSBfc2xpY2VkVG9BcnJheShfeHJlZlRhYmxlRGF0YVtfaTNdLCAzKSwKKyAgICAgICAgdHlwZSA9IF94cmVmVGFibGVEYXRhJF9pWzBdLAorICAgICAgICBvYmpPZmZzZXQgPSBfeHJlZlRhYmxlRGF0YSRfaVsxXSwKKyAgICAgICAgZ2VuID0gX3hyZWZUYWJsZURhdGEkX2lbMl07CisKKyAgICBvZmZzZXQgPSB3cml0ZUludCh0eXBlLCBzaXplc1swXSwgb2Zmc2V0LCBhcnJheSk7CisgICAgb2Zmc2V0ID0gd3JpdGVJbnQob2JqT2Zmc2V0LCBzaXplc1sxXSwgb2Zmc2V0LCBhcnJheSk7CisgICAgb2Zmc2V0ID0gd3JpdGVJbnQoZ2VuLCBzaXplc1syXSwgb2Zmc2V0LCBhcnJheSk7CisgIH0KKworICB3cml0ZVN0cmluZyhmb290ZXIsIG9mZnNldCwgYXJyYXkpOworICByZXR1cm4gYXJyYXk7Cit9CisKKy8qKiovIH0pLAorLyogMjI1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUGFydGlhbEV2YWx1YXRvciA9IHZvaWQgMDsKKwordmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXygyKSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY21hcCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjI2KTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDIpOworCit2YXIgX2ZvbnRzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjcpOworCit2YXIgX2VuY29kaW5ncyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMwKTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDUpOworCit2YXIgX3VuaWNvZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzMyk7CisKK3ZhciBfc3RhbmRhcmRfZm9udHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzMik7CisKK3ZhciBfcGF0dGVybiA9IF9fd19wZGZqc19yZXF1aXJlX18oMjM2KTsKKwordmFyIF9mdW5jdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oMjM3KTsKKwordmFyIF9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOCk7CisKK3ZhciBfaW1hZ2VfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyMSk7CisKK3ZhciBfYmlkaSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjM5KTsKKwordmFyIF9jb2xvcnNwYWNlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjApOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA5KTsKKwordmFyIF9nbHlwaGxpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzMSk7CisKK3ZhciBfbWV0cmljcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjQwKTsKKwordmFyIF9tdXJtdXJoYXNoID0gX193X3BkZmpzX3JlcXVpcmVfXygyNDEpOworCit2YXIgX29wZXJhdG9yX2xpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyMyk7CisKK3ZhciBfaW1hZ2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI0Mik7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CisKK2Z1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIERlZmF1bHRQYXJ0aWFsRXZhbHVhdG9yT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoeworICBtYXhJbWFnZVNpemU6IC0xLAorICBkaXNhYmxlRm9udEZhY2U6IGZhbHNlLAorICBpZ25vcmVFcnJvcnM6IGZhbHNlLAorICBpc0V2YWxTdXBwb3J0ZWQ6IHRydWUsCisgIGZvbnRFeHRyYVByb3BlcnRpZXM6IGZhbHNlCit9KTsKK3ZhciBQYXR0ZXJuVHlwZSA9IHsKKyAgVElMSU5HOiAxLAorICBTSEFESU5HOiAyCit9OwordmFyIGRlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7CisKK2Z1bmN0aW9uIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSkgeworICB2YXIgcGFyc2luZ0FycmF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKKworICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB2YWx1ZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgbWF5YmVCTSA9IG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZVtpXSwgdHJ1ZSk7CisKKyAgICAgIGlmIChtYXliZUJNKSB7CisgICAgICAgIHJldHVybiBtYXliZUJNOworICAgICAgfQorICAgIH0KKworICAgICgwLCBfdXRpbC53YXJuKSgiVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZSBBcnJheTogIi5jb25jYXQodmFsdWUpKTsKKyAgICByZXR1cm4gInNvdXJjZS1vdmVyIjsKKyAgfQorCisgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodmFsdWUpKSB7CisgICAgaWYgKHBhcnNpbmdBcnJheSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CisgIH0KKworICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKKyAgICBjYXNlICJOb3JtYWwiOgorICAgIGNhc2UgIkNvbXBhdGlibGUiOgorICAgICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CisKKyAgICBjYXNlICJNdWx0aXBseSI6CisgICAgICByZXR1cm4gIm11bHRpcGx5IjsKKworICAgIGNhc2UgIlNjcmVlbiI6CisgICAgICByZXR1cm4gInNjcmVlbiI7CisKKyAgICBjYXNlICJPdmVybGF5IjoKKyAgICAgIHJldHVybiAib3ZlcmxheSI7CisKKyAgICBjYXNlICJEYXJrZW4iOgorICAgICAgcmV0dXJuICJkYXJrZW4iOworCisgICAgY2FzZSAiTGlnaHRlbiI6CisgICAgICByZXR1cm4gImxpZ2h0ZW4iOworCisgICAgY2FzZSAiQ29sb3JEb2RnZSI6CisgICAgICByZXR1cm4gImNvbG9yLWRvZGdlIjsKKworICAgIGNhc2UgIkNvbG9yQnVybiI6CisgICAgICByZXR1cm4gImNvbG9yLWJ1cm4iOworCisgICAgY2FzZSAiSGFyZExpZ2h0IjoKKyAgICAgIHJldHVybiAiaGFyZC1saWdodCI7CisKKyAgICBjYXNlICJTb2Z0TGlnaHQiOgorICAgICAgcmV0dXJuICJzb2Z0LWxpZ2h0IjsKKworICAgIGNhc2UgIkRpZmZlcmVuY2UiOgorICAgICAgcmV0dXJuICJkaWZmZXJlbmNlIjsKKworICAgIGNhc2UgIkV4Y2x1c2lvbiI6CisgICAgICByZXR1cm4gImV4Y2x1c2lvbiI7CisKKyAgICBjYXNlICJIdWUiOgorICAgICAgcmV0dXJuICJodWUiOworCisgICAgY2FzZSAiU2F0dXJhdGlvbiI6CisgICAgICByZXR1cm4gInNhdHVyYXRpb24iOworCisgICAgY2FzZSAiQ29sb3IiOgorICAgICAgcmV0dXJuICJjb2xvciI7CisKKyAgICBjYXNlICJMdW1pbm9zaXR5IjoKKyAgICAgIHJldHVybiAibHVtaW5vc2l0eSI7CisgIH0KKworICBpZiAocGFyc2luZ0FycmF5KSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAoMCwgX3V0aWwud2FybikoIlVuc3VwcG9ydGVkIGJsZW5kIG1vZGU6ICIuY29uY2F0KHZhbHVlLm5hbWUpKTsKKyAgcmV0dXJuICJzb3VyY2Utb3ZlciI7Cit9CisKK3ZhciBUaW1lU2xvdE1hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBfY3JlYXRlQ2xhc3MoVGltZVNsb3RNYW5hZ2VyLCBudWxsLCBbeworICAgIGtleTogIlRJTUVfU0xPVF9EVVJBVElPTl9NUyIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIlRJTUVfU0xPVF9EVVJBVElPTl9NUyIsIDIwKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJDSEVDS19USU1FX0VWRVJZIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiQ0hFQ0tfVElNRV9FVkVSWSIsIDEwMCk7CisgICAgfQorICB9XSk7CisKKyAgZnVuY3Rpb24gVGltZVNsb3RNYW5hZ2VyKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUaW1lU2xvdE1hbmFnZXIpOworCisgICAgdGhpcy5yZXNldCgpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFRpbWVTbG90TWFuYWdlciwgW3sKKyAgICBrZXk6ICJjaGVjayIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNoZWNrKCkgeworICAgICAgaWYgKCsrdGhpcy5jaGVja2VkIDwgVGltZVNsb3RNYW5hZ2VyLkNIRUNLX1RJTUVfRVZFUlkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB0aGlzLmNoZWNrZWQgPSAwOworICAgICAgcmV0dXJuIHRoaXMuZW5kVGltZSA8PSBEYXRlLm5vdygpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlc2V0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7CisgICAgICB0aGlzLmVuZFRpbWUgPSBEYXRlLm5vdygpICsgVGltZVNsb3RNYW5hZ2VyLlRJTUVfU0xPVF9EVVJBVElPTl9NUzsKKyAgICAgIHRoaXMuY2hlY2tlZCA9IDA7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFRpbWVTbG90TWFuYWdlcjsKK30oKTsKKwordmFyIFBhcnRpYWxFdmFsdWF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQYXJ0aWFsRXZhbHVhdG9yKF9yZWYpIHsKKyAgICB2YXIgeHJlZiA9IF9yZWYueHJlZiwKKyAgICAgICAgaGFuZGxlciA9IF9yZWYuaGFuZGxlciwKKyAgICAgICAgcGFnZUluZGV4ID0gX3JlZi5wYWdlSW5kZXgsCisgICAgICAgIGlkRmFjdG9yeSA9IF9yZWYuaWRGYWN0b3J5LAorICAgICAgICBmb250Q2FjaGUgPSBfcmVmLmZvbnRDYWNoZSwKKyAgICAgICAgYnVpbHRJbkNNYXBDYWNoZSA9IF9yZWYuYnVpbHRJbkNNYXBDYWNoZSwKKyAgICAgICAgZ2xvYmFsSW1hZ2VDYWNoZSA9IF9yZWYuZ2xvYmFsSW1hZ2VDYWNoZSwKKyAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLAorICAgICAgICBvcHRpb25zID0gX3JlZiRvcHRpb25zID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRvcHRpb25zOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhcnRpYWxFdmFsdWF0b3IpOworCisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OworICAgIHRoaXMuaWRGYWN0b3J5ID0gaWRGYWN0b3J5OworICAgIHRoaXMuZm9udENhY2hlID0gZm9udENhY2hlOworICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CisgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gZ2xvYmFsSW1hZ2VDYWNoZTsKKyAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IERlZmF1bHRQYXJ0aWFsRXZhbHVhdG9yT3B0aW9uczsKKyAgICB0aGlzLnBhcnNpbmdUeXBlM0ZvbnQgPSBmYWxzZTsKKyAgICB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQgPSB0aGlzLmZldGNoQnVpbHRJbkNNYXAuYmluZCh0aGlzKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQYXJ0aWFsRXZhbHVhdG9yLCBbeworICAgIGtleTogImNsb25lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoKSB7CisgICAgICB2YXIgbmV3T3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogRGVmYXVsdFBhcnRpYWxFdmFsdWF0b3JPcHRpb25zOworICAgICAgdmFyIG5ld0V2YWx1YXRvciA9IE9iamVjdC5jcmVhdGUodGhpcyk7CisgICAgICBuZXdFdmFsdWF0b3Iub3B0aW9ucyA9IG5ld09wdGlvbnM7CisgICAgICByZXR1cm4gbmV3RXZhbHVhdG9yOworICAgIH0KKyAgfSwgeworICAgIGtleTogImhhc0JsZW5kTW9kZXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNCbGVuZE1vZGVzKHJlc291cmNlcykgeworICAgICAgaWYgKCEocmVzb3VyY2VzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB2YXIgcHJvY2Vzc2VkID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOworCisgICAgICBpZiAocmVzb3VyY2VzLm9iaklkKSB7CisgICAgICAgIHByb2Nlc3NlZC5wdXQocmVzb3VyY2VzLm9iaklkKTsKKyAgICAgIH0KKworICAgICAgdmFyIG5vZGVzID0gW3Jlc291cmNlc10sCisgICAgICAgICAgeHJlZiA9IHRoaXMueHJlZjsKKworICAgICAgd2hpbGUgKG5vZGVzLmxlbmd0aCkgeworICAgICAgICB2YXIgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7CisgICAgICAgIHZhciBncmFwaGljU3RhdGVzID0gbm9kZS5nZXQoIkV4dEdTdGF0ZSIpOworCisgICAgICAgIGlmIChncmFwaGljU3RhdGVzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgeworICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihncmFwaGljU3RhdGVzLmdldFJhd1ZhbHVlcygpKSwKKyAgICAgICAgICAgICAgX3N0ZXA7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgICAgdmFyIGdyYXBoaWNTdGF0ZSA9IF9zdGVwLnZhbHVlOworCisgICAgICAgICAgICAgIGlmIChncmFwaGljU3RhdGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2VkLmhhcyhncmFwaGljU3RhdGUpKSB7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgZ3JhcGhpY1N0YXRlID0geHJlZi5mZXRjaChncmFwaGljU3RhdGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dChncmFwaGljU3RhdGUpOworICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgRXh0R1N0YXRlOiBcIiIuY29uY2F0KGV4LCAiXCIuIikpOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCEoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChncmFwaGljU3RhdGUub2JqSWQpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzZWQucHV0KGdyYXBoaWNTdGF0ZS5vYmpJZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgYm0gPSBncmFwaGljU3RhdGUuZ2V0KCJCTSIpOworCisgICAgICAgICAgICAgIGlmIChibSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoYm0ubmFtZSAhPT0gIk5vcm1hbCIpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGJtICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheShibSkpIHsKKyAgICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGJtKSwKKyAgICAgICAgICAgICAgICAgICAgX3N0ZXAyOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3N0ZXAyLnZhbHVlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSAmJiBlbGVtZW50Lm5hbWUgIT09ICJOb3JtYWwiKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjIuZShlcnIpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICBfaXRlcmF0b3IyLmYoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIHhPYmplY3RzID0gbm9kZS5nZXQoIlhPYmplY3QiKTsKKworICAgICAgICBpZiAoISh4T2JqZWN0cyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHhPYmplY3RzLmdldFJhd1ZhbHVlcygpKSwKKyAgICAgICAgICAgIF9zdGVwMzsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7CisgICAgICAgICAgICB2YXIgeE9iamVjdCA9IF9zdGVwMy52YWx1ZTsKKworICAgICAgICAgICAgaWYgKHhPYmplY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoeE9iamVjdCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgeE9iamVjdCA9IHhyZWYuZmV0Y2goeE9iamVjdCk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeE9iamVjdCk7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgWE9iamVjdDogXCIiLmNvbmNhdChleCwgIlwiLiIpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoeE9iamVjdCkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh4T2JqZWN0LmRpY3Qub2JqSWQpIHsKKyAgICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4T2JqZWN0LmRpY3Qub2JqSWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgeFJlc291cmNlcyA9IHhPYmplY3QuZGljdC5nZXQoIlJlc291cmNlcyIpOworCisgICAgICAgICAgICBpZiAoISh4UmVzb3VyY2VzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkICYmIHByb2Nlc3NlZC5oYXMoeFJlc291cmNlcy5vYmpJZCkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vZGVzLnB1c2goeFJlc291cmNlcyk7CisKKyAgICAgICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkKSB7CisgICAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeFJlc291cmNlcy5vYmpJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBfaXRlcmF0b3IzLmYoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmV0Y2hCdWlsdEluQ01hcCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfZmV0Y2hCdWlsdEluQ01hcCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKG5hbWUpIHsKKyAgICAgICAgdmFyIGNhY2hlZERhdGEsIHJlYWRhYmxlU3RyZWFtLCByZWFkZXIsIGRhdGE7CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNhY2hlZERhdGEgPSB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuZ2V0KG5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKCFjYWNoZWREYXRhKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIGNhY2hlZERhdGEpOworCisgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICByZWFkYWJsZVN0cmVhbSA9IHRoaXMuaGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiRmV0Y2hCdWlsdEluQ01hcCIsIHsKKyAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTsKKyAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHVtcCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChfcmVmMikgeworICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWYyLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gX3JlZjIuZG9uZTsKKworICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgcHVtcCgpOworICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBwdW1wKCk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dC5zZW50OworCisgICAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcHJlc3Npb25UeXBlICE9PSBfdXRpbC5DTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpIHsKKyAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZS5zZXQobmFtZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgZGF0YSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIGZldGNoQnVpbHRJbkNNYXAoX3gpIHsKKyAgICAgICAgcmV0dXJuIF9mZXRjaEJ1aWx0SW5DTWFwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmZXRjaEJ1aWx0SW5DTWFwOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiYnVpbGRGb3JtWE9iamVjdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfYnVpbGRGb3JtWE9iamVjdCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMihyZXNvdXJjZXMsIHhvYmosIHNtYXNrLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKKyAgICAgICAgdmFyIGRpY3QsIG1hdHJpeCwgYmJveCwgb3B0aW9uYWxDb250ZW50LCBncm91cCwgZ3JvdXBPcHRpb25zLCBncm91cFN1YnR5cGUsIGNvbG9yU3BhY2UsIGNzLCBjYWNoZWRDb2xvclNwYWNlOworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZGljdCA9IHhvYmouZGljdDsKKyAgICAgICAgICAgICAgICBtYXRyaXggPSBkaWN0LmdldEFycmF5KCJNYXRyaXgiKTsKKyAgICAgICAgICAgICAgICBiYm94ID0gZGljdC5nZXRBcnJheSgiQkJveCIpOworCisgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHsKKyAgICAgICAgICAgICAgICAgIGJib3ggPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGJib3ggPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAoIWRpY3QuaGFzKCJPQyIpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA4OworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGRpY3QuZ2V0KCJPQyIpLCByZXNvdXJjZXMpOworCisgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBvcHRpb25hbENvbnRlbnQgPSBfY29udGV4dDIuc2VudDsKKyAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbIk9DIiwgb3B0aW9uYWxDb250ZW50XSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICBncm91cCA9IGRpY3QuZ2V0KCJHcm91cCIpOworCisgICAgICAgICAgICAgICAgaWYgKCFncm91cCkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGdyb3VwT3B0aW9ucyA9IHsKKyAgICAgICAgICAgICAgICAgIG1hdHJpeDogbWF0cml4LAorICAgICAgICAgICAgICAgICAgYmJveDogYmJveCwKKyAgICAgICAgICAgICAgICAgIHNtYXNrOiBzbWFzaywKKyAgICAgICAgICAgICAgICAgIGlzb2xhdGVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIGtub2Nrb3V0OiBmYWxzZQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgZ3JvdXBTdWJ0eXBlID0gZ3JvdXAuZ2V0KCJTIik7CisgICAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGdyb3VwU3VidHlwZSwgIlRyYW5zcGFyZW5jeSIpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ3JvdXBPcHRpb25zLmlzb2xhdGVkID0gZ3JvdXAuZ2V0KCJJIikgfHwgZmFsc2U7CisgICAgICAgICAgICAgICAgZ3JvdXBPcHRpb25zLmtub2Nrb3V0ID0gZ3JvdXAuZ2V0KCJLIikgfHwgZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAoIWdyb3VwLmhhcygiQ1MiKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyODsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNzID0gZ3JvdXAuZ2V0UmF3KCJDUyIpOworICAgICAgICAgICAgICAgIGNhY2hlZENvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLmdldENhY2hlZChjcywgdGhpcy54cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWNhY2hlZENvbG9yU3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb2xvclNwYWNlID0gY2FjaGVkQ29sb3JTcGFjZTsKKyAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyNzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNvbG9yU3BhY2UoeworICAgICAgICAgICAgICAgICAgY3M6IGNzLAorICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBfY29udGV4dDIuc2VudDsKKworICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgIGlmIChzbWFzayAmJiBzbWFzay5iYWNrZHJvcCkgeworICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IGNvbG9yU3BhY2UgfHwgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjsKKyAgICAgICAgICAgICAgICAgIHNtYXNrLmJhY2tkcm9wID0gY29sb3JTcGFjZS5nZXRSZ2Ioc21hc2suYmFja2Ryb3AsIDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5Hcm91cCwgW2dyb3VwT3B0aW9uc10pOworCisgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW4sIFttYXRyaXgsIGJib3hdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgdGhpcy5nZXRPcGVyYXRvckxpc3QoeworICAgICAgICAgICAgICAgICAgc3RyZWFtOiB4b2JqLAorICAgICAgICAgICAgICAgICAgdGFzazogdGFzaywKKyAgICAgICAgICAgICAgICAgIHJlc291cmNlczogZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdDogb3BlcmF0b3JMaXN0LAorICAgICAgICAgICAgICAgICAgaW5pdGlhbFN0YXRlOiBpbml0aWFsU3RhdGUKKyAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucGFpbnRGb3JtWE9iamVjdEVuZCwgW10pOworCisgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5lbmRHcm91cCwgW2dyb3VwT3B0aW9uc10pOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWxDb250ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuZW5kTWFya2VkQ29udGVudCwgW10pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBidWlsZEZvcm1YT2JqZWN0KF94MiwgX3gzLCBfeDQsIF94NSwgX3g2LCBfeDcsIF94OCkgeworICAgICAgICByZXR1cm4gX2J1aWxkRm9ybVhPYmplY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGJ1aWxkRm9ybVhPYmplY3Q7CisgICAgfSgpCisgIH0sIHsKKyAgICBrZXk6ICJfc2VuZEltZ0RhdGEiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfc2VuZEltZ0RhdGEob2JqSWQsIGltZ0RhdGEpIHsKKyAgICAgIHZhciBjYWNoZUdsb2JhbGx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTsKKyAgICAgIHZhciB0cmFuc2ZlcnMgPSBpbWdEYXRhID8gW2ltZ0RhdGEuZGF0YS5idWZmZXJdIDogbnVsbDsKKworICAgICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCB8fCBjYWNoZUdsb2JhbGx5KSB7CisgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW29iaklkLCAiSW1hZ2UiLCBpbWdEYXRhXSwgdHJhbnNmZXJzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5zZW5kKCJvYmoiLCBbb2JqSWQsIHRoaXMucGFnZUluZGV4LCAiSW1hZ2UiLCBpbWdEYXRhXSwgdHJhbnNmZXJzKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJidWlsZFBhaW50SW1hZ2VYT2JqZWN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9idWlsZFBhaW50SW1hZ2VYT2JqZWN0ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKF9yZWYzKSB7CisgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgICAgdmFyIHJlc291cmNlcywgaW1hZ2UsIF9yZWYzJGlzSW5saW5lLCBpc0lubGluZSwgb3BlcmF0b3JMaXN0LCBjYWNoZUtleSwgbG9jYWxJbWFnZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgZGljdCwgaW1hZ2VSZWYsIHcsIGgsIG1heEltYWdlU2l6ZSwgaW1hZ2VNYXNrLCBpbWdEYXRhLCBhcmdzLCB3aWR0aCwgaGVpZ2h0LCBiaXRTdHJpZGVMZW5ndGgsIGltZ0FycmF5LCBkZWNvZGUsIHNvZnRNYXNrLCBtYXNrLCBTTUFMTF9JTUFHRV9ESU1FTlNJT05TLCBpbWFnZU9iaiwgb2JqSWQsIGNhY2hlR2xvYmFsbHk7CisKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IF9yZWYzLnJlc291cmNlcywgaW1hZ2UgPSBfcmVmMy5pbWFnZSwgX3JlZjMkaXNJbmxpbmUgPSBfcmVmMy5pc0lubGluZSwgaXNJbmxpbmUgPSBfcmVmMyRpc0lubGluZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRpc0lubGluZSwgb3BlcmF0b3JMaXN0ID0gX3JlZjMub3BlcmF0b3JMaXN0LCBjYWNoZUtleSA9IF9yZWYzLmNhY2hlS2V5LCBsb2NhbEltYWdlQ2FjaGUgPSBfcmVmMy5sb2NhbEltYWdlQ2FjaGUsIGxvY2FsQ29sb3JTcGFjZUNhY2hlID0gX3JlZjMubG9jYWxDb2xvclNwYWNlQ2FjaGU7CisgICAgICAgICAgICAgICAgZGljdCA9IGltYWdlLmRpY3Q7CisgICAgICAgICAgICAgICAgaW1hZ2VSZWYgPSBkaWN0Lm9iaklkOworICAgICAgICAgICAgICAgIHcgPSBkaWN0LmdldCgiV2lkdGgiLCAiVyIpOworICAgICAgICAgICAgICAgIGggPSBkaWN0LmdldCgiSGVpZ2h0IiwgIkgiKTsKKworICAgICAgICAgICAgICAgIGlmICghKCEodyAmJiAoMCwgX3V0aWwuaXNOdW0pKHcpKSB8fCAhKGggJiYgKDAsIF91dGlsLmlzTnVtKShoKSkpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkltYWdlIGRpbWVuc2lvbnMgYXJlIG1pc3NpbmcsIG9yIG5vdCBudW1iZXJzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCB1bmRlZmluZWQpOworCisgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBtYXhJbWFnZVNpemUgPSB0aGlzLm9wdGlvbnMubWF4SW1hZ2VTaXplOworCisgICAgICAgICAgICAgICAgaWYgKCEobWF4SW1hZ2VTaXplICE9PSAtMSAmJiB3ICogaCA+IG1heEltYWdlU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkltYWdlIGV4Y2VlZGVkIG1heGltdW0gYWxsb3dlZCBzaXplIGFuZCB3YXMgcmVtb3ZlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgdW5kZWZpbmVkKTsKKworICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIGltYWdlTWFzayA9IGRpY3QuZ2V0KCJJbWFnZU1hc2siLCAiSU0iKSB8fCBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmICghaW1hZ2VNYXNrKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2lkdGggPSBkaWN0LmdldCgiV2lkdGgiLCAiVyIpOworICAgICAgICAgICAgICAgIGhlaWdodCA9IGRpY3QuZ2V0KCJIZWlnaHQiLCAiSCIpOworICAgICAgICAgICAgICAgIGJpdFN0cmlkZUxlbmd0aCA9IHdpZHRoICsgNyA+PiAzOworICAgICAgICAgICAgICAgIGltZ0FycmF5ID0gaW1hZ2UuZ2V0Qnl0ZXMoYml0U3RyaWRlTGVuZ3RoICogaGVpZ2h0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICBkZWNvZGUgPSBkaWN0LmdldEFycmF5KCJEZWNvZGUiLCAiRCIpOworICAgICAgICAgICAgICAgIGltZ0RhdGEgPSBfaW1hZ2UuUERGSW1hZ2UuY3JlYXRlTWFzayh7CisgICAgICAgICAgICAgICAgICBpbWdBcnJheTogaW1nQXJyYXksCisgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsCisgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIF9zdHJlYW0uRGVjb2RlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgaW52ZXJzZURlY29kZTogISFkZWNvZGUgJiYgZGVjb2RlWzBdID4gMAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGltZ0RhdGEuY2FjaGVkID0gISFjYWNoZUtleTsKKyAgICAgICAgICAgICAgICBhcmdzID0gW2ltZ0RhdGFdOworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBhcmdzKTsKKworICAgICAgICAgICAgICAgIGlmIChjYWNoZUtleSkgeworICAgICAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLnNldChjYWNoZUtleSwgaW1hZ2VSZWYsIHsKKyAgICAgICAgICAgICAgICAgICAgZm46IF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsCisgICAgICAgICAgICAgICAgICAgIGFyZ3M6IGFyZ3MKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCB1bmRlZmluZWQpOworCisgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgc29mdE1hc2sgPSBkaWN0LmdldCgiU01hc2siLCAiU00iKSB8fCBmYWxzZTsKKyAgICAgICAgICAgICAgICBtYXNrID0gZGljdC5nZXQoIk1hc2siKSB8fCBmYWxzZTsKKyAgICAgICAgICAgICAgICBTTUFMTF9JTUFHRV9ESU1FTlNJT05TID0gMjAwOworCisgICAgICAgICAgICAgICAgaWYgKCEoaXNJbmxpbmUgJiYgIXNvZnRNYXNrICYmICFtYXNrICYmIHcgKyBoIDwgU01BTExfSU1BR0VfRElNRU5TSU9OUykpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMzM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbWFnZU9iaiA9IG5ldyBfaW1hZ2UuUERGSW1hZ2UoeworICAgICAgICAgICAgICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgICAgICAgICAgICAgcmVzOiByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICBpbWFnZTogaW1hZ2UsCisgICAgICAgICAgICAgICAgICBpc0lubGluZTogaXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGltZ0RhdGEgPSBpbWFnZU9iai5jcmVhdGVJbWFnZURhdGEodHJ1ZSk7CisgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdCwgW2ltZ0RhdGFdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgdW5kZWZpbmVkKTsKKworICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgIG9iaklkID0gImltZ18iLmNvbmNhdCh0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpKSwgY2FjaGVHbG9iYWxseSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCkgeworICAgICAgICAgICAgICAgICAgb2JqSWQgPSAiIi5jb25jYXQodGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKSwgIl90eXBlM18iKS5jb25jYXQob2JqSWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2VSZWYpIHsKKyAgICAgICAgICAgICAgICAgIGNhY2hlR2xvYmFsbHkgPSB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2hvdWxkQ2FjaGUoaW1hZ2VSZWYsIHRoaXMucGFnZUluZGV4KTsKKworICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlR2xvYmFsbHkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqSWQgPSAiIi5jb25jYXQodGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKSwgIl8iKS5jb25jYXQob2JqSWQpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKKyAgICAgICAgICAgICAgICBhcmdzID0gW29iaklkLCB3LCBoXTsKKworICAgICAgICAgICAgICAgIF9pbWFnZS5QREZJbWFnZS5idWlsZEltYWdlKHsKKyAgICAgICAgICAgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgICAgICAgICAgICAgIHJlczogcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgaW1hZ2U6IGltYWdlLAorICAgICAgICAgICAgICAgICAgaXNJbmxpbmU6IGlzSW5saW5lLAorICAgICAgICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChpbWFnZU9iaikgeworICAgICAgICAgICAgICAgICAgaW1nRGF0YSA9IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YShmYWxzZSk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5KTsKKyAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuYWJsZSB0byBkZWNvZGUgaW1hZ2UgXCIiLmNvbmNhdChvYmpJZCwgIlwiOiBcIiIpLmNvbmNhdChyZWFzb24sICJcIi4iKSk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBudWxsLCBjYWNoZUdsb2JhbGx5KTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QsIGFyZ3MpOworCisgICAgICAgICAgICAgICAgaWYgKGNhY2hlS2V5KSB7CisgICAgICAgICAgICAgICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwgeworICAgICAgICAgICAgICAgICAgICBmbjogX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzCisgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgaWYgKGltYWdlUmVmKSB7CisgICAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKCFpc0lubGluZSwgIkNhbm5vdCBjYWNoZSBhbiBpbmxpbmUgaW1hZ2UgZ2xvYmFsbHkuIik7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRQYWdlSW5kZXgoaW1hZ2VSZWYsIHRoaXMucGFnZUluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVHbG9iYWxseSkgeworICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhKGltYWdlUmVmLCB7CisgICAgICAgICAgICAgICAgICAgICAgICBvYmpJZDogb2JqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbjogX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogYXJncworICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHVuZGVmaW5lZCk7CisKKyAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gYnVpbGRQYWludEltYWdlWE9iamVjdChfeDkpIHsKKyAgICAgICAgcmV0dXJuIF9idWlsZFBhaW50SW1hZ2VYT2JqZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBidWlsZFBhaW50SW1hZ2VYT2JqZWN0OworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiaGFuZGxlU01hc2siLAorICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVTTWFzayhzbWFzaywgcmVzb3VyY2VzLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlciwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKKyAgICAgIHZhciBzbWFza0NvbnRlbnQgPSBzbWFzay5nZXQoIkciKTsKKyAgICAgIHZhciBzbWFza09wdGlvbnMgPSB7CisgICAgICAgIHN1YnR5cGU6IHNtYXNrLmdldCgiUyIpLm5hbWUsCisgICAgICAgIGJhY2tkcm9wOiBzbWFzay5nZXQoIkJDIikKKyAgICAgIH07CisgICAgICB2YXIgdHJhbnNmZXJPYmogPSBzbWFzay5nZXQoIlRSIik7CisKKyAgICAgIGlmICgoMCwgX2Z1bmN0aW9uLmlzUERGRnVuY3Rpb24pKHRyYW5zZmVyT2JqKSkgeworICAgICAgICB2YXIgdHJhbnNmZXJGbiA9IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUodHJhbnNmZXJPYmopOworCisgICAgICAgIHZhciB0cmFuc2Zlck1hcCA9IG5ldyBVaW50OEFycmF5KDI1Nik7CisgICAgICAgIHZhciB0bXAgPSBuZXcgRmxvYXQzMkFycmF5KDEpOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICB0bXBbMF0gPSBpIC8gMjU1OworICAgICAgICAgIHRyYW5zZmVyRm4odG1wLCAwLCB0bXAsIDApOworICAgICAgICAgIHRyYW5zZmVyTWFwW2ldID0gdG1wWzBdICogMjU1IHwgMDsKKyAgICAgICAgfQorCisgICAgICAgIHNtYXNrT3B0aW9ucy50cmFuc2Zlck1hcCA9IHRyYW5zZmVyTWFwOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgc21hc2tDb250ZW50LCBzbWFza09wdGlvbnMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoYW5kbGVUcmFuc2ZlckZ1bmN0aW9uIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlVHJhbnNmZXJGdW5jdGlvbih0cikgeworICAgICAgdmFyIHRyYW5zZmVyQXJyYXk7CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KHRyKSkgeworICAgICAgICB0cmFuc2ZlckFycmF5ID0gdHI7CisgICAgICB9IGVsc2UgaWYgKCgwLCBfZnVuY3Rpb24uaXNQREZGdW5jdGlvbikodHIpKSB7CisgICAgICAgIHRyYW5zZmVyQXJyYXkgPSBbdHJdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciB0cmFuc2Zlck1hcHMgPSBbXTsKKyAgICAgIHZhciBudW1GbnMgPSAwLAorICAgICAgICAgIG51bUVmZmVjdGZ1bEZucyA9IDA7CisKKyAgICAgIHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodHJhbnNmZXJBcnJheSksCisgICAgICAgICAgX3N0ZXA0OworCisgICAgICB0cnkgeworICAgICAgICBmb3IgKF9pdGVyYXRvcjQucygpOyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQubigpKS5kb25lOykgeworICAgICAgICAgIHZhciBlbnRyeSA9IF9zdGVwNC52YWx1ZTsKKyAgICAgICAgICB2YXIgdHJhbnNmZXJPYmogPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihlbnRyeSk7CisgICAgICAgICAgbnVtRm5zKys7CisKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHJhbnNmZXJPYmosICJJZGVudGl0eSIpKSB7CisgICAgICAgICAgICB0cmFuc2Zlck1hcHMucHVzaChudWxsKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gZWxzZSBpZiAoISgwLCBfZnVuY3Rpb24uaXNQREZGdW5jdGlvbikodHJhbnNmZXJPYmopKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgdHJhbnNmZXJGbiA9IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUodHJhbnNmZXJPYmopOworCisgICAgICAgICAgdmFyIHRyYW5zZmVyTWFwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KSwKKyAgICAgICAgICAgICAgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKKworICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKyAgICAgICAgICAgIHRtcFswXSA9IGogLyAyNTU7CisgICAgICAgICAgICB0cmFuc2ZlckZuKHRtcCwgMCwgdG1wLCAwKTsKKyAgICAgICAgICAgIHRyYW5zZmVyTWFwW2pdID0gdG1wWzBdICogMjU1IHwgMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0cmFuc2Zlck1hcHMucHVzaCh0cmFuc2Zlck1hcCk7CisgICAgICAgICAgbnVtRWZmZWN0ZnVsRm5zKys7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfaXRlcmF0b3I0LmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvcjQuZigpOworICAgICAgfQorCisgICAgICBpZiAoIShudW1GbnMgPT09IDEgfHwgbnVtRm5zID09PSA0KSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKG51bUVmZmVjdGZ1bEZucyA9PT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRyYW5zZmVyTWFwczsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoYW5kbGVUaWxpbmdUeXBlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlVGlsaW5nVHlwZShmbiwgYXJncywgcmVzb3VyY2VzLCBwYXR0ZXJuLCBwYXR0ZXJuRGljdCwgb3BlcmF0b3JMaXN0LCB0YXNrKSB7CisgICAgICB2YXIgX3RoaXMyID0gdGhpczsKKworICAgICAgdmFyIHRpbGluZ09wTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKKworICAgICAgdmFyIHBhdHRlcm5SZXNvdXJjZXMgPSBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKKyAgICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgICBkaWN0QXJyYXk6IFtwYXR0ZXJuRGljdC5nZXQoIlJlc291cmNlcyIpLCByZXNvdXJjZXNdCisgICAgICB9KTsKKworICAgICAgcmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgc3RyZWFtOiBwYXR0ZXJuLAorICAgICAgICB0YXNrOiB0YXNrLAorICAgICAgICByZXNvdXJjZXM6IHBhdHRlcm5SZXNvdXJjZXMsCisgICAgICAgIG9wZXJhdG9yTGlzdDogdGlsaW5nT3BMaXN0CisgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuICgwLCBfcGF0dGVybi5nZXRUaWxpbmdQYXR0ZXJuSVIpKHsKKyAgICAgICAgICBmbkFycmF5OiB0aWxpbmdPcExpc3QuZm5BcnJheSwKKyAgICAgICAgICBhcmdzQXJyYXk6IHRpbGluZ09wTGlzdC5hcmdzQXJyYXkKKyAgICAgICAgfSwgcGF0dGVybkRpY3QsIGFyZ3MpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAodGlsaW5nUGF0dGVybklSKSB7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmNpZXModGlsaW5nT3BMaXN0LmRlcGVuZGVuY2llcyk7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgdGlsaW5nUGF0dGVybklSKTsKKyAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICAgIF90aGlzMi5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JUaWxpbmdQYXR0ZXJuCisgICAgICAgICAgfSk7CisKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoImhhbmRsZVRpbGluZ1R5cGUgLSBpZ25vcmluZyBwYXR0ZXJuOiBcIiIuY29uY2F0KHJlYXNvbiwgIlwiLiIpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyByZWFzb247CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoYW5kbGVTZXRGb250IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGZvbnRBcmdzLCBmb250UmVmLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlKSB7CisgICAgICB2YXIgX3RoaXMzID0gdGhpczsKKworICAgICAgdmFyIGZvbnROYW1lLAorICAgICAgICAgIGZvbnRTaXplID0gMDsKKworICAgICAgaWYgKGZvbnRBcmdzKSB7CisgICAgICAgIGZvbnRBcmdzID0gZm9udEFyZ3Muc2xpY2UoKTsKKyAgICAgICAgZm9udE5hbWUgPSBmb250QXJnc1swXS5uYW1lOworICAgICAgICBmb250U2l6ZSA9IGZvbnRBcmdzWzFdOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5sb2FkRm9udChmb250TmFtZSwgZm9udFJlZiwgcmVzb3VyY2VzKS50aGVuKGZ1bmN0aW9uICh0cmFuc2xhdGVkKSB7CisgICAgICAgIGlmICghdHJhbnNsYXRlZC5mb250LmlzVHlwZTNGb250KSB7CisgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJhbnNsYXRlZC5sb2FkVHlwZTNEYXRhKF90aGlzMywgcmVzb3VyY2VzLCB0YXNrKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRyYW5zbGF0ZWQudHlwZTNEZXBlbmRlbmNpZXMpOworICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVkOworICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgX3RoaXMzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIiwgeworICAgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRMb2FkVHlwZTMKKyAgICAgICAgICB9KTsKKworICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNsYXRlZEZvbnQoeworICAgICAgICAgICAgbG9hZGVkTmFtZTogImdfZm9udF9lcnJvciIsCisgICAgICAgICAgICBmb250OiBuZXcgX2ZvbnRzLkVycm9yRm9udCgiVHlwZTMgZm9udCBsb2FkIGVycm9yOiAiLmNvbmNhdChyZWFzb24pKSwKKyAgICAgICAgICAgIGRpY3Q6IHRyYW5zbGF0ZWQuZm9udCwKKyAgICAgICAgICAgIGV4dHJhUHJvcGVydGllczogX3RoaXMzLm9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllcworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHRyYW5zbGF0ZWQpIHsKKyAgICAgICAgc3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKKyAgICAgICAgc3RhdGUuZm9udFNpemUgPSBmb250U2l6ZTsKKyAgICAgICAgc3RhdGUuZm9udE5hbWUgPSBmb250TmFtZTsKKyAgICAgICAgdHJhbnNsYXRlZC5zZW5kKF90aGlzMy5oYW5kbGVyKTsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQubG9hZGVkTmFtZTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImhhbmRsZVRleHQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVUZXh0KGNoYXJzLCBzdGF0ZSkgeworICAgICAgdmFyIGZvbnQgPSBzdGF0ZS5mb250OworICAgICAgdmFyIGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CisKKyAgICAgIGlmIChmb250LmRhdGEpIHsKKyAgICAgICAgdmFyIGlzQWRkVG9QYXRoU2V0ID0gISEoc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTsKKworICAgICAgICBpZiAoaXNBZGRUb1BhdGhTZXQgfHwgc3RhdGUuZmlsbENvbG9yU3BhY2UubmFtZSA9PT0gIlBhdHRlcm4iIHx8IGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlRm9udEZhY2UpIHsKKyAgICAgICAgICBQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKGZvbnQsIGdseXBocywgdGhpcy5oYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZ2x5cGhzOworICAgIH0KKyAgfSwgeworICAgIGtleTogImVuc3VyZVN0YXRlRm9udCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGVuc3VyZVN0YXRlRm9udChzdGF0ZSkgeworICAgICAgaWYgKHN0YXRlLmZvbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcmVhc29uID0gbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuIik7CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRTdGF0ZQorICAgICAgICB9KTsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJlbnN1cmVTdGF0ZUZvbnQ6IFwiIi5jb25jYXQocmVhc29uLCAiXCIuIikpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRocm93IHJlYXNvbjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRHU3RhdGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3NldEdTdGF0ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlNChfcmVmNCkgeworICAgICAgICB2YXIgX3RoaXM0ID0gdGhpczsKKworICAgICAgICB2YXIgcmVzb3VyY2VzLCBnU3RhdGUsIG9wZXJhdG9yTGlzdCwgY2FjaGVLZXksIHRhc2ssIHN0YXRlTWFuYWdlciwgbG9jYWxHU3RhdGVDYWNoZSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIGdTdGF0ZVJlZiwgaXNTaW1wbGVHU3RhdGUsIGdTdGF0ZU9iaiwgZ1N0YXRlS2V5cywgcHJvbWlzZSwgX2xvb3AsIGksIGlpOworCisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBfcmVmNC5yZXNvdXJjZXMsIGdTdGF0ZSA9IF9yZWY0LmdTdGF0ZSwgb3BlcmF0b3JMaXN0ID0gX3JlZjQub3BlcmF0b3JMaXN0LCBjYWNoZUtleSA9IF9yZWY0LmNhY2hlS2V5LCB0YXNrID0gX3JlZjQudGFzaywgc3RhdGVNYW5hZ2VyID0gX3JlZjQuc3RhdGVNYW5hZ2VyLCBsb2NhbEdTdGF0ZUNhY2hlID0gX3JlZjQubG9jYWxHU3RhdGVDYWNoZSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBfcmVmNC5sb2NhbENvbG9yU3BhY2VDYWNoZTsKKyAgICAgICAgICAgICAgICBnU3RhdGVSZWYgPSBnU3RhdGUub2JqSWQ7CisgICAgICAgICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGdTdGF0ZU9iaiA9IFtdOworICAgICAgICAgICAgICAgIGdTdGF0ZUtleXMgPSBnU3RhdGUuZ2V0S2V5cygpOworICAgICAgICAgICAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKKworICAgICAgICAgICAgICAgIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7CisgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ1N0YXRlS2V5c1tpXTsKKyAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGdTdGF0ZS5nZXQoa2V5KTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiVHlwZSI6CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiTFciOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJMQyI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkxKIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiTUwiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJEIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiUkkiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJGTCI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkNBIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2EiOgorICAgICAgICAgICAgICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHZhbHVlXSk7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiRm9udCI6CisgICAgICAgICAgICAgICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczQuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIG51bGwsIHZhbHVlWzBdLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZSkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgW2xvYWRlZE5hbWUsIHZhbHVlWzFdXV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQk0iOgorICAgICAgICAgICAgICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSldKTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICJTTWFzayI6CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHZhbHVlLCAiTm9uZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBmYWxzZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM0LmhhbmRsZVNNYXNrKHZhbHVlLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHRydWVdKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiVFIiOgorICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2Zlck1hcHMgPSBfdGhpczQuaGFuZGxlVHJhbnNmZXJGdW5jdGlvbih2YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cmFuc2Zlck1hcHNdKTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICJPUCI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIm9wIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiT1BNIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQkciOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJCRzIiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJVQ1IiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJVQ1IyIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiVFIyIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiSFQiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJTTSI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIlNBIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQUlTIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiVEsiOgorICAgICAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiICsga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVW5rbm93biBncmFwaGljIHN0YXRlIG9wZXJhdG9yICIgKyBrZXkpOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGdTdGF0ZUtleXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgICAgICAgX2xvb3AoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgicmV0dXJuIiwgcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChnU3RhdGVPYmoubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNldEdTdGF0ZSwgW2dTdGF0ZU9ial0pOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoaXNTaW1wbGVHU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxHU3RhdGVDYWNoZS5zZXQoY2FjaGVLZXksIGdTdGF0ZVJlZiwgZ1N0YXRlT2JqKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTQpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBzZXRHU3RhdGUoX3gxMCkgeworICAgICAgICByZXR1cm4gX3NldEdTdGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gc2V0R1N0YXRlOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAibG9hZEZvbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkRm9udChmb250TmFtZSwgZm9udCwgcmVzb3VyY2VzKSB7CisgICAgICB2YXIgX3RoaXM1ID0gdGhpczsKKworICAgICAgdmFyIGVycm9yRm9udCA9IGZ1bmN0aW9uIGVycm9yRm9udCgpIHsKKyAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoeworICAgICAgICAgIGxvYWRlZE5hbWU6ICJnX2ZvbnRfZXJyb3IiLAorICAgICAgICAgIGZvbnQ6IG5ldyBfZm9udHMuRXJyb3JGb250KCJGb250IFwiIi5jb25jYXQoZm9udE5hbWUsICJcIiBpcyBub3QgYXZhaWxhYmxlLiIpKSwKKyAgICAgICAgICBkaWN0OiBmb250LAorICAgICAgICAgIGV4dHJhUHJvcGVydGllczogX3RoaXM1Lm9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllcworICAgICAgICB9KSk7CisgICAgICB9OworCisgICAgICB2YXIgZm9udFJlZiwKKyAgICAgICAgICB4cmVmID0gdGhpcy54cmVmOworCisgICAgICBpZiAoZm9udCkgeworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1JlZikoZm9udCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1RoZSAiZm9udCIgb2JqZWN0IHNob3VsZCBiZSBhIHJlZmVyZW5jZS4nKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvbnRSZWYgPSBmb250OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGZvbnRSZXMgPSByZXNvdXJjZXMuZ2V0KCJGb250Iik7CisKKyAgICAgICAgaWYgKGZvbnRSZXMpIHsKKyAgICAgICAgICBmb250UmVmID0gZm9udFJlcy5nZXRSYXcoZm9udE5hbWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghZm9udFJlZikgeworICAgICAgICB2YXIgcGFydGlhbE1zZyA9ICJGb250IFwiIi5jb25jYXQoZm9udE5hbWUgfHwgZm9udCAmJiBmb250LnRvU3RyaW5nKCksICJcIiBpcyBub3QgYXZhaWxhYmxlIik7CisKKyAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzICYmICF0aGlzLnBhcnNpbmdUeXBlM0ZvbnQpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIiIuY29uY2F0KHBhcnRpYWxNc2csICIuIikpOworICAgICAgICAgIHJldHVybiBlcnJvckZvbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRNaXNzaW5nCisgICAgICAgIH0pOworICAgICAgICAoMCwgX3V0aWwud2FybikoIiIuY29uY2F0KHBhcnRpYWxNc2csICIgLS0gYXR0ZW1wdGluZyB0byBmYWxsYmFjayB0byBhIGRlZmF1bHQgZm9udC4iKSk7CisgICAgICAgIGZvbnRSZWYgPSBQYXJ0aWFsRXZhbHVhdG9yLmZhbGxiYWNrRm9udERpY3Q7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmZvbnRDYWNoZS5oYXMoZm9udFJlZikpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250UmVmKTsKKyAgICAgIH0KKworICAgICAgZm9udCA9IHhyZWYuZmV0Y2hJZlJlZihmb250UmVmKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShmb250KSkgeworICAgICAgICByZXR1cm4gZXJyb3JGb250KCk7CisgICAgICB9CisKKyAgICAgIGlmIChmb250LnRyYW5zbGF0ZWQpIHsKKyAgICAgICAgcmV0dXJuIGZvbnQudHJhbnNsYXRlZDsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgdmFyIHByZUV2YWx1YXRlZEZvbnQgPSB0aGlzLnByZUV2YWx1YXRlRm9udChmb250KTsKKyAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJlRXZhbHVhdGVkRm9udC5kZXNjcmlwdG9yLAorICAgICAgICAgIGhhc2ggPSBwcmVFdmFsdWF0ZWRGb250Lmhhc2g7CisgICAgICB2YXIgZm9udFJlZklzUmVmID0gKDAsIF9wcmltaXRpdmVzLmlzUmVmKShmb250UmVmKSwKKyAgICAgICAgICBmb250SUQ7CisKKyAgICAgIGlmIChmb250UmVmSXNSZWYpIHsKKyAgICAgICAgZm9udElEID0gImYiLmNvbmNhdChmb250UmVmLnRvU3RyaW5nKCkpOworICAgICAgfQorCisgICAgICBpZiAoaGFzaCAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkZXNjcmlwdG9yKSkgeworICAgICAgICBpZiAoIWRlc2NyaXB0b3IuZm9udEFsaWFzZXMpIHsKKyAgICAgICAgICBkZXNjcmlwdG9yLmZvbnRBbGlhc2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmb250QWxpYXNlcyA9IGRlc2NyaXB0b3IuZm9udEFsaWFzZXM7CisKKyAgICAgICAgaWYgKGZvbnRBbGlhc2VzW2hhc2hdKSB7CisgICAgICAgICAgdmFyIGFsaWFzRm9udFJlZiA9IGZvbnRBbGlhc2VzW2hhc2hdLmFsaWFzUmVmOworCisgICAgICAgICAgaWYgKGZvbnRSZWZJc1JlZiAmJiBhbGlhc0ZvbnRSZWYgJiYgdGhpcy5mb250Q2FjaGUuaGFzKGFsaWFzRm9udFJlZikpIHsKKyAgICAgICAgICAgIHRoaXMuZm9udENhY2hlLnB1dEFsaWFzKGZvbnRSZWYsIGFsaWFzRm9udFJlZik7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnRSZWYpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb250QWxpYXNlc1toYXNoXSA9IHsKKyAgICAgICAgICAgIGZvbnRJRDogdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCkKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvbnRSZWZJc1JlZikgeworICAgICAgICAgIGZvbnRBbGlhc2VzW2hhc2hdLmFsaWFzUmVmID0gZm9udFJlZjsKKyAgICAgICAgfQorCisgICAgICAgIGZvbnRJRCA9IGZvbnRBbGlhc2VzW2hhc2hdLmZvbnRJRDsKKyAgICAgIH0KKworICAgICAgaWYgKGZvbnRSZWZJc1JlZikgeworICAgICAgICB0aGlzLmZvbnRDYWNoZS5wdXQoZm9udFJlZiwgZm9udENhcGFiaWxpdHkucHJvbWlzZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWZvbnRJRCkgeworICAgICAgICAgIGZvbnRJRCA9IHRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5mb250Q2FjaGUucHV0KCJpZF8iLmNvbmNhdChmb250SUQpLCBmb250Q2FwYWJpbGl0eS5wcm9taXNlKTsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmFzc2VydCkoZm9udElEICYmIGZvbnRJRC5zdGFydHNXaXRoKCJmIiksICdUaGUgImZvbnRJRCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLicpOworICAgICAgZm9udC5sb2FkZWROYW1lID0gIiIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmdldERvY0lkKCksICJfIikuY29uY2F0KGZvbnRJRCk7CisgICAgICBmb250LnRyYW5zbGF0ZWQgPSBmb250Q2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgdmFyIHRyYW5zbGF0ZWRQcm9taXNlOworCisgICAgICB0cnkgeworICAgICAgICB0cmFuc2xhdGVkUHJvbWlzZSA9IHRoaXMudHJhbnNsYXRlRm9udChwcmVFdmFsdWF0ZWRGb250KTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgdHJhbnNsYXRlZFByb21pc2UgPSBQcm9taXNlLnJlamVjdChlKTsKKyAgICAgIH0KKworICAgICAgdHJhbnNsYXRlZFByb21pc2UudGhlbihmdW5jdGlvbiAodHJhbnNsYXRlZEZvbnQpIHsKKyAgICAgICAgaWYgKHRyYW5zbGF0ZWRGb250LmZvbnRUeXBlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB2YXIgeHJlZkZvbnRTdGF0cyA9IHhyZWYuc3RhdHMuZm9udFR5cGVzOworICAgICAgICAgIHhyZWZGb250U3RhdHNbdHJhbnNsYXRlZEZvbnQuZm9udFR5cGVdID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvbnRDYXBhYmlsaXR5LnJlc29sdmUobmV3IFRyYW5zbGF0ZWRGb250KHsKKyAgICAgICAgICBsb2FkZWROYW1lOiBmb250LmxvYWRlZE5hbWUsCisgICAgICAgICAgZm9udDogdHJhbnNsYXRlZEZvbnQsCisgICAgICAgICAgZGljdDogZm9udCwKKyAgICAgICAgICBleHRyYVByb3BlcnRpZXM6IF90aGlzNS5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMKKyAgICAgICAgfSkpOworICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBfdGhpczUuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRUcmFuc2xhdGUKKyAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB2YXIgZm9udEZpbGUzID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmdldCgiRm9udEZpbGUzIik7CisgICAgICAgICAgdmFyIHN1YnR5cGUgPSBmb250RmlsZTMgJiYgZm9udEZpbGUzLmdldCgiU3VidHlwZSIpOworICAgICAgICAgIHZhciBmb250VHlwZSA9ICgwLCBfZm9udHMuZ2V0Rm9udFR5cGUpKHByZUV2YWx1YXRlZEZvbnQudHlwZSwgc3VidHlwZSAmJiBzdWJ0eXBlLm5hbWUpOworICAgICAgICAgIHZhciB4cmVmRm9udFN0YXRzID0geHJlZi5zdGF0cy5mb250VHlwZXM7CisgICAgICAgICAgeHJlZkZvbnRTdGF0c1tmb250VHlwZV0gPSB0cnVlOworICAgICAgICB9IGNhdGNoIChleCkge30KKworICAgICAgICBmb250Q2FwYWJpbGl0eS5yZXNvbHZlKG5ldyBUcmFuc2xhdGVkRm9udCh7CisgICAgICAgICAgbG9hZGVkTmFtZTogZm9udC5sb2FkZWROYW1lLAorICAgICAgICAgIGZvbnQ6IG5ldyBfZm9udHMuRXJyb3JGb250KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uLm1lc3NhZ2UgOiByZWFzb24pLAorICAgICAgICAgIGRpY3Q6IGZvbnQsCisgICAgICAgICAgZXh0cmFQcm9wZXJ0aWVzOiBfdGhpczUub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzCisgICAgICAgIH0pKTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIGZvbnRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYnVpbGRQYXRoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRQYXRoKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MpIHsKKyAgICAgIHZhciBwYXJzaW5nVGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7CisgICAgICB2YXIgbGFzdEluZGV4ID0gb3BlcmF0b3JMaXN0Lmxlbmd0aCAtIDE7CisKKyAgICAgIGlmICghYXJncykgeworICAgICAgICBhcmdzID0gW107CisgICAgICB9CisKKyAgICAgIGlmIChsYXN0SW5kZXggPCAwIHx8IG9wZXJhdG9yTGlzdC5mbkFycmF5W2xhc3RJbmRleF0gIT09IF91dGlsLk9QUy5jb25zdHJ1Y3RQYXRoKSB7CisgICAgICAgIGlmIChwYXJzaW5nVGV4dCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRW5jb3VudGVyZWQgcGF0aCBvcGVyYXRvciBcIiIuY29uY2F0KGZuLCAiXCIgaW5zaWRlIG9mIGEgdGV4dCBvYmplY3QuIikpOworICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2F2ZSwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLmNvbnN0cnVjdFBhdGgsIFtbZm5dLCBhcmdzXSk7CisKKyAgICAgICAgaWYgKHBhcnNpbmdUZXh0KSB7CisgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5yZXN0b3JlLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIG9wQXJncyA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXlbbGFzdEluZGV4XTsKKyAgICAgICAgb3BBcmdzWzBdLnB1c2goZm4pOworICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShvcEFyZ3NbMV0sIGFyZ3MpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInBhcnNlQ29sb3JTcGFjZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlQ29sb3JTcGFjZShfcmVmNSkgeworICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CisKKyAgICAgIHZhciBjcyA9IF9yZWY1LmNzLAorICAgICAgICAgIHJlc291cmNlcyA9IF9yZWY1LnJlc291cmNlcywKKyAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSA9IF9yZWY1LmxvY2FsQ29sb3JTcGFjZUNhY2hlOworICAgICAgcmV0dXJuIF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2VBc3luYyh7CisgICAgICAgIGNzOiBjcywKKyAgICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcywKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfdGhpczYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICBfdGhpczYuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yQ29sb3JTcGFjZQorICAgICAgICAgIH0pOworCisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZUNvbG9yU3BhY2UgLSBpZ25vcmluZyBDb2xvclNwYWNlOiBcIiIuY29uY2F0KHJlYXNvbiwgIlwiLiIpKTsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImhhbmRsZUNvbG9yTiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfaGFuZGxlQ29sb3JOID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgICAgICB2YXIgcGF0dGVybk5hbWUsIHBhdHRlcm4sIGRpY3QsIHR5cGVOdW0sIGNvbG9yLCBzaGFkaW5nLCBtYXRyaXg7CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBwYXR0ZXJuTmFtZSA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTsKKworICAgICAgICAgICAgICAgIGlmICghKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHBhdHRlcm5OYW1lKSAmJiAocGF0dGVybiA9IHBhdHRlcm5zLmdldChwYXR0ZXJuTmFtZS5uYW1lKSkpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDE2OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGljdCA9ICgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkocGF0dGVybikgPyBwYXR0ZXJuLmRpY3QgOiBwYXR0ZXJuOworICAgICAgICAgICAgICAgIHR5cGVOdW0gPSBkaWN0LmdldCgiUGF0dGVyblR5cGUiKTsKKworICAgICAgICAgICAgICAgIGlmICghKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlRJTElORykpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gOTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbG9yID0gY3MuYmFzZSA/IGNzLmJhc2UuZ2V0UmdiKGFyZ3MsIDApIDogbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgicmV0dXJuIiwgdGhpcy5oYW5kbGVUaWxpbmdUeXBlKGZuLCBjb2xvciwgcmVzb3VyY2VzLCBwYXR0ZXJuLCBkaWN0LCBvcGVyYXRvckxpc3QsIHRhc2spKTsKKworICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgaWYgKCEodHlwZU51bSA9PT0gUGF0dGVyblR5cGUuU0hBRElORykpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMTU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaGFkaW5nID0gZGljdC5nZXQoIlNoYWRpbmciKTsKKyAgICAgICAgICAgICAgICBtYXRyaXggPSBkaWN0LmdldEFycmF5KCJNYXRyaXgiKTsKKyAgICAgICAgICAgICAgICBwYXR0ZXJuID0gX3BhdHRlcm4uUGF0dGVybi5wYXJzZVNoYWRpbmcoc2hhZGluZywgbWF0cml4LCB0aGlzLnhyZWYsIHJlc291cmNlcywgdGhpcy5oYW5kbGVyLCB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKyAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHBhdHRlcm4uZ2V0SVIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoInJldHVybiIsIHVuZGVmaW5lZCk7CisKKyAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVua25vd24gUGF0dGVyblR5cGU6ICIuY29uY2F0KHR5cGVOdW0pKTsKKworICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBQYXR0ZXJuTmFtZTogIi5jb25jYXQocGF0dGVybk5hbWUpKTsKKworICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTUsIHRoaXMpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBoYW5kbGVDb2xvck4oX3gxMSwgX3gxMiwgX3gxMywgX3gxNCwgX3gxNSwgX3gxNiwgX3gxNywgX3gxOCkgeworICAgICAgICByZXR1cm4gX2hhbmRsZUNvbG9yTi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gaGFuZGxlQ29sb3JOOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAicGFyc2VNYXJrZWRDb250ZW50UHJvcHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3BhcnNlTWFya2VkQ29udGVudFByb3BzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KGNvbnRlbnRQcm9wZXJ0aWVzLCByZXNvdXJjZXMpIHsKKyAgICAgICAgdmFyIG9wdGlvbmFsQ29udGVudCwgcHJvcGVydGllcywgb3B0aW9uYWxDb250ZW50VHlwZSwgb3B0aW9uYWxDb250ZW50R3JvdXBzLCBncm91cElkcywgZXhwcmVzc2lvbjsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTYkKF9jb250ZXh0NikgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoY29udGVudFByb3BlcnRpZXMpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gcmVzb3VyY2VzLmdldCgiUHJvcGVydGllcyIpOworICAgICAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudCA9IHByb3BlcnRpZXMuZ2V0KGNvbnRlbnRQcm9wZXJ0aWVzLm5hbWUpOworICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY29udGVudFByb3BlcnRpZXMpKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcHRpb25hbENvbnRlbnQgPSBjb250ZW50UHJvcGVydGllczsKKyAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDEwOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk9wdGlvbmFsIGNvbnRlbnQgcHJvcGVydGllcyBtYWxmb3JtZWQuIik7CisKKyAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICBvcHRpb25hbENvbnRlbnRUeXBlID0gb3B0aW9uYWxDb250ZW50LmdldCgiVHlwZSIpLm5hbWU7CisKKyAgICAgICAgICAgICAgICBpZiAoIShvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NHIikpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgIGlkOiBvcHRpb25hbENvbnRlbnQub2JqSWQKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIGlmICghKG9wdGlvbmFsQ29udGVudFR5cGUgPT09ICJPQ01EIikpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMjc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcHRpb25hbENvbnRlbnRHcm91cHMgPSBvcHRpb25hbENvbnRlbnQuZ2V0KCJPQ0dzIik7CisKKyAgICAgICAgICAgICAgICBpZiAoIShBcnJheS5pc0FycmF5KG9wdGlvbmFsQ29udGVudEdyb3VwcykgfHwgKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob3B0aW9uYWxDb250ZW50R3JvdXBzKSkpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMjU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBncm91cElkcyA9IFtdOworCisgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSkgeworICAgICAgICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50LmdldCgiT0NHcyIpLmZvckVhY2goZnVuY3Rpb24gKG9jZykgeworICAgICAgICAgICAgICAgICAgICBncm91cElkcy5wdXNoKG9jZy50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBncm91cElkcy5wdXNoKG9wdGlvbmFsQ29udGVudEdyb3Vwcy5vYmpJZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWxDb250ZW50LmdldCgiVkUiKSkgeworICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICBpZHM6IGdyb3VwSWRzLAorICAgICAgICAgICAgICAgICAgcG9saWN5OiAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShvcHRpb25hbENvbnRlbnQuZ2V0KCJQIikpID8gb3B0aW9uYWxDb250ZW50LmdldCgiUCIpLm5hbWUgOiBudWxsLAorICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKG9wdGlvbmFsQ29udGVudEdyb3VwcykpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMjc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgIGlkOiBvcHRpb25hbENvbnRlbnRHcm91cHMudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoInJldHVybiIsIG51bGwpOworCisgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgIGNhc2UgImVuZCI6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlNik7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIHBhcnNlTWFya2VkQ29udGVudFByb3BzKF94MTksIF94MjApIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZU1hcmtlZENvbnRlbnRQcm9wcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gcGFyc2VNYXJrZWRDb250ZW50UHJvcHM7CisgICAgfSgpCisgIH0sIHsKKyAgICBrZXk6ICJnZXRPcGVyYXRvckxpc3QiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPcGVyYXRvckxpc3QoX3JlZjYpIHsKKyAgICAgIHZhciBfdGhpczcgPSB0aGlzOworCisgICAgICB2YXIgc3RyZWFtID0gX3JlZjYuc3RyZWFtLAorICAgICAgICAgIHRhc2sgPSBfcmVmNi50YXNrLAorICAgICAgICAgIHJlc291cmNlcyA9IF9yZWY2LnJlc291cmNlcywKKyAgICAgICAgICBvcGVyYXRvckxpc3QgPSBfcmVmNi5vcGVyYXRvckxpc3QsCisgICAgICAgICAgX3JlZjYkaW5pdGlhbFN0YXRlID0gX3JlZjYuaW5pdGlhbFN0YXRlLAorICAgICAgICAgIGluaXRpYWxTdGF0ZSA9IF9yZWY2JGluaXRpYWxTdGF0ZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY2JGluaXRpYWxTdGF0ZTsKKyAgICAgIHJlc291cmNlcyA9IHJlc291cmNlcyB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworICAgICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlIHx8IG5ldyBFdmFsU3RhdGUoKTsKKworICAgICAgaWYgKCFvcGVyYXRvckxpc3QpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRPcGVyYXRvckxpc3Q6IG1pc3NpbmcgIm9wZXJhdG9yTGlzdCIgcGFyYW1ldGVyJyk7CisgICAgICB9CisKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIHZhciB4cmVmID0gdGhpcy54cmVmOworICAgICAgdmFyIHBhcnNpbmdUZXh0ID0gZmFsc2U7CisgICAgICB2YXIgbG9jYWxJbWFnZUNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEltYWdlQ2FjaGUoKTsKKyAgICAgIHZhciBsb2NhbENvbG9yU3BhY2VDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTsKKyAgICAgIHZhciBsb2NhbEdTdGF0ZUNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEdTdGF0ZUNhY2hlKCk7CisKKyAgICAgIHZhciB4b2JqcyA9IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworCisgICAgICB2YXIgcGF0dGVybnMgPSByZXNvdXJjZXMuZ2V0KCJQYXR0ZXJuIikgfHwgX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKKworICAgICAgdmFyIHN0YXRlTWFuYWdlciA9IG5ldyBTdGF0ZU1hbmFnZXIoaW5pdGlhbFN0YXRlKTsKKyAgICAgIHZhciBwcmVwcm9jZXNzb3IgPSBuZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKTsKKyAgICAgIHZhciB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CisKKyAgICAgIGZ1bmN0aW9uIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoYXJndW1lbnQpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcHJlcHJvY2Vzc29yLnNhdmVkU3RhdGVzRGVwdGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5yZXN0b3JlLCBbXSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCkgeworICAgICAgICB2YXIgbmV4dCA9IGZ1bmN0aW9uIG5leHQocHJvbWlzZSkgeworICAgICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBvcGVyYXRvckxpc3QucmVhZHldKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgICByZWplY3QoZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHJlamVjdCk7CisgICAgICAgIH07CisKKyAgICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisgICAgICAgIHRpbWVTbG90TWFuYWdlci5yZXNldCgpOworICAgICAgICB2YXIgc3RvcCwKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9IHt9LAorICAgICAgICAgICAgaSwKKyAgICAgICAgICAgIGlpLAorICAgICAgICAgICAgY3MsCisgICAgICAgICAgICBuYW1lOworCisgICAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKKyAgICAgICAgICBvcGVyYXRpb24uYXJncyA9IG51bGw7CisKKyAgICAgICAgICBpZiAoIXByZXByb2Nlc3Nvci5yZWFkKG9wZXJhdGlvbikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBhcmdzID0gb3BlcmF0aW9uLmFyZ3M7CisgICAgICAgICAgdmFyIGZuID0gb3BlcmF0aW9uLmZuOworCisgICAgICAgICAgc3dpdGNoIChmbiB8IDApIHsKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50WE9iamVjdDoKKyAgICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKKworICAgICAgICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgICAgIHZhciBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5TmFtZShuYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChsb2NhbEltYWdlKSB7CisgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AobG9jYWxJbWFnZS5mbiwgbG9jYWxJbWFnZS5hcmdzKTsKKyAgICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiWE9iamVjdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoeG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgeworICAgICAgICAgICAgICAgICAgdmFyIF9sb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5UmVmKHhvYmopOworCisgICAgICAgICAgICAgICAgICBpZiAoX2xvY2FsSW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF9sb2NhbEltYWdlLmZuLCBfbG9jYWxJbWFnZS5hcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB2YXIgZ2xvYmFsSW1hZ2UgPSBzZWxmLmdsb2JhbEltYWdlQ2FjaGUuZ2V0RGF0YSh4b2JqLCBzZWxmLnBhZ2VJbmRleCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxJbWFnZSkgeworICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShnbG9iYWxJbWFnZS5vYmpJZCk7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChnbG9iYWxJbWFnZS5mbiwgZ2xvYmFsSW1hZ2UuYXJncyk7CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgeG9iaiA9IHhyZWYuZmV0Y2goeG9iaik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKHhvYmopKSB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB4b2JqLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CisKKyAgICAgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lID09PSAiRm9ybSIpIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zYXZlKCk7CisgICAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkRm9ybVhPYmplY3QocmVzb3VyY2VzLCB4b2JqLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZS5jbG9uZSgpLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5yZXN0b3JlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICB9LCByZWplY3RYT2JqZWN0KTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUubmFtZSA9PT0gIkltYWdlIikgeworICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgIGltYWdlOiB4b2JqLAorICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wZXJhdG9yTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXk6IG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZTogbG9jYWxJbWFnZUNhY2hlLAorICAgICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSAiUFMiKSB7CisgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIklnbm9yZWQgWE9iamVjdCBzdWJ0eXBlIFBTIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5oYW5kbGVkIFhPYmplY3Qgc3VidHlwZSAiLmNvbmNhdCh0eXBlLm5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOworICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JYT2JqZWN0CisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgWE9iamVjdDogXCIiLmNvbmNhdChyZWFzb24sICJcIi4iKSk7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0Rm9udDoKKyAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gYXJnc1sxXTsKKyAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBhcmdzLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZSkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkgeworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KGxvYWRlZE5hbWUpOworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0Rm9udCwgW2xvYWRlZE5hbWUsIGZvbnRTaXplXSk7CisgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpblRleHQ6CisgICAgICAgICAgICAgIHBhcnNpbmdUZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZFRleHQ6CisgICAgICAgICAgICAgIHBhcnNpbmdUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRJbmxpbmVJbWFnZToKKyAgICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gYXJnc1swXS5jYWNoZUtleTsKKworICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkpIHsKKyAgICAgICAgICAgICAgICB2YXIgX2xvY2FsSW1hZ2UyID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5TmFtZShjYWNoZUtleSk7CisKKyAgICAgICAgICAgICAgICBpZiAoX2xvY2FsSW1hZ2UyKSB7CisgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX2xvY2FsSW1hZ2UyLmZuLCBfbG9jYWxJbWFnZTIuYXJncyk7CisgICAgICAgICAgICAgICAgICBhcmdzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG5leHQoc2VsZi5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcywKKyAgICAgICAgICAgICAgICBpbWFnZTogYXJnc1swXSwKKyAgICAgICAgICAgICAgICBpc0lubGluZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wZXJhdG9yTGlzdCwKKyAgICAgICAgICAgICAgICBjYWNoZUtleTogY2FjaGVLZXksCisgICAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlOiBsb2NhbEltYWdlQ2FjaGUsCisgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93VGV4dDoKKyAgICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93U3BhY2VkVGV4dDoKKyAgICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgYXJyID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgdmFyIGNvbWJpbmVkR2x5cGhzID0gW107CisgICAgICAgICAgICAgIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoOworICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGU7CisKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyckxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgdmFyIGFyckl0ZW0gPSBhcnJbaV07CisKKyAgICAgICAgICAgICAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShhcnJJdGVtKSkgeworICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoY29tYmluZWRHbHlwaHMsIHNlbGYuaGFuZGxlVGV4dChhcnJJdGVtLCBzdGF0ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzTnVtKShhcnJJdGVtKSkgeworICAgICAgICAgICAgICAgICAgY29tYmluZWRHbHlwaHMucHVzaChhcnJJdGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhcmdzWzBdID0gY29tYmluZWRHbHlwaHM7CisgICAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNob3dUZXh0OworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmVTaG93VGV4dDoKKyAgICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLm5leHRMaW5lKTsKKyAgICAgICAgICAgICAgYXJnc1swXSA9IHNlbGYuaGFuZGxlVGV4dChhcmdzWzBdLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaG93VGV4dDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OgorICAgICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CisgICAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMubmV4dExpbmUpOworICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNldFdvcmRTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7CisgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0Q2hhclNwYWNpbmcsIFthcmdzLnNoaWZ0KCldKTsKKyAgICAgICAgICAgICAgYXJnc1swXSA9IHNlbGYuaGFuZGxlVGV4dChhcmdzWzBdLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaG93VGV4dDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOgorICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgPSBhcmdzWzBdOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbENvbG9yU3BhY2U6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2FjaGVkQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKGFyZ3NbMF0sIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKworICAgICAgICAgICAgICAgIGlmIChjYWNoZWRDb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBjYWNoZWRDb2xvclNwYWNlOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlQ29sb3JTcGFjZSh7CisgICAgICAgICAgICAgICAgICBjczogYXJnc1swXSwKKyAgICAgICAgICAgICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29sb3JTcGFjZSkgeworICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yU3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gY29sb3JTcGFjZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yU3BhY2U6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgX2NhY2hlZENvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLmdldENhY2hlZChhcmdzWzBdLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoX2NhY2hlZENvbG9yU3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gX2NhY2hlZENvbG9yU3BhY2U7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuZXh0KHNlbGYucGFyc2VDb2xvclNwYWNlKHsKKyAgICAgICAgICAgICAgICAgIGNzOiBhcmdzWzBdLAorICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgICBpZiAoY29sb3JTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3I6CisgICAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlOworICAgICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOworICAgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDb2xvcjoKKyAgICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZTsKKyAgICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsR3JheToKKyAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CisgICAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUdyYXk6CisgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CisgICAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbENNWUtDb2xvcjoKKyAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWs7CisgICAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNNWUtDb2xvcjoKKyAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215azsKKyAgICAgICAgICAgICAgYXJncyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I6CisgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7CisgICAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOgorICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7CisgICAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDb2xvck46CisgICAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlOworCisgICAgICAgICAgICAgIGlmIChjcy5uYW1lID09PSAiUGF0dGVybiIpIHsKKyAgICAgICAgICAgICAgICBuZXh0KHNlbGYuaGFuZGxlQ29sb3JOKG9wZXJhdG9yTGlzdCwgX3V0aWwuT1BTLnNldEZpbGxDb2xvck4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yTjoKKyAgICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZTsKKworICAgICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CisgICAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIF91dGlsLk9QUy5zZXRTdHJva2VDb2xvck4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hhZGluZ0ZpbGw6CisgICAgICAgICAgICAgIHZhciBzaGFkaW5nUmVzID0gcmVzb3VyY2VzLmdldCgiU2hhZGluZyIpOworCisgICAgICAgICAgICAgIGlmICghc2hhZGluZ1JlcykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm8gc2hhZGluZyByZXNvdXJjZSBmb3VuZCIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIHNoYWRpbmcgPSBzaGFkaW5nUmVzLmdldChhcmdzWzBdLm5hbWUpOworCisgICAgICAgICAgICAgIGlmICghc2hhZGluZykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBzaGFkaW5nRmlsbCA9IF9wYXR0ZXJuLlBhdHRlcm4ucGFyc2VTaGFkaW5nKHNoYWRpbmcsIG51bGwsIHhyZWYsIHJlc291cmNlcywgc2VsZi5oYW5kbGVyLCBzZWxmLl9wZGZGdW5jdGlvbkZhY3RvcnksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKworICAgICAgICAgICAgICB2YXIgcGF0dGVybklSID0gc2hhZGluZ0ZpbGwuZ2V0SVIoKTsKKyAgICAgICAgICAgICAgYXJncyA9IFtwYXR0ZXJuSVJdOworICAgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaGFkaW5nRmlsbDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEdTdGF0ZToKKyAgICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKKworICAgICAgICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgICAgIHZhciBsb2NhbEdTdGF0ZU9iaiA9IGxvY2FsR1N0YXRlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsR1N0YXRlT2JqKSB7CisgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHU3RhdGVPYmoubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNldEdTdGF0ZSwgW2xvY2FsR1N0YXRlT2JqXSk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGV4dEdTdGF0ZSA9IHJlc291cmNlcy5nZXQoIkV4dEdTdGF0ZSIpOworCisgICAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIShnU3RhdGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzZWxmLnNldEdTdGF0ZSh7CisgICAgICAgICAgICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgIGdTdGF0ZTogZ1N0YXRlLAorICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0OiBvcGVyYXRvckxpc3QsCisgICAgICAgICAgICAgICAgICBjYWNoZUtleTogbmFtZSwKKyAgICAgICAgICAgICAgICAgIHRhc2s6IHRhc2ssCisgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXI6IHN0YXRlTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgIGxvY2FsR1N0YXRlQ2FjaGU6IGxvY2FsR1N0YXRlQ2FjaGUsCisgICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgICB9KS50aGVuKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSk7CisgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckV4dEdTdGF0ZQorICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoImdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogXCIiLmNvbmNhdChyZWFzb24sICJcIi4iKSk7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRvOgorICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubGluZVRvOgorICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzoKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8yOgorICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzM6CisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVBhdGg6CisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5yZWN0YW5nbGU6CisgICAgICAgICAgICAgIHNlbGYuYnVpbGRQYXRoKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIHBhcnNpbmdUZXh0KTsKKyAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1hcmtQb2ludDoKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1hcmtQb2ludFByb3BzOgorICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5Db21wYXQ6CisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRDb21wYXQ6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wczoKKyAgICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShhcmdzWzBdKSkgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRXhwZWN0ZWQgbmFtZSBmb3IgYmVnaW5NYXJrZWRDb250ZW50UHJvcHMgYXJnMD0iLmNvbmNhdChhcmdzWzBdKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoYXJnc1swXS5uYW1lID09PSAiT0MiKSB7CisgICAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcykudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIGRhdGFdKTsKKyAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIiwgeworICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JNYXJrZWRDb250ZW50CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoImdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiBcIiIuY29uY2F0KHJlYXNvbiwgIlwiLiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB0aHJvdyByZWFzb247CisgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1swXS5uYW1lXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudDoKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZE1hcmtlZENvbnRlbnQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGlpID0gYXJncy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGkgPCBpaSkgeworICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBvcGVyYXRvcjogIiArIGZuKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgfQorCisgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCBhcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdG9wKSB7CisgICAgICAgICAgbmV4dChkZWZlcnJlZCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2VQZW5kaW5nUmVzdG9yZU9QUygpOworICAgICAgICByZXNvbHZlKCk7CisgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfdGhpczcub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICBfdGhpczcuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yT3BlcmF0b3JMaXN0CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoImdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGVycm9ycyBkdXJpbmcgXCIiLmNvbmNhdCh0YXNrLm5hbWUsICJcIiAiKSArICJ0YXNrOiBcIiIuY29uY2F0KHJlYXNvbiwgIlwiLiIpKTsKKyAgICAgICAgICBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0VGV4dENvbnRlbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUZXh0Q29udGVudChfcmVmNykgeworICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CisKKyAgICAgIHZhciBzdHJlYW0gPSBfcmVmNy5zdHJlYW0sCisgICAgICAgICAgdGFzayA9IF9yZWY3LnRhc2ssCisgICAgICAgICAgcmVzb3VyY2VzID0gX3JlZjcucmVzb3VyY2VzLAorICAgICAgICAgIF9yZWY3JHN0YXRlTWFuYWdlciA9IF9yZWY3LnN0YXRlTWFuYWdlciwKKyAgICAgICAgICBzdGF0ZU1hbmFnZXIgPSBfcmVmNyRzdGF0ZU1hbmFnZXIgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNyRzdGF0ZU1hbmFnZXIsCisgICAgICAgICAgX3JlZjckbm9ybWFsaXplV2hpdGVzID0gX3JlZjcubm9ybWFsaXplV2hpdGVzcGFjZSwKKyAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlID0gX3JlZjckbm9ybWFsaXplV2hpdGVzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWY3JG5vcm1hbGl6ZVdoaXRlcywKKyAgICAgICAgICBfcmVmNyRjb21iaW5lVGV4dEl0ZW0gPSBfcmVmNy5jb21iaW5lVGV4dEl0ZW1zLAorICAgICAgICAgIGNvbWJpbmVUZXh0SXRlbXMgPSBfcmVmNyRjb21iaW5lVGV4dEl0ZW0gPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjckY29tYmluZVRleHRJdGVtLAorICAgICAgICAgIHNpbmsgPSBfcmVmNy5zaW5rLAorICAgICAgICAgIF9yZWY3JHNlZW5TdHlsZXMgPSBfcmVmNy5zZWVuU3R5bGVzLAorICAgICAgICAgIHNlZW5TdHlsZXMgPSBfcmVmNyRzZWVuU3R5bGVzID09PSB2b2lkIDAgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogX3JlZjckc2VlblN0eWxlczsKKyAgICAgIHJlc291cmNlcyA9IHJlc291cmNlcyB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworICAgICAgc3RhdGVNYW5hZ2VyID0gc3RhdGVNYW5hZ2VyIHx8IG5ldyBTdGF0ZU1hbmFnZXIobmV3IFRleHRTdGF0ZSgpKTsKKyAgICAgIHZhciBXaGl0ZXNwYWNlUmVnZXhwID0gL1xzL2c7CisgICAgICB2YXIgdGV4dENvbnRlbnQgPSB7CisgICAgICAgIGl0ZW1zOiBbXSwKKyAgICAgICAgc3R5bGVzOiBPYmplY3QuY3JlYXRlKG51bGwpCisgICAgICB9OworICAgICAgdmFyIHRleHRDb250ZW50SXRlbSA9IHsKKyAgICAgICAgaW5pdGlhbGl6ZWQ6IGZhbHNlLAorICAgICAgICBzdHI6IFtdLAorICAgICAgICB3aWR0aDogMCwKKyAgICAgICAgaGVpZ2h0OiAwLAorICAgICAgICB2ZXJ0aWNhbDogZmFsc2UsCisgICAgICAgIGxhc3RBZHZhbmNlV2lkdGg6IDAsCisgICAgICAgIGxhc3RBZHZhbmNlSGVpZ2h0OiAwLAorICAgICAgICB0ZXh0QWR2YW5jZVNjYWxlOiAwLAorICAgICAgICBzcGFjZVdpZHRoOiAwLAorICAgICAgICBmYWtlU3BhY2VNaW46IEluZmluaXR5LAorICAgICAgICBmYWtlTXVsdGlTcGFjZU1pbjogSW5maW5pdHksCisgICAgICAgIGZha2VNdWx0aVNwYWNlTWF4OiAtMCwKKyAgICAgICAgdGV4dFJ1bkJyZWFrQWxsb3dlZDogZmFsc2UsCisgICAgICAgIHRyYW5zZm9ybTogbnVsbCwKKyAgICAgICAgZm9udE5hbWU6IG51bGwKKyAgICAgIH07CisgICAgICB2YXIgU1BBQ0VfRkFDVE9SID0gMC4zOworICAgICAgdmFyIE1VTFRJX1NQQUNFX0ZBQ1RPUiA9IDEuNTsKKyAgICAgIHZhciBNVUxUSV9TUEFDRV9GQUNUT1JfTUFYID0gNDsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIHZhciB4cmVmID0gdGhpcy54cmVmOworICAgICAgdmFyIHhvYmpzID0gbnVsbDsKKyAgICAgIHZhciBlbXB0eVhPYmplY3RDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxJbWFnZUNhY2hlKCk7CisgICAgICB2YXIgZW1wdHlHU3RhdGVDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxHU3RhdGVDYWNoZSgpOworICAgICAgdmFyIHByZXByb2Nlc3NvciA9IG5ldyBFdmFsdWF0b3JQcmVwcm9jZXNzb3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIpOworICAgICAgdmFyIHRleHRTdGF0ZTsKKworICAgICAgZnVuY3Rpb24gZW5zdXJlVGV4dENvbnRlbnRJdGVtKCkgeworICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CisgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50SXRlbTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmb250ID0gdGV4dFN0YXRlLmZvbnQ7CisKKyAgICAgICAgaWYgKCEoZm9udC5sb2FkZWROYW1lIGluIHNlZW5TdHlsZXMpKSB7CisgICAgICAgICAgc2VlblN0eWxlc1tmb250LmxvYWRlZE5hbWVdID0gdHJ1ZTsKKyAgICAgICAgICB0ZXh0Q29udGVudC5zdHlsZXNbZm9udC5sb2FkZWROYW1lXSA9IHsKKyAgICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQuZmFsbGJhY2tOYW1lLAorICAgICAgICAgICAgYXNjZW50OiBmb250LmFzY2VudCwKKyAgICAgICAgICAgIGRlc2NlbnQ6IGZvbnQuZGVzY2VudCwKKyAgICAgICAgICAgIHZlcnRpY2FsOiBmb250LnZlcnRpY2FsCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHRleHRDb250ZW50SXRlbS5mb250TmFtZSA9IGZvbnQubG9hZGVkTmFtZTsKKyAgICAgICAgdmFyIHRzbSA9IFt0ZXh0U3RhdGUuZm9udFNpemUgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCwgMCwgdGV4dFN0YXRlLmZvbnRTaXplLCAwLCB0ZXh0U3RhdGUudGV4dFJpc2VdOworCisgICAgICAgIGlmIChmb250LmlzVHlwZTNGb250ICYmIHRleHRTdGF0ZS5mb250U2l6ZSA8PSAxICYmICEoMCwgX3V0aWwuaXNBcnJheUVxdWFsKSh0ZXh0U3RhdGUuZm9udE1hdHJpeCwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVgpKSB7CisgICAgICAgICAgdmFyIGdseXBoSGVpZ2h0ID0gZm9udC5iYm94WzNdIC0gZm9udC5iYm94WzFdOworCisgICAgICAgICAgaWYgKGdseXBoSGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgdHNtWzNdICo9IGdseXBoSGVpZ2h0ICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbM107CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIHRybSA9IF91dGlsLlV0aWwudHJhbnNmb3JtKHRleHRTdGF0ZS5jdG0sIF91dGlsLlV0aWwudHJhbnNmb3JtKHRleHRTdGF0ZS50ZXh0TWF0cml4LCB0c20pKTsKKworICAgICAgICB0ZXh0Q29udGVudEl0ZW0udHJhbnNmb3JtID0gdHJtOworCisgICAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgeworICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IDA7CisgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IE1hdGguc3FydCh0cm1bMl0gKiB0cm1bMl0gKyB0cm1bM10gKiB0cm1bM10pOworICAgICAgICAgIHRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IE1hdGguc3FydCh0cm1bMF0gKiB0cm1bMF0gKyB0cm1bMV0gKiB0cm1bMV0pOworICAgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgPSAwOworICAgICAgICAgIHRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYSA9IHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeFswXTsKKyAgICAgICAgdmFyIGIgPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMV07CisgICAgICAgIHZhciBzY2FsZUxpbmVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpOworICAgICAgICBhID0gdGV4dFN0YXRlLmN0bVswXTsKKyAgICAgICAgYiA9IHRleHRTdGF0ZS5jdG1bMV07CisgICAgICAgIHZhciBzY2FsZUN0bVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7CisgICAgICAgIHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlID0gc2NhbGVDdG1YICogc2NhbGVMaW5lWDsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGggPSAwOworICAgICAgICB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VIZWlnaHQgPSAwOworICAgICAgICB2YXIgc3BhY2VXaWR0aCA9IGZvbnQuc3BhY2VXaWR0aCAvIDEwMDAgKiB0ZXh0U3RhdGUuZm9udFNpemU7CisKKyAgICAgICAgaWYgKHNwYWNlV2lkdGgpIHsKKyAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uc3BhY2VXaWR0aCA9IHNwYWNlV2lkdGg7CisgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VTcGFjZU1pbiA9IHNwYWNlV2lkdGggKiBTUEFDRV9GQUNUT1I7CisgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWluID0gc3BhY2VXaWR0aCAqIE1VTFRJX1NQQUNFX0ZBQ1RPUjsKKyAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXggPSBzcGFjZVdpZHRoICogTVVMVElfU1BBQ0VfRkFDVE9SX01BWDsKKyAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0udGV4dFJ1bkJyZWFrQWxsb3dlZCA9ICFmb250LmlzTW9ub3NwYWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRleHRDb250ZW50SXRlbS5zcGFjZVdpZHRoID0gMDsKKyAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZVNwYWNlTWluID0gSW5maW5pdHk7CisgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWluID0gSW5maW5pdHk7CisgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4ID0gMDsKKyAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0udGV4dFJ1bkJyZWFrQWxsb3dlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRleHRDb250ZW50SXRlbTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcmVwbGFjZVdoaXRlc3BhY2Uoc3RyKSB7CisgICAgICAgIHZhciBpID0gMCwKKyAgICAgICAgICAgIGlpID0gc3RyLmxlbmd0aCwKKyAgICAgICAgICAgIGNvZGU7CisKKyAgICAgICAgd2hpbGUgKGkgPCBpaSAmJiAoY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpKSA+PSAweDIwICYmIGNvZGUgPD0gMHg3ZikgeworICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpIDwgaWkgPyBzdHIucmVwbGFjZShXaGl0ZXNwYWNlUmVnZXhwLCAiICIpIDogc3RyOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBydW5CaWRpVHJhbnNmb3JtKHRleHRDaHVuaykgeworICAgICAgICB2YXIgc3RyID0gdGV4dENodW5rLnN0ci5qb2luKCIiKTsKKyAgICAgICAgdmFyIGJpZGlSZXN1bHQgPSAoMCwgX2JpZGkuYmlkaSkoc3RyLCAtMSwgdGV4dENodW5rLnZlcnRpY2FsKTsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBzdHI6IG5vcm1hbGl6ZVdoaXRlc3BhY2UgPyByZXBsYWNlV2hpdGVzcGFjZShiaWRpUmVzdWx0LnN0cikgOiBiaWRpUmVzdWx0LnN0ciwKKyAgICAgICAgICBkaXI6IGJpZGlSZXN1bHQuZGlyLAorICAgICAgICAgIHdpZHRoOiB0ZXh0Q2h1bmsud2lkdGgsCisgICAgICAgICAgaGVpZ2h0OiB0ZXh0Q2h1bmsuaGVpZ2h0LAorICAgICAgICAgIHRyYW5zZm9ybTogdGV4dENodW5rLnRyYW5zZm9ybSwKKyAgICAgICAgICBmb250TmFtZTogdGV4dENodW5rLmZvbnROYW1lCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIGhhbmRsZVNldEZvbnQoZm9udE5hbWUsIGZvbnRSZWYpIHsKKyAgICAgICAgcmV0dXJuIHNlbGYubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcykudGhlbihmdW5jdGlvbiAodHJhbnNsYXRlZCkgeworICAgICAgICAgIHRleHRTdGF0ZS5mb250ID0gdHJhbnNsYXRlZC5mb250OworICAgICAgICAgIHRleHRTdGF0ZS5mb250TWF0cml4ID0gdHJhbnNsYXRlZC5mb250LmZvbnRNYXRyaXggfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBidWlsZFRleHRDb250ZW50SXRlbShjaGFycykgeworICAgICAgICB2YXIgZm9udCA9IHRleHRTdGF0ZS5mb250OworICAgICAgICB2YXIgdGV4dENodW5rID0gZW5zdXJlVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgIHZhciB3aWR0aCA9IDA7CisgICAgICAgIHZhciBoZWlnaHQgPSAwOworICAgICAgICB2YXIgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGNoYXJzKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpXTsKKyAgICAgICAgICB2YXIgZ2x5cGhXaWR0aCA9IG51bGw7CisKKyAgICAgICAgICBpZiAoZm9udC52ZXJ0aWNhbCAmJiBnbHlwaC52bWV0cmljKSB7CisgICAgICAgICAgICBnbHlwaFdpZHRoID0gZ2x5cGgudm1ldHJpY1swXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBnbHlwaFVuaWNvZGUgPSBnbHlwaC51bmljb2RlOworICAgICAgICAgIHZhciBOb3JtYWxpemVkVW5pY29kZXMgPSAoMCwgX3VuaWNvZGUuZ2V0Tm9ybWFsaXplZFVuaWNvZGVzKSgpOworCisgICAgICAgICAgaWYgKE5vcm1hbGl6ZWRVbmljb2Rlc1tnbHlwaFVuaWNvZGVdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIGdseXBoVW5pY29kZSA9IE5vcm1hbGl6ZWRVbmljb2Rlc1tnbHlwaFVuaWNvZGVdOworICAgICAgICAgIH0KKworICAgICAgICAgIGdseXBoVW5pY29kZSA9ICgwLCBfdW5pY29kZS5yZXZlcnNlSWZSdGwpKGdseXBoVW5pY29kZSk7CisgICAgICAgICAgdmFyIGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nOworCisgICAgICAgICAgaWYgKGdseXBoLmlzU3BhY2UpIHsKKyAgICAgICAgICAgIHZhciB3b3JkU3BhY2luZyA9IHRleHRTdGF0ZS53b3JkU3BhY2luZzsKKyAgICAgICAgICAgIGNoYXJTcGFjaW5nICs9IHdvcmRTcGFjaW5nOworCisgICAgICAgICAgICBpZiAod29yZFNwYWNpbmcgPiAwKSB7CisgICAgICAgICAgICAgIGFkZEZha2VTcGFjZXMod29yZFNwYWNpbmcsIHRleHRDaHVuay5zdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHZhciB0eCA9IDA7CisgICAgICAgICAgdmFyIHR5ID0gMDsKKworICAgICAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgeworICAgICAgICAgICAgdmFyIHcwID0gZ2x5cGhXaWR0aCAqIHRleHRTdGF0ZS5mb250TWF0cml4WzBdOworICAgICAgICAgICAgdHggPSAodzAgKiB0ZXh0U3RhdGUuZm9udFNpemUgKyBjaGFyU3BhY2luZykgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZTsKKyAgICAgICAgICAgIHdpZHRoICs9IHR4OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgdzEgPSBnbHlwaFdpZHRoICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF07CisgICAgICAgICAgICB0eSA9IHcxICogdGV4dFN0YXRlLmZvbnRTaXplICsgY2hhclNwYWNpbmc7CisgICAgICAgICAgICBoZWlnaHQgKz0gdHk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgodHgsIHR5KTsKKyAgICAgICAgICB0ZXh0Q2h1bmsuc3RyLnB1c2goZ2x5cGhVbmljb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgeworICAgICAgICAgIHRleHRDaHVuay5sYXN0QWR2YW5jZVdpZHRoID0gd2lkdGg7CisgICAgICAgICAgdGV4dENodW5rLndpZHRoICs9IHdpZHRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRleHRDaHVuay5sYXN0QWR2YW5jZUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICB0ZXh0Q2h1bmsuaGVpZ2h0ICs9IE1hdGguYWJzKGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGV4dENodW5rOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBhZGRGYWtlU3BhY2VzKHdpZHRoLCBzdHJCdWYpIHsKKyAgICAgICAgaWYgKHdpZHRoIDwgdGV4dENvbnRlbnRJdGVtLmZha2VTcGFjZU1pbikgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aCA8IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1pbikgeworICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIgIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZha2VTcGFjZXMgPSBNYXRoLnJvdW5kKHdpZHRoIC8gdGV4dENvbnRlbnRJdGVtLnNwYWNlV2lkdGgpOworCisgICAgICAgIHdoaWxlIChmYWtlU3BhY2VzLS0gPiAwKSB7CisgICAgICAgICAgc3RyQnVmLnB1c2goIiAiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBmbHVzaFRleHRDb250ZW50SXRlbSgpIHsKKyAgICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCkgeworICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCAqPSB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICo9IHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaChydW5CaWRpVHJhbnNmb3JtKHRleHRDb250ZW50SXRlbSkpOworICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPSAwOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBlbnF1ZXVlQ2h1bmsoKSB7CisgICAgICAgIHZhciBsZW5ndGggPSB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7CisKKyAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICBzaW5rLmVucXVldWUodGV4dENvbnRlbnQsIGxlbmd0aCk7CisgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMgPSBbXTsKKyAgICAgICAgICB0ZXh0Q29udGVudC5zdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CisgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChwcm9taXNlKSB7CisgICAgICAgICAgZW5xdWV1ZUNodW5rKCk7CisgICAgICAgICAgUHJvbWlzZS5hbGwoW3Byb21pc2UsIHNpbmsucmVhZHldKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgICByZWplY3QoZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHJlamVjdCk7CisgICAgICAgIH07CisKKyAgICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisgICAgICAgIHRpbWVTbG90TWFuYWdlci5yZXNldCgpOworICAgICAgICB2YXIgc3RvcCwKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9IHt9LAorICAgICAgICAgICAgYXJncyA9IFtdOworCisgICAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKKyAgICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CisgICAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOworCisgICAgICAgICAgaWYgKCFwcmVwcm9jZXNzb3IucmVhZChvcGVyYXRpb24pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0ZXh0U3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGU7CisgICAgICAgICAgdmFyIGZuID0gb3BlcmF0aW9uLmZuOworICAgICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKKyAgICAgICAgICB2YXIgYWR2YW5jZSwgZGlmZjsKKworICAgICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGb250OgorICAgICAgICAgICAgICB2YXIgZm9udE5hbWVBcmcgPSBhcmdzWzBdLm5hbWUsCisgICAgICAgICAgICAgICAgICBmb250U2l6ZUFyZyA9IGFyZ3NbMV07CisKKyAgICAgICAgICAgICAgaWYgKHRleHRTdGF0ZS5mb250ICYmIGZvbnROYW1lQXJnID09PSB0ZXh0U3RhdGUuZm9udE5hbWUgJiYgZm9udFNpemVBcmcgPT09IHRleHRTdGF0ZS5mb250U2l6ZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnROYW1lID0gZm9udE5hbWVBcmc7CisgICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplQXJnOworICAgICAgICAgICAgICBuZXh0KGhhbmRsZVNldEZvbnQoZm9udE5hbWVBcmcsIG51bGwpKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0UmlzZToKKyAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRSaXNlID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEhTY2FsZToKKyAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRIU2NhbGUgPSBhcmdzWzBdIC8gMTAwOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGVhZGluZzoKKyAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmxlYWRpbmcgPSBhcmdzWzBdOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRleHQ6CisgICAgICAgICAgICAgIHZhciBpc1NhbWVUZXh0TGluZSA9ICF0ZXh0U3RhdGUuZm9udCA/IGZhbHNlIDogKHRleHRTdGF0ZS5mb250LnZlcnRpY2FsID8gYXJnc1swXSA6IGFyZ3NbMV0pID09PSAwOworICAgICAgICAgICAgICBhZHZhbmNlID0gYXJnc1swXSAtIGFyZ3NbMV07CisKKyAgICAgICAgICAgICAgaWYgKGNvbWJpbmVUZXh0SXRlbXMgJiYgaXNTYW1lVGV4dExpbmUgJiYgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkICYmIGFkdmFuY2UgPiAwICYmIGFkdmFuY2UgPD0gdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4KSB7CisgICAgICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCArPSBhcmdzWzBdIC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGg7CisgICAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBhcmdzWzFdIC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0OworICAgICAgICAgICAgICAgIGRpZmYgPSBhcmdzWzBdIC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGggLSAoYXJnc1sxXSAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZUhlaWdodCk7CisgICAgICAgICAgICAgICAgYWRkRmFrZVNwYWNlcyhkaWZmLCB0ZXh0Q29udGVudEl0ZW0uc3RyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TGluZU1hdHJpeChhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExlYWRpbmdNb3ZlVGV4dDoKKyAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmxlYWRpbmcgPSAtYXJnc1sxXTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgICB0ZXh0U3RhdGUudGV4dE1hdHJpeCA9IHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeC5zbGljZSgpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmU6CisgICAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0VGV4dE1hdHJpeDoKKyAgICAgICAgICAgICAgYWR2YW5jZSA9IHRleHRTdGF0ZS5jYWxjVGV4dExpbmVNYXRyaXhBZHZhbmNlKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOworCisgICAgICAgICAgICAgIGlmIChjb21iaW5lVGV4dEl0ZW1zICYmIGFkdmFuY2UgIT09IG51bGwgJiYgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkICYmIGFkdmFuY2UudmFsdWUgPiAwICYmIGFkdmFuY2UudmFsdWUgPD0gdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4KSB7CisgICAgICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFkdmFuY2Uud2lkdGgsIGFkdmFuY2UuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gYWR2YW5jZS53aWR0aCAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZVdpZHRoOworICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgKz0gYWR2YW5jZS5oZWlnaHQgLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VIZWlnaHQ7CisgICAgICAgICAgICAgICAgZGlmZiA9IGFkdmFuY2Uud2lkdGggLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aCAtIChhZHZhbmNlLmhlaWdodCAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZUhlaWdodCk7CisgICAgICAgICAgICAgICAgYWRkRmFrZVNwYWNlcyhkaWZmLCB0ZXh0Q29udGVudEl0ZW0uc3RyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICAgIHRleHRTdGF0ZS5zZXRUZXh0TWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOworICAgICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZzoKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmNoYXJTcGFjaW5nID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFdvcmRTcGFjaW5nOgorICAgICAgICAgICAgICB0ZXh0U3RhdGUud29yZFNwYWNpbmcgPSBhcmdzWzBdOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5UZXh0OgorICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgICB0ZXh0U3RhdGUudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWC5zbGljZSgpOworICAgICAgICAgICAgICB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVguc2xpY2UoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNob3dTcGFjZWRUZXh0OgorICAgICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CisgICAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBpdGVtcyA9IGFyZ3NbMF07CisgICAgICAgICAgICAgIHZhciBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbXNbal0gPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbShpdGVtc1tqXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNOdW0pKGl0ZW1zW2pdKSkgeworICAgICAgICAgICAgICAgICAgZW5zdXJlVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gaXRlbXNbal0gKiB0ZXh0U3RhdGUuZm9udFNpemUgLyAxMDAwOworICAgICAgICAgICAgICAgICAgdmFyIGJyZWFrVGV4dFJ1biA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICBpZiAodGV4dFN0YXRlLmZvbnQudmVydGljYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYWR2YW5jZTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWtUZXh0UnVuID0gdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgJiYgYWR2YW5jZSA+IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrVGV4dFJ1bikgeworICAgICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gLWFkdmFuY2U7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGFkdmFuY2UgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgob2Zmc2V0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWtUZXh0UnVuID0gdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgJiYgYWR2YW5jZSA+IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrVGV4dFJ1bikgeworICAgICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrVGV4dFJ1bikgeworICAgICAgICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZHZhbmNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRGYWtlU3BhY2VzKGFkdmFuY2UsIHRleHRDb250ZW50SXRlbS5zdHIpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93VGV4dDoKKyAgICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbShhcmdzWzBdKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lU2hvd1RleHQ6CisgICAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmNhcnJpYWdlUmV0dXJuKCk7CisgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGFyZ3NbMF0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6CisgICAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLndvcmRTcGFjaW5nID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmNoYXJTcGFjaW5nID0gYXJnc1sxXTsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLmNhcnJpYWdlUmV0dXJuKCk7CisgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGFyZ3NbMl0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRYT2JqZWN0OgorICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworCisgICAgICAgICAgICAgIGlmICgheG9ianMpIHsKKyAgICAgICAgICAgICAgICB4b2JqcyA9IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIG5hbWUgPSBhcmdzWzBdLm5hbWU7CisKKyAgICAgICAgICAgICAgaWYgKG5hbWUgJiYgZW1wdHlYT2JqZWN0Q2FjaGUuZ2V0QnlOYW1lKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBuZXh0KG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlWE9iamVjdCwgcmVqZWN0WE9iamVjdCkgeworICAgICAgICAgICAgICAgIGlmICghbmFtZSkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IHhvYmpzLmdldFJhdyhuYW1lKTsKKworICAgICAgICAgICAgICAgIGlmICh4b2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICAgICAgICAgICAgICBpZiAoZW1wdHlYT2JqZWN0Q2FjaGUuZ2V0QnlSZWYoeG9iaikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoeG9iaikpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgYmUgYSBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHhvYmouZGljdC5nZXQoIlN1YnR5cGUiKTsKKworICAgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0eXBlLm5hbWUgIT09ICJGb3JtIikgeworICAgICAgICAgICAgICAgICAgZW1wdHlYT2JqZWN0Q2FjaGUuc2V0KG5hbWUsIHhvYmouZGljdC5vYmpJZCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICB2YXIgeE9ialN0YXRlTWFuYWdlciA9IG5ldyBTdGF0ZU1hbmFnZXIoY3VycmVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICB2YXIgbWF0cml4ID0geG9iai5kaWN0LmdldEFycmF5KCJNYXRyaXgiKTsKKworICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdHJpeCkgJiYgbWF0cml4Lmxlbmd0aCA9PT0gNikgeworICAgICAgICAgICAgICAgICAgeE9ialN0YXRlTWFuYWdlci50cmFuc2Zvcm0obWF0cml4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKKyAgICAgICAgICAgICAgICB2YXIgc2lua1dyYXBwZXIgPSB7CisgICAgICAgICAgICAgICAgICBlbnF1ZXVlSW52b2tlZDogZmFsc2UsCisgICAgICAgICAgICAgICAgICBlbnF1ZXVlOiBmdW5jdGlvbiBlbnF1ZXVlKGNodW5rLCBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5xdWV1ZUludm9rZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzaW5rLmVucXVldWUoY2h1bmssIHNpemUpOworICAgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgICAgZ2V0IGRlc2lyZWRTaXplKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5kZXNpcmVkU2l6ZTsKKyAgICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICAgIGdldCByZWFkeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmsucmVhZHk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNlbGYuZ2V0VGV4dENvbnRlbnQoeworICAgICAgICAgICAgICAgICAgc3RyZWFtOiB4b2JqLAorICAgICAgICAgICAgICAgICAgdGFzazogdGFzaywKKyAgICAgICAgICAgICAgICAgIHJlc291cmNlczogeG9iai5kaWN0LmdldCgiUmVzb3VyY2VzIikgfHwgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyOiB4T2JqU3RhdGVNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZTogbm9ybWFsaXplV2hpdGVzcGFjZSwKKyAgICAgICAgICAgICAgICAgIGNvbWJpbmVUZXh0SXRlbXM6IGNvbWJpbmVUZXh0SXRlbXMsCisgICAgICAgICAgICAgICAgICBzaW5rOiBzaW5rV3JhcHBlciwKKyAgICAgICAgICAgICAgICAgIHNlZW5TdHlsZXM6IHNlZW5TdHlsZXMKKyAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgIGlmICghc2lua1dyYXBwZXIuZW5xdWV1ZUludm9rZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZW1wdHlYT2JqZWN0Q2FjaGUuc2V0KG5hbWUsIHhvYmouZGljdC5vYmpJZCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CisgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIFhPYmplY3Q6IFwiIi5jb25jYXQocmVhc29uLCAiXCIuIikpOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEdTdGF0ZToKKyAgICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKKworICAgICAgICAgICAgICBpZiAobmFtZSAmJiBlbXB0eUdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGV4dEdTdGF0ZSA9IHJlc291cmNlcy5nZXQoIkV4dEdTdGF0ZSIpOworCisgICAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIShnU3RhdGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgZ1N0YXRlRm9udCA9IGdTdGF0ZS5nZXQoIkZvbnQiKTsKKworICAgICAgICAgICAgICAgIGlmICghZ1N0YXRlRm9udCkgeworICAgICAgICAgICAgICAgICAgZW1wdHlHU3RhdGVDYWNoZS5zZXQobmFtZSwgZ1N0YXRlLm9iaklkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVHU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZ1N0YXRlRm9udFsxXTsKKyAgICAgICAgICAgICAgICBoYW5kbGVTZXRGb250KG51bGwsIGdTdGF0ZUZvbnRbMF0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKKyAgICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoImdldFRleHRDb250ZW50IC0gaWdub3JpbmcgRXh0R1N0YXRlOiBcIiIuY29uY2F0KHJlYXNvbiwgIlwiLiIpKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyByZWFzb247CisgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGggPj0gc2luay5kZXNpcmVkU2l6ZSkgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RvcCkgeworICAgICAgICAgIG5leHQoZGVmZXJyZWQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgIGVucXVldWVDaHVuaygpOworICAgICAgICByZXNvbHZlKCk7CisgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfdGhpczgub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoImdldFRleHRDb250ZW50IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyBcIiIuY29uY2F0KHRhc2submFtZSwgIlwiICIpICsgInRhc2s6IFwiIi5jb25jYXQocmVhc29uLCAiXCIuIikpOworICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgZW5xdWV1ZUNodW5rKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZXh0cmFjdERhdGFTdHJ1Y3R1cmVzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIGJhc2VEaWN0LCBwcm9wZXJ0aWVzKSB7CisgICAgICB2YXIgX3RoaXM5ID0gdGhpczsKKworICAgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7CisgICAgICB2YXIgY2lkVG9HaWRCeXRlczsKKyAgICAgIHZhciB0b1VuaWNvZGUgPSBkaWN0LmdldCgiVG9Vbmljb2RlIikgfHwgYmFzZURpY3QuZ2V0KCJUb1VuaWNvZGUiKTsKKyAgICAgIHZhciB0b1VuaWNvZGVQcm9taXNlID0gdG9Vbmljb2RlID8gdGhpcy5yZWFkVG9Vbmljb2RlKHRvVW5pY29kZSkgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsKKworICAgICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CisgICAgICAgIHZhciBjaWRTeXN0ZW1JbmZvID0gZGljdC5nZXQoIkNJRFN5c3RlbUluZm8iKTsKKworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY2lkU3lzdGVtSW5mbykpIHsKKyAgICAgICAgICBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8gPSB7CisgICAgICAgICAgICByZWdpc3RyeTogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShjaWRTeXN0ZW1JbmZvLmdldCgiUmVnaXN0cnkiKSksCisgICAgICAgICAgICBvcmRlcmluZzogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShjaWRTeXN0ZW1JbmZvLmdldCgiT3JkZXJpbmciKSksCisgICAgICAgICAgICBzdXBwbGVtZW50OiBjaWRTeXN0ZW1JbmZvLmdldCgiU3VwcGxlbWVudCIpCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBjaWRUb0dpZE1hcCA9IGRpY3QuZ2V0KCJDSURUb0dJRE1hcCIpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGNpZFRvR2lkTWFwKSkgeworICAgICAgICAgIGNpZFRvR2lkQnl0ZXMgPSBjaWRUb0dpZE1hcC5nZXRCeXRlcygpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBkaWZmZXJlbmNlcyA9IFtdOworICAgICAgdmFyIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsOworICAgICAgdmFyIGVuY29kaW5nOworCisgICAgICBpZiAoZGljdC5oYXMoIkVuY29kaW5nIikpIHsKKyAgICAgICAgZW5jb2RpbmcgPSBkaWN0LmdldCgiRW5jb2RpbmciKTsKKworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZW5jb2RpbmcpKSB7CisgICAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IGVuY29kaW5nLmdldCgiQmFzZUVuY29kaW5nIik7CisgICAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGJhc2VFbmNvZGluZ05hbWUpID8gYmFzZUVuY29kaW5nTmFtZS5uYW1lIDogbnVsbDsKKworICAgICAgICAgIGlmIChlbmNvZGluZy5oYXMoIkRpZmZlcmVuY2VzIikpIHsKKyAgICAgICAgICAgIHZhciBkaWZmRW5jb2RpbmcgPSBlbmNvZGluZy5nZXQoIkRpZmZlcmVuY2VzIik7CisgICAgICAgICAgICB2YXIgaW5kZXggPSAwOworCisgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBkaWZmRW5jb2RpbmcubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgICB2YXIgZGF0YSA9IHhyZWYuZmV0Y2hJZlJlZihkaWZmRW5jb2Rpbmdbal0pOworCisgICAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNOdW0pKGRhdGEpKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBkYXRhOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGRhdGEpKSB7CisgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXNbaW5kZXgrK10gPSBkYXRhLm5hbWU7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIGVudHJ5IGluICdEaWZmZXJlbmNlcycgYXJyYXk6ICIuY29uY2F0KGRhdGEpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShlbmNvZGluZykpIHsKKyAgICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkVuY29kaW5nIGlzIG5vdCBhIE5hbWUgbm9yIGEgRGljdCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgIT09ICJNYWNSb21hbkVuY29kaW5nIiAmJiBiYXNlRW5jb2RpbmdOYW1lICE9PSAiTWFjRXhwZXJ0RW5jb2RpbmciICYmIGJhc2VFbmNvZGluZ05hbWUgIT09ICJXaW5BbnNpRW5jb2RpbmciKSB7CisgICAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUpIHsKKyAgICAgICAgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPSAoMCwgX2VuY29kaW5ncy5nZXRFbmNvZGluZykoYmFzZUVuY29kaW5nTmFtZSkuc2xpY2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBpc1N5bWJvbGljRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBfZm9udHMuRm9udEZsYWdzLlN5bWJvbGljKTsKKyAgICAgICAgdmFyIGlzTm9uc3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIF9mb250cy5Gb250RmxhZ3MuTm9uc3ltYm9saWMpOworICAgICAgICBlbmNvZGluZyA9IF9lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZzsKKworICAgICAgICBpZiAocHJvcGVydGllcy50eXBlID09PSAiVHJ1ZVR5cGUiICYmICFpc05vbnN5bWJvbGljRm9udCkgeworICAgICAgICAgIGVuY29kaW5nID0gX2VuY29kaW5ncy5XaW5BbnNpRW5jb2Rpbmc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTeW1ib2xpY0ZvbnQpIHsKKyAgICAgICAgICBlbmNvZGluZyA9IF9lbmNvZGluZ3MuTWFjUm9tYW5FbmNvZGluZzsKKworICAgICAgICAgIGlmICghcHJvcGVydGllcy5maWxlKSB7CisgICAgICAgICAgICBpZiAoL1N5bWJvbC9pLnRlc3QocHJvcGVydGllcy5uYW1lKSkgeworICAgICAgICAgICAgICBlbmNvZGluZyA9IF9lbmNvZGluZ3MuU3ltYm9sU2V0RW5jb2Rpbmc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKC9EaW5nYmF0c3xXaW5nZGluZ3MvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKKyAgICAgICAgICAgICAgZW5jb2RpbmcgPSBfZW5jb2RpbmdzLlphcGZEaW5nYmF0c0VuY29kaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICB9CisKKyAgICAgIHByb3BlcnRpZXMuZGlmZmVyZW5jZXMgPSBkaWZmZXJlbmNlczsKKyAgICAgIHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSA9IGJhc2VFbmNvZGluZ05hbWU7CisgICAgICBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nID0gISFiYXNlRW5jb2RpbmdOYW1lIHx8IGRpZmZlcmVuY2VzLmxlbmd0aCA+IDA7CisgICAgICBwcm9wZXJ0aWVzLmRpY3QgPSBkaWN0OworICAgICAgcmV0dXJuIHRvVW5pY29kZVByb21pc2UudGhlbihmdW5jdGlvbiAocmVhZFRvVW5pY29kZSkgeworICAgICAgICBwcm9wZXJ0aWVzLnRvVW5pY29kZSA9IHJlYWRUb1VuaWNvZGU7CisgICAgICAgIHJldHVybiBfdGhpczkuYnVpbGRUb1VuaWNvZGUocHJvcGVydGllcyk7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChidWlsdFRvVW5pY29kZSkgeworICAgICAgICBwcm9wZXJ0aWVzLnRvVW5pY29kZSA9IGJ1aWx0VG9Vbmljb2RlOworCisgICAgICAgIGlmIChjaWRUb0dpZEJ5dGVzKSB7CisgICAgICAgICAgcHJvcGVydGllcy5jaWRUb0dpZE1hcCA9IF90aGlzOS5yZWFkQ2lkVG9HaWRNYXAoY2lkVG9HaWRCeXRlcywgYnVpbHRUb1VuaWNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfYnVpbGRTaW1wbGVGb250VG9Vbmljb2RlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzKSB7CisgICAgICB2YXIgZm9yY2VHbHlwaHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOworICAgICAgKDAsIF91dGlsLmFzc2VydCkoIXByb3BlcnRpZXMuY29tcG9zaXRlLCAiTXVzdCBiZSBhIHNpbXBsZSBmb250LiIpOworICAgICAgdmFyIHRvVW5pY29kZSA9IFtdOworICAgICAgdmFyIGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmcuc2xpY2UoKTsKKyAgICAgIHZhciBiYXNlRW5jb2RpbmdOYW1lID0gcHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lOworICAgICAgdmFyIGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKKworICAgICAgZm9yICh2YXIgY2hhcmNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKKyAgICAgICAgdmFyIGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJjb2RlXTsKKworICAgICAgICBpZiAoZ2x5cGhOYW1lID09PSAiLm5vdGRlZiIpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGVuY29kaW5nW2NoYXJjb2RlXSA9IGdseXBoTmFtZTsKKyAgICAgIH0KKworICAgICAgdmFyIGdseXBoc1VuaWNvZGVNYXAgPSAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOworCisgICAgICBmb3IgKHZhciBfY2hhcmNvZGUgaW4gZW5jb2RpbmcpIHsKKyAgICAgICAgdmFyIF9nbHlwaE5hbWUgPSBlbmNvZGluZ1tfY2hhcmNvZGVdOworCisgICAgICAgIGlmIChfZ2x5cGhOYW1lID09PSAiIikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGdseXBoc1VuaWNvZGVNYXBbX2dseXBoTmFtZV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIHZhciBjb2RlID0gMDsKKworICAgICAgICAgIHN3aXRjaCAoX2dseXBoTmFtZVswXSkgeworICAgICAgICAgICAgY2FzZSAiRyI6CisgICAgICAgICAgICAgIGlmIChfZ2x5cGhOYW1lLmxlbmd0aCA9PT0gMykgeworICAgICAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChfZ2x5cGhOYW1lLnN1YnN0cmluZygxKSwgMTYpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgImciOgorICAgICAgICAgICAgICBpZiAoX2dseXBoTmFtZS5sZW5ndGggPT09IDUpIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoX2dseXBoTmFtZS5zdWJzdHJpbmcoMSksIDE2KTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJDIjoKKyAgICAgICAgICAgIGNhc2UgImMiOgorICAgICAgICAgICAgICBpZiAoX2dseXBoTmFtZS5sZW5ndGggPj0gMyAmJiBfZ2x5cGhOYW1lLmxlbmd0aCA8PSA0KSB7CisgICAgICAgICAgICAgICAgdmFyIGNvZGVTdHIgPSBfZ2x5cGhOYW1lLnN1YnN0cmluZygxKTsKKworICAgICAgICAgICAgICAgIGlmIChmb3JjZUdseXBocykgeworICAgICAgICAgICAgICAgICAgY29kZSA9IHBhcnNlSW50KGNvZGVTdHIsIDE2KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvZGUgPSArY29kZVN0cjsKKworICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oY29kZSkgJiYgTnVtYmVyLmlzSW50ZWdlcihwYXJzZUludChjb2RlU3RyLCAxNikpKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYnVpbGRTaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB2YXIgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKF9nbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOworCisgICAgICAgICAgICAgIGlmICh1bmljb2RlICE9PSAtMSkgeworICAgICAgICAgICAgICAgIGNvZGUgPSB1bmljb2RlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoY29kZSA+IDAgJiYgY29kZSA8PSAweDEwZmZmZiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CisgICAgICAgICAgICBpZiAoYmFzZUVuY29kaW5nTmFtZSAmJiBjb2RlID09PSArX2NoYXJjb2RlKSB7CisgICAgICAgICAgICAgIHZhciBiYXNlRW5jb2RpbmcgPSAoMCwgX2VuY29kaW5ncy5nZXRFbmNvZGluZykoYmFzZUVuY29kaW5nTmFtZSk7CisKKyAgICAgICAgICAgICAgaWYgKGJhc2VFbmNvZGluZyAmJiAoX2dseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tfY2hhcmNvZGVdKSkgeworICAgICAgICAgICAgICAgIHRvVW5pY29kZVtfY2hhcmNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZShnbHlwaHNVbmljb2RlTWFwW19nbHlwaE5hbWVdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b1VuaWNvZGVbX2NoYXJjb2RlXSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpOworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdG9Vbmljb2RlW19jaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbX2dseXBoTmFtZV0pOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3IF9mb250cy5Ub1VuaWNvZGVNYXAodG9Vbmljb2RlKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJidWlsZFRvVW5pY29kZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHsKKyAgICAgIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgPSAhIXByb3BlcnRpZXMudG9Vbmljb2RlICYmIHByb3BlcnRpZXMudG9Vbmljb2RlLmxlbmd0aCA+IDA7CisKKyAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CisgICAgICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUgJiYgcHJvcGVydGllcy5oYXNFbmNvZGluZykgeworICAgICAgICAgIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUgPSB0aGlzLl9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUocHJvcGVydGllcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb3BlcnRpZXMudG9Vbmljb2RlKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgeworICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzKSk7CisgICAgICB9CisKKyAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAmJiAocHJvcGVydGllcy5jTWFwLmJ1aWx0SW5DTWFwICYmICEocHJvcGVydGllcy5jTWFwIGluc3RhbmNlb2YgX2NtYXAuSWRlbnRpdHlDTWFwKSB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ucmVnaXN0cnkgPT09ICJBZG9iZSIgJiYgKHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIkdCMSIgfHwgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiQ05TMSIgfHwgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiSmFwYW4xIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJLb3JlYTEiKSkpIHsKKyAgICAgICAgdmFyIHJlZ2lzdHJ5ID0gcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLnJlZ2lzdHJ5OworICAgICAgICB2YXIgb3JkZXJpbmcgPSBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmc7CisKKyAgICAgICAgdmFyIHVjczJDTWFwTmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KHJlZ2lzdHJ5ICsgIi0iICsgb3JkZXJpbmcgKyAiLVVDUzIiKTsKKworICAgICAgICByZXR1cm4gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgICAgICBlbmNvZGluZzogdWNzMkNNYXBOYW1lLAorICAgICAgICAgIGZldGNoQnVpbHRJbkNNYXA6IHRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCwKKyAgICAgICAgICB1c2VDTWFwOiBudWxsCisgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVjczJDTWFwKSB7CisgICAgICAgICAgdmFyIGNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7CisgICAgICAgICAgdmFyIHRvVW5pY29kZSA9IFtdOworICAgICAgICAgIGNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhcmNvZGUsIGNpZCkgeworICAgICAgICAgICAgaWYgKGNpZCA+IDB4ZmZmZikgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHVjczIgPSB1Y3MyQ01hcC5sb29rdXAoY2lkKTsKKworICAgICAgICAgICAgaWYgKHVjczIpIHsKKyAgICAgICAgICAgICAgdG9Vbmljb2RlW2NoYXJjb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHVjczIuY2hhckNvZGVBdCgwKSA8PCA4KSArIHVjczIuY2hhckNvZGVBdCgxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgICAgcmV0dXJuIG5ldyBfZm9udHMuVG9Vbmljb2RlTWFwKHRvVW5pY29kZSk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBfZm9udHMuSWRlbnRpdHlUb1VuaWNvZGVNYXAocHJvcGVydGllcy5maXJzdENoYXIsIHByb3BlcnRpZXMubGFzdENoYXIpKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZWFkVG9Vbmljb2RlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZFRvVW5pY29kZSh0b1VuaWNvZGUpIHsKKyAgICAgIHZhciBfdGhpczEwID0gdGhpczsKKworICAgICAgdmFyIGNtYXBPYmogPSB0b1VuaWNvZGU7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShjbWFwT2JqKSkgeworICAgICAgICByZXR1cm4gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgICAgICBlbmNvZGluZzogY21hcE9iaiwKKyAgICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCisgICAgICAgICAgdXNlQ01hcDogbnVsbAorICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICAgICAgaWYgKGNtYXAgaW5zdGFuY2VvZiBfY21hcC5JZGVudGl0eUNNYXApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgX2ZvbnRzLklkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIG5ldyBfZm9udHMuVG9Vbmljb2RlTWFwKGNtYXAuZ2V0TWFwKCkpOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShjbWFwT2JqKSkgeworICAgICAgICByZXR1cm4gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgICAgICBlbmNvZGluZzogY21hcE9iaiwKKyAgICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCisgICAgICAgICAgdXNlQ01hcDogbnVsbAorICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICAgICAgaWYgKGNtYXAgaW5zdGFuY2VvZiBfY21hcC5JZGVudGl0eUNNYXApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgX2ZvbnRzLklkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIG1hcCA9IG5ldyBBcnJheShjbWFwLmxlbmd0aCk7CisgICAgICAgICAgY21hcC5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdG9rZW4pIHsKKyAgICAgICAgICAgIHZhciBzdHIgPSBbXTsKKworICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0b2tlbi5sZW5ndGg7IGsgKz0gMikgeworICAgICAgICAgICAgICB2YXIgdzEgPSB0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDggfCB0b2tlbi5jaGFyQ29kZUF0KGsgKyAxKTsKKworICAgICAgICAgICAgICBpZiAoKHcxICYgMHhmODAwKSAhPT0gMHhkODAwKSB7CisgICAgICAgICAgICAgICAgc3RyLnB1c2godzEpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgayArPSAyOworICAgICAgICAgICAgICB2YXIgdzIgPSB0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDggfCB0b2tlbi5jaGFyQ29kZUF0KGsgKyAxKTsKKyAgICAgICAgICAgICAgc3RyLnB1c2goKCh3MSAmIDB4M2ZmKSA8PCAxMCkgKyAodzIgJiAweDNmZikgKyAweDEwMDAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWFwW2NoYXJDb2RlXSA9IFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZywgc3RyKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm4gbmV3IF9mb250cy5Ub1VuaWNvZGVNYXAobWFwKTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKF90aGlzMTAub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICAgIF90aGlzMTAuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250VG9Vbmljb2RlCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJyZWFkVG9Vbmljb2RlIC0gaWdub3JpbmcgVG9Vbmljb2RlIGRhdGE6IFwiIi5jb25jYXQocmVhc29uLCAiXCIuIikpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZWFkQ2lkVG9HaWRNYXAiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkQ2lkVG9HaWRNYXAoZ2x5cGhzRGF0YSwgdG9Vbmljb2RlKSB7CisgICAgICB2YXIgcmVzdWx0ID0gW107CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGdseXBoc0RhdGEubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICB2YXIgZ2x5cGhJRCA9IGdseXBoc0RhdGFbaisrXSA8PCA4IHwgZ2x5cGhzRGF0YVtqXTsKKyAgICAgICAgdmFyIGNvZGUgPSBqID4+IDE7CisKKyAgICAgICAgaWYgKGdseXBoSUQgPT09IDAgJiYgIXRvVW5pY29kZS5oYXMoY29kZSkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdFtjb2RlXSA9IGdseXBoSUQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZXh0cmFjdFdpZHRocyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgcHJvcGVydGllcykgeworICAgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7CisgICAgICB2YXIgZ2x5cGhzV2lkdGhzID0gW107CisgICAgICB2YXIgZGVmYXVsdFdpZHRoID0gMDsKKyAgICAgIHZhciBnbHlwaHNWTWV0cmljcyA9IFtdOworICAgICAgdmFyIGRlZmF1bHRWTWV0cmljczsKKyAgICAgIHZhciBpLCBpaSwgaiwgamosIHN0YXJ0LCBjb2RlLCB3aWR0aHM7CisKKyAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgeworICAgICAgICBkZWZhdWx0V2lkdGggPSBkaWN0LmhhcygiRFciKSA/IGRpY3QuZ2V0KCJEVyIpIDogMTAwMDsKKyAgICAgICAgd2lkdGhzID0gZGljdC5nZXQoIlciKTsKKworICAgICAgICBpZiAod2lkdGhzKSB7CisgICAgICAgICAgZm9yIChpID0gMCwgaWkgPSB3aWR0aHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgc3RhcnQgPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2krK10pOworICAgICAgICAgICAgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaV0pOworCisgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2RlKSkgeworICAgICAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvZGUubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgICAgIGdseXBoc1dpZHRoc1tzdGFydCsrXSA9IHhyZWYuZmV0Y2hJZlJlZihjb2RlW2pdKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdmFyIHdpZHRoID0geHJlZi5mZXRjaElmUmVmKHdpZHRoc1srK2ldKTsKKworICAgICAgICAgICAgICBmb3IgKGogPSBzdGFydDsgaiA8PSBjb2RlOyBqKyspIHsKKyAgICAgICAgICAgICAgICBnbHlwaHNXaWR0aHNbal0gPSB3aWR0aDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLnZlcnRpY2FsKSB7CisgICAgICAgICAgdmFyIHZtZXRyaWNzID0gZGljdC5nZXRBcnJheSgiRFcyIikgfHwgWzg4MCwgLTEwMDBdOworICAgICAgICAgIGRlZmF1bHRWTWV0cmljcyA9IFt2bWV0cmljc1sxXSwgZGVmYXVsdFdpZHRoICogMC41LCB2bWV0cmljc1swXV07CisgICAgICAgICAgdm1ldHJpY3MgPSBkaWN0LmdldCgiVzIiKTsKKworICAgICAgICAgIGlmICh2bWV0cmljcykgeworICAgICAgICAgICAgZm9yIChpID0gMCwgaWkgPSB2bWV0cmljcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICAgIHN0YXJ0ID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2krK10pOworICAgICAgICAgICAgICBjb2RlID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2ldKTsKKworICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2RlKSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICAgICAgICBnbHlwaHNWTWV0cmljc1tzdGFydCsrXSA9IFt4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSwgeHJlZi5mZXRjaElmUmVmKGNvZGVbaisrXSksIHhyZWYuZmV0Y2hJZlJlZihjb2RlW2pdKV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhciB2bWV0cmljID0gW3hyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSwgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pLCB4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSldOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7CisgICAgICAgICAgICAgICAgICBnbHlwaHNWTWV0cmljc1tqXSA9IHZtZXRyaWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgZmlyc3RDaGFyID0gcHJvcGVydGllcy5maXJzdENoYXI7CisgICAgICAgIHdpZHRocyA9IGRpY3QuZ2V0KCJXaWR0aHMiKTsKKworICAgICAgICBpZiAod2lkdGhzKSB7CisgICAgICAgICAgaiA9IGZpcnN0Q2hhcjsKKworICAgICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICAgIGdseXBoc1dpZHRoc1tqKytdID0geHJlZi5mZXRjaElmUmVmKHdpZHRoc1tpXSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGVmYXVsdFdpZHRoID0gcGFyc2VGbG9hdChkZXNjcmlwdG9yLmdldCgiTWlzc2luZ1dpZHRoIikpIHx8IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIGJhc2VGb250TmFtZSA9IGRpY3QuZ2V0KCJCYXNlRm9udCIpOworCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGJhc2VGb250TmFtZSkpIHsKKyAgICAgICAgICAgIHZhciBtZXRyaWNzID0gdGhpcy5nZXRCYXNlRm9udE1ldHJpY3MoYmFzZUZvbnROYW1lLm5hbWUpOworICAgICAgICAgICAgZ2x5cGhzV2lkdGhzID0gdGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChtZXRyaWNzLndpZHRocywgcHJvcGVydGllcyk7CisgICAgICAgICAgICBkZWZhdWx0V2lkdGggPSBtZXRyaWNzLmRlZmF1bHRXaWR0aDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGlzTW9ub3NwYWNlID0gdHJ1ZTsKKyAgICAgIHZhciBmaXJzdFdpZHRoID0gZGVmYXVsdFdpZHRoOworCisgICAgICBmb3IgKHZhciBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKKyAgICAgICAgdmFyIGdseXBoV2lkdGggPSBnbHlwaHNXaWR0aHNbZ2x5cGhdOworCisgICAgICAgIGlmICghZ2x5cGhXaWR0aCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmaXJzdFdpZHRoKSB7CisgICAgICAgICAgZmlyc3RXaWR0aCA9IGdseXBoV2lkdGg7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlyc3RXaWR0aCAhPT0gZ2x5cGhXaWR0aCkgeworICAgICAgICAgIGlzTW9ub3NwYWNlID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGlzTW9ub3NwYWNlKSB7CisgICAgICAgIHByb3BlcnRpZXMuZmxhZ3MgfD0gX2ZvbnRzLkZvbnRGbGFncy5GaXhlZFBpdGNoOworICAgICAgfQorCisgICAgICBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aDsKKyAgICAgIHByb3BlcnRpZXMud2lkdGhzID0gZ2x5cGhzV2lkdGhzOworICAgICAgcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3MgPSBkZWZhdWx0Vk1ldHJpY3M7CisgICAgICBwcm9wZXJ0aWVzLnZtZXRyaWNzID0gZ2x5cGhzVk1ldHJpY3M7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNTZXJpZkZvbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBpc1NlcmlmRm9udChiYXNlRm9udE5hbWUpIHsKKyAgICAgIHZhciBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoIi0iKVswXTsKKyAgICAgIHJldHVybiBmb250TmFtZVdvU3R5bGUgaW4gKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTZXJpZkZvbnRzKSgpIHx8IGZvbnROYW1lV29TdHlsZS5zZWFyY2goL3NlcmlmL2dpKSAhPT0gLTE7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0QmFzZUZvbnRNZXRyaWNzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QmFzZUZvbnRNZXRyaWNzKG5hbWUpIHsKKyAgICAgIHZhciBkZWZhdWx0V2lkdGggPSAwOworICAgICAgdmFyIHdpZHRocyA9IFtdOworICAgICAgdmFyIG1vbm9zcGFjZSA9IGZhbHNlOworICAgICAgdmFyIHN0ZEZvbnRNYXAgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN0ZEZvbnRNYXApKCk7CisgICAgICB2YXIgbG9va3VwTmFtZSA9IHN0ZEZvbnRNYXBbbmFtZV0gfHwgbmFtZTsKKyAgICAgIHZhciBNZXRyaWNzID0gKDAsIF9tZXRyaWNzLmdldE1ldHJpY3MpKCk7CisKKyAgICAgIGlmICghKGxvb2t1cE5hbWUgaW4gTWV0cmljcykpIHsKKyAgICAgICAgaWYgKHRoaXMuaXNTZXJpZkZvbnQobmFtZSkpIHsKKyAgICAgICAgICBsb29rdXBOYW1lID0gIlRpbWVzLVJvbWFuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsb29rdXBOYW1lID0gIkhlbHZldGljYSI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGdseXBoV2lkdGhzID0gTWV0cmljc1tsb29rdXBOYW1lXTsKKworICAgICAgaWYgKCgwLCBfdXRpbC5pc051bSkoZ2x5cGhXaWR0aHMpKSB7CisgICAgICAgIGRlZmF1bHRXaWR0aCA9IGdseXBoV2lkdGhzOworICAgICAgICBtb25vc3BhY2UgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2lkdGhzID0gZ2x5cGhXaWR0aHMoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgZGVmYXVsdFdpZHRoOiBkZWZhdWx0V2lkdGgsCisgICAgICAgIG1vbm9zcGFjZTogbW9ub3NwYWNlLAorICAgICAgICB3aWR0aHM6IHdpZHRocworICAgICAgfTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJidWlsZENoYXJDb2RlVG9XaWR0aCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkQ2hhckNvZGVUb1dpZHRoKHdpZHRoc0J5R2x5cGhOYW1lLCBwcm9wZXJ0aWVzKSB7CisgICAgICB2YXIgd2lkdGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIHZhciBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CisgICAgICB2YXIgZW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKKworICAgICAgZm9yICh2YXIgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgeworICAgICAgICBpZiAoY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMgJiYgd2lkdGhzQnlHbHlwaE5hbWVbZGlmZmVyZW5jZXNbY2hhckNvZGVdXSkgeworICAgICAgICAgIHdpZHRoc1tjaGFyQ29kZV0gPSB3aWR0aHNCeUdseXBoTmFtZVtkaWZmZXJlbmNlc1tjaGFyQ29kZV1dOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYXJDb2RlIGluIGVuY29kaW5nICYmIHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV0pIHsKKyAgICAgICAgICB3aWR0aHNbY2hhckNvZGVdID0gd2lkdGhzQnlHbHlwaE5hbWVbZW5jb2RpbmdbY2hhckNvZGVdXTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gd2lkdGhzOworICAgIH0KKyAgfSwgeworICAgIGtleTogInByZUV2YWx1YXRlRm9udCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHByZUV2YWx1YXRlRm9udChkaWN0KSB7CisgICAgICB2YXIgYmFzZURpY3QgPSBkaWN0OworICAgICAgdmFyIHR5cGUgPSBkaWN0LmdldCgiU3VidHlwZSIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBmb250IFN1YnR5cGUiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNvbXBvc2l0ZSA9IGZhbHNlOworICAgICAgdmFyIHVpbnQ4YXJyYXk7CisKKyAgICAgIGlmICh0eXBlLm5hbWUgPT09ICJUeXBlMCIpIHsKKyAgICAgICAgdmFyIGRmID0gZGljdC5nZXQoIkRlc2NlbmRhbnRGb250cyIpOworCisgICAgICAgIGlmICghZGYpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkRlc2NlbmRhbnQgZm9udHMgYXJlIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGRpY3QgPSBBcnJheS5pc0FycmF5KGRmKSA/IHRoaXMueHJlZi5mZXRjaElmUmVmKGRmWzBdKSA6IGRmOworICAgICAgICB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpOworICAgICAgICB9CisKKyAgICAgICAgY29tcG9zaXRlID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdmFyIGRlc2NyaXB0b3IgPSBkaWN0LmdldCgiRm9udERlc2NyaXB0b3IiKTsKKworICAgICAgaWYgKGRlc2NyaXB0b3IpIHsKKyAgICAgICAgdmFyIGhhc2ggPSBuZXcgX211cm11cmhhc2guTXVybXVySGFzaDNfNjQoKTsKKyAgICAgICAgdmFyIGVuY29kaW5nID0gYmFzZURpY3QuZ2V0UmF3KCJFbmNvZGluZyIpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShlbmNvZGluZykpIHsKKyAgICAgICAgICBoYXNoLnVwZGF0ZShlbmNvZGluZy5uYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGVuY29kaW5nKSkgeworICAgICAgICAgIGhhc2gudXBkYXRlKGVuY29kaW5nLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGVuY29kaW5nKSkgeworICAgICAgICAgIHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZW5jb2RpbmcuZ2V0UmF3VmFsdWVzKCkpLAorICAgICAgICAgICAgICBfc3RlcDU7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I1LnMoKTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gX3N0ZXA1LnZhbHVlOworCisgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBoYXNoLnVwZGF0ZShlbnRyeS5uYW1lKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGVudHJ5KSkgeworICAgICAgICAgICAgICAgIGhhc2gudXBkYXRlKGVudHJ5LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZW50cnkpKSB7CisgICAgICAgICAgICAgICAgdmFyIGRpZmZMZW5ndGggPSBlbnRyeS5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGRpZmZCdWYgPSBuZXcgQXJyYXkoZGlmZkxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRpZmZMZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgdmFyIGRpZmZFbnRyeSA9IGVudHJ5W2pdOworCisgICAgICAgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZGlmZkVudHJ5KSkgeworICAgICAgICAgICAgICAgICAgICBkaWZmQnVmW2pdID0gZGlmZkVudHJ5Lm5hbWU7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc051bSkoZGlmZkVudHJ5KSB8fCAoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGRpZmZFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhhc2gudXBkYXRlKGRpZmZCdWYuam9pbigpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgX2l0ZXJhdG9yNS5lKGVycik7CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9pdGVyYXRvcjUuZigpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciBmaXJzdENoYXIgPSBkaWN0LmdldCgiRmlyc3RDaGFyIikgfHwgMDsKKyAgICAgICAgdmFyIGxhc3RDaGFyID0gZGljdC5nZXQoIkxhc3RDaGFyIikgfHwgKGNvbXBvc2l0ZSA/IDB4ZmZmZiA6IDB4ZmYpOworICAgICAgICBoYXNoLnVwZGF0ZSgiIi5jb25jYXQoZmlyc3RDaGFyLCAiLSIpLmNvbmNhdChsYXN0Q2hhcikpOworICAgICAgICB2YXIgdG9Vbmljb2RlID0gZGljdC5nZXQoIlRvVW5pY29kZSIpIHx8IGJhc2VEaWN0LmdldCgiVG9Vbmljb2RlIik7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkodG9Vbmljb2RlKSkgeworICAgICAgICAgIHZhciBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTsKKyAgICAgICAgICB1aW50OGFycmF5ID0gc3RyZWFtLmJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIuYnVmZmVyLCAwLCBzdHJlYW0uYnVmZmVyTGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KHN0cmVhbS5ieXRlcy5idWZmZXIsIHN0cmVhbS5zdGFydCwgc3RyZWFtLmVuZCAtIHN0cmVhbS5zdGFydCk7CisgICAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CisgICAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodG9Vbmljb2RlKSkgeworICAgICAgICAgIGhhc2gudXBkYXRlKHRvVW5pY29kZS5uYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIikgfHwgYmFzZURpY3QuZ2V0KCJXaWR0aHMiKTsKKworICAgICAgICBpZiAod2lkdGhzKSB7CisgICAgICAgICAgdWludDhhcnJheSA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheSh3aWR0aHMpLmJ1ZmZlcik7CisgICAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvciwKKyAgICAgICAgZGljdDogZGljdCwKKyAgICAgICAgYmFzZURpY3Q6IGJhc2VEaWN0LAorICAgICAgICBjb21wb3NpdGU6IGNvbXBvc2l0ZSwKKyAgICAgICAgdHlwZTogdHlwZS5uYW1lLAorICAgICAgICBoYXNoOiBoYXNoID8gaGFzaC5oZXhkaWdlc3QoKSA6ICIiCisgICAgICB9OworICAgIH0KKyAgfSwgeworICAgIGtleTogInRyYW5zbGF0ZUZvbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB0cmFuc2xhdGVGb250KHByZUV2YWx1YXRlZEZvbnQpIHsKKyAgICAgIHZhciBfdGhpczExID0gdGhpczsKKworICAgICAgdmFyIGJhc2VEaWN0ID0gcHJlRXZhbHVhdGVkRm9udC5iYXNlRGljdDsKKyAgICAgIHZhciBkaWN0ID0gcHJlRXZhbHVhdGVkRm9udC5kaWN0OworICAgICAgdmFyIGNvbXBvc2l0ZSA9IHByZUV2YWx1YXRlZEZvbnQuY29tcG9zaXRlOworICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcmVFdmFsdWF0ZWRGb250LmRlc2NyaXB0b3I7CisgICAgICB2YXIgdHlwZSA9IHByZUV2YWx1YXRlZEZvbnQudHlwZTsKKyAgICAgIHZhciBtYXhDaGFySW5kZXggPSBjb21wb3NpdGUgPyAweGZmZmYgOiAweGZmOworICAgICAgdmFyIHByb3BlcnRpZXM7CisgICAgICB2YXIgZmlyc3RDaGFyID0gZGljdC5nZXQoIkZpcnN0Q2hhciIpIHx8IDA7CisgICAgICB2YXIgbGFzdENoYXIgPSBkaWN0LmdldCgiTGFzdENoYXIiKSB8fCBtYXhDaGFySW5kZXg7CisKKyAgICAgIGlmICghZGVzY3JpcHRvcikgeworICAgICAgICBpZiAodHlwZSA9PT0gIlR5cGUzIikgeworICAgICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChudWxsKTsKKyAgICAgICAgICBkZXNjcmlwdG9yLnNldCgiRm9udE5hbWUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCh0eXBlKSk7CisgICAgICAgICAgZGVzY3JpcHRvci5zZXQoIkZvbnRCQm94IiwgZGljdC5nZXRBcnJheSgiRm9udEJCb3giKSB8fCBbMCwgMCwgMCwgMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhciBiYXNlRm9udE5hbWUgPSBkaWN0LmdldCgiQmFzZUZvbnQiKTsKKworICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoYmFzZUZvbnROYW1lKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYXNlIGZvbnQgaXMgbm90IHNwZWNpZmllZCIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJhc2VGb250TmFtZSA9IGJhc2VGb250TmFtZS5uYW1lLnJlcGxhY2UoL1ssX10vZywgIi0iKTsKKyAgICAgICAgICB2YXIgbWV0cmljcyA9IHRoaXMuZ2V0QmFzZUZvbnRNZXRyaWNzKGJhc2VGb250TmFtZSk7CisgICAgICAgICAgdmFyIGZvbnROYW1lV29TdHlsZSA9IGJhc2VGb250TmFtZS5zcGxpdCgiLSIpWzBdOworICAgICAgICAgIHZhciBmbGFncyA9ICh0aGlzLmlzU2VyaWZGb250KGZvbnROYW1lV29TdHlsZSkgPyBfZm9udHMuRm9udEZsYWdzLlNlcmlmIDogMCkgfCAobWV0cmljcy5tb25vc3BhY2UgPyBfZm9udHMuRm9udEZsYWdzLkZpeGVkUGl0Y2ggOiAwKSB8ICgoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN5bWJvbHNGb250cykoKVtmb250TmFtZVdvU3R5bGVdID8gX2ZvbnRzLkZvbnRGbGFncy5TeW1ib2xpYyA6IF9mb250cy5Gb250RmxhZ3MuTm9uc3ltYm9saWMpOworICAgICAgICAgIHByb3BlcnRpZXMgPSB7CisgICAgICAgICAgICB0eXBlOiB0eXBlLAorICAgICAgICAgICAgbmFtZTogYmFzZUZvbnROYW1lLAorICAgICAgICAgICAgd2lkdGhzOiBtZXRyaWNzLndpZHRocywKKyAgICAgICAgICAgIGRlZmF1bHRXaWR0aDogbWV0cmljcy5kZWZhdWx0V2lkdGgsCisgICAgICAgICAgICBmbGFnczogZmxhZ3MsCisgICAgICAgICAgICBmaXJzdENoYXI6IGZpcnN0Q2hhciwKKyAgICAgICAgICAgIGxhc3RDaGFyOiBsYXN0Q2hhcgorICAgICAgICAgIH07CisgICAgICAgICAgdmFyIHdpZHRocyA9IGRpY3QuZ2V0KCJXaWR0aHMiKTsKKyAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgZGljdCwgcHJvcGVydGllcykudGhlbihmdW5jdGlvbiAobmV3UHJvcGVydGllcykgeworICAgICAgICAgICAgaWYgKHdpZHRocykgeworICAgICAgICAgICAgICB2YXIgZ2x5cGhXaWR0aHMgPSBbXTsKKyAgICAgICAgICAgICAgdmFyIGogPSBmaXJzdENoYXI7CisKKyAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IF9pIDwgaWk7IF9pKyspIHsKKyAgICAgICAgICAgICAgICBnbHlwaFdpZHRoc1tqKytdID0gX3RoaXMxMS54cmVmLmZldGNoSWZSZWYod2lkdGhzW19pXSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLndpZHRocyA9IGdseXBoV2lkdGhzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBfdGhpczExLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBuZXdQcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBfZm9udHMuRm9udChiYXNlRm9udE5hbWUsIG51bGwsIG5ld1Byb3BlcnRpZXMpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBmb250TmFtZSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250TmFtZSIpOworICAgICAgdmFyIGJhc2VGb250ID0gZGljdC5nZXQoIkJhc2VGb250Iik7CisKKyAgICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKGZvbnROYW1lKSkgeworICAgICAgICBmb250TmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KGZvbnROYW1lKTsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykoYmFzZUZvbnQpKSB7CisgICAgICAgIGJhc2VGb250ID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoYmFzZUZvbnQpOworICAgICAgfQorCisgICAgICBpZiAodHlwZSAhPT0gIlR5cGUzIikgeworICAgICAgICB2YXIgZm9udE5hbWVTdHIgPSBmb250TmFtZSAmJiBmb250TmFtZS5uYW1lOworICAgICAgICB2YXIgYmFzZUZvbnRTdHIgPSBiYXNlRm9udCAmJiBiYXNlRm9udC5uYW1lOworCisgICAgICAgIGlmIChmb250TmFtZVN0ciAhPT0gYmFzZUZvbnRTdHIpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIlRoZSBGb250RGVzY3JpcHRvcidzIEZvbnROYW1lIGlzIFwiIi5jb25jYXQoZm9udE5hbWVTdHIsICJcIiBidXQgIikgKyAic2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250J3MgQmFzZUZvbnQgXCIiLmNvbmNhdChiYXNlRm9udFN0ciwgIlwiLiIpKTsKKworICAgICAgICAgIGlmIChmb250TmFtZVN0ciAmJiBiYXNlRm9udFN0ciAmJiBiYXNlRm9udFN0ci5zdGFydHNXaXRoKGZvbnROYW1lU3RyKSkgeworICAgICAgICAgICAgZm9udE5hbWUgPSBiYXNlRm9udDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9udE5hbWUgPSBmb250TmFtZSB8fCBiYXNlRm9udDsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmb250TmFtZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgbmFtZSIpOworICAgICAgfQorCisgICAgICB2YXIgZm9udEZpbGUgPSBkZXNjcmlwdG9yLmdldCgiRm9udEZpbGUiLCAiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIpOworCisgICAgICBpZiAoZm9udEZpbGUpIHsKKyAgICAgICAgaWYgKGZvbnRGaWxlLmRpY3QpIHsKKyAgICAgICAgICB2YXIgc3VidHlwZSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CisKKyAgICAgICAgICBpZiAoc3VidHlwZSkgeworICAgICAgICAgICAgc3VidHlwZSA9IHN1YnR5cGUubmFtZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgbGVuZ3RoMSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgxIik7CisgICAgICAgICAgdmFyIGxlbmd0aDIgPSBmb250RmlsZS5kaWN0LmdldCgiTGVuZ3RoMiIpOworICAgICAgICAgIHZhciBsZW5ndGgzID0gZm9udEZpbGUuZGljdC5nZXQoIkxlbmd0aDMiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwcm9wZXJ0aWVzID0geworICAgICAgICB0eXBlOiB0eXBlLAorICAgICAgICBuYW1lOiBmb250TmFtZS5uYW1lLAorICAgICAgICBzdWJ0eXBlOiBzdWJ0eXBlLAorICAgICAgICBmaWxlOiBmb250RmlsZSwKKyAgICAgICAgbGVuZ3RoMTogbGVuZ3RoMSwKKyAgICAgICAgbGVuZ3RoMjogbGVuZ3RoMiwKKyAgICAgICAgbGVuZ3RoMzogbGVuZ3RoMywKKyAgICAgICAgbG9hZGVkTmFtZTogYmFzZURpY3QubG9hZGVkTmFtZSwKKyAgICAgICAgY29tcG9zaXRlOiBjb21wb3NpdGUsCisgICAgICAgIGZpeGVkUGl0Y2g6IGZhbHNlLAorICAgICAgICBmb250TWF0cml4OiBkaWN0LmdldEFycmF5KCJGb250TWF0cml4IikgfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVgsCisgICAgICAgIGZpcnN0Q2hhcjogZmlyc3RDaGFyIHx8IDAsCisgICAgICAgIGxhc3RDaGFyOiBsYXN0Q2hhciB8fCBtYXhDaGFySW5kZXgsCisgICAgICAgIGJib3g6IGRlc2NyaXB0b3IuZ2V0QXJyYXkoIkZvbnRCQm94IiksCisgICAgICAgIGFzY2VudDogZGVzY3JpcHRvci5nZXQoIkFzY2VudCIpLAorICAgICAgICBkZXNjZW50OiBkZXNjcmlwdG9yLmdldCgiRGVzY2VudCIpLAorICAgICAgICB4SGVpZ2h0OiBkZXNjcmlwdG9yLmdldCgiWEhlaWdodCIpLAorICAgICAgICBjYXBIZWlnaHQ6IGRlc2NyaXB0b3IuZ2V0KCJDYXBIZWlnaHQiKSwKKyAgICAgICAgZmxhZ3M6IGRlc2NyaXB0b3IuZ2V0KCJGbGFncyIpLAorICAgICAgICBpdGFsaWNBbmdsZTogZGVzY3JpcHRvci5nZXQoIkl0YWxpY0FuZ2xlIiksCisgICAgICAgIGlzVHlwZTNGb250OiBmYWxzZQorICAgICAgfTsKKyAgICAgIHZhciBjTWFwUHJvbWlzZTsKKworICAgICAgaWYgKGNvbXBvc2l0ZSkgeworICAgICAgICB2YXIgY2lkRW5jb2RpbmcgPSBiYXNlRGljdC5nZXQoIkVuY29kaW5nIik7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGNpZEVuY29kaW5nKSkgeworICAgICAgICAgIHByb3BlcnRpZXMuY2lkRW5jb2RpbmcgPSBjaWRFbmNvZGluZy5uYW1lOworICAgICAgICB9CisKKyAgICAgICAgY01hcFByb21pc2UgPSBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgICAgIGVuY29kaW5nOiBjaWRFbmNvZGluZywKKyAgICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCisgICAgICAgICAgdXNlQ01hcDogbnVsbAorICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjTWFwKSB7CisgICAgICAgICAgcHJvcGVydGllcy5jTWFwID0gY01hcDsKKyAgICAgICAgICBwcm9wZXJ0aWVzLnZlcnRpY2FsID0gcHJvcGVydGllcy5jTWFwLnZlcnRpY2FsOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNNYXBQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjTWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIF90aGlzMTEuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIGJhc2VEaWN0LCBwcm9wZXJ0aWVzKTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKG5ld1Byb3BlcnRpZXMpIHsKKyAgICAgICAgX3RoaXMxMS5leHRyYWN0V2lkdGhzKGRpY3QsIGRlc2NyaXB0b3IsIG5ld1Byb3BlcnRpZXMpOworCisgICAgICAgIGlmICh0eXBlID09PSAiVHlwZTMiKSB7CisgICAgICAgICAgbmV3UHJvcGVydGllcy5pc1R5cGUzRm9udCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IF9mb250cy5Gb250KGZvbnROYW1lLm5hbWUsIGZvbnRGaWxlLCBuZXdQcm9wZXJ0aWVzKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9wZGZGdW5jdGlvbkZhY3RvcnkiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgdmFyIHBkZkZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBfZnVuY3Rpb24uUERGRnVuY3Rpb25GYWN0b3J5KHsKKyAgICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc0V2YWxTdXBwb3J0ZWQKKyAgICAgIH0pOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJfcGRmRnVuY3Rpb25GYWN0b3J5IiwgcGRmRnVuY3Rpb25GYWN0b3J5KTsKKyAgICB9CisgIH1dLCBbeworICAgIGtleTogImJ1aWxkRm9udFBhdGhzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCBoYW5kbGVyKSB7CisgICAgICBmdW5jdGlvbiBidWlsZFBhdGgoZm9udENoYXIpIHsKKyAgICAgICAgaWYgKGZvbnQucmVuZGVyZXIuaGFzQnVpbHRQYXRoKGZvbnRDaGFyKSkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgWyIiLmNvbmNhdChmb250LmxvYWRlZE5hbWUsICJfcGF0aF8iKS5jb25jYXQoZm9udENoYXIpLCAiRm9udFBhdGgiLCBmb250LnJlbmRlcmVyLmdldFBhdGhKcyhmb250Q2hhcildKTsKKyAgICAgIH0KKworICAgICAgdmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihnbHlwaHMpLAorICAgICAgICAgIF9zdGVwNjsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3I2LnMoKTsgIShfc3RlcDYgPSBfaXRlcmF0b3I2Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgZ2x5cGggPSBfc3RlcDYudmFsdWU7CisgICAgICAgICAgYnVpbGRQYXRoKGdseXBoLmZvbnRDaGFyKTsKKyAgICAgICAgICB2YXIgYWNjZW50ID0gZ2x5cGguYWNjZW50OworCisgICAgICAgICAgaWYgKGFjY2VudCAmJiBhY2NlbnQuZm9udENoYXIpIHsKKyAgICAgICAgICAgIGJ1aWxkUGF0aChhY2NlbnQuZm9udENoYXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvcjYuZShlcnIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgX2l0ZXJhdG9yNi5mKCk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmFsbGJhY2tGb250RGljdCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBkaWN0LnNldCgiQmFzZUZvbnQiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiUERGSlMtRmFsbGJhY2tGb250IikpOworICAgICAgZGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOworICAgICAgZGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOworICAgICAgZGljdC5zZXQoIkVuY29kaW5nIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIldpbkFuc2lFbmNvZGluZyIpKTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZmFsbGJhY2tGb250RGljdCIsIGRpY3QpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQYXJ0aWFsRXZhbHVhdG9yOworfSgpOworCitleHBvcnRzLlBhcnRpYWxFdmFsdWF0b3IgPSBQYXJ0aWFsRXZhbHVhdG9yOworCit2YXIgVHJhbnNsYXRlZEZvbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBUcmFuc2xhdGVkRm9udChfcmVmOCkgeworICAgIHZhciBsb2FkZWROYW1lID0gX3JlZjgubG9hZGVkTmFtZSwKKyAgICAgICAgZm9udCA9IF9yZWY4LmZvbnQsCisgICAgICAgIGRpY3QgPSBfcmVmOC5kaWN0LAorICAgICAgICBfcmVmOCRleHRyYVByb3BlcnRpZXMgPSBfcmVmOC5leHRyYVByb3BlcnRpZXMsCisgICAgICAgIGV4dHJhUHJvcGVydGllcyA9IF9yZWY4JGV4dHJhUHJvcGVydGllcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmOCRleHRyYVByb3BlcnRpZXM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNsYXRlZEZvbnQpOworCisgICAgdGhpcy5sb2FkZWROYW1lID0gbG9hZGVkTmFtZTsKKyAgICB0aGlzLmZvbnQgPSBmb250OworICAgIHRoaXMuZGljdCA9IGRpY3Q7CisgICAgdGhpcy5fZXh0cmFQcm9wZXJ0aWVzID0gZXh0cmFQcm9wZXJ0aWVzOworICAgIHRoaXMudHlwZTNMb2FkZWQgPSBudWxsOworICAgIHRoaXMudHlwZTNEZXBlbmRlbmNpZXMgPSBmb250LmlzVHlwZTNGb250ID8gbmV3IFNldCgpIDogbnVsbDsKKyAgICB0aGlzLnNlbnQgPSBmYWxzZTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhUcmFuc2xhdGVkRm9udCwgW3sKKyAgICBrZXk6ICJzZW5kIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2VuZChoYW5kbGVyKSB7CisgICAgICBpZiAodGhpcy5zZW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5zZW50ID0gdHJ1ZTsKKyAgICAgIGhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW3RoaXMubG9hZGVkTmFtZSwgIkZvbnQiLCB0aGlzLmZvbnQuZXhwb3J0RGF0YSh0aGlzLl9leHRyYVByb3BlcnRpZXMpXSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZmFsbGJhY2siLAorICAgIHZhbHVlOiBmdW5jdGlvbiBmYWxsYmFjayhoYW5kbGVyKSB7CisgICAgICBpZiAoIXRoaXMuZm9udC5kYXRhKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5mb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7CisgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5mb250LmdseXBoQ2FjaGVWYWx1ZXM7CisgICAgICBQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKHRoaXMuZm9udCwgZ2x5cGhzLCBoYW5kbGVyKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJsb2FkVHlwZTNEYXRhIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZFR5cGUzRGF0YShldmFsdWF0b3IsIHJlc291cmNlcywgdGFzaykgeworICAgICAgaWYgKHRoaXMudHlwZTNMb2FkZWQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZTNMb2FkZWQ7CisgICAgICB9CisKKyAgICAgIGlmICghdGhpcy5mb250LmlzVHlwZTNGb250KSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7CisgICAgICB9CisKKyAgICAgIHZhciB0eXBlM09wdGlvbnMgPSBPYmplY3QuY3JlYXRlKGV2YWx1YXRvci5vcHRpb25zKTsKKyAgICAgIHR5cGUzT3B0aW9ucy5pZ25vcmVFcnJvcnMgPSBmYWxzZTsKKyAgICAgIHZhciB0eXBlM0V2YWx1YXRvciA9IGV2YWx1YXRvci5jbG9uZSh0eXBlM09wdGlvbnMpOworICAgICAgdHlwZTNFdmFsdWF0b3IucGFyc2luZ1R5cGUzRm9udCA9IHRydWU7CisgICAgICB2YXIgdHJhbnNsYXRlZEZvbnQgPSB0aGlzLmZvbnQsCisgICAgICAgICAgdHlwZTNEZXBlbmRlbmNpZXMgPSB0aGlzLnR5cGUzRGVwZW5kZW5jaWVzOworICAgICAgdmFyIGxvYWRDaGFyUHJvY3NQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7CisgICAgICB2YXIgY2hhclByb2NzID0gdGhpcy5kaWN0LmdldCgiQ2hhclByb2NzIik7CisgICAgICB2YXIgZm9udFJlc291cmNlcyA9IHRoaXMuZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlczsKKyAgICAgIHZhciBjaGFyUHJvY09wZXJhdG9yTGlzdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgIHZhciBfaXRlcmF0b3I3ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY2hhclByb2NzLmdldEtleXMoKSksCisgICAgICAgICAgX3N0ZXA3OworCisgICAgICB0cnkgeworICAgICAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKCkgeworICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDcudmFsdWU7CisgICAgICAgICAgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBsb2FkQ2hhclByb2NzUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHZhciBnbHlwaFN0cmVhbSA9IGNoYXJQcm9jcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIHZhciBvcGVyYXRvckxpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CisgICAgICAgICAgICByZXR1cm4gdHlwZTNFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgICAgICAgc3RyZWFtOiBnbHlwaFN0cmVhbSwKKyAgICAgICAgICAgICAgdGFzazogdGFzaywKKyAgICAgICAgICAgICAgcmVzb3VyY2VzOiBmb250UmVzb3VyY2VzLAorICAgICAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wZXJhdG9yTGlzdAorICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgIGNoYXJQcm9jT3BlcmF0b3JMaXN0W2tleV0gPSBvcGVyYXRvckxpc3QuZ2V0SVIoKTsKKworICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yOCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG9wZXJhdG9yTGlzdC5kZXBlbmRlbmNpZXMpLAorICAgICAgICAgICAgICAgICAgX3N0ZXA4OworCisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I4LnMoKTsgIShfc3RlcDggPSBfaXRlcmF0b3I4Lm4oKSkuZG9uZTspIHsKKyAgICAgICAgICAgICAgICAgIHZhciBkZXBlbmRlbmN5ID0gX3N0ZXA4LnZhbHVlOworICAgICAgICAgICAgICAgICAgdHlwZTNEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgICAgICAgX2l0ZXJhdG9yOC5lKGVycik7CisgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX2l0ZXJhdG9yOC5mKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUeXBlMyBmb250IHJlc291cmNlIFwiIi5jb25jYXQoa2V5LCAiXCIgaXMgbm90IGF2YWlsYWJsZS4iKSk7CisgICAgICAgICAgICAgIHZhciBkdW1teU9wZXJhdG9yTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKKyAgICAgICAgICAgICAgY2hhclByb2NPcGVyYXRvckxpc3Rba2V5XSA9IGR1bW15T3BlcmF0b3JMaXN0LmdldElSKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKF9pdGVyYXRvcjcucygpOyAhKF9zdGVwNyA9IF9pdGVyYXRvcjcubigpKS5kb25lOykgeworICAgICAgICAgIF9sb29wMigpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yNy5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3I3LmYoKTsKKyAgICAgIH0KKworICAgICAgdGhpcy50eXBlM0xvYWRlZCA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICB0cmFuc2xhdGVkRm9udC5jaGFyUHJvY09wZXJhdG9yTGlzdCA9IGNoYXJQcm9jT3BlcmF0b3JMaXN0OworICAgICAgfSk7CisgICAgICByZXR1cm4gdGhpcy50eXBlM0xvYWRlZDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gVHJhbnNsYXRlZEZvbnQ7Cit9KCk7CisKK3ZhciBTdGF0ZU1hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBTdGF0ZU1hbmFnZXIoaW5pdGlhbFN0YXRlKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRlTWFuYWdlcik7CisKKyAgICB0aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlOworICAgIHRoaXMuc3RhdGVTdGFjayA9IFtdOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFN0YXRlTWFuYWdlciwgW3sKKyAgICBrZXk6ICJzYXZlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2F2ZSgpIHsKKyAgICAgIHZhciBvbGQgPSB0aGlzLnN0YXRlOworICAgICAgdGhpcy5zdGF0ZVN0YWNrLnB1c2godGhpcy5zdGF0ZSk7CisgICAgICB0aGlzLnN0YXRlID0gb2xkLmNsb25lKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicmVzdG9yZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7CisgICAgICB2YXIgcHJldiA9IHRoaXMuc3RhdGVTdGFjay5wb3AoKTsKKworICAgICAgaWYgKHByZXYpIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHByZXY7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAidHJhbnNmb3JtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gdHJhbnNmb3JtKGFyZ3MpIHsKKyAgICAgIHRoaXMuc3RhdGUuY3RtID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGhpcy5zdGF0ZS5jdG0sIGFyZ3MpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBTdGF0ZU1hbmFnZXI7Cit9KCk7CisKK3ZhciBUZXh0U3RhdGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBUZXh0U3RhdGUoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRTdGF0ZSk7CisKKyAgICB0aGlzLmN0bSA9IG5ldyBGbG9hdDMyQXJyYXkoX3V0aWwuSURFTlRJVFlfTUFUUklYKTsKKyAgICB0aGlzLmZvbnROYW1lID0gbnVsbDsKKyAgICB0aGlzLmZvbnRTaXplID0gMDsKKyAgICB0aGlzLmZvbnQgPSBudWxsOworICAgIHRoaXMuZm9udE1hdHJpeCA9IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgIHRoaXMudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWC5zbGljZSgpOworICAgIHRoaXMudGV4dExpbmVNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVguc2xpY2UoKTsKKyAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDsKKyAgICB0aGlzLndvcmRTcGFjaW5nID0gMDsKKyAgICB0aGlzLmxlYWRpbmcgPSAwOworICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7CisgICAgdGhpcy50ZXh0UmlzZSA9IDA7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoVGV4dFN0YXRlLCBbeworICAgIGtleTogInNldFRleHRNYXRyaXgiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIHZhciBtID0gdGhpcy50ZXh0TWF0cml4OworICAgICAgbVswXSA9IGE7CisgICAgICBtWzFdID0gYjsKKyAgICAgIG1bMl0gPSBjOworICAgICAgbVszXSA9IGQ7CisgICAgICBtWzRdID0gZTsKKyAgICAgIG1bNV0gPSBmOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldFRleHRMaW5lTWF0cml4IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4dExpbmVNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgeworICAgICAgdmFyIG0gPSB0aGlzLnRleHRMaW5lTWF0cml4OworICAgICAgbVswXSA9IGE7CisgICAgICBtWzFdID0gYjsKKyAgICAgIG1bMl0gPSBjOworICAgICAgbVszXSA9IGQ7CisgICAgICBtWzRdID0gZTsKKyAgICAgIG1bNV0gPSBmOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRyYW5zbGF0ZVRleHRNYXRyaXgiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB0cmFuc2xhdGVUZXh0TWF0cml4KHgsIHkpIHsKKyAgICAgIHZhciBtID0gdGhpcy50ZXh0TWF0cml4OworICAgICAgbVs0XSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdOworICAgICAgbVs1XSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRyYW5zbGF0ZVRleHRMaW5lTWF0cml4IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gdHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoeCwgeSkgeworICAgICAgdmFyIG0gPSB0aGlzLnRleHRMaW5lTWF0cml4OworICAgICAgbVs0XSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdOworICAgICAgbVs1XSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNhbGNUZXh0TGluZU1hdHJpeEFkdmFuY2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjVGV4dExpbmVNYXRyaXhBZHZhbmNlKGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIHZhciBmb250ID0gdGhpcy5mb250OworCisgICAgICBpZiAoIWZvbnQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciBtID0gdGhpcy50ZXh0TGluZU1hdHJpeDsKKworICAgICAgaWYgKCEoYSA9PT0gbVswXSAmJiBiID09PSBtWzFdICYmIGMgPT09IG1bMl0gJiYgZCA9PT0gbVszXSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciB0eERpZmYgPSBlIC0gbVs0XSwKKyAgICAgICAgICB0eURpZmYgPSBmIC0gbVs1XTsKKworICAgICAgaWYgKGZvbnQudmVydGljYWwgJiYgdHhEaWZmICE9PSAwIHx8ICFmb250LnZlcnRpY2FsICYmIHR5RGlmZiAhPT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIHR4LAorICAgICAgICAgIHR5LAorICAgICAgICAgIGRlbm9taW5hdG9yID0gYSAqIGQgLSBiICogYzsKKworICAgICAgaWYgKGZvbnQudmVydGljYWwpIHsKKyAgICAgICAgdHggPSAtdHlEaWZmICogYyAvIGRlbm9taW5hdG9yOworICAgICAgICB0eSA9IHR5RGlmZiAqIGEgLyBkZW5vbWluYXRvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHR4ID0gdHhEaWZmICogZCAvIGRlbm9taW5hdG9yOworICAgICAgICB0eSA9IC10eERpZmYgKiBiIC8gZGVub21pbmF0b3I7CisgICAgICB9CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIHdpZHRoOiB0eCwKKyAgICAgICAgaGVpZ2h0OiB0eSwKKyAgICAgICAgdmFsdWU6IGZvbnQudmVydGljYWwgPyB0eSA6IHR4CisgICAgICB9OworICAgIH0KKyAgfSwgeworICAgIGtleTogImNhbGNSZW5kZXJNYXRyaXgiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjUmVuZGVyTWF0cml4KGN0bSkgeworICAgICAgdmFyIHRzbSA9IFt0aGlzLmZvbnRTaXplICogdGhpcy50ZXh0SFNjYWxlLCAwLCAwLCB0aGlzLmZvbnRTaXplLCAwLCB0aGlzLnRleHRSaXNlXTsKKyAgICAgIHJldHVybiBfdXRpbC5VdGlsLnRyYW5zZm9ybShjdG0sIF91dGlsLlV0aWwudHJhbnNmb3JtKHRoaXMudGV4dE1hdHJpeCwgdHNtKSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2FycmlhZ2VSZXR1cm4iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjYXJyaWFnZVJldHVybigpIHsKKyAgICAgIHRoaXMudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoMCwgLXRoaXMubGVhZGluZyk7CisgICAgICB0aGlzLnRleHRNYXRyaXggPSB0aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2xvbmUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9uZSgpIHsKKyAgICAgIHZhciBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CisgICAgICBjbG9uZS50ZXh0TWF0cml4ID0gdGhpcy50ZXh0TWF0cml4LnNsaWNlKCk7CisgICAgICBjbG9uZS50ZXh0TGluZU1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKKyAgICAgIGNsb25lLmZvbnRNYXRyaXggPSB0aGlzLmZvbnRNYXRyaXguc2xpY2UoKTsKKyAgICAgIHJldHVybiBjbG9uZTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gVGV4dFN0YXRlOworfSgpOworCit2YXIgRXZhbFN0YXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gRXZhbFN0YXRlKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFdmFsU3RhdGUpOworCisgICAgdGhpcy5jdG0gPSBuZXcgRmxvYXQzMkFycmF5KF91dGlsLklERU5USVRZX01BVFJJWCk7CisgICAgdGhpcy5mb250ID0gbnVsbDsKKyAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTDsKKyAgICB0aGlzLmZpbGxDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CisgICAgdGhpcy5zdHJva2VDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoRXZhbFN0YXRlLCBbeworICAgIGtleTogImNsb25lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoKSB7CisgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gRXZhbFN0YXRlOworfSgpOworCit2YXIgRXZhbHVhdG9yUHJlcHJvY2Vzc29yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgX2NyZWF0ZUNsYXNzKEV2YWx1YXRvclByZXByb2Nlc3NvciwgbnVsbCwgW3sKKyAgICBrZXk6ICJvcE1hcCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB2YXIgZ2V0T1BNYXAgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgICAgICB0LncgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRMaW5lV2lkdGgsCisgICAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuSiA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldExpbmVDYXAsCisgICAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuaiA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldExpbmVKb2luLAorICAgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0Lk0gPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRNaXRlckxpbWl0LAorICAgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LmQgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXREYXNoLAorICAgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LnJpID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0UmVuZGVyaW5nSW50ZW50LAorICAgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LmkgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGbGF0bmVzcywKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5ncyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldEdTdGF0ZSwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5xID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2F2ZSwKKyAgICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5RID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMucmVzdG9yZSwKKyAgICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5jbSA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnRyYW5zZm9ybSwKKyAgICAgICAgICBudW1BcmdzOiA2LAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5tID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMubW92ZVRvLAorICAgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LmwgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5saW5lVG8sCisgICAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuYyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLmN1cnZlVG8sCisgICAgICAgICAgbnVtQXJnczogNiwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQudiA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLmN1cnZlVG8yLAorICAgICAgICAgIG51bUFyZ3M6IDQsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LnkgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5jdXJ2ZVRvMywKKyAgICAgICAgICBudW1BcmdzOiA0LAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5oID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuY2xvc2VQYXRoLAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LnJlID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMucmVjdGFuZ2xlLAorICAgICAgICAgIG51bUFyZ3M6IDQsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LlMgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zdHJva2UsCisgICAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQucyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLmNsb3NlU3Ryb2tlLAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LmYgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsLAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LkYgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsLAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0WyJmKiJdID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuZW9GaWxsLAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LkIgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsU3Ryb2tlLAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0WyJCKiJdID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuZW9GaWxsU3Ryb2tlLAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LmIgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5jbG9zZUZpbGxTdHJva2UsCisgICAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHRbImIqIl0gPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5jbG9zZUVPRmlsbFN0cm9rZSwKKyAgICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5uID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuZW5kUGF0aCwKKyAgICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5XID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuY2xpcCwKKyAgICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdFsiVyoiXSA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLmVvQ2xpcCwKKyAgICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5CVCA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLmJlZ2luVGV4dCwKKyAgICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5FVCA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLmVuZFRleHQsCisgICAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuVGMgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZywKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5UdyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldFdvcmRTcGFjaW5nLAorICAgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LlR6ID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0SFNjYWxlLAorICAgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LlRMID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0TGVhZGluZywKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5UZiA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZvbnQsCisgICAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuVHIgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZSwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5UcyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldFRleHRSaXNlLAorICAgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LlRkID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMubW92ZVRleHQsCisgICAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuVEQgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRMZWFkaW5nTW92ZVRleHQsCisgICAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuVG0gPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRUZXh0TWF0cml4LAorICAgICAgICAgIG51bUFyZ3M6IDYsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0WyJUKiJdID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMubmV4dExpbmUsCisgICAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuVGogPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zaG93VGV4dCwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5USiA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNob3dTcGFjZWRUZXh0LAorICAgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0WyInIl0gPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5uZXh0TGluZVNob3dUZXh0LAorICAgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0WyciJ10gPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dCwKKyAgICAgICAgICBudW1BcmdzOiAzLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5kMCA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldENoYXJXaWR0aCwKKyAgICAgICAgICBudW1BcmdzOiAyLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5kMSA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcywKKyAgICAgICAgICBudW1BcmdzOiA2LAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5DUyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yU3BhY2UsCisgICAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuY3MgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGaWxsQ29sb3JTcGFjZSwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5TQyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yLAorICAgICAgICAgIG51bUFyZ3M6IDQsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCisgICAgICAgIH07CisgICAgICAgIHQuU0NOID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3JOLAorICAgICAgICAgIG51bUFyZ3M6IDMzLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQorICAgICAgICB9OworICAgICAgICB0LnNjID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbENvbG9yLAorICAgICAgICAgIG51bUFyZ3M6IDQsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCisgICAgICAgIH07CisgICAgICAgIHQuc2NuID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbENvbG9yTiwKKyAgICAgICAgICBudW1BcmdzOiAzMywKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IHRydWUKKyAgICAgICAgfTsKKyAgICAgICAgdC5HID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlR3JheSwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5nID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbEdyYXksCisgICAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuUkcgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRTdHJva2VSR0JDb2xvciwKKyAgICAgICAgICBudW1BcmdzOiAzLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5yZyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvciwKKyAgICAgICAgICBudW1BcmdzOiAzLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5LID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLAorICAgICAgICAgIG51bUFyZ3M6IDQsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LmsgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGaWxsQ01ZS0NvbG9yLAorICAgICAgICAgIG51bUFyZ3M6IDQsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LnNoID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuc2hhZGluZ0ZpbGwsCisgICAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuQkkgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5iZWdpbklubGluZUltYWdlLAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LklEID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuYmVnaW5JbWFnZURhdGEsCisgICAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuRUkgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRJbmxpbmVJbWFnZSwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5EbyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLnBhaW50WE9iamVjdCwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5NUCA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLm1hcmtQb2ludCwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5EUCA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLm1hcmtQb2ludFByb3BzLAorICAgICAgICAgIG51bUFyZ3M6IDIsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LkJNQyA9IHsKKyAgICAgICAgICBpZDogX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudCwKKyAgICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5CREMgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywKKyAgICAgICAgICBudW1BcmdzOiAyLAorICAgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdC5FTUMgPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRNYXJrZWRDb250ZW50LAorICAgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgICB9OworICAgICAgICB0LkJYID0geworICAgICAgICAgIGlkOiBfdXRpbC5PUFMuYmVnaW5Db21wYXQsCisgICAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuRVggPSB7CisgICAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRDb21wYXQsCisgICAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICAgIH07CisgICAgICAgIHQuQk0gPSBudWxsOworICAgICAgICB0LkJEID0gbnVsbDsKKyAgICAgICAgdFsidHJ1ZSJdID0gbnVsbDsKKyAgICAgICAgdC5mYSA9IG51bGw7CisgICAgICAgIHQuZmFsID0gbnVsbDsKKyAgICAgICAgdC5mYWxzID0gbnVsbDsKKyAgICAgICAgdFsiZmFsc2UiXSA9IG51bGw7CisgICAgICAgIHQubnUgPSBudWxsOworICAgICAgICB0Lm51bCA9IG51bGw7CisgICAgICAgIHRbIm51bGwiXSA9IG51bGw7CisgICAgICB9KTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3BNYXAiLCBnZXRPUE1hcCgpKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJNQVhfSU5WQUxJRF9QQVRIX09QUyIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIk1BWF9JTlZBTElEX1BBVEhfT1BTIiwgMjApOworICAgIH0KKyAgfV0pOworCisgIGZ1bmN0aW9uIEV2YWx1YXRvclByZXByb2Nlc3NvcihzdHJlYW0sIHhyZWYsIHN0YXRlTWFuYWdlcikgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFdmFsdWF0b3JQcmVwcm9jZXNzb3IpOworCisgICAgdGhpcy5wYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKHN0cmVhbSwgRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSwKKyAgICAgIHhyZWY6IHhyZWYKKyAgICB9KTsKKyAgICB0aGlzLnN0YXRlTWFuYWdlciA9IHN0YXRlTWFuYWdlcjsKKyAgICB0aGlzLm5vblByb2Nlc3NlZEFyZ3MgPSBbXTsKKyAgICB0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA9IDA7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoRXZhbHVhdG9yUHJlcHJvY2Vzc29yLCBbeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkKG9wZXJhdGlvbikgeworICAgICAgdmFyIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIG9iaiA9IHRoaXMucGFyc2VyLmdldE9iaigpOworCisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQpIHsKKyAgICAgICAgICB2YXIgY21kID0gb2JqLmNtZDsKKyAgICAgICAgICB2YXIgb3BTcGVjID0gRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwW2NtZF07CisKKyAgICAgICAgICBpZiAoIW9wU3BlYykgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmtub3duIGNvbW1hbmQgXCIiLmNvbmNhdChjbWQsICJcIi4iKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgZm4gPSBvcFNwZWMuaWQ7CisgICAgICAgICAgdmFyIG51bUFyZ3MgPSBvcFNwZWMubnVtQXJnczsKKyAgICAgICAgICB2YXIgYXJnc0xlbmd0aCA9IGFyZ3MgIT09IG51bGwgPyBhcmdzLmxlbmd0aCA6IDA7CisKKyAgICAgICAgICBpZiAoIW9wU3BlYy52YXJpYWJsZUFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChhcmdzTGVuZ3RoICE9PSBudW1BcmdzKSB7CisgICAgICAgICAgICAgIHZhciBub25Qcm9jZXNzZWRBcmdzID0gdGhpcy5ub25Qcm9jZXNzZWRBcmdzOworCisgICAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoID4gbnVtQXJncykgeworICAgICAgICAgICAgICAgIG5vblByb2Nlc3NlZEFyZ3MucHVzaChhcmdzLnNoaWZ0KCkpOworICAgICAgICAgICAgICAgIGFyZ3NMZW5ndGgtLTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoIDwgbnVtQXJncyAmJiBub25Qcm9jZXNzZWRBcmdzLmxlbmd0aCAhPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICBhcmdzID0gW107CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXJncy51bnNoaWZ0KG5vblByb2Nlc3NlZEFyZ3MucG9wKCkpOworICAgICAgICAgICAgICAgIGFyZ3NMZW5ndGgrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXJnc0xlbmd0aCA8IG51bUFyZ3MpIHsKKyAgICAgICAgICAgICAgdmFyIHBhcnRpYWxNc2cgPSAiY29tbWFuZCAiLmNvbmNhdChjbWQsICI6IGV4cGVjdGVkICIpLmNvbmNhdChudW1BcmdzLCAiIGFyZ3MsICIpICsgImJ1dCByZWNlaXZlZCAiLmNvbmNhdChhcmdzTGVuZ3RoLCAiIGFyZ3MuIik7CisKKyAgICAgICAgICAgICAgaWYgKGZuID49IF91dGlsLk9QUy5tb3ZlVG8gJiYgZm4gPD0gX3V0aWwuT1BTLmVuZFBhdGggJiYgKyt0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA+IEV2YWx1YXRvclByZXByb2Nlc3Nvci5NQVhfSU5WQUxJRF9QQVRIX09QUykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCAiLmNvbmNhdChwYXJ0aWFsTXNnKSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlNraXBwaW5nICIuY29uY2F0KHBhcnRpYWxNc2cpKTsKKworICAgICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFyZ3MubGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc0xlbmd0aCA+IG51bUFyZ3MpIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiQ29tbWFuZCAiLmNvbmNhdChjbWQsICI6IGV4cGVjdGVkIFswLCAiKS5jb25jYXQobnVtQXJncywgIl0gYXJncywgIikgKyAiYnV0IHJlY2VpdmVkICIuY29uY2F0KGFyZ3NMZW5ndGgsICIgYXJncy4iKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5wcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncyk7CisgICAgICAgICAgb3BlcmF0aW9uLmZuID0gZm47CisgICAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9iaiA9PT0gX3ByaW1pdGl2ZXMuRU9GKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9iaiAhPT0gbnVsbCkgeworICAgICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CisgICAgICAgICAgICBhcmdzID0gW107CisgICAgICAgICAgfQorCisgICAgICAgICAgYXJncy5wdXNoKG9iaik7CisKKyAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAzMykgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJUb28gbWFueSBhcmd1bWVudHMiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwcmVwcm9jZXNzQ29tbWFuZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHByZXByb2Nlc3NDb21tYW5kKGZuLCBhcmdzKSB7CisgICAgICBzd2l0Y2ggKGZuIHwgMCkgeworICAgICAgICBjYXNlIF91dGlsLk9QUy5zYXZlOgorICAgICAgICAgIHRoaXMuc3RhdGVNYW5hZ2VyLnNhdmUoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF91dGlsLk9QUy5yZXN0b3JlOgorICAgICAgICAgIHRoaXMuc3RhdGVNYW5hZ2VyLnJlc3RvcmUoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF91dGlsLk9QUy50cmFuc2Zvcm06CisgICAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIudHJhbnNmb3JtKGFyZ3MpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInNhdmVkU3RhdGVzRGVwdGgiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuc3RhdGVNYW5hZ2VyLnN0YXRlU3RhY2subGVuZ3RoOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBFdmFsdWF0b3JQcmVwcm9jZXNzb3I7Cit9KCk7CisKKy8qKiovIH0pLAorLyogMjI2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQ01hcEZhY3RvcnkgPSBleHBvcnRzLklkZW50aXR5Q01hcCA9IGV4cG9ydHMuQ01hcCA9IHZvaWQgMDsKKwordmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXygyKSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjAyKTsKKwordmFyIF9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOCk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA1KTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOSk7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9CisKK2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH0KKworZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7IGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH0KKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBCVUlMVF9JTl9DTUFQUyA9IFsiQWRvYmUtR0IxLVVDUzIiLCAiQWRvYmUtQ05TMS1VQ1MyIiwgIkFkb2JlLUphcGFuMS1VQ1MyIiwgIkFkb2JlLUtvcmVhMS1VQ1MyIiwgIjc4LUVVQy1IIiwgIjc4LUVVQy1WIiwgIjc4LUgiLCAiNzgtUktTSi1IIiwgIjc4LVJLU0otViIsICI3OC1WIiwgIjc4bXMtUktTSi1IIiwgIjc4bXMtUktTSi1WIiwgIjgzcHYtUktTSi1IIiwgIjkwbXMtUktTSi1IIiwgIjkwbXMtUktTSi1WIiwgIjkwbXNwLVJLU0otSCIsICI5MG1zcC1SS1NKLVYiLCAiOTBwdi1SS1NKLUgiLCAiOTBwdi1SS1NKLVYiLCAiQWRkLUgiLCAiQWRkLVJLU0otSCIsICJBZGQtUktTSi1WIiwgIkFkZC1WIiwgIkFkb2JlLUNOUzEtMCIsICJBZG9iZS1DTlMxLTEiLCAiQWRvYmUtQ05TMS0yIiwgIkFkb2JlLUNOUzEtMyIsICJBZG9iZS1DTlMxLTQiLCAiQWRvYmUtQ05TMS01IiwgIkFkb2JlLUNOUzEtNiIsICJBZG9iZS1HQjEtMCIsICJBZG9iZS1HQjEtMSIsICJBZG9iZS1HQjEtMiIsICJBZG9iZS1HQjEtMyIsICJBZG9iZS1HQjEtNCIsICJBZG9iZS1HQjEtNSIsICJBZG9iZS1KYXBhbjEtMCIsICJBZG9iZS1KYXBhbjEtMSIsICJBZG9iZS1KYXBhbjEtMiIsICJBZG9iZS1KYXBhbjEtMyIsICJBZG9iZS1KYXBhbjEtNCIsICJBZG9iZS1KYXBhbjEtNSIsICJBZG9iZS1KYXBhbjEtNiIsICJBZG9iZS1Lb3JlYTEtMCIsICJBZG9iZS1Lb3JlYTEtMSIsICJBZG9iZS1Lb3JlYTEtMiIsICJCNS1IIiwgIkI1LVYiLCAiQjVwYy1IIiwgIkI1cGMtViIsICJDTlMtRVVDLUgiLCAiQ05TLUVVQy1WIiwgIkNOUzEtSCIsICJDTlMxLVYiLCAiQ05TMi1IIiwgIkNOUzItViIsICJFVEhLLUI1LUgiLCAiRVRISy1CNS1WIiwgIkVUZW4tQjUtSCIsICJFVGVuLUI1LVYiLCAiRVRlbm1zLUI1LUgiLCAiRVRlbm1zLUI1LVYiLCAiRVVDLUgiLCAiRVVDLVYiLCAiRXh0LUgiLCAiRXh0LVJLU0otSCIsICJFeHQtUktTSi1WIiwgIkV4dC1WIiwgIkdCLUVVQy1IIiwgIkdCLUVVQy1WIiwgIkdCLUgiLCAiR0ItViIsICJHQkstRVVDLUgiLCAiR0JLLUVVQy1WIiwgIkdCSzJLLUgiLCAiR0JLMkstViIsICJHQktwLUVVQy1IIiwgIkdCS3AtRVVDLVYiLCAiR0JULUVVQy1IIiwgIkdCVC1FVUMtViIsICJHQlQtSCIsICJHQlQtViIsICJHQlRwYy1FVUMtSCIsICJHQlRwYy1FVUMtViIsICJHQnBjLUVVQy1IIiwgIkdCcGMtRVVDLVYiLCAiSCIsICJIS2RsYS1CNS1IIiwgIkhLZGxhLUI1LVYiLCAiSEtkbGItQjUtSCIsICJIS2RsYi1CNS1WIiwgIkhLZ2Njcy1CNS1IIiwgIkhLZ2Njcy1CNS1WIiwgIkhLbTMxNC1CNS1IIiwgIkhLbTMxNC1CNS1WIiwgIkhLbTQ3MS1CNS1IIiwgIkhLbTQ3MS1CNS1WIiwgIkhLc2NzLUI1LUgiLCAiSEtzY3MtQjUtViIsICJIYW5rYWt1IiwgIkhpcmFnYW5hIiwgIktTQy1FVUMtSCIsICJLU0MtRVVDLVYiLCAiS1NDLUgiLCAiS1NDLUpvaGFiLUgiLCAiS1NDLUpvaGFiLVYiLCAiS1NDLVYiLCAiS1NDbXMtVUhDLUgiLCAiS1NDbXMtVUhDLUhXLUgiLCAiS1NDbXMtVUhDLUhXLVYiLCAiS1NDbXMtVUhDLVYiLCAiS1NDcGMtRVVDLUgiLCAiS1NDcGMtRVVDLVYiLCAiS2F0YWthbmEiLCAiTldQLUgiLCAiTldQLVYiLCAiUktTSi1IIiwgIlJLU0otViIsICJSb21hbiIsICJVbmlDTlMtVUNTMi1IIiwgIlVuaUNOUy1VQ1MyLVYiLCAiVW5pQ05TLVVURjE2LUgiLCAiVW5pQ05TLVVURjE2LVYiLCAiVW5pQ05TLVVURjMyLUgiLCAiVW5pQ05TLVVURjMyLVYiLCAiVW5pQ05TLVVURjgtSCIsICJVbmlDTlMtVVRGOC1WIiwgIlVuaUdCLVVDUzItSCIsICJVbmlHQi1VQ1MyLVYiLCAiVW5pR0ItVVRGMTYtSCIsICJVbmlHQi1VVEYxNi1WIiwgIlVuaUdCLVVURjMyLUgiLCAiVW5pR0ItVVRGMzItViIsICJVbmlHQi1VVEY4LUgiLCAiVW5pR0ItVVRGOC1WIiwgIlVuaUpJUy1VQ1MyLUgiLCAiVW5pSklTLVVDUzItSFctSCIsICJVbmlKSVMtVUNTMi1IVy1WIiwgIlVuaUpJUy1VQ1MyLVYiLCAiVW5pSklTLVVURjE2LUgiLCAiVW5pSklTLVVURjE2LVYiLCAiVW5pSklTLVVURjMyLUgiLCAiVW5pSklTLVVURjMyLVYiLCAiVW5pSklTLVVURjgtSCIsICJVbmlKSVMtVVRGOC1WIiwgIlVuaUpJUzIwMDQtVVRGMTYtSCIsICJVbmlKSVMyMDA0LVVURjE2LVYiLCAiVW5pSklTMjAwNC1VVEYzMi1IIiwgIlVuaUpJUzIwMDQtVVRGMzItViIsICJVbmlKSVMyMDA0LVVURjgtSCIsICJVbmlKSVMyMDA0LVVURjgtViIsICJVbmlKSVNQcm8tVUNTMi1IVy1WIiwgIlVuaUpJU1Byby1VQ1MyLVYiLCAiVW5pSklTUHJvLVVURjgtViIsICJVbmlKSVNYMDIxMy1VVEYzMi1IIiwgIlVuaUpJU1gwMjEzLVVURjMyLVYiLCAiVW5pSklTWDAyMTMyMDA0LVVURjMyLUgiLCAiVW5pSklTWDAyMTMyMDA0LVVURjMyLVYiLCAiVW5pS1MtVUNTMi1IIiwgIlVuaUtTLVVDUzItViIsICJVbmlLUy1VVEYxNi1IIiwgIlVuaUtTLVVURjE2LVYiLCAiVW5pS1MtVVRGMzItSCIsICJVbmlLUy1VVEYzMi1WIiwgIlVuaUtTLVVURjgtSCIsICJVbmlLUy1VVEY4LVYiLCAiViIsICJXUC1TeW1ib2wiXTsKK3ZhciBNQVhfTUFQX1JBTkdFID0gTWF0aC5wb3coMiwgMjQpIC0gMTsKKwordmFyIENNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDTWFwKCkgeworICAgIHZhciBidWlsdEluQ01hcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ01hcCk7CisKKyAgICB0aGlzLmNvZGVzcGFjZVJhbmdlcyA9IFtbXSwgW10sIFtdLCBbXV07CisgICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMgPSAwOworICAgIHRoaXMuX21hcCA9IFtdOworICAgIHRoaXMubmFtZSA9ICIiOworICAgIHRoaXMudmVydGljYWwgPSBmYWxzZTsKKyAgICB0aGlzLnVzZUNNYXAgPSBudWxsOworICAgIHRoaXMuYnVpbHRJbkNNYXAgPSBidWlsdEluQ01hcDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhDTWFwLCBbeworICAgIGtleTogImFkZENvZGVzcGFjZVJhbmdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQ29kZXNwYWNlUmFuZ2UobiwgbG93LCBoaWdoKSB7CisgICAgICB0aGlzLmNvZGVzcGFjZVJhbmdlc1tuIC0gMV0ucHVzaChsb3csIGhpZ2gpOworICAgICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMrKzsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJtYXBDaWRSYW5nZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CisgICAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXBDaWRSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisgICAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3crKzsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJtYXBCZlJhbmdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbWFwQmZSYW5nZShsb3csIGhpZ2gsIGRzdExvdykgeworICAgICAgaWYgKGhpZ2ggLSBsb3cgPiBNQVhfTUFQX1JBTkdFKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGxhc3RCeXRlID0gZHN0TG93Lmxlbmd0aCAtIDE7CisKKyAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgeworICAgICAgICB0aGlzLl9tYXBbbG93KytdID0gZHN0TG93OworICAgICAgICBkc3RMb3cgPSBkc3RMb3cuc3Vic3RyaW5nKDAsIGxhc3RCeXRlKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoZHN0TG93LmNoYXJDb2RlQXQobGFzdEJ5dGUpICsgMSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAibWFwQmZSYW5nZVRvQXJyYXkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBtYXBCZlJhbmdlVG9BcnJheShsb3csIGhpZ2gsIGFycmF5KSB7CisgICAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXBCZlJhbmdlVG9BcnJheSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGlpID0gYXJyYXkubGVuZ3RoOworICAgICAgdmFyIGkgPSAwOworCisgICAgICB3aGlsZSAobG93IDw9IGhpZ2ggJiYgaSA8IGlpKSB7CisgICAgICAgIHRoaXMuX21hcFtsb3ddID0gYXJyYXlbaSsrXTsKKyAgICAgICAgKytsb3c7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAibWFwT25lIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbWFwT25lKHNyYywgZHN0KSB7CisgICAgICB0aGlzLl9tYXBbc3JjXSA9IGRzdDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJsb29rdXAiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBsb29rdXAoY29kZSkgeworICAgICAgcmV0dXJuIHRoaXMuX21hcFtjb2RlXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjb250YWlucyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnRhaW5zKGNvZGUpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBbY29kZV0gIT09IHVuZGVmaW5lZDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmb3JFYWNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaykgeworICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDsKKyAgICAgIHZhciBsZW5ndGggPSBtYXAubGVuZ3RoOworCisgICAgICBpZiAobGVuZ3RoIDw9IDB4MTAwMDApIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmIChtYXBbaV0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodmFyIF9pIGluIG1hcCkgeworICAgICAgICAgIGNhbGxiYWNrKF9pLCBtYXBbX2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImNoYXJDb2RlT2YiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjaGFyQ29kZU9mKHZhbHVlKSB7CisgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwOworCisgICAgICBpZiAobWFwLmxlbmd0aCA8PSAweDEwMDAwKSB7CisgICAgICAgIHJldHVybiBtYXAuaW5kZXhPZih2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIG1hcCkgeworICAgICAgICBpZiAobWFwW2NoYXJDb2RlXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRNYXAiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXAoKSB7CisgICAgICByZXR1cm4gdGhpcy5fbWFwOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlYWRDaGFyQ29kZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWRDaGFyQ29kZShzdHIsIG9mZnNldCwgb3V0KSB7CisgICAgICB2YXIgYyA9IDA7CisgICAgICB2YXIgY29kZXNwYWNlUmFuZ2VzID0gdGhpcy5jb2Rlc3BhY2VSYW5nZXM7CisKKyAgICAgIGZvciAodmFyIG4gPSAwLCBubiA9IGNvZGVzcGFjZVJhbmdlcy5sZW5ndGg7IG4gPCBubjsgbisrKSB7CisgICAgICAgIGMgPSAoYyA8PCA4IHwgc3RyLmNoYXJDb2RlQXQob2Zmc2V0ICsgbikpID4+PiAwOworICAgICAgICB2YXIgY29kZXNwYWNlUmFuZ2UgPSBjb2Rlc3BhY2VSYW5nZXNbbl07CisKKyAgICAgICAgZm9yICh2YXIgayA9IDAsIGtrID0gY29kZXNwYWNlUmFuZ2UubGVuZ3RoOyBrIDwga2s7KSB7CisgICAgICAgICAgdmFyIGxvdyA9IGNvZGVzcGFjZVJhbmdlW2srK107CisgICAgICAgICAgdmFyIGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOworCisgICAgICAgICAgaWYgKGMgPj0gbG93ICYmIGMgPD0gaGlnaCkgeworICAgICAgICAgICAgb3V0LmNoYXJjb2RlID0gYzsKKyAgICAgICAgICAgIG91dC5sZW5ndGggPSBuICsgMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgb3V0LmNoYXJjb2RlID0gMDsKKyAgICAgIG91dC5sZW5ndGggPSAxOworICAgIH0KKyAgfSwgeworICAgIGtleTogImxlbmd0aCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc0lkZW50aXR5Q01hcCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICBpZiAoISh0aGlzLm5hbWUgPT09ICJJZGVudGl0eS1IIiB8fCB0aGlzLm5hbWUgPT09ICJJZGVudGl0eS1WIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fbWFwLmxlbmd0aCAhPT0gMHgxMDAwMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMHgxMDAwMDsgaSsrKSB7CisgICAgICAgIGlmICh0aGlzLl9tYXBbaV0gIT09IGkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIENNYXA7Cit9KCk7CisKK2V4cG9ydHMuQ01hcCA9IENNYXA7CisKK3ZhciBJZGVudGl0eUNNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9DTWFwKSB7CisgIF9pbmhlcml0cyhJZGVudGl0eUNNYXAsIF9DTWFwKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKElkZW50aXR5Q01hcCk7CisKKyAgZnVuY3Rpb24gSWRlbnRpdHlDTWFwKHZlcnRpY2FsLCBuKSB7CisgICAgdmFyIF90aGlzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElkZW50aXR5Q01hcCk7CisKKyAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpOworICAgIF90aGlzLnZlcnRpY2FsID0gdmVydGljYWw7CisKKyAgICBfdGhpcy5hZGRDb2Rlc3BhY2VSYW5nZShuLCAwLCAweGZmZmYpOworCisgICAgcmV0dXJuIF90aGlzOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKElkZW50aXR5Q01hcCwgW3sKKyAgICBrZXk6ICJtYXBDaWRSYW5nZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2UiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJtYXBCZlJhbmdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbWFwQmZSYW5nZShsb3csIGhpZ2gsIGRzdExvdykgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2UiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJtYXBCZlJhbmdlVG9BcnJheSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlVG9BcnJheSIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm1hcE9uZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG1hcE9uZShzcmMsIGRzdCkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcENpZE9uZSIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImxvb2t1cCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGxvb2t1cChjb2RlKSB7CisgICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2RlKSAmJiBjb2RlIDw9IDB4ZmZmZiA/IGNvZGUgOiB1bmRlZmluZWQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29udGFpbnMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjb250YWlucyhjb2RlKSB7CisgICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2RlKSAmJiBjb2RlIDw9IDB4ZmZmZjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmb3JFYWNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaykgeworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gMHhmZmZmOyBpKyspIHsKKyAgICAgICAgY2FsbGJhY2soaSwgaSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2hhckNvZGVPZiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNoYXJDb2RlT2YodmFsdWUpIHsKKyAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA8PSAweGZmZmYgPyB2YWx1ZSA6IC0xOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldE1hcCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1hcCgpIHsKKyAgICAgIHZhciBtYXAgPSBuZXcgQXJyYXkoMHgxMDAwMCk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKSB7CisgICAgICAgIG1hcFtpXSA9IGk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBtYXA7CisgICAgfQorICB9LCB7CisgICAga2V5OiAibGVuZ3RoIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiAweDEwMDAwOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzSWRlbnRpdHlDTWFwIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgYWNjZXNzIC5pc0lkZW50aXR5Q01hcCIpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBJZGVudGl0eUNNYXA7Cit9KENNYXApOworCitleHBvcnRzLklkZW50aXR5Q01hcCA9IElkZW50aXR5Q01hcDsKKwordmFyIEJpbmFyeUNNYXBSZWFkZXIgPSBmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gaGV4VG9JbnQoYSwgc2l6ZSkgeworICAgIHZhciBuID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHNpemU7IGkrKykgeworICAgICAgbiA9IG4gPDwgOCB8IGFbaV07CisgICAgfQorCisgICAgcmV0dXJuIG4gPj4+IDA7CisgIH0KKworICBmdW5jdGlvbiBoZXhUb1N0cihhLCBzaXplKSB7CisgICAgaWYgKHNpemUgPT09IDEpIHsKKyAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0pOworICAgIH0KKworICAgIGlmIChzaXplID09PSAzKSB7CisgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7CisgIH0KKworICBmdW5jdGlvbiBhZGRIZXgoYSwgYiwgc2l6ZSkgeworICAgIHZhciBjID0gMDsKKworICAgIGZvciAodmFyIGkgPSBzaXplOyBpID49IDA7IGktLSkgeworICAgICAgYyArPSBhW2ldICsgYltpXTsKKyAgICAgIGFbaV0gPSBjICYgMjU1OworICAgICAgYyA+Pj0gODsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBpbmNIZXgoYSwgc2l6ZSkgeworICAgIHZhciBjID0gMTsKKworICAgIGZvciAodmFyIGkgPSBzaXplOyBpID49IDAgJiYgYyA+IDA7IGktLSkgeworICAgICAgYyArPSBhW2ldOworICAgICAgYVtpXSA9IGMgJiAyNTU7CisgICAgICBjID4+PSA4OworICAgIH0KKyAgfQorCisgIHZhciBNQVhfTlVNX1NJWkUgPSAxNjsKKyAgdmFyIE1BWF9FTkNPREVEX05VTV9TSVpFID0gMTk7CisKKyAgZnVuY3Rpb24gQmluYXJ5Q01hcFN0cmVhbShkYXRhKSB7CisgICAgdGhpcy5idWZmZXIgPSBkYXRhOworICAgIHRoaXMucG9zID0gMDsKKyAgICB0aGlzLmVuZCA9IGRhdGEubGVuZ3RoOworICAgIHRoaXMudG1wQnVmID0gbmV3IFVpbnQ4QXJyYXkoTUFYX0VOQ09ERURfTlVNX1NJWkUpOworICB9CisKKyAgQmluYXJ5Q01hcFN0cmVhbS5wcm90b3R5cGUgPSB7CisgICAgcmVhZEJ5dGU6IGZ1bmN0aW9uIHJlYWRCeXRlKCkgeworICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuZW5kKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdOworICAgIH0sCisgICAgcmVhZE51bWJlcjogZnVuY3Rpb24gcmVhZE51bWJlcigpIHsKKyAgICAgIHZhciBuID0gMDsKKyAgICAgIHZhciBsYXN0OworCisgICAgICBkbyB7CisgICAgICAgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpOworCisgICAgICAgIGlmIChiIDwgMCkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3QgPSAhKGIgJiAweDgwKTsKKyAgICAgICAgbiA9IG4gPDwgNyB8IGIgJiAweDdmOworICAgICAgfSB3aGlsZSAoIWxhc3QpOworCisgICAgICByZXR1cm4gbjsKKyAgICB9LAorICAgIHJlYWRTaWduZWQ6IGZ1bmN0aW9uIHJlYWRTaWduZWQoKSB7CisgICAgICB2YXIgbiA9IHRoaXMucmVhZE51bWJlcigpOworICAgICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7CisgICAgfSwKKyAgICByZWFkSGV4OiBmdW5jdGlvbiByZWFkSGV4KG51bSwgc2l6ZSkgeworICAgICAgbnVtLnNldCh0aGlzLmJ1ZmZlci5zdWJhcnJheSh0aGlzLnBvcywgdGhpcy5wb3MgKyBzaXplICsgMSkpOworICAgICAgdGhpcy5wb3MgKz0gc2l6ZSArIDE7CisgICAgfSwKKyAgICByZWFkSGV4TnVtYmVyOiBmdW5jdGlvbiByZWFkSGV4TnVtYmVyKG51bSwgc2l6ZSkgeworICAgICAgdmFyIGxhc3Q7CisgICAgICB2YXIgc3RhY2sgPSB0aGlzLnRtcEJ1ZiwKKyAgICAgICAgICBzcCA9IDA7CisKKyAgICAgIGRvIHsKKyAgICAgICAgdmFyIGIgPSB0aGlzLnJlYWRCeXRlKCk7CisKKyAgICAgICAgaWYgKGIgPCAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJ1bmV4cGVjdGVkIEVPRiBpbiBiY21hcCIpOworICAgICAgICB9CisKKyAgICAgICAgbGFzdCA9ICEoYiAmIDB4ODApOworICAgICAgICBzdGFja1tzcCsrXSA9IGIgJiAweDdmOworICAgICAgfSB3aGlsZSAoIWxhc3QpOworCisgICAgICB2YXIgaSA9IHNpemUsCisgICAgICAgICAgYnVmZmVyID0gMCwKKyAgICAgICAgICBidWZmZXJTaXplID0gMDsKKworICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IDggJiYgc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgIGJ1ZmZlciA9IHN0YWNrWy0tc3BdIDw8IGJ1ZmZlclNpemUgfCBidWZmZXI7CisgICAgICAgICAgYnVmZmVyU2l6ZSArPSA3OworICAgICAgICB9CisKKyAgICAgICAgbnVtW2ldID0gYnVmZmVyICYgMjU1OworICAgICAgICBpLS07CisgICAgICAgIGJ1ZmZlciA+Pj0gODsKKyAgICAgICAgYnVmZmVyU2l6ZSAtPSA4OworICAgICAgfQorICAgIH0sCisgICAgcmVhZEhleFNpZ25lZDogZnVuY3Rpb24gcmVhZEhleFNpZ25lZChudW0sIHNpemUpIHsKKyAgICAgIHRoaXMucmVhZEhleE51bWJlcihudW0sIHNpemUpOworICAgICAgdmFyIHNpZ24gPSBudW1bc2l6ZV0gJiAxID8gMjU1IDogMDsKKyAgICAgIHZhciBjID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7CisgICAgICAgIGMgPSAoYyAmIDEpIDw8IDggfCBudW1baV07CisgICAgICAgIG51bVtpXSA9IGMgPj4gMSBeIHNpZ247CisgICAgICB9CisgICAgfSwKKyAgICByZWFkU3RyaW5nOiBmdW5jdGlvbiByZWFkU3RyaW5nKCkgeworICAgICAgdmFyIGxlbiA9IHRoaXMucmVhZE51bWJlcigpOworICAgICAgdmFyIHMgPSAiIjsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5yZWFkTnVtYmVyKCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gczsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gcHJvY2Vzc0JpbmFyeUNNYXAoZGF0YSwgY01hcCwgZXh0ZW5kKSB7CisgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgQmluYXJ5Q01hcFN0cmVhbShkYXRhKTsKKyAgICAgIHZhciBoZWFkZXIgPSBzdHJlYW0ucmVhZEJ5dGUoKTsKKyAgICAgIGNNYXAudmVydGljYWwgPSAhIShoZWFkZXIgJiAxKTsKKyAgICAgIHZhciB1c2VDTWFwID0gbnVsbDsKKyAgICAgIHZhciBzdGFydCA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7CisgICAgICB2YXIgZW5kID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKKworICAgICAgdmFyIF9jaGFyID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKKworICAgICAgdmFyIGNoYXJDb2RlID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKKyAgICAgIHZhciB0bXAgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOworICAgICAgdmFyIGNvZGU7CisgICAgICB2YXIgYjsKKworICAgICAgd2hpbGUgKChiID0gc3RyZWFtLnJlYWRCeXRlKCkpID49IDApIHsKKyAgICAgICAgdmFyIHR5cGUgPSBiID4+IDU7CisKKyAgICAgICAgaWYgKHR5cGUgPT09IDcpIHsKKyAgICAgICAgICBzd2l0Y2ggKGIgJiAweDFmKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIHVzZUNNYXAgPSBzdHJlYW0ucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzZXF1ZW5jZSA9ICEhKGIgJiAweDEwKTsKKyAgICAgICAgdmFyIGRhdGFTaXplID0gYiAmIDE1OworCisgICAgICAgIGlmIChkYXRhU2l6ZSArIDEgPiBNQVhfTlVNX1NJWkUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3NCaW5hcnlDTWFwOiBJbnZhbGlkIGRhdGFTaXplLiIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHVjczJEYXRhU2l6ZSA9IDE7CisgICAgICAgIHZhciBzdWJpdGVtc0NvdW50ID0gc3RyZWFtLnJlYWROdW1iZXIoKTsKKyAgICAgICAgdmFyIGk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIGNNYXAuYWRkQ29kZXNwYWNlUmFuZ2UoZGF0YVNpemUgKyAxLCBoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShkYXRhU2l6ZSArIDEsIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBzdHJlYW0ucmVhZE51bWJlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KF9jaGFyLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBjb2RlID0gc3RyZWFtLnJlYWROdW1iZXIoKTsKKyAgICAgICAgICAgIGNNYXAubWFwT25lKGhleFRvSW50KF9jaGFyLCBkYXRhU2l6ZSksIGNvZGUpOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGluY0hleChfY2hhciwgZGF0YVNpemUpOworCisgICAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcih0bXAsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgICBhZGRIZXgoX2NoYXIsIHRtcCwgZGF0YVNpemUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkU2lnbmVkKCkgKyAoY29kZSArIDEpOworICAgICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChfY2hhciwgZGF0YVNpemUpLCBjb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CisgICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLCBjb2RlKTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CisKKyAgICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgeworICAgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkSGV4KHN0YXJ0LCBlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBjb2RlID0gc3RyZWFtLnJlYWROdW1iZXIoKTsKKyAgICAgICAgICAgICAgY01hcC5tYXBDaWRSYW5nZShoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSwgY29kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoX2NoYXIsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOworICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoX2NoYXIsIHVjczJEYXRhU2l6ZSksIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSkpOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGluY0hleChfY2hhciwgdWNzMkRhdGFTaXplKTsKKworICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIodG1wLCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgICAgIGFkZEhleChfY2hhciwgdG1wLCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaW5jSGV4KGNoYXJDb2RlLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4U2lnbmVkKHRtcCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBhZGRIZXgoY2hhckNvZGUsIHRtcCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChfY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgdWNzMkRhdGFTaXplKTsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXJDb2RlLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgaW5jSGV4KGVuZCwgdWNzMkRhdGFTaXplKTsKKworICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoc3RhcnQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkSGV4KHN0YXJ0LCBlbmQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOworICAgICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoInByb2Nlc3NCaW5hcnlDTWFwOiBVbmtub3duIHR5cGU6ICIgKyB0eXBlKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHVzZUNNYXApIHsKKyAgICAgICAgcmVzb2x2ZShleHRlbmQodXNlQ01hcCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHJlc29sdmUoY01hcCk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyKCkge30KKworICBCaW5hcnlDTWFwUmVhZGVyLnByb3RvdHlwZSA9IHsKKyAgICBwcm9jZXNzOiBwcm9jZXNzQmluYXJ5Q01hcAorICB9OworICByZXR1cm4gQmluYXJ5Q01hcFJlYWRlcjsKK30oKTsKKwordmFyIENNYXBGYWN0b3J5ID0gZnVuY3Rpb24gQ01hcEZhY3RvcnlDbG9zdXJlKCkgeworICBmdW5jdGlvbiBzdHJUb0ludChzdHIpIHsKKyAgICB2YXIgYSA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworICAgICAgYSA9IGEgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkpOworICAgIH0KKworICAgIHJldHVybiBhID4+PiAwOworICB9CisKKyAgZnVuY3Rpb24gZXhwZWN0U3RyaW5nKG9iaikgeworICAgIGlmICghKDAsIF91dGlsLmlzU3RyaW5nKShvYmopKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBzdHJpbmcuIik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZXhwZWN0SW50KG9iaikgeworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBpbnQuIik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VCZkNoYXIoY01hcCwgbGV4ZXIpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKShvYmopKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJlbmRiZmNoYXIiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIHNyYyA9IHN0clRvSW50KG9iaik7CisgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIGRzdCA9IG9iajsKKyAgICAgIGNNYXAubWFwT25lKHNyYywgZHN0KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUJmUmFuZ2UoY01hcCwgbGV4ZXIpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKShvYmopKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJlbmRiZnJhbmdlIikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBsb3cgPSBzdHJUb0ludChvYmopOworICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBoaWdoID0gc3RyVG9JbnQob2JqKTsKKyAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopIHx8ICgwLCBfdXRpbC5pc1N0cmluZykob2JqKSkgeworICAgICAgICB2YXIgZHN0TG93ID0gTnVtYmVyLmlzSW50ZWdlcihvYmopID8gU3RyaW5nLmZyb21DaGFyQ29kZShvYmopIDogb2JqOworICAgICAgICBjTWFwLm1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpOworICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgIlsiKSkgeworICAgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgICAgd2hpbGUgKCEoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgIl0iKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRU9GKShvYmopKSB7CisgICAgICAgICAgYXJyYXkucHVzaChvYmopOworICAgICAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOworICAgICAgICB9CisKKyAgICAgICAgY01hcC5tYXBCZlJhbmdlVG9BcnJheShsb3csIGhpZ2gsIGFycmF5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBiZiByYW5nZS4iKTsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlQ2lkQ2hhcihjTWFwLCBsZXhlcikgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKG9iaikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgImVuZGNpZGNoYXIiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIHNyYyA9IHN0clRvSW50KG9iaik7CisgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgIGV4cGVjdEludChvYmopOworICAgICAgdmFyIGRzdCA9IG9iajsKKyAgICAgIGNNYXAubWFwT25lKHNyYywgZHN0KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAiZW5kY2lkcmFuZ2UiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIGxvdyA9IHN0clRvSW50KG9iaik7CisgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopOworICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisgICAgICBleHBlY3RJbnQob2JqKTsKKyAgICAgIHZhciBkc3RMb3cgPSBvYmo7CisgICAgICBjTWFwLm1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUNvZGVzcGFjZVJhbmdlKGNNYXAsIGxleGVyKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAiZW5kY29kZXNwYWNlcmFuZ2UiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICghKDAsIF91dGlsLmlzU3RyaW5nKShvYmopKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB2YXIgbG93ID0gc3RyVG9JbnQob2JqKTsKKyAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoISgwLCBfdXRpbC5pc1N0cmluZykob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopOworICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShvYmoubGVuZ3RoLCBsb3csIGhpZ2gpOworICAgIH0KKworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBjb2Rlc3BhY2UgcmFuZ2UuIik7CisgIH0KKworICBmdW5jdGlvbiBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKSB7CisgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSkgeworICAgICAgY01hcC52ZXJ0aWNhbCA9ICEhb2JqOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlQ01hcE5hbWUoY01hcCwgbGV4ZXIpIHsKKyAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkob2JqKSAmJiAoMCwgX3V0aWwuaXNTdHJpbmcpKG9iai5uYW1lKSkgeworICAgICAgY01hcC5uYW1lID0gb2JqLm5hbWU7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VDTWFwKGNNYXAsIGxleGVyLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7CisgICAgdmFyIHByZXZpb3VzOworICAgIHZhciBlbWJlZGRlZFVzZUNNYXA7CisKKyAgICBvYmpMb29wOiB3aGlsZSAodHJ1ZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKG9iaikpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShvYmopKSB7CisgICAgICAgICAgaWYgKG9iai5uYW1lID09PSAiV01vZGUiKSB7CisgICAgICAgICAgICBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKG9iai5uYW1lID09PSAiQ01hcE5hbWUiKSB7CisgICAgICAgICAgICBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcmV2aW91cyA9IG9iajsKKyAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaikpIHsKKyAgICAgICAgICBzd2l0Y2ggKG9iai5jbWQpIHsKKyAgICAgICAgICAgIGNhc2UgImVuZGNtYXAiOgorICAgICAgICAgICAgICBicmVhayBvYmpMb29wOworCisgICAgICAgICAgICBjYXNlICJ1c2VjbWFwIjoKKyAgICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHByZXZpb3VzKSkgeworICAgICAgICAgICAgICAgIGVtYmVkZGVkVXNlQ01hcCA9IHByZXZpb3VzLm5hbWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYmVnaW5jb2Rlc3BhY2VyYW5nZSI6CisgICAgICAgICAgICAgIHBhcnNlQ29kZXNwYWNlUmFuZ2UoY01hcCwgbGV4ZXIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYmVnaW5iZmNoYXIiOgorICAgICAgICAgICAgICBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJiZWdpbmNpZGNoYXIiOgorICAgICAgICAgICAgICBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYmVnaW5iZnJhbmdlIjoKKyAgICAgICAgICAgICAgcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgImJlZ2luY2lkcmFuZ2UiOgorICAgICAgICAgICAgICBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGNNYXAgZGF0YTogIiArIGV4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCF1c2VDTWFwICYmIGVtYmVkZGVkVXNlQ01hcCkgeworICAgICAgdXNlQ01hcCA9IGVtYmVkZGVkVXNlQ01hcDsKKyAgICB9CisKKyAgICBpZiAodXNlQ01hcCkgeworICAgICAgcmV0dXJuIGV4dGVuZENNYXAoY01hcCwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCk7CisgICAgfQorCisgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjTWFwKTsKKyAgfQorCisgIGZ1bmN0aW9uIGV4dGVuZENNYXAoY01hcCwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkgeworICAgIHJldHVybiBjcmVhdGVCdWlsdEluQ01hcCh1c2VDTWFwLCBmZXRjaEJ1aWx0SW5DTWFwKS50aGVuKGZ1bmN0aW9uIChuZXdDTWFwKSB7CisgICAgICBjTWFwLnVzZUNNYXAgPSBuZXdDTWFwOworCisgICAgICBpZiAoY01hcC5udW1Db2Rlc3BhY2VSYW5nZXMgPT09IDApIHsKKyAgICAgICAgdmFyIHVzZUNvZGVzcGFjZVJhbmdlcyA9IGNNYXAudXNlQ01hcC5jb2Rlc3BhY2VSYW5nZXM7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1c2VDb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBjTWFwLmNvZGVzcGFjZVJhbmdlc1tpXSA9IHVzZUNvZGVzcGFjZVJhbmdlc1tpXS5zbGljZSgpOworICAgICAgICB9CisKKyAgICAgICAgY01hcC5udW1Db2Rlc3BhY2VSYW5nZXMgPSBjTWFwLnVzZUNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzOworICAgICAgfQorCisgICAgICBjTWFwLnVzZUNNYXAuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgICBpZiAoIWNNYXAuY29udGFpbnMoa2V5KSkgeworICAgICAgICAgIGNNYXAubWFwT25lKGtleSwgY01hcC51c2VDTWFwLmxvb2t1cChrZXkpKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gY01hcDsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKG5hbWUsIGZldGNoQnVpbHRJbkNNYXApIHsKKyAgICBpZiAobmFtZSA9PT0gIklkZW50aXR5LUgiKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBJZGVudGl0eUNNYXAoZmFsc2UsIDIpKTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICJJZGVudGl0eS1WIikgeworICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgSWRlbnRpdHlDTWFwKHRydWUsIDIpKTsKKyAgICB9CisKKyAgICBpZiAoIUJVSUxUX0lOX0NNQVBTLmluY2x1ZGVzKG5hbWUpKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJVbmtub3duIENNYXAgbmFtZTogIiArIG5hbWUpKTsKKyAgICB9CisKKyAgICBpZiAoIWZldGNoQnVpbHRJbkNNYXApIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkJ1aWx0LWluIENNYXAgcGFyYW1ldGVycyBhcmUgbm90IHByb3ZpZGVkLiIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmV0Y2hCdWlsdEluQ01hcChuYW1lKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICB2YXIgY01hcERhdGEgPSBkYXRhLmNNYXBEYXRhLAorICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSA9IGRhdGEuY29tcHJlc3Npb25UeXBlOworICAgICAgdmFyIGNNYXAgPSBuZXcgQ01hcCh0cnVlKTsKKworICAgICAgaWYgKGNvbXByZXNzaW9uVHlwZSA9PT0gX3V0aWwuQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlDTWFwUmVhZGVyKCkucHJvY2VzcyhjTWFwRGF0YSwgY01hcCwgZnVuY3Rpb24gKHVzZUNNYXApIHsKKyAgICAgICAgICByZXR1cm4gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmIChjb21wcmVzc2lvblR5cGUgPT09IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORSkgeworICAgICAgICB2YXIgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihuZXcgX3N0cmVhbS5TdHJlYW0oY01hcERhdGEpKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgbnVsbCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIlRPRE86IE9ubHkgQklOQVJZL05PTkUgQ01hcCBjb21wcmVzc2lvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLiIpKTsKKyAgICB9KTsKKyAgfQorCisgIHJldHVybiB7CisgICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUocGFyYW1zKSB7CisgICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CisgICAgICAgIHZhciBlbmNvZGluZywgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCwgY01hcCwgbGV4ZXI7CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gcGFyYW1zLmVuY29kaW5nOworICAgICAgICAgICAgICAgIGZldGNoQnVpbHRJbkNNYXAgPSBwYXJhbXMuZmV0Y2hCdWlsdEluQ01hcDsKKyAgICAgICAgICAgICAgICB1c2VDTWFwID0gcGFyYW1zLnVzZUNNYXA7CisKKyAgICAgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGVuY29kaW5nKSkgeworICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCBjcmVhdGVCdWlsdEluQ01hcChlbmNvZGluZy5uYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKSk7CisKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShlbmNvZGluZykpIHsKKyAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNNYXAgPSBuZXcgQ01hcCgpOworICAgICAgICAgICAgICAgIGxleGVyID0gbmV3IF9wYXJzZXIuTGV4ZXIoZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkudGhlbihmdW5jdGlvbiAocGFyc2VkQ01hcCkgeworICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZENNYXAuaXNJZGVudGl0eUNNYXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKHBhcnNlZENNYXAubmFtZSwgZmV0Y2hCdWlsdEluQ01hcCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRDTWFwOworICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRW5jb2RpbmcgcmVxdWlyZWQuIik7CisKKyAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSk7CisgICAgICB9KSkoKTsKKyAgICB9CisgIH07Cit9KCk7CisKK2V4cG9ydHMuQ01hcEZhY3RvcnkgPSBDTWFwRmFjdG9yeTsKKworLyoqKi8gfSksCisvKiAyMjcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRGb250VHlwZSA9IGdldEZvbnRUeXBlOworZXhwb3J0cy5JZGVudGl0eVRvVW5pY29kZU1hcCA9IGV4cG9ydHMuVG9Vbmljb2RlTWFwID0gZXhwb3J0cy5Gb250RmxhZ3MgPSBleHBvcnRzLkZvbnQgPSBleHBvcnRzLkVycm9yRm9udCA9IGV4cG9ydHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2NmZl9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyOCk7CisKK3ZhciBfZ2x5cGhsaXN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMzEpOworCit2YXIgX2VuY29kaW5ncyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMwKTsKKwordmFyIF9zdGFuZGFyZF9mb250cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMyKTsKKwordmFyIF91bmljb2RlID0gX193X3BkZmpzX3JlcXVpcmVfXygyMzMpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK3ZhciBfZm9udF9yZW5kZXJlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjM0KTsKKwordmFyIF9jbWFwID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjYpOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA5KTsKKwordmFyIF90eXBlMV9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzNSk7CisKK2Z1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJ1bmRlZmluZWQiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyB0aHJvdyBfZTI7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UzKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMzsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQorCitmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfQorCitmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9CisKK2Z1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CisKK2Z1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQorCitmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSAidW5kZWZpbmVkIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbInJldHVybiJdICE9IG51bGwpIF9pWyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0KKworZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9CisKK3ZhciBQUklWQVRFX1VTRV9BUkVBUyA9IFtbMHhlMDAwLCAweGY4ZmZdLCBbMHgxMDAwMDAsIDB4MTBmZmZkXV07Cit2YXIgUERGX0dMWVBIX1NQQUNFX1VOSVRTID0gMTAwMDsKK3ZhciBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB0cnVlOworZXhwb3J0cy5TRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSBTRUFDX0FOQUxZU0lTX0VOQUJMRUQ7Cit2YXIgRVhQT1JUX0RBVEFfUFJPUEVSVElFUyA9IFsiYXNjZW50IiwgImJib3giLCAiYmxhY2siLCAiYm9sZCIsICJjaGFyUHJvY09wZXJhdG9yTGlzdCIsICJjb21wb3NpdGUiLCAiZGF0YSIsICJkZWZhdWx0Vk1ldHJpY3MiLCAiZGVmYXVsdFdpZHRoIiwgImRlc2NlbnQiLCAiZmFsbGJhY2tOYW1lIiwgImZvbnRNYXRyaXgiLCAiZm9udFR5cGUiLCAiaXNNb25vc3BhY2UiLCAiaXNTZXJpZkZvbnQiLCAiaXNUeXBlM0ZvbnQiLCAiaXRhbGljIiwgImxvYWRlZE5hbWUiLCAibWltZXR5cGUiLCAibWlzc2luZ0ZpbGUiLCAibmFtZSIsICJyZW1lYXN1cmUiLCAic3VidHlwZSIsICJ0eXBlIiwgInZlcnRpY2FsIl07Cit2YXIgRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFUyA9IFsiY01hcCIsICJkZWZhdWx0RW5jb2RpbmciLCAiZGlmZmVyZW5jZXMiLCAiaXNTeW1ib2xpY0ZvbnQiLCAic2VhY01hcCIsICJ0b0ZvbnRDaGFyIiwgInRvVW5pY29kZSIsICJ2bWV0cmljcyIsICJ3aWR0aHMiXTsKK3ZhciBGb250RmxhZ3MgPSB7CisgIEZpeGVkUGl0Y2g6IDEsCisgIFNlcmlmOiAyLAorICBTeW1ib2xpYzogNCwKKyAgU2NyaXB0OiA4LAorICBOb25zeW1ib2xpYzogMzIsCisgIEl0YWxpYzogNjQsCisgIEFsbENhcDogNjU1MzYsCisgIFNtYWxsQ2FwOiAxMzEwNzIsCisgIEZvcmNlQm9sZDogMjYyMTQ0Cit9OworZXhwb3J0cy5Gb250RmxhZ3MgPSBGb250RmxhZ3M7Cit2YXIgTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nID0gWyIubm90ZGVmIiwgIi5udWxsIiwgIm5vbm1hcmtpbmdyZXR1cm4iLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3Rlc2luZ2xlIiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkNjZWRpbGxhIiwgIkVhY3V0ZSIsICJOdGlsZGUiLCAiT2RpZXJlc2lzIiwgIlVkaWVyZXNpcyIsICJhYWN1dGUiLCAiYWdyYXZlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhdGlsZGUiLCAiYXJpbmciLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVncmF2ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWFjdXRlIiwgImlncmF2ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvZ3JhdmUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm90aWxkZSIsICJ1YWN1dGUiLCAidWdyYXZlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJkYWdnZXIiLCAiZGVncmVlIiwgImNlbnQiLCAic3RlcmxpbmciLCAic2VjdGlvbiIsICJidWxsZXQiLCAicGFyYWdyYXBoIiwgImdlcm1hbmRibHMiLCAicmVnaXN0ZXJlZCIsICJjb3B5cmlnaHQiLCAidHJhZGVtYXJrIiwgImFjdXRlIiwgImRpZXJlc2lzIiwgIm5vdGVxdWFsIiwgIkFFIiwgIk9zbGFzaCIsICJpbmZpbml0eSIsICJwbHVzbWludXMiLCAibGVzc2VxdWFsIiwgImdyZWF0ZXJlcXVhbCIsICJ5ZW4iLCAibXUiLCAicGFydGlhbGRpZmYiLCAic3VtbWF0aW9uIiwgInByb2R1Y3QiLCAicGkiLCAiaW50ZWdyYWwiLCAib3JkZmVtaW5pbmUiLCAib3JkbWFzY3VsaW5lIiwgIk9tZWdhIiwgImFlIiwgIm9zbGFzaCIsICJxdWVzdGlvbmRvd24iLCAiZXhjbGFtZG93biIsICJsb2dpY2Fsbm90IiwgInJhZGljYWwiLCAiZmxvcmluIiwgImFwcHJveGVxdWFsIiwgIkRlbHRhIiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAibm9uYnJlYWtpbmdzcGFjZSIsICJBZ3JhdmUiLCAiQXRpbGRlIiwgIk90aWxkZSIsICJPRSIsICJvZSIsICJlbmRhc2giLCAiZW1kYXNoIiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgImRpdmlkZSIsICJsb3plbmdlIiwgInlkaWVyZXNpcyIsICJZZGllcmVzaXMiLCAiZnJhY3Rpb24iLCAiY3VycmVuY3kiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInBlcnRob3VzYW5kIiwgIkFjaXJjdW1mbGV4IiwgIkVjaXJjdW1mbGV4IiwgIkFhY3V0ZSIsICJFZGllcmVzaXMiLCAiRWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiSWdyYXZlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJhcHBsZSIsICJPZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVncmF2ZSIsICJkb3RsZXNzaSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiTHNsYXNoIiwgImxzbGFzaCIsICJTY2Fyb24iLCAic2Nhcm9uIiwgIlpjYXJvbiIsICJ6Y2Fyb24iLCAiYnJva2VuYmFyIiwgIkV0aCIsICJldGgiLCAiWWFjdXRlIiwgInlhY3V0ZSIsICJUaG9ybiIsICJ0aG9ybiIsICJtaW51cyIsICJtdWx0aXBseSIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgIm9uZWhhbGYiLCAib25lcXVhcnRlciIsICJ0aHJlZXF1YXJ0ZXJzIiwgImZyYW5jIiwgIkdicmV2ZSIsICJnYnJldmUiLCAiSWRvdGFjY2VudCIsICJTY2VkaWxsYSIsICJzY2VkaWxsYSIsICJDYWN1dGUiLCAiY2FjdXRlIiwgIkNjYXJvbiIsICJjY2Fyb24iLCAiZGNyb2F0Il07CisKK2Z1bmN0aW9uIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKSB7CisgIGlmICghcHJvcGVydGllcy5mb250TWF0cml4KSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHByb3BlcnRpZXMuZm9udE1hdHJpeFswXSA9PT0gX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVhbMF0pIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgc2NhbGUgPSAwLjAwMSAvIHByb3BlcnRpZXMuZm9udE1hdHJpeFswXTsKKyAgdmFyIGdseXBoc1dpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOworCisgIGZvciAodmFyIGdseXBoIGluIGdseXBoc1dpZHRocykgeworICAgIGdseXBoc1dpZHRoc1tnbHlwaF0gKj0gc2NhbGU7CisgIH0KKworICBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aCAqPSBzY2FsZTsKK30KKworZnVuY3Rpb24gYWRqdXN0VG9Vbmljb2RlKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZykgeworICBpZiAocHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGJ1aWx0SW5FbmNvZGluZyA9PT0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocHJvcGVydGllcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhciB0b1VuaWNvZGUgPSBbXSwKKyAgICAgIGdseXBoc1VuaWNvZGVNYXAgPSAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOworCisgIGZvciAodmFyIGNoYXJDb2RlIGluIGJ1aWx0SW5FbmNvZGluZykgeworICAgIHZhciBnbHlwaE5hbWUgPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdOworICAgIHZhciB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKKworICAgIGlmICh1bmljb2RlICE9PSAtMSkgeworICAgICAgdG9Vbmljb2RlW2NoYXJDb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7CisgICAgfQorICB9CisKKyAgcHJvcGVydGllcy50b1VuaWNvZGUuYW1lbmQodG9Vbmljb2RlKTsKK30KKworZnVuY3Rpb24gZ2V0Rm9udFR5cGUodHlwZSwgc3VidHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlICJUeXBlMSI6CisgICAgICByZXR1cm4gc3VidHlwZSA9PT0gIlR5cGUxQyIgPyBfdXRpbC5Gb250VHlwZS5UWVBFMUMgOiBfdXRpbC5Gb250VHlwZS5UWVBFMTsKKworICAgIGNhc2UgIkNJREZvbnRUeXBlMCI6CisgICAgICByZXR1cm4gc3VidHlwZSA9PT0gIkNJREZvbnRUeXBlMEMiID8gX3V0aWwuRm9udFR5cGUuQ0lERk9OVFRZUEUwQyA6IF91dGlsLkZvbnRUeXBlLkNJREZPTlRUWVBFMDsKKworICAgIGNhc2UgIk9wZW5UeXBlIjoKKyAgICAgIHJldHVybiBfdXRpbC5Gb250VHlwZS5PUEVOVFlQRTsKKworICAgIGNhc2UgIlRydWVUeXBlIjoKKyAgICAgIHJldHVybiBfdXRpbC5Gb250VHlwZS5UUlVFVFlQRTsKKworICAgIGNhc2UgIkNJREZvbnRUeXBlMiI6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuQ0lERk9OVFRZUEUyOworCisgICAgY2FzZSAiTU1UeXBlMSI6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuTU1UWVBFMTsKKworICAgIGNhc2UgIlR5cGUwIjoKKyAgICAgIHJldHVybiBfdXRpbC5Gb250VHlwZS5UWVBFMDsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuVU5LTk9XTjsKKyAgfQorfQorCitmdW5jdGlvbiByZWNvdmVyR2x5cGhOYW1lKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApIHsKKyAgaWYgKGdseXBoc1VuaWNvZGVNYXBbbmFtZV0gIT09IHVuZGVmaW5lZCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgdmFyIHVuaWNvZGUgPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKShuYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKKworICBpZiAodW5pY29kZSAhPT0gLTEpIHsKKyAgICBmb3IgKHZhciBrZXkgaW4gZ2x5cGhzVW5pY29kZU1hcCkgeworICAgICAgaWYgKGdseXBoc1VuaWNvZGVNYXBba2V5XSA9PT0gdW5pY29kZSkgeworICAgICAgICByZXR1cm4ga2V5OworICAgICAgfQorICAgIH0KKyAgfQorCisgICgwLCBfdXRpbC5pbmZvKSgiVW5hYmxlIHRvIHJlY292ZXIgYSBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvcjogIiArIG5hbWUpOworICByZXR1cm4gbmFtZTsKK30KKwordmFyIEdseXBoID0gZnVuY3Rpb24gR2x5cGhDbG9zdXJlKCkgeworICBmdW5jdGlvbiBHbHlwaChmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KSB7CisgICAgdGhpcy5mb250Q2hhciA9IGZvbnRDaGFyOworICAgIHRoaXMudW5pY29kZSA9IHVuaWNvZGU7CisgICAgdGhpcy5hY2NlbnQgPSBhY2NlbnQ7CisgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgIHRoaXMudm1ldHJpYyA9IHZtZXRyaWM7CisgICAgdGhpcy5vcGVyYXRvckxpc3RJZCA9IG9wZXJhdG9yTGlzdElkOworICAgIHRoaXMuaXNTcGFjZSA9IGlzU3BhY2U7CisgICAgdGhpcy5pc0luRm9udCA9IGlzSW5Gb250OworICB9CisKKyAgR2x5cGgucHJvdG90eXBlLm1hdGNoZXNGb3JDYWNoZSA9IGZ1bmN0aW9uIChmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KSB7CisgICAgcmV0dXJuIHRoaXMuZm9udENoYXIgPT09IGZvbnRDaGFyICYmIHRoaXMudW5pY29kZSA9PT0gdW5pY29kZSAmJiB0aGlzLmFjY2VudCA9PT0gYWNjZW50ICYmIHRoaXMud2lkdGggPT09IHdpZHRoICYmIHRoaXMudm1ldHJpYyA9PT0gdm1ldHJpYyAmJiB0aGlzLm9wZXJhdG9yTGlzdElkID09PSBvcGVyYXRvckxpc3RJZCAmJiB0aGlzLmlzU3BhY2UgPT09IGlzU3BhY2UgJiYgdGhpcy5pc0luRm9udCA9PT0gaXNJbkZvbnQ7CisgIH07CisKKyAgcmV0dXJuIEdseXBoOworfSgpOworCit2YXIgVG9Vbmljb2RlTWFwID0gZnVuY3Rpb24gVG9Vbmljb2RlTWFwQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gVG9Vbmljb2RlTWFwKCkgeworICAgIHZhciBjbWFwID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTsKKyAgICB0aGlzLl9tYXAgPSBjbWFwOworICB9CisKKyAgVG9Vbmljb2RlTWFwLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgbGVuZ3RoKCkgeworICAgICAgcmV0dXJuIHRoaXMuX21hcC5sZW5ndGg7CisgICAgfSwKKworICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2spIHsKKyAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIHRoaXMuX21hcCkgeworICAgICAgICBjYWxsYmFjayhjaGFyQ29kZSwgdGhpcy5fbWFwW2NoYXJDb2RlXS5jaGFyQ29kZUF0KDApKTsKKyAgICAgIH0KKyAgICB9LAorICAgIGhhczogZnVuY3Rpb24gaGFzKGkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBbaV0gIT09IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIGdldDogZnVuY3Rpb24gZ2V0KGkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBbaV07CisgICAgfSwKKyAgICBjaGFyQ29kZU9mOiBmdW5jdGlvbiBjaGFyQ29kZU9mKHZhbHVlKSB7CisgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwOworCisgICAgICBpZiAobWFwLmxlbmd0aCA8PSAweDEwMDAwKSB7CisgICAgICAgIHJldHVybiBtYXAuaW5kZXhPZih2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIG1hcCkgeworICAgICAgICBpZiAobWFwW2NoYXJDb2RlXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAtMTsKKyAgICB9LAorICAgIGFtZW5kOiBmdW5jdGlvbiBhbWVuZChtYXApIHsKKyAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIG1hcCkgeworICAgICAgICB0aGlzLl9tYXBbY2hhckNvZGVdID0gbWFwW2NoYXJDb2RlXTsKKyAgICAgIH0KKyAgICB9CisgIH07CisgIHJldHVybiBUb1VuaWNvZGVNYXA7Cit9KCk7CisKK2V4cG9ydHMuVG9Vbmljb2RlTWFwID0gVG9Vbmljb2RlTWFwOworCit2YXIgSWRlbnRpdHlUb1VuaWNvZGVNYXAgPSBmdW5jdGlvbiBJZGVudGl0eVRvVW5pY29kZU1hcENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIElkZW50aXR5VG9Vbmljb2RlTWFwKGZpcnN0Q2hhciwgbGFzdENoYXIpIHsKKyAgICB0aGlzLmZpcnN0Q2hhciA9IGZpcnN0Q2hhcjsKKyAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7CisgIH0KKworICBJZGVudGl0eVRvVW5pY29kZU1hcC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGxlbmd0aCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmxhc3RDaGFyICsgMSAtIHRoaXMuZmlyc3RDaGFyOworICAgIH0sCisKKyAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy5maXJzdENoYXIsIGlpID0gdGhpcy5sYXN0Q2hhcjsgaSA8PSBpaTsgaSsrKSB7CisgICAgICAgIGNhbGxiYWNrKGksIGkpOworICAgICAgfQorICAgIH0sCisgICAgaGFzOiBmdW5jdGlvbiBoYXMoaSkgeworICAgICAgcmV0dXJuIHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyOworICAgIH0sCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoaSkgeworICAgICAgaWYgKHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0sCisgICAgY2hhckNvZGVPZjogZnVuY3Rpb24gY2hhckNvZGVPZih2KSB7CisgICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2KSAmJiB2ID49IHRoaXMuZmlyc3RDaGFyICYmIHYgPD0gdGhpcy5sYXN0Q2hhciA/IHYgOiAtMTsKKyAgICB9LAorICAgIGFtZW5kOiBmdW5jdGlvbiBhbWVuZChtYXApIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpIik7CisgICAgfQorICB9OworICByZXR1cm4gSWRlbnRpdHlUb1VuaWNvZGVNYXA7Cit9KCk7CisKK2V4cG9ydHMuSWRlbnRpdHlUb1VuaWNvZGVNYXAgPSBJZGVudGl0eVRvVW5pY29kZU1hcDsKKwordmFyIE9wZW5UeXBlRmlsZUJ1aWxkZXIgPSBmdW5jdGlvbiBPcGVuVHlwZUZpbGVCdWlsZGVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gd3JpdGVJbnQxNihkZXN0LCBvZmZzZXQsIG51bSkgeworICAgIGRlc3Rbb2Zmc2V0XSA9IG51bSA+PiA4ICYgMHhmZjsKKyAgICBkZXN0W29mZnNldCArIDFdID0gbnVtICYgMHhmZjsKKyAgfQorCisgIGZ1bmN0aW9uIHdyaXRlSW50MzIoZGVzdCwgb2Zmc2V0LCBudW0pIHsKKyAgICBkZXN0W29mZnNldF0gPSBudW0gPj4gMjQgJiAweGZmOworICAgIGRlc3Rbb2Zmc2V0ICsgMV0gPSBudW0gPj4gMTYgJiAweGZmOworICAgIGRlc3Rbb2Zmc2V0ICsgMl0gPSBudW0gPj4gOCAmIDB4ZmY7CisgICAgZGVzdFtvZmZzZXQgKyAzXSA9IG51bSAmIDB4ZmY7CisgIH0KKworICBmdW5jdGlvbiB3cml0ZURhdGEoZGVzdCwgb2Zmc2V0LCBkYXRhKSB7CisgICAgdmFyIGksIGlpOworCisgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CisgICAgICBkZXN0LnNldChkYXRhLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICJzdHJpbmciKSB7CisgICAgICBmb3IgKGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBkZXN0W29mZnNldCsrXSA9IGRhdGEuY2hhckNvZGVBdChpKSAmIDB4ZmY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGRlc3Rbb2Zmc2V0KytdID0gZGF0YVtpXSAmIDB4ZmY7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcihzZm50KSB7CisgICAgdGhpcy5zZm50ID0gc2ZudDsKKyAgICB0aGlzLnRhYmxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBPcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJfZ2V0U2VhcmNoUGFyYW1zKGVudHJpZXNDb3VudCwgZW50cnlTaXplKSB7CisgICAgdmFyIG1heFBvd2VyMiA9IDEsCisgICAgICAgIGxvZzIgPSAwOworCisgICAgd2hpbGUgKChtYXhQb3dlcjIgXiBlbnRyaWVzQ291bnQpID4gbWF4UG93ZXIyKSB7CisgICAgICBtYXhQb3dlcjIgPDw9IDE7CisgICAgICBsb2cyKys7CisgICAgfQorCisgICAgdmFyIHNlYXJjaFJhbmdlID0gbWF4UG93ZXIyICogZW50cnlTaXplOworICAgIHJldHVybiB7CisgICAgICByYW5nZTogc2VhcmNoUmFuZ2UsCisgICAgICBlbnRyeTogbG9nMiwKKyAgICAgIHJhbmdlU2hpZnQ6IGVudHJ5U2l6ZSAqIGVudHJpZXNDb3VudCAtIHNlYXJjaFJhbmdlCisgICAgfTsKKyAgfTsKKworICB2YXIgT1RGX0hFQURFUl9TSVpFID0gMTI7CisgIHZhciBPVEZfVEFCTEVfRU5UUllfU0laRSA9IDE2OworICBPcGVuVHlwZUZpbGVCdWlsZGVyLnByb3RvdHlwZSA9IHsKKyAgICB0b0FycmF5OiBmdW5jdGlvbiBPcGVuVHlwZUZpbGVCdWlsZGVyX3RvQXJyYXkoKSB7CisgICAgICB2YXIgc2ZudCA9IHRoaXMuc2ZudDsKKyAgICAgIHZhciB0YWJsZXMgPSB0aGlzLnRhYmxlczsKKyAgICAgIHZhciB0YWJsZXNOYW1lcyA9IE9iamVjdC5rZXlzKHRhYmxlcyk7CisgICAgICB0YWJsZXNOYW1lcy5zb3J0KCk7CisgICAgICB2YXIgbnVtVGFibGVzID0gdGFibGVzTmFtZXMubGVuZ3RoOworICAgICAgdmFyIGksIGosIGpqLCB0YWJsZSwgdGFibGVOYW1lOworICAgICAgdmFyIG9mZnNldCA9IE9URl9IRUFERVJfU0laRSArIG51bVRhYmxlcyAqIE9URl9UQUJMRV9FTlRSWV9TSVpFOworICAgICAgdmFyIHRhYmxlT2Zmc2V0cyA9IFtvZmZzZXRdOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgdGFibGUgPSB0YWJsZXNbdGFibGVzTmFtZXNbaV1dOworICAgICAgICB2YXIgcGFkZGVkTGVuZ3RoID0gKHRhYmxlLmxlbmd0aCArIDMgJiB+MykgPj4+IDA7CisgICAgICAgIG9mZnNldCArPSBwYWRkZWRMZW5ndGg7CisgICAgICAgIHRhYmxlT2Zmc2V0cy5wdXNoKG9mZnNldCk7CisgICAgICB9CisKKyAgICAgIHZhciBmaWxlID0gbmV3IFVpbnQ4QXJyYXkob2Zmc2V0KTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CisgICAgICAgIHRhYmxlID0gdGFibGVzW3RhYmxlc05hbWVzW2ldXTsKKyAgICAgICAgd3JpdGVEYXRhKGZpbGUsIHRhYmxlT2Zmc2V0c1tpXSwgdGFibGUpOworICAgICAgfQorCisgICAgICBpZiAoc2ZudCA9PT0gInRydWUiKSB7CisgICAgICAgIHNmbnQgPSAoMCwgX3V0aWwuc3RyaW5nMzIpKDB4MDAwMTAwMDApOworICAgICAgfQorCisgICAgICBmaWxlWzBdID0gc2ZudC5jaGFyQ29kZUF0KDApICYgMHhmZjsKKyAgICAgIGZpbGVbMV0gPSBzZm50LmNoYXJDb2RlQXQoMSkgJiAweGZmOworICAgICAgZmlsZVsyXSA9IHNmbnQuY2hhckNvZGVBdCgyKSAmIDB4ZmY7CisgICAgICBmaWxlWzNdID0gc2ZudC5jaGFyQ29kZUF0KDMpICYgMHhmZjsKKyAgICAgIHdyaXRlSW50MTYoZmlsZSwgNCwgbnVtVGFibGVzKTsKKyAgICAgIHZhciBzZWFyY2hQYXJhbXMgPSBPcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcyhudW1UYWJsZXMsIDE2KTsKKyAgICAgIHdyaXRlSW50MTYoZmlsZSwgNiwgc2VhcmNoUGFyYW1zLnJhbmdlKTsKKyAgICAgIHdyaXRlSW50MTYoZmlsZSwgOCwgc2VhcmNoUGFyYW1zLmVudHJ5KTsKKyAgICAgIHdyaXRlSW50MTYoZmlsZSwgMTAsIHNlYXJjaFBhcmFtcy5yYW5nZVNoaWZ0KTsKKyAgICAgIG9mZnNldCA9IE9URl9IRUFERVJfU0laRTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CisgICAgICAgIHRhYmxlTmFtZSA9IHRhYmxlc05hbWVzW2ldOworICAgICAgICBmaWxlW29mZnNldF0gPSB0YWJsZU5hbWUuY2hhckNvZGVBdCgwKSAmIDB4ZmY7CisgICAgICAgIGZpbGVbb2Zmc2V0ICsgMV0gPSB0YWJsZU5hbWUuY2hhckNvZGVBdCgxKSAmIDB4ZmY7CisgICAgICAgIGZpbGVbb2Zmc2V0ICsgMl0gPSB0YWJsZU5hbWUuY2hhckNvZGVBdCgyKSAmIDB4ZmY7CisgICAgICAgIGZpbGVbb2Zmc2V0ICsgM10gPSB0YWJsZU5hbWUuY2hhckNvZGVBdCgzKSAmIDB4ZmY7CisgICAgICAgIHZhciBjaGVja3N1bSA9IDA7CisKKyAgICAgICAgZm9yIChqID0gdGFibGVPZmZzZXRzW2ldLCBqaiA9IHRhYmxlT2Zmc2V0c1tpICsgMV07IGogPCBqajsgaiArPSA0KSB7CisgICAgICAgICAgdmFyIHF1YWQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZmlsZSwgaik7CisgICAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSArIHF1YWQgPj4+IDA7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDQsIGNoZWNrc3VtKTsKKyAgICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyA4LCB0YWJsZU9mZnNldHNbaV0pOworICAgICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDEyLCB0YWJsZXNbdGFibGVOYW1lXS5sZW5ndGgpOworICAgICAgICBvZmZzZXQgKz0gT1RGX1RBQkxFX0VOVFJZX1NJWkU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmaWxlOworICAgIH0sCisgICAgYWRkVGFibGU6IGZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJfYWRkVGFibGUodGFnLCBkYXRhKSB7CisgICAgICBpZiAodGFnIGluIHRoaXMudGFibGVzKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGFibGUgIiArIHRhZyArICIgYWxyZWFkeSBleGlzdHMiKTsKKyAgICAgIH0KKworICAgICAgdGhpcy50YWJsZXNbdGFnXSA9IGRhdGE7CisgICAgfQorICB9OworICByZXR1cm4gT3BlblR5cGVGaWxlQnVpbGRlcjsKK30oKTsKKwordmFyIEZvbnQgPSBmdW5jdGlvbiBGb250Q2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gRm9udChuYW1lLCBmaWxlLCBwcm9wZXJ0aWVzKSB7CisgICAgdmFyIGNoYXJDb2RlOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5sb2FkZWROYW1lID0gcHJvcGVydGllcy5sb2FkZWROYW1lOworICAgIHRoaXMuaXNUeXBlM0ZvbnQgPSBwcm9wZXJ0aWVzLmlzVHlwZTNGb250OworICAgIHRoaXMubWlzc2luZ0ZpbGUgPSBmYWxzZTsKKyAgICB0aGlzLmdseXBoQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHRoaXMuaXNTZXJpZkZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlNlcmlmKTsKKyAgICB0aGlzLmlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CisgICAgdGhpcy5pc01vbm9zcGFjZSA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBGb250RmxhZ3MuRml4ZWRQaXRjaCk7CisgICAgdmFyIHR5cGUgPSBwcm9wZXJ0aWVzLnR5cGU7CisgICAgdmFyIHN1YnR5cGUgPSBwcm9wZXJ0aWVzLnN1YnR5cGU7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLnN1YnR5cGUgPSBzdWJ0eXBlOworICAgIHZhciBmYWxsYmFja05hbWUgPSAic2Fucy1zZXJpZiI7CisKKyAgICBpZiAodGhpcy5pc01vbm9zcGFjZSkgeworICAgICAgZmFsbGJhY2tOYW1lID0gIm1vbm9zcGFjZSI7CisgICAgfSBlbHNlIGlmICh0aGlzLmlzU2VyaWZGb250KSB7CisgICAgICBmYWxsYmFja05hbWUgPSAic2VyaWYiOworICAgIH0KKworICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gZmFsbGJhY2tOYW1lOworICAgIHRoaXMuZGlmZmVyZW5jZXMgPSBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzOworICAgIHRoaXMud2lkdGhzID0gcHJvcGVydGllcy53aWR0aHM7CisgICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKKyAgICB0aGlzLmNvbXBvc2l0ZSA9IHByb3BlcnRpZXMuY29tcG9zaXRlOworICAgIHRoaXMuY01hcCA9IHByb3BlcnRpZXMuY01hcDsKKyAgICB0aGlzLmFzY2VudCA9IHByb3BlcnRpZXMuYXNjZW50IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOworICAgIHRoaXMuZGVzY2VudCA9IHByb3BlcnRpZXMuZGVzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKKyAgICB0aGlzLmZvbnRNYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXg7CisgICAgdGhpcy5iYm94ID0gcHJvcGVydGllcy5iYm94OworICAgIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7CisgICAgdGhpcy50b1VuaWNvZGUgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZTsKKyAgICB0aGlzLmZhbGxiYWNrVG9Vbmljb2RlID0gcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSB8fCBuZXcgVG9Vbmljb2RlTWFwKCk7CisgICAgdGhpcy50b0ZvbnRDaGFyID0gW107CisKKyAgICBpZiAocHJvcGVydGllcy50eXBlID09PSAiVHlwZTMiKSB7CisgICAgICBmb3IgKGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCAyNTY7IGNoYXJDb2RlKyspIHsKKyAgICAgICAgdGhpcy50b0ZvbnRDaGFyW2NoYXJDb2RlXSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdIHx8IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICAgIH0KKworICAgICAgdGhpcy5mb250VHlwZSA9IF91dGlsLkZvbnRUeXBlLlRZUEUzOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuY2lkRW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmNpZEVuY29kaW5nOworICAgIHRoaXMudmVydGljYWwgPSAhIXByb3BlcnRpZXMudmVydGljYWw7CisKKyAgICBpZiAodGhpcy52ZXJ0aWNhbCkgeworICAgICAgdGhpcy52bWV0cmljcyA9IHByb3BlcnRpZXMudm1ldHJpY3M7CisgICAgICB0aGlzLmRlZmF1bHRWTWV0cmljcyA9IHByb3BlcnRpZXMuZGVmYXVsdFZNZXRyaWNzOworICAgIH0KKworICAgIGlmICghZmlsZSB8fCBmaWxlLmlzRW1wdHkpIHsKKyAgICAgIGlmIChmaWxlKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgnRm9udCBmaWxlIGlzIGVtcHR5IGluICInICsgbmFtZSArICciICgnICsgdGhpcy5sb2FkZWROYW1lICsgIikiKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5mYWxsYmFja1RvU3lzdGVtRm9udCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBfZ2V0Rm9udEZpbGVUeXBlID0gZ2V0Rm9udEZpbGVUeXBlKGZpbGUsIHByb3BlcnRpZXMpOworCisgICAgdmFyIF9nZXRGb250RmlsZVR5cGUyID0gX3NsaWNlZFRvQXJyYXkoX2dldEZvbnRGaWxlVHlwZSwgMik7CisKKyAgICB0eXBlID0gX2dldEZvbnRGaWxlVHlwZTJbMF07CisgICAgc3VidHlwZSA9IF9nZXRGb250RmlsZVR5cGUyWzFdOworCisgICAgaWYgKHR5cGUgIT09IHRoaXMudHlwZSB8fCBzdWJ0eXBlICE9PSB0aGlzLnN1YnR5cGUpIHsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW5jb25zaXN0ZW50IGZvbnQgZmlsZSBUeXBlL1N1YlR5cGUsIGV4cGVjdGVkOiAiICsgIiIuY29uY2F0KHRoaXMudHlwZSwgIi8iKS5jb25jYXQodGhpcy5zdWJ0eXBlLCAiIGJ1dCBmb3VuZDogIikuY29uY2F0KHR5cGUsICIvIikuY29uY2F0KHN1YnR5cGUsICIuIikpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICB2YXIgZGF0YTsKKworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgIk1NVHlwZTEiOgorICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiTU1UeXBlMSBmb250ICgiICsgbmFtZSArICIpLCBmYWxsaW5nIGJhY2sgdG8gVHlwZTEuIik7CisKKyAgICAgICAgY2FzZSAiVHlwZTEiOgorICAgICAgICBjYXNlICJDSURGb250VHlwZTAiOgorICAgICAgICAgIHRoaXMubWltZXR5cGUgPSAiZm9udC9vcGVudHlwZSI7CisgICAgICAgICAgdmFyIGNmZiA9IHN1YnR5cGUgPT09ICJUeXBlMUMiIHx8IHN1YnR5cGUgPT09ICJDSURGb250VHlwZTBDIiA/IG5ldyBDRkZGb250KGZpbGUsIHByb3BlcnRpZXMpIDogbmV3IFR5cGUxRm9udChuYW1lLCBmaWxlLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CisgICAgICAgICAgZGF0YSA9IHRoaXMuY29udmVydChuYW1lLCBjZmYsIHByb3BlcnRpZXMpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIk9wZW5UeXBlIjoKKyAgICAgICAgY2FzZSAiVHJ1ZVR5cGUiOgorICAgICAgICBjYXNlICJDSURGb250VHlwZTIiOgorICAgICAgICAgIHRoaXMubWltZXR5cGUgPSAiZm9udC9vcGVudHlwZSI7CisgICAgICAgICAgZGF0YSA9IHRoaXMuY2hlY2tBbmRSZXBhaXIobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CisKKyAgICAgICAgICBpZiAodGhpcy5pc09wZW5UeXBlKSB7CisgICAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CisgICAgICAgICAgICB0eXBlID0gIk9wZW5UeXBlIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRm9udCAiLmNvbmNhdCh0eXBlLCAiIGlzIG5vdCBzdXBwb3J0ZWQiKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKGUpOworICAgICAgdGhpcy5mYWxsYmFja1RvU3lzdGVtRm9udCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5mb250VHlwZSA9IGdldEZvbnRUeXBlKHR5cGUsIHN1YnR5cGUpOworICAgIHRoaXMuZm9udE1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeDsKKyAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOworICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gcHJvcGVydGllcy5kZWZhdWx0V2lkdGg7CisgICAgdGhpcy50b1VuaWNvZGUgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZTsKKyAgICB0aGlzLnNlYWNNYXAgPSBwcm9wZXJ0aWVzLnNlYWNNYXA7CisgIH0KKworICBmdW5jdGlvbiBpbnQxNihiMCwgYjEpIHsKKyAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7CisgIH0KKworICBmdW5jdGlvbiB3cml0ZVNpZ25lZEludDE2KGJ5dGVzLCBpbmRleCwgdmFsdWUpIHsKKyAgICBieXRlc1tpbmRleCArIDFdID0gdmFsdWU7CisgICAgYnl0ZXNbaW5kZXhdID0gdmFsdWUgPj4+IDg7CisgIH0KKworICBmdW5jdGlvbiBzaWduZWRJbnQxNihiMCwgYjEpIHsKKyAgICB2YXIgdmFsdWUgPSAoYjAgPDwgOCkgKyBiMTsKKyAgICByZXR1cm4gdmFsdWUgJiAxIDw8IDE1ID8gdmFsdWUgLSAweDEwMDAwIDogdmFsdWU7CisgIH0KKworICBmdW5jdGlvbiBpbnQzMihiMCwgYjEsIGIyLCBiMykgeworICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOworICB9CisKKyAgZnVuY3Rpb24gc3RyaW5nMTYodmFsdWUpIHsKKyAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKKyAgfQorCisgIGZ1bmN0aW9uIHNhZmVTdHJpbmcxNih2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA+IDB4N2ZmZikgeworICAgICAgdmFsdWUgPSAweDdmZmY7CisgICAgfSBlbHNlIGlmICh2YWx1ZSA8IC0weDgwMDApIHsKKyAgICAgIHZhbHVlID0gLTB4ODAwMDsKKyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKKyAgfQorCisgIGZ1bmN0aW9uIGlzVHJ1ZVR5cGVGaWxlKGZpbGUpIHsKKyAgICB2YXIgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CisgICAgcmV0dXJuICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShoZWFkZXIsIDApID09PSAweDAwMDEwMDAwIHx8ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShoZWFkZXIpID09PSAidHJ1ZSI7CisgIH0KKworICBmdW5jdGlvbiBpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZmlsZSkgeworICAgIHZhciBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyg0KTsKKyAgICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGhlYWRlcikgPT09ICJ0dGNmIjsKKyAgfQorCisgIGZ1bmN0aW9uIGlzT3BlblR5cGVGaWxlKGZpbGUpIHsKKyAgICB2YXIgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CisgICAgcmV0dXJuICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShoZWFkZXIpID09PSAiT1RUTyI7CisgIH0KKworICBmdW5jdGlvbiBpc1R5cGUxRmlsZShmaWxlKSB7CisgICAgdmFyIGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDIpOworCisgICAgaWYgKGhlYWRlclswXSA9PT0gMHgyNSAmJiBoZWFkZXJbMV0gPT09IDB4MjEpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChoZWFkZXJbMF0gPT09IDB4ODAgJiYgaGVhZGVyWzFdID09PSAweDAxKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmdW5jdGlvbiBpc0NGRkZpbGUoZmlsZSkgeworICAgIHZhciBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyg0KTsKKworICAgIGlmIChoZWFkZXJbMF0gPj0gMSAmJiBoZWFkZXJbM10gPj0gMSAmJiBoZWFkZXJbM10gPD0gNCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZnVuY3Rpb24gZ2V0Rm9udEZpbGVUeXBlKGZpbGUsIF9yZWYpIHsKKyAgICB2YXIgdHlwZSA9IF9yZWYudHlwZSwKKyAgICAgICAgc3VidHlwZSA9IF9yZWYuc3VidHlwZSwKKyAgICAgICAgY29tcG9zaXRlID0gX3JlZi5jb21wb3NpdGU7CisgICAgdmFyIGZpbGVUeXBlLCBmaWxlU3VidHlwZTsKKworICAgIGlmIChpc1RydWVUeXBlRmlsZShmaWxlKSB8fCBpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZmlsZSkpIHsKKyAgICAgIGlmIChjb21wb3NpdGUpIHsKKyAgICAgICAgZmlsZVR5cGUgPSAiQ0lERm9udFR5cGUyIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGVUeXBlID0gIlRydWVUeXBlIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzT3BlblR5cGVGaWxlKGZpbGUpKSB7CisgICAgICBpZiAoY29tcG9zaXRlKSB7CisgICAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWxlVHlwZSA9ICJPcGVuVHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpc1R5cGUxRmlsZShmaWxlKSkgeworICAgICAgaWYgKGNvbXBvc2l0ZSkgeworICAgICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSAiTU1UeXBlMSIgPyAiTU1UeXBlMSIgOiAiVHlwZTEiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNDRkZGaWxlKGZpbGUpKSB7CisgICAgICBpZiAoY29tcG9zaXRlKSB7CisgICAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMCI7CisgICAgICAgIGZpbGVTdWJ0eXBlID0gIkNJREZvbnRUeXBlMEMiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSAiTU1UeXBlMSIgPyAiTU1UeXBlMSIgOiAiVHlwZTEiOworICAgICAgICBmaWxlU3VidHlwZSA9ICJUeXBlMUMiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAoMCwgX3V0aWwud2FybikoImdldEZvbnRGaWxlVHlwZTogVW5hYmxlIHRvIGRldGVjdCBjb3JyZWN0IGZvbnQgZmlsZSBUeXBlL1N1YnR5cGUuIik7CisgICAgICBmaWxlVHlwZSA9IHR5cGU7CisgICAgICBmaWxlU3VidHlwZSA9IHN1YnR5cGU7CisgICAgfQorCisgICAgcmV0dXJuIFtmaWxlVHlwZSwgZmlsZVN1YnR5cGVdOworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRUb0ZvbnRDaGFyKGVuY29kaW5nLCBnbHlwaHNVbmljb2RlTWFwLCBkaWZmZXJlbmNlcykgeworICAgIHZhciB0b0ZvbnRDaGFyID0gW10sCisgICAgICAgIHVuaWNvZGU7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBlbmNvZGluZy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkoZW5jb2RpbmdbaV0sIGdseXBoc1VuaWNvZGVNYXApOworCisgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKKyAgICAgICAgdG9Gb250Q2hhcltpXSA9IHVuaWNvZGU7CisgICAgICB9CisgICAgfQorCisgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKKyAgICAgIHVuaWNvZGUgPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKShkaWZmZXJlbmNlc1tjaGFyQ29kZV0sIGdseXBoc1VuaWNvZGVNYXApOworCisgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKKyAgICAgICAgdG9Gb250Q2hhclsrY2hhckNvZGVdID0gdW5pY29kZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdG9Gb250Q2hhcjsKKyAgfQorCisgIGZ1bmN0aW9uIGFkanVzdE1hcHBpbmcoY2hhckNvZGVUb0dseXBoSWQsIGhhc0dseXBoLCBuZXdHbHlwaFplcm9JZCkgeworICAgIHZhciBuZXdNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHZhciB0b0ZvbnRDaGFyID0gW107CisgICAgdmFyIHByaXZhdGVVc2VBcmVhSW5kZXggPSAwOworICAgIHZhciBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMF07CisgICAgdmFyIHByaXZhdGVVc2VPZmZldEVuZCA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzFdOworCisgICAgZm9yICh2YXIgb3JpZ2luYWxDaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgeworICAgICAgb3JpZ2luYWxDaGFyQ29kZSB8PSAwOworICAgICAgdmFyIGdseXBoSWQgPSBjaGFyQ29kZVRvR2x5cGhJZFtvcmlnaW5hbENoYXJDb2RlXTsKKworICAgICAgaWYgKCFoYXNHbHlwaChnbHlwaElkKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPiBwcml2YXRlVXNlT2ZmZXRFbmQpIHsKKyAgICAgICAgcHJpdmF0ZVVzZUFyZWFJbmRleCsrOworCisgICAgICAgIGlmIChwcml2YXRlVXNlQXJlYUluZGV4ID49IFBSSVZBVEVfVVNFX0FSRUFTLmxlbmd0aCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiUmFuIG91dCBvZiBzcGFjZSBpbiBmb250IHByaXZhdGUgdXNlIGFyZWEuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMF07CisgICAgICAgIHByaXZhdGVVc2VPZmZldEVuZCA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzFdOworICAgICAgfQorCisgICAgICB2YXIgZm9udENoYXJDb2RlID0gbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrOworCisgICAgICBpZiAoZ2x5cGhJZCA9PT0gMCkgeworICAgICAgICBnbHlwaElkID0gbmV3R2x5cGhaZXJvSWQ7CisgICAgICB9CisKKyAgICAgIG5ld01hcFtmb250Q2hhckNvZGVdID0gZ2x5cGhJZDsKKyAgICAgIHRvRm9udENoYXJbb3JpZ2luYWxDaGFyQ29kZV0gPSBmb250Q2hhckNvZGU7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIHRvRm9udENoYXI6IHRvRm9udENoYXIsCisgICAgICBjaGFyQ29kZVRvR2x5cGhJZDogbmV3TWFwLAorICAgICAgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZTogbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZQorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBnZXRSYW5nZXMoZ2x5cGhzLCBudW1HbHlwaHMpIHsKKyAgICB2YXIgY29kZXMgPSBbXTsKKworICAgIGZvciAodmFyIGNoYXJDb2RlIGluIGdseXBocykgeworICAgICAgaWYgKGdseXBoc1tjaGFyQ29kZV0gPj0gbnVtR2x5cGhzKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBjb2Rlcy5wdXNoKHsKKyAgICAgICAgZm9udENoYXJDb2RlOiBjaGFyQ29kZSB8IDAsCisgICAgICAgIGdseXBoSWQ6IGdseXBoc1tjaGFyQ29kZV0KKyAgICAgIH0pOworICAgIH0KKworICAgIGlmIChjb2Rlcy5sZW5ndGggPT09IDApIHsKKyAgICAgIGNvZGVzLnB1c2goeworICAgICAgICBmb250Q2hhckNvZGU6IDAsCisgICAgICAgIGdseXBoSWQ6IDAKKyAgICAgIH0pOworICAgIH0KKworICAgIGNvZGVzLnNvcnQoZnVuY3Rpb24gZm9udEdldFJhbmdlc1NvcnQoYSwgYikgeworICAgICAgcmV0dXJuIGEuZm9udENoYXJDb2RlIC0gYi5mb250Q2hhckNvZGU7CisgICAgfSk7CisgICAgdmFyIHJhbmdlcyA9IFtdOworICAgIHZhciBsZW5ndGggPSBjb2Rlcy5sZW5ndGg7CisKKyAgICBmb3IgKHZhciBuID0gMDsgbiA8IGxlbmd0aDspIHsKKyAgICAgIHZhciBzdGFydCA9IGNvZGVzW25dLmZvbnRDaGFyQ29kZTsKKyAgICAgIHZhciBjb2RlSW5kaWNlcyA9IFtjb2Rlc1tuXS5nbHlwaElkXTsKKyAgICAgICsrbjsKKyAgICAgIHZhciBlbmQgPSBzdGFydDsKKworICAgICAgd2hpbGUgKG4gPCBsZW5ndGggJiYgZW5kICsgMSA9PT0gY29kZXNbbl0uZm9udENoYXJDb2RlKSB7CisgICAgICAgIGNvZGVJbmRpY2VzLnB1c2goY29kZXNbbl0uZ2x5cGhJZCk7CisgICAgICAgICsrZW5kOworICAgICAgICArK247CisKKyAgICAgICAgaWYgKGVuZCA9PT0gMHhmZmZmKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmFuZ2VzLnB1c2goW3N0YXJ0LCBlbmQsIGNvZGVJbmRpY2VzXSk7CisgICAgfQorCisgICAgcmV0dXJuIHJhbmdlczsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUNtYXBUYWJsZShnbHlwaHMsIG51bUdseXBocykgeworICAgIHZhciByYW5nZXMgPSBnZXRSYW5nZXMoZ2x5cGhzLCBudW1HbHlwaHMpOworICAgIHZhciBudW1UYWJsZXMgPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdWzFdID4gMHhmZmZmID8gMiA6IDE7CisgICAgdmFyIGNtYXAgPSAiXHgwMFx4MDAiICsgc3RyaW5nMTYobnVtVGFibGVzKSArICJceDAwXHgwMyIgKyAiXHgwMFx4MDEiICsgKDAsIF91dGlsLnN0cmluZzMyKSg0ICsgbnVtVGFibGVzICogOCk7CisgICAgdmFyIGksIGlpLCBqLCBqajsKKworICAgIGZvciAoaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeworICAgICAgaWYgKHJhbmdlc1tpXVswXSA8PSAweGZmZmYpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGJtcExlbmd0aCA9IGkgKyAxOworCisgICAgaWYgKHJhbmdlc1tpXVswXSA8IDB4ZmZmZiAmJiByYW5nZXNbaV1bMV0gPT09IDB4ZmZmZikgeworICAgICAgcmFuZ2VzW2ldWzFdID0gMHhmZmZlOworICAgIH0KKworICAgIHZhciB0cmFpbGluZ1Jhbmdlc0NvdW50ID0gcmFuZ2VzW2ldWzFdIDwgMHhmZmZmID8gMSA6IDA7CisgICAgdmFyIHNlZ0NvdW50ID0gYm1wTGVuZ3RoICsgdHJhaWxpbmdSYW5nZXNDb3VudDsKKyAgICB2YXIgc2VhcmNoUGFyYW1zID0gT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMoc2VnQ291bnQsIDIpOworICAgIHZhciBzdGFydENvdW50ID0gIiI7CisgICAgdmFyIGVuZENvdW50ID0gIiI7CisgICAgdmFyIGlkRGVsdGFzID0gIiI7CisgICAgdmFyIGlkUmFuZ2VPZmZzZXRzID0gIiI7CisgICAgdmFyIGdseXBoc0lkcyA9ICIiOworICAgIHZhciBiaWFzID0gMDsKKyAgICB2YXIgcmFuZ2UsIHN0YXJ0LCBlbmQsIGNvZGVzOworCisgICAgZm9yIChpID0gMCwgaWkgPSBibXBMZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICByYW5nZSA9IHJhbmdlc1tpXTsKKyAgICAgIHN0YXJ0ID0gcmFuZ2VbMF07CisgICAgICBlbmQgPSByYW5nZVsxXTsKKyAgICAgIHN0YXJ0Q291bnQgKz0gc3RyaW5nMTYoc3RhcnQpOworICAgICAgZW5kQ291bnQgKz0gc3RyaW5nMTYoZW5kKTsKKyAgICAgIGNvZGVzID0gcmFuZ2VbMl07CisgICAgICB2YXIgY29udGlndW91cyA9IHRydWU7CisKKyAgICAgIGZvciAoaiA9IDEsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikgeworICAgICAgICBpZiAoY29kZXNbal0gIT09IGNvZGVzW2ogLSAxXSArIDEpIHsKKyAgICAgICAgICBjb250aWd1b3VzID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCFjb250aWd1b3VzKSB7CisgICAgICAgIHZhciBvZmZzZXQgPSAoc2VnQ291bnQgLSBpKSAqIDIgKyBiaWFzICogMjsKKyAgICAgICAgYmlhcyArPSBlbmQgLSBzdGFydCArIDE7CisgICAgICAgIGlkRGVsdGFzICs9IHN0cmluZzE2KDApOworICAgICAgICBpZFJhbmdlT2Zmc2V0cyArPSBzdHJpbmcxNihvZmZzZXQpOworCisgICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikgeworICAgICAgICAgIGdseXBoc0lkcyArPSBzdHJpbmcxNihjb2Rlc1tqXSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBzdGFydENvZGUgPSBjb2Rlc1swXTsKKyAgICAgICAgaWREZWx0YXMgKz0gc3RyaW5nMTYoc3RhcnRDb2RlIC0gc3RhcnQgJiAweGZmZmYpOworICAgICAgICBpZFJhbmdlT2Zmc2V0cyArPSBzdHJpbmcxNigwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHJhaWxpbmdSYW5nZXNDb3VudCA+IDApIHsKKyAgICAgIGVuZENvdW50ICs9ICJceEZGXHhGRiI7CisgICAgICBzdGFydENvdW50ICs9ICJceEZGXHhGRiI7CisgICAgICBpZERlbHRhcyArPSAiXHgwMFx4MDEiOworICAgICAgaWRSYW5nZU9mZnNldHMgKz0gIlx4MDBceDAwIjsKKyAgICB9CisKKyAgICB2YXIgZm9ybWF0MzE0ID0gIlx4MDBceDAwIiArIHN0cmluZzE2KDIgKiBzZWdDb3VudCkgKyBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2UpICsgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLmVudHJ5KSArIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5yYW5nZVNoaWZ0KSArIGVuZENvdW50ICsgIlx4MDBceDAwIiArIHN0YXJ0Q291bnQgKyBpZERlbHRhcyArIGlkUmFuZ2VPZmZzZXRzICsgZ2x5cGhzSWRzOworICAgIHZhciBmb3JtYXQzMTAxMiA9ICIiOworICAgIHZhciBoZWFkZXIzMTAxMiA9ICIiOworCisgICAgaWYgKG51bVRhYmxlcyA+IDEpIHsKKyAgICAgIGNtYXAgKz0gIlx4MDBceDAzIiArICJceDAwXHgwQSIgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKDQgKyBudW1UYWJsZXMgKiA4ICsgNCArIGZvcm1hdDMxNC5sZW5ndGgpOworICAgICAgZm9ybWF0MzEwMTIgPSAiIjsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSByYW5nZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICByYW5nZSA9IHJhbmdlc1tpXTsKKyAgICAgICAgc3RhcnQgPSByYW5nZVswXTsKKyAgICAgICAgY29kZXMgPSByYW5nZVsyXTsKKyAgICAgICAgdmFyIGNvZGUgPSBjb2Rlc1swXTsKKworICAgICAgICBmb3IgKGogPSAxLCBqaiA9IGNvZGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKKyAgICAgICAgICBpZiAoY29kZXNbal0gIT09IGNvZGVzW2ogLSAxXSArIDEpIHsKKyAgICAgICAgICAgIGVuZCA9IHJhbmdlWzBdICsgaiAtIDE7CisgICAgICAgICAgICBmb3JtYXQzMTAxMiArPSAoMCwgX3V0aWwuc3RyaW5nMzIpKHN0YXJ0KSArICgwLCBfdXRpbC5zdHJpbmczMikoZW5kKSArICgwLCBfdXRpbC5zdHJpbmczMikoY29kZSk7CisgICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7CisgICAgICAgICAgICBjb2RlID0gY29kZXNbal07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9ybWF0MzEwMTIgKz0gKDAsIF91dGlsLnN0cmluZzMyKShzdGFydCkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKHJhbmdlWzFdKSArICgwLCBfdXRpbC5zdHJpbmczMikoY29kZSk7CisgICAgICB9CisKKyAgICAgIGhlYWRlcjMxMDEyID0gIlx4MDBceDBDIiArICJceDAwXHgwMCIgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGZvcm1hdDMxMDEyLmxlbmd0aCArIDE2KSArICJceDAwXHgwMFx4MDBceDAwIiArICgwLCBfdXRpbC5zdHJpbmczMikoZm9ybWF0MzEwMTIubGVuZ3RoIC8gMTIpOworICAgIH0KKworICAgIHJldHVybiBjbWFwICsgIlx4MDBceDA0IiArIHN0cmluZzE2KGZvcm1hdDMxNC5sZW5ndGggKyA0KSArIGZvcm1hdDMxNCArIGhlYWRlcjMxMDEyICsgZm9ybWF0MzEwMTI7CisgIH0KKworICBmdW5jdGlvbiB2YWxpZGF0ZU9TMlRhYmxlKG9zMiwgZmlsZSkgeworICAgIGZpbGUucG9zID0gKGZpbGUuc3RhcnQgfHwgMCkgKyBvczIub2Zmc2V0OworICAgIHZhciB2ZXJzaW9uID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICBmaWxlLnNraXAoNjApOworICAgIHZhciBzZWxlY3Rpb24gPSBmaWxlLmdldFVpbnQxNigpOworCisgICAgaWYgKHZlcnNpb24gPCA0ICYmIHNlbGVjdGlvbiAmIDB4MDMwMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZhciBmaXJzdENoYXIgPSBmaWxlLmdldFVpbnQxNigpOworICAgIHZhciBsYXN0Q2hhciA9IGZpbGUuZ2V0VWludDE2KCk7CisKKyAgICBpZiAoZmlyc3RDaGFyID4gbGFzdENoYXIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmaWxlLnNraXAoNik7CisgICAgdmFyIHVzV2luQXNjZW50ID0gZmlsZS5nZXRVaW50MTYoKTsKKworICAgIGlmICh1c1dpbkFzY2VudCA9PT0gMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9zMi5kYXRhWzhdID0gb3MyLmRhdGFbOV0gPSAwOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgY2hhcnN0cmluZ3MsIG92ZXJyaWRlKSB7CisgICAgb3ZlcnJpZGUgPSBvdmVycmlkZSB8fCB7CisgICAgICB1bml0c1BlckVtOiAwLAorICAgICAgeU1heDogMCwKKyAgICAgIHlNaW46IDAsCisgICAgICBhc2NlbnQ6IDAsCisgICAgICBkZXNjZW50OiAwCisgICAgfTsKKyAgICB2YXIgdWxVbmljb2RlUmFuZ2UxID0gMDsKKyAgICB2YXIgdWxVbmljb2RlUmFuZ2UyID0gMDsKKyAgICB2YXIgdWxVbmljb2RlUmFuZ2UzID0gMDsKKyAgICB2YXIgdWxVbmljb2RlUmFuZ2U0ID0gMDsKKyAgICB2YXIgZmlyc3RDaGFySW5kZXggPSBudWxsOworICAgIHZhciBsYXN0Q2hhckluZGV4ID0gMDsKKworICAgIGlmIChjaGFyc3RyaW5ncykgeworICAgICAgZm9yICh2YXIgY29kZSBpbiBjaGFyc3RyaW5ncykgeworICAgICAgICBjb2RlIHw9IDA7CisKKyAgICAgICAgaWYgKGZpcnN0Q2hhckluZGV4ID4gY29kZSB8fCAhZmlyc3RDaGFySW5kZXgpIHsKKyAgICAgICAgICBmaXJzdENoYXJJbmRleCA9IGNvZGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFzdENoYXJJbmRleCA8IGNvZGUpIHsKKyAgICAgICAgICBsYXN0Q2hhckluZGV4ID0gY29kZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwb3NpdGlvbiA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlUmFuZ2VGb3IpKGNvZGUpOworCisgICAgICAgIGlmIChwb3NpdGlvbiA8IDMyKSB7CisgICAgICAgICAgdWxVbmljb2RlUmFuZ2UxIHw9IDEgPDwgcG9zaXRpb247CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCA2NCkgeworICAgICAgICAgIHVsVW5pY29kZVJhbmdlMiB8PSAxIDw8IHBvc2l0aW9uIC0gMzI7CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCA5NikgeworICAgICAgICAgIHVsVW5pY29kZVJhbmdlMyB8PSAxIDw8IHBvc2l0aW9uIC0gNjQ7CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCAxMjMpIHsKKyAgICAgICAgICB1bFVuaWNvZGVSYW5nZTQgfD0gMSA8PCBwb3NpdGlvbiAtIDk2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5pY29kZSByYW5nZXMgQml0cyA+IDEyMyBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGxhc3RDaGFySW5kZXggPiAweGZmZmYpIHsKKyAgICAgICAgbGFzdENoYXJJbmRleCA9IDB4ZmZmZjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZmlyc3RDaGFySW5kZXggPSAwOworICAgICAgbGFzdENoYXJJbmRleCA9IDI1NTsKKyAgICB9CisKKyAgICB2YXIgYmJveCA9IHByb3BlcnRpZXMuYmJveCB8fCBbMCwgMCwgMCwgMF07CisgICAgdmFyIHVuaXRzUGVyRW0gPSBvdmVycmlkZS51bml0c1BlckVtIHx8IDEgLyAocHJvcGVydGllcy5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYKVswXTsKKyAgICB2YXIgc2NhbGUgPSBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA/IDEuMCA6IHVuaXRzUGVyRW0gLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CisgICAgdmFyIHR5cG9Bc2NlbnQgPSBvdmVycmlkZS5hc2NlbnQgfHwgTWF0aC5yb3VuZChzY2FsZSAqIChwcm9wZXJ0aWVzLmFzY2VudCB8fCBiYm94WzNdKSk7CisgICAgdmFyIHR5cG9EZXNjZW50ID0gb3ZlcnJpZGUuZGVzY2VudCB8fCBNYXRoLnJvdW5kKHNjYWxlICogKHByb3BlcnRpZXMuZGVzY2VudCB8fCBiYm94WzFdKSk7CisKKyAgICBpZiAodHlwb0Rlc2NlbnQgPiAwICYmIHByb3BlcnRpZXMuZGVzY2VudCA+IDAgJiYgYmJveFsxXSA8IDApIHsKKyAgICAgIHR5cG9EZXNjZW50ID0gLXR5cG9EZXNjZW50OworICAgIH0KKworICAgIHZhciB3aW5Bc2NlbnQgPSBvdmVycmlkZS55TWF4IHx8IHR5cG9Bc2NlbnQ7CisgICAgdmFyIHdpbkRlc2NlbnQgPSAtb3ZlcnJpZGUueU1pbiB8fCAtdHlwb0Rlc2NlbnQ7CisgICAgcmV0dXJuICJceDAwXHgwMyIgKyAiXHgwMlx4MjQiICsgIlx4MDFceEY0IiArICJceDAwXHgwNSIgKyAiXHgwMFx4MDAiICsgIlx4MDJceDhBIiArICJceDAyXHhCQiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDhDIiArICJceDAyXHg4QSIgKyAiXHgwMlx4QkIiICsgIlx4MDBceDAwIiArICJceDAxXHhERiIgKyAiXHgwMFx4MzEiICsgIlx4MDFceDAyIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDBceDA2IiArIFN0cmluZy5mcm9tQ2hhckNvZGUocHJvcGVydGllcy5maXhlZFBpdGNoID8gMHgwOSA6IDB4MDApICsgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKHVsVW5pY29kZVJhbmdlMSkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKHVsVW5pY29kZVJhbmdlMikgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKHVsVW5pY29kZVJhbmdlMykgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKHVsVW5pY29kZVJhbmdlNCkgKyAiXHgyQVx4MzJceDMxXHgyQSIgKyBzdHJpbmcxNihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlID8gMSA6IDApICsgc3RyaW5nMTYoZmlyc3RDaGFySW5kZXggfHwgcHJvcGVydGllcy5maXJzdENoYXIpICsgc3RyaW5nMTYobGFzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmxhc3RDaGFyKSArIHN0cmluZzE2KHR5cG9Bc2NlbnQpICsgc3RyaW5nMTYodHlwb0Rlc2NlbnQpICsgIlx4MDBceDY0IiArIHN0cmluZzE2KHdpbkFzY2VudCkgKyBzdHJpbmcxNih3aW5EZXNjZW50KSArICJceDAwXHgwMFx4MDBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIiArIHN0cmluZzE2KHByb3BlcnRpZXMueEhlaWdodCkgKyBzdHJpbmcxNihwcm9wZXJ0aWVzLmNhcEhlaWdodCkgKyBzdHJpbmcxNigwKSArIHN0cmluZzE2KGZpcnN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMuZmlyc3RDaGFyKSArICJceDAwXHgwMyI7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykgeworICAgIHZhciBhbmdsZSA9IE1hdGguZmxvb3IocHJvcGVydGllcy5pdGFsaWNBbmdsZSAqIE1hdGgucG93KDIsIDE2KSk7CisgICAgcmV0dXJuICJceDAwXHgwM1x4MDBceDAwIiArICgwLCBfdXRpbC5zdHJpbmczMikoYW5nbGUpICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKHByb3BlcnRpZXMuZml4ZWRQaXRjaCkgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCI7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVOYW1lVGFibGUobmFtZSwgcHJvdG8pIHsKKyAgICBpZiAoIXByb3RvKSB7CisgICAgICBwcm90byA9IFtbXSwgW11dOworICAgIH0KKworICAgIHZhciBzdHJpbmdzID0gW3Byb3RvWzBdWzBdIHx8ICJPcmlnaW5hbCBsaWNlbmNlIiwgcHJvdG9bMF1bMV0gfHwgbmFtZSwgcHJvdG9bMF1bMl0gfHwgIlVua25vd24iLCBwcm90b1swXVszXSB8fCAidW5pcXVlSUQiLCBwcm90b1swXVs0XSB8fCBuYW1lLCBwcm90b1swXVs1XSB8fCAiVmVyc2lvbiAwLjExIiwgcHJvdG9bMF1bNl0gfHwgIiIsIHByb3RvWzBdWzddIHx8ICJVbmtub3duIiwgcHJvdG9bMF1bOF0gfHwgIlVua25vd24iLCBwcm90b1swXVs5XSB8fCAiVW5rbm93biJdOworICAgIHZhciBzdHJpbmdzVW5pY29kZSA9IFtdOworICAgIHZhciBpLCBpaSwgaiwgamosIHN0cjsKKworICAgIGZvciAoaSA9IDAsIGlpID0gc3RyaW5ncy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBzdHIgPSBwcm90b1sxXVtpXSB8fCBzdHJpbmdzW2ldOworICAgICAgdmFyIHN0ckJ1ZlVuaWNvZGUgPSBbXTsKKworICAgICAgZm9yIChqID0gMCwgamogPSBzdHIubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICBzdHJCdWZVbmljb2RlLnB1c2goc3RyaW5nMTYoc3RyLmNoYXJDb2RlQXQoaikpKTsKKyAgICAgIH0KKworICAgICAgc3RyaW5nc1VuaWNvZGUucHVzaChzdHJCdWZVbmljb2RlLmpvaW4oIiIpKTsKKyAgICB9CisKKyAgICB2YXIgbmFtZXMgPSBbc3RyaW5ncywgc3RyaW5nc1VuaWNvZGVdOworICAgIHZhciBwbGF0Zm9ybXMgPSBbIlx4MDBceDAxIiwgIlx4MDBceDAzIl07CisgICAgdmFyIGVuY29kaW5ncyA9IFsiXHgwMFx4MDAiLCAiXHgwMFx4MDEiXTsKKyAgICB2YXIgbGFuZ3VhZ2VzID0gWyJceDAwXHgwMCIsICJceDA0XHgwOSJdOworICAgIHZhciBuYW1lc1JlY29yZENvdW50ID0gc3RyaW5ncy5sZW5ndGggKiBwbGF0Zm9ybXMubGVuZ3RoOworICAgIHZhciBuYW1lVGFibGUgPSAiXHgwMFx4MDAiICsgc3RyaW5nMTYobmFtZXNSZWNvcmRDb3VudCkgKyBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50ICogMTIgKyA2KTsKKyAgICB2YXIgc3RyT2Zmc2V0ID0gMDsKKworICAgIGZvciAoaSA9IDAsIGlpID0gcGxhdGZvcm1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBzdHJzID0gbmFtZXNbaV07CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gc3Rycy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIHN0ciA9IHN0cnNbal07CisgICAgICAgIHZhciBuYW1lUmVjb3JkID0gcGxhdGZvcm1zW2ldICsgZW5jb2RpbmdzW2ldICsgbGFuZ3VhZ2VzW2ldICsgc3RyaW5nMTYoaikgKyBzdHJpbmcxNihzdHIubGVuZ3RoKSArIHN0cmluZzE2KHN0ck9mZnNldCk7CisgICAgICAgIG5hbWVUYWJsZSArPSBuYW1lUmVjb3JkOworICAgICAgICBzdHJPZmZzZXQgKz0gc3RyLmxlbmd0aDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBuYW1lVGFibGUgKz0gc3RyaW5ncy5qb2luKCIiKSArIHN0cmluZ3NVbmljb2RlLmpvaW4oIiIpOworICAgIHJldHVybiBuYW1lVGFibGU7CisgIH0KKworICBGb250LnByb3RvdHlwZSA9IHsKKyAgICBuYW1lOiBudWxsLAorICAgIGZvbnQ6IG51bGwsCisgICAgbWltZXR5cGU6IG51bGwsCisgICAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSwKKworICAgIGdldCByZW5kZXJlcigpIHsKKyAgICAgIHZhciByZW5kZXJlciA9IF9mb250X3JlbmRlcmVyLkZvbnRSZW5kZXJlckZhY3RvcnkuY3JlYXRlKHRoaXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAicmVuZGVyZXIiLCByZW5kZXJlcik7CisgICAgfSwKKworICAgIGV4cG9ydERhdGE6IGZ1bmN0aW9uIGV4cG9ydERhdGEoKSB7CisgICAgICB2YXIgZXh0cmFQcm9wZXJ0aWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTsKKyAgICAgIHZhciBleHBvcnREYXRhUHJvcGVydGllcyA9IGV4dHJhUHJvcGVydGllcyA/IFtdLmNvbmNhdChFWFBPUlRfREFUQV9QUk9QRVJUSUVTLCBFWFBPUlRfREFUQV9FWFRSQV9QUk9QRVJUSUVTKSA6IEVYUE9SVF9EQVRBX1BST1BFUlRJRVM7CisgICAgICB2YXIgZGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB2YXIgcHJvcGVydHksIHZhbHVlOworCisgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZXhwb3J0RGF0YVByb3BlcnRpZXMpLAorICAgICAgICAgIF9zdGVwOworCisgICAgICB0cnkgeworICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgeworICAgICAgICAgIHByb3BlcnR5ID0gX3N0ZXAudmFsdWU7CisgICAgICAgICAgdmFsdWUgPSB0aGlzW3Byb3BlcnR5XTsKKworICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBkYXRhW3Byb3BlcnR5XSA9IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvci5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3IuZigpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YTsKKyAgICB9LAorICAgIGZhbGxiYWNrVG9TeXN0ZW1Gb250OiBmdW5jdGlvbiBGb250X2ZhbGxiYWNrVG9TeXN0ZW1Gb250KCkgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7CisgICAgICB2YXIgbmFtZSA9IHRoaXMubmFtZTsKKyAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlOworICAgICAgdmFyIHN1YnR5cGUgPSB0aGlzLnN1YnR5cGU7CisgICAgICB2YXIgZm9udE5hbWUgPSBuYW1lLnJlcGxhY2UoL1ssX10vZywgIi0iKS5yZXBsYWNlKC9ccy9nLCAiIik7CisgICAgICB2YXIgc3RkRm9udE1hcCA9ICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0U3RkRm9udE1hcCkoKSwKKyAgICAgICAgICBub25TdGRGb250TWFwID0gKDAsIF9zdGFuZGFyZF9mb250cy5nZXROb25TdGRGb250TWFwKSgpOworICAgICAgdmFyIGlzU3RhbmRhcmRGb250ID0gISFzdGRGb250TWFwW2ZvbnROYW1lXSB8fCAhIShub25TdGRGb250TWFwW2ZvbnROYW1lXSAmJiBzdGRGb250TWFwW25vblN0ZEZvbnRNYXBbZm9udE5hbWVdXSk7CisgICAgICBmb250TmFtZSA9IHN0ZEZvbnRNYXBbZm9udE5hbWVdIHx8IG5vblN0ZEZvbnRNYXBbZm9udE5hbWVdIHx8IGZvbnROYW1lOworICAgICAgdGhpcy5ib2xkID0gZm9udE5hbWUuc2VhcmNoKC9ib2xkL2dpKSAhPT0gLTE7CisgICAgICB0aGlzLml0YWxpYyA9IGZvbnROYW1lLnNlYXJjaCgvb2JsaXF1ZS9naSkgIT09IC0xIHx8IGZvbnROYW1lLnNlYXJjaCgvaXRhbGljL2dpKSAhPT0gLTE7CisgICAgICB0aGlzLmJsYWNrID0gbmFtZS5zZWFyY2goL0JsYWNrL2cpICE9PSAtMTsKKyAgICAgIHRoaXMucmVtZWFzdXJlID0gT2JqZWN0LmtleXModGhpcy53aWR0aHMpLmxlbmd0aCA+IDA7CisKKyAgICAgIGlmIChpc1N0YW5kYXJkRm9udCAmJiB0eXBlID09PSAiQ0lERm9udFR5cGUyIiAmJiB0aGlzLmNpZEVuY29kaW5nLnN0YXJ0c1dpdGgoIklkZW50aXR5LSIpKSB7CisgICAgICAgIHZhciBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKTsKKyAgICAgICAgdmFyIG1hcCA9IFtdOworCisgICAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykgeworICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gR2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzW2NoYXJDb2RlXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgvQXJpYWwtP0JsYWNrL2kudGVzdChuYW1lKSkgeworICAgICAgICAgIHZhciBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaykoKTsKKworICAgICAgICAgIGZvciAodmFyIF9jaGFyQ29kZSBpbiBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2spIHsKKyAgICAgICAgICAgIG1hcFsrX2NoYXJDb2RlXSA9IFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFja1tfY2hhckNvZGVdOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgvQ2FsaWJyaS9pLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICB2YXIgU3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpID0gKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkpKCk7CisKKyAgICAgICAgICBmb3IgKHZhciBfY2hhckNvZGUyIGluIFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSkgeworICAgICAgICAgICAgbWFwWytfY2hhckNvZGUyXSA9IFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaVtfY2hhckNvZGUyXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgaXNJZGVudGl0eVVuaWNvZGUgPSB0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwOworCisgICAgICAgIGlmICghaXNJZGVudGl0eVVuaWNvZGUpIHsKKyAgICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSB7CisgICAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKKyAgICAgICAgdGhpcy50b1VuaWNvZGUgPSBuZXcgVG9Vbmljb2RlTWFwKG1hcCk7CisgICAgICB9IGVsc2UgaWYgKC9TeW1ib2wvaS50ZXN0KGZvbnROYW1lKSkgeworICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBidWlsZFRvRm9udENoYXIoX2VuY29kaW5ncy5TeW1ib2xTZXRFbmNvZGluZywgKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CisgICAgICB9IGVsc2UgaWYgKC9EaW5nYmF0cy9pLnRlc3QoZm9udE5hbWUpKSB7CisgICAgICAgIGlmICgvV2luZ2RpbmdzL2kudGVzdChuYW1lKSkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTm9uLWVtYmVkZGVkIFdpbmdkaW5ncyBmb250LCBmYWxsaW5nIGJhY2sgdG8gWmFwZkRpbmdiYXRzLiIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKF9lbmNvZGluZ3MuWmFwZkRpbmdiYXRzRW5jb2RpbmcsICgwLCBfZ2x5cGhsaXN0LmdldERpbmdiYXRzR2x5cGhzVW5pY29kZSkoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CisgICAgICB9IGVsc2UgaWYgKGlzU3RhbmRhcmRGb250KSB7CisgICAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcih0aGlzLmRlZmF1bHRFbmNvZGluZywgKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CisgICAgICAgIHZhciBfbWFwID0gW107CisgICAgICAgIHRoaXMudG9Vbmljb2RlLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCB1bmljb2RlQ2hhckNvZGUpIHsKKyAgICAgICAgICBpZiAoIV90aGlzLmNvbXBvc2l0ZSkgeworICAgICAgICAgICAgdmFyIGdseXBoTmFtZSA9IF90aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXSB8fCBfdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhckNvZGVdOworICAgICAgICAgICAgdmFyIHVuaWNvZGUgPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOworCisgICAgICAgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKKyAgICAgICAgICAgICAgdW5pY29kZUNoYXJDb2RlID0gdW5pY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBfbWFwWytjaGFyQ29kZV0gPSB1bmljb2RlQ2hhckNvZGU7CisgICAgICAgIH0pOworCisgICAgICAgIGlmICh0aGlzLmNvbXBvc2l0ZSAmJiB0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CisgICAgICAgICAgaWYgKC9WZXJkYW5hL2kudGVzdChuYW1lKSkgeworICAgICAgICAgICAgdmFyIF9HbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKTsKKworICAgICAgICAgICAgZm9yICh2YXIgX2NoYXJDb2RlMyBpbiBfR2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzKSB7CisgICAgICAgICAgICAgIF9tYXBbK19jaGFyQ29kZTNdID0gX0dseXBoTWFwRm9yU3RhbmRhcmRGb250c1tfY2hhckNvZGUzXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBfbWFwOworICAgICAgfQorCisgICAgICB0aGlzLmxvYWRlZE5hbWUgPSBmb250TmFtZS5zcGxpdCgiLSIpWzBdOworICAgICAgdGhpcy5mb250VHlwZSA9IGdldEZvbnRUeXBlKHR5cGUsIHN1YnR5cGUpOworICAgIH0sCisgICAgY2hlY2tBbmRSZXBhaXI6IGZ1bmN0aW9uIEZvbnRfY2hlY2tBbmRSZXBhaXIobmFtZSwgZm9udCwgcHJvcGVydGllcykgeworICAgICAgdmFyIFZBTElEX1RBQkxFUyA9IFsiT1MvMiIsICJjbWFwIiwgImhlYWQiLCAiaGhlYSIsICJobXR4IiwgIm1heHAiLCAibmFtZSIsICJwb3N0IiwgImxvY2EiLCAiZ2x5ZiIsICJmcGdtIiwgInByZXAiLCAiY3Z0ICIsICJDRkYgIl07CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUYWJsZXMoZmlsZSwgbnVtVGFibGVzKSB7CisgICAgICAgIHZhciB0YWJsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICB0YWJsZXNbIk9TLzIiXSA9IG51bGw7CisgICAgICAgIHRhYmxlcy5jbWFwID0gbnVsbDsKKyAgICAgICAgdGFibGVzLmhlYWQgPSBudWxsOworICAgICAgICB0YWJsZXMuaGhlYSA9IG51bGw7CisgICAgICAgIHRhYmxlcy5obXR4ID0gbnVsbDsKKyAgICAgICAgdGFibGVzLm1heHAgPSBudWxsOworICAgICAgICB0YWJsZXMubmFtZSA9IG51bGw7CisgICAgICAgIHRhYmxlcy5wb3N0ID0gbnVsbDsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CisgICAgICAgICAgdmFyIHRhYmxlID0gcmVhZFRhYmxlRW50cnkoZmlsZSk7CisKKyAgICAgICAgICBpZiAoIVZBTElEX1RBQkxFUy5pbmNsdWRlcyh0YWJsZS50YWcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodGFibGUubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0YWJsZXNbdGFibGUudGFnXSA9IHRhYmxlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRhYmxlczsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcmVhZFRhYmxlRW50cnkoZmlsZSkgeworICAgICAgICB2YXIgdGFnID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGZpbGUuZ2V0Qnl0ZXMoNCkpOworICAgICAgICB2YXIgY2hlY2tzdW0gPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgIHZhciBvZmZzZXQgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgIHZhciBsZW5ndGggPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgIHZhciBwcmV2aW91c1Bvc2l0aW9uID0gZmlsZS5wb3M7CisgICAgICAgIGZpbGUucG9zID0gZmlsZS5zdGFydCA/IGZpbGUuc3RhcnQgOiAwOworICAgICAgICBmaWxlLnNraXAob2Zmc2V0KTsKKyAgICAgICAgdmFyIGRhdGEgPSBmaWxlLmdldEJ5dGVzKGxlbmd0aCk7CisgICAgICAgIGZpbGUucG9zID0gcHJldmlvdXNQb3NpdGlvbjsKKworICAgICAgICBpZiAodGFnID09PSAiaGVhZCIpIHsKKyAgICAgICAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPSAwOworICAgICAgICAgIGRhdGFbMTddIHw9IDB4MjA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgIHRhZzogdGFnLAorICAgICAgICAgIGNoZWNrc3VtOiBjaGVja3N1bSwKKyAgICAgICAgICBsZW5ndGg6IGxlbmd0aCwKKyAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwKKyAgICAgICAgICBkYXRhOiBkYXRhCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0dGYpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICB2ZXJzaW9uOiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykodHRmLmdldEJ5dGVzKDQpKSwKKyAgICAgICAgICBudW1UYWJsZXM6IHR0Zi5nZXRVaW50MTYoKSwKKyAgICAgICAgICBzZWFyY2hSYW5nZTogdHRmLmdldFVpbnQxNigpLAorICAgICAgICAgIGVudHJ5U2VsZWN0b3I6IHR0Zi5nZXRVaW50MTYoKSwKKyAgICAgICAgICByYW5nZVNoaWZ0OiB0dGYuZ2V0VWludDE2KCkKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkhlYWRlcih0dGMpIHsKKyAgICAgICAgdmFyIHR0Y1RhZyA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKSh0dGMuZ2V0Qnl0ZXMoNCkpOworICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0dGNUYWcgPT09ICJ0dGNmIiwgIk11c3QgYmUgYSBUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQuIik7CisgICAgICAgIHZhciBtYWpvclZlcnNpb24gPSB0dGMuZ2V0VWludDE2KCk7CisgICAgICAgIHZhciBtaW5vclZlcnNpb24gPSB0dGMuZ2V0VWludDE2KCk7CisgICAgICAgIHZhciBudW1Gb250cyA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOworICAgICAgICB2YXIgb2Zmc2V0VGFibGUgPSBbXTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUZvbnRzOyBpKyspIHsKKyAgICAgICAgICBvZmZzZXRUYWJsZS5wdXNoKHR0Yy5nZXRJbnQzMigpID4+PiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBoZWFkZXIgPSB7CisgICAgICAgICAgdHRjVGFnOiB0dGNUYWcsCisgICAgICAgICAgbWFqb3JWZXJzaW9uOiBtYWpvclZlcnNpb24sCisgICAgICAgICAgbWlub3JWZXJzaW9uOiBtaW5vclZlcnNpb24sCisgICAgICAgICAgbnVtRm9udHM6IG51bUZvbnRzLAorICAgICAgICAgIG9mZnNldFRhYmxlOiBvZmZzZXRUYWJsZQorICAgICAgICB9OworCisgICAgICAgIHN3aXRjaCAobWFqb3JWZXJzaW9uKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKKworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGhlYWRlci5kc2lnVGFnID0gdHRjLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgICBoZWFkZXIuZHNpZ0xlbmd0aCA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgICAgaGVhZGVyLmRzaWdPZmZzZXQgPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBtYWpvclZlcnNpb246ICIuY29uY2F0KG1ham9yVmVyc2lvbiwgIi4iKSk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKHR0YywgZm9udE5hbWUpIHsKKyAgICAgICAgdmFyIF9yZWFkVHJ1ZVR5cGVDb2xsZWN0aSA9IHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25IZWFkZXIodHRjKSwKKyAgICAgICAgICAgIG51bUZvbnRzID0gX3JlYWRUcnVlVHlwZUNvbGxlY3RpLm51bUZvbnRzLAorICAgICAgICAgICAgb2Zmc2V0VGFibGUgPSBfcmVhZFRydWVUeXBlQ29sbGVjdGkub2Zmc2V0VGFibGU7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Gb250czsgaSsrKSB7CisgICAgICAgICAgdHRjLnBvcyA9ICh0dGMuc3RhcnQgfHwgMCkgKyBvZmZzZXRUYWJsZVtpXTsKKyAgICAgICAgICB2YXIgcG90ZW50aWFsSGVhZGVyID0gcmVhZE9wZW5UeXBlSGVhZGVyKHR0Yyk7CisgICAgICAgICAgdmFyIHBvdGVudGlhbFRhYmxlcyA9IHJlYWRUYWJsZXModHRjLCBwb3RlbnRpYWxIZWFkZXIubnVtVGFibGVzKTsKKworICAgICAgICAgIGlmICghcG90ZW50aWFsVGFibGVzLm5hbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcignVHJ1ZVR5cGUgQ29sbGVjdGlvbiBmb250IG11c3QgY29udGFpbiBhICJuYW1lIiB0YWJsZS4nKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgbmFtZVRhYmxlID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBuYW1lVGFibGUubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgZm9yICh2YXIgayA9IDAsIGtrID0gbmFtZVRhYmxlW2pdLmxlbmd0aDsgayA8IGtrOyBrKyspIHsKKyAgICAgICAgICAgICAgdmFyIG5hbWVFbnRyeSA9IG5hbWVUYWJsZVtqXVtrXTsKKworICAgICAgICAgICAgICBpZiAobmFtZUVudHJ5ICYmIG5hbWVFbnRyeS5yZXBsYWNlKC9ccy9nLCAiIikgPT09IGZvbnROYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgIGhlYWRlcjogcG90ZW50aWFsSGVhZGVyLAorICAgICAgICAgICAgICAgICAgdGFibGVzOiBwb3RlbnRpYWxUYWJsZXMKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gXCIiLmNvbmNhdChmb250TmFtZSwgIlwiIGZvbnQuIikpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiByZWFkQ21hcFRhYmxlKGNtYXAsIGZpbGUsIGlzU3ltYm9saWNGb250LCBoYXNFbmNvZGluZykgeworICAgICAgICBpZiAoIWNtYXApIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIk5vIGNtYXAgdGFibGUgYXZhaWxhYmxlLiIpOworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKKyAgICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAorICAgICAgICAgICAgbWFwcGluZ3M6IFtdLAorICAgICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICB2YXIgc2VnbWVudDsKKyAgICAgICAgdmFyIHN0YXJ0ID0gKGZpbGUuc3RhcnQgPyBmaWxlLnN0YXJ0IDogMCkgKyBjbWFwLm9mZnNldDsKKyAgICAgICAgZmlsZS5wb3MgPSBzdGFydDsKKyAgICAgICAgZmlsZS5za2lwKDIpOworICAgICAgICB2YXIgbnVtVGFibGVzID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICAgICAgdmFyIHBvdGVudGlhbFRhYmxlOworICAgICAgICB2YXIgY2FuQnJlYWsgPSBmYWxzZTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CisgICAgICAgICAgdmFyIHBsYXRmb3JtSWQgPSBmaWxlLmdldFVpbnQxNigpOworICAgICAgICAgIHZhciBlbmNvZGluZ0lkID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB2YXIgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgIHZhciB1c2VUYWJsZSA9IGZhbHNlOworCisgICAgICAgICAgaWYgKHBvdGVudGlhbFRhYmxlICYmIHBvdGVudGlhbFRhYmxlLnBsYXRmb3JtSWQgPT09IHBsYXRmb3JtSWQgJiYgcG90ZW50aWFsVGFibGUuZW5jb2RpbmdJZCA9PT0gZW5jb2RpbmdJZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHBsYXRmb3JtSWQgPT09IDAgJiYgKGVuY29kaW5nSWQgPT09IDAgfHwgZW5jb2RpbmdJZCA9PT0gMSB8fCBlbmNvZGluZ0lkID09PSAzKSkgeworICAgICAgICAgICAgdXNlVGFibGUgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1JZCA9PT0gMSAmJiBlbmNvZGluZ0lkID09PSAwKSB7CisgICAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChwbGF0Zm9ybUlkID09PSAzICYmIGVuY29kaW5nSWQgPT09IDEgJiYgKGhhc0VuY29kaW5nIHx8ICFwb3RlbnRpYWxUYWJsZSkpIHsKKyAgICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKCFpc1N5bWJvbGljRm9udCkgeworICAgICAgICAgICAgICBjYW5CcmVhayA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCAmJiBwbGF0Zm9ybUlkID09PSAzICYmIGVuY29kaW5nSWQgPT09IDApIHsKKyAgICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIGNhbkJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodXNlVGFibGUpIHsKKyAgICAgICAgICAgIHBvdGVudGlhbFRhYmxlID0geworICAgICAgICAgICAgICBwbGF0Zm9ybUlkOiBwbGF0Zm9ybUlkLAorICAgICAgICAgICAgICBlbmNvZGluZ0lkOiBlbmNvZGluZ0lkLAorICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoY2FuQnJlYWspIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3RlbnRpYWxUYWJsZSkgeworICAgICAgICAgIGZpbGUucG9zID0gc3RhcnQgKyBwb3RlbnRpYWxUYWJsZS5vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlIHx8IGZpbGUucGVla0J5dGUoKSA9PT0gLTEpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkNvdWxkIG5vdCBmaW5kIGEgcHJlZmVycmVkIGNtYXAgdGFibGUuIik7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAorICAgICAgICAgICAgZW5jb2RpbmdJZDogLTEsCisgICAgICAgICAgICBtYXBwaW5nczogW10sCisgICAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmb3JtYXQgPSBmaWxlLmdldFVpbnQxNigpOworICAgICAgICBmaWxlLnNraXAoMiArIDIpOworICAgICAgICB2YXIgaGFzU2hvcnRDbWFwID0gZmFsc2U7CisgICAgICAgIHZhciBtYXBwaW5ncyA9IFtdOworICAgICAgICB2YXIgaiwgZ2x5cGhJZDsKKworICAgICAgICBpZiAoZm9ybWF0ID09PSAwKSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisgICAgICAgICAgICB2YXIgaW5kZXggPSBmaWxlLmdldEJ5dGUoKTsKKworICAgICAgICAgICAgaWYgKCFpbmRleCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgIGNoYXJDb2RlOiBqLAorICAgICAgICAgICAgICBnbHlwaElkOiBpbmRleAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaGFzU2hvcnRDbWFwID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDQpIHsKKyAgICAgICAgICB2YXIgc2VnQ291bnQgPSBmaWxlLmdldFVpbnQxNigpID4+IDE7CisgICAgICAgICAgZmlsZS5za2lwKDYpOworICAgICAgICAgIHZhciBzZWdJbmRleCwKKyAgICAgICAgICAgICAgc2VnbWVudHMgPSBbXTsKKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50cy5wdXNoKHsKKyAgICAgICAgICAgICAgZW5kOiBmaWxlLmdldFVpbnQxNigpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmaWxlLnNraXAoMik7CisKKyAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykgeworICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLnN0YXJ0ID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykgeworICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLmRlbHRhID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgb2Zmc2V0c0NvdW50ID0gMDsKKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOworICAgICAgICAgICAgdmFyIHJhbmdlT2Zmc2V0ID0gZmlsZS5nZXRVaW50MTYoKTsKKworICAgICAgICAgICAgaWYgKCFyYW5nZU9mZnNldCkgeworICAgICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gLTE7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgb2Zmc2V0SW5kZXggPSAocmFuZ2VPZmZzZXQgPj4gMSkgLSAoc2VnQ291bnQgLSBzZWdJbmRleCk7CisgICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7CisgICAgICAgICAgICBvZmZzZXRzQ291bnQgPSBNYXRoLm1heChvZmZzZXRzQ291bnQsIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIG9mZnNldHMgPSBbXTsKKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvZmZzZXRzQ291bnQ7IGorKykgeworICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKGZpbGUuZ2V0VWludDE2KCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOworICAgICAgICAgICAgc3RhcnQgPSBzZWdtZW50LnN0YXJ0OworICAgICAgICAgICAgdmFyIGVuZCA9IHNlZ21lbnQuZW5kOworICAgICAgICAgICAgdmFyIGRlbHRhID0gc2VnbWVudC5kZWx0YTsKKyAgICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDsKKworICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgaWYgKGogPT09IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZ2x5cGhJZCA9IG9mZnNldEluZGV4IDwgMCA/IGogOiBvZmZzZXRzW29mZnNldEluZGV4ICsgaiAtIHN0YXJ0XTsKKyAgICAgICAgICAgICAgZ2x5cGhJZCA9IGdseXBoSWQgKyBkZWx0YSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgICAgY2hhckNvZGU6IGosCisgICAgICAgICAgICAgICAgZ2x5cGhJZDogZ2x5cGhJZAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA2KSB7CisgICAgICAgICAgdmFyIGZpcnN0Q29kZSA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgICAgICAgdmFyIGVudHJ5Q291bnQgPSBmaWxlLmdldFVpbnQxNigpOworCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGVudHJ5Q291bnQ7IGorKykgeworICAgICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgICAgICAgICB2YXIgY2hhckNvZGUgPSBmaXJzdENvZGUgKyBqOworICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgIGNoYXJDb2RlOiBjaGFyQ29kZSwKKyAgICAgICAgICAgICAgZ2x5cGhJZDogZ2x5cGhJZAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiY21hcCB0YWJsZSBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0OiAiICsgZm9ybWF0KTsKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgcGxhdGZvcm1JZDogLTEsCisgICAgICAgICAgICBlbmNvZGluZ0lkOiAtMSwKKyAgICAgICAgICAgIG1hcHBpbmdzOiBbXSwKKyAgICAgICAgICAgIGhhc1Nob3J0Q21hcDogZmFsc2UKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgbWFwcGluZ3Muc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgICAgIHJldHVybiBhLmNoYXJDb2RlIC0gYi5jaGFyQ29kZTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgaWYgKG1hcHBpbmdzW2kgLSAxXS5jaGFyQ29kZSA9PT0gbWFwcGluZ3NbaV0uY2hhckNvZGUpIHsKKyAgICAgICAgICAgIG1hcHBpbmdzLnNwbGljZShpLCAxKTsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgIHBsYXRmb3JtSWQ6IHBvdGVudGlhbFRhYmxlLnBsYXRmb3JtSWQsCisgICAgICAgICAgZW5jb2RpbmdJZDogcG90ZW50aWFsVGFibGUuZW5jb2RpbmdJZCwKKyAgICAgICAgICBtYXBwaW5nczogbWFwcGluZ3MsCisgICAgICAgICAgaGFzU2hvcnRDbWFwOiBoYXNTaG9ydENtYXAKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc2FuaXRpemVNZXRyaWNzKGZpbGUsIGhlYWRlciwgbWV0cmljcywgbnVtR2x5cGhzLCBkdXBGaXJzdEVudHJ5KSB7CisgICAgICAgIGlmICghaGVhZGVyKSB7CisgICAgICAgICAgaWYgKG1ldHJpY3MpIHsKKyAgICAgICAgICAgIG1ldHJpY3MuZGF0YSA9IG51bGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmlsZS5wb3MgPSAoZmlsZS5zdGFydCA/IGZpbGUuc3RhcnQgOiAwKSArIGhlYWRlci5vZmZzZXQ7CisgICAgICAgIGZpbGUucG9zICs9IDQ7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIGZpbGUucG9zICs9IDg7CisgICAgICAgIGZpbGUucG9zICs9IDI7CisgICAgICAgIHZhciBudW1PZk1ldHJpY3MgPSBmaWxlLmdldFVpbnQxNigpOworCisgICAgICAgIGlmIChudW1PZk1ldHJpY3MgPiBudW1HbHlwaHMpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIlRoZSBudW1PZk1ldHJpY3MgKCIgKyBudW1PZk1ldHJpY3MgKyAiKSBzaG91bGQgbm90IGJlICIgKyAiZ3JlYXRlciB0aGFuIHRoZSBudW1HbHlwaHMgKCIgKyBudW1HbHlwaHMgKyAiKSIpOworICAgICAgICAgIG51bU9mTWV0cmljcyA9IG51bUdseXBoczsKKyAgICAgICAgICBoZWFkZXIuZGF0YVszNF0gPSAobnVtT2ZNZXRyaWNzICYgMHhmZjAwKSA+PiA4OworICAgICAgICAgIGhlYWRlci5kYXRhWzM1XSA9IG51bU9mTWV0cmljcyAmIDB4MDBmZjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBudW1PZlNpZGViZWFyaW5ncyA9IG51bUdseXBocyAtIG51bU9mTWV0cmljczsKKyAgICAgICAgdmFyIG51bU1pc3NpbmcgPSBudW1PZlNpZGViZWFyaW5ncyAtIChtZXRyaWNzLmxlbmd0aCAtIG51bU9mTWV0cmljcyAqIDQgPj4gMSk7CisKKyAgICAgICAgaWYgKG51bU1pc3NpbmcgPiAwKSB7CisgICAgICAgICAgdmFyIGVudHJpZXMgPSBuZXcgVWludDhBcnJheShtZXRyaWNzLmxlbmd0aCArIG51bU1pc3NpbmcgKiAyKTsKKyAgICAgICAgICBlbnRyaWVzLnNldChtZXRyaWNzLmRhdGEpOworCisgICAgICAgICAgaWYgKGR1cEZpcnN0RW50cnkpIHsKKyAgICAgICAgICAgIGVudHJpZXNbbWV0cmljcy5sZW5ndGhdID0gbWV0cmljcy5kYXRhWzJdOworICAgICAgICAgICAgZW50cmllc1ttZXRyaWNzLmxlbmd0aCArIDFdID0gbWV0cmljcy5kYXRhWzNdOworICAgICAgICAgIH0KKworICAgICAgICAgIG1ldHJpY3MuZGF0YSA9IGVudHJpZXM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc2FuaXRpemVHbHlwaChzb3VyY2UsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQsIGRlc3QsIGRlc3RTdGFydCwgaGludHNWYWxpZCkgeworICAgICAgICB2YXIgZ2x5cGhQcm9maWxlID0geworICAgICAgICAgIGxlbmd0aDogMCwKKyAgICAgICAgICBzaXplT2ZJbnN0cnVjdGlvbnM6IDAKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoc291cmNlRW5kIC0gc291cmNlU3RhcnQgPD0gMTIpIHsKKyAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGdseWYgPSBzb3VyY2Uuc3ViYXJyYXkoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisgICAgICAgIHZhciBjb250b3Vyc0NvdW50ID0gc2lnbmVkSW50MTYoZ2x5ZlswXSwgZ2x5ZlsxXSk7CisKKyAgICAgICAgaWYgKGNvbnRvdXJzQ291bnQgPCAwKSB7CisgICAgICAgICAgY29udG91cnNDb3VudCA9IC0xOworICAgICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgMCwgY29udG91cnNDb3VudCk7CisgICAgICAgICAgZGVzdC5zZXQoZ2x5ZiwgZGVzdFN0YXJ0KTsKKyAgICAgICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5Zi5sZW5ndGg7CisgICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBpLAorICAgICAgICAgICAgaiA9IDEwLAorICAgICAgICAgICAgZmxhZ3NDb3VudCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRvdXJzQ291bnQ7IGkrKykgeworICAgICAgICAgIHZhciBlbmRQb2ludCA9IGdseWZbal0gPDwgOCB8IGdseWZbaiArIDFdOworICAgICAgICAgIGZsYWdzQ291bnQgPSBlbmRQb2ludCArIDE7CisgICAgICAgICAgaiArPSAyOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGluc3RydWN0aW9uc1N0YXJ0ID0gajsKKyAgICAgICAgdmFyIGluc3RydWN0aW9uc0xlbmd0aCA9IGdseWZbal0gPDwgOCB8IGdseWZbaiArIDFdOworICAgICAgICBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zTGVuZ3RoOworICAgICAgICBqICs9IDIgKyBpbnN0cnVjdGlvbnNMZW5ndGg7CisgICAgICAgIHZhciBpbnN0cnVjdGlvbnNFbmQgPSBqOworICAgICAgICB2YXIgY29vcmRpbmF0ZXNMZW5ndGggPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbGFnc0NvdW50OyBpKyspIHsKKyAgICAgICAgICB2YXIgZmxhZyA9IGdseWZbaisrXTsKKworICAgICAgICAgIGlmIChmbGFnICYgMHhjMCkgeworICAgICAgICAgICAgZ2x5ZltqIC0gMV0gPSBmbGFnICYgMHgzZjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgeExlbmd0aCA9IDI7CisKKyAgICAgICAgICBpZiAoZmxhZyAmIDIpIHsKKyAgICAgICAgICAgIHhMZW5ndGggPSAxOworICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIDE2KSB7CisgICAgICAgICAgICB4TGVuZ3RoID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgeUxlbmd0aCA9IDI7CisKKyAgICAgICAgICBpZiAoZmxhZyAmIDQpIHsKKyAgICAgICAgICAgIHlMZW5ndGggPSAxOworICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIDMyKSB7CisgICAgICAgICAgICB5TGVuZ3RoID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgeHlMZW5ndGggPSB4TGVuZ3RoICsgeUxlbmd0aDsKKyAgICAgICAgICBjb29yZGluYXRlc0xlbmd0aCArPSB4eUxlbmd0aDsKKworICAgICAgICAgIGlmIChmbGFnICYgOCkgeworICAgICAgICAgICAgdmFyIHJlcGVhdCA9IGdseWZbaisrXTsKKyAgICAgICAgICAgIGkgKz0gcmVwZWF0OworICAgICAgICAgICAgY29vcmRpbmF0ZXNMZW5ndGggKz0gcmVwZWF0ICogeHlMZW5ndGg7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvb3JkaW5hdGVzTGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBnbHlwaERhdGFMZW5ndGggPSBqICsgY29vcmRpbmF0ZXNMZW5ndGg7CisKKyAgICAgICAgaWYgKGdseXBoRGF0YUxlbmd0aCA+IGdseWYubGVuZ3RoKSB7CisgICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaGludHNWYWxpZCAmJiBpbnN0cnVjdGlvbnNMZW5ndGggPiAwKSB7CisgICAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheSgwLCBpbnN0cnVjdGlvbnNTdGFydCksIGRlc3RTdGFydCk7CisgICAgICAgICAgZGVzdC5zZXQoWzAsIDBdLCBkZXN0U3RhcnQgKyBpbnN0cnVjdGlvbnNTdGFydCk7CisgICAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheShpbnN0cnVjdGlvbnNFbmQsIGdseXBoRGF0YUxlbmd0aCksIGRlc3RTdGFydCArIGluc3RydWN0aW9uc1N0YXJ0ICsgMik7CisgICAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoIC09IGluc3RydWN0aW9uc0xlbmd0aDsKKworICAgICAgICAgIGlmIChnbHlmLmxlbmd0aCAtIGdseXBoRGF0YUxlbmd0aCA+IDMpIHsKKyAgICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aCArIDMgJiB+MzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5cGhEYXRhTGVuZ3RoOworICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7CisgICAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoID0gZ2x5cGhEYXRhTGVuZ3RoICsgMyAmIH4zOworICAgICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoMCwgZ2x5cGhEYXRhTGVuZ3RoKSwgZGVzdFN0YXJ0KTsKKyAgICAgICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5cGhEYXRhTGVuZ3RoOworICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICAgIH0KKworICAgICAgICBkZXN0LnNldChnbHlmLCBkZXN0U3RhcnQpOworICAgICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5Zi5sZW5ndGg7CisgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHNhbml0aXplSGVhZChoZWFkLCBudW1HbHlwaHMsIGxvY2FMZW5ndGgpIHsKKyAgICAgICAgdmFyIGRhdGEgPSBoZWFkLmRhdGE7CisgICAgICAgIHZhciB2ZXJzaW9uID0gaW50MzIoZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSk7CisKKyAgICAgICAgaWYgKHZlcnNpb24gPj4gMTYgIT09IDEpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkF0dGVtcHRpbmcgdG8gZml4IGludmFsaWQgdmVyc2lvbiBpbiBoZWFkIHRhYmxlOiAiICsgdmVyc2lvbik7CisgICAgICAgICAgZGF0YVswXSA9IDA7CisgICAgICAgICAgZGF0YVsxXSA9IDE7CisgICAgICAgICAgZGF0YVsyXSA9IDA7CisgICAgICAgICAgZGF0YVszXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB2YXIgaW5kZXhUb0xvY0Zvcm1hdCA9IGludDE2KGRhdGFbNTBdLCBkYXRhWzUxXSk7CisKKyAgICAgICAgaWYgKGluZGV4VG9Mb2NGb3JtYXQgPCAwIHx8IGluZGV4VG9Mb2NGb3JtYXQgPiAxKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIGluZGV4VG9Mb2NGb3JtYXQgaW4gaGVhZCB0YWJsZTogIiArIGluZGV4VG9Mb2NGb3JtYXQpOworICAgICAgICAgIHZhciBudW1HbHlwaHNQbHVzT25lID0gbnVtR2x5cGhzICsgMTsKKworICAgICAgICAgIGlmIChsb2NhTGVuZ3RoID09PSBudW1HbHlwaHNQbHVzT25lIDw8IDEpIHsKKyAgICAgICAgICAgIGRhdGFbNTBdID0gMDsKKyAgICAgICAgICAgIGRhdGFbNTFdID0gMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FMZW5ndGggPT09IG51bUdseXBoc1BsdXNPbmUgPDwgMikgeworICAgICAgICAgICAgZGF0YVs1MF0gPSAwOworICAgICAgICAgICAgZGF0YVs1MV0gPSAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkNvdWxkIG5vdCBmaXggaW5kZXhUb0xvY0Zvcm1hdDogIiArIGluZGV4VG9Mb2NGb3JtYXQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoTG9jYXRpb25zKGxvY2EsIGdseWYsIG51bUdseXBocywgaXNHbHlwaExvY2F0aW9uc0xvbmcsIGhpbnRzVmFsaWQsIGR1cEZpcnN0RW50cnksIG1heFNpemVPZkluc3RydWN0aW9ucykgeworICAgICAgICB2YXIgaXRlbVNpemUsIGl0ZW1EZWNvZGUsIGl0ZW1FbmNvZGU7CisKKyAgICAgICAgaWYgKGlzR2x5cGhMb2NhdGlvbnNMb25nKSB7CisgICAgICAgICAgaXRlbVNpemUgPSA0OworCisgICAgICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlTG9uZyhkYXRhLCBvZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXTsKKyAgICAgICAgICB9OworCisgICAgICAgICAgaXRlbUVuY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRW5jb2RlTG9uZyhkYXRhLCBvZmZzZXQsIHZhbHVlKSB7CisgICAgICAgICAgICBkYXRhW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjQgJiAweGZmOworICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyAxXSA9IHZhbHVlID4+IDE2ICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+PiA4ICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgM10gPSB2YWx1ZSAmIDB4ZmY7CisgICAgICAgICAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpdGVtU2l6ZSA9IDI7CisKKyAgICAgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGUoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDkgfCBkYXRhW29mZnNldCArIDFdIDw8IDE7CisgICAgICAgICAgfTsKKworICAgICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZShkYXRhLCBvZmZzZXQsIHZhbHVlKSB7CisgICAgICAgICAgICBkYXRhW29mZnNldF0gPSB2YWx1ZSA+PiA5ICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxICYgMHhmZjsKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgdmFyIG51bUdseXBoc091dCA9IGR1cEZpcnN0RW50cnkgPyBudW1HbHlwaHMgKyAxIDogbnVtR2x5cGhzOworICAgICAgICB2YXIgbG9jYURhdGFTaXplID0gaXRlbVNpemUgKiAoMSArIG51bUdseXBoc091dCk7CisgICAgICAgIHZhciBsb2NhRGF0YSA9IG5ldyBVaW50OEFycmF5KGxvY2FEYXRhU2l6ZSk7CisgICAgICAgIGxvY2FEYXRhLnNldChsb2NhLmRhdGEuc3ViYXJyYXkoMCwgbG9jYURhdGFTaXplKSk7CisgICAgICAgIGxvY2EuZGF0YSA9IGxvY2FEYXRhOworICAgICAgICB2YXIgb2xkR2x5ZkRhdGEgPSBnbHlmLmRhdGE7CisgICAgICAgIHZhciBvbGRHbHlmRGF0YUxlbmd0aCA9IG9sZEdseWZEYXRhLmxlbmd0aDsKKyAgICAgICAgdmFyIG5ld0dseWZEYXRhID0gbmV3IFVpbnQ4QXJyYXkob2xkR2x5ZkRhdGFMZW5ndGgpOworICAgICAgICB2YXIgaSwgajsKKyAgICAgICAgdmFyIGxvY2FFbnRyaWVzID0gW107CisKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBudW1HbHlwaHMgKyAxOyBpKyssIGogKz0gaXRlbVNpemUpIHsKKyAgICAgICAgICB2YXIgb2Zmc2V0ID0gaXRlbURlY29kZShsb2NhRGF0YSwgaik7CisKKyAgICAgICAgICBpZiAob2Zmc2V0ID4gb2xkR2x5ZkRhdGFMZW5ndGgpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IG9sZEdseWZEYXRhTGVuZ3RoOworICAgICAgICAgIH0KKworICAgICAgICAgIGxvY2FFbnRyaWVzLnB1c2goeworICAgICAgICAgICAgaW5kZXg6IGksCisgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwKKyAgICAgICAgICAgIGVuZE9mZnNldDogMAorICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgbG9jYUVudHJpZXMuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgICAgIHJldHVybiBhLm9mZnNldCAtIGIub2Zmc2V0OworICAgICAgICB9KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKKyAgICAgICAgICBsb2NhRW50cmllc1tpXS5lbmRPZmZzZXQgPSBsb2NhRW50cmllc1tpICsgMV0ub2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgbG9jYUVudHJpZXMuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKKyAgICAgICAgfSk7CisgICAgICAgIHZhciBtaXNzaW5nR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgdmFyIHdyaXRlT2Zmc2V0ID0gMDsKKyAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgMCwgd3JpdGVPZmZzZXQpOworCisgICAgICAgIGZvciAoaSA9IDAsIGogPSBpdGVtU2l6ZTsgaSA8IG51bUdseXBoczsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CisgICAgICAgICAgdmFyIGdseXBoUHJvZmlsZSA9IHNhbml0aXplR2x5cGgob2xkR2x5ZkRhdGEsIGxvY2FFbnRyaWVzW2ldLm9mZnNldCwgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0LCBuZXdHbHlmRGF0YSwgd3JpdGVPZmZzZXQsIGhpbnRzVmFsaWQpOworICAgICAgICAgIHZhciBuZXdMZW5ndGggPSBnbHlwaFByb2ZpbGUubGVuZ3RoOworCisgICAgICAgICAgaWYgKG5ld0xlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgbWlzc2luZ0dseXBoc1tpXSA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnMgPiBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA9IGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnM7CisgICAgICAgICAgfQorCisgICAgICAgICAgd3JpdGVPZmZzZXQgKz0gbmV3TGVuZ3RoOworICAgICAgICAgIGl0ZW1FbmNvZGUobG9jYURhdGEsIGosIHdyaXRlT2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3cml0ZU9mZnNldCA9PT0gMCkgeworICAgICAgICAgIHZhciBzaW1wbGVHbHlwaCA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0OSwgMF0pOworCisgICAgICAgICAgZm9yIChpID0gMCwgaiA9IGl0ZW1TaXplOyBpIDwgbnVtR2x5cGhzT3V0OyBpKyssIGogKz0gaXRlbVNpemUpIHsKKyAgICAgICAgICAgIGl0ZW1FbmNvZGUobG9jYURhdGEsIGosIHNpbXBsZUdseXBoLmxlbmd0aCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ2x5Zi5kYXRhID0gc2ltcGxlR2x5cGg7CisgICAgICAgIH0gZWxzZSBpZiAoZHVwRmlyc3RFbnRyeSkgeworICAgICAgICAgIHZhciBmaXJzdEVudHJ5TGVuZ3RoID0gaXRlbURlY29kZShsb2NhRGF0YSwgaXRlbVNpemUpOworCisgICAgICAgICAgaWYgKG5ld0dseWZEYXRhLmxlbmd0aCA+IGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCkgeworICAgICAgICAgICAgZ2x5Zi5kYXRhID0gbmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgZmlyc3RFbnRyeUxlbmd0aCArIHdyaXRlT2Zmc2V0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2x5Zi5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3RFbnRyeUxlbmd0aCArIHdyaXRlT2Zmc2V0KTsKKyAgICAgICAgICAgIGdseWYuZGF0YS5zZXQobmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgd3JpdGVPZmZzZXQpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnbHlmLmRhdGEuc2V0KG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIGZpcnN0RW50cnlMZW5ndGgpLCB3cml0ZU9mZnNldCk7CisgICAgICAgICAgaXRlbUVuY29kZShsb2NhLmRhdGEsIGxvY2FEYXRhLmxlbmd0aCAtIGl0ZW1TaXplLCB3cml0ZU9mZnNldCArIGZpcnN0RW50cnlMZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgbWlzc2luZ0dseXBoczogbWlzc2luZ0dseXBocywKKyAgICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnM6IG1heFNpemVPZkluc3RydWN0aW9ucworICAgICAgICB9OworICAgICAgfQorCisgICAgICBmdW5jdGlvbiByZWFkUG9zdFNjcmlwdFRhYmxlKHBvc3QsIHByb3BlcnRpZXNPYmosIG1heHBOdW1HbHlwaHMpIHsKKyAgICAgICAgdmFyIHN0YXJ0ID0gKGZvbnQuc3RhcnQgPyBmb250LnN0YXJ0IDogMCkgKyBwb3N0Lm9mZnNldDsKKyAgICAgICAgZm9udC5wb3MgPSBzdGFydDsKKyAgICAgICAgdmFyIGxlbmd0aCA9IHBvc3QubGVuZ3RoLAorICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBsZW5ndGg7CisgICAgICAgIHZhciB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpOworICAgICAgICBmb250LnNraXAoMjgpOworICAgICAgICB2YXIgZ2x5cGhOYW1lczsKKyAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgdmFyIGk7CisKKyAgICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgICAgY2FzZSAweDAwMDEwMDAwOgorICAgICAgICAgICAgZ2x5cGhOYW1lcyA9IE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDAwMDIwMDAwOgorICAgICAgICAgICAgdmFyIG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7CisKKyAgICAgICAgICAgIGlmIChudW1HbHlwaHMgIT09IG1heHBOdW1HbHlwaHMpIHsKKyAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBnbHlwaE5hbWVJbmRleGVzID0gW107CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmb250LmdldFVpbnQxNigpOworCisgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAzMjc2OCkgeworICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBnbHlwaE5hbWVJbmRleGVzLnB1c2goaW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgY3VzdG9tTmFtZXMgPSBbXTsKKyAgICAgICAgICAgIHZhciBzdHJCdWYgPSBbXTsKKworICAgICAgICAgICAgd2hpbGUgKGZvbnQucG9zIDwgZW5kKSB7CisgICAgICAgICAgICAgIHZhciBzdHJpbmdMZW5ndGggPSBmb250LmdldEJ5dGUoKTsKKyAgICAgICAgICAgICAgc3RyQnVmLmxlbmd0aCA9IHN0cmluZ0xlbmd0aDsKKworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdHJCdWZbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0Qnl0ZSgpKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGN1c3RvbU5hbWVzLnB1c2goc3RyQnVmLmpvaW4oIiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2x5cGhOYW1lcyA9IFtdOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKKyAgICAgICAgICAgICAgdmFyIGogPSBnbHlwaE5hbWVJbmRleGVzW2ldOworCisgICAgICAgICAgICAgIGlmIChqIDwgMjU4KSB7CisgICAgICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tqXSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBnbHlwaE5hbWVzLnB1c2goY3VzdG9tTmFtZXNbaiAtIDI1OF0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHgwMDAzMDAwMDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5rbm93bi91bnN1cHBvcnRlZCBwb3N0IHRhYmxlIHZlcnNpb24gIiArIHZlcnNpb24pOworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nKSB7CisgICAgICAgICAgICAgIGdseXBoTmFtZXMgPSBwcm9wZXJ0aWVzT2JqLmRlZmF1bHRFbmNvZGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwcm9wZXJ0aWVzT2JqLmdseXBoTmFtZXMgPSBnbHlwaE5hbWVzOworICAgICAgICByZXR1cm4gdmFsaWQ7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWROYW1lVGFibGUobmFtZVRhYmxlKSB7CisgICAgICAgIHZhciBzdGFydCA9IChmb250LnN0YXJ0ID8gZm9udC5zdGFydCA6IDApICsgbmFtZVRhYmxlLm9mZnNldDsKKyAgICAgICAgZm9udC5wb3MgPSBzdGFydDsKKyAgICAgICAgdmFyIG5hbWVzID0gW1tdLCBbXV07CisgICAgICAgIHZhciBsZW5ndGggPSBuYW1lVGFibGUubGVuZ3RoLAorICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBsZW5ndGg7CisgICAgICAgIHZhciBmb3JtYXQgPSBmb250LmdldFVpbnQxNigpOworICAgICAgICB2YXIgRk9STUFUXzBfSEVBREVSX0xFTkdUSCA9IDY7CisKKyAgICAgICAgaWYgKGZvcm1hdCAhPT0gMCB8fCBsZW5ndGggPCBGT1JNQVRfMF9IRUFERVJfTEVOR1RIKSB7CisgICAgICAgICAgcmV0dXJuIG5hbWVzOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG51bVJlY29yZHMgPSBmb250LmdldFVpbnQxNigpOworICAgICAgICB2YXIgc3RyaW5nc1N0YXJ0ID0gZm9udC5nZXRVaW50MTYoKTsKKyAgICAgICAgdmFyIHJlY29yZHMgPSBbXTsKKyAgICAgICAgdmFyIE5BTUVfUkVDT1JEX0xFTkdUSCA9IDEyOworICAgICAgICB2YXIgaSwgaWk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVJlY29yZHMgJiYgZm9udC5wb3MgKyBOQU1FX1JFQ09SRF9MRU5HVEggPD0gZW5kOyBpKyspIHsKKyAgICAgICAgICB2YXIgciA9IHsKKyAgICAgICAgICAgIHBsYXRmb3JtOiBmb250LmdldFVpbnQxNigpLAorICAgICAgICAgICAgZW5jb2Rpbmc6IGZvbnQuZ2V0VWludDE2KCksCisgICAgICAgICAgICBsYW5ndWFnZTogZm9udC5nZXRVaW50MTYoKSwKKyAgICAgICAgICAgIG5hbWU6IGZvbnQuZ2V0VWludDE2KCksCisgICAgICAgICAgICBsZW5ndGg6IGZvbnQuZ2V0VWludDE2KCksCisgICAgICAgICAgICBvZmZzZXQ6IGZvbnQuZ2V0VWludDE2KCkKKyAgICAgICAgICB9OworCisgICAgICAgICAgaWYgKHIucGxhdGZvcm0gPT09IDEgJiYgci5lbmNvZGluZyA9PT0gMCAmJiByLmxhbmd1YWdlID09PSAwIHx8IHIucGxhdGZvcm0gPT09IDMgJiYgci5lbmNvZGluZyA9PT0gMSAmJiByLmxhbmd1YWdlID09PSAweDQwOSkgeworICAgICAgICAgICAgcmVjb3Jkcy5wdXNoKHIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gcmVjb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgdmFyIHJlY29yZCA9IHJlY29yZHNbaV07CisKKyAgICAgICAgICBpZiAocmVjb3JkLmxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgcG9zID0gc3RhcnQgKyBzdHJpbmdzU3RhcnQgKyByZWNvcmQub2Zmc2V0OworCisgICAgICAgICAgaWYgKHBvcyArIHJlY29yZC5sZW5ndGggPiBlbmQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvbnQucG9zID0gcG9zOworICAgICAgICAgIHZhciBuYW1lSW5kZXggPSByZWNvcmQubmFtZTsKKworICAgICAgICAgIGlmIChyZWNvcmQuZW5jb2RpbmcpIHsKKyAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKKworICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gcmVjb3JkLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKKyAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nZXRVaW50MTYoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5hbWVzWzFdW25hbWVJbmRleF0gPSBzdHI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hbWVzWzBdW25hbWVJbmRleF0gPSAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZm9udC5nZXRCeXRlcyhyZWNvcmQubGVuZ3RoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWVzOworICAgICAgfQorCisgICAgICB2YXIgVFRPcHNTdGFja0RlbHRhcyA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMiwgLTIsIC0yLCAtMiwgMCwgMCwgLTIsIC01LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgLTEsIC0xLCAtMSwgMSwgLTEsIC05OTksIDAsIDEsIDAsIC0xLCAtMiwgMCwgLTEsIC0yLCAtMSwgLTEsIDAsIC0xLCAtMSwgMCwgMCwgLTk5OSwgLTk5OSwgLTEsIC0xLCAtMSwgLTEsIC0yLCAtOTk5LCAtMiwgLTIsIC05OTksIDAsIC0yLCAtMiwgMCwgMCwgLTIsIDAsIC0yLCAwLCAwLCAwLCAtMiwgLTEsIC0xLCAxLCAxLCAwLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgLTEsIDAsIC0xLCAtMSwgMCwgLTk5OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTIsIC05OTksIC05OTksIC05OTksIC05OTksIC05OTksIC0xLCAtMSwgLTIsIC0yLCAwLCAwLCAwLCAwLCAtMSwgLTEsIC05OTksIC0yLCAtMiwgMCwgMCwgLTEsIC0yLCAtMiwgMCwgMCwgMCwgLTEsIC0xLCAtMSwgLTJdOworCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbSh0YWJsZSwgdHRDb250ZXh0KSB7CisgICAgICAgIHZhciBkYXRhID0gdGFibGUuZGF0YTsKKyAgICAgICAgdmFyIGkgPSAwLAorICAgICAgICAgICAgaiwKKyAgICAgICAgICAgIG4sCisgICAgICAgICAgICBiLAorICAgICAgICAgICAgZnVuY0lkLAorICAgICAgICAgICAgcGMsCisgICAgICAgICAgICBsYXN0RW5kZiA9IDAsCisgICAgICAgICAgICBsYXN0RGVmZiA9IDA7CisgICAgICAgIHZhciBzdGFjayA9IFtdOworICAgICAgICB2YXIgY2FsbHN0YWNrID0gW107CisgICAgICAgIHZhciBmdW5jdGlvbnNDYWxsZWQgPSBbXTsKKyAgICAgICAgdmFyIHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHR0Q29udGV4dC50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM7CisgICAgICAgIHZhciBpbkZERUYgPSBmYWxzZSwKKyAgICAgICAgICAgIGlmTGV2ZWwgPSAwLAorICAgICAgICAgICAgaW5FTFNFID0gMDsKKworICAgICAgICBmb3IgKHZhciBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7KSB7CisgICAgICAgICAgdmFyIG9wID0gZGF0YVtpKytdOworCisgICAgICAgICAgaWYgKG9wID09PSAweDQwKSB7CisgICAgICAgICAgICBuID0gZGF0YVtpKytdOworCisgICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgeworICAgICAgICAgICAgICBpICs9IG47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisgICAgICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2krK10pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg0MSkgeworICAgICAgICAgICAgbiA9IGRhdGFbaSsrXTsKKworICAgICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKKyAgICAgICAgICAgICAgaSArPSBuICogMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICBiID0gZGF0YVtpKytdOworICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYiA8PCA4IHwgZGF0YVtpKytdKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmOCkgPT09IDB4YjApIHsKKyAgICAgICAgICAgIG4gPSBvcCAtIDB4YjAgKyAxOworCisgICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgeworICAgICAgICAgICAgICBpICs9IG47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisgICAgICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2krK10pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiOCkgeworICAgICAgICAgICAgbiA9IG9wIC0gMHhiOCArIDE7CisKKyAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CisgICAgICAgICAgICAgIGkgKz0gbiAqIDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisgICAgICAgICAgICAgICAgYiA9IGRhdGFbaSsrXTsKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGIgPDwgOCB8IGRhdGFbaSsrXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJiICYmICF0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHsKKyAgICAgICAgICAgICAgZnVuY0lkID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CisKKyAgICAgICAgICAgICAgaWYgKGlzTmFOKGZ1bmNJZCkpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIlRUOiBDQUxMIGVtcHR5IHN0YWNrIChvciBpbnZhbGlkIGVudHJ5KS4iKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zVXNlZFtmdW5jSWRdID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGlmIChmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzKSB7CisgICAgICAgICAgICAgICAgICB2YXIgbmV3U3RhY2tMZW5ndGggPSBzdGFjay5sZW5ndGggKyB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXTsKKworICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YWNrTGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBDQUxMIGludmFsaWQgZnVuY3Rpb25zIHN0YWNrIGRlbHRhLiIpOworICAgICAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IG5ld1N0YWNrTGVuZ3RoOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnVuY0lkIGluIHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkICYmICFmdW5jdGlvbnNDYWxsZWQuaW5jbHVkZXMoZnVuY0lkKSkgeworICAgICAgICAgICAgICAgICAgY2FsbHN0YWNrLnB1c2goeworICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLAorICAgICAgICAgICAgICAgICAgICBpOiBpLAorICAgICAgICAgICAgICAgICAgICBzdGFja1RvcDogc3RhY2subGVuZ3RoIC0gMQorICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICBmdW5jdGlvbnNDYWxsZWQucHVzaChmdW5jSWQpOworICAgICAgICAgICAgICAgICAgcGMgPSB0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtmdW5jSWRdOworCisgICAgICAgICAgICAgICAgICBpZiAoIXBjKSB7CisgICAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IENBTEwgbm9uLWV4aXN0ZW50IGZ1bmN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7CisgICAgICAgICAgICAgICAgICBpID0gcGMuaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJjICYmICF0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbkZERUYgPSB0cnVlOworICAgICAgICAgICAgbGFzdERlZmYgPSBpOworICAgICAgICAgICAgZnVuY0lkID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtmdW5jSWRdID0geworICAgICAgICAgICAgICBkYXRhOiBkYXRhLAorICAgICAgICAgICAgICBpOiBpCisgICAgICAgICAgICB9OworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmQpIHsKKyAgICAgICAgICAgIGlmIChpbkZERUYpIHsKKyAgICAgICAgICAgICAgaW5GREVGID0gZmFsc2U7CisgICAgICAgICAgICAgIGxhc3RFbmRmID0gaTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBjID0gY2FsbHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICAgIGlmICghcGMpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBFTkRGIGJhZCBzdGFjayIpOworICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZnVuY0lkID0gZnVuY3Rpb25zQ2FsbGVkLnBvcCgpOworICAgICAgICAgICAgICBkYXRhID0gcGMuZGF0YTsKKyAgICAgICAgICAgICAgaSA9IHBjLmk7CisgICAgICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNTdGFja0RlbHRhc1tmdW5jSWRdID0gc3RhY2subGVuZ3RoIC0gcGMuc3RhY2tUb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg4OSkgeworICAgICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogbmVzdGVkIElERUZzIG5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICAgIHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluRkRFRiA9IHRydWU7CisgICAgICAgICAgICBsYXN0RGVmZiA9IGk7CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OCkgeworICAgICAgICAgICAgKytpZkxldmVsOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWIpIHsKKyAgICAgICAgICAgIGluRUxTRSA9IGlmTGV2ZWw7CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OSkgeworICAgICAgICAgICAgaWYgKGluRUxTRSA9PT0gaWZMZXZlbCkgeworICAgICAgICAgICAgICBpbkVMU0UgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAtLWlmTGV2ZWw7CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgxYykgeworICAgICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgeworICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CisKKyAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICBpICs9IG9mZnNldCAtIDE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWluRkRFRiAmJiAhaW5FTFNFKSB7CisgICAgICAgICAgICB2YXIgc3RhY2tEZWx0YSA9IDA7CisKKyAgICAgICAgICAgIGlmIChvcCA8PSAweDhlKSB7CisgICAgICAgICAgICAgIHN0YWNrRGVsdGEgPSBUVE9wc1N0YWNrRGVsdGFzW29wXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPj0gMHhjMCAmJiBvcCA8PSAweGRmKSB7CisgICAgICAgICAgICAgIHN0YWNrRGVsdGEgPSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPj0gMHhlMCkgeworICAgICAgICAgICAgICBzdGFja0RlbHRhID0gLTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvcCA+PSAweDcxICYmIG9wIDw9IDB4NzUpIHsKKyAgICAgICAgICAgICAgbiA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICAgIGlmICghaXNOYU4obikpIHsKKyAgICAgICAgICAgICAgICBzdGFja0RlbHRhID0gLW4gKiAyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChzdGFja0RlbHRhIDwgMCAmJiBzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICBzdGFja0RlbHRhKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChzdGFja0RlbHRhID4gMCkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKE5hTik7CisgICAgICAgICAgICAgIHN0YWNrRGVsdGEtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOworICAgICAgICB2YXIgY29udGVudCA9IFtkYXRhXTsKKworICAgICAgICBpZiAoaSA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgY29udGVudC5wdXNoKG5ldyBVaW50OEFycmF5KGkgLSBkYXRhLmxlbmd0aCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3REZWZmID4gbGFzdEVuZGYpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBjb21wbGVtZW50aW5nIGEgbWlzc2luZyBmdW5jdGlvbiB0YWlsIik7CisgICAgICAgICAgY29udGVudC5wdXNoKG5ldyBVaW50OEFycmF5KFsweDIyLCAweDJkXSkpOworICAgICAgICB9CisKKyAgICAgICAgZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBjaGVja0ludmFsaWRGdW5jdGlvbnModHRDb250ZXh0LCBtYXhGdW5jdGlvbkRlZnMpIHsKKyAgICAgICAgaWYgKHR0Q29udGV4dC50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWQubGVuZ3RoID4gbWF4RnVuY3Rpb25EZWZzKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogbW9yZSBmdW5jdGlvbnMgZGVmaW5lZCB0aGFuIGV4cGVjdGVkIik7CisgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSB0dENvbnRleHQuZnVuY3Rpb25zVXNlZC5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgaWYgKGogPiBtYXhGdW5jdGlvbkRlZnMpIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IGludmFsaWQgZnVuY3Rpb24gaWQ6ICIgKyBqKTsKKyAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2pdICYmICF0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtqXSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogdW5kZWZpbmVkIGZ1bmN0aW9uOiAiICsgaik7CisgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBmb2xkVFRUYWJsZSh0YWJsZSwgY29udGVudCkgeworICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPiAxKSB7CisgICAgICAgICAgdmFyIG5ld0xlbmd0aCA9IDA7CisgICAgICAgICAgdmFyIGosIGpqOworCisgICAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICAgIG5ld0xlbmd0aCArPSBjb250ZW50W2pdLmxlbmd0aDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZXdMZW5ndGggPSBuZXdMZW5ndGggKyAzICYgfjM7CisgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KG5ld0xlbmd0aCk7CisgICAgICAgICAgdmFyIHBvcyA9IDA7CisKKyAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvbnRlbnQubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgcmVzdWx0LnNldChjb250ZW50W2pdLCBwb3MpOworICAgICAgICAgICAgcG9zICs9IGNvbnRlbnRbal0ubGVuZ3RoOworICAgICAgICAgIH0KKworICAgICAgICAgIHRhYmxlLmRhdGEgPSByZXN1bHQ7CisgICAgICAgICAgdGFibGUubGVuZ3RoID0gbmV3TGVuZ3RoOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtcyhmcGdtLCBwcmVwLCBjdnQsIG1heEZ1bmN0aW9uRGVmcykgeworICAgICAgICB2YXIgdHRDb250ZXh0ID0geworICAgICAgICAgIGZ1bmN0aW9uc0RlZmluZWQ6IFtdLAorICAgICAgICAgIGZ1bmN0aW9uc1VzZWQ6IFtdLAorICAgICAgICAgIGZ1bmN0aW9uc1N0YWNrRGVsdGFzOiBbXSwKKyAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM6IGZhbHNlLAorICAgICAgICAgIGhpbnRzVmFsaWQ6IHRydWUKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoZnBnbSkgeworICAgICAgICAgIHNhbml0aXplVFRQcm9ncmFtKGZwZ20sIHR0Q29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlcCkgeworICAgICAgICAgIHNhbml0aXplVFRQcm9ncmFtKHByZXAsIHR0Q29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnBnbSkgeworICAgICAgICAgIGNoZWNrSW52YWxpZEZ1bmN0aW9ucyh0dENvbnRleHQsIG1heEZ1bmN0aW9uRGVmcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3Z0ICYmIGN2dC5sZW5ndGggJiAxKSB7CisgICAgICAgICAgdmFyIGN2dERhdGEgPSBuZXcgVWludDhBcnJheShjdnQubGVuZ3RoICsgMSk7CisgICAgICAgICAgY3Z0RGF0YS5zZXQoY3Z0LmRhdGEpOworICAgICAgICAgIGN2dC5kYXRhID0gY3Z0RGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0dENvbnRleHQuaGludHNWYWxpZDsKKyAgICAgIH0KKworICAgICAgZm9udCA9IG5ldyBfc3RyZWFtLlN0cmVhbShuZXcgVWludDhBcnJheShmb250LmdldEJ5dGVzKCkpKTsKKyAgICAgIHZhciBoZWFkZXIsIHRhYmxlczsKKworICAgICAgaWYgKGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmb250KSkgeworICAgICAgICB2YXIgdHRjRGF0YSA9IHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKGZvbnQsIHRoaXMubmFtZSk7CisgICAgICAgIGhlYWRlciA9IHR0Y0RhdGEuaGVhZGVyOworICAgICAgICB0YWJsZXMgPSB0dGNEYXRhLnRhYmxlczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWRlciA9IHJlYWRPcGVuVHlwZUhlYWRlcihmb250KTsKKyAgICAgICAgdGFibGVzID0gcmVhZFRhYmxlcyhmb250LCBoZWFkZXIubnVtVGFibGVzKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNmZiwgY2ZmRmlsZTsKKyAgICAgIHZhciBpc1RydWVUeXBlID0gIXRhYmxlc1siQ0ZGICJdOworCisgICAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKKyAgICAgICAgdmFyIGlzQ29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGUgJiYgKChwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwIHx8IFtdKS5sZW5ndGggPiAwIHx8ICEocHJvcGVydGllcy5jTWFwIGluc3RhbmNlb2YgX2NtYXAuSWRlbnRpdHlDTWFwKSk7CisKKyAgICAgICAgaWYgKGhlYWRlci52ZXJzaW9uID09PSAiT1RUTyIgJiYgIWlzQ29tcG9zaXRlIHx8ICF0YWJsZXMuaGVhZCB8fCAhdGFibGVzLmhoZWEgfHwgIXRhYmxlcy5tYXhwIHx8ICF0YWJsZXMucG9zdCkgeworICAgICAgICAgIGNmZkZpbGUgPSBuZXcgX3N0cmVhbS5TdHJlYW0odGFibGVzWyJDRkYgIl0uZGF0YSk7CisgICAgICAgICAgY2ZmID0gbmV3IENGRkZvbnQoY2ZmRmlsZSwgcHJvcGVydGllcyk7CisgICAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpOworICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnQobmFtZSwgY2ZmLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGV0ZSB0YWJsZXMuZ2x5ZjsKKyAgICAgICAgZGVsZXRlIHRhYmxlcy5sb2NhOworICAgICAgICBkZWxldGUgdGFibGVzLmZwZ207CisgICAgICAgIGRlbGV0ZSB0YWJsZXMucHJlcDsKKyAgICAgICAgZGVsZXRlIHRhYmxlc1siY3Z0ICJdOworICAgICAgICB0aGlzLmlzT3BlblR5cGUgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCF0YWJsZXMubG9jYSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcignUmVxdWlyZWQgImxvY2EiIHRhYmxlIGlzIG5vdCBmb3VuZCcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF0YWJsZXMuZ2x5ZikgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgnUmVxdWlyZWQgImdseWYiIHRhYmxlIGlzIG5vdCBmb3VuZCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKKyAgICAgICAgICB0YWJsZXMuZ2x5ZiA9IHsKKyAgICAgICAgICAgIHRhZzogImdseWYiLAorICAgICAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoMCkKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pc09wZW5UeXBlID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmICghdGFibGVzLm1heHApIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibWF4cCIgdGFibGUgaXMgbm90IGZvdW5kJyk7CisgICAgICB9CisKKyAgICAgIGZvbnQucG9zID0gKGZvbnQuc3RhcnQgfHwgMCkgKyB0YWJsZXMubWF4cC5vZmZzZXQ7CisgICAgICB2YXIgdmVyc2lvbiA9IGZvbnQuZ2V0SW50MzIoKTsKKyAgICAgIHZhciBudW1HbHlwaHMgPSBmb250LmdldFVpbnQxNigpOworICAgICAgdmFyIG51bUdseXBoc091dCA9IG51bUdseXBocyArIDE7CisgICAgICB2YXIgZHVwRmlyc3RFbnRyeSA9IHRydWU7CisKKyAgICAgIGlmIChudW1HbHlwaHNPdXQgPiAweGZmZmYpIHsKKyAgICAgICAgZHVwRmlyc3RFbnRyeSA9IGZhbHNlOworICAgICAgICBudW1HbHlwaHNPdXQgPSBudW1HbHlwaHM7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTm90IGVub3VnaCBzcGFjZSBpbiBnbHlmcyB0byBkdXBsaWNhdGUgZmlyc3QgZ2x5cGguIik7CisgICAgICB9CisKKyAgICAgIHZhciBtYXhGdW5jdGlvbkRlZnMgPSAwOworICAgICAgdmFyIG1heFNpemVPZkluc3RydWN0aW9ucyA9IDA7CisKKyAgICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDIyKSB7CisgICAgICAgIGZvbnQucG9zICs9IDg7CisgICAgICAgIHZhciBtYXhab25lcyA9IGZvbnQuZ2V0VWludDE2KCk7CisKKyAgICAgICAgaWYgKG1heFpvbmVzID4gMikgeworICAgICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMTRdID0gMDsKKyAgICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE1XSA9IDI7CisgICAgICAgIH0KKworICAgICAgICBmb250LnBvcyArPSA0OworICAgICAgICBtYXhGdW5jdGlvbkRlZnMgPSBmb250LmdldFVpbnQxNigpOworICAgICAgICBmb250LnBvcyArPSA0OworICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBmb250LmdldFVpbnQxNigpOworICAgICAgfQorCisgICAgICB0YWJsZXMubWF4cC5kYXRhWzRdID0gbnVtR2x5cGhzT3V0ID4+IDg7CisgICAgICB0YWJsZXMubWF4cC5kYXRhWzVdID0gbnVtR2x5cGhzT3V0ICYgMjU1OworICAgICAgdmFyIGhpbnRzVmFsaWQgPSBzYW5pdGl6ZVRUUHJvZ3JhbXModGFibGVzLmZwZ20sIHRhYmxlcy5wcmVwLCB0YWJsZXNbImN2dCAiXSwgbWF4RnVuY3Rpb25EZWZzKTsKKworICAgICAgaWYgKCFoaW50c1ZhbGlkKSB7CisgICAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTsKKyAgICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwOworICAgICAgICBkZWxldGUgdGFibGVzWyJjdnQgIl07CisgICAgICB9CisKKyAgICAgIHNhbml0aXplTWV0cmljcyhmb250LCB0YWJsZXMuaGhlYSwgdGFibGVzLmhtdHgsIG51bUdseXBoc091dCwgZHVwRmlyc3RFbnRyeSk7CisKKyAgICAgIGlmICghdGFibGVzLmhlYWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGVhZCIgdGFibGUgaXMgbm90IGZvdW5kJyk7CisgICAgICB9CisKKyAgICAgIHNhbml0aXplSGVhZCh0YWJsZXMuaGVhZCwgbnVtR2x5cGhzLCBpc1RydWVUeXBlID8gdGFibGVzLmxvY2EubGVuZ3RoIDogMCk7CisgICAgICB2YXIgbWlzc2luZ0dseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgIGlmIChpc1RydWVUeXBlKSB7CisgICAgICAgIHZhciBpc0dseXBoTG9jYXRpb25zTG9uZyA9IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbNTBdLCB0YWJsZXMuaGVhZC5kYXRhWzUxXSk7CisgICAgICAgIHZhciBnbHlwaHNJbmZvID0gc2FuaXRpemVHbHlwaExvY2F0aW9ucyh0YWJsZXMubG9jYSwgdGFibGVzLmdseWYsIG51bUdseXBocywgaXNHbHlwaExvY2F0aW9uc0xvbmcsIGhpbnRzVmFsaWQsIGR1cEZpcnN0RW50cnksIG1heFNpemVPZkluc3RydWN0aW9ucyk7CisgICAgICAgIG1pc3NpbmdHbHlwaHMgPSBnbHlwaHNJbmZvLm1pc3NpbmdHbHlwaHM7CisKKyAgICAgICAgaWYgKHZlcnNpb24gPj0gMHgwMDAxMDAwMCAmJiB0YWJsZXMubWF4cC5sZW5ndGggPj0gMjIpIHsKKyAgICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzI2XSA9IGdseXBoc0luZm8ubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID4+IDg7CisgICAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyN10gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyAmIDI1NTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXRhYmxlcy5oaGVhKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcignUmVxdWlyZWQgImhoZWEiIHRhYmxlIGlzIG5vdCBmb3VuZCcpOworICAgICAgfQorCisgICAgICBpZiAodGFibGVzLmhoZWEuZGF0YVsxMF0gPT09IDAgJiYgdGFibGVzLmhoZWEuZGF0YVsxMV0gPT09IDApIHsKKyAgICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMF0gPSAweGZmOworICAgICAgICB0YWJsZXMuaGhlYS5kYXRhWzExXSA9IDB4ZmY7CisgICAgICB9CisKKyAgICAgIHZhciBtZXRyaWNzT3ZlcnJpZGUgPSB7CisgICAgICAgIHVuaXRzUGVyRW06IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbMThdLCB0YWJsZXMuaGVhZC5kYXRhWzE5XSksCisgICAgICAgIHlNYXg6IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbNDJdLCB0YWJsZXMuaGVhZC5kYXRhWzQzXSksCisgICAgICAgIHlNaW46IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbMzhdLCB0YWJsZXMuaGVhZC5kYXRhWzM5XSksCisgICAgICAgIGFzY2VudDogaW50MTYodGFibGVzLmhoZWEuZGF0YVs0XSwgdGFibGVzLmhoZWEuZGF0YVs1XSksCisgICAgICAgIGRlc2NlbnQ6IHNpZ25lZEludDE2KHRhYmxlcy5oaGVhLmRhdGFbNl0sIHRhYmxlcy5oaGVhLmRhdGFbN10pCisgICAgICB9OworICAgICAgdGhpcy5hc2NlbnQgPSBtZXRyaWNzT3ZlcnJpZGUuYXNjZW50IC8gbWV0cmljc092ZXJyaWRlLnVuaXRzUGVyRW07CisgICAgICB0aGlzLmRlc2NlbnQgPSBtZXRyaWNzT3ZlcnJpZGUuZGVzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtOworCisgICAgICBpZiAodGFibGVzLnBvc3QpIHsKKyAgICAgICAgcmVhZFBvc3RTY3JpcHRUYWJsZSh0YWJsZXMucG9zdCwgcHJvcGVydGllcywgbnVtR2x5cGhzKTsKKyAgICAgIH0KKworICAgICAgdGFibGVzLnBvc3QgPSB7CisgICAgICAgIHRhZzogInBvc3QiLAorICAgICAgICBkYXRhOiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykKKyAgICAgIH07CisgICAgICB2YXIgY2hhckNvZGVUb0dseXBoSWQgPSBbXTsKKworICAgICAgZnVuY3Rpb24gaGFzR2x5cGgoZ2x5cGhJZCkgeworICAgICAgICByZXR1cm4gIW1pc3NpbmdHbHlwaHNbZ2x5cGhJZF07CisgICAgICB9CisKKyAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgeworICAgICAgICB2YXIgY2lkVG9HaWRNYXAgPSBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwIHx8IFtdOworICAgICAgICB2YXIgaXNDaWRUb0dpZE1hcEVtcHR5ID0gY2lkVG9HaWRNYXAubGVuZ3RoID09PSAwOworICAgICAgICBwcm9wZXJ0aWVzLmNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIGNpZCkgeworICAgICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBnbHlwaElkID0gLTE7CisKKyAgICAgICAgICBpZiAoaXNDaWRUb0dpZE1hcEVtcHR5KSB7CisgICAgICAgICAgICBnbHlwaElkID0gY2lkOworICAgICAgICAgIH0gZWxzZSBpZiAoY2lkVG9HaWRNYXBbY2lkXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBnbHlwaElkID0gY2lkVG9HaWRNYXBbY2lkXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwICYmIGdseXBoSWQgPCBudW1HbHlwaHMgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKKyAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBjbWFwVGFibGUgPSByZWFkQ21hcFRhYmxlKHRhYmxlcy5jbWFwLCBmb250LCB0aGlzLmlzU3ltYm9saWNGb250LCBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKTsKKyAgICAgICAgdmFyIGNtYXBQbGF0Zm9ybUlkID0gY21hcFRhYmxlLnBsYXRmb3JtSWQ7CisgICAgICAgIHZhciBjbWFwRW5jb2RpbmdJZCA9IGNtYXBUYWJsZS5lbmNvZGluZ0lkOworICAgICAgICB2YXIgY21hcE1hcHBpbmdzID0gY21hcFRhYmxlLm1hcHBpbmdzOworICAgICAgICB2YXIgY21hcE1hcHBpbmdzTGVuZ3RoID0gY21hcE1hcHBpbmdzLmxlbmd0aDsKKyAgICAgICAgdmFyIGJhc2VFbmNvZGluZyA9IFtdOworCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nICYmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPT09ICJNYWNSb21hbkVuY29kaW5nIiB8fCBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPT09ICJXaW5BbnNpRW5jb2RpbmciKSkgeworICAgICAgICAgIGJhc2VFbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzRW5jb2RpbmcgJiYgIXRoaXMuaXNTeW1ib2xpY0ZvbnQgJiYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxIHx8IGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSkgeworICAgICAgICAgIHZhciBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKworICAgICAgICAgIGZvciAodmFyIGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCAyNTY7IGNoYXJDb2RlKyspIHsKKyAgICAgICAgICAgIHZhciBnbHlwaE5hbWUsIHN0YW5kYXJkR2x5cGhOYW1lOworCisgICAgICAgICAgICBpZiAodGhpcy5kaWZmZXJlbmNlcyAmJiBjaGFyQ29kZSBpbiB0aGlzLmRpZmZlcmVuY2VzKSB7CisgICAgICAgICAgICAgIGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyQ29kZSBpbiBiYXNlRW5jb2RpbmcgJiYgYmFzZUVuY29kaW5nW2NoYXJDb2RlXSAhPT0gIiIpIHsKKyAgICAgICAgICAgICAgZ2x5cGhOYW1lID0gYmFzZUVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGdseXBoTmFtZSA9IF9lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZ1tjaGFyQ29kZV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZ2x5cGhOYW1lKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFuZGFyZEdseXBoTmFtZSA9IHJlY292ZXJHbHlwaE5hbWUoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKKyAgICAgICAgICAgIHZhciB1bmljb2RlT3JDaGFyQ29kZTsKKworICAgICAgICAgICAgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxKSB7CisgICAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtzdGFuZGFyZEdseXBoTmFtZV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CisgICAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gX2VuY29kaW5ncy5NYWNSb21hbkVuY29kaW5nLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGUgIT09IHVuaWNvZGVPckNoYXJDb2RlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBjbWFwTWFwcGluZ3NbaV0uZ2x5cGhJZDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAwKSB7CisgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgY21hcE1hcHBpbmdzTGVuZ3RoOyArK19pMikgeworICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY21hcE1hcHBpbmdzW19pMl0uY2hhckNvZGVdID0gY21hcE1hcHBpbmdzW19pMl0uZ2x5cGhJZDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgY21hcE1hcHBpbmdzTGVuZ3RoOyArK19pMykgeworICAgICAgICAgICAgdmFyIF9jaGFyQ29kZTQgPSBjbWFwTWFwcGluZ3NbX2kzXS5jaGFyQ29kZTsKKworICAgICAgICAgICAgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIF9jaGFyQ29kZTQgPj0gMHhmMDAwICYmIF9jaGFyQ29kZTQgPD0gMHhmMGZmKSB7CisgICAgICAgICAgICAgIF9jaGFyQ29kZTQgJj0gMHhmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbX2NoYXJDb2RlNF0gPSBjbWFwTWFwcGluZ3NbX2kzXS5nbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmdseXBoTmFtZXMgJiYgYmFzZUVuY29kaW5nLmxlbmd0aCkgeworICAgICAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IDI1NjsgKytfaTQpIHsKKyAgICAgICAgICAgIGlmIChjaGFyQ29kZVRvR2x5cGhJZFtfaTRdID09PSB1bmRlZmluZWQgJiYgYmFzZUVuY29kaW5nW19pNF0pIHsKKyAgICAgICAgICAgICAgZ2x5cGhOYW1lID0gYmFzZUVuY29kaW5nW19pNF07CisgICAgICAgICAgICAgIHZhciBnbHlwaElkID0gcHJvcGVydGllcy5nbHlwaE5hbWVzLmluZGV4T2YoZ2x5cGhOYW1lKTsKKworICAgICAgICAgICAgICBpZiAoZ2x5cGhJZCA+IDAgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKKyAgICAgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtfaTRdID0gZ2x5cGhJZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2hhckNvZGVUb0dseXBoSWQubGVuZ3RoID09PSAwKSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkWzBdID0gMDsKKyAgICAgIH0KKworICAgICAgdmFyIGdseXBoWmVyb0lkID0gbnVtR2x5cGhzT3V0IC0gMTsKKworICAgICAgaWYgKCFkdXBGaXJzdEVudHJ5KSB7CisgICAgICAgIGdseXBoWmVyb0lkID0gMDsKKyAgICAgIH0KKworICAgICAgdmFyIG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgZ2x5cGhaZXJvSWQpOworICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOworICAgICAgdGFibGVzLmNtYXAgPSB7CisgICAgICAgIHRhZzogImNtYXAiLAorICAgICAgICBkYXRhOiBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbnVtR2x5cGhzT3V0KQorICAgICAgfTsKKworICAgICAgaWYgKCF0YWJsZXNbIk9TLzIiXSB8fCAhdmFsaWRhdGVPUzJUYWJsZSh0YWJsZXNbIk9TLzIiXSwgZm9udCkpIHsKKyAgICAgICAgdGFibGVzWyJPUy8yIl0gPSB7CisgICAgICAgICAgdGFnOiAiT1MvMiIsCisgICAgICAgICAgZGF0YTogY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbWV0cmljc092ZXJyaWRlKQorICAgICAgICB9OworICAgICAgfQorCisgICAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjZmZGaWxlID0gbmV3IF9zdHJlYW0uU3RyZWFtKHRhYmxlc1siQ0ZGICJdLmRhdGEpOworICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKGNmZkZpbGUsIHByb3BlcnRpZXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgICAgICAgY2ZmID0gcGFyc2VyLnBhcnNlKCk7CisgICAgICAgICAgY2ZmLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTsKKyAgICAgICAgICB2YXIgY29tcGlsZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIoY2ZmKTsKKyAgICAgICAgICB0YWJsZXNbIkNGRiAiXS5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghdGFibGVzLm5hbWUpIHsKKyAgICAgICAgdGFibGVzLm5hbWUgPSB7CisgICAgICAgICAgdGFnOiAibmFtZSIsCisgICAgICAgICAgZGF0YTogY3JlYXRlTmFtZVRhYmxlKHRoaXMubmFtZSkKKyAgICAgICAgfTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBuYW1lUHJvdG90eXBlID0gcmVhZE5hbWVUYWJsZSh0YWJsZXMubmFtZSk7CisgICAgICAgIHRhYmxlcy5uYW1lLmRhdGEgPSBjcmVhdGVOYW1lVGFibGUobmFtZSwgbmFtZVByb3RvdHlwZSk7CisgICAgICB9CisKKyAgICAgIHZhciBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoaGVhZGVyLnZlcnNpb24pOworCisgICAgICBmb3IgKHZhciB0YWJsZVRhZyBpbiB0YWJsZXMpIHsKKyAgICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpOworICAgIH0sCisgICAgY29udmVydDogZnVuY3Rpb24gRm9udF9jb252ZXJ0KGZvbnROYW1lLCBmb250LCBwcm9wZXJ0aWVzKSB7CisgICAgICBwcm9wZXJ0aWVzLmZpeGVkUGl0Y2ggPSBmYWxzZTsKKworICAgICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7CisgICAgICAgIGFkanVzdFRvVW5pY29kZShwcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZyk7CisgICAgICB9CisKKyAgICAgIHZhciBnbHlwaFplcm9JZCA9IDE7CisKKyAgICAgIGlmIChmb250IGluc3RhbmNlb2YgQ0ZGRm9udCkgeworICAgICAgICBnbHlwaFplcm9JZCA9IGZvbnQubnVtR2x5cGhzIC0gMTsKKyAgICAgIH0KKworICAgICAgdmFyIG1hcHBpbmcgPSBmb250LmdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKTsKKyAgICAgIHZhciBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhtYXBwaW5nLCBmb250Lmhhc0dseXBoSWQuYmluZChmb250KSwgZ2x5cGhaZXJvSWQpOworICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOworICAgICAgdmFyIG51bUdseXBocyA9IGZvbnQubnVtR2x5cGhzOworCisgICAgICBmdW5jdGlvbiBnZXRDaGFyQ29kZXMoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKKyAgICAgICAgdmFyIGNoYXJDb2RlcyA9IG51bGw7CisKKyAgICAgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKKyAgICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7CisgICAgICAgICAgICBpZiAoIWNoYXJDb2RlcykgeworICAgICAgICAgICAgICBjaGFyQ29kZXMgPSBbXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hhckNvZGVzLnB1c2goY2hhckNvZGUgfCAwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2hhckNvZGVzOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBjcmVhdGVDaGFyQ29kZShjaGFyQ29kZVRvR2x5cGhJZCwgZ2x5cGhJZCkgeworICAgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgeworICAgICAgICAgIGlmIChnbHlwaElkID09PSBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0pIHsKKyAgICAgICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZFtuZXdNYXBwaW5nLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGVdID0gZ2x5cGhJZDsKKyAgICAgICAgcmV0dXJuIG5ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrOworICAgICAgfQorCisgICAgICB2YXIgc2VhY3MgPSBmb250LnNlYWNzOworCisgICAgICBpZiAoU0VBQ19BTkFMWVNJU19FTkFCTEVEICYmIHNlYWNzICYmIHNlYWNzLmxlbmd0aCkgeworICAgICAgICB2YXIgbWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgICB2YXIgY2hhcnNldCA9IGZvbnQuZ2V0Q2hhcnNldCgpOworICAgICAgICB2YXIgc2VhY01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgZm9yICh2YXIgZ2x5cGhJZCBpbiBzZWFjcykgeworICAgICAgICAgIGdseXBoSWQgfD0gMDsKKyAgICAgICAgICB2YXIgc2VhYyA9IHNlYWNzW2dseXBoSWRdOworICAgICAgICAgIHZhciBiYXNlR2x5cGhOYW1lID0gX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nW3NlYWNbMl1dOworICAgICAgICAgIHZhciBhY2NlbnRHbHlwaE5hbWUgPSBfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2Rpbmdbc2VhY1szXV07CisgICAgICAgICAgdmFyIGJhc2VHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGJhc2VHbHlwaE5hbWUpOworICAgICAgICAgIHZhciBhY2NlbnRHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGFjY2VudEdseXBoTmFtZSk7CisKKyAgICAgICAgICBpZiAoYmFzZUdseXBoSWQgPCAwIHx8IGFjY2VudEdseXBoSWQgPCAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgYWNjZW50T2Zmc2V0ID0geworICAgICAgICAgICAgeDogc2VhY1swXSAqIG1hdHJpeFswXSArIHNlYWNbMV0gKiBtYXRyaXhbMl0gKyBtYXRyaXhbNF0sCisgICAgICAgICAgICB5OiBzZWFjWzBdICogbWF0cml4WzFdICsgc2VhY1sxXSAqIG1hdHJpeFszXSArIG1hdHJpeFs1XQorICAgICAgICAgIH07CisgICAgICAgICAgdmFyIGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTsKKworICAgICAgICAgIGlmICghY2hhckNvZGVzKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjaGFyQ29kZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gY2hhckNvZGVzW2ldOworICAgICAgICAgICAgdmFyIGNoYXJDb2RlVG9HbHlwaElkID0gbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZDsKKyAgICAgICAgICAgIHZhciBiYXNlRm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGJhc2VHbHlwaElkKTsKKyAgICAgICAgICAgIHZhciBhY2NlbnRGb250Q2hhckNvZGUgPSBjcmVhdGVDaGFyQ29kZShjaGFyQ29kZVRvR2x5cGhJZCwgYWNjZW50R2x5cGhJZCk7CisgICAgICAgICAgICBzZWFjTWFwW2NoYXJDb2RlXSA9IHsKKyAgICAgICAgICAgICAgYmFzZUZvbnRDaGFyQ29kZTogYmFzZUZvbnRDaGFyQ29kZSwKKyAgICAgICAgICAgICAgYWNjZW50Rm9udENoYXJDb2RlOiBhY2NlbnRGb250Q2hhckNvZGUsCisgICAgICAgICAgICAgIGFjY2VudE9mZnNldDogYWNjZW50T2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3BlcnRpZXMuc2VhY01hcCA9IHNlYWNNYXA7CisgICAgICB9CisKKyAgICAgIHZhciB1bml0c1BlckVtID0gMSAvIChwcm9wZXJ0aWVzLmZvbnRNYXRyaXggfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVgpWzBdOworICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgT3BlblR5cGVGaWxlQnVpbGRlcigiXHg0Rlx4NTRceDU0XHg0RiIpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgiQ0ZGICIsIGZvbnQuZGF0YSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJPUy8yIiwgY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCkpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgiY21hcCIsIGNyZWF0ZUNtYXBUYWJsZShuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkLCBudW1HbHlwaHMpKTsKKyAgICAgIGJ1aWxkZXIuYWRkVGFibGUoImhlYWQiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyAiXHgwMFx4MDBceDEwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHg1Rlx4MEZceDNDXHhGNSIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHVuaXRzUGVyRW0pICsgIlx4MDBceDAwXHgwMFx4MDBceDllXHgwYlx4N2VceDI3IiArICJceDAwXHgwMFx4MDBceDAwXHg5ZVx4MGJceDdlXHgyNyIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwRlx4RkYiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuYXNjZW50KSArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAyIDogMCkgKyAiXHgwMFx4MTEiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiKTsKKyAgICAgIGJ1aWxkZXIuYWRkVGFibGUoImhoZWEiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwMFx4MDAiICsgIlx4RkZceEZGIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmNhcEhlaWdodCkgKyBzYWZlU3RyaW5nMTYoTWF0aC50YW4ocHJvcGVydGllcy5pdGFsaWNBbmdsZSkgKiBwcm9wZXJ0aWVzLnhIZWlnaHQpICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMTYobnVtR2x5cGhzKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJobXR4IiwgZnVuY3Rpb24gZm9udEZpZWxkc0htdHgoKSB7CisgICAgICAgIHZhciBjaGFyc3RyaW5ncyA9IGZvbnQuY2hhcnN0cmluZ3M7CisgICAgICAgIHZhciBjZmZXaWR0aHMgPSBmb250LmNmZiA/IGZvbnQuY2ZmLndpZHRocyA6IG51bGw7CisgICAgICAgIHZhciBobXR4ID0gIlx4MDBceDAwXHgwMFx4MDAiOworCisgICAgICAgIGZvciAodmFyIF9pNSA9IDEsIF9paSA9IG51bUdseXBoczsgX2k1IDwgX2lpOyBfaTUrKykgeworICAgICAgICAgIHZhciB3aWR0aCA9IDA7CisKKyAgICAgICAgICBpZiAoY2hhcnN0cmluZ3MpIHsKKyAgICAgICAgICAgIHZhciBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbX2k1IC0gMV07CisgICAgICAgICAgICB3aWR0aCA9ICJ3aWR0aCIgaW4gY2hhcnN0cmluZyA/IGNoYXJzdHJpbmcud2lkdGggOiAwOworICAgICAgICAgIH0gZWxzZSBpZiAoY2ZmV2lkdGhzKSB7CisgICAgICAgICAgICB3aWR0aCA9IE1hdGguY2VpbChjZmZXaWR0aHNbX2k1XSB8fCAwKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBobXR4ICs9IHN0cmluZzE2KHdpZHRoKSArIHN0cmluZzE2KDApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhtdHg7CisgICAgICB9KCkpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgibWF4cCIsICJceDAwXHgwMFx4NTBceDAwIiArIHN0cmluZzE2KG51bUdseXBocykpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgibmFtZSIsIGNyZWF0ZU5hbWVUYWJsZShmb250TmFtZSkpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgicG9zdCIsIGNyZWF0ZVBvc3RUYWJsZShwcm9wZXJ0aWVzKSk7CisgICAgICByZXR1cm4gYnVpbGRlci50b0FycmF5KCk7CisgICAgfSwKKworICAgIGdldCBzcGFjZVdpZHRoKCkgeworICAgICAgdmFyIHBvc3NpYmxlU3BhY2VSZXBsYWNlbWVudHMgPSBbInNwYWNlIiwgIm1pbnVzIiwgIm9uZSIsICJpIiwgIkkiXTsKKyAgICAgIHZhciB3aWR0aDsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcG9zc2libGVTcGFjZVJlcGxhY2VtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHZhciBnbHlwaE5hbWUgPSBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzW2ldOworCisgICAgICAgIGlmIChnbHlwaE5hbWUgaW4gdGhpcy53aWR0aHMpIHsKKyAgICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2dseXBoTmFtZV07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CisgICAgICAgIHZhciBnbHlwaFVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV07CisgICAgICAgIHZhciBjaGFyY29kZSA9IDA7CisKKyAgICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICYmIHRoaXMuY01hcC5jb250YWlucyhnbHlwaFVuaWNvZGUpKSB7CisgICAgICAgICAgY2hhcmNvZGUgPSB0aGlzLmNNYXAubG9va3VwKGdseXBoVW5pY29kZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNoYXJjb2RlICYmIHRoaXMudG9Vbmljb2RlKSB7CisgICAgICAgICAgY2hhcmNvZGUgPSB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGdseXBoVW5pY29kZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hhcmNvZGUgPD0gMCkgeworICAgICAgICAgIGNoYXJjb2RlID0gZ2x5cGhVbmljb2RlOworICAgICAgICB9CisKKyAgICAgICAgd2lkdGggPSB0aGlzLndpZHRoc1tjaGFyY29kZV07CisKKyAgICAgICAgaWYgKHdpZHRoKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgd2lkdGggPSB3aWR0aCB8fCB0aGlzLmRlZmF1bHRXaWR0aDsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAic3BhY2VXaWR0aCIsIHdpZHRoKTsKKyAgICB9LAorCisgICAgY2hhclRvR2x5cGg6IGZ1bmN0aW9uIEZvbnRfY2hhclRvR2x5cGgoY2hhcmNvZGUsIGlzU3BhY2UpIHsKKyAgICAgIHZhciBmb250Q2hhckNvZGUsIHdpZHRoLCBvcGVyYXRvckxpc3RJZDsKKyAgICAgIHZhciB3aWR0aENvZGUgPSBjaGFyY29kZTsKKworICAgICAgaWYgKHRoaXMuY01hcCAmJiB0aGlzLmNNYXAuY29udGFpbnMoY2hhcmNvZGUpKSB7CisgICAgICAgIHdpZHRoQ29kZSA9IHRoaXMuY01hcC5sb29rdXAoY2hhcmNvZGUpOworICAgICAgfQorCisgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW3dpZHRoQ29kZV07CisgICAgICB3aWR0aCA9ICgwLCBfdXRpbC5pc051bSkod2lkdGgpID8gd2lkdGggOiB0aGlzLmRlZmF1bHRXaWR0aDsKKyAgICAgIHZhciB2bWV0cmljID0gdGhpcy52bWV0cmljcyAmJiB0aGlzLnZtZXRyaWNzW3dpZHRoQ29kZV07CisgICAgICB2YXIgdW5pY29kZSA9IHRoaXMudG9Vbmljb2RlLmdldChjaGFyY29kZSkgfHwgdGhpcy5mYWxsYmFja1RvVW5pY29kZS5nZXQoY2hhcmNvZGUpIHx8IGNoYXJjb2RlOworCisgICAgICBpZiAodHlwZW9mIHVuaWNvZGUgPT09ICJudW1iZXIiKSB7CisgICAgICAgIHVuaWNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOworICAgICAgfQorCisgICAgICB2YXIgaXNJbkZvbnQgPSAoY2hhcmNvZGUgaW4gdGhpcy50b0ZvbnRDaGFyKTsKKyAgICAgIGZvbnRDaGFyQ29kZSA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gfHwgY2hhcmNvZGU7CisKKyAgICAgIGlmICh0aGlzLm1pc3NpbmdGaWxlKSB7CisgICAgICAgIHZhciBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJjb2RlXSB8fCB0aGlzLmRlZmF1bHRFbmNvZGluZ1tjaGFyY29kZV07CisKKyAgICAgICAgaWYgKChnbHlwaE5hbWUgPT09ICIubm90ZGVmIiB8fCBnbHlwaE5hbWUgPT09ICIiKSAmJiB0aGlzLnR5cGUgPT09ICJUeXBlMSIpIHsKKyAgICAgICAgICBmb250Q2hhckNvZGUgPSAweDIwOworICAgICAgICB9CisKKyAgICAgICAgZm9udENoYXJDb2RlID0gKDAsIF91bmljb2RlLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKShmb250Q2hhckNvZGUpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5pc1R5cGUzRm9udCkgeworICAgICAgICBvcGVyYXRvckxpc3RJZCA9IGZvbnRDaGFyQ29kZTsKKyAgICAgIH0KKworICAgICAgdmFyIGFjY2VudCA9IG51bGw7CisKKyAgICAgIGlmICh0aGlzLnNlYWNNYXAgJiYgdGhpcy5zZWFjTWFwW2NoYXJjb2RlXSkgeworICAgICAgICBpc0luRm9udCA9IHRydWU7CisgICAgICAgIHZhciBzZWFjID0gdGhpcy5zZWFjTWFwW2NoYXJjb2RlXTsKKyAgICAgICAgZm9udENoYXJDb2RlID0gc2VhYy5iYXNlRm9udENoYXJDb2RlOworICAgICAgICBhY2NlbnQgPSB7CisgICAgICAgICAgZm9udENoYXI6IFN0cmluZy5mcm9tQ29kZVBvaW50KHNlYWMuYWNjZW50Rm9udENoYXJDb2RlKSwKKyAgICAgICAgICBvZmZzZXQ6IHNlYWMuYWNjZW50T2Zmc2V0CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHZhciBmb250Q2hhciA9ICIiOworCisgICAgICBpZiAodHlwZW9mIGZvbnRDaGFyQ29kZSA9PT0gIm51bWJlciIpIHsKKyAgICAgICAgaWYgKGZvbnRDaGFyQ29kZSA8PSAweDEwZmZmZikgeworICAgICAgICAgIGZvbnRDaGFyID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoZm9udENoYXJDb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoImNoYXJUb0dseXBoIC0gaW52YWxpZCBmb250Q2hhckNvZGU6ICIuY29uY2F0KGZvbnRDaGFyQ29kZSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBnbHlwaCA9IHRoaXMuZ2x5cGhDYWNoZVtjaGFyY29kZV07CisKKyAgICAgIGlmICghZ2x5cGggfHwgIWdseXBoLm1hdGNoZXNGb3JDYWNoZShmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KSkgeworICAgICAgICBnbHlwaCA9IG5ldyBHbHlwaChmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KTsKKyAgICAgICAgdGhpcy5nbHlwaENhY2hlW2NoYXJjb2RlXSA9IGdseXBoOworICAgICAgfQorCisgICAgICByZXR1cm4gZ2x5cGg7CisgICAgfSwKKyAgICBjaGFyc1RvR2x5cGhzOiBmdW5jdGlvbiBGb250X2NoYXJzVG9HbHlwaHMoY2hhcnMpIHsKKyAgICAgIHZhciBjaGFyc0NhY2hlID0gdGhpcy5jaGFyc0NhY2hlOworICAgICAgdmFyIGdseXBocywgZ2x5cGgsIGNoYXJjb2RlOworCisgICAgICBpZiAoY2hhcnNDYWNoZSkgeworICAgICAgICBnbHlwaHMgPSBjaGFyc0NhY2hlW2NoYXJzXTsKKworICAgICAgICBpZiAoZ2x5cGhzKSB7CisgICAgICAgICAgcmV0dXJuIGdseXBoczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIWNoYXJzQ2FjaGUpIHsKKyAgICAgICAgY2hhcnNDYWNoZSA9IHRoaXMuY2hhcnNDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB9CisKKyAgICAgIGdseXBocyA9IFtdOworICAgICAgdmFyIGNoYXJzQ2FjaGVLZXkgPSBjaGFyczsKKyAgICAgIHZhciBpID0gMCwKKyAgICAgICAgICBpaTsKKworICAgICAgaWYgKHRoaXMuY01hcCkgeworICAgICAgICB2YXIgYyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgd2hpbGUgKGkgPCBjaGFycy5sZW5ndGgpIHsKKyAgICAgICAgICB0aGlzLmNNYXAucmVhZENoYXJDb2RlKGNoYXJzLCBpLCBjKTsKKyAgICAgICAgICBjaGFyY29kZSA9IGMuY2hhcmNvZGU7CisgICAgICAgICAgdmFyIGxlbmd0aCA9IGMubGVuZ3RoOworICAgICAgICAgIGkgKz0gbGVuZ3RoOworICAgICAgICAgIHZhciBpc1NwYWNlID0gbGVuZ3RoID09PSAxICYmIGNoYXJzLmNoYXJDb2RlQXQoaSAtIDEpID09PSAweDIwOworICAgICAgICAgIGdseXBoID0gdGhpcy5jaGFyVG9HbHlwaChjaGFyY29kZSwgaXNTcGFjZSk7CisgICAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgICBjaGFyY29kZSA9IGNoYXJzLmNoYXJDb2RlQXQoaSk7CisgICAgICAgICAgZ2x5cGggPSB0aGlzLmNoYXJUb0dseXBoKGNoYXJjb2RlLCBjaGFyY29kZSA9PT0gMHgyMCk7CisgICAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBjaGFyc0NhY2hlW2NoYXJzQ2FjaGVLZXldID0gZ2x5cGhzOworICAgIH0sCisKKyAgICBnZXQgZ2x5cGhDYWNoZVZhbHVlcygpIHsKKyAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZ2x5cGhDYWNoZSk7CisgICAgfQorCisgIH07CisgIHJldHVybiBGb250OworfSgpOworCitleHBvcnRzLkZvbnQgPSBGb250OworCit2YXIgRXJyb3JGb250ID0gZnVuY3Rpb24gRXJyb3JGb250Q2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gRXJyb3JGb250KGVycm9yKSB7CisgICAgdGhpcy5lcnJvciA9IGVycm9yOworICAgIHRoaXMubG9hZGVkTmFtZSA9ICJnX2ZvbnRfZXJyb3IiOworICAgIHRoaXMubWlzc2luZ0ZpbGUgPSB0cnVlOworICB9CisKKyAgRXJyb3JGb250LnByb3RvdHlwZSA9IHsKKyAgICBjaGFyc1RvR2x5cGhzOiBmdW5jdGlvbiBFcnJvckZvbnRfY2hhcnNUb0dseXBocygpIHsKKyAgICAgIHJldHVybiBbXTsKKyAgICB9LAorICAgIGV4cG9ydERhdGE6IGZ1bmN0aW9uIGV4cG9ydERhdGEoKSB7CisgICAgICB2YXIgZXh0cmFQcm9wZXJ0aWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIGVycm9yOiB0aGlzLmVycm9yCisgICAgICB9OworICAgIH0KKyAgfTsKKyAgcmV0dXJuIEVycm9yRm9udDsKK30oKTsKKworZXhwb3J0cy5FcnJvckZvbnQgPSBFcnJvckZvbnQ7CisKK2Z1bmN0aW9uIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpIHsKKyAgdmFyIGNoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgdmFyIGdseXBoSWQsIGNoYXJDb2RlLCBiYXNlRW5jb2Rpbmc7CisgIHZhciBpc1N5bWJvbGljRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBGb250RmxhZ3MuU3ltYm9saWMpOworCisgIGlmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpIHsKKyAgICBiYXNlRW5jb2RpbmcgPSAoMCwgX2VuY29kaW5ncy5nZXRFbmNvZGluZykocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lKTsKKworICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKKyAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoYmFzZUVuY29kaW5nW2NoYXJDb2RlXSk7CisKKyAgICAgIGlmIChnbHlwaElkID49IDApIHsKKyAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IDA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGlzU3ltYm9saWNGb250KSB7CisgICAgZm9yIChjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKKyAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV07CisgICAgfQorICB9IGVsc2UgeworICAgIGJhc2VFbmNvZGluZyA9IF9lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZzsKKworICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKKyAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoYmFzZUVuY29kaW5nW2NoYXJDb2RlXSk7CisKKyAgICAgIGlmIChnbHlwaElkID49IDApIHsKKyAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IDA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdmFyIGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlcywKKyAgICAgIGdseXBoc1VuaWNvZGVNYXA7CisKKyAgaWYgKGRpZmZlcmVuY2VzKSB7CisgICAgZm9yIChjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcykgeworICAgICAgdmFyIGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJDb2RlXTsKKyAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoZ2x5cGhOYW1lKTsKKworICAgICAgaWYgKGdseXBoSWQgPT09IC0xKSB7CisgICAgICAgIGlmICghZ2x5cGhzVW5pY29kZU1hcCkgeworICAgICAgICAgIGdseXBoc1VuaWNvZGVNYXAgPSAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0YW5kYXJkR2x5cGhOYW1lID0gcmVjb3ZlckdseXBoTmFtZShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOworCisgICAgICAgIGlmIChzdGFuZGFyZEdseXBoTmFtZSAhPT0gZ2x5cGhOYW1lKSB7CisgICAgICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihzdGFuZGFyZEdseXBoTmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGdseXBoSWQgPj0gMCkgeworICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7Cit9CisKK3ZhciBUeXBlMUZvbnQgPSBmdW5jdGlvbiBUeXBlMUZvbnRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBmaW5kQmxvY2soc3RyZWFtQnl0ZXMsIHNpZ25hdHVyZSwgc3RhcnRJbmRleCkgeworICAgIHZhciBzdHJlYW1CeXRlc0xlbmd0aCA9IHN0cmVhbUJ5dGVzLmxlbmd0aDsKKyAgICB2YXIgc2lnbmF0dXJlTGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aDsKKyAgICB2YXIgc2Nhbkxlbmd0aCA9IHN0cmVhbUJ5dGVzTGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOworICAgIHZhciBpID0gc3RhcnRJbmRleCwKKyAgICAgICAgaiwKKyAgICAgICAgZm91bmQgPSBmYWxzZTsKKworICAgIHdoaWxlIChpIDwgc2Nhbkxlbmd0aCkgeworICAgICAgaiA9IDA7CisKKyAgICAgIHdoaWxlIChqIDwgc2lnbmF0dXJlTGVuZ3RoICYmIHN0cmVhbUJ5dGVzW2kgKyBqXSA9PT0gc2lnbmF0dXJlW2pdKSB7CisgICAgICAgIGorKzsKKyAgICAgIH0KKworICAgICAgaWYgKGogPj0gc2lnbmF0dXJlTGVuZ3RoKSB7CisgICAgICAgIGkgKz0gajsKKworICAgICAgICB3aGlsZSAoaSA8IHN0cmVhbUJ5dGVzTGVuZ3RoICYmICgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKHN0cmVhbUJ5dGVzW2ldKSkgeworICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgZm91bmQ6IGZvdW5kLAorICAgICAgbGVuZ3RoOiBpCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldEhlYWRlckJsb2NrKHN0cmVhbSwgc3VnZ2VzdGVkTGVuZ3RoKSB7CisgICAgdmFyIEVFWEVDX1NJR05BVFVSRSA9IFsweDY1LCAweDY1LCAweDc4LCAweDY1LCAweDYzXTsKKyAgICB2YXIgc3RyZWFtU3RhcnRQb3MgPSBzdHJlYW0ucG9zOworICAgIHZhciBoZWFkZXJCeXRlcywgaGVhZGVyQnl0ZXNMZW5ndGgsIGJsb2NrOworCisgICAgdHJ5IHsKKyAgICAgIGhlYWRlckJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCk7CisgICAgICBoZWFkZXJCeXRlc0xlbmd0aCA9IGhlYWRlckJ5dGVzLmxlbmd0aDsKKyAgICB9IGNhdGNoIChleCkgeworICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgZXg7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhlYWRlckJ5dGVzTGVuZ3RoID09PSBzdWdnZXN0ZWRMZW5ndGgpIHsKKyAgICAgIGJsb2NrID0gZmluZEJsb2NrKGhlYWRlckJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIHN1Z2dlc3RlZExlbmd0aCAtIDIgKiBFRVhFQ19TSUdOQVRVUkUubGVuZ3RoKTsKKworICAgICAgaWYgKGJsb2NrLmZvdW5kICYmIGJsb2NrLmxlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgc3RyZWFtOiBuZXcgX3N0cmVhbS5TdHJlYW0oaGVhZGVyQnl0ZXMpLAorICAgICAgICAgIGxlbmd0aDogc3VnZ2VzdGVkTGVuZ3RoCisgICAgICAgIH07CisgICAgICB9CisgICAgfQorCisgICAgKDAsIF91dGlsLndhcm4pKCdJbnZhbGlkICJMZW5ndGgxIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHRyeWluZyB0byByZWNvdmVyLicpOworICAgIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsKKyAgICB2YXIgU0NBTl9CTE9DS19MRU5HVEggPSAyMDQ4OworICAgIHZhciBhY3R1YWxMZW5ndGg7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpOworICAgICAgYmxvY2sgPSBmaW5kQmxvY2soc2NhbkJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIDApOworCisgICAgICBpZiAoYmxvY2subGVuZ3RoID09PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBzdHJlYW0ucG9zICs9IGJsb2NrLmxlbmd0aDsKKworICAgICAgaWYgKGJsb2NrLmZvdW5kKSB7CisgICAgICAgIGFjdHVhbExlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdHJlYW1TdGFydFBvczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXJ0UG9zOworCisgICAgaWYgKGFjdHVhbExlbmd0aCkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgc3RyZWFtOiBuZXcgX3N0cmVhbS5TdHJlYW0oc3RyZWFtLmdldEJ5dGVzKGFjdHVhbExlbmd0aCkpLAorICAgICAgICBsZW5ndGg6IGFjdHVhbExlbmd0aAorICAgICAgfTsKKyAgICB9CisKKyAgICAoMCwgX3V0aWwud2FybikoJ1VuYWJsZSB0byByZWNvdmVyICJMZW5ndGgxIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHVzaW5nIGFzIGlzLicpOworICAgIHJldHVybiB7CisgICAgICBzdHJlYW06IG5ldyBfc3RyZWFtLlN0cmVhbShzdHJlYW0uZ2V0Qnl0ZXMoc3VnZ2VzdGVkTGVuZ3RoKSksCisgICAgICBsZW5ndGg6IHN1Z2dlc3RlZExlbmd0aAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBnZXRFZXhlY0Jsb2NrKHN0cmVhbSwgc3VnZ2VzdGVkTGVuZ3RoKSB7CisgICAgdmFyIGVleGVjQnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKKyAgICByZXR1cm4geworICAgICAgc3RyZWFtOiBuZXcgX3N0cmVhbS5TdHJlYW0oZWV4ZWNCeXRlcyksCisgICAgICBsZW5ndGg6IGVleGVjQnl0ZXMubGVuZ3RoCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFR5cGUxRm9udChuYW1lLCBmaWxlLCBwcm9wZXJ0aWVzKSB7CisgICAgdmFyIFBGQl9IRUFERVJfU0laRSA9IDY7CisgICAgdmFyIGhlYWRlckJsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgxOworICAgIHZhciBlZXhlY0Jsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgyOworICAgIHZhciBwZmJIZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyhQRkJfSEVBREVSX1NJWkUpOworICAgIHZhciBwZmJIZWFkZXJQcmVzZW50ID0gcGZiSGVhZGVyWzBdID09PSAweDgwICYmIHBmYkhlYWRlclsxXSA9PT0gMHgwMTsKKworICAgIGlmIChwZmJIZWFkZXJQcmVzZW50KSB7CisgICAgICBmaWxlLnNraXAoUEZCX0hFQURFUl9TSVpFKTsKKyAgICAgIGhlYWRlckJsb2NrTGVuZ3RoID0gcGZiSGVhZGVyWzVdIDw8IDI0IHwgcGZiSGVhZGVyWzRdIDw8IDE2IHwgcGZiSGVhZGVyWzNdIDw8IDggfCBwZmJIZWFkZXJbMl07CisgICAgfQorCisgICAgdmFyIGhlYWRlckJsb2NrID0gZ2V0SGVhZGVyQmxvY2soZmlsZSwgaGVhZGVyQmxvY2tMZW5ndGgpOworICAgIHZhciBoZWFkZXJCbG9ja1BhcnNlciA9IG5ldyBfdHlwZTFfcGFyc2VyLlR5cGUxUGFyc2VyKGhlYWRlckJsb2NrLnN0cmVhbSwgZmFsc2UsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgaGVhZGVyQmxvY2tQYXJzZXIuZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcyk7CisKKyAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkgeworICAgICAgcGZiSGVhZGVyID0gZmlsZS5nZXRCeXRlcyhQRkJfSEVBREVSX1NJWkUpOworICAgICAgZWV4ZWNCbG9ja0xlbmd0aCA9IHBmYkhlYWRlcls1XSA8PCAyNCB8IHBmYkhlYWRlcls0XSA8PCAxNiB8IHBmYkhlYWRlclszXSA8PCA4IHwgcGZiSGVhZGVyWzJdOworICAgIH0KKworICAgIHZhciBlZXhlY0Jsb2NrID0gZ2V0RWV4ZWNCbG9jayhmaWxlLCBlZXhlY0Jsb2NrTGVuZ3RoKTsKKyAgICB2YXIgZWV4ZWNCbG9ja1BhcnNlciA9IG5ldyBfdHlwZTFfcGFyc2VyLlR5cGUxUGFyc2VyKGVleGVjQmxvY2suc3RyZWFtLCB0cnVlLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOworICAgIHZhciBkYXRhID0gZWV4ZWNCbG9ja1BhcnNlci5leHRyYWN0Rm9udFByb2dyYW0ocHJvcGVydGllcyk7CisKKyAgICBmb3IgKHZhciBrZXkgaW4gZGF0YS5wcm9wZXJ0aWVzKSB7CisgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBkYXRhLnByb3BlcnRpZXNba2V5XTsKKyAgICB9CisKKyAgICB2YXIgY2hhcnN0cmluZ3MgPSBkYXRhLmNoYXJzdHJpbmdzOworICAgIHZhciB0eXBlMkNoYXJzdHJpbmdzID0gdGhpcy5nZXRUeXBlMkNoYXJzdHJpbmdzKGNoYXJzdHJpbmdzKTsKKyAgICB2YXIgc3VicnMgPSB0aGlzLmdldFR5cGUyU3VicnMoZGF0YS5zdWJycyk7CisgICAgdGhpcy5jaGFyc3RyaW5ncyA9IGNoYXJzdHJpbmdzOworICAgIHRoaXMuZGF0YSA9IHRoaXMud3JhcChuYW1lLCB0eXBlMkNoYXJzdHJpbmdzLCB0aGlzLmNoYXJzdHJpbmdzLCBzdWJycywgcHJvcGVydGllcyk7CisgICAgdGhpcy5zZWFjcyA9IHRoaXMuZ2V0U2VhY3MoZGF0YS5jaGFyc3RyaW5ncyk7CisgIH0KKworICBUeXBlMUZvbnQucHJvdG90eXBlID0geworICAgIGdldCBudW1HbHlwaHMoKSB7CisgICAgICByZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggKyAxOworICAgIH0sCisKKyAgICBnZXRDaGFyc2V0OiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0Q2hhcnNldCgpIHsKKyAgICAgIHZhciBjaGFyc2V0ID0gWyIubm90ZGVmIl07CisgICAgICB2YXIgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzOworCisgICAgICBmb3IgKHZhciBnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CisgICAgICAgIGNoYXJzZXQucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2hhcnNldDsKKyAgICB9LAorICAgIGdldEdseXBoTWFwcGluZzogZnVuY3Rpb24gVHlwZTFGb250X2dldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKSB7CisgICAgICB2YXIgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzOworCisgICAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKKyAgICAgICAgdmFyIGNoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgICBmb3IgKHZhciBfZ2x5cGhJZCA9IDAsIGNoYXJzdHJpbmdzTGVuID0gY2hhcnN0cmluZ3MubGVuZ3RoOyBfZ2x5cGhJZCA8IGNoYXJzdHJpbmdzTGVuOyBfZ2x5cGhJZCsrKSB7CisgICAgICAgICAgdmFyIF9jaGFyQ29kZTUgPSBwcm9wZXJ0aWVzLmNNYXAuY2hhckNvZGVPZihfZ2x5cGhJZCk7CisKKyAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtfY2hhckNvZGU1XSA9IF9nbHlwaElkICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKKyAgICAgIH0KKworICAgICAgdmFyIGdseXBoTmFtZXMgPSBbIi5ub3RkZWYiXSwKKyAgICAgICAgICBnbHlwaElkOworCisgICAgICBmb3IgKGdseXBoSWQgPSAwOyBnbHlwaElkIDwgY2hhcnN0cmluZ3MubGVuZ3RoOyBnbHlwaElkKyspIHsKKyAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKGNoYXJzdHJpbmdzW2dseXBoSWRdLmdseXBoTmFtZSk7CisgICAgICB9CisKKyAgICAgIHZhciBlbmNvZGluZyA9IHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nOworCisgICAgICBpZiAoZW5jb2RpbmcpIHsKKyAgICAgICAgdmFyIGJ1aWx0SW5FbmNvZGluZyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gZW5jb2RpbmcpIHsKKyAgICAgICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGVuY29kaW5nW2NoYXJDb2RlXSk7CisKKyAgICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CisgICAgICAgICAgICBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdID0gZ2x5cGhJZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpOworICAgIH0sCisgICAgaGFzR2x5cGhJZDogZnVuY3Rpb24gVHlwZTFGb250X2hhc0dseXBoSUQoaWQpIHsKKyAgICAgIGlmIChpZCA8IDAgfHwgaWQgPj0gdGhpcy5udW1HbHlwaHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoaWQgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHZhciBnbHlwaCA9IHRoaXMuY2hhcnN0cmluZ3NbaWQgLSAxXTsKKyAgICAgIHJldHVybiBnbHlwaC5jaGFyc3RyaW5nLmxlbmd0aCA+IDA7CisgICAgfSwKKyAgICBnZXRTZWFjczogZnVuY3Rpb24gVHlwZTFGb250X2dldFNlYWNzKGNoYXJzdHJpbmdzKSB7CisgICAgICB2YXIgaSwgaWk7CisgICAgICB2YXIgc2VhY01hcCA9IFtdOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGNoYXJzdHJpbmcgPSBjaGFyc3RyaW5nc1tpXTsKKworICAgICAgICBpZiAoY2hhcnN0cmluZy5zZWFjKSB7CisgICAgICAgICAgc2VhY01hcFtpICsgMV0gPSBjaGFyc3RyaW5nLnNlYWM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHNlYWNNYXA7CisgICAgfSwKKyAgICBnZXRUeXBlMkNoYXJzdHJpbmdzOiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0VHlwZTJDaGFyc3RyaW5ncyh0eXBlMUNoYXJzdHJpbmdzKSB7CisgICAgICB2YXIgdHlwZTJDaGFyc3RyaW5ncyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0eXBlMUNoYXJzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdHlwZTJDaGFyc3RyaW5ncy5wdXNoKHR5cGUxQ2hhcnN0cmluZ3NbaV0uY2hhcnN0cmluZyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0eXBlMkNoYXJzdHJpbmdzOworICAgIH0sCisgICAgZ2V0VHlwZTJTdWJyczogZnVuY3Rpb24gVHlwZTFGb250X2dldFR5cGUyU3VicnModHlwZTFTdWJycykgeworICAgICAgdmFyIGJpYXMgPSAwOworICAgICAgdmFyIGNvdW50ID0gdHlwZTFTdWJycy5sZW5ndGg7CisKKyAgICAgIGlmIChjb3VudCA8IDExMzMpIHsKKyAgICAgICAgYmlhcyA9IDEwNzsKKyAgICAgIH0gZWxzZSBpZiAoY291bnQgPCAzMzc2OSkgeworICAgICAgICBiaWFzID0gMTEzMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJpYXMgPSAzMjc2ODsKKyAgICAgIH0KKworICAgICAgdmFyIHR5cGUyU3VicnMgPSBbXTsKKyAgICAgIHZhciBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgYmlhczsgaSsrKSB7CisgICAgICAgIHR5cGUyU3VicnMucHVzaChbMHgwYl0pOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB0eXBlMlN1YnJzLnB1c2godHlwZTFTdWJyc1tpXSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0eXBlMlN1YnJzOworICAgIH0sCisgICAgd3JhcDogZnVuY3Rpb24gVHlwZTFGb250X3dyYXAobmFtZSwgZ2x5cGhzLCBjaGFyc3RyaW5ncywgc3VicnMsIHByb3BlcnRpZXMpIHsKKyAgICAgIHZhciBjZmYgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGKCk7CisgICAgICBjZmYuaGVhZGVyID0gbmV3IF9jZmZfcGFyc2VyLkNGRkhlYWRlcigxLCAwLCA0LCA0KTsKKyAgICAgIGNmZi5uYW1lcyA9IFtuYW1lXTsKKyAgICAgIHZhciB0b3BEaWN0ID0gbmV3IF9jZmZfcGFyc2VyLkNGRlRvcERpY3QoKTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJ2ZXJzaW9uIiwgMzkxKTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJOb3RpY2UiLCAzOTIpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIkZ1bGxOYW1lIiwgMzkzKTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGYW1pbHlOYW1lIiwgMzk0KTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJXZWlnaHQiLCAzOTUpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIkVuY29kaW5nIiwgbnVsbCk7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIHByb3BlcnRpZXMuZm9udE1hdHJpeCk7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRm9udEJCb3giLCBwcm9wZXJ0aWVzLmJib3gpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCBudWxsKTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIsIG51bGwpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIlByaXZhdGUiLCBudWxsKTsKKyAgICAgIGNmZi50b3BEaWN0ID0gdG9wRGljdDsKKyAgICAgIHZhciBzdHJpbmdzID0gbmV3IF9jZmZfcGFyc2VyLkNGRlN0cmluZ3MoKTsKKyAgICAgIHN0cmluZ3MuYWRkKCJWZXJzaW9uIDAuMTEiKTsKKyAgICAgIHN0cmluZ3MuYWRkKCJTZWUgb3JpZ2luYWwgbm90aWNlIik7CisgICAgICBzdHJpbmdzLmFkZChuYW1lKTsKKyAgICAgIHN0cmluZ3MuYWRkKG5hbWUpOworICAgICAgc3RyaW5ncy5hZGQoIk1lZGl1bSIpOworICAgICAgY2ZmLnN0cmluZ3MgPSBzdHJpbmdzOworICAgICAgY2ZmLmdsb2JhbFN1YnJJbmRleCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZJbmRleCgpOworICAgICAgdmFyIGNvdW50ID0gZ2x5cGhzLmxlbmd0aDsKKyAgICAgIHZhciBjaGFyc2V0QXJyYXkgPSBbIi5ub3RkZWYiXTsKKyAgICAgIHZhciBpLCBpaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdmFyIGdseXBoTmFtZSA9IGNoYXJzdHJpbmdzW2ldLmdseXBoTmFtZTsKKworICAgICAgICB2YXIgaW5kZXggPSBfY2ZmX3BhcnNlci5DRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihnbHlwaE5hbWUpOworCisgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsKKyAgICAgICAgICBzdHJpbmdzLmFkZChnbHlwaE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgY2hhcnNldEFycmF5LnB1c2goZ2x5cGhOYW1lKTsKKyAgICAgIH0KKworICAgICAgY2ZmLmNoYXJzZXQgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ2hhcnNldChmYWxzZSwgMCwgY2hhcnNldEFycmF5KTsKKyAgICAgIHZhciBjaGFyU3RyaW5nc0luZGV4ID0gbmV3IF9jZmZfcGFyc2VyLkNGRkluZGV4KCk7CisgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChbMHg4YiwgMHgwZV0pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaHNbaV0pOworICAgICAgfQorCisgICAgICBjZmYuY2hhclN0cmluZ3MgPSBjaGFyU3RyaW5nc0luZGV4OworICAgICAgdmFyIHByaXZhdGVEaWN0ID0gbmV3IF9jZmZfcGFyc2VyLkNGRlByaXZhdGVEaWN0KCk7CisgICAgICBwcml2YXRlRGljdC5zZXRCeU5hbWUoIlN1YnJzIiwgbnVsbCk7CisgICAgICB2YXIgZmllbGRzID0gWyJCbHVlVmFsdWVzIiwgIk90aGVyQmx1ZXMiLCAiRmFtaWx5Qmx1ZXMiLCAiRmFtaWx5T3RoZXJCbHVlcyIsICJTdGVtU25hcEgiLCAiU3RlbVNuYXBWIiwgIkJsdWVTaGlmdCIsICJCbHVlRnV6eiIsICJCbHVlU2NhbGUiLCAiTGFuZ3VhZ2VHcm91cCIsICJFeHBhbnNpb25GYWN0b3IiLCAiRm9yY2VCb2xkIiwgIlN0ZEhXIiwgIlN0ZFZXIl07CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZmllbGRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldOworCisgICAgICAgIGlmICghKGZpZWxkIGluIHByb3BlcnRpZXMucHJpdmF0ZURhdGEpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2ZpZWxkXTsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gdmFsdWUubGVuZ3RoIC0gMTsgaiA+IDA7IGotLSkgeworICAgICAgICAgICAgdmFsdWVbal0gLT0gdmFsdWVbaiAtIDFdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZShmaWVsZCwgdmFsdWUpOworICAgICAgfQorCisgICAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OworICAgICAgdmFyIHN1YnJJbmRleCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZJbmRleCgpOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHN1YnJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgc3VickluZGV4LmFkZChzdWJyc1tpXSk7CisgICAgICB9CisKKyAgICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJySW5kZXg7CisgICAgICB2YXIgY29tcGlsZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIoY2ZmKTsKKyAgICAgIHJldHVybiBjb21waWxlci5jb21waWxlKCk7CisgICAgfQorICB9OworICByZXR1cm4gVHlwZTFGb250OworfSgpOworCit2YXIgQ0ZGRm9udCA9IGZ1bmN0aW9uIENGRkZvbnRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBDRkZGb250KGZpbGUsIHByb3BlcnRpZXMpIHsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICAgIHZhciBwYXJzZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKGZpbGUsIHByb3BlcnRpZXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgdGhpcy5jZmYgPSBwYXJzZXIucGFyc2UoKTsKKyAgICB0aGlzLmNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7CisgICAgdmFyIGNvbXBpbGVyID0gbmV3IF9jZmZfcGFyc2VyLkNGRkNvbXBpbGVyKHRoaXMuY2ZmKTsKKyAgICB0aGlzLnNlYWNzID0gdGhpcy5jZmYuc2VhY3M7CisKKyAgICB0cnkgeworICAgICAgdGhpcy5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiICsgcHJvcGVydGllcy5sb2FkZWROYW1lKTsKKyAgICAgIHRoaXMuZGF0YSA9IGZpbGU7CisgICAgfQorICB9CisKKyAgQ0ZGRm9udC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IG51bUdseXBocygpIHsKKyAgICAgIHJldHVybiB0aGlzLmNmZi5jaGFyU3RyaW5ncy5jb3VudDsKKyAgICB9LAorCisgICAgZ2V0Q2hhcnNldDogZnVuY3Rpb24gQ0ZGRm9udF9nZXRDaGFyc2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuY2ZmLmNoYXJzZXQuY2hhcnNldDsKKyAgICB9LAorICAgIGdldEdseXBoTWFwcGluZzogZnVuY3Rpb24gQ0ZGRm9udF9nZXRHbHlwaE1hcHBpbmcoKSB7CisgICAgICB2YXIgY2ZmID0gdGhpcy5jZmY7CisgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKKyAgICAgIHZhciBjaGFyc2V0cyA9IGNmZi5jaGFyc2V0LmNoYXJzZXQ7CisgICAgICB2YXIgY2hhckNvZGVUb0dseXBoSWQ7CisgICAgICB2YXIgZ2x5cGhJZDsKKworICAgICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgdmFyIGNoYXJDb2RlOworCisgICAgICAgIGlmIChjZmYuaXNDSURGb250KSB7CisgICAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzZXRzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CisgICAgICAgICAgICB2YXIgY2lkID0gY2hhcnNldHNbZ2x5cGhJZF07CisgICAgICAgICAgICBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGNpZCk7CisgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGdseXBoSWQgPSAwOyBnbHlwaElkIDwgY2ZmLmNoYXJTdHJpbmdzLmNvdW50OyBnbHlwaElkKyspIHsKKyAgICAgICAgICAgIGNoYXJDb2RlID0gcHJvcGVydGllcy5jTWFwLmNoYXJDb2RlT2YoZ2x5cGhJZCk7CisgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKKyAgICAgIH0KKworICAgICAgdmFyIGVuY29kaW5nID0gY2ZmLmVuY29kaW5nID8gY2ZmLmVuY29kaW5nLmVuY29kaW5nIDogbnVsbDsKKyAgICAgIGNoYXJDb2RlVG9HbHlwaElkID0gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGVuY29kaW5nLCBjaGFyc2V0cyk7CisgICAgICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7CisgICAgfSwKKyAgICBoYXNHbHlwaElkOiBmdW5jdGlvbiBDRkZGb250X2hhc0dseXBoSUQoaWQpIHsKKyAgICAgIHJldHVybiB0aGlzLmNmZi5oYXNHbHlwaElkKGlkKTsKKyAgICB9CisgIH07CisgIHJldHVybiBDRkZGb250OworfSgpOworCisvKioqLyB9KSwKKy8qIDIyOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNGRkZEU2VsZWN0ID0gZXhwb3J0cy5DRkZDb21waWxlciA9IGV4cG9ydHMuQ0ZGUHJpdmF0ZURpY3QgPSBleHBvcnRzLkNGRlRvcERpY3QgPSBleHBvcnRzLkNGRkNoYXJzZXQgPSBleHBvcnRzLkNGRkluZGV4ID0gZXhwb3J0cy5DRkZTdHJpbmdzID0gZXhwb3J0cy5DRkZIZWFkZXIgPSBleHBvcnRzLkNGRiA9IGV4cG9ydHMuQ0ZGUGFyc2VyID0gZXhwb3J0cy5DRkZTdGFuZGFyZFN0cmluZ3MgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY2hhcnNldHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyOSk7CisKK3ZhciBfZW5jb2RpbmdzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMzApOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIE1BWF9TVUJSX05FU1RJTkcgPSAxMDsKK3ZhciBDRkZTdGFuZGFyZFN0cmluZ3MgPSBbIi5ub3RkZWYiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgInF1b3RlbGVmdCIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImZyYWN0aW9uIiwgInllbiIsICJmbG9yaW4iLCAic2VjdGlvbiIsICJjdXJyZW5jeSIsICJxdW90ZXNpbmdsZSIsICJxdW90ZWRibGxlZnQiLCAiZ3VpbGxlbW90bGVmdCIsICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwgImZsIiwgImVuZGFzaCIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInBhcmFncmFwaCIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInF1b3RlZGJscmlnaHQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCAicXVlc3Rpb25kb3duIiwgImdyYXZlIiwgImFjdXRlIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJkaWVyZXNpcyIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJjYXJvbiIsICJlbWRhc2giLCAiQUUiLCAib3JkZmVtaW5pbmUiLCAiTHNsYXNoIiwgIk9zbGFzaCIsICJPRSIsICJvcmRtYXNjdWxpbmUiLCAiYWUiLCAiZG90bGVzc2kiLCAibHNsYXNoIiwgIm9zbGFzaCIsICJvZSIsICJnZXJtYW5kYmxzIiwgIm9uZXN1cGVyaW9yIiwgImxvZ2ljYWxub3QiLCAibXUiLCAidHJhZGVtYXJrIiwgIkV0aCIsICJvbmVoYWxmIiwgInBsdXNtaW51cyIsICJUaG9ybiIsICJvbmVxdWFydGVyIiwgImRpdmlkZSIsICJicm9rZW5iYXIiLCAiZGVncmVlIiwgInRob3JuIiwgInRocmVlcXVhcnRlcnMiLCAidHdvc3VwZXJpb3IiLCAicmVnaXN0ZXJlZCIsICJtaW51cyIsICJldGgiLCAibXVsdGlwbHkiLCAidGhyZWVzdXBlcmlvciIsICJjb3B5cmlnaHQiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkFkaWVyZXNpcyIsICJBZ3JhdmUiLCAiQXJpbmciLCAiQXRpbGRlIiwgIkNjZWRpbGxhIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiRWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiSWdyYXZlIiwgIk50aWxkZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiT2RpZXJlc2lzIiwgIk9ncmF2ZSIsICJPdGlsZGUiLCAiU2Nhcm9uIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZGllcmVzaXMiLCAiVWdyYXZlIiwgIllhY3V0ZSIsICJZZGllcmVzaXMiLCAiWmNhcm9uIiwgImFhY3V0ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYWdyYXZlIiwgImFyaW5nIiwgImF0aWxkZSIsICJjY2VkaWxsYSIsICJlYWN1dGUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImVncmF2ZSIsICJpYWN1dGUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgImlncmF2ZSIsICJudGlsZGUiLCAib2FjdXRlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvZ3JhdmUiLCAib3RpbGRlIiwgInNjYXJvbiIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInVncmF2ZSIsICJ5YWN1dGUiLCAieWRpZXJlc2lzIiwgInpjYXJvbiIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgInF1ZXN0aW9uc21hbGwiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICJpc3VwZXJpb3IiLCAibHN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJuc3VwZXJpb3IiLCAib3N1cGVyaW9yIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgImZmIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsICJEaWVyZXNpc3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiQ2Fyb25zbWFsbCIsICJEb3RhY2NlbnRzbWFsbCIsICJNYWNyb25zbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIiwgIkFncmF2ZXNtYWxsIiwgIkFhY3V0ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXJpbmdzbWFsbCIsICJBRXNtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIkV0aHNtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT3RpbGRlc21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT0VzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJVZ3JhdmVzbWFsbCIsICJVYWN1dGVzbWFsbCIsICJVY2lyY3VtZmxleHNtYWxsIiwgIlVkaWVyZXNpc3NtYWxsIiwgIllhY3V0ZXNtYWxsIiwgIlRob3Juc21hbGwiLCAiWWRpZXJlc2lzc21hbGwiLCAiMDAxLjAwMCIsICIwMDEuMDAxIiwgIjAwMS4wMDIiLCAiMDAxLjAwMyIsICJCbGFjayIsICJCb2xkIiwgIkJvb2siLCAiTGlnaHQiLCAiTWVkaXVtIiwgIlJlZ3VsYXIiLCAiUm9tYW4iLCAiU2VtaWJvbGQiXTsKK2V4cG9ydHMuQ0ZGU3RhbmRhcmRTdHJpbmdzID0gQ0ZGU3RhbmRhcmRTdHJpbmdzOwordmFyIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA9IDM5MTsKKwordmFyIENGRlBhcnNlciA9IGZ1bmN0aW9uIENGRlBhcnNlckNsb3N1cmUoKSB7CisgIHZhciBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGEgPSBbbnVsbCwgeworICAgIGlkOiAiaHN0ZW0iLAorICAgIG1pbjogMiwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlLAorICAgIHN0ZW06IHRydWUKKyAgfSwgbnVsbCwgeworICAgIGlkOiAidnN0ZW0iLAorICAgIG1pbjogMiwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlLAorICAgIHN0ZW06IHRydWUKKyAgfSwgeworICAgIGlkOiAidm1vdmV0byIsCisgICAgbWluOiAxLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUKKyAgfSwgeworICAgIGlkOiAicmxpbmV0byIsCisgICAgbWluOiAyLAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAiaGxpbmV0byIsCisgICAgbWluOiAxLAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAidmxpbmV0byIsCisgICAgbWluOiAxLAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAicnJjdXJ2ZXRvIiwKKyAgICBtaW46IDYsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCBudWxsLCB7CisgICAgaWQ6ICJjYWxsc3ViciIsCisgICAgbWluOiAxLAorICAgIHVuZGVmU3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAicmV0dXJuIiwKKyAgICBtaW46IDAsCisgICAgdW5kZWZTdGFjazogdHJ1ZQorICB9LCBudWxsLCBudWxsLCB7CisgICAgaWQ6ICJlbmRjaGFyIiwKKyAgICBtaW46IDAsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZQorICB9LCBudWxsLCBudWxsLCBudWxsLCB7CisgICAgaWQ6ICJoc3RlbWhtIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKKyAgICBzdGVtOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImhpbnRtYXNrIiwKKyAgICBtaW46IDAsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJjbnRybWFzayIsCisgICAgbWluOiAwLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUKKyAgfSwgeworICAgIGlkOiAicm1vdmV0byIsCisgICAgbWluOiAyLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUKKyAgfSwgeworICAgIGlkOiAiaG1vdmV0byIsCisgICAgbWluOiAxLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUKKyAgfSwgeworICAgIGlkOiAidnN0ZW1obSIsCisgICAgbWluOiAyLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUsCisgICAgc3RlbTogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJyY3VydmVsaW5lIiwKKyAgICBtaW46IDgsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJybGluZWN1cnZlIiwKKyAgICBtaW46IDgsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJ2dmN1cnZldG8iLAorICAgIG1pbjogNCwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImhoY3VydmV0byIsCisgICAgbWluOiA0LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgbnVsbCwgeworICAgIGlkOiAiY2FsbGdzdWJyIiwKKyAgICBtaW46IDEsCisgICAgdW5kZWZTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJ2aGN1cnZldG8iLAorICAgIG1pbjogNCwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImh2Y3VydmV0byIsCisgICAgbWluOiA0LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfV07CisgIHZhciBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGExMiA9IFtudWxsLCBudWxsLCBudWxsLCB7CisgICAgaWQ6ICJhbmQiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAtMQorICB9LCB7CisgICAgaWQ6ICJvciIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IC0xCisgIH0sIHsKKyAgICBpZDogIm5vdCIsCisgICAgbWluOiAxLAorICAgIHN0YWNrRGVsdGE6IDAKKyAgfSwgbnVsbCwgbnVsbCwgbnVsbCwgeworICAgIGlkOiAiYWJzIiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tEZWx0YTogMAorICB9LCB7CisgICAgaWQ6ICJhZGQiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAtMSwKKyAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7CisgICAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSArIHN0YWNrW2luZGV4IC0gMV07CisgICAgfQorICB9LCB7CisgICAgaWQ6ICJzdWIiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAtMSwKKyAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7CisgICAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAtIHN0YWNrW2luZGV4IC0gMV07CisgICAgfQorICB9LCB7CisgICAgaWQ6ICJkaXYiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAtMSwKKyAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7CisgICAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAvIHN0YWNrW2luZGV4IC0gMV07CisgICAgfQorICB9LCBudWxsLCB7CisgICAgaWQ6ICJuZWciLAorICAgIG1pbjogMSwKKyAgICBzdGFja0RlbHRhOiAwLAorICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHsKKyAgICAgIHN0YWNrW2luZGV4IC0gMV0gPSAtc3RhY2tbaW5kZXggLSAxXTsKKyAgICB9CisgIH0sIHsKKyAgICBpZDogImVxIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogLTEKKyAgfSwgbnVsbCwgbnVsbCwgeworICAgIGlkOiAiZHJvcCIsCisgICAgbWluOiAxLAorICAgIHN0YWNrRGVsdGE6IC0xCisgIH0sIG51bGwsIHsKKyAgICBpZDogInB1dCIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IC0yCisgIH0sIHsKKyAgICBpZDogImdldCIsCisgICAgbWluOiAxLAorICAgIHN0YWNrRGVsdGE6IDAKKyAgfSwgeworICAgIGlkOiAiaWZlbHNlIiwKKyAgICBtaW46IDQsCisgICAgc3RhY2tEZWx0YTogLTMKKyAgfSwgeworICAgIGlkOiAicmFuZG9tIiwKKyAgICBtaW46IDAsCisgICAgc3RhY2tEZWx0YTogMQorICB9LCB7CisgICAgaWQ6ICJtdWwiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAtMSwKKyAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7CisgICAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAqIHN0YWNrW2luZGV4IC0gMV07CisgICAgfQorICB9LCBudWxsLCB7CisgICAgaWQ6ICJzcXJ0IiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tEZWx0YTogMAorICB9LCB7CisgICAgaWQ6ICJkdXAiLAorICAgIG1pbjogMSwKKyAgICBzdGFja0RlbHRhOiAxCisgIH0sIHsKKyAgICBpZDogImV4Y2giLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAwCisgIH0sIHsKKyAgICBpZDogImluZGV4IiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogMAorICB9LCB7CisgICAgaWQ6ICJyb2xsIiwKKyAgICBtaW46IDMsCisgICAgc3RhY2tEZWx0YTogLTIKKyAgfSwgbnVsbCwgbnVsbCwgbnVsbCwgeworICAgIGlkOiAiaGZsZXgiLAorICAgIG1pbjogNywKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImZsZXgiLAorICAgIG1pbjogMTMsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJoZmxleDEiLAorICAgIG1pbjogOSwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImZsZXgxIiwKKyAgICBtaW46IDExLAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfV07CisKKyAgdmFyIENGRlBhcnNlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgICAgZnVuY3Rpb24gQ0ZGUGFyc2VyKGZpbGUsIHByb3BlcnRpZXMsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKKyAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDRkZQYXJzZXIpOworCisgICAgICB0aGlzLmJ5dGVzID0gZmlsZS5nZXRCeXRlcygpOworICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKyAgICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDsKKyAgICB9CisKKyAgICBfY3JlYXRlQ2xhc3MoQ0ZGUGFyc2VyLCBbeworICAgICAga2V5OiAicGFyc2UiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlKCkgeworICAgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKKyAgICAgICAgdmFyIGNmZiA9IG5ldyBDRkYoKTsKKyAgICAgICAgdGhpcy5jZmYgPSBjZmY7CisgICAgICAgIHZhciBoZWFkZXIgPSB0aGlzLnBhcnNlSGVhZGVyKCk7CisgICAgICAgIHZhciBuYW1lSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoaGVhZGVyLmVuZFBvcyk7CisgICAgICAgIHZhciB0b3BEaWN0SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgobmFtZUluZGV4LmVuZFBvcyk7CisgICAgICAgIHZhciBzdHJpbmdJbmRleCA9IHRoaXMucGFyc2VJbmRleCh0b3BEaWN0SW5kZXguZW5kUG9zKTsKKyAgICAgICAgdmFyIGdsb2JhbFN1YnJJbmRleCA9IHRoaXMucGFyc2VJbmRleChzdHJpbmdJbmRleC5lbmRQb3MpOworICAgICAgICB2YXIgdG9wRGljdFBhcnNlZCA9IHRoaXMucGFyc2VEaWN0KHRvcERpY3RJbmRleC5vYmouZ2V0KDApKTsKKyAgICAgICAgdmFyIHRvcERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdG9wRGljdFBhcnNlZCwgY2ZmLnN0cmluZ3MpOworICAgICAgICBjZmYuaGVhZGVyID0gaGVhZGVyLm9iajsKKyAgICAgICAgY2ZmLm5hbWVzID0gdGhpcy5wYXJzZU5hbWVJbmRleChuYW1lSW5kZXgub2JqKTsKKyAgICAgICAgY2ZmLnN0cmluZ3MgPSB0aGlzLnBhcnNlU3RyaW5nSW5kZXgoc3RyaW5nSW5kZXgub2JqKTsKKyAgICAgICAgY2ZmLnRvcERpY3QgPSB0b3BEaWN0OworICAgICAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gZ2xvYmFsU3VickluZGV4Lm9iajsKKyAgICAgICAgdGhpcy5wYXJzZVByaXZhdGVEaWN0KGNmZi50b3BEaWN0KTsKKyAgICAgICAgY2ZmLmlzQ0lERm9udCA9IHRvcERpY3QuaGFzTmFtZSgiUk9TIik7CisgICAgICAgIHZhciBjaGFyU3RyaW5nT2Zmc2V0ID0gdG9wRGljdC5nZXRCeU5hbWUoIkNoYXJTdHJpbmdzIik7CisgICAgICAgIHZhciBjaGFyU3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoY2hhclN0cmluZ09mZnNldCkub2JqOworICAgICAgICB2YXIgZm9udE1hdHJpeCA9IHRvcERpY3QuZ2V0QnlOYW1lKCJGb250TWF0cml4Iik7CisKKyAgICAgICAgaWYgKGZvbnRNYXRyaXgpIHsKKyAgICAgICAgICBwcm9wZXJ0aWVzLmZvbnRNYXRyaXggPSBmb250TWF0cml4OworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZvbnRCQm94ID0gdG9wRGljdC5nZXRCeU5hbWUoIkZvbnRCQm94Iik7CisKKyAgICAgICAgaWYgKGZvbnRCQm94KSB7CisgICAgICAgICAgcHJvcGVydGllcy5hc2NlbnQgPSBNYXRoLm1heChmb250QkJveFszXSwgZm9udEJCb3hbMV0pOworICAgICAgICAgIHByb3BlcnRpZXMuZGVzY2VudCA9IE1hdGgubWluKGZvbnRCQm94WzFdLCBmb250QkJveFszXSk7CisgICAgICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNoYXJzZXQsIGVuY29kaW5nOworCisgICAgICAgIGlmIChjZmYuaXNDSURGb250KSB7CisgICAgICAgICAgdmFyIGZkQXJyYXlJbmRleCA9IHRoaXMucGFyc2VJbmRleCh0b3BEaWN0LmdldEJ5TmFtZSgiRkRBcnJheSIpKS5vYmo7CisKKyAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmZEFycmF5SW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgICB2YXIgZGljdFJhdyA9IGZkQXJyYXlJbmRleC5nZXQoaSk7CisgICAgICAgICAgICB2YXIgZm9udERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdGhpcy5wYXJzZURpY3QoZGljdFJhdyksIGNmZi5zdHJpbmdzKTsKKyAgICAgICAgICAgIHRoaXMucGFyc2VQcml2YXRlRGljdChmb250RGljdCk7CisgICAgICAgICAgICBjZmYuZmRBcnJheS5wdXNoKGZvbnREaWN0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbmNvZGluZyA9IG51bGw7CisgICAgICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCB0cnVlKTsKKyAgICAgICAgICBjZmYuZmRTZWxlY3QgPSB0aGlzLnBhcnNlRkRTZWxlY3QodG9wRGljdC5nZXRCeU5hbWUoIkZEU2VsZWN0IiksIGNoYXJTdHJpbmdJbmRleC5jb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCBmYWxzZSk7CisgICAgICAgICAgZW5jb2RpbmcgPSB0aGlzLnBhcnNlRW5jb2RpbmcodG9wRGljdC5nZXRCeU5hbWUoIkVuY29kaW5nIiksIHByb3BlcnRpZXMsIGNmZi5zdHJpbmdzLCBjaGFyc2V0LmNoYXJzZXQpOworICAgICAgICB9CisKKyAgICAgICAgY2ZmLmNoYXJzZXQgPSBjaGFyc2V0OworICAgICAgICBjZmYuZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgdmFyIGNoYXJTdHJpbmdzQW5kU2VhY3MgPSB0aGlzLnBhcnNlQ2hhclN0cmluZ3MoeworICAgICAgICAgIGNoYXJTdHJpbmdzOiBjaGFyU3RyaW5nSW5kZXgsCisgICAgICAgICAgbG9jYWxTdWJySW5kZXg6IHRvcERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleCwKKyAgICAgICAgICBnbG9iYWxTdWJySW5kZXg6IGdsb2JhbFN1YnJJbmRleC5vYmosCisgICAgICAgICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCwKKyAgICAgICAgICBmZEFycmF5OiBjZmYuZmRBcnJheSwKKyAgICAgICAgICBwcml2YXRlRGljdDogdG9wRGljdC5wcml2YXRlRGljdAorICAgICAgICB9KTsKKyAgICAgICAgY2ZmLmNoYXJTdHJpbmdzID0gY2hhclN0cmluZ3NBbmRTZWFjcy5jaGFyU3RyaW5nczsKKyAgICAgICAgY2ZmLnNlYWNzID0gY2hhclN0cmluZ3NBbmRTZWFjcy5zZWFjczsKKyAgICAgICAgY2ZmLndpZHRocyA9IGNoYXJTdHJpbmdzQW5kU2VhY3Mud2lkdGhzOworICAgICAgICByZXR1cm4gY2ZmOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInBhcnNlSGVhZGVyIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUhlYWRlcigpIHsKKyAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlczsKKyAgICAgICAgdmFyIGJ5dGVzTGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgICAgICB2YXIgb2Zmc2V0ID0gMDsKKworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgYnl0ZXNMZW5ndGggJiYgYnl0ZXNbb2Zmc2V0XSAhPT0gMSkgeworICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCA+PSBieXRlc0xlbmd0aCkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBDRkYgaGVhZGVyIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob2Zmc2V0ICE9PSAwKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJjZmYgZGF0YSBpcyBzaGlmdGVkIik7CisgICAgICAgICAgYnl0ZXMgPSBieXRlcy5zdWJhcnJheShvZmZzZXQpOworICAgICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBtYWpvciA9IGJ5dGVzWzBdOworICAgICAgICB2YXIgbWlub3IgPSBieXRlc1sxXTsKKyAgICAgICAgdmFyIGhkclNpemUgPSBieXRlc1syXTsKKyAgICAgICAgdmFyIG9mZlNpemUgPSBieXRlc1szXTsKKyAgICAgICAgdmFyIGhlYWRlciA9IG5ldyBDRkZIZWFkZXIobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKTsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBvYmo6IGhlYWRlciwKKyAgICAgICAgICBlbmRQb3M6IGhkclNpemUKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJwYXJzZURpY3QiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlRGljdChkaWN0KSB7CisgICAgICAgIHZhciBwb3MgPSAwOworCisgICAgICAgIGZ1bmN0aW9uIHBhcnNlT3BlcmFuZCgpIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBkaWN0W3BvcysrXTsKKworICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMzApIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0T3BlcmFuZCgpOworICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7CisgICAgICAgICAgICB2YWx1ZSA9IGRpY3RbcG9zKytdOworICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgMjQgfCBkaWN0W3BvcysrXSA8PCAxNikgPj4gMTY7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMjkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gZGljdFtwb3MrK107CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPDwgOCB8IGRpY3RbcG9zKytdOworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA4IHwgZGljdFtwb3MrK107CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAzMiAmJiB2YWx1ZSA8PSAyNDYpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSAtIDEzOTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTApIHsKKyAgICAgICAgICAgIHJldHVybiAodmFsdWUgLSAyNDcpICogMjU2ICsgZGljdFtwb3MrK10gKyAxMDg7CisgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNTEgJiYgdmFsdWUgPD0gMjU0KSB7CisgICAgICAgICAgICByZXR1cm4gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGRpY3RbcG9zKytdIC0gMTA4OworICAgICAgICAgIH0KKworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgnQ0ZGUGFyc2VyX3BhcnNlRGljdDogIicgKyB2YWx1ZSArICciIGlzIGEgcmVzZXJ2ZWQgY29tbWFuZC4nKTsKKyAgICAgICAgICByZXR1cm4gTmFOOworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gcGFyc2VGbG9hdE9wZXJhbmQoKSB7CisgICAgICAgICAgdmFyIHN0ciA9ICIiOworICAgICAgICAgIHZhciBlb2YgPSAxNTsKKyAgICAgICAgICB2YXIgbG9va3VwID0gWyIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIi4iLCAiRSIsICJFLSIsIG51bGwsICItIl07CisgICAgICAgICAgdmFyIGxlbmd0aCA9IGRpY3QubGVuZ3RoOworCisgICAgICAgICAgd2hpbGUgKHBvcyA8IGxlbmd0aCkgeworICAgICAgICAgICAgdmFyIGIgPSBkaWN0W3BvcysrXTsKKyAgICAgICAgICAgIHZhciBiMSA9IGIgPj4gNDsKKyAgICAgICAgICAgIHZhciBiMiA9IGIgJiAxNTsKKworICAgICAgICAgICAgaWYgKGIxID09PSBlb2YpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ciArPSBsb29rdXBbYjFdOworCisgICAgICAgICAgICBpZiAoYjIgPT09IGVvZikgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyICs9IGxvb2t1cFtiMl07CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBvcGVyYW5kcyA9IFtdOworICAgICAgICB2YXIgZW50cmllcyA9IFtdOworICAgICAgICBwb3MgPSAwOworICAgICAgICB2YXIgZW5kID0gZGljdC5sZW5ndGg7CisKKyAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCkgeworICAgICAgICAgIHZhciBiID0gZGljdFtwb3NdOworCisgICAgICAgICAgaWYgKGIgPD0gMjEpIHsKKyAgICAgICAgICAgIGlmIChiID09PSAxMikgeworICAgICAgICAgICAgICBiID0gYiA8PCA4IHwgZGljdFsrK3Bvc107CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJpZXMucHVzaChbYiwgb3BlcmFuZHNdKTsKKyAgICAgICAgICAgIG9wZXJhbmRzID0gW107CisgICAgICAgICAgICArK3BvczsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3BlcmFuZHMucHVzaChwYXJzZU9wZXJhbmQoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAicGFyc2VJbmRleCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VJbmRleChwb3MpIHsKKyAgICAgICAgdmFyIGNmZkluZGV4ID0gbmV3IENGRkluZGV4KCk7CisgICAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7CisgICAgICAgIHZhciBjb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOworICAgICAgICB2YXIgb2Zmc2V0cyA9IFtdOworICAgICAgICB2YXIgZW5kID0gcG9zOworICAgICAgICB2YXIgaSwgaWk7CisKKyAgICAgICAgaWYgKGNvdW50ICE9PSAwKSB7CisgICAgICAgICAgdmFyIG9mZnNldFNpemUgPSBieXRlc1twb3MrK107CisgICAgICAgICAgdmFyIHN0YXJ0UG9zID0gcG9zICsgKGNvdW50ICsgMSkgKiBvZmZzZXRTaXplIC0gMTsKKworICAgICAgICAgIGZvciAoaSA9IDAsIGlpID0gY291bnQgKyAxOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CisKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2Zmc2V0U2l6ZTsgKytqKSB7CisgICAgICAgICAgICAgIG9mZnNldCA8PD0gODsKKyAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKHN0YXJ0UG9zICsgb2Zmc2V0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbmQgPSBvZmZzZXRzW2NvdW50XTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gb2Zmc2V0cy5sZW5ndGggLSAxOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIHZhciBvZmZzZXRTdGFydCA9IG9mZnNldHNbaV07CisgICAgICAgICAgdmFyIG9mZnNldEVuZCA9IG9mZnNldHNbaSArIDFdOworICAgICAgICAgIGNmZkluZGV4LmFkZChieXRlcy5zdWJhcnJheShvZmZzZXRTdGFydCwgb2Zmc2V0RW5kKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgIG9iajogY2ZmSW5kZXgsCisgICAgICAgICAgZW5kUG9zOiBlbmQKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJwYXJzZU5hbWVJbmRleCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VOYW1lSW5kZXgoaW5kZXgpIHsKKyAgICAgICAgdmFyIG5hbWVzID0gW107CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgdmFyIG5hbWUgPSBpbmRleC5nZXQoaSk7CisgICAgICAgICAgbmFtZXMucHVzaCgoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykobmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWVzOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogInBhcnNlU3RyaW5nSW5kZXgiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlU3RyaW5nSW5kZXgoaW5kZXgpIHsKKyAgICAgICAgdmFyIHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGluZGV4LmNvdW50OyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIHZhciBkYXRhID0gaW5kZXguZ2V0KGkpOworICAgICAgICAgIHN0cmluZ3MuYWRkKCgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShkYXRhKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RyaW5nczsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJjcmVhdGVEaWN0IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVEaWN0KFR5cGUsIGRpY3QsIHN0cmluZ3MpIHsKKyAgICAgICAgdmFyIGNmZkRpY3QgPSBuZXcgVHlwZShzdHJpbmdzKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkaWN0Lmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgICB2YXIgcGFpciA9IGRpY3RbaV07CisgICAgICAgICAgdmFyIGtleSA9IHBhaXJbMF07CisgICAgICAgICAgdmFyIHZhbHVlID0gcGFpclsxXTsKKyAgICAgICAgICBjZmZEaWN0LnNldEJ5S2V5KGtleSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNmZkRpY3Q7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAicGFyc2VDaGFyU3RyaW5nIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUNoYXJTdHJpbmcoc3RhdGUsIGRhdGEsIGxvY2FsU3VickluZGV4LCBnbG9iYWxTdWJySW5kZXgpIHsKKyAgICAgICAgaWYgKCFkYXRhIHx8IHN0YXRlLmNhbGxEZXB0aCA+IE1BWF9TVUJSX05FU1RJTkcpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplOworICAgICAgICB2YXIgc3RhY2sgPSBzdGF0ZS5zdGFjazsKKyAgICAgICAgdmFyIGxlbmd0aCA9IGRhdGEubGVuZ3RoOworCisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuZ3RoOykgeworICAgICAgICAgIHZhciB2YWx1ZSA9IGRhdGFbaisrXTsKKyAgICAgICAgICB2YXIgdmFsaWRhdGlvbkNvbW1hbmQgPSBudWxsOworCisgICAgICAgICAgaWYgKHZhbHVlID09PSAxMikgeworICAgICAgICAgICAgdmFyIHEgPSBkYXRhW2orK107CisKKyAgICAgICAgICAgIGlmIChxID09PSAwKSB7CisgICAgICAgICAgICAgIGRhdGFbaiAtIDJdID0gMTM5OworICAgICAgICAgICAgICBkYXRhW2ogLSAxXSA9IDIyOworICAgICAgICAgICAgICBzdGFja1NpemUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGExMltxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOCkgeworICAgICAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9IChkYXRhW2pdIDw8IDI0IHwgZGF0YVtqICsgMV0gPDwgMTYpID4+IDE2OworICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgc3RhY2tTaXplKys7CisgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTQpIHsKKyAgICAgICAgICAgIGlmIChzdGFja1NpemUgPj0gNCkgeworICAgICAgICAgICAgICBzdGFja1NpemUgLT0gNDsKKworICAgICAgICAgICAgICBpZiAodGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc3RhdGUuc2VhYyA9IHN0YWNrLnNsaWNlKHN0YWNrU2l6ZSwgc3RhY2tTaXplICsgNCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDMyICYmIHZhbHVlIDw9IDI0NikgeworICAgICAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9IHZhbHVlIC0gMTM5OworICAgICAgICAgICAgc3RhY2tTaXplKys7CisgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNDcgJiYgdmFsdWUgPD0gMjU0KSB7CisgICAgICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgPCAyNTEgPyAodmFsdWUgLSAyNDcgPDwgOCkgKyBkYXRhW2pdICsgMTA4IDogLSh2YWx1ZSAtIDI1MSA8PCA4KSAtIGRhdGFbal0gLSAxMDg7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBzdGFja1NpemUrKzsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyNTUpIHsKKyAgICAgICAgICAgIHN0YWNrW3N0YWNrU2l6ZV0gPSAoZGF0YVtqXSA8PCAyNCB8IGRhdGFbaiArIDFdIDw8IDE2IHwgZGF0YVtqICsgMl0gPDwgOCB8IGRhdGFbaiArIDNdKSAvIDY1NTM2OworICAgICAgICAgICAgaiArPSA0OworICAgICAgICAgICAgc3RhY2tTaXplKys7CisgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTkgfHwgdmFsdWUgPT09IDIwKSB7CisgICAgICAgICAgICBzdGF0ZS5oaW50cyArPSBzdGFja1NpemUgPj4gMTsKKyAgICAgICAgICAgIGogKz0gc3RhdGUuaGludHMgKyA3ID4+IDM7CisgICAgICAgICAgICBzdGFja1NpemUgJT0gMjsKKyAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMCB8fCB2YWx1ZSA9PT0gMjkpIHsKKyAgICAgICAgICAgIHZhciBzdWJyc0luZGV4OworCisgICAgICAgICAgICBpZiAodmFsdWUgPT09IDEwKSB7CisgICAgICAgICAgICAgIHN1YnJzSW5kZXggPSBsb2NhbFN1YnJJbmRleDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN1YnJzSW5kZXggPSBnbG9iYWxTdWJySW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc3VicnNJbmRleCkgeworICAgICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTWlzc2luZyBzdWJyc0luZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBiaWFzID0gMzI3Njg7CisKKyAgICAgICAgICAgIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMTI0MCkgeworICAgICAgICAgICAgICBiaWFzID0gMTA3OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMzM5MDApIHsKKyAgICAgICAgICAgICAgYmlhcyA9IDExMzE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzdWJyTnVtYmVyID0gc3RhY2tbLS1zdGFja1NpemVdICsgYmlhczsKKworICAgICAgICAgICAgaWYgKHN1YnJOdW1iZXIgPCAwIHx8IHN1YnJOdW1iZXIgPj0gc3VicnNJbmRleC5jb3VudCB8fCBpc05hTihzdWJyTnVtYmVyKSkgeworICAgICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiT3V0IG9mIGJvdW5kcyBzdWJySW5kZXggZm9yICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5pZCk7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplOworICAgICAgICAgICAgc3RhdGUuY2FsbERlcHRoKys7CisgICAgICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgc3VicnNJbmRleC5nZXQoc3Vick51bWJlciksIGxvY2FsU3VickluZGV4LCBnbG9iYWxTdWJySW5kZXgpOworCisgICAgICAgICAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUuY2FsbERlcHRoLS07CisgICAgICAgICAgICBzdGFja1NpemUgPSBzdGF0ZS5zdGFja1NpemU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMSkgeworICAgICAgICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQpIHsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uQ29tbWFuZC5zdGVtKSB7CisgICAgICAgICAgICAgIHN0YXRlLmhpbnRzICs9IHN0YWNrU2l6ZSA+PiAxOworCisgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMyB8fCB2YWx1ZSA9PT0gMjMpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5oYXNWU3RlbXMgPSB0cnVlOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhhc1ZTdGVtcyAmJiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDE4KSkgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQ0ZGIHN0ZW0gaGludHMgYXJlIGluIHdyb25nIG9yZGVyIik7CisgICAgICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIm1pbiIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHsKKyAgICAgICAgICAgICAgaWYgKCFzdGF0ZS51bmRlZlN0YWNrICYmIHN0YWNrU2l6ZSA8IHZhbGlkYXRpb25Db21tYW5kLm1pbikgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTm90IGVub3VnaCBwYXJhbWV0ZXJzIGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQgKyAiOyBhY3R1YWw6ICIgKyBzdGFja1NpemUgKyAiLCBleHBlY3RlZDogIiArIHZhbGlkYXRpb25Db21tYW5kLm1pbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgeworICAgICAgICAgICAgICBzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgc3RhY2tTaXplIC09IHZhbGlkYXRpb25Db21tYW5kLm1pbjsKKworICAgICAgICAgICAgICBpZiAoc3RhY2tTaXplID49IDIgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkgeworICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSAlPSAyOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrU2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkZvdW5kIHRvbyBtYW55IHBhcmFtZXRlcnMgZm9yIHN0YWNrLWNsZWFyaW5nIGNvbW1hbmQiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChzdGFja1NpemUgPiAwICYmIHN0YWNrW3N0YWNrU2l6ZSAtIDFdID49IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS53aWR0aCA9IHN0YWNrW3N0YWNrU2l6ZSAtIDFdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgic3RhY2tEZWx0YSIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHsKKyAgICAgICAgICAgICAgaWYgKCJzdGFja0ZuIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kLnN0YWNrRm4oc3RhY2ssIHN0YWNrU2l6ZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdGFja1NpemUgKz0gdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tEZWx0YTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgeworICAgICAgICAgICAgICBzdGFja1NpemUgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC5yZXNldFN0YWNrKSB7CisgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CisgICAgICAgICAgICAgIHN0YXRlLnVuZGVmU3RhY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQudW5kZWZTdGFjaykgeworICAgICAgICAgICAgICBzdGFja1NpemUgPSAwOworICAgICAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgc3RhdGUuZmlyc3RTdGFja0NsZWFyaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJwYXJzZUNoYXJTdHJpbmdzIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUNoYXJTdHJpbmdzKF9yZWYpIHsKKyAgICAgICAgdmFyIGNoYXJTdHJpbmdzID0gX3JlZi5jaGFyU3RyaW5ncywKKyAgICAgICAgICAgIGxvY2FsU3VickluZGV4ID0gX3JlZi5sb2NhbFN1YnJJbmRleCwKKyAgICAgICAgICAgIGdsb2JhbFN1YnJJbmRleCA9IF9yZWYuZ2xvYmFsU3VickluZGV4LAorICAgICAgICAgICAgZmRTZWxlY3QgPSBfcmVmLmZkU2VsZWN0LAorICAgICAgICAgICAgZmRBcnJheSA9IF9yZWYuZmRBcnJheSwKKyAgICAgICAgICAgIHByaXZhdGVEaWN0ID0gX3JlZi5wcml2YXRlRGljdDsKKyAgICAgICAgdmFyIHNlYWNzID0gW107CisgICAgICAgIHZhciB3aWR0aHMgPSBbXTsKKyAgICAgICAgdmFyIGNvdW50ID0gY2hhclN0cmluZ3MuY291bnQ7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgdmFyIGNoYXJzdHJpbmcgPSBjaGFyU3RyaW5ncy5nZXQoaSk7CisgICAgICAgICAgdmFyIHN0YXRlID0geworICAgICAgICAgICAgY2FsbERlcHRoOiAwLAorICAgICAgICAgICAgc3RhY2tTaXplOiAwLAorICAgICAgICAgICAgc3RhY2s6IFtdLAorICAgICAgICAgICAgdW5kZWZTdGFjazogdHJ1ZSwKKyAgICAgICAgICAgIGhpbnRzOiAwLAorICAgICAgICAgICAgZmlyc3RTdGFja0NsZWFyaW5nOiB0cnVlLAorICAgICAgICAgICAgc2VhYzogbnVsbCwKKyAgICAgICAgICAgIHdpZHRoOiBudWxsLAorICAgICAgICAgICAgaGFzVlN0ZW1zOiBmYWxzZQorICAgICAgICAgIH07CisgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICB2YXIgbG9jYWxTdWJyVG9Vc2UgPSBudWxsOworICAgICAgICAgIHZhciBwcml2YXRlRGljdFRvVXNlID0gcHJpdmF0ZURpY3Q7CisKKyAgICAgICAgICBpZiAoZmRTZWxlY3QgJiYgZmRBcnJheS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHZhciBmZEluZGV4ID0gZmRTZWxlY3QuZ2V0RkRJbmRleChpKTsKKworICAgICAgICAgICAgaWYgKGZkSW5kZXggPT09IC0xKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiR2x5cGggaW5kZXggaXMgbm90IGluIGZkIHNlbGVjdC4iKTsKKyAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZkSW5kZXggPj0gZmRBcnJheS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKKyAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhbGlkKSB7CisgICAgICAgICAgICAgIHByaXZhdGVEaWN0VG9Vc2UgPSBmZEFycmF5W2ZkSW5kZXhdLnByaXZhdGVEaWN0OworICAgICAgICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IHByaXZhdGVEaWN0VG9Vc2Uuc3VicnNJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsU3VickluZGV4KSB7CisgICAgICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IGxvY2FsU3VickluZGV4OworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh2YWxpZCkgeworICAgICAgICAgICAgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgY2hhcnN0cmluZywgbG9jYWxTdWJyVG9Vc2UsIGdsb2JhbFN1YnJJbmRleCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHN0YXRlLndpZHRoICE9PSBudWxsKSB7CisgICAgICAgICAgICB2YXIgbm9taW5hbFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoIm5vbWluYWxXaWR0aFgiKTsKKyAgICAgICAgICAgIHdpZHRoc1tpXSA9IG5vbWluYWxXaWR0aCArIHN0YXRlLndpZHRoOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgZGVmYXVsdFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTsKKyAgICAgICAgICAgIHdpZHRoc1tpXSA9IGRlZmF1bHRXaWR0aDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc3RhdGUuc2VhYyAhPT0gbnVsbCkgeworICAgICAgICAgICAgc2VhY3NbaV0gPSBzdGF0ZS5zZWFjOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgICAgIGNoYXJTdHJpbmdzLnNldChpLCBuZXcgVWludDhBcnJheShbMTRdKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBjaGFyU3RyaW5nczogY2hhclN0cmluZ3MsCisgICAgICAgICAgc2VhY3M6IHNlYWNzLAorICAgICAgICAgIHdpZHRoczogd2lkdGhzCisgICAgICAgIH07CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiZW1wdHlQcml2YXRlRGljdGlvbmFyeSIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KSB7CisgICAgICAgIHZhciBwcml2YXRlRGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZQcml2YXRlRGljdCwgW10sIHBhcmVudERpY3Quc3RyaW5ncyk7CisgICAgICAgIHBhcmVudERpY3Quc2V0QnlLZXkoMTgsIFswLCAwXSk7CisgICAgICAgIHBhcmVudERpY3QucHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJwYXJzZVByaXZhdGVEaWN0IiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVByaXZhdGVEaWN0KHBhcmVudERpY3QpIHsKKyAgICAgICAgaWYgKCFwYXJlbnREaWN0Lmhhc05hbWUoIlByaXZhdGUiKSkgeworICAgICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgcHJpdmF0ZU9mZnNldCA9IHBhcmVudERpY3QuZ2V0QnlOYW1lKCJQcml2YXRlIik7CisKKyAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByaXZhdGVPZmZzZXQpIHx8IHByaXZhdGVPZmZzZXQubGVuZ3RoICE9PSAyKSB7CisgICAgICAgICAgcGFyZW50RGljdC5yZW1vdmVCeU5hbWUoIlByaXZhdGUiKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgc2l6ZSA9IHByaXZhdGVPZmZzZXRbMF07CisgICAgICAgIHZhciBvZmZzZXQgPSBwcml2YXRlT2Zmc2V0WzFdOworCisgICAgICAgIGlmIChzaXplID09PSAwIHx8IG9mZnNldCA+PSB0aGlzLmJ5dGVzLmxlbmd0aCkgeworICAgICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgcHJpdmF0ZURpY3RFbmQgPSBvZmZzZXQgKyBzaXplOworICAgICAgICB2YXIgZGljdERhdGEgPSB0aGlzLmJ5dGVzLnN1YmFycmF5KG9mZnNldCwgcHJpdmF0ZURpY3RFbmQpOworICAgICAgICB2YXIgZGljdCA9IHRoaXMucGFyc2VEaWN0KGRpY3REYXRhKTsKKyAgICAgICAgdmFyIHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LCBkaWN0LCBwYXJlbnREaWN0LnN0cmluZ3MpOworICAgICAgICBwYXJlbnREaWN0LnByaXZhdGVEaWN0ID0gcHJpdmF0ZURpY3Q7CisKKyAgICAgICAgaWYgKCFwcml2YXRlRGljdC5nZXRCeU5hbWUoIlN1YnJzIikpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3VicnNPZmZzZXQgPSBwcml2YXRlRGljdC5nZXRCeU5hbWUoIlN1YnJzIik7CisgICAgICAgIHZhciByZWxhdGl2ZU9mZnNldCA9IG9mZnNldCArIHN1YnJzT2Zmc2V0OworCisgICAgICAgIGlmIChzdWJyc09mZnNldCA9PT0gMCB8fCByZWxhdGl2ZU9mZnNldCA+PSB0aGlzLmJ5dGVzLmxlbmd0aCkgeworICAgICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3VicnNJbmRleCA9IHRoaXMucGFyc2VJbmRleChyZWxhdGl2ZU9mZnNldCk7CisgICAgICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJyc0luZGV4Lm9iajsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJwYXJzZUNoYXJzZXRzIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUNoYXJzZXRzKHBvcywgbGVuZ3RoLCBzdHJpbmdzLCBjaWQpIHsKKyAgICAgICAgaWYgKHBvcyA9PT0gMCkgeworICAgICAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLklTT19BRE9CRSwgX2NoYXJzZXRzLklTT0Fkb2JlQ2hhcnNldCk7CisgICAgICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KHRydWUsIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJULCBfY2hhcnNldHMuRXhwZXJ0Q2hhcnNldCk7CisgICAgICAgIH0gZWxzZSBpZiAocG9zID09PSAyKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KHRydWUsIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJUX1NVQlNFVCwgX2NoYXJzZXRzLkV4cGVydFN1YnNldENoYXJzZXQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlczsKKyAgICAgICAgdmFyIHN0YXJ0ID0gcG9zOworICAgICAgICB2YXIgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOworICAgICAgICB2YXIgY2hhcnNldCA9IFtjaWQgPyAwIDogIi5ub3RkZWYiXTsKKyAgICAgICAgdmFyIGlkLCBjb3VudCwgaTsKKyAgICAgICAgbGVuZ3RoIC09IDE7CisKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgaWQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgICAgY2hhcnNldC5wdXNoKGNpZCA/IGlkIDogc3RyaW5ncy5nZXQoaWQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB3aGlsZSAoY2hhcnNldC5sZW5ndGggPD0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CisgICAgICAgICAgICAgIGNvdW50ID0gYnl0ZXNbcG9zKytdOworCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCsrIDogc3RyaW5ncy5nZXQoaWQrKykpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgd2hpbGUgKGNoYXJzZXQubGVuZ3RoIDw9IGxlbmd0aCkgeworICAgICAgICAgICAgICBpZCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgICBjb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOworCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCsrIDogc3RyaW5ncy5nZXQoaWQrKykpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBjaGFyc2V0IGZvcm1hdCIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGVuZCA9IHBvczsKKyAgICAgICAgdmFyIHJhdyA9IGJ5dGVzLnN1YmFycmF5KHN0YXJ0LCBlbmQpOworICAgICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQoZmFsc2UsIGZvcm1hdCwgY2hhcnNldCwgcmF3KTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJwYXJzZUVuY29kaW5nIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUVuY29kaW5nKHBvcywgcHJvcGVydGllcywgc3RyaW5ncywgY2hhcnNldCkgeworICAgICAgICB2YXIgZW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzOworICAgICAgICB2YXIgcHJlZGVmaW5lZCA9IGZhbHNlOworICAgICAgICB2YXIgZm9ybWF0LCBpLCBpaTsKKyAgICAgICAgdmFyIHJhdyA9IG51bGw7CisKKyAgICAgICAgZnVuY3Rpb24gcmVhZFN1cHBsZW1lbnQoKSB7CisgICAgICAgICAgdmFyIHN1cHBsZW1lbnRzQ291bnQgPSBieXRlc1twb3MrK107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VwcGxlbWVudHNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB2YXIgY29kZSA9IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgIHZhciBzaWQgPSAoYnl0ZXNbcG9zKytdIDw8IDgpICsgKGJ5dGVzW3BvcysrXSAmIDB4ZmYpOworICAgICAgICAgICAgZW5jb2RpbmdbY29kZV0gPSBjaGFyc2V0LmluZGV4T2Yoc3RyaW5ncy5nZXQoc2lkKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcyA9PT0gMCB8fCBwb3MgPT09IDEpIHsKKyAgICAgICAgICBwcmVkZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICBmb3JtYXQgPSBwb3M7CisgICAgICAgICAgdmFyIGJhc2VFbmNvZGluZyA9IHBvcyA/IF9lbmNvZGluZ3MuRXhwZXJ0RW5jb2RpbmcgOiBfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2Rpbmc7CisKKyAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgdmFyIGluZGV4ID0gYmFzZUVuY29kaW5nLmluZGV4T2YoY2hhcnNldFtpXSk7CisKKyAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKKyAgICAgICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIGRhdGFTdGFydCA9IHBvczsKKyAgICAgICAgICBmb3JtYXQgPSBieXRlc1twb3MrK107CisKKyAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCAmIDB4N2YpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgdmFyIGdseXBoc0NvdW50ID0gYnl0ZXNbcG9zKytdOworCisgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGVuY29kaW5nW2J5dGVzW3BvcysrXV0gPSBpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgdmFyIHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgICB2YXIgZ2lkID0gMTsKKworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IGJ5dGVzW3BvcysrXTsKKworICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBzdGFydDsgaiA8PSBzdGFydCArIGxlZnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgZW5jb2Rpbmdbal0gPSBnaWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIGVuY29kaW5nIGZvcm1hdDogIi5jb25jYXQoZm9ybWF0LCAiIGluIENGRiIpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgZGF0YUVuZCA9IHBvczsKKworICAgICAgICAgIGlmIChmb3JtYXQgJiAweDgwKSB7CisgICAgICAgICAgICBieXRlc1tkYXRhU3RhcnRdICY9IDB4N2Y7CisgICAgICAgICAgICByZWFkU3VwcGxlbWVudCgpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJhdyA9IGJ5dGVzLnN1YmFycmF5KGRhdGFTdGFydCwgZGF0YUVuZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3JtYXQgPSBmb3JtYXQgJiAweDdmOworICAgICAgICByZXR1cm4gbmV3IENGRkVuY29kaW5nKHByZWRlZmluZWQsIGZvcm1hdCwgZW5jb2RpbmcsIHJhdyk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAicGFyc2VGRFNlbGVjdCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VGRFNlbGVjdChwb3MsIGxlbmd0aCkgeworICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzOworICAgICAgICB2YXIgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOworICAgICAgICB2YXIgZmRTZWxlY3QgPSBbXTsKKyAgICAgICAgdmFyIGk7CisKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgdmFyIGlkID0gYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgICBmZFNlbGVjdC5wdXNoKGlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB2YXIgcmFuZ2VzQ291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhbmdlc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CisKKyAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgZmlyc3QgIT09IDApIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhhdmUgYSBmaXJzdCBHSUQgb2YgMCIgKyAiIC0tIHRyeWluZyB0byByZWNvdmVyLiIpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBmZEluZGV4ID0gYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgICB2YXIgbmV4dCA9IGJ5dGVzW3Bvc10gPDwgOCB8IGJ5dGVzW3BvcyArIDFdOworCisgICAgICAgICAgICAgIGZvciAodmFyIGogPSBmaXJzdDsgaiA8IG5leHQ7ICsraikgeworICAgICAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goZmRJbmRleCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoInBhcnNlRkRTZWxlY3Q6IFVua25vd24gZm9ybWF0IFwiIi5jb25jYXQoZm9ybWF0LCAiXCIuIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZkU2VsZWN0Lmxlbmd0aCAhPT0gbGVuZ3RoKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgQ0ZGRkRTZWxlY3QoZm9ybWF0LCBmZFNlbGVjdCk7CisgICAgICB9CisgICAgfV0pOworCisgICAgcmV0dXJuIENGRlBhcnNlcjsKKyAgfSgpOworCisgIHJldHVybiBDRkZQYXJzZXI7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGUGFyc2VyID0gQ0ZGUGFyc2VyOworCit2YXIgQ0ZGID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQ0ZGKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDRkYpOworCisgICAgdGhpcy5oZWFkZXIgPSBudWxsOworICAgIHRoaXMubmFtZXMgPSBbXTsKKyAgICB0aGlzLnRvcERpY3QgPSBudWxsOworICAgIHRoaXMuc3RyaW5ncyA9IG5ldyBDRkZTdHJpbmdzKCk7CisgICAgdGhpcy5nbG9iYWxTdWJySW5kZXggPSBudWxsOworICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOworICAgIHRoaXMuY2hhcnNldCA9IG51bGw7CisgICAgdGhpcy5jaGFyU3RyaW5ncyA9IG51bGw7CisgICAgdGhpcy5mZEFycmF5ID0gW107CisgICAgdGhpcy5mZFNlbGVjdCA9IG51bGw7CisgICAgdGhpcy5pc0NJREZvbnQgPSBmYWxzZTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhDRkYsIFt7CisgICAga2V5OiAiZHVwbGljYXRlRmlyc3RHbHlwaCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGR1cGxpY2F0ZUZpcnN0R2x5cGgoKSB7CisgICAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gY2hhcnN0cmluZ3MgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBnbHlwaFplcm8gPSB0aGlzLmNoYXJTdHJpbmdzLmdldCgwKTsKKyAgICAgIHRoaXMuY2hhclN0cmluZ3MuYWRkKGdseXBoWmVybyk7CisKKyAgICAgIGlmICh0aGlzLmlzQ0lERm9udCkgeworICAgICAgICB0aGlzLmZkU2VsZWN0LmZkU2VsZWN0LnB1c2godGhpcy5mZFNlbGVjdC5mZFNlbGVjdFswXSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaGFzR2x5cGhJZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0dseXBoSWQoaWQpIHsKKyAgICAgIGlmIChpZCA8IDAgfHwgaWQgPj0gdGhpcy5jaGFyU3RyaW5ncy5jb3VudCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHZhciBnbHlwaCA9IHRoaXMuY2hhclN0cmluZ3MuZ2V0KGlkKTsKKyAgICAgIHJldHVybiBnbHlwaC5sZW5ndGggPiAwOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBDRkY7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGID0gQ0ZGOworCit2YXIgQ0ZGSGVhZGVyID0gZnVuY3Rpb24gQ0ZGSGVhZGVyKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSkgeworICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ0ZGSGVhZGVyKTsKKworICB0aGlzLm1ham9yID0gbWFqb3I7CisgIHRoaXMubWlub3IgPSBtaW5vcjsKKyAgdGhpcy5oZHJTaXplID0gaGRyU2l6ZTsKKyAgdGhpcy5vZmZTaXplID0gb2ZmU2l6ZTsKK307CisKK2V4cG9ydHMuQ0ZGSGVhZGVyID0gQ0ZGSGVhZGVyOworCit2YXIgQ0ZGU3RyaW5ncyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIENGRlN0cmluZ3MoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENGRlN0cmluZ3MpOworCisgICAgdGhpcy5zdHJpbmdzID0gW107CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQ0ZGU3RyaW5ncywgW3sKKyAgICBrZXk6ICJnZXQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoaW5kZXgpIHsKKyAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDw9IE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyAtIDEpIHsKKyAgICAgICAgcmV0dXJuIENGRlN0YW5kYXJkU3RyaW5nc1tpbmRleF07CisgICAgICB9CisKKyAgICAgIGlmIChpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA8PSB0aGlzLnN0cmluZ3MubGVuZ3RoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3NbaW5kZXggLSBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1NdOworICAgICAgfQorCisgICAgICByZXR1cm4gQ0ZGU3RhbmRhcmRTdHJpbmdzWzBdOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldFNJRCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNJRChzdHIpIHsKKyAgICAgIHZhciBpbmRleCA9IENGRlN0YW5kYXJkU3RyaW5ncy5pbmRleE9mKHN0cik7CisKKyAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgfQorCisgICAgICBpbmRleCA9IHRoaXMuc3RyaW5ncy5pbmRleE9mKHN0cik7CisKKyAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4ICsgTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTOworICAgICAgfQorCisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYWRkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHZhbHVlKSB7CisgICAgICB0aGlzLnN0cmluZ3MucHVzaCh2YWx1ZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY291bnQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuc3RyaW5ncy5sZW5ndGg7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIENGRlN0cmluZ3M7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGU3RyaW5ncyA9IENGRlN0cmluZ3M7CisKK3ZhciBDRkZJbmRleCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIENGRkluZGV4KCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDRkZJbmRleCk7CisKKyAgICB0aGlzLm9iamVjdHMgPSBbXTsKKyAgICB0aGlzLmxlbmd0aCA9IDA7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQ0ZGSW5kZXgsIFt7CisgICAga2V5OiAiYWRkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKGRhdGEpIHsKKyAgICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoOworICAgICAgdGhpcy5vYmplY3RzLnB1c2goZGF0YSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGluZGV4LCBkYXRhKSB7CisgICAgICB0aGlzLmxlbmd0aCArPSBkYXRhLmxlbmd0aCAtIHRoaXMub2JqZWN0c1tpbmRleF0ubGVuZ3RoOworICAgICAgdGhpcy5vYmplY3RzW2luZGV4XSA9IGRhdGE7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGluZGV4KSB7CisgICAgICByZXR1cm4gdGhpcy5vYmplY3RzW2luZGV4XTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjb3VudCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQ0ZGSW5kZXg7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGSW5kZXggPSBDRkZJbmRleDsKKwordmFyIENGRkRpY3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDRkZEaWN0KHRhYmxlcywgc3RyaW5ncykgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDRkZEaWN0KTsKKworICAgIHRoaXMua2V5VG9OYW1lTWFwID0gdGFibGVzLmtleVRvTmFtZU1hcDsKKyAgICB0aGlzLm5hbWVUb0tleU1hcCA9IHRhYmxlcy5uYW1lVG9LZXlNYXA7CisgICAgdGhpcy5kZWZhdWx0cyA9IHRhYmxlcy5kZWZhdWx0czsKKyAgICB0aGlzLnR5cGVzID0gdGFibGVzLnR5cGVzOworICAgIHRoaXMub3Bjb2RlcyA9IHRhYmxlcy5vcGNvZGVzOworICAgIHRoaXMub3JkZXIgPSB0YWJsZXMub3JkZXI7CisgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5nczsKKyAgICB0aGlzLnZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQ0ZGRGljdCwgW3sKKyAgICBrZXk6ICJzZXRCeUtleSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEJ5S2V5KGtleSwgdmFsdWUpIHsKKyAgICAgIGlmICghKGtleSBpbiB0aGlzLmtleVRvTmFtZU1hcCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB2YXIgdmFsdWVMZW5ndGggPSB2YWx1ZS5sZW5ndGg7CisKKyAgICAgIGlmICh2YWx1ZUxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZUxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChpc05hTih2YWx1ZVtpXSkpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoJ0ludmFsaWQgQ0ZGRGljdCB2YWx1ZTogIicgKyB2YWx1ZSArICciIGZvciBrZXkgIicgKyBrZXkgKyAnIi4nKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgdHlwZSA9IHRoaXMudHlwZXNba2V5XTsKKworICAgICAgaWYgKHR5cGUgPT09ICJudW0iIHx8IHR5cGUgPT09ICJzaWQiIHx8IHR5cGUgPT09ICJvZmZzZXQiKSB7CisgICAgICAgIHZhbHVlID0gdmFsdWVbMF07CisgICAgICB9CisKKyAgICAgIHRoaXMudmFsdWVzW2tleV0gPSB2YWx1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldEJ5TmFtZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEJ5TmFtZShuYW1lLCB2YWx1ZSkgeworICAgICAgaWYgKCEobmFtZSBpbiB0aGlzLm5hbWVUb0tleU1hcCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSBcIiIuY29uY2F0KG5hbWUsICJcIiIpKTsKKyAgICAgIH0KKworICAgICAgdGhpcy52YWx1ZXNbdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV1dID0gdmFsdWU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaGFzTmFtZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc05hbWUobmFtZSkgeworICAgICAgcmV0dXJuIHRoaXMubmFtZVRvS2V5TWFwW25hbWVdIGluIHRoaXMudmFsdWVzOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEJ5TmFtZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJ5TmFtZShuYW1lKSB7CisgICAgICBpZiAoIShuYW1lIGluIHRoaXMubmFtZVRvS2V5TWFwKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgZGljdGlvbmFyeSBuYW1lICIuY29uY2F0KG5hbWUsICJcIiIpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGtleSA9IHRoaXMubmFtZVRvS2V5TWFwW25hbWVdOworCisgICAgICBpZiAoIShrZXkgaW4gdGhpcy52YWx1ZXMpKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRzW2tleV07CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLnZhbHVlc1trZXldOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlbW92ZUJ5TmFtZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUJ5TmFtZShuYW1lKSB7CisgICAgICBkZWxldGUgdGhpcy52YWx1ZXNbdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV1dOworICAgIH0KKyAgfV0sIFt7CisgICAga2V5OiAiY3JlYXRlVGFibGVzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlVGFibGVzKGxheW91dCkgeworICAgICAgdmFyIHRhYmxlcyA9IHsKKyAgICAgICAga2V5VG9OYW1lTWFwOiB7fSwKKyAgICAgICAgbmFtZVRvS2V5TWFwOiB7fSwKKyAgICAgICAgZGVmYXVsdHM6IHt9LAorICAgICAgICB0eXBlczoge30sCisgICAgICAgIG9wY29kZXM6IHt9LAorICAgICAgICBvcmRlcjogW10KKyAgICAgIH07CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGxheW91dC5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHZhciBlbnRyeSA9IGxheW91dFtpXTsKKyAgICAgICAgdmFyIGtleSA9IEFycmF5LmlzQXJyYXkoZW50cnlbMF0pID8gKGVudHJ5WzBdWzBdIDw8IDgpICsgZW50cnlbMF1bMV0gOiBlbnRyeVswXTsKKyAgICAgICAgdGFibGVzLmtleVRvTmFtZU1hcFtrZXldID0gZW50cnlbMV07CisgICAgICAgIHRhYmxlcy5uYW1lVG9LZXlNYXBbZW50cnlbMV1dID0ga2V5OworICAgICAgICB0YWJsZXMudHlwZXNba2V5XSA9IGVudHJ5WzJdOworICAgICAgICB0YWJsZXMuZGVmYXVsdHNba2V5XSA9IGVudHJ5WzNdOworICAgICAgICB0YWJsZXMub3Bjb2Rlc1trZXldID0gQXJyYXkuaXNBcnJheShlbnRyeVswXSkgPyBlbnRyeVswXSA6IFtlbnRyeVswXV07CisgICAgICAgIHRhYmxlcy5vcmRlci5wdXNoKGtleSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0YWJsZXM7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIENGRkRpY3Q7Cit9KCk7CisKK3ZhciBDRkZUb3BEaWN0ID0gZnVuY3Rpb24gQ0ZGVG9wRGljdENsb3N1cmUoKSB7CisgIHZhciBsYXlvdXQgPSBbW1sxMiwgMzBdLCAiUk9TIiwgWyJzaWQiLCAic2lkIiwgIm51bSJdLCBudWxsXSwgW1sxMiwgMjBdLCAiU3ludGhldGljQmFzZSIsICJudW0iLCBudWxsXSwgWzAsICJ2ZXJzaW9uIiwgInNpZCIsIG51bGxdLCBbMSwgIk5vdGljZSIsICJzaWQiLCBudWxsXSwgW1sxMiwgMF0sICJDb3B5cmlnaHQiLCAic2lkIiwgbnVsbF0sIFsyLCAiRnVsbE5hbWUiLCAic2lkIiwgbnVsbF0sIFszLCAiRmFtaWx5TmFtZSIsICJzaWQiLCBudWxsXSwgWzQsICJXZWlnaHQiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDFdLCAiaXNGaXhlZFBpdGNoIiwgIm51bSIsIDBdLCBbWzEyLCAyXSwgIkl0YWxpY0FuZ2xlIiwgIm51bSIsIDBdLCBbWzEyLCAzXSwgIlVuZGVybGluZVBvc2l0aW9uIiwgIm51bSIsIC0xMDBdLCBbWzEyLCA0XSwgIlVuZGVybGluZVRoaWNrbmVzcyIsICJudW0iLCA1MF0sIFtbMTIsIDVdLCAiUGFpbnRUeXBlIiwgIm51bSIsIDBdLCBbWzEyLCA2XSwgIkNoYXJzdHJpbmdUeXBlIiwgIm51bSIsIDJdLCBbWzEyLCA3XSwgIkZvbnRNYXRyaXgiLCBbIm51bSIsICJudW0iLCAibnVtIiwgIm51bSIsICJudW0iLCAibnVtIl0sIFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdXSwgWzEzLCAiVW5pcXVlSUQiLCAibnVtIiwgbnVsbF0sIFs1LCAiRm9udEJCb3giLCBbIm51bSIsICJudW0iLCAibnVtIiwgIm51bSJdLCBbMCwgMCwgMCwgMF1dLCBbWzEyLCA4XSwgIlN0cm9rZVdpZHRoIiwgIm51bSIsIDBdLCBbMTQsICJYVUlEIiwgImFycmF5IiwgbnVsbF0sIFsxNSwgImNoYXJzZXQiLCAib2Zmc2V0IiwgMF0sIFsxNiwgIkVuY29kaW5nIiwgIm9mZnNldCIsIDBdLCBbMTcsICJDaGFyU3RyaW5ncyIsICJvZmZzZXQiLCAwXSwgWzE4LCAiUHJpdmF0ZSIsIFsib2Zmc2V0IiwgIm9mZnNldCJdLCBudWxsXSwgW1sxMiwgMjFdLCAiUG9zdFNjcmlwdCIsICJzaWQiLCBudWxsXSwgW1sxMiwgMjJdLCAiQmFzZUZvbnROYW1lIiwgInNpZCIsIG51bGxdLCBbWzEyLCAyM10sICJCYXNlRm9udEJsZW5kIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDMxXSwgIkNJREZvbnRWZXJzaW9uIiwgIm51bSIsIDBdLCBbWzEyLCAzMl0sICJDSURGb250UmV2aXNpb24iLCAibnVtIiwgMF0sIFtbMTIsIDMzXSwgIkNJREZvbnRUeXBlIiwgIm51bSIsIDBdLCBbWzEyLCAzNF0sICJDSURDb3VudCIsICJudW0iLCA4NzIwXSwgW1sxMiwgMzVdLCAiVUlEQmFzZSIsICJudW0iLCBudWxsXSwgW1sxMiwgMzddLCAiRkRTZWxlY3QiLCAib2Zmc2V0IiwgbnVsbF0sIFtbMTIsIDM2XSwgIkZEQXJyYXkiLCAib2Zmc2V0IiwgbnVsbF0sIFtbMTIsIDM4XSwgIkZvbnROYW1lIiwgInNpZCIsIG51bGxdXTsKKyAgdmFyIHRhYmxlcyA9IG51bGw7CisKKyAgdmFyIENGRlRvcERpY3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9DRkZEaWN0KSB7CisgICAgX2luaGVyaXRzKENGRlRvcERpY3QsIF9DRkZEaWN0KTsKKworICAgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ0ZGVG9wRGljdCk7CisKKyAgICBmdW5jdGlvbiBDRkZUb3BEaWN0KHN0cmluZ3MpIHsKKyAgICAgIHZhciBfdGhpczsKKworICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENGRlRvcERpY3QpOworCisgICAgICBpZiAodGFibGVzID09PSBudWxsKSB7CisgICAgICAgIHRhYmxlcyA9IENGRkRpY3QuY3JlYXRlVGFibGVzKGxheW91dCk7CisgICAgICB9CisKKyAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdGFibGVzLCBzdHJpbmdzKTsKKyAgICAgIF90aGlzLnByaXZhdGVEaWN0ID0gbnVsbDsKKyAgICAgIHJldHVybiBfdGhpczsKKyAgICB9CisKKyAgICByZXR1cm4gQ0ZGVG9wRGljdDsKKyAgfShDRkZEaWN0KTsKKworICByZXR1cm4gQ0ZGVG9wRGljdDsKK30oKTsKKworZXhwb3J0cy5DRkZUb3BEaWN0ID0gQ0ZGVG9wRGljdDsKKwordmFyIENGRlByaXZhdGVEaWN0ID0gZnVuY3Rpb24gQ0ZGUHJpdmF0ZURpY3RDbG9zdXJlKCkgeworICB2YXIgbGF5b3V0ID0gW1s2LCAiQmx1ZVZhbHVlcyIsICJkZWx0YSIsIG51bGxdLCBbNywgIk90aGVyQmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzgsICJGYW1pbHlCbHVlcyIsICJkZWx0YSIsIG51bGxdLCBbOSwgIkZhbWlseU90aGVyQmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgOV0sICJCbHVlU2NhbGUiLCAibnVtIiwgMC4wMzk2MjVdLCBbWzEyLCAxMF0sICJCbHVlU2hpZnQiLCAibnVtIiwgN10sIFtbMTIsIDExXSwgIkJsdWVGdXp6IiwgIm51bSIsIDFdLCBbMTAsICJTdGRIVyIsICJudW0iLCBudWxsXSwgWzExLCAiU3RkVlciLCAibnVtIiwgbnVsbF0sIFtbMTIsIDEyXSwgIlN0ZW1TbmFwSCIsICJkZWx0YSIsIG51bGxdLCBbWzEyLCAxM10sICJTdGVtU25hcFYiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMTRdLCAiRm9yY2VCb2xkIiwgIm51bSIsIDBdLCBbWzEyLCAxN10sICJMYW5ndWFnZUdyb3VwIiwgIm51bSIsIDBdLCBbWzEyLCAxOF0sICJFeHBhbnNpb25GYWN0b3IiLCAibnVtIiwgMC4wNl0sIFtbMTIsIDE5XSwgImluaXRpYWxSYW5kb21TZWVkIiwgIm51bSIsIDBdLCBbMjAsICJkZWZhdWx0V2lkdGhYIiwgIm51bSIsIDBdLCBbMjEsICJub21pbmFsV2lkdGhYIiwgIm51bSIsIDBdLCBbMTksICJTdWJycyIsICJvZmZzZXQiLCBudWxsXV07CisgIHZhciB0YWJsZXMgPSBudWxsOworCisgIHZhciBDRkZQcml2YXRlRGljdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NGRkRpY3QyKSB7CisgICAgX2luaGVyaXRzKENGRlByaXZhdGVEaWN0LCBfQ0ZGRGljdDIpOworCisgICAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoQ0ZGUHJpdmF0ZURpY3QpOworCisgICAgZnVuY3Rpb24gQ0ZGUHJpdmF0ZURpY3Qoc3RyaW5ncykgeworICAgICAgdmFyIF90aGlzMjsKKworICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENGRlByaXZhdGVEaWN0KTsKKworICAgICAgaWYgKHRhYmxlcyA9PT0gbnVsbCkgeworICAgICAgICB0YWJsZXMgPSBDRkZEaWN0LmNyZWF0ZVRhYmxlcyhsYXlvdXQpOworICAgICAgfQorCisgICAgICBfdGhpczIgPSBfc3VwZXIyLmNhbGwodGhpcywgdGFibGVzLCBzdHJpbmdzKTsKKyAgICAgIF90aGlzMi5zdWJyc0luZGV4ID0gbnVsbDsKKyAgICAgIHJldHVybiBfdGhpczI7CisgICAgfQorCisgICAgcmV0dXJuIENGRlByaXZhdGVEaWN0OworICB9KENGRkRpY3QpOworCisgIHJldHVybiBDRkZQcml2YXRlRGljdDsKK30oKTsKKworZXhwb3J0cy5DRkZQcml2YXRlRGljdCA9IENGRlByaXZhdGVEaWN0OwordmFyIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMgPSB7CisgIElTT19BRE9CRTogMCwKKyAgRVhQRVJUOiAxLAorICBFWFBFUlRfU1VCU0VUOiAyCit9OworCit2YXIgQ0ZGQ2hhcnNldCA9IGZ1bmN0aW9uIENGRkNoYXJzZXQocHJlZGVmaW5lZCwgZm9ybWF0LCBjaGFyc2V0LCByYXcpIHsKKyAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENGRkNoYXJzZXQpOworCisgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CisgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OworICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OworICB0aGlzLnJhdyA9IHJhdzsKK307CisKK2V4cG9ydHMuQ0ZGQ2hhcnNldCA9IENGRkNoYXJzZXQ7CisKK3ZhciBDRkZFbmNvZGluZyA9IGZ1bmN0aW9uIENGRkVuY29kaW5nKHByZWRlZmluZWQsIGZvcm1hdCwgZW5jb2RpbmcsIHJhdykgeworICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ0ZGRW5jb2RpbmcpOworCisgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CisgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OworICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgIHRoaXMucmF3ID0gcmF3OworfTsKKwordmFyIENGRkZEU2VsZWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gQ0ZGRkRTZWxlY3QoZm9ybWF0LCBmZFNlbGVjdCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDRkZGRFNlbGVjdCk7CisKKyAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKKyAgICB0aGlzLmZkU2VsZWN0ID0gZmRTZWxlY3Q7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQ0ZGRkRTZWxlY3QsIFt7CisgICAga2V5OiAiZ2V0RkRJbmRleCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZESW5kZXgoZ2x5cGhJbmRleCkgeworICAgICAgaWYgKGdseXBoSW5kZXggPCAwIHx8IGdseXBoSW5kZXggPj0gdGhpcy5mZFNlbGVjdC5sZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5mZFNlbGVjdFtnbHlwaEluZGV4XTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQ0ZGRkRTZWxlY3Q7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGRkRTZWxlY3QgPSBDRkZGRFNlbGVjdDsKKwordmFyIENGRk9mZnNldFRyYWNrZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBDRkZPZmZzZXRUcmFja2VyKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDRkZPZmZzZXRUcmFja2VyKTsKKworICAgIHRoaXMub2Zmc2V0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoQ0ZGT2Zmc2V0VHJhY2tlciwgW3sKKyAgICBrZXk6ICJpc1RyYWNraW5nIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaXNUcmFja2luZyhrZXkpIHsKKyAgICAgIHJldHVybiBrZXkgaW4gdGhpcy5vZmZzZXRzOworICAgIH0KKyAgfSwgeworICAgIGtleTogInRyYWNrIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gdHJhY2soa2V5LCBsb2NhdGlvbikgeworICAgICAgaWYgKGtleSBpbiB0aGlzLm9mZnNldHMpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJBbHJlYWR5IHRyYWNraW5nIGxvY2F0aW9uIG9mICIuY29uY2F0KGtleSkpOworICAgICAgfQorCisgICAgICB0aGlzLm9mZnNldHNba2V5XSA9IGxvY2F0aW9uOworICAgIH0KKyAgfSwgeworICAgIGtleTogIm9mZnNldCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG9mZnNldCh2YWx1ZSkgeworICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMub2Zmc2V0cykgeworICAgICAgICB0aGlzLm9mZnNldHNba2V5XSArPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRFbnRyeUxvY2F0aW9uIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RW50cnlMb2NhdGlvbihrZXksIHZhbHVlcywgb3V0cHV0KSB7CisgICAgICBpZiAoIShrZXkgaW4gdGhpcy5vZmZzZXRzKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAiLmNvbmNhdChrZXkpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRhdGEgPSBvdXRwdXQuZGF0YTsKKyAgICAgIHZhciBkYXRhT2Zmc2V0ID0gdGhpcy5vZmZzZXRzW2tleV07CisgICAgICB2YXIgc2l6ZSA9IDU7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHZhbHVlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHZhciBvZmZzZXQwID0gaSAqIHNpemUgKyBkYXRhT2Zmc2V0OworICAgICAgICB2YXIgb2Zmc2V0MSA9IG9mZnNldDAgKyAxOworICAgICAgICB2YXIgb2Zmc2V0MiA9IG9mZnNldDAgKyAyOworICAgICAgICB2YXIgb2Zmc2V0MyA9IG9mZnNldDAgKyAzOworICAgICAgICB2YXIgb2Zmc2V0NCA9IG9mZnNldDAgKyA0OworCisgICAgICAgIGlmIChkYXRhW29mZnNldDBdICE9PSAweDFkIHx8IGRhdGFbb2Zmc2V0MV0gIT09IDAgfHwgZGF0YVtvZmZzZXQyXSAhPT0gMCB8fCBkYXRhW29mZnNldDNdICE9PSAwIHx8IGRhdGFbb2Zmc2V0NF0gIT09IDApIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIndyaXRpbmcgdG8gYW4gb2Zmc2V0IHRoYXQgaXMgbm90IGVtcHR5Iik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07CisgICAgICAgIGRhdGFbb2Zmc2V0MF0gPSAweDFkOworICAgICAgICBkYXRhW29mZnNldDFdID0gdmFsdWUgPj4gMjQgJiAweGZmOworICAgICAgICBkYXRhW29mZnNldDJdID0gdmFsdWUgPj4gMTYgJiAweGZmOworICAgICAgICBkYXRhW29mZnNldDNdID0gdmFsdWUgPj4gOCAmIDB4ZmY7CisgICAgICAgIGRhdGFbb2Zmc2V0NF0gPSB2YWx1ZSAmIDB4ZmY7CisgICAgICB9CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIENGRk9mZnNldFRyYWNrZXI7Cit9KCk7CisKK3ZhciBDRkZDb21waWxlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIENGRkNvbXBpbGVyKGNmZikgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDRkZDb21waWxlcik7CisKKyAgICB0aGlzLmNmZiA9IGNmZjsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhDRkZDb21waWxlciwgW3sKKyAgICBrZXk6ICJjb21waWxlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZSgpIHsKKyAgICAgIHZhciBjZmYgPSB0aGlzLmNmZjsKKyAgICAgIHZhciBvdXRwdXQgPSB7CisgICAgICAgIGRhdGE6IFtdLAorICAgICAgICBsZW5ndGg6IDAsCisgICAgICAgIGFkZDogZnVuY3Rpb24gQ0ZGQ29tcGlsZXJfYWRkKGRhdGEpIHsKKyAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KGRhdGEpOworICAgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIHZhciBoZWFkZXIgPSB0aGlzLmNvbXBpbGVIZWFkZXIoY2ZmLmhlYWRlcik7CisgICAgICBvdXRwdXQuYWRkKGhlYWRlcik7CisgICAgICB2YXIgbmFtZUluZGV4ID0gdGhpcy5jb21waWxlTmFtZUluZGV4KGNmZi5uYW1lcyk7CisgICAgICBvdXRwdXQuYWRkKG5hbWVJbmRleCk7CisKKyAgICAgIGlmIChjZmYuaXNDSURGb250KSB7CisgICAgICAgIGlmIChjZmYudG9wRGljdC5oYXNOYW1lKCJGb250TWF0cml4IikpIHsKKyAgICAgICAgICB2YXIgYmFzZSA9IGNmZi50b3BEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpOworICAgICAgICAgIGNmZi50b3BEaWN0LnJlbW92ZUJ5TmFtZSgiRm9udE1hdHJpeCIpOworCisgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2ZmLmZkQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgdmFyIHN1YkRpY3QgPSBjZmYuZmRBcnJheVtpXTsKKyAgICAgICAgICAgIHZhciBtYXRyaXggPSBiYXNlLnNsaWNlKDApOworCisgICAgICAgICAgICBpZiAoc3ViRGljdC5oYXNOYW1lKCJGb250TWF0cml4IikpIHsKKyAgICAgICAgICAgICAgbWF0cml4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0obWF0cml4LCBzdWJEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3ViRGljdC5zZXRCeU5hbWUoIkZvbnRNYXRyaXgiLCBtYXRyaXgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjZmYudG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCAwKTsKKyAgICAgIHZhciBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKFtjZmYudG9wRGljdF0sIG91dHB1dC5sZW5ndGgsIGNmZi5pc0NJREZvbnQpOworICAgICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOworICAgICAgdmFyIHRvcERpY3RUcmFja2VyID0gY29tcGlsZWQudHJhY2tlcnNbMF07CisgICAgICB2YXIgc3RyaW5nSW5kZXggPSB0aGlzLmNvbXBpbGVTdHJpbmdJbmRleChjZmYuc3RyaW5ncy5zdHJpbmdzKTsKKyAgICAgIG91dHB1dC5hZGQoc3RyaW5nSW5kZXgpOworICAgICAgdmFyIGdsb2JhbFN1YnJJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGNmZi5nbG9iYWxTdWJySW5kZXgpOworICAgICAgb3V0cHV0LmFkZChnbG9iYWxTdWJySW5kZXgpOworCisgICAgICBpZiAoY2ZmLmVuY29kaW5nICYmIGNmZi50b3BEaWN0Lmhhc05hbWUoIkVuY29kaW5nIikpIHsKKyAgICAgICAgaWYgKGNmZi5lbmNvZGluZy5wcmVkZWZpbmVkKSB7CisgICAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRW5jb2RpbmciLCBbY2ZmLmVuY29kaW5nLmZvcm1hdF0sIG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIGVuY29kaW5nID0gdGhpcy5jb21waWxlRW5jb2RpbmcoY2ZmLmVuY29kaW5nKTsKKyAgICAgICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKKyAgICAgICAgICBvdXRwdXQuYWRkKGVuY29kaW5nKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgY2hhcnNldCA9IHRoaXMuY29tcGlsZUNoYXJzZXQoY2ZmLmNoYXJzZXQsIGNmZi5jaGFyU3RyaW5ncy5jb3VudCwgY2ZmLnN0cmluZ3MsIGNmZi5pc0NJREZvbnQpOworICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKKyAgICAgIG91dHB1dC5hZGQoY2hhcnNldCk7CisgICAgICB2YXIgY2hhclN0cmluZ3MgPSB0aGlzLmNvbXBpbGVDaGFyU3RyaW5ncyhjZmYuY2hhclN0cmluZ3MpOworICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiQ2hhclN0cmluZ3MiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CisgICAgICBvdXRwdXQuYWRkKGNoYXJTdHJpbmdzKTsKKworICAgICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKKyAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CisgICAgICAgIHZhciBmZFNlbGVjdCA9IHRoaXMuY29tcGlsZUZEU2VsZWN0KGNmZi5mZFNlbGVjdCk7CisgICAgICAgIG91dHB1dC5hZGQoZmRTZWxlY3QpOworICAgICAgICBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKGNmZi5mZEFycmF5LCBvdXRwdXQubGVuZ3RoLCB0cnVlKTsKKyAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRkRBcnJheSIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKKyAgICAgICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOworICAgICAgICB2YXIgZm9udERpY3RUcmFja2VycyA9IGNvbXBpbGVkLnRyYWNrZXJzOworICAgICAgICB0aGlzLmNvbXBpbGVQcml2YXRlRGljdHMoY2ZmLmZkQXJyYXksIGZvbnREaWN0VHJhY2tlcnMsIG91dHB1dCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29tcGlsZVByaXZhdGVEaWN0cyhbY2ZmLnRvcERpY3RdLCBbdG9wRGljdFRyYWNrZXJdLCBvdXRwdXQpOworICAgICAgb3V0cHV0LmFkZChbMF0pOworICAgICAgcmV0dXJuIG91dHB1dC5kYXRhOworICAgIH0KKyAgfSwgeworICAgIGtleTogImVuY29kZU51bWJlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGVuY29kZU51bWJlcih2YWx1ZSkgeworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVuY29kZUludGVnZXIodmFsdWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5lbmNvZGVGbG9hdCh2YWx1ZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZW5jb2RlRmxvYXQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBlbmNvZGVGbG9hdChudW0pIHsKKyAgICAgIHZhciB2YWx1ZSA9IG51bS50b1N0cmluZygpOworICAgICAgdmFyIG0gPSBDRkZDb21waWxlci5FbmNvZGVGbG9hdFJlZ0V4cC5leGVjKHZhbHVlKTsKKworICAgICAgaWYgKG0pIHsKKyAgICAgICAgdmFyIGVwc2lsb24gPSBwYXJzZUZsb2F0KCIxZSIgKyAoKG1bMl0gPyArbVsyXSA6IDApICsgbVsxXS5sZW5ndGgpKTsKKyAgICAgICAgdmFsdWUgPSAoTWF0aC5yb3VuZChudW0gKiBlcHNpbG9uKSAvIGVwc2lsb24pLnRvU3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIHZhciBuaWJibGVzID0gIiI7CisgICAgICB2YXIgaSwgaWk7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICB2YXIgYSA9IHZhbHVlW2ldOworCisgICAgICAgIGlmIChhID09PSAiZSIpIHsKKyAgICAgICAgICBuaWJibGVzICs9IHZhbHVlWysraV0gPT09ICItIiA/ICJjIiA6ICJiIjsKKyAgICAgICAgfSBlbHNlIGlmIChhID09PSAiLiIpIHsKKyAgICAgICAgICBuaWJibGVzICs9ICJhIjsKKyAgICAgICAgfSBlbHNlIGlmIChhID09PSAiLSIpIHsKKyAgICAgICAgICBuaWJibGVzICs9ICJlIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuaWJibGVzICs9IGE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbmliYmxlcyArPSBuaWJibGVzLmxlbmd0aCAmIDEgPyAiZiIgOiAiZmYiOworICAgICAgdmFyIG91dCA9IFszMF07CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gbmliYmxlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CisgICAgICAgIG91dC5wdXNoKHBhcnNlSW50KG5pYmJsZXMuc3Vic3RyaW5nKGksIGkgKyAyKSwgMTYpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJlbmNvZGVJbnRlZ2VyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZW5jb2RlSW50ZWdlcih2YWx1ZSkgeworICAgICAgdmFyIGNvZGU7CisKKyAgICAgIGlmICh2YWx1ZSA+PSAtMTA3ICYmIHZhbHVlIDw9IDEwNykgeworICAgICAgICBjb2RlID0gW3ZhbHVlICsgMTM5XTsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZSAtIDEwODsKKyAgICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNDcsIHZhbHVlICYgMHhmZl07CisgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0xMTMxICYmIHZhbHVlIDw9IC0xMDgpIHsKKyAgICAgICAgdmFsdWUgPSAtdmFsdWUgLSAxMDg7CisgICAgICAgIGNvZGUgPSBbKHZhbHVlID4+IDgpICsgMjUxLCB2YWx1ZSAmIDB4ZmZdOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAtMzI3NjggJiYgdmFsdWUgPD0gMzI3NjcpIHsKKyAgICAgICAgY29kZSA9IFsweDFjLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZGUgPSBbMHgxZCwgdmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmZdOworICAgICAgfQorCisgICAgICByZXR1cm4gY29kZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjb21waWxlSGVhZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZUhlYWRlcihoZWFkZXIpIHsKKyAgICAgIHJldHVybiBbaGVhZGVyLm1ham9yLCBoZWFkZXIubWlub3IsIGhlYWRlci5oZHJTaXplLCBoZWFkZXIub2ZmU2l6ZV07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29tcGlsZU5hbWVJbmRleCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGVOYW1lSW5kZXgobmFtZXMpIHsKKyAgICAgIHZhciBuYW1lSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldOworICAgICAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7CisgICAgICAgIHZhciBzYW5pdGl6ZWROYW1lID0gbmV3IEFycmF5KGxlbmd0aCk7CisKKyAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgICAgIHZhciBfY2hhciA9IG5hbWVbal07CisKKyAgICAgICAgICBpZiAoX2NoYXIgPCAiISIgfHwgX2NoYXIgPiAifiIgfHwgX2NoYXIgPT09ICJbIiB8fCBfY2hhciA9PT0gIl0iIHx8IF9jaGFyID09PSAiKCIgfHwgX2NoYXIgPT09ICIpIiB8fCBfY2hhciA9PT0gInsiIHx8IF9jaGFyID09PSAifSIgfHwgX2NoYXIgPT09ICI8IiB8fCBfY2hhciA9PT0gIj4iIHx8IF9jaGFyID09PSAiLyIgfHwgX2NoYXIgPT09ICIlIikgeworICAgICAgICAgICAgX2NoYXIgPSAiXyI7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2FuaXRpemVkTmFtZVtqXSA9IF9jaGFyOworICAgICAgICB9CisKKyAgICAgICAgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplZE5hbWUuam9pbigiIik7CisKKyAgICAgICAgaWYgKHNhbml0aXplZE5hbWUgPT09ICIiKSB7CisgICAgICAgICAgc2FuaXRpemVkTmFtZSA9ICJCYWRfRm9udF9OYW1lIjsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWVJbmRleC5hZGQoKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHNhbml0aXplZE5hbWUpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KG5hbWVJbmRleCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29tcGlsZVRvcERpY3RzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZVRvcERpY3RzKGRpY3RzLCBsZW5ndGgsIHJlbW92ZUNpZEtleXMpIHsKKyAgICAgIHZhciBmb250RGljdFRyYWNrZXJzID0gW107CisgICAgICB2YXIgZmRBcnJheUluZGV4ID0gbmV3IENGRkluZGV4KCk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgdmFyIGZvbnREaWN0ID0gZGljdHNbaV07CisKKyAgICAgICAgaWYgKHJlbW92ZUNpZEtleXMpIHsKKyAgICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIik7CisgICAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURGb250UmV2aXNpb24iKTsKKyAgICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRUeXBlIik7CisgICAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpOworICAgICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiVUlEQmFzZSIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZvbnREaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CisgICAgICAgIHZhciBmb250RGljdERhdGEgPSB0aGlzLmNvbXBpbGVEaWN0KGZvbnREaWN0LCBmb250RGljdFRyYWNrZXIpOworICAgICAgICBmb250RGljdFRyYWNrZXJzLnB1c2goZm9udERpY3RUcmFja2VyKTsKKyAgICAgICAgZmRBcnJheUluZGV4LmFkZChmb250RGljdERhdGEpOworICAgICAgICBmb250RGljdFRyYWNrZXIub2Zmc2V0KGxlbmd0aCk7CisgICAgICB9CisKKyAgICAgIGZkQXJyYXlJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGZkQXJyYXlJbmRleCwgZm9udERpY3RUcmFja2Vycyk7CisgICAgICByZXR1cm4geworICAgICAgICB0cmFja2VyczogZm9udERpY3RUcmFja2VycywKKyAgICAgICAgb3V0cHV0OiBmZEFycmF5SW5kZXgKKyAgICAgIH07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29tcGlsZVByaXZhdGVEaWN0cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGVQcml2YXRlRGljdHMoZGljdHMsIHRyYWNrZXJzLCBvdXRwdXQpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgdmFyIGZvbnREaWN0ID0gZGljdHNbaV07CisgICAgICAgIHZhciBwcml2YXRlRGljdCA9IGZvbnREaWN0LnByaXZhdGVEaWN0OworCisgICAgICAgIGlmICghcHJpdmF0ZURpY3QgfHwgIWZvbnREaWN0Lmhhc05hbWUoIlByaXZhdGUiKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVGhlcmUgbXVzdCBiZSBhIHByaXZhdGUgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwcml2YXRlRGljdFRyYWNrZXIgPSBuZXcgQ0ZGT2Zmc2V0VHJhY2tlcigpOworICAgICAgICB2YXIgcHJpdmF0ZURpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChwcml2YXRlRGljdCwgcHJpdmF0ZURpY3RUcmFja2VyKTsKKyAgICAgICAgdmFyIG91dHB1dExlbmd0aCA9IG91dHB1dC5sZW5ndGg7CisgICAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5vZmZzZXQob3V0cHV0TGVuZ3RoKTsKKworICAgICAgICBpZiAoIXByaXZhdGVEaWN0RGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICBvdXRwdXRMZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgdHJhY2tlcnNbaV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoLCBvdXRwdXRMZW5ndGhdLCBvdXRwdXQpOworICAgICAgICBvdXRwdXQuYWRkKHByaXZhdGVEaWN0RGF0YSk7CisKKyAgICAgICAgaWYgKHByaXZhdGVEaWN0LnN1YnJzSW5kZXggJiYgcHJpdmF0ZURpY3QuaGFzTmFtZSgiU3VicnMiKSkgeworICAgICAgICAgIHZhciBzdWJycyA9IHRoaXMuY29tcGlsZUluZGV4KHByaXZhdGVEaWN0LnN1YnJzSW5kZXgpOworICAgICAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJTdWJycyIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoXSwgb3V0cHV0KTsKKyAgICAgICAgICBvdXRwdXQuYWRkKHN1YnJzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImNvbXBpbGVEaWN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZURpY3QoZGljdCwgb2Zmc2V0VHJhY2tlcikgeworICAgICAgdmFyIG91dCA9IFtdOworICAgICAgdmFyIG9yZGVyID0gZGljdC5vcmRlcjsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7ICsraSkgeworICAgICAgICB2YXIga2V5ID0gb3JkZXJbaV07CisKKyAgICAgICAgaWYgKCEoa2V5IGluIGRpY3QudmFsdWVzKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHZhbHVlcyA9IGRpY3QudmFsdWVzW2tleV07CisgICAgICAgIHZhciB0eXBlcyA9IGRpY3QudHlwZXNba2V5XTsKKworICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7CisgICAgICAgICAgdHlwZXMgPSBbdHlwZXNdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHsKKyAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSB0eXBlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CisgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tqXTsKKyAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbal07CisKKyAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgIm51bSI6CisgICAgICAgICAgICBjYXNlICJzaWQiOgorICAgICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlKSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJvZmZzZXQiOgorICAgICAgICAgICAgICB2YXIgbmFtZSA9IGRpY3Qua2V5VG9OYW1lTWFwW2tleV07CisKKyAgICAgICAgICAgICAgaWYgKCFvZmZzZXRUcmFja2VyLmlzVHJhY2tpbmcobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLnRyYWNrKG5hbWUsIG91dC5sZW5ndGgpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdChbMHgxZCwgMCwgMCwgMCwgMF0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYXJyYXkiOgorICAgICAgICAgICAgY2FzZSAiZGVsdGEiOgorICAgICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlKSk7CisKKyAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDEsIGtrID0gdmFsdWVzLmxlbmd0aDsgayA8IGtrOyArK2spIHsKKyAgICAgICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlc1trXSkpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBkYXRhIHR5cGUgb2YgIi5jb25jYXQodHlwZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA9IG91dC5jb25jYXQoZGljdC5vcGNvZGVzW2tleV0pOworICAgICAgfQorCisgICAgICByZXR1cm4gb3V0OworICAgIH0KKyAgfSwgeworICAgIGtleTogImNvbXBpbGVTdHJpbmdJbmRleCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGVTdHJpbmdJbmRleChzdHJpbmdzKSB7CisgICAgICB2YXIgc3RyaW5nSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3RyaW5ncy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHN0cmluZ0luZGV4LmFkZCgoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoc3RyaW5nc1tpXSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgoc3RyaW5nSW5kZXgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNvbXBpbGVHbG9iYWxTdWJySW5kZXgiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlR2xvYmFsU3VickluZGV4KCkgeworICAgICAgdmFyIGdsb2JhbFN1YnJJbmRleCA9IHRoaXMuY2ZmLmdsb2JhbFN1YnJJbmRleDsKKyAgICAgIHRoaXMub3V0LndyaXRlQnl0ZUFycmF5KHRoaXMuY29tcGlsZUluZGV4KGdsb2JhbFN1YnJJbmRleCkpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNvbXBpbGVDaGFyU3RyaW5ncyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGVDaGFyU3RyaW5ncyhjaGFyU3RyaW5ncykgeworICAgICAgdmFyIGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFyU3RyaW5ncy5jb3VudDsgaSsrKSB7CisgICAgICAgIHZhciBnbHlwaCA9IGNoYXJTdHJpbmdzLmdldChpKTsKKworICAgICAgICBpZiAoZ2x5cGgubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgY2hhclN0cmluZ3NJbmRleC5hZGQobmV3IFVpbnQ4QXJyYXkoWzB4OGIsIDB4MGVdKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChjaGFyU3RyaW5nc0luZGV4KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjb21waWxlQ2hhcnNldCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGVDaGFyc2V0KGNoYXJzZXQsIG51bUdseXBocywgc3RyaW5ncywgaXNDSURGb250KSB7CisgICAgICB2YXIgb3V0OworICAgICAgdmFyIG51bUdseXBoc0xlc3NOb3REZWYgPSBudW1HbHlwaHMgLSAxOworCisgICAgICBpZiAoaXNDSURGb250KSB7CisgICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KFsyLCAwLCAwLCBudW1HbHlwaHNMZXNzTm90RGVmID4+IDggJiAweGZmLCBudW1HbHlwaHNMZXNzTm90RGVmICYgMHhmZl0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGxlbmd0aCA9IDEgKyBudW1HbHlwaHNMZXNzTm90RGVmICogMjsKKyAgICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKKyAgICAgICAgb3V0WzBdID0gMDsKKyAgICAgICAgdmFyIGNoYXJzZXRJbmRleCA9IDA7CisgICAgICAgIHZhciBudW1DaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldC5sZW5ndGg7CisgICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IG91dC5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgIHZhciBzaWQgPSAwOworCisgICAgICAgICAgaWYgKGNoYXJzZXRJbmRleCA8IG51bUNoYXJzZXRzKSB7CisgICAgICAgICAgICB2YXIgbmFtZSA9IGNoYXJzZXQuY2hhcnNldFtjaGFyc2V0SW5kZXgrK107CisgICAgICAgICAgICBzaWQgPSBzdHJpbmdzLmdldFNJRChuYW1lKTsKKworICAgICAgICAgICAgaWYgKHNpZCA9PT0gLTEpIHsKKyAgICAgICAgICAgICAgc2lkID0gMDsKKworICAgICAgICAgICAgICBpZiAoIXdhcm5lZCkgeworICAgICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJDb3VsZG4ndCBmaW5kICIuY29uY2F0KG5hbWUsICIgaW4gQ0ZGIHN0cmluZ3MiKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBvdXRbaV0gPSBzaWQgPj4gOCAmIDB4ZmY7CisgICAgICAgICAgb3V0W2kgKyAxXSA9IHNpZCAmIDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZVR5cGVkQXJyYXkob3V0KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjb21waWxlRW5jb2RpbmciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHsKKyAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGVuY29kaW5nLnJhdyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29tcGlsZUZEU2VsZWN0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZUZEU2VsZWN0KGZkU2VsZWN0KSB7CisgICAgICB2YXIgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0OworICAgICAgdmFyIG91dCwgaTsKKworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KDEgKyBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGgpOworICAgICAgICAgIG91dFswXSA9IGZvcm1hdDsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgb3V0W2kgKyAxXSA9IGZkU2VsZWN0LmZkU2VsZWN0W2ldOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICB2YXIgc3RhcnQgPSAwOworICAgICAgICAgIHZhciBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTsKKyAgICAgICAgICB2YXIgcmFuZ2VzID0gW2Zvcm1hdCwgMCwgMCwgc3RhcnQgPj4gOCAmIDB4ZmYsIHN0YXJ0ICYgMHhmZiwgbGFzdEZEXTsKKworICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdmFyIGN1cnJlbnRGRCA9IGZkU2VsZWN0LmZkU2VsZWN0W2ldOworCisgICAgICAgICAgICBpZiAoY3VycmVudEZEICE9PSBsYXN0RkQpIHsKKyAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7CisgICAgICAgICAgICAgIGxhc3RGRCA9IGN1cnJlbnRGRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7CisgICAgICAgICAgcmFuZ2VzWzFdID0gbnVtUmFuZ2VzID4+IDggJiAweGZmOworICAgICAgICAgIHJhbmdlc1syXSA9IG51bVJhbmdlcyAmIDB4ZmY7CisgICAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYpOworICAgICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHJhbmdlcyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KG91dCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY29tcGlsZVR5cGVkQXJyYXkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7CisgICAgICB2YXIgb3V0ID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICBvdXRbaV0gPSBkYXRhW2ldOworICAgICAgfQorCisgICAgICByZXR1cm4gb3V0OworICAgIH0KKyAgfSwgeworICAgIGtleTogImNvbXBpbGVJbmRleCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGVJbmRleChpbmRleCkgeworICAgICAgdmFyIHRyYWNrZXJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTsKKyAgICAgIHZhciBvYmplY3RzID0gaW5kZXgub2JqZWN0czsKKyAgICAgIHZhciBjb3VudCA9IG9iamVjdHMubGVuZ3RoOworCisgICAgICBpZiAoY291bnQgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIFswLCAwLCAwXTsKKyAgICAgIH0KKworICAgICAgdmFyIGRhdGEgPSBbY291bnQgPj4gOCAmIDB4ZmYsIGNvdW50ICYgMHhmZl07CisgICAgICB2YXIgbGFzdE9mZnNldCA9IDEsCisgICAgICAgICAgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgbGFzdE9mZnNldCArPSBvYmplY3RzW2ldLmxlbmd0aDsKKyAgICAgIH0KKworICAgICAgdmFyIG9mZnNldFNpemU7CisKKyAgICAgIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDApIHsKKyAgICAgICAgb2Zmc2V0U2l6ZSA9IDE7CisgICAgICB9IGVsc2UgaWYgKGxhc3RPZmZzZXQgPCAweDEwMDAwKSB7CisgICAgICAgIG9mZnNldFNpemUgPSAyOworICAgICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMDAwKSB7CisgICAgICAgIG9mZnNldFNpemUgPSAzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb2Zmc2V0U2l6ZSA9IDQ7CisgICAgICB9CisKKyAgICAgIGRhdGEucHVzaChvZmZzZXRTaXplKTsKKyAgICAgIHZhciByZWxhdGl2ZU9mZnNldCA9IDE7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCArIDE7IGkrKykgeworICAgICAgICBpZiAob2Zmc2V0U2l6ZSA9PT0gMSkgeworICAgICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOworICAgICAgICB9IGVsc2UgaWYgKG9mZnNldFNpemUgPT09IDIpIHsKKyAgICAgICAgICBkYXRhLnB1c2gocmVsYXRpdmVPZmZzZXQgPj4gOCAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZik7CisgICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0U2l6ZSA9PT0gMykgeworICAgICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQgJiAweGZmLCByZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9iamVjdHNbaV0pIHsKKyAgICAgICAgICByZWxhdGl2ZU9mZnNldCArPSBvYmplY3RzW2ldLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpZiAodHJhY2tlcnNbaV0pIHsKKyAgICAgICAgICB0cmFja2Vyc1tpXS5vZmZzZXQoZGF0YS5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gb2JqZWN0c1tpXS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgZGF0YS5wdXNoKG9iamVjdHNbaV1bal0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgfV0sIFt7CisgICAga2V5OiAiRW5jb2RlRmxvYXRSZWdFeHAiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJFbmNvZGVGbG9hdFJlZ0V4cCIsIC9cLihcZCo/KSg/Ojl7NSwyMH18MHs1LDIwfSlcZHswLDJ9KD86ZSguKyl8JCkvKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQ0ZGQ29tcGlsZXI7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGQ29tcGlsZXIgPSBDRkZDb21waWxlcjsKKworLyoqKi8gfSksCisvKiAyMjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5FeHBlcnRTdWJzZXRDaGFyc2V0ID0gZXhwb3J0cy5FeHBlcnRDaGFyc2V0ID0gZXhwb3J0cy5JU09BZG9iZUNoYXJzZXQgPSB2b2lkIDA7Cit2YXIgSVNPQWRvYmVDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iXTsKK2V4cG9ydHMuSVNPQWRvYmVDaGFyc2V0ID0gSVNPQWRvYmVDaGFyc2V0OwordmFyIEV4cGVydENoYXJzZXQgPSBbIi5ub3RkZWYiLCAic3BhY2UiLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLCAiRGllcmVzaXNzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIiwgIkFncmF2ZXNtYWxsIiwgIkFhY3V0ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXJpbmdzbWFsbCIsICJBRXNtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIkV0aHNtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT3RpbGRlc21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT0VzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJVZ3JhdmVzbWFsbCIsICJVYWN1dGVzbWFsbCIsICJVY2lyY3VtZmxleHNtYWxsIiwgIlVkaWVyZXNpc3NtYWxsIiwgIllhY3V0ZXNtYWxsIiwgIlRob3Juc21hbGwiLCAiWWRpZXJlc2lzc21hbGwiXTsKK2V4cG9ydHMuRXhwZXJ0Q2hhcnNldCA9IEV4cGVydENoYXJzZXQ7Cit2YXIgRXhwZXJ0U3Vic2V0Q2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgImlzdXBlcmlvciIsICJsc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJ0c3VwZXJpb3IiLCAiZmYiLCAiZmkiLCAiZmwiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiaHlwaGVuc3VwZXJpb3IiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgImNlbnRvbGRzdHlsZSIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIl07CitleHBvcnRzLkV4cGVydFN1YnNldENoYXJzZXQgPSBFeHBlcnRTdWJzZXRDaGFyc2V0OworCisvKioqLyB9KSwKKy8qIDIzMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldEVuY29kaW5nID0gZ2V0RW5jb2Rpbmc7CitleHBvcnRzLkV4cGVydEVuY29kaW5nID0gZXhwb3J0cy5aYXBmRGluZ2JhdHNFbmNvZGluZyA9IGV4cG9ydHMuU3ltYm9sU2V0RW5jb2RpbmcgPSBleHBvcnRzLk1hY1JvbWFuRW5jb2RpbmcgPSBleHBvcnRzLlN0YW5kYXJkRW5jb2RpbmcgPSBleHBvcnRzLldpbkFuc2lFbmNvZGluZyA9IHZvaWQgMDsKK3ZhciBFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICIiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgIiIsICIiLCAiIiwgImlzdXBlcmlvciIsICIiLCAiIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICIiLCAiIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbnN1cGVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIlNjYXJvbnNtYWxsIiwgIlpjYXJvbnNtYWxsIiwgIkRpZXJlc2lzc21hbGwiLCAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIiIsICJEb3RhY2NlbnRzbWFsbCIsICIiLCAiIiwgIk1hY3JvbnNtYWxsIiwgIiIsICIiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICIiLCAiIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiemVyb3N1cGVyaW9yIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIl07CitleHBvcnRzLkV4cGVydEVuY29kaW5nID0gRXhwZXJ0RW5jb2Rpbmc7Cit2YXIgTWFjRXhwZXJ0RW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiY2VudG9sZHN0eWxlIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgImFtcGVyc2FuZHNtYWxsIiwgIkFjdXRlc21hbGwiLCAicGFyZW5sZWZ0c3VwZXJpb3IiLCAicGFyZW5yaWdodHN1cGVyaW9yIiwgInR3b2RvdGVubGVhZGVyIiwgIm9uZWRvdGVubGVhZGVyIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAiZnJhY3Rpb24iLCAiemVyb29sZHN0eWxlIiwgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwgImZpdmVvbGRzdHlsZSIsICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICIiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICIiLCAicXVlc3Rpb25zbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiRXRoc21hbGwiLCAiIiwgIiIsICJvbmVxdWFydGVyIiwgIm9uZWhhbGYiLCAidGhyZWVxdWFydGVycyIsICJvbmVlaWdodGgiLCAidGhyZWVlaWdodGhzIiwgImZpdmVlaWdodGhzIiwgInNldmVuZWlnaHRocyIsICJvbmV0aGlyZCIsICJ0d290aGlyZHMiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiZmYiLCAiZmkiLCAiZmwiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsICIiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5pbmZlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiIiwgIiIsICJhc3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgIiIsICIiLCAiIiwgIiIsICJBYWN1dGVzbWFsbCIsICJBZ3JhdmVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFyaW5nc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIklncmF2ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJVYWN1dGVzbWFsbCIsICJVZ3JhdmVzbWFsbCIsICJVY2lyY3VtZmxleHNtYWxsIiwgIlVkaWVyZXNpc3NtYWxsIiwgIiIsICJlaWdodHN1cGVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJTY2Fyb25zbWFsbCIsICIiLCAiY2VudGluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgIiIsICJEaWVyZXNpc3NtYWxsIiwgIiIsICJDYXJvbnNtYWxsIiwgIm9zdXBlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAiIiwgImNvbW1haW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiWWFjdXRlc21hbGwiLCAiIiwgImRvbGxhcmluZmVyaW9yIiwgIiIsICIiLCAiVGhvcm5zbWFsbCIsICIiLCAibmluZWluZmVyaW9yIiwgInplcm9pbmZlcmlvciIsICJaY2Fyb25zbWFsbCIsICJBRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWluZmVyaW9yIiwgIkxzbGFzaHNtYWxsIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIkNlZGlsbGFzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIk9Fc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5zdXBlcmlvciIsICIiLCAiIiwgIiIsICIiLCAiZXhjbGFtZG93bnNtYWxsIiwgIiIsICJZZGllcmVzaXNzbWFsbCIsICIiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9zdXBlcmlvciIsICIiLCAiZXN1cGVyaW9yIiwgInJzdXBlcmlvciIsICJ0c3VwZXJpb3IiLCAiIiwgIiIsICJpc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgImRzdXBlcmlvciIsICIiLCAiIiwgIiIsICIiLCAiIiwgImxzdXBlcmlvciIsICJPZ29uZWtzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIk1hY3JvbnNtYWxsIiwgImJzdXBlcmlvciIsICJuc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwgImNvbW1hc3VwZXJpb3IiLCAicGVyaW9kc3VwZXJpb3IiLCAiRG90YWNjZW50c21hbGwiLCAiUmluZ3NtYWxsIiwgIiIsICIiLCAiIiwgIiJdOwordmFyIE1hY1JvbWFuRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3Rlc2luZ2xlIiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiIiwgIkFkaWVyZXNpcyIsICJBcmluZyIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLCAiYWFjdXRlIiwgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvdGlsZGUiLCAidWFjdXRlIiwgInVncmF2ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLCAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwgInJlZ2lzdGVyZWQiLCAiY29weXJpZ2h0IiwgInRyYWRlbWFyayIsICJhY3V0ZSIsICJkaWVyZXNpcyIsICJub3RlcXVhbCIsICJBRSIsICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLCAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsICJwcm9kdWN0IiwgInBpIiwgImludGVncmFsIiwgIm9yZGZlbWluaW5lIiwgIm9yZG1hc2N1bGluZSIsICJPbWVnYSIsICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsICJyYWRpY2FsIiwgImZsb3JpbiIsICJhcHByb3hlcXVhbCIsICJEZWx0YSIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInNwYWNlIiwgIkFncmF2ZSIsICJBdGlsZGUiLCAiT3RpbGRlIiwgIk9FIiwgIm9lIiwgImVuZGFzaCIsICJlbWRhc2giLCAicXVvdGVkYmxsZWZ0IiwgInF1b3RlZGJscmlnaHQiLCAicXVvdGVsZWZ0IiwgInF1b3RlcmlnaHQiLCAiZGl2aWRlIiwgImxvemVuZ2UiLCAieWRpZXJlc2lzIiwgIllkaWVyZXNpcyIsICJmcmFjdGlvbiIsICJjdXJyZW5jeSIsICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwgImZsIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicGVydGhvdXNhbmQiLCAiQWNpcmN1bWZsZXgiLCAiRWNpcmN1bWZsZXgiLCAiQWFjdXRlIiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgImFwcGxlIiwgIk9ncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWdyYXZlIiwgImRvdGxlc3NpIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJjYXJvbiJdOworZXhwb3J0cy5NYWNSb21hbkVuY29kaW5nID0gTWFjUm9tYW5FbmNvZGluZzsKK3ZhciBTdGFuZGFyZEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiIiwgImVuZGFzaCIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgIiIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgIiIsICJxdWVzdGlvbmRvd24iLCAiIiwgImdyYXZlIiwgImFjdXRlIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJkaWVyZXNpcyIsICIiLCAicmluZyIsICJjZWRpbGxhIiwgIiIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiQUUiLCAiIiwgIm9yZGZlbWluaW5lIiwgIiIsICIiLCAiIiwgIiIsICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICIiLCAiIiwgIiIsICIiLCAiIiwgImFlIiwgIiIsICIiLCAiIiwgImRvdGxlc3NpIiwgIiIsICIiLCAibHNsYXNoIiwgIm9zbGFzaCIsICJvZSIsICJnZXJtYW5kYmxzIiwgIiIsICIiLCAiIiwgIiJdOworZXhwb3J0cy5TdGFuZGFyZEVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKK3ZhciBXaW5BbnNpRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3Rlc2luZ2xlIiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiYnVsbGV0IiwgIkV1cm8iLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgImZsb3JpbiIsICJxdW90ZWRibGJhc2UiLCAiZWxsaXBzaXMiLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJjaXJjdW1mbGV4IiwgInBlcnRob3VzYW5kIiwgIlNjYXJvbiIsICJndWlsc2luZ2xsZWZ0IiwgIk9FIiwgImJ1bGxldCIsICJaY2Fyb24iLCAiYnVsbGV0IiwgImJ1bGxldCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJidWxsZXQiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJ0aWxkZSIsICJ0cmFkZW1hcmsiLCAic2Nhcm9uIiwgImd1aWxzaW5nbHJpZ2h0IiwgIm9lIiwgImJ1bGxldCIsICJ6Y2Fyb24iLCAiWWRpZXJlc2lzIiwgInNwYWNlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJjdXJyZW5jeSIsICJ5ZW4iLCAiYnJva2VuYmFyIiwgInNlY3Rpb24iLCAiZGllcmVzaXMiLCAiY29weXJpZ2h0IiwgIm9yZGZlbWluaW5lIiwgImd1aWxsZW1vdGxlZnQiLCAibG9naWNhbG5vdCIsICJoeXBoZW4iLCAicmVnaXN0ZXJlZCIsICJtYWNyb24iLCAiZGVncmVlIiwgInBsdXNtaW51cyIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImFjdXRlIiwgIm11IiwgInBhcmFncmFwaCIsICJwZXJpb2RjZW50ZXJlZCIsICJjZWRpbGxhIiwgIm9uZXN1cGVyaW9yIiwgIm9yZG1hc2N1bGluZSIsICJndWlsbGVtb3RyaWdodCIsICJvbmVxdWFydGVyIiwgIm9uZWhhbGYiLCAidGhyZWVxdWFydGVycyIsICJxdWVzdGlvbmRvd24iLCAiQWdyYXZlIiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBdGlsZGUiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkFFIiwgIkNjZWRpbGxhIiwgIkVncmF2ZSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIklncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIkV0aCIsICJOdGlsZGUiLCAiT2dyYXZlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJPdGlsZGUiLCAiT2RpZXJlc2lzIiwgIm11bHRpcGx5IiwgIk9zbGFzaCIsICJVZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVkaWVyZXNpcyIsICJZYWN1dGUiLCAiVGhvcm4iLCAiZ2VybWFuZGJscyIsICJhZ3JhdmUiLCAiYWFjdXRlIiwgImFjaXJjdW1mbGV4IiwgImF0aWxkZSIsICJhZGllcmVzaXMiLCAiYXJpbmciLCAiYWUiLCAiY2NlZGlsbGEiLCAiZWdyYXZlIiwgImVhY3V0ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWdyYXZlIiwgImlhY3V0ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAiZXRoIiwgIm50aWxkZSIsICJvZ3JhdmUiLCAib2FjdXRlIiwgIm9jaXJjdW1mbGV4IiwgIm90aWxkZSIsICJvZGllcmVzaXMiLCAiZGl2aWRlIiwgIm9zbGFzaCIsICJ1Z3JhdmUiLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ5YWN1dGUiLCAidGhvcm4iLCAieWRpZXJlc2lzIl07CitleHBvcnRzLldpbkFuc2lFbmNvZGluZyA9IFdpbkFuc2lFbmNvZGluZzsKK3ZhciBTeW1ib2xTZXRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAidW5pdmVyc2FsIiwgIm51bWJlcnNpZ24iLCAiZXhpc3RlbnRpYWwiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAic3VjaHRoYXQiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2ttYXRoIiwgInBsdXMiLCAiY29tbWEiLCAibWludXMiLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJjb25ncnVlbnQiLCAiQWxwaGEiLCAiQmV0YSIsICJDaGkiLCAiRGVsdGEiLCAiRXBzaWxvbiIsICJQaGkiLCAiR2FtbWEiLCAiRXRhIiwgIklvdGEiLCAidGhldGExIiwgIkthcHBhIiwgIkxhbWJkYSIsICJNdSIsICJOdSIsICJPbWljcm9uIiwgIlBpIiwgIlRoZXRhIiwgIlJobyIsICJTaWdtYSIsICJUYXUiLCAiVXBzaWxvbiIsICJzaWdtYTEiLCAiT21lZ2EiLCAiWGkiLCAiUHNpIiwgIlpldGEiLCAiYnJhY2tldGxlZnQiLCAidGhlcmVmb3JlIiwgImJyYWNrZXRyaWdodCIsICJwZXJwZW5kaWN1bGFyIiwgInVuZGVyc2NvcmUiLCAicmFkaWNhbGV4IiwgImFscGhhIiwgImJldGEiLCAiY2hpIiwgImRlbHRhIiwgImVwc2lsb24iLCAicGhpIiwgImdhbW1hIiwgImV0YSIsICJpb3RhIiwgInBoaTEiLCAia2FwcGEiLCAibGFtYmRhIiwgIm11IiwgIm51IiwgIm9taWNyb24iLCAicGkiLCAidGhldGEiLCAicmhvIiwgInNpZ21hIiwgInRhdSIsICJ1cHNpbG9uIiwgIm9tZWdhMSIsICJvbWVnYSIsICJ4aSIsICJwc2kiLCAiemV0YSIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAic2ltaWxhciIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJFdXJvIiwgIlVwc2lsb24xIiwgIm1pbnV0ZSIsICJsZXNzZXF1YWwiLCAiZnJhY3Rpb24iLCAiaW5maW5pdHkiLCAiZmxvcmluIiwgImNsdWIiLCAiZGlhbW9uZCIsICJoZWFydCIsICJzcGFkZSIsICJhcnJvd2JvdGgiLCAiYXJyb3dsZWZ0IiwgImFycm93dXAiLCAiYXJyb3dyaWdodCIsICJhcnJvd2Rvd24iLCAiZGVncmVlIiwgInBsdXNtaW51cyIsICJzZWNvbmQiLCAiZ3JlYXRlcmVxdWFsIiwgIm11bHRpcGx5IiwgInByb3BvcnRpb25hbCIsICJwYXJ0aWFsZGlmZiIsICJidWxsZXQiLCAiZGl2aWRlIiwgIm5vdGVxdWFsIiwgImVxdWl2YWxlbmNlIiwgImFwcHJveGVxdWFsIiwgImVsbGlwc2lzIiwgImFycm93dmVydGV4IiwgImFycm93aG9yaXpleCIsICJjYXJyaWFnZXJldHVybiIsICJhbGVwaCIsICJJZnJha3R1ciIsICJSZnJha3R1ciIsICJ3ZWllcnN0cmFzcyIsICJjaXJjbGVtdWx0aXBseSIsICJjaXJjbGVwbHVzIiwgImVtcHR5c2V0IiwgImludGVyc2VjdGlvbiIsICJ1bmlvbiIsICJwcm9wZXJzdXBlcnNldCIsICJyZWZsZXhzdXBlcnNldCIsICJub3RzdWJzZXQiLCAicHJvcGVyc3Vic2V0IiwgInJlZmxleHN1YnNldCIsICJlbGVtZW50IiwgIm5vdGVsZW1lbnQiLCAiYW5nbGUiLCAiZ3JhZGllbnQiLCAicmVnaXN0ZXJzZXJpZiIsICJjb3B5cmlnaHRzZXJpZiIsICJ0cmFkZW1hcmtzZXJpZiIsICJwcm9kdWN0IiwgInJhZGljYWwiLCAiZG90bWF0aCIsICJsb2dpY2Fsbm90IiwgImxvZ2ljYWxhbmQiLCAibG9naWNhbG9yIiwgImFycm93ZGJsYm90aCIsICJhcnJvd2RibGxlZnQiLCAiYXJyb3dkYmx1cCIsICJhcnJvd2RibHJpZ2h0IiwgImFycm93ZGJsZG93biIsICJsb3plbmdlIiwgImFuZ2xlbGVmdCIsICJyZWdpc3RlcnNhbnMiLCAiY29weXJpZ2h0c2FucyIsICJ0cmFkZW1hcmtzYW5zIiwgInN1bW1hdGlvbiIsICJwYXJlbmxlZnR0cCIsICJwYXJlbmxlZnRleCIsICJwYXJlbmxlZnRidCIsICJicmFja2V0bGVmdHRwIiwgImJyYWNrZXRsZWZ0ZXgiLCAiYnJhY2tldGxlZnRidCIsICJicmFjZWxlZnR0cCIsICJicmFjZWxlZnRtaWQiLCAiYnJhY2VsZWZ0YnQiLCAiYnJhY2VleCIsICIiLCAiYW5nbGVyaWdodCIsICJpbnRlZ3JhbCIsICJpbnRlZ3JhbHRwIiwgImludGVncmFsZXgiLCAiaW50ZWdyYWxidCIsICJwYXJlbnJpZ2h0dHAiLCAicGFyZW5yaWdodGV4IiwgInBhcmVucmlnaHRidCIsICJicmFja2V0cmlnaHR0cCIsICJicmFja2V0cmlnaHRleCIsICJicmFja2V0cmlnaHRidCIsICJicmFjZXJpZ2h0dHAiLCAiYnJhY2VyaWdodG1pZCIsICJicmFjZXJpZ2h0YnQiLCAiIl07CitleHBvcnRzLlN5bWJvbFNldEVuY29kaW5nID0gU3ltYm9sU2V0RW5jb2Rpbmc7Cit2YXIgWmFwZkRpbmdiYXRzRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiYTEiLCAiYTIiLCAiYTIwMiIsICJhMyIsICJhNCIsICJhNSIsICJhMTE5IiwgImExMTgiLCAiYTExNyIsICJhMTEiLCAiYTEyIiwgImExMyIsICJhMTQiLCAiYTE1IiwgImExNiIsICJhMTA1IiwgImExNyIsICJhMTgiLCAiYTE5IiwgImEyMCIsICJhMjEiLCAiYTIyIiwgImEyMyIsICJhMjQiLCAiYTI1IiwgImEyNiIsICJhMjciLCAiYTI4IiwgImE2IiwgImE3IiwgImE4IiwgImE5IiwgImExMCIsICJhMjkiLCAiYTMwIiwgImEzMSIsICJhMzIiLCAiYTMzIiwgImEzNCIsICJhMzUiLCAiYTM2IiwgImEzNyIsICJhMzgiLCAiYTM5IiwgImE0MCIsICJhNDEiLCAiYTQyIiwgImE0MyIsICJhNDQiLCAiYTQ1IiwgImE0NiIsICJhNDciLCAiYTQ4IiwgImE0OSIsICJhNTAiLCAiYTUxIiwgImE1MiIsICJhNTMiLCAiYTU0IiwgImE1NSIsICJhNTYiLCAiYTU3IiwgImE1OCIsICJhNTkiLCAiYTYwIiwgImE2MSIsICJhNjIiLCAiYTYzIiwgImE2NCIsICJhNjUiLCAiYTY2IiwgImE2NyIsICJhNjgiLCAiYTY5IiwgImE3MCIsICJhNzEiLCAiYTcyIiwgImE3MyIsICJhNzQiLCAiYTIwMyIsICJhNzUiLCAiYTIwNCIsICJhNzYiLCAiYTc3IiwgImE3OCIsICJhNzkiLCAiYTgxIiwgImE4MiIsICJhODMiLCAiYTg0IiwgImE5NyIsICJhOTgiLCAiYTk5IiwgImExMDAiLCAiIiwgImE4OSIsICJhOTAiLCAiYTkzIiwgImE5NCIsICJhOTEiLCAiYTkyIiwgImEyMDUiLCAiYTg1IiwgImEyMDYiLCAiYTg2IiwgImE4NyIsICJhODgiLCAiYTk1IiwgImE5NiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiYTEwMSIsICJhMTAyIiwgImExMDMiLCAiYTEwNCIsICJhMTA2IiwgImExMDciLCAiYTEwOCIsICJhMTEyIiwgImExMTEiLCAiYTExMCIsICJhMTA5IiwgImExMjAiLCAiYTEyMSIsICJhMTIyIiwgImExMjMiLCAiYTEyNCIsICJhMTI1IiwgImExMjYiLCAiYTEyNyIsICJhMTI4IiwgImExMjkiLCAiYTEzMCIsICJhMTMxIiwgImExMzIiLCAiYTEzMyIsICJhMTM0IiwgImExMzUiLCAiYTEzNiIsICJhMTM3IiwgImExMzgiLCAiYTEzOSIsICJhMTQwIiwgImExNDEiLCAiYTE0MiIsICJhMTQzIiwgImExNDQiLCAiYTE0NSIsICJhMTQ2IiwgImExNDciLCAiYTE0OCIsICJhMTQ5IiwgImExNTAiLCAiYTE1MSIsICJhMTUyIiwgImExNTMiLCAiYTE1NCIsICJhMTU1IiwgImExNTYiLCAiYTE1NyIsICJhMTU4IiwgImExNTkiLCAiYTE2MCIsICJhMTYxIiwgImExNjMiLCAiYTE2NCIsICJhMTk2IiwgImExNjUiLCAiYTE5MiIsICJhMTY2IiwgImExNjciLCAiYTE2OCIsICJhMTY5IiwgImExNzAiLCAiYTE3MSIsICJhMTcyIiwgImExNzMiLCAiYTE2MiIsICJhMTc0IiwgImExNzUiLCAiYTE3NiIsICJhMTc3IiwgImExNzgiLCAiYTE3OSIsICJhMTkzIiwgImExODAiLCAiYTE5OSIsICJhMTgxIiwgImEyMDAiLCAiYTE4MiIsICIiLCAiYTIwMSIsICJhMTgzIiwgImExODQiLCAiYTE5NyIsICJhMTg1IiwgImExOTQiLCAiYTE5OCIsICJhMTg2IiwgImExOTUiLCAiYTE4NyIsICJhMTg4IiwgImExODkiLCAiYTE5MCIsICJhMTkxIiwgIiJdOworZXhwb3J0cy5aYXBmRGluZ2JhdHNFbmNvZGluZyA9IFphcGZEaW5nYmF0c0VuY29kaW5nOworCitmdW5jdGlvbiBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpIHsKKyAgc3dpdGNoIChlbmNvZGluZ05hbWUpIHsKKyAgICBjYXNlICJXaW5BbnNpRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFdpbkFuc2lFbmNvZGluZzsKKworICAgIGNhc2UgIlN0YW5kYXJkRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFN0YW5kYXJkRW5jb2Rpbmc7CisKKyAgICBjYXNlICJNYWNSb21hbkVuY29kaW5nIjoKKyAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nOworCisgICAgY2FzZSAiU3ltYm9sU2V0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIFN5bWJvbFNldEVuY29kaW5nOworCisgICAgY2FzZSAiWmFwZkRpbmdiYXRzRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFphcGZEaW5nYmF0c0VuY29kaW5nOworCisgICAgY2FzZSAiRXhwZXJ0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIEV4cGVydEVuY29kaW5nOworCisgICAgY2FzZSAiTWFjRXhwZXJ0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxsOworICB9Cit9CisKKy8qKiovIH0pLAorLyogMjMxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnZXRMb29rdXBUYWJsZUZhY3RvcnkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSkuZ2V0TG9va3VwVGFibGVGYWN0b3J5OwordmFyIGdldEdseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKKyB0LkEgPSAweDAwNDE7CisgdC5BRSA9IDB4MDBjNjsKKyB0LkFFYWN1dGUgPSAweDAxZmM7CisgdC5BRW1hY3JvbiA9IDB4MDFlMjsKKyB0LkFFc21hbGwgPSAweGY3ZTY7CisgdC5BYWN1dGUgPSAweDAwYzE7CisgdC5BYWN1dGVzbWFsbCA9IDB4ZjdlMTsKKyB0LkFicmV2ZSA9IDB4MDEwMjsKKyB0LkFicmV2ZWFjdXRlID0gMHgxZWFlOworIHQuQWJyZXZlY3lyaWxsaWMgPSAweDA0ZDA7CisgdC5BYnJldmVkb3RiZWxvdyA9IDB4MWViNjsKKyB0LkFicmV2ZWdyYXZlID0gMHgxZWIwOworIHQuQWJyZXZlaG9va2Fib3ZlID0gMHgxZWIyOworIHQuQWJyZXZldGlsZGUgPSAweDFlYjQ7CisgdC5BY2Fyb24gPSAweDAxY2Q7CisgdC5BY2lyY2xlID0gMHgyNGI2OworIHQuQWNpcmN1bWZsZXggPSAweDAwYzI7CisgdC5BY2lyY3VtZmxleGFjdXRlID0gMHgxZWE0OworIHQuQWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVhYzsKKyB0LkFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTY7CisgdC5BY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVhODsKKyB0LkFjaXJjdW1mbGV4c21hbGwgPSAweGY3ZTI7CisgdC5BY2lyY3VtZmxleHRpbGRlID0gMHgxZWFhOworIHQuQWN1dGUgPSAweGY2Yzk7CisgdC5BY3V0ZXNtYWxsID0gMHhmN2I0OworIHQuQWN5cmlsbGljID0gMHgwNDEwOworIHQuQWRibGdyYXZlID0gMHgwMjAwOworIHQuQWRpZXJlc2lzID0gMHgwMGM0OworIHQuQWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDI7CisgdC5BZGllcmVzaXNtYWNyb24gPSAweDAxZGU7CisgdC5BZGllcmVzaXNzbWFsbCA9IDB4ZjdlNDsKKyB0LkFkb3RiZWxvdyA9IDB4MWVhMDsKKyB0LkFkb3RtYWNyb24gPSAweDAxZTA7CisgdC5BZ3JhdmUgPSAweDAwYzA7CisgdC5BZ3JhdmVzbWFsbCA9IDB4ZjdlMDsKKyB0LkFob29rYWJvdmUgPSAweDFlYTI7CisgdC5BaWVjeXJpbGxpYyA9IDB4MDRkNDsKKyB0LkFpbnZlcnRlZGJyZXZlID0gMHgwMjAyOworIHQuQWxwaGEgPSAweDAzOTE7CisgdC5BbHBoYXRvbm9zID0gMHgwMzg2OworIHQuQW1hY3JvbiA9IDB4MDEwMDsKKyB0LkFtb25vc3BhY2UgPSAweGZmMjE7CisgdC5Bb2dvbmVrID0gMHgwMTA0OworIHQuQXJpbmcgPSAweDAwYzU7CisgdC5BcmluZ2FjdXRlID0gMHgwMWZhOworIHQuQXJpbmdiZWxvdyA9IDB4MWUwMDsKKyB0LkFyaW5nc21hbGwgPSAweGY3ZTU7CisgdC5Bc21hbGwgPSAweGY3NjE7CisgdC5BdGlsZGUgPSAweDAwYzM7CisgdC5BdGlsZGVzbWFsbCA9IDB4ZjdlMzsKKyB0LkF5YmFybWVuaWFuID0gMHgwNTMxOworIHQuQiA9IDB4MDA0MjsKKyB0LkJjaXJjbGUgPSAweDI0Yjc7CisgdC5CZG90YWNjZW50ID0gMHgxZTAyOworIHQuQmRvdGJlbG93ID0gMHgxZTA0OworIHQuQmVjeXJpbGxpYyA9IDB4MDQxMTsKKyB0LkJlbmFybWVuaWFuID0gMHgwNTMyOworIHQuQmV0YSA9IDB4MDM5MjsKKyB0LkJob29rID0gMHgwMTgxOworIHQuQmxpbmViZWxvdyA9IDB4MWUwNjsKKyB0LkJtb25vc3BhY2UgPSAweGZmMjI7CisgdC5CcmV2ZXNtYWxsID0gMHhmNmY0OworIHQuQnNtYWxsID0gMHhmNzYyOworIHQuQnRvcGJhciA9IDB4MDE4MjsKKyB0LkMgPSAweDAwNDM7CisgdC5DYWFybWVuaWFuID0gMHgwNTNlOworIHQuQ2FjdXRlID0gMHgwMTA2OworIHQuQ2Fyb24gPSAweGY2Y2E7CisgdC5DYXJvbnNtYWxsID0gMHhmNmY1OworIHQuQ2Nhcm9uID0gMHgwMTBjOworIHQuQ2NlZGlsbGEgPSAweDAwYzc7CisgdC5DY2VkaWxsYWFjdXRlID0gMHgxZTA4OworIHQuQ2NlZGlsbGFzbWFsbCA9IDB4ZjdlNzsKKyB0LkNjaXJjbGUgPSAweDI0Yjg7CisgdC5DY2lyY3VtZmxleCA9IDB4MDEwODsKKyB0LkNkb3QgPSAweDAxMGE7CisgdC5DZG90YWNjZW50ID0gMHgwMTBhOworIHQuQ2VkaWxsYXNtYWxsID0gMHhmN2I4OworIHQuQ2hhYXJtZW5pYW4gPSAweDA1NDk7CisgdC5DaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiYzsKKyB0LkNoZWN5cmlsbGljID0gMHgwNDI3OworIHQuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmU7CisgdC5DaGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiNjsKKyB0LkNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjQ7CisgdC5DaGVoYXJtZW5pYW4gPSAweDA1NDM7CisgdC5DaGVraGFrYXNzaWFuY3lyaWxsaWMgPSAweDA0Y2I7CisgdC5DaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI4OworIHQuQ2hpID0gMHgwM2E3OworIHQuQ2hvb2sgPSAweDAxODc7CisgdC5DaXJjdW1mbGV4c21hbGwgPSAweGY2ZjY7CisgdC5DbW9ub3NwYWNlID0gMHhmZjIzOworIHQuQ29hcm1lbmlhbiA9IDB4MDU1MTsKKyB0LkNzbWFsbCA9IDB4Zjc2MzsKKyB0LkQgPSAweDAwNDQ7CisgdC5EWiA9IDB4MDFmMTsKKyB0LkRaY2Fyb24gPSAweDAxYzQ7CisgdC5EYWFybWVuaWFuID0gMHgwNTM0OworIHQuRGFmcmljYW4gPSAweDAxODk7CisgdC5EY2Fyb24gPSAweDAxMGU7CisgdC5EY2VkaWxsYSA9IDB4MWUxMDsKKyB0LkRjaXJjbGUgPSAweDI0Yjk7CisgdC5EY2lyY3VtZmxleGJlbG93ID0gMHgxZTEyOworIHQuRGNyb2F0ID0gMHgwMTEwOworIHQuRGRvdGFjY2VudCA9IDB4MWUwYTsKKyB0LkRkb3RiZWxvdyA9IDB4MWUwYzsKKyB0LkRlY3lyaWxsaWMgPSAweDA0MTQ7CisgdC5EZWljb3B0aWMgPSAweDAzZWU7CisgdC5EZWx0YSA9IDB4MjIwNjsKKyB0LkRlbHRhZ3JlZWsgPSAweDAzOTQ7CisgdC5EaG9vayA9IDB4MDE4YTsKKyB0LkRpZXJlc2lzID0gMHhmNmNiOworIHQuRGllcmVzaXNBY3V0ZSA9IDB4ZjZjYzsKKyB0LkRpZXJlc2lzR3JhdmUgPSAweGY2Y2Q7CisgdC5EaWVyZXNpc3NtYWxsID0gMHhmN2E4OworIHQuRGlnYW1tYWdyZWVrID0gMHgwM2RjOworIHQuRGplY3lyaWxsaWMgPSAweDA0MDI7CisgdC5EbGluZWJlbG93ID0gMHgxZTBlOworIHQuRG1vbm9zcGFjZSA9IDB4ZmYyNDsKKyB0LkRvdGFjY2VudHNtYWxsID0gMHhmNmY3OworIHQuRHNsYXNoID0gMHgwMTEwOworIHQuRHNtYWxsID0gMHhmNzY0OworIHQuRHRvcGJhciA9IDB4MDE4YjsKKyB0LkR6ID0gMHgwMWYyOworIHQuRHpjYXJvbiA9IDB4MDFjNTsKKyB0LkR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUwOworIHQuRHplY3lyaWxsaWMgPSAweDA0MDU7CisgdC5EemhlY3lyaWxsaWMgPSAweDA0MGY7CisgdC5FID0gMHgwMDQ1OworIHQuRWFjdXRlID0gMHgwMGM5OworIHQuRWFjdXRlc21hbGwgPSAweGY3ZTk7CisgdC5FYnJldmUgPSAweDAxMTQ7CisgdC5FY2Fyb24gPSAweDAxMWE7CisgdC5FY2VkaWxsYWJyZXZlID0gMHgxZTFjOworIHQuRWNoYXJtZW5pYW4gPSAweDA1MzU7CisgdC5FY2lyY2xlID0gMHgyNGJhOworIHQuRWNpcmN1bWZsZXggPSAweDAwY2E7CisgdC5FY2lyY3VtZmxleGFjdXRlID0gMHgxZWJlOworIHQuRWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxODsKKyB0LkVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzY7CisgdC5FY2lyY3VtZmxleGdyYXZlID0gMHgxZWMwOworIHQuRWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzI7CisgdC5FY2lyY3VtZmxleHNtYWxsID0gMHhmN2VhOworIHQuRWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNDsKKyB0LkVjeXJpbGxpYyA9IDB4MDQwNDsKKyB0LkVkYmxncmF2ZSA9IDB4MDIwNDsKKyB0LkVkaWVyZXNpcyA9IDB4MDBjYjsKKyB0LkVkaWVyZXNpc3NtYWxsID0gMHhmN2ViOworIHQuRWRvdCA9IDB4MDExNjsKKyB0LkVkb3RhY2NlbnQgPSAweDAxMTY7CisgdC5FZG90YmVsb3cgPSAweDFlYjg7CisgdC5FZmN5cmlsbGljID0gMHgwNDI0OworIHQuRWdyYXZlID0gMHgwMGM4OworIHQuRWdyYXZlc21hbGwgPSAweGY3ZTg7CisgdC5FaGFybWVuaWFuID0gMHgwNTM3OworIHQuRWhvb2thYm92ZSA9IDB4MWViYTsKKyB0LkVpZ2h0cm9tYW4gPSAweDIxNjc7CisgdC5FaW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNjsKKyB0LkVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY0OworIHQuRWxjeXJpbGxpYyA9IDB4MDQxYjsKKyB0LkVsZXZlbnJvbWFuID0gMHgyMTZhOworIHQuRW1hY3JvbiA9IDB4MDExMjsKKyB0LkVtYWNyb25hY3V0ZSA9IDB4MWUxNjsKKyB0LkVtYWNyb25ncmF2ZSA9IDB4MWUxNDsKKyB0LkVtY3lyaWxsaWMgPSAweDA0MWM7CisgdC5FbW9ub3NwYWNlID0gMHhmZjI1OworIHQuRW5jeXJpbGxpYyA9IDB4MDQxZDsKKyB0LkVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTI7CisgdC5FbmcgPSAweDAxNGE7CisgdC5FbmdoZWN5cmlsbGljID0gMHgwNGE0OworIHQuRW5ob29rY3lyaWxsaWMgPSAweDA0Yzc7CisgdC5Fb2dvbmVrID0gMHgwMTE4OworIHQuRW9wZW4gPSAweDAxOTA7CisgdC5FcHNpbG9uID0gMHgwMzk1OworIHQuRXBzaWxvbnRvbm9zID0gMHgwMzg4OworIHQuRXJjeXJpbGxpYyA9IDB4MDQyMDsKKyB0LkVyZXZlcnNlZCA9IDB4MDE4ZTsKKyB0LkVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDJkOworIHQuRXNjeXJpbGxpYyA9IDB4MDQyMTsKKyB0LkVzZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWE7CisgdC5Fc2ggPSAweDAxYTk7CisgdC5Fc21hbGwgPSAweGY3NjU7CisgdC5FdGEgPSAweDAzOTc7CisgdC5FdGFybWVuaWFuID0gMHgwNTM4OworIHQuRXRhdG9ub3MgPSAweDAzODk7CisgdC5FdGggPSAweDAwZDA7CisgdC5FdGhzbWFsbCA9IDB4ZjdmMDsKKyB0LkV0aWxkZSA9IDB4MWViYzsKKyB0LkV0aWxkZWJlbG93ID0gMHgxZTFhOworIHQuRXVybyA9IDB4MjBhYzsKKyB0LkV6aCA9IDB4MDFiNzsKKyB0LkV6aGNhcm9uID0gMHgwMWVlOworIHQuRXpocmV2ZXJzZWQgPSAweDAxYjg7CisgdC5GID0gMHgwMDQ2OworIHQuRmNpcmNsZSA9IDB4MjRiYjsKKyB0LkZkb3RhY2NlbnQgPSAweDFlMWU7CisgdC5GZWhhcm1lbmlhbiA9IDB4MDU1NjsKKyB0LkZlaWNvcHRpYyA9IDB4MDNlNDsKKyB0LkZob29rID0gMHgwMTkxOworIHQuRml0YWN5cmlsbGljID0gMHgwNDcyOworIHQuRml2ZXJvbWFuID0gMHgyMTY0OworIHQuRm1vbm9zcGFjZSA9IDB4ZmYyNjsKKyB0LkZvdXJyb21hbiA9IDB4MjE2MzsKKyB0LkZzbWFsbCA9IDB4Zjc2NjsKKyB0LkcgPSAweDAwNDc7CisgdC5HQnNxdWFyZSA9IDB4MzM4NzsKKyB0LkdhY3V0ZSA9IDB4MDFmNDsKKyB0LkdhbW1hID0gMHgwMzkzOworIHQuR2FtbWFhZnJpY2FuID0gMHgwMTk0OworIHQuR2FuZ2lhY29wdGljID0gMHgwM2VhOworIHQuR2JyZXZlID0gMHgwMTFlOworIHQuR2Nhcm9uID0gMHgwMWU2OworIHQuR2NlZGlsbGEgPSAweDAxMjI7CisgdC5HY2lyY2xlID0gMHgyNGJjOworIHQuR2NpcmN1bWZsZXggPSAweDAxMWM7CisgdC5HY29tbWFhY2NlbnQgPSAweDAxMjI7CisgdC5HZG90ID0gMHgwMTIwOworIHQuR2RvdGFjY2VudCA9IDB4MDEyMDsKKyB0LkdlY3lyaWxsaWMgPSAweDA0MTM7CisgdC5HaGFkYXJtZW5pYW4gPSAweDA1NDI7CisgdC5HaGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTQ7CisgdC5HaGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MjsKKyB0LkdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkwOworIHQuR2hvb2sgPSAweDAxOTM7CisgdC5HaW1hcm1lbmlhbiA9IDB4MDUzMzsKKyB0LkdqZWN5cmlsbGljID0gMHgwNDAzOworIHQuR21hY3JvbiA9IDB4MWUyMDsKKyB0Lkdtb25vc3BhY2UgPSAweGZmMjc7CisgdC5HcmF2ZSA9IDB4ZjZjZTsKKyB0LkdyYXZlc21hbGwgPSAweGY3NjA7CisgdC5Hc21hbGwgPSAweGY3Njc7CisgdC5Hc21hbGxob29rID0gMHgwMjliOworIHQuR3N0cm9rZSA9IDB4MDFlNDsKKyB0LkggPSAweDAwNDg7CisgdC5IMTg1MzMgPSAweDI1Y2Y7CisgdC5IMTg1NDMgPSAweDI1YWE7CisgdC5IMTg1NTEgPSAweDI1YWI7CisgdC5IMjIwNzMgPSAweDI1YTE7CisgdC5IUHNxdWFyZSA9IDB4MzNjYjsKKyB0LkhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTg7CisgdC5IYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGIyOworIHQuSGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQyYTsKKyB0LkhiYXIgPSAweDAxMjY7CisgdC5IYnJldmViZWxvdyA9IDB4MWUyYTsKKyB0LkhjZWRpbGxhID0gMHgxZTI4OworIHQuSGNpcmNsZSA9IDB4MjRiZDsKKyB0LkhjaXJjdW1mbGV4ID0gMHgwMTI0OworIHQuSGRpZXJlc2lzID0gMHgxZTI2OworIHQuSGRvdGFjY2VudCA9IDB4MWUyMjsKKyB0Lkhkb3RiZWxvdyA9IDB4MWUyNDsKKyB0Lkhtb25vc3BhY2UgPSAweGZmMjg7CisgdC5Ib2FybWVuaWFuID0gMHgwNTQwOworIHQuSG9yaWNvcHRpYyA9IDB4MDNlODsKKyB0LkhzbWFsbCA9IDB4Zjc2ODsKKyB0Lkh1bmdhcnVtbGF1dCA9IDB4ZjZjZjsKKyB0Lkh1bmdhcnVtbGF1dHNtYWxsID0gMHhmNmY4OworIHQuSHpzcXVhcmUgPSAweDMzOTA7CisgdC5JID0gMHgwMDQ5OworIHQuSUFjeXJpbGxpYyA9IDB4MDQyZjsKKyB0LklKID0gMHgwMTMyOworIHQuSVVjeXJpbGxpYyA9IDB4MDQyZTsKKyB0LklhY3V0ZSA9IDB4MDBjZDsKKyB0LklhY3V0ZXNtYWxsID0gMHhmN2VkOworIHQuSWJyZXZlID0gMHgwMTJjOworIHQuSWNhcm9uID0gMHgwMWNmOworIHQuSWNpcmNsZSA9IDB4MjRiZTsKKyB0LkljaXJjdW1mbGV4ID0gMHgwMGNlOworIHQuSWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlZTsKKyB0LkljeXJpbGxpYyA9IDB4MDQwNjsKKyB0LklkYmxncmF2ZSA9IDB4MDIwODsKKyB0LklkaWVyZXNpcyA9IDB4MDBjZjsKKyB0LklkaWVyZXNpc2FjdXRlID0gMHgxZTJlOworIHQuSWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTQ7CisgdC5JZGllcmVzaXNzbWFsbCA9IDB4ZjdlZjsKKyB0Lklkb3QgPSAweDAxMzA7CisgdC5JZG90YWNjZW50ID0gMHgwMTMwOworIHQuSWRvdGJlbG93ID0gMHgxZWNhOworIHQuSWVicmV2ZWN5cmlsbGljID0gMHgwNGQ2OworIHQuSWVjeXJpbGxpYyA9IDB4MDQxNTsKKyB0LklmcmFrdHVyID0gMHgyMTExOworIHQuSWdyYXZlID0gMHgwMGNjOworIHQuSWdyYXZlc21hbGwgPSAweGY3ZWM7CisgdC5JaG9va2Fib3ZlID0gMHgxZWM4OworIHQuSWljeXJpbGxpYyA9IDB4MDQxODsKKyB0LklpbnZlcnRlZGJyZXZlID0gMHgwMjBhOworIHQuSWlzaG9ydGN5cmlsbGljID0gMHgwNDE5OworIHQuSW1hY3JvbiA9IDB4MDEyYTsKKyB0LkltYWNyb25jeXJpbGxpYyA9IDB4MDRlMjsKKyB0Lkltb25vc3BhY2UgPSAweGZmMjk7CisgdC5Jbmlhcm1lbmlhbiA9IDB4MDUzYjsKKyB0LklvY3lyaWxsaWMgPSAweDA0MDE7CisgdC5Jb2dvbmVrID0gMHgwMTJlOworIHQuSW90YSA9IDB4MDM5OTsKKyB0LklvdGFhZnJpY2FuID0gMHgwMTk2OworIHQuSW90YWRpZXJlc2lzID0gMHgwM2FhOworIHQuSW90YXRvbm9zID0gMHgwMzhhOworIHQuSXNtYWxsID0gMHhmNzY5OworIHQuSXN0cm9rZSA9IDB4MDE5NzsKKyB0Lkl0aWxkZSA9IDB4MDEyODsKKyB0Lkl0aWxkZWJlbG93ID0gMHgxZTJjOworIHQuSXpoaXRzYWN5cmlsbGljID0gMHgwNDc0OworIHQuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0NzY7CisgdC5KID0gMHgwMDRhOworIHQuSmFhcm1lbmlhbiA9IDB4MDU0MTsKKyB0LkpjaXJjbGUgPSAweDI0YmY7CisgdC5KY2lyY3VtZmxleCA9IDB4MDEzNDsKKyB0LkplY3lyaWxsaWMgPSAweDA0MDg7CisgdC5KaGVoYXJtZW5pYW4gPSAweDA1NGI7CisgdC5KbW9ub3NwYWNlID0gMHhmZjJhOworIHQuSnNtYWxsID0gMHhmNzZhOworIHQuSyA9IDB4MDA0YjsKKyB0LktCc3F1YXJlID0gMHgzMzg1OworIHQuS0tzcXVhcmUgPSAweDMzY2Q7CisgdC5LYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMDsKKyB0LkthY3V0ZSA9IDB4MWUzMDsKKyB0LkthY3lyaWxsaWMgPSAweDA0MWE7CisgdC5LYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDlhOworIHQuS2Fob29rY3lyaWxsaWMgPSAweDA0YzM7CisgdC5LYXBwYSA9IDB4MDM5YTsKKyB0Lkthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWU7CisgdC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWM7CisgdC5LY2Fyb24gPSAweDAxZTg7CisgdC5LY2VkaWxsYSA9IDB4MDEzNjsKKyB0LktjaXJjbGUgPSAweDI0YzA7CisgdC5LY29tbWFhY2NlbnQgPSAweDAxMzY7CisgdC5LZG90YmVsb3cgPSAweDFlMzI7CisgdC5LZWhhcm1lbmlhbiA9IDB4MDU1NDsKKyB0LktlbmFybWVuaWFuID0gMHgwNTNmOworIHQuS2hhY3lyaWxsaWMgPSAweDA0MjU7CisgdC5LaGVpY29wdGljID0gMHgwM2U2OworIHQuS2hvb2sgPSAweDAxOTg7CisgdC5LamVjeXJpbGxpYyA9IDB4MDQwYzsKKyB0LktsaW5lYmVsb3cgPSAweDFlMzQ7CisgdC5LbW9ub3NwYWNlID0gMHhmZjJiOworIHQuS29wcGFjeXJpbGxpYyA9IDB4MDQ4MDsKKyB0LktvcHBhZ3JlZWsgPSAweDAzZGU7CisgdC5Lc2ljeXJpbGxpYyA9IDB4MDQ2ZTsKKyB0LktzbWFsbCA9IDB4Zjc2YjsKKyB0LkwgPSAweDAwNGM7CisgdC5MSiA9IDB4MDFjNzsKKyB0LkxMID0gMHhmNmJmOworIHQuTGFjdXRlID0gMHgwMTM5OworIHQuTGFtYmRhID0gMHgwMzliOworIHQuTGNhcm9uID0gMHgwMTNkOworIHQuTGNlZGlsbGEgPSAweDAxM2I7CisgdC5MY2lyY2xlID0gMHgyNGMxOworIHQuTGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzYzsKKyB0Lkxjb21tYWFjY2VudCA9IDB4MDEzYjsKKyB0Lkxkb3QgPSAweDAxM2Y7CisgdC5MZG90YWNjZW50ID0gMHgwMTNmOworIHQuTGRvdGJlbG93ID0gMHgxZTM2OworIHQuTGRvdGJlbG93bWFjcm9uID0gMHgxZTM4OworIHQuTGl3bmFybWVuaWFuID0gMHgwNTNjOworIHQuTGogPSAweDAxYzg7CisgdC5MamVjeXJpbGxpYyA9IDB4MDQwOTsKKyB0LkxsaW5lYmVsb3cgPSAweDFlM2E7CisgdC5MbW9ub3NwYWNlID0gMHhmZjJjOworIHQuTHNsYXNoID0gMHgwMTQxOworIHQuTHNsYXNoc21hbGwgPSAweGY2Zjk7CisgdC5Mc21hbGwgPSAweGY3NmM7CisgdC5NID0gMHgwMDRkOworIHQuTUJzcXVhcmUgPSAweDMzODY7CisgdC5NYWNyb24gPSAweGY2ZDA7CisgdC5NYWNyb25zbWFsbCA9IDB4ZjdhZjsKKyB0Lk1hY3V0ZSA9IDB4MWUzZTsKKyB0Lk1jaXJjbGUgPSAweDI0YzI7CisgdC5NZG90YWNjZW50ID0gMHgxZTQwOworIHQuTWRvdGJlbG93ID0gMHgxZTQyOworIHQuTWVuYXJtZW5pYW4gPSAweDA1NDQ7CisgdC5NbW9ub3NwYWNlID0gMHhmZjJkOworIHQuTXNtYWxsID0gMHhmNzZkOworIHQuTXR1cm5lZCA9IDB4MDE5YzsKKyB0Lk11ID0gMHgwMzljOworIHQuTiA9IDB4MDA0ZTsKKyB0Lk5KID0gMHgwMWNhOworIHQuTmFjdXRlID0gMHgwMTQzOworIHQuTmNhcm9uID0gMHgwMTQ3OworIHQuTmNlZGlsbGEgPSAweDAxNDU7CisgdC5OY2lyY2xlID0gMHgyNGMzOworIHQuTmNpcmN1bWZsZXhiZWxvdyA9IDB4MWU0YTsKKyB0Lk5jb21tYWFjY2VudCA9IDB4MDE0NTsKKyB0Lk5kb3RhY2NlbnQgPSAweDFlNDQ7CisgdC5OZG90YmVsb3cgPSAweDFlNDY7CisgdC5OaG9va2xlZnQgPSAweDAxOWQ7CisgdC5OaW5lcm9tYW4gPSAweDIxNjg7CisgdC5OaiA9IDB4MDFjYjsKKyB0Lk5qZWN5cmlsbGljID0gMHgwNDBhOworIHQuTmxpbmViZWxvdyA9IDB4MWU0ODsKKyB0Lk5tb25vc3BhY2UgPSAweGZmMmU7CisgdC5Ob3dhcm1lbmlhbiA9IDB4MDU0NjsKKyB0Lk5zbWFsbCA9IDB4Zjc2ZTsKKyB0Lk50aWxkZSA9IDB4MDBkMTsKKyB0Lk50aWxkZXNtYWxsID0gMHhmN2YxOworIHQuTnUgPSAweDAzOWQ7CisgdC5PID0gMHgwMDRmOworIHQuT0UgPSAweDAxNTI7CisgdC5PRXNtYWxsID0gMHhmNmZhOworIHQuT2FjdXRlID0gMHgwMGQzOworIHQuT2FjdXRlc21hbGwgPSAweGY3ZjM7CisgdC5PYmFycmVkY3lyaWxsaWMgPSAweDA0ZTg7CisgdC5PYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYTsKKyB0Lk9icmV2ZSA9IDB4MDE0ZTsKKyB0Lk9jYXJvbiA9IDB4MDFkMTsKKyB0Lk9jZW50ZXJlZHRpbGRlID0gMHgwMTlmOworIHQuT2NpcmNsZSA9IDB4MjRjNDsKKyB0Lk9jaXJjdW1mbGV4ID0gMHgwMGQ0OworIHQuT2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMDsKKyB0Lk9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDg7CisgdC5PY2lyY3VtZmxleGdyYXZlID0gMHgxZWQyOworIHQuT2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDQ7CisgdC5PY2lyY3VtZmxleHNtYWxsID0gMHhmN2Y0OworIHQuT2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNjsKKyB0Lk9jeXJpbGxpYyA9IDB4MDQxZTsKKyB0Lk9kYmxhY3V0ZSA9IDB4MDE1MDsKKyB0Lk9kYmxncmF2ZSA9IDB4MDIwYzsKKyB0Lk9kaWVyZXNpcyA9IDB4MDBkNjsKKyB0Lk9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU2OworIHQuT2RpZXJlc2lzc21hbGwgPSAweGY3ZjY7CisgdC5PZG90YmVsb3cgPSAweDFlY2M7CisgdC5PZ29uZWtzbWFsbCA9IDB4ZjZmYjsKKyB0Lk9ncmF2ZSA9IDB4MDBkMjsKKyB0Lk9ncmF2ZXNtYWxsID0gMHhmN2YyOworIHQuT2hhcm1lbmlhbiA9IDB4MDU1NTsKKyB0Lk9obSA9IDB4MjEyNjsKKyB0Lk9ob29rYWJvdmUgPSAweDFlY2U7CisgdC5PaG9ybiA9IDB4MDFhMDsKKyB0Lk9ob3JuYWN1dGUgPSAweDFlZGE7CisgdC5PaG9ybmRvdGJlbG93ID0gMHgxZWUyOworIHQuT2hvcm5ncmF2ZSA9IDB4MWVkYzsKKyB0Lk9ob3JuaG9va2Fib3ZlID0gMHgxZWRlOworIHQuT2hvcm50aWxkZSA9IDB4MWVlMDsKKyB0Lk9odW5nYXJ1bWxhdXQgPSAweDAxNTA7CisgdC5PaSA9IDB4MDFhMjsKKyB0Lk9pbnZlcnRlZGJyZXZlID0gMHgwMjBlOworIHQuT21hY3JvbiA9IDB4MDE0YzsKKyB0Lk9tYWNyb25hY3V0ZSA9IDB4MWU1MjsKKyB0Lk9tYWNyb25ncmF2ZSA9IDB4MWU1MDsKKyB0Lk9tZWdhID0gMHgyMTI2OworIHQuT21lZ2FjeXJpbGxpYyA9IDB4MDQ2MDsKKyB0Lk9tZWdhZ3JlZWsgPSAweDAzYTk7CisgdC5PbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2E7CisgdC5PbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2M7CisgdC5PbWVnYXRvbm9zID0gMHgwMzhmOworIHQuT21pY3JvbiA9IDB4MDM5ZjsKKyB0Lk9taWNyb250b25vcyA9IDB4MDM4YzsKKyB0Lk9tb25vc3BhY2UgPSAweGZmMmY7CisgdC5PbmVyb21hbiA9IDB4MjE2MDsKKyB0Lk9vZ29uZWsgPSAweDAxZWE7CisgdC5Pb2dvbmVrbWFjcm9uID0gMHgwMWVjOworIHQuT29wZW4gPSAweDAxODY7CisgdC5Pc2xhc2ggPSAweDAwZDg7CisgdC5Pc2xhc2hhY3V0ZSA9IDB4MDFmZTsKKyB0Lk9zbGFzaHNtYWxsID0gMHhmN2Y4OworIHQuT3NtYWxsID0gMHhmNzZmOworIHQuT3N0cm9rZWFjdXRlID0gMHgwMWZlOworIHQuT3RjeXJpbGxpYyA9IDB4MDQ3ZTsKKyB0Lk90aWxkZSA9IDB4MDBkNTsKKyB0Lk90aWxkZWFjdXRlID0gMHgxZTRjOworIHQuT3RpbGRlZGllcmVzaXMgPSAweDFlNGU7CisgdC5PdGlsZGVzbWFsbCA9IDB4ZjdmNTsKKyB0LlAgPSAweDAwNTA7CisgdC5QYWN1dGUgPSAweDFlNTQ7CisgdC5QY2lyY2xlID0gMHgyNGM1OworIHQuUGRvdGFjY2VudCA9IDB4MWU1NjsKKyB0LlBlY3lyaWxsaWMgPSAweDA0MWY7CisgdC5QZWhhcm1lbmlhbiA9IDB4MDU0YTsKKyB0LlBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE2OworIHQuUGhpID0gMHgwM2E2OworIHQuUGhvb2sgPSAweDAxYTQ7CisgdC5QaSA9IDB4MDNhMDsKKyB0LlBpd3Jhcm1lbmlhbiA9IDB4MDU1MzsKKyB0LlBtb25vc3BhY2UgPSAweGZmMzA7CisgdC5Qc2kgPSAweDAzYTg7CisgdC5Qc2ljeXJpbGxpYyA9IDB4MDQ3MDsKKyB0LlBzbWFsbCA9IDB4Zjc3MDsKKyB0LlEgPSAweDAwNTE7CisgdC5RY2lyY2xlID0gMHgyNGM2OworIHQuUW1vbm9zcGFjZSA9IDB4ZmYzMTsKKyB0LlFzbWFsbCA9IDB4Zjc3MTsKKyB0LlIgPSAweDAwNTI7CisgdC5SYWFybWVuaWFuID0gMHgwNTRjOworIHQuUmFjdXRlID0gMHgwMTU0OworIHQuUmNhcm9uID0gMHgwMTU4OworIHQuUmNlZGlsbGEgPSAweDAxNTY7CisgdC5SY2lyY2xlID0gMHgyNGM3OworIHQuUmNvbW1hYWNjZW50ID0gMHgwMTU2OworIHQuUmRibGdyYXZlID0gMHgwMjEwOworIHQuUmRvdGFjY2VudCA9IDB4MWU1ODsKKyB0LlJkb3RiZWxvdyA9IDB4MWU1YTsKKyB0LlJkb3RiZWxvd21hY3JvbiA9IDB4MWU1YzsKKyB0LlJlaGFybWVuaWFuID0gMHgwNTUwOworIHQuUmZyYWt0dXIgPSAweDIxMWM7CisgdC5SaG8gPSAweDAzYTE7CisgdC5SaW5nc21hbGwgPSAweGY2ZmM7CisgdC5SaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMjsKKyB0LlJsaW5lYmVsb3cgPSAweDFlNWU7CisgdC5SbW9ub3NwYWNlID0gMHhmZjMyOworIHQuUnNtYWxsID0gMHhmNzcyOworIHQuUnNtYWxsaW52ZXJ0ZWQgPSAweDAyODE7CisgdC5Sc21hbGxpbnZlcnRlZHN1cGVyaW9yID0gMHgwMmI2OworIHQuUyA9IDB4MDA1MzsKKyB0LlNGMDEwMDAwID0gMHgyNTBjOworIHQuU0YwMjAwMDAgPSAweDI1MTQ7CisgdC5TRjAzMDAwMCA9IDB4MjUxMDsKKyB0LlNGMDQwMDAwID0gMHgyNTE4OworIHQuU0YwNTAwMDAgPSAweDI1M2M7CisgdC5TRjA2MDAwMCA9IDB4MjUyYzsKKyB0LlNGMDcwMDAwID0gMHgyNTM0OworIHQuU0YwODAwMDAgPSAweDI1MWM7CisgdC5TRjA5MDAwMCA9IDB4MjUyNDsKKyB0LlNGMTAwMDAwID0gMHgyNTAwOworIHQuU0YxMTAwMDAgPSAweDI1MDI7CisgdC5TRjE5MDAwMCA9IDB4MjU2MTsKKyB0LlNGMjAwMDAwID0gMHgyNTYyOworIHQuU0YyMTAwMDAgPSAweDI1NTY7CisgdC5TRjIyMDAwMCA9IDB4MjU1NTsKKyB0LlNGMjMwMDAwID0gMHgyNTYzOworIHQuU0YyNDAwMDAgPSAweDI1NTE7CisgdC5TRjI1MDAwMCA9IDB4MjU1NzsKKyB0LlNGMjYwMDAwID0gMHgyNTVkOworIHQuU0YyNzAwMDAgPSAweDI1NWM7CisgdC5TRjI4MDAwMCA9IDB4MjU1YjsKKyB0LlNGMzYwMDAwID0gMHgyNTVlOworIHQuU0YzNzAwMDAgPSAweDI1NWY7CisgdC5TRjM4MDAwMCA9IDB4MjU1YTsKKyB0LlNGMzkwMDAwID0gMHgyNTU0OworIHQuU0Y0MDAwMDAgPSAweDI1Njk7CisgdC5TRjQxMDAwMCA9IDB4MjU2NjsKKyB0LlNGNDIwMDAwID0gMHgyNTYwOworIHQuU0Y0MzAwMDAgPSAweDI1NTA7CisgdC5TRjQ0MDAwMCA9IDB4MjU2YzsKKyB0LlNGNDUwMDAwID0gMHgyNTY3OworIHQuU0Y0NjAwMDAgPSAweDI1Njg7CisgdC5TRjQ3MDAwMCA9IDB4MjU2NDsKKyB0LlNGNDgwMDAwID0gMHgyNTY1OworIHQuU0Y0OTAwMDAgPSAweDI1NTk7CisgdC5TRjUwMDAwMCA9IDB4MjU1ODsKKyB0LlNGNTEwMDAwID0gMHgyNTUyOworIHQuU0Y1MjAwMDAgPSAweDI1NTM7CisgdC5TRjUzMDAwMCA9IDB4MjU2YjsKKyB0LlNGNTQwMDAwID0gMHgyNTZhOworIHQuU2FjdXRlID0gMHgwMTVhOworIHQuU2FjdXRlZG90YWNjZW50ID0gMHgxZTY0OworIHQuU2FtcGlncmVlayA9IDB4MDNlMDsKKyB0LlNjYXJvbiA9IDB4MDE2MDsKKyB0LlNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NjsKKyB0LlNjYXJvbnNtYWxsID0gMHhmNmZkOworIHQuU2NlZGlsbGEgPSAweDAxNWU7CisgdC5TY2h3YSA9IDB4MDE4ZjsKKyB0LlNjaHdhY3lyaWxsaWMgPSAweDA0ZDg7CisgdC5TY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGE7CisgdC5TY2lyY2xlID0gMHgyNGM4OworIHQuU2NpcmN1bWZsZXggPSAweDAxNWM7CisgdC5TY29tbWFhY2NlbnQgPSAweDAyMTg7CisgdC5TZG90YWNjZW50ID0gMHgxZTYwOworIHQuU2RvdGJlbG93ID0gMHgxZTYyOworIHQuU2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY4OworIHQuU2VoYXJtZW5pYW4gPSAweDA1NGQ7CisgdC5TZXZlbnJvbWFuID0gMHgyMTY2OworIHQuU2hhYXJtZW5pYW4gPSAweDA1NDc7CisgdC5TaGFjeXJpbGxpYyA9IDB4MDQyODsKKyB0LlNoY2hhY3lyaWxsaWMgPSAweDA0Mjk7CisgdC5TaGVpY29wdGljID0gMHgwM2UyOworIHQuU2hoYWN5cmlsbGljID0gMHgwNGJhOworIHQuU2hpbWFjb3B0aWMgPSAweDAzZWM7CisgdC5TaWdtYSA9IDB4MDNhMzsKKyB0LlNpeHJvbWFuID0gMHgyMTY1OworIHQuU21vbm9zcGFjZSA9IDB4ZmYzMzsKKyB0LlNvZnRzaWduY3lyaWxsaWMgPSAweDA0MmM7CisgdC5Tc21hbGwgPSAweGY3NzM7CisgdC5TdGlnbWFncmVlayA9IDB4MDNkYTsKKyB0LlQgPSAweDAwNTQ7CisgdC5UYXUgPSAweDAzYTQ7CisgdC5UYmFyID0gMHgwMTY2OworIHQuVGNhcm9uID0gMHgwMTY0OworIHQuVGNlZGlsbGEgPSAweDAxNjI7CisgdC5UY2lyY2xlID0gMHgyNGM5OworIHQuVGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MDsKKyB0LlRjb21tYWFjY2VudCA9IDB4MDE2MjsKKyB0LlRkb3RhY2NlbnQgPSAweDFlNmE7CisgdC5UZG90YmVsb3cgPSAweDFlNmM7CisgdC5UZWN5cmlsbGljID0gMHgwNDIyOworIHQuVGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYzsKKyB0LlRlbnJvbWFuID0gMHgyMTY5OworIHQuVGV0c2VjeXJpbGxpYyA9IDB4MDRiNDsKKyB0LlRoZXRhID0gMHgwMzk4OworIHQuVGhvb2sgPSAweDAxYWM7CisgdC5UaG9ybiA9IDB4MDBkZTsKKyB0LlRob3Juc21hbGwgPSAweGY3ZmU7CisgdC5UaHJlZXJvbWFuID0gMHgyMTYyOworIHQuVGlsZGVzbWFsbCA9IDB4ZjZmZTsKKyB0LlRpd25hcm1lbmlhbiA9IDB4MDU0ZjsKKyB0LlRsaW5lYmVsb3cgPSAweDFlNmU7CisgdC5UbW9ub3NwYWNlID0gMHhmZjM0OworIHQuVG9hcm1lbmlhbiA9IDB4MDUzOTsKKyB0LlRvbmVmaXZlID0gMHgwMWJjOworIHQuVG9uZXNpeCA9IDB4MDE4NDsKKyB0LlRvbmV0d28gPSAweDAxYTc7CisgdC5UcmV0cm9mbGV4aG9vayA9IDB4MDFhZTsKKyB0LlRzZWN5cmlsbGljID0gMHgwNDI2OworIHQuVHNoZWN5cmlsbGljID0gMHgwNDBiOworIHQuVHNtYWxsID0gMHhmNzc0OworIHQuVHdlbHZlcm9tYW4gPSAweDIxNmI7CisgdC5Ud29yb21hbiA9IDB4MjE2MTsKKyB0LlUgPSAweDAwNTU7CisgdC5VYWN1dGUgPSAweDAwZGE7CisgdC5VYWN1dGVzbWFsbCA9IDB4ZjdmYTsKKyB0LlVicmV2ZSA9IDB4MDE2YzsKKyB0LlVjYXJvbiA9IDB4MDFkMzsKKyB0LlVjaXJjbGUgPSAweDI0Y2E7CisgdC5VY2lyY3VtZmxleCA9IDB4MDBkYjsKKyB0LlVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzY7CisgdC5VY2lyY3VtZmxleHNtYWxsID0gMHhmN2ZiOworIHQuVWN5cmlsbGljID0gMHgwNDIzOworIHQuVWRibGFjdXRlID0gMHgwMTcwOworIHQuVWRibGdyYXZlID0gMHgwMjE0OworIHQuVWRpZXJlc2lzID0gMHgwMGRjOworIHQuVWRpZXJlc2lzYWN1dGUgPSAweDAxZDc7CisgdC5VZGllcmVzaXNiZWxvdyA9IDB4MWU3MjsKKyB0LlVkaWVyZXNpc2Nhcm9uID0gMHgwMWQ5OworIHQuVWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjA7CisgdC5VZGllcmVzaXNncmF2ZSA9IDB4MDFkYjsKKyB0LlVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNTsKKyB0LlVkaWVyZXNpc3NtYWxsID0gMHhmN2ZjOworIHQuVWRvdGJlbG93ID0gMHgxZWU0OworIHQuVWdyYXZlID0gMHgwMGQ5OworIHQuVWdyYXZlc21hbGwgPSAweGY3Zjk7CisgdC5VaG9va2Fib3ZlID0gMHgxZWU2OworIHQuVWhvcm4gPSAweDAxYWY7CisgdC5VaG9ybmFjdXRlID0gMHgxZWU4OworIHQuVWhvcm5kb3RiZWxvdyA9IDB4MWVmMDsKKyB0LlVob3JuZ3JhdmUgPSAweDFlZWE7CisgdC5VaG9ybmhvb2thYm92ZSA9IDB4MWVlYzsKKyB0LlVob3JudGlsZGUgPSAweDFlZWU7CisgdC5VaHVuZ2FydW1sYXV0ID0gMHgwMTcwOworIHQuVWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYyOworIHQuVWludmVydGVkYnJldmUgPSAweDAyMTY7CisgdC5Va2N5cmlsbGljID0gMHgwNDc4OworIHQuVW1hY3JvbiA9IDB4MDE2YTsKKyB0LlVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZTsKKyB0LlVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YTsKKyB0LlVtb25vc3BhY2UgPSAweGZmMzU7CisgdC5Vb2dvbmVrID0gMHgwMTcyOworIHQuVXBzaWxvbiA9IDB4MDNhNTsKKyB0LlVwc2lsb24xID0gMHgwM2QyOworIHQuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrID0gMHgwM2QzOworIHQuVXBzaWxvbmFmcmljYW4gPSAweDAxYjE7CisgdC5VcHNpbG9uZGllcmVzaXMgPSAweDAzYWI7CisgdC5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWsgPSAweDAzZDQ7CisgdC5VcHNpbG9uaG9va3N5bWJvbCA9IDB4MDNkMjsKKyB0LlVwc2lsb250b25vcyA9IDB4MDM4ZTsKKyB0LlVyaW5nID0gMHgwMTZlOworIHQuVXNob3J0Y3lyaWxsaWMgPSAweDA0MGU7CisgdC5Vc21hbGwgPSAweGY3NzU7CisgdC5Vc3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZTsKKyB0LlVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIwOworIHQuVXRpbGRlID0gMHgwMTY4OworIHQuVXRpbGRlYWN1dGUgPSAweDFlNzg7CisgdC5VdGlsZGViZWxvdyA9IDB4MWU3NDsKKyB0LlYgPSAweDAwNTY7CisgdC5WY2lyY2xlID0gMHgyNGNiOworIHQuVmRvdGJlbG93ID0gMHgxZTdlOworIHQuVmVjeXJpbGxpYyA9IDB4MDQxMjsKKyB0LlZld2FybWVuaWFuID0gMHgwNTRlOworIHQuVmhvb2sgPSAweDAxYjI7CisgdC5WbW9ub3NwYWNlID0gMHhmZjM2OworIHQuVm9hcm1lbmlhbiA9IDB4MDU0ODsKKyB0LlZzbWFsbCA9IDB4Zjc3NjsKKyB0LlZ0aWxkZSA9IDB4MWU3YzsKKyB0LlcgPSAweDAwNTc7CisgdC5XYWN1dGUgPSAweDFlODI7CisgdC5XY2lyY2xlID0gMHgyNGNjOworIHQuV2NpcmN1bWZsZXggPSAweDAxNzQ7CisgdC5XZGllcmVzaXMgPSAweDFlODQ7CisgdC5XZG90YWNjZW50ID0gMHgxZTg2OworIHQuV2RvdGJlbG93ID0gMHgxZTg4OworIHQuV2dyYXZlID0gMHgxZTgwOworIHQuV21vbm9zcGFjZSA9IDB4ZmYzNzsKKyB0LldzbWFsbCA9IDB4Zjc3NzsKKyB0LlggPSAweDAwNTg7CisgdC5YY2lyY2xlID0gMHgyNGNkOworIHQuWGRpZXJlc2lzID0gMHgxZThjOworIHQuWGRvdGFjY2VudCA9IDB4MWU4YTsKKyB0LlhlaGFybWVuaWFuID0gMHgwNTNkOworIHQuWGkgPSAweDAzOWU7CisgdC5YbW9ub3NwYWNlID0gMHhmZjM4OworIHQuWHNtYWxsID0gMHhmNzc4OworIHQuWSA9IDB4MDA1OTsKKyB0LllhY3V0ZSA9IDB4MDBkZDsKKyB0LllhY3V0ZXNtYWxsID0gMHhmN2ZkOworIHQuWWF0Y3lyaWxsaWMgPSAweDA0NjI7CisgdC5ZY2lyY2xlID0gMHgyNGNlOworIHQuWWNpcmN1bWZsZXggPSAweDAxNzY7CisgdC5ZZGllcmVzaXMgPSAweDAxNzg7CisgdC5ZZGllcmVzaXNzbWFsbCA9IDB4ZjdmZjsKKyB0Lllkb3RhY2NlbnQgPSAweDFlOGU7CisgdC5ZZG90YmVsb3cgPSAweDFlZjQ7CisgdC5ZZXJpY3lyaWxsaWMgPSAweDA0MmI7CisgdC5ZZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmODsKKyB0LllncmF2ZSA9IDB4MWVmMjsKKyB0Lllob29rID0gMHgwMWIzOworIHQuWWhvb2thYm92ZSA9IDB4MWVmNjsKKyB0LllpYXJtZW5pYW4gPSAweDA1NDU7CisgdC5ZaWN5cmlsbGljID0gMHgwNDA3OworIHQuWWl3bmFybWVuaWFuID0gMHgwNTUyOworIHQuWW1vbm9zcGFjZSA9IDB4ZmYzOTsKKyB0LllzbWFsbCA9IDB4Zjc3OTsKKyB0Lll0aWxkZSA9IDB4MWVmODsKKyB0Lll1c2JpZ2N5cmlsbGljID0gMHgwNDZhOworIHQuWXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2YzsKKyB0Lll1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY2OworIHQuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ODsKKyB0LlogPSAweDAwNWE7CisgdC5aYWFybWVuaWFuID0gMHgwNTM2OworIHQuWmFjdXRlID0gMHgwMTc5OworIHQuWmNhcm9uID0gMHgwMTdkOworIHQuWmNhcm9uc21hbGwgPSAweGY2ZmY7CisgdC5aY2lyY2xlID0gMHgyNGNmOworIHQuWmNpcmN1bWZsZXggPSAweDFlOTA7CisgdC5aZG90ID0gMHgwMTdiOworIHQuWmRvdGFjY2VudCA9IDB4MDE3YjsKKyB0Llpkb3RiZWxvdyA9IDB4MWU5MjsKKyB0LlplY3lyaWxsaWMgPSAweDA0MTc7CisgdC5aZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk4OworIHQuWmVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRlOworIHQuWmV0YSA9IDB4MDM5NjsKKyB0LlpoZWFybWVuaWFuID0gMHgwNTNhOworIHQuWmhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMTsKKyB0LlpoZWN5cmlsbGljID0gMHgwNDE2OworIHQuWmhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTY7CisgdC5aaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRjOworIHQuWmxpbmViZWxvdyA9IDB4MWU5NDsKKyB0Llptb25vc3BhY2UgPSAweGZmM2E7CisgdC5ac21hbGwgPSAweGY3N2E7CisgdC5ac3Ryb2tlID0gMHgwMWI1OworIHQuYSA9IDB4MDA2MTsKKyB0LmFhYmVuZ2FsaSA9IDB4MDk4NjsKKyB0LmFhY3V0ZSA9IDB4MDBlMTsKKyB0LmFhZGV2YSA9IDB4MDkwNjsKKyB0LmFhZ3VqYXJhdGkgPSAweDBhODY7CisgdC5hYWd1cm11a2hpID0gMHgwYTA2OworIHQuYWFtYXRyYWd1cm11a2hpID0gMHgwYTNlOworIHQuYWFydXNxdWFyZSA9IDB4MzMwMzsKKyB0LmFhdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZTsKKyB0LmFhdm93ZWxzaWduZGV2YSA9IDB4MDkzZTsKKyB0LmFhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmU7CisgdC5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4gPSAweDA1NWY7CisgdC5hYmJyZXZpYXRpb25zaWduZGV2YSA9IDB4MDk3MDsKKyB0LmFiZW5nYWxpID0gMHgwOTg1OworIHQuYWJvcG9tb2ZvID0gMHgzMTFhOworIHQuYWJyZXZlID0gMHgwMTAzOworIHQuYWJyZXZlYWN1dGUgPSAweDFlYWY7CisgdC5hYnJldmVjeXJpbGxpYyA9IDB4MDRkMTsKKyB0LmFicmV2ZWRvdGJlbG93ID0gMHgxZWI3OworIHQuYWJyZXZlZ3JhdmUgPSAweDFlYjE7CisgdC5hYnJldmVob29rYWJvdmUgPSAweDFlYjM7CisgdC5hYnJldmV0aWxkZSA9IDB4MWViNTsKKyB0LmFjYXJvbiA9IDB4MDFjZTsKKyB0LmFjaXJjbGUgPSAweDI0ZDA7CisgdC5hY2lyY3VtZmxleCA9IDB4MDBlMjsKKyB0LmFjaXJjdW1mbGV4YWN1dGUgPSAweDFlYTU7CisgdC5hY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFkOworIHQuYWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNzsKKyB0LmFjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWE5OworIHQuYWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVhYjsKKyB0LmFjdXRlID0gMHgwMGI0OworIHQuYWN1dGViZWxvd2NtYiA9IDB4MDMxNzsKKyB0LmFjdXRlY21iID0gMHgwMzAxOworIHQuYWN1dGVjb21iID0gMHgwMzAxOworIHQuYWN1dGVkZXZhID0gMHgwOTU0OworIHQuYWN1dGVsb3dtb2QgPSAweDAyY2Y7CisgdC5hY3V0ZXRvbmVjbWIgPSAweDAzNDE7CisgdC5hY3lyaWxsaWMgPSAweDA0MzA7CisgdC5hZGJsZ3JhdmUgPSAweDAyMDE7CisgdC5hZGRha2d1cm11a2hpID0gMHgwYTcxOworIHQuYWRldmEgPSAweDA5MDU7CisgdC5hZGllcmVzaXMgPSAweDAwZTQ7CisgdC5hZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMzsKKyB0LmFkaWVyZXNpc21hY3JvbiA9IDB4MDFkZjsKKyB0LmFkb3RiZWxvdyA9IDB4MWVhMTsKKyB0LmFkb3RtYWNyb24gPSAweDAxZTE7CisgdC5hZSA9IDB4MDBlNjsKKyB0LmFlYWN1dGUgPSAweDAxZmQ7CisgdC5hZWtvcmVhbiA9IDB4MzE1MDsKKyB0LmFlbWFjcm9uID0gMHgwMWUzOworIHQuYWZpaTAwMjA4ID0gMHgyMDE1OworIHQuYWZpaTA4OTQxID0gMHgyMGE0OworIHQuYWZpaTEwMDE3ID0gMHgwNDEwOworIHQuYWZpaTEwMDE4ID0gMHgwNDExOworIHQuYWZpaTEwMDE5ID0gMHgwNDEyOworIHQuYWZpaTEwMDIwID0gMHgwNDEzOworIHQuYWZpaTEwMDIxID0gMHgwNDE0OworIHQuYWZpaTEwMDIyID0gMHgwNDE1OworIHQuYWZpaTEwMDIzID0gMHgwNDAxOworIHQuYWZpaTEwMDI0ID0gMHgwNDE2OworIHQuYWZpaTEwMDI1ID0gMHgwNDE3OworIHQuYWZpaTEwMDI2ID0gMHgwNDE4OworIHQuYWZpaTEwMDI3ID0gMHgwNDE5OworIHQuYWZpaTEwMDI4ID0gMHgwNDFhOworIHQuYWZpaTEwMDI5ID0gMHgwNDFiOworIHQuYWZpaTEwMDMwID0gMHgwNDFjOworIHQuYWZpaTEwMDMxID0gMHgwNDFkOworIHQuYWZpaTEwMDMyID0gMHgwNDFlOworIHQuYWZpaTEwMDMzID0gMHgwNDFmOworIHQuYWZpaTEwMDM0ID0gMHgwNDIwOworIHQuYWZpaTEwMDM1ID0gMHgwNDIxOworIHQuYWZpaTEwMDM2ID0gMHgwNDIyOworIHQuYWZpaTEwMDM3ID0gMHgwNDIzOworIHQuYWZpaTEwMDM4ID0gMHgwNDI0OworIHQuYWZpaTEwMDM5ID0gMHgwNDI1OworIHQuYWZpaTEwMDQwID0gMHgwNDI2OworIHQuYWZpaTEwMDQxID0gMHgwNDI3OworIHQuYWZpaTEwMDQyID0gMHgwNDI4OworIHQuYWZpaTEwMDQzID0gMHgwNDI5OworIHQuYWZpaTEwMDQ0ID0gMHgwNDJhOworIHQuYWZpaTEwMDQ1ID0gMHgwNDJiOworIHQuYWZpaTEwMDQ2ID0gMHgwNDJjOworIHQuYWZpaTEwMDQ3ID0gMHgwNDJkOworIHQuYWZpaTEwMDQ4ID0gMHgwNDJlOworIHQuYWZpaTEwMDQ5ID0gMHgwNDJmOworIHQuYWZpaTEwMDUwID0gMHgwNDkwOworIHQuYWZpaTEwMDUxID0gMHgwNDAyOworIHQuYWZpaTEwMDUyID0gMHgwNDAzOworIHQuYWZpaTEwMDUzID0gMHgwNDA0OworIHQuYWZpaTEwMDU0ID0gMHgwNDA1OworIHQuYWZpaTEwMDU1ID0gMHgwNDA2OworIHQuYWZpaTEwMDU2ID0gMHgwNDA3OworIHQuYWZpaTEwMDU3ID0gMHgwNDA4OworIHQuYWZpaTEwMDU4ID0gMHgwNDA5OworIHQuYWZpaTEwMDU5ID0gMHgwNDBhOworIHQuYWZpaTEwMDYwID0gMHgwNDBiOworIHQuYWZpaTEwMDYxID0gMHgwNDBjOworIHQuYWZpaTEwMDYyID0gMHgwNDBlOworIHQuYWZpaTEwMDYzID0gMHhmNmM0OworIHQuYWZpaTEwMDY0ID0gMHhmNmM1OworIHQuYWZpaTEwMDY1ID0gMHgwNDMwOworIHQuYWZpaTEwMDY2ID0gMHgwNDMxOworIHQuYWZpaTEwMDY3ID0gMHgwNDMyOworIHQuYWZpaTEwMDY4ID0gMHgwNDMzOworIHQuYWZpaTEwMDY5ID0gMHgwNDM0OworIHQuYWZpaTEwMDcwID0gMHgwNDM1OworIHQuYWZpaTEwMDcxID0gMHgwNDUxOworIHQuYWZpaTEwMDcyID0gMHgwNDM2OworIHQuYWZpaTEwMDczID0gMHgwNDM3OworIHQuYWZpaTEwMDc0ID0gMHgwNDM4OworIHQuYWZpaTEwMDc1ID0gMHgwNDM5OworIHQuYWZpaTEwMDc2ID0gMHgwNDNhOworIHQuYWZpaTEwMDc3ID0gMHgwNDNiOworIHQuYWZpaTEwMDc4ID0gMHgwNDNjOworIHQuYWZpaTEwMDc5ID0gMHgwNDNkOworIHQuYWZpaTEwMDgwID0gMHgwNDNlOworIHQuYWZpaTEwMDgxID0gMHgwNDNmOworIHQuYWZpaTEwMDgyID0gMHgwNDQwOworIHQuYWZpaTEwMDgzID0gMHgwNDQxOworIHQuYWZpaTEwMDg0ID0gMHgwNDQyOworIHQuYWZpaTEwMDg1ID0gMHgwNDQzOworIHQuYWZpaTEwMDg2ID0gMHgwNDQ0OworIHQuYWZpaTEwMDg3ID0gMHgwNDQ1OworIHQuYWZpaTEwMDg4ID0gMHgwNDQ2OworIHQuYWZpaTEwMDg5ID0gMHgwNDQ3OworIHQuYWZpaTEwMDkwID0gMHgwNDQ4OworIHQuYWZpaTEwMDkxID0gMHgwNDQ5OworIHQuYWZpaTEwMDkyID0gMHgwNDRhOworIHQuYWZpaTEwMDkzID0gMHgwNDRiOworIHQuYWZpaTEwMDk0ID0gMHgwNDRjOworIHQuYWZpaTEwMDk1ID0gMHgwNDRkOworIHQuYWZpaTEwMDk2ID0gMHgwNDRlOworIHQuYWZpaTEwMDk3ID0gMHgwNDRmOworIHQuYWZpaTEwMDk4ID0gMHgwNDkxOworIHQuYWZpaTEwMDk5ID0gMHgwNDUyOworIHQuYWZpaTEwMTAwID0gMHgwNDUzOworIHQuYWZpaTEwMTAxID0gMHgwNDU0OworIHQuYWZpaTEwMTAyID0gMHgwNDU1OworIHQuYWZpaTEwMTAzID0gMHgwNDU2OworIHQuYWZpaTEwMTA0ID0gMHgwNDU3OworIHQuYWZpaTEwMTA1ID0gMHgwNDU4OworIHQuYWZpaTEwMTA2ID0gMHgwNDU5OworIHQuYWZpaTEwMTA3ID0gMHgwNDVhOworIHQuYWZpaTEwMTA4ID0gMHgwNDViOworIHQuYWZpaTEwMTA5ID0gMHgwNDVjOworIHQuYWZpaTEwMTEwID0gMHgwNDVlOworIHQuYWZpaTEwMTQ1ID0gMHgwNDBmOworIHQuYWZpaTEwMTQ2ID0gMHgwNDYyOworIHQuYWZpaTEwMTQ3ID0gMHgwNDcyOworIHQuYWZpaTEwMTQ4ID0gMHgwNDc0OworIHQuYWZpaTEwMTkyID0gMHhmNmM2OworIHQuYWZpaTEwMTkzID0gMHgwNDVmOworIHQuYWZpaTEwMTk0ID0gMHgwNDYzOworIHQuYWZpaTEwMTk1ID0gMHgwNDczOworIHQuYWZpaTEwMTk2ID0gMHgwNDc1OworIHQuYWZpaTEwODMxID0gMHhmNmM3OworIHQuYWZpaTEwODMyID0gMHhmNmM4OworIHQuYWZpaTEwODQ2ID0gMHgwNGQ5OworIHQuYWZpaTI5OSA9IDB4MjAwZTsKKyB0LmFmaWkzMDAgPSAweDIwMGY7CisgdC5hZmlpMzAxID0gMHgyMDBkOworIHQuYWZpaTU3MzgxID0gMHgwNjZhOworIHQuYWZpaTU3Mzg4ID0gMHgwNjBjOworIHQuYWZpaTU3MzkyID0gMHgwNjYwOworIHQuYWZpaTU3MzkzID0gMHgwNjYxOworIHQuYWZpaTU3Mzk0ID0gMHgwNjYyOworIHQuYWZpaTU3Mzk1ID0gMHgwNjYzOworIHQuYWZpaTU3Mzk2ID0gMHgwNjY0OworIHQuYWZpaTU3Mzk3ID0gMHgwNjY1OworIHQuYWZpaTU3Mzk4ID0gMHgwNjY2OworIHQuYWZpaTU3Mzk5ID0gMHgwNjY3OworIHQuYWZpaTU3NDAwID0gMHgwNjY4OworIHQuYWZpaTU3NDAxID0gMHgwNjY5OworIHQuYWZpaTU3NDAzID0gMHgwNjFiOworIHQuYWZpaTU3NDA3ID0gMHgwNjFmOworIHQuYWZpaTU3NDA5ID0gMHgwNjIxOworIHQuYWZpaTU3NDEwID0gMHgwNjIyOworIHQuYWZpaTU3NDExID0gMHgwNjIzOworIHQuYWZpaTU3NDEyID0gMHgwNjI0OworIHQuYWZpaTU3NDEzID0gMHgwNjI1OworIHQuYWZpaTU3NDE0ID0gMHgwNjI2OworIHQuYWZpaTU3NDE1ID0gMHgwNjI3OworIHQuYWZpaTU3NDE2ID0gMHgwNjI4OworIHQuYWZpaTU3NDE3ID0gMHgwNjI5OworIHQuYWZpaTU3NDE4ID0gMHgwNjJhOworIHQuYWZpaTU3NDE5ID0gMHgwNjJiOworIHQuYWZpaTU3NDIwID0gMHgwNjJjOworIHQuYWZpaTU3NDIxID0gMHgwNjJkOworIHQuYWZpaTU3NDIyID0gMHgwNjJlOworIHQuYWZpaTU3NDIzID0gMHgwNjJmOworIHQuYWZpaTU3NDI0ID0gMHgwNjMwOworIHQuYWZpaTU3NDI1ID0gMHgwNjMxOworIHQuYWZpaTU3NDI2ID0gMHgwNjMyOworIHQuYWZpaTU3NDI3ID0gMHgwNjMzOworIHQuYWZpaTU3NDI4ID0gMHgwNjM0OworIHQuYWZpaTU3NDI5ID0gMHgwNjM1OworIHQuYWZpaTU3NDMwID0gMHgwNjM2OworIHQuYWZpaTU3NDMxID0gMHgwNjM3OworIHQuYWZpaTU3NDMyID0gMHgwNjM4OworIHQuYWZpaTU3NDMzID0gMHgwNjM5OworIHQuYWZpaTU3NDM0ID0gMHgwNjNhOworIHQuYWZpaTU3NDQwID0gMHgwNjQwOworIHQuYWZpaTU3NDQxID0gMHgwNjQxOworIHQuYWZpaTU3NDQyID0gMHgwNjQyOworIHQuYWZpaTU3NDQzID0gMHgwNjQzOworIHQuYWZpaTU3NDQ0ID0gMHgwNjQ0OworIHQuYWZpaTU3NDQ1ID0gMHgwNjQ1OworIHQuYWZpaTU3NDQ2ID0gMHgwNjQ2OworIHQuYWZpaTU3NDQ4ID0gMHgwNjQ4OworIHQuYWZpaTU3NDQ5ID0gMHgwNjQ5OworIHQuYWZpaTU3NDUwID0gMHgwNjRhOworIHQuYWZpaTU3NDUxID0gMHgwNjRiOworIHQuYWZpaTU3NDUyID0gMHgwNjRjOworIHQuYWZpaTU3NDUzID0gMHgwNjRkOworIHQuYWZpaTU3NDU0ID0gMHgwNjRlOworIHQuYWZpaTU3NDU1ID0gMHgwNjRmOworIHQuYWZpaTU3NDU2ID0gMHgwNjUwOworIHQuYWZpaTU3NDU3ID0gMHgwNjUxOworIHQuYWZpaTU3NDU4ID0gMHgwNjUyOworIHQuYWZpaTU3NDcwID0gMHgwNjQ3OworIHQuYWZpaTU3NTA1ID0gMHgwNmE0OworIHQuYWZpaTU3NTA2ID0gMHgwNjdlOworIHQuYWZpaTU3NTA3ID0gMHgwNjg2OworIHQuYWZpaTU3NTA4ID0gMHgwNjk4OworIHQuYWZpaTU3NTA5ID0gMHgwNmFmOworIHQuYWZpaTU3NTExID0gMHgwNjc5OworIHQuYWZpaTU3NTEyID0gMHgwNjg4OworIHQuYWZpaTU3NTEzID0gMHgwNjkxOworIHQuYWZpaTU3NTE0ID0gMHgwNmJhOworIHQuYWZpaTU3NTE5ID0gMHgwNmQyOworIHQuYWZpaTU3NTM0ID0gMHgwNmQ1OworIHQuYWZpaTU3NjM2ID0gMHgyMGFhOworIHQuYWZpaTU3NjQ1ID0gMHgwNWJlOworIHQuYWZpaTU3NjU4ID0gMHgwNWMzOworIHQuYWZpaTU3NjY0ID0gMHgwNWQwOworIHQuYWZpaTU3NjY1ID0gMHgwNWQxOworIHQuYWZpaTU3NjY2ID0gMHgwNWQyOworIHQuYWZpaTU3NjY3ID0gMHgwNWQzOworIHQuYWZpaTU3NjY4ID0gMHgwNWQ0OworIHQuYWZpaTU3NjY5ID0gMHgwNWQ1OworIHQuYWZpaTU3NjcwID0gMHgwNWQ2OworIHQuYWZpaTU3NjcxID0gMHgwNWQ3OworIHQuYWZpaTU3NjcyID0gMHgwNWQ4OworIHQuYWZpaTU3NjczID0gMHgwNWQ5OworIHQuYWZpaTU3Njc0ID0gMHgwNWRhOworIHQuYWZpaTU3Njc1ID0gMHgwNWRiOworIHQuYWZpaTU3Njc2ID0gMHgwNWRjOworIHQuYWZpaTU3Njc3ID0gMHgwNWRkOworIHQuYWZpaTU3Njc4ID0gMHgwNWRlOworIHQuYWZpaTU3Njc5ID0gMHgwNWRmOworIHQuYWZpaTU3NjgwID0gMHgwNWUwOworIHQuYWZpaTU3NjgxID0gMHgwNWUxOworIHQuYWZpaTU3NjgyID0gMHgwNWUyOworIHQuYWZpaTU3NjgzID0gMHgwNWUzOworIHQuYWZpaTU3Njg0ID0gMHgwNWU0OworIHQuYWZpaTU3Njg1ID0gMHgwNWU1OworIHQuYWZpaTU3Njg2ID0gMHgwNWU2OworIHQuYWZpaTU3Njg3ID0gMHgwNWU3OworIHQuYWZpaTU3Njg4ID0gMHgwNWU4OworIHQuYWZpaTU3Njg5ID0gMHgwNWU5OworIHQuYWZpaTU3NjkwID0gMHgwNWVhOworIHQuYWZpaTU3Njk0ID0gMHhmYjJhOworIHQuYWZpaTU3Njk1ID0gMHhmYjJiOworIHQuYWZpaTU3NzAwID0gMHhmYjRiOworIHQuYWZpaTU3NzA1ID0gMHhmYjFmOworIHQuYWZpaTU3NzE2ID0gMHgwNWYwOworIHQuYWZpaTU3NzE3ID0gMHgwNWYxOworIHQuYWZpaTU3NzE4ID0gMHgwNWYyOworIHQuYWZpaTU3NzIzID0gMHhmYjM1OworIHQuYWZpaTU3NzkzID0gMHgwNWI0OworIHQuYWZpaTU3Nzk0ID0gMHgwNWI1OworIHQuYWZpaTU3Nzk1ID0gMHgwNWI2OworIHQuYWZpaTU3Nzk2ID0gMHgwNWJiOworIHQuYWZpaTU3Nzk3ID0gMHgwNWI4OworIHQuYWZpaTU3Nzk4ID0gMHgwNWI3OworIHQuYWZpaTU3Nzk5ID0gMHgwNWIwOworIHQuYWZpaTU3ODAwID0gMHgwNWIyOworIHQuYWZpaTU3ODAxID0gMHgwNWIxOworIHQuYWZpaTU3ODAyID0gMHgwNWIzOworIHQuYWZpaTU3ODAzID0gMHgwNWMyOworIHQuYWZpaTU3ODA0ID0gMHgwNWMxOworIHQuYWZpaTU3ODA2ID0gMHgwNWI5OworIHQuYWZpaTU3ODA3ID0gMHgwNWJjOworIHQuYWZpaTU3ODM5ID0gMHgwNWJkOworIHQuYWZpaTU3ODQxID0gMHgwNWJmOworIHQuYWZpaTU3ODQyID0gMHgwNWMwOworIHQuYWZpaTU3OTI5ID0gMHgwMmJjOworIHQuYWZpaTYxMjQ4ID0gMHgyMTA1OworIHQuYWZpaTYxMjg5ID0gMHgyMTEzOworIHQuYWZpaTYxMzUyID0gMHgyMTE2OworIHQuYWZpaTYxNTczID0gMHgyMDJjOworIHQuYWZpaTYxNTc0ID0gMHgyMDJkOworIHQuYWZpaTYxNTc1ID0gMHgyMDJlOworIHQuYWZpaTYxNjY0ID0gMHgyMDBjOworIHQuYWZpaTYzMTY3ID0gMHgwNjZkOworIHQuYWZpaTY0OTM3ID0gMHgwMmJkOworIHQuYWdyYXZlID0gMHgwMGUwOworIHQuYWd1amFyYXRpID0gMHgwYTg1OworIHQuYWd1cm11a2hpID0gMHgwYTA1OworIHQuYWhpcmFnYW5hID0gMHgzMDQyOworIHQuYWhvb2thYm92ZSA9IDB4MWVhMzsKKyB0LmFpYmVuZ2FsaSA9IDB4MDk5MDsKKyB0LmFpYm9wb21vZm8gPSAweDMxMWU7CisgdC5haWRldmEgPSAweDA5MTA7CisgdC5haWVjeXJpbGxpYyA9IDB4MDRkNTsKKyB0LmFpZ3VqYXJhdGkgPSAweDBhOTA7CisgdC5haWd1cm11a2hpID0gMHgwYTEwOworIHQuYWltYXRyYWd1cm11a2hpID0gMHgwYTQ4OworIHQuYWluYXJhYmljID0gMHgwNjM5OworIHQuYWluZmluYWxhcmFiaWMgPSAweGZlY2E7CisgdC5haW5pbml0aWFsYXJhYmljID0gMHhmZWNiOworIHQuYWlubWVkaWFsYXJhYmljID0gMHhmZWNjOworIHQuYWludmVydGVkYnJldmUgPSAweDAyMDM7CisgdC5haXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzg7CisgdC5haXZvd2Vsc2lnbmRldmEgPSAweDA5NDg7CisgdC5haXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM4OworIHQuYWthdGFrYW5hID0gMHgzMGEyOworIHQuYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcxOworIHQuYWtvcmVhbiA9IDB4MzE0ZjsKKyB0LmFsZWYgPSAweDA1ZDA7CisgdC5hbGVmYXJhYmljID0gMHgwNjI3OworIHQuYWxlZmRhZ2VzaGhlYnJldyA9IDB4ZmIzMDsKKyB0LmFsZWZmaW5hbGFyYWJpYyA9IDB4ZmU4ZTsKKyB0LmFsZWZoYW16YWFib3ZlYXJhYmljID0gMHgwNjIzOworIHQuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NDsKKyB0LmFsZWZoYW16YWJlbG93YXJhYmljID0gMHgwNjI1OworIHQuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmU4ODsKKyB0LmFsZWZoZWJyZXcgPSAweDA1ZDA7CisgdC5hbGVmbGFtZWRoZWJyZXcgPSAweGZiNGY7CisgdC5hbGVmbWFkZGFhYm92ZWFyYWJpYyA9IDB4MDYyMjsKKyB0LmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODI7CisgdC5hbGVmbWFrc3VyYWFyYWJpYyA9IDB4MDY0OTsKKyB0LmFsZWZtYWtzdXJhZmluYWxhcmFiaWMgPSAweGZlZjA7CisgdC5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWMgPSAweGZlZjM7CisgdC5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKKyB0LmFsZWZwYXRhaGhlYnJldyA9IDB4ZmIyZTsKKyB0LmFsZWZxYW1hdHNoZWJyZXcgPSAweGZiMmY7CisgdC5hbGVwaCA9IDB4MjEzNTsKKyB0LmFsbGVxdWFsID0gMHgyMjRjOworIHQuYWxwaGEgPSAweDAzYjE7CisgdC5hbHBoYXRvbm9zID0gMHgwM2FjOworIHQuYW1hY3JvbiA9IDB4MDEwMTsKKyB0LmFtb25vc3BhY2UgPSAweGZmNDE7CisgdC5hbXBlcnNhbmQgPSAweDAwMjY7CisgdC5hbXBlcnNhbmRtb25vc3BhY2UgPSAweGZmMDY7CisgdC5hbXBlcnNhbmRzbWFsbCA9IDB4ZjcyNjsKKyB0LmFtc3F1YXJlID0gMHgzM2MyOworIHQuYW5ib3BvbW9mbyA9IDB4MzEyMjsKKyB0LmFuZ2JvcG9tb2ZvID0gMHgzMTI0OworIHQuYW5nYnJhY2tldGxlZnQgPSAweDMwMDg7CisgdC5hbmdicmFja2V0cmlnaHQgPSAweDMwMDk7CisgdC5hbmdraGFua2h1dGhhaSA9IDB4MGU1YTsKKyB0LmFuZ2xlID0gMHgyMjIwOworIHQuYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwODsKKyB0LmFuZ2xlYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzZjsKKyB0LmFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDA5OworIHQuYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0MDsKKyB0LmFuZ2xlbGVmdCA9IDB4MjMyOTsKKyB0LmFuZ2xlcmlnaHQgPSAweDIzMmE7CisgdC5hbmdzdHJvbSA9IDB4MjEyYjsKKyB0LmFub3RlbGVpYSA9IDB4MDM4NzsKKyB0LmFudWRhdHRhZGV2YSA9IDB4MDk1MjsKKyB0LmFudXN2YXJhYmVuZ2FsaSA9IDB4MDk4MjsKKyB0LmFudXN2YXJhZGV2YSA9IDB4MDkwMjsKKyB0LmFudXN2YXJhZ3VqYXJhdGkgPSAweDBhODI7CisgdC5hb2dvbmVrID0gMHgwMTA1OworIHQuYXBhYXRvc3F1YXJlID0gMHgzMzAwOworIHQuYXBhcmVuID0gMHgyNDljOworIHQuYXBvc3Ryb3BoZWFybWVuaWFuID0gMHgwNTVhOworIHQuYXBvc3Ryb3BoZW1vZCA9IDB4MDJiYzsKKyB0LmFwcGxlID0gMHhmOGZmOworIHQuYXBwcm9hY2hlcyA9IDB4MjI1MDsKKyB0LmFwcHJveGVxdWFsID0gMHgyMjQ4OworIHQuYXBwcm94ZXF1YWxvcmltYWdlID0gMHgyMjUyOworIHQuYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjQ1OworIHQuYXJhZWFla29yZWFuID0gMHgzMThlOworIHQuYXJhZWFrb3JlYW4gPSAweDMxOGQ7CisgdC5hcmMgPSAweDIzMTI7CisgdC5hcmlnaHRoYWxmcmluZyA9IDB4MWU5YTsKKyB0LmFyaW5nID0gMHgwMGU1OworIHQuYXJpbmdhY3V0ZSA9IDB4MDFmYjsKKyB0LmFyaW5nYmVsb3cgPSAweDFlMDE7CisgdC5hcnJvd2JvdGggPSAweDIxOTQ7CisgdC5hcnJvd2Rhc2hkb3duID0gMHgyMWUzOworIHQuYXJyb3dkYXNobGVmdCA9IDB4MjFlMDsKKyB0LmFycm93ZGFzaHJpZ2h0ID0gMHgyMWUyOworIHQuYXJyb3dkYXNodXAgPSAweDIxZTE7CisgdC5hcnJvd2RibGJvdGggPSAweDIxZDQ7CisgdC5hcnJvd2RibGRvd24gPSAweDIxZDM7CisgdC5hcnJvd2RibGxlZnQgPSAweDIxZDA7CisgdC5hcnJvd2RibHJpZ2h0ID0gMHgyMWQyOworIHQuYXJyb3dkYmx1cCA9IDB4MjFkMTsKKyB0LmFycm93ZG93biA9IDB4MjE5MzsKKyB0LmFycm93ZG93bmxlZnQgPSAweDIxOTk7CisgdC5hcnJvd2Rvd25yaWdodCA9IDB4MjE5ODsKKyB0LmFycm93ZG93bndoaXRlID0gMHgyMWU5OworIHQuYXJyb3doZWFkZG93bm1vZCA9IDB4MDJjNTsKKyB0LmFycm93aGVhZGxlZnRtb2QgPSAweDAyYzI7CisgdC5hcnJvd2hlYWRyaWdodG1vZCA9IDB4MDJjMzsKKyB0LmFycm93aGVhZHVwbW9kID0gMHgwMmM0OworIHQuYXJyb3dob3JpemV4ID0gMHhmOGU3OworIHQuYXJyb3dsZWZ0ID0gMHgyMTkwOworIHQuYXJyb3dsZWZ0ZGJsID0gMHgyMWQwOworIHQuYXJyb3dsZWZ0ZGJsc3Ryb2tlID0gMHgyMWNkOworIHQuYXJyb3dsZWZ0b3ZlcnJpZ2h0ID0gMHgyMWM2OworIHQuYXJyb3dsZWZ0d2hpdGUgPSAweDIxZTY7CisgdC5hcnJvd3JpZ2h0ID0gMHgyMTkyOworIHQuYXJyb3dyaWdodGRibHN0cm9rZSA9IDB4MjFjZjsKKyB0LmFycm93cmlnaHRoZWF2eSA9IDB4Mjc5ZTsKKyB0LmFycm93cmlnaHRvdmVybGVmdCA9IDB4MjFjNDsKKyB0LmFycm93cmlnaHR3aGl0ZSA9IDB4MjFlODsKKyB0LmFycm93dGFibGVmdCA9IDB4MjFlNDsKKyB0LmFycm93dGFicmlnaHQgPSAweDIxZTU7CisgdC5hcnJvd3VwID0gMHgyMTkxOworIHQuYXJyb3d1cGRuID0gMHgyMTk1OworIHQuYXJyb3d1cGRuYnNlID0gMHgyMWE4OworIHQuYXJyb3d1cGRvd25iYXNlID0gMHgyMWE4OworIHQuYXJyb3d1cGxlZnQgPSAweDIxOTY7CisgdC5hcnJvd3VwbGVmdG9mZG93biA9IDB4MjFjNTsKKyB0LmFycm93dXByaWdodCA9IDB4MjE5NzsKKyB0LmFycm93dXB3aGl0ZSA9IDB4MjFlNzsKKyB0LmFycm93dmVydGV4ID0gMHhmOGU2OworIHQuYXNjaWljaXJjdW0gPSAweDAwNWU7CisgdC5hc2NpaWNpcmN1bW1vbm9zcGFjZSA9IDB4ZmYzZTsKKyB0LmFzY2lpdGlsZGUgPSAweDAwN2U7CisgdC5hc2NpaXRpbGRlbW9ub3NwYWNlID0gMHhmZjVlOworIHQuYXNjcmlwdCA9IDB4MDI1MTsKKyB0LmFzY3JpcHR0dXJuZWQgPSAweDAyNTI7CisgdC5hc21hbGxoaXJhZ2FuYSA9IDB4MzA0MTsKKyB0LmFzbWFsbGthdGFrYW5hID0gMHgzMGExOworIHQuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjc7CisgdC5hc3RlcmlzayA9IDB4MDAyYTsKKyB0LmFzdGVyaXNrYWx0b25lYXJhYmljID0gMHgwNjZkOworIHQuYXN0ZXJpc2thcmFiaWMgPSAweDA2NmQ7CisgdC5hc3Rlcmlza21hdGggPSAweDIyMTc7CisgdC5hc3Rlcmlza21vbm9zcGFjZSA9IDB4ZmYwYTsKKyB0LmFzdGVyaXNrc21hbGwgPSAweGZlNjE7CisgdC5hc3RlcmlzbSA9IDB4MjA0MjsKKyB0LmFzdXBlcmlvciA9IDB4ZjZlOTsKKyB0LmFzeW1wdG90aWNhbGx5ZXF1YWwgPSAweDIyNDM7CisgdC5hdCA9IDB4MDA0MDsKKyB0LmF0aWxkZSA9IDB4MDBlMzsKKyB0LmF0bW9ub3NwYWNlID0gMHhmZjIwOworIHQuYXRzbWFsbCA9IDB4ZmU2YjsKKyB0LmF0dXJuZWQgPSAweDAyNTA7CisgdC5hdWJlbmdhbGkgPSAweDA5OTQ7CisgdC5hdWJvcG9tb2ZvID0gMHgzMTIwOworIHQuYXVkZXZhID0gMHgwOTE0OworIHQuYXVndWphcmF0aSA9IDB4MGE5NDsKKyB0LmF1Z3VybXVraGkgPSAweDBhMTQ7CisgdC5hdWxlbmd0aG1hcmtiZW5nYWxpID0gMHgwOWQ3OworIHQuYXVtYXRyYWd1cm11a2hpID0gMHgwYTRjOworIHQuYXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNjOworIHQuYXV2b3dlbHNpZ25kZXZhID0gMHgwOTRjOworIHQuYXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjYzsKKyB0LmF2YWdyYWhhZGV2YSA9IDB4MDkzZDsKKyB0LmF5YmFybWVuaWFuID0gMHgwNTYxOworIHQuYXlpbiA9IDB4MDVlMjsKKyB0LmF5aW5hbHRvbmVoZWJyZXcgPSAweGZiMjA7CisgdC5heWluaGVicmV3ID0gMHgwNWUyOworIHQuYiA9IDB4MDA2MjsKKyB0LmJhYmVuZ2FsaSA9IDB4MDlhYzsKKyB0LmJhY2tzbGFzaCA9IDB4MDA1YzsKKyB0LmJhY2tzbGFzaG1vbm9zcGFjZSA9IDB4ZmYzYzsKKyB0LmJhZGV2YSA9IDB4MDkyYzsKKyB0LmJhZ3VqYXJhdGkgPSAweDBhYWM7CisgdC5iYWd1cm11a2hpID0gMHgwYTJjOworIHQuYmFoaXJhZ2FuYSA9IDB4MzA3MDsKKyB0LmJhaHR0aGFpID0gMHgwZTNmOworIHQuYmFrYXRha2FuYSA9IDB4MzBkMDsKKyB0LmJhciA9IDB4MDA3YzsKKyB0LmJhcm1vbm9zcGFjZSA9IDB4ZmY1YzsKKyB0LmJib3BvbW9mbyA9IDB4MzEwNTsKKyB0LmJjaXJjbGUgPSAweDI0ZDE7CisgdC5iZG90YWNjZW50ID0gMHgxZTAzOworIHQuYmRvdGJlbG93ID0gMHgxZTA1OworIHQuYmVhbWVkc2l4dGVlbnRobm90ZXMgPSAweDI2NmM7CisgdC5iZWNhdXNlID0gMHgyMjM1OworIHQuYmVjeXJpbGxpYyA9IDB4MDQzMTsKKyB0LmJlaGFyYWJpYyA9IDB4MDYyODsKKyB0LmJlaGZpbmFsYXJhYmljID0gMHhmZTkwOworIHQuYmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5MTsKKyB0LmJlaGlyYWdhbmEgPSAweDMwNzk7CisgdC5iZWhtZWRpYWxhcmFiaWMgPSAweGZlOTI7CisgdC5iZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmM5ZjsKKyB0LmJlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwODsKKyB0LmJlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM2ZDsKKyB0LmJla2F0YWthbmEgPSAweDMwZDk7CisgdC5iZW5hcm1lbmlhbiA9IDB4MDU2MjsKKyB0LmJldCA9IDB4MDVkMTsKKyB0LmJldGEgPSAweDAzYjI7CisgdC5iZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDA7CisgdC5iZXRkYWdlc2ggPSAweGZiMzE7CisgdC5iZXRkYWdlc2hoZWJyZXcgPSAweGZiMzE7CisgdC5iZXRoZWJyZXcgPSAweDA1ZDE7CisgdC5iZXRyYWZlaGVicmV3ID0gMHhmYjRjOworIHQuYmhhYmVuZ2FsaSA9IDB4MDlhZDsKKyB0LmJoYWRldmEgPSAweDA5MmQ7CisgdC5iaGFndWphcmF0aSA9IDB4MGFhZDsKKyB0LmJoYWd1cm11a2hpID0gMHgwYTJkOworIHQuYmhvb2sgPSAweDAyNTM7CisgdC5iaWhpcmFnYW5hID0gMHgzMDczOworIHQuYmlrYXRha2FuYSA9IDB4MzBkMzsKKyB0LmJpbGFiaWFsY2xpY2sgPSAweDAyOTg7CisgdC5iaW5kaWd1cm11a2hpID0gMHgwYTAyOworIHQuYmlydXNxdWFyZSA9IDB4MzMzMTsKKyB0LmJsYWNrY2lyY2xlID0gMHgyNWNmOworIHQuYmxhY2tkaWFtb25kID0gMHgyNWM2OworIHQuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViYzsKKyB0LmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciA9IDB4MjVjNDsKKyB0LmJsYWNrbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzA7CisgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxMDsKKyB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2I7CisgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTE7CisgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYzsKKyB0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTM7CisgdC5ibGFja2xvd2VycmlnaHR0cmlhbmdsZSA9IDB4MjVlMjsKKyB0LmJsYWNrcmVjdGFuZ2xlID0gMHgyNWFjOworIHQuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciA9IDB4MjViYTsKKyB0LmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI2OworIHQuYmxhY2tzbWFsbHNxdWFyZSA9IDB4MjVhYTsKKyB0LmJsYWNrc21pbGluZ2ZhY2UgPSAweDI2M2I7CisgdC5ibGFja3NxdWFyZSA9IDB4MjVhMDsKKyB0LmJsYWNrc3RhciA9IDB4MjYwNTsKKyB0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTQ7CisgdC5ibGFja3VwcGVycmlnaHR0cmlhbmdsZSA9IDB4MjVlNTsKKyB0LmJsYWNrdXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjQ7CisgdC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMjsKKyB0LmJsYW5rID0gMHgyNDIzOworIHQuYmxpbmViZWxvdyA9IDB4MWUwNzsKKyB0LmJsb2NrID0gMHgyNTg4OworIHQuYm1vbm9zcGFjZSA9IDB4ZmY0MjsKKyB0LmJvYmFpbWFpdGhhaSA9IDB4MGUxYTsKKyB0LmJvaGlyYWdhbmEgPSAweDMwN2M7CisgdC5ib2thdGFrYW5hID0gMHgzMGRjOworIHQuYnBhcmVuID0gMHgyNDlkOworIHQuYnFzcXVhcmUgPSAweDMzYzM7CisgdC5icmFjZWV4ID0gMHhmOGY0OworIHQuYnJhY2VsZWZ0ID0gMHgwMDdiOworIHQuYnJhY2VsZWZ0YnQgPSAweGY4ZjM7CisgdC5icmFjZWxlZnRtaWQgPSAweGY4ZjI7CisgdC5icmFjZWxlZnRtb25vc3BhY2UgPSAweGZmNWI7CisgdC5icmFjZWxlZnRzbWFsbCA9IDB4ZmU1YjsKKyB0LmJyYWNlbGVmdHRwID0gMHhmOGYxOworIHQuYnJhY2VsZWZ0dmVydGljYWwgPSAweGZlMzc7CisgdC5icmFjZXJpZ2h0ID0gMHgwMDdkOworIHQuYnJhY2VyaWdodGJ0ID0gMHhmOGZlOworIHQuYnJhY2VyaWdodG1pZCA9IDB4ZjhmZDsKKyB0LmJyYWNlcmlnaHRtb25vc3BhY2UgPSAweGZmNWQ7CisgdC5icmFjZXJpZ2h0c21hbGwgPSAweGZlNWM7CisgdC5icmFjZXJpZ2h0dHAgPSAweGY4ZmM7CisgdC5icmFjZXJpZ2h0dmVydGljYWwgPSAweGZlMzg7CisgdC5icmFja2V0bGVmdCA9IDB4MDA1YjsKKyB0LmJyYWNrZXRsZWZ0YnQgPSAweGY4ZjA7CisgdC5icmFja2V0bGVmdGV4ID0gMHhmOGVmOworIHQuYnJhY2tldGxlZnRtb25vc3BhY2UgPSAweGZmM2I7CisgdC5icmFja2V0bGVmdHRwID0gMHhmOGVlOworIHQuYnJhY2tldHJpZ2h0ID0gMHgwMDVkOworIHQuYnJhY2tldHJpZ2h0YnQgPSAweGY4ZmI7CisgdC5icmFja2V0cmlnaHRleCA9IDB4ZjhmYTsKKyB0LmJyYWNrZXRyaWdodG1vbm9zcGFjZSA9IDB4ZmYzZDsKKyB0LmJyYWNrZXRyaWdodHRwID0gMHhmOGY5OworIHQuYnJldmUgPSAweDAyZDg7CisgdC5icmV2ZWJlbG93Y21iID0gMHgwMzJlOworIHQuYnJldmVjbWIgPSAweDAzMDY7CisgdC5icmV2ZWludmVydGVkYmVsb3djbWIgPSAweDAzMmY7CisgdC5icmV2ZWludmVydGVkY21iID0gMHgwMzExOworIHQuYnJldmVpbnZlcnRlZGRvdWJsZWNtYiA9IDB4MDM2MTsKKyB0LmJyaWRnZWJlbG93Y21iID0gMHgwMzJhOworIHQuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMzYTsKKyB0LmJyb2tlbmJhciA9IDB4MDBhNjsKKyB0LmJzdHJva2UgPSAweDAxODA7CisgdC5ic3VwZXJpb3IgPSAweGY2ZWE7CisgdC5idG9wYmFyID0gMHgwMTgzOworIHQuYnVoaXJhZ2FuYSA9IDB4MzA3NjsKKyB0LmJ1a2F0YWthbmEgPSAweDMwZDY7CisgdC5idWxsZXQgPSAweDIwMjI7CisgdC5idWxsZXRpbnZlcnNlID0gMHgyNWQ4OworIHQuYnVsbGV0b3BlcmF0b3IgPSAweDIyMTk7CisgdC5idWxsc2V5ZSA9IDB4MjVjZTsKKyB0LmMgPSAweDAwNjM7CisgdC5jYWFybWVuaWFuID0gMHgwNTZlOworIHQuY2FiZW5nYWxpID0gMHgwOTlhOworIHQuY2FjdXRlID0gMHgwMTA3OworIHQuY2FkZXZhID0gMHgwOTFhOworIHQuY2FndWphcmF0aSA9IDB4MGE5YTsKKyB0LmNhZ3VybXVraGkgPSAweDBhMWE7CisgdC5jYWxzcXVhcmUgPSAweDMzODg7CisgdC5jYW5kcmFiaW5kdWJlbmdhbGkgPSAweDA5ODE7CisgdC5jYW5kcmFiaW5kdWNtYiA9IDB4MDMxMDsKKyB0LmNhbmRyYWJpbmR1ZGV2YSA9IDB4MDkwMTsKKyB0LmNhbmRyYWJpbmR1Z3VqYXJhdGkgPSAweDBhODE7CisgdC5jYXBzbG9jayA9IDB4MjFlYTsKKyB0LmNhcmVvZiA9IDB4MjEwNTsKKyB0LmNhcm9uID0gMHgwMmM3OworIHQuY2Fyb25iZWxvd2NtYiA9IDB4MDMyYzsKKyB0LmNhcm9uY21iID0gMHgwMzBjOworIHQuY2FycmlhZ2VyZXR1cm4gPSAweDIxYjU7CisgdC5jYm9wb21vZm8gPSAweDMxMTg7CisgdC5jY2Fyb24gPSAweDAxMGQ7CisgdC5jY2VkaWxsYSA9IDB4MDBlNzsKKyB0LmNjZWRpbGxhYWN1dGUgPSAweDFlMDk7CisgdC5jY2lyY2xlID0gMHgyNGQyOworIHQuY2NpcmN1bWZsZXggPSAweDAxMDk7CisgdC5jY3VybCA9IDB4MDI1NTsKKyB0LmNkb3QgPSAweDAxMGI7CisgdC5jZG90YWNjZW50ID0gMHgwMTBiOworIHQuY2RzcXVhcmUgPSAweDMzYzU7CisgdC5jZWRpbGxhID0gMHgwMGI4OworIHQuY2VkaWxsYWNtYiA9IDB4MDMyNzsKKyB0LmNlbnQgPSAweDAwYTI7CisgdC5jZW50aWdyYWRlID0gMHgyMTAzOworIHQuY2VudGluZmVyaW9yID0gMHhmNmRmOworIHQuY2VudG1vbm9zcGFjZSA9IDB4ZmZlMDsKKyB0LmNlbnRvbGRzdHlsZSA9IDB4ZjdhMjsKKyB0LmNlbnRzdXBlcmlvciA9IDB4ZjZlMDsKKyB0LmNoYWFybWVuaWFuID0gMHgwNTc5OworIHQuY2hhYmVuZ2FsaSA9IDB4MDk5YjsKKyB0LmNoYWRldmEgPSAweDA5MWI7CisgdC5jaGFndWphcmF0aSA9IDB4MGE5YjsKKyB0LmNoYWd1cm11a2hpID0gMHgwYTFiOworIHQuY2hib3BvbW9mbyA9IDB4MzExNDsKKyB0LmNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJkOworIHQuY2hlY2ttYXJrID0gMHgyNzEzOworIHQuY2hlY3lyaWxsaWMgPSAweDA0NDc7CisgdC5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZjsKKyB0LmNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI3OworIHQuY2hlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmNTsKKyB0LmNoZWhhcm1lbmlhbiA9IDB4MDU3MzsKKyB0LmNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYzsKKyB0LmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0Yjk7CisgdC5jaGkgPSAweDAzYzc7CisgdC5jaGlldWNoYWNpcmNsZWtvcmVhbiA9IDB4MzI3NzsKKyB0LmNoaWV1Y2hhcGFyZW5rb3JlYW4gPSAweDMyMTc7CisgdC5jaGlldWNoY2lyY2xla29yZWFuID0gMHgzMjY5OworIHQuY2hpZXVjaGtvcmVhbiA9IDB4MzE0YTsKKyB0LmNoaWV1Y2hwYXJlbmtvcmVhbiA9IDB4MzIwOTsKKyB0LmNob2NoYW5ndGhhaSA9IDB4MGUwYTsKKyB0LmNob2NoYW50aGFpID0gMHgwZTA4OworIHQuY2hvY2hpbmd0aGFpID0gMHgwZTA5OworIHQuY2hvY2hvZXRoYWkgPSAweDBlMGM7CisgdC5jaG9vayA9IDB4MDE4ODsKKyB0LmNpZXVjYWNpcmNsZWtvcmVhbiA9IDB4MzI3NjsKKyB0LmNpZXVjYXBhcmVua29yZWFuID0gMHgzMjE2OworIHQuY2lldWNjaXJjbGVrb3JlYW4gPSAweDMyNjg7CisgdC5jaWV1Y2tvcmVhbiA9IDB4MzE0ODsKKyB0LmNpZXVjcGFyZW5rb3JlYW4gPSAweDMyMDg7CisgdC5jaWV1Y3VwYXJlbmtvcmVhbiA9IDB4MzIxYzsKKyB0LmNpcmNsZSA9IDB4MjVjYjsKKyB0LmNpcmNsZWNvcHlydCA9IDB4MDBhOTsKKyB0LmNpcmNsZW11bHRpcGx5ID0gMHgyMjk3OworIHQuY2lyY2xlb3QgPSAweDIyOTk7CisgdC5jaXJjbGVwbHVzID0gMHgyMjk1OworIHQuY2lyY2xlcG9zdGFsbWFyayA9IDB4MzAzNjsKKyB0LmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrID0gMHgyNWQwOworIHQuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrID0gMHgyNWQxOworIHQuY2lyY3VtZmxleCA9IDB4MDJjNjsKKyB0LmNpcmN1bWZsZXhiZWxvd2NtYiA9IDB4MDMyZDsKKyB0LmNpcmN1bWZsZXhjbWIgPSAweDAzMDI7CisgdC5jbGVhciA9IDB4MjMyNzsKKyB0LmNsaWNrYWx2ZW9sYXIgPSAweDAxYzI7CisgdC5jbGlja2RlbnRhbCA9IDB4MDFjMDsKKyB0LmNsaWNrbGF0ZXJhbCA9IDB4MDFjMTsKKyB0LmNsaWNrcmV0cm9mbGV4ID0gMHgwMWMzOworIHQuY2x1YiA9IDB4MjY2MzsKKyB0LmNsdWJzdWl0YmxhY2sgPSAweDI2NjM7CisgdC5jbHVic3VpdHdoaXRlID0gMHgyNjY3OworIHQuY21jdWJlZHNxdWFyZSA9IDB4MzNhNDsKKyB0LmNtb25vc3BhY2UgPSAweGZmNDM7CisgdC5jbXNxdWFyZWRzcXVhcmUgPSAweDMzYTA7CisgdC5jb2FybWVuaWFuID0gMHgwNTgxOworIHQuY29sb24gPSAweDAwM2E7CisgdC5jb2xvbm1vbmV0YXJ5ID0gMHgyMGExOworIHQuY29sb25tb25vc3BhY2UgPSAweGZmMWE7CisgdC5jb2xvbnNpZ24gPSAweDIwYTE7CisgdC5jb2xvbnNtYWxsID0gMHhmZTU1OworIHQuY29sb250cmlhbmd1bGFyaGFsZm1vZCA9IDB4MDJkMTsKKyB0LmNvbG9udHJpYW5ndWxhcm1vZCA9IDB4MDJkMDsKKyB0LmNvbW1hID0gMHgwMDJjOworIHQuY29tbWFhYm92ZWNtYiA9IDB4MDMxMzsKKyB0LmNvbW1hYWJvdmVyaWdodGNtYiA9IDB4MDMxNTsKKyB0LmNvbW1hYWNjZW50ID0gMHhmNmMzOworIHQuY29tbWFhcmFiaWMgPSAweDA2MGM7CisgdC5jb21tYWFybWVuaWFuID0gMHgwNTVkOworIHQuY29tbWFpbmZlcmlvciA9IDB4ZjZlMTsKKyB0LmNvbW1hbW9ub3NwYWNlID0gMHhmZjBjOworIHQuY29tbWFyZXZlcnNlZGFib3ZlY21iID0gMHgwMzE0OworIHQuY29tbWFyZXZlcnNlZG1vZCA9IDB4MDJiZDsKKyB0LmNvbW1hc21hbGwgPSAweGZlNTA7CisgdC5jb21tYXN1cGVyaW9yID0gMHhmNmUyOworIHQuY29tbWF0dXJuZWRhYm92ZWNtYiA9IDB4MDMxMjsKKyB0LmNvbW1hdHVybmVkbW9kID0gMHgwMmJiOworIHQuY29tcGFzcyA9IDB4MjYzYzsKKyB0LmNvbmdydWVudCA9IDB4MjI0NTsKKyB0LmNvbnRvdXJpbnRlZ3JhbCA9IDB4MjIyZTsKKyB0LmNvbnRyb2wgPSAweDIzMDM7CisgdC5jb250cm9sQUNLID0gMHgwMDA2OworIHQuY29udHJvbEJFTCA9IDB4MDAwNzsKKyB0LmNvbnRyb2xCUyA9IDB4MDAwODsKKyB0LmNvbnRyb2xDQU4gPSAweDAwMTg7CisgdC5jb250cm9sQ1IgPSAweDAwMGQ7CisgdC5jb250cm9sREMxID0gMHgwMDExOworIHQuY29udHJvbERDMiA9IDB4MDAxMjsKKyB0LmNvbnRyb2xEQzMgPSAweDAwMTM7CisgdC5jb250cm9sREM0ID0gMHgwMDE0OworIHQuY29udHJvbERFTCA9IDB4MDA3ZjsKKyB0LmNvbnRyb2xETEUgPSAweDAwMTA7CisgdC5jb250cm9sRU0gPSAweDAwMTk7CisgdC5jb250cm9sRU5RID0gMHgwMDA1OworIHQuY29udHJvbEVPVCA9IDB4MDAwNDsKKyB0LmNvbnRyb2xFU0MgPSAweDAwMWI7CisgdC5jb250cm9sRVRCID0gMHgwMDE3OworIHQuY29udHJvbEVUWCA9IDB4MDAwMzsKKyB0LmNvbnRyb2xGRiA9IDB4MDAwYzsKKyB0LmNvbnRyb2xGUyA9IDB4MDAxYzsKKyB0LmNvbnRyb2xHUyA9IDB4MDAxZDsKKyB0LmNvbnRyb2xIVCA9IDB4MDAwOTsKKyB0LmNvbnRyb2xMRiA9IDB4MDAwYTsKKyB0LmNvbnRyb2xOQUsgPSAweDAwMTU7CisgdC5jb250cm9sTlVMTCA9IDB4MDAwMDsKKyB0LmNvbnRyb2xSUyA9IDB4MDAxZTsKKyB0LmNvbnRyb2xTSSA9IDB4MDAwZjsKKyB0LmNvbnRyb2xTTyA9IDB4MDAwZTsKKyB0LmNvbnRyb2xTT1QgPSAweDAwMDI7CisgdC5jb250cm9sU1RYID0gMHgwMDAxOworIHQuY29udHJvbFNVQiA9IDB4MDAxYTsKKyB0LmNvbnRyb2xTWU4gPSAweDAwMTY7CisgdC5jb250cm9sVVMgPSAweDAwMWY7CisgdC5jb250cm9sVlQgPSAweDAwMGI7CisgdC5jb3B5cmlnaHQgPSAweDAwYTk7CisgdC5jb3B5cmlnaHRzYW5zID0gMHhmOGU5OworIHQuY29weXJpZ2h0c2VyaWYgPSAweGY2ZDk7CisgdC5jb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwYzsKKyB0LmNvcm5lcmJyYWNrZXRsZWZ0aGFsZndpZHRoID0gMHhmZjYyOworIHQuY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MTsKKyB0LmNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZDsKKyB0LmNvcm5lcmJyYWNrZXRyaWdodGhhbGZ3aWR0aCA9IDB4ZmY2MzsKKyB0LmNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQyOworIHQuY29ycG9yYXRpb25zcXVhcmUgPSAweDMzN2Y7CisgdC5jb3NxdWFyZSA9IDB4MzNjNzsKKyB0LmNvdmVya2dzcXVhcmUgPSAweDMzYzY7CisgdC5jcGFyZW4gPSAweDI0OWU7CisgdC5jcnV6ZWlybyA9IDB4MjBhMjsKKyB0LmNzdHJldGNoZWQgPSAweDAyOTc7CisgdC5jdXJseWFuZCA9IDB4MjJjZjsKKyB0LmN1cmx5b3IgPSAweDIyY2U7CisgdC5jdXJyZW5jeSA9IDB4MDBhNDsKKyB0LmN5ckJyZXZlID0gMHhmNmQxOworIHQuY3lyRmxleCA9IDB4ZjZkMjsKKyB0LmN5cmJyZXZlID0gMHhmNmQ0OworIHQuY3lyZmxleCA9IDB4ZjZkNTsKKyB0LmQgPSAweDAwNjQ7CisgdC5kYWFybWVuaWFuID0gMHgwNTY0OworIHQuZGFiZW5nYWxpID0gMHgwOWE2OworIHQuZGFkYXJhYmljID0gMHgwNjM2OworIHQuZGFkZXZhID0gMHgwOTI2OworIHQuZGFkZmluYWxhcmFiaWMgPSAweGZlYmU7CisgdC5kYWRpbml0aWFsYXJhYmljID0gMHhmZWJmOworIHQuZGFkbWVkaWFsYXJhYmljID0gMHhmZWMwOworIHQuZGFnZXNoID0gMHgwNWJjOworIHQuZGFnZXNoaGVicmV3ID0gMHgwNWJjOworIHQuZGFnZ2VyID0gMHgyMDIwOworIHQuZGFnZ2VyZGJsID0gMHgyMDIxOworIHQuZGFndWphcmF0aSA9IDB4MGFhNjsKKyB0LmRhZ3VybXVraGkgPSAweDBhMjY7CisgdC5kYWhpcmFnYW5hID0gMHgzMDYwOworIHQuZGFrYXRha2FuYSA9IDB4MzBjMDsKKyB0LmRhbGFyYWJpYyA9IDB4MDYyZjsKKyB0LmRhbGV0ID0gMHgwNWQzOworIHQuZGFsZXRkYWdlc2ggPSAweGZiMzM7CisgdC5kYWxldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMzsKKyB0LmRhbGV0aGVicmV3ID0gMHgwNWQzOworIHQuZGFsZmluYWxhcmFiaWMgPSAweGZlYWE7CisgdC5kYW1tYWFyYWJpYyA9IDB4MDY0ZjsKKyB0LmRhbW1hbG93YXJhYmljID0gMHgwNjRmOworIHQuZGFtbWF0YW5hbHRvbmVhcmFiaWMgPSAweDA2NGM7CisgdC5kYW1tYXRhbmFyYWJpYyA9IDB4MDY0YzsKKyB0LmRhbmRhID0gMHgwOTY0OworIHQuZGFyZ2FoZWJyZXcgPSAweDA1YTc7CisgdC5kYXJnYWxlZnRoZWJyZXcgPSAweDA1YTc7CisgdC5kYXNpYXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODU7CisgdC5kYmxHcmF2ZSA9IDB4ZjZkMzsKKyB0LmRibGFuZ2xlYnJhY2tldGxlZnQgPSAweDMwMGE7CisgdC5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Q7CisgdC5kYmxhbmdsZWJyYWNrZXRyaWdodCA9IDB4MzAwYjsKKyB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2U7CisgdC5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyYjsKKyB0LmRibGFycm93bGVmdCA9IDB4MjFkNDsKKyB0LmRibGFycm93cmlnaHQgPSAweDIxZDI7CisgdC5kYmxkYW5kYSA9IDB4MDk2NTsKKyB0LmRibGdyYXZlID0gMHhmNmQ2OworIHQuZGJsZ3JhdmVjbWIgPSAweDAzMGY7CisgdC5kYmxpbnRlZ3JhbCA9IDB4MjIyYzsKKyB0LmRibGxvd2xpbmUgPSAweDIwMTc7CisgdC5kYmxsb3dsaW5lY21iID0gMHgwMzMzOworIHQuZGJsb3ZlcmxpbmVjbWIgPSAweDAzM2Y7CisgdC5kYmxwcmltZW1vZCA9IDB4MDJiYTsKKyB0LmRibHZlcnRpY2FsYmFyID0gMHgyMDE2OworIHQuZGJsdmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGU7CisgdC5kYm9wb21vZm8gPSAweDMxMDk7CisgdC5kYnNxdWFyZSA9IDB4MzNjODsKKyB0LmRjYXJvbiA9IDB4MDEwZjsKKyB0LmRjZWRpbGxhID0gMHgxZTExOworIHQuZGNpcmNsZSA9IDB4MjRkMzsKKyB0LmRjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTM7CisgdC5kY3JvYXQgPSAweDAxMTE7CisgdC5kZGFiZW5nYWxpID0gMHgwOWExOworIHQuZGRhZGV2YSA9IDB4MDkyMTsKKyB0LmRkYWd1amFyYXRpID0gMHgwYWExOworIHQuZGRhZ3VybXVraGkgPSAweDBhMjE7CisgdC5kZGFsYXJhYmljID0gMHgwNjg4OworIHQuZGRhbGZpbmFsYXJhYmljID0gMHhmYjg5OworIHQuZGRkaGFkZXZhID0gMHgwOTVjOworIHQuZGRoYWJlbmdhbGkgPSAweDA5YTI7CisgdC5kZGhhZGV2YSA9IDB4MDkyMjsKKyB0LmRkaGFndWphcmF0aSA9IDB4MGFhMjsKKyB0LmRkaGFndXJtdWtoaSA9IDB4MGEyMjsKKyB0LmRkb3RhY2NlbnQgPSAweDFlMGI7CisgdC5kZG90YmVsb3cgPSAweDFlMGQ7CisgdC5kZWNpbWFsc2VwYXJhdG9yYXJhYmljID0gMHgwNjZiOworIHQuZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmI7CisgdC5kZWN5cmlsbGljID0gMHgwNDM0OworIHQuZGVncmVlID0gMHgwMGIwOworIHQuZGVoaWhlYnJldyA9IDB4MDVhZDsKKyB0LmRlaGlyYWdhbmEgPSAweDMwNjc7CisgdC5kZWljb3B0aWMgPSAweDAzZWY7CisgdC5kZWthdGFrYW5hID0gMHgzMGM3OworIHQuZGVsZXRlbGVmdCA9IDB4MjMyYjsKKyB0LmRlbGV0ZXJpZ2h0ID0gMHgyMzI2OworIHQuZGVsdGEgPSAweDAzYjQ7CisgdC5kZWx0YXR1cm5lZCA9IDB4MDE4ZDsKKyB0LmRlbm9taW5hdG9ybWludXNvbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY4OworIHQuZGV6aCA9IDB4MDJhNDsKKyB0LmRoYWJlbmdhbGkgPSAweDA5YTc7CisgdC5kaGFkZXZhID0gMHgwOTI3OworIHQuZGhhZ3VqYXJhdGkgPSAweDBhYTc7CisgdC5kaGFndXJtdWtoaSA9IDB4MGEyNzsKKyB0LmRob29rID0gMHgwMjU3OworIHQuZGlhbHl0aWthdG9ub3MgPSAweDAzODU7CisgdC5kaWFseXRpa2F0b25vc2NtYiA9IDB4MDM0NDsKKyB0LmRpYW1vbmQgPSAweDI2NjY7CisgdC5kaWFtb25kc3VpdHdoaXRlID0gMHgyNjYyOworIHQuZGllcmVzaXMgPSAweDAwYTg7CisgdC5kaWVyZXNpc2FjdXRlID0gMHhmNmQ3OworIHQuZGllcmVzaXNiZWxvd2NtYiA9IDB4MDMyNDsKKyB0LmRpZXJlc2lzY21iID0gMHgwMzA4OworIHQuZGllcmVzaXNncmF2ZSA9IDB4ZjZkODsKKyB0LmRpZXJlc2lzdG9ub3MgPSAweDAzODU7CisgdC5kaWhpcmFnYW5hID0gMHgzMDYyOworIHQuZGlrYXRha2FuYSA9IDB4MzBjMjsKKyB0LmRpdHRvbWFyayA9IDB4MzAwMzsKKyB0LmRpdmlkZSA9IDB4MDBmNzsKKyB0LmRpdmlkZXMgPSAweDIyMjM7CisgdC5kaXZpc2lvbnNsYXNoID0gMHgyMjE1OworIHQuZGplY3lyaWxsaWMgPSAweDA0NTI7CisgdC5ka3NoYWRlID0gMHgyNTkzOworIHQuZGxpbmViZWxvdyA9IDB4MWUwZjsKKyB0LmRsc3F1YXJlID0gMHgzMzk3OworIHQuZG1hY3JvbiA9IDB4MDExMTsKKyB0LmRtb25vc3BhY2UgPSAweGZmNDQ7CisgdC5kbmJsb2NrID0gMHgyNTg0OworIHQuZG9jaGFkYXRoYWkgPSAweDBlMGU7CisgdC5kb2Rla3RoYWkgPSAweDBlMTQ7CisgdC5kb2hpcmFnYW5hID0gMHgzMDY5OworIHQuZG9rYXRha2FuYSA9IDB4MzBjOTsKKyB0LmRvbGxhciA9IDB4MDAyNDsKKyB0LmRvbGxhcmluZmVyaW9yID0gMHhmNmUzOworIHQuZG9sbGFybW9ub3NwYWNlID0gMHhmZjA0OworIHQuZG9sbGFyb2xkc3R5bGUgPSAweGY3MjQ7CisgdC5kb2xsYXJzbWFsbCA9IDB4ZmU2OTsKKyB0LmRvbGxhcnN1cGVyaW9yID0gMHhmNmU0OworIHQuZG9uZyA9IDB4MjBhYjsKKyB0LmRvcnVzcXVhcmUgPSAweDMzMjY7CisgdC5kb3RhY2NlbnQgPSAweDAyZDk7CisgdC5kb3RhY2NlbnRjbWIgPSAweDAzMDc7CisgdC5kb3RiZWxvd2NtYiA9IDB4MDMyMzsKKyB0LmRvdGJlbG93Y29tYiA9IDB4MDMyMzsKKyB0LmRvdGthdGFrYW5hID0gMHgzMGZiOworIHQuZG90bGVzc2kgPSAweDAxMzE7CisgdC5kb3RsZXNzaiA9IDB4ZjZiZTsKKyB0LmRvdGxlc3Nqc3Ryb2tlaG9vayA9IDB4MDI4NDsKKyB0LmRvdG1hdGggPSAweDIyYzU7CisgdC5kb3R0ZWRjaXJjbGUgPSAweDI1Y2M7CisgdC5kb3VibGV5b2RwYXRhaCA9IDB4ZmIxZjsKKyB0LmRvdWJsZXlvZHBhdGFoaGVicmV3ID0gMHhmYjFmOworIHQuZG93bnRhY2tiZWxvd2NtYiA9IDB4MDMxZTsKKyB0LmRvd250YWNrbW9kID0gMHgwMmQ1OworIHQuZHBhcmVuID0gMHgyNDlmOworIHQuZHN1cGVyaW9yID0gMHhmNmViOworIHQuZHRhaWwgPSAweDAyNTY7CisgdC5kdG9wYmFyID0gMHgwMThjOworIHQuZHVoaXJhZ2FuYSA9IDB4MzA2NTsKKyB0LmR1a2F0YWthbmEgPSAweDMwYzU7CisgdC5keiA9IDB4MDFmMzsKKyB0LmR6YWx0b25lID0gMHgwMmEzOworIHQuZHpjYXJvbiA9IDB4MDFjNjsKKyB0LmR6Y3VybCA9IDB4MDJhNTsKKyB0LmR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUxOworIHQuZHplY3lyaWxsaWMgPSAweDA0NTU7CisgdC5kemhlY3lyaWxsaWMgPSAweDA0NWY7CisgdC5lID0gMHgwMDY1OworIHQuZWFjdXRlID0gMHgwMGU5OworIHQuZWFydGggPSAweDI2NDE7CisgdC5lYmVuZ2FsaSA9IDB4MDk4ZjsKKyB0LmVib3BvbW9mbyA9IDB4MzExYzsKKyB0LmVicmV2ZSA9IDB4MDExNTsKKyB0LmVjYW5kcmFkZXZhID0gMHgwOTBkOworIHQuZWNhbmRyYWd1amFyYXRpID0gMHgwYThkOworIHQuZWNhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDU7CisgdC5lY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzU7CisgdC5lY2Fyb24gPSAweDAxMWI7CisgdC5lY2VkaWxsYWJyZXZlID0gMHgxZTFkOworIHQuZWNoYXJtZW5pYW4gPSAweDA1NjU7CisgdC5lY2h5aXduYXJtZW5pYW4gPSAweDA1ODc7CisgdC5lY2lyY2xlID0gMHgyNGQ0OworIHQuZWNpcmN1bWZsZXggPSAweDAwZWE7CisgdC5lY2lyY3VtZmxleGFjdXRlID0gMHgxZWJmOworIHQuZWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxOTsKKyB0LmVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzc7CisgdC5lY2lyY3VtZmxleGdyYXZlID0gMHgxZWMxOworIHQuZWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzM7CisgdC5lY2lyY3VtZmxleHRpbGRlID0gMHgxZWM1OworIHQuZWN5cmlsbGljID0gMHgwNDU0OworIHQuZWRibGdyYXZlID0gMHgwMjA1OworIHQuZWRldmEgPSAweDA5MGY7CisgdC5lZGllcmVzaXMgPSAweDAwZWI7CisgdC5lZG90ID0gMHgwMTE3OworIHQuZWRvdGFjY2VudCA9IDB4MDExNzsKKyB0LmVkb3RiZWxvdyA9IDB4MWViOTsKKyB0LmVlZ3VybXVraGkgPSAweDBhMGY7CisgdC5lZW1hdHJhZ3VybXVraGkgPSAweDBhNDc7CisgdC5lZmN5cmlsbGljID0gMHgwNDQ0OworIHQuZWdyYXZlID0gMHgwMGU4OworIHQuZWd1amFyYXRpID0gMHgwYThmOworIHQuZWhhcm1lbmlhbiA9IDB4MDU2NzsKKyB0LmVoYm9wb21vZm8gPSAweDMxMWQ7CisgdC5laGlyYWdhbmEgPSAweDMwNDg7CisgdC5laG9va2Fib3ZlID0gMHgxZWJiOworIHQuZWlib3BvbW9mbyA9IDB4MzExZjsKKyB0LmVpZ2h0ID0gMHgwMDM4OworIHQuZWlnaHRhcmFiaWMgPSAweDA2Njg7CisgdC5laWdodGJlbmdhbGkgPSAweDA5ZWU7CisgdC5laWdodGNpcmNsZSA9IDB4MjQ2NzsKKyB0LmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MTsKKyB0LmVpZ2h0ZGV2YSA9IDB4MDk2ZTsKKyB0LmVpZ2h0ZWVuY2lyY2xlID0gMHgyNDcxOworIHQuZWlnaHRlZW5wYXJlbiA9IDB4MjQ4NTsKKyB0LmVpZ2h0ZWVucGVyaW9kID0gMHgyNDk5OworIHQuZWlnaHRndWphcmF0aSA9IDB4MGFlZTsKKyB0LmVpZ2h0Z3VybXVraGkgPSAweDBhNmU7CisgdC5laWdodGhhY2thcmFiaWMgPSAweDA2Njg7CisgdC5laWdodGhhbmd6aG91ID0gMHgzMDI4OworIHQuZWlnaHRobm90ZWJlYW1lZCA9IDB4MjY2YjsKKyB0LmVpZ2h0aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNzsKKyB0LmVpZ2h0aW5mZXJpb3IgPSAweDIwODg7CisgdC5laWdodG1vbm9zcGFjZSA9IDB4ZmYxODsKKyB0LmVpZ2h0b2xkc3R5bGUgPSAweGY3Mzg7CisgdC5laWdodHBhcmVuID0gMHgyNDdiOworIHQuZWlnaHRwZXJpb2QgPSAweDI0OGY7CisgdC5laWdodHBlcnNpYW4gPSAweDA2Zjg7CisgdC5laWdodHJvbWFuID0gMHgyMTc3OworIHQuZWlnaHRzdXBlcmlvciA9IDB4MjA3ODsKKyB0LmVpZ2h0dGhhaSA9IDB4MGU1ODsKKyB0LmVpbnZlcnRlZGJyZXZlID0gMHgwMjA3OworIHQuZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjU7CisgdC5la2F0YWthbmEgPSAweDMwYTg7CisgdC5la2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzQ7CisgdC5la29ua2FyZ3VybXVraGkgPSAweDBhNzQ7CisgdC5la29yZWFuID0gMHgzMTU0OworIHQuZWxjeXJpbGxpYyA9IDB4MDQzYjsKKyB0LmVsZW1lbnQgPSAweDIyMDg7CisgdC5lbGV2ZW5jaXJjbGUgPSAweDI0NmE7CisgdC5lbGV2ZW5wYXJlbiA9IDB4MjQ3ZTsKKyB0LmVsZXZlbnBlcmlvZCA9IDB4MjQ5MjsKKyB0LmVsZXZlbnJvbWFuID0gMHgyMTdhOworIHQuZWxsaXBzaXMgPSAweDIwMjY7CisgdC5lbGxpcHNpc3ZlcnRpY2FsID0gMHgyMmVlOworIHQuZW1hY3JvbiA9IDB4MDExMzsKKyB0LmVtYWNyb25hY3V0ZSA9IDB4MWUxNzsKKyB0LmVtYWNyb25ncmF2ZSA9IDB4MWUxNTsKKyB0LmVtY3lyaWxsaWMgPSAweDA0M2M7CisgdC5lbWRhc2ggPSAweDIwMTQ7CisgdC5lbWRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMTsKKyB0LmVtb25vc3BhY2UgPSAweGZmNDU7CisgdC5lbXBoYXNpc21hcmthcm1lbmlhbiA9IDB4MDU1YjsKKyB0LmVtcHR5c2V0ID0gMHgyMjA1OworIHQuZW5ib3BvbW9mbyA9IDB4MzEyMzsKKyB0LmVuY3lyaWxsaWMgPSAweDA0M2Q7CisgdC5lbmRhc2ggPSAweDIwMTM7CisgdC5lbmRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMjsKKyB0LmVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTM7CisgdC5lbmcgPSAweDAxNGI7CisgdC5lbmdib3BvbW9mbyA9IDB4MzEyNTsKKyB0LmVuZ2hlY3lyaWxsaWMgPSAweDA0YTU7CisgdC5lbmhvb2tjeXJpbGxpYyA9IDB4MDRjODsKKyB0LmVuc3BhY2UgPSAweDIwMDI7CisgdC5lb2dvbmVrID0gMHgwMTE5OworIHQuZW9rb3JlYW4gPSAweDMxNTM7CisgdC5lb3BlbiA9IDB4MDI1YjsKKyB0LmVvcGVuY2xvc2VkID0gMHgwMjlhOworIHQuZW9wZW5yZXZlcnNlZCA9IDB4MDI1YzsKKyB0LmVvcGVucmV2ZXJzZWRjbG9zZWQgPSAweDAyNWU7CisgdC5lb3BlbnJldmVyc2VkaG9vayA9IDB4MDI1ZDsKKyB0LmVwYXJlbiA9IDB4MjRhMDsKKyB0LmVwc2lsb24gPSAweDAzYjU7CisgdC5lcHNpbG9udG9ub3MgPSAweDAzYWQ7CisgdC5lcXVhbCA9IDB4MDAzZDsKKyB0LmVxdWFsbW9ub3NwYWNlID0gMHhmZjFkOworIHQuZXF1YWxzbWFsbCA9IDB4ZmU2NjsKKyB0LmVxdWFsc3VwZXJpb3IgPSAweDIwN2M7CisgdC5lcXVpdmFsZW5jZSA9IDB4MjI2MTsKKyB0LmVyYm9wb21vZm8gPSAweDMxMjY7CisgdC5lcmN5cmlsbGljID0gMHgwNDQwOworIHQuZXJldmVyc2VkID0gMHgwMjU4OworIHQuZXJldmVyc2VkY3lyaWxsaWMgPSAweDA0NGQ7CisgdC5lc2N5cmlsbGljID0gMHgwNDQxOworIHQuZXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYjsKKyB0LmVzaCA9IDB4MDI4MzsKKyB0LmVzaGN1cmwgPSAweDAyODY7CisgdC5lc2hvcnRkZXZhID0gMHgwOTBlOworIHQuZXNob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0NjsKKyB0LmVzaHJldmVyc2VkbG9vcCA9IDB4MDFhYTsKKyB0LmVzaHNxdWF0cmV2ZXJzZWQgPSAweDAyODU7CisgdC5lc21hbGxoaXJhZ2FuYSA9IDB4MzA0NzsKKyB0LmVzbWFsbGthdGFrYW5hID0gMHgzMGE3OworIHQuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmE7CisgdC5lc3RpbWF0ZWQgPSAweDIxMmU7CisgdC5lc3VwZXJpb3IgPSAweGY2ZWM7CisgdC5ldGEgPSAweDAzYjc7CisgdC5ldGFybWVuaWFuID0gMHgwNTY4OworIHQuZXRhdG9ub3MgPSAweDAzYWU7CisgdC5ldGggPSAweDAwZjA7CisgdC5ldGlsZGUgPSAweDFlYmQ7CisgdC5ldGlsZGViZWxvdyA9IDB4MWUxYjsKKyB0LmV0bmFodGFmb3VraGhlYnJldyA9IDB4MDU5MTsKKyB0LmV0bmFodGFmb3VraGxlZnRoZWJyZXcgPSAweDA1OTE7CisgdC5ldG5haHRhaGVicmV3ID0gMHgwNTkxOworIHQuZXRuYWh0YWxlZnRoZWJyZXcgPSAweDA1OTE7CisgdC5ldHVybmVkID0gMHgwMWRkOworIHQuZXVrb3JlYW4gPSAweDMxNjE7CisgdC5ldXJvID0gMHgyMGFjOworIHQuZXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzc7CisgdC5ldm93ZWxzaWduZGV2YSA9IDB4MDk0NzsKKyB0LmV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNzsKKyB0LmV4Y2xhbSA9IDB4MDAyMTsKKyB0LmV4Y2xhbWFybWVuaWFuID0gMHgwNTVjOworIHQuZXhjbGFtZGJsID0gMHgyMDNjOworIHQuZXhjbGFtZG93biA9IDB4MDBhMTsKKyB0LmV4Y2xhbWRvd25zbWFsbCA9IDB4ZjdhMTsKKyB0LmV4Y2xhbW1vbm9zcGFjZSA9IDB4ZmYwMTsKKyB0LmV4Y2xhbXNtYWxsID0gMHhmNzIxOworIHQuZXhpc3RlbnRpYWwgPSAweDIyMDM7CisgdC5lemggPSAweDAyOTI7CisgdC5lemhjYXJvbiA9IDB4MDFlZjsKKyB0LmV6aGN1cmwgPSAweDAyOTM7CisgdC5lemhyZXZlcnNlZCA9IDB4MDFiOTsKKyB0LmV6aHRhaWwgPSAweDAxYmE7CisgdC5mID0gMHgwMDY2OworIHQuZmFkZXZhID0gMHgwOTVlOworIHQuZmFndXJtdWtoaSA9IDB4MGE1ZTsKKyB0LmZhaHJlbmhlaXQgPSAweDIxMDk7CisgdC5mYXRoYWFyYWJpYyA9IDB4MDY0ZTsKKyB0LmZhdGhhbG93YXJhYmljID0gMHgwNjRlOworIHQuZmF0aGF0YW5hcmFiaWMgPSAweDA2NGI7CisgdC5mYm9wb21vZm8gPSAweDMxMDg7CisgdC5mY2lyY2xlID0gMHgyNGQ1OworIHQuZmRvdGFjY2VudCA9IDB4MWUxZjsKKyB0LmZlaGFyYWJpYyA9IDB4MDY0MTsKKyB0LmZlaGFybWVuaWFuID0gMHgwNTg2OworIHQuZmVoZmluYWxhcmFiaWMgPSAweGZlZDI7CisgdC5mZWhpbml0aWFsYXJhYmljID0gMHhmZWQzOworIHQuZmVobWVkaWFsYXJhYmljID0gMHhmZWQ0OworIHQuZmVpY29wdGljID0gMHgwM2U1OworIHQuZmVtYWxlID0gMHgyNjQwOworIHQuZmYgPSAweGZiMDA7CisgdC5mX2YgPSAweGZiMDA7CisgdC5mZmkgPSAweGZiMDM7CisgdC5mZmwgPSAweGZiMDQ7CisgdC5maSA9IDB4ZmIwMTsKKyB0LmZpZnRlZW5jaXJjbGUgPSAweDI0NmU7CisgdC5maWZ0ZWVucGFyZW4gPSAweDI0ODI7CisgdC5maWZ0ZWVucGVyaW9kID0gMHgyNDk2OworIHQuZmlndXJlZGFzaCA9IDB4MjAxMjsKKyB0LmZpbGxlZGJveCA9IDB4MjVhMDsKKyB0LmZpbGxlZHJlY3QgPSAweDI1YWM7CisgdC5maW5hbGthZiA9IDB4MDVkYTsKKyB0LmZpbmFsa2FmZGFnZXNoID0gMHhmYjNhOworIHQuZmluYWxrYWZkYWdlc2hoZWJyZXcgPSAweGZiM2E7CisgdC5maW5hbGthZmhlYnJldyA9IDB4MDVkYTsKKyB0LmZpbmFsbWVtID0gMHgwNWRkOworIHQuZmluYWxtZW1oZWJyZXcgPSAweDA1ZGQ7CisgdC5maW5hbG51biA9IDB4MDVkZjsKKyB0LmZpbmFsbnVuaGVicmV3ID0gMHgwNWRmOworIHQuZmluYWxwZSA9IDB4MDVlMzsKKyB0LmZpbmFscGVoZWJyZXcgPSAweDA1ZTM7CisgdC5maW5hbHRzYWRpID0gMHgwNWU1OworIHQuZmluYWx0c2FkaWhlYnJldyA9IDB4MDVlNTsKKyB0LmZpcnN0dG9uZWNoaW5lc2UgPSAweDAyYzk7CisgdC5maXNoZXllID0gMHgyNWM5OworIHQuZml0YWN5cmlsbGljID0gMHgwNDczOworIHQuZml2ZSA9IDB4MDAzNTsKKyB0LmZpdmVhcmFiaWMgPSAweDA2NjU7CisgdC5maXZlYmVuZ2FsaSA9IDB4MDllYjsKKyB0LmZpdmVjaXJjbGUgPSAweDI0NjQ7CisgdC5maXZlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZTsKKyB0LmZpdmVkZXZhID0gMHgwOTZiOworIHQuZml2ZWVpZ2h0aHMgPSAweDIxNWQ7CisgdC5maXZlZ3VqYXJhdGkgPSAweDBhZWI7CisgdC5maXZlZ3VybXVraGkgPSAweDBhNmI7CisgdC5maXZlaGFja2FyYWJpYyA9IDB4MDY2NTsKKyB0LmZpdmVoYW5nemhvdSA9IDB4MzAyNTsKKyB0LmZpdmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI0OworIHQuZml2ZWluZmVyaW9yID0gMHgyMDg1OworIHQuZml2ZW1vbm9zcGFjZSA9IDB4ZmYxNTsKKyB0LmZpdmVvbGRzdHlsZSA9IDB4ZjczNTsKKyB0LmZpdmVwYXJlbiA9IDB4MjQ3ODsKKyB0LmZpdmVwZXJpb2QgPSAweDI0OGM7CisgdC5maXZlcGVyc2lhbiA9IDB4MDZmNTsKKyB0LmZpdmVyb21hbiA9IDB4MjE3NDsKKyB0LmZpdmVzdXBlcmlvciA9IDB4MjA3NTsKKyB0LmZpdmV0aGFpID0gMHgwZTU1OworIHQuZmwgPSAweGZiMDI7CisgdC5mbG9yaW4gPSAweDAxOTI7CisgdC5mbW9ub3NwYWNlID0gMHhmZjQ2OworIHQuZm1zcXVhcmUgPSAweDMzOTk7CisgdC5mb2ZhbnRoYWkgPSAweDBlMWY7CisgdC5mb2ZhdGhhaSA9IDB4MGUxZDsKKyB0LmZvbmdtYW50aGFpID0gMHgwZTRmOworIHQuZm9yYWxsID0gMHgyMjAwOworIHQuZm91ciA9IDB4MDAzNDsKKyB0LmZvdXJhcmFiaWMgPSAweDA2NjQ7CisgdC5mb3VyYmVuZ2FsaSA9IDB4MDllYTsKKyB0LmZvdXJjaXJjbGUgPSAweDI0NjM7CisgdC5mb3VyY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZDsKKyB0LmZvdXJkZXZhID0gMHgwOTZhOworIHQuZm91cmd1amFyYXRpID0gMHgwYWVhOworIHQuZm91cmd1cm11a2hpID0gMHgwYTZhOworIHQuZm91cmhhY2thcmFiaWMgPSAweDA2NjQ7CisgdC5mb3VyaGFuZ3pob3UgPSAweDMwMjQ7CisgdC5mb3VyaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMzsKKyB0LmZvdXJpbmZlcmlvciA9IDB4MjA4NDsKKyB0LmZvdXJtb25vc3BhY2UgPSAweGZmMTQ7CisgdC5mb3VybnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNzsKKyB0LmZvdXJvbGRzdHlsZSA9IDB4ZjczNDsKKyB0LmZvdXJwYXJlbiA9IDB4MjQ3NzsKKyB0LmZvdXJwZXJpb2QgPSAweDI0OGI7CisgdC5mb3VycGVyc2lhbiA9IDB4MDZmNDsKKyB0LmZvdXJyb21hbiA9IDB4MjE3MzsKKyB0LmZvdXJzdXBlcmlvciA9IDB4MjA3NDsKKyB0LmZvdXJ0ZWVuY2lyY2xlID0gMHgyNDZkOworIHQuZm91cnRlZW5wYXJlbiA9IDB4MjQ4MTsKKyB0LmZvdXJ0ZWVucGVyaW9kID0gMHgyNDk1OworIHQuZm91cnRoYWkgPSAweDBlNTQ7CisgdC5mb3VydGh0b25lY2hpbmVzZSA9IDB4MDJjYjsKKyB0LmZwYXJlbiA9IDB4MjRhMTsKKyB0LmZyYWN0aW9uID0gMHgyMDQ0OworIHQuZnJhbmMgPSAweDIwYTM7CisgdC5nID0gMHgwMDY3OworIHQuZ2FiZW5nYWxpID0gMHgwOTk3OworIHQuZ2FjdXRlID0gMHgwMWY1OworIHQuZ2FkZXZhID0gMHgwOTE3OworIHQuZ2FmYXJhYmljID0gMHgwNmFmOworIHQuZ2FmZmluYWxhcmFiaWMgPSAweGZiOTM7CisgdC5nYWZpbml0aWFsYXJhYmljID0gMHhmYjk0OworIHQuZ2FmbWVkaWFsYXJhYmljID0gMHhmYjk1OworIHQuZ2FndWphcmF0aSA9IDB4MGE5NzsKKyB0LmdhZ3VybXVraGkgPSAweDBhMTc7CisgdC5nYWhpcmFnYW5hID0gMHgzMDRjOworIHQuZ2FrYXRha2FuYSA9IDB4MzBhYzsKKyB0LmdhbW1hID0gMHgwM2IzOworIHQuZ2FtbWFsYXRpbnNtYWxsID0gMHgwMjYzOworIHQuZ2FtbWFzdXBlcmlvciA9IDB4MDJlMDsKKyB0LmdhbmdpYWNvcHRpYyA9IDB4MDNlYjsKKyB0Lmdib3BvbW9mbyA9IDB4MzEwZDsKKyB0LmdicmV2ZSA9IDB4MDExZjsKKyB0LmdjYXJvbiA9IDB4MDFlNzsKKyB0LmdjZWRpbGxhID0gMHgwMTIzOworIHQuZ2NpcmNsZSA9IDB4MjRkNjsKKyB0LmdjaXJjdW1mbGV4ID0gMHgwMTFkOworIHQuZ2NvbW1hYWNjZW50ID0gMHgwMTIzOworIHQuZ2RvdCA9IDB4MDEyMTsKKyB0Lmdkb3RhY2NlbnQgPSAweDAxMjE7CisgdC5nZWN5cmlsbGljID0gMHgwNDMzOworIHQuZ2VoaXJhZ2FuYSA9IDB4MzA1MjsKKyB0Lmdla2F0YWthbmEgPSAweDMwYjI7CisgdC5nZW9tZXRyaWNhbGx5ZXF1YWwgPSAweDIyNTE7CisgdC5nZXJlc2hhY2NlbnRoZWJyZXcgPSAweDA1OWM7CisgdC5nZXJlc2hoZWJyZXcgPSAweDA1ZjM7CisgdC5nZXJlc2htdXFkYW1oZWJyZXcgPSAweDA1OWQ7CisgdC5nZXJtYW5kYmxzID0gMHgwMGRmOworIHQuZ2Vyc2hheWltYWNjZW50aGVicmV3ID0gMHgwNTllOworIHQuZ2Vyc2hheWltaGVicmV3ID0gMHgwNWY0OworIHQuZ2V0YW1hcmsgPSAweDMwMTM7CisgdC5naGFiZW5nYWxpID0gMHgwOTk4OworIHQuZ2hhZGFybWVuaWFuID0gMHgwNTcyOworIHQuZ2hhZGV2YSA9IDB4MDkxODsKKyB0LmdoYWd1amFyYXRpID0gMHgwYTk4OworIHQuZ2hhZ3VybXVraGkgPSAweDBhMTg7CisgdC5naGFpbmFyYWJpYyA9IDB4MDYzYTsKKyB0LmdoYWluZmluYWxhcmFiaWMgPSAweGZlY2U7CisgdC5naGFpbmluaXRpYWxhcmFiaWMgPSAweGZlY2Y7CisgdC5naGFpbm1lZGlhbGFyYWJpYyA9IDB4ZmVkMDsKKyB0LmdoZW1pZGRsZWhvb2tjeXJpbGxpYyA9IDB4MDQ5NTsKKyB0LmdoZXN0cm9rZWN5cmlsbGljID0gMHgwNDkzOworIHQuZ2hldXB0dXJuY3lyaWxsaWMgPSAweDA0OTE7CisgdC5naGhhZGV2YSA9IDB4MDk1YTsKKyB0LmdoaGFndXJtdWtoaSA9IDB4MGE1YTsKKyB0Lmdob29rID0gMHgwMjYwOworIHQuZ2h6c3F1YXJlID0gMHgzMzkzOworIHQuZ2loaXJhZ2FuYSA9IDB4MzA0ZTsKKyB0Lmdpa2F0YWthbmEgPSAweDMwYWU7CisgdC5naW1hcm1lbmlhbiA9IDB4MDU2MzsKKyB0LmdpbWVsID0gMHgwNWQyOworIHQuZ2ltZWxkYWdlc2ggPSAweGZiMzI7CisgdC5naW1lbGRhZ2VzaGhlYnJldyA9IDB4ZmIzMjsKKyB0LmdpbWVsaGVicmV3ID0gMHgwNWQyOworIHQuZ2plY3lyaWxsaWMgPSAweDA0NTM7CisgdC5nbG90dGFsaW52ZXJ0ZWRzdHJva2UgPSAweDAxYmU7CisgdC5nbG90dGFsc3RvcCA9IDB4MDI5NDsKKyB0Lmdsb3R0YWxzdG9waW52ZXJ0ZWQgPSAweDAyOTY7CisgdC5nbG90dGFsc3RvcG1vZCA9IDB4MDJjMDsKKyB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWQgPSAweDAyOTU7CisgdC5nbG90dGFsc3RvcHJldmVyc2VkbW9kID0gMHgwMmMxOworIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZHN1cGVyaW9yID0gMHgwMmU0OworIHQuZ2xvdHRhbHN0b3BzdHJva2UgPSAweDAyYTE7CisgdC5nbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkID0gMHgwMmEyOworIHQuZ21hY3JvbiA9IDB4MWUyMTsKKyB0Lmdtb25vc3BhY2UgPSAweGZmNDc7CisgdC5nb2hpcmFnYW5hID0gMHgzMDU0OworIHQuZ29rYXRha2FuYSA9IDB4MzBiNDsKKyB0LmdwYXJlbiA9IDB4MjRhMjsKKyB0LmdwYXNxdWFyZSA9IDB4MzNhYzsKKyB0LmdyYWRpZW50ID0gMHgyMjA3OworIHQuZ3JhdmUgPSAweDAwNjA7CisgdC5ncmF2ZWJlbG93Y21iID0gMHgwMzE2OworIHQuZ3JhdmVjbWIgPSAweDAzMDA7CisgdC5ncmF2ZWNvbWIgPSAweDAzMDA7CisgdC5ncmF2ZWRldmEgPSAweDA5NTM7CisgdC5ncmF2ZWxvd21vZCA9IDB4MDJjZTsKKyB0LmdyYXZlbW9ub3NwYWNlID0gMHhmZjQwOworIHQuZ3JhdmV0b25lY21iID0gMHgwMzQwOworIHQuZ3JlYXRlciA9IDB4MDAzZTsKKyB0LmdyZWF0ZXJlcXVhbCA9IDB4MjI2NTsKKyB0LmdyZWF0ZXJlcXVhbG9ybGVzcyA9IDB4MjJkYjsKKyB0LmdyZWF0ZXJtb25vc3BhY2UgPSAweGZmMWU7CisgdC5ncmVhdGVyb3JlcXVpdmFsZW50ID0gMHgyMjczOworIHQuZ3JlYXRlcm9ybGVzcyA9IDB4MjI3NzsKKyB0LmdyZWF0ZXJvdmVyZXF1YWwgPSAweDIyNjc7CisgdC5ncmVhdGVyc21hbGwgPSAweGZlNjU7CisgdC5nc2NyaXB0ID0gMHgwMjYxOworIHQuZ3N0cm9rZSA9IDB4MDFlNTsKKyB0Lmd1aGlyYWdhbmEgPSAweDMwNTA7CisgdC5ndWlsbGVtb3RsZWZ0ID0gMHgwMGFiOworIHQuZ3VpbGxlbW90cmlnaHQgPSAweDAwYmI7CisgdC5ndWlsc2luZ2xsZWZ0ID0gMHgyMDM5OworIHQuZ3VpbHNpbmdscmlnaHQgPSAweDIwM2E7CisgdC5ndWthdGFrYW5hID0gMHgzMGIwOworIHQuZ3VyYW11c3F1YXJlID0gMHgzMzE4OworIHQuZ3lzcXVhcmUgPSAweDMzYzk7CisgdC5oID0gMHgwMDY4OworIHQuaGFhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRhOTsKKyB0LmhhYWx0b25lYXJhYmljID0gMHgwNmMxOworIHQuaGFiZW5nYWxpID0gMHgwOWI5OworIHQuaGFkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiMzsKKyB0LmhhZGV2YSA9IDB4MDkzOTsKKyB0LmhhZ3VqYXJhdGkgPSAweDBhYjk7CisgdC5oYWd1cm11a2hpID0gMHgwYTM5OworIHQuaGFoYXJhYmljID0gMHgwNjJkOworIHQuaGFoZmluYWxhcmFiaWMgPSAweGZlYTI7CisgdC5oYWhpbml0aWFsYXJhYmljID0gMHhmZWEzOworIHQuaGFoaXJhZ2FuYSA9IDB4MzA2ZjsKKyB0LmhhaG1lZGlhbGFyYWJpYyA9IDB4ZmVhNDsKKyB0LmhhaXR1c3F1YXJlID0gMHgzMzJhOworIHQuaGFrYXRha2FuYSA9IDB4MzBjZjsKKyB0Lmhha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGE7CisgdC5oYWxhbnRndXJtdWtoaSA9IDB4MGE0ZDsKKyB0LmhhbXphYXJhYmljID0gMHgwNjIxOworIHQuaGFtemFsb3dhcmFiaWMgPSAweDA2MjE7CisgdC5oYW5ndWxmaWxsZXIgPSAweDMxNjQ7CisgdC5oYXJkc2lnbmN5cmlsbGljID0gMHgwNDRhOworIHQuaGFycG9vbmxlZnRiYXJidXAgPSAweDIxYmM7CisgdC5oYXJwb29ucmlnaHRiYXJidXAgPSAweDIxYzA7CisgdC5oYXNxdWFyZSA9IDB4MzNjYTsKKyB0LmhhdGFmcGF0YWggPSAweDA1YjI7CisgdC5oYXRhZnBhdGFoMTYgPSAweDA1YjI7CisgdC5oYXRhZnBhdGFoMjMgPSAweDA1YjI7CisgdC5oYXRhZnBhdGFoMmYgPSAweDA1YjI7CisgdC5oYXRhZnBhdGFoaGVicmV3ID0gMHgwNWIyOworIHQuaGF0YWZwYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViMjsKKyB0LmhhdGFmcGF0YWhxdWFydGVyaGVicmV3ID0gMHgwNWIyOworIHQuaGF0YWZwYXRhaHdpZGVoZWJyZXcgPSAweDA1YjI7CisgdC5oYXRhZnFhbWF0cyA9IDB4MDViMzsKKyB0LmhhdGFmcWFtYXRzMWIgPSAweDA1YjM7CisgdC5oYXRhZnFhbWF0czI4ID0gMHgwNWIzOworIHQuaGF0YWZxYW1hdHMzNCA9IDB4MDViMzsKKyB0LmhhdGFmcWFtYXRzaGVicmV3ID0gMHgwNWIzOworIHQuaGF0YWZxYW1hdHNuYXJyb3doZWJyZXcgPSAweDA1YjM7CisgdC5oYXRhZnFhbWF0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1YjM7CisgdC5oYXRhZnFhbWF0c3dpZGVoZWJyZXcgPSAweDA1YjM7CisgdC5oYXRhZnNlZ29sID0gMHgwNWIxOworIHQuaGF0YWZzZWdvbDE3ID0gMHgwNWIxOworIHQuaGF0YWZzZWdvbDI0ID0gMHgwNWIxOworIHQuaGF0YWZzZWdvbDMwID0gMHgwNWIxOworIHQuaGF0YWZzZWdvbGhlYnJldyA9IDB4MDViMTsKKyB0LmhhdGFmc2Vnb2xuYXJyb3doZWJyZXcgPSAweDA1YjE7CisgdC5oYXRhZnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViMTsKKyB0LmhhdGFmc2Vnb2x3aWRlaGVicmV3ID0gMHgwNWIxOworIHQuaGJhciA9IDB4MDEyNzsKKyB0Lmhib3BvbW9mbyA9IDB4MzEwZjsKKyB0LmhicmV2ZWJlbG93ID0gMHgxZTJiOworIHQuaGNlZGlsbGEgPSAweDFlMjk7CisgdC5oY2lyY2xlID0gMHgyNGQ3OworIHQuaGNpcmN1bWZsZXggPSAweDAxMjU7CisgdC5oZGllcmVzaXMgPSAweDFlMjc7CisgdC5oZG90YWNjZW50ID0gMHgxZTIzOworIHQuaGRvdGJlbG93ID0gMHgxZTI1OworIHQuaGUgPSAweDA1ZDQ7CisgdC5oZWFydCA9IDB4MjY2NTsKKyB0LmhlYXJ0c3VpdGJsYWNrID0gMHgyNjY1OworIHQuaGVhcnRzdWl0d2hpdGUgPSAweDI2NjE7CisgdC5oZWRhZ2VzaCA9IDB4ZmIzNDsKKyB0LmhlZGFnZXNoaGVicmV3ID0gMHhmYjM0OworIHQuaGVoYWx0b25lYXJhYmljID0gMHgwNmMxOworIHQuaGVoYXJhYmljID0gMHgwNjQ3OworIHQuaGVoZWJyZXcgPSAweDA1ZDQ7CisgdC5oZWhmaW5hbGFsdG9uZWFyYWJpYyA9IDB4ZmJhNzsKKyB0LmhlaGZpbmFsYWx0dHdvYXJhYmljID0gMHhmZWVhOworIHQuaGVoZmluYWxhcmFiaWMgPSAweGZlZWE7CisgdC5oZWhoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZiYTU7CisgdC5oZWhoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWMgPSAweGZiYTQ7CisgdC5oZWhpbml0aWFsYWx0b25lYXJhYmljID0gMHhmYmE4OworIHQuaGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmVlYjsKKyB0LmhlaGlyYWdhbmEgPSAweDMwNzg7CisgdC5oZWhtZWRpYWxhbHRvbmVhcmFiaWMgPSAweGZiYTk7CisgdC5oZWhtZWRpYWxhcmFiaWMgPSAweGZlZWM7CisgdC5oZWlzZWllcmFzcXVhcmUgPSAweDMzN2I7CisgdC5oZWthdGFrYW5hID0gMHgzMGQ4OworIHQuaGVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZDsKKyB0Lmhla3V0YWFydXNxdWFyZSA9IDB4MzMzNjsKKyB0Lmhlbmdob29rID0gMHgwMjY3OworIHQuaGVydXR1c3F1YXJlID0gMHgzMzM5OworIHQuaGV0ID0gMHgwNWQ3OworIHQuaGV0aGVicmV3ID0gMHgwNWQ3OworIHQuaGhvb2sgPSAweDAyNjY7CisgdC5oaG9va3N1cGVyaW9yID0gMHgwMmIxOworIHQuaGlldWhhY2lyY2xla29yZWFuID0gMHgzMjdiOworIHQuaGlldWhhcGFyZW5rb3JlYW4gPSAweDMyMWI7CisgdC5oaWV1aGNpcmNsZWtvcmVhbiA9IDB4MzI2ZDsKKyB0LmhpZXVoa29yZWFuID0gMHgzMTRlOworIHQuaGlldWhwYXJlbmtvcmVhbiA9IDB4MzIwZDsKKyB0LmhpaGlyYWdhbmEgPSAweDMwNzI7CisgdC5oaWthdGFrYW5hID0gMHgzMGQyOworIHQuaGlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YjsKKyB0LmhpcmlxID0gMHgwNWI0OworIHQuaGlyaXExNCA9IDB4MDViNDsKKyB0LmhpcmlxMjEgPSAweDA1YjQ7CisgdC5oaXJpcTJkID0gMHgwNWI0OworIHQuaGlyaXFoZWJyZXcgPSAweDA1YjQ7CisgdC5oaXJpcW5hcnJvd2hlYnJldyA9IDB4MDViNDsKKyB0LmhpcmlxcXVhcnRlcmhlYnJldyA9IDB4MDViNDsKKyB0Lmhpcmlxd2lkZWhlYnJldyA9IDB4MDViNDsKKyB0LmhsaW5lYmVsb3cgPSAweDFlOTY7CisgdC5obW9ub3NwYWNlID0gMHhmZjQ4OworIHQuaG9hcm1lbmlhbiA9IDB4MDU3MDsKKyB0LmhvaGlwdGhhaSA9IDB4MGUyYjsKKyB0LmhvaGlyYWdhbmEgPSAweDMwN2I7CisgdC5ob2thdGFrYW5hID0gMHgzMGRiOworIHQuaG9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZTsKKyB0LmhvbGFtID0gMHgwNWI5OworIHQuaG9sYW0xOSA9IDB4MDViOTsKKyB0LmhvbGFtMjYgPSAweDA1Yjk7CisgdC5ob2xhbTMyID0gMHgwNWI5OworIHQuaG9sYW1oZWJyZXcgPSAweDA1Yjk7CisgdC5ob2xhbW5hcnJvd2hlYnJldyA9IDB4MDViOTsKKyB0LmhvbGFtcXVhcnRlcmhlYnJldyA9IDB4MDViOTsKKyB0LmhvbGFtd2lkZWhlYnJldyA9IDB4MDViOTsKKyB0Lmhvbm9raHVrdGhhaSA9IDB4MGUyZTsKKyB0Lmhvb2thYm92ZWNvbWIgPSAweDAzMDk7CisgdC5ob29rY21iID0gMHgwMzA5OworIHQuaG9va3BhbGF0YWxpemVkYmVsb3djbWIgPSAweDAzMjE7CisgdC5ob29rcmV0cm9mbGV4YmVsb3djbWIgPSAweDAzMjI7CisgdC5ob29uc3F1YXJlID0gMHgzMzQyOworIHQuaG9yaWNvcHRpYyA9IDB4MDNlOTsKKyB0Lmhvcml6b250YWxiYXIgPSAweDIwMTU7CisgdC5ob3JuY21iID0gMHgwMzFiOworIHQuaG90c3ByaW5ncyA9IDB4MjY2ODsKKyB0LmhvdXNlID0gMHgyMzAyOworIHQuaHBhcmVuID0gMHgyNGEzOworIHQuaHN1cGVyaW9yID0gMHgwMmIwOworIHQuaHR1cm5lZCA9IDB4MDI2NTsKKyB0Lmh1aGlyYWdhbmEgPSAweDMwNzU7CisgdC5odWlpdG9zcXVhcmUgPSAweDMzMzM7CisgdC5odWthdGFrYW5hID0gMHgzMGQ1OworIHQuaHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YzsKKyB0Lmh1bmdhcnVtbGF1dCA9IDB4MDJkZDsKKyB0Lmh1bmdhcnVtbGF1dGNtYiA9IDB4MDMwYjsKKyB0Lmh2ID0gMHgwMTk1OworIHQuaHlwaGVuID0gMHgwMDJkOworIHQuaHlwaGVuaW5mZXJpb3IgPSAweGY2ZTU7CisgdC5oeXBoZW5tb25vc3BhY2UgPSAweGZmMGQ7CisgdC5oeXBoZW5zbWFsbCA9IDB4ZmU2MzsKKyB0Lmh5cGhlbnN1cGVyaW9yID0gMHhmNmU2OworIHQuaHlwaGVudHdvID0gMHgyMDEwOworIHQuaSA9IDB4MDA2OTsKKyB0LmlhY3V0ZSA9IDB4MDBlZDsKKyB0LmlhY3lyaWxsaWMgPSAweDA0NGY7CisgdC5pYmVuZ2FsaSA9IDB4MDk4NzsKKyB0Lmlib3BvbW9mbyA9IDB4MzEyNzsKKyB0LmlicmV2ZSA9IDB4MDEyZDsKKyB0LmljYXJvbiA9IDB4MDFkMDsKKyB0LmljaXJjbGUgPSAweDI0ZDg7CisgdC5pY2lyY3VtZmxleCA9IDB4MDBlZTsKKyB0LmljeXJpbGxpYyA9IDB4MDQ1NjsKKyB0LmlkYmxncmF2ZSA9IDB4MDIwOTsKKyB0LmlkZW9ncmFwaGVhcnRoY2lyY2xlID0gMHgzMjhmOworIHQuaWRlb2dyYXBoZmlyZWNpcmNsZSA9IDB4MzI4YjsKKyB0LmlkZW9ncmFwaGljYWxsaWFuY2VwYXJlbiA9IDB4MzIzZjsKKyB0LmlkZW9ncmFwaGljY2FsbHBhcmVuID0gMHgzMjNhOworIHQuaWRlb2dyYXBoaWNjZW50cmVjaXJjbGUgPSAweDMyYTU7CisgdC5pZGVvZ3JhcGhpY2Nsb3NlID0gMHgzMDA2OworIHQuaWRlb2dyYXBoaWNjb21tYSA9IDB4MzAwMTsKKyB0LmlkZW9ncmFwaGljY29tbWFsZWZ0ID0gMHhmZjY0OworIHQuaWRlb2dyYXBoaWNjb25ncmF0dWxhdGlvbnBhcmVuID0gMHgzMjM3OworIHQuaWRlb2dyYXBoaWNjb3JyZWN0Y2lyY2xlID0gMHgzMmEzOworIHQuaWRlb2dyYXBoaWNlYXJ0aHBhcmVuID0gMHgzMjJmOworIHQuaWRlb2dyYXBoaWNlbnRlcnByaXNlcGFyZW4gPSAweDMyM2Q7CisgdC5pZGVvZ3JhcGhpY2V4Y2VsbGVudGNpcmNsZSA9IDB4MzI5ZDsKKyB0LmlkZW9ncmFwaGljZmVzdGl2YWxwYXJlbiA9IDB4MzI0MDsKKyB0LmlkZW9ncmFwaGljZmluYW5jaWFsY2lyY2xlID0gMHgzMjk2OworIHQuaWRlb2dyYXBoaWNmaW5hbmNpYWxwYXJlbiA9IDB4MzIzNjsKKyB0LmlkZW9ncmFwaGljZmlyZXBhcmVuID0gMHgzMjJiOworIHQuaWRlb2dyYXBoaWNoYXZlcGFyZW4gPSAweDMyMzI7CisgdC5pZGVvZ3JhcGhpY2hpZ2hjaXJjbGUgPSAweDMyYTQ7CisgdC5pZGVvZ3JhcGhpY2l0ZXJhdGlvbm1hcmsgPSAweDMwMDU7CisgdC5pZGVvZ3JhcGhpY2xhYm9yY2lyY2xlID0gMHgzMjk4OworIHQuaWRlb2dyYXBoaWNsYWJvcnBhcmVuID0gMHgzMjM4OworIHQuaWRlb2dyYXBoaWNsZWZ0Y2lyY2xlID0gMHgzMmE3OworIHQuaWRlb2dyYXBoaWNsb3djaXJjbGUgPSAweDMyYTY7CisgdC5pZGVvZ3JhcGhpY21lZGljaW5lY2lyY2xlID0gMHgzMmE5OworIHQuaWRlb2dyYXBoaWNtZXRhbHBhcmVuID0gMHgzMjJlOworIHQuaWRlb2dyYXBoaWNtb29ucGFyZW4gPSAweDMyMmE7CisgdC5pZGVvZ3JhcGhpY25hbWVwYXJlbiA9IDB4MzIzNDsKKyB0LmlkZW9ncmFwaGljcGVyaW9kID0gMHgzMDAyOworIHQuaWRlb2dyYXBoaWNwcmludGNpcmNsZSA9IDB4MzI5ZTsKKyB0LmlkZW9ncmFwaGljcmVhY2hwYXJlbiA9IDB4MzI0MzsKKyB0LmlkZW9ncmFwaGljcmVwcmVzZW50cGFyZW4gPSAweDMyMzk7CisgdC5pZGVvZ3JhcGhpY3Jlc291cmNlcGFyZW4gPSAweDMyM2U7CisgdC5pZGVvZ3JhcGhpY3JpZ2h0Y2lyY2xlID0gMHgzMmE4OworIHQuaWRlb2dyYXBoaWNzZWNyZXRjaXJjbGUgPSAweDMyOTk7CisgdC5pZGVvZ3JhcGhpY3NlbGZwYXJlbiA9IDB4MzI0MjsKKyB0LmlkZW9ncmFwaGljc29jaWV0eXBhcmVuID0gMHgzMjMzOworIHQuaWRlb2dyYXBoaWNzcGFjZSA9IDB4MzAwMDsKKyB0LmlkZW9ncmFwaGljc3BlY2lhbHBhcmVuID0gMHgzMjM1OworIHQuaWRlb2dyYXBoaWNzdG9ja3BhcmVuID0gMHgzMjMxOworIHQuaWRlb2dyYXBoaWNzdHVkeXBhcmVuID0gMHgzMjNiOworIHQuaWRlb2dyYXBoaWNzdW5wYXJlbiA9IDB4MzIzMDsKKyB0LmlkZW9ncmFwaGljc3VwZXJ2aXNlcGFyZW4gPSAweDMyM2M7CisgdC5pZGVvZ3JhcGhpY3dhdGVycGFyZW4gPSAweDMyMmM7CisgdC5pZGVvZ3JhcGhpY3dvb2RwYXJlbiA9IDB4MzIyZDsKKyB0LmlkZW9ncmFwaGljemVybyA9IDB4MzAwNzsKKyB0LmlkZW9ncmFwaG1ldGFsY2lyY2xlID0gMHgzMjhlOworIHQuaWRlb2dyYXBobW9vbmNpcmNsZSA9IDB4MzI4YTsKKyB0LmlkZW9ncmFwaG5hbWVjaXJjbGUgPSAweDMyOTQ7CisgdC5pZGVvZ3JhcGhzdW5jaXJjbGUgPSAweDMyOTA7CisgdC5pZGVvZ3JhcGh3YXRlcmNpcmNsZSA9IDB4MzI4YzsKKyB0LmlkZW9ncmFwaHdvb2RjaXJjbGUgPSAweDMyOGQ7CisgdC5pZGV2YSA9IDB4MDkwNzsKKyB0LmlkaWVyZXNpcyA9IDB4MDBlZjsKKyB0LmlkaWVyZXNpc2FjdXRlID0gMHgxZTJmOworIHQuaWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTU7CisgdC5pZG90YmVsb3cgPSAweDFlY2I7CisgdC5pZWJyZXZlY3lyaWxsaWMgPSAweDA0ZDc7CisgdC5pZWN5cmlsbGljID0gMHgwNDM1OworIHQuaWV1bmdhY2lyY2xla29yZWFuID0gMHgzMjc1OworIHQuaWV1bmdhcGFyZW5rb3JlYW4gPSAweDMyMTU7CisgdC5pZXVuZ2NpcmNsZWtvcmVhbiA9IDB4MzI2NzsKKyB0LmlldW5na29yZWFuID0gMHgzMTQ3OworIHQuaWV1bmdwYXJlbmtvcmVhbiA9IDB4MzIwNzsKKyB0LmlncmF2ZSA9IDB4MDBlYzsKKyB0LmlndWphcmF0aSA9IDB4MGE4NzsKKyB0LmlndXJtdWtoaSA9IDB4MGEwNzsKKyB0LmloaXJhZ2FuYSA9IDB4MzA0NDsKKyB0Lmlob29rYWJvdmUgPSAweDFlYzk7CisgdC5paWJlbmdhbGkgPSAweDA5ODg7CisgdC5paWN5cmlsbGljID0gMHgwNDM4OworIHQuaWlkZXZhID0gMHgwOTA4OworIHQuaWlndWphcmF0aSA9IDB4MGE4ODsKKyB0LmlpZ3VybXVraGkgPSAweDBhMDg7CisgdC5paW1hdHJhZ3VybXVraGkgPSAweDBhNDA7CisgdC5paW52ZXJ0ZWRicmV2ZSA9IDB4MDIwYjsKKyB0Lmlpc2hvcnRjeXJpbGxpYyA9IDB4MDQzOTsKKyB0Lmlpdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMDsKKyB0Lmlpdm93ZWxzaWduZGV2YSA9IDB4MDk0MDsKKyB0Lmlpdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzA7CisgdC5paiA9IDB4MDEzMzsKKyB0LmlrYXRha2FuYSA9IDB4MzBhNDsKKyB0LmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3MjsKKyB0Lmlrb3JlYW4gPSAweDMxNjM7CisgdC5pbGRlID0gMHgwMmRjOworIHQuaWx1eWhlYnJldyA9IDB4MDVhYzsKKyB0LmltYWNyb24gPSAweDAxMmI7CisgdC5pbWFjcm9uY3lyaWxsaWMgPSAweDA0ZTM7CisgdC5pbWFnZW9yYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjUzOworIHQuaW1hdHJhZ3VybXVraGkgPSAweDBhM2Y7CisgdC5pbW9ub3NwYWNlID0gMHhmZjQ5OworIHQuaW5jcmVtZW50ID0gMHgyMjA2OworIHQuaW5maW5pdHkgPSAweDIyMWU7CisgdC5pbmlhcm1lbmlhbiA9IDB4MDU2YjsKKyB0LmludGVncmFsID0gMHgyMjJiOworIHQuaW50ZWdyYWxib3R0b20gPSAweDIzMjE7CisgdC5pbnRlZ3JhbGJ0ID0gMHgyMzIxOworIHQuaW50ZWdyYWxleCA9IDB4ZjhmNTsKKyB0LmludGVncmFsdG9wID0gMHgyMzIwOworIHQuaW50ZWdyYWx0cCA9IDB4MjMyMDsKKyB0LmludGVyc2VjdGlvbiA9IDB4MjIyOTsKKyB0LmludGlzcXVhcmUgPSAweDMzMDU7CisgdC5pbnZidWxsZXQgPSAweDI1ZDg7CisgdC5pbnZjaXJjbGUgPSAweDI1ZDk7CisgdC5pbnZzbWlsZWZhY2UgPSAweDI2M2I7CisgdC5pb2N5cmlsbGljID0gMHgwNDUxOworIHQuaW9nb25layA9IDB4MDEyZjsKKyB0LmlvdGEgPSAweDAzYjk7CisgdC5pb3RhZGllcmVzaXMgPSAweDAzY2E7CisgdC5pb3RhZGllcmVzaXN0b25vcyA9IDB4MDM5MDsKKyB0LmlvdGFsYXRpbiA9IDB4MDI2OTsKKyB0LmlvdGF0b25vcyA9IDB4MDNhZjsKKyB0LmlwYXJlbiA9IDB4MjRhNDsKKyB0LmlyaWd1cm11a2hpID0gMHgwYTcyOworIHQuaXNtYWxsaGlyYWdhbmEgPSAweDMwNDM7CisgdC5pc21hbGxrYXRha2FuYSA9IDB4MzBhMzsKKyB0LmlzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY4OworIHQuaXNzaGFyYmVuZ2FsaSA9IDB4MDlmYTsKKyB0LmlzdHJva2UgPSAweDAyNjg7CisgdC5pc3VwZXJpb3IgPSAweGY2ZWQ7CisgdC5pdGVyYXRpb25oaXJhZ2FuYSA9IDB4MzA5ZDsKKyB0Lml0ZXJhdGlvbmthdGFrYW5hID0gMHgzMGZkOworIHQuaXRpbGRlID0gMHgwMTI5OworIHQuaXRpbGRlYmVsb3cgPSAweDFlMmQ7CisgdC5pdWJvcG9tb2ZvID0gMHgzMTI5OworIHQuaXVjeXJpbGxpYyA9IDB4MDQ0ZTsKKyB0Lml2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWJmOworIHQuaXZvd2Vsc2lnbmRldmEgPSAweDA5M2Y7CisgdC5pdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmY7CisgdC5pemhpdHNhY3lyaWxsaWMgPSAweDA0NzU7CisgdC5pemhpdHNhZGJsZ3JhdmVjeXJpbGxpYyA9IDB4MDQ3NzsKKyB0LmogPSAweDAwNmE7CisgdC5qYWFybWVuaWFuID0gMHgwNTcxOworIHQuamFiZW5nYWxpID0gMHgwOTljOworIHQuamFkZXZhID0gMHgwOTFjOworIHQuamFndWphcmF0aSA9IDB4MGE5YzsKKyB0LmphZ3VybXVraGkgPSAweDBhMWM7CisgdC5qYm9wb21vZm8gPSAweDMxMTA7CisgdC5qY2Fyb24gPSAweDAxZjA7CisgdC5qY2lyY2xlID0gMHgyNGQ5OworIHQuamNpcmN1bWZsZXggPSAweDAxMzU7CisgdC5qY3Jvc3NlZHRhaWwgPSAweDAyOWQ7CisgdC5qZG90bGVzc3N0cm9rZSA9IDB4MDI1ZjsKKyB0LmplY3lyaWxsaWMgPSAweDA0NTg7CisgdC5qZWVtYXJhYmljID0gMHgwNjJjOworIHQuamVlbWZpbmFsYXJhYmljID0gMHhmZTllOworIHQuamVlbWluaXRpYWxhcmFiaWMgPSAweGZlOWY7CisgdC5qZWVtbWVkaWFsYXJhYmljID0gMHhmZWEwOworIHQuamVoYXJhYmljID0gMHgwNjk4OworIHQuamVoZmluYWxhcmFiaWMgPSAweGZiOGI7CisgdC5qaGFiZW5nYWxpID0gMHgwOTlkOworIHQuamhhZGV2YSA9IDB4MDkxZDsKKyB0LmpoYWd1amFyYXRpID0gMHgwYTlkOworIHQuamhhZ3VybXVraGkgPSAweDBhMWQ7CisgdC5qaGVoYXJtZW5pYW4gPSAweDA1N2I7CisgdC5qaXMgPSAweDMwMDQ7CisgdC5qbW9ub3NwYWNlID0gMHhmZjRhOworIHQuanBhcmVuID0gMHgyNGE1OworIHQuanN1cGVyaW9yID0gMHgwMmIyOworIHQuayA9IDB4MDA2YjsKKyB0LmthYmFzaGtpcmN5cmlsbGljID0gMHgwNGExOworIHQua2FiZW5nYWxpID0gMHgwOTk1OworIHQua2FjdXRlID0gMHgxZTMxOworIHQua2FjeXJpbGxpYyA9IDB4MDQzYTsKKyB0LmthZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OWI7CisgdC5rYWRldmEgPSAweDA5MTU7CisgdC5rYWYgPSAweDA1ZGI7CisgdC5rYWZhcmFiaWMgPSAweDA2NDM7CisgdC5rYWZkYWdlc2ggPSAweGZiM2I7CisgdC5rYWZkYWdlc2hoZWJyZXcgPSAweGZiM2I7CisgdC5rYWZmaW5hbGFyYWJpYyA9IDB4ZmVkYTsKKyB0LmthZmhlYnJldyA9IDB4MDVkYjsKKyB0LmthZmluaXRpYWxhcmFiaWMgPSAweGZlZGI7CisgdC5rYWZtZWRpYWxhcmFiaWMgPSAweGZlZGM7CisgdC5rYWZyYWZlaGVicmV3ID0gMHhmYjRkOworIHQua2FndWphcmF0aSA9IDB4MGE5NTsKKyB0LmthZ3VybXVraGkgPSAweDBhMTU7CisgdC5rYWhpcmFnYW5hID0gMHgzMDRiOworIHQua2Fob29rY3lyaWxsaWMgPSAweDA0YzQ7CisgdC5rYWthdGFrYW5hID0gMHgzMGFiOworIHQua2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NjsKKyB0LmthcHBhID0gMHgwM2JhOworIHQua2FwcGFzeW1ib2xncmVlayA9IDB4MDNmMDsKKyB0LmthcHllb3VubWlldW1rb3JlYW4gPSAweDMxNzE7CisgdC5rYXB5ZW91bnBoaWV1cGhrb3JlYW4gPSAweDMxODQ7CisgdC5rYXB5ZW91bnBpZXVwa29yZWFuID0gMHgzMTc4OworIHQua2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTc5OworIHQua2Fyb3JpaXNxdWFyZSA9IDB4MzMwZDsKKyB0Lmthc2hpZGFhdXRvYXJhYmljID0gMHgwNjQwOworIHQua2FzaGlkYWF1dG9ub3NpZGViZWFyaW5nYXJhYmljID0gMHgwNjQwOworIHQua2FzbWFsbGthdGFrYW5hID0gMHgzMGY1OworIHQua2FzcXVhcmUgPSAweDMzODQ7CisgdC5rYXNyYWFyYWJpYyA9IDB4MDY1MDsKKyB0Lmthc3JhdGFuYXJhYmljID0gMHgwNjRkOworIHQua2FzdHJva2VjeXJpbGxpYyA9IDB4MDQ5ZjsKKyB0LmthdGFoaXJhcHJvbG9uZ21hcmtoYWxmd2lkdGggPSAweGZmNzA7CisgdC5rYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWQ7CisgdC5rYm9wb21vZm8gPSAweDMxMGU7CisgdC5rY2Fsc3F1YXJlID0gMHgzMzg5OworIHQua2Nhcm9uID0gMHgwMWU5OworIHQua2NlZGlsbGEgPSAweDAxMzc7CisgdC5rY2lyY2xlID0gMHgyNGRhOworIHQua2NvbW1hYWNjZW50ID0gMHgwMTM3OworIHQua2RvdGJlbG93ID0gMHgxZTMzOworIHQua2VoYXJtZW5pYW4gPSAweDA1ODQ7CisgdC5rZWhpcmFnYW5hID0gMHgzMDUxOworIHQua2VrYXRha2FuYSA9IDB4MzBiMTsKKyB0Lmtla2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzk7CisgdC5rZW5hcm1lbmlhbiA9IDB4MDU2ZjsKKyB0Lmtlc21hbGxrYXRha2FuYSA9IDB4MzBmNjsKKyB0LmtncmVlbmxhbmRpYyA9IDB4MDEzODsKKyB0LmtoYWJlbmdhbGkgPSAweDA5OTY7CisgdC5raGFjeXJpbGxpYyA9IDB4MDQ0NTsKKyB0LmtoYWRldmEgPSAweDA5MTY7CisgdC5raGFndWphcmF0aSA9IDB4MGE5NjsKKyB0LmtoYWd1cm11a2hpID0gMHgwYTE2OworIHQua2hhaGFyYWJpYyA9IDB4MDYyZTsKKyB0LmtoYWhmaW5hbGFyYWJpYyA9IDB4ZmVhNjsKKyB0LmtoYWhpbml0aWFsYXJhYmljID0gMHhmZWE3OworIHQua2hhaG1lZGlhbGFyYWJpYyA9IDB4ZmVhODsKKyB0LmtoZWljb3B0aWMgPSAweDAzZTc7CisgdC5raGhhZGV2YSA9IDB4MDk1OTsKKyB0LmtoaGFndXJtdWtoaSA9IDB4MGE1OTsKKyB0LmtoaWV1a2hhY2lyY2xla29yZWFuID0gMHgzMjc4OworIHQua2hpZXVraGFwYXJlbmtvcmVhbiA9IDB4MzIxODsKKyB0LmtoaWV1a2hjaXJjbGVrb3JlYW4gPSAweDMyNmE7CisgdC5raGlldWtoa29yZWFuID0gMHgzMTRiOworIHQua2hpZXVraHBhcmVua29yZWFuID0gMHgzMjBhOworIHQua2hva2hhaXRoYWkgPSAweDBlMDI7CisgdC5raG9raG9udGhhaSA9IDB4MGUwNTsKKyB0Lmtob2todWF0dGhhaSA9IDB4MGUwMzsKKyB0Lmtob2tod2FpdGhhaSA9IDB4MGUwNDsKKyB0Lmtob211dHRoYWkgPSAweDBlNWI7CisgdC5raG9vayA9IDB4MDE5OTsKKyB0Lmtob3Jha2hhbmd0aGFpID0gMHgwZTA2OworIHQua2h6c3F1YXJlID0gMHgzMzkxOworIHQua2loaXJhZ2FuYSA9IDB4MzA0ZDsKKyB0Lmtpa2F0YWthbmEgPSAweDMwYWQ7CisgdC5raWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc3OworIHQua2lyb2d1cmFtdXNxdWFyZSA9IDB4MzMxNTsKKyB0Lmtpcm9tZWV0b3J1c3F1YXJlID0gMHgzMzE2OworIHQua2lyb3NxdWFyZSA9IDB4MzMxNDsKKyB0LmtpeWVva2FjaXJjbGVrb3JlYW4gPSAweDMyNmU7CisgdC5raXllb2thcGFyZW5rb3JlYW4gPSAweDMyMGU7CisgdC5raXllb2tjaXJjbGVrb3JlYW4gPSAweDMyNjA7CisgdC5raXllb2trb3JlYW4gPSAweDMxMzE7CisgdC5raXllb2twYXJlbmtvcmVhbiA9IDB4MzIwMDsKKyB0LmtpeWVva3Npb3Nrb3JlYW4gPSAweDMxMzM7CisgdC5ramVjeXJpbGxpYyA9IDB4MDQ1YzsKKyB0LmtsaW5lYmVsb3cgPSAweDFlMzU7CisgdC5rbHNxdWFyZSA9IDB4MzM5ODsKKyB0LmttY3ViZWRzcXVhcmUgPSAweDMzYTY7CisgdC5rbW9ub3NwYWNlID0gMHhmZjRiOworIHQua21zcXVhcmVkc3F1YXJlID0gMHgzM2EyOworIHQua29oaXJhZ2FuYSA9IDB4MzA1MzsKKyB0LmtvaG1zcXVhcmUgPSAweDMzYzA7CisgdC5rb2thaXRoYWkgPSAweDBlMDE7CisgdC5rb2thdGFrYW5hID0gMHgzMGIzOworIHQua29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YTsKKyB0Lmtvb3Bvc3F1YXJlID0gMHgzMzFlOworIHQua29wcGFjeXJpbGxpYyA9IDB4MDQ4MTsKKyB0LmtvcmVhbnN0YW5kYXJkc3ltYm9sID0gMHgzMjdmOworIHQua29yb25pc2NtYiA9IDB4MDM0MzsKKyB0LmtwYXJlbiA9IDB4MjRhNjsKKyB0LmtwYXNxdWFyZSA9IDB4MzNhYTsKKyB0LmtzaWN5cmlsbGljID0gMHgwNDZmOworIHQua3RzcXVhcmUgPSAweDMzY2Y7CisgdC5rdHVybmVkID0gMHgwMjllOworIHQua3VoaXJhZ2FuYSA9IDB4MzA0ZjsKKyB0Lmt1a2F0YWthbmEgPSAweDMwYWY7CisgdC5rdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc4OworIHQua3ZzcXVhcmUgPSAweDMzYjg7CisgdC5rd3NxdWFyZSA9IDB4MzNiZTsKKyB0LmwgPSAweDAwNmM7CisgdC5sYWJlbmdhbGkgPSAweDA5YjI7CisgdC5sYWN1dGUgPSAweDAxM2E7CisgdC5sYWRldmEgPSAweDA5MzI7CisgdC5sYWd1amFyYXRpID0gMHgwYWIyOworIHQubGFndXJtdWtoaSA9IDB4MGEzMjsKKyB0Lmxha2toYW5neWFvdGhhaSA9IDB4MGU0NTsKKyB0LmxhbWFsZWZmaW5hbGFyYWJpYyA9IDB4ZmVmYzsKKyB0LmxhbWFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlZjg7CisgdC5sYW1hbGVmaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmZWY3OworIHQubGFtYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmVmYTsKKyB0LmxhbWFsZWZoYW16YWJlbG93aXNvbGF0ZWRhcmFiaWMgPSAweGZlZjk7CisgdC5sYW1hbGVmaXNvbGF0ZWRhcmFiaWMgPSAweGZlZmI7CisgdC5sYW1hbGVmbWFkZGFhYm92ZWZpbmFsYXJhYmljID0gMHhmZWY2OworIHQubGFtYWxlZm1hZGRhYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmVmNTsKKyB0LmxhbWFyYWJpYyA9IDB4MDY0NDsKKyB0LmxhbWJkYSA9IDB4MDNiYjsKKyB0LmxhbWJkYXN0cm9rZSA9IDB4MDE5YjsKKyB0LmxhbWVkID0gMHgwNWRjOworIHQubGFtZWRkYWdlc2ggPSAweGZiM2M7CisgdC5sYW1lZGRhZ2VzaGhlYnJldyA9IDB4ZmIzYzsKKyB0LmxhbWVkaGVicmV3ID0gMHgwNWRjOworIHQubGFtZmluYWxhcmFiaWMgPSAweGZlZGU7CisgdC5sYW1oYWhpbml0aWFsYXJhYmljID0gMHhmY2NhOworIHQubGFtaW5pdGlhbGFyYWJpYyA9IDB4ZmVkZjsKKyB0LmxhbWplZW1pbml0aWFsYXJhYmljID0gMHhmY2M5OworIHQubGFta2hhaGluaXRpYWxhcmFiaWMgPSAweGZjY2I7CisgdC5sYW1sYW1oZWhpc29sYXRlZGFyYWJpYyA9IDB4ZmRmMjsKKyB0LmxhbW1lZGlhbGFyYWJpYyA9IDB4ZmVlMDsKKyB0LmxhbW1lZW1oYWhpbml0aWFsYXJhYmljID0gMHhmZDg4OworIHQubGFtbWVlbWluaXRpYWxhcmFiaWMgPSAweGZjY2M7CisgdC5sYXJnZWNpcmNsZSA9IDB4MjVlZjsKKyB0LmxiYXIgPSAweDAxOWE7CisgdC5sYmVsdCA9IDB4MDI2YzsKKyB0Lmxib3BvbW9mbyA9IDB4MzEwYzsKKyB0LmxjYXJvbiA9IDB4MDEzZTsKKyB0LmxjZWRpbGxhID0gMHgwMTNjOworIHQubGNpcmNsZSA9IDB4MjRkYjsKKyB0LmxjaXJjdW1mbGV4YmVsb3cgPSAweDFlM2Q7CisgdC5sY29tbWFhY2NlbnQgPSAweDAxM2M7CisgdC5sZG90ID0gMHgwMTQwOworIHQubGRvdGFjY2VudCA9IDB4MDE0MDsKKyB0Lmxkb3RiZWxvdyA9IDB4MWUzNzsKKyB0Lmxkb3RiZWxvd21hY3JvbiA9IDB4MWUzOTsKKyB0LmxlZnRhbmdsZWFib3ZlY21iID0gMHgwMzFhOworIHQubGVmdHRhY2tiZWxvd2NtYiA9IDB4MDMxODsKKyB0Lmxlc3MgPSAweDAwM2M7CisgdC5sZXNzZXF1YWwgPSAweDIyNjQ7CisgdC5sZXNzZXF1YWxvcmdyZWF0ZXIgPSAweDIyZGE7CisgdC5sZXNzbW9ub3NwYWNlID0gMHhmZjFjOworIHQubGVzc29yZXF1aXZhbGVudCA9IDB4MjI3MjsKKyB0Lmxlc3NvcmdyZWF0ZXIgPSAweDIyNzY7CisgdC5sZXNzb3ZlcmVxdWFsID0gMHgyMjY2OworIHQubGVzc3NtYWxsID0gMHhmZTY0OworIHQubGV6aCA9IDB4MDI2ZTsKKyB0LmxmYmxvY2sgPSAweDI1OGM7CisgdC5saG9va3JldHJvZmxleCA9IDB4MDI2ZDsKKyB0LmxpcmEgPSAweDIwYTQ7CisgdC5saXduYXJtZW5pYW4gPSAweDA1NmM7CisgdC5saiA9IDB4MDFjOTsKKyB0LmxqZWN5cmlsbGljID0gMHgwNDU5OworIHQubGwgPSAweGY2YzA7CisgdC5sbGFkZXZhID0gMHgwOTMzOworIHQubGxhZ3VqYXJhdGkgPSAweDBhYjM7CisgdC5sbGluZWJlbG93ID0gMHgxZTNiOworIHQubGxsYWRldmEgPSAweDA5MzQ7CisgdC5sbHZvY2FsaWNiZW5nYWxpID0gMHgwOWUxOworIHQubGx2b2NhbGljZGV2YSA9IDB4MDk2MTsKKyB0Lmxsdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5ZTM7CisgdC5sbHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYzOworIHQubG1pZGRsZXRpbGRlID0gMHgwMjZiOworIHQubG1vbm9zcGFjZSA9IDB4ZmY0YzsKKyB0Lmxtc3F1YXJlID0gMHgzM2QwOworIHQubG9jaHVsYXRoYWkgPSAweDBlMmM7CisgdC5sb2dpY2FsYW5kID0gMHgyMjI3OworIHQubG9naWNhbG5vdCA9IDB4MDBhYzsKKyB0LmxvZ2ljYWxub3RyZXZlcnNlZCA9IDB4MjMxMDsKKyB0LmxvZ2ljYWxvciA9IDB4MjIyODsKKyB0LmxvbGluZ3RoYWkgPSAweDBlMjU7CisgdC5sb25ncyA9IDB4MDE3ZjsKKyB0Lmxvd2xpbmVjZW50ZXJsaW5lID0gMHhmZTRlOworIHQubG93bGluZWNtYiA9IDB4MDMzMjsKKyB0Lmxvd2xpbmVkYXNoZWQgPSAweGZlNGQ7CisgdC5sb3plbmdlID0gMHgyNWNhOworIHQubHBhcmVuID0gMHgyNGE3OworIHQubHNsYXNoID0gMHgwMTQyOworIHQubHNxdWFyZSA9IDB4MjExMzsKKyB0LmxzdXBlcmlvciA9IDB4ZjZlZTsKKyB0Lmx0c2hhZGUgPSAweDI1OTE7CisgdC5sdXRoYWkgPSAweDBlMjY7CisgdC5sdm9jYWxpY2JlbmdhbGkgPSAweDA5OGM7CisgdC5sdm9jYWxpY2RldmEgPSAweDA5MGM7CisgdC5sdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5ZTI7CisgdC5sdm9jYWxpY3Zvd2Vsc2lnbmRldmEgPSAweDA5NjI7CisgdC5seHNxdWFyZSA9IDB4MzNkMzsKKyB0Lm0gPSAweDAwNmQ7CisgdC5tYWJlbmdhbGkgPSAweDA5YWU7CisgdC5tYWNyb24gPSAweDAwYWY7CisgdC5tYWNyb25iZWxvd2NtYiA9IDB4MDMzMTsKKyB0Lm1hY3JvbmNtYiA9IDB4MDMwNDsKKyB0Lm1hY3Jvbmxvd21vZCA9IDB4MDJjZDsKKyB0Lm1hY3Jvbm1vbm9zcGFjZSA9IDB4ZmZlMzsKKyB0Lm1hY3V0ZSA9IDB4MWUzZjsKKyB0Lm1hZGV2YSA9IDB4MDkyZTsKKyB0Lm1hZ3VqYXJhdGkgPSAweDBhYWU7CisgdC5tYWd1cm11a2hpID0gMHgwYTJlOworIHQubWFoYXBha2hoZWJyZXcgPSAweDA1YTQ7CisgdC5tYWhhcGFraGxlZnRoZWJyZXcgPSAweDA1YTQ7CisgdC5tYWhpcmFnYW5hID0gMHgzMDdlOworIHQubWFpY2hhdHRhd2Fsb3dsZWZ0dGhhaSA9IDB4Zjg5NTsKKyB0Lm1haWNoYXR0YXdhbG93cmlnaHR0aGFpID0gMHhmODk0OworIHQubWFpY2hhdHRhd2F0aGFpID0gMHgwZTRiOworIHQubWFpY2hhdHRhd2F1cHBlcmxlZnR0aGFpID0gMHhmODkzOworIHQubWFpZWtsb3dsZWZ0dGhhaSA9IDB4Zjg4YzsKKyB0Lm1haWVrbG93cmlnaHR0aGFpID0gMHhmODhiOworIHQubWFpZWt0aGFpID0gMHgwZTQ4OworIHQubWFpZWt1cHBlcmxlZnR0aGFpID0gMHhmODhhOworIHQubWFpaGFuYWthdGxlZnR0aGFpID0gMHhmODg0OworIHQubWFpaGFuYWthdHRoYWkgPSAweDBlMzE7CisgdC5tYWl0YWlraHVsZWZ0dGhhaSA9IDB4Zjg4OTsKKyB0Lm1haXRhaWtodXRoYWkgPSAweDBlNDc7CisgdC5tYWl0aG9sb3dsZWZ0dGhhaSA9IDB4Zjg4ZjsKKyB0Lm1haXRob2xvd3JpZ2h0dGhhaSA9IDB4Zjg4ZTsKKyB0Lm1haXRob3RoYWkgPSAweDBlNDk7CisgdC5tYWl0aG91cHBlcmxlZnR0aGFpID0gMHhmODhkOworIHQubWFpdHJpbG93bGVmdHRoYWkgPSAweGY4OTI7CisgdC5tYWl0cmlsb3dyaWdodHRoYWkgPSAweGY4OTE7CisgdC5tYWl0cml0aGFpID0gMHgwZTRhOworIHQubWFpdHJpdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MDsKKyB0Lm1haXlhbW9rdGhhaSA9IDB4MGU0NjsKKyB0Lm1ha2F0YWthbmEgPSAweDMwZGU7CisgdC5tYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhmOworIHQubWFsZSA9IDB4MjY0MjsKKyB0Lm1hbnN5b25zcXVhcmUgPSAweDMzNDc7CisgdC5tYXFhZmhlYnJldyA9IDB4MDViZTsKKyB0Lm1hcnMgPSAweDI2NDI7CisgdC5tYXNvcmFjaXJjbGVoZWJyZXcgPSAweDA1YWY7CisgdC5tYXNxdWFyZSA9IDB4MzM4MzsKKyB0Lm1ib3BvbW9mbyA9IDB4MzEwNzsKKyB0Lm1ic3F1YXJlID0gMHgzM2Q0OworIHQubWNpcmNsZSA9IDB4MjRkYzsKKyB0Lm1jdWJlZHNxdWFyZSA9IDB4MzNhNTsKKyB0Lm1kb3RhY2NlbnQgPSAweDFlNDE7CisgdC5tZG90YmVsb3cgPSAweDFlNDM7CisgdC5tZWVtYXJhYmljID0gMHgwNjQ1OworIHQubWVlbWZpbmFsYXJhYmljID0gMHhmZWUyOworIHQubWVlbWluaXRpYWxhcmFiaWMgPSAweGZlZTM7CisgdC5tZWVtbWVkaWFsYXJhYmljID0gMHhmZWU0OworIHQubWVlbW1lZW1pbml0aWFsYXJhYmljID0gMHhmY2QxOworIHQubWVlbW1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0ODsKKyB0Lm1lZXRvcnVzcXVhcmUgPSAweDMzNGQ7CisgdC5tZWhpcmFnYW5hID0gMHgzMDgxOworIHQubWVpemllcmFzcXVhcmUgPSAweDMzN2U7CisgdC5tZWthdGFrYW5hID0gMHgzMGUxOworIHQubWVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MjsKKyB0Lm1lbSA9IDB4MDVkZTsKKyB0Lm1lbWRhZ2VzaCA9IDB4ZmIzZTsKKyB0Lm1lbWRhZ2VzaGhlYnJldyA9IDB4ZmIzZTsKKyB0Lm1lbWhlYnJldyA9IDB4MDVkZTsKKyB0Lm1lbmFybWVuaWFuID0gMHgwNTc0OworIHQubWVya2hhaGVicmV3ID0gMHgwNWE1OworIHQubWVya2hha2VmdWxhaGVicmV3ID0gMHgwNWE2OworIHQubWVya2hha2VmdWxhbGVmdGhlYnJldyA9IDB4MDVhNjsKKyB0Lm1lcmtoYWxlZnRoZWJyZXcgPSAweDA1YTU7CisgdC5taG9vayA9IDB4MDI3MTsKKyB0Lm1oenNxdWFyZSA9IDB4MzM5MjsKKyB0Lm1pZGRsZWRvdGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY1OworIHQubWlkZG90ID0gMHgwMGI3OworIHQubWlldW1hY2lyY2xla29yZWFuID0gMHgzMjcyOworIHQubWlldW1hcGFyZW5rb3JlYW4gPSAweDMyMTI7CisgdC5taWV1bWNpcmNsZWtvcmVhbiA9IDB4MzI2NDsKKyB0Lm1pZXVta29yZWFuID0gMHgzMTQxOworIHQubWlldW1wYW5zaW9za29yZWFuID0gMHgzMTcwOworIHQubWlldW1wYXJlbmtvcmVhbiA9IDB4MzIwNDsKKyB0Lm1pZXVtcGlldXBrb3JlYW4gPSAweDMxNmU7CisgdC5taWV1bXNpb3Nrb3JlYW4gPSAweDMxNmY7CisgdC5taWhpcmFnYW5hID0gMHgzMDdmOworIHQubWlrYXRha2FuYSA9IDB4MzBkZjsKKyB0Lm1pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTA7CisgdC5taW51cyA9IDB4MjIxMjsKKyB0Lm1pbnVzYmVsb3djbWIgPSAweDAzMjA7CisgdC5taW51c2NpcmNsZSA9IDB4MjI5NjsKKyB0Lm1pbnVzbW9kID0gMHgwMmQ3OworIHQubWludXNwbHVzID0gMHgyMjEzOworIHQubWludXRlID0gMHgyMDMyOworIHQubWlyaWJhYXJ1c3F1YXJlID0gMHgzMzRhOworIHQubWlyaXNxdWFyZSA9IDB4MzM0OTsKKyB0Lm1sb25nbGVndHVybmVkID0gMHgwMjcwOworIHQubWxzcXVhcmUgPSAweDMzOTY7CisgdC5tbWN1YmVkc3F1YXJlID0gMHgzM2EzOworIHQubW1vbm9zcGFjZSA9IDB4ZmY0ZDsKKyB0Lm1tc3F1YXJlZHNxdWFyZSA9IDB4MzM5ZjsKKyB0Lm1vaGlyYWdhbmEgPSAweDMwODI7CisgdC5tb2htc3F1YXJlID0gMHgzM2MxOworIHQubW9rYXRha2FuYSA9IDB4MzBlMjsKKyB0Lm1va2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTM7CisgdC5tb2xzcXVhcmUgPSAweDMzZDY7CisgdC5tb21hdGhhaSA9IDB4MGUyMTsKKyB0Lm1vdmVyc3NxdWFyZSA9IDB4MzNhNzsKKyB0Lm1vdmVyc3NxdWFyZWRzcXVhcmUgPSAweDMzYTg7CisgdC5tcGFyZW4gPSAweDI0YTg7CisgdC5tcGFzcXVhcmUgPSAweDMzYWI7CisgdC5tc3NxdWFyZSA9IDB4MzNiMzsKKyB0Lm1zdXBlcmlvciA9IDB4ZjZlZjsKKyB0Lm10dXJuZWQgPSAweDAyNmY7CisgdC5tdSA9IDB4MDBiNTsKKyB0Lm11MSA9IDB4MDBiNTsKKyB0Lm11YXNxdWFyZSA9IDB4MzM4MjsKKyB0Lm11Y2hncmVhdGVyID0gMHgyMjZiOworIHQubXVjaGxlc3MgPSAweDIyNmE7CisgdC5tdWZzcXVhcmUgPSAweDMzOGM7CisgdC5tdWdyZWVrID0gMHgwM2JjOworIHQubXVnc3F1YXJlID0gMHgzMzhkOworIHQubXVoaXJhZ2FuYSA9IDB4MzA4MDsKKyB0Lm11a2F0YWthbmEgPSAweDMwZTA7CisgdC5tdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkxOworIHQubXVsc3F1YXJlID0gMHgzMzk1OworIHQubXVsdGlwbHkgPSAweDAwZDc7CisgdC5tdW1zcXVhcmUgPSAweDMzOWI7CisgdC5tdW5haGhlYnJldyA9IDB4MDVhMzsKKyB0Lm11bmFobGVmdGhlYnJldyA9IDB4MDVhMzsKKyB0Lm11c2ljYWxub3RlID0gMHgyNjZhOworIHQubXVzaWNhbG5vdGVkYmwgPSAweDI2NmI7CisgdC5tdXNpY2ZsYXRzaWduID0gMHgyNjZkOworIHQubXVzaWNzaGFycHNpZ24gPSAweDI2NmY7CisgdC5tdXNzcXVhcmUgPSAweDMzYjI7CisgdC5tdXZzcXVhcmUgPSAweDMzYjY7CisgdC5tdXdzcXVhcmUgPSAweDMzYmM7CisgdC5tdm1lZ2FzcXVhcmUgPSAweDMzYjk7CisgdC5tdnNxdWFyZSA9IDB4MzNiNzsKKyB0Lm13bWVnYXNxdWFyZSA9IDB4MzNiZjsKKyB0Lm13c3F1YXJlID0gMHgzM2JkOworIHQubiA9IDB4MDA2ZTsKKyB0Lm5hYmVuZ2FsaSA9IDB4MDlhODsKKyB0Lm5hYmxhID0gMHgyMjA3OworIHQubmFjdXRlID0gMHgwMTQ0OworIHQubmFkZXZhID0gMHgwOTI4OworIHQubmFndWphcmF0aSA9IDB4MGFhODsKKyB0Lm5hZ3VybXVraGkgPSAweDBhMjg7CisgdC5uYWhpcmFnYW5hID0gMHgzMDZhOworIHQubmFrYXRha2FuYSA9IDB4MzBjYTsKKyB0Lm5ha2F0YWthbmFoYWxmd2lkdGggPSAweGZmODU7CisgdC5uYXBvc3Ryb3BoZSA9IDB4MDE0OTsKKyB0Lm5hc3F1YXJlID0gMHgzMzgxOworIHQubmJvcG9tb2ZvID0gMHgzMTBiOworIHQubmJzcGFjZSA9IDB4MDBhMDsKKyB0Lm5jYXJvbiA9IDB4MDE0ODsKKyB0Lm5jZWRpbGxhID0gMHgwMTQ2OworIHQubmNpcmNsZSA9IDB4MjRkZDsKKyB0Lm5jaXJjdW1mbGV4YmVsb3cgPSAweDFlNGI7CisgdC5uY29tbWFhY2NlbnQgPSAweDAxNDY7CisgdC5uZG90YWNjZW50ID0gMHgxZTQ1OworIHQubmRvdGJlbG93ID0gMHgxZTQ3OworIHQubmVoaXJhZ2FuYSA9IDB4MzA2ZDsKKyB0Lm5la2F0YWthbmEgPSAweDMwY2Q7CisgdC5uZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg4OworIHQubmV3c2hlcWVsc2lnbiA9IDB4MjBhYTsKKyB0Lm5mc3F1YXJlID0gMHgzMzhiOworIHQubmdhYmVuZ2FsaSA9IDB4MDk5OTsKKyB0Lm5nYWRldmEgPSAweDA5MTk7CisgdC5uZ2FndWphcmF0aSA9IDB4MGE5OTsKKyB0Lm5nYWd1cm11a2hpID0gMHgwYTE5OworIHQubmdvbmd1dGhhaSA9IDB4MGUwNzsKKyB0Lm5oaXJhZ2FuYSA9IDB4MzA5MzsKKyB0Lm5ob29rbGVmdCA9IDB4MDI3MjsKKyB0Lm5ob29rcmV0cm9mbGV4ID0gMHgwMjczOworIHQubmlldW5hY2lyY2xla29yZWFuID0gMHgzMjZmOworIHQubmlldW5hcGFyZW5rb3JlYW4gPSAweDMyMGY7CisgdC5uaWV1bmNpZXVja29yZWFuID0gMHgzMTM1OworIHQubmlldW5jaXJjbGVrb3JlYW4gPSAweDMyNjE7CisgdC5uaWV1bmhpZXVoa29yZWFuID0gMHgzMTM2OworIHQubmlldW5rb3JlYW4gPSAweDMxMzQ7CisgdC5uaWV1bnBhbnNpb3Nrb3JlYW4gPSAweDMxNjg7CisgdC5uaWV1bnBhcmVua29yZWFuID0gMHgzMjAxOworIHQubmlldW5zaW9za29yZWFuID0gMHgzMTY3OworIHQubmlldW50aWtldXRrb3JlYW4gPSAweDMxNjY7CisgdC5uaWhpcmFnYW5hID0gMHgzMDZiOworIHQubmlrYXRha2FuYSA9IDB4MzBjYjsKKyB0Lm5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmODY7CisgdC5uaWtoYWhpdGxlZnR0aGFpID0gMHhmODk5OworIHQubmlraGFoaXR0aGFpID0gMHgwZTRkOworIHQubmluZSA9IDB4MDAzOTsKKyB0Lm5pbmVhcmFiaWMgPSAweDA2Njk7CisgdC5uaW5lYmVuZ2FsaSA9IDB4MDllZjsKKyB0Lm5pbmVjaXJjbGUgPSAweDI0Njg7CisgdC5uaW5lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MjsKKyB0Lm5pbmVkZXZhID0gMHgwOTZmOworIHQubmluZWd1amFyYXRpID0gMHgwYWVmOworIHQubmluZWd1cm11a2hpID0gMHgwYTZmOworIHQubmluZWhhY2thcmFiaWMgPSAweDA2Njk7CisgdC5uaW5laGFuZ3pob3UgPSAweDMwMjk7CisgdC5uaW5laWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyODsKKyB0Lm5pbmVpbmZlcmlvciA9IDB4MjA4OTsKKyB0Lm5pbmVtb25vc3BhY2UgPSAweGZmMTk7CisgdC5uaW5lb2xkc3R5bGUgPSAweGY3Mzk7CisgdC5uaW5lcGFyZW4gPSAweDI0N2M7CisgdC5uaW5lcGVyaW9kID0gMHgyNDkwOworIHQubmluZXBlcnNpYW4gPSAweDA2Zjk7CisgdC5uaW5lcm9tYW4gPSAweDIxNzg7CisgdC5uaW5lc3VwZXJpb3IgPSAweDIwNzk7CisgdC5uaW5ldGVlbmNpcmNsZSA9IDB4MjQ3MjsKKyB0Lm5pbmV0ZWVucGFyZW4gPSAweDI0ODY7CisgdC5uaW5ldGVlbnBlcmlvZCA9IDB4MjQ5YTsKKyB0Lm5pbmV0aGFpID0gMHgwZTU5OworIHQubmogPSAweDAxY2M7CisgdC5uamVjeXJpbGxpYyA9IDB4MDQ1YTsKKyB0Lm5rYXRha2FuYSA9IDB4MzBmMzsKKyB0Lm5rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ZDsKKyB0Lm5sZWdyaWdodGxvbmcgPSAweDAxOWU7CisgdC5ubGluZWJlbG93ID0gMHgxZTQ5OworIHQubm1vbm9zcGFjZSA9IDB4ZmY0ZTsKKyB0Lm5tc3F1YXJlID0gMHgzMzlhOworIHQubm5hYmVuZ2FsaSA9IDB4MDlhMzsKKyB0Lm5uYWRldmEgPSAweDA5MjM7CisgdC5ubmFndWphcmF0aSA9IDB4MGFhMzsKKyB0Lm5uYWd1cm11a2hpID0gMHgwYTIzOworIHQubm5uYWRldmEgPSAweDA5Mjk7CisgdC5ub2hpcmFnYW5hID0gMHgzMDZlOworIHQubm9rYXRha2FuYSA9IDB4MzBjZTsKKyB0Lm5va2F0YWthbmFoYWxmd2lkdGggPSAweGZmODk7CisgdC5ub25icmVha2luZ3NwYWNlID0gMHgwMGEwOworIHQubm9uZW50aGFpID0gMHgwZTEzOworIHQubm9udXRoYWkgPSAweDBlMTk7CisgdC5ub29uYXJhYmljID0gMHgwNjQ2OworIHQubm9vbmZpbmFsYXJhYmljID0gMHhmZWU2OworIHQubm9vbmdodW5uYWFyYWJpYyA9IDB4MDZiYTsKKyB0Lm5vb25naHVubmFmaW5hbGFyYWJpYyA9IDB4ZmI5ZjsKKyB0Lm5vb25pbml0aWFsYXJhYmljID0gMHhmZWU3OworIHQubm9vbmplZW1pbml0aWFsYXJhYmljID0gMHhmY2QyOworIHQubm9vbmplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0YjsKKyB0Lm5vb25tZWRpYWxhcmFiaWMgPSAweGZlZTg7CisgdC5ub29ubWVlbWluaXRpYWxhcmFiaWMgPSAweGZjZDU7CisgdC5ub29ubWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzRlOworIHQubm9vbm5vb25maW5hbGFyYWJpYyA9IDB4ZmM4ZDsKKyB0Lm5vdGNvbnRhaW5zID0gMHgyMjBjOworIHQubm90ZWxlbWVudCA9IDB4MjIwOTsKKyB0Lm5vdGVsZW1lbnRvZiA9IDB4MjIwOTsKKyB0Lm5vdGVxdWFsID0gMHgyMjYwOworIHQubm90Z3JlYXRlciA9IDB4MjI2ZjsKKyB0Lm5vdGdyZWF0ZXJub3JlcXVhbCA9IDB4MjI3MTsKKyB0Lm5vdGdyZWF0ZXJub3JsZXNzID0gMHgyMjc5OworIHQubm90aWRlbnRpY2FsID0gMHgyMjYyOworIHQubm90bGVzcyA9IDB4MjI2ZTsKKyB0Lm5vdGxlc3Nub3JlcXVhbCA9IDB4MjI3MDsKKyB0Lm5vdHBhcmFsbGVsID0gMHgyMjI2OworIHQubm90cHJlY2VkZXMgPSAweDIyODA7CisgdC5ub3RzdWJzZXQgPSAweDIyODQ7CisgdC5ub3RzdWNjZWVkcyA9IDB4MjI4MTsKKyB0Lm5vdHN1cGVyc2V0ID0gMHgyMjg1OworIHQubm93YXJtZW5pYW4gPSAweDA1NzY7CisgdC5ucGFyZW4gPSAweDI0YTk7CisgdC5uc3NxdWFyZSA9IDB4MzNiMTsKKyB0Lm5zdXBlcmlvciA9IDB4MjA3ZjsKKyB0Lm50aWxkZSA9IDB4MDBmMTsKKyB0Lm51ID0gMHgwM2JkOworIHQubnVoaXJhZ2FuYSA9IDB4MzA2YzsKKyB0Lm51a2F0YWthbmEgPSAweDMwY2M7CisgdC5udWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg3OworIHQubnVrdGFiZW5nYWxpID0gMHgwOWJjOworIHQubnVrdGFkZXZhID0gMHgwOTNjOworIHQubnVrdGFndWphcmF0aSA9IDB4MGFiYzsKKyB0Lm51a3RhZ3VybXVraGkgPSAweDBhM2M7CisgdC5udW1iZXJzaWduID0gMHgwMDIzOworIHQubnVtYmVyc2lnbm1vbm9zcGFjZSA9IDB4ZmYwMzsKKyB0Lm51bWJlcnNpZ25zbWFsbCA9IDB4ZmU1ZjsKKyB0Lm51bWVyYWxzaWduZ3JlZWsgPSAweDAzNzQ7CisgdC5udW1lcmFsc2lnbmxvd2VyZ3JlZWsgPSAweDAzNzU7CisgdC5udW1lcm8gPSAweDIxMTY7CisgdC5udW4gPSAweDA1ZTA7CisgdC5udW5kYWdlc2ggPSAweGZiNDA7CisgdC5udW5kYWdlc2hoZWJyZXcgPSAweGZiNDA7CisgdC5udW5oZWJyZXcgPSAweDA1ZTA7CisgdC5udnNxdWFyZSA9IDB4MzNiNTsKKyB0Lm53c3F1YXJlID0gMHgzM2JiOworIHQubnlhYmVuZ2FsaSA9IDB4MDk5ZTsKKyB0Lm55YWRldmEgPSAweDA5MWU7CisgdC5ueWFndWphcmF0aSA9IDB4MGE5ZTsKKyB0Lm55YWd1cm11a2hpID0gMHgwYTFlOworIHQubyA9IDB4MDA2ZjsKKyB0Lm9hY3V0ZSA9IDB4MDBmMzsKKyB0Lm9hbmd0aGFpID0gMHgwZTJkOworIHQub2JhcnJlZCA9IDB4MDI3NTsKKyB0Lm9iYXJyZWRjeXJpbGxpYyA9IDB4MDRlOTsKKyB0Lm9iYXJyZWRkaWVyZXNpc2N5cmlsbGljID0gMHgwNGViOworIHQub2JlbmdhbGkgPSAweDA5OTM7CisgdC5vYm9wb21vZm8gPSAweDMxMWI7CisgdC5vYnJldmUgPSAweDAxNGY7CisgdC5vY2FuZHJhZGV2YSA9IDB4MDkxMTsKKyB0Lm9jYW5kcmFndWphcmF0aSA9IDB4MGE5MTsKKyB0Lm9jYW5kcmF2b3dlbHNpZ25kZXZhID0gMHgwOTQ5OworIHQub2NhbmRyYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM5OworIHQub2Nhcm9uID0gMHgwMWQyOworIHQub2NpcmNsZSA9IDB4MjRkZTsKKyB0Lm9jaXJjdW1mbGV4ID0gMHgwMGY0OworIHQub2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMTsKKyB0Lm9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDk7CisgdC5vY2lyY3VtZmxleGdyYXZlID0gMHgxZWQzOworIHQub2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDU7CisgdC5vY2lyY3VtZmxleHRpbGRlID0gMHgxZWQ3OworIHQub2N5cmlsbGljID0gMHgwNDNlOworIHQub2RibGFjdXRlID0gMHgwMTUxOworIHQub2RibGdyYXZlID0gMHgwMjBkOworIHQub2RldmEgPSAweDA5MTM7CisgdC5vZGllcmVzaXMgPSAweDAwZjY7CisgdC5vZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlNzsKKyB0Lm9kb3RiZWxvdyA9IDB4MWVjZDsKKyB0Lm9lID0gMHgwMTUzOworIHQub2Vrb3JlYW4gPSAweDMxNWE7CisgdC5vZ29uZWsgPSAweDAyZGI7CisgdC5vZ29uZWtjbWIgPSAweDAzMjg7CisgdC5vZ3JhdmUgPSAweDAwZjI7CisgdC5vZ3VqYXJhdGkgPSAweDBhOTM7CisgdC5vaGFybWVuaWFuID0gMHgwNTg1OworIHQub2hpcmFnYW5hID0gMHgzMDRhOworIHQub2hvb2thYm92ZSA9IDB4MWVjZjsKKyB0Lm9ob3JuID0gMHgwMWExOworIHQub2hvcm5hY3V0ZSA9IDB4MWVkYjsKKyB0Lm9ob3JuZG90YmVsb3cgPSAweDFlZTM7CisgdC5vaG9ybmdyYXZlID0gMHgxZWRkOworIHQub2hvcm5ob29rYWJvdmUgPSAweDFlZGY7CisgdC5vaG9ybnRpbGRlID0gMHgxZWUxOworIHQub2h1bmdhcnVtbGF1dCA9IDB4MDE1MTsKKyB0Lm9pID0gMHgwMWEzOworIHQub2ludmVydGVkYnJldmUgPSAweDAyMGY7CisgdC5va2F0YWthbmEgPSAweDMwYWE7CisgdC5va2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzU7CisgdC5va29yZWFuID0gMHgzMTU3OworIHQub2xlaGVicmV3ID0gMHgwNWFiOworIHQub21hY3JvbiA9IDB4MDE0ZDsKKyB0Lm9tYWNyb25hY3V0ZSA9IDB4MWU1MzsKKyB0Lm9tYWNyb25ncmF2ZSA9IDB4MWU1MTsKKyB0Lm9tZGV2YSA9IDB4MDk1MDsKKyB0Lm9tZWdhID0gMHgwM2M5OworIHQub21lZ2ExID0gMHgwM2Q2OworIHQub21lZ2FjeXJpbGxpYyA9IDB4MDQ2MTsKKyB0Lm9tZWdhbGF0aW5jbG9zZWQgPSAweDAyNzc7CisgdC5vbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2I7CisgdC5vbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2Q7CisgdC5vbWVnYXRvbm9zID0gMHgwM2NlOworIHQub21ndWphcmF0aSA9IDB4MGFkMDsKKyB0Lm9taWNyb24gPSAweDAzYmY7CisgdC5vbWljcm9udG9ub3MgPSAweDAzY2M7CisgdC5vbW9ub3NwYWNlID0gMHhmZjRmOworIHQub25lID0gMHgwMDMxOworIHQub25lYXJhYmljID0gMHgwNjYxOworIHQub25lYmVuZ2FsaSA9IDB4MDllNzsKKyB0Lm9uZWNpcmNsZSA9IDB4MjQ2MDsKKyB0Lm9uZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGE7CisgdC5vbmVkZXZhID0gMHgwOTY3OworIHQub25lZG90ZW5sZWFkZXIgPSAweDIwMjQ7CisgdC5vbmVlaWdodGggPSAweDIxNWI7CisgdC5vbmVmaXR0ZWQgPSAweGY2ZGM7CisgdC5vbmVndWphcmF0aSA9IDB4MGFlNzsKKyB0Lm9uZWd1cm11a2hpID0gMHgwYTY3OworIHQub25laGFja2FyYWJpYyA9IDB4MDY2MTsKKyB0Lm9uZWhhbGYgPSAweDAwYmQ7CisgdC5vbmVoYW5nemhvdSA9IDB4MzAyMTsKKyB0Lm9uZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjA7CisgdC5vbmVpbmZlcmlvciA9IDB4MjA4MTsKKyB0Lm9uZW1vbm9zcGFjZSA9IDB4ZmYxMTsKKyB0Lm9uZW51bWVyYXRvcmJlbmdhbGkgPSAweDA5ZjQ7CisgdC5vbmVvbGRzdHlsZSA9IDB4ZjczMTsKKyB0Lm9uZXBhcmVuID0gMHgyNDc0OworIHQub25lcGVyaW9kID0gMHgyNDg4OworIHQub25lcGVyc2lhbiA9IDB4MDZmMTsKKyB0Lm9uZXF1YXJ0ZXIgPSAweDAwYmM7CisgdC5vbmVyb21hbiA9IDB4MjE3MDsKKyB0Lm9uZXN1cGVyaW9yID0gMHgwMGI5OworIHQub25ldGhhaSA9IDB4MGU1MTsKKyB0Lm9uZXRoaXJkID0gMHgyMTUzOworIHQub29nb25layA9IDB4MDFlYjsKKyB0Lm9vZ29uZWttYWNyb24gPSAweDAxZWQ7CisgdC5vb2d1cm11a2hpID0gMHgwYTEzOworIHQub29tYXRyYWd1cm11a2hpID0gMHgwYTRiOworIHQub29wZW4gPSAweDAyNTQ7CisgdC5vcGFyZW4gPSAweDI0YWE7CisgdC5vcGVuYnVsbGV0ID0gMHgyNWU2OworIHQub3B0aW9uID0gMHgyMzI1OworIHQub3JkZmVtaW5pbmUgPSAweDAwYWE7CisgdC5vcmRtYXNjdWxpbmUgPSAweDAwYmE7CisgdC5vcnRob2dvbmFsID0gMHgyMjFmOworIHQub3Nob3J0ZGV2YSA9IDB4MDkxMjsKKyB0Lm9zaG9ydHZvd2Vsc2lnbmRldmEgPSAweDA5NGE7CisgdC5vc2xhc2ggPSAweDAwZjg7CisgdC5vc2xhc2hhY3V0ZSA9IDB4MDFmZjsKKyB0Lm9zbWFsbGhpcmFnYW5hID0gMHgzMDQ5OworIHQub3NtYWxsa2F0YWthbmEgPSAweDMwYTk7CisgdC5vc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2YjsKKyB0Lm9zdHJva2VhY3V0ZSA9IDB4MDFmZjsKKyB0Lm9zdXBlcmlvciA9IDB4ZjZmMDsKKyB0Lm90Y3lyaWxsaWMgPSAweDA0N2Y7CisgdC5vdGlsZGUgPSAweDAwZjU7CisgdC5vdGlsZGVhY3V0ZSA9IDB4MWU0ZDsKKyB0Lm90aWxkZWRpZXJlc2lzID0gMHgxZTRmOworIHQub3Vib3BvbW9mbyA9IDB4MzEyMTsKKyB0Lm92ZXJsaW5lID0gMHgyMDNlOworIHQub3ZlcmxpbmVjZW50ZXJsaW5lID0gMHhmZTRhOworIHQub3ZlcmxpbmVjbWIgPSAweDAzMDU7CisgdC5vdmVybGluZWRhc2hlZCA9IDB4ZmU0OTsKKyB0Lm92ZXJsaW5lZGJsd2F2eSA9IDB4ZmU0YzsKKyB0Lm92ZXJsaW5ld2F2eSA9IDB4ZmU0YjsKKyB0Lm92ZXJzY29yZSA9IDB4MDBhZjsKKyB0Lm92b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNiOworIHQub3Zvd2Vsc2lnbmRldmEgPSAweDA5NGI7CisgdC5vdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhY2I7CisgdC5wID0gMHgwMDcwOworIHQucGFhbXBzc3F1YXJlID0gMHgzMzgwOworIHQucGFhc2VudG9zcXVhcmUgPSAweDMzMmI7CisgdC5wYWJlbmdhbGkgPSAweDA5YWE7CisgdC5wYWN1dGUgPSAweDFlNTU7CisgdC5wYWRldmEgPSAweDA5MmE7CisgdC5wYWdlZG93biA9IDB4MjFkZjsKKyB0LnBhZ2V1cCA9IDB4MjFkZTsKKyB0LnBhZ3VqYXJhdGkgPSAweDBhYWE7CisgdC5wYWd1cm11a2hpID0gMHgwYTJhOworIHQucGFoaXJhZ2FuYSA9IDB4MzA3MTsKKyB0LnBhaXlhbm5vaXRoYWkgPSAweDBlMmY7CisgdC5wYWthdGFrYW5hID0gMHgzMGQxOworIHQucGFsYXRhbGl6YXRpb25jeXJpbGxpY2NtYiA9IDB4MDQ4NDsKKyB0LnBhbG9jaGthY3lyaWxsaWMgPSAweDA0YzA7CisgdC5wYW5zaW9za29yZWFuID0gMHgzMTdmOworIHQucGFyYWdyYXBoID0gMHgwMGI2OworIHQucGFyYWxsZWwgPSAweDIyMjU7CisgdC5wYXJlbmxlZnQgPSAweDAwMjg7CisgdC5wYXJlbmxlZnRhbHRvbmVhcmFiaWMgPSAweGZkM2U7CisgdC5wYXJlbmxlZnRidCA9IDB4ZjhlZDsKKyB0LnBhcmVubGVmdGV4ID0gMHhmOGVjOworIHQucGFyZW5sZWZ0aW5mZXJpb3IgPSAweDIwOGQ7CisgdC5wYXJlbmxlZnRtb25vc3BhY2UgPSAweGZmMDg7CisgdC5wYXJlbmxlZnRzbWFsbCA9IDB4ZmU1OTsKKyB0LnBhcmVubGVmdHN1cGVyaW9yID0gMHgyMDdkOworIHQucGFyZW5sZWZ0dHAgPSAweGY4ZWI7CisgdC5wYXJlbmxlZnR2ZXJ0aWNhbCA9IDB4ZmUzNTsKKyB0LnBhcmVucmlnaHQgPSAweDAwMjk7CisgdC5wYXJlbnJpZ2h0YWx0b25lYXJhYmljID0gMHhmZDNmOworIHQucGFyZW5yaWdodGJ0ID0gMHhmOGY4OworIHQucGFyZW5yaWdodGV4ID0gMHhmOGY3OworIHQucGFyZW5yaWdodGluZmVyaW9yID0gMHgyMDhlOworIHQucGFyZW5yaWdodG1vbm9zcGFjZSA9IDB4ZmYwOTsKKyB0LnBhcmVucmlnaHRzbWFsbCA9IDB4ZmU1YTsKKyB0LnBhcmVucmlnaHRzdXBlcmlvciA9IDB4MjA3ZTsKKyB0LnBhcmVucmlnaHR0cCA9IDB4ZjhmNjsKKyB0LnBhcmVucmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzNjsKKyB0LnBhcnRpYWxkaWZmID0gMHgyMjAyOworIHQucGFzZXFoZWJyZXcgPSAweDA1YzA7CisgdC5wYXNodGFoZWJyZXcgPSAweDA1OTk7CisgdC5wYXNxdWFyZSA9IDB4MzNhOTsKKyB0LnBhdGFoID0gMHgwNWI3OworIHQucGF0YWgxMSA9IDB4MDViNzsKKyB0LnBhdGFoMWQgPSAweDA1Yjc7CisgdC5wYXRhaDJhID0gMHgwNWI3OworIHQucGF0YWhoZWJyZXcgPSAweDA1Yjc7CisgdC5wYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViNzsKKyB0LnBhdGFocXVhcnRlcmhlYnJldyA9IDB4MDViNzsKKyB0LnBhdGFod2lkZWhlYnJldyA9IDB4MDViNzsKKyB0LnBhemVyaGVicmV3ID0gMHgwNWExOworIHQucGJvcG9tb2ZvID0gMHgzMTA2OworIHQucGNpcmNsZSA9IDB4MjRkZjsKKyB0LnBkb3RhY2NlbnQgPSAweDFlNTc7CisgdC5wZSA9IDB4MDVlNDsKKyB0LnBlY3lyaWxsaWMgPSAweDA0M2Y7CisgdC5wZWRhZ2VzaCA9IDB4ZmI0NDsKKyB0LnBlZGFnZXNoaGVicmV3ID0gMHhmYjQ0OworIHQucGVlemlzcXVhcmUgPSAweDMzM2I7CisgdC5wZWZpbmFsZGFnZXNoaGVicmV3ID0gMHhmYjQzOworIHQucGVoYXJhYmljID0gMHgwNjdlOworIHQucGVoYXJtZW5pYW4gPSAweDA1N2E7CisgdC5wZWhlYnJldyA9IDB4MDVlNDsKKyB0LnBlaGZpbmFsYXJhYmljID0gMHhmYjU3OworIHQucGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI1ODsKKyB0LnBlaGlyYWdhbmEgPSAweDMwN2E7CisgdC5wZWhtZWRpYWxhcmFiaWMgPSAweGZiNTk7CisgdC5wZWthdGFrYW5hID0gMHgzMGRhOworIHQucGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0YTc7CisgdC5wZXJhZmVoZWJyZXcgPSAweGZiNGU7CisgdC5wZXJjZW50ID0gMHgwMDI1OworIHQucGVyY2VudGFyYWJpYyA9IDB4MDY2YTsKKyB0LnBlcmNlbnRtb25vc3BhY2UgPSAweGZmMDU7CisgdC5wZXJjZW50c21hbGwgPSAweGZlNmE7CisgdC5wZXJpb2QgPSAweDAwMmU7CisgdC5wZXJpb2Rhcm1lbmlhbiA9IDB4MDU4OTsKKyB0LnBlcmlvZGNlbnRlcmVkID0gMHgwMGI3OworIHQucGVyaW9kaGFsZndpZHRoID0gMHhmZjYxOworIHQucGVyaW9kaW5mZXJpb3IgPSAweGY2ZTc7CisgdC5wZXJpb2Rtb25vc3BhY2UgPSAweGZmMGU7CisgdC5wZXJpb2RzbWFsbCA9IDB4ZmU1MjsKKyB0LnBlcmlvZHN1cGVyaW9yID0gMHhmNmU4OworIHQucGVyaXNwb21lbmlncmVla2NtYiA9IDB4MDM0MjsKKyB0LnBlcnBlbmRpY3VsYXIgPSAweDIyYTU7CisgdC5wZXJ0aG91c2FuZCA9IDB4MjAzMDsKKyB0LnBlc2V0YSA9IDB4MjBhNzsKKyB0LnBmc3F1YXJlID0gMHgzMzhhOworIHQucGhhYmVuZ2FsaSA9IDB4MDlhYjsKKyB0LnBoYWRldmEgPSAweDA5MmI7CisgdC5waGFndWphcmF0aSA9IDB4MGFhYjsKKyB0LnBoYWd1cm11a2hpID0gMHgwYTJiOworIHQucGhpID0gMHgwM2M2OworIHQucGhpMSA9IDB4MDNkNTsKKyB0LnBoaWV1cGhhY2lyY2xla29yZWFuID0gMHgzMjdhOworIHQucGhpZXVwaGFwYXJlbmtvcmVhbiA9IDB4MzIxYTsKKyB0LnBoaWV1cGhjaXJjbGVrb3JlYW4gPSAweDMyNmM7CisgdC5waGlldXBoa29yZWFuID0gMHgzMTRkOworIHQucGhpZXVwaHBhcmVua29yZWFuID0gMHgzMjBjOworIHQucGhpbGF0aW4gPSAweDAyNzg7CisgdC5waGludGh1dGhhaSA9IDB4MGUzYTsKKyB0LnBoaXN5bWJvbGdyZWVrID0gMHgwM2Q1OworIHQucGhvb2sgPSAweDAxYTU7CisgdC5waG9waGFudGhhaSA9IDB4MGUxZTsKKyB0LnBob3BodW5ndGhhaSA9IDB4MGUxYzsKKyB0LnBob3NhbXBoYW90aGFpID0gMHgwZTIwOworIHQucGkgPSAweDAzYzA7CisgdC5waWV1cGFjaXJjbGVrb3JlYW4gPSAweDMyNzM7CisgdC5waWV1cGFwYXJlbmtvcmVhbiA9IDB4MzIxMzsKKyB0LnBpZXVwY2lldWNrb3JlYW4gPSAweDMxNzY7CisgdC5waWV1cGNpcmNsZWtvcmVhbiA9IDB4MzI2NTsKKyB0LnBpZXVwa2l5ZW9ra29yZWFuID0gMHgzMTcyOworIHQucGlldXBrb3JlYW4gPSAweDMxNDI7CisgdC5waWV1cHBhcmVua29yZWFuID0gMHgzMjA1OworIHQucGlldXBzaW9za2l5ZW9ra29yZWFuID0gMHgzMTc0OworIHQucGlldXBzaW9za29yZWFuID0gMHgzMTQ0OworIHQucGlldXBzaW9zdGlrZXV0a29yZWFuID0gMHgzMTc1OworIHQucGlldXB0aGlldXRoa29yZWFuID0gMHgzMTc3OworIHQucGlldXB0aWtldXRrb3JlYW4gPSAweDMxNzM7CisgdC5waWhpcmFnYW5hID0gMHgzMDc0OworIHQucGlrYXRha2FuYSA9IDB4MzBkNDsKKyB0LnBpc3ltYm9sZ3JlZWsgPSAweDAzZDY7CisgdC5waXdyYXJtZW5pYW4gPSAweDA1ODM7CisgdC5wbHVzID0gMHgwMDJiOworIHQucGx1c2JlbG93Y21iID0gMHgwMzFmOworIHQucGx1c2NpcmNsZSA9IDB4MjI5NTsKKyB0LnBsdXNtaW51cyA9IDB4MDBiMTsKKyB0LnBsdXNtb2QgPSAweDAyZDY7CisgdC5wbHVzbW9ub3NwYWNlID0gMHhmZjBiOworIHQucGx1c3NtYWxsID0gMHhmZTYyOworIHQucGx1c3N1cGVyaW9yID0gMHgyMDdhOworIHQucG1vbm9zcGFjZSA9IDB4ZmY1MDsKKyB0LnBtc3F1YXJlID0gMHgzM2Q4OworIHQucG9oaXJhZ2FuYSA9IDB4MzA3ZDsKKyB0LnBvaW50aW5naW5kZXhkb3dud2hpdGUgPSAweDI2MWY7CisgdC5wb2ludGluZ2luZGV4bGVmdHdoaXRlID0gMHgyNjFjOworIHQucG9pbnRpbmdpbmRleHJpZ2h0d2hpdGUgPSAweDI2MWU7CisgdC5wb2ludGluZ2luZGV4dXB3aGl0ZSA9IDB4MjYxZDsKKyB0LnBva2F0YWthbmEgPSAweDMwZGQ7CisgdC5wb3BsYXRoYWkgPSAweDBlMWI7CisgdC5wb3N0YWxtYXJrID0gMHgzMDEyOworIHQucG9zdGFsbWFya2ZhY2UgPSAweDMwMjA7CisgdC5wcGFyZW4gPSAweDI0YWI7CisgdC5wcmVjZWRlcyA9IDB4MjI3YTsKKyB0LnByZXNjcmlwdGlvbiA9IDB4MjExZTsKKyB0LnByaW1lbW9kID0gMHgwMmI5OworIHQucHJpbWVyZXZlcnNlZCA9IDB4MjAzNTsKKyB0LnByb2R1Y3QgPSAweDIyMGY7CisgdC5wcm9qZWN0aXZlID0gMHgyMzA1OworIHQucHJvbG9uZ2Vka2FuYSA9IDB4MzBmYzsKKyB0LnByb3BlbGxvciA9IDB4MjMxODsKKyB0LnByb3BlcnN1YnNldCA9IDB4MjI4MjsKKyB0LnByb3BlcnN1cGVyc2V0ID0gMHgyMjgzOworIHQucHJvcG9ydGlvbiA9IDB4MjIzNzsKKyB0LnByb3BvcnRpb25hbCA9IDB4MjIxZDsKKyB0LnBzaSA9IDB4MDNjODsKKyB0LnBzaWN5cmlsbGljID0gMHgwNDcxOworIHQucHNpbGlwbmV1bWF0YWN5cmlsbGljY21iID0gMHgwNDg2OworIHQucHNzcXVhcmUgPSAweDMzYjA7CisgdC5wdWhpcmFnYW5hID0gMHgzMDc3OworIHQucHVrYXRha2FuYSA9IDB4MzBkNzsKKyB0LnB2c3F1YXJlID0gMHgzM2I0OworIHQucHdzcXVhcmUgPSAweDMzYmE7CisgdC5xID0gMHgwMDcxOworIHQucWFkZXZhID0gMHgwOTU4OworIHQucWFkbWFoZWJyZXcgPSAweDA1YTg7CisgdC5xYWZhcmFiaWMgPSAweDA2NDI7CisgdC5xYWZmaW5hbGFyYWJpYyA9IDB4ZmVkNjsKKyB0LnFhZmluaXRpYWxhcmFiaWMgPSAweGZlZDc7CisgdC5xYWZtZWRpYWxhcmFiaWMgPSAweGZlZDg7CisgdC5xYW1hdHMgPSAweDA1Yjg7CisgdC5xYW1hdHMxMCA9IDB4MDViODsKKyB0LnFhbWF0czFhID0gMHgwNWI4OworIHQucWFtYXRzMWMgPSAweDA1Yjg7CisgdC5xYW1hdHMyNyA9IDB4MDViODsKKyB0LnFhbWF0czI5ID0gMHgwNWI4OworIHQucWFtYXRzMzMgPSAweDA1Yjg7CisgdC5xYW1hdHNkZSA9IDB4MDViODsKKyB0LnFhbWF0c2hlYnJldyA9IDB4MDViODsKKyB0LnFhbWF0c25hcnJvd2hlYnJldyA9IDB4MDViODsKKyB0LnFhbWF0c3FhdGFuaGVicmV3ID0gMHgwNWI4OworIHQucWFtYXRzcWF0YW5uYXJyb3doZWJyZXcgPSAweDA1Yjg7CisgdC5xYW1hdHNxYXRhbnF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjg7CisgdC5xYW1hdHNxYXRhbndpZGVoZWJyZXcgPSAweDA1Yjg7CisgdC5xYW1hdHNxdWFydGVyaGVicmV3ID0gMHgwNWI4OworIHQucWFtYXRzd2lkZWhlYnJldyA9IDB4MDViODsKKyB0LnFhcm5leXBhcmFoZWJyZXcgPSAweDA1OWY7CisgdC5xYm9wb21vZm8gPSAweDMxMTE7CisgdC5xY2lyY2xlID0gMHgyNGUwOworIHQucWhvb2sgPSAweDAyYTA7CisgdC5xbW9ub3NwYWNlID0gMHhmZjUxOworIHQucW9mID0gMHgwNWU3OworIHQucW9mZGFnZXNoID0gMHhmYjQ3OworIHQucW9mZGFnZXNoaGVicmV3ID0gMHhmYjQ3OworIHQucW9maGVicmV3ID0gMHgwNWU3OworIHQucXBhcmVuID0gMHgyNGFjOworIHQucXVhcnRlcm5vdGUgPSAweDI2Njk7CisgdC5xdWJ1dHMgPSAweDA1YmI7CisgdC5xdWJ1dHMxOCA9IDB4MDViYjsKKyB0LnF1YnV0czI1ID0gMHgwNWJiOworIHQucXVidXRzMzEgPSAweDA1YmI7CisgdC5xdWJ1dHNoZWJyZXcgPSAweDA1YmI7CisgdC5xdWJ1dHNuYXJyb3doZWJyZXcgPSAweDA1YmI7CisgdC5xdWJ1dHNxdWFydGVyaGVicmV3ID0gMHgwNWJiOworIHQucXVidXRzd2lkZWhlYnJldyA9IDB4MDViYjsKKyB0LnF1ZXN0aW9uID0gMHgwMDNmOworIHQucXVlc3Rpb25hcmFiaWMgPSAweDA2MWY7CisgdC5xdWVzdGlvbmFybWVuaWFuID0gMHgwNTVlOworIHQucXVlc3Rpb25kb3duID0gMHgwMGJmOworIHQucXVlc3Rpb25kb3duc21hbGwgPSAweGY3YmY7CisgdC5xdWVzdGlvbmdyZWVrID0gMHgwMzdlOworIHQucXVlc3Rpb25tb25vc3BhY2UgPSAweGZmMWY7CisgdC5xdWVzdGlvbnNtYWxsID0gMHhmNzNmOworIHQucXVvdGVkYmwgPSAweDAwMjI7CisgdC5xdW90ZWRibGJhc2UgPSAweDIwMWU7CisgdC5xdW90ZWRibGxlZnQgPSAweDIwMWM7CisgdC5xdW90ZWRibG1vbm9zcGFjZSA9IDB4ZmYwMjsKKyB0LnF1b3RlZGJscHJpbWUgPSAweDMwMWU7CisgdC5xdW90ZWRibHByaW1lcmV2ZXJzZWQgPSAweDMwMWQ7CisgdC5xdW90ZWRibHJpZ2h0ID0gMHgyMDFkOworIHQucXVvdGVsZWZ0ID0gMHgyMDE4OworIHQucXVvdGVsZWZ0cmV2ZXJzZWQgPSAweDIwMWI7CisgdC5xdW90ZXJldmVyc2VkID0gMHgyMDFiOworIHQucXVvdGVyaWdodCA9IDB4MjAxOTsKKyB0LnF1b3RlcmlnaHRuID0gMHgwMTQ5OworIHQucXVvdGVzaW5nbGJhc2UgPSAweDIwMWE7CisgdC5xdW90ZXNpbmdsZSA9IDB4MDAyNzsKKyB0LnF1b3Rlc2luZ2xlbW9ub3NwYWNlID0gMHhmZjA3OworIHQuciA9IDB4MDA3MjsKKyB0LnJhYXJtZW5pYW4gPSAweDA1N2M7CisgdC5yYWJlbmdhbGkgPSAweDA5YjA7CisgdC5yYWN1dGUgPSAweDAxNTU7CisgdC5yYWRldmEgPSAweDA5MzA7CisgdC5yYWRpY2FsID0gMHgyMjFhOworIHQucmFkaWNhbGV4ID0gMHhmOGU1OworIHQucmFkb3ZlcnNzcXVhcmUgPSAweDMzYWU7CisgdC5yYWRvdmVyc3NxdWFyZWRzcXVhcmUgPSAweDMzYWY7CisgdC5yYWRzcXVhcmUgPSAweDMzYWQ7CisgdC5yYWZlID0gMHgwNWJmOworIHQucmFmZWhlYnJldyA9IDB4MDViZjsKKyB0LnJhZ3VqYXJhdGkgPSAweDBhYjA7CisgdC5yYWd1cm11a2hpID0gMHgwYTMwOworIHQucmFoaXJhZ2FuYSA9IDB4MzA4OTsKKyB0LnJha2F0YWthbmEgPSAweDMwZTk7CisgdC5yYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk3OworIHQucmFsb3dlcmRpYWdvbmFsYmVuZ2FsaSA9IDB4MDlmMTsKKyB0LnJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpID0gMHgwOWYwOworIHQucmFtc2hvcm4gPSAweDAyNjQ7CisgdC5yYXRpbyA9IDB4MjIzNjsKKyB0LnJib3BvbW9mbyA9IDB4MzExNjsKKyB0LnJjYXJvbiA9IDB4MDE1OTsKKyB0LnJjZWRpbGxhID0gMHgwMTU3OworIHQucmNpcmNsZSA9IDB4MjRlMTsKKyB0LnJjb21tYWFjY2VudCA9IDB4MDE1NzsKKyB0LnJkYmxncmF2ZSA9IDB4MDIxMTsKKyB0LnJkb3RhY2NlbnQgPSAweDFlNTk7CisgdC5yZG90YmVsb3cgPSAweDFlNWI7CisgdC5yZG90YmVsb3dtYWNyb24gPSAweDFlNWQ7CisgdC5yZWZlcmVuY2VtYXJrID0gMHgyMDNiOworIHQucmVmbGV4c3Vic2V0ID0gMHgyMjg2OworIHQucmVmbGV4c3VwZXJzZXQgPSAweDIyODc7CisgdC5yZWdpc3RlcmVkID0gMHgwMGFlOworIHQucmVnaXN0ZXJzYW5zID0gMHhmOGU4OworIHQucmVnaXN0ZXJzZXJpZiA9IDB4ZjZkYTsKKyB0LnJlaGFyYWJpYyA9IDB4MDYzMTsKKyB0LnJlaGFybWVuaWFuID0gMHgwNTgwOworIHQucmVoZmluYWxhcmFiaWMgPSAweGZlYWU7CisgdC5yZWhpcmFnYW5hID0gMHgzMDhjOworIHQucmVrYXRha2FuYSA9IDB4MzBlYzsKKyB0LnJla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWE7CisgdC5yZXNoID0gMHgwNWU4OworIHQucmVzaGRhZ2VzaGhlYnJldyA9IDB4ZmI0ODsKKyB0LnJlc2hoZWJyZXcgPSAweDA1ZTg7CisgdC5yZXZlcnNlZHRpbGRlID0gMHgyMjNkOworIHQucmV2aWFoZWJyZXcgPSAweDA1OTc7CisgdC5yZXZpYW11Z3Jhc2hoZWJyZXcgPSAweDA1OTc7CisgdC5yZXZsb2dpY2Fsbm90ID0gMHgyMzEwOworIHQucmZpc2hob29rID0gMHgwMjdlOworIHQucmZpc2hob29rcmV2ZXJzZWQgPSAweDAyN2Y7CisgdC5yaGFiZW5nYWxpID0gMHgwOWRkOworIHQucmhhZGV2YSA9IDB4MDk1ZDsKKyB0LnJobyA9IDB4MDNjMTsKKyB0LnJob29rID0gMHgwMjdkOworIHQucmhvb2t0dXJuZWQgPSAweDAyN2I7CisgdC5yaG9va3R1cm5lZHN1cGVyaW9yID0gMHgwMmI1OworIHQucmhvc3ltYm9sZ3JlZWsgPSAweDAzZjE7CisgdC5yaG90aWNob29rbW9kID0gMHgwMmRlOworIHQucmlldWxhY2lyY2xla29yZWFuID0gMHgzMjcxOworIHQucmlldWxhcGFyZW5rb3JlYW4gPSAweDMyMTE7CisgdC5yaWV1bGNpcmNsZWtvcmVhbiA9IDB4MzI2MzsKKyB0LnJpZXVsaGlldWhrb3JlYW4gPSAweDMxNDA7CisgdC5yaWV1bGtpeWVva2tvcmVhbiA9IDB4MzEzYTsKKyB0LnJpZXVsa2l5ZW9rc2lvc2tvcmVhbiA9IDB4MzE2OTsKKyB0LnJpZXVsa29yZWFuID0gMHgzMTM5OworIHQucmlldWxtaWV1bWtvcmVhbiA9IDB4MzEzYjsKKyB0LnJpZXVscGFuc2lvc2tvcmVhbiA9IDB4MzE2YzsKKyB0LnJpZXVscGFyZW5rb3JlYW4gPSAweDMyMDM7CisgdC5yaWV1bHBoaWV1cGhrb3JlYW4gPSAweDMxM2Y7CisgdC5yaWV1bHBpZXVwa29yZWFuID0gMHgzMTNjOworIHQucmlldWxwaWV1cHNpb3Nrb3JlYW4gPSAweDMxNmI7CisgdC5yaWV1bHNpb3Nrb3JlYW4gPSAweDMxM2Q7CisgdC5yaWV1bHRoaWV1dGhrb3JlYW4gPSAweDMxM2U7CisgdC5yaWV1bHRpa2V1dGtvcmVhbiA9IDB4MzE2YTsKKyB0LnJpZXVseWVvcmluaGlldWhrb3JlYW4gPSAweDMxNmQ7CisgdC5yaWdodGFuZ2xlID0gMHgyMjFmOworIHQucmlnaHR0YWNrYmVsb3djbWIgPSAweDAzMTk7CisgdC5yaWdodHRyaWFuZ2xlID0gMHgyMmJmOworIHQucmloaXJhZ2FuYSA9IDB4MzA4YTsKKyB0LnJpa2F0YWthbmEgPSAweDMwZWE7CisgdC5yaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk4OworIHQucmluZyA9IDB4MDJkYTsKKyB0LnJpbmdiZWxvd2NtYiA9IDB4MDMyNTsKKyB0LnJpbmdjbWIgPSAweDAzMGE7CisgdC5yaW5naGFsZmxlZnQgPSAweDAyYmY7CisgdC5yaW5naGFsZmxlZnRhcm1lbmlhbiA9IDB4MDU1OTsKKyB0LnJpbmdoYWxmbGVmdGJlbG93Y21iID0gMHgwMzFjOworIHQucmluZ2hhbGZsZWZ0Y2VudGVyZWQgPSAweDAyZDM7CisgdC5yaW5naGFsZnJpZ2h0ID0gMHgwMmJlOworIHQucmluZ2hhbGZyaWdodGJlbG93Y21iID0gMHgwMzM5OworIHQucmluZ2hhbGZyaWdodGNlbnRlcmVkID0gMHgwMmQyOworIHQucmludmVydGVkYnJldmUgPSAweDAyMTM7CisgdC5yaXR0b3J1c3F1YXJlID0gMHgzMzUxOworIHQucmxpbmViZWxvdyA9IDB4MWU1ZjsKKyB0LnJsb25nbGVnID0gMHgwMjdjOworIHQucmxvbmdsZWd0dXJuZWQgPSAweDAyN2E7CisgdC5ybW9ub3NwYWNlID0gMHhmZjUyOworIHQucm9oaXJhZ2FuYSA9IDB4MzA4ZDsKKyB0LnJva2F0YWthbmEgPSAweDMwZWQ7CisgdC5yb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjliOworIHQucm9ydWF0aGFpID0gMHgwZTIzOworIHQucnBhcmVuID0gMHgyNGFkOworIHQucnJhYmVuZ2FsaSA9IDB4MDlkYzsKKyB0LnJyYWRldmEgPSAweDA5MzE7CisgdC5ycmFndXJtdWtoaSA9IDB4MGE1YzsKKyB0LnJyZWhhcmFiaWMgPSAweDA2OTE7CisgdC5ycmVoZmluYWxhcmFiaWMgPSAweGZiOGQ7CisgdC5ycnZvY2FsaWNiZW5nYWxpID0gMHgwOWUwOworIHQucnJ2b2NhbGljZGV2YSA9IDB4MDk2MDsKKyB0LnJydm9jYWxpY2d1amFyYXRpID0gMHgwYWUwOworIHQucnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljNDsKKyB0LnJydm9jYWxpY3Zvd2Vsc2lnbmRldmEgPSAweDA5NDQ7CisgdC5ycnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNDsKKyB0LnJzdXBlcmlvciA9IDB4ZjZmMTsKKyB0LnJ0YmxvY2sgPSAweDI1OTA7CisgdC5ydHVybmVkID0gMHgwMjc5OworIHQucnR1cm5lZHN1cGVyaW9yID0gMHgwMmI0OworIHQucnVoaXJhZ2FuYSA9IDB4MzA4YjsKKyB0LnJ1a2F0YWthbmEgPSAweDMwZWI7CisgdC5ydWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk5OworIHQucnVwZWVtYXJrYmVuZ2FsaSA9IDB4MDlmMjsKKyB0LnJ1cGVlc2lnbmJlbmdhbGkgPSAweDA5ZjM7CisgdC5ydXBpYWggPSAweGY2ZGQ7CisgdC5ydXRoYWkgPSAweDBlMjQ7CisgdC5ydm9jYWxpY2JlbmdhbGkgPSAweDA5OGI7CisgdC5ydm9jYWxpY2RldmEgPSAweDA5MGI7CisgdC5ydm9jYWxpY2d1amFyYXRpID0gMHgwYThiOworIHQucnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMzOworIHQucnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQzOworIHQucnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMzsKKyB0LnMgPSAweDAwNzM7CisgdC5zYWJlbmdhbGkgPSAweDA5Yjg7CisgdC5zYWN1dGUgPSAweDAxNWI7CisgdC5zYWN1dGVkb3RhY2NlbnQgPSAweDFlNjU7CisgdC5zYWRhcmFiaWMgPSAweDA2MzU7CisgdC5zYWRldmEgPSAweDA5Mzg7CisgdC5zYWRmaW5hbGFyYWJpYyA9IDB4ZmViYTsKKyB0LnNhZGluaXRpYWxhcmFiaWMgPSAweGZlYmI7CisgdC5zYWRtZWRpYWxhcmFiaWMgPSAweGZlYmM7CisgdC5zYWd1amFyYXRpID0gMHgwYWI4OworIHQuc2FndXJtdWtoaSA9IDB4MGEzODsKKyB0LnNhaGlyYWdhbmEgPSAweDMwNTU7CisgdC5zYWthdGFrYW5hID0gMHgzMGI1OworIHQuc2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YjsKKyB0LnNhbGxhbGxhaG91YWxheWhld2FzYWxsYW1hcmFiaWMgPSAweGZkZmE7CisgdC5zYW1la2ggPSAweDA1ZTE7CisgdC5zYW1la2hkYWdlc2ggPSAweGZiNDE7CisgdC5zYW1la2hkYWdlc2hoZWJyZXcgPSAweGZiNDE7CisgdC5zYW1la2hoZWJyZXcgPSAweDA1ZTE7CisgdC5zYXJhYWF0aGFpID0gMHgwZTMyOworIHQuc2FyYWFldGhhaSA9IDB4MGU0MTsKKyB0LnNhcmFhaW1haW1hbGFpdGhhaSA9IDB4MGU0NDsKKyB0LnNhcmFhaW1haW11YW50aGFpID0gMHgwZTQzOworIHQuc2FyYWFtdGhhaSA9IDB4MGUzMzsKKyB0LnNhcmFhdGhhaSA9IDB4MGUzMDsKKyB0LnNhcmFldGhhaSA9IDB4MGU0MDsKKyB0LnNhcmFpaWxlZnR0aGFpID0gMHhmODg2OworIHQuc2FyYWlpdGhhaSA9IDB4MGUzNTsKKyB0LnNhcmFpbGVmdHRoYWkgPSAweGY4ODU7CisgdC5zYXJhaXRoYWkgPSAweDBlMzQ7CisgdC5zYXJhb3RoYWkgPSAweDBlNDI7CisgdC5zYXJhdWVlbGVmdHRoYWkgPSAweGY4ODg7CisgdC5zYXJhdWVldGhhaSA9IDB4MGUzNzsKKyB0LnNhcmF1ZWxlZnR0aGFpID0gMHhmODg3OworIHQuc2FyYXVldGhhaSA9IDB4MGUzNjsKKyB0LnNhcmF1dGhhaSA9IDB4MGUzODsKKyB0LnNhcmF1dXRoYWkgPSAweDBlMzk7CisgdC5zYm9wb21vZm8gPSAweDMxMTk7CisgdC5zY2Fyb24gPSAweDAxNjE7CisgdC5zY2Fyb25kb3RhY2NlbnQgPSAweDFlNjc7CisgdC5zY2VkaWxsYSA9IDB4MDE1ZjsKKyB0LnNjaHdhID0gMHgwMjU5OworIHQuc2Nod2FjeXJpbGxpYyA9IDB4MDRkOTsKKyB0LnNjaHdhZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkYjsKKyB0LnNjaHdhaG9vayA9IDB4MDI1YTsKKyB0LnNjaXJjbGUgPSAweDI0ZTI7CisgdC5zY2lyY3VtZmxleCA9IDB4MDE1ZDsKKyB0LnNjb21tYWFjY2VudCA9IDB4MDIxOTsKKyB0LnNkb3RhY2NlbnQgPSAweDFlNjE7CisgdC5zZG90YmVsb3cgPSAweDFlNjM7CisgdC5zZG90YmVsb3dkb3RhY2NlbnQgPSAweDFlNjk7CisgdC5zZWFndWxsYmVsb3djbWIgPSAweDAzM2M7CisgdC5zZWNvbmQgPSAweDIwMzM7CisgdC5zZWNvbmR0b25lY2hpbmVzZSA9IDB4MDJjYTsKKyB0LnNlY3Rpb24gPSAweDAwYTc7CisgdC5zZWVuYXJhYmljID0gMHgwNjMzOworIHQuc2VlbmZpbmFsYXJhYmljID0gMHhmZWIyOworIHQuc2VlbmluaXRpYWxhcmFiaWMgPSAweGZlYjM7CisgdC5zZWVubWVkaWFsYXJhYmljID0gMHhmZWI0OworIHQuc2Vnb2wgPSAweDA1YjY7CisgdC5zZWdvbDEzID0gMHgwNWI2OworIHQuc2Vnb2wxZiA9IDB4MDViNjsKKyB0LnNlZ29sMmMgPSAweDA1YjY7CisgdC5zZWdvbGhlYnJldyA9IDB4MDViNjsKKyB0LnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWI2OworIHQuc2Vnb2xxdWFydGVyaGVicmV3ID0gMHgwNWI2OworIHQuc2Vnb2x0YWhlYnJldyA9IDB4MDU5MjsKKyB0LnNlZ29sd2lkZWhlYnJldyA9IDB4MDViNjsKKyB0LnNlaGFybWVuaWFuID0gMHgwNTdkOworIHQuc2VoaXJhZ2FuYSA9IDB4MzA1YjsKKyB0LnNla2F0YWthbmEgPSAweDMwYmI7CisgdC5zZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdlOworIHQuc2VtaWNvbG9uID0gMHgwMDNiOworIHQuc2VtaWNvbG9uYXJhYmljID0gMHgwNjFiOworIHQuc2VtaWNvbG9ubW9ub3NwYWNlID0gMHhmZjFiOworIHQuc2VtaWNvbG9uc21hbGwgPSAweGZlNTQ7CisgdC5zZW1pdm9pY2VkbWFya2thbmEgPSAweDMwOWM7CisgdC5zZW1pdm9pY2VkbWFya2thbmFoYWxmd2lkdGggPSAweGZmOWY7CisgdC5zZW50aXNxdWFyZSA9IDB4MzMyMjsKKyB0LnNlbnRvc3F1YXJlID0gMHgzMzIzOworIHQuc2V2ZW4gPSAweDAwMzc7CisgdC5zZXZlbmFyYWJpYyA9IDB4MDY2NzsKKyB0LnNldmVuYmVuZ2FsaSA9IDB4MDllZDsKKyB0LnNldmVuY2lyY2xlID0gMHgyNDY2OworIHQuc2V2ZW5jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzkwOworIHQuc2V2ZW5kZXZhID0gMHgwOTZkOworIHQuc2V2ZW5laWdodGhzID0gMHgyMTVlOworIHQuc2V2ZW5ndWphcmF0aSA9IDB4MGFlZDsKKyB0LnNldmVuZ3VybXVraGkgPSAweDBhNmQ7CisgdC5zZXZlbmhhY2thcmFiaWMgPSAweDA2Njc7CisgdC5zZXZlbmhhbmd6aG91ID0gMHgzMDI3OworIHQuc2V2ZW5pZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI2OworIHQuc2V2ZW5pbmZlcmlvciA9IDB4MjA4NzsKKyB0LnNldmVubW9ub3NwYWNlID0gMHhmZjE3OworIHQuc2V2ZW5vbGRzdHlsZSA9IDB4ZjczNzsKKyB0LnNldmVucGFyZW4gPSAweDI0N2E7CisgdC5zZXZlbnBlcmlvZCA9IDB4MjQ4ZTsKKyB0LnNldmVucGVyc2lhbiA9IDB4MDZmNzsKKyB0LnNldmVucm9tYW4gPSAweDIxNzY7CisgdC5zZXZlbnN1cGVyaW9yID0gMHgyMDc3OworIHQuc2V2ZW50ZWVuY2lyY2xlID0gMHgyNDcwOworIHQuc2V2ZW50ZWVucGFyZW4gPSAweDI0ODQ7CisgdC5zZXZlbnRlZW5wZXJpb2QgPSAweDI0OTg7CisgdC5zZXZlbnRoYWkgPSAweDBlNTc7CisgdC5zZnRoeXBoZW4gPSAweDAwYWQ7CisgdC5zaGFhcm1lbmlhbiA9IDB4MDU3NzsKKyB0LnNoYWJlbmdhbGkgPSAweDA5YjY7CisgdC5zaGFjeXJpbGxpYyA9IDB4MDQ0ODsKKyB0LnNoYWRkYWFyYWJpYyA9IDB4MDY1MTsKKyB0LnNoYWRkYWRhbW1hYXJhYmljID0gMHhmYzYxOworIHQuc2hhZGRhZGFtbWF0YW5hcmFiaWMgPSAweGZjNWU7CisgdC5zaGFkZGFmYXRoYWFyYWJpYyA9IDB4ZmM2MDsKKyB0LnNoYWRkYWthc3JhYXJhYmljID0gMHhmYzYyOworIHQuc2hhZGRha2FzcmF0YW5hcmFiaWMgPSAweGZjNWY7CisgdC5zaGFkZSA9IDB4MjU5MjsKKyB0LnNoYWRlZGFyayA9IDB4MjU5MzsKKyB0LnNoYWRlbGlnaHQgPSAweDI1OTE7CisgdC5zaGFkZW1lZGl1bSA9IDB4MjU5MjsKKyB0LnNoYWRldmEgPSAweDA5MzY7CisgdC5zaGFndWphcmF0aSA9IDB4MGFiNjsKKyB0LnNoYWd1cm11a2hpID0gMHgwYTM2OworIHQuc2hhbHNoZWxldGhlYnJldyA9IDB4MDU5MzsKKyB0LnNoYm9wb21vZm8gPSAweDMxMTU7CisgdC5zaGNoYWN5cmlsbGljID0gMHgwNDQ5OworIHQuc2hlZW5hcmFiaWMgPSAweDA2MzQ7CisgdC5zaGVlbmZpbmFsYXJhYmljID0gMHhmZWI2OworIHQuc2hlZW5pbml0aWFsYXJhYmljID0gMHhmZWI3OworIHQuc2hlZW5tZWRpYWxhcmFiaWMgPSAweGZlYjg7CisgdC5zaGVpY29wdGljID0gMHgwM2UzOworIHQuc2hlcWVsID0gMHgyMGFhOworIHQuc2hlcWVsaGVicmV3ID0gMHgyMGFhOworIHQuc2hldmEgPSAweDA1YjA7CisgdC5zaGV2YTExNSA9IDB4MDViMDsKKyB0LnNoZXZhMTUgPSAweDA1YjA7CisgdC5zaGV2YTIyID0gMHgwNWIwOworIHQuc2hldmEyZSA9IDB4MDViMDsKKyB0LnNoZXZhaGVicmV3ID0gMHgwNWIwOworIHQuc2hldmFuYXJyb3doZWJyZXcgPSAweDA1YjA7CisgdC5zaGV2YXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjA7CisgdC5zaGV2YXdpZGVoZWJyZXcgPSAweDA1YjA7CisgdC5zaGhhY3lyaWxsaWMgPSAweDA0YmI7CisgdC5zaGltYWNvcHRpYyA9IDB4MDNlZDsKKyB0LnNoaW4gPSAweDA1ZTk7CisgdC5zaGluZGFnZXNoID0gMHhmYjQ5OworIHQuc2hpbmRhZ2VzaGhlYnJldyA9IDB4ZmI0OTsKKyB0LnNoaW5kYWdlc2hzaGluZG90ID0gMHhmYjJjOworIHQuc2hpbmRhZ2VzaHNoaW5kb3RoZWJyZXcgPSAweGZiMmM7CisgdC5zaGluZGFnZXNoc2luZG90ID0gMHhmYjJkOworIHQuc2hpbmRhZ2VzaHNpbmRvdGhlYnJldyA9IDB4ZmIyZDsKKyB0LnNoaW5kb3RoZWJyZXcgPSAweDA1YzE7CisgdC5zaGluaGVicmV3ID0gMHgwNWU5OworIHQuc2hpbnNoaW5kb3QgPSAweGZiMmE7CisgdC5zaGluc2hpbmRvdGhlYnJldyA9IDB4ZmIyYTsKKyB0LnNoaW5zaW5kb3QgPSAweGZiMmI7CisgdC5zaGluc2luZG90aGVicmV3ID0gMHhmYjJiOworIHQuc2hvb2sgPSAweDAyODI7CisgdC5zaWdtYSA9IDB4MDNjMzsKKyB0LnNpZ21hMSA9IDB4MDNjMjsKKyB0LnNpZ21hZmluYWwgPSAweDAzYzI7CisgdC5zaWdtYWx1bmF0ZXN5bWJvbGdyZWVrID0gMHgwM2YyOworIHQuc2loaXJhZ2FuYSA9IDB4MzA1NzsKKyB0LnNpa2F0YWthbmEgPSAweDMwYjc7CisgdC5zaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdjOworIHQuc2lsdXFoZWJyZXcgPSAweDA1YmQ7CisgdC5zaWx1cWxlZnRoZWJyZXcgPSAweDA1YmQ7CisgdC5zaW1pbGFyID0gMHgyMjNjOworIHQuc2luZG90aGVicmV3ID0gMHgwNWMyOworIHQuc2lvc2FjaXJjbGVrb3JlYW4gPSAweDMyNzQ7CisgdC5zaW9zYXBhcmVua29yZWFuID0gMHgzMjE0OworIHQuc2lvc2NpZXVja29yZWFuID0gMHgzMTdlOworIHQuc2lvc2NpcmNsZWtvcmVhbiA9IDB4MzI2NjsKKyB0LnNpb3NraXllb2trb3JlYW4gPSAweDMxN2E7CisgdC5zaW9za29yZWFuID0gMHgzMTQ1OworIHQuc2lvc25pZXVua29yZWFuID0gMHgzMTdiOworIHQuc2lvc3BhcmVua29yZWFuID0gMHgzMjA2OworIHQuc2lvc3BpZXVwa29yZWFuID0gMHgzMTdkOworIHQuc2lvc3Rpa2V1dGtvcmVhbiA9IDB4MzE3YzsKKyB0LnNpeCA9IDB4MDAzNjsKKyB0LnNpeGFyYWJpYyA9IDB4MDY2NjsKKyB0LnNpeGJlbmdhbGkgPSAweDA5ZWM7CisgdC5zaXhjaXJjbGUgPSAweDI0NjU7CisgdC5zaXhjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhmOworIHQuc2l4ZGV2YSA9IDB4MDk2YzsKKyB0LnNpeGd1amFyYXRpID0gMHgwYWVjOworIHQuc2l4Z3VybXVraGkgPSAweDBhNmM7CisgdC5zaXhoYWNrYXJhYmljID0gMHgwNjY2OworIHQuc2l4aGFuZ3pob3UgPSAweDMwMjY7CisgdC5zaXhpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI1OworIHQuc2l4aW5mZXJpb3IgPSAweDIwODY7CisgdC5zaXhtb25vc3BhY2UgPSAweGZmMTY7CisgdC5zaXhvbGRzdHlsZSA9IDB4ZjczNjsKKyB0LnNpeHBhcmVuID0gMHgyNDc5OworIHQuc2l4cGVyaW9kID0gMHgyNDhkOworIHQuc2l4cGVyc2lhbiA9IDB4MDZmNjsKKyB0LnNpeHJvbWFuID0gMHgyMTc1OworIHQuc2l4c3VwZXJpb3IgPSAweDIwNzY7CisgdC5zaXh0ZWVuY2lyY2xlID0gMHgyNDZmOworIHQuc2l4dGVlbmN1cnJlbmN5ZGVub21pbmF0b3JiZW5nYWxpID0gMHgwOWY5OworIHQuc2l4dGVlbnBhcmVuID0gMHgyNDgzOworIHQuc2l4dGVlbnBlcmlvZCA9IDB4MjQ5NzsKKyB0LnNpeHRoYWkgPSAweDBlNTY7CisgdC5zbGFzaCA9IDB4MDAyZjsKKyB0LnNsYXNobW9ub3NwYWNlID0gMHhmZjBmOworIHQuc2xvbmcgPSAweDAxN2Y7CisgdC5zbG9uZ2RvdGFjY2VudCA9IDB4MWU5YjsKKyB0LnNtaWxlZmFjZSA9IDB4MjYzYTsKKyB0LnNtb25vc3BhY2UgPSAweGZmNTM7CisgdC5zb2ZwYXN1cWhlYnJldyA9IDB4MDVjMzsKKyB0LnNvZnRoeXBoZW4gPSAweDAwYWQ7CisgdC5zb2Z0c2lnbmN5cmlsbGljID0gMHgwNDRjOworIHQuc29oaXJhZ2FuYSA9IDB4MzA1ZDsKKyB0LnNva2F0YWthbmEgPSAweDMwYmQ7CisgdC5zb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjdmOworIHQuc29saWR1c2xvbmdvdmVybGF5Y21iID0gMHgwMzM4OworIHQuc29saWR1c3Nob3J0b3ZlcmxheWNtYiA9IDB4MDMzNzsKKyB0LnNvcnVzaXRoYWkgPSAweDBlMjk7CisgdC5zb3NhbGF0aGFpID0gMHgwZTI4OworIHQuc29zb3RoYWkgPSAweDBlMGI7CisgdC5zb3N1YXRoYWkgPSAweDBlMmE7CisgdC5zcGFjZSA9IDB4MDAyMDsKKyB0LnNwYWNlaGFja2FyYWJpYyA9IDB4MDAyMDsKKyB0LnNwYWRlID0gMHgyNjYwOworIHQuc3BhZGVzdWl0YmxhY2sgPSAweDI2NjA7CisgdC5zcGFkZXN1aXR3aGl0ZSA9IDB4MjY2NDsKKyB0LnNwYXJlbiA9IDB4MjRhZTsKKyB0LnNxdWFyZWJlbG93Y21iID0gMHgwMzNiOworIHQuc3F1YXJlY2MgPSAweDMzYzQ7CisgdC5zcXVhcmVjbSA9IDB4MzM5ZDsKKyB0LnNxdWFyZWRpYWdvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTk7CisgdC5zcXVhcmVob3Jpem9udGFsZmlsbCA9IDB4MjVhNDsKKyB0LnNxdWFyZWtnID0gMHgzMzhmOworIHQuc3F1YXJla20gPSAweDMzOWU7CisgdC5zcXVhcmVrbWNhcGl0YWwgPSAweDMzY2U7CisgdC5zcXVhcmVsbiA9IDB4MzNkMTsKKyB0LnNxdWFyZWxvZyA9IDB4MzNkMjsKKyB0LnNxdWFyZW1nID0gMHgzMzhlOworIHQuc3F1YXJlbWlsID0gMHgzM2Q1OworIHQuc3F1YXJlbW0gPSAweDMzOWM7CisgdC5zcXVhcmVtc3F1YXJlZCA9IDB4MzNhMTsKKyB0LnNxdWFyZW9ydGhvZ29uYWxjcm9zc2hhdGNoZmlsbCA9IDB4MjVhNjsKKyB0LnNxdWFyZXVwcGVybGVmdHRvbG93ZXJyaWdodGZpbGwgPSAweDI1YTc7CisgdC5zcXVhcmV1cHBlcnJpZ2h0dG9sb3dlcmxlZnRmaWxsID0gMHgyNWE4OworIHQuc3F1YXJldmVydGljYWxmaWxsID0gMHgyNWE1OworIHQuc3F1YXJld2hpdGV3aXRoc21hbGxibGFjayA9IDB4MjVhMzsKKyB0LnNyc3F1YXJlID0gMHgzM2RiOworIHQuc3NhYmVuZ2FsaSA9IDB4MDliNzsKKyB0LnNzYWRldmEgPSAweDA5Mzc7CisgdC5zc2FndWphcmF0aSA9IDB4MGFiNzsKKyB0LnNzYW5nY2lldWNrb3JlYW4gPSAweDMxNDk7CisgdC5zc2FuZ2hpZXVoa29yZWFuID0gMHgzMTg1OworIHQuc3NhbmdpZXVuZ2tvcmVhbiA9IDB4MzE4MDsKKyB0LnNzYW5na2l5ZW9ra29yZWFuID0gMHgzMTMyOworIHQuc3NhbmduaWV1bmtvcmVhbiA9IDB4MzE2NTsKKyB0LnNzYW5ncGlldXBrb3JlYW4gPSAweDMxNDM7CisgdC5zc2FuZ3Npb3Nrb3JlYW4gPSAweDMxNDY7CisgdC5zc2FuZ3Rpa2V1dGtvcmVhbiA9IDB4MzEzODsKKyB0LnNzdXBlcmlvciA9IDB4ZjZmMjsKKyB0LnN0ZXJsaW5nID0gMHgwMGEzOworIHQuc3Rlcmxpbmdtb25vc3BhY2UgPSAweGZmZTE7CisgdC5zdHJva2Vsb25nb3ZlcmxheWNtYiA9IDB4MDMzNjsKKyB0LnN0cm9rZXNob3J0b3ZlcmxheWNtYiA9IDB4MDMzNTsKKyB0LnN1YnNldCA9IDB4MjI4MjsKKyB0LnN1YnNldG5vdGVxdWFsID0gMHgyMjhhOworIHQuc3Vic2V0b3JlcXVhbCA9IDB4MjI4NjsKKyB0LnN1Y2NlZWRzID0gMHgyMjdiOworIHQuc3VjaHRoYXQgPSAweDIyMGI7CisgdC5zdWhpcmFnYW5hID0gMHgzMDU5OworIHQuc3VrYXRha2FuYSA9IDB4MzBiOTsKKyB0LnN1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2Q7CisgdC5zdWt1bmFyYWJpYyA9IDB4MDY1MjsKKyB0LnN1bW1hdGlvbiA9IDB4MjIxMTsKKyB0LnN1biA9IDB4MjYzYzsKKyB0LnN1cGVyc2V0ID0gMHgyMjgzOworIHQuc3VwZXJzZXRub3RlcXVhbCA9IDB4MjI4YjsKKyB0LnN1cGVyc2V0b3JlcXVhbCA9IDB4MjI4NzsKKyB0LnN2c3F1YXJlID0gMHgzM2RjOworIHQuc3lvdXdhZXJhc3F1YXJlID0gMHgzMzdjOworIHQudCA9IDB4MDA3NDsKKyB0LnRhYmVuZ2FsaSA9IDB4MDlhNDsKKyB0LnRhY2tkb3duID0gMHgyMmE0OworIHQudGFja2xlZnQgPSAweDIyYTM7CisgdC50YWRldmEgPSAweDA5MjQ7CisgdC50YWd1amFyYXRpID0gMHgwYWE0OworIHQudGFndXJtdWtoaSA9IDB4MGEyNDsKKyB0LnRhaGFyYWJpYyA9IDB4MDYzNzsKKyB0LnRhaGZpbmFsYXJhYmljID0gMHhmZWMyOworIHQudGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjMzsKKyB0LnRhaGlyYWdhbmEgPSAweDMwNWY7CisgdC50YWhtZWRpYWxhcmFiaWMgPSAweGZlYzQ7CisgdC50YWlzeW91ZXJhc3F1YXJlID0gMHgzMzdkOworIHQudGFrYXRha2FuYSA9IDB4MzBiZjsKKyB0LnRha2F0YWthbmFoYWxmd2lkdGggPSAweGZmODA7CisgdC50YXR3ZWVsYXJhYmljID0gMHgwNjQwOworIHQudGF1ID0gMHgwM2M0OworIHQudGF2ID0gMHgwNWVhOworIHQudGF2ZGFnZXMgPSAweGZiNGE7CisgdC50YXZkYWdlc2ggPSAweGZiNGE7CisgdC50YXZkYWdlc2hoZWJyZXcgPSAweGZiNGE7CisgdC50YXZoZWJyZXcgPSAweDA1ZWE7CisgdC50YmFyID0gMHgwMTY3OworIHQudGJvcG9tb2ZvID0gMHgzMTBhOworIHQudGNhcm9uID0gMHgwMTY1OworIHQudGNjdXJsID0gMHgwMmE4OworIHQudGNlZGlsbGEgPSAweDAxNjM7CisgdC50Y2hlaGFyYWJpYyA9IDB4MDY4NjsKKyB0LnRjaGVoZmluYWxhcmFiaWMgPSAweGZiN2I7CisgdC50Y2hlaGluaXRpYWxhcmFiaWMgPSAweGZiN2M7CisgdC50Y2hlaG1lZGlhbGFyYWJpYyA9IDB4ZmI3ZDsKKyB0LnRjaXJjbGUgPSAweDI0ZTM7CisgdC50Y2lyY3VtZmxleGJlbG93ID0gMHgxZTcxOworIHQudGNvbW1hYWNjZW50ID0gMHgwMTYzOworIHQudGRpZXJlc2lzID0gMHgxZTk3OworIHQudGRvdGFjY2VudCA9IDB4MWU2YjsKKyB0LnRkb3RiZWxvdyA9IDB4MWU2ZDsKKyB0LnRlY3lyaWxsaWMgPSAweDA0NDI7CisgdC50ZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGFkOworIHQudGVoYXJhYmljID0gMHgwNjJhOworIHQudGVoZmluYWxhcmFiaWMgPSAweGZlOTY7CisgdC50ZWhoYWhpbml0aWFsYXJhYmljID0gMHhmY2EyOworIHQudGVoaGFoaXNvbGF0ZWRhcmFiaWMgPSAweGZjMGM7CisgdC50ZWhpbml0aWFsYXJhYmljID0gMHhmZTk3OworIHQudGVoaXJhZ2FuYSA9IDB4MzA2NjsKKyB0LnRlaGplZW1pbml0aWFsYXJhYmljID0gMHhmY2ExOworIHQudGVoamVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzBiOworIHQudGVobWFyYnV0YWFyYWJpYyA9IDB4MDYyOTsKKyB0LnRlaG1hcmJ1dGFmaW5hbGFyYWJpYyA9IDB4ZmU5NDsKKyB0LnRlaG1lZGlhbGFyYWJpYyA9IDB4ZmU5ODsKKyB0LnRlaG1lZW1pbml0aWFsYXJhYmljID0gMHhmY2E0OworIHQudGVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzBlOworIHQudGVobm9vbmZpbmFsYXJhYmljID0gMHhmYzczOworIHQudGVrYXRha2FuYSA9IDB4MzBjNjsKKyB0LnRla2F0YWthbmFoYWxmd2lkdGggPSAweGZmODM7CisgdC50ZWxlcGhvbmUgPSAweDIxMjE7CisgdC50ZWxlcGhvbmVibGFjayA9IDB4MjYwZTsKKyB0LnRlbGlzaGFnZWRvbGFoZWJyZXcgPSAweDA1YTA7CisgdC50ZWxpc2hhcWV0YW5haGVicmV3ID0gMHgwNWE5OworIHQudGVuY2lyY2xlID0gMHgyNDY5OworIHQudGVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyOTsKKyB0LnRlbnBhcmVuID0gMHgyNDdkOworIHQudGVucGVyaW9kID0gMHgyNDkxOworIHQudGVucm9tYW4gPSAweDIxNzk7CisgdC50ZXNoID0gMHgwMmE3OworIHQudGV0ID0gMHgwNWQ4OworIHQudGV0ZGFnZXNoID0gMHhmYjM4OworIHQudGV0ZGFnZXNoaGVicmV3ID0gMHhmYjM4OworIHQudGV0aGVicmV3ID0gMHgwNWQ4OworIHQudGV0c2VjeXJpbGxpYyA9IDB4MDRiNTsKKyB0LnRldmlyaGVicmV3ID0gMHgwNTliOworIHQudGV2aXJsZWZ0aGVicmV3ID0gMHgwNTliOworIHQudGhhYmVuZ2FsaSA9IDB4MDlhNTsKKyB0LnRoYWRldmEgPSAweDA5MjU7CisgdC50aGFndWphcmF0aSA9IDB4MGFhNTsKKyB0LnRoYWd1cm11a2hpID0gMHgwYTI1OworIHQudGhhbGFyYWJpYyA9IDB4MDYzMDsKKyB0LnRoYWxmaW5hbGFyYWJpYyA9IDB4ZmVhYzsKKyB0LnRoYW50aGFraGF0bG93bGVmdHRoYWkgPSAweGY4OTg7CisgdC50aGFudGhha2hhdGxvd3JpZ2h0dGhhaSA9IDB4Zjg5NzsKKyB0LnRoYW50aGFraGF0dGhhaSA9IDB4MGU0YzsKKyB0LnRoYW50aGFraGF0dXBwZXJsZWZ0dGhhaSA9IDB4Zjg5NjsKKyB0LnRoZWhhcmFiaWMgPSAweDA2MmI7CisgdC50aGVoZmluYWxhcmFiaWMgPSAweGZlOWE7CisgdC50aGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5YjsKKyB0LnRoZWhtZWRpYWxhcmFiaWMgPSAweGZlOWM7CisgdC50aGVyZWV4aXN0cyA9IDB4MjIwMzsKKyB0LnRoZXJlZm9yZSA9IDB4MjIzNDsKKyB0LnRoZXRhID0gMHgwM2I4OworIHQudGhldGExID0gMHgwM2QxOworIHQudGhldGFzeW1ib2xncmVlayA9IDB4MDNkMTsKKyB0LnRoaWV1dGhhY2lyY2xla29yZWFuID0gMHgzMjc5OworIHQudGhpZXV0aGFwYXJlbmtvcmVhbiA9IDB4MzIxOTsKKyB0LnRoaWV1dGhjaXJjbGVrb3JlYW4gPSAweDMyNmI7CisgdC50aGlldXRoa29yZWFuID0gMHgzMTRjOworIHQudGhpZXV0aHBhcmVua29yZWFuID0gMHgzMjBiOworIHQudGhpcnRlZW5jaXJjbGUgPSAweDI0NmM7CisgdC50aGlydGVlbnBhcmVuID0gMHgyNDgwOworIHQudGhpcnRlZW5wZXJpb2QgPSAweDI0OTQ7CisgdC50aG9uYW5nbW9udGhvdGhhaSA9IDB4MGUxMTsKKyB0LnRob29rID0gMHgwMWFkOworIHQudGhvcGh1dGhhb3RoYWkgPSAweDBlMTI7CisgdC50aG9ybiA9IDB4MDBmZTsKKyB0LnRob3RoYWhhbnRoYWkgPSAweDBlMTc7CisgdC50aG90aGFudGhhaSA9IDB4MGUxMDsKKyB0LnRob3Rob25ndGhhaSA9IDB4MGUxODsKKyB0LnRob3RodW5ndGhhaSA9IDB4MGUxNjsKKyB0LnRob3VzYW5kY3lyaWxsaWMgPSAweDA0ODI7CisgdC50aG91c2FuZHNzZXBhcmF0b3JhcmFiaWMgPSAweDA2NmM7CisgdC50aG91c2FuZHNzZXBhcmF0b3JwZXJzaWFuID0gMHgwNjZjOworIHQudGhyZWUgPSAweDAwMzM7CisgdC50aHJlZWFyYWJpYyA9IDB4MDY2MzsKKyB0LnRocmVlYmVuZ2FsaSA9IDB4MDllOTsKKyB0LnRocmVlY2lyY2xlID0gMHgyNDYyOworIHQudGhyZWVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhjOworIHQudGhyZWVkZXZhID0gMHgwOTY5OworIHQudGhyZWVlaWdodGhzID0gMHgyMTVjOworIHQudGhyZWVndWphcmF0aSA9IDB4MGFlOTsKKyB0LnRocmVlZ3VybXVraGkgPSAweDBhNjk7CisgdC50aHJlZWhhY2thcmFiaWMgPSAweDA2NjM7CisgdC50aHJlZWhhbmd6aG91ID0gMHgzMDIzOworIHQudGhyZWVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIyOworIHQudGhyZWVpbmZlcmlvciA9IDB4MjA4MzsKKyB0LnRocmVlbW9ub3NwYWNlID0gMHhmZjEzOworIHQudGhyZWVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY2OworIHQudGhyZWVvbGRzdHlsZSA9IDB4ZjczMzsKKyB0LnRocmVlcGFyZW4gPSAweDI0NzY7CisgdC50aHJlZXBlcmlvZCA9IDB4MjQ4YTsKKyB0LnRocmVlcGVyc2lhbiA9IDB4MDZmMzsKKyB0LnRocmVlcXVhcnRlcnMgPSAweDAwYmU7CisgdC50aHJlZXF1YXJ0ZXJzZW1kYXNoID0gMHhmNmRlOworIHQudGhyZWVyb21hbiA9IDB4MjE3MjsKKyB0LnRocmVlc3VwZXJpb3IgPSAweDAwYjM7CisgdC50aHJlZXRoYWkgPSAweDBlNTM7CisgdC50aHpzcXVhcmUgPSAweDMzOTQ7CisgdC50aWhpcmFnYW5hID0gMHgzMDYxOworIHQudGlrYXRha2FuYSA9IDB4MzBjMTsKKyB0LnRpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmODE7CisgdC50aWtldXRhY2lyY2xla29yZWFuID0gMHgzMjcwOworIHQudGlrZXV0YXBhcmVua29yZWFuID0gMHgzMjEwOworIHQudGlrZXV0Y2lyY2xla29yZWFuID0gMHgzMjYyOworIHQudGlrZXV0a29yZWFuID0gMHgzMTM3OworIHQudGlrZXV0cGFyZW5rb3JlYW4gPSAweDMyMDI7CisgdC50aWxkZSA9IDB4MDJkYzsKKyB0LnRpbGRlYmVsb3djbWIgPSAweDAzMzA7CisgdC50aWxkZWNtYiA9IDB4MDMwMzsKKyB0LnRpbGRlY29tYiA9IDB4MDMwMzsKKyB0LnRpbGRlZG91YmxlY21iID0gMHgwMzYwOworIHQudGlsZGVvcGVyYXRvciA9IDB4MjIzYzsKKyB0LnRpbGRlb3ZlcmxheWNtYiA9IDB4MDMzNDsKKyB0LnRpbGRldmVydGljYWxjbWIgPSAweDAzM2U7CisgdC50aW1lc2NpcmNsZSA9IDB4MjI5NzsKKyB0LnRpcGVoYWhlYnJldyA9IDB4MDU5NjsKKyB0LnRpcGVoYWxlZnRoZWJyZXcgPSAweDA1OTY7CisgdC50aXBwaWd1cm11a2hpID0gMHgwYTcwOworIHQudGl0bG9jeXJpbGxpY2NtYiA9IDB4MDQ4MzsKKyB0LnRpd25hcm1lbmlhbiA9IDB4MDU3ZjsKKyB0LnRsaW5lYmVsb3cgPSAweDFlNmY7CisgdC50bW9ub3NwYWNlID0gMHhmZjU0OworIHQudG9hcm1lbmlhbiA9IDB4MDU2OTsKKyB0LnRvaGlyYWdhbmEgPSAweDMwNjg7CisgdC50b2thdGFrYW5hID0gMHgzMGM4OworIHQudG9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NDsKKyB0LnRvbmViYXJleHRyYWhpZ2htb2QgPSAweDAyZTU7CisgdC50b25lYmFyZXh0cmFsb3dtb2QgPSAweDAyZTk7CisgdC50b25lYmFyaGlnaG1vZCA9IDB4MDJlNjsKKyB0LnRvbmViYXJsb3dtb2QgPSAweDAyZTg7CisgdC50b25lYmFybWlkbW9kID0gMHgwMmU3OworIHQudG9uZWZpdmUgPSAweDAxYmQ7CisgdC50b25lc2l4ID0gMHgwMTg1OworIHQudG9uZXR3byA9IDB4MDFhODsKKyB0LnRvbm9zID0gMHgwMzg0OworIHQudG9uc3F1YXJlID0gMHgzMzI3OworIHQudG9wYXRha3RoYWkgPSAweDBlMGY7CisgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQgPSAweDMwMTQ7CisgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnRzbWFsbCA9IDB4ZmU1ZDsKKyB0LnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTM5OworIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxNTsKKyB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHRzbWFsbCA9IDB4ZmU1ZTsKKyB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYTsKKyB0LnRvdGFvdGhhaSA9IDB4MGUxNTsKKyB0LnRwYWxhdGFsaG9vayA9IDB4MDFhYjsKKyB0LnRwYXJlbiA9IDB4MjRhZjsKKyB0LnRyYWRlbWFyayA9IDB4MjEyMjsKKyB0LnRyYWRlbWFya3NhbnMgPSAweGY4ZWE7CisgdC50cmFkZW1hcmtzZXJpZiA9IDB4ZjZkYjsKKyB0LnRyZXRyb2ZsZXhob29rID0gMHgwMjg4OworIHQudHJpYWdkbiA9IDB4MjViYzsKKyB0LnRyaWFnbGYgPSAweDI1YzQ7CisgdC50cmlhZ3J0ID0gMHgyNWJhOworIHQudHJpYWd1cCA9IDB4MjViMjsKKyB0LnRzID0gMHgwMmE2OworIHQudHNhZGkgPSAweDA1ZTY7CisgdC50c2FkaWRhZ2VzaCA9IDB4ZmI0NjsKKyB0LnRzYWRpZGFnZXNoaGVicmV3ID0gMHhmYjQ2OworIHQudHNhZGloZWJyZXcgPSAweDA1ZTY7CisgdC50c2VjeXJpbGxpYyA9IDB4MDQ0NjsKKyB0LnRzZXJlID0gMHgwNWI1OworIHQudHNlcmUxMiA9IDB4MDViNTsKKyB0LnRzZXJlMWUgPSAweDA1YjU7CisgdC50c2VyZTJiID0gMHgwNWI1OworIHQudHNlcmVoZWJyZXcgPSAweDA1YjU7CisgdC50c2VyZW5hcnJvd2hlYnJldyA9IDB4MDViNTsKKyB0LnRzZXJlcXVhcnRlcmhlYnJldyA9IDB4MDViNTsKKyB0LnRzZXJld2lkZWhlYnJldyA9IDB4MDViNTsKKyB0LnRzaGVjeXJpbGxpYyA9IDB4MDQ1YjsKKyB0LnRzdXBlcmlvciA9IDB4ZjZmMzsKKyB0LnR0YWJlbmdhbGkgPSAweDA5OWY7CisgdC50dGFkZXZhID0gMHgwOTFmOworIHQudHRhZ3VqYXJhdGkgPSAweDBhOWY7CisgdC50dGFndXJtdWtoaSA9IDB4MGExZjsKKyB0LnR0ZWhhcmFiaWMgPSAweDA2Nzk7CisgdC50dGVoZmluYWxhcmFiaWMgPSAweGZiNjc7CisgdC50dGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI2ODsKKyB0LnR0ZWhtZWRpYWxhcmFiaWMgPSAweGZiNjk7CisgdC50dGhhYmVuZ2FsaSA9IDB4MDlhMDsKKyB0LnR0aGFkZXZhID0gMHgwOTIwOworIHQudHRoYWd1amFyYXRpID0gMHgwYWEwOworIHQudHRoYWd1cm11a2hpID0gMHgwYTIwOworIHQudHR1cm5lZCA9IDB4MDI4NzsKKyB0LnR1aGlyYWdhbmEgPSAweDMwNjQ7CisgdC50dWthdGFrYW5hID0gMHgzMGM0OworIHQudHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MjsKKyB0LnR1c21hbGxoaXJhZ2FuYSA9IDB4MzA2MzsKKyB0LnR1c21hbGxrYXRha2FuYSA9IDB4MzBjMzsKKyB0LnR1c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ZjsKKyB0LnR3ZWx2ZWNpcmNsZSA9IDB4MjQ2YjsKKyB0LnR3ZWx2ZXBhcmVuID0gMHgyNDdmOworIHQudHdlbHZlcGVyaW9kID0gMHgyNDkzOworIHQudHdlbHZlcm9tYW4gPSAweDIxN2I7CisgdC50d2VudHljaXJjbGUgPSAweDI0NzM7CisgdC50d2VudHloYW5nemhvdSA9IDB4NTM0NDsKKyB0LnR3ZW50eXBhcmVuID0gMHgyNDg3OworIHQudHdlbnR5cGVyaW9kID0gMHgyNDliOworIHQudHdvID0gMHgwMDMyOworIHQudHdvYXJhYmljID0gMHgwNjYyOworIHQudHdvYmVuZ2FsaSA9IDB4MDllODsKKyB0LnR3b2NpcmNsZSA9IDB4MjQ2MTsKKyB0LnR3b2NpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGI7CisgdC50d29kZXZhID0gMHgwOTY4OworIHQudHdvZG90ZW5sZWFkZXIgPSAweDIwMjU7CisgdC50d29kb3RsZWFkZXIgPSAweDIwMjU7CisgdC50d29kb3RsZWFkZXJ2ZXJ0aWNhbCA9IDB4ZmUzMDsKKyB0LnR3b2d1amFyYXRpID0gMHgwYWU4OworIHQudHdvZ3VybXVraGkgPSAweDBhNjg7CisgdC50d29oYWNrYXJhYmljID0gMHgwNjYyOworIHQudHdvaGFuZ3pob3UgPSAweDMwMjI7CisgdC50d29pZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIxOworIHQudHdvaW5mZXJpb3IgPSAweDIwODI7CisgdC50d29tb25vc3BhY2UgPSAweGZmMTI7CisgdC50d29udW1lcmF0b3JiZW5nYWxpID0gMHgwOWY1OworIHQudHdvb2xkc3R5bGUgPSAweGY3MzI7CisgdC50d29wYXJlbiA9IDB4MjQ3NTsKKyB0LnR3b3BlcmlvZCA9IDB4MjQ4OTsKKyB0LnR3b3BlcnNpYW4gPSAweDA2ZjI7CisgdC50d29yb21hbiA9IDB4MjE3MTsKKyB0LnR3b3N0cm9rZSA9IDB4MDFiYjsKKyB0LnR3b3N1cGVyaW9yID0gMHgwMGIyOworIHQudHdvdGhhaSA9IDB4MGU1MjsKKyB0LnR3b3RoaXJkcyA9IDB4MjE1NDsKKyB0LnUgPSAweDAwNzU7CisgdC51YWN1dGUgPSAweDAwZmE7CisgdC51YmFyID0gMHgwMjg5OworIHQudWJlbmdhbGkgPSAweDA5ODk7CisgdC51Ym9wb21vZm8gPSAweDMxMjg7CisgdC51YnJldmUgPSAweDAxNmQ7CisgdC51Y2Fyb24gPSAweDAxZDQ7CisgdC51Y2lyY2xlID0gMHgyNGU0OworIHQudWNpcmN1bWZsZXggPSAweDAwZmI7CisgdC51Y2lyY3VtZmxleGJlbG93ID0gMHgxZTc3OworIHQudWN5cmlsbGljID0gMHgwNDQzOworIHQudWRhdHRhZGV2YSA9IDB4MDk1MTsKKyB0LnVkYmxhY3V0ZSA9IDB4MDE3MTsKKyB0LnVkYmxncmF2ZSA9IDB4MDIxNTsKKyB0LnVkZXZhID0gMHgwOTA5OworIHQudWRpZXJlc2lzID0gMHgwMGZjOworIHQudWRpZXJlc2lzYWN1dGUgPSAweDAxZDg7CisgdC51ZGllcmVzaXNiZWxvdyA9IDB4MWU3MzsKKyB0LnVkaWVyZXNpc2Nhcm9uID0gMHgwMWRhOworIHQudWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjE7CisgdC51ZGllcmVzaXNncmF2ZSA9IDB4MDFkYzsKKyB0LnVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNjsKKyB0LnVkb3RiZWxvdyA9IDB4MWVlNTsKKyB0LnVncmF2ZSA9IDB4MDBmOTsKKyB0LnVndWphcmF0aSA9IDB4MGE4OTsKKyB0LnVndXJtdWtoaSA9IDB4MGEwOTsKKyB0LnVoaXJhZ2FuYSA9IDB4MzA0NjsKKyB0LnVob29rYWJvdmUgPSAweDFlZTc7CisgdC51aG9ybiA9IDB4MDFiMDsKKyB0LnVob3JuYWN1dGUgPSAweDFlZTk7CisgdC51aG9ybmRvdGJlbG93ID0gMHgxZWYxOworIHQudWhvcm5ncmF2ZSA9IDB4MWVlYjsKKyB0LnVob3JuaG9va2Fib3ZlID0gMHgxZWVkOworIHQudWhvcm50aWxkZSA9IDB4MWVlZjsKKyB0LnVodW5nYXJ1bWxhdXQgPSAweDAxNzE7CisgdC51aHVuZ2FydW1sYXV0Y3lyaWxsaWMgPSAweDA0ZjM7CisgdC51aW52ZXJ0ZWRicmV2ZSA9IDB4MDIxNzsKKyB0LnVrYXRha2FuYSA9IDB4MzBhNjsKKyB0LnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3MzsKKyB0LnVrY3lyaWxsaWMgPSAweDA0Nzk7CisgdC51a29yZWFuID0gMHgzMTVjOworIHQudW1hY3JvbiA9IDB4MDE2YjsKKyB0LnVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZjsKKyB0LnVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YjsKKyB0LnVtYXRyYWd1cm11a2hpID0gMHgwYTQxOworIHQudW1vbm9zcGFjZSA9IDB4ZmY1NTsKKyB0LnVuZGVyc2NvcmUgPSAweDAwNWY7CisgdC51bmRlcnNjb3JlZGJsID0gMHgyMDE3OworIHQudW5kZXJzY29yZW1vbm9zcGFjZSA9IDB4ZmYzZjsKKyB0LnVuZGVyc2NvcmV2ZXJ0aWNhbCA9IDB4ZmUzMzsKKyB0LnVuZGVyc2NvcmV3YXZ5ID0gMHhmZTRmOworIHQudW5pb24gPSAweDIyMmE7CisgdC51bml2ZXJzYWwgPSAweDIyMDA7CisgdC51b2dvbmVrID0gMHgwMTczOworIHQudXBhcmVuID0gMHgyNGIwOworIHQudXBibG9jayA9IDB4MjU4MDsKKyB0LnVwcGVyZG90aGVicmV3ID0gMHgwNWM0OworIHQudXBzaWxvbiA9IDB4MDNjNTsKKyB0LnVwc2lsb25kaWVyZXNpcyA9IDB4MDNjYjsKKyB0LnVwc2lsb25kaWVyZXNpc3Rvbm9zID0gMHgwM2IwOworIHQudXBzaWxvbmxhdGluID0gMHgwMjhhOworIHQudXBzaWxvbnRvbm9zID0gMHgwM2NkOworIHQudXB0YWNrYmVsb3djbWIgPSAweDAzMWQ7CisgdC51cHRhY2ttb2QgPSAweDAyZDQ7CisgdC51cmFndXJtdWtoaSA9IDB4MGE3MzsKKyB0LnVyaW5nID0gMHgwMTZmOworIHQudXNob3J0Y3lyaWxsaWMgPSAweDA0NWU7CisgdC51c21hbGxoaXJhZ2FuYSA9IDB4MzA0NTsKKyB0LnVzbWFsbGthdGFrYW5hID0gMHgzMGE1OworIHQudXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjk7CisgdC51c3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZjsKKyB0LnVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIxOworIHQudXRpbGRlID0gMHgwMTY5OworIHQudXRpbGRlYWN1dGUgPSAweDFlNzk7CisgdC51dGlsZGViZWxvdyA9IDB4MWU3NTsKKyB0LnV1YmVuZ2FsaSA9IDB4MDk4YTsKKyB0LnV1ZGV2YSA9IDB4MDkwYTsKKyB0LnV1Z3VqYXJhdGkgPSAweDBhOGE7CisgdC51dWd1cm11a2hpID0gMHgwYTBhOworIHQudXVtYXRyYWd1cm11a2hpID0gMHgwYTQyOworIHQudXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMyOworIHQudXV2b3dlbHNpZ25kZXZhID0gMHgwOTQyOworIHQudXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMjsKKyB0LnV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMxOworIHQudXZvd2Vsc2lnbmRldmEgPSAweDA5NDE7CisgdC51dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzE7CisgdC52ID0gMHgwMDc2OworIHQudmFkZXZhID0gMHgwOTM1OworIHQudmFndWphcmF0aSA9IDB4MGFiNTsKKyB0LnZhZ3VybXVraGkgPSAweDBhMzU7CisgdC52YWthdGFrYW5hID0gMHgzMGY3OworIHQudmF2ID0gMHgwNWQ1OworIHQudmF2ZGFnZXNoID0gMHhmYjM1OworIHQudmF2ZGFnZXNoNjUgPSAweGZiMzU7CisgdC52YXZkYWdlc2hoZWJyZXcgPSAweGZiMzU7CisgdC52YXZoZWJyZXcgPSAweDA1ZDU7CisgdC52YXZob2xhbSA9IDB4ZmI0YjsKKyB0LnZhdmhvbGFtaGVicmV3ID0gMHhmYjRiOworIHQudmF2dmF2aGVicmV3ID0gMHgwNWYwOworIHQudmF2eW9kaGVicmV3ID0gMHgwNWYxOworIHQudmNpcmNsZSA9IDB4MjRlNTsKKyB0LnZkb3RiZWxvdyA9IDB4MWU3ZjsKKyB0LnZlY3lyaWxsaWMgPSAweDA0MzI7CisgdC52ZWhhcmFiaWMgPSAweDA2YTQ7CisgdC52ZWhmaW5hbGFyYWJpYyA9IDB4ZmI2YjsKKyB0LnZlaGluaXRpYWxhcmFiaWMgPSAweGZiNmM7CisgdC52ZWhtZWRpYWxhcmFiaWMgPSAweGZiNmQ7CisgdC52ZWthdGFrYW5hID0gMHgzMGY5OworIHQudmVudXMgPSAweDI2NDA7CisgdC52ZXJ0aWNhbGJhciA9IDB4MDA3YzsKKyB0LnZlcnRpY2FsbGluZWFib3ZlY21iID0gMHgwMzBkOworIHQudmVydGljYWxsaW5lYmVsb3djbWIgPSAweDAzMjk7CisgdC52ZXJ0aWNhbGxpbmVsb3dtb2QgPSAweDAyY2M7CisgdC52ZXJ0aWNhbGxpbmVtb2QgPSAweDAyYzg7CisgdC52ZXdhcm1lbmlhbiA9IDB4MDU3ZTsKKyB0LnZob29rID0gMHgwMjhiOworIHQudmlrYXRha2FuYSA9IDB4MzBmODsKKyB0LnZpcmFtYWJlbmdhbGkgPSAweDA5Y2Q7CisgdC52aXJhbWFkZXZhID0gMHgwOTRkOworIHQudmlyYW1hZ3VqYXJhdGkgPSAweDBhY2Q7CisgdC52aXNhcmdhYmVuZ2FsaSA9IDB4MDk4MzsKKyB0LnZpc2FyZ2FkZXZhID0gMHgwOTAzOworIHQudmlzYXJnYWd1amFyYXRpID0gMHgwYTgzOworIHQudm1vbm9zcGFjZSA9IDB4ZmY1NjsKKyB0LnZvYXJtZW5pYW4gPSAweDA1Nzg7CisgdC52b2ljZWRpdGVyYXRpb25oaXJhZ2FuYSA9IDB4MzA5ZTsKKyB0LnZvaWNlZGl0ZXJhdGlvbmthdGFrYW5hID0gMHgzMGZlOworIHQudm9pY2VkbWFya2thbmEgPSAweDMwOWI7CisgdC52b2ljZWRtYXJra2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ZTsKKyB0LnZva2F0YWthbmEgPSAweDMwZmE7CisgdC52cGFyZW4gPSAweDI0YjE7CisgdC52dGlsZGUgPSAweDFlN2Q7CisgdC52dHVybmVkID0gMHgwMjhjOworIHQudnVoaXJhZ2FuYSA9IDB4MzA5NDsKKyB0LnZ1a2F0YWthbmEgPSAweDMwZjQ7CisgdC53ID0gMHgwMDc3OworIHQud2FjdXRlID0gMHgxZTgzOworIHQud2Fla29yZWFuID0gMHgzMTU5OworIHQud2FoaXJhZ2FuYSA9IDB4MzA4ZjsKKyB0Lndha2F0YWthbmEgPSAweDMwZWY7CisgdC53YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjljOworIHQud2Frb3JlYW4gPSAweDMxNTg7CisgdC53YXNtYWxsaGlyYWdhbmEgPSAweDMwOGU7CisgdC53YXNtYWxsa2F0YWthbmEgPSAweDMwZWU7CisgdC53YXR0b3NxdWFyZSA9IDB4MzM1NzsKKyB0LndhdmVkYXNoID0gMHgzMDFjOworIHQud2F2eXVuZGVyc2NvcmV2ZXJ0aWNhbCA9IDB4ZmUzNDsKKyB0Lndhd2FyYWJpYyA9IDB4MDY0ODsKKyB0Lndhd2ZpbmFsYXJhYmljID0gMHhmZWVlOworIHQud2F3aGFtemFhYm92ZWFyYWJpYyA9IDB4MDYyNDsKKyB0Lndhd2hhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NjsKKyB0Lndic3F1YXJlID0gMHgzM2RkOworIHQud2NpcmNsZSA9IDB4MjRlNjsKKyB0LndjaXJjdW1mbGV4ID0gMHgwMTc1OworIHQud2RpZXJlc2lzID0gMHgxZTg1OworIHQud2RvdGFjY2VudCA9IDB4MWU4NzsKKyB0Lndkb3RiZWxvdyA9IDB4MWU4OTsKKyB0LndlaGlyYWdhbmEgPSAweDMwOTE7CisgdC53ZWllcnN0cmFzcyA9IDB4MjExODsKKyB0Lndla2F0YWthbmEgPSAweDMwZjE7CisgdC53ZWtvcmVhbiA9IDB4MzE1ZTsKKyB0Lndlb2tvcmVhbiA9IDB4MzE1ZDsKKyB0LndncmF2ZSA9IDB4MWU4MTsKKyB0LndoaXRlYnVsbGV0ID0gMHgyNWU2OworIHQud2hpdGVjaXJjbGUgPSAweDI1Y2I7CisgdC53aGl0ZWNpcmNsZWludmVyc2UgPSAweDI1ZDk7CisgdC53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0ID0gMHgzMDBlOworIHQud2hpdGVjb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTQzOworIHQud2hpdGVjb3JuZXJicmFja2V0cmlnaHQgPSAweDMwMGY7CisgdC53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQ0OworIHQud2hpdGVkaWFtb25kID0gMHgyNWM3OworIHQud2hpdGVkaWFtb25kY29udGFpbmluZ2JsYWNrc21hbGxkaWFtb25kID0gMHgyNWM4OworIHQud2hpdGVkb3ducG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWJmOworIHQud2hpdGVkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViZDsKKyB0LndoaXRlbGVmdHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjVjMzsKKyB0LndoaXRlbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzE7CisgdC53aGl0ZWxlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxNjsKKyB0LndoaXRlbGVudGljdWxhcmJyYWNrZXRyaWdodCA9IDB4MzAxNzsKKyB0LndoaXRlcmlnaHRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1Yjk7CisgdC53aGl0ZXJpZ2h0cG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViNzsKKyB0LndoaXRlc21hbGxzcXVhcmUgPSAweDI1YWI7CisgdC53aGl0ZXNtaWxpbmdmYWNlID0gMHgyNjNhOworIHQud2hpdGVzcXVhcmUgPSAweDI1YTE7CisgdC53aGl0ZXN0YXIgPSAweDI2MDY7CisgdC53aGl0ZXRlbGVwaG9uZSA9IDB4MjYwZjsKKyB0LndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0ID0gMHgzMDE4OworIHQud2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0ID0gMHgzMDE5OworIHQud2hpdGV1cHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViNTsKKyB0LndoaXRldXBwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWIzOworIHQud2loaXJhZ2FuYSA9IDB4MzA5MDsKKyB0Lndpa2F0YWthbmEgPSAweDMwZjA7CisgdC53aWtvcmVhbiA9IDB4MzE1ZjsKKyB0Lndtb25vc3BhY2UgPSAweGZmNTc7CisgdC53b2hpcmFnYW5hID0gMHgzMDkyOworIHQud29rYXRha2FuYSA9IDB4MzBmMjsKKyB0Lndva2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjY7CisgdC53b24gPSAweDIwYTk7CisgdC53b25tb25vc3BhY2UgPSAweGZmZTY7CisgdC53b3dhZW50aGFpID0gMHgwZTI3OworIHQud3BhcmVuID0gMHgyNGIyOworIHQud3JpbmcgPSAweDFlOTg7CisgdC53c3VwZXJpb3IgPSAweDAyYjc7CisgdC53dHVybmVkID0gMHgwMjhkOworIHQud3lubiA9IDB4MDFiZjsKKyB0LnggPSAweDAwNzg7CisgdC54YWJvdmVjbWIgPSAweDAzM2Q7CisgdC54Ym9wb21vZm8gPSAweDMxMTI7CisgdC54Y2lyY2xlID0gMHgyNGU3OworIHQueGRpZXJlc2lzID0gMHgxZThkOworIHQueGRvdGFjY2VudCA9IDB4MWU4YjsKKyB0LnhlaGFybWVuaWFuID0gMHgwNTZkOworIHQueGkgPSAweDAzYmU7CisgdC54bW9ub3NwYWNlID0gMHhmZjU4OworIHQueHBhcmVuID0gMHgyNGIzOworIHQueHN1cGVyaW9yID0gMHgwMmUzOworIHQueSA9IDB4MDA3OTsKKyB0LnlhYWRvc3F1YXJlID0gMHgzMzRlOworIHQueWFiZW5nYWxpID0gMHgwOWFmOworIHQueWFjdXRlID0gMHgwMGZkOworIHQueWFkZXZhID0gMHgwOTJmOworIHQueWFla29yZWFuID0gMHgzMTUyOworIHQueWFndWphcmF0aSA9IDB4MGFhZjsKKyB0LnlhZ3VybXVraGkgPSAweDBhMmY7CisgdC55YWhpcmFnYW5hID0gMHgzMDg0OworIHQueWFrYXRha2FuYSA9IDB4MzBlNDsKKyB0Lnlha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTQ7CisgdC55YWtvcmVhbiA9IDB4MzE1MTsKKyB0LnlhbWFra2FudGhhaSA9IDB4MGU0ZTsKKyB0Lnlhc21hbGxoaXJhZ2FuYSA9IDB4MzA4MzsKKyB0Lnlhc21hbGxrYXRha2FuYSA9IDB4MzBlMzsKKyB0Lnlhc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2YzsKKyB0LnlhdGN5cmlsbGljID0gMHgwNDYzOworIHQueWNpcmNsZSA9IDB4MjRlODsKKyB0LnljaXJjdW1mbGV4ID0gMHgwMTc3OworIHQueWRpZXJlc2lzID0gMHgwMGZmOworIHQueWRvdGFjY2VudCA9IDB4MWU4ZjsKKyB0Lnlkb3RiZWxvdyA9IDB4MWVmNTsKKyB0LnllaGFyYWJpYyA9IDB4MDY0YTsKKyB0LnllaGJhcnJlZWFyYWJpYyA9IDB4MDZkMjsKKyB0LnllaGJhcnJlZWZpbmFsYXJhYmljID0gMHhmYmFmOworIHQueWVoZmluYWxhcmFiaWMgPSAweGZlZjI7CisgdC55ZWhoYW16YWFib3ZlYXJhYmljID0gMHgwNjI2OworIHQueWVoaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZThhOworIHQueWVoaGFtemFhYm92ZWluaXRpYWxhcmFiaWMgPSAweGZlOGI7CisgdC55ZWhoYW16YWFib3ZlbWVkaWFsYXJhYmljID0gMHhmZThjOworIHQueWVoaW5pdGlhbGFyYWJpYyA9IDB4ZmVmMzsKKyB0LnllaG1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKKyB0LnllaG1lZW1pbml0aWFsYXJhYmljID0gMHhmY2RkOworIHQueWVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzU4OworIHQueWVobm9vbmZpbmFsYXJhYmljID0gMHhmYzk0OworIHQueWVodGhyZWVkb3RzYmVsb3dhcmFiaWMgPSAweDA2ZDE7CisgdC55ZWtvcmVhbiA9IDB4MzE1NjsKKyB0LnllbiA9IDB4MDBhNTsKKyB0Lnllbm1vbm9zcGFjZSA9IDB4ZmZlNTsKKyB0Lnllb2tvcmVhbiA9IDB4MzE1NTsKKyB0Lnllb3JpbmhpZXVoa29yZWFuID0gMHgzMTg2OworIHQueWVyYWhiZW55b21vaGVicmV3ID0gMHgwNWFhOworIHQueWVyYWhiZW55b21vbGVmdGhlYnJldyA9IDB4MDVhYTsKKyB0LnllcmljeXJpbGxpYyA9IDB4MDQ0YjsKKyB0LnllcnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY5OworIHQueWVzaWV1bmdrb3JlYW4gPSAweDMxODE7CisgdC55ZXNpZXVuZ3BhbnNpb3Nrb3JlYW4gPSAweDMxODM7CisgdC55ZXNpZXVuZ3Npb3Nrb3JlYW4gPSAweDMxODI7CisgdC55ZXRpdmhlYnJldyA9IDB4MDU5YTsKKyB0LnlncmF2ZSA9IDB4MWVmMzsKKyB0Lnlob29rID0gMHgwMWI0OworIHQueWhvb2thYm92ZSA9IDB4MWVmNzsKKyB0LnlpYXJtZW5pYW4gPSAweDA1NzU7CisgdC55aWN5cmlsbGljID0gMHgwNDU3OworIHQueWlrb3JlYW4gPSAweDMxNjI7CisgdC55aW55YW5nID0gMHgyNjJmOworIHQueWl3bmFybWVuaWFuID0gMHgwNTgyOworIHQueW1vbm9zcGFjZSA9IDB4ZmY1OTsKKyB0LnlvZCA9IDB4MDVkOTsKKyB0LnlvZGRhZ2VzaCA9IDB4ZmIzOTsKKyB0LnlvZGRhZ2VzaGhlYnJldyA9IDB4ZmIzOTsKKyB0LnlvZGhlYnJldyA9IDB4MDVkOTsKKyB0LnlvZHlvZGhlYnJldyA9IDB4MDVmMjsKKyB0LnlvZHlvZHBhdGFoaGVicmV3ID0gMHhmYjFmOworIHQueW9oaXJhZ2FuYSA9IDB4MzA4ODsKKyB0LnlvaWtvcmVhbiA9IDB4MzE4OTsKKyB0Lnlva2F0YWthbmEgPSAweDMwZTg7CisgdC55b2thdGFrYW5haGFsZndpZHRoID0gMHhmZjk2OworIHQueW9rb3JlYW4gPSAweDMxNWI7CisgdC55b3NtYWxsaGlyYWdhbmEgPSAweDMwODc7CisgdC55b3NtYWxsa2F0YWthbmEgPSAweDMwZTc7CisgdC55b3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmU7CisgdC55b3RncmVlayA9IDB4MDNmMzsKKyB0LnlveWFla29yZWFuID0gMHgzMTg4OworIHQueW95YWtvcmVhbiA9IDB4MzE4NzsKKyB0LnlveWFrdGhhaSA9IDB4MGUyMjsKKyB0LnlveWluZ3RoYWkgPSAweDBlMGQ7CisgdC55cGFyZW4gPSAweDI0YjQ7CisgdC55cG9nZWdyYW1tZW5pID0gMHgwMzdhOworIHQueXBvZ2VncmFtbWVuaWdyZWVrY21iID0gMHgwMzQ1OworIHQueXIgPSAweDAxYTY7CisgdC55cmluZyA9IDB4MWU5OTsKKyB0LnlzdXBlcmlvciA9IDB4MDJiODsKKyB0Lnl0aWxkZSA9IDB4MWVmOTsKKyB0Lnl0dXJuZWQgPSAweDAyOGU7CisgdC55dWhpcmFnYW5hID0gMHgzMDg2OworIHQueXVpa29yZWFuID0gMHgzMThjOworIHQueXVrYXRha2FuYSA9IDB4MzBlNjsKKyB0Lnl1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTU7CisgdC55dWtvcmVhbiA9IDB4MzE2MDsKKyB0Lnl1c2JpZ2N5cmlsbGljID0gMHgwNDZiOworIHQueXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ZDsKKyB0Lnl1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY3OworIHQueXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2OTsKKyB0Lnl1c21hbGxoaXJhZ2FuYSA9IDB4MzA4NTsKKyB0Lnl1c21hbGxrYXRha2FuYSA9IDB4MzBlNTsKKyB0Lnl1c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ZDsKKyB0Lnl1eWVrb3JlYW4gPSAweDMxOGI7CisgdC55dXllb2tvcmVhbiA9IDB4MzE4YTsKKyB0Lnl5YWJlbmdhbGkgPSAweDA5ZGY7CisgdC55eWFkZXZhID0gMHgwOTVmOworIHQueiA9IDB4MDA3YTsKKyB0LnphYXJtZW5pYW4gPSAweDA1NjY7CisgdC56YWN1dGUgPSAweDAxN2E7CisgdC56YWRldmEgPSAweDA5NWI7CisgdC56YWd1cm11a2hpID0gMHgwYTViOworIHQuemFoYXJhYmljID0gMHgwNjM4OworIHQuemFoZmluYWxhcmFiaWMgPSAweGZlYzY7CisgdC56YWhpbml0aWFsYXJhYmljID0gMHhmZWM3OworIHQuemFoaXJhZ2FuYSA9IDB4MzA1NjsKKyB0LnphaG1lZGlhbGFyYWJpYyA9IDB4ZmVjODsKKyB0LnphaW5hcmFiaWMgPSAweDA2MzI7CisgdC56YWluZmluYWxhcmFiaWMgPSAweGZlYjA7CisgdC56YWthdGFrYW5hID0gMHgzMGI2OworIHQuemFxZWZnYWRvbGhlYnJldyA9IDB4MDU5NTsKKyB0LnphcWVmcWF0YW5oZWJyZXcgPSAweDA1OTQ7CisgdC56YXJxYWhlYnJldyA9IDB4MDU5ODsKKyB0LnpheWluID0gMHgwNWQ2OworIHQuemF5aW5kYWdlc2ggPSAweGZiMzY7CisgdC56YXlpbmRhZ2VzaGhlYnJldyA9IDB4ZmIzNjsKKyB0LnpheWluaGVicmV3ID0gMHgwNWQ2OworIHQuemJvcG9tb2ZvID0gMHgzMTE3OworIHQuemNhcm9uID0gMHgwMTdlOworIHQuemNpcmNsZSA9IDB4MjRlOTsKKyB0LnpjaXJjdW1mbGV4ID0gMHgxZTkxOworIHQuemN1cmwgPSAweDAyOTE7CisgdC56ZG90ID0gMHgwMTdjOworIHQuemRvdGFjY2VudCA9IDB4MDE3YzsKKyB0Lnpkb3RiZWxvdyA9IDB4MWU5MzsKKyB0LnplY3lyaWxsaWMgPSAweDA0Mzc7CisgdC56ZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk5OworIHQuemVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRmOworIHQuemVoaXJhZ2FuYSA9IDB4MzA1YzsKKyB0Lnpla2F0YWthbmEgPSAweDMwYmM7CisgdC56ZXJvID0gMHgwMDMwOworIHQuemVyb2FyYWJpYyA9IDB4MDY2MDsKKyB0Lnplcm9iZW5nYWxpID0gMHgwOWU2OworIHQuemVyb2RldmEgPSAweDA5NjY7CisgdC56ZXJvZ3VqYXJhdGkgPSAweDBhZTY7CisgdC56ZXJvZ3VybXVraGkgPSAweDBhNjY7CisgdC56ZXJvaGFja2FyYWJpYyA9IDB4MDY2MDsKKyB0Lnplcm9pbmZlcmlvciA9IDB4MjA4MDsKKyB0Lnplcm9tb25vc3BhY2UgPSAweGZmMTA7CisgdC56ZXJvb2xkc3R5bGUgPSAweGY3MzA7CisgdC56ZXJvcGVyc2lhbiA9IDB4MDZmMDsKKyB0Lnplcm9zdXBlcmlvciA9IDB4MjA3MDsKKyB0Lnplcm90aGFpID0gMHgwZTUwOworIHQuemVyb3dpZHRoam9pbmVyID0gMHhmZWZmOworIHQuemVyb3dpZHRobm9uam9pbmVyID0gMHgyMDBjOworIHQuemVyb3dpZHRoc3BhY2UgPSAweDIwMGI7CisgdC56ZXRhID0gMHgwM2I2OworIHQuemhib3BvbW9mbyA9IDB4MzExMzsKKyB0LnpoZWFybWVuaWFuID0gMHgwNTZhOworIHQuemhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMjsKKyB0LnpoZWN5cmlsbGljID0gMHgwNDM2OworIHQuemhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTc7CisgdC56aGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRkOworIHQuemloaXJhZ2FuYSA9IDB4MzA1ODsKKyB0Lnppa2F0YWthbmEgPSAweDMwYjg7CisgdC56aW5vcmhlYnJldyA9IDB4MDVhZTsKKyB0LnpsaW5lYmVsb3cgPSAweDFlOTU7CisgdC56bW9ub3NwYWNlID0gMHhmZjVhOworIHQuem9oaXJhZ2FuYSA9IDB4MzA1ZTsKKyB0Lnpva2F0YWthbmEgPSAweDMwYmU7CisgdC56cGFyZW4gPSAweDI0YjU7CisgdC56cmV0cm9mbGV4aG9vayA9IDB4MDI5MDsKKyB0LnpzdHJva2UgPSAweDAxYjY7CisgdC56dWhpcmFnYW5hID0gMHgzMDVhOworIHQuenVrYXRha2FuYSA9IDB4MzBiYTsKKyB0WyIubm90ZGVmIl0gPSAweDAwMDA7CisgdC5hbmdicmFja2V0bGVmdGJpZyA9IDB4MjMyOTsKKyB0LmFuZ2JyYWNrZXRsZWZ0QmlnID0gMHgyMzI5OworIHQuYW5nYnJhY2tldGxlZnRiaWdnID0gMHgyMzI5OworIHQuYW5nYnJhY2tldGxlZnRCaWdnID0gMHgyMzI5OworIHQuYW5nYnJhY2tldHJpZ2h0QmlnID0gMHgyMzJhOworIHQuYW5nYnJhY2tldHJpZ2h0YmlnID0gMHgyMzJhOworIHQuYW5nYnJhY2tldHJpZ2h0QmlnZyA9IDB4MjMyYTsKKyB0LmFuZ2JyYWNrZXRyaWdodGJpZ2cgPSAweDIzMmE7CisgdC5hcnJvd2hvb2tsZWZ0ID0gMHgyMWFhOworIHQuYXJyb3dob29rcmlnaHQgPSAweDIxYTk7CisgdC5hcnJvd2xlZnR0b3BoYWxmID0gMHgyMWJjOworIHQuYXJyb3dsZWZ0Ym90aGFsZiA9IDB4MjFiZDsKKyB0LmFycm93bm9ydGhlYXN0ID0gMHgyMTk3OworIHQuYXJyb3dub3J0aHdlc3QgPSAweDIxOTY7CisgdC5hcnJvd3JpZ2h0dG9waGFsZiA9IDB4MjFjMDsKKyB0LmFycm93cmlnaHRib3RoYWxmID0gMHgyMWMxOworIHQuYXJyb3dzb3V0aGVhc3QgPSAweDIxOTg7CisgdC5hcnJvd3NvdXRod2VzdCA9IDB4MjE5OTsKKyB0LmJhY2tzbGFzaGJpZyA9IDB4MjIxNjsKKyB0LmJhY2tzbGFzaEJpZyA9IDB4MjIxNjsKKyB0LmJhY2tzbGFzaEJpZ2cgPSAweDIyMTY7CisgdC5iYWNrc2xhc2hiaWdnID0gMHgyMjE2OworIHQuYmFyZGJsID0gMHgyMDE2OworIHQuYnJhY2VodGlwZG93bmxlZnQgPSAweGZlMzc7CisgdC5icmFjZWh0aXBkb3ducmlnaHQgPSAweGZlMzc7CisgdC5icmFjZWh0aXB1cGxlZnQgPSAweGZlMzg7CisgdC5icmFjZWh0aXB1cHJpZ2h0ID0gMHhmZTM4OworIHQuYnJhY2VsZWZ0QmlnID0gMHgwMDdiOworIHQuYnJhY2VsZWZ0YmlnID0gMHgwMDdiOworIHQuYnJhY2VsZWZ0YmlnZyA9IDB4MDA3YjsKKyB0LmJyYWNlbGVmdEJpZ2cgPSAweDAwN2I7CisgdC5icmFjZXJpZ2h0QmlnID0gMHgwMDdkOworIHQuYnJhY2VyaWdodGJpZyA9IDB4MDA3ZDsKKyB0LmJyYWNlcmlnaHRiaWdnID0gMHgwMDdkOworIHQuYnJhY2VyaWdodEJpZ2cgPSAweDAwN2Q7CisgdC5icmFja2V0bGVmdGJpZyA9IDB4MDA1YjsKKyB0LmJyYWNrZXRsZWZ0QmlnID0gMHgwMDViOworIHQuYnJhY2tldGxlZnRiaWdnID0gMHgwMDViOworIHQuYnJhY2tldGxlZnRCaWdnID0gMHgwMDViOworIHQuYnJhY2tldHJpZ2h0QmlnID0gMHgwMDVkOworIHQuYnJhY2tldHJpZ2h0YmlnID0gMHgwMDVkOworIHQuYnJhY2tldHJpZ2h0YmlnZyA9IDB4MDA1ZDsKKyB0LmJyYWNrZXRyaWdodEJpZ2cgPSAweDAwNWQ7CisgdC5jZWlsaW5nbGVmdGJpZyA9IDB4MjMwODsKKyB0LmNlaWxpbmdsZWZ0QmlnID0gMHgyMzA4OworIHQuY2VpbGluZ2xlZnRCaWdnID0gMHgyMzA4OworIHQuY2VpbGluZ2xlZnRiaWdnID0gMHgyMzA4OworIHQuY2VpbGluZ3JpZ2h0YmlnID0gMHgyMzA5OworIHQuY2VpbGluZ3JpZ2h0QmlnID0gMHgyMzA5OworIHQuY2VpbGluZ3JpZ2h0YmlnZyA9IDB4MjMwOTsKKyB0LmNlaWxpbmdyaWdodEJpZ2cgPSAweDIzMDk7CisgdC5jaXJjbGVkb3RkaXNwbGF5ID0gMHgyMjk5OworIHQuY2lyY2xlZG90dGV4dCA9IDB4MjI5OTsKKyB0LmNpcmNsZW11bHRpcGx5ZGlzcGxheSA9IDB4MjI5NzsKKyB0LmNpcmNsZW11bHRpcGx5dGV4dCA9IDB4MjI5NzsKKyB0LmNpcmNsZXBsdXNkaXNwbGF5ID0gMHgyMjk1OworIHQuY2lyY2xlcGx1c3RleHQgPSAweDIyOTU7CisgdC5jb250aW50ZWdyYWxkaXNwbGF5ID0gMHgyMjJlOworIHQuY29udGludGVncmFsdGV4dCA9IDB4MjIyZTsKKyB0LmNvcHJvZHVjdGRpc3BsYXkgPSAweDIyMTA7CisgdC5jb3Byb2R1Y3R0ZXh0ID0gMHgyMjEwOworIHQuZmxvb3JsZWZ0QmlnID0gMHgyMzBhOworIHQuZmxvb3JsZWZ0YmlnID0gMHgyMzBhOworIHQuZmxvb3JsZWZ0YmlnZyA9IDB4MjMwYTsKKyB0LmZsb29ybGVmdEJpZ2cgPSAweDIzMGE7CisgdC5mbG9vcnJpZ2h0YmlnID0gMHgyMzBiOworIHQuZmxvb3JyaWdodEJpZyA9IDB4MjMwYjsKKyB0LmZsb29ycmlnaHRCaWdnID0gMHgyMzBiOworIHQuZmxvb3JyaWdodGJpZ2cgPSAweDIzMGI7CisgdC5oYXR3aWRlID0gMHgwMzAyOworIHQuaGF0d2lkZXIgPSAweDAzMDI7CisgdC5oYXR3aWRlc3QgPSAweDAzMDI7CisgdC5pbnRlcmNhbCA9IDB4MWQ0MDsKKyB0LmludGVncmFsZGlzcGxheSA9IDB4MjIyYjsKKyB0LmludGVncmFsdGV4dCA9IDB4MjIyYjsKKyB0LmludGVyc2VjdGlvbmRpc3BsYXkgPSAweDIyYzI7CisgdC5pbnRlcnNlY3Rpb250ZXh0ID0gMHgyMmMyOworIHQubG9naWNhbGFuZGRpc3BsYXkgPSAweDIyMjc7CisgdC5sb2dpY2FsYW5kdGV4dCA9IDB4MjIyNzsKKyB0LmxvZ2ljYWxvcmRpc3BsYXkgPSAweDIyMjg7CisgdC5sb2dpY2Fsb3J0ZXh0ID0gMHgyMjI4OworIHQucGFyZW5sZWZ0QmlnID0gMHgwMDI4OworIHQucGFyZW5sZWZ0YmlnID0gMHgwMDI4OworIHQucGFyZW5sZWZ0QmlnZyA9IDB4MDAyODsKKyB0LnBhcmVubGVmdGJpZ2cgPSAweDAwMjg7CisgdC5wYXJlbnJpZ2h0QmlnID0gMHgwMDI5OworIHQucGFyZW5yaWdodGJpZyA9IDB4MDAyOTsKKyB0LnBhcmVucmlnaHRCaWdnID0gMHgwMDI5OworIHQucGFyZW5yaWdodGJpZ2cgPSAweDAwMjk7CisgdC5wcmltZSA9IDB4MjAzMjsKKyB0LnByb2R1Y3RkaXNwbGF5ID0gMHgyMjBmOworIHQucHJvZHVjdHRleHQgPSAweDIyMGY7CisgdC5yYWRpY2FsYmlnID0gMHgyMjFhOworIHQucmFkaWNhbEJpZyA9IDB4MjIxYTsKKyB0LnJhZGljYWxCaWdnID0gMHgyMjFhOworIHQucmFkaWNhbGJpZ2cgPSAweDIyMWE7CisgdC5yYWRpY2FsYnQgPSAweDIyMWE7CisgdC5yYWRpY2FsdHAgPSAweDIyMWE7CisgdC5yYWRpY2FsdmVydGV4ID0gMHgyMjFhOworIHQuc2xhc2hiaWcgPSAweDAwMmY7CisgdC5zbGFzaEJpZyA9IDB4MDAyZjsKKyB0LnNsYXNoQmlnZyA9IDB4MDAyZjsKKyB0LnNsYXNoYmlnZyA9IDB4MDAyZjsKKyB0LnN1bW1hdGlvbmRpc3BsYXkgPSAweDIyMTE7CisgdC5zdW1tYXRpb250ZXh0ID0gMHgyMjExOworIHQudGlsZGV3aWRlID0gMHgwMmRjOworIHQudGlsZGV3aWRlciA9IDB4MDJkYzsKKyB0LnRpbGRld2lkZXN0ID0gMHgwMmRjOworIHQudW5pb25kaXNwbGF5ID0gMHgyMmMzOworIHQudW5pb25tdWx0aWRpc3BsYXkgPSAweDIyOGU7CisgdC51bmlvbm11bHRpdGV4dCA9IDB4MjI4ZTsKKyB0LnVuaW9uc3FkaXNwbGF5ID0gMHgyMjk0OworIHQudW5pb25zcXRleHQgPSAweDIyOTQ7CisgdC51bmlvbnRleHQgPSAweDIyYzM7CisgdC52ZXh0ZW5kZG91YmxlID0gMHgyMjI1OworIHQudmV4dGVuZHNpbmdsZSA9IDB4MjIyMzsKK30pOwordmFyIGdldERpbmdiYXRzR2x5cGhzVW5pY29kZSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgeworIHQuc3BhY2UgPSAweDAwMjA7CisgdC5hMSA9IDB4MjcwMTsKKyB0LmEyID0gMHgyNzAyOworIHQuYTIwMiA9IDB4MjcwMzsKKyB0LmEzID0gMHgyNzA0OworIHQuYTQgPSAweDI2MGU7CisgdC5hNSA9IDB4MjcwNjsKKyB0LmExMTkgPSAweDI3MDc7CisgdC5hMTE4ID0gMHgyNzA4OworIHQuYTExNyA9IDB4MjcwOTsKKyB0LmExMSA9IDB4MjYxYjsKKyB0LmExMiA9IDB4MjYxZTsKKyB0LmExMyA9IDB4MjcwYzsKKyB0LmExNCA9IDB4MjcwZDsKKyB0LmExNSA9IDB4MjcwZTsKKyB0LmExNiA9IDB4MjcwZjsKKyB0LmExMDUgPSAweDI3MTA7CisgdC5hMTcgPSAweDI3MTE7CisgdC5hMTggPSAweDI3MTI7CisgdC5hMTkgPSAweDI3MTM7CisgdC5hMjAgPSAweDI3MTQ7CisgdC5hMjEgPSAweDI3MTU7CisgdC5hMjIgPSAweDI3MTY7CisgdC5hMjMgPSAweDI3MTc7CisgdC5hMjQgPSAweDI3MTg7CisgdC5hMjUgPSAweDI3MTk7CisgdC5hMjYgPSAweDI3MWE7CisgdC5hMjcgPSAweDI3MWI7CisgdC5hMjggPSAweDI3MWM7CisgdC5hNiA9IDB4MjcxZDsKKyB0LmE3ID0gMHgyNzFlOworIHQuYTggPSAweDI3MWY7CisgdC5hOSA9IDB4MjcyMDsKKyB0LmExMCA9IDB4MjcyMTsKKyB0LmEyOSA9IDB4MjcyMjsKKyB0LmEzMCA9IDB4MjcyMzsKKyB0LmEzMSA9IDB4MjcyNDsKKyB0LmEzMiA9IDB4MjcyNTsKKyB0LmEzMyA9IDB4MjcyNjsKKyB0LmEzNCA9IDB4MjcyNzsKKyB0LmEzNSA9IDB4MjYwNTsKKyB0LmEzNiA9IDB4MjcyOTsKKyB0LmEzNyA9IDB4MjcyYTsKKyB0LmEzOCA9IDB4MjcyYjsKKyB0LmEzOSA9IDB4MjcyYzsKKyB0LmE0MCA9IDB4MjcyZDsKKyB0LmE0MSA9IDB4MjcyZTsKKyB0LmE0MiA9IDB4MjcyZjsKKyB0LmE0MyA9IDB4MjczMDsKKyB0LmE0NCA9IDB4MjczMTsKKyB0LmE0NSA9IDB4MjczMjsKKyB0LmE0NiA9IDB4MjczMzsKKyB0LmE0NyA9IDB4MjczNDsKKyB0LmE0OCA9IDB4MjczNTsKKyB0LmE0OSA9IDB4MjczNjsKKyB0LmE1MCA9IDB4MjczNzsKKyB0LmE1MSA9IDB4MjczODsKKyB0LmE1MiA9IDB4MjczOTsKKyB0LmE1MyA9IDB4MjczYTsKKyB0LmE1NCA9IDB4MjczYjsKKyB0LmE1NSA9IDB4MjczYzsKKyB0LmE1NiA9IDB4MjczZDsKKyB0LmE1NyA9IDB4MjczZTsKKyB0LmE1OCA9IDB4MjczZjsKKyB0LmE1OSA9IDB4Mjc0MDsKKyB0LmE2MCA9IDB4Mjc0MTsKKyB0LmE2MSA9IDB4Mjc0MjsKKyB0LmE2MiA9IDB4Mjc0MzsKKyB0LmE2MyA9IDB4Mjc0NDsKKyB0LmE2NCA9IDB4Mjc0NTsKKyB0LmE2NSA9IDB4Mjc0NjsKKyB0LmE2NiA9IDB4Mjc0NzsKKyB0LmE2NyA9IDB4Mjc0ODsKKyB0LmE2OCA9IDB4Mjc0OTsKKyB0LmE2OSA9IDB4Mjc0YTsKKyB0LmE3MCA9IDB4Mjc0YjsKKyB0LmE3MSA9IDB4MjVjZjsKKyB0LmE3MiA9IDB4Mjc0ZDsKKyB0LmE3MyA9IDB4MjVhMDsKKyB0LmE3NCA9IDB4Mjc0ZjsKKyB0LmEyMDMgPSAweDI3NTA7CisgdC5hNzUgPSAweDI3NTE7CisgdC5hMjA0ID0gMHgyNzUyOworIHQuYTc2ID0gMHgyNWIyOworIHQuYTc3ID0gMHgyNWJjOworIHQuYTc4ID0gMHgyNWM2OworIHQuYTc5ID0gMHgyNzU2OworIHQuYTgxID0gMHgyNWQ3OworIHQuYTgyID0gMHgyNzU4OworIHQuYTgzID0gMHgyNzU5OworIHQuYTg0ID0gMHgyNzVhOworIHQuYTk3ID0gMHgyNzViOworIHQuYTk4ID0gMHgyNzVjOworIHQuYTk5ID0gMHgyNzVkOworIHQuYTEwMCA9IDB4Mjc1ZTsKKyB0LmExMDEgPSAweDI3NjE7CisgdC5hMTAyID0gMHgyNzYyOworIHQuYTEwMyA9IDB4Mjc2MzsKKyB0LmExMDQgPSAweDI3NjQ7CisgdC5hMTA2ID0gMHgyNzY1OworIHQuYTEwNyA9IDB4Mjc2NjsKKyB0LmExMDggPSAweDI3Njc7CisgdC5hMTEyID0gMHgyNjYzOworIHQuYTExMSA9IDB4MjY2NjsKKyB0LmExMTAgPSAweDI2NjU7CisgdC5hMTA5ID0gMHgyNjYwOworIHQuYTEyMCA9IDB4MjQ2MDsKKyB0LmExMjEgPSAweDI0NjE7CisgdC5hMTIyID0gMHgyNDYyOworIHQuYTEyMyA9IDB4MjQ2MzsKKyB0LmExMjQgPSAweDI0NjQ7CisgdC5hMTI1ID0gMHgyNDY1OworIHQuYTEyNiA9IDB4MjQ2NjsKKyB0LmExMjcgPSAweDI0Njc7CisgdC5hMTI4ID0gMHgyNDY4OworIHQuYTEyOSA9IDB4MjQ2OTsKKyB0LmExMzAgPSAweDI3NzY7CisgdC5hMTMxID0gMHgyNzc3OworIHQuYTEzMiA9IDB4Mjc3ODsKKyB0LmExMzMgPSAweDI3Nzk7CisgdC5hMTM0ID0gMHgyNzdhOworIHQuYTEzNSA9IDB4Mjc3YjsKKyB0LmExMzYgPSAweDI3N2M7CisgdC5hMTM3ID0gMHgyNzdkOworIHQuYTEzOCA9IDB4Mjc3ZTsKKyB0LmExMzkgPSAweDI3N2Y7CisgdC5hMTQwID0gMHgyNzgwOworIHQuYTE0MSA9IDB4Mjc4MTsKKyB0LmExNDIgPSAweDI3ODI7CisgdC5hMTQzID0gMHgyNzgzOworIHQuYTE0NCA9IDB4Mjc4NDsKKyB0LmExNDUgPSAweDI3ODU7CisgdC5hMTQ2ID0gMHgyNzg2OworIHQuYTE0NyA9IDB4Mjc4NzsKKyB0LmExNDggPSAweDI3ODg7CisgdC5hMTQ5ID0gMHgyNzg5OworIHQuYTE1MCA9IDB4Mjc4YTsKKyB0LmExNTEgPSAweDI3OGI7CisgdC5hMTUyID0gMHgyNzhjOworIHQuYTE1MyA9IDB4Mjc4ZDsKKyB0LmExNTQgPSAweDI3OGU7CisgdC5hMTU1ID0gMHgyNzhmOworIHQuYTE1NiA9IDB4Mjc5MDsKKyB0LmExNTcgPSAweDI3OTE7CisgdC5hMTU4ID0gMHgyNzkyOworIHQuYTE1OSA9IDB4Mjc5MzsKKyB0LmExNjAgPSAweDI3OTQ7CisgdC5hMTYxID0gMHgyMTkyOworIHQuYTE2MyA9IDB4MjE5NDsKKyB0LmExNjQgPSAweDIxOTU7CisgdC5hMTk2ID0gMHgyNzk4OworIHQuYTE2NSA9IDB4Mjc5OTsKKyB0LmExOTIgPSAweDI3OWE7CisgdC5hMTY2ID0gMHgyNzliOworIHQuYTE2NyA9IDB4Mjc5YzsKKyB0LmExNjggPSAweDI3OWQ7CisgdC5hMTY5ID0gMHgyNzllOworIHQuYTE3MCA9IDB4Mjc5ZjsKKyB0LmExNzEgPSAweDI3YTA7CisgdC5hMTcyID0gMHgyN2ExOworIHQuYTE3MyA9IDB4MjdhMjsKKyB0LmExNjIgPSAweDI3YTM7CisgdC5hMTc0ID0gMHgyN2E0OworIHQuYTE3NSA9IDB4MjdhNTsKKyB0LmExNzYgPSAweDI3YTY7CisgdC5hMTc3ID0gMHgyN2E3OworIHQuYTE3OCA9IDB4MjdhODsKKyB0LmExNzkgPSAweDI3YTk7CisgdC5hMTkzID0gMHgyN2FhOworIHQuYTE4MCA9IDB4MjdhYjsKKyB0LmExOTkgPSAweDI3YWM7CisgdC5hMTgxID0gMHgyN2FkOworIHQuYTIwMCA9IDB4MjdhZTsKKyB0LmExODIgPSAweDI3YWY7CisgdC5hMjAxID0gMHgyN2IxOworIHQuYTE4MyA9IDB4MjdiMjsKKyB0LmExODQgPSAweDI3YjM7CisgdC5hMTk3ID0gMHgyN2I0OworIHQuYTE4NSA9IDB4MjdiNTsKKyB0LmExOTQgPSAweDI3YjY7CisgdC5hMTk4ID0gMHgyN2I3OworIHQuYTE4NiA9IDB4MjdiODsKKyB0LmExOTUgPSAweDI3Yjk7CisgdC5hMTg3ID0gMHgyN2JhOworIHQuYTE4OCA9IDB4MjdiYjsKKyB0LmExODkgPSAweDI3YmM7CisgdC5hMTkwID0gMHgyN2JkOworIHQuYTE5MSA9IDB4MjdiZTsKKyB0LmE4OSA9IDB4Mjc2ODsKKyB0LmE5MCA9IDB4Mjc2OTsKKyB0LmE5MyA9IDB4Mjc2YTsKKyB0LmE5NCA9IDB4Mjc2YjsKKyB0LmE5MSA9IDB4Mjc2YzsKKyB0LmE5MiA9IDB4Mjc2ZDsKKyB0LmEyMDUgPSAweDI3NmU7CisgdC5hODUgPSAweDI3NmY7CisgdC5hMjA2ID0gMHgyNzcwOworIHQuYTg2ID0gMHgyNzcxOworIHQuYTg3ID0gMHgyNzcyOworIHQuYTg4ID0gMHgyNzczOworIHQuYTk1ID0gMHgyNzc0OworIHQuYTk2ID0gMHgyNzc1OworIHRbIi5ub3RkZWYiXSA9IDB4MDAwMDsKK30pOworZXhwb3J0cy5nZXRHbHlwaHNVbmljb2RlID0gZ2V0R2x5cGhzVW5pY29kZTsKK2V4cG9ydHMuZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlID0gZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlOworCisvKioqLyB9KSwKKy8qIDIzMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSA9IGV4cG9ydHMuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrID0gZXhwb3J0cy5nZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSBleHBvcnRzLmdldFN5bWJvbHNGb250cyA9IGV4cG9ydHMuZ2V0U2VyaWZGb250cyA9IGV4cG9ydHMuZ2V0Tm9uU3RkRm9udE1hcCA9IGV4cG9ydHMuZ2V0U3RkRm9udE1hcCA9IHZvaWQgMDsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDUpOworCit2YXIgZ2V0U3RkRm9udE1hcCA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgIHQuQXJpYWxOYXJyb3cgPSAiSGVsdmV0aWNhIjsKKyAgdFsiQXJpYWxOYXJyb3ctQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQXJpYWxOYXJyb3ctQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkFyaWFsTmFycm93LUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdC5BcmlhbEJsYWNrID0gIkhlbHZldGljYSI7CisgIHRbIkFyaWFsQmxhY2stQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQXJpYWxCbGFjay1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKKyAgdFsiQXJpYWxCbGFjay1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CisgIHRbIkFyaWFsLUJsYWNrIl0gPSAiSGVsdmV0aWNhIjsKKyAgdFsiQXJpYWwtQmxhY2stQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQXJpYWwtQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkFyaWFsLUJsYWNrLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdC5BcmlhbCA9ICJIZWx2ZXRpY2EiOworICB0WyJBcmlhbC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJBcmlhbC1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKKyAgdFsiQXJpYWwtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJBcmlhbC1Cb2xkTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CisgIHRbIkFyaWFsLUl0YWxpY01UIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0LkFyaWFsTVQgPSAiSGVsdmV0aWNhIjsKKyAgdFsiQ291cmllci1Cb2xkIl0gPSAiQ291cmllci1Cb2xkIjsKKyAgdFsiQ291cmllci1Cb2xkSXRhbGljIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CisgIHRbIkNvdXJpZXItSXRhbGljIl0gPSAiQ291cmllci1PYmxpcXVlIjsKKyAgdC5Db3VyaWVyTmV3ID0gIkNvdXJpZXIiOworICB0WyJDb3VyaWVyTmV3LUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOworICB0WyJDb3VyaWVyTmV3LUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKKyAgdFsiQ291cmllck5ldy1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOworICB0WyJDb3VyaWVyTmV3UFMtQm9sZEl0YWxpY01UIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CisgIHRbIkNvdXJpZXJOZXdQUy1Cb2xkTVQiXSA9ICJDb3VyaWVyLUJvbGQiOworICB0WyJDb3VyaWVyTmV3UFMtSXRhbGljTVQiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOworICB0LkNvdXJpZXJOZXdQU01UID0gIkNvdXJpZXIiOworICB0LkhlbHZldGljYSA9ICJIZWx2ZXRpY2EiOworICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJIZWx2ZXRpY2EtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdFsiU3ltYm9sLUJvbGQiXSA9ICJTeW1ib2wiOworICB0WyJTeW1ib2wtQm9sZEl0YWxpYyJdID0gIlN5bWJvbCI7CisgIHRbIlN5bWJvbC1JdGFsaWMiXSA9ICJTeW1ib2wiOworICB0LlRpbWVzTmV3Um9tYW4gPSAiVGltZXMtUm9tYW4iOworICB0WyJUaW1lc05ld1JvbWFuLUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKKyAgdFsiVGltZXNOZXdSb21hbi1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CisgIHRbIlRpbWVzTmV3Um9tYW4tSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKKyAgdC5UaW1lc05ld1JvbWFuUFMgPSAiVGltZXMtUm9tYW4iOworICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZCJdID0gIlRpbWVzLUJvbGQiOworICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOworICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpY01UIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CisgIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkTVQiXSA9ICJUaW1lcy1Cb2xkIjsKKyAgdFsiVGltZXNOZXdSb21hblBTLUl0YWxpYyJdID0gIlRpbWVzLUl0YWxpYyI7CisgIHRbIlRpbWVzTmV3Um9tYW5QUy1JdGFsaWNNVCJdID0gIlRpbWVzLUl0YWxpYyI7CisgIHQuVGltZXNOZXdSb21hblBTTVQgPSAiVGltZXMtUm9tYW4iOworICB0WyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CisgIHRbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGRJdGFsaWMiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKKyAgdFsiVGltZXNOZXdSb21hblBTTVQtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKK30pOworZXhwb3J0cy5nZXRTdGRGb250TWFwID0gZ2V0U3RkRm9udE1hcDsKK3ZhciBnZXROb25TdGRGb250TWFwID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgdC5DYWxpYnJpID0gIkhlbHZldGljYSI7CisgIHRbIkNhbGlicmktQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQ2FsaWJyaS1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKKyAgdFsiQ2FsaWJyaS1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CisgIHQuQ2VudHVyeUdvdGhpYyA9ICJIZWx2ZXRpY2EiOworICB0WyJDZW50dXJ5R290aGljLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CisgIHRbIkNlbnR1cnlHb3RoaWMtQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkNlbnR1cnlHb3RoaWMtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0LkNvbWljU2Fuc01TID0gIkNvbWljIFNhbnMgTVMiOworICB0WyJDb21pY1NhbnNNUy1Cb2xkIl0gPSAiQ29taWMgU2FucyBNUy1Cb2xkIjsKKyAgdFsiQ29taWNTYW5zTVMtQm9sZEl0YWxpYyJdID0gIkNvbWljIFNhbnMgTVMtQm9sZEl0YWxpYyI7CisgIHRbIkNvbWljU2Fuc01TLUl0YWxpYyJdID0gIkNvbWljIFNhbnMgTVMtSXRhbGljIjsKKyAgdC5MdWNpZGFDb25zb2xlID0gIkNvdXJpZXIiOworICB0WyJMdWNpZGFDb25zb2xlLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOworICB0WyJMdWNpZGFDb25zb2xlLUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKKyAgdFsiTHVjaWRhQ29uc29sZS1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOworICB0WyJMdWNpZGFTYW5zLURlbWkiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CisgIHRbIk1TLUdvdGhpYyJdID0gIk1TIEdvdGhpYyI7CisgIHRbIk1TLUdvdGhpYy1Cb2xkIl0gPSAiTVMgR290aGljLUJvbGQiOworICB0WyJNUy1Hb3RoaWMtQm9sZEl0YWxpYyJdID0gIk1TIEdvdGhpYy1Cb2xkSXRhbGljIjsKKyAgdFsiTVMtR290aGljLUl0YWxpYyJdID0gIk1TIEdvdGhpYy1JdGFsaWMiOworICB0WyJNUy1NaW5jaG8iXSA9ICJNUyBNaW5jaG8iOworICB0WyJNUy1NaW5jaG8tQm9sZCJdID0gIk1TIE1pbmNoby1Cb2xkIjsKKyAgdFsiTVMtTWluY2hvLUJvbGRJdGFsaWMiXSA9ICJNUyBNaW5jaG8tQm9sZEl0YWxpYyI7CisgIHRbIk1TLU1pbmNoby1JdGFsaWMiXSA9ICJNUyBNaW5jaG8tSXRhbGljIjsKKyAgdFsiTVMtUEdvdGhpYyJdID0gIk1TIFBHb3RoaWMiOworICB0WyJNUy1QR290aGljLUJvbGQiXSA9ICJNUyBQR290aGljLUJvbGQiOworICB0WyJNUy1QR290aGljLUJvbGRJdGFsaWMiXSA9ICJNUyBQR290aGljLUJvbGRJdGFsaWMiOworICB0WyJNUy1QR290aGljLUl0YWxpYyJdID0gIk1TIFBHb3RoaWMtSXRhbGljIjsKKyAgdFsiTVMtUE1pbmNobyJdID0gIk1TIFBNaW5jaG8iOworICB0WyJNUy1QTWluY2hvLUJvbGQiXSA9ICJNUyBQTWluY2hvLUJvbGQiOworICB0WyJNUy1QTWluY2hvLUJvbGRJdGFsaWMiXSA9ICJNUyBQTWluY2hvLUJvbGRJdGFsaWMiOworICB0WyJNUy1QTWluY2hvLUl0YWxpYyJdID0gIk1TIFBNaW5jaG8tSXRhbGljIjsKKyAgdC5OdXB0aWFsU2NyaXB0ID0gIlRpbWVzLUl0YWxpYyI7CisgIHQuU2Vnb2VVSVN5bWJvbCA9ICJIZWx2ZXRpY2EiOworICB0LldpbmdkaW5ncyA9ICJaYXBmRGluZ2JhdHMiOworICB0WyJXaW5nZGluZ3MtUmVndWxhciJdID0gIlphcGZEaW5nYmF0cyI7Cit9KTsKK2V4cG9ydHMuZ2V0Tm9uU3RkRm9udE1hcCA9IGdldE5vblN0ZEZvbnRNYXA7Cit2YXIgZ2V0U2VyaWZGb250cyA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgIHRbIkFkb2JlIEplbnNvbiJdID0gdHJ1ZTsKKyAgdFsiQWRvYmUgVGV4dCJdID0gdHJ1ZTsKKyAgdC5BbGJlcnR1cyA9IHRydWU7CisgIHQuQWxkdXMgPSB0cnVlOworICB0LkFsZXhhbmRyaWEgPSB0cnVlOworICB0LkFsZ2VyaWFuID0gdHJ1ZTsKKyAgdFsiQW1lcmljYW4gVHlwZXdyaXRlciJdID0gdHJ1ZTsKKyAgdC5BbnRpcXVhID0gdHJ1ZTsKKyAgdC5BcGV4ID0gdHJ1ZTsKKyAgdC5Bcm5vID0gdHJ1ZTsKKyAgdC5Bc3RlciA9IHRydWU7CisgIHQuQXVyb3JhID0gdHJ1ZTsKKyAgdC5CYXNrZXJ2aWxsZSA9IHRydWU7CisgIHQuQmVsbCA9IHRydWU7CisgIHQuQmVtYm8gPSB0cnVlOworICB0WyJCZW1ibyBTY2hvb2xib29rIl0gPSB0cnVlOworICB0LkJlbmd1aWF0ID0gdHJ1ZTsKKyAgdFsiQmVya2VsZXkgT2xkIFN0eWxlIl0gPSB0cnVlOworICB0WyJCZXJuaGFyZCBNb2Rlcm4iXSA9IHRydWU7CisgIHRbIkJlcnRob2xkIENpdHkiXSA9IHRydWU7CisgIHQuQm9kb25pID0gdHJ1ZTsKKyAgdFsiQmF1ZXIgQm9kb25pIl0gPSB0cnVlOworICB0WyJCb29rIEFudGlxdWEiXSA9IHRydWU7CisgIHQuQm9va21hbiA9IHRydWU7CisgIHRbIkJvcmRlYXV4IFJvbWFuIl0gPSB0cnVlOworICB0WyJDYWxpZm9ybmlhbiBGQiJdID0gdHJ1ZTsKKyAgdC5DYWxpc3RvID0gdHJ1ZTsKKyAgdC5DYWx2ZXJ0ID0gdHJ1ZTsKKyAgdC5DYXBpdGFscyA9IHRydWU7CisgIHQuQ2FtYnJpYSA9IHRydWU7CisgIHQuQ2FydGllciA9IHRydWU7CisgIHQuQ2FzbG9uID0gdHJ1ZTsKKyAgdC5DYXR1bGwgPSB0cnVlOworICB0LkNlbnRhdXIgPSB0cnVlOworICB0WyJDZW50dXJ5IE9sZCBTdHlsZSJdID0gdHJ1ZTsKKyAgdFsiQ2VudHVyeSBTY2hvb2xib29rIl0gPSB0cnVlOworICB0LkNoYXBhcnJhbCA9IHRydWU7CisgIHRbIkNoYXJpcyBTSUwiXSA9IHRydWU7CisgIHQuQ2hlbHRlbmhhbSA9IHRydWU7CisgIHRbIkNob2xsYSBTbGFiIl0gPSB0cnVlOworICB0LkNsYXJlbmRvbiA9IHRydWU7CisgIHQuQ2xlYXJmYWNlID0gdHJ1ZTsKKyAgdC5Db2NoaW4gPSB0cnVlOworICB0LkNvbG9ubmEgPSB0cnVlOworICB0WyJDb21wdXRlciBNb2Rlcm4iXSA9IHRydWU7CisgIHRbIkNvbmNyZXRlIFJvbWFuIl0gPSB0cnVlOworICB0LkNvbnN0YW50aWEgPSB0cnVlOworICB0WyJDb29wZXIgQmxhY2siXSA9IHRydWU7CisgIHQuQ29yb25hID0gdHJ1ZTsKKyAgdC5FY290eXBlID0gdHJ1ZTsKKyAgdC5FZ3lwdGllbm5lID0gdHJ1ZTsKKyAgdC5FbGVwaGFudCA9IHRydWU7CisgIHQuRXhjZWxzaW9yID0gdHJ1ZTsKKyAgdC5GYWlyZmllbGQgPSB0cnVlOworICB0WyJGRiBTY2FsYSJdID0gdHJ1ZTsKKyAgdC5Gb2xrYXJkID0gdHJ1ZTsKKyAgdC5Gb290bGlnaHQgPSB0cnVlOworICB0LkZyZWVTZXJpZiA9IHRydWU7CisgIHRbIkZyaXogUXVhZHJhdGEiXSA9IHRydWU7CisgIHQuR2FyYW1vbmQgPSB0cnVlOworICB0LkdlbnRpdW0gPSB0cnVlOworICB0Lkdlb3JnaWEgPSB0cnVlOworICB0Lkdsb3VjZXN0ZXIgPSB0cnVlOworICB0WyJHb3VkeSBPbGQgU3R5bGUiXSA9IHRydWU7CisgIHRbIkdvdWR5IFNjaG9vbGJvb2siXSA9IHRydWU7CisgIHRbIkdvdWR5IFBybyBGb250Il0gPSB0cnVlOworICB0LkdyYW5qb24gPSB0cnVlOworICB0WyJHdWFyZGlhbiBFZ3lwdGlhbiJdID0gdHJ1ZTsKKyAgdC5IZWF0aGVyID0gdHJ1ZTsKKyAgdC5IZXJjdWxlcyA9IHRydWU7CisgIHRbIkhpZ2ggVG93ZXIgVGV4dCJdID0gdHJ1ZTsKKyAgdC5IaXJvc2hpZ2UgPSB0cnVlOworICB0WyJIb2VmbGVyIFRleHQiXSA9IHRydWU7CisgIHRbIkh1bWFuYSBTZXJpZiJdID0gdHJ1ZTsKKyAgdC5JbXByaW50ID0gdHJ1ZTsKKyAgdFsiSW9uaWMgTm8uIDUiXSA9IHRydWU7CisgIHQuSmFuc29uID0gdHJ1ZTsKKyAgdC5Kb2FubmEgPSB0cnVlOworICB0LktvcmlubmEgPSB0cnVlOworICB0LkxleGljb24gPSB0cnVlOworICB0WyJMaWJlcmF0aW9uIFNlcmlmIl0gPSB0cnVlOworICB0WyJMaW51eCBMaWJlcnRpbmUiXSA9IHRydWU7CisgIHQuTGl0ZXJhdHVybmF5YSA9IHRydWU7CisgIHQuTHVjaWRhID0gdHJ1ZTsKKyAgdFsiTHVjaWRhIEJyaWdodCJdID0gdHJ1ZTsKKyAgdC5NZWxpb3IgPSB0cnVlOworICB0Lk1lbXBoaXMgPSB0cnVlOworICB0Lk1pbGxlciA9IHRydWU7CisgIHQuTWluaW9uID0gdHJ1ZTsKKyAgdC5Nb2Rlcm4gPSB0cnVlOworICB0WyJNb25hIExpc2EiXSA9IHRydWU7CisgIHRbIk1ycyBFYXZlcyJdID0gdHJ1ZTsKKyAgdFsiTVMgU2VyaWYiXSA9IHRydWU7CisgIHRbIk11c2VvIFNsYWIiXSA9IHRydWU7CisgIHRbIk5ldyBZb3JrIl0gPSB0cnVlOworICB0WyJOaW1idXMgUm9tYW4iXSA9IHRydWU7CisgIHRbIk5QUyBSYXdsaW5zb24gUm9hZHdheSJdID0gdHJ1ZTsKKyAgdC5OdXB0aWFsU2NyaXB0ID0gdHJ1ZTsKKyAgdC5QYWxhdGlubyA9IHRydWU7CisgIHQuUGVycGV0dWEgPSB0cnVlOworICB0LlBsYW50aW4gPSB0cnVlOworICB0WyJQbGFudGluIFNjaG9vbGJvb2siXSA9IHRydWU7CisgIHQuUGxheWJpbGwgPSB0cnVlOworICB0WyJQb29yIFJpY2hhcmQiXSA9IHRydWU7CisgIHRbIlJhd2xpbnNvbiBSb2Fkd2F5Il0gPSB0cnVlOworICB0LlJlbmF1bHQgPSB0cnVlOworICB0LlJlcXVpZW0gPSB0cnVlOworICB0LlJvY2t3ZWxsID0gdHJ1ZTsKKyAgdC5Sb21hbiA9IHRydWU7CisgIHRbIlJvdGlzIFNlcmlmIl0gPSB0cnVlOworICB0LlNhYm9uID0gdHJ1ZTsKKyAgdC5TY2FsYSA9IHRydWU7CisgIHQuU2VhZ3VsbCA9IHRydWU7CisgIHQuU2lzdGluYSA9IHRydWU7CisgIHQuU291dmVuaXIgPSB0cnVlOworICB0LlNUSVggPSB0cnVlOworICB0WyJTdG9uZSBJbmZvcm1hbCJdID0gdHJ1ZTsKKyAgdFsiU3RvbmUgU2VyaWYiXSA9IHRydWU7CisgIHQuU3lsZmFlbiA9IHRydWU7CisgIHQuVGltZXMgPSB0cnVlOworICB0LlRyYWphbiA9IHRydWU7CisgIHRbIlRyaW5pdMOpIl0gPSB0cnVlOworICB0WyJUcnVtcCBNZWRpYWV2YWwiXSA9IHRydWU7CisgIHQuVXRvcGlhID0gdHJ1ZTsKKyAgdFsiVmFsZSBUeXBlIl0gPSB0cnVlOworICB0WyJCaXRzdHJlYW0gVmVyYSJdID0gdHJ1ZTsKKyAgdFsiVmVyYSBTZXJpZiJdID0gdHJ1ZTsKKyAgdC5WZXJzYWlsbGVzID0gdHJ1ZTsKKyAgdC5XYW50ZWQgPSB0cnVlOworICB0LldlaXNzID0gdHJ1ZTsKKyAgdFsiV2lkZSBMYXRpbiJdID0gdHJ1ZTsKKyAgdC5XaW5kc29yID0gdHJ1ZTsKKyAgdC5YSVRTID0gdHJ1ZTsKK30pOworZXhwb3J0cy5nZXRTZXJpZkZvbnRzID0gZ2V0U2VyaWZGb250czsKK3ZhciBnZXRTeW1ib2xzRm9udHMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0LkRpbmdiYXRzID0gdHJ1ZTsKKyAgdC5TeW1ib2wgPSB0cnVlOworICB0LlphcGZEaW5nYmF0cyA9IHRydWU7Cit9KTsKK2V4cG9ydHMuZ2V0U3ltYm9sc0ZvbnRzID0gZ2V0U3ltYm9sc0ZvbnRzOwordmFyIGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgIHRbMl0gPSAxMDsKKyAgdFszXSA9IDMyOworICB0WzRdID0gMzM7CisgIHRbNV0gPSAzNDsKKyAgdFs2XSA9IDM1OworICB0WzddID0gMzY7CisgIHRbOF0gPSAzNzsKKyAgdFs5XSA9IDM4OworICB0WzEwXSA9IDM5OworICB0WzExXSA9IDQwOworICB0WzEyXSA9IDQxOworICB0WzEzXSA9IDQyOworICB0WzE0XSA9IDQzOworICB0WzE1XSA9IDQ0OworICB0WzE2XSA9IDQ1OworICB0WzE3XSA9IDQ2OworICB0WzE4XSA9IDQ3OworICB0WzE5XSA9IDQ4OworICB0WzIwXSA9IDQ5OworICB0WzIxXSA9IDUwOworICB0WzIyXSA9IDUxOworICB0WzIzXSA9IDUyOworICB0WzI0XSA9IDUzOworICB0WzI1XSA9IDU0OworICB0WzI2XSA9IDU1OworICB0WzI3XSA9IDU2OworICB0WzI4XSA9IDU3OworICB0WzI5XSA9IDU4OworICB0WzMwXSA9IDg5NDsKKyAgdFszMV0gPSA2MDsKKyAgdFszMl0gPSA2MTsKKyAgdFszM10gPSA2MjsKKyAgdFszNF0gPSA2MzsKKyAgdFszNV0gPSA2NDsKKyAgdFszNl0gPSA2NTsKKyAgdFszN10gPSA2NjsKKyAgdFszOF0gPSA2NzsKKyAgdFszOV0gPSA2ODsKKyAgdFs0MF0gPSA2OTsKKyAgdFs0MV0gPSA3MDsKKyAgdFs0Ml0gPSA3MTsKKyAgdFs0M10gPSA3MjsKKyAgdFs0NF0gPSA3MzsKKyAgdFs0NV0gPSA3NDsKKyAgdFs0Nl0gPSA3NTsKKyAgdFs0N10gPSA3NjsKKyAgdFs0OF0gPSA3NzsKKyAgdFs0OV0gPSA3ODsKKyAgdFs1MF0gPSA3OTsKKyAgdFs1MV0gPSA4MDsKKyAgdFs1Ml0gPSA4MTsKKyAgdFs1M10gPSA4MjsKKyAgdFs1NF0gPSA4MzsKKyAgdFs1NV0gPSA4NDsKKyAgdFs1Nl0gPSA4NTsKKyAgdFs1N10gPSA4NjsKKyAgdFs1OF0gPSA4NzsKKyAgdFs1OV0gPSA4ODsKKyAgdFs2MF0gPSA4OTsKKyAgdFs2MV0gPSA5MDsKKyAgdFs2Ml0gPSA5MTsKKyAgdFs2M10gPSA5MjsKKyAgdFs2NF0gPSA5MzsKKyAgdFs2NV0gPSA5NDsKKyAgdFs2Nl0gPSA5NTsKKyAgdFs2N10gPSA5NjsKKyAgdFs2OF0gPSA5NzsKKyAgdFs2OV0gPSA5ODsKKyAgdFs3MF0gPSA5OTsKKyAgdFs3MV0gPSAxMDA7CisgIHRbNzJdID0gMTAxOworICB0WzczXSA9IDEwMjsKKyAgdFs3NF0gPSAxMDM7CisgIHRbNzVdID0gMTA0OworICB0Wzc2XSA9IDEwNTsKKyAgdFs3N10gPSAxMDY7CisgIHRbNzhdID0gMTA3OworICB0Wzc5XSA9IDEwODsKKyAgdFs4MF0gPSAxMDk7CisgIHRbODFdID0gMTEwOworICB0WzgyXSA9IDExMTsKKyAgdFs4M10gPSAxMTI7CisgIHRbODRdID0gMTEzOworICB0Wzg1XSA9IDExNDsKKyAgdFs4Nl0gPSAxMTU7CisgIHRbODddID0gMTE2OworICB0Wzg4XSA9IDExNzsKKyAgdFs4OV0gPSAxMTg7CisgIHRbOTBdID0gMTE5OworICB0WzkxXSA9IDEyMDsKKyAgdFs5Ml0gPSAxMjE7CisgIHRbOTNdID0gMTIyOworICB0Wzk0XSA9IDEyMzsKKyAgdFs5NV0gPSAxMjQ7CisgIHRbOTZdID0gMTI1OworICB0Wzk3XSA9IDEyNjsKKyAgdFs5OF0gPSAxOTY7CisgIHRbOTldID0gMTk3OworICB0WzEwMF0gPSAxOTk7CisgIHRbMTAxXSA9IDIwMTsKKyAgdFsxMDJdID0gMjA5OworICB0WzEwM10gPSAyMTQ7CisgIHRbMTA0XSA9IDIyMDsKKyAgdFsxMDVdID0gMjI1OworICB0WzEwNl0gPSAyMjQ7CisgIHRbMTA3XSA9IDIyNjsKKyAgdFsxMDhdID0gMjI4OworICB0WzEwOV0gPSAyMjc7CisgIHRbMTEwXSA9IDIyOTsKKyAgdFsxMTFdID0gMjMxOworICB0WzExMl0gPSAyMzM7CisgIHRbMTEzXSA9IDIzMjsKKyAgdFsxMTRdID0gMjM0OworICB0WzExNV0gPSAyMzU7CisgIHRbMTE2XSA9IDIzNzsKKyAgdFsxMTddID0gMjM2OworICB0WzExOF0gPSAyMzg7CisgIHRbMTE5XSA9IDIzOTsKKyAgdFsxMjBdID0gMjQxOworICB0WzEyMV0gPSAyNDM7CisgIHRbMTIyXSA9IDI0MjsKKyAgdFsxMjNdID0gMjQ0OworICB0WzEyNF0gPSAyNDY7CisgIHRbMTI1XSA9IDI0NTsKKyAgdFsxMjZdID0gMjUwOworICB0WzEyN10gPSAyNDk7CisgIHRbMTI4XSA9IDI1MTsKKyAgdFsxMjldID0gMjUyOworICB0WzEzMF0gPSA4MjI0OworICB0WzEzMV0gPSAxNzY7CisgIHRbMTMyXSA9IDE2MjsKKyAgdFsxMzNdID0gMTYzOworICB0WzEzNF0gPSAxNjc7CisgIHRbMTM1XSA9IDgyMjY7CisgIHRbMTM2XSA9IDE4MjsKKyAgdFsxMzddID0gMjIzOworICB0WzEzOF0gPSAxNzQ7CisgIHRbMTM5XSA9IDE2OTsKKyAgdFsxNDBdID0gODQ4MjsKKyAgdFsxNDFdID0gMTgwOworICB0WzE0Ml0gPSAxNjg7CisgIHRbMTQzXSA9IDg4MDA7CisgIHRbMTQ0XSA9IDE5ODsKKyAgdFsxNDVdID0gMjE2OworICB0WzE0Nl0gPSA4NzM0OworICB0WzE0N10gPSAxNzc7CisgIHRbMTQ4XSA9IDg4MDQ7CisgIHRbMTQ5XSA9IDg4MDU7CisgIHRbMTUwXSA9IDE2NTsKKyAgdFsxNTFdID0gMTgxOworICB0WzE1Ml0gPSA4NzA2OworICB0WzE1M10gPSA4NzIxOworICB0WzE1NF0gPSA4NzE5OworICB0WzE1Nl0gPSA4NzQ3OworICB0WzE1N10gPSAxNzA7CisgIHRbMTU4XSA9IDE4NjsKKyAgdFsxNTldID0gODQ4NjsKKyAgdFsxNjBdID0gMjMwOworICB0WzE2MV0gPSAyNDg7CisgIHRbMTYyXSA9IDE5MTsKKyAgdFsxNjNdID0gMTYxOworICB0WzE2NF0gPSAxNzI7CisgIHRbMTY1XSA9IDg3MzA7CisgIHRbMTY2XSA9IDQwMjsKKyAgdFsxNjddID0gODc3NjsKKyAgdFsxNjhdID0gODcxMDsKKyAgdFsxNjldID0gMTcxOworICB0WzE3MF0gPSAxODc7CisgIHRbMTcxXSA9IDgyMzA7CisgIHRbMjEwXSA9IDIxODsKKyAgdFsyMjNdID0gNzExOworICB0WzIyNF0gPSAzMjE7CisgIHRbMjI1XSA9IDMyMjsKKyAgdFsyMjddID0gMzUzOworICB0WzIyOV0gPSAzODI7CisgIHRbMjM0XSA9IDI1MzsKKyAgdFsyNTJdID0gMjYzOworICB0WzI1M10gPSAyNjg7CisgIHRbMjU0XSA9IDI2OTsKKyAgdFsyNThdID0gMjU4OworICB0WzI2MF0gPSAyNjA7CisgIHRbMjYxXSA9IDI2MTsKKyAgdFsyNjVdID0gMjgwOworICB0WzI2Nl0gPSAyODE7CisgIHRbMjY4XSA9IDI4MzsKKyAgdFsyNjldID0gMzEzOworICB0WzI3NV0gPSAzMjM7CisgIHRbMjc2XSA9IDMyNDsKKyAgdFsyNzhdID0gMzI4OworICB0WzI4NF0gPSAzNDU7CisgIHRbMjg1XSA9IDM0NjsKKyAgdFsyODZdID0gMzQ3OworICB0WzI5Ml0gPSAzNjc7CisgIHRbMjk1XSA9IDM3NzsKKyAgdFsyOTZdID0gMzc4OworICB0WzI5OF0gPSAzODA7CisgIHRbMzA1XSA9IDk2MzsKKyAgdFszMDZdID0gOTY0OworICB0WzMwN10gPSA5NjY7CisgIHRbMzA4XSA9IDgyMTU7CisgIHRbMzA5XSA9IDgyNTI7CisgIHRbMzEwXSA9IDgzMTk7CisgIHRbMzExXSA9IDgzNTk7CisgIHRbMzEyXSA9IDg1OTI7CisgIHRbMzEzXSA9IDg1OTM7CisgIHRbMzM3XSA9IDk1NTI7CisgIHRbNDkzXSA9IDEwMzk7CisgIHRbNDk0XSA9IDEwNDA7CisgIHRbNzA1XSA9IDE1MjQ7CisgIHRbNzA2XSA9IDgzNjI7CisgIHRbNzEwXSA9IDY0Mjg4OworICB0WzcxMV0gPSA2NDI5ODsKKyAgdFs3NTldID0gMTYxNzsKKyAgdFs3NjFdID0gMTc3NjsKKyAgdFs3NjNdID0gMTc3ODsKKyAgdFs3NzVdID0gMTY1MjsKKyAgdFs3NzddID0gMTc2NDsKKyAgdFs3NzhdID0gMTc4MDsKKyAgdFs3NzldID0gMTc4MTsKKyAgdFs3ODBdID0gMTc4MjsKKyAgdFs3ODJdID0gNzcxOworICB0Wzc4M10gPSA2NDcyNjsKKyAgdFs3ODZdID0gODM2MzsKKyAgdFs3ODhdID0gODUzMjsKKyAgdFs3OTBdID0gNzY4OworICB0Wzc5MV0gPSA3Njk7CisgIHRbNzkyXSA9IDc2ODsKKyAgdFs3OTVdID0gODAzOworICB0Wzc5N10gPSA2NDMzNjsKKyAgdFs3OThdID0gNjQzMzc7CisgIHRbNzk5XSA9IDY0MzQyOworICB0WzgwMF0gPSA2NDM0MzsKKyAgdFs4MDFdID0gNjQzNDQ7CisgIHRbODAyXSA9IDY0MzQ1OworICB0WzgwM10gPSA2NDM2MjsKKyAgdFs4MDRdID0gNjQzNjM7CisgIHRbODA1XSA9IDY0MzY0OworICB0WzI0MjRdID0gNzgyMTsKKyAgdFsyNDI1XSA9IDc4MjI7CisgIHRbMjQyNl0gPSA3ODIzOworICB0WzI0MjddID0gNzgyNDsKKyAgdFsyNDI4XSA9IDc4MjU7CisgIHRbMjQyOV0gPSA3ODI2OworICB0WzI0MzBdID0gNzgyNzsKKyAgdFsyNDMzXSA9IDc2ODI7CisgIHRbMjY3OF0gPSA4MDQ1OworICB0WzI2NzldID0gODA0NjsKKyAgdFsyODMwXSA9IDE1NTI7CisgIHRbMjgzOF0gPSA2ODY7CisgIHRbMjg0MF0gPSA3NTE7CisgIHRbMjg0Ml0gPSA3NTM7CisgIHRbMjg0M10gPSA3NTQ7CisgIHRbMjg0NF0gPSA3NTU7CisgIHRbMjg0Nl0gPSA3NTc7CisgIHRbMjg1Nl0gPSA3Njc7CisgIHRbMjg1N10gPSA4NDg7CisgIHRbMjg1OF0gPSA4NDk7CisgIHRbMjg2Ml0gPSA4NTM7CisgIHRbMjg2M10gPSA4NTQ7CisgIHRbMjg2NF0gPSA4NTU7CisgIHRbMjg2NV0gPSA4NjE7CisgIHRbMjg2Nl0gPSA4NjI7CisgIHRbMjkwNl0gPSA3NDYwOworICB0WzI5MDhdID0gNzQ2MjsKKyAgdFsyOTA5XSA9IDc0NjM7CisgIHRbMjkxMF0gPSA3NDY0OworICB0WzI5MTJdID0gNzQ2NjsKKyAgdFsyOTEzXSA9IDc0Njc7CisgIHRbMjkxNF0gPSA3NDY4OworICB0WzI5MTZdID0gNzQ3MDsKKyAgdFsyOTE3XSA9IDc0NzE7CisgIHRbMjkxOF0gPSA3NDcyOworICB0WzI5MjBdID0gNzQ3NDsKKyAgdFsyOTIxXSA9IDc0NzU7CisgIHRbMjkyMl0gPSA3NDc2OworICB0WzI5MjRdID0gNzQ3ODsKKyAgdFsyOTI1XSA9IDc0Nzk7CisgIHRbMjkyNl0gPSA3NDgwOworICB0WzI5MjhdID0gNzQ4MjsKKyAgdFsyOTI5XSA9IDc0ODM7CisgIHRbMjkzMF0gPSA3NDg0OworICB0WzI5MzJdID0gNzQ4NjsKKyAgdFsyOTMzXSA9IDc0ODc7CisgIHRbMjkzNF0gPSA3NDg4OworICB0WzI5MzZdID0gNzQ5MDsKKyAgdFsyOTM3XSA9IDc0OTE7CisgIHRbMjkzOF0gPSA3NDkyOworICB0WzI5NDBdID0gNzQ5NDsKKyAgdFsyOTQxXSA9IDc0OTU7CisgIHRbMjk0Ml0gPSA3NDk2OworICB0WzI5NDRdID0gNzQ5ODsKKyAgdFsyOTQ2XSA9IDc1MDA7CisgIHRbMjk0OF0gPSA3NTAyOworICB0WzI5NTBdID0gNzUwNDsKKyAgdFsyOTUxXSA9IDc1MDU7CisgIHRbMjk1Ml0gPSA3NTA2OworICB0WzI5NTRdID0gNzUwODsKKyAgdFsyOTU1XSA9IDc1MDk7CisgIHRbMjk1Nl0gPSA3NTEwOworICB0WzI5NThdID0gNzUxMjsKKyAgdFsyOTU5XSA9IDc1MTM7CisgIHRbMjk2MF0gPSA3NTE0OworICB0WzI5NjJdID0gNzUxNjsKKyAgdFsyOTYzXSA9IDc1MTc7CisgIHRbMjk2NF0gPSA3NTE4OworICB0WzI5NjZdID0gNzUyMDsKKyAgdFsyOTY3XSA9IDc1MjE7CisgIHRbMjk2OF0gPSA3NTIyOworICB0WzI5NzBdID0gNzUyNDsKKyAgdFsyOTcxXSA9IDc1MjU7CisgIHRbMjk3Ml0gPSA3NTI2OworICB0WzI5NzRdID0gNzUyODsKKyAgdFsyOTc1XSA9IDc1Mjk7CisgIHRbMjk3Nl0gPSA3NTMwOworICB0WzI5NzhdID0gMTUzNzsKKyAgdFsyOTc5XSA9IDE1Mzg7CisgIHRbMjk4MF0gPSAxNTM5OworICB0WzI5ODJdID0gMTU0OTsKKyAgdFsyOTgzXSA9IDE1NTE7CisgIHRbMjk4NF0gPSAxNTUyOworICB0WzI5ODZdID0gMTU1NDsKKyAgdFsyOTg3XSA9IDE1NTU7CisgIHRbMjk4OF0gPSAxNTU2OworICB0WzI5OTBdID0gMTYyMzsKKyAgdFsyOTkxXSA9IDE2MjQ7CisgIHRbMjk5NV0gPSAxNzc1OworICB0WzI5OTldID0gMTc5MTsKKyAgdFszMDAyXSA9IDY0MjkwOworICB0WzMwMDNdID0gNjQyOTE7CisgIHRbMzAwNF0gPSA2NDI5MjsKKyAgdFszMDA2XSA9IDY0Mjk0OworICB0WzMwMDddID0gNjQyOTU7CisgIHRbMzAwOF0gPSA2NDI5NjsKKyAgdFszMDExXSA9IDE5MDA7CisgIHRbMzAxNF0gPSA4MjIzOworICB0WzMwMTVdID0gODI0NDsKKyAgdFszMDE3XSA9IDc1MzI7CisgIHRbMzAxOF0gPSA3NTMzOworICB0WzMwMTldID0gNzUzNDsKKyAgdFszMDc1XSA9IDc1OTA7CisgIHRbMzA3Nl0gPSA3NTkxOworICB0WzMwNzldID0gNzU5NDsKKyAgdFszMDgwXSA9IDc1OTU7CisgIHRbMzA4M10gPSA3NTk4OworICB0WzMwODRdID0gNzU5OTsKKyAgdFszMDg3XSA9IDc2MDI7CisgIHRbMzA4OF0gPSA3NjAzOworICB0WzMwOTFdID0gNzYwNjsKKyAgdFszMDkyXSA9IDc2MDc7CisgIHRbMzA5NV0gPSA3NjEwOworICB0WzMwOTZdID0gNzYxMTsKKyAgdFszMDk5XSA9IDc2MTQ7CisgIHRbMzEwMF0gPSA3NjE1OworICB0WzMxMDNdID0gNzYxODsKKyAgdFszMTA0XSA9IDc2MTk7CisgIHRbMzEwN10gPSA4MzM3OworICB0WzMxMDhdID0gODMzODsKKyAgdFszMTE2XSA9IDE4ODQ7CisgIHRbMzExOV0gPSAxODg1OworICB0WzMxMjBdID0gMTg4NTsKKyAgdFszMTIzXSA9IDE4ODY7CisgIHRbMzEyNF0gPSAxODg2OworICB0WzMxMjddID0gMTg4NzsKKyAgdFszMTI4XSA9IDE4ODc7CisgIHRbMzEzMV0gPSAxODg4OworICB0WzMxMzJdID0gMTg4ODsKKyAgdFszMTM1XSA9IDE4ODk7CisgIHRbMzEzNl0gPSAxODg5OworICB0WzMxMzldID0gMTg5MDsKKyAgdFszMTQwXSA9IDE4OTA7CisgIHRbMzE0M10gPSAxODkxOworICB0WzMxNDRdID0gMTg5MTsKKyAgdFszMTQ3XSA9IDE4OTI7CisgIHRbMzE0OF0gPSAxODkyOworICB0WzMxNTNdID0gNTgwOworICB0WzMxNTRdID0gNTgxOworICB0WzMxNTddID0gNTg0OworICB0WzMxNThdID0gNTg1OworICB0WzMxNjFdID0gNTg4OworICB0WzMxNjJdID0gNTg5OworICB0WzMxNjVdID0gODkxOworICB0WzMxNjZdID0gODkyOworICB0WzMxNjldID0gMTI3NDsKKyAgdFszMTcwXSA9IDEyNzU7CisgIHRbMzE3M10gPSAxMjc4OworICB0WzMxNzRdID0gMTI3OTsKKyAgdFszMTgxXSA9IDc2MjI7CisgIHRbMzE4Ml0gPSA3NjIzOworICB0WzMyODJdID0gMTE3OTk7CisgIHRbMzMxNl0gPSA1Nzg7CisgIHRbMzM3OV0gPSA0Mjc4NTsKKyAgdFszMzkzXSA9IDExNTk7CisgIHRbMzQxNl0gPSA4Mzc3OworfSk7CitleHBvcnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250czsKK3ZhciBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0WzIyN10gPSAzMjI7CisgIHRbMjY0XSA9IDI2MTsKKyAgdFsyOTFdID0gMzQ2OworfSk7CitleHBvcnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayA9IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjazsKK3ZhciBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0WzFdID0gMzI7CisgIHRbNF0gPSA2NTsKKyAgdFsxN10gPSA2NjsKKyAgdFsxOF0gPSA2NzsKKyAgdFsyNF0gPSA2ODsKKyAgdFsyOF0gPSA2OTsKKyAgdFszOF0gPSA3MDsKKyAgdFszOV0gPSA3MTsKKyAgdFs0NF0gPSA3MjsKKyAgdFs0N10gPSA3MzsKKyAgdFs1OF0gPSA3NDsKKyAgdFs2MF0gPSA3NTsKKyAgdFs2Ml0gPSA3NjsKKyAgdFs2OF0gPSA3NzsKKyAgdFs2OV0gPSA3ODsKKyAgdFs3NV0gPSA3OTsKKyAgdFs4N10gPSA4MDsKKyAgdFs4OV0gPSA4MTsKKyAgdFs5MF0gPSA4MjsKKyAgdFs5NF0gPSA4MzsKKyAgdFsxMDBdID0gODQ7CisgIHRbMTA0XSA9IDg1OworICB0WzExNV0gPSA4NjsKKyAgdFsxMTZdID0gODc7CisgIHRbMTIxXSA9IDg4OworICB0WzEyMl0gPSA4OTsKKyAgdFsxMjddID0gOTA7CisgIHRbMjU4XSA9IDk3OworICB0WzI2OF0gPSAyNjE7CisgIHRbMjcxXSA9IDk4OworICB0WzI3Ml0gPSA5OTsKKyAgdFsyNzNdID0gMjYzOworICB0WzI4Ml0gPSAxMDA7CisgIHRbMjg2XSA9IDEwMTsKKyAgdFsyOTVdID0gMjgxOworICB0WzI5Nl0gPSAxMDI7CisgIHRbMzM2XSA9IDEwMzsKKyAgdFszNDZdID0gMTA0OworICB0WzM0OV0gPSAxMDU7CisgIHRbMzYxXSA9IDEwNjsKKyAgdFszNjRdID0gMTA3OworICB0WzM2N10gPSAxMDg7CisgIHRbMzcxXSA9IDMyMjsKKyAgdFszNzNdID0gMTA5OworICB0WzM3NF0gPSAxMTA7CisgIHRbMzgxXSA9IDExMTsKKyAgdFszODNdID0gMjQzOworICB0WzM5M10gPSAxMTI7CisgIHRbMzk1XSA9IDExMzsKKyAgdFszOTZdID0gMTE0OworICB0WzQwMF0gPSAxMTU7CisgIHRbNDAxXSA9IDM0NzsKKyAgdFs0MTBdID0gMTE2OworICB0WzQzN10gPSAxMTc7CisgIHRbNDQ4XSA9IDExODsKKyAgdFs0NDldID0gMTE5OworICB0WzQ1NF0gPSAxMjA7CisgIHRbNDU1XSA9IDEyMTsKKyAgdFs0NjBdID0gMTIyOworICB0WzQ2M10gPSAzODA7CisgIHRbODUzXSA9IDQ0OworICB0Wzg1NV0gPSA1ODsKKyAgdFs4NTZdID0gNDY7CisgIHRbODc2XSA9IDQ3OworICB0Wzg3OF0gPSA0NTsKKyAgdFs4ODJdID0gNDU7CisgIHRbODk0XSA9IDQwOworICB0Wzg5NV0gPSA0MTsKKyAgdFs4OTZdID0gOTE7CisgIHRbODk3XSA9IDkzOworICB0WzkyM10gPSA2NDsKKyAgdFsxMDA0XSA9IDQ4OworICB0WzEwMDVdID0gNDk7CisgIHRbMTAwNl0gPSA1MDsKKyAgdFsxMDA3XSA9IDUxOworICB0WzEwMDhdID0gNTI7CisgIHRbMTAwOV0gPSA1MzsKKyAgdFsxMDEwXSA9IDU0OworICB0WzEwMTFdID0gNTU7CisgIHRbMTAxMl0gPSA1NjsKKyAgdFsxMDEzXSA9IDU3OworICB0WzEwODFdID0gMzc7CisgIHRbMTA4NV0gPSA0MzsKKyAgdFsxMDg2XSA9IDQ1OworfSk7CitleHBvcnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSA9IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaTsKKworLyoqKi8gfSksCisvKiAyMzMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdldExvb2t1cFRhYmxlRmFjdG9yeSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA1KS5nZXRMb29rdXBUYWJsZUZhY3Rvcnk7Cit2YXIgZ2V0U3BlY2lhbFBVQVN5bWJvbHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKKyB0WzYzNzIxXSA9IDB4MDBhOTsKKyB0WzYzMTkzXSA9IDB4MDBhOTsKKyB0WzYzNzIwXSA9IDB4MDBhZTsKKyB0WzYzMTk0XSA9IDB4MDBhZTsKKyB0WzYzNzIyXSA9IDB4MjEyMjsKKyB0WzYzMTk1XSA9IDB4MjEyMjsKKyB0WzYzNzI5XSA9IDB4MjNhNzsKKyB0WzYzNzMwXSA9IDB4MjNhODsKKyB0WzYzNzMxXSA9IDB4MjNhOTsKKyB0WzYzNzQwXSA9IDB4MjNhYjsKKyB0WzYzNzQxXSA9IDB4MjNhYzsKKyB0WzYzNzQyXSA9IDB4MjNhZDsKKyB0WzYzNzI2XSA9IDB4MjNhMTsKKyB0WzYzNzI3XSA9IDB4MjNhMjsKKyB0WzYzNzI4XSA9IDB4MjNhMzsKKyB0WzYzNzM3XSA9IDB4MjNhNDsKKyB0WzYzNzM4XSA9IDB4MjNhNTsKKyB0WzYzNzM5XSA9IDB4MjNhNjsKKyB0WzYzNzIzXSA9IDB4MjM5YjsKKyB0WzYzNzI0XSA9IDB4MjM5YzsKKyB0WzYzNzI1XSA9IDB4MjM5ZDsKKyB0WzYzNzM0XSA9IDB4MjM5ZTsKKyB0WzYzNzM1XSA9IDB4MjM5ZjsKKyB0WzYzNzM2XSA9IDB4MjNhMDsKK30pOworZnVuY3Rpb24gbWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXMoY29kZSkgeworIGlmIChjb2RlID49IDB4ZmZmMCAmJiBjb2RlIDw9IDB4ZmZmZikgeworICByZXR1cm4gMDsKKyB9IGVsc2UgaWYgKGNvZGUgPj0gMHhmNjAwICYmIGNvZGUgPD0gMHhmOGZmKSB7CisgIHJldHVybiBnZXRTcGVjaWFsUFVBU3ltYm9scygpW2NvZGVdIHx8IGNvZGU7CisgfSBlbHNlIGlmIChjb2RlID09PSAweDAwYWQpIHsKKyAgcmV0dXJuIDB4MDAyZDsKKyB9CisgcmV0dXJuIGNvZGU7Cit9CitmdW5jdGlvbiBnZXRVbmljb2RlRm9yR2x5cGgobmFtZSwgZ2x5cGhzVW5pY29kZU1hcCkgeworIHZhciB1bmljb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtuYW1lXTsKKyBpZiAodW5pY29kZSAhPT0gdW5kZWZpbmVkKSB7CisgIHJldHVybiB1bmljb2RlOworIH0KKyBpZiAoIW5hbWUpIHsKKyAgcmV0dXJuIC0xOworIH0KKyBpZiAobmFtZVswXSA9PT0gInUiKSB7CisgIHZhciBuYW1lTGVuID0gbmFtZS5sZW5ndGgsIGhleFN0cjsKKyAgaWYgKG5hbWVMZW4gPT09IDcgJiYgbmFtZVsxXSA9PT0gIm4iICYmIG5hbWVbMl0gPT09ICJpIikgeworICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMyk7CisgIH0gZWxzZSBpZiAobmFtZUxlbiA+PSA1ICYmIG5hbWVMZW4gPD0gNykgeworICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMSk7CisgIH0gZWxzZSB7CisgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGhleFN0ciA9PT0gaGV4U3RyLnRvVXBwZXJDYXNlKCkpIHsKKyAgIHVuaWNvZGUgPSBwYXJzZUludChoZXhTdHIsIDE2KTsKKyAgIGlmICh1bmljb2RlID49IDApIHsKKyAgICByZXR1cm4gdW5pY29kZTsKKyAgIH0KKyAgfQorIH0KKyByZXR1cm4gLTE7Cit9Cit2YXIgVW5pY29kZVJhbmdlcyA9IFsKKyB7CisgIGJlZ2luOiAweDAwMDAsCisgIGVuZDogMHgwMDdmCisgfSwKKyB7CisgIGJlZ2luOiAweDAwODAsCisgIGVuZDogMHgwMGZmCisgfSwKKyB7CisgIGJlZ2luOiAweDAxMDAsCisgIGVuZDogMHgwMTdmCisgfSwKKyB7CisgIGJlZ2luOiAweDAxODAsCisgIGVuZDogMHgwMjRmCisgfSwKKyB7CisgIGJlZ2luOiAweDAyNTAsCisgIGVuZDogMHgwMmFmCisgfSwKKyB7CisgIGJlZ2luOiAweDAyYjAsCisgIGVuZDogMHgwMmZmCisgfSwKKyB7CisgIGJlZ2luOiAweDAzMDAsCisgIGVuZDogMHgwMzZmCisgfSwKKyB7CisgIGJlZ2luOiAweDAzNzAsCisgIGVuZDogMHgwM2ZmCisgfSwKKyB7CisgIGJlZ2luOiAweDJjODAsCisgIGVuZDogMHgyY2ZmCisgfSwKKyB7CisgIGJlZ2luOiAweDA0MDAsCisgIGVuZDogMHgwNGZmCisgfSwKKyB7CisgIGJlZ2luOiAweDA1MzAsCisgIGVuZDogMHgwNThmCisgfSwKKyB7CisgIGJlZ2luOiAweDA1OTAsCisgIGVuZDogMHgwNWZmCisgfSwKKyB7CisgIGJlZ2luOiAweGE1MDAsCisgIGVuZDogMHhhNjNmCisgfSwKKyB7CisgIGJlZ2luOiAweDA2MDAsCisgIGVuZDogMHgwNmZmCisgfSwKKyB7CisgIGJlZ2luOiAweDA3YzAsCisgIGVuZDogMHgwN2ZmCisgfSwKKyB7CisgIGJlZ2luOiAweDA5MDAsCisgIGVuZDogMHgwOTdmCisgfSwKKyB7CisgIGJlZ2luOiAweDA5ODAsCisgIGVuZDogMHgwOWZmCisgfSwKKyB7CisgIGJlZ2luOiAweDBhMDAsCisgIGVuZDogMHgwYTdmCisgfSwKKyB7CisgIGJlZ2luOiAweDBhODAsCisgIGVuZDogMHgwYWZmCisgfSwKKyB7CisgIGJlZ2luOiAweDBiMDAsCisgIGVuZDogMHgwYjdmCisgfSwKKyB7CisgIGJlZ2luOiAweDBiODAsCisgIGVuZDogMHgwYmZmCisgfSwKKyB7CisgIGJlZ2luOiAweDBjMDAsCisgIGVuZDogMHgwYzdmCisgfSwKKyB7CisgIGJlZ2luOiAweDBjODAsCisgIGVuZDogMHgwY2ZmCisgfSwKKyB7CisgIGJlZ2luOiAweDBkMDAsCisgIGVuZDogMHgwZDdmCisgfSwKKyB7CisgIGJlZ2luOiAweDBlMDAsCisgIGVuZDogMHgwZTdmCisgfSwKKyB7CisgIGJlZ2luOiAweDBlODAsCisgIGVuZDogMHgwZWZmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwYTAsCisgIGVuZDogMHgxMGZmCisgfSwKKyB7CisgIGJlZ2luOiAweDFiMDAsCisgIGVuZDogMHgxYjdmCisgfSwKKyB7CisgIGJlZ2luOiAweDExMDAsCisgIGVuZDogMHgxMWZmCisgfSwKKyB7CisgIGJlZ2luOiAweDFlMDAsCisgIGVuZDogMHgxZWZmCisgfSwKKyB7CisgIGJlZ2luOiAweDFmMDAsCisgIGVuZDogMHgxZmZmCisgfSwKKyB7CisgIGJlZ2luOiAweDIwMDAsCisgIGVuZDogMHgyMDZmCisgfSwKKyB7CisgIGJlZ2luOiAweDIwNzAsCisgIGVuZDogMHgyMDlmCisgfSwKKyB7CisgIGJlZ2luOiAweDIwYTAsCisgIGVuZDogMHgyMGNmCisgfSwKKyB7CisgIGJlZ2luOiAweDIwZDAsCisgIGVuZDogMHgyMGZmCisgfSwKKyB7CisgIGJlZ2luOiAweDIxMDAsCisgIGVuZDogMHgyMTRmCisgfSwKKyB7CisgIGJlZ2luOiAweDIxNTAsCisgIGVuZDogMHgyMThmCisgfSwKKyB7CisgIGJlZ2luOiAweDIxOTAsCisgIGVuZDogMHgyMWZmCisgfSwKKyB7CisgIGJlZ2luOiAweDIyMDAsCisgIGVuZDogMHgyMmZmCisgfSwKKyB7CisgIGJlZ2luOiAweDIzMDAsCisgIGVuZDogMHgyM2ZmCisgfSwKKyB7CisgIGJlZ2luOiAweDI0MDAsCisgIGVuZDogMHgyNDNmCisgfSwKKyB7CisgIGJlZ2luOiAweDI0NDAsCisgIGVuZDogMHgyNDVmCisgfSwKKyB7CisgIGJlZ2luOiAweDI0NjAsCisgIGVuZDogMHgyNGZmCisgfSwKKyB7CisgIGJlZ2luOiAweDI1MDAsCisgIGVuZDogMHgyNTdmCisgfSwKKyB7CisgIGJlZ2luOiAweDI1ODAsCisgIGVuZDogMHgyNTlmCisgfSwKKyB7CisgIGJlZ2luOiAweDI1YTAsCisgIGVuZDogMHgyNWZmCisgfSwKKyB7CisgIGJlZ2luOiAweDI2MDAsCisgIGVuZDogMHgyNmZmCisgfSwKKyB7CisgIGJlZ2luOiAweDI3MDAsCisgIGVuZDogMHgyN2JmCisgfSwKKyB7CisgIGJlZ2luOiAweDMwMDAsCisgIGVuZDogMHgzMDNmCisgfSwKKyB7CisgIGJlZ2luOiAweDMwNDAsCisgIGVuZDogMHgzMDlmCisgfSwKKyB7CisgIGJlZ2luOiAweDMwYTAsCisgIGVuZDogMHgzMGZmCisgfSwKKyB7CisgIGJlZ2luOiAweDMxMDAsCisgIGVuZDogMHgzMTJmCisgfSwKKyB7CisgIGJlZ2luOiAweDMxMzAsCisgIGVuZDogMHgzMThmCisgfSwKKyB7CisgIGJlZ2luOiAweGE4NDAsCisgIGVuZDogMHhhODdmCisgfSwKKyB7CisgIGJlZ2luOiAweDMyMDAsCisgIGVuZDogMHgzMmZmCisgfSwKKyB7CisgIGJlZ2luOiAweDMzMDAsCisgIGVuZDogMHgzM2ZmCisgfSwKKyB7CisgIGJlZ2luOiAweGFjMDAsCisgIGVuZDogMHhkN2FmCisgfSwKKyB7CisgIGJlZ2luOiAweGQ4MDAsCisgIGVuZDogMHhkZmZmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwOTAwLAorICBlbmQ6IDB4MTA5MWYKKyB9LAorIHsKKyAgYmVnaW46IDB4NGUwMCwKKyAgZW5kOiAweDlmZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZTAwMCwKKyAgZW5kOiAweGY4ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MzFjMCwKKyAgZW5kOiAweDMxZWYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmIwMCwKKyAgZW5kOiAweGZiNGYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmI1MCwKKyAgZW5kOiAweGZkZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmUyMCwKKyAgZW5kOiAweGZlMmYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmUxMCwKKyAgZW5kOiAweGZlMWYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmU1MCwKKyAgZW5kOiAweGZlNmYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmU3MCwKKyAgZW5kOiAweGZlZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmYwMCwKKyAgZW5kOiAweGZmZWYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmZmMCwKKyAgZW5kOiAweGZmZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MGYwMCwKKyAgZW5kOiAweDBmZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDcwMCwKKyAgZW5kOiAweDA3NGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MDc4MCwKKyAgZW5kOiAweDA3YmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MGQ4MCwKKyAgZW5kOiAweDBkZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTAwMCwKKyAgZW5kOiAweDEwOWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTIwMCwKKyAgZW5kOiAweDEzN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MTNhMCwKKyAgZW5kOiAweDEzZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTQwMCwKKyAgZW5kOiAweDE2N2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MTY4MCwKKyAgZW5kOiAweDE2OWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTZhMCwKKyAgZW5kOiAweDE2ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTc4MCwKKyAgZW5kOiAweDE3ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTgwMCwKKyAgZW5kOiAweDE4YWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MjgwMCwKKyAgZW5kOiAweDI4ZmYKKyB9LAorIHsKKyAgYmVnaW46IDB4YTAwMCwKKyAgZW5kOiAweGE0OGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTcwMCwKKyAgZW5kOiAweDE3MWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTAzMDAsCisgIGVuZDogMHgxMDMyZgorIH0sCisgeworICBiZWdpbjogMHgxMDMzMCwKKyAgZW5kOiAweDEwMzRmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwNDAwLAorICBlbmQ6IDB4MTA0NGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWQwMDAsCisgIGVuZDogMHgxZDBmZgorIH0sCisgeworICBiZWdpbjogMHgxZDQwMCwKKyAgZW5kOiAweDFkN2ZmCisgfSwKKyB7CisgIGJlZ2luOiAweGZmMDAwLAorICBlbmQ6IDB4ZmZmZmQKKyB9LAorIHsKKyAgYmVnaW46IDB4ZmUwMCwKKyAgZW5kOiAweGZlMGYKKyB9LAorIHsKKyAgYmVnaW46IDB4ZTAwMDAsCisgIGVuZDogMHhlMDA3ZgorIH0sCisgeworICBiZWdpbjogMHgxOTAwLAorICBlbmQ6IDB4MTk0ZgorIH0sCisgeworICBiZWdpbjogMHgxOTUwLAorICBlbmQ6IDB4MTk3ZgorIH0sCisgeworICBiZWdpbjogMHgxOTgwLAorICBlbmQ6IDB4MTlkZgorIH0sCisgeworICBiZWdpbjogMHgxYTAwLAorICBlbmQ6IDB4MWExZgorIH0sCisgeworICBiZWdpbjogMHgyYzAwLAorICBlbmQ6IDB4MmM1ZgorIH0sCisgeworICBiZWdpbjogMHgyZDMwLAorICBlbmQ6IDB4MmQ3ZgorIH0sCisgeworICBiZWdpbjogMHg0ZGMwLAorICBlbmQ6IDB4NGRmZgorIH0sCisgeworICBiZWdpbjogMHhhODAwLAorICBlbmQ6IDB4YTgyZgorIH0sCisgeworICBiZWdpbjogMHgxMDAwMCwKKyAgZW5kOiAweDEwMDdmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwMTQwLAorICBlbmQ6IDB4MTAxOGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTAzODAsCisgIGVuZDogMHgxMDM5ZgorIH0sCisgeworICBiZWdpbjogMHgxMDNhMCwKKyAgZW5kOiAweDEwM2RmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwNDUwLAorICBlbmQ6IDB4MTA0N2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MTA0ODAsCisgIGVuZDogMHgxMDRhZgorIH0sCisgeworICBiZWdpbjogMHgxMDgwMCwKKyAgZW5kOiAweDEwODNmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwYTAwLAorICBlbmQ6IDB4MTBhNWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWQzMDAsCisgIGVuZDogMHgxZDM1ZgorIH0sCisgeworICBiZWdpbjogMHgxMjAwMCwKKyAgZW5kOiAweDEyM2ZmCisgfSwKKyB7CisgIGJlZ2luOiAweDFkMzYwLAorICBlbmQ6IDB4MWQzN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4MWI4MCwKKyAgZW5kOiAweDFiYmYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWMwMCwKKyAgZW5kOiAweDFjNGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWM1MCwKKyAgZW5kOiAweDFjN2YKKyB9LAorIHsKKyAgYmVnaW46IDB4YTg4MCwKKyAgZW5kOiAweGE4ZGYKKyB9LAorIHsKKyAgYmVnaW46IDB4YTkwMCwKKyAgZW5kOiAweGE5MmYKKyB9LAorIHsKKyAgYmVnaW46IDB4YTkzMCwKKyAgZW5kOiAweGE5NWYKKyB9LAorIHsKKyAgYmVnaW46IDB4YWEwMCwKKyAgZW5kOiAweGFhNWYKKyB9LAorIHsKKyAgYmVnaW46IDB4MTAxOTAsCisgIGVuZDogMHgxMDFjZgorIH0sCisgeworICBiZWdpbjogMHgxMDFkMCwKKyAgZW5kOiAweDEwMWZmCisgfSwKKyB7CisgIGJlZ2luOiAweDEwMmEwLAorICBlbmQ6IDB4MTAyZGYKKyB9LAorIHsKKyAgYmVnaW46IDB4MWYwMzAsCisgIGVuZDogMHgxZjA5ZgorIH0KK107CitmdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodmFsdWUpIHsKKyBmb3IgKHZhciBpID0gMCwgaWkgPSBVbmljb2RlUmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgdmFyIHJhbmdlID0gVW5pY29kZVJhbmdlc1tpXTsKKyAgaWYgKHZhbHVlID49IHJhbmdlLmJlZ2luICYmIHZhbHVlIDwgcmFuZ2UuZW5kKSB7CisgICByZXR1cm4gaTsKKyAgfQorIH0KKyByZXR1cm4gLTE7Cit9CitmdW5jdGlvbiBpc1JUTFJhbmdlRm9yKHZhbHVlKSB7CisgdmFyIHJhbmdlID0gVW5pY29kZVJhbmdlc1sxM107CisgaWYgKHZhbHVlID49IHJhbmdlLmJlZ2luICYmIHZhbHVlIDwgcmFuZ2UuZW5kKSB7CisgIHJldHVybiB0cnVlOworIH0KKyByYW5nZSA9IFVuaWNvZGVSYW5nZXNbMTFdOworIGlmICh2YWx1ZSA+PSByYW5nZS5iZWdpbiAmJiB2YWx1ZSA8IHJhbmdlLmVuZCkgeworICByZXR1cm4gdHJ1ZTsKKyB9CisgcmV0dXJuIGZhbHNlOworfQordmFyIGdldE5vcm1hbGl6ZWRVbmljb2RlcyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgeworIHRbIlx1MDBBOCJdID0gIlx1MDAyMFx1MDMwOCI7CisgdFsiXHUwMEFGIl0gPSAiXHUwMDIwXHUwMzA0IjsKKyB0WyJcdTAwQjQiXSA9ICJcdTAwMjBcdTAzMDEiOworIHRbIlx1MDBCNSJdID0gIlx1MDNCQyI7CisgdFsiXHUwMEI4Il0gPSAiXHUwMDIwXHUwMzI3IjsKKyB0WyJcdTAxMzIiXSA9ICJcdTAwNDlcdTAwNEEiOworIHRbIlx1MDEzMyJdID0gIlx1MDA2OVx1MDA2QSI7CisgdFsiXHUwMTNGIl0gPSAiXHUwMDRDXHUwMEI3IjsKKyB0WyJcdTAxNDAiXSA9ICJcdTAwNkNcdTAwQjciOworIHRbIlx1MDE0OSJdID0gIlx1MDJCQ1x1MDA2RSI7CisgdFsiXHUwMTdGIl0gPSAiXHUwMDczIjsKKyB0WyJcdTAxQzQiXSA9ICJcdTAwNDRcdTAxN0QiOworIHRbIlx1MDFDNSJdID0gIlx1MDA0NFx1MDE3RSI7CisgdFsiXHUwMUM2Il0gPSAiXHUwMDY0XHUwMTdFIjsKKyB0WyJcdTAxQzciXSA9ICJcdTAwNENcdTAwNEEiOworIHRbIlx1MDFDOCJdID0gIlx1MDA0Q1x1MDA2QSI7CisgdFsiXHUwMUM5Il0gPSAiXHUwMDZDXHUwMDZBIjsKKyB0WyJcdTAxQ0EiXSA9ICJcdTAwNEVcdTAwNEEiOworIHRbIlx1MDFDQiJdID0gIlx1MDA0RVx1MDA2QSI7CisgdFsiXHUwMUNDIl0gPSAiXHUwMDZFXHUwMDZBIjsKKyB0WyJcdTAxRjEiXSA9ICJcdTAwNDRcdTAwNUEiOworIHRbIlx1MDFGMiJdID0gIlx1MDA0NFx1MDA3QSI7CisgdFsiXHUwMUYzIl0gPSAiXHUwMDY0XHUwMDdBIjsKKyB0WyJcdTAyRDgiXSA9ICJcdTAwMjBcdTAzMDYiOworIHRbIlx1MDJEOSJdID0gIlx1MDAyMFx1MDMwNyI7CisgdFsiXHUwMkRBIl0gPSAiXHUwMDIwXHUwMzBBIjsKKyB0WyJcdTAyREIiXSA9ICJcdTAwMjBcdTAzMjgiOworIHRbIlx1MDJEQyJdID0gIlx1MDAyMFx1MDMwMyI7CisgdFsiXHUwMkREIl0gPSAiXHUwMDIwXHUwMzBCIjsKKyB0WyJcdTAzN0EiXSA9ICJcdTAwMjBcdTAzNDUiOworIHRbIlx1MDM4NCJdID0gIlx1MDAyMFx1MDMwMSI7CisgdFsiXHUwM0QwIl0gPSAiXHUwM0IyIjsKKyB0WyJcdTAzRDEiXSA9ICJcdTAzQjgiOworIHRbIlx1MDNEMiJdID0gIlx1MDNBNSI7CisgdFsiXHUwM0Q1Il0gPSAiXHUwM0M2IjsKKyB0WyJcdTAzRDYiXSA9ICJcdTAzQzAiOworIHRbIlx1MDNGMCJdID0gIlx1MDNCQSI7CisgdFsiXHUwM0YxIl0gPSAiXHUwM0MxIjsKKyB0WyJcdTAzRjIiXSA9ICJcdTAzQzIiOworIHRbIlx1MDNGNCJdID0gIlx1MDM5OCI7CisgdFsiXHUwM0Y1Il0gPSAiXHUwM0I1IjsKKyB0WyJcdTAzRjkiXSA9ICJcdTAzQTMiOworIHRbIlx1MDU4NyJdID0gIlx1MDU2NVx1MDU4MiI7CisgdFsiXHUwNjc1Il0gPSAiXHUwNjI3XHUwNjc0IjsKKyB0WyJcdTA2NzYiXSA9ICJcdTA2NDhcdTA2NzQiOworIHRbIlx1MDY3NyJdID0gIlx1MDZDN1x1MDY3NCI7CisgdFsiXHUwNjc4Il0gPSAiXHUwNjRBXHUwNjc0IjsKKyB0WyJcdTBFMzMiXSA9ICJcdTBFNERcdTBFMzIiOworIHRbIlx1MEVCMyJdID0gIlx1MEVDRFx1MEVCMiI7CisgdFsiXHUwRURDIl0gPSAiXHUwRUFCXHUwRTk5IjsKKyB0WyJcdTBFREQiXSA9ICJcdTBFQUJcdTBFQTEiOworIHRbIlx1MEY3NyJdID0gIlx1MEZCMlx1MEY4MSI7CisgdFsiXHUwRjc5Il0gPSAiXHUwRkIzXHUwRjgxIjsKKyB0WyJcdTFFOUEiXSA9ICJcdTAwNjFcdTAyQkUiOworIHRbIlx1MUZCRCJdID0gIlx1MDAyMFx1MDMxMyI7CisgdFsiXHUxRkJGIl0gPSAiXHUwMDIwXHUwMzEzIjsKKyB0WyJcdTFGQzAiXSA9ICJcdTAwMjBcdTAzNDIiOworIHRbIlx1MUZGRSJdID0gIlx1MDAyMFx1MDMxNCI7CisgdFsiXHUyMDAyIl0gPSAiXHUwMDIwIjsKKyB0WyJcdTIwMDMiXSA9ICJcdTAwMjAiOworIHRbIlx1MjAwNCJdID0gIlx1MDAyMCI7CisgdFsiXHUyMDA1Il0gPSAiXHUwMDIwIjsKKyB0WyJcdTIwMDYiXSA9ICJcdTAwMjAiOworIHRbIlx1MjAwOCJdID0gIlx1MDAyMCI7CisgdFsiXHUyMDA5Il0gPSAiXHUwMDIwIjsKKyB0WyJcdTIwMEEiXSA9ICJcdTAwMjAiOworIHRbIlx1MjAxNyJdID0gIlx1MDAyMFx1MDMzMyI7CisgdFsiXHUyMDI0Il0gPSAiXHUwMDJFIjsKKyB0WyJcdTIwMjUiXSA9ICJcdTAwMkVcdTAwMkUiOworIHRbIlx1MjAyNiJdID0gIlx1MDAyRVx1MDAyRVx1MDAyRSI7CisgdFsiXHUyMDMzIl0gPSAiXHUyMDMyXHUyMDMyIjsKKyB0WyJcdTIwMzQiXSA9ICJcdTIwMzJcdTIwMzJcdTIwMzIiOworIHRbIlx1MjAzNiJdID0gIlx1MjAzNVx1MjAzNSI7CisgdFsiXHUyMDM3Il0gPSAiXHUyMDM1XHUyMDM1XHUyMDM1IjsKKyB0WyJcdTIwM0MiXSA9ICJcdTAwMjFcdTAwMjEiOworIHRbIlx1MjAzRSJdID0gIlx1MDAyMFx1MDMwNSI7CisgdFsiXHUyMDQ3Il0gPSAiXHUwMDNGXHUwMDNGIjsKKyB0WyJcdTIwNDgiXSA9ICJcdTAwM0ZcdTAwMjEiOworIHRbIlx1MjA0OSJdID0gIlx1MDAyMVx1MDAzRiI7CisgdFsiXHUyMDU3Il0gPSAiXHUyMDMyXHUyMDMyXHUyMDMyXHUyMDMyIjsKKyB0WyJcdTIwNUYiXSA9ICJcdTAwMjAiOworIHRbIlx1MjBBOCJdID0gIlx1MDA1Mlx1MDA3MyI7CisgdFsiXHUyMTAwIl0gPSAiXHUwMDYxXHUwMDJGXHUwMDYzIjsKKyB0WyJcdTIxMDEiXSA9ICJcdTAwNjFcdTAwMkZcdTAwNzMiOworIHRbIlx1MjEwMyJdID0gIlx1MDBCMFx1MDA0MyI7CisgdFsiXHUyMTA1Il0gPSAiXHUwMDYzXHUwMDJGXHUwMDZGIjsKKyB0WyJcdTIxMDYiXSA9ICJcdTAwNjNcdTAwMkZcdTAwNzUiOworIHRbIlx1MjEwNyJdID0gIlx1MDE5MCI7CisgdFsiXHUyMTA5Il0gPSAiXHUwMEIwXHUwMDQ2IjsKKyB0WyJcdTIxMTYiXSA9ICJcdTAwNEVcdTAwNkYiOworIHRbIlx1MjEyMSJdID0gIlx1MDA1NFx1MDA0NVx1MDA0QyI7CisgdFsiXHUyMTM1Il0gPSAiXHUwNUQwIjsKKyB0WyJcdTIxMzYiXSA9ICJcdTA1RDEiOworIHRbIlx1MjEzNyJdID0gIlx1MDVEMiI7CisgdFsiXHUyMTM4Il0gPSAiXHUwNUQzIjsKKyB0WyJcdTIxM0IiXSA9ICJcdTAwNDZcdTAwNDFcdTAwNTgiOworIHRbIlx1MjE2MCJdID0gIlx1MDA0OSI7CisgdFsiXHUyMTYxIl0gPSAiXHUwMDQ5XHUwMDQ5IjsKKyB0WyJcdTIxNjIiXSA9ICJcdTAwNDlcdTAwNDlcdTAwNDkiOworIHRbIlx1MjE2MyJdID0gIlx1MDA0OVx1MDA1NiI7CisgdFsiXHUyMTY0Il0gPSAiXHUwMDU2IjsKKyB0WyJcdTIxNjUiXSA9ICJcdTAwNTZcdTAwNDkiOworIHRbIlx1MjE2NiJdID0gIlx1MDA1Nlx1MDA0OVx1MDA0OSI7CisgdFsiXHUyMTY3Il0gPSAiXHUwMDU2XHUwMDQ5XHUwMDQ5XHUwMDQ5IjsKKyB0WyJcdTIxNjgiXSA9ICJcdTAwNDlcdTAwNTgiOworIHRbIlx1MjE2OSJdID0gIlx1MDA1OCI7CisgdFsiXHUyMTZBIl0gPSAiXHUwMDU4XHUwMDQ5IjsKKyB0WyJcdTIxNkIiXSA9ICJcdTAwNThcdTAwNDlcdTAwNDkiOworIHRbIlx1MjE2QyJdID0gIlx1MDA0QyI7CisgdFsiXHUyMTZEIl0gPSAiXHUwMDQzIjsKKyB0WyJcdTIxNkUiXSA9ICJcdTAwNDQiOworIHRbIlx1MjE2RiJdID0gIlx1MDA0RCI7CisgdFsiXHUyMTcwIl0gPSAiXHUwMDY5IjsKKyB0WyJcdTIxNzEiXSA9ICJcdTAwNjlcdTAwNjkiOworIHRbIlx1MjE3MiJdID0gIlx1MDA2OVx1MDA2OVx1MDA2OSI7CisgdFsiXHUyMTczIl0gPSAiXHUwMDY5XHUwMDc2IjsKKyB0WyJcdTIxNzQiXSA9ICJcdTAwNzYiOworIHRbIlx1MjE3NSJdID0gIlx1MDA3Nlx1MDA2OSI7CisgdFsiXHUyMTc2Il0gPSAiXHUwMDc2XHUwMDY5XHUwMDY5IjsKKyB0WyJcdTIxNzciXSA9ICJcdTAwNzZcdTAwNjlcdTAwNjlcdTAwNjkiOworIHRbIlx1MjE3OCJdID0gIlx1MDA2OVx1MDA3OCI7CisgdFsiXHUyMTc5Il0gPSAiXHUwMDc4IjsKKyB0WyJcdTIxN0EiXSA9ICJcdTAwNzhcdTAwNjkiOworIHRbIlx1MjE3QiJdID0gIlx1MDA3OFx1MDA2OVx1MDA2OSI7CisgdFsiXHUyMTdDIl0gPSAiXHUwMDZDIjsKKyB0WyJcdTIxN0QiXSA9ICJcdTAwNjMiOworIHRbIlx1MjE3RSJdID0gIlx1MDA2NCI7CisgdFsiXHUyMTdGIl0gPSAiXHUwMDZEIjsKKyB0WyJcdTIyMkMiXSA9ICJcdTIyMkJcdTIyMkIiOworIHRbIlx1MjIyRCJdID0gIlx1MjIyQlx1MjIyQlx1MjIyQiI7CisgdFsiXHUyMjJGIl0gPSAiXHUyMjJFXHUyMjJFIjsKKyB0WyJcdTIyMzAiXSA9ICJcdTIyMkVcdTIyMkVcdTIyMkUiOworIHRbIlx1MjQ3NCJdID0gIlx1MDAyOFx1MDAzMVx1MDAyOSI7CisgdFsiXHUyNDc1Il0gPSAiXHUwMDI4XHUwMDMyXHUwMDI5IjsKKyB0WyJcdTI0NzYiXSA9ICJcdTAwMjhcdTAwMzNcdTAwMjkiOworIHRbIlx1MjQ3NyJdID0gIlx1MDAyOFx1MDAzNFx1MDAyOSI7CisgdFsiXHUyNDc4Il0gPSAiXHUwMDI4XHUwMDM1XHUwMDI5IjsKKyB0WyJcdTI0NzkiXSA9ICJcdTAwMjhcdTAwMzZcdTAwMjkiOworIHRbIlx1MjQ3QSJdID0gIlx1MDAyOFx1MDAzN1x1MDAyOSI7CisgdFsiXHUyNDdCIl0gPSAiXHUwMDI4XHUwMDM4XHUwMDI5IjsKKyB0WyJcdTI0N0MiXSA9ICJcdTAwMjhcdTAwMzlcdTAwMjkiOworIHRbIlx1MjQ3RCJdID0gIlx1MDAyOFx1MDAzMVx1MDAzMFx1MDAyOSI7CisgdFsiXHUyNDdFIl0gPSAiXHUwMDI4XHUwMDMxXHUwMDMxXHUwMDI5IjsKKyB0WyJcdTI0N0YiXSA9ICJcdTAwMjhcdTAwMzFcdTAwMzJcdTAwMjkiOworIHRbIlx1MjQ4MCJdID0gIlx1MDAyOFx1MDAzMVx1MDAzM1x1MDAyOSI7CisgdFsiXHUyNDgxIl0gPSAiXHUwMDI4XHUwMDMxXHUwMDM0XHUwMDI5IjsKKyB0WyJcdTI0ODIiXSA9ICJcdTAwMjhcdTAwMzFcdTAwMzVcdTAwMjkiOworIHRbIlx1MjQ4MyJdID0gIlx1MDAyOFx1MDAzMVx1MDAzNlx1MDAyOSI7CisgdFsiXHUyNDg0Il0gPSAiXHUwMDI4XHUwMDMxXHUwMDM3XHUwMDI5IjsKKyB0WyJcdTI0ODUiXSA9ICJcdTAwMjhcdTAwMzFcdTAwMzhcdTAwMjkiOworIHRbIlx1MjQ4NiJdID0gIlx1MDAyOFx1MDAzMVx1MDAzOVx1MDAyOSI7CisgdFsiXHUyNDg3Il0gPSAiXHUwMDI4XHUwMDMyXHUwMDMwXHUwMDI5IjsKKyB0WyJcdTI0ODgiXSA9ICJcdTAwMzFcdTAwMkUiOworIHRbIlx1MjQ4OSJdID0gIlx1MDAzMlx1MDAyRSI7CisgdFsiXHUyNDhBIl0gPSAiXHUwMDMzXHUwMDJFIjsKKyB0WyJcdTI0OEIiXSA9ICJcdTAwMzRcdTAwMkUiOworIHRbIlx1MjQ4QyJdID0gIlx1MDAzNVx1MDAyRSI7CisgdFsiXHUyNDhEIl0gPSAiXHUwMDM2XHUwMDJFIjsKKyB0WyJcdTI0OEUiXSA9ICJcdTAwMzdcdTAwMkUiOworIHRbIlx1MjQ4RiJdID0gIlx1MDAzOFx1MDAyRSI7CisgdFsiXHUyNDkwIl0gPSAiXHUwMDM5XHUwMDJFIjsKKyB0WyJcdTI0OTEiXSA9ICJcdTAwMzFcdTAwMzBcdTAwMkUiOworIHRbIlx1MjQ5MiJdID0gIlx1MDAzMVx1MDAzMVx1MDAyRSI7CisgdFsiXHUyNDkzIl0gPSAiXHUwMDMxXHUwMDMyXHUwMDJFIjsKKyB0WyJcdTI0OTQiXSA9ICJcdTAwMzFcdTAwMzNcdTAwMkUiOworIHRbIlx1MjQ5NSJdID0gIlx1MDAzMVx1MDAzNFx1MDAyRSI7CisgdFsiXHUyNDk2Il0gPSAiXHUwMDMxXHUwMDM1XHUwMDJFIjsKKyB0WyJcdTI0OTciXSA9ICJcdTAwMzFcdTAwMzZcdTAwMkUiOworIHRbIlx1MjQ5OCJdID0gIlx1MDAzMVx1MDAzN1x1MDAyRSI7CisgdFsiXHUyNDk5Il0gPSAiXHUwMDMxXHUwMDM4XHUwMDJFIjsKKyB0WyJcdTI0OUEiXSA9ICJcdTAwMzFcdTAwMzlcdTAwMkUiOworIHRbIlx1MjQ5QiJdID0gIlx1MDAzMlx1MDAzMFx1MDAyRSI7CisgdFsiXHUyNDlDIl0gPSAiXHUwMDI4XHUwMDYxXHUwMDI5IjsKKyB0WyJcdTI0OUQiXSA9ICJcdTAwMjhcdTAwNjJcdTAwMjkiOworIHRbIlx1MjQ5RSJdID0gIlx1MDAyOFx1MDA2M1x1MDAyOSI7CisgdFsiXHUyNDlGIl0gPSAiXHUwMDI4XHUwMDY0XHUwMDI5IjsKKyB0WyJcdTI0QTAiXSA9ICJcdTAwMjhcdTAwNjVcdTAwMjkiOworIHRbIlx1MjRBMSJdID0gIlx1MDAyOFx1MDA2Nlx1MDAyOSI7CisgdFsiXHUyNEEyIl0gPSAiXHUwMDI4XHUwMDY3XHUwMDI5IjsKKyB0WyJcdTI0QTMiXSA9ICJcdTAwMjhcdTAwNjhcdTAwMjkiOworIHRbIlx1MjRBNCJdID0gIlx1MDAyOFx1MDA2OVx1MDAyOSI7CisgdFsiXHUyNEE1Il0gPSAiXHUwMDI4XHUwMDZBXHUwMDI5IjsKKyB0WyJcdTI0QTYiXSA9ICJcdTAwMjhcdTAwNkJcdTAwMjkiOworIHRbIlx1MjRBNyJdID0gIlx1MDAyOFx1MDA2Q1x1MDAyOSI7CisgdFsiXHUyNEE4Il0gPSAiXHUwMDI4XHUwMDZEXHUwMDI5IjsKKyB0WyJcdTI0QTkiXSA9ICJcdTAwMjhcdTAwNkVcdTAwMjkiOworIHRbIlx1MjRBQSJdID0gIlx1MDAyOFx1MDA2Rlx1MDAyOSI7CisgdFsiXHUyNEFCIl0gPSAiXHUwMDI4XHUwMDcwXHUwMDI5IjsKKyB0WyJcdTI0QUMiXSA9ICJcdTAwMjhcdTAwNzFcdTAwMjkiOworIHRbIlx1MjRBRCJdID0gIlx1MDAyOFx1MDA3Mlx1MDAyOSI7CisgdFsiXHUyNEFFIl0gPSAiXHUwMDI4XHUwMDczXHUwMDI5IjsKKyB0WyJcdTI0QUYiXSA9ICJcdTAwMjhcdTAwNzRcdTAwMjkiOworIHRbIlx1MjRCMCJdID0gIlx1MDAyOFx1MDA3NVx1MDAyOSI7CisgdFsiXHUyNEIxIl0gPSAiXHUwMDI4XHUwMDc2XHUwMDI5IjsKKyB0WyJcdTI0QjIiXSA9ICJcdTAwMjhcdTAwNzdcdTAwMjkiOworIHRbIlx1MjRCMyJdID0gIlx1MDAyOFx1MDA3OFx1MDAyOSI7CisgdFsiXHUyNEI0Il0gPSAiXHUwMDI4XHUwMDc5XHUwMDI5IjsKKyB0WyJcdTI0QjUiXSA9ICJcdTAwMjhcdTAwN0FcdTAwMjkiOworIHRbIlx1MkEwQyJdID0gIlx1MjIyQlx1MjIyQlx1MjIyQlx1MjIyQiI7CisgdFsiXHUyQTc0Il0gPSAiXHUwMDNBXHUwMDNBXHUwMDNEIjsKKyB0WyJcdTJBNzUiXSA9ICJcdTAwM0RcdTAwM0QiOworIHRbIlx1MkE3NiJdID0gIlx1MDAzRFx1MDAzRFx1MDAzRCI7CisgdFsiXHUyRTlGIl0gPSAiXHU2QkNEIjsKKyB0WyJcdTJFRjMiXSA9ICJcdTlGOUYiOworIHRbIlx1MkYwMCJdID0gIlx1NEUwMCI7CisgdFsiXHUyRjAxIl0gPSAiXHU0RTI4IjsKKyB0WyJcdTJGMDIiXSA9ICJcdTRFMzYiOworIHRbIlx1MkYwMyJdID0gIlx1NEUzRiI7CisgdFsiXHUyRjA0Il0gPSAiXHU0RTU5IjsKKyB0WyJcdTJGMDUiXSA9ICJcdTRFODUiOworIHRbIlx1MkYwNiJdID0gIlx1NEU4QyI7CisgdFsiXHUyRjA3Il0gPSAiXHU0RUEwIjsKKyB0WyJcdTJGMDgiXSA9ICJcdTRFQkEiOworIHRbIlx1MkYwOSJdID0gIlx1NTEzRiI7CisgdFsiXHUyRjBBIl0gPSAiXHU1MTY1IjsKKyB0WyJcdTJGMEIiXSA9ICJcdTUxNkIiOworIHRbIlx1MkYwQyJdID0gIlx1NTE4MiI7CisgdFsiXHUyRjBEIl0gPSAiXHU1MTk2IjsKKyB0WyJcdTJGMEUiXSA9ICJcdTUxQUIiOworIHRbIlx1MkYwRiJdID0gIlx1NTFFMCI7CisgdFsiXHUyRjEwIl0gPSAiXHU1MUY1IjsKKyB0WyJcdTJGMTEiXSA9ICJcdTUyMDAiOworIHRbIlx1MkYxMiJdID0gIlx1NTI5QiI7CisgdFsiXHUyRjEzIl0gPSAiXHU1MkY5IjsKKyB0WyJcdTJGMTQiXSA9ICJcdTUzMTUiOworIHRbIlx1MkYxNSJdID0gIlx1NTMxQSI7CisgdFsiXHUyRjE2Il0gPSAiXHU1MzM4IjsKKyB0WyJcdTJGMTciXSA9ICJcdTUzNDEiOworIHRbIlx1MkYxOCJdID0gIlx1NTM1QyI7CisgdFsiXHUyRjE5Il0gPSAiXHU1MzY5IjsKKyB0WyJcdTJGMUEiXSA9ICJcdTUzODIiOworIHRbIlx1MkYxQiJdID0gIlx1NTNCNiI7CisgdFsiXHUyRjFDIl0gPSAiXHU1M0M4IjsKKyB0WyJcdTJGMUQiXSA9ICJcdTUzRTMiOworIHRbIlx1MkYxRSJdID0gIlx1NTZENyI7CisgdFsiXHUyRjFGIl0gPSAiXHU1NzFGIjsKKyB0WyJcdTJGMjAiXSA9ICJcdTU4RUIiOworIHRbIlx1MkYyMSJdID0gIlx1NTkwMiI7CisgdFsiXHUyRjIyIl0gPSAiXHU1OTBBIjsKKyB0WyJcdTJGMjMiXSA9ICJcdTU5MTUiOworIHRbIlx1MkYyNCJdID0gIlx1NTkyNyI7CisgdFsiXHUyRjI1Il0gPSAiXHU1OTczIjsKKyB0WyJcdTJGMjYiXSA9ICJcdTVCNTAiOworIHRbIlx1MkYyNyJdID0gIlx1NUI4MCI7CisgdFsiXHUyRjI4Il0gPSAiXHU1QkY4IjsKKyB0WyJcdTJGMjkiXSA9ICJcdTVDMEYiOworIHRbIlx1MkYyQSJdID0gIlx1NUMyMiI7CisgdFsiXHUyRjJCIl0gPSAiXHU1QzM4IjsKKyB0WyJcdTJGMkMiXSA9ICJcdTVDNkUiOworIHRbIlx1MkYyRCJdID0gIlx1NUM3MSI7CisgdFsiXHUyRjJFIl0gPSAiXHU1RERCIjsKKyB0WyJcdTJGMkYiXSA9ICJcdTVERTUiOworIHRbIlx1MkYzMCJdID0gIlx1NURGMSI7CisgdFsiXHUyRjMxIl0gPSAiXHU1REZFIjsKKyB0WyJcdTJGMzIiXSA9ICJcdTVFNzIiOworIHRbIlx1MkYzMyJdID0gIlx1NUU3QSI7CisgdFsiXHUyRjM0Il0gPSAiXHU1RTdGIjsKKyB0WyJcdTJGMzUiXSA9ICJcdTVFRjQiOworIHRbIlx1MkYzNiJdID0gIlx1NUVGRSI7CisgdFsiXHUyRjM3Il0gPSAiXHU1RjBCIjsKKyB0WyJcdTJGMzgiXSA9ICJcdTVGMTMiOworIHRbIlx1MkYzOSJdID0gIlx1NUY1MCI7CisgdFsiXHUyRjNBIl0gPSAiXHU1RjYxIjsKKyB0WyJcdTJGM0IiXSA9ICJcdTVGNzMiOworIHRbIlx1MkYzQyJdID0gIlx1NUZDMyI7CisgdFsiXHUyRjNEIl0gPSAiXHU2MjA4IjsKKyB0WyJcdTJGM0UiXSA9ICJcdTYyMzYiOworIHRbIlx1MkYzRiJdID0gIlx1NjI0QiI7CisgdFsiXHUyRjQwIl0gPSAiXHU2NTJGIjsKKyB0WyJcdTJGNDEiXSA9ICJcdTY1MzQiOworIHRbIlx1MkY0MiJdID0gIlx1NjU4NyI7CisgdFsiXHUyRjQzIl0gPSAiXHU2NTk3IjsKKyB0WyJcdTJGNDQiXSA9ICJcdTY1QTQiOworIHRbIlx1MkY0NSJdID0gIlx1NjVCOSI7CisgdFsiXHUyRjQ2Il0gPSAiXHU2NUUwIjsKKyB0WyJcdTJGNDciXSA9ICJcdTY1RTUiOworIHRbIlx1MkY0OCJdID0gIlx1NjZGMCI7CisgdFsiXHUyRjQ5Il0gPSAiXHU2NzA4IjsKKyB0WyJcdTJGNEEiXSA9ICJcdTY3MjgiOworIHRbIlx1MkY0QiJdID0gIlx1NkIyMCI7CisgdFsiXHUyRjRDIl0gPSAiXHU2QjYyIjsKKyB0WyJcdTJGNEQiXSA9ICJcdTZCNzkiOworIHRbIlx1MkY0RSJdID0gIlx1NkJCMyI7CisgdFsiXHUyRjRGIl0gPSAiXHU2QkNCIjsKKyB0WyJcdTJGNTAiXSA9ICJcdTZCRDQiOworIHRbIlx1MkY1MSJdID0gIlx1NkJEQiI7CisgdFsiXHUyRjUyIl0gPSAiXHU2QzBGIjsKKyB0WyJcdTJGNTMiXSA9ICJcdTZDMTQiOworIHRbIlx1MkY1NCJdID0gIlx1NkMzNCI7CisgdFsiXHUyRjU1Il0gPSAiXHU3MDZCIjsKKyB0WyJcdTJGNTYiXSA9ICJcdTcyMkEiOworIHRbIlx1MkY1NyJdID0gIlx1NzIzNiI7CisgdFsiXHUyRjU4Il0gPSAiXHU3MjNCIjsKKyB0WyJcdTJGNTkiXSA9ICJcdTcyM0YiOworIHRbIlx1MkY1QSJdID0gIlx1NzI0NyI7CisgdFsiXHUyRjVCIl0gPSAiXHU3MjU5IjsKKyB0WyJcdTJGNUMiXSA9ICJcdTcyNUIiOworIHRbIlx1MkY1RCJdID0gIlx1NzJBQyI7CisgdFsiXHUyRjVFIl0gPSAiXHU3Mzg0IjsKKyB0WyJcdTJGNUYiXSA9ICJcdTczODkiOworIHRbIlx1MkY2MCJdID0gIlx1NzREQyI7CisgdFsiXHUyRjYxIl0gPSAiXHU3NEU2IjsKKyB0WyJcdTJGNjIiXSA9ICJcdTc1MTgiOworIHRbIlx1MkY2MyJdID0gIlx1NzUxRiI7CisgdFsiXHUyRjY0Il0gPSAiXHU3NTI4IjsKKyB0WyJcdTJGNjUiXSA9ICJcdTc1MzAiOworIHRbIlx1MkY2NiJdID0gIlx1NzU4QiI7CisgdFsiXHUyRjY3Il0gPSAiXHU3NTkyIjsKKyB0WyJcdTJGNjgiXSA9ICJcdTc2NzYiOworIHRbIlx1MkY2OSJdID0gIlx1NzY3RCI7CisgdFsiXHUyRjZBIl0gPSAiXHU3NkFFIjsKKyB0WyJcdTJGNkIiXSA9ICJcdTc2QkYiOworIHRbIlx1MkY2QyJdID0gIlx1NzZFRSI7CisgdFsiXHUyRjZEIl0gPSAiXHU3N0RCIjsKKyB0WyJcdTJGNkUiXSA9ICJcdTc3RTIiOworIHRbIlx1MkY2RiJdID0gIlx1NzdGMyI7CisgdFsiXHUyRjcwIl0gPSAiXHU3OTNBIjsKKyB0WyJcdTJGNzEiXSA9ICJcdTc5QjgiOworIHRbIlx1MkY3MiJdID0gIlx1NzlCRSI7CisgdFsiXHUyRjczIl0gPSAiXHU3QTc0IjsKKyB0WyJcdTJGNzQiXSA9ICJcdTdBQ0IiOworIHRbIlx1MkY3NSJdID0gIlx1N0FGOSI7CisgdFsiXHUyRjc2Il0gPSAiXHU3QzczIjsKKyB0WyJcdTJGNzciXSA9ICJcdTdDRjgiOworIHRbIlx1MkY3OCJdID0gIlx1N0YzNiI7CisgdFsiXHUyRjc5Il0gPSAiXHU3RjUxIjsKKyB0WyJcdTJGN0EiXSA9ICJcdTdGOEEiOworIHRbIlx1MkY3QiJdID0gIlx1N0ZCRCI7CisgdFsiXHUyRjdDIl0gPSAiXHU4MDAxIjsKKyB0WyJcdTJGN0QiXSA9ICJcdTgwMEMiOworIHRbIlx1MkY3RSJdID0gIlx1ODAxMiI7CisgdFsiXHUyRjdGIl0gPSAiXHU4MDMzIjsKKyB0WyJcdTJGODAiXSA9ICJcdTgwN0YiOworIHRbIlx1MkY4MSJdID0gIlx1ODA4OSI7CisgdFsiXHUyRjgyIl0gPSAiXHU4MUUzIjsKKyB0WyJcdTJGODMiXSA9ICJcdTgxRUEiOworIHRbIlx1MkY4NCJdID0gIlx1ODFGMyI7CisgdFsiXHUyRjg1Il0gPSAiXHU4MUZDIjsKKyB0WyJcdTJGODYiXSA9ICJcdTgyMEMiOworIHRbIlx1MkY4NyJdID0gIlx1ODIxQiI7CisgdFsiXHUyRjg4Il0gPSAiXHU4MjFGIjsKKyB0WyJcdTJGODkiXSA9ICJcdTgyNkUiOworIHRbIlx1MkY4QSJdID0gIlx1ODI3MiI7CisgdFsiXHUyRjhCIl0gPSAiXHU4Mjc4IjsKKyB0WyJcdTJGOEMiXSA9ICJcdTg2NEQiOworIHRbIlx1MkY4RCJdID0gIlx1ODY2QiI7CisgdFsiXHUyRjhFIl0gPSAiXHU4ODQwIjsKKyB0WyJcdTJGOEYiXSA9ICJcdTg4NEMiOworIHRbIlx1MkY5MCJdID0gIlx1ODg2MyI7CisgdFsiXHUyRjkxIl0gPSAiXHU4OTdFIjsKKyB0WyJcdTJGOTIiXSA9ICJcdTg5OEIiOworIHRbIlx1MkY5MyJdID0gIlx1ODlEMiI7CisgdFsiXHUyRjk0Il0gPSAiXHU4QTAwIjsKKyB0WyJcdTJGOTUiXSA9ICJcdThDMzciOworIHRbIlx1MkY5NiJdID0gIlx1OEM0NiI7CisgdFsiXHUyRjk3Il0gPSAiXHU4QzU1IjsKKyB0WyJcdTJGOTgiXSA9ICJcdThDNzgiOworIHRbIlx1MkY5OSJdID0gIlx1OEM5RCI7CisgdFsiXHUyRjlBIl0gPSAiXHU4RDY0IjsKKyB0WyJcdTJGOUIiXSA9ICJcdThENzAiOworIHRbIlx1MkY5QyJdID0gIlx1OERCMyI7CisgdFsiXHUyRjlEIl0gPSAiXHU4RUFCIjsKKyB0WyJcdTJGOUUiXSA9ICJcdThFQ0EiOworIHRbIlx1MkY5RiJdID0gIlx1OEY5QiI7CisgdFsiXHUyRkEwIl0gPSAiXHU4RkIwIjsKKyB0WyJcdTJGQTEiXSA9ICJcdThGQjUiOworIHRbIlx1MkZBMiJdID0gIlx1OTA5MSI7CisgdFsiXHUyRkEzIl0gPSAiXHU5MTQ5IjsKKyB0WyJcdTJGQTQiXSA9ICJcdTkxQzYiOworIHRbIlx1MkZBNSJdID0gIlx1OTFDQyI7CisgdFsiXHUyRkE2Il0gPSAiXHU5MUQxIjsKKyB0WyJcdTJGQTciXSA9ICJcdTk1NzciOworIHRbIlx1MkZBOCJdID0gIlx1OTU4MCI7CisgdFsiXHUyRkE5Il0gPSAiXHU5NjFDIjsKKyB0WyJcdTJGQUEiXSA9ICJcdTk2QjYiOworIHRbIlx1MkZBQiJdID0gIlx1OTZCOSI7CisgdFsiXHUyRkFDIl0gPSAiXHU5NkU4IjsKKyB0WyJcdTJGQUQiXSA9ICJcdTk3NTEiOworIHRbIlx1MkZBRSJdID0gIlx1OTc1RSI7CisgdFsiXHUyRkFGIl0gPSAiXHU5NzYyIjsKKyB0WyJcdTJGQjAiXSA9ICJcdTk3NjkiOworIHRbIlx1MkZCMSJdID0gIlx1OTdDQiI7CisgdFsiXHUyRkIyIl0gPSAiXHU5N0VEIjsKKyB0WyJcdTJGQjMiXSA9ICJcdTk3RjMiOworIHRbIlx1MkZCNCJdID0gIlx1OTgwMSI7CisgdFsiXHUyRkI1Il0gPSAiXHU5OEE4IjsKKyB0WyJcdTJGQjYiXSA9ICJcdTk4REIiOworIHRbIlx1MkZCNyJdID0gIlx1OThERiI7CisgdFsiXHUyRkI4Il0gPSAiXHU5OTk2IjsKKyB0WyJcdTJGQjkiXSA9ICJcdTk5OTkiOworIHRbIlx1MkZCQSJdID0gIlx1OTlBQyI7CisgdFsiXHUyRkJCIl0gPSAiXHU5QUE4IjsKKyB0WyJcdTJGQkMiXSA9ICJcdTlBRDgiOworIHRbIlx1MkZCRCJdID0gIlx1OUFERiI7CisgdFsiXHUyRkJFIl0gPSAiXHU5QjI1IjsKKyB0WyJcdTJGQkYiXSA9ICJcdTlCMkYiOworIHRbIlx1MkZDMCJdID0gIlx1OUIzMiI7CisgdFsiXHUyRkMxIl0gPSAiXHU5QjNDIjsKKyB0WyJcdTJGQzIiXSA9ICJcdTlCNUEiOworIHRbIlx1MkZDMyJdID0gIlx1OUNFNSI7CisgdFsiXHUyRkM0Il0gPSAiXHU5RTc1IjsKKyB0WyJcdTJGQzUiXSA9ICJcdTlFN0YiOworIHRbIlx1MkZDNiJdID0gIlx1OUVBNSI7CisgdFsiXHUyRkM3Il0gPSAiXHU5RUJCIjsKKyB0WyJcdTJGQzgiXSA9ICJcdTlFQzMiOworIHRbIlx1MkZDOSJdID0gIlx1OUVDRCI7CisgdFsiXHUyRkNBIl0gPSAiXHU5RUQxIjsKKyB0WyJcdTJGQ0IiXSA9ICJcdTlFRjkiOworIHRbIlx1MkZDQyJdID0gIlx1OUVGRCI7CisgdFsiXHUyRkNEIl0gPSAiXHU5RjBFIjsKKyB0WyJcdTJGQ0UiXSA9ICJcdTlGMTMiOworIHRbIlx1MkZDRiJdID0gIlx1OUYyMCI7CisgdFsiXHUyRkQwIl0gPSAiXHU5RjNCIjsKKyB0WyJcdTJGRDEiXSA9ICJcdTlGNEEiOworIHRbIlx1MkZEMiJdID0gIlx1OUY1MiI7CisgdFsiXHUyRkQzIl0gPSAiXHU5RjhEIjsKKyB0WyJcdTJGRDQiXSA9ICJcdTlGOUMiOworIHRbIlx1MkZENSJdID0gIlx1OUZBMCI7CisgdFsiXHUzMDM2Il0gPSAiXHUzMDEyIjsKKyB0WyJcdTMwMzgiXSA9ICJcdTUzNDEiOworIHRbIlx1MzAzOSJdID0gIlx1NTM0NCI7CisgdFsiXHUzMDNBIl0gPSAiXHU1MzQ1IjsKKyB0WyJcdTMwOUIiXSA9ICJcdTAwMjBcdTMwOTkiOworIHRbIlx1MzA5QyJdID0gIlx1MDAyMFx1MzA5QSI7CisgdFsiXHUzMTMxIl0gPSAiXHUxMTAwIjsKKyB0WyJcdTMxMzIiXSA9ICJcdTExMDEiOworIHRbIlx1MzEzMyJdID0gIlx1MTFBQSI7CisgdFsiXHUzMTM0Il0gPSAiXHUxMTAyIjsKKyB0WyJcdTMxMzUiXSA9ICJcdTExQUMiOworIHRbIlx1MzEzNiJdID0gIlx1MTFBRCI7CisgdFsiXHUzMTM3Il0gPSAiXHUxMTAzIjsKKyB0WyJcdTMxMzgiXSA9ICJcdTExMDQiOworIHRbIlx1MzEzOSJdID0gIlx1MTEwNSI7CisgdFsiXHUzMTNBIl0gPSAiXHUxMUIwIjsKKyB0WyJcdTMxM0IiXSA9ICJcdTExQjEiOworIHRbIlx1MzEzQyJdID0gIlx1MTFCMiI7CisgdFsiXHUzMTNEIl0gPSAiXHUxMUIzIjsKKyB0WyJcdTMxM0UiXSA9ICJcdTExQjQiOworIHRbIlx1MzEzRiJdID0gIlx1MTFCNSI7CisgdFsiXHUzMTQwIl0gPSAiXHUxMTFBIjsKKyB0WyJcdTMxNDEiXSA9ICJcdTExMDYiOworIHRbIlx1MzE0MiJdID0gIlx1MTEwNyI7CisgdFsiXHUzMTQzIl0gPSAiXHUxMTA4IjsKKyB0WyJcdTMxNDQiXSA9ICJcdTExMjEiOworIHRbIlx1MzE0NSJdID0gIlx1MTEwOSI7CisgdFsiXHUzMTQ2Il0gPSAiXHUxMTBBIjsKKyB0WyJcdTMxNDciXSA9ICJcdTExMEIiOworIHRbIlx1MzE0OCJdID0gIlx1MTEwQyI7CisgdFsiXHUzMTQ5Il0gPSAiXHUxMTBEIjsKKyB0WyJcdTMxNEEiXSA9ICJcdTExMEUiOworIHRbIlx1MzE0QiJdID0gIlx1MTEwRiI7CisgdFsiXHUzMTRDIl0gPSAiXHUxMTEwIjsKKyB0WyJcdTMxNEQiXSA9ICJcdTExMTEiOworIHRbIlx1MzE0RSJdID0gIlx1MTExMiI7CisgdFsiXHUzMTRGIl0gPSAiXHUxMTYxIjsKKyB0WyJcdTMxNTAiXSA9ICJcdTExNjIiOworIHRbIlx1MzE1MSJdID0gIlx1MTE2MyI7CisgdFsiXHUzMTUyIl0gPSAiXHUxMTY0IjsKKyB0WyJcdTMxNTMiXSA9ICJcdTExNjUiOworIHRbIlx1MzE1NCJdID0gIlx1MTE2NiI7CisgdFsiXHUzMTU1Il0gPSAiXHUxMTY3IjsKKyB0WyJcdTMxNTYiXSA9ICJcdTExNjgiOworIHRbIlx1MzE1NyJdID0gIlx1MTE2OSI7CisgdFsiXHUzMTU4Il0gPSAiXHUxMTZBIjsKKyB0WyJcdTMxNTkiXSA9ICJcdTExNkIiOworIHRbIlx1MzE1QSJdID0gIlx1MTE2QyI7CisgdFsiXHUzMTVCIl0gPSAiXHUxMTZEIjsKKyB0WyJcdTMxNUMiXSA9ICJcdTExNkUiOworIHRbIlx1MzE1RCJdID0gIlx1MTE2RiI7CisgdFsiXHUzMTVFIl0gPSAiXHUxMTcwIjsKKyB0WyJcdTMxNUYiXSA9ICJcdTExNzEiOworIHRbIlx1MzE2MCJdID0gIlx1MTE3MiI7CisgdFsiXHUzMTYxIl0gPSAiXHUxMTczIjsKKyB0WyJcdTMxNjIiXSA9ICJcdTExNzQiOworIHRbIlx1MzE2MyJdID0gIlx1MTE3NSI7CisgdFsiXHUzMTY0Il0gPSAiXHUxMTYwIjsKKyB0WyJcdTMxNjUiXSA9ICJcdTExMTQiOworIHRbIlx1MzE2NiJdID0gIlx1MTExNSI7CisgdFsiXHUzMTY3Il0gPSAiXHUxMUM3IjsKKyB0WyJcdTMxNjgiXSA9ICJcdTExQzgiOworIHRbIlx1MzE2OSJdID0gIlx1MTFDQyI7CisgdFsiXHUzMTZBIl0gPSAiXHUxMUNFIjsKKyB0WyJcdTMxNkIiXSA9ICJcdTExRDMiOworIHRbIlx1MzE2QyJdID0gIlx1MTFENyI7CisgdFsiXHUzMTZEIl0gPSAiXHUxMUQ5IjsKKyB0WyJcdTMxNkUiXSA9ICJcdTExMUMiOworIHRbIlx1MzE2RiJdID0gIlx1MTFERCI7CisgdFsiXHUzMTcwIl0gPSAiXHUxMURGIjsKKyB0WyJcdTMxNzEiXSA9ICJcdTExMUQiOworIHRbIlx1MzE3MiJdID0gIlx1MTExRSI7CisgdFsiXHUzMTczIl0gPSAiXHUxMTIwIjsKKyB0WyJcdTMxNzQiXSA9ICJcdTExMjIiOworIHRbIlx1MzE3NSJdID0gIlx1MTEyMyI7CisgdFsiXHUzMTc2Il0gPSAiXHUxMTI3IjsKKyB0WyJcdTMxNzciXSA9ICJcdTExMjkiOworIHRbIlx1MzE3OCJdID0gIlx1MTEyQiI7CisgdFsiXHUzMTc5Il0gPSAiXHUxMTJDIjsKKyB0WyJcdTMxN0EiXSA9ICJcdTExMkQiOworIHRbIlx1MzE3QiJdID0gIlx1MTEyRSI7CisgdFsiXHUzMTdDIl0gPSAiXHUxMTJGIjsKKyB0WyJcdTMxN0QiXSA9ICJcdTExMzIiOworIHRbIlx1MzE3RSJdID0gIlx1MTEzNiI7CisgdFsiXHUzMTdGIl0gPSAiXHUxMTQwIjsKKyB0WyJcdTMxODAiXSA9ICJcdTExNDciOworIHRbIlx1MzE4MSJdID0gIlx1MTE0QyI7CisgdFsiXHUzMTgyIl0gPSAiXHUxMUYxIjsKKyB0WyJcdTMxODMiXSA9ICJcdTExRjIiOworIHRbIlx1MzE4NCJdID0gIlx1MTE1NyI7CisgdFsiXHUzMTg1Il0gPSAiXHUxMTU4IjsKKyB0WyJcdTMxODYiXSA9ICJcdTExNTkiOworIHRbIlx1MzE4NyJdID0gIlx1MTE4NCI7CisgdFsiXHUzMTg4Il0gPSAiXHUxMTg1IjsKKyB0WyJcdTMxODkiXSA9ICJcdTExODgiOworIHRbIlx1MzE4QSJdID0gIlx1MTE5MSI7CisgdFsiXHUzMThCIl0gPSAiXHUxMTkyIjsKKyB0WyJcdTMxOEMiXSA9ICJcdTExOTQiOworIHRbIlx1MzE4RCJdID0gIlx1MTE5RSI7CisgdFsiXHUzMThFIl0gPSAiXHUxMUExIjsKKyB0WyJcdTMyMDAiXSA9ICJcdTAwMjhcdTExMDBcdTAwMjkiOworIHRbIlx1MzIwMSJdID0gIlx1MDAyOFx1MTEwMlx1MDAyOSI7CisgdFsiXHUzMjAyIl0gPSAiXHUwMDI4XHUxMTAzXHUwMDI5IjsKKyB0WyJcdTMyMDMiXSA9ICJcdTAwMjhcdTExMDVcdTAwMjkiOworIHRbIlx1MzIwNCJdID0gIlx1MDAyOFx1MTEwNlx1MDAyOSI7CisgdFsiXHUzMjA1Il0gPSAiXHUwMDI4XHUxMTA3XHUwMDI5IjsKKyB0WyJcdTMyMDYiXSA9ICJcdTAwMjhcdTExMDlcdTAwMjkiOworIHRbIlx1MzIwNyJdID0gIlx1MDAyOFx1MTEwQlx1MDAyOSI7CisgdFsiXHUzMjA4Il0gPSAiXHUwMDI4XHUxMTBDXHUwMDI5IjsKKyB0WyJcdTMyMDkiXSA9ICJcdTAwMjhcdTExMEVcdTAwMjkiOworIHRbIlx1MzIwQSJdID0gIlx1MDAyOFx1MTEwRlx1MDAyOSI7CisgdFsiXHUzMjBCIl0gPSAiXHUwMDI4XHUxMTEwXHUwMDI5IjsKKyB0WyJcdTMyMEMiXSA9ICJcdTAwMjhcdTExMTFcdTAwMjkiOworIHRbIlx1MzIwRCJdID0gIlx1MDAyOFx1MTExMlx1MDAyOSI7CisgdFsiXHUzMjBFIl0gPSAiXHUwMDI4XHUxMTAwXHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMEYiXSA9ICJcdTAwMjhcdTExMDJcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxMCJdID0gIlx1MDAyOFx1MTEwM1x1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjExIl0gPSAiXHUwMDI4XHUxMTA1XHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMTIiXSA9ICJcdTAwMjhcdTExMDZcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxMyJdID0gIlx1MDAyOFx1MTEwN1x1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjE0Il0gPSAiXHUwMDI4XHUxMTA5XHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMTUiXSA9ICJcdTAwMjhcdTExMEJcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxNiJdID0gIlx1MDAyOFx1MTEwQ1x1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjE3Il0gPSAiXHUwMDI4XHUxMTBFXHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMTgiXSA9ICJcdTAwMjhcdTExMEZcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxOSJdID0gIlx1MDAyOFx1MTExMFx1MTE2MVx1MDAyOSI7CisgdFsiXHUzMjFBIl0gPSAiXHUwMDI4XHUxMTExXHUxMTYxXHUwMDI5IjsKKyB0WyJcdTMyMUIiXSA9ICJcdTAwMjhcdTExMTJcdTExNjFcdTAwMjkiOworIHRbIlx1MzIxQyJdID0gIlx1MDAyOFx1MTEwQ1x1MTE2RVx1MDAyOSI7CisgdFsiXHUzMjFEIl0gPSAiXHUwMDI4XHUxMTBCXHUxMTY5XHUxMTBDXHUxMTY1XHUxMUFCXHUwMDI5IjsKKyB0WyJcdTMyMUUiXSA9ICJcdTAwMjhcdTExMEJcdTExNjlcdTExMTJcdTExNkVcdTAwMjkiOworIHRbIlx1MzIyMCJdID0gIlx1MDAyOFx1NEUwMFx1MDAyOSI7CisgdFsiXHUzMjIxIl0gPSAiXHUwMDI4XHU0RThDXHUwMDI5IjsKKyB0WyJcdTMyMjIiXSA9ICJcdTAwMjhcdTRFMDlcdTAwMjkiOworIHRbIlx1MzIyMyJdID0gIlx1MDAyOFx1NTZEQlx1MDAyOSI7CisgdFsiXHUzMjI0Il0gPSAiXHUwMDI4XHU0RTk0XHUwMDI5IjsKKyB0WyJcdTMyMjUiXSA9ICJcdTAwMjhcdTUxNkRcdTAwMjkiOworIHRbIlx1MzIyNiJdID0gIlx1MDAyOFx1NEUwM1x1MDAyOSI7CisgdFsiXHUzMjI3Il0gPSAiXHUwMDI4XHU1MTZCXHUwMDI5IjsKKyB0WyJcdTMyMjgiXSA9ICJcdTAwMjhcdTRFNURcdTAwMjkiOworIHRbIlx1MzIyOSJdID0gIlx1MDAyOFx1NTM0MVx1MDAyOSI7CisgdFsiXHUzMjJBIl0gPSAiXHUwMDI4XHU2NzA4XHUwMDI5IjsKKyB0WyJcdTMyMkIiXSA9ICJcdTAwMjhcdTcwNkJcdTAwMjkiOworIHRbIlx1MzIyQyJdID0gIlx1MDAyOFx1NkMzNFx1MDAyOSI7CisgdFsiXHUzMjJEIl0gPSAiXHUwMDI4XHU2NzI4XHUwMDI5IjsKKyB0WyJcdTMyMkUiXSA9ICJcdTAwMjhcdTkxRDFcdTAwMjkiOworIHRbIlx1MzIyRiJdID0gIlx1MDAyOFx1NTcxRlx1MDAyOSI7CisgdFsiXHUzMjMwIl0gPSAiXHUwMDI4XHU2NUU1XHUwMDI5IjsKKyB0WyJcdTMyMzEiXSA9ICJcdTAwMjhcdTY4MkFcdTAwMjkiOworIHRbIlx1MzIzMiJdID0gIlx1MDAyOFx1NjcwOVx1MDAyOSI7CisgdFsiXHUzMjMzIl0gPSAiXHUwMDI4XHU3OTNFXHUwMDI5IjsKKyB0WyJcdTMyMzQiXSA9ICJcdTAwMjhcdTU0MERcdTAwMjkiOworIHRbIlx1MzIzNSJdID0gIlx1MDAyOFx1NzI3OVx1MDAyOSI7CisgdFsiXHUzMjM2Il0gPSAiXHUwMDI4XHU4Q0ExXHUwMDI5IjsKKyB0WyJcdTMyMzciXSA9ICJcdTAwMjhcdTc5NURcdTAwMjkiOworIHRbIlx1MzIzOCJdID0gIlx1MDAyOFx1NTJCNFx1MDAyOSI7CisgdFsiXHUzMjM5Il0gPSAiXHUwMDI4XHU0RUUzXHUwMDI5IjsKKyB0WyJcdTMyM0EiXSA9ICJcdTAwMjhcdTU0N0NcdTAwMjkiOworIHRbIlx1MzIzQiJdID0gIlx1MDAyOFx1NUI2Nlx1MDAyOSI7CisgdFsiXHUzMjNDIl0gPSAiXHUwMDI4XHU3NkUzXHUwMDI5IjsKKyB0WyJcdTMyM0QiXSA9ICJcdTAwMjhcdTRGMDFcdTAwMjkiOworIHRbIlx1MzIzRSJdID0gIlx1MDAyOFx1OENDN1x1MDAyOSI7CisgdFsiXHUzMjNGIl0gPSAiXHUwMDI4XHU1MzU0XHUwMDI5IjsKKyB0WyJcdTMyNDAiXSA9ICJcdTAwMjhcdTc5NkRcdTAwMjkiOworIHRbIlx1MzI0MSJdID0gIlx1MDAyOFx1NEYxMVx1MDAyOSI7CisgdFsiXHUzMjQyIl0gPSAiXHUwMDI4XHU4MUVBXHUwMDI5IjsKKyB0WyJcdTMyNDMiXSA9ICJcdTAwMjhcdTgxRjNcdTAwMjkiOworIHRbIlx1MzJDMCJdID0gIlx1MDAzMVx1NjcwOCI7CisgdFsiXHUzMkMxIl0gPSAiXHUwMDMyXHU2NzA4IjsKKyB0WyJcdTMyQzIiXSA9ICJcdTAwMzNcdTY3MDgiOworIHRbIlx1MzJDMyJdID0gIlx1MDAzNFx1NjcwOCI7CisgdFsiXHUzMkM0Il0gPSAiXHUwMDM1XHU2NzA4IjsKKyB0WyJcdTMyQzUiXSA9ICJcdTAwMzZcdTY3MDgiOworIHRbIlx1MzJDNiJdID0gIlx1MDAzN1x1NjcwOCI7CisgdFsiXHUzMkM3Il0gPSAiXHUwMDM4XHU2NzA4IjsKKyB0WyJcdTMyQzgiXSA9ICJcdTAwMzlcdTY3MDgiOworIHRbIlx1MzJDOSJdID0gIlx1MDAzMVx1MDAzMFx1NjcwOCI7CisgdFsiXHUzMkNBIl0gPSAiXHUwMDMxXHUwMDMxXHU2NzA4IjsKKyB0WyJcdTMyQ0IiXSA9ICJcdTAwMzFcdTAwMzJcdTY3MDgiOworIHRbIlx1MzM1OCJdID0gIlx1MDAzMFx1NzBCOSI7CisgdFsiXHUzMzU5Il0gPSAiXHUwMDMxXHU3MEI5IjsKKyB0WyJcdTMzNUEiXSA9ICJcdTAwMzJcdTcwQjkiOworIHRbIlx1MzM1QiJdID0gIlx1MDAzM1x1NzBCOSI7CisgdFsiXHUzMzVDIl0gPSAiXHUwMDM0XHU3MEI5IjsKKyB0WyJcdTMzNUQiXSA9ICJcdTAwMzVcdTcwQjkiOworIHRbIlx1MzM1RSJdID0gIlx1MDAzNlx1NzBCOSI7CisgdFsiXHUzMzVGIl0gPSAiXHUwMDM3XHU3MEI5IjsKKyB0WyJcdTMzNjAiXSA9ICJcdTAwMzhcdTcwQjkiOworIHRbIlx1MzM2MSJdID0gIlx1MDAzOVx1NzBCOSI7CisgdFsiXHUzMzYyIl0gPSAiXHUwMDMxXHUwMDMwXHU3MEI5IjsKKyB0WyJcdTMzNjMiXSA9ICJcdTAwMzFcdTAwMzFcdTcwQjkiOworIHRbIlx1MzM2NCJdID0gIlx1MDAzMVx1MDAzMlx1NzBCOSI7CisgdFsiXHUzMzY1Il0gPSAiXHUwMDMxXHUwMDMzXHU3MEI5IjsKKyB0WyJcdTMzNjYiXSA9ICJcdTAwMzFcdTAwMzRcdTcwQjkiOworIHRbIlx1MzM2NyJdID0gIlx1MDAzMVx1MDAzNVx1NzBCOSI7CisgdFsiXHUzMzY4Il0gPSAiXHUwMDMxXHUwMDM2XHU3MEI5IjsKKyB0WyJcdTMzNjkiXSA9ICJcdTAwMzFcdTAwMzdcdTcwQjkiOworIHRbIlx1MzM2QSJdID0gIlx1MDAzMVx1MDAzOFx1NzBCOSI7CisgdFsiXHUzMzZCIl0gPSAiXHUwMDMxXHUwMDM5XHU3MEI5IjsKKyB0WyJcdTMzNkMiXSA9ICJcdTAwMzJcdTAwMzBcdTcwQjkiOworIHRbIlx1MzM2RCJdID0gIlx1MDAzMlx1MDAzMVx1NzBCOSI7CisgdFsiXHUzMzZFIl0gPSAiXHUwMDMyXHUwMDMyXHU3MEI5IjsKKyB0WyJcdTMzNkYiXSA9ICJcdTAwMzJcdTAwMzNcdTcwQjkiOworIHRbIlx1MzM3MCJdID0gIlx1MDAzMlx1MDAzNFx1NzBCOSI7CisgdFsiXHUzM0UwIl0gPSAiXHUwMDMxXHU2NUU1IjsKKyB0WyJcdTMzRTEiXSA9ICJcdTAwMzJcdTY1RTUiOworIHRbIlx1MzNFMiJdID0gIlx1MDAzM1x1NjVFNSI7CisgdFsiXHUzM0UzIl0gPSAiXHUwMDM0XHU2NUU1IjsKKyB0WyJcdTMzRTQiXSA9ICJcdTAwMzVcdTY1RTUiOworIHRbIlx1MzNFNSJdID0gIlx1MDAzNlx1NjVFNSI7CisgdFsiXHUzM0U2Il0gPSAiXHUwMDM3XHU2NUU1IjsKKyB0WyJcdTMzRTciXSA9ICJcdTAwMzhcdTY1RTUiOworIHRbIlx1MzNFOCJdID0gIlx1MDAzOVx1NjVFNSI7CisgdFsiXHUzM0U5Il0gPSAiXHUwMDMxXHUwMDMwXHU2NUU1IjsKKyB0WyJcdTMzRUEiXSA9ICJcdTAwMzFcdTAwMzFcdTY1RTUiOworIHRbIlx1MzNFQiJdID0gIlx1MDAzMVx1MDAzMlx1NjVFNSI7CisgdFsiXHUzM0VDIl0gPSAiXHUwMDMxXHUwMDMzXHU2NUU1IjsKKyB0WyJcdTMzRUQiXSA9ICJcdTAwMzFcdTAwMzRcdTY1RTUiOworIHRbIlx1MzNFRSJdID0gIlx1MDAzMVx1MDAzNVx1NjVFNSI7CisgdFsiXHUzM0VGIl0gPSAiXHUwMDMxXHUwMDM2XHU2NUU1IjsKKyB0WyJcdTMzRjAiXSA9ICJcdTAwMzFcdTAwMzdcdTY1RTUiOworIHRbIlx1MzNGMSJdID0gIlx1MDAzMVx1MDAzOFx1NjVFNSI7CisgdFsiXHUzM0YyIl0gPSAiXHUwMDMxXHUwMDM5XHU2NUU1IjsKKyB0WyJcdTMzRjMiXSA9ICJcdTAwMzJcdTAwMzBcdTY1RTUiOworIHRbIlx1MzNGNCJdID0gIlx1MDAzMlx1MDAzMVx1NjVFNSI7CisgdFsiXHUzM0Y1Il0gPSAiXHUwMDMyXHUwMDMyXHU2NUU1IjsKKyB0WyJcdTMzRjYiXSA9ICJcdTAwMzJcdTAwMzNcdTY1RTUiOworIHRbIlx1MzNGNyJdID0gIlx1MDAzMlx1MDAzNFx1NjVFNSI7CisgdFsiXHUzM0Y4Il0gPSAiXHUwMDMyXHUwMDM1XHU2NUU1IjsKKyB0WyJcdTMzRjkiXSA9ICJcdTAwMzJcdTAwMzZcdTY1RTUiOworIHRbIlx1MzNGQSJdID0gIlx1MDAzMlx1MDAzN1x1NjVFNSI7CisgdFsiXHUzM0ZCIl0gPSAiXHUwMDMyXHUwMDM4XHU2NUU1IjsKKyB0WyJcdTMzRkMiXSA9ICJcdTAwMzJcdTAwMzlcdTY1RTUiOworIHRbIlx1MzNGRCJdID0gIlx1MDAzM1x1MDAzMFx1NjVFNSI7CisgdFsiXHUzM0ZFIl0gPSAiXHUwMDMzXHUwMDMxXHU2NUU1IjsKKyB0WyJcdUZCMDAiXSA9ICJcdTAwNjZcdTAwNjYiOworIHRbIlx1RkIwMSJdID0gIlx1MDA2Nlx1MDA2OSI7CisgdFsiXHVGQjAyIl0gPSAiXHUwMDY2XHUwMDZDIjsKKyB0WyJcdUZCMDMiXSA9ICJcdTAwNjZcdTAwNjZcdTAwNjkiOworIHRbIlx1RkIwNCJdID0gIlx1MDA2Nlx1MDA2Nlx1MDA2QyI7CisgdFsiXHVGQjA1Il0gPSAiXHUwMTdGXHUwMDc0IjsKKyB0WyJcdUZCMDYiXSA9ICJcdTAwNzNcdTAwNzQiOworIHRbIlx1RkIxMyJdID0gIlx1MDU3NFx1MDU3NiI7CisgdFsiXHVGQjE0Il0gPSAiXHUwNTc0XHUwNTY1IjsKKyB0WyJcdUZCMTUiXSA9ICJcdTA1NzRcdTA1NkIiOworIHRbIlx1RkIxNiJdID0gIlx1MDU3RVx1MDU3NiI7CisgdFsiXHVGQjE3Il0gPSAiXHUwNTc0XHUwNTZEIjsKKyB0WyJcdUZCNEYiXSA9ICJcdTA1RDBcdTA1REMiOworIHRbIlx1RkI1MCJdID0gIlx1MDY3MSI7CisgdFsiXHVGQjUxIl0gPSAiXHUwNjcxIjsKKyB0WyJcdUZCNTIiXSA9ICJcdTA2N0IiOworIHRbIlx1RkI1MyJdID0gIlx1MDY3QiI7CisgdFsiXHVGQjU0Il0gPSAiXHUwNjdCIjsKKyB0WyJcdUZCNTUiXSA9ICJcdTA2N0IiOworIHRbIlx1RkI1NiJdID0gIlx1MDY3RSI7CisgdFsiXHVGQjU3Il0gPSAiXHUwNjdFIjsKKyB0WyJcdUZCNTgiXSA9ICJcdTA2N0UiOworIHRbIlx1RkI1OSJdID0gIlx1MDY3RSI7CisgdFsiXHVGQjVBIl0gPSAiXHUwNjgwIjsKKyB0WyJcdUZCNUIiXSA9ICJcdTA2ODAiOworIHRbIlx1RkI1QyJdID0gIlx1MDY4MCI7CisgdFsiXHVGQjVEIl0gPSAiXHUwNjgwIjsKKyB0WyJcdUZCNUUiXSA9ICJcdTA2N0EiOworIHRbIlx1RkI1RiJdID0gIlx1MDY3QSI7CisgdFsiXHVGQjYwIl0gPSAiXHUwNjdBIjsKKyB0WyJcdUZCNjEiXSA9ICJcdTA2N0EiOworIHRbIlx1RkI2MiJdID0gIlx1MDY3RiI7CisgdFsiXHVGQjYzIl0gPSAiXHUwNjdGIjsKKyB0WyJcdUZCNjQiXSA9ICJcdTA2N0YiOworIHRbIlx1RkI2NSJdID0gIlx1MDY3RiI7CisgdFsiXHVGQjY2Il0gPSAiXHUwNjc5IjsKKyB0WyJcdUZCNjciXSA9ICJcdTA2NzkiOworIHRbIlx1RkI2OCJdID0gIlx1MDY3OSI7CisgdFsiXHVGQjY5Il0gPSAiXHUwNjc5IjsKKyB0WyJcdUZCNkEiXSA9ICJcdTA2QTQiOworIHRbIlx1RkI2QiJdID0gIlx1MDZBNCI7CisgdFsiXHVGQjZDIl0gPSAiXHUwNkE0IjsKKyB0WyJcdUZCNkQiXSA9ICJcdTA2QTQiOworIHRbIlx1RkI2RSJdID0gIlx1MDZBNiI7CisgdFsiXHVGQjZGIl0gPSAiXHUwNkE2IjsKKyB0WyJcdUZCNzAiXSA9ICJcdTA2QTYiOworIHRbIlx1RkI3MSJdID0gIlx1MDZBNiI7CisgdFsiXHVGQjcyIl0gPSAiXHUwNjg0IjsKKyB0WyJcdUZCNzMiXSA9ICJcdTA2ODQiOworIHRbIlx1RkI3NCJdID0gIlx1MDY4NCI7CisgdFsiXHVGQjc1Il0gPSAiXHUwNjg0IjsKKyB0WyJcdUZCNzYiXSA9ICJcdTA2ODMiOworIHRbIlx1RkI3NyJdID0gIlx1MDY4MyI7CisgdFsiXHVGQjc4Il0gPSAiXHUwNjgzIjsKKyB0WyJcdUZCNzkiXSA9ICJcdTA2ODMiOworIHRbIlx1RkI3QSJdID0gIlx1MDY4NiI7CisgdFsiXHVGQjdCIl0gPSAiXHUwNjg2IjsKKyB0WyJcdUZCN0MiXSA9ICJcdTA2ODYiOworIHRbIlx1RkI3RCJdID0gIlx1MDY4NiI7CisgdFsiXHVGQjdFIl0gPSAiXHUwNjg3IjsKKyB0WyJcdUZCN0YiXSA9ICJcdTA2ODciOworIHRbIlx1RkI4MCJdID0gIlx1MDY4NyI7CisgdFsiXHVGQjgxIl0gPSAiXHUwNjg3IjsKKyB0WyJcdUZCODIiXSA9ICJcdTA2OEQiOworIHRbIlx1RkI4MyJdID0gIlx1MDY4RCI7CisgdFsiXHVGQjg0Il0gPSAiXHUwNjhDIjsKKyB0WyJcdUZCODUiXSA9ICJcdTA2OEMiOworIHRbIlx1RkI4NiJdID0gIlx1MDY4RSI7CisgdFsiXHVGQjg3Il0gPSAiXHUwNjhFIjsKKyB0WyJcdUZCODgiXSA9ICJcdTA2ODgiOworIHRbIlx1RkI4OSJdID0gIlx1MDY4OCI7CisgdFsiXHVGQjhBIl0gPSAiXHUwNjk4IjsKKyB0WyJcdUZCOEIiXSA9ICJcdTA2OTgiOworIHRbIlx1RkI4QyJdID0gIlx1MDY5MSI7CisgdFsiXHVGQjhEIl0gPSAiXHUwNjkxIjsKKyB0WyJcdUZCOEUiXSA9ICJcdTA2QTkiOworIHRbIlx1RkI4RiJdID0gIlx1MDZBOSI7CisgdFsiXHVGQjkwIl0gPSAiXHUwNkE5IjsKKyB0WyJcdUZCOTEiXSA9ICJcdTA2QTkiOworIHRbIlx1RkI5MiJdID0gIlx1MDZBRiI7CisgdFsiXHVGQjkzIl0gPSAiXHUwNkFGIjsKKyB0WyJcdUZCOTQiXSA9ICJcdTA2QUYiOworIHRbIlx1RkI5NSJdID0gIlx1MDZBRiI7CisgdFsiXHVGQjk2Il0gPSAiXHUwNkIzIjsKKyB0WyJcdUZCOTciXSA9ICJcdTA2QjMiOworIHRbIlx1RkI5OCJdID0gIlx1MDZCMyI7CisgdFsiXHVGQjk5Il0gPSAiXHUwNkIzIjsKKyB0WyJcdUZCOUEiXSA9ICJcdTA2QjEiOworIHRbIlx1RkI5QiJdID0gIlx1MDZCMSI7CisgdFsiXHVGQjlDIl0gPSAiXHUwNkIxIjsKKyB0WyJcdUZCOUQiXSA9ICJcdTA2QjEiOworIHRbIlx1RkI5RSJdID0gIlx1MDZCQSI7CisgdFsiXHVGQjlGIl0gPSAiXHUwNkJBIjsKKyB0WyJcdUZCQTAiXSA9ICJcdTA2QkIiOworIHRbIlx1RkJBMSJdID0gIlx1MDZCQiI7CisgdFsiXHVGQkEyIl0gPSAiXHUwNkJCIjsKKyB0WyJcdUZCQTMiXSA9ICJcdTA2QkIiOworIHRbIlx1RkJBNCJdID0gIlx1MDZDMCI7CisgdFsiXHVGQkE1Il0gPSAiXHUwNkMwIjsKKyB0WyJcdUZCQTYiXSA9ICJcdTA2QzEiOworIHRbIlx1RkJBNyJdID0gIlx1MDZDMSI7CisgdFsiXHVGQkE4Il0gPSAiXHUwNkMxIjsKKyB0WyJcdUZCQTkiXSA9ICJcdTA2QzEiOworIHRbIlx1RkJBQSJdID0gIlx1MDZCRSI7CisgdFsiXHVGQkFCIl0gPSAiXHUwNkJFIjsKKyB0WyJcdUZCQUMiXSA9ICJcdTA2QkUiOworIHRbIlx1RkJBRCJdID0gIlx1MDZCRSI7CisgdFsiXHVGQkFFIl0gPSAiXHUwNkQyIjsKKyB0WyJcdUZCQUYiXSA9ICJcdTA2RDIiOworIHRbIlx1RkJCMCJdID0gIlx1MDZEMyI7CisgdFsiXHVGQkIxIl0gPSAiXHUwNkQzIjsKKyB0WyJcdUZCRDMiXSA9ICJcdTA2QUQiOworIHRbIlx1RkJENCJdID0gIlx1MDZBRCI7CisgdFsiXHVGQkQ1Il0gPSAiXHUwNkFEIjsKKyB0WyJcdUZCRDYiXSA9ICJcdTA2QUQiOworIHRbIlx1RkJENyJdID0gIlx1MDZDNyI7CisgdFsiXHVGQkQ4Il0gPSAiXHUwNkM3IjsKKyB0WyJcdUZCRDkiXSA9ICJcdTA2QzYiOworIHRbIlx1RkJEQSJdID0gIlx1MDZDNiI7CisgdFsiXHVGQkRCIl0gPSAiXHUwNkM4IjsKKyB0WyJcdUZCREMiXSA9ICJcdTA2QzgiOworIHRbIlx1RkJERCJdID0gIlx1MDY3NyI7CisgdFsiXHVGQkRFIl0gPSAiXHUwNkNCIjsKKyB0WyJcdUZCREYiXSA9ICJcdTA2Q0IiOworIHRbIlx1RkJFMCJdID0gIlx1MDZDNSI7CisgdFsiXHVGQkUxIl0gPSAiXHUwNkM1IjsKKyB0WyJcdUZCRTIiXSA9ICJcdTA2QzkiOworIHRbIlx1RkJFMyJdID0gIlx1MDZDOSI7CisgdFsiXHVGQkU0Il0gPSAiXHUwNkQwIjsKKyB0WyJcdUZCRTUiXSA9ICJcdTA2RDAiOworIHRbIlx1RkJFNiJdID0gIlx1MDZEMCI7CisgdFsiXHVGQkU3Il0gPSAiXHUwNkQwIjsKKyB0WyJcdUZCRTgiXSA9ICJcdTA2NDkiOworIHRbIlx1RkJFOSJdID0gIlx1MDY0OSI7CisgdFsiXHVGQkVBIl0gPSAiXHUwNjI2XHUwNjI3IjsKKyB0WyJcdUZCRUIiXSA9ICJcdTA2MjZcdTA2MjciOworIHRbIlx1RkJFQyJdID0gIlx1MDYyNlx1MDZENSI7CisgdFsiXHVGQkVEIl0gPSAiXHUwNjI2XHUwNkQ1IjsKKyB0WyJcdUZCRUUiXSA9ICJcdTA2MjZcdTA2NDgiOworIHRbIlx1RkJFRiJdID0gIlx1MDYyNlx1MDY0OCI7CisgdFsiXHVGQkYwIl0gPSAiXHUwNjI2XHUwNkM3IjsKKyB0WyJcdUZCRjEiXSA9ICJcdTA2MjZcdTA2QzciOworIHRbIlx1RkJGMiJdID0gIlx1MDYyNlx1MDZDNiI7CisgdFsiXHVGQkYzIl0gPSAiXHUwNjI2XHUwNkM2IjsKKyB0WyJcdUZCRjQiXSA9ICJcdTA2MjZcdTA2QzgiOworIHRbIlx1RkJGNSJdID0gIlx1MDYyNlx1MDZDOCI7CisgdFsiXHVGQkY2Il0gPSAiXHUwNjI2XHUwNkQwIjsKKyB0WyJcdUZCRjciXSA9ICJcdTA2MjZcdTA2RDAiOworIHRbIlx1RkJGOCJdID0gIlx1MDYyNlx1MDZEMCI7CisgdFsiXHVGQkY5Il0gPSAiXHUwNjI2XHUwNjQ5IjsKKyB0WyJcdUZCRkEiXSA9ICJcdTA2MjZcdTA2NDkiOworIHRbIlx1RkJGQiJdID0gIlx1MDYyNlx1MDY0OSI7CisgdFsiXHVGQkZDIl0gPSAiXHUwNkNDIjsKKyB0WyJcdUZCRkQiXSA9ICJcdTA2Q0MiOworIHRbIlx1RkJGRSJdID0gIlx1MDZDQyI7CisgdFsiXHVGQkZGIl0gPSAiXHUwNkNDIjsKKyB0WyJcdUZDMDAiXSA9ICJcdTA2MjZcdTA2MkMiOworIHRbIlx1RkMwMSJdID0gIlx1MDYyNlx1MDYyRCI7CisgdFsiXHVGQzAyIl0gPSAiXHUwNjI2XHUwNjQ1IjsKKyB0WyJcdUZDMDMiXSA9ICJcdTA2MjZcdTA2NDkiOworIHRbIlx1RkMwNCJdID0gIlx1MDYyNlx1MDY0QSI7CisgdFsiXHVGQzA1Il0gPSAiXHUwNjI4XHUwNjJDIjsKKyB0WyJcdUZDMDYiXSA9ICJcdTA2MjhcdTA2MkQiOworIHRbIlx1RkMwNyJdID0gIlx1MDYyOFx1MDYyRSI7CisgdFsiXHVGQzA4Il0gPSAiXHUwNjI4XHUwNjQ1IjsKKyB0WyJcdUZDMDkiXSA9ICJcdTA2MjhcdTA2NDkiOworIHRbIlx1RkMwQSJdID0gIlx1MDYyOFx1MDY0QSI7CisgdFsiXHVGQzBCIl0gPSAiXHUwNjJBXHUwNjJDIjsKKyB0WyJcdUZDMEMiXSA9ICJcdTA2MkFcdTA2MkQiOworIHRbIlx1RkMwRCJdID0gIlx1MDYyQVx1MDYyRSI7CisgdFsiXHVGQzBFIl0gPSAiXHUwNjJBXHUwNjQ1IjsKKyB0WyJcdUZDMEYiXSA9ICJcdTA2MkFcdTA2NDkiOworIHRbIlx1RkMxMCJdID0gIlx1MDYyQVx1MDY0QSI7CisgdFsiXHVGQzExIl0gPSAiXHUwNjJCXHUwNjJDIjsKKyB0WyJcdUZDMTIiXSA9ICJcdTA2MkJcdTA2NDUiOworIHRbIlx1RkMxMyJdID0gIlx1MDYyQlx1MDY0OSI7CisgdFsiXHVGQzE0Il0gPSAiXHUwNjJCXHUwNjRBIjsKKyB0WyJcdUZDMTUiXSA9ICJcdTA2MkNcdTA2MkQiOworIHRbIlx1RkMxNiJdID0gIlx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGQzE3Il0gPSAiXHUwNjJEXHUwNjJDIjsKKyB0WyJcdUZDMTgiXSA9ICJcdTA2MkRcdTA2NDUiOworIHRbIlx1RkMxOSJdID0gIlx1MDYyRVx1MDYyQyI7CisgdFsiXHVGQzFBIl0gPSAiXHUwNjJFXHUwNjJEIjsKKyB0WyJcdUZDMUIiXSA9ICJcdTA2MkVcdTA2NDUiOworIHRbIlx1RkMxQyJdID0gIlx1MDYzM1x1MDYyQyI7CisgdFsiXHVGQzFEIl0gPSAiXHUwNjMzXHUwNjJEIjsKKyB0WyJcdUZDMUUiXSA9ICJcdTA2MzNcdTA2MkUiOworIHRbIlx1RkMxRiJdID0gIlx1MDYzM1x1MDY0NSI7CisgdFsiXHVGQzIwIl0gPSAiXHUwNjM1XHUwNjJEIjsKKyB0WyJcdUZDMjEiXSA9ICJcdTA2MzVcdTA2NDUiOworIHRbIlx1RkMyMiJdID0gIlx1MDYzNlx1MDYyQyI7CisgdFsiXHVGQzIzIl0gPSAiXHUwNjM2XHUwNjJEIjsKKyB0WyJcdUZDMjQiXSA9ICJcdTA2MzZcdTA2MkUiOworIHRbIlx1RkMyNSJdID0gIlx1MDYzNlx1MDY0NSI7CisgdFsiXHVGQzI2Il0gPSAiXHUwNjM3XHUwNjJEIjsKKyB0WyJcdUZDMjciXSA9ICJcdTA2MzdcdTA2NDUiOworIHRbIlx1RkMyOCJdID0gIlx1MDYzOFx1MDY0NSI7CisgdFsiXHVGQzI5Il0gPSAiXHUwNjM5XHUwNjJDIjsKKyB0WyJcdUZDMkEiXSA9ICJcdTA2MzlcdTA2NDUiOworIHRbIlx1RkMyQiJdID0gIlx1MDYzQVx1MDYyQyI7CisgdFsiXHVGQzJDIl0gPSAiXHUwNjNBXHUwNjQ1IjsKKyB0WyJcdUZDMkQiXSA9ICJcdTA2NDFcdTA2MkMiOworIHRbIlx1RkMyRSJdID0gIlx1MDY0MVx1MDYyRCI7CisgdFsiXHVGQzJGIl0gPSAiXHUwNjQxXHUwNjJFIjsKKyB0WyJcdUZDMzAiXSA9ICJcdTA2NDFcdTA2NDUiOworIHRbIlx1RkMzMSJdID0gIlx1MDY0MVx1MDY0OSI7CisgdFsiXHVGQzMyIl0gPSAiXHUwNjQxXHUwNjRBIjsKKyB0WyJcdUZDMzMiXSA9ICJcdTA2NDJcdTA2MkQiOworIHRbIlx1RkMzNCJdID0gIlx1MDY0Mlx1MDY0NSI7CisgdFsiXHVGQzM1Il0gPSAiXHUwNjQyXHUwNjQ5IjsKKyB0WyJcdUZDMzYiXSA9ICJcdTA2NDJcdTA2NEEiOworIHRbIlx1RkMzNyJdID0gIlx1MDY0M1x1MDYyNyI7CisgdFsiXHVGQzM4Il0gPSAiXHUwNjQzXHUwNjJDIjsKKyB0WyJcdUZDMzkiXSA9ICJcdTA2NDNcdTA2MkQiOworIHRbIlx1RkMzQSJdID0gIlx1MDY0M1x1MDYyRSI7CisgdFsiXHVGQzNCIl0gPSAiXHUwNjQzXHUwNjQ0IjsKKyB0WyJcdUZDM0MiXSA9ICJcdTA2NDNcdTA2NDUiOworIHRbIlx1RkMzRCJdID0gIlx1MDY0M1x1MDY0OSI7CisgdFsiXHVGQzNFIl0gPSAiXHUwNjQzXHUwNjRBIjsKKyB0WyJcdUZDM0YiXSA9ICJcdTA2NDRcdTA2MkMiOworIHRbIlx1RkM0MCJdID0gIlx1MDY0NFx1MDYyRCI7CisgdFsiXHVGQzQxIl0gPSAiXHUwNjQ0XHUwNjJFIjsKKyB0WyJcdUZDNDIiXSA9ICJcdTA2NDRcdTA2NDUiOworIHRbIlx1RkM0MyJdID0gIlx1MDY0NFx1MDY0OSI7CisgdFsiXHVGQzQ0Il0gPSAiXHUwNjQ0XHUwNjRBIjsKKyB0WyJcdUZDNDUiXSA9ICJcdTA2NDVcdTA2MkMiOworIHRbIlx1RkM0NiJdID0gIlx1MDY0NVx1MDYyRCI7CisgdFsiXHVGQzQ3Il0gPSAiXHUwNjQ1XHUwNjJFIjsKKyB0WyJcdUZDNDgiXSA9ICJcdTA2NDVcdTA2NDUiOworIHRbIlx1RkM0OSJdID0gIlx1MDY0NVx1MDY0OSI7CisgdFsiXHVGQzRBIl0gPSAiXHUwNjQ1XHUwNjRBIjsKKyB0WyJcdUZDNEIiXSA9ICJcdTA2NDZcdTA2MkMiOworIHRbIlx1RkM0QyJdID0gIlx1MDY0Nlx1MDYyRCI7CisgdFsiXHVGQzREIl0gPSAiXHUwNjQ2XHUwNjJFIjsKKyB0WyJcdUZDNEUiXSA9ICJcdTA2NDZcdTA2NDUiOworIHRbIlx1RkM0RiJdID0gIlx1MDY0Nlx1MDY0OSI7CisgdFsiXHVGQzUwIl0gPSAiXHUwNjQ2XHUwNjRBIjsKKyB0WyJcdUZDNTEiXSA9ICJcdTA2NDdcdTA2MkMiOworIHRbIlx1RkM1MiJdID0gIlx1MDY0N1x1MDY0NSI7CisgdFsiXHVGQzUzIl0gPSAiXHUwNjQ3XHUwNjQ5IjsKKyB0WyJcdUZDNTQiXSA9ICJcdTA2NDdcdTA2NEEiOworIHRbIlx1RkM1NSJdID0gIlx1MDY0QVx1MDYyQyI7CisgdFsiXHVGQzU2Il0gPSAiXHUwNjRBXHUwNjJEIjsKKyB0WyJcdUZDNTciXSA9ICJcdTA2NEFcdTA2MkUiOworIHRbIlx1RkM1OCJdID0gIlx1MDY0QVx1MDY0NSI7CisgdFsiXHVGQzU5Il0gPSAiXHUwNjRBXHUwNjQ5IjsKKyB0WyJcdUZDNUEiXSA9ICJcdTA2NEFcdTA2NEEiOworIHRbIlx1RkM1QiJdID0gIlx1MDYzMFx1MDY3MCI7CisgdFsiXHVGQzVDIl0gPSAiXHUwNjMxXHUwNjcwIjsKKyB0WyJcdUZDNUQiXSA9ICJcdTA2NDlcdTA2NzAiOworIHRbIlx1RkM1RSJdID0gIlx1MDAyMFx1MDY0Q1x1MDY1MSI7CisgdFsiXHVGQzVGIl0gPSAiXHUwMDIwXHUwNjREXHUwNjUxIjsKKyB0WyJcdUZDNjAiXSA9ICJcdTAwMjBcdTA2NEVcdTA2NTEiOworIHRbIlx1RkM2MSJdID0gIlx1MDAyMFx1MDY0Rlx1MDY1MSI7CisgdFsiXHVGQzYyIl0gPSAiXHUwMDIwXHUwNjUwXHUwNjUxIjsKKyB0WyJcdUZDNjMiXSA9ICJcdTAwMjBcdTA2NTFcdTA2NzAiOworIHRbIlx1RkM2NCJdID0gIlx1MDYyNlx1MDYzMSI7CisgdFsiXHVGQzY1Il0gPSAiXHUwNjI2XHUwNjMyIjsKKyB0WyJcdUZDNjYiXSA9ICJcdTA2MjZcdTA2NDUiOworIHRbIlx1RkM2NyJdID0gIlx1MDYyNlx1MDY0NiI7CisgdFsiXHVGQzY4Il0gPSAiXHUwNjI2XHUwNjQ5IjsKKyB0WyJcdUZDNjkiXSA9ICJcdTA2MjZcdTA2NEEiOworIHRbIlx1RkM2QSJdID0gIlx1MDYyOFx1MDYzMSI7CisgdFsiXHVGQzZCIl0gPSAiXHUwNjI4XHUwNjMyIjsKKyB0WyJcdUZDNkMiXSA9ICJcdTA2MjhcdTA2NDUiOworIHRbIlx1RkM2RCJdID0gIlx1MDYyOFx1MDY0NiI7CisgdFsiXHVGQzZFIl0gPSAiXHUwNjI4XHUwNjQ5IjsKKyB0WyJcdUZDNkYiXSA9ICJcdTA2MjhcdTA2NEEiOworIHRbIlx1RkM3MCJdID0gIlx1MDYyQVx1MDYzMSI7CisgdFsiXHVGQzcxIl0gPSAiXHUwNjJBXHUwNjMyIjsKKyB0WyJcdUZDNzIiXSA9ICJcdTA2MkFcdTA2NDUiOworIHRbIlx1RkM3MyJdID0gIlx1MDYyQVx1MDY0NiI7CisgdFsiXHVGQzc0Il0gPSAiXHUwNjJBXHUwNjQ5IjsKKyB0WyJcdUZDNzUiXSA9ICJcdTA2MkFcdTA2NEEiOworIHRbIlx1RkM3NiJdID0gIlx1MDYyQlx1MDYzMSI7CisgdFsiXHVGQzc3Il0gPSAiXHUwNjJCXHUwNjMyIjsKKyB0WyJcdUZDNzgiXSA9ICJcdTA2MkJcdTA2NDUiOworIHRbIlx1RkM3OSJdID0gIlx1MDYyQlx1MDY0NiI7CisgdFsiXHVGQzdBIl0gPSAiXHUwNjJCXHUwNjQ5IjsKKyB0WyJcdUZDN0IiXSA9ICJcdTA2MkJcdTA2NEEiOworIHRbIlx1RkM3QyJdID0gIlx1MDY0MVx1MDY0OSI7CisgdFsiXHVGQzdEIl0gPSAiXHUwNjQxXHUwNjRBIjsKKyB0WyJcdUZDN0UiXSA9ICJcdTA2NDJcdTA2NDkiOworIHRbIlx1RkM3RiJdID0gIlx1MDY0Mlx1MDY0QSI7CisgdFsiXHVGQzgwIl0gPSAiXHUwNjQzXHUwNjI3IjsKKyB0WyJcdUZDODEiXSA9ICJcdTA2NDNcdTA2NDQiOworIHRbIlx1RkM4MiJdID0gIlx1MDY0M1x1MDY0NSI7CisgdFsiXHVGQzgzIl0gPSAiXHUwNjQzXHUwNjQ5IjsKKyB0WyJcdUZDODQiXSA9ICJcdTA2NDNcdTA2NEEiOworIHRbIlx1RkM4NSJdID0gIlx1MDY0NFx1MDY0NSI7CisgdFsiXHVGQzg2Il0gPSAiXHUwNjQ0XHUwNjQ5IjsKKyB0WyJcdUZDODciXSA9ICJcdTA2NDRcdTA2NEEiOworIHRbIlx1RkM4OCJdID0gIlx1MDY0NVx1MDYyNyI7CisgdFsiXHVGQzg5Il0gPSAiXHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZDOEEiXSA9ICJcdTA2NDZcdTA2MzEiOworIHRbIlx1RkM4QiJdID0gIlx1MDY0Nlx1MDYzMiI7CisgdFsiXHVGQzhDIl0gPSAiXHUwNjQ2XHUwNjQ1IjsKKyB0WyJcdUZDOEQiXSA9ICJcdTA2NDZcdTA2NDYiOworIHRbIlx1RkM4RSJdID0gIlx1MDY0Nlx1MDY0OSI7CisgdFsiXHVGQzhGIl0gPSAiXHUwNjQ2XHUwNjRBIjsKKyB0WyJcdUZDOTAiXSA9ICJcdTA2NDlcdTA2NzAiOworIHRbIlx1RkM5MSJdID0gIlx1MDY0QVx1MDYzMSI7CisgdFsiXHVGQzkyIl0gPSAiXHUwNjRBXHUwNjMyIjsKKyB0WyJcdUZDOTMiXSA9ICJcdTA2NEFcdTA2NDUiOworIHRbIlx1RkM5NCJdID0gIlx1MDY0QVx1MDY0NiI7CisgdFsiXHVGQzk1Il0gPSAiXHUwNjRBXHUwNjQ5IjsKKyB0WyJcdUZDOTYiXSA9ICJcdTA2NEFcdTA2NEEiOworIHRbIlx1RkM5NyJdID0gIlx1MDYyNlx1MDYyQyI7CisgdFsiXHVGQzk4Il0gPSAiXHUwNjI2XHUwNjJEIjsKKyB0WyJcdUZDOTkiXSA9ICJcdTA2MjZcdTA2MkUiOworIHRbIlx1RkM5QSJdID0gIlx1MDYyNlx1MDY0NSI7CisgdFsiXHVGQzlCIl0gPSAiXHUwNjI2XHUwNjQ3IjsKKyB0WyJcdUZDOUMiXSA9ICJcdTA2MjhcdTA2MkMiOworIHRbIlx1RkM5RCJdID0gIlx1MDYyOFx1MDYyRCI7CisgdFsiXHVGQzlFIl0gPSAiXHUwNjI4XHUwNjJFIjsKKyB0WyJcdUZDOUYiXSA9ICJcdTA2MjhcdTA2NDUiOworIHRbIlx1RkNBMCJdID0gIlx1MDYyOFx1MDY0NyI7CisgdFsiXHVGQ0ExIl0gPSAiXHUwNjJBXHUwNjJDIjsKKyB0WyJcdUZDQTIiXSA9ICJcdTA2MkFcdTA2MkQiOworIHRbIlx1RkNBMyJdID0gIlx1MDYyQVx1MDYyRSI7CisgdFsiXHVGQ0E0Il0gPSAiXHUwNjJBXHUwNjQ1IjsKKyB0WyJcdUZDQTUiXSA9ICJcdTA2MkFcdTA2NDciOworIHRbIlx1RkNBNiJdID0gIlx1MDYyQlx1MDY0NSI7CisgdFsiXHVGQ0E3Il0gPSAiXHUwNjJDXHUwNjJEIjsKKyB0WyJcdUZDQTgiXSA9ICJcdTA2MkNcdTA2NDUiOworIHRbIlx1RkNBOSJdID0gIlx1MDYyRFx1MDYyQyI7CisgdFsiXHVGQ0FBIl0gPSAiXHUwNjJEXHUwNjQ1IjsKKyB0WyJcdUZDQUIiXSA9ICJcdTA2MkVcdTA2MkMiOworIHRbIlx1RkNBQyJdID0gIlx1MDYyRVx1MDY0NSI7CisgdFsiXHVGQ0FEIl0gPSAiXHUwNjMzXHUwNjJDIjsKKyB0WyJcdUZDQUUiXSA9ICJcdTA2MzNcdTA2MkQiOworIHRbIlx1RkNBRiJdID0gIlx1MDYzM1x1MDYyRSI7CisgdFsiXHVGQ0IwIl0gPSAiXHUwNjMzXHUwNjQ1IjsKKyB0WyJcdUZDQjEiXSA9ICJcdTA2MzVcdTA2MkQiOworIHRbIlx1RkNCMiJdID0gIlx1MDYzNVx1MDYyRSI7CisgdFsiXHVGQ0IzIl0gPSAiXHUwNjM1XHUwNjQ1IjsKKyB0WyJcdUZDQjQiXSA9ICJcdTA2MzZcdTA2MkMiOworIHRbIlx1RkNCNSJdID0gIlx1MDYzNlx1MDYyRCI7CisgdFsiXHVGQ0I2Il0gPSAiXHUwNjM2XHUwNjJFIjsKKyB0WyJcdUZDQjciXSA9ICJcdTA2MzZcdTA2NDUiOworIHRbIlx1RkNCOCJdID0gIlx1MDYzN1x1MDYyRCI7CisgdFsiXHVGQ0I5Il0gPSAiXHUwNjM4XHUwNjQ1IjsKKyB0WyJcdUZDQkEiXSA9ICJcdTA2MzlcdTA2MkMiOworIHRbIlx1RkNCQiJdID0gIlx1MDYzOVx1MDY0NSI7CisgdFsiXHVGQ0JDIl0gPSAiXHUwNjNBXHUwNjJDIjsKKyB0WyJcdUZDQkQiXSA9ICJcdTA2M0FcdTA2NDUiOworIHRbIlx1RkNCRSJdID0gIlx1MDY0MVx1MDYyQyI7CisgdFsiXHVGQ0JGIl0gPSAiXHUwNjQxXHUwNjJEIjsKKyB0WyJcdUZDQzAiXSA9ICJcdTA2NDFcdTA2MkUiOworIHRbIlx1RkNDMSJdID0gIlx1MDY0MVx1MDY0NSI7CisgdFsiXHVGQ0MyIl0gPSAiXHUwNjQyXHUwNjJEIjsKKyB0WyJcdUZDQzMiXSA9ICJcdTA2NDJcdTA2NDUiOworIHRbIlx1RkNDNCJdID0gIlx1MDY0M1x1MDYyQyI7CisgdFsiXHVGQ0M1Il0gPSAiXHUwNjQzXHUwNjJEIjsKKyB0WyJcdUZDQzYiXSA9ICJcdTA2NDNcdTA2MkUiOworIHRbIlx1RkNDNyJdID0gIlx1MDY0M1x1MDY0NCI7CisgdFsiXHVGQ0M4Il0gPSAiXHUwNjQzXHUwNjQ1IjsKKyB0WyJcdUZDQzkiXSA9ICJcdTA2NDRcdTA2MkMiOworIHRbIlx1RkNDQSJdID0gIlx1MDY0NFx1MDYyRCI7CisgdFsiXHVGQ0NCIl0gPSAiXHUwNjQ0XHUwNjJFIjsKKyB0WyJcdUZDQ0MiXSA9ICJcdTA2NDRcdTA2NDUiOworIHRbIlx1RkNDRCJdID0gIlx1MDY0NFx1MDY0NyI7CisgdFsiXHVGQ0NFIl0gPSAiXHUwNjQ1XHUwNjJDIjsKKyB0WyJcdUZDQ0YiXSA9ICJcdTA2NDVcdTA2MkQiOworIHRbIlx1RkNEMCJdID0gIlx1MDY0NVx1MDYyRSI7CisgdFsiXHVGQ0QxIl0gPSAiXHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZDRDIiXSA9ICJcdTA2NDZcdTA2MkMiOworIHRbIlx1RkNEMyJdID0gIlx1MDY0Nlx1MDYyRCI7CisgdFsiXHVGQ0Q0Il0gPSAiXHUwNjQ2XHUwNjJFIjsKKyB0WyJcdUZDRDUiXSA9ICJcdTA2NDZcdTA2NDUiOworIHRbIlx1RkNENiJdID0gIlx1MDY0Nlx1MDY0NyI7CisgdFsiXHVGQ0Q3Il0gPSAiXHUwNjQ3XHUwNjJDIjsKKyB0WyJcdUZDRDgiXSA9ICJcdTA2NDdcdTA2NDUiOworIHRbIlx1RkNEOSJdID0gIlx1MDY0N1x1MDY3MCI7CisgdFsiXHVGQ0RBIl0gPSAiXHUwNjRBXHUwNjJDIjsKKyB0WyJcdUZDREIiXSA9ICJcdTA2NEFcdTA2MkQiOworIHRbIlx1RkNEQyJdID0gIlx1MDY0QVx1MDYyRSI7CisgdFsiXHVGQ0REIl0gPSAiXHUwNjRBXHUwNjQ1IjsKKyB0WyJcdUZDREUiXSA9ICJcdTA2NEFcdTA2NDciOworIHRbIlx1RkNERiJdID0gIlx1MDYyNlx1MDY0NSI7CisgdFsiXHVGQ0UwIl0gPSAiXHUwNjI2XHUwNjQ3IjsKKyB0WyJcdUZDRTEiXSA9ICJcdTA2MjhcdTA2NDUiOworIHRbIlx1RkNFMiJdID0gIlx1MDYyOFx1MDY0NyI7CisgdFsiXHVGQ0UzIl0gPSAiXHUwNjJBXHUwNjQ1IjsKKyB0WyJcdUZDRTQiXSA9ICJcdTA2MkFcdTA2NDciOworIHRbIlx1RkNFNSJdID0gIlx1MDYyQlx1MDY0NSI7CisgdFsiXHVGQ0U2Il0gPSAiXHUwNjJCXHUwNjQ3IjsKKyB0WyJcdUZDRTciXSA9ICJcdTA2MzNcdTA2NDUiOworIHRbIlx1RkNFOCJdID0gIlx1MDYzM1x1MDY0NyI7CisgdFsiXHVGQ0U5Il0gPSAiXHUwNjM0XHUwNjQ1IjsKKyB0WyJcdUZDRUEiXSA9ICJcdTA2MzRcdTA2NDciOworIHRbIlx1RkNFQiJdID0gIlx1MDY0M1x1MDY0NCI7CisgdFsiXHVGQ0VDIl0gPSAiXHUwNjQzXHUwNjQ1IjsKKyB0WyJcdUZDRUQiXSA9ICJcdTA2NDRcdTA2NDUiOworIHRbIlx1RkNFRSJdID0gIlx1MDY0Nlx1MDY0NSI7CisgdFsiXHVGQ0VGIl0gPSAiXHUwNjQ2XHUwNjQ3IjsKKyB0WyJcdUZDRjAiXSA9ICJcdTA2NEFcdTA2NDUiOworIHRbIlx1RkNGMSJdID0gIlx1MDY0QVx1MDY0NyI7CisgdFsiXHVGQ0YyIl0gPSAiXHUwNjQwXHUwNjRFXHUwNjUxIjsKKyB0WyJcdUZDRjMiXSA9ICJcdTA2NDBcdTA2NEZcdTA2NTEiOworIHRbIlx1RkNGNCJdID0gIlx1MDY0MFx1MDY1MFx1MDY1MSI7CisgdFsiXHVGQ0Y1Il0gPSAiXHUwNjM3XHUwNjQ5IjsKKyB0WyJcdUZDRjYiXSA9ICJcdTA2MzdcdTA2NEEiOworIHRbIlx1RkNGNyJdID0gIlx1MDYzOVx1MDY0OSI7CisgdFsiXHVGQ0Y4Il0gPSAiXHUwNjM5XHUwNjRBIjsKKyB0WyJcdUZDRjkiXSA9ICJcdTA2M0FcdTA2NDkiOworIHRbIlx1RkNGQSJdID0gIlx1MDYzQVx1MDY0QSI7CisgdFsiXHVGQ0ZCIl0gPSAiXHUwNjMzXHUwNjQ5IjsKKyB0WyJcdUZDRkMiXSA9ICJcdTA2MzNcdTA2NEEiOworIHRbIlx1RkNGRCJdID0gIlx1MDYzNFx1MDY0OSI7CisgdFsiXHVGQ0ZFIl0gPSAiXHUwNjM0XHUwNjRBIjsKKyB0WyJcdUZDRkYiXSA9ICJcdTA2MkRcdTA2NDkiOworIHRbIlx1RkQwMCJdID0gIlx1MDYyRFx1MDY0QSI7CisgdFsiXHVGRDAxIl0gPSAiXHUwNjJDXHUwNjQ5IjsKKyB0WyJcdUZEMDIiXSA9ICJcdTA2MkNcdTA2NEEiOworIHRbIlx1RkQwMyJdID0gIlx1MDYyRVx1MDY0OSI7CisgdFsiXHVGRDA0Il0gPSAiXHUwNjJFXHUwNjRBIjsKKyB0WyJcdUZEMDUiXSA9ICJcdTA2MzVcdTA2NDkiOworIHRbIlx1RkQwNiJdID0gIlx1MDYzNVx1MDY0QSI7CisgdFsiXHVGRDA3Il0gPSAiXHUwNjM2XHUwNjQ5IjsKKyB0WyJcdUZEMDgiXSA9ICJcdTA2MzZcdTA2NEEiOworIHRbIlx1RkQwOSJdID0gIlx1MDYzNFx1MDYyQyI7CisgdFsiXHVGRDBBIl0gPSAiXHUwNjM0XHUwNjJEIjsKKyB0WyJcdUZEMEIiXSA9ICJcdTA2MzRcdTA2MkUiOworIHRbIlx1RkQwQyJdID0gIlx1MDYzNFx1MDY0NSI7CisgdFsiXHVGRDBEIl0gPSAiXHUwNjM0XHUwNjMxIjsKKyB0WyJcdUZEMEUiXSA9ICJcdTA2MzNcdTA2MzEiOworIHRbIlx1RkQwRiJdID0gIlx1MDYzNVx1MDYzMSI7CisgdFsiXHVGRDEwIl0gPSAiXHUwNjM2XHUwNjMxIjsKKyB0WyJcdUZEMTEiXSA9ICJcdTA2MzdcdTA2NDkiOworIHRbIlx1RkQxMiJdID0gIlx1MDYzN1x1MDY0QSI7CisgdFsiXHVGRDEzIl0gPSAiXHUwNjM5XHUwNjQ5IjsKKyB0WyJcdUZEMTQiXSA9ICJcdTA2MzlcdTA2NEEiOworIHRbIlx1RkQxNSJdID0gIlx1MDYzQVx1MDY0OSI7CisgdFsiXHVGRDE2Il0gPSAiXHUwNjNBXHUwNjRBIjsKKyB0WyJcdUZEMTciXSA9ICJcdTA2MzNcdTA2NDkiOworIHRbIlx1RkQxOCJdID0gIlx1MDYzM1x1MDY0QSI7CisgdFsiXHVGRDE5Il0gPSAiXHUwNjM0XHUwNjQ5IjsKKyB0WyJcdUZEMUEiXSA9ICJcdTA2MzRcdTA2NEEiOworIHRbIlx1RkQxQiJdID0gIlx1MDYyRFx1MDY0OSI7CisgdFsiXHVGRDFDIl0gPSAiXHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEMUQiXSA9ICJcdTA2MkNcdTA2NDkiOworIHRbIlx1RkQxRSJdID0gIlx1MDYyQ1x1MDY0QSI7CisgdFsiXHVGRDFGIl0gPSAiXHUwNjJFXHUwNjQ5IjsKKyB0WyJcdUZEMjAiXSA9ICJcdTA2MkVcdTA2NEEiOworIHRbIlx1RkQyMSJdID0gIlx1MDYzNVx1MDY0OSI7CisgdFsiXHVGRDIyIl0gPSAiXHUwNjM1XHUwNjRBIjsKKyB0WyJcdUZEMjMiXSA9ICJcdTA2MzZcdTA2NDkiOworIHRbIlx1RkQyNCJdID0gIlx1MDYzNlx1MDY0QSI7CisgdFsiXHVGRDI1Il0gPSAiXHUwNjM0XHUwNjJDIjsKKyB0WyJcdUZEMjYiXSA9ICJcdTA2MzRcdTA2MkQiOworIHRbIlx1RkQyNyJdID0gIlx1MDYzNFx1MDYyRSI7CisgdFsiXHVGRDI4Il0gPSAiXHUwNjM0XHUwNjQ1IjsKKyB0WyJcdUZEMjkiXSA9ICJcdTA2MzRcdTA2MzEiOworIHRbIlx1RkQyQSJdID0gIlx1MDYzM1x1MDYzMSI7CisgdFsiXHVGRDJCIl0gPSAiXHUwNjM1XHUwNjMxIjsKKyB0WyJcdUZEMkMiXSA9ICJcdTA2MzZcdTA2MzEiOworIHRbIlx1RkQyRCJdID0gIlx1MDYzNFx1MDYyQyI7CisgdFsiXHVGRDJFIl0gPSAiXHUwNjM0XHUwNjJEIjsKKyB0WyJcdUZEMkYiXSA9ICJcdTA2MzRcdTA2MkUiOworIHRbIlx1RkQzMCJdID0gIlx1MDYzNFx1MDY0NSI7CisgdFsiXHVGRDMxIl0gPSAiXHUwNjMzXHUwNjQ3IjsKKyB0WyJcdUZEMzIiXSA9ICJcdTA2MzRcdTA2NDciOworIHRbIlx1RkQzMyJdID0gIlx1MDYzN1x1MDY0NSI7CisgdFsiXHVGRDM0Il0gPSAiXHUwNjMzXHUwNjJDIjsKKyB0WyJcdUZEMzUiXSA9ICJcdTA2MzNcdTA2MkQiOworIHRbIlx1RkQzNiJdID0gIlx1MDYzM1x1MDYyRSI7CisgdFsiXHVGRDM3Il0gPSAiXHUwNjM0XHUwNjJDIjsKKyB0WyJcdUZEMzgiXSA9ICJcdTA2MzRcdTA2MkQiOworIHRbIlx1RkQzOSJdID0gIlx1MDYzNFx1MDYyRSI7CisgdFsiXHVGRDNBIl0gPSAiXHUwNjM3XHUwNjQ1IjsKKyB0WyJcdUZEM0IiXSA9ICJcdTA2MzhcdTA2NDUiOworIHRbIlx1RkQzQyJdID0gIlx1MDYyN1x1MDY0QiI7CisgdFsiXHVGRDNEIl0gPSAiXHUwNjI3XHUwNjRCIjsKKyB0WyJcdUZENTAiXSA9ICJcdTA2MkFcdTA2MkNcdTA2NDUiOworIHRbIlx1RkQ1MSJdID0gIlx1MDYyQVx1MDYyRFx1MDYyQyI7CisgdFsiXHVGRDUyIl0gPSAiXHUwNjJBXHUwNjJEXHUwNjJDIjsKKyB0WyJcdUZENTMiXSA9ICJcdTA2MkFcdTA2MkRcdTA2NDUiOworIHRbIlx1RkQ1NCJdID0gIlx1MDYyQVx1MDYyRVx1MDY0NSI7CisgdFsiXHVGRDU1Il0gPSAiXHUwNjJBXHUwNjQ1XHUwNjJDIjsKKyB0WyJcdUZENTYiXSA9ICJcdTA2MkFcdTA2NDVcdTA2MkQiOworIHRbIlx1RkQ1NyJdID0gIlx1MDYyQVx1MDY0NVx1MDYyRSI7CisgdFsiXHVGRDU4Il0gPSAiXHUwNjJDXHUwNjQ1XHUwNjJEIjsKKyB0WyJcdUZENTkiXSA9ICJcdTA2MkNcdTA2NDVcdTA2MkQiOworIHRbIlx1RkQ1QSJdID0gIlx1MDYyRFx1MDY0NVx1MDY0QSI7CisgdFsiXHVGRDVCIl0gPSAiXHUwNjJEXHUwNjQ1XHUwNjQ5IjsKKyB0WyJcdUZENUMiXSA9ICJcdTA2MzNcdTA2MkRcdTA2MkMiOworIHRbIlx1RkQ1RCJdID0gIlx1MDYzM1x1MDYyQ1x1MDYyRCI7CisgdFsiXHVGRDVFIl0gPSAiXHUwNjMzXHUwNjJDXHUwNjQ5IjsKKyB0WyJcdUZENUYiXSA9ICJcdTA2MzNcdTA2NDVcdTA2MkQiOworIHRbIlx1RkQ2MCJdID0gIlx1MDYzM1x1MDY0NVx1MDYyRCI7CisgdFsiXHVGRDYxIl0gPSAiXHUwNjMzXHUwNjQ1XHUwNjJDIjsKKyB0WyJcdUZENjIiXSA9ICJcdTA2MzNcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ2MyJdID0gIlx1MDYzM1x1MDY0NVx1MDY0NSI7CisgdFsiXHVGRDY0Il0gPSAiXHUwNjM1XHUwNjJEXHUwNjJEIjsKKyB0WyJcdUZENjUiXSA9ICJcdTA2MzVcdTA2MkRcdTA2MkQiOworIHRbIlx1RkQ2NiJdID0gIlx1MDYzNVx1MDY0NVx1MDY0NSI7CisgdFsiXHVGRDY3Il0gPSAiXHUwNjM0XHUwNjJEXHUwNjQ1IjsKKyB0WyJcdUZENjgiXSA9ICJcdTA2MzRcdTA2MkRcdTA2NDUiOworIHRbIlx1RkQ2OSJdID0gIlx1MDYzNFx1MDYyQ1x1MDY0QSI7CisgdFsiXHVGRDZBIl0gPSAiXHUwNjM0XHUwNjQ1XHUwNjJFIjsKKyB0WyJcdUZENkIiXSA9ICJcdTA2MzRcdTA2NDVcdTA2MkUiOworIHRbIlx1RkQ2QyJdID0gIlx1MDYzNFx1MDY0NVx1MDY0NSI7CisgdFsiXHVGRDZEIl0gPSAiXHUwNjM0XHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZENkUiXSA9ICJcdTA2MzZcdTA2MkRcdTA2NDkiOworIHRbIlx1RkQ2RiJdID0gIlx1MDYzNlx1MDYyRVx1MDY0NSI7CisgdFsiXHVGRDcwIl0gPSAiXHUwNjM2XHUwNjJFXHUwNjQ1IjsKKyB0WyJcdUZENzEiXSA9ICJcdTA2MzdcdTA2NDVcdTA2MkQiOworIHRbIlx1RkQ3MiJdID0gIlx1MDYzN1x1MDY0NVx1MDYyRCI7CisgdFsiXHVGRDczIl0gPSAiXHUwNjM3XHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZENzQiXSA9ICJcdTA2MzdcdTA2NDVcdTA2NEEiOworIHRbIlx1RkQ3NSJdID0gIlx1MDYzOVx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGRDc2Il0gPSAiXHUwNjM5XHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZENzciXSA9ICJcdTA2MzlcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ3OCJdID0gIlx1MDYzOVx1MDY0NVx1MDY0OSI7CisgdFsiXHVGRDc5Il0gPSAiXHUwNjNBXHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZEN0EiXSA9ICJcdTA2M0FcdTA2NDVcdTA2NEEiOworIHRbIlx1RkQ3QiJdID0gIlx1MDYzQVx1MDY0NVx1MDY0OSI7CisgdFsiXHVGRDdDIl0gPSAiXHUwNjQxXHUwNjJFXHUwNjQ1IjsKKyB0WyJcdUZEN0QiXSA9ICJcdTA2NDFcdTA2MkVcdTA2NDUiOworIHRbIlx1RkQ3RSJdID0gIlx1MDY0Mlx1MDY0NVx1MDYyRCI7CisgdFsiXHVGRDdGIl0gPSAiXHUwNjQyXHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZEODAiXSA9ICJcdTA2NDRcdTA2MkRcdTA2NDUiOworIHRbIlx1RkQ4MSJdID0gIlx1MDY0NFx1MDYyRFx1MDY0QSI7CisgdFsiXHVGRDgyIl0gPSAiXHUwNjQ0XHUwNjJEXHUwNjQ5IjsKKyB0WyJcdUZEODMiXSA9ICJcdTA2NDRcdTA2MkNcdTA2MkMiOworIHRbIlx1RkQ4NCJdID0gIlx1MDY0NFx1MDYyQ1x1MDYyQyI7CisgdFsiXHVGRDg1Il0gPSAiXHUwNjQ0XHUwNjJFXHUwNjQ1IjsKKyB0WyJcdUZEODYiXSA9ICJcdTA2NDRcdTA2MkVcdTA2NDUiOworIHRbIlx1RkQ4NyJdID0gIlx1MDY0NFx1MDY0NVx1MDYyRCI7CisgdFsiXHVGRDg4Il0gPSAiXHUwNjQ0XHUwNjQ1XHUwNjJEIjsKKyB0WyJcdUZEODkiXSA9ICJcdTA2NDVcdTA2MkRcdTA2MkMiOworIHRbIlx1RkQ4QSJdID0gIlx1MDY0NVx1MDYyRFx1MDY0NSI7CisgdFsiXHVGRDhCIl0gPSAiXHUwNjQ1XHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEOEMiXSA9ICJcdTA2NDVcdTA2MkNcdTA2MkQiOworIHRbIlx1RkQ4RCJdID0gIlx1MDY0NVx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGRDhFIl0gPSAiXHUwNjQ1XHUwNjJFXHUwNjJDIjsKKyB0WyJcdUZEOEYiXSA9ICJcdTA2NDVcdTA2MkVcdTA2NDUiOworIHRbIlx1RkQ5MiJdID0gIlx1MDY0NVx1MDYyQ1x1MDYyRSI7CisgdFsiXHVGRDkzIl0gPSAiXHUwNjQ3XHUwNjQ1XHUwNjJDIjsKKyB0WyJcdUZEOTQiXSA9ICJcdTA2NDdcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ5NSJdID0gIlx1MDY0Nlx1MDYyRFx1MDY0NSI7CisgdFsiXHVGRDk2Il0gPSAiXHUwNjQ2XHUwNjJEXHUwNjQ5IjsKKyB0WyJcdUZEOTciXSA9ICJcdTA2NDZcdTA2MkNcdTA2NDUiOworIHRbIlx1RkQ5OCJdID0gIlx1MDY0Nlx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGRDk5Il0gPSAiXHUwNjQ2XHUwNjJDXHUwNjQ5IjsKKyB0WyJcdUZEOUEiXSA9ICJcdTA2NDZcdTA2NDVcdTA2NEEiOworIHRbIlx1RkQ5QiJdID0gIlx1MDY0Nlx1MDY0NVx1MDY0OSI7CisgdFsiXHVGRDlDIl0gPSAiXHUwNjRBXHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZEOUQiXSA9ICJcdTA2NEFcdTA2NDVcdTA2NDUiOworIHRbIlx1RkQ5RSJdID0gIlx1MDYyOFx1MDYyRVx1MDY0QSI7CisgdFsiXHVGRDlGIl0gPSAiXHUwNjJBXHUwNjJDXHUwNjRBIjsKKyB0WyJcdUZEQTAiXSA9ICJcdTA2MkFcdTA2MkNcdTA2NDkiOworIHRbIlx1RkRBMSJdID0gIlx1MDYyQVx1MDYyRVx1MDY0QSI7CisgdFsiXHVGREEyIl0gPSAiXHUwNjJBXHUwNjJFXHUwNjQ5IjsKKyB0WyJcdUZEQTMiXSA9ICJcdTA2MkFcdTA2NDVcdTA2NEEiOworIHRbIlx1RkRBNCJdID0gIlx1MDYyQVx1MDY0NVx1MDY0OSI7CisgdFsiXHVGREE1Il0gPSAiXHUwNjJDXHUwNjQ1XHUwNjRBIjsKKyB0WyJcdUZEQTYiXSA9ICJcdTA2MkNcdTA2MkRcdTA2NDkiOworIHRbIlx1RkRBNyJdID0gIlx1MDYyQ1x1MDY0NVx1MDY0OSI7CisgdFsiXHVGREE4Il0gPSAiXHUwNjMzXHUwNjJFXHUwNjQ5IjsKKyB0WyJcdUZEQTkiXSA9ICJcdTA2MzVcdTA2MkRcdTA2NEEiOworIHRbIlx1RkRBQSJdID0gIlx1MDYzNFx1MDYyRFx1MDY0QSI7CisgdFsiXHVGREFCIl0gPSAiXHUwNjM2XHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEQUMiXSA9ICJcdTA2NDRcdTA2MkNcdTA2NEEiOworIHRbIlx1RkRBRCJdID0gIlx1MDY0NFx1MDY0NVx1MDY0QSI7CisgdFsiXHVGREFFIl0gPSAiXHUwNjRBXHUwNjJEXHUwNjRBIjsKKyB0WyJcdUZEQUYiXSA9ICJcdTA2NEFcdTA2MkNcdTA2NEEiOworIHRbIlx1RkRCMCJdID0gIlx1MDY0QVx1MDY0NVx1MDY0QSI7CisgdFsiXHVGREIxIl0gPSAiXHUwNjQ1XHUwNjQ1XHUwNjRBIjsKKyB0WyJcdUZEQjIiXSA9ICJcdTA2NDJcdTA2NDVcdTA2NEEiOworIHRbIlx1RkRCMyJdID0gIlx1MDY0Nlx1MDYyRFx1MDY0QSI7CisgdFsiXHVGREI0Il0gPSAiXHUwNjQyXHUwNjQ1XHUwNjJEIjsKKyB0WyJcdUZEQjUiXSA9ICJcdTA2NDRcdTA2MkRcdTA2NDUiOworIHRbIlx1RkRCNiJdID0gIlx1MDYzOVx1MDY0NVx1MDY0QSI7CisgdFsiXHVGREI3Il0gPSAiXHUwNjQzXHUwNjQ1XHUwNjRBIjsKKyB0WyJcdUZEQjgiXSA9ICJcdTA2NDZcdTA2MkNcdTA2MkQiOworIHRbIlx1RkRCOSJdID0gIlx1MDY0NVx1MDYyRVx1MDY0QSI7CisgdFsiXHVGREJBIl0gPSAiXHUwNjQ0XHUwNjJDXHUwNjQ1IjsKKyB0WyJcdUZEQkIiXSA9ICJcdTA2NDNcdTA2NDVcdTA2NDUiOworIHRbIlx1RkRCQyJdID0gIlx1MDY0NFx1MDYyQ1x1MDY0NSI7CisgdFsiXHVGREJEIl0gPSAiXHUwNjQ2XHUwNjJDXHUwNjJEIjsKKyB0WyJcdUZEQkUiXSA9ICJcdTA2MkNcdTA2MkRcdTA2NEEiOworIHRbIlx1RkRCRiJdID0gIlx1MDYyRFx1MDYyQ1x1MDY0QSI7CisgdFsiXHVGREMwIl0gPSAiXHUwNjQ1XHUwNjJDXHUwNjRBIjsKKyB0WyJcdUZEQzEiXSA9ICJcdTA2NDFcdTA2NDVcdTA2NEEiOworIHRbIlx1RkRDMiJdID0gIlx1MDYyOFx1MDYyRFx1MDY0QSI7CisgdFsiXHVGREMzIl0gPSAiXHUwNjQzXHUwNjQ1XHUwNjQ1IjsKKyB0WyJcdUZEQzQiXSA9ICJcdTA2MzlcdTA2MkNcdTA2NDUiOworIHRbIlx1RkRDNSJdID0gIlx1MDYzNVx1MDY0NVx1MDY0NSI7CisgdFsiXHVGREM2Il0gPSAiXHUwNjMzXHUwNjJFXHUwNjRBIjsKKyB0WyJcdUZEQzciXSA9ICJcdTA2NDZcdTA2MkNcdTA2NEEiOworIHRbIlx1RkU0OSJdID0gIlx1MjAzRSI7CisgdFsiXHVGRTRBIl0gPSAiXHUyMDNFIjsKKyB0WyJcdUZFNEIiXSA9ICJcdTIwM0UiOworIHRbIlx1RkU0QyJdID0gIlx1MjAzRSI7CisgdFsiXHVGRTREIl0gPSAiXHUwMDVGIjsKKyB0WyJcdUZFNEUiXSA9ICJcdTAwNUYiOworIHRbIlx1RkU0RiJdID0gIlx1MDA1RiI7CisgdFsiXHVGRTgwIl0gPSAiXHUwNjIxIjsKKyB0WyJcdUZFODEiXSA9ICJcdTA2MjIiOworIHRbIlx1RkU4MiJdID0gIlx1MDYyMiI7CisgdFsiXHVGRTgzIl0gPSAiXHUwNjIzIjsKKyB0WyJcdUZFODQiXSA9ICJcdTA2MjMiOworIHRbIlx1RkU4NSJdID0gIlx1MDYyNCI7CisgdFsiXHVGRTg2Il0gPSAiXHUwNjI0IjsKKyB0WyJcdUZFODciXSA9ICJcdTA2MjUiOworIHRbIlx1RkU4OCJdID0gIlx1MDYyNSI7CisgdFsiXHVGRTg5Il0gPSAiXHUwNjI2IjsKKyB0WyJcdUZFOEEiXSA9ICJcdTA2MjYiOworIHRbIlx1RkU4QiJdID0gIlx1MDYyNiI7CisgdFsiXHVGRThDIl0gPSAiXHUwNjI2IjsKKyB0WyJcdUZFOEQiXSA9ICJcdTA2MjciOworIHRbIlx1RkU4RSJdID0gIlx1MDYyNyI7CisgdFsiXHVGRThGIl0gPSAiXHUwNjI4IjsKKyB0WyJcdUZFOTAiXSA9ICJcdTA2MjgiOworIHRbIlx1RkU5MSJdID0gIlx1MDYyOCI7CisgdFsiXHVGRTkyIl0gPSAiXHUwNjI4IjsKKyB0WyJcdUZFOTMiXSA9ICJcdTA2MjkiOworIHRbIlx1RkU5NCJdID0gIlx1MDYyOSI7CisgdFsiXHVGRTk1Il0gPSAiXHUwNjJBIjsKKyB0WyJcdUZFOTYiXSA9ICJcdTA2MkEiOworIHRbIlx1RkU5NyJdID0gIlx1MDYyQSI7CisgdFsiXHVGRTk4Il0gPSAiXHUwNjJBIjsKKyB0WyJcdUZFOTkiXSA9ICJcdTA2MkIiOworIHRbIlx1RkU5QSJdID0gIlx1MDYyQiI7CisgdFsiXHVGRTlCIl0gPSAiXHUwNjJCIjsKKyB0WyJcdUZFOUMiXSA9ICJcdTA2MkIiOworIHRbIlx1RkU5RCJdID0gIlx1MDYyQyI7CisgdFsiXHVGRTlFIl0gPSAiXHUwNjJDIjsKKyB0WyJcdUZFOUYiXSA9ICJcdTA2MkMiOworIHRbIlx1RkVBMCJdID0gIlx1MDYyQyI7CisgdFsiXHVGRUExIl0gPSAiXHUwNjJEIjsKKyB0WyJcdUZFQTIiXSA9ICJcdTA2MkQiOworIHRbIlx1RkVBMyJdID0gIlx1MDYyRCI7CisgdFsiXHVGRUE0Il0gPSAiXHUwNjJEIjsKKyB0WyJcdUZFQTUiXSA9ICJcdTA2MkUiOworIHRbIlx1RkVBNiJdID0gIlx1MDYyRSI7CisgdFsiXHVGRUE3Il0gPSAiXHUwNjJFIjsKKyB0WyJcdUZFQTgiXSA9ICJcdTA2MkUiOworIHRbIlx1RkVBOSJdID0gIlx1MDYyRiI7CisgdFsiXHVGRUFBIl0gPSAiXHUwNjJGIjsKKyB0WyJcdUZFQUIiXSA9ICJcdTA2MzAiOworIHRbIlx1RkVBQyJdID0gIlx1MDYzMCI7CisgdFsiXHVGRUFEIl0gPSAiXHUwNjMxIjsKKyB0WyJcdUZFQUUiXSA9ICJcdTA2MzEiOworIHRbIlx1RkVBRiJdID0gIlx1MDYzMiI7CisgdFsiXHVGRUIwIl0gPSAiXHUwNjMyIjsKKyB0WyJcdUZFQjEiXSA9ICJcdTA2MzMiOworIHRbIlx1RkVCMiJdID0gIlx1MDYzMyI7CisgdFsiXHVGRUIzIl0gPSAiXHUwNjMzIjsKKyB0WyJcdUZFQjQiXSA9ICJcdTA2MzMiOworIHRbIlx1RkVCNSJdID0gIlx1MDYzNCI7CisgdFsiXHVGRUI2Il0gPSAiXHUwNjM0IjsKKyB0WyJcdUZFQjciXSA9ICJcdTA2MzQiOworIHRbIlx1RkVCOCJdID0gIlx1MDYzNCI7CisgdFsiXHVGRUI5Il0gPSAiXHUwNjM1IjsKKyB0WyJcdUZFQkEiXSA9ICJcdTA2MzUiOworIHRbIlx1RkVCQiJdID0gIlx1MDYzNSI7CisgdFsiXHVGRUJDIl0gPSAiXHUwNjM1IjsKKyB0WyJcdUZFQkQiXSA9ICJcdTA2MzYiOworIHRbIlx1RkVCRSJdID0gIlx1MDYzNiI7CisgdFsiXHVGRUJGIl0gPSAiXHUwNjM2IjsKKyB0WyJcdUZFQzAiXSA9ICJcdTA2MzYiOworIHRbIlx1RkVDMSJdID0gIlx1MDYzNyI7CisgdFsiXHVGRUMyIl0gPSAiXHUwNjM3IjsKKyB0WyJcdUZFQzMiXSA9ICJcdTA2MzciOworIHRbIlx1RkVDNCJdID0gIlx1MDYzNyI7CisgdFsiXHVGRUM1Il0gPSAiXHUwNjM4IjsKKyB0WyJcdUZFQzYiXSA9ICJcdTA2MzgiOworIHRbIlx1RkVDNyJdID0gIlx1MDYzOCI7CisgdFsiXHVGRUM4Il0gPSAiXHUwNjM4IjsKKyB0WyJcdUZFQzkiXSA9ICJcdTA2MzkiOworIHRbIlx1RkVDQSJdID0gIlx1MDYzOSI7CisgdFsiXHVGRUNCIl0gPSAiXHUwNjM5IjsKKyB0WyJcdUZFQ0MiXSA9ICJcdTA2MzkiOworIHRbIlx1RkVDRCJdID0gIlx1MDYzQSI7CisgdFsiXHVGRUNFIl0gPSAiXHUwNjNBIjsKKyB0WyJcdUZFQ0YiXSA9ICJcdTA2M0EiOworIHRbIlx1RkVEMCJdID0gIlx1MDYzQSI7CisgdFsiXHVGRUQxIl0gPSAiXHUwNjQxIjsKKyB0WyJcdUZFRDIiXSA9ICJcdTA2NDEiOworIHRbIlx1RkVEMyJdID0gIlx1MDY0MSI7CisgdFsiXHVGRUQ0Il0gPSAiXHUwNjQxIjsKKyB0WyJcdUZFRDUiXSA9ICJcdTA2NDIiOworIHRbIlx1RkVENiJdID0gIlx1MDY0MiI7CisgdFsiXHVGRUQ3Il0gPSAiXHUwNjQyIjsKKyB0WyJcdUZFRDgiXSA9ICJcdTA2NDIiOworIHRbIlx1RkVEOSJdID0gIlx1MDY0MyI7CisgdFsiXHVGRURBIl0gPSAiXHUwNjQzIjsKKyB0WyJcdUZFREIiXSA9ICJcdTA2NDMiOworIHRbIlx1RkVEQyJdID0gIlx1MDY0MyI7CisgdFsiXHVGRUREIl0gPSAiXHUwNjQ0IjsKKyB0WyJcdUZFREUiXSA9ICJcdTA2NDQiOworIHRbIlx1RkVERiJdID0gIlx1MDY0NCI7CisgdFsiXHVGRUUwIl0gPSAiXHUwNjQ0IjsKKyB0WyJcdUZFRTEiXSA9ICJcdTA2NDUiOworIHRbIlx1RkVFMiJdID0gIlx1MDY0NSI7CisgdFsiXHVGRUUzIl0gPSAiXHUwNjQ1IjsKKyB0WyJcdUZFRTQiXSA9ICJcdTA2NDUiOworIHRbIlx1RkVFNSJdID0gIlx1MDY0NiI7CisgdFsiXHVGRUU2Il0gPSAiXHUwNjQ2IjsKKyB0WyJcdUZFRTciXSA9ICJcdTA2NDYiOworIHRbIlx1RkVFOCJdID0gIlx1MDY0NiI7CisgdFsiXHVGRUU5Il0gPSAiXHUwNjQ3IjsKKyB0WyJcdUZFRUEiXSA9ICJcdTA2NDciOworIHRbIlx1RkVFQiJdID0gIlx1MDY0NyI7CisgdFsiXHVGRUVDIl0gPSAiXHUwNjQ3IjsKKyB0WyJcdUZFRUQiXSA9ICJcdTA2NDgiOworIHRbIlx1RkVFRSJdID0gIlx1MDY0OCI7CisgdFsiXHVGRUVGIl0gPSAiXHUwNjQ5IjsKKyB0WyJcdUZFRjAiXSA9ICJcdTA2NDkiOworIHRbIlx1RkVGMSJdID0gIlx1MDY0QSI7CisgdFsiXHVGRUYyIl0gPSAiXHUwNjRBIjsKKyB0WyJcdUZFRjMiXSA9ICJcdTA2NEEiOworIHRbIlx1RkVGNCJdID0gIlx1MDY0QSI7CisgdFsiXHVGRUY1Il0gPSAiXHUwNjQ0XHUwNjIyIjsKKyB0WyJcdUZFRjYiXSA9ICJcdTA2NDRcdTA2MjIiOworIHRbIlx1RkVGNyJdID0gIlx1MDY0NFx1MDYyMyI7CisgdFsiXHVGRUY4Il0gPSAiXHUwNjQ0XHUwNjIzIjsKKyB0WyJcdUZFRjkiXSA9ICJcdTA2NDRcdTA2MjUiOworIHRbIlx1RkVGQSJdID0gIlx1MDY0NFx1MDYyNSI7CisgdFsiXHVGRUZCIl0gPSAiXHUwNjQ0XHUwNjI3IjsKKyB0WyJcdUZFRkMiXSA9ICJcdTA2NDRcdTA2MjciOworfSk7CitmdW5jdGlvbiByZXZlcnNlSWZSdGwoY2hhcnMpIHsKKyB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7CisgaWYgKGNoYXJzTGVuZ3RoIDw9IDEgfHwgIWlzUlRMUmFuZ2VGb3IoY2hhcnMuY2hhckNvZGVBdCgwKSkpIHsKKyAgcmV0dXJuIGNoYXJzOworIH0KKyB2YXIgcyA9ICIiOworIGZvciAodmFyIGlpID0gY2hhcnNMZW5ndGggLSAxOyBpaSA+PSAwOyBpaS0tKSB7CisgIHMgKz0gY2hhcnNbaWldOworIH0KKyByZXR1cm4gczsKK30KK2V4cG9ydHMubWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXMgPSBtYXBTcGVjaWFsVW5pY29kZVZhbHVlczsKK2V4cG9ydHMucmV2ZXJzZUlmUnRsID0gcmV2ZXJzZUlmUnRsOworZXhwb3J0cy5nZXRVbmljb2RlUmFuZ2VGb3IgPSBnZXRVbmljb2RlUmFuZ2VGb3I7CitleHBvcnRzLmdldE5vcm1hbGl6ZWRVbmljb2RlcyA9IGdldE5vcm1hbGl6ZWRVbmljb2RlczsKK2V4cG9ydHMuZ2V0VW5pY29kZUZvckdseXBoID0gZ2V0VW5pY29kZUZvckdseXBoOworCisvKioqLyB9KSwKKy8qIDIzNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkZvbnRSZW5kZXJlckZhY3RvcnkgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY2ZmX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjI4KTsKKwordmFyIF9nbHlwaGxpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzMSk7CisKK3ZhciBfZW5jb2RpbmdzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMzApOworCit2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA5KTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBGb250UmVuZGVyZXJGYWN0b3J5ID0gZnVuY3Rpb24gRm9udFJlbmRlcmVyRmFjdG9yeUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGdldExvbmcoZGF0YSwgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdOworICB9CisKKyAgZnVuY3Rpb24gZ2V0VXNob3J0KGRhdGEsIG9mZnNldCkgeworICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgMV07CisgIH0KKworICBmdW5jdGlvbiBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycykgeworICAgIHZhciBudW1TdWJycyA9IHN1YnJzLmxlbmd0aDsKKyAgICB2YXIgYmlhcyA9IDMyNzY4OworCisgICAgaWYgKG51bVN1YnJzIDwgMTI0MCkgeworICAgICAgYmlhcyA9IDEwNzsKKyAgICB9IGVsc2UgaWYgKG51bVN1YnJzIDwgMzM5MDApIHsKKyAgICAgIGJpYXMgPSAxMTMxOworICAgIH0KKworICAgIHJldHVybiBiaWFzOworICB9CisKKyAgZnVuY3Rpb24gcGFyc2VDbWFwKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICB2YXIgb2Zmc2V0ID0gZ2V0VXNob3J0KGRhdGEsIHN0YXJ0ICsgMikgPT09IDEgPyBnZXRMb25nKGRhdGEsIHN0YXJ0ICsgOCkgOiBnZXRMb25nKGRhdGEsIHN0YXJ0ICsgMTYpOworICAgIHZhciBmb3JtYXQgPSBnZXRVc2hvcnQoZGF0YSwgc3RhcnQgKyBvZmZzZXQpOworICAgIHZhciByYW5nZXMsIHAsIGk7CisKKyAgICBpZiAoZm9ybWF0ID09PSA0KSB7CisgICAgICBnZXRVc2hvcnQoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyAyKTsKKyAgICAgIHZhciBzZWdDb3VudCA9IGdldFVzaG9ydChkYXRhLCBzdGFydCArIG9mZnNldCArIDYpID4+IDE7CisgICAgICBwID0gc3RhcnQgKyBvZmZzZXQgKyAxNDsKKyAgICAgIHJhbmdlcyA9IFtdOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CisgICAgICAgIHJhbmdlc1tpXSA9IHsKKyAgICAgICAgICBlbmQ6IGdldFVzaG9ydChkYXRhLCBwKQorICAgICAgICB9OworICAgICAgfQorCisgICAgICBwICs9IDI7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKKyAgICAgICAgcmFuZ2VzW2ldLnN0YXJ0ID0gZ2V0VXNob3J0KGRhdGEsIHApOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CisgICAgICAgIHJhbmdlc1tpXS5pZERlbHRhID0gZ2V0VXNob3J0KGRhdGEsIHApOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CisgICAgICAgIHZhciBpZE9mZnNldCA9IGdldFVzaG9ydChkYXRhLCBwKTsKKworICAgICAgICBpZiAoaWRPZmZzZXQgPT09IDApIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJhbmdlc1tpXS5pZHMgPSBbXTsKKworICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSByYW5nZXNbaV0uZW5kIC0gcmFuZ2VzW2ldLnN0YXJ0ICsgMTsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICByYW5nZXNbaV0uaWRzW2pdID0gZ2V0VXNob3J0KGRhdGEsIHAgKyBpZE9mZnNldCk7CisgICAgICAgICAgaWRPZmZzZXQgKz0gMjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gcmFuZ2VzOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAxMikgeworICAgICAgZ2V0TG9uZyhkYXRhLCBzdGFydCArIG9mZnNldCArIDQpOworICAgICAgdmFyIGdyb3VwcyA9IGdldExvbmcoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyAxMik7CisgICAgICBwID0gc3RhcnQgKyBvZmZzZXQgKyAxNjsKKyAgICAgIHJhbmdlcyA9IFtdOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspIHsKKyAgICAgICAgcmFuZ2VzLnB1c2goeworICAgICAgICAgIHN0YXJ0OiBnZXRMb25nKGRhdGEsIHApLAorICAgICAgICAgIGVuZDogZ2V0TG9uZyhkYXRhLCBwICsgNCksCisgICAgICAgICAgaWREZWx0YTogZ2V0TG9uZyhkYXRhLCBwICsgOCkgLSBnZXRMb25nKGRhdGEsIHApCisgICAgICAgIH0pOworICAgICAgICBwICs9IDEyOworICAgICAgfQorCisgICAgICByZXR1cm4gcmFuZ2VzOworICAgIH0KKworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5zdXBwb3J0ZWQgY21hcDogIi5jb25jYXQoZm9ybWF0KSk7CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUNmZihkYXRhLCBzdGFydCwgZW5kLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CisgICAgdmFyIHByb3BlcnRpZXMgPSB7fTsKKyAgICB2YXIgcGFyc2VyID0gbmV3IF9jZmZfcGFyc2VyLkNGRlBhcnNlcihuZXcgX3N0cmVhbS5TdHJlYW0oZGF0YSwgc3RhcnQsIGVuZCAtIHN0YXJ0KSwgcHJvcGVydGllcywgc2VhY0FuYWx5c2lzRW5hYmxlZCk7CisgICAgdmFyIGNmZiA9IHBhcnNlci5wYXJzZSgpOworICAgIHJldHVybiB7CisgICAgICBnbHlwaHM6IGNmZi5jaGFyU3RyaW5ncy5vYmplY3RzLAorICAgICAgc3VicnM6IGNmZi50b3BEaWN0LnByaXZhdGVEaWN0ICYmIGNmZi50b3BEaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXggJiYgY2ZmLnRvcERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleC5vYmplY3RzLAorICAgICAgZ3N1YnJzOiBjZmYuZ2xvYmFsU3VickluZGV4ICYmIGNmZi5nbG9iYWxTdWJySW5kZXgub2JqZWN0cywKKyAgICAgIGlzQ0ZGQ0lERm9udDogY2ZmLmlzQ0lERm9udCwKKyAgICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsCisgICAgICBmZEFycmF5OiBjZmYuZmRBcnJheQorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUdseWZUYWJsZShnbHlmLCBsb2NhLCBpc0dseXBoTG9jYXRpb25zTG9uZykgeworICAgIHZhciBpdGVtU2l6ZSwgaXRlbURlY29kZTsKKworICAgIGlmIChpc0dseXBoTG9jYXRpb25zTG9uZykgeworICAgICAgaXRlbVNpemUgPSA0OworCisgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGVMb25nKGRhdGEsIG9mZnNldCkgeworICAgICAgICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNiB8IGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgM107CisgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICBpdGVtU2l6ZSA9IDI7CisKKyAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZShkYXRhLCBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA5IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxOworICAgICAgfTsKKyAgICB9CisKKyAgICB2YXIgZ2x5cGhzID0gW107CisgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gaXRlbURlY29kZShsb2NhLCAwKTsKKworICAgIGZvciAodmFyIGogPSBpdGVtU2l6ZTsgaiA8IGxvY2EubGVuZ3RoOyBqICs9IGl0ZW1TaXplKSB7CisgICAgICB2YXIgZW5kT2Zmc2V0ID0gaXRlbURlY29kZShsb2NhLCBqKTsKKyAgICAgIGdseXBocy5wdXNoKGdseWYuc3ViYXJyYXkoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCkpOworICAgICAgc3RhcnRPZmZzZXQgPSBlbmRPZmZzZXQ7CisgICAgfQorCisgICAgcmV0dXJuIGdseXBoczsKKyAgfQorCisgIGZ1bmN0aW9uIGxvb2t1cENtYXAocmFuZ2VzLCB1bmljb2RlKSB7CisgICAgdmFyIGNvZGUgPSB1bmljb2RlLmNvZGVQb2ludEF0KDApLAorICAgICAgICBnaWQgPSAwOworICAgIHZhciBsID0gMCwKKyAgICAgICAgciA9IHJhbmdlcy5sZW5ndGggLSAxOworCisgICAgd2hpbGUgKGwgPCByKSB7CisgICAgICB2YXIgYyA9IGwgKyByICsgMSA+PiAxOworCisgICAgICBpZiAoY29kZSA8IHJhbmdlc1tjXS5zdGFydCkgeworICAgICAgICByID0gYyAtIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBsID0gYzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmFuZ2VzW2xdLnN0YXJ0IDw9IGNvZGUgJiYgY29kZSA8PSByYW5nZXNbbF0uZW5kKSB7CisgICAgICBnaWQgPSByYW5nZXNbbF0uaWREZWx0YSArIChyYW5nZXNbbF0uaWRzID8gcmFuZ2VzW2xdLmlkc1tjb2RlIC0gcmFuZ2VzW2xdLnN0YXJ0XSA6IGNvZGUpICYgMHhmZmZmOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBjaGFyQ29kZTogY29kZSwKKyAgICAgIGdseXBoSWQ6IGdpZAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBjb21waWxlR2x5Zihjb2RlLCBjbWRzLCBmb250KSB7CisgICAgZnVuY3Rpb24gbW92ZVRvKHgsIHkpIHsKKyAgICAgIGNtZHMucHVzaCh7CisgICAgICAgIGNtZDogIm1vdmVUbyIsCisgICAgICAgIGFyZ3M6IFt4LCB5XQorICAgICAgfSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gbGluZVRvKHgsIHkpIHsKKyAgICAgIGNtZHMucHVzaCh7CisgICAgICAgIGNtZDogImxpbmVUbyIsCisgICAgICAgIGFyZ3M6IFt4LCB5XQorICAgICAgfSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gcXVhZHJhdGljQ3VydmVUbyh4YSwgeWEsIHgsIHkpIHsKKyAgICAgIGNtZHMucHVzaCh7CisgICAgICAgIGNtZDogInF1YWRyYXRpY0N1cnZlVG8iLAorICAgICAgICBhcmdzOiBbeGEsIHlhLCB4LCB5XQorICAgICAgfSk7CisgICAgfQorCisgICAgdmFyIGkgPSAwOworICAgIHZhciBudW1iZXJPZkNvbnRvdXJzID0gKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNikgPj4gMTY7CisgICAgdmFyIGZsYWdzOworICAgIHZhciB4ID0gMCwKKyAgICAgICAgeSA9IDA7CisgICAgaSArPSAxMDsKKworICAgIGlmIChudW1iZXJPZkNvbnRvdXJzIDwgMCkgeworICAgICAgZG8geworICAgICAgICBmbGFncyA9IGNvZGVbaV0gPDwgOCB8IGNvZGVbaSArIDFdOworICAgICAgICB2YXIgZ2x5cGhJbmRleCA9IGNvZGVbaSArIDJdIDw8IDggfCBjb2RlW2kgKyAzXTsKKyAgICAgICAgaSArPSA0OworICAgICAgICB2YXIgYXJnMSwgYXJnMjsKKworICAgICAgICBpZiAoZmxhZ3MgJiAweDAxKSB7CisgICAgICAgICAgYXJnMSA9IChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpID4+IDE2OworICAgICAgICAgIGFyZzIgPSAoY29kZVtpICsgMl0gPDwgMjQgfCBjb2RlW2kgKyAzXSA8PCAxNikgPj4gMTY7CisgICAgICAgICAgaSArPSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFyZzEgPSBjb2RlW2krK107CisgICAgICAgICAgYXJnMiA9IGNvZGVbaSsrXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFncyAmIDB4MDIpIHsKKyAgICAgICAgICB4ID0gYXJnMTsKKyAgICAgICAgICB5ID0gYXJnMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICB5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzY2FsZVggPSAxLAorICAgICAgICAgICAgc2NhbGVZID0gMSwKKyAgICAgICAgICAgIHNjYWxlMDEgPSAwLAorICAgICAgICAgICAgc2NhbGUxMCA9IDA7CisKKyAgICAgICAgaWYgKGZsYWdzICYgMHgwOCkgeworICAgICAgICAgIHNjYWxlWCA9IHNjYWxlWSA9IChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpIC8gMTA3Mzc0MTgyNDsKKyAgICAgICAgICBpICs9IDI7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDQwKSB7CisgICAgICAgICAgc2NhbGVYID0gKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNikgLyAxMDczNzQxODI0OworICAgICAgICAgIHNjYWxlWSA9IChjb2RlW2kgKyAyXSA8PCAyNCB8IGNvZGVbaSArIDNdIDw8IDE2KSAvIDEwNzM3NDE4MjQ7CisgICAgICAgICAgaSArPSA0OworICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgMHg4MCkgeworICAgICAgICAgIHNjYWxlWCA9IChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpIC8gMTA3Mzc0MTgyNDsKKyAgICAgICAgICBzY2FsZTAxID0gKGNvZGVbaSArIDJdIDw8IDI0IHwgY29kZVtpICsgM10gPDwgMTYpIC8gMTA3Mzc0MTgyNDsKKyAgICAgICAgICBzY2FsZTEwID0gKGNvZGVbaSArIDRdIDw8IDI0IHwgY29kZVtpICsgNV0gPDwgMTYpIC8gMTA3Mzc0MTgyNDsKKyAgICAgICAgICBzY2FsZVkgPSAoY29kZVtpICsgNl0gPDwgMjQgfCBjb2RlW2kgKyA3XSA8PCAxNikgLyAxMDczNzQxODI0OworICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzdWJnbHlwaCA9IGZvbnQuZ2x5cGhzW2dseXBoSW5kZXhdOworCisgICAgICAgIGlmIChzdWJnbHlwaCkgeworICAgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgICBjbWQ6ICJzYXZlIgorICAgICAgICAgIH0pOworICAgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgICBjbWQ6ICJ0cmFuc2Zvcm0iLAorICAgICAgICAgICAgYXJnczogW3NjYWxlWCwgc2NhbGUwMSwgc2NhbGUxMCwgc2NhbGVZLCB4LCB5XQorICAgICAgICAgIH0pOworICAgICAgICAgIGNvbXBpbGVHbHlmKHN1YmdseXBoLCBjbWRzLCBmb250KTsKKyAgICAgICAgICBjbWRzLnB1c2goeworICAgICAgICAgICAgY21kOiAicmVzdG9yZSIKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoZmxhZ3MgJiAweDIwKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGVuZFB0c09mQ29udG91cnMgPSBbXTsKKyAgICAgIHZhciBqLCBqajsKKworICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mQ29udG91cnM7IGorKykgeworICAgICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2goY29kZVtpXSA8PCA4IHwgY29kZVtpICsgMV0pOworICAgICAgICBpICs9IDI7CisgICAgICB9CisKKyAgICAgIHZhciBpbnN0cnVjdGlvbkxlbmd0aCA9IGNvZGVbaV0gPDwgOCB8IGNvZGVbaSArIDFdOworICAgICAgaSArPSAyICsgaW5zdHJ1Y3Rpb25MZW5ndGg7CisgICAgICB2YXIgbnVtYmVyT2ZQb2ludHMgPSBlbmRQdHNPZkNvbnRvdXJzW2VuZFB0c09mQ29udG91cnMubGVuZ3RoIC0gMV0gKyAxOworICAgICAgdmFyIHBvaW50cyA9IFtdOworCisgICAgICB3aGlsZSAocG9pbnRzLmxlbmd0aCA8IG51bWJlck9mUG9pbnRzKSB7CisgICAgICAgIGZsYWdzID0gY29kZVtpKytdOworICAgICAgICB2YXIgcmVwZWF0ID0gMTsKKworICAgICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7CisgICAgICAgICAgcmVwZWF0ICs9IGNvZGVbaSsrXTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChyZXBlYXQtLSA+IDApIHsKKyAgICAgICAgICBwb2ludHMucHVzaCh7CisgICAgICAgICAgICBmbGFnczogZmxhZ3MKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZQb2ludHM7IGorKykgeworICAgICAgICBzd2l0Y2ggKHBvaW50c1tqXS5mbGFncyAmIDB4MTIpIHsKKyAgICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICB4ICs9IChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpID4+IDE2OworICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICB4IC09IGNvZGVbaSsrXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDEyOgorICAgICAgICAgICAgeCArPSBjb2RlW2krK107CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBvaW50c1tqXS54ID0geDsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKKyAgICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDI0KSB7CisgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgeSArPSAoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSA+PiAxNjsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDA0OgorICAgICAgICAgICAgeSAtPSBjb2RlW2krK107CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHgyNDoKKyAgICAgICAgICAgIHkgKz0gY29kZVtpKytdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwb2ludHNbal0ueSA9IHk7CisgICAgICB9CisKKyAgICAgIHZhciBzdGFydFBvaW50ID0gMDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgeworICAgICAgICB2YXIgZW5kUG9pbnQgPSBlbmRQdHNPZkNvbnRvdXJzW2ldOworICAgICAgICB2YXIgY29udG91ciA9IHBvaW50cy5zbGljZShzdGFydFBvaW50LCBlbmRQb2ludCArIDEpOworCisgICAgICAgIGlmIChjb250b3VyWzBdLmZsYWdzICYgMSkgeworICAgICAgICAgIGNvbnRvdXIucHVzaChjb250b3VyWzBdKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0uZmxhZ3MgJiAxKSB7CisgICAgICAgICAgY29udG91ci51bnNoaWZ0KGNvbnRvdXJbY29udG91ci5sZW5ndGggLSAxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIHAgPSB7CisgICAgICAgICAgICBmbGFnczogMSwKKyAgICAgICAgICAgIHg6IChjb250b3VyWzBdLnggKyBjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0ueCkgLyAyLAorICAgICAgICAgICAgeTogKGNvbnRvdXJbMF0ueSArIGNvbnRvdXJbY29udG91ci5sZW5ndGggLSAxXS55KSAvIDIKKyAgICAgICAgICB9OworICAgICAgICAgIGNvbnRvdXIudW5zaGlmdChwKTsKKyAgICAgICAgICBjb250b3VyLnB1c2gocCk7CisgICAgICAgIH0KKworICAgICAgICBtb3ZlVG8oY29udG91clswXS54LCBjb250b3VyWzBdLnkpOworCisgICAgICAgIGZvciAoaiA9IDEsIGpqID0gY29udG91ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgaWYgKGNvbnRvdXJbal0uZmxhZ3MgJiAxKSB7CisgICAgICAgICAgICBsaW5lVG8oY29udG91cltqXS54LCBjb250b3VyW2pdLnkpOworICAgICAgICAgIH0gZWxzZSBpZiAoY29udG91cltqICsgMV0uZmxhZ3MgJiAxKSB7CisgICAgICAgICAgICBxdWFkcmF0aWNDdXJ2ZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55LCBjb250b3VyW2ogKyAxXS54LCBjb250b3VyW2ogKyAxXS55KTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVhZHJhdGljQ3VydmVUbyhjb250b3VyW2pdLngsIGNvbnRvdXJbal0ueSwgKGNvbnRvdXJbal0ueCArIGNvbnRvdXJbaiArIDFdLngpIC8gMiwgKGNvbnRvdXJbal0ueSArIGNvbnRvdXJbaiArIDFdLnkpIC8gMik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhcnRQb2ludCA9IGVuZFBvaW50ICsgMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21waWxlQ2hhclN0cmluZyhjaGFyU3RyaW5nQ29kZSwgY21kcywgZm9udCwgZ2x5cGhJZCkgeworICAgIGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJtb3ZlVG8iLAorICAgICAgICBhcmdzOiBbeCwgeV0KKyAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJsaW5lVG8iLAorICAgICAgICBhcmdzOiBbeCwgeV0KKyAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIGJlemllckN1cnZlVG8oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsKKyAgICAgIGNtZHMucHVzaCh7CisgICAgICAgIGNtZDogImJlemllckN1cnZlVG8iLAorICAgICAgICBhcmdzOiBbeDEsIHkxLCB4MiwgeTIsIHgsIHldCisgICAgICB9KTsKKyAgICB9CisKKyAgICB2YXIgc3RhY2sgPSBbXTsKKyAgICB2YXIgeCA9IDAsCisgICAgICAgIHkgPSAwOworICAgIHZhciBzdGVtcyA9IDA7CisKKyAgICBmdW5jdGlvbiBwYXJzZShjb2RlKSB7CisgICAgICB2YXIgaSA9IDA7CisKKyAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHsKKyAgICAgICAgdmFyIHN0YWNrQ2xlYW4gPSBmYWxzZTsKKyAgICAgICAgdmFyIHYgPSBjb2RlW2krK107CisgICAgICAgIHZhciB4YSwgeGIsIHlhLCB5YiwgeTEsIHkyLCB5Mywgbiwgc3VickNvZGU7CisKKyAgICAgICAgc3dpdGNoICh2KSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgeSArPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIG1vdmVUbyh4LCB5KTsKKyAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworCisgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworCisgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN1YnJDb2RlID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGZvbnQuaXNDRkZDSURGb250KSB7CisgICAgICAgICAgICAgIHZhciBmZEluZGV4ID0gZm9udC5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOworCisgICAgICAgICAgICAgIGlmIChmZEluZGV4ID49IDAgJiYgZmRJbmRleCA8IGZvbnQuZmRBcnJheS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB2YXIgZm9udERpY3QgPSBmb250LmZkQXJyYXlbZmRJbmRleF07CisgICAgICAgICAgICAgICAgdmFyIHN1YnJzID0gdm9pZCAwOworCisgICAgICAgICAgICAgICAgaWYgKGZvbnREaWN0LnByaXZhdGVEaWN0ICYmIGZvbnREaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgIHN1YnJzID0gZm9udERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleC5vYmplY3RzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdWJycykgeworICAgICAgICAgICAgICAgICAgbiArPSBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycyk7CisgICAgICAgICAgICAgICAgICBzdWJyQ29kZSA9IHN1YnJzW25dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdWJyQ29kZSA9IGZvbnQuc3VicnNbbiArIGZvbnQuc3VicnNCaWFzXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN1YnJDb2RlKSB7CisgICAgICAgICAgICAgIHBhcnNlKHN1YnJDb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIHYgPSBjb2RlW2krK107CisKKyAgICAgICAgICAgIHN3aXRjaCAodikgeworICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHksIHhiLCB5MSwgeCwgeTEpOworICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHksIHgsIHkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5MSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHkyID0geTEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeTEsIHhiLCB5MiwgeCwgeTIpOworICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeTMgPSB5MiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MiwgeGIsIHkzLCB4LCB5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgIHZhciB4MCA9IHgsCisgICAgICAgICAgICAgICAgICAgIHkwID0geTsKKyAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4ID0geGI7CisgICAgICAgICAgICAgICAgeSA9IHliOworCisgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHggLSB4MCkgPiBNYXRoLmFicyh5IC0geTApKSB7CisgICAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5rbm93biBvcGVyYXRvcjogMTIgIi5jb25jYXQodikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID49IDQpIHsKKyAgICAgICAgICAgICAgdmFyIGFjaGFyID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHZhciBiY2hhciA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB5ID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHggPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgICAgICAgICBjbWQ6ICJzYXZlIgorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgICAgICAgICBjbWQ6ICJ0cmFuc2xhdGUiLAorICAgICAgICAgICAgICAgIGFyZ3M6IFt4LCB5XQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgdmFyIGNtYXAgPSBsb29rdXBDbWFwKGZvbnQuY21hcCwgU3RyaW5nLmZyb21DaGFyQ29kZShmb250LmdseXBoTmFtZU1hcFtfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2RpbmdbYWNoYXJdXSkpOworICAgICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOworICAgICAgICAgICAgICBjbWRzLnB1c2goeworICAgICAgICAgICAgICAgIGNtZDogInJlc3RvcmUiCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICBjbWFwID0gbG9va3VwQ21hcChmb250LmNtYXAsIFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nbHlwaE5hbWVNYXBbX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nW2JjaGFyXV0pKTsKKyAgICAgICAgICAgICAgY29tcGlsZUNoYXJTdHJpbmcoZm9udC5nbHlwaHNbY21hcC5nbHlwaElkXSwgY21kcywgZm9udCwgY21hcC5nbHlwaElkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOworICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKKyAgICAgICAgICAgIGkgKz0gc3RlbXMgKyA3ID4+IDM7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOworICAgICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKKyAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgeSArPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHggKz0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBtb3ZlVG8oeCwgeSk7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgIHggKz0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBtb3ZlVG8oeCwgeSk7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOworICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMikgeworICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICBsaW5lVG8oeCwgeSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gNikgeworICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgbGluZVRvKHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHsKKyAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB4YSA9IHg7CisgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiOworICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHsKKyAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YSA9IHk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSA9IHliOworICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgc3RhY2sucHVzaCgoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSA+PiAxNik7CisgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICBuID0gc3RhY2sucG9wKCkgKyBmb250LmdzdWJyc0JpYXM7CisgICAgICAgICAgICBzdWJyQ29kZSA9IGZvbnQuZ3N1YnJzW25dOworCisgICAgICAgICAgICBpZiAoc3VickNvZGUpIHsKKyAgICAgICAgICAgICAgcGFyc2Uoc3VickNvZGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB4YSA9IHg7CisgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSA9IHliICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisKKyAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWEgPSB5OworICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHggPSB4YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CisgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YSA9IHk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisKKyAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgeGEgPSB4OworICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CisgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodiA8IDMyKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5rbm93biBvcGVyYXRvcjogIi5jb25jYXQodikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodiA8IDI0NykgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKHYgLSAxMzkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2IDwgMjUxKSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goKHYgLSAyNDcpICogMjU2ICsgY29kZVtpKytdICsgMTA4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1NSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKC0odiAtIDI1MSkgKiAyNTYgLSBjb2RlW2krK10gLSAxMDgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaCgoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2IHwgY29kZVtpICsgMl0gPDwgOCB8IGNvZGVbaSArIDNdKSAvIDY1NTM2KTsKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFja0NsZWFuKSB7CisgICAgICAgICAgc3RhY2subGVuZ3RoID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBhcnNlKGNoYXJTdHJpbmdDb2RlKTsKKyAgfQorCisgIHZhciBOT09QID0gW107CisKKyAgdmFyIENvbXBpbGVkRm9udCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgICAgZnVuY3Rpb24gQ29tcGlsZWRGb250KGZvbnRNYXRyaXgpIHsKKyAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21waWxlZEZvbnQpOworCisgICAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQ29tcGlsZWRGb250KSB7CisgICAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIENvbXBpbGVkRm9udC4iKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKKyAgICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB9CisKKyAgICBfY3JlYXRlQ2xhc3MoQ29tcGlsZWRGb250LCBbeworICAgICAga2V5OiAiZ2V0UGF0aEpzIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYXRoSnModW5pY29kZSkgeworICAgICAgICB2YXIgY21hcCA9IGxvb2t1cENtYXAodGhpcy5jbWFwLCB1bmljb2RlKTsKKyAgICAgICAgdmFyIGZuID0gdGhpcy5jb21waWxlZEdseXBoc1tjbWFwLmdseXBoSWRdOworCisgICAgICAgIGlmICghZm4pIHsKKyAgICAgICAgICBmbiA9IHRoaXMuY29tcGlsZUdseXBoKHRoaXMuZ2x5cGhzW2NtYXAuZ2x5cGhJZF0sIGNtYXAuZ2x5cGhJZCk7CisgICAgICAgICAgdGhpcy5jb21waWxlZEdseXBoc1tjbWFwLmdseXBoSWRdID0gZm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NtYXAuY2hhckNvZGVdID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY21hcC5jaGFyQ29kZV0gPSBjbWFwLmdseXBoSWQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZm47CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiY29tcGlsZUdseXBoIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlR2x5cGgoY29kZSwgZ2x5cGhJZCkgeworICAgICAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggPT09IDAgfHwgY29kZVswXSA9PT0gMTQpIHsKKyAgICAgICAgICByZXR1cm4gTk9PUDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4OworCisgICAgICAgIGlmICh0aGlzLmlzQ0ZGQ0lERm9udCkgeworICAgICAgICAgIHZhciBmZEluZGV4ID0gdGhpcy5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOworCisgICAgICAgICAgaWYgKGZkSW5kZXggPj0gMCAmJiBmZEluZGV4IDwgdGhpcy5mZEFycmF5Lmxlbmd0aCkgeworICAgICAgICAgICAgdmFyIGZvbnREaWN0ID0gdGhpcy5mZEFycmF5W2ZkSW5kZXhdOworICAgICAgICAgICAgZm9udE1hdHJpeCA9IGZvbnREaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpIHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciBjbWRzID0gW107CisgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgY21kOiAic2F2ZSIKKyAgICAgICAgfSk7CisgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgY21kOiAidHJhbnNmb3JtIiwKKyAgICAgICAgICBhcmdzOiBmb250TWF0cml4LnNsaWNlKCkKKyAgICAgICAgfSk7CisgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgY21kOiAic2NhbGUiLAorICAgICAgICAgIGFyZ3M6IFsic2l6ZSIsICItc2l6ZSJdCisgICAgICAgIH0pOworICAgICAgICB0aGlzLmNvbXBpbGVHbHlwaEltcGwoY29kZSwgY21kcywgZ2x5cGhJZCk7CisgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgY21kOiAicmVzdG9yZSIKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBjbWRzOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImNvbXBpbGVHbHlwaEltcGwiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGVHbHlwaEltcGwoKSB7CisgICAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNoaWxkcmVuIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzLiIpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogImhhc0J1aWx0UGF0aCIsCisgICAgICB2YWx1ZTogZnVuY3Rpb24gaGFzQnVpbHRQYXRoKHVuaWNvZGUpIHsKKyAgICAgICAgdmFyIGNtYXAgPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CisgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NtYXAuZ2x5cGhJZF0gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY21hcC5jaGFyQ29kZV0gIT09IHVuZGVmaW5lZDsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gQ29tcGlsZWRGb250OworICB9KCk7CisKKyAgdmFyIFRydWVUeXBlQ29tcGlsZWQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21waWxlZEZvbnQpIHsKKyAgICBfaW5oZXJpdHMoVHJ1ZVR5cGVDb21waWxlZCwgX0NvbXBpbGVkRm9udCk7CisKKyAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFRydWVUeXBlQ29tcGlsZWQpOworCisgICAgZnVuY3Rpb24gVHJ1ZVR5cGVDb21waWxlZChnbHlwaHMsIGNtYXAsIGZvbnRNYXRyaXgpIHsKKyAgICAgIHZhciBfdGhpczsKKworICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRydWVUeXBlQ29tcGlsZWQpOworCisgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGZvbnRNYXRyaXggfHwgWzAuMDAwNDg4LCAwLCAwLCAwLjAwMDQ4OCwgMCwgMF0pOworICAgICAgX3RoaXMuZ2x5cGhzID0gZ2x5cGhzOworICAgICAgX3RoaXMuY21hcCA9IGNtYXA7CisgICAgICByZXR1cm4gX3RoaXM7CisgICAgfQorCisgICAgX2NyZWF0ZUNsYXNzKFRydWVUeXBlQ29tcGlsZWQsIFt7CisgICAgICBrZXk6ICJjb21waWxlR2x5cGhJbXBsIiwKKyAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMpIHsKKyAgICAgICAgY29tcGlsZUdseWYoY29kZSwgY21kcywgdGhpcyk7CisgICAgICB9CisgICAgfV0pOworCisgICAgcmV0dXJuIFRydWVUeXBlQ29tcGlsZWQ7CisgIH0oQ29tcGlsZWRGb250KTsKKworICB2YXIgVHlwZTJDb21waWxlZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBpbGVkRm9udDIpIHsKKyAgICBfaW5oZXJpdHMoVHlwZTJDb21waWxlZCwgX0NvbXBpbGVkRm9udDIpOworCisgICAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoVHlwZTJDb21waWxlZCk7CisKKyAgICBmdW5jdGlvbiBUeXBlMkNvbXBpbGVkKGNmZkluZm8sIGNtYXAsIGZvbnRNYXRyaXgsIGdseXBoTmFtZU1hcCkgeworICAgICAgdmFyIF90aGlzMjsKKworICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFR5cGUyQ29tcGlsZWQpOworCisgICAgICBfdGhpczIgPSBfc3VwZXIyLmNhbGwodGhpcywgZm9udE1hdHJpeCB8fCBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXSk7CisgICAgICBfdGhpczIuZ2x5cGhzID0gY2ZmSW5mby5nbHlwaHM7CisgICAgICBfdGhpczIuZ3N1YnJzID0gY2ZmSW5mby5nc3VicnMgfHwgW107CisgICAgICBfdGhpczIuc3VicnMgPSBjZmZJbmZvLnN1YnJzIHx8IFtdOworICAgICAgX3RoaXMyLmNtYXAgPSBjbWFwOworICAgICAgX3RoaXMyLmdseXBoTmFtZU1hcCA9IGdseXBoTmFtZU1hcCB8fCAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOworICAgICAgX3RoaXMyLmdzdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyhfdGhpczIuZ3N1YnJzKTsKKyAgICAgIF90aGlzMi5zdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyhfdGhpczIuc3VicnMpOworICAgICAgX3RoaXMyLmlzQ0ZGQ0lERm9udCA9IGNmZkluZm8uaXNDRkZDSURGb250OworICAgICAgX3RoaXMyLmZkU2VsZWN0ID0gY2ZmSW5mby5mZFNlbGVjdDsKKyAgICAgIF90aGlzMi5mZEFycmF5ID0gY2ZmSW5mby5mZEFycmF5OworICAgICAgcmV0dXJuIF90aGlzMjsKKyAgICB9CisKKyAgICBfY3JlYXRlQ2xhc3MoVHlwZTJDb21waWxlZCwgW3sKKyAgICAgIGtleTogImNvbXBpbGVHbHlwaEltcGwiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGVHbHlwaEltcGwoY29kZSwgY21kcywgZ2x5cGhJZCkgeworICAgICAgICBjb21waWxlQ2hhclN0cmluZyhjb2RlLCBjbWRzLCB0aGlzLCBnbHlwaElkKTsKKyAgICAgIH0KKyAgICB9XSk7CisKKyAgICByZXR1cm4gVHlwZTJDb21waWxlZDsKKyAgfShDb21waWxlZEZvbnQpOworCisgIHJldHVybiB7CisgICAgY3JlYXRlOiBmdW5jdGlvbiBGb250UmVuZGVyZXJGYWN0b3J5X2NyZWF0ZShmb250LCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CisgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGZvbnQuZGF0YSk7CisgICAgICB2YXIgY21hcCwgZ2x5ZiwgbG9jYSwgY2ZmLCBpbmRleFRvTG9jRm9ybWF0LCB1bml0c1BlckVtOworICAgICAgdmFyIG51bVRhYmxlcyA9IGdldFVzaG9ydChkYXRhLCA0KTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSAxMjsgaSA8IG51bVRhYmxlczsgaSsrLCBwICs9IDE2KSB7CisgICAgICAgIHZhciB0YWcgPSAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZGF0YS5zdWJhcnJheShwLCBwICsgNCkpOworICAgICAgICB2YXIgb2Zmc2V0ID0gZ2V0TG9uZyhkYXRhLCBwICsgOCk7CisgICAgICAgIHZhciBsZW5ndGggPSBnZXRMb25nKGRhdGEsIHAgKyAxMik7CisKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICBjYXNlICJjbWFwIjoKKyAgICAgICAgICAgIGNtYXAgPSBwYXJzZUNtYXAoZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJnbHlmIjoKKyAgICAgICAgICAgIGdseWYgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibG9jYSI6CisgICAgICAgICAgICBsb2NhID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImhlYWQiOgorICAgICAgICAgICAgdW5pdHNQZXJFbSA9IGdldFVzaG9ydChkYXRhLCBvZmZzZXQgKyAxOCk7CisgICAgICAgICAgICBpbmRleFRvTG9jRm9ybWF0ID0gZ2V0VXNob3J0KGRhdGEsIG9mZnNldCArIDUwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQ0ZGICI6CisgICAgICAgICAgICBjZmYgPSBwYXJzZUNmZihkYXRhLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCwgc2VhY0FuYWx5c2lzRW5hYmxlZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZ2x5ZikgeworICAgICAgICB2YXIgZm9udE1hdHJpeCA9ICF1bml0c1BlckVtID8gZm9udC5mb250TWF0cml4IDogWzEgLyB1bml0c1BlckVtLCAwLCAwLCAxIC8gdW5pdHNQZXJFbSwgMCwgMF07CisgICAgICAgIHJldHVybiBuZXcgVHJ1ZVR5cGVDb21waWxlZChwYXJzZUdseWZUYWJsZShnbHlmLCBsb2NhLCBpbmRleFRvTG9jRm9ybWF0KSwgY21hcCwgZm9udE1hdHJpeCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgVHlwZTJDb21waWxlZChjZmYsIGNtYXAsIGZvbnQuZm9udE1hdHJpeCwgZm9udC5nbHlwaE5hbWVNYXApOworICAgIH0KKyAgfTsKK30oKTsKKworZXhwb3J0cy5Gb250UmVuZGVyZXJGYWN0b3J5ID0gRm9udFJlbmRlcmVyRmFjdG9yeTsKKworLyoqKi8gfSksCisvKiAyMzUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5UeXBlMVBhcnNlciA9IHZvaWQgMDsKKwordmFyIF9lbmNvZGluZ3MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzMCk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA1KTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBISU5USU5HX0VOQUJMRUQgPSBmYWxzZTsKKwordmFyIFR5cGUxQ2hhclN0cmluZyA9IGZ1bmN0aW9uIFR5cGUxQ2hhclN0cmluZ0Nsb3N1cmUoKSB7CisgIHZhciBDT01NQU5EX01BUCA9IHsKKyAgICBoc3RlbTogWzFdLAorICAgIHZzdGVtOiBbM10sCisgICAgdm1vdmV0bzogWzRdLAorICAgIHJsaW5ldG86IFs1XSwKKyAgICBobGluZXRvOiBbNl0sCisgICAgdmxpbmV0bzogWzddLAorICAgIHJyY3VydmV0bzogWzhdLAorICAgIGNhbGxzdWJyOiBbMTBdLAorICAgIGZsZXg6IFsxMiwgMzVdLAorICAgIGRyb3A6IFsxMiwgMThdLAorICAgIGVuZGNoYXI6IFsxNF0sCisgICAgcm1vdmV0bzogWzIxXSwKKyAgICBobW92ZXRvOiBbMjJdLAorICAgIHZoY3VydmV0bzogWzMwXSwKKyAgICBodmN1cnZldG86IFszMV0KKyAgfTsKKworICBmdW5jdGlvbiBUeXBlMUNoYXJTdHJpbmcoKSB7CisgICAgdGhpcy53aWR0aCA9IDA7CisgICAgdGhpcy5sc2IgPSAwOworICAgIHRoaXMuZmxleGluZyA9IGZhbHNlOworICAgIHRoaXMub3V0cHV0ID0gW107CisgICAgdGhpcy5zdGFjayA9IFtdOworICB9CisKKyAgVHlwZTFDaGFyU3RyaW5nLnByb3RvdHlwZSA9IHsKKyAgICBjb252ZXJ0OiBmdW5jdGlvbiBUeXBlMUNoYXJTdHJpbmdfY29udmVydChlbmNvZGVkLCBzdWJycywgc2VhY0FuYWx5c2lzRW5hYmxlZCkgeworICAgICAgdmFyIGNvdW50ID0gZW5jb2RlZC5sZW5ndGg7CisgICAgICB2YXIgZXJyb3IgPSBmYWxzZTsKKyAgICAgIHZhciB3eCwgc2J4LCBzdWJyTnVtYmVyOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdmFyIHZhbHVlID0gZW5jb2RlZFtpXTsKKworICAgICAgICBpZiAodmFsdWUgPCAzMikgeworICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHsKKyAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpICsgZW5jb2RlZFsrK2ldOworICAgICAgICAgIH0KKworICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaHN0ZW0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICBpZiAoIUhJTlRJTkdfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC52c3RlbSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgZHkgPSB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCgwLCBkeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAudm1vdmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybGluZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEsIENPTU1BTkRfTUFQLmhsaW5ldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAudmxpbmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg2LCBDT01NQU5EX01BUC5ycmN1cnZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgICAgaWYgKCFzdWJyc1tzdWJyTnVtYmVyXSkgeworICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5jb252ZXJ0KHN1YnJzW3N1YnJOdW1iZXJdLCBzdWJycywgc2VhY0FuYWx5c2lzRW5hYmxlZCk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB3eCA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHNieCA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHRoaXMubHNiID0gc2J4OworICAgICAgICAgICAgICB0aGlzLndpZHRoID0gd3g7CisgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh3eCwgc2J4KTsKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLmhtb3ZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaChDT01NQU5EX01BUC5lbmRjaGFyWzBdKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybW92ZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAuaG1vdmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNCwgQ09NTUFORF9NQVAudmhjdXJ2ZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5odmN1cnZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAwOgorICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE6CisgICAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMjoKKyAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaHN0ZW0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA2OgorICAgICAgICAgICAgICBpZiAoc2VhY0FuYWx5c2lzRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHZhciBhc2IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gNV07CisgICAgICAgICAgICAgICAgdGhpcy5zZWFjID0gdGhpcy5zdGFjay5zcGxpY2UoLTQsIDQpOworICAgICAgICAgICAgICAgIHRoaXMuc2VhY1swXSArPSB0aGlzLmxzYiAtIGFzYjsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMCwgQ09NTUFORF9NQVAuZW5kY2hhcik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDQsIENPTU1BTkRfTUFQLmVuZGNoYXIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgNzoKKyAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgNCkgeworICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHd4ID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgdmFyIHNieSA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHNieCA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHRoaXMubHNiID0gc2J4OworICAgICAgICAgICAgICB0aGlzLndpZHRoID0gd3g7CisgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh3eCwgc2J4LCBzYnkpOworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMywgQ09NTUFORF9NQVAucm1vdmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDEyOgorICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIG51bTIgPSB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB2YXIgbnVtMSA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChudW0xIC8gbnVtMik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE2OgorICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHZhciBudW1BcmdzID0gdGhpcy5zdGFjay5wb3AoKTsKKworICAgICAgICAgICAgICBpZiAoc3Vick51bWJlciA9PT0gMCAmJiBudW1BcmdzID09PSAzKSB7CisgICAgICAgICAgICAgICAgdmFyIGZsZXhBcmdzID0gdGhpcy5zdGFjay5zcGxpY2UodGhpcy5zdGFjay5sZW5ndGggLSAxNywgMTcpOworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmbGV4QXJnc1syXSArIGZsZXhBcmdzWzBdLCBmbGV4QXJnc1szXSArIGZsZXhBcmdzWzFdLCBmbGV4QXJnc1s0XSwgZmxleEFyZ3NbNV0sIGZsZXhBcmdzWzZdLCBmbGV4QXJnc1s3XSwgZmxleEFyZ3NbOF0sIGZsZXhBcmdzWzldLCBmbGV4QXJnc1sxMF0sIGZsZXhBcmdzWzExXSwgZmxleEFyZ3NbMTJdLCBmbGV4QXJnc1sxM10sIGZsZXhBcmdzWzE0XSk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEzLCBDT01NQU5EX01BUC5mbGV4LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZmxleEFyZ3NbMTVdLCBmbGV4QXJnc1sxNl0pOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnJOdW1iZXIgPT09IDEgJiYgbnVtQXJncyA9PT0gMCkgeworICAgICAgICAgICAgICAgIHRoaXMuZmxleGluZyA9IHRydWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNzoKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMzM6CisgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgnVW5rbm93biB0eXBlIDEgY2hhcnN0cmluZyBjb21tYW5kIG9mICInICsgdmFsdWUgKyAnIicpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI0NikgeworICAgICAgICAgIHZhbHVlID0gdmFsdWUgLSAxMzk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjUwKSB7CisgICAgICAgICAgdmFsdWUgPSAodmFsdWUgLSAyNDcpICogMjU2ICsgZW5jb2RlZFsrK2ldICsgMTA4OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1NCkgeworICAgICAgICAgIHZhbHVlID0gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGVuY29kZWRbKytpXSAtIDEwODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YWx1ZSA9IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAyNCB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAxNiB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCA4IHwgKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDA7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN0YWNrLnB1c2godmFsdWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfSwKKyAgICBleGVjdXRlQ29tbWFuZDogZnVuY3Rpb24gZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykgeworICAgICAgdmFyIHN0YWNrTGVuZ3RoID0gdGhpcy5zdGFjay5sZW5ndGg7CisKKyAgICAgIGlmIChob3dNYW55QXJncyA+IHN0YWNrTGVuZ3RoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICB2YXIgc3RhcnQgPSBzdGFja0xlbmd0aCAtIGhvd01hbnlBcmdzOworCisgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBzdGFja0xlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc3RhY2tbaV07CisKKyAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CisgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaCgyOCwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFsdWUgPSA2NTUzNiAqIHZhbHVlIHwgMDsKKyAgICAgICAgICB0aGlzLm91dHB1dC5wdXNoKDI1NSwgdmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMub3V0cHV0LnB1c2guYXBwbHkodGhpcy5vdXRwdXQsIGNvbW1hbmQpOworCisgICAgICBpZiAoa2VlcFN0YWNrKSB7CisgICAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07CisgIHJldHVybiBUeXBlMUNoYXJTdHJpbmc7Cit9KCk7CisKK3ZhciBUeXBlMVBhcnNlciA9IGZ1bmN0aW9uIFR5cGUxUGFyc2VyQ2xvc3VyZSgpIHsKKyAgdmFyIEVFWEVDX0VOQ1JZUFRfS0VZID0gNTU2NjU7CisgIHZhciBDSEFSX1NUUlNfRU5DUllQVF9LRVkgPSA0MzMwOworCisgIGZ1bmN0aW9uIGlzSGV4RGlnaXQoY29kZSkgeworICAgIHJldHVybiBjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcgfHwgY29kZSA+PSA2NSAmJiBjb2RlIDw9IDcwIHx8IGNvZGUgPj0gOTcgJiYgY29kZSA8PSAxMDI7CisgIH0KKworICBmdW5jdGlvbiBkZWNyeXB0KGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikgeworICAgIGlmIChkaXNjYXJkTnVtYmVyID49IGRhdGEubGVuZ3RoKSB7CisgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CisgICAgfQorCisgICAgdmFyIHIgPSBrZXkgfCAwLAorICAgICAgICBjMSA9IDUyODQ1LAorICAgICAgICBjMiA9IDIyNzE5LAorICAgICAgICBpLAorICAgICAgICBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGRpc2NhcmROdW1iZXI7IGkrKykgeworICAgICAgciA9IChkYXRhW2ldICsgcikgKiBjMSArIGMyICYgKDEgPDwgMTYpIC0gMTsKKyAgICB9CisKKyAgICB2YXIgY291bnQgPSBkYXRhLmxlbmd0aCAtIGRpc2NhcmROdW1iZXI7CisgICAgdmFyIGRlY3J5cHRlZCA9IG5ldyBVaW50OEFycmF5KGNvdW50KTsKKworICAgIGZvciAoaSA9IGRpc2NhcmROdW1iZXIsIGogPSAwOyBqIDwgY291bnQ7IGkrKywgaisrKSB7CisgICAgICB2YXIgdmFsdWUgPSBkYXRhW2ldOworICAgICAgZGVjcnlwdGVkW2pdID0gdmFsdWUgXiByID4+IDg7CisgICAgICByID0gKHZhbHVlICsgcikgKiBjMSArIGMyICYgKDEgPDwgMTYpIC0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gZGVjcnlwdGVkOworICB9CisKKyAgZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikgeworICAgIHZhciByID0ga2V5IHwgMCwKKyAgICAgICAgYzEgPSA1Mjg0NSwKKyAgICAgICAgYzIgPSAyMjcxOTsKKyAgICB2YXIgY291bnQgPSBkYXRhLmxlbmd0aCwKKyAgICAgICAgbWF5YmVMZW5ndGggPSBjb3VudCA+Pj4gMTsKKyAgICB2YXIgZGVjcnlwdGVkID0gbmV3IFVpbnQ4QXJyYXkobWF5YmVMZW5ndGgpOworICAgIHZhciBpLCBqOworCisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICB2YXIgZGlnaXQxID0gZGF0YVtpXTsKKworICAgICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0MSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGkrKzsKKyAgICAgIHZhciBkaWdpdDI7CisKKyAgICAgIHdoaWxlIChpIDwgY291bnQgJiYgIWlzSGV4RGlnaXQoZGlnaXQyID0gZGF0YVtpXSkpIHsKKyAgICAgICAgaSsrOworICAgICAgfQorCisgICAgICBpZiAoaSA8IGNvdW50KSB7CisgICAgICAgIHZhciB2YWx1ZSA9IHBhcnNlSW50KFN0cmluZy5mcm9tQ2hhckNvZGUoZGlnaXQxLCBkaWdpdDIpLCAxNik7CisgICAgICAgIGRlY3J5cHRlZFtqKytdID0gdmFsdWUgXiByID4+IDg7CisgICAgICAgIHIgPSAodmFsdWUgKyByKSAqIGMxICsgYzIgJiAoMSA8PCAxNikgLSAxOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkZWNyeXB0ZWQuc2xpY2UoZGlzY2FyZE51bWJlciwgaik7CisgIH0KKworICBmdW5jdGlvbiBpc1NwZWNpYWwoYykgeworICAgIHJldHVybiBjID09PSAweDJmIHx8IGMgPT09IDB4NWIgfHwgYyA9PT0gMHg1ZCB8fCBjID09PSAweDdiIHx8IGMgPT09IDB4N2QgfHwgYyA9PT0gMHgyOCB8fCBjID09PSAweDI5OworICB9CisKKyAgZnVuY3Rpb24gVHlwZTFQYXJzZXIoc3RyZWFtLCBlbmNyeXB0ZWQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKKyAgICBpZiAoZW5jcnlwdGVkKSB7CisgICAgICB2YXIgZGF0YSA9IHN0cmVhbS5nZXRCeXRlcygpOworICAgICAgdmFyIGlzQmluYXJ5ID0gISgoaXNIZXhEaWdpdChkYXRhWzBdKSB8fCAoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShkYXRhWzBdKSkgJiYgaXNIZXhEaWdpdChkYXRhWzFdKSAmJiBpc0hleERpZ2l0KGRhdGFbMl0pICYmIGlzSGV4RGlnaXQoZGF0YVszXSkgJiYgaXNIZXhEaWdpdChkYXRhWzRdKSAmJiBpc0hleERpZ2l0KGRhdGFbNV0pICYmIGlzSGV4RGlnaXQoZGF0YVs2XSkgJiYgaXNIZXhEaWdpdChkYXRhWzddKSk7CisgICAgICBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJlYW0oaXNCaW5hcnkgPyBkZWNyeXB0KGRhdGEsIEVFWEVDX0VOQ1JZUFRfS0VZLCA0KSA6IGRlY3J5cHRBc2NpaShkYXRhLCBFRVhFQ19FTkNSWVBUX0tFWSwgNCkpOworICAgIH0KKworICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDsKKyAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLm5leHRDaGFyKCk7CisgIH0KKworICBUeXBlMVBhcnNlci5wcm90b3R5cGUgPSB7CisgICAgcmVhZE51bWJlckFycmF5OiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkTnVtYmVyQXJyYXkoKSB7CisgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICB2YXIgYXJyYXkgPSBbXTsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gIl0iIHx8IHRva2VuID09PSAifSIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGFycmF5LnB1c2gocGFyc2VGbG9hdCh0b2tlbiB8fCAwKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBhcnJheTsKKyAgICB9LAorICAgIHJlYWROdW1iZXI6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWROdW1iZXIoKSB7CisgICAgICB2YXIgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CisgICAgICByZXR1cm4gcGFyc2VGbG9hdCh0b2tlbiB8fCAwKTsKKyAgICB9LAorICAgIHJlYWRJbnQ6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWRJbnQoKSB7CisgICAgICB2YXIgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CisgICAgICByZXR1cm4gcGFyc2VJbnQodG9rZW4gfHwgMCwgMTApIHwgMDsKKyAgICB9LAorICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkQm9vbGVhbigpIHsKKyAgICAgIHZhciB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgIHJldHVybiB0b2tlbiA9PT0gInRydWUiID8gMSA6IDA7CisgICAgfSwKKyAgICBuZXh0Q2hhcjogZnVuY3Rpb24gVHlwZTFfbmV4dENoYXIoKSB7CisgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q2hhciA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKKyAgICB9LAorICAgIGdldFRva2VuOiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9nZXRUb2tlbigpIHsKKyAgICAgIHZhciBjb21tZW50ID0gZmFsc2U7CisgICAgICB2YXIgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoY2ggPT09IC0xKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tbWVudCkgeworICAgICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgeworICAgICAgICAgICAgY29tbWVudCA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgeworICAgICAgICAgIGNvbW1lbnQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCEoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjaCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgfQorCisgICAgICBpZiAoaXNTcGVjaWFsKGNoKSkgeworICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKyAgICAgIH0KKworICAgICAgdmFyIHRva2VuID0gIiI7CisKKyAgICAgIGRvIHsKKyAgICAgICAgdG9rZW4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgfSB3aGlsZSAoY2ggPj0gMCAmJiAhKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpICYmICFpc1NwZWNpYWwoY2gpKTsKKworICAgICAgcmV0dXJuIHRva2VuOworICAgIH0sCisgICAgcmVhZENoYXJTdHJpbmdzOiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkQ2hhclN0cmluZ3MoYnl0ZXMsIGxlbklWKSB7CisgICAgICBpZiAobGVuSVYgPT09IC0xKSB7CisgICAgICAgIHJldHVybiBieXRlczsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRlY3J5cHQoYnl0ZXMsIENIQVJfU1RSU19FTkNSWVBUX0tFWSwgbGVuSVYpOworICAgIH0sCisgICAgZXh0cmFjdEZvbnRQcm9ncmFtOiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9leHRyYWN0Rm9udFByb2dyYW0ocHJvcGVydGllcykgeworICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtOworICAgICAgdmFyIHN1YnJzID0gW10sCisgICAgICAgICAgY2hhcnN0cmluZ3MgPSBbXTsKKyAgICAgIHZhciBwcml2YXRlRGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICBwcml2YXRlRGF0YS5sZW5JViA9IDQ7CisgICAgICB2YXIgcHJvZ3JhbSA9IHsKKyAgICAgICAgc3VicnM6IFtdLAorICAgICAgICBjaGFyc3RyaW5nczogW10sCisgICAgICAgIHByb3BlcnRpZXM6IHsKKyAgICAgICAgICBwcml2YXRlRGF0YTogcHJpdmF0ZURhdGEKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIHZhciB0b2tlbiwgbGVuZ3RoLCBkYXRhLCBsZW5JViwgZW5jb2RlZDsKKworICAgICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKKyAgICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgICBjYXNlICJDaGFyU3RyaW5ncyI6CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gImVuZCIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOworICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKKyAgICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CisgICAgICAgICAgICAgIGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CisgICAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgICAgaWYgKHRva2VuID09PSAibm9hY2Nlc3MiKSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2hhcnN0cmluZ3MucHVzaCh7CisgICAgICAgICAgICAgICAgZ2x5cGg6IGdseXBoLAorICAgICAgICAgICAgICAgIGVuY29kZWQ6IGVuY29kZWQKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiU3VicnMiOgorICAgICAgICAgICAgdGhpcy5yZWFkSW50KCk7CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgIHdoaWxlICh0aGlzLmdldFRva2VuKCkgPT09ICJkdXAiKSB7CisgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMucmVhZEludCgpOworICAgICAgICAgICAgICBsZW5ndGggPSB0aGlzLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICBkYXRhID0gbGVuZ3RoID4gMCA/IHN0cmVhbS5nZXRCeXRlcyhsZW5ndGgpIDogbmV3IFVpbnQ4QXJyYXkoMCk7CisgICAgICAgICAgICAgIGxlbklWID0gcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhLmxlbklWOworICAgICAgICAgICAgICBlbmNvZGVkID0gdGhpcy5yZWFkQ2hhclN0cmluZ3MoZGF0YSwgbGVuSVYpOworICAgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgeworICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHN1YnJzW2luZGV4XSA9IGVuY29kZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQmx1ZVZhbHVlcyI6CisgICAgICAgICAgY2FzZSAiT3RoZXJCbHVlcyI6CisgICAgICAgICAgY2FzZSAiRmFtaWx5Qmx1ZXMiOgorICAgICAgICAgIGNhc2UgIkZhbWlseU90aGVyQmx1ZXMiOgorICAgICAgICAgICAgdmFyIGJsdWVBcnJheSA9IHRoaXMucmVhZE51bWJlckFycmF5KCk7CisKKyAgICAgICAgICAgIGlmIChibHVlQXJyYXkubGVuZ3RoID4gMCAmJiBibHVlQXJyYXkubGVuZ3RoICUgMiA9PT0gMCAmJiBISU5USU5HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IGJsdWVBcnJheTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJTdGVtU25hcEgiOgorICAgICAgICAgIGNhc2UgIlN0ZW1TbmFwViI6CisgICAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiU3RkSFciOgorICAgICAgICAgIGNhc2UgIlN0ZFZXIjoKKyAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJCbHVlU2hpZnQiOgorICAgICAgICAgIGNhc2UgImxlbklWIjoKKyAgICAgICAgICBjYXNlICJCbHVlRnV6eiI6CisgICAgICAgICAgY2FzZSAiQmx1ZVNjYWxlIjoKKyAgICAgICAgICBjYXNlICJMYW5ndWFnZUdyb3VwIjoKKyAgICAgICAgICBjYXNlICJFeHBhbnNpb25GYWN0b3IiOgorICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlcigpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJGb3JjZUJvbGQiOgorICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnN0cmluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZ2x5cGggPSBjaGFyc3RyaW5nc1tpXS5nbHlwaDsKKyAgICAgICAgZW5jb2RlZCA9IGNoYXJzdHJpbmdzW2ldLmVuY29kZWQ7CisgICAgICAgIHZhciBjaGFyU3RyaW5nID0gbmV3IFR5cGUxQ2hhclN0cmluZygpOworICAgICAgICB2YXIgZXJyb3IgPSBjaGFyU3RyaW5nLmNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCk7CisgICAgICAgIHZhciBvdXRwdXQgPSBjaGFyU3RyaW5nLm91dHB1dDsKKworICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICBvdXRwdXQgPSBbMTRdOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNoYXJTdHJpbmdPYmplY3QgPSB7CisgICAgICAgICAgZ2x5cGhOYW1lOiBnbHlwaCwKKyAgICAgICAgICBjaGFyc3RyaW5nOiBvdXRwdXQsCisgICAgICAgICAgd2lkdGg6IGNoYXJTdHJpbmcud2lkdGgsCisgICAgICAgICAgbHNiOiBjaGFyU3RyaW5nLmxzYiwKKyAgICAgICAgICBzZWFjOiBjaGFyU3RyaW5nLnNlYWMKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoZ2x5cGggPT09ICIubm90ZGVmIikgeworICAgICAgICAgIHByb2dyYW0uY2hhcnN0cmluZ3MudW5zaGlmdChjaGFyU3RyaW5nT2JqZWN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcm9ncmFtLmNoYXJzdHJpbmdzLnB1c2goY2hhclN0cmluZ09iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKKyAgICAgICAgICB2YXIgX2luZGV4ID0gcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcuaW5kZXhPZihnbHlwaCk7CisKKyAgICAgICAgICBpZiAoX2luZGV4ID4gLTEgJiYgcHJvcGVydGllcy53aWR0aHNbX2luZGV4XSA9PT0gdW5kZWZpbmVkICYmIF9pbmRleCA+PSBwcm9wZXJ0aWVzLmZpcnN0Q2hhciAmJiBfaW5kZXggPD0gcHJvcGVydGllcy5sYXN0Q2hhcikgeworICAgICAgICAgICAgcHJvcGVydGllcy53aWR0aHNbX2luZGV4XSA9IGNoYXJTdHJpbmcud2lkdGg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBwcm9ncmFtOworICAgIH0sCisgICAgZXh0cmFjdEZvbnRIZWFkZXI6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX2V4dHJhY3RGb250SGVhZGVyKHByb3BlcnRpZXMpIHsKKyAgICAgIHZhciB0b2tlbjsKKworICAgICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKKyAgICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgICBjYXNlICJGb250TWF0cml4IjoKKyAgICAgICAgICAgIHZhciBtYXRyaXggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOworICAgICAgICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gbWF0cml4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJFbmNvZGluZyI6CisgICAgICAgICAgICB2YXIgZW5jb2RpbmdBcmcgPSB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICB2YXIgZW5jb2Rpbmc7CisKKyAgICAgICAgICAgIGlmICghL15cZCskLy50ZXN0KGVuY29kaW5nQXJnKSkgeworICAgICAgICAgICAgICBlbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShlbmNvZGluZ0FyZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlbmNvZGluZyA9IFtdOworICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHBhcnNlSW50KGVuY29kaW5nQXJnLCAxMCkgfCAwOworICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbiAhPT0gImR1cCIgJiYgdG9rZW4gIT09ICJkZWYiKSB7CisgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09ICJkZWYiKSB7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgICAgdmFyIGdseXBoID0gdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGdseXBoOworICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJGb250QkJveCI6CisgICAgICAgICAgICB2YXIgZm9udEJCb3ggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOworICAgICAgICAgICAgcHJvcGVydGllcy5hc2NlbnQgPSBNYXRoLm1heChmb250QkJveFszXSwgZm9udEJCb3hbMV0pOworICAgICAgICAgICAgcHJvcGVydGllcy5kZXNjZW50ID0gTWF0aC5taW4oZm9udEJCb3hbMV0sIGZvbnRCQm94WzNdKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuYXNjZW50U2NhbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworICByZXR1cm4gVHlwZTFQYXJzZXI7Cit9KCk7CisKK2V4cG9ydHMuVHlwZTFQYXJzZXIgPSBUeXBlMVBhcnNlcjsKKworLyoqKi8gfSksCisvKiAyMzYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRUaWxpbmdQYXR0ZXJuSVIgPSBnZXRUaWxpbmdQYXR0ZXJuSVI7CitleHBvcnRzLlBhdHRlcm4gPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfY29sb3JzcGFjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIwKTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDIpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK3ZhciBTaGFkaW5nVHlwZSA9IHsKKyAgRlVOQ1RJT05fQkFTRUQ6IDEsCisgIEFYSUFMOiAyLAorICBSQURJQUw6IDMsCisgIEZSRUVfRk9STV9NRVNIOiA0LAorICBMQVRUSUNFX0ZPUk1fTUVTSDogNSwKKyAgQ09PTlNfUEFUQ0hfTUVTSDogNiwKKyAgVEVOU09SX1BBVENIX01FU0g6IDcKK307CisKK3ZhciBQYXR0ZXJuID0gZnVuY3Rpb24gUGF0dGVybkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFBhdHRlcm4oKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIFBhdHRlcm4gY29uc3RydWN0b3IiKTsKKyAgfQorCisgIFBhdHRlcm4ucHJvdG90eXBlID0geworICAgIGdldFBhdHRlcm46IGZ1bmN0aW9uIFBhdHRlcm5fZ2V0UGF0dGVybihjdHgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBQYXR0ZXJuLmdldFN0eWxlOiAiLmNvbmNhdChjdHgpKTsKKyAgICB9CisgIH07CisKKyAgUGF0dGVybi5wYXJzZVNoYWRpbmcgPSBmdW5jdGlvbiAoc2hhZGluZywgbWF0cml4LCB4cmVmLCByZXMsIGhhbmRsZXIsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKKyAgICB2YXIgZGljdCA9ICgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoc2hhZGluZykgPyBzaGFkaW5nLmRpY3QgOiBzaGFkaW5nOworICAgIHZhciB0eXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CisKKyAgICB0cnkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQVhJQUw6CisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuUkFESUFMOgorICAgICAgICAgIHJldHVybiBuZXcgU2hhZGluZ3MuUmFkaWFsQXhpYWwoZGljdCwgbWF0cml4LCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6CisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6CisgICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDoKKyAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDoKKyAgICAgICAgICByZXR1cm4gbmV3IFNoYWRpbmdzLk1lc2goc2hhZGluZywgbWF0cml4LCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbnN1cHBvcnRlZCBTaGFkaW5nVHlwZTogIiArIHR5cGUpOworICAgICAgfQorICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuc2hhZGluZ1BhdHRlcm4KKyAgICAgIH0pOworICAgICAgKDAsIF91dGlsLndhcm4pKGV4KTsKKyAgICAgIHJldHVybiBuZXcgU2hhZGluZ3MuRHVtbXkoKTsKKyAgICB9CisgIH07CisKKyAgcmV0dXJuIFBhdHRlcm47Cit9KCk7CisKK2V4cG9ydHMuUGF0dGVybiA9IFBhdHRlcm47Cit2YXIgU2hhZGluZ3MgPSB7fTsKK1NoYWRpbmdzLlNNQUxMX05VTUJFUiA9IDFlLTY7CisKK1NoYWRpbmdzLlJhZGlhbEF4aWFsID0gZnVuY3Rpb24gUmFkaWFsQXhpYWxDbG9zdXJlKCkgeworICBmdW5jdGlvbiBSYWRpYWxBeGlhbChkaWN0LCBtYXRyaXgsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIHRoaXMubWF0cml4ID0gbWF0cml4OworICAgIHRoaXMuY29vcmRzQXJyID0gZGljdC5nZXRBcnJheSgiQ29vcmRzIik7CisgICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KCJTaGFkaW5nVHlwZSIpOworICAgIHRoaXMudHlwZSA9ICJQYXR0ZXJuIjsKKworICAgIHZhciBjcyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2UoeworICAgICAgY3M6IGRpY3QuZ2V0UmF3KCJDb2xvclNwYWNlIikgfHwgZGljdC5nZXRSYXcoIkNTIiksCisgICAgICB4cmVmOiB4cmVmLAorICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsCisgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgIH0pOworCisgICAgdGhpcy5jcyA9IGNzOworICAgIHZhciBiYm94ID0gZGljdC5nZXRBcnJheSgiQkJveCIpOworCisgICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHsKKyAgICAgIHRoaXMuYmJveCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChiYm94KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5iYm94ID0gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgdDAgPSAwLjAsCisgICAgICAgIHQxID0gMS4wOworCisgICAgaWYgKGRpY3QuaGFzKCJEb21haW4iKSkgeworICAgICAgdmFyIGRvbWFpbkFyciA9IGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpOworICAgICAgdDAgPSBkb21haW5BcnJbMF07CisgICAgICB0MSA9IGRvbWFpbkFyclsxXTsKKyAgICB9CisKKyAgICB2YXIgZXh0ZW5kU3RhcnQgPSBmYWxzZSwKKyAgICAgICAgZXh0ZW5kRW5kID0gZmFsc2U7CisKKyAgICBpZiAoZGljdC5oYXMoIkV4dGVuZCIpKSB7CisgICAgICB2YXIgZXh0ZW5kQXJyID0gZGljdC5nZXRBcnJheSgiRXh0ZW5kIik7CisgICAgICBleHRlbmRTdGFydCA9IGV4dGVuZEFyclswXTsKKyAgICAgIGV4dGVuZEVuZCA9IGV4dGVuZEFyclsxXTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMICYmICghZXh0ZW5kU3RhcnQgfHwgIWV4dGVuZEVuZCkpIHsKKyAgICAgIHZhciB4MSA9IHRoaXMuY29vcmRzQXJyWzBdOworICAgICAgdmFyIHkxID0gdGhpcy5jb29yZHNBcnJbMV07CisgICAgICB2YXIgcjEgPSB0aGlzLmNvb3Jkc0FyclsyXTsKKyAgICAgIHZhciB4MiA9IHRoaXMuY29vcmRzQXJyWzNdOworICAgICAgdmFyIHkyID0gdGhpcy5jb29yZHNBcnJbNF07CisgICAgICB2YXIgcjIgPSB0aGlzLmNvb3Jkc0Fycls1XTsKKyAgICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydCgoeDEgLSB4MikgKiAoeDEgLSB4MikgKyAoeTEgLSB5MikgKiAoeTEgLSB5MikpOworCisgICAgICBpZiAocjEgPD0gcjIgKyBkaXN0YW5jZSAmJiByMiA8PSByMSArIGRpc3RhbmNlKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5zdXBwb3J0ZWQgcmFkaWFsIGdyYWRpZW50LiIpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuZXh0ZW5kU3RhcnQgPSBleHRlbmRTdGFydDsKKyAgICB0aGlzLmV4dGVuZEVuZCA9IGV4dGVuZEVuZDsKKyAgICB2YXIgZm5PYmogPSBkaWN0LmdldFJhdygiRnVuY3Rpb24iKTsKKyAgICB2YXIgZm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlRnJvbUFycmF5KGZuT2JqKTsKKyAgICB2YXIgTlVNQkVSX09GX1NBTVBMRVMgPSAxMDsKKyAgICB2YXIgc3RlcCA9ICh0MSAtIHQwKSAvIE5VTUJFUl9PRl9TQU1QTEVTOworICAgIHZhciBjb2xvclN0b3BzID0gdGhpcy5jb2xvclN0b3BzID0gW107CisKKyAgICBpZiAodDAgPj0gdDEgfHwgc3RlcCA8PSAwKSB7CisgICAgICAoMCwgX3V0aWwuaW5mbykoIkJhZCBzaGFkaW5nIGRvbWFpbi4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgY29sb3IgPSBuZXcgRmxvYXQzMkFycmF5KGNzLm51bUNvbXBzKSwKKyAgICAgICAgcmF0aW8gPSBuZXcgRmxvYXQzMkFycmF5KDEpOworICAgIHZhciByZ2JDb2xvcjsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IE5VTUJFUl9PRl9TQU1QTEVTOyBpKyspIHsKKyAgICAgIHJhdGlvWzBdID0gdDAgKyBpICogc3RlcDsKKyAgICAgIGZuKHJhdGlvLCAwLCBjb2xvciwgMCk7CisgICAgICByZ2JDb2xvciA9IGNzLmdldFJnYihjb2xvciwgMCk7CisKKyAgICAgIHZhciBjc3NDb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyZ2JDb2xvclswXSwgcmdiQ29sb3JbMV0sIHJnYkNvbG9yWzJdKTsKKworICAgICAgY29sb3JTdG9wcy5wdXNoKFtpIC8gTlVNQkVSX09GX1NBTVBMRVMsIGNzc0NvbG9yXSk7CisgICAgfQorCisgICAgdmFyIGJhY2tncm91bmQgPSAidHJhbnNwYXJlbnQiOworCisgICAgaWYgKGRpY3QuaGFzKCJCYWNrZ3JvdW5kIikpIHsKKyAgICAgIHJnYkNvbG9yID0gY3MuZ2V0UmdiKGRpY3QuZ2V0KCJCYWNrZ3JvdW5kIiksIDApOworICAgICAgYmFja2dyb3VuZCA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyZ2JDb2xvclswXSwgcmdiQ29sb3JbMV0sIHJnYkNvbG9yWzJdKTsKKyAgICB9CisKKyAgICBpZiAoIWV4dGVuZFN0YXJ0KSB7CisgICAgICBjb2xvclN0b3BzLnVuc2hpZnQoWzAsIGJhY2tncm91bmRdKTsKKyAgICAgIGNvbG9yU3RvcHNbMV1bMF0gKz0gU2hhZGluZ3MuU01BTExfTlVNQkVSOworICAgIH0KKworICAgIGlmICghZXh0ZW5kRW5kKSB7CisgICAgICBjb2xvclN0b3BzW2NvbG9yU3RvcHMubGVuZ3RoIC0gMV1bMF0gLT0gU2hhZGluZ3MuU01BTExfTlVNQkVSOworICAgICAgY29sb3JTdG9wcy5wdXNoKFsxLCBiYWNrZ3JvdW5kXSk7CisgICAgfQorCisgICAgdGhpcy5jb2xvclN0b3BzID0gY29sb3JTdG9wczsKKyAgfQorCisgIFJhZGlhbEF4aWFsLnByb3RvdHlwZSA9IHsKKyAgICBnZXRJUjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZ2V0SVIoKSB7CisgICAgICB2YXIgY29vcmRzQXJyID0gdGhpcy5jb29yZHNBcnI7CisgICAgICB2YXIgc2hhZGluZ1R5cGUgPSB0aGlzLnNoYWRpbmdUeXBlOworICAgICAgdmFyIHR5cGUsIHAwLCBwMSwgcjAsIHIxOworCisgICAgICBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLkFYSUFMKSB7CisgICAgICAgIHAwID0gW2Nvb3Jkc0FyclswXSwgY29vcmRzQXJyWzFdXTsKKyAgICAgICAgcDEgPSBbY29vcmRzQXJyWzJdLCBjb29yZHNBcnJbM11dOworICAgICAgICByMCA9IG51bGw7CisgICAgICAgIHIxID0gbnVsbDsKKyAgICAgICAgdHlwZSA9ICJheGlhbCI7CisgICAgICB9IGVsc2UgaWYgKHNoYWRpbmdUeXBlID09PSBTaGFkaW5nVHlwZS5SQURJQUwpIHsKKyAgICAgICAgcDAgPSBbY29vcmRzQXJyWzBdLCBjb29yZHNBcnJbMV1dOworICAgICAgICBwMSA9IFtjb29yZHNBcnJbM10sIGNvb3Jkc0Fycls0XV07CisgICAgICAgIHIwID0gY29vcmRzQXJyWzJdOworICAgICAgICByMSA9IGNvb3Jkc0Fycls1XTsKKyAgICAgICAgdHlwZSA9ICJyYWRpYWwiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiZ2V0UGF0dGVybiB0eXBlIHVua25vd246ICIuY29uY2F0KHNoYWRpbmdUeXBlKSk7CisgICAgICB9CisKKyAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDsKKworICAgICAgaWYgKG1hdHJpeCkgeworICAgICAgICBwMCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0ocDAsIG1hdHJpeCk7CisgICAgICAgIHAxID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShwMSwgbWF0cml4KTsKKworICAgICAgICBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkgeworICAgICAgICAgIHZhciBzY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobWF0cml4KTsKKworICAgICAgICAgIHIwICo9IHNjYWxlWzBdOworICAgICAgICAgIHIxICo9IHNjYWxlWzFdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBbIlJhZGlhbEF4aWFsIiwgdHlwZSwgdGhpcy5iYm94LCB0aGlzLmNvbG9yU3RvcHMsIHAwLCBwMSwgcjAsIHIxXTsKKyAgICB9CisgIH07CisgIHJldHVybiBSYWRpYWxBeGlhbDsKK30oKTsKKworU2hhZGluZ3MuTWVzaCA9IGZ1bmN0aW9uIE1lc2hDbG9zdXJlKCkgeworICBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyKHN0cmVhbSwgY29udGV4dCkgeworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgdGhpcy5idWZmZXIgPSAwOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKKyAgICB2YXIgbnVtQ29tcHMgPSBjb250ZXh0Lm51bUNvbXBzOworICAgIHRoaXMudG1wQ29tcHNCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUNvbXBzKTsKKyAgICB2YXIgY3NOdW1Db21wcyA9IGNvbnRleHQuY29sb3JTcGFjZS5udW1Db21wczsKKyAgICB0aGlzLnRtcENzQ29tcHNCdWYgPSBjb250ZXh0LmNvbG9yRm4gPyBuZXcgRmxvYXQzMkFycmF5KGNzTnVtQ29tcHMpIDogdGhpcy50bXBDb21wc0J1ZjsKKyAgfQorCisgIE1lc2hTdHJlYW1SZWFkZXIucHJvdG90eXBlID0geworICAgIGdldCBoYXNEYXRhKCkgeworICAgICAgaWYgKHRoaXMuc3RyZWFtLmVuZCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucG9zIDwgdGhpcy5zdHJlYW0uZW5kOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5idWZmZXJMZW5ndGggPiAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICB2YXIgbmV4dEJ5dGUgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CisKKyAgICAgIGlmIChuZXh0Qnl0ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB0aGlzLmJ1ZmZlciA9IG5leHRCeXRlOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSA4OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIHJlYWRCaXRzOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRCaXRzKG4pIHsKKyAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKKyAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKworICAgICAgaWYgKG4gPT09IDMyKSB7CisgICAgICAgIGlmIChidWZmZXJMZW5ndGggPT09IDApIHsKKyAgICAgICAgICByZXR1cm4gKHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAyNCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAxNiB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCA4IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKSA+Pj4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCAyNCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAxNiB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCA4IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICB2YXIgbmV4dEJ5dGUgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgIHRoaXMuYnVmZmVyID0gbmV4dEJ5dGUgJiAoMSA8PCBidWZmZXJMZW5ndGgpIC0gMTsKKyAgICAgICAgcmV0dXJuIChidWZmZXIgPDwgOCAtIGJ1ZmZlckxlbmd0aCB8IChuZXh0Qnl0ZSAmIDB4ZmYpID4+IGJ1ZmZlckxlbmd0aCkgPj4+IDA7CisgICAgICB9CisKKyAgICAgIGlmIChuID09PSA4ICYmIGJ1ZmZlckxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgfQorCisgICAgICB3aGlsZSAoYnVmZmVyTGVuZ3RoIDwgbikgeworICAgICAgICBidWZmZXIgPSBidWZmZXIgPDwgOCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKKyAgICAgICAgYnVmZmVyTGVuZ3RoICs9IDg7CisgICAgICB9CisKKyAgICAgIGJ1ZmZlckxlbmd0aCAtPSBuOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciAmICgxIDw8IGJ1ZmZlckxlbmd0aCkgLSAxOworICAgICAgcmV0dXJuIGJ1ZmZlciA+PiBidWZmZXJMZW5ndGg7CisgICAgfSwKKyAgICBhbGlnbjogZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9hbGlnbigpIHsKKyAgICAgIHRoaXMuYnVmZmVyID0gMDsKKyAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKKyAgICB9LAorICAgIHJlYWRGbGFnOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRGbGFnKCkgeworICAgICAgcmV0dXJuIHRoaXMucmVhZEJpdHModGhpcy5jb250ZXh0LmJpdHNQZXJGbGFnKTsKKyAgICB9LAorICAgIHJlYWRDb29yZGluYXRlOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRDb29yZGluYXRlKCkgeworICAgICAgdmFyIGJpdHNQZXJDb29yZGluYXRlID0gdGhpcy5jb250ZXh0LmJpdHNQZXJDb29yZGluYXRlOworICAgICAgdmFyIHhpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29vcmRpbmF0ZSk7CisgICAgICB2YXIgeWkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTsKKyAgICAgIHZhciBkZWNvZGUgPSB0aGlzLmNvbnRleHQuZGVjb2RlOworICAgICAgdmFyIHNjYWxlID0gYml0c1BlckNvb3JkaW5hdGUgPCAzMiA/IDEgLyAoKDEgPDwgYml0c1BlckNvb3JkaW5hdGUpIC0gMSkgOiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOworICAgICAgcmV0dXJuIFt4aSAqIHNjYWxlICogKGRlY29kZVsxXSAtIGRlY29kZVswXSkgKyBkZWNvZGVbMF0sIHlpICogc2NhbGUgKiAoZGVjb2RlWzNdIC0gZGVjb2RlWzJdKSArIGRlY29kZVsyXV07CisgICAgfSwKKyAgICByZWFkQ29tcG9uZW50czogZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9yZWFkQ29tcG9uZW50cygpIHsKKyAgICAgIHZhciBudW1Db21wcyA9IHRoaXMuY29udGV4dC5udW1Db21wczsKKyAgICAgIHZhciBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5jb250ZXh0LmJpdHNQZXJDb21wb25lbnQ7CisgICAgICB2YXIgc2NhbGUgPSBiaXRzUGVyQ29tcG9uZW50IDwgMzIgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb21wb25lbnQpIC0gMSkgOiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOworICAgICAgdmFyIGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7CisgICAgICB2YXIgY29tcG9uZW50cyA9IHRoaXMudG1wQ29tcHNCdWY7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gNDsgaSA8IG51bUNvbXBzOyBpKyssIGogKz0gMikgeworICAgICAgICB2YXIgY2kgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb21wb25lbnQpOworICAgICAgICBjb21wb25lbnRzW2ldID0gY2kgKiBzY2FsZSAqIChkZWNvZGVbaiArIDFdIC0gZGVjb2RlW2pdKSArIGRlY29kZVtqXTsKKyAgICAgIH0KKworICAgICAgdmFyIGNvbG9yID0gdGhpcy50bXBDc0NvbXBzQnVmOworCisgICAgICBpZiAodGhpcy5jb250ZXh0LmNvbG9yRm4pIHsKKyAgICAgICAgdGhpcy5jb250ZXh0LmNvbG9yRm4oY29tcG9uZW50cywgMCwgY29sb3IsIDApOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbG9yU3BhY2UuZ2V0UmdiKGNvbG9yLCAwKTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZGVjb2RlVHlwZTRTaGFkaW5nKG1lc2gsIHJlYWRlcikgeworICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkczsKKyAgICB2YXIgY29sb3JzID0gbWVzaC5jb2xvcnM7CisgICAgdmFyIG9wZXJhdG9ycyA9IFtdOworICAgIHZhciBwcyA9IFtdOworICAgIHZhciB2ZXJ0aWNlc0xlZnQgPSAwOworCisgICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CisgICAgICB2YXIgZiA9IHJlYWRlci5yZWFkRmxhZygpOworICAgICAgdmFyIGNvb3JkID0gcmVhZGVyLnJlYWRDb29yZGluYXRlKCk7CisgICAgICB2YXIgY29sb3IgPSByZWFkZXIucmVhZENvbXBvbmVudHMoKTsKKworICAgICAgaWYgKHZlcnRpY2VzTGVmdCA9PT0gMCkgeworICAgICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAyKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNCBmbGFnIik7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGYpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwcy5wdXNoKHBzW3BzLmxlbmd0aCAtIDJdLCBwc1twcy5sZW5ndGggLSAxXSk7CisgICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwcy5wdXNoKHBzW3BzLmxlbmd0aCAtIDNdLCBwc1twcy5sZW5ndGggLSAxXSk7CisgICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvcGVyYXRvcnMucHVzaChmKTsKKyAgICAgIH0KKworICAgICAgcHMucHVzaChjb29yZHMubGVuZ3RoKTsKKyAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKKyAgICAgIGNvbG9ycy5wdXNoKGNvbG9yKTsKKyAgICAgIHZlcnRpY2VzTGVmdC0tOworICAgICAgcmVhZGVyLmFsaWduKCk7CisgICAgfQorCisgICAgbWVzaC5maWd1cmVzLnB1c2goeworICAgICAgdHlwZTogInRyaWFuZ2xlcyIsCisgICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKKyAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkocHMpCisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVUeXBlNVNoYWRpbmcobWVzaCwgcmVhZGVyLCB2ZXJ0aWNlc1BlclJvdykgeworICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkczsKKyAgICB2YXIgY29sb3JzID0gbWVzaC5jb2xvcnM7CisgICAgdmFyIHBzID0gW107CisKKyAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKKyAgICAgIHZhciBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpOworICAgICAgdmFyIGNvbG9yID0gcmVhZGVyLnJlYWRDb21wb25lbnRzKCk7CisgICAgICBwcy5wdXNoKGNvb3Jkcy5sZW5ndGgpOworICAgICAgY29vcmRzLnB1c2goY29vcmQpOworICAgICAgY29sb3JzLnB1c2goY29sb3IpOworICAgIH0KKworICAgIG1lc2guZmlndXJlcy5wdXNoKHsKKyAgICAgIHR5cGU6ICJsYXR0aWNlIiwKKyAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAorICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShwcyksCisgICAgICB2ZXJ0aWNlc1BlclJvdzogdmVydGljZXNQZXJSb3cKKyAgICB9KTsKKyAgfQorCisgIHZhciBNSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCA9IDM7CisgIHZhciBNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCA9IDIwOworICB2YXIgVFJJQU5HTEVfREVOU0lUWSA9IDIwOworCisgIHZhciBnZXRCID0gZnVuY3Rpb24gZ2V0QkNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gYnVpbGRCKGNvdW50KSB7CisgICAgICB2YXIgbHV0ID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgICAgdmFyIHQgPSBpIC8gY291bnQsCisgICAgICAgICAgICB0XyA9IDEgLSB0OworICAgICAgICBsdXQucHVzaChuZXcgRmxvYXQzMkFycmF5KFt0XyAqIHRfICogdF8sIDMgKiB0ICogdF8gKiB0XywgMyAqIHQgKiB0ICogdF8sIHQgKiB0ICogdF0pKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGx1dDsKKyAgICB9CisKKyAgICB2YXIgY2FjaGUgPSBbXTsKKyAgICByZXR1cm4gZnVuY3Rpb24gZ2V0Qihjb3VudCkgeworICAgICAgaWYgKCFjYWNoZVtjb3VudF0pIHsKKyAgICAgICAgY2FjaGVbY291bnRdID0gYnVpbGRCKGNvdW50KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGNhY2hlW2NvdW50XTsKKyAgICB9OworICB9KCk7CisKKyAgZnVuY3Rpb24gYnVpbGRGaWd1cmVGcm9tUGF0Y2gobWVzaCwgaW5kZXgpIHsKKyAgICB2YXIgZmlndXJlID0gbWVzaC5maWd1cmVzW2luZGV4XTsKKyAgICAoMCwgX3V0aWwuYXNzZXJ0KShmaWd1cmUudHlwZSA9PT0gInBhdGNoIiwgIlVuZXhwZWN0ZWQgcGF0Y2ggbWVzaCBmaWd1cmUiKTsKKyAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHMsCisgICAgICAgIGNvbG9ycyA9IG1lc2guY29sb3JzOworICAgIHZhciBwaSA9IGZpZ3VyZS5jb29yZHM7CisgICAgdmFyIGNpID0gZmlndXJlLmNvbG9yczsKKyAgICB2YXIgZmlndXJlTWluWCA9IE1hdGgubWluKGNvb3Jkc1twaVswXV1bMF0sIGNvb3Jkc1twaVszXV1bMF0sIGNvb3Jkc1twaVsxMl1dWzBdLCBjb29yZHNbcGlbMTVdXVswXSk7CisgICAgdmFyIGZpZ3VyZU1pblkgPSBNYXRoLm1pbihjb29yZHNbcGlbMF1dWzFdLCBjb29yZHNbcGlbM11dWzFdLCBjb29yZHNbcGlbMTJdXVsxXSwgY29vcmRzW3BpWzE1XV1bMV0pOworICAgIHZhciBmaWd1cmVNYXhYID0gTWF0aC5tYXgoY29vcmRzW3BpWzBdXVswXSwgY29vcmRzW3BpWzNdXVswXSwgY29vcmRzW3BpWzEyXV1bMF0sIGNvb3Jkc1twaVsxNV1dWzBdKTsKKyAgICB2YXIgZmlndXJlTWF4WSA9IE1hdGgubWF4KGNvb3Jkc1twaVswXV1bMV0sIGNvb3Jkc1twaVszXV1bMV0sIGNvb3Jkc1twaVsxMl1dWzFdLCBjb29yZHNbcGlbMTVdXVsxXSk7CisgICAgdmFyIHNwbGl0WEJ5ID0gTWF0aC5jZWlsKChmaWd1cmVNYXhYIC0gZmlndXJlTWluWCkgKiBUUklBTkdMRV9ERU5TSVRZIC8gKG1lc2guYm91bmRzWzJdIC0gbWVzaC5ib3VuZHNbMF0pKTsKKyAgICBzcGxpdFhCeSA9IE1hdGgubWF4KE1JTl9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULCBNYXRoLm1pbihNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgc3BsaXRYQnkpKTsKKyAgICB2YXIgc3BsaXRZQnkgPSBNYXRoLmNlaWwoKGZpZ3VyZU1heFkgLSBmaWd1cmVNaW5ZKSAqIFRSSUFOR0xFX0RFTlNJVFkgLyAobWVzaC5ib3VuZHNbM10gLSBtZXNoLmJvdW5kc1sxXSkpOworICAgIHNwbGl0WUJ5ID0gTWF0aC5tYXgoTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1hdGgubWluKE1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULCBzcGxpdFlCeSkpOworICAgIHZhciB2ZXJ0aWNlc1BlclJvdyA9IHNwbGl0WEJ5ICsgMTsKKyAgICB2YXIgZmlndXJlQ29vcmRzID0gbmV3IEludDMyQXJyYXkoKHNwbGl0WUJ5ICsgMSkgKiB2ZXJ0aWNlc1BlclJvdyk7CisgICAgdmFyIGZpZ3VyZUNvbG9ycyA9IG5ldyBJbnQzMkFycmF5KChzcGxpdFlCeSArIDEpICogdmVydGljZXNQZXJSb3cpOworICAgIHZhciBrID0gMDsKKyAgICB2YXIgY2wgPSBuZXcgVWludDhBcnJheSgzKSwKKyAgICAgICAgY3IgPSBuZXcgVWludDhBcnJheSgzKTsKKyAgICB2YXIgYzAgPSBjb2xvcnNbY2lbMF1dLAorICAgICAgICBjMSA9IGNvbG9yc1tjaVsxXV0sCisgICAgICAgIGMyID0gY29sb3JzW2NpWzJdXSwKKyAgICAgICAgYzMgPSBjb2xvcnNbY2lbM11dOworICAgIHZhciBiUm93ID0gZ2V0QihzcGxpdFlCeSksCisgICAgICAgIGJDb2wgPSBnZXRCKHNwbGl0WEJ5KTsKKworICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8PSBzcGxpdFlCeTsgcm93KyspIHsKKyAgICAgIGNsWzBdID0gKGMwWzBdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzBdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKKyAgICAgIGNsWzFdID0gKGMwWzFdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzFdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKKyAgICAgIGNsWzJdID0gKGMwWzJdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzJdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKKyAgICAgIGNyWzBdID0gKGMxWzBdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzBdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKKyAgICAgIGNyWzFdID0gKGMxWzFdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzFdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKKyAgICAgIGNyWzJdID0gKGMxWzJdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzJdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKKworICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDw9IHNwbGl0WEJ5OyBjb2wrKywgaysrKSB7CisgICAgICAgIGlmICgocm93ID09PSAwIHx8IHJvdyA9PT0gc3BsaXRZQnkpICYmIChjb2wgPT09IDAgfHwgY29sID09PSBzcGxpdFhCeSkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB4ID0gMCwKKyAgICAgICAgICAgIHkgPSAwOworICAgICAgICB2YXIgcSA9IDA7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gMzsgaSsrKSB7CisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPD0gMzsgaisrLCBxKyspIHsKKyAgICAgICAgICAgIHZhciBtID0gYlJvd1tyb3ddW2ldICogYkNvbFtjb2xdW2pdOworICAgICAgICAgICAgeCArPSBjb29yZHNbcGlbcV1dWzBdICogbTsKKyAgICAgICAgICAgIHkgKz0gY29vcmRzW3BpW3FdXVsxXSAqIG07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmlndXJlQ29vcmRzW2tdID0gY29vcmRzLmxlbmd0aDsKKyAgICAgICAgY29vcmRzLnB1c2goW3gsIHldKTsKKyAgICAgICAgZmlndXJlQ29sb3JzW2tdID0gY29sb3JzLmxlbmd0aDsKKyAgICAgICAgdmFyIG5ld0NvbG9yID0gbmV3IFVpbnQ4QXJyYXkoMyk7CisgICAgICAgIG5ld0NvbG9yWzBdID0gKGNsWzBdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzBdICogY29sKSAvIHNwbGl0WEJ5IHwgMDsKKyAgICAgICAgbmV3Q29sb3JbMV0gPSAoY2xbMV0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMV0gKiBjb2wpIC8gc3BsaXRYQnkgfCAwOworICAgICAgICBuZXdDb2xvclsyXSA9IChjbFsyXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclsyXSAqIGNvbCkgLyBzcGxpdFhCeSB8IDA7CisgICAgICAgIGNvbG9ycy5wdXNoKG5ld0NvbG9yKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmaWd1cmVDb29yZHNbMF0gPSBwaVswXTsKKyAgICBmaWd1cmVDb2xvcnNbMF0gPSBjaVswXTsKKyAgICBmaWd1cmVDb29yZHNbc3BsaXRYQnldID0gcGlbM107CisgICAgZmlndXJlQ29sb3JzW3NwbGl0WEJ5XSA9IGNpWzFdOworICAgIGZpZ3VyZUNvb3Jkc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5XSA9IHBpWzEyXTsKKyAgICBmaWd1cmVDb2xvcnNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeV0gPSBjaVsyXTsKKyAgICBmaWd1cmVDb29yZHNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeSArIHNwbGl0WEJ5XSA9IHBpWzE1XTsKKyAgICBmaWd1cmVDb2xvcnNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeSArIHNwbGl0WEJ5XSA9IGNpWzNdOworICAgIG1lc2guZmlndXJlc1tpbmRleF0gPSB7CisgICAgICB0eXBlOiAibGF0dGljZSIsCisgICAgICBjb29yZHM6IGZpZ3VyZUNvb3JkcywKKyAgICAgIGNvbG9yczogZmlndXJlQ29sb3JzLAorICAgICAgdmVydGljZXNQZXJSb3c6IHZlcnRpY2VzUGVyUm93CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVR5cGU2U2hhZGluZyhtZXNoLCByZWFkZXIpIHsKKyAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHM7CisgICAgdmFyIGNvbG9ycyA9IG1lc2guY29sb3JzOworICAgIHZhciBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKKyAgICB2YXIgY3MgPSBuZXcgSW50MzJBcnJheSg0KTsKKworICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkgeworICAgICAgdmFyIGYgPSByZWFkZXIucmVhZEZsYWcoKTsKKworICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMykpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU2IGZsYWciKTsKKyAgICAgIH0KKworICAgICAgdmFyIGksIGlpOworICAgICAgdmFyIHBpID0gY29vcmRzLmxlbmd0aDsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSBmICE9PSAwID8gOCA6IDEyOyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7CisgICAgICB9CisKKyAgICAgIHZhciBjaSA9IGNvbG9ycy5sZW5ndGg7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb2xvcnMucHVzaChyZWFkZXIucmVhZENvbXBvbmVudHMoKSk7CisgICAgICB9CisKKyAgICAgIHZhciB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgICBzd2l0Y2ggKGYpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHBzWzEyXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyA1OworICAgICAgICAgIHBzWzE1XSA9IHBpICsgNjsKKyAgICAgICAgICBwc1s4XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CisgICAgICAgICAgcHNbNF0gPSBwaSArIDE7CisgICAgICAgICAgcHNbN10gPSBwaSArIDg7CisgICAgICAgICAgcHNbMF0gPSBwaTsKKyAgICAgICAgICBwc1sxXSA9IHBpICsgMTE7CisgICAgICAgICAgcHNbMl0gPSBwaSArIDEwOworICAgICAgICAgIHBzWzNdID0gcGkgKyA5OworICAgICAgICAgIGNzWzJdID0gY2kgKyAxOworICAgICAgICAgIGNzWzNdID0gY2kgKyAyOworICAgICAgICAgIGNzWzBdID0gY2k7CisgICAgICAgICAgY3NbMV0gPSBjaSArIDM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHRtcDEgPSBwc1sxMl07CisgICAgICAgICAgdG1wMiA9IHBzWzEzXTsKKyAgICAgICAgICB0bXAzID0gcHNbMTRdOworICAgICAgICAgIHRtcDQgPSBwc1sxNV07CisgICAgICAgICAgcHNbMTJdID0gdG1wNDsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyAxOworICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1s4XSA9IHRtcDM7CisgICAgICAgICAgcHNbMTFdID0gcGkgKyAzOworICAgICAgICAgIHBzWzRdID0gdG1wMjsKKyAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKKyAgICAgICAgICBwc1swXSA9IHRtcDE7CisgICAgICAgICAgcHNbMV0gPSBwaSArIDc7CisgICAgICAgICAgcHNbMl0gPSBwaSArIDY7CisgICAgICAgICAgcHNbM10gPSBwaSArIDU7CisgICAgICAgICAgdG1wMSA9IGNzWzJdOworICAgICAgICAgIHRtcDIgPSBjc1szXTsKKyAgICAgICAgICBjc1syXSA9IHRtcDI7CisgICAgICAgICAgY3NbM10gPSBjaTsKKyAgICAgICAgICBjc1swXSA9IHRtcDE7CisgICAgICAgICAgY3NbMV0gPSBjaSArIDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIHRtcDEgPSBwc1sxNV07CisgICAgICAgICAgdG1wMiA9IHBzWzExXTsKKyAgICAgICAgICBwc1sxMl0gPSBwc1szXTsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyAxOworICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1s4XSA9IHBzWzddOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHRtcDI7CisgICAgICAgICAgcHNbN10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMF0gPSB0bXAxOworICAgICAgICAgIHBzWzFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzJdID0gcGkgKyA2OworICAgICAgICAgIHBzWzNdID0gcGkgKyA1OworICAgICAgICAgIHRtcDEgPSBjc1szXTsKKyAgICAgICAgICBjc1syXSA9IGNzWzFdOworICAgICAgICAgIGNzWzNdID0gY2k7CisgICAgICAgICAgY3NbMF0gPSB0bXAxOworICAgICAgICAgIGNzWzFdID0gY2kgKyAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBwc1sxMl0gPSBwc1swXTsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyAxOworICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1s4XSA9IHBzWzFdOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHBzWzJdOworICAgICAgICAgIHBzWzddID0gcGkgKyA0OworICAgICAgICAgIHBzWzBdID0gcHNbM107CisgICAgICAgICAgcHNbMV0gPSBwaSArIDc7CisgICAgICAgICAgcHNbMl0gPSBwaSArIDY7CisgICAgICAgICAgcHNbM10gPSBwaSArIDU7CisgICAgICAgICAgY3NbMl0gPSBjc1swXTsKKyAgICAgICAgICBjc1szXSA9IGNpOworICAgICAgICAgIGNzWzBdID0gY3NbMV07CisgICAgICAgICAgY3NbMV0gPSBjaSArIDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHBzWzVdID0gY29vcmRzLmxlbmd0aDsKKyAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMF1dWzBdIC0gY29vcmRzW3BzWzE1XV1bMF0gKyA2ICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMV1dWzBdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMF0gKyBjb29yZHNbcHNbM11dWzBdKSArIDMgKiAoY29vcmRzW3BzWzEzXV1bMF0gKyBjb29yZHNbcHNbN11dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMF1dWzFdIC0gY29vcmRzW3BzWzE1XV1bMV0gKyA2ICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMV1dWzFdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMV0gKyBjb29yZHNbcHNbM11dWzFdKSArIDMgKiAoY29vcmRzW3BzWzEzXV1bMV0gKyBjb29yZHNbcHNbN11dWzFdKSkgLyA5XSk7CisgICAgICBwc1s2XSA9IGNvb3Jkcy5sZW5ndGg7CisgICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzNdXVswXSAtIGNvb3Jkc1twc1sxMl1dWzBdICsgNiAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzddXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzNdXVsxXSAtIGNvb3Jkc1twc1sxMl1dWzFdICsgNiAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzddXVsxXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMV0gKyBjb29yZHNbcHNbMTVdXVsxXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkpIC8gOV0pOworICAgICAgcHNbOV0gPSBjb29yZHMubGVuZ3RoOworICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1sxMl1dWzBdIC0gY29vcmRzW3BzWzNdXVswXSArIDYgKiAoY29vcmRzW3BzWzhdXVswXSArIGNvb3Jkc1twc1sxM11dWzBdKSAtIDIgKiAoY29vcmRzW3BzWzBdXVswXSArIGNvb3Jkc1twc1sxNV1dWzBdKSArIDMgKiAoY29vcmRzW3BzWzExXV1bMF0gKyBjb29yZHNbcHNbMV1dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMTJdXVsxXSAtIGNvb3Jkc1twc1szXV1bMV0gKyA2ICogKGNvb3Jkc1twc1s4XV1bMV0gKyBjb29yZHNbcHNbMTNdXVsxXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMV0gKyBjb29yZHNbcHNbMTVdXVsxXSkgKyAzICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzFdXVsxXSkpIC8gOV0pOworICAgICAgcHNbMTBdID0gY29vcmRzLmxlbmd0aDsKKyAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMTVdXVswXSAtIGNvb3Jkc1twc1swXV1bMF0gKyA2ICogKGNvb3Jkc1twc1sxMV1dWzBdICsgY29vcmRzW3BzWzE0XV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICsgMyAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzhdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzE1XV1bMV0gLSBjb29yZHNbcHNbMF1dWzFdICsgNiAqIChjb29yZHNbcHNbMTFdXVsxXSArIGNvb3Jkc1twc1sxNF1dWzFdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMV0gKyBjb29yZHNbcHNbM11dWzFdKSArIDMgKiAoY29vcmRzW3BzWzJdXVsxXSArIGNvb3Jkc1twc1s4XV1bMV0pKSAvIDldKTsKKyAgICAgIG1lc2guZmlndXJlcy5wdXNoKHsKKyAgICAgICAgdHlwZTogInBhdGNoIiwKKyAgICAgICAgY29vcmRzOiBuZXcgSW50MzJBcnJheShwcyksCisgICAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkoY3MpCisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVUeXBlN1NoYWRpbmcobWVzaCwgcmVhZGVyKSB7CisgICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzOworICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9yczsKKyAgICB2YXIgcHMgPSBuZXcgSW50MzJBcnJheSgxNik7CisgICAgdmFyIGNzID0gbmV3IEludDMyQXJyYXkoNCk7CisKKyAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKKyAgICAgIHZhciBmID0gcmVhZGVyLnJlYWRGbGFnKCk7CisKKyAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNyBmbGFnIik7CisgICAgICB9CisKKyAgICAgIHZhciBpLCBpaTsKKyAgICAgIHZhciBwaSA9IGNvb3Jkcy5sZW5ndGg7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDEyIDogMTY7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvb3Jkcy5wdXNoKHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNpID0gY29sb3JzLmxlbmd0aDsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSBmICE9PSAwID8gMiA6IDQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTsKKyAgICAgIH0KKworICAgICAgdmFyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisKKyAgICAgIHN3aXRjaCAoZikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgcHNbMTJdID0gcGkgKyAzOworICAgICAgICAgIHBzWzEzXSA9IHBpICsgNDsKKyAgICAgICAgICBwc1sxNF0gPSBwaSArIDU7CisgICAgICAgICAgcHNbMTVdID0gcGkgKyA2OworICAgICAgICAgIHBzWzhdID0gcGkgKyAyOworICAgICAgICAgIHBzWzldID0gcGkgKyAxMzsKKyAgICAgICAgICBwc1sxMF0gPSBwaSArIDE0OworICAgICAgICAgIHBzWzExXSA9IHBpICsgNzsKKyAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1s1XSA9IHBpICsgMTI7CisgICAgICAgICAgcHNbNl0gPSBwaSArIDE1OworICAgICAgICAgIHBzWzddID0gcGkgKyA4OworICAgICAgICAgIHBzWzBdID0gcGk7CisgICAgICAgICAgcHNbMV0gPSBwaSArIDExOworICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKKyAgICAgICAgICBwc1szXSA9IHBpICsgOTsKKyAgICAgICAgICBjc1syXSA9IGNpICsgMTsKKyAgICAgICAgICBjc1szXSA9IGNpICsgMjsKKyAgICAgICAgICBjc1swXSA9IGNpOworICAgICAgICAgIGNzWzFdID0gY2kgKyAzOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICB0bXAxID0gcHNbMTJdOworICAgICAgICAgIHRtcDIgPSBwc1sxM107CisgICAgICAgICAgdG1wMyA9IHBzWzE0XTsKKyAgICAgICAgICB0bXA0ID0gcHNbMTVdOworICAgICAgICAgIHBzWzEyXSA9IHRtcDQ7CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSB0bXAzOworICAgICAgICAgIHBzWzldID0gcGkgKyA5OworICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTA7CisgICAgICAgICAgcHNbMTFdID0gcGkgKyAzOworICAgICAgICAgIHBzWzRdID0gdG1wMjsKKyAgICAgICAgICBwc1s1XSA9IHBpICsgODsKKyAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CisgICAgICAgICAgcHNbN10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMF0gPSB0bXAxOworICAgICAgICAgIHBzWzFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzJdID0gcGkgKyA2OworICAgICAgICAgIHBzWzNdID0gcGkgKyA1OworICAgICAgICAgIHRtcDEgPSBjc1syXTsKKyAgICAgICAgICB0bXAyID0gY3NbM107CisgICAgICAgICAgY3NbMl0gPSB0bXAyOworICAgICAgICAgIGNzWzNdID0gY2k7CisgICAgICAgICAgY3NbMF0gPSB0bXAxOworICAgICAgICAgIGNzWzFdID0gY2kgKyAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICB0bXAxID0gcHNbMTVdOworICAgICAgICAgIHRtcDIgPSBwc1sxMV07CisgICAgICAgICAgcHNbMTJdID0gcHNbM107CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSBwc1s3XTsKKyAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKKyAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHRtcDI7CisgICAgICAgICAgcHNbNV0gPSBwaSArIDg7CisgICAgICAgICAgcHNbNl0gPSBwaSArIDExOworICAgICAgICAgIHBzWzddID0gcGkgKyA0OworICAgICAgICAgIHBzWzBdID0gdG1wMTsKKyAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKKyAgICAgICAgICBwc1syXSA9IHBpICsgNjsKKyAgICAgICAgICBwc1szXSA9IHBpICsgNTsKKyAgICAgICAgICB0bXAxID0gY3NbM107CisgICAgICAgICAgY3NbMl0gPSBjc1sxXTsKKyAgICAgICAgICBjc1szXSA9IGNpOworICAgICAgICAgIGNzWzBdID0gdG1wMTsKKyAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgcHNbMTJdID0gcHNbMF07CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSBwc1sxXTsKKyAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKKyAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHBzWzJdOworICAgICAgICAgIHBzWzVdID0gcGkgKyA4OworICAgICAgICAgIHBzWzZdID0gcGkgKyAxMTsKKyAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKKyAgICAgICAgICBwc1swXSA9IHBzWzNdOworICAgICAgICAgIHBzWzFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzJdID0gcGkgKyA2OworICAgICAgICAgIHBzWzNdID0gcGkgKyA1OworICAgICAgICAgIGNzWzJdID0gY3NbMF07CisgICAgICAgICAgY3NbM10gPSBjaTsKKyAgICAgICAgICBjc1swXSA9IGNzWzFdOworICAgICAgICAgIGNzWzFdID0gY2kgKyAxOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBtZXNoLmZpZ3VyZXMucHVzaCh7CisgICAgICAgIHR5cGU6ICJwYXRjaCIsCisgICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAorICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlQm91bmRzKG1lc2gpIHsKKyAgICB2YXIgbWluWCA9IG1lc2guY29vcmRzWzBdWzBdLAorICAgICAgICBtaW5ZID0gbWVzaC5jb29yZHNbMF1bMV0sCisgICAgICAgIG1heFggPSBtaW5YLAorICAgICAgICBtYXhZID0gbWluWTsKKworICAgIGZvciAodmFyIGkgPSAxLCBpaSA9IG1lc2guY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciB4ID0gbWVzaC5jb29yZHNbaV1bMF0sCisgICAgICAgICAgeSA9IG1lc2guY29vcmRzW2ldWzFdOworICAgICAgbWluWCA9IG1pblggPiB4ID8geCA6IG1pblg7CisgICAgICBtaW5ZID0gbWluWSA+IHkgPyB5IDogbWluWTsKKyAgICAgIG1heFggPSBtYXhYIDwgeCA/IHggOiBtYXhYOworICAgICAgbWF4WSA9IG1heFkgPCB5ID8geSA6IG1heFk7CisgICAgfQorCisgICAgbWVzaC5ib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07CisgIH0KKworICBmdW5jdGlvbiBwYWNrRGF0YShtZXNoKSB7CisgICAgdmFyIGksIGlpLCBqLCBqajsKKyAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHM7CisgICAgdmFyIGNvb3Jkc1BhY2tlZCA9IG5ldyBGbG9hdDMyQXJyYXkoY29vcmRzLmxlbmd0aCAqIDIpOworCisgICAgZm9yIChpID0gMCwgaiA9IDAsIGlpID0gY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciB4eSA9IGNvb3Jkc1tpXTsKKyAgICAgIGNvb3Jkc1BhY2tlZFtqKytdID0geHlbMF07CisgICAgICBjb29yZHNQYWNrZWRbaisrXSA9IHh5WzFdOworICAgIH0KKworICAgIG1lc2guY29vcmRzID0gY29vcmRzUGFja2VkOworICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9yczsKKyAgICB2YXIgY29sb3JzUGFja2VkID0gbmV3IFVpbnQ4QXJyYXkoY29sb3JzLmxlbmd0aCAqIDMpOworCisgICAgZm9yIChpID0gMCwgaiA9IDAsIGlpID0gY29sb3JzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjID0gY29sb3JzW2ldOworICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzBdOworICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzFdOworICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzJdOworICAgIH0KKworICAgIG1lc2guY29sb3JzID0gY29sb3JzUGFja2VkOworICAgIHZhciBmaWd1cmVzID0gbWVzaC5maWd1cmVzOworCisgICAgZm9yIChpID0gMCwgaWkgPSBmaWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBmaWd1cmUgPSBmaWd1cmVzW2ldLAorICAgICAgICAgIHBzID0gZmlndXJlLmNvb3JkcywKKyAgICAgICAgICBjcyA9IGZpZ3VyZS5jb2xvcnM7CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gcHMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICBwc1tqXSAqPSAyOworICAgICAgICBjc1tqXSAqPSAzOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIE1lc2goc3RyZWFtLCBtYXRyaXgsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShzdHJlYW0pKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1lc2ggZGF0YSBpcyBub3QgYSBzdHJlYW0iKTsKKyAgICB9CisKKyAgICB2YXIgZGljdCA9IHN0cmVhbS5kaWN0OworICAgIHRoaXMubWF0cml4ID0gbWF0cml4OworICAgIHRoaXMuc2hhZGluZ1R5cGUgPSBkaWN0LmdldCgiU2hhZGluZ1R5cGUiKTsKKyAgICB0aGlzLnR5cGUgPSAiUGF0dGVybiI7CisgICAgdmFyIGJib3ggPSBkaWN0LmdldEFycmF5KCJCQm94Iik7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShiYm94KSAmJiBiYm94Lmxlbmd0aCA9PT0gNCkgeworICAgICAgdGhpcy5iYm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KGJib3gpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmJib3ggPSBudWxsOworICAgIH0KKworICAgIHZhciBjcyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2UoeworICAgICAgY3M6IGRpY3QuZ2V0UmF3KCJDb2xvclNwYWNlIikgfHwgZGljdC5nZXRSYXcoIkNTIiksCisgICAgICB4cmVmOiB4cmVmLAorICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsCisgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgIH0pOworCisgICAgdGhpcy5jcyA9IGNzOworICAgIHRoaXMuYmFja2dyb3VuZCA9IGRpY3QuaGFzKCJCYWNrZ3JvdW5kIikgPyBjcy5nZXRSZ2IoZGljdC5nZXQoIkJhY2tncm91bmQiKSwgMCkgOiBudWxsOworICAgIHZhciBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOworICAgIHZhciBmbiA9IGZuT2JqID8gcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZUZyb21BcnJheShmbk9iaikgOiBudWxsOworICAgIHRoaXMuY29vcmRzID0gW107CisgICAgdGhpcy5jb2xvcnMgPSBbXTsKKyAgICB0aGlzLmZpZ3VyZXMgPSBbXTsKKyAgICB2YXIgZGVjb2RlQ29udGV4dCA9IHsKKyAgICAgIGJpdHNQZXJDb29yZGluYXRlOiBkaWN0LmdldCgiQml0c1BlckNvb3JkaW5hdGUiKSwKKyAgICAgIGJpdHNQZXJDb21wb25lbnQ6IGRpY3QuZ2V0KCJCaXRzUGVyQ29tcG9uZW50IiksCisgICAgICBiaXRzUGVyRmxhZzogZGljdC5nZXQoIkJpdHNQZXJGbGFnIiksCisgICAgICBkZWNvZGU6IGRpY3QuZ2V0QXJyYXkoIkRlY29kZSIpLAorICAgICAgY29sb3JGbjogZm4sCisgICAgICBjb2xvclNwYWNlOiBjcywKKyAgICAgIG51bUNvbXBzOiBmbiA/IDEgOiBjcy5udW1Db21wcworICAgIH07CisgICAgdmFyIHJlYWRlciA9IG5ldyBNZXNoU3RyZWFtUmVhZGVyKHN0cmVhbSwgZGVjb2RlQ29udGV4dCk7CisgICAgdmFyIHBhdGNoTWVzaCA9IGZhbHNlOworCisgICAgc3dpdGNoICh0aGlzLnNoYWRpbmdUeXBlKSB7CisgICAgICBjYXNlIFNoYWRpbmdUeXBlLkZSRUVfRk9STV9NRVNIOgorICAgICAgICBkZWNvZGVUeXBlNFNoYWRpbmcodGhpcywgcmVhZGVyKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6CisgICAgICAgIHZhciB2ZXJ0aWNlc1BlclJvdyA9IGRpY3QuZ2V0KCJWZXJ0aWNlc1BlclJvdyIpIHwgMDsKKworICAgICAgICBpZiAodmVydGljZXNQZXJSb3cgPCAyKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFZlcnRpY2VzUGVyUm93Iik7CisgICAgICAgIH0KKworICAgICAgICBkZWNvZGVUeXBlNVNoYWRpbmcodGhpcywgcmVhZGVyLCB2ZXJ0aWNlc1BlclJvdyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNoYWRpbmdUeXBlLkNPT05TX1BBVENIX01FU0g6CisgICAgICAgIGRlY29kZVR5cGU2U2hhZGluZyh0aGlzLCByZWFkZXIpOworICAgICAgICBwYXRjaE1lc2ggPSB0cnVlOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDoKKyAgICAgICAgZGVjb2RlVHlwZTdTaGFkaW5nKHRoaXMsIHJlYWRlcik7CisgICAgICAgIHBhdGNoTWVzaCA9IHRydWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwYXRjaE1lc2gpIHsKKyAgICAgIHVwZGF0ZUJvdW5kcyh0aGlzKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5maWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgYnVpbGRGaWd1cmVGcm9tUGF0Y2godGhpcywgaSk7CisgICAgICB9CisgICAgfQorCisgICAgdXBkYXRlQm91bmRzKHRoaXMpOworICAgIHBhY2tEYXRhKHRoaXMpOworICB9CisKKyAgTWVzaC5wcm90b3R5cGUgPSB7CisgICAgZ2V0SVI6IGZ1bmN0aW9uIE1lc2hfZ2V0SVIoKSB7CisgICAgICByZXR1cm4gWyJNZXNoIiwgdGhpcy5zaGFkaW5nVHlwZSwgdGhpcy5jb29yZHMsIHRoaXMuY29sb3JzLCB0aGlzLmZpZ3VyZXMsIHRoaXMuYm91bmRzLCB0aGlzLm1hdHJpeCwgdGhpcy5iYm94LCB0aGlzLmJhY2tncm91bmRdOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIE1lc2g7Cit9KCk7CisKK1NoYWRpbmdzLkR1bW15ID0gZnVuY3Rpb24gRHVtbXlDbG9zdXJlKCkgeworICBmdW5jdGlvbiBEdW1teSgpIHsKKyAgICB0aGlzLnR5cGUgPSAiUGF0dGVybiI7CisgIH0KKworICBEdW1teS5wcm90b3R5cGUgPSB7CisgICAgZ2V0SVI6IGZ1bmN0aW9uIER1bW15X2dldElSKCkgeworICAgICAgcmV0dXJuIFsiRHVtbXkiXTsKKyAgICB9CisgIH07CisgIHJldHVybiBEdW1teTsKK30oKTsKKworZnVuY3Rpb24gZ2V0VGlsaW5nUGF0dGVybklSKG9wZXJhdG9yTGlzdCwgZGljdCwgYXJncykgeworICB2YXIgbWF0cml4ID0gZGljdC5nZXRBcnJheSgiTWF0cml4Iik7CisKKyAgdmFyIGJib3ggPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QoZGljdC5nZXRBcnJheSgiQkJveCIpKTsKKworICB2YXIgeHN0ZXAgPSBkaWN0LmdldCgiWFN0ZXAiKTsKKyAgdmFyIHlzdGVwID0gZGljdC5nZXQoIllTdGVwIik7CisgIHZhciBwYWludFR5cGUgPSBkaWN0LmdldCgiUGFpbnRUeXBlIik7CisgIHZhciB0aWxpbmdUeXBlID0gZGljdC5nZXQoIlRpbGluZ1R5cGUiKTsKKworICBpZiAoYmJveFsyXSAtIGJib3hbMF0gPT09IDAgfHwgYmJveFszXSAtIGJib3hbMV0gPT09IDApIHsKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9CQm94IGFycmF5OiBbIi5jb25jYXQoYmJveCwgIl0uIikpOworICB9CisKKyAgcmV0dXJuIFsiVGlsaW5nUGF0dGVybiIsIGFyZ3MsIG9wZXJhdG9yTGlzdCwgbWF0cml4LCBiYm94LCB4c3RlcCwgeXN0ZXAsIHBhaW50VHlwZSwgdGlsaW5nVHlwZV07Cit9CisKKy8qKiovIH0pLAorLyogMjM3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuaXNQREZGdW5jdGlvbiA9IGlzUERGRnVuY3Rpb247CitleHBvcnRzLlBvc3RTY3JpcHRDb21waWxlciA9IGV4cG9ydHMuUG9zdFNjcmlwdEV2YWx1YXRvciA9IGV4cG9ydHMuUERGRnVuY3Rpb25GYWN0b3J5ID0gdm9pZCAwOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMik7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfcHNfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMzgpOworCit2YXIgX2ltYWdlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMjEpOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBQREZGdW5jdGlvbkZhY3RvcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZGdW5jdGlvbkZhY3RvcnkoX3JlZikgeworICAgIHZhciB4cmVmID0gX3JlZi54cmVmLAorICAgICAgICBfcmVmJGlzRXZhbFN1cHBvcnRlZCA9IF9yZWYuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmJGlzRXZhbFN1cHBvcnRlZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkaXNFdmFsU3VwcG9ydGVkOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERkZ1bmN0aW9uRmFjdG9yeSk7CisKKyAgICB0aGlzLnhyZWYgPSB4cmVmOworICAgIHRoaXMuaXNFdmFsU3VwcG9ydGVkID0gaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTsKKyAgICB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUgPSBudWxsOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERkZ1bmN0aW9uRmFjdG9yeSwgW3sKKyAgICBrZXk6ICJjcmVhdGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoZm4pIHsKKyAgICAgIHZhciBjYWNoZWRGdW5jdGlvbiA9IHRoaXMuZ2V0Q2FjaGVkKGZuKTsKKworICAgICAgaWYgKGNhY2hlZEZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBjYWNoZWRGdW5jdGlvbjsKKyAgICAgIH0KKworICAgICAgdmFyIHBhcnNlZEZ1bmN0aW9uID0gUERGRnVuY3Rpb24ucGFyc2UoeworICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCisgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgIGZuOiBmbiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZiA/IHRoaXMueHJlZi5mZXRjaChmbikgOiBmbgorICAgICAgfSk7CisKKyAgICAgIHRoaXMuX2NhY2hlKGZuLCBwYXJzZWRGdW5jdGlvbik7CisKKyAgICAgIHJldHVybiBwYXJzZWRGdW5jdGlvbjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjcmVhdGVGcm9tQXJyYXkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVGcm9tQXJyYXkoZm5PYmopIHsKKyAgICAgIHZhciBjYWNoZWRGdW5jdGlvbiA9IHRoaXMuZ2V0Q2FjaGVkKGZuT2JqKTsKKworICAgICAgaWYgKGNhY2hlZEZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBjYWNoZWRGdW5jdGlvbjsKKyAgICAgIH0KKworICAgICAgdmFyIHBhcnNlZEZ1bmN0aW9uID0gUERGRnVuY3Rpb24ucGFyc2VBcnJheSh7CisgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLmlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgZm5PYmo6IGZuT2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmID8gdGhpcy54cmVmLmZldGNoKGZuT2JqKSA6IGZuT2JqCisgICAgICB9KTsKKworICAgICAgdGhpcy5fY2FjaGUoZm5PYmosIHBhcnNlZEZ1bmN0aW9uKTsKKworICAgICAgcmV0dXJuIHBhcnNlZEZ1bmN0aW9uOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldENhY2hlZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldENhY2hlZChjYWNoZUtleSkgeworICAgICAgdmFyIGZuUmVmOworCisgICAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgZm5SZWYgPSBjYWNoZUtleTsKKyAgICAgIH0gZWxzZSBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CisgICAgICAgIGZuUmVmID0gY2FjaGVLZXkub2JqSWQ7CisgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoY2FjaGVLZXkpKSB7CisgICAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdCAmJiBjYWNoZUtleS5kaWN0Lm9iaklkOworICAgICAgfQorCisgICAgICBpZiAoZm5SZWYpIHsKKyAgICAgICAgaWYgKCF0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUpIHsKKyAgICAgICAgICB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsRnVuY3Rpb25DYWNoZSgpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvY2FsRnVuY3Rpb24gPSB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuZ2V0QnlSZWYoZm5SZWYpOworCisgICAgICAgIGlmIChsb2NhbEZ1bmN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIGxvY2FsRnVuY3Rpb247CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2NhY2hlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2NhY2hlKGNhY2hlS2V5LCBwYXJzZWRGdW5jdGlvbikgeworICAgICAgaWYgKCFwYXJzZWRGdW5jdGlvbikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BERkZ1bmN0aW9uRmFjdG9yeS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkRnVuY3Rpb24iIGFyZ3VtZW50LicpOworICAgICAgfQorCisgICAgICB2YXIgZm5SZWY7CisKKyAgICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgeworICAgICAgICBmblJlZiA9IGNhY2hlS2V5OworICAgICAgfSBlbHNlIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKKyAgICAgICAgZm5SZWYgPSBjYWNoZUtleS5vYmpJZDsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShjYWNoZUtleSkpIHsKKyAgICAgICAgZm5SZWYgPSBjYWNoZUtleS5kaWN0ICYmIGNhY2hlS2V5LmRpY3Qub2JqSWQ7CisgICAgICB9CisKKyAgICAgIGlmIChmblJlZikgeworICAgICAgICBpZiAoIXRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZSkgeworICAgICAgICAgIHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxGdW5jdGlvbkNhY2hlKCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0KG51bGwsIGZuUmVmLCBwYXJzZWRGdW5jdGlvbik7CisgICAgICB9CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERkZ1bmN0aW9uRmFjdG9yeTsKK30oKTsKKworZXhwb3J0cy5QREZGdW5jdGlvbkZhY3RvcnkgPSBQREZGdW5jdGlvbkZhY3Rvcnk7CisKK2Z1bmN0aW9uIHRvTnVtYmVyQXJyYXkoYXJyKSB7CisgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICB2YXIgbGVuZ3RoID0gYXJyLmxlbmd0aDsKKworICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgaWYgKHR5cGVvZiBhcnJbaV0gIT09ICJudW1iZXIiKSB7CisgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7CisKKyAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKKyAgICAgICAgcmVzdWx0W2pdID0gK2FycltqXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKworICByZXR1cm4gYXJyOworfQorCit2YXIgUERGRnVuY3Rpb24gPSBmdW5jdGlvbiBQREZGdW5jdGlvbkNsb3N1cmUoKSB7CisgIHZhciBDT05TVFJVQ1RfU0FNUExFRCA9IDA7CisgIHZhciBDT05TVFJVQ1RfSU5URVJQT0xBVEVEID0gMjsKKyAgdmFyIENPTlNUUlVDVF9TVElDSEVEID0gMzsKKyAgdmFyIENPTlNUUlVDVF9QT1NUU0NSSVBUID0gNDsKKyAgcmV0dXJuIHsKKyAgICBnZXRTYW1wbGVBcnJheTogZnVuY3Rpb24gZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBzdHJlYW0pIHsKKyAgICAgIHZhciBpLCBpaTsKKyAgICAgIHZhciBsZW5ndGggPSAxOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHNpemUubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBsZW5ndGggKj0gc2l6ZVtpXTsKKyAgICAgIH0KKworICAgICAgbGVuZ3RoICo9IG91dHB1dFNpemU7CisgICAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKyAgICAgIHZhciBjb2RlU2l6ZSA9IDA7CisgICAgICB2YXIgY29kZUJ1ZiA9IDA7CisgICAgICB2YXIgc2FtcGxlTXVsID0gMS4wIC8gKE1hdGgucG93KDIuMCwgYnBzKSAtIDEpOworICAgICAgdmFyIHN0ckJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKChsZW5ndGggKiBicHMgKyA3KSAvIDgpOworICAgICAgdmFyIHN0cklkeCA9IDA7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICB3aGlsZSAoY29kZVNpemUgPCBicHMpIHsKKyAgICAgICAgICBjb2RlQnVmIDw8PSA4OworICAgICAgICAgIGNvZGVCdWYgfD0gc3RyQnl0ZXNbc3RySWR4KytdOworICAgICAgICAgIGNvZGVTaXplICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBjb2RlU2l6ZSAtPSBicHM7CisgICAgICAgIGFycmF5W2ldID0gKGNvZGVCdWYgPj4gY29kZVNpemUpICogc2FtcGxlTXVsOworICAgICAgICBjb2RlQnVmICY9ICgxIDw8IGNvZGVTaXplKSAtIDE7CisgICAgICB9CisKKyAgICAgIHJldHVybiBhcnJheTsKKyAgICB9LAorICAgIGdldElSOiBmdW5jdGlvbiBnZXRJUihfcmVmMikgeworICAgICAgdmFyIHhyZWYgPSBfcmVmMi54cmVmLAorICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCA9IF9yZWYyLmlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICBmbiA9IF9yZWYyLmZuOworICAgICAgdmFyIGRpY3QgPSBmbi5kaWN0OworCisgICAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgZGljdCA9IGZuOworICAgICAgfQorCisgICAgICB2YXIgdHlwZXMgPSBbdGhpcy5jb25zdHJ1Y3RTYW1wbGVkLCBudWxsLCB0aGlzLmNvbnN0cnVjdEludGVycG9sYXRlZCwgdGhpcy5jb25zdHJ1Y3RTdGljaGVkLCB0aGlzLmNvbnN0cnVjdFBvc3RTY3JpcHRdOworICAgICAgdmFyIHR5cGVOdW0gPSBkaWN0LmdldCgiRnVuY3Rpb25UeXBlIik7CisgICAgICB2YXIgdHlwZUZuID0gdHlwZXNbdHlwZU51bV07CisKKyAgICAgIGlmICghdHlwZUZuKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlIG9mIGZ1bmN0aW9uIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0eXBlRm4uY2FsbCh0aGlzLCB7CisgICAgICAgIHhyZWY6IHhyZWYsCisgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICBmbjogZm4sCisgICAgICAgIGRpY3Q6IGRpY3QKKyAgICAgIH0pOworICAgIH0sCisgICAgZnJvbUlSOiBmdW5jdGlvbiBmcm9tSVIoX3JlZjMpIHsKKyAgICAgIHZhciB4cmVmID0gX3JlZjMueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmMy5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgSVIgPSBfcmVmMy5JUjsKKyAgICAgIHZhciB0eXBlID0gSVJbMF07CisKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIENPTlNUUlVDVF9TQU1QTEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWRGcm9tSVIoeworICAgICAgICAgICAgeHJlZjogeHJlZiwKKyAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgICAgSVI6IElSCisgICAgICAgICAgfSk7CisKKyAgICAgICAgY2FzZSBDT05TVFJVQ1RfSU5URVJQT0xBVEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUih7CisgICAgICAgICAgICB4cmVmOiB4cmVmLAorICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgICBJUjogSVIKKyAgICAgICAgICB9KTsKKworICAgICAgICBjYXNlIENPTlNUUlVDVF9TVElDSEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFN0aWNoZWRGcm9tSVIoeworICAgICAgICAgICAgeHJlZjogeHJlZiwKKyAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgICAgSVI6IElSCisgICAgICAgICAgfSk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSKHsKKyAgICAgICAgICAgIHhyZWY6IHhyZWYsCisgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICAgIElSOiBJUgorICAgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisgICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKF9yZWY0KSB7CisgICAgICB2YXIgeHJlZiA9IF9yZWY0LnhyZWYsCisgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkID0gX3JlZjQuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIGZuID0gX3JlZjQuZm47CisgICAgICB2YXIgSVIgPSB0aGlzLmdldElSKHsKKyAgICAgICAgeHJlZjogeHJlZiwKKyAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgIGZuOiBmbgorICAgICAgfSk7CisgICAgICByZXR1cm4gdGhpcy5mcm9tSVIoeworICAgICAgICB4cmVmOiB4cmVmLAorICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgSVI6IElSCisgICAgICB9KTsKKyAgICB9LAorICAgIHBhcnNlQXJyYXk6IGZ1bmN0aW9uIHBhcnNlQXJyYXkoX3JlZjUpIHsKKyAgICAgIHZhciB4cmVmID0gX3JlZjUueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmNS5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgZm5PYmogPSBfcmVmNS5mbk9iajsKKworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZuT2JqKSkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXJzZSh7CisgICAgICAgICAgeHJlZjogeHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICBmbjogZm5PYmoKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHZhciBmbkFycmF5ID0gW107CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGZuT2JqLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgZm5BcnJheS5wdXNoKHRoaXMucGFyc2UoeworICAgICAgICAgIHhyZWY6IHhyZWYsCisgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgZm46IHhyZWYuZmV0Y2hJZlJlZihmbk9ialtqXSkKKyAgICAgICAgfSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gZnVuY3Rpb24gKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGZuQXJyYXlbaV0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQgKyBpKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9LAorICAgIGNvbnN0cnVjdFNhbXBsZWQ6IGZ1bmN0aW9uIGNvbnN0cnVjdFNhbXBsZWQoX3JlZjYpIHsKKyAgICAgIHZhciB4cmVmID0gX3JlZjYueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmNi5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgZm4gPSBfcmVmNi5mbiwKKyAgICAgICAgICBkaWN0ID0gX3JlZjYuZGljdDsKKworICAgICAgZnVuY3Rpb24gdG9NdWx0aUFycmF5KGFycikgeworICAgICAgICB2YXIgaW5wdXRMZW5ndGggPSBhcnIubGVuZ3RoOworICAgICAgICB2YXIgb3V0ID0gW107CisgICAgICAgIHZhciBpbmRleCA9IDA7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgb3V0W2luZGV4XSA9IFthcnJbaV0sIGFycltpICsgMV1dOworICAgICAgICAgICsraW5kZXg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3V0OworICAgICAgfQorCisgICAgICB2YXIgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CisgICAgICB2YXIgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOworCisgICAgICBpZiAoIWRvbWFpbiB8fCAhcmFuZ2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBkb21haW4gb3IgcmFuZ2UiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggLyAyOworICAgICAgdmFyIG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggLyAyOworICAgICAgZG9tYWluID0gdG9NdWx0aUFycmF5KGRvbWFpbik7CisgICAgICByYW5nZSA9IHRvTXVsdGlBcnJheShyYW5nZSk7CisgICAgICB2YXIgc2l6ZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiU2l6ZSIpKTsKKyAgICAgIHZhciBicHMgPSBkaWN0LmdldCgiQml0c1BlclNhbXBsZSIpOworICAgICAgdmFyIG9yZGVyID0gZGljdC5nZXQoIk9yZGVyIikgfHwgMTsKKworICAgICAgaWYgKG9yZGVyICE9PSAxKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiTm8gc3VwcG9ydCBmb3IgY3ViaWMgc3BsaW5lIGludGVycG9sYXRpb246ICIgKyBvcmRlcik7CisgICAgICB9CisKKyAgICAgIHZhciBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKKworICAgICAgaWYgKCFlbmNvZGUpIHsKKyAgICAgICAgZW5jb2RlID0gW107CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dFNpemU7ICsraSkgeworICAgICAgICAgIGVuY29kZS5wdXNoKFswLCBzaXplW2ldIC0gMV0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBlbmNvZGUgPSB0b011bHRpQXJyYXkoZW5jb2RlKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRGVjb2RlIikpOworCisgICAgICBpZiAoIWRlY29kZSkgeworICAgICAgICBkZWNvZGUgPSByYW5nZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlY29kZSA9IHRvTXVsdGlBcnJheShkZWNvZGUpOworICAgICAgfQorCisgICAgICB2YXIgc2FtcGxlcyA9IHRoaXMuZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBmbik7CisgICAgICByZXR1cm4gW0NPTlNUUlVDVF9TQU1QTEVELCBpbnB1dFNpemUsIGRvbWFpbiwgZW5jb2RlLCBkZWNvZGUsIHNhbXBsZXMsIHNpemUsIG91dHB1dFNpemUsIE1hdGgucG93KDIsIGJwcykgLSAxLCByYW5nZV07CisgICAgfSwKKyAgICBjb25zdHJ1Y3RTYW1wbGVkRnJvbUlSOiBmdW5jdGlvbiBjb25zdHJ1Y3RTYW1wbGVkRnJvbUlSKF9yZWY3KSB7CisgICAgICB2YXIgeHJlZiA9IF9yZWY3LnhyZWYsCisgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkID0gX3JlZjcuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIElSID0gX3JlZjcuSVI7CisKKyAgICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKHgsIHhtaW4sIHhtYXgsIHltaW4sIHltYXgpIHsKKyAgICAgICAgcmV0dXJuIHltaW4gKyAoeCAtIHhtaW4pICogKCh5bWF4IC0geW1pbikgLyAoeG1heCAtIHhtaW4pKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFNhbXBsZWRGcm9tSVJSZXN1bHQoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgICAgdmFyIG0gPSBJUlsxXTsKKyAgICAgICAgdmFyIGRvbWFpbiA9IElSWzJdOworICAgICAgICB2YXIgZW5jb2RlID0gSVJbM107CisgICAgICAgIHZhciBkZWNvZGUgPSBJUls0XTsKKyAgICAgICAgdmFyIHNhbXBsZXMgPSBJUls1XTsKKyAgICAgICAgdmFyIHNpemUgPSBJUls2XTsKKyAgICAgICAgdmFyIG4gPSBJUls3XTsKKyAgICAgICAgdmFyIHJhbmdlID0gSVJbOV07CisgICAgICAgIHZhciBjdWJlVmVydGljZXMgPSAxIDw8IG07CisgICAgICAgIHZhciBjdWJlTiA9IG5ldyBGbG9hdDY0QXJyYXkoY3ViZVZlcnRpY2VzKTsKKyAgICAgICAgdmFyIGN1YmVWZXJ0ZXggPSBuZXcgVWludDMyQXJyYXkoY3ViZVZlcnRpY2VzKTsKKyAgICAgICAgdmFyIGksIGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1YmVWZXJ0aWNlczsgaisrKSB7CisgICAgICAgICAgY3ViZU5bal0gPSAxOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGsgPSBuLAorICAgICAgICAgICAgcG9zID0gMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CisgICAgICAgICAgdmFyIGRvbWFpbl8yaSA9IGRvbWFpbltpXVswXTsKKyAgICAgICAgICB2YXIgZG9tYWluXzJpXzEgPSBkb21haW5baV1bMV07CisgICAgICAgICAgdmFyIHhpID0gTWF0aC5taW4oTWF0aC5tYXgoc3JjW3NyY09mZnNldCArIGldLCBkb21haW5fMmkpLCBkb21haW5fMmlfMSk7CisgICAgICAgICAgdmFyIGUgPSBpbnRlcnBvbGF0ZSh4aSwgZG9tYWluXzJpLCBkb21haW5fMmlfMSwgZW5jb2RlW2ldWzBdLCBlbmNvZGVbaV1bMV0pOworICAgICAgICAgIHZhciBzaXplX2kgPSBzaXplW2ldOworICAgICAgICAgIGUgPSBNYXRoLm1pbihNYXRoLm1heChlLCAwKSwgc2l6ZV9pIC0gMSk7CisgICAgICAgICAgdmFyIGUwID0gZSA8IHNpemVfaSAtIDEgPyBNYXRoLmZsb29yKGUpIDogZSAtIDE7CisgICAgICAgICAgdmFyIG4wID0gZTAgKyAxIC0gZTsKKyAgICAgICAgICB2YXIgbjEgPSBlIC0gZTA7CisgICAgICAgICAgdmFyIG9mZnNldDAgPSBlMCAqIGs7CisgICAgICAgICAgdmFyIG9mZnNldDEgPSBvZmZzZXQwICsgazsKKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWJlVmVydGljZXM7IGorKykgeworICAgICAgICAgICAgaWYgKGogJiBwb3MpIHsKKyAgICAgICAgICAgICAgY3ViZU5bal0gKj0gbjE7CisgICAgICAgICAgICAgIGN1YmVWZXJ0ZXhbal0gKz0gb2Zmc2V0MTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGN1YmVOW2pdICo9IG4wOworICAgICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgayAqPSBzaXplX2k7CisgICAgICAgICAgcG9zIDw8PSAxOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgIHZhciByaiA9IDA7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3ViZVZlcnRpY2VzOyBpKyspIHsKKyAgICAgICAgICAgIHJqICs9IHNhbXBsZXNbY3ViZVZlcnRleFtpXSArIGpdICogY3ViZU5baV07CisgICAgICAgICAgfQorCisgICAgICAgICAgcmogPSBpbnRlcnBvbGF0ZShyaiwgMCwgMSwgZGVjb2RlW2pdWzBdLCBkZWNvZGVbal1bMV0pOworICAgICAgICAgIGRlc3RbZGVzdE9mZnNldCArIGpdID0gTWF0aC5taW4oTWF0aC5tYXgocmosIHJhbmdlW2pdWzBdKSwgcmFuZ2Vbal1bMV0pOworICAgICAgICB9CisgICAgICB9OworICAgIH0sCisgICAgY29uc3RydWN0SW50ZXJwb2xhdGVkOiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoX3JlZjgpIHsKKyAgICAgIHZhciB4cmVmID0gX3JlZjgueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmOC5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgZm4gPSBfcmVmOC5mbiwKKyAgICAgICAgICBkaWN0ID0gX3JlZjguZGljdDsKKyAgICAgIHZhciBjMCA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiQzAiKSkgfHwgWzBdOworICAgICAgdmFyIGMxID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJDMSIpKSB8fCBbMV07CisgICAgICB2YXIgbiA9IGRpY3QuZ2V0KCJOIik7CisgICAgICB2YXIgbGVuZ3RoID0gYzAubGVuZ3RoOworICAgICAgdmFyIGRpZmYgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBkaWZmLnB1c2goYzFbaV0gLSBjMFtpXSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBbQ09OU1RSVUNUX0lOVEVSUE9MQVRFRCwgYzAsIGRpZmYsIG5dOworICAgIH0sCisgICAgY29uc3RydWN0SW50ZXJwb2xhdGVkRnJvbUlSOiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVIoX3JlZjkpIHsKKyAgICAgIHZhciB4cmVmID0gX3JlZjkueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmOS5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgSVIgPSBfcmVmOS5JUjsKKyAgICAgIHZhciBjMCA9IElSWzFdOworICAgICAgdmFyIGRpZmYgPSBJUlsyXTsKKyAgICAgIHZhciBuID0gSVJbM107CisgICAgICB2YXIgbGVuZ3RoID0gZGlmZi5sZW5ndGg7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0SW50ZXJwb2xhdGVkRnJvbUlSUmVzdWx0KHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICAgIHZhciB4ID0gbiA9PT0gMSA/IHNyY1tzcmNPZmZzZXRdIDogTWF0aC5wb3coc3JjW3NyY09mZnNldF0sIG4pOworCisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKKyAgICAgICAgICBkZXN0W2Rlc3RPZmZzZXQgKyBqXSA9IGMwW2pdICsgeCAqIGRpZmZbal07CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfSwKKyAgICBjb25zdHJ1Y3RTdGljaGVkOiBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkKF9yZWYxMCkgeworICAgICAgdmFyIHhyZWYgPSBfcmVmMTAueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmMTAuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIGZuID0gX3JlZjEwLmZuLAorICAgICAgICAgIGRpY3QgPSBfcmVmMTAuZGljdDsKKyAgICAgIHZhciBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKKworICAgICAgaWYgKCFkb21haW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBkb21haW4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggLyAyOworCisgICAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGRvbWFpbiBmb3Igc3RpY2hlZCBmdW5jdGlvbiIpOworICAgICAgfQorCisgICAgICB2YXIgZm5SZWZzID0gZGljdC5nZXQoIkZ1bmN0aW9ucyIpOworICAgICAgdmFyIGZucyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmblJlZnMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICBmbnMucHVzaCh0aGlzLnBhcnNlKHsKKyAgICAgICAgICB4cmVmOiB4cmVmLAorICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIGZuOiB4cmVmLmZldGNoSWZSZWYoZm5SZWZzW2ldKQorICAgICAgICB9KSk7CisgICAgICB9CisKKyAgICAgIHZhciBib3VuZHMgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkJvdW5kcyIpKTsKKyAgICAgIHZhciBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKKyAgICAgIHJldHVybiBbQ09OU1RSVUNUX1NUSUNIRUQsIGRvbWFpbiwgYm91bmRzLCBlbmNvZGUsIGZuc107CisgICAgfSwKKyAgICBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSOiBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSKF9yZWYxMSkgeworICAgICAgdmFyIHhyZWYgPSBfcmVmMTEueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmMTEuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIElSID0gX3JlZjExLklSOworICAgICAgdmFyIGRvbWFpbiA9IElSWzFdOworICAgICAgdmFyIGJvdW5kcyA9IElSWzJdOworICAgICAgdmFyIGVuY29kZSA9IElSWzNdOworICAgICAgdmFyIGZucyA9IElSWzRdOworICAgICAgdmFyIHRtcEJ1ZiA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0U3RpY2hlZEZyb21JUlJlc3VsdChzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgICB2YXIgY2xpcCA9IGZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGcm9tSVJDbGlwKHYsIG1pbiwgbWF4KSB7CisgICAgICAgICAgaWYgKHYgPiBtYXgpIHsKKyAgICAgICAgICAgIHYgPSBtYXg7CisgICAgICAgICAgfSBlbHNlIGlmICh2IDwgbWluKSB7CisgICAgICAgICAgICB2ID0gbWluOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9OworCisgICAgICAgIHZhciB2ID0gY2xpcChzcmNbc3JjT2Zmc2V0XSwgZG9tYWluWzBdLCBkb21haW5bMV0pOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJvdW5kcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgaWYgKHYgPCBib3VuZHNbaV0pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciBkbWluID0gZG9tYWluWzBdOworCisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgIGRtaW4gPSBib3VuZHNbaSAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRtYXggPSBkb21haW5bMV07CisKKyAgICAgICAgaWYgKGkgPCBib3VuZHMubGVuZ3RoKSB7CisgICAgICAgICAgZG1heCA9IGJvdW5kc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBybWluID0gZW5jb2RlWzIgKiBpXTsKKyAgICAgICAgdmFyIHJtYXggPSBlbmNvZGVbMiAqIGkgKyAxXTsKKyAgICAgICAgdG1wQnVmWzBdID0gZG1pbiA9PT0gZG1heCA/IHJtaW4gOiBybWluICsgKHYgLSBkbWluKSAqIChybWF4IC0gcm1pbikgLyAoZG1heCAtIGRtaW4pOworICAgICAgICBmbnNbaV0odG1wQnVmLCAwLCBkZXN0LCBkZXN0T2Zmc2V0KTsKKyAgICAgIH07CisgICAgfSwKKyAgICBjb25zdHJ1Y3RQb3N0U2NyaXB0OiBmdW5jdGlvbiBjb25zdHJ1Y3RQb3N0U2NyaXB0KF9yZWYxMikgeworICAgICAgdmFyIHhyZWYgPSBfcmVmMTIueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmMTIuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIGZuID0gX3JlZjEyLmZuLAorICAgICAgICAgIGRpY3QgPSBfcmVmMTIuZGljdDsKKyAgICAgIHZhciBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKKyAgICAgIHZhciByYW5nZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiUmFuZ2UiKSk7CisKKyAgICAgIGlmICghZG9tYWluKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm8gZG9tYWluLiIpOworICAgICAgfQorCisgICAgICBpZiAoIXJhbmdlKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm8gcmFuZ2UuIik7CisgICAgICB9CisKKyAgICAgIHZhciBsZXhlciA9IG5ldyBfcHNfcGFyc2VyLlBvc3RTY3JpcHRMZXhlcihmbik7CisgICAgICB2YXIgcGFyc2VyID0gbmV3IF9wc19wYXJzZXIuUG9zdFNjcmlwdFBhcnNlcihsZXhlcik7CisgICAgICB2YXIgY29kZSA9IHBhcnNlci5wYXJzZSgpOworICAgICAgcmV0dXJuIFtDT05TVFJVQ1RfUE9TVFNDUklQVCwgZG9tYWluLCByYW5nZSwgY29kZV07CisgICAgfSwKKyAgICBjb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSOiBmdW5jdGlvbiBjb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSKF9yZWYxMykgeworICAgICAgdmFyIHhyZWYgPSBfcmVmMTMueHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQgPSBfcmVmMTMuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIElSID0gX3JlZjEzLklSOworICAgICAgdmFyIGRvbWFpbiA9IElSWzFdOworICAgICAgdmFyIHJhbmdlID0gSVJbMl07CisgICAgICB2YXIgY29kZSA9IElSWzNdOworCisgICAgICBpZiAoaXNFdmFsU3VwcG9ydGVkICYmIF91dGlsLklzRXZhbFN1cHBvcnRlZENhY2hlZC52YWx1ZSkgeworICAgICAgICB2YXIgY29tcGlsZWQgPSBuZXcgUG9zdFNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKTsKKworICAgICAgICBpZiAoY29tcGlsZWQpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJzcmMiLCAic3JjT2Zmc2V0IiwgImRlc3QiLCAiZGVzdE9mZnNldCIsIGNvbXBpbGVkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7CisgICAgICB2YXIgbnVtT3V0cHV0cyA9IHJhbmdlLmxlbmd0aCA+PiAxOworICAgICAgdmFyIG51bUlucHV0cyA9IGRvbWFpbi5sZW5ndGggPj4gMTsKKyAgICAgIHZhciBldmFsdWF0b3IgPSBuZXcgUG9zdFNjcmlwdEV2YWx1YXRvcihjb2RlKTsKKyAgICAgIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB2YXIgTUFYX0NBQ0hFX1NJWkUgPSAyMDQ4ICogNDsKKyAgICAgIHZhciBjYWNoZV9hdmFpbGFibGUgPSBNQVhfQ0FDSEVfU0laRTsKKyAgICAgIHZhciB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUlucHV0cyk7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUlJlc3VsdChzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgICB2YXIgaSwgdmFsdWU7CisgICAgICAgIHZhciBrZXkgPSAiIjsKKyAgICAgICAgdmFyIGlucHV0ID0gdG1wQnVmOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1JbnB1dHM7IGkrKykgeworICAgICAgICAgIHZhbHVlID0gc3JjW3NyY09mZnNldCArIGldOworICAgICAgICAgIGlucHV0W2ldID0gdmFsdWU7CisgICAgICAgICAga2V5ICs9IHZhbHVlICsgIl8iOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gY2FjaGVba2V5XTsKKworICAgICAgICBpZiAoY2FjaGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGRlc3Quc2V0KGNhY2hlZFZhbHVlLCBkZXN0T2Zmc2V0KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShudW1PdXRwdXRzKTsKKyAgICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdG9yLmV4ZWN1dGUoaW5wdXQpOworICAgICAgICB2YXIgc3RhY2tJbmRleCA9IHN0YWNrLmxlbmd0aCAtIG51bU91dHB1dHM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU91dHB1dHM7IGkrKykgeworICAgICAgICAgIHZhbHVlID0gc3RhY2tbc3RhY2tJbmRleCArIGldOworICAgICAgICAgIHZhciBib3VuZCA9IHJhbmdlW2kgKiAyXTsKKworICAgICAgICAgIGlmICh2YWx1ZSA8IGJvdW5kKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGJvdW5kOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib3VuZCA9IHJhbmdlW2kgKiAyICsgMV07CisKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IGJvdW5kKSB7CisgICAgICAgICAgICAgIHZhbHVlID0gYm91bmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgb3V0cHV0W2ldID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FjaGVfYXZhaWxhYmxlID4gMCkgeworICAgICAgICAgIGNhY2hlX2F2YWlsYWJsZS0tOworICAgICAgICAgIGNhY2hlW2tleV0gPSBvdXRwdXQ7CisgICAgICAgIH0KKworICAgICAgICBkZXN0LnNldChvdXRwdXQsIGRlc3RPZmZzZXQpOworICAgICAgfTsKKyAgICB9CisgIH07Cit9KCk7CisKK2Z1bmN0aW9uIGlzUERGRnVuY3Rpb24odikgeworICB2YXIgZm5EaWN0OworCisgIGlmIChfdHlwZW9mKHYpICE9PSAib2JqZWN0IikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh2KSkgeworICAgIGZuRGljdCA9IHY7CisgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh2KSkgeworICAgIGZuRGljdCA9IHYuZGljdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gZm5EaWN0LmhhcygiRnVuY3Rpb25UeXBlIik7Cit9CisKK3ZhciBQb3N0U2NyaXB0U3RhY2sgPSBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tDbG9zdXJlKCkgeworICB2YXIgTUFYX1NUQUNLX1NJWkUgPSAxMDA7CisKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrKGluaXRpYWxTdGFjaykgeworICAgIHRoaXMuc3RhY2sgPSAhaW5pdGlhbFN0YWNrID8gW10gOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpbml0aWFsU3RhY2ssIDApOworICB9CisKKyAgUG9zdFNjcmlwdFN0YWNrLnByb3RvdHlwZSA9IHsKKyAgICBwdXNoOiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcHVzaCh2YWx1ZSkgeworICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID49IE1BWF9TVEFDS19TSVpFKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy4iKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKKyAgICB9LAorICAgIHBvcDogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX3BvcCgpIHsKKyAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayB1bmRlcmZsb3cuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpOworICAgIH0sCisgICAgY29weTogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX2NvcHkobikgeworICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoICsgbiA+PSBNQVhfU1RBQ0tfU0laRSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7CisgICAgICB9CisKKyAgICAgIHZhciBzdGFjayA9IHRoaXMuc3RhY2s7CisKKyAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSBuLCBqID0gbiAtIDE7IGogPj0gMDsgai0tLCBpKyspIHsKKyAgICAgICAgc3RhY2sucHVzaChzdGFja1tpXSk7CisgICAgICB9CisgICAgfSwKKyAgICBpbmRleDogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX2luZGV4KG4pIHsKKyAgICAgIHRoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbiAtIDFdKTsKKyAgICB9LAorICAgIHJvbGw6IGZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19yb2xsKG4sIHApIHsKKyAgICAgIHZhciBzdGFjayA9IHRoaXMuc3RhY2s7CisgICAgICB2YXIgbCA9IHN0YWNrLmxlbmd0aCAtIG47CisgICAgICB2YXIgciA9IHN0YWNrLmxlbmd0aCAtIDEsCisgICAgICAgICAgYyA9IGwgKyAocCAtIE1hdGguZmxvb3IocCAvIG4pICogbiksCisgICAgICAgICAgaSwKKyAgICAgICAgICBqLAorICAgICAgICAgIHQ7CisKKyAgICAgIGZvciAoaSA9IGwsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHsKKyAgICAgICAgdCA9IHN0YWNrW2ldOworICAgICAgICBzdGFja1tpXSA9IHN0YWNrW2pdOworICAgICAgICBzdGFja1tqXSA9IHQ7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IGwsIGogPSBjIC0gMTsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgICAgIHQgPSBzdGFja1tpXTsKKyAgICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKKyAgICAgICAgc3RhY2tbal0gPSB0OworICAgICAgfQorCisgICAgICBmb3IgKGkgPSBjLCBqID0gcjsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgICAgIHQgPSBzdGFja1tpXTsKKyAgICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKKyAgICAgICAgc3RhY2tbal0gPSB0OworICAgICAgfQorICAgIH0KKyAgfTsKKyAgcmV0dXJuIFBvc3RTY3JpcHRTdGFjazsKK30oKTsKKwordmFyIFBvc3RTY3JpcHRFdmFsdWF0b3IgPSBmdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdEV2YWx1YXRvcihvcGVyYXRvcnMpIHsKKyAgICB0aGlzLm9wZXJhdG9ycyA9IG9wZXJhdG9yczsKKyAgfQorCisgIFBvc3RTY3JpcHRFdmFsdWF0b3IucHJvdG90eXBlID0geworICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIFBvc3RTY3JpcHRFdmFsdWF0b3JfZXhlY3V0ZShpbml0aWFsU3RhY2spIHsKKyAgICAgIHZhciBzdGFjayA9IG5ldyBQb3N0U2NyaXB0U3RhY2soaW5pdGlhbFN0YWNrKTsKKyAgICAgIHZhciBjb3VudGVyID0gMDsKKyAgICAgIHZhciBvcGVyYXRvcnMgPSB0aGlzLm9wZXJhdG9yczsKKyAgICAgIHZhciBsZW5ndGggPSBvcGVyYXRvcnMubGVuZ3RoOworICAgICAgdmFyIG9wZXJhdG9yLCBhLCBiOworCisgICAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgeworICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9yc1tjb3VudGVyKytdOworCisgICAgICAgIGlmICh0eXBlb2Ygb3BlcmF0b3IgPT09ICJudW1iZXIiKSB7CisgICAgICAgICAgc3RhY2sucHVzaChvcGVyYXRvcik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7CisgICAgICAgICAgY2FzZSAianoiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAoIWEpIHsKKyAgICAgICAgICAgICAgY291bnRlciA9IGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiaiI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBjb3VudGVyID0gYTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiYWJzIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hYnMoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJhZGQiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhICsgYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImFuZCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShhKSAmJiAoMCwgX3V0aWwuaXNCb29sKShiKSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgJiYgYik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgJiBiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJhdGFuIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hdGFuKGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiYml0c2hpZnQiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAoYSA+IDApIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhIDw8IGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhID4+IGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImNlaWxpbmciOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmNlaWwoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJjb3B5IjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLmNvcHkoYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImNvcyI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY29zKGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiY3ZpIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKSB8IDA7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJjdnIiOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJkaXYiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIC8gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImR1cCI6CisgICAgICAgICAgICBzdGFjay5jb3B5KDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJlcSI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgPT09IGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJleGNoIjoKKyAgICAgICAgICAgIHN0YWNrLnJvbGwoMiwgMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImV4cCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGgucG93KGEsIGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiZmFsc2UiOgorICAgICAgICAgICAgc3RhY2sucHVzaChmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImZsb29yIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5mbG9vcihhKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImdlIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSA+PSBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiZ3QiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhID4gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImlkaXYiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIC8gYiB8IDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJpbmRleCI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5pbmRleChhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibGUiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIDw9IGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJsbiI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nKGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibG9nIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5sb2coYSkgLyBNYXRoLkxOMTApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJsdCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgPCBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibW9kIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSAlIGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJtdWwiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhICogYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm5lIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSAhPT0gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm5lZyI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKC1hKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibm90IjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc0Jvb2wpKGEpKSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goIWEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaCh+YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAib3IiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAoKDAsIF91dGlsLmlzQm9vbCkoYSkgJiYgKDAsIF91dGlsLmlzQm9vbCkoYikpIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhIHx8IGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhIHwgYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAicG9wIjoKKyAgICAgICAgICAgIHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJyb2xsIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnJvbGwoYSwgYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInJvdW5kIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5yb3VuZChhKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInNpbiI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc2luKGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAic3FydCI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc3FydChhKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInN1YiI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgLSBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAidHJ1ZSI6CisgICAgICAgICAgICBzdGFjay5wdXNoKHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJ0cnVuY2F0ZSI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gYSA8IDAgPyBNYXRoLmNlaWwoYSkgOiBNYXRoLmZsb29yKGEpOworICAgICAgICAgICAgc3RhY2sucHVzaChhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAieG9yIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc0Jvb2wpKGEpICYmICgwLCBfdXRpbC5pc0Jvb2wpKGIpKSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAhPT0gYik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgXiBiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIG9wZXJhdG9yICIuY29uY2F0KG9wZXJhdG9yKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHN0YWNrLnN0YWNrOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIFBvc3RTY3JpcHRFdmFsdWF0b3I7Cit9KCk7CisKK2V4cG9ydHMuUG9zdFNjcmlwdEV2YWx1YXRvciA9IFBvc3RTY3JpcHRFdmFsdWF0b3I7CisKK3ZhciBQb3N0U2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlvbiBQb3N0U2NyaXB0Q29tcGlsZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiBBc3ROb2RlKHR5cGUpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICB9CisKKyAgQXN0Tm9kZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoImFic3RyYWN0IG1ldGhvZCIpOworICB9OworCisgIGZ1bmN0aW9uIEFzdEFyZ3VtZW50KGluZGV4LCBtaW4sIG1heCkgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAiYXJncyIpOworICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICB0aGlzLm1pbiA9IG1pbjsKKyAgICB0aGlzLm1heCA9IG1heDsKKyAgfQorCisgIEFzdEFyZ3VtZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpOworCisgIEFzdEFyZ3VtZW50LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdEFyZ3VtZW50KHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIEFzdExpdGVyYWwobnVtYmVyKSB7CisgICAgQXN0Tm9kZS5jYWxsKHRoaXMsICJsaXRlcmFsIik7CisgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgdGhpcy5taW4gPSBudW1iZXI7CisgICAgdGhpcy5tYXggPSBudW1iZXI7CisgIH0KKworICBBc3RMaXRlcmFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpOworCisgIEFzdExpdGVyYWwucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICB2aXNpdG9yLnZpc2l0TGl0ZXJhbCh0aGlzKTsKKyAgfTsKKworICBmdW5jdGlvbiBBc3RCaW5hcnlPcGVyYXRpb24ob3AsIGFyZzEsIGFyZzIsIG1pbiwgbWF4KSB7CisgICAgQXN0Tm9kZS5jYWxsKHRoaXMsICJiaW5hcnkiKTsKKyAgICB0aGlzLm9wID0gb3A7CisgICAgdGhpcy5hcmcxID0gYXJnMTsKKyAgICB0aGlzLmFyZzIgPSBhcmcyOworICAgIHRoaXMubWluID0gbWluOworICAgIHRoaXMubWF4ID0gbWF4OworICB9CisKKyAgQXN0QmluYXJ5T3BlcmF0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpOworCisgIEFzdEJpbmFyeU9wZXJhdGlvbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXRCaW5hcnlPcGVyYXRpb24odGhpcyk7CisgIH07CisKKyAgZnVuY3Rpb24gQXN0TWluKGFyZywgbWF4KSB7CisgICAgQXN0Tm9kZS5jYWxsKHRoaXMsICJtYXgiKTsKKyAgICB0aGlzLmFyZyA9IGFyZzsKKyAgICB0aGlzLm1pbiA9IGFyZy5taW47CisgICAgdGhpcy5tYXggPSBtYXg7CisgIH0KKworICBBc3RNaW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBc3ROb2RlLnByb3RvdHlwZSk7CisKKyAgQXN0TWluLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdE1pbih0aGlzKTsKKyAgfTsKKworICBmdW5jdGlvbiBBc3RWYXJpYWJsZShpbmRleCwgbWluLCBtYXgpIHsKKyAgICBBc3ROb2RlLmNhbGwodGhpcywgInZhciIpOworICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICB0aGlzLm1pbiA9IG1pbjsKKyAgICB0aGlzLm1heCA9IG1heDsKKyAgfQorCisgIEFzdFZhcmlhYmxlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpOworCisgIEFzdFZhcmlhYmxlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdFZhcmlhYmxlKHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIEFzdFZhcmlhYmxlRGVmaW5pdGlvbih2YXJpYWJsZSwgYXJnKSB7CisgICAgQXN0Tm9kZS5jYWxsKHRoaXMsICJkZWZpbml0aW9uIik7CisgICAgdGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlOworICAgIHRoaXMuYXJnID0gYXJnOworICB9CisKKyAgQXN0VmFyaWFibGVEZWZpbml0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpOworCisgIEFzdFZhcmlhYmxlRGVmaW5pdGlvbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZURlZmluaXRpb24odGhpcyk7CisgIH07CisKKyAgZnVuY3Rpb24gRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yKCkgeworICAgIHRoaXMucGFydHMgPSBbXTsKKyAgfQorCisgIEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvci5wcm90b3R5cGUgPSB7CisgICAgdmlzaXRBcmd1bWVudDogZnVuY3Rpb24gdmlzaXRBcmd1bWVudChhcmcpIHsKKyAgICAgIHRoaXMucGFydHMucHVzaCgiTWF0aC5tYXgoIiwgYXJnLm1pbiwgIiwgTWF0aC5taW4oIiwgYXJnLm1heCwgIiwgc3JjW3NyY09mZnNldCArICIsIGFyZy5pbmRleCwgIl0pKSIpOworICAgIH0sCisgICAgdmlzaXRWYXJpYWJsZTogZnVuY3Rpb24gdmlzaXRWYXJpYWJsZSh2YXJpYWJsZSkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCJ2IiwgdmFyaWFibGUuaW5kZXgpOworICAgIH0sCisgICAgdmlzaXRMaXRlcmFsOiBmdW5jdGlvbiB2aXNpdExpdGVyYWwobGl0ZXJhbCkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKGxpdGVyYWwubnVtYmVyKTsKKyAgICB9LAorICAgIHZpc2l0QmluYXJ5T3BlcmF0aW9uOiBmdW5jdGlvbiB2aXNpdEJpbmFyeU9wZXJhdGlvbihvcGVyYXRpb24pIHsKKyAgICAgIHRoaXMucGFydHMucHVzaCgiKCIpOworICAgICAgb3BlcmF0aW9uLmFyZzEudmlzaXQodGhpcyk7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIiAiLCBvcGVyYXRpb24ub3AsICIgIik7CisgICAgICBvcGVyYXRpb24uYXJnMi52aXNpdCh0aGlzKTsKKyAgICAgIHRoaXMucGFydHMucHVzaCgiKSIpOworICAgIH0sCisgICAgdmlzaXRWYXJpYWJsZURlZmluaXRpb246IGZ1bmN0aW9uIHZpc2l0VmFyaWFibGVEZWZpbml0aW9uKGRlZmluaXRpb24pIHsKKyAgICAgIHRoaXMucGFydHMucHVzaCgidmFyICIpOworICAgICAgZGVmaW5pdGlvbi52YXJpYWJsZS52aXNpdCh0aGlzKTsKKyAgICAgIHRoaXMucGFydHMucHVzaCgiID0gIik7CisgICAgICBkZWZpbml0aW9uLmFyZy52aXNpdCh0aGlzKTsKKyAgICAgIHRoaXMucGFydHMucHVzaCgiOyIpOworICAgIH0sCisgICAgdmlzaXRNaW46IGZ1bmN0aW9uIHZpc2l0TWluKG1heCkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCJNYXRoLm1pbigiKTsKKyAgICAgIG1heC5hcmcudmlzaXQodGhpcyk7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIiwgIiwgbWF4Lm1heCwgIikiKTsKKyAgICB9LAorICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oIiIpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSB7CisgICAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIubnVtYmVyID09PSAwKSB7CisgICAgICByZXR1cm4gbnVtMTsKKyAgICB9CisKKyAgICBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMS5udW1iZXIgPT09IDApIHsKKyAgICAgIHJldHVybiBudW0yOworICAgIH0KKworICAgIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgeworICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICsgbnVtMi5udW1iZXIpOworICAgIH0KKworICAgIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIrIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gKyBudW0yLm1pbiwgbnVtMS5tYXggKyBudW0yLm1heCk7CisgIH0KKworICBmdW5jdGlvbiBidWlsZE11bE9wZXJhdGlvbihudW0xLCBudW0yKSB7CisgICAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiKSB7CisgICAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApOworICAgICAgfSBlbHNlIGlmIChudW0yLm51bWJlciA9PT0gMSkgeworICAgICAgICByZXR1cm4gbnVtMTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICogbnVtMi5udW1iZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgeworICAgICAgaWYgKG51bTEubnVtYmVyID09PSAwKSB7CisgICAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbCgwKTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS5udW1iZXIgPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIG51bTI7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1pbiA9IE1hdGgubWluKG51bTEubWluICogbnVtMi5taW4sIG51bTEubWluICogbnVtMi5tYXgsIG51bTEubWF4ICogbnVtMi5taW4sIG51bTEubWF4ICogbnVtMi5tYXgpOworICAgIHZhciBtYXggPSBNYXRoLm1heChudW0xLm1pbiAqIG51bTIubWluLCBudW0xLm1pbiAqIG51bTIubWF4LCBudW0xLm1heCAqIG51bTIubWluLCBudW0xLm1heCAqIG51bTIubWF4KTsKKyAgICByZXR1cm4gbmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiKiIsIG51bTEsIG51bTIsIG1pbiwgbWF4KTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkU3ViT3BlcmF0aW9uKG51bTEsIG51bTIpIHsKKyAgICBpZiAobnVtMi50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgIGlmIChudW0yLm51bWJlciA9PT0gMCkgeworICAgICAgICByZXR1cm4gbnVtMTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyIC0gbnVtMi5udW1iZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChudW0yLnR5cGUgPT09ICJiaW5hcnkiICYmIG51bTIub3AgPT09ICItIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLm51bWJlciA9PT0gMSAmJiBudW0yLmFyZzEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIuYXJnMS5udW1iZXIgPT09IDEpIHsKKyAgICAgIHJldHVybiBudW0yLmFyZzI7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIi0iLCBudW0xLCBudW0yLCBudW0xLm1pbiAtIG51bTIubWF4LCBudW0xLm1heCAtIG51bTIubWluKTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIG1heCkgeworICAgIGlmIChudW0xLm1pbiA+PSBtYXgpIHsKKyAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChtYXgpOworICAgIH0gZWxzZSBpZiAobnVtMS5tYXggPD0gbWF4KSB7CisgICAgICByZXR1cm4gbnVtMTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEFzdE1pbihudW0xLCBtYXgpOworICB9CisKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyKCkge30KKworICBQb3N0U2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0geworICAgIGNvbXBpbGU6IGZ1bmN0aW9uIFBvc3RTY3JpcHRDb21waWxlcl9jb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpIHsKKyAgICAgIHZhciBzdGFjayA9IFtdOworICAgICAgdmFyIGluc3RydWN0aW9ucyA9IFtdOworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggPj4gMSwKKyAgICAgICAgICBvdXRwdXRTaXplID0gcmFuZ2UubGVuZ3RoID4+IDE7CisgICAgICB2YXIgbGFzdFJlZ2lzdGVyID0gMDsKKyAgICAgIHZhciBuLCBqOworICAgICAgdmFyIG51bTEsIG51bTIsIGFzdDEsIGFzdDIsIHRtcFZhciwgaXRlbTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dFNpemU7IGkrKykgeworICAgICAgICBzdGFjay5wdXNoKG5ldyBBc3RBcmd1bWVudChpLCBkb21haW5baSAqIDJdLCBkb21haW5baSAqIDIgKyAxXSkpOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBfaSA9IDAsIGlpID0gY29kZS5sZW5ndGg7IF9pIDwgaWk7IF9pKyspIHsKKyAgICAgICAgaXRlbSA9IGNvZGVbX2ldOworCisgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gIm51bWJlciIpIHsKKyAgICAgICAgICBzdGFjay5wdXNoKG5ldyBBc3RMaXRlcmFsKGl0ZW0pKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoaXRlbSkgeworICAgICAgICAgIGNhc2UgImFkZCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImN2ciI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJtdWwiOgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bTIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIG51bTEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRNdWxPcGVyYXRpb24obnVtMSwgbnVtMikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJzdWIiOgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bTIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIG51bTEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRTdWJPcGVyYXRpb24obnVtMSwgbnVtMikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJleGNoIjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3QxID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhc3QyID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEsIGFzdDIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJwb3AiOgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJpbmRleCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAobnVtMS50eXBlICE9PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4gPSBudW0xLm51bWJlcjsKKworICAgICAgICAgICAgaWYgKG4gPCAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8IHN0YWNrLmxlbmd0aCA8IG4pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzdDEgPSBzdGFja1tzdGFjay5sZW5ndGggLSBuIC0gMV07CisKKyAgICAgICAgICAgIGlmIChhc3QxLnR5cGUgPT09ICJsaXRlcmFsIiB8fCBhc3QxLnR5cGUgPT09ICJ2YXIiKSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goYXN0MSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7CisgICAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSBuIC0gMV0gPSB0bXBWYXI7CisgICAgICAgICAgICBzdGFjay5wdXNoKHRtcFZhcik7CisgICAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChuZXcgQXN0VmFyaWFibGVEZWZpbml0aW9uKHRtcFZhciwgYXN0MSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJkdXAiOgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVtfaSArIDFdID09PSAibnVtYmVyIiAmJiBjb2RlW19pICsgMl0gPT09ICJndCIgJiYgY29kZVtfaSArIDNdID09PSBfaSArIDcgJiYgY29kZVtfaSArIDRdID09PSAianoiICYmIGNvZGVbX2kgKyA1XSA9PT0gInBvcCIgJiYgY29kZVtfaSArIDZdID09PSBjb2RlW19pICsgMV0pIHsKKyAgICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIGNvZGVbX2kgKyAxXSkpOworICAgICAgICAgICAgICBfaSArPSA2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXN0MSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOworCisgICAgICAgICAgICBpZiAoYXN0MS50eXBlID09PSAibGl0ZXJhbCIgfHwgYXN0MS50eXBlID09PSAidmFyIikgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wVmFyID0gbmV3IEFzdFZhcmlhYmxlKGxhc3RSZWdpc3RlcisrLCBhc3QxLm1pbiwgYXN0MS5tYXgpOworICAgICAgICAgICAgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPSB0bXBWYXI7CisgICAgICAgICAgICBzdGFjay5wdXNoKHRtcFZhcik7CisgICAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChuZXcgQXN0VmFyaWFibGVEZWZpbml0aW9uKHRtcFZhciwgYXN0MSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJyb2xsIjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmIChudW0yLnR5cGUgIT09ICJsaXRlcmFsIiB8fCBudW0xLnR5cGUgIT09ICJsaXRlcmFsIikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaiA9IG51bTIubnVtYmVyOworICAgICAgICAgICAgbiA9IG51bTEubnVtYmVyOworCisgICAgICAgICAgICBpZiAobiA8PSAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGopIHx8IHN0YWNrLmxlbmd0aCA8IG4pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGogPSAoaiAlIG4gKyBuKSAlIG47CisKKyAgICAgICAgICAgIGlmIChqID09PSAwKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzdGFjaywgc3RhY2suc3BsaWNlKHN0YWNrLmxlbmd0aCAtIG4sIG4gLSBqKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc3RhY2subGVuZ3RoICE9PSBvdXRwdXRTaXplKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICB2YXIgcmVzdWx0ID0gW107CisgICAgICBpbnN0cnVjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW5zdHJ1Y3Rpb24pIHsKKyAgICAgICAgdmFyIHN0YXRlbWVudEJ1aWxkZXIgPSBuZXcgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yKCk7CisgICAgICAgIGluc3RydWN0aW9uLnZpc2l0KHN0YXRlbWVudEJ1aWxkZXIpOworICAgICAgICByZXN1bHQucHVzaChzdGF0ZW1lbnRCdWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgfSk7CisgICAgICBzdGFjay5mb3JFYWNoKGZ1bmN0aW9uIChleHByLCBpKSB7CisgICAgICAgIHZhciBzdGF0ZW1lbnRCdWlsZGVyID0gbmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpOworICAgICAgICBleHByLnZpc2l0KHN0YXRlbWVudEJ1aWxkZXIpOworICAgICAgICB2YXIgbWluID0gcmFuZ2VbaSAqIDJdLAorICAgICAgICAgICAgbWF4ID0gcmFuZ2VbaSAqIDIgKyAxXTsKKyAgICAgICAgdmFyIG91dCA9IFtzdGF0ZW1lbnRCdWlsZGVyLnRvU3RyaW5nKCldOworCisgICAgICAgIGlmIChtaW4gPiBleHByLm1pbikgeworICAgICAgICAgIG91dC51bnNoaWZ0KCJNYXRoLm1heCgiLCBtaW4sICIsICIpOworICAgICAgICAgIG91dC5wdXNoKCIpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF4IDwgZXhwci5tYXgpIHsKKyAgICAgICAgICBvdXQudW5zaGlmdCgiTWF0aC5taW4oIiwgbWF4LCAiLCAiKTsKKyAgICAgICAgICBvdXQucHVzaCgiKSIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnVuc2hpZnQoImRlc3RbZGVzdE9mZnNldCArICIsIGksICJdID0gIik7CisgICAgICAgIG91dC5wdXNoKCI7Iik7CisgICAgICAgIHJlc3VsdC5wdXNoKG91dC5qb2luKCIiKSk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQuam9pbigiXG4iKTsKKyAgICB9CisgIH07CisgIHJldHVybiBQb3N0U2NyaXB0Q29tcGlsZXI7Cit9KCk7CisKK2V4cG9ydHMuUG9zdFNjcmlwdENvbXBpbGVyID0gUG9zdFNjcmlwdENvbXBpbGVyOworCisvKioqLyB9KSwKKy8qIDIzOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBvc3RTY3JpcHRQYXJzZXIgPSBleHBvcnRzLlBvc3RTY3JpcHRMZXhlciA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKKwordmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDIpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwNSk7CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgUG9zdFNjcmlwdFBhcnNlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBvc3RTY3JpcHRQYXJzZXIobGV4ZXIpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zdFNjcmlwdFBhcnNlcik7CisKKyAgICB0aGlzLmxleGVyID0gbGV4ZXI7CisgICAgdGhpcy5vcGVyYXRvcnMgPSBbXTsKKyAgICB0aGlzLnRva2VuID0gbnVsbDsKKyAgICB0aGlzLnByZXYgPSBudWxsOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBvc3RTY3JpcHRQYXJzZXIsIFt7CisgICAga2V5OiAibmV4dFRva2VuIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dFRva2VuKCkgeworICAgICAgdGhpcy5wcmV2ID0gdGhpcy50b2tlbjsKKyAgICAgIHRoaXMudG9rZW4gPSB0aGlzLmxleGVyLmdldFRva2VuKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYWNjZXB0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYWNjZXB0KHR5cGUpIHsKKyAgICAgIGlmICh0aGlzLnRva2VuLnR5cGUgPT09IHR5cGUpIHsKKyAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJleHBlY3QiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBleHBlY3QodHlwZSkgeworICAgICAgaWYgKHRoaXMuYWNjZXB0KHR5cGUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVuZXhwZWN0ZWQgc3ltYm9sOiBmb3VuZCAiLmNvbmNhdCh0aGlzLnRva2VuLnR5cGUsICIgZXhwZWN0ZWQgIikuY29uY2F0KHR5cGUsICIuIikpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBhcnNlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2UoKSB7CisgICAgICB0aGlzLm5leHRUb2tlbigpOworICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFKTsKKyAgICAgIHRoaXMucGFyc2VCbG9jaygpOworICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKKyAgICAgIHJldHVybiB0aGlzLm9wZXJhdG9yczsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwYXJzZUJsb2NrIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VCbG9jaygpIHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5OVU1CRVIpKSB7CisgICAgICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk9QRVJBVE9SKSkgeworICAgICAgICAgIHRoaXMub3BlcmF0b3JzLnB1c2godGhpcy5wcmV2LnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7CisgICAgICAgICAgdGhpcy5wYXJzZUNvbmRpdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInBhcnNlQ29uZGl0aW9uIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VDb25kaXRpb24oKSB7CisgICAgICB2YXIgY29uZGl0aW9uTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CisgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsIG51bGwpOworICAgICAgdGhpcy5wYXJzZUJsb2NrKCk7CisgICAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOworCisgICAgICBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuSUYpKSB7CisgICAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKKyAgICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb24gKyAxXSA9ICJqeiI7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSkpIHsKKyAgICAgICAgdmFyIGp1bXBMb2NhdGlvbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKKyAgICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaChudWxsLCBudWxsKTsKKyAgICAgICAgdmFyIGVuZE9mVHJ1ZSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKKyAgICAgICAgdGhpcy5wYXJzZUJsb2NrKCk7CisgICAgICAgIHRoaXMuZXhwZWN0KFBvc3RTY3JpcHRUb2tlblR5cGVzLlJCUkFDRSk7CisgICAgICAgIHRoaXMuZXhwZWN0KFBvc3RTY3JpcHRUb2tlblR5cGVzLklGRUxTRSk7CisgICAgICAgIHRoaXMub3BlcmF0b3JzW2p1bXBMb2NhdGlvbl0gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CisgICAgICAgIHRoaXMub3BlcmF0b3JzW2p1bXBMb2NhdGlvbiArIDFdID0gImoiOworICAgICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbl0gPSBlbmRPZlRydWU7CisgICAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSAianoiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJQUyBGdW5jdGlvbjogZXJyb3IgcGFyc2luZyBjb25kaXRpb25hbC4iKTsKKyAgICAgIH0KKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUG9zdFNjcmlwdFBhcnNlcjsKK30oKTsKKworZXhwb3J0cy5Qb3N0U2NyaXB0UGFyc2VyID0gUG9zdFNjcmlwdFBhcnNlcjsKK3ZhciBQb3N0U2NyaXB0VG9rZW5UeXBlcyA9IHsKKyAgTEJSQUNFOiAwLAorICBSQlJBQ0U6IDEsCisgIE5VTUJFUjogMiwKKyAgT1BFUkFUT1I6IDMsCisgIElGOiA0LAorICBJRkVMU0U6IDUKK307CisKK3ZhciBQb3N0U2NyaXB0VG9rZW4gPSBmdW5jdGlvbiBQb3N0U2NyaXB0VG9rZW5DbG9zdXJlKCkgeworICB2YXIgb3BDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgdmFyIFBvc3RTY3JpcHRUb2tlbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgICAgZnVuY3Rpb24gUG9zdFNjcmlwdFRva2VuKHR5cGUsIHZhbHVlKSB7CisgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zdFNjcmlwdFRva2VuKTsKKworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBfY3JlYXRlQ2xhc3MoUG9zdFNjcmlwdFRva2VuLCBudWxsLCBbeworICAgICAga2V5OiAiZ2V0T3BlcmF0b3IiLAorICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9wZXJhdG9yKG9wKSB7CisgICAgICAgIHZhciBvcFZhbHVlID0gb3BDYWNoZVtvcF07CisKKyAgICAgICAgaWYgKG9wVmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gb3BWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvcENhY2hlW29wXSA9IG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IsIG9wKTsKKyAgICAgIH0KKyAgICB9LCB7CisgICAgICBrZXk6ICJMQlJBQ0UiLAorICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiTEJSQUNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UsICJ7IikpOworICAgICAgfQorICAgIH0sIHsKKyAgICAgIGtleTogIlJCUkFDRSIsCisgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJSQlJBQ0UiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLlJCUkFDRSwgIn0iKSk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiSUYiLAorICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiSUYiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLklGLCAiSUYiKSk7CisgICAgICB9CisgICAgfSwgeworICAgICAga2V5OiAiSUZFTFNFIiwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIklGRUxTRSIsIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFLCAiSUZFTFNFIikpOworICAgICAgfQorICAgIH1dKTsKKworICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW47CisgIH0oKTsKKworICByZXR1cm4gUG9zdFNjcmlwdFRva2VuOworfSgpOworCit2YXIgUG9zdFNjcmlwdExleGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdExleGVyKHN0cmVhbSkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3N0U2NyaXB0TGV4ZXIpOworCisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5uZXh0Q2hhcigpOworICAgIHRoaXMuc3RyQnVmID0gW107CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUG9zdFNjcmlwdExleGVyLCBbeworICAgIGtleTogIm5leHRDaGFyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dENoYXIoKSB7CisgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q2hhciA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRUb2tlbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRva2VuKCkgeworICAgICAgdmFyIGNvbW1lbnQgPSBmYWxzZTsKKyAgICAgIHZhciBjaCA9IHRoaXMuY3VycmVudENoYXI7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuRU9GOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbW1lbnQpIHsKKyAgICAgICAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKKyAgICAgICAgICAgIGNvbW1lbnQgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjUpIHsKKyAgICAgICAgICBjb21tZW50ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChjaCB8IDApIHsKKyAgICAgICAgY2FzZSAweDMwOgorICAgICAgICBjYXNlIDB4MzE6CisgICAgICAgIGNhc2UgMHgzMjoKKyAgICAgICAgY2FzZSAweDMzOgorICAgICAgICBjYXNlIDB4MzQ6CisgICAgICAgIGNhc2UgMHgzNToKKyAgICAgICAgY2FzZSAweDM2OgorICAgICAgICBjYXNlIDB4Mzc6CisgICAgICAgIGNhc2UgMHgzODoKKyAgICAgICAgY2FzZSAweDM5OgorICAgICAgICBjYXNlIDB4MmI6CisgICAgICAgIGNhc2UgMHgyZDoKKyAgICAgICAgY2FzZSAweDJlOgorICAgICAgICAgIHJldHVybiBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLk5VTUJFUiwgdGhpcy5nZXROdW1iZXIoKSk7CisKKyAgICAgICAgY2FzZSAweDdiOgorICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTsKKworICAgICAgICBjYXNlIDB4N2Q6CisgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uUkJSQUNFOworICAgICAgfQorCisgICAgICB2YXIgc3RyQnVmID0gdGhpcy5zdHJCdWY7CisgICAgICBzdHJCdWYubGVuZ3RoID0gMDsKKyAgICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOworCisgICAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NWEgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDdhKSkgeworICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CisgICAgICB9CisKKyAgICAgIHZhciBzdHIgPSBzdHJCdWYuam9pbigiIik7CisKKyAgICAgIHN3aXRjaCAoc3RyLnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgICAgY2FzZSAiaWYiOgorICAgICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7CisKKyAgICAgICAgY2FzZSAiaWZlbHNlIjoKKyAgICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLklGRUxTRTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uZ2V0T3BlcmF0b3Ioc3RyKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXROdW1iZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROdW1iZXIoKSB7CisgICAgICB2YXIgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworICAgICAgdmFyIHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOworICAgICAgc3RyQnVmLmxlbmd0aCA9IDA7CisgICAgICBzdHJCdWZbMF0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKworICAgICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgeworICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8IGNoID09PSAweDJkIHx8IGNoID09PSAweDJlKSB7CisgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciB2YWx1ZSA9IHBhcnNlRmxvYXQoc3RyQnVmLmpvaW4oIiIpKTsKKworICAgICAgaWYgKGlzTmFOKHZhbHVlKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOiAiLmNvbmNhdCh2YWx1ZSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBvc3RTY3JpcHRMZXhlcjsKK30oKTsKKworZXhwb3J0cy5Qb3N0U2NyaXB0TGV4ZXIgPSBQb3N0U2NyaXB0TGV4ZXI7CisKKy8qKiovIH0pLAorLyogMjM5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuYmlkaSA9IGJpZGk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBiYXNlVHlwZXMgPSBbIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIlMiLCAiQiIsICJTIiwgIldTIiwgIkIiLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQiIsICJCIiwgIkIiLCAiUyIsICJXUyIsICJPTiIsICJPTiIsICJFVCIsICJFVCIsICJFVCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJFUyIsICJDUyIsICJFUyIsICJDUyIsICJDUyIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJDUyIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkIiLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQ1MiLCAiT04iLCAiRVQiLCAiRVQiLCAiRVQiLCAiRVQiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJPTiIsICJPTiIsICJCTiIsICJPTiIsICJPTiIsICJFVCIsICJFVCIsICJFTiIsICJFTiIsICJPTiIsICJMIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkVOIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIl07Cit2YXIgYXJhYmljVHlwZXMgPSBbIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIk9OIiwgIk9OIiwgIkFMIiwgIkVUIiwgIkVUIiwgIkFMIiwgIkNTIiwgIkFMIiwgIk9OIiwgIk9OIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkVUIiwgIkFOIiwgIkFOIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQU4iLCAiT04iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiTlNNIiwgIk5TTSIsICJPTiIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiXTsKKworZnVuY3Rpb24gaXNPZGQoaSkgeworICByZXR1cm4gKGkgJiAxKSAhPT0gMDsKK30KKworZnVuY3Rpb24gaXNFdmVuKGkpIHsKKyAgcmV0dXJuIChpICYgMSkgPT09IDA7Cit9CisKK2Z1bmN0aW9uIGZpbmRVbmVxdWFsKGFyciwgc3RhcnQsIHZhbHVlKSB7CisgIGZvciAodmFyIGogPSBzdGFydCwgamogPSBhcnIubGVuZ3RoOyBqIDwgamo7ICsraikgeworICAgIGlmIChhcnJbal0gIT09IHZhbHVlKSB7CisgICAgICByZXR1cm4gajsKKyAgICB9CisgIH0KKworICByZXR1cm4gajsKK30KKworZnVuY3Rpb24gc2V0VmFsdWVzKGFyciwgc3RhcnQsIGVuZCwgdmFsdWUpIHsKKyAgZm9yICh2YXIgaiA9IHN0YXJ0OyBqIDwgZW5kOyArK2opIHsKKyAgICBhcnJbal0gPSB2YWx1ZTsKKyAgfQorfQorCitmdW5jdGlvbiByZXZlcnNlVmFsdWVzKGFyciwgc3RhcnQsIGVuZCkgeworICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSAxOyBpIDwgajsgKytpLCAtLWopIHsKKyAgICB2YXIgdGVtcCA9IGFycltpXTsKKyAgICBhcnJbaV0gPSBhcnJbal07CisgICAgYXJyW2pdID0gdGVtcDsKKyAgfQorfQorCitmdW5jdGlvbiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSKSB7CisgIHZhciB2ZXJ0aWNhbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7CisgIHZhciBkaXIgPSAibHRyIjsKKworICBpZiAodmVydGljYWwpIHsKKyAgICBkaXIgPSAidHRiIjsKKyAgfSBlbHNlIGlmICghaXNMVFIpIHsKKyAgICBkaXIgPSAicnRsIjsKKyAgfQorCisgIHJldHVybiB7CisgICAgc3RyOiBzdHIsCisgICAgZGlyOiBkaXIKKyAgfTsKK30KKwordmFyIGNoYXJzID0gW107Cit2YXIgdHlwZXMgPSBbXTsKKworZnVuY3Rpb24gYmlkaShzdHIsIHN0YXJ0TGV2ZWwsIHZlcnRpY2FsKSB7CisgIHZhciBpc0xUUiA9IHRydWU7CisgIHZhciBzdHJMZW5ndGggPSBzdHIubGVuZ3RoOworCisgIGlmIChzdHJMZW5ndGggPT09IDAgfHwgdmVydGljYWwpIHsKKyAgICByZXR1cm4gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUiwgdmVydGljYWwpOworICB9CisKKyAgY2hhcnMubGVuZ3RoID0gc3RyTGVuZ3RoOworICB0eXBlcy5sZW5ndGggPSBzdHJMZW5ndGg7CisgIHZhciBudW1CaWRpID0gMDsKKyAgdmFyIGksIGlpOworCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIGNoYXJzW2ldID0gc3RyLmNoYXJBdChpKTsKKyAgICB2YXIgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKKyAgICB2YXIgY2hhclR5cGUgPSAiTCI7CisKKyAgICBpZiAoY2hhckNvZGUgPD0gMHgwMGZmKSB7CisgICAgICBjaGFyVHlwZSA9IGJhc2VUeXBlc1tjaGFyQ29kZV07CisgICAgfSBlbHNlIGlmICgweDA1OTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNWY0KSB7CisgICAgICBjaGFyVHlwZSA9ICJSIjsKKyAgICB9IGVsc2UgaWYgKDB4MDYwMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDA2ZmYpIHsKKyAgICAgIGNoYXJUeXBlID0gYXJhYmljVHlwZXNbY2hhckNvZGUgJiAweGZmXTsKKworICAgICAgaWYgKCFjaGFyVHlwZSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIiArIGNoYXJDb2RlLnRvU3RyaW5nKDE2KSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICgweDA3MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwOGFjKSB7CisgICAgICBjaGFyVHlwZSA9ICJBTCI7CisgICAgfQorCisgICAgaWYgKGNoYXJUeXBlID09PSAiUiIgfHwgY2hhclR5cGUgPT09ICJBTCIgfHwgY2hhclR5cGUgPT09ICJBTiIpIHsKKyAgICAgIG51bUJpZGkrKzsKKyAgICB9CisKKyAgICB0eXBlc1tpXSA9IGNoYXJUeXBlOworICB9CisKKyAgaWYgKG51bUJpZGkgPT09IDApIHsKKyAgICBpc0xUUiA9IHRydWU7CisgICAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIpOworICB9CisKKyAgaWYgKHN0YXJ0TGV2ZWwgPT09IC0xKSB7CisgICAgaWYgKG51bUJpZGkgLyBzdHJMZW5ndGggPCAwLjMpIHsKKyAgICAgIGlzTFRSID0gdHJ1ZTsKKyAgICAgIHN0YXJ0TGV2ZWwgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpc0xUUiA9IGZhbHNlOworICAgICAgc3RhcnRMZXZlbCA9IDE7CisgICAgfQorICB9CisKKyAgdmFyIGxldmVscyA9IFtdOworCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIGxldmVsc1tpXSA9IHN0YXJ0TGV2ZWw7CisgIH0KKworICB2YXIgZSA9IGlzT2RkKHN0YXJ0TGV2ZWwpID8gIlIiIDogIkwiOworICB2YXIgc29yID0gZTsKKyAgdmFyIGVvciA9IHNvcjsKKyAgdmFyIGxhc3RUeXBlID0gc29yOworCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIGlmICh0eXBlc1tpXSA9PT0gIk5TTSIpIHsKKyAgICAgIHR5cGVzW2ldID0gbGFzdFR5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgIGxhc3RUeXBlID0gdHlwZXNbaV07CisgICAgfQorICB9CisKKyAgbGFzdFR5cGUgPSBzb3I7CisgIHZhciB0OworCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIHQgPSB0eXBlc1tpXTsKKworICAgIGlmICh0ID09PSAiRU4iKSB7CisgICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlID09PSAiQUwiID8gIkFOIiA6ICJFTiI7CisgICAgfSBlbHNlIGlmICh0ID09PSAiUiIgfHwgdCA9PT0gIkwiIHx8IHQgPT09ICJBTCIpIHsKKyAgICAgIGxhc3RUeXBlID0gdDsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICB0ID0gdHlwZXNbaV07CisKKyAgICBpZiAodCA9PT0gIkFMIikgeworICAgICAgdHlwZXNbaV0gPSAiUiI7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMTsgaSA8IHN0ckxlbmd0aCAtIDE7ICsraSkgeworICAgIGlmICh0eXBlc1tpXSA9PT0gIkVTIiAmJiB0eXBlc1tpIC0gMV0gPT09ICJFTiIgJiYgdHlwZXNbaSArIDFdID09PSAiRU4iKSB7CisgICAgICB0eXBlc1tpXSA9ICJFTiI7CisgICAgfQorCisgICAgaWYgKHR5cGVzW2ldID09PSAiQ1MiICYmICh0eXBlc1tpIC0gMV0gPT09ICJFTiIgfHwgdHlwZXNbaSAtIDFdID09PSAiQU4iKSAmJiB0eXBlc1tpICsgMV0gPT09IHR5cGVzW2kgLSAxXSkgeworICAgICAgdHlwZXNbaV0gPSB0eXBlc1tpIC0gMV07CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgaWYgKHR5cGVzW2ldID09PSAiRU4iKSB7CisgICAgICB2YXIgajsKKworICAgICAgZm9yIChqID0gaSAtIDE7IGogPj0gMDsgLS1qKSB7CisgICAgICAgIGlmICh0eXBlc1tqXSAhPT0gIkVUIikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdHlwZXNbal0gPSAiRU4iOworICAgICAgfQorCisgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IHN0ckxlbmd0aDsgKytqKSB7CisgICAgICAgIGlmICh0eXBlc1tqXSAhPT0gIkVUIikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdHlwZXNbal0gPSAiRU4iOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIHQgPSB0eXBlc1tpXTsKKworICAgIGlmICh0ID09PSAiV1MiIHx8IHQgPT09ICJFUyIgfHwgdCA9PT0gIkVUIiB8fCB0ID09PSAiQ1MiKSB7CisgICAgICB0eXBlc1tpXSA9ICJPTiI7CisgICAgfQorICB9CisKKyAgbGFzdFR5cGUgPSBzb3I7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgdCA9IHR5cGVzW2ldOworCisgICAgaWYgKHQgPT09ICJFTiIpIHsKKyAgICAgIHR5cGVzW2ldID0gbGFzdFR5cGUgPT09ICJMIiA/ICJMIiA6ICJFTiI7CisgICAgfSBlbHNlIGlmICh0ID09PSAiUiIgfHwgdCA9PT0gIkwiKSB7CisgICAgICBsYXN0VHlwZSA9IHQ7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgaWYgKHR5cGVzW2ldID09PSAiT04iKSB7CisgICAgICB2YXIgZW5kID0gZmluZFVuZXF1YWwodHlwZXMsIGkgKyAxLCAiT04iKTsKKyAgICAgIHZhciBiZWZvcmUgPSBzb3I7CisKKyAgICAgIGlmIChpID4gMCkgeworICAgICAgICBiZWZvcmUgPSB0eXBlc1tpIC0gMV07CisgICAgICB9CisKKyAgICAgIHZhciBhZnRlciA9IGVvcjsKKworICAgICAgaWYgKGVuZCArIDEgPCBzdHJMZW5ndGgpIHsKKyAgICAgICAgYWZ0ZXIgPSB0eXBlc1tlbmQgKyAxXTsKKyAgICAgIH0KKworICAgICAgaWYgKGJlZm9yZSAhPT0gIkwiKSB7CisgICAgICAgIGJlZm9yZSA9ICJSIjsKKyAgICAgIH0KKworICAgICAgaWYgKGFmdGVyICE9PSAiTCIpIHsKKyAgICAgICAgYWZ0ZXIgPSAiUiI7CisgICAgICB9CisKKyAgICAgIGlmIChiZWZvcmUgPT09IGFmdGVyKSB7CisgICAgICAgIHNldFZhbHVlcyh0eXBlcywgaSwgZW5kLCBiZWZvcmUpOworICAgICAgfQorCisgICAgICBpID0gZW5kIC0gMTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICBpZiAodHlwZXNbaV0gPT09ICJPTiIpIHsKKyAgICAgIHR5cGVzW2ldID0gZTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICB0ID0gdHlwZXNbaV07CisKKyAgICBpZiAoaXNFdmVuKGxldmVsc1tpXSkpIHsKKyAgICAgIGlmICh0ID09PSAiUiIpIHsKKyAgICAgICAgbGV2ZWxzW2ldICs9IDE7CisgICAgICB9IGVsc2UgaWYgKHQgPT09ICJBTiIgfHwgdCA9PT0gIkVOIikgeworICAgICAgICBsZXZlbHNbaV0gKz0gMjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHQgPT09ICJMIiB8fCB0ID09PSAiQU4iIHx8IHQgPT09ICJFTiIpIHsKKyAgICAgICAgbGV2ZWxzW2ldICs9IDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdmFyIGhpZ2hlc3RMZXZlbCA9IC0xOworICB2YXIgbG93ZXN0T2RkTGV2ZWwgPSA5OTsKKyAgdmFyIGxldmVsOworCisgIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICBsZXZlbCA9IGxldmVsc1tpXTsKKworICAgIGlmIChoaWdoZXN0TGV2ZWwgPCBsZXZlbCkgeworICAgICAgaGlnaGVzdExldmVsID0gbGV2ZWw7CisgICAgfQorCisgICAgaWYgKGxvd2VzdE9kZExldmVsID4gbGV2ZWwgJiYgaXNPZGQobGV2ZWwpKSB7CisgICAgICBsb3dlc3RPZGRMZXZlbCA9IGxldmVsOworICAgIH0KKyAgfQorCisgIGZvciAobGV2ZWwgPSBoaWdoZXN0TGV2ZWw7IGxldmVsID49IGxvd2VzdE9kZExldmVsOyAtLWxldmVsKSB7CisgICAgdmFyIHN0YXJ0ID0gLTE7CisKKyAgICBmb3IgKGkgPSAwLCBpaSA9IGxldmVscy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICBpZiAobGV2ZWxzW2ldIDwgbGV2ZWwpIHsKKyAgICAgICAgaWYgKHN0YXJ0ID49IDApIHsKKyAgICAgICAgICByZXZlcnNlVmFsdWVzKGNoYXJzLCBzdGFydCwgaSk7CisgICAgICAgICAgc3RhcnQgPSAtMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKKyAgICAgICAgc3RhcnQgPSBpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGFydCA+PSAwKSB7CisgICAgICByZXZlcnNlVmFsdWVzKGNoYXJzLCBzdGFydCwgbGV2ZWxzLmxlbmd0aCk7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMCwgaWkgPSBjaGFycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgdmFyIGNoID0gY2hhcnNbaV07CisKKyAgICBpZiAoY2ggPT09ICI8IiB8fCBjaCA9PT0gIj4iKSB7CisgICAgICBjaGFyc1tpXSA9ICIiOworICAgIH0KKyAgfQorCisgIHJldHVybiBjcmVhdGVCaWRpVGV4dChjaGFycy5qb2luKCIiKSwgaXNMVFIpOworfQorCisvKioqLyB9KSwKKy8qIDI0MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldE1ldHJpY3MgPSB2b2lkIDA7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjA1KTsKKwordmFyIGdldE1ldHJpY3MgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0LkNvdXJpZXIgPSA2MDA7CisgIHRbIkNvdXJpZXItQm9sZCJdID0gNjAwOworICB0WyJDb3VyaWVyLUJvbGRPYmxpcXVlIl0gPSA2MDA7CisgIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gNjAwOworICB0LkhlbHZldGljYSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI3ODsKKyAgICB0LmV4Y2xhbSA9IDI3ODsKKyAgICB0LnF1b3RlZGJsID0gMzU1OworICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKKyAgICB0LmRvbGxhciA9IDU1NjsKKyAgICB0LnBlcmNlbnQgPSA4ODk7CisgICAgdC5hbXBlcnNhbmQgPSA2Njc7CisgICAgdC5xdW90ZXJpZ2h0ID0gMjIyOworICAgIHQucGFyZW5sZWZ0ID0gMzMzOworICAgIHQucGFyZW5yaWdodCA9IDMzMzsKKyAgICB0LmFzdGVyaXNrID0gMzg5OworICAgIHQucGx1cyA9IDU4NDsKKyAgICB0LmNvbW1hID0gMjc4OworICAgIHQuaHlwaGVuID0gMzMzOworICAgIHQucGVyaW9kID0gMjc4OworICAgIHQuc2xhc2ggPSAyNzg7CisgICAgdC56ZXJvID0gNTU2OworICAgIHQub25lID0gNTU2OworICAgIHQudHdvID0gNTU2OworICAgIHQudGhyZWUgPSA1NTY7CisgICAgdC5mb3VyID0gNTU2OworICAgIHQuZml2ZSA9IDU1NjsKKyAgICB0LnNpeCA9IDU1NjsKKyAgICB0LnNldmVuID0gNTU2OworICAgIHQuZWlnaHQgPSA1NTY7CisgICAgdC5uaW5lID0gNTU2OworICAgIHQuY29sb24gPSAyNzg7CisgICAgdC5zZW1pY29sb24gPSAyNzg7CisgICAgdC5sZXNzID0gNTg0OworICAgIHQuZXF1YWwgPSA1ODQ7CisgICAgdC5ncmVhdGVyID0gNTg0OworICAgIHQucXVlc3Rpb24gPSA1NTY7CisgICAgdC5hdCA9IDEwMTU7CisgICAgdC5BID0gNjY3OworICAgIHQuQiA9IDY2NzsKKyAgICB0LkMgPSA3MjI7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzc4OworICAgIHQuSCA9IDcyMjsKKyAgICB0LkkgPSAyNzg7CisgICAgdC5KID0gNTAwOworICAgIHQuSyA9IDY2NzsKKyAgICB0LkwgPSA1NTY7CisgICAgdC5NID0gODMzOworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3Nzg7CisgICAgdC5QID0gNjY3OworICAgIHQuUSA9IDc3ODsKKyAgICB0LlIgPSA3MjI7CisgICAgdC5TID0gNjY3OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDk0NDsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjY3OworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4OworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMjc4OworICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7CisgICAgdC51bmRlcnNjb3JlID0gNTU2OworICAgIHQucXVvdGVsZWZ0ID0gMjIyOworICAgIHQuYSA9IDU1NjsKKyAgICB0LmIgPSA1NTY7CisgICAgdC5jID0gNTAwOworICAgIHQuZCA9IDU1NjsKKyAgICB0LmUgPSA1NTY7CisgICAgdC5mID0gMjc4OworICAgIHQuZyA9IDU1NjsKKyAgICB0LmggPSA1NTY7CisgICAgdC5pID0gMjIyOworICAgIHQuaiA9IDIyMjsKKyAgICB0LmsgPSA1MDA7CisgICAgdC5sID0gMjIyOworICAgIHQubSA9IDgzMzsKKyAgICB0Lm4gPSA1NTY7CisgICAgdC5vID0gNTU2OworICAgIHQucCA9IDU1NjsKKyAgICB0LnEgPSA1NTY7CisgICAgdC5yID0gMzMzOworICAgIHQucyA9IDUwMDsKKyAgICB0LnQgPSAyNzg7CisgICAgdC51ID0gNTU2OworICAgIHQudiA9IDUwMDsKKyAgICB0LncgPSA3MjI7CisgICAgdC54ID0gNTAwOworICAgIHQueSA9IDUwMDsKKyAgICB0LnogPSA1MDA7CisgICAgdC5icmFjZWxlZnQgPSAzMzQ7CisgICAgdC5iYXIgPSAyNjA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzM0OworICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CisgICAgdC5jZW50ID0gNTU2OworICAgIHQuc3RlcmxpbmcgPSA1NTY7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDU1NjsKKyAgICB0LmZsb3JpbiA9IDU1NjsKKyAgICB0LnNlY3Rpb24gPSA1NTY7CisgICAgdC5jdXJyZW5jeSA9IDU1NjsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMTkxOworICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNTAwOworICAgIHQuZmwgPSA1MDA7CisgICAgdC5lbmRhc2ggPSA1NTY7CisgICAgdC5kYWdnZXIgPSA1NTY7CisgICAgdC5kYWdnZXJkYmwgPSA1NTY7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKKyAgICB0LnBhcmFncmFwaCA9IDUzNzsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyOworICAgIHQucXVvdGVkYmxiYXNlID0gMzMzOworICAgIHQucXVvdGVkYmxyaWdodCA9IDMzMzsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNjExOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gMTAwMDsKKyAgICB0Lm9yZGZlbWluaW5lID0gMzcwOworICAgIHQuTHNsYXNoID0gNTU2OworICAgIHQuT3NsYXNoID0gNzc4OworICAgIHQuT0UgPSAxMDAwOworICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OworICAgIHQuYWUgPSA4ODk7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDIyMjsKKyAgICB0Lm9zbGFzaCA9IDYxMTsKKyAgICB0Lm9lID0gOTQ0OworICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKKyAgICB0LklkaWVyZXNpcyA9IDI3ODsKKyAgICB0LmVhY3V0ZSA9IDU1NjsKKyAgICB0LmFicmV2ZSA9IDU1NjsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CisgICAgdC5lY2Fyb24gPSA1NTY7CisgICAgdC5ZZGllcmVzaXMgPSA2Njc7CisgICAgdC5kaXZpZGUgPSA1ODQ7CisgICAgdC5ZYWN1dGUgPSA2Njc7CisgICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFhY3V0ZSA9IDU1NjsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTAwOworICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1NTY7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNTU2OworICAgIHQuRWRpZXJlc2lzID0gNjY3OworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3Mzc7CisgICAgdC5FbWFjcm9uID0gNjY3OworICAgIHQuY2Nhcm9uID0gNTAwOworICAgIHQuYXJpbmcgPSA1NTY7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyMjI7CisgICAgdC5hZ3JhdmUgPSA1NTY7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA3MjI7CisgICAgdC5hdGlsZGUgPSA1NTY7CisgICAgdC5FZG90YWNjZW50ID0gNjY3OworICAgIHQuc2Nhcm9uID0gNTAwOworICAgIHQuc2NlZGlsbGEgPSA1MDA7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDcxOworICAgIHQuUmNhcm9uID0gNzIyOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OworICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LkFtYWNyb24gPSA2Njc7CisgICAgdC5yY2Fyb24gPSAzMzM7CisgICAgdC5jY2VkaWxsYSA9IDUwMDsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDY2NzsKKyAgICB0Lk9tYWNyb24gPSA3Nzg7CisgICAgdC5SYWN1dGUgPSA3MjI7CisgICAgdC5TYWN1dGUgPSA2Njc7CisgICAgdC5kY2Fyb24gPSA2NDM7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA1NTY7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOworICAgIHQuT2dyYXZlID0gNzc4OworICAgIHQuQWdyYXZlID0gNjY3OworICAgIHQuQWJyZXZlID0gNjY3OworICAgIHQubXVsdGlwbHkgPSA1ODQ7CisgICAgdC51YWN1dGUgPSA1NTY7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjsKKyAgICB0LnlkaWVyZXNpcyA9IDUwMDsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hZGllcmVzaXMgPSA1NTY7CisgICAgdC5lZGllcmVzaXMgPSA1NTY7CisgICAgdC5jYWN1dGUgPSA1MDA7CisgICAgdC5uYWN1dGUgPSA1NTY7CisgICAgdC51bWFjcm9uID0gNTU2OworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMjc4OworICAgIHQucGx1c21pbnVzID0gNTg0OworICAgIHQuYnJva2VuYmFyID0gMjYwOworICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKKyAgICB0LkdicmV2ZSA9IDc3ODsKKyAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2Njc7CisgICAgdC5yYWN1dGUgPSAzMzM7CisgICAgdC5vbWFjcm9uID0gNTU2OworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA3MjI7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7CisgICAgdC50Y2Fyb24gPSAzMTc7CisgICAgdC5lb2dvbmVrID0gNTU2OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDY2NzsKKyAgICB0LkFkaWVyZXNpcyA9IDY2NzsKKyAgICB0LmVncmF2ZSA9IDU1NjsKKyAgICB0LnphY3V0ZSA9IDUwMDsKKyAgICB0LmlvZ29uZWsgPSAyMjI7CisgICAgdC5PYWN1dGUgPSA3Nzg7CisgICAgdC5vYWN1dGUgPSA1NTY7CisgICAgdC5hbWFjcm9uID0gNTU2OworICAgIHQuc2FjdXRlID0gNTAwOworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNTU2OworICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZGllcmVzaXMgPSA3Nzg7CisgICAgdC5tdSA9IDU1NjsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1NTY7CisgICAgdC5Fb2dvbmVrID0gNjY3OworICAgIHQuZGNyb2F0ID0gNTU2OworICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKKyAgICB0LlNjZWRpbGxhID0gNjY3OworICAgIHQubGNhcm9uID0gMjk5OworICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGFjdXRlID0gNTU2OworICAgIHQudHJhZGVtYXJrID0gMTAwMDsKKyAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5JZ3JhdmUgPSAyNzg7CisgICAgdC5JbWFjcm9uID0gMjc4OworICAgIHQuTGNhcm9uID0gNTU2OworICAgIHQub25laGFsZiA9IDgzNDsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0Lm9jaXJjdW1mbGV4ID0gNTU2OworICAgIHQubnRpbGRlID0gNTU2OworICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LkVhY3V0ZSA9IDY2NzsKKyAgICB0LmVtYWNyb24gPSA1NTY7CisgICAgdC5nYnJldmUgPSA1NTY7CisgICAgdC5vbmVxdWFydGVyID0gODM0OworICAgIHQuU2Nhcm9uID0gNjY3OworICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0Lm9ncmF2ZSA9IDU1NjsKKyAgICB0LkNjYXJvbiA9IDcyMjsKKyAgICB0LnVncmF2ZSA9IDU1NjsKKyAgICB0LnJhZGljYWwgPSA0NTM7CisgICAgdC5EY2Fyb24gPSA3MjI7CisgICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7CisgICAgdC5OdGlsZGUgPSA3MjI7CisgICAgdC5vdGlsZGUgPSA1NTY7CisgICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5BdGlsZGUgPSA2Njc7CisgICAgdC5Bb2dvbmVrID0gNjY3OworICAgIHQuQXJpbmcgPSA2Njc7CisgICAgdC5PdGlsZGUgPSA3Nzg7CisgICAgdC56ZG90YWNjZW50ID0gNTAwOworICAgIHQuRWNhcm9uID0gNjY3OworICAgIHQuSW9nb25layA9IDI3ODsKKyAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lm1pbnVzID0gNTg0OworICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5uY2Fyb24gPSA1NTY7CisgICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC5sb2dpY2Fsbm90ID0gNTg0OworICAgIHQub2RpZXJlc2lzID0gNTU2OworICAgIHQudWRpZXJlc2lzID0gNTU2OworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5ldGggPSA1NTY7CisgICAgdC56Y2Fyb24gPSA1MDA7CisgICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKKyAgICB0LmltYWNyb24gPSAyNzg7CisgICAgdC5FdXJvID0gNTU2OworICB9KTsKKyAgdFsiSGVsdmV0aWNhLUJvbGQiXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI3ODsKKyAgICB0LmV4Y2xhbSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsID0gNDc0OworICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKKyAgICB0LmRvbGxhciA9IDU1NjsKKyAgICB0LnBlcmNlbnQgPSA4ODk7CisgICAgdC5hbXBlcnNhbmQgPSA3MjI7CisgICAgdC5xdW90ZXJpZ2h0ID0gMjc4OworICAgIHQucGFyZW5sZWZ0ID0gMzMzOworICAgIHQucGFyZW5yaWdodCA9IDMzMzsKKyAgICB0LmFzdGVyaXNrID0gMzg5OworICAgIHQucGx1cyA9IDU4NDsKKyAgICB0LmNvbW1hID0gMjc4OworICAgIHQuaHlwaGVuID0gMzMzOworICAgIHQucGVyaW9kID0gMjc4OworICAgIHQuc2xhc2ggPSAyNzg7CisgICAgdC56ZXJvID0gNTU2OworICAgIHQub25lID0gNTU2OworICAgIHQudHdvID0gNTU2OworICAgIHQudGhyZWUgPSA1NTY7CisgICAgdC5mb3VyID0gNTU2OworICAgIHQuZml2ZSA9IDU1NjsKKyAgICB0LnNpeCA9IDU1NjsKKyAgICB0LnNldmVuID0gNTU2OworICAgIHQuZWlnaHQgPSA1NTY7CisgICAgdC5uaW5lID0gNTU2OworICAgIHQuY29sb24gPSAzMzM7CisgICAgdC5zZW1pY29sb24gPSAzMzM7CisgICAgdC5sZXNzID0gNTg0OworICAgIHQuZXF1YWwgPSA1ODQ7CisgICAgdC5ncmVhdGVyID0gNTg0OworICAgIHQucXVlc3Rpb24gPSA2MTE7CisgICAgdC5hdCA9IDk3NTsKKyAgICB0LkEgPSA3MjI7CisgICAgdC5CID0gNzIyOworICAgIHQuQyA9IDcyMjsKKyAgICB0LkQgPSA3MjI7CisgICAgdC5FID0gNjY3OworICAgIHQuRiA9IDYxMTsKKyAgICB0LkcgPSA3Nzg7CisgICAgdC5IID0gNzIyOworICAgIHQuSSA9IDI3ODsKKyAgICB0LkogPSA1NTY7CisgICAgdC5LID0gNzIyOworICAgIHQuTCA9IDYxMTsKKyAgICB0Lk0gPSA4MzM7CisgICAgdC5OID0gNzIyOworICAgIHQuTyA9IDc3ODsKKyAgICB0LlAgPSA2Njc7CisgICAgdC5RID0gNzc4OworICAgIHQuUiA9IDcyMjsKKyAgICB0LlMgPSA2Njc7CisgICAgdC5UID0gNjExOworICAgIHQuVSA9IDcyMjsKKyAgICB0LlYgPSA2Njc7CisgICAgdC5XID0gOTQ0OworICAgIHQuWCA9IDY2NzsKKyAgICB0LlkgPSA2Njc7CisgICAgdC5aID0gNjExOworICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CisgICAgdC5iYWNrc2xhc2ggPSAyNzg7CisgICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CisgICAgdC5hc2NpaWNpcmN1bSA9IDU4NDsKKyAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CisgICAgdC5xdW90ZWxlZnQgPSAyNzg7CisgICAgdC5hID0gNTU2OworICAgIHQuYiA9IDYxMTsKKyAgICB0LmMgPSA1NTY7CisgICAgdC5kID0gNjExOworICAgIHQuZSA9IDU1NjsKKyAgICB0LmYgPSAzMzM7CisgICAgdC5nID0gNjExOworICAgIHQuaCA9IDYxMTsKKyAgICB0LmkgPSAyNzg7CisgICAgdC5qID0gMjc4OworICAgIHQuayA9IDU1NjsKKyAgICB0LmwgPSAyNzg7CisgICAgdC5tID0gODg5OworICAgIHQubiA9IDYxMTsKKyAgICB0Lm8gPSA2MTE7CisgICAgdC5wID0gNjExOworICAgIHQucSA9IDYxMTsKKyAgICB0LnIgPSAzODk7CisgICAgdC5zID0gNTU2OworICAgIHQudCA9IDMzMzsKKyAgICB0LnUgPSA2MTE7CisgICAgdC52ID0gNTU2OworICAgIHQudyA9IDc3ODsKKyAgICB0LnggPSA1NTY7CisgICAgdC55ID0gNTU2OworICAgIHQueiA9IDUwMDsKKyAgICB0LmJyYWNlbGVmdCA9IDM4OTsKKyAgICB0LmJhciA9IDI4MDsKKyAgICB0LmJyYWNlcmlnaHQgPSAzODk7CisgICAgdC5hc2NpaXRpbGRlID0gNTg0OworICAgIHQuZXhjbGFtZG93biA9IDMzMzsKKyAgICB0LmNlbnQgPSA1NTY7CisgICAgdC5zdGVybGluZyA9IDU1NjsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQueWVuID0gNTU2OworICAgIHQuZmxvcmluID0gNTU2OworICAgIHQuc2VjdGlvbiA9IDU1NjsKKyAgICB0LmN1cnJlbmN5ID0gNTU2OworICAgIHQucXVvdGVzaW5nbGUgPSAyMzg7CisgICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CisgICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OworICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOworICAgIHQuZmkgPSA2MTE7CisgICAgdC5mbCA9IDYxMTsKKyAgICB0LmVuZGFzaCA9IDU1NjsKKyAgICB0LmRhZ2dlciA9IDU1NjsKKyAgICB0LmRhZ2dlcmRibCA9IDU1NjsKKyAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4OworICAgIHQucGFyYWdyYXBoID0gNTU2OworICAgIHQuYnVsbGV0ID0gMzUwOworICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyNzg7CisgICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7CisgICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSAxMDAwOworICAgIHQuQUUgPSAxMDAwOworICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CisgICAgdC5Mc2xhc2ggPSA2MTE7CisgICAgdC5Pc2xhc2ggPSA3Nzg7CisgICAgdC5PRSA9IDEwMDA7CisgICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CisgICAgdC5hZSA9IDg4OTsKKyAgICB0LmRvdGxlc3NpID0gMjc4OworICAgIHQubHNsYXNoID0gMjc4OworICAgIHQub3NsYXNoID0gNjExOworICAgIHQub2UgPSA5NDQ7CisgICAgdC5nZXJtYW5kYmxzID0gNjExOworICAgIHQuSWRpZXJlc2lzID0gMjc4OworICAgIHQuZWFjdXRlID0gNTU2OworICAgIHQuYWJyZXZlID0gNTU2OworICAgIHQudWh1bmdhcnVtbGF1dCA9IDYxMTsKKyAgICB0LmVjYXJvbiA9IDU1NjsKKyAgICB0LllkaWVyZXNpcyA9IDY2NzsKKyAgICB0LmRpdmlkZSA9IDU4NDsKKyAgICB0LllhY3V0ZSA9IDY2NzsKKyAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOworICAgIHQuYWFjdXRlID0gNTU2OworICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CisgICAgdC55YWN1dGUgPSA1NTY7CisgICAgdC5zY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LlVyaW5nID0gNzIyOworICAgIHQuVWRpZXJlc2lzID0gNzIyOworICAgIHQuYW9nb25layA9IDU1NjsKKyAgICB0LlVhY3V0ZSA9IDcyMjsKKyAgICB0LnVvZ29uZWsgPSA2MTE7CisgICAgdC5FZGllcmVzaXMgPSA2Njc7CisgICAgdC5EY3JvYXQgPSA3MjI7CisgICAgdC5jb21tYWFjY2VudCA9IDI1MDsKKyAgICB0LmNvcHlyaWdodCA9IDczNzsKKyAgICB0LkVtYWNyb24gPSA2Njc7CisgICAgdC5jY2Fyb24gPSA1NTY7CisgICAgdC5hcmluZyA9IDU1NjsKKyAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKKyAgICB0LmxhY3V0ZSA9IDI3ODsKKyAgICB0LmFncmF2ZSA9IDU1NjsKKyAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LkNhY3V0ZSA9IDcyMjsKKyAgICB0LmF0aWxkZSA9IDU1NjsKKyAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CisgICAgdC5zY2Fyb24gPSA1NTY7CisgICAgdC5zY2VkaWxsYSA9IDU1NjsKKyAgICB0LmlhY3V0ZSA9IDI3ODsKKyAgICB0LmxvemVuZ2UgPSA0OTQ7CisgICAgdC5SY2Fyb24gPSA3MjI7CisgICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CisgICAgdC51Y2lyY3VtZmxleCA9IDYxMTsKKyAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuQW1hY3JvbiA9IDcyMjsKKyAgICB0LnJjYXJvbiA9IDM4OTsKKyAgICB0LmNjZWRpbGxhID0gNTU2OworICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKKyAgICB0LlRob3JuID0gNjY3OworICAgIHQuT21hY3JvbiA9IDc3ODsKKyAgICB0LlJhY3V0ZSA9IDcyMjsKKyAgICB0LlNhY3V0ZSA9IDY2NzsKKyAgICB0LmRjYXJvbiA9IDc0MzsKKyAgICB0LlVtYWNyb24gPSA3MjI7CisgICAgdC51cmluZyA9IDYxMTsKKyAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZ3JhdmUgPSA3Nzg7CisgICAgdC5BZ3JhdmUgPSA3MjI7CisgICAgdC5BYnJldmUgPSA3MjI7CisgICAgdC5tdWx0aXBseSA9IDU4NDsKKyAgICB0LnVhY3V0ZSA9IDYxMTsKKyAgICB0LlRjYXJvbiA9IDYxMTsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDk0OworICAgIHQueWRpZXJlc2lzID0gNTU2OworICAgIHQuTmFjdXRlID0gNzIyOworICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFkaWVyZXNpcyA9IDU1NjsKKyAgICB0LmVkaWVyZXNpcyA9IDU1NjsKKyAgICB0LmNhY3V0ZSA9IDU1NjsKKyAgICB0Lm5hY3V0ZSA9IDYxMTsKKyAgICB0LnVtYWNyb24gPSA2MTE7CisgICAgdC5OY2Fyb24gPSA3MjI7CisgICAgdC5JYWN1dGUgPSAyNzg7CisgICAgdC5wbHVzbWludXMgPSA1ODQ7CisgICAgdC5icm9rZW5iYXIgPSAyODA7CisgICAgdC5yZWdpc3RlcmVkID0gNzM3OworICAgIHQuR2JyZXZlID0gNzc4OworICAgIHQuSWRvdGFjY2VudCA9IDI3ODsKKyAgICB0LnN1bW1hdGlvbiA9IDYwMDsKKyAgICB0LkVncmF2ZSA9IDY2NzsKKyAgICB0LnJhY3V0ZSA9IDM4OTsKKyAgICB0Lm9tYWNyb24gPSA2MTE7CisgICAgdC5aYWN1dGUgPSA2MTE7CisgICAgdC5aY2Fyb24gPSA2MTE7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5FdGggPSA3MjI7CisgICAgdC5DY2VkaWxsYSA9IDcyMjsKKyAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LnRjYXJvbiA9IDM4OTsKKyAgICB0LmVvZ29uZWsgPSA1NTY7CisgICAgdC5Vb2dvbmVrID0gNzIyOworICAgIHQuQWFjdXRlID0gNzIyOworICAgIHQuQWRpZXJlc2lzID0gNzIyOworICAgIHQuZWdyYXZlID0gNTU2OworICAgIHQuemFjdXRlID0gNTAwOworICAgIHQuaW9nb25layA9IDI3ODsKKyAgICB0Lk9hY3V0ZSA9IDc3ODsKKyAgICB0Lm9hY3V0ZSA9IDYxMTsKKyAgICB0LmFtYWNyb24gPSA1NTY7CisgICAgdC5zYWN1dGUgPSA1NTY7CisgICAgdC5pZGllcmVzaXMgPSAyNzg7CisgICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKKyAgICB0LlVncmF2ZSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQudGhvcm4gPSA2MTE7CisgICAgdC50d29zdXBlcmlvciA9IDMzMzsKKyAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKKyAgICB0Lm11ID0gNjExOworICAgIHQuaWdyYXZlID0gMjc4OworICAgIHQub2h1bmdhcnVtbGF1dCA9IDYxMTsKKyAgICB0LkVvZ29uZWsgPSA2Njc7CisgICAgdC5kY3JvYXQgPSA2MTE7CisgICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OworICAgIHQuU2NlZGlsbGEgPSA2Njc7CisgICAgdC5sY2Fyb24gPSA0MDA7CisgICAgdC5LY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MYWN1dGUgPSA2MTE7CisgICAgdC50cmFkZW1hcmsgPSAxMDAwOworICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKKyAgICB0LklncmF2ZSA9IDI3ODsKKyAgICB0LkltYWNyb24gPSAyNzg7CisgICAgdC5MY2Fyb24gPSA2MTE7CisgICAgdC5vbmVoYWxmID0gODM0OworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA2MTE7CisgICAgdC5udGlsZGUgPSA2MTE7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjY3OworICAgIHQuZW1hY3JvbiA9IDU1NjsKKyAgICB0LmdicmV2ZSA9IDYxMTsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CisgICAgdC5TY2Fyb24gPSA2Njc7CisgICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNjExOworICAgIHQuQ2Nhcm9uID0gNzIyOworICAgIHQudWdyYXZlID0gNjExOworICAgIHQucmFkaWNhbCA9IDU0OTsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKKyAgICB0Lk50aWxkZSA9IDcyMjsKKyAgICB0Lm90aWxkZSA9IDYxMTsKKyAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LkF0aWxkZSA9IDcyMjsKKyAgICB0LkFvZ29uZWsgPSA3MjI7CisgICAgdC5BcmluZyA9IDcyMjsKKyAgICB0Lk90aWxkZSA9IDc3ODsKKyAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7CisgICAgdC5FY2Fyb24gPSA2Njc7CisgICAgdC5Jb2dvbmVrID0gMjc4OworICAgIHQua2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQubWludXMgPSA1ODQ7CisgICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKKyAgICB0Lm5jYXJvbiA9IDYxMTsKKyAgICB0LnRjb21tYWFjY2VudCA9IDMzMzsKKyAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CisgICAgdC5vZGllcmVzaXMgPSA2MTE7CisgICAgdC51ZGllcmVzaXMgPSA2MTE7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LmV0aCA9IDYxMTsKKyAgICB0LnpjYXJvbiA9IDUwMDsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDYxMTsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1NTY7CisgIH0pOworICB0WyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI3ODsKKyAgICB0LmV4Y2xhbSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsID0gNDc0OworICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKKyAgICB0LmRvbGxhciA9IDU1NjsKKyAgICB0LnBlcmNlbnQgPSA4ODk7CisgICAgdC5hbXBlcnNhbmQgPSA3MjI7CisgICAgdC5xdW90ZXJpZ2h0ID0gMjc4OworICAgIHQucGFyZW5sZWZ0ID0gMzMzOworICAgIHQucGFyZW5yaWdodCA9IDMzMzsKKyAgICB0LmFzdGVyaXNrID0gMzg5OworICAgIHQucGx1cyA9IDU4NDsKKyAgICB0LmNvbW1hID0gMjc4OworICAgIHQuaHlwaGVuID0gMzMzOworICAgIHQucGVyaW9kID0gMjc4OworICAgIHQuc2xhc2ggPSAyNzg7CisgICAgdC56ZXJvID0gNTU2OworICAgIHQub25lID0gNTU2OworICAgIHQudHdvID0gNTU2OworICAgIHQudGhyZWUgPSA1NTY7CisgICAgdC5mb3VyID0gNTU2OworICAgIHQuZml2ZSA9IDU1NjsKKyAgICB0LnNpeCA9IDU1NjsKKyAgICB0LnNldmVuID0gNTU2OworICAgIHQuZWlnaHQgPSA1NTY7CisgICAgdC5uaW5lID0gNTU2OworICAgIHQuY29sb24gPSAzMzM7CisgICAgdC5zZW1pY29sb24gPSAzMzM7CisgICAgdC5sZXNzID0gNTg0OworICAgIHQuZXF1YWwgPSA1ODQ7CisgICAgdC5ncmVhdGVyID0gNTg0OworICAgIHQucXVlc3Rpb24gPSA2MTE7CisgICAgdC5hdCA9IDk3NTsKKyAgICB0LkEgPSA3MjI7CisgICAgdC5CID0gNzIyOworICAgIHQuQyA9IDcyMjsKKyAgICB0LkQgPSA3MjI7CisgICAgdC5FID0gNjY3OworICAgIHQuRiA9IDYxMTsKKyAgICB0LkcgPSA3Nzg7CisgICAgdC5IID0gNzIyOworICAgIHQuSSA9IDI3ODsKKyAgICB0LkogPSA1NTY7CisgICAgdC5LID0gNzIyOworICAgIHQuTCA9IDYxMTsKKyAgICB0Lk0gPSA4MzM7CisgICAgdC5OID0gNzIyOworICAgIHQuTyA9IDc3ODsKKyAgICB0LlAgPSA2Njc7CisgICAgdC5RID0gNzc4OworICAgIHQuUiA9IDcyMjsKKyAgICB0LlMgPSA2Njc7CisgICAgdC5UID0gNjExOworICAgIHQuVSA9IDcyMjsKKyAgICB0LlYgPSA2Njc7CisgICAgdC5XID0gOTQ0OworICAgIHQuWCA9IDY2NzsKKyAgICB0LlkgPSA2Njc7CisgICAgdC5aID0gNjExOworICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CisgICAgdC5iYWNrc2xhc2ggPSAyNzg7CisgICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CisgICAgdC5hc2NpaWNpcmN1bSA9IDU4NDsKKyAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CisgICAgdC5xdW90ZWxlZnQgPSAyNzg7CisgICAgdC5hID0gNTU2OworICAgIHQuYiA9IDYxMTsKKyAgICB0LmMgPSA1NTY7CisgICAgdC5kID0gNjExOworICAgIHQuZSA9IDU1NjsKKyAgICB0LmYgPSAzMzM7CisgICAgdC5nID0gNjExOworICAgIHQuaCA9IDYxMTsKKyAgICB0LmkgPSAyNzg7CisgICAgdC5qID0gMjc4OworICAgIHQuayA9IDU1NjsKKyAgICB0LmwgPSAyNzg7CisgICAgdC5tID0gODg5OworICAgIHQubiA9IDYxMTsKKyAgICB0Lm8gPSA2MTE7CisgICAgdC5wID0gNjExOworICAgIHQucSA9IDYxMTsKKyAgICB0LnIgPSAzODk7CisgICAgdC5zID0gNTU2OworICAgIHQudCA9IDMzMzsKKyAgICB0LnUgPSA2MTE7CisgICAgdC52ID0gNTU2OworICAgIHQudyA9IDc3ODsKKyAgICB0LnggPSA1NTY7CisgICAgdC55ID0gNTU2OworICAgIHQueiA9IDUwMDsKKyAgICB0LmJyYWNlbGVmdCA9IDM4OTsKKyAgICB0LmJhciA9IDI4MDsKKyAgICB0LmJyYWNlcmlnaHQgPSAzODk7CisgICAgdC5hc2NpaXRpbGRlID0gNTg0OworICAgIHQuZXhjbGFtZG93biA9IDMzMzsKKyAgICB0LmNlbnQgPSA1NTY7CisgICAgdC5zdGVybGluZyA9IDU1NjsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQueWVuID0gNTU2OworICAgIHQuZmxvcmluID0gNTU2OworICAgIHQuc2VjdGlvbiA9IDU1NjsKKyAgICB0LmN1cnJlbmN5ID0gNTU2OworICAgIHQucXVvdGVzaW5nbGUgPSAyMzg7CisgICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CisgICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OworICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOworICAgIHQuZmkgPSA2MTE7CisgICAgdC5mbCA9IDYxMTsKKyAgICB0LmVuZGFzaCA9IDU1NjsKKyAgICB0LmRhZ2dlciA9IDU1NjsKKyAgICB0LmRhZ2dlcmRibCA9IDU1NjsKKyAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4OworICAgIHQucGFyYWdyYXBoID0gNTU2OworICAgIHQuYnVsbGV0ID0gMzUwOworICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyNzg7CisgICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7CisgICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSAxMDAwOworICAgIHQuQUUgPSAxMDAwOworICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CisgICAgdC5Mc2xhc2ggPSA2MTE7CisgICAgdC5Pc2xhc2ggPSA3Nzg7CisgICAgdC5PRSA9IDEwMDA7CisgICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CisgICAgdC5hZSA9IDg4OTsKKyAgICB0LmRvdGxlc3NpID0gMjc4OworICAgIHQubHNsYXNoID0gMjc4OworICAgIHQub3NsYXNoID0gNjExOworICAgIHQub2UgPSA5NDQ7CisgICAgdC5nZXJtYW5kYmxzID0gNjExOworICAgIHQuSWRpZXJlc2lzID0gMjc4OworICAgIHQuZWFjdXRlID0gNTU2OworICAgIHQuYWJyZXZlID0gNTU2OworICAgIHQudWh1bmdhcnVtbGF1dCA9IDYxMTsKKyAgICB0LmVjYXJvbiA9IDU1NjsKKyAgICB0LllkaWVyZXNpcyA9IDY2NzsKKyAgICB0LmRpdmlkZSA9IDU4NDsKKyAgICB0LllhY3V0ZSA9IDY2NzsKKyAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOworICAgIHQuYWFjdXRlID0gNTU2OworICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CisgICAgdC55YWN1dGUgPSA1NTY7CisgICAgdC5zY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LlVyaW5nID0gNzIyOworICAgIHQuVWRpZXJlc2lzID0gNzIyOworICAgIHQuYW9nb25layA9IDU1NjsKKyAgICB0LlVhY3V0ZSA9IDcyMjsKKyAgICB0LnVvZ29uZWsgPSA2MTE7CisgICAgdC5FZGllcmVzaXMgPSA2Njc7CisgICAgdC5EY3JvYXQgPSA3MjI7CisgICAgdC5jb21tYWFjY2VudCA9IDI1MDsKKyAgICB0LmNvcHlyaWdodCA9IDczNzsKKyAgICB0LkVtYWNyb24gPSA2Njc7CisgICAgdC5jY2Fyb24gPSA1NTY7CisgICAgdC5hcmluZyA9IDU1NjsKKyAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKKyAgICB0LmxhY3V0ZSA9IDI3ODsKKyAgICB0LmFncmF2ZSA9IDU1NjsKKyAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LkNhY3V0ZSA9IDcyMjsKKyAgICB0LmF0aWxkZSA9IDU1NjsKKyAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CisgICAgdC5zY2Fyb24gPSA1NTY7CisgICAgdC5zY2VkaWxsYSA9IDU1NjsKKyAgICB0LmlhY3V0ZSA9IDI3ODsKKyAgICB0LmxvemVuZ2UgPSA0OTQ7CisgICAgdC5SY2Fyb24gPSA3MjI7CisgICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CisgICAgdC51Y2lyY3VtZmxleCA9IDYxMTsKKyAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuQW1hY3JvbiA9IDcyMjsKKyAgICB0LnJjYXJvbiA9IDM4OTsKKyAgICB0LmNjZWRpbGxhID0gNTU2OworICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKKyAgICB0LlRob3JuID0gNjY3OworICAgIHQuT21hY3JvbiA9IDc3ODsKKyAgICB0LlJhY3V0ZSA9IDcyMjsKKyAgICB0LlNhY3V0ZSA9IDY2NzsKKyAgICB0LmRjYXJvbiA9IDc0MzsKKyAgICB0LlVtYWNyb24gPSA3MjI7CisgICAgdC51cmluZyA9IDYxMTsKKyAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZ3JhdmUgPSA3Nzg7CisgICAgdC5BZ3JhdmUgPSA3MjI7CisgICAgdC5BYnJldmUgPSA3MjI7CisgICAgdC5tdWx0aXBseSA9IDU4NDsKKyAgICB0LnVhY3V0ZSA9IDYxMTsKKyAgICB0LlRjYXJvbiA9IDYxMTsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDk0OworICAgIHQueWRpZXJlc2lzID0gNTU2OworICAgIHQuTmFjdXRlID0gNzIyOworICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFkaWVyZXNpcyA9IDU1NjsKKyAgICB0LmVkaWVyZXNpcyA9IDU1NjsKKyAgICB0LmNhY3V0ZSA9IDU1NjsKKyAgICB0Lm5hY3V0ZSA9IDYxMTsKKyAgICB0LnVtYWNyb24gPSA2MTE7CisgICAgdC5OY2Fyb24gPSA3MjI7CisgICAgdC5JYWN1dGUgPSAyNzg7CisgICAgdC5wbHVzbWludXMgPSA1ODQ7CisgICAgdC5icm9rZW5iYXIgPSAyODA7CisgICAgdC5yZWdpc3RlcmVkID0gNzM3OworICAgIHQuR2JyZXZlID0gNzc4OworICAgIHQuSWRvdGFjY2VudCA9IDI3ODsKKyAgICB0LnN1bW1hdGlvbiA9IDYwMDsKKyAgICB0LkVncmF2ZSA9IDY2NzsKKyAgICB0LnJhY3V0ZSA9IDM4OTsKKyAgICB0Lm9tYWNyb24gPSA2MTE7CisgICAgdC5aYWN1dGUgPSA2MTE7CisgICAgdC5aY2Fyb24gPSA2MTE7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5FdGggPSA3MjI7CisgICAgdC5DY2VkaWxsYSA9IDcyMjsKKyAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LnRjYXJvbiA9IDM4OTsKKyAgICB0LmVvZ29uZWsgPSA1NTY7CisgICAgdC5Vb2dvbmVrID0gNzIyOworICAgIHQuQWFjdXRlID0gNzIyOworICAgIHQuQWRpZXJlc2lzID0gNzIyOworICAgIHQuZWdyYXZlID0gNTU2OworICAgIHQuemFjdXRlID0gNTAwOworICAgIHQuaW9nb25layA9IDI3ODsKKyAgICB0Lk9hY3V0ZSA9IDc3ODsKKyAgICB0Lm9hY3V0ZSA9IDYxMTsKKyAgICB0LmFtYWNyb24gPSA1NTY7CisgICAgdC5zYWN1dGUgPSA1NTY7CisgICAgdC5pZGllcmVzaXMgPSAyNzg7CisgICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKKyAgICB0LlVncmF2ZSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQudGhvcm4gPSA2MTE7CisgICAgdC50d29zdXBlcmlvciA9IDMzMzsKKyAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKKyAgICB0Lm11ID0gNjExOworICAgIHQuaWdyYXZlID0gMjc4OworICAgIHQub2h1bmdhcnVtbGF1dCA9IDYxMTsKKyAgICB0LkVvZ29uZWsgPSA2Njc7CisgICAgdC5kY3JvYXQgPSA2MTE7CisgICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OworICAgIHQuU2NlZGlsbGEgPSA2Njc7CisgICAgdC5sY2Fyb24gPSA0MDA7CisgICAgdC5LY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MYWN1dGUgPSA2MTE7CisgICAgdC50cmFkZW1hcmsgPSAxMDAwOworICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKKyAgICB0LklncmF2ZSA9IDI3ODsKKyAgICB0LkltYWNyb24gPSAyNzg7CisgICAgdC5MY2Fyb24gPSA2MTE7CisgICAgdC5vbmVoYWxmID0gODM0OworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA2MTE7CisgICAgdC5udGlsZGUgPSA2MTE7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjY3OworICAgIHQuZW1hY3JvbiA9IDU1NjsKKyAgICB0LmdicmV2ZSA9IDYxMTsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CisgICAgdC5TY2Fyb24gPSA2Njc7CisgICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNjExOworICAgIHQuQ2Nhcm9uID0gNzIyOworICAgIHQudWdyYXZlID0gNjExOworICAgIHQucmFkaWNhbCA9IDU0OTsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKKyAgICB0Lk50aWxkZSA9IDcyMjsKKyAgICB0Lm90aWxkZSA9IDYxMTsKKyAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LkF0aWxkZSA9IDcyMjsKKyAgICB0LkFvZ29uZWsgPSA3MjI7CisgICAgdC5BcmluZyA9IDcyMjsKKyAgICB0Lk90aWxkZSA9IDc3ODsKKyAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7CisgICAgdC5FY2Fyb24gPSA2Njc7CisgICAgdC5Jb2dvbmVrID0gMjc4OworICAgIHQua2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQubWludXMgPSA1ODQ7CisgICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKKyAgICB0Lm5jYXJvbiA9IDYxMTsKKyAgICB0LnRjb21tYWFjY2VudCA9IDMzMzsKKyAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CisgICAgdC5vZGllcmVzaXMgPSA2MTE7CisgICAgdC51ZGllcmVzaXMgPSA2MTE7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LmV0aCA9IDYxMTsKKyAgICB0LnpjYXJvbiA9IDUwMDsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDYxMTsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1NTY7CisgIH0pOworICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgICB0LnNwYWNlID0gMjc4OworICAgIHQuZXhjbGFtID0gMjc4OworICAgIHQucXVvdGVkYmwgPSAzNTU7CisgICAgdC5udW1iZXJzaWduID0gNTU2OworICAgIHQuZG9sbGFyID0gNTU2OworICAgIHQucGVyY2VudCA9IDg4OTsKKyAgICB0LmFtcGVyc2FuZCA9IDY2NzsKKyAgICB0LnF1b3RlcmlnaHQgPSAyMjI7CisgICAgdC5wYXJlbmxlZnQgPSAzMzM7CisgICAgdC5wYXJlbnJpZ2h0ID0gMzMzOworICAgIHQuYXN0ZXJpc2sgPSAzODk7CisgICAgdC5wbHVzID0gNTg0OworICAgIHQuY29tbWEgPSAyNzg7CisgICAgdC5oeXBoZW4gPSAzMzM7CisgICAgdC5wZXJpb2QgPSAyNzg7CisgICAgdC5zbGFzaCA9IDI3ODsKKyAgICB0Lnplcm8gPSA1NTY7CisgICAgdC5vbmUgPSA1NTY7CisgICAgdC50d28gPSA1NTY7CisgICAgdC50aHJlZSA9IDU1NjsKKyAgICB0LmZvdXIgPSA1NTY7CisgICAgdC5maXZlID0gNTU2OworICAgIHQuc2l4ID0gNTU2OworICAgIHQuc2V2ZW4gPSA1NTY7CisgICAgdC5laWdodCA9IDU1NjsKKyAgICB0Lm5pbmUgPSA1NTY7CisgICAgdC5jb2xvbiA9IDI3ODsKKyAgICB0LnNlbWljb2xvbiA9IDI3ODsKKyAgICB0Lmxlc3MgPSA1ODQ7CisgICAgdC5lcXVhbCA9IDU4NDsKKyAgICB0LmdyZWF0ZXIgPSA1ODQ7CisgICAgdC5xdWVzdGlvbiA9IDU1NjsKKyAgICB0LmF0ID0gMTAxNTsKKyAgICB0LkEgPSA2Njc7CisgICAgdC5CID0gNjY3OworICAgIHQuQyA9IDcyMjsKKyAgICB0LkQgPSA3MjI7CisgICAgdC5FID0gNjY3OworICAgIHQuRiA9IDYxMTsKKyAgICB0LkcgPSA3Nzg7CisgICAgdC5IID0gNzIyOworICAgIHQuSSA9IDI3ODsKKyAgICB0LkogPSA1MDA7CisgICAgdC5LID0gNjY3OworICAgIHQuTCA9IDU1NjsKKyAgICB0Lk0gPSA4MzM7CisgICAgdC5OID0gNzIyOworICAgIHQuTyA9IDc3ODsKKyAgICB0LlAgPSA2Njc7CisgICAgdC5RID0gNzc4OworICAgIHQuUiA9IDcyMjsKKyAgICB0LlMgPSA2Njc7CisgICAgdC5UID0gNjExOworICAgIHQuVSA9IDcyMjsKKyAgICB0LlYgPSA2Njc7CisgICAgdC5XID0gOTQ0OworICAgIHQuWCA9IDY2NzsKKyAgICB0LlkgPSA2Njc7CisgICAgdC5aID0gNjExOworICAgIHQuYnJhY2tldGxlZnQgPSAyNzg7CisgICAgdC5iYWNrc2xhc2ggPSAyNzg7CisgICAgdC5icmFja2V0cmlnaHQgPSAyNzg7CisgICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKKyAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CisgICAgdC5xdW90ZWxlZnQgPSAyMjI7CisgICAgdC5hID0gNTU2OworICAgIHQuYiA9IDU1NjsKKyAgICB0LmMgPSA1MDA7CisgICAgdC5kID0gNTU2OworICAgIHQuZSA9IDU1NjsKKyAgICB0LmYgPSAyNzg7CisgICAgdC5nID0gNTU2OworICAgIHQuaCA9IDU1NjsKKyAgICB0LmkgPSAyMjI7CisgICAgdC5qID0gMjIyOworICAgIHQuayA9IDUwMDsKKyAgICB0LmwgPSAyMjI7CisgICAgdC5tID0gODMzOworICAgIHQubiA9IDU1NjsKKyAgICB0Lm8gPSA1NTY7CisgICAgdC5wID0gNTU2OworICAgIHQucSA9IDU1NjsKKyAgICB0LnIgPSAzMzM7CisgICAgdC5zID0gNTAwOworICAgIHQudCA9IDI3ODsKKyAgICB0LnUgPSA1NTY7CisgICAgdC52ID0gNTAwOworICAgIHQudyA9IDcyMjsKKyAgICB0LnggPSA1MDA7CisgICAgdC55ID0gNTAwOworICAgIHQueiA9IDUwMDsKKyAgICB0LmJyYWNlbGVmdCA9IDMzNDsKKyAgICB0LmJhciA9IDI2MDsKKyAgICB0LmJyYWNlcmlnaHQgPSAzMzQ7CisgICAgdC5hc2NpaXRpbGRlID0gNTg0OworICAgIHQuZXhjbGFtZG93biA9IDMzMzsKKyAgICB0LmNlbnQgPSA1NTY7CisgICAgdC5zdGVybGluZyA9IDU1NjsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQueWVuID0gNTU2OworICAgIHQuZmxvcmluID0gNTU2OworICAgIHQuc2VjdGlvbiA9IDU1NjsKKyAgICB0LmN1cnJlbmN5ID0gNTU2OworICAgIHQucXVvdGVzaW5nbGUgPSAxOTE7CisgICAgdC5xdW90ZWRibGxlZnQgPSAzMzM7CisgICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OworICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOworICAgIHQuZmkgPSA1MDA7CisgICAgdC5mbCA9IDUwMDsKKyAgICB0LmVuZGFzaCA9IDU1NjsKKyAgICB0LmRhZ2dlciA9IDU1NjsKKyAgICB0LmRhZ2dlcmRibCA9IDU1NjsKKyAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4OworICAgIHQucGFyYWdyYXBoID0gNTM3OworICAgIHQuYnVsbGV0ID0gMzUwOworICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyMjI7CisgICAgdC5xdW90ZWRibGJhc2UgPSAzMzM7CisgICAgdC5xdW90ZWRibHJpZ2h0ID0gMzMzOworICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSAxMDAwOworICAgIHQuQUUgPSAxMDAwOworICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CisgICAgdC5Mc2xhc2ggPSA1NTY7CisgICAgdC5Pc2xhc2ggPSA3Nzg7CisgICAgdC5PRSA9IDEwMDA7CisgICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CisgICAgdC5hZSA9IDg4OTsKKyAgICB0LmRvdGxlc3NpID0gMjc4OworICAgIHQubHNsYXNoID0gMjIyOworICAgIHQub3NsYXNoID0gNjExOworICAgIHQub2UgPSA5NDQ7CisgICAgdC5nZXJtYW5kYmxzID0gNjExOworICAgIHQuSWRpZXJlc2lzID0gMjc4OworICAgIHQuZWFjdXRlID0gNTU2OworICAgIHQuYWJyZXZlID0gNTU2OworICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjsKKyAgICB0LmVjYXJvbiA9IDU1NjsKKyAgICB0LllkaWVyZXNpcyA9IDY2NzsKKyAgICB0LmRpdmlkZSA9IDU4NDsKKyAgICB0LllhY3V0ZSA9IDY2NzsKKyAgICB0LkFjaXJjdW1mbGV4ID0gNjY3OworICAgIHQuYWFjdXRlID0gNTU2OworICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CisgICAgdC55YWN1dGUgPSA1MDA7CisgICAgdC5zY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LlVyaW5nID0gNzIyOworICAgIHQuVWRpZXJlc2lzID0gNzIyOworICAgIHQuYW9nb25layA9IDU1NjsKKyAgICB0LlVhY3V0ZSA9IDcyMjsKKyAgICB0LnVvZ29uZWsgPSA1NTY7CisgICAgdC5FZGllcmVzaXMgPSA2Njc7CisgICAgdC5EY3JvYXQgPSA3MjI7CisgICAgdC5jb21tYWFjY2VudCA9IDI1MDsKKyAgICB0LmNvcHlyaWdodCA9IDczNzsKKyAgICB0LkVtYWNyb24gPSA2Njc7CisgICAgdC5jY2Fyb24gPSA1MDA7CisgICAgdC5hcmluZyA9IDU1NjsKKyAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKKyAgICB0LmxhY3V0ZSA9IDIyMjsKKyAgICB0LmFncmF2ZSA9IDU1NjsKKyAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LkNhY3V0ZSA9IDcyMjsKKyAgICB0LmF0aWxkZSA9IDU1NjsKKyAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CisgICAgdC5zY2Fyb24gPSA1MDA7CisgICAgdC5zY2VkaWxsYSA9IDUwMDsKKyAgICB0LmlhY3V0ZSA9IDI3ODsKKyAgICB0LmxvemVuZ2UgPSA0NzE7CisgICAgdC5SY2Fyb24gPSA3MjI7CisgICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CisgICAgdC51Y2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuQW1hY3JvbiA9IDY2NzsKKyAgICB0LnJjYXJvbiA9IDMzMzsKKyAgICB0LmNjZWRpbGxhID0gNTAwOworICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKKyAgICB0LlRob3JuID0gNjY3OworICAgIHQuT21hY3JvbiA9IDc3ODsKKyAgICB0LlJhY3V0ZSA9IDcyMjsKKyAgICB0LlNhY3V0ZSA9IDY2NzsKKyAgICB0LmRjYXJvbiA9IDY0MzsKKyAgICB0LlVtYWNyb24gPSA3MjI7CisgICAgdC51cmluZyA9IDU1NjsKKyAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZ3JhdmUgPSA3Nzg7CisgICAgdC5BZ3JhdmUgPSA2Njc7CisgICAgdC5BYnJldmUgPSA2Njc7CisgICAgdC5tdWx0aXBseSA9IDU4NDsKKyAgICB0LnVhY3V0ZSA9IDU1NjsKKyAgICB0LlRjYXJvbiA9IDYxMTsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDc2OworICAgIHQueWRpZXJlc2lzID0gNTAwOworICAgIHQuTmFjdXRlID0gNzIyOworICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFkaWVyZXNpcyA9IDU1NjsKKyAgICB0LmVkaWVyZXNpcyA9IDU1NjsKKyAgICB0LmNhY3V0ZSA9IDUwMDsKKyAgICB0Lm5hY3V0ZSA9IDU1NjsKKyAgICB0LnVtYWNyb24gPSA1NTY7CisgICAgdC5OY2Fyb24gPSA3MjI7CisgICAgdC5JYWN1dGUgPSAyNzg7CisgICAgdC5wbHVzbWludXMgPSA1ODQ7CisgICAgdC5icm9rZW5iYXIgPSAyNjA7CisgICAgdC5yZWdpc3RlcmVkID0gNzM3OworICAgIHQuR2JyZXZlID0gNzc4OworICAgIHQuSWRvdGFjY2VudCA9IDI3ODsKKyAgICB0LnN1bW1hdGlvbiA9IDYwMDsKKyAgICB0LkVncmF2ZSA9IDY2NzsKKyAgICB0LnJhY3V0ZSA9IDMzMzsKKyAgICB0Lm9tYWNyb24gPSA1NTY7CisgICAgdC5aYWN1dGUgPSA2MTE7CisgICAgdC5aY2Fyb24gPSA2MTE7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5FdGggPSA3MjI7CisgICAgdC5DY2VkaWxsYSA9IDcyMjsKKyAgICB0Lmxjb21tYWFjY2VudCA9IDIyMjsKKyAgICB0LnRjYXJvbiA9IDMxNzsKKyAgICB0LmVvZ29uZWsgPSA1NTY7CisgICAgdC5Vb2dvbmVrID0gNzIyOworICAgIHQuQWFjdXRlID0gNjY3OworICAgIHQuQWRpZXJlc2lzID0gNjY3OworICAgIHQuZWdyYXZlID0gNTU2OworICAgIHQuemFjdXRlID0gNTAwOworICAgIHQuaW9nb25layA9IDIyMjsKKyAgICB0Lk9hY3V0ZSA9IDc3ODsKKyAgICB0Lm9hY3V0ZSA9IDU1NjsKKyAgICB0LmFtYWNyb24gPSA1NTY7CisgICAgdC5zYWN1dGUgPSA1MDA7CisgICAgdC5pZGllcmVzaXMgPSAyNzg7CisgICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKKyAgICB0LlVncmF2ZSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQudGhvcm4gPSA1NTY7CisgICAgdC50d29zdXBlcmlvciA9IDMzMzsKKyAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKKyAgICB0Lm11ID0gNTU2OworICAgIHQuaWdyYXZlID0gMjc4OworICAgIHQub2h1bmdhcnVtbGF1dCA9IDU1NjsKKyAgICB0LkVvZ29uZWsgPSA2Njc7CisgICAgdC5kY3JvYXQgPSA1NTY7CisgICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OworICAgIHQuU2NlZGlsbGEgPSA2Njc7CisgICAgdC5sY2Fyb24gPSAyOTk7CisgICAgdC5LY29tbWFhY2NlbnQgPSA2Njc7CisgICAgdC5MYWN1dGUgPSA1NTY7CisgICAgdC50cmFkZW1hcmsgPSAxMDAwOworICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKKyAgICB0LklncmF2ZSA9IDI3ODsKKyAgICB0LkltYWNyb24gPSAyNzg7CisgICAgdC5MY2Fyb24gPSA1NTY7CisgICAgdC5vbmVoYWxmID0gODM0OworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA1NTY7CisgICAgdC5udGlsZGUgPSA1NTY7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjY3OworICAgIHQuZW1hY3JvbiA9IDU1NjsKKyAgICB0LmdicmV2ZSA9IDU1NjsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CisgICAgdC5TY2Fyb24gPSA2Njc7CisgICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNTU2OworICAgIHQuQ2Nhcm9uID0gNzIyOworICAgIHQudWdyYXZlID0gNTU2OworICAgIHQucmFkaWNhbCA9IDQ1MzsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKKyAgICB0Lk50aWxkZSA9IDcyMjsKKyAgICB0Lm90aWxkZSA9IDU1NjsKKyAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0LkF0aWxkZSA9IDY2NzsKKyAgICB0LkFvZ29uZWsgPSA2Njc7CisgICAgdC5BcmluZyA9IDY2NzsKKyAgICB0Lk90aWxkZSA9IDc3ODsKKyAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7CisgICAgdC5FY2Fyb24gPSA2Njc7CisgICAgdC5Jb2dvbmVrID0gMjc4OworICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQubWludXMgPSA1ODQ7CisgICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKKyAgICB0Lm5jYXJvbiA9IDU1NjsKKyAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CisgICAgdC5vZGllcmVzaXMgPSA1NTY7CisgICAgdC51ZGllcmVzaXMgPSA1NTY7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0LmV0aCA9IDU1NjsKKyAgICB0LnpjYXJvbiA9IDUwMDsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1NTY7CisgIH0pOworICB0LlN5bWJvbCA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI1MDsKKyAgICB0LmV4Y2xhbSA9IDMzMzsKKyAgICB0LnVuaXZlcnNhbCA9IDcxMzsKKyAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CisgICAgdC5leGlzdGVudGlhbCA9IDU0OTsKKyAgICB0LnBlcmNlbnQgPSA4MzM7CisgICAgdC5hbXBlcnNhbmQgPSA3Nzg7CisgICAgdC5zdWNodGhhdCA9IDQzOTsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3Rlcmlza21hdGggPSA1MDA7CisgICAgdC5wbHVzID0gNTQ5OworICAgIHQuY29tbWEgPSAyNTA7CisgICAgdC5taW51cyA9IDU0OTsKKyAgICB0LnBlcmlvZCA9IDI1MDsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDUwMDsKKyAgICB0Lm9uZSA9IDUwMDsKKyAgICB0LnR3byA9IDUwMDsKKyAgICB0LnRocmVlID0gNTAwOworICAgIHQuZm91ciA9IDUwMDsKKyAgICB0LmZpdmUgPSA1MDA7CisgICAgdC5zaXggPSA1MDA7CisgICAgdC5zZXZlbiA9IDUwMDsKKyAgICB0LmVpZ2h0ID0gNTAwOworICAgIHQubmluZSA9IDUwMDsKKyAgICB0LmNvbG9uID0gMjc4OworICAgIHQuc2VtaWNvbG9uID0gMjc4OworICAgIHQubGVzcyA9IDU0OTsKKyAgICB0LmVxdWFsID0gNTQ5OworICAgIHQuZ3JlYXRlciA9IDU0OTsKKyAgICB0LnF1ZXN0aW9uID0gNDQ0OworICAgIHQuY29uZ3J1ZW50ID0gNTQ5OworICAgIHQuQWxwaGEgPSA3MjI7CisgICAgdC5CZXRhID0gNjY3OworICAgIHQuQ2hpID0gNzIyOworICAgIHQuRGVsdGEgPSA2MTI7CisgICAgdC5FcHNpbG9uID0gNjExOworICAgIHQuUGhpID0gNzYzOworICAgIHQuR2FtbWEgPSA2MDM7CisgICAgdC5FdGEgPSA3MjI7CisgICAgdC5Jb3RhID0gMzMzOworICAgIHQudGhldGExID0gNjMxOworICAgIHQuS2FwcGEgPSA3MjI7CisgICAgdC5MYW1iZGEgPSA2ODY7CisgICAgdC5NdSA9IDg4OTsKKyAgICB0Lk51ID0gNzIyOworICAgIHQuT21pY3JvbiA9IDcyMjsKKyAgICB0LlBpID0gNzY4OworICAgIHQuVGhldGEgPSA3NDE7CisgICAgdC5SaG8gPSA1NTY7CisgICAgdC5TaWdtYSA9IDU5MjsKKyAgICB0LlRhdSA9IDYxMTsKKyAgICB0LlVwc2lsb24gPSA2OTA7CisgICAgdC5zaWdtYTEgPSA0Mzk7CisgICAgdC5PbWVnYSA9IDc2ODsKKyAgICB0LlhpID0gNjQ1OworICAgIHQuUHNpID0gNzk1OworICAgIHQuWmV0YSA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOworICAgIHQudGhlcmVmb3JlID0gODYzOworICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOworICAgIHQucGVycGVuZGljdWxhciA9IDY1ODsKKyAgICB0LnVuZGVyc2NvcmUgPSA1MDA7CisgICAgdC5yYWRpY2FsZXggPSA1MDA7CisgICAgdC5hbHBoYSA9IDYzMTsKKyAgICB0LmJldGEgPSA1NDk7CisgICAgdC5jaGkgPSA1NDk7CisgICAgdC5kZWx0YSA9IDQ5NDsKKyAgICB0LmVwc2lsb24gPSA0Mzk7CisgICAgdC5waGkgPSA1MjE7CisgICAgdC5nYW1tYSA9IDQxMTsKKyAgICB0LmV0YSA9IDYwMzsKKyAgICB0LmlvdGEgPSAzMjk7CisgICAgdC5waGkxID0gNjAzOworICAgIHQua2FwcGEgPSA1NDk7CisgICAgdC5sYW1iZGEgPSA1NDk7CisgICAgdC5tdSA9IDU3NjsKKyAgICB0Lm51ID0gNTIxOworICAgIHQub21pY3JvbiA9IDU0OTsKKyAgICB0LnBpID0gNTQ5OworICAgIHQudGhldGEgPSA1MjE7CisgICAgdC5yaG8gPSA1NDk7CisgICAgdC5zaWdtYSA9IDYwMzsKKyAgICB0LnRhdSA9IDQzOTsKKyAgICB0LnVwc2lsb24gPSA1NzY7CisgICAgdC5vbWVnYTEgPSA3MTM7CisgICAgdC5vbWVnYSA9IDY4NjsKKyAgICB0LnhpID0gNDkzOworICAgIHQucHNpID0gNjg2OworICAgIHQuemV0YSA9IDQ5NDsKKyAgICB0LmJyYWNlbGVmdCA9IDQ4MDsKKyAgICB0LmJhciA9IDIwMDsKKyAgICB0LmJyYWNlcmlnaHQgPSA0ODA7CisgICAgdC5zaW1pbGFyID0gNTQ5OworICAgIHQuRXVybyA9IDc1MDsKKyAgICB0LlVwc2lsb24xID0gNjIwOworICAgIHQubWludXRlID0gMjQ3OworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQuZnJhY3Rpb24gPSAxNjc7CisgICAgdC5pbmZpbml0eSA9IDcxMzsKKyAgICB0LmZsb3JpbiA9IDUwMDsKKyAgICB0LmNsdWIgPSA3NTM7CisgICAgdC5kaWFtb25kID0gNzUzOworICAgIHQuaGVhcnQgPSA3NTM7CisgICAgdC5zcGFkZSA9IDc1MzsKKyAgICB0LmFycm93Ym90aCA9IDEwNDI7CisgICAgdC5hcnJvd2xlZnQgPSA5ODc7CisgICAgdC5hcnJvd3VwID0gNjAzOworICAgIHQuYXJyb3dyaWdodCA9IDk4NzsKKyAgICB0LmFycm93ZG93biA9IDYwMzsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0LnBsdXNtaW51cyA9IDU0OTsKKyAgICB0LnNlY29uZCA9IDQxMTsKKyAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKKyAgICB0Lm11bHRpcGx5ID0gNTQ5OworICAgIHQucHJvcG9ydGlvbmFsID0gNzEzOworICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7CisgICAgdC5idWxsZXQgPSA0NjA7CisgICAgdC5kaXZpZGUgPSA1NDk7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0LmVxdWl2YWxlbmNlID0gNTQ5OworICAgIHQuYXBwcm94ZXF1YWwgPSA1NDk7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5hcnJvd3ZlcnRleCA9IDYwMzsKKyAgICB0LmFycm93aG9yaXpleCA9IDEwMDA7CisgICAgdC5jYXJyaWFnZXJldHVybiA9IDY1ODsKKyAgICB0LmFsZXBoID0gODIzOworICAgIHQuSWZyYWt0dXIgPSA2ODY7CisgICAgdC5SZnJha3R1ciA9IDc5NTsKKyAgICB0LndlaWVyc3RyYXNzID0gOTg3OworICAgIHQuY2lyY2xlbXVsdGlwbHkgPSA3Njg7CisgICAgdC5jaXJjbGVwbHVzID0gNzY4OworICAgIHQuZW1wdHlzZXQgPSA4MjM7CisgICAgdC5pbnRlcnNlY3Rpb24gPSA3Njg7CisgICAgdC51bmlvbiA9IDc2ODsKKyAgICB0LnByb3BlcnN1cGVyc2V0ID0gNzEzOworICAgIHQucmVmbGV4c3VwZXJzZXQgPSA3MTM7CisgICAgdC5ub3RzdWJzZXQgPSA3MTM7CisgICAgdC5wcm9wZXJzdWJzZXQgPSA3MTM7CisgICAgdC5yZWZsZXhzdWJzZXQgPSA3MTM7CisgICAgdC5lbGVtZW50ID0gNzEzOworICAgIHQubm90ZWxlbWVudCA9IDcxMzsKKyAgICB0LmFuZ2xlID0gNzY4OworICAgIHQuZ3JhZGllbnQgPSA3MTM7CisgICAgdC5yZWdpc3RlcnNlcmlmID0gNzkwOworICAgIHQuY29weXJpZ2h0c2VyaWYgPSA3OTA7CisgICAgdC50cmFkZW1hcmtzZXJpZiA9IDg5MDsKKyAgICB0LnByb2R1Y3QgPSA4MjM7CisgICAgdC5yYWRpY2FsID0gNTQ5OworICAgIHQuZG90bWF0aCA9IDI1MDsKKyAgICB0LmxvZ2ljYWxub3QgPSA3MTM7CisgICAgdC5sb2dpY2FsYW5kID0gNjAzOworICAgIHQubG9naWNhbG9yID0gNjAzOworICAgIHQuYXJyb3dkYmxib3RoID0gMTA0MjsKKyAgICB0LmFycm93ZGJsbGVmdCA9IDk4NzsKKyAgICB0LmFycm93ZGJsdXAgPSA2MDM7CisgICAgdC5hcnJvd2RibHJpZ2h0ID0gOTg3OworICAgIHQuYXJyb3dkYmxkb3duID0gNjAzOworICAgIHQubG96ZW5nZSA9IDQ5NDsKKyAgICB0LmFuZ2xlbGVmdCA9IDMyOTsKKyAgICB0LnJlZ2lzdGVyc2FucyA9IDc5MDsKKyAgICB0LmNvcHlyaWdodHNhbnMgPSA3OTA7CisgICAgdC50cmFkZW1hcmtzYW5zID0gNzg2OworICAgIHQuc3VtbWF0aW9uID0gNzEzOworICAgIHQucGFyZW5sZWZ0dHAgPSAzODQ7CisgICAgdC5wYXJlbmxlZnRleCA9IDM4NDsKKyAgICB0LnBhcmVubGVmdGJ0ID0gMzg0OworICAgIHQuYnJhY2tldGxlZnR0cCA9IDM4NDsKKyAgICB0LmJyYWNrZXRsZWZ0ZXggPSAzODQ7CisgICAgdC5icmFja2V0bGVmdGJ0ID0gMzg0OworICAgIHQuYnJhY2VsZWZ0dHAgPSA0OTQ7CisgICAgdC5icmFjZWxlZnRtaWQgPSA0OTQ7CisgICAgdC5icmFjZWxlZnRidCA9IDQ5NDsKKyAgICB0LmJyYWNlZXggPSA0OTQ7CisgICAgdC5hbmdsZXJpZ2h0ID0gMzI5OworICAgIHQuaW50ZWdyYWwgPSAyNzQ7CisgICAgdC5pbnRlZ3JhbHRwID0gNjg2OworICAgIHQuaW50ZWdyYWxleCA9IDY4NjsKKyAgICB0LmludGVncmFsYnQgPSA2ODY7CisgICAgdC5wYXJlbnJpZ2h0dHAgPSAzODQ7CisgICAgdC5wYXJlbnJpZ2h0ZXggPSAzODQ7CisgICAgdC5wYXJlbnJpZ2h0YnQgPSAzODQ7CisgICAgdC5icmFja2V0cmlnaHR0cCA9IDM4NDsKKyAgICB0LmJyYWNrZXRyaWdodGV4ID0gMzg0OworICAgIHQuYnJhY2tldHJpZ2h0YnQgPSAzODQ7CisgICAgdC5icmFjZXJpZ2h0dHAgPSA0OTQ7CisgICAgdC5icmFjZXJpZ2h0bWlkID0gNDk0OworICAgIHQuYnJhY2VyaWdodGJ0ID0gNDk0OworICAgIHQuYXBwbGUgPSA3OTA7CisgIH0pOworICB0WyJUaW1lcy1Sb21hbiJdID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgICB0LnNwYWNlID0gMjUwOworICAgIHQuZXhjbGFtID0gMzMzOworICAgIHQucXVvdGVkYmwgPSA0MDg7CisgICAgdC5udW1iZXJzaWduID0gNTAwOworICAgIHQuZG9sbGFyID0gNTAwOworICAgIHQucGVyY2VudCA9IDgzMzsKKyAgICB0LmFtcGVyc2FuZCA9IDc3ODsKKyAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CisgICAgdC5wYXJlbmxlZnQgPSAzMzM7CisgICAgdC5wYXJlbnJpZ2h0ID0gMzMzOworICAgIHQuYXN0ZXJpc2sgPSA1MDA7CisgICAgdC5wbHVzID0gNTY0OworICAgIHQuY29tbWEgPSAyNTA7CisgICAgdC5oeXBoZW4gPSAzMzM7CisgICAgdC5wZXJpb2QgPSAyNTA7CisgICAgdC5zbGFzaCA9IDI3ODsKKyAgICB0Lnplcm8gPSA1MDA7CisgICAgdC5vbmUgPSA1MDA7CisgICAgdC50d28gPSA1MDA7CisgICAgdC50aHJlZSA9IDUwMDsKKyAgICB0LmZvdXIgPSA1MDA7CisgICAgdC5maXZlID0gNTAwOworICAgIHQuc2l4ID0gNTAwOworICAgIHQuc2V2ZW4gPSA1MDA7CisgICAgdC5laWdodCA9IDUwMDsKKyAgICB0Lm5pbmUgPSA1MDA7CisgICAgdC5jb2xvbiA9IDI3ODsKKyAgICB0LnNlbWljb2xvbiA9IDI3ODsKKyAgICB0Lmxlc3MgPSA1NjQ7CisgICAgdC5lcXVhbCA9IDU2NDsKKyAgICB0LmdyZWF0ZXIgPSA1NjQ7CisgICAgdC5xdWVzdGlvbiA9IDQ0NDsKKyAgICB0LmF0ID0gOTIxOworICAgIHQuQSA9IDcyMjsKKyAgICB0LkIgPSA2Njc7CisgICAgdC5DID0gNjY3OworICAgIHQuRCA9IDcyMjsKKyAgICB0LkUgPSA2MTE7CisgICAgdC5GID0gNTU2OworICAgIHQuRyA9IDcyMjsKKyAgICB0LkggPSA3MjI7CisgICAgdC5JID0gMzMzOworICAgIHQuSiA9IDM4OTsKKyAgICB0LksgPSA3MjI7CisgICAgdC5MID0gNjExOworICAgIHQuTSA9IDg4OTsKKyAgICB0Lk4gPSA3MjI7CisgICAgdC5PID0gNzIyOworICAgIHQuUCA9IDU1NjsKKyAgICB0LlEgPSA3MjI7CisgICAgdC5SID0gNjY3OworICAgIHQuUyA9IDU1NjsKKyAgICB0LlQgPSA2MTE7CisgICAgdC5VID0gNzIyOworICAgIHQuViA9IDcyMjsKKyAgICB0LlcgPSA5NDQ7CisgICAgdC5YID0gNzIyOworICAgIHQuWSA9IDcyMjsKKyAgICB0LlogPSA2MTE7CisgICAgdC5icmFja2V0bGVmdCA9IDMzMzsKKyAgICB0LmJhY2tzbGFzaCA9IDI3ODsKKyAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKKyAgICB0LmFzY2lpY2lyY3VtID0gNDY5OworICAgIHQudW5kZXJzY29yZSA9IDUwMDsKKyAgICB0LnF1b3RlbGVmdCA9IDMzMzsKKyAgICB0LmEgPSA0NDQ7CisgICAgdC5iID0gNTAwOworICAgIHQuYyA9IDQ0NDsKKyAgICB0LmQgPSA1MDA7CisgICAgdC5lID0gNDQ0OworICAgIHQuZiA9IDMzMzsKKyAgICB0LmcgPSA1MDA7CisgICAgdC5oID0gNTAwOworICAgIHQuaSA9IDI3ODsKKyAgICB0LmogPSAyNzg7CisgICAgdC5rID0gNTAwOworICAgIHQubCA9IDI3ODsKKyAgICB0Lm0gPSA3Nzg7CisgICAgdC5uID0gNTAwOworICAgIHQubyA9IDUwMDsKKyAgICB0LnAgPSA1MDA7CisgICAgdC5xID0gNTAwOworICAgIHQuciA9IDMzMzsKKyAgICB0LnMgPSAzODk7CisgICAgdC50ID0gMjc4OworICAgIHQudSA9IDUwMDsKKyAgICB0LnYgPSA1MDA7CisgICAgdC53ID0gNzIyOworICAgIHQueCA9IDUwMDsKKyAgICB0LnkgPSA1MDA7CisgICAgdC56ID0gNDQ0OworICAgIHQuYnJhY2VsZWZ0ID0gNDgwOworICAgIHQuYmFyID0gMjAwOworICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKKyAgICB0LmFzY2lpdGlsZGUgPSA1NDE7CisgICAgdC5leGNsYW1kb3duID0gMzMzOworICAgIHQuY2VudCA9IDUwMDsKKyAgICB0LnN0ZXJsaW5nID0gNTAwOworICAgIHQuZnJhY3Rpb24gPSAxNjc7CisgICAgdC55ZW4gPSA1MDA7CisgICAgdC5mbG9yaW4gPSA1MDA7CisgICAgdC5zZWN0aW9uID0gNTAwOworICAgIHQuY3VycmVuY3kgPSA1MDA7CisgICAgdC5xdW90ZXNpbmdsZSA9IDE4MDsKKyAgICB0LnF1b3RlZGJsbGVmdCA9IDQ0NDsKKyAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CisgICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOworICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CisgICAgdC5maSA9IDU1NjsKKyAgICB0LmZsID0gNTU2OworICAgIHQuZW5kYXNoID0gNTAwOworICAgIHQuZGFnZ2VyID0gNTAwOworICAgIHQuZGFnZ2VyZGJsID0gNTAwOworICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CisgICAgdC5wYXJhZ3JhcGggPSA0NTM7CisgICAgdC5idWxsZXQgPSAzNTA7CisgICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsYmFzZSA9IDQ0NDsKKyAgICB0LnF1b3RlZGJscmlnaHQgPSA0NDQ7CisgICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKKyAgICB0LmVsbGlwc2lzID0gMTAwMDsKKyAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKKyAgICB0LnF1ZXN0aW9uZG93biA9IDQ0NDsKKyAgICB0LmdyYXZlID0gMzMzOworICAgIHQuYWN1dGUgPSAzMzM7CisgICAgdC5jaXJjdW1mbGV4ID0gMzMzOworICAgIHQudGlsZGUgPSAzMzM7CisgICAgdC5tYWNyb24gPSAzMzM7CisgICAgdC5icmV2ZSA9IDMzMzsKKyAgICB0LmRvdGFjY2VudCA9IDMzMzsKKyAgICB0LmRpZXJlc2lzID0gMzMzOworICAgIHQucmluZyA9IDMzMzsKKyAgICB0LmNlZGlsbGEgPSAzMzM7CisgICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CisgICAgdC5vZ29uZWsgPSAzMzM7CisgICAgdC5jYXJvbiA9IDMzMzsKKyAgICB0LmVtZGFzaCA9IDEwMDA7CisgICAgdC5BRSA9IDg4OTsKKyAgICB0Lm9yZGZlbWluaW5lID0gMjc2OworICAgIHQuTHNsYXNoID0gNjExOworICAgIHQuT3NsYXNoID0gNzIyOworICAgIHQuT0UgPSA4ODk7CisgICAgdC5vcmRtYXNjdWxpbmUgPSAzMTA7CisgICAgdC5hZSA9IDY2NzsKKyAgICB0LmRvdGxlc3NpID0gMjc4OworICAgIHQubHNsYXNoID0gMjc4OworICAgIHQub3NsYXNoID0gNTAwOworICAgIHQub2UgPSA3MjI7CisgICAgdC5nZXJtYW5kYmxzID0gNTAwOworICAgIHQuSWRpZXJlc2lzID0gMzMzOworICAgIHQuZWFjdXRlID0gNDQ0OworICAgIHQuYWJyZXZlID0gNDQ0OworICAgIHQudWh1bmdhcnVtbGF1dCA9IDUwMDsKKyAgICB0LmVjYXJvbiA9IDQ0NDsKKyAgICB0LllkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmRpdmlkZSA9IDU2NDsKKyAgICB0LllhY3V0ZSA9IDcyMjsKKyAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOworICAgIHQuYWFjdXRlID0gNDQ0OworICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CisgICAgdC55YWN1dGUgPSA1MDA7CisgICAgdC5zY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKKyAgICB0LlVyaW5nID0gNzIyOworICAgIHQuVWRpZXJlc2lzID0gNzIyOworICAgIHQuYW9nb25layA9IDQ0NDsKKyAgICB0LlVhY3V0ZSA9IDcyMjsKKyAgICB0LnVvZ29uZWsgPSA1MDA7CisgICAgdC5FZGllcmVzaXMgPSA2MTE7CisgICAgdC5EY3JvYXQgPSA3MjI7CisgICAgdC5jb21tYWFjY2VudCA9IDI1MDsKKyAgICB0LmNvcHlyaWdodCA9IDc2MDsKKyAgICB0LkVtYWNyb24gPSA2MTE7CisgICAgdC5jY2Fyb24gPSA0NDQ7CisgICAgdC5hcmluZyA9IDQ0NDsKKyAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKKyAgICB0LmxhY3V0ZSA9IDI3ODsKKyAgICB0LmFncmF2ZSA9IDQ0NDsKKyAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LkNhY3V0ZSA9IDY2NzsKKyAgICB0LmF0aWxkZSA9IDQ0NDsKKyAgICB0LkVkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5zY2Fyb24gPSAzODk7CisgICAgdC5zY2VkaWxsYSA9IDM4OTsKKyAgICB0LmlhY3V0ZSA9IDI3ODsKKyAgICB0LmxvemVuZ2UgPSA0NzE7CisgICAgdC5SY2Fyb24gPSA2Njc7CisgICAgdC5HY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC51Y2lyY3VtZmxleCA9IDUwMDsKKyAgICB0LmFjaXJjdW1mbGV4ID0gNDQ0OworICAgIHQuQW1hY3JvbiA9IDcyMjsKKyAgICB0LnJjYXJvbiA9IDMzMzsKKyAgICB0LmNjZWRpbGxhID0gNDQ0OworICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKKyAgICB0LlRob3JuID0gNTU2OworICAgIHQuT21hY3JvbiA9IDcyMjsKKyAgICB0LlJhY3V0ZSA9IDY2NzsKKyAgICB0LlNhY3V0ZSA9IDU1NjsKKyAgICB0LmRjYXJvbiA9IDU4ODsKKyAgICB0LlVtYWNyb24gPSA3MjI7CisgICAgdC51cmluZyA9IDUwMDsKKyAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZ3JhdmUgPSA3MjI7CisgICAgdC5BZ3JhdmUgPSA3MjI7CisgICAgdC5BYnJldmUgPSA3MjI7CisgICAgdC5tdWx0aXBseSA9IDU2NDsKKyAgICB0LnVhY3V0ZSA9IDUwMDsKKyAgICB0LlRjYXJvbiA9IDYxMTsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDc2OworICAgIHQueWRpZXJlc2lzID0gNTAwOworICAgIHQuTmFjdXRlID0gNzIyOworICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5FY2lyY3VtZmxleCA9IDYxMTsKKyAgICB0LmFkaWVyZXNpcyA9IDQ0NDsKKyAgICB0LmVkaWVyZXNpcyA9IDQ0NDsKKyAgICB0LmNhY3V0ZSA9IDQ0NDsKKyAgICB0Lm5hY3V0ZSA9IDUwMDsKKyAgICB0LnVtYWNyb24gPSA1MDA7CisgICAgdC5OY2Fyb24gPSA3MjI7CisgICAgdC5JYWN1dGUgPSAzMzM7CisgICAgdC5wbHVzbWludXMgPSA1NjQ7CisgICAgdC5icm9rZW5iYXIgPSAyMDA7CisgICAgdC5yZWdpc3RlcmVkID0gNzYwOworICAgIHQuR2JyZXZlID0gNzIyOworICAgIHQuSWRvdGFjY2VudCA9IDMzMzsKKyAgICB0LnN1bW1hdGlvbiA9IDYwMDsKKyAgICB0LkVncmF2ZSA9IDYxMTsKKyAgICB0LnJhY3V0ZSA9IDMzMzsKKyAgICB0Lm9tYWNyb24gPSA1MDA7CisgICAgdC5aYWN1dGUgPSA2MTE7CisgICAgdC5aY2Fyb24gPSA2MTE7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5FdGggPSA3MjI7CisgICAgdC5DY2VkaWxsYSA9IDY2NzsKKyAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LnRjYXJvbiA9IDMyNjsKKyAgICB0LmVvZ29uZWsgPSA0NDQ7CisgICAgdC5Vb2dvbmVrID0gNzIyOworICAgIHQuQWFjdXRlID0gNzIyOworICAgIHQuQWRpZXJlc2lzID0gNzIyOworICAgIHQuZWdyYXZlID0gNDQ0OworICAgIHQuemFjdXRlID0gNDQ0OworICAgIHQuaW9nb25layA9IDI3ODsKKyAgICB0Lk9hY3V0ZSA9IDcyMjsKKyAgICB0Lm9hY3V0ZSA9IDUwMDsKKyAgICB0LmFtYWNyb24gPSA0NDQ7CisgICAgdC5zYWN1dGUgPSAzODk7CisgICAgdC5pZGllcmVzaXMgPSAyNzg7CisgICAgdC5PY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LlVncmF2ZSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQudGhvcm4gPSA1MDA7CisgICAgdC50d29zdXBlcmlvciA9IDMwMDsKKyAgICB0Lk9kaWVyZXNpcyA9IDcyMjsKKyAgICB0Lm11ID0gNTAwOworICAgIHQuaWdyYXZlID0gMjc4OworICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDsKKyAgICB0LkVvZ29uZWsgPSA2MTE7CisgICAgdC5kY3JvYXQgPSA1MDA7CisgICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwOworICAgIHQuU2NlZGlsbGEgPSA1NTY7CisgICAgdC5sY2Fyb24gPSAzNDQ7CisgICAgdC5LY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MYWN1dGUgPSA2MTE7CisgICAgdC50cmFkZW1hcmsgPSA5ODA7CisgICAgdC5lZG90YWNjZW50ID0gNDQ0OworICAgIHQuSWdyYXZlID0gMzMzOworICAgIHQuSW1hY3JvbiA9IDMzMzsKKyAgICB0LkxjYXJvbiA9IDYxMTsKKyAgICB0Lm9uZWhhbGYgPSA3NTA7CisgICAgdC5sZXNzZXF1YWwgPSA1NDk7CisgICAgdC5vY2lyY3VtZmxleCA9IDUwMDsKKyAgICB0Lm50aWxkZSA9IDUwMDsKKyAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5FYWN1dGUgPSA2MTE7CisgICAgdC5lbWFjcm9uID0gNDQ0OworICAgIHQuZ2JyZXZlID0gNTAwOworICAgIHQub25lcXVhcnRlciA9IDc1MDsKKyAgICB0LlNjYXJvbiA9IDU1NjsKKyAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5vZ3JhdmUgPSA1MDA7CisgICAgdC5DY2Fyb24gPSA2Njc7CisgICAgdC51Z3JhdmUgPSA1MDA7CisgICAgdC5yYWRpY2FsID0gNDUzOworICAgIHQuRGNhcm9uID0gNzIyOworICAgIHQucmNvbW1hYWNjZW50ID0gMzMzOworICAgIHQuTnRpbGRlID0gNzIyOworICAgIHQub3RpbGRlID0gNTAwOworICAgIHQuUmNvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOworICAgIHQuQXRpbGRlID0gNzIyOworICAgIHQuQW9nb25layA9IDcyMjsKKyAgICB0LkFyaW5nID0gNzIyOworICAgIHQuT3RpbGRlID0gNzIyOworICAgIHQuemRvdGFjY2VudCA9IDQ0NDsKKyAgICB0LkVjYXJvbiA9IDYxMTsKKyAgICB0LklvZ29uZWsgPSAzMzM7CisgICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5taW51cyA9IDU2NDsKKyAgICB0LkljaXJjdW1mbGV4ID0gMzMzOworICAgIHQubmNhcm9uID0gNTAwOworICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQubG9naWNhbG5vdCA9IDU2NDsKKyAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKKyAgICB0LnVkaWVyZXNpcyA9IDUwMDsKKyAgICB0Lm5vdGVxdWFsID0gNTQ5OworICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQuZXRoID0gNTAwOworICAgIHQuemNhcm9uID0gNDQ0OworICAgIHQubmNvbW1hYWNjZW50ID0gNTAwOworICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CisgICAgdC5pbWFjcm9uID0gMjc4OworICAgIHQuRXVybyA9IDUwMDsKKyAgfSk7CisgIHRbIlRpbWVzLUJvbGQiXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI1MDsKKyAgICB0LmV4Y2xhbSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsID0gNTU1OworICAgIHQubnVtYmVyc2lnbiA9IDUwMDsKKyAgICB0LmRvbGxhciA9IDUwMDsKKyAgICB0LnBlcmNlbnQgPSAxMDAwOworICAgIHQuYW1wZXJzYW5kID0gODMzOworICAgIHQucXVvdGVyaWdodCA9IDMzMzsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDUwMDsKKyAgICB0LnBsdXMgPSA1NzA7CisgICAgdC5jb21tYSA9IDI1MDsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI1MDsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDUwMDsKKyAgICB0Lm9uZSA9IDUwMDsKKyAgICB0LnR3byA9IDUwMDsKKyAgICB0LnRocmVlID0gNTAwOworICAgIHQuZm91ciA9IDUwMDsKKyAgICB0LmZpdmUgPSA1MDA7CisgICAgdC5zaXggPSA1MDA7CisgICAgdC5zZXZlbiA9IDUwMDsKKyAgICB0LmVpZ2h0ID0gNTAwOworICAgIHQubmluZSA9IDUwMDsKKyAgICB0LmNvbG9uID0gMzMzOworICAgIHQuc2VtaWNvbG9uID0gMzMzOworICAgIHQubGVzcyA9IDU3MDsKKyAgICB0LmVxdWFsID0gNTcwOworICAgIHQuZ3JlYXRlciA9IDU3MDsKKyAgICB0LnF1ZXN0aW9uID0gNTAwOworICAgIHQuYXQgPSA5MzA7CisgICAgdC5BID0gNzIyOworICAgIHQuQiA9IDY2NzsKKyAgICB0LkMgPSA3MjI7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzc4OworICAgIHQuSCA9IDc3ODsKKyAgICB0LkkgPSAzODk7CisgICAgdC5KID0gNTAwOworICAgIHQuSyA9IDc3ODsKKyAgICB0LkwgPSA2Njc7CisgICAgdC5NID0gOTQ0OworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3Nzg7CisgICAgdC5QID0gNjExOworICAgIHQuUSA9IDc3ODsKKyAgICB0LlIgPSA3MjI7CisgICAgdC5TID0gNTU2OworICAgIHQuVCA9IDY2NzsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNzIyOworICAgIHQuVyA9IDEwMDA7CisgICAgdC5YID0gNzIyOworICAgIHQuWSA9IDcyMjsKKyAgICB0LlogPSA2Njc7CisgICAgdC5icmFja2V0bGVmdCA9IDMzMzsKKyAgICB0LmJhY2tzbGFzaCA9IDI3ODsKKyAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKKyAgICB0LmFzY2lpY2lyY3VtID0gNTgxOworICAgIHQudW5kZXJzY29yZSA9IDUwMDsKKyAgICB0LnF1b3RlbGVmdCA9IDMzMzsKKyAgICB0LmEgPSA1MDA7CisgICAgdC5iID0gNTU2OworICAgIHQuYyA9IDQ0NDsKKyAgICB0LmQgPSA1NTY7CisgICAgdC5lID0gNDQ0OworICAgIHQuZiA9IDMzMzsKKyAgICB0LmcgPSA1MDA7CisgICAgdC5oID0gNTU2OworICAgIHQuaSA9IDI3ODsKKyAgICB0LmogPSAzMzM7CisgICAgdC5rID0gNTU2OworICAgIHQubCA9IDI3ODsKKyAgICB0Lm0gPSA4MzM7CisgICAgdC5uID0gNTU2OworICAgIHQubyA9IDUwMDsKKyAgICB0LnAgPSA1NTY7CisgICAgdC5xID0gNTU2OworICAgIHQuciA9IDQ0NDsKKyAgICB0LnMgPSAzODk7CisgICAgdC50ID0gMzMzOworICAgIHQudSA9IDU1NjsKKyAgICB0LnYgPSA1MDA7CisgICAgdC53ID0gNzIyOworICAgIHQueCA9IDUwMDsKKyAgICB0LnkgPSA1MDA7CisgICAgdC56ID0gNDQ0OworICAgIHQuYnJhY2VsZWZ0ID0gMzk0OworICAgIHQuYmFyID0gMjIwOworICAgIHQuYnJhY2VyaWdodCA9IDM5NDsKKyAgICB0LmFzY2lpdGlsZGUgPSA1MjA7CisgICAgdC5leGNsYW1kb3duID0gMzMzOworICAgIHQuY2VudCA9IDUwMDsKKyAgICB0LnN0ZXJsaW5nID0gNTAwOworICAgIHQuZnJhY3Rpb24gPSAxNjc7CisgICAgdC55ZW4gPSA1MDA7CisgICAgdC5mbG9yaW4gPSA1MDA7CisgICAgdC5zZWN0aW9uID0gNTAwOworICAgIHQuY3VycmVuY3kgPSA1MDA7CisgICAgdC5xdW90ZXNpbmdsZSA9IDI3ODsKKyAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKKyAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CisgICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOworICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CisgICAgdC5maSA9IDU1NjsKKyAgICB0LmZsID0gNTU2OworICAgIHQuZW5kYXNoID0gNTAwOworICAgIHQuZGFnZ2VyID0gNTAwOworICAgIHQuZGFnZ2VyZGJsID0gNTAwOworICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CisgICAgdC5wYXJhZ3JhcGggPSA1NDA7CisgICAgdC5idWxsZXQgPSAzNTA7CisgICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsYmFzZSA9IDUwMDsKKyAgICB0LnF1b3RlZGJscmlnaHQgPSA1MDA7CisgICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKKyAgICB0LmVsbGlwc2lzID0gMTAwMDsKKyAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKKyAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKKyAgICB0LmdyYXZlID0gMzMzOworICAgIHQuYWN1dGUgPSAzMzM7CisgICAgdC5jaXJjdW1mbGV4ID0gMzMzOworICAgIHQudGlsZGUgPSAzMzM7CisgICAgdC5tYWNyb24gPSAzMzM7CisgICAgdC5icmV2ZSA9IDMzMzsKKyAgICB0LmRvdGFjY2VudCA9IDMzMzsKKyAgICB0LmRpZXJlc2lzID0gMzMzOworICAgIHQucmluZyA9IDMzMzsKKyAgICB0LmNlZGlsbGEgPSAzMzM7CisgICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CisgICAgdC5vZ29uZWsgPSAzMzM7CisgICAgdC5jYXJvbiA9IDMzMzsKKyAgICB0LmVtZGFzaCA9IDEwMDA7CisgICAgdC5BRSA9IDEwMDA7CisgICAgdC5vcmRmZW1pbmluZSA9IDMwMDsKKyAgICB0LkxzbGFzaCA9IDY2NzsKKyAgICB0Lk9zbGFzaCA9IDc3ODsKKyAgICB0Lk9FID0gMTAwMDsKKyAgICB0Lm9yZG1hc2N1bGluZSA9IDMzMDsKKyAgICB0LmFlID0gNzIyOworICAgIHQuZG90bGVzc2kgPSAyNzg7CisgICAgdC5sc2xhc2ggPSAyNzg7CisgICAgdC5vc2xhc2ggPSA1MDA7CisgICAgdC5vZSA9IDcyMjsKKyAgICB0Lmdlcm1hbmRibHMgPSA1NTY7CisgICAgdC5JZGllcmVzaXMgPSAzODk7CisgICAgdC5lYWN1dGUgPSA0NDQ7CisgICAgdC5hYnJldmUgPSA1MDA7CisgICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OworICAgIHQuZWNhcm9uID0gNDQ0OworICAgIHQuWWRpZXJlc2lzID0gNzIyOworICAgIHQuZGl2aWRlID0gNTcwOworICAgIHQuWWFjdXRlID0gNzIyOworICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7CisgICAgdC5hYWN1dGUgPSA1MDA7CisgICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LnlhY3V0ZSA9IDUwMDsKKyAgICB0LnNjb21tYWFjY2VudCA9IDM4OTsKKyAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0OworICAgIHQuVXJpbmcgPSA3MjI7CisgICAgdC5VZGllcmVzaXMgPSA3MjI7CisgICAgdC5hb2dvbmVrID0gNTAwOworICAgIHQuVWFjdXRlID0gNzIyOworICAgIHQudW9nb25layA9IDU1NjsKKyAgICB0LkVkaWVyZXNpcyA9IDY2NzsKKyAgICB0LkRjcm9hdCA9IDcyMjsKKyAgICB0LmNvbW1hYWNjZW50ID0gMjUwOworICAgIHQuY29weXJpZ2h0ID0gNzQ3OworICAgIHQuRW1hY3JvbiA9IDY2NzsKKyAgICB0LmNjYXJvbiA9IDQ0NDsKKyAgICB0LmFyaW5nID0gNTAwOworICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOworICAgIHQubGFjdXRlID0gMjc4OworICAgIHQuYWdyYXZlID0gNTAwOworICAgIHQuVGNvbW1hYWNjZW50ID0gNjY3OworICAgIHQuQ2FjdXRlID0gNzIyOworICAgIHQuYXRpbGRlID0gNTAwOworICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKKyAgICB0LnNjYXJvbiA9IDM4OTsKKyAgICB0LnNjZWRpbGxhID0gMzg5OworICAgIHQuaWFjdXRlID0gMjc4OworICAgIHQubG96ZW5nZSA9IDQ5NDsKKyAgICB0LlJjYXJvbiA9IDcyMjsKKyAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKKyAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7CisgICAgdC5BbWFjcm9uID0gNzIyOworICAgIHQucmNhcm9uID0gNDQ0OworICAgIHQuY2NlZGlsbGEgPSA0NDQ7CisgICAgdC5aZG90YWNjZW50ID0gNjY3OworICAgIHQuVGhvcm4gPSA2MTE7CisgICAgdC5PbWFjcm9uID0gNzc4OworICAgIHQuUmFjdXRlID0gNzIyOworICAgIHQuU2FjdXRlID0gNTU2OworICAgIHQuZGNhcm9uID0gNjcyOworICAgIHQuVW1hY3JvbiA9IDcyMjsKKyAgICB0LnVyaW5nID0gNTU2OworICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDsKKyAgICB0Lk9ncmF2ZSA9IDc3ODsKKyAgICB0LkFncmF2ZSA9IDcyMjsKKyAgICB0LkFicmV2ZSA9IDcyMjsKKyAgICB0Lm11bHRpcGx5ID0gNTcwOworICAgIHQudWFjdXRlID0gNTU2OworICAgIHQuVGNhcm9uID0gNjY3OworICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7CisgICAgdC55ZGllcmVzaXMgPSA1MDA7CisgICAgdC5OYWN1dGUgPSA3MjI7CisgICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKKyAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OworICAgIHQuYWRpZXJlc2lzID0gNTAwOworICAgIHQuZWRpZXJlc2lzID0gNDQ0OworICAgIHQuY2FjdXRlID0gNDQ0OworICAgIHQubmFjdXRlID0gNTU2OworICAgIHQudW1hY3JvbiA9IDU1NjsKKyAgICB0Lk5jYXJvbiA9IDcyMjsKKyAgICB0LklhY3V0ZSA9IDM4OTsKKyAgICB0LnBsdXNtaW51cyA9IDU3MDsKKyAgICB0LmJyb2tlbmJhciA9IDIyMDsKKyAgICB0LnJlZ2lzdGVyZWQgPSA3NDc7CisgICAgdC5HYnJldmUgPSA3Nzg7CisgICAgdC5JZG90YWNjZW50ID0gMzg5OworICAgIHQuc3VtbWF0aW9uID0gNjAwOworICAgIHQuRWdyYXZlID0gNjY3OworICAgIHQucmFjdXRlID0gNDQ0OworICAgIHQub21hY3JvbiA9IDUwMDsKKyAgICB0LlphY3V0ZSA9IDY2NzsKKyAgICB0LlpjYXJvbiA9IDY2NzsKKyAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKKyAgICB0LkV0aCA9IDcyMjsKKyAgICB0LkNjZWRpbGxhID0gNzIyOworICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQudGNhcm9uID0gNDE2OworICAgIHQuZW9nb25layA9IDQ0NDsKKyAgICB0LlVvZ29uZWsgPSA3MjI7CisgICAgdC5BYWN1dGUgPSA3MjI7CisgICAgdC5BZGllcmVzaXMgPSA3MjI7CisgICAgdC5lZ3JhdmUgPSA0NDQ7CisgICAgdC56YWN1dGUgPSA0NDQ7CisgICAgdC5pb2dvbmVrID0gMjc4OworICAgIHQuT2FjdXRlID0gNzc4OworICAgIHQub2FjdXRlID0gNTAwOworICAgIHQuYW1hY3JvbiA9IDUwMDsKKyAgICB0LnNhY3V0ZSA9IDM4OTsKKyAgICB0LmlkaWVyZXNpcyA9IDI3ODsKKyAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OworICAgIHQuVWdyYXZlID0gNzIyOworICAgIHQuRGVsdGEgPSA2MTI7CisgICAgdC50aG9ybiA9IDU1NjsKKyAgICB0LnR3b3N1cGVyaW9yID0gMzAwOworICAgIHQuT2RpZXJlc2lzID0gNzc4OworICAgIHQubXUgPSA1NTY7CisgICAgdC5pZ3JhdmUgPSAyNzg7CisgICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOworICAgIHQuRW9nb25layA9IDY2NzsKKyAgICB0LmRjcm9hdCA9IDU1NjsKKyAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CisgICAgdC5TY2VkaWxsYSA9IDU1NjsKKyAgICB0LmxjYXJvbiA9IDM5NDsKKyAgICB0Lktjb21tYWFjY2VudCA9IDc3ODsKKyAgICB0LkxhY3V0ZSA9IDY2NzsKKyAgICB0LnRyYWRlbWFyayA9IDEwMDA7CisgICAgdC5lZG90YWNjZW50ID0gNDQ0OworICAgIHQuSWdyYXZlID0gMzg5OworICAgIHQuSW1hY3JvbiA9IDM4OTsKKyAgICB0LkxjYXJvbiA9IDY2NzsKKyAgICB0Lm9uZWhhbGYgPSA3NTA7CisgICAgdC5sZXNzZXF1YWwgPSA1NDk7CisgICAgdC5vY2lyY3VtZmxleCA9IDUwMDsKKyAgICB0Lm50aWxkZSA9IDU1NjsKKyAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5FYWN1dGUgPSA2Njc7CisgICAgdC5lbWFjcm9uID0gNDQ0OworICAgIHQuZ2JyZXZlID0gNTAwOworICAgIHQub25lcXVhcnRlciA9IDc1MDsKKyAgICB0LlNjYXJvbiA9IDU1NjsKKyAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5vZ3JhdmUgPSA1MDA7CisgICAgdC5DY2Fyb24gPSA3MjI7CisgICAgdC51Z3JhdmUgPSA1NTY7CisgICAgdC5yYWRpY2FsID0gNTQ5OworICAgIHQuRGNhcm9uID0gNzIyOworICAgIHQucmNvbW1hYWNjZW50ID0gNDQ0OworICAgIHQuTnRpbGRlID0gNzIyOworICAgIHQub3RpbGRlID0gNTAwOworICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGNvbW1hYWNjZW50ID0gNjY3OworICAgIHQuQXRpbGRlID0gNzIyOworICAgIHQuQW9nb25layA9IDcyMjsKKyAgICB0LkFyaW5nID0gNzIyOworICAgIHQuT3RpbGRlID0gNzc4OworICAgIHQuemRvdGFjY2VudCA9IDQ0NDsKKyAgICB0LkVjYXJvbiA9IDY2NzsKKyAgICB0LklvZ29uZWsgPSAzODk7CisgICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5taW51cyA9IDU3MDsKKyAgICB0LkljaXJjdW1mbGV4ID0gMzg5OworICAgIHQubmNhcm9uID0gNTU2OworICAgIHQudGNvbW1hYWNjZW50ID0gMzMzOworICAgIHQubG9naWNhbG5vdCA9IDU3MDsKKyAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKKyAgICB0LnVkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lm5vdGVxdWFsID0gNTQ5OworICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQuZXRoID0gNTAwOworICAgIHQuemNhcm9uID0gNDQ0OworICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OworICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CisgICAgdC5pbWFjcm9uID0gMjc4OworICAgIHQuRXVybyA9IDUwMDsKKyAgfSk7CisgIHRbIlRpbWVzLUJvbGRJdGFsaWMiXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI1MDsKKyAgICB0LmV4Y2xhbSA9IDM4OTsKKyAgICB0LnF1b3RlZGJsID0gNTU1OworICAgIHQubnVtYmVyc2lnbiA9IDUwMDsKKyAgICB0LmRvbGxhciA9IDUwMDsKKyAgICB0LnBlcmNlbnQgPSA4MzM7CisgICAgdC5hbXBlcnNhbmQgPSA3Nzg7CisgICAgdC5xdW90ZXJpZ2h0ID0gMzMzOworICAgIHQucGFyZW5sZWZ0ID0gMzMzOworICAgIHQucGFyZW5yaWdodCA9IDMzMzsKKyAgICB0LmFzdGVyaXNrID0gNTAwOworICAgIHQucGx1cyA9IDU3MDsKKyAgICB0LmNvbW1hID0gMjUwOworICAgIHQuaHlwaGVuID0gMzMzOworICAgIHQucGVyaW9kID0gMjUwOworICAgIHQuc2xhc2ggPSAyNzg7CisgICAgdC56ZXJvID0gNTAwOworICAgIHQub25lID0gNTAwOworICAgIHQudHdvID0gNTAwOworICAgIHQudGhyZWUgPSA1MDA7CisgICAgdC5mb3VyID0gNTAwOworICAgIHQuZml2ZSA9IDUwMDsKKyAgICB0LnNpeCA9IDUwMDsKKyAgICB0LnNldmVuID0gNTAwOworICAgIHQuZWlnaHQgPSA1MDA7CisgICAgdC5uaW5lID0gNTAwOworICAgIHQuY29sb24gPSAzMzM7CisgICAgdC5zZW1pY29sb24gPSAzMzM7CisgICAgdC5sZXNzID0gNTcwOworICAgIHQuZXF1YWwgPSA1NzA7CisgICAgdC5ncmVhdGVyID0gNTcwOworICAgIHQucXVlc3Rpb24gPSA1MDA7CisgICAgdC5hdCA9IDgzMjsKKyAgICB0LkEgPSA2Njc7CisgICAgdC5CID0gNjY3OworICAgIHQuQyA9IDY2NzsKKyAgICB0LkQgPSA3MjI7CisgICAgdC5FID0gNjY3OworICAgIHQuRiA9IDY2NzsKKyAgICB0LkcgPSA3MjI7CisgICAgdC5IID0gNzc4OworICAgIHQuSSA9IDM4OTsKKyAgICB0LkogPSA1MDA7CisgICAgdC5LID0gNjY3OworICAgIHQuTCA9IDYxMTsKKyAgICB0Lk0gPSA4ODk7CisgICAgdC5OID0gNzIyOworICAgIHQuTyA9IDcyMjsKKyAgICB0LlAgPSA2MTE7CisgICAgdC5RID0gNzIyOworICAgIHQuUiA9IDY2NzsKKyAgICB0LlMgPSA1NTY7CisgICAgdC5UID0gNjExOworICAgIHQuVSA9IDcyMjsKKyAgICB0LlYgPSA2Njc7CisgICAgdC5XID0gODg5OworICAgIHQuWCA9IDY2NzsKKyAgICB0LlkgPSA2MTE7CisgICAgdC5aID0gNjExOworICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CisgICAgdC5iYWNrc2xhc2ggPSAyNzg7CisgICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CisgICAgdC5hc2NpaWNpcmN1bSA9IDU3MDsKKyAgICB0LnVuZGVyc2NvcmUgPSA1MDA7CisgICAgdC5xdW90ZWxlZnQgPSAzMzM7CisgICAgdC5hID0gNTAwOworICAgIHQuYiA9IDUwMDsKKyAgICB0LmMgPSA0NDQ7CisgICAgdC5kID0gNTAwOworICAgIHQuZSA9IDQ0NDsKKyAgICB0LmYgPSAzMzM7CisgICAgdC5nID0gNTAwOworICAgIHQuaCA9IDU1NjsKKyAgICB0LmkgPSAyNzg7CisgICAgdC5qID0gMjc4OworICAgIHQuayA9IDUwMDsKKyAgICB0LmwgPSAyNzg7CisgICAgdC5tID0gNzc4OworICAgIHQubiA9IDU1NjsKKyAgICB0Lm8gPSA1MDA7CisgICAgdC5wID0gNTAwOworICAgIHQucSA9IDUwMDsKKyAgICB0LnIgPSAzODk7CisgICAgdC5zID0gMzg5OworICAgIHQudCA9IDI3ODsKKyAgICB0LnUgPSA1NTY7CisgICAgdC52ID0gNDQ0OworICAgIHQudyA9IDY2NzsKKyAgICB0LnggPSA1MDA7CisgICAgdC55ID0gNDQ0OworICAgIHQueiA9IDM4OTsKKyAgICB0LmJyYWNlbGVmdCA9IDM0ODsKKyAgICB0LmJhciA9IDIyMDsKKyAgICB0LmJyYWNlcmlnaHQgPSAzNDg7CisgICAgdC5hc2NpaXRpbGRlID0gNTcwOworICAgIHQuZXhjbGFtZG93biA9IDM4OTsKKyAgICB0LmNlbnQgPSA1MDA7CisgICAgdC5zdGVybGluZyA9IDUwMDsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQueWVuID0gNTAwOworICAgIHQuZmxvcmluID0gNTAwOworICAgIHQuc2VjdGlvbiA9IDUwMDsKKyAgICB0LmN1cnJlbmN5ID0gNTAwOworICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CisgICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CisgICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwOworICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOworICAgIHQuZmkgPSA1NTY7CisgICAgdC5mbCA9IDU1NjsKKyAgICB0LmVuZGFzaCA9IDUwMDsKKyAgICB0LmRhZ2dlciA9IDUwMDsKKyAgICB0LmRhZ2dlcmRibCA9IDUwMDsKKyAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOworICAgIHQucGFyYWdyYXBoID0gNTAwOworICAgIHQuYnVsbGV0ID0gMzUwOworICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CisgICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7CisgICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSAxMDAwOworICAgIHQuQUUgPSA5NDQ7CisgICAgdC5vcmRmZW1pbmluZSA9IDI2NjsKKyAgICB0LkxzbGFzaCA9IDYxMTsKKyAgICB0Lk9zbGFzaCA9IDcyMjsKKyAgICB0Lk9FID0gOTQ0OworICAgIHQub3JkbWFzY3VsaW5lID0gMzAwOworICAgIHQuYWUgPSA3MjI7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDUwMDsKKyAgICB0Lm9lID0gNzIyOworICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKKyAgICB0LklkaWVyZXNpcyA9IDM4OTsKKyAgICB0LmVhY3V0ZSA9IDQ0NDsKKyAgICB0LmFicmV2ZSA9IDUwMDsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CisgICAgdC5lY2Fyb24gPSA0NDQ7CisgICAgdC5ZZGllcmVzaXMgPSA2MTE7CisgICAgdC5kaXZpZGUgPSA1NzA7CisgICAgdC5ZYWN1dGUgPSA2MTE7CisgICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFhY3V0ZSA9IDUwMDsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNDQ0OworICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OworICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1MDA7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNTU2OworICAgIHQuRWRpZXJlc2lzID0gNjY3OworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3NDc7CisgICAgdC5FbWFjcm9uID0gNjY3OworICAgIHQuY2Nhcm9uID0gNDQ0OworICAgIHQuYXJpbmcgPSA1MDA7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA1MDA7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA2Njc7CisgICAgdC5hdGlsZGUgPSA1MDA7CisgICAgdC5FZG90YWNjZW50ID0gNjY3OworICAgIHQuc2Nhcm9uID0gMzg5OworICAgIHQuc2NlZGlsbGEgPSAzODk7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDk0OworICAgIHQuUmNhcm9uID0gNjY3OworICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5hY2lyY3VtZmxleCA9IDUwMDsKKyAgICB0LkFtYWNyb24gPSA2Njc7CisgICAgdC5yY2Fyb24gPSAzODk7CisgICAgdC5jY2VkaWxsYSA9IDQ0NDsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDYxMTsKKyAgICB0Lk9tYWNyb24gPSA3MjI7CisgICAgdC5SYWN1dGUgPSA2Njc7CisgICAgdC5TYWN1dGUgPSA1NTY7CisgICAgdC5kY2Fyb24gPSA2MDg7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA1NTY7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOworICAgIHQuT2dyYXZlID0gNzIyOworICAgIHQuQWdyYXZlID0gNjY3OworICAgIHQuQWJyZXZlID0gNjY3OworICAgIHQubXVsdGlwbHkgPSA1NzA7CisgICAgdC51YWN1dGUgPSA1NTY7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKKyAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hZGllcmVzaXMgPSA1MDA7CisgICAgdC5lZGllcmVzaXMgPSA0NDQ7CisgICAgdC5jYWN1dGUgPSA0NDQ7CisgICAgdC5uYWN1dGUgPSA1NTY7CisgICAgdC51bWFjcm9uID0gNTU2OworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMzg5OworICAgIHQucGx1c21pbnVzID0gNTcwOworICAgIHQuYnJva2VuYmFyID0gMjIwOworICAgIHQucmVnaXN0ZXJlZCA9IDc0NzsKKyAgICB0LkdicmV2ZSA9IDcyMjsKKyAgICB0Lklkb3RhY2NlbnQgPSAzODk7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2Njc7CisgICAgdC5yYWN1dGUgPSAzODk7CisgICAgdC5vbWFjcm9uID0gNTAwOworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA2Njc7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzNjY7CisgICAgdC5lb2dvbmVrID0gNDQ0OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDY2NzsKKyAgICB0LkFkaWVyZXNpcyA9IDY2NzsKKyAgICB0LmVncmF2ZSA9IDQ0NDsKKyAgICB0LnphY3V0ZSA9IDM4OTsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3MjI7CisgICAgdC5vYWN1dGUgPSA1MDA7CisgICAgdC5hbWFjcm9uID0gNTAwOworICAgIHQuc2FjdXRlID0gMzg5OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNTAwOworICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZGllcmVzaXMgPSA3MjI7CisgICAgdC5tdSA9IDU3NjsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5Fb2dvbmVrID0gNjY3OworICAgIHQuZGNyb2F0ID0gNTAwOworICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKKyAgICB0LlNjZWRpbGxhID0gNTU2OworICAgIHQubGNhcm9uID0gMzgyOworICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGFjdXRlID0gNjExOworICAgIHQudHJhZGVtYXJrID0gMTAwMDsKKyAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CisgICAgdC5JZ3JhdmUgPSAzODk7CisgICAgdC5JbWFjcm9uID0gMzg5OworICAgIHQuTGNhcm9uID0gNjExOworICAgIHQub25laGFsZiA9IDc1MDsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOworICAgIHQubnRpbGRlID0gNTU2OworICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LkVhY3V0ZSA9IDY2NzsKKyAgICB0LmVtYWNyb24gPSA0NDQ7CisgICAgdC5nYnJldmUgPSA1MDA7CisgICAgdC5vbmVxdWFydGVyID0gNzUwOworICAgIHQuU2Nhcm9uID0gNTU2OworICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0Lm9ncmF2ZSA9IDUwMDsKKyAgICB0LkNjYXJvbiA9IDY2NzsKKyAgICB0LnVncmF2ZSA9IDU1NjsKKyAgICB0LnJhZGljYWwgPSA1NDk7CisgICAgdC5EY2Fyb24gPSA3MjI7CisgICAgdC5yY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5OdGlsZGUgPSA3MjI7CisgICAgdC5vdGlsZGUgPSA1MDA7CisgICAgdC5SY29tbWFhY2NlbnQgPSA2Njc7CisgICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5BdGlsZGUgPSA2Njc7CisgICAgdC5Bb2dvbmVrID0gNjY3OworICAgIHQuQXJpbmcgPSA2Njc7CisgICAgdC5PdGlsZGUgPSA3MjI7CisgICAgdC56ZG90YWNjZW50ID0gMzg5OworICAgIHQuRWNhcm9uID0gNjY3OworICAgIHQuSW9nb25layA9IDM4OTsKKyAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lm1pbnVzID0gNjA2OworICAgIHQuSWNpcmN1bWZsZXggPSAzODk7CisgICAgdC5uY2Fyb24gPSA1NTY7CisgICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC5sb2dpY2Fsbm90ID0gNjA2OworICAgIHQub2RpZXJlc2lzID0gNTAwOworICAgIHQudWRpZXJlc2lzID0gNTU2OworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5ldGggPSA1MDA7CisgICAgdC56Y2Fyb24gPSAzODk7CisgICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5vbmVzdXBlcmlvciA9IDMwMDsKKyAgICB0LmltYWNyb24gPSAyNzg7CisgICAgdC5FdXJvID0gNTAwOworICB9KTsKKyAgdFsiVGltZXMtSXRhbGljIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNTA7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC5xdW90ZWRibCA9IDQyMDsKKyAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CisgICAgdC5kb2xsYXIgPSA1MDA7CisgICAgdC5wZXJjZW50ID0gODMzOworICAgIHQuYW1wZXJzYW5kID0gNzc4OworICAgIHQucXVvdGVyaWdodCA9IDMzMzsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDUwMDsKKyAgICB0LnBsdXMgPSA2NzU7CisgICAgdC5jb21tYSA9IDI1MDsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI1MDsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDUwMDsKKyAgICB0Lm9uZSA9IDUwMDsKKyAgICB0LnR3byA9IDUwMDsKKyAgICB0LnRocmVlID0gNTAwOworICAgIHQuZm91ciA9IDUwMDsKKyAgICB0LmZpdmUgPSA1MDA7CisgICAgdC5zaXggPSA1MDA7CisgICAgdC5zZXZlbiA9IDUwMDsKKyAgICB0LmVpZ2h0ID0gNTAwOworICAgIHQubmluZSA9IDUwMDsKKyAgICB0LmNvbG9uID0gMzMzOworICAgIHQuc2VtaWNvbG9uID0gMzMzOworICAgIHQubGVzcyA9IDY3NTsKKyAgICB0LmVxdWFsID0gNjc1OworICAgIHQuZ3JlYXRlciA9IDY3NTsKKyAgICB0LnF1ZXN0aW9uID0gNTAwOworICAgIHQuYXQgPSA5MjA7CisgICAgdC5BID0gNjExOworICAgIHQuQiA9IDYxMTsKKyAgICB0LkMgPSA2Njc7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDYxMTsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzIyOworICAgIHQuSCA9IDcyMjsKKyAgICB0LkkgPSAzMzM7CisgICAgdC5KID0gNDQ0OworICAgIHQuSyA9IDY2NzsKKyAgICB0LkwgPSA1NTY7CisgICAgdC5NID0gODMzOworICAgIHQuTiA9IDY2NzsKKyAgICB0Lk8gPSA3MjI7CisgICAgdC5QID0gNjExOworICAgIHQuUSA9IDcyMjsKKyAgICB0LlIgPSA2MTE7CisgICAgdC5TID0gNTAwOworICAgIHQuVCA9IDU1NjsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjExOworICAgIHQuVyA9IDgzMzsKKyAgICB0LlggPSA2MTE7CisgICAgdC5ZID0gNTU2OworICAgIHQuWiA9IDU1NjsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMzg5OworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMzg5OworICAgIHQuYXNjaWljaXJjdW0gPSA0MjI7CisgICAgdC51bmRlcnNjb3JlID0gNTAwOworICAgIHQucXVvdGVsZWZ0ID0gMzMzOworICAgIHQuYSA9IDUwMDsKKyAgICB0LmIgPSA1MDA7CisgICAgdC5jID0gNDQ0OworICAgIHQuZCA9IDUwMDsKKyAgICB0LmUgPSA0NDQ7CisgICAgdC5mID0gMjc4OworICAgIHQuZyA9IDUwMDsKKyAgICB0LmggPSA1MDA7CisgICAgdC5pID0gMjc4OworICAgIHQuaiA9IDI3ODsKKyAgICB0LmsgPSA0NDQ7CisgICAgdC5sID0gMjc4OworICAgIHQubSA9IDcyMjsKKyAgICB0Lm4gPSA1MDA7CisgICAgdC5vID0gNTAwOworICAgIHQucCA9IDUwMDsKKyAgICB0LnEgPSA1MDA7CisgICAgdC5yID0gMzg5OworICAgIHQucyA9IDM4OTsKKyAgICB0LnQgPSAyNzg7CisgICAgdC51ID0gNTAwOworICAgIHQudiA9IDQ0NDsKKyAgICB0LncgPSA2Njc7CisgICAgdC54ID0gNDQ0OworICAgIHQueSA9IDQ0NDsKKyAgICB0LnogPSAzODk7CisgICAgdC5icmFjZWxlZnQgPSA0MDA7CisgICAgdC5iYXIgPSAyNzU7CisgICAgdC5icmFjZXJpZ2h0ID0gNDAwOworICAgIHQuYXNjaWl0aWxkZSA9IDU0MTsKKyAgICB0LmV4Y2xhbWRvd24gPSAzODk7CisgICAgdC5jZW50ID0gNTAwOworICAgIHQuc3RlcmxpbmcgPSA1MDA7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDUwMDsKKyAgICB0LmZsb3JpbiA9IDUwMDsKKyAgICB0LnNlY3Rpb24gPSA1MDA7CisgICAgdC5jdXJyZW5jeSA9IDUwMDsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMjE0OworICAgIHQucXVvdGVkYmxsZWZ0ID0gNTU2OworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNTAwOworICAgIHQuZmwgPSA1MDA7CisgICAgdC5lbmRhc2ggPSA1MDA7CisgICAgdC5kYWdnZXIgPSA1MDA7CisgICAgdC5kYWdnZXJkYmwgPSA1MDA7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI1MDsKKyAgICB0LnBhcmFncmFwaCA9IDUyMzsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMzMzOworICAgIHQucXVvdGVkYmxiYXNlID0gNTU2OworICAgIHQucXVvdGVkYmxyaWdodCA9IDU1NjsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTAwOworICAgIHQuZWxsaXBzaXMgPSA4ODk7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSA4ODk7CisgICAgdC5BRSA9IDg4OTsKKyAgICB0Lm9yZGZlbWluaW5lID0gMjc2OworICAgIHQuTHNsYXNoID0gNTU2OworICAgIHQuT3NsYXNoID0gNzIyOworICAgIHQuT0UgPSA5NDQ7CisgICAgdC5vcmRtYXNjdWxpbmUgPSAzMTA7CisgICAgdC5hZSA9IDY2NzsKKyAgICB0LmRvdGxlc3NpID0gMjc4OworICAgIHQubHNsYXNoID0gMjc4OworICAgIHQub3NsYXNoID0gNTAwOworICAgIHQub2UgPSA2Njc7CisgICAgdC5nZXJtYW5kYmxzID0gNTAwOworICAgIHQuSWRpZXJlc2lzID0gMzMzOworICAgIHQuZWFjdXRlID0gNDQ0OworICAgIHQuYWJyZXZlID0gNTAwOworICAgIHQudWh1bmdhcnVtbGF1dCA9IDUwMDsKKyAgICB0LmVjYXJvbiA9IDQ0NDsKKyAgICB0LllkaWVyZXNpcyA9IDU1NjsKKyAgICB0LmRpdmlkZSA9IDY3NTsKKyAgICB0LllhY3V0ZSA9IDU1NjsKKyAgICB0LkFjaXJjdW1mbGV4ID0gNjExOworICAgIHQuYWFjdXRlID0gNTAwOworICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CisgICAgdC55YWN1dGUgPSA0NDQ7CisgICAgdC5zY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKKyAgICB0LlVyaW5nID0gNzIyOworICAgIHQuVWRpZXJlc2lzID0gNzIyOworICAgIHQuYW9nb25layA9IDUwMDsKKyAgICB0LlVhY3V0ZSA9IDcyMjsKKyAgICB0LnVvZ29uZWsgPSA1MDA7CisgICAgdC5FZGllcmVzaXMgPSA2MTE7CisgICAgdC5EY3JvYXQgPSA3MjI7CisgICAgdC5jb21tYWFjY2VudCA9IDI1MDsKKyAgICB0LmNvcHlyaWdodCA9IDc2MDsKKyAgICB0LkVtYWNyb24gPSA2MTE7CisgICAgdC5jY2Fyb24gPSA0NDQ7CisgICAgdC5hcmluZyA9IDUwMDsKKyAgICB0Lk5jb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LmxhY3V0ZSA9IDI3ODsKKyAgICB0LmFncmF2ZSA9IDUwMDsKKyAgICB0LlRjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0LkNhY3V0ZSA9IDY2NzsKKyAgICB0LmF0aWxkZSA9IDUwMDsKKyAgICB0LkVkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5zY2Fyb24gPSAzODk7CisgICAgdC5zY2VkaWxsYSA9IDM4OTsKKyAgICB0LmlhY3V0ZSA9IDI3ODsKKyAgICB0LmxvemVuZ2UgPSA0NzE7CisgICAgdC5SY2Fyb24gPSA2MTE7CisgICAgdC5HY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC51Y2lyY3VtZmxleCA9IDUwMDsKKyAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOworICAgIHQuQW1hY3JvbiA9IDYxMTsKKyAgICB0LnJjYXJvbiA9IDM4OTsKKyAgICB0LmNjZWRpbGxhID0gNDQ0OworICAgIHQuWmRvdGFjY2VudCA9IDU1NjsKKyAgICB0LlRob3JuID0gNjExOworICAgIHQuT21hY3JvbiA9IDcyMjsKKyAgICB0LlJhY3V0ZSA9IDYxMTsKKyAgICB0LlNhY3V0ZSA9IDUwMDsKKyAgICB0LmRjYXJvbiA9IDU0NDsKKyAgICB0LlVtYWNyb24gPSA3MjI7CisgICAgdC51cmluZyA9IDUwMDsKKyAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZ3JhdmUgPSA3MjI7CisgICAgdC5BZ3JhdmUgPSA2MTE7CisgICAgdC5BYnJldmUgPSA2MTE7CisgICAgdC5tdWx0aXBseSA9IDY3NTsKKyAgICB0LnVhY3V0ZSA9IDUwMDsKKyAgICB0LlRjYXJvbiA9IDU1NjsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDc2OworICAgIHQueWRpZXJlc2lzID0gNDQ0OworICAgIHQuTmFjdXRlID0gNjY3OworICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5FY2lyY3VtZmxleCA9IDYxMTsKKyAgICB0LmFkaWVyZXNpcyA9IDUwMDsKKyAgICB0LmVkaWVyZXNpcyA9IDQ0NDsKKyAgICB0LmNhY3V0ZSA9IDQ0NDsKKyAgICB0Lm5hY3V0ZSA9IDUwMDsKKyAgICB0LnVtYWNyb24gPSA1MDA7CisgICAgdC5OY2Fyb24gPSA2Njc7CisgICAgdC5JYWN1dGUgPSAzMzM7CisgICAgdC5wbHVzbWludXMgPSA2NzU7CisgICAgdC5icm9rZW5iYXIgPSAyNzU7CisgICAgdC5yZWdpc3RlcmVkID0gNzYwOworICAgIHQuR2JyZXZlID0gNzIyOworICAgIHQuSWRvdGFjY2VudCA9IDMzMzsKKyAgICB0LnN1bW1hdGlvbiA9IDYwMDsKKyAgICB0LkVncmF2ZSA9IDYxMTsKKyAgICB0LnJhY3V0ZSA9IDM4OTsKKyAgICB0Lm9tYWNyb24gPSA1MDA7CisgICAgdC5aYWN1dGUgPSA1NTY7CisgICAgdC5aY2Fyb24gPSA1NTY7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5FdGggPSA3MjI7CisgICAgdC5DY2VkaWxsYSA9IDY2NzsKKyAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LnRjYXJvbiA9IDMwMDsKKyAgICB0LmVvZ29uZWsgPSA0NDQ7CisgICAgdC5Vb2dvbmVrID0gNzIyOworICAgIHQuQWFjdXRlID0gNjExOworICAgIHQuQWRpZXJlc2lzID0gNjExOworICAgIHQuZWdyYXZlID0gNDQ0OworICAgIHQuemFjdXRlID0gMzg5OworICAgIHQuaW9nb25layA9IDI3ODsKKyAgICB0Lk9hY3V0ZSA9IDcyMjsKKyAgICB0Lm9hY3V0ZSA9IDUwMDsKKyAgICB0LmFtYWNyb24gPSA1MDA7CisgICAgdC5zYWN1dGUgPSAzODk7CisgICAgdC5pZGllcmVzaXMgPSAyNzg7CisgICAgdC5PY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LlVncmF2ZSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQudGhvcm4gPSA1MDA7CisgICAgdC50d29zdXBlcmlvciA9IDMwMDsKKyAgICB0Lk9kaWVyZXNpcyA9IDcyMjsKKyAgICB0Lm11ID0gNTAwOworICAgIHQuaWdyYXZlID0gMjc4OworICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDsKKyAgICB0LkVvZ29uZWsgPSA2MTE7CisgICAgdC5kY3JvYXQgPSA1MDA7CisgICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwOworICAgIHQuU2NlZGlsbGEgPSA1MDA7CisgICAgdC5sY2Fyb24gPSAzMDA7CisgICAgdC5LY29tbWFhY2NlbnQgPSA2Njc7CisgICAgdC5MYWN1dGUgPSA1NTY7CisgICAgdC50cmFkZW1hcmsgPSA5ODA7CisgICAgdC5lZG90YWNjZW50ID0gNDQ0OworICAgIHQuSWdyYXZlID0gMzMzOworICAgIHQuSW1hY3JvbiA9IDMzMzsKKyAgICB0LkxjYXJvbiA9IDYxMTsKKyAgICB0Lm9uZWhhbGYgPSA3NTA7CisgICAgdC5sZXNzZXF1YWwgPSA1NDk7CisgICAgdC5vY2lyY3VtZmxleCA9IDUwMDsKKyAgICB0Lm50aWxkZSA9IDUwMDsKKyAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5FYWN1dGUgPSA2MTE7CisgICAgdC5lbWFjcm9uID0gNDQ0OworICAgIHQuZ2JyZXZlID0gNTAwOworICAgIHQub25lcXVhcnRlciA9IDc1MDsKKyAgICB0LlNjYXJvbiA9IDUwMDsKKyAgICB0LlNjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5vZ3JhdmUgPSA1MDA7CisgICAgdC5DY2Fyb24gPSA2Njc7CisgICAgdC51Z3JhdmUgPSA1MDA7CisgICAgdC5yYWRpY2FsID0gNDUzOworICAgIHQuRGNhcm9uID0gNzIyOworICAgIHQucmNvbW1hYWNjZW50ID0gMzg5OworICAgIHQuTnRpbGRlID0gNjY3OworICAgIHQub3RpbGRlID0gNTAwOworICAgIHQuUmNvbW1hYWNjZW50ID0gNjExOworICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OworICAgIHQuQXRpbGRlID0gNjExOworICAgIHQuQW9nb25layA9IDYxMTsKKyAgICB0LkFyaW5nID0gNjExOworICAgIHQuT3RpbGRlID0gNzIyOworICAgIHQuemRvdGFjY2VudCA9IDM4OTsKKyAgICB0LkVjYXJvbiA9IDYxMTsKKyAgICB0LklvZ29uZWsgPSAzMzM7CisgICAgdC5rY29tbWFhY2NlbnQgPSA0NDQ7CisgICAgdC5taW51cyA9IDY3NTsKKyAgICB0LkljaXJjdW1mbGV4ID0gMzMzOworICAgIHQubmNhcm9uID0gNTAwOworICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQubG9naWNhbG5vdCA9IDY3NTsKKyAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKKyAgICB0LnVkaWVyZXNpcyA9IDUwMDsKKyAgICB0Lm5vdGVxdWFsID0gNTQ5OworICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQuZXRoID0gNTAwOworICAgIHQuemNhcm9uID0gMzg5OworICAgIHQubmNvbW1hYWNjZW50ID0gNTAwOworICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CisgICAgdC5pbWFjcm9uID0gMjc4OworICAgIHQuRXVybyA9IDUwMDsKKyAgfSk7CisgIHQuWmFwZkRpbmdiYXRzID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgICB0LnNwYWNlID0gMjc4OworICAgIHQuYTEgPSA5NzQ7CisgICAgdC5hMiA9IDk2MTsKKyAgICB0LmEyMDIgPSA5NzQ7CisgICAgdC5hMyA9IDk4MDsKKyAgICB0LmE0ID0gNzE5OworICAgIHQuYTUgPSA3ODk7CisgICAgdC5hMTE5ID0gNzkwOworICAgIHQuYTExOCA9IDc5MTsKKyAgICB0LmExMTcgPSA2OTA7CisgICAgdC5hMTEgPSA5NjA7CisgICAgdC5hMTIgPSA5Mzk7CisgICAgdC5hMTMgPSA1NDk7CisgICAgdC5hMTQgPSA4NTU7CisgICAgdC5hMTUgPSA5MTE7CisgICAgdC5hMTYgPSA5MzM7CisgICAgdC5hMTA1ID0gOTExOworICAgIHQuYTE3ID0gOTQ1OworICAgIHQuYTE4ID0gOTc0OworICAgIHQuYTE5ID0gNzU1OworICAgIHQuYTIwID0gODQ2OworICAgIHQuYTIxID0gNzYyOworICAgIHQuYTIyID0gNzYxOworICAgIHQuYTIzID0gNTcxOworICAgIHQuYTI0ID0gNjc3OworICAgIHQuYTI1ID0gNzYzOworICAgIHQuYTI2ID0gNzYwOworICAgIHQuYTI3ID0gNzU5OworICAgIHQuYTI4ID0gNzU0OworICAgIHQuYTYgPSA0OTQ7CisgICAgdC5hNyA9IDU1MjsKKyAgICB0LmE4ID0gNTM3OworICAgIHQuYTkgPSA1Nzc7CisgICAgdC5hMTAgPSA2OTI7CisgICAgdC5hMjkgPSA3ODY7CisgICAgdC5hMzAgPSA3ODg7CisgICAgdC5hMzEgPSA3ODg7CisgICAgdC5hMzIgPSA3OTA7CisgICAgdC5hMzMgPSA3OTM7CisgICAgdC5hMzQgPSA3OTQ7CisgICAgdC5hMzUgPSA4MTY7CisgICAgdC5hMzYgPSA4MjM7CisgICAgdC5hMzcgPSA3ODk7CisgICAgdC5hMzggPSA4NDE7CisgICAgdC5hMzkgPSA4MjM7CisgICAgdC5hNDAgPSA4MzM7CisgICAgdC5hNDEgPSA4MTY7CisgICAgdC5hNDIgPSA4MzE7CisgICAgdC5hNDMgPSA5MjM7CisgICAgdC5hNDQgPSA3NDQ7CisgICAgdC5hNDUgPSA3MjM7CisgICAgdC5hNDYgPSA3NDk7CisgICAgdC5hNDcgPSA3OTA7CisgICAgdC5hNDggPSA3OTI7CisgICAgdC5hNDkgPSA2OTU7CisgICAgdC5hNTAgPSA3NzY7CisgICAgdC5hNTEgPSA3Njg7CisgICAgdC5hNTIgPSA3OTI7CisgICAgdC5hNTMgPSA3NTk7CisgICAgdC5hNTQgPSA3MDc7CisgICAgdC5hNTUgPSA3MDg7CisgICAgdC5hNTYgPSA2ODI7CisgICAgdC5hNTcgPSA3MDE7CisgICAgdC5hNTggPSA4MjY7CisgICAgdC5hNTkgPSA4MTU7CisgICAgdC5hNjAgPSA3ODk7CisgICAgdC5hNjEgPSA3ODk7CisgICAgdC5hNjIgPSA3MDc7CisgICAgdC5hNjMgPSA2ODc7CisgICAgdC5hNjQgPSA2OTY7CisgICAgdC5hNjUgPSA2ODk7CisgICAgdC5hNjYgPSA3ODY7CisgICAgdC5hNjcgPSA3ODc7CisgICAgdC5hNjggPSA3MTM7CisgICAgdC5hNjkgPSA3OTE7CisgICAgdC5hNzAgPSA3ODU7CisgICAgdC5hNzEgPSA3OTE7CisgICAgdC5hNzIgPSA4NzM7CisgICAgdC5hNzMgPSA3NjE7CisgICAgdC5hNzQgPSA3NjI7CisgICAgdC5hMjAzID0gNzYyOworICAgIHQuYTc1ID0gNzU5OworICAgIHQuYTIwNCA9IDc1OTsKKyAgICB0LmE3NiA9IDg5MjsKKyAgICB0LmE3NyA9IDg5MjsKKyAgICB0LmE3OCA9IDc4ODsKKyAgICB0LmE3OSA9IDc4NDsKKyAgICB0LmE4MSA9IDQzODsKKyAgICB0LmE4MiA9IDEzODsKKyAgICB0LmE4MyA9IDI3NzsKKyAgICB0LmE4NCA9IDQxNTsKKyAgICB0LmE5NyA9IDM5MjsKKyAgICB0LmE5OCA9IDM5MjsKKyAgICB0LmE5OSA9IDY2ODsKKyAgICB0LmExMDAgPSA2Njg7CisgICAgdC5hODkgPSAzOTA7CisgICAgdC5hOTAgPSAzOTA7CisgICAgdC5hOTMgPSAzMTc7CisgICAgdC5hOTQgPSAzMTc7CisgICAgdC5hOTEgPSAyNzY7CisgICAgdC5hOTIgPSAyNzY7CisgICAgdC5hMjA1ID0gNTA5OworICAgIHQuYTg1ID0gNTA5OworICAgIHQuYTIwNiA9IDQxMDsKKyAgICB0LmE4NiA9IDQxMDsKKyAgICB0LmE4NyA9IDIzNDsKKyAgICB0LmE4OCA9IDIzNDsKKyAgICB0LmE5NSA9IDMzNDsKKyAgICB0LmE5NiA9IDMzNDsKKyAgICB0LmExMDEgPSA3MzI7CisgICAgdC5hMTAyID0gNTQ0OworICAgIHQuYTEwMyA9IDU0NDsKKyAgICB0LmExMDQgPSA5MTA7CisgICAgdC5hMTA2ID0gNjY3OworICAgIHQuYTEwNyA9IDc2MDsKKyAgICB0LmExMDggPSA3NjA7CisgICAgdC5hMTEyID0gNzc2OworICAgIHQuYTExMSA9IDU5NTsKKyAgICB0LmExMTAgPSA2OTQ7CisgICAgdC5hMTA5ID0gNjI2OworICAgIHQuYTEyMCA9IDc4ODsKKyAgICB0LmExMjEgPSA3ODg7CisgICAgdC5hMTIyID0gNzg4OworICAgIHQuYTEyMyA9IDc4ODsKKyAgICB0LmExMjQgPSA3ODg7CisgICAgdC5hMTI1ID0gNzg4OworICAgIHQuYTEyNiA9IDc4ODsKKyAgICB0LmExMjcgPSA3ODg7CisgICAgdC5hMTI4ID0gNzg4OworICAgIHQuYTEyOSA9IDc4ODsKKyAgICB0LmExMzAgPSA3ODg7CisgICAgdC5hMTMxID0gNzg4OworICAgIHQuYTEzMiA9IDc4ODsKKyAgICB0LmExMzMgPSA3ODg7CisgICAgdC5hMTM0ID0gNzg4OworICAgIHQuYTEzNSA9IDc4ODsKKyAgICB0LmExMzYgPSA3ODg7CisgICAgdC5hMTM3ID0gNzg4OworICAgIHQuYTEzOCA9IDc4ODsKKyAgICB0LmExMzkgPSA3ODg7CisgICAgdC5hMTQwID0gNzg4OworICAgIHQuYTE0MSA9IDc4ODsKKyAgICB0LmExNDIgPSA3ODg7CisgICAgdC5hMTQzID0gNzg4OworICAgIHQuYTE0NCA9IDc4ODsKKyAgICB0LmExNDUgPSA3ODg7CisgICAgdC5hMTQ2ID0gNzg4OworICAgIHQuYTE0NyA9IDc4ODsKKyAgICB0LmExNDggPSA3ODg7CisgICAgdC5hMTQ5ID0gNzg4OworICAgIHQuYTE1MCA9IDc4ODsKKyAgICB0LmExNTEgPSA3ODg7CisgICAgdC5hMTUyID0gNzg4OworICAgIHQuYTE1MyA9IDc4ODsKKyAgICB0LmExNTQgPSA3ODg7CisgICAgdC5hMTU1ID0gNzg4OworICAgIHQuYTE1NiA9IDc4ODsKKyAgICB0LmExNTcgPSA3ODg7CisgICAgdC5hMTU4ID0gNzg4OworICAgIHQuYTE1OSA9IDc4ODsKKyAgICB0LmExNjAgPSA4OTQ7CisgICAgdC5hMTYxID0gODM4OworICAgIHQuYTE2MyA9IDEwMTY7CisgICAgdC5hMTY0ID0gNDU4OworICAgIHQuYTE5NiA9IDc0ODsKKyAgICB0LmExNjUgPSA5MjQ7CisgICAgdC5hMTkyID0gNzQ4OworICAgIHQuYTE2NiA9IDkxODsKKyAgICB0LmExNjcgPSA5Mjc7CisgICAgdC5hMTY4ID0gOTI4OworICAgIHQuYTE2OSA9IDkyODsKKyAgICB0LmExNzAgPSA4MzQ7CisgICAgdC5hMTcxID0gODczOworICAgIHQuYTE3MiA9IDgyODsKKyAgICB0LmExNzMgPSA5MjQ7CisgICAgdC5hMTYyID0gOTI0OworICAgIHQuYTE3NCA9IDkxNzsKKyAgICB0LmExNzUgPSA5MzA7CisgICAgdC5hMTc2ID0gOTMxOworICAgIHQuYTE3NyA9IDQ2MzsKKyAgICB0LmExNzggPSA4ODM7CisgICAgdC5hMTc5ID0gODM2OworICAgIHQuYTE5MyA9IDgzNjsKKyAgICB0LmExODAgPSA4Njc7CisgICAgdC5hMTk5ID0gODY3OworICAgIHQuYTE4MSA9IDY5NjsKKyAgICB0LmEyMDAgPSA2OTY7CisgICAgdC5hMTgyID0gODc0OworICAgIHQuYTIwMSA9IDg3NDsKKyAgICB0LmExODMgPSA3NjA7CisgICAgdC5hMTg0ID0gOTQ2OworICAgIHQuYTE5NyA9IDc3MTsKKyAgICB0LmExODUgPSA4NjU7CisgICAgdC5hMTk0ID0gNzcxOworICAgIHQuYTE5OCA9IDg4ODsKKyAgICB0LmExODYgPSA5Njc7CisgICAgdC5hMTk1ID0gODg4OworICAgIHQuYTE4NyA9IDgzMTsKKyAgICB0LmExODggPSA4NzM7CisgICAgdC5hMTg5ID0gOTI3OworICAgIHQuYTE5MCA9IDk3MDsKKyAgICB0LmExOTEgPSA5MTg7CisgIH0pOworfSk7CitleHBvcnRzLmdldE1ldHJpY3MgPSBnZXRNZXRyaWNzOworCisvKioqLyB9KSwKKy8qIDI0MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk11cm11ckhhc2gzXzY0ID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIFNFRUQgPSAweGMzZDJlMWYwOwordmFyIE1BU0tfSElHSCA9IDB4ZmZmZjAwMDA7Cit2YXIgTUFTS19MT1cgPSAweGZmZmY7CisKK3ZhciBNdXJtdXJIYXNoM182NCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIE11cm11ckhhc2gzXzY0KHNlZWQpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTXVybXVySGFzaDNfNjQpOworCisgICAgdGhpcy5oMSA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7CisgICAgdGhpcy5oMiA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoTXVybXVySGFzaDNfNjQsIFt7CisgICAga2V5OiAidXBkYXRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGlucHV0KSB7CisgICAgICB2YXIgZGF0YSwgbGVuZ3RoOworCisgICAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShpbnB1dCkpIHsKKyAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCAqIDIpOworICAgICAgICBsZW5ndGggPSAwOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGlucHV0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICB2YXIgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSk7CisKKyAgICAgICAgICBpZiAoY29kZSA8PSAweGZmKSB7CisgICAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSA+Pj4gODsKKyAgICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSAmIDB4ZmY7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShpbnB1dCkpIHsKKyAgICAgICAgZGF0YSA9IGlucHV0OworICAgICAgICBsZW5ndGggPSBkYXRhLmJ5dGVMZW5ndGg7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIGRhdGEgZm9ybWF0IGluIE11cm11ckhhc2gzXzY0X3VwZGF0ZS4gIiArICJJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LiIpOworICAgICAgfQorCisgICAgICB2YXIgYmxvY2tDb3VudHMgPSBsZW5ndGggPj4gMjsKKyAgICAgIHZhciB0YWlsTGVuZ3RoID0gbGVuZ3RoIC0gYmxvY2tDb3VudHMgKiA0OworICAgICAgdmFyIGRhdGFVaW50MzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIDAsIGJsb2NrQ291bnRzKTsKKyAgICAgIHZhciBrMSA9IDAsCisgICAgICAgICAgazIgPSAwOworICAgICAgdmFyIGgxID0gdGhpcy5oMSwKKyAgICAgICAgICBoMiA9IHRoaXMuaDI7CisgICAgICB2YXIgQzEgPSAweGNjOWUyZDUxLAorICAgICAgICAgIEMyID0gMHgxYjg3MzU5MzsKKyAgICAgIHZhciBDMV9MT1cgPSBDMSAmIE1BU0tfTE9XLAorICAgICAgICAgIEMyX0xPVyA9IEMyICYgTUFTS19MT1c7CisKKyAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBibG9ja0NvdW50czsgX2krKykgeworICAgICAgICBpZiAoX2kgJiAxKSB7CisgICAgICAgICAgazEgPSBkYXRhVWludDMyW19pXTsKKyAgICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XOworICAgICAgICAgIGsxID0gazEgPDwgMTUgfCBrMSA+Pj4gMTc7CisgICAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVzsKKyAgICAgICAgICBoMSBePSBrMTsKKyAgICAgICAgICBoMSA9IGgxIDw8IDEzIHwgaDEgPj4+IDE5OworICAgICAgICAgIGgxID0gaDEgKiA1ICsgMHhlNjU0NmI2NDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBrMiA9IGRhdGFVaW50MzJbX2ldOworICAgICAgICAgIGsyID0gazIgKiBDMSAmIE1BU0tfSElHSCB8IGsyICogQzFfTE9XICYgTUFTS19MT1c7CisgICAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNzsKKyAgICAgICAgICBrMiA9IGsyICogQzIgJiBNQVNLX0hJR0ggfCBrMiAqIEMyX0xPVyAmIE1BU0tfTE9XOworICAgICAgICAgIGgyIF49IGsyOworICAgICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7CisgICAgICAgICAgaDIgPSBoMiAqIDUgKyAweGU2NTQ2YjY0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGsxID0gMDsKKworICAgICAgc3dpdGNoICh0YWlsTGVuZ3RoKSB7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDJdIDw8IDE2OworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0XTsKKyAgICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XOworICAgICAgICAgIGsxID0gazEgPDwgMTUgfCBrMSA+Pj4gMTc7CisgICAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVzsKKworICAgICAgICAgIGlmIChibG9ja0NvdW50cyAmIDEpIHsKKyAgICAgICAgICAgIGgxIF49IGsxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoMiBePSBrMTsKKyAgICAgICAgICB9CisKKyAgICAgIH0KKworICAgICAgdGhpcy5oMSA9IGgxOworICAgICAgdGhpcy5oMiA9IGgyOworICAgIH0KKyAgfSwgeworICAgIGtleTogImhleGRpZ2VzdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGhleGRpZ2VzdCgpIHsKKyAgICAgIHZhciBoMSA9IHRoaXMuaDEsCisgICAgICAgICAgaDIgPSB0aGlzLmgyOworICAgICAgaDEgXj0gaDIgPj4+IDE7CisgICAgICBoMSA9IGgxICogMHhlZDU1OGNjZCAmIE1BU0tfSElHSCB8IGgxICogMHg4Y2NkICYgTUFTS19MT1c7CisgICAgICBoMiA9IGgyICogMHhmZjUxYWZkNyAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhhZmQ3ZWQ1NSAmIE1BU0tfSElHSCkgPj4+IDE2OworICAgICAgaDEgXj0gaDIgPj4+IDE7CisgICAgICBoMSA9IGgxICogMHgxYTg1ZWM1MyAmIE1BU0tfSElHSCB8IGgxICogMHhlYzUzICYgTUFTS19MT1c7CisgICAgICBoMiA9IGgyICogMHhjNGNlYjlmZSAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhiOWZlMWE4NSAmIE1BU0tfSElHSCkgPj4+IDE2OworICAgICAgaDEgXj0gaDIgPj4+IDE7CisgICAgICB2YXIgaGV4MSA9IChoMSA+Pj4gMCkudG9TdHJpbmcoMTYpLAorICAgICAgICAgIGhleDIgPSAoaDIgPj4+IDApLnRvU3RyaW5nKDE2KTsKKyAgICAgIHJldHVybiBoZXgxLnBhZFN0YXJ0KDgsICIwIikgKyBoZXgyLnBhZFN0YXJ0KDgsICIwIik7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIE11cm11ckhhc2gzXzY0OworfSgpOworCitleHBvcnRzLk11cm11ckhhc2gzXzY0ID0gTXVybXVySGFzaDNfNjQ7CisKKy8qKiovIH0pLAorLyogMjQyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGSW1hZ2UgPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oMikpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwMik7CisKK3ZhciBfY29sb3JzcGFjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIwKTsKKwordmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwOSk7CisKK3ZhciBfanBlZ19zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxNSk7CisKK3ZhciBfanB4ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMTgpOworCitmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAiZGVmYXVsdCI6IG9iaiB9OyB9CisKK2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH0KKworZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7IGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK2Z1bmN0aW9uIGRlY29kZUFuZENsYW1wKHZhbHVlLCBhZGRlbmQsIGNvZWZmaWNpZW50LCBtYXgpIHsKKyAgdmFsdWUgPSBhZGRlbmQgKyB2YWx1ZSAqIGNvZWZmaWNpZW50OworCisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICB2YWx1ZSA9IDA7CisgIH0gZWxzZSBpZiAodmFsdWUgPiBtYXgpIHsKKyAgICB2YWx1ZSA9IG1heDsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworZnVuY3Rpb24gcmVzaXplSW1hZ2VNYXNrKHNyYywgYnBjLCB3MSwgaDEsIHcyLCBoMikgeworICB2YXIgbGVuZ3RoID0gdzIgKiBoMjsKKyAgdmFyIGRlc3Q7CisKKyAgaWYgKGJwYyA8PSA4KSB7CisgICAgZGVzdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisgIH0gZWxzZSBpZiAoYnBjIDw9IDE2KSB7CisgICAgZGVzdCA9IG5ldyBVaW50MTZBcnJheShsZW5ndGgpOworICB9IGVsc2UgeworICAgIGRlc3QgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTsKKyAgfQorCisgIHZhciB4UmF0aW8gPSB3MSAvIHcyOworICB2YXIgeVJhdGlvID0gaDEgLyBoMjsKKyAgdmFyIGksCisgICAgICBqLAorICAgICAgcHksCisgICAgICBuZXdJbmRleCA9IDAsCisgICAgICBvbGRJbmRleDsKKyAgdmFyIHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpOworICB2YXIgdzFTY2FubGluZSA9IHcxOworCisgIGZvciAoaSA9IDA7IGkgPCB3MjsgaSsrKSB7CisgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbyk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgaDI7IGkrKykgeworICAgIHB5ID0gTWF0aC5mbG9vcihpICogeVJhdGlvKSAqIHcxU2NhbmxpbmU7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgdzI7IGorKykgeworICAgICAgb2xkSW5kZXggPSBweSArIHhTY2FsZWRbal07CisgICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4XTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZGVzdDsKK30KKwordmFyIFBERkltYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGSW1hZ2UoX3JlZikgeworICAgIHZhciB4cmVmID0gX3JlZi54cmVmLAorICAgICAgICByZXMgPSBfcmVmLnJlcywKKyAgICAgICAgaW1hZ2UgPSBfcmVmLmltYWdlLAorICAgICAgICBfcmVmJGlzSW5saW5lID0gX3JlZi5pc0lubGluZSwKKyAgICAgICAgaXNJbmxpbmUgPSBfcmVmJGlzSW5saW5lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkaXNJbmxpbmUsCisgICAgICAgIF9yZWYkc21hc2sgPSBfcmVmLnNtYXNrLAorICAgICAgICBzbWFzayA9IF9yZWYkc21hc2sgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJHNtYXNrLAorICAgICAgICBfcmVmJG1hc2sgPSBfcmVmLm1hc2ssCisgICAgICAgIG1hc2sgPSBfcmVmJG1hc2sgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJG1hc2ssCisgICAgICAgIF9yZWYkaXNNYXNrID0gX3JlZi5pc01hc2ssCisgICAgICAgIGlzTWFzayA9IF9yZWYkaXNNYXNrID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkaXNNYXNrLAorICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnkgPSBfcmVmLnBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBfcmVmLmxvY2FsQ29sb3JTcGFjZUNhY2hlOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERkltYWdlKTsKKworICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKKyAgICB2YXIgZGljdCA9IGltYWdlLmRpY3Q7CisgICAgdmFyIGZpbHRlciA9IGRpY3QuZ2V0KCJGaWx0ZXIiKTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmaWx0ZXIpKSB7CisgICAgICBzd2l0Y2ggKGZpbHRlci5uYW1lKSB7CisgICAgICAgIGNhc2UgIkpQWERlY29kZSI6CisgICAgICAgICAgdmFyIGpweEltYWdlID0gbmV3IF9qcHguSnB4SW1hZ2UoKTsKKyAgICAgICAgICBqcHhJbWFnZS5wYXJzZUltYWdlUHJvcGVydGllcyhpbWFnZS5zdHJlYW0pOworICAgICAgICAgIGltYWdlLnN0cmVhbS5yZXNldCgpOworICAgICAgICAgIGltYWdlLndpZHRoID0ganB4SW1hZ2Uud2lkdGg7CisgICAgICAgICAgaW1hZ2UuaGVpZ2h0ID0ganB4SW1hZ2UuaGVpZ2h0OworICAgICAgICAgIGltYWdlLmJpdHNQZXJDb21wb25lbnQgPSBqcHhJbWFnZS5iaXRzUGVyQ29tcG9uZW50OworICAgICAgICAgIGltYWdlLm51bUNvbXBzID0ganB4SW1hZ2UuY29tcG9uZW50c0NvdW50OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIkpCSUcyRGVjb2RlIjoKKyAgICAgICAgICBpbWFnZS5iaXRzUGVyQ29tcG9uZW50ID0gMTsKKyAgICAgICAgICBpbWFnZS5udW1Db21wcyA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIHdpZHRoID0gZGljdC5nZXQoIldpZHRoIiwgIlciKTsKKyAgICB2YXIgaGVpZ2h0ID0gZGljdC5nZXQoIkhlaWdodCIsICJIIik7CisKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbWFnZS53aWR0aCkgJiYgaW1hZ2Uud2lkdGggPiAwICYmIE51bWJlci5pc0ludGVnZXIoaW1hZ2UuaGVpZ2h0KSAmJiBpbWFnZS5oZWlnaHQgPiAwICYmIChpbWFnZS53aWR0aCAhPT0gd2lkdGggfHwgaW1hZ2UuaGVpZ2h0ICE9PSBoZWlnaHQpKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgIiArICJyYXRoZXIgdGhhbiB0aGUgaW1hZ2UgZGljdGlvbmFyeS4iKTsKKyAgICAgIHdpZHRoID0gaW1hZ2Uud2lkdGg7CisgICAgICBoZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CisgICAgfQorCisgICAgaWYgKHdpZHRoIDwgMSB8fCBoZWlnaHQgPCAxKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgaW1hZ2Ugd2lkdGg6ICIuY29uY2F0KHdpZHRoLCAiIG9yIGhlaWdodDogIikuY29uY2F0KGhlaWdodCkpOworICAgIH0KKworICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKyAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKKyAgICB0aGlzLmludGVycG9sYXRlID0gZGljdC5nZXQoIkludGVycG9sYXRlIiwgIkkiKSB8fCBmYWxzZTsKKyAgICB0aGlzLmltYWdlTWFzayA9IGRpY3QuZ2V0KCJJbWFnZU1hc2siLCAiSU0iKSB8fCBmYWxzZTsKKyAgICB0aGlzLm1hdHRlID0gZGljdC5nZXQoIk1hdHRlIikgfHwgZmFsc2U7CisgICAgdmFyIGJpdHNQZXJDb21wb25lbnQgPSBpbWFnZS5iaXRzUGVyQ29tcG9uZW50OworCisgICAgaWYgKCFiaXRzUGVyQ29tcG9uZW50KSB7CisgICAgICBiaXRzUGVyQ29tcG9uZW50ID0gZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiLCAiQlBDIik7CisKKyAgICAgIGlmICghYml0c1BlckNvbXBvbmVudCkgeworICAgICAgICBpZiAodGhpcy5pbWFnZU1hc2spIHsKKyAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAiLmNvbmNhdCh0aGlzLmltYWdlTWFzaykpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5icGMgPSBiaXRzUGVyQ29tcG9uZW50OworCisgICAgaWYgKCF0aGlzLmltYWdlTWFzaykgeworICAgICAgdmFyIGNvbG9yU3BhY2UgPSBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpIHx8IGRpY3QuZ2V0UmF3KCJDUyIpOworCisgICAgICBpZiAoIWNvbG9yU3BhY2UpIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJKUFggaW1hZ2VzICh3aGljaCBkbyBub3QgcmVxdWlyZSBjb2xvciBzcGFjZXMpIik7CisKKyAgICAgICAgc3dpdGNoIChpbWFnZS5udW1Db21wcykgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRGV2aWNlR3JheSIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjb2xvclNwYWNlID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkRldmljZVJHQiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjb2xvclNwYWNlID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkRldmljZUNNWUsiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSlBYIGltYWdlcyB3aXRoICIuY29uY2F0KGltYWdlLm51bUNvbXBzLCAiICIpICsgImNvbG9yIGNvbXBvbmVudHMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLmNvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKKyAgICAgICAgY3M6IGNvbG9yU3BhY2UsCisgICAgICAgIHhyZWY6IHhyZWYsCisgICAgICAgIHJlc291cmNlczogaXNJbmxpbmUgPyByZXMgOiBudWxsLAorICAgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgICB9KTsKKyAgICAgIHRoaXMubnVtQ29tcHMgPSB0aGlzLmNvbG9yU3BhY2UubnVtQ29tcHM7CisgICAgfQorCisgICAgdGhpcy5kZWNvZGUgPSBkaWN0LmdldEFycmF5KCJEZWNvZGUiLCAiRCIpOworICAgIHRoaXMubmVlZHNEZWNvZGUgPSBmYWxzZTsKKworICAgIGlmICh0aGlzLmRlY29kZSAmJiAodGhpcy5jb2xvclNwYWNlICYmICF0aGlzLmNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLCBiaXRzUGVyQ29tcG9uZW50KSB8fCBpc01hc2sgJiYgIV9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLCAxKSkpIHsKKyAgICAgIHRoaXMubmVlZHNEZWNvZGUgPSB0cnVlOworICAgICAgdmFyIG1heCA9ICgxIDw8IGJpdHNQZXJDb21wb25lbnQpIC0gMTsKKyAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzID0gW107CisgICAgICB0aGlzLmRlY29kZUFkZGVuZHMgPSBbXTsKKyAgICAgIHZhciBpc0luZGV4ZWQgPSB0aGlzLmNvbG9yU3BhY2UgJiYgdGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJJbmRleGVkIjsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kZWNvZGUubGVuZ3RoOyBpICs9IDIsICsraikgeworICAgICAgICB2YXIgZG1pbiA9IHRoaXMuZGVjb2RlW2ldOworICAgICAgICB2YXIgZG1heCA9IHRoaXMuZGVjb2RlW2kgKyAxXTsKKyAgICAgICAgdGhpcy5kZWNvZGVDb2VmZmljaWVudHNbal0gPSBpc0luZGV4ZWQgPyAoZG1heCAtIGRtaW4pIC8gbWF4IDogZG1heCAtIGRtaW47CisgICAgICAgIHRoaXMuZGVjb2RlQWRkZW5kc1tqXSA9IGlzSW5kZXhlZCA/IGRtaW4gOiBtYXggKiBkbWluOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzbWFzaykgeworICAgICAgdGhpcy5zbWFzayA9IG5ldyBQREZJbWFnZSh7CisgICAgICAgIHhyZWY6IHhyZWYsCisgICAgICAgIHJlczogcmVzLAorICAgICAgICBpbWFnZTogc21hc2ssCisgICAgICAgIGlzSW5saW5lOiBpc0lubGluZSwKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiBwZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtYXNrKSB7CisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShtYXNrKSkgeworICAgICAgICB2YXIgbWFza0RpY3QgPSBtYXNrLmRpY3QsCisgICAgICAgICAgICBpbWFnZU1hc2sgPSBtYXNrRGljdC5nZXQoIkltYWdlTWFzayIsICJJTSIpOworCisgICAgICAgIGlmICghaW1hZ2VNYXNrKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJZ25vcmluZyAvTWFzayBpbiBpbWFnZSB3aXRob3V0IC9JbWFnZU1hc2suIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5tYXNrID0gbmV3IFBERkltYWdlKHsKKyAgICAgICAgICAgIHhyZWY6IHhyZWYsCisgICAgICAgICAgICByZXM6IHJlcywKKyAgICAgICAgICAgIGltYWdlOiBtYXNrLAorICAgICAgICAgICAgaXNJbmxpbmU6IGlzSW5saW5lLAorICAgICAgICAgICAgaXNNYXNrOiB0cnVlLAorICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiBwZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGSW1hZ2UsIFt7CisgICAga2V5OiAiZGVjb2RlQnVmZmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZGVjb2RlQnVmZmVyKGJ1ZmZlcikgeworICAgICAgdmFyIGJwYyA9IHRoaXMuYnBjOworICAgICAgdmFyIG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKKyAgICAgIHZhciBkZWNvZGVBZGRlbmRzID0gdGhpcy5kZWNvZGVBZGRlbmRzOworICAgICAgdmFyIGRlY29kZUNvZWZmaWNpZW50cyA9IHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzOworICAgICAgdmFyIG1heCA9ICgxIDw8IGJwYykgLSAxOworICAgICAgdmFyIGksIGlpOworCisgICAgICBpZiAoYnBjID09PSAxKSB7CisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBidWZmZXJbaV0gPSArIWJ1ZmZlcltpXTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGluZGV4ID0gMDsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtQ29tcHM7IGorKykgeworICAgICAgICAgIGJ1ZmZlcltpbmRleF0gPSBkZWNvZGVBbmRDbGFtcChidWZmZXJbaW5kZXhdLCBkZWNvZGVBZGRlbmRzW2pdLCBkZWNvZGVDb2VmZmljaWVudHNbal0sIG1heCk7CisgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImdldENvbXBvbmVudHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb21wb25lbnRzKGJ1ZmZlcikgeworICAgICAgdmFyIGJwYyA9IHRoaXMuYnBjOworCisgICAgICBpZiAoYnBjID09PSA4KSB7CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICB9CisKKyAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGg7CisgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOworICAgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcHM7CisgICAgICB2YXIgYnVmZmVyUG9zID0gMDsKKyAgICAgIHZhciBvdXRwdXQ7CisKKyAgICAgIGlmIChicGMgPD0gOCkgeworICAgICAgICBvdXRwdXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOworICAgICAgfSBlbHNlIGlmIChicGMgPD0gMTYpIHsKKyAgICAgICAgb3V0cHV0ID0gbmV3IFVpbnQxNkFycmF5KGxlbmd0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgdmFyIHJvd0NvbXBzID0gd2lkdGggKiBudW1Db21wczsKKyAgICAgIHZhciBtYXggPSAoMSA8PCBicGMpIC0gMTsKKyAgICAgIHZhciBpID0gMCwKKyAgICAgICAgICBpaSwKKyAgICAgICAgICBidWY7CisKKyAgICAgIGlmIChicGMgPT09IDEpIHsKKyAgICAgICAgdmFyIG1hc2ssIGxvb3AxRW5kLCBsb29wMkVuZDsKKworICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgICAgbG9vcDFFbmQgPSBpICsgKHJvd0NvbXBzICYgfjcpOworICAgICAgICAgIGxvb3AyRW5kID0gaSArIHJvd0NvbXBzOworCisgICAgICAgICAgd2hpbGUgKGkgPCBsb29wMUVuZCkgeworICAgICAgICAgICAgYnVmID0gYnVmZmVyW2J1ZmZlclBvcysrXTsKKyAgICAgICAgICAgIG91dHB1dFtpXSA9IGJ1ZiA+PiA3ICYgMTsKKyAgICAgICAgICAgIG91dHB1dFtpICsgMV0gPSBidWYgPj4gNiAmIDE7CisgICAgICAgICAgICBvdXRwdXRbaSArIDJdID0gYnVmID4+IDUgJiAxOworICAgICAgICAgICAgb3V0cHV0W2kgKyAzXSA9IGJ1ZiA+PiA0ICYgMTsKKyAgICAgICAgICAgIG91dHB1dFtpICsgNF0gPSBidWYgPj4gMyAmIDE7CisgICAgICAgICAgICBvdXRwdXRbaSArIDVdID0gYnVmID4+IDIgJiAxOworICAgICAgICAgICAgb3V0cHV0W2kgKyA2XSA9IGJ1ZiA+PiAxICYgMTsKKyAgICAgICAgICAgIG91dHB1dFtpICsgN10gPSBidWYgJiAxOworICAgICAgICAgICAgaSArPSA4OworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpIDwgbG9vcDJFbmQpIHsKKyAgICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcltidWZmZXJQb3MrK107CisgICAgICAgICAgICBtYXNrID0gMTI4OworCisgICAgICAgICAgICB3aGlsZSAoaSA8IGxvb3AyRW5kKSB7CisgICAgICAgICAgICAgIG91dHB1dFtpKytdID0gKyEhKGJ1ZiAmIG1hc2spOworICAgICAgICAgICAgICBtYXNrID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGJpdHMgPSAwOworICAgICAgICBidWYgPSAwOworCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gbGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIGlmIChpICUgcm93Q29tcHMgPT09IDApIHsKKyAgICAgICAgICAgIGJ1ZiA9IDA7CisgICAgICAgICAgICBiaXRzID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB3aGlsZSAoYml0cyA8IGJwYykgeworICAgICAgICAgICAgYnVmID0gYnVmIDw8IDggfCBidWZmZXJbYnVmZmVyUG9zKytdOworICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciByZW1haW5pbmdCaXRzID0gYml0cyAtIGJwYzsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBidWYgPj4gcmVtYWluaW5nQml0czsKKworICAgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gbWF4KSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1heDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBvdXRwdXRbaV0gPSB2YWx1ZTsKKyAgICAgICAgICBidWYgPSBidWYgJiAoMSA8PCByZW1haW5pbmdCaXRzKSAtIDE7CisgICAgICAgICAgYml0cyA9IHJlbWFpbmluZ0JpdHM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmaWxsT3BhY2l0eSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbGxPcGFjaXR5KHJnYmFCdWYsIHdpZHRoLCBoZWlnaHQsIGFjdHVhbEhlaWdodCwgaW1hZ2UpIHsKKyAgICAgIHZhciBzbWFzayA9IHRoaXMuc21hc2s7CisgICAgICB2YXIgbWFzayA9IHRoaXMubWFzazsKKyAgICAgIHZhciBhbHBoYUJ1Ziwgc3csIHNoLCBpLCBpaSwgajsKKworICAgICAgaWYgKHNtYXNrKSB7CisgICAgICAgIHN3ID0gc21hc2sud2lkdGg7CisgICAgICAgIHNoID0gc21hc2suaGVpZ2h0OworICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzdyAqIHNoKTsKKyAgICAgICAgc21hc2suZmlsbEdyYXlCdWZmZXIoYWxwaGFCdWYpOworCisgICAgICAgIGlmIChzdyAhPT0gd2lkdGggfHwgc2ggIT09IGhlaWdodCkgeworICAgICAgICAgIGFscGhhQnVmID0gcmVzaXplSW1hZ2VNYXNrKGFscGhhQnVmLCBzbWFzay5icGMsIHN3LCBzaCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobWFzaykgeworICAgICAgICBpZiAobWFzayBpbnN0YW5jZW9mIFBERkltYWdlKSB7CisgICAgICAgICAgc3cgPSBtYXNrLndpZHRoOworICAgICAgICAgIHNoID0gbWFzay5oZWlnaHQ7CisgICAgICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3cgKiBzaCk7CisgICAgICAgICAgbWFzay5udW1Db21wcyA9IDE7CisgICAgICAgICAgbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7CisKKyAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHN3ICogc2g7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgICBhbHBoYUJ1ZltpXSA9IDI1NSAtIGFscGhhQnVmW2ldOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdyAhPT0gd2lkdGggfHwgc2ggIT09IGhlaWdodCkgeworICAgICAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIG1hc2suYnBjLCBzdywgc2gsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1hc2spKSB7CisgICAgICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQpOworICAgICAgICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CisKKyAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRoICogaGVpZ2h0OyBpIDwgaWk7ICsraSkgeworICAgICAgICAgICAgdmFyIG9wYWNpdHkgPSAwOworICAgICAgICAgICAgdmFyIGltYWdlT2Zmc2V0ID0gaSAqIG51bUNvbXBzOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7ICsraikgeworICAgICAgICAgICAgICB2YXIgY29sb3IgPSBpbWFnZVtpbWFnZU9mZnNldCArIGpdOworICAgICAgICAgICAgICB2YXIgbWFza09mZnNldCA9IGogKiAyOworCisgICAgICAgICAgICAgIGlmIChjb2xvciA8IG1hc2tbbWFza09mZnNldF0gfHwgY29sb3IgPiBtYXNrW21hc2tPZmZzZXQgKyAxXSkgeworICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAyNTU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWxwaGFCdWZbaV0gPSBvcGFjaXR5OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVua25vd24gbWFzayBmb3JtYXQuIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGFscGhhQnVmKSB7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSAzLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7ICsraSwgaiArPSA0KSB7CisgICAgICAgICAgcmdiYUJ1ZltqXSA9IGFscGhhQnVmW2ldOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkgeworICAgICAgICAgIHJnYmFCdWZbal0gPSAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ1bmRvUHJlYmxlbmQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiB1bmRvUHJlYmxlbmQoYnVmZmVyLCB3aWR0aCwgaGVpZ2h0KSB7CisgICAgICB2YXIgbWF0dGUgPSB0aGlzLnNtYXNrICYmIHRoaXMuc21hc2subWF0dGU7CisKKyAgICAgIGlmICghbWF0dGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgbWF0dGVSZ2IgPSB0aGlzLmNvbG9yU3BhY2UuZ2V0UmdiKG1hdHRlLCAwKTsKKyAgICAgIHZhciBtYXR0ZVIgPSBtYXR0ZVJnYlswXTsKKyAgICAgIHZhciBtYXR0ZUcgPSBtYXR0ZVJnYlsxXTsKKyAgICAgIHZhciBtYXR0ZUIgPSBtYXR0ZVJnYlsyXTsKKyAgICAgIHZhciBsZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIDQ7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgICAgdmFyIGFscGhhID0gYnVmZmVyW2kgKyAzXTsKKworICAgICAgICBpZiAoYWxwaGEgPT09IDApIHsKKyAgICAgICAgICBidWZmZXJbaV0gPSAyNTU7CisgICAgICAgICAgYnVmZmVyW2kgKyAxXSA9IDI1NTsKKyAgICAgICAgICBidWZmZXJbaSArIDJdID0gMjU1OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGsgPSAyNTUgLyBhbHBoYTsKKyAgICAgICAgYnVmZmVyW2ldID0gKGJ1ZmZlcltpXSAtIG1hdHRlUikgKiBrICsgbWF0dGVSOworICAgICAgICBidWZmZXJbaSArIDFdID0gKGJ1ZmZlcltpICsgMV0gLSBtYXR0ZUcpICogayArIG1hdHRlRzsKKyAgICAgICAgYnVmZmVyW2kgKyAyXSA9IChidWZmZXJbaSArIDJdIC0gbWF0dGVCKSAqIGsgKyBtYXR0ZUI7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY3JlYXRlSW1hZ2VEYXRhIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlSW1hZ2VEYXRhKCkgeworICAgICAgdmFyIGZvcmNlUkdCQSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CisgICAgICB2YXIgZHJhd1dpZHRoID0gdGhpcy5kcmF3V2lkdGg7CisgICAgICB2YXIgZHJhd0hlaWdodCA9IHRoaXMuZHJhd0hlaWdodDsKKyAgICAgIHZhciBpbWdEYXRhID0geworICAgICAgICB3aWR0aDogZHJhd1dpZHRoLAorICAgICAgICBoZWlnaHQ6IGRyYXdIZWlnaHQsCisgICAgICAgIGtpbmQ6IDAsCisgICAgICAgIGRhdGE6IG51bGwKKyAgICAgIH07CisgICAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOworICAgICAgdmFyIG9yaWdpbmFsV2lkdGggPSB0aGlzLndpZHRoOworICAgICAgdmFyIG9yaWdpbmFsSGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICB2YXIgYnBjID0gdGhpcy5icGM7CisgICAgICB2YXIgcm93Qnl0ZXMgPSBvcmlnaW5hbFdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CisgICAgICB2YXIgaW1nQXJyYXk7CisKKyAgICAgIGlmICghZm9yY2VSR0JBKSB7CisgICAgICAgIHZhciBraW5kOworCisgICAgICAgIGlmICh0aGlzLmNvbG9yU3BhY2UubmFtZSA9PT0gIkRldmljZUdyYXkiICYmIGJwYyA9PT0gMSkgeworICAgICAgICAgIGtpbmQgPSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJEZXZpY2VSR0IiICYmIGJwYyA9PT0gOCAmJiAhdGhpcy5uZWVkc0RlY29kZSkgeworICAgICAgICAgIGtpbmQgPSBfdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtpbmQgJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzayAmJiBkcmF3V2lkdGggPT09IG9yaWdpbmFsV2lkdGggJiYgZHJhd0hlaWdodCA9PT0gb3JpZ2luYWxIZWlnaHQpIHsKKyAgICAgICAgICBpbWdEYXRhLmtpbmQgPSBraW5kOworICAgICAgICAgIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMpOworCisgICAgICAgICAgaWYgKHRoaXMuaW1hZ2UgaW5zdGFuY2VvZiBfc3RyZWFtLkRlY29kZVN0cmVhbSkgeworICAgICAgICAgICAgaW1nRGF0YS5kYXRhID0gaW1nQXJyYXk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBuZXdBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdBcnJheS5sZW5ndGgpOworICAgICAgICAgICAgbmV3QXJyYXkuc2V0KGltZ0FycmF5KTsKKyAgICAgICAgICAgIGltZ0RhdGEuZGF0YSA9IG5ld0FycmF5OworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShraW5kID09PSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAsICJQREZJbWFnZS5jcmVhdGVJbWFnZURhdGE6IFRoZSBpbWFnZSBtdXN0IGJlIGdyYXlzY2FsZS4iKTsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBpbWdEYXRhLmRhdGE7CisKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICAgIGJ1ZmZlcltpXSBePSAweGZmOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBpbWdEYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuaW1hZ2UgaW5zdGFuY2VvZiBfanBlZ19zdHJlYW0uSnBlZ1N0cmVhbSAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrKSB7CisgICAgICAgICAgdmFyIGltYWdlTGVuZ3RoID0gb3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlczsKKworICAgICAgICAgIHN3aXRjaCAodGhpcy5jb2xvclNwYWNlLm5hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgorICAgICAgICAgICAgICBpbWFnZUxlbmd0aCAqPSAzOworCisgICAgICAgICAgICBjYXNlICJEZXZpY2VSR0IiOgorICAgICAgICAgICAgY2FzZSAiRGV2aWNlQ01ZSyI6CisgICAgICAgICAgICAgIGltZ0RhdGEua2luZCA9IF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA7CisgICAgICAgICAgICAgIGltZ0RhdGEuZGF0YSA9IHRoaXMuZ2V0SW1hZ2VCeXRlcyhpbWFnZUxlbmd0aCwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCB0cnVlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGltZ0RhdGE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMpOworICAgICAgdmFyIGFjdHVhbEhlaWdodCA9IDAgfCBpbWdBcnJheS5sZW5ndGggLyByb3dCeXRlcyAqIGRyYXdIZWlnaHQgLyBvcmlnaW5hbEhlaWdodDsKKyAgICAgIHZhciBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7CisgICAgICB2YXIgYWxwaGEwMSwgbWF5YmVVbmRvUHJlYmxlbmQ7CisKKyAgICAgIGlmICghZm9yY2VSR0JBICYmICF0aGlzLnNtYXNrICYmICF0aGlzLm1hc2spIHsKKyAgICAgICAgaW1nRGF0YS5raW5kID0gX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUDsKKyAgICAgICAgaW1nRGF0YS5kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiAzKTsKKyAgICAgICAgYWxwaGEwMSA9IDA7CisgICAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbWdEYXRhLmtpbmQgPSBfdXRpbC5JbWFnZUtpbmQuUkdCQV8zMkJQUDsKKyAgICAgICAgaW1nRGF0YS5kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiA0KTsKKyAgICAgICAgYWxwaGEwMSA9IDE7CisgICAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5maWxsT3BhY2l0eShpbWdEYXRhLmRhdGEsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgYWN0dWFsSGVpZ2h0LCBjb21wcyk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CisgICAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jb2xvclNwYWNlLmZpbGxSZ2IoaW1nRGF0YS5kYXRhLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpOworCisgICAgICBpZiAobWF5YmVVbmRvUHJlYmxlbmQpIHsKKyAgICAgICAgdGhpcy51bmRvUHJlYmxlbmQoaW1nRGF0YS5kYXRhLCBkcmF3V2lkdGgsIGFjdHVhbEhlaWdodCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBpbWdEYXRhOworICAgIH0KKyAgfSwgeworICAgIGtleTogImZpbGxHcmF5QnVmZmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZmlsbEdyYXlCdWZmZXIoYnVmZmVyKSB7CisgICAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOworCisgICAgICBpZiAobnVtQ29tcHMgIT09IDEpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJSZWFkaW5nIGdyYXkgc2NhbGUgZnJvbSBhIGNvbG9yIGltYWdlOiAiLmNvbmNhdChudW1Db21wcykpOworICAgICAgfQorCisgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoOworICAgICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgICAgdmFyIGJwYyA9IHRoaXMuYnBjOworICAgICAgdmFyIHJvd0J5dGVzID0gd2lkdGggKiBudW1Db21wcyAqIGJwYyArIDcgPj4gMzsKKyAgICAgIHZhciBpbWdBcnJheSA9IHRoaXMuZ2V0SW1hZ2VCeXRlcyhoZWlnaHQgKiByb3dCeXRlcyk7CisgICAgICB2YXIgY29tcHMgPSB0aGlzLmdldENvbXBvbmVudHMoaW1nQXJyYXkpOworICAgICAgdmFyIGksIGxlbmd0aDsKKworICAgICAgaWYgKGJwYyA9PT0gMSkgeworICAgICAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKKworICAgICAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYnVmZmVyW2ldID0gY29tcHNbaV0gLSAxICYgMjU1OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltpXSA9IC1jb21wc1tpXSAmIDI1NTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CisgICAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTsKKyAgICAgIH0KKworICAgICAgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQ7CisgICAgICB2YXIgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYnBjKSAtIDEpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgYnVmZmVyW2ldID0gc2NhbGUgKiBjb21wc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRJbWFnZUJ5dGVzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SW1hZ2VCeXRlcyhsZW5ndGgsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCkgeworICAgICAgdmFyIGZvcmNlUkdCID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTsKKyAgICAgIHRoaXMuaW1hZ2UucmVzZXQoKTsKKyAgICAgIHRoaXMuaW1hZ2UuZHJhd1dpZHRoID0gZHJhd1dpZHRoIHx8IHRoaXMud2lkdGg7CisgICAgICB0aGlzLmltYWdlLmRyYXdIZWlnaHQgPSBkcmF3SGVpZ2h0IHx8IHRoaXMuaGVpZ2h0OworICAgICAgdGhpcy5pbWFnZS5mb3JjZVJHQiA9ICEhZm9yY2VSR0I7CisgICAgICByZXR1cm4gdGhpcy5pbWFnZS5nZXRCeXRlcyhsZW5ndGgsIHRydWUpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImRyYXdXaWR0aCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy53aWR0aCwgdGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLndpZHRoIHx8IDAsIHRoaXMubWFzayAmJiB0aGlzLm1hc2sud2lkdGggfHwgMCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZHJhd0hlaWdodCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5oZWlnaHQsIHRoaXMuc21hc2sgJiYgdGhpcy5zbWFzay5oZWlnaHQgfHwgMCwgdGhpcy5tYXNrICYmIHRoaXMubWFzay5oZWlnaHQgfHwgMCk7CisgICAgfQorICB9XSwgW3sKKyAgICBrZXk6ICJidWlsZEltYWdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9idWlsZEltYWdlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoX3JlZjIpIHsKKyAgICAgICAgdmFyIHhyZWYsIHJlcywgaW1hZ2UsIF9yZWYyJGlzSW5saW5lLCBpc0lubGluZSwgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgaW1hZ2VEYXRhLCBzbWFza0RhdGEsIG1hc2tEYXRhLCBzbWFzaywgbWFzazsKKworICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICB4cmVmID0gX3JlZjIueHJlZiwgcmVzID0gX3JlZjIucmVzLCBpbWFnZSA9IF9yZWYyLmltYWdlLCBfcmVmMiRpc0lubGluZSA9IF9yZWYyLmlzSW5saW5lLCBpc0lubGluZSA9IF9yZWYyJGlzSW5saW5lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJGlzSW5saW5lLCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBfcmVmMi5wZGZGdW5jdGlvbkZhY3RvcnksIGxvY2FsQ29sb3JTcGFjZUNhY2hlID0gX3JlZjIubG9jYWxDb2xvclNwYWNlQ2FjaGU7CisgICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gaW1hZ2U7CisgICAgICAgICAgICAgICAgc21hc2tEYXRhID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtYXNrRGF0YSA9IG51bGw7CisgICAgICAgICAgICAgICAgc21hc2sgPSBpbWFnZS5kaWN0LmdldCgiU01hc2siKTsKKyAgICAgICAgICAgICAgICBtYXNrID0gaW1hZ2UuZGljdC5nZXQoIk1hc2siKTsKKworICAgICAgICAgICAgICAgIGlmIChzbWFzaykgeworICAgICAgICAgICAgICAgICAgc21hc2tEYXRhID0gc21hc2s7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXNrKSB7CisgICAgICAgICAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShtYXNrKSB8fCBBcnJheS5pc0FycmF5KG1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIG1hc2tEYXRhID0gbWFzazsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5zdXBwb3J0ZWQgbWFzayBmb3JtYXQuIik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgbmV3IFBERkltYWdlKHsKKyAgICAgICAgICAgICAgICAgIHhyZWY6IHhyZWYsCisgICAgICAgICAgICAgICAgICByZXM6IHJlcywKKyAgICAgICAgICAgICAgICAgIGltYWdlOiBpbWFnZURhdGEsCisgICAgICAgICAgICAgICAgICBpc0lubGluZTogaXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICBzbWFzazogc21hc2tEYXRhLAorICAgICAgICAgICAgICAgICAgbWFzazogbWFza0RhdGEsCisgICAgICAgICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgIGNhc2UgImVuZCI6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBidWlsZEltYWdlKF94KSB7CisgICAgICAgIHJldHVybiBfYnVpbGRJbWFnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gYnVpbGRJbWFnZTsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImNyZWF0ZU1hc2siLAorICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVNYXNrKF9yZWYzKSB7CisgICAgICB2YXIgaW1nQXJyYXkgPSBfcmVmMy5pbWdBcnJheSwKKyAgICAgICAgICB3aWR0aCA9IF9yZWYzLndpZHRoLAorICAgICAgICAgIGhlaWdodCA9IF9yZWYzLmhlaWdodCwKKyAgICAgICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbSA9IF9yZWYzLmltYWdlSXNGcm9tRGVjb2RlU3RyZWFtLAorICAgICAgICAgIGludmVyc2VEZWNvZGUgPSBfcmVmMy5pbnZlcnNlRGVjb2RlOworICAgICAgdmFyIGNvbXB1dGVkTGVuZ3RoID0gKHdpZHRoICsgNyA+PiAzKSAqIGhlaWdodDsKKyAgICAgIHZhciBhY3R1YWxMZW5ndGggPSBpbWdBcnJheS5ieXRlTGVuZ3RoOworICAgICAgdmFyIGhhdmVGdWxsRGF0YSA9IGNvbXB1dGVkTGVuZ3RoID09PSBhY3R1YWxMZW5ndGg7CisgICAgICB2YXIgZGF0YSwgaTsKKworICAgICAgaWYgKGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtICYmICghaW52ZXJzZURlY29kZSB8fCBoYXZlRnVsbERhdGEpKSB7CisgICAgICAgIGRhdGEgPSBpbWdBcnJheTsKKyAgICAgIH0gZWxzZSBpZiAoIWludmVyc2VEZWNvZGUpIHsKKyAgICAgICAgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShhY3R1YWxMZW5ndGgpOworICAgICAgICBkYXRhLnNldChpbWdBcnJheSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGNvbXB1dGVkTGVuZ3RoKTsKKyAgICAgICAgZGF0YS5zZXQoaW1nQXJyYXkpOworCisgICAgICAgIGZvciAoaSA9IGFjdHVhbExlbmd0aDsgaSA8IGNvbXB1dGVkTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBkYXRhW2ldID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaW52ZXJzZURlY29kZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBkYXRhW2ldIF49IDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgZGF0YTogZGF0YSwKKyAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICBoZWlnaHQ6IGhlaWdodAorICAgICAgfTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGSW1hZ2U7Cit9KCk7CisKK2V4cG9ydHMuUERGSW1hZ2UgPSBQREZJbWFnZTsKKworLyoqKi8gfSksCisvKiAyNDMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5NZXNzYWdlSGFuZGxlciA9IHZvaWQgMDsKKwordmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXygyKSk7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KKworZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfQorCitmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK3ZhciBDYWxsYmFja0tpbmQgPSB7CisgIFVOS05PV046IDAsCisgIERBVEE6IDEsCisgIEVSUk9SOiAyCit9OwordmFyIFN0cmVhbUtpbmQgPSB7CisgIFVOS05PV046IDAsCisgIENBTkNFTDogMSwKKyAgQ0FOQ0VMX0NPTVBMRVRFOiAyLAorICBDTE9TRTogMywKKyAgRU5RVUVVRTogNCwKKyAgRVJST1I6IDUsCisgIFBVTEw6IDYsCisgIFBVTExfQ09NUExFVEU6IDcsCisgIFNUQVJUX0NPTVBMRVRFOiA4Cit9OworCitmdW5jdGlvbiB3cmFwUmVhc29uKHJlYXNvbikgeworICBpZiAoX3R5cGVvZihyZWFzb24pICE9PSAib2JqZWN0IiB8fCByZWFzb24gPT09IG51bGwpIHsKKyAgICByZXR1cm4gcmVhc29uOworICB9CisKKyAgc3dpdGNoIChyZWFzb24ubmFtZSkgeworICAgIGNhc2UgIkFib3J0RXhjZXB0aW9uIjoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpOworCisgICAgY2FzZSAiTWlzc2luZ1BERkV4Y2VwdGlvbiI6CisgICAgICByZXR1cm4gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpOworCisgICAgY2FzZSAiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uc3RhdHVzKTsKKworICAgIGNhc2UgIlVua25vd25FcnJvckV4Y2VwdGlvbiI6CisgICAgICByZXR1cm4gbmV3IF91dGlsLlVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmRldGFpbHMpOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24udG9TdHJpbmcoKSk7CisgIH0KK30KKwordmFyIE1lc3NhZ2VIYW5kbGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gTWVzc2FnZUhhbmRsZXIoc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7CisgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZXNzYWdlSGFuZGxlcik7CisKKyAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lOworICAgIHRoaXMudGFyZ2V0TmFtZSA9IHRhcmdldE5hbWU7CisgICAgdGhpcy5jb21PYmogPSBjb21PYmo7CisgICAgdGhpcy5jYWxsYmFja0lkID0gMTsKKyAgICB0aGlzLnN0cmVhbUlkID0gMTsKKyAgICB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gdHJ1ZTsKKyAgICB0aGlzLnN0cmVhbVNpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgIHZhciBkYXRhID0gZXZlbnQuZGF0YTsKKworICAgICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gX3RoaXMuc291cmNlTmFtZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChkYXRhLnN0cmVhbSkgeworICAgICAgICBfdGhpcy5fcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5jYWxsYmFjaykgeworICAgICAgICB2YXIgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDsKKyAgICAgICAgdmFyIGNhcGFiaWxpdHkgPSBfdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKKworICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZXNvbHZlIGNhbGxiYWNrICIuY29uY2F0KGNhbGxiYWNrSWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGV0ZSBfdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKKworICAgICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHsKKyAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuRVJST1IpIHsKKyAgICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGFjdGlvbiA9IF90aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dOworCisgICAgICBpZiAoIWFjdGlvbikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAiLmNvbmNhdChkYXRhLmFjdGlvbikpOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5jYWxsYmFja0lkKSB7CisgICAgICAgIHZhciBjYlNvdXJjZU5hbWUgPSBfdGhpcy5zb3VyY2VOYW1lOworICAgICAgICB2YXIgY2JUYXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lOworICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSkpOworICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLAorICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLAorICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAorICAgICAgICAgICAgZGF0YTogcmVzdWx0CisgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLAorICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5FUlJPUiwKKyAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCwKKyAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7CisgICAgICAgIF90aGlzLl9jcmVhdGVTdHJlYW1TaW5rKGRhdGEpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgYWN0aW9uKGRhdGEuZGF0YSk7CisgICAgfTsKKworICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKE1lc3NhZ2VIYW5kbGVyLCBbeworICAgIGtleTogIm9uIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gb24oYWN0aW9uTmFtZSwgaGFuZGxlcikgeworICAgICAgdmFyIGFoID0gdGhpcy5hY3Rpb25IYW5kbGVyOworCisgICAgICBpZiAoYWhbYWN0aW9uTmFtZV0pIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkIFwiIi5jb25jYXQoYWN0aW9uTmFtZSwgIlwiIikpOworICAgICAgfQorCisgICAgICBhaFthY3Rpb25OYW1lXSA9IGhhbmRsZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2VuZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7CisgICAgICB0aGlzLl9wb3N0TWVzc2FnZSh7CisgICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKKyAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAorICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCisgICAgICAgIGRhdGE6IGRhdGEKKyAgICAgIH0sIHRyYW5zZmVycyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2VuZFdpdGhQcm9taXNlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykgeworICAgICAgdmFyIGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKKyAgICAgIHZhciBjYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXSA9IGNhcGFiaWxpdHk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuX3Bvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsCisgICAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAorICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKKyAgICAgICAgICBjYWxsYmFja0lkOiBjYWxsYmFja0lkLAorICAgICAgICAgIGRhdGE6IGRhdGEKKyAgICAgICAgfSwgdHJhbnNmZXJzKTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KGV4KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZW5kV2l0aFN0cmVhbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmRXaXRoU3RyZWFtKGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXVlaW5nU3RyYXRlZ3ksIHRyYW5zZmVycykgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHZhciBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKzsKKyAgICAgIHZhciBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lOworICAgICAgdmFyIHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWU7CisgICAgICB2YXIgY29tT2JqID0gdGhpcy5jb21PYmo7CisgICAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHsKKyAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KGNvbnRyb2xsZXIpIHsKKyAgICAgICAgICB2YXIgc3RhcnRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgICAgIF90aGlzMi5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0gPSB7CisgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLAorICAgICAgICAgICAgc3RhcnRDYWxsOiBzdGFydENhcGFiaWxpdHksCisgICAgICAgICAgICBwdWxsQ2FsbDogbnVsbCwKKyAgICAgICAgICAgIGNhbmNlbENhbGw6IG51bGwsCisgICAgICAgICAgICBpc0Nsb3NlZDogZmFsc2UKKyAgICAgICAgICB9OworCisgICAgICAgICAgX3RoaXMyLl9wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKKyAgICAgICAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCwKKyAgICAgICAgICAgIGRhdGE6IGRhdGEsCisgICAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQorICAgICAgICAgIH0sIHRyYW5zZmVycyk7CisKKyAgICAgICAgICByZXR1cm4gc3RhcnRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICAgIH0sCisgICAgICAgIHB1bGw6IGZ1bmN0aW9uIHB1bGwoY29udHJvbGxlcikgeworICAgICAgICAgIHZhciBwdWxsQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgICAgICBfdGhpczIuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsID0gcHVsbENhcGFiaWxpdHk7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWU6IHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTEwsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQorICAgICAgICAgIH0pOworICAgICAgICAgIHJldHVybiBwdWxsQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgICB9LAorICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTsKKyAgICAgICAgICB2YXIgY2FuY2VsQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgICAgICBfdGhpczIuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5OworICAgICAgICAgIF90aGlzMi5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlOworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZTogdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgIH0pOworICAgICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICAgIH0KKyAgICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9jcmVhdGVTdHJlYW1TaW5rIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSkgeworICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgdmFyIGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CisgICAgICB2YXIgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkOworICAgICAgdmFyIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CisgICAgICB2YXIgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTsKKyAgICAgIHZhciBjb21PYmogPSB0aGlzLmNvbU9iajsKKyAgICAgIHZhciBzdHJlYW1TaW5rID0geworICAgICAgICBlbnF1ZXVlOiBmdW5jdGlvbiBlbnF1ZXVlKGNodW5rKSB7CisgICAgICAgICAgdmFyIHNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7CisgICAgICAgICAgdmFyIHRyYW5zZmVycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkOworCisgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTsKKyAgICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7CisKKyAgICAgICAgICBpZiAobGFzdERlc2lyZWRTaXplID4gMCAmJiB0aGlzLmRlc2lyZWRTaXplIDw9IDApIHsKKyAgICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGYuX3Bvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWU6IHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVOUVVFVUUsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICBjaHVuazogY2h1bmsKKyAgICAgICAgICB9LCB0cmFuc2ZlcnMpOworICAgICAgICB9LAorICAgICAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7CisgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBkZWxldGUgc2VsZi5zdHJlYW1TaW5rc1tzdHJlYW1JZF07CisgICAgICAgIH0sCisgICAgICAgIGVycm9yOiBmdW5jdGlvbiBlcnJvcihyZWFzb24pIHsKKyAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgImVycm9yIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvbiIpOworCisgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZTogc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRVJST1IsCisgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgIH0pOworICAgICAgICB9LAorICAgICAgICBzaW5rQ2FwYWJpbGl0eTogKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpLAorICAgICAgICBvblB1bGw6IG51bGwsCisgICAgICAgIG9uQ2FuY2VsOiBudWxsLAorICAgICAgICBpc0NhbmNlbGxlZDogZmFsc2UsCisgICAgICAgIGRlc2lyZWRTaXplOiBkYXRhLmRlc2lyZWRTaXplLAorICAgICAgICByZWFkeTogbnVsbAorICAgICAgfTsKKyAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgc3RyZWFtU2luay5yZWFkeSA9IHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdID0gc3RyZWFtU2luazsKKyAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSwgc3RyZWFtU2luaykpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgc291cmNlTmFtZTogc291cmNlTmFtZSwKKyAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSwKKyAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgc3VjY2VzczogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLAorICAgICAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCwKKyAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9wcm9jZXNzU3RyZWFtTWVzc2FnZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9wcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7CisgICAgICB2YXIgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkOworICAgICAgdmFyIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CisgICAgICB2YXIgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTsKKyAgICAgIHZhciBjb21PYmogPSB0aGlzLmNvbU9iajsKKworICAgICAgc3dpdGNoIChkYXRhLnN0cmVhbSkgeworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEU6CisgICAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgeworICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLnJlc29sdmUoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEU6CisgICAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgeworICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwucmVzb2x2ZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMOgorICAgICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHsKKyAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IHNvdXJjZU5hbWUsCisgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAorICAgICAgICAgICAgICBzdHJlYW1JZDogc3RyZWFtSWQsCisgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLmRlc2lyZWRTaXplIDw9IDAgJiYgZGF0YS5kZXNpcmVkU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5kZXNpcmVkU2l6ZSA9IGRhdGEuZGVzaXJlZFNpemU7CisgICAgICAgICAgdmFyIG9uUHVsbCA9IHRoaXMuc3RyZWFtU2lua3NbZGF0YS5zdHJlYW1JZF0ub25QdWxsOworICAgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgICAgICByZXNvbHZlKG9uUHVsbCAmJiBvblB1bGwoKSk7CisgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKKyAgICAgICAgICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkLAorICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBzb3VyY2VOYW1lLAorICAgICAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lLAorICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKKyAgICAgICAgICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkLAorICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTdHJlYW1LaW5kLkVOUVVFVUU6CisgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CisKKyAgICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZW5xdWV1ZShkYXRhLmNodW5rKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0xPU0U6CisgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOworCisgICAgICAgICAgaWYgKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5jbG9zZSgpOworCisgICAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6CisgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOworCisgICAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOgorICAgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwucmVzb2x2ZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOgorICAgICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBvbkNhbmNlbCA9IHRoaXMuc3RyZWFtU2lua3NbZGF0YS5zdHJlYW1JZF0ub25DYW5jZWw7CisgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgICAgICAgIHJlc29sdmUob25DYW5jZWwgJiYgb25DYW5jZWwod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpKTsKKyAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IHNvdXJjZU5hbWUsCisgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUsCisgICAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCisgICAgICAgICAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCwKKyAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgICAgc291cmNlTmFtZTogc291cmNlTmFtZSwKKyAgICAgICAgICAgICAgdGFyZ2V0TmFtZTogdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSwKKyAgICAgICAgICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkLAorICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKKyAgICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5pc0NhbmNlbGxlZCA9IHRydWU7CisgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHN0cmVhbSBjYXNlIik7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc3RyZWFtSWQpIHsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChbdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCwgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbF0ubWFwKGZ1bmN0aW9uIChjYXBhYmlsaXR5KSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gY2FwYWJpbGl0eSAmJiBjYXBhYmlsaXR5LnByb21pc2U7CisgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07CisKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoX3gpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxldGVTdHJlYW1Db250cm9sbGVyMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXI7CisgICAgfSgpCisgIH0sIHsKKyAgICBrZXk6ICJfcG9zdE1lc3NhZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJzKSB7CisgICAgICBpZiAodHJhbnNmZXJzICYmIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMpIHsKKyAgICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImRlc3Ryb3kiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkgeworICAgICAgdGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gTWVzc2FnZUhhbmRsZXI7Cit9KCk7CisKK2V4cG9ydHMuTWVzc2FnZUhhbmRsZXIgPSBNZXNzYWdlSGFuZGxlcjsKKworLyoqKi8gfSksCisvKiAyNDQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZXb3JrZXJTdHJlYW0gPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oMikpOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCitmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfQorCitmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9CisKK2Z1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgUERGV29ya2VyU3RyZWFtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGV29ya2VyU3RyZWFtKG1zZ0hhbmRsZXIpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGV29ya2VyU3RyZWFtKTsKKworICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOworICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDsKKyAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGV29ya2VyU3RyZWFtLCBbeworICAgIGtleTogImdldEZ1bGxSZWFkZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGdWxsUmVhZGVyKCkgeworICAgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCAiUERGV29ya2VyU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZXb3JrZXJTdHJlYW1SZWFkZXIodGhpcy5fbXNnSGFuZGxlcik7CisgICAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UmFuZ2VSZWFkZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CisgICAgICB2YXIgcmVhZGVyID0gbmV3IFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyKGJlZ2luLCBlbmQsIHRoaXMuX21zZ0hhbmRsZXIpOworCisgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTsKKworICAgICAgcmV0dXJuIHJlYWRlcjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjYW5jZWxBbGxSZXF1ZXN0cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikgeworICAgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7CisgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgICAgfQorCisgICAgICB2YXIgcmVhZGVycyA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCk7CisKKyAgICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmVhZGVyKSB7CisgICAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICAgIH0pOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQREZXb3JrZXJTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuUERGV29ya2VyU3RyZWFtID0gUERGV29ya2VyU3RyZWFtOworCit2YXIgUERGV29ya2VyU3RyZWFtUmVhZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gUERGV29ya2VyU3RyZWFtUmVhZGVyKG1zZ0hhbmRsZXIpIHsKKyAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERldvcmtlclN0cmVhbVJlYWRlcik7CisKKyAgICB0aGlzLl9tc2dIYW5kbGVyID0gbXNnSGFuZGxlcjsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOworICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlOworCisgICAgdmFyIHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmVhZGVyIik7CisKKyAgICB0aGlzLl9yZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTsKKyAgICB0aGlzLl9oZWFkZXJzUmVhZHkgPSB0aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiUmVhZGVySGVhZGVyc1JlYWR5IikudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgX3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZGF0YS5pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgICAgIF90aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZGF0YS5pc1JhbmdlU3VwcG9ydGVkOworICAgICAgX3RoaXMuX2NvbnRlbnRMZW5ndGggPSBkYXRhLmNvbnRlbnRMZW5ndGg7CisgICAgfSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGV29ya2VyU3RyZWFtUmVhZGVyLCBbeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlYWQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKKyAgICAgICAgdmFyIF95aWVsZCR0aGlzJF9yZWFkZXIkciwgdmFsdWUsIGRvbmU7CisKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkKCk7CisKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIF95aWVsZCR0aGlzJF9yZWFkZXIkciA9IF9jb250ZXh0LnNlbnQ7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBfeWllbGQkdGhpcyRfcmVhZGVyJHIudmFsdWU7CisgICAgICAgICAgICAgICAgZG9uZSA9IF95aWVsZCR0aGlzJF9yZWFkZXIkci5kb25lOworCisgICAgICAgICAgICAgICAgaWYgKCFkb25lKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgICAgICAgICAgICBkb25lOiB0cnVlCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5idWZmZXIsCisgICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIHJlYWQoKSB7CisgICAgICAgIHJldHVybiBfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVhZDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImNhbmNlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoZWFkZXJzUmVhZHkiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjb250ZW50TGVuZ3RoIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzU3RyZWFtaW5nU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1JhbmdlU3VwcG9ydGVkIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQREZXb3JrZXJTdHJlYW1SZWFkZXI7Cit9KCk7CisKK3ZhciBQREZXb3JrZXJTdHJlYW1SYW5nZVJlYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyKGJlZ2luLCBlbmQsIG1zZ0hhbmRsZXIpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIpOworCisgICAgdGhpcy5fbXNnSGFuZGxlciA9IG1zZ0hhbmRsZXI7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKworICAgIHZhciByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJhbmdlUmVhZGVyIiwgeworICAgICAgYmVnaW46IGJlZ2luLAorICAgICAgZW5kOiBlbmQKKyAgICB9KTsKKworICAgIHRoaXMuX3JlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyLCBbeworICAgIGtleTogInJlYWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlYWQyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgeworICAgICAgICB2YXIgX3lpZWxkJHRoaXMkX3JlYWRlciRyMiwgdmFsdWUsIGRvbmU7CisKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnJlYWQoKTsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgX3lpZWxkJHRoaXMkX3JlYWRlciRyMiA9IF9jb250ZXh0Mi5zZW50OworICAgICAgICAgICAgICAgIHZhbHVlID0gX3lpZWxkJHRoaXMkX3JlYWRlciRyMi52YWx1ZTsKKyAgICAgICAgICAgICAgICBkb25lID0gX3lpZWxkJHRoaXMkX3JlYWRlciRyMi5kb25lOworCisgICAgICAgICAgICAgICAgaWYgKCFkb25lKSB7CisgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgeworICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgIGRvbmU6IHRydWUKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5idWZmZXIsCisgICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gcmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIF9yZWFkMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVhZDsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImNhbmNlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbChyZWFzb24pIHsKKyAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1N0cmVhbWluZ1N1cHBvcnRlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyOworfSgpOworCisvKioqLyB9KQorLyoqKioqKi8gXSk7Cit9KTsKKy8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZi53b3JrZXIuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXM1L2J1aWxkL3BkZi53b3JrZXIuanMubWFwIGIvZXM1L2J1aWxkL3BkZi53b3JrZXIuanMubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNTQ2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9lczUvYnVpbGQvcGRmLndvcmtlci5qcy5tYXAKQEAgLTAsMCArMSBAQAoreyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL3BkZi53b3JrZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL3dvcmtlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9zaGFyZWQvdXRpbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL3NoYXJlZC9jb21wYXRpYmlsaXR5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvc2hhcmVkL2lzX25vZGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2dsb2JhbC10aGlzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zdHJpbmcvc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudHJ5LXVuYmluZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL2luY2x1ZGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9mcm9tLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2Zyb20tZW50cmllcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZnJvbS1lbnRyaWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbWF0aC9sb2cyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgubG9nMi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3R5cGVkLWFycmF5L3NsaWNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNsaWNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvd2ViL3VybC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXVybC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wdW55Y29kZS10by1hc2NpaS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvd2ViLXN0cmVhbXMtcG9seWZpbGwvZGlzdC9wb255ZmlsbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbWFwL2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc2V0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy93ZWFrLW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3dlYWstc2V0L2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstc2V0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zdHJpbmcvY29kZS1wb2ludC1hdC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuY29kZS1wb2ludC1hdC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL2Zyb20tY29kZS1wb2ludC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2guanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9wYWQtc3RhcnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1zdGFydC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcmVwZWF0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXBhZC13ZWJraXQtYnVnLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zdHJpbmcvcGFkLWVuZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucGFkLWVuZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvcHJpbWl0aXZlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvcGRmX21hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL2NodW5rZWRfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9jb3JlX3V0aWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9kb2N1bWVudC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvb2JqLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9wYXJzZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL3N0cmVhbS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvY2NpdHRfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9jY2l0dC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvamJpZzJfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9qYmlnMi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvYXJpdGhtZXRpY19kZWNvZGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9qcGVnX3N0cmVhbS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvanBnLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9qcHhfc3RyZWFtLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9qcHguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL2NyeXB0by5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvY29sb3JzcGFjZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvaW1hZ2VfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL2Fubm90YXRpb24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL29wZXJhdG9yX2xpc3QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL3dyaXRlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvZXZhbHVhdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9jbWFwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9mb250cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvY2ZmX3BhcnNlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvY2hhcnNldHMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9jb3JlL2VuY29kaW5ncy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvZ2x5cGhsaXN0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9zdGFuZGFyZF9mb250cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvdW5pY29kZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvZm9udF9yZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvdHlwZTFfcGFyc2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9wYXR0ZXJuLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvcHNfcGFyc2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9iaWRpLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9tZXRyaWNzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS9tdXJtdXJoYXNoMy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIvc3JjL2NvcmUvaW1hZ2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyL3NyYy9zaGFyZWQvbWVzc2FnZV9oYW5kbGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlci9zcmMvY29yZS93b3JrZXJfc3RyZWFtLmpzIl0sIm5hbWVzIjpbInBkZmpzVmVyc2lvbiIsInBkZmpzQnVpbGQiLCJjb25zdHJ1Y3RvciIsInRlc3RNZXNzYWdlUHJvY2Vzc2VkIiwiaGFuZGxlciIsInN1cHBvcnRUcmFuc2ZlcnMiLCJkYXRhIiwic2V0VmVyYm9zaXR5TGV2ZWwiLCJXb3JrZXJNZXNzYWdlSGFuZGxlciIsInRlcm1pbmF0ZWQiLCJjYW5jZWxYSFJzIiwiV29ya2VyVGFza3MiLCJ2ZXJib3NpdHkiLCJhcGlWZXJzaW9uIiwiZG9jUGFyYW1zIiwid29ya2VyVmVyc2lvbiIsImVudW1lcmFibGVQcm9wZXJ0aWVzIiwiZG9jSWQiLCJkb2NCYXNlVXJsIiwid29ya2VySGFuZGxlck5hbWUiLCJ0YXNrIiwiaSIsInBkZk1hbmFnZXIiLCJudW1QYWdlcyIsImZpbmdlcnByaW50IiwicGRmTWFuYWdlckNhcGFiaWxpdHkiLCJzb3VyY2UiLCJuZXdQZGZNYW5hZ2VyIiwiY2FjaGVkQ2h1bmtzIiwicGRmU3RyZWFtIiwiZnVsbFJlcXVlc3QiLCJkaXNhYmxlQXV0b0ZldGNoIiwibXNnSGFuZGxlciIsInBhc3N3b3JkIiwibGVuZ3RoIiwicmFuZ2VDaHVua1NpemUiLCJsb2FkZWQiLCJmbHVzaENodW5rcyIsInBkZkZpbGUiLCJhcnJheXNUb0J5dGVzIiwid2FybiIsInJlYWRQcm9taXNlIiwicmVhZENodW5rIiwiZW5zdXJlTm90VGVybWluYXRlZCIsImFycmF5Qnl0ZUxlbmd0aCIsInRvdGFsIiwiTWF0aCIsInJlamVjdCIsInBkZkluZm8iLCJleCIsInN0YXJ0V29ya2VyVGFzayIsImZpbmlzaFdvcmtlclRhc2siLCJwZGZNYW5hZ2VyUmVhZHkiLCJsb2FkRG9jdW1lbnQiLCJvbkZhaWx1cmUiLCJldmFsdWF0b3JPcHRpb25zIiwibWF4SW1hZ2VTaXplIiwiZGlzYWJsZUZvbnRGYWNlIiwiaWdub3JlRXJyb3JzIiwiaXNFdmFsU3VwcG9ydGVkIiwiZm9udEV4dHJhUHJvcGVydGllcyIsImdldFBkZk1hbmFnZXIiLCJzdHJlYW0iLCJyb3RhdGUiLCJyZWYiLCJ1c2VyVW5pdCIsInZpZXciLCJwYWdlUmVmIiwiUmVmIiwicGFnZSIsInByb21pc2VzIiwiZG9jdW1lbnQiLCJwYWdlSW5kZXgiLCJuZXdSZWZzIiwieCIsImEiLCJ4cmVmIiwibmV3WHJlZkluZm8iLCJPYmplY3QiLCJfaW5mbyIsInhyZWZJbmZvIiwiaXNTdHJpbmciLCJzdHJpbmdUb1BERlN0cmluZyIsInJvb3RSZWYiLCJlbmNyeXB0IiwibmV3UmVmIiwiaW5mb1JlZiIsImluZm8iLCJmaWxlSWRzIiwic3RhcnRYUmVmIiwiZmlsZW5hbWUiLCJpbmNyZW1lbnRhbFVwZGF0ZSIsInN0YXJ0IiwiVmVyYm9zaXR5TGV2ZWwiLCJEYXRlIiwic2luayIsImludGVudCIsInJlbmRlckludGVyYWN0aXZlRm9ybXMiLCJhbm5vdGF0aW9uU3RvcmFnZSIsIm9wZXJhdG9yTGlzdEluZm8iLCJmZWF0dXJlSWQiLCJVTlNVUFBPUlRFRF9GRUFUVVJFUyIsIm5vcm1hbGl6ZVdoaXRlc3BhY2UiLCJjb21iaW5lVGV4dEl0ZW1zIiwid2FpdE9uIiwiY2xlYW51cFByb21pc2UiLCJzZXR1cERvYyIsIm1heWJlUG9ydCIsImlzTWVzc2FnZVBvcnQiLCJtb2R1bGUiLCJyZXF1aXJlIiwicnVudGltZSIsIk9wIiwiaGFzT3duIiwiJFN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsInRvU3RyaW5nVGFnU3ltYm9sIiwidmFsdWUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJvYmoiLCJkZWZpbmUiLCJwcm90b0dlbmVyYXRvciIsIm91dGVyRm4iLCJnZW5lcmF0b3IiLCJjb250ZXh0IiwidHJ5TG9jc0xpc3QiLCJtYWtlSW52b2tlTWV0aG9kIiwiZXhwb3J0cyIsInR5cGUiLCJhcmciLCJmbiIsIkdlblN0YXRlU3VzcGVuZGVkU3RhcnQiLCJHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkIiwiR2VuU3RhdGVFeGVjdXRpbmciLCJHZW5TdGF0ZUNvbXBsZXRlZCIsIkNvbnRpbnVlU2VudGluZWwiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiR2VuZXJhdG9yIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJjdG9yIiwiZ2VuRnVuIiwiX19hd2FpdCIsInJlY29yZCIsInRyeUNhdGNoIiwicmVzdWx0IiwiaW52b2tlIiwicmVzb2x2ZSIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaXRlciIsIndyYXAiLCJzdGF0ZSIsIm1ldGhvZCIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsImRvbmUiLCJlbnRyeSIsInRyeUxvYyIsImxvY3MiLCJrZXlzIiwia2V5IiwibmV4dCIsIml0ZXJhdG9yTWV0aG9kIiwiaXRlcmFibGUiLCJpc05hTiIsIkNvbnRleHQiLCJyZXNldCIsIm5hbWUiLCJzdG9wIiwicm9vdEVudHJ5Iiwicm9vdFJlY29yZCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiaGFuZGxlIiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiYWJydXB0IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJyZXNldFRyeUVudHJ5IiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIml0ZXJhdG9yIiwicmVzdWx0TmFtZSIsIm5leHRMb2MiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJGdW5jdGlvbiIsImdldCIsIklERU5USVRZX01BVFJJWCIsIkZPTlRfSURFTlRJVFlfTUFUUklYIiwiUGVybWlzc2lvbkZsYWciLCJQUklOVCIsIk1PRElGWV9DT05URU5UUyIsIkNPUFkiLCJNT0RJRllfQU5OT1RBVElPTlMiLCJGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TIiwiQ09QWV9GT1JfQUNDRVNTSUJJTElUWSIsIkFTU0VNQkxFIiwiUFJJTlRfSElHSF9RVUFMSVRZIiwiVGV4dFJlbmRlcmluZ01vZGUiLCJGSUxMIiwiU1RST0tFIiwiRklMTF9TVFJPS0UiLCJJTlZJU0lCTEUiLCJGSUxMX0FERF9UT19QQVRIIiwiU1RST0tFX0FERF9UT19QQVRIIiwiRklMTF9TVFJPS0VfQUREX1RPX1BBVEgiLCJBRERfVE9fUEFUSCIsIkZJTExfU1RST0tFX01BU0siLCJBRERfVE9fUEFUSF9GTEFHIiwiSW1hZ2VLaW5kIiwiR1JBWVNDQUxFXzFCUFAiLCJSR0JfMjRCUFAiLCJSR0JBXzMyQlBQIiwiQW5ub3RhdGlvblR5cGUiLCJURVhUIiwiTElOSyIsIkZSRUVURVhUIiwiTElORSIsIlNRVUFSRSIsIkNJUkNMRSIsIlBPTFlHT04iLCJQT0xZTElORSIsIkhJR0hMSUdIVCIsIlVOREVSTElORSIsIlNRVUlHR0xZIiwiU1RSSUtFT1VUIiwiU1RBTVAiLCJDQVJFVCIsIklOSyIsIlBPUFVQIiwiRklMRUFUVEFDSE1FTlQiLCJTT1VORCIsIk1PVklFIiwiV0lER0VUIiwiU0NSRUVOIiwiUFJJTlRFUk1BUksiLCJUUkFQTkVUIiwiV0FURVJNQVJLIiwiVEhSRUVEIiwiUkVEQUNUIiwiQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlIiwiTUFSS0VEIiwiUkVWSUVXIiwiQW5ub3RhdGlvbk1hcmtlZFN0YXRlIiwiVU5NQVJLRUQiLCJBbm5vdGF0aW9uUmV2aWV3U3RhdGUiLCJBQ0NFUFRFRCIsIlJFSkVDVEVEIiwiQ0FOQ0VMTEVEIiwiQ09NUExFVEVEIiwiTk9ORSIsIkFubm90YXRpb25SZXBseVR5cGUiLCJHUk9VUCIsIlJFUExZIiwiQW5ub3RhdGlvbkZsYWciLCJISURERU4iLCJOT1pPT00iLCJOT1JPVEFURSIsIk5PVklFVyIsIlJFQURPTkxZIiwiTE9DS0VEIiwiVE9HR0xFTk9WSUVXIiwiTE9DS0VEQ09OVEVOVFMiLCJBbm5vdGF0aW9uRmllbGRGbGFnIiwiUkVRVUlSRUQiLCJOT0VYUE9SVCIsIk1VTFRJTElORSIsIlBBU1NXT1JEIiwiTk9UT0dHTEVUT09GRiIsIlJBRElPIiwiUFVTSEJVVFRPTiIsIkNPTUJPIiwiRURJVCIsIlNPUlQiLCJGSUxFU0VMRUNUIiwiTVVMVElTRUxFQ1QiLCJET05PVFNQRUxMQ0hFQ0siLCJET05PVFNDUk9MTCIsIkNPTUIiLCJSSUNIVEVYVCIsIlJBRElPU0lOVU5JU09OIiwiQ09NTUlUT05TRUxDSEFOR0UiLCJBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlIiwiU09MSUQiLCJEQVNIRUQiLCJCRVZFTEVEIiwiSU5TRVQiLCJTdHJlYW1UeXBlIiwiVU5LTk9XTiIsIkZMQVRFIiwiTFpXIiwiRENUIiwiSlBYIiwiSkJJRyIsIkE4NSIsIkFIWCIsIkNDRiIsIlJMWCIsIkZvbnRUeXBlIiwiVFlQRTEiLCJUWVBFMUMiLCJDSURGT05UVFlQRTAiLCJDSURGT05UVFlQRTBDIiwiVFJVRVRZUEUiLCJDSURGT05UVFlQRTIiLCJUWVBFMyIsIk9QRU5UWVBFIiwiVFlQRTAiLCJNTVRZUEUxIiwiRVJST1JTIiwiV0FSTklOR1MiLCJJTkZPUyIsIkNNYXBDb21wcmVzc2lvblR5cGUiLCJCSU5BUlkiLCJTVFJFQU0iLCJPUFMiLCJkZXBlbmRlbmN5Iiwic2V0TGluZVdpZHRoIiwic2V0TGluZUNhcCIsInNldExpbmVKb2luIiwic2V0TWl0ZXJMaW1pdCIsInNldERhc2giLCJzZXRSZW5kZXJpbmdJbnRlbnQiLCJzZXRGbGF0bmVzcyIsInNldEdTdGF0ZSIsInNhdmUiLCJyZXN0b3JlIiwidHJhbnNmb3JtIiwibW92ZVRvIiwibGluZVRvIiwiY3VydmVUbyIsImN1cnZlVG8yIiwiY3VydmVUbzMiLCJjbG9zZVBhdGgiLCJyZWN0YW5nbGUiLCJzdHJva2UiLCJjbG9zZVN0cm9rZSIsImZpbGwiLCJlb0ZpbGwiLCJmaWxsU3Ryb2tlIiwiZW9GaWxsU3Ryb2tlIiwiY2xvc2VGaWxsU3Ryb2tlIiwiY2xvc2VFT0ZpbGxTdHJva2UiLCJlbmRQYXRoIiwiY2xpcCIsImVvQ2xpcCIsImJlZ2luVGV4dCIsImVuZFRleHQiLCJzZXRDaGFyU3BhY2luZyIsInNldFdvcmRTcGFjaW5nIiwic2V0SFNjYWxlIiwic2V0TGVhZGluZyIsInNldEZvbnQiLCJzZXRUZXh0UmVuZGVyaW5nTW9kZSIsInNldFRleHRSaXNlIiwibW92ZVRleHQiLCJzZXRMZWFkaW5nTW92ZVRleHQiLCJzZXRUZXh0TWF0cml4IiwibmV4dExpbmUiLCJzaG93VGV4dCIsInNob3dTcGFjZWRUZXh0IiwibmV4dExpbmVTaG93VGV4dCIsIm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0Iiwic2V0Q2hhcldpZHRoIiwic2V0Q2hhcldpZHRoQW5kQm91bmRzIiwic2V0U3Ryb2tlQ29sb3JTcGFjZSIsInNldEZpbGxDb2xvclNwYWNlIiwic2V0U3Ryb2tlQ29sb3IiLCJzZXRTdHJva2VDb2xvck4iLCJzZXRGaWxsQ29sb3IiLCJzZXRGaWxsQ29sb3JOIiwic2V0U3Ryb2tlR3JheSIsInNldEZpbGxHcmF5Iiwic2V0U3Ryb2tlUkdCQ29sb3IiLCJzZXRGaWxsUkdCQ29sb3IiLCJzZXRTdHJva2VDTVlLQ29sb3IiLCJzZXRGaWxsQ01ZS0NvbG9yIiwic2hhZGluZ0ZpbGwiLCJiZWdpbklubGluZUltYWdlIiwiYmVnaW5JbWFnZURhdGEiLCJlbmRJbmxpbmVJbWFnZSIsInBhaW50WE9iamVjdCIsIm1hcmtQb2ludCIsIm1hcmtQb2ludFByb3BzIiwiYmVnaW5NYXJrZWRDb250ZW50IiwiYmVnaW5NYXJrZWRDb250ZW50UHJvcHMiLCJlbmRNYXJrZWRDb250ZW50IiwiYmVnaW5Db21wYXQiLCJlbmRDb21wYXQiLCJwYWludEZvcm1YT2JqZWN0QmVnaW4iLCJwYWludEZvcm1YT2JqZWN0RW5kIiwiYmVnaW5Hcm91cCIsImVuZEdyb3VwIiwiYmVnaW5Bbm5vdGF0aW9ucyIsImVuZEFubm90YXRpb25zIiwiYmVnaW5Bbm5vdGF0aW9uIiwiZW5kQW5ub3RhdGlvbiIsInBhaW50SnBlZ1hPYmplY3QiLCJwYWludEltYWdlTWFza1hPYmplY3QiLCJwYWludEltYWdlTWFza1hPYmplY3RHcm91cCIsInBhaW50SW1hZ2VYT2JqZWN0IiwicGFpbnRJbmxpbmVJbWFnZVhPYmplY3QiLCJwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwIiwicGFpbnRJbWFnZVhPYmplY3RSZXBlYXQiLCJwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQiLCJwYWludFNvbGlkQ29sb3JJbWFnZU1hc2siLCJjb25zdHJ1Y3RQYXRoIiwidW5rbm93biIsImZvcm1zIiwiamF2YVNjcmlwdCIsInNtYXNrIiwic2hhZGluZ1BhdHRlcm4iLCJmb250IiwiZXJyb3JUaWxpbmdQYXR0ZXJuIiwiZXJyb3JFeHRHU3RhdGUiLCJlcnJvclhPYmplY3QiLCJlcnJvckZvbnRMb2FkVHlwZTMiLCJlcnJvckZvbnRTdGF0ZSIsImVycm9yRm9udE1pc3NpbmciLCJlcnJvckZvbnRUcmFuc2xhdGUiLCJlcnJvckNvbG9yU3BhY2UiLCJlcnJvck9wZXJhdG9yTGlzdCIsImVycm9yRm9udFRvVW5pY29kZSIsImVycm9yRm9udExvYWROYXRpdmUiLCJlcnJvckZvbnRHZXRQYXRoIiwiZXJyb3JNYXJrZWRDb250ZW50IiwiUGFzc3dvcmRSZXNwb25zZXMiLCJORUVEX1BBU1NXT1JEIiwiSU5DT1JSRUNUX1BBU1NXT1JEIiwiTnVtYmVyIiwiY29uc29sZSIsInVucmVhY2hhYmxlIiwiYmFzZSIsIm90aGVyIiwidXJsIiwiYWJzb2x1dGVVcmwiLCJiYXNlVXJsIiwiX2lzVmFsaWRQcm90b2NvbCIsIkJhc2VFeGNlcHRpb24iLCJOdWxsQ2hhcmFjdGVyc1JlZ0V4cCIsInN0ciIsImFzc2VydCIsImJ5dGVzIiwiTUFYX0FSR1VNRU5UX0NPVU5UIiwiU3RyaW5nIiwic3RyQnVmIiwiY2h1bmtFbmQiLCJjaHVuayIsImFyciIsInJlc3VsdExlbmd0aCIsInBvcyIsIml0ZW0iLCJzdHJpbmdUb0J5dGVzIiwiaXRlbUxlbmd0aCIsImJ1ZmZlcjgiLCJ2aWV3MzIiLCJJc0xpdHRsZUVuZGlhbkNhY2hlZCIsInNoYWRvdyIsImlzTGl0dGxlRW5kaWFuIiwiSXNFdmFsU3VwcG9ydGVkQ2FjaGVkIiwicmdiQnVmIiwibTEiLCJtMiIsInh0IiwicCIsIm0iLCJ5dCIsImQiLCJwMSIsIlV0aWwiLCJwMiIsInIiLCJwMyIsInA0IiwidiIsInRyYW5zcG9zZSIsImIiLCJjIiwiZmlyc3QiLCJzZWNvbmQiLCJzeCIsInN5IiwicmVjdCIsIm9yZGVyZWRYIiwicmVjdDEiLCJyZWN0MiIsIm9yZGVyZWRZIiwiUERGU3RyaW5nVHJhbnNsYXRlVGFibGUiLCJjb2RlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhcnIxIiwiYXJyMiIsImVsZW1lbnQiLCJkYXRlIiwiYnVmZmVyIiwiY2FwYWJpbGl0eSIsImlzU2V0dGxlZCIsImNyZWF0ZU9iamVjdFVSTCIsImRpZ2l0cyIsImZvcmNlRGF0YVNjaGVtYSIsIlVSTCIsImJsb2IiLCJpaSIsImIxIiwiYjIiLCJiMyIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZ2xvYmFsVGhpcyIsImhhc0RPTSIsInVzZXJBZ2VudCIsIm5hdmlnYXRvciIsImlzSUUiLCJCdWZmZXIiLCJFbGVtZW50IiwiZGl2IiwiT3JpZ2luYWxET01Ub2tlbkxpc3RBZGQiLCJET01Ub2tlbkxpc3QiLCJPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZSIsInRva2VuIiwiZm9yY2UiLCJhcmd1bWVudHMiLCJPcmlnaW5hbFB1c2hTdGF0ZSIsIndpbmRvdyIsIk9yaWdpbmFsUmVwbGFjZVN0YXRlIiwiYXJncyIsIkFycmF5IiwiVWludDhBcnJheSIsImlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQiLCJjb250cm9sbGVyIiwiaXNOb2RlSlMiLCJwcm9jZXNzIiwiJCIsImdsb2JhbCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImYiLCJjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkiLCJyZWRlZmluZSIsInNldEdsb2JhbCIsImNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMiLCJpc0ZvcmNlZCIsIm9wdGlvbnMiLCJUQVJHRVQiLCJ0YXJnZXQiLCJHTE9CQUwiLCJTVEFUSUMiLCJzdGF0IiwiRk9SQ0VEIiwidGFyZ2V0UHJvcGVydHkiLCJzb3VyY2VQcm9wZXJ0eSIsImRlc2NyaXB0b3IiLCJwcm90b3R5cGUiLCJub1RhcmdldEdldCIsImZvcmNlZCIsInVuZGVmaW5lZCIsInNoYW0iLCJjaGVjayIsIml0Iiwic2VsZiIsIkRFU0NSSVBUT1JTIiwicHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUiLCJjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IiLCJ0b0luZGV4ZWRPYmplY3QiLCJ0b1ByaW1pdGl2ZSIsImhhcyIsIklFOF9ET01fREVGSU5FIiwibmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiTyIsIlAiLCJlcnJvciIsImNhbGwiLCJmYWlscyIsImRlZmluZVByb3BlcnR5IiwiZXhlYyIsIm5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJOQVNIT1JOX0JVRyIsIlYiLCJiaXRtYXAiLCJJbmRleGVkT2JqZWN0IiwicmVxdWlyZU9iamVjdENvZXJjaWJsZSIsImNsYXNzb2YiLCJzcGxpdCIsInRvU3RyaW5nIiwic2xpY2UiLCJUeXBlRXJyb3IiLCJpc09iamVjdCIsImlucHV0IiwiUFJFRkVSUkVEX1NUUklORyIsInZhbCIsInZhbHVlT2YiLCJoYXNPd25Qcm9wZXJ0eSIsImNyZWF0ZUVsZW1lbnQiLCJFWElTVFMiLCJkZWZpbmVQcm9wZXJ0eU1vZHVsZSIsIm9iamVjdCIsImFuT2JqZWN0IiwibmF0aXZlRGVmaW5lUHJvcGVydHkiLCJBdHRyaWJ1dGVzIiwiaW5zcGVjdFNvdXJjZSIsIkludGVybmFsU3RhdGVNb2R1bGUiLCJnZXRJbnRlcm5hbFN0YXRlIiwiZW5mb3JjZUludGVybmFsU3RhdGUiLCJlbmZvcmNlIiwiVEVNUExBVEUiLCJ1bnNhZmUiLCJzaW1wbGUiLCJqb2luIiwic3RvcmUiLCJmdW5jdGlvblRvU3RyaW5nIiwiU0hBUkVEIiwiTkFUSVZFX1dFQUtfTUFQIiwib2JqZWN0SGFzIiwic2hhcmVkS2V5IiwiaGlkZGVuS2V5cyIsIldlYWtNYXAiLCJzZXQiLCJnZXR0ZXJGb3IiLCJUWVBFIiwid21nZXQiLCJ3bWhhcyIsIndtc2V0IiwibWV0YWRhdGEiLCJTVEFURSIsInRlc3QiLCJzaGFyZWQiLCJ1aWQiLCJJU19QVVJFIiwicHVzaCIsInZlcnNpb24iLCJtb2RlIiwiY29weXJpZ2h0IiwiaWQiLCJwb3N0Zml4IiwicmFuZG9tIiwib3duS2V5cyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSIsImdldEJ1aWx0SW4iLCJnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiY29uY2F0IiwicGF0aCIsImFGdW5jdGlvbiIsInZhcmlhYmxlIiwibmFtZXNwYWNlIiwiaW50ZXJuYWxPYmplY3RLZXlzIiwiZW51bUJ1Z0tleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiaW5kZXhPZiIsIm5hbWVzIiwidG9MZW5ndGgiLCJ0b0Fic29sdXRlSW5kZXgiLCJjcmVhdGVNZXRob2QiLCJJU19JTkNMVURFUyIsIiR0aGlzIiwiZWwiLCJmcm9tSW5kZXgiLCJpbmRleCIsImluY2x1ZGVzIiwidG9JbnRlZ2VyIiwibWluIiwiYXJndW1lbnQiLCJjZWlsIiwiZmxvb3IiLCJtYXgiLCJpbnRlZ2VyIiwicmVwbGFjZW1lbnQiLCJmZWF0dXJlIiwiZGV0ZWN0aW9uIiwibm9ybWFsaXplIiwiUE9MWUZJTEwiLCJOQVRJVkUiLCJzdHJpbmciLCJyZXBsYWNlIiwidG9Mb3dlckNhc2UiLCJlbnRyeVVuYmluZCIsIm5vdEFSZWdFeHAiLCJjb3JyZWN0SXNSZWdFeHBMb2dpYyIsIm5hdGl2ZVN0YXJ0c1dpdGgiLCJzdGFydHNXaXRoIiwiQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMiLCJNRE5fUE9MWUZJTExfQlVHIiwicHJvdG8iLCJzZWFyY2hTdHJpbmciLCJ0aGF0Iiwic2VhcmNoIiwiaXNSZWdFeHAiLCJ3ZWxsS25vd25TeW1ib2wiLCJNQVRDSCIsIk5BVElWRV9TWU1CT0wiLCJVU0VfU1lNQk9MX0FTX1VJRCIsIldlbGxLbm93blN5bWJvbHNTdG9yZSIsIlN5bWJvbCIsImNyZWF0ZVdlbGxLbm93blN5bWJvbCIsIndpdGhvdXRTZXR0ZXIiLCJNRVRIT0RfTkFNRSIsInJlZ2V4cCIsImUiLCJiaW5kIiwiQ09OU1RSVUNUT1IiLCJNRVRIT0QiLCJhcHBseSIsIm5hdGl2ZUVuZHNXaXRoIiwiZW5kc1dpdGgiLCJlbmRQb3NpdGlvbiIsImxlbiIsImVuZCIsIiRpbmNsdWRlcyIsImFkZFRvVW5zY29wYWJsZXMiLCJhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCIsIlVTRVNfVE9fTEVOR1RIIiwiQUNDRVNTT1JTIiwiY3JlYXRlIiwiVU5TQ09QQUJMRVMiLCJBcnJheVByb3RvdHlwZSIsImRlZmluZVByb3BlcnRpZXMiLCJodG1sIiwiZG9jdW1lbnRDcmVhdGVFbGVtZW50IiwiR1QiLCJMVCIsIlBST1RPVFlQRSIsIlNDUklQVCIsIklFX1BST1RPIiwiRW1wdHlDb25zdHJ1Y3RvciIsInNjcmlwdFRhZyIsImNvbnRlbnQiLCJOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYIiwiYWN0aXZlWERvY3VtZW50Iiwid3JpdGUiLCJjbG9zZSIsInRlbXAiLCJwYXJlbnRXaW5kb3ciLCJOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUiLCJpZnJhbWUiLCJKUyIsImlmcmFtZURvY3VtZW50Iiwic3R5bGUiLCJkaXNwbGF5IiwiYXBwZW5kQ2hpbGQiLCJzcmMiLCJjb250ZW50V2luZG93Iiwib3BlbiIsIkYiLCJOdWxsUHJvdG9PYmplY3QiLCJkb21haW4iLCJBY3RpdmVYT2JqZWN0IiwiUHJvcGVydGllcyIsIm9iamVjdEtleXMiLCJjYWNoZSIsInRocm93ZXIiLCJhcmd1bWVudDAiLCJhcmd1bWVudDEiLCJmcm9tIiwiY2hhckF0IiwiZGVmaW5lSXRlcmF0b3IiLCJTVFJJTkdfSVRFUkFUT1IiLCJzZXRJbnRlcm5hbFN0YXRlIiwiaXRlcmF0ZWQiLCJwb2ludCIsIkNPTlZFUlRfVE9fU1RSSU5HIiwiUyIsInBvc2l0aW9uIiwic2l6ZSIsImNoYXJDb2RlQXQiLCJjb2RlQXQiLCJjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsInNldFRvU3RyaW5nVGFnIiwiSXRlcmF0b3JzIiwiSXRlcmF0b3JzQ29yZSIsIkJVR0dZX1NBRkFSSV9JVEVSQVRPUlMiLCJJVEVSQVRPUiIsIktFWVMiLCJWQUxVRVMiLCJFTlRSSUVTIiwicmV0dXJuVGhpcyIsIkl0ZXJhYmxlIiwiTkFNRSIsIkl0ZXJhdG9yQ29uc3RydWN0b3IiLCJERUZBVUxUIiwiSVNfU0VUIiwiZ2V0SXRlcmF0aW9uTWV0aG9kIiwiS0lORCIsImRlZmF1bHRJdGVyYXRvciIsIkl0ZXJhYmxlUHJvdG90eXBlIiwiZW50cmllcyIsIlRPX1NUUklOR19UQUciLCJJTkNPUlJFQ1RfVkFMVUVTX05BTUUiLCJuYXRpdmVJdGVyYXRvciIsImFueU5hdGl2ZUl0ZXJhdG9yIiwiQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlIiwibWV0aG9kcyIsIktFWSIsIlByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSIsImFycmF5SXRlcmF0b3IiLCJ0b09iamVjdCIsIkNPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiIsIk9iamVjdFByb3RvdHlwZSIsIlRBRyIsImFQb3NzaWJsZVByb3RvdHlwZSIsIkNPUlJFQ1RfU0VUVEVSIiwic2V0dGVyIiwiX19wcm90b19fIiwiY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uIiwiSU5DT1JSRUNUX0lURVJBVElPTiIsImNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmciLCJpc0FycmF5SXRlcmF0b3JNZXRob2QiLCJjcmVhdGVQcm9wZXJ0eSIsImdldEl0ZXJhdG9yTWV0aG9kIiwiYXJyYXlMaWtlIiwiQyIsImFyZ3VtZW50c0xlbmd0aCIsIm1hcGZuIiwibWFwcGluZyIsInN0ZXAiLCJyZXR1cm5NZXRob2QiLCJwcm9wZXJ0eUtleSIsIlRPX1NUUklOR19UQUdfU1VQUE9SVCIsImNsYXNzb2ZSYXciLCJDT1JSRUNUX0FSR1VNRU5UUyIsInRyeUdldCIsInRhZyIsImNhbGxlZSIsIlNBRkVfQ0xPU0lORyIsImNhbGxlZCIsIml0ZXJhdG9yV2l0aFJldHVybiIsIlNLSVBfQ0xPU0lORyIsIklURVJBVElPTl9TVVBQT1JUIiwiYXNzaWduIiwibmF0aXZlQXNzaWduIiwiQSIsIkIiLCJzeW1ib2wiLCJhbHBoYWJldCIsImZvckVhY2giLCJjaHIiLCJUIiwiaiIsImZyb21FbnRyaWVzIiwiQVJSQVlfSVRFUkFUT1IiLCJraW5kIiwiQXJndW1lbnRzIiwiaXRlcmF0ZSIsImsiLCJSZXN1bHQiLCJzdG9wcGVkIiwiQVNfRU5UUklFUyIsIklTX0lURVJBVE9SIiwiYm91bmRGdW5jdGlvbiIsIml0ZXJGbiIsImxvZzIiLCJsb2ciLCJMTjIiLCJudW1iZXIiLCJpc0ludGVnZXIiLCJpc0Zpbml0ZSIsIkFycmF5QnVmZmVyVmlld0NvcmUiLCJzcGVjaWVzQ29uc3RydWN0b3IiLCJhVHlwZWRBcnJheSIsImFUeXBlZEFycmF5Q29uc3RydWN0b3IiLCJleHBvcnRUeXBlZEFycmF5TWV0aG9kIiwiJHNsaWNlIiwiSW50OEFycmF5IiwibGlzdCIsIk5BVElWRV9BUlJBWV9CVUZGRVIiLCJJbnQ4QXJyYXlQcm90b3R5cGUiLCJVaW50OENsYW1wZWRBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlIiwiVHlwZWRBcnJheSIsIlR5cGVkQXJyYXlQcm90b3R5cGUiLCJpc1Byb3RvdHlwZU9mIiwiVFlQRURfQVJSQVlfVEFHIiwiTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyIsIm9wZXJhIiwiVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQiLCJUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsImlzVmlldyIsImtsYXNzIiwiaXNUeXBlZEFycmF5IiwiQVJSQVkiLCJUeXBlZEFycmF5Q29uc3RydWN0b3IiLCJwcm9wZXJ0eSIsImV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QiLCJBcnJheUJ1ZmZlciIsIkRhdGFWaWV3IiwiU1BFQ0lFUyIsImRlZmF1bHRDb25zdHJ1Y3RvciIsIlByb21pc2UiLCJET01JdGVyYWJsZXMiLCJBcnJheUl0ZXJhdG9yTWV0aG9kcyIsIkFycmF5VmFsdWVzIiwiQ09MTEVDVElPTl9OQU1FIiwiQ29sbGVjdGlvbiIsIkNvbGxlY3Rpb25Qcm90b3R5cGUiLCJDU1NSdWxlTGlzdCIsIkNTU1N0eWxlRGVjbGFyYXRpb24iLCJDU1NWYWx1ZUxpc3QiLCJDbGllbnRSZWN0TGlzdCIsIkRPTVJlY3RMaXN0IiwiRE9NU3RyaW5nTGlzdCIsIkRhdGFUcmFuc2Zlckl0ZW1MaXN0IiwiRmlsZUxpc3QiLCJIVE1MQWxsQ29sbGVjdGlvbiIsIkhUTUxDb2xsZWN0aW9uIiwiSFRNTEZvcm1FbGVtZW50IiwiSFRNTFNlbGVjdEVsZW1lbnQiLCJNZWRpYUxpc3QiLCJNaW1lVHlwZUFycmF5IiwiTmFtZWROb2RlTWFwIiwiTm9kZUxpc3QiLCJQYWludFJlcXVlc3RMaXN0IiwiUGx1Z2luIiwiUGx1Z2luQXJyYXkiLCJTVkdMZW5ndGhMaXN0IiwiU1ZHTnVtYmVyTGlzdCIsIlNWR1BhdGhTZWdMaXN0IiwiU1ZHUG9pbnRMaXN0IiwiU1ZHU3RyaW5nTGlzdCIsIlNWR1RyYW5zZm9ybUxpc3QiLCJTb3VyY2VCdWZmZXJMaXN0IiwiU3R5bGVTaGVldExpc3QiLCJUZXh0VHJhY2tDdWVMaXN0IiwiVGV4dFRyYWNrTGlzdCIsIlRvdWNoTGlzdCIsIk5hdGl2ZVByb21pc2UiLCJyZWRlZmluZUFsbCIsInNldFNwZWNpZXMiLCJhbkluc3RhbmNlIiwibWljcm90YXNrIiwicHJvbWlzZVJlc29sdmUiLCJob3N0UmVwb3J0RXJyb3JzIiwibmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUiLCJwZXJmb3JtIiwiVjhfVkVSU0lPTiIsIlBST01JU0UiLCJnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSIsIlByb21pc2VDb25zdHJ1Y3RvciIsIiRmZXRjaCIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwibmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5IiwiSVNfTk9ERSIsIkRJU1BBVENIX0VWRU5UIiwiY3JlYXRlRXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiVU5IQU5ETEVEX1JFSkVDVElPTiIsIlJFSkVDVElPTl9IQU5ETEVEIiwiUEVORElORyIsIkZVTEZJTExFRCIsIkhBTkRMRUQiLCJVTkhBTkRMRUQiLCJJbnRlcm5hbCIsIk93blByb21pc2VDYXBhYmlsaXR5IiwiUHJvbWlzZVdyYXBwZXIiLCJuYXRpdmVUaGVuIiwiR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSIsIlByb21pc2VSZWplY3Rpb25FdmVudCIsInByb21pc2UiLCJGYWtlUHJvbWlzZSIsInRoZW4iLCJhbGwiLCJpc1RoZW5hYmxlIiwibm90aWZ5IiwiaXNSZWplY3QiLCJub3RpZmllZCIsImNoYWluIiwicmVhY3Rpb25zIiwib2siLCJyZWFjdGlvbiIsImZhaWwiLCJleGl0ZWQiLCJyZWplY3Rpb24iLCJvbkhhbmRsZVVuaGFuZGxlZCIsImVudGVyIiwiZXhpdCIsIm9uVW5oYW5kbGVkIiwicmVhc29uIiwiZXZlbnQiLCJpbml0RXZlbnQiLCJJU19VTkhBTkRMRUQiLCJpc1VuaGFuZGxlZCIsImVtaXQiLCJwYXJlbnQiLCJ1bndyYXAiLCJpbnRlcm5hbFJlamVjdCIsImludGVybmFsUmVzb2x2ZSIsIndyYXBwZXIiLCJleGVjdXRvciIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsImZldGNoIiwiJHByb21pc2VSZXNvbHZlIiwiY291bnRlciIsInJlbWFpbmluZyIsImFscmVhZHlDYWxsZWQiLCJyYWNlIiwiQ09OU1RSVUNUT1JfTkFNRSIsIkNvbnN0cnVjdG9yIiwiSVNfSU9TIiwibG9jYXRpb24iLCJzZXRJbW1lZGlhdGUiLCJjbGVhciIsImNsZWFySW1tZWRpYXRlIiwiTWVzc2FnZUNoYW5uZWwiLCJEaXNwYXRjaCIsInF1ZXVlIiwiT05SRUFEWVNUQVRFQ0hBTkdFIiwiZGVmZXIiLCJjaGFubmVsIiwicG9ydCIsInJ1biIsInJ1bm5lciIsImxpc3RlbmVyIiwicG9zdCIsInBvc3RNZXNzYWdlIiwicHJvdG9jb2wiLCJob3N0IiwibmV4dFRpY2siLCJub3ciLCJwb3J0MiIsInBvcnQxIiwib25tZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImltcG9ydFNjcmlwdHMiLCJyZW1vdmVDaGlsZCIsInNldFRpbWVvdXQiLCJtYWNyb3Rhc2siLCJNdXRhdGlvbk9ic2VydmVyIiwiV2ViS2l0TXV0YXRpb25PYnNlcnZlciIsInF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciIsInF1ZXVlTWljcm90YXNrIiwiZmx1c2giLCJoZWFkIiwibGFzdCIsInRvZ2dsZSIsIm5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsIm9ic2VydmUiLCJjaGFyYWN0ZXJEYXRhIiwicHJvbWlzZUNhcGFiaWxpdHkiLCJQcm9taXNlQ2FwYWJpbGl0eSIsIiQkcmVzb2x2ZSIsIiQkcmVqZWN0IiwidmVyc2lvbnMiLCJ2OCIsIm1hdGNoIiwiYWxsU2V0dGxlZCIsInN0YXR1cyIsIk5PTl9HRU5FUklDIiwicmVhbCIsIm9uRmluYWxseSIsImlzRnVuY3Rpb24iLCJVU0VfTkFUSVZFX1VSTCIsImFycmF5RnJvbSIsInRvQVNDSUkiLCJVUkxTZWFyY2hQYXJhbXNNb2R1bGUiLCJOYXRpdmVVUkwiLCJVUkxTZWFyY2hQYXJhbXMiLCJnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlIiwiZ2V0U3RhdGUiLCJnZXRJbnRlcm5hbFVSTFN0YXRlIiwicG93IiwiSU5WQUxJRF9BVVRIT1JJVFkiLCJJTlZBTElEX1NDSEVNRSIsIklOVkFMSURfSE9TVCIsIklOVkFMSURfUE9SVCIsIkFMUEhBIiwiQUxQSEFOVU1FUklDIiwiRElHSVQiLCJIRVhfU1RBUlQiLCJPQ1QiLCJERUMiLCJIRVgiLCJGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UIiwiRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVF9FWENMVURJTkdfUEVSQ0VOVCIsIkxFQURJTkdfQU5EX1RSQUlMSU5HX0MwX0NPTlRST0xfT1JfU1BBQ0UiLCJUQUJfQU5EX05FV19MSU5FIiwiRU9GIiwicGFyc2VIb3N0IiwiY29kZVBvaW50cyIsInBhcnNlSVB2NiIsImlzU3BlY2lhbCIsInBlcmNlbnRFbmNvZGUiLCJDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0IiwicGFyc2VJUHY0IiwicGFydHMiLCJwYXJ0c0xlbmd0aCIsIm51bWJlcnMiLCJwYXJ0IiwicmFkaXgiLCJpcHY0IiwicG9wIiwicGFyc2VJbnQiLCJhZGRyZXNzIiwicGllY2VJbmRleCIsImNvbXByZXNzIiwicG9pbnRlciIsIm51bWJlcnNTZWVuIiwiaXB2NFBpZWNlIiwic3dhcHMiLCJzd2FwIiwiY2hhciIsImZpbmRMb25nZXN0WmVyb1NlcXVlbmNlIiwiaXB2NiIsIm1heEluZGV4IiwibWF4TGVuZ3RoIiwiY3VyclN0YXJ0IiwiY3Vyckxlbmd0aCIsInNlcmlhbGl6ZUhvc3QiLCJpZ25vcmUwIiwidW5zaGlmdCIsImZyYWdtZW50UGVyY2VudEVuY29kZVNldCIsInBhdGhQZXJjZW50RW5jb2RlU2V0IiwidXNlcmluZm9QZXJjZW50RW5jb2RlU2V0Iiwic3BlY2lhbFNjaGVtZXMiLCJmdHAiLCJmaWxlIiwiaHR0cCIsImh0dHBzIiwid3MiLCJ3c3MiLCJzY2hlbWUiLCJpbmNsdWRlc0NyZWRlbnRpYWxzIiwidXNlcm5hbWUiLCJjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQiLCJjYW5ub3RCZUFCYXNlVVJMIiwiaXNXaW5kb3dzRHJpdmVMZXR0ZXIiLCJub3JtYWxpemVkIiwic3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlciIsInRoaXJkIiwic2hvcnRlblVSTHNQYXRoIiwicGF0aFNpemUiLCJpc1NpbmdsZURvdCIsInNlZ21lbnQiLCJpc0RvdWJsZURvdCIsIlNDSEVNRV9TVEFSVCIsIlNDSEVNRSIsIk5PX1NDSEVNRSIsIlNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZIiwiUEFUSF9PUl9BVVRIT1JJVFkiLCJSRUxBVElWRSIsIlJFTEFUSVZFX1NMQVNIIiwiU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUyIsIlNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTIiwiQVVUSE9SSVRZIiwiSE9TVCIsIkhPU1ROQU1FIiwiUE9SVCIsIkZJTEUiLCJGSUxFX1NMQVNIIiwiRklMRV9IT1NUIiwiUEFUSF9TVEFSVCIsIlBBVEgiLCJDQU5OT1RfQkVfQV9CQVNFX1VSTF9QQVRIIiwiUVVFUlkiLCJGUkFHTUVOVCIsInBhcnNlVVJMIiwic3RhdGVPdmVycmlkZSIsInNlZW5BdCIsInNlZW5CcmFja2V0Iiwic2VlblBhc3N3b3JkVG9rZW4iLCJidWZmZXJDb2RlUG9pbnRzIiwiZmFpbHVyZSIsInF1ZXJ5IiwiZnJhZ21lbnQiLCJjb2RlUG9pbnQiLCJlbmNvZGVkQ29kZVBvaW50cyIsInNoaWZ0IiwiVVJMQ29uc3RydWN0b3IiLCJ1cmxTdHJpbmciLCJiYXNlU3RhdGUiLCJzZWFyY2hQYXJhbXMiLCJzZWFyY2hQYXJhbXNTdGF0ZSIsInVwZGF0ZVNlYXJjaFBhcmFtcyIsInVwZGF0ZVVSTCIsImhyZWYiLCJzZXJpYWxpemVVUkwiLCJvcmlnaW4iLCJnZXRPcmlnaW4iLCJnZXRQcm90b2NvbCIsImdldFVzZXJuYW1lIiwiZ2V0UGFzc3dvcmQiLCJnZXRIb3N0IiwiaG9zdG5hbWUiLCJnZXRIb3N0bmFtZSIsImdldFBvcnQiLCJwYXRobmFtZSIsImdldFBhdGhuYW1lIiwiZ2V0U2VhcmNoIiwiZ2V0U2VhcmNoUGFyYW1zIiwiaGFzaCIsImdldEhhc2giLCJVUkxQcm90b3R5cGUiLCJvdXRwdXQiLCJhY2Nlc3NvckRlc2NyaXB0b3IiLCJnZXR0ZXIiLCJ0b0pTT04iLCJuYXRpdmVDcmVhdGVPYmplY3RVUkwiLCJuYXRpdmVSZXZva2VPYmplY3RVUkwiLCJyZXZva2VPYmplY3RVUkwiLCJzb3J0IiwibWF4SW50IiwidE1pbiIsInRNYXgiLCJza2V3IiwiZGFtcCIsImluaXRpYWxCaWFzIiwiaW5pdGlhbE4iLCJkZWxpbWl0ZXIiLCJyZWdleE5vbkFTQ0lJIiwicmVnZXhTZXBhcmF0b3JzIiwiT1ZFUkZMT1dfRVJST1IiLCJiYXNlTWludXNUTWluIiwic3RyaW5nRnJvbUNoYXJDb2RlIiwiZnJvbUNoYXJDb2RlIiwidWNzMmRlY29kZSIsImV4dHJhIiwiZGlnaXRUb0Jhc2ljIiwiZGlnaXQiLCJhZGFwdCIsImRlbHRhIiwibnVtUG9pbnRzIiwiZmlyc3RUaW1lIiwiZW5jb2RlIiwiaW5wdXRMZW5ndGgiLCJuIiwiYmlhcyIsImN1cnJlbnRWYWx1ZSIsImJhc2ljTGVuZ3RoIiwiaGFuZGxlZENQQ291bnQiLCJoYW5kbGVkQ1BDb3VudFBsdXNPbmUiLCJSYW5nZUVycm9yIiwicSIsInQiLCJxTWludXNUIiwiYmFzZU1pbnVzVCIsImVuY29kZWQiLCJsYWJlbHMiLCJsYWJlbCIsImdldEl0ZXJhdG9yIiwiSGVhZGVycyIsIlVSTF9TRUFSQ0hfUEFSQU1TIiwiVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IiLCJnZXRJbnRlcm5hbFBhcmFtc1N0YXRlIiwiZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlIiwicGx1cyIsInNlcXVlbmNlcyIsInBlcmNlbnRTZXF1ZW5jZSIsIlJlZ0V4cCIsInBlcmNlbnREZWNvZGUiLCJzZXF1ZW5jZSIsImRlc2VyaWFsaXplIiwiZmluZCIsInJlcGxhY2VyIiwic2VyaWFsaXplIiwicGFyc2VTZWFyY2hQYXJhbXMiLCJhdHRyaWJ1dGVzIiwiYXR0cmlidXRlIiwidmFsaWRhdGVBcmd1bWVudHNMZW5ndGgiLCJwYXNzZWQiLCJyZXF1aXJlZCIsIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiwiSXRlcmF0b3IiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciIsImluaXQiLCJlbnRyeUl0ZXJhdG9yIiwiZW50cnlOZXh0IiwiVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlIiwiYXBwZW5kIiwic3BsaWNlIiwiZ2V0QWxsIiwiZm91bmQiLCJlbnRyaWVzSW5kZXgiLCJzbGljZUluZGV4IiwiY2FsbGJhY2siLCJib2R5IiwiaGVhZGVycyIsImZhY3RvcnkiLCJTeW1ib2xQb2x5ZmlsbCIsImRlc2NyaXB0aW9uIiwibm9vcCIsIk51bWJlcklzTmFOIiwicmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uIiwidHlwZUlzT2JqZWN0IiwiY3JlYXRlQXJyYXlGcm9tTGlzdCIsImVsZW1lbnRzIiwiQXJyYXlCdWZmZXJDb3B5IiwiZGVzdCIsImRlc3RPZmZzZXQiLCJzcmNPZmZzZXQiLCJJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyIiwiSXNOb25OZWdhdGl2ZU51bWJlciIsIkluZmluaXR5IiwiQ2FsbCIsIkNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kIiwidW5kZXJseWluZ09iamVjdCIsIm1ldGhvZE5hbWUiLCJhbGdvQXJnQ291bnQiLCJleHRyYUFyZ3MiLCJQcm9taXNlQ2FsbCIsImZ1bGxBcmdzIiwicHJvbWlzZVJlc29sdmVkV2l0aCIsIkludm9rZU9yTm9vcCIsInByb21pc2VSZWplY3RlZFdpdGgiLCJUcmFuc2ZlckFycmF5QnVmZmVyIiwiSXNEZXRhY2hlZEJ1ZmZlciIsIlZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayIsImhpZ2hXYXRlck1hcmsiLCJNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24iLCJvcmlnaW5hbFByb21pc2UiLCJvcmlnaW5hbFByb21pc2VUaGVuIiwib3JpZ2luYWxQcm9taXNlUmVzb2x2ZSIsIm9yaWdpbmFsUHJvbWlzZVJlamVjdCIsIm5ld1Byb21pc2UiLCJQZXJmb3JtUHJvbWlzZVRoZW4iLCJ1cG9uUHJvbWlzZSIsInVwb25GdWxmaWxsbWVudCIsInVwb25SZWplY3Rpb24iLCJ0cmFuc2Zvcm1Qcm9taXNlV2l0aCIsImZ1bGZpbGxtZW50SGFuZGxlciIsInJlamVjdGlvbkhhbmRsZXIiLCJzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlIiwiUVVFVUVfTUFYX0FSUkFZX1NJWkUiLCJTaW1wbGVRdWV1ZSIsIl9jdXJzb3IiLCJfc2l6ZSIsIl9mcm9udCIsIl9lbGVtZW50cyIsIl9uZXh0IiwiX2JhY2siLCJvbGRCYWNrIiwibmV3QmFjayIsIm9sZEZyb250IiwibmV3RnJvbnQiLCJvbGRDdXJzb3IiLCJuZXdDdXJzb3IiLCJwZWVrIiwiZnJvbnQiLCJjdXJzb3IiLCJSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQiLCJmb3JBdXRob3JDb2RlIiwiUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZSIsInJlYWRlciIsIl9mb3JBdXRob3JDb2RlIiwiX293bmVyUmVhZGFibGVTdHJlYW0iLCJfcmVhZGVyIiwiX3N0YXRlIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQiLCJfc3RvcmVkRXJyb3IiLCJSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwiLCJSZWFkYWJsZVN0cmVhbUNhbmNlbCIsIlJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkIiwicmVhZGVyTG9ja0V4Y2VwdGlvbiIsIl9jbG9zZWRQcm9taXNlIiwiX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSIsIl9jbG9zZWRQcm9taXNlX3JlamVjdCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSIsIkNhbmNlbFN0ZXBzIiwiUHVsbFN0ZXBzIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciIsIlJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3QiLCJyZWFkUmVxdWVzdCIsIl9yZXNvbHZlIiwiX3JlamVjdCIsIl9yZWFkUmVxdWVzdHMiLCJSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdCIsIlJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzIiwiUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyIiwiSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIiLCJJc1JlYWRhYmxlU3RyZWFtIiwiSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCIsImRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiY2FuY2VsIiwicmVhZCIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQiLCJyZWxlYXNlTG9jayIsIl9kaXN0dXJiZWQiLCJfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyIiwiX2EiLCJBc3luY0l0ZXJhdG9yUHJvdG90eXBlIiwiYXN5bmNJdGVyYXRvciIsIlJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSIsIklzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yIiwic3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJfYXN5bmNJdGVyYXRvclJlYWRlciIsInJldHVybiIsIl9wcmV2ZW50Q2FuY2VsIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciIsInByZXZlbnRDYW5jZWwiLCJCb29sZWFuIiwiRGVxdWV1ZVZhbHVlIiwiY29udGFpbmVyIiwicGFpciIsIl9xdWV1ZSIsIl9xdWV1ZVRvdGFsU2l6ZSIsIkVucXVldWVWYWx1ZVdpdGhTaXplIiwiUGVla1F1ZXVlVmFsdWUiLCJSZXNldFF1ZXVlIiwiQWJvcnRTdGVwcyIsIkVycm9yU3RlcHMiLCJXcml0YWJsZVN0cmVhbSIsInVuZGVybHlpbmdTaW5rIiwic3RyYXRlZ3kiLCJJbml0aWFsaXplV3JpdGFibGVTdHJlYW0iLCJzaXplQWxnb3JpdGhtIiwiU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rIiwiSXNXcml0YWJsZVN0cmVhbSIsInN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24iLCJJc1dyaXRhYmxlU3RyZWFtTG9ja2VkIiwiYWJvcnQiLCJXcml0YWJsZVN0cmVhbUFib3J0IiwiV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQiLCJXcml0YWJsZVN0cmVhbUNsb3NlIiwiZ2V0V3JpdGVyIiwiQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIsIkNyZWF0ZVdyaXRhYmxlU3RyZWFtIiwic3RhcnRBbGdvcml0aG0iLCJ3cml0ZUFsZ29yaXRobSIsImNsb3NlQWxnb3JpdGhtIiwiYWJvcnRBbGdvcml0aG0iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiX3dyaXRlciIsIl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIiLCJfd3JpdGVSZXF1ZXN0cyIsIl9pbkZsaWdodFdyaXRlUmVxdWVzdCIsIl9jbG9zZVJlcXVlc3QiLCJfaW5GbGlnaHRDbG9zZVJlcXVlc3QiLCJfcGVuZGluZ0Fib3J0UmVxdWVzdCIsIl9iYWNrcHJlc3N1cmUiLCJfcHJvbWlzZSIsIndhc0FscmVhZHlFcnJvcmluZyIsIl9yZWFzb24iLCJfd2FzQWxyZWFkeUVycm9yaW5nIiwiV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nIiwiY2xvc2VSZXF1ZXN0Iiwid3JpdGVyIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UiLCJXcml0YWJsZVN0cmVhbUFkZFdyaXRlUmVxdWVzdCIsIndyaXRlUmVxdWVzdCIsIldyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24iLCJXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQiLCJXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0IiwiX3N0YXJ0ZWQiLCJzdG9yZWRFcnJvciIsIldyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQiLCJhYm9ydFJlcXVlc3QiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGVXaXRoRXJyb3IiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2UiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3IiLCJXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodCIsIldyaXRhYmxlU3RyZWFtTWFya0ZpcnN0V3JpdGVSZXF1ZXN0SW5GbGlnaHQiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCIsIldyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlIiwiYmFja3ByZXNzdXJlIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0IiwiX293bmVyV3JpdGFibGVTdHJlYW0iLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkIiwiSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIiLCJkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsImRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUiLCJfcmVhZHlQcm9taXNlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQWJvcnQiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2UiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVDbG9zZWRQcm9taXNlUmVqZWN0ZWQiLCJfY2xvc2VkUHJvbWlzZVN0YXRlIiwiZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQiLCJfcmVhZHlQcm9taXNlU3RhdGUiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVqZWN0IiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0VG9SZWplY3RlZCIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSIsInJlbGVhc2VkRXJyb3IiLCJjaHVua1NpemUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0Q2h1bmtTaXplIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlIiwiSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvciIsIl9hYm9ydEFsZ29yaXRobSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMiLCJfc3RyYXRlZ3lTaXplQWxnb3JpdGhtIiwiX3N0cmF0ZWd5SFdNIiwiX3dyaXRlQWxnb3JpdGhtIiwiX2Nsb3NlQWxnb3JpdGhtIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZSIsInN0YXJ0UmVzdWx0Iiwic3RhcnRQcm9taXNlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkIiwiY2h1bmtTaXplRSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkIiwid3JpdGVSZWNvcmQiLCJlbnF1ZXVlRSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc1dyaXRlIiwic2lua0Nsb3NlUHJvbWlzZSIsInNpbmtXcml0ZVByb21pc2UiLCJkZXNpcmVkU2l6ZSIsIl9yZWFkeVByb21pc2VfcmVzb2x2ZSIsIl9yZWFkeVByb21pc2VfcmVqZWN0IiwiaXNBYm9ydFNpZ25hbCIsImFib3J0ZWQiLCJOYXRpdmVET01FeGNlcHRpb24iLCJET01FeGNlcHRpb24iLCJpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yIiwiY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwiLCJtZXNzYWdlIiwiRXJyb3IiLCJjYXB0dXJlU3RhY2tUcmFjZSIsIkRPTUV4Y2VwdGlvbiQxIiwiUmVhZGFibGVTdHJlYW1QaXBlVG8iLCJwcmV2ZW50Q2xvc2UiLCJwcmV2ZW50QWJvcnQiLCJzaWduYWwiLCJzaHV0dGluZ0Rvd24iLCJjdXJyZW50V3JpdGUiLCJhY3Rpb25zIiwic2h1dGRvd25XaXRoQWN0aW9uIiwibWFwIiwiYWN0aW9uIiwicGlwZUxvb3AiLCJyZXNvbHZlTG9vcCIsInJlamVjdExvb3AiLCJwaXBlU3RlcCIsImlzT3JCZWNvbWVzRXJyb3JlZCIsInNodXRkb3duIiwiaXNPckJlY29tZXNDbG9zZWQiLCJkZXN0Q2xvc2VkXzEiLCJ3YWl0Rm9yV3JpdGVzVG9GaW5pc2giLCJvbGRDdXJyZW50V3JpdGUiLCJvcmlnaW5hbElzRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwiZG9UaGVSZXN0IiwiZmluYWxpemUiLCJuZXdFcnJvciIsImlzRXJyb3IiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsIklzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsImRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSIsImVucXVldWUiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvciIsIl9jYW5jZWxBbGdvcml0aG0iLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbSIsIl9jbG9zZVJlcXVlc3RlZCIsIlJlYWRhYmxlU3RyZWFtQ2xvc2UiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCIsInBlbmRpbmdQcm9taXNlIiwic2hvdWxkUHVsbCIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCIsIl9wdWxsaW5nIiwiX3B1bGxBZ2FpbiIsInB1bGxQcm9taXNlIiwiX3B1bGxBbGdvcml0aG0iLCJSZWFkYWJsZVN0cmVhbUVycm9yIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZSIsIlNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsInB1bGxBbGdvcml0aG0iLCJjYW5jZWxBbGdvcml0aG0iLCJTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSIsInVuZGVybHlpbmdTb3VyY2UiLCJSZWFkYWJsZVN0cmVhbVRlZSIsImNsb25lRm9yQnJhbmNoMiIsInJlYWRpbmciLCJjYW5jZWxlZDEiLCJjYW5jZWxlZDIiLCJyZWFzb24xIiwicmVhc29uMiIsImJyYW5jaDEiLCJicmFuY2gyIiwicmVzb2x2ZUNhbmNlbFByb21pc2UiLCJjYW5jZWxQcm9taXNlIiwidmFsdWUxIiwidmFsdWUyIiwiY2FuY2VsMUFsZ29yaXRobSIsImNvbXBvc2l0ZVJlYXNvbiIsImNhbmNlbFJlc3VsdCIsImNhbmNlbDJBbGdvcml0aG0iLCJDcmVhdGVSZWFkYWJsZVN0cmVhbSIsIk51bWJlcklzSW50ZWdlciIsIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QiLCJJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QiLCJieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24iLCJfdmlldyIsInJlc3BvbmQiLCJieXRlc1dyaXR0ZW4iLCJfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZCIsInJlc3BvbmRXaXRoTmV3VmlldyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXciLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiX2J5b2JSZXF1ZXN0IiwiX3BlbmRpbmdQdWxsSW50b3MiLCJmaXJzdERlc2NyaXB0b3IiLCJieXRlT2Zmc2V0IiwiYnl0ZXNGaWxsZWQiLCJieXRlTGVuZ3RoIiwiYnlvYlJlcXVlc3QiLCJTZXRVcFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUiLCJfY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluIiwidmlld0UiLCJhdXRvQWxsb2NhdGVDaHVua1NpemUiLCJfYXV0b0FsbG9jYXRlQ2h1bmtTaXplIiwiYnVmZmVyRSIsInB1bGxJbnRvRGVzY3JpcHRvciIsImVsZW1lbnRTaXplIiwicmVhZGVyVHlwZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yIiwiZmlsbGVkVmlldyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yIiwiUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSIsImN1cnJlbnRBbGlnbmVkQnl0ZXMiLCJtYXhCeXRlc1RvQ29weSIsIm1heEJ5dGVzRmlsbGVkIiwibWF4QWxpZ25lZEJ5dGVzIiwidG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyIsInJlYWR5IiwiaGVhZE9mUXVldWUiLCJieXRlc1RvQ29weSIsImRlc3RTdGFydCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvciIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8iLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHVsbEludG8iLCJCWVRFU19QRVJfRUxFTUVOVCIsIlJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0IiwiZW1wdHlWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlIiwiUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyIiwiUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUiLCJyZW1haW5kZXJTaXplIiwicmVtYWluZGVyIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbCIsImZpcnN0UGVuZGluZ1B1bGxJbnRvIiwidHJhbnNmZXJyZWRCdWZmZXIiLCJ0cmFuc2ZlcnJlZFZpZXciLCJTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiLCJTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSIsInVuZGVybHlpbmdCeXRlU291cmNlIiwicmVxdWVzdCIsIkFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIiLCJSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIiLCJyZWFkSW50b1JlcXVlc3QiLCJfcmVhZEludG9SZXF1ZXN0cyIsIklzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIiwiYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXJSZWFkIiwiUmVhZGFibGVTdHJlYW0iLCJJbml0aWFsaXplUmVhZGFibGVTdHJlYW0iLCJ0eXBlU3RyaW5nIiwic3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxIiwiZ2V0UmVhZGVyIiwicGlwZVRocm91Z2giLCJfYiIsInJlYWRhYmxlIiwiX2MiLCJwaXBlVG8iLCJ0ZWUiLCJicmFuY2hlcyIsInNvdXJjZUNhbmNlbFByb21pc2UiLCJCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5IiwiQ291bnRRdWV1aW5nU3RyYXRlZ3kiLCJUcmFuc2Zvcm1TdHJlYW0iLCJ0cmFuc2Zvcm1lciIsIndyaXRhYmxlU3RyYXRlZ3kiLCJyZWFkYWJsZVN0cmF0ZWd5Iiwid3JpdGFibGVTaXplRnVuY3Rpb24iLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLCJyZWFkYWJsZVNpemVGdW5jdGlvbiIsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIsIndyaXRhYmxlVHlwZSIsIndyaXRhYmxlU2l6ZUFsZ29yaXRobSIsInJlYWRhYmxlVHlwZSIsInJlYWRhYmxlU2l6ZUFsZ29yaXRobSIsInN0YXJ0UHJvbWlzZV9yZXNvbHZlIiwiSW5pdGlhbGl6ZVRyYW5zZm9ybVN0cmVhbSIsIlNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIiLCJfdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlciIsIklzVHJhbnNmb3JtU3RyZWFtIiwic3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyIiwiX3JlYWRhYmxlIiwiX3dyaXRhYmxlIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtXcml0ZUFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQWJvcnRBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Nsb3NlQWxnb3JpdGhtIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNvdXJjZVB1bGxBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlIiwiX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UiLCJfYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlIiwiVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlIiwiVHJhbnNmb3JtU3RyZWFtRXJyb3IiLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsImRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxIiwicmVhZGFibGVDb250cm9sbGVyIiwiX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUiLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yIiwidGVybWluYXRlIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUiLCJTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwidHJhbnNmb3JtQWxnb3JpdGhtIiwiZmx1c2hBbGdvcml0aG0iLCJfdHJhbnNmb3JtQWxnb3JpdGhtIiwiX2ZsdXNoQWxnb3JpdGhtIiwidHJhbnNmb3JtUmVzdWx0RSIsInRyYW5zZm9ybU1ldGhvZCIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybSIsInRyYW5zZm9ybVByb21pc2UiLCJiYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlIiwiZmx1c2hQcm9taXNlIiwiTWFwIiwiY29sbGVjdGlvbiIsImNvbGxlY3Rpb25TdHJvbmciLCJJbnRlcm5hbE1ldGFkYXRhTW9kdWxlIiwiaW5oZXJpdElmUmVxdWlyZWQiLCJjb21tb24iLCJJU19NQVAiLCJJU19XRUFLIiwiQURERVIiLCJOYXRpdmVDb25zdHJ1Y3RvciIsIk5hdGl2ZVByb3RvdHlwZSIsImV4cG9ydGVkIiwiZml4TWV0aG9kIiwibmF0aXZlTWV0aG9kIiwiYWRkIiwiZ2V0Q29uc3RydWN0b3IiLCJpbnN0YW5jZSIsIkhBU05UX0NIQUlOSU5HIiwiVEhST1dTX09OX1BSSU1JVElWRVMiLCJBQ0NFUFRfSVRFUkFCTEVTIiwiQlVHR1lfWkVSTyIsIiRpbnN0YW5jZSIsImR1bW15Iiwic2V0U3Ryb25nIiwiRlJFRVpJTkciLCJNRVRBREFUQSIsImlzRXh0ZW5zaWJsZSIsInNldE1ldGFkYXRhIiwib2JqZWN0SUQiLCJ3ZWFrRGF0YSIsImZhc3RLZXkiLCJnZXRXZWFrRGF0YSIsIm9uRnJlZXplIiwibWV0YSIsInByZXZlbnRFeHRlbnNpb25zIiwiV3JhcHBlciIsIk5ld1RhcmdldCIsIk5ld1RhcmdldFByb3RvdHlwZSIsImludGVybmFsU3RhdGVHZXR0ZXJGb3IiLCJnZXRFbnRyeSIsInByZXZpb3VzIiwicmVtb3ZlZCIsInByZXYiLCJjYWxsYmFja2ZuIiwiSVRFUkFUT1JfTkFNRSIsImdldEludGVybmFsQ29sbGVjdGlvblN0YXRlIiwiU2V0IiwiY29sbGVjdGlvbldlYWsiLCJlbmZvcmNlSXRlcm5hbFN0YXRlIiwiSVNfSUUxMSIsIkludGVybmFsV2Vha01hcCIsIiRXZWFrTWFwIiwiV2Vha01hcFByb3RvdHlwZSIsIm5hdGl2ZURlbGV0ZSIsIm5hdGl2ZUhhcyIsIm5hdGl2ZUdldCIsIm5hdGl2ZVNldCIsImZyb3plbiIsIkFycmF5SXRlcmF0aW9uTW9kdWxlIiwiJGhhcyIsImZpbmRJbmRleCIsInVuY2F1Z2h0RnJvemVuU3RvcmUiLCJVbmNhdWdodEZyb3plblN0b3JlIiwiZmluZFVuY2F1Z2h0RnJvemVuIiwiYXJyYXlTcGVjaWVzQ3JlYXRlIiwiSVNfRklMVEVSIiwiSVNfU09NRSIsIklTX0VWRVJZIiwiSVNfRklORF9JTkRFWCIsIk5PX0hPTEVTIiwic3BlY2lmaWNDcmVhdGUiLCJmaWx0ZXIiLCJzb21lIiwiZXZlcnkiLCJpc0FycmF5Iiwib3JpZ2luYWxBcnJheSIsIldlYWtTZXQiLCJjb2RlUG9pbnRBdCIsImZyb21Db2RlUG9pbnQiLCJuYXRpdmVGcm9tQ29kZVBvaW50IiwiSU5DT1JSRUNUX0xFTkdUSCIsImFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQiLCJJU19DT05DQVRfU1BSRUFEQUJMRSIsIk1BWF9TQUZFX0lOVEVHRVIiLCJNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQiLCJJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUIiwiYXJyYXkiLCJTUEVDSUVTX1NVUFBPUlQiLCJpc0NvbmNhdFNwcmVhZGFibGUiLCJzcHJlYWRhYmxlIiwiRSIsImZvbyIsIm5hdGl2ZU9iamVjdENyZWF0ZSIsImdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCIsIndyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUiLCJkZWZpbmVXZWxsS25vd25TeW1ib2wiLCIkZm9yRWFjaCIsIlNZTUJPTCIsIlRPX1BSSU1JVElWRSIsIiRzdHJpbmdpZnkiLCJuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzIiwiQWxsU3ltYm9scyIsIk9iamVjdFByb3RvdHlwZVN5bWJvbHMiLCJTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5IiwiU3ltYm9sVG9TdHJpbmdSZWdpc3RyeSIsIlFPYmplY3QiLCJVU0VfU0VUVEVSIiwiZmluZENoaWxkIiwic2V0U3ltYm9sRGVzY3JpcHRvciIsIk9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IiLCJpc1N5bWJvbCIsIiRkZWZpbmVQcm9wZXJ0eSIsIiRkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIiRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCIkcHJvcGVydHlJc0VudW1lcmFibGUiLCIkY3JlYXRlIiwiJGdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIiRnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiSVNfT0JKRUNUX1BST1RPVFlQRSIsImtleUZvciIsInN5bSIsInVzZVNldHRlciIsInVzZVNpbXBsZSIsIkZPUkNFRF9KU09OX1NUUklOR0lGWSIsInN0cmluZ2lmeSIsInNwYWNlIiwiJHJlcGxhY2VyIiwid2luZG93TmFtZXMiLCJnZXRXaW5kb3dOYW1lcyIsIk5hdGl2ZVN5bWJvbCIsIkVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZSIsIlN5bWJvbFdyYXBwZXIiLCJzeW1ib2xQcm90b3R5cGUiLCJzeW1ib2xUb1N0cmluZyIsIm5hdGl2ZSIsImRlc2MiLCJKU09OIiwiJHBhZFN0YXJ0IiwiV0VCS0lUX0JVRyIsInBhZFN0YXJ0IiwicmVwZWF0IiwiSVNfRU5EIiwiZmlsbFN0cmluZyIsInN0cmluZ0xlbmd0aCIsImZpbGxTdHIiLCJpbnRNYXhMZW5ndGgiLCJmaWxsTGVuIiwic3RyaW5nRmlsbGVyIiwiY291bnQiLCIkcGFkRW5kIiwicGFkRW5kIiwiJHZhbHVlcyIsIlRPX0VOVFJJRVMiLCIkZW50cmllcyIsIk5hbWUiLCJuYW1lQ2FjaGUiLCJuYW1lVmFsdWUiLCJDbWQiLCJjbWRDYWNoZSIsImNtZFZhbHVlIiwiRGljdCIsIm5vblNlcmlhbGl6YWJsZSIsImFzc2lnblhyZWYiLCJrZXkyIiwia2V5MyIsImdldEFycmF5IiwiZ2V0UmF3IiwiZ2V0S2V5cyIsImdldFJhd1ZhbHVlcyIsIm1lcmdlU3ViRGljdHMiLCJtZXJnZWREaWN0IiwiZGljdCIsInN1YkRpY3QiLCJyZWZDYWNoZSIsImdlbiIsInJlZlZhbHVlIiwicHV0IiwicmVtb3ZlIiwicHV0QWxpYXMiLCJpc05hbWUiLCJ2MSIsInYyIiwiZW5zdXJlRG9jIiwiZW5zdXJlWFJlZiIsImVuc3VyZUNhdGFsb2ciLCJnZXRQYWdlIiwiZm9udEZhbGxiYWNrIiwibWFudWFsbHlUcmlnZ2VyZWQiLCJjbGVhbnVwIiwicmVxdWVzdFJhbmdlIiwic2VuZFByb2dyZXNzaXZlRGF0YSIsInVwZGF0ZVBhc3N3b3JkIiwiY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCIsImNodW5rcyIsIm9uUmVjZWl2ZURhdGEiLCJiZWdpbiIsImJlZ2luQ2h1bmsiLCJlbmRDaHVuayIsImN1ckNodW5rIiwib25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhIiwiZW5zdXJlQnl0ZSIsImVuc3VyZVJhbmdlIiwibmV4dEVtcHR5Q2h1bmsiLCJudW1DaHVua3MiLCJoYXNDaHVuayIsImIwIiwiZ2V0Qnl0ZXMiLCJmb3JjZUNsYW1wZWQiLCJzdHJFbmQiLCJzdWJhcnJheSIsInBlZWtlZEJ5dGUiLCJwZWVrQnl0ZXMiLCJnZXRCeXRlUmFuZ2UiLCJza2lwIiwibWFrZVN1YlN0cmVhbSIsIkNodW5rZWRTdHJlYW1TdWJzdHJlYW0iLCJtaXNzaW5nQ2h1bmtzIiwic3ViU3RyZWFtIiwic2VuZFJlcXVlc3QiLCJyYW5nZVJlYWRlciIsImNodW5rRGF0YSIsIl9yZXF1ZXN0Q2h1bmtzIiwicmVxdWVzdElkIiwiY2h1bmtzTmVlZGVkIiwiY2h1bmtzVG9SZXF1ZXN0IiwicmVxdWVzdElkcyIsImdyb3VwZWRDaHVua3NUb1JlcXVlc3QiLCJncm91cGVkQ2h1bmsiLCJyYW5nZXMiLCJyZXF1ZXN0UmFuZ2VzIiwicmFuZ2UiLCJncm91cENodW5rcyIsImdyb3VwZWRDaHVua3MiLCJwcmV2Q2h1bmsiLCJvblByb2dyZXNzIiwiaXNQcm9ncmVzc2l2ZSIsImxvYWRlZFJlcXVlc3RzIiwibGFzdENodW5rIiwib25FcnJvciIsImdldEJlZ2luQ2h1bmsiLCJnZXRFbmRDaHVuayIsImxvb2t1cCIsImluaXRpYWxpemVyIiwic3RvcFdoZW5Gb3VuZCIsIkxPT1BfTElNSVQiLCJsb29wQ291bnQiLCJST01BTl9OVU1CRVJfTUFQIiwibG93ZXJDYXNlIiwicm9tYW5CdWYiLCJyb21hblN0ciIsIm9mZnNldCIsImNoIiwiREVGQVVMVF9VU0VSX1VOSVQiLCJMRVRURVJfU0laRV9NRURJQUJPWCIsImFubm90YXRpb24iLCJpZENvdW50ZXJzIiwiX2dldEluaGVyaXRhYmxlUHJvcGVydHkiLCJpc0RpY3QiLCJkaWN0QXJyYXkiLCJfZ2V0Qm91bmRpbmdCb3giLCJib3giLCJzdHJlYW1zIiwiaXNTdHJlYW0iLCJwYXJ0aWFsRXZhbHVhdG9yIiwiaWRGYWN0b3J5IiwiZm9udENhY2hlIiwiYnVpbHRJbkNNYXBDYWNoZSIsImdsb2JhbEltYWdlQ2FjaGUiLCJuZXdSZWZzUHJvbWlzZXMiLCJpc0Fubm90YXRpb25SZW5kZXJhYmxlIiwibG9hZFJlc291cmNlcyIsIm9iamVjdExvYWRlciIsImdldE9wZXJhdG9yTGlzdCIsImNvbnRlbnRTdHJlYW1Qcm9taXNlIiwicmVzb3VyY2VzUHJvbWlzZSIsImRhdGFQcm9taXNlcyIsInBhZ2VMaXN0UHJvbWlzZSIsIm9wTGlzdCIsInRyYW5zcGFyZW5jeSIsInJlc291cmNlcyIsIm9wZXJhdG9yTGlzdCIsImFubm90YXRpb25zIiwicGFnZU9wTGlzdCIsIm9wTGlzdFByb21pc2VzIiwiZXh0cmFjdFRleHRDb250ZW50IiwiZ2V0QW5ub3RhdGlvbnNEYXRhIiwiYW5ub3RhdGlvbnNEYXRhIiwiaXNOdW0iLCJjcm9wQm94IiwiaXNBcnJheUVxdWFsIiwicGFyc2VkQW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uUHJvbWlzZXMiLCJQREZfSEVBREVSX1NJR05BVFVSRSIsIlNUQVJUWFJFRl9TSUdOQVRVUkUiLCJFTkRPQkpfU0lHTkFUVVJFIiwiRklOR0VSUFJJTlRfRklSU1RfQllURVMiLCJFTVBUWV9GSU5HRVJQUklOVCIsIlBERl9IRUFERVJfVkVSU0lPTl9SRUdFWFAiLCJsaW1pdCIsImJhY2t3YXJkcyIsInNpZ25hdHVyZUxlbmd0aCIsInNpZ25hdHVyZSIsInNjYW5CeXRlcyIsInNjYW5MZW5ndGgiLCJzaWduYXR1cmVFbmQiLCJpc0FycmF5QnVmZmVyIiwicGFyc2UiLCJNQVhfUERGX1ZFUlNJT05fTEVOR1RIIiwiX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMiLCJyZWN1cnNpb25EZXB0aCIsIlJFQ1VSU0lPTl9MSU1JVCIsImZpZWxkIiwiaXNTaWduYXR1cmUiLCJpc0ludmlzaWJsZSIsIl9nZXRMaW5lYXJpemF0aW9uUGFnZSIsImxpbmVhcml6YXRpb24iLCJjYXRhbG9nIiwicGFnZURpY3QiLCJnbG9iYWxJZEZhY3RvcnkiLCJMaW5lYXJpemF0aW9uIiwiZXJyIiwic3RhcnRYUmVmTGVuZ3RoIiwiaXNXaGl0ZVNwYWNlIiwibnVtIiwiZm9ybUluZm8iLCJoYXNBY3JvRm9ybSIsImhhc1hmYSIsImFjcm9Gb3JtIiwieGZhIiwiZmllbGRzIiwiaGFzRmllbGRzIiwic2lnRmxhZ3MiLCJoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzIiwiRG9jdW1lbnRJbmZvVmFsaWRhdG9ycyIsIlRpdGxlIiwiQXV0aG9yIiwiU3ViamVjdCIsIktleXdvcmRzIiwiQ3JlYXRvciIsIlByb2R1Y2VyIiwiQ3JlYXRpb25EYXRlIiwiTW9kRGF0ZSIsIlRyYXBwZWQiLCJkb2NJbmZvIiwiUERGRm9ybWF0VmVyc2lvbiIsIklzTGluZWFyaXplZCIsIklzQWNyb0Zvcm1QcmVzZW50IiwiSXNYRkFQcmVzZW50IiwiSXNDb2xsZWN0aW9uUHJlc2VudCIsImluZm9EaWN0IiwiY3VzdG9tVmFsdWUiLCJpc0Jvb2wiLCJpZEFycmF5IiwiY2FsY3VsYXRlTUQ1IiwiZmluZ2VycHJpbnRCdWYiLCJoZXgiLCJpc1JlZiIsInJvb3QiLCJpdGVtcyIsInByb2Nlc3NlZCIsImJsYWNrQ29sb3IiLCJvdXRsaW5lRGljdCIsIkNhdGFsb2ciLCJkZXN0RGljdCIsInJlc3VsdE9iaiIsInRpdGxlIiwiZmxhZ3MiLCJjb2xvciIsInJnYkNvbG9yIiwiQ29sb3JTcGFjZSIsIm91dGxpbmVJdGVtIiwidW5zYWZlVXJsIiwibmV3V2luZG93IiwiYm9sZCIsIml0YWxpYyIsInBlcm1pc3Npb25zIiwiX3JlYWRPcHRpb25hbENvbnRlbnRDb25maWciLCJvblBhcnNlZCIsImNvbnRlbnRHcm91cFJlZnMiLCJuZXN0ZWRMZXZlbHMiLCJvcmRlciIsInBhcnNlZE9yZGVyUmVmcyIsIm5lc3RlZE9yZGVyIiwicGFyc2VOZXN0ZWRPcmRlciIsImhpZGRlbkdyb3VwcyIsImdyb3VwUmVmIiwibmVzdGVkTmFtZSIsInBhcnNlT3JkZXIiLCJNQVhfTkVTVEVEX0xFVkVMUyIsImNvbmZpZyIsImNyZWF0b3IiLCJvbiIsInBhcnNlT25PZmYiLCJvZmYiLCJncm91cHMiLCJnZXREZXN0aW5hdGlvbiIsImZldGNoRGVzdGluYXRpb24iLCJwYWdlTGFiZWxzIiwicHJlZml4IiwibnVtYmVyVHJlZSIsIm51bXMiLCJjdXJyZW50TGFiZWwiLCJjdXJyZW50SW5kZXgiLCJsYWJlbERpY3QiLCJzIiwic3QiLCJ0b1JvbWFuTnVtZXJhbHMiLCJMSU1JVCIsIkFfVVBQRVJfQ0FTRSIsIkFfTE9XRVJfQ0FTRSIsImJhc2VDaGFyQ29kZSIsImxldHRlckluZGV4IiwiY2hhcmFjdGVyIiwiY2hhckJ1ZiIsImpqIiwidHJhbnNsYXRlZEZvbnRzIiwidHJhbnNsYXRlZEZvbnQiLCJnZXRQYWdlRGljdCIsIm5vZGVzVG9WaXNpdCIsInZpc2l0ZWROb2RlcyIsInBhZ2VLaWRzQ291bnRDYWNoZSIsImN1cnJlbnRQYWdlSW5kZXgiLCJjdXJyZW50Tm9kZSIsIm9iaklkIiwia2lkcyIsImdldFBhZ2VJbmRleCIsImlzUmVmc0VxdWFsIiwicGFyZW50UmVmIiwia2lkUHJvbWlzZXMiLCJraWQiLCJzdHJlYW1SZWYiLCJzdXBwcmVzc0VuY3J5cHRpb24iLCJzdWJ0eXBlIiwic3RyaW5nVG9VVEY4U3RyaW5nIiwiYnl0ZXNUb1N0cmluZyIsInBhZ2VzT2JqIiwiZGVmYXVsdENvbmZpZyIsImdyb3Vwc0RhdGEiLCJncm91cFJlZnMiLCJncm91cCIsImRlc3RzIiwicGFnZUxheW91dCIsInBhZ2VNb2RlIiwiVmlld2VyUHJlZmVyZW5jZXNWYWxpZGF0b3JzIiwiSGlkZVRvb2xiYXIiLCJIaWRlTWVudWJhciIsIkhpZGVXaW5kb3dVSSIsIkZpdFdpbmRvdyIsIkNlbnRlcldpbmRvdyIsIkRpc3BsYXlEb2NUaXRsZSIsIk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSIsIkRpcmVjdGlvbiIsIlZpZXdBcmVhIiwiVmlld0NsaXAiLCJQcmludEFyZWEiLCJQcmludENsaXAiLCJQcmludFNjYWxpbmciLCJEdXBsZXgiLCJQaWNrVHJheUJ5UERGU2l6ZSIsIlByaW50UGFnZVJhbmdlIiwiTnVtQ29waWVzIiwicHJlZnMiLCJwcmVmVmFsdWUiLCJpc1ZhbGlkIiwib3BlbkFjdGlvbiIsImF0dGFjaG1lbnRzIiwibmFtZVRyZWUiLCJmcyIsImpzRGljdCIsImpzIiwiYXBwZW5kSWZKYXZhU2NyaXB0RGljdCIsImFjdGlvblR5cGUiLCJhY3Rpb25OYW1lIiwiYWRkRGVmYXVsdFByb3RvY29sVG9VcmwiLCJ1cmxEaWN0IiwicmVtb3RlRGVzdCIsIm5hbWVkQWN0aW9uIiwianNBY3Rpb24iLCJVUkxfT1BFTl9NRVRIT0RTIiwicmVnZXgiLCJqc1VybCIsInRyeUNvbnZlcnRVcmxFbmNvZGluZyIsIlhSZWYiLCJzdHJlYW1UeXBlcyIsImZvbnRUeXBlcyIsImdldE5ld1JlZiIsInJlc2V0TmV3UmVmIiwic2V0U3RhcnRYUmVmIiwidHJhaWxlckRpY3QiLCJpZHMiLCJmaWxlSWQiLCJwcm9jZXNzWFJlZlRhYmxlIiwiZW50cnlOdW0iLCJzdHJlYW1Qb3MiLCJwYXJzZXIiLCJwYXJzZXJCdWYxIiwicGFyc2VyQnVmMiIsImlzQ21kIiwicmVhZFhSZWZUYWJsZSIsInRhYmxlU3RhdGUiLCJwcm9jZXNzWFJlZlN0cmVhbSIsInN0cmVhbVBhcmFtZXRlcnMiLCJieXRlV2lkdGhzIiwiZW50cnlSYW5nZXMiLCJyZWFkWFJlZlN0cmVhbSIsInN0cmVhbVN0YXRlIiwidHlwZUZpZWxkV2lkdGgiLCJvZmZzZXRGaWVsZFdpZHRoIiwiZ2VuZXJhdGlvbkZpZWxkV2lkdGgiLCJnZW5lcmF0aW9uIiwiaW5kZXhPYmplY3RzIiwiVEFCIiwiTEYiLCJDUiIsIlNQQUNFIiwiUEVSQ0VOVCIsIndoYXQiLCJkYXRhTGVuZ3RoIiwic2tpcHBlZCIsIm9ialJlZ0V4cCIsImVuZG9ialJlZ0V4cCIsIm5lc3RlZE9ialJlZ0V4cCIsIkNIRUNLX0NPTlRFTlRfTEVOR1RIIiwidHJhaWxlckJ5dGVzIiwic3RhcnR4cmVmQnl0ZXMiLCJvYmpCeXRlcyIsInhyZWZCeXRlcyIsInRyYWlsZXJzIiwieHJlZlN0bXMiLCJyZWFkVG9rZW4iLCJza2lwVW50aWwiLCJ1bmNvbXByZXNzZWQiLCJjb250ZW50TGVuZ3RoIiwic3RhcnRQb3MiLCJlbmRQb3MiLCJjaGVja1BvcyIsInRva2VuU3RyIiwib2JqVG9rZW4iLCJ4cmVmVGFnT2Zmc2V0IiwibGV4ZXIiLCJhbGxvd1N0cmVhbXMiLCJyZWNvdmVyeU1vZGUiLCJyb290RGljdCIsInJlYWRYUmVmIiwic3RhcnRYUmVmUGFyc2VkQ2FjaGUiLCJ4cmVmRW50cnkiLCJmZXRjaElmUmVmIiwiY2FjaGVFbnRyeSIsImZldGNoVW5jb21wcmVzc2VkIiwib2JqMSIsIm9iajIiLCJvYmozIiwiZmV0Y2hDb21wcmVzc2VkIiwidGFibGVPZmZzZXQiLCJnZXRDYXRhbG9nT2JqIiwia2lkc09yRW50cmllcyIsIk1BWF9MRVZFTFMiLCJsIiwibGltaXRzIiwidG1wIiwiY3VycmVudEtleSIsIm1tIiwiRmlsZVNwZWMiLCJwaWNrUGxhdGZvcm1JdGVtIiwiZmlsZU9iaiIsIk9iamVjdExvYWRlciIsIm1heUhhdmVDaGlsZHJlbiIsInJhd1ZhbHVlIiwibm9kZXNUb1JldmlzaXQiLCJwZW5kaW5nUmVxdWVzdHMiLCJiYXNlU3RyZWFtcyIsImZvdW5kTWlzc2luZ0RhdGEiLCJhZGRDaGlsZHJlbiIsIk1BWF9MRU5HVEhfVE9fQ0FDSEUiLCJNQVhfQURMRVIzMl9MRU5HVEgiLCJieXRlc0xlbmd0aCIsImNpcGhlclRyYW5zZm9ybSIsImdldE9iaiIsImJ1ZjEiLCJpc0VPRiIsImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kIiwiSSIsIk5VTCIsIm1heWJlRUlQb3MiLCJmb2xsb3dpbmdCeXRlcyIsIm5leHRPYmoiLCJlbmRPZmZzZXQiLCJmaW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kIiwiZm91bmRFT0kiLCJtYXJrZXJMZW5ndGgiLCJmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZCIsIlRJTERFIiwidGlsZGVQb3MiLCJtYXliZUVJIiwiZmluZEFTQ0lJSGV4RGVjb2RlSW5saW5lU3RyZWFtRW5kIiwiaW5saW5lU3RyZWFtU2tpcEVJIiwibWFrZUlubGluZUltYWdlIiwiZGljdExlbmd0aCIsImZpbHRlck5hbWUiLCJmaWx0ZXJaZXJvIiwiaW1hZ2VTdHJlYW0iLCJpbWFnZUJ5dGVzIiwiaW5pdGlhbFN0cmVhbVBvcyIsImRpY3RCeXRlcyIsImNhY2hlS2V5IiwiY29tcHV0ZUFkbGVyMzIiLCJfZmluZFN0cmVhbUxlbmd0aCIsIlNDQU5fQkxPQ0tfTEVOR1RIIiwibWFrZVN0cmVhbSIsIkVORFNUUkVBTV9TSUdOQVRVUkUiLCJhY3R1YWxMZW5ndGgiLCJNQVhfVFJVTkNBVElPTiIsIlRSVU5DQVRFRF9TSUdOQVRVUkUiLCJtYXliZUxlbmd0aCIsImxhc3RCeXRlIiwiZmlsdGVyQXJyYXkiLCJwYXJhbXNBcnJheSIsIm1ha2VGaWx0ZXIiLCJ4cmVmU3RyZWFtU3RhdHMiLCJlYXJseUNoYW5nZSIsInNwZWNpYWxDaGFycyIsImtub3duQ29tbWFuZHMiLCJlTm90YXRpb24iLCJkaXZpZGVCeSIsInNpZ24iLCJiYXNlVmFsdWUiLCJwb3dlclZhbHVlIiwicG93ZXJWYWx1ZVNpZ24iLCJjdXJyZW50RGlnaXQiLCJudW1QYXJlbiIsImNoYXJCdWZmZXJlZCIsInRvSGV4RGlnaXQiLCJwcmV2aW91c0NoIiwieDIiLCJfaGV4U3RyaW5nV2FybiIsIk1BWF9IRVhfU1RSSU5HX05VTV9XQVJOIiwiaXNGaXJzdEhleCIsImZpcnN0RGlnaXQiLCJzZWNvbmREaWdpdCIsImNvbW1lbnQiLCJrbm93bkNvbW1hbmRGb3VuZCIsInBvc3NpYmxlQ29tbWFuZCIsImN1cnJlbnRDaGFyIiwiYmVnaW5JbmxpbmVJbWFnZVBvcyIsImFsbG93WmVyb1ZhbHVlIiwibGluRGljdCIsImhpbnRzIiwiaGludHNMZW5ndGgiLCJoaW50IiwiZ2V0SW50IiwiZ2V0SGludHMiLCJvYmplY3ROdW1iZXJGaXJzdCIsImVuZEZpcnN0IiwibWFpblhSZWZFbnRyaWVzT2Zmc2V0IiwicGFnZUZpcnN0IiwiU3RyZWFtIiwiYXJyYXlCdWZmZXIiLCJnZXRCeXRlIiwiZ2V0VWludDE2IiwiZ2V0SW50MzIiLCJwZWVrQnl0ZSIsIm1vdmVTdGFydCIsIlN0cmluZ1N0cmVhbSIsIkRlY29kZVN0cmVhbSIsImVtcHR5QnVmZmVyIiwibWF5YmVNaW5CdWZmZXJMZW5ndGgiLCJlbnN1cmVCdWZmZXIiLCJyZXF1ZXN0ZWQiLCJidWZmZXIyIiwiYnVmRW5kIiwiZ2V0QmFzZVN0cmVhbXMiLCJTdHJlYW1zU2VxdWVuY2VTdHJlYW0iLCJidWZmZXJMZW5ndGgiLCJuZXdMZW5ndGgiLCJGbGF0ZVN0cmVhbSIsImNvZGVMZW5Db2RlTWFwIiwibGVuZ3RoRGVjb2RlIiwiZGlzdERlY29kZSIsImZpeGVkTGl0Q29kZVRhYiIsImZpeGVkRGlzdENvZGVUYWIiLCJjbWYiLCJmbGciLCJjb2RlU2l6ZSIsImNvZGVCdWYiLCJjb2RlcyIsInRhYmxlIiwibWF4TGVuIiwiY29kZUxlbiIsImNvZGVWYWwiLCJsZW5ndGhzIiwiY29kZTIiLCJoZHIiLCJibG9ja0xlbiIsImJsb2NrIiwibGl0Q29kZVRhYmxlIiwiZGlzdENvZGVUYWJsZSIsIm51bUxpdENvZGVzIiwibnVtRGlzdENvZGVzIiwibnVtQ29kZUxlbkNvZGVzIiwiY29kZUxlbkNvZGVMZW5ndGhzIiwiY29kZUxlbkNvZGVUYWIiLCJjb2RlTGVuZ3RocyIsImJpdHNMZW5ndGgiLCJiaXRzT2Zmc2V0IiwicmVwZWF0TGVuZ3RoIiwiY29kZTEiLCJkaXN0IiwiUHJlZGljdG9yU3RyZWFtIiwicHJlZGljdG9yIiwiY29sb3JzIiwiYml0cyIsImNvbHVtbnMiLCJyb3dCeXRlcyIsInJhd0J5dGVzIiwiaW5idWYiLCJvdXRidWYiLCJpbmJpdHMiLCJvdXRiaXRzIiwiYnl0ZXNQZXJQaXhlbCIsInN1bSIsImNvbXBBcnJheSIsImJpdE1hc2siLCJrayIsInBpeEJ5dGVzIiwicHJldlJvdyIsInVwIiwidXBMZWZ0IiwibGVmdCIsInBhIiwicGIiLCJwYyIsIkRlY3J5cHRTdHJlYW0iLCJoYXNNb3JlRGF0YSIsImRlY3J5cHQiLCJBc2NpaTg1U3RyZWFtIiwiVElMREFfQ0hBUiIsIlpfTE9XRVJfQ0hBUiIsIkFzY2lpSGV4U3RyZWFtIiwiVVBTVFJFQU1fQkxPQ0tfU0laRSIsIm1heERlY29kZUxlbmd0aCIsIlJ1bkxlbmd0aFN0cmVhbSIsInJlcGVhdEhlYWRlciIsIkxaV1N0cmVhbSIsIm1heEx6d0RpY3Rpb25hcnlTaXplIiwibHp3U3RhdGUiLCJjb2RlTGVuZ3RoIiwibmV4dENvZGUiLCJkaWN0aW9uYXJ5VmFsdWVzIiwiZGljdGlvbmFyeUxlbmd0aHMiLCJkaWN0aW9uYXJ5UHJldkNvZGVzIiwiY3VycmVudFNlcXVlbmNlIiwiY3VycmVudFNlcXVlbmNlTGVuZ3RoIiwiYml0c0NhY2hlZCIsImNhY2hlZERhdGEiLCJibG9ja1NpemUiLCJlc3RpbWF0ZWREZWNvZGVkU2l6ZSIsImRlY29kZWRTaXplRGVsdGEiLCJwcmV2Q29kZSIsImRlY29kZWRMZW5ndGgiLCJjdXJyZW50QnVmZmVyTGVuZ3RoIiwiaGFzUHJldiIsIk51bGxTdHJlYW0iLCJDQ0lUVEZheFN0cmVhbSIsIksiLCJFbmRPZkxpbmUiLCJFbmNvZGVkQnl0ZUFsaWduIiwiQ29sdW1ucyIsIlJvd3MiLCJFbmRPZkJsb2NrIiwiQmxhY2tJczEiLCJDQ0lUVEZheERlY29kZXIiLCJjY2l0dEVPTCIsImNjaXR0RU9GIiwidHdvRGltUGFzcyIsInR3b0RpbUhvcml6IiwidHdvRGltVmVydDAiLCJ0d29EaW1WZXJ0UjEiLCJ0d29EaW1WZXJ0TDEiLCJ0d29EaW1WZXJ0UjIiLCJ0d29EaW1WZXJ0TDIiLCJ0d29EaW1WZXJ0UjMiLCJ0d29EaW1WZXJ0TDMiLCJ0d29EaW1UYWJsZSIsIndoaXRlVGFibGUxIiwid2hpdGVUYWJsZTIiLCJibGFja1RhYmxlMSIsImJsYWNrVGFibGUyIiwiYmxhY2tUYWJsZTMiLCJlb2Jsb2NrIiwicmVhZE5leHRDaGFyIiwicmVmTGluZSIsImNvZGluZ0xpbmUiLCJyZWZQb3MiLCJibGFja1BpeGVscyIsImNvZGUzIiwiZ290RU9MIiwiX2FkZFBpeGVscyIsImNvZGluZ1BvcyIsImExIiwiX2FkZFBpeGVsc05lZyIsIl9maW5kVGFibGVDb2RlIiwibGltaXRWYWx1ZSIsIl9nZXRUd29EaW1Db2RlIiwiX2dldFdoaXRlQ29kZSIsIl9nZXRCbGFja0NvZGUiLCJfbG9va0JpdHMiLCJfZWF0Qml0cyIsIkpiaWcyU3RyZWFtIiwiamJpZzJJbWFnZSIsImdsb2JhbHNTdHJlYW0iLCJnbG9iYWxzIiwiSmJpZzJJbWFnZSIsIkNvbnRleHRDYWNoZSIsImdldENvbnRleHRzIiwiRGVjb2RpbmdDb250ZXh0IiwiZGVjb2RlciIsImNvbnRleHRzIiwiY29udGV4dENhY2hlIiwiYml0IiwicmVhZEJpdHMiLCJTZWdtZW50VHlwZXMiLCJDb2RpbmdUZW1wbGF0ZXMiLCJ5IiwiUmVmaW5lbWVudFRlbXBsYXRlcyIsImNvZGluZyIsInJlZmVyZW5jZSIsIlJldXNlZENvbnRleHRzIiwiUmVmaW5lbWVudFJldXNlZENvbnRleHRzIiwiZGVjb2RpbmdDb250ZXh0IiwiT0xEX1BJWEVMX01BU0siLCJyb3ciLCJyb3cxIiwicm93MiIsImNvbnRleHRMYWJlbCIsInBpeGVsIiwiZGVjb2RlTU1SQml0bWFwIiwidGVtcGxhdGVJbmRleCIsImF0IiwiZGVjb2RlQml0bWFwVGVtcGxhdGUwIiwidXNlc2tpcCIsInRlbXBsYXRlIiwidGVtcGxhdGVMZW5ndGgiLCJ0ZW1wbGF0ZVgiLCJ0ZW1wbGF0ZVkiLCJjaGFuZ2luZ1RlbXBsYXRlRW50cmllcyIsInJldXNlTWFzayIsIm1pblgiLCJtYXhYIiwibWluWSIsImNoYW5naW5nRW50cmllc0xlbmd0aCIsImNoYW5naW5nVGVtcGxhdGVYIiwiY2hhbmdpbmdUZW1wbGF0ZVkiLCJjaGFuZ2luZ1RlbXBsYXRlQml0Iiwic2JiX2xlZnQiLCJzYmJfdG9wIiwic2JiX3JpZ2h0Iiwid2lkdGgiLCJwc2V1ZG9QaXhlbENvbnRleHQiLCJsdHAiLCJzbHRwIiwiaTAiLCJqMCIsImNvZGluZ1RlbXBsYXRlIiwiY29kaW5nVGVtcGxhdGVMZW5ndGgiLCJjb2RpbmdUZW1wbGF0ZVgiLCJjb2RpbmdUZW1wbGF0ZVkiLCJyZWZlcmVuY2VUZW1wbGF0ZSIsInJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoIiwicmVmZXJlbmNlVGVtcGxhdGVYIiwicmVmZXJlbmNlVGVtcGxhdGVZIiwicmVmZXJlbmNlV2lkdGgiLCJyZWZlcmVuY2VCaXRtYXAiLCJyZWZlcmVuY2VIZWlnaHQiLCJodWZmbWFuIiwibmV3U3ltYm9scyIsImN1cnJlbnRIZWlnaHQiLCJzeW1ib2xDb2RlTGVuZ3RoIiwic3ltYm9scyIsInRhYmxlQjEiLCJnZXRTdGFuZGFyZFRhYmxlIiwic3ltYm9sV2lkdGhzIiwiZGVsdGFIZWlnaHQiLCJodWZmbWFuVGFibGVzIiwiZGVjb2RlSW50ZWdlciIsImN1cnJlbnRXaWR0aCIsInRvdGFsV2lkdGgiLCJmaXJzdFN5bWJvbCIsImRlbHRhV2lkdGgiLCJudW1iZXJPZkluc3RhbmNlcyIsImRlY29kZVRleHRSZWdpb24iLCJzeW1ib2xJZCIsImRlY29kZUlBSUQiLCJyZHgiLCJyZHkiLCJkZWNvZGVSZWZpbmVtZW50IiwiZGVjb2RlQml0bWFwIiwiYml0bWFwU2l6ZSIsImh1ZmZtYW5JbnB1dCIsImNvbGxlY3RpdmVCaXRtYXAiLCJyZWFkVW5jb21wcmVzc2VkQml0bWFwIiwib3JpZ2luYWxFbmQiLCJiaXRtYXBFbmQiLCJudW1iZXJPZlN5bWJvbHNEZWNvZGVkIiwieE1pbiIsInhNYXgiLCJiaXRtYXBXaWR0aCIsInN5bWJvbEJpdG1hcCIsImV4cG9ydGVkU3ltYm9scyIsImN1cnJlbnRGbGFnIiwidG90YWxTeW1ib2xzTGVuZ3RoIiwicnVuTGVuZ3RoIiwic3RyaXBUIiwiZmlyc3RTIiwiZGVsdGFUIiwiZGVsdGFGaXJzdFMiLCJjdXJyZW50UyIsImN1cnJlbnRUIiwic3RyaXBTaXplIiwiYXBwbHlSZWZpbmVtZW50IiwicmVmaW5lbWVudCIsImlucHV0U3ltYm9scyIsInN5bWJvbFdpZHRoIiwic3ltYm9sSGVpZ2h0IiwicmR3IiwicmRoIiwib2Zmc2V0VCIsIm9mZnNldFMiLCJzMiIsInN5bWJvbFJvdyIsIm1heFdpZHRoIiwidDIiLCJkZWx0YVMiLCJjb2xsZWN0aXZlV2lkdGgiLCJwYXR0ZXJucyIsInBhdHRlcm5CaXRtYXAiLCJwYXR0ZXJuV2lkdGgiLCJjb21iaW5hdGlvbk9wZXJhdG9yIiwicmVnaW9uQml0bWFwIiwibnVtYmVyT2ZQYXR0ZXJucyIsInBhdHRlcm4wIiwicGF0dGVybkhlaWdodCIsImJpdHNQZXJWYWx1ZSIsImdyYXlTY2FsZUJpdFBsYW5lcyIsIm1tcklucHV0IiwibWciLCJuZyIsInBhdHRlcm5JbmRleCIsImdyaWRPZmZzZXRYIiwiZ3JpZE9mZnNldFkiLCJyZWdpb25Sb3ciLCJwYXR0ZXJuUm93IiwicmVnaW9uWCIsInJlZ2lvblkiLCJzZWdtZW50SGVhZGVyIiwicmVhZFVpbnQzMiIsInNlZ21lbnRUeXBlIiwicGFnZUFzc29jaWF0aW9uRmllbGRTaXplIiwicmVmZXJyZWRGbGFncyIsInJlZmVycmVkVG9Db3VudCIsInJldGFpbkJpdHMiLCJyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUiLCJyZWZlcnJlZFRvIiwicmVhZFVpbnQxNiIsImdlbmVyaWNSZWdpb25JbmZvIiwicmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbiIsImdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MiLCJnZW5lcmljUmVnaW9uTW1yIiwic2VhcmNoUGF0dGVybkxlbmd0aCIsInNlYXJjaFBhdHRlcm4iLCJzZWdtZW50cyIsInJlYWRTZWdtZW50SGVhZGVyIiwiaGVhZGVyIiwiaGVpZ2h0IiwiUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGgiLCJkaWN0aW9uYXJ5IiwiZGljdGlvbmFyeUZsYWdzIiwiYXRMZW5ndGgiLCJyZWFkSW50OCIsInRleHRSZWdpb24iLCJ0ZXh0UmVnaW9uU2VnbWVudEZsYWdzIiwidGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyIsInBhdHRlcm5EaWN0aW9uYXJ5IiwicGF0dGVybkRpY3Rpb25hcnlGbGFncyIsImhhbGZ0b25lUmVnaW9uIiwiaGFsZnRvbmVSZWdpb25GbGFncyIsImdlbmVyaWNSZWdpb24iLCJwYWdlSW5mbyIsInJlc29sdXRpb25YIiwicmVzb2x1dGlvblkiLCJwYWdlU2VnbWVudEZsYWdzIiwiY2FsbGJhY2tOYW1lIiwidmlzaXRvciIsInByb2Nlc3NTZWdtZW50IiwicmVhZFNlZ21lbnRzIiwicHJvY2Vzc1NlZ21lbnRzIiwiYml0UGFja2VkIiwiaW1nRGF0YSIsIm1hc2siLCJTaW1wbGVTZWdtZW50VmlzaXRvciIsIm9uUGFnZUluZm9ybWF0aW9uIiwicm93U2l6ZSIsImRyYXdCaXRtYXAiLCJyZWdpb25JbmZvIiwibWFzazAiLCJvZmZzZXQwIiwib25JbW1lZGlhdGVHZW5lcmljUmVnaW9uIiwicmVnaW9uIiwib25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCJvblN5bWJvbERpY3Rpb25hcnkiLCJnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyIsInJlZmVycmVkU2VnbWVudHMiLCJyZWZlcnJlZFN5bWJvbHMiLCJkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5Iiwib25JbW1lZGlhdGVUZXh0UmVnaW9uIiwiZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMiLCJvbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbiIsIm9uUGF0dGVybkRpY3Rpb25hcnkiLCJkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeSIsIm9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24iLCJkZWNvZGVIYWxmdG9uZVJlZ2lvbiIsIm9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbiIsIm9uVGFibGVzIiwiY3VzdG9tVGFibGVzIiwiZGVjb2RlVGFibGVzU2VnbWVudCIsImxpbmVEYXRhIiwibGluZSIsIkh1ZmZtYW5UcmVlTm9kZSIsImJ1aWxkVHJlZSIsImRlY29kZU5vZGUiLCJodE9mZnNldCIsImxpbmVzIiwiSHVmZm1hblRhYmxlIiwiZGVjb2RlIiwiYXNzaWduUHJlZml4Q29kZXMiLCJsaW5lc0xlbmd0aCIsInByZWZpeExlbmd0aE1heCIsImhpc3RvZ3JhbSIsImN1cnJlbnRMZW5ndGgiLCJmaXJzdENvZGUiLCJjdXJyZW50Q29kZSIsImN1cnJlbnRUZW1wIiwibG93ZXN0VmFsdWUiLCJoaWdoZXN0VmFsdWUiLCJwcmVmaXhTaXplQml0cyIsInJhbmdlU2l6ZUJpdHMiLCJjdXJyZW50UmFuZ2VMb3ciLCJwcmVmaXhMZW5ndGgiLCJyYW5nZUxlbmd0aCIsInN0YW5kYXJkVGFibGVzQ2FjaGUiLCJSZWFkZXIiLCJyZWFkQml0IiwibnVtQml0cyIsImJ5dGVBbGlnbiIsInJ1bkNvZGVzVGFibGUiLCJyZXBlYXRlZExlbmd0aCIsIm51bWJlck9mUmVwZWF0cyIsInN5bWJvbElEVGFibGUiLCJjdXN0b21JbmRleCIsInRhYmxlRmlyc3RTIiwiZ2V0Q3VzdG9tSHVmZm1hblRhYmxlIiwidGFibGVEZWx0YVMiLCJ0YWJsZURlbHRhVCIsInRhYmxlRGVsdGFIZWlnaHQiLCJ0YWJsZURlbHRhV2lkdGgiLCJ0YWJsZUJpdG1hcFNpemUiLCJ0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyIsImVvZiIsImN1cnJlbnRCeXRlIiwiZW5kT2ZCbG9jayIsImxvb2tGb3JFT0ZMaW1pdCIsInBhcnNlQ2h1bmtzIiwicGFyc2VKYmlnMkNodW5rcyIsInBhcnNlSmJpZzIiLCJRZVRhYmxlIiwicWUiLCJubXBzIiwibmxwcyIsInN3aXRjaEZsYWciLCJicCIsImN4X2luZGV4IiwiY3hfbXBzIiwicWVUYWJsZUljeCIsInFlSWN4IiwiSnBlZ1N0cmVhbSIsImpwZWdPcHRpb25zIiwiZGVjb2RlVHJhbnNmb3JtIiwiY29sb3JUcmFuc2Zvcm0iLCJkZWNvZGVBcnIiLCJiaXRzUGVyQ29tcG9uZW50IiwiZGVjb2RlQXJyTGVuZ3RoIiwidHJhbnNmb3JtTmVlZGVkIiwibWF4VmFsdWUiLCJqcGVnSW1hZ2UiLCJmb3JjZVJHQiIsImlzU291cmNlUERGIiwiSnBlZ0ltYWdlIiwiZGN0WmlnWmFnIiwiZGN0Q29zMSIsImRjdFNpbjEiLCJkY3RDb3MzIiwiZGN0U2luMyIsImRjdENvczYiLCJkY3RTaW42IiwiZGN0U3FydDIiLCJkY3RTcXJ0MWQyIiwiY2hpbGRyZW4iLCJwYXJzZUROTE1hcmtlciIsIm1jdXNQZXJMaW5lIiwiZnJhbWUiLCJwcm9ncmVzc2l2ZSIsInN0YXJ0T2Zmc2V0IiwiYml0c0RhdGEiLCJiaXRzQ291bnQiLCJuZXh0Qnl0ZSIsInNjYW5MaW5lcyIsIm1heWJlU2NhbkxpbmVzIiwiYmxvY2tSb3ciLCJyZWNlaXZlIiwiZGVjb2RlSHVmZm1hbiIsImNvbXBvbmVudCIsImRpZmYiLCJyZWNlaXZlQW5kRXh0ZW5kIiwicnMiLCJ6IiwiYmxvY2tPZmZzZXQiLCJlb2JydW4iLCJzdWNjZXNzaXZlQUNTdGF0ZSIsIm9mZnNldFoiLCJzdWNjZXNzaXZlQUNOZXh0VmFsdWUiLCJtY3VSb3ciLCJtY3UiLCJtY3VDb2wiLCJibG9ja0NvbCIsImdldEJsb2NrQnVmZmVyT2Zmc2V0IiwiY29tcG9uZW50c0xlbmd0aCIsImNvbXBvbmVudHMiLCJzcGVjdHJhbFN0YXJ0IiwiZGVjb2RlRm4iLCJzdWNjZXNzaXZlUHJldiIsIm1jdUV4cGVjdGVkIiwibWN1VG9SZWFkIiwicmVzZXRJbnRlcnZhbCIsImRlY29kZUJsb2NrIiwiaCIsImRlY29kZU1jdSIsImZpbGVNYXJrZXIiLCJmaW5kTmV4dEZpbGVNYXJrZXIiLCJwYXJ0aWFsTXNnIiwicXQiLCJibG9ja0RhdGEiLCJwMCIsImJsb2NrQnVmZmVyT2Zmc2V0IiwicDUiLCJwNiIsInA3IiwidjAiLCJ2MyIsInY0IiwidjciLCJ2NSIsInY2IiwiY29sIiwiYmxvY2tzUGVyTGluZSIsImJsb2Nrc1BlckNvbHVtbiIsImNvbXB1dGF0aW9uQnVmZmVyIiwicXVhbnRpemVBbmRJbnZlcnNlIiwibWF4UG9zIiwibmV3UG9zIiwiY3VycmVudFBvcyIsImN1cnJlbnRNYXJrZXIiLCJpbnZhbGlkIiwibWFya2VyIiwibmV3TWFya2VyIiwiZG5sU2NhbkxpbmVzIiwibWN1c1BlckNvbHVtbiIsImJsb2Nrc1BlckxpbmVGb3JNY3UiLCJibG9ja3NQZXJDb2x1bW5Gb3JNY3UiLCJibG9ja3NCdWZmZXJTaXplIiwiamZpZiIsImFkb2JlIiwibnVtU09TTWFya2VycyIsInF1YW50aXphdGlvblRhYmxlcyIsImh1ZmZtYW5UYWJsZXNBQyIsImh1ZmZtYW5UYWJsZXNEQyIsImFwcERhdGEiLCJyZWFkRGF0YUJsb2NrIiwibWFqb3IiLCJtaW5vciIsImRlbnNpdHlVbml0cyIsInhEZW5zaXR5IiwieURlbnNpdHkiLCJ0aHVtYldpZHRoIiwidGh1bWJIZWlnaHQiLCJ0aHVtYkRhdGEiLCJmbGFnczAiLCJmbGFnczEiLCJ0cmFuc2Zvcm1Db2RlIiwicXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoIiwicXVhbnRpemF0aW9uVGFibGVzRW5kIiwicXVhbnRpemF0aW9uVGFibGVTcGVjIiwidGFibGVEYXRhIiwic29mU2NhbkxpbmVzIiwiY29tcG9uZW50c0NvdW50IiwibWF4SCIsIm1heFYiLCJjb21wb25lbnRJZCIsInFJZCIsInF1YW50aXphdGlvbklkIiwicXVhbnRpemF0aW9uVGFibGUiLCJwcmVwYXJlQ29tcG9uZW50cyIsImh1ZmZtYW5MZW5ndGgiLCJodWZmbWFuVGFibGVTcGVjIiwiY29kZUxlbmd0aFN1bSIsImh1ZmZtYW5WYWx1ZXMiLCJidWlsZEh1ZmZtYW5UYWJsZSIsInNlbGVjdG9yc0NvdW50IiwiY29tcG9uZW50SW5kZXgiLCJ0YWJsZVNwZWMiLCJzcGVjdHJhbEVuZCIsInN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uIiwiZGVjb2RlU2NhbiIsIm5leHRGaWxlTWFya2VyIiwiYnVpbGRDb21wb25lbnREYXRhIiwic2NhbGVYIiwic2NhbGVZIiwiX2dldExpbmVhcml6ZWRCbG9ja0RhdGEiLCJudW1Db21wb25lbnRzIiwieFNjYWxlQmxvY2tPZmZzZXQiLCJtYXNrM0xTQiIsImNvbXBvbmVudFNjYWxlWCIsImNvbXBvbmVudFNjYWxlWSIsImJsb2Nrc1BlclNjYW5saW5lIiwibGFzdENvbXBvbmVudFNjYWxlWCIsIl9jb252ZXJ0WWNjVG9SZ2IiLCJZIiwiQ2IiLCJDciIsIl9jb252ZXJ0WWNja1RvUmdiIiwiX2NvbnZlcnRZY2NrVG9DbXlrIiwiX2NvbnZlcnRDbXlrVG9SZ2IiLCJnZXREYXRhIiwicmdiRGF0YSIsImdyYXlDb2xvciIsIkpweFN0cmVhbSIsImpweEltYWdlIiwidGlsZUNvdW50IiwidGlsZUNvbXBvbmVudHMiLCJ0aWxlV2lkdGgiLCJ0aWxlSGVpZ2h0IiwidGlsZUxlZnQiLCJ0aWxlVG9wIiwic3JjUG9zaXRpb24iLCJkYXRhUG9zaXRpb24iLCJpbWdSb3dTaXplIiwidGlsZVJvd1NpemUiLCJKcHhJbWFnZSIsIlN1YmJhbmRzR2FpbkxvZzIiLCJMTCIsIkxIIiwiSEwiLCJISCIsImhlYWRlclNpemUiLCJsYm94IiwidGJveCIsImp1bXBEYXRhTGVuZ3RoIiwiY29sb3JzcGFjZSIsImhlYWRlclR5cGUiLCJwYXJzZUltYWdlUHJvcGVydGllcyIsIm5ld0J5dGUiLCJvbGRCeXRlIiwiWHNpeiIsIllzaXoiLCJYT3NpeiIsIllPc2l6IiwiQ3NpeiIsInBhcnNlQ29kZXN0cmVhbSIsImRvTm90UmVjb3ZlciIsInNpeiIsInByZWNpc2lvbiIsImlzU2lnbmVkIiwiWFJzaXoiLCJZUnNpeiIsImNhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnMiLCJjYWxjdWxhdGVUaWxlR3JpZHMiLCJxY2QiLCJzcWNkIiwic3BxY2RTaXplIiwic2NhbGFyRXhwb3VuZGVkIiwic3BxY2RzIiwic3BxY2QiLCJxY2MiLCJjcWNjIiwiY29kIiwic2NvZCIsImJsb2NrU3R5bGUiLCJwcmVjaW5jdHNTaXplcyIsInByZWNpbmN0c1NpemUiLCJQUHgiLCJQUHkiLCJ1bnN1cHBvcnRlZCIsInRpbGUiLCJpbml0aWFsaXplVGlsZSIsImJ1aWxkUGFja2V0cyIsInBhcnNlVGlsZVBhY2tldHMiLCJ0cmFuc2Zvcm1Db21wb25lbnRzIiwidGlsZXMiLCJudW1YdGlsZXMiLCJudW1ZdGlsZXMiLCJ0aWxlQ29tcG9uZW50IiwiY29kT3JDb2MiLCJwcmVjaW5jdFdpZHRoIiwiZGltZW5zaW9ucyIsInByZWNpbmN0SGVpZ2h0IiwiaXNaZXJvUmVzIiwicmVzb2x1dGlvbiIsInByZWNpbmN0V2lkdGhJblN1YmJhbmQiLCJwcmVjaW5jdEhlaWdodEluU3ViYmFuZCIsIm51bXByZWNpbmN0c3dpZGUiLCJudW1wcmVjaW5jdHNoaWdoIiwibnVtcHJlY2luY3RzIiwieGNiXyIsInljYl8iLCJjb2RlYmxvY2tXaWR0aCIsImNvZGVibG9ja0hlaWdodCIsImNieDAiLCJzdWJiYW5kIiwiY2J5MCIsImNieDEiLCJjYnkxIiwicHJlY2luY3RQYXJhbWV0ZXJzIiwiY29kZWJsb2NrcyIsInByZWNpbmN0cyIsImNvZGVibG9jayIsImNieCIsImNieSIsInRieDAiLCJ0YnkwIiwidGJ4MSIsInRieTEiLCJwaSIsInBqIiwicHJlY2luY3ROdW1iZXIiLCJwcmVjaW5jdCIsImNieE1pbiIsImNieU1pbiIsImNieE1heCIsImNieU1heCIsIm51bWNvZGVibG9ja3dpZGUiLCJudW1jb2RlYmxvY2toaWdoIiwicHJlY2luY3RDb2RlYmxvY2tzIiwic3ViYmFuZHMiLCJsYXllck51bWJlciIsInRpbGVJbmRleCIsImxheWVyc0NvdW50IiwibWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50IiwicGFja2V0IiwiY3JlYXRlUGFja2V0IiwibWF4TnVtUHJlY2luY3RzSW5MZXZlbCIsIm1heE51bVByZWNpbmN0cyIsInJlc29sdXRpb25zIiwiZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSIsInByZWNpbmN0c0l0ZXJhdGlvblNpemVzIiwicHgiLCJweSIsImRlY29tcG9zaXRpb25MZXZlbHNDb3VudCIsInNpemVJbkltYWdlU2NhbGUiLCJnZXRQcmVjaW5jdEluZGV4SWZFeGlzdCIsInBvc1giLCJweEluZGV4IiwicHJlY2luY3RJdGVyYXRpb25TaXplcyIsInBvc1kiLCJweUluZGV4Iiwic3RhcnRQcmVjaW5jdFJvd0luZGV4IiwibWluV2lkdGgiLCJtaW5IZWlnaHQiLCJtYXhOdW1XaWRlIiwibWF4TnVtSGlnaCIsInNpemVQZXJDb21wb25lbnQiLCJzaXplUGVyUmVzb2x1dGlvbiIsIm1pbldpZHRoQ3VycmVudENvbXBvbmVudCIsIm1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQiLCJtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCIsIm1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50Iiwic2NhbGUiLCJ3aWR0aEN1cnJlbnRSZXNvbHV0aW9uIiwiaGVpZ2h0Q3VycmVudFJlc29sdXRpb24iLCJibG9ja3NEaW1lbnNpb25zIiwiZ2V0QmxvY2tzRGltZW5zaW9ucyIsImJ1aWxkUHJlY2luY3RzIiwiYnVpbGRDb2RlYmxvY2tzIiwiYnNjYWxlIiwicmVzb2x1dGlvblN1YmJhbmRzIiwicHJvZ3Jlc3Npb25PcmRlciIsImJ1ZmZlclNpemUiLCJza2lwTmV4dEJpdCIsInNraXBCeXRlcyIsInNvcE1hcmtlclVzZWQiLCJlcGhNYXJrZXJVc2VkIiwicGFja2V0c0l0ZXJhdG9yIiwiYWxpZ25Ub0J5dGUiLCJza2lwTWFya2VySWZFcXVhbCIsImNvZGVibG9ja0NvbHVtbiIsImNvZGVibG9ja1JvdyIsImNvZGVibG9ja0luY2x1ZGVkIiwiZmlyc3RUaW1lSW5jbHVzaW9uIiwiaW5jbHVzaW9uVHJlZSIsInplcm9CaXRQbGFuZXNUcmVlIiwidmFsdWVSZWFkeSIsImNvZGluZ3Bhc3NlcyIsInJlYWRDb2RpbmdwYXNzZXMiLCJjb2RpbmdwYXNzZXNMb2cyIiwiY29kZWREYXRhTGVuZ3RoIiwicGFja2V0SXRlbSIsIngwIiwieTAiLCJyaWdodCIsImJvdHRvbSIsImJsb2NrV2lkdGgiLCJibG9ja0hlaWdodCIsImJpdE1vZGVsIiwiY3VycmVudENvZGluZ3Bhc3NUeXBlIiwidG90YWxMZW5ndGgiLCJkYXRhSXRlbSIsImVuY29kZWREYXRhIiwibWFnbml0dWRlIiwiYml0c0RlY29kZWQiLCJtYWduaXR1ZGVDb3JyZWN0aW9uIiwicmV2ZXJzaWJsZSIsImludGVybGVhdmUiLCJsZXZlbE9mZnNldCIsIm5iIiwiY29lZmZpY2llbnRzIiwibWIiLCJjb2RpbmdTdHlsZVBhcmFtZXRlcnMiLCJxdWFudGl6YXRpb25QYXJhbWV0ZXJzIiwiZ3VhcmRCaXRzIiwic2VnbWVudGF0aW9uU3ltYm9sVXNlZCIsInN1YmJhbmRDb2VmZmljaWVudHMiLCJtdSIsImVwc2lsb24iLCJnYWluTG9nMiIsImNvcHlDb2VmZmljaWVudHMiLCJ0b3AiLCJyZXN1bHRJbWFnZXMiLCJ0cmFuc2Zvcm1lZFRpbGVzIiwidHJhbnNmb3JtVGlsZSIsInRpbGUwIiwib3V0IiwiZm91ckNvbXBvbmVudHMiLCJ5MGl0ZW1zIiwieTFpdGVtcyIsInkyaXRlbXMiLCJ5M2l0ZW1zIiwiY29tcG9uZW50MCIsImFscGhhMDEiLCJ5MSIsInkyIiwiZyIsInFjZE9yUWNjIiwiVGFnVHJlZSIsImxldmVsc0xlbmd0aCIsImxldmVsIiwiY3VycmVudExldmVsIiwiaW5jcmVtZW50VmFsdWUiLCJuZXh0TGV2ZWwiLCJJbmNsdXNpb25UcmVlIiwic3RvcFZhbHVlIiwicHJvcGFnYXRlVmFsdWVzIiwibGV2ZWxJbmRleCIsIkJpdE1vZGVsIiwiVU5JRk9STV9DT05URVhUIiwiUlVOTEVOR1RIX0NPTlRFWFQiLCJMTEFuZExIQ29udGV4dHNMYWJlbCIsIkhMQ29udGV4dExhYmVsIiwiSEhDb250ZXh0TGFiZWwiLCJjb250ZXh0TGFiZWxUYWJsZSIsImNvZWZmaWNpZW50Q291bnQiLCJjb2VmZmljZW50c01hZ25pdHVkZSIsInplcm9CaXRQbGFuZXMiLCJzZXREZWNvZGVyIiwic2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlIiwibmVpZ2hib3JzU2lnbmlmaWNhbmNlIiwiY29sdW1uIiwicnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzIiwiY29lZmZpY2VudHNTaWduIiwicHJvY2Vzc2luZ0ZsYWdzIiwicHJvY2Vzc2VkSW52ZXJzZU1hc2siLCJwcm9jZXNzZWRNYXNrIiwiZmlyc3RNYWduaXR1ZGVCaXRNYXNrIiwiaTEiLCJkZWNpc2lvbiIsImRlY29kZVNpZ25CaXQiLCJzaWduaWZpY2FuY2UxIiwic2lnbjEiLCJzaWduMCIsImNvbnRyaWJ1dGlvbiIsImhvcml6b250YWxDb250cmlidXRpb24iLCJkZWNvZGVkIiwicnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MiLCJ3aWR0aDQiLCJpbmRleDAiLCJpbmRleE5leHQiLCJzaWduaWZpY2FuY2UiLCJydW5DbGVhbnVwUGFzcyIsIm9uZVJvd0Rvd24iLCJ0d29Sb3dzRG93biIsInRocmVlUm93c0Rvd24iLCJpTmV4dCIsImluZGV4QmFzZSIsImNoZWNrQWxsRW1wdHkiLCJhbGxFbXB0eSIsImhhc1NpZ25pZmljYW50Q29lZmZpY2VudCIsImkyIiwiY2hlY2tTZWdtZW50YXRpb25TeW1ib2wiLCJUcmFuc2Zvcm0iLCJsbCIsImoxIiwiajIiLCJsbFdpZHRoIiwibGxIZWlnaHQiLCJsbEl0ZW1zIiwiaGxfbGhfaGgiLCJidWZmZXJQYWRkaW5nIiwicm93QnVmZmVyIiwibnVtQnVmZmVycyIsImNvbEJ1ZmZlcnMiLCJjdXJyZW50QnVmZmVyIiwidSIsIklycmV2ZXJzaWJsZVRyYW5zZm9ybSIsImFscGhhIiwiYmV0YSIsImdhbW1hIiwiS18iLCJjdXJyZW50IiwiUmV2ZXJzaWJsZVRyYW5zZm9ybSIsIkFSQ0ZvdXJDaXBoZXIiLCJrZXlMZW5ndGgiLCJlbmNyeXB0QmxvY2siLCJ0bXAyIiwiaDAiLCJoMSIsImgyIiwiaDMiLCJwYWRkZWRMZW5ndGgiLCJwYWRkZWQiLCJ3Iiwicm90YXRlQXJnIiwiV29yZDY0IiwiaGlnaEludGVnZXIiLCJsb3dJbnRlZ2VyIiwiYW5kIiwid29yZCIsInhvciIsIm9yIiwic2hpZnRSaWdodCIsInBsYWNlcyIsInNoaWZ0TGVmdCIsInJvdGF0ZVJpZ2h0IiwiaGlnaCIsImxvdyIsIm5vdCIsImxvd0FkZCIsImhpZ2hBZGQiLCJjb3B5VG8iLCJjYWxjdWxhdGVTSEEyNTYiLCJyb3RyIiwiaDQiLCJoNSIsImg2IiwiaDciLCJsaXR0bGVTaWdtYVByaW1lIiwibGl0dGxlU2lnbWEiLCJ0MSIsInNpZ21hUHJpbWUiLCJzaWdtYSIsIm1haiIsImNhbGN1bGF0ZVNIQTUxMiIsIm1vZGUzODQiLCJ0bXAxIiwidG1wMyIsImNhbGN1bGF0ZVNIQTM4NCIsIk51bGxDaXBoZXIiLCJkZWNyeXB0QmxvY2siLCJfZXhwYW5kS2V5IiwiX2RlY3J5cHQiLCJzMCIsInMxIiwiczMiLCJfZW5jcnlwdCIsIl9kZWNyeXB0QmxvY2syIiwic291cmNlTGVuZ3RoIiwiaXYiLCJwbGFpbiIsIm91dHB1dExlbmd0aCIsImxhc3RCbG9jayIsInBzTGVuIiwiY2lwaGVyIiwicmNvbiIsInQzIiwidDQiLCJQREYxNyIsImFycmF5MSIsImFycmF5MiIsImNoZWNrT3duZXJQYXNzd29yZCIsImhhc2hEYXRhIiwib3duZXJWYWxpZGF0aW9uU2FsdCIsImNvbXBhcmVCeXRlQXJyYXlzIiwiY2hlY2tVc2VyUGFzc3dvcmQiLCJnZXRPd25lcktleSIsIm93bmVyS2V5U2FsdCIsImdldFVzZXJLZXkiLCJQREYyMCIsImFycmF5TGVuZ3RoIiwidXNlckJ5dGVzIiwiazEiLCJjb25jYXRBcnJheXMiLCJjYWxjdWxhdGVQREYyMEhhc2giLCJDaXBoZXJUcmFuc2Zvcm0iLCJjcmVhdGVTdHJlYW0iLCJkZWNyeXB0U3RyaW5nIiwiZW5jcnlwdFN0cmluZyIsInN0ckxlbiIsInBhZCIsImNyeXB0byIsImJ1ZiIsIkNpcGhlclRyYW5zZm9ybUZhY3RvcnkiLCJkZWZhdWx0UGFzc3dvcmRCeXRlcyIsInBhc3N3b3JkTGVuZ3RoIiwicmV2aXNpb24iLCJwZGZBbGdvcml0aG0iLCJoYXNoRGF0YVNpemUiLCJvd25lclBhc3N3b3JkIiwia2V5TGVuZ3RoSW5CeXRlcyIsImVuY3J5cHRpb25LZXkiLCJjaGVja0RhdGEiLCJkZXJpdmVkS2V5IiwidXNlclBhc3N3b3JkIiwiaWRlbnRpdHlOYW1lIiwiYWxnb3JpdGhtIiwiY2ZEaWN0Iiwic3RyZWFtQ3J5cHRvTmFtZSIsImhhbmRsZXJEaWN0IiwiZW5jcnlwdE1ldGFkYXRhIiwiZmlsZUlkQnl0ZXMiLCJ1dGY4U3RyaW5nVG9TdHJpbmciLCJwYXNzd29yZEJ5dGVzIiwicHJlcGFyZUtleURhdGEiLCJ1Qnl0ZXMiLCJ1c2VyVmFsaWRhdGlvblNhbHQiLCJ1c2VyS2V5U2FsdCIsIm93bmVyRW5jcnlwdGlvbiIsInVzZXJFbmNyeXB0aW9uIiwicGVybXMiLCJjcmVhdGVFbmNyeXB0aW9uS2V5MjAiLCJkZWNvZGVkUGFzc3dvcmQiLCJkZWNvZGVVc2VyUGFzc3dvcmQiLCJjZiIsImNyeXB0RmlsdGVyIiwiY2ZtIiwiYnVpbGRPYmplY3RLZXkiLCJjcmVhdGVDaXBoZXJUcmFuc2Zvcm0iLCJidWlsZENpcGhlckNvbnN0cnVjdG9yIiwiY2lwaGVyQ29uc3RydWN0b3IiLCJDT01QT05FTlRTIiwieFJhdGlvIiwidzEiLCJ5UmF0aW8iLCJuZXdJbmRleCIsInhTY2FsZWQiLCJ3MVNjYW5saW5lIiwib2xkSW5kZXgiLCJnZXRSZ2IiLCJyZ2IiLCJnZXRSZ2JJdGVtIiwiZ2V0UmdiQnVmZmVyIiwiZ2V0T3V0cHV0TGVuZ3RoIiwiaXNQYXNzdGhyb3VnaCIsImlzRGVmYXVsdERlY29kZSIsImZpbGxSZ2IiLCJvcmlnaW5hbFdpZHRoIiwibnVtQ29tcG9uZW50Q29sb3JzIiwibmVlZHNSZXNpemluZyIsIm9yaWdpbmFsSGVpZ2h0IiwiYWxsQ29sb3JzIiwiYnBjIiwiY29sb3JNYXAiLCJkZXN0UG9zIiwiY29tcHMiLCJyZ2JQb3MiLCJyZXNpemVSZ2JJbWFnZSIsImNzUmVmIiwiY3NOYW1lIiwibG9jYWxDb2xvclNwYWNlQ2FjaGUiLCJsb2NhbENvbG9yU3BhY2UiLCJwYXJzZWRDb2xvclNwYWNlIiwiY2FjaGVkQ29sb3JTcGFjZSIsImNzIiwiY29sb3JTcGFjZXMiLCJyZXNvdXJjZXNDUyIsIndoaXRlUG9pbnQiLCJibGFja1BvaW50IiwibWF0cml4IiwibnVtQ29tcHMiLCJhbHQiLCJhbHRDUyIsImJhc2VDUyIsImhpVmFsIiwidGludEZuIiwicGRmRnVuY3Rpb25GYWN0b3J5IiwidG1wQnVmIiwiYmFzZU51bUNvbXBzIiwidXNlc1plcm9Ub09uZVJhbmdlIiwiYmFzZUJ1ZiIsInNjYWxlZCIsInRpbnRlZCIsIm91dHB1dERlbHRhIiwibG9va3VwUG9zIiwiZGVjb2RlTWFwIiwiRGV2aWNlQ215a0NTIiwiY29udmVydFRvUmdiIiwiQ2FsR3JheUNTIiwiQUciLCJMIiwiQ2FsUkdCQ1MiLCJCUkFERk9SRF9TQ0FMRV9NQVRSSVgiLCJCUkFERk9SRF9TQ0FMRV9JTlZFUlNFX01BVFJJWCIsIlNSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYIiwiRkxBVF9XSElURVBPSU5UX01BVFJJWCIsInRlbXBOb3JtYWxpemVNYXRyaXgiLCJ0ZW1wQ29udmVydE1hdHJpeDEiLCJ0ZW1wQ29udmVydE1hdHJpeDIiLCJERUNPREVfTF9DT05TVEFOVCIsIkxNUyIsInNvdXJjZVdoaXRlUG9pbnQiLCJENjVYIiwiRDY1WSIsIkQ2NVoiLCJhZGp1c3RUb1JhbmdlIiwiZGVjb2RlTCIsInNvdXJjZUJsYWNrUG9pbnQiLCJYWVpfRmxhdCIsInplcm9EZWNvZGVMIiwiWF9EU1QiLCJYX1NSQyIsIllfRFNUIiwiWV9TUkMiLCJaX0RTVCIsIlpfU1JDIiwiWF9TY2FsZSIsIlhfT2Zmc2V0IiwiWV9TY2FsZSIsIllfT2Zmc2V0IiwiWl9TY2FsZSIsIlpfT2Zmc2V0IiwiWFlaX0luIiwibWF0cml4UHJvZHVjdCIsIkxNU19GbGF0IiwiY29udmVydFRvRmxhdCIsIkxNU19ENjUiLCJjb252ZXJ0VG9ENjUiLCJBR1IiLCJCR0ciLCJDR0IiLCJYIiwiWiIsIlhZWiIsIm5vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQiLCJYWVpfQmxhY2siLCJjb21wZW5zYXRlQmxhY2tQb2ludCIsIlhZWl9ENjUiLCJub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUiLCJTUkdCIiwic1JHQlRyYW5zZmVyRnVuY3Rpb24iLCJYVyIsIllXIiwiWlciLCJYQiIsIllCIiwiWkIiLCJMYWJDUyIsImxvdzIiLCJMcyIsImFzIiwiYnMiLCJtYXhWYWwiLCJNIiwiTiIsImZuX2ciLCJnZXRCeU5hbWUiLCJnZXRCeVJlZiIsIm9ubHlSZWZzIiwic2hvdWxkQ2FjaGUiLCJwYWdlSW5kZXhTZXQiLCJHbG9iYWxJbWFnZUNhY2hlIiwiYWRkUGFnZUluZGV4Iiwic2V0RGF0YSIsIm9ubHlEYXRhIiwicGFyYW1ldGVycyIsImZpZWxkVHlwZSIsInF1YWRQb2ludHMiLCJxdWFkUG9pbnRzTGlzdHMiLCJhbm5vdGF0aW9uRmxhZ3MiLCJib3JkZXJTdHlsZSIsImNvbnRlbnRzIiwiaGFzQXBwZWFyYW5jZSIsIm1vZGlmaWNhdGlvbkRhdGUiLCJfaGFzRmxhZyIsIl9pc1ZpZXdhYmxlIiwiX2lzUHJpbnRhYmxlIiwic2V0Q29udGVudHMiLCJzZXRNb2RpZmljYXRpb25EYXRlIiwic2V0RmxhZ3MiLCJoYXNGbGFnIiwic2V0UmVjdGFuZ2xlIiwic2V0Q29sb3IiLCJzZXRCb3JkZXJTdHlsZSIsImRpY3RUeXBlIiwic2V0QXBwZWFyYW5jZSIsImFwcGVhcmFuY2VTdGF0ZXMiLCJub3JtYWxBcHBlYXJhbmNlU3RhdGUiLCJhcHBlYXJhbmNlIiwiYXBwZWFyYW5jZURpY3QiLCJiYm94IiwiZ2V0VHJhbnNmb3JtTWF0cml4Iiwic2V0V2lkdGgiLCJtYXhIZWlnaHQiLCJzZXRTdHlsZSIsInNldERhc2hBcnJheSIsImRhc2hBcnJheSIsImFsbFplcm9zIiwidmFsaWROdW1iZXIiLCJzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzIiwic2V0VmVydGljYWxDb3JuZXJSYWRpdXMiLCJyYXdJUlQiLCJydCIsInNldENyZWF0aW9uRGF0ZSIsImZpZWxkVmFsdWUiLCJfY29uc3RydWN0RmllbGROYW1lIiwiZmllbGROYW1lIiwibG9vcERpY3QiLCJfZGVjb2RlRm9ybVZhbHVlIiwiZm9ybVZhbHVlIiwiaGFzRmllbGRGbGFnIiwiZXZhbHVhdG9yIiwiQVAiLCJvcmlnaW5hbFRyYW5zZm9ybSIsIm5ld1RyYW5zZm9ybSIsImJ1ZmZlck9yaWdpbmFsIiwid3JpdGVEaWN0IiwiYnVmZmVyTmV3IiwiaXNQYXNzd29yZCIsImRlZmF1bHRQYWRkaW5nIiwiaFBhZGRpbmciLCJ0b3RhbEhlaWdodCIsImZvbnRJbmZvIiwiZm9udFNpemUiLCJkZXNjZW50IiwidlBhZGRpbmciLCJkZWZhdWx0QXBwZWFyYW5jZSIsImFsaWdubWVudCIsImVzY2FwZVN0cmluZyIsInJlbmRlcmVkVGV4dCIsImluaXRpYWxTdGF0ZSIsImZvbnROYW1lIiwiY2xvbmUiLCJfY29tcHV0ZUZvbnRTaXplIiwiZW0iLCJjYXBIZWlnaHQiLCJmb250UmVnZXgiLCJfcmVuZGVyVGV4dCIsImdseXBocyIsImdseXBoIiwibWF4aW11bUxlbmd0aCIsIl9nZXRDb21iQXBwZWFyYW5jZSIsImNvbWJXaWR0aCIsInJlbmRlcmVkQ29tYiIsIl9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlIiwidGV4dCIsInBhZGRpbmciLCJfc3BsaXRMaW5lIiwid2hpdGVzcGFjZSIsImxhc3RTcGFjZVBvcyIsInN0YXJ0Q2h1bmsiLCJjaGFyV2lkdGgiLCJzYXZlZEFwcGVhcmFuY2UiLCJkZWZhdWx0VmFsdWUiLCJwYXJlbnRCdWZmZXIiLCJwYXJlbnRUcmFuc2Zvcm0iLCJfcHJvY2Vzc0NoZWNrQm94IiwiY3VzdG9tQXBwZWFyYW5jZSIsIm5vcm1hbEFwcGVhcmFuY2UiLCJleHBvcnRWYWx1ZXMiLCJfcHJvY2Vzc1JhZGlvQnV0dG9uIiwiZmllbGRQYXJlbnQiLCJmaWVsZFBhcmVudFZhbHVlIiwiX3Byb2Nlc3NQdXNoQnV0dG9uIiwib3B0aW9uIiwiaXNPcHRpb25BcnJheSIsImV4cG9ydFZhbHVlIiwiZGlzcGxheVZhbHVlIiwiREVGQVVMVF9JQ09OX1NJWkUiLCJnZXRRdWFkUG9pbnRzIiwicGFyZW50SXRlbSIsInBhcmVudFN1YnR5cGUiLCJyYXdQYXJlbnQiLCJwYXJlbnRGbGFncyIsInJhd1ZlcnRpY2VzIiwib3JpZ2luYWxJbmtMaXN0cyIsIlF1ZXVlT3B0aW1pemVyIiwicGF0dGVybiIsImNoZWNrRm4iLCJpdGVyYXRlRm4iLCJwcm9jZXNzRm4iLCJpRmlyc3RQSU1YTyIsImlGaXJzdFNhdmUiLCJhcmdzQXJyYXkiLCJpbWFnZU1hc2siLCJmbkFycmF5IiwiSW5pdGlhbFN0YXRlIiwiYWRkU3RhdGUiLCJNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0siLCJNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0siLCJNQVhfV0lEVEgiLCJJTUFHRV9QQURESU5HIiwiY3VyciIsImlGaXJzdFRyYW5zZm9ybSIsImlGaXJzdFBJSVhPIiwibWF4TGluZUhlaWdodCIsImN1cnJlbnRYIiwiY3VycmVudFkiLCJpbWciLCJpbWdXaWR0aCIsImltZ0hlaWdodCIsImRhdGFPZmZzZXQiLCJNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLIiwiTUFYX0lNQUdFU19JTl9NQVNLU19CTE9DSyIsIk1BWF9TQU1FX0lNQUdFU19JTl9NQVNLU19CTE9DSyIsImhhbmRsZVBhaW50U29saWRDb2xvckltYWdlTWFzayIsImlzU2FtZUltYWdlIiwiZmlyc3RQSU1YT0FyZzAiLCJmaXJzdFRyYW5zZm9ybUFyZzAiLCJmaXJzdFRyYW5zZm9ybUFyZzEiLCJmaXJzdFRyYW5zZm9ybUFyZzIiLCJmaXJzdFRyYW5zZm9ybUFyZzMiLCJpVHJhbnNmb3JtIiwiaVBJTVhPIiwidHJhbnNmb3JtQXJncyIsInBvc2l0aW9ucyIsImltYWdlcyIsIm1hc2tQYXJhbXMiLCJpRmlyc3RQSVhPIiwiZmlyc3RQSVhPQXJnMCIsIk1JTl9JTUFHRVNfSU5fQkxPQ0siLCJNQVhfSU1BR0VTX0lOX0JMT0NLIiwiaUZpcnN0U2V0Rm9udCIsImZpcnN0U2V0Rm9udEFyZzAiLCJmaXJzdFNldEZvbnRBcmcxIiwiTUlOX0NIQVJTX0lOX0JMT0NLIiwiTUFYX0NIQVJTX0lOX0JMT0NLIiwiaUZpcnN0QmVnaW5UZXh0IiwiaUZpcnN0U2V0VGV4dE1hdHJpeCIsImlGaXJzdFNob3dUZXh0IiwiaUZpcnN0RW5kVGV4dCIsImlGaXJzdCIsImlFbmRUZXh0IiwiaUN1cnIiLCJfb3B0aW1pemUiLCJOdWxsT3B0aW1pemVyIiwiT3BlcmF0b3JMaXN0IiwiQ0hVTktfU0laRSIsIkNIVU5LX1NJWkVfQUJPVVQiLCJzdHJlYW1TaW5rIiwiYWRkT3AiLCJhZGREZXBlbmRlbmN5IiwiYWRkRGVwZW5kZW5jaWVzIiwiYWRkT3BMaXN0IiwiZ2V0SVIiLCJ0cmFuc2ZlcnMiLCJ3cml0ZVZhbHVlIiwicm91bmRlZFZhbHVlIiwid3JpdGVBcnJheSIsIm51bWJlclRvU3RyaW5nIiwid3JpdGVTdHJlYW0iLCJ0aW1lIiwibWQ1QnVmZmVyIiwiZmlsZXNpemUiLCJtZDVCdWZmZXJMZW4iLCJ3cml0ZVN0cmluZyIsIm5ld1hyZWYiLCJyZWZGb3JYcmVmVGFibGUiLCJvcmlnaW5hbERhdGEiLCJiYXNlT2Zmc2V0IiwieHJlZlRhYmxlRGF0YSIsImluZGV4ZXMiLCJtYXhPZmZzZXQiLCJtZDUiLCJjb21wdXRlTUQ1Iiwib2Zmc2V0U2l6ZSIsInNpemVzIiwic3RydWN0U2l6ZSIsInRhYmxlTGVuZ3RoIiwiYnVmZmVyTGVuIiwiZm9vdGVyIiwid3JpdGVJbnQiLCJEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnMiLCJQYXR0ZXJuVHlwZSIsIlRJTElORyIsIlNIQURJTkciLCJkZWZlcnJlZCIsInBhcnNpbmdBcnJheSIsIm1heWJlQk0iLCJub3JtYWxpemVCbGVuZE1vZGUiLCJUaW1lU2xvdE1hbmFnZXIiLCJuZXdPcHRpb25zIiwibmV3RXZhbHVhdG9yIiwiaGFzQmxlbmRNb2RlcyIsIm5vZGVzIiwiZ3JhcGhpY1N0YXRlcyIsImdyYXBoaWNTdGF0ZSIsImJtIiwieE9iamVjdHMiLCJ4T2JqZWN0IiwieFJlc291cmNlcyIsInJlYWRhYmxlU3RyZWFtIiwicHVtcCIsInhvYmoiLCJvcHRpb25hbENvbnRlbnQiLCJncm91cE9wdGlvbnMiLCJpc29sYXRlZCIsImtub2Nrb3V0IiwiZ3JvdXBTdWJ0eXBlIiwiY29sb3JTcGFjZSIsIl9zZW5kSW1nRGF0YSIsImNhY2hlR2xvYmFsbHkiLCJpc0lubGluZSIsImltYWdlIiwiaW1hZ2VSZWYiLCJiaXRTdHJpZGVMZW5ndGgiLCJpbWdBcnJheSIsImltYWdlSXNGcm9tRGVjb2RlU3RyZWFtIiwiaW52ZXJzZURlY29kZSIsImxvY2FsSW1hZ2VDYWNoZSIsInNvZnRNYXNrIiwiU01BTExfSU1BR0VfRElNRU5TSU9OUyIsImltYWdlT2JqIiwicmVzIiwiUERGSW1hZ2UiLCJoYW5kbGVTTWFzayIsInNtYXNrQ29udGVudCIsInNtYXNrT3B0aW9ucyIsImJhY2tkcm9wIiwidHJhbnNmZXJPYmoiLCJpc1BERkZ1bmN0aW9uIiwidHJhbnNmZXJGbiIsInRyYW5zZmVyTWFwIiwic3RhdGVNYW5hZ2VyIiwiaGFuZGxlVHJhbnNmZXJGdW5jdGlvbiIsInRyYW5zZmVyQXJyYXkiLCJ0cmFuc2Zlck1hcHMiLCJudW1GbnMiLCJudW1FZmZlY3RmdWxGbnMiLCJoYW5kbGVUaWxpbmdUeXBlIiwidGlsaW5nT3BMaXN0IiwicGF0dGVyblJlc291cmNlcyIsInBhdHRlcm5EaWN0IiwiaGFuZGxlU2V0Rm9udCIsImZvbnRBcmdzIiwidHJhbnNsYXRlZCIsImxvYWRlZE5hbWUiLCJleHRyYVByb3BlcnRpZXMiLCJoYW5kbGVUZXh0IiwiaXNBZGRUb1BhdGhTZXQiLCJQYXJ0aWFsRXZhbHVhdG9yIiwiZW5zdXJlU3RhdGVGb250IiwiZ1N0YXRlUmVmIiwiZ1N0YXRlIiwiaXNTaW1wbGVHU3RhdGUiLCJnU3RhdGVPYmoiLCJnU3RhdGVLZXlzIiwibG9jYWxHU3RhdGVDYWNoZSIsImxvYWRGb250IiwiZXJyb3JGb250IiwiZm9udFJlZiIsImZvbnRSZXMiLCJmb250Q2FwYWJpbGl0eSIsInByZUV2YWx1YXRlZEZvbnQiLCJmb250UmVmSXNSZWYiLCJmb250SUQiLCJmb250QWxpYXNlcyIsImFsaWFzRm9udFJlZiIsInRyYW5zbGF0ZWRQcm9taXNlIiwieHJlZkZvbnRTdGF0cyIsImZvbnRGaWxlMyIsImZvbnRUeXBlIiwiZ2V0Rm9udFR5cGUiLCJidWlsZFBhdGgiLCJwYXJzaW5nVGV4dCIsImxhc3RJbmRleCIsIm9wQXJncyIsInBhcnNlQ29sb3JTcGFjZSIsInBhdHRlcm5OYW1lIiwidHlwZU51bSIsInNoYWRpbmciLCJQYXR0ZXJuIiwiY29udGVudFByb3BlcnRpZXMiLCJvcHRpb25hbENvbnRlbnRUeXBlIiwib3B0aW9uYWxDb250ZW50R3JvdXBzIiwiZ3JvdXBJZHMiLCJvY2ciLCJleHByZXNzaW9uIiwicG9saWN5IiwieG9ianMiLCJwcmVwcm9jZXNzb3IiLCJ0aW1lU2xvdE1hbmFnZXIiLCJwcm9taXNlQm9keSIsIm9wZXJhdGlvbiIsImxvY2FsSW1hZ2UiLCJyZXNvbHZlWE9iamVjdCIsImdsb2JhbEltYWdlIiwiY29tYmluZWRHbHlwaHMiLCJhcnJMZW5ndGgiLCJhcnJJdGVtIiwic2hhZGluZ1JlcyIsInBhdHRlcm5JUiIsImxvY2FsR1N0YXRlT2JqIiwiZXh0R1N0YXRlIiwiY2xvc2VQZW5kaW5nUmVzdG9yZU9QUyIsInNlZW5TdHlsZXMiLCJnZXRUZXh0Q29udGVudCIsIldoaXRlc3BhY2VSZWdleHAiLCJ0ZXh0Q29udGVudCIsInN0eWxlcyIsInRleHRDb250ZW50SXRlbSIsImluaXRpYWxpemVkIiwidmVydGljYWwiLCJsYXN0QWR2YW5jZVdpZHRoIiwibGFzdEFkdmFuY2VIZWlnaHQiLCJ0ZXh0QWR2YW5jZVNjYWxlIiwic3BhY2VXaWR0aCIsImZha2VTcGFjZU1pbiIsImZha2VNdWx0aVNwYWNlTWluIiwiZmFrZU11bHRpU3BhY2VNYXgiLCJ0ZXh0UnVuQnJlYWtBbGxvd2VkIiwiU1BBQ0VfRkFDVE9SIiwiTVVMVElfU1BBQ0VfRkFDVE9SIiwiTVVMVElfU1BBQ0VfRkFDVE9SX01BWCIsImVtcHR5WE9iamVjdENhY2hlIiwiZW1wdHlHU3RhdGVDYWNoZSIsInRleHRTdGF0ZSIsImZvbnRGYW1pbHkiLCJhc2NlbnQiLCJ0c20iLCJnbHlwaEhlaWdodCIsInRybSIsInNjYWxlTGluZVgiLCJzY2FsZUN0bVgiLCJ0ZXh0Q2h1bmsiLCJiaWRpUmVzdWx0IiwiYmlkaSIsInJlcGxhY2VXaGl0ZXNwYWNlIiwiZGlyIiwiZW5zdXJlVGV4dENvbnRlbnRJdGVtIiwiZ2x5cGhXaWR0aCIsImdseXBoVW5pY29kZSIsIk5vcm1hbGl6ZWRVbmljb2RlcyIsInJldmVyc2VJZlJ0bCIsImNoYXJTcGFjaW5nIiwid29yZFNwYWNpbmciLCJhZGRGYWtlU3BhY2VzIiwidHgiLCJ0eSIsIncwIiwiZmFrZVNwYWNlcyIsInJ1bkJpZGlUcmFuc2Zvcm0iLCJlbnF1ZXVlQ2h1bmsiLCJmb250TmFtZUFyZyIsImZvbnRTaXplQXJnIiwiZmx1c2hUZXh0Q29udGVudEl0ZW0iLCJpc1NhbWVUZXh0TGluZSIsImFkdmFuY2UiLCJidWlsZFRleHRDb250ZW50SXRlbSIsImJyZWFrVGV4dFJ1biIsImN1cnJlbnRTdGF0ZSIsInhPYmpTdGF0ZU1hbmFnZXIiLCJzaW5rV3JhcHBlciIsImVucXVldWVJbnZva2VkIiwiZ1N0YXRlRm9udCIsInJlc29sdmVHU3RhdGUiLCJleHRyYWN0RGF0YVN0cnVjdHVyZXMiLCJ0b1VuaWNvZGUiLCJiYXNlRGljdCIsInRvVW5pY29kZVByb21pc2UiLCJjaWRTeXN0ZW1JbmZvIiwicmVnaXN0cnkiLCJvcmRlcmluZyIsInN1cHBsZW1lbnQiLCJjaWRUb0dpZE1hcCIsImNpZFRvR2lkQnl0ZXMiLCJkaWZmZXJlbmNlcyIsImJhc2VFbmNvZGluZ05hbWUiLCJlbmNvZGluZyIsImRpZmZFbmNvZGluZyIsImdldEVuY29kaW5nIiwiaXNTeW1ib2xpY0ZvbnQiLCJGb250RmxhZ3MiLCJpc05vbnN5bWJvbGljRm9udCIsInJlYWRUb1VuaWNvZGUiLCJidWlsdFRvVW5pY29kZSIsIl9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUiLCJmb3JjZUdseXBocyIsImdseXBoTmFtZSIsImdseXBoc1VuaWNvZGVNYXAiLCJjb2RlU3RyIiwidW5pY29kZSIsImdldFVuaWNvZGVGb3JHbHlwaCIsImJhc2VFbmNvZGluZyIsImJ1aWxkVG9Vbmljb2RlIiwidWNzMkNNYXBOYW1lIiwiZmV0Y2hCdWlsdEluQ01hcCIsInVzZUNNYXAiLCJjTWFwIiwiY2lkIiwidWNzMiIsInVjczJDTWFwIiwiY21hcE9iaiIsImNtYXAiLCJ3MiIsInJlYWRDaWRUb0dpZE1hcCIsImdseXBoc0RhdGEiLCJnbHlwaElEIiwiZXh0cmFjdFdpZHRocyIsImdseXBoc1dpZHRocyIsImRlZmF1bHRXaWR0aCIsImdseXBoc1ZNZXRyaWNzIiwid2lkdGhzIiwidm1ldHJpY3MiLCJkZWZhdWx0Vk1ldHJpY3MiLCJ2bWV0cmljIiwiZmlyc3RDaGFyIiwicGFyc2VGbG9hdCIsImJhc2VGb250TmFtZSIsIm1ldHJpY3MiLCJpc01vbm9zcGFjZSIsImZpcnN0V2lkdGgiLCJpc1NlcmlmRm9udCIsImZvbnROYW1lV29TdHlsZSIsImdldEJhc2VGb250TWV0cmljcyIsIm1vbm9zcGFjZSIsInN0ZEZvbnRNYXAiLCJsb29rdXBOYW1lIiwiTWV0cmljcyIsImdseXBoV2lkdGhzIiwiYnVpbGRDaGFyQ29kZVRvV2lkdGgiLCJjaGFyQ29kZSIsIndpZHRoc0J5R2x5cGhOYW1lIiwicHJlRXZhbHVhdGVGb250IiwiY29tcG9zaXRlIiwiZGYiLCJkaWZmTGVuZ3RoIiwiZGlmZkJ1ZiIsImRpZmZFbnRyeSIsImxhc3RDaGFyIiwidWludDhhcnJheSIsInRyYW5zbGF0ZUZvbnQiLCJtYXhDaGFySW5kZXgiLCJuZXdQcm9wZXJ0aWVzIiwiYmFzZUZvbnQiLCJmb250TmFtZVN0ciIsImJhc2VGb250U3RyIiwiZm9udEZpbGUiLCJsZW5ndGgxIiwibGVuZ3RoMiIsImxlbmd0aDMiLCJmaXhlZFBpdGNoIiwiZm9udE1hdHJpeCIsInhIZWlnaHQiLCJpdGFsaWNBbmdsZSIsImlzVHlwZTNGb250IiwiY2lkRW5jb2RpbmciLCJjTWFwUHJvbWlzZSIsImFjY2VudCIsInNlbmQiLCJmYWxsYmFjayIsImxvYWRUeXBlM0RhdGEiLCJ0eXBlM09wdGlvbnMiLCJ0eXBlM0V2YWx1YXRvciIsInR5cGUzRGVwZW5kZW5jaWVzIiwibG9hZENoYXJQcm9jc1Byb21pc2UiLCJjaGFyUHJvY3MiLCJmb250UmVzb3VyY2VzIiwiY2hhclByb2NPcGVyYXRvckxpc3QiLCJnbHlwaFN0cmVhbSIsImR1bW15T3BlcmF0b3JMaXN0Iiwib2xkIiwic2V0VGV4dExpbmVNYXRyaXgiLCJ0cmFuc2xhdGVUZXh0TWF0cml4IiwidHJhbnNsYXRlVGV4dExpbmVNYXRyaXgiLCJjYWxjVGV4dExpbmVNYXRyaXhBZHZhbmNlIiwidHhEaWZmIiwidHlEaWZmIiwiZGVub21pbmF0b3IiLCJjYWxjUmVuZGVyTWF0cml4IiwiZ2V0T1BNYXAiLCJudW1BcmdzIiwidmFyaWFibGVBcmdzIiwiRXZhbHVhdG9yUHJlcHJvY2Vzc29yIiwiY21kIiwib3BTcGVjIiwiYXJnc0xlbmd0aCIsIm5vblByb2Nlc3NlZEFyZ3MiLCJwcmVwcm9jZXNzQ29tbWFuZCIsIkJVSUxUX0lOX0NNQVBTIiwiTUFYX01BUF9SQU5HRSIsImJ1aWx0SW5DTWFwIiwiYWRkQ29kZXNwYWNlUmFuZ2UiLCJtYXBDaWRSYW5nZSIsImRzdExvdyIsIm1hcEJmUmFuZ2UiLCJtYXBCZlJhbmdlVG9BcnJheSIsIm1hcE9uZSIsImNvbnRhaW5zIiwiY2hhckNvZGVPZiIsInJlYWRDaGFyQ29kZSIsImNvZGVzcGFjZVJhbmdlcyIsIm5uIiwiY29kZXNwYWNlUmFuZ2UiLCJCaW5hcnlDTWFwUmVhZGVyIiwiTUFYX05VTV9TSVpFIiwiTUFYX0VOQ09ERURfTlVNX1NJWkUiLCJCaW5hcnlDTWFwU3RyZWFtIiwicmVhZEJ5dGUiLCJyZWFkTnVtYmVyIiwicmVhZFNpZ25lZCIsInJlYWRIZXgiLCJyZWFkSGV4TnVtYmVyIiwic3RhY2siLCJzcCIsInJlYWRIZXhTaWduZWQiLCJyZWFkU3RyaW5nIiwiZGF0YVNpemUiLCJ1Y3MyRGF0YVNpemUiLCJzdWJpdGVtc0NvdW50IiwiYWRkSGV4IiwiaGV4VG9JbnQiLCJpbmNIZXgiLCJoZXhUb1N0ciIsImV4dGVuZCIsIkNNYXBGYWN0b3J5IiwiZXhwZWN0U3RyaW5nIiwic3RyVG9JbnQiLCJkc3QiLCJleHBlY3RJbnQiLCJwYXJzZVdNb2RlIiwicGFyc2VDTWFwTmFtZSIsImVtYmVkZGVkVXNlQ01hcCIsInBhcnNlQ29kZXNwYWNlUmFuZ2UiLCJwYXJzZUJmQ2hhciIsInBhcnNlQ2lkQ2hhciIsInBhcnNlQmZSYW5nZSIsInBhcnNlQ2lkUmFuZ2UiLCJleHRlbmRDTWFwIiwidXNlQ29kZXNwYWNlUmFuZ2VzIiwiY01hcERhdGEiLCJjb21wcmVzc2lvblR5cGUiLCJwYXJzZUNNYXAiLCJjcmVhdGVCdWlsdEluQ01hcCIsInBhcnNlZENNYXAiLCJQUklWQVRFX1VTRV9BUkVBUyIsIlBERl9HTFlQSF9TUEFDRV9VTklUUyIsIlNFQUNfQU5BTFlTSVNfRU5BQkxFRCIsIkVYUE9SVF9EQVRBX1BST1BFUlRJRVMiLCJFWFBPUlRfREFUQV9FWFRSQV9QUk9QRVJUSUVTIiwiRml4ZWRQaXRjaCIsIlNlcmlmIiwiU3ltYm9saWMiLCJTY3JpcHQiLCJOb25zeW1ib2xpYyIsIkl0YWxpYyIsIkFsbENhcCIsIlNtYWxsQ2FwIiwiRm9yY2VCb2xkIiwiTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nIiwiYnVpbHRJbkVuY29kaW5nIiwiR2x5cGgiLCJUb1VuaWNvZGVNYXAiLCJhbWVuZCIsIklkZW50aXR5VG9Vbmljb2RlTWFwIiwiT3BlblR5cGVGaWxlQnVpbGRlciIsIm1heFBvd2VyMiIsInNlYXJjaFJhbmdlIiwicmFuZ2VTaGlmdCIsImVudHJ5U2l6ZSIsIk9URl9IRUFERVJfU0laRSIsIk9URl9UQUJMRV9FTlRSWV9TSVpFIiwidG9BcnJheSIsInNmbnQiLCJ0YWJsZXMiLCJ0YWJsZXNOYW1lcyIsIm51bVRhYmxlcyIsInRhYmxlT2Zmc2V0cyIsIndyaXRlRGF0YSIsInN0cmluZzMyIiwid3JpdGVJbnQxNiIsInRhYmxlTmFtZSIsImNoZWNrc3VtIiwicXVhZCIsIndyaXRlSW50MzIiLCJhZGRUYWJsZSIsIkZvbnQiLCJmYWxsYmFja05hbWUiLCJnZXRGb250RmlsZVR5cGUiLCJjZmYiLCJhZGp1c3RXaWR0aHMiLCJpc1RydWVUeXBlRmlsZSIsImlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZSIsImZpbGVUeXBlIiwiaXNPcGVuVHlwZUZpbGUiLCJpc1R5cGUxRmlsZSIsImlzQ0ZGRmlsZSIsImZpbGVTdWJ0eXBlIiwidG9Gb250Q2hhciIsIm5ld01hcCIsInByaXZhdGVVc2VBcmVhSW5kZXgiLCJuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlIiwicHJpdmF0ZVVzZU9mZmV0RW5kIiwib3JpZ2luYWxDaGFyQ29kZSIsImdseXBoSWQiLCJjaGFyQ29kZVRvR2x5cGhJZCIsImhhc0dseXBoIiwiZm9udENoYXJDb2RlIiwiY29kZUluZGljZXMiLCJnZXRSYW5nZXMiLCJzdHJpbmcxNiIsImJtcExlbmd0aCIsInRyYWlsaW5nUmFuZ2VzQ291bnQiLCJzZWdDb3VudCIsInN0YXJ0Q291bnQiLCJlbmRDb3VudCIsImlkRGVsdGFzIiwiaWRSYW5nZU9mZnNldHMiLCJnbHlwaHNJZHMiLCJjb250aWd1b3VzIiwic3RhcnRDb2RlIiwiZm9ybWF0MzE0IiwiZm9ybWF0MzEwMTIiLCJoZWFkZXIzMTAxMiIsIm9zMiIsInNlbGVjdGlvbiIsInVzV2luQXNjZW50Iiwib3ZlcnJpZGUiLCJ1bml0c1BlckVtIiwieU1heCIsInlNaW4iLCJ1bFVuaWNvZGVSYW5nZTEiLCJ1bFVuaWNvZGVSYW5nZTIiLCJ1bFVuaWNvZGVSYW5nZTMiLCJ1bFVuaWNvZGVSYW5nZTQiLCJmaXJzdENoYXJJbmRleCIsImxhc3RDaGFySW5kZXgiLCJnZXRVbmljb2RlUmFuZ2VGb3IiLCJ0eXBvQXNjZW50IiwidHlwb0Rlc2NlbnQiLCJ3aW5Bc2NlbnQiLCJ3aW5EZXNjZW50IiwiYW5nbGUiLCJzdHJpbmdzIiwic3RyaW5nc1VuaWNvZGUiLCJzdHJCdWZVbmljb2RlIiwicGxhdGZvcm1zIiwiZW5jb2RpbmdzIiwibGFuZ3VhZ2VzIiwibmFtZXNSZWNvcmRDb3VudCIsIm5hbWVUYWJsZSIsInN0ck9mZnNldCIsInN0cnMiLCJuYW1lUmVjb3JkIiwibWltZXR5cGUiLCJyZW5kZXJlciIsIkZvbnRSZW5kZXJlckZhY3RvcnkiLCJleHBvcnREYXRhIiwiZXhwb3J0RGF0YVByb3BlcnRpZXMiLCJmYWxsYmFja1RvU3lzdGVtRm9udCIsIm5vblN0ZEZvbnRNYXAiLCJpc1N0YW5kYXJkRm9udCIsIkdseXBoTWFwRm9yU3RhbmRhcmRGb250cyIsIlN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayIsIlN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSIsImlzSWRlbnRpdHlVbmljb2RlIiwiYnVpbGRUb0ZvbnRDaGFyIiwidW5pY29kZUNoYXJDb2RlIiwiY2hlY2tBbmRSZXBhaXIiLCJWQUxJRF9UQUJMRVMiLCJyZWFkVGFibGVFbnRyeSIsInByZXZpb3VzUG9zaXRpb24iLCJ0dGYiLCJlbnRyeVNlbGVjdG9yIiwidHRjVGFnIiwidHRjIiwibWFqb3JWZXJzaW9uIiwibWlub3JWZXJzaW9uIiwibnVtRm9udHMiLCJvZmZzZXRUYWJsZSIsInJlYWRUcnVlVHlwZUNvbGxlY3Rpb25IZWFkZXIiLCJwb3RlbnRpYWxIZWFkZXIiLCJyZWFkT3BlblR5cGVIZWFkZXIiLCJwb3RlbnRpYWxUYWJsZXMiLCJyZWFkVGFibGVzIiwicmVhZE5hbWVUYWJsZSIsIm5hbWVFbnRyeSIsInBsYXRmb3JtSWQiLCJlbmNvZGluZ0lkIiwibWFwcGluZ3MiLCJoYXNTaG9ydENtYXAiLCJjYW5CcmVhayIsInVzZVRhYmxlIiwicG90ZW50aWFsVGFibGUiLCJmb3JtYXQiLCJzZWdJbmRleCIsIm9mZnNldHNDb3VudCIsInJhbmdlT2Zmc2V0Iiwib2Zmc2V0SW5kZXgiLCJvZmZzZXRzIiwiZW50cnlDb3VudCIsIm51bU9mTWV0cmljcyIsIm51bU9mU2lkZWJlYXJpbmdzIiwibnVtR2x5cGhzIiwibnVtTWlzc2luZyIsImdseXBoUHJvZmlsZSIsInNpemVPZkluc3RydWN0aW9ucyIsInNvdXJjZUVuZCIsImdseWYiLCJjb250b3Vyc0NvdW50Iiwic2lnbmVkSW50MTYiLCJ3cml0ZVNpZ25lZEludDE2IiwiZmxhZ3NDb3VudCIsImVuZFBvaW50IiwiaW5zdHJ1Y3Rpb25zU3RhcnQiLCJpbnN0cnVjdGlvbnNMZW5ndGgiLCJpbnN0cnVjdGlvbnNFbmQiLCJjb29yZGluYXRlc0xlbmd0aCIsImZsYWciLCJ4TGVuZ3RoIiwieUxlbmd0aCIsInh5TGVuZ3RoIiwiZ2x5cGhEYXRhTGVuZ3RoIiwiaW50MzIiLCJpbmRleFRvTG9jRm9ybWF0IiwiaW50MTYiLCJudW1HbHlwaHNQbHVzT25lIiwibG9jYUxlbmd0aCIsIml0ZW1TaXplIiwiaXRlbURlY29kZSIsIml0ZW1FbmNvZGUiLCJudW1HbHlwaHNPdXQiLCJkdXBGaXJzdEVudHJ5IiwibG9jYURhdGFTaXplIiwibG9jYURhdGEiLCJsb2NhIiwib2xkR2x5ZkRhdGEiLCJvbGRHbHlmRGF0YUxlbmd0aCIsIm5ld0dseWZEYXRhIiwibG9jYUVudHJpZXMiLCJtaXNzaW5nR2x5cGhzIiwid3JpdGVPZmZzZXQiLCJzYW5pdGl6ZUdseXBoIiwibWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIiwic2ltcGxlR2x5cGgiLCJmaXJzdEVudHJ5TGVuZ3RoIiwidmFsaWQiLCJnbHlwaE5hbWVzIiwiZ2x5cGhOYW1lSW5kZXhlcyIsImN1c3RvbU5hbWVzIiwicHJvcGVydGllc09iaiIsIkZPUk1BVF8wX0hFQURFUl9MRU5HVEgiLCJudW1SZWNvcmRzIiwic3RyaW5nc1N0YXJ0IiwicmVjb3JkcyIsIk5BTUVfUkVDT1JEX0xFTkdUSCIsInBsYXRmb3JtIiwibGFuZ3VhZ2UiLCJuYW1lSW5kZXgiLCJUVE9wc1N0YWNrRGVsdGFzIiwibGFzdEVuZGYiLCJsYXN0RGVmZiIsImNhbGxzdGFjayIsImZ1bmN0aW9uc0NhbGxlZCIsInRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyIsInR0Q29udGV4dCIsImluRkRFRiIsImlmTGV2ZWwiLCJpbkVMU0UiLCJvcCIsImZ1bmNJZCIsIm5ld1N0YWNrTGVuZ3RoIiwic3RhY2tUb3AiLCJzdGFja0RlbHRhIiwiZm9sZFRUVGFibGUiLCJmdW5jdGlvbnNEZWZpbmVkIiwiZnVuY3Rpb25zVXNlZCIsImZ1bmN0aW9uc1N0YWNrRGVsdGFzIiwiaGludHNWYWxpZCIsInNhbml0aXplVFRQcm9ncmFtIiwiY2hlY2tJbnZhbGlkRnVuY3Rpb25zIiwiY3Z0IiwiY3Z0RGF0YSIsInR0Y0RhdGEiLCJyZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uRGF0YSIsImlzVHJ1ZVR5cGUiLCJpc0NvbXBvc2l0ZSIsImNmZkZpbGUiLCJtYXhGdW5jdGlvbkRlZnMiLCJtYXhab25lcyIsInNhbml0aXplVFRQcm9ncmFtcyIsInNhbml0aXplTWV0cmljcyIsInNhbml0aXplSGVhZCIsImlzR2x5cGhMb2NhdGlvbnNMb25nIiwiZ2x5cGhzSW5mbyIsInNhbml0aXplR2x5cGhMb2NhdGlvbnMiLCJtZXRyaWNzT3ZlcnJpZGUiLCJyZWFkUG9zdFNjcmlwdFRhYmxlIiwiY3JlYXRlUG9zdFRhYmxlIiwiaXNDaWRUb0dpZE1hcEVtcHR5IiwiY21hcFRhYmxlIiwicmVhZENtYXBUYWJsZSIsImNtYXBQbGF0Zm9ybUlkIiwiY21hcEVuY29kaW5nSWQiLCJjbWFwTWFwcGluZ3MiLCJjbWFwTWFwcGluZ3NMZW5ndGgiLCJTdGFuZGFyZEVuY29kaW5nIiwic3RhbmRhcmRHbHlwaE5hbWUiLCJyZWNvdmVyR2x5cGhOYW1lIiwidW5pY29kZU9yQ2hhckNvZGUiLCJNYWNSb21hbkVuY29kaW5nIiwiZ2x5cGhaZXJvSWQiLCJuZXdNYXBwaW5nIiwiYWRqdXN0TWFwcGluZyIsImNyZWF0ZUNtYXBUYWJsZSIsInZhbGlkYXRlT1MyVGFibGUiLCJjcmVhdGVPUzJUYWJsZSIsImNvbXBpbGVyIiwiY3JlYXRlTmFtZVRhYmxlIiwibmFtZVByb3RvdHlwZSIsImJ1aWxkZXIiLCJjb252ZXJ0IiwiYWRqdXN0VG9Vbmljb2RlIiwiY2hhckNvZGVzIiwic2VhY3MiLCJjaGFyc2V0Iiwic2VhY01hcCIsInNlYWMiLCJiYXNlR2x5cGhOYW1lIiwiYWNjZW50R2x5cGhOYW1lIiwiYmFzZUdseXBoSWQiLCJhY2NlbnRHbHlwaElkIiwiYWNjZW50T2Zmc2V0IiwiZ2V0Q2hhckNvZGVzIiwiYmFzZUZvbnRDaGFyQ29kZSIsImNyZWF0ZUNoYXJDb2RlIiwiYWNjZW50Rm9udENoYXJDb2RlIiwic2FmZVN0cmluZzE2IiwiY2hhcnN0cmluZ3MiLCJjZmZXaWR0aHMiLCJobXR4IiwiY2hhcnN0cmluZyIsInBvc3NpYmxlU3BhY2VSZXBsYWNlbWVudHMiLCJjaGFyY29kZSIsImNoYXJUb0dseXBoIiwid2lkdGhDb2RlIiwiaXNJbkZvbnQiLCJtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyIsIm9wZXJhdG9yTGlzdElkIiwiZm9udENoYXIiLCJjaGFyc1RvR2x5cGhzIiwiY2hhcnNDYWNoZSIsImNoYXJzQ2FjaGVLZXkiLCJjaGFycyIsImlzU3BhY2UiLCJFcnJvckZvbnQiLCJUeXBlMUZvbnQiLCJzdHJlYW1CeXRlc0xlbmd0aCIsInN0cmVhbUJ5dGVzIiwiRUVYRUNfU0lHTkFUVVJFIiwic3RyZWFtU3RhcnRQb3MiLCJoZWFkZXJCeXRlcyIsImhlYWRlckJ5dGVzTGVuZ3RoIiwiZmluZEJsb2NrIiwic3VnZ2VzdGVkTGVuZ3RoIiwiZWV4ZWNCeXRlcyIsIlBGQl9IRUFERVJfU0laRSIsImhlYWRlckJsb2NrTGVuZ3RoIiwiZWV4ZWNCbG9ja0xlbmd0aCIsInBmYkhlYWRlciIsInBmYkhlYWRlclByZXNlbnQiLCJoZWFkZXJCbG9jayIsImdldEhlYWRlckJsb2NrIiwiaGVhZGVyQmxvY2tQYXJzZXIiLCJlZXhlY0Jsb2NrIiwiZ2V0RWV4ZWNCbG9jayIsImVleGVjQmxvY2tQYXJzZXIiLCJ0eXBlMkNoYXJzdHJpbmdzIiwic3VicnMiLCJnZXRDaGFyc2V0IiwiZ2V0R2x5cGhNYXBwaW5nIiwiY2hhcnN0cmluZ3NMZW4iLCJ0eXBlMUZvbnRHbHlwaE1hcHBpbmciLCJoYXNHbHlwaElkIiwiZ2V0U2VhY3MiLCJnZXRUeXBlMkNoYXJzdHJpbmdzIiwidHlwZTFDaGFyc3RyaW5ncyIsImdldFR5cGUyU3VicnMiLCJ0eXBlMVN1YnJzIiwidHlwZTJTdWJycyIsInRvcERpY3QiLCJjaGFyc2V0QXJyYXkiLCJDRkZTdGFuZGFyZFN0cmluZ3MiLCJjaGFyU3RyaW5nc0luZGV4IiwicHJpdmF0ZURpY3QiLCJzdWJySW5kZXgiLCJDRkZGb250IiwiY2hhcnNldHMiLCJNQVhfU1VCUl9ORVNUSU5HIiwiTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIiwiQ0ZGUGFyc2VyIiwiQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhIiwic3RhY2tDbGVhcmluZyIsInN0ZW0iLCJyZXNldFN0YWNrIiwidW5kZWZTdGFjayIsIkNoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YTEyIiwic3RhY2tGbiIsInRvcERpY3RJbmRleCIsInN0cmluZ0luZGV4IiwiZ2xvYmFsU3VickluZGV4IiwidG9wRGljdFBhcnNlZCIsImNoYXJTdHJpbmdPZmZzZXQiLCJjaGFyU3RyaW5nSW5kZXgiLCJmb250QkJveCIsImZkQXJyYXlJbmRleCIsImRpY3RSYXciLCJmb250RGljdCIsImNoYXJTdHJpbmdzQW5kU2VhY3MiLCJjaGFyU3RyaW5ncyIsImxvY2FsU3VickluZGV4IiwiZmRTZWxlY3QiLCJmZEFycmF5IiwiaGRyU2l6ZSIsIm9mZlNpemUiLCJwYXJzZURpY3QiLCJwYXJzZUZsb2F0T3BlcmFuZCIsIm9wZXJhbmRzIiwicGFyc2VPcGVyYW5kIiwicGFyc2VJbmRleCIsImNmZkluZGV4Iiwib2Zmc2V0U3RhcnQiLCJvZmZzZXRFbmQiLCJwYXJzZU5hbWVJbmRleCIsInBhcnNlU3RyaW5nSW5kZXgiLCJjcmVhdGVEaWN0IiwiY2ZmRGljdCIsInBhcnNlQ2hhclN0cmluZyIsInN0YWNrU2l6ZSIsInZhbGlkYXRpb25Db21tYW5kIiwic3VicnNJbmRleCIsInN1YnJOdW1iZXIiLCJwYXJzZUNoYXJTdHJpbmdzIiwiY2FsbERlcHRoIiwiZmlyc3RTdGFja0NsZWFyaW5nIiwiaGFzVlN0ZW1zIiwibG9jYWxTdWJyVG9Vc2UiLCJwcml2YXRlRGljdFRvVXNlIiwiZmRJbmRleCIsIm5vbWluYWxXaWR0aCIsImVtcHR5UHJpdmF0ZURpY3Rpb25hcnkiLCJwYXJlbnREaWN0IiwicGFyc2VQcml2YXRlRGljdCIsInByaXZhdGVPZmZzZXQiLCJwcml2YXRlRGljdEVuZCIsImRpY3REYXRhIiwic3VicnNPZmZzZXQiLCJyZWxhdGl2ZU9mZnNldCIsInBhcnNlQ2hhcnNldHMiLCJDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzIiwicmF3IiwicGFyc2VFbmNvZGluZyIsInByZWRlZmluZWQiLCJzdXBwbGVtZW50c0NvdW50Iiwic2lkIiwiZGF0YVN0YXJ0IiwiZ2x5cGhzQ291bnQiLCJyYW5nZXNDb3VudCIsImdpZCIsImRhdGFFbmQiLCJyZWFkU3VwcGxlbWVudCIsInBhcnNlRkRTZWxlY3QiLCJnbHlwaFplcm8iLCJnZXRTSUQiLCJzZXRCeUtleSIsInZhbHVlTGVuZ3RoIiwic2V0QnlOYW1lIiwiaGFzTmFtZSIsInJlbW92ZUJ5TmFtZSIsImtleVRvTmFtZU1hcCIsIm5hbWVUb0tleU1hcCIsImRlZmF1bHRzIiwidHlwZXMiLCJvcGNvZGVzIiwibGF5b3V0IiwiQ0ZGVG9wRGljdCIsIkNGRkRpY3QiLCJDRkZQcml2YXRlRGljdCIsIklTT19BRE9CRSIsIkVYUEVSVCIsIkVYUEVSVF9TVUJTRVQiLCJnZXRGREluZGV4IiwiZ2x5cGhJbmRleCIsImlzVHJhY2tpbmciLCJ0cmFjayIsInNldEVudHJ5TG9jYXRpb24iLCJvZmZzZXQxIiwib2Zmc2V0MiIsIm9mZnNldDMiLCJvZmZzZXQ0IiwiY29tcGlsZWQiLCJ0b3BEaWN0VHJhY2tlciIsImZvbnREaWN0VHJhY2tlcnMiLCJlbmNvZGVOdW1iZXIiLCJlbmNvZGVGbG9hdCIsIkNGRkNvbXBpbGVyIiwibmliYmxlcyIsImVuY29kZUludGVnZXIiLCJjb21waWxlSGVhZGVyIiwiY29tcGlsZU5hbWVJbmRleCIsInNhbml0aXplZE5hbWUiLCJjb21waWxlVG9wRGljdHMiLCJkaWN0cyIsImZvbnREaWN0VHJhY2tlciIsImZvbnREaWN0RGF0YSIsInRyYWNrZXJzIiwiY29tcGlsZVByaXZhdGVEaWN0cyIsInByaXZhdGVEaWN0VHJhY2tlciIsInByaXZhdGVEaWN0RGF0YSIsImNvbXBpbGVEaWN0Iiwib2Zmc2V0VHJhY2tlciIsImNvbXBpbGVTdHJpbmdJbmRleCIsImNvbXBpbGVDaGFyU3RyaW5ncyIsImNvbXBpbGVDaGFyc2V0IiwibnVtR2x5cGhzTGVzc05vdERlZiIsImNoYXJzZXRJbmRleCIsIm51bUNoYXJzZXRzIiwid2FybmVkIiwiY29tcGlsZUVuY29kaW5nIiwiY29tcGlsZUZEU2VsZWN0IiwibGFzdEZEIiwiY3VycmVudEZEIiwibnVtUmFuZ2VzIiwiY29tcGlsZVR5cGVkQXJyYXkiLCJjb21waWxlSW5kZXgiLCJvYmplY3RzIiwibGFzdE9mZnNldCIsIklTT0Fkb2JlQ2hhcnNldCIsIkV4cGVydENoYXJzZXQiLCJFeHBlcnRTdWJzZXRDaGFyc2V0IiwiRXhwZXJ0RW5jb2RpbmciLCJNYWNFeHBlcnRFbmNvZGluZyIsIldpbkFuc2lFbmNvZGluZyIsIlN5bWJvbFNldEVuY29kaW5nIiwiWmFwZkRpbmdiYXRzRW5jb2RpbmciLCJnZXRMb29rdXBUYWJsZUZhY3RvcnkiLCJnZXRHbHlwaHNVbmljb2RlIiwiQUUiLCJBRWFjdXRlIiwiQUVtYWNyb24iLCJBRXNtYWxsIiwiQWFjdXRlIiwiQWFjdXRlc21hbGwiLCJBYnJldmUiLCJBYnJldmVhY3V0ZSIsIkFicmV2ZWN5cmlsbGljIiwiQWJyZXZlZG90YmVsb3ciLCJBYnJldmVncmF2ZSIsIkFicmV2ZWhvb2thYm92ZSIsIkFicmV2ZXRpbGRlIiwiQWNhcm9uIiwiQWNpcmNsZSIsIkFjaXJjdW1mbGV4IiwiQWNpcmN1bWZsZXhhY3V0ZSIsIkFjaXJjdW1mbGV4ZG90YmVsb3ciLCJBY2lyY3VtZmxleGdyYXZlIiwiQWNpcmN1bWZsZXhob29rYWJvdmUiLCJBY2lyY3VtZmxleHNtYWxsIiwiQWNpcmN1bWZsZXh0aWxkZSIsIkFjdXRlIiwiQWN1dGVzbWFsbCIsIkFjeXJpbGxpYyIsIkFkYmxncmF2ZSIsIkFkaWVyZXNpcyIsIkFkaWVyZXNpc2N5cmlsbGljIiwiQWRpZXJlc2lzbWFjcm9uIiwiQWRpZXJlc2lzc21hbGwiLCJBZG90YmVsb3ciLCJBZG90bWFjcm9uIiwiQWdyYXZlIiwiQWdyYXZlc21hbGwiLCJBaG9va2Fib3ZlIiwiQWllY3lyaWxsaWMiLCJBaW52ZXJ0ZWRicmV2ZSIsIkFscGhhIiwiQWxwaGF0b25vcyIsIkFtYWNyb24iLCJBbW9ub3NwYWNlIiwiQW9nb25layIsIkFyaW5nIiwiQXJpbmdhY3V0ZSIsIkFyaW5nYmVsb3ciLCJBcmluZ3NtYWxsIiwiQXNtYWxsIiwiQXRpbGRlIiwiQXRpbGRlc21hbGwiLCJBeWJhcm1lbmlhbiIsIkJjaXJjbGUiLCJCZG90YWNjZW50IiwiQmRvdGJlbG93IiwiQmVjeXJpbGxpYyIsIkJlbmFybWVuaWFuIiwiQmV0YSIsIkJob29rIiwiQmxpbmViZWxvdyIsIkJtb25vc3BhY2UiLCJCcmV2ZXNtYWxsIiwiQnNtYWxsIiwiQnRvcGJhciIsIkNhYXJtZW5pYW4iLCJDYWN1dGUiLCJDYXJvbiIsIkNhcm9uc21hbGwiLCJDY2Fyb24iLCJDY2VkaWxsYSIsIkNjZWRpbGxhYWN1dGUiLCJDY2VkaWxsYXNtYWxsIiwiQ2NpcmNsZSIsIkNjaXJjdW1mbGV4IiwiQ2RvdCIsIkNkb3RhY2NlbnQiLCJDZWRpbGxhc21hbGwiLCJDaGFhcm1lbmlhbiIsIkNoZWFia2hhc2lhbmN5cmlsbGljIiwiQ2hlY3lyaWxsaWMiLCJDaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyIsIkNoZWRlc2NlbmRlcmN5cmlsbGljIiwiQ2hlZGllcmVzaXNjeXJpbGxpYyIsIkNoZWhhcm1lbmlhbiIsIkNoZWtoYWthc3NpYW5jeXJpbGxpYyIsIkNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMiLCJDaGkiLCJDaG9vayIsIkNpcmN1bWZsZXhzbWFsbCIsIkNtb25vc3BhY2UiLCJDb2FybWVuaWFuIiwiQ3NtYWxsIiwiRCIsIkRaIiwiRFpjYXJvbiIsIkRhYXJtZW5pYW4iLCJEYWZyaWNhbiIsIkRjYXJvbiIsIkRjZWRpbGxhIiwiRGNpcmNsZSIsIkRjaXJjdW1mbGV4YmVsb3ciLCJEY3JvYXQiLCJEZG90YWNjZW50IiwiRGRvdGJlbG93IiwiRGVjeXJpbGxpYyIsIkRlaWNvcHRpYyIsIkRlbHRhIiwiRGVsdGFncmVlayIsIkRob29rIiwiRGllcmVzaXMiLCJEaWVyZXNpc0FjdXRlIiwiRGllcmVzaXNHcmF2ZSIsIkRpZXJlc2lzc21hbGwiLCJEaWdhbW1hZ3JlZWsiLCJEamVjeXJpbGxpYyIsIkRsaW5lYmVsb3ciLCJEbW9ub3NwYWNlIiwiRG90YWNjZW50c21hbGwiLCJEc2xhc2giLCJEc21hbGwiLCJEdG9wYmFyIiwiRHoiLCJEemNhcm9uIiwiRHplYWJraGFzaWFuY3lyaWxsaWMiLCJEemVjeXJpbGxpYyIsIkR6aGVjeXJpbGxpYyIsIkVhY3V0ZSIsIkVhY3V0ZXNtYWxsIiwiRWJyZXZlIiwiRWNhcm9uIiwiRWNlZGlsbGFicmV2ZSIsIkVjaGFybWVuaWFuIiwiRWNpcmNsZSIsIkVjaXJjdW1mbGV4IiwiRWNpcmN1bWZsZXhhY3V0ZSIsIkVjaXJjdW1mbGV4YmVsb3ciLCJFY2lyY3VtZmxleGRvdGJlbG93IiwiRWNpcmN1bWZsZXhncmF2ZSIsIkVjaXJjdW1mbGV4aG9va2Fib3ZlIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVjaXJjdW1mbGV4dGlsZGUiLCJFY3lyaWxsaWMiLCJFZGJsZ3JhdmUiLCJFZGllcmVzaXMiLCJFZGllcmVzaXNzbWFsbCIsIkVkb3QiLCJFZG90YWNjZW50IiwiRWRvdGJlbG93IiwiRWZjeXJpbGxpYyIsIkVncmF2ZSIsIkVncmF2ZXNtYWxsIiwiRWhhcm1lbmlhbiIsIkVob29rYWJvdmUiLCJFaWdodHJvbWFuIiwiRWludmVydGVkYnJldmUiLCJFaW90aWZpZWRjeXJpbGxpYyIsIkVsY3lyaWxsaWMiLCJFbGV2ZW5yb21hbiIsIkVtYWNyb24iLCJFbWFjcm9uYWN1dGUiLCJFbWFjcm9uZ3JhdmUiLCJFbWN5cmlsbGljIiwiRW1vbm9zcGFjZSIsIkVuY3lyaWxsaWMiLCJFbmRlc2NlbmRlcmN5cmlsbGljIiwiRW5nIiwiRW5naGVjeXJpbGxpYyIsIkVuaG9va2N5cmlsbGljIiwiRW9nb25layIsIkVvcGVuIiwiRXBzaWxvbiIsIkVwc2lsb250b25vcyIsIkVyY3lyaWxsaWMiLCJFcmV2ZXJzZWQiLCJFcmV2ZXJzZWRjeXJpbGxpYyIsIkVzY3lyaWxsaWMiLCJFc2Rlc2NlbmRlcmN5cmlsbGljIiwiRXNoIiwiRXNtYWxsIiwiRXRhIiwiRXRhcm1lbmlhbiIsIkV0YXRvbm9zIiwiRXRoIiwiRXRoc21hbGwiLCJFdGlsZGUiLCJFdGlsZGViZWxvdyIsIkV1cm8iLCJFemgiLCJFemhjYXJvbiIsIkV6aHJldmVyc2VkIiwiRmNpcmNsZSIsIkZkb3RhY2NlbnQiLCJGZWhhcm1lbmlhbiIsIkZlaWNvcHRpYyIsIkZob29rIiwiRml0YWN5cmlsbGljIiwiRml2ZXJvbWFuIiwiRm1vbm9zcGFjZSIsIkZvdXJyb21hbiIsIkZzbWFsbCIsIkciLCJHQnNxdWFyZSIsIkdhY3V0ZSIsIkdhbW1hIiwiR2FtbWFhZnJpY2FuIiwiR2FuZ2lhY29wdGljIiwiR2JyZXZlIiwiR2Nhcm9uIiwiR2NlZGlsbGEiLCJHY2lyY2xlIiwiR2NpcmN1bWZsZXgiLCJHY29tbWFhY2NlbnQiLCJHZG90IiwiR2RvdGFjY2VudCIsIkdlY3lyaWxsaWMiLCJHaGFkYXJtZW5pYW4iLCJHaGVtaWRkbGVob29rY3lyaWxsaWMiLCJHaGVzdHJva2VjeXJpbGxpYyIsIkdoZXVwdHVybmN5cmlsbGljIiwiR2hvb2siLCJHaW1hcm1lbmlhbiIsIkdqZWN5cmlsbGljIiwiR21hY3JvbiIsIkdtb25vc3BhY2UiLCJHcmF2ZSIsIkdyYXZlc21hbGwiLCJHc21hbGwiLCJHc21hbGxob29rIiwiR3N0cm9rZSIsIkgiLCJIMTg1MzMiLCJIMTg1NDMiLCJIMTg1NTEiLCJIMjIwNzMiLCJIUHNxdWFyZSIsIkhhYWJraGFzaWFuY3lyaWxsaWMiLCJIYWRlc2NlbmRlcmN5cmlsbGljIiwiSGFyZHNpZ25jeXJpbGxpYyIsIkhiYXIiLCJIYnJldmViZWxvdyIsIkhjZWRpbGxhIiwiSGNpcmNsZSIsIkhjaXJjdW1mbGV4IiwiSGRpZXJlc2lzIiwiSGRvdGFjY2VudCIsIkhkb3RiZWxvdyIsIkhtb25vc3BhY2UiLCJIb2FybWVuaWFuIiwiSG9yaWNvcHRpYyIsIkhzbWFsbCIsIkh1bmdhcnVtbGF1dCIsIkh1bmdhcnVtbGF1dHNtYWxsIiwiSHpzcXVhcmUiLCJJQWN5cmlsbGljIiwiSUoiLCJJVWN5cmlsbGljIiwiSWFjdXRlIiwiSWFjdXRlc21hbGwiLCJJYnJldmUiLCJJY2Fyb24iLCJJY2lyY2xlIiwiSWNpcmN1bWZsZXgiLCJJY2lyY3VtZmxleHNtYWxsIiwiSWN5cmlsbGljIiwiSWRibGdyYXZlIiwiSWRpZXJlc2lzIiwiSWRpZXJlc2lzYWN1dGUiLCJJZGllcmVzaXNjeXJpbGxpYyIsIklkaWVyZXNpc3NtYWxsIiwiSWRvdCIsIklkb3RhY2NlbnQiLCJJZG90YmVsb3ciLCJJZWJyZXZlY3lyaWxsaWMiLCJJZWN5cmlsbGljIiwiSWZyYWt0dXIiLCJJZ3JhdmUiLCJJZ3JhdmVzbWFsbCIsIklob29rYWJvdmUiLCJJaWN5cmlsbGljIiwiSWludmVydGVkYnJldmUiLCJJaXNob3J0Y3lyaWxsaWMiLCJJbWFjcm9uIiwiSW1hY3JvbmN5cmlsbGljIiwiSW1vbm9zcGFjZSIsIkluaWFybWVuaWFuIiwiSW9jeXJpbGxpYyIsIklvZ29uZWsiLCJJb3RhIiwiSW90YWFmcmljYW4iLCJJb3RhZGllcmVzaXMiLCJJb3RhdG9ub3MiLCJJc21hbGwiLCJJc3Ryb2tlIiwiSXRpbGRlIiwiSXRpbGRlYmVsb3ciLCJJemhpdHNhY3lyaWxsaWMiLCJJemhpdHNhZGJsZ3JhdmVjeXJpbGxpYyIsIkoiLCJKYWFybWVuaWFuIiwiSmNpcmNsZSIsIkpjaXJjdW1mbGV4IiwiSmVjeXJpbGxpYyIsIkpoZWhhcm1lbmlhbiIsIkptb25vc3BhY2UiLCJKc21hbGwiLCJLQnNxdWFyZSIsIktLc3F1YXJlIiwiS2FiYXNoa2lyY3lyaWxsaWMiLCJLYWN1dGUiLCJLYWN5cmlsbGljIiwiS2FkZXNjZW5kZXJjeXJpbGxpYyIsIkthaG9va2N5cmlsbGljIiwiS2FwcGEiLCJLYXN0cm9rZWN5cmlsbGljIiwiS2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljIiwiS2Nhcm9uIiwiS2NlZGlsbGEiLCJLY2lyY2xlIiwiS2NvbW1hYWNjZW50IiwiS2RvdGJlbG93IiwiS2VoYXJtZW5pYW4iLCJLZW5hcm1lbmlhbiIsIktoYWN5cmlsbGljIiwiS2hlaWNvcHRpYyIsIktob29rIiwiS2plY3lyaWxsaWMiLCJLbGluZWJlbG93IiwiS21vbm9zcGFjZSIsIktvcHBhY3lyaWxsaWMiLCJLb3BwYWdyZWVrIiwiS3NpY3lyaWxsaWMiLCJLc21hbGwiLCJMSiIsIkxhY3V0ZSIsIkxhbWJkYSIsIkxjYXJvbiIsIkxjZWRpbGxhIiwiTGNpcmNsZSIsIkxjaXJjdW1mbGV4YmVsb3ciLCJMY29tbWFhY2NlbnQiLCJMZG90IiwiTGRvdGFjY2VudCIsIkxkb3RiZWxvdyIsIkxkb3RiZWxvd21hY3JvbiIsIkxpd25hcm1lbmlhbiIsIkxqIiwiTGplY3lyaWxsaWMiLCJMbGluZWJlbG93IiwiTG1vbm9zcGFjZSIsIkxzbGFzaCIsIkxzbGFzaHNtYWxsIiwiTHNtYWxsIiwiTUJzcXVhcmUiLCJNYWNyb24iLCJNYWNyb25zbWFsbCIsIk1hY3V0ZSIsIk1jaXJjbGUiLCJNZG90YWNjZW50IiwiTWRvdGJlbG93IiwiTWVuYXJtZW5pYW4iLCJNbW9ub3NwYWNlIiwiTXNtYWxsIiwiTXR1cm5lZCIsIk11IiwiTkoiLCJOYWN1dGUiLCJOY2Fyb24iLCJOY2VkaWxsYSIsIk5jaXJjbGUiLCJOY2lyY3VtZmxleGJlbG93IiwiTmNvbW1hYWNjZW50IiwiTmRvdGFjY2VudCIsIk5kb3RiZWxvdyIsIk5ob29rbGVmdCIsIk5pbmVyb21hbiIsIk5qIiwiTmplY3lyaWxsaWMiLCJObGluZWJlbG93IiwiTm1vbm9zcGFjZSIsIk5vd2FybWVuaWFuIiwiTnNtYWxsIiwiTnRpbGRlIiwiTnRpbGRlc21hbGwiLCJOdSIsIk9FIiwiT0VzbWFsbCIsIk9hY3V0ZSIsIk9hY3V0ZXNtYWxsIiwiT2JhcnJlZGN5cmlsbGljIiwiT2JhcnJlZGRpZXJlc2lzY3lyaWxsaWMiLCJPYnJldmUiLCJPY2Fyb24iLCJPY2VudGVyZWR0aWxkZSIsIk9jaXJjbGUiLCJPY2lyY3VtZmxleCIsIk9jaXJjdW1mbGV4YWN1dGUiLCJPY2lyY3VtZmxleGRvdGJlbG93IiwiT2NpcmN1bWZsZXhncmF2ZSIsIk9jaXJjdW1mbGV4aG9va2Fib3ZlIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk9jaXJjdW1mbGV4dGlsZGUiLCJPY3lyaWxsaWMiLCJPZGJsYWN1dGUiLCJPZGJsZ3JhdmUiLCJPZGllcmVzaXMiLCJPZGllcmVzaXNjeXJpbGxpYyIsIk9kaWVyZXNpc3NtYWxsIiwiT2RvdGJlbG93IiwiT2dvbmVrc21hbGwiLCJPZ3JhdmUiLCJPZ3JhdmVzbWFsbCIsIk9oYXJtZW5pYW4iLCJPaG0iLCJPaG9va2Fib3ZlIiwiT2hvcm4iLCJPaG9ybmFjdXRlIiwiT2hvcm5kb3RiZWxvdyIsIk9ob3JuZ3JhdmUiLCJPaG9ybmhvb2thYm92ZSIsIk9ob3JudGlsZGUiLCJPaHVuZ2FydW1sYXV0IiwiT2kiLCJPaW52ZXJ0ZWRicmV2ZSIsIk9tYWNyb24iLCJPbWFjcm9uYWN1dGUiLCJPbWFjcm9uZ3JhdmUiLCJPbWVnYSIsIk9tZWdhY3lyaWxsaWMiLCJPbWVnYWdyZWVrIiwiT21lZ2Fyb3VuZGN5cmlsbGljIiwiT21lZ2F0aXRsb2N5cmlsbGljIiwiT21lZ2F0b25vcyIsIk9taWNyb24iLCJPbWljcm9udG9ub3MiLCJPbW9ub3NwYWNlIiwiT25lcm9tYW4iLCJPb2dvbmVrIiwiT29nb25la21hY3JvbiIsIk9vcGVuIiwiT3NsYXNoIiwiT3NsYXNoYWN1dGUiLCJPc2xhc2hzbWFsbCIsIk9zbWFsbCIsIk9zdHJva2VhY3V0ZSIsIk90Y3lyaWxsaWMiLCJPdGlsZGUiLCJPdGlsZGVhY3V0ZSIsIk90aWxkZWRpZXJlc2lzIiwiT3RpbGRlc21hbGwiLCJQYWN1dGUiLCJQY2lyY2xlIiwiUGRvdGFjY2VudCIsIlBlY3lyaWxsaWMiLCJQZWhhcm1lbmlhbiIsIlBlbWlkZGxlaG9va2N5cmlsbGljIiwiUGhpIiwiUGhvb2siLCJQaSIsIlBpd3Jhcm1lbmlhbiIsIlBtb25vc3BhY2UiLCJQc2kiLCJQc2ljeXJpbGxpYyIsIlBzbWFsbCIsIlEiLCJRY2lyY2xlIiwiUW1vbm9zcGFjZSIsIlFzbWFsbCIsIlIiLCJSYWFybWVuaWFuIiwiUmFjdXRlIiwiUmNhcm9uIiwiUmNlZGlsbGEiLCJSY2lyY2xlIiwiUmNvbW1hYWNjZW50IiwiUmRibGdyYXZlIiwiUmRvdGFjY2VudCIsIlJkb3RiZWxvdyIsIlJkb3RiZWxvd21hY3JvbiIsIlJlaGFybWVuaWFuIiwiUmZyYWt0dXIiLCJSaG8iLCJSaW5nc21hbGwiLCJSaW52ZXJ0ZWRicmV2ZSIsIlJsaW5lYmVsb3ciLCJSbW9ub3NwYWNlIiwiUnNtYWxsIiwiUnNtYWxsaW52ZXJ0ZWQiLCJSc21hbGxpbnZlcnRlZHN1cGVyaW9yIiwiU0YwMTAwMDAiLCJTRjAyMDAwMCIsIlNGMDMwMDAwIiwiU0YwNDAwMDAiLCJTRjA1MDAwMCIsIlNGMDYwMDAwIiwiU0YwNzAwMDAiLCJTRjA4MDAwMCIsIlNGMDkwMDAwIiwiU0YxMDAwMDAiLCJTRjExMDAwMCIsIlNGMTkwMDAwIiwiU0YyMDAwMDAiLCJTRjIxMDAwMCIsIlNGMjIwMDAwIiwiU0YyMzAwMDAiLCJTRjI0MDAwMCIsIlNGMjUwMDAwIiwiU0YyNjAwMDAiLCJTRjI3MDAwMCIsIlNGMjgwMDAwIiwiU0YzNjAwMDAiLCJTRjM3MDAwMCIsIlNGMzgwMDAwIiwiU0YzOTAwMDAiLCJTRjQwMDAwMCIsIlNGNDEwMDAwIiwiU0Y0MjAwMDAiLCJTRjQzMDAwMCIsIlNGNDQwMDAwIiwiU0Y0NTAwMDAiLCJTRjQ2MDAwMCIsIlNGNDcwMDAwIiwiU0Y0ODAwMDAiLCJTRjQ5MDAwMCIsIlNGNTAwMDAwIiwiU0Y1MTAwMDAiLCJTRjUyMDAwMCIsIlNGNTMwMDAwIiwiU0Y1NDAwMDAiLCJTYWN1dGUiLCJTYWN1dGVkb3RhY2NlbnQiLCJTYW1waWdyZWVrIiwiU2Nhcm9uIiwiU2Nhcm9uZG90YWNjZW50IiwiU2Nhcm9uc21hbGwiLCJTY2VkaWxsYSIsIlNjaHdhIiwiU2Nod2FjeXJpbGxpYyIsIlNjaHdhZGllcmVzaXNjeXJpbGxpYyIsIlNjaXJjbGUiLCJTY2lyY3VtZmxleCIsIlNjb21tYWFjY2VudCIsIlNkb3RhY2NlbnQiLCJTZG90YmVsb3ciLCJTZG90YmVsb3dkb3RhY2NlbnQiLCJTZWhhcm1lbmlhbiIsIlNldmVucm9tYW4iLCJTaGFhcm1lbmlhbiIsIlNoYWN5cmlsbGljIiwiU2hjaGFjeXJpbGxpYyIsIlNoZWljb3B0aWMiLCJTaGhhY3lyaWxsaWMiLCJTaGltYWNvcHRpYyIsIlNpZ21hIiwiU2l4cm9tYW4iLCJTbW9ub3NwYWNlIiwiU29mdHNpZ25jeXJpbGxpYyIsIlNzbWFsbCIsIlN0aWdtYWdyZWVrIiwiVGF1IiwiVGJhciIsIlRjYXJvbiIsIlRjZWRpbGxhIiwiVGNpcmNsZSIsIlRjaXJjdW1mbGV4YmVsb3ciLCJUY29tbWFhY2NlbnQiLCJUZG90YWNjZW50IiwiVGRvdGJlbG93IiwiVGVjeXJpbGxpYyIsIlRlZGVzY2VuZGVyY3lyaWxsaWMiLCJUZW5yb21hbiIsIlRldHNlY3lyaWxsaWMiLCJUaGV0YSIsIlRob29rIiwiVGhvcm4iLCJUaG9ybnNtYWxsIiwiVGhyZWVyb21hbiIsIlRpbGRlc21hbGwiLCJUaXduYXJtZW5pYW4iLCJUbGluZWJlbG93IiwiVG1vbm9zcGFjZSIsIlRvYXJtZW5pYW4iLCJUb25lZml2ZSIsIlRvbmVzaXgiLCJUb25ldHdvIiwiVHJldHJvZmxleGhvb2siLCJUc2VjeXJpbGxpYyIsIlRzaGVjeXJpbGxpYyIsIlRzbWFsbCIsIlR3ZWx2ZXJvbWFuIiwiVHdvcm9tYW4iLCJVIiwiVWFjdXRlIiwiVWFjdXRlc21hbGwiLCJVYnJldmUiLCJVY2Fyb24iLCJVY2lyY2xlIiwiVWNpcmN1bWZsZXgiLCJVY2lyY3VtZmxleGJlbG93IiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVjeXJpbGxpYyIsIlVkYmxhY3V0ZSIsIlVkYmxncmF2ZSIsIlVkaWVyZXNpcyIsIlVkaWVyZXNpc2FjdXRlIiwiVWRpZXJlc2lzYmVsb3ciLCJVZGllcmVzaXNjYXJvbiIsIlVkaWVyZXNpc2N5cmlsbGljIiwiVWRpZXJlc2lzZ3JhdmUiLCJVZGllcmVzaXNtYWNyb24iLCJVZGllcmVzaXNzbWFsbCIsIlVkb3RiZWxvdyIsIlVncmF2ZSIsIlVncmF2ZXNtYWxsIiwiVWhvb2thYm92ZSIsIlVob3JuIiwiVWhvcm5hY3V0ZSIsIlVob3JuZG90YmVsb3ciLCJVaG9ybmdyYXZlIiwiVWhvcm5ob29rYWJvdmUiLCJVaG9ybnRpbGRlIiwiVWh1bmdhcnVtbGF1dCIsIlVodW5nYXJ1bWxhdXRjeXJpbGxpYyIsIlVpbnZlcnRlZGJyZXZlIiwiVWtjeXJpbGxpYyIsIlVtYWNyb24iLCJVbWFjcm9uY3lyaWxsaWMiLCJVbWFjcm9uZGllcmVzaXMiLCJVbW9ub3NwYWNlIiwiVW9nb25layIsIlVwc2lsb24iLCJVcHNpbG9uMSIsIlVwc2lsb25hY3V0ZWhvb2tzeW1ib2xncmVlayIsIlVwc2lsb25hZnJpY2FuIiwiVXBzaWxvbmRpZXJlc2lzIiwiVXBzaWxvbmRpZXJlc2lzaG9va3N5bWJvbGdyZWVrIiwiVXBzaWxvbmhvb2tzeW1ib2wiLCJVcHNpbG9udG9ub3MiLCJVcmluZyIsIlVzaG9ydGN5cmlsbGljIiwiVXNtYWxsIiwiVXN0cmFpZ2h0Y3lyaWxsaWMiLCJVc3RyYWlnaHRzdHJva2VjeXJpbGxpYyIsIlV0aWxkZSIsIlV0aWxkZWFjdXRlIiwiVXRpbGRlYmVsb3ciLCJWY2lyY2xlIiwiVmRvdGJlbG93IiwiVmVjeXJpbGxpYyIsIlZld2FybWVuaWFuIiwiVmhvb2siLCJWbW9ub3NwYWNlIiwiVm9hcm1lbmlhbiIsIlZzbWFsbCIsIlZ0aWxkZSIsIlciLCJXYWN1dGUiLCJXY2lyY2xlIiwiV2NpcmN1bWZsZXgiLCJXZGllcmVzaXMiLCJXZG90YWNjZW50IiwiV2RvdGJlbG93IiwiV2dyYXZlIiwiV21vbm9zcGFjZSIsIldzbWFsbCIsIlhjaXJjbGUiLCJYZGllcmVzaXMiLCJYZG90YWNjZW50IiwiWGVoYXJtZW5pYW4iLCJYaSIsIlhtb25vc3BhY2UiLCJYc21hbGwiLCJZYWN1dGUiLCJZYWN1dGVzbWFsbCIsIllhdGN5cmlsbGljIiwiWWNpcmNsZSIsIlljaXJjdW1mbGV4IiwiWWRpZXJlc2lzIiwiWWRpZXJlc2lzc21hbGwiLCJZZG90YWNjZW50IiwiWWRvdGJlbG93IiwiWWVyaWN5cmlsbGljIiwiWWVydWRpZXJlc2lzY3lyaWxsaWMiLCJZZ3JhdmUiLCJZaG9vayIsIllob29rYWJvdmUiLCJZaWFybWVuaWFuIiwiWWljeXJpbGxpYyIsIllpd25hcm1lbmlhbiIsIlltb25vc3BhY2UiLCJZc21hbGwiLCJZdGlsZGUiLCJZdXNiaWdjeXJpbGxpYyIsIll1c2JpZ2lvdGlmaWVkY3lyaWxsaWMiLCJZdXNsaXR0bGVjeXJpbGxpYyIsIll1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMiLCJaYWFybWVuaWFuIiwiWmFjdXRlIiwiWmNhcm9uIiwiWmNhcm9uc21hbGwiLCJaY2lyY2xlIiwiWmNpcmN1bWZsZXgiLCJaZG90IiwiWmRvdGFjY2VudCIsIlpkb3RiZWxvdyIsIlplY3lyaWxsaWMiLCJaZWRlc2NlbmRlcmN5cmlsbGljIiwiWmVkaWVyZXNpc2N5cmlsbGljIiwiWmV0YSIsIlpoZWFybWVuaWFuIiwiWmhlYnJldmVjeXJpbGxpYyIsIlpoZWN5cmlsbGljIiwiWmhlZGVzY2VuZGVyY3lyaWxsaWMiLCJaaGVkaWVyZXNpc2N5cmlsbGljIiwiWmxpbmViZWxvdyIsIlptb25vc3BhY2UiLCJac21hbGwiLCJac3Ryb2tlIiwiYWFiZW5nYWxpIiwiYWFjdXRlIiwiYWFkZXZhIiwiYWFndWphcmF0aSIsImFhZ3VybXVraGkiLCJhYW1hdHJhZ3VybXVraGkiLCJhYXJ1c3F1YXJlIiwiYWF2b3dlbHNpZ25iZW5nYWxpIiwiYWF2b3dlbHNpZ25kZXZhIiwiYWF2b3dlbHNpZ25ndWphcmF0aSIsImFiYnJldmlhdGlvbm1hcmthcm1lbmlhbiIsImFiYnJldmlhdGlvbnNpZ25kZXZhIiwiYWJlbmdhbGkiLCJhYm9wb21vZm8iLCJhYnJldmUiLCJhYnJldmVhY3V0ZSIsImFicmV2ZWN5cmlsbGljIiwiYWJyZXZlZG90YmVsb3ciLCJhYnJldmVncmF2ZSIsImFicmV2ZWhvb2thYm92ZSIsImFicmV2ZXRpbGRlIiwiYWNhcm9uIiwiYWNpcmNsZSIsImFjaXJjdW1mbGV4IiwiYWNpcmN1bWZsZXhhY3V0ZSIsImFjaXJjdW1mbGV4ZG90YmVsb3ciLCJhY2lyY3VtZmxleGdyYXZlIiwiYWNpcmN1bWZsZXhob29rYWJvdmUiLCJhY2lyY3VtZmxleHRpbGRlIiwiYWN1dGUiLCJhY3V0ZWJlbG93Y21iIiwiYWN1dGVjbWIiLCJhY3V0ZWNvbWIiLCJhY3V0ZWRldmEiLCJhY3V0ZWxvd21vZCIsImFjdXRldG9uZWNtYiIsImFjeXJpbGxpYyIsImFkYmxncmF2ZSIsImFkZGFrZ3VybXVraGkiLCJhZGV2YSIsImFkaWVyZXNpcyIsImFkaWVyZXNpc2N5cmlsbGljIiwiYWRpZXJlc2lzbWFjcm9uIiwiYWRvdGJlbG93IiwiYWRvdG1hY3JvbiIsImFlIiwiYWVhY3V0ZSIsImFla29yZWFuIiwiYWVtYWNyb24iLCJhZmlpMDAyMDgiLCJhZmlpMDg5NDEiLCJhZmlpMTAwMTciLCJhZmlpMTAwMTgiLCJhZmlpMTAwMTkiLCJhZmlpMTAwMjAiLCJhZmlpMTAwMjEiLCJhZmlpMTAwMjIiLCJhZmlpMTAwMjMiLCJhZmlpMTAwMjQiLCJhZmlpMTAwMjUiLCJhZmlpMTAwMjYiLCJhZmlpMTAwMjciLCJhZmlpMTAwMjgiLCJhZmlpMTAwMjkiLCJhZmlpMTAwMzAiLCJhZmlpMTAwMzEiLCJhZmlpMTAwMzIiLCJhZmlpMTAwMzMiLCJhZmlpMTAwMzQiLCJhZmlpMTAwMzUiLCJhZmlpMTAwMzYiLCJhZmlpMTAwMzciLCJhZmlpMTAwMzgiLCJhZmlpMTAwMzkiLCJhZmlpMTAwNDAiLCJhZmlpMTAwNDEiLCJhZmlpMTAwNDIiLCJhZmlpMTAwNDMiLCJhZmlpMTAwNDQiLCJhZmlpMTAwNDUiLCJhZmlpMTAwNDYiLCJhZmlpMTAwNDciLCJhZmlpMTAwNDgiLCJhZmlpMTAwNDkiLCJhZmlpMTAwNTAiLCJhZmlpMTAwNTEiLCJhZmlpMTAwNTIiLCJhZmlpMTAwNTMiLCJhZmlpMTAwNTQiLCJhZmlpMTAwNTUiLCJhZmlpMTAwNTYiLCJhZmlpMTAwNTciLCJhZmlpMTAwNTgiLCJhZmlpMTAwNTkiLCJhZmlpMTAwNjAiLCJhZmlpMTAwNjEiLCJhZmlpMTAwNjIiLCJhZmlpMTAwNjMiLCJhZmlpMTAwNjQiLCJhZmlpMTAwNjUiLCJhZmlpMTAwNjYiLCJhZmlpMTAwNjciLCJhZmlpMTAwNjgiLCJhZmlpMTAwNjkiLCJhZmlpMTAwNzAiLCJhZmlpMTAwNzEiLCJhZmlpMTAwNzIiLCJhZmlpMTAwNzMiLCJhZmlpMTAwNzQiLCJhZmlpMTAwNzUiLCJhZmlpMTAwNzYiLCJhZmlpMTAwNzciLCJhZmlpMTAwNzgiLCJhZmlpMTAwNzkiLCJhZmlpMTAwODAiLCJhZmlpMTAwODEiLCJhZmlpMTAwODIiLCJhZmlpMTAwODMiLCJhZmlpMTAwODQiLCJhZmlpMTAwODUiLCJhZmlpMTAwODYiLCJhZmlpMTAwODciLCJhZmlpMTAwODgiLCJhZmlpMTAwODkiLCJhZmlpMTAwOTAiLCJhZmlpMTAwOTEiLCJhZmlpMTAwOTIiLCJhZmlpMTAwOTMiLCJhZmlpMTAwOTQiLCJhZmlpMTAwOTUiLCJhZmlpMTAwOTYiLCJhZmlpMTAwOTciLCJhZmlpMTAwOTgiLCJhZmlpMTAwOTkiLCJhZmlpMTAxMDAiLCJhZmlpMTAxMDEiLCJhZmlpMTAxMDIiLCJhZmlpMTAxMDMiLCJhZmlpMTAxMDQiLCJhZmlpMTAxMDUiLCJhZmlpMTAxMDYiLCJhZmlpMTAxMDciLCJhZmlpMTAxMDgiLCJhZmlpMTAxMDkiLCJhZmlpMTAxMTAiLCJhZmlpMTAxNDUiLCJhZmlpMTAxNDYiLCJhZmlpMTAxNDciLCJhZmlpMTAxNDgiLCJhZmlpMTAxOTIiLCJhZmlpMTAxOTMiLCJhZmlpMTAxOTQiLCJhZmlpMTAxOTUiLCJhZmlpMTAxOTYiLCJhZmlpMTA4MzEiLCJhZmlpMTA4MzIiLCJhZmlpMTA4NDYiLCJhZmlpMjk5IiwiYWZpaTMwMCIsImFmaWkzMDEiLCJhZmlpNTczODEiLCJhZmlpNTczODgiLCJhZmlpNTczOTIiLCJhZmlpNTczOTMiLCJhZmlpNTczOTQiLCJhZmlpNTczOTUiLCJhZmlpNTczOTYiLCJhZmlpNTczOTciLCJhZmlpNTczOTgiLCJhZmlpNTczOTkiLCJhZmlpNTc0MDAiLCJhZmlpNTc0MDEiLCJhZmlpNTc0MDMiLCJhZmlpNTc0MDciLCJhZmlpNTc0MDkiLCJhZmlpNTc0MTAiLCJhZmlpNTc0MTEiLCJhZmlpNTc0MTIiLCJhZmlpNTc0MTMiLCJhZmlpNTc0MTQiLCJhZmlpNTc0MTUiLCJhZmlpNTc0MTYiLCJhZmlpNTc0MTciLCJhZmlpNTc0MTgiLCJhZmlpNTc0MTkiLCJhZmlpNTc0MjAiLCJhZmlpNTc0MjEiLCJhZmlpNTc0MjIiLCJhZmlpNTc0MjMiLCJhZmlpNTc0MjQiLCJhZmlpNTc0MjUiLCJhZmlpNTc0MjYiLCJhZmlpNTc0MjciLCJhZmlpNTc0MjgiLCJhZmlpNTc0MjkiLCJhZmlpNTc0MzAiLCJhZmlpNTc0MzEiLCJhZmlpNTc0MzIiLCJhZmlpNTc0MzMiLCJhZmlpNTc0MzQiLCJhZmlpNTc0NDAiLCJhZmlpNTc0NDEiLCJhZmlpNTc0NDIiLCJhZmlpNTc0NDMiLCJhZmlpNTc0NDQiLCJhZmlpNTc0NDUiLCJhZmlpNTc0NDYiLCJhZmlpNTc0NDgiLCJhZmlpNTc0NDkiLCJhZmlpNTc0NTAiLCJhZmlpNTc0NTEiLCJhZmlpNTc0NTIiLCJhZmlpNTc0NTMiLCJhZmlpNTc0NTQiLCJhZmlpNTc0NTUiLCJhZmlpNTc0NTYiLCJhZmlpNTc0NTciLCJhZmlpNTc0NTgiLCJhZmlpNTc0NzAiLCJhZmlpNTc1MDUiLCJhZmlpNTc1MDYiLCJhZmlpNTc1MDciLCJhZmlpNTc1MDgiLCJhZmlpNTc1MDkiLCJhZmlpNTc1MTEiLCJhZmlpNTc1MTIiLCJhZmlpNTc1MTMiLCJhZmlpNTc1MTQiLCJhZmlpNTc1MTkiLCJhZmlpNTc1MzQiLCJhZmlpNTc2MzYiLCJhZmlpNTc2NDUiLCJhZmlpNTc2NTgiLCJhZmlpNTc2NjQiLCJhZmlpNTc2NjUiLCJhZmlpNTc2NjYiLCJhZmlpNTc2NjciLCJhZmlpNTc2NjgiLCJhZmlpNTc2NjkiLCJhZmlpNTc2NzAiLCJhZmlpNTc2NzEiLCJhZmlpNTc2NzIiLCJhZmlpNTc2NzMiLCJhZmlpNTc2NzQiLCJhZmlpNTc2NzUiLCJhZmlpNTc2NzYiLCJhZmlpNTc2NzciLCJhZmlpNTc2NzgiLCJhZmlpNTc2NzkiLCJhZmlpNTc2ODAiLCJhZmlpNTc2ODEiLCJhZmlpNTc2ODIiLCJhZmlpNTc2ODMiLCJhZmlpNTc2ODQiLCJhZmlpNTc2ODUiLCJhZmlpNTc2ODYiLCJhZmlpNTc2ODciLCJhZmlpNTc2ODgiLCJhZmlpNTc2ODkiLCJhZmlpNTc2OTAiLCJhZmlpNTc2OTQiLCJhZmlpNTc2OTUiLCJhZmlpNTc3MDAiLCJhZmlpNTc3MDUiLCJhZmlpNTc3MTYiLCJhZmlpNTc3MTciLCJhZmlpNTc3MTgiLCJhZmlpNTc3MjMiLCJhZmlpNTc3OTMiLCJhZmlpNTc3OTQiLCJhZmlpNTc3OTUiLCJhZmlpNTc3OTYiLCJhZmlpNTc3OTciLCJhZmlpNTc3OTgiLCJhZmlpNTc3OTkiLCJhZmlpNTc4MDAiLCJhZmlpNTc4MDEiLCJhZmlpNTc4MDIiLCJhZmlpNTc4MDMiLCJhZmlpNTc4MDQiLCJhZmlpNTc4MDYiLCJhZmlpNTc4MDciLCJhZmlpNTc4MzkiLCJhZmlpNTc4NDEiLCJhZmlpNTc4NDIiLCJhZmlpNTc5MjkiLCJhZmlpNjEyNDgiLCJhZmlpNjEyODkiLCJhZmlpNjEzNTIiLCJhZmlpNjE1NzMiLCJhZmlpNjE1NzQiLCJhZmlpNjE1NzUiLCJhZmlpNjE2NjQiLCJhZmlpNjMxNjciLCJhZmlpNjQ5MzciLCJhZ3JhdmUiLCJhZ3VqYXJhdGkiLCJhZ3VybXVraGkiLCJhaGlyYWdhbmEiLCJhaG9va2Fib3ZlIiwiYWliZW5nYWxpIiwiYWlib3BvbW9mbyIsImFpZGV2YSIsImFpZWN5cmlsbGljIiwiYWlndWphcmF0aSIsImFpZ3VybXVraGkiLCJhaW1hdHJhZ3VybXVraGkiLCJhaW5hcmFiaWMiLCJhaW5maW5hbGFyYWJpYyIsImFpbmluaXRpYWxhcmFiaWMiLCJhaW5tZWRpYWxhcmFiaWMiLCJhaW52ZXJ0ZWRicmV2ZSIsImFpdm93ZWxzaWduYmVuZ2FsaSIsImFpdm93ZWxzaWduZGV2YSIsImFpdm93ZWxzaWduZ3VqYXJhdGkiLCJha2F0YWthbmEiLCJha2F0YWthbmFoYWxmd2lkdGgiLCJha29yZWFuIiwiYWxlZiIsImFsZWZhcmFiaWMiLCJhbGVmZGFnZXNoaGVicmV3IiwiYWxlZmZpbmFsYXJhYmljIiwiYWxlZmhhbXphYWJvdmVhcmFiaWMiLCJhbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljIiwiYWxlZmhhbXphYmVsb3dhcmFiaWMiLCJhbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljIiwiYWxlZmhlYnJldyIsImFsZWZsYW1lZGhlYnJldyIsImFsZWZtYWRkYWFib3ZlYXJhYmljIiwiYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYyIsImFsZWZtYWtzdXJhYXJhYmljIiwiYWxlZm1ha3N1cmFmaW5hbGFyYWJpYyIsImFsZWZtYWtzdXJhaW5pdGlhbGFyYWJpYyIsImFsZWZtYWtzdXJhbWVkaWFsYXJhYmljIiwiYWxlZnBhdGFoaGVicmV3IiwiYWxlZnFhbWF0c2hlYnJldyIsImFsZXBoIiwiYWxsZXF1YWwiLCJhbHBoYXRvbm9zIiwiYW1hY3JvbiIsImFtb25vc3BhY2UiLCJhbXBlcnNhbmQiLCJhbXBlcnNhbmRtb25vc3BhY2UiLCJhbXBlcnNhbmRzbWFsbCIsImFtc3F1YXJlIiwiYW5ib3BvbW9mbyIsImFuZ2JvcG9tb2ZvIiwiYW5nYnJhY2tldGxlZnQiLCJhbmdicmFja2V0cmlnaHQiLCJhbmdraGFua2h1dGhhaSIsImFuZ2xlYnJhY2tldGxlZnQiLCJhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwiLCJhbmdsZWJyYWNrZXRyaWdodCIsImFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwiLCJhbmdsZWxlZnQiLCJhbmdsZXJpZ2h0IiwiYW5nc3Ryb20iLCJhbm90ZWxlaWEiLCJhbnVkYXR0YWRldmEiLCJhbnVzdmFyYWJlbmdhbGkiLCJhbnVzdmFyYWRldmEiLCJhbnVzdmFyYWd1amFyYXRpIiwiYW9nb25layIsImFwYWF0b3NxdWFyZSIsImFwYXJlbiIsImFwb3N0cm9waGVhcm1lbmlhbiIsImFwb3N0cm9waGVtb2QiLCJhcHBsZSIsImFwcHJvYWNoZXMiLCJhcHByb3hlcXVhbCIsImFwcHJveGVxdWFsb3JpbWFnZSIsImFwcHJveGltYXRlbHllcXVhbCIsImFyYWVhZWtvcmVhbiIsImFyYWVha29yZWFuIiwiYXJjIiwiYXJpZ2h0aGFsZnJpbmciLCJhcmluZyIsImFyaW5nYWN1dGUiLCJhcmluZ2JlbG93IiwiYXJyb3dib3RoIiwiYXJyb3dkYXNoZG93biIsImFycm93ZGFzaGxlZnQiLCJhcnJvd2Rhc2hyaWdodCIsImFycm93ZGFzaHVwIiwiYXJyb3dkYmxib3RoIiwiYXJyb3dkYmxkb3duIiwiYXJyb3dkYmxsZWZ0IiwiYXJyb3dkYmxyaWdodCIsImFycm93ZGJsdXAiLCJhcnJvd2Rvd24iLCJhcnJvd2Rvd25sZWZ0IiwiYXJyb3dkb3ducmlnaHQiLCJhcnJvd2Rvd253aGl0ZSIsImFycm93aGVhZGRvd25tb2QiLCJhcnJvd2hlYWRsZWZ0bW9kIiwiYXJyb3doZWFkcmlnaHRtb2QiLCJhcnJvd2hlYWR1cG1vZCIsImFycm93aG9yaXpleCIsImFycm93bGVmdCIsImFycm93bGVmdGRibCIsImFycm93bGVmdGRibHN0cm9rZSIsImFycm93bGVmdG92ZXJyaWdodCIsImFycm93bGVmdHdoaXRlIiwiYXJyb3dyaWdodCIsImFycm93cmlnaHRkYmxzdHJva2UiLCJhcnJvd3JpZ2h0aGVhdnkiLCJhcnJvd3JpZ2h0b3ZlcmxlZnQiLCJhcnJvd3JpZ2h0d2hpdGUiLCJhcnJvd3RhYmxlZnQiLCJhcnJvd3RhYnJpZ2h0IiwiYXJyb3d1cCIsImFycm93dXBkbiIsImFycm93dXBkbmJzZSIsImFycm93dXBkb3duYmFzZSIsImFycm93dXBsZWZ0IiwiYXJyb3d1cGxlZnRvZmRvd24iLCJhcnJvd3VwcmlnaHQiLCJhcnJvd3Vwd2hpdGUiLCJhcnJvd3ZlcnRleCIsImFzY2lpY2lyY3VtIiwiYXNjaWljaXJjdW1tb25vc3BhY2UiLCJhc2NpaXRpbGRlIiwiYXNjaWl0aWxkZW1vbm9zcGFjZSIsImFzY3JpcHQiLCJhc2NyaXB0dHVybmVkIiwiYXNtYWxsaGlyYWdhbmEiLCJhc21hbGxrYXRha2FuYSIsImFzbWFsbGthdGFrYW5haGFsZndpZHRoIiwiYXN0ZXJpc2siLCJhc3Rlcmlza2FsdG9uZWFyYWJpYyIsImFzdGVyaXNrYXJhYmljIiwiYXN0ZXJpc2ttYXRoIiwiYXN0ZXJpc2ttb25vc3BhY2UiLCJhc3Rlcmlza3NtYWxsIiwiYXN0ZXJpc20iLCJhc3VwZXJpb3IiLCJhc3ltcHRvdGljYWxseWVxdWFsIiwiYXRpbGRlIiwiYXRtb25vc3BhY2UiLCJhdHNtYWxsIiwiYXR1cm5lZCIsImF1YmVuZ2FsaSIsImF1Ym9wb21vZm8iLCJhdWRldmEiLCJhdWd1amFyYXRpIiwiYXVndXJtdWtoaSIsImF1bGVuZ3RobWFya2JlbmdhbGkiLCJhdW1hdHJhZ3VybXVraGkiLCJhdXZvd2Vsc2lnbmJlbmdhbGkiLCJhdXZvd2Vsc2lnbmRldmEiLCJhdXZvd2Vsc2lnbmd1amFyYXRpIiwiYXZhZ3JhaGFkZXZhIiwiYXliYXJtZW5pYW4iLCJheWluIiwiYXlpbmFsdG9uZWhlYnJldyIsImF5aW5oZWJyZXciLCJiYWJlbmdhbGkiLCJiYWNrc2xhc2giLCJiYWNrc2xhc2htb25vc3BhY2UiLCJiYWRldmEiLCJiYWd1amFyYXRpIiwiYmFndXJtdWtoaSIsImJhaGlyYWdhbmEiLCJiYWh0dGhhaSIsImJha2F0YWthbmEiLCJiYXIiLCJiYXJtb25vc3BhY2UiLCJiYm9wb21vZm8iLCJiY2lyY2xlIiwiYmRvdGFjY2VudCIsImJkb3RiZWxvdyIsImJlYW1lZHNpeHRlZW50aG5vdGVzIiwiYmVjYXVzZSIsImJlY3lyaWxsaWMiLCJiZWhhcmFiaWMiLCJiZWhmaW5hbGFyYWJpYyIsImJlaGluaXRpYWxhcmFiaWMiLCJiZWhpcmFnYW5hIiwiYmVobWVkaWFsYXJhYmljIiwiYmVobWVlbWluaXRpYWxhcmFiaWMiLCJiZWhtZWVtaXNvbGF0ZWRhcmFiaWMiLCJiZWhub29uZmluYWxhcmFiaWMiLCJiZWthdGFrYW5hIiwiYmVuYXJtZW5pYW4iLCJiZXQiLCJiZXRhc3ltYm9sZ3JlZWsiLCJiZXRkYWdlc2giLCJiZXRkYWdlc2hoZWJyZXciLCJiZXRoZWJyZXciLCJiZXRyYWZlaGVicmV3IiwiYmhhYmVuZ2FsaSIsImJoYWRldmEiLCJiaGFndWphcmF0aSIsImJoYWd1cm11a2hpIiwiYmhvb2siLCJiaWhpcmFnYW5hIiwiYmlrYXRha2FuYSIsImJpbGFiaWFsY2xpY2siLCJiaW5kaWd1cm11a2hpIiwiYmlydXNxdWFyZSIsImJsYWNrY2lyY2xlIiwiYmxhY2tkaWFtb25kIiwiYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZSIsImJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciIsImJsYWNrbGVmdHBvaW50aW5ndHJpYW5nbGUiLCJibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdCIsImJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwiLCJibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQiLCJibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbCIsImJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUiLCJibGFja2xvd2VycmlnaHR0cmlhbmdsZSIsImJsYWNrcmVjdGFuZ2xlIiwiYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciIsImJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlIiwiYmxhY2tzbWFsbHNxdWFyZSIsImJsYWNrc21pbGluZ2ZhY2UiLCJibGFja3NxdWFyZSIsImJsYWNrc3RhciIsImJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUiLCJibGFja3VwcGVycmlnaHR0cmlhbmdsZSIsImJsYWNrdXBwb2ludGluZ3NtYWxsdHJpYW5nbGUiLCJibGFja3VwcG9pbnRpbmd0cmlhbmdsZSIsImJsYW5rIiwiYmxpbmViZWxvdyIsImJtb25vc3BhY2UiLCJib2JhaW1haXRoYWkiLCJib2hpcmFnYW5hIiwiYm9rYXRha2FuYSIsImJwYXJlbiIsImJxc3F1YXJlIiwiYnJhY2VleCIsImJyYWNlbGVmdCIsImJyYWNlbGVmdGJ0IiwiYnJhY2VsZWZ0bWlkIiwiYnJhY2VsZWZ0bW9ub3NwYWNlIiwiYnJhY2VsZWZ0c21hbGwiLCJicmFjZWxlZnR0cCIsImJyYWNlbGVmdHZlcnRpY2FsIiwiYnJhY2VyaWdodCIsImJyYWNlcmlnaHRidCIsImJyYWNlcmlnaHRtaWQiLCJicmFjZXJpZ2h0bW9ub3NwYWNlIiwiYnJhY2VyaWdodHNtYWxsIiwiYnJhY2VyaWdodHRwIiwiYnJhY2VyaWdodHZlcnRpY2FsIiwiYnJhY2tldGxlZnQiLCJicmFja2V0bGVmdGJ0IiwiYnJhY2tldGxlZnRleCIsImJyYWNrZXRsZWZ0bW9ub3NwYWNlIiwiYnJhY2tldGxlZnR0cCIsImJyYWNrZXRyaWdodCIsImJyYWNrZXRyaWdodGJ0IiwiYnJhY2tldHJpZ2h0ZXgiLCJicmFja2V0cmlnaHRtb25vc3BhY2UiLCJicmFja2V0cmlnaHR0cCIsImJyZXZlIiwiYnJldmViZWxvd2NtYiIsImJyZXZlY21iIiwiYnJldmVpbnZlcnRlZGJlbG93Y21iIiwiYnJldmVpbnZlcnRlZGNtYiIsImJyZXZlaW52ZXJ0ZWRkb3VibGVjbWIiLCJicmlkZ2ViZWxvd2NtYiIsImJyaWRnZWludmVydGVkYmVsb3djbWIiLCJicm9rZW5iYXIiLCJic3Ryb2tlIiwiYnN1cGVyaW9yIiwiYnRvcGJhciIsImJ1aGlyYWdhbmEiLCJidWthdGFrYW5hIiwiYnVsbGV0IiwiYnVsbGV0aW52ZXJzZSIsImJ1bGxldG9wZXJhdG9yIiwiYnVsbHNleWUiLCJjYWFybWVuaWFuIiwiY2FiZW5nYWxpIiwiY2FjdXRlIiwiY2FkZXZhIiwiY2FndWphcmF0aSIsImNhZ3VybXVraGkiLCJjYWxzcXVhcmUiLCJjYW5kcmFiaW5kdWJlbmdhbGkiLCJjYW5kcmFiaW5kdWNtYiIsImNhbmRyYWJpbmR1ZGV2YSIsImNhbmRyYWJpbmR1Z3VqYXJhdGkiLCJjYXBzbG9jayIsImNhcmVvZiIsImNhcm9uIiwiY2Fyb25iZWxvd2NtYiIsImNhcm9uY21iIiwiY2FycmlhZ2VyZXR1cm4iLCJjYm9wb21vZm8iLCJjY2Fyb24iLCJjY2VkaWxsYSIsImNjZWRpbGxhYWN1dGUiLCJjY2lyY2xlIiwiY2NpcmN1bWZsZXgiLCJjY3VybCIsImNkb3QiLCJjZG90YWNjZW50IiwiY2RzcXVhcmUiLCJjZWRpbGxhIiwiY2VkaWxsYWNtYiIsImNlbnQiLCJjZW50aWdyYWRlIiwiY2VudGluZmVyaW9yIiwiY2VudG1vbm9zcGFjZSIsImNlbnRvbGRzdHlsZSIsImNlbnRzdXBlcmlvciIsImNoYWFybWVuaWFuIiwiY2hhYmVuZ2FsaSIsImNoYWRldmEiLCJjaGFndWphcmF0aSIsImNoYWd1cm11a2hpIiwiY2hib3BvbW9mbyIsImNoZWFia2hhc2lhbmN5cmlsbGljIiwiY2hlY2ttYXJrIiwiY2hlY3lyaWxsaWMiLCJjaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyIsImNoZWRlc2NlbmRlcmN5cmlsbGljIiwiY2hlZGllcmVzaXNjeXJpbGxpYyIsImNoZWhhcm1lbmlhbiIsImNoZWtoYWthc3NpYW5jeXJpbGxpYyIsImNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMiLCJjaGkiLCJjaGlldWNoYWNpcmNsZWtvcmVhbiIsImNoaWV1Y2hhcGFyZW5rb3JlYW4iLCJjaGlldWNoY2lyY2xla29yZWFuIiwiY2hpZXVjaGtvcmVhbiIsImNoaWV1Y2hwYXJlbmtvcmVhbiIsImNob2NoYW5ndGhhaSIsImNob2NoYW50aGFpIiwiY2hvY2hpbmd0aGFpIiwiY2hvY2hvZXRoYWkiLCJjaG9vayIsImNpZXVjYWNpcmNsZWtvcmVhbiIsImNpZXVjYXBhcmVua29yZWFuIiwiY2lldWNjaXJjbGVrb3JlYW4iLCJjaWV1Y2tvcmVhbiIsImNpZXVjcGFyZW5rb3JlYW4iLCJjaWV1Y3VwYXJlbmtvcmVhbiIsImNpcmNsZSIsImNpcmNsZWNvcHlydCIsImNpcmNsZW11bHRpcGx5IiwiY2lyY2xlb3QiLCJjaXJjbGVwbHVzIiwiY2lyY2xlcG9zdGFsbWFyayIsImNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrIiwiY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrIiwiY2lyY3VtZmxleCIsImNpcmN1bWZsZXhiZWxvd2NtYiIsImNpcmN1bWZsZXhjbWIiLCJjbGlja2FsdmVvbGFyIiwiY2xpY2tkZW50YWwiLCJjbGlja2xhdGVyYWwiLCJjbGlja3JldHJvZmxleCIsImNsdWIiLCJjbHVic3VpdGJsYWNrIiwiY2x1YnN1aXR3aGl0ZSIsImNtY3ViZWRzcXVhcmUiLCJjbW9ub3NwYWNlIiwiY21zcXVhcmVkc3F1YXJlIiwiY29hcm1lbmlhbiIsImNvbG9uIiwiY29sb25tb25ldGFyeSIsImNvbG9ubW9ub3NwYWNlIiwiY29sb25zaWduIiwiY29sb25zbWFsbCIsImNvbG9udHJpYW5ndWxhcmhhbGZtb2QiLCJjb2xvbnRyaWFuZ3VsYXJtb2QiLCJjb21tYSIsImNvbW1hYWJvdmVjbWIiLCJjb21tYWFib3ZlcmlnaHRjbWIiLCJjb21tYWFjY2VudCIsImNvbW1hYXJhYmljIiwiY29tbWFhcm1lbmlhbiIsImNvbW1haW5mZXJpb3IiLCJjb21tYW1vbm9zcGFjZSIsImNvbW1hcmV2ZXJzZWRhYm92ZWNtYiIsImNvbW1hcmV2ZXJzZWRtb2QiLCJjb21tYXNtYWxsIiwiY29tbWFzdXBlcmlvciIsImNvbW1hdHVybmVkYWJvdmVjbWIiLCJjb21tYXR1cm5lZG1vZCIsImNvbXBhc3MiLCJjb25ncnVlbnQiLCJjb250b3VyaW50ZWdyYWwiLCJjb250cm9sIiwiY29udHJvbEFDSyIsImNvbnRyb2xCRUwiLCJjb250cm9sQlMiLCJjb250cm9sQ0FOIiwiY29udHJvbENSIiwiY29udHJvbERDMSIsImNvbnRyb2xEQzIiLCJjb250cm9sREMzIiwiY29udHJvbERDNCIsImNvbnRyb2xERUwiLCJjb250cm9sRExFIiwiY29udHJvbEVNIiwiY29udHJvbEVOUSIsImNvbnRyb2xFT1QiLCJjb250cm9sRVNDIiwiY29udHJvbEVUQiIsImNvbnRyb2xFVFgiLCJjb250cm9sRkYiLCJjb250cm9sRlMiLCJjb250cm9sR1MiLCJjb250cm9sSFQiLCJjb250cm9sTEYiLCJjb250cm9sTkFLIiwiY29udHJvbE5VTEwiLCJjb250cm9sUlMiLCJjb250cm9sU0kiLCJjb250cm9sU08iLCJjb250cm9sU09UIiwiY29udHJvbFNUWCIsImNvbnRyb2xTVUIiLCJjb250cm9sU1lOIiwiY29udHJvbFVTIiwiY29udHJvbFZUIiwiY29weXJpZ2h0c2FucyIsImNvcHlyaWdodHNlcmlmIiwiY29ybmVyYnJhY2tldGxlZnQiLCJjb3JuZXJicmFja2V0bGVmdGhhbGZ3aWR0aCIsImNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWwiLCJjb3JuZXJicmFja2V0cmlnaHQiLCJjb3JuZXJicmFja2V0cmlnaHRoYWxmd2lkdGgiLCJjb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbCIsImNvcnBvcmF0aW9uc3F1YXJlIiwiY29zcXVhcmUiLCJjb3Zlcmtnc3F1YXJlIiwiY3BhcmVuIiwiY3J1emVpcm8iLCJjc3RyZXRjaGVkIiwiY3VybHlhbmQiLCJjdXJseW9yIiwiY3VycmVuY3kiLCJjeXJCcmV2ZSIsImN5ckZsZXgiLCJjeXJicmV2ZSIsImN5cmZsZXgiLCJkYWFybWVuaWFuIiwiZGFiZW5nYWxpIiwiZGFkYXJhYmljIiwiZGFkZXZhIiwiZGFkZmluYWxhcmFiaWMiLCJkYWRpbml0aWFsYXJhYmljIiwiZGFkbWVkaWFsYXJhYmljIiwiZGFnZXNoIiwiZGFnZXNoaGVicmV3IiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwiZGFndWphcmF0aSIsImRhZ3VybXVraGkiLCJkYWhpcmFnYW5hIiwiZGFrYXRha2FuYSIsImRhbGFyYWJpYyIsImRhbGV0IiwiZGFsZXRkYWdlc2giLCJkYWxldGRhZ2VzaGhlYnJldyIsImRhbGV0aGVicmV3IiwiZGFsZmluYWxhcmFiaWMiLCJkYW1tYWFyYWJpYyIsImRhbW1hbG93YXJhYmljIiwiZGFtbWF0YW5hbHRvbmVhcmFiaWMiLCJkYW1tYXRhbmFyYWJpYyIsImRhbmRhIiwiZGFyZ2FoZWJyZXciLCJkYXJnYWxlZnRoZWJyZXciLCJkYXNpYXBuZXVtYXRhY3lyaWxsaWNjbWIiLCJkYmxHcmF2ZSIsImRibGFuZ2xlYnJhY2tldGxlZnQiLCJkYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwiLCJkYmxhbmdsZWJyYWNrZXRyaWdodCIsImRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwiLCJkYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYiIsImRibGFycm93bGVmdCIsImRibGFycm93cmlnaHQiLCJkYmxkYW5kYSIsImRibGdyYXZlIiwiZGJsZ3JhdmVjbWIiLCJkYmxpbnRlZ3JhbCIsImRibGxvd2xpbmUiLCJkYmxsb3dsaW5lY21iIiwiZGJsb3ZlcmxpbmVjbWIiLCJkYmxwcmltZW1vZCIsImRibHZlcnRpY2FsYmFyIiwiZGJsdmVydGljYWxsaW5lYWJvdmVjbWIiLCJkYm9wb21vZm8iLCJkYnNxdWFyZSIsImRjYXJvbiIsImRjZWRpbGxhIiwiZGNpcmNsZSIsImRjaXJjdW1mbGV4YmVsb3ciLCJkY3JvYXQiLCJkZGFiZW5nYWxpIiwiZGRhZGV2YSIsImRkYWd1amFyYXRpIiwiZGRhZ3VybXVraGkiLCJkZGFsYXJhYmljIiwiZGRhbGZpbmFsYXJhYmljIiwiZGRkaGFkZXZhIiwiZGRoYWJlbmdhbGkiLCJkZGhhZGV2YSIsImRkaGFndWphcmF0aSIsImRkaGFndXJtdWtoaSIsImRkb3RhY2NlbnQiLCJkZG90YmVsb3ciLCJkZWNpbWFsc2VwYXJhdG9yYXJhYmljIiwiZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW4iLCJkZWN5cmlsbGljIiwiZGVncmVlIiwiZGVoaWhlYnJldyIsImRlaGlyYWdhbmEiLCJkZWljb3B0aWMiLCJkZWthdGFrYW5hIiwiZGVsZXRlbGVmdCIsImRlbGV0ZXJpZ2h0IiwiZGVsdGF0dXJuZWQiLCJkZW5vbWluYXRvcm1pbnVzb25lbnVtZXJhdG9yYmVuZ2FsaSIsImRlemgiLCJkaGFiZW5nYWxpIiwiZGhhZGV2YSIsImRoYWd1amFyYXRpIiwiZGhhZ3VybXVraGkiLCJkaG9vayIsImRpYWx5dGlrYXRvbm9zIiwiZGlhbHl0aWthdG9ub3NjbWIiLCJkaWFtb25kIiwiZGlhbW9uZHN1aXR3aGl0ZSIsImRpZXJlc2lzIiwiZGllcmVzaXNhY3V0ZSIsImRpZXJlc2lzYmVsb3djbWIiLCJkaWVyZXNpc2NtYiIsImRpZXJlc2lzZ3JhdmUiLCJkaWVyZXNpc3Rvbm9zIiwiZGloaXJhZ2FuYSIsImRpa2F0YWthbmEiLCJkaXR0b21hcmsiLCJkaXZpZGUiLCJkaXZpZGVzIiwiZGl2aXNpb25zbGFzaCIsImRqZWN5cmlsbGljIiwiZGtzaGFkZSIsImRsaW5lYmVsb3ciLCJkbHNxdWFyZSIsImRtYWNyb24iLCJkbW9ub3NwYWNlIiwiZG5ibG9jayIsImRvY2hhZGF0aGFpIiwiZG9kZWt0aGFpIiwiZG9oaXJhZ2FuYSIsImRva2F0YWthbmEiLCJkb2xsYXIiLCJkb2xsYXJpbmZlcmlvciIsImRvbGxhcm1vbm9zcGFjZSIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc21hbGwiLCJkb2xsYXJzdXBlcmlvciIsImRvbmciLCJkb3J1c3F1YXJlIiwiZG90YWNjZW50IiwiZG90YWNjZW50Y21iIiwiZG90YmVsb3djbWIiLCJkb3RiZWxvd2NvbWIiLCJkb3RrYXRha2FuYSIsImRvdGxlc3NpIiwiZG90bGVzc2oiLCJkb3RsZXNzanN0cm9rZWhvb2siLCJkb3RtYXRoIiwiZG90dGVkY2lyY2xlIiwiZG91YmxleW9kcGF0YWgiLCJkb3VibGV5b2RwYXRhaGhlYnJldyIsImRvd250YWNrYmVsb3djbWIiLCJkb3dudGFja21vZCIsImRwYXJlbiIsImRzdXBlcmlvciIsImR0YWlsIiwiZHRvcGJhciIsImR1aGlyYWdhbmEiLCJkdWthdGFrYW5hIiwiZHoiLCJkemFsdG9uZSIsImR6Y2Fyb24iLCJkemN1cmwiLCJkemVhYmtoYXNpYW5jeXJpbGxpYyIsImR6ZWN5cmlsbGljIiwiZHpoZWN5cmlsbGljIiwiZWFjdXRlIiwiZWFydGgiLCJlYmVuZ2FsaSIsImVib3BvbW9mbyIsImVicmV2ZSIsImVjYW5kcmFkZXZhIiwiZWNhbmRyYWd1amFyYXRpIiwiZWNhbmRyYXZvd2Vsc2lnbmRldmEiLCJlY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkiLCJlY2Fyb24iLCJlY2VkaWxsYWJyZXZlIiwiZWNoYXJtZW5pYW4iLCJlY2h5aXduYXJtZW5pYW4iLCJlY2lyY2xlIiwiZWNpcmN1bWZsZXgiLCJlY2lyY3VtZmxleGFjdXRlIiwiZWNpcmN1bWZsZXhiZWxvdyIsImVjaXJjdW1mbGV4ZG90YmVsb3ciLCJlY2lyY3VtZmxleGdyYXZlIiwiZWNpcmN1bWZsZXhob29rYWJvdmUiLCJlY2lyY3VtZmxleHRpbGRlIiwiZWN5cmlsbGljIiwiZWRibGdyYXZlIiwiZWRldmEiLCJlZGllcmVzaXMiLCJlZG90IiwiZWRvdGFjY2VudCIsImVkb3RiZWxvdyIsImVlZ3VybXVraGkiLCJlZW1hdHJhZ3VybXVraGkiLCJlZmN5cmlsbGljIiwiZWdyYXZlIiwiZWd1amFyYXRpIiwiZWhhcm1lbmlhbiIsImVoYm9wb21vZm8iLCJlaGlyYWdhbmEiLCJlaG9va2Fib3ZlIiwiZWlib3BvbW9mbyIsImVpZ2h0IiwiZWlnaHRhcmFiaWMiLCJlaWdodGJlbmdhbGkiLCJlaWdodGNpcmNsZSIsImVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiIsImVpZ2h0ZGV2YSIsImVpZ2h0ZWVuY2lyY2xlIiwiZWlnaHRlZW5wYXJlbiIsImVpZ2h0ZWVucGVyaW9kIiwiZWlnaHRndWphcmF0aSIsImVpZ2h0Z3VybXVraGkiLCJlaWdodGhhY2thcmFiaWMiLCJlaWdodGhhbmd6aG91IiwiZWlnaHRobm90ZWJlYW1lZCIsImVpZ2h0aWRlb2dyYXBoaWNwYXJlbiIsImVpZ2h0aW5mZXJpb3IiLCJlaWdodG1vbm9zcGFjZSIsImVpZ2h0b2xkc3R5bGUiLCJlaWdodHBhcmVuIiwiZWlnaHRwZXJpb2QiLCJlaWdodHBlcnNpYW4iLCJlaWdodHJvbWFuIiwiZWlnaHRzdXBlcmlvciIsImVpZ2h0dGhhaSIsImVpbnZlcnRlZGJyZXZlIiwiZWlvdGlmaWVkY3lyaWxsaWMiLCJla2F0YWthbmEiLCJla2F0YWthbmFoYWxmd2lkdGgiLCJla29ua2FyZ3VybXVraGkiLCJla29yZWFuIiwiZWxjeXJpbGxpYyIsImVsZXZlbmNpcmNsZSIsImVsZXZlbnBhcmVuIiwiZWxldmVucGVyaW9kIiwiZWxldmVucm9tYW4iLCJlbGxpcHNpcyIsImVsbGlwc2lzdmVydGljYWwiLCJlbWFjcm9uIiwiZW1hY3JvbmFjdXRlIiwiZW1hY3JvbmdyYXZlIiwiZW1jeXJpbGxpYyIsImVtZGFzaCIsImVtZGFzaHZlcnRpY2FsIiwiZW1vbm9zcGFjZSIsImVtcGhhc2lzbWFya2FybWVuaWFuIiwiZW1wdHlzZXQiLCJlbmJvcG9tb2ZvIiwiZW5jeXJpbGxpYyIsImVuZGFzaCIsImVuZGFzaHZlcnRpY2FsIiwiZW5kZXNjZW5kZXJjeXJpbGxpYyIsImVuZyIsImVuZ2JvcG9tb2ZvIiwiZW5naGVjeXJpbGxpYyIsImVuaG9va2N5cmlsbGljIiwiZW5zcGFjZSIsImVvZ29uZWsiLCJlb2tvcmVhbiIsImVvcGVuIiwiZW9wZW5jbG9zZWQiLCJlb3BlbnJldmVyc2VkIiwiZW9wZW5yZXZlcnNlZGNsb3NlZCIsImVvcGVucmV2ZXJzZWRob29rIiwiZXBhcmVuIiwiZXBzaWxvbnRvbm9zIiwiZXF1YWwiLCJlcXVhbG1vbm9zcGFjZSIsImVxdWFsc21hbGwiLCJlcXVhbHN1cGVyaW9yIiwiZXF1aXZhbGVuY2UiLCJlcmJvcG9tb2ZvIiwiZXJjeXJpbGxpYyIsImVyZXZlcnNlZCIsImVyZXZlcnNlZGN5cmlsbGljIiwiZXNjeXJpbGxpYyIsImVzZGVzY2VuZGVyY3lyaWxsaWMiLCJlc2giLCJlc2hjdXJsIiwiZXNob3J0ZGV2YSIsImVzaG9ydHZvd2Vsc2lnbmRldmEiLCJlc2hyZXZlcnNlZGxvb3AiLCJlc2hzcXVhdHJldmVyc2VkIiwiZXNtYWxsaGlyYWdhbmEiLCJlc21hbGxrYXRha2FuYSIsImVzbWFsbGthdGFrYW5haGFsZndpZHRoIiwiZXN0aW1hdGVkIiwiZXN1cGVyaW9yIiwiZXRhIiwiZXRhcm1lbmlhbiIsImV0YXRvbm9zIiwiZXRoIiwiZXRpbGRlIiwiZXRpbGRlYmVsb3ciLCJldG5haHRhZm91a2hoZWJyZXciLCJldG5haHRhZm91a2hsZWZ0aGVicmV3IiwiZXRuYWh0YWhlYnJldyIsImV0bmFodGFsZWZ0aGVicmV3IiwiZXR1cm5lZCIsImV1a29yZWFuIiwiZXVybyIsImV2b3dlbHNpZ25iZW5nYWxpIiwiZXZvd2Vsc2lnbmRldmEiLCJldm93ZWxzaWduZ3VqYXJhdGkiLCJleGNsYW0iLCJleGNsYW1hcm1lbmlhbiIsImV4Y2xhbWRibCIsImV4Y2xhbWRvd24iLCJleGNsYW1kb3duc21hbGwiLCJleGNsYW1tb25vc3BhY2UiLCJleGNsYW1zbWFsbCIsImV4aXN0ZW50aWFsIiwiZXpoIiwiZXpoY2Fyb24iLCJlemhjdXJsIiwiZXpocmV2ZXJzZWQiLCJlemh0YWlsIiwiZmFkZXZhIiwiZmFndXJtdWtoaSIsImZhaHJlbmhlaXQiLCJmYXRoYWFyYWJpYyIsImZhdGhhbG93YXJhYmljIiwiZmF0aGF0YW5hcmFiaWMiLCJmYm9wb21vZm8iLCJmY2lyY2xlIiwiZmRvdGFjY2VudCIsImZlaGFyYWJpYyIsImZlaGFybWVuaWFuIiwiZmVoZmluYWxhcmFiaWMiLCJmZWhpbml0aWFsYXJhYmljIiwiZmVobWVkaWFsYXJhYmljIiwiZmVpY29wdGljIiwiZmVtYWxlIiwiZmYiLCJmX2YiLCJmZmkiLCJmZmwiLCJmaSIsImZpZnRlZW5jaXJjbGUiLCJmaWZ0ZWVucGFyZW4iLCJmaWZ0ZWVucGVyaW9kIiwiZmlndXJlZGFzaCIsImZpbGxlZGJveCIsImZpbGxlZHJlY3QiLCJmaW5hbGthZiIsImZpbmFsa2FmZGFnZXNoIiwiZmluYWxrYWZkYWdlc2hoZWJyZXciLCJmaW5hbGthZmhlYnJldyIsImZpbmFsbWVtIiwiZmluYWxtZW1oZWJyZXciLCJmaW5hbG51biIsImZpbmFsbnVuaGVicmV3IiwiZmluYWxwZSIsImZpbmFscGVoZWJyZXciLCJmaW5hbHRzYWRpIiwiZmluYWx0c2FkaWhlYnJldyIsImZpcnN0dG9uZWNoaW5lc2UiLCJmaXNoZXllIiwiZml0YWN5cmlsbGljIiwiZml2ZSIsImZpdmVhcmFiaWMiLCJmaXZlYmVuZ2FsaSIsImZpdmVjaXJjbGUiLCJmaXZlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiIsImZpdmVkZXZhIiwiZml2ZWVpZ2h0aHMiLCJmaXZlZ3VqYXJhdGkiLCJmaXZlZ3VybXVraGkiLCJmaXZlaGFja2FyYWJpYyIsImZpdmVoYW5nemhvdSIsImZpdmVpZGVvZ3JhcGhpY3BhcmVuIiwiZml2ZWluZmVyaW9yIiwiZml2ZW1vbm9zcGFjZSIsImZpdmVvbGRzdHlsZSIsImZpdmVwYXJlbiIsImZpdmVwZXJpb2QiLCJmaXZlcGVyc2lhbiIsImZpdmVyb21hbiIsImZpdmVzdXBlcmlvciIsImZpdmV0aGFpIiwiZmwiLCJmbG9yaW4iLCJmbW9ub3NwYWNlIiwiZm1zcXVhcmUiLCJmb2ZhbnRoYWkiLCJmb2ZhdGhhaSIsImZvbmdtYW50aGFpIiwiZm9yYWxsIiwiZm91ciIsImZvdXJhcmFiaWMiLCJmb3VyYmVuZ2FsaSIsImZvdXJjaXJjbGUiLCJmb3VyY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiIsImZvdXJkZXZhIiwiZm91cmd1amFyYXRpIiwiZm91cmd1cm11a2hpIiwiZm91cmhhY2thcmFiaWMiLCJmb3VyaGFuZ3pob3UiLCJmb3VyaWRlb2dyYXBoaWNwYXJlbiIsImZvdXJpbmZlcmlvciIsImZvdXJtb25vc3BhY2UiLCJmb3VybnVtZXJhdG9yYmVuZ2FsaSIsImZvdXJvbGRzdHlsZSIsImZvdXJwYXJlbiIsImZvdXJwZXJpb2QiLCJmb3VycGVyc2lhbiIsImZvdXJyb21hbiIsImZvdXJzdXBlcmlvciIsImZvdXJ0ZWVuY2lyY2xlIiwiZm91cnRlZW5wYXJlbiIsImZvdXJ0ZWVucGVyaW9kIiwiZm91cnRoYWkiLCJmb3VydGh0b25lY2hpbmVzZSIsImZwYXJlbiIsImZyYWN0aW9uIiwiZnJhbmMiLCJnYWJlbmdhbGkiLCJnYWN1dGUiLCJnYWRldmEiLCJnYWZhcmFiaWMiLCJnYWZmaW5hbGFyYWJpYyIsImdhZmluaXRpYWxhcmFiaWMiLCJnYWZtZWRpYWxhcmFiaWMiLCJnYWd1amFyYXRpIiwiZ2FndXJtdWtoaSIsImdhaGlyYWdhbmEiLCJnYWthdGFrYW5hIiwiZ2FtbWFsYXRpbnNtYWxsIiwiZ2FtbWFzdXBlcmlvciIsImdhbmdpYWNvcHRpYyIsImdib3BvbW9mbyIsImdicmV2ZSIsImdjYXJvbiIsImdjZWRpbGxhIiwiZ2NpcmNsZSIsImdjaXJjdW1mbGV4IiwiZ2NvbW1hYWNjZW50IiwiZ2RvdCIsImdkb3RhY2NlbnQiLCJnZWN5cmlsbGljIiwiZ2VoaXJhZ2FuYSIsImdla2F0YWthbmEiLCJnZW9tZXRyaWNhbGx5ZXF1YWwiLCJnZXJlc2hhY2NlbnRoZWJyZXciLCJnZXJlc2hoZWJyZXciLCJnZXJlc2htdXFkYW1oZWJyZXciLCJnZXJtYW5kYmxzIiwiZ2Vyc2hheWltYWNjZW50aGVicmV3IiwiZ2Vyc2hheWltaGVicmV3IiwiZ2V0YW1hcmsiLCJnaGFiZW5nYWxpIiwiZ2hhZGFybWVuaWFuIiwiZ2hhZGV2YSIsImdoYWd1amFyYXRpIiwiZ2hhZ3VybXVraGkiLCJnaGFpbmFyYWJpYyIsImdoYWluZmluYWxhcmFiaWMiLCJnaGFpbmluaXRpYWxhcmFiaWMiLCJnaGFpbm1lZGlhbGFyYWJpYyIsImdoZW1pZGRsZWhvb2tjeXJpbGxpYyIsImdoZXN0cm9rZWN5cmlsbGljIiwiZ2hldXB0dXJuY3lyaWxsaWMiLCJnaGhhZGV2YSIsImdoaGFndXJtdWtoaSIsImdob29rIiwiZ2h6c3F1YXJlIiwiZ2loaXJhZ2FuYSIsImdpa2F0YWthbmEiLCJnaW1hcm1lbmlhbiIsImdpbWVsIiwiZ2ltZWxkYWdlc2giLCJnaW1lbGRhZ2VzaGhlYnJldyIsImdpbWVsaGVicmV3IiwiZ2plY3lyaWxsaWMiLCJnbG90dGFsaW52ZXJ0ZWRzdHJva2UiLCJnbG90dGFsc3RvcCIsImdsb3R0YWxzdG9waW52ZXJ0ZWQiLCJnbG90dGFsc3RvcG1vZCIsImdsb3R0YWxzdG9wcmV2ZXJzZWQiLCJnbG90dGFsc3RvcHJldmVyc2VkbW9kIiwiZ2xvdHRhbHN0b3ByZXZlcnNlZHN1cGVyaW9yIiwiZ2xvdHRhbHN0b3BzdHJva2UiLCJnbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkIiwiZ21hY3JvbiIsImdtb25vc3BhY2UiLCJnb2hpcmFnYW5hIiwiZ29rYXRha2FuYSIsImdwYXJlbiIsImdwYXNxdWFyZSIsImdyYWRpZW50IiwiZ3JhdmUiLCJncmF2ZWJlbG93Y21iIiwiZ3JhdmVjbWIiLCJncmF2ZWNvbWIiLCJncmF2ZWRldmEiLCJncmF2ZWxvd21vZCIsImdyYXZlbW9ub3NwYWNlIiwiZ3JhdmV0b25lY21iIiwiZ3JlYXRlciIsImdyZWF0ZXJlcXVhbCIsImdyZWF0ZXJlcXVhbG9ybGVzcyIsImdyZWF0ZXJtb25vc3BhY2UiLCJncmVhdGVyb3JlcXVpdmFsZW50IiwiZ3JlYXRlcm9ybGVzcyIsImdyZWF0ZXJvdmVyZXF1YWwiLCJncmVhdGVyc21hbGwiLCJnc2NyaXB0IiwiZ3N0cm9rZSIsImd1aGlyYWdhbmEiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbGxlbW90cmlnaHQiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJndWthdGFrYW5hIiwiZ3VyYW11c3F1YXJlIiwiZ3lzcXVhcmUiLCJoYWFia2hhc2lhbmN5cmlsbGljIiwiaGFhbHRvbmVhcmFiaWMiLCJoYWJlbmdhbGkiLCJoYWRlc2NlbmRlcmN5cmlsbGljIiwiaGFkZXZhIiwiaGFndWphcmF0aSIsImhhZ3VybXVraGkiLCJoYWhhcmFiaWMiLCJoYWhmaW5hbGFyYWJpYyIsImhhaGluaXRpYWxhcmFiaWMiLCJoYWhpcmFnYW5hIiwiaGFobWVkaWFsYXJhYmljIiwiaGFpdHVzcXVhcmUiLCJoYWthdGFrYW5hIiwiaGFrYXRha2FuYWhhbGZ3aWR0aCIsImhhbGFudGd1cm11a2hpIiwiaGFtemFhcmFiaWMiLCJoYW16YWxvd2FyYWJpYyIsImhhbmd1bGZpbGxlciIsImhhcmRzaWduY3lyaWxsaWMiLCJoYXJwb29ubGVmdGJhcmJ1cCIsImhhcnBvb25yaWdodGJhcmJ1cCIsImhhc3F1YXJlIiwiaGF0YWZwYXRhaCIsImhhdGFmcGF0YWgxNiIsImhhdGFmcGF0YWgyMyIsImhhdGFmcGF0YWgyZiIsImhhdGFmcGF0YWhoZWJyZXciLCJoYXRhZnBhdGFobmFycm93aGVicmV3IiwiaGF0YWZwYXRhaHF1YXJ0ZXJoZWJyZXciLCJoYXRhZnBhdGFod2lkZWhlYnJldyIsImhhdGFmcWFtYXRzIiwiaGF0YWZxYW1hdHMxYiIsImhhdGFmcWFtYXRzMjgiLCJoYXRhZnFhbWF0czM0IiwiaGF0YWZxYW1hdHNoZWJyZXciLCJoYXRhZnFhbWF0c25hcnJvd2hlYnJldyIsImhhdGFmcWFtYXRzcXVhcnRlcmhlYnJldyIsImhhdGFmcWFtYXRzd2lkZWhlYnJldyIsImhhdGFmc2Vnb2wiLCJoYXRhZnNlZ29sMTciLCJoYXRhZnNlZ29sMjQiLCJoYXRhZnNlZ29sMzAiLCJoYXRhZnNlZ29saGVicmV3IiwiaGF0YWZzZWdvbG5hcnJvd2hlYnJldyIsImhhdGFmc2Vnb2xxdWFydGVyaGVicmV3IiwiaGF0YWZzZWdvbHdpZGVoZWJyZXciLCJoYmFyIiwiaGJvcG9tb2ZvIiwiaGJyZXZlYmVsb3ciLCJoY2VkaWxsYSIsImhjaXJjbGUiLCJoY2lyY3VtZmxleCIsImhkaWVyZXNpcyIsImhkb3RhY2NlbnQiLCJoZG90YmVsb3ciLCJoZSIsImhlYXJ0IiwiaGVhcnRzdWl0YmxhY2siLCJoZWFydHN1aXR3aGl0ZSIsImhlZGFnZXNoIiwiaGVkYWdlc2hoZWJyZXciLCJoZWhhbHRvbmVhcmFiaWMiLCJoZWhhcmFiaWMiLCJoZWhlYnJldyIsImhlaGZpbmFsYWx0b25lYXJhYmljIiwiaGVoZmluYWxhbHR0d29hcmFiaWMiLCJoZWhmaW5hbGFyYWJpYyIsImhlaGhhbXphYWJvdmVmaW5hbGFyYWJpYyIsImhlaGhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyIsImhlaGluaXRpYWxhbHRvbmVhcmFiaWMiLCJoZWhpbml0aWFsYXJhYmljIiwiaGVoaXJhZ2FuYSIsImhlaG1lZGlhbGFsdG9uZWFyYWJpYyIsImhlaG1lZGlhbGFyYWJpYyIsImhlaXNlaWVyYXNxdWFyZSIsImhla2F0YWthbmEiLCJoZWthdGFrYW5haGFsZndpZHRoIiwiaGVrdXRhYXJ1c3F1YXJlIiwiaGVuZ2hvb2siLCJoZXJ1dHVzcXVhcmUiLCJoZXQiLCJoZXRoZWJyZXciLCJoaG9vayIsImhob29rc3VwZXJpb3IiLCJoaWV1aGFjaXJjbGVrb3JlYW4iLCJoaWV1aGFwYXJlbmtvcmVhbiIsImhpZXVoY2lyY2xla29yZWFuIiwiaGlldWhrb3JlYW4iLCJoaWV1aHBhcmVua29yZWFuIiwiaGloaXJhZ2FuYSIsImhpa2F0YWthbmEiLCJoaWthdGFrYW5haGFsZndpZHRoIiwiaGlyaXEiLCJoaXJpcTE0IiwiaGlyaXEyMSIsImhpcmlxMmQiLCJoaXJpcWhlYnJldyIsImhpcmlxbmFycm93aGVicmV3IiwiaGlyaXFxdWFydGVyaGVicmV3IiwiaGlyaXF3aWRlaGVicmV3IiwiaGxpbmViZWxvdyIsImhtb25vc3BhY2UiLCJob2FybWVuaWFuIiwiaG9oaXB0aGFpIiwiaG9oaXJhZ2FuYSIsImhva2F0YWthbmEiLCJob2thdGFrYW5haGFsZndpZHRoIiwiaG9sYW0iLCJob2xhbTE5IiwiaG9sYW0yNiIsImhvbGFtMzIiLCJob2xhbWhlYnJldyIsImhvbGFtbmFycm93aGVicmV3IiwiaG9sYW1xdWFydGVyaGVicmV3IiwiaG9sYW13aWRlaGVicmV3IiwiaG9ub2todWt0aGFpIiwiaG9va2Fib3ZlY29tYiIsImhvb2tjbWIiLCJob29rcGFsYXRhbGl6ZWRiZWxvd2NtYiIsImhvb2tyZXRyb2ZsZXhiZWxvd2NtYiIsImhvb25zcXVhcmUiLCJob3JpY29wdGljIiwiaG9yaXpvbnRhbGJhciIsImhvcm5jbWIiLCJob3RzcHJpbmdzIiwiaG91c2UiLCJocGFyZW4iLCJoc3VwZXJpb3IiLCJodHVybmVkIiwiaHVoaXJhZ2FuYSIsImh1aWl0b3NxdWFyZSIsImh1a2F0YWthbmEiLCJodWthdGFrYW5haGFsZndpZHRoIiwiaHVuZ2FydW1sYXV0IiwiaHVuZ2FydW1sYXV0Y21iIiwiaHYiLCJoeXBoZW4iLCJoeXBoZW5pbmZlcmlvciIsImh5cGhlbm1vbm9zcGFjZSIsImh5cGhlbnNtYWxsIiwiaHlwaGVuc3VwZXJpb3IiLCJoeXBoZW50d28iLCJpYWN1dGUiLCJpYWN5cmlsbGljIiwiaWJlbmdhbGkiLCJpYm9wb21vZm8iLCJpYnJldmUiLCJpY2Fyb24iLCJpY2lyY2xlIiwiaWNpcmN1bWZsZXgiLCJpY3lyaWxsaWMiLCJpZGJsZ3JhdmUiLCJpZGVvZ3JhcGhlYXJ0aGNpcmNsZSIsImlkZW9ncmFwaGZpcmVjaXJjbGUiLCJpZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW4iLCJpZGVvZ3JhcGhpY2NhbGxwYXJlbiIsImlkZW9ncmFwaGljY2VudHJlY2lyY2xlIiwiaWRlb2dyYXBoaWNjbG9zZSIsImlkZW9ncmFwaGljY29tbWEiLCJpZGVvZ3JhcGhpY2NvbW1hbGVmdCIsImlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbiIsImlkZW9ncmFwaGljY29ycmVjdGNpcmNsZSIsImlkZW9ncmFwaGljZWFydGhwYXJlbiIsImlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuIiwiaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGUiLCJpZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW4iLCJpZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZSIsImlkZW9ncmFwaGljZmluYW5jaWFscGFyZW4iLCJpZGVvZ3JhcGhpY2ZpcmVwYXJlbiIsImlkZW9ncmFwaGljaGF2ZXBhcmVuIiwiaWRlb2dyYXBoaWNoaWdoY2lyY2xlIiwiaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrIiwiaWRlb2dyYXBoaWNsYWJvcmNpcmNsZSIsImlkZW9ncmFwaGljbGFib3JwYXJlbiIsImlkZW9ncmFwaGljbGVmdGNpcmNsZSIsImlkZW9ncmFwaGljbG93Y2lyY2xlIiwiaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZSIsImlkZW9ncmFwaGljbWV0YWxwYXJlbiIsImlkZW9ncmFwaGljbW9vbnBhcmVuIiwiaWRlb2dyYXBoaWNuYW1lcGFyZW4iLCJpZGVvZ3JhcGhpY3BlcmlvZCIsImlkZW9ncmFwaGljcHJpbnRjaXJjbGUiLCJpZGVvZ3JhcGhpY3JlYWNocGFyZW4iLCJpZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuIiwiaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuIiwiaWRlb2dyYXBoaWNyaWdodGNpcmNsZSIsImlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlIiwiaWRlb2dyYXBoaWNzZWxmcGFyZW4iLCJpZGVvZ3JhcGhpY3NvY2lldHlwYXJlbiIsImlkZW9ncmFwaGljc3BhY2UiLCJpZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbiIsImlkZW9ncmFwaGljc3RvY2twYXJlbiIsImlkZW9ncmFwaGljc3R1ZHlwYXJlbiIsImlkZW9ncmFwaGljc3VucGFyZW4iLCJpZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuIiwiaWRlb2dyYXBoaWN3YXRlcnBhcmVuIiwiaWRlb2dyYXBoaWN3b29kcGFyZW4iLCJpZGVvZ3JhcGhpY3plcm8iLCJpZGVvZ3JhcGhtZXRhbGNpcmNsZSIsImlkZW9ncmFwaG1vb25jaXJjbGUiLCJpZGVvZ3JhcGhuYW1lY2lyY2xlIiwiaWRlb2dyYXBoc3VuY2lyY2xlIiwiaWRlb2dyYXBod2F0ZXJjaXJjbGUiLCJpZGVvZ3JhcGh3b29kY2lyY2xlIiwiaWRldmEiLCJpZGllcmVzaXMiLCJpZGllcmVzaXNhY3V0ZSIsImlkaWVyZXNpc2N5cmlsbGljIiwiaWRvdGJlbG93IiwiaWVicmV2ZWN5cmlsbGljIiwiaWVjeXJpbGxpYyIsImlldW5nYWNpcmNsZWtvcmVhbiIsImlldW5nYXBhcmVua29yZWFuIiwiaWV1bmdjaXJjbGVrb3JlYW4iLCJpZXVuZ2tvcmVhbiIsImlldW5ncGFyZW5rb3JlYW4iLCJpZ3JhdmUiLCJpZ3VqYXJhdGkiLCJpZ3VybXVraGkiLCJpaGlyYWdhbmEiLCJpaG9va2Fib3ZlIiwiaWliZW5nYWxpIiwiaWljeXJpbGxpYyIsImlpZGV2YSIsImlpZ3VqYXJhdGkiLCJpaWd1cm11a2hpIiwiaWltYXRyYWd1cm11a2hpIiwiaWludmVydGVkYnJldmUiLCJpaXNob3J0Y3lyaWxsaWMiLCJpaXZvd2Vsc2lnbmJlbmdhbGkiLCJpaXZvd2Vsc2lnbmRldmEiLCJpaXZvd2Vsc2lnbmd1amFyYXRpIiwiaWoiLCJpa2F0YWthbmEiLCJpa2F0YWthbmFoYWxmd2lkdGgiLCJpa29yZWFuIiwiaWxkZSIsImlsdXloZWJyZXciLCJpbWFjcm9uIiwiaW1hY3JvbmN5cmlsbGljIiwiaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbCIsImltYXRyYWd1cm11a2hpIiwiaW1vbm9zcGFjZSIsImluY3JlbWVudCIsImluZmluaXR5IiwiaW5pYXJtZW5pYW4iLCJpbnRlZ3JhbCIsImludGVncmFsYm90dG9tIiwiaW50ZWdyYWxidCIsImludGVncmFsZXgiLCJpbnRlZ3JhbHRvcCIsImludGVncmFsdHAiLCJpbnRlcnNlY3Rpb24iLCJpbnRpc3F1YXJlIiwiaW52YnVsbGV0IiwiaW52Y2lyY2xlIiwiaW52c21pbGVmYWNlIiwiaW9jeXJpbGxpYyIsImlvZ29uZWsiLCJpb3RhIiwiaW90YWRpZXJlc2lzIiwiaW90YWRpZXJlc2lzdG9ub3MiLCJpb3RhbGF0aW4iLCJpb3RhdG9ub3MiLCJpcGFyZW4iLCJpcmlndXJtdWtoaSIsImlzbWFsbGhpcmFnYW5hIiwiaXNtYWxsa2F0YWthbmEiLCJpc21hbGxrYXRha2FuYWhhbGZ3aWR0aCIsImlzc2hhcmJlbmdhbGkiLCJpc3Ryb2tlIiwiaXN1cGVyaW9yIiwiaXRlcmF0aW9uaGlyYWdhbmEiLCJpdGVyYXRpb25rYXRha2FuYSIsIml0aWxkZSIsIml0aWxkZWJlbG93IiwiaXVib3BvbW9mbyIsIml1Y3lyaWxsaWMiLCJpdm93ZWxzaWduYmVuZ2FsaSIsIml2b3dlbHNpZ25kZXZhIiwiaXZvd2Vsc2lnbmd1amFyYXRpIiwiaXpoaXRzYWN5cmlsbGljIiwiaXpoaXRzYWRibGdyYXZlY3lyaWxsaWMiLCJqYWFybWVuaWFuIiwiamFiZW5nYWxpIiwiamFkZXZhIiwiamFndWphcmF0aSIsImphZ3VybXVraGkiLCJqYm9wb21vZm8iLCJqY2Fyb24iLCJqY2lyY2xlIiwiamNpcmN1bWZsZXgiLCJqY3Jvc3NlZHRhaWwiLCJqZG90bGVzc3N0cm9rZSIsImplY3lyaWxsaWMiLCJqZWVtYXJhYmljIiwiamVlbWZpbmFsYXJhYmljIiwiamVlbWluaXRpYWxhcmFiaWMiLCJqZWVtbWVkaWFsYXJhYmljIiwiamVoYXJhYmljIiwiamVoZmluYWxhcmFiaWMiLCJqaGFiZW5nYWxpIiwiamhhZGV2YSIsImpoYWd1amFyYXRpIiwiamhhZ3VybXVraGkiLCJqaGVoYXJtZW5pYW4iLCJqaXMiLCJqbW9ub3NwYWNlIiwianBhcmVuIiwianN1cGVyaW9yIiwia2FiYXNoa2lyY3lyaWxsaWMiLCJrYWJlbmdhbGkiLCJrYWN1dGUiLCJrYWN5cmlsbGljIiwia2FkZXNjZW5kZXJjeXJpbGxpYyIsImthZGV2YSIsImthZiIsImthZmFyYWJpYyIsImthZmRhZ2VzaCIsImthZmRhZ2VzaGhlYnJldyIsImthZmZpbmFsYXJhYmljIiwia2FmaGVicmV3Iiwia2FmaW5pdGlhbGFyYWJpYyIsImthZm1lZGlhbGFyYWJpYyIsImthZnJhZmVoZWJyZXciLCJrYWd1amFyYXRpIiwia2FndXJtdWtoaSIsImthaGlyYWdhbmEiLCJrYWhvb2tjeXJpbGxpYyIsImtha2F0YWthbmEiLCJrYWthdGFrYW5haGFsZndpZHRoIiwia2FwcGEiLCJrYXBwYXN5bWJvbGdyZWVrIiwia2FweWVvdW5taWV1bWtvcmVhbiIsImthcHllb3VucGhpZXVwaGtvcmVhbiIsImthcHllb3VucGlldXBrb3JlYW4iLCJrYXB5ZW91bnNzYW5ncGlldXBrb3JlYW4iLCJrYXJvcmlpc3F1YXJlIiwia2FzaGlkYWF1dG9hcmFiaWMiLCJrYXNoaWRhYXV0b25vc2lkZWJlYXJpbmdhcmFiaWMiLCJrYXNtYWxsa2F0YWthbmEiLCJrYXNxdWFyZSIsImthc3JhYXJhYmljIiwia2FzcmF0YW5hcmFiaWMiLCJrYXN0cm9rZWN5cmlsbGljIiwia2F0YWhpcmFwcm9sb25nbWFya2hhbGZ3aWR0aCIsImthdmVydGljYWxzdHJva2VjeXJpbGxpYyIsImtib3BvbW9mbyIsImtjYWxzcXVhcmUiLCJrY2Fyb24iLCJrY2VkaWxsYSIsImtjaXJjbGUiLCJrY29tbWFhY2NlbnQiLCJrZG90YmVsb3ciLCJrZWhhcm1lbmlhbiIsImtlaGlyYWdhbmEiLCJrZWthdGFrYW5hIiwia2VrYXRha2FuYWhhbGZ3aWR0aCIsImtlbmFybWVuaWFuIiwia2VzbWFsbGthdGFrYW5hIiwia2dyZWVubGFuZGljIiwia2hhYmVuZ2FsaSIsImtoYWN5cmlsbGljIiwia2hhZGV2YSIsImtoYWd1amFyYXRpIiwia2hhZ3VybXVraGkiLCJraGFoYXJhYmljIiwia2hhaGZpbmFsYXJhYmljIiwia2hhaGluaXRpYWxhcmFiaWMiLCJraGFobWVkaWFsYXJhYmljIiwia2hlaWNvcHRpYyIsImtoaGFkZXZhIiwia2hoYWd1cm11a2hpIiwia2hpZXVraGFjaXJjbGVrb3JlYW4iLCJraGlldWtoYXBhcmVua29yZWFuIiwia2hpZXVraGNpcmNsZWtvcmVhbiIsImtoaWV1a2hrb3JlYW4iLCJraGlldWtocGFyZW5rb3JlYW4iLCJraG9raGFpdGhhaSIsImtob2tob250aGFpIiwia2hva2h1YXR0aGFpIiwia2hva2h3YWl0aGFpIiwia2hvbXV0dGhhaSIsImtob29rIiwia2hvcmFraGFuZ3RoYWkiLCJraHpzcXVhcmUiLCJraWhpcmFnYW5hIiwia2lrYXRha2FuYSIsImtpa2F0YWthbmFoYWxmd2lkdGgiLCJraXJvZ3VyYW11c3F1YXJlIiwia2lyb21lZXRvcnVzcXVhcmUiLCJraXJvc3F1YXJlIiwia2l5ZW9rYWNpcmNsZWtvcmVhbiIsImtpeWVva2FwYXJlbmtvcmVhbiIsImtpeWVva2NpcmNsZWtvcmVhbiIsImtpeWVva2tvcmVhbiIsImtpeWVva3BhcmVua29yZWFuIiwia2l5ZW9rc2lvc2tvcmVhbiIsImtqZWN5cmlsbGljIiwia2xpbmViZWxvdyIsImtsc3F1YXJlIiwia21jdWJlZHNxdWFyZSIsImttb25vc3BhY2UiLCJrbXNxdWFyZWRzcXVhcmUiLCJrb2hpcmFnYW5hIiwia29obXNxdWFyZSIsImtva2FpdGhhaSIsImtva2F0YWthbmEiLCJrb2thdGFrYW5haGFsZndpZHRoIiwia29vcG9zcXVhcmUiLCJrb3BwYWN5cmlsbGljIiwia29yZWFuc3RhbmRhcmRzeW1ib2wiLCJrb3JvbmlzY21iIiwia3BhcmVuIiwia3Bhc3F1YXJlIiwia3NpY3lyaWxsaWMiLCJrdHNxdWFyZSIsImt0dXJuZWQiLCJrdWhpcmFnYW5hIiwia3VrYXRha2FuYSIsImt1a2F0YWthbmFoYWxmd2lkdGgiLCJrdnNxdWFyZSIsImt3c3F1YXJlIiwibGFiZW5nYWxpIiwibGFjdXRlIiwibGFkZXZhIiwibGFndWphcmF0aSIsImxhZ3VybXVraGkiLCJsYWtraGFuZ3lhb3RoYWkiLCJsYW1hbGVmZmluYWxhcmFiaWMiLCJsYW1hbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljIiwibGFtYWxlZmhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyIsImxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWMiLCJsYW1hbGVmaGFtemFiZWxvd2lzb2xhdGVkYXJhYmljIiwibGFtYWxlZmlzb2xhdGVkYXJhYmljIiwibGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYyIsImxhbWFsZWZtYWRkYWFib3ZlaXNvbGF0ZWRhcmFiaWMiLCJsYW1hcmFiaWMiLCJsYW1iZGEiLCJsYW1iZGFzdHJva2UiLCJsYW1lZCIsImxhbWVkZGFnZXNoIiwibGFtZWRkYWdlc2hoZWJyZXciLCJsYW1lZGhlYnJldyIsImxhbWZpbmFsYXJhYmljIiwibGFtaGFoaW5pdGlhbGFyYWJpYyIsImxhbWluaXRpYWxhcmFiaWMiLCJsYW1qZWVtaW5pdGlhbGFyYWJpYyIsImxhbWtoYWhpbml0aWFsYXJhYmljIiwibGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWMiLCJsYW1tZWRpYWxhcmFiaWMiLCJsYW1tZWVtaGFoaW5pdGlhbGFyYWJpYyIsImxhbW1lZW1pbml0aWFsYXJhYmljIiwibGFyZ2VjaXJjbGUiLCJsYmFyIiwibGJlbHQiLCJsYm9wb21vZm8iLCJsY2Fyb24iLCJsY2VkaWxsYSIsImxjaXJjbGUiLCJsY2lyY3VtZmxleGJlbG93IiwibGNvbW1hYWNjZW50IiwibGRvdCIsImxkb3RhY2NlbnQiLCJsZG90YmVsb3ciLCJsZG90YmVsb3dtYWNyb24iLCJsZWZ0YW5nbGVhYm92ZWNtYiIsImxlZnR0YWNrYmVsb3djbWIiLCJsZXNzIiwibGVzc2VxdWFsIiwibGVzc2VxdWFsb3JncmVhdGVyIiwibGVzc21vbm9zcGFjZSIsImxlc3NvcmVxdWl2YWxlbnQiLCJsZXNzb3JncmVhdGVyIiwibGVzc292ZXJlcXVhbCIsImxlc3NzbWFsbCIsImxlemgiLCJsZmJsb2NrIiwibGhvb2tyZXRyb2ZsZXgiLCJsaXJhIiwibGl3bmFybWVuaWFuIiwibGoiLCJsamVjeXJpbGxpYyIsImxsYWRldmEiLCJsbGFndWphcmF0aSIsImxsaW5lYmVsb3ciLCJsbGxhZGV2YSIsImxsdm9jYWxpY2JlbmdhbGkiLCJsbHZvY2FsaWNkZXZhIiwibGx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSIsImxsdm9jYWxpY3Zvd2Vsc2lnbmRldmEiLCJsbWlkZGxldGlsZGUiLCJsbW9ub3NwYWNlIiwibG1zcXVhcmUiLCJsb2NodWxhdGhhaSIsImxvZ2ljYWxhbmQiLCJsb2dpY2Fsbm90IiwibG9naWNhbG5vdHJldmVyc2VkIiwibG9naWNhbG9yIiwibG9saW5ndGhhaSIsImxvbmdzIiwibG93bGluZWNlbnRlcmxpbmUiLCJsb3dsaW5lY21iIiwibG93bGluZWRhc2hlZCIsImxvemVuZ2UiLCJscGFyZW4iLCJsc2xhc2giLCJsc3F1YXJlIiwibHN1cGVyaW9yIiwibHRzaGFkZSIsImx1dGhhaSIsImx2b2NhbGljYmVuZ2FsaSIsImx2b2NhbGljZGV2YSIsImx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSIsImx2b2NhbGljdm93ZWxzaWduZGV2YSIsImx4c3F1YXJlIiwibWFiZW5nYWxpIiwibWFjcm9uIiwibWFjcm9uYmVsb3djbWIiLCJtYWNyb25jbWIiLCJtYWNyb25sb3dtb2QiLCJtYWNyb25tb25vc3BhY2UiLCJtYWN1dGUiLCJtYWRldmEiLCJtYWd1amFyYXRpIiwibWFndXJtdWtoaSIsIm1haGFwYWtoaGVicmV3IiwibWFoYXBha2hsZWZ0aGVicmV3IiwibWFoaXJhZ2FuYSIsIm1haWNoYXR0YXdhbG93bGVmdHRoYWkiLCJtYWljaGF0dGF3YWxvd3JpZ2h0dGhhaSIsIm1haWNoYXR0YXdhdGhhaSIsIm1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaSIsIm1haWVrbG93bGVmdHRoYWkiLCJtYWlla2xvd3JpZ2h0dGhhaSIsIm1haWVrdGhhaSIsIm1haWVrdXBwZXJsZWZ0dGhhaSIsIm1haWhhbmFrYXRsZWZ0dGhhaSIsIm1haWhhbmFrYXR0aGFpIiwibWFpdGFpa2h1bGVmdHRoYWkiLCJtYWl0YWlraHV0aGFpIiwibWFpdGhvbG93bGVmdHRoYWkiLCJtYWl0aG9sb3dyaWdodHRoYWkiLCJtYWl0aG90aGFpIiwibWFpdGhvdXBwZXJsZWZ0dGhhaSIsIm1haXRyaWxvd2xlZnR0aGFpIiwibWFpdHJpbG93cmlnaHR0aGFpIiwibWFpdHJpdGhhaSIsIm1haXRyaXVwcGVybGVmdHRoYWkiLCJtYWl5YW1va3RoYWkiLCJtYWthdGFrYW5hIiwibWFrYXRha2FuYWhhbGZ3aWR0aCIsIm1hbGUiLCJtYW5zeW9uc3F1YXJlIiwibWFxYWZoZWJyZXciLCJtYXJzIiwibWFzb3JhY2lyY2xlaGVicmV3IiwibWFzcXVhcmUiLCJtYm9wb21vZm8iLCJtYnNxdWFyZSIsIm1jaXJjbGUiLCJtY3ViZWRzcXVhcmUiLCJtZG90YWNjZW50IiwibWRvdGJlbG93IiwibWVlbWFyYWJpYyIsIm1lZW1maW5hbGFyYWJpYyIsIm1lZW1pbml0aWFsYXJhYmljIiwibWVlbW1lZGlhbGFyYWJpYyIsIm1lZW1tZWVtaW5pdGlhbGFyYWJpYyIsIm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWMiLCJtZWV0b3J1c3F1YXJlIiwibWVoaXJhZ2FuYSIsIm1laXppZXJhc3F1YXJlIiwibWVrYXRha2FuYSIsIm1la2F0YWthbmFoYWxmd2lkdGgiLCJtZW0iLCJtZW1kYWdlc2giLCJtZW1kYWdlc2hoZWJyZXciLCJtZW1oZWJyZXciLCJtZW5hcm1lbmlhbiIsIm1lcmtoYWhlYnJldyIsIm1lcmtoYWtlZnVsYWhlYnJldyIsIm1lcmtoYWtlZnVsYWxlZnRoZWJyZXciLCJtZXJraGFsZWZ0aGVicmV3IiwibWhvb2siLCJtaHpzcXVhcmUiLCJtaWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aCIsIm1pZGRvdCIsIm1pZXVtYWNpcmNsZWtvcmVhbiIsIm1pZXVtYXBhcmVua29yZWFuIiwibWlldW1jaXJjbGVrb3JlYW4iLCJtaWV1bWtvcmVhbiIsIm1pZXVtcGFuc2lvc2tvcmVhbiIsIm1pZXVtcGFyZW5rb3JlYW4iLCJtaWV1bXBpZXVwa29yZWFuIiwibWlldW1zaW9za29yZWFuIiwibWloaXJhZ2FuYSIsIm1pa2F0YWthbmEiLCJtaWthdGFrYW5haGFsZndpZHRoIiwibWludXMiLCJtaW51c2JlbG93Y21iIiwibWludXNjaXJjbGUiLCJtaW51c21vZCIsIm1pbnVzcGx1cyIsIm1pbnV0ZSIsIm1pcmliYWFydXNxdWFyZSIsIm1pcmlzcXVhcmUiLCJtbG9uZ2xlZ3R1cm5lZCIsIm1sc3F1YXJlIiwibW1jdWJlZHNxdWFyZSIsIm1tb25vc3BhY2UiLCJtbXNxdWFyZWRzcXVhcmUiLCJtb2hpcmFnYW5hIiwibW9obXNxdWFyZSIsIm1va2F0YWthbmEiLCJtb2thdGFrYW5haGFsZndpZHRoIiwibW9sc3F1YXJlIiwibW9tYXRoYWkiLCJtb3ZlcnNzcXVhcmUiLCJtb3ZlcnNzcXVhcmVkc3F1YXJlIiwibXBhcmVuIiwibXBhc3F1YXJlIiwibXNzcXVhcmUiLCJtc3VwZXJpb3IiLCJtdHVybmVkIiwibXUxIiwibXVhc3F1YXJlIiwibXVjaGdyZWF0ZXIiLCJtdWNobGVzcyIsIm11ZnNxdWFyZSIsIm11Z3JlZWsiLCJtdWdzcXVhcmUiLCJtdWhpcmFnYW5hIiwibXVrYXRha2FuYSIsIm11a2F0YWthbmFoYWxmd2lkdGgiLCJtdWxzcXVhcmUiLCJtdWx0aXBseSIsIm11bXNxdWFyZSIsIm11bmFoaGVicmV3IiwibXVuYWhsZWZ0aGVicmV3IiwibXVzaWNhbG5vdGUiLCJtdXNpY2Fsbm90ZWRibCIsIm11c2ljZmxhdHNpZ24iLCJtdXNpY3NoYXJwc2lnbiIsIm11c3NxdWFyZSIsIm11dnNxdWFyZSIsIm11d3NxdWFyZSIsIm12bWVnYXNxdWFyZSIsIm12c3F1YXJlIiwibXdtZWdhc3F1YXJlIiwibXdzcXVhcmUiLCJuYWJlbmdhbGkiLCJuYWJsYSIsIm5hY3V0ZSIsIm5hZGV2YSIsIm5hZ3VqYXJhdGkiLCJuYWd1cm11a2hpIiwibmFoaXJhZ2FuYSIsIm5ha2F0YWthbmEiLCJuYWthdGFrYW5haGFsZndpZHRoIiwibmFwb3N0cm9waGUiLCJuYXNxdWFyZSIsIm5ib3BvbW9mbyIsIm5ic3BhY2UiLCJuY2Fyb24iLCJuY2VkaWxsYSIsIm5jaXJjbGUiLCJuY2lyY3VtZmxleGJlbG93IiwibmNvbW1hYWNjZW50IiwibmRvdGFjY2VudCIsIm5kb3RiZWxvdyIsIm5laGlyYWdhbmEiLCJuZWthdGFrYW5hIiwibmVrYXRha2FuYWhhbGZ3aWR0aCIsIm5ld3NoZXFlbHNpZ24iLCJuZnNxdWFyZSIsIm5nYWJlbmdhbGkiLCJuZ2FkZXZhIiwibmdhZ3VqYXJhdGkiLCJuZ2FndXJtdWtoaSIsIm5nb25ndXRoYWkiLCJuaGlyYWdhbmEiLCJuaG9va2xlZnQiLCJuaG9va3JldHJvZmxleCIsIm5pZXVuYWNpcmNsZWtvcmVhbiIsIm5pZXVuYXBhcmVua29yZWFuIiwibmlldW5jaWV1Y2tvcmVhbiIsIm5pZXVuY2lyY2xla29yZWFuIiwibmlldW5oaWV1aGtvcmVhbiIsIm5pZXVua29yZWFuIiwibmlldW5wYW5zaW9za29yZWFuIiwibmlldW5wYXJlbmtvcmVhbiIsIm5pZXVuc2lvc2tvcmVhbiIsIm5pZXVudGlrZXV0a29yZWFuIiwibmloaXJhZ2FuYSIsIm5pa2F0YWthbmEiLCJuaWthdGFrYW5haGFsZndpZHRoIiwibmlraGFoaXRsZWZ0dGhhaSIsIm5pa2hhaGl0dGhhaSIsIm5pbmUiLCJuaW5lYXJhYmljIiwibmluZWJlbmdhbGkiLCJuaW5lY2lyY2xlIiwibmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWYiLCJuaW5lZGV2YSIsIm5pbmVndWphcmF0aSIsIm5pbmVndXJtdWtoaSIsIm5pbmVoYWNrYXJhYmljIiwibmluZWhhbmd6aG91IiwibmluZWlkZW9ncmFwaGljcGFyZW4iLCJuaW5laW5mZXJpb3IiLCJuaW5lbW9ub3NwYWNlIiwibmluZW9sZHN0eWxlIiwibmluZXBhcmVuIiwibmluZXBlcmlvZCIsIm5pbmVwZXJzaWFuIiwibmluZXJvbWFuIiwibmluZXN1cGVyaW9yIiwibmluZXRlZW5jaXJjbGUiLCJuaW5ldGVlbnBhcmVuIiwibmluZXRlZW5wZXJpb2QiLCJuaW5ldGhhaSIsIm5qIiwibmplY3lyaWxsaWMiLCJua2F0YWthbmEiLCJua2F0YWthbmFoYWxmd2lkdGgiLCJubGVncmlnaHRsb25nIiwibmxpbmViZWxvdyIsIm5tb25vc3BhY2UiLCJubXNxdWFyZSIsIm5uYWJlbmdhbGkiLCJubmFkZXZhIiwibm5hZ3VqYXJhdGkiLCJubmFndXJtdWtoaSIsIm5ubmFkZXZhIiwibm9oaXJhZ2FuYSIsIm5va2F0YWthbmEiLCJub2thdGFrYW5haGFsZndpZHRoIiwibm9uYnJlYWtpbmdzcGFjZSIsIm5vbmVudGhhaSIsIm5vbnV0aGFpIiwibm9vbmFyYWJpYyIsIm5vb25maW5hbGFyYWJpYyIsIm5vb25naHVubmFhcmFiaWMiLCJub29uZ2h1bm5hZmluYWxhcmFiaWMiLCJub29uaW5pdGlhbGFyYWJpYyIsIm5vb25qZWVtaW5pdGlhbGFyYWJpYyIsIm5vb25qZWVtaXNvbGF0ZWRhcmFiaWMiLCJub29ubWVkaWFsYXJhYmljIiwibm9vbm1lZW1pbml0aWFsYXJhYmljIiwibm9vbm1lZW1pc29sYXRlZGFyYWJpYyIsIm5vb25ub29uZmluYWxhcmFiaWMiLCJub3Rjb250YWlucyIsIm5vdGVsZW1lbnQiLCJub3RlbGVtZW50b2YiLCJub3RlcXVhbCIsIm5vdGdyZWF0ZXIiLCJub3RncmVhdGVybm9yZXF1YWwiLCJub3RncmVhdGVybm9ybGVzcyIsIm5vdGlkZW50aWNhbCIsIm5vdGxlc3MiLCJub3RsZXNzbm9yZXF1YWwiLCJub3RwYXJhbGxlbCIsIm5vdHByZWNlZGVzIiwibm90c3Vic2V0Iiwibm90c3VjY2VlZHMiLCJub3RzdXBlcnNldCIsIm5vd2FybWVuaWFuIiwibnBhcmVuIiwibnNzcXVhcmUiLCJuc3VwZXJpb3IiLCJudGlsZGUiLCJudSIsIm51aGlyYWdhbmEiLCJudWthdGFrYW5hIiwibnVrYXRha2FuYWhhbGZ3aWR0aCIsIm51a3RhYmVuZ2FsaSIsIm51a3RhZGV2YSIsIm51a3RhZ3VqYXJhdGkiLCJudWt0YWd1cm11a2hpIiwibnVtYmVyc2lnbiIsIm51bWJlcnNpZ25tb25vc3BhY2UiLCJudW1iZXJzaWduc21hbGwiLCJudW1lcmFsc2lnbmdyZWVrIiwibnVtZXJhbHNpZ25sb3dlcmdyZWVrIiwibnVtZXJvIiwibnVuIiwibnVuZGFnZXNoIiwibnVuZGFnZXNoaGVicmV3IiwibnVuaGVicmV3IiwibnZzcXVhcmUiLCJud3NxdWFyZSIsIm55YWJlbmdhbGkiLCJueWFkZXZhIiwibnlhZ3VqYXJhdGkiLCJueWFndXJtdWtoaSIsIm8iLCJvYWN1dGUiLCJvYW5ndGhhaSIsIm9iYXJyZWQiLCJvYmFycmVkY3lyaWxsaWMiLCJvYmFycmVkZGllcmVzaXNjeXJpbGxpYyIsIm9iZW5nYWxpIiwib2JvcG9tb2ZvIiwib2JyZXZlIiwib2NhbmRyYWRldmEiLCJvY2FuZHJhZ3VqYXJhdGkiLCJvY2FuZHJhdm93ZWxzaWduZGV2YSIsIm9jYW5kcmF2b3dlbHNpZ25ndWphcmF0aSIsIm9jYXJvbiIsIm9jaXJjbGUiLCJvY2lyY3VtZmxleCIsIm9jaXJjdW1mbGV4YWN1dGUiLCJvY2lyY3VtZmxleGRvdGJlbG93Iiwib2NpcmN1bWZsZXhncmF2ZSIsIm9jaXJjdW1mbGV4aG9va2Fib3ZlIiwib2NpcmN1bWZsZXh0aWxkZSIsIm9jeXJpbGxpYyIsIm9kYmxhY3V0ZSIsIm9kYmxncmF2ZSIsIm9kZXZhIiwib2RpZXJlc2lzIiwib2RpZXJlc2lzY3lyaWxsaWMiLCJvZG90YmVsb3ciLCJvZSIsIm9la29yZWFuIiwib2dvbmVrIiwib2dvbmVrY21iIiwib2dyYXZlIiwib2d1amFyYXRpIiwib2hhcm1lbmlhbiIsIm9oaXJhZ2FuYSIsIm9ob29rYWJvdmUiLCJvaG9ybiIsIm9ob3JuYWN1dGUiLCJvaG9ybmRvdGJlbG93Iiwib2hvcm5ncmF2ZSIsIm9ob3JuaG9va2Fib3ZlIiwib2hvcm50aWxkZSIsIm9odW5nYXJ1bWxhdXQiLCJvaSIsIm9pbnZlcnRlZGJyZXZlIiwib2thdGFrYW5hIiwib2thdGFrYW5haGFsZndpZHRoIiwib2tvcmVhbiIsIm9sZWhlYnJldyIsIm9tYWNyb24iLCJvbWFjcm9uYWN1dGUiLCJvbWFjcm9uZ3JhdmUiLCJvbWRldmEiLCJvbWVnYSIsIm9tZWdhMSIsIm9tZWdhY3lyaWxsaWMiLCJvbWVnYWxhdGluY2xvc2VkIiwib21lZ2Fyb3VuZGN5cmlsbGljIiwib21lZ2F0aXRsb2N5cmlsbGljIiwib21lZ2F0b25vcyIsIm9tZ3VqYXJhdGkiLCJvbWljcm9uIiwib21pY3JvbnRvbm9zIiwib21vbm9zcGFjZSIsIm9uZSIsIm9uZWFyYWJpYyIsIm9uZWJlbmdhbGkiLCJvbmVjaXJjbGUiLCJvbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmIiwib25lZGV2YSIsIm9uZWRvdGVubGVhZGVyIiwib25lZWlnaHRoIiwib25lZml0dGVkIiwib25lZ3VqYXJhdGkiLCJvbmVndXJtdWtoaSIsIm9uZWhhY2thcmFiaWMiLCJvbmVoYWxmIiwib25laGFuZ3pob3UiLCJvbmVpZGVvZ3JhcGhpY3BhcmVuIiwib25laW5mZXJpb3IiLCJvbmVtb25vc3BhY2UiLCJvbmVudW1lcmF0b3JiZW5nYWxpIiwib25lb2xkc3R5bGUiLCJvbmVwYXJlbiIsIm9uZXBlcmlvZCIsIm9uZXBlcnNpYW4iLCJvbmVxdWFydGVyIiwib25lcm9tYW4iLCJvbmVzdXBlcmlvciIsIm9uZXRoYWkiLCJvbmV0aGlyZCIsIm9vZ29uZWsiLCJvb2dvbmVrbWFjcm9uIiwib29ndXJtdWtoaSIsIm9vbWF0cmFndXJtdWtoaSIsIm9vcGVuIiwib3BhcmVuIiwib3BlbmJ1bGxldCIsIm9yZGZlbWluaW5lIiwib3JkbWFzY3VsaW5lIiwib3J0aG9nb25hbCIsIm9zaG9ydGRldmEiLCJvc2hvcnR2b3dlbHNpZ25kZXZhIiwib3NsYXNoIiwib3NsYXNoYWN1dGUiLCJvc21hbGxoaXJhZ2FuYSIsIm9zbWFsbGthdGFrYW5hIiwib3NtYWxsa2F0YWthbmFoYWxmd2lkdGgiLCJvc3Ryb2tlYWN1dGUiLCJvc3VwZXJpb3IiLCJvdGN5cmlsbGljIiwib3RpbGRlIiwib3RpbGRlYWN1dGUiLCJvdGlsZGVkaWVyZXNpcyIsIm91Ym9wb21vZm8iLCJvdmVybGluZSIsIm92ZXJsaW5lY2VudGVybGluZSIsIm92ZXJsaW5lY21iIiwib3ZlcmxpbmVkYXNoZWQiLCJvdmVybGluZWRibHdhdnkiLCJvdmVybGluZXdhdnkiLCJvdmVyc2NvcmUiLCJvdm93ZWxzaWduYmVuZ2FsaSIsIm92b3dlbHNpZ25kZXZhIiwib3Zvd2Vsc2lnbmd1amFyYXRpIiwicGFhbXBzc3F1YXJlIiwicGFhc2VudG9zcXVhcmUiLCJwYWJlbmdhbGkiLCJwYWN1dGUiLCJwYWRldmEiLCJwYWdlZG93biIsInBhZ2V1cCIsInBhZ3VqYXJhdGkiLCJwYWd1cm11a2hpIiwicGFoaXJhZ2FuYSIsInBhaXlhbm5vaXRoYWkiLCJwYWthdGFrYW5hIiwicGFsYXRhbGl6YXRpb25jeXJpbGxpY2NtYiIsInBhbG9jaGthY3lyaWxsaWMiLCJwYW5zaW9za29yZWFuIiwicGFyYWdyYXBoIiwicGFyYWxsZWwiLCJwYXJlbmxlZnQiLCJwYXJlbmxlZnRhbHRvbmVhcmFiaWMiLCJwYXJlbmxlZnRidCIsInBhcmVubGVmdGV4IiwicGFyZW5sZWZ0aW5mZXJpb3IiLCJwYXJlbmxlZnRtb25vc3BhY2UiLCJwYXJlbmxlZnRzbWFsbCIsInBhcmVubGVmdHN1cGVyaW9yIiwicGFyZW5sZWZ0dHAiLCJwYXJlbmxlZnR2ZXJ0aWNhbCIsInBhcmVucmlnaHQiLCJwYXJlbnJpZ2h0YWx0b25lYXJhYmljIiwicGFyZW5yaWdodGJ0IiwicGFyZW5yaWdodGV4IiwicGFyZW5yaWdodGluZmVyaW9yIiwicGFyZW5yaWdodG1vbm9zcGFjZSIsInBhcmVucmlnaHRzbWFsbCIsInBhcmVucmlnaHRzdXBlcmlvciIsInBhcmVucmlnaHR0cCIsInBhcmVucmlnaHR2ZXJ0aWNhbCIsInBhcnRpYWxkaWZmIiwicGFzZXFoZWJyZXciLCJwYXNodGFoZWJyZXciLCJwYXNxdWFyZSIsInBhdGFoIiwicGF0YWgxMSIsInBhdGFoMWQiLCJwYXRhaDJhIiwicGF0YWhoZWJyZXciLCJwYXRhaG5hcnJvd2hlYnJldyIsInBhdGFocXVhcnRlcmhlYnJldyIsInBhdGFod2lkZWhlYnJldyIsInBhemVyaGVicmV3IiwicGJvcG9tb2ZvIiwicGNpcmNsZSIsInBkb3RhY2NlbnQiLCJwZSIsInBlY3lyaWxsaWMiLCJwZWRhZ2VzaCIsInBlZGFnZXNoaGVicmV3IiwicGVlemlzcXVhcmUiLCJwZWZpbmFsZGFnZXNoaGVicmV3IiwicGVoYXJhYmljIiwicGVoYXJtZW5pYW4iLCJwZWhlYnJldyIsInBlaGZpbmFsYXJhYmljIiwicGVoaW5pdGlhbGFyYWJpYyIsInBlaGlyYWdhbmEiLCJwZWhtZWRpYWxhcmFiaWMiLCJwZWthdGFrYW5hIiwicGVtaWRkbGVob29rY3lyaWxsaWMiLCJwZXJhZmVoZWJyZXciLCJwZXJjZW50IiwicGVyY2VudGFyYWJpYyIsInBlcmNlbnRtb25vc3BhY2UiLCJwZXJjZW50c21hbGwiLCJwZXJpb2QiLCJwZXJpb2Rhcm1lbmlhbiIsInBlcmlvZGNlbnRlcmVkIiwicGVyaW9kaGFsZndpZHRoIiwicGVyaW9kaW5mZXJpb3IiLCJwZXJpb2Rtb25vc3BhY2UiLCJwZXJpb2RzbWFsbCIsInBlcmlvZHN1cGVyaW9yIiwicGVyaXNwb21lbmlncmVla2NtYiIsInBlcnBlbmRpY3VsYXIiLCJwZXJ0aG91c2FuZCIsInBlc2V0YSIsInBmc3F1YXJlIiwicGhhYmVuZ2FsaSIsInBoYWRldmEiLCJwaGFndWphcmF0aSIsInBoYWd1cm11a2hpIiwicGhpIiwicGhpMSIsInBoaWV1cGhhY2lyY2xla29yZWFuIiwicGhpZXVwaGFwYXJlbmtvcmVhbiIsInBoaWV1cGhjaXJjbGVrb3JlYW4iLCJwaGlldXBoa29yZWFuIiwicGhpZXVwaHBhcmVua29yZWFuIiwicGhpbGF0aW4iLCJwaGludGh1dGhhaSIsInBoaXN5bWJvbGdyZWVrIiwicGhvb2siLCJwaG9waGFudGhhaSIsInBob3BodW5ndGhhaSIsInBob3NhbXBoYW90aGFpIiwicGlldXBhY2lyY2xla29yZWFuIiwicGlldXBhcGFyZW5rb3JlYW4iLCJwaWV1cGNpZXVja29yZWFuIiwicGlldXBjaXJjbGVrb3JlYW4iLCJwaWV1cGtpeWVva2tvcmVhbiIsInBpZXVwa29yZWFuIiwicGlldXBwYXJlbmtvcmVhbiIsInBpZXVwc2lvc2tpeWVva2tvcmVhbiIsInBpZXVwc2lvc2tvcmVhbiIsInBpZXVwc2lvc3Rpa2V1dGtvcmVhbiIsInBpZXVwdGhpZXV0aGtvcmVhbiIsInBpZXVwdGlrZXV0a29yZWFuIiwicGloaXJhZ2FuYSIsInBpa2F0YWthbmEiLCJwaXN5bWJvbGdyZWVrIiwicGl3cmFybWVuaWFuIiwicGx1c2JlbG93Y21iIiwicGx1c2NpcmNsZSIsInBsdXNtaW51cyIsInBsdXNtb2QiLCJwbHVzbW9ub3NwYWNlIiwicGx1c3NtYWxsIiwicGx1c3N1cGVyaW9yIiwicG1vbm9zcGFjZSIsInBtc3F1YXJlIiwicG9oaXJhZ2FuYSIsInBvaW50aW5naW5kZXhkb3dud2hpdGUiLCJwb2ludGluZ2luZGV4bGVmdHdoaXRlIiwicG9pbnRpbmdpbmRleHJpZ2h0d2hpdGUiLCJwb2ludGluZ2luZGV4dXB3aGl0ZSIsInBva2F0YWthbmEiLCJwb3BsYXRoYWkiLCJwb3N0YWxtYXJrIiwicG9zdGFsbWFya2ZhY2UiLCJwcGFyZW4iLCJwcmVjZWRlcyIsInByZXNjcmlwdGlvbiIsInByaW1lbW9kIiwicHJpbWVyZXZlcnNlZCIsInByb2R1Y3QiLCJwcm9qZWN0aXZlIiwicHJvbG9uZ2Vka2FuYSIsInByb3BlbGxvciIsInByb3BlcnN1YnNldCIsInByb3BlcnN1cGVyc2V0IiwicHJvcG9ydGlvbiIsInByb3BvcnRpb25hbCIsInBzaSIsInBzaWN5cmlsbGljIiwicHNpbGlwbmV1bWF0YWN5cmlsbGljY21iIiwicHNzcXVhcmUiLCJwdWhpcmFnYW5hIiwicHVrYXRha2FuYSIsInB2c3F1YXJlIiwicHdzcXVhcmUiLCJxYWRldmEiLCJxYWRtYWhlYnJldyIsInFhZmFyYWJpYyIsInFhZmZpbmFsYXJhYmljIiwicWFmaW5pdGlhbGFyYWJpYyIsInFhZm1lZGlhbGFyYWJpYyIsInFhbWF0cyIsInFhbWF0czEwIiwicWFtYXRzMWEiLCJxYW1hdHMxYyIsInFhbWF0czI3IiwicWFtYXRzMjkiLCJxYW1hdHMzMyIsInFhbWF0c2RlIiwicWFtYXRzaGVicmV3IiwicWFtYXRzbmFycm93aGVicmV3IiwicWFtYXRzcWF0YW5oZWJyZXciLCJxYW1hdHNxYXRhbm5hcnJvd2hlYnJldyIsInFhbWF0c3FhdGFucXVhcnRlcmhlYnJldyIsInFhbWF0c3FhdGFud2lkZWhlYnJldyIsInFhbWF0c3F1YXJ0ZXJoZWJyZXciLCJxYW1hdHN3aWRlaGVicmV3IiwicWFybmV5cGFyYWhlYnJldyIsInFib3BvbW9mbyIsInFjaXJjbGUiLCJxaG9vayIsInFtb25vc3BhY2UiLCJxb2YiLCJxb2ZkYWdlc2giLCJxb2ZkYWdlc2hoZWJyZXciLCJxb2ZoZWJyZXciLCJxcGFyZW4iLCJxdWFydGVybm90ZSIsInF1YnV0cyIsInF1YnV0czE4IiwicXVidXRzMjUiLCJxdWJ1dHMzMSIsInF1YnV0c2hlYnJldyIsInF1YnV0c25hcnJvd2hlYnJldyIsInF1YnV0c3F1YXJ0ZXJoZWJyZXciLCJxdWJ1dHN3aWRlaGVicmV3IiwicXVlc3Rpb24iLCJxdWVzdGlvbmFyYWJpYyIsInF1ZXN0aW9uYXJtZW5pYW4iLCJxdWVzdGlvbmRvd24iLCJxdWVzdGlvbmRvd25zbWFsbCIsInF1ZXN0aW9uZ3JlZWsiLCJxdWVzdGlvbm1vbm9zcGFjZSIsInF1ZXN0aW9uc21hbGwiLCJxdW90ZWRibCIsInF1b3RlZGJsYmFzZSIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJsbW9ub3NwYWNlIiwicXVvdGVkYmxwcmltZSIsInF1b3RlZGJscHJpbWVyZXZlcnNlZCIsInF1b3RlZGJscmlnaHQiLCJxdW90ZWxlZnQiLCJxdW90ZWxlZnRyZXZlcnNlZCIsInF1b3RlcmV2ZXJzZWQiLCJxdW90ZXJpZ2h0IiwicXVvdGVyaWdodG4iLCJxdW90ZXNpbmdsYmFzZSIsInF1b3Rlc2luZ2xlIiwicXVvdGVzaW5nbGVtb25vc3BhY2UiLCJyYWFybWVuaWFuIiwicmFiZW5nYWxpIiwicmFjdXRlIiwicmFkZXZhIiwicmFkaWNhbCIsInJhZGljYWxleCIsInJhZG92ZXJzc3F1YXJlIiwicmFkb3ZlcnNzcXVhcmVkc3F1YXJlIiwicmFkc3F1YXJlIiwicmFmZSIsInJhZmVoZWJyZXciLCJyYWd1amFyYXRpIiwicmFndXJtdWtoaSIsInJhaGlyYWdhbmEiLCJyYWthdGFrYW5hIiwicmFrYXRha2FuYWhhbGZ3aWR0aCIsInJhbG93ZXJkaWFnb25hbGJlbmdhbGkiLCJyYW1pZGRsZWRpYWdvbmFsYmVuZ2FsaSIsInJhbXNob3JuIiwicmF0aW8iLCJyYm9wb21vZm8iLCJyY2Fyb24iLCJyY2VkaWxsYSIsInJjaXJjbGUiLCJyY29tbWFhY2NlbnQiLCJyZGJsZ3JhdmUiLCJyZG90YWNjZW50IiwicmRvdGJlbG93IiwicmRvdGJlbG93bWFjcm9uIiwicmVmZXJlbmNlbWFyayIsInJlZmxleHN1YnNldCIsInJlZmxleHN1cGVyc2V0IiwicmVnaXN0ZXJlZCIsInJlZ2lzdGVyc2FucyIsInJlZ2lzdGVyc2VyaWYiLCJyZWhhcmFiaWMiLCJyZWhhcm1lbmlhbiIsInJlaGZpbmFsYXJhYmljIiwicmVoaXJhZ2FuYSIsInJla2F0YWthbmEiLCJyZWthdGFrYW5haGFsZndpZHRoIiwicmVzaCIsInJlc2hkYWdlc2hoZWJyZXciLCJyZXNoaGVicmV3IiwicmV2ZXJzZWR0aWxkZSIsInJldmlhaGVicmV3IiwicmV2aWFtdWdyYXNoaGVicmV3IiwicmV2bG9naWNhbG5vdCIsInJmaXNoaG9vayIsInJmaXNoaG9va3JldmVyc2VkIiwicmhhYmVuZ2FsaSIsInJoYWRldmEiLCJyaG8iLCJyaG9vayIsInJob29rdHVybmVkIiwicmhvb2t0dXJuZWRzdXBlcmlvciIsInJob3N5bWJvbGdyZWVrIiwicmhvdGljaG9va21vZCIsInJpZXVsYWNpcmNsZWtvcmVhbiIsInJpZXVsYXBhcmVua29yZWFuIiwicmlldWxjaXJjbGVrb3JlYW4iLCJyaWV1bGhpZXVoa29yZWFuIiwicmlldWxraXllb2trb3JlYW4iLCJyaWV1bGtpeWVva3Npb3Nrb3JlYW4iLCJyaWV1bGtvcmVhbiIsInJpZXVsbWlldW1rb3JlYW4iLCJyaWV1bHBhbnNpb3Nrb3JlYW4iLCJyaWV1bHBhcmVua29yZWFuIiwicmlldWxwaGlldXBoa29yZWFuIiwicmlldWxwaWV1cGtvcmVhbiIsInJpZXVscGlldXBzaW9za29yZWFuIiwicmlldWxzaW9za29yZWFuIiwicmlldWx0aGlldXRoa29yZWFuIiwicmlldWx0aWtldXRrb3JlYW4iLCJyaWV1bHllb3JpbmhpZXVoa29yZWFuIiwicmlnaHRhbmdsZSIsInJpZ2h0dGFja2JlbG93Y21iIiwicmlnaHR0cmlhbmdsZSIsInJpaGlyYWdhbmEiLCJyaWthdGFrYW5hIiwicmlrYXRha2FuYWhhbGZ3aWR0aCIsInJpbmciLCJyaW5nYmVsb3djbWIiLCJyaW5nY21iIiwicmluZ2hhbGZsZWZ0IiwicmluZ2hhbGZsZWZ0YXJtZW5pYW4iLCJyaW5naGFsZmxlZnRiZWxvd2NtYiIsInJpbmdoYWxmbGVmdGNlbnRlcmVkIiwicmluZ2hhbGZyaWdodCIsInJpbmdoYWxmcmlnaHRiZWxvd2NtYiIsInJpbmdoYWxmcmlnaHRjZW50ZXJlZCIsInJpbnZlcnRlZGJyZXZlIiwicml0dG9ydXNxdWFyZSIsInJsaW5lYmVsb3ciLCJybG9uZ2xlZyIsInJsb25nbGVndHVybmVkIiwicm1vbm9zcGFjZSIsInJvaGlyYWdhbmEiLCJyb2thdGFrYW5hIiwicm9rYXRha2FuYWhhbGZ3aWR0aCIsInJvcnVhdGhhaSIsInJwYXJlbiIsInJyYWJlbmdhbGkiLCJycmFkZXZhIiwicnJhZ3VybXVraGkiLCJycmVoYXJhYmljIiwicnJlaGZpbmFsYXJhYmljIiwicnJ2b2NhbGljYmVuZ2FsaSIsInJydm9jYWxpY2RldmEiLCJycnZvY2FsaWNndWphcmF0aSIsInJydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkiLCJycnZvY2FsaWN2b3dlbHNpZ25kZXZhIiwicnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkiLCJyc3VwZXJpb3IiLCJydGJsb2NrIiwicnR1cm5lZCIsInJ0dXJuZWRzdXBlcmlvciIsInJ1aGlyYWdhbmEiLCJydWthdGFrYW5hIiwicnVrYXRha2FuYWhhbGZ3aWR0aCIsInJ1cGVlbWFya2JlbmdhbGkiLCJydXBlZXNpZ25iZW5nYWxpIiwicnVwaWFoIiwicnV0aGFpIiwicnZvY2FsaWNiZW5nYWxpIiwicnZvY2FsaWNkZXZhIiwicnZvY2FsaWNndWphcmF0aSIsInJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSIsInJ2b2NhbGljdm93ZWxzaWduZGV2YSIsInJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkiLCJzYWJlbmdhbGkiLCJzYWN1dGUiLCJzYWN1dGVkb3RhY2NlbnQiLCJzYWRhcmFiaWMiLCJzYWRldmEiLCJzYWRmaW5hbGFyYWJpYyIsInNhZGluaXRpYWxhcmFiaWMiLCJzYWRtZWRpYWxhcmFiaWMiLCJzYWd1amFyYXRpIiwic2FndXJtdWtoaSIsInNhaGlyYWdhbmEiLCJzYWthdGFrYW5hIiwic2FrYXRha2FuYWhhbGZ3aWR0aCIsInNhbGxhbGxhaG91YWxheWhld2FzYWxsYW1hcmFiaWMiLCJzYW1la2giLCJzYW1la2hkYWdlc2giLCJzYW1la2hkYWdlc2hoZWJyZXciLCJzYW1la2hoZWJyZXciLCJzYXJhYWF0aGFpIiwic2FyYWFldGhhaSIsInNhcmFhaW1haW1hbGFpdGhhaSIsInNhcmFhaW1haW11YW50aGFpIiwic2FyYWFtdGhhaSIsInNhcmFhdGhhaSIsInNhcmFldGhhaSIsInNhcmFpaWxlZnR0aGFpIiwic2FyYWlpdGhhaSIsInNhcmFpbGVmdHRoYWkiLCJzYXJhaXRoYWkiLCJzYXJhb3RoYWkiLCJzYXJhdWVlbGVmdHRoYWkiLCJzYXJhdWVldGhhaSIsInNhcmF1ZWxlZnR0aGFpIiwic2FyYXVldGhhaSIsInNhcmF1dGhhaSIsInNhcmF1dXRoYWkiLCJzYm9wb21vZm8iLCJzY2Fyb24iLCJzY2Fyb25kb3RhY2NlbnQiLCJzY2VkaWxsYSIsInNjaHdhIiwic2Nod2FjeXJpbGxpYyIsInNjaHdhZGllcmVzaXNjeXJpbGxpYyIsInNjaHdhaG9vayIsInNjaXJjbGUiLCJzY2lyY3VtZmxleCIsInNjb21tYWFjY2VudCIsInNkb3RhY2NlbnQiLCJzZG90YmVsb3ciLCJzZG90YmVsb3dkb3RhY2NlbnQiLCJzZWFndWxsYmVsb3djbWIiLCJzZWNvbmR0b25lY2hpbmVzZSIsInNlY3Rpb24iLCJzZWVuYXJhYmljIiwic2VlbmZpbmFsYXJhYmljIiwic2VlbmluaXRpYWxhcmFiaWMiLCJzZWVubWVkaWFsYXJhYmljIiwic2Vnb2wiLCJzZWdvbDEzIiwic2Vnb2wxZiIsInNlZ29sMmMiLCJzZWdvbGhlYnJldyIsInNlZ29sbmFycm93aGVicmV3Iiwic2Vnb2xxdWFydGVyaGVicmV3Iiwic2Vnb2x0YWhlYnJldyIsInNlZ29sd2lkZWhlYnJldyIsInNlaGFybWVuaWFuIiwic2VoaXJhZ2FuYSIsInNla2F0YWthbmEiLCJzZWthdGFrYW5haGFsZndpZHRoIiwic2VtaWNvbG9uIiwic2VtaWNvbG9uYXJhYmljIiwic2VtaWNvbG9ubW9ub3NwYWNlIiwic2VtaWNvbG9uc21hbGwiLCJzZW1pdm9pY2VkbWFya2thbmEiLCJzZW1pdm9pY2VkbWFya2thbmFoYWxmd2lkdGgiLCJzZW50aXNxdWFyZSIsInNlbnRvc3F1YXJlIiwic2V2ZW4iLCJzZXZlbmFyYWJpYyIsInNldmVuYmVuZ2FsaSIsInNldmVuY2lyY2xlIiwic2V2ZW5jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmIiwic2V2ZW5kZXZhIiwic2V2ZW5laWdodGhzIiwic2V2ZW5ndWphcmF0aSIsInNldmVuZ3VybXVraGkiLCJzZXZlbmhhY2thcmFiaWMiLCJzZXZlbmhhbmd6aG91Iiwic2V2ZW5pZGVvZ3JhcGhpY3BhcmVuIiwic2V2ZW5pbmZlcmlvciIsInNldmVubW9ub3NwYWNlIiwic2V2ZW5vbGRzdHlsZSIsInNldmVucGFyZW4iLCJzZXZlbnBlcmlvZCIsInNldmVucGVyc2lhbiIsInNldmVucm9tYW4iLCJzZXZlbnN1cGVyaW9yIiwic2V2ZW50ZWVuY2lyY2xlIiwic2V2ZW50ZWVucGFyZW4iLCJzZXZlbnRlZW5wZXJpb2QiLCJzZXZlbnRoYWkiLCJzZnRoeXBoZW4iLCJzaGFhcm1lbmlhbiIsInNoYWJlbmdhbGkiLCJzaGFjeXJpbGxpYyIsInNoYWRkYWFyYWJpYyIsInNoYWRkYWRhbW1hYXJhYmljIiwic2hhZGRhZGFtbWF0YW5hcmFiaWMiLCJzaGFkZGFmYXRoYWFyYWJpYyIsInNoYWRkYWthc3JhYXJhYmljIiwic2hhZGRha2FzcmF0YW5hcmFiaWMiLCJzaGFkZSIsInNoYWRlZGFyayIsInNoYWRlbGlnaHQiLCJzaGFkZW1lZGl1bSIsInNoYWRldmEiLCJzaGFndWphcmF0aSIsInNoYWd1cm11a2hpIiwic2hhbHNoZWxldGhlYnJldyIsInNoYm9wb21vZm8iLCJzaGNoYWN5cmlsbGljIiwic2hlZW5hcmFiaWMiLCJzaGVlbmZpbmFsYXJhYmljIiwic2hlZW5pbml0aWFsYXJhYmljIiwic2hlZW5tZWRpYWxhcmFiaWMiLCJzaGVpY29wdGljIiwic2hlcWVsIiwic2hlcWVsaGVicmV3Iiwic2hldmEiLCJzaGV2YTExNSIsInNoZXZhMTUiLCJzaGV2YTIyIiwic2hldmEyZSIsInNoZXZhaGVicmV3Iiwic2hldmFuYXJyb3doZWJyZXciLCJzaGV2YXF1YXJ0ZXJoZWJyZXciLCJzaGV2YXdpZGVoZWJyZXciLCJzaGhhY3lyaWxsaWMiLCJzaGltYWNvcHRpYyIsInNoaW4iLCJzaGluZGFnZXNoIiwic2hpbmRhZ2VzaGhlYnJldyIsInNoaW5kYWdlc2hzaGluZG90Iiwic2hpbmRhZ2VzaHNoaW5kb3RoZWJyZXciLCJzaGluZGFnZXNoc2luZG90Iiwic2hpbmRhZ2VzaHNpbmRvdGhlYnJldyIsInNoaW5kb3RoZWJyZXciLCJzaGluaGVicmV3Iiwic2hpbnNoaW5kb3QiLCJzaGluc2hpbmRvdGhlYnJldyIsInNoaW5zaW5kb3QiLCJzaGluc2luZG90aGVicmV3Iiwic2hvb2siLCJzaWdtYTEiLCJzaWdtYWZpbmFsIiwic2lnbWFsdW5hdGVzeW1ib2xncmVlayIsInNpaGlyYWdhbmEiLCJzaWthdGFrYW5hIiwic2lrYXRha2FuYWhhbGZ3aWR0aCIsInNpbHVxaGVicmV3Iiwic2lsdXFsZWZ0aGVicmV3Iiwic2ltaWxhciIsInNpbmRvdGhlYnJldyIsInNpb3NhY2lyY2xla29yZWFuIiwic2lvc2FwYXJlbmtvcmVhbiIsInNpb3NjaWV1Y2tvcmVhbiIsInNpb3NjaXJjbGVrb3JlYW4iLCJzaW9za2l5ZW9ra29yZWFuIiwic2lvc2tvcmVhbiIsInNpb3NuaWV1bmtvcmVhbiIsInNpb3NwYXJlbmtvcmVhbiIsInNpb3NwaWV1cGtvcmVhbiIsInNpb3N0aWtldXRrb3JlYW4iLCJzaXgiLCJzaXhhcmFiaWMiLCJzaXhiZW5nYWxpIiwic2l4Y2lyY2xlIiwic2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiIsInNpeGRldmEiLCJzaXhndWphcmF0aSIsInNpeGd1cm11a2hpIiwic2l4aGFja2FyYWJpYyIsInNpeGhhbmd6aG91Iiwic2l4aWRlb2dyYXBoaWNwYXJlbiIsInNpeGluZmVyaW9yIiwic2l4bW9ub3NwYWNlIiwic2l4b2xkc3R5bGUiLCJzaXhwYXJlbiIsInNpeHBlcmlvZCIsInNpeHBlcnNpYW4iLCJzaXhyb21hbiIsInNpeHN1cGVyaW9yIiwic2l4dGVlbmNpcmNsZSIsInNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaSIsInNpeHRlZW5wYXJlbiIsInNpeHRlZW5wZXJpb2QiLCJzaXh0aGFpIiwic2xhc2giLCJzbGFzaG1vbm9zcGFjZSIsInNsb25nIiwic2xvbmdkb3RhY2NlbnQiLCJzbWlsZWZhY2UiLCJzbW9ub3NwYWNlIiwic29mcGFzdXFoZWJyZXciLCJzb2Z0aHlwaGVuIiwic29mdHNpZ25jeXJpbGxpYyIsInNvaGlyYWdhbmEiLCJzb2thdGFrYW5hIiwic29rYXRha2FuYWhhbGZ3aWR0aCIsInNvbGlkdXNsb25nb3ZlcmxheWNtYiIsInNvbGlkdXNzaG9ydG92ZXJsYXljbWIiLCJzb3J1c2l0aGFpIiwic29zYWxhdGhhaSIsInNvc290aGFpIiwic29zdWF0aGFpIiwic3BhY2VoYWNrYXJhYmljIiwic3BhZGUiLCJzcGFkZXN1aXRibGFjayIsInNwYWRlc3VpdHdoaXRlIiwic3BhcmVuIiwic3F1YXJlYmVsb3djbWIiLCJzcXVhcmVjYyIsInNxdWFyZWNtIiwic3F1YXJlZGlhZ29uYWxjcm9zc2hhdGNoZmlsbCIsInNxdWFyZWhvcml6b250YWxmaWxsIiwic3F1YXJla2ciLCJzcXVhcmVrbSIsInNxdWFyZWttY2FwaXRhbCIsInNxdWFyZWxuIiwic3F1YXJlbG9nIiwic3F1YXJlbWciLCJzcXVhcmVtaWwiLCJzcXVhcmVtbSIsInNxdWFyZW1zcXVhcmVkIiwic3F1YXJlb3J0aG9nb25hbGNyb3NzaGF0Y2hmaWxsIiwic3F1YXJldXBwZXJsZWZ0dG9sb3dlcnJpZ2h0ZmlsbCIsInNxdWFyZXVwcGVycmlnaHR0b2xvd2VybGVmdGZpbGwiLCJzcXVhcmV2ZXJ0aWNhbGZpbGwiLCJzcXVhcmV3aGl0ZXdpdGhzbWFsbGJsYWNrIiwic3JzcXVhcmUiLCJzc2FiZW5nYWxpIiwic3NhZGV2YSIsInNzYWd1amFyYXRpIiwic3NhbmdjaWV1Y2tvcmVhbiIsInNzYW5naGlldWhrb3JlYW4iLCJzc2FuZ2lldW5na29yZWFuIiwic3NhbmdraXllb2trb3JlYW4iLCJzc2FuZ25pZXVua29yZWFuIiwic3NhbmdwaWV1cGtvcmVhbiIsInNzYW5nc2lvc2tvcmVhbiIsInNzYW5ndGlrZXV0a29yZWFuIiwic3N1cGVyaW9yIiwic3RlcmxpbmciLCJzdGVybGluZ21vbm9zcGFjZSIsInN0cm9rZWxvbmdvdmVybGF5Y21iIiwic3Ryb2tlc2hvcnRvdmVybGF5Y21iIiwic3Vic2V0Iiwic3Vic2V0bm90ZXF1YWwiLCJzdWJzZXRvcmVxdWFsIiwic3VjY2VlZHMiLCJzdWNodGhhdCIsInN1aGlyYWdhbmEiLCJzdWthdGFrYW5hIiwic3VrYXRha2FuYWhhbGZ3aWR0aCIsInN1a3VuYXJhYmljIiwic3VtbWF0aW9uIiwic3VuIiwic3VwZXJzZXQiLCJzdXBlcnNldG5vdGVxdWFsIiwic3VwZXJzZXRvcmVxdWFsIiwic3ZzcXVhcmUiLCJzeW91d2FlcmFzcXVhcmUiLCJ0YWJlbmdhbGkiLCJ0YWNrZG93biIsInRhY2tsZWZ0IiwidGFkZXZhIiwidGFndWphcmF0aSIsInRhZ3VybXVraGkiLCJ0YWhhcmFiaWMiLCJ0YWhmaW5hbGFyYWJpYyIsInRhaGluaXRpYWxhcmFiaWMiLCJ0YWhpcmFnYW5hIiwidGFobWVkaWFsYXJhYmljIiwidGFpc3lvdWVyYXNxdWFyZSIsInRha2F0YWthbmEiLCJ0YWthdGFrYW5haGFsZndpZHRoIiwidGF0d2VlbGFyYWJpYyIsInRhdSIsInRhdiIsInRhdmRhZ2VzIiwidGF2ZGFnZXNoIiwidGF2ZGFnZXNoaGVicmV3IiwidGF2aGVicmV3IiwidGJhciIsInRib3BvbW9mbyIsInRjYXJvbiIsInRjY3VybCIsInRjZWRpbGxhIiwidGNoZWhhcmFiaWMiLCJ0Y2hlaGZpbmFsYXJhYmljIiwidGNoZWhpbml0aWFsYXJhYmljIiwidGNoZWhtZWRpYWxhcmFiaWMiLCJ0Y2lyY2xlIiwidGNpcmN1bWZsZXhiZWxvdyIsInRjb21tYWFjY2VudCIsInRkaWVyZXNpcyIsInRkb3RhY2NlbnQiLCJ0ZG90YmVsb3ciLCJ0ZWN5cmlsbGljIiwidGVkZXNjZW5kZXJjeXJpbGxpYyIsInRlaGFyYWJpYyIsInRlaGZpbmFsYXJhYmljIiwidGVoaGFoaW5pdGlhbGFyYWJpYyIsInRlaGhhaGlzb2xhdGVkYXJhYmljIiwidGVoaW5pdGlhbGFyYWJpYyIsInRlaGlyYWdhbmEiLCJ0ZWhqZWVtaW5pdGlhbGFyYWJpYyIsInRlaGplZW1pc29sYXRlZGFyYWJpYyIsInRlaG1hcmJ1dGFhcmFiaWMiLCJ0ZWhtYXJidXRhZmluYWxhcmFiaWMiLCJ0ZWhtZWRpYWxhcmFiaWMiLCJ0ZWhtZWVtaW5pdGlhbGFyYWJpYyIsInRlaG1lZW1pc29sYXRlZGFyYWJpYyIsInRlaG5vb25maW5hbGFyYWJpYyIsInRla2F0YWthbmEiLCJ0ZWthdGFrYW5haGFsZndpZHRoIiwidGVsZXBob25lIiwidGVsZXBob25lYmxhY2siLCJ0ZWxpc2hhZ2Vkb2xhaGVicmV3IiwidGVsaXNoYXFldGFuYWhlYnJldyIsInRlbmNpcmNsZSIsInRlbmlkZW9ncmFwaGljcGFyZW4iLCJ0ZW5wYXJlbiIsInRlbnBlcmlvZCIsInRlbnJvbWFuIiwidGVzaCIsInRldCIsInRldGRhZ2VzaCIsInRldGRhZ2VzaGhlYnJldyIsInRldGhlYnJldyIsInRldHNlY3lyaWxsaWMiLCJ0ZXZpcmhlYnJldyIsInRldmlybGVmdGhlYnJldyIsInRoYWJlbmdhbGkiLCJ0aGFkZXZhIiwidGhhZ3VqYXJhdGkiLCJ0aGFndXJtdWtoaSIsInRoYWxhcmFiaWMiLCJ0aGFsZmluYWxhcmFiaWMiLCJ0aGFudGhha2hhdGxvd2xlZnR0aGFpIiwidGhhbnRoYWtoYXRsb3dyaWdodHRoYWkiLCJ0aGFudGhha2hhdHRoYWkiLCJ0aGFudGhha2hhdHVwcGVybGVmdHRoYWkiLCJ0aGVoYXJhYmljIiwidGhlaGZpbmFsYXJhYmljIiwidGhlaGluaXRpYWxhcmFiaWMiLCJ0aGVobWVkaWFsYXJhYmljIiwidGhlcmVleGlzdHMiLCJ0aGVyZWZvcmUiLCJ0aGV0YSIsInRoZXRhMSIsInRoZXRhc3ltYm9sZ3JlZWsiLCJ0aGlldXRoYWNpcmNsZWtvcmVhbiIsInRoaWV1dGhhcGFyZW5rb3JlYW4iLCJ0aGlldXRoY2lyY2xla29yZWFuIiwidGhpZXV0aGtvcmVhbiIsInRoaWV1dGhwYXJlbmtvcmVhbiIsInRoaXJ0ZWVuY2lyY2xlIiwidGhpcnRlZW5wYXJlbiIsInRoaXJ0ZWVucGVyaW9kIiwidGhvbmFuZ21vbnRob3RoYWkiLCJ0aG9vayIsInRob3BodXRoYW90aGFpIiwidGhvcm4iLCJ0aG90aGFoYW50aGFpIiwidGhvdGhhbnRoYWkiLCJ0aG90aG9uZ3RoYWkiLCJ0aG90aHVuZ3RoYWkiLCJ0aG91c2FuZGN5cmlsbGljIiwidGhvdXNhbmRzc2VwYXJhdG9yYXJhYmljIiwidGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbiIsInRocmVlIiwidGhyZWVhcmFiaWMiLCJ0aHJlZWJlbmdhbGkiLCJ0aHJlZWNpcmNsZSIsInRocmVlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiIsInRocmVlZGV2YSIsInRocmVlZWlnaHRocyIsInRocmVlZ3VqYXJhdGkiLCJ0aHJlZWd1cm11a2hpIiwidGhyZWVoYWNrYXJhYmljIiwidGhyZWVoYW5nemhvdSIsInRocmVlaWRlb2dyYXBoaWNwYXJlbiIsInRocmVlaW5mZXJpb3IiLCJ0aHJlZW1vbm9zcGFjZSIsInRocmVlbnVtZXJhdG9yYmVuZ2FsaSIsInRocmVlb2xkc3R5bGUiLCJ0aHJlZXBhcmVuIiwidGhyZWVwZXJpb2QiLCJ0aHJlZXBlcnNpYW4iLCJ0aHJlZXF1YXJ0ZXJzIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInRocmVlcm9tYW4iLCJ0aHJlZXN1cGVyaW9yIiwidGhyZWV0aGFpIiwidGh6c3F1YXJlIiwidGloaXJhZ2FuYSIsInRpa2F0YWthbmEiLCJ0aWthdGFrYW5haGFsZndpZHRoIiwidGlrZXV0YWNpcmNsZWtvcmVhbiIsInRpa2V1dGFwYXJlbmtvcmVhbiIsInRpa2V1dGNpcmNsZWtvcmVhbiIsInRpa2V1dGtvcmVhbiIsInRpa2V1dHBhcmVua29yZWFuIiwidGlsZGUiLCJ0aWxkZWJlbG93Y21iIiwidGlsZGVjbWIiLCJ0aWxkZWNvbWIiLCJ0aWxkZWRvdWJsZWNtYiIsInRpbGRlb3BlcmF0b3IiLCJ0aWxkZW92ZXJsYXljbWIiLCJ0aWxkZXZlcnRpY2FsY21iIiwidGltZXNjaXJjbGUiLCJ0aXBlaGFoZWJyZXciLCJ0aXBlaGFsZWZ0aGVicmV3IiwidGlwcGlndXJtdWtoaSIsInRpdGxvY3lyaWxsaWNjbWIiLCJ0aXduYXJtZW5pYW4iLCJ0bGluZWJlbG93IiwidG1vbm9zcGFjZSIsInRvYXJtZW5pYW4iLCJ0b2hpcmFnYW5hIiwidG9rYXRha2FuYSIsInRva2F0YWthbmFoYWxmd2lkdGgiLCJ0b25lYmFyZXh0cmFoaWdobW9kIiwidG9uZWJhcmV4dHJhbG93bW9kIiwidG9uZWJhcmhpZ2htb2QiLCJ0b25lYmFybG93bW9kIiwidG9uZWJhcm1pZG1vZCIsInRvbmVmaXZlIiwidG9uZXNpeCIsInRvbmV0d28iLCJ0b25vcyIsInRvbnNxdWFyZSIsInRvcGF0YWt0aGFpIiwidG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0IiwidG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0c21hbGwiLCJ0b3J0b2lzZXNoZWxsYnJhY2tldGxlZnR2ZXJ0aWNhbCIsInRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQiLCJ0b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0c21hbGwiLCJ0b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0dmVydGljYWwiLCJ0b3Rhb3RoYWkiLCJ0cGFsYXRhbGhvb2siLCJ0cGFyZW4iLCJ0cmFkZW1hcmsiLCJ0cmFkZW1hcmtzYW5zIiwidHJhZGVtYXJrc2VyaWYiLCJ0cmV0cm9mbGV4aG9vayIsInRyaWFnZG4iLCJ0cmlhZ2xmIiwidHJpYWdydCIsInRyaWFndXAiLCJ0cyIsInRzYWRpIiwidHNhZGlkYWdlc2giLCJ0c2FkaWRhZ2VzaGhlYnJldyIsInRzYWRpaGVicmV3IiwidHNlY3lyaWxsaWMiLCJ0c2VyZSIsInRzZXJlMTIiLCJ0c2VyZTFlIiwidHNlcmUyYiIsInRzZXJlaGVicmV3IiwidHNlcmVuYXJyb3doZWJyZXciLCJ0c2VyZXF1YXJ0ZXJoZWJyZXciLCJ0c2VyZXdpZGVoZWJyZXciLCJ0c2hlY3lyaWxsaWMiLCJ0c3VwZXJpb3IiLCJ0dGFiZW5nYWxpIiwidHRhZGV2YSIsInR0YWd1amFyYXRpIiwidHRhZ3VybXVraGkiLCJ0dGVoYXJhYmljIiwidHRlaGZpbmFsYXJhYmljIiwidHRlaGluaXRpYWxhcmFiaWMiLCJ0dGVobWVkaWFsYXJhYmljIiwidHRoYWJlbmdhbGkiLCJ0dGhhZGV2YSIsInR0aGFndWphcmF0aSIsInR0aGFndXJtdWtoaSIsInR0dXJuZWQiLCJ0dWhpcmFnYW5hIiwidHVrYXRha2FuYSIsInR1a2F0YWthbmFoYWxmd2lkdGgiLCJ0dXNtYWxsaGlyYWdhbmEiLCJ0dXNtYWxsa2F0YWthbmEiLCJ0dXNtYWxsa2F0YWthbmFoYWxmd2lkdGgiLCJ0d2VsdmVjaXJjbGUiLCJ0d2VsdmVwYXJlbiIsInR3ZWx2ZXBlcmlvZCIsInR3ZWx2ZXJvbWFuIiwidHdlbnR5Y2lyY2xlIiwidHdlbnR5aGFuZ3pob3UiLCJ0d2VudHlwYXJlbiIsInR3ZW50eXBlcmlvZCIsInR3byIsInR3b2FyYWJpYyIsInR3b2JlbmdhbGkiLCJ0d29jaXJjbGUiLCJ0d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmIiwidHdvZGV2YSIsInR3b2RvdGVubGVhZGVyIiwidHdvZG90bGVhZGVyIiwidHdvZG90bGVhZGVydmVydGljYWwiLCJ0d29ndWphcmF0aSIsInR3b2d1cm11a2hpIiwidHdvaGFja2FyYWJpYyIsInR3b2hhbmd6aG91IiwidHdvaWRlb2dyYXBoaWNwYXJlbiIsInR3b2luZmVyaW9yIiwidHdvbW9ub3NwYWNlIiwidHdvbnVtZXJhdG9yYmVuZ2FsaSIsInR3b29sZHN0eWxlIiwidHdvcGFyZW4iLCJ0d29wZXJpb2QiLCJ0d29wZXJzaWFuIiwidHdvcm9tYW4iLCJ0d29zdHJva2UiLCJ0d29zdXBlcmlvciIsInR3b3RoYWkiLCJ0d290aGlyZHMiLCJ1YWN1dGUiLCJ1YmFyIiwidWJlbmdhbGkiLCJ1Ym9wb21vZm8iLCJ1YnJldmUiLCJ1Y2Fyb24iLCJ1Y2lyY2xlIiwidWNpcmN1bWZsZXgiLCJ1Y2lyY3VtZmxleGJlbG93IiwidWN5cmlsbGljIiwidWRhdHRhZGV2YSIsInVkYmxhY3V0ZSIsInVkYmxncmF2ZSIsInVkZXZhIiwidWRpZXJlc2lzIiwidWRpZXJlc2lzYWN1dGUiLCJ1ZGllcmVzaXNiZWxvdyIsInVkaWVyZXNpc2Nhcm9uIiwidWRpZXJlc2lzY3lyaWxsaWMiLCJ1ZGllcmVzaXNncmF2ZSIsInVkaWVyZXNpc21hY3JvbiIsInVkb3RiZWxvdyIsInVncmF2ZSIsInVndWphcmF0aSIsInVndXJtdWtoaSIsInVoaXJhZ2FuYSIsInVob29rYWJvdmUiLCJ1aG9ybiIsInVob3JuYWN1dGUiLCJ1aG9ybmRvdGJlbG93IiwidWhvcm5ncmF2ZSIsInVob3JuaG9va2Fib3ZlIiwidWhvcm50aWxkZSIsInVodW5nYXJ1bWxhdXQiLCJ1aHVuZ2FydW1sYXV0Y3lyaWxsaWMiLCJ1aW52ZXJ0ZWRicmV2ZSIsInVrYXRha2FuYSIsInVrYXRha2FuYWhhbGZ3aWR0aCIsInVrY3lyaWxsaWMiLCJ1a29yZWFuIiwidW1hY3JvbiIsInVtYWNyb25jeXJpbGxpYyIsInVtYWNyb25kaWVyZXNpcyIsInVtYXRyYWd1cm11a2hpIiwidW1vbm9zcGFjZSIsInVuZGVyc2NvcmUiLCJ1bmRlcnNjb3JlZGJsIiwidW5kZXJzY29yZW1vbm9zcGFjZSIsInVuZGVyc2NvcmV2ZXJ0aWNhbCIsInVuZGVyc2NvcmV3YXZ5IiwidW5pb24iLCJ1bml2ZXJzYWwiLCJ1b2dvbmVrIiwidXBhcmVuIiwidXBibG9jayIsInVwcGVyZG90aGVicmV3IiwidXBzaWxvbiIsInVwc2lsb25kaWVyZXNpcyIsInVwc2lsb25kaWVyZXNpc3Rvbm9zIiwidXBzaWxvbmxhdGluIiwidXBzaWxvbnRvbm9zIiwidXB0YWNrYmVsb3djbWIiLCJ1cHRhY2ttb2QiLCJ1cmFndXJtdWtoaSIsInVyaW5nIiwidXNob3J0Y3lyaWxsaWMiLCJ1c21hbGxoaXJhZ2FuYSIsInVzbWFsbGthdGFrYW5hIiwidXNtYWxsa2F0YWthbmFoYWxmd2lkdGgiLCJ1c3RyYWlnaHRjeXJpbGxpYyIsInVzdHJhaWdodHN0cm9rZWN5cmlsbGljIiwidXRpbGRlIiwidXRpbGRlYWN1dGUiLCJ1dGlsZGViZWxvdyIsInV1YmVuZ2FsaSIsInV1ZGV2YSIsInV1Z3VqYXJhdGkiLCJ1dWd1cm11a2hpIiwidXVtYXRyYWd1cm11a2hpIiwidXV2b3dlbHNpZ25iZW5nYWxpIiwidXV2b3dlbHNpZ25kZXZhIiwidXV2b3dlbHNpZ25ndWphcmF0aSIsInV2b3dlbHNpZ25iZW5nYWxpIiwidXZvd2Vsc2lnbmRldmEiLCJ1dm93ZWxzaWduZ3VqYXJhdGkiLCJ2YWRldmEiLCJ2YWd1amFyYXRpIiwidmFndXJtdWtoaSIsInZha2F0YWthbmEiLCJ2YXYiLCJ2YXZkYWdlc2giLCJ2YXZkYWdlc2g2NSIsInZhdmRhZ2VzaGhlYnJldyIsInZhdmhlYnJldyIsInZhdmhvbGFtIiwidmF2aG9sYW1oZWJyZXciLCJ2YXZ2YXZoZWJyZXciLCJ2YXZ5b2RoZWJyZXciLCJ2Y2lyY2xlIiwidmRvdGJlbG93IiwidmVjeXJpbGxpYyIsInZlaGFyYWJpYyIsInZlaGZpbmFsYXJhYmljIiwidmVoaW5pdGlhbGFyYWJpYyIsInZlaG1lZGlhbGFyYWJpYyIsInZla2F0YWthbmEiLCJ2ZW51cyIsInZlcnRpY2FsYmFyIiwidmVydGljYWxsaW5lYWJvdmVjbWIiLCJ2ZXJ0aWNhbGxpbmViZWxvd2NtYiIsInZlcnRpY2FsbGluZWxvd21vZCIsInZlcnRpY2FsbGluZW1vZCIsInZld2FybWVuaWFuIiwidmhvb2siLCJ2aWthdGFrYW5hIiwidmlyYW1hYmVuZ2FsaSIsInZpcmFtYWRldmEiLCJ2aXJhbWFndWphcmF0aSIsInZpc2FyZ2FiZW5nYWxpIiwidmlzYXJnYWRldmEiLCJ2aXNhcmdhZ3VqYXJhdGkiLCJ2bW9ub3NwYWNlIiwidm9hcm1lbmlhbiIsInZvaWNlZGl0ZXJhdGlvbmhpcmFnYW5hIiwidm9pY2VkaXRlcmF0aW9ua2F0YWthbmEiLCJ2b2ljZWRtYXJra2FuYSIsInZvaWNlZG1hcmtrYW5haGFsZndpZHRoIiwidm9rYXRha2FuYSIsInZwYXJlbiIsInZ0aWxkZSIsInZ0dXJuZWQiLCJ2dWhpcmFnYW5hIiwidnVrYXRha2FuYSIsIndhY3V0ZSIsIndhZWtvcmVhbiIsIndhaGlyYWdhbmEiLCJ3YWthdGFrYW5hIiwid2FrYXRha2FuYWhhbGZ3aWR0aCIsIndha29yZWFuIiwid2FzbWFsbGhpcmFnYW5hIiwid2FzbWFsbGthdGFrYW5hIiwid2F0dG9zcXVhcmUiLCJ3YXZlZGFzaCIsIndhdnl1bmRlcnNjb3JldmVydGljYWwiLCJ3YXdhcmFiaWMiLCJ3YXdmaW5hbGFyYWJpYyIsIndhd2hhbXphYWJvdmVhcmFiaWMiLCJ3YXdoYW16YWFib3ZlZmluYWxhcmFiaWMiLCJ3YnNxdWFyZSIsIndjaXJjbGUiLCJ3Y2lyY3VtZmxleCIsIndkaWVyZXNpcyIsIndkb3RhY2NlbnQiLCJ3ZG90YmVsb3ciLCJ3ZWhpcmFnYW5hIiwid2VpZXJzdHJhc3MiLCJ3ZWthdGFrYW5hIiwid2Vrb3JlYW4iLCJ3ZW9rb3JlYW4iLCJ3Z3JhdmUiLCJ3aGl0ZWJ1bGxldCIsIndoaXRlY2lyY2xlIiwid2hpdGVjaXJjbGVpbnZlcnNlIiwid2hpdGVjb3JuZXJicmFja2V0bGVmdCIsIndoaXRlY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCIsIndoaXRlY29ybmVyYnJhY2tldHJpZ2h0Iiwid2hpdGVjb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbCIsIndoaXRlZGlhbW9uZCIsIndoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZCIsIndoaXRlZG93bnBvaW50aW5nc21hbGx0cmlhbmdsZSIsIndoaXRlZG93bnBvaW50aW5ndHJpYW5nbGUiLCJ3aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGUiLCJ3aGl0ZWxlZnRwb2ludGluZ3RyaWFuZ2xlIiwid2hpdGVsZW50aWN1bGFyYnJhY2tldGxlZnQiLCJ3aGl0ZWxlbnRpY3VsYXJicmFja2V0cmlnaHQiLCJ3aGl0ZXJpZ2h0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlIiwid2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGUiLCJ3aGl0ZXNtYWxsc3F1YXJlIiwid2hpdGVzbWlsaW5nZmFjZSIsIndoaXRlc3F1YXJlIiwid2hpdGVzdGFyIiwid2hpdGV0ZWxlcGhvbmUiLCJ3aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdCIsIndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCIsIndoaXRldXBwb2ludGluZ3NtYWxsdHJpYW5nbGUiLCJ3aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZSIsIndpaGlyYWdhbmEiLCJ3aWthdGFrYW5hIiwid2lrb3JlYW4iLCJ3bW9ub3NwYWNlIiwid29oaXJhZ2FuYSIsIndva2F0YWthbmEiLCJ3b2thdGFrYW5haGFsZndpZHRoIiwid29uIiwid29ubW9ub3NwYWNlIiwid293YWVudGhhaSIsIndwYXJlbiIsIndyaW5nIiwid3N1cGVyaW9yIiwid3R1cm5lZCIsInd5bm4iLCJ4YWJvdmVjbWIiLCJ4Ym9wb21vZm8iLCJ4Y2lyY2xlIiwieGRpZXJlc2lzIiwieGRvdGFjY2VudCIsInhlaGFybWVuaWFuIiwieGkiLCJ4bW9ub3NwYWNlIiwieHBhcmVuIiwieHN1cGVyaW9yIiwieWFhZG9zcXVhcmUiLCJ5YWJlbmdhbGkiLCJ5YWN1dGUiLCJ5YWRldmEiLCJ5YWVrb3JlYW4iLCJ5YWd1amFyYXRpIiwieWFndXJtdWtoaSIsInlhaGlyYWdhbmEiLCJ5YWthdGFrYW5hIiwieWFrYXRha2FuYWhhbGZ3aWR0aCIsInlha29yZWFuIiwieWFtYWtrYW50aGFpIiwieWFzbWFsbGhpcmFnYW5hIiwieWFzbWFsbGthdGFrYW5hIiwieWFzbWFsbGthdGFrYW5haGFsZndpZHRoIiwieWF0Y3lyaWxsaWMiLCJ5Y2lyY2xlIiwieWNpcmN1bWZsZXgiLCJ5ZGllcmVzaXMiLCJ5ZG90YWNjZW50IiwieWRvdGJlbG93IiwieWVoYXJhYmljIiwieWVoYmFycmVlYXJhYmljIiwieWVoYmFycmVlZmluYWxhcmFiaWMiLCJ5ZWhmaW5hbGFyYWJpYyIsInllaGhhbXphYWJvdmVhcmFiaWMiLCJ5ZWhoYW16YWFib3ZlZmluYWxhcmFiaWMiLCJ5ZWhoYW16YWFib3ZlaW5pdGlhbGFyYWJpYyIsInllaGhhbXphYWJvdmVtZWRpYWxhcmFiaWMiLCJ5ZWhpbml0aWFsYXJhYmljIiwieWVobWVkaWFsYXJhYmljIiwieWVobWVlbWluaXRpYWxhcmFiaWMiLCJ5ZWhtZWVtaXNvbGF0ZWRhcmFiaWMiLCJ5ZWhub29uZmluYWxhcmFiaWMiLCJ5ZWh0aHJlZWRvdHNiZWxvd2FyYWJpYyIsInlla29yZWFuIiwieWVuIiwieWVubW9ub3NwYWNlIiwieWVva29yZWFuIiwieWVvcmluaGlldWhrb3JlYW4iLCJ5ZXJhaGJlbnlvbW9oZWJyZXciLCJ5ZXJhaGJlbnlvbW9sZWZ0aGVicmV3IiwieWVyaWN5cmlsbGljIiwieWVydWRpZXJlc2lzY3lyaWxsaWMiLCJ5ZXNpZXVuZ2tvcmVhbiIsInllc2lldW5ncGFuc2lvc2tvcmVhbiIsInllc2lldW5nc2lvc2tvcmVhbiIsInlldGl2aGVicmV3IiwieWdyYXZlIiwieWhvb2siLCJ5aG9va2Fib3ZlIiwieWlhcm1lbmlhbiIsInlpY3lyaWxsaWMiLCJ5aWtvcmVhbiIsInlpbnlhbmciLCJ5aXduYXJtZW5pYW4iLCJ5bW9ub3NwYWNlIiwieW9kIiwieW9kZGFnZXNoIiwieW9kZGFnZXNoaGVicmV3IiwieW9kaGVicmV3IiwieW9keW9kaGVicmV3IiwieW9keW9kcGF0YWhoZWJyZXciLCJ5b2hpcmFnYW5hIiwieW9pa29yZWFuIiwieW9rYXRha2FuYSIsInlva2F0YWthbmFoYWxmd2lkdGgiLCJ5b2tvcmVhbiIsInlvc21hbGxoaXJhZ2FuYSIsInlvc21hbGxrYXRha2FuYSIsInlvc21hbGxrYXRha2FuYWhhbGZ3aWR0aCIsInlvdGdyZWVrIiwieW95YWVrb3JlYW4iLCJ5b3lha29yZWFuIiwieW95YWt0aGFpIiwieW95aW5ndGhhaSIsInlwYXJlbiIsInlwb2dlZ3JhbW1lbmkiLCJ5cG9nZWdyYW1tZW5pZ3JlZWtjbWIiLCJ5ciIsInlyaW5nIiwieXN1cGVyaW9yIiwieXRpbGRlIiwieXR1cm5lZCIsInl1aGlyYWdhbmEiLCJ5dWlrb3JlYW4iLCJ5dWthdGFrYW5hIiwieXVrYXRha2FuYWhhbGZ3aWR0aCIsInl1a29yZWFuIiwieXVzYmlnY3lyaWxsaWMiLCJ5dXNiaWdpb3RpZmllZGN5cmlsbGljIiwieXVzbGl0dGxlY3lyaWxsaWMiLCJ5dXNsaXR0bGVpb3RpZmllZGN5cmlsbGljIiwieXVzbWFsbGhpcmFnYW5hIiwieXVzbWFsbGthdGFrYW5hIiwieXVzbWFsbGthdGFrYW5haGFsZndpZHRoIiwieXV5ZWtvcmVhbiIsInl1eWVva29yZWFuIiwieXlhYmVuZ2FsaSIsInl5YWRldmEiLCJ6YWFybWVuaWFuIiwiemFjdXRlIiwiemFkZXZhIiwiemFndXJtdWtoaSIsInphaGFyYWJpYyIsInphaGZpbmFsYXJhYmljIiwiemFoaW5pdGlhbGFyYWJpYyIsInphaGlyYWdhbmEiLCJ6YWhtZWRpYWxhcmFiaWMiLCJ6YWluYXJhYmljIiwiemFpbmZpbmFsYXJhYmljIiwiemFrYXRha2FuYSIsInphcWVmZ2Fkb2xoZWJyZXciLCJ6YXFlZnFhdGFuaGVicmV3IiwiemFycWFoZWJyZXciLCJ6YXlpbiIsInpheWluZGFnZXNoIiwiemF5aW5kYWdlc2hoZWJyZXciLCJ6YXlpbmhlYnJldyIsInpib3BvbW9mbyIsInpjYXJvbiIsInpjaXJjbGUiLCJ6Y2lyY3VtZmxleCIsInpjdXJsIiwiemRvdCIsInpkb3RhY2NlbnQiLCJ6ZG90YmVsb3ciLCJ6ZWN5cmlsbGljIiwiemVkZXNjZW5kZXJjeXJpbGxpYyIsInplZGllcmVzaXNjeXJpbGxpYyIsInplaGlyYWdhbmEiLCJ6ZWthdGFrYW5hIiwiemVybyIsInplcm9hcmFiaWMiLCJ6ZXJvYmVuZ2FsaSIsInplcm9kZXZhIiwiemVyb2d1amFyYXRpIiwiemVyb2d1cm11a2hpIiwiemVyb2hhY2thcmFiaWMiLCJ6ZXJvaW5mZXJpb3IiLCJ6ZXJvbW9ub3NwYWNlIiwiemVyb29sZHN0eWxlIiwiemVyb3BlcnNpYW4iLCJ6ZXJvc3VwZXJpb3IiLCJ6ZXJvdGhhaSIsInplcm93aWR0aGpvaW5lciIsInplcm93aWR0aG5vbmpvaW5lciIsInplcm93aWR0aHNwYWNlIiwiemV0YSIsInpoYm9wb21vZm8iLCJ6aGVhcm1lbmlhbiIsInpoZWJyZXZlY3lyaWxsaWMiLCJ6aGVjeXJpbGxpYyIsInpoZWRlc2NlbmRlcmN5cmlsbGljIiwiemhlZGllcmVzaXNjeXJpbGxpYyIsInppaGlyYWdhbmEiLCJ6aWthdGFrYW5hIiwiemlub3JoZWJyZXciLCJ6bGluZWJlbG93Iiwiem1vbm9zcGFjZSIsInpvaGlyYWdhbmEiLCJ6b2thdGFrYW5hIiwienBhcmVuIiwienJldHJvZmxleGhvb2siLCJ6c3Ryb2tlIiwienVoaXJhZ2FuYSIsInp1a2F0YWthbmEiLCJhbmdicmFja2V0bGVmdGJpZyIsImFuZ2JyYWNrZXRsZWZ0QmlnIiwiYW5nYnJhY2tldGxlZnRiaWdnIiwiYW5nYnJhY2tldGxlZnRCaWdnIiwiYW5nYnJhY2tldHJpZ2h0QmlnIiwiYW5nYnJhY2tldHJpZ2h0YmlnIiwiYW5nYnJhY2tldHJpZ2h0QmlnZyIsImFuZ2JyYWNrZXRyaWdodGJpZ2ciLCJhcnJvd2hvb2tsZWZ0IiwiYXJyb3dob29rcmlnaHQiLCJhcnJvd2xlZnR0b3BoYWxmIiwiYXJyb3dsZWZ0Ym90aGFsZiIsImFycm93bm9ydGhlYXN0IiwiYXJyb3dub3J0aHdlc3QiLCJhcnJvd3JpZ2h0dG9waGFsZiIsImFycm93cmlnaHRib3RoYWxmIiwiYXJyb3dzb3V0aGVhc3QiLCJhcnJvd3NvdXRod2VzdCIsImJhY2tzbGFzaGJpZyIsImJhY2tzbGFzaEJpZyIsImJhY2tzbGFzaEJpZ2ciLCJiYWNrc2xhc2hiaWdnIiwiYmFyZGJsIiwiYnJhY2VodGlwZG93bmxlZnQiLCJicmFjZWh0aXBkb3ducmlnaHQiLCJicmFjZWh0aXB1cGxlZnQiLCJicmFjZWh0aXB1cHJpZ2h0IiwiYnJhY2VsZWZ0QmlnIiwiYnJhY2VsZWZ0YmlnIiwiYnJhY2VsZWZ0YmlnZyIsImJyYWNlbGVmdEJpZ2ciLCJicmFjZXJpZ2h0QmlnIiwiYnJhY2VyaWdodGJpZyIsImJyYWNlcmlnaHRiaWdnIiwiYnJhY2VyaWdodEJpZ2ciLCJicmFja2V0bGVmdGJpZyIsImJyYWNrZXRsZWZ0QmlnIiwiYnJhY2tldGxlZnRiaWdnIiwiYnJhY2tldGxlZnRCaWdnIiwiYnJhY2tldHJpZ2h0QmlnIiwiYnJhY2tldHJpZ2h0YmlnIiwiYnJhY2tldHJpZ2h0YmlnZyIsImJyYWNrZXRyaWdodEJpZ2ciLCJjZWlsaW5nbGVmdGJpZyIsImNlaWxpbmdsZWZ0QmlnIiwiY2VpbGluZ2xlZnRCaWdnIiwiY2VpbGluZ2xlZnRiaWdnIiwiY2VpbGluZ3JpZ2h0YmlnIiwiY2VpbGluZ3JpZ2h0QmlnIiwiY2VpbGluZ3JpZ2h0YmlnZyIsImNlaWxpbmdyaWdodEJpZ2ciLCJjaXJjbGVkb3RkaXNwbGF5IiwiY2lyY2xlZG90dGV4dCIsImNpcmNsZW11bHRpcGx5ZGlzcGxheSIsImNpcmNsZW11bHRpcGx5dGV4dCIsImNpcmNsZXBsdXNkaXNwbGF5IiwiY2lyY2xlcGx1c3RleHQiLCJjb250aW50ZWdyYWxkaXNwbGF5IiwiY29udGludGVncmFsdGV4dCIsImNvcHJvZHVjdGRpc3BsYXkiLCJjb3Byb2R1Y3R0ZXh0IiwiZmxvb3JsZWZ0QmlnIiwiZmxvb3JsZWZ0YmlnIiwiZmxvb3JsZWZ0YmlnZyIsImZsb29ybGVmdEJpZ2ciLCJmbG9vcnJpZ2h0YmlnIiwiZmxvb3JyaWdodEJpZyIsImZsb29ycmlnaHRCaWdnIiwiZmxvb3JyaWdodGJpZ2ciLCJoYXR3aWRlIiwiaGF0d2lkZXIiLCJoYXR3aWRlc3QiLCJpbnRlcmNhbCIsImludGVncmFsZGlzcGxheSIsImludGVncmFsdGV4dCIsImludGVyc2VjdGlvbmRpc3BsYXkiLCJpbnRlcnNlY3Rpb250ZXh0IiwibG9naWNhbGFuZGRpc3BsYXkiLCJsb2dpY2FsYW5kdGV4dCIsImxvZ2ljYWxvcmRpc3BsYXkiLCJsb2dpY2Fsb3J0ZXh0IiwicGFyZW5sZWZ0QmlnIiwicGFyZW5sZWZ0YmlnIiwicGFyZW5sZWZ0QmlnZyIsInBhcmVubGVmdGJpZ2ciLCJwYXJlbnJpZ2h0QmlnIiwicGFyZW5yaWdodGJpZyIsInBhcmVucmlnaHRCaWdnIiwicGFyZW5yaWdodGJpZ2ciLCJwcmltZSIsInByb2R1Y3RkaXNwbGF5IiwicHJvZHVjdHRleHQiLCJyYWRpY2FsYmlnIiwicmFkaWNhbEJpZyIsInJhZGljYWxCaWdnIiwicmFkaWNhbGJpZ2ciLCJyYWRpY2FsYnQiLCJyYWRpY2FsdHAiLCJyYWRpY2FsdmVydGV4Iiwic2xhc2hiaWciLCJzbGFzaEJpZyIsInNsYXNoQmlnZyIsInNsYXNoYmlnZyIsInN1bW1hdGlvbmRpc3BsYXkiLCJzdW1tYXRpb250ZXh0IiwidGlsZGV3aWRlIiwidGlsZGV3aWRlciIsInRpbGRld2lkZXN0IiwidW5pb25kaXNwbGF5IiwidW5pb25tdWx0aWRpc3BsYXkiLCJ1bmlvbm11bHRpdGV4dCIsInVuaW9uc3FkaXNwbGF5IiwidW5pb25zcXRleHQiLCJ1bmlvbnRleHQiLCJ2ZXh0ZW5kZG91YmxlIiwidmV4dGVuZHNpbmdsZSIsImdldERpbmdiYXRzR2x5cGhzVW5pY29kZSIsImEyIiwiYTIwMiIsImEzIiwiYTQiLCJhNSIsImExMTkiLCJhMTE4IiwiYTExNyIsImExMSIsImExMiIsImExMyIsImExNCIsImExNSIsImExNiIsImExMDUiLCJhMTciLCJhMTgiLCJhMTkiLCJhMjAiLCJhMjEiLCJhMjIiLCJhMjMiLCJhMjQiLCJhMjUiLCJhMjYiLCJhMjciLCJhMjgiLCJhNiIsImE3IiwiYTgiLCJhOSIsImExMCIsImEyOSIsImEzMCIsImEzMSIsImEzMiIsImEzMyIsImEzNCIsImEzNSIsImEzNiIsImEzNyIsImEzOCIsImEzOSIsImE0MCIsImE0MSIsImE0MiIsImE0MyIsImE0NCIsImE0NSIsImE0NiIsImE0NyIsImE0OCIsImE0OSIsImE1MCIsImE1MSIsImE1MiIsImE1MyIsImE1NCIsImE1NSIsImE1NiIsImE1NyIsImE1OCIsImE1OSIsImE2MCIsImE2MSIsImE2MiIsImE2MyIsImE2NCIsImE2NSIsImE2NiIsImE2NyIsImE2OCIsImE2OSIsImE3MCIsImE3MSIsImE3MiIsImE3MyIsImE3NCIsImEyMDMiLCJhNzUiLCJhMjA0IiwiYTc2IiwiYTc3IiwiYTc4IiwiYTc5IiwiYTgxIiwiYTgyIiwiYTgzIiwiYTg0IiwiYTk3IiwiYTk4IiwiYTk5IiwiYTEwMCIsImExMDEiLCJhMTAyIiwiYTEwMyIsImExMDQiLCJhMTA2IiwiYTEwNyIsImExMDgiLCJhMTEyIiwiYTExMSIsImExMTAiLCJhMTA5IiwiYTEyMCIsImExMjEiLCJhMTIyIiwiYTEyMyIsImExMjQiLCJhMTI1IiwiYTEyNiIsImExMjciLCJhMTI4IiwiYTEyOSIsImExMzAiLCJhMTMxIiwiYTEzMiIsImExMzMiLCJhMTM0IiwiYTEzNSIsImExMzYiLCJhMTM3IiwiYTEzOCIsImExMzkiLCJhMTQwIiwiYTE0MSIsImExNDIiLCJhMTQzIiwiYTE0NCIsImExNDUiLCJhMTQ2IiwiYTE0NyIsImExNDgiLCJhMTQ5IiwiYTE1MCIsImExNTEiLCJhMTUyIiwiYTE1MyIsImExNTQiLCJhMTU1IiwiYTE1NiIsImExNTciLCJhMTU4IiwiYTE1OSIsImExNjAiLCJhMTYxIiwiYTE2MyIsImExNjQiLCJhMTk2IiwiYTE2NSIsImExOTIiLCJhMTY2IiwiYTE2NyIsImExNjgiLCJhMTY5IiwiYTE3MCIsImExNzEiLCJhMTcyIiwiYTE3MyIsImExNjIiLCJhMTc0IiwiYTE3NSIsImExNzYiLCJhMTc3IiwiYTE3OCIsImExNzkiLCJhMTkzIiwiYTE4MCIsImExOTkiLCJhMTgxIiwiYTIwMCIsImExODIiLCJhMjAxIiwiYTE4MyIsImExODQiLCJhMTk3IiwiYTE4NSIsImExOTQiLCJhMTk4IiwiYTE4NiIsImExOTUiLCJhMTg3IiwiYTE4OCIsImExODkiLCJhMTkwIiwiYTE5MSIsImE4OSIsImE5MCIsImE5MyIsImE5NCIsImE5MSIsImE5MiIsImEyMDUiLCJhODUiLCJhMjA2IiwiYTg2IiwiYTg3IiwiYTg4IiwiYTk1IiwiYTk2IiwiZ2V0U3RkRm9udE1hcCIsImdldE5vblN0ZEZvbnRNYXAiLCJnZXRTZXJpZkZvbnRzIiwiZ2V0U3ltYm9sc0ZvbnRzIiwiZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzIiwiZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrIiwiZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpIiwiZ2V0U3BlY2lhbFBVQVN5bWJvbHMiLCJuYW1lTGVuIiwiaGV4U3RyIiwic3Vic3RyaW5nIiwidG9VcHBlckNhc2UiLCJVbmljb2RlUmFuZ2VzIiwiaXNSVExSYW5nZUZvciIsImdldE5vcm1hbGl6ZWRVbmljb2RlcyIsImNoYXJzTGVuZ3RoIiwibnVtU3VicnMiLCJnZXRVc2hvcnQiLCJnZXRMb25nIiwiaWRPZmZzZXQiLCJpZERlbHRhIiwiZ3N1YnJzIiwiaXNDRkZDSURGb250IiwiY21kcyIsIm51bWJlck9mQ29udG91cnMiLCJhcmcxIiwiYXJnMiIsInNjYWxlMDEiLCJzY2FsZTEwIiwic3ViZ2x5cGgiLCJjb21waWxlR2x5ZiIsImVuZFB0c09mQ29udG91cnMiLCJpbnN0cnVjdGlvbkxlbmd0aCIsIm51bWJlck9mUG9pbnRzIiwicG9pbnRzIiwic3RhcnRQb2ludCIsImNvbnRvdXIiLCJxdWFkcmF0aWNDdXJ2ZVRvIiwic3RlbXMiLCJzdGFja0NsZWFuIiwieGEiLCJ5YSIsInhiIiwieWIiLCJiZXppZXJDdXJ2ZVRvIiwic3VickNvZGUiLCJnZXRTdWJyb3V0aW5lQmlhcyIsInkzIiwiYWNoYXIiLCJiY2hhciIsImxvb2t1cENtYXAiLCJjb21waWxlQ2hhclN0cmluZyIsIk5PT1AiLCJnZXRQYXRoSnMiLCJjb21waWxlR2x5cGgiLCJoYXNCdWlsdFBhdGgiLCJjb21waWxlR2x5cGhJbXBsIiwiY2ZmSW5mbyIsImdseXBoTmFtZU1hcCIsInBhcnNlQ21hcCIsInBhcnNlQ2ZmIiwicGFyc2VHbHlmVGFibGUiLCJISU5USU5HX0VOQUJMRUQiLCJUeXBlMUNoYXJTdHJpbmciLCJDT01NQU5EX01BUCIsImhzdGVtIiwidnN0ZW0iLCJ2bW92ZXRvIiwicmxpbmV0byIsImhsaW5ldG8iLCJ2bGluZXRvIiwicnJjdXJ2ZXRvIiwiY2FsbHN1YnIiLCJmbGV4IiwiZHJvcCIsImVuZGNoYXIiLCJybW92ZXRvIiwiaG1vdmV0byIsInZoY3VydmV0byIsImh2Y3VydmV0byIsImR5Iiwid3giLCJzYngiLCJhc2IiLCJzYnkiLCJudW0yIiwibnVtMSIsImZsZXhBcmdzIiwiZXhlY3V0ZUNvbW1hbmQiLCJzdGFja0xlbmd0aCIsImhvd01hbnlBcmdzIiwiVHlwZTFQYXJzZXIiLCJFRVhFQ19FTkNSWVBUX0tFWSIsIkNIQVJfU1RSU19FTkNSWVBUX0tFWSIsImRpc2NhcmROdW1iZXIiLCJjMSIsImMyIiwiZGVjcnlwdGVkIiwiZGlnaXQxIiwiaXNIZXhEaWdpdCIsImRpZ2l0MiIsImlzQmluYXJ5IiwiZGVjcnlwdEFzY2lpIiwicmVhZE51bWJlckFycmF5IiwicmVhZEludCIsInJlYWRCb29sZWFuIiwibmV4dENoYXIiLCJnZXRUb2tlbiIsInJlYWRDaGFyU3RyaW5ncyIsImxlbklWIiwiZXh0cmFjdEZvbnRQcm9ncmFtIiwicHJpdmF0ZURhdGEiLCJwcm9ncmFtIiwiYmx1ZUFycmF5IiwiY2hhclN0cmluZyIsImNoYXJTdHJpbmdPYmplY3QiLCJsc2IiLCJleHRyYWN0Rm9udEhlYWRlciIsImVuY29kaW5nQXJnIiwiU2hhZGluZ1R5cGUiLCJGVU5DVElPTl9CQVNFRCIsIkFYSUFMIiwiUkFESUFMIiwiRlJFRV9GT1JNX01FU0giLCJMQVRUSUNFX0ZPUk1fTUVTSCIsIkNPT05TX1BBVENIX01FU0giLCJURU5TT1JfUEFUQ0hfTUVTSCIsImdldFBhdHRlcm4iLCJTaGFkaW5ncyIsInQwIiwiZG9tYWluQXJyIiwiZXh0ZW5kU3RhcnQiLCJleHRlbmRFbmQiLCJleHRlbmRBcnIiLCJ4MSIsInIxIiwicjIiLCJkaXN0YW5jZSIsImZuT2JqIiwiTlVNQkVSX09GX1NBTVBMRVMiLCJjb2xvclN0b3BzIiwiY3NzQ29sb3IiLCJiYWNrZ3JvdW5kIiwiUmFkaWFsQXhpYWwiLCJjb29yZHNBcnIiLCJzaGFkaW5nVHlwZSIsInIwIiwiY3NOdW1Db21wcyIsIk1lc2hTdHJlYW1SZWFkZXIiLCJhbGlnbiIsInJlYWRGbGFnIiwicmVhZENvb3JkaW5hdGUiLCJiaXRzUGVyQ29vcmRpbmF0ZSIsInlpIiwicmVhZENvbXBvbmVudHMiLCJjaSIsImNvb3JkcyIsIm1lc2giLCJvcGVyYXRvcnMiLCJwcyIsInZlcnRpY2VzTGVmdCIsImNvb3JkIiwidmVydGljZXNQZXJSb3ciLCJNSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCIsIk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UIiwiVFJJQU5HTEVfREVOU0lUWSIsImdldEIiLCJsdXQiLCJ0XyIsImJ1aWxkQiIsImZpZ3VyZSIsImZpZ3VyZU1pblgiLCJmaWd1cmVNaW5ZIiwiZmlndXJlTWF4WCIsImZpZ3VyZU1heFkiLCJzcGxpdFhCeSIsInNwbGl0WUJ5IiwiZmlndXJlQ29vcmRzIiwiZmlndXJlQ29sb3JzIiwiY2wiLCJjciIsImMwIiwiYzMiLCJiUm93IiwiYkNvbCIsIm5ld0NvbG9yIiwidG1wNCIsIm1heFkiLCJjb29yZHNQYWNrZWQiLCJ4eSIsImNvbG9yc1BhY2tlZCIsImZpZ3VyZXMiLCJkZWNvZGVDb250ZXh0IiwiYml0c1BlckZsYWciLCJjb2xvckZuIiwicGF0Y2hNZXNoIiwiZGVjb2RlVHlwZTRTaGFkaW5nIiwiZGVjb2RlVHlwZTVTaGFkaW5nIiwiZGVjb2RlVHlwZTZTaGFkaW5nIiwiZGVjb2RlVHlwZTdTaGFkaW5nIiwidXBkYXRlQm91bmRzIiwiYnVpbGRGaWd1cmVGcm9tUGF0Y2giLCJwYWNrRGF0YSIsIk1lc2giLCJEdW1teSIsInhzdGVwIiwieXN0ZXAiLCJwYWludFR5cGUiLCJ0aWxpbmdUeXBlIiwiY2FjaGVkRnVuY3Rpb24iLCJwYXJzZWRGdW5jdGlvbiIsImNyZWF0ZUZyb21BcnJheSIsImdldENhY2hlZCIsImZuUmVmIiwibG9jYWxGdW5jdGlvbiIsIl9jYWNoZSIsIlBERkZ1bmN0aW9uIiwiQ09OU1RSVUNUX1NBTVBMRUQiLCJDT05TVFJVQ1RfSU5URVJQT0xBVEVEIiwiQ09OU1RSVUNUX1NUSUNIRUQiLCJDT05TVFJVQ1RfUE9TVFNDUklQVCIsImdldFNhbXBsZUFycmF5Iiwic2FtcGxlTXVsIiwic3RyQnl0ZXMiLCJzdHJJZHgiLCJ0eXBlRm4iLCJmcm9tSVIiLCJJUiIsInBhcnNlQXJyYXkiLCJjb25zdHJ1Y3RTYW1wbGVkIiwidG9OdW1iZXJBcnJheSIsImlucHV0U2l6ZSIsIm91dHB1dFNpemUiLCJ0b011bHRpQXJyYXkiLCJicHMiLCJzYW1wbGVzIiwiY29uc3RydWN0U2FtcGxlZEZyb21JUiIsInltaW4iLCJjdWJlVmVydGljZXMiLCJjdWJlTiIsImN1YmVWZXJ0ZXgiLCJkb21haW5fMmkiLCJkb21haW5fMmlfMSIsImludGVycG9sYXRlIiwic2l6ZV9pIiwiZTAiLCJuMCIsIm4xIiwicmoiLCJjb25zdHJ1Y3RJbnRlcnBvbGF0ZWQiLCJjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVIiLCJjb25zdHJ1Y3RTdGljaGVkIiwiZm5SZWZzIiwiZm5zIiwiYm91bmRzIiwiY29uc3RydWN0U3RpY2hlZEZyb21JUiIsImRtaW4iLCJkbWF4Iiwicm1pbiIsInJtYXgiLCJjb25zdHJ1Y3RQb3N0U2NyaXB0IiwiY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUiIsIm51bU91dHB1dHMiLCJudW1JbnB1dHMiLCJNQVhfQ0FDSEVfU0laRSIsImNhY2hlX2F2YWlsYWJsZSIsImNhY2hlZFZhbHVlIiwic3RhY2tJbmRleCIsImJvdW5kIiwiZm5EaWN0IiwiUG9zdFNjcmlwdFN0YWNrIiwiTUFYX1NUQUNLX1NJWkUiLCJjb3B5Iiwicm9sbCIsIlBvc3RTY3JpcHRFdmFsdWF0b3IiLCJleGVjdXRlIiwib3BlcmF0b3IiLCJQb3N0U2NyaXB0Q29tcGlsZXIiLCJBc3ROb2RlIiwiQXN0QXJndW1lbnQiLCJBc3RMaXRlcmFsIiwiQXN0QmluYXJ5T3BlcmF0aW9uIiwiQXN0TWluIiwiQXN0VmFyaWFibGUiLCJBc3RWYXJpYWJsZURlZmluaXRpb24iLCJFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IiLCJ2aXNpdEFyZ3VtZW50IiwidmlzaXRWYXJpYWJsZSIsInZpc2l0TGl0ZXJhbCIsImxpdGVyYWwiLCJ2aXNpdEJpbmFyeU9wZXJhdGlvbiIsInZpc2l0VmFyaWFibGVEZWZpbml0aW9uIiwiZGVmaW5pdGlvbiIsInZpc2l0TWluIiwiY29tcGlsZSIsImluc3RydWN0aW9ucyIsImxhc3RSZWdpc3RlciIsImJ1aWxkQWRkT3BlcmF0aW9uIiwiYnVpbGRNdWxPcGVyYXRpb24iLCJidWlsZFN1Yk9wZXJhdGlvbiIsImFzdDEiLCJhc3QyIiwidG1wVmFyIiwiYnVpbGRNaW5PcGVyYXRpb24iLCJzdGF0ZW1lbnRCdWlsZGVyIiwiaW5zdHJ1Y3Rpb24iLCJleHByIiwiYWNjZXB0IiwiZXhwZWN0IiwiUG9zdFNjcmlwdFRva2VuVHlwZXMiLCJjb25kaXRpb25Mb2NhdGlvbiIsImp1bXBMb2NhdGlvbiIsImVuZE9mVHJ1ZSIsIkxCUkFDRSIsIlJCUkFDRSIsIk5VTUJFUiIsIk9QRVJBVE9SIiwiSUYiLCJJRkVMU0UiLCJQb3N0U2NyaXB0VG9rZW4iLCJvcENhY2hlIiwib3BWYWx1ZSIsImJhc2VUeXBlcyIsImFyYWJpY1R5cGVzIiwiaXNMVFIiLCJzdHJMZW5ndGgiLCJjcmVhdGVCaWRpVGV4dCIsIm51bUJpZGkiLCJjaGFyVHlwZSIsInN0YXJ0TGV2ZWwiLCJsZXZlbHMiLCJpc09kZCIsInNvciIsImVvciIsImxhc3RUeXBlIiwiZmluZFVuZXF1YWwiLCJiZWZvcmUiLCJhZnRlciIsInNldFZhbHVlcyIsImlzRXZlbiIsImhpZ2hlc3RMZXZlbCIsImxvd2VzdE9kZExldmVsIiwicmV2ZXJzZVZhbHVlcyIsImdldE1ldHJpY3MiLCJTRUVEIiwiTUFTS19ISUdIIiwiTUFTS19MT1ciLCJzZWVkIiwidXBkYXRlIiwiYmxvY2tDb3VudHMiLCJ0YWlsTGVuZ3RoIiwiZGF0YVVpbnQzMiIsImsyIiwiQzEiLCJDMiIsIkMxX0xPVyIsIkMyX0xPVyIsImhleDEiLCJoZXgyIiwiYWRkZW5kIiwiaXNNYXNrIiwiaXNJbmRleGVkIiwibWFza0RpY3QiLCJkZWNvZGVCdWZmZXIiLCJkZWNvZGVBZGRlbmRzIiwiZGVjb2RlQ29lZmZpY2llbnRzIiwiZGVjb2RlQW5kQ2xhbXAiLCJnZXRDb21wb25lbnRzIiwiYnVmZmVyUG9zIiwicm93Q29tcHMiLCJsb29wMUVuZCIsImxvb3AyRW5kIiwicmVtYWluaW5nQml0cyIsImZpbGxPcGFjaXR5Iiwic3ciLCJzaCIsImFscGhhQnVmIiwicmVzaXplSW1hZ2VNYXNrIiwib3BhY2l0eSIsImltYWdlT2Zmc2V0IiwibWFza09mZnNldCIsInJnYmFCdWYiLCJ1bmRvUHJlYmxlbmQiLCJtYXR0ZSIsIm1hdHRlUmdiIiwibWF0dGVSIiwibWF0dGVHIiwibWF0dGVCIiwiZm9yY2VSR0JBIiwiY3JlYXRlSW1hZ2VEYXRhIiwiZHJhd1dpZHRoIiwiZHJhd0hlaWdodCIsIm5ld0FycmF5IiwiaW1hZ2VMZW5ndGgiLCJhY3R1YWxIZWlnaHQiLCJtYXliZVVuZG9QcmVibGVuZCIsImZpbGxHcmF5QnVmZmVyIiwiZ2V0SW1hZ2VCeXRlcyIsImltYWdlRGF0YSIsInNtYXNrRGF0YSIsIm1hc2tEYXRhIiwiY29tcHV0ZWRMZW5ndGgiLCJoYXZlRnVsbERhdGEiLCJDYWxsYmFja0tpbmQiLCJEQVRBIiwiRVJST1IiLCJTdHJlYW1LaW5kIiwiQ0FOQ0VMIiwiQ0FOQ0VMX0NPTVBMRVRFIiwiQ0xPU0UiLCJFTlFVRVVFIiwiUFVMTCIsIlBVTExfQ09NUExFVEUiLCJTVEFSVF9DT01QTEVURSIsImNhbGxiYWNrSWQiLCJ3cmFwUmVhc29uIiwiY2JTb3VyY2VOYW1lIiwiY2JUYXJnZXROYW1lIiwiY29tT2JqIiwic291cmNlTmFtZSIsInRhcmdldE5hbWUiLCJhaCIsInNlbmRXaXRoUHJvbWlzZSIsInNlbmRXaXRoU3RyZWFtIiwic3RyZWFtSWQiLCJzdGFydENhcGFiaWxpdHkiLCJzdGFydENhbGwiLCJwdWxsQ2FsbCIsImNhbmNlbENhbGwiLCJpc0Nsb3NlZCIsInB1bGwiLCJwdWxsQ2FwYWJpbGl0eSIsImNhbmNlbENhcGFiaWxpdHkiLCJfY3JlYXRlU3RyZWFtU2luayIsImxhc3REZXNpcmVkU2l6ZSIsInNpbmtDYXBhYmlsaXR5Iiwib25QdWxsIiwib25DYW5jZWwiLCJpc0NhbmNlbGxlZCIsInN1Y2Nlc3MiLCJfcHJvY2Vzc1N0cmVhbU1lc3NhZ2UiLCJfcG9zdE1lc3NhZ2UiLCJnZXRSYW5nZVJlYWRlciIsImNhbmNlbEFs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RHJFQTtBQUNBQSxVQXpEcUUsRUF5RHJFQTtBQUNBQSxVQTFEcUUsRUEwRHJFQTtBQUNBQSxVQTNEcUUsRUEyRHJFQTtBQUNBQSxVQTVEcUUsRUE0RHJFQTtBQUNBQSxVQTdEcUUsRUE2RHJFQTtBQUNBQSxVQTlEcUUsRUE4RHJFQTtBQUNBQSxVQS9EcUUsRUErRHJFQTtBQUNBQSxVQWhFcUUsRUFnRXJFQTtBQUNBQSxVQWpFcUUsRUFpRXJFQTtBQUNBQSxVQWxFcUUsRUFrRXJFQTtBQUNBQSxVQW5FcUUsRUFtRXJFQTtBQUNBQSxVQXBFcUUsRUFvRXJFQTtBQUNBQSxVQXJFcUUsRUFxRXJFQTtBQUNBQSxVQXRFcUUsR0FzRXJFQTtBQUNBQSxVQXZFcUUsR0F1RXJFQTtBQUNBQSxVQXhFcUUsR0F3RXJFQTtBQUNBQSxVQXpFcUUsR0F5RXJFQTtBQUNBQSxVQTFFcUUsR0EwRXJFQTtBQUNBQSxVQTNFcUUsR0EyRXJFQTtBQUNBQSxVQTVFcUUsR0E0RXJFQTtBQUNBQSxVQTdFcUUsR0E2RXJFQTtBQUNBQSxVQTlFcUUsR0E4RXJFQTtBQUNBQSxVQS9FcUUsR0ErRXJFQTtBQUNBQSxVQWhGcUUsR0FnRnJFQTtBQUNBQSxVQWpGcUUsR0FpRnJFQTtBQUNBQSxVQWxGcUUsR0FrRnJFQTtBQUNBQSxVQW5GcUUsR0FtRnJFQTtBQUNBQSxVQXBGcUUsR0FvRnJFQTtBQUNBQSxVQXJGcUUsR0FxRnJFQTtBQUNBQSxVQXRGcUUsR0FzRnJFQTtBQUNBQSxVQXZGcUUsR0F1RnJFQTtBQUNBQSxVQXhGcUUsR0F3RnJFQTtBQUNBQSxVQXpGcUUsR0F5RnJFQTtBQUNBQSxVQTFGcUUsR0EwRnJFQTtBQUNBQSxVQTNGcUUsR0EyRnJFQTtBQUNBQSxVQTVGcUUsR0E0RnJFQTtBQUNBQSxVQTdGcUUsR0E2RnJFQTtBQUNBQSxVQTlGcUUsR0E4RnJFQTtBQUNBQSxVQS9GcUUsR0ErRnJFQTtBQUNBQSxVQWhHcUUsR0FnR3JFQTtBQUNBQSxVQWpHcUUsR0FpR3JFQTtBQUNBQSxVQWxHcUUsR0FrR3JFQTtBQUNBQSxXQW5HcUUsR0FtR3JFQTtBQUNBQSxXQXBHcUUsR0FvR3JFQTtBQUNBQSxXQXJHcUUsR0FxR3JFQTtBQUNBQSxXQXRHcUUsR0FzR3JFQTtBQUNBQSxXQXZHcUUsR0F1R3JFQTtBQUNBQSxXQXhHcUUsR0F3R3JFQTtBQUNBQSxXQXpHcUUsR0F5R3JFQTtBQUNBQSxXQTFHcUUsR0EwR3JFQTtBQUNBQSxXQTNHcUUsR0EyR3JFQTtBQUNBQSxXQTVHcUUsR0E0R3JFQTtBQUNBQSxXQTdHcUUsR0E2R3JFQTtBQUNBQSxXQTlHcUUsR0E4R3JFQTtBQUNBQSxXQS9HcUUsR0ErR3JFQTtBQUNBQSxXQWhIcUUsR0FnSHJFQTtBQUNBQSxXQWpIcUUsR0FpSHJFQTtBQUNBQSxXQWxIcUUsR0FrSHJFQTtBQUNBQSxXQW5IcUUsR0FtSHJFQTtBQUNBQSxXQXBIcUUsR0FvSHJFQTtBQUNBQSxXQXJIcUUsR0FxSHJFQTtBQUNBQSxXQXRIcUUsR0FzSHJFQTtBQUNBQSxXQXZIcUUsR0F1SHJFQTtBQUNBQSxXQXhIcUUsR0F3SHJFQTtBQUNBQSxXQXpIcUUsR0F5SHJFQTtBQUNBQSxXQTFIcUUsR0EwSHJFQTtBQUNBQSxXQTNIcUUsR0EySHJFQTtBQUNBQSxXQTVIcUUsR0E0SHJFQTtBQUNBQSxXQTdIcUUsR0E2SHJFQTtBQUNBQSxXQTlIcUUsR0E4SHJFQTtBQUNBQSxXQS9IcUUsR0ErSHJFQTtBQUNBQSxXQWhJcUUsR0FnSXJFQTtBQUNBQSxXQWpJcUUsSUFpSXJFQTtBQUNBQSxXQWxJcUUsR0FrSXJFQTtBQUNBQSxXQW5JcUUsR0FtSXJFQTtBQUNBQSxXQXBJcUUsR0FvSXJFQTtBQUNBQSxXQXJJcUUsR0FxSXJFQTtBQUNBQSxXQXRJcUUsSUFzSXJFQTtBQUNBQSxXQXZJcUUsR0F1SXJFQTtBQUNBQSxXQXhJcUUsR0F3SXJFQTtBQUNBQSxXQXpJcUUsR0F5SXJFQTtBQUNBQSxXQTFJcUUsR0EwSXJFQTtBQUNBQSxXQTNJcUUsSUEySXJFQTtBQUNBQSxXQTVJcUUsR0E0SXJFQTtBQUNBQSxXQTdJcUUsR0E2SXJFQTtBQUNBQSxXQTlJcUUsSUE4SXJFQTtBQUNBQSxXQS9JcUUsR0ErSXJFQTtBQUNBQSxXQWhKcUUsR0FnSnJFQTtBQUNBQSxXQWpKcUUsSUFpSnJFQTtBQUNBQSxXQWxKcUUsR0FrSnJFQTtBQUNBQSxXQW5KcUUsSUFtSnJFQTtBQUNBQSxXQXBKcUUsSUFvSnJFQTtBQUNBQSxXQXJKcUUsR0FxSnJFQTtBQUNBQSxXQXRKcUUsR0FzSnJFQTtBQUNBQSxXQXZKcUUsSUF1SnJFQTtBQUNBQSxXQXhKcUUsSUF3SnJFQTtBQUNBQSxXQXpKcUUsSUF5SnJFQTtBQUNBQSxXQTFKcUUsSUEwSnJFQTtBQUNBQSxXQTNKcUUsR0EySnJFQTtBQUNBQSxXQTVKcUUsR0E0SnJFQTtBQUNBQSxXQTdKcUUsSUE2SnJFQTtBQUNBQSxXQTlKcUUsR0E4SnJFQTtBQUNBQSxXQS9KcUUsR0ErSnJFQTtBQUNBQSxXQWhLcUUsR0FnS3JFQTtBQUNBQSxXQWpLcUUsR0FpS3JFQTtBQUNBQSxXQWxLcUUsR0FrS3JFQTtBQUNBQSxXQW5LcUUsSUFtS3JFQTtBQUNBQSxXQXBLcUUsR0FvS3JFQTtBQUNBQSxXQXJLcUUsSUFxS3JFQTtBQUNBQSxXQXRLcUUsSUFzS3JFQTtBQUNBQSxXQXZLcUUsR0F1S3JFQTtBQUNBQSxXQXhLcUUsR0F3S3JFQTtBQUNBQSxXQXpLcUUsSUF5S3JFQTtBQUNBQSxXQTFLcUUsR0EwS3JFQTtBQUNBQSxXQTNLcUUsR0EyS3JFQTtBQUNBQSxXQTVLcUUsR0E0S3JFQTtBQUNBQSxXQTdLcUUsR0E2S3JFQTtBQUNBQSxXQTlLcUUsR0E4S3JFQTtBQUNBQSxXQS9LcUUsR0ErS3JFQTtBQUNBQSxXQWhMcUUsR0FnTHJFQTtBQUNBQSxXQWpMcUUsR0FpTHJFQTtBQUNBQSxXQWxMcUUsR0FrTHJFQTtBQUNBQSxXQW5McUUsR0FtTHJFQTtBQUNBQSxXQXBMcUUsR0FvTHJFQTtBQUNBQSxXQXJMcUUsR0FxTHJFQTtBQUNBQSxXQXRMcUUsR0FzTHJFQTtBQUNBQSxXQXZMcUUsR0F1THJFQTtBQUNBQSxXQXhMcUUsR0F3THJFQTtBQUNBQSxXQXpMcUUsR0F5THJFQTtBQUNBQSxXQTFMcUUsR0EwTHJFQTtBQUNBQSxXQTNMcUUsR0EyTHJFQTtBQUNBQSxXQTVMcUUsR0E0THJFQTtBQUNBQSxXQTdMcUUsR0E2THJFQTtBQUNBQSxXQTlMcUUsR0E4THJFQTtBQUNBQSxXQS9McUUsR0ErTHJFQTtBQUNBQSxXQWhNcUUsR0FnTXJFQTtBQUNBQSxXQWpNcUUsR0FpTXJFQTtBQUNBQSxXQWxNcUUsR0FrTXJFQTtBQUNBQSxXQW5NcUUsR0FtTXJFQTtBQUNBQSxXQXBNcUUsR0FvTXJFQTtBQUNBQSxXQXJNcUUsR0FxTXJFQTtBQUNBQSxXQXRNcUUsR0FzTXJFQTtBQUNBQSxXQXZNcUUsR0F1TXJFQTtBQUNBQSxXQXhNcUUsSUF3TXJFQTtBQUNBQSxXQXpNcUUsSUF5TXJFQTtBQUNBQSxXQTFNcUUsSUEwTXJFQTtBQUNBQSxXQTNNcUUsSUEyTXJFQTtBQUNBQSxXQTVNcUUsSUE0TXJFQTtBQUNBQSxXQTdNcUUsSUE2TXJFQTtBQUNBQSxXQTlNcUUsSUE4TXJFQTtBQUNBQSxXQS9NcUUsSUErTXJFQTtBQUNBQSxXQWhOcUUsSUFnTnJFQTtBQUNBQSxXQWpOcUUsSUFpTnJFQTtBQUNBQSxXQWxOcUUsSUFrTnJFQTtBQUNBQSxXQW5OcUUsS0FtTnJFQTtBQUNBQSxXQXBOcUUsS0FvTnJFQTtBQUNBQSxXQXJOcUUsSUFxTnJFQTtBQUNBQSxXQXROcUUsSUFzTnJFQTtBQUNBQSxXQXZOcUUsSUF1TnJFQTtBQUNBQSxXQXhOcUUsSUF3TnJFQTtBQUNBQSxXQXpOcUUsSUF5TnJFQTtBQUNBQSxXQTFOcUUsSUEwTnJFQTtBQUNBQSxXQTNOcUUsSUEyTnJFQTtBQUNBQSxXQTVOcUUsSUE0TnJFQTtBQUNBQSxXQTdOcUUsR0E2TnJFQTtBQUNBQSxXQTlOcUUsS0E4TnJFQTtBQUNBQSxXQS9OcUUsSUErTnJFQTtBQUNBQSxXQWhPcUUsSUFnT3JFQTtBQUNBQSxXQWpPcUUsR0FpT3JFQTtBQUNBQSxXQWxPcUUsR0FrT3JFQTtBQUNBQSxXQW5PcUUsR0FtT3JFQTtBQUNBQSxXQXBPcUUsR0FvT3JFQTtBQUNBQSxXQXJPcUUsS0FxT3JFQTtBQUNBQSxXQXRPcUUsS0FzT3JFQTtBQUNBQSxXQXZPcUUsS0F1T3JFQTtBQUNBQSxXQXhPcUUsS0F3T3JFQTtBQUNBQSxXQXpPcUUsS0F5T3JFQTtBQUNBQSxXQTFPcUUsS0EwT3JFQTtBQUNBQSxXQTNPcUUsS0EyT3JFQTtBQUNBQSxXQTVPcUUsS0E0T3JFQTtBQUNBQSxXQTdPcUUsS0E2T3JFQTtBQUNBQSxZQTlPcUUsSUE4T3JFQTtBQUNBQSxZQS9PcUUsSUErT3JFQTtBQUNBQSxZQWhQcUUsSUFnUHJFQTtBQUNBQSxZQWpQcUUsSUFpUHJFQTtBQUNBQSxZQWxQcUUsSUFrUHJFQTtBQUNBQSxZQW5QcUUsSUFtUHJFQTtBQUNBQSxZQXBQcUUsSUFvUHJFQTtBQUNBQSxZQXJQcUUsSUFxUHJFQTtBQUNBQSxZQXRQcUUsSUFzUHJFQTtBQUNBQSxZQXZQcUUsSUF1UHJFQTtBQUNBQSxZQXhQcUUsSUF3UHJFQTtBQUNBQSxZQXpQcUUsR0F5UHJFQTtBQUNBQSxZQTFQcUUsR0EwUHJFQTtBQUNBQSxZQTNQcUUsR0EyUHJFQTtBQUNBQSxZQTVQcUUsR0E0UHJFQTtBQUNBQSxZQTdQcUUsR0E2UHJFQTtBQUNBQSxZQTlQcUUsR0E4UHJFQTtBQUNBQSxZQS9QcUUsR0ErUHJFQTtBQUNBQSxZQWhRcUUsR0FnUXJFQTtBQUNBQSxZQWpRcUUsR0FpUXJFQTtBQUNBQSxZQWxRcUUsR0FrUXJFQTtBQUNBQSxZQW5RcUUsR0FtUXJFQTtBQUNBQSxZQXBRcUUsR0FvUXJFQTtBQUNBQSxZQXJRcUUsR0FxUXJFQTtBQUNBQSxZQXRRcUUsR0FzUXJFQTtBQUNBQSxZQXZRcUUsSUF1UXJFQTtBQUNBQSxZQXhRcUUsSUF3UXJFQTtBQUNBQSxZQXpRcUUsSUF5UXJFQTtBQUNBQSxZQTFRcUUsSUEwUXJFQTtBQUNBQSxZQTNRcUUsSUEyUXJFQTtBQUNBQSxZQTVRcUUsSUE0UXJFQTtBQUNBQSxZQTdRcUUsSUE2UXJFQTtBQUNBQSxZQTlRcUUsSUE4UXJFQTtBQUNBQSxZQS9RcUUsSUErUXJFQTtBQUNBQSxZQWhScUUsSUFnUnJFQTtBQUNBQSxZQWpScUUsSUFpUnJFQTtBQUNBQSxZQWxScUUsSUFrUnJFQTtBQUNBQSxZQW5ScUUsSUFtUnJFQTtBQUNBQSxZQXBScUUsSUFvUnJFQTtBQUNBQSxZQXJScUUsSUFxUnJFQTtBQUNBQSxZQXRScUUsSUFzUnJFQTtBQUNBQSxZQXZScUUsSUF1UnJFQTtBQUNBQSxZQXhScUUsSUF3UnJFQTtBQUNBQSxZQXpScUUsSUF5UnJFQTtBQUNBQSxZQTFScUUsSUEwUnJFQTtBQUNBQSxZQTNScUUsSUEyUnJFQTtBQUNBQSxZQTVScUUsSUE0UnJFQTtBQUNBQSxZQTdScUUsSUE2UnJFQTtBQUNBQSxZQTlScUUsSUE4UnJFQTtBQUNBQSxZQS9ScUUsSUErUnJFQTtBQUNBQSxZQWhTcUUsSUFnU3JFQTtBQUNBQSxZQWpTcUUsSUFpU3JFQTtBQUNBQSxZQWxTcUUsSUFrU3JFQTtBQUNBQSxZQW5TcUUsSUFtU3JFQTtBQUNBQSxZQXBTcUUsSUFvU3JFQTtBQUNBQSxZQXJTcUUsSUFxU3JFQTtBQUNBQSxZQXRTcUUsSUFzU3JFQTtBQUNBQSxZQXZTcUUsSUF1U3JFQTtBQUNBQSxZQXhTcUUsSUF3U3JFQTtBQUNBQSxZQXpTcUUsSUF5U3JFQTtBQUNBQSxZQTFTcUUsSUEwU3JFQTtBQUNBQSxZQTNTcUUsSUEyU3JFQTtBQUNBQSxZQTVTcUUsSUE0U3JFQTtBQUNBQSxZQTdTcUUsSUE2U3JFQTtBQUNBQSxZQTlTcUUsSUE4U3JFQTtBQUNBQSxZQS9TcUUsSUErU3JFQTtBQUNBQSxZQWhUcUUsSUFnVHJFQTtBQUNBQSxZQWpUcUUsSUFpVHJFQTtBQUNBQSxZQWxUcUUsSUFrVHJFQTtBQUNBQSxZQW5UcUUsSUFtVHJFQTtBQUNBQSxZQXBUcUUsSUFvVHJFQTtBQUNBQSxZQXJUcUUsSUFxVHJFQTtBQUNBQSxZQXRUcUUsSUFzVHJFQTtBQUNBQSxZQXZUcUUsSUF1VHJFQTtBQUNBQSxZQXhUcUUsSUF3VHJFQTtBQUNBQSxZQXpUcUUsSUF5VHJFQTtBQUNBQSxZQTFUcUUsSUEwVHJFQTtBQUNBQSxZQTNUcUUsSUEyVHJFQTtBQUNBQSxZQTVUcUUsSUE0VHJFQTtBQUNBQSxZQTdUcUUsSUE2VHJFQTtBQUNBQSxZQTlUcUUsSUE4VHJFQTtBQUNBQSxZQS9UcUUsSUErVHJFQTtBQUNBQSxZQWhVcUUsSUFnVXJFQTtBQUNBQSxZQWpVcUUsSUFpVXJFQTtBQUNBQSxZQWxVcUUsSUFrVXJFQTtBQUNBQSxZQW5VcUUsSUFtVXJFQTtBQUNBQSxZQXBVcUUsSUFvVXJFQTtBQUNBQSxZQXJVcUUsSUFxVXJFQTtBQUNBQSxZQXRVcUUsSUFzVXJFQTtBQUNBQSxZQXZVcUUsSUF1VXJFQTtBQUNBQSxZQXhVcUUsS0F3VXJFQTtBQUNBQSxZQXpVcUUsS0F5VXJFQTtBQUNBQSxZQTFVcUUsS0EwVXJFQTtBQUNBQSxZQTNVcUUsS0EyVXJFQTtBQUNBQSxZQTVVcUUsS0E0VXJFQTtBQUNBQSxZQTdVcUUsS0E2VXJFQTtBQUNBQSxZQTlVcUUsSUE4VXJFQTtBQUNBQSxZQS9VcUUsSUErVXJFQTtBQUNBQSxZQWhWcUUsSUFnVnJFQTtBQUNBQSxZQWpWcUUsSUFpVnJFQTtBQUNBQSxZQWxWcUUsSUFrVnJFQTtBQUNBQSxZQW5WcUUsSUFtVnJFQTtBQUNBQSxZQXBWcUUsSUFvVnJFQTtBQUNBQSxZQXJWcUUsSUFxVnJFQTtBQUNBQSxZQXRWcUUsSUFzVnJFQTtBQUNBQSxZQXZWcUUsSUF1VnJFQTtBQUNBQSxZQXhWcUUsSUF3VnJFQTtBQUNBQSxZQXpWcUUsSUF5VnJFQTtBQUNBQSxZQTFWcUUsSUEwVnJFQTtBQUNBQSxZQTNWcUUsSUEyVnJFQTtBQUNBQSxZQTVWcUUsSUE0VnJFQTtBQUNBQSxZQTdWcUUsSUE2VnJFQTtBQUNBQSxZQTlWcUUsSUE4VnJFQTtBQUNBQSxZQS9WcUUsSUErVnJFQTtBQUNBQSxZQWhXcUUsSUFnV3JFQTtBQUNBQSxZQWpXcUUsSUFpV3JFQTtBQUNBQSxZQWxXcUUsSUFrV3JFQTtBQUNBQSxZQW5XcUUsSUFtV3JFQTtBQUNBQSxZQXBXcUUsSUFv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QUFFLFFBQUYsSUFBYyxjQUFkLENBbEI2RDtBQUFBLENBbUI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBbkI2RDtBQUFBLENBb0I3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBcEI2RDtBQUFBLENBcUI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBckI2RDtBQUFBLENBc0I3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBdEI2RDtBQUFBLENBdUI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBdkI2RDtBQUFBLENBd0I3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBeEI2RDtBQUFBLENBeUI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBekI2RDtBQUFBLENBMEI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBMUI2RDtBQUFBLENBMkI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBM0I2RDtBQUFBLENBNEI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBNUI2RDtBQUFBLENBNkI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBN0I2RDtBQUFBLENBOEI3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBOUI2RDtBQUFBLENBK0I3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBL0I2RDtBQUFBLENBZ0M3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBaEM2RDtBQUFBLENBaUM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBakM2RDtBQUFBLENBa0M3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBbEM2RDtBQUFBLENBbUM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBbkM2RDtBQUFBLENBb0M3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBcEM2RDtBQUFBLENBcUM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBckM2RDtBQUFBLENBc0M3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBdEM2RDtBQUFBLENBdUM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBdkM2RDtBQUFBLENBd0M3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBeEM2RDtBQUFBLENBeUM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBekM2RDtBQUFBLENBMEM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBMUM2RDtBQUFBLENBMkM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBM0M2RDtBQUFBLENBNEM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBNUM2RDtBQUFBLENBNkM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBN0M2RDtBQUFBLENBOEM3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBOUM2RDtBQUFBLENBK0M3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBL0M2RDtBQUFBLENBZ0Q3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBaEQ2RDtBQUFBLENBaUQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBakQ2RDtBQUFBLENBa0Q3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBbEQ2RDtBQUFBLENBbUQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBbkQ2RDtBQUFBLENBb0Q3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBcEQ2RDtBQUFBLENBcUQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBckQ2RDtBQUFBLENBc0Q3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBdEQ2RDtBQUFBLENBdUQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBdkQ2RDtBQUFBLENBd0Q3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBeEQ2RDtBQUFBLENBeUQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBekQ2RDtBQUFBLENBMEQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBMUQ2RDtBQUFBLENBMkQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBM0Q2RDtBQUFBLENBNEQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBNUQ2RDtBQUFBLENBNkQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBN0Q2RDtBQUFBLENBOEQ3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBOUQ2RDtBQUFBLENBK0Q3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBL0Q2RDtBQUFBLENBZ0U3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBaEU2RDtBQUFBLENBaUU3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBakU2RDtBQUFBLENBa0U3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBbEU2RDtBQUFBLENBbUU3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBbkU2RDtBQUFBLENBb0U3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBcEU2RDtBQUFBLENBcUU3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBckU2RDtBQUFBLENBc0U3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXRFNkQ7QUFBQSxDQXVFN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQXZFNkQ7QUFBQSxDQXdFN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0F4RTZEO0FBQUEsQ0F5RTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F6RTZEO0FBQUEsQ0EwRTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBMUU2RDtBQUFBLENBMkU3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBM0U2RDtBQUFBLENBNEU3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBNUU2RDtBQUFBLENBNkU3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBN0U2RDtBQUFBLENBOEU3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBOUU2RDtBQUFBLENBK0U3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBL0U2RDtBQUFBLENBZ0Y3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYywwQkFBZCxDQWhGNkQ7QUFBQSxDQWlGN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpGNkQ7QUFBQSxDQWtGN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQWxGNkQ7QUFBQSxDQW1GN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FuRjZEO0FBQUEsQ0FvRjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBcEY2RDtBQUFBLENBcUY3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBckY2RDtBQUFBLENBc0Y3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXRGNkQ7QUFBQSxDQXVGN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0F2RjZEO0FBQUEsQ0F3RjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4RjZEO0FBQUEsQ0F5RjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F6RjZEO0FBQUEsQ0EwRjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0ExRjZEO0FBQUEsQ0EyRjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBM0Y2RDtBQUFBLENBNEY3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBNUY2RDtBQUFBLENBNkY3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBN0Y2RDtBQUFBLENBOEY3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBOUY2RDtBQUFBLENBK0Y3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBL0Y2RDtBQUFBLENBZ0c3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQWhHNkQ7QUFBQSxDQWlHN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQWpHNkQ7QUFBQSxDQWtHN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQWxHNkQ7QUFBQSxDQW1HN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FuRzZEO0FBQUEsQ0FvRzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0FwRzZEO0FBQUEsQ0FxRzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyRzZEO0FBQUEsQ0FzRzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F0RzZEO0FBQUEsQ0F1RzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBdkc2RDtBQUFBLENBd0c3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYywwQkFBZCxDQXhHNkQ7QUFBQSxDQXlHN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQXpHNkQ7QUFBQSxDQTBHN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsUUFBZCxDQTFHNkQ7QUFBQSxDQTJHN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQTNHNkQ7QUFBQSxDQTRHN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0E1RzZEO0FBQUEsQ0E2RzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3RzZEO0FBQUEsQ0E4RzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5RzZEO0FBQUEsQ0ErRzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvRzZEO0FBQUEsQ0FnSDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoSDZEO0FBQUEsQ0FpSDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqSDZEO0FBQUEsQ0FrSDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0FsSDZEO0FBQUEsQ0FtSDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBbkg2RDtBQUFBLENBb0g3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBcEg2RDtBQUFBLENBcUg3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBckg2RDtBQUFBLENBc0g3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBdEg2RDtBQUFBLENBdUg3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXZINkQ7QUFBQSxDQXdIN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsMEJBQWQsQ0F4SDZEO0FBQUEsQ0F5SDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F6SDZEO0FBQUEsQ0EwSDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExSDZEO0FBQUEsQ0EySDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0EzSDZEO0FBQUEsQ0E0SDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBNUg2RDtBQUFBLENBNkg3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBN0g2RDtBQUFBLENBOEg3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBOUg2RDtBQUFBLENBK0g3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBL0g2RDtBQUFBLENBZ0k3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxRQUFkLENBaEk2RDtBQUFBLENBaUk3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxjQUFkLENBakk2RDtBQUFBLENBa0k3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQWxJNkQ7QUFBQSxDQW1JN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQW5JNkQ7QUFBQSxDQW9JN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FwSTZEO0FBQUEsQ0FxSTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBckk2RDtBQUFBLENBc0k3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXRJNkQ7QUFBQSxDQXVJN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0F2STZEO0FBQUEsQ0F3STdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBeEk2RDtBQUFBLENBeUk3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXpJNkQ7QUFBQSxDQTBJN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0ExSTZEO0FBQUEsQ0EySTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBM0k2RDtBQUFBLENBNEk3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQTVJNkQ7QUFBQSxDQTZJN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0E3STZEO0FBQUEsQ0E4STdEQSxDQUFBLENBQUUsUUFBRixJQUFjLDBCQUFkLENBOUk2RDtBQUFBLENBK0k3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYywwQkFBZCxDQS9JNkQ7QUFBQSxDQWdKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsMEJBQWQsQ0FoSjZEO0FBQUEsQ0FpSjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLDBCQUFkLENBako2RDtBQUFBLENBa0o3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYywwQkFBZCxDQWxKNkQ7QUFBQSxDQW1KN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsMEJBQWQsQ0FuSjZEO0FBQUEsQ0FvSjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLDBCQUFkLENBcEo2RDtBQUFBLENBcUo3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYywwQkFBZCxDQXJKNkQ7QUFBQSxDQXNKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsMEJBQWQsQ0F0SjZEO0FBQUEsQ0F1SjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLDBCQUFkLENBdko2RDtBQUFBLENBd0o3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYywwQkFBZCxDQXhKNkQ7QUFBQSxDQXlKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQXpKNkQ7QUFBQSxDQTBKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQTFKNkQ7QUFBQSxDQTJKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQTNKNkQ7QUFBQSxDQTRKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQTVKNkQ7QUFBQSxDQTZKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQTdKNkQ7QUFBQSxDQThKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQTlKNkQ7QUFBQSxDQStKN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQS9KNkQ7QUFBQSxDQWdLN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQWhLNkQ7QUFBQSxDQWlLN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQWpLNkQ7QUFBQSxDQWtLN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FsSzZEO0FBQUEsQ0FtSzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBbks2RDtBQUFBLENBb0s3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXBLNkQ7QUFBQSxDQXFLN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FySzZEO0FBQUEsQ0FzSzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBdEs2RDtBQUFBLENBdUs3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXZLNkQ7QUFBQSxDQXdLN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0F4SzZEO0FBQUEsQ0F5SzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBeks2RDtBQUFBLENBMEs3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQTFLNkQ7QUFBQSxDQTJLN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0EzSzZEO0FBQUEsQ0E0SzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBNUs2RDtBQUFBLENBNks3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQTdLNkQ7QUFBQSxDQThLN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0E5SzZEO0FBQUEsQ0ErSzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBL0s2RDtBQUFBLENBZ0w3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQWhMNkQ7QUFBQSxDQWlMN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FqTDZEO0FBQUEsQ0FrTDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBbEw2RDtBQUFBLENBbUw3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQW5MNkQ7QUFBQSxDQW9MN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FwTDZEO0FBQUEsQ0FxTDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBckw2RDtBQUFBLENBc0w3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXRMNkQ7QUFBQSxDQXVMN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0F2TDZEO0FBQUEsQ0F3TDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBeEw2RDtBQUFBLENBeUw3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXpMNkQ7QUFBQSxDQTBMN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0ExTDZEO0FBQUEsQ0EyTDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBM0w2RDtBQUFBLENBNEw3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQTVMNkQ7QUFBQSxDQTZMN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0E3TDZEO0FBQUEsQ0E4TDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBOUw2RDtBQUFBLENBK0w3REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQS9MNkQ7QUFBQSxDQWdNN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FoTTZEO0FBQUEsQ0FpTTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBak02RDtBQUFBLENBa003REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQWxNNkQ7QUFBQSxDQW1NN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0FuTTZEO0FBQUEsQ0FvTTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLG9CQUFkLENBcE02RDtBQUFBLENBcU03REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXJNNkQ7QUFBQSxDQXNNN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0F0TTZEO0FBQUEsQ0F1TTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLDBCQUFkLENBdk02RDtBQUFBLENBd003REEsQ0FBQSxDQUFFLFFBQUYsSUFBYyxvQkFBZCxDQXhNNkQ7QUFBQSxDQXlNN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsY0FBZCxDQXpNNkQ7QUFBQSxDQTBNN0RBLENBQUEsQ0FBRSxRQUFGLElBQWMsb0JBQWQsQ0ExTTZEO0FBQUEsQ0EyTTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzTTZEO0FBQUEsQ0E0TTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1TTZEO0FBQUEsQ0E2TTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3TTZEO0FBQUEsQ0E4TTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5TTZEO0FBQUEsQ0ErTTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvTTZEO0FBQUEsQ0FnTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoTjZEO0FBQUEsQ0FpTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqTjZEO0FBQUEsQ0FrTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsTjZEO0FBQUEsQ0FtTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuTjZEO0FBQUEsQ0FvTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwTjZEO0FBQUEsQ0FxTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyTjZEO0FBQUEsQ0FzTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0TjZEO0FBQUEsQ0F1TjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2TjZEO0FBQUEsQ0F3TjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4TjZEO0FBQUEsQ0F5TjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6TjZEO0FBQUEsQ0EwTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExTjZEO0FBQUEsQ0EyTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzTjZEO0FBQUEsQ0E0TjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1TjZEO0FBQUEsQ0E2TjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3TjZEO0FBQUEsQ0E4TjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5TjZEO0FBQUEsQ0ErTjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvTjZEO0FBQUEsQ0FnTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoTzZEO0FBQUEsQ0FpTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqTzZEO0FBQUEsQ0FrTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsTzZEO0FBQUEsQ0FtTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuTzZEO0FBQUEsQ0FvTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwTzZEO0FBQUEsQ0FxTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyTzZEO0FBQUEsQ0FzTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0TzZEO0FBQUEsQ0F1TzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2TzZEO0FBQUEsQ0F3TzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4TzZEO0FBQUEsQ0F5TzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6TzZEO0FBQUEsQ0EwTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExTzZEO0FBQUEsQ0EyTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzTzZEO0FBQUEsQ0E0TzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1TzZEO0FBQUEsQ0E2TzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3TzZEO0FBQUEsQ0E4TzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5TzZEO0FBQUEsQ0ErTzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvTzZEO0FBQUEsQ0FnUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoUDZEO0FBQUEsQ0FpUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqUDZEO0FBQUEsQ0FrUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsUDZEO0FBQUEsQ0FtUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuUDZEO0FBQUEsQ0FvUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwUDZEO0FBQUEsQ0FxUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyUDZEO0FBQUEsQ0FzUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0UDZEO0FBQUEsQ0F1UDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2UDZEO0FBQUEsQ0F3UDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4UDZEO0FBQUEsQ0F5UDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6UDZEO0FBQUEsQ0EwUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExUDZEO0FBQUEsQ0EyUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzUDZEO0FBQUEsQ0E0UDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1UDZEO0FBQUEsQ0E2UDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3UDZEO0FBQUEsQ0E4UDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5UDZEO0FBQUEsQ0ErUDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvUDZEO0FBQUEsQ0FnUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoUTZEO0FBQUEsQ0FpUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqUTZEO0FBQUEsQ0FrUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsUTZEO0FBQUEsQ0FtUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuUTZEO0FBQUEsQ0FvUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwUTZEO0FBQUEsQ0FxUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyUTZEO0FBQUEsQ0FzUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0UTZEO0FBQUEsQ0F1UTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2UTZEO0FBQUEsQ0F3UTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4UTZEO0FBQUEsQ0F5UTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6UTZEO0FBQUEsQ0EwUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExUTZEO0FBQUEsQ0EyUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzUTZEO0FBQUEsQ0E0UTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1UTZEO0FBQUEsQ0E2UTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3UTZEO0FBQUEsQ0E4UTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5UTZEO0FBQUEsQ0ErUTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvUTZEO0FBQUEsQ0FnUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoUjZEO0FBQUEsQ0FpUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqUjZEO0FBQUEsQ0FrUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsUjZEO0FBQUEsQ0FtUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuUjZEO0FBQUEsQ0FvUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwUjZEO0FBQUEsQ0FxUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyUjZEO0FBQUEsQ0FzUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0UjZEO0FBQUEsQ0F1UjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2UjZEO0FBQUEsQ0F3UjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4UjZEO0FBQUEsQ0F5UjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6UjZEO0FBQUEsQ0EwUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExUjZEO0FBQUEsQ0EyUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzUjZEO0FBQUEsQ0E0UjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1UjZEO0FBQUEsQ0E2UjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3UjZEO0FBQUEsQ0E4UjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5UjZEO0FBQUEsQ0ErUjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvUjZEO0FBQUEsQ0FnUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoUzZEO0FBQUEsQ0FpUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqUzZEO0FBQUEsQ0FrUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsUzZEO0FBQUEsQ0FtUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuUzZEO0FBQUEsQ0FvUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwUzZEO0FBQUEsQ0FxUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyUzZEO0FBQUEsQ0FzUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0UzZEO0FBQUEsQ0F1UzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2UzZEO0FBQUEsQ0F3UzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4UzZEO0FBQUEsQ0F5UzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6UzZEO0FBQUEsQ0EwUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExUzZEO0FBQUEsQ0EyUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzUzZEO0FBQUEsQ0E0UzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1UzZEO0FBQUEsQ0E2UzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3UzZEO0FBQUEsQ0E4UzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5UzZEO0FBQUEsQ0ErUzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvUzZEO0FBQUEsQ0FnVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoVDZEO0FBQUEsQ0FpVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqVDZEO0FBQUEsQ0FrVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsVDZEO0FBQUEsQ0FtVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuVDZEO0FBQUEsQ0FvVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwVDZEO0FBQUEsQ0FxVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyVDZEO0FBQUEsQ0FzVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0VDZEO0FBQUEsQ0F1VDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2VDZEO0FBQUEsQ0F3VDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4VDZEO0FBQUEsQ0F5VDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6VDZEO0FBQUEsQ0EwVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExVDZEO0FBQUEsQ0EyVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzVDZEO0FBQUEsQ0E0VDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1VDZEO0FBQUEsQ0E2VDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3VDZEO0FBQUEsQ0E4VDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5VDZEO0FBQUEsQ0ErVDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvVDZEO0FBQUEsQ0FnVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoVTZEO0FBQUEsQ0FpVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqVTZEO0FBQUEsQ0FrVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsVTZEO0FBQUEsQ0FtVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuVTZEO0FBQUEsQ0FvVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwVTZEO0FBQUEsQ0FxVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyVTZEO0FBQUEsQ0FzVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0VTZEO0FBQUEsQ0F1VTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2VTZEO0FBQUEsQ0F3VTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4VTZEO0FBQUEsQ0F5VTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6VTZEO0FBQUEsQ0EwVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExVTZEO0FBQUEsQ0EyVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzVTZEO0FBQUEsQ0E0VTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1VTZEO0FBQUEsQ0E2VTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3VTZEO0FBQUEsQ0E4VTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5VTZEO0FBQUEsQ0ErVTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvVTZEO0FBQUEsQ0FnVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoVjZEO0FBQUEsQ0FpVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqVjZEO0FBQUEsQ0FrVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsVjZEO0FBQUEsQ0FtVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuVjZEO0FBQUEsQ0FvVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwVjZEO0FBQUEsQ0FxVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyVjZEO0FBQUEsQ0FzVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0VjZEO0FBQUEsQ0F1VjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2VjZEO0FBQUEsQ0F3VjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4VjZEO0FBQUEsQ0F5VjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6VjZEO0FBQUEsQ0EwVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExVjZEO0FBQUEsQ0EyVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzVjZEO0FBQUEsQ0E0VjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1VjZEO0FBQUEsQ0E2VjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3VjZEO0FBQUEsQ0E4VjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5VjZEO0FBQUEsQ0ErVjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvVjZEO0FBQUEsQ0FnVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoVzZEO0FBQUEsQ0FpVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqVzZEO0FBQUEsQ0FrVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsVzZEO0FBQUEsQ0FtVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuVzZEO0FBQUEsQ0FvVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwVzZEO0FBQUEsQ0FxVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyVzZEO0FBQUEsQ0FzVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0VzZEO0FBQUEsQ0F1VzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2VzZEO0FBQUEsQ0F3VzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4VzZEO0FBQUEsQ0F5VzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6VzZEO0FBQUEsQ0EwVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExVzZEO0FBQUEsQ0EyVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzVzZEO0FBQUEsQ0E0VzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1VzZEO0FBQUEsQ0E2VzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3VzZEO0FBQUEsQ0E4VzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5VzZEO0FBQUEsQ0ErVzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvVzZEO0FBQUEsQ0FnWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoWDZEO0FBQUEsQ0FpWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqWDZEO0FBQUEsQ0FrWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsWDZEO0FBQUEsQ0FtWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuWDZEO0FBQUEsQ0FvWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwWDZEO0FBQUEsQ0FxWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyWDZEO0FBQUEsQ0FzWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0WDZEO0FBQUEsQ0F1WDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2WDZEO0FBQUEsQ0F3WDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4WDZEO0FBQUEsQ0F5WDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6WDZEO0FBQUEsQ0EwWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExWDZEO0FBQUEsQ0EyWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzWDZEO0FBQUEsQ0E0WDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1WDZEO0FBQUEsQ0E2WDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3WDZEO0FBQUEsQ0E4WDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5WDZEO0FBQUEsQ0ErWDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvWDZEO0FBQUEsQ0FnWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoWTZEO0FBQUEsQ0FpWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqWTZEO0FBQUEsQ0FrWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsWTZEO0FBQUEsQ0FtWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuWTZEO0FBQUEsQ0FvWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwWTZEO0FBQUEsQ0FxWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyWTZEO0FBQUEsQ0FzWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0WTZEO0FBQUEsQ0F1WTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2WTZEO0FBQUEsQ0F3WTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4WTZEO0FBQUEsQ0F5WTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6WTZEO0FBQUEsQ0EwWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExWTZEO0FBQUEsQ0EyWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzWTZEO0FBQUEsQ0E0WTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1WTZEO0FBQUEsQ0E2WTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3WTZEO0FBQUEsQ0E4WTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5WTZEO0FBQUEsQ0ErWTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvWTZEO0FBQUEsQ0FnWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoWjZEO0FBQUEsQ0FpWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqWjZEO0FBQUEsQ0FrWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsWjZEO0FBQUEsQ0FtWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuWjZEO0FBQUEsQ0FvWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwWjZEO0FBQUEsQ0FxWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyWjZEO0FBQUEsQ0FzWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0WjZEO0FBQUEsQ0F1WjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2WjZEO0FBQUEsQ0F3WjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4WjZEO0FBQUEsQ0F5WjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6WjZEO0FBQUEsQ0EwWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExWjZEO0FBQUEsQ0EyWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzWjZEO0FBQUEsQ0E0WjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1WjZEO0FBQUEsQ0E2WjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3WjZEO0FBQUEsQ0E4WjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5WjZEO0FBQUEsQ0ErWjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvWjZEO0FBQUEsQ0FnYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoYTZEO0FBQUEsQ0FpYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqYTZEO0FBQUEsQ0FrYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsYTZEO0FBQUEsQ0FtYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuYTZEO0FBQUEsQ0FvYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwYTZEO0FBQUEsQ0FxYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyYTZEO0FBQUEsQ0FzYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0YTZEO0FBQUEsQ0F1YTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F2YTZEO0FBQUEsQ0F3YTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLGNBQWQsQ0F4YTZEO0FBQUEsQ0F5YTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6YTZEO0FBQUEsQ0EwYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExYTZEO0FBQUEsQ0EyYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzYTZEO0FBQUEsQ0E0YTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1YTZEO0FBQUEsQ0E2YTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3YTZEO0FBQUEsQ0E4YTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5YTZEO0FBQUEsQ0ErYTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvYTZEO0FBQUEsQ0FnYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoYjZEO0FBQUEsQ0FpYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqYjZEO0FBQUEsQ0FrYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsYjZEO0FBQUEsQ0FtYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuYjZEO0FBQUEsQ0FvYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwYjZEO0FBQUEsQ0FxYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyYjZEO0FBQUEsQ0FzYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0YjZEO0FBQUEsQ0F1YjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2YjZEO0FBQUEsQ0F3YjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4YjZEO0FBQUEsQ0F5YjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6YjZEO0FBQUEsQ0EwYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExYjZEO0FBQUEsQ0EyYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzYjZEO0FBQUEsQ0E0YjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1YjZEO0FBQUEsQ0E2YjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3YjZEO0FBQUEsQ0E4YjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5YjZEO0FBQUEsQ0ErYjdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvYjZEO0FBQUEsQ0FnYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoYzZEO0FBQUEsQ0FpYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqYzZEO0FBQUEsQ0FrYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsYzZEO0FBQUEsQ0FtYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuYzZEO0FBQUEsQ0FvYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwYzZEO0FBQUEsQ0FxYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyYzZEO0FBQUEsQ0FzYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0YzZEO0FBQUEsQ0F1YzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2YzZEO0FBQUEsQ0F3YzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4YzZEO0FBQUEsQ0F5YzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6YzZEO0FBQUEsQ0EwYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExYzZEO0FBQUEsQ0EyYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzYzZEO0FBQUEsQ0E0YzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1YzZEO0FBQUEsQ0E2YzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3YzZEO0FBQUEsQ0E4YzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5YzZEO0FBQUEsQ0ErYzdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvYzZEO0FBQUEsQ0FnZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoZDZEO0FBQUEsQ0FpZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqZDZEO0FBQUEsQ0FrZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsZDZEO0FBQUEsQ0FtZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuZDZEO0FBQUEsQ0FvZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwZDZEO0FBQUEsQ0FxZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyZDZEO0FBQUEsQ0FzZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0ZDZEO0FBQUEsQ0F1ZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2ZDZEO0FBQUEsQ0F3ZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4ZDZEO0FBQUEsQ0F5ZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6ZDZEO0FBQUEsQ0EwZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExZDZEO0FBQUEsQ0EyZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzZDZEO0FBQUEsQ0E0ZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1ZDZEO0FBQUEsQ0E2ZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3ZDZEO0FBQUEsQ0E4ZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5ZDZEO0FBQUEsQ0ErZDdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvZDZEO0FBQUEsQ0FnZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FoZTZEO0FBQUEsQ0FpZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FqZTZEO0FBQUEsQ0FrZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FsZTZEO0FBQUEsQ0FtZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FuZTZEO0FBQUEsQ0FvZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FwZTZEO0FBQUEsQ0FxZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0FyZTZEO0FBQUEsQ0FzZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F0ZTZEO0FBQUEsQ0F1ZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F2ZTZEO0FBQUEsQ0F3ZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F4ZTZEO0FBQUEsQ0F5ZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0F6ZTZEO0FBQUEsQ0EwZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0ExZTZEO0FBQUEsQ0EyZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EzZTZEO0FBQUEsQ0E0ZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E1ZTZEO0FBQUEsQ0E2ZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E3ZTZEO0FBQUEsQ0E4ZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0E5ZTZEO0FBQUEsQ0ErZTdEQSxDQUFBLENBQUUsUUFBRixJQUFjLFFBQWQsQ0EvZTZEO0FBQUEsQ0FnZjdEQSxDQUFBLENBQUUsUUFBRixJ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LFlBNUNrRCxHQTRDbERBO0FBQ0FBLFlBN0NrRCxHQTZDbERBO0FBQ0FBLFlBOUNrRCxHQThDbERBO0FBQ0FBLFlBL0NrRCxHQStDbERBO0FBQ0FBLFlBaERrRCxHQWdEbERBO0FBQ0FBLFlBakRrRCxHQWlEbERBO0FBQ0FBLFlBbERrRCxHQWtEbERBO0FBQ0FBLFlBbkRrRCxHQW1EbERBO0FBQ0FBLFlBcERrRCxHQW9EbERBO0FBQ0FBLFlBckRrRCxHQXFEbERBO0FBQ0FBLFlBdERrRCxHQXNEbERBO0FBQ0FBLFlBdkRrRCxHQXVEbERBO0FBQ0FBLFlBeERrRCxHQXdEbERBO0FBQ0FBLFlBekRrRCxHQXlEbERBO0FBQ0FBLFlBMURrRCxHQTBEbERBO0FBQ0FBLFlBM0RrRCxHQTJEbERBO0FBQ0FBLFlBNURrRCxHQTREbERBO0FBQ0FBLFlBN0RrRCxHQTZEbERBO0FBQ0FBLFlBOURrRCxHQThEbERBO0FBQ0FBLFlBL0RrRCxHQStEbERBO0FBQ0FBLFlBaEVrRCxHQWdFbERBO0FBQ0FBLFlBakVrRCxHQWlFbERBO0FBQ0FBLFlBbEVrRCxHQWtFbERBO0FBQ0FBLFlBbkVrRCxHQW1FbERBO0FBQ0FBLFlBcEVrRCxHQW9FbERBO0FBQ0FBLFlBckVrRCxHQXFFbERBO0FBQ0FBLFlBdEVrRCxHQXNFbERBO0FBQ0FBLFlBdkVrRCxHQXVFbERBO0FBQ0FBLFlBeEVrRCxHQXdFbERBO0FBQ0FBLFlBekVrRCxHQXlFbERBO0FBQ0FBLFlBMUVrRCxHQTBFbERBO0FBQ0FBLFlBM0VrRCxHQTJFbERBO0FBQ0FBLFlBNUVrRCxHQTRFbERBO0FBQ0FBLFlBN0VrRCxHQTZFbERBO0FBQ0FBLFlBOUVrRCxHQThFbERBO0FBQ0FBLFlBL0VrRCxHQStFbERBO0FBQ0FBLFlBaEZrRCxHQWdGbERBO0FBQ0FBLGFBakZrRCxHQWlGbERBO0FBQ0FBLFlBbEZrRCxHQWtGbERBO0FBQ0FBLGFBbkZrRCxHQW1GbERBO0FBQ0FBLFlBcEZrRCxHQW9GbERBO0FBQ0FBLFlBckZrRCxHQXFGbERBO0FBQ0FBLFlBdEZrRCxHQXNGbERBO0FBQ0FBLFlBdkZrRCxHQXVGbERBO0FBQ0FBLFlBeEZrRCxHQXdGbERBO0FBQ0FBLFlBekZrRCxHQXlGbERBO0FBQ0FBLFlBMUZrRCxHQTBGbERBO0FBQ0FBLFlBM0ZrRCxHQTJGbERBO0FBQ0FBLFlBNUZrRCxHQTRGbERBO0FBQ0FBLFlBN0ZrRCxHQTZGbERBO0FBQ0FBLFlBOUZrRCxHQThGbERBO0FBQ0FBLGFBL0ZrRCxHQStGbERBO0FBQ0FBLFlBaEdrRCxHQWdHbERBO0FBQ0FBLFlBakdrRCxHQWlHbERBO0FBQ0FBLFlBbEdrRCxHQWtHbERBO0FBQ0FBLFlBbkdrRCxHQW1HbERBO0FBQ0FBLFlBcEdrRCxHQW9HbERBO0FBQ0FBLFlBckdrRCxHQXFHbERBO0FBQ0FBLGFBdEdrRCxHQXNHbERBO0FBQ0FBLFlBdkdrRCxHQXVHbERBO0FBQ0FBLGFBeEdrRCxHQXdHbERBO0FBQ0FBLFlBekdrRCxHQXlHbERBO0FBQ0FBLFlBMUdrRCxHQTBHbERBO0FBQ0FBLFlBM0drRCxHQTJHbERBO0FBQ0FBLFlBNUdrRCxHQTRHbERBO0FBQ0FBLFlBN0drRCxHQTZHbERBO0FBQ0FBLGFBOUdrRCxHQThHbERBO0FBQ0FBLGFBL0drRCxHQStHbERBO0FBQ0FBLGFBaEhrRCxHQWdIbERBO0FBQ0FBLGFBakhrRCxHQWlIbERBO0FBQ0FBLGFBbEhrRCxHQWtIbERBO0FBQ0FBLGFBbkhrRCxHQW1IbERBO0FBQ0FBLGFBcEhrRCxHQW9IbERBO0FBQ0FBLGFBckhrRCxHQXFIbERBO0FBQ0FBLGFBdEhrRCxHQXNIbERBO0FBQ0FBLGFBdkhrRCxHQXVIbERBO0FBQ0FBLGFBeEhrRCxHQXdIbERBO0FBQ0FBLGFBekhrRCxHQXlIbERBO0FBQ0FBLGFBMUhrRCxHQTBIbERBO0FBQ0FBLGFBM0hrRCxHQTJIbERBO0FBQ0FBLGFBNUhrRCxHQTRIbERBO0FBQ0FBLGFBN0hrRCxHQTZIbERBO0FBQ0FBLGFBOUhrRCxHQThIbERBO0FBQ0FBLGFBL0hrRCxHQStIbERBO0FBQ0FBLGFBaElrRCxHQWdJbERBO0FBQ0FBLGFBaklrRCxHQWlJbERBO0FBQ0FBLGFBbElrRCxHQWtJbERBO0FBQ0FBLGFBbklrRCxHQW1JbERBO0FBQ0FBLGFBcElrRCxHQW9JbERBO0FBQ0FBLGFBcklrRCxHQXFJbERBO0FBQ0FBLGFBdElrRCxHQXNJbERBO0FBQ0FBLGFBdklrRCxHQXVJbERBO0FBQ0FBLGFBeElrRCxHQXdJbERBO0FBQ0FBLGFBeklrRCxHQXlJbERBO0FBQ0FBLGFBMUlrRCxHQTBJbERBO0FBQ0FBLGFBM0lrRCxHQTJJbERBO0FBQ0FBLGFBNUlrRCxHQTRJbERBO0FBQ0FBLGFBN0lrRCxHQTZJbERBO0FBQ0FBLGFBOUlrRCxHQThJbERBO0FBQ0FBLGFBL0lrRCxHQStJbERBO0FBQ0FBLGFBaEprRCxHQWdKbERBO0FBQ0FBLGFBakprRCxHQWlKbERBO0FBQ0FBLGFBbEprRCxHQWtKbERBO0FBQ0FBLGFBbkprRCxHQW1KbERBO0FBQ0FBLGFBcEprRCxHQW9KbERBO0FBQ0FBLGFBckprRCxHQXFKbERBO0FBQ0FBLGFBdEprRCxHQXNKbERBO0FBQ0FBLGFBdkprRCxHQXVKbERBO0FBQ0FBLGFBeEprRCxHQXdKbERBO0FBQ0FBLGFBekprRCxHQXlKbERBO0FBQ0FBLGFBMUprRCxHQTBKbERBO0FBQ0FBLGFBM0prRCxHQTJKbERBO0FBQ0FBLGFBNUprRCxHQTRKbERBO0FBQ0FBLGFBN0prRCxHQTZKbERBO0FBQ0FBLGFBOUprRCxHQThKbERBO0FBQ0FBLGFBL0prRCxHQStKbERBO0FBQ0FBLGFBaEtrRCxHQWdLbERBO0FBQ0FBLGFBaktrRCxHQWlLbERBO0FBQ0FBLGFBbEtrRCxHQWtLbERBO0FBQ0FBLGFBbktrRCxJQW1LbERBO0FBQ0FBLGFBcEtrRCxHQW9LbERBO0FBQ0FBLGFBcktrRCxHQXFLbERBO0FBQ0FBLGFBdEtrRCxHQXNLbERBO0FBQ0FBLGFBdktrRCxHQXVLbERBO0FBQ0FBLGFBeEtrRCxHQXdLbERBO0FBQ0FBLGFBektrRCxHQXlLbERBO0FBQ0FBLGFBMUtrRCxHQTBLbERBO0FBQ0FBLGFBM0trRCxHQTJLbERBO0FBQ0FBLGFBNUtrRCxHQTRL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OzsyQkFHVG90QyxNLEVBQWU7QUFDYiwwQkFEYSxNQUNiO0FBaER3Qjs7O3dCQXFCUDtBQUNqQixhQUFPLEtBRFUsYUFDakI7QUF0QndCOzs7d0JBeUJOO0FBQ2xCLGFBQU8sS0FEVyxjQUNsQjtBQTFCd0I7Ozt3QkE2QkM7QUFDekIsYUFBTyxLQURrQixxQkFDekI7QUE5QndCOzs7d0JBaUNIO0FBQ3JCLGFBQU8sS0FEYyxpQkFDckI7QUFsQ3dCOzs7Ozs7SUFxRDVCLDBCO0FBQ0UxM0MsOERBQW9DO0FBQUE7O0FBQ2xDLHVCQURrQyxVQUNsQztBQUNBLHNCQUZrQyxJQUVsQzs7QUFFQSxRQUFNdXRILGlCQUFpQixrREFBa0Q7QUFDdkVweUQsV0FEdUUsRUFDdkVBLEtBRHVFO0FBRXZFL3RDLFNBRnVFLEVBRXZFQTtBQUZ1RSxLQUFsRCxDQUF2Qjs7QUFJQSxtQkFBZW1nRyxlQVJtQixTQVFuQkEsRUFBZjtBQVQ2Qjs7Ozs7Ozs7Ozs7Ozt1QkFpQkMsYUFEbkIsSUFDbUIsRTs7OztBQUF4QixxQiwwQkFBQSxLO0FBQUEsb0IsMEJBQUEsSTs7cUJBQ04sSTs7Ozs7a0RBQ1M7QUFBRW5tSCx5QkFBRjtBQUFvQmtELHdCQUFwQjtBQUFBLGlCOzs7a0RBRUY7QUFBRWxELHlCQUFPQSxNQUFUO0FBQXVCa0Qsd0JBQXZCO0FBQUEsaUI7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQkFHVG90QyxNLEVBQWU7QUFDYiwwQkFEYSxNQUNiO0FBekI2Qjs7O3dCQVlKO0FBQ3pCLGFBRHlCLEtBQ3pCO0FBYjZCIiwiZmlsZSI6InBkZi53b3JrZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlclwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd19wZGZqc19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd19wZGZqc19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd19wZGZqc19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dfcGRmanNfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd19wZGZqc19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd19wZGZqc19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd19wZGZqc19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucyA9IDApO1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFdvcmtlck1lc3NhZ2VIYW5kbGVyIH0gZnJvbSBcIi4vY29yZS93b3JrZXIuanNcIjtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzICovXG5jb25zdCBwZGZqc1ZlcnNpb24gPSBQREZKU0Rldi5ldmFsKFwiQlVORExFX1ZFUlNJT05cIik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgKi9cbmNvbnN0IHBkZmpzQnVpbGQgPSBQREZKU0Rldi5ldmFsKFwiQlVORExFX0JVSUxEXCIpO1xuXG5leHBvcnQgeyBXb3JrZXJNZXNzYWdlSGFuZGxlciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEFib3J0RXhjZXB0aW9uLFxuICBhcnJheUJ5dGVMZW5ndGgsXG4gIGFycmF5c1RvQnl0ZXMsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBnZXRWZXJib3NpdHlMZXZlbCxcbiAgaW5mbyxcbiAgSW52YWxpZFBERkV4Y2VwdGlvbixcbiAgaXNTdHJpbmcsXG4gIE1pc3NpbmdQREZFeGNlcHRpb24sXG4gIFBhc3N3b3JkRXhjZXB0aW9uLFxuICBzZXRWZXJib3NpdHlMZXZlbCxcbiAgc3RyaW5nVG9QREZTdHJpbmcsXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbiAgVW5rbm93bkVycm9yRXhjZXB0aW9uLFxuICBVTlNVUFBPUlRFRF9GRUFUVVJFUyxcbiAgVmVyYm9zaXR5TGV2ZWwsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgY2xlYXJQcmltaXRpdmVDYWNoZXMsIFJlZiB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IExvY2FsUGRmTWFuYWdlciwgTmV0d29ya1BkZk1hbmFnZXIgfSBmcm9tIFwiLi9wZGZfbWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgaW5jcmVtZW50YWxVcGRhdGUgfSBmcm9tIFwiLi93cml0ZXIuanNcIjtcbmltcG9ydCB7IGlzTm9kZUpTIH0gZnJvbSBcIi4uL3NoYXJlZC9pc19ub2RlLmpzXCI7XG5pbXBvcnQgeyBNZXNzYWdlSGFuZGxlciB9IGZyb20gXCIuLi9zaGFyZWQvbWVzc2FnZV9oYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBQREZXb3JrZXJTdHJlYW0gfSBmcm9tIFwiLi93b3JrZXJfc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBYUmVmUGFyc2VFeGNlcHRpb24gfSBmcm9tIFwiLi9jb3JlX3V0aWxzLmpzXCI7XG5cbmNsYXNzIFdvcmtlclRhc2sge1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnRlcm1pbmF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgfVxuXG4gIGdldCBmaW5pc2hlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgZmluaXNoKCkge1xuICAgIHRoaXMuX2NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgdGVybWluYXRlKCkge1xuICAgIHRoaXMudGVybWluYXRlZCA9IHRydWU7XG4gIH1cblxuICBlbnN1cmVOb3RUZXJtaW5hdGVkKCkge1xuICAgIGlmICh0aGlzLnRlcm1pbmF0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB0YXNrIHdhcyB0ZXJtaW5hdGVkXCIpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBXb3JrZXJNZXNzYWdlSGFuZGxlciB7XG4gIHN0YXRpYyBzZXR1cChoYW5kbGVyLCBwb3J0KSB7XG4gICAgdmFyIHRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gZmFsc2U7XG4gICAgaGFuZGxlci5vbihcInRlc3RcIiwgZnVuY3Rpb24gd3BoU2V0dXBUZXN0KGRhdGEpIHtcbiAgICAgIGlmICh0ZXN0TWVzc2FnZVByb2Nlc3NlZCkge1xuICAgICAgICByZXR1cm47IC8vIHdlIGFscmVhZHkgcHJvY2Vzc2VkICd0ZXN0JyBtZXNzYWdlIG9uY2VcbiAgICAgIH1cbiAgICAgIHRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gdHJ1ZTtcblxuICAgICAgLy8gY2hlY2sgaWYgVWludDhBcnJheSBjYW4gYmUgc2VudCB0byB3b3JrZXJcbiAgICAgIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICBoYW5kbGVyLnNlbmQoXCJ0ZXN0XCIsIG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBtYWtpbmcgc3VyZSBwb3N0TWVzc2FnZSB0cmFuc2ZlcnMgYXJlIHdvcmtpbmdcbiAgICAgIGNvbnN0IHN1cHBvcnRUcmFuc2ZlcnMgPSBkYXRhWzBdID09PSAyNTU7XG4gICAgICBoYW5kbGVyLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gc3VwcG9ydFRyYW5zZmVycztcblxuICAgICAgaGFuZGxlci5zZW5kKFwidGVzdFwiLCB7IHN1cHBvcnRUcmFuc2ZlcnMgfSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiY29uZmlndXJlXCIsIGZ1bmN0aW9uIHdwaENvbmZpZ3VyZShkYXRhKSB7XG4gICAgICBzZXRWZXJib3NpdHlMZXZlbChkYXRhLnZlcmJvc2l0eSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0RG9jUmVxdWVzdFwiLCBmdW5jdGlvbiB3cGhTZXR1cERvYyhkYXRhKSB7XG4gICAgICByZXR1cm4gV29ya2VyTWVzc2FnZUhhbmRsZXIuY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGRhdGEsIHBvcnQpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURvY3VtZW50SGFuZGxlcihkb2NQYXJhbXMsIHBvcnQpIHtcbiAgICAvLyBUaGlzIGNvbnRleHQgaXMgYWN0dWFsbHkgaG9sZHMgcmVmZXJlbmNlcyBvbiBwZGZNYW5hZ2VyIGFuZCBoYW5kbGVyLFxuICAgIC8vIHVudGlsIHRoZSBsYXR0ZXIgaXMgZGVzdHJveWVkLlxuICAgIHZhciBwZGZNYW5hZ2VyO1xuICAgIHZhciB0ZXJtaW5hdGVkID0gZmFsc2U7XG4gICAgdmFyIGNhbmNlbFhIUnMgPSBudWxsO1xuICAgIHZhciBXb3JrZXJUYXNrcyA9IFtdO1xuICAgIGNvbnN0IHZlcmJvc2l0eSA9IGdldFZlcmJvc2l0eUxldmVsKCk7XG5cbiAgICBjb25zdCBhcGlWZXJzaW9uID0gZG9jUGFyYW1zLmFwaVZlcnNpb247XG4gICAgY29uc3Qgd29ya2VyVmVyc2lvbiA9XG4gICAgICB0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiYgIVBERkpTRGV2LnRlc3QoXCJURVNUSU5HXCIpXG4gICAgICAgID8gUERGSlNEZXYuZXZhbChcIkJVTkRMRV9WRVJTSU9OXCIpXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoYXBpVmVyc2lvbiAhPT0gd29ya2VyVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIEFQSSB2ZXJzaW9uIFwiJHthcGlWZXJzaW9ufVwiIGRvZXMgbm90IG1hdGNoIGAgK1xuICAgICAgICAgIGB0aGUgV29ya2VyIHZlcnNpb24gXCIke3dvcmtlclZlcnNpb259XCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8IFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpKSB7XG4gICAgICAvLyBGYWlsIGVhcmx5LCBhbmQgcHJlZGljdGFibHksIHJhdGhlciB0aGFuIGhhdmluZyAoc29tZSkgZm9udHMgZmFpbCB0b1xuICAgICAgLy8gbG9hZC9yZW5kZXIgd2l0aCBzbGlnaHRseSBjcnlwdGljIGVycm9yIG1lc3NhZ2VzIGluIGVudmlyb25tZW50cyB3aGVyZVxuICAgICAgLy8gdGhlIGBBcnJheS5wcm90b3R5cGVgIGhhcyBiZWVuICppbmNvcnJlY3RseSogZXh0ZW5kZWQuXG4gICAgICAvL1xuICAgICAgLy8gUExFQVNFIE5PVEU6IFdlIGRvICpub3QqIHdhbnQgdG8gc2xvdyBkb3duIGZvbnQgcGFyc2luZyBieSBhZGRpbmdcbiAgICAgIC8vICAgICAgICAgICAgICBgaGFzT3duUHJvcGVydHlgIGNoZWNrcyBhbGwgb3ZlciB0aGUgY29kZS1iYXNlLlxuICAgICAgY29uc3QgZW51bWVyYWJsZVByb3BlcnRpZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gW10pIHtcbiAgICAgICAgZW51bWVyYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgICB9XG4gICAgICBpZiAoZW51bWVyYWJsZVByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIlRoZSBgQXJyYXkucHJvdG90eXBlYCBjb250YWlucyB1bmV4cGVjdGVkIGVudW1lcmFibGUgcHJvcGVydGllczogXCIgK1xuICAgICAgICAgICAgZW51bWVyYWJsZVByb3BlcnRpZXMuam9pbihcIiwgXCIpICtcbiAgICAgICAgICAgIFwiOyB0aHVzIGJyZWFraW5nIGUuZy4gYGZvci4uLmluYCBpdGVyYXRpb24gb2YgYEFycmF5YHMuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHRoYXQgKHByaW1hcmlseSkgTm9kZS5qcyB1c2VycyB3b24ndCBhY2NpZGVudGFsbHkgYXR0ZW1wdCB0byB1c2VcbiAgICAgIC8vIGEgbm9uLXRyYW5zbGF0ZWQvbm9uLXBvbHlmaWxsZWQgYnVpbGQgb2YgdGhlIGxpYnJhcnksIHNpbmNlIHRoYXQgd291bGRcbiAgICAgIC8vIHF1aWNrbHkgZmFpbCBhbnl3YXkgYmVjYXVzZSBvZiBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkgKHN1Y2ggYXMgZS5nLlxuICAgICAgLy8gYFJlYWRhYmxlU3RyZWFtYCBhbmQgYFByb21pc2UuYWxsU2V0dGxlZGApLlxuICAgICAgaWYgKFxuICAgICAgICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8IFBERkpTRGV2LnRlc3QoXCJTS0lQX0JBQkVMXCIpKSAmJlxuICAgICAgICAodHlwZW9mIFJlYWRhYmxlU3RyZWFtID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgdHlwZW9mIFByb21pc2UuYWxsU2V0dGxlZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJUaGUgYnJvd3Nlci9lbnZpcm9ubWVudCBsYWNrcyBuYXRpdmUgc3VwcG9ydCBmb3IgY3JpdGljYWwgXCIgK1xuICAgICAgICAgICAgXCJmdW5jdGlvbmFsaXR5IHVzZWQgYnkgdGhlIFBERi5qcyBsaWJyYXJ5IChlLmcuIFwiICtcbiAgICAgICAgICAgIFwiYFJlYWRhYmxlU3RyZWFtYCBhbmQvb3IgYFByb21pc2UuYWxsU2V0dGxlZGApOyBcIiArXG4gICAgICAgICAgICBcInBsZWFzZSB1c2UgYW4gRVM1LWNvbXBhdGlibGUgYnVpbGQgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkb2NJZCA9IGRvY1BhcmFtcy5kb2NJZDtcbiAgICB2YXIgZG9jQmFzZVVybCA9IGRvY1BhcmFtcy5kb2NCYXNlVXJsO1xuICAgIHZhciB3b3JrZXJIYW5kbGVyTmFtZSA9IGRvY1BhcmFtcy5kb2NJZCArIFwiX3dvcmtlclwiO1xuICAgIHZhciBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKHdvcmtlckhhbmRsZXJOYW1lLCBkb2NJZCwgcG9ydCk7XG5cbiAgICAvLyBFbnN1cmUgdGhhdCBwb3N0TWVzc2FnZSB0cmFuc2ZlcnMgYXJlIGFsd2F5cyBjb3JyZWN0bHkgZW5hYmxlZC9kaXNhYmxlZCxcbiAgICAvLyB0byBwcmV2ZW50IFwiRGF0YUNsb25lRXJyb3JcIiBpbiBicm93c2VycyB3aXRob3V0IHRyYW5zZmVycyBzdXBwb3J0LlxuICAgIGhhbmRsZXIucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPSBkb2NQYXJhbXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnM7XG5cbiAgICBmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCkge1xuICAgICAgaWYgKHRlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyB0ZXJtaW5hdGVkXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0V29ya2VyVGFzayh0YXNrKSB7XG4gICAgICBXb3JrZXJUYXNrcy5wdXNoKHRhc2spO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbmlzaFdvcmtlclRhc2sodGFzaykge1xuICAgICAgdGFzay5maW5pc2goKTtcbiAgICAgIHZhciBpID0gV29ya2VyVGFza3MuaW5kZXhPZih0YXNrKTtcbiAgICAgIFdvcmtlclRhc2tzLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkRG9jdW1lbnQocmVjb3ZlcnlNb2RlKSB7XG4gICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYyhcImNoZWNrSGVhZGVyXCIpO1xuICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoXCJwYXJzZVN0YXJ0WFJlZlwiKTtcbiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKFwicGFyc2VcIiwgW3JlY292ZXJ5TW9kZV0pO1xuXG4gICAgICBpZiAoIXJlY292ZXJ5TW9kZSkge1xuICAgICAgICAvLyBDaGVjayB0aGF0IGF0IGxlYXN0IHRoZSBmaXJzdCBwYWdlIGNhbiBiZSBzdWNjZXNzZnVsbHkgbG9hZGVkLFxuICAgICAgICAvLyBzaW5jZSBvdGhlcndpc2UgdGhlIFhSZWYgdGFibGUgaXMgZGVmaW5pdGVseSBub3QgdmFsaWQuXG4gICAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKFwiY2hlY2tGaXJzdFBhZ2VcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtudW1QYWdlcywgZmluZ2VycHJpbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBwZGZNYW5hZ2VyLmVuc3VyZURvYyhcIm51bVBhZ2VzXCIpLFxuICAgICAgICBwZGZNYW5hZ2VyLmVuc3VyZURvYyhcImZpbmdlcnByaW50XCIpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4geyBudW1QYWdlcywgZmluZ2VycHJpbnQgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQZGZNYW5hZ2VyKGRhdGEsIGV2YWx1YXRvck9wdGlvbnMpIHtcbiAgICAgIHZhciBwZGZNYW5hZ2VyQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICBsZXQgbmV3UGRmTWFuYWdlcjtcblxuICAgICAgdmFyIHNvdXJjZSA9IGRhdGEuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZS5kYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV3UGRmTWFuYWdlciA9IG5ldyBMb2NhbFBkZk1hbmFnZXIoXG4gICAgICAgICAgICBkb2NJZCxcbiAgICAgICAgICAgIHNvdXJjZS5kYXRhLFxuICAgICAgICAgICAgc291cmNlLnBhc3N3b3JkLFxuICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9ucyxcbiAgICAgICAgICAgIGRvY0Jhc2VVcmxcbiAgICAgICAgICApO1xuICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlc29sdmUobmV3UGRmTWFuYWdlcik7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGRmTWFuYWdlckNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBkZlN0cmVhbSxcbiAgICAgICAgY2FjaGVkQ2h1bmtzID0gW107XG4gICAgICB0cnkge1xuICAgICAgICBwZGZTdHJlYW0gPSBuZXcgUERGV29ya2VyU3RyZWFtKGhhbmRsZXIpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGV4KTtcbiAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBmdWxsUmVxdWVzdCA9IHBkZlN0cmVhbS5nZXRGdWxsUmVhZGVyKCk7XG4gICAgICBmdWxsUmVxdWVzdC5oZWFkZXJzUmVhZHlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghZnVsbFJlcXVlc3QuaXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgYXV0by1mZXRjaCB3aGVuIHN0cmVhbWluZyBpcyBlbmFibGVkLlxuICAgICAgICAgIHZhciBkaXNhYmxlQXV0b0ZldGNoID1cbiAgICAgICAgICAgIHNvdXJjZS5kaXNhYmxlQXV0b0ZldGNoIHx8IGZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICAgICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgTmV0d29ya1BkZk1hbmFnZXIoXG4gICAgICAgICAgICBkb2NJZCxcbiAgICAgICAgICAgIHBkZlN0cmVhbSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbXNnSGFuZGxlcjogaGFuZGxlcixcbiAgICAgICAgICAgICAgcGFzc3dvcmQ6IHNvdXJjZS5wYXNzd29yZCxcbiAgICAgICAgICAgICAgbGVuZ3RoOiBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoLFxuICAgICAgICAgICAgICByYW5nZUNodW5rU2l6ZTogc291cmNlLnJhbmdlQ2h1bmtTaXplLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV2YWx1YXRvck9wdGlvbnMsXG4gICAgICAgICAgICBkb2NCYXNlVXJsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBUaGVyZSBtYXkgYmUgYSBjaGFuY2UgdGhhdCBgbmV3UGRmTWFuYWdlcmAgaXMgbm90IGluaXRpYWxpemVkIGZvclxuICAgICAgICAgIC8vIHRoZSBmaXJzdCBmZXcgcnVucyBvZiBgcmVhZGNodW5rYCBibG9jayBvZiBjb2RlLiBCZSBzdXJlIHRvIHNlbmRcbiAgICAgICAgICAvLyBhbGwgY2FjaGVkIGNodW5rcywgaWYgYW55LCB0byBjaHVua2VkX3N0cmVhbSB2aWEgcGRmX21hbmFnZXIuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRDaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld1BkZk1hbmFnZXIuc2VuZFByb2dyZXNzaXZlRGF0YShjYWNoZWRDaHVua3NbaV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhY2hlZENodW5rcyA9IFtdO1xuICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlc29sdmUobmV3UGRmTWFuYWdlcik7XG4gICAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7XG4gICAgICAgIH0pO1xuXG4gICAgICB2YXIgbG9hZGVkID0gMDtcbiAgICAgIHZhciBmbHVzaENodW5rcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBkZkZpbGUgPSBhcnJheXNUb0J5dGVzKGNhY2hlZENodW5rcyk7XG4gICAgICAgIGlmIChzb3VyY2UubGVuZ3RoICYmIHBkZkZpbGUubGVuZ3RoICE9PSBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgd2FybihcInJlcG9ydGVkIEhUVFAgbGVuZ3RoIGlzIGRpZmZlcmVudCBmcm9tIGFjdHVhbFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgZGF0YSBpcyBhcnJheSwgaW5zdGFudGlhdGluZyBkaXJlY3RseSBmcm9tIGl0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV3UGRmTWFuYWdlciA9IG5ldyBMb2NhbFBkZk1hbmFnZXIoXG4gICAgICAgICAgICBkb2NJZCxcbiAgICAgICAgICAgIHBkZkZpbGUsXG4gICAgICAgICAgICBzb3VyY2UucGFzc3dvcmQsXG4gICAgICAgICAgICBldmFsdWF0b3JPcHRpb25zLFxuICAgICAgICAgICAgZG9jQmFzZVVybFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVzb2x2ZShuZXdQZGZNYW5hZ2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZWplY3QoZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlZENodW5rcyA9IFtdO1xuICAgICAgfTtcbiAgICAgIHZhciByZWFkUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlYWRDaHVuayA9IGZ1bmN0aW9uICh7IHZhbHVlLCBkb25lIH0pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFuZXdQZGZNYW5hZ2VyKSB7XG4gICAgICAgICAgICAgICAgZmx1c2hDaHVua3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb2FkZWQgKz0gYXJyYXlCeXRlTGVuZ3RoKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICghZnVsbFJlcXVlc3QuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgaGFuZGxlci5zZW5kKFwiRG9jUHJvZ3Jlc3NcIiwge1xuICAgICAgICAgICAgICAgIGxvYWRlZCxcbiAgICAgICAgICAgICAgICB0b3RhbDogTWF0aC5tYXgobG9hZGVkLCBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoIHx8IDApLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5ld1BkZk1hbmFnZXIpIHtcbiAgICAgICAgICAgICAgbmV3UGRmTWFuYWdlci5zZW5kUHJvZ3Jlc3NpdmVEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNhY2hlZENodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVsbFJlcXVlc3QucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZ1bGxSZXF1ZXN0LnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmVhZFByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGUpO1xuICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICBjYW5jZWxYSFJzID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICBwZGZTdHJlYW0uY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldHVwRG9jKGRhdGEpIHtcbiAgICAgIGZ1bmN0aW9uIG9uU3VjY2Vzcyhkb2MpIHtcbiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpO1xuICAgICAgICBoYW5kbGVyLnNlbmQoXCJHZXREb2NcIiwgeyBwZGZJbmZvOiBkb2MgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uRmFpbHVyZShleCkge1xuICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7XG5cbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUGFzc3dvcmRFeGNlcHRpb24pIHtcbiAgICAgICAgICB2YXIgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBQYXNzd29yZEV4Y2VwdGlvbjogcmVzcG9uc2UgJHtleC5jb2RlfWApO1xuICAgICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTtcblxuICAgICAgICAgIGhhbmRsZXJcbiAgICAgICAgICAgIC5zZW5kV2l0aFByb21pc2UoXCJQYXNzd29yZFJlcXVlc3RcIiwgZXgpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoeyBwYXNzd29yZCB9KSB7XG4gICAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7XG4gICAgICAgICAgICAgIHBkZk1hbmFnZXIudXBkYXRlUGFzc3dvcmQocGFzc3dvcmQpO1xuICAgICAgICAgICAgICBwZGZNYW5hZ2VyUmVhZHkoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spO1xuICAgICAgICAgICAgICBoYW5kbGVyLnNlbmQoXCJEb2NFeGNlcHRpb25cIiwgZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZXggaW5zdGFuY2VvZiBJbnZhbGlkUERGRXhjZXB0aW9uIHx8XG4gICAgICAgICAgZXggaW5zdGFuY2VvZiBNaXNzaW5nUERGRXhjZXB0aW9uIHx8XG4gICAgICAgICAgZXggaW5zdGFuY2VvZiBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gfHxcbiAgICAgICAgICBleCBpbnN0YW5jZW9mIFVua25vd25FcnJvckV4Y2VwdGlvblxuICAgICAgICApIHtcbiAgICAgICAgICBoYW5kbGVyLnNlbmQoXCJEb2NFeGNlcHRpb25cIiwgZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhbmRsZXIuc2VuZChcbiAgICAgICAgICAgIFwiRG9jRXhjZXB0aW9uXCIsXG4gICAgICAgICAgICBuZXcgVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnRvU3RyaW5nKCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZGZNYW5hZ2VyUmVhZHkoKSB7XG4gICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtcblxuICAgICAgICBsb2FkRG9jdW1lbnQoZmFsc2UpLnRoZW4ob25TdWNjZXNzLCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpO1xuXG4gICAgICAgICAgLy8gVHJ5IGFnYWluIHdpdGggcmVjb3ZlcnlNb2RlID09IHRydWVcbiAgICAgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBYUmVmUGFyc2VFeGNlcHRpb24pKSB7XG4gICAgICAgICAgICBvbkZhaWx1cmUocmVhc29uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGRmTWFuYWdlci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCk7XG4gICAgICAgICAgcGRmTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpO1xuXG4gICAgICAgICAgICBsb2FkRG9jdW1lbnQodHJ1ZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7XG5cbiAgICAgIHZhciBldmFsdWF0b3JPcHRpb25zID0ge1xuICAgICAgICBtYXhJbWFnZVNpemU6IGRhdGEubWF4SW1hZ2VTaXplLFxuICAgICAgICBkaXNhYmxlRm9udEZhY2U6IGRhdGEuZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgICBpZ25vcmVFcnJvcnM6IGRhdGEuaWdub3JlRXJyb3JzLFxuICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IGRhdGEuaXNFdmFsU3VwcG9ydGVkLFxuICAgICAgICBmb250RXh0cmFQcm9wZXJ0aWVzOiBkYXRhLmZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgICB9O1xuXG4gICAgICBnZXRQZGZNYW5hZ2VyKGRhdGEsIGV2YWx1YXRvck9wdGlvbnMpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChuZXdQZGZNYW5hZ2VyKSB7XG4gICAgICAgICAgaWYgKHRlcm1pbmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIFdlIHdlcmUgaW4gYSBwcm9jZXNzIG9mIHNldHRpbmcgdXAgdGhlIG1hbmFnZXIsIGJ1dCBpdCBnb3RcbiAgICAgICAgICAgIC8vIHRlcm1pbmF0ZWQgaW4gdGhlIG1pZGRsZS5cbiAgICAgICAgICAgIG5ld1BkZk1hbmFnZXIudGVybWluYXRlKFxuICAgICAgICAgICAgICBuZXcgQWJvcnRFeGNlcHRpb24oXCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyB0ZXJtaW5hdGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwZGZNYW5hZ2VyID0gbmV3UGRmTWFuYWdlcjtcblxuICAgICAgICAgIHBkZk1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgICAgIGhhbmRsZXIuc2VuZChcIkRhdGFMb2FkZWRcIiwgeyBsZW5ndGg6IHN0cmVhbS5ieXRlcy5ieXRlTGVuZ3RoIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihwZGZNYW5hZ2VyUmVhZHksIG9uRmFpbHVyZSk7XG4gICAgfVxuXG4gICAgaGFuZGxlci5vbihcIkdldFBhZ2VcIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmdldFBhZ2UoZGF0YS5wYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCBcInJvdGF0ZVwiKSxcbiAgICAgICAgICBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCBcInJlZlwiKSxcbiAgICAgICAgICBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCBcInVzZXJVbml0XCIpLFxuICAgICAgICAgIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsIFwidmlld1wiKSxcbiAgICAgICAgXSkudGhlbihmdW5jdGlvbiAoW3JvdGF0ZSwgcmVmLCB1c2VyVW5pdCwgdmlld10pIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm90YXRlLFxuICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgdXNlclVuaXQsXG4gICAgICAgICAgICB2aWV3LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0UGFnZUluZGV4XCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUluZGV4KHsgcmVmIH0pIHtcbiAgICAgIGNvbnN0IHBhZ2VSZWYgPSBSZWYuZ2V0KHJlZi5udW0sIHJlZi5nZW4pO1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcImdldFBhZ2VJbmRleFwiLCBbcGFnZVJlZl0pO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldERlc3RpbmF0aW9uc1wiLCBmdW5jdGlvbiB3cGhTZXR1cEdldERlc3RpbmF0aW9ucyhkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwiZGVzdGluYXRpb25zXCIpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldERlc3RpbmF0aW9uXCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0RGVzdGluYXRpb24oZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcImdldERlc3RpbmF0aW9uXCIsIFtkYXRhLmlkXSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0UGFnZUxhYmVsc1wiLCBmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2VMYWJlbHMoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcInBhZ2VMYWJlbHNcIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0UGFnZUxheW91dFwiLCBmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2VMYXlvdXQoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcInBhZ2VMYXlvdXRcIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0UGFnZU1vZGVcIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlTW9kZShkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwicGFnZU1vZGVcIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0Vmlld2VyUHJlZmVyZW5jZXNcIiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJ2aWV3ZXJQcmVmZXJlbmNlc1wiKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXRPcGVuQWN0aW9uXCIsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwib3BlbkFjdGlvblwiKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXRBdHRhY2htZW50c1wiLCBmdW5jdGlvbiB3cGhTZXR1cEdldEF0dGFjaG1lbnRzKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coXCJhdHRhY2htZW50c1wiKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXRKYXZhU2NyaXB0XCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0SmF2YVNjcmlwdChkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwiamF2YVNjcmlwdFwiKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXRPdXRsaW5lXCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0T3V0bGluZShkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwiZG9jdW1lbnRPdXRsaW5lXCIpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldE9wdGlvbmFsQ29udGVudENvbmZpZ1wiLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcIm9wdGlvbmFsQ29udGVudENvbmZpZ1wiKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJHZXRQZXJtaXNzaW9uc1wiLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcInBlcm1pc3Npb25zXCIpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIkdldE1ldGFkYXRhXCIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0TWV0YWRhdGEoZGF0YSkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgcGRmTWFuYWdlci5lbnN1cmVEb2MoXCJkb2N1bWVudEluZm9cIiksXG4gICAgICAgIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZyhcIm1ldGFkYXRhXCIpLFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0RGF0YVwiLCBmdW5jdGlvbiB3cGhTZXR1cEdldERhdGEoZGF0YSkge1xuICAgICAgcGRmTWFuYWdlci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCk7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpLnRoZW4oZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICByZXR1cm4gc3RyZWFtLmJ5dGVzO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0U3RhdHNcIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRTdGF0cyhkYXRhKSB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVYUmVmKFwic3RhdHNcIik7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFwiR2V0QW5ub3RhdGlvbnNcIiwgZnVuY3Rpb24gKHsgcGFnZUluZGV4LCBpbnRlbnQgfSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHBhZ2UuZ2V0QW5ub3RhdGlvbnNEYXRhKGludGVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJTYXZlRG9jdW1lbnRcIiwgZnVuY3Rpb24gKHtcbiAgICAgIG51bVBhZ2VzLFxuICAgICAgYW5ub3RhdGlvblN0b3JhZ2UsXG4gICAgICBmaWxlbmFtZSxcbiAgICB9KSB7XG4gICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKTtcbiAgICAgIGNvbnN0IHByb21pc2VzID0gW3BkZk1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKV07XG4gICAgICBjb25zdCBkb2N1bWVudCA9IHBkZk1hbmFnZXIucGRmRG9jdW1lbnQ7XG4gICAgICBmb3IgKGxldCBwYWdlSW5kZXggPSAwOyBwYWdlSW5kZXggPCBudW1QYWdlczsgcGFnZUluZGV4KyspIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFNhdmU6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7XG4gICAgICAgICAgICByZXR1cm4gcGFnZS5zYXZlKGhhbmRsZXIsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKFtzdHJlYW0sIC4uLnJlZnNdKSA9PiB7XG4gICAgICAgIGxldCBuZXdSZWZzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZnMpIHtcbiAgICAgICAgICBuZXdSZWZzID0gcmVmXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBuZXdSZWZzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdSZWZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIE5vIG5ldyByZWZzIHNvIGp1c3QgcmV0dXJuIHRoZSBpbml0aWFsIGJ5dGVzXG4gICAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHhyZWYgPSBkb2N1bWVudC54cmVmO1xuICAgICAgICBsZXQgbmV3WHJlZkluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBpZiAoeHJlZi50cmFpbGVyKSB7XG4gICAgICAgICAgLy8gR2V0IHN0cmluZyBpbmZvIGZyb20gSW5mbyBpbiBvcmRlciB0byBjb21wdXRlIGZpbGVJZFxuICAgICAgICAgIGNvbnN0IF9pbmZvID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBjb25zdCB4cmVmSW5mbyA9IHhyZWYudHJhaWxlci5nZXQoXCJJbmZvXCIpIHx8IG51bGw7XG4gICAgICAgICAgaWYgKHhyZWZJbmZvKSB7XG4gICAgICAgICAgICB4cmVmSW5mby5mb3JFYWNoKChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChpc1N0cmluZyhrZXkpICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIF9pbmZvW2tleV0gPSBzdHJpbmdUb1BERlN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld1hyZWZJbmZvID0ge1xuICAgICAgICAgICAgcm9vdFJlZjogeHJlZi50cmFpbGVyLmdldFJhdyhcIlJvb3RcIikgfHwgbnVsbCxcbiAgICAgICAgICAgIGVuY3J5cHQ6IHhyZWYudHJhaWxlci5nZXRSYXcoXCJFbmNyeXB0XCIpIHx8IG51bGwsXG4gICAgICAgICAgICBuZXdSZWY6IHhyZWYuZ2V0TmV3UmVmKCksXG4gICAgICAgICAgICBpbmZvUmVmOiB4cmVmLnRyYWlsZXIuZ2V0UmF3KFwiSW5mb1wiKSB8fCBudWxsLFxuICAgICAgICAgICAgaW5mbzogX2luZm8sXG4gICAgICAgICAgICBmaWxlSWRzOiB4cmVmLnRyYWlsZXIuZ2V0UmF3KFwiSURcIikgfHwgbnVsbCxcbiAgICAgICAgICAgIHN0YXJ0WFJlZjogZG9jdW1lbnQuc3RhcnRYUmVmLFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB4cmVmLnJlc2V0TmV3UmVmKCk7XG5cbiAgICAgICAgcmV0dXJuIGluY3JlbWVudGFsVXBkYXRlKHN0cmVhbS5ieXRlcywgbmV3WHJlZkluZm8sIG5ld1JlZnMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLm9uKFxuICAgICAgXCJHZXRPcGVyYXRvckxpc3RcIixcbiAgICAgIGZ1bmN0aW9uIHdwaFNldHVwUmVuZGVyUGFnZShkYXRhLCBzaW5rKSB7XG4gICAgICAgIHZhciBwYWdlSW5kZXggPSBkYXRhLnBhZ2VJbmRleDtcbiAgICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkge1xuICAgICAgICAgIHZhciB0YXNrID0gbmV3IFdvcmtlclRhc2soYEdldE9wZXJhdG9yTGlzdDogcGFnZSAke3BhZ2VJbmRleH1gKTtcbiAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7XG5cbiAgICAgICAgICAvLyBOT1RFOiBLZWVwIHRoaXMgY29uZGl0aW9uIGluIHN5bmMgd2l0aCB0aGUgYGluZm9gIGhlbHBlciBmdW5jdGlvbi5cbiAgICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwO1xuXG4gICAgICAgICAgLy8gUHJlIGNvbXBpbGUgdGhlIHBkZiBwYWdlIGFuZCBmZXRjaCB0aGUgZm9udHMvaW1hZ2VzLlxuICAgICAgICAgIHBhZ2VcbiAgICAgICAgICAgIC5nZXRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgICAgICBzaW5rLFxuICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICBpbnRlbnQ6IGRhdGEuaW50ZW50LFxuICAgICAgICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiBkYXRhLnJlbmRlckludGVyYWN0aXZlRm9ybXMsXG4gICAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBkYXRhLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICBmdW5jdGlvbiAob3BlcmF0b3JMaXN0SW5mbykge1xuICAgICAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgIGluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBwYWdlPSR7cGFnZUluZGV4ICsgMX0gLSBnZXRPcGVyYXRvckxpc3Q6IHRpbWU9YCArXG4gICAgICAgICAgICAgICAgICAgICAgYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zLCBsZW49JHtvcGVyYXRvckxpc3RJbmZvLmxlbmd0aH1gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spO1xuICAgICAgICAgICAgICAgIGlmICh0YXNrLnRlcm1pbmF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gaWdub3JpbmcgZXJyb3JzIGZyb20gdGhlIHRlcm1pbmF0ZWQgdGhyZWFkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgYmVoYXZpb3IsIGdlbmVyYXRpbmcgdW5rbm93blxuICAgICAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIGZlYXR1cmUgbm90aWZpY2F0aW9uIG9uIGVycm9ycy5cbiAgICAgICAgICAgICAgICBoYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICAgICAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvck9wZXJhdG9yTGlzdCxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCBgcmVhc29uYCBiZSByZS10aHJvd24gaGVyZSAoY3VycmVudGx5IHRoYXRcbiAgICAgICAgICAgICAgICAvLyAgICAgICBjYXN1ZXMgXCJVbmNhdWdodCBleGNlcHRpb246IC4uLlwiIG1lc3NhZ2VzIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vICAgICAgIGNvbnNvbGUpP1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0aGlzXG4gICAgKTtcblxuICAgIGhhbmRsZXIub24oXCJHZXRUZXh0Q29udGVudFwiLCBmdW5jdGlvbiB3cGhFeHRyYWN0VGV4dChkYXRhLCBzaW5rKSB7XG4gICAgICB2YXIgcGFnZUluZGV4ID0gZGF0YS5wYWdlSW5kZXg7XG4gICAgICBzaW5rLm9uUHVsbCA9IGZ1bmN0aW9uIChkZXNpcmVkU2l6ZSkge307XG4gICAgICBzaW5rLm9uQ2FuY2VsID0gZnVuY3Rpb24gKHJlYXNvbikge307XG5cbiAgICAgIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgdmFyIHRhc2sgPSBuZXcgV29ya2VyVGFzayhcIkdldFRleHRDb250ZW50OiBwYWdlIFwiICsgcGFnZUluZGV4KTtcbiAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spO1xuXG4gICAgICAgIC8vIE5PVEU6IEtlZXAgdGhpcyBjb25kaXRpb24gaW4gc3luYyB3aXRoIHRoZSBgaW5mb2AgaGVscGVyIGZ1bmN0aW9uLlxuICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwO1xuXG4gICAgICAgIHBhZ2VcbiAgICAgICAgICAuZXh0cmFjdFRleHRDb250ZW50KHtcbiAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgc2luayxcbiAgICAgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2U6IGRhdGEubm9ybWFsaXplV2hpdGVzcGFjZSxcbiAgICAgICAgICAgIGNvbWJpbmVUZXh0SXRlbXM6IGRhdGEuY29tYmluZVRleHRJdGVtcyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spO1xuXG4gICAgICAgICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgICAgIGluZm8oXG4gICAgICAgICAgICAgICAgICBgcGFnZT0ke3BhZ2VJbmRleCArIDF9IC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9YCArXG4gICAgICAgICAgICAgICAgICAgIGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNpbmsuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7XG4gICAgICAgICAgICAgIGlmICh0YXNrLnRlcm1pbmF0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIGlnbm9yaW5nIGVycm9ycyBmcm9tIHRoZSB0ZXJtaW5hdGVkIHRocmVhZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTtcblxuICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgYHJlYXNvbmAgYmUgcmUtdGhyb3duIGhlcmUgKGN1cnJlbnRseSB0aGF0IGNhc3Vlc1xuICAgICAgICAgICAgICAvLyAgICAgICBcIlVuY2F1Z2h0IGV4Y2VwdGlvbjogLi4uXCIgbWVzc2FnZXMgaW4gdGhlIGNvbnNvbGUpP1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJGb250RmFsbGJhY2tcIiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmZvbnRGYWxsYmFjayhkYXRhLmlkLCBoYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJDbGVhbnVwXCIsIGZ1bmN0aW9uIHdwaENsZWFudXAoZGF0YSkge1xuICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuY2xlYW51cCgvKiBtYW51YWxseVRyaWdnZXJlZCA9ICovIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5vbihcIlRlcm1pbmF0ZVwiLCBmdW5jdGlvbiB3cGhUZXJtaW5hdGUoZGF0YSkge1xuICAgICAgdGVybWluYXRlZCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHdhaXRPbiA9IFtdO1xuICAgICAgaWYgKHBkZk1hbmFnZXIpIHtcbiAgICAgICAgcGRmTWFuYWdlci50ZXJtaW5hdGUobmV3IEFib3J0RXhjZXB0aW9uKFwiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLlwiKSk7XG5cbiAgICAgICAgY29uc3QgY2xlYW51cFByb21pc2UgPSBwZGZNYW5hZ2VyLmNsZWFudXAoKTtcbiAgICAgICAgd2FpdE9uLnB1c2goY2xlYW51cFByb21pc2UpO1xuXG4gICAgICAgIHBkZk1hbmFnZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xlYXJQcmltaXRpdmVDYWNoZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYW5jZWxYSFJzKSB7XG4gICAgICAgIGNhbmNlbFhIUnMobmV3IEFib3J0RXhjZXB0aW9uKFwiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLlwiKSk7XG4gICAgICB9XG5cbiAgICAgIFdvcmtlclRhc2tzLmZvckVhY2goZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgd2FpdE9uLnB1c2godGFzay5maW5pc2hlZCk7XG4gICAgICAgIHRhc2sudGVybWluYXRlKCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHdhaXRPbikudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIE5vdGljZSB0aGF0IGV2ZW4gaWYgd2UgZGVzdHJveWluZyBoYW5kbGVyLCByZXNvbHZlZCByZXNwb25zZSBwcm9taXNlXG4gICAgICAgIC8vIG11c3QgYmUgc2VudCBiYWNrLlxuICAgICAgICBoYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgaGFuZGxlciA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGhhbmRsZXIub24oXCJSZWFkeVwiLCBmdW5jdGlvbiB3cGhSZWFkeShkYXRhKSB7XG4gICAgICBzZXR1cERvYyhkb2NQYXJhbXMpO1xuICAgICAgZG9jUGFyYW1zID0gbnVsbDsgLy8gd2UgZG9uJ3QgbmVlZCBkb2NQYXJhbXMgYW55bW9yZSAtLSBzYXZpbmcgbWVtb3J5LlxuICAgIH0pO1xuICAgIHJldHVybiB3b3JrZXJIYW5kbGVyTmFtZTtcbiAgfVxuXG4gIHN0YXRpYyBpbml0aWFsaXplRnJvbVBvcnQocG9ydCkge1xuICAgIHZhciBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKFwid29ya2VyXCIsIFwibWFpblwiLCBwb3J0KTtcbiAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cChoYW5kbGVyLCBwb3J0KTtcbiAgICBoYW5kbGVyLnNlbmQoXCJyZWFkeVwiLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc01lc3NhZ2VQb3J0KG1heWJlUG9ydCkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBtYXliZVBvcnQucG9zdE1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIiAmJiBcIm9ubWVzc2FnZVwiIGluIG1heWJlUG9ydFxuICApO1xufVxuXG4vLyBXb3JrZXIgdGhyZWFkIChhbmQgbm90IE5vZGUuanMpP1xuaWYgKFxuICB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiICYmXG4gICFpc05vZGVKUyAmJlxuICB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBpc01lc3NhZ2VQb3J0KHNlbGYpXG4pIHtcbiAgV29ya2VyTWVzc2FnZUhhbmRsZXIuaW5pdGlhbGl6ZUZyb21Qb3J0KHNlbGYpO1xufVxuXG5leHBvcnQgeyBXb3JrZXJUYXNrLCBXb3JrZXJNZXNzYWdlSGFuZGxlciB9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgXCIuL2NvbXBhdGliaWxpdHkuanNcIjtcblxuY29uc3QgSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdO1xuY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTtcblxuLy8gUGVybWlzc2lvbiBmbGFncyBmcm9tIFRhYmxlIDIyLCBTZWN0aW9uIDcuNi4zLjIgb2YgdGhlIFBERiBzcGVjaWZpY2F0aW9uLlxuY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7XG4gIFBSSU5UOiAweDA0LFxuICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsXG4gIENPUFk6IDB4MTAsXG4gIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCxcbiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsXG4gIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLFxuICBBU1NFTUJMRTogMHg0MDAsXG4gIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAsXG59O1xuXG5jb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHtcbiAgRklMTDogMCxcbiAgU1RST0tFOiAxLFxuICBGSUxMX1NUUk9LRTogMixcbiAgSU5WSVNJQkxFOiAzLFxuICBGSUxMX0FERF9UT19QQVRIOiA0LFxuICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsXG4gIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LFxuICBBRERfVE9fUEFUSDogNyxcbiAgRklMTF9TVFJPS0VfTUFTSzogMyxcbiAgQUREX1RPX1BBVEhfRkxBRzogNCxcbn07XG5cbmNvbnN0IEltYWdlS2luZCA9IHtcbiAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gIFJHQl8yNEJQUDogMixcbiAgUkdCQV8zMkJQUDogMyxcbn07XG5cbmNvbnN0IEFubm90YXRpb25UeXBlID0ge1xuICBURVhUOiAxLFxuICBMSU5LOiAyLFxuICBGUkVFVEVYVDogMyxcbiAgTElORTogNCxcbiAgU1FVQVJFOiA1LFxuICBDSVJDTEU6IDYsXG4gIFBPTFlHT046IDcsXG4gIFBPTFlMSU5FOiA4LFxuICBISUdITElHSFQ6IDksXG4gIFVOREVSTElORTogMTAsXG4gIFNRVUlHR0xZOiAxMSxcbiAgU1RSSUtFT1VUOiAxMixcbiAgU1RBTVA6IDEzLFxuICBDQVJFVDogMTQsXG4gIElOSzogMTUsXG4gIFBPUFVQOiAxNixcbiAgRklMRUFUVEFDSE1FTlQ6IDE3LFxuICBTT1VORDogMTgsXG4gIE1PVklFOiAxOSxcbiAgV0lER0VUOiAyMCxcbiAgU0NSRUVOOiAyMSxcbiAgUFJJTlRFUk1BUks6IDIyLFxuICBUUkFQTkVUOiAyMyxcbiAgV0FURVJNQVJLOiAyNCxcbiAgVEhSRUVEOiAyNSxcbiAgUkVEQUNUOiAyNixcbn07XG5cbmNvbnN0IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHtcbiAgTUFSS0VEOiBcIk1hcmtlZFwiLFxuICBSRVZJRVc6IFwiUmV2aWV3XCIsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uTWFya2VkU3RhdGUgPSB7XG4gIE1BUktFRDogXCJNYXJrZWRcIixcbiAgVU5NQVJLRUQ6IFwiVW5tYXJrZWRcIixcbn07XG5cbmNvbnN0IEFubm90YXRpb25SZXZpZXdTdGF0ZSA9IHtcbiAgQUNDRVBURUQ6IFwiQWNjZXB0ZWRcIixcbiAgUkVKRUNURUQ6IFwiUmVqZWN0ZWRcIixcbiAgQ0FOQ0VMTEVEOiBcIkNhbmNlbGxlZFwiLFxuICBDT01QTEVURUQ6IFwiQ29tcGxldGVkXCIsXG4gIE5PTkU6IFwiTm9uZVwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHtcbiAgR1JPVVA6IFwiR3JvdXBcIixcbiAgUkVQTFk6IFwiUlwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7XG4gIElOVklTSUJMRTogMHgwMSxcbiAgSElEREVOOiAweDAyLFxuICBQUklOVDogMHgwNCxcbiAgTk9aT09NOiAweDA4LFxuICBOT1JPVEFURTogMHgxMCxcbiAgTk9WSUVXOiAweDIwLFxuICBSRUFET05MWTogMHg0MCxcbiAgTE9DS0VEOiAweDgwLFxuICBUT0dHTEVOT1ZJRVc6IDB4MTAwLFxuICBMT0NLRURDT05URU5UUzogMHgyMDAsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0ge1xuICBSRUFET05MWTogMHgwMDAwMDAxLFxuICBSRVFVSVJFRDogMHgwMDAwMDAyLFxuICBOT0VYUE9SVDogMHgwMDAwMDA0LFxuICBNVUxUSUxJTkU6IDB4MDAwMTAwMCxcbiAgUEFTU1dPUkQ6IDB4MDAwMjAwMCxcbiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLFxuICBSQURJTzogMHgwMDA4MDAwLFxuICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsXG4gIENPTUJPOiAweDAwMjAwMDAsXG4gIEVESVQ6IDB4MDA0MDAwMCxcbiAgU09SVDogMHgwMDgwMDAwLFxuICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsXG4gIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsXG4gIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLFxuICBET05PVFNDUk9MTDogMHgwODAwMDAwLFxuICBDT01COiAweDEwMDAwMDAsXG4gIFJJQ0hURVhUOiAweDIwMDAwMDAsXG4gIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsXG4gIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDAsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0ge1xuICBTT0xJRDogMSxcbiAgREFTSEVEOiAyLFxuICBCRVZFTEVEOiAzLFxuICBJTlNFVDogNCxcbiAgVU5ERVJMSU5FOiA1LFxufTtcblxuY29uc3QgU3RyZWFtVHlwZSA9IHtcbiAgVU5LTk9XTjogXCJVTktOT1dOXCIsXG4gIEZMQVRFOiBcIkZMQVRFXCIsXG4gIExaVzogXCJMWldcIixcbiAgRENUOiBcIkRDVFwiLFxuICBKUFg6IFwiSlBYXCIsXG4gIEpCSUc6IFwiSkJJR1wiLFxuICBBODU6IFwiQTg1XCIsXG4gIEFIWDogXCJBSFhcIixcbiAgQ0NGOiBcIkNDRlwiLFxuICBSTFg6IFwiUkxYXCIsIC8vIFBERiBzaG9ydCBuYW1lIGlzICdSTCcsIGJ1dCB0ZWxlbWV0cnkgcmVxdWlyZXMgdGhyZWUgY2hhcnMuXG59O1xuXG5jb25zdCBGb250VHlwZSA9IHtcbiAgVU5LTk9XTjogXCJVTktOT1dOXCIsXG4gIFRZUEUxOiBcIlRZUEUxXCIsXG4gIFRZUEUxQzogXCJUWVBFMUNcIixcbiAgQ0lERk9OVFRZUEUwOiBcIkNJREZPTlRUWVBFMFwiLFxuICBDSURGT05UVFlQRTBDOiBcIkNJREZPTlRUWVBFMENcIixcbiAgVFJVRVRZUEU6IFwiVFJVRVRZUEVcIixcbiAgQ0lERk9OVFRZUEUyOiBcIkNJREZPTlRUWVBFMlwiLFxuICBUWVBFMzogXCJUWVBFM1wiLFxuICBPUEVOVFlQRTogXCJPUEVOVFlQRVwiLFxuICBUWVBFMDogXCJUWVBFMFwiLFxuICBNTVRZUEUxOiBcIk1NVFlQRTFcIixcbn07XG5cbmNvbnN0IFZlcmJvc2l0eUxldmVsID0ge1xuICBFUlJPUlM6IDAsXG4gIFdBUk5JTkdTOiAxLFxuICBJTkZPUzogNSxcbn07XG5cbmNvbnN0IENNYXBDb21wcmVzc2lvblR5cGUgPSB7XG4gIE5PTkU6IDAsXG4gIEJJTkFSWTogMSxcbiAgU1RSRUFNOiAyLFxufTtcblxuLy8gQWxsIHRoZSBwb3NzaWJsZSBvcGVyYXRpb25zIGZvciBhbiBvcGVyYXRvciBsaXN0LlxuY29uc3QgT1BTID0ge1xuICAvLyBJbnRlbnRpb25hbGx5IHN0YXJ0IGZyb20gMSBzbyBpdCBpcyBlYXN5IHRvIHNwb3QgYmFkIG9wZXJhdG9ycyB0aGF0IHdpbGwgYmVcbiAgLy8gMCdzLlxuICBkZXBlbmRlbmN5OiAxLFxuICBzZXRMaW5lV2lkdGg6IDIsXG4gIHNldExpbmVDYXA6IDMsXG4gIHNldExpbmVKb2luOiA0LFxuICBzZXRNaXRlckxpbWl0OiA1LFxuICBzZXREYXNoOiA2LFxuICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gIHNldEZsYXRuZXNzOiA4LFxuICBzZXRHU3RhdGU6IDksXG4gIHNhdmU6IDEwLFxuICByZXN0b3JlOiAxMSxcbiAgdHJhbnNmb3JtOiAxMixcbiAgbW92ZVRvOiAxMyxcbiAgbGluZVRvOiAxNCxcbiAgY3VydmVUbzogMTUsXG4gIGN1cnZlVG8yOiAxNixcbiAgY3VydmVUbzM6IDE3LFxuICBjbG9zZVBhdGg6IDE4LFxuICByZWN0YW5nbGU6IDE5LFxuICBzdHJva2U6IDIwLFxuICBjbG9zZVN0cm9rZTogMjEsXG4gIGZpbGw6IDIyLFxuICBlb0ZpbGw6IDIzLFxuICBmaWxsU3Ryb2tlOiAyNCxcbiAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICBlbmRQYXRoOiAyOCxcbiAgY2xpcDogMjksXG4gIGVvQ2xpcDogMzAsXG4gIGJlZ2luVGV4dDogMzEsXG4gIGVuZFRleHQ6IDMyLFxuICBzZXRDaGFyU3BhY2luZzogMzMsXG4gIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgc2V0SFNjYWxlOiAzNSxcbiAgc2V0TGVhZGluZzogMzYsXG4gIHNldEZvbnQ6IDM3LFxuICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gIHNldFRleHRSaXNlOiAzOSxcbiAgbW92ZVRleHQ6IDQwLFxuICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICBzZXRUZXh0TWF0cml4OiA0MixcbiAgbmV4dExpbmU6IDQzLFxuICBzaG93VGV4dDogNDQsXG4gIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICBzZXRTdHJva2VDb2xvck46IDUzLFxuICBzZXRGaWxsQ29sb3I6IDU0LFxuICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgc2V0U3Ryb2tlR3JheTogNTYsXG4gIHNldEZpbGxHcmF5OiA1NyxcbiAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgc2hhZGluZ0ZpbGw6IDYyLFxuICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gIHBhaW50WE9iamVjdDogNjYsXG4gIG1hcmtQb2ludDogNjcsXG4gIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgYmVnaW5Db21wYXQ6IDcyLFxuICBlbmRDb21wYXQ6IDczLFxuICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgYmVnaW5Hcm91cDogNzYsXG4gIGVuZEdyb3VwOiA3NyxcbiAgYmVnaW5Bbm5vdGF0aW9uczogNzgsXG4gIGVuZEFubm90YXRpb25zOiA3OSxcbiAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgZW5kQW5ub3RhdGlvbjogODEsXG4gIHBhaW50SnBlZ1hPYmplY3Q6IDgyLFxuICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLFxuICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsXG4gIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSxcbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LFxuICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NyxcbiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LFxuICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LFxuICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLFxuICBjb25zdHJ1Y3RQYXRoOiA5MSxcbn07XG5cbmNvbnN0IFVOU1VQUE9SVEVEX0ZFQVRVUkVTID0ge1xuICAvKiogQGRlcHJlY2F0ZWQgdW51c2VkICovXG4gIHVua25vd246IFwidW5rbm93blwiLFxuICBmb3JtczogXCJmb3Jtc1wiLFxuICBqYXZhU2NyaXB0OiBcImphdmFTY3JpcHRcIixcbiAgc21hc2s6IFwic21hc2tcIixcbiAgc2hhZGluZ1BhdHRlcm46IFwic2hhZGluZ1BhdHRlcm5cIixcbiAgLyoqIEBkZXByZWNhdGVkIHVudXNlZCAqL1xuICBmb250OiBcImZvbnRcIixcbiAgZXJyb3JUaWxpbmdQYXR0ZXJuOiBcImVycm9yVGlsaW5nUGF0dGVyblwiLFxuICBlcnJvckV4dEdTdGF0ZTogXCJlcnJvckV4dEdTdGF0ZVwiLFxuICBlcnJvclhPYmplY3Q6IFwiZXJyb3JYT2JqZWN0XCIsXG4gIGVycm9yRm9udExvYWRUeXBlMzogXCJlcnJvckZvbnRMb2FkVHlwZTNcIixcbiAgZXJyb3JGb250U3RhdGU6IFwiZXJyb3JGb250U3RhdGVcIixcbiAgZXJyb3JGb250TWlzc2luZzogXCJlcnJvckZvbnRNaXNzaW5nXCIsXG4gIGVycm9yRm9udFRyYW5zbGF0ZTogXCJlcnJvckZvbnRUcmFuc2xhdGVcIixcbiAgZXJyb3JDb2xvclNwYWNlOiBcImVycm9yQ29sb3JTcGFjZVwiLFxuICBlcnJvck9wZXJhdG9yTGlzdDogXCJlcnJvck9wZXJhdG9yTGlzdFwiLFxuICBlcnJvckZvbnRUb1VuaWNvZGU6IFwiZXJyb3JGb250VG9Vbmljb2RlXCIsXG4gIGVycm9yRm9udExvYWROYXRpdmU6IFwiZXJyb3JGb250TG9hZE5hdGl2ZVwiLFxuICBlcnJvckZvbnRHZXRQYXRoOiBcImVycm9yRm9udEdldFBhdGhcIixcbiAgZXJyb3JNYXJrZWRDb250ZW50OiBcImVycm9yTWFya2VkQ29udGVudFwiLFxufTtcblxuY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7XG4gIE5FRURfUEFTU1dPUkQ6IDEsXG4gIElOQ09SUkVDVF9QQVNTV09SRDogMixcbn07XG5cbmxldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUztcblxuZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHtcbiAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7XG4gICAgdmVyYm9zaXR5ID0gbGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7XG4gIHJldHVybiB2ZXJib3NpdHk7XG59XG5cbi8vIEEgbm90aWNlIGZvciBkZXZzLiBUaGVzZSBhcmUgZ29vZCBmb3IgdGhpbmdzIHRoYXQgYXJlIGhlbHBmdWwgdG8gZGV2cywgc3VjaFxuLy8gYXMgd2FybmluZyB0aGF0IFdvcmtlcnMgd2VyZSBkaXNhYmxlZCwgd2hpY2ggaXMgaW1wb3J0YW50IHRvIGRldnMgYnV0IG5vdFxuLy8gZW5kIHVzZXJzLlxuZnVuY3Rpb24gaW5mbyhtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykge1xuICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTtcbiAgfVxufVxuXG4vLyBOb24tZmF0YWwgd2FybmluZ3MuXG5mdW5jdGlvbiB3YXJuKG1zZykge1xuICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7XG4gICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykge1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykge1xuICBpZiAoIWNvbmQpIHtcbiAgICB1bnJlYWNoYWJsZShtc2cpO1xuICB9XG59XG5cbi8vIENoZWNrcyBpZiBVUkxzIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiBGb3Igbm9uLUhUVFAgYmFzZWQgVVJMcywgcmV0dXJucyBmYWxzZS5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbihiYXNlVXJsLCBvdGhlclVybCkge1xuICBsZXQgYmFzZTtcbiAgdHJ5IHtcbiAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICBpZiAoIWJhc2Uub3JpZ2luIHx8IGJhc2Uub3JpZ2luID09PSBcIm51bGxcIikge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub24tSFRUUCB1cmxcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvdGhlciA9IG5ldyBVUkwob3RoZXJVcmwsIGJhc2UpO1xuICByZXR1cm4gYmFzZS5vcmlnaW4gPT09IG90aGVyLm9yaWdpbjtcbn1cblxuLy8gQ2hlY2tzIGlmIFVSTHMgdXNlIG9uZSBvZiB0aGUgYWxsb3dlZCBwcm90b2NvbHMsIGUuZy4gdG8gYXZvaWQgWFNTLlxuZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh1cmwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHtcbiAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICBjYXNlIFwiaHR0cHM6XCI6XG4gICAgY2FzZSBcImZ0cDpcIjpcbiAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgIGNhc2UgXCJ0ZWw6XCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgdmFsaWQgYWJzb2x1dGUgVVJMLlxuICpcbiAqIEBwYXJhbSB7VVJMfHN0cmluZ30gdXJsIC0gQW4gYWJzb2x1dGUsIG9yIHJlbGF0aXZlLCBVUkwuXG4gKiBAcGFyYW0ge1VSTHxzdHJpbmd9IGJhc2VVcmwgLSBBbiBhYnNvbHV0ZSBVUkwuXG4gKiBAcmV0dXJucyBFaXRoZXIgYSB2YWxpZCB7VVJMfSwgb3IgYG51bGxgIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGFic29sdXRlVXJsID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICBpZiAoX2lzVmFsaWRQcm90b2NvbChhYnNvbHV0ZVVybCkpIHtcbiAgICAgIHJldHVybiBhYnNvbHV0ZVVybDtcbiAgICB9XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgLyogYG5ldyBVUkwoKWAgd2lsbCB0aHJvdyBvbiBpbmNvcnJlY3QgZGF0YS4gKi9cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuICAgIHZhbHVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZSB7YW55fVxuICovXG5jb25zdCBCYXNlRXhjZXB0aW9uID0gKGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcblxuICByZXR1cm4gQmFzZUV4Y2VwdGlvbjtcbn0pKCk7XG5cbmNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgY29kZSkge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuXG5jbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICB9XG59XG5cbmNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciBjYXVzZWQgZHVyaW5nIHBhcnNpbmcgUERGIGRhdGEuXG4gKi9cbmNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG4vKipcbiAqIEVycm9yIHVzZWQgdG8gaW5kaWNhdGUgdGFzayBjYW5jZWxsYXRpb24uXG4gKi9cbmNsYXNzIEFib3J0RXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG5jb25zdCBOdWxsQ2hhcmFjdGVyc1JlZ0V4cCA9IC9cXHgwMC9nO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnMoc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgd2FybihcIlRoZSBhcmd1bWVudCBmb3IgcmVtb3ZlTnVsbENoYXJhY3RlcnMgbXVzdCBiZSBhIHN0cmluZy5cIik7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICByZXR1cm4gc3RyLnJlcGxhY2UoTnVsbENoYXJhY3RlcnNSZWdFeHAsIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7XG4gIGFzc2VydChcbiAgICBieXRlcyAhPT0gbnVsbCAmJiB0eXBlb2YgYnl0ZXMgPT09IFwib2JqZWN0XCIgJiYgYnl0ZXMubGVuZ3RoICE9PSB1bmRlZmluZWQsXG4gICAgXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nXCJcbiAgKTtcbiAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyO1xuICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICB9XG4gIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcbiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7XG4gICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7XG4gICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpO1xuICB9XG4gIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgYXNzZXJ0KHR5cGVvZiBzdHIgPT09IFwic3RyaW5nXCIsIFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKipcbiAqIEdldHMgbGVuZ3RoIG9mIHRoZSBhcnJheSAoQXJyYXksIFVpbnQ4QXJyYXksIG9yIHN0cmluZykgaW4gYnl0ZXMuXG4gKiBAcGFyYW0ge0FycmF5PGFueT58VWludDhBcnJheXxzdHJpbmd9IGFyclxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gYXJyYXlCeXRlTGVuZ3RoKGFycikge1xuICBpZiAoYXJyLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGFyci5sZW5ndGg7XG4gIH1cbiAgYXNzZXJ0KGFyci5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQsIFwiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC5cIik7XG4gIHJldHVybiBhcnIuYnl0ZUxlbmd0aDtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyBhcnJheSBpdGVtcyAoYXJyYXlzKSBpbnRvIHNpbmdsZSBVaW50OEFycmF5IG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8YW55PnxVaW50OEFycmF5fHN0cmluZz59IGFyciAtIHRoZSBhcnJheSBvZiB0aGUgYXJyYXlzXG4gKiAgIChBcnJheSwgVWludDhBcnJheSwgb3Igc3RyaW5nKS5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiBhcnJheXNUb0J5dGVzKGFycikge1xuICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICAvLyBTaG9ydGN1dDogaWYgZmlyc3QgYW5kIG9ubHkgaXRlbSBpcyBVaW50OEFycmF5LCByZXR1cm4gaXQuXG4gIGlmIChsZW5ndGggPT09IDEgJiYgYXJyWzBdIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiBhcnJbMF07XG4gIH1cbiAgbGV0IHJlc3VsdExlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRMZW5ndGggKz0gYXJyYXlCeXRlTGVuZ3RoKGFycltpXSk7XG4gIH1cbiAgbGV0IHBvcyA9IDA7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShyZXN1bHRMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGl0ZW0gPSBhcnJbaV07XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbSA9IHN0cmluZ1RvQnl0ZXMoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtID0gbmV3IFVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1MZW5ndGggPSBpdGVtLmJ5dGVMZW5ndGg7XG4gICAgZGF0YS5zZXQoaXRlbSwgcG9zKTtcbiAgICBwb3MgKz0gaXRlbUxlbmd0aDtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgKHZhbHVlID4+IDI0KSAmIDB4ZmYsXG4gICAgKHZhbHVlID4+IDE2KSAmIDB4ZmYsXG4gICAgKHZhbHVlID4+IDgpICYgMHhmZixcbiAgICB2YWx1ZSAmIDB4ZmZcbiAgKTtcbn1cblxuLy8gQ2hlY2tzIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBwbGF0Zm9ybS5cbmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkge1xuICBjb25zdCBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gIGJ1ZmZlcjhbMF0gPSAxO1xuICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpO1xuICByZXR1cm4gdmlldzMyWzBdID09PSAxO1xufVxuY29uc3QgSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSB7XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidmFsdWVcIiwgaXNMaXR0bGVFbmRpYW4oKSk7XG4gIH0sXG59O1xuXG4vLyBDaGVja3MgaWYgaXQncyBwb3NzaWJsZSB0byBldmFsIEpTIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkge1xuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbihcIlwiKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcsIG5vLW5ldy1mdW5jXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmNvbnN0IElzRXZhbFN1cHBvcnRlZENhY2hlZCA9IHtcbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2YWx1ZVwiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7XG4gIH0sXG59O1xuXG5jb25zdCByZ2JCdWYgPSBbXCJyZ2IoXCIsIDAsIFwiLFwiLCAwLCBcIixcIiwgMCwgXCIpXCJdO1xuXG5jbGFzcyBVdGlsIHtcbiAgLy8gbWFrZUNzc1JnYigpIGNhbiBiZSBjYWxsZWQgdGhvdXNhbmRzIG9mIHRpbWVzLiBVc2luZyDCtHJnYkJ1ZmAgYXZvaWRzXG4gIC8vIGNyZWF0aW5nIG1hbnkgaW50ZXJtZWRpYXRlIHN0cmluZ3MuXG4gIHN0YXRpYyBtYWtlQ3NzUmdiKHIsIGcsIGIpIHtcbiAgICByZ2JCdWZbMV0gPSByO1xuICAgIHJnYkJ1ZlszXSA9IGc7XG4gICAgcmdiQnVmWzVdID0gYjtcbiAgICByZXR1cm4gcmdiQnVmLmpvaW4oXCJcIik7XG4gIH1cblxuICAvLyBDb25jYXRlbmF0ZXMgdHdvIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIHRvZ2V0aGVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gIHN0YXRpYyB0cmFuc2Zvcm0obTEsIG0yKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG0xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLFxuICAgICAgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sXG4gICAgICBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSxcbiAgICAgIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLFxuICAgICAgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSxcbiAgICAgIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIEZvciAyZCBhZmZpbmUgdHJhbnNmb3Jtc1xuICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0ocCwgbSkge1xuICAgIGNvbnN0IHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07XG4gICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cblxuICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHAsIG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICBjb25zdCB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkO1xuICAgIGNvbnN0IHl0ID0gKC1wWzBdICogbVsxXSArIHBbMV0gKiBtWzBdICsgbVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHRyYW5zZm9ybSB0byB0aGUgcmVjdGFuZ2xlIGFuZCBmaW5kcyB0aGUgbWluaW11bSBheGlhbGx5XG4gIC8vIGFsaWduZWQgYm91bmRpbmcgYm94LlxuICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkge1xuICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLCBtKTtcbiAgICBjb25zdCBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7XG4gICAgY29uc3QgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7XG4gICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7XG4gICAgcmV0dXJuIFtcbiAgICAgIE1hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSxcbiAgICAgIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSxcbiAgICAgIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSxcbiAgICAgIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSxcbiAgICBdO1xuICB9XG5cbiAgc3RhdGljIGludmVyc2VUcmFuc2Zvcm0obSkge1xuICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuICAgIHJldHVybiBbXG4gICAgICBtWzNdIC8gZCxcbiAgICAgIC1tWzFdIC8gZCxcbiAgICAgIC1tWzJdIC8gZCxcbiAgICAgIG1bMF0gLyBkLFxuICAgICAgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCxcbiAgICAgIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQsXG4gICAgXTtcbiAgfVxuXG4gIC8vIEFwcGx5IGEgZ2VuZXJpYyAzZCBtYXRyaXggTSBvbiBhIDMtdmVjdG9yIHY6XG4gIC8vICAgfCBhIGIgYyB8ICAgfCBYIHxcbiAgLy8gICB8IGQgZSBmIHwgeCB8IFkgfFxuICAvLyAgIHwgZyBoIGkgfCAgIHwgWiB8XG4gIC8vIE0gaXMgYXNzdW1lZCB0byBiZSBzZXJpYWxpemVkIGFzIFthLGIsYyxkLGUsZixnLGgsaV0sXG4gIC8vIHdpdGggdiBhcyBbWCxZLFpdXG4gIHN0YXRpYyBhcHBseTNkVHJhbnNmb3JtKG0sIHYpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbVswXSAqIHZbMF0gKyBtWzFdICogdlsxXSArIG1bMl0gKiB2WzJdLFxuICAgICAgbVszXSAqIHZbMF0gKyBtWzRdICogdlsxXSArIG1bNV0gKiB2WzJdLFxuICAgICAgbVs2XSAqIHZbMF0gKyBtWzddICogdlsxXSArIG1bOF0gKiB2WzJdLFxuICAgIF07XG4gIH1cblxuICAvLyBUaGlzIGNhbGN1bGF0aW9uIHVzZXMgU2luZ3VsYXIgVmFsdWUgRGVjb21wb3NpdGlvbi5cbiAgLy8gVGhlIFNWRCBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aCBmb3JtdWxhIEEgPSBVU1YuIFdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZVxuICAvLyBtYXRyaXggUyBoZXJlIGJlY2F1c2UgaXQgcmVwcmVzZW50cyB0aGUgc2NhbGUgdmFsdWVzLlxuICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkge1xuICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTtcblxuICAgIC8vIE11bHRpcGx5IG1hdHJpeCBtIHdpdGggaXRzIHRyYW5zcG9zZS5cbiAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07XG4gICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdO1xuICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107XG5cbiAgICAvLyBTb2x2ZSB0aGUgc2Vjb25kIGRlZ3JlZSBwb2x5bm9taWFsIHRvIGdldCByb290cy5cbiAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyO1xuICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICogKGEgKyBkKSAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjtcbiAgICBjb25zdCBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7XG4gICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxO1xuXG4gICAgLy8gU2NhbGUgdmFsdWVzIGFyZSB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBlaWdlbnZhbHVlcy5cbiAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHJlY3RhbmdsZSByZWN0PVt4MSwgeTEsIHgyLCB5Ml0gc28gdGhhdCAoeDEseTEpIDwgKHgyLHkyKVxuICAvLyBGb3IgY29vcmRpbmF0ZSBzeXN0ZW1zIHdob3NlIG9yaWdpbiBsaWVzIGluIHRoZSBib3R0b20tbGVmdCwgdGhpc1xuICAvLyBtZWFucyBub3JtYWxpemF0aW9uIHRvIChCTCxUUikgb3JkZXJpbmcuIEZvciBzeXN0ZW1zIHdpdGggb3JpZ2luIGluIHRoZVxuICAvLyB0b3AtbGVmdCwgdGhpcyBtZWFucyAoVEwsQlIpIG9yZGVyaW5nLlxuICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7XG4gICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7IC8vIGNsb25lIHJlY3RcbiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHtcbiAgICAgIHJbMF0gPSByZWN0WzJdO1xuICAgICAgclsyXSA9IHJlY3RbMF07XG4gICAgfVxuICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkge1xuICAgICAgclsxXSA9IHJlY3RbM107XG4gICAgICByWzNdID0gcmVjdFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgcmVjdGFuZ2xlIFt4MSwgeTEsIHgyLCB5Ml0gY29ycmVzcG9uZGluZyB0byB0aGVcbiAgLy8gaW50ZXJzZWN0aW9uIG9mIHJlY3QxIGFuZCByZWN0Mi4gSWYgbm8gaW50ZXJzZWN0aW9uLCByZXR1cm5zICdmYWxzZSdcbiAgLy8gVGhlIHJlY3RhbmdsZSBjb29yZGluYXRlcyBvZiByZWN0MSwgcmVjdDIgc2hvdWxkIGJlIFt4MSwgeTEsIHgyLCB5Ml1cbiAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHtcbiAgICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9XG5cbiAgICAvLyBPcmRlciBwb2ludHMgYWxvbmcgdGhlIGF4ZXNcbiAgICBjb25zdCBvcmRlcmVkWCA9IFtyZWN0MVswXSwgcmVjdDFbMl0sIHJlY3QyWzBdLCByZWN0MlsyXV0uc29ydChjb21wYXJlKTtcbiAgICBjb25zdCBvcmRlcmVkWSA9IFtyZWN0MVsxXSwgcmVjdDFbM10sIHJlY3QyWzFdLCByZWN0MlszXV0uc29ydChjb21wYXJlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHJlY3QxID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QxKTtcbiAgICByZWN0MiA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0Mik7XG5cbiAgICAvLyBYOiBmaXJzdCBhbmQgc2Vjb25kIHBvaW50cyBiZWxvbmcgdG8gZGlmZmVyZW50IHJlY3RhbmdsZXM/XG4gICAgaWYgKFxuICAgICAgKG9yZGVyZWRYWzBdID09PSByZWN0MVswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDJbMF0pIHx8XG4gICAgICAob3JkZXJlZFhbMF0gPT09IHJlY3QyWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MVswXSlcbiAgICApIHtcbiAgICAgIC8vIEludGVyc2VjdGlvbiBtdXN0IGJlIGJldHdlZW4gc2Vjb25kIGFuZCB0aGlyZCBwb2ludHNcbiAgICAgIHJlc3VsdFswXSA9IG9yZGVyZWRYWzFdO1xuICAgICAgcmVzdWx0WzJdID0gb3JkZXJlZFhbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFk6IGZpcnN0IGFuZCBzZWNvbmQgcG9pbnRzIGJlbG9uZyB0byBkaWZmZXJlbnQgcmVjdGFuZ2xlcz9cbiAgICBpZiAoXG4gICAgICAob3JkZXJlZFlbMF0gPT09IHJlY3QxWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MlsxXSkgfHxcbiAgICAgIChvcmRlcmVkWVswXSA9PT0gcmVjdDJbMV0gJiYgb3JkZXJlZFlbMV0gPT09IHJlY3QxWzFdKVxuICAgICkge1xuICAgICAgLy8gSW50ZXJzZWN0aW9uIG11c3QgYmUgYmV0d2VlbiBzZWNvbmQgYW5kIHRoaXJkIHBvaW50c1xuICAgICAgcmVzdWx0WzFdID0gb3JkZXJlZFlbMV07XG4gICAgICByZXN1bHRbM10gPSBvcmRlcmVkWVsyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAweDJEOCwgMHgyQzcsIDB4MkM2LCAweDJEOSwgMHgyREQsIDB4MkRCLCAweDJEQSwgMHgyREMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LFxuICAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNBLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFFLCAweDIwMUMsXG4gIDB4MjAxRCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQSwgMHgyMTIyLCAweEZCMDEsIDB4RkIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCxcbiAgMHgxNzgsIDB4MTdELCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN0UsIDAsIDB4MjBBQ1xuXTtcblxuZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoc3RyKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgc3RyQnVmID0gW107XG4gIGlmIChzdHJbMF0gPT09IFwiXFx4RkVcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkZcIikge1xuICAgIC8vIFVURjE2QkUgQk9NXG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikge1xuICAgICAgc3RyQnVmLnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoKHN0ci5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEZGXCIgJiYgc3RyWzFdID09PSBcIlxceEZFXCIpIHtcbiAgICAvLyBVVEYxNkxFIEJPTVxuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHN0ckJ1Zi5wdXNoKFxuICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKChzdHIuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgfCBzdHIuY2hhckNvZGVBdChpKSlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChpKV07XG4gICAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgLy8gcmVwbGFjZSBcIihcIiwgXCIpXCIgYW5kIFwiXFxcIiBieSBcIlxcKFwiLCBcIlxcKVwiIGFuZCBcIlxcXFxcIlxuICAvLyBpbiBvcmRlciB0byB3cml0ZSBpdCBpbiBhIFBERiBmaWxlLlxuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXFwoXFwpXFxcXF0pL2csIFwiXFxcXCQxXCIpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xufVxuXG5mdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7XG4gIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbCh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJib29sZWFuXCI7XG59XG5cbmZ1bmN0aW9uIGlzTnVtKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm51bWJlclwiO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmIHYuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikge1xuICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBhcnIxLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgIHJldHVybiBlbGVtZW50ID09PSBhcnIyW2luZGV4XTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoZGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkpKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IFtcbiAgICBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSxcbiAgICAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgKGRhdGUuZ2V0VVRDRGF0ZSgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICBdO1xuXG4gIHJldHVybiBidWZmZXIuam9pbihcIlwiKTtcbn1cblxuLyoqXG4gKiBQcm9taXNlIENhcGFiaWxpdHkgb2JqZWN0LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb21pc2VDYXBhYmlsaXR5XG4gKiBAcHJvcGVydHkge1Byb21pc2U8YW55Pn0gcHJvbWlzZSAtIEEgUHJvbWlzZSBvYmplY3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNldHRsZWQgLSBJZiB0aGUgUHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQvcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZXNvbHZlIC0gRnVsZmlsbHMgdGhlIFByb21pc2UuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZWplY3QgLSBSZWplY3RzIHRoZSBQcm9taXNlLlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb21pc2UgY2FwYWJpbGl0eSBvYmplY3QuXG4gKiBAYWxpYXMgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZUNhcGFiaWxpdHl9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCkge1xuICBjb25zdCBjYXBhYmlsaXR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IGlzU2V0dGxlZCA9IGZhbHNlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYXBhYmlsaXR5LCBcInNldHRsZWRcIiwge1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBpc1NldHRsZWQ7XG4gICAgfSxcbiAgfSk7XG4gIGNhcGFiaWxpdHkucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBjYXBhYmlsaXR5LnJlc29sdmUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaXNTZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgfTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlzU2V0dGxlZCA9IHRydWU7XG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGNhcGFiaWxpdHk7XG59XG5cbmNvbnN0IGNyZWF0ZU9iamVjdFVSTCA9IChmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkxDbG9zdXJlKCkge1xuICAvLyBCbG9iL2NyZWF0ZU9iamVjdFVSTCBpcyBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gZGF0YSBzY2hlbWEuXG4gIGNvbnN0IGRpZ2l0cyA9XG4gICAgXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChkYXRhLCBjb250ZW50VHlwZSwgZm9yY2VEYXRhU2NoZW1hID0gZmFsc2UpIHtcbiAgICBpZiAoIWZvcmNlRGF0YVNjaGVtYSAmJiBVUkwuY3JlYXRlT2JqZWN0VVJMKSB7XG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2RhdGFdLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlciA9IGBkYXRhOiR7Y29udGVudFR5cGV9O2Jhc2U2NCxgO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMykge1xuICAgICAgY29uc3QgYjEgPSBkYXRhW2ldICYgMHhmZjtcbiAgICAgIGNvbnN0IGIyID0gZGF0YVtpICsgMV0gJiAweGZmO1xuICAgICAgY29uc3QgYjMgPSBkYXRhW2kgKyAyXSAmIDB4ZmY7XG4gICAgICBjb25zdCBkMSA9IGIxID4+IDIsXG4gICAgICAgIGQyID0gKChiMSAmIDMpIDw8IDQpIHwgKGIyID4+IDQpO1xuICAgICAgY29uc3QgZDMgPSBpICsgMSA8IGlpID8gKChiMiAmIDB4ZikgPDwgMikgfCAoYjMgPj4gNikgOiA2NDtcbiAgICAgIGNvbnN0IGQ0ID0gaSArIDIgPCBpaSA/IGIzICYgMHgzZiA6IDY0O1xuICAgICAgYnVmZmVyICs9IGRpZ2l0c1tkMV0gKyBkaWdpdHNbZDJdICsgZGlnaXRzW2QzXSArIGRpZ2l0c1tkNF07XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG4gIH07XG59KSgpO1xuXG5leHBvcnQge1xuICBCYXNlRXhjZXB0aW9uLFxuICBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgSURFTlRJVFlfTUFUUklYLFxuICBPUFMsXG4gIFZlcmJvc2l0eUxldmVsLFxuICBVTlNVUFBPUlRFRF9GRUFUVVJFUyxcbiAgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSxcbiAgQW5ub3RhdGlvbkZpZWxkRmxhZyxcbiAgQW5ub3RhdGlvbkZsYWcsXG4gIEFubm90YXRpb25NYXJrZWRTdGF0ZSxcbiAgQW5ub3RhdGlvblJlcGx5VHlwZSxcbiAgQW5ub3RhdGlvblJldmlld1N0YXRlLFxuICBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUsXG4gIEFubm90YXRpb25UeXBlLFxuICBGb250VHlwZSxcbiAgSW1hZ2VLaW5kLFxuICBDTWFwQ29tcHJlc3Npb25UeXBlLFxuICBBYm9ydEV4Y2VwdGlvbixcbiAgSW52YWxpZFBERkV4Y2VwdGlvbixcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbixcbiAgUGFzc3dvcmRFeGNlcHRpb24sXG4gIFBhc3N3b3JkUmVzcG9uc2VzLFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgU3RyZWFtVHlwZSxcbiAgVGV4dFJlbmRlcmluZ01vZGUsXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbiAgVW5rbm93bkVycm9yRXhjZXB0aW9uLFxuICBVdGlsLFxuICBGb3JtYXRFcnJvcixcbiAgYXJyYXlCeXRlTGVuZ3RoLFxuICBhcnJheXNUb0J5dGVzLFxuICBhc3NlcnQsXG4gIGJ5dGVzVG9TdHJpbmcsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBjcmVhdGVPYmplY3RVUkwsXG4gIGVzY2FwZVN0cmluZyxcbiAgZ2V0TW9kaWZpY2F0aW9uRGF0ZSxcbiAgZ2V0VmVyYm9zaXR5TGV2ZWwsXG4gIGluZm8sXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQXJyYXlFcXVhbCxcbiAgaXNCb29sLFxuICBpc051bSxcbiAgaXNTdHJpbmcsXG4gIGlzU2FtZU9yaWdpbixcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCxcbiAgSXNMaXR0bGVFbmRpYW5DYWNoZWQsXG4gIElzRXZhbFN1cHBvcnRlZENhY2hlZCxcbiAgcmVtb3ZlTnVsbENoYXJhY3RlcnMsXG4gIHNldFZlcmJvc2l0eUxldmVsLFxuICBzaGFkb3csXG4gIHN0cmluZzMyLFxuICBzdHJpbmdUb0J5dGVzLFxuICBzdHJpbmdUb1BERlN0cmluZyxcbiAgc3RyaW5nVG9VVEY4U3RyaW5nLFxuICB1dGY4U3RyaW5nVG9TdHJpbmcsXG4gIHdhcm4sXG4gIHVucmVhY2hhYmxlLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgaXNOb2RlSlMgfSBmcm9tIFwiLi9pc19ub2RlLmpzXCI7XG5cbi8vIFNraXAgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIG1vZGVybiBidWlsZHMgYW5kIGlmIHdlIGFscmVhZHkgcmFuIHRoZSBtb2R1bGUuXG5pZiAoXG4gICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJTS0lQX0JBQkVMXCIpKSAmJlxuICAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwidW5kZWZpbmVkXCIgfHwgIWdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQpXG4pIHtcbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgZ2xvYmFsVGhpcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEvRWRnZSwgT3BlcmFcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcInVuZGVmaW5lZFwiIHx8IGdsb2JhbFRoaXMuTWF0aCAhPT0gTWF0aCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduXG4gICAgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL2dsb2JhbC10aGlzXCIpO1xuICB9XG4gIGdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQgPSB0cnVlO1xuXG4gIGNvbnN0IGhhc0RPTSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRvY3VtZW50ID09PSBcIm9iamVjdFwiO1xuICBjb25zdCB1c2VyQWdlbnQgPVxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IFwiXCI7XG4gIGNvbnN0IGlzSUUgPSAvVHJpZGVudC8udGVzdCh1c2VyQWdlbnQpO1xuXG4gIC8vIFN1cHBvcnQ6IE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrTm9kZUJ0b2EoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuYnRvYSB8fCAhaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5idG9hID0gZnVuY3Rpb24gKGNoYXJzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShjaGFycywgXCJiaW5hcnlcIikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBOb2RlLmpzXG4gIChmdW5jdGlvbiBjaGVja05vZGVBdG9iKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLmF0b2IgfHwgIWlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuYXRvYiA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oaW5wdXQsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgQ2hpbGROb2RlLnJlbW92ZSBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLlxuICAoZnVuY3Rpb24gY2hlY2tDaGlsZE5vZGVSZW1vdmUoKSB7XG4gICAgaWYgKCFoYXNET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbW96aWxsYS9hdm9pZC1yZW1vdmVDaGlsZFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBET01Ub2tlbkxpc3QucHJvdG90eXBlLnthZGQsIHJlbW92ZX0sIHdpdGggbW9yZSB0aGFuXG4gIC8vIG9uZSBwYXJhbWV0ZXIsIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrRE9NVG9rZW5MaXN0QWRkUmVtb3ZlKCkge1xuICAgIGlmICghaGFzRE9NIHx8IGlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJ0ZXN0T25lXCIsIFwidGVzdFR3b1wiKTtcblxuICAgIGlmIChcbiAgICAgIGRpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJ0ZXN0T25lXCIpID09PSB0cnVlICYmXG4gICAgICBkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKFwidGVzdFR3b1wiKSA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBPcmlnaW5hbERPTVRva2VuTGlzdEFkZCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO1xuICAgIGNvbnN0IE9yaWdpbmFsRE9NVG9rZW5MaXN0UmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XG5cbiAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICguLi50b2tlbnMpIHtcbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIE9yaWdpbmFsRE9NVG9rZW5MaXN0QWRkLmNhbGwodGhpcywgdG9rZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoLi4udG9rZW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZS5jYWxsKHRoaXMsIHRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlLCB3aXRoIHRoZSBvcHRpb25hbFxuICAvLyBcImZvcmNlXCIgcGFyYW1ldGVyLCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpIHtcbiAgICBpZiAoIWhhc0RPTSB8fCBpc05vZGVKUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGlmIChkaXYuY2xhc3NMaXN0LnRvZ2dsZShcInRlc3RcIiwgMCkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGZvcmNlID1cbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAhIWFyZ3VtZW50c1sxXSA6ICF0aGlzLmNvbnRhaW5zKHRva2VuKTtcbiAgICAgIHJldHVybiB0aGlzW2ZvcmNlID8gXCJhZGRcIiA6IFwicmVtb3ZlXCJdKHRva2VuKSwgZm9yY2U7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciB3aW5kb3cuaGlzdG9yeS57cHVzaFN0YXRlLCByZXBsYWNlU3RhdGV9LCB3aXRoIHRoZVxuICAvLyBgdXJsYCBwYXJhbWV0ZXIgc2V0IHRvIGB1bmRlZmluZWRgLCB3aXRob3V0IGJyZWFraW5nIHRoZSBkb2N1bWVudCBVUkwuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1dpbmRvd0hpc3RvcnlQdXNoU3RhdGVSZXBsYWNlU3RhdGUoKSB7XG4gICAgaWYgKCFoYXNET00gfHwgIWlzSUUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgT3JpZ2luYWxQdXNoU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7XG4gICAgY29uc3QgT3JpZ2luYWxSZXBsYWNlU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG5cbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSB1cmwgPT09IHVuZGVmaW5lZCA/IFtzdGF0ZSwgdGl0bGVdIDogW3N0YXRlLCB0aXRsZSwgdXJsXTtcbiAgICAgIE9yaWdpbmFsUHVzaFN0YXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7XG4gICAgICBjb25zdCBhcmdzID0gdXJsID09PSB1bmRlZmluZWQgPyBbc3RhdGUsIHRpdGxlXSA6IFtzdGF0ZSwgdGl0bGUsIHVybF07XG4gICAgICBPcmlnaW5hbFJlcGxhY2VTdGF0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NDFcbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nU3RhcnRzV2l0aCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9zdGFydHMtd2l0aC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw0MVxuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdFbmRzV2l0aCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvZW5kcy13aXRoLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQxXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0luY2x1ZGVzKCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9pbmNsdWRlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQ3XG4gIChmdW5jdGlvbiBjaGVja0FycmF5SW5jbHVkZXMoKSB7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9hcnJheS9pbmNsdWRlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBBcnJheS5mcm9tIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlGcm9tKCkge1xuICAgIGlmIChBcnJheS5mcm9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL2FycmF5L2Zyb20uanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LmFzc2lnbiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja09iamVjdEFzc2lnbigpIHtcbiAgICBpZiAoT2JqZWN0LmFzc2lnbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5mcm9tRW50cmllcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NzNcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0RnJvbUVudHJpZXMoKSB7XG4gICAgaWYgKE9iamVjdC5mcm9tRW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvZnJvbS1lbnRyaWVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE1hdGgubG9nMiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8MzhcbiAgKGZ1bmN0aW9uIGNoZWNrTWF0aExvZzIoKSB7XG4gICAgaWYgKE1hdGgubG9nMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBNYXRoLmxvZzIgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9tYXRoL2xvZzIuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgTnVtYmVyLmlzTmFOIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUuXG4gIChmdW5jdGlvbiBjaGVja051bWJlcklzTmFOKCkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTnVtYmVyLmlzTmFOID0gcmVxdWlyZShcImNvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBOdW1iZXIuaXNJbnRlZ2VyIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTwzNFxuICAoZnVuY3Rpb24gY2hlY2tOdW1iZXJJc0ludGVnZXIoKSB7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTnVtYmVyLmlzSW50ZWdlciA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFR5cGVkQXJyYXkucHJvdG90eXBlLnNsaWNlIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrVHlwZWRBcnJheVNsaWNlKCkge1xuICAgIGlmIChVaW50OEFycmF5LnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy90eXBlZC1hcnJheS9zbGljZVwiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRSwgU2FmYXJpPDExLCBDaHJvbWU8NjNcbiAgKGZ1bmN0aW9uIGNoZWNrUHJvbWlzZSgpIHtcbiAgICBpZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgYXJlIHN5bmNocm9ub3VzLCBoZW5jZSBgUHJvbWlzZWAgc2hvdWxkbid0XG4gICAgICAvLyBuZWVkIHRvIGJlIHBvbHlmaWxsZWQgZm9yIHRoZSBJTUFHRV9ERUNPREVSUyBidWlsZCB0YXJnZXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChnbG9iYWxUaGlzLlByb21pc2UgJiYgZ2xvYmFsVGhpcy5Qcm9taXNlLmFsbFNldHRsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5Qcm9taXNlID0gcmVxdWlyZShcImNvcmUtanMvZXMvcHJvbWlzZS9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tVUkwoKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIlBST0RVQ1RJT05cIikpIHtcbiAgICAgIC8vIFByZXZlbnQgXCJyZXF1aXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIgZXJyb3JzIGluIGRldmVsb3BtZW50IG1vZGUsXG4gICAgICAvLyBzaW5jZSB0aGUgYFVSTGAgY29uc3RydWN0b3Igc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBtb2Rlcm4gYnJvd2Vycy5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCFQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkge1xuICAgICAgLy8gVGhlIGBVUkxgIGNvbnN0cnVjdG9yIGlzIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlIGluIHRoZSBleHRlbnNpb25cbiAgICAgIC8vIGJ1aWxkcy5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgZG9uJ3QgdXNlIHRoZSBgVVJMYCBjb25zdHJ1Y3Rvciwgc28gaXRcbiAgICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSBwb2x5ZmlsbGVkIGZvciB0aGUgSU1BR0VfREVDT0RFUlMgYnVpbGQgdGFyZ2V0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLlVSTCA9IHJlcXVpcmUoXCJjb3JlLWpzL3dlYi91cmwuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUUsIE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrUmVhZGFibGVTdHJlYW0oKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiSU1BR0VfREVDT0RFUlNcIikpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IGltYWdlIGRlY29kZXJzIGFyZSBzeW5jaHJvbm91cywgaGVuY2UgYFJlYWRhYmxlU3RyZWFtYFxuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gYmUgcG9seWZpbGxlZCBmb3IgdGhlIElNQUdFX0RFQ09ERVJTIGJ1aWxkIHRhcmdldC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIC8vIE1TIEVkZ2UgbWF5IHNheSBpdCBoYXMgUmVhZGFibGVTdHJlYW0gYnV0IHRoZXkgYXJlIG5vdCB1cCB0byBzcGVjIHlldC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICAgICAgbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUaGUgUmVhZGFibGVTdHJlYW0gY29uc3RydWN0b3IgY2Fubm90IGJlIHVzZWQuXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKFwid2ViLXN0cmVhbXMtcG9seWZpbGwvZGlzdC9wb255ZmlsbC5qc1wiKS5SZWFkYWJsZVN0cmVhbTtcbiAgfSkoKTtcblxuICAvLyBXZSB3YW50IHRvIHN1cHBvcnQgTWFwIGl0ZXJhdGlvbiwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSBwb3NzaWJsZSB0byBlYXNpbHlcbiAgLy8gdGVzdCBmb3IgdGhhdCBzcGVjaWZpY2FsbHk7IGhlbmNlIHVzaW5nIGEgc2ltaWxhcmx5IHVuc3VwcG9ydGVkIHByb3BlcnR5LlxuICAvLyBTdXBwb3J0OiBJRTExXG4gIChmdW5jdGlvbiBjaGVja01hcEVudHJpZXMoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuTWFwICYmIGdsb2JhbFRoaXMuTWFwLnByb3RvdHlwZS5lbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuTWFwID0gcmVxdWlyZShcImNvcmUtanMvZXMvbWFwL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFdlIHdhbnQgdG8gc3VwcG9ydCBTZXQgaXRlcmF0aW9uLCBidXQgaXQgZG9lc24ndCBzZWVtIHBvc3NpYmxlIHRvIGVhc2lseVxuICAvLyB0ZXN0IGZvciB0aGF0IHNwZWNpZmljYWxseTsgaGVuY2UgdXNpbmcgYSBzaW1pbGFybHkgdW5zdXBwb3J0ZWQgcHJvcGVydHkuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrU2V0RW50cmllcygpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5TZXQgJiYgZ2xvYmFsVGhpcy5TZXQucHJvdG90eXBlLmVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5TZXQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9zZXQvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUU8MTEsIFNhZmFyaTw4LCBDaHJvbWU8MzZcbiAgKGZ1bmN0aW9uIGNoZWNrV2Vha01hcCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuV2Vha01hcCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3dlYWstbWFwL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrV2Vha1NldCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrU2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuV2Vha1NldCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3dlYWstc2V0L2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5jb2RlUG9pbnRBdCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEuXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0NvZGVQb2ludEF0KCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9jb2RlLXBvaW50LWF0LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5mcm9tQ29kZVBvaW50IGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUxMS5cbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nRnJvbUNvZGVQb2ludCgpIHtcbiAgICBpZiAoU3RyaW5nLmZyb21Db2RlUG9pbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgU3RyaW5nLmZyb21Db2RlUG9pbnQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvZnJvbS1jb2RlLXBvaW50LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1N5bWJvbCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5TeW1ib2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3ltYm9sL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU3XG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1BhZFN0YXJ0KCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9wYWQtc3RhcnQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU3XG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1BhZEVuZCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL3BhZC1lbmQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LnZhbHVlcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NTRcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0VmFsdWVzKCkge1xuICAgIGlmIChPYmplY3QudmFsdWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXMgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvdmFsdWVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5lbnRyaWVzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw1NFxuICAoZnVuY3Rpb24gY2hlY2tPYmplY3RFbnRyaWVzKCkge1xuICAgIGlmIChPYmplY3QuZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzXCIpO1xuICB9KSgpO1xufVxuIiwiLyogQ29weXJpZ2h0IDIwMTggTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWxzIHByb2Nlc3MgKi9cblxuLy8gTlcuanMgLyBFbGVjdHJvbiBpcyBhIGJyb3dzZXIgY29udGV4dCwgYnV0IGNvcGllcyBzb21lIE5vZGUuanMgb2JqZWN0czsgc2VlXG4vLyBodHRwOi8vZG9jcy5ud2pzLmlvL2VuL2xhdGVzdC9Gb3IlMjBVc2Vycy9BZHZhbmNlZC9KYXZhU2NyaXB0JTIwQ29udGV4dHMlMjBpbiUyME5XLmpzLyNhY2Nlc3Mtbm9kZWpzLWFuZC1ud2pzLWFwaS1pbi1icm93c2VyLWNvbnRleHRcbi8vIGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvYXBpL3Byb2Nlc3MjcHJvY2Vzc3ZlcnNpb25zZWxlY3Ryb24tcmVhZG9ubHlcbi8vIGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvYXBpL3Byb2Nlc3MjcHJvY2Vzc3R5cGUtcmVhZG9ubHlcbmNvbnN0IGlzTm9kZUpTID1cbiAgdHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiZcbiAgcHJvY2VzcyArIFwiXCIgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiICYmXG4gICFwcm9jZXNzLnZlcnNpb25zLm53ICYmXG4gICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSBcImJyb3dzZXJcIik7XG5cbmV4cG9ydCB7IGlzTm9kZUpTIH07XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmdsb2JhbC10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG4vLyBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1nbG9iYWxcbiQoeyBnbG9iYWw6IHRydWUgfSwge1xuICBnbG9iYWxUaGlzOiBnbG9iYWxcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gKGdsb2JhbFtUQVJHRVRdIHx8IHt9KS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXRcbiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCJ2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fFxuICBjaGVjayh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pWzFdICE9IDc7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsIi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIFBSRUZFUlJFRF9TVFJJTkcpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGlucHV0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcblxudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgVEVNUExBVEUgPSBTdHJpbmcoU3RyaW5nKS5zcGxpdCgnU3RyaW5nJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIGtleSk7XG4gICAgZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpLnNvdXJjZSA9IFRFTVBMQVRFLmpvaW4odHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/IGtleSA6ICcnKTtcbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsLCBrZXksIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmc7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAodHlwZW9mIHN0b3JlLmluc3BlY3RTb3VyY2UgIT0gJ2Z1bmN0aW9uJykge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgc2V0R2xvYmFsKFNIQVJFRCwge30pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlO1xuIiwidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVApIHtcbiAgdmFyIHN0b3JlID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIHdtZ2V0ID0gc3RvcmUuZ2V0O1xuICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7XG4gIHZhciB3bXNldCA9IHN0b3JlLnNldDtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSwgaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21oYXMuY2FsbChzdG9yZSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoaW5zcGVjdFNvdXJjZShXZWFrTWFwKSk7XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy42LjUnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMjAgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJyArIFN0cmluZyhrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyAoKytpZCArIHBvc3RmaXgpLnRvU3RyaW5nKDM2KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwidmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlID09ICdmdW5jdGlvbicgPyB2YXJpYWJsZSA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSlcbiAgICA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyKGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcbiIsIi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3N0YXJ0c1dpdGgnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIG5hdGl2ZVN0YXJ0c1dpdGggPSAnJy5zdGFydHNXaXRoO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnN0YXJ0c3dpdGhcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgaW5kZXggPSB0b0xlbmd0aChtaW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwidmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNSZWdFeHAoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zXCIpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbi8vIGBJc1JlZ0V4cGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc3JlZ2V4cFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXMoV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgZWxzZSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwidmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0xcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICYmICFTeW1ib2wuc2hhbVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICB2YXIgcmVnZXhwID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChmKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SLCBNRVRIT0QsIGxlbmd0aCkge1xuICByZXR1cm4gYmluZChjYWxsLCBnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdLCBsZW5ndGgpO1xufTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aCcpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAnZW5kc1dpdGgnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIG5hdGl2ZUVuZHNXaXRoID0gJycuZW5kc1dpdGg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdlbmRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7XG59KCk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZW5kc3dpdGhcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwge1xuICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7XG4gICAgdmFyIHRoYXQgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgbm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpO1xuICAgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0aGF0Lmxlbmd0aCk7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBtaW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gbmF0aXZlRW5kc1dpdGhcbiAgICAgID8gbmF0aXZlRW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFjb3JyZWN0SXNSZWdFeHBMb2dpYygnaW5jbHVkZXMnKSB9LCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICByZXR1cm4gISF+U3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpXG4gICAgICAuaW5kZXhPZihub3RBUmVnRXhwKHNlYXJjaFN0cmluZyksIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzJyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ0FycmF5JywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmNsdWRlcztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aCcpO1xuXG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnaW5kZXhPZicsIHsgQUNDRVNTT1JTOiB0cnVlLCAxOiAwIH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVVTRVNfVE9fTEVOR1RIIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdpbmNsdWRlcycpO1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmlmIChBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSB7XG4gIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoQXJyYXlQcm90b3R5cGUsIFVOU0NPUEFCTEVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBjcmVhdGUobnVsbClcbiAgfSk7XG59XG5cbi8vIGFkZCBhIGtleSB0byBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xuXG52YXIgR1QgPSAnPic7XG52YXIgTFQgPSAnPCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgU0NSSVBUID0gJ3NjcmlwdCc7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBFbXB0eUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG52YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIExUICsgU0NSSVBUICsgR1QgKyBjb250ZW50ICsgTFQgKyAnLycgKyBTQ1JJUFQgKyBHVDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBBY3RpdmVYIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHtcbiAgYWN0aXZlWERvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnJykpO1xuICBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTtcbiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDtcbiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDsgLy8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgcmV0dXJuIHRlbXA7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzVcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7XG59O1xuXG4vLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0XG4vLyBObyBuZWVkIHRvIHVzZSBhY3RpdmUgeCBhcHByb2FjaCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyBub3Qgc2V0XG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2XG4vLyBhdm9pZCBJRSBHQyBidWdcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8qIGdsb2JhbCBBY3RpdmVYT2JqZWN0ICovXG4gICAgYWN0aXZlWERvY3VtZW50ID0gZG9jdW1lbnQuZG9tYWluICYmIG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfVxuICBOdWxsUHJvdG9PYmplY3QgPSBhY3RpdmVYRG9jdW1lbnQgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKTtcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3Qua2V5c1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNhY2hlID0ge307XG5cbnZhciB0aHJvd2VyID0gZnVuY3Rpb24gKGl0KSB7IHRocm93IGl0OyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgb3B0aW9ucykge1xuICBpZiAoaGFzKGNhY2hlLCBNRVRIT0RfTkFNRSkpIHJldHVybiBjYWNoZVtNRVRIT0RfTkFNRV07XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdO1xuICB2YXIgQUNDRVNTT1JTID0gaGFzKG9wdGlvbnMsICdBQ0NFU1NPUlMnKSA/IG9wdGlvbnMuQUNDRVNTT1JTIDogZmFsc2U7XG4gIHZhciBhcmd1bWVudDAgPSBoYXMob3B0aW9ucywgMCkgPyBvcHRpb25zWzBdIDogdGhyb3dlcjtcbiAgdmFyIGFyZ3VtZW50MSA9IGhhcyhvcHRpb25zLCAxKSA/IG9wdGlvbnNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXSA9ICEhbWV0aG9kICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKEFDQ0VTU09SUyAmJiAhREVTQ1JJUFRPUlMpIHJldHVybiB0cnVlO1xuICAgIHZhciBPID0geyBsZW5ndGg6IC0xIH07XG5cbiAgICBpZiAoQUNDRVNTT1JTKSBkZWZpbmVQcm9wZXJ0eShPLCAxLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogdGhyb3dlciB9KTtcbiAgICBlbHNlIE9bMV0gPSAxO1xuXG4gICAgbWV0aG9kLmNhbGwoTywgYXJndW1lbnQwLCBhcmd1bWVudDEpO1xuICB9KTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mcm9tJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoYXJBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlJykuY2hhckF0O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIFNUUklOR19JVEVSQVRPUiA9ICdTdHJpbmcgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogU3RyaW5nKGl0ZXJhdGVkKSxcbiAgICBpbmRleDogMFxuICB9KTtcbi8vIGAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgY29kZVBvaW50QXQsIGF0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7XG4gICAgdmFyIFMgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBzaXplID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBmaXJzdCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbik7XG4gICAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgICAgfHwgKHNlY29uZCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklORyA/IFMuY2hhckF0KHBvc2l0aW9uKSA6IGZpcnN0XG4gICAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgICB9XG4gIH1cblxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZBVUxUID09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlO1xuICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5hdGl2ZUl0ZXJhdG9yLmNhbGwodGhpcyk7IH07XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxuaWYgKEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbmlmICghSVNfUFVSRSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIHtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7XG59O1xuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICBhbk9iamVjdChPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyLmNhbGwoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpICYmIGl0ICE9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKGl0KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQsIHZhbHVlO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gICAgcmVzdWx0ID0gbmV3IEMoKTtcbiAgICBmb3IgKDshKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwge1xuICBhc3NpZ246IGFzc2lnblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xuXG52YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhbmF0aXZlQXNzaWduIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZylcbiAgaWYgKERFU0NSSVBUT1JTICYmIG5hdGl2ZUFzc2lnbih7IGI6IDEgfSwgbmF0aXZlQXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbiAgd2hpbGUgKGFyZ3VtZW50c0xlbmd0aCA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBvYmplY3RLZXlzKFMpLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6IG5hdGl2ZUFzc2lnbjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmZyb20tZW50cmllcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmZyb21FbnRyaWVzO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4vLyBgT2JqZWN0LmZyb21FbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1mcm9tLWVudHJpZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZnJvbUVudHJpZXM6IGZ1bmN0aW9uIGZyb21FbnRyaWVzKGl0ZXJhYmxlKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShvYmosIGssIHYpO1xuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgaXRlcmF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgQVNfRU5UUklFUywgSVNfSVRFUkFUT1IpIHtcbiAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGZuLCB0aGF0LCBBU19FTlRSSUVTID8gMiA6IDEpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gQVNfRU5UUklFU1xuICAgICAgICAgID8gYm91bmRGdW5jdGlvbihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSlcbiAgICAgICAgICA6IGJvdW5kRnVuY3Rpb24oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7XG4gIH1cblxuICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHtcbiAgICByZXN1bHQgPSBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBib3VuZEZ1bmN0aW9uLCBzdGVwLnZhbHVlLCBBU19FTlRSSUVTKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG5cbml0ZXJhdGUuc3RvcCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgcmVzdWx0KTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hdGgubG9nMicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTWF0aC5sb2cyO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxuLy8gYE1hdGgubG9nMmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmxvZzJcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCkge1xuICAgIHJldHVybiBsb2coeCkgLyBMTjI7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNOYU47XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE51bWJlci5pc05hTmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNuYW5cbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVnZXInKTtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlclxuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwge1xuICBpc0ludGVnZXI6IGlzSW50ZWdlclxufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBOdW1iZXIuaXNJbnRlZ2VyYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KSB7XG4gIHJldHVybiAhaXNPYmplY3QoaXQpICYmIGlzRmluaXRlKGl0KSAmJiBmbG9vcihpdCkgPT09IGl0O1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc2xpY2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyICRzbGljZSA9IFtdLnNsaWNlO1xuXG52YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgbmV3IEludDhBcnJheSgxKS5zbGljZSgpO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2xpY2VcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICB2YXIgbGlzdCA9ICRzbGljZS5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCBzdGFydCwgZW5kKTtcbiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0sIEZPUkNFRCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXItbmF0aXZlJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlO1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5O1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlO1xudmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTtcbnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBpc1Byb3RvdHlwZU9mID0gT2JqZWN0UHJvdG90eXBlLmlzUHJvdG90eXBlT2Y7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIFRZUEVEX0FSUkFZX1RBRyA9IHVpZCgnVFlQRURfQVJSQVlfVEFHJyk7XG4vLyBGaXhpbmcgbmF0aXZlIHR5cGVkIGFycmF5cyBpbiBPcGVyYSBQcmVzdG8gY3Jhc2hlcyB0aGUgYnJvd3Nlciwgc2VlICM1OTVcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJztcbnZhciBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCA9IGZhbHNlO1xudmFyIE5BTUU7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCA9IHtcbiAgSW50OEFycmF5OiAxLFxuICBVaW50OEFycmF5OiAxLFxuICBVaW50OENsYW1wZWRBcnJheTogMSxcbiAgSW50MTZBcnJheTogMixcbiAgVWludDE2QXJyYXk6IDIsXG4gIEludDMyQXJyYXk6IDQsXG4gIFVpbnQzMkFycmF5OiA0LFxuICBGbG9hdDMyQXJyYXk6IDQsXG4gIEZsb2F0NjRBcnJheTogOFxufTtcblxudmFyIGlzVmlldyA9IGZ1bmN0aW9uIGlzVmlldyhpdCkge1xuICB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTtcbiAgcmV0dXJuIGtsYXNzID09PSAnRGF0YVZpZXcnIHx8IGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpO1xufTtcblxudmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwgY2xhc3NvZihpdCkpO1xufTtcblxudmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1R5cGVkQXJyYXkoaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7XG59O1xuXG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIGlmIChpc1Byb3RvdHlwZU9mLmNhbGwoVHlwZWRBcnJheSwgQykpIHJldHVybiBDO1xuICB9IGVsc2UgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIGlmIChoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIE5BTUUpKSB7XG4gICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07XG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiAoQyA9PT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yIHx8IGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5Q29uc3RydWN0b3IsIEMpKSkge1xuICAgICAgcmV0dXJuIEM7XG4gICAgfVxuICB9IHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yJyk7XG59O1xuXG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQpIHtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoZm9yY2VkKSBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHtcbiAgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlW0tFWV07XG4gICAgfVxuICB9XG4gIGlmICghVHlwZWRBcnJheVByb3RvdHlwZVtLRVldIHx8IGZvcmNlZCkge1xuICAgIHJlZGVmaW5lKFR5cGVkQXJyYXlQcm90b3R5cGUsIEtFWSwgZm9yY2VkID8gcHJvcGVydHlcbiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSk7XG4gIH1cbn07XG5cbnZhciBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCkge1xuICB2YXIgQVJSQVksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICBpZiAoZm9yY2VkKSBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVkpKSB7XG4gICAgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFUeXBlZEFycmF5W0tFWV0gfHwgZm9yY2VkKSB7XG4gICAgICAvLyBWOCB+IENocm9tZSA0OS01MCBgJVR5cGVkQXJyYXklYCBtZXRob2RzIGFyZSBub24td3JpdGFibGUgbm9uLWNvbmZpZ3VyYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlZGVmaW5lKFR5cGVkQXJyYXksIEtFWSwgZm9yY2VkID8gcHJvcGVydHkgOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIEludDhBcnJheVtLRVldIHx8IHByb3BlcnR5KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICB9IGVsc2UgcmV0dXJuO1xuICB9XG4gIGZvciAoQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgKCFUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXSB8fCBmb3JjZWQpKSB7XG4gICAgICByZWRlZmluZShUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfVxufTtcblxuZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIGlmICghZ2xvYmFsW05BTUVdKSBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gZmFsc2U7XG59XG5cbi8vIFdlYktpdCBidWcgLSB0eXBlZCBhcnJheXMgY29uc3RydWN0b3JzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgdHlwZW9mIFR5cGVkQXJyYXkgIT0gJ2Z1bmN0aW9uJyB8fCBUeXBlZEFycmF5ID09PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBUeXBlZEFycmF5ID0gZnVuY3Rpb24gVHlwZWRBcnJheSgpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG4gIH07XG4gIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBpZiAoZ2xvYmFsW05BTUVdKSBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0sIFR5cGVkQXJyYXkpO1xuICB9XG59XG5cbmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhVHlwZWRBcnJheVByb3RvdHlwZSB8fCBUeXBlZEFycmF5UHJvdG90eXBlID09PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkucHJvdG90eXBlO1xuICBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgaWYgKGdsb2JhbFtOQU1FXSkgc2V0UHJvdG90eXBlT2YoZ2xvYmFsW05BTUVdLnByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG4gIH1cbn1cblxuLy8gV2ViS2l0IGJ1ZyAtIG9uZSBtb3JlIG9iamVjdCBpbiBVaW50OENsYW1wZWRBcnJheSBwcm90b3R5cGUgY2hhaW5cbmlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlKSAhPT0gVHlwZWRBcnJheVByb3RvdHlwZSkge1xuICBzZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG59XG5cbmlmIChERVNDUklQVE9SUyAmJiAhaGFzKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gdHJ1ZTtcbiAgZGVmaW5lUHJvcGVydHkoVHlwZWRBcnJheVByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgeyBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodGhpcykgPyB0aGlzW1RZUEVEX0FSUkFZX1RBR10gOiB1bmRlZmluZWQ7XG4gIH0gfSk7XG4gIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgaWYgKGdsb2JhbFtOQU1FXSkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWxbTkFNRV0sIFRZUEVEX0FSUkFZX1RBRywgTkFNRSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MsXG4gIFRZUEVEX0FSUkFZX1RBRzogVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQgJiYgVFlQRURfQVJSQVlfVEFHLFxuICBhVHlwZWRBcnJheTogYVR5cGVkQXJyYXksXG4gIGFUeXBlZEFycmF5Q29uc3RydWN0b3I6IGFUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gIGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlNZXRob2QsXG4gIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QsXG4gIGlzVmlldzogaXNWaWV3LFxuICBpc1R5cGVkQXJyYXk6IGlzVHlwZWRBcnJheSxcbiAgVHlwZWRBcnJheTogVHlwZWRBcnJheSxcbiAgVHlwZWRBcnJheVByb3RvdHlwZTogVHlwZWRBcnJheVByb3RvdHlwZVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5Qcm9taXNlO1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xuaWYgKCFUT19TVFJJTkdfVEFHX1NVUFBPUlQpIHtcbiAgcmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgdG9TdHJpbmcsIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyB7fS50b1N0cmluZyA6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTtcbiAgdmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gPSBBcnJheVZhbHVlcztcbiAgICB9XG4gICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgQ09MTEVDVElPTl9OQU1FKTtcbiAgICB9XG4gICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykge1xuICAgICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkgdHJ5IHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIE1FVEhPRF9OQU1FLCBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gPSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2U7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG52YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47XG5cbnZhciBGT1JDRUQgPSBpc0ZvcmNlZChQUk9NSVNFLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gaW5zcGVjdFNvdXJjZShQcm9taXNlQ29uc3RydWN0b3IpICE9PSBTdHJpbmcoUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFKSB7XG4gICAgLy8gVjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgaWYgKFY4X1ZFUlNJT04gPT09IDY2KSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBVbmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgaWYgKCFJU19OT0RFICYmIHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgIT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gV2UgbmVlZCBQcm9taXNlI2ZpbmFsbHkgaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICFQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlWydmaW5hbGx5J10pIHJldHVybiB0cnVlO1xuICAvLyBXZSBjYW4ndCB1c2UgQEBzcGVjaWVzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoVjhfVkVSU0lPTiA+PSA1MSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoUHJvbWlzZUNvbnN0cnVjdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBEZXRlY3QgY29ycmVjdG5lc3Mgb2Ygc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpO1xuICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICB9O1xuICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gIHJldHVybiAhKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2UpO1xufSk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIFByb21pc2VDb25zdHJ1Y3Rvci5hbGwoaXRlcmFibGUpWydjYXRjaCddKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9ucztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PSBGVUxGSUxMRUQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gY2hhaW5baW5kZXgrK107XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGF0ZS5yZWFjdGlvbnMgPSBbXTtcbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChwcm9taXNlLCBzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBwcm9taXNlLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkocHJvbWlzZSwgc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpO1xuICAgIGlmICh0aGVuKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHByb21pc2UsIHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRUQpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHRoaXMsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgdGhpcywgc3RhdGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaW50ZXJuYWxSZWplY3QodGhpcywgc3RhdGUsIGVycm9yKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IFtdLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7XG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLnRoZW5gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gSVNfTk9ERSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkodGhpcywgc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHN0YXRlKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicpIHtcbiAgICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcblxuICAgIC8vIHdyYXAgbmF0aXZlIFByb21pc2UjdGhlbiBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2UucHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgbmF0aXZlVGhlbi5jYWxsKHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG5cbiAgICAvLyB3cmFwIGZldGNoIHJlc3VsdFxuICAgIGlmICh0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicpICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKFByb21pc2VDb25zdHJ1Y3RvciwgJGZldGNoLmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlamVjdFxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZXNvbHZlXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShJU19QVVJFICYmIHRoaXMgPT09IFByb21pc2VXcmFwcGVyID8gUHJvbWlzZUNvbnN0cnVjdG9yIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICAvLyBgUHJvbWlzZS5hbGxgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlO1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgJyArIChuYW1lID8gbmFtZSArICcgJyA6ICcnKSArICdpbnZvY2F0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcblxudmFyIGxvY2F0aW9uID0gZ2xvYmFsLmxvY2F0aW9uO1xudmFyIHNldCA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbnZhciBydW4gPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcblxudmFyIHJ1bm5lciA9IGZ1bmN0aW9uIChpZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJ1bihpZCk7XG4gIH07XG59O1xuXG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIHBvc3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTtcbn07XG5cbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0IHx8ICFjbGVhcikge1xuICBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjRcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCAmJiAhSVNfSU9TKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJlxuICAgIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmXG4gICAgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmXG4gICAgIWZhaWxzKHBvc3QpICYmXG4gICAgbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOidcbiAgKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gLyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCduYXZpZ2F0b3InLCAndXNlckFnZW50JykgfHwgJyc7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcblxudmFyIE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIElTX05PREUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbi8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2BcbnZhciBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAncXVldWVNaWNyb3Rhc2snKTtcbnZhciBxdWV1ZU1pY3JvdGFzayA9IHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciAmJiBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IudmFsdWU7XG5cbnZhciBmbHVzaCwgaGVhZCwgbGFzdCwgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47XG5cbi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kXG5pZiAoIXF1ZXVlTWljcm90YXNrKSB7XG4gIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChJU19OT0RFICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE11dGF0aW9uT2JzZXJ2ZXIgJiYgIUlTX0lPUykge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgdGhlbiA9IHByb21pc2UudGhlbjtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuLmNhbGwocHJvbWlzZSwgZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7XG4gIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgaWYgKCFoZWFkKSB7XG4gICAgaGVhZCA9IHRhc2s7XG4gICAgbm90aWZ5KCk7XG4gIH0gbGFzdCA9IHRhc2s7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcblxuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdmFyIGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZTtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikge1xuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7XG52YXIgbWF0Y2gsIHZlcnNpb247XG5cbmlmICh2OCkge1xuICBtYXRjaCA9IHY4LnNwbGl0KCcuJyk7XG4gIHZlcnNpb24gPSBtYXRjaFswXSArIG1hdGNoWzFdO1xufSBlbHNlIGlmICh1c2VyQWdlbnQpIHtcbiAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkge1xuICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSBtYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb24gJiYgK3ZlcnNpb247XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFByb21pc2UuYWxsU2V0dGxlZGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWFsbFNldHRsZWRcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxuLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5XG52YXIgTk9OX0dFTkVSSUMgPSAhIU5hdGl2ZVByb21pc2UgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICBOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IE5PTl9HRU5FUklDIH0sIHtcbiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHksXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5XG4gICAgKTtcbiAgfVxufSk7XG5cbi8vIHBhdGNoIG5hdGl2ZSBQcm9taXNlLnByb3RvdHlwZSBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHtcbiAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICdmaW5hbGx5JywgZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddKTtcbn1cbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIudXJsLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5VUkw7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YFxucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgVVNFX05BVElWRV9VUkwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXVybCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xudmFyIGFycmF5RnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY29kZUF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jb2RlQXQ7XG52YXIgdG9BU0NJSSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWknKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IHJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgTmF0aXZlVVJMID0gZ2xvYmFsLlVSTDtcbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zO1xudmFyIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuZ2V0U3RhdGU7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsVVJMU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignVVJMJyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHBvdyA9IE1hdGgucG93O1xuXG52YXIgSU5WQUxJRF9BVVRIT1JJVFkgPSAnSW52YWxpZCBhdXRob3JpdHknO1xudmFyIElOVkFMSURfU0NIRU1FID0gJ0ludmFsaWQgc2NoZW1lJztcbnZhciBJTlZBTElEX0hPU1QgPSAnSW52YWxpZCBob3N0JztcbnZhciBJTlZBTElEX1BPUlQgPSAnSW52YWxpZCBwb3J0JztcblxudmFyIEFMUEhBID0gL1tBLVphLXpdLztcbnZhciBBTFBIQU5VTUVSSUMgPSAvW1xcZCstLkEtWmEtel0vO1xudmFyIERJR0lUID0gL1xcZC87XG52YXIgSEVYX1NUQVJUID0gL14oMHh8MFgpLztcbnZhciBPQ1QgPSAvXlswLTddKyQvO1xudmFyIERFQyA9IC9eXFxkKyQvO1xudmFyIEhFWCA9IC9eW1xcZEEtRmEtZl0rJC87XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQgPSAvW1xcdTAwMDBcXHUwMDA5XFx1MDAwQVxcdTAwMEQgIyUvOj9AW1xcXFxdXS87XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQgPSAvW1xcdTAwMDBcXHUwMDA5XFx1MDAwQVxcdTAwMEQgIy86P0BbXFxcXF1dLztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG52YXIgTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdK3xbXFx1MDAwMC1cXHUwMDFGIF0rJC9nO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbnZhciBUQUJfQU5EX05FV19MSU5FID0gL1tcXHUwMDA5XFx1MDAwQVxcdTAwMERdL2c7XG52YXIgRU9GO1xuXG52YXIgcGFyc2VIb3N0ID0gZnVuY3Rpb24gKHVybCwgaW5wdXQpIHtcbiAgdmFyIHJlc3VsdCwgY29kZVBvaW50cywgaW5kZXg7XG4gIGlmIChpbnB1dC5jaGFyQXQoMCkgPT0gJ1snKSB7XG4gICAgaWYgKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAxKSAhPSAnXScpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgcmVzdWx0ID0gcGFyc2VJUHY2KGlucHV0LnNsaWNlKDEsIC0xKSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIC8vIG9wYXF1ZSBob3N0XG4gIH0gZWxzZSBpZiAoIWlzU3BlY2lhbCh1cmwpKSB7XG4gICAgaWYgKEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQudGVzdChpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgcmVzdWx0ID0gJyc7XG4gICAgY29kZVBvaW50cyA9IGFycmF5RnJvbShpbnB1dCk7XG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29kZVBvaW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHJlc3VsdCArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaW5kZXhdLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTtcbiAgICB9XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgaW5wdXQgPSB0b0FTQ0lJKGlucHV0KTtcbiAgICBpZiAoRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVC50ZXN0KGlucHV0KSkgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICByZXN1bHQgPSBwYXJzZUlQdjQoaW5wdXQpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBwYXJzZUlQdjQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJy4nKTtcbiAgdmFyIHBhcnRzTGVuZ3RoLCBudW1iZXJzLCBpbmRleCwgcGFydCwgcmFkaXgsIG51bWJlciwgaXB2NDtcbiAgaWYgKHBhcnRzLmxlbmd0aCAmJiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PSAnJykge1xuICAgIHBhcnRzLnBvcCgpO1xuICB9XG4gIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoO1xuICBpZiAocGFydHNMZW5ndGggPiA0KSByZXR1cm4gaW5wdXQ7XG4gIG51bWJlcnMgPSBbXTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGFydHNMZW5ndGg7IGluZGV4KyspIHtcbiAgICBwYXJ0ID0gcGFydHNbaW5kZXhdO1xuICAgIGlmIChwYXJ0ID09ICcnKSByZXR1cm4gaW5wdXQ7XG4gICAgcmFkaXggPSAxMDtcbiAgICBpZiAocGFydC5sZW5ndGggPiAxICYmIHBhcnQuY2hhckF0KDApID09ICcwJykge1xuICAgICAgcmFkaXggPSBIRVhfU1RBUlQudGVzdChwYXJ0KSA/IDE2IDogODtcbiAgICAgIHBhcnQgPSBwYXJ0LnNsaWNlKHJhZGl4ID09IDggPyAxIDogMik7XG4gICAgfVxuICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgbnVtYmVyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEocmFkaXggPT0gMTAgPyBERUMgOiByYWRpeCA9PSA4ID8gT0NUIDogSEVYKS50ZXN0KHBhcnQpKSByZXR1cm4gaW5wdXQ7XG4gICAgICBudW1iZXIgPSBwYXJzZUludChwYXJ0LCByYWRpeCk7XG4gICAgfVxuICAgIG51bWJlcnMucHVzaChudW1iZXIpO1xuICB9XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgbnVtYmVyID0gbnVtYmVyc1tpbmRleF07XG4gICAgaWYgKGluZGV4ID09IHBhcnRzTGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKG51bWJlciA+PSBwb3coMjU2LCA1IC0gcGFydHNMZW5ndGgpKSByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXB2NCA9IG51bWJlcnMucG9wKCk7XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgaXB2NCArPSBudW1iZXJzW2luZGV4XSAqIHBvdygyNTYsIDMgLSBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIGlwdjQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbnZhciBwYXJzZUlQdjYgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIGFkZHJlc3MgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gIHZhciBwaWVjZUluZGV4ID0gMDtcbiAgdmFyIGNvbXByZXNzID0gbnVsbDtcbiAgdmFyIHBvaW50ZXIgPSAwO1xuICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDtcblxuICB2YXIgY2hhciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW5wdXQuY2hhckF0KHBvaW50ZXIpO1xuICB9O1xuXG4gIGlmIChjaGFyKCkgPT0gJzonKSB7XG4gICAgaWYgKGlucHV0LmNoYXJBdCgxKSAhPSAnOicpIHJldHVybjtcbiAgICBwb2ludGVyICs9IDI7XG4gICAgcGllY2VJbmRleCsrO1xuICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgfVxuICB3aGlsZSAoY2hhcigpKSB7XG4gICAgaWYgKHBpZWNlSW5kZXggPT0gOCkgcmV0dXJuO1xuICAgIGlmIChjaGFyKCkgPT0gJzonKSB7XG4gICAgICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHJldHVybjtcbiAgICAgIHBvaW50ZXIrKztcbiAgICAgIHBpZWNlSW5kZXgrKztcbiAgICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YWx1ZSA9IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKGxlbmd0aCA8IDQgJiYgSEVYLnRlc3QoY2hhcigpKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDE2ICsgcGFyc2VJbnQoY2hhcigpLCAxNik7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBsZW5ndGgrKztcbiAgICB9XG4gICAgaWYgKGNoYXIoKSA9PSAnLicpIHtcbiAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgcG9pbnRlciAtPSBsZW5ndGg7XG4gICAgICBpZiAocGllY2VJbmRleCA+IDYpIHJldHVybjtcbiAgICAgIG51bWJlcnNTZWVuID0gMDtcbiAgICAgIHdoaWxlIChjaGFyKCkpIHtcbiAgICAgICAgaXB2NFBpZWNlID0gbnVsbDtcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID4gMCkge1xuICAgICAgICAgIGlmIChjaGFyKCkgPT0gJy4nICYmIG51bWJlcnNTZWVuIDwgNCkgcG9pbnRlcisrO1xuICAgICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghRElHSVQudGVzdChjaGFyKCkpKSByZXR1cm47XG4gICAgICAgIHdoaWxlIChESUdJVC50ZXN0KGNoYXIoKSkpIHtcbiAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChjaGFyKCksIDEwKTtcbiAgICAgICAgICBpZiAoaXB2NFBpZWNlID09PSBudWxsKSBpcHY0UGllY2UgPSBudW1iZXI7XG4gICAgICAgICAgZWxzZSBpZiAoaXB2NFBpZWNlID09IDApIHJldHVybjtcbiAgICAgICAgICBlbHNlIGlwdjRQaWVjZSA9IGlwdjRQaWVjZSAqIDEwICsgbnVtYmVyO1xuICAgICAgICAgIGlmIChpcHY0UGllY2UgPiAyNTUpIHJldHVybjtcbiAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1twaWVjZUluZGV4XSA9IGFkZHJlc3NbcGllY2VJbmRleF0gKiAyNTYgKyBpcHY0UGllY2U7XG4gICAgICAgIG51bWJlcnNTZWVuKys7XG4gICAgICAgIGlmIChudW1iZXJzU2VlbiA9PSAyIHx8IG51bWJlcnNTZWVuID09IDQpIHBpZWNlSW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXJzU2VlbiAhPSA0KSByZXR1cm47XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNoYXIoKSA9PSAnOicpIHtcbiAgICAgIHBvaW50ZXIrKztcbiAgICAgIGlmICghY2hhcigpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGFyKCkpIHJldHVybjtcbiAgICBhZGRyZXNzW3BpZWNlSW5kZXgrK10gPSB2YWx1ZTtcbiAgfVxuICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHtcbiAgICBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzcztcbiAgICBwaWVjZUluZGV4ID0gNztcbiAgICB3aGlsZSAocGllY2VJbmRleCAhPSAwICYmIHN3YXBzID4gMCkge1xuICAgICAgc3dhcCA9IGFkZHJlc3NbcGllY2VJbmRleF07XG4gICAgICBhZGRyZXNzW3BpZWNlSW5kZXgtLV0gPSBhZGRyZXNzW2NvbXByZXNzICsgc3dhcHMgLSAxXTtcbiAgICAgIGFkZHJlc3NbY29tcHJlc3MgKyAtLXN3YXBzXSA9IHN3YXA7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBpZWNlSW5kZXggIT0gOCkgcmV0dXJuO1xuICByZXR1cm4gYWRkcmVzcztcbn07XG5cbnZhciBmaW5kTG9uZ2VzdFplcm9TZXF1ZW5jZSA9IGZ1bmN0aW9uIChpcHY2KSB7XG4gIHZhciBtYXhJbmRleCA9IG51bGw7XG4gIHZhciBtYXhMZW5ndGggPSAxO1xuICB2YXIgY3VyclN0YXJ0ID0gbnVsbDtcbiAgdmFyIGN1cnJMZW5ndGggPSAwO1xuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKDsgaW5kZXggPCA4OyBpbmRleCsrKSB7XG4gICAgaWYgKGlwdjZbaW5kZXhdICE9PSAwKSB7XG4gICAgICBpZiAoY3Vyckxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICBtYXhJbmRleCA9IGN1cnJTdGFydDtcbiAgICAgICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGN1cnJTdGFydCA9IG51bGw7XG4gICAgICBjdXJyTGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1cnJTdGFydCA9PT0gbnVsbCkgY3VyclN0YXJ0ID0gaW5kZXg7XG4gICAgICArK2N1cnJMZW5ndGg7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgbWF4SW5kZXggPSBjdXJyU3RhcnQ7XG4gICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDtcbiAgfVxuICByZXR1cm4gbWF4SW5kZXg7XG59O1xuXG52YXIgc2VyaWFsaXplSG9zdCA9IGZ1bmN0aW9uIChob3N0KSB7XG4gIHZhciByZXN1bHQsIGluZGV4LCBjb21wcmVzcywgaWdub3JlMDtcbiAgLy8gaXB2NFxuICBpZiAodHlwZW9mIGhvc3QgPT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQudW5zaGlmdChob3N0ICUgMjU2KTtcbiAgICAgIGhvc3QgPSBmbG9vcihob3N0IC8gMjU2KTtcbiAgICB9IHJldHVybiByZXN1bHQuam9pbignLicpO1xuICAvLyBpcHY2XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHtcbiAgICByZXN1bHQgPSAnJztcbiAgICBjb21wcmVzcyA9IGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlKGhvc3QpO1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChpZ25vcmUwKSBpZ25vcmUwID0gZmFsc2U7XG4gICAgICBpZiAoY29tcHJlc3MgPT09IGluZGV4KSB7XG4gICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7XG4gICAgICAgIGlnbm9yZTAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGhvc3RbaW5kZXhdLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKGluZGV4IDwgNykgcmVzdWx0ICs9ICc6JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdbJyArIHJlc3VsdCArICddJztcbiAgfSByZXR1cm4gaG9zdDtcbn07XG5cbnZhciBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0ID0ge307XG52YXIgZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0LCB7XG4gICcgJzogMSwgJ1wiJzogMSwgJzwnOiAxLCAnPic6IDEsICdgJzogMVxufSk7XG52YXIgcGF0aFBlcmNlbnRFbmNvZGVTZXQgPSBhc3NpZ24oe30sIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCwge1xuICAnIyc6IDEsICc/JzogMSwgJ3snOiAxLCAnfSc6IDFcbn0pO1xudmFyIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgcGF0aFBlcmNlbnRFbmNvZGVTZXQsIHtcbiAgJy8nOiAxLCAnOic6IDEsICc7JzogMSwgJz0nOiAxLCAnQCc6IDEsICdbJzogMSwgJ1xcXFwnOiAxLCAnXSc6IDEsICdeJzogMSwgJ3wnOiAxXG59KTtcblxudmFyIHBlcmNlbnRFbmNvZGUgPSBmdW5jdGlvbiAoY2hhciwgc2V0KSB7XG4gIHZhciBjb2RlID0gY29kZUF0KGNoYXIsIDApO1xuICByZXR1cm4gY29kZSA+IDB4MjAgJiYgY29kZSA8IDB4N0YgJiYgIWhhcyhzZXQsIGNoYXIpID8gY2hhciA6IGVuY29kZVVSSUNvbXBvbmVudChjaGFyKTtcbn07XG5cbnZhciBzcGVjaWFsU2NoZW1lcyA9IHtcbiAgZnRwOiAyMSxcbiAgZmlsZTogbnVsbCxcbiAgaHR0cDogODAsXG4gIGh0dHBzOiA0NDMsXG4gIHdzOiA4MCxcbiAgd3NzOiA0NDNcbn07XG5cbnZhciBpc1NwZWNpYWwgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiBoYXMoc3BlY2lhbFNjaGVtZXMsIHVybC5zY2hlbWUpO1xufTtcblxudmFyIGluY2x1ZGVzQ3JlZGVudGlhbHMgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiB1cmwudXNlcm5hbWUgIT0gJycgfHwgdXJsLnBhc3N3b3JkICE9ICcnO1xufTtcblxudmFyIGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgcmV0dXJuICF1cmwuaG9zdCB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09ICdmaWxlJztcbn07XG5cbnZhciBpc1dpbmRvd3NEcml2ZUxldHRlciA9IGZ1bmN0aW9uIChzdHJpbmcsIG5vcm1hbGl6ZWQpIHtcbiAgdmFyIHNlY29uZDtcbiAgcmV0dXJuIHN0cmluZy5sZW5ndGggPT0gMiAmJiBBTFBIQS50ZXN0KHN0cmluZy5jaGFyQXQoMCkpXG4gICAgJiYgKChzZWNvbmQgPSBzdHJpbmcuY2hhckF0KDEpKSA9PSAnOicgfHwgKCFub3JtYWxpemVkICYmIHNlY29uZCA9PSAnfCcpKTtcbn07XG5cbnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgdGhpcmQ7XG4gIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmcuc2xpY2UoMCwgMikpICYmIChcbiAgICBzdHJpbmcubGVuZ3RoID09IDIgfHxcbiAgICAoKHRoaXJkID0gc3RyaW5nLmNoYXJBdCgyKSkgPT09ICcvJyB8fCB0aGlyZCA9PT0gJ1xcXFwnIHx8IHRoaXJkID09PSAnPycgfHwgdGhpcmQgPT09ICcjJylcbiAgKTtcbn07XG5cbnZhciBzaG9ydGVuVVJMc1BhdGggPSBmdW5jdGlvbiAodXJsKSB7XG4gIHZhciBwYXRoID0gdXJsLnBhdGg7XG4gIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoO1xuICBpZiAocGF0aFNpemUgJiYgKHVybC5zY2hlbWUgIT0gJ2ZpbGUnIHx8IHBhdGhTaXplICE9IDEgfHwgIWlzV2luZG93c0RyaXZlTGV0dGVyKHBhdGhbMF0sIHRydWUpKSkge1xuICAgIHBhdGgucG9wKCk7XG4gIH1cbn07XG5cbnZhciBpc1NpbmdsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudC50b0xvd2VyQ2FzZSgpID09PSAnJTJlJztcbn07XG5cbnZhciBpc0RvdWJsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gIHNlZ21lbnQgPSBzZWdtZW50LnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7XG59O1xuXG4vLyBTdGF0ZXM6XG52YXIgU0NIRU1FX1NUQVJUID0ge307XG52YXIgU0NIRU1FID0ge307XG52YXIgTk9fU0NIRU1FID0ge307XG52YXIgU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkgPSB7fTtcbnZhciBQQVRIX09SX0FVVEhPUklUWSA9IHt9O1xudmFyIFJFTEFUSVZFID0ge307XG52YXIgUkVMQVRJVkVfU0xBU0ggPSB7fTtcbnZhciBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTID0ge307XG52YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTtcbnZhciBBVVRIT1JJVFkgPSB7fTtcbnZhciBIT1NUID0ge307XG52YXIgSE9TVE5BTUUgPSB7fTtcbnZhciBQT1JUID0ge307XG52YXIgRklMRSA9IHt9O1xudmFyIEZJTEVfU0xBU0ggPSB7fTtcbnZhciBGSUxFX0hPU1QgPSB7fTtcbnZhciBQQVRIX1NUQVJUID0ge307XG52YXIgUEFUSCA9IHt9O1xudmFyIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEggPSB7fTtcbnZhciBRVUVSWSA9IHt9O1xudmFyIEZSQUdNRU5UID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xudmFyIHBhcnNlVVJMID0gZnVuY3Rpb24gKHVybCwgaW5wdXQsIHN0YXRlT3ZlcnJpZGUsIGJhc2UpIHtcbiAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBTQ0hFTUVfU1RBUlQ7XG4gIHZhciBwb2ludGVyID0gMDtcbiAgdmFyIGJ1ZmZlciA9ICcnO1xuICB2YXIgc2VlbkF0ID0gZmFsc2U7XG4gIHZhciBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICB2YXIgc2VlblBhc3N3b3JkVG9rZW4gPSBmYWxzZTtcbiAgdmFyIGNvZGVQb2ludHMsIGNoYXIsIGJ1ZmZlckNvZGVQb2ludHMsIGZhaWx1cmU7XG5cbiAgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgdXJsLnNjaGVtZSA9ICcnO1xuICAgIHVybC51c2VybmFtZSA9ICcnO1xuICAgIHVybC5wYXNzd29yZCA9ICcnO1xuICAgIHVybC5ob3N0ID0gbnVsbDtcbiAgICB1cmwucG9ydCA9IG51bGw7XG4gICAgdXJsLnBhdGggPSBbXTtcbiAgICB1cmwucXVlcnkgPSBudWxsO1xuICAgIHVybC5mcmFnbWVudCA9IG51bGw7XG4gICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSBmYWxzZTtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSwgJycpO1xuICB9XG5cbiAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFRBQl9BTkRfTkVXX0xJTkUsICcnKTtcblxuICBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKGlucHV0KTtcblxuICB3aGlsZSAocG9pbnRlciA8PSBjb2RlUG9pbnRzLmxlbmd0aCkge1xuICAgIGNoYXIgPSBjb2RlUG9pbnRzW3BvaW50ZXJdO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgU0NIRU1FX1NUQVJUOlxuICAgICAgICBpZiAoY2hhciAmJiBBTFBIQS50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBzdGF0ZSA9IFNDSEVNRTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIHN0YXRlID0gTk9fU0NIRU1FO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfU0NIRU1FO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTQ0hFTUU6XG4gICAgICAgIGlmIChjaGFyICYmIChBTFBIQU5VTUVSSUMudGVzdChjaGFyKSB8fCBjaGFyID09ICcrJyB8fCBjaGFyID09ICctJyB8fCBjaGFyID09ICcuJykpIHtcbiAgICAgICAgICBidWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonKSB7XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgKFxuICAgICAgICAgICAgKGlzU3BlY2lhbCh1cmwpICE9IGhhcyhzcGVjaWFsU2NoZW1lcywgYnVmZmVyKSkgfHxcbiAgICAgICAgICAgIChidWZmZXIgPT0gJ2ZpbGUnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpKSB8fFxuICAgICAgICAgICAgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwuaG9zdClcbiAgICAgICAgICApKSByZXR1cm47XG4gICAgICAgICAgdXJsLnNjaGVtZSA9IGJ1ZmZlcjtcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdID09IHVybC5wb3J0KSB1cmwucG9ydCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgICAgc3RhdGUgPSBGSUxFO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHVybCkgJiYgYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSB1cmwuc2NoZW1lKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHVybCkpIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludHNbcG9pbnRlciArIDFdID09ICcvJykge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIX09SX0FVVEhPUklUWTtcbiAgICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSB0cnVlO1xuICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICBzdGF0ZSA9IENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBOT19TQ0hFTUU7XG4gICAgICAgICAgcG9pbnRlciA9IDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE5PX1NDSEVNRTpcbiAgICAgICAgaWYgKCFiYXNlIHx8IChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciAhPSAnIycpKSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgIGlmIChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTtcbiAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnID8gRklMRSA6IFJFTEFUSVZFO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWTpcbiAgICAgICAgaWYgKGNoYXIgPT0gJy8nICYmIGNvZGVQb2ludHNbcG9pbnRlciArIDFdID09ICcvJykge1xuICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7XG4gICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUEFUSF9PUl9BVVRIT1JJVFk6XG4gICAgICAgIGlmIChjaGFyID09ICcvJykge1xuICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFTEFUSVZFOlxuICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgIGlmIChjaGFyID09IEVPRikge1xuICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycgfHwgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkge1xuICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkVfU0xBU0g7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTtcbiAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgIHVybC5wYXRoLnBvcCgpO1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBSRUxBVElWRV9TTEFTSDpcbiAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXFxcJykpIHtcbiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJy8nKSB7XG4gICAgICAgICAgc3RhdGUgPSBBVVRIT1JJVFk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTOlxuICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICBpZiAoY2hhciAhPSAnLycgfHwgYnVmZmVyLmNoYXJBdChwb2ludGVyICsgMSkgIT0gJy8nKSBjb250aW51ZTtcbiAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUzpcbiAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmIGNoYXIgIT0gJ1xcXFwnKSB7XG4gICAgICAgICAgc3RhdGUgPSBBVVRIT1JJVFk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgQVVUSE9SSVRZOlxuICAgICAgICBpZiAoY2hhciA9PSAnQCcpIHtcbiAgICAgICAgICBpZiAoc2VlbkF0KSBidWZmZXIgPSAnJTQwJyArIGJ1ZmZlcjtcbiAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgIGJ1ZmZlckNvZGVQb2ludHMgPSBhcnJheUZyb20oYnVmZmVyKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1ZmZlckNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBidWZmZXJDb2RlUG9pbnRzW2ldO1xuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSAnOicgJiYgIXNlZW5QYXNzd29yZFRva2VuKSB7XG4gICAgICAgICAgICAgIHNlZW5QYXNzd29yZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZW5jb2RlZENvZGVQb2ludHMgPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludCwgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgICAgIGlmIChzZWVuUGFzc3dvcmRUb2tlbikgdXJsLnBhc3N3b3JkICs9IGVuY29kZWRDb2RlUG9pbnRzO1xuICAgICAgICAgICAgZWxzZSB1cmwudXNlcm5hbWUgKz0gZW5jb2RlZENvZGVQb2ludHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnIHx8XG4gICAgICAgICAgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoc2VlbkF0ICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfQVVUSE9SSVRZO1xuICAgICAgICAgIHBvaW50ZXIgLT0gYXJyYXlGcm9tKGJ1ZmZlcikubGVuZ3RoICsgMTtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEhPU1Q7XG4gICAgICAgIH0gZWxzZSBidWZmZXIgKz0gY2hhcjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSE9TVDpcbiAgICAgIGNhc2UgSE9TVE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgc3RhdGUgPSBGSUxFX0hPU1Q7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnOicgJiYgIXNlZW5CcmFja2V0KSB7XG4gICAgICAgICAgaWYgKGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICAgICAgICBmYWlsdXJlID0gcGFyc2VIb3N0KHVybCwgYnVmZmVyKTtcbiAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBQT1JUO1xuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlID09IEhPU1ROQU1FKSByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHxcbiAgICAgICAgICAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChpc1NwZWNpYWwodXJsKSAmJiBidWZmZXIgPT0gJycpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgYnVmZmVyID09ICcnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpKSByZXR1cm47XG4gICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7XG4gICAgICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlO1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGFyID09ICdbJykgc2VlbkJyYWNrZXQgPSB0cnVlO1xuICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJ10nKSBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICAgICAgICAgIGJ1ZmZlciArPSBjaGFyO1xuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIFBPUlQ6XG4gICAgICAgIGlmIChESUdJVC50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHxcbiAgICAgICAgICAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpIHx8XG4gICAgICAgICAgc3RhdGVPdmVycmlkZVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoYnVmZmVyICE9ICcnKSB7XG4gICAgICAgICAgICB2YXIgcG9ydCA9IHBhcnNlSW50KGJ1ZmZlciwgMTApO1xuICAgICAgICAgICAgaWYgKHBvcnQgPiAweEZGRkYpIHJldHVybiBJTlZBTElEX1BPUlQ7XG4gICAgICAgICAgICB1cmwucG9ydCA9IChpc1NwZWNpYWwodXJsKSAmJiBwb3J0ID09PSBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSkgPyBudWxsIDogcG9ydDtcbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBJTlZBTElEX1BPUlQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZJTEU6XG4gICAgICAgIHVybC5zY2hlbWUgPSAnZmlsZSc7XG4gICAgICAgIGlmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXFxcJykgc3RhdGUgPSBGSUxFX1NMQVNIO1xuICAgICAgICBlbHNlIGlmIChiYXNlICYmIGJhc2Uuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgIGlmIChjaGFyID09IEVPRikge1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJz8nKSB7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcjJykge1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGNvZGVQb2ludHMuc2xpY2UocG9pbnRlcikuam9pbignJykpKSB7XG4gICAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgICBzaG9ydGVuVVJMc1BhdGgodXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgRklMRV9TTEFTSDpcbiAgICAgICAgaWYgKGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcXFwnKSB7XG4gICAgICAgICAgc3RhdGUgPSBGSUxFX0hPU1Q7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnICYmICFzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGNvZGVQb2ludHMuc2xpY2UocG9pbnRlcikuam9pbignJykpKSB7XG4gICAgICAgICAgaWYgKGlzV2luZG93c0RyaXZlTGV0dGVyKGJhc2UucGF0aFswXSwgdHJ1ZSkpIHVybC5wYXRoLnB1c2goYmFzZS5wYXRoWzBdKTtcbiAgICAgICAgICBlbHNlIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIGNhc2UgRklMRV9IT1NUOlxuICAgICAgICBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFxcXCcgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyID09ICcnKSB7XG4gICAgICAgICAgICB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICBpZiAodXJsLmhvc3QgPT0gJ2xvY2FsaG9zdCcpIHVybC5ob3N0ID0gJyc7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7XG4gICAgICAgICAgfSBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaGFyO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBQQVRIX1NUQVJUOlxuICAgICAgICBpZiAoaXNTcGVjaWFsKHVybCkpIHtcbiAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmIGNoYXIgIT0gJ1xcXFwnKSBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICc/Jykge1xuICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgIT0gRU9GKSB7XG4gICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIGlmIChjaGFyICE9ICcvJykgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUEFUSDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8XG4gICAgICAgICAgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKSB8fFxuICAgICAgICAgICghc3RhdGVPdmVycmlkZSAmJiAoY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoaXNEb3VibGVEb3QoYnVmZmVyKSkge1xuICAgICAgICAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7XG4gICAgICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgIShjaGFyID09ICdcXFxcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHtcbiAgICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1NpbmdsZURvdChidWZmZXIpKSB7XG4gICAgICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgIShjaGFyID09ICdcXFxcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHtcbiAgICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAhdXJsLnBhdGgubGVuZ3RoICYmIGlzV2luZG93c0RyaXZlTGV0dGVyKGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgaWYgKHVybC5ob3N0KSB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuY2hhckF0KDApICsgJzonOyAvLyBub3JtYWxpemUgd2luZG93cyBkcml2ZSBsZXR0ZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVybC5wYXRoLnB1c2goYnVmZmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpIHtcbiAgICAgICAgICAgIHdoaWxlICh1cmwucGF0aC5sZW5ndGggPiAxICYmIHVybC5wYXRoWzBdID09PSAnJykge1xuICAgICAgICAgICAgICB1cmwucGF0aC5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSBRVUVSWTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RW5jb2RlKGNoYXIsIHBhdGhQZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBDQU5OT1RfQkVfQV9CQVNFX1VSTF9QQVRIOlxuICAgICAgICBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikge1xuICAgICAgICAgIHVybC5wYXRoWzBdICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUVVFUlk6XG4gICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICcjJykge1xuICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciAhPSBFT0YpIHtcbiAgICAgICAgICBpZiAoY2hhciA9PSBcIidcIiAmJiBpc1NwZWNpYWwodXJsKSkgdXJsLnF1ZXJ5ICs9ICclMjcnO1xuICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB1cmwucXVlcnkgKz0gJyUyMyc7XG4gICAgICAgICAgZWxzZSB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaGFyLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBGUkFHTUVOVDpcbiAgICAgICAgaWYgKGNoYXIgIT0gRU9GKSB1cmwuZnJhZ21lbnQgKz0gcGVyY2VudEVuY29kZShjaGFyLCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBwb2ludGVyKys7XG4gIH1cbn07XG5cbi8vIGBVUkxgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1jbGFzc1xudmFyIFVSTENvbnN0cnVjdG9yID0gZnVuY3Rpb24gVVJMKHVybCAvKiAsIGJhc2UgKi8pIHtcbiAgdmFyIHRoYXQgPSBhbkluc3RhbmNlKHRoaXMsIFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7XG4gIHZhciBiYXNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciB1cmxTdHJpbmcgPSBTdHJpbmcodXJsKTtcbiAgdmFyIHN0YXRlID0gc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7IHR5cGU6ICdVUkwnIH0pO1xuICB2YXIgYmFzZVN0YXRlLCBmYWlsdXJlO1xuICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGJhc2UgaW5zdGFuY2VvZiBVUkxDb25zdHJ1Y3RvcikgYmFzZVN0YXRlID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZShiYXNlKTtcbiAgICBlbHNlIHtcbiAgICAgIGZhaWx1cmUgPSBwYXJzZVVSTChiYXNlU3RhdGUgPSB7fSwgU3RyaW5nKGJhc2UpKTtcbiAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7XG4gICAgfVxuICB9XG4gIGZhaWx1cmUgPSBwYXJzZVVSTChzdGF0ZSwgdXJsU3RyaW5nLCBudWxsLCBiYXNlU3RhdGUpO1xuICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICB2YXIgc2VhcmNoUGFyYW1zID0gc3RhdGUuc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICB2YXIgc2VhcmNoUGFyYW1zU3RhdGUgPSBnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlKHNlYXJjaFBhcmFtcyk7XG4gIHNlYXJjaFBhcmFtc1N0YXRlLnVwZGF0ZVNlYXJjaFBhcmFtcyhzdGF0ZS5xdWVyeSk7XG4gIHNlYXJjaFBhcmFtc1N0YXRlLnVwZGF0ZVVSTCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzdGF0ZS5xdWVyeSA9IFN0cmluZyhzZWFyY2hQYXJhbXMpIHx8IG51bGw7XG4gIH07XG4gIGlmICghREVTQ1JJUFRPUlMpIHtcbiAgICB0aGF0LmhyZWYgPSBzZXJpYWxpemVVUkwuY2FsbCh0aGF0KTtcbiAgICB0aGF0Lm9yaWdpbiA9IGdldE9yaWdpbi5jYWxsKHRoYXQpO1xuICAgIHRoYXQucHJvdG9jb2wgPSBnZXRQcm90b2NvbC5jYWxsKHRoYXQpO1xuICAgIHRoYXQudXNlcm5hbWUgPSBnZXRVc2VybmFtZS5jYWxsKHRoYXQpO1xuICAgIHRoYXQucGFzc3dvcmQgPSBnZXRQYXNzd29yZC5jYWxsKHRoYXQpO1xuICAgIHRoYXQuaG9zdCA9IGdldEhvc3QuY2FsbCh0aGF0KTtcbiAgICB0aGF0Lmhvc3RuYW1lID0gZ2V0SG9zdG5hbWUuY2FsbCh0aGF0KTtcbiAgICB0aGF0LnBvcnQgPSBnZXRQb3J0LmNhbGwodGhhdCk7XG4gICAgdGhhdC5wYXRobmFtZSA9IGdldFBhdGhuYW1lLmNhbGwodGhhdCk7XG4gICAgdGhhdC5zZWFyY2ggPSBnZXRTZWFyY2guY2FsbCh0aGF0KTtcbiAgICB0aGF0LnNlYXJjaFBhcmFtcyA9IGdldFNlYXJjaFBhcmFtcy5jYWxsKHRoYXQpO1xuICAgIHRoYXQuaGFzaCA9IGdldEhhc2guY2FsbCh0aGF0KTtcbiAgfVxufTtcblxudmFyIFVSTFByb3RvdHlwZSA9IFVSTENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxudmFyIHNlcmlhbGl6ZVVSTCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lO1xuICB2YXIgdXNlcm5hbWUgPSB1cmwudXNlcm5hbWU7XG4gIHZhciBwYXNzd29yZCA9IHVybC5wYXNzd29yZDtcbiAgdmFyIGhvc3QgPSB1cmwuaG9zdDtcbiAgdmFyIHBvcnQgPSB1cmwucG9ydDtcbiAgdmFyIHBhdGggPSB1cmwucGF0aDtcbiAgdmFyIHF1ZXJ5ID0gdXJsLnF1ZXJ5O1xuICB2YXIgZnJhZ21lbnQgPSB1cmwuZnJhZ21lbnQ7XG4gIHZhciBvdXRwdXQgPSBzY2hlbWUgKyAnOic7XG4gIGlmIChob3N0ICE9PSBudWxsKSB7XG4gICAgb3V0cHV0ICs9ICcvLyc7XG4gICAgaWYgKGluY2x1ZGVzQ3JlZGVudGlhbHModXJsKSkge1xuICAgICAgb3V0cHV0ICs9IHVzZXJuYW1lICsgKHBhc3N3b3JkID8gJzonICsgcGFzc3dvcmQgOiAnJykgKyAnQCc7XG4gICAgfVxuICAgIG91dHB1dCArPSBzZXJpYWxpemVIb3N0KGhvc3QpO1xuICAgIGlmIChwb3J0ICE9PSBudWxsKSBvdXRwdXQgKz0gJzonICsgcG9ydDtcbiAgfSBlbHNlIGlmIChzY2hlbWUgPT0gJ2ZpbGUnKSBvdXRwdXQgKz0gJy8vJztcbiAgb3V0cHV0ICs9IHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgcGF0aC5qb2luKCcvJykgOiAnJztcbiAgaWYgKHF1ZXJ5ICE9PSBudWxsKSBvdXRwdXQgKz0gJz8nICsgcXVlcnk7XG4gIGlmIChmcmFnbWVudCAhPT0gbnVsbCkgb3V0cHV0ICs9ICcjJyArIGZyYWdtZW50O1xuICByZXR1cm4gb3V0cHV0O1xufTtcblxudmFyIGdldE9yaWdpbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lO1xuICB2YXIgcG9ydCA9IHVybC5wb3J0O1xuICBpZiAoc2NoZW1lID09ICdibG9iJykgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTChzY2hlbWUucGF0aFswXSkub3JpZ2luO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH1cbiAgaWYgKHNjaGVtZSA9PSAnZmlsZScgfHwgIWlzU3BlY2lhbCh1cmwpKSByZXR1cm4gJ251bGwnO1xuICByZXR1cm4gc2NoZW1lICsgJzovLycgKyBzZXJpYWxpemVIb3N0KHVybC5ob3N0KSArIChwb3J0ICE9PSBudWxsID8gJzonICsgcG9ydCA6ICcnKTtcbn07XG5cbnZhciBnZXRQcm90b2NvbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2NoZW1lICsgJzonO1xufTtcblxudmFyIGdldFVzZXJuYW1lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS51c2VybmFtZTtcbn07XG5cbnZhciBnZXRQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykucGFzc3dvcmQ7XG59O1xuXG52YXIgZ2V0SG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBob3N0ID0gdXJsLmhvc3Q7XG4gIHZhciBwb3J0ID0gdXJsLnBvcnQ7XG4gIHJldHVybiBob3N0ID09PSBudWxsID8gJydcbiAgICA6IHBvcnQgPT09IG51bGwgPyBzZXJpYWxpemVIb3N0KGhvc3QpXG4gICAgOiBzZXJpYWxpemVIb3N0KGhvc3QpICsgJzonICsgcG9ydDtcbn07XG5cbnZhciBnZXRIb3N0bmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhvc3QgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLmhvc3Q7XG4gIHJldHVybiBob3N0ID09PSBudWxsID8gJycgOiBzZXJpYWxpemVIb3N0KGhvc3QpO1xufTtcblxudmFyIGdldFBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwb3J0ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5wb3J0O1xuICByZXR1cm4gcG9ydCA9PT0gbnVsbCA/ICcnIDogU3RyaW5nKHBvcnQpO1xufTtcblxudmFyIGdldFBhdGhuYW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgdmFyIHBhdGggPSB1cmwucGF0aDtcbiAgcmV0dXJuIHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgcGF0aC5qb2luKCcvJykgOiAnJztcbn07XG5cbnZhciBnZXRTZWFyY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBxdWVyeSA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykucXVlcnk7XG4gIHJldHVybiBxdWVyeSA/ICc/JyArIHF1ZXJ5IDogJyc7XG59O1xuXG52YXIgZ2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5zZWFyY2hQYXJhbXM7XG59O1xuXG52YXIgZ2V0SGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZyYWdtZW50ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5mcmFnbWVudDtcbiAgcmV0dXJuIGZyYWdtZW50ID8gJyMnICsgZnJhZ21lbnQgOiAnJztcbn07XG5cbnZhciBhY2Nlc3NvckRlc2NyaXB0b3IgPSBmdW5jdGlvbiAoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIHsgZ2V0OiBnZXR0ZXIsIHNldDogc2V0dGVyLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUgfTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICBkZWZpbmVQcm9wZXJ0aWVzKFVSTFByb3RvdHlwZSwge1xuICAgIC8vIGBVUkwucHJvdG90eXBlLmhyZWZgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhyZWZcbiAgICBocmVmOiBhY2Nlc3NvckRlc2NyaXB0b3Ioc2VyaWFsaXplVVJMLCBmdW5jdGlvbiAoaHJlZikge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICB2YXIgdXJsU3RyaW5nID0gU3RyaW5nKGhyZWYpO1xuICAgICAgdmFyIGZhaWx1cmUgPSBwYXJzZVVSTCh1cmwsIHVybFN0cmluZyk7XG4gICAgICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICAgICAgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSh1cmwuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXModXJsLnF1ZXJ5KTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5vcmlnaW5gIGdldHRlclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1vcmlnaW5cbiAgICBvcmlnaW46IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRPcmlnaW4pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnByb3RvY29sYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wcm90b2NvbFxuICAgIHByb3RvY29sOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UHJvdG9jb2wsIGZ1bmN0aW9uIChwcm90b2NvbCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhwcm90b2NvbCkgKyAnOicsIFNDSEVNRV9TVEFSVCk7XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUudXNlcm5hbWVgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXVzZXJuYW1lXG4gICAgdXNlcm5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRVc2VybmFtZSwgZnVuY3Rpb24gKHVzZXJuYW1lKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKFN0cmluZyh1c2VybmFtZSkpO1xuICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47XG4gICAgICB1cmwudXNlcm5hbWUgPSAnJztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cmwudXNlcm5hbWUgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2ldLCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnBhc3N3b3JkYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wYXNzd29yZFxuICAgIHBhc3N3b3JkOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UGFzc3dvcmQsIGZ1bmN0aW9uIChwYXNzd29yZCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICB2YXIgY29kZVBvaW50cyA9IGFycmF5RnJvbShTdHJpbmcocGFzc3dvcmQpKTtcbiAgICAgIGlmIChjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQodXJsKSkgcmV0dXJuO1xuICAgICAgdXJsLnBhc3N3b3JkID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXJsLnBhc3N3b3JkICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpXSwgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0YCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ob3N0XG4gICAgaG9zdDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldEhvc3QsIGZ1bmN0aW9uIChob3N0KSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuO1xuICAgICAgcGFyc2VVUkwodXJsLCBTdHJpbmcoaG9zdCksIEhPU1QpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLmhvc3RuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ob3N0bmFtZVxuICAgIGhvc3RuYW1lOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdG5hbWUsIGZ1bmN0aW9uIChob3N0bmFtZSkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBpZiAodXJsLmNhbm5vdEJlQUJhc2VVUkwpIHJldHVybjtcbiAgICAgIHBhcnNlVVJMKHVybCwgU3RyaW5nKGhvc3RuYW1lKSwgSE9TVE5BTUUpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnBvcnRgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXBvcnRcbiAgICBwb3J0OiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UG9ydCwgZnVuY3Rpb24gKHBvcnQpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47XG4gICAgICBwb3J0ID0gU3RyaW5nKHBvcnQpO1xuICAgICAgaWYgKHBvcnQgPT0gJycpIHVybC5wb3J0ID0gbnVsbDtcbiAgICAgIGVsc2UgcGFyc2VVUkwodXJsLCBwb3J0LCBQT1JUKTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5wYXRobmFtZWAgYWNjZXNzb3JzIHBhaXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgICBwYXRobmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFBhdGhuYW1lLCBmdW5jdGlvbiAocGF0aG5hbWUpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgaWYgKHVybC5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgICB1cmwucGF0aCA9IFtdO1xuICAgICAgcGFyc2VVUkwodXJsLCBwYXRobmFtZSArICcnLCBQQVRIX1NUQVJUKTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5zZWFyY2hgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXNlYXJjaFxuICAgIHNlYXJjaDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFNlYXJjaCwgZnVuY3Rpb24gKHNlYXJjaCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTtcbiAgICAgIGlmIChzZWFyY2ggPT0gJycpIHtcbiAgICAgICAgdXJsLnF1ZXJ5ID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgnPycgPT0gc2VhcmNoLmNoYXJBdCgwKSkgc2VhcmNoID0gc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgcGFyc2VVUkwodXJsLCBzZWFyY2gsIFFVRVJZKTtcbiAgICAgIH1cbiAgICAgIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUodXJsLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHVybC5xdWVyeSk7XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUuc2VhcmNoUGFyYW1zYCBnZXR0ZXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNocGFyYW1zXG4gICAgc2VhcmNoUGFyYW1zOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0U2VhcmNoUGFyYW1zKSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5oYXNoYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1oYXNoXG4gICAgaGFzaDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldEhhc2gsIGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIGhhc2ggPSBTdHJpbmcoaGFzaCk7XG4gICAgICBpZiAoaGFzaCA9PSAnJykge1xuICAgICAgICB1cmwuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJyMnID09IGhhc2guY2hhckF0KDApKSBoYXNoID0gaGFzaC5zbGljZSgxKTtcbiAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgcGFyc2VVUkwodXJsLCBoYXNoLCBGUkFHTUVOVCk7XG4gICAgfSlcbiAgfSk7XG59XG5cbi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdG9qc29uXG5yZWRlZmluZShVUkxQcm90b3R5cGUsICd0b0pTT04nLCBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIHJldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKTtcbn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLy8gYFVSTC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNVUkwtc3RyaW5naWZpY2F0aW9uLWJlaGF2aW9yXG5yZWRlZmluZShVUkxQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gc2VyaWFsaXplVVJMLmNhbGwodGhpcyk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbmlmIChOYXRpdmVVUkwpIHtcbiAgdmFyIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCA9IE5hdGl2ZVVSTC5jcmVhdGVPYmplY3RVUkw7XG4gIHZhciBuYXRpdmVSZXZva2VPYmplY3RVUkwgPSBOYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMO1xuICAvLyBgVVJMLmNyZWF0ZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvY3JlYXRlT2JqZWN0VVJMXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBpZiAobmF0aXZlQ3JlYXRlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ2NyZWF0ZU9iamVjdFVSTCcsIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChibG9iKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTC5hcHBseShOYXRpdmVVUkwsIGFyZ3VtZW50cyk7XG4gIH0pO1xuICAvLyBgVVJMLnJldm9rZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvcmV2b2tlT2JqZWN0VVJMXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBpZiAobmF0aXZlUmV2b2tlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHtcbiAgICByZXR1cm4gbmF0aXZlUmV2b2tlT2JqZWN0VVJMLmFwcGx5KE5hdGl2ZVVSTCwgYXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbnNldFRvU3RyaW5nVGFnKFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7XG5cbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBVUkw6IFVSTENvbnN0cnVjdG9yXG59KTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IG5ldyBVUkwoJ2I/YT0xJmI9MiZjPTMnLCAnaHR0cDovL2EnKTtcbiAgdmFyIHNlYXJjaFBhcmFtcyA9IHVybC5zZWFyY2hQYXJhbXM7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdXJsLnBhdGhuYW1lID0gJ2MlMjBkJztcbiAgc2VhcmNoUGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBzZWFyY2hQYXJhbXNbJ2RlbGV0ZSddKCdiJyk7XG4gICAgcmVzdWx0ICs9IGtleSArIHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIChJU19QVVJFICYmICF1cmwudG9KU09OKVxuICAgIHx8ICFzZWFyY2hQYXJhbXMuc29ydFxuICAgIHx8IHVybC5ocmVmICE9PSAnaHR0cDovL2EvYyUyMGQ/YT0xJmM9MydcbiAgICB8fCBzZWFyY2hQYXJhbXMuZ2V0KCdjJykgIT09ICczJ1xuICAgIHx8IFN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKCc/YT0xJykpICE9PSAnYT0xJ1xuICAgIHx8ICFzZWFyY2hQYXJhbXNbSVRFUkFUT1JdXG4gICAgLy8gdGhyb3dzIGluIEVkZ2VcbiAgICB8fCBuZXcgVVJMKCdodHRwczovL2FAYicpLnVzZXJuYW1lICE9PSAnYSdcbiAgICB8fCBuZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoJ2E9YicpKS5nZXQoJ2EnKSAhPT0gJ2InXG4gICAgLy8gbm90IHB1bnljb2RlZCBpbiBFZGdlXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL9GC0LXRgdGCJykuaG9zdCAhPT0gJ3huLS1lMWF5YmMnXG4gICAgLy8gbm90IGVzY2FwZWQgaW4gQ2hyb21lIDYyLVxuICAgIHx8IG5ldyBVUkwoJ2h0dHA6Ly9hI9CxJykuaGFzaCAhPT0gJyMlRDAlQjEnXG4gICAgLy8gZmFpbHMgaW4gQ2hyb21lIDY2LVxuICAgIHx8IHJlc3VsdCAhPT0gJ2ExYzMnXG4gICAgLy8gdGhyb3dzIGluIFNhZmFyaVxuICAgIHx8IG5ldyBVUkwoJ2h0dHA6Ly94JywgdW5kZWZpbmVkKS5ob3N0ICE9PSAneCc7XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9wdW55Y29kZS5qcy9ibG9iL21hc3Rlci9wdW55Y29kZS5qc1xudmFyIG1heEludCA9IDIxNDc0ODM2NDc7IC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcbnZhciBiYXNlID0gMzY7XG52YXIgdE1pbiA9IDE7XG52YXIgdE1heCA9IDI2O1xudmFyIHNrZXcgPSAzODtcbnZhciBkYW1wID0gNzAwO1xudmFyIGluaXRpYWxCaWFzID0gNzI7XG52YXIgaW5pdGlhbE4gPSAxMjg7IC8vIDB4ODBcbnZhciBkZWxpbWl0ZXIgPSAnLSc7IC8vICdcXHgyRCdcbnZhciByZWdleE5vbkFTQ0lJID0gL1teXFwwLVxcdTAwN0VdLzsgLy8gbm9uLUFTQ0lJIGNoYXJzXG52YXIgcmVnZXhTZXBhcmF0b3JzID0gL1suXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nOyAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG52YXIgT1ZFUkZMT1dfRVJST1IgPSAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnO1xudmFyIGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbjtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKi9cbnZhciB1Y3MyZGVjb2RlID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBjb3VudGVyID0gMDtcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcbiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgICAvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuICAgICAgdmFyIGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcbiAgICAgIGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLlxuICAgICAgICBvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGVcbiAgICAgICAgLy8gbmV4dCBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuXG4gICAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTtcbiAgICAgICAgY291bnRlci0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqL1xudmFyIGRpZ2l0VG9CYXNpYyA9IGZ1bmN0aW9uIChkaWdpdCkge1xuICAvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuICAvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcbiAgcmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KTtcbn07XG5cbi8qKlxuICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG4gKi9cbnZhciBhZGFwdCA9IGZ1bmN0aW9uIChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcbiAgdmFyIGsgPSAwO1xuICBkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuICBkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG4gIGZvciAoOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuICAgIGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcbiAgfVxuICByZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcbiAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgbWF4LXN0YXRlbWVudHNcbnZhciBlbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuXG4gIC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG4gIGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cbiAgLy8gQ2FjaGUgdGhlIGxlbmd0aC5cbiAgdmFyIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuICB2YXIgbiA9IGluaXRpYWxOO1xuICB2YXIgZGVsdGEgPSAwO1xuICB2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuICB2YXIgaSwgY3VycmVudFZhbHVlO1xuXG4gIC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgIGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG4gICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDsgLy8gbnVtYmVyIG9mIGJhc2ljIGNvZGUgcG9pbnRzLlxuICB2YXIgaGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aDsgLy8gbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cbiAgLy8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS5cbiAgaWYgKGJhc2ljTGVuZ3RoKSB7XG4gICAgb3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcbiAgfVxuXG4gIC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcbiAgd2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcbiAgICAvLyBBbGwgbm9uLWJhc2ljIGNvZGUgcG9pbnRzIDwgbiBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LiBGaW5kIHRoZSBuZXh0IGxhcmdlciBvbmU6XG4gICAgdmFyIG0gPSBtYXhJbnQ7XG4gICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG4gICAgICAgIG0gPSBjdXJyZW50VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LCBidXQgZ3VhcmQgYWdhaW5zdCBvdmVyZmxvdy5cbiAgICB2YXIgaGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxO1xuICAgIGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTtcbiAgICB9XG5cbiAgICBkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuICAgIG4gPSBtO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihPVkVSRkxPV19FUlJPUik7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFZhbHVlID09IG4pIHtcbiAgICAgICAgLy8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuXG4gICAgICAgIHZhciBxID0gZGVsdGE7XG4gICAgICAgIGZvciAodmFyIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuICAgICAgICAgIHZhciB0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcbiAgICAgICAgICBpZiAocSA8IHQpIGJyZWFrO1xuICAgICAgICAgIHZhciBxTWludXNUID0gcSAtIHQ7XG4gICAgICAgICAgdmFyIGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcbiAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCkpKTtcbiAgICAgICAgICBxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxKSkpO1xuICAgICAgICBiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuICAgICAgICBkZWx0YSA9IDA7XG4gICAgICAgICsraGFuZGxlZENQQ291bnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgKytkZWx0YTtcbiAgICArK247XG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gIHZhciBlbmNvZGVkID0gW107XG4gIHZhciBsYWJlbHMgPSBpbnB1dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx1MDAyRScpLnNwbGl0KCcuJyk7XG4gIHZhciBpLCBsYWJlbDtcbiAgZm9yIChpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgIGxhYmVsID0gbGFiZWxzW2ldO1xuICAgIGVuY29kZWQucHVzaChyZWdleE5vbkFTQ0lJLnRlc3QobGFiZWwpID8gJ3huLS0nICsgZW5jb2RlKGxhYmVsKSA6IGxhYmVsKTtcbiAgfVxuICByZXR1cm4gZW5jb2RlZC5qb2luKCcuJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogaW4gY29yZS1qc0A0LCBtb3ZlIC9tb2R1bGVzLyBkZXBlbmRlbmNpZXMgdG8gcHVibGljIGVudHJpZXMgZm9yIGJldHRlciBvcHRpbWl6YXRpb24gYnkgdG9vbHMgbGlrZSBgcHJlc2V0LWVudmBcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgVVNFX05BVElWRV9VUkwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXVybCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciAkZmV0Y2ggPSBnZXRCdWlsdEluKCdmZXRjaCcpO1xudmFyIEhlYWRlcnMgPSBnZXRCdWlsdEluKCdIZWFkZXJzJyk7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgVVJMX1NFQVJDSF9QQVJBTVMgPSAnVVJMU2VhcmNoUGFyYW1zJztcbnZhciBVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUiA9IFVSTF9TRUFSQ0hfUEFSQU1TICsgJ0l0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFVSTF9TRUFSQ0hfUEFSQU1TKTtcbnZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUik7XG5cbnZhciBwbHVzID0gL1xcKy9nO1xudmFyIHNlcXVlbmNlcyA9IEFycmF5KDQpO1xuXG52YXIgcGVyY2VudFNlcXVlbmNlID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gIHJldHVybiBzZXF1ZW5jZXNbYnl0ZXMgLSAxXSB8fCAoc2VxdWVuY2VzW2J5dGVzIC0gMV0gPSBSZWdFeHAoJygoPzolW1xcXFxkYS1mXXsyfSl7JyArIGJ5dGVzICsgJ30pJywgJ2dpJykpO1xufTtcblxudmFyIHBlcmNlbnREZWNvZGUgPSBmdW5jdGlvbiAoc2VxdWVuY2UpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHNlcXVlbmNlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gc2VxdWVuY2U7XG4gIH1cbn07XG5cbnZhciBkZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gaXQucmVwbGFjZShwbHVzLCAnICcpO1xuICB2YXIgYnl0ZXMgPSA0O1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB3aGlsZSAoYnl0ZXMpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHBlcmNlbnRTZXF1ZW5jZShieXRlcy0tKSwgcGVyY2VudERlY29kZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmaW5kID0gL1shJygpfl18JTIwL2c7XG5cbnZhciByZXBsYWNlID0ge1xuICAnISc6ICclMjEnLFxuICBcIidcIjogJyUyNycsXG4gICcoJzogJyUyOCcsXG4gICcpJzogJyUyOScsXG4gICd+JzogJyU3RScsXG4gICclMjAnOiAnKydcbn07XG5cbnZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICByZXR1cm4gcmVwbGFjZVttYXRjaF07XG59O1xuXG52YXIgc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoaXQpLnJlcGxhY2UoZmluZCwgcmVwbGFjZXIpO1xufTtcblxudmFyIHBhcnNlU2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHJlc3VsdCwgcXVlcnkpIHtcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBxdWVyeS5zcGxpdCgnJicpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGF0dHJpYnV0ZSwgZW50cnk7XG4gICAgd2hpbGUgKGluZGV4IDwgYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaW5kZXgrK107XG4gICAgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkge1xuICAgICAgICBlbnRyeSA9IGF0dHJpYnV0ZS5zcGxpdCgnPScpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAga2V5OiBkZXNlcmlhbGl6ZShlbnRyeS5zaGlmdCgpKSxcbiAgICAgICAgICB2YWx1ZTogZGVzZXJpYWxpemUoZW50cnkuam9pbignPScpKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciB1cGRhdGVTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAocXVlcnkpIHtcbiAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG4gIHBhcnNlU2VhcmNoUGFyYW1zKHRoaXMuZW50cmllcywgcXVlcnkpO1xufTtcblxudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gZnVuY3Rpb24gKHBhc3NlZCwgcmVxdWlyZWQpIHtcbiAgaWYgKHBhc3NlZCA8IHJlcXVpcmVkKSB0aHJvdyBUeXBlRXJyb3IoJ05vdCBlbm91Z2ggYXJndW1lbnRzJyk7XG59O1xuXG52YXIgVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IgPSBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKGZ1bmN0aW9uIEl0ZXJhdG9yKHBhcmFtcywga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUixcbiAgICBpdGVyYXRvcjogZ2V0SXRlcmF0b3IoZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZShwYXJhbXMpLmVudHJpZXMpLFxuICAgIGtpbmQ6IGtpbmRcbiAgfSk7XG59LCAnSXRlcmF0b3InLCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7XG4gIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgdmFyIHN0ZXAgPSBzdGF0ZS5pdGVyYXRvci5uZXh0KCk7XG4gIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gIGlmICghc3RlcC5kb25lKSB7XG4gICAgc3RlcC52YWx1ZSA9IGtpbmQgPT09ICdrZXlzJyA/IGVudHJ5LmtleSA6IGtpbmQgPT09ICd2YWx1ZXMnID8gZW50cnkudmFsdWUgOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV07XG4gIH0gcmV0dXJuIHN0ZXA7XG59KTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLXVybHNlYXJjaHBhcmFtc1xudmFyIFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gVVJMU2VhcmNoUGFyYW1zKC8qIGluaXQgKi8pIHtcbiAgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciwgVVJMX1NFQVJDSF9QQVJBTVMpO1xuICB2YXIgaW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgdGhhdCA9IHRoaXM7XG4gIHZhciBlbnRyaWVzID0gW107XG4gIHZhciBpdGVyYXRvck1ldGhvZCwgaXRlcmF0b3IsIG5leHQsIHN0ZXAsIGVudHJ5SXRlcmF0b3IsIGVudHJ5TmV4dCwgZmlyc3QsIHNlY29uZCwga2V5O1xuXG4gIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgIHR5cGU6IFVSTF9TRUFSQ0hfUEFSQU1TLFxuICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgdXBkYXRlVVJMOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sXG4gICAgdXBkYXRlU2VhcmNoUGFyYW1zOiB1cGRhdGVTZWFyY2hQYXJhbXNcbiAgfSk7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChpc09iamVjdChpbml0KSkge1xuICAgICAgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChpbml0KTtcbiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JNZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKGluaXQpO1xuICAgICAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHtcbiAgICAgICAgICBlbnRyeUl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoYW5PYmplY3Qoc3RlcC52YWx1ZSkpO1xuICAgICAgICAgIGVudHJ5TmV4dCA9IGVudHJ5SXRlcmF0b3IubmV4dDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoZmlyc3QgPSBlbnRyeU5leHQuY2FsbChlbnRyeUl0ZXJhdG9yKSkuZG9uZSB8fFxuICAgICAgICAgICAgKHNlY29uZCA9IGVudHJ5TmV4dC5jYWxsKGVudHJ5SXRlcmF0b3IpKS5kb25lIHx8XG4gICAgICAgICAgICAhZW50cnlOZXh0LmNhbGwoZW50cnlJdGVyYXRvcikuZG9uZVxuICAgICAgICAgICkgdGhyb3cgVHlwZUVycm9yKCdFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyJyk7XG4gICAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiBmaXJzdC52YWx1ZSArICcnLCB2YWx1ZTogc2Vjb25kLnZhbHVlICsgJycgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBmb3IgKGtleSBpbiBpbml0KSBpZiAoaGFzT3duKGluaXQsIGtleSkpIGVudHJpZXMucHVzaCh7IGtleToga2V5LCB2YWx1ZTogaW5pdFtrZXldICsgJycgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlU2VhcmNoUGFyYW1zKGVudHJpZXMsIHR5cGVvZiBpbml0ID09PSAnc3RyaW5nJyA/IGluaXQuY2hhckF0KDApID09PSAnPycgPyBpbml0LnNsaWNlKDEpIDogaW5pdCA6IGluaXQgKyAnJyk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlID0gVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG5yZWRlZmluZUFsbChVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsIHtcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuYXBwZW50YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWFwcGVuZFxuICBhcHBlbmQ6IGZ1bmN0aW9uIGFwcGVuZChuYW1lLCB2YWx1ZSkge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDIpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgc3RhdGUuZW50cmllcy5wdXNoKHsga2V5OiBuYW1lICsgJycsIHZhbHVlOiB2YWx1ZSArICcnIH0pO1xuICAgIHN0YXRlLnVwZGF0ZVVSTCgpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5kZWxldGVgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZGVsZXRlXG4gICdkZWxldGUnOiBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzO1xuICAgIHZhciBrZXkgPSBuYW1lICsgJyc7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KSBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBlbHNlIGluZGV4Kys7XG4gICAgfVxuICAgIHN0YXRlLnVwZGF0ZVVSTCgpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5nZXRgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZ2V0XG4gIGdldDogZnVuY3Rpb24gZ2V0KG5hbWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgICB2YXIga2V5ID0gbmFtZSArICcnO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgZm9yICg7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgcmV0dXJuIGVudHJpZXNbaW5kZXhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZ2V0QWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWdldGFsbFxuICBnZXRBbGw6IGZ1bmN0aW9uIGdldEFsbChuYW1lKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGtleSA9IG5hbWUgKyAnJztcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KSByZXN1bHQucHVzaChlbnRyaWVzW2luZGV4XS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmhhc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXNcbiAgaGFzOiBmdW5jdGlvbiBoYXMobmFtZSkge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBrZXkgPSBuYW1lICsgJyc7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXgrK10ua2V5ID09PSBrZXkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNldGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zZXRcbiAgc2V0OiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICB2YXIga2V5ID0gbmFtZSArICcnO1xuICAgIHZhciB2YWwgPSB2YWx1ZSArICcnO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChmb3VuZCkgZW50cmllcy5zcGxpY2UoaW5kZXgtLSwgMSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZvdW5kKSBlbnRyaWVzLnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IHZhbCB9KTtcbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zb3J0XG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoKSB7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTtcbiAgICB2YXIgZW50cmllcyA9IHN0YXRlLmVudHJpZXM7XG4gICAgLy8gQXJyYXkjc29ydCBpcyBub3Qgc3RhYmxlIGluIHNvbWUgZW5naW5lc1xuICAgIHZhciBzbGljZSA9IGVudHJpZXMuc2xpY2UoKTtcbiAgICB2YXIgZW50cnksIGVudHJpZXNJbmRleCwgc2xpY2VJbmRleDtcbiAgICBlbnRyaWVzLmxlbmd0aCA9IDA7XG4gICAgZm9yIChzbGljZUluZGV4ID0gMDsgc2xpY2VJbmRleCA8IHNsaWNlLmxlbmd0aDsgc2xpY2VJbmRleCsrKSB7XG4gICAgICBlbnRyeSA9IHNsaWNlW3NsaWNlSW5kZXhdO1xuICAgICAgZm9yIChlbnRyaWVzSW5kZXggPSAwOyBlbnRyaWVzSW5kZXggPCBzbGljZUluZGV4OyBlbnRyaWVzSW5kZXgrKykge1xuICAgICAgICBpZiAoZW50cmllc1tlbnRyaWVzSW5kZXhdLmtleSA+IGVudHJ5LmtleSkge1xuICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGVudHJpZXNJbmRleCwgMCwgZW50cnkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZW50cmllc0luZGV4ID09PSBzbGljZUluZGV4KSBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4gIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2sgLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgZW50cnk7XG4gICAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTtcbiAgICAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7XG4gICAgfVxuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5rZXlzYCBtZXRob2RcbiAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICdrZXlzJyk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IodGhpcywgJ3ZhbHVlcycpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2RcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICdlbnRyaWVzJyk7XG4gIH1cbn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxucmVkZWZpbmUoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCBJVEVSQVRPUiwgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmVudHJpZXMpO1xuXG4vLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHNlYXJjaHBhcmFtcy1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbnJlZGVmaW5lKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcbiAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgcmVzdWx0LnB1c2goc2VyaWFsaXplKGVudHJ5LmtleSkgKyAnPScgKyBzZXJpYWxpemUoZW50cnkudmFsdWUpKTtcbiAgfSByZXR1cm4gcmVzdWx0LmpvaW4oJyYnKTtcbn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuc2V0VG9TdHJpbmdUYWcoVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTtcblxuJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhVVNFX05BVElWRV9VUkwgfSwge1xuICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yXG59KTtcblxuLy8gV3JhcCBgZmV0Y2hgIGZvciBjb3JyZWN0IHdvcmsgd2l0aCBwb2x5ZmlsbGVkIGBVUkxTZWFyY2hQYXJhbXNgXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc0XG5pZiAoIVVTRV9OQVRJVkVfVVJMICYmIHR5cGVvZiAkZmV0Y2ggPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSGVhZGVycyA9PSAnZnVuY3Rpb24nKSB7XG4gICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0IC8qICwgaW5pdCAqLykge1xuICAgICAgdmFyIGFyZ3MgPSBbaW5wdXRdO1xuICAgICAgdmFyIGluaXQsIGJvZHksIGhlYWRlcnM7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaW5pdCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGluaXQpKSB7XG4gICAgICAgICAgYm9keSA9IGluaXQuYm9keTtcbiAgICAgICAgICBpZiAoY2xhc3NvZihib2R5KSA9PT0gVVJMX1NFQVJDSF9QQVJBTVMpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBpbml0LmhlYWRlcnMgPyBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMpIDogbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgICAgIGlmICghaGVhZGVycy5oYXMoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXQgPSBjcmVhdGUoaW5pdCwge1xuICAgICAgICAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgU3RyaW5nKGJvZHkpKSxcbiAgICAgICAgICAgICAgaGVhZGVyczogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIGhlYWRlcnMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXJncy5wdXNoKGluaXQpO1xuICAgICAgfSByZXR1cm4gJGZldGNoLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLFxuICBnZXRTdGF0ZTogZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0KTtcbiAgaWYgKHR5cGVvZiBpdGVyYXRvck1ldGhvZCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICB9IHJldHVybiBhbk9iamVjdChpdGVyYXRvck1ldGhvZC5jYWxsKGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdG9qc29uXG4kKHsgdGFyZ2V0OiAnVVJMJywgcHJvdG86IHRydWUsIGVudW1lcmFibGU6IHRydWUgfSwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gVVJMLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMpO1xuICB9XG59KTtcbiIsIi8qKlxuICogd2ViLXN0cmVhbXMtcG9seWZpbGwgdjIuMS4xXG4gKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5XZWJTdHJlYW1zUG9seWZpbGwgPSB7fSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LnN5bWJvbFwiIC8+XG4gICAgdmFyIFN5bWJvbFBvbHlmaWxsID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/XG4gICAgICAgIFN5bWJvbCA6XG4gICAgICAgIGZ1bmN0aW9uIChkZXNjcmlwdGlvbikgeyByZXR1cm4gXCJTeW1ib2woXCIgKyBkZXNjcmlwdGlvbiArIFwiKVwiOyB9O1xuXG4gICAgLy8vIDxyZWZlcmVuY2UgbGliPVwiZG9tXCIgLz5cbiAgICBmdW5jdGlvbiBub29wKCkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc05hTiNQb2x5ZmlsbFxuICAgIHZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoeCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICAgIHJldHVybiB4ICE9PSB4O1xuICAgIH07XG5cbiAgICB2YXIgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uID0gIG5vb3A7XG5cbiAgICBmdW5jdGlvbiB0eXBlSXNPYmplY3QoeCkge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKSB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTGlzdChlbGVtZW50cykge1xuICAgICAgICAvLyBXZSB1c2UgYXJyYXlzIHRvIHJlcHJlc2VudCBsaXN0cywgc28gdGhpcyBpcyBiYXNpY2FsbHkgYSBuby1vcC5cbiAgICAgICAgLy8gRG8gYSBzbGljZSB0aG91Z2gganVzdCBpbiBjYXNlIHdlIGhhcHBlbiB0byBkZXBlbmQgb24gdGhlIHVuaXF1ZS1uZXNzLlxuICAgICAgICByZXR1cm4gZWxlbWVudHMuc2xpY2UoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gQXJyYXlCdWZmZXJDb3B5KGRlc3QsIGRlc3RPZmZzZXQsIHNyYywgc3JjT2Zmc2V0LCBuKSB7XG4gICAgICAgIG5ldyBVaW50OEFycmF5KGRlc3QpLnNldChuZXcgVWludDhBcnJheShzcmMsIHNyY09mZnNldCwgbiksIGRlc3RPZmZzZXQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHYpIHtcbiAgICAgICAgaWYgKElzTm9uTmVnYXRpdmVOdW1iZXIodikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHYgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIElzTm9uTmVnYXRpdmVOdW1iZXIodikge1xuICAgICAgICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlcklzTmFOKHYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHYgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIENhbGwoRiwgViwgYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIEYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKEYsIFYsIGFyZ3MpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nT2JqZWN0LCBtZXRob2ROYW1lLCBhbGdvQXJnQ291bnQsIGV4dHJhQXJncykge1xuICAgICAgICB2YXIgbWV0aG9kID0gdW5kZXJseWluZ09iamVjdFttZXRob2ROYW1lXTtcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobWV0aG9kICsgXCIgaXMgbm90IGEgbWV0aG9kXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChhbGdvQXJnQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlQ2FsbChtZXRob2QsIHVuZGVybHlpbmdPYmplY3QsIGV4dHJhQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bGxBcmdzID0gW2FyZ10uY29uY2F0KGV4dHJhQXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZUNhbGwobWV0aG9kLCB1bmRlcmx5aW5nT2JqZWN0LCBmdWxsQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7IH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIEludm9rZU9yTm9vcChPLCBQLCBhcmdzKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBPW1BdO1xuICAgICAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhbGwobWV0aG9kLCBPLCBhcmdzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUHJvbWlzZUNhbGwoRiwgViwgYXJncykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoQ2FsbChGLCBWLCBhcmdzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTm90IGltcGxlbWVudGVkIGNvcnJlY3RseVxuICAgIGZ1bmN0aW9uIFRyYW5zZmVyQXJyYXlCdWZmZXIoTykge1xuICAgICAgICByZXR1cm4gTztcbiAgICB9XG4gICAgLy8gTm90IGltcGxlbWVudGVkIGNvcnJlY3RseVxuICAgIGZ1bmN0aW9uIElzRGV0YWNoZWRCdWZmZXIoTykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKSB7XG4gICAgICAgIGhpZ2hXYXRlck1hcmsgPSBOdW1iZXIoaGlnaFdhdGVyTWFyayk7XG4gICAgICAgIGlmIChOdW1iZXJJc05hTihoaWdoV2F0ZXJNYXJrKSB8fCBoaWdoV2F0ZXJNYXJrIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2hpZ2hXYXRlck1hcmsgcHJvcGVydHkgb2YgYSBxdWV1aW5nIHN0cmF0ZWd5IG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBub24tTmFOJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2hXYXRlck1hcms7XG4gICAgfVxuICAgIGZ1bmN0aW9uIE1ha2VTaXplQWxnb3JpdGhtRnJvbVNpemVGdW5jdGlvbihzaXplKSB7XG4gICAgICAgIGlmIChzaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZSBwcm9wZXJ0eSBvZiBhIHF1ZXVpbmcgc3RyYXRlZ3kgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjaHVuaykgeyByZXR1cm4gc2l6ZShjaHVuayk7IH07XG4gICAgfVxuICAgIHZhciBvcmlnaW5hbFByb21pc2UgPSBQcm9taXNlO1xuICAgIHZhciBvcmlnaW5hbFByb21pc2VUaGVuID0gUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcbiAgICB2YXIgb3JpZ2luYWxQcm9taXNlUmVzb2x2ZSA9IFByb21pc2UucmVzb2x2ZS5iaW5kKG9yaWdpbmFsUHJvbWlzZSk7XG4gICAgdmFyIG9yaWdpbmFsUHJvbWlzZVJlamVjdCA9IFByb21pc2UucmVqZWN0LmJpbmQob3JpZ2luYWxQcm9taXNlKTtcbiAgICBmdW5jdGlvbiBuZXdQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgb3JpZ2luYWxQcm9taXNlKGV4ZWN1dG9yKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvbWlzZVJlc29sdmVkV2l0aCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxQcm9taXNlUmVzb2x2ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb21pc2VSZWplY3RlZFdpdGgocmVhc29uKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbFByb21pc2VSZWplY3QocmVhc29uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIC8vIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gY29ycmVjdGx5IGVtdWxhdGUgdGhlIGJlaGF2aW91ciBmcm9tIEphdmFTY3JpcHQsIHNvIHRoaXMgaXMganVzdCBhblxuICAgICAgICAvLyBhcHByb3hpbWF0aW9uLlxuICAgICAgICByZXR1cm4gb3JpZ2luYWxQcm9taXNlVGhlbi5jYWxsKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBvblByb21pc2UocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgUGVyZm9ybVByb21pc2VUaGVuKFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCksIHVuZGVmaW5lZCwgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBvbkZ1bGZpbGxtZW50KHByb21pc2UsIG9uRnVsZmlsbGVkKSB7XG4gICAgICAgIHVwb25Qcm9taXNlKHByb21pc2UsIG9uRnVsZmlsbGVkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBvblJlamVjdGlvbihwcm9taXNlLCBvblJlamVjdGVkKSB7XG4gICAgICAgIHVwb25Qcm9taXNlKHByb21pc2UsIHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVByb21pc2VXaXRoKHByb21pc2UsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcikge1xuICAgICAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocHJvbWlzZSkge1xuICAgICAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgdW5kZWZpbmVkLCByZXRocm93QXNzZXJ0aW9uRXJyb3JSZWplY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIE9yaWdpbmFsIGZyb20gQ2hyb21pdW1cbiAgICAvLyBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLysvMGFlZTQ0MzRhNGRiYTQyYTQyYWJhZWE5YmZiYzBjZDE5NmE2M2JjMS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N0cmVhbXMvU2ltcGxlUXVldWUuanNcbiAgICB2YXIgUVVFVUVfTUFYX0FSUkFZX1NJWkUgPSAxNjM4NDtcbiAgICAvKipcbiAgICAgKiBTaW1wbGUgcXVldWUgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogQXZvaWRzIHNjYWxhYmlsaXR5IGlzc3VlcyB3aXRoIHVzaW5nIGEgcGFja2VkIGFycmF5IGRpcmVjdGx5IGJ5IHVzaW5nXG4gICAgICogbXVsdGlwbGUgYXJyYXlzIGluIGEgbGlua2VkIGxpc3QgYW5kIGtlZXBpbmcgdGhlIGFycmF5IHNpemUgYm91bmRlZC5cbiAgICAgKi9cbiAgICB2YXIgU2ltcGxlUXVldWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFNpbXBsZVF1ZXVlKCkge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICAgICAgLy8gX2Zyb250IGFuZCBfYmFjayBhcmUgYWx3YXlzIGRlZmluZWQuXG4gICAgICAgICAgICB0aGlzLl9mcm9udCA9IHtcbiAgICAgICAgICAgICAgICBfZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgICAgIF9uZXh0OiB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9iYWNrID0gdGhpcy5fZnJvbnQ7XG4gICAgICAgICAgICAvLyBUaGUgY3Vyc29yIGlzIHVzZWQgdG8gYXZvaWQgY2FsbGluZyBBcnJheS5zaGlmdCgpLlxuICAgICAgICAgICAgLy8gSXQgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBmcm9udCBlbGVtZW50IG9mIHRoZSBhcnJheSBpbnNpZGUgdGhlXG4gICAgICAgICAgICAvLyBmcm9udC1tb3N0IG5vZGUuIEl0IGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgWzAsIFFVRVVFX01BWF9BUlJBWV9TSVpFKS5cbiAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG9ubHkgb25lIG5vZGUsIHNpemUgPT09IGVsZW1lbnRzLmxlbmd0aCAtIGN1cnNvci5cbiAgICAgICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTaW1wbGVRdWV1ZS5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEZvciBleGNlcHRpb24gc2FmZXR5LCB0aGlzIG1ldGhvZCBpcyBzdHJ1Y3R1cmVkIGluIG9yZGVyOlxuICAgICAgICAvLyAxLiBSZWFkIHN0YXRlXG4gICAgICAgIC8vIDIuIENhbGN1bGF0ZSByZXF1aXJlZCBzdGF0ZSBtdXRhdGlvbnNcbiAgICAgICAgLy8gMy4gUGVyZm9ybSBzdGF0ZSBtdXRhdGlvbnNcbiAgICAgICAgU2ltcGxlUXVldWUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIG9sZEJhY2sgPSB0aGlzLl9iYWNrO1xuICAgICAgICAgICAgdmFyIG5ld0JhY2sgPSBvbGRCYWNrO1xuICAgICAgICAgICAgaWYgKG9sZEJhY2suX2VsZW1lbnRzLmxlbmd0aCA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUgLSAxKSB7XG4gICAgICAgICAgICAgICAgbmV3QmFjayA9IHtcbiAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgX25leHQ6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwdXNoKCkgaXMgdGhlIG11dGF0aW9uIG1vc3QgbGlrZWx5IHRvIHRocm93IGFuIGV4Y2VwdGlvbiwgc28gaXRcbiAgICAgICAgICAgIC8vIGdvZXMgZmlyc3QuXG4gICAgICAgICAgICBvbGRCYWNrLl9lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKG5ld0JhY2sgIT09IG9sZEJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iYWNrID0gbmV3QmFjaztcbiAgICAgICAgICAgICAgICBvbGRCYWNrLl9uZXh0ID0gbmV3QmFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsrdGhpcy5fc2l6ZTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTGlrZSBwdXNoKCksIHNoaWZ0KCkgZm9sbG93cyB0aGUgcmVhZCAtPiBjYWxjdWxhdGUgLT4gbXV0YXRlIHBhdHRlcm4gZm9yXG4gICAgICAgIC8vIGV4Y2VwdGlvbiBzYWZldHkuXG4gICAgICAgIFNpbXBsZVF1ZXVlLnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHsgLy8gbXVzdCBub3QgYmUgY2FsbGVkIG9uIGFuIGVtcHR5IHF1ZXVlXG4gICAgICAgICAgICB2YXIgb2xkRnJvbnQgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgICAgIHZhciBuZXdGcm9udCA9IG9sZEZyb250O1xuICAgICAgICAgICAgdmFyIG9sZEN1cnNvciA9IHRoaXMuX2N1cnNvcjtcbiAgICAgICAgICAgIHZhciBuZXdDdXJzb3IgPSBvbGRDdXJzb3IgKyAxO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gb2xkRnJvbnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tvbGRDdXJzb3JdO1xuICAgICAgICAgICAgaWYgKG5ld0N1cnNvciA9PT0gUVVFVUVfTUFYX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBuZXdGcm9udCA9IG9sZEZyb250Ll9uZXh0O1xuICAgICAgICAgICAgICAgIG5ld0N1cnNvciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBObyBtdXRhdGlvbnMgYmVmb3JlIHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAtLXRoaXMuX3NpemU7XG4gICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSBuZXdDdXJzb3I7XG4gICAgICAgICAgICBpZiAob2xkRnJvbnQgIT09IG5ld0Zyb250KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnJvbnQgPSBuZXdGcm9udDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBlcm1pdCBzaGlmdGVkIGVsZW1lbnQgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICAgICAgICBlbGVtZW50c1tvbGRDdXJzb3JdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRoZSB0cmlja3kgdGhpbmcgYWJvdXQgZm9yRWFjaCgpIGlzIHRoYXQgaXQgY2FuIGJlIGNhbGxlZFxuICAgICAgICAvLyByZS1lbnRyYW50bHkuIFRoZSBxdWV1ZSBtYXkgYmUgbXV0YXRlZCBpbnNpZGUgdGhlIGNhbGxiYWNrLiBJdCBpcyBlYXN5IHRvXG4gICAgICAgIC8vIHNlZSB0aGF0IHB1c2goKSB3aXRoaW4gdGhlIGNhbGxiYWNrIGhhcyBubyBuZWdhdGl2ZSBlZmZlY3RzIHNpbmNlIHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHF1ZXVlIGlzIGNoZWNrZWQgZm9yIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4gSWYgc2hpZnQoKSBpcyBjYWxsZWRcbiAgICAgICAgLy8gcmVwZWF0ZWRseSB3aXRoaW4gdGhlIGNhbGxiYWNrIHRoZW4gdGhlIG5leHQgaXRlcmF0aW9uIG1heSByZXR1cm4gYW5cbiAgICAgICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuIEluIHRoaXMgY2FzZSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWRcbiAgICAgICAgLy8gd2l0aCB1bmRlZmluZWQgdmFsdWVzIHVudGlsIHdlIGVpdGhlciBcImNhdGNoIHVwXCIgd2l0aCBlbGVtZW50cyB0aGF0IHN0aWxsXG4gICAgICAgIC8vIGV4aXN0IG9yIHJlYWNoIHRoZSBiYWNrIG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgU2ltcGxlUXVldWUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IG5vZGUuX2VsZW1lbnRzO1xuICAgICAgICAgICAgd2hpbGUgKGkgIT09IGVsZW1lbnRzLmxlbmd0aCB8fCBub2RlLl9uZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLl9uZXh0O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9IG5vZGUuX2VsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZWxlbWVudHNbaV0pO1xuICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgaWYgc2hpZnQoKSB3YXMgY2FsbGVkIG5vdyxcbiAgICAgICAgLy8gd2l0aG91dCBtb2RpZnlpbmcgdGhlIHF1ZXVlLlxuICAgICAgICBTaW1wbGVRdWV1ZS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHsgLy8gbXVzdCBub3QgYmUgY2FsbGVkIG9uIGFuIGVtcHR5IHF1ZXVlXG4gICAgICAgICAgICB2YXIgZnJvbnQgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLl9jdXJzb3I7XG4gICAgICAgICAgICByZXR1cm4gZnJvbnQuX2VsZW1lbnRzW2N1cnNvcl07XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBTaW1wbGVRdWV1ZTtcbiAgICB9KCkpO1xuXG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZhbHVlLCBkb25lLCBmb3JBdXRob3JDb2RlKSB7XG4gICAgICAgIHZhciBwcm90b3R5cGUgPSBudWxsO1xuICAgICAgICBpZiAoZm9yQXV0aG9yQ29kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgb2JqLmRvbmUgPSBkb25lO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHJlYWRlciwgc3RyZWFtKSB7XG4gICAgICAgIHJlYWRlci5fZm9yQXV0aG9yQ29kZSA9IHRydWU7XG4gICAgICAgIHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgc3RyZWFtLl9yZWFkZXIgPSByZWFkZXI7XG4gICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZChyZWFkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEEgY2xpZW50IG9mIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciBhbmQgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZVxuICAgIC8vIGNoZWNrLlxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbChyZWFkZXIsIHJlYXNvbikge1xuICAgICAgICB2YXIgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcikge1xuICAgICAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCBuZXcgVHlwZUVycm9yKCdSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtXFwncyBjbG9zZWRuZXNzJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCBuZXcgVHlwZUVycm9yKCdSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtXFwncyBjbG9zZWRuZXNzJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbS5fcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSByZWFkZXJzLlxuICAgIGZ1bmN0aW9uIHJlYWRlckxvY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQ2Fubm90ICcgKyBuYW1lICsgJyBhIHN0cmVhbSB1c2luZyBhIHJlbGVhc2VkIHJlYWRlcicpO1xuICAgIH1cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpIHtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbikge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHJlYWRlcikge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgcmVhc29uKSB7XG4gICAgICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocmVhZGVyLl9jbG9zZWRQcm9taXNlKTtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCByZWFzb24pIHtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZShyZWFkZXIpIHtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIENhbmNlbFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbQ2FuY2VsU3RlcHNdXScpO1xuICAgIHZhciBQdWxsU3RlcHMgPSBTeW1ib2xQb2x5ZmlsbCgnW1tQdWxsU3RlcHNdXScpO1xuXG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtLCBmb3JBdXRob3JDb2RlKSB7XG4gICAgICAgIGlmIChmb3JBdXRob3JDb2RlID09PSB2b2lkIDApIHsgZm9yQXV0aG9yQ29kZSA9IGZhbHNlOyB9XG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG4gICAgICAgIHJlYWRlci5fZm9yQXV0aG9yQ29kZSA9IGZvckF1dGhvckNvZGU7XG4gICAgICAgIHJldHVybiByZWFkZXI7XG4gICAgfVxuICAgIC8vIFJlYWRhYmxlU3RyZWFtIEFQSSBleHBvc2VkIGZvciBjb250cm9sbGVycy5cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUFkZFJlYWRSZXF1ZXN0KHN0cmVhbSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlYWRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIF9yZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIF9yZWplY3Q6IHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHN0cmVhbS5fcmVhZGVyLl9yZWFkUmVxdWVzdHMucHVzaChyZWFkUmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3Qoc3RyZWFtLCBjaHVuaywgZG9uZSkge1xuICAgICAgICB2YXIgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgICAgIHZhciByZWFkUmVxdWVzdCA9IHJlYWRlci5fcmVhZFJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIHJlYWRSZXF1ZXN0Ll9yZXNvbHZlKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChjaHVuaywgZG9uZSwgcmVhZGVyLl9mb3JBdXRob3JDb2RlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkge1xuICAgICAgICByZXR1cm4gc3RyZWFtLl9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5sZW5ndGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihzdHJlYW0pIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSkge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFJlYWRhYmxlU3RyZWFtIGluc3RhbmNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSByZWFkaW5nIGJ5IGFub3RoZXIgcmVhZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZSwgXCJjbG9zZWRcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2FuY2VsJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwodGhpcywgcmVhc29uKTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWFkJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ3JlYWQgZnJvbScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLnJlbGVhc2VMb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWxlYXNlTG9jaycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWFkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIHJlbGVhc2UgYSByZWFkZXIgbG9jayB3aGVuIHRoYXQgcmVhZGVyIGhhcyBwZW5kaW5nIHJlYWQoKSBjYWxscyB1bi1zZXR0bGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIHJlYWRlcnMuXG4gICAgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoeCkge1xuICAgICAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZFJlcXVlc3RzJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh1bmRlZmluZWQsIHRydWUsIHJlYWRlci5fZm9yQXV0aG9yQ29kZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcltQdWxsU3RlcHNdKCk7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIuXG4gICAgZnVuY3Rpb24gZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUuXCIgKyBuYW1lICsgXCIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclwiKTtcbiAgICB9XG5cbiAgICAvLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTguYXN5bmNpdGVyYWJsZVwiIC8+XG4gICAgdmFyIF9hO1xuICAgIHZhciBBc3luY0l0ZXJhdG9yUHJvdG90eXBlO1xuICAgIGlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbnNpZGUgYSBFUzIwMTgrIGVudmlyb25tZW50LCBidXQgd2UncmUgY29tcGlsaW5nIHRvIGFuIG9sZGVyIHN5bnRheC5cbiAgICAgICAgLy8gV2UgY2Fubm90IGFjY2VzcyAlQXN5bmNJdGVyYXRvclByb3RvdHlwZSUgd2l0aG91dCBub24tRVMyMDE4IHN5bnRheCwgYnV0IHdlIGNhbiByZS1jcmVhdGUgaXQuXG4gICAgICAgIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSAoX2EgPSB7fSxcbiAgICAgICAgICAgIC8vIDI1LjEuMy4xICVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSBbIEBAYXN5bmNJdGVyYXRvciBdICggKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXN5bmNpdGVyYXRvcnByb3RvdHlwZS1hc3luY2l0ZXJhdG9yXG4gICAgICAgICAgICBfYVtTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3luY0l0ZXJhdG9yUHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yLCB7IGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8vLyA8cmVmZXJlbmNlIGxpYj1cImVzMjAxOC5hc3luY2l0ZXJhYmxlXCIgLz5cbiAgICB2YXIgUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlID0ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24oJ25leHQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gdGhpcy5fYXN5bmNJdGVyYXRvclJlYWRlcjtcbiAgICAgICAgICAgIGlmIChyZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2l0ZXJhdGUnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRvbmUgPSByZXN1bHQuZG9uZTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZhbHVlLCBkb25lLCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXR1cm46IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKCduZXh0JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlYWRlciA9IHRoaXMuX2FzeW5jSXRlcmF0b3JSZWFkZXI7XG4gICAgICAgICAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdmaW5pc2ggaXRlcmF0aW5nJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlYWRlci5fcmVhZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9wcmV2ZW50Q2FuY2VsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwocmVhZGVyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChyZXN1bHQsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZhbHVlLCB0cnVlLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmIChBc3luY0l0ZXJhdG9yUHJvdG90eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUsICduZXh0JywgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlLCAncmV0dXJuJywgeyBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICAvLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG4gICAgZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcihzdHJlYW0sIHByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgaWYgKHByZXZlbnRDYW5jZWwgPT09IHZvaWQgMCkgeyBwcmV2ZW50Q2FuY2VsID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICBpdGVyYXRvci5fYXN5bmNJdGVyYXRvclJlYWRlciA9IHJlYWRlcjtcbiAgICAgICAgaXRlcmF0b3IuX3ByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpO1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHgpIHtcbiAgICAgICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2FzeW5jSXRlcmF0b3JSZWFkZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG4gICAgZnVuY3Rpb24gc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvci5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdGVhbUFzeW5jSXRlcmF0b3JcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRGVxdWV1ZVZhbHVlKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgcGFpciA9IGNvbnRhaW5lci5fcXVldWUuc2hpZnQoKTtcbiAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSAtPSBwYWlyLnNpemU7XG4gICAgICAgIGlmIChjb250YWluZXIuX3F1ZXVlVG90YWxTaXplIDwgMCkge1xuICAgICAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhaXIudmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRhaW5lciwgdmFsdWUsIHNpemUpIHtcbiAgICAgICAgc2l6ZSA9IE51bWJlcihzaXplKTtcbiAgICAgICAgaWYgKCFJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignU2l6ZSBtdXN0IGJlIGEgZmluaXRlLCBub24tTmFOLCBub24tbmVnYXRpdmUgbnVtYmVyLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lci5fcXVldWUucHVzaCh7IHZhbHVlOiB2YWx1ZSwgc2l6ZTogc2l6ZSB9KTtcbiAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSArPSBzaXplO1xuICAgIH1cbiAgICBmdW5jdGlvbiBQZWVrUXVldWVWYWx1ZShjb250YWluZXIpIHtcbiAgICAgICAgdmFyIHBhaXIgPSBjb250YWluZXIuX3F1ZXVlLnBlZWsoKTtcbiAgICAgICAgcmV0dXJuIHBhaXIudmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlc2V0UXVldWUoY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lci5fcXVldWUgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIEFib3J0U3RlcHMgPSBTeW1ib2xQb2x5ZmlsbCgnW1tBYm9ydFN0ZXBzXV0nKTtcbiAgICB2YXIgRXJyb3JTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0Vycm9yU3RlcHNdXScpO1xuICAgIHZhciBXcml0YWJsZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW0odW5kZXJseWluZ1NpbmssIHN0cmF0ZWd5KSB7XG4gICAgICAgICAgICBpZiAodW5kZXJseWluZ1NpbmsgPT09IHZvaWQgMCkgeyB1bmRlcmx5aW5nU2luayA9IHt9OyB9XG4gICAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IHZvaWQgMCkgeyBzdHJhdGVneSA9IHt9OyB9XG4gICAgICAgICAgICBJbml0aWFsaXplV3JpdGFibGVTdHJlYW0odGhpcyk7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHN0cmF0ZWd5LnNpemU7XG4gICAgICAgICAgICB2YXIgaGlnaFdhdGVyTWFyayA9IHN0cmF0ZWd5LmhpZ2hXYXRlck1hcms7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IHVuZGVybHlpbmdTaW5rLnR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzaXplQWxnb3JpdGhtID0gTWFrZVNpemVBbGdvcml0aG1Gcm9tU2l6ZUZ1bmN0aW9uKHNpemUpO1xuICAgICAgICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcmsgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgICAgIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU2luayh0aGlzLCB1bmRlcmx5aW5nU2luaywgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgXCJsb2NrZWRcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24oJ2xvY2tlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdhYm9ydCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGFib3J0IGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLCByZWFzb24pO1xuICAgICAgICB9O1xuICAgICAgICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQodGhpcykgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2xvc2UgYW4gYWxyZWFkeS1jbG9zaW5nIHN0cmVhbScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbUNsb3NlKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuZ2V0V3JpdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbignZ2V0V3JpdGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoc3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBuZXcgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSk7XG4gICAgfVxuICAgIC8vIFRocm93cyBpZiBhbmQgb25seSBpZiBzdGFydEFsZ29yaXRobSB0aHJvd3MuXG4gICAgZnVuY3Rpb24gQ3JlYXRlV3JpdGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHZvaWQgMCkgeyBoaWdoV2F0ZXJNYXJrID0gMTsgfVxuICAgICAgICBpZiAoc2l6ZUFsZ29yaXRobSA9PT0gdm9pZCAwKSB7IHNpemVBbGdvcml0aG0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9OyB9XG4gICAgICAgIHZhciBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgICAgIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbShzdHJlYW0pO1xuICAgICAgICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgICAgICBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfVxuICAgIGZ1bmN0aW9uIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbShzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLl9zdGF0ZSA9ICd3cml0YWJsZSc7XG4gICAgICAgIC8vIFRoZSBlcnJvciB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYnkgbmV3IG1ldGhvZCBjYWxscyBvbmNlIHRoZSBzdGF0ZSBiZWNvbWVzIGVycm9yZWQuIE9ubHkgc2V0IHdoZW4gW1tzdGF0ZV1dIGlzXG4gICAgICAgIC8vICdlcnJvcmluZycgb3IgJ2Vycm9yZWQnLiBNYXkgYmUgc2V0IHRvIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAgICAgICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RyZWFtLl93cml0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdG8gdW5kZWZpbmVkIGZpcnN0IGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjb250cm9sbGVyIGNoZWNrcyB0aGlzXG4gICAgICAgIC8vIHZhcmlhYmxlIHRvIHZhbGlkYXRlIHRoZSBjYWxsZXIuXG4gICAgICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBUaGlzIHF1ZXVlIGlzIHBsYWNlZCBoZXJlIGluc3RlYWQgb2YgdGhlIHdyaXRlciBjbGFzcyBpbiBvcmRlciB0byBhbGxvdyBmb3IgcGFzc2luZyBhIHdyaXRlciB0byB0aGUgbmV4dCBkYXRhXG4gICAgICAgIC8vIHByb2R1Y2VyIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHF1ZXVlZCB3cml0ZXMgdG8gZmluaXNoLlxuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgLy8gV3JpdGUgcmVxdWVzdHMgYXJlIHJlbW92ZWQgZnJvbSBfd3JpdGVSZXF1ZXN0cyB3aGVuIHdyaXRlKCkgaXMgY2FsbGVkIG9uIHRoZSB1bmRlcmx5aW5nIHNpbmsuIFRoaXMgcHJldmVudHNcbiAgICAgICAgLy8gdGhlbSBmcm9tIGJlaW5nIGVycm9uZW91c2x5IHJlamVjdGVkIG9uIGVycm9yLiBJZiBhIHdyaXRlKCkgY2FsbCBpcyBpbi1mbGlnaHQsIHRoZSByZXF1ZXN0IGlzIHN0b3JlZCBoZXJlLlxuICAgICAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBUaGUgcHJvbWlzZSB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHdyaXRlci5jbG9zZSgpLiBTdG9yZWQgaGVyZSBiZWNhdXNlIGl0IG1heSBiZSBmdWxmaWxsZWQgYWZ0ZXIgdGhlIHdyaXRlclxuICAgICAgICAvLyBoYXMgYmVlbiBkZXRhY2hlZC5cbiAgICAgICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIENsb3NlIHJlcXVlc3QgaXMgcmVtb3ZlZCBmcm9tIF9jbG9zZVJlcXVlc3Qgd2hlbiBjbG9zZSgpIGlzIGNhbGxlZCBvbiB0aGUgdW5kZXJseWluZyBzaW5rLiBUaGlzIHByZXZlbnRzIGl0XG4gICAgICAgIC8vIGZyb20gYmVpbmcgZXJyb25lb3VzbHkgcmVqZWN0ZWQgb24gZXJyb3IuIElmIGEgY2xvc2UoKSBjYWxsIGlzIGluLWZsaWdodCwgdGhlIHJlcXVlc3QgaXMgc3RvcmVkIGhlcmUuXG4gICAgICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFRoZSBwcm9taXNlIHRoYXQgd2FzIHJldHVybmVkIGZyb20gd3JpdGVyLmFib3J0KCkuIFRoaXMgbWF5IGFsc28gYmUgZnVsZmlsbGVkIGFmdGVyIHRoZSB3cml0ZXIgaGFzIGRldGFjaGVkLlxuICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFRoZSBiYWNrcHJlc3N1cmUgc2lnbmFsIHNldCBieSB0aGUgY29udHJvbGxlci5cbiAgICAgICAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbSh4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ193cml0YWJsZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkge1xuICAgICAgICBpZiAoc3RyZWFtLl93cml0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUFib3J0KHN0cmVhbSwgcmVhc29uKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcgfHwgc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdhc0FscmVhZHlFcnJvcmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgIHdhc0FscmVhZHlFcnJvcmluZyA9IHRydWU7XG4gICAgICAgICAgICAvLyByZWFzb24gd2lsbCBub3QgYmUgdXNlZCwgc28gZG9uJ3Qga2VlcCBhIHJlZmVyZW5jZSB0byBpdC5cbiAgICAgICAgICAgIHJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIF9wcm9taXNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX3Jlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgX3JlamVjdDogcmVqZWN0LFxuICAgICAgICAgICAgICAgIF9yZWFzb246IHJlYXNvbixcbiAgICAgICAgICAgICAgICBfd2FzQWxyZWFkeUVycm9yaW5nOiB3YXNBbHJlYWR5RXJyb3JpbmdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2UgPSBwcm9taXNlO1xuICAgICAgICBpZiAod2FzQWxyZWFkeUVycm9yaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pIHtcbiAgICAgICAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKFwiVGhlIHN0cmVhbSAoaW4gXCIgKyBzdGF0ZSArIFwiIHN0YXRlKSBpcyBub3QgaW4gdGhlIHdyaXRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkXCIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIGNsb3NlUmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICBfcmVqZWN0OiByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IGNsb3NlUmVxdWVzdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjtcbiAgICAgICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkICYmIHN0cmVhbS5fYmFja3ByZXNzdXJlID09PSB0cnVlICYmIHN0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICAvLyBXcml0YWJsZVN0cmVhbSBBUEkgZXhwb3NlZCBmb3IgY29udHJvbGxlcnMuXG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgd3JpdGVSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIF9yZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIF9yZWplY3Q6IHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5wdXNoKHdyaXRlUmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3Jpbmcoc3RyZWFtKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgICAgIHN0cmVhbS5fc3RhdGUgPSAnZXJyb3JpbmcnO1xuICAgICAgICBzdHJlYW0uX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgICAgICB2YXIgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0KHN0cmVhbSkgPT09IGZhbHNlICYmIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3Jpbmcoc3RyZWFtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uX3N0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltFcnJvclN0ZXBzXSgpO1xuICAgICAgICB2YXIgc3RvcmVkRXJyb3IgPSBzdHJlYW0uX3N0b3JlZEVycm9yO1xuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAod3JpdGVSZXF1ZXN0KSB7XG4gICAgICAgICAgICB3cml0ZVJlcXVlc3QuX3JlamVjdChzdG9yZWRFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFib3J0UmVxdWVzdCA9IHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdDtcbiAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoYWJvcnRSZXF1ZXN0Ll93YXNBbHJlYWR5RXJyb3JpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGFib3J0UmVxdWVzdC5fcmVqZWN0KHN0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQoc3RyZWFtKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvbWlzZSA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyW0Fib3J0U3RlcHNdKGFib3J0UmVxdWVzdC5fcmVhc29uKTtcbiAgICAgICAgdXBvblByb21pc2UocHJvbWlzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYWJvcnRSZXF1ZXN0Ll9yZXNvbHZlKCk7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGFib3J0UmVxdWVzdC5fcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUoc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0Ll9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIHdhcyB0b28gbGF0ZSB0byBkbyBhbnl0aGluZywgc28gaXQgaXMgaWdub3JlZC5cbiAgICAgICAgICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Jlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICAgICAgICB2YXIgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gTmV2ZXIgZXhlY3V0ZSBzaW5rIGFib3J0KCkgYWZ0ZXIgc2luayBjbG9zZSgpLlxuICAgICAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uKHN0cmVhbSwgZXJyb3IpO1xuICAgIH1cbiAgICAvLyBUT0RPKHJpY2VhKTogRml4IGFscGhhYmV0aWNhbCBvcmRlci5cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pIHtcbiAgICAgICAgaWYgKHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID09PSB1bmRlZmluZWQgJiYgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtSGFzT3BlcmF0aW9uTWFya2VkSW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgICAgIGlmIChzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID09PSB1bmRlZmluZWQgJiYgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID0gc3RyZWFtLl9jbG9zZVJlcXVlc3Q7XG4gICAgICAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbU1hcmtGaXJzdFdyaXRlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gc3RyZWFtLl93cml0ZVJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQoc3RyZWFtKSB7XG4gICAgICAgIGlmIChzdHJlYW0uX2Nsb3NlUmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdC5fcmVqZWN0KHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgICAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgdmFyIHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgICAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQgJiYgYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICAgICAgaWYgKGJhY2twcmVzc3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCh3cml0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTtcbiAgICB9XG4gICAgdmFyIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSkge1xuICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW0oc3RyZWFtKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFdyaXRhYmxlU3RyZWFtIGluc3RhbmNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSB3cml0aW5nIGJ5IGFub3RoZXIgd3JpdGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICAgICAgc3RyZWFtLl93cml0ZXIgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pID09PSBmYWxzZSAmJiBzdHJlYW0uX2JhY2twcmVzc3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RvcmVkRXJyb3IgPSBzdHJlYW0uX3N0b3JlZEVycm9yO1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0aGlzLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0aGlzLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIFwiY2xvc2VkXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIFwiZGVzaXJlZFNpemVcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHRoaXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCBcInJlYWR5XCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWR5JykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Fib3J0JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCdhYm9ydCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCh0aGlzLCByZWFzb24pO1xuICAgICAgICB9O1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzdHJlYW0gPSB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ2Nsb3NlJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2xvc2UgYW4gYWxyZWFkeS1jbG9zaW5nIHN0cmVhbScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS5yZWxlYXNlTG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzdHJlYW0gPSB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCd3cml0ZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignd3JpdGUgdG8nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyV3JpdGUodGhpcywgY2h1bmspO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5cbiAgICBmdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19vd25lcldyaXRhYmxlU3RyZWFtJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQSBjbGllbnQgb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCh3cml0ZXIsIHJlYXNvbikge1xuICAgICAgICB2YXIgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydChzdHJlYW0sIHJlYXNvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHdyaXRlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZVdpdGhFcnJvclByb3BhZ2F0aW9uKHdyaXRlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSA9PT0gdHJ1ZSB8fCBzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh3cml0ZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVDbG9zZWRQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCBlcnJvcikge1xuICAgICAgICBpZiAod3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZCh3cml0ZXIsIGVycm9yKSB7XG4gICAgICAgIGlmICh3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHdyaXRlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2Uod3JpdGVyKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgICAgIHZhciByZWxlYXNlZEVycm9yID0gbmV3IFR5cGVFcnJvcignV3JpdGVyIHdhcyByZWxlYXNlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIHN0cmVhbVxcJ3MgY2xvc2VkbmVzcycpO1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZCh3cml0ZXIsIHJlbGVhc2VkRXJyb3IpO1xuICAgICAgICAvLyBUaGUgc3RhdGUgdHJhbnNpdGlvbnMgdG8gXCJlcnJvcmVkXCIgYmVmb3JlIHRoZSBzaW5rIGFib3J0KCkgbWV0aG9kIHJ1bnMsIGJ1dCB0aGUgd3JpdGVyLmNsb3NlZCBwcm9taXNlIGlzIG5vdFxuICAgICAgICAvLyByZWplY3RlZCB1bnRpbCBhZnRlcndhcmRzLiBUaGlzIG1lYW5zIHRoYXQgc2ltcGx5IHRlc3Rpbmcgc3RhdGUgd2lsbCBub3Qgd29yay5cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVsZWFzZWRFcnJvcik7XG4gICAgICAgIHN0cmVhbS5fd3JpdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgdmFyIGNodW5rU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICBpZiAoc3RyZWFtICE9PSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW0pIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCd3cml0ZSB0bycpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgPT09IHRydWUgfHwgc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGlzIGNsb3Npbmcgb3IgY2xvc2VkIGFuZCBjYW5ub3QgYmUgd3JpdHRlbiB0bycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9taXNlID0gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGV4cGxpY2l0bHknKTtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLmVycm9yIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0uX3N0YXRlO1xuICAgICAgICAgICAgaWYgKHN0YXRlICE9PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBjbG9zZWQsIGVycm9yZWQgb3Igd2lsbCBiZSBzb29uLiBUaGUgc2luayBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgaWYgaXQgZ2V0cyBhbiBlcnJvciBoZXJlLCBzb1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgdHJlYXQgaXQgYXMgYSBuby1vcC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGVbQWJvcnRTdGVwc10gPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fYWJvcnRBbGdvcml0aG0ocmVhc29uKTtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW0Vycm9yU3RlcHNdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XG4gICAgfSgpKTtcbiAgICAvLyBBYnN0cmFjdCBvcGVyYXRpb25zIGltcGxlbWVudGluZyBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgdGhlIFdyaXRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkV3JpdGFibGVTdHJlYW0nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgICAgICBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgLy8gTmVlZCB0byBzZXQgdGhlIHNsb3RzIHNvIHRoYXQgdGhlIGFzc2VydCBkb2Vzbid0IGZpcmUuIEluIHRoZSBzcGVjIHRoZSBzbG90cyBhbHJlYWR5IGV4aXN0IGltcGxpY2l0bHkuXG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSBzaXplQWxnb3JpdGhtO1xuICAgICAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7XG4gICAgICAgIGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtID0gd3JpdGVBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtID0gY2xvc2VBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gYWJvcnRBbGdvcml0aG07XG4gICAgICAgIHZhciBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpO1xuICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgICAgIHZhciBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7XG4gICAgICAgIHZhciBzdGFydFByb21pc2UgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KTtcbiAgICAgICAgdXBvblByb21pc2Uoc3RhcnRQcm9taXNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIHIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHN0cmVhbSwgdW5kZXJseWluZ1NpbmssIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICAgICAgZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKSB7XG4gICAgICAgICAgICByZXR1cm4gSW52b2tlT3JOb29wKHVuZGVybHlpbmdTaW5rLCAnc3RhcnQnLCBbY29udHJvbGxlcl0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3cml0ZUFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTaW5rLCAnd3JpdGUnLCAxLCBbY29udHJvbGxlcl0pO1xuICAgICAgICB2YXIgY2xvc2VBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nU2luaywgJ2Nsb3NlJywgMCwgW10pO1xuICAgICAgICB2YXIgYWJvcnRBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nU2luaywgJ2Fib3J0JywgMSwgW10pO1xuICAgICAgICBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG4gICAgfVxuICAgIC8vIENsZWFyQWxnb3JpdGhtcyBtYXkgYmUgY2FsbGVkIHR3aWNlLiBFcnJvcmluZyB0aGUgc2FtZSBzdHJlYW0gaW4gbXVsdGlwbGUgd2F5cyB3aWxsIG9mdGVuIHJlc3VsdCBpbiByZWR1bmRhbnQgY2FsbHMuXG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fYWJvcnRBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgJ2Nsb3NlJywgMCk7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldENodW5rU2l6ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGNodW5rU2l6ZUUpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKGNvbnRyb2xsZXIsIGNodW5rU2l6ZUUpO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJXcml0ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKSB7XG4gICAgICAgIHZhciB3cml0ZVJlY29yZCA9IHsgY2h1bms6IGNodW5rIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBFbnF1ZXVlVmFsdWVXaXRoU2l6ZShjb250cm9sbGVyLCB3cml0ZVJlY29yZCwgY2h1bmtTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZW5xdWV1ZUUpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKGNvbnRyb2xsZXIsIGVucXVldWVFKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSA9PT0gZmFsc2UgJiYgc3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgdmFyIGJhY2twcmVzc3VyZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcik7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICAvLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgICAgICBpZiAoY29udHJvbGxlci5fc3RhcnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3cml0ZVJlY29yZCA9IFBlZWtRdWV1ZVZhbHVlKGNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAod3JpdGVSZWNvcmQgPT09ICdjbG9zZScpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc1dyaXRlKGNvbnRyb2xsZXIsIHdyaXRlUmVjb3JkLmNodW5rKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBlcnJvcikge1xuICAgICAgICBpZiAoY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc0Nsb3NlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1NYXJrQ2xvc2VSZXF1ZXN0SW5GbGlnaHQoc3RyZWFtKTtcbiAgICAgICAgRGVxdWV1ZVZhbHVlKGNvbnRyb2xsZXIpO1xuICAgICAgICB2YXIgc2lua0Nsb3NlUHJvbWlzZSA9IGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtKCk7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIHVwb25Qcm9taXNlKHNpbmtDbG9zZVByb21pc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZShzdHJlYW0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3Ioc3RyZWFtLCByZWFzb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgICAgICBXcml0YWJsZVN0cmVhbU1hcmtGaXJzdFdyaXRlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSk7XG4gICAgICAgIHZhciBzaW5rV3JpdGVQcm9taXNlID0gY29udHJvbGxlci5fd3JpdGVBbGdvcml0aG0oY2h1bmspO1xuICAgICAgICB1cG9uUHJvbWlzZShzaW5rV3JpdGVQcm9taXNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUoc3RyZWFtKTtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgICAgICBEZXF1ZXVlVmFsdWUoY29udHJvbGxlcik7XG4gICAgICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSA9PT0gZmFsc2UgJiYgc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmFja3ByZXNzdXJlID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZVdpdGhFcnJvcihzdHJlYW0sIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIGRlc2lyZWRTaXplID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gZGVzaXJlZFNpemUgPD0gMDtcbiAgICB9XG4gICAgLy8gQSBjbGllbnQgb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGUgY2hlY2suXG4gICAgZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVycm9yKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIGVycm9yKTtcbiAgICB9XG4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZS5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW1cIik7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIuXG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuXCIgKyBuYW1lICsgXCIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQ2Fubm90ICcgKyBuYW1lICsgJyBhIHN0cmVhbSB1c2luZyBhIHJlbGVhc2VkIHdyaXRlcicpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKSB7XG4gICAgICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZVN0YXRlID0gJ3BlbmRpbmcnO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHdyaXRlcikge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgcmVhc29uKSB7XG4gICAgICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUod3JpdGVyLl9jbG9zZWRQcm9taXNlKTtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncmVqZWN0ZWQnO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcikge1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncmVzb2x2ZWQnO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpIHtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdwZW5kaW5nJztcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQod3JpdGVyKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pIHtcbiAgICAgICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh3cml0ZXIuX3JlYWR5UHJvbWlzZSk7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPSAncmVqZWN0ZWQnO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQod3JpdGVyKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pIHtcbiAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKSB7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID0gJ2Z1bGZpbGxlZCc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlLmFib3J0ZWQgPT09ICdib29sZWFuJztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgIC8vIEFib3J0U2lnbmFsLnByb3RvdHlwZS5hYm9ydGVkIHRocm93cyBpZiBpdHMgYnJhbmQgY2hlY2sgZmFpbHNcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vLyA8cmVmZXJlbmNlIGxpYj1cImRvbVwiIC8+XG4gICAgdmFyIE5hdGl2ZURPTUV4Y2VwdGlvbiA9IHR5cGVvZiBET01FeGNlcHRpb24gIT09ICd1bmRlZmluZWQnID8gRE9NRXhjZXB0aW9uIDogdW5kZWZpbmVkO1xuXG4gICAgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbiAgICBmdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKGN0b3IpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIGN0b3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGN0b3IgPT09ICdvYmplY3QnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgY3RvcigpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwoKSB7XG4gICAgICAgIHZhciBjdG9yID0gZnVuY3Rpb24gRE9NRXhjZXB0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJyc7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdFcnJvcic7XG4gICAgICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdG9yLnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgeyB2YWx1ZTogY3Rvciwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIGN0b3I7XG4gICAgfVxuICAgIHZhciBET01FeGNlcHRpb24kMSA9IGlzRE9NRXhjZXB0aW9uQ29uc3RydWN0b3IoTmF0aXZlRE9NRXhjZXB0aW9uKSA/IE5hdGl2ZURPTUV4Y2VwdGlvbiA6IGNyZWF0ZURPTUV4Y2VwdGlvblBvbHlmaWxsKCk7XG5cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVBpcGVUbyhzb3VyY2UsIGRlc3QsIHByZXZlbnRDbG9zZSwgcHJldmVudEFib3J0LCBwcmV2ZW50Q2FuY2VsLCBzaWduYWwpIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc291cmNlKTtcbiAgICAgICAgdmFyIHdyaXRlciA9IEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoZGVzdCk7XG4gICAgICAgIHNvdXJjZS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHNodXR0aW5nRG93biA9IGZhbHNlO1xuICAgICAgICAvLyBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3BlYydzIHJlcXVpcmVtZW50IHRoYXQgd2Ugd2FpdCBmb3Igb25nb2luZyB3cml0ZXMgZHVyaW5nIHNodXRkb3duLlxuICAgICAgICB2YXIgY3VycmVudFdyaXRlID0gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgYWJvcnRBbGdvcml0aG07XG4gICAgICAgICAgICBpZiAoc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhYm9ydEFsZ29yaXRobSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IERPTUV4Y2VwdGlvbiQxKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZlbnRBYm9ydCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KGRlc3QsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ZW50Q2FuY2VsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oZnVuY3Rpb24gKCkgeyByZXR1cm4gUHJvbWlzZS5hbGwoYWN0aW9ucy5tYXAoZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gYWN0aW9uKCk7IH0pKTsgfSwgdHJ1ZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0QWxnb3JpdGhtKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbGdvcml0aG0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNpbmcgcmVhZGVyIGFuZCB3cml0ZXIsIHJlYWQgYWxsIGNodW5rcyBmcm9tIHRoaXMgYW5kIHdyaXRlIHRoZW0gdG8gZGVzdFxuICAgICAgICAgICAgLy8gLSBCYWNrcHJlc3N1cmUgbXVzdCBiZSBlbmZvcmNlZFxuICAgICAgICAgICAgLy8gLSBTaHV0ZG93biBtdXN0IHN0b3AgYWxsIGFjdGl2aXR5XG4gICAgICAgICAgICBmdW5jdGlvbiBwaXBlTG9vcCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3UHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUxvb3AsIHJlamVjdExvb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbmV4dChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVMb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYFBlcmZvcm1Qcm9taXNlVGhlbmAgaW5zdGVhZCBvZiBgdXBvblByb21pc2VgIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIHVubmVjZXNzYXJ5IGAuY2F0Y2gocmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKWAgaGFuZGxlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocGlwZVN0ZXAoKSwgbmV4dCwgcmVqZWN0TG9vcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBwaXBlU3RlcCgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2h1dHRpbmdEb3duID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHdyaXRlci5fcmVhZHlQcm9taXNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4oUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIpLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXcml0ZSA9IFBlcmZvcm1Qcm9taXNlVGhlbihXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh3cml0ZXIsIHJlc3VsdC52YWx1ZSksIHVuZGVmaW5lZCwgbm9vcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXJyb3JzIG11c3QgYmUgcHJvcGFnYXRlZCBmb3J3YXJkXG4gICAgICAgICAgICBpc09yQmVjb21lc0Vycm9yZWQoc291cmNlLCByZWFkZXIuX2Nsb3NlZFByb21pc2UsIGZ1bmN0aW9uIChzdG9yZWRFcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ZW50QWJvcnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7IHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KGRlc3QsIHN0b3JlZEVycm9yKTsgfSwgdHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRXJyb3JzIG11c3QgYmUgcHJvcGFnYXRlZCBiYWNrd2FyZFxuICAgICAgICAgICAgaXNPckJlY29tZXNFcnJvcmVkKGRlc3QsIHdyaXRlci5fY2xvc2VkUHJvbWlzZSwgZnVuY3Rpb24gKHN0b3JlZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZlbnRDYW5jZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbihmdW5jdGlvbiAoKSB7IHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIHN0b3JlZEVycm9yKTsgfSwgdHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ2xvc2luZyBtdXN0IGJlIHByb3BhZ2F0ZWQgZm9yd2FyZFxuICAgICAgICAgICAgaXNPckJlY29tZXNDbG9zZWQoc291cmNlLCByZWFkZXIuX2Nsb3NlZFByb21pc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJldmVudENsb3NlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oZnVuY3Rpb24gKCkgeyByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih3cml0ZXIpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNodXRkb3duKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBDbG9zaW5nIG11c3QgYmUgcHJvcGFnYXRlZCBiYWNrd2FyZFxuICAgICAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSB0cnVlIHx8IGRlc3QuX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgICAgIHZhciBkZXN0Q2xvc2VkXzEgPSBuZXcgVHlwZUVycm9yKCd0aGUgZGVzdGluYXRpb24gd3JpdGFibGUgc3RyZWFtIGNsb3NlZCBiZWZvcmUgYWxsIGRhdGEgY291bGQgYmUgcGlwZWQgdG8gaXQnKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmVudENhbmNlbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKGZ1bmN0aW9uICgpIHsgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHNvdXJjZSwgZGVzdENsb3NlZF8xKTsgfSwgdHJ1ZSwgZGVzdENsb3NlZF8xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNodXRkb3duKHRydWUsIGRlc3RDbG9zZWRfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShwaXBlTG9vcCgpKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpIHtcbiAgICAgICAgICAgICAgICAvLyBBbm90aGVyIHdyaXRlIG1heSBoYXZlIHN0YXJ0ZWQgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIG9uIHRoaXMgY3VycmVudFdyaXRlLCBzbyB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gd2FpdFxuICAgICAgICAgICAgICAgIC8vIGZvciB0aGF0IHRvby5cbiAgICAgICAgICAgICAgICB2YXIgb2xkQ3VycmVudFdyaXRlID0gY3VycmVudFdyaXRlO1xuICAgICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4oY3VycmVudFdyaXRlLCBmdW5jdGlvbiAoKSB7IHJldHVybiBvbGRDdXJyZW50V3JpdGUgIT09IGN1cnJlbnRXcml0ZSA/IHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpIDogdW5kZWZpbmVkOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzT3JCZWNvbWVzRXJyb3JlZChzdHJlYW0sIHByb21pc2UsIGFjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXBvblJlamVjdGlvbihwcm9taXNlLCBhY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzT3JCZWNvbWVzQ2xvc2VkKHN0cmVhbSwgcHJvbWlzZSwgYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXBvbkZ1bGZpbGxtZW50KHByb21pc2UsIGFjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gc2h1dGRvd25XaXRoQWN0aW9uKGFjdGlvbiwgb3JpZ2luYWxJc0Vycm9yLCBvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNodXR0aW5nRG93biA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGRvVGhlUmVzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkb1RoZVJlc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9UaGVSZXN0KCkge1xuICAgICAgICAgICAgICAgICAgICB1cG9uUHJvbWlzZShhY3Rpb24oKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gZmluYWxpemUob3JpZ2luYWxJc0Vycm9yLCBvcmlnaW5hbEVycm9yKTsgfSwgZnVuY3Rpb24gKG5ld0Vycm9yKSB7IHJldHVybiBmaW5hbGl6ZSh0cnVlLCBuZXdFcnJvcik7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNodXRkb3duKGlzRXJyb3IsIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNodXR0aW5nRG93biA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZpbmFsaXplKGlzRXJyb3IsIGVycm9yKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZmluYWxpemUoaXNFcnJvciwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHdyaXRlcik7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgICAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEFsZ29yaXRobSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgXCJkZXNpcmVkU2l6ZVwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2VucXVldWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGVbQ2FuY2VsU3RlcHNdID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9jYW5jZWxBbGdvcml0aG0ocmVhc29uKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW1B1bGxTdGVwc10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3RyZWFtID0gdGhpcy5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgY2h1bmsgPSBEZXF1ZXVlVmFsdWUodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Nsb3NlUmVxdWVzdGVkID09PSB0cnVlICYmIHRoaXMuX3F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KGNodW5rLCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwZW5kaW5nUHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHBlbmRpbmdQcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcbiAgICB9KCkpO1xuICAgIC8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuICAgIGZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkUmVhZGFibGVTdHJlYW0nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzaG91bGRQdWxsID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAoc2hvdWxkUHVsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fcHVsbGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIHB1bGxQcm9taXNlID0gY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSgpO1xuICAgICAgICB1cG9uUHJvbWlzZShwdWxsUHJvbWlzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShjb250cm9sbGVyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fc3RhcnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pID09PSB0cnVlICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVzaXJlZFNpemUgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcik7XG4gICAgICAgIGlmIChkZXNpcmVkU2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBIGNsaWVudCBvZiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgICAgICBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSA9PT0gdHJ1ZSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3Qoc3RyZWFtLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNodW5rU2l6ZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2h1bmtTaXplID0gY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtKGNodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChjaHVua1NpemVFKSB7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGNodW5rU2l6ZUUpO1xuICAgICAgICAgICAgICAgIHRocm93IGNodW5rU2l6ZUU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVucXVldWVFKSB7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVucXVldWVFKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlbnF1ZXVlRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbiAgICB9XG4gICAgLy8gVGhpcyBpcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUcmFuc2Zvcm1TdHJlYW0uXG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZShjb250cm9sbGVyKSB7XG4gICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID09PSBmYWxzZSAmJiBzdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgY29udHJvbGxlci5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkO1xuICAgICAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHNpemVBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNID0gaGlnaFdhdGVyTWFyaztcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTtcbiAgICAgICAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICB2YXIgc3RhcnRSZXN1bHQgPSBzdGFydEFsZ29yaXRobSgpO1xuICAgICAgICB1cG9uUHJvbWlzZShwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCByKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHN0cmVhbSwgdW5kZXJseWluZ1NvdXJjZSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgICAgICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgICAgICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHtcbiAgICAgICAgICAgIHJldHVybiBJbnZva2VPck5vb3AodW5kZXJseWluZ1NvdXJjZSwgJ3N0YXJ0JywgW2NvbnRyb2xsZXJdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHVsbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTb3VyY2UsICdwdWxsJywgMCwgW2NvbnRyb2xsZXJdKTtcbiAgICAgICAgdmFyIGNhbmNlbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdTb3VyY2UsICdjYW5jZWwnLCAxLCBbXSk7XG4gICAgICAgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xuICAgIH1cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbiAgICBmdW5jdGlvbiBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLlwiICsgbmFtZSArIFwiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtVGVlKHN0cmVhbSwgY2xvbmVGb3JCcmFuY2gyKSB7XG4gICAgICAgIHZhciByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG4gICAgICAgIHZhciByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIHZhciBjYW5jZWxlZDEgPSBmYWxzZTtcbiAgICAgICAgdmFyIGNhbmNlbGVkMiA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVhc29uMTtcbiAgICAgICAgdmFyIHJlYXNvbjI7XG4gICAgICAgIHZhciBicmFuY2gxO1xuICAgICAgICB2YXIgYnJhbmNoMjtcbiAgICAgICAgdmFyIHJlc29sdmVDYW5jZWxQcm9taXNlO1xuICAgICAgICB2YXIgY2FuY2VsUHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZ1bmN0aW9uIHB1bGxBbGdvcml0aG0oKSB7XG4gICAgICAgICAgICBpZiAocmVhZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciByZWFkUHJvbWlzZSA9IHRyYW5zZm9ybVByb21pc2VXaXRoKFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyKSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgZG9uZSA9IHJlc3VsdC5kb25lO1xuICAgICAgICAgICAgICAgIGlmIChkb25lID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5jZWxlZDEgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuY2VsZWQyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlMSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZTIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gYWNjZXNzIHRoZSBjbG9uaW5nIGNvZGUgcmlnaHQgbm93IGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgYWRkIG9uZSB0aGVuIHdlJ2xsIG5lZWQgYW4gaW1wbGVtZW50YXRpb24gZm9yIHNlcmlhbGl6YWJsZSBvYmplY3RzLlxuICAgICAgICAgICAgICAgIC8vIGlmIChjYW5jZWxlZDIgPT09IGZhbHNlICYmIGNsb25lRm9yQnJhbmNoMiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgdmFsdWUyID0gU3RydWN0dXJlZERlc2VyaWFsaXplKFN0cnVjdHVyZWRTZXJpYWxpemUodmFsdWUyKSk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxlZDEgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmFsdWUxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGVkMiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCB2YWx1ZTIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShyZWFkUHJvbWlzZSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbDFBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgICAgICBjYW5jZWxlZDEgPSB0cnVlO1xuICAgICAgICAgICAgcmVhc29uMSA9IHJlYXNvbjtcbiAgICAgICAgICAgIGlmIChjYW5jZWxlZDIgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRlUmVhc29uID0gY3JlYXRlQXJyYXlGcm9tTGlzdChbcmVhc29uMSwgcmVhc29uMl0pO1xuICAgICAgICAgICAgICAgIHZhciBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoY2FuY2VsUmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbDJBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgICAgICBjYW5jZWxlZDIgPSB0cnVlO1xuICAgICAgICAgICAgcmVhc29uMiA9IHJlYXNvbjtcbiAgICAgICAgICAgIGlmIChjYW5jZWxlZDEgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRlUmVhc29uID0gY3JlYXRlQXJyYXlGcm9tTGlzdChbcmVhc29uMSwgcmVhc29uMl0pO1xuICAgICAgICAgICAgICAgIHZhciBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoY2FuY2VsUmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkgeyB9XG4gICAgICAgIGJyYW5jaDEgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMUFsZ29yaXRobSk7XG4gICAgICAgIGJyYW5jaDIgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7XG4gICAgICAgIHVwb25SZWplY3Rpb24ocmVhZGVyLl9jbG9zZWRQcm9taXNlLCBmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgcik7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBbYnJhbmNoMSwgYnJhbmNoMl07XG4gICAgfVxuXG4gICAgLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXIjUG9seWZpbGxcbiAgICB2YXIgTnVtYmVySXNJbnRlZ2VyID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIGlzRmluaXRlKHZhbHVlKSAmJlxuICAgICAgICAgICAgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xuICAgIH07XG5cbiAgICB2YXIgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseScpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSwgXCJ2aWV3XCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigndmlldycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlldztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS5yZXNwb25kID0gZnVuY3Rpb24gKGJ5dGVzV3JpdHRlbikge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Jlc3BvbmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHRoaXMuX3ZpZXcuYnVmZmVyKSA9PT0gdHJ1ZSkgO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbik7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLnJlc3BvbmRXaXRoTmV3VmlldyA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigncmVzcG9uZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIEJZT0IgcmVxdWVzdCBoYXMgYmVlbiBpbnZhbGlkYXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgY2FuIG9ubHkgcmVzcG9uZCB3aXRoIGFycmF5IGJ1ZmZlciB2aWV3cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzRGV0YWNoZWRCdWZmZXIodmlldy5idWZmZXIpID09PSB0cnVlKSA7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLCB2aWV3KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3Q7XG4gICAgfSgpKTtcbiAgICB2YXIgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseScpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSwgXCJieW9iUmVxdWVzdFwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2J5b2JSZXF1ZXN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ieW9iUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3REZXNjcmlwdG9yID0gdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciwgZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQsIGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5b2JSZXF1ZXN0ID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIFNldFVwUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdChieW9iUmVxdWVzdCwgdGhpcywgdmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2J5b2JSZXF1ZXN0ID0gYnlvYlJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ieW9iUmVxdWVzdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUsIFwiZGVzaXJlZFNpemVcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdkZXNpcmVkU2l6ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKHRoaXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkOyBkbyBub3QgY2xvc2UgaXQgYWdhaW4hJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgc3RyZWFtIChpbiBcIiArIHN0YXRlICsgXCIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBjbG9zZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdlbnF1ZXVlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgc3RyZWFtIChpbiBcIiArIHN0YXRlICsgXCIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBlbnF1ZXVlZCB0b1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBjYW4gb25seSBlbnF1ZXVlIGFycmF5IGJ1ZmZlciB2aWV3cyB3aGVuIHVzaW5nIGEgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzRGV0YWNoZWRCdWZmZXIoY2h1bmsuYnVmZmVyKSA9PT0gdHJ1ZSkgO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUodGhpcywgY2h1bmspO1xuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcih0aGlzLCBlKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZVtDYW5jZWxTdGVwc10gPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0RGVzY3JpcHRvciA9IHRoaXMuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICAgICAgICAgIGZpcnN0RGVzY3JpcHRvci5ieXRlc0ZpbGxlZCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZXNldFF1ZXVlKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NhbmNlbEFsZ29yaXRobShyZWFzb24pO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGVbUHVsbFN0ZXBzXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlVG90YWxTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVldWVUb3RhbFNpemUgLT0gZW50cnkuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbih0aGlzKTtcbiAgICAgICAgICAgICAgICB2YXIgdmlldyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW50cnkuYnVmZmVyLCBlbnRyeS5ieXRlT2Zmc2V0LCBlbnRyeS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKHZpZXdFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHZpZXdFKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHZpZXcsIGZhbHNlLCBzdHJlYW0uX3JlYWRlci5fZm9yQXV0aG9yQ29kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHRoaXMuX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICAgICAgICAgIGlmIChhdXRvQWxsb2NhdGVDaHVua1NpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChidWZmZXJFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGJ1ZmZlckUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgYnl0ZU9mZnNldDogMCxcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogYXV0b0FsbG9jYXRlQ2h1bmtTaXplLFxuICAgICAgICAgICAgICAgICAgICBieXRlc0ZpbGxlZDogMCxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNpemU6IDEsXG4gICAgICAgICAgICAgICAgICAgIGN0b3I6IFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlclR5cGU6ICdkZWZhdWx0J1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIuXG4gICAgZnVuY3Rpb24gSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHgpIHtcbiAgICAgICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QoeCkge1xuICAgICAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzaG91bGRQdWxsID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAoc2hvdWxkUHVsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fcHVsbGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gVE9ETzogVGVzdCBjb250cm9sbGVyIGFyZ3VtZW50XG4gICAgICAgIHZhciBwdWxsUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0oKTtcbiAgICAgICAgdXBvblByb21pc2UocHVsbFByb21pc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyLl9wdWxsQWdhaW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcikge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpO1xuICAgICAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmlsbGVkVmlldyA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IucmVhZGVyVHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGZpbGxlZFZpZXcsIGRvbmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgZmlsbGVkVmlldywgZG9uZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgICAgIHZhciBieXRlc0ZpbGxlZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgdmFyIGVsZW1lbnRTaXplID0gcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplO1xuICAgICAgICByZXR1cm4gbmV3IHB1bGxJbnRvRGVzY3JpcHRvci5jdG9yKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0LCBieXRlc0ZpbGxlZCAvIGVsZW1lbnRTaXplKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlLnB1c2goeyBidWZmZXI6IGJ1ZmZlciwgYnl0ZU9mZnNldDogYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aCB9KTtcbiAgICAgICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgKz0gYnl0ZUxlbmd0aDtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgICAgIHZhciBlbGVtZW50U2l6ZSA9IHB1bGxJbnRvRGVzY3JpcHRvci5lbGVtZW50U2l6ZTtcbiAgICAgICAgdmFyIGN1cnJlbnRBbGlnbmVkQnl0ZXMgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBlbGVtZW50U2l6ZTtcbiAgICAgICAgdmFyIG1heEJ5dGVzVG9Db3B5ID0gTWF0aC5taW4oY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTtcbiAgICAgICAgdmFyIG1heEJ5dGVzRmlsbGVkID0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgbWF4Qnl0ZXNUb0NvcHk7XG4gICAgICAgIHZhciBtYXhBbGlnbmVkQnl0ZXMgPSBtYXhCeXRlc0ZpbGxlZCAtIG1heEJ5dGVzRmlsbGVkICUgZWxlbWVudFNpemU7XG4gICAgICAgIHZhciB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nID0gbWF4Qnl0ZXNUb0NvcHk7XG4gICAgICAgIHZhciByZWFkeSA9IGZhbHNlO1xuICAgICAgICBpZiAobWF4QWxpZ25lZEJ5dGVzID4gY3VycmVudEFsaWduZWRCeXRlcykge1xuICAgICAgICAgICAgdG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyA9IG1heEFsaWduZWRCeXRlcyAtIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZTtcbiAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICB2YXIgaGVhZE9mUXVldWUgPSBxdWV1ZS5wZWVrKCk7XG4gICAgICAgICAgICB2YXIgYnl0ZXNUb0NvcHkgPSBNYXRoLm1pbih0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nLCBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBkZXN0U3RhcnQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCArIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgICAgIEFycmF5QnVmZmVyQ29weShwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBkZXN0U3RhcnQsIGhlYWRPZlF1ZXVlLmJ1ZmZlciwgaGVhZE9mUXVldWUuYnl0ZU9mZnNldCwgYnl0ZXNUb0NvcHkpO1xuICAgICAgICAgICAgaWYgKGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGggPT09IGJ5dGVzVG9Db3B5KSB7XG4gICAgICAgICAgICAgICAgcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhlYWRPZlF1ZXVlLmJ5dGVPZmZzZXQgKz0gYnl0ZXNUb0NvcHk7XG4gICAgICAgICAgICAgICAgaGVhZE9mUXVldWUuYnl0ZUxlbmd0aCAtPSBieXRlc1RvQ29weTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplIC09IGJ5dGVzVG9Db3B5O1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIsIGJ5dGVzVG9Db3B5LCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgdG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyAtPSBieXRlc1RvQ29weTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVhZHk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLCBzaXplLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICAgICAgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICs9IHNpemU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID09PSAwICYmIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcikge1xuICAgICAgICBpZiAoY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0Ll9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QuX3ZpZXcgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgd2hpbGUgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHB1bGxJbnRvRGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICAgICAgaWYgKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhjb250cm9sbGVyLCB2aWV3KSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICB2YXIgZWxlbWVudFNpemUgPSAxO1xuICAgICAgICBpZiAodmlldy5jb25zdHJ1Y3RvciAhPT0gRGF0YVZpZXcpIHtcbiAgICAgICAgICAgIGVsZW1lbnRTaXplID0gdmlldy5jb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3RvciA9IHZpZXcuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBidWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKTtcbiAgICAgICAgdmFyIHB1bGxJbnRvRGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogYnVmZmVyLFxuICAgICAgICAgICAgYnl0ZU9mZnNldDogdmlldy5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgYnl0ZUxlbmd0aDogdmlldy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgYnl0ZXNGaWxsZWQ6IDAsXG4gICAgICAgICAgICBlbGVtZW50U2l6ZTogZWxlbWVudFNpemUsXG4gICAgICAgICAgICBjdG9yOiBjdG9yLFxuICAgICAgICAgICAgcmVhZGVyVHlwZTogJ2J5b2InXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucHVzaChwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgLy8gTm8gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoKSBjYWxsIHNpbmNlOlxuICAgICAgICAgICAgLy8gLSBObyBjaGFuZ2UgaGFwcGVucyBvbiBkZXNpcmVkU2l6ZVxuICAgICAgICAgICAgLy8gLSBUaGUgc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gbm90aWZpZWQgb2YgdGhhdCB0aGVyZSdzIGF0IGxlYXN0IDEgcGVuZGluZyByZWFkKHZpZXcpXG4gICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIHZhciBlbXB0eVZpZXcgPSBuZXcgY3RvcihwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCwgMCk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoZW1wdHlWaWV3LCB0cnVlLCBzdHJlYW0uX3JlYWRlci5fZm9yQXV0aG9yQ29kZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGlmIChSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZShjb250cm9sbGVyLCBwdWxsSW50b0Rlc2NyaXB0b3IpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpbGxlZFZpZXcgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChmaWxsZWRWaWV3LCBmYWxzZSwgc3RyZWFtLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnB1c2gocHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgdmFyIHByb21pc2UgPSBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChzdHJlYW0pO1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpIHtcbiAgICAgICAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlcik7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdoaWxlIChSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHVsbEludG9EZXNjcmlwdG9yID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKyBieXRlc1dyaXR0ZW4gPiBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2J5dGVzV3JpdHRlbiBvdXQgb2YgcmFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICBpZiAocHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkIDwgcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoZXRoZXIgd2Ugc2hvdWxkIGRldGFjaCB0aGUgYnVmZmVyIG9yIG5vdCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTtcbiAgICAgICAgdmFyIHJlbWFpbmRlclNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgICAgIGlmIChyZW1haW5kZXJTaXplID4gMCkge1xuICAgICAgICAgICAgdmFyIGVuZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICAgICAgdmFyIHJlbWFpbmRlciA9IHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIuc2xpY2UoZW5kIC0gcmVtYWluZGVyU2l6ZSwgZW5kKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHJlbWFpbmRlciwgMCwgcmVtYWluZGVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIpO1xuICAgICAgICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLT0gcmVtYWluZGVyU2l6ZTtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEludGVybmFsKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbikge1xuICAgICAgICB2YXIgZmlyc3REZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIGlmIChieXRlc1dyaXR0ZW4gIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdieXRlc1dyaXR0ZW4gbXVzdCBiZSAwIHdoZW4gY2FsbGluZyByZXNwb25kKCkgb24gYSBjbG9zZWQgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEluQ2xvc2VkU3RhdGUoY29udHJvbGxlciwgZmlyc3REZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgZmlyc3REZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnNoaWZ0KCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fc3RhcnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyKHN0cmVhbSkgPT09IHRydWUgJiYgUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0JZT0JSZWFkZXIoc3RyZWFtKSA9PT0gdHJ1ZSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZXNpcmVkU2l6ZSA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTtcbiAgICAgICAgaWYgKGRlc2lyZWRTaXplID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fY2FuY2VsQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBIGNsaWVudCBvZiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID4gMCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBmaXJzdFBlbmRpbmdQdWxsSW50byA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICAgICAgaWYgKGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ5dGVzRmlsbGVkID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgICAgIHZhciBidWZmZXIgPSBjaHVuay5idWZmZXI7XG4gICAgICAgIHZhciBieXRlT2Zmc2V0ID0gY2h1bmsuYnl0ZU9mZnNldDtcbiAgICAgICAgdmFyIGJ5dGVMZW5ndGggPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhbnNmZXJyZWRCdWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNmZXJyZWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodHJhbnNmZXJyZWRCdWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgdHJhbnNmZXJyZWRWaWV3LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IElkZWFsbHkgaW4gdGhpcyBicmFuY2ggZGV0YWNoaW5nIHNob3VsZCBoYXBwZW4gb25seSBpZiB0aGUgYnVmZmVyIGlzIG5vdCBjb25zdW1lZCBmdWxseS5cbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcik7XG4gICAgICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgICAgIHZhciBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKSB7XG4gICAgICAgIGJ5dGVzV3JpdHRlbiA9IE51bWJlcihieXRlc1dyaXR0ZW4pO1xuICAgICAgICBpZiAoSXNGaW5pdGVOb25OZWdhdGl2ZU51bWJlcihieXRlc1dyaXR0ZW4pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2J5dGVzV3JpdHRlbiBtdXN0IGJlIGEgZmluaXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbChjb250cm9sbGVyLCBieXRlc1dyaXR0ZW4pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KGNvbnRyb2xsZXIsIHZpZXcpIHtcbiAgICAgICAgdmFyIGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgIT09IHZpZXcuYnl0ZU9mZnNldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSByZWdpb24gc3BlY2lmaWVkIGJ5IHZpZXcgZG9lcyBub3QgbWF0Y2ggYnlvYlJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVMZW5ndGggIT09IHZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBidWZmZXIgb2YgdmlldyBoYXMgZGlmZmVyZW50IGNhcGFjaXR5IHRoYW4gYnlvYlJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBmaXJzdERlc2NyaXB0b3IuYnVmZmVyID0gdmlldy5idWZmZXI7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgdmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBOZWVkIHRvIHNldCB0aGUgc2xvdHMgc28gdGhhdCB0aGUgYXNzZXJ0IGRvZXNuJ3QgZmlyZS4gSW4gdGhlIHNwZWMgdGhlIHNsb3RzIGFscmVhZHkgZXhpc3QgaW1wbGljaXRseS5cbiAgICAgICAgY29udHJvbGxlci5fcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICAgICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTtcbiAgICAgICAgY29udHJvbGxlci5fYXV0b0FsbG9jYXRlQ2h1bmtTaXplID0gYXV0b0FsbG9jYXRlQ2h1bmtTaXplO1xuICAgICAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgICAgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgdmFyIHN0YXJ0UmVzdWx0ID0gc3RhcnRBbGdvcml0aG0oKTtcbiAgICAgICAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdCeXRlU291cmNlLCBoaWdoV2F0ZXJNYXJrKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkge1xuICAgICAgICAgICAgcmV0dXJuIEludm9rZU9yTm9vcCh1bmRlcmx5aW5nQnl0ZVNvdXJjZSwgJ3N0YXJ0JywgW2NvbnRyb2xsZXJdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHVsbEFsZ29yaXRobSA9IENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHVuZGVybHlpbmdCeXRlU291cmNlLCAncHVsbCcsIDAsIFtjb250cm9sbGVyXSk7XG4gICAgICAgIHZhciBjYW5jZWxBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh1bmRlcmx5aW5nQnl0ZVNvdXJjZSwgJ2NhbmNlbCcsIDEsIFtdKTtcbiAgICAgICAgdmFyIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHVuZGVybHlpbmdCeXRlU291cmNlLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICAgICAgaWYgKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhdXRvQWxsb2NhdGVDaHVua1NpemUgPSBOdW1iZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXJJc0ludGVnZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKSA9PT0gZmFsc2UgfHwgYXV0b0FsbG9jYXRlQ2h1bmtTaXplIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXV0b0FsbG9jYXRlQ2h1bmtTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHJlcXVlc3QsIGNvbnRyb2xsZXIsIHZpZXcpIHtcbiAgICAgICAgcmVxdWVzdC5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICByZXF1ZXN0Ll92aWV3ID0gdmlldztcbiAgICB9XG4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QuXG4gICAgZnVuY3Rpb24gYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdFwiKTtcbiAgICB9XG4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIuXG4gICAgZnVuY3Rpb24gYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclwiKTtcbiAgICB9XG5cbiAgICAvLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG4gICAgZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0sIGZvckF1dGhvckNvZGUpIHtcbiAgICAgICAgaWYgKGZvckF1dGhvckNvZGUgPT09IHZvaWQgMCkgeyBmb3JBdXRob3JDb2RlID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtKTtcbiAgICAgICAgcmVhZGVyLl9mb3JBdXRob3JDb2RlID0gZm9yQXV0aG9yQ29kZTtcbiAgICAgICAgcmV0dXJuIHJlYWRlcjtcbiAgICB9XG4gICAgLy8gUmVhZGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHN0cmVhbSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ld1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlYWRJbnRvUmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICBfcmVqZWN0OiByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzdHJlYW0uX3JlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5wdXNoKHJlYWRJbnRvUmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgICAgICB2YXIgcmVhZEludG9SZXF1ZXN0ID0gcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQoY2h1bmssIGRvbmUsIHJlYWRlci5fZm9yQXV0aG9yQ29kZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uX3JlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5sZW5ndGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHN0cmVhbSkge1xuICAgICAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFJlYWRhYmxlU3RyZWFtIGluc3RhbmNlIGdpdmVuIGEgJyArXG4gICAgICAgICAgICAgICAgICAgICdieXRlIHNvdXJjZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciBmb3IgYSBzdHJlYW0gbm90IGNvbnN0cnVjdGVkIHdpdGggYSBieXRlICcgK1xuICAgICAgICAgICAgICAgICAgICAnc291cmNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSByZWFkaW5nIGJ5IGFub3RoZXIgcmVhZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUsIFwiY2xvc2VkXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdjYW5jZWwnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigncmVhZCBmcm9tJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCd2aWV3IG11c3QgYmUgYW4gYXJyYXkgYnVmZmVyIHZpZXcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih2aWV3LmJ1ZmZlcikgPT09IHRydWUpIDtcbiAgICAgICAgICAgIGlmICh2aWV3LmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCd2aWV3IG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQodGhpcywgdmlldyk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUucmVsZWFzZUxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIHJlbGVhc2UgYSByZWFkZXIgbG9jayB3aGVuIHRoYXQgcmVhZGVyIGhhcyBwZW5kaW5nIHJlYWQoKSBjYWxscyB1bi1zZXR0bGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyO1xuICAgIH0oKSk7XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIHJlYWRlcnMuXG4gICAgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoeCkge1xuICAgICAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZEludG9SZXF1ZXN0cycpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQocmVhZGVyLCB2aWV3KSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW07XG4gICAgICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udHJvbGxlcnMgbXVzdCBpbXBsZW1lbnQgdGhpcy5cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmlldyk7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIuXG4gICAgZnVuY3Rpb24gYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUuXCIgKyBuYW1lICsgXCIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclwiKTtcbiAgICB9XG5cbiAgICB2YXIgUmVhZGFibGVTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtKHVuZGVybHlpbmdTb3VyY2UsIHN0cmF0ZWd5KSB7XG4gICAgICAgICAgICBpZiAodW5kZXJseWluZ1NvdXJjZSA9PT0gdm9pZCAwKSB7IHVuZGVybHlpbmdTb3VyY2UgPSB7fTsgfVxuICAgICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSB2b2lkIDApIHsgc3RyYXRlZ3kgPSB7fTsgfVxuICAgICAgICAgICAgSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNpemUgPSBzdHJhdGVneS5zaXplO1xuICAgICAgICAgICAgdmFyIGhpZ2hXYXRlck1hcmsgPSBzdHJhdGVneS5oaWdoV2F0ZXJNYXJrO1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB1bmRlcmx5aW5nU291cmNlLnR5cGU7XG4gICAgICAgICAgICB2YXIgdHlwZVN0cmluZyA9IFN0cmluZyh0eXBlKTtcbiAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHN0cmF0ZWd5IGZvciBhIGJ5dGUgc3RyZWFtIGNhbm5vdCBoYXZlIGEgc2l6ZSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcmsgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrID0gVmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGhpZ2hXYXRlck1hcmspO1xuICAgICAgICAgICAgICAgIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHRoaXMsIHVuZGVybHlpbmdTb3VyY2UsIGhpZ2hXYXRlck1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oc2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhoaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgICAgICAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGUgaXMgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwgXCJsb2NrZWRcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnbG9ja2VkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2NhbmNlbCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbmNlbCBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgcmVhZGVyJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5nZXRSZWFkZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHZhciBtb2RlID0gKF9hID09PSB2b2lkIDAgPyB7fSA6IF9hKS5tb2RlO1xuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW0odGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdnZXRSZWFkZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vZGUgPSBTdHJpbmcobW9kZSk7XG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2J5b2InKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBtb2RlIGlzIHNwZWNpZmllZCcpO1xuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggPSBmdW5jdGlvbiAoX2EsIF9iKSB7XG4gICAgICAgICAgICB2YXIgd3JpdGFibGUgPSBfYS53cml0YWJsZSwgcmVhZGFibGUgPSBfYS5yZWFkYWJsZTtcbiAgICAgICAgICAgIHZhciBfYyA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iLCBwcmV2ZW50Q2xvc2UgPSBfYy5wcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCA9IF9jLnByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCA9IF9jLnByZXZlbnRDYW5jZWwsIHNpZ25hbCA9IF9jLnNpZ25hbDtcbiAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRocm91Z2gnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtKHdyaXRhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd3cml0YWJsZSBhcmd1bWVudCB0byBwaXBlVGhyb3VnaCBtdXN0IGJlIGEgV3JpdGFibGVTdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtKHJlYWRhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWFkYWJsZSBhcmd1bWVudCB0byBwaXBlVGhyb3VnaCBtdXN0IGJlIGEgUmVhZGFibGVTdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZlbnRDbG9zZSA9IEJvb2xlYW4ocHJldmVudENsb3NlKTtcbiAgICAgICAgICAgIHByZXZlbnRBYm9ydCA9IEJvb2xlYW4ocHJldmVudEFib3J0KTtcbiAgICAgICAgICAgIHByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpO1xuICAgICAgICAgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2hcXCdzIHNpZ25hbCBvcHRpb24gbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcykgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHdyaXRhYmxlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVGhyb3VnaCBjYW5ub3QgYmUgdXNlZCBvbiBhIGxvY2tlZCBXcml0YWJsZVN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSBSZWFkYWJsZVN0cmVhbVBpcGVUbyh0aGlzLCB3cml0YWJsZSwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCk7XG4gICAgICAgICAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHByb21pc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRhYmxlO1xuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvID0gZnVuY3Rpb24gKGRlc3QsIF9hKSB7XG4gICAgICAgICAgICB2YXIgX2IgPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYSwgcHJldmVudENsb3NlID0gX2IucHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQgPSBfYi5wcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwgPSBfYi5wcmV2ZW50Q2FuY2VsLCBzaWduYWwgPSBfYi5zaWduYWw7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3BpcGVUbycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtKGRlc3QpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG9cXCdzIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBXcml0YWJsZVN0cmVhbScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZlbnRDbG9zZSA9IEJvb2xlYW4ocHJldmVudENsb3NlKTtcbiAgICAgICAgICAgIHByZXZlbnRBYm9ydCA9IEJvb2xlYW4ocHJldmVudEFib3J0KTtcbiAgICAgICAgICAgIHByZXZlbnRDYW5jZWwgPSBCb29sZWFuKHByZXZlbnRDYW5jZWwpO1xuICAgICAgICAgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvXFwncyBzaWduYWwgb3B0aW9uIG11c3QgYmUgYW4gQWJvcnRTaWduYWwnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChkZXN0KSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcywgZGVzdCwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS50ZWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3RlZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJyYW5jaGVzID0gUmVhZGFibGVTdHJlYW1UZWUodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQXJyYXlGcm9tTGlzdChicmFuY2hlcyk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIF9iID0gKF9hID09PSB2b2lkIDAgPyB7fSA6IF9hKS5wcmV2ZW50Q2FuY2VsLCBwcmV2ZW50Q2FuY2VsID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7XG4gICAgICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2dldEl0ZXJhdG9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzLCBwcmV2ZW50Q2FuY2VsKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtO1xuICAgIH0oKSk7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yID09PSAnc3ltYm9sJykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yLCB7XG4gICAgICAgICAgICB2YWx1ZTogUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLmdldEl0ZXJhdG9yLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuICAgIC8vIFRocm93cyBpZiBhbmQgb25seSBpZiBzdGFydEFsZ29yaXRobSB0aHJvd3MuXG4gICAgZnVuY3Rpb24gQ3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgICAgICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdm9pZCAwKSB7IGhpZ2hXYXRlck1hcmsgPSAxOyB9XG4gICAgICAgIGlmIChzaXplQWxnb3JpdGhtID09PSB2b2lkIDApIHsgc2l6ZUFsZ29yaXRobSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH07IH1cbiAgICAgICAgdmFyIHN0cmVhbSA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKTtcbiAgICAgICAgSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHN0cmVhbSk7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgICAgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJbml0aWFsaXplUmVhZGFibGVTdHJlYW0oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5fc3RhdGUgPSAncmVhZGFibGUnO1xuICAgICAgICBzdHJlYW0uX3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RyZWFtLl9kaXN0dXJiZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbSh4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkge1xuICAgICAgICBpZiAoc3RyZWFtLl9yZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBSZWFkYWJsZVN0cmVhbSBBUEkgZXhwb3NlZCBmb3IgY29udHJvbGxlcnMuXG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pIHtcbiAgICAgICAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xuICAgICAgICB2YXIgc291cmNlQ2FuY2VsUHJvbWlzZSA9IHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyW0NhbmNlbFN0ZXBzXShyZWFzb24pO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoc291cmNlQ2FuY2VsUHJvbWlzZSwgbm9vcCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5fc3RhdGUgPSAnY2xvc2VkJztcbiAgICAgICAgdmFyIHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVhZFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZWFkUmVxdWVzdC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodW5kZWZpbmVkLCB0cnVlLCByZWFkZXIuX2ZvckF1dGhvckNvZGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUocmVhZGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpIHtcbiAgICAgICAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IGU7XG4gICAgICAgIHZhciByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICAgICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgICAgIHJlYWRlci5fcmVhZFJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgcmVhZFJlcXVlc3QuX3JlamVjdChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWFkSW50b1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZWFkSW50b1JlcXVlc3QuX3JlamVjdChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCBlKTtcbiAgICB9XG4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuICAgIGZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMShuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKFwiUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLlwiICsgbmFtZSArIFwiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbVwiKTtcbiAgICB9XG5cbiAgICB2YXIgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneShfYSkge1xuICAgICAgICAgICAgdmFyIGhpZ2hXYXRlck1hcmsgPSBfYS5oaWdoV2F0ZXJNYXJrO1xuICAgICAgICAgICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyaztcbiAgICAgICAgfVxuICAgICAgICBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3k7XG4gICAgfSgpKTtcblxuICAgIHZhciBDb3VudFF1ZXVpbmdTdHJhdGVneSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQ291bnRRdWV1aW5nU3RyYXRlZ3koX2EpIHtcbiAgICAgICAgICAgIHZhciBoaWdoV2F0ZXJNYXJrID0gX2EuaGlnaFdhdGVyTWFyaztcbiAgICAgICAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcms7XG4gICAgICAgIH1cbiAgICAgICAgQ291bnRRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIENvdW50UXVldWluZ1N0cmF0ZWd5O1xuICAgIH0oKSk7XG5cbiAgICAvLyBDbGFzcyBUcmFuc2Zvcm1TdHJlYW1cbiAgICB2YXIgVHJhbnNmb3JtU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0odHJhbnNmb3JtZXIsIHdyaXRhYmxlU3RyYXRlZ3ksIHJlYWRhYmxlU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lciA9PT0gdm9pZCAwKSB7IHRyYW5zZm9ybWVyID0ge307IH1cbiAgICAgICAgICAgIGlmICh3cml0YWJsZVN0cmF0ZWd5ID09PSB2b2lkIDApIHsgd3JpdGFibGVTdHJhdGVneSA9IHt9OyB9XG4gICAgICAgICAgICBpZiAocmVhZGFibGVTdHJhdGVneSA9PT0gdm9pZCAwKSB7IHJlYWRhYmxlU3RyYXRlZ3kgPSB7fTsgfVxuICAgICAgICAgICAgdmFyIHdyaXRhYmxlU2l6ZUZ1bmN0aW9uID0gd3JpdGFibGVTdHJhdGVneS5zaXplO1xuICAgICAgICAgICAgdmFyIHdyaXRhYmxlSGlnaFdhdGVyTWFyayA9IHdyaXRhYmxlU3RyYXRlZ3kuaGlnaFdhdGVyTWFyaztcbiAgICAgICAgICAgIHZhciByZWFkYWJsZVNpemVGdW5jdGlvbiA9IHJlYWRhYmxlU3RyYXRlZ3kuc2l6ZTtcbiAgICAgICAgICAgIHZhciByZWFkYWJsZUhpZ2hXYXRlck1hcmsgPSByZWFkYWJsZVN0cmF0ZWd5LmhpZ2hXYXRlck1hcms7XG4gICAgICAgICAgICB2YXIgd3JpdGFibGVUeXBlID0gdHJhbnNmb3JtZXIud3JpdGFibGVUeXBlO1xuICAgICAgICAgICAgaWYgKHdyaXRhYmxlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgd3JpdGFibGUgdHlwZSBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB3cml0YWJsZVNpemVBbGdvcml0aG0gPSBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24od3JpdGFibGVTaXplRnVuY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHdyaXRhYmxlSGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyaXRhYmxlSGlnaFdhdGVyTWFyayA9IFZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayh3cml0YWJsZUhpZ2hXYXRlck1hcmspO1xuICAgICAgICAgICAgdmFyIHJlYWRhYmxlVHlwZSA9IHRyYW5zZm9ybWVyLnJlYWRhYmxlVHlwZTtcbiAgICAgICAgICAgIGlmIChyZWFkYWJsZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHJlYWRhYmxlIHR5cGUgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVhZGFibGVTaXplQWxnb3JpdGhtID0gTWFrZVNpemVBbGdvcml0aG1Gcm9tU2l6ZUZ1bmN0aW9uKHJlYWRhYmxlU2l6ZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIGlmIChyZWFkYWJsZUhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkYWJsZUhpZ2hXYXRlck1hcmsgPSBWYWxpZGF0ZUFuZE5vcm1hbGl6ZUhpZ2hXYXRlck1hcmsocmVhZGFibGVIaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgICAgIHZhciBzdGFydFByb21pc2VfcmVzb2x2ZTtcbiAgICAgICAgICAgIHZhciBzdGFydFByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtKHRoaXMsIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKTtcbiAgICAgICAgICAgIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIodGhpcywgdHJhbnNmb3JtZXIpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0UmVzdWx0ID0gSW52b2tlT3JOb29wKHRyYW5zZm9ybWVyLCAnc3RhcnQnLCBbdGhpcy5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcl0pO1xuICAgICAgICAgICAgc3RhcnRQcm9taXNlX3Jlc29sdmUoc3RhcnRSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLCBcInJlYWRhYmxlXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbSh0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdyZWFkYWJsZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUsIFwid3JpdGFibGVcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIoJ3dyaXRhYmxlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtO1xuICAgIH0oKSk7XG4gICAgZnVuY3Rpb24gSW5pdGlhbGl6ZVRyYW5zZm9ybVN0cmVhbShzdHJlYW0sIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKSB7XG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB3cml0ZUFsZ29yaXRobShjaHVuaykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWJvcnRBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobShzdHJlYW0sIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2xvc2VBbGdvcml0aG0oKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5fd3JpdGFibGUgPSBDcmVhdGVXcml0YWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0pO1xuICAgICAgICBmdW5jdGlvbiBwdWxsQWxnb3JpdGhtKCkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIHJlYXNvbik7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5fcmVhZGFibGUgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCByZWFkYWJsZUhpZ2hXYXRlck1hcmssIHJlYWRhYmxlU2l6ZUFsZ29yaXRobSk7XG4gICAgICAgIC8vIFRoZSBbW2JhY2twcmVzc3VyZV1dIHNsb3QgaXMgc2V0IHRvIHVuZGVmaW5lZCBzbyB0aGF0IGl0IGNhbiBiZSBpbml0aWFsaXNlZCBieSBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUuXG4gICAgICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlID0gdW5kZWZpbmVkO1xuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTtcbiAgICAgICAgLy8gVXNlZCBieSBJc1dyaXRhYmxlU3RyZWFtKCkgd2hpY2ggaXMgY2FsbGVkIGJ5IFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKS5cbiAgICAgICAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbSh4KSB7XG4gICAgICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ190cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gVGhpcyBpcyBhIG5vLW9wIGlmIGJvdGggc2lkZXMgYXJlIGFscmVhZHkgZXJyb3JlZC5cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIGUpIHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgZSk7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIGUpIHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoc3RyZWFtLl93cml0YWJsZS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyLCBlKTtcbiAgICAgICAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBQcmV0ZW5kIHRoYXQgcHVsbCgpIHdhcyBjYWxsZWQgdG8gcGVybWl0IGFueSBwZW5kaW5nIHdyaXRlKCkgY2FsbHMgdG8gY29tcGxldGUuIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSgpXG4gICAgICAgICAgICAvLyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gZW5xdWV1ZSgpIG9yIHB1bGwoKSBvbmNlIHRoZSBSZWFkYWJsZVN0cmVhbSBpcyBlcnJvcmVkLCBzbyB0aGlzIHdpbGwgd2lsbCBiZSB0aGUgZmluYWwgdGltZVxuICAgICAgICAgICAgLy8gX2JhY2twcmVzc3VyZSBpcyBzZXQuXG4gICAgICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKSB7XG4gICAgICAgIC8vIFBhc3NlcyBhbHNvIHdoZW4gY2FsbGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAgICAgIGlmIChzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSBuZXdQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTtcbiAgICB9XG4gICAgdmFyIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgaW5zdGFuY2VzIGNhbm5vdCBiZSBjcmVhdGVkIGRpcmVjdGx5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgXCJkZXNpcmVkU2l6ZVwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZWFkYWJsZUNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2VucXVldWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLCBjaHVuayk7XG4gICAgICAgIH07XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGlmIChJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdlcnJvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCByZWFzb24pO1xuICAgICAgICB9O1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUudGVybWluYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3Rlcm1pbmF0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcbiAgICB9KCkpO1xuICAgIC8vIFRyYW5zZm9ybSBTdHJlYW0gRGVmYXVsdCBDb250cm9sbGVyIEFic3RyYWN0IE9wZXJhdGlvbnNcbiAgICBmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHgpIHtcbiAgICAgICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgdHJhbnNmb3JtQWxnb3JpdGhtLCBmbHVzaEFsZ29yaXRobSkge1xuICAgICAgICBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBzdHJlYW0uX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0gPSB0cmFuc2Zvcm1BbGdvcml0aG07XG4gICAgICAgIGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtID0gZmx1c2hBbGdvcml0aG07XG4gICAgfVxuICAgIGZ1bmN0aW9uIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIoc3RyZWFtLCB0cmFuc2Zvcm1lcikge1xuICAgICAgICB2YXIgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICAgICAgdmFyIHRyYW5zZm9ybUFsZ29yaXRobSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAodHJhbnNmb3JtUmVzdWx0RSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHRyYW5zZm9ybVJlc3VsdEUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgdHJhbnNmb3JtTWV0aG9kID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtO1xuICAgICAgICBpZiAodHJhbnNmb3JtTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJhbnNmb3JtIGlzIG5vdCBhIG1ldGhvZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhbnNmb3JtQWxnb3JpdGhtID0gZnVuY3Rpb24gKGNodW5rKSB7IHJldHVybiBQcm9taXNlQ2FsbCh0cmFuc2Zvcm1NZXRob2QsIHRyYW5zZm9ybWVyLCBbY2h1bmssIGNvbnRyb2xsZXJdKTsgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmx1c2hBbGdvcml0aG0gPSBDcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZCh0cmFuc2Zvcm1lciwgJ2ZsdXNoJywgMCwgW2NvbnRyb2xsZXJdKTtcbiAgICAgICAgU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHRyYW5zZm9ybUFsZ29yaXRobSwgZmx1c2hBbGdvcml0aG0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3RyYW5zZm9ybUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbTtcbiAgICAgICAgdmFyIHJlYWRhYmxlQ29udHJvbGxlciA9IHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShyZWFkYWJsZUNvbnRyb2xsZXIpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGUgc2lkZSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHRocm90dGxlIHRyYW5zZm9ybSBpbnZvY2F0aW9ucyBiYXNlZCBvbiB0aGUgYmFja3ByZXNzdXJlIG9mIHRoZSBSZWFkYWJsZVN0cmVhbSwgYnV0IHdlIHN0aWxsXG4gICAgICAgIC8vIGFjY2VwdCBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoKSBjYWxscy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZWFkYWJsZVN0cmF0ZWd5LnNpemUoKSB0aHJvd3MuXG4gICAgICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSk7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW0uX3JlYWRhYmxlLl9zdG9yZWRFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFja3ByZXNzdXJlID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZShyZWFkYWJsZUNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAoYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKSB7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0sIGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0oY29udHJvbGxlciwgY2h1bmspIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybVByb21pc2UgPSBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0oY2h1bmspO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgodHJhbnNmb3JtUHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3IoY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSwgcik7XG4gICAgICAgICAgICB0aHJvdyByO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUoY29udHJvbGxlcikge1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbTtcbiAgICAgICAgdmFyIHJlYWRhYmxlQ29udHJvbGxlciA9IHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShyZWFkYWJsZUNvbnRyb2xsZXIpID09PSB0cnVlKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBuZXcgVHlwZUVycm9yKCdUcmFuc2Zvcm1TdHJlYW0gdGVybWluYXRlZCcpO1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZXJyb3IpO1xuICAgIH1cbiAgICAvLyBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2luayBBbGdvcml0aG1zXG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtXcml0ZUFsZ29yaXRobShzdHJlYW0sIGNodW5rKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyO1xuICAgICAgICBpZiAoc3RyZWFtLl9iYWNrcHJlc3N1cmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBiYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlID0gc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKGJhY2twcmVzc3VyZUNoYW5nZVByb21pc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgd3JpdGFibGUgPSBzdHJlYW0uX3dyaXRhYmxlO1xuICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdyaXRhYmxlLl9zdGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgd3JpdGFibGUuX3N0b3JlZEVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGNvbnRyb2xsZXIsIGNodW5rKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0oY29udHJvbGxlciwgY2h1bmspO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Fib3J0QWxnb3JpdGhtKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgICAgIC8vIGFib3J0KCkgaXMgbm90IGNhbGxlZCBzeW5jaHJvbm91c2x5LCBzbyBpdCBpcyBwb3NzaWJsZSBmb3IgYWJvcnQoKSB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGFscmVhZHlcbiAgICAgICAgLy8gZXJyb3JlZC5cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCByZWFzb24pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Nsb3NlQWxnb3JpdGhtKHN0cmVhbSkge1xuICAgICAgICAvLyBzdHJlYW0uX3JlYWRhYmxlIGNhbm5vdCBjaGFuZ2UgYWZ0ZXIgY29uc3RydWN0aW9uLCBzbyBjYWNoaW5nIGl0IGFjcm9zcyBhIGNhbGwgdG8gdXNlciBjb2RlIGlzIHNhZmUuXG4gICAgICAgIHZhciByZWFkYWJsZSA9IHN0cmVhbS5fcmVhZGFibGU7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyO1xuICAgICAgICB2YXIgZmx1c2hQcm9taXNlID0gY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0oKTtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIC8vIFJldHVybiBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB1bmRlZmluZWQgb24gc3VjY2Vzcy5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKGZsdXNoUHJvbWlzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHJlYWRhYmxlLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVhZGFibGUuX3N0b3JlZEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlYWRhYmxlQ29udHJvbGxlciA9IHJlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgICAgICAgICBpZiAoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlcikgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yKHN0cmVhbSwgcik7XG4gICAgICAgICAgICB0aHJvdyByZWFkYWJsZS5fc3RvcmVkRXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlIEFsZ29yaXRobXNcbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobShzdHJlYW0pIHtcbiAgICAgICAgLy8gSW52YXJpYW50LiBFbmZvcmNlZCBieSB0aGUgcHJvbWlzZXMgcmV0dXJuZWQgYnkgc3RhcnQoKSBhbmQgcHVsbCgpLlxuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCBmYWxzZSk7XG4gICAgICAgIC8vIFByZXZlbnQgdGhlIG5leHQgcHVsbCgpIGNhbGwgdW50aWwgdGhlcmUgaXMgYmFja3ByZXNzdXJlLlxuICAgICAgICByZXR1cm4gc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlO1xuICAgIH1cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIuXG4gICAgZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEobmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5cIiArIG5hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJcIik7XG4gICAgfVxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBUcmFuc2Zvcm1TdHJlYW0uXG4gICAgZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLlwiICsgbmFtZSArIFwiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW1cIik7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5CeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5ID0gQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneTtcbiAgICBleHBvcnRzLkNvdW50UXVldWluZ1N0cmF0ZWd5ID0gQ291bnRRdWV1aW5nU3RyYXRlZ3k7XG4gICAgZXhwb3J0cy5SZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlU3RyZWFtO1xuICAgIGV4cG9ydHMuVHJhbnNmb3JtU3RyZWFtID0gVHJhbnNmb3JtU3RyZWFtO1xuICAgIGV4cG9ydHMuV3JpdGFibGVTdHJlYW0gPSBXcml0YWJsZVN0cmVhbTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb255ZmlsbC5qcy5tYXBcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk1hcDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBNYXBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXAtb2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdNYXAnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7XG4gIHZhciBJU19NQVAgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ01hcCcpICE9PSAtMTtcbiAgdmFyIElTX1dFQUsgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ1dlYWsnKSAhPT0gLTE7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgdmFyIE5hdGl2ZVByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yICYmIE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7XG4gIHZhciBleHBvcnRlZCA9IHt9O1xuXG4gIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbiAoS0VZKSB7XG4gICAgdmFyIG5hdGl2ZU1ldGhvZCA9IE5hdGl2ZVByb3RvdHlwZVtLRVldO1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb3RvdHlwZSwgS0VZLFxuICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdnZXQnID8gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IHVuZGVmaW5lZCA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHlwZW9mIE5hdGl2ZUNvbnN0cnVjdG9yICE9ICdmdW5jdGlvbicgfHwgIShJU19XRUFLIHx8IE5hdGl2ZVByb3RvdHlwZS5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSkge1xuICAgIC8vIGNyZWF0ZSBjb2xsZWN0aW9uIGNvbnN0cnVjdG9yXG4gICAgQ29uc3RydWN0b3IgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCksIGR1bW15LCBDb25zdHJ1Y3Rvcik7XG4gICAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB0aGF0LCBJU19NQVApO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IgfSwgZXhwb3J0ZWQpO1xuXG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufTtcbiIsInZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xuXG52YXIgTUVUQURBVEEgPSB1aWQoJ21ldGEnKTtcbnZhciBpZCA9IDA7XG5cbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgc2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgZGVmaW5lUHJvcGVydHkoaXQsIE1FVEFEQVRBLCB7IHZhbHVlOiB7XG4gICAgb2JqZWN0SUQ6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHdlYWtEYXRhOiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcblxudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gYSBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS5vYmplY3RJRDtcbn07XG5cbnZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gdGhlIHN0b3JlIG9mIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTtcbn07XG5cbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWklORyAmJiBtZXRhLlJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIFJFUVVJUkVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cbmhpZGRlbktleXNbTUVUQURBVEFdID0gdHJ1ZTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gbWFrZXMgc3ViY2xhc3Npbmcgd29yayBjb3JyZWN0IGZvciB3cmFwcGVkIGJ1aWx0LWluc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJHRoaXMsIGR1bW15LCBXcmFwcGVyKSB7XG4gIHZhciBOZXdUYXJnZXQsIE5ld1RhcmdldFByb3RvdHlwZTtcbiAgaWYgKFxuICAgIC8vIGl0IGNhbiB3b3JrIG9ubHkgd2l0aCBuYXRpdmUgYHNldFByb3RvdHlwZU9mYFxuICAgIHNldFByb3RvdHlwZU9mICYmXG4gICAgLy8gd2UgaGF2ZW4ndCBjb21wbGV0ZWx5IGNvcnJlY3QgcHJlLUVTNiB3YXkgZm9yIGdldHRpbmcgYG5ldy50YXJnZXRgLCBzbyB1c2UgdGhpc1xuICAgIHR5cGVvZiAoTmV3VGFyZ2V0ID0gZHVtbXkuY29uc3RydWN0b3IpID09ICdmdW5jdGlvbicgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5mYXN0S2V5O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGluZGV4OiBjcmVhdGUobnVsbCksXG4gICAgICAgIGZpcnN0OiB1bmRlZmluZWQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgc2l6ZTogMFxuICAgICAgfSk7XG4gICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHRoYXQsIElTX01BUCk7XG4gICAgfSk7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgdmFyIHByZXZpb3VzLCBpbmRleDtcbiAgICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XG4gICAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7XG4gICAgICAgICAgaW5kZXg6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91czogcHJldmlvdXMgPSBzdGF0ZS5sYXN0LFxuICAgICAgICAgIG5leHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZW1vdmVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXN0YXRlLmZpcnN0KSBzdGF0ZS5maXJzdCA9IGVudHJ5O1xuICAgICAgICBpZiAocHJldmlvdXMpIHByZXZpb3VzLm5leHQgPSBlbnRyeTtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplKys7XG4gICAgICAgIGVsc2UgdGhhdC5zaXplKys7XG4gICAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09ICdGJykgc3RhdGUuaW5kZXhbaW5kZXhdID0gZW50cnk7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICB2YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgLy8gZmFzdCBjYXNlXG4gICAgICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gICAgICB2YXIgZW50cnk7XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHN0YXRlLmluZGV4W2luZGV4XTtcbiAgICAgIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICAgICAgZm9yIChlbnRyeSA9IHN0YXRlLmZpcnN0OyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uZXh0KSB7XG4gICAgICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBkYXRhID0gc3RhdGUuaW5kZXg7XG4gICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0O1xuICAgICAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplID0gMDtcbiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgICBkZWxldGUgc3RhdGUuaW5kZXhbZW50cnkuaW5kZXhdO1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm5leHQgPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnByZXZpb3VzID0gcHJldjtcbiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT0gZW50cnkpIHN0YXRlLmZpcnN0ID0gbmV4dDtcbiAgICAgICAgICBpZiAoc3RhdGUubGFzdCA9PSBlbnRyeSkgc3RhdGUubGFzdCA9IHByZXY7XG4gICAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplLS07XG4gICAgICAgICAgZWxzZSB0aGF0LnNpemUtLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7XG4gICAgICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHtcbiAgICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJztcbiAgICB2YXIgZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpO1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICBkZWZpbmVJdGVyYXRvcihDLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9O1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS52YWx1ZSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguU2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYFNldGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNldC1vYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ1NldCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMud2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguV2Vha01hcDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25XZWFrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGVuZm9yY2VJdGVybmFsU3RhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKS5lbmZvcmNlO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcblxudmFyIElTX0lFMTEgPSAhZ2xvYmFsLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xudmFyIEludGVybmFsV2Vha01hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtd2Vha21hcC1jb25zdHJ1Y3RvclxudmFyICRXZWFrTWFwID0gbW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdXZWFrTWFwJywgd3JhcHBlciwgY29sbGVjdGlvbldlYWspO1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG4vLyBXZSBjYW4ndCB1c2UgZmVhdHVyZSBkZXRlY3Rpb24gYmVjYXVzZSBpdCBjcmFzaCBzb21lIG9sZCBJRSBidWlsZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80ODVcbmlmIChOQVRJVkVfV0VBS19NQVAgJiYgSVNfSUUxMSkge1xuICBJbnRlcm5hbFdlYWtNYXAgPSBjb2xsZWN0aW9uV2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCAnV2Vha01hcCcsIHRydWUpO1xuICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTtcbiAgdmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVEZWxldGUgPSBXZWFrTWFwUHJvdG90eXBlWydkZWxldGUnXTtcbiAgdmFyIG5hdGl2ZUhhcyA9IFdlYWtNYXBQcm90b3R5cGUuaGFzO1xuICB2YXIgbmF0aXZlR2V0ID0gV2Vha01hcFByb3RvdHlwZS5nZXQ7XG4gIHZhciBuYXRpdmVTZXQgPSBXZWFrTWFwUHJvdG90eXBlLnNldDtcbiAgcmVkZWZpbmVBbGwoV2Vha01hcFByb3RvdHlwZSwge1xuICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGV0ZS5jYWxsKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuWydkZWxldGUnXShrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plbi5oYXMoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KSA/IG5hdGl2ZUdldC5jYWxsKHRoaXMsIGtleSkgOiBzdGF0ZS5mcm96ZW4uZ2V0KGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVHZXQuY2FsbCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSkgPyBuYXRpdmVTZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlKSA6IHN0YXRlLmZyb3plbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgbmF0aXZlU2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGdldFdlYWtEYXRhID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykuZ2V0V2Vha0RhdGE7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIEFycmF5SXRlcmF0aW9uTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpO1xudmFyICRoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcbnZhciBmaW5kID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZDtcbnZhciBmaW5kSW5kZXggPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kSW5kZXg7XG52YXIgaWQgPSAwO1xuXG4vLyBmYWxsYmFjayBmb3IgdW5jYXVnaHQgZnJvemVuIGtleXNcbnZhciB1bmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKHN0b3JlKSB7XG4gIHJldHVybiBzdG9yZS5mcm96ZW4gfHwgKHN0b3JlLmZyb3plbiA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKCkpO1xufTtcblxudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW50cmllcyA9IFtdO1xufTtcblxudmFyIGZpbmRVbmNhdWdodEZyb3plbiA9IGZ1bmN0aW9uIChzdG9yZSwga2V5KSB7XG4gIHJldHVybiBmaW5kKHN0b3JlLmVudHJpZXMsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5cblVuY2F1Z2h0RnJvemVuU3RvcmUucHJvdG90eXBlID0ge1xuICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZiAoZW50cnkpIHJldHVybiBlbnRyeVsxXTtcbiAgfSxcbiAgaGFzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuICEhZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZiAoZW50cnkpIGVudHJ5WzFdID0gdmFsdWU7XG4gICAgZWxzZSB0aGlzLmVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LFxuICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBpbmRleCA9IGZpbmRJbmRleCh0aGlzLmVudHJpZXMsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgdGhpcy5lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpZDogaWQrKyxcbiAgICAgICAgZnJvemVuOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHRoYXQsIElTX01BUCk7XG4gICAgfSk7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTtcbiAgICAgIGVsc2UgZGF0YVtzdGF0ZS5pZF0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgc3RhdGUuaWQpICYmIGRlbGV0ZSBkYXRhW3N0YXRlLmlkXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgc3RhdGUuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIElTX01BUCA/IHtcbiAgICAgIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEM7XG4gIH1cbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbnZhciBwdXNoID0gW10ucHVzaDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaC5jYWxsKHRhcmdldCwgdmFsdWUpOyAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNilcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy53ZWFrLXNldCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5XZWFrU2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25XZWFrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24td2VhaycpO1xuXG4vLyBgV2Vha1NldGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdlYWtzZXQtY29uc3RydWN0b3JcbmNvbGxlY3Rpb24oJ1dlYWtTZXQnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpIHsgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCBjb2xsZWN0aW9uV2Vhayk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0Jyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdjb2RlUG9pbnRBdCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY29kZUF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jb2RlQXQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSB9LCB7XG4gIGNvZGVQb2ludEF0OiBmdW5jdGlvbiBjb2RlUG9pbnRBdChwb3MpIHtcbiAgICByZXR1cm4gY29kZUF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5TdHJpbmcuZnJvbUNvZGVQb2ludDtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBuYXRpdmVGcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbnZhciBJTkNPUlJFQ1RfTEVOR1RIID0gISFuYXRpdmVGcm9tQ29kZVBvaW50ICYmIG5hdGl2ZUZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDE7XG5cbi8vIGBTdHJpbmcuZnJvbUNvZGVQb2ludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcuZnJvbWNvZGVwb2ludFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0xFTkdUSCB9LCB7XG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYgKHRvQWJzb2x1dGVJbmRleChjb2RlLCAweDEwRkZGRikgIT09IGNvZGUpIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgZWxlbWVudHMucHVzaChjb2RlIDwgMHgxMDAwMFxuICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgICA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLCBjb2RlICUgMHg0MDAgKyAweERDMDApXG4gICAgICApO1xuICAgIH0gcmV0dXJuIGVsZW1lbnRzLmpvaW4oJycpO1xuICB9XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN5bWJvbDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7XG52YXIgTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEID0gJ01heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCc7XG5cbi8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuLy8gZGVvcHRpbWl6YXRpb24gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUID0gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyYXkgPSBbXTtcbiAgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7XG4gIHJldHVybiBhcnJheS5jb25jYXQoKVswXSAhPT0gYXJyYXk7XG59KTtcblxudmFyIFNQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ2NvbmNhdCcpO1xuXG52YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHtcbiAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgc3ByZWFkYWJsZSA9IE9bSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTtcbn07XG5cbnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhU1BFQ0lFU19TVVBQT1JUO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29uY2F0XG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAaXNDb25jYXRTcHJlYWRhYmxlIGFuZCBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KGFyZykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGksIGssIGxlbmd0aCwgbGVuLCBFO1xuICAgIGZvciAoaSA9IC0xLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIEUgPSBpID09PSAtMSA/IE8gOiBhcmd1bWVudHNbaV07XG4gICAgICBpZiAoaXNDb25jYXRTcHJlYWRhYmxlKEUpKSB7XG4gICAgICAgIGxlbiA9IHRvTGVuZ3RoKEUubGVuZ3RoKTtcbiAgICAgICAgaWYgKG4gKyBsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgaysrLCBuKyspIGlmIChrIGluIEUpIGNyZWF0ZVByb3BlcnR5KEEsIG4sIEVba10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG4gPj0gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4rKywgRSk7XG4gICAgICB9XG4gICAgfVxuICAgIEEubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIC8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc3XG4gIHJldHVybiBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gYXJyYXkuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGZvbzogMSB9O1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5W01FVEhPRF9OQU1FXShCb29sZWFuKS5mb28gIT09IDE7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgbmF0aXZlT2JqZWN0Q3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCcpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5mb3JFYWNoO1xuXG52YXIgSElEREVOID0gc2hhcmVkS2V5KCdoaWRkZW4nKTtcbnZhciBTWU1CT0wgPSAnU3ltYm9sJztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeScpO1xudmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIFVTRV9TRVRURVIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0Q3JlYXRlKG5hdGl2ZURlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIHZhciBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yID0gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgUCk7XG4gIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKSBkZWxldGUgT2JqZWN0UHJvdG90eXBlW1BdO1xuICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgaWYgKE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgJiYgTyAhPT0gT2JqZWN0UHJvdG90eXBlKSB7XG4gICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTtcbiAgfVxufSA6IG5hdGl2ZURlZmluZVByb3BlcnR5O1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcsIGRlc2NyaXB0aW9uKSB7XG4gIHZhciBzeW1ib2wgPSBBbGxTeW1ib2xzW3RhZ10gPSBuYXRpdmVPYmplY3RDcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc2V0SW50ZXJuYWxTdGF0ZShzeW1ib2wsIHtcbiAgICB0eXBlOiBTWU1CT0wsXG4gICAgdGFnOiB0YWcsXG4gICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXG4gIH0pO1xuICBpZiAoIURFU0NSSVBUT1JTKSBzeW1ib2wuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgcmV0dXJuIHN5bWJvbDtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoaXQpIGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGlmIChPID09PSBPYmplY3RQcm90b3R5cGUpICRkZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQLCBBdHRyaWJ1dGVzKTtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghQXR0cmlidXRlcy5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhPLCBISURERU4pKSBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBISURERU4sIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB7fSkpO1xuICAgICAgT1tISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKE8sIEhJRERFTikgJiYgT1tISURERU5dW2tleV0pIE9bSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBBdHRyaWJ1dGVzID0gbmF0aXZlT2JqZWN0Q3JlYXRlKEF0dHJpYnV0ZXMsIHsgZW51bWVyYWJsZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjcmlwdG9yKE8sIGtleSwgQXR0cmlidXRlcyk7XG4gIH0gcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIGtleSwgQXR0cmlidXRlcyk7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wZXJ0aWVzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMocHJvcGVydGllcykuY29uY2F0KCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcGVydGllcykpO1xuICAkZm9yRWFjaChrZXlzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFERVNDUklQVE9SUyB8fCAkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChwcm9wZXJ0aWVzLCBrZXkpKSAkZGVmaW5lUHJvcGVydHkoTywga2V5LCBwcm9wZXJ0aWVzW2tleV0pO1xuICB9KTtcbiAgcmV0dXJuIE87XG59O1xuXG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyBuYXRpdmVPYmplY3RDcmVhdGUoTykgOiAkZGVmaW5lUHJvcGVydGllcyhuYXRpdmVPYmplY3RDcmVhdGUoTyksIFByb3BlcnRpZXMpO1xufTtcblxudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIFAgPSB0b1ByaW1pdGl2ZShWLCB0cnVlKTtcbiAgdmFyIGVudW1lcmFibGUgPSBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRoaXMsIFApO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhcyhBbGxTeW1ib2xzLCBQKSAmJiAhaGFzKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIFApKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbnVtZXJhYmxlIHx8ICFoYXModGhpcywgUCkgfHwgIWhhcyhBbGxTeW1ib2xzLCBQKSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1bUF0gPyBlbnVtZXJhYmxlIDogdHJ1ZTtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgdmFyIGl0ID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgZGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTtcbiAgaWYgKGRlc2NyaXB0b3IgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkge1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGRlc2NyaXB0b3I7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoTykpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKGhpZGRlbktleXMsIGtleSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTykge1xuICB2YXIgSVNfT0JKRUNUX1BST1RPVFlQRSA9IE8gPT09IE9iamVjdFByb3RvdHlwZTtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhJU19PQkpFQ1RfUFJPVE9UWVBFID8gT2JqZWN0UHJvdG90eXBlU3ltYm9scyA6IHRvSW5kZXhlZE9iamVjdChPKSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgKCFJU19PQkpFQ1RfUFJPVE9UWVBFIHx8IGhhcyhPYmplY3RQcm90b3R5cGUsIGtleSkpKSB7XG4gICAgICByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBgU3ltYm9sYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLWNvbnN0cnVjdG9yXG5pZiAoIU5BVElWRV9TWU1CT0wpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgdGFnID0gdWlkKGRlc2NyaXB0aW9uKTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlKSBzZXR0ZXIuY2FsbChPYmplY3RQcm90b3R5cGVTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2NyaXB0b3IodGhpcywgdGFnLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBVU0VfU0VUVEVSKSBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiBzZXR0ZXIgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7XG4gIH07XG5cbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7XG4gIH0pO1xuXG4gIHJlZGVmaW5lKCRTeW1ib2wsICd3aXRob3V0U2V0dGVyJywgZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIHdyYXAodWlkKGRlc2NyaXB0aW9uKSwgZGVzY3JpcHRpb24pO1xuICB9KTtcblxuICBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mID0gJGRlZmluZVByb3BlcnR5O1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdlbGxLbm93blN5bWJvbChuYW1lKSwgbmFtZSk7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtU3ltYm9sLWRlc2NyaXB0aW9uXG4gICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoJFN5bWJvbFtQUk9UT1RZUEVdLCAnZGVzY3JpcHRpb24nLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5kZXNjcmlwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIUlTX1BVUkUpIHtcbiAgICAgIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIU5BVElWRV9TWU1CT0wgfSwge1xuICBTeW1ib2w6ICRTeW1ib2xcbn0pO1xuXG4kZm9yRWFjaChvYmplY3RLZXlzKFdlbGxLbm93blN5bWJvbHNTdG9yZSksIGZ1bmN0aW9uIChuYW1lKSB7XG4gIGRlZmluZVdlbGxLbm93blN5bWJvbChuYW1lKTtcbn0pO1xuXG4kKHsgdGFyZ2V0OiBTWU1CT0wsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wgfSwge1xuICAvLyBgU3ltYm9sLmZvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5mb3JcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgc3RyaW5nID0gU3RyaW5nKGtleSk7XG4gICAgaWYgKGhhcyhTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5LCBzdHJpbmcpKSByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddO1xuICAgIHZhciBzeW1ib2wgPSAkU3ltYm9sKHN0cmluZyk7XG4gICAgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddID0gc3ltYm9sO1xuICAgIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltYm9sXSA9IHN0cmluZztcbiAgICByZXR1cm4gc3ltYm9sO1xuICB9LFxuICAvLyBgU3ltYm9sLmtleUZvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5rZXlmb3JcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcbiAgICBpZiAoaGFzKFN5bWJvbFRvU3RyaW5nUmVnaXN0cnksIHN5bSkpIHJldHVybiBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5W3N5bV07XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSBmYWxzZTsgfVxufSk7XG5cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICAvLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvclxufSk7XG5cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5c3ltYm9sc1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyBDaHJvbWUgMzggYW5kIDM5IGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBmYWlscyBvbiBwcmltaXRpdmVzXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNDQzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBmYWlscyhmdW5jdGlvbiAoKSB7IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKDEpOyB9KSB9LCB7XG4gIGdldE93blByb3BlcnR5U3ltYm9sczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gICAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKHRvT2JqZWN0KGl0KSk7XG4gIH1cbn0pO1xuXG4vLyBgSlNPTi5zdHJpbmdpZnlgIG1ldGhvZCBiZWhhdmlvciB3aXRoIHN5bWJvbHNcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24uc3RyaW5naWZ5XG5pZiAoJHN0cmluZ2lmeSkge1xuICB2YXIgRk9SQ0VEX0pTT05fU1RSSU5HSUZZID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBzeW1ib2wgPSAkU3ltYm9sKCk7XG4gICAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgICByZXR1cm4gJHN0cmluZ2lmeShbc3ltYm9sXSkgIT0gJ1tudWxsXSdcbiAgICAgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAgICAgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPSAne30nXG4gICAgICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICAgICAgfHwgJHN0cmluZ2lmeShPYmplY3Qoc3ltYm9sKSkgIT0gJ3t9JztcbiAgfSk7XG5cbiAgJCh7IHRhcmdldDogJ0pTT04nLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9KU09OX1NUUklOR0lGWSB9LCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgICAgdmFyIGluZGV4ID0gMTtcbiAgICAgIHZhciAkcmVwbGFjZXI7XG4gICAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGluZGV4KSBhcmdzLnB1c2goYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICAgICRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICAgIHJldHVybiAkc3RyaW5naWZ5LmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZVxuaWYgKCEkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbn1cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddYCBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCBTWU1CT0wpO1xuXG5oaWRkZW5LZXlzW0hJRERFTl0gPSB0cnVlO1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xuXG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KGl0KSk7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG5leHBvcnRzLmYgPSB3ZWxsS25vd25TeW1ib2w7XG4iLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FKSB7XG4gIHZhciBTeW1ib2wgPSBwYXRoLlN5bWJvbCB8fCAocGF0aC5TeW1ib2wgPSB7fSk7XG4gIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwge1xuICAgIHZhbHVlOiB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYoTkFNRSlcbiAgfSk7XG59O1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5hc3luY0l0ZXJhdG9yYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmFzeW5jaXRlcmF0b3JcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpO1xuIiwiLy8gYFN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25gIGdldHRlclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvblxuJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG5cbnZhciBOYXRpdmVTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xuXG5pZiAoREVTQ1JJUFRPUlMgJiYgdHlwZW9mIE5hdGl2ZVN5bWJvbCA9PSAnZnVuY3Rpb24nICYmICghKCdkZXNjcmlwdGlvbicgaW4gTmF0aXZlU3ltYm9sLnByb3RvdHlwZSkgfHxcbiAgLy8gU2FmYXJpIDEyIGJ1Z1xuICBOYXRpdmVTeW1ib2woKS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkXG4pKSB7XG4gIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTtcbiAgLy8gd3JhcCBTeW1ib2wgY29uc3RydWN0b3IgZm9yIGNvcnJlY3Qgd29yayB3aXRoIHVuZGVmaW5lZCBkZXNjcmlwdGlvblxuICB2YXIgU3ltYm9sV3JhcHBlciA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0cmluZyhhcmd1bWVudHNbMF0pO1xuICAgIHZhciByZXN1bHQgPSB0aGlzIGluc3RhbmNlb2YgU3ltYm9sV3JhcHBlclxuICAgICAgPyBuZXcgTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKVxuICAgICAgLy8gaW4gRWRnZSAxMywgU3RyaW5nKFN5bWJvbCh1bmRlZmluZWQpKSA9PT0gJ1N5bWJvbCh1bmRlZmluZWQpJ1xuICAgICAgOiBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gTmF0aXZlU3ltYm9sKCkgOiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gJycpIEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZVtyZXN1bHRdID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKFN5bWJvbFdyYXBwZXIsIE5hdGl2ZVN5bWJvbCk7XG4gIHZhciBzeW1ib2xQcm90b3R5cGUgPSBTeW1ib2xXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZVN5bWJvbC5wcm90b3R5cGU7XG4gIHN5bWJvbFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN5bWJvbFdyYXBwZXI7XG5cbiAgdmFyIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG90eXBlLnRvU3RyaW5nO1xuICB2YXIgbmF0aXZlID0gU3RyaW5nKE5hdGl2ZVN5bWJvbCgndGVzdCcpKSA9PSAnU3ltYm9sKHRlc3QpJztcbiAgdmFyIHJlZ2V4cCA9IC9eU3ltYm9sXFwoKC4qKVxcKVteKV0rJC87XG4gIGRlZmluZVByb3BlcnR5KHN5bWJvbFByb3RvdHlwZSwgJ2Rlc2NyaXB0aW9uJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkge1xuICAgICAgdmFyIHN5bWJvbCA9IGlzT2JqZWN0KHRoaXMpID8gdGhpcy52YWx1ZU9mKCkgOiB0aGlzO1xuICAgICAgdmFyIHN0cmluZyA9IHN5bWJvbFRvU3RyaW5nLmNhbGwoc3ltYm9sKTtcbiAgICAgIGlmIChoYXMoRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlLCBzeW1ib2wpKSByZXR1cm4gJyc7XG4gICAgICB2YXIgZGVzYyA9IG5hdGl2ZSA/IHN0cmluZy5zbGljZSg3LCAtMSkgOiBzdHJpbmcucmVwbGFjZShyZWdleHAsICckMScpO1xuICAgICAgcmV0dXJuIGRlc2MgPT09ICcnID8gdW5kZWZpbmVkIDogZGVzYztcbiAgICB9XG4gIH0pO1xuXG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgU3ltYm9sOiBTeW1ib2xXcmFwcGVyXG4gIH0pO1xufVxuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5oYXNJbnN0YW5jZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5oYXNpbnN0YW5jZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdoYXNJbnN0YW5jZScpO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXNjb25jYXRzcHJlYWRhYmxlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5pdGVyYXRvcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5pdGVyYXRvclxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5tYXRjaGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5tYXRjaFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5tYXRjaEFsbGAgd2VsbC1rbm93biBzeW1ib2xcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2hBbGwnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wucmVwbGFjZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5yZXBsYWNlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc2VhcmNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNlYXJjaFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzZWFyY2gnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc3BlY2llc2Agd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGVjaWVzXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc3BsaXRgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuc3BsaXRcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnc3BsaXQnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudG9QcmltaXRpdmVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9wcmltaXRpdmVcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudG9TdHJpbmdUYWdgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9zdHJpbmd0YWdcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudW5zY29wYWJsZXNgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudW5zY29wYWJsZXNcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbiIsInZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xuXG4vLyBNYXRoW0BAdG9TdHJpbmdUYWddIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG5cbi8vIEpTT05bQEB0b1N0cmluZ1RhZ10gcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24tQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3BhZFN0YXJ0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkcGFkU3RhcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCcpLnN0YXJ0O1xudmFyIFdFQktJVF9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZC13ZWJraXQtYnVnJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkc3RhcnRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXRUJLSVRfQlVHIH0sIHtcbiAgcGFkU3RhcnQ6IGZ1bmN0aW9uIHBhZFN0YXJ0KG1heExlbmd0aCAvKiAsIGZpbGxTdHJpbmcgPSAnICcgKi8pIHtcbiAgICByZXR1cm4gJHBhZFN0YXJ0KHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyBwYWRTdGFydCwgcGFkRW5kIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfRU5EKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIG1heExlbmd0aCwgZmlsbFN0cmluZykge1xuICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpbGxTdHIgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiBTdHJpbmcoZmlsbFN0cmluZyk7XG4gICAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gICAgdmFyIGZpbGxMZW4sIHN0cmluZ0ZpbGxlcjtcbiAgICBpZiAoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aCB8fCBmaWxsU3RyID09ICcnKSByZXR1cm4gUztcbiAgICBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoO1xuICAgIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIGNlaWwoZmlsbExlbiAvIGZpbGxTdHIubGVuZ3RoKSk7XG4gICAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKSBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gICAgcmV0dXJuIElTX0VORCA/IFMgKyBzdHJpbmdGaWxsZXIgOiBzdHJpbmdGaWxsZXIgKyBTO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRzdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUucGFkRW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRlbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcbm1vZHVsZS5leHBvcnRzID0gJycucmVwZWF0IHx8IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpO1xuICBmb3IgKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpIGlmIChuICYgMSkgcmVzdWx0ICs9IHN0cjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXVuc2FmZS1yZWdleFxubW9kdWxlLmV4cG9ydHMgPSAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8oIE1vYmlsZVxcL1xcdyspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1lbmQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3BhZEVuZCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHBhZEVuZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcGFkJykuZW5kO1xudmFyIFdFQktJVF9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZC13ZWJraXQtYnVnJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZGVuZFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFdFQktJVF9CVUcgfSwge1xuICBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuICRwYWRFbmQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QudmFsdWVzO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHZhbHVlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXknKS52YWx1ZXM7XG5cbi8vIGBPYmplY3QudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoTykge1xuICAgIHJldHVybiAkdmFsdWVzKE8pO1xuICB9XG59KTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbi8vIGBPYmplY3QueyBlbnRyaWVzLCB2YWx1ZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUT19FTlRSSUVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChpdCk7XG4gICAgdmFyIGtleXMgPSBvYmplY3RLZXlzKE8pO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGkpIHtcbiAgICAgIGtleSA9IGtleXNbaSsrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChPLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFRPX0VOVFJJRVMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuICBlbnRyaWVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBPYmplY3QudmFsdWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnZhbHVlc1xuICB2YWx1ZXM6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZW50cmllcztcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHtcbiAgICByZXR1cm4gJGVudHJpZXMoTyk7XG4gIH1cbn0pO1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiB1c2VzIFhSZWYgKi9cblxuaW1wb3J0IHsgYXNzZXJ0LCB1bnJlYWNoYWJsZSB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG52YXIgRU9GID0ge307XG5cbnZhciBOYW1lID0gKGZ1bmN0aW9uIE5hbWVDbG9zdXJlKCkge1xuICBsZXQgbmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE5hbWUobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cblxuICBOYW1lLnByb3RvdHlwZSA9IHt9O1xuXG4gIE5hbWUuZ2V0ID0gZnVuY3Rpb24gTmFtZV9nZXQobmFtZSkge1xuICAgIHZhciBuYW1lVmFsdWUgPSBuYW1lQ2FjaGVbbmFtZV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgcmV0dXJuIG5hbWVWYWx1ZSA/IG5hbWVWYWx1ZSA6IChuYW1lQ2FjaGVbbmFtZV0gPSBuZXcgTmFtZShuYW1lKSk7XG4gIH07XG5cbiAgTmFtZS5fY2xlYXJDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBuYW1lQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9O1xuXG4gIHJldHVybiBOYW1lO1xufSkoKTtcblxudmFyIENtZCA9IChmdW5jdGlvbiBDbWRDbG9zdXJlKCkge1xuICBsZXQgY21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQ21kKGNtZCkge1xuICAgIHRoaXMuY21kID0gY21kO1xuICB9XG5cbiAgQ21kLnByb3RvdHlwZSA9IHt9O1xuXG4gIENtZC5nZXQgPSBmdW5jdGlvbiBDbWRfZ2V0KGNtZCkge1xuICAgIHZhciBjbWRWYWx1ZSA9IGNtZENhY2hlW2NtZF07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgcmV0dXJuIGNtZFZhbHVlID8gY21kVmFsdWUgOiAoY21kQ2FjaGVbY21kXSA9IG5ldyBDbWQoY21kKSk7XG4gIH07XG5cbiAgQ21kLl9jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIGNtZENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfTtcblxuICByZXR1cm4gQ21kO1xufSkoKTtcblxudmFyIERpY3QgPSAoZnVuY3Rpb24gRGljdENsb3N1cmUoKSB7XG4gIHZhciBub25TZXJpYWxpemFibGUgPSBmdW5jdGlvbiBub25TZXJpYWxpemFibGVDbG9zdXJlKCkge1xuICAgIHJldHVybiBub25TZXJpYWxpemFibGU7IC8vIGNyZWF0aW5nIGNsb3N1cmUgb24gc29tZSB2YXJpYWJsZVxuICB9O1xuXG4gIC8vIHhyZWYgaXMgb3B0aW9uYWxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBEaWN0KHhyZWYpIHtcbiAgICAvLyBNYXAgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbnRlcm5hbGx5LCB1c2UgZnVuY3Rpb25zIGJlbG93IHRvIGFjY2Vzcy5cbiAgICB0aGlzLl9tYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMueHJlZiA9IHhyZWY7XG4gICAgdGhpcy5vYmpJZCA9IG51bGw7XG4gICAgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9fbm9uU2VyaWFsaXphYmxlX18gPSBub25TZXJpYWxpemFibGU7IC8vIGRpc2FibGUgY2xvbmluZyBvZiB0aGUgRGljdFxuICB9XG5cbiAgRGljdC5wcm90b3R5cGUgPSB7XG4gICAgYXNzaWduWHJlZjogZnVuY3Rpb24gRGljdF9hc3NpZ25YcmVmKG5ld1hyZWYpIHtcbiAgICAgIHRoaXMueHJlZiA9IG5ld1hyZWY7XG4gICAgfSxcblxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21hcCkubGVuZ3RoO1xuICAgIH0sXG5cbiAgICAvLyBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlcyBSZWYgb2JqZWN0c1xuICAgIGdldChrZXkxLCBrZXkyLCBrZXkzKSB7XG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLl9tYXBba2V5MV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrZXkyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5Ml07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5fbWFwW2tleTNdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2godmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgLy8gU2FtZSBhcyBnZXQoKSwgYnV0IHJldHVybnMgYSBwcm9taXNlIGFuZCB1c2VzIGZldGNoSWZSZWZBc3luYygpLlxuICAgIGFzeW5jIGdldEFzeW5jKGtleTEsIGtleTIsIGtleTMpIHtcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX21hcFtrZXkxXTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX21hcFtrZXkyXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5M107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueHJlZi5mZXRjaEFzeW5jKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgIC8vIFNhbWUgYXMgZ2V0KCksIGJ1dCBkZXJlZmVyZW5jZXMgYWxsIGVsZW1lbnRzIGlmIHRoZSByZXN1bHQgaXMgYW4gQXJyYXkuXG4gICAgZ2V0QXJyYXkoa2V5MSwga2V5Miwga2V5Mykge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXQoa2V5MSwga2V5Miwga2V5Myk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8ICF0aGlzLnhyZWYpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgpOyAvLyBFbnN1cmUgdGhhdCB3ZSBkb24ndCBtb2RpZnkgdGhlIERpY3QgZGF0YS5cbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaWYgKCEodmFsdWVbaV0gaW5zdGFuY2VvZiBSZWYpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVbaV0gPSB0aGlzLnhyZWYuZmV0Y2godmFsdWVbaV0sIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgLy8gbm8gZGVyZWZlcmVuY2luZ1xuICAgIGdldFJhdzogZnVuY3Rpb24gRGljdF9nZXRSYXcoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwW2tleV07XG4gICAgfSxcblxuICAgIGdldEtleXM6IGZ1bmN0aW9uIERpY3RfZ2V0S2V5cygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApO1xuICAgIH0sXG5cbiAgICAvLyBubyBkZXJlZmVyZW5jaW5nXG4gICAgZ2V0UmF3VmFsdWVzOiBmdW5jdGlvbiBEaWN0X2dldFJhd1ZhbHVlcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX21hcCk7XG4gICAgfSxcblxuICAgIHNldDogZnVuY3Rpb24gRGljdF9zZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIikpICYmXG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICB1bnJlYWNoYWJsZSgnRGljdC5zZXQ6IFRoZSBcInZhbHVlXCIgY2Fubm90IGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21hcFtrZXldID0gdmFsdWU7XG4gICAgfSxcblxuICAgIGhhczogZnVuY3Rpb24gRGljdF9oYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwW2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgZm9yRWFjaDogZnVuY3Rpb24gRGljdF9mb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fbWFwKSB7XG4gICAgICAgIGNhbGxiYWNrKGtleSwgdGhpcy5nZXQoa2V5KSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBEaWN0LmVtcHR5ID0gbmV3IERpY3QobnVsbCk7XG5cbiAgRGljdC5tZXJnZSA9IGZ1bmN0aW9uICh7IHhyZWYsIGRpY3RBcnJheSwgbWVyZ2VTdWJEaWN0cyA9IGZhbHNlIH0pIHtcbiAgICBjb25zdCBtZXJnZWREaWN0ID0gbmV3IERpY3QoeHJlZik7XG5cbiAgICBpZiAoIW1lcmdlU3ViRGljdHMpIHtcbiAgICAgIGZvciAoY29uc3QgZGljdCBvZiBkaWN0QXJyYXkpIHtcbiAgICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGljdC5fbWFwKSkge1xuICAgICAgICAgIGlmIChtZXJnZWREaWN0Ll9tYXBba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtZXJnZWREaWN0Ll9tYXBba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1lcmdlZERpY3Quc2l6ZSA+IDAgPyBtZXJnZWREaWN0IDogRGljdC5lbXB0eTtcbiAgICB9XG4gICAgY29uc3QgcHJvcGVydGllcyA9IG5ldyBNYXAoKTtcblxuICAgIGZvciAoY29uc3QgZGljdCBvZiBkaWN0QXJyYXkpIHtcbiAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRpY3QuX21hcCkpIHtcbiAgICAgICAgbGV0IHByb3BlcnR5ID0gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9wZXJ0eSA9IFtdO1xuICAgICAgICAgIHByb3BlcnRpZXMuc2V0KGtleSwgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHByb3BlcnR5LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZXNdIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxIHx8ICEodmFsdWVzWzBdIGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgICAgbWVyZ2VkRGljdC5fbWFwW25hbWVdID0gdmFsdWVzWzBdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1YkRpY3QgPSBuZXcgRGljdCh4cmVmKTtcblxuICAgICAgZm9yIChjb25zdCBkaWN0IG9mIHZhbHVlcykge1xuICAgICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkaWN0Ll9tYXApKSB7XG4gICAgICAgICAgaWYgKHN1YkRpY3QuX21hcFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN1YkRpY3QuX21hcFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3ViRGljdC5zaXplID4gMCkge1xuICAgICAgICBtZXJnZWREaWN0Ll9tYXBbbmFtZV0gPSBzdWJEaWN0O1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wZXJ0aWVzLmNsZWFyKCk7XG5cbiAgICByZXR1cm4gbWVyZ2VkRGljdC5zaXplID4gMCA/IG1lcmdlZERpY3QgOiBEaWN0LmVtcHR5O1xuICB9O1xuXG4gIHJldHVybiBEaWN0O1xufSkoKTtcblxudmFyIFJlZiA9IChmdW5jdGlvbiBSZWZDbG9zdXJlKCkge1xuICBsZXQgcmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUmVmKG51bSwgZ2VuKSB7XG4gICAgdGhpcy5udW0gPSBudW07XG4gICAgdGhpcy5nZW4gPSBnZW47XG4gIH1cblxuICBSZWYucHJvdG90eXBlID0ge1xuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiBSZWZfdG9TdHJpbmcoKSB7XG4gICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGhvdCwgc28gd2UgbWFrZSB0aGUgc3RyaW5nIGFzIGNvbXBhY3QgYXMgcG9zc2libGUuXG4gICAgICAvLyB8dGhpcy5nZW58IGlzIGFsbW9zdCBhbHdheXMgemVybywgc28gd2UgdHJlYXQgdGhhdCBjYXNlIHNwZWNpYWxseS5cbiAgICAgIGlmICh0aGlzLmdlbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5udW19UmA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7dGhpcy5udW19UiR7dGhpcy5nZW59YDtcbiAgICB9LFxuICB9O1xuXG4gIFJlZi5nZXQgPSBmdW5jdGlvbiAobnVtLCBnZW4pIHtcbiAgICBjb25zdCBrZXkgPSBnZW4gPT09IDAgPyBgJHtudW19UmAgOiBgJHtudW19UiR7Z2VufWA7XG4gICAgY29uc3QgcmVmVmFsdWUgPSByZWZDYWNoZVtrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgIHJldHVybiByZWZWYWx1ZSA/IHJlZlZhbHVlIDogKHJlZkNhY2hlW2tleV0gPSBuZXcgUmVmKG51bSwgZ2VuKSk7XG4gIH07XG5cbiAgUmVmLl9jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIHJlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfTtcblxuICByZXR1cm4gUmVmO1xufSkoKTtcblxuLy8gVGhlIHJlZmVyZW5jZSBpcyBpZGVudGlmaWVkIGJ5IG51bWJlciBhbmQgZ2VuZXJhdGlvbi5cbi8vIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgcmVmZXJlbmNlLlxuY2xhc3MgUmVmU2V0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2V0ID0gbmV3IFNldCgpO1xuICB9XG5cbiAgaGFzKHJlZikge1xuICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKHJlZi50b1N0cmluZygpKTtcbiAgfVxuXG4gIHB1dChyZWYpIHtcbiAgICB0aGlzLl9zZXQuYWRkKHJlZi50b1N0cmluZygpKTtcbiAgfVxuXG4gIHJlbW92ZShyZWYpIHtcbiAgICB0aGlzLl9zZXQuZGVsZXRlKHJlZi50b1N0cmluZygpKTtcbiAgfVxufVxuXG5jbGFzcyBSZWZTZXRDYWNoZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXAuc2l6ZTtcbiAgfVxuXG4gIGdldChyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwLmdldChyZWYudG9TdHJpbmcoKSk7XG4gIH1cblxuICBoYXMocmVmKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcC5oYXMocmVmLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcHV0KHJlZiwgb2JqKSB7XG4gICAgdGhpcy5fbWFwLnNldChyZWYudG9TdHJpbmcoKSwgb2JqKTtcbiAgfVxuXG4gIHB1dEFsaWFzKHJlZiwgYWxpYXNSZWYpIHtcbiAgICB0aGlzLl9tYXAuc2V0KHJlZi50b1N0cmluZygpLCB0aGlzLmdldChhbGlhc1JlZikpO1xuICB9XG5cbiAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy5fbWFwLnZhbHVlcygpKSB7XG4gICAgICBjYWxsYmFjayh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5fbWFwLmNsZWFyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNFT0Yodikge1xuICByZXR1cm4gdiA9PT0gRU9GO1xufVxuXG5mdW5jdGlvbiBpc05hbWUodiwgbmFtZSkge1xuICByZXR1cm4gdiBpbnN0YW5jZW9mIE5hbWUgJiYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB2Lm5hbWUgPT09IG5hbWUpO1xufVxuXG5mdW5jdGlvbiBpc0NtZCh2LCBjbWQpIHtcbiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBDbWQgJiYgKGNtZCA9PT0gdW5kZWZpbmVkIHx8IHYuY21kID09PSBjbWQpO1xufVxuXG5mdW5jdGlvbiBpc0RpY3QodiwgdHlwZSkge1xuICByZXR1cm4gKFxuICAgIHYgaW5zdGFuY2VvZiBEaWN0ICYmICh0eXBlID09PSB1bmRlZmluZWQgfHwgaXNOYW1lKHYuZ2V0KFwiVHlwZVwiKSwgdHlwZSkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUmVmKHYpIHtcbiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBSZWY7XG59XG5cbmZ1bmN0aW9uIGlzUmVmc0VxdWFsKHYxLCB2Mikge1xuICBpZiAoXG4gICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgdjEgaW5zdGFuY2VvZiBSZWYgJiYgdjIgaW5zdGFuY2VvZiBSZWYsXG4gICAgICBcImlzUmVmc0VxdWFsOiBCb3RoIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGBSZWZgcy5cIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHYxLm51bSA9PT0gdjIubnVtICYmIHYxLmdlbiA9PT0gdjIuZ2VuO1xufVxuXG5mdW5jdGlvbiBpc1N0cmVhbSh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmIHYuZ2V0Qnl0ZXMgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY2xlYXJQcmltaXRpdmVDYWNoZXMoKSB7XG4gIENtZC5fY2xlYXJDYWNoZSgpO1xuICBOYW1lLl9jbGVhckNhY2hlKCk7XG4gIFJlZi5fY2xlYXJDYWNoZSgpO1xufVxuXG5leHBvcnQge1xuICBFT0YsXG4gIGNsZWFyUHJpbWl0aXZlQ2FjaGVzLFxuICBDbWQsXG4gIERpY3QsXG4gIE5hbWUsXG4gIFJlZixcbiAgUmVmU2V0LFxuICBSZWZTZXRDYWNoZSxcbiAgaXNFT0YsXG4gIGlzQ21kLFxuICBpc0RpY3QsXG4gIGlzTmFtZSxcbiAgaXNSZWYsXG4gIGlzUmVmc0VxdWFsLFxuICBpc1N0cmVhbSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCxcbiAgc2hhZG93LFxuICB1bnJlYWNoYWJsZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBDaHVua2VkU3RyZWFtTWFuYWdlciB9IGZyb20gXCIuL2NodW5rZWRfc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IFBERkRvY3VtZW50IH0gZnJvbSBcIi4vZG9jdW1lbnQuanNcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuL3N0cmVhbS5qc1wiO1xuXG5jbGFzcyBCYXNlUGRmTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlUGRmTWFuYWdlcikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlUGRmTWFuYWdlci5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRvY0lkKCkge1xuICAgIHJldHVybiB0aGlzLl9kb2NJZDtcbiAgfVxuXG4gIGdldCBwYXNzd29yZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmQ7XG4gIH1cblxuICBnZXQgZG9jQmFzZVVybCgpIHtcbiAgICBsZXQgZG9jQmFzZVVybCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX2RvY0Jhc2VVcmwpIHtcbiAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh0aGlzLl9kb2NCYXNlVXJsKTtcbiAgICAgIGlmIChhYnNvbHV0ZVVybCkge1xuICAgICAgICBkb2NCYXNlVXJsID0gYWJzb2x1dGVVcmwuaHJlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oYEludmFsaWQgYWJzb2x1dGUgZG9jQmFzZVVybDogXCIke3RoaXMuX2RvY0Jhc2VVcmx9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJkb2NCYXNlVXJsXCIsIGRvY0Jhc2VVcmwpO1xuICB9XG5cbiAgb25Mb2FkZWRTdHJlYW0oKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYG9uTG9hZGVkU3RyZWFtYCBjYWxsZWRcIik7XG4gIH1cblxuICBlbnN1cmVEb2MocHJvcCwgYXJncykge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LCBwcm9wLCBhcmdzKTtcbiAgfVxuXG4gIGVuc3VyZVhSZWYocHJvcCwgYXJncykge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LnhyZWYsIHByb3AsIGFyZ3MpO1xuICB9XG5cbiAgZW5zdXJlQ2F0YWxvZyhwcm9wLCBhcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZywgcHJvcCwgYXJncyk7XG4gIH1cblxuICBnZXRQYWdlKHBhZ2VJbmRleCkge1xuICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZUluZGV4KTtcbiAgfVxuXG4gIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikge1xuICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcik7XG4gIH1cblxuICBjbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKTtcbiAgfVxuXG4gIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWRcIik7XG4gIH1cblxuICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0UmFuZ2VgIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJlcXVlc3RMb2FkZWRTdHJlYW0oKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYHJlcXVlc3RMb2FkZWRTdHJlYW1gIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkXCIpO1xuICB9XG5cbiAgdXBkYXRlUGFzc3dvcmQocGFzc3dvcmQpIHtcbiAgICB0aGlzLl9wYXNzd29yZCA9IHBhc3N3b3JkO1xuICB9XG5cbiAgdGVybWluYXRlKHJlYXNvbikge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGB0ZXJtaW5hdGVgIGNhbGxlZFwiKTtcbiAgfVxufVxuXG5jbGFzcyBMb2NhbFBkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKGRvY0lkLCBkYXRhLCBwYXNzd29yZCwgZXZhbHVhdG9yT3B0aW9ucywgZG9jQmFzZVVybCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9kb2NJZCA9IGRvY0lkO1xuICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgdGhpcy5fZG9jQmFzZVVybCA9IGRvY0Jhc2VVcmw7XG4gICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gZXZhbHVhdG9yT3B0aW9ucztcblxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oZGF0YSk7XG4gICAgdGhpcy5wZGZEb2N1bWVudCA9IG5ldyBQREZEb2N1bWVudCh0aGlzLCBzdHJlYW0pO1xuICAgIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoc3RyZWFtKTtcbiAgfVxuXG4gIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHJlcXVlc3RMb2FkZWRTdHJlYW0oKSB7fVxuXG4gIG9uTG9hZGVkU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1Qcm9taXNlO1xuICB9XG5cbiAgdGVybWluYXRlKHJlYXNvbikge31cbn1cblxuY2xhc3MgTmV0d29ya1BkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKGRvY0lkLCBwZGZOZXR3b3JrU3RyZWFtLCBhcmdzLCBldmFsdWF0b3JPcHRpb25zLCBkb2NCYXNlVXJsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2RvY0lkID0gZG9jSWQ7XG4gICAgdGhpcy5fcGFzc3dvcmQgPSBhcmdzLnBhc3N3b3JkO1xuICAgIHRoaXMuX2RvY0Jhc2VVcmwgPSBkb2NCYXNlVXJsO1xuICAgIHRoaXMubXNnSGFuZGxlciA9IGFyZ3MubXNnSGFuZGxlcjtcbiAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBldmFsdWF0b3JPcHRpb25zO1xuXG4gICAgdGhpcy5zdHJlYW1NYW5hZ2VyID0gbmV3IENodW5rZWRTdHJlYW1NYW5hZ2VyKHBkZk5ldHdvcmtTdHJlYW0sIHtcbiAgICAgIG1zZ0hhbmRsZXI6IGFyZ3MubXNnSGFuZGxlcixcbiAgICAgIGxlbmd0aDogYXJncy5sZW5ndGgsXG4gICAgICBkaXNhYmxlQXV0b0ZldGNoOiBhcmdzLmRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICByYW5nZUNodW5rU2l6ZTogYXJncy5yYW5nZUNodW5rU2l6ZSxcbiAgICB9KTtcbiAgICB0aGlzLnBkZkRvY3VtZW50ID0gbmV3IFBERkRvY3VtZW50KHRoaXMsIHRoaXMuc3RyZWFtTWFuYWdlci5nZXRTdHJlYW0oKSk7XG4gIH1cblxuICBhc3luYyBlbnN1cmUob2JqLCBwcm9wLCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpO1xuICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlKG9iaiwgcHJvcCwgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKTtcbiAgfVxuXG4gIHJlcXVlc3RMb2FkZWRTdHJlYW0oKSB7XG4gICAgdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RBbGxDaHVua3MoKTtcbiAgfVxuXG4gIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHtcbiAgICB0aGlzLnN0cmVhbU1hbmFnZXIub25SZWNlaXZlRGF0YSh7IGNodW5rIH0pO1xuICB9XG5cbiAgb25Mb2FkZWRTdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpO1xuICB9XG5cbiAgdGVybWluYXRlKHJlYXNvbikge1xuICAgIHRoaXMuc3RyZWFtTWFuYWdlci5hYm9ydChyZWFzb24pO1xuICB9XG59XG5cbmV4cG9ydCB7IExvY2FsUGRmTWFuYWdlciwgTmV0d29ya1BkZk1hbmFnZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgYXJyYXlCeXRlTGVuZ3RoLFxuICBhcnJheXNUb0J5dGVzLFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuY2xhc3MgQ2h1bmtlZFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKGxlbmd0aCwgY2h1bmtTaXplLCBtYW5hZ2VyKSB7XG4gICAgdGhpcy5ieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMuZW5kID0gbGVuZ3RoO1xuICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplO1xuICAgIHRoaXMuX2xvYWRlZENodW5rcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLm51bUNodW5rcyA9IE1hdGguY2VpbChsZW5ndGggLyBjaHVua1NpemUpO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSAwO1xuICAgIHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmsgPSAtMTsgLy8gU2luZ2xlLWVudHJ5IGNhY2hlXG4gIH1cblxuICAvLyBJZiBhIHBhcnRpY3VsYXIgc3RyZWFtIGRvZXMgbm90IGltcGxlbWVudCBvbmUgb3IgbW9yZSBvZiB0aGVzZSBtZXRob2RzLFxuICAvLyBhbiBlcnJvciBzaG91bGQgYmUgdGhyb3duLlxuICBnZXRNaXNzaW5nQ2h1bmtzKCkge1xuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGZvciAobGV0IGNodW5rID0gMCwgbiA9IHRoaXMubnVtQ2h1bmtzOyBjaHVuayA8IG47ICsrY2h1bmspIHtcbiAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHtcbiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2h1bmtzO1xuICB9XG5cbiAgZ2V0QmFzZVN0cmVhbXMoKSB7XG4gICAgcmV0dXJuIFt0aGlzXTtcbiAgfVxuXG4gIGdldCBudW1DaHVua3NMb2FkZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5zaXplO1xuICB9XG5cbiAgYWxsQ2h1bmtzTG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3M7XG4gIH1cblxuICBvblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuaykge1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplO1xuICAgIGlmIChiZWdpbiAlIGNodW5rU2l6ZSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWQgYmVnaW4gb2Zmc2V0OiAke2JlZ2lufWApO1xuICAgIH1cblxuICAgIC8vIFVzaW5nIGB0aGlzLmxlbmd0aGAgaXMgaW5hY2N1cmF0ZSBoZXJlIHNpbmNlIGB0aGlzLnN0YXJ0YCBjYW4gYmUgbW92ZWRcbiAgICAvLyAoc2VlIHRoZSBgbW92ZVN0YXJ0YCBtZXRob2QpLlxuICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICBpZiAoZW5kICUgY2h1bmtTaXplICE9PSAwICYmIGVuZCAhPT0gdGhpcy5ieXRlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIGVuZCBvZmZzZXQ6ICR7ZW5kfWApO1xuICAgIH1cblxuICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgYmVnaW4pO1xuICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTtcbiAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gY2h1bmtTaXplKSArIDE7XG5cbiAgICBmb3IgKGxldCBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHtcbiAgICAgIC8vIFNpbmNlIGEgdmFsdWUgY2FuIG9ubHkgb2NjdXIgKm9uY2UqIGluIGEgYFNldGAsIHRoZXJlJ3Mgbm8gbmVlZCB0b1xuICAgICAgLy8gbWFudWFsbHkgY2hlY2sgYFNldC5wcm90b3R5cGUuaGFzKClgIGJlZm9yZSBhZGRpbmcgdGhlIHZhbHVlIGhlcmUuXG4gICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTtcbiAgICB9XG4gIH1cblxuICBvblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEoZGF0YSkge1xuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoO1xuICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKHBvc2l0aW9uIC8gdGhpcy5jaHVua1NpemUpO1xuXG4gICAgdGhpcy5ieXRlcy5zZXQobmV3IFVpbnQ4QXJyYXkoZGF0YSksIHBvc2l0aW9uKTtcbiAgICBwb3NpdGlvbiArPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBwb3NpdGlvbjtcbiAgICBjb25zdCBlbmRDaHVuayA9XG4gICAgICBwb3NpdGlvbiA+PSB0aGlzLmVuZFxuICAgICAgICA/IHRoaXMubnVtQ2h1bmtzXG4gICAgICAgIDogTWF0aC5mbG9vcihwb3NpdGlvbiAvIHRoaXMuY2h1bmtTaXplKTtcblxuICAgIGZvciAobGV0IGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPCBlbmRDaHVuazsgKytjdXJDaHVuaykge1xuICAgICAgLy8gU2luY2UgYSB2YWx1ZSBjYW4gb25seSBvY2N1ciAqb25jZSogaW4gYSBgU2V0YCwgdGhlcmUncyBubyBuZWVkIHRvXG4gICAgICAvLyBtYW51YWxseSBjaGVjayBgU2V0LnByb3RvdHlwZS5oYXMoKWAgYmVmb3JlIGFkZGluZyB0aGUgdmFsdWUgaGVyZS5cbiAgICAgIHRoaXMuX2xvYWRlZENodW5rcy5hZGQoY3VyQ2h1bmspO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZUJ5dGUocG9zKSB7XG4gICAgaWYgKHBvcyA8IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2h1bmsgPSBNYXRoLmZsb29yKHBvcyAvIHRoaXMuY2h1bmtTaXplKTtcbiAgICBpZiAoY2h1bmsgPT09IHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7XG4gICAgICB0aHJvdyBuZXcgTWlzc2luZ0RhdGFFeGNlcHRpb24ocG9zLCBwb3MgKyAxKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayA9IGNodW5rO1xuICB9XG5cbiAgZW5zdXJlUmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgIGlmIChiZWdpbiA+PSBlbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVuZCA8PSB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplO1xuICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTtcbiAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gY2h1bmtTaXplKSArIDE7XG4gICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7XG4gICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7XG4gICAgICAgIHRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihiZWdpbiwgZW5kKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZXh0RW1wdHlDaHVuayhiZWdpbkNodW5rKSB7XG4gICAgY29uc3QgbnVtQ2h1bmtzID0gdGhpcy5udW1DaHVua3M7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1DaHVua3M7ICsraSkge1xuICAgICAgY29uc3QgY2h1bmsgPSAoYmVnaW5DaHVuayArIGkpICUgbnVtQ2h1bmtzOyAvLyBXcmFwIGFyb3VuZCB0byBiZWdpbm5pbmcuXG4gICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7XG4gICAgICAgIHJldHVybiBjaHVuaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBoYXNDaHVuayhjaHVuaykge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5kIC0gdGhpcy5zdGFydDtcbiAgfVxuXG4gIGdldCBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldEJ5dGUoKSB7XG4gICAgY29uc3QgcG9zID0gdGhpcy5wb3M7XG4gICAgaWYgKHBvcyA+PSB0aGlzLmVuZCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAocG9zID49IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICB0aGlzLmVuc3VyZUJ5dGUocG9zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107XG4gIH1cblxuICBnZXRVaW50MTYoKSB7XG4gICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICBjb25zdCBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTtcbiAgfVxuXG4gIGdldEludDMyKCkge1xuICAgIGNvbnN0IGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgY29uc3QgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICBjb25zdCBiMiA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgIGNvbnN0IGIzID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7XG4gIH1cblxuICAvLyBSZXR1cm5zIHN1YmFycmF5IG9mIG9yaWdpbmFsIGJ1ZmZlciwgc2hvdWxkIG9ubHkgYmUgcmVhZC5cbiAgZ2V0Qnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICBjb25zdCBwb3MgPSB0aGlzLnBvcztcbiAgICBjb25zdCBzdHJFbmQgPSB0aGlzLmVuZDtcblxuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICBpZiAoc3RyRW5kID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIHN0ckVuZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdWJhcnJheSA9IGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTtcbiAgICAgIC8vIGB0aGlzLmJ5dGVzYCBpcyBhbHdheXMgYSBgVWludDhBcnJheWAgaGVyZS5cbiAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gICAgfVxuXG4gICAgbGV0IGVuZCA9IHBvcyArIGxlbmd0aDtcbiAgICBpZiAoZW5kID4gc3RyRW5kKSB7XG4gICAgICBlbmQgPSBzdHJFbmQ7XG4gICAgfVxuICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIGVuZCk7XG4gICAgfVxuXG4gICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgY29uc3Qgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7XG4gICAgLy8gYHRoaXMuYnl0ZXNgIGlzIGFsd2F5cyBhIGBVaW50OEFycmF5YCBoZXJlLlxuICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gIH1cblxuICBwZWVrQnl0ZSgpIHtcbiAgICBjb25zdCBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgaWYgKHBlZWtlZEJ5dGUgIT09IC0xKSB7XG4gICAgICB0aGlzLnBvcy0tO1xuICAgIH1cbiAgICByZXR1cm4gcGVla2VkQnl0ZTtcbiAgfVxuXG4gIHBlZWtCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTtcbiAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGJ5dGVzO1xuICB9XG5cbiAgZ2V0Qnl0ZVJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICBpZiAoYmVnaW4gPCAwKSB7XG4gICAgICBiZWdpbiA9IDA7XG4gICAgfVxuICAgIGlmIChlbmQgPiB0aGlzLmVuZCkge1xuICAgICAgZW5kID0gdGhpcy5lbmQ7XG4gICAgfVxuICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgdGhpcy5lbnN1cmVSYW5nZShiZWdpbiwgZW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gIH1cblxuICBza2lwKG4pIHtcbiAgICBpZiAoIW4pIHtcbiAgICAgIG4gPSAxO1xuICAgIH1cbiAgICB0aGlzLnBvcyArPSBuO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICB9XG5cbiAgbW92ZVN0YXJ0KCkge1xuICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvcztcbiAgfVxuXG4gIG1ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCkge1xuICAgIGlmIChsZW5ndGgpIHtcbiAgICAgIGlmIChzdGFydCArIGxlbmd0aCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2hlbiB0aGUgYGxlbmd0aGAgaXMgdW5kZWZpbmVkIHlvdSBkbyAqbm90KiwgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsXG4gICAgICAvLyB3YW50IHRvIGZhbGxiYWNrIG9uIGNhbGxpbmcgYHRoaXMuZW5zdXJlUmFuZ2Uoc3RhcnQsIHRoaXMuZW5kKWAgc2luY2VcbiAgICAgIC8vIHRoYXQgd291bGQgZm9yY2UgdGhlICplbnRpcmUqIFBERiBmaWxlIHRvIGJlIGxvYWRlZCwgdGh1cyBjb21wbGV0ZWx5XG4gICAgICAvLyBicmVha2luZyB0aGUgd2hvbGUgcHVycG9zZSBvZiB1c2luZyBzdHJlYW1pbmcgYW5kL29yIHJhbmdlIHJlcXVlc3RzLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIG5vdCBkb2luZyBhbnkgY2hlY2tpbmcgaGVyZSBjb3VsZCB2ZXJ5IGVhc2lseSBsZWFkIHRvIHdhc3RlZFxuICAgICAgLy8gdGltZS9yZXNvdXJjZXMgZHVyaW5nIGUuZy4gcGFyc2luZywgc2luY2UgYE1pc3NpbmdEYXRhRXhjZXB0aW9uYHMgd2lsbFxuICAgICAgLy8gcmVxdWlyZSBkYXRhIHRvIGJlIHJlLXBhcnNlZCwgd2hpY2ggd2UgYXR0ZW1wdCB0byBtaW5pbWl6ZSBieSBhdCBsZWFzdFxuICAgICAgLy8gY2hlY2tpbmcgdGhhdCB0aGUgKmJlZ2lubmluZyogb2YgdGhlIGRhdGEgaXMgYXZhaWxhYmxlIGhlcmUuXG4gICAgICBpZiAoc3RhcnQgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVCeXRlKHN0YXJ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDaHVua2VkU3RyZWFtU3Vic3RyZWFtKCkge31cbiAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUuZ2V0TWlzc2luZ0NodW5rcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplO1xuICAgICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IodGhpcy5zdGFydCAvIGNodW5rU2l6ZSk7XG4gICAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKHRoaXMuZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTtcbiAgICAgIGNvbnN0IG1pc3NpbmdDaHVua3MgPSBbXTtcbiAgICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7XG4gICAgICAgICAgbWlzc2luZ0NodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1pc3NpbmdDaHVua3M7XG4gICAgfTtcbiAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5hbGxDaHVua3NMb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5udW1DaHVua3NMb2FkZWQgPT09IHRoaXMubnVtQ2h1bmtzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWlzc2luZ0NodW5rcygpLmxlbmd0aCA9PT0gMDtcbiAgICB9O1xuXG4gICAgY29uc3Qgc3ViU3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKTtcbiAgICBzdWJTdHJlYW0ucG9zID0gc3ViU3RyZWFtLnN0YXJ0ID0gc3RhcnQ7XG4gICAgc3ViU3RyZWFtLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIHx8IHRoaXMuZW5kO1xuICAgIHN1YlN0cmVhbS5kaWN0ID0gZGljdDtcbiAgICByZXR1cm4gc3ViU3RyZWFtO1xuICB9XG59XG5cbmNsYXNzIENodW5rZWRTdHJlYW1NYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IocGRmTmV0d29ya1N0cmVhbSwgYXJncykge1xuICAgIHRoaXMubGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gICAgdGhpcy5jaHVua1NpemUgPSBhcmdzLnJhbmdlQ2h1bmtTaXplO1xuICAgIHRoaXMuc3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW0odGhpcy5sZW5ndGgsIHRoaXMuY2h1bmtTaXplLCB0aGlzKTtcbiAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0gPSBwZGZOZXR3b3JrU3RyZWFtO1xuICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaCA9IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaDtcbiAgICB0aGlzLm1zZ0hhbmRsZXIgPSBhcmdzLm1zZ0hhbmRsZXI7XG5cbiAgICB0aGlzLmN1cnJSZXF1ZXN0SWQgPSAwO1xuXG4gICAgdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuayA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IDA7XG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgfVxuXG4gIG9uTG9hZGVkU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBzZW5kUmVxdWVzdChiZWdpbiwgZW5kKSB7XG4gICAgY29uc3QgcmFuZ2VSZWFkZXIgPSB0aGlzLnBkZk5ldHdvcmtTdHJlYW0uZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCk7XG4gICAgaWYgKCFyYW5nZVJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCkge1xuICAgICAgcmFuZ2VSZWFkZXIub25Qcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGxldCBjaHVua3MgPSBbXSxcbiAgICAgIGxvYWRlZCA9IDA7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlYWRDaHVuayA9IGNodW5rID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIWNodW5rLmRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjaHVuay52YWx1ZTtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgbG9hZGVkICs9IGFycmF5Qnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgICAgICAgIGlmIChyYW5nZVJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCkge1xuICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeyBsb2FkZWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYW5nZVJlYWRlci5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNodW5rRGF0YSA9IGFycmF5c1RvQnl0ZXMoY2h1bmtzKTtcbiAgICAgICAgICBjaHVua3MgPSBudWxsO1xuICAgICAgICAgIHJlc29sdmUoY2h1bmtEYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTtcbiAgICB9KTtcbiAgICBwcm9taXNlLnRoZW4oZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjsgLy8gSWdub3JpbmcgYW55IGRhdGEgYWZ0ZXIgYWJvcnQuXG4gICAgICB9XG4gICAgICB0aGlzLm9uUmVjZWl2ZURhdGEoeyBjaHVuazogZGF0YSwgYmVnaW4gfSk7XG4gICAgfSk7XG4gICAgLy8gVE9ETyBjaGVjayBlcnJvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBjaHVua3MgdGhhdCBhcmUgbm90IHlldCBsb2FkZWQgYW5kIGdyb3VwIHRoZW0gaW50b1xuICAgKiBjb250aWd1b3VzIHJhbmdlcyB0byBsb2FkIGluIGFzIGZldyByZXF1ZXN0cyBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHJlcXVlc3RBbGxDaHVua3MoKSB7XG4gICAgY29uc3QgbWlzc2luZ0NodW5rcyA9IHRoaXMuc3RyZWFtLmdldE1pc3NpbmdDaHVua3MoKTtcbiAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKG1pc3NpbmdDaHVua3MpO1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICBfcmVxdWVzdENodW5rcyhjaHVua3MpIHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmN1cnJSZXF1ZXN0SWQrKztcblxuICAgIGNvbnN0IGNodW5rc05lZWRlZCA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2h1bmtzTmVlZGVkKTtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgaWYgKCF0aGlzLnN0cmVhbS5oYXNDaHVuayhjaHVuaykpIHtcbiAgICAgICAgY2h1bmtzTmVlZGVkLmFkZChjaHVuayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNodW5rc05lZWRlZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2FwYWJpbGl0eSk7XG5cbiAgICBjb25zdCBjaHVua3NUb1JlcXVlc3QgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rc05lZWRlZCkge1xuICAgICAgbGV0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGNodW5rKTtcbiAgICAgIGlmICghcmVxdWVzdElkcykge1xuICAgICAgICByZXF1ZXN0SWRzID0gW107XG4gICAgICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zZXQoY2h1bmssIHJlcXVlc3RJZHMpO1xuXG4gICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RJZHMucHVzaChyZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIGlmIChjaHVua3NUb1JlcXVlc3QubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCA9IHRoaXMuZ3JvdXBDaHVua3MoY2h1bmtzVG9SZXF1ZXN0KTtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXBlZENodW5rIG9mIGdyb3VwZWRDaHVua3NUb1JlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYmVnaW4gPSBncm91cGVkQ2h1bmsuYmVnaW5DaHVuayAqIHRoaXMuY2h1bmtTaXplO1xuICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICBncm91cGVkQ2h1bmsuZW5kQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZSxcbiAgICAgICAgICB0aGlzLmxlbmd0aFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlbmRSZXF1ZXN0KGJlZ2luLCBlbmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2UuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmluZyBhbnkgcGVuZGluZyByZXF1ZXN0cyBhZnRlciBhYm9ydC5cbiAgICAgIH1cbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW07XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW55IGNodW5rcyBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlIHRoYXQgYXJlIG5vdCB5ZXQgbG9hZGVkLlxuICAgKi9cbiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICBlbmQgPSBNYXRoLm1pbihlbmQsIHRoaXMubGVuZ3RoKTtcblxuICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsoYmVnaW4pO1xuICAgIGNvbnN0IGVuZENodW5rID0gdGhpcy5nZXRFbmRDaHVuayhlbmQpO1xuXG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rcyk7XG4gIH1cblxuICByZXF1ZXN0UmFuZ2VzKHJhbmdlcyA9IFtdKSB7XG4gICAgY29uc3QgY2h1bmtzVG9SZXF1ZXN0ID0gW107XG4gICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcbiAgICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsocmFuZ2UuYmVnaW4pO1xuICAgICAgY29uc3QgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKHJhbmdlLmVuZCk7XG4gICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHtcbiAgICAgICAgaWYgKCFjaHVua3NUb1JlcXVlc3QuaW5jbHVkZXMoY2h1bmspKSB7XG4gICAgICAgICAgY2h1bmtzVG9SZXF1ZXN0LnB1c2goY2h1bmspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2h1bmtzVG9SZXF1ZXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3NUb1JlcXVlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwcyBhIHNvcnRlZCBhcnJheSBvZiBjaHVua3MgaW50byBhcyBmZXcgY29udGlndW91cyBsYXJnZXJcbiAgICogY2h1bmtzIGFzIHBvc3NpYmxlLlxuICAgKi9cbiAgZ3JvdXBDaHVua3MoY2h1bmtzKSB7XG4gICAgY29uc3QgZ3JvdXBlZENodW5rcyA9IFtdO1xuICAgIGxldCBiZWdpbkNodW5rID0gLTE7XG4gICAgbGV0IHByZXZDaHVuayA9IC0xO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgaWYgKGJlZ2luQ2h1bmsgPCAwKSB7XG4gICAgICAgIGJlZ2luQ2h1bmsgPSBjaHVuaztcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXZDaHVuayA+PSAwICYmIHByZXZDaHVuayArIDEgIT09IGNodW5rKSB7XG4gICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7IGJlZ2luQ2h1bmssIGVuZENodW5rOiBwcmV2Q2h1bmsgKyAxIH0pO1xuICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7XG4gICAgICB9XG4gICAgICBpZiAoaSArIDEgPT09IGNodW5rcy5sZW5ndGgpIHtcbiAgICAgICAgZ3JvdXBlZENodW5rcy5wdXNoKHsgYmVnaW5DaHVuaywgZW5kQ2h1bms6IGNodW5rICsgMSB9KTtcbiAgICAgIH1cblxuICAgICAgcHJldkNodW5rID0gY2h1bms7XG4gICAgfVxuICAgIHJldHVybiBncm91cGVkQ2h1bmtzO1xuICB9XG5cbiAgb25Qcm9ncmVzcyhhcmdzKSB7XG4gICAgdGhpcy5tc2dIYW5kbGVyLnNlbmQoXCJEb2NQcm9ncmVzc1wiLCB7XG4gICAgICBsb2FkZWQ6IHRoaXMuc3RyZWFtLm51bUNodW5rc0xvYWRlZCAqIHRoaXMuY2h1bmtTaXplICsgYXJncy5sb2FkZWQsXG4gICAgICB0b3RhbDogdGhpcy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICBvblJlY2VpdmVEYXRhKGFyZ3MpIHtcbiAgICBjb25zdCBjaHVuayA9IGFyZ3MuY2h1bms7XG4gICAgY29uc3QgaXNQcm9ncmVzc2l2ZSA9IGFyZ3MuYmVnaW4gPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiZWdpbiA9IGlzUHJvZ3Jlc3NpdmUgPyB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA6IGFyZ3MuYmVnaW47XG4gICAgY29uc3QgZW5kID0gYmVnaW4gKyBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7XG4gICAgY29uc3QgZW5kQ2h1bmsgPVxuICAgICAgZW5kIDwgdGhpcy5sZW5ndGhcbiAgICAgICAgPyBNYXRoLmZsb29yKGVuZCAvIHRoaXMuY2h1bmtTaXplKVxuICAgICAgICA6IE1hdGguY2VpbChlbmQgLyB0aGlzLmNodW5rU2l6ZSk7XG5cbiAgICBpZiAoaXNQcm9ncmVzc2l2ZSkge1xuICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuayk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RyZWFtLmFsbENodW5rc0xvYWRlZCgpKSB7XG4gICAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlc29sdmUodGhpcy5zdHJlYW0pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZFJlcXVlc3RzID0gW107XG4gICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7XG4gICAgICAvLyBUaGUgc2VydmVyIG1pZ2h0IHJldHVybiBtb3JlIGNodW5rcyB0aGFuIHJlcXVlc3RlZC5cbiAgICAgIGNvbnN0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGN1ckNodW5rKTtcbiAgICAgIGlmICghcmVxdWVzdElkcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5kZWxldGUoY3VyQ2h1bmspO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiByZXF1ZXN0SWRzKSB7XG4gICAgICAgIGNvbnN0IGNodW5rc05lZWRlZCA9IHRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdC5nZXQocmVxdWVzdElkKTtcbiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5oYXMoY3VyQ2h1bmspKSB7XG4gICAgICAgICAgY2h1bmtzTmVlZGVkLmRlbGV0ZShjdXJDaHVuayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2h1bmtzTmVlZGVkLnNpemUgPiAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbG9hZGVkUmVxdWVzdHMucHVzaChyZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBwZW5kaW5nIHJlcXVlc3RzLCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSBuZXh0XG4gICAgLy8gdW5mZXRjaGVkIGNodW5rIG9mIHRoZSBQREYgZmlsZS5cbiAgICBpZiAoIXRoaXMuZGlzYWJsZUF1dG9GZXRjaCAmJiB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuc2l6ZSA9PT0gMCkge1xuICAgICAgbGV0IG5leHRFbXB0eUNodW5rO1xuICAgICAgaWYgKHRoaXMuc3RyZWFtLm51bUNodW5rc0xvYWRlZCA9PT0gMSkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBvcHRpbWl6YXRpb24gc28gdGhhdCBhZnRlciBmZXRjaGluZyB0aGUgZmlyc3RcbiAgICAgICAgLy8gY2h1bmssIHJhdGhlciB0aGFuIGZldGNoaW5nIHRoZSBzZWNvbmQgY2h1bmssIHdlIGZldGNoIHRoZSBsYXN0XG4gICAgICAgIC8vIGNodW5rLlxuICAgICAgICBjb25zdCBsYXN0Q2h1bmsgPSB0aGlzLnN0cmVhbS5udW1DaHVua3MgLSAxO1xuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHtcbiAgICAgICAgICBuZXh0RW1wdHlDaHVuayA9IGxhc3RDaHVuaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEVtcHR5Q2h1bmsgPSB0aGlzLnN0cmVhbS5uZXh0RW1wdHlDaHVuayhlbmRDaHVuayk7XG4gICAgICB9XG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuZXh0RW1wdHlDaHVuaykpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdENodW5rcyhbbmV4dEVtcHR5Q2h1bmtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiBsb2FkZWRSZXF1ZXN0cykge1xuICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmdldChyZXF1ZXN0SWQpO1xuICAgICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLm1zZ0hhbmRsZXIuc2VuZChcIkRvY1Byb2dyZXNzXCIsIHtcbiAgICAgIGxvYWRlZDogdGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkICogdGhpcy5jaHVua1NpemUsXG4gICAgICB0b3RhbDogdGhpcy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICBvbkVycm9yKGVycikge1xuICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7XG4gIH1cblxuICBnZXRCZWdpbkNodW5rKGJlZ2luKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7XG4gIH1cblxuICBnZXRFbmRDaHVuayhlbmQpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyB0aGlzLmNodW5rU2l6ZSkgKyAxO1xuICB9XG5cbiAgYWJvcnQocmVhc29uKSB7XG4gICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wZGZOZXR3b3JrU3RyZWFtKSB7XG4gICAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0uY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LnZhbHVlcygpKSB7XG4gICAgICBjYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBDaHVua2VkU3RyZWFtLCBDaHVua2VkU3RyZWFtTWFuYWdlciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTkgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIEJhc2VFeGNlcHRpb24sIHdhcm4gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGluaXRpYWxpemVyKSB7XG4gIGxldCBsb29rdXA7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICBsb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgaW5pdGlhbGl6ZXIobG9va3VwKTtcbiAgICAgIGluaXRpYWxpemVyID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGxvb2t1cDtcbiAgfTtcbn1cblxuY2xhc3MgTWlzc2luZ0RhdGFFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCkge1xuICAgIHN1cGVyKGBNaXNzaW5nIGRhdGEgWyR7YmVnaW59LCAke2VuZH0pYCk7XG4gICAgdGhpcy5iZWdpbiA9IGJlZ2luO1xuICAgIHRoaXMuZW5kID0gZW5kO1xuICB9XG59XG5cbmNsYXNzIFhSZWZFbnRyeUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuY2xhc3MgWFJlZlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYW4gaW5oZXJpdGFibGUgcHJvcGVydHkuXG4gKlxuICogSWYgdGhlIFBERiBzcGVjaWZpY2F0aW9uIGV4cGxpY2l0bHkgbGlzdHMgYSBwcm9wZXJ0eSBpbiBhIGRpY3Rpb25hcnkgYXNcbiAqIGluaGVyaXRhYmxlLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRpY3Rpb25hcnlcbiAqIGl0c2VsZiBvciBpbiBvbmUgb3IgbW9yZSBwYXJlbnRzIG9mIHRoZSBkaWN0aW9uYXJ5LlxuICpcbiAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSB0cmVlLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLFxuICogdGhlIHZhbHVlIGZvciB0aGUga2V5IGlzIHJldHVybmVkIG9yLCBpZiBgc3RvcFdoZW5Gb3VuZGAgaXMgYGZhbHNlYCwgYSBsaXN0XG4gKiBvZiB2YWx1ZXMgaXMgcmV0dXJuZWQuIFRvIGF2b2lkIGluZmluaXRlIGxvb3BzLCB0aGUgdHJhdmVyc2FsIGlzIHN0b3BwZWQgd2hlblxuICogdGhlIGxvb3AgbGltaXQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAcGFyYW0ge0RpY3R9IGRpY3QgLSBEaWN0aW9uYXJ5IGZyb20gd2hlcmUgdG8gc3RhcnQgdGhlIHRyYXZlcnNhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBmaW5kIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGdldEFycmF5IC0gV2hldGhlciBvciBub3QgdGhlIHZhbHVlIHNob3VsZCBiZSBmZXRjaGVkIGFzIGFuXG4gKiAgIGFycmF5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHBhcmFtIHtib29sZWFufSBzdG9wV2hlbkZvdW5kIC0gV2hldGhlciBvciBub3QgdG8gc3RvcCB0aGUgdHJhdmVyc2FsIHdoZW5cbiAqICAgdGhlIGtleSBpcyBmb3VuZC4gSWYgc2V0IHRvIGBmYWxzZWAsIHdlIGFsd2F5cyB3YWxrIHVwIHRoZSBlbnRpcmUgcGFyZW50XG4gKiAgIGNoYWluLCBmb3IgZXhhbXBsZSB0byBiZSBhYmxlIHRvIGZpbmQgYFxcUmVzb3VyY2VzYCBwbGFjZWQgb24gbXVsdGlwbGVcbiAqICAgbGV2ZWxzIG9mIHRoZSB0cmVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gKi9cbmZ1bmN0aW9uIGdldEluaGVyaXRhYmxlUHJvcGVydHkoe1xuICBkaWN0LFxuICBrZXksXG4gIGdldEFycmF5ID0gZmFsc2UsXG4gIHN0b3BXaGVuRm91bmQgPSB0cnVlLFxufSkge1xuICBjb25zdCBMT09QX0xJTUlUID0gMTAwO1xuICBsZXQgbG9vcENvdW50ID0gMDtcbiAgbGV0IHZhbHVlcztcblxuICB3aGlsZSAoZGljdCkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoc3RvcFdoZW5Gb3VuZCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKCsrbG9vcENvdW50ID4gTE9PUF9MSU1JVCkge1xuICAgICAgd2FybihgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTogbWF4aW11bSBsb29wIGNvdW50IGV4Y2VlZGVkIGZvciBcIiR7a2V5fVwiYCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGljdCA9IGRpY3QuZ2V0KFwiUGFyZW50XCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgUk9NQU5fTlVNQkVSX01BUCA9IFtcbiAgXCJcIiwgXCJDXCIsIFwiQ0NcIiwgXCJDQ0NcIiwgXCJDRFwiLCBcIkRcIiwgXCJEQ1wiLCBcIkRDQ1wiLCBcIkRDQ0NcIiwgXCJDTVwiLFxuICBcIlwiLCBcIlhcIiwgXCJYWFwiLCBcIlhYWFwiLCBcIlhMXCIsIFwiTFwiLCBcIkxYXCIsIFwiTFhYXCIsIFwiTFhYWFwiLCBcIlhDXCIsXG4gIFwiXCIsIFwiSVwiLCBcIklJXCIsIFwiSUlJXCIsIFwiSVZcIiwgXCJWXCIsIFwiVklcIiwgXCJWSUlcIiwgXCJWSUlJXCIsIFwiSVhcIlxuXTtcblxuLyoqXG4gKiBDb252ZXJ0cyBwb3NpdGl2ZSBpbnRlZ2VycyB0byAodXBwZXIgY2FzZSkgUm9tYW4gbnVtZXJhbHMuXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIC0gVGhlIG51bWJlciB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxvd2VyQ2FzZSAtIEluZGljYXRlcyBpZiB0aGUgcmVzdWx0IHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAqICAgdG8gbG93ZXIgY2FzZSBsZXR0ZXJzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHJlc3VsdGluZyBSb21hbiBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhudW1iZXIsIGxvd2VyQ2FzZSA9IGZhbHNlKSB7XG4gIGFzc2VydChcbiAgICBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcikgJiYgbnVtYmVyID4gMCxcbiAgICBcIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cIlxuICApO1xuICBjb25zdCByb21hbkJ1ZiA9IFtdO1xuICBsZXQgcG9zO1xuICAvLyBUaG91c2FuZHNcbiAgd2hpbGUgKG51bWJlciA+PSAxMDAwKSB7XG4gICAgbnVtYmVyIC09IDEwMDA7XG4gICAgcm9tYW5CdWYucHVzaChcIk1cIik7XG4gIH1cbiAgLy8gSHVuZHJlZHNcbiAgcG9zID0gKG51bWJlciAvIDEwMCkgfCAwO1xuICBudW1iZXIgJT0gMTAwO1xuICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbcG9zXSk7XG4gIC8vIFRlbnNcbiAgcG9zID0gKG51bWJlciAvIDEwKSB8IDA7XG4gIG51bWJlciAlPSAxMDtcbiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzEwICsgcG9zXSk7XG4gIC8vIE9uZXNcbiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyXSk7XG5cbiAgY29uc3Qgcm9tYW5TdHIgPSByb21hbkJ1Zi5qb2luKFwiXCIpO1xuICByZXR1cm4gbG93ZXJDYXNlID8gcm9tYW5TdHIudG9Mb3dlckNhc2UoKSA6IHJvbWFuU3RyO1xufVxuXG4vLyBDYWxjdWxhdGUgdGhlIGJhc2UgMiBsb2dhcml0aG0gb2YgdGhlIG51bWJlciBgeGAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZVxuLy8gbmF0aXZlIGZ1bmN0aW9uIGluIHRoZSBzZW5zZSB0aGF0IGl0IHJldHVybnMgdGhlIGNlaWxpbmcgdmFsdWUgYW5kIHRoYXQgaXRcbi8vIHJldHVybnMgMCBpbnN0ZWFkIG9mIGBJbmZpbml0eWAvYE5hTmAgZm9yIGB4YCB2YWx1ZXMgc21hbGxlciB0aGFuL2VxdWFsIHRvIDAuXG5mdW5jdGlvbiBsb2cyKHgpIHtcbiAgaWYgKHggPD0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwoTWF0aC5sb2cyKHgpKTtcbn1cblxuZnVuY3Rpb24gcmVhZEludDgoZGF0YSwgb2Zmc2V0KSB7XG4gIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDI0KSA+PiAyNDtcbn1cblxuZnVuY3Rpb24gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpIHtcbiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgOCkgfCBkYXRhW29mZnNldCArIDFdO1xufVxuXG5mdW5jdGlvbiByZWFkVWludDMyKGRhdGEsIG9mZnNldCkge1xuICByZXR1cm4gKFxuICAgICgoZGF0YVtvZmZzZXRdIDw8IDI0KSB8XG4gICAgICAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICAgKGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICAgZGF0YVtvZmZzZXQgKyAzXSkgPj4+XG4gICAgMFxuICApO1xufVxuXG4vLyBDaGVja3MgaWYgY2ggaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogU1BBQ0UsIFRBQiwgQ1Igb3IgTEYuXG5mdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHtcbiAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhO1xufVxuXG5leHBvcnQge1xuICBnZXRMb29rdXBUYWJsZUZhY3RvcnksXG4gIE1pc3NpbmdEYXRhRXhjZXB0aW9uLFxuICBYUmVmRW50cnlFeGNlcHRpb24sXG4gIFhSZWZQYXJzZUV4Y2VwdGlvbixcbiAgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSxcbiAgdG9Sb21hbk51bWVyYWxzLFxuICBsb2cyLFxuICByZWFkSW50OCxcbiAgcmVhZFVpbnQxNixcbiAgcmVhZFVpbnQzMixcbiAgaXNXaGl0ZVNwYWNlLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBGb3JtYXRFcnJvcixcbiAgaW5mbyxcbiAgSW52YWxpZFBERkV4Y2VwdGlvbixcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNBcnJheUVxdWFsLFxuICBpc0Jvb2wsXG4gIGlzTnVtLFxuICBpc1N0cmluZyxcbiAgT1BTLFxuICBzaGFkb3csXG4gIHN0cmluZ1RvQnl0ZXMsXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICB1bnJlYWNoYWJsZSxcbiAgVXRpbCxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBDYXRhbG9nLCBPYmplY3RMb2FkZXIsIFhSZWYgfSBmcm9tIFwiLi9vYmouanNcIjtcbmltcG9ydCB7XG4gIGNsZWFyUHJpbWl0aXZlQ2FjaGVzLFxuICBEaWN0LFxuICBpc0RpY3QsXG4gIGlzTmFtZSxcbiAgaXNTdHJlYW0sXG4gIFJlZixcbn0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSxcbiAgaXNXaGl0ZVNwYWNlLFxuICBNaXNzaW5nRGF0YUV4Y2VwdGlvbixcbiAgWFJlZkVudHJ5RXhjZXB0aW9uLFxuICBYUmVmUGFyc2VFeGNlcHRpb24sXG59IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IE51bGxTdHJlYW0sIFN0cmVhbSwgU3RyZWFtc1NlcXVlbmNlU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uRmFjdG9yeSB9IGZyb20gXCIuL2Fubm90YXRpb24uanNcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZU1ENSB9IGZyb20gXCIuL2NyeXB0by5qc1wiO1xuaW1wb3J0IHsgTGluZWFyaXphdGlvbiB9IGZyb20gXCIuL3BhcnNlci5qc1wiO1xuaW1wb3J0IHsgT3BlcmF0b3JMaXN0IH0gZnJvbSBcIi4vb3BlcmF0b3JfbGlzdC5qc1wiO1xuaW1wb3J0IHsgUGFydGlhbEV2YWx1YXRvciB9IGZyb20gXCIuL2V2YWx1YXRvci5qc1wiO1xuXG5jb25zdCBERUZBVUxUX1VTRVJfVU5JVCA9IDEuMDtcbmNvbnN0IExFVFRFUl9TSVpFX01FRElBQk9YID0gWzAsIDAsIDYxMiwgNzkyXTtcblxuZnVuY3Rpb24gaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uLCBpbnRlbnQpIHtcbiAgcmV0dXJuIChcbiAgICAoaW50ZW50ID09PSBcImRpc3BsYXlcIiAmJiBhbm5vdGF0aW9uLnZpZXdhYmxlKSB8fFxuICAgIChpbnRlbnQgPT09IFwicHJpbnRcIiAmJiBhbm5vdGF0aW9uLnByaW50YWJsZSlcbiAgKTtcbn1cblxuY2xhc3MgUGFnZSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwZGZNYW5hZ2VyLFxuICAgIHhyZWYsXG4gICAgcGFnZUluZGV4LFxuICAgIHBhZ2VEaWN0LFxuICAgIHJlZixcbiAgICBnbG9iYWxJZEZhY3RvcnksXG4gICAgZm9udENhY2hlLFxuICAgIGJ1aWx0SW5DTWFwQ2FjaGUsXG4gICAgZ2xvYmFsSW1hZ2VDYWNoZSxcbiAgfSkge1xuICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5wYWdlRGljdCA9IHBhZ2VEaWN0O1xuICAgIHRoaXMueHJlZiA9IHhyZWY7XG4gICAgdGhpcy5yZWYgPSByZWY7XG4gICAgdGhpcy5mb250Q2FjaGUgPSBmb250Q2FjaGU7XG4gICAgdGhpcy5idWlsdEluQ01hcENhY2hlID0gYnVpbHRJbkNNYXBDYWNoZTtcbiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBnbG9iYWxJbWFnZUNhY2hlO1xuICAgIHRoaXMuZXZhbHVhdG9yT3B0aW9ucyA9IHBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9ucztcbiAgICB0aGlzLnJlc291cmNlc1Byb21pc2UgPSBudWxsO1xuXG4gICAgY29uc3QgaWRDb3VudGVycyA9IHtcbiAgICAgIG9iajogMCxcbiAgICB9O1xuICAgIHRoaXMuX2xvY2FsSWRGYWN0b3J5ID0gY2xhc3MgZXh0ZW5kcyBnbG9iYWxJZEZhY3Rvcnkge1xuICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkge1xuICAgICAgICByZXR1cm4gYHAke3BhZ2VJbmRleH1fJHsrK2lkQ291bnRlcnMub2JqfWA7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dldEluaGVyaXRhYmxlUHJvcGVydHkoa2V5LCBnZXRBcnJheSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHtcbiAgICAgIGRpY3Q6IHRoaXMucGFnZURpY3QsXG4gICAgICBrZXksXG4gICAgICBnZXRBcnJheSxcbiAgICAgIHN0b3BXaGVuRm91bmQ6IGZhbHNlLFxuICAgIH0pO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSB8fCAhaXNEaWN0KHZhbHVlWzBdKSkge1xuICAgICAgcmV0dXJuIHZhbHVlWzBdO1xuICAgIH1cbiAgICByZXR1cm4gRGljdC5tZXJnZSh7IHhyZWY6IHRoaXMueHJlZiwgZGljdEFycmF5OiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGdldCBjb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2VEaWN0LmdldChcIkNvbnRlbnRzXCIpO1xuICB9XG5cbiAgZ2V0IHJlc291cmNlcygpIHtcbiAgICAvLyBGb3Igcm9idXN0bmVzczogVGhlIHNwZWMgc3RhdGVzIHRoYXQgYSBcXFJlc291cmNlcyBlbnRyeSBoYXMgdG8gYmVcbiAgICAvLyBwcmVzZW50LCBidXQgY2FuIGJlIGVtcHR5LiBTb21lIGRvY3VtZW50cyBzdGlsbCBvbWl0IGl0OyBpbiB0aGlzIGNhc2VcbiAgICAvLyB3ZSByZXR1cm4gYW4gZW1wdHkgZGljdGlvbmFyeS5cbiAgICByZXR1cm4gc2hhZG93KFxuICAgICAgdGhpcyxcbiAgICAgIFwicmVzb3VyY2VzXCIsXG4gICAgICB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KFwiUmVzb3VyY2VzXCIpIHx8IERpY3QuZW1wdHlcbiAgICApO1xuICB9XG5cbiAgX2dldEJvdW5kaW5nQm94KG5hbWUpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KG5hbWUsIC8qIGdldEFycmF5ID0gKi8gdHJ1ZSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShib3gpICYmIGJveC5sZW5ndGggPT09IDQpIHtcbiAgICAgIGlmIChib3hbMl0gLSBib3hbMF0gIT09IDAgJiYgYm94WzNdIC0gYm94WzFdICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBib3g7XG4gICAgICB9XG4gICAgICB3YXJuKGBFbXB0eSAvJHtuYW1lfSBlbnRyeS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgbWVkaWFCb3goKSB7XG4gICAgLy8gUmVzZXQgaW52YWxpZCBtZWRpYSBib3ggdG8gbGV0dGVyIHNpemUuXG4gICAgcmV0dXJuIHNoYWRvdyhcbiAgICAgIHRoaXMsXG4gICAgICBcIm1lZGlhQm94XCIsXG4gICAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChcIk1lZGlhQm94XCIpIHx8IExFVFRFUl9TSVpFX01FRElBQk9YXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjcm9wQm94KCkge1xuICAgIC8vIFJlc2V0IGludmFsaWQgY3JvcCBib3ggdG8gbWVkaWEgYm94LlxuICAgIHJldHVybiBzaGFkb3coXG4gICAgICB0aGlzLFxuICAgICAgXCJjcm9wQm94XCIsXG4gICAgICB0aGlzLl9nZXRCb3VuZGluZ0JveChcIkNyb3BCb3hcIikgfHwgdGhpcy5tZWRpYUJveFxuICAgICk7XG4gIH1cblxuICBnZXQgdXNlclVuaXQoKSB7XG4gICAgbGV0IG9iaiA9IHRoaXMucGFnZURpY3QuZ2V0KFwiVXNlclVuaXRcIik7XG4gICAgaWYgKCFpc051bShvYmopIHx8IG9iaiA8PSAwKSB7XG4gICAgICBvYmogPSBERUZBVUxUX1VTRVJfVU5JVDtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInVzZXJVbml0XCIsIG9iaik7XG4gIH1cblxuICBnZXQgdmlldygpIHtcbiAgICAvLyBGcm9tIHRoZSBzcGVjLCA2dGggZWQuLCBwLjk2MzpcbiAgICAvLyBcIlRoZSBjcm9wLCBibGVlZCwgdHJpbSwgYW5kIGFydCBib3hlcyBzaG91bGQgbm90IG9yZGluYXJpbHlcbiAgICAvLyBleHRlbmQgYmV5b25kIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBtZWRpYSBib3guIElmIHRoZXkgZG8sIHRoZXkgYXJlXG4gICAgLy8gZWZmZWN0aXZlbHkgcmVkdWNlZCB0byB0aGVpciBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgbWVkaWEgYm94LlwiXG4gICAgY29uc3QgeyBjcm9wQm94LCBtZWRpYUJveCB9ID0gdGhpcztcbiAgICBsZXQgdmlldztcbiAgICBpZiAoY3JvcEJveCA9PT0gbWVkaWFCb3ggfHwgaXNBcnJheUVxdWFsKGNyb3BCb3gsIG1lZGlhQm94KSkge1xuICAgICAgdmlldyA9IG1lZGlhQm94O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3ggPSBVdGlsLmludGVyc2VjdChjcm9wQm94LCBtZWRpYUJveCk7XG4gICAgICBpZiAoYm94ICYmIGJveFsyXSAtIGJveFswXSAhPT0gMCAmJiBib3hbM10gLSBib3hbMV0gIT09IDApIHtcbiAgICAgICAgdmlldyA9IGJveDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oXCJFbXB0eSAvQ3JvcEJveCBhbmQgL01lZGlhQm94IGludGVyc2VjdGlvbi5cIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2aWV3XCIsIHZpZXcgfHwgbWVkaWFCb3gpO1xuICB9XG5cbiAgZ2V0IHJvdGF0ZSgpIHtcbiAgICBsZXQgcm90YXRlID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShcIlJvdGF0ZVwiKSB8fCAwO1xuXG4gICAgLy8gTm9ybWFsaXplIHJvdGF0aW9uIHNvIGl0J3MgYSBtdWx0aXBsZSBvZiA5MCBhbmQgYmV0d2VlbiAwIGFuZCAyNzAuXG4gICAgaWYgKHJvdGF0ZSAlIDkwICE9PSAwKSB7XG4gICAgICByb3RhdGUgPSAwO1xuICAgIH0gZWxzZSBpZiAocm90YXRlID49IDM2MCkge1xuICAgICAgcm90YXRlID0gcm90YXRlICUgMzYwO1xuICAgIH0gZWxzZSBpZiAocm90YXRlIDwgMCkge1xuICAgICAgLy8gVGhlIHNwZWMgZG9lc24ndCBjb3ZlciBuZWdhdGl2ZXMuIEFzc3VtZSBpdCdzIGNvdW50ZXJjbG9ja3dpc2VcbiAgICAgIC8vIHJvdGF0aW9uLiBUaGUgZm9sbG93aW5nIGlzIHRoZSBvdGhlciBpbXBsZW1lbnRhdGlvbiBvZiBtb2R1bG8uXG4gICAgICByb3RhdGUgPSAoKHJvdGF0ZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicm90YXRlXCIsIHJvdGF0ZSk7XG4gIH1cblxuICBnZXRDb250ZW50U3RyZWFtKCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG4gICAgbGV0IHN0cmVhbTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG4gICAgICAvLyBGZXRjaGluZyB0aGUgaW5kaXZpZHVhbCBzdHJlYW1zIGZyb20gdGhlIGFycmF5LlxuICAgICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjtcbiAgICAgIGNvbnN0IHN0cmVhbXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgc3ViU3RyZWFtIG9mIGNvbnRlbnQpIHtcbiAgICAgICAgc3RyZWFtcy5wdXNoKHhyZWYuZmV0Y2hJZlJlZihzdWJTdHJlYW0pKTtcbiAgICAgIH1cbiAgICAgIHN0cmVhbSA9IG5ldyBTdHJlYW1zU2VxdWVuY2VTdHJlYW0oc3RyZWFtcyk7XG4gICAgfSBlbHNlIGlmIChpc1N0cmVhbShjb250ZW50KSkge1xuICAgICAgc3RyZWFtID0gY29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVwbGFjZSBub24tZXhpc3RlbnQgcGFnZSBjb250ZW50IHdpdGggZW1wdHkgY29udGVudC5cbiAgICAgIHN0cmVhbSA9IG5ldyBOdWxsU3RyZWFtKCk7XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG4gIH1cblxuICBzYXZlKGhhbmRsZXIsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7XG4gICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHtcbiAgICAgIHhyZWY6IHRoaXMueHJlZixcbiAgICAgIGhhbmRsZXIsXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSxcbiAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsXG4gICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsXG4gICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsXG4gICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICAvLyBGZXRjaCB0aGUgcGFnZSdzIGFubm90YXRpb25zIGFuZCBzYXZlIHRoZSBjb250ZW50XG4gICAgLy8gaW4gY2FzZSBvZiBpbnRlcmFjdGl2ZSBmb3JtIGZpZWxkcy5cbiAgICByZXR1cm4gdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHtcbiAgICAgIGNvbnN0IG5ld1JlZnNQcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7XG4gICAgICAgIGlmICghaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uLCBcInByaW50XCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbmV3UmVmc1Byb21pc2VzLnB1c2goXG4gICAgICAgICAgYW5ub3RhdGlvblxuICAgICAgICAgICAgLnNhdmUocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwic2F2ZSAtIGlnbm9yaW5nIGFubm90YXRpb24gZGF0YSBkdXJpbmcgXCIgK1xuICAgICAgICAgICAgICAgICAgYFwiJHt0YXNrLm5hbWV9XCIgdGFzazogXCIke3JlYXNvbn1cIi5gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5ld1JlZnNQcm9taXNlcyk7XG4gICAgfSk7XG4gIH1cblxuICBsb2FkUmVzb3VyY2VzKGtleXMpIHtcbiAgICBpZiAoIXRoaXMucmVzb3VyY2VzUHJvbWlzZSkge1xuICAgICAgLy8gVE9ETzogYWRkIGFzeW5jIGBfZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eWAgYW5kIHJlbW92ZSB0aGlzLlxuICAgICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCBcInJlc291cmNlc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIodGhpcy5yZXNvdXJjZXMsIGtleXMsIHRoaXMueHJlZik7XG4gICAgICByZXR1cm4gb2JqZWN0TG9hZGVyLmxvYWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE9wZXJhdG9yTGlzdCh7XG4gICAgaGFuZGxlcixcbiAgICBzaW5rLFxuICAgIHRhc2ssXG4gICAgaW50ZW50LFxuICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMsXG4gICAgYW5ub3RhdGlvblN0b3JhZ2UsXG4gIH0pIHtcbiAgICBjb25zdCBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUoXG4gICAgICB0aGlzLFxuICAgICAgXCJnZXRDb250ZW50U3RyZWFtXCJcbiAgICApO1xuICAgIGNvbnN0IHJlc291cmNlc1Byb21pc2UgPSB0aGlzLmxvYWRSZXNvdXJjZXMoW1xuICAgICAgXCJFeHRHU3RhdGVcIixcbiAgICAgIFwiQ29sb3JTcGFjZVwiLFxuICAgICAgXCJQYXR0ZXJuXCIsXG4gICAgICBcIlNoYWRpbmdcIixcbiAgICAgIFwiWE9iamVjdFwiLFxuICAgICAgXCJGb250XCIsXG4gICAgXSk7XG5cbiAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IFBhcnRpYWxFdmFsdWF0b3Ioe1xuICAgICAgeHJlZjogdGhpcy54cmVmLFxuICAgICAgaGFuZGxlcixcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LFxuICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSxcbiAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSxcbiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGFQcm9taXNlcyA9IFByb21pc2UuYWxsKFtjb250ZW50U3RyZWFtUHJvbWlzZSwgcmVzb3VyY2VzUHJvbWlzZV0pO1xuICAgIGNvbnN0IHBhZ2VMaXN0UHJvbWlzZSA9IGRhdGFQcm9taXNlcy50aGVuKChbY29udGVudFN0cmVhbV0pID0+IHtcbiAgICAgIGNvbnN0IG9wTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoaW50ZW50LCBzaW5rKTtcblxuICAgICAgaGFuZGxlci5zZW5kKFwiU3RhcnRSZW5kZXJQYWdlXCIsIHtcbiAgICAgICAgdHJhbnNwYXJlbmN5OiBwYXJ0aWFsRXZhbHVhdG9yLmhhc0JsZW5kTW9kZXModGhpcy5yZXNvdXJjZXMpLFxuICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgICBpbnRlbnQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3JcbiAgICAgICAgLmdldE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgc3RyZWFtOiBjb250ZW50U3RyZWFtLFxuICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcyxcbiAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBvcExpc3Q7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gRmV0Y2ggdGhlIHBhZ2UncyBhbm5vdGF0aW9ucyBhbmQgYWRkIHRoZWlyIG9wZXJhdG9yIGxpc3RzIHRvIHRoZVxuICAgIC8vIHBhZ2UncyBvcGVyYXRvciBsaXN0IHRvIHJlbmRlciB0aGVtLlxuICAgIHJldHVybiBQcm9taXNlLmFsbChbcGFnZUxpc3RQcm9taXNlLCB0aGlzLl9wYXJzZWRBbm5vdGF0aW9uc10pLnRoZW4oXG4gICAgICBmdW5jdGlvbiAoW3BhZ2VPcExpc3QsIGFubm90YXRpb25zXSkge1xuICAgICAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcGFnZU9wTGlzdC5mbHVzaCh0cnVlKTtcbiAgICAgICAgICByZXR1cm4geyBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGggfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbGxlY3QgdGhlIG9wZXJhdG9yIGxpc3QgcHJvbWlzZXMgZm9yIHRoZSBhbm5vdGF0aW9ucy4gRWFjaCBwcm9taXNlXG4gICAgICAgIC8vIGlzIHJlc29sdmVkIHdpdGggdGhlIGNvbXBsZXRlIG9wZXJhdG9yIGxpc3QgZm9yIGEgc2luZ2xlIGFubm90YXRpb24uXG4gICAgICAgIGNvbnN0IG9wTGlzdFByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykge1xuICAgICAgICAgIGlmIChpc0Fubm90YXRpb25SZW5kZXJhYmxlKGFubm90YXRpb24sIGludGVudCkpIHtcbiAgICAgICAgICAgIG9wTGlzdFByb21pc2VzLnB1c2goXG4gICAgICAgICAgICAgIGFubm90YXRpb25cbiAgICAgICAgICAgICAgICAuZ2V0T3BlcmF0b3JMaXN0KFxuICAgICAgICAgICAgICAgICAgcGFydGlhbEV2YWx1YXRvcixcbiAgICAgICAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLFxuICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgICAgIFwiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgYW5ub3RhdGlvbiBkYXRhIGR1cmluZyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgYFwiJHt0YXNrLm5hbWV9XCIgdGFzazogXCIke3JlYXNvbn1cIi5gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wTGlzdFByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChvcExpc3RzKSB7XG4gICAgICAgICAgcGFnZU9wTGlzdC5hZGRPcChPUFMuYmVnaW5Bbm5vdGF0aW9ucywgW10pO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3BMaXN0IG9mIG9wTGlzdHMpIHtcbiAgICAgICAgICAgIHBhZ2VPcExpc3QuYWRkT3BMaXN0KG9wTGlzdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhZ2VPcExpc3QuYWRkT3AoT1BTLmVuZEFubm90YXRpb25zLCBbXSk7XG4gICAgICAgICAgcGFnZU9wTGlzdC5mbHVzaCh0cnVlKTtcbiAgICAgICAgICByZXR1cm4geyBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGggfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGV4dHJhY3RUZXh0Q29udGVudCh7XG4gICAgaGFuZGxlcixcbiAgICB0YXNrLFxuICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UsXG4gICAgc2luayxcbiAgICBjb21iaW5lVGV4dEl0ZW1zLFxuICB9KSB7XG4gICAgY29uc3QgY29udGVudFN0cmVhbVByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiZ2V0Q29udGVudFN0cmVhbVwiXG4gICAgKTtcbiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFtcbiAgICAgIFwiRXh0R1N0YXRlXCIsXG4gICAgICBcIlhPYmplY3RcIixcbiAgICAgIFwiRm9udFwiLFxuICAgIF0pO1xuXG4gICAgY29uc3QgZGF0YVByb21pc2VzID0gUHJvbWlzZS5hbGwoW2NvbnRlbnRTdHJlYW1Qcm9taXNlLCByZXNvdXJjZXNQcm9taXNlXSk7XG4gICAgcmV0dXJuIGRhdGFQcm9taXNlcy50aGVuKChbY29udGVudFN0cmVhbV0pID0+IHtcbiAgICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7XG4gICAgICAgIHhyZWY6IHRoaXMueHJlZixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSxcbiAgICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSxcbiAgICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLFxuICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcGFydGlhbEV2YWx1YXRvci5nZXRUZXh0Q29udGVudCh7XG4gICAgICAgIHN0cmVhbTogY29udGVudFN0cmVhbSxcbiAgICAgICAgdGFzayxcbiAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcyxcbiAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZSxcbiAgICAgICAgY29tYmluZVRleHRJdGVtcyxcbiAgICAgICAgc2luayxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0QW5ub3RhdGlvbnNEYXRhKGludGVudCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucy50aGVuKGZ1bmN0aW9uIChhbm5vdGF0aW9ucykge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbnNEYXRhID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBhbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGlmICghaW50ZW50IHx8IGlzQW5ub3RhdGlvblJlbmRlcmFibGUoYW5ub3RhdGlvbnNbaV0sIGludGVudCkpIHtcbiAgICAgICAgICBhbm5vdGF0aW9uc0RhdGEucHVzaChhbm5vdGF0aW9uc1tpXS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFubm90YXRpb25zRGF0YTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBhbm5vdGF0aW9ucygpIHtcbiAgICByZXR1cm4gc2hhZG93KFxuICAgICAgdGhpcyxcbiAgICAgIFwiYW5ub3RhdGlvbnNcIixcbiAgICAgIHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoXCJBbm5vdHNcIikgfHwgW11cbiAgICApO1xuICB9XG5cbiAgZ2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpIHtcbiAgICBjb25zdCBwYXJzZWRBbm5vdGF0aW9ucyA9IHRoaXMucGRmTWFuYWdlclxuICAgICAgLmVuc3VyZSh0aGlzLCBcImFubm90YXRpb25zXCIpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGFubm90YXRpb25SZWYgb2YgdGhpcy5hbm5vdGF0aW9ucykge1xuICAgICAgICAgIGFubm90YXRpb25Qcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKFxuICAgICAgICAgICAgICB0aGlzLnhyZWYsXG4gICAgICAgICAgICAgIGFubm90YXRpb25SZWYsXG4gICAgICAgICAgICAgIHRoaXMucGRmTWFuYWdlcixcbiAgICAgICAgICAgICAgdGhpcy5fbG9jYWxJZEZhY3RvcnlcbiAgICAgICAgICAgICkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICB3YXJuKGBfcGFyc2VkQW5ub3RhdGlvbnM6IFwiJHtyZWFzb259XCIuYCk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGFubm90YXRpb25Qcm9taXNlcykudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnMuZmlsdGVyKGFubm90YXRpb24gPT4gISFhbm5vdGF0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfcGFyc2VkQW5ub3RhdGlvbnNcIiwgcGFyc2VkQW5ub3RhdGlvbnMpO1xuICB9XG59XG5cbmNvbnN0IFBERl9IRUFERVJfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4MjUsIDB4NTAsIDB4NDQsIDB4NDYsIDB4MmRdKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgU1RBUlRYUkVGX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFtcbiAgMHg3MywgMHg3NCwgMHg2MSwgMHg3MiwgMHg3NCwgMHg3OCwgMHg3MiwgMHg2NSwgMHg2Nl0pO1xuY29uc3QgRU5ET0JKX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDY1LCAweDZlLCAweDY0LCAweDZmLCAweDYyLCAweDZhXSk7XG5cbmNvbnN0IEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTID0gMTAyNDtcbmNvbnN0IEVNUFRZX0ZJTkdFUlBSSU5UID1cbiAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiO1xuXG5jb25zdCBQREZfSEVBREVSX1ZFUlNJT05fUkVHRVhQID0gL15bMS05XVxcLlswLTldJC87XG5cbmZ1bmN0aW9uIGZpbmQoc3RyZWFtLCBzaWduYXR1cmUsIGxpbWl0ID0gMTAyNCwgYmFja3dhcmRzID0gZmFsc2UpIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICkge1xuICAgIGFzc2VydChsaW1pdCA+IDAsICdUaGUgXCJsaW1pdFwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLicpO1xuICB9XG4gIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cbiAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhsaW1pdCk7XG4gIGNvbnN0IHNjYW5MZW5ndGggPSBzY2FuQnl0ZXMubGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoO1xuXG4gIGlmIChzY2FuTGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJhY2t3YXJkcykge1xuICAgIGNvbnN0IHNpZ25hdHVyZUVuZCA9IHNpZ25hdHVyZUxlbmd0aCAtIDE7XG5cbiAgICBsZXQgcG9zID0gc2NhbkJ5dGVzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKHBvcyA+PSBzaWduYXR1cmVFbmQpIHtcbiAgICAgIGxldCBqID0gMDtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgaiA8IHNpZ25hdHVyZUxlbmd0aCAmJlxuICAgICAgICBzY2FuQnl0ZXNbcG9zIC0gal0gPT09IHNpZ25hdHVyZVtzaWduYXR1cmVFbmQgLSBqXVxuICAgICAgKSB7XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICAgIGlmIChqID49IHNpZ25hdHVyZUxlbmd0aCkge1xuICAgICAgICAvLyBgc2lnbmF0dXJlYCBmb3VuZC5cbiAgICAgICAgc3RyZWFtLnBvcyArPSBwb3MgLSBzaWduYXR1cmVFbmQ7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcG9zLS07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGZvcndhcmRzXG4gICAgbGV0IHBvcyA9IDA7XG4gICAgd2hpbGUgKHBvcyA8PSBzY2FuTGVuZ3RoKSB7XG4gICAgICBsZXQgaiA9IDA7XG4gICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zICsgal0gPT09IHNpZ25hdHVyZVtqXSkge1xuICAgICAgICBqKys7XG4gICAgICB9XG4gICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHtcbiAgICAgICAgLy8gYHNpZ25hdHVyZWAgZm91bmQuXG4gICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHBvcysrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVGhlIGBQREZEb2N1bWVudGAgY2xhc3MgaG9sZHMgYWxsIHRoZSAod29ya2VyLXRocmVhZCkgZGF0YSBvZiB0aGUgUERGIGZpbGUuXG4gKi9cbmNsYXNzIFBERkRvY3VtZW50IHtcbiAgY29uc3RydWN0b3IocGRmTWFuYWdlciwgYXJnKSB7XG4gICAgbGV0IHN0cmVhbTtcbiAgICBpZiAoaXNTdHJlYW0oYXJnKSkge1xuICAgICAgc3RyZWFtID0gYXJnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihhcmcpKSB7XG4gICAgICBzdHJlYW0gPSBuZXcgU3RyZWFtKGFyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBERkRvY3VtZW50OiBVbmtub3duIGFyZ3VtZW50IHR5cGVcIik7XG4gICAgfVxuICAgIGlmIChzdHJlYW0ubGVuZ3RoIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKFxuICAgICAgICBcIlRoZSBQREYgZmlsZSBpcyBlbXB0eSwgaS5lLiBpdHMgc2l6ZSBpcyB6ZXJvIGJ5dGVzLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy54cmVmID0gbmV3IFhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKTtcbiAgICB0aGlzLl9wYWdlUHJvbWlzZXMgPSBbXTtcbiAgICB0aGlzLl92ZXJzaW9uID0gbnVsbDtcblxuICAgIGNvbnN0IGlkQ291bnRlcnMgPSB7XG4gICAgICBmb250OiAwLFxuICAgIH07XG4gICAgdGhpcy5fZ2xvYmFsSWRGYWN0b3J5ID0gY2xhc3Mge1xuICAgICAgc3RhdGljIGdldERvY0lkKCkge1xuICAgICAgICByZXR1cm4gYGdfJHtwZGZNYW5hZ2VyLmRvY0lkfWA7XG4gICAgICB9XG5cbiAgICAgIHN0YXRpYyBjcmVhdGVGb250SWQoKSB7XG4gICAgICAgIHJldHVybiBgZiR7KytpZENvdW50ZXJzLmZvbnR9YDtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkge1xuICAgICAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlT2JqSWRgIGNhbGxlZC5cIik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHBhcnNlKHJlY292ZXJ5TW9kZSkge1xuICAgIHRoaXMueHJlZi5wYXJzZShyZWNvdmVyeU1vZGUpO1xuICAgIHRoaXMuY2F0YWxvZyA9IG5ldyBDYXRhbG9nKHRoaXMucGRmTWFuYWdlciwgdGhpcy54cmVmKTtcblxuICAgIC8vIFRoZSBgY2hlY2tIZWFkZXJgIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGFuZCBwYXJzZXMgdGhlXG4gICAgLy8gdmVyc2lvbiBmcm9tIHRoZSBoZWFkZXIuIFRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyBpbiBzZWN0aW9uIDcuNS4yXG4gICAgLy8gdGhhdCB0aGUgdmVyc2lvbiBmcm9tIHRoZSBjYXRhbG9nLCBpZiBwcmVzZW50LCBzaG91bGQgb3ZlcndyaXRlIHRoZVxuICAgIC8vIHZlcnNpb24gZnJvbSB0aGUgaGVhZGVyLlxuICAgIGlmICh0aGlzLmNhdGFsb2cudmVyc2lvbikge1xuICAgICAgdGhpcy5fdmVyc2lvbiA9IHRoaXMuY2F0YWxvZy52ZXJzaW9uO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsaW5lYXJpemF0aW9uKCkge1xuICAgIGxldCBsaW5lYXJpemF0aW9uID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgbGluZWFyaXphdGlvbiA9IExpbmVhcml6YXRpb24uY3JlYXRlKHRoaXMuc3RyZWFtKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBpbmZvKGVycik7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJsaW5lYXJpemF0aW9uXCIsIGxpbmVhcml6YXRpb24pO1xuICB9XG5cbiAgZ2V0IHN0YXJ0WFJlZigpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTtcbiAgICBsZXQgc3RhcnRYUmVmID0gMDtcblxuICAgIGlmICh0aGlzLmxpbmVhcml6YXRpb24pIHtcbiAgICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgb2JqZWN0LlxuICAgICAgc3RyZWFtLnJlc2V0KCk7XG4gICAgICBpZiAoZmluZChzdHJlYW0sIEVORE9CSl9TSUdOQVRVUkUpKSB7XG4gICAgICAgIHN0YXJ0WFJlZiA9IHN0cmVhbS5wb3MgKyA2IC0gc3RyZWFtLnN0YXJ0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIGBzdGFydHhyZWZgIGJ5IGNoZWNraW5nIGJhY2t3YXJkcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gICAgICBjb25zdCBzdGVwID0gMTAyNDtcbiAgICAgIGNvbnN0IHN0YXJ0WFJlZkxlbmd0aCA9IFNUQVJUWFJFRl9TSUdOQVRVUkUubGVuZ3RoO1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2UsXG4gICAgICAgIHBvcyA9IHN0cmVhbS5lbmQ7XG5cbiAgICAgIHdoaWxlICghZm91bmQgJiYgcG9zID4gMCkge1xuICAgICAgICBwb3MgLT0gc3RlcCAtIHN0YXJ0WFJlZkxlbmd0aDtcbiAgICAgICAgaWYgKHBvcyA8IDApIHtcbiAgICAgICAgICBwb3MgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5wb3MgPSBwb3M7XG4gICAgICAgIGZvdW5kID0gZmluZChzdHJlYW0sIFNUQVJUWFJFRl9TSUdOQVRVUkUsIHN0ZXAsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgc3RyZWFtLnNraXAoOSk7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNoID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgfSB3aGlsZSAoaXNXaGl0ZVNwYWNlKGNoKSk7XG4gICAgICAgIGxldCBzdHIgPSBcIlwiO1xuICAgICAgICB3aGlsZSAoY2ggPj0gLyogU3BhY2UgPSAqLyAweDIwICYmIGNoIDw9IC8qICc5JyA9ICovIDB4MzkpIHtcbiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0WFJlZiA9IHBhcnNlSW50KHN0ciwgMTApO1xuICAgICAgICBpZiAoaXNOYU4oc3RhcnRYUmVmKSkge1xuICAgICAgICAgIHN0YXJ0WFJlZiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInN0YXJ0WFJlZlwiLCBzdGFydFhSZWYpO1xuICB9XG5cbiAgLy8gRmluZCB0aGUgaGVhZGVyLCBnZXQgdGhlIFBERiBmb3JtYXQgdmVyc2lvbiBhbmQgc2V0dXAgdGhlXG4gIC8vIHN0cmVhbSB0byBzdGFydCBmcm9tIHRoZSBoZWFkZXIuXG4gIGNoZWNrSGVhZGVyKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtO1xuICAgIHN0cmVhbS5yZXNldCgpO1xuXG4gICAgaWYgKCFmaW5kKHN0cmVhbSwgUERGX0hFQURFUl9TSUdOQVRVUkUpKSB7XG4gICAgICAvLyBNYXkgbm90IGJlIGEgUERGIGZpbGUsIGJ1dCBkb24ndCB0aHJvdyBhbiBlcnJvciBhbmQgbGV0XG4gICAgICAvLyBwYXJzaW5nIGNvbnRpbnVlLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdHJlYW0ubW92ZVN0YXJ0KCk7XG5cbiAgICAvLyBSZWFkIHRoZSBQREYgZm9ybWF0IHZlcnNpb24uXG4gICAgY29uc3QgTUFYX1BERl9WRVJTSU9OX0xFTkdUSCA9IDEyO1xuICAgIGxldCB2ZXJzaW9uID0gXCJcIixcbiAgICAgIGNoO1xuICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSA+IC8qIFNwYWNlID0gKi8gMHgyMCkge1xuICAgICAgaWYgKHZlcnNpb24ubGVuZ3RoID49IE1BWF9QREZfVkVSU0lPTl9MRU5HVEgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2ZXJzaW9uICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3ZlcnNpb24pIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgXCIlUERGLVwiIHByZWZpeC5cbiAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uLnN1YnN0cmluZyg1KTtcbiAgICB9XG4gIH1cblxuICBwYXJzZVN0YXJ0WFJlZigpIHtcbiAgICB0aGlzLnhyZWYuc2V0U3RhcnRYUmVmKHRoaXMuc3RhcnRYUmVmKTtcbiAgfVxuXG4gIGdldCBudW1QYWdlcygpIHtcbiAgICBjb25zdCBsaW5lYXJpemF0aW9uID0gdGhpcy5saW5lYXJpemF0aW9uO1xuICAgIGNvbnN0IG51bSA9IGxpbmVhcml6YXRpb24gPyBsaW5lYXJpemF0aW9uLm51bVBhZ2VzIDogdGhpcy5jYXRhbG9nLm51bVBhZ2VzO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJudW1QYWdlc1wiLCBudW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMsIHJlY3Vyc2lvbkRlcHRoID0gMCkge1xuICAgIGNvbnN0IFJFQ1VSU0lPTl9MSU1JVCA9IDEwO1xuICAgIHJldHVybiBmaWVsZHMuZXZlcnkoZmllbGQgPT4ge1xuICAgICAgZmllbGQgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWVsZCk7XG4gICAgICBpZiAoZmllbGQuaGFzKFwiS2lkc1wiKSkge1xuICAgICAgICBpZiAoKytyZWN1cnNpb25EZXB0aCA+IFJFQ1VSU0lPTl9MSU1JVCkge1xuICAgICAgICAgIHdhcm4oXCJfaGFzT25seURvY3VtZW50U2lnbmF0dXJlczogbWF4aW11bSByZWN1cnNpb24gZGVwdGggcmVhY2hlZFwiKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoXG4gICAgICAgICAgZmllbGQuZ2V0KFwiS2lkc1wiKSxcbiAgICAgICAgICByZWN1cnNpb25EZXB0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSBpc05hbWUoZmllbGQuZ2V0KFwiRlRcIiksIFwiU2lnXCIpO1xuICAgICAgY29uc3QgcmVjdGFuZ2xlID0gZmllbGQuZ2V0KFwiUmVjdFwiKTtcbiAgICAgIGNvbnN0IGlzSW52aXNpYmxlID1cbiAgICAgICAgQXJyYXkuaXNBcnJheShyZWN0YW5nbGUpICYmIHJlY3RhbmdsZS5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSA9PT0gMCk7XG4gICAgICByZXR1cm4gaXNTaWduYXR1cmUgJiYgaXNJbnZpc2libGU7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgZm9ybUluZm8oKSB7XG4gICAgY29uc3QgZm9ybUluZm8gPSB7IGhhc0Fjcm9Gb3JtOiBmYWxzZSwgaGFzWGZhOiBmYWxzZSB9O1xuICAgIGNvbnN0IGFjcm9Gb3JtID0gdGhpcy5jYXRhbG9nLmFjcm9Gb3JtO1xuICAgIGlmICghYWNyb0Zvcm0pIHtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJmb3JtSW5mb1wiLCBmb3JtSW5mbyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRoZSBkb2N1bWVudCBjb250YWlucyBYRkEgZGF0YSBpZiB0aGUgYFhGQWAgZW50cnkgaXMgYSBub24tZW1wdHlcbiAgICAgIC8vIGFycmF5IG9yIHN0cmVhbS5cbiAgICAgIGNvbnN0IHhmYSA9IGFjcm9Gb3JtLmdldChcIlhGQVwiKTtcbiAgICAgIGNvbnN0IGhhc1hmYSA9XG4gICAgICAgIChBcnJheS5pc0FycmF5KHhmYSkgJiYgeGZhLmxlbmd0aCA+IDApIHx8XG4gICAgICAgIChpc1N0cmVhbSh4ZmEpICYmICF4ZmEuaXNFbXB0eSk7XG4gICAgICBmb3JtSW5mby5oYXNYZmEgPSBoYXNYZmE7XG5cbiAgICAgIC8vIFRoZSBkb2N1bWVudCBjb250YWlucyBBY3JvRm9ybSBkYXRhIGlmIHRoZSBgRmllbGRzYCBlbnRyeSBpcyBhXG4gICAgICAvLyBub24tZW1wdHkgYXJyYXkgYW5kIGl0IGRvZXNuJ3QgY29uc2lzdCBvZiBvbmx5IGRvY3VtZW50IHNpZ25hdHVyZXMuXG4gICAgICAvLyBUaGlzIHNlY29uZCBjaGVjayBpcyByZXF1aXJlZCBmb3IgZmlsZXMgdGhhdCBkb24ndCBhY3R1YWxseSBjb250YWluXG4gICAgICAvLyBBY3JvRm9ybSBkYXRhIChvbmx5IFhGQSBkYXRhKSwgYnV0IHRoYXQgdXNlIHRoZSBgRmllbGRzYCBlbnRyeSB0b1xuICAgICAgLy8gc3RvcmUgKGludmlzaWJsZSkgZG9jdW1lbnQgc2lnbmF0dXJlcy4gVGhpcyBjYW4gYmUgZGV0ZWN0ZWQgdXNpbmdcbiAgICAgIC8vIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGBTaWdGbGFnc2AgaW50ZWdlciAoc2VlIFRhYmxlIDIxOSBpbiB0aGVcbiAgICAgIC8vIHNwZWNpZmljYXRpb24pLlxuICAgICAgY29uc3QgZmllbGRzID0gYWNyb0Zvcm0uZ2V0KFwiRmllbGRzXCIpO1xuICAgICAgY29uc3QgaGFzRmllbGRzID0gQXJyYXkuaXNBcnJheShmaWVsZHMpICYmIGZpZWxkcy5sZW5ndGggPiAwO1xuICAgICAgY29uc3Qgc2lnRmxhZ3MgPSBhY3JvRm9ybS5nZXQoXCJTaWdGbGFnc1wiKTtcbiAgICAgIGNvbnN0IGhhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMgPVxuICAgICAgICAhIShzaWdGbGFncyAmIDB4MSkgJiYgdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMpO1xuICAgICAgZm9ybUluZm8uaGFzQWNyb0Zvcm0gPSBoYXNGaWVsZHMgJiYgIWhhc09ubHlEb2N1bWVudFNpZ25hdHVyZXM7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgaW5mbyhcIkNhbm5vdCBmZXRjaCBmb3JtIGluZm9ybWF0aW9uLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImZvcm1JbmZvXCIsIGZvcm1JbmZvKTtcbiAgfVxuXG4gIGdldCBkb2N1bWVudEluZm8oKSB7XG4gICAgY29uc3QgRG9jdW1lbnRJbmZvVmFsaWRhdG9ycyA9IHtcbiAgICAgIFRpdGxlOiBpc1N0cmluZyxcbiAgICAgIEF1dGhvcjogaXNTdHJpbmcsXG4gICAgICBTdWJqZWN0OiBpc1N0cmluZyxcbiAgICAgIEtleXdvcmRzOiBpc1N0cmluZyxcbiAgICAgIENyZWF0b3I6IGlzU3RyaW5nLFxuICAgICAgUHJvZHVjZXI6IGlzU3RyaW5nLFxuICAgICAgQ3JlYXRpb25EYXRlOiBpc1N0cmluZyxcbiAgICAgIE1vZERhdGU6IGlzU3RyaW5nLFxuICAgICAgVHJhcHBlZDogaXNOYW1lLFxuICAgIH07XG5cbiAgICBsZXQgdmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZlcnNpb24gIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICFQREZfSEVBREVSX1ZFUlNJT05fUkVHRVhQLnRlc3QodmVyc2lvbilcbiAgICApIHtcbiAgICAgIHdhcm4oYEludmFsaWQgUERGIGhlYWRlciB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9ufWApO1xuICAgICAgdmVyc2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jSW5mbyA9IHtcbiAgICAgIFBERkZvcm1hdFZlcnNpb246IHZlcnNpb24sXG4gICAgICBJc0xpbmVhcml6ZWQ6ICEhdGhpcy5saW5lYXJpemF0aW9uLFxuICAgICAgSXNBY3JvRm9ybVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0sXG4gICAgICBJc1hGQVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzWGZhLFxuICAgICAgSXNDb2xsZWN0aW9uUHJlc2VudDogISF0aGlzLmNhdGFsb2cuY29sbGVjdGlvbixcbiAgICB9O1xuXG4gICAgbGV0IGluZm9EaWN0O1xuICAgIHRyeSB7XG4gICAgICBpbmZvRGljdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldChcIkluZm9cIik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgaW5mbyhcIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0RpY3QoaW5mb0RpY3QpKSB7XG4gICAgICAvLyBGaWxsIHRoZSBkb2N1bWVudCBpbmZvIHdpdGggdmFsaWQgZW50cmllcyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLFxuICAgICAgLy8gYXMgd2VsbCBhcyBhbnkgZXhpc3Rpbmcgd2VsbC1mb3JtZWQgY3VzdG9tIGVudHJpZXMuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBpbmZvRGljdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpbmZvRGljdC5nZXQoa2V5KTtcblxuICAgICAgICBpZiAoRG9jdW1lbnRJbmZvVmFsaWRhdG9yc1trZXldKSB7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSAoc3RhbmRhcmQpIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgIGlmIChEb2N1bWVudEluZm9WYWxpZGF0b3JzW2tleV0odmFsdWUpKSB7XG4gICAgICAgICAgICBkb2NJbmZvW2tleV0gPVxuICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHN0cmluZ1RvUERGU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5mbyhgQmFkIHZhbHVlIGluIGRvY3VtZW50IGluZm8gZm9yIFwiJHtrZXl9XCIuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBGb3IgY3VzdG9tIHZhbHVlcywgb25seSBhY2NlcHQgd2hpdGUtbGlzdGVkIHR5cGVzIHRvIHByZXZlbnRcbiAgICAgICAgICAvLyBlcnJvcnMgdGhhdCB3b3VsZCBvY2N1ciB3aGVuIHRyeWluZyB0byBzZW5kIG5vbi1zZXJpYWxpemFibGVcbiAgICAgICAgICAvLyBvYmplY3RzIHRvIHRoZSBtYWluLXRocmVhZCAoZm9yIGV4YW1wbGUgYERpY3RgIG9yIGBTdHJlYW1gKS5cbiAgICAgICAgICBsZXQgY3VzdG9tVmFsdWU7XG4gICAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgY3VzdG9tVmFsdWUgPSBzdHJpbmdUb1BERlN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc05hbWUodmFsdWUpIHx8IGlzTnVtKHZhbHVlKSB8fCBpc0Jvb2wodmFsdWUpKSB7XG4gICAgICAgICAgICBjdXN0b21WYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmZvKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBkb2N1bWVudCBpbmZvIGZvciAoY3VzdG9tKSBcIiR7a2V5fVwiLmApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkb2NJbmZvLkN1c3RvbSkge1xuICAgICAgICAgICAgZG9jSW5mby5DdXN0b20gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb2NJbmZvLkN1c3RvbVtrZXldID0gY3VzdG9tVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImRvY3VtZW50SW5mb1wiLCBkb2NJbmZvKTtcbiAgfVxuXG4gIGdldCBmaW5nZXJwcmludCgpIHtcbiAgICBsZXQgaGFzaDtcbiAgICBjb25zdCBpZEFycmF5ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KFwiSURcIik7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheShpZEFycmF5KSAmJlxuICAgICAgaWRBcnJheVswXSAmJlxuICAgICAgaXNTdHJpbmcoaWRBcnJheVswXSkgJiZcbiAgICAgIGlkQXJyYXlbMF0gIT09IEVNUFRZX0ZJTkdFUlBSSU5UXG4gICAgKSB7XG4gICAgICBoYXNoID0gc3RyaW5nVG9CeXRlcyhpZEFycmF5WzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaCA9IGNhbGN1bGF0ZU1ENShcbiAgICAgICAgdGhpcy5zdHJlYW0uZ2V0Qnl0ZVJhbmdlKDAsIEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTKSxcbiAgICAgICAgMCxcbiAgICAgICAgRklOR0VSUFJJTlRfRklSU1RfQllURVNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZmluZ2VycHJpbnRCdWYgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoYXNoLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IGhleCA9IGhhc2hbaV0udG9TdHJpbmcoMTYpO1xuICAgICAgZmluZ2VycHJpbnRCdWYucHVzaChoZXgucGFkU3RhcnQoMiwgXCIwXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImZpbmdlcnByaW50XCIsIGZpbmdlcnByaW50QnVmLmpvaW4oXCJcIikpO1xuICB9XG5cbiAgX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCkge1xuICAgIGNvbnN0IHsgY2F0YWxvZywgbGluZWFyaXphdGlvbiB9ID0gdGhpcztcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGxpbmVhcml6YXRpb24gJiYgbGluZWFyaXphdGlvbi5wYWdlRmlyc3QgPT09IHBhZ2VJbmRleCxcbiAgICAgICAgXCJfZ2V0TGluZWFyaXphdGlvblBhZ2UgLSBpbnZhbGlkIHBhZ2VJbmRleCBhcmd1bWVudC5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBSZWYuZ2V0KGxpbmVhcml6YXRpb24ub2JqZWN0TnVtYmVyRmlyc3QsIDApO1xuICAgIHJldHVybiB0aGlzLnhyZWZcbiAgICAgIC5mZXRjaEFzeW5jKHJlZilcbiAgICAgIC50aGVuKG9iaiA9PiB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBvYmplY3QgdGhhdCB3YXMgZm91bmQgaXMgYWN0dWFsbHkgYSBQYWdlIGRpY3Rpb25hcnkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0RpY3Qob2JqLCBcIlBhZ2VcIikgfHxcbiAgICAgICAgICAoaXNEaWN0KG9iaikgJiYgIW9iai5oYXMoXCJUeXBlXCIpICYmIG9iai5oYXMoXCJDb250ZW50c1wiKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHJlZiAmJiAhY2F0YWxvZy5wYWdlS2lkc0NvdW50Q2FjaGUuaGFzKHJlZikpIHtcbiAgICAgICAgICAgIGNhdGFsb2cucGFnZUtpZHNDb3VudENhY2hlLnB1dChyZWYsIDEpOyAvLyBDYWNoZSB0aGUgUGFnZSByZWZlcmVuY2UuXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbb2JqLCByZWZdO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgICBcIlRoZSBMaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgZG9lc24ndCBwb2ludCBcIiArXG4gICAgICAgICAgICBcInRvIGEgdmFsaWQgUGFnZSBkaWN0aW9uYXJ5LlwiXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgIGluZm8ocmVhc29uKTtcbiAgICAgICAgcmV0dXJuIGNhdGFsb2cuZ2V0UGFnZURpY3QocGFnZUluZGV4KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0UGFnZShwYWdlSW5kZXgpIHtcbiAgICBpZiAodGhpcy5fcGFnZVByb21pc2VzW3BhZ2VJbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VQcm9taXNlc1twYWdlSW5kZXhdO1xuICAgIH1cbiAgICBjb25zdCB7IGNhdGFsb2csIGxpbmVhcml6YXRpb24gfSA9IHRoaXM7XG5cbiAgICBjb25zdCBwcm9taXNlID1cbiAgICAgIGxpbmVhcml6YXRpb24gJiYgbGluZWFyaXphdGlvbi5wYWdlRmlyc3QgPT09IHBhZ2VJbmRleFxuICAgICAgICA/IHRoaXMuX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleClcbiAgICAgICAgOiBjYXRhbG9nLmdldFBhZ2VEaWN0KHBhZ2VJbmRleCk7XG5cbiAgICByZXR1cm4gKHRoaXMuX3BhZ2VQcm9taXNlc1twYWdlSW5kZXhdID0gcHJvbWlzZS50aGVuKChbcGFnZURpY3QsIHJlZl0pID0+IHtcbiAgICAgIHJldHVybiBuZXcgUGFnZSh7XG4gICAgICAgIHBkZk1hbmFnZXI6IHRoaXMucGRmTWFuYWdlcixcbiAgICAgICAgeHJlZjogdGhpcy54cmVmLFxuICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgIHBhZ2VEaWN0LFxuICAgICAgICByZWYsXG4gICAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LFxuICAgICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLFxuICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsXG4gICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSxcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfVxuXG4gIGNoZWNrRmlyc3RQYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2UoMCkuY2F0Y2goYXN5bmMgcmVhc29uID0+IHtcbiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24pIHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSB2YXJpb3VzIGNhY2hlcyB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlbid0IHN0b3JlZCBhbnlcbiAgICAgICAgLy8gaW5jb25zaXN0ZW50IGFuZC9vciBpbmNvcnJlY3Qgc3RhdGUsIHNpbmNlIHRoYXQgY291bGQgZWFzaWx5IGJyZWFrXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgYHRoaXMuZ2V0UGFnZWAgY2FsbHMuXG4gICAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5sZW5ndGggPSAwO1xuICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXAoKTtcblxuICAgICAgICB0aHJvdyBuZXcgWFJlZlBhcnNlRXhjZXB0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmb250RmFsbGJhY2soaWQsIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nLmZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcik7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nXG4gICAgICA/IHRoaXMuY2F0YWxvZy5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKVxuICAgICAgOiBjbGVhclByaW1pdGl2ZUNhY2hlcygpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhZ2UsIFBERkRvY3VtZW50IH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBieXRlc1RvU3RyaW5nLFxuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCxcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIEludmFsaWRQREZFeGNlcHRpb24sXG4gIGlzQm9vbCxcbiAgaXNOdW0sXG4gIGlzU3RyaW5nLFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgc2hhZG93LFxuICBzdHJpbmdUb1BERlN0cmluZyxcbiAgc3RyaW5nVG9VVEY4U3RyaW5nLFxuICB1bnJlYWNoYWJsZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBjbGVhclByaW1pdGl2ZUNhY2hlcyxcbiAgQ21kLFxuICBEaWN0LFxuICBpc0NtZCxcbiAgaXNEaWN0LFxuICBpc05hbWUsXG4gIGlzUmVmLFxuICBpc1JlZnNFcXVhbCxcbiAgaXNTdHJlYW0sXG4gIFJlZixcbiAgUmVmU2V0LFxuICBSZWZTZXRDYWNoZSxcbn0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgTGV4ZXIsIFBhcnNlciB9IGZyb20gXCIuL3BhcnNlci5qc1wiO1xuaW1wb3J0IHtcbiAgTWlzc2luZ0RhdGFFeGNlcHRpb24sXG4gIHRvUm9tYW5OdW1lcmFscyxcbiAgWFJlZkVudHJ5RXhjZXB0aW9uLFxuICBYUmVmUGFyc2VFeGNlcHRpb24sXG59IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IENpcGhlclRyYW5zZm9ybUZhY3RvcnkgfSBmcm9tIFwiLi9jcnlwdG8uanNcIjtcbmltcG9ydCB7IENvbG9yU3BhY2UgfSBmcm9tIFwiLi9jb2xvcnNwYWNlLmpzXCI7XG5pbXBvcnQgeyBHbG9iYWxJbWFnZUNhY2hlIH0gZnJvbSBcIi4vaW1hZ2VfdXRpbHMuanNcIjtcblxuZnVuY3Rpb24gZmV0Y2hEZXN0aW5hdGlvbihkZXN0KSB7XG4gIHJldHVybiBpc0RpY3QoZGVzdCkgPyBkZXN0LmdldChcIkRcIikgOiBkZXN0O1xufVxuXG5jbGFzcyBDYXRhbG9nIHtcbiAgY29uc3RydWN0b3IocGRmTWFuYWdlciwgeHJlZikge1xuICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7XG4gICAgdGhpcy54cmVmID0geHJlZjtcblxuICAgIHRoaXMuX2NhdERpY3QgPSB4cmVmLmdldENhdGFsb2dPYmooKTtcbiAgICBpZiAoIWlzRGljdCh0aGlzLl9jYXREaWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiQ2F0YWxvZyBvYmplY3QgaXMgbm90IGEgZGljdGlvbmFyeS5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5mb250Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTtcbiAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gbmV3IEdsb2JhbEltYWdlQ2FjaGUoKTtcbiAgICB0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpO1xuICB9XG5cbiAgZ2V0IHZlcnNpb24oKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiVmVyc2lvblwiKTtcbiAgICBpZiAoIWlzTmFtZSh2ZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInZlcnNpb25cIiwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2ZXJzaW9uXCIsIHZlcnNpb24ubmFtZSk7XG4gIH1cblxuICBnZXQgY29sbGVjdGlvbigpIHtcbiAgICBsZXQgY29sbGVjdGlvbiA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiQ29sbGVjdGlvblwiKTtcbiAgICAgIGlmIChpc0RpY3Qob2JqKSAmJiBvYmouc2l6ZSA+IDApIHtcbiAgICAgICAgY29sbGVjdGlvbiA9IG9iajtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICBpbmZvKFwiQ2Fubm90IGZldGNoIENvbGxlY3Rpb24gZW50cnk7IGFzc3VtaW5nIG5vIGNvbGxlY3Rpb24gaXMgcHJlc2VudC5cIik7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJjb2xsZWN0aW9uXCIsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgZ2V0IGFjcm9Gb3JtKCkge1xuICAgIGxldCBhY3JvRm9ybSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiQWNyb0Zvcm1cIik7XG4gICAgICBpZiAoaXNEaWN0KG9iaikgJiYgb2JqLnNpemUgPiAwKSB7XG4gICAgICAgIGFjcm9Gb3JtID0gb2JqO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIGluZm8oXCJDYW5ub3QgZmV0Y2ggQWNyb0Zvcm0gZW50cnk7IGFzc3VtaW5nIG5vIGZvcm1zIGFyZSBwcmVzZW50LlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImFjcm9Gb3JtXCIsIGFjcm9Gb3JtKTtcbiAgfVxuXG4gIGdldCBtZXRhZGF0YSgpIHtcbiAgICBjb25zdCBzdHJlYW1SZWYgPSB0aGlzLl9jYXREaWN0LmdldFJhdyhcIk1ldGFkYXRhXCIpO1xuICAgIGlmICghaXNSZWYoc3RyZWFtUmVmKSkge1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIm1ldGFkYXRhXCIsIG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHN1cHByZXNzRW5jcnlwdGlvbiA9ICEoXG4gICAgICB0aGlzLnhyZWYuZW5jcnlwdCAmJiB0aGlzLnhyZWYuZW5jcnlwdC5lbmNyeXB0TWV0YWRhdGFcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMueHJlZi5mZXRjaChzdHJlYW1SZWYsIHN1cHByZXNzRW5jcnlwdGlvbik7XG4gICAgbGV0IG1ldGFkYXRhO1xuXG4gICAgaWYgKHN0cmVhbSAmJiBpc0RpY3Qoc3RyZWFtLmRpY3QpKSB7XG4gICAgICBjb25zdCB0eXBlID0gc3RyZWFtLmRpY3QuZ2V0KFwiVHlwZVwiKTtcbiAgICAgIGNvbnN0IHN1YnR5cGUgPSBzdHJlYW0uZGljdC5nZXQoXCJTdWJ0eXBlXCIpO1xuXG4gICAgICBpZiAoaXNOYW1lKHR5cGUsIFwiTWV0YWRhdGFcIikgJiYgaXNOYW1lKHN1YnR5cGUsIFwiWE1MXCIpKSB7XG4gICAgICAgIC8vIFhYWDogVGhpcyBzaG91bGQgZXhhbWluZSB0aGUgY2hhcnNldCB0aGUgWE1MIGRvY3VtZW50IGRlZmluZXMsXG4gICAgICAgIC8vIGhvd2V2ZXIgc2luY2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyByZWFsIG1lYW5zIHRvIGRlY29kZVxuICAgICAgICAvLyBhcmJpdHJhcnkgY2hhcnNldHMsIGxldCdzIGp1c3QgaG9wZSB0aGF0IHRoZSBhdXRob3Igb2YgdGhlIFBERlxuICAgICAgICAvLyB3YXMgcmVhc29uYWJsZSBlbm91Z2ggdG8gc3RpY2sgd2l0aCB0aGUgWE1MIGRlZmF1bHQgY2hhcnNldCxcbiAgICAgICAgLy8gd2hpY2ggaXMgVVRGLTguXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWV0YWRhdGEgPSBzdHJpbmdUb1VURjhTdHJpbmcoYnl0ZXNUb1N0cmluZyhzdHJlYW0uZ2V0Qnl0ZXMoKSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5mbyhcIlNraXBwaW5nIGludmFsaWQgbWV0YWRhdGEuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gIH1cblxuICBnZXQgdG9wbGV2ZWxQYWdlc0RpY3QoKSB7XG4gICAgY29uc3QgcGFnZXNPYmogPSB0aGlzLl9jYXREaWN0LmdldChcIlBhZ2VzXCIpO1xuICAgIGlmICghaXNEaWN0KHBhZ2VzT2JqKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeS5cIik7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ0b3BsZXZlbFBhZ2VzRGljdFwiLCBwYWdlc09iaik7XG4gIH1cblxuICBnZXQgZG9jdW1lbnRPdXRsaW5lKCkge1xuICAgIGxldCBvYmogPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBvYmogPSB0aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgd2FybihcIlVuYWJsZSB0byByZWFkIGRvY3VtZW50IG91dGxpbmUuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiZG9jdW1lbnRPdXRsaW5lXCIsIG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZWFkRG9jdW1lbnRPdXRsaW5lKCkge1xuICAgIGxldCBvYmogPSB0aGlzLl9jYXREaWN0LmdldChcIk91dGxpbmVzXCIpO1xuICAgIGlmICghaXNEaWN0KG9iaikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBvYmogPSBvYmouZ2V0UmF3KFwiRmlyc3RcIik7XG4gICAgaWYgKCFpc1JlZihvYmopKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByb290ID0geyBpdGVtczogW10gfTtcbiAgICBjb25zdCBxdWV1ZSA9IFt7IG9iaiwgcGFyZW50OiByb290IH1dO1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiwga2VlcCB0cmFjayBvZiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgaXRlbXMuXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldCgpO1xuICAgIHByb2Nlc3NlZC5wdXQob2JqKTtcbiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmLFxuICAgICAgYmxhY2tDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGNvbnN0IG91dGxpbmVEaWN0ID0geHJlZi5mZXRjaElmUmVmKGkub2JqKTtcbiAgICAgIGlmIChvdXRsaW5lRGljdCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghb3V0bGluZURpY3QuaGFzKFwiVGl0bGVcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0geyB1cmw6IG51bGwsIGRlc3Q6IG51bGwgfTtcbiAgICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7XG4gICAgICAgIGRlc3REaWN0OiBvdXRsaW5lRGljdCxcbiAgICAgICAgcmVzdWx0T2JqOiBkYXRhLFxuICAgICAgICBkb2NCYXNlVXJsOiB0aGlzLnBkZk1hbmFnZXIuZG9jQmFzZVVybCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdGl0bGUgPSBvdXRsaW5lRGljdC5nZXQoXCJUaXRsZVwiKTtcbiAgICAgIGNvbnN0IGZsYWdzID0gb3V0bGluZURpY3QuZ2V0KFwiRlwiKSB8fCAwO1xuICAgICAgY29uc3QgY29sb3IgPSBvdXRsaW5lRGljdC5nZXRBcnJheShcIkNcIik7XG4gICAgICBjb25zdCBjb3VudCA9IG91dGxpbmVEaWN0LmdldChcIkNvdW50XCIpO1xuICAgICAgbGV0IHJnYkNvbG9yID0gYmxhY2tDb2xvcjtcblxuICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHBhcnNlIHRoZSBjb2xvciB3aGVuIGl0J3MgdmFsaWQsIGFuZCBub24tZGVmYXVsdC5cbiAgICAgIGlmIChcbiAgICAgICAgQXJyYXkuaXNBcnJheShjb2xvcikgJiZcbiAgICAgICAgY29sb3IubGVuZ3RoID09PSAzICYmXG4gICAgICAgIChjb2xvclswXSAhPT0gMCB8fCBjb2xvclsxXSAhPT0gMCB8fCBjb2xvclsyXSAhPT0gMClcbiAgICAgICkge1xuICAgICAgICByZ2JDb2xvciA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKGNvbG9yLCAwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3V0bGluZUl0ZW0gPSB7XG4gICAgICAgIGRlc3Q6IGRhdGEuZGVzdCxcbiAgICAgICAgdXJsOiBkYXRhLnVybCxcbiAgICAgICAgdW5zYWZlVXJsOiBkYXRhLnVuc2FmZVVybCxcbiAgICAgICAgbmV3V2luZG93OiBkYXRhLm5ld1dpbmRvdyxcbiAgICAgICAgdGl0bGU6IHN0cmluZ1RvUERGU3RyaW5nKHRpdGxlKSxcbiAgICAgICAgY29sb3I6IHJnYkNvbG9yLFxuICAgICAgICBjb3VudDogTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgPyBjb3VudCA6IHVuZGVmaW5lZCxcbiAgICAgICAgYm9sZDogISEoZmxhZ3MgJiAyKSxcbiAgICAgICAgaXRhbGljOiAhIShmbGFncyAmIDEpLFxuICAgICAgICBpdGVtczogW10sXG4gICAgICB9O1xuXG4gICAgICBpLnBhcmVudC5pdGVtcy5wdXNoKG91dGxpbmVJdGVtKTtcbiAgICAgIG9iaiA9IG91dGxpbmVEaWN0LmdldFJhdyhcIkZpcnN0XCIpO1xuICAgICAgaWYgKGlzUmVmKG9iaikgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkge1xuICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqLCBwYXJlbnQ6IG91dGxpbmVJdGVtIH0pO1xuICAgICAgICBwcm9jZXNzZWQucHV0KG9iaik7XG4gICAgICB9XG4gICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoXCJOZXh0XCIpO1xuICAgICAgaWYgKGlzUmVmKG9iaikgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkge1xuICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqLCBwYXJlbnQ6IGkucGFyZW50IH0pO1xuICAgICAgICBwcm9jZXNzZWQucHV0KG9iaik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290Lml0ZW1zLmxlbmd0aCA+IDAgPyByb290Lml0ZW1zIDogbnVsbDtcbiAgfVxuXG4gIGdldCBwZXJtaXNzaW9ucygpIHtcbiAgICBsZXQgcGVybWlzc2lvbnMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBwZXJtaXNzaW9ucyA9IHRoaXMuX3JlYWRQZXJtaXNzaW9ucygpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIHdhcm4oXCJVbmFibGUgdG8gcmVhZCBwZXJtaXNzaW9ucy5cIik7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJwZXJtaXNzaW9uc1wiLCBwZXJtaXNzaW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZWFkUGVybWlzc2lvbnMoKSB7XG4gICAgY29uc3QgZW5jcnlwdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldChcIkVuY3J5cHRcIik7XG4gICAgaWYgKCFpc0RpY3QoZW5jcnlwdCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBmbGFncyA9IGVuY3J5cHQuZ2V0KFwiUFwiKTtcbiAgICBpZiAoIWlzTnVtKGZsYWdzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gUERGIGludGVnZXIgb2JqZWN0cyBhcmUgcmVwcmVzZW50ZWQgaW50ZXJuYWxseSBpbiBzaWduZWQgMidzIGNvbXBsZW1lbnRcbiAgICAvLyBmb3JtLiBUaGVyZWZvcmUsIGNvbnZlcnQgdGhlIHNpZ25lZCBkZWNpbWFsIGludGVnZXIgdG8gYSBzaWduZWQgMidzXG4gICAgLy8gY29tcGxlbWVudCBiaW5hcnkgaW50ZWdlciBzbyB3ZSBjYW4gdXNlIHJlZ3VsYXIgYml0d2lzZSBvcGVyYXRpb25zIG9uIGl0LlxuICAgIGZsYWdzICs9IDIgKiogMzI7XG5cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIFBlcm1pc3Npb25GbGFnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IFBlcm1pc3Npb25GbGFnW2tleV07XG4gICAgICBpZiAoZmxhZ3MgJiB2YWx1ZSkge1xuICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG5cbiAgZ2V0IG9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICBsZXQgY29uZmlnID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiT0NQcm9wZXJ0aWVzXCIpO1xuICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJvcHRpb25hbENvbnRlbnRDb25maWdcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gcHJvcGVydGllcy5nZXQoXCJEXCIpO1xuICAgICAgaWYgKCFkZWZhdWx0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJvcHRpb25hbENvbnRlbnRDb25maWdcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cHNEYXRhID0gcHJvcGVydGllcy5nZXQoXCJPQ0dzXCIpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdyb3Vwc0RhdGEpKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJvcHRpb25hbENvbnRlbnRDb25maWdcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cHMgPSBbXTtcbiAgICAgIGNvbnN0IGdyb3VwUmVmcyA9IFtdO1xuICAgICAgLy8gRW5zdXJlIGFsbCB0aGUgb3B0aW9uYWwgY29udGVudCBncm91cHMgYXJlIHZhbGlkLlxuICAgICAgZm9yIChjb25zdCBncm91cFJlZiBvZiBncm91cHNEYXRhKSB7XG4gICAgICAgIGlmICghaXNSZWYoZ3JvdXBSZWYpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBSZWZzLnB1c2goZ3JvdXBSZWYpO1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGdyb3VwUmVmKTtcbiAgICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICAgIGlkOiBncm91cFJlZi50b1N0cmluZygpLFxuICAgICAgICAgIG5hbWU6IGlzU3RyaW5nKGdyb3VwLmdldChcIk5hbWVcIikpXG4gICAgICAgICAgICA/IHN0cmluZ1RvUERGU3RyaW5nKGdyb3VwLmdldChcIk5hbWVcIikpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgaW50ZW50OiBpc1N0cmluZyhncm91cC5nZXQoXCJJbnRlbnRcIikpXG4gICAgICAgICAgICA/IHN0cmluZ1RvUERGU3RyaW5nKGdyb3VwLmdldChcIkludGVudFwiKSlcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25maWcgPSB0aGlzLl9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKGRlZmF1bHRDb25maWcsIGdyb3VwUmVmcyk7XG4gICAgICBjb25maWcuZ3JvdXBzID0gZ3JvdXBzO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIHdhcm4oYFVuYWJsZSB0byByZWFkIG9wdGlvbmFsIGNvbnRlbnQgY29uZmlnOiAke2V4fWApO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwib3B0aW9uYWxDb250ZW50Q29uZmlnXCIsIGNvbmZpZyk7XG4gIH1cblxuICBfcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhjb25maWcsIGNvbnRlbnRHcm91cFJlZnMpIHtcbiAgICBmdW5jdGlvbiBwYXJzZU9uT2ZmKHJlZnMpIHtcbiAgICAgIGNvbnN0IG9uUGFyc2VkID0gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlZnMpIHtcbiAgICAgICAgICBpZiAoIWlzUmVmKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb250ZW50R3JvdXBSZWZzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgb25QYXJzZWQucHVzaCh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvblBhcnNlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU9yZGVyKHJlZnMsIG5lc3RlZExldmVscyA9IDApIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWZzKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yZGVyID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVmcykge1xuICAgICAgICBpZiAoaXNSZWYodmFsdWUpICYmIGNvbnRlbnRHcm91cFJlZnMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgcGFyc2VkT3JkZXJSZWZzLnB1dCh2YWx1ZSk7IC8vIEhhbmRsZSBcImhpZGRlblwiIGdyb3Vwcywgc2VlIGJlbG93LlxuXG4gICAgICAgICAgb3JkZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIC9PcmRlciBhcnJheXMgKHNlZSBlLmcuIGlzc3VlIDk0NjIgYW5kIGJ1ZyAxMjQwNjQxKS5cbiAgICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU5lc3RlZE9yZGVyKHZhbHVlLCBuZXN0ZWRMZXZlbHMpO1xuICAgICAgICBpZiAobmVzdGVkT3JkZXIpIHtcbiAgICAgICAgICBvcmRlci5wdXNoKG5lc3RlZE9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkTGV2ZWxzID4gMCkge1xuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgICB9XG4gICAgICBjb25zdCBoaWRkZW5Hcm91cHMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXBSZWYgb2YgY29udGVudEdyb3VwUmVmcykge1xuICAgICAgICBpZiAocGFyc2VkT3JkZXJSZWZzLmhhcyhncm91cFJlZikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBoaWRkZW5Hcm91cHMucHVzaChncm91cFJlZi50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICAgIGlmIChoaWRkZW5Hcm91cHMubGVuZ3RoKSB7XG4gICAgICAgIG9yZGVyLnB1c2goeyBuYW1lOiBudWxsLCBvcmRlcjogaGlkZGVuR3JvdXBzIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JkZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VOZXN0ZWRPcmRlcihyZWYsIG5lc3RlZExldmVscykge1xuICAgICAgaWYgKCsrbmVzdGVkTGV2ZWxzID4gTUFYX05FU1RFRF9MRVZFTFMpIHtcbiAgICAgICAgd2FybihcInBhcnNlTmVzdGVkT3JkZXIgLSByZWFjaGVkIE1BWF9ORVNURURfTEVWRUxTLlwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHhyZWYuZmV0Y2hJZlJlZihyZWYpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5lc3RlZE5hbWUgPSB4cmVmLmZldGNoSWZSZWYodmFsdWVbMF0pO1xuICAgICAgaWYgKHR5cGVvZiBuZXN0ZWROYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU9yZGVyKHZhbHVlLnNsaWNlKDEpLCBuZXN0ZWRMZXZlbHMpO1xuICAgICAgaWYgKCFuZXN0ZWRPcmRlciB8fCAhbmVzdGVkT3JkZXIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbmFtZTogc3RyaW5nVG9QREZTdHJpbmcobmVzdGVkTmFtZSksIG9yZGVyOiBuZXN0ZWRPcmRlciB9O1xuICAgIH1cblxuICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWYsXG4gICAgICBwYXJzZWRPcmRlclJlZnMgPSBuZXcgUmVmU2V0KCksXG4gICAgICBNQVhfTkVTVEVEX0xFVkVMUyA9IDEwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGlzU3RyaW5nKGNvbmZpZy5nZXQoXCJOYW1lXCIpKVxuICAgICAgICA/IHN0cmluZ1RvUERGU3RyaW5nKGNvbmZpZy5nZXQoXCJOYW1lXCIpKVxuICAgICAgICA6IG51bGwsXG4gICAgICBjcmVhdG9yOiBpc1N0cmluZyhjb25maWcuZ2V0KFwiQ3JlYXRvclwiKSlcbiAgICAgICAgPyBzdHJpbmdUb1BERlN0cmluZyhjb25maWcuZ2V0KFwiQ3JlYXRvclwiKSlcbiAgICAgICAgOiBudWxsLFxuICAgICAgYmFzZVN0YXRlOiBpc05hbWUoY29uZmlnLmdldChcIkJhc2VTdGF0ZVwiKSlcbiAgICAgICAgPyBjb25maWcuZ2V0KFwiQmFzZVN0YXRlXCIpLm5hbWVcbiAgICAgICAgOiBudWxsLFxuICAgICAgb246IHBhcnNlT25PZmYoY29uZmlnLmdldChcIk9OXCIpKSxcbiAgICAgIG9mZjogcGFyc2VPbk9mZihjb25maWcuZ2V0KFwiT0ZGXCIpKSxcbiAgICAgIG9yZGVyOiBwYXJzZU9yZGVyKGNvbmZpZy5nZXQoXCJPcmRlclwiKSksXG4gICAgICBncm91cHM6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGdldCBudW1QYWdlcygpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldChcIkNvdW50XCIpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgIFwiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIm51bVBhZ2VzXCIsIG9iaik7XG4gIH1cblxuICBnZXQgZGVzdGluYXRpb25zKCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX3JlYWREZXN0cygpLFxuICAgICAgZGVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lVHJlZSkge1xuICAgICAgY29uc3QgbmFtZXMgPSBvYmouZ2V0QWxsKCk7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbmFtZXMpIHtcbiAgICAgICAgZGVzdHNbbmFtZV0gPSBmZXRjaERlc3RpbmF0aW9uKG5hbWVzW25hbWVdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QpIHtcbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGRlc3RzW2tleV0gPSBmZXRjaERlc3RpbmF0aW9uKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJkZXN0aW5hdGlvbnNcIiwgZGVzdHMpO1xuICB9XG5cbiAgZ2V0RGVzdGluYXRpb24oZGVzdGluYXRpb25JZCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX3JlYWREZXN0cygpO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lVHJlZSB8fCBvYmogaW5zdGFuY2VvZiBEaWN0KSB7XG4gICAgICByZXR1cm4gZmV0Y2hEZXN0aW5hdGlvbihvYmouZ2V0KGRlc3RpbmF0aW9uSWQpIHx8IG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlYWREZXN0cygpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldChcIk5hbWVzXCIpO1xuICAgIGlmIChvYmogJiYgb2JqLmhhcyhcIkRlc3RzXCIpKSB7XG4gICAgICByZXR1cm4gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoXCJEZXN0c1wiKSwgdGhpcy54cmVmKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2NhdERpY3QuaGFzKFwiRGVzdHNcIikpIHtcbiAgICAgIC8vIFNpbXBsZSBkZXN0aW5hdGlvbiBkaWN0aW9uYXJ5LlxuICAgICAgcmV0dXJuIHRoaXMuX2NhdERpY3QuZ2V0KFwiRGVzdHNcIik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgcGFnZUxhYmVscygpIHtcbiAgICBsZXQgb2JqID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgb2JqID0gdGhpcy5fcmVhZFBhZ2VMYWJlbHMoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICB3YXJuKFwiVW5hYmxlIHRvIHJlYWQgcGFnZSBsYWJlbHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicGFnZUxhYmVsc1wiLCBvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVhZFBhZ2VMYWJlbHMoKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoXCJQYWdlTGFiZWxzXCIpO1xuICAgIGlmICghb2JqKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlTGFiZWxzID0gbmV3IEFycmF5KHRoaXMubnVtUGFnZXMpO1xuICAgIGxldCBzdHlsZSA9IG51bGwsXG4gICAgICBwcmVmaXggPSBcIlwiO1xuXG4gICAgY29uc3QgbnVtYmVyVHJlZSA9IG5ldyBOdW1iZXJUcmVlKG9iaiwgdGhpcy54cmVmKTtcbiAgICBjb25zdCBudW1zID0gbnVtYmVyVHJlZS5nZXRBbGwoKTtcbiAgICBsZXQgY3VycmVudExhYmVsID0gXCJcIixcbiAgICAgIGN1cnJlbnRJbmRleCA9IDE7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLm51bVBhZ2VzOyBpIDwgaWk7IGkrKykge1xuICAgICAgaWYgKGkgaW4gbnVtcykge1xuICAgICAgICBjb25zdCBsYWJlbERpY3QgPSBudW1zW2ldO1xuICAgICAgICBpZiAoIWlzRGljdChsYWJlbERpY3QpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiUGFnZUxhYmVsIGlzIG5vdCBhIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhYmVsRGljdC5oYXMoXCJUeXBlXCIpICYmXG4gICAgICAgICAgIWlzTmFtZShsYWJlbERpY3QuZ2V0KFwiVHlwZVwiKSwgXCJQYWdlTGFiZWxcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCB0eXBlIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYWJlbERpY3QuaGFzKFwiU1wiKSkge1xuICAgICAgICAgIGNvbnN0IHMgPSBsYWJlbERpY3QuZ2V0KFwiU1wiKTtcbiAgICAgICAgICBpZiAoIWlzTmFtZShzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBzdHlsZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0eWxlID0gcy5uYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0eWxlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYWJlbERpY3QuaGFzKFwiUFwiKSkge1xuICAgICAgICAgIGNvbnN0IHAgPSBsYWJlbERpY3QuZ2V0KFwiUFwiKTtcbiAgICAgICAgICBpZiAoIWlzU3RyaW5nKHApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByZWZpeCA9IHN0cmluZ1RvUERGU3RyaW5nKHApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZWZpeCA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFiZWxEaWN0LmhhcyhcIlN0XCIpKSB7XG4gICAgICAgICAgY29uc3Qgc3QgPSBsYWJlbERpY3QuZ2V0KFwiU3RcIik7XG4gICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihzdCkgJiYgc3QgPj0gMSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkludmFsaWQgc3RhcnQgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50SW5kZXggPSBzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50SW5kZXggPSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgICAgY2FzZSBcIkRcIjpcbiAgICAgICAgICBjdXJyZW50TGFiZWwgPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJSXCI6XG4gICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgY3VycmVudExhYmVsID0gdG9Sb21hbk51bWVyYWxzKGN1cnJlbnRJbmRleCwgc3R5bGUgPT09IFwiclwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFcIjpcbiAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICBjb25zdCBMSU1JVCA9IDI2OyAvLyBVc2Ugb25seSB0aGUgY2hhcmFjdGVycyBBLVosIG9yIGEtei5cbiAgICAgICAgICBjb25zdCBBX1VQUEVSX0NBU0UgPSAweDQxLFxuICAgICAgICAgICAgQV9MT1dFUl9DQVNFID0gMHg2MTtcblxuICAgICAgICAgIGNvbnN0IGJhc2VDaGFyQ29kZSA9IHN0eWxlID09PSBcImFcIiA/IEFfTE9XRVJfQ0FTRSA6IEFfVVBQRVJfQ0FTRTtcbiAgICAgICAgICBjb25zdCBsZXR0ZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgICAgY29uc3QgY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgIGJhc2VDaGFyQ29kZSArIChsZXR0ZXJJbmRleCAlIExJTUlUKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2hhckJ1ZiA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IChsZXR0ZXJJbmRleCAvIExJTUlUKSB8IDA7IGogPD0gamo7IGorKykge1xuICAgICAgICAgICAgY2hhckJ1Zi5wdXNoKGNoYXJhY3Rlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IGNoYXJCdWYuam9pbihcIlwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgc3R5bGUgXCIke3N0eWxlfVwiIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHBhZ2VMYWJlbHNbaV0gPSBwcmVmaXggKyBjdXJyZW50TGFiZWw7XG4gICAgICBjdXJyZW50SW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIHBhZ2VMYWJlbHM7XG4gIH1cblxuICBnZXQgcGFnZUxheW91dCgpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldChcIlBhZ2VMYXlvdXRcIik7XG4gICAgLy8gUHVycG9zZWx5IHVzZSBhIG5vbi1zdGFuZGFyZCBkZWZhdWx0IHZhbHVlLCByYXRoZXIgdGhhbiAnU2luZ2xlUGFnZScsIHRvXG4gICAgLy8gYWxsb3cgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gYHVuZGVmaW5lZGAgYW5kIC9TaW5nbGVQYWdlIHNpbmNlIHRoYXQgZG9lc1xuICAgIC8vIGFmZmVjdCB0aGUgU2Nyb2xsIG1vZGUgKGNvbnRpbnVvdXMvbm9uLWNvbnRpbnVvdXMpIHVzZWQgaW4gQWRvYmUgUmVhZGVyLlxuICAgIGxldCBwYWdlTGF5b3V0ID0gXCJcIjtcblxuICAgIGlmIChpc05hbWUob2JqKSkge1xuICAgICAgc3dpdGNoIChvYmoubmFtZSkge1xuICAgICAgICBjYXNlIFwiU2luZ2xlUGFnZVwiOlxuICAgICAgICBjYXNlIFwiT25lQ29sdW1uXCI6XG4gICAgICAgIGNhc2UgXCJUd29Db2x1bW5MZWZ0XCI6XG4gICAgICAgIGNhc2UgXCJUd29Db2x1bW5SaWdodFwiOlxuICAgICAgICBjYXNlIFwiVHdvUGFnZUxlZnRcIjpcbiAgICAgICAgY2FzZSBcIlR3b1BhZ2VSaWdodFwiOlxuICAgICAgICAgIHBhZ2VMYXlvdXQgPSBvYmoubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInBhZ2VMYXlvdXRcIiwgcGFnZUxheW91dCk7XG4gIH1cblxuICBnZXQgcGFnZU1vZGUoKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoXCJQYWdlTW9kZVwiKTtcbiAgICBsZXQgcGFnZU1vZGUgPSBcIlVzZU5vbmVcIjsgLy8gRGVmYXVsdCB2YWx1ZS5cblxuICAgIGlmIChpc05hbWUob2JqKSkge1xuICAgICAgc3dpdGNoIChvYmoubmFtZSkge1xuICAgICAgICBjYXNlIFwiVXNlTm9uZVwiOlxuICAgICAgICBjYXNlIFwiVXNlT3V0bGluZXNcIjpcbiAgICAgICAgY2FzZSBcIlVzZVRodW1ic1wiOlxuICAgICAgICBjYXNlIFwiRnVsbFNjcmVlblwiOlxuICAgICAgICBjYXNlIFwiVXNlT0NcIjpcbiAgICAgICAgY2FzZSBcIlVzZUF0dGFjaG1lbnRzXCI6XG4gICAgICAgICAgcGFnZU1vZGUgPSBvYmoubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInBhZ2VNb2RlXCIsIHBhZ2VNb2RlKTtcbiAgfVxuXG4gIGdldCB2aWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICBjb25zdCBWaWV3ZXJQcmVmZXJlbmNlc1ZhbGlkYXRvcnMgPSB7XG4gICAgICBIaWRlVG9vbGJhcjogaXNCb29sLFxuICAgICAgSGlkZU1lbnViYXI6IGlzQm9vbCxcbiAgICAgIEhpZGVXaW5kb3dVSTogaXNCb29sLFxuICAgICAgRml0V2luZG93OiBpc0Jvb2wsXG4gICAgICBDZW50ZXJXaW5kb3c6IGlzQm9vbCxcbiAgICAgIERpc3BsYXlEb2NUaXRsZTogaXNCb29sLFxuICAgICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlOiBpc05hbWUsXG4gICAgICBEaXJlY3Rpb246IGlzTmFtZSxcbiAgICAgIFZpZXdBcmVhOiBpc05hbWUsXG4gICAgICBWaWV3Q2xpcDogaXNOYW1lLFxuICAgICAgUHJpbnRBcmVhOiBpc05hbWUsXG4gICAgICBQcmludENsaXA6IGlzTmFtZSxcbiAgICAgIFByaW50U2NhbGluZzogaXNOYW1lLFxuICAgICAgRHVwbGV4OiBpc05hbWUsXG4gICAgICBQaWNrVHJheUJ5UERGU2l6ZTogaXNCb29sLFxuICAgICAgUHJpbnRQYWdlUmFuZ2U6IEFycmF5LmlzQXJyYXksXG4gICAgICBOdW1Db3BpZXM6IE51bWJlci5pc0ludGVnZXIsXG4gICAgfTtcblxuICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiVmlld2VyUHJlZmVyZW5jZXNcIik7XG4gICAgbGV0IHByZWZzID0gbnVsbDtcblxuICAgIGlmIChpc0RpY3Qob2JqKSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gVmlld2VyUHJlZmVyZW5jZXNWYWxpZGF0b3JzKSB7XG4gICAgICAgIGlmICghb2JqLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmouZ2V0KGtleSk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgKHN0YW5kYXJkKSB2YWx1ZSBjb25mb3JtcyB0byB0aGUgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgaWYgKCFWaWV3ZXJQcmVmZXJlbmNlc1ZhbGlkYXRvcnNba2V5XSh2YWx1ZSkpIHtcbiAgICAgICAgICBpbmZvKGBCYWQgdmFsdWUgaW4gVmlld2VyUHJlZmVyZW5jZXMgZm9yIFwiJHtrZXl9XCIuYCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZWYWx1ZTtcblxuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgIGNhc2UgXCJOb25GdWxsU2NyZWVuUGFnZU1vZGVcIjpcbiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiVXNlTm9uZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVXNlT3V0bGluZXNcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlVzZVRodW1ic1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiVXNlT0NcIjpcbiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IFwiVXNlTm9uZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkRpcmVjdGlvblwiOlxuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJMMlJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlIyTFwiOlxuICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gXCJMMlJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJWaWV3QXJlYVwiOlxuICAgICAgICAgIGNhc2UgXCJWaWV3Q2xpcFwiOlxuICAgICAgICAgIGNhc2UgXCJQcmludEFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwiUHJpbnRDbGlwXCI6XG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIk1lZGlhQm94XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJDcm9wQm94XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJCbGVlZEJveFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVHJpbUJveFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQXJ0Qm94XCI6XG4gICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSBcIkNyb3BCb3hcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJQcmludFNjYWxpbmdcIjpcbiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiTm9uZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQXBwRGVmYXVsdFwiOlxuICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gXCJBcHBEZWZhdWx0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiRHVwbGV4XCI6XG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIlNpbXBsZXhcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkR1cGxleEZsaXBTaG9ydEVkZ2VcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkR1cGxleEZsaXBMb25nRWRnZVwiOlxuICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gXCJOb25lXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiUHJpbnRQYWdlUmFuZ2VcIjpcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgbXVzdCBiZSBldmVuLlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZS5ldmVyeSgocGFnZSwgaSwgYXJyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJlxuICAgICAgICAgICAgICAgIHBhZ2UgPiAwICYmXG4gICAgICAgICAgICAgICAgKGkgPT09IDAgfHwgcGFnZSA+PSBhcnJbaSAtIDFdKSAmJlxuICAgICAgICAgICAgICAgIHBhZ2UgPD0gdGhpcy5udW1QYWdlc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJOdW1Db3BpZXNcIjpcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgICAgIGB2aWV3ZXJQcmVmZXJlbmNlcyAtIGV4cGVjdGVkIGEgYm9vbGVhbiB2YWx1ZSBmb3I6ICR7a2V5fWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZWZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKCFwcmVmcykge1xuICAgICAgICAgICAgcHJlZnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmVmc1trZXldID0gcHJlZlZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluZm8oYEJhZCB2YWx1ZSBpbiBWaWV3ZXJQcmVmZXJlbmNlcyBmb3IgXCIke2tleX1cIi5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidmlld2VyUHJlZmVyZW5jZXNcIiwgcHJlZnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5PVEU6IFwiSmF2YVNjcmlwdFwiIGFjdGlvbnMgYXJlLCBmb3Igbm93LCBoYW5kbGVkIGJ5IGBnZXQgamF2YVNjcmlwdGAgYmVsb3cuXG4gICAqL1xuICBnZXQgb3BlbkFjdGlvbigpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldChcIk9wZW5BY3Rpb25cIik7XG4gICAgbGV0IG9wZW5BY3Rpb24gPSBudWxsO1xuXG4gICAgaWYgKGlzRGljdChvYmopKSB7XG4gICAgICAvLyBDb252ZXJ0IHRoZSBPcGVuQWN0aW9uIGRpY3Rpb25hcnkgaW50byBhIGZvcm1hdCB0aGF0IHdvcmtzIHdpdGhcbiAgICAgIC8vIGBwYXJzZURlc3REaWN0aW9uYXJ5YCwgdG8gYXZvaWQgaGF2aW5nIHRvIHJlLWltcGxlbWVudCB0aG9zZSBjaGVja3MuXG4gICAgICBjb25zdCBkZXN0RGljdCA9IG5ldyBEaWN0KHRoaXMueHJlZik7XG4gICAgICBkZXN0RGljdC5zZXQoXCJBXCIsIG9iaik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IHsgdXJsOiBudWxsLCBkZXN0OiBudWxsLCBhY3Rpb246IG51bGwgfTtcbiAgICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7IGRlc3REaWN0LCByZXN1bHRPYmogfSk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdE9iai5kZXN0KSkge1xuICAgICAgICBpZiAoIW9wZW5BY3Rpb24pIHtcbiAgICAgICAgICBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuQWN0aW9uLmRlc3QgPSByZXN1bHRPYmouZGVzdDtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqLmFjdGlvbikge1xuICAgICAgICBpZiAoIW9wZW5BY3Rpb24pIHtcbiAgICAgICAgICBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuQWN0aW9uLmFjdGlvbiA9IHJlc3VsdE9iai5hY3Rpb247XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIGlmICghb3BlbkFjdGlvbikge1xuICAgICAgICBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIG9wZW5BY3Rpb24uZGVzdCA9IG9iajtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIm9wZW5BY3Rpb25cIiwgb3BlbkFjdGlvbik7XG4gIH1cblxuICBnZXQgYXR0YWNobWVudHMoKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoXCJOYW1lc1wiKTtcbiAgICBsZXQgYXR0YWNobWVudHMgPSBudWxsO1xuXG4gICAgaWYgKG9iaiAmJiBvYmouaGFzKFwiRW1iZWRkZWRGaWxlc1wiKSkge1xuICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdyhcIkVtYmVkZGVkRmlsZXNcIiksIHRoaXMueHJlZik7XG4gICAgICBjb25zdCBuYW1lcyA9IG5hbWVUcmVlLmdldEFsbCgpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIG5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTcGVjKG5hbWVzW25hbWVdLCB0aGlzLnhyZWYpO1xuICAgICAgICBpZiAoIWF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgYXR0YWNobWVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGF0dGFjaG1lbnRzW3N0cmluZ1RvUERGU3RyaW5nKG5hbWUpXSA9IGZzLnNlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImF0dGFjaG1lbnRzXCIsIGF0dGFjaG1lbnRzKTtcbiAgfVxuXG4gIGdldCBqYXZhU2NyaXB0KCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KFwiTmFtZXNcIik7XG5cbiAgICBsZXQgamF2YVNjcmlwdCA9IG51bGw7XG4gICAgZnVuY3Rpb24gYXBwZW5kSWZKYXZhU2NyaXB0RGljdChqc0RpY3QpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBqc0RpY3QuZ2V0KFwiU1wiKTtcbiAgICAgIGlmICghaXNOYW1lKHR5cGUsIFwiSmF2YVNjcmlwdFwiKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBqcyA9IGpzRGljdC5nZXQoXCJKU1wiKTtcbiAgICAgIGlmIChpc1N0cmVhbShqcykpIHtcbiAgICAgICAganMgPSBieXRlc1RvU3RyaW5nKGpzLmdldEJ5dGVzKCkpO1xuICAgICAgfSBlbHNlIGlmICghaXNTdHJpbmcoanMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFqYXZhU2NyaXB0KSB7XG4gICAgICAgIGphdmFTY3JpcHQgPSBbXTtcbiAgICAgIH1cbiAgICAgIGphdmFTY3JpcHQucHVzaChzdHJpbmdUb1BERlN0cmluZyhqcykpO1xuICAgIH1cblxuICAgIGlmIChvYmogJiYgb2JqLmhhcyhcIkphdmFTY3JpcHRcIikpIHtcbiAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoXCJKYXZhU2NyaXB0XCIpLCB0aGlzLnhyZWYpO1xuICAgICAgY29uc3QgbmFtZXMgPSBuYW1lVHJlZS5nZXRBbGwoKTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lcykge1xuICAgICAgICAvLyBXZSBkb24ndCB1c2UgbW9zdCBKYXZhU2NyaXB0IGluIFBERiBkb2N1bWVudHMuIFRoaXMgY29kZSBpc1xuICAgICAgICAvLyBkZWZlbnNpdmUgc28gd2UgZG9uJ3QgY2F1c2UgZXJyb3JzIG9uIGRvY3VtZW50IGxvYWQuXG4gICAgICAgIGNvbnN0IGpzRGljdCA9IG5hbWVzW25hbWVdO1xuICAgICAgICBpZiAoaXNEaWN0KGpzRGljdCkpIHtcbiAgICAgICAgICBhcHBlbmRJZkphdmFTY3JpcHREaWN0KGpzRGljdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgT3BlbkFjdGlvbiBcIkphdmFTY3JpcHRcIiBhY3Rpb25zIHRvIHRoZSBKYXZhU2NyaXB0IGFycmF5LlxuICAgIGNvbnN0IG9wZW5BY3Rpb24gPSB0aGlzLl9jYXREaWN0LmdldChcIk9wZW5BY3Rpb25cIik7XG4gICAgaWYgKGlzRGljdChvcGVuQWN0aW9uKSAmJiBpc05hbWUob3BlbkFjdGlvbi5nZXQoXCJTXCIpLCBcIkphdmFTY3JpcHRcIikpIHtcbiAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3Qob3BlbkFjdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImphdmFTY3JpcHRcIiwgamF2YVNjcmlwdCk7XG4gIH1cblxuICBmb250RmFsbGJhY2soaWQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIHRoaXMuZm9udENhY2hlLmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odHJhbnNsYXRlZEZvbnRzID0+IHtcbiAgICAgIGZvciAoY29uc3QgdHJhbnNsYXRlZEZvbnQgb2YgdHJhbnNsYXRlZEZvbnRzKSB7XG4gICAgICAgIGlmICh0cmFuc2xhdGVkRm9udC5sb2FkZWROYW1lID09PSBpZCkge1xuICAgICAgICAgIHRyYW5zbGF0ZWRGb250LmZhbGxiYWNrKGhhbmRsZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7XG4gICAgY2xlYXJQcmltaXRpdmVDYWNoZXMoKTtcbiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIoLyogb25seURhdGEgPSAqLyBtYW51YWxseVRyaWdnZXJlZCk7XG4gICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgdGhpcy5mb250Q2FjaGUuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbih0cmFuc2xhdGVkRm9udHMgPT4ge1xuICAgICAgZm9yIChjb25zdCB7IGRpY3QgfSBvZiB0cmFuc2xhdGVkRm9udHMpIHtcbiAgICAgICAgZGVsZXRlIGRpY3QudHJhbnNsYXRlZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9udENhY2hlLmNsZWFyKCk7XG4gICAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBhZ2VEaWN0KHBhZ2VJbmRleCkge1xuICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIGNvbnN0IG5vZGVzVG9WaXNpdCA9IFt0aGlzLl9jYXREaWN0LmdldFJhdyhcIlBhZ2VzXCIpXTtcbiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7XG4gICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZixcbiAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZSA9IHRoaXMucGFnZUtpZHNDb3VudENhY2hlO1xuICAgIGxldCBjb3VudCxcbiAgICAgIGN1cnJlbnRQYWdlSW5kZXggPSAwO1xuXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpO1xuXG4gICAgICAgIGlmIChpc1JlZihjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICBjb3VudCA9IHBhZ2VLaWRzQ291bnRDYWNoZS5nZXQoY3VycmVudE5vZGUpO1xuICAgICAgICAgIC8vIFNraXAgbm9kZXMgd2hlcmUgdGhlIHBhZ2UgY2FuJ3QgYmUuXG4gICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBjdXJyZW50UGFnZUluZGV4ICsgY291bnQgPCBwYWdlSW5kZXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUHJldmVudCBjaXJjdWxhciByZWZlcmVuY2VzIGluIHRoZSAvUGFnZXMgdHJlZS5cbiAgICAgICAgICBpZiAodmlzaXRlZE5vZGVzLmhhcyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgICAgICBuZXcgRm9ybWF0RXJyb3IoXCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS5cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXQoY3VycmVudE5vZGUpO1xuXG4gICAgICAgICAgeHJlZi5mZXRjaEFzeW5jKGN1cnJlbnROb2RlKS50aGVuKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIGlmIChpc0RpY3Qob2JqLCBcIlBhZ2VcIikgfHwgKGlzRGljdChvYmopICYmICFvYmouaGFzKFwiS2lkc1wiKSkpIHtcbiAgICAgICAgICAgICAgaWYgKHBhZ2VJbmRleCA9PT0gY3VycmVudFBhZ2VJbmRleCkge1xuICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSBQYWdlIHJlZmVyZW5jZSwgc2luY2UgaXQgY2FuICpncmVhdGx5KiBpbXByb3ZlXG4gICAgICAgICAgICAgICAgLy8gcGVyZm9ybWFuY2UgYnkgcmVkdWNpbmcgcmVkdW5kYW50IGxvb2t1cHMgaW4gbG9uZyBkb2N1bWVudHNcbiAgICAgICAgICAgICAgICAvLyB3aGVyZSBhbGwgbm9kZXMgYXJlIGZvdW5kIGF0ICpvbmUqIGxldmVsIG9mIHRoZSB0cmVlLlxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSAmJiAhcGFnZUtpZHNDb3VudENhY2hlLmhhcyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQoY3VycmVudE5vZGUsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoW29iaiwgY3VycmVudE5vZGVdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKG9iaik7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgfSwgY2FwYWJpbGl0eS5yZWplY3QpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE11c3QgYmUgYSBjaGlsZCBwYWdlIGRpY3Rpb25hcnkuXG4gICAgICAgIGlmICghaXNEaWN0KGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgICAgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgICBcIlBhZ2UgZGljdGlvbmFyeSBraWQgcmVmZXJlbmNlIHBvaW50cyB0byB3cm9uZyB0eXBlIG9mIG9iamVjdC5cIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY291bnQgPSBjdXJyZW50Tm9kZS5nZXQoXCJDb3VudFwiKTtcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoY291bnQpICYmIGNvdW50ID49IDApIHtcbiAgICAgICAgICAvLyBDYWNoZSB0aGUgS2lkcyBjb3VudCwgc2luY2UgaXQgY2FuIHJlZHVjZSByZWR1bmRhbnQgbG9va3VwcyBpblxuICAgICAgICAgIC8vIGRvY3VtZW50cyB3aGVyZSBhbGwgbm9kZXMgYXJlIGZvdW5kIGF0ICpvbmUqIGxldmVsIG9mIHRoZSB0cmVlLlxuICAgICAgICAgIGNvbnN0IG9iaklkID0gY3VycmVudE5vZGUub2JqSWQ7XG4gICAgICAgICAgaWYgKG9iaklkICYmICFwYWdlS2lkc0NvdW50Q2FjaGUuaGFzKG9iaklkKSkge1xuICAgICAgICAgICAgcGFnZUtpZHNDb3VudENhY2hlLnB1dChvYmpJZCwgY291bnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTa2lwIG5vZGVzIHdoZXJlIHRoZSBwYWdlIGNhbid0IGJlLlxuICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ICsgY291bnQgPD0gcGFnZUluZGV4KSB7XG4gICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4ICs9IGNvdW50O1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2lkcyA9IGN1cnJlbnROb2RlLmdldChcIktpZHNcIik7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkge1xuICAgICAgICAgIC8vIFByZXZlbnQgZXJyb3JzIGluIGNvcnJ1cHQgUERGIGRvY3VtZW50cyB0aGF0IHZpb2xhdGUgdGhlXG4gICAgICAgICAgLy8gc3BlY2lmaWNhdGlvbiBieSAqaW5saW5pbmcqIFBhZ2UgZGljdHMgZGlyZWN0bHkgaW4gdGhlIEtpZHNcbiAgICAgICAgICAvLyBhcnJheSwgcmF0aGVyIHRoYW4gdXNpbmcgaW5kaXJlY3Qgb2JqZWN0cyAoZml4ZXMgaXNzdWU5NTQwLnBkZikuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNOYW1lKGN1cnJlbnROb2RlLmdldChcIlR5cGVcIiksIFwiUGFnZVwiKSB8fFxuICAgICAgICAgICAgKCFjdXJyZW50Tm9kZS5oYXMoXCJUeXBlXCIpICYmIGN1cnJlbnROb2RlLmhhcyhcIkNvbnRlbnRzXCIpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggPT09IHBhZ2VJbmRleCkge1xuICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoW2N1cnJlbnROb2RlLCBudWxsXSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KFxuICAgICAgICAgICAgbmV3IEZvcm1hdEVycm9yKFwiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS5cIilcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsd2F5cyBjaGVjayBhbGwgYEtpZHNgIG5vZGVzLCB0byBhdm9pZCBnZXR0aW5nIHN0dWNrIGluIGFuIGVtcHR5XG4gICAgICAgIC8vIG5vZGUgZnVydGhlciBkb3duIGluIHRoZSB0cmVlIChzZWUgaXNzdWU1NjQ0LnBkZiwgaXNzdWU4MDg4LnBkZiksXG4gICAgICAgIC8vIGFuZCB0byBlbnN1cmUgdGhhdCB3ZSBhY3R1YWxseSBmaW5kIHRoZSBjb3JyZWN0IGBQYWdlYCBkaWN0LlxuICAgICAgICBmb3IgKGxldCBsYXN0ID0ga2lkcy5sZW5ndGggLSAxOyBsYXN0ID49IDA7IGxhc3QtLSkge1xuICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKGtpZHNbbGFzdF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoYFBhZ2UgaW5kZXggJHtwYWdlSW5kZXh9IG5vdCBmb3VuZC5gKSk7XG4gICAgfVxuICAgIG5leHQoKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgZ2V0UGFnZUluZGV4KHBhZ2VSZWYpIHtcbiAgICAvLyBUaGUgcGFnZSB0cmVlIG5vZGVzIGhhdmUgdGhlIGNvdW50IG9mIGFsbCB0aGUgbGVhdmVzIGJlbG93IHRoZW0uIFRvIGdldFxuICAgIC8vIGhvdyBtYW55IHBhZ2VzIGFyZSBiZWZvcmUgd2UganVzdCBoYXZlIHRvIHdhbGsgdXAgdGhlIHRyZWUgYW5kIGtlZXBcbiAgICAvLyBhZGRpbmcgdGhlIGNvdW50IG9mIHNpYmxpbmdzIHRvIHRoZSBsZWZ0IG9mIHRoZSBub2RlLlxuICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7XG5cbiAgICBmdW5jdGlvbiBwYWdlc0JlZm9yZVJlZihraWRSZWYpIHtcbiAgICAgIGxldCB0b3RhbCA9IDAsXG4gICAgICAgIHBhcmVudFJlZjtcblxuICAgICAgcmV0dXJuIHhyZWZcbiAgICAgICAgLmZldGNoQXN5bmMoa2lkUmVmKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzUmVmc0VxdWFsKGtpZFJlZiwgcGFnZVJlZikgJiZcbiAgICAgICAgICAgICFpc0RpY3Qobm9kZSwgXCJQYWdlXCIpICYmXG4gICAgICAgICAgICAhKGlzRGljdChub2RlKSAmJiAhbm9kZS5oYXMoXCJUeXBlXCIpICYmIG5vZGUuaGFzKFwiQ29udGVudHNcIikpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICAgIFwiVGhlIHJlZmVyZW5jZSBkb2VzIG5vdCBwb2ludCB0byBhIC9QYWdlIGRpY3Rpb25hcnkuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNEaWN0KG5vZGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJOb2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50UmVmID0gbm9kZS5nZXRSYXcoXCJQYXJlbnRcIik7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXN5bmMoXCJQYXJlbnRcIik7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNEaWN0KHBhcmVudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlBhcmVudCBtdXN0IGJlIGEgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QXN5bmMoXCJLaWRzXCIpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoa2lkcykge1xuICAgICAgICAgIGlmICgha2lkcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qga2lkUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBraWRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtpZCA9IGtpZHNbaV07XG4gICAgICAgICAgICBpZiAoIWlzUmVmKGtpZCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiS2lkIG11c3QgYmUgYSByZWZlcmVuY2UuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZCwga2lkUmVmKSkge1xuICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2lkUHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgeHJlZi5mZXRjaEFzeW5jKGtpZCkudGhlbihmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0RpY3Qob2JqKSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiS2lkIG5vZGUgbXVzdCBiZSBhIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2JqLmhhcyhcIkNvdW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICB0b3RhbCArPSBvYmouZ2V0KFwiQ291bnRcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIFBhZ2UgbGVhZiBub2RlLlxuICAgICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJLaWQgcmVmZXJlbmNlIG5vdCBmb3VuZCBpbiBwYXJlbnQncyBraWRzLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGtpZFByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBbdG90YWwsIHBhcmVudFJlZl07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgZnVuY3Rpb24gbmV4dChyZWYpIHtcbiAgICAgIHJldHVybiBwYWdlc0JlZm9yZVJlZihyZWYpLnRoZW4oZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtjb3VudCwgcGFyZW50UmVmXSA9IGFyZ3M7XG4gICAgICAgIHRvdGFsICs9IGNvdW50O1xuICAgICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQocGFnZVJlZik7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYgUGFyc2VEZXN0RGljdGlvbmFyeVBhcmFtZXRlcnNcbiAgICogQHByb3BlcnR5IHtEaWN0fSBkZXN0RGljdCAtIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGRlc3RpbmF0aW9uLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcmVzdWx0T2JqIC0gVGhlIG9iamVjdCB3aGVyZSB0aGUgcGFyc2VkIGRlc3RpbmF0aW9uXG4gICAqICAgcHJvcGVydGllcyB3aWxsIGJlIHBsYWNlZC5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtkb2NCYXNlVXJsXSAtIFRoZSBkb2N1bWVudCBiYXNlIFVSTCB0aGF0IGlzIHVzZWQgd2hlblxuICAgKiAgIGF0dGVtcHRpbmcgdG8gcmVjb3ZlciB2YWxpZCBhYnNvbHV0ZSBVUkxzIGZyb20gcmVsYXRpdmUgb25lcy5cbiAgICovXG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHBhcnNlIHRoZSBjb250ZW50cyBvZiBkZXN0aW5hdGlvbiBkaWN0aW9uYXJpZXMuXG4gICAqIEBwYXJhbSB7UGFyc2VEZXN0RGljdGlvbmFyeVBhcmFtZXRlcnN9IHBhcmFtc1xuICAgKi9cbiAgc3RhdGljIHBhcnNlRGVzdERpY3Rpb25hcnkocGFyYW1zKSB7XG4gICAgLy8gTGV0cyBVUkxzIGJlZ2lubmluZyB3aXRoICd3d3cuJyBkZWZhdWx0IHRvIHVzaW5nIHRoZSAnaHR0cDovLycgcHJvdG9jb2wuXG4gICAgZnVuY3Rpb24gYWRkRGVmYXVsdFByb3RvY29sVG9VcmwodXJsKSB7XG4gICAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoXCJ3d3cuXCIpID8gYGh0dHA6Ly8ke3VybH1gIDogdXJsO1xuICAgIH1cblxuICAgIC8vIEFjY29yZGluZyB0byBJU08gMzIwMDAtMToyMDA4LCBzZWN0aW9uIDEyLjYuNC43LCBVUklzIHNob3VsZCBiZSBlbmNvZGVkXG4gICAgLy8gaW4gNy1iaXQgQVNDSUkuIFNvbWUgYmFkIFBERnMgdXNlIFVURi04IGVuY29kaW5nOyBzZWUgQnVnemlsbGEgMTEyMjI4MC5cbiAgICBmdW5jdGlvbiB0cnlDb252ZXJ0VXJsRW5jb2RpbmcodXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9VVEY4U3RyaW5nKHVybCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdERpY3QgPSBwYXJhbXMuZGVzdERpY3Q7XG4gICAgaWYgKCFpc0RpY3QoZGVzdERpY3QpKSB7XG4gICAgICB3YXJuKFwicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdE9iaiA9IHBhcmFtcy5yZXN1bHRPYmo7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRPYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHdhcm4oXCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgcmVzdWx0T2JqYCBtdXN0IGJlIGFuIG9iamVjdC5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRvY0Jhc2VVcmwgPSBwYXJhbXMuZG9jQmFzZVVybCB8fCBudWxsO1xuXG4gICAgbGV0IGFjdGlvbiA9IGRlc3REaWN0LmdldChcIkFcIiksXG4gICAgICB1cmwsXG4gICAgICBkZXN0O1xuICAgIGlmICghaXNEaWN0KGFjdGlvbikgJiYgZGVzdERpY3QuaGFzKFwiRGVzdFwiKSkge1xuICAgICAgLy8gQSAvRGVzdCBlbnRyeSBzaG91bGQgKm9ubHkqIGNvbnRhaW4gYSBOYW1lIG9yIGFuIEFycmF5LCBidXQgc29tZSBiYWRcbiAgICAgIC8vIFBERiBnZW5lcmF0b3JzIGlnbm9yZSB0aGF0IGFuZCB0cmVhdCBpdCBhcyBhbiAvQSBlbnRyeS5cbiAgICAgIGFjdGlvbiA9IGRlc3REaWN0LmdldChcIkRlc3RcIik7XG4gICAgfVxuXG4gICAgaWYgKGlzRGljdChhY3Rpb24pKSB7XG4gICAgICBjb25zdCBhY3Rpb25UeXBlID0gYWN0aW9uLmdldChcIlNcIik7XG4gICAgICBpZiAoIWlzTmFtZShhY3Rpb25UeXBlKSkge1xuICAgICAgICB3YXJuKFwicGFyc2VEZXN0RGljdGlvbmFyeTogSW52YWxpZCB0eXBlIGluIEFjdGlvbiBkaWN0aW9uYXJ5LlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYWN0aW9uTmFtZSA9IGFjdGlvblR5cGUubmFtZTtcblxuICAgICAgc3dpdGNoIChhY3Rpb25OYW1lKSB7XG4gICAgICAgIGNhc2UgXCJVUklcIjpcbiAgICAgICAgICB1cmwgPSBhY3Rpb24uZ2V0KFwiVVJJXCIpO1xuICAgICAgICAgIGlmIChpc05hbWUodXJsKSkge1xuICAgICAgICAgICAgLy8gU29tZSBiYWQgUERGcyBkbyBub3QgcHV0IHBhcmVudGhlc2VzIGFyb3VuZCByZWxhdGl2ZSBVUkxzLlxuICAgICAgICAgICAgdXJsID0gXCIvXCIgKyB1cmwubmFtZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHVybCkpIHtcbiAgICAgICAgICAgIHVybCA9IGFkZERlZmF1bHRQcm90b2NvbFRvVXJsKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRPRE86IHBkZiBzcGVjIG1lbnRpb25zIHVybHMgY2FuIGJlIHJlbGF0aXZlIHRvIGEgQmFzZVxuICAgICAgICAgIC8vIGVudHJ5IGluIHRoZSBkaWN0aW9uYXJ5LlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJHb1RvXCI6XG4gICAgICAgICAgZGVzdCA9IGFjdGlvbi5nZXQoXCJEXCIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJMYXVuY2hcIjpcbiAgICAgICAgLy8gV2UgbmVpdGhlciB3YW50LCBub3IgY2FuLCBzdXBwb3J0IGFyYml0cmFyeSAnTGF1bmNoJyBhY3Rpb25zLlxuICAgICAgICAvLyBIb3dldmVyLCBpbiBwcmFjdGljZSB0aGV5IGFyZSBtb3N0bHkgdXNlZCBmb3IgbGlua2luZyB0byBvdGhlciBQREZcbiAgICAgICAgLy8gZmlsZXMsIHdoaWNoIHdlIHRodXMgYXR0ZW1wdCB0byBzdXBwb3J0ICh1dGlsaXppbmcgYGRvY0Jhc2VVcmxgKS5cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgICAgIGNhc2UgXCJHb1RvUlwiOlxuICAgICAgICAgIGNvbnN0IHVybERpY3QgPSBhY3Rpb24uZ2V0KFwiRlwiKTtcbiAgICAgICAgICBpZiAoaXNEaWN0KHVybERpY3QpKSB7XG4gICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBmb3VuZCBhIEZpbGVTcGVjIGRpY3Rpb25hcnlcbiAgICAgICAgICAgIC8vIGFuZCBmZXRjaCB0aGUgVVJMIHdpdGhvdXQgY2hlY2tpbmcgYW55IGZ1cnRoZXIuXG4gICAgICAgICAgICB1cmwgPSB1cmxEaWN0LmdldChcIkZcIikgfHwgbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHVybERpY3QpKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmxEaWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5PVEU6IHRoZSBkZXN0aW5hdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgKnJlbW90ZSogZG9jdW1lbnQuXG4gICAgICAgICAgbGV0IHJlbW90ZURlc3QgPSBhY3Rpb24uZ2V0KFwiRFwiKTtcbiAgICAgICAgICBpZiAocmVtb3RlRGVzdCkge1xuICAgICAgICAgICAgaWYgKGlzTmFtZShyZW1vdGVEZXN0KSkge1xuICAgICAgICAgICAgICByZW1vdGVEZXN0ID0gcmVtb3RlRGVzdC5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKHVybCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHVybC5zcGxpdChcIiNcIilbMF07XG4gICAgICAgICAgICAgIGlmIChpc1N0cmluZyhyZW1vdGVEZXN0KSkge1xuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VVcmwgKyBcIiNcIiArIHJlbW90ZURlc3Q7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZW1vdGVEZXN0KSkge1xuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VVcmwgKyBcIiNcIiArIEpTT04uc3RyaW5naWZ5KHJlbW90ZURlc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSAnTmV3V2luZG93JyBwcm9wZXJ0eSwgZXF1YWwgdG8gYExpbmtUYXJnZXQuQkxBTktgLlxuICAgICAgICAgIGNvbnN0IG5ld1dpbmRvdyA9IGFjdGlvbi5nZXQoXCJOZXdXaW5kb3dcIik7XG4gICAgICAgICAgaWYgKGlzQm9vbChuZXdXaW5kb3cpKSB7XG4gICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0gbmV3V2luZG93O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiTmFtZWRcIjpcbiAgICAgICAgICBjb25zdCBuYW1lZEFjdGlvbiA9IGFjdGlvbi5nZXQoXCJOXCIpO1xuICAgICAgICAgIGlmIChpc05hbWUobmFtZWRBY3Rpb24pKSB7XG4gICAgICAgICAgICByZXN1bHRPYmouYWN0aW9uID0gbmFtZWRBY3Rpb24ubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkphdmFTY3JpcHRcIjpcbiAgICAgICAgICBjb25zdCBqc0FjdGlvbiA9IGFjdGlvbi5nZXQoXCJKU1wiKTtcbiAgICAgICAgICBsZXQganM7XG5cbiAgICAgICAgICBpZiAoaXNTdHJlYW0oanNBY3Rpb24pKSB7XG4gICAgICAgICAgICBqcyA9IGJ5dGVzVG9TdHJpbmcoanNBY3Rpb24uZ2V0Qnl0ZXMoKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyhqc0FjdGlvbikpIHtcbiAgICAgICAgICAgIGpzID0ganNBY3Rpb247XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGpzKSB7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgdmFsaWQgVVJMcyBmcm9tIGBKU2AgZW50cmllcyB3aXRoIGNlcnRhaW5cbiAgICAgICAgICAgIC8vIHdoaXRlLWxpc3RlZCBmb3JtYXRzOlxuICAgICAgICAgICAgLy8gIC0gd2luZG93Lm9wZW4oJ2h0dHA6Ly9leGFtcGxlLmNvbScpXG4gICAgICAgICAgICAvLyAgLSBhcHAubGF1bmNoVVJMKCdodHRwOi8vZXhhbXBsZS5jb20nLCB0cnVlKVxuICAgICAgICAgICAgY29uc3QgVVJMX09QRU5fTUVUSE9EUyA9IFtcImFwcC5sYXVuY2hVUkxcIiwgXCJ3aW5kb3cub3BlblwiXTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgXCJeXFxcXHMqKFwiICtcbiAgICAgICAgICAgICAgICBVUkxfT1BFTl9NRVRIT0RTLmpvaW4oXCJ8XCIpLnNwbGl0KFwiLlwiKS5qb2luKFwiXFxcXC5cIikgK1xuICAgICAgICAgICAgICAgIFwiKVxcXFwoKD86J3xcXFwiKShbXidcXFwiXSopKD86J3xcXFwiKSg/OixcXFxccyooXFxcXHcrKVxcXFwpfFxcXFwpKVwiLFxuICAgICAgICAgICAgICBcImlcIlxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QganNVcmwgPSByZWdleC5leGVjKHN0cmluZ1RvUERGU3RyaW5nKGpzKSk7XG4gICAgICAgICAgICBpZiAoanNVcmwgJiYganNVcmxbMl0pIHtcbiAgICAgICAgICAgICAgdXJsID0ganNVcmxbMl07XG5cbiAgICAgICAgICAgICAgaWYgKGpzVXJsWzNdID09PSBcInRydWVcIiAmJiBqc1VybFsxXSA9PT0gXCJhcHAubGF1bmNoVVJMXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5OiB1bnN1cHBvcnRlZCBhY3Rpb24gdHlwZSBcIiR7YWN0aW9uTmFtZX1cIi5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlc3REaWN0LmhhcyhcIkRlc3RcIikpIHtcbiAgICAgIC8vIFNpbXBsZSBkZXN0aW5hdGlvbi5cbiAgICAgIGRlc3QgPSBkZXN0RGljdC5nZXQoXCJEZXN0XCIpO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyh1cmwpKSB7XG4gICAgICB1cmwgPSB0cnlDb252ZXJ0VXJsRW5jb2RpbmcodXJsKTtcbiAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGRvY0Jhc2VVcmwpO1xuICAgICAgaWYgKGFic29sdXRlVXJsKSB7XG4gICAgICAgIHJlc3VsdE9iai51cmwgPSBhYnNvbHV0ZVVybC5ocmVmO1xuICAgICAgfVxuICAgICAgcmVzdWx0T2JqLnVuc2FmZVVybCA9IHVybDtcbiAgICB9XG4gICAgaWYgKGRlc3QpIHtcbiAgICAgIGlmIChpc05hbWUoZGVzdCkpIHtcbiAgICAgICAgZGVzdCA9IGRlc3QubmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0cmluZyhkZXN0KSB8fCBBcnJheS5pc0FycmF5KGRlc3QpKSB7XG4gICAgICAgIHJlc3VsdE9iai5kZXN0ID0gZGVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFhSZWYgPSAoZnVuY3Rpb24gWFJlZkNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gWFJlZihzdHJlYW0sIHBkZk1hbmFnZXIpIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyO1xuICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICAgIHRoaXMueHJlZnN0bXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2NhY2hlTWFwID0gbmV3IE1hcCgpOyAvLyBQcmVwYXJlIHRoZSBYUmVmIGNhY2hlLlxuICAgIHRoaXMuc3RhdHMgPSB7XG4gICAgICBzdHJlYW1UeXBlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgIGZvbnRUeXBlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICB9O1xuICAgIHRoaXMuX25ld1JlZk51bSA9IG51bGw7XG4gIH1cblxuICBYUmVmLnByb3RvdHlwZSA9IHtcbiAgICBnZXROZXdSZWY6IGZ1bmN0aW9uIFhSZWZfZ2V0TmV3UmVmKCkge1xuICAgICAgaWYgKHRoaXMuX25ld1JlZk51bSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9uZXdSZWZOdW0gPSB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlZi5nZXQodGhpcy5fbmV3UmVmTnVtKyssIDApO1xuICAgIH0sXG5cbiAgICByZXNldE5ld1JlZjogZnVuY3Rpb24gWFJlZl9yZXNldE5ld1JlZigpIHtcbiAgICAgIHRoaXMuX25ld1JlZk51bSA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN0YXJ0WFJlZjogZnVuY3Rpb24gWFJlZl9zZXRTdGFydFhSZWYoc3RhcnRYUmVmKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgc3RhcnRpbmcgcG9zaXRpb25zIG9mIHhyZWYgdGFibGVzIGFzIHdlIHByb2Nlc3MgdGhlbVxuICAgICAgLy8gc28gd2UgY2FuIHJlY292ZXIgZnJvbSBtaXNzaW5nIGRhdGEgZXJyb3JzXG4gICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlID0gW3N0YXJ0WFJlZl07XG4gICAgfSxcblxuICAgIHBhcnNlOiBmdW5jdGlvbiBYUmVmX3BhcnNlKHJlY292ZXJ5TW9kZSkge1xuICAgICAgdmFyIHRyYWlsZXJEaWN0O1xuICAgICAgaWYgKCFyZWNvdmVyeU1vZGUpIHtcbiAgICAgICAgdHJhaWxlckRpY3QgPSB0aGlzLnJlYWRYUmVmKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFwiSW5kZXhpbmcgYWxsIFBERiBvYmplY3RzXCIpO1xuICAgICAgICB0cmFpbGVyRGljdCA9IHRoaXMuaW5kZXhPYmplY3RzKCk7XG4gICAgICB9XG4gICAgICB0cmFpbGVyRGljdC5hc3NpZ25YcmVmKHRoaXMpO1xuICAgICAgdGhpcy50cmFpbGVyID0gdHJhaWxlckRpY3Q7XG5cbiAgICAgIGxldCBlbmNyeXB0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5jcnlwdCA9IHRyYWlsZXJEaWN0LmdldChcIkVuY3J5cHRcIik7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICAgIHdhcm4oYFhSZWYucGFyc2UgLSBJbnZhbGlkIFwiRW5jcnlwdFwiIHJlZmVyZW5jZTogXCIke2V4fVwiLmApO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGljdChlbmNyeXB0KSkge1xuICAgICAgICB2YXIgaWRzID0gdHJhaWxlckRpY3QuZ2V0KFwiSURcIik7XG4gICAgICAgIHZhciBmaWxlSWQgPSBpZHMgJiYgaWRzLmxlbmd0aCA/IGlkc1swXSA6IFwiXCI7XG4gICAgICAgIC8vIFRoZSAnRW5jcnlwdCcgZGljdGlvbmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBlbmNyeXB0ZWQsIGFuZCBieVxuICAgICAgICAvLyBzZXR0aW5nIGBzdXBwcmVzc0VuY3J5cHRpb25gIHdlIGNhbiBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AgaW5zaWRlXG4gICAgICAgIC8vIG9mIGBYUmVmX2ZldGNoVW5jb21wcmVzc2VkYCBpZiB0aGUgZGljdGlvbmFyeSBjb250YWlucyBpbmRpcmVjdFxuICAgICAgICAvLyBvYmplY3RzIChmaXhlcyBpc3N1ZTc2NjUucGRmKS5cbiAgICAgICAgZW5jcnlwdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLmVuY3J5cHQgPSBuZXcgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShcbiAgICAgICAgICBlbmNyeXB0LFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICB0aGlzLnBkZk1hbmFnZXIucGFzc3dvcmRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSByb290IGRpY3Rpb25hcnkgKGNhdGFsb2cpIG9iamVjdCwgYW5kIGRvIHNvbWUgYmFzaWMgdmFsaWRhdGlvbi5cbiAgICAgIGxldCByb290O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcm9vdCA9IHRyYWlsZXJEaWN0LmdldChcIlJvb3RcIik7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICAgIHdhcm4oYFhSZWYucGFyc2UgLSBJbnZhbGlkIFwiUm9vdFwiIHJlZmVyZW5jZTogXCIke2V4fVwiLmApO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGljdChyb290KSAmJiByb290LmhhcyhcIlBhZ2VzXCIpKSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXJlY292ZXJ5TW9kZSkge1xuICAgICAgICAgIHRocm93IG5ldyBYUmVmUGFyc2VFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIHJvb3QgcmVmZXJlbmNlXCIpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzWFJlZlRhYmxlOiBmdW5jdGlvbiBYUmVmX3Byb2Nlc3NYUmVmVGFibGUocGFyc2VyKSB7XG4gICAgICBpZiAoIShcInRhYmxlU3RhdGVcIiBpbiB0aGlzKSkge1xuICAgICAgICAvLyBTdG9yZXMgc3RhdGUgb2YgdGhlIHRhYmxlIGFzIHdlIHByb2Nlc3MgaXQgc28gd2UgY2FuIHJlc3VtZVxuICAgICAgICAvLyBmcm9tIG1pZGRsZSBvZiB0YWJsZSBpbiBjYXNlIG9mIG1pc3NpbmcgZGF0YSBlcnJvclxuICAgICAgICB0aGlzLnRhYmxlU3RhdGUgPSB7XG4gICAgICAgICAgZW50cnlOdW06IDAsXG4gICAgICAgICAgc3RyZWFtUG9zOiBwYXJzZXIubGV4ZXIuc3RyZWFtLnBvcyxcbiAgICAgICAgICBwYXJzZXJCdWYxOiBwYXJzZXIuYnVmMSxcbiAgICAgICAgICBwYXJzZXJCdWYyOiBwYXJzZXIuYnVmMixcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9iaiA9IHRoaXMucmVhZFhSZWZUYWJsZShwYXJzZXIpO1xuXG4gICAgICAvLyBTYW5pdHkgY2hlY2tcbiAgICAgIGlmICghaXNDbWQob2JqLCBcInRyYWlsZXJcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIFwiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgZmluZCB0cmFpbGVyIGRpY3Rpb25hcnlcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gUmVhZCB0cmFpbGVyIGRpY3Rpb25hcnksIGUuZy5cbiAgICAgIC8vIHRyYWlsZXJcbiAgICAgIC8vICAgIDw8IC9TaXplIDIyXG4gICAgICAvLyAgICAgIC9Sb290IDIwUlxuICAgICAgLy8gICAgICAvSW5mbyAxMFJcbiAgICAgIC8vICAgICAgL0lEIFsgPDgxYjE0YWFmYTMxM2RiNjNkYmQ2Zjk4MWU0OWY5NGY0PiBdXG4gICAgICAvLyAgICA+PlxuICAgICAgLy8gVGhlIHBhcnNlciBnb2VzIHRocm91Z2ggdGhlIGVudGlyZSBzdHJlYW0gPDwgLi4uID4+IGFuZCBwcm92aWRlc1xuICAgICAgLy8gYSBnZXR0ZXIgaW50ZXJmYWNlIGZvciB0aGUga2V5LXZhbHVlIHRhYmxlXG4gICAgICB2YXIgZGljdCA9IHBhcnNlci5nZXRPYmooKTtcblxuICAgICAgLy8gVGhlIHBkZmxpYiBQREYgZ2VuZXJhdG9yIGNhbiBnZW5lcmF0ZSBhIG5lc3RlZCB0cmFpbGVyIGRpY3Rpb25hcnlcbiAgICAgIGlmICghaXNEaWN0KGRpY3QpICYmIGRpY3QuZGljdCkge1xuICAgICAgICBkaWN0ID0gZGljdC5kaWN0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc0RpY3QoZGljdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIFwiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgcGFyc2UgdHJhaWxlciBkaWN0aW9uYXJ5XCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGU7XG5cbiAgICAgIHJldHVybiBkaWN0O1xuICAgIH0sXG5cbiAgICByZWFkWFJlZlRhYmxlOiBmdW5jdGlvbiBYUmVmX3JlYWRYUmVmVGFibGUocGFyc2VyKSB7XG4gICAgICAvLyBFeGFtcGxlIG9mIGNyb3NzLXJlZmVyZW5jZSB0YWJsZTpcbiAgICAgIC8vIHhyZWZcbiAgICAgIC8vIDAgMSAgICAgICAgICAgICAgICAgICAgPC0tIHN1YnNlY3Rpb24gaGVhZGVyIChmaXJzdCBvYmogIywgb2JqIGNvdW50KVxuICAgICAgLy8gMDAwMDAwMDAwMCA2NTUzNSBmICAgICA8LS0gYWN0dWFsIG9iamVjdCAob2Zmc2V0LCBnZW5lcmF0aW9uICMsIGYvbilcbiAgICAgIC8vIDIzIDIgICAgICAgICAgICAgICAgICAgPC0tIHN1YnNlY3Rpb24gaGVhZGVyIC4uLiBhbmQgc28gb24gLi4uXG4gICAgICAvLyAwMDAwMDI1NTE4IDAwMDAyIG5cbiAgICAgIC8vIDAwMDAwMjU2MzUgMDAwMDAgblxuICAgICAgLy8gdHJhaWxlclxuICAgICAgLy8gLi4uXG5cbiAgICAgIHZhciBzdHJlYW0gPSBwYXJzZXIubGV4ZXIuc3RyZWFtO1xuICAgICAgdmFyIHRhYmxlU3RhdGUgPSB0aGlzLnRhYmxlU3RhdGU7XG4gICAgICBzdHJlYW0ucG9zID0gdGFibGVTdGF0ZS5zdHJlYW1Qb3M7XG4gICAgICBwYXJzZXIuYnVmMSA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMTtcbiAgICAgIHBhcnNlci5idWYyID0gdGFibGVTdGF0ZS5wYXJzZXJCdWYyO1xuXG4gICAgICAvLyBPdXRlciBsb29wIGlzIG92ZXIgc3Vic2VjdGlvbiBoZWFkZXJzXG4gICAgICB2YXIgb2JqO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoIShcImZpcnN0RW50cnlOdW1cIiBpbiB0YWJsZVN0YXRlKSB8fCAhKFwiZW50cnlDb3VudFwiIGluIHRhYmxlU3RhdGUpKSB7XG4gICAgICAgICAgaWYgKGlzQ21kKChvYmogPSBwYXJzZXIuZ2V0T2JqKCkpLCBcInRyYWlsZXJcIikpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW0gPSBvYmo7XG4gICAgICAgICAgdGFibGVTdGF0ZS5lbnRyeUNvdW50ID0gcGFyc2VyLmdldE9iaigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0ID0gdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtO1xuICAgICAgICB2YXIgY291bnQgPSB0YWJsZVN0YXRlLmVudHJ5Q291bnQ7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIoY291bnQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIFhSZWYgdGFibGU6IHdyb25nIHR5cGVzIGluIHN1YnNlY3Rpb24gaGVhZGVyXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIElubmVyIGxvb3AgaXMgb3ZlciBvYmplY3RzIHRoZW1zZWx2ZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IHRhYmxlU3RhdGUuZW50cnlOdW07IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgICAgIHRhYmxlU3RhdGUuZW50cnlOdW0gPSBpO1xuICAgICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMSA9IHBhcnNlci5idWYxO1xuICAgICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyO1xuXG4gICAgICAgICAgdmFyIGVudHJ5ID0ge307XG4gICAgICAgICAgZW50cnkub2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpO1xuICAgICAgICAgIGVudHJ5LmdlbiA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgICAgICB2YXIgdHlwZSA9IHBhcnNlci5nZXRPYmooKTtcblxuICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ21kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuY21kKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgICAgZW50cnkuZnJlZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJuXCI6XG4gICAgICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBWYWxpZGF0ZSBlbnRyeSBvYmpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihlbnRyeS5vZmZzZXQpIHx8XG4gICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihlbnRyeS5nZW4pIHx8XG4gICAgICAgICAgICAhKGVudHJ5LmZyZWUgfHwgZW50cnkudW5jb21wcmVzc2VkKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBlbnRyeSBpbiBYUmVmIHN1YnNlY3Rpb246ICR7Zmlyc3R9LCAke2NvdW50fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGhlIGZpcnN0IHhyZWYgdGFibGUgZW50cnksIGkuZS4gb2JqIDAsIHNob3VsZCBiZSBmcmVlLiBBdHRlbXB0aW5nXG4gICAgICAgICAgLy8gdG8gYWRqdXN0IGFuIGluY29ycmVjdCBmaXJzdCBvYmogIyAoZml4ZXMgaXNzdWUgMzI0OCBhbmQgNzIyOSkuXG4gICAgICAgICAgaWYgKGkgPT09IDAgJiYgZW50cnkuZnJlZSAmJiBmaXJzdCA9PT0gMSkge1xuICAgICAgICAgICAgZmlyc3QgPSAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGhpcy5lbnRyaWVzW2kgKyBmaXJzdF0pIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1tpICsgZmlyc3RdID0gZW50cnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGFibGVTdGF0ZS5lbnRyeU51bSA9IDA7XG4gICAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvcztcbiAgICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYxID0gcGFyc2VyLmJ1ZjE7XG4gICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyO1xuICAgICAgICBkZWxldGUgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtO1xuICAgICAgICBkZWxldGUgdGFibGVTdGF0ZS5lbnRyeUNvdW50O1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdHkgY2hlY2s6IGFzIHBlciBzcGVjLCBmaXJzdCBvYmplY3QgbXVzdCBiZSBmcmVlXG4gICAgICBpZiAodGhpcy5lbnRyaWVzWzBdICYmICF0aGlzLmVudHJpZXNbMF0uZnJlZSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1hSZWZTdHJlYW06IGZ1bmN0aW9uIFhSZWZfcHJvY2Vzc1hSZWZTdHJlYW0oc3RyZWFtKSB7XG4gICAgICBpZiAoIShcInN0cmVhbVN0YXRlXCIgaW4gdGhpcykpIHtcbiAgICAgICAgLy8gU3RvcmVzIHN0YXRlIG9mIHRoZSBzdHJlYW0gYXMgd2UgcHJvY2VzcyBpdCBzbyB3ZSBjYW4gcmVzdW1lXG4gICAgICAgIC8vIGZyb20gbWlkZGxlIG9mIHN0cmVhbSBpbiBjYXNlIG9mIG1pc3NpbmcgZGF0YSBlcnJvclxuICAgICAgICB2YXIgc3RyZWFtUGFyYW1ldGVycyA9IHN0cmVhbS5kaWN0O1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHN0cmVhbVBhcmFtZXRlcnMuZ2V0KFwiV1wiKTtcbiAgICAgICAgdmFyIHJhbmdlID0gc3RyZWFtUGFyYW1ldGVycy5nZXQoXCJJbmRleFwiKTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgIHJhbmdlID0gWzAsIHN0cmVhbVBhcmFtZXRlcnMuZ2V0KFwiU2l6ZVwiKV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0cmVhbVN0YXRlID0ge1xuICAgICAgICAgIGVudHJ5UmFuZ2VzOiByYW5nZSxcbiAgICAgICAgICBieXRlV2lkdGhzLFxuICAgICAgICAgIGVudHJ5TnVtOiAwLFxuICAgICAgICAgIHN0cmVhbVBvczogc3RyZWFtLnBvcyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVhZFhSZWZTdHJlYW0oc3RyZWFtKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVN0YXRlO1xuXG4gICAgICByZXR1cm4gc3RyZWFtLmRpY3Q7XG4gICAgfSxcblxuICAgIHJlYWRYUmVmU3RyZWFtOiBmdW5jdGlvbiBYUmVmX3JlYWRYUmVmU3RyZWFtKHN0cmVhbSkge1xuICAgICAgdmFyIGksIGo7XG4gICAgICB2YXIgc3RyZWFtU3RhdGUgPSB0aGlzLnN0cmVhbVN0YXRlO1xuICAgICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXRlLnN0cmVhbVBvcztcblxuICAgICAgdmFyIGJ5dGVXaWR0aHMgPSBzdHJlYW1TdGF0ZS5ieXRlV2lkdGhzO1xuICAgICAgdmFyIHR5cGVGaWVsZFdpZHRoID0gYnl0ZVdpZHRoc1swXTtcbiAgICAgIHZhciBvZmZzZXRGaWVsZFdpZHRoID0gYnl0ZVdpZHRoc1sxXTtcbiAgICAgIHZhciBnZW5lcmF0aW9uRmllbGRXaWR0aCA9IGJ5dGVXaWR0aHNbMl07XG5cbiAgICAgIHZhciBlbnRyeVJhbmdlcyA9IHN0cmVhbVN0YXRlLmVudHJ5UmFuZ2VzO1xuICAgICAgd2hpbGUgKGVudHJ5UmFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGZpcnN0ID0gZW50cnlSYW5nZXNbMF07XG4gICAgICAgIHZhciBuID0gZW50cnlSYW5nZXNbMV07XG5cbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogJHtmaXJzdH0sICR7bn1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgIU51bWJlci5pc0ludGVnZXIodHlwZUZpZWxkV2lkdGgpIHx8XG4gICAgICAgICAgIU51bWJlci5pc0ludGVnZXIob2Zmc2V0RmllbGRXaWR0aCkgfHxcbiAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihnZW5lcmF0aW9uRmllbGRXaWR0aClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAke2ZpcnN0fSwgJHtufWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IHN0cmVhbVN0YXRlLmVudHJ5TnVtOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgc3RyZWFtU3RhdGUuZW50cnlOdW0gPSBpO1xuICAgICAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7XG5cbiAgICAgICAgICB2YXIgdHlwZSA9IDAsXG4gICAgICAgICAgICBvZmZzZXQgPSAwLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbiA9IDA7XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IHR5cGVGaWVsZFdpZHRoOyArK2opIHtcbiAgICAgICAgICAgIHR5cGUgPSAodHlwZSA8PCA4KSB8IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHR5cGUgZmllbGQgaXMgYWJzZW50LCBpdHMgZGVmYXVsdCB2YWx1ZSBpcyAxXG4gICAgICAgICAgaWYgKHR5cGVGaWVsZFdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICB0eXBlID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9mZnNldEZpZWxkV2lkdGg7ICsraikge1xuICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA8PCA4KSB8IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW5lcmF0aW9uRmllbGRXaWR0aDsgKytqKSB7XG4gICAgICAgICAgICBnZW5lcmF0aW9uID0gKGdlbmVyYXRpb24gPDwgOCkgfCBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZW50cnkgPSB7fTtcbiAgICAgICAgICBlbnRyeS5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgZW50cnkuZ2VuID0gZ2VuZXJhdGlvbjtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgZW50cnkuZnJlZSA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBlbnRyeS51bmNvbXByZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5lbnRyaWVzW2ZpcnN0ICsgaV0pIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1tmaXJzdCArIGldID0gZW50cnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtU3RhdGUuZW50cnlOdW0gPSAwO1xuICAgICAgICBzdHJlYW1TdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgICBlbnRyeVJhbmdlcy5zcGxpY2UoMCwgMik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGluZGV4T2JqZWN0czogZnVuY3Rpb24gWFJlZl9pbmRleE9iamVjdHMoKSB7XG4gICAgICAvLyBTaW1wbGUgc2NhbiB0aHJvdWdoIHRoZSBQREYgY29udGVudCB0byBmaW5kIG9iamVjdHMsXG4gICAgICAvLyB0cmFpbGVycyBhbmQgWFJlZiBzdHJlYW1zLlxuICAgICAgdmFyIFRBQiA9IDB4OSxcbiAgICAgICAgTEYgPSAweGEsXG4gICAgICAgIENSID0gMHhkLFxuICAgICAgICBTUEFDRSA9IDB4MjA7XG4gICAgICB2YXIgUEVSQ0VOVCA9IDB4MjUsXG4gICAgICAgIExUID0gMHgzYztcblxuICAgICAgZnVuY3Rpb24gcmVhZFRva2VuKGRhdGEsIG9mZnNldCkge1xuICAgICAgICB2YXIgdG9rZW4gPSBcIlwiLFxuICAgICAgICAgIGNoID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUiAmJiBjaCAhPT0gTFQpIHtcbiAgICAgICAgICBpZiAoKytvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b2tlbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICBjaCA9IGRhdGFbb2Zmc2V0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBza2lwVW50aWwoZGF0YSwgb2Zmc2V0LCB3aGF0KSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB3aGF0Lmxlbmd0aCxcbiAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHZhciBza2lwcGVkID0gMDtcbiAgICAgICAgLy8gZmluZGluZyBieXRlIHNlcXVlbmNlXG4gICAgICAgIHdoaWxlIChvZmZzZXQgPCBkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGRhdGFbb2Zmc2V0ICsgaV0gPT09IHdoYXRbaV0pIHtcbiAgICAgICAgICAgICsraTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhazsgLy8gc2VxdWVuY2UgZm91bmRcbiAgICAgICAgICB9XG4gICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgc2tpcHBlZCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBza2lwcGVkO1xuICAgICAgfVxuICAgICAgdmFyIG9ialJlZ0V4cCA9IC9eKFxcZCspXFxzKyhcXGQrKVxccytvYmpcXGIvO1xuICAgICAgY29uc3QgZW5kb2JqUmVnRXhwID0gL1xcYmVuZG9ialtcXGJcXHNdJC87XG4gICAgICBjb25zdCBuZXN0ZWRPYmpSZWdFeHAgPSAvXFxzKyhcXGQrXFxzK1xcZCtcXHMrb2JqW1xcYlxcczxdKSQvO1xuICAgICAgY29uc3QgQ0hFQ0tfQ09OVEVOVF9MRU5HVEggPSAyNTtcblxuICAgICAgdmFyIHRyYWlsZXJCeXRlcyA9IG5ldyBVaW50OEFycmF5KFsxMTYsIDExNCwgOTcsIDEwNSwgMTA4LCAxMDEsIDExNF0pO1xuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICB2YXIgc3RhcnR4cmVmQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE1LCAxMTYsIDk3LCAxMTQsIDExNiwgMTIwLCAxMTQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAxMDJdKTtcbiAgICAgIGNvbnN0IG9iakJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExMSwgOTgsIDEwNl0pO1xuICAgICAgdmFyIHhyZWZCeXRlcyA9IG5ldyBVaW50OEFycmF5KFs0NywgODgsIDgyLCAxMDEsIDEwMl0pO1xuXG4gICAgICAvLyBDbGVhciBvdXQgYW55IGV4aXN0aW5nIGVudHJpZXMsIHNpbmNlIHRoZXkgbWF5IGJlIGJvZ3VzLlxuICAgICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG5cbiAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbTtcbiAgICAgIHN0cmVhbS5wb3MgPSAwO1xuICAgICAgdmFyIGJ1ZmZlciA9IHN0cmVhbS5nZXRCeXRlcygpO1xuICAgICAgdmFyIHBvc2l0aW9uID0gc3RyZWFtLnN0YXJ0LFxuICAgICAgICBsZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICAgICAgdmFyIHRyYWlsZXJzID0gW10sXG4gICAgICAgIHhyZWZTdG1zID0gW107XG4gICAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGNoID0gYnVmZmVyW3Bvc2l0aW9uXTtcbiAgICAgICAgaWYgKGNoID09PSBUQUIgfHwgY2ggPT09IExGIHx8IGNoID09PSBDUiB8fCBjaCA9PT0gU1BBQ0UpIHtcbiAgICAgICAgICArK3Bvc2l0aW9uO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gUEVSQ0VOVCkge1xuICAgICAgICAgIC8vICUtY29tbWVudFxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICsrcG9zaXRpb247XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2ggPSBidWZmZXJbcG9zaXRpb25dO1xuICAgICAgICAgIH0gd2hpbGUgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b2tlbiA9IHJlYWRUb2tlbihidWZmZXIsIHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIG07XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0b2tlbi5zdGFydHNXaXRoKFwieHJlZlwiKSAmJlxuICAgICAgICAgICh0b2tlbi5sZW5ndGggPT09IDQgfHwgL1xccy8udGVzdCh0b2tlbls0XSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHBvc2l0aW9uICs9IHNraXBVbnRpbChidWZmZXIsIHBvc2l0aW9uLCB0cmFpbGVyQnl0ZXMpO1xuICAgICAgICAgIHRyYWlsZXJzLnB1c2gocG9zaXRpb24pO1xuICAgICAgICAgIHBvc2l0aW9uICs9IHNraXBVbnRpbChidWZmZXIsIHBvc2l0aW9uLCBzdGFydHhyZWZCeXRlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoKG0gPSBvYmpSZWdFeHAuZXhlYyh0b2tlbikpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gbVsxXSB8IDAsXG4gICAgICAgICAgICBnZW4gPSBtWzJdIHwgMDtcbiAgICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tudW1dIHx8IHRoaXMuZW50cmllc1tudW1dLmdlbiA9PT0gZ2VuKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNbbnVtXSA9IHtcbiAgICAgICAgICAgICAgb2Zmc2V0OiBwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCxcbiAgICAgICAgICAgICAgZ2VuLFxuICAgICAgICAgICAgICB1bmNvbXByZXNzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIHN0YXJ0UG9zID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGg7XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IFwib2JqXCIgc3RyaW5nLCByYXRoZXIgdGhhbiBcImVuZG9ialwiLCB0byBlbnN1cmUgdGhhdFxuICAgICAgICAgIC8vIHdlIHdvbid0IHNraXAgb3ZlciBhIG5ldyAnb2JqJyBvcGVyYXRvciBpbiBjb3JydXB0IGZpbGVzIHdoZXJlXG4gICAgICAgICAgLy8gJ2VuZG9iaicgb3BlcmF0b3JzIGFyZSBtaXNzaW5nIChmaXhlcyBpc3N1ZTkxMDVfcmVkdWNlZC5wZGYpLlxuICAgICAgICAgIHdoaWxlIChzdGFydFBvcyA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvcyA9IHN0YXJ0UG9zICsgc2tpcFVudGlsKGJ1ZmZlciwgc3RhcnRQb3MsIG9iakJ5dGVzKSArIDQ7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZW5kUG9zIC0gcG9zaXRpb247XG5cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrUG9zID0gTWF0aC5tYXgoZW5kUG9zIC0gQ0hFQ0tfQ09OVEVOVF9MRU5HVEgsIHN0YXJ0UG9zKTtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuU3RyID0gYnl0ZXNUb1N0cmluZyhidWZmZXIuc3ViYXJyYXkoY2hlY2tQb3MsIGVuZFBvcykpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBvYmplY3QgZW5kcyB3aXRoIGFuICdlbmRvYmonIG9wZXJhdG9yLlxuICAgICAgICAgICAgaWYgKGVuZG9ialJlZ0V4cC50ZXN0KHRva2VuU3RyKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuIFwib2JqXCIgb2NjdXJyZW5jZSBpcyBhY3R1YWxseSBhIG5ldyBvYmplY3QsXG4gICAgICAgICAgICAgIC8vIGkuZS4gdGhlIGN1cnJlbnQgb2JqZWN0IGlzIG1pc3NpbmcgdGhlICdlbmRvYmonIG9wZXJhdG9yLlxuICAgICAgICAgICAgICBjb25zdCBvYmpUb2tlbiA9IG5lc3RlZE9ialJlZ0V4cC5leGVjKHRva2VuU3RyKTtcblxuICAgICAgICAgICAgICBpZiAob2JqVG9rZW4gJiYgb2JqVG9rZW5bMV0pIHtcbiAgICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICAgJ2luZGV4T2JqZWN0czogRm91bmQgbmV3IFwib2JqXCIgaW5zaWRlIG9mIGFub3RoZXIgXCJvYmpcIiwgJyArXG4gICAgICAgICAgICAgICAgICAgICdjYXVzZWQgYnkgbWlzc2luZyBcImVuZG9ialwiIC0tIHRyeWluZyB0byByZWNvdmVyLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggLT0gb2JqVG9rZW5bMV0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydFBvcyA9IGVuZFBvcztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGJ1ZmZlci5zdWJhcnJheShwb3NpdGlvbiwgcG9zaXRpb24gKyBjb250ZW50TGVuZ3RoKTtcblxuICAgICAgICAgIC8vIGNoZWNraW5nIFhSZWYgc3RyZWFtIHN1c3BlY3RcbiAgICAgICAgICAvLyAoaXQgc2hhbGwgaGF2ZSAnL1hSZWYnIGFuZCBuZXh0IGNoYXIgaXMgbm90IGEgbGV0dGVyKVxuICAgICAgICAgIHZhciB4cmVmVGFnT2Zmc2V0ID0gc2tpcFVudGlsKGNvbnRlbnQsIDAsIHhyZWZCeXRlcyk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgeHJlZlRhZ09mZnNldCA8IGNvbnRlbnRMZW5ndGggJiZcbiAgICAgICAgICAgIGNvbnRlbnRbeHJlZlRhZ09mZnNldCArIDVdIDwgNjRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHhyZWZTdG1zLnB1c2gocG9zaXRpb24gLSBzdHJlYW0uc3RhcnQpO1xuICAgICAgICAgICAgdGhpcy54cmVmc3Rtc1twb3NpdGlvbiAtIHN0cmVhbS5zdGFydF0gPSAxOyAvLyBBdm9pZCByZWN1cnNpb25cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwb3NpdGlvbiArPSBjb250ZW50TGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRva2VuLnN0YXJ0c1dpdGgoXCJ0cmFpbGVyXCIpICYmXG4gICAgICAgICAgKHRva2VuLmxlbmd0aCA9PT0gNyB8fCAvXFxzLy50ZXN0KHRva2VuWzddKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHN0YXJ0eHJlZkJ5dGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwb3NpdGlvbiArPSB0b2tlbi5sZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyByZWFkaW5nIFhSZWYgc3RyZWFtc1xuICAgICAgdmFyIGksIGlpO1xuICAgICAgZm9yIChpID0gMCwgaWkgPSB4cmVmU3Rtcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaCh4cmVmU3Rtc1tpXSk7XG4gICAgICAgIHRoaXMucmVhZFhSZWYoLyogcmVjb3ZlcnlNb2RlICovIHRydWUpO1xuICAgICAgfVxuICAgICAgLy8gZmluZGluZyBtYWluIHRyYWlsZXJcbiAgICAgIGxldCB0cmFpbGVyRGljdDtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gdHJhaWxlcnMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICBzdHJlYW0ucG9zID0gdHJhaWxlcnNbaV07XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoe1xuICAgICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSxcbiAgICAgICAgICB4cmVmOiB0aGlzLFxuICAgICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSxcbiAgICAgICAgICByZWNvdmVyeU1vZGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgb2JqID0gcGFyc2VyLmdldE9iaigpO1xuICAgICAgICBpZiAoIWlzQ21kKG9iaiwgXCJ0cmFpbGVyXCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZCB0aGUgdHJhaWxlciBkaWN0aW9uYXJ5XG4gICAgICAgIGNvbnN0IGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7XG4gICAgICAgIGlmICghaXNEaWN0KGRpY3QpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gc29tZSBiYXNpYyB2YWxpZGF0aW9uIG9mIHRoZSB0cmFpbGVyL3Jvb3QgZGljdGlvbmFyeSBjYW5kaWRhdGUuXG4gICAgICAgIGxldCByb290RGljdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByb290RGljdCA9IGRpY3QuZ2V0KFwiUm9vdFwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEaWN0KHJvb3REaWN0KSB8fCAhcm9vdERpY3QuaGFzKFwiUGFnZXNcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0YWtpbmcgdGhlIGZpcnN0IG9uZSB3aXRoICdJRCdcbiAgICAgICAgaWYgKGRpY3QuaGFzKFwiSURcIikpIHtcbiAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgY3VycmVudCBkaWN0aW9uYXJ5IGlzIGEgY2FuZGlkYXRlLCBidXQgY29udGludWUgc2VhcmNoaW5nLlxuICAgICAgICB0cmFpbGVyRGljdCA9IGRpY3Q7XG4gICAgICB9XG4gICAgICAvLyBObyB0cmFpbGVyIHdpdGggJ0lEJywgdGFraW5nIGxhc3Qgb25lIChpZiBleGlzdHMpLlxuICAgICAgaWYgKHRyYWlsZXJEaWN0KSB7XG4gICAgICAgIHJldHVybiB0cmFpbGVyRGljdDtcbiAgICAgIH1cbiAgICAgIC8vIG5vdGhpbmcgaGVscHNcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKFwiSW52YWxpZCBQREYgc3RydWN0dXJlLlwiKTtcbiAgICB9LFxuXG4gICAgcmVhZFhSZWY6IGZ1bmN0aW9uIFhSZWZfcmVhZFhSZWYocmVjb3ZlcnlNb2RlKSB7XG4gICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIGFscmVhZHkgcGFyc2VkIFhSZWYgdGFibGVzLCB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3BcbiAgICAgIC8vIHdoZW4gcGFyc2luZyBjb3JydXB0IFBERiBmaWxlcyB3aGVyZSBlLmcuIHRoZSAvUHJldiBlbnRyaWVzIGNyZWF0ZSBhXG4gICAgICAvLyBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGFibGVzIChmaXhlcyBidWcxMzkzNDc2LnBkZikuXG4gICAgICBjb25zdCBzdGFydFhSZWZQYXJzZWRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YXJ0WFJlZlF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBzdGFydFhSZWYgPSB0aGlzLnN0YXJ0WFJlZlF1ZXVlWzBdO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0WFJlZlBhcnNlZENhY2hlW3N0YXJ0WFJlZl0pIHtcbiAgICAgICAgICAgIHdhcm4oXCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLlwiKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFydFhSZWZQYXJzZWRDYWNoZVtzdGFydFhSZWZdID0gdHJ1ZTtcblxuICAgICAgICAgIHN0cmVhbS5wb3MgPSBzdGFydFhSZWYgKyBzdHJlYW0uc3RhcnQ7XG5cbiAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcbiAgICAgICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSxcbiAgICAgICAgICAgIHhyZWY6IHRoaXMsXG4gICAgICAgICAgICBhbGxvd1N0cmVhbXM6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIG9iaiA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgICAgICB2YXIgZGljdDtcblxuICAgICAgICAgIC8vIEdldCBkaWN0aW9uYXJ5XG4gICAgICAgICAgaWYgKGlzQ21kKG9iaiwgXCJ4cmVmXCIpKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSBlbmQtb2YtZmlsZSBYUmVmXG4gICAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlRhYmxlKHBhcnNlcik7XG4gICAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkge1xuICAgICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBnZXQgb3RoZXIgWFJlZnMgJ1hSZWZTdG0nLCBpZiBhbnlcbiAgICAgICAgICAgIG9iaiA9IGRpY3QuZ2V0KFwiWFJlZlN0bVwiKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHtcbiAgICAgICAgICAgICAgdmFyIHBvcyA9IG9iajtcbiAgICAgICAgICAgICAgLy8gaWdub3JlIHByZXZpb3VzbHkgbG9hZGVkIHhyZWYgc3RyZWFtc1xuICAgICAgICAgICAgICAvLyAocG9zc2libGUgaW5maW5pdGUgcmVjdXJzaW9uKVxuICAgICAgICAgICAgICBpZiAoIShwb3MgaW4gdGhpcy54cmVmc3RtcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnhyZWZzdG1zW3Bvc10gPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChwb3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGluLXN0cmVhbSBYUmVmXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlci5nZXRPYmooKSkgfHxcbiAgICAgICAgICAgICAgIWlzQ21kKHBhcnNlci5nZXRPYmooKSwgXCJvYmpcIikgfHxcbiAgICAgICAgICAgICAgIWlzU3RyZWFtKChvYmogPSBwYXJzZXIuZ2V0T2JqKCkpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkludmFsaWQgWFJlZiBzdHJlYW1cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlN0cmVhbShvYmopO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRvcERpY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy50b3BEaWN0ID0gZGljdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGljdCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJGYWlsZWQgdG8gcmVhZCBYUmVmIHN0cmVhbVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBYUmVmIHN0cmVhbSBoZWFkZXJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZ2V0IHByZXZpb3VzIGRpY3Rpb25hcnksIGlmIGFueVxuICAgICAgICAgIG9iaiA9IGRpY3QuZ2V0KFwiUHJldlwiKTtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVmKG9iaikpIHtcbiAgICAgICAgICAgIC8vIFRoZSBzcGVjIHNheXMgUHJldiBtdXN0IG5vdCBiZSBhIHJlZmVyZW5jZSwgaS5lLiBcIi9QcmV2IE5OTlwiXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgZmFsbGJhY2sgZm9yIG5vbi1jb21wbGlhbnQgUERGcywgaS5lLiBcIi9QcmV2IE5OTiAwIFJcIlxuICAgICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKG9iai5udW0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRvcERpY3Q7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8oXCIod2hpbGUgcmVhZGluZyBYUmVmKTogXCIgKyBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY292ZXJ5TW9kZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpO1xuICAgIH0sXG5cbiAgICBnZXRFbnRyeTogZnVuY3Rpb24gWFJlZl9nZXRFbnRyeShpKSB7XG4gICAgICB2YXIgeHJlZkVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldO1xuICAgICAgaWYgKHhyZWZFbnRyeSAmJiAheHJlZkVudHJ5LmZyZWUgJiYgeHJlZkVudHJ5Lm9mZnNldCkge1xuICAgICAgICByZXR1cm4geHJlZkVudHJ5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIGZldGNoSWZSZWY6IGZ1bmN0aW9uIFhSZWZfZmV0Y2hJZlJlZihvYmosIHN1cHByZXNzRW5jcnlwdGlvbikge1xuICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChvYmosIHN1cHByZXNzRW5jcnlwdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICBmZXRjaDogZnVuY3Rpb24gWFJlZl9mZXRjaChyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikge1xuICAgICAgaWYgKCEocmVmIGluc3RhbmNlb2YgUmVmKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG51bSA9IHJlZi5udW07XG5cbiAgICAgIC8vIFRoZSBYUmVmIGNhY2hlIGlzIHBvcHVsYXRlZCB3aXRoIG9iamVjdHMgd2hpY2ggYXJlIG9idGFpbmVkIHRocm91Z2hcbiAgICAgIC8vIGBQYXJzZXIuZ2V0T2JqYCwgYW5kIGluZGlyZWN0bHkgdmlhIGBMZXhlci5nZXRPYmpgLiBOZWl0aGVyIG9mIHRoZXNlXG4gICAgICAvLyBtZXRob2RzIHNob3VsZCBldmVyIHJldHVybiBgdW5kZWZpbmVkYCAobm90ZSB0aGUgYGFzc2VydGAgY2FsbHMgYmVsb3cpLlxuICAgICAgY29uc3QgY2FjaGVFbnRyeSA9IHRoaXMuX2NhY2hlTWFwLmdldChudW0pO1xuICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBJbiBkb2N1bWVudHMgd2l0aCBPYmplY3QgU3RyZWFtcywgaXQncyBwb3NzaWJsZSB0aGF0IGNhY2hlZCBgRGljdGBzXG4gICAgICAgIC8vIGhhdmUgbm90IGJlZW4gYXNzaWduZWQgYW4gYG9iaklkYCB5ZXQgKHNlZSBlLmcuIGlzc3VlMzExNXIucGRmKS5cbiAgICAgICAgaWYgKGNhY2hlRW50cnkgaW5zdGFuY2VvZiBEaWN0ICYmICFjYWNoZUVudHJ5Lm9iaklkKSB7XG4gICAgICAgICAgY2FjaGVFbnRyeS5vYmpJZCA9IHJlZi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZUVudHJ5O1xuICAgICAgfVxuICAgICAgbGV0IHhyZWZFbnRyeSA9IHRoaXMuZ2V0RW50cnkobnVtKTtcblxuICAgICAgaWYgKHhyZWZFbnRyeSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgcmVmZXJlbmNlZCBlbnRyeSBjYW4gYmUgZnJlZS5cbiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgeHJlZkVudHJ5KTtcbiAgICAgICAgcmV0dXJuIHhyZWZFbnRyeTtcbiAgICAgIH1cblxuICAgICAgaWYgKHhyZWZFbnRyeS51bmNvbXByZXNzZWQpIHtcbiAgICAgICAgeHJlZkVudHJ5ID0gdGhpcy5mZXRjaFVuY29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhyZWZFbnRyeSA9IHRoaXMuZmV0Y2hDb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGljdCh4cmVmRW50cnkpKSB7XG4gICAgICAgIHhyZWZFbnRyeS5vYmpJZCA9IHJlZi50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChpc1N0cmVhbSh4cmVmRW50cnkpKSB7XG4gICAgICAgIHhyZWZFbnRyeS5kaWN0Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geHJlZkVudHJ5O1xuICAgIH0sXG5cbiAgICBmZXRjaFVuY29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHtcbiAgICAgIHZhciBnZW4gPSByZWYuZ2VuO1xuICAgICAgdmFyIG51bSA9IHJlZi5udW07XG4gICAgICBpZiAoeHJlZkVudHJ5LmdlbiAhPT0gZ2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEluY29uc2lzdGVudCBnZW5lcmF0aW9uIGluIFhSZWY6ICR7cmVmfWApO1xuICAgICAgfVxuICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0oXG4gICAgICAgIHhyZWZFbnRyeS5vZmZzZXQgKyB0aGlzLnN0cmVhbS5zdGFydFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoe1xuICAgICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksXG4gICAgICAgIHhyZWY6IHRoaXMsXG4gICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdmFyIG9iajEgPSBwYXJzZXIuZ2V0T2JqKCk7XG4gICAgICB2YXIgb2JqMiA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgIHZhciBvYmozID0gcGFyc2VyLmdldE9iaigpO1xuXG4gICAgICBpZiAob2JqMSAhPT0gbnVtIHx8IG9iajIgIT09IGdlbiB8fCAhKG9iajMgaW5zdGFuY2VvZiBDbWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChvYmozLmNtZCAhPT0gXCJvYmpcIikge1xuICAgICAgICAvLyBzb21lIGJhZCBQREZzIHVzZSBcIm9iajEyMzRcIiBhbmQgcmVhbGx5IG1lYW4gMTIzNFxuICAgICAgICBpZiAob2JqMy5jbWQuc3RhcnRzV2l0aChcIm9ialwiKSkge1xuICAgICAgICAgIG51bSA9IHBhcnNlSW50KG9iajMuY21kLnN1YnN0cmluZygzKSwgMTApO1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVuY3J5cHQgJiYgIXN1cHByZXNzRW5jcnlwdGlvbikge1xuICAgICAgICB4cmVmRW50cnkgPSBwYXJzZXIuZ2V0T2JqKHRoaXMuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhyZWZFbnRyeSA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTdHJlYW0oeHJlZkVudHJ5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgeHJlZkVudHJ5ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAnZmV0Y2hVbmNvbXByZXNzZWQ6IFRoZSBcInhyZWZFbnRyeVwiIGNhbm5vdCBiZSB1bmRlZmluZWQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgeHJlZkVudHJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4cmVmRW50cnk7XG4gICAgfSxcblxuICAgIGZldGNoQ29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHRhYmxlT2Zmc2V0ID0geHJlZkVudHJ5Lm9mZnNldDtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuZmV0Y2goUmVmLmdldCh0YWJsZU9mZnNldCwgMCkpO1xuICAgICAgaWYgKCFpc1N0cmVhbShzdHJlYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcImJhZCBPYmpTdG0gc3RyZWFtXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3QgPSBzdHJlYW0uZGljdC5nZXQoXCJGaXJzdFwiKTtcbiAgICAgIGNvbnN0IG4gPSBzdHJlYW0uZGljdC5nZXQoXCJOXCIpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgXCJpbnZhbGlkIGZpcnN0IGFuZCBuIHBhcmFtZXRlcnMgZm9yIE9ialN0bSBzdHJlYW1cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XG4gICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSxcbiAgICAgICAgeHJlZjogdGhpcyxcbiAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBudW1zID0gbmV3IEFycmF5KG4pO1xuICAgICAgLy8gcmVhZCB0aGUgb2JqZWN0IG51bWJlcnMgdG8gcG9wdWxhdGUgY2FjaGVcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlci5nZXRPYmooKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICBgaW52YWxpZCBvYmplY3QgbnVtYmVyIGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke251bX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvZmZzZXQgPSBwYXJzZXIuZ2V0T2JqKCk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvZmZzZXQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgYGludmFsaWQgb2JqZWN0IG9mZnNldCBpbiB0aGUgT2JqU3RtIHN0cmVhbTogJHtvZmZzZXR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbnVtc1tpXSA9IG51bTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgQXJyYXkobik7XG4gICAgICAvLyByZWFkIHN0cmVhbSBvYmplY3RzIGZvciBjYWNoZVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gcGFyc2VyLmdldE9iaigpO1xuICAgICAgICBlbnRyaWVzW2ldID0gb2JqO1xuICAgICAgICAvLyBUaGUgT2JqU3RtIHNob3VsZCBub3QgY29udGFpbiAnZW5kb2JqJy4gSWYgaXQncyBwcmVzZW50LCBza2lwIG92ZXIgaXRcbiAgICAgICAgLy8gdG8gc3VwcG9ydCBjb3JydXB0IFBERnMgKGZpeGVzIGlzc3VlIDUyNDEsIGJ1ZyA4OTg2MTAsIGJ1ZyAxMDM3ODE2KS5cbiAgICAgICAgaWYgKHBhcnNlci5idWYxIGluc3RhbmNlb2YgQ21kICYmIHBhcnNlci5idWYxLmNtZCA9PT0gXCJlbmRvYmpcIikge1xuICAgICAgICAgIHBhcnNlci5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cmVhbShvYmopKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbnVtID0gbnVtc1tpXSxcbiAgICAgICAgICBlbnRyeSA9IHRoaXMuZW50cmllc1tudW1dO1xuICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkub2Zmc2V0ID09PSB0YWJsZU9mZnNldCAmJiBlbnRyeS5nZW4gPT09IGkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIG9iaiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAnZmV0Y2hDb21wcmVzc2VkOiBUaGUgXCJvYmpcIiBjYW5ub3QgYmUgdW5kZWZpbmVkLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIG9iaik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHhyZWZFbnRyeSA9IGVudHJpZXNbeHJlZkVudHJ5Lmdlbl07XG4gICAgICBpZiAoeHJlZkVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFhSZWZFbnRyeUV4Y2VwdGlvbihgQmFkIChjb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4cmVmRW50cnk7XG4gICAgfSxcblxuICAgIGFzeW5jIGZldGNoSWZSZWZBc3luYyhvYmosIHN1cHByZXNzRW5jcnlwdGlvbikge1xuICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEFzeW5jKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcblxuICAgIGFzeW5jIGZldGNoQXN5bmMocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pKSB7XG4gICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLnJlcXVlc3RSYW5nZShleC5iZWdpbiwgZXguZW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hBc3luYyhyZWYsIHN1cHByZXNzRW5jcnlwdGlvbik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldENhdGFsb2dPYmo6IGZ1bmN0aW9uIFhSZWZfZ2V0Q2F0YWxvZ09iaigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gWFJlZjtcbn0pKCk7XG5cbi8qKlxuICogQSBOYW1lVHJlZS9OdW1iZXJUcmVlIGlzIGxpa2UgYSBEaWN0IGJ1dCBoYXMgc29tZSBhZHZhbnRhZ2VvdXMgcHJvcGVydGllcyxcbiAqIHNlZSB0aGUgc3BlY2lmaWNhdGlvbiAoNy45LjYgYW5kIDcuOS43KSBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxuICogVE9ETzogaW1wbGVtZW50IGFsbCB0aGUgRGljdCBmdW5jdGlvbnMgYW5kIG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudC5cbiAqL1xuY2xhc3MgTmFtZU9yTnVtYmVyVHJlZSB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYsIHR5cGUpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gTmFtZU9yTnVtYmVyVHJlZSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBOYW1lT3JOdW1iZXJUcmVlLlwiKTtcbiAgICB9XG4gICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICB0aGlzLnhyZWYgPSB4cmVmO1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgZ2V0QWxsKCkge1xuICAgIGNvbnN0IGRpY3QgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICByZXR1cm4gZGljdDtcbiAgICB9XG4gICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjtcbiAgICAvLyBSZWFkaW5nIE5hbWUvTnVtYmVyIHRyZWUuXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldCgpO1xuICAgIHByb2Nlc3NlZC5wdXQodGhpcy5yb290KTtcbiAgICBjb25zdCBxdWV1ZSA9IFt0aGlzLnJvb3RdO1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvYmogPSB4cmVmLmZldGNoSWZSZWYocXVldWUuc2hpZnQoKSk7XG4gICAgICBpZiAoIWlzRGljdChvYmopKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5oYXMoXCJLaWRzXCIpKSB7XG4gICAgICAgIGNvbnN0IGtpZHMgPSBvYmouZ2V0KFwiS2lkc1wiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0ga2lkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qga2lkID0ga2lkc1tpXTtcbiAgICAgICAgICBpZiAocHJvY2Vzc2VkLmhhcyhraWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYER1cGxpY2F0ZSBlbnRyeSBpbiBcIiR7dGhpcy5fdHlwZX1cIiB0cmVlLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxdWV1ZS5wdXNoKGtpZCk7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1dChraWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZW50cmllcyA9IG9iai5nZXQodGhpcy5fdHlwZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBkaWN0W3hyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW2ldKV0gPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tpICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWN0O1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjtcbiAgICBsZXQga2lkc09yRW50cmllcyA9IHhyZWYuZmV0Y2hJZlJlZih0aGlzLnJvb3QpO1xuICAgIGxldCBsb29wQ291bnQgPSAwO1xuICAgIGNvbnN0IE1BWF9MRVZFTFMgPSAxMDtcblxuICAgIC8vIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIHRvIHF1aWNrbHkgZmluZCB0aGUgZW50cnkgdGhhdFxuICAgIC8vIGNvbnRhaW5zIHRoZSBrZXkgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgIHdoaWxlIChraWRzT3JFbnRyaWVzLmhhcyhcIktpZHNcIikpIHtcbiAgICAgIGlmICgrK2xvb3BDb3VudCA+IE1BWF9MRVZFTFMpIHtcbiAgICAgICAgd2FybihgU2VhcmNoIGRlcHRoIGxpbWl0IHJlYWNoZWQgZm9yIFwiJHt0aGlzLl90eXBlfVwiIHRyZWUuYCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBraWRzID0ga2lkc09yRW50cmllcy5nZXQoXCJLaWRzXCIpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBsZXQgbCA9IDAsXG4gICAgICAgIHIgPSBraWRzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAobCA8PSByKSB7XG4gICAgICAgIGNvbnN0IG0gPSAobCArIHIpID4+IDE7XG4gICAgICAgIGNvbnN0IGtpZCA9IHhyZWYuZmV0Y2hJZlJlZihraWRzW21dKTtcbiAgICAgICAgY29uc3QgbGltaXRzID0ga2lkLmdldChcIkxpbWl0c1wiKTtcblxuICAgICAgICBpZiAoa2V5IDwgeHJlZi5mZXRjaElmUmVmKGxpbWl0c1swXSkpIHtcbiAgICAgICAgICByID0gbSAtIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID4geHJlZi5mZXRjaElmUmVmKGxpbWl0c1sxXSkpIHtcbiAgICAgICAgICBsID0gbSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2lkc09yRW50cmllcyA9IHhyZWYuZmV0Y2hJZlJlZihraWRzW21dKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGwgPiByKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGdldCBoZXJlLCB0aGVuIHdlIGhhdmUgZm91bmQgdGhlIHJpZ2h0IGVudHJ5LiBOb3cgZ28gdGhyb3VnaCB0aGVcbiAgICAvLyBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5IHVudGlsIHdlIGZpbmQgdGhlIGtleSB3ZSdyZSBsb29raW5nIGZvci5cbiAgICBjb25zdCBlbnRyaWVzID0ga2lkc09yRW50cmllcy5nZXQodGhpcy5fdHlwZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cmllcykpIHtcbiAgICAgIC8vIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIHRvIHJlZHVjZSB0aGUgbG9va3VwIHRpbWUuXG4gICAgICBsZXQgbCA9IDAsXG4gICAgICAgIHIgPSBlbnRyaWVzLmxlbmd0aCAtIDI7XG4gICAgICB3aGlsZSAobCA8PSByKSB7XG4gICAgICAgIC8vIENoZWNrIG9ubHkgZXZlbiBpbmRpY2VzICgwLCAyLCA0LCAuLi4pIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIG9kZCBpbmRpY2VzIGNvbnRhaW4gdGhlIGFjdHVhbCBkYXRhLlxuICAgICAgICBjb25zdCB0bXAgPSAobCArIHIpID4+IDEsXG4gICAgICAgICAgbSA9IHRtcCArICh0bXAgJiAxKTtcbiAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW21dKTtcbiAgICAgICAgaWYgKGtleSA8IGN1cnJlbnRLZXkpIHtcbiAgICAgICAgICByID0gbSAtIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID4gY3VycmVudEtleSkge1xuICAgICAgICAgIGwgPSBtICsgMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geHJlZi5mZXRjaElmUmVmKGVudHJpZXNbbSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjayB0byBhbiBleGhhdXN0aXZlIHNlYXJjaCwgaW4gYW4gYXR0ZW1wdCB0byBoYW5kbGUgY29ycnVwdFxuICAgICAgLy8gUERGIGZpbGVzIHdoZXJlIGtleXMgYXJlIG5vdCBjb3JyZWN0bHkgb3JkZXJlZCAoZml4ZXMgaXNzdWUgMTAyNzIpLlxuICAgICAgaW5mbyhcbiAgICAgICAgYEZhbGxpbmcgYmFjayB0byBhbiBleGhhdXN0aXZlIHNlYXJjaCwgZm9yIGtleSBcIiR7a2V5fVwiLCBgICtcbiAgICAgICAgICBgaW4gXCIke3RoaXMuX3R5cGV9XCIgdHJlZS5gXG4gICAgICApO1xuICAgICAgZm9yIChsZXQgbSA9IDAsIG1tID0gZW50cmllcy5sZW5ndGg7IG0gPCBtbTsgbSArPSAyKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttXSk7XG4gICAgICAgIGlmIChjdXJyZW50S2V5ID09PSBrZXkpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYFRoZSBcIiR7a2V5fVwiIGtleSB3YXMgZm91bmQgYXQgYW4gaW5jb3JyZWN0LCBgICtcbiAgICAgICAgICAgICAgYGkuZS4gb3V0LW9mLW9yZGVyLCBwb3NpdGlvbiBpbiBcIiR7dGhpcy5fdHlwZX1cIiB0cmVlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmNsYXNzIE5hbWVUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZSB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYpIHtcbiAgICBzdXBlcihyb290LCB4cmVmLCBcIk5hbWVzXCIpO1xuICB9XG59XG5cbmNsYXNzIE51bWJlclRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVlIHtcbiAgY29uc3RydWN0b3Iocm9vdCwgeHJlZikge1xuICAgIHN1cGVyKHJvb3QsIHhyZWYsIFwiTnVtc1wiKTtcbiAgfVxufVxuXG4vKipcbiAqIFwiQSBQREYgZmlsZSBjYW4gcmVmZXIgdG8gdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgZmlsZSBieSB1c2luZyBhIEZpbGVcbiAqIFNwZWNpZmljYXRpb24gKFBERiAxLjEpXCIsIHNlZSB0aGUgc3BlYyAoNy4xMSkgZm9yIG1vcmUgZGV0YWlscy5cbiAqIE5PVEU6IE9ubHkgZW1iZWRkZWQgZmlsZXMgYXJlIHN1cHBvcnRlZCAoYXMgcGFydCBvZiB0aGUgYXR0YWNobWVudHMgc3VwcG9ydClcbiAqIFRPRE86IHN1cHBvcnQgdGhlICdVUkwnIGZpbGUgc3lzdGVtICh3aXRoIGNhY2hpbmcgaWYgIS9WKSwgcG9ydGFibGVcbiAqIGNvbGxlY3Rpb25zIGF0dHJpYnV0ZXMgYW5kIHJlbGF0ZWQgZmlsZXMgKC9SRilcbiAqL1xudmFyIEZpbGVTcGVjID0gKGZ1bmN0aW9uIEZpbGVTcGVjQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBGaWxlU3BlYyhyb290LCB4cmVmKSB7XG4gICAgaWYgKCFyb290IHx8ICFpc0RpY3Qocm9vdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy54cmVmID0geHJlZjtcbiAgICB0aGlzLnJvb3QgPSByb290O1xuICAgIGlmIChyb290LmhhcyhcIkZTXCIpKSB7XG4gICAgICB0aGlzLmZzID0gcm9vdC5nZXQoXCJGU1wiKTtcbiAgICB9XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHJvb3QuaGFzKFwiRGVzY1wiKVxuICAgICAgPyBzdHJpbmdUb1BERlN0cmluZyhyb290LmdldChcIkRlc2NcIikpXG4gICAgICA6IFwiXCI7XG4gICAgaWYgKHJvb3QuaGFzKFwiUkZcIikpIHtcbiAgICAgIHdhcm4oXCJSZWxhdGVkIGZpbGUgc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IHRydWU7XG4gICAgaWYgKCFyb290LmhhcyhcIkVGXCIpKSB7XG4gICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSBmYWxzZTtcbiAgICAgIHdhcm4oXCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwaWNrUGxhdGZvcm1JdGVtKGRpY3QpIHtcbiAgICAvLyBMb29rIGZvciB0aGUgZmlsZW5hbWUgaW4gdGhpcyBvcmRlcjpcbiAgICAvLyBVRiwgRiwgVW5peCwgTWFjLCBET1NcbiAgICBpZiAoZGljdC5oYXMoXCJVRlwiKSkge1xuICAgICAgcmV0dXJuIGRpY3QuZ2V0KFwiVUZcIik7XG4gICAgfSBlbHNlIGlmIChkaWN0LmhhcyhcIkZcIikpIHtcbiAgICAgIHJldHVybiBkaWN0LmdldChcIkZcIik7XG4gICAgfSBlbHNlIGlmIChkaWN0LmhhcyhcIlVuaXhcIikpIHtcbiAgICAgIHJldHVybiBkaWN0LmdldChcIlVuaXhcIik7XG4gICAgfSBlbHNlIGlmIChkaWN0LmhhcyhcIk1hY1wiKSkge1xuICAgICAgcmV0dXJuIGRpY3QuZ2V0KFwiTWFjXCIpO1xuICAgIH0gZWxzZSBpZiAoZGljdC5oYXMoXCJET1NcIikpIHtcbiAgICAgIHJldHVybiBkaWN0LmdldChcIkRPU1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBGaWxlU3BlYy5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IGZpbGVuYW1lKCkge1xuICAgICAgaWYgKCF0aGlzLl9maWxlbmFtZSAmJiB0aGlzLnJvb3QpIHtcbiAgICAgICAgdmFyIGZpbGVuYW1lID0gcGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QpIHx8IFwidW5uYW1lZFwiO1xuICAgICAgICB0aGlzLl9maWxlbmFtZSA9IHN0cmluZ1RvUERGU3RyaW5nKGZpbGVuYW1lKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXFxcXC9nLCBcIlxcXFxcIilcbiAgICAgICAgICAucmVwbGFjZSgvXFxcXFxcLy9nLCBcIi9cIilcbiAgICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgfSxcbiAgICBnZXQgY29udGVudCgpIHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50QXZhaWxhYmxlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRSZWYgJiYgdGhpcy5yb290KSB7XG4gICAgICAgIHRoaXMuY29udGVudFJlZiA9IHBpY2tQbGF0Zm9ybUl0ZW0odGhpcy5yb290LmdldChcIkVGXCIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjb250ZW50ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWYpIHtcbiAgICAgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7XG4gICAgICAgIHZhciBmaWxlT2JqID0geHJlZi5mZXRjaElmUmVmKHRoaXMuY29udGVudFJlZik7XG4gICAgICAgIGlmIChmaWxlT2JqICYmIGlzU3RyZWFtKGZpbGVPYmopKSB7XG4gICAgICAgICAgY29udGVudCA9IGZpbGVPYmouZ2V0Qnl0ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gcG9pbnRzIHRvIG5vbi1leGlzdGluZy9pbnZhbGlkIFwiICtcbiAgICAgICAgICAgICAgXCJjb250ZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFwiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSxcbiAgICBnZXQgc2VyaWFsaXphYmxlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIEZpbGVTcGVjO1xufSkoKTtcblxuLyoqXG4gKiBBIGhlbHBlciBmb3IgbG9hZGluZyBtaXNzaW5nIGRhdGEgaW4gYERpY3RgIGdyYXBocy4gSXQgdHJhdmVyc2VzIHRoZSBncmFwaFxuICogZGVwdGggZmlyc3QgYW5kIHF1ZXVlcyB1cCBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgbWlzc2luZyBkYXRhLiBPbmNlIGl0IGhhc1xuICogaGFzIHRyYXZlcnNlZCBhcyBtYW55IG9iamVjdHMgdGhhdCBhcmUgYXZhaWxhYmxlIGl0IGF0dGVtcHRzIHRvIGJ1bmRsZSB0aGVcbiAqIG1pc3NpbmcgZGF0YSByZXF1ZXN0cyBhbmQgdGhlbiByZXN1bWUgZnJvbSB0aGUgbm9kZXMgdGhhdCB3ZXJlbid0IHJlYWR5LlxuICpcbiAqIE5PVEU6IEl0IHByb3ZpZGVzIHByb3RlY3Rpb24gZnJvbSBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGtlZXBpbmcgdHJhY2sgb2ZcbiAqIGxvYWRlZCByZWZlcmVuY2VzLiBIb3dldmVyLCB5b3UgbXVzdCBiZSBjYXJlZnVsIG5vdCB0byBsb2FkIGFueSBncmFwaHNcbiAqIHRoYXQgaGF2ZSByZWZlcmVuY2VzIHRvIHRoZSBjYXRhbG9nIG9yIG90aGVyIHBhZ2VzIHNpbmNlIHRoYXQgd2lsbCBjYXVzZSB0aGVcbiAqIGVudGlyZSBQREYgZG9jdW1lbnQgb2JqZWN0IGdyYXBoIHRvIGJlIHRyYXZlcnNlZC5cbiAqL1xuY29uc3QgT2JqZWN0TG9hZGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gbWF5SGF2ZUNoaWxkcmVuKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgUmVmIHx8XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIERpY3QgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8XG4gICAgICBpc1N0cmVhbSh2YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkQ2hpbGRyZW4obm9kZSwgbm9kZXNUb1Zpc2l0KSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBEaWN0KSB7XG4gICAgICBub2RlID0gbm9kZS5nZXRSYXdWYWx1ZXMoKTtcbiAgICB9IGVsc2UgaWYgKGlzU3RyZWFtKG5vZGUpKSB7XG4gICAgICBub2RlID0gbm9kZS5kaWN0LmdldFJhd1ZhbHVlcygpO1xuICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCByYXdWYWx1ZSBvZiBub2RlKSB7XG4gICAgICBpZiAobWF5SGF2ZUNoaWxkcmVuKHJhd1ZhbHVlKSkge1xuICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChyYXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBPYmplY3RMb2FkZXIoZGljdCwga2V5cywgeHJlZikge1xuICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgdGhpcy5rZXlzID0ga2V5cztcbiAgICB0aGlzLnhyZWYgPSB4cmVmO1xuICAgIHRoaXMucmVmU2V0ID0gbnVsbDtcbiAgfVxuXG4gIE9iamVjdExvYWRlci5wcm90b3R5cGUgPSB7XG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgIC8vIERvbid0IHdhbGsgdGhlIGdyYXBoIGlmIGFsbCB0aGUgZGF0YSBpcyBhbHJlYWR5IGxvYWRlZDsgbm90ZSB0aGF0IG9ubHlcbiAgICAgIC8vIGBDaHVua2VkU3RyZWFtYCBpbnN0YW5jZXMgaGF2ZSBhIGBhbGxDaHVua3NMb2FkZWRgIG1ldGhvZC5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMueHJlZi5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkIHx8XG4gICAgICAgIHRoaXMueHJlZi5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkKClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGtleXMsIGRpY3QgfSA9IHRoaXM7XG4gICAgICB0aGlzLnJlZlNldCA9IG5ldyBSZWZTZXQoKTtcbiAgICAgIC8vIFNldHVwIHRoZSBpbml0aWFsIG5vZGVzIHRvIHZpc2l0LlxuICAgICAgY29uc3Qgbm9kZXNUb1Zpc2l0ID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBrZXlzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBkaWN0LmdldFJhdyhrZXlzW2ldKTtcbiAgICAgICAgLy8gU2tpcCBub2RlcyB0aGF0IGFyZSBndWFyYW50ZWVkIHRvIGJlIGVtcHR5LlxuICAgICAgICBpZiAocmF3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKHJhd1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3dhbGsobm9kZXNUb1Zpc2l0KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgX3dhbGsobm9kZXNUb1Zpc2l0KSB7XG4gICAgICBjb25zdCBub2Rlc1RvUmV2aXNpdCA9IFtdO1xuICAgICAgY29uc3QgcGVuZGluZ1JlcXVlc3RzID0gW107XG4gICAgICAvLyBERlMgd2FsayBvZiB0aGUgb2JqZWN0IGdyYXBoLlxuICAgICAgd2hpbGUgKG5vZGVzVG9WaXNpdC5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpO1xuXG4gICAgICAgIC8vIE9ubHkgcmVmZXJlbmNlcyBvciBjaHVua2VkIHN0cmVhbXMgY2FuIGNhdXNlIG1pc3NpbmcgZGF0YSBleGNlcHRpb25zLlxuICAgICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgICAgICAvLyBTa2lwIG5vZGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gdmlzaXRlZC5cbiAgICAgICAgICBpZiAodGhpcy5yZWZTZXQuaGFzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlZlNldC5wdXQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0aGlzLnhyZWYuZmV0Y2goY3VycmVudE5vZGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkge1xuICAgICAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVzVG9SZXZpc2l0LnB1c2goY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RzLnB1c2goeyBiZWdpbjogZXguYmVnaW4sIGVuZDogZXguZW5kIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudE5vZGUgJiYgY3VycmVudE5vZGUuZ2V0QmFzZVN0cmVhbXMpIHtcbiAgICAgICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IGN1cnJlbnROb2RlLmdldEJhc2VTdHJlYW1zKCk7XG4gICAgICAgICAgbGV0IGZvdW5kTWlzc2luZ0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBiYXNlU3RyZWFtcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBiYXNlU3RyZWFtc1tpXTtcbiAgICAgICAgICAgIGlmIChzdHJlYW0uYWxsQ2h1bmtzTG9hZGVkICYmICFzdHJlYW0uYWxsQ2h1bmtzTG9hZGVkKCkpIHtcbiAgICAgICAgICAgICAgZm91bmRNaXNzaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsgYmVnaW46IHN0cmVhbS5zdGFydCwgZW5kOiBzdHJlYW0uZW5kIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZm91bmRNaXNzaW5nRGF0YSkge1xuICAgICAgICAgICAgbm9kZXNUb1JldmlzaXQucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkQ2hpbGRyZW4oY3VycmVudE5vZGUsIG5vZGVzVG9WaXNpdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwZW5kaW5nUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKHBlbmRpbmdSZXF1ZXN0cyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbm9kZXNUb1JldmlzaXQubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1RvUmV2aXNpdFtpXTtcbiAgICAgICAgICAvLyBSZW1vdmUgYW55IHJlZmVyZW5jZSBub2RlcyBmcm9tIHRoZSBjdXJyZW50IGBSZWZTZXRgIHNvIHRoZXlcbiAgICAgICAgICAvLyBhcmVuJ3Qgc2tpcHBlZCB3aGVuIHdlIHJldmlzdCB0aGVtLlxuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgUmVmKSB7XG4gICAgICAgICAgICB0aGlzLnJlZlNldC5yZW1vdmUobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrKG5vZGVzVG9SZXZpc2l0KTtcbiAgICAgIH1cbiAgICAgIC8vIEV2ZXJ5dGhpbmcgaXMgbG9hZGVkLlxuICAgICAgdGhpcy5yZWZTZXQgPSBudWxsO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBPYmplY3RMb2FkZXI7XG59KSgpO1xuXG5leHBvcnQgeyBDYXRhbG9nLCBPYmplY3RMb2FkZXIsIFhSZWYsIEZpbGVTcGVjIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7XG4gIEFzY2lpODVTdHJlYW0sXG4gIEFzY2lpSGV4U3RyZWFtLFxuICBGbGF0ZVN0cmVhbSxcbiAgTFpXU3RyZWFtLFxuICBOdWxsU3RyZWFtLFxuICBQcmVkaWN0b3JTdHJlYW0sXG4gIFJ1bkxlbmd0aFN0cmVhbSxcbn0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGJ5dGVzVG9TdHJpbmcsXG4gIEZvcm1hdEVycm9yLFxuICBpbmZvLFxuICBpc051bSxcbiAgU3RyZWFtVHlwZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBDbWQsXG4gIERpY3QsXG4gIEVPRixcbiAgaXNDbWQsXG4gIGlzRGljdCxcbiAgaXNFT0YsXG4gIGlzTmFtZSxcbiAgTmFtZSxcbiAgUmVmLFxufSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBpc1doaXRlU3BhY2UsIE1pc3NpbmdEYXRhRXhjZXB0aW9uIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgQ0NJVFRGYXhTdHJlYW0gfSBmcm9tIFwiLi9jY2l0dF9zdHJlYW0uanNcIjtcbmltcG9ydCB7IEpiaWcyU3RyZWFtIH0gZnJvbSBcIi4vamJpZzJfc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBKcGVnU3RyZWFtIH0gZnJvbSBcIi4vanBlZ19zdHJlYW0uanNcIjtcbmltcG9ydCB7IEpweFN0cmVhbSB9IGZyb20gXCIuL2pweF9zdHJlYW0uanNcIjtcblxuY29uc3QgTUFYX0xFTkdUSF9UT19DQUNIRSA9IDEwMDA7XG5jb25zdCBNQVhfQURMRVIzMl9MRU5HVEggPSA1NTUyO1xuXG5mdW5jdGlvbiBjb21wdXRlQWRsZXIzMihieXRlcykge1xuICBjb25zdCBieXRlc0xlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgaWYgKFxuICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICkge1xuICAgIGFzc2VydChcbiAgICAgIGJ5dGVzTGVuZ3RoIDwgTUFYX0FETEVSMzJfTEVOR1RILFxuICAgICAgJ2NvbXB1dGVBZGxlcjMyOiBVbnN1cHBvcnRlZCBcImJ5dGVzXCIgbGVuZ3RoLidcbiAgICApO1xuICB9XG4gIGxldCBhID0gMSxcbiAgICBiID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlc0xlbmd0aDsgKytpKSB7XG4gICAgLy8gTm8gbW9kdWxvIHJlcXVpcmVkIGluIHRoZSBsb29wIGlmIGBieXRlc0xlbmd0aCA8IDU1NTJgLlxuICAgIGEgKz0gYnl0ZXNbaV0gJiAweGZmO1xuICAgIGIgKz0gYTtcbiAgfVxuICByZXR1cm4gKGIgJSA2NTUyMSA8PCAxNikgfCBhICUgNjU1MjE7XG59XG5cbmNsYXNzIFBhcnNlciB7XG4gIGNvbnN0cnVjdG9yKHsgbGV4ZXIsIHhyZWYsIGFsbG93U3RyZWFtcyA9IGZhbHNlLCByZWNvdmVyeU1vZGUgPSBmYWxzZSB9KSB7XG4gICAgdGhpcy5sZXhlciA9IGxleGVyO1xuICAgIHRoaXMueHJlZiA9IHhyZWY7XG4gICAgdGhpcy5hbGxvd1N0cmVhbXMgPSBhbGxvd1N0cmVhbXM7XG4gICAgdGhpcy5yZWNvdmVyeU1vZGUgPSByZWNvdmVyeU1vZGU7XG5cbiAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMucmVmaWxsKCk7XG4gIH1cblxuICByZWZpbGwoKSB7XG4gICAgdGhpcy5idWYxID0gdGhpcy5sZXhlci5nZXRPYmooKTtcbiAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpO1xuICB9XG5cbiAgc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMuYnVmMiBpbnN0YW5jZW9mIENtZCAmJiB0aGlzLmJ1ZjIuY21kID09PSBcIklEXCIpIHtcbiAgICAgIHRoaXMuYnVmMSA9IHRoaXMuYnVmMjtcbiAgICAgIHRoaXMuYnVmMiA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmMSA9IHRoaXMuYnVmMjtcbiAgICAgIHRoaXMuYnVmMiA9IHRoaXMubGV4ZXIuZ2V0T2JqKCk7XG4gICAgfVxuICB9XG5cbiAgdHJ5U2hpZnQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIFVwb24gZmFpbHVyZSwgdGhlIGNhbGxlciBzaG91bGQgcmVzZXQgdGhpcy5sZXhlci5wb3MgdG8gYSBrbm93biBnb29kXG4gICAgICAvLyBzdGF0ZSBhbmQgY2FsbCB0aGlzLnNoaWZ0KCkgdHdpY2UgdG8gcmVzZXQgdGhlIGJ1ZmZlcnMuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSA9IG51bGwpIHtcbiAgICBjb25zdCBidWYxID0gdGhpcy5idWYxO1xuICAgIHRoaXMuc2hpZnQoKTtcblxuICAgIGlmIChidWYxIGluc3RhbmNlb2YgQ21kKSB7XG4gICAgICBzd2l0Y2ggKGJ1ZjEuY21kKSB7XG4gICAgICAgIGNhc2UgXCJCSVwiOiAvLyBpbmxpbmUgaW1hZ2VcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlSW5saW5lSW1hZ2UoY2lwaGVyVHJhbnNmb3JtKTtcbiAgICAgICAgY2FzZSBcIltcIjogLy8gYXJyYXlcbiAgICAgICAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgICAgICAgIHdoaWxlICghaXNDbWQodGhpcy5idWYxLCBcIl1cIikgJiYgIWlzRU9GKHRoaXMuYnVmMSkpIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2godGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0VPRih0aGlzLmJ1ZjEpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVjb3ZlcnlNb2RlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkVuZCBvZiBmaWxlIGluc2lkZSBhcnJheVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zaGlmdCgpO1xuICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgY2FzZSBcIjw8XCI6IC8vIGRpY3Rpb25hcnkgb3Igc3RyZWFtXG4gICAgICAgICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KHRoaXMueHJlZik7XG4gICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsIFwiPj5cIikgJiYgIWlzRU9GKHRoaXMuYnVmMSkpIHtcbiAgICAgICAgICAgIGlmICghaXNOYW1lKHRoaXMuYnVmMSkpIHtcbiAgICAgICAgICAgICAgaW5mbyhcIk1hbGZvcm1lZCBkaWN0aW9uYXJ5OiBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0XCIpO1xuICAgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1ZjEubmFtZTtcbiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChpc0VPRih0aGlzLmJ1ZjEpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzRU9GKHRoaXMuYnVmMSkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWNvdmVyeU1vZGUpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiRW5kIG9mIGZpbGUgaW5zaWRlIGRpY3Rpb25hcnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdHJlYW0gb2JqZWN0cyBhcmUgbm90IGFsbG93ZWQgaW5zaWRlIGNvbnRlbnQgc3RyZWFtcyBvclxuICAgICAgICAgIC8vIG9iamVjdCBzdHJlYW1zLlxuICAgICAgICAgIGlmIChpc0NtZCh0aGlzLmJ1ZjIsIFwic3RyZWFtXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxvd1N0cmVhbXNcbiAgICAgICAgICAgICAgPyB0aGlzLm1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKVxuICAgICAgICAgICAgICA6IGRpY3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBzaW1wbGUgb2JqZWN0XG4gICAgICAgICAgcmV0dXJuIGJ1ZjE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIoYnVmMSkpIHtcbiAgICAgIC8vIGluZGlyZWN0IHJlZmVyZW5jZSBvciBpbnRlZ2VyXG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih0aGlzLmJ1ZjEpICYmIGlzQ21kKHRoaXMuYnVmMiwgXCJSXCIpKSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IFJlZi5nZXQoYnVmMSwgdGhpcy5idWYxKTtcbiAgICAgICAgdGhpcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiByZWY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmMTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJ1ZjEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChjaXBoZXJUcmFuc2Zvcm0pIHtcbiAgICAgICAgcmV0dXJuIGNpcGhlclRyYW5zZm9ybS5kZWNyeXB0U3RyaW5nKGJ1ZjEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjE7XG4gICAgfVxuXG4gICAgLy8gc2ltcGxlIG9iamVjdFxuICAgIHJldHVybiBidWYxO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGJ5IHNlYXJjaGluZyBmb3IgdGhlIC9FSVxccy8uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBpbmxpbmUgc3RyZWFtIGxlbmd0aC5cbiAgICovXG4gIGZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSkge1xuICAgIGNvbnN0IEUgPSAweDQ1LFxuICAgICAgSSA9IDB4NDksXG4gICAgICBTUEFDRSA9IDB4MjAsXG4gICAgICBMRiA9IDB4YSxcbiAgICAgIENSID0gMHhkLFxuICAgICAgTlVMID0gMHgwO1xuICAgIGNvbnN0IGxleGVyID0gdGhpcy5sZXhlcixcbiAgICAgIHN0YXJ0UG9zID0gc3RyZWFtLnBvcyxcbiAgICAgIG4gPSAxMDtcbiAgICBsZXQgc3RhdGUgPSAwLFxuICAgICAgY2gsXG4gICAgICBtYXliZUVJUG9zO1xuICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gMCkge1xuICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAxKSB7XG4gICAgICAgIHN0YXRlID0gY2ggPT09IEkgPyAyIDogMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydChzdGF0ZSA9PT0gMiwgXCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCAtIGludmFsaWQgc3RhdGUuXCIpO1xuICAgICAgICBpZiAoY2ggPT09IFNQQUNFIHx8IGNoID09PSBMRiB8fCBjaCA9PT0gQ1IpIHtcbiAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvcztcbiAgICAgICAgICAvLyBMZXQncyBjaGVjayB0aGF0IHRoZSBuZXh0IGBuYCBieXRlcyBhcmUgQVNDSUkuLi4ganVzdCB0byBiZSBzdXJlLlxuICAgICAgICAgIGNvbnN0IGZvbGxvd2luZ0J5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhuKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmb2xsb3dpbmdCeXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBjaCA9IGZvbGxvd2luZ0J5dGVzW2ldO1xuICAgICAgICAgICAgaWYgKGNoID09PSBOVUwgJiYgZm9sbG93aW5nQnl0ZXNbaSArIDFdICE9PSBOVUwpIHtcbiAgICAgICAgICAgICAgLy8gTlVMIGJ5dGVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gb2NjdXIgKm91dHNpZGUqIG9mIGlubGluZVxuICAgICAgICAgICAgICAvLyBpbWFnZXMsIGJ1dCBzb21lIFBERiBnZW5lcmF0b3JzIHZpb2xhdGUgdGhhdCBhc3N1bXB0aW9uLFxuICAgICAgICAgICAgICAvLyB0aHVzIGJyZWFraW5nIHRoZSBFSSBkZXRlY3Rpb24gaGV1cmlzdGljcyB1c2VkIGJlbG93LlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBjYW4ndCB1bmNvbmRpdGlvbmFsbHkgdHJlYXQgTlVMIGJ5dGVzIGFzIFwiQVNDSUlcIixcbiAgICAgICAgICAgICAgLy8gc2luY2UgdGhhdCAqY291bGQqIHJlc3VsdCBpbiBpbmxpbmUgaW1hZ2VzIGJlaW5nIHRydW5jYXRlZC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gVG8gYXR0ZW1wdCB0byBhZGRyZXNzIHRoaXMsIHdlJ2xsIHN0aWxsIHRyZWF0IGFueSAqc2VxdWVuY2UqXG4gICAgICAgICAgICAgIC8vIG9mIE5VTCBieXRlcyBhcyBub24tQVNDSUksIGJ1dCBmb3IgYSAqc2luZ2xlKiBOVUwgYnl0ZSB3ZSdsbFxuICAgICAgICAgICAgICAvLyBjb250aW51ZSBjaGVja2luZyB0aGUgYGZvbGxvd2luZ0J5dGVzYCAoZml4ZXMgaXNzdWU4ODIzLnBkZikuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkge1xuICAgICAgICAgICAgICAvLyBOb3QgYSBMRiwgQ1IsIFNQQUNFIG9yIGFueSB2aXNpYmxlIEFTQ0lJIGNoYXJhY3RlciwgaS5lLlxuICAgICAgICAgICAgICAvLyBpdCdzIGJpbmFyeSBzdHVmZi4gUmVzZXR0aW5nIHRoZSBzdGF0ZS5cbiAgICAgICAgICAgICAgc3RhdGUgPSAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RhdGUgIT09IDIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBcIkVJXCIgc2VxdWVuY2UgaXNuJ3QgcGFydCBvZiB0aGUgaW1hZ2UgZGF0YSwgc2luY2VcbiAgICAgICAgICAvLyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBpbWFnZSB0byBiZSB0cnVuY2F0ZWQgKGZpeGVzIGlzc3VlMTExMjQucGRmKS5cbiAgICAgICAgICBpZiAobGV4ZXIua25vd25Db21tYW5kcykge1xuICAgICAgICAgICAgY29uc3QgbmV4dE9iaiA9IGxleGVyLnBlZWtPYmooKTtcbiAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgQ21kICYmICFsZXhlci5rbm93bkNvbW1hbmRzW25leHRPYmouY21kXSkge1xuICAgICAgICAgICAgICAvLyBOb3QgYSB2YWxpZCBjb21tYW5kLCBpLmUuIHRoZSBpbmxpbmUgaW1hZ2UgZGF0YSAqaXRzZWxmKlxuICAgICAgICAgICAgICAvLyBjb250YWlucyBhbiBcIkVJXCIgc2VxdWVuY2UuIFJlc2V0dGluZyB0aGUgc3RhdGUuXG4gICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgXCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCAtIGBsZXhlci5rbm93bkNvbW1hbmRzYCBpcyB1bmRlZmluZWQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlID09PSAyKSB7XG4gICAgICAgICAgICBicmVhazsgLy8gRmluaXNoZWQhXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaCA9PT0gLTEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6IFwiICtcbiAgICAgICAgICBcIlJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgZmluZGluZyBhIHZhbGlkIEVJIG1hcmtlclwiXG4gICAgICApO1xuICAgICAgaWYgKG1heWJlRUlQb3MpIHtcbiAgICAgICAgd2FybignLi4uIHRyeWluZyB0byByZWNvdmVyIGJ5IHVzaW5nIHRoZSBsYXN0IFwiRUlcIiBvY2N1cnJlbmNlLicpO1xuICAgICAgICBzdHJlYW0uc2tpcCgtKHN0cmVhbS5wb3MgLSBtYXliZUVJUG9zKSk7IC8vIFJlc2V0IHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGVuZE9mZnNldCA9IDQ7XG4gICAgc3RyZWFtLnNraXAoLWVuZE9mZnNldCk7IC8vIFNldCB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIGp1c3QgYmVmb3JlIFwiRUlcIi5cbiAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpO1xuICAgIHN0cmVhbS5za2lwKGVuZE9mZnNldCk7IC8vIC4uLiBhbmQgcmVtZW1iZXIgdG8gcmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbi5cblxuICAgIC8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IGFjY2lkZW50YWxseSB0cnVuY2F0ZSB0aGUgaW5saW5lIGltYWdlLCB3aGVuIHRoZVxuICAgIC8vIGRhdGEgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIFwiRUlcIiBtYXJrZXIgKGZpeGVzIGlzc3VlMTAzODgucGRmKS5cbiAgICBpZiAoIWlzV2hpdGVTcGFjZShjaCkpIHtcbiAgICAgIGVuZE9mZnNldC0tO1xuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtLnBvcyAtIGVuZE9mZnNldCAtIHN0YXJ0UG9zO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIEVPSSAoZW5kLW9mLWltYWdlKSBtYXJrZXIgMHhGRkQ5IG9mIHRoZSBzdHJlYW0uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBpbmxpbmUgc3RyZWFtIGxlbmd0aC5cbiAgICovXG4gIGZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7XG4gICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zO1xuICAgIGxldCBmb3VuZEVPSSA9IGZhbHNlLFxuICAgICAgYixcbiAgICAgIG1hcmtlckxlbmd0aDtcbiAgICB3aGlsZSAoKGIgPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHtcbiAgICAgIGlmIChiICE9PSAweGZmKSB7XG4gICAgICAgIC8vIE5vdCBhIHZhbGlkIG1hcmtlci5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHN0cmVhbS5nZXRCeXRlKCkpIHtcbiAgICAgICAgY2FzZSAweDAwOiAvLyBCeXRlIHN0dWZmaW5nLlxuICAgICAgICAgIC8vIDB4RkYwMCBhcHBlYXJzIHRvIGJlIGEgdmVyeSBjb21tb24gYnl0ZSBzZXF1ZW5jZSBpbiBKUEVHIGltYWdlcy5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDB4ZmY6IC8vIEZpbGwgYnl0ZS5cbiAgICAgICAgICAvLyBBdm9pZCBza2lwcGluZyBhIHZhbGlkIG1hcmtlciwgcmVzZXR0aW5nIHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICAgICAgc3RyZWFtLnNraXAoLTEpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMHhkOTogLy8gRU9JXG4gICAgICAgICAgZm91bmRFT0kgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMHhjMDogLy8gU09GMFxuICAgICAgICBjYXNlIDB4YzE6IC8vIFNPRjFcbiAgICAgICAgY2FzZSAweGMyOiAvLyBTT0YyXG4gICAgICAgIGNhc2UgMHhjMzogLy8gU09GM1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgMHhjNTogLy8gU09GNVxuICAgICAgICBjYXNlIDB4YzY6IC8vIFNPRjZcbiAgICAgICAgY2FzZSAweGM3OiAvLyBTT0Y3XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAweGM5OiAvLyBTT0Y5XG4gICAgICAgIGNhc2UgMHhjYTogLy8gU09GMTBcbiAgICAgICAgY2FzZSAweGNiOiAvLyBTT0YxMVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgMHhjZDogLy8gU09GMTNcbiAgICAgICAgY2FzZSAweGNlOiAvLyBTT0YxNFxuICAgICAgICBjYXNlIDB4Y2Y6IC8vIFNPRjE1XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAweGM0OiAvLyBESFRcbiAgICAgICAgY2FzZSAweGNjOiAvLyBEQUNcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlIDB4ZGE6IC8vIFNPU1xuICAgICAgICBjYXNlIDB4ZGI6IC8vIERRVFxuICAgICAgICBjYXNlIDB4ZGM6IC8vIEROTFxuICAgICAgICBjYXNlIDB4ZGQ6IC8vIERSSVxuICAgICAgICBjYXNlIDB4ZGU6IC8vIERIUFxuICAgICAgICBjYXNlIDB4ZGY6IC8vIEVYUFxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgMHhlMDogLy8gQVBQMFxuICAgICAgICBjYXNlIDB4ZTE6IC8vIEFQUDFcbiAgICAgICAgY2FzZSAweGUyOiAvLyBBUFAyXG4gICAgICAgIGNhc2UgMHhlMzogLy8gQVBQM1xuICAgICAgICBjYXNlIDB4ZTQ6IC8vIEFQUDRcbiAgICAgICAgY2FzZSAweGU1OiAvLyBBUFA1XG4gICAgICAgIGNhc2UgMHhlNjogLy8gQVBQNlxuICAgICAgICBjYXNlIDB4ZTc6IC8vIEFQUDdcbiAgICAgICAgY2FzZSAweGU4OiAvLyBBUFA4XG4gICAgICAgIGNhc2UgMHhlOTogLy8gQVBQOVxuICAgICAgICBjYXNlIDB4ZWE6IC8vIEFQUDEwXG4gICAgICAgIGNhc2UgMHhlYjogLy8gQVBQMTFcbiAgICAgICAgY2FzZSAweGVjOiAvLyBBUFAxMlxuICAgICAgICBjYXNlIDB4ZWQ6IC8vIEFQUDEzXG4gICAgICAgIGNhc2UgMHhlZTogLy8gQVBQMTRcbiAgICAgICAgY2FzZSAweGVmOiAvLyBBUFAxNVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgMHhmZTogLy8gQ09NXG4gICAgICAgICAgLy8gVGhlIG1hcmtlciBzaG91bGQgYmUgZm9sbG93ZWQgYnkgdGhlIGxlbmd0aCBvZiB0aGUgc2VnbWVudC5cbiAgICAgICAgICBtYXJrZXJMZW5ndGggPSBzdHJlYW0uZ2V0VWludDE2KCk7XG4gICAgICAgICAgaWYgKG1hcmtlckxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIC8vIHxtYXJrZXJMZW5ndGh8IGNvbnRhaW5zIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgbWFya2VyIHNlZ21lbnQsXG4gICAgICAgICAgICAvLyBpbmNsdWRpbmcgaXRzIG93biBsZW5ndGggKDIgYnl0ZXMpIGFuZCBleGNsdWRpbmcgdGhlIG1hcmtlci5cbiAgICAgICAgICAgIHN0cmVhbS5za2lwKG1hcmtlckxlbmd0aCAtIDIpOyAvLyBKdW1wIHRvIHRoZSBuZXh0IG1hcmtlci5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIG1hcmtlciBsZW5ndGggaXMgaW52YWxpZCwgcmVzZXR0aW5nIHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICAgICAgICBzdHJlYW0uc2tpcCgtMik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGZvdW5kRU9JKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7XG4gICAgaWYgKGIgPT09IC0xKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIklubGluZSBEQ1REZWNvZGUgaW1hZ2Ugc3RyZWFtOiBcIiArXG4gICAgICAgICAgXCJFT0kgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuXCJcbiAgICAgICk7XG4gICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsgLy8gUmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbi5cbiAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7XG4gICAgfVxuICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7XG4gICAgcmV0dXJuIGxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBFT0QgKGVuZC1vZi1kYXRhKSBtYXJrZXIgJ34+JyAoaS5lLiBUSUxERSArIEdUKSBvZiB0aGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaW5saW5lIHN0cmVhbSBsZW5ndGguXG4gICAqL1xuICBmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHtcbiAgICBjb25zdCBUSUxERSA9IDB4N2UsXG4gICAgICBHVCA9IDB4M2U7XG4gICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zO1xuICAgIGxldCBjaDtcbiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgIT09IC0xKSB7XG4gICAgICBpZiAoY2ggPT09IFRJTERFKSB7XG4gICAgICAgIGNvbnN0IHRpbGRlUG9zID0gc3RyZWFtLnBvcztcblxuICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpO1xuICAgICAgICAvLyBIYW5kbGUgY29ycnVwdCBQREYgZG9jdW1lbnRzIHdoaWNoIGNvbnRhaW5zIHdoaXRlc3BhY2UgXCJpbnNpZGVcIiBvZlxuICAgICAgICAvLyB0aGUgRU9EIG1hcmtlciAoZml4ZXMgaXNzdWUxMDYxNC5wZGYpLlxuICAgICAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGNoKSkge1xuICAgICAgICAgIHN0cmVhbS5za2lwKCk7XG4gICAgICAgICAgY2ggPSBzdHJlYW0ucGVla0J5dGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09IEdUKSB7XG4gICAgICAgICAgc3RyZWFtLnNraXAoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgY29ycnVwdCBQREYgZG9jdW1lbnRzIHdoaWNoIGNvbnRhaW5zIHRydW5jYXRlZCBFT0QgbWFya2VycyxcbiAgICAgICAgLy8gd2hlcmUgdGhlICc+JyBjaGFyYWN0ZXIgaXMgbWlzc2luZyAoZml4ZXMgaXNzdWUxMTM4NS5wZGYpLlxuICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHRpbGRlUG9zKSB7XG4gICAgICAgICAgY29uc3QgbWF5YmVFSSA9IHN0cmVhbS5wZWVrQnl0ZXMoMik7XG4gICAgICAgICAgaWYgKG1heWJlRUlbMF0gPT09IC8qIEUgPSAqLyAweDQ1ICYmIG1heWJlRUlbMV0gPT09IC8qIEkgPSAqLyAweDQ5KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zO1xuICAgIGlmIChjaCA9PT0gLTEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwiSW5saW5lIEFTQ0lJODVEZWNvZGUgaW1hZ2Ugc3RyZWFtOiBcIiArXG4gICAgICAgICAgXCJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuXCJcbiAgICAgICk7XG4gICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsgLy8gUmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbi5cbiAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7XG4gICAgfVxuICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7XG4gICAgcmV0dXJuIGxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBFT0QgKGVuZC1vZi1kYXRhKSBtYXJrZXIgJz4nIChpLmUuIEdUKSBvZiB0aGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaW5saW5lIHN0cmVhbSBsZW5ndGguXG4gICAqL1xuICBmaW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7XG4gICAgY29uc3QgR1QgPSAweDNlO1xuICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvcztcbiAgICBsZXQgY2g7XG4gICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkge1xuICAgICAgaWYgKGNoID09PSBHVCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zO1xuICAgIGlmIChjaCA9PT0gLTEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwiSW5saW5lIEFTQ0lJSGV4RGVjb2RlIGltYWdlIHN0cmVhbTogXCIgK1xuICAgICAgICAgIFwiRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLlwiXG4gICAgICApO1xuICAgICAgc3RyZWFtLnNraXAoLWxlbmd0aCk7IC8vIFJlc2V0IHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pO1xuICAgIH1cbiAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pO1xuICAgIHJldHVybiBsZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCBvdmVyIHRoZSAvRUkvIGZvciBzdHJlYW1zIHdoZXJlIHdlIHNlYXJjaCBmb3IgYW4gRU9EIG1hcmtlci5cbiAgICovXG4gIGlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pIHtcbiAgICBjb25zdCBFID0gMHg0NSxcbiAgICAgIEkgPSAweDQ5O1xuICAgIGxldCBzdGF0ZSA9IDAsXG4gICAgICBjaDtcbiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgIT09IC0xKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IDApIHtcbiAgICAgICAgc3RhdGUgPSBjaCA9PT0gRSA/IDEgOiAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gMSkge1xuICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1ha2VJbmxpbmVJbWFnZShjaXBoZXJUcmFuc2Zvcm0pIHtcbiAgICBjb25zdCBsZXhlciA9IHRoaXMubGV4ZXI7XG4gICAgY29uc3Qgc3RyZWFtID0gbGV4ZXIuc3RyZWFtO1xuXG4gICAgLy8gUGFyc2UgZGljdGlvbmFyeS5cbiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTtcbiAgICBsZXQgZGljdExlbmd0aDtcbiAgICB3aGlsZSAoIWlzQ21kKHRoaXMuYnVmMSwgXCJJRFwiKSAmJiAhaXNFT0YodGhpcy5idWYxKSkge1xuICAgICAgaWYgKCFpc05hbWUodGhpcy5idWYxKSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJEaWN0aW9uYXJ5IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3RcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1ZjEubmFtZTtcbiAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgIGlmIChpc0VPRih0aGlzLmJ1ZjEpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTtcbiAgICB9XG4gICAgaWYgKGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3MgIT09IC0xKSB7XG4gICAgICBkaWN0TGVuZ3RoID0gc3RyZWFtLnBvcyAtIGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgKGkuZS4gdGhlIGN1cnJlbnQpIGltYWdlIGZpbHRlci5cbiAgICBjb25zdCBmaWx0ZXIgPSBkaWN0LmdldChcIkZpbHRlclwiLCBcIkZcIik7XG4gICAgbGV0IGZpbHRlck5hbWU7XG4gICAgaWYgKGlzTmFtZShmaWx0ZXIpKSB7XG4gICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcbiAgICAgIGNvbnN0IGZpbHRlclplcm8gPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWx0ZXJbMF0pO1xuICAgICAgaWYgKGlzTmFtZShmaWx0ZXJaZXJvKSkge1xuICAgICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyWmVyby5uYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBhcnNlIGltYWdlIHN0cmVhbS5cbiAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3M7XG4gICAgbGV0IGxlbmd0aDtcbiAgICBpZiAoZmlsdGVyTmFtZSA9PT0gXCJEQ1REZWNvZGVcIiB8fCBmaWx0ZXJOYW1lID09PSBcIkRDVFwiKSB7XG4gICAgICBsZW5ndGggPSB0aGlzLmZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlck5hbWUgPT09IFwiQVNDSUk4NURlY29kZVwiIHx8IGZpbHRlck5hbWUgPT09IFwiQTg1XCIpIHtcbiAgICAgIGxlbmd0aCA9IHRoaXMuZmluZEFTQ0lJODVEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlck5hbWUgPT09IFwiQVNDSUlIZXhEZWNvZGVcIiB8fCBmaWx0ZXJOYW1lID09PSBcIkFIeFwiKSB7XG4gICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7XG4gICAgfVxuICAgIGxldCBpbWFnZVN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpO1xuXG4gICAgLy8gQ2FjaGUgYWxsIGltYWdlcyBiZWxvdyB0aGUgTUFYX0xFTkdUSF9UT19DQUNIRSB0aHJlc2hvbGQgYnkgdGhlaXJcbiAgICAvLyBhZGxlcjMyIGNoZWNrc3VtLlxuICAgIGxldCBjYWNoZUtleTtcbiAgICBpZiAobGVuZ3RoIDwgTUFYX0xFTkdUSF9UT19DQUNIRSAmJiBkaWN0TGVuZ3RoIDwgTUFYX0FETEVSMzJfTEVOR1RIKSB7XG4gICAgICBjb25zdCBpbWFnZUJ5dGVzID0gaW1hZ2VTdHJlYW0uZ2V0Qnl0ZXMoKTtcbiAgICAgIGltYWdlU3RyZWFtLnJlc2V0KCk7XG5cbiAgICAgIGNvbnN0IGluaXRpYWxTdHJlYW1Qb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgLy8gU2V0IHRoZSBzdHJlYW0gcG9zaXRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGljdGlvbmFyeSBkYXRhLi4uXG4gICAgICBzdHJlYW0ucG9zID0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvcztcbiAgICAgIC8vIC4uLiBhbmQgZmV0Y2ggdGhlIGJ5dGVzIG9mIHRoZSAqZW50aXJlKiBkaWN0aW9uYXJ5LlxuICAgICAgY29uc3QgZGljdEJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKGRpY3RMZW5ndGgpO1xuICAgICAgLy8gRmluYWxseSwgZG9uJ3QgZm9yZ2V0IHRvIHJlc2V0IHRoZSBzdHJlYW0gcG9zaXRpb24uXG4gICAgICBzdHJlYW0ucG9zID0gaW5pdGlhbFN0cmVhbVBvcztcblxuICAgICAgY2FjaGVLZXkgPSBjb21wdXRlQWRsZXIzMihpbWFnZUJ5dGVzKSArIFwiX1wiICsgY29tcHV0ZUFkbGVyMzIoZGljdEJ5dGVzKTtcblxuICAgICAgY29uc3QgY2FjaGVFbnRyeSA9IHRoaXMuaW1hZ2VDYWNoZVtjYWNoZUtleV07XG4gICAgICBpZiAoY2FjaGVFbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoXCJFSVwiKTtcbiAgICAgICAgdGhpcy5zaGlmdCgpO1xuXG4gICAgICAgIGNhY2hlRW50cnkucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlRW50cnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNpcGhlclRyYW5zZm9ybSkge1xuICAgICAgaW1hZ2VTdHJlYW0gPSBjaXBoZXJUcmFuc2Zvcm0uY3JlYXRlU3RyZWFtKGltYWdlU3RyZWFtLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIGltYWdlU3RyZWFtID0gdGhpcy5maWx0ZXIoaW1hZ2VTdHJlYW0sIGRpY3QsIGxlbmd0aCk7XG4gICAgaW1hZ2VTdHJlYW0uZGljdCA9IGRpY3Q7XG4gICAgaWYgKGNhY2hlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGltYWdlU3RyZWFtLmNhY2hlS2V5ID0gYGlubGluZV8ke2xlbmd0aH1fJHtjYWNoZUtleX1gO1xuICAgICAgdGhpcy5pbWFnZUNhY2hlW2NhY2hlS2V5XSA9IGltYWdlU3RyZWFtO1xuICAgIH1cblxuICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoXCJFSVwiKTtcbiAgICB0aGlzLnNoaWZ0KCk7XG5cbiAgICByZXR1cm4gaW1hZ2VTdHJlYW07XG4gIH1cblxuICBfZmluZFN0cmVhbUxlbmd0aChzdGFydFBvcywgc2lnbmF0dXJlKSB7XG4gICAgY29uc3QgeyBzdHJlYW0gfSA9IHRoaXMubGV4ZXI7XG4gICAgc3RyZWFtLnBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgY29uc3QgU0NBTl9CTE9DS19MRU5HVEggPSAyMDQ4O1xuICAgIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IHN0cmVhbS5lbmQpIHtcbiAgICAgIGNvbnN0IHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpO1xuICAgICAgY29uc3Qgc2Nhbkxlbmd0aCA9IHNjYW5CeXRlcy5sZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7XG5cbiAgICAgIGlmIChzY2FuTGVuZ3RoIDw9IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgcG9zID0gMDtcbiAgICAgIHdoaWxlIChwb3MgPCBzY2FuTGVuZ3RoKSB7XG4gICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyArIGpdID09PSBzaWduYXR1cmVbal0pIHtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGogPj0gc2lnbmF0dXJlTGVuZ3RoKSB7XG4gICAgICAgICAgLy8gYHNpZ25hdHVyZWAgZm91bmQuXG4gICAgICAgICAgc3RyZWFtLnBvcyArPSBwb3M7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBzdGFydFBvcztcbiAgICAgICAgfVxuICAgICAgICBwb3MrKztcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5wb3MgKz0gc2Nhbkxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgbWFrZVN0cmVhbShkaWN0LCBjaXBoZXJUcmFuc2Zvcm0pIHtcbiAgICBjb25zdCBsZXhlciA9IHRoaXMubGV4ZXI7XG4gICAgbGV0IHN0cmVhbSA9IGxleGVyLnN0cmVhbTtcblxuICAgIC8vIEdldCB0aGUgc3RyZWFtJ3Mgc3RhcnQgcG9zaXRpb24uXG4gICAgbGV4ZXIuc2tpcFRvTmV4dExpbmUoKTtcbiAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3MgLSAxO1xuXG4gICAgLy8gR2V0IHRoZSBsZW5ndGguXG4gICAgbGV0IGxlbmd0aCA9IGRpY3QuZ2V0KFwiTGVuZ3RoXCIpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpKSB7XG4gICAgICBpbmZvKGBCYWQgbGVuZ3RoIFwiJHtsZW5ndGh9XCIgaW4gc3RyZWFtYCk7XG4gICAgICBsZW5ndGggPSAwO1xuICAgIH1cblxuICAgIC8vIFNraXAgb3ZlciB0aGUgc3RyZWFtIGRhdGEuXG4gICAgc3RyZWFtLnBvcyA9IHN0YXJ0UG9zICsgbGVuZ3RoO1xuICAgIGxleGVyLm5leHRDaGFyKCk7XG5cbiAgICAvLyBTaGlmdCAnPj4nIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBuZXcgb2JqZWN0IG1hcmtzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS5cbiAgICBpZiAodGhpcy50cnlTaGlmdCgpICYmIGlzQ21kKHRoaXMuYnVmMiwgXCJlbmRzdHJlYW1cIikpIHtcbiAgICAgIHRoaXMuc2hpZnQoKTsgLy8gJ3N0cmVhbSdcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQmFkIHN0cmVhbSBsZW5ndGgsIHNjYW5uaW5nIGZvciBlbmRzdHJlYW0gY29tbWFuZC5cbiAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgY29uc3QgRU5EU1RSRUFNX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgMHg2NSwgMHg2RSwgMHg2NCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2RF0pO1xuICAgICAgbGV0IGFjdHVhbExlbmd0aCA9IHRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MsIEVORFNUUkVBTV9TSUdOQVRVUkUpO1xuICAgICAgaWYgKGFjdHVhbExlbmd0aCA8IDApIHtcbiAgICAgICAgLy8gT25seSBhbGxvdyBsaW1pdGVkIHRydW5jYXRpb24gb2YgdGhlIGVuZHN0cmVhbSBzaWduYXR1cmUsXG4gICAgICAgIC8vIHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzLlxuICAgICAgICBjb25zdCBNQVhfVFJVTkNBVElPTiA9IDE7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBQREYgZ2VuZXJhdG9yIGluY2x1ZGVkIHRydW5jYXRlZCBlbmRzdHJlYW0gY29tbWFuZHMsXG4gICAgICAgIC8vIHN1Y2ggYXMgZS5nLiBcImVuZHN0cmVhXCIgKGZpeGVzIGlzc3VlMTAwMDQucGRmKS5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gTUFYX1RSVU5DQVRJT047IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVuZCA9IEVORFNUUkVBTV9TSUdOQVRVUkUubGVuZ3RoIC0gaTtcbiAgICAgICAgICBjb25zdCBUUlVOQ0FURURfU0lHTkFUVVJFID0gRU5EU1RSRUFNX1NJR05BVFVSRS5zbGljZSgwLCBlbmQpO1xuXG4gICAgICAgICAgY29uc3QgbWF5YmVMZW5ndGggPSB0aGlzLl9maW5kU3RyZWFtTGVuZ3RoKFxuICAgICAgICAgICAgc3RhcnRQb3MsXG4gICAgICAgICAgICBUUlVOQ0FURURfU0lHTkFUVVJFXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWF5YmVMZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGJ5dGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSB0cnVuY2F0ZWRcbiAgICAgICAgICAgIC8vIGVuZHN0cmVhbSBjb21tYW5kIGlzIGEgc3BhY2UsIHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzLlxuICAgICAgICAgICAgY29uc3QgbGFzdEJ5dGUgPSBzdHJlYW0ucGVla0J5dGVzKGVuZCArIDEpW2VuZF07XG4gICAgICAgICAgICBpZiAoIWlzV2hpdGVTcGFjZShsYXN0Qnl0ZSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmZvKFxuICAgICAgICAgICAgICBgRm91bmQgXCIke2J5dGVzVG9TdHJpbmcoVFJVTkNBVEVEX1NJR05BVFVSRSl9XCIgd2hlbiBgICtcbiAgICAgICAgICAgICAgICBcInNlYXJjaGluZyBmb3IgZW5kc3RyZWFtIGNvbW1hbmQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhY3R1YWxMZW5ndGggPSBtYXliZUxlbmd0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3R1YWxMZW5ndGggPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTWlzc2luZyBlbmRzdHJlYW0gY29tbWFuZC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxlbmd0aCA9IGFjdHVhbExlbmd0aDtcblxuICAgICAgbGV4ZXIubmV4dENoYXIoKTtcbiAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICAgIHRoaXMuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy5zaGlmdCgpOyAvLyAnZW5kc3RyZWFtJ1xuXG4gICAgc3RyZWFtID0gc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MsIGxlbmd0aCwgZGljdCk7XG4gICAgaWYgKGNpcGhlclRyYW5zZm9ybSkge1xuICAgICAgc3RyZWFtID0gY2lwaGVyVHJhbnNmb3JtLmNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCk7XG4gICAgfVxuICAgIHN0cmVhbSA9IHRoaXMuZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKTtcbiAgICBzdHJlYW0uZGljdCA9IGRpY3Q7XG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIGZpbHRlcihzdHJlYW0sIGRpY3QsIGxlbmd0aCkge1xuICAgIGxldCBmaWx0ZXIgPSBkaWN0LmdldChcIkZpbHRlclwiLCBcIkZcIik7XG4gICAgbGV0IHBhcmFtcyA9IGRpY3QuZ2V0KFwiRGVjb2RlUGFybXNcIiwgXCJEUFwiKTtcblxuICAgIGlmIChpc05hbWUoZmlsdGVyKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwiL0RlY29kZVBhcm1zIHNob3VsZCBub3QgY29udGFpbiBhbiBBcnJheSwgXCIgK1xuICAgICAgICAgICAgXCJ3aGVuIC9GaWx0ZXIgY29udGFpbnMgYSBOYW1lLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIGxlbmd0aCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBsZXQgbWF5YmVMZW5ndGggPSBsZW5ndGg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgY29uc3QgZmlsdGVyQXJyYXkgPSBmaWx0ZXI7XG4gICAgICBjb25zdCBwYXJhbXNBcnJheSA9IHBhcmFtcztcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZpbHRlckFycmF5Lmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgZmlsdGVyID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmlsdGVyQXJyYXlbaV0pO1xuICAgICAgICBpZiAoIWlzTmFtZShmaWx0ZXIpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBCYWQgZmlsdGVyIG5hbWUgXCIke2ZpbHRlcn1cImApO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFyYW1zID0gbnVsbDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zQXJyYXkpICYmIGkgaW4gcGFyYW1zQXJyYXkpIHtcbiAgICAgICAgICBwYXJhbXMgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihwYXJhbXNBcnJheVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtID0gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIG1heWJlTGVuZ3RoLCBwYXJhbXMpO1xuICAgICAgICAvLyBBZnRlciB0aGUgZmlyc3Qgc3RyZWFtIHRoZSBgbGVuZ3RoYCB2YXJpYWJsZSBpcyBpbnZhbGlkLlxuICAgICAgICBtYXliZUxlbmd0aCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG4gIH1cblxuICBtYWtlRmlsdGVyKHN0cmVhbSwgbmFtZSwgbWF5YmVMZW5ndGgsIHBhcmFtcykge1xuICAgIC8vIFNpbmNlIHRoZSAnTGVuZ3RoJyBlbnRyeSBpbiB0aGUgc3RyZWFtIGRpY3Rpb25hcnkgY2FuIGJlIGNvbXBsZXRlbHlcbiAgICAvLyB3cm9uZywgZS5nLiB6ZXJvIGZvciBub24tZW1wdHkgc3RyZWFtcywgb25seSBza2lwIHBhcnNpbmcgdGhlIHN0cmVhbVxuICAgIC8vIHdoZW4gd2UgY2FuIGJlIGFic29sdXRlbHkgY2VydGFpbiB0aGF0IGl0IGFjdHVhbGx5IGlzIGVtcHR5LlxuICAgIGlmIChtYXliZUxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybihgRW1wdHkgXCIke25hbWV9XCIgc3RyZWFtLmApO1xuICAgICAgcmV0dXJuIG5ldyBOdWxsU3RyZWFtKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHhyZWZTdHJlYW1TdGF0cyA9IHRoaXMueHJlZi5zdGF0cy5zdHJlYW1UeXBlcztcbiAgICAgIGlmIChuYW1lID09PSBcIkZsYXRlRGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJGbFwiKSB7XG4gICAgICAgIHhyZWZTdHJlYW1TdGF0c1tTdHJlYW1UeXBlLkZMQVRFXSA9IHRydWU7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByZWRpY3RvclN0cmVhbShcbiAgICAgICAgICAgIG5ldyBGbGF0ZVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSxcbiAgICAgICAgICAgIG1heWJlTGVuZ3RoLFxuICAgICAgICAgICAgcGFyYW1zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwiTFpXRGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJMWldcIikge1xuICAgICAgICB4cmVmU3RyZWFtU3RhdHNbU3RyZWFtVHlwZS5MWlddID0gdHJ1ZTtcbiAgICAgICAgbGV0IGVhcmx5Q2hhbmdlID0gMTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgIGlmIChwYXJhbXMuaGFzKFwiRWFybHlDaGFuZ2VcIikpIHtcbiAgICAgICAgICAgIGVhcmx5Q2hhbmdlID0gcGFyYW1zLmdldChcIkVhcmx5Q2hhbmdlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByZWRpY3RvclN0cmVhbShcbiAgICAgICAgICAgIG5ldyBMWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLFxuICAgICAgICAgICAgbWF5YmVMZW5ndGgsXG4gICAgICAgICAgICBwYXJhbXNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkRDVERlY29kZVwiIHx8IG5hbWUgPT09IFwiRENUXCIpIHtcbiAgICAgICAgeHJlZlN0cmVhbVN0YXRzW1N0cmVhbVR5cGUuRENUXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgSnBlZ1N0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBzdHJlYW0uZGljdCwgcGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkpQWERlY29kZVwiIHx8IG5hbWUgPT09IFwiSlBYXCIpIHtcbiAgICAgICAgeHJlZlN0cmVhbVN0YXRzW1N0cmVhbVR5cGUuSlBYXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgSnB4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHN0cmVhbS5kaWN0LCBwYXJhbXMpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwiQVNDSUk4NURlY29kZVwiIHx8IG5hbWUgPT09IFwiQTg1XCIpIHtcbiAgICAgICAgeHJlZlN0cmVhbVN0YXRzW1N0cmVhbVR5cGUuQTg1XSA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgQXNjaWk4NVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkFTQ0lJSGV4RGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJBSHhcIikge1xuICAgICAgICB4cmVmU3RyZWFtU3RhdHNbU3RyZWFtVHlwZS5BSFhdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBBc2NpaUhleFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkNDSVRURmF4RGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJDQ0ZcIikge1xuICAgICAgICB4cmVmU3RyZWFtU3RhdHNbU3RyZWFtVHlwZS5DQ0ZdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBDQ0lUVEZheFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwiUnVuTGVuZ3RoRGVjb2RlXCIgfHwgbmFtZSA9PT0gXCJSTFwiKSB7XG4gICAgICAgIHhyZWZTdHJlYW1TdGF0c1tTdHJlYW1UeXBlLlJMWF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFJ1bkxlbmd0aFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBcIkpCSUcyRGVjb2RlXCIpIHtcbiAgICAgICAgeHJlZlN0cmVhbVN0YXRzW1N0cmVhbVR5cGUuSkJJR10gPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IEpiaWcyU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHN0cmVhbS5kaWN0LCBwYXJhbXMpO1xuICAgICAgfVxuICAgICAgd2FybihgRmlsdGVyIFwiJHtuYW1lfVwiIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICAgIHdhcm4oYEludmFsaWQgc3RyZWFtOiBcIiR7ZXh9XCJgKTtcbiAgICAgIHJldHVybiBuZXcgTnVsbFN0cmVhbSgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBICcxJyBpbiB0aGlzIGFycmF5IG1lYW5zIHRoZSBjaGFyYWN0ZXIgaXMgd2hpdGUgc3BhY2UuIEEgJzEnIG9yXG4vLyAnMicgbWVhbnMgdGhlIGNoYXJhY3RlciBlbmRzIGEgbmFtZSBvciBjb21tYW5kLlxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBzcGVjaWFsQ2hhcnMgPSBbXG4gIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDAsIDAsIC8vIDB4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDF4XG4gIDEsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDIsIC8vIDJ4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIC8vIDN4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDR4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIDAsIC8vIDV4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDZ4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIDAsIC8vIDd4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDh4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDl4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGF4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGJ4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGN4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGR4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIGV4XG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgIC8vIGZ4XG5dO1xuXG5mdW5jdGlvbiB0b0hleERpZ2l0KGNoKSB7XG4gIGlmIChjaCA+PSAvKiAnMCcgPSAqLyAweDMwICYmIGNoIC8qICc5JyA9ICovIDw9IDB4MzkpIHtcbiAgICByZXR1cm4gY2ggJiAweDBmO1xuICB9XG4gIGlmIChcbiAgICAoY2ggPj0gLyogJ0EnID0gKi8gMHg0MSAmJiBjaCA8PSAvKiAnRicgPSAqLyAweDQ2KSB8fFxuICAgIChjaCA+PSAvKiAnYScgPSAqLyAweDYxICYmIGNoIDw9IC8qICdmJyA9ICovIDB4NjYpXG4gICkge1xuICAgIHJldHVybiAoY2ggJiAweDBmKSArIDk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5jbGFzcyBMZXhlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwga25vd25Db21tYW5kcyA9IG51bGwpIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLm5leHRDaGFyKCk7XG5cbiAgICAvLyBXaGlsZSBsZXhpbmcsIHdlIGJ1aWxkIHVwIG1hbnkgc3RyaW5ncyBvbmUgY2hhciBhdCBhIHRpbWUuIFVzaW5nICs9IGZvclxuICAgIC8vIHRoaXMgY2FuIHJlc3VsdCBpbiBsb3RzIG9mIGdhcmJhZ2Ugc3RyaW5ncy4gSXQncyBiZXR0ZXIgdG8gYnVpbGQgYW5cbiAgICAvLyBhcnJheSBvZiBzaW5nbGUtY2hhciBzdHJpbmdzIGFuZCB0aGVuIGpvaW4oKSB0aGVtIHRvZ2V0aGVyIGF0IHRoZSBlbmQuXG4gICAgLy8gQW5kIHJldXNpbmcgYSBzaW5nbGUgYXJyYXkgKGkuZS4gfHRoaXMuc3RyQnVmfCkgb3ZlciBhbmQgb3ZlciBmb3IgdGhpc1xuICAgIC8vIHB1cnBvc2UgdXNlcyBsZXNzIG1lbW9yeSB0aGFuIHVzaW5nIGEgbmV3IGFycmF5IGZvciBlYWNoIHN0cmluZy5cbiAgICB0aGlzLnN0ckJ1ZiA9IFtdO1xuXG4gICAgLy8gVGhlIFBERnMgbWlnaHQgaGF2ZSBcImdsdWVkXCIgY29tbWFuZHMgd2l0aCBvdGhlciBjb21tYW5kcywgb3BlcmFuZHMgb3JcbiAgICAvLyBsaXRlcmFscywgZS5nLiBcInExXCIuIFRoZSBrbm93bkNvbW1hbmRzIGlzIGEgZGljdGlvbmFyeSBvZiB0aGUgdmFsaWRcbiAgICAvLyBjb21tYW5kcyBhbmQgdGhlaXIgcHJlZml4ZXMuIFRoZSBwcmVmaXhlcyBhcmUgYnVpbHQgdGhlIGZvbGxvd2luZyB3YXk6XG4gICAgLy8gaWYgdGhlcmUgYSBjb21tYW5kIHRoYXQgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyIHZhbGlkIGNvbW1hbmQgb3JcbiAgICAvLyBsaXRlcmFsIChlLmcuICdmJyBhbmQgJ2ZhbHNlJykgdGhlIGZvbGxvd2luZyBwcmVmaXhlcyBtdXN0IGJlIGluY2x1ZGVkLFxuICAgIC8vICdmYScsICdmYWwnLCAnZmFscycuIFRoZSBwcmVmaXhlcyBhcmUgbm90IG5lZWRlZCwgaWYgdGhlIGNvbW1hbmQgaGFzIG5vXG4gICAgLy8gb3RoZXIgY29tbWFuZHMgb3IgbGl0ZXJhbHMgYXMgYSBwcmVmaXguIFRoZSBrbm93Q29tbWFuZHMgaXMgb3B0aW9uYWwuXG4gICAgdGhpcy5rbm93bkNvbW1hbmRzID0ga25vd25Db21tYW5kcztcblxuICAgIHRoaXMuX2hleFN0cmluZ051bVdhcm4gPSAwO1xuICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IC0xO1xuICB9XG5cbiAgbmV4dENoYXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKTtcbiAgfVxuXG4gIHBlZWtDaGFyKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbS5wZWVrQnl0ZSgpO1xuICB9XG5cbiAgZ2V0TnVtYmVyKCkge1xuICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7XG4gICAgbGV0IGVOb3RhdGlvbiA9IGZhbHNlO1xuICAgIGxldCBkaXZpZGVCeSA9IDA7IC8vIERpZmZlcmVudCBmcm9tIDAgaWYgaXQncyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLlxuICAgIGxldCBzaWduID0gMDtcblxuICAgIGlmIChjaCA9PT0gLyogJy0nID0gKi8gMHgyZCkge1xuICAgICAgc2lnbiA9IC0xO1xuICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG5cbiAgICAgIGlmIChjaCA9PT0gLyogJy0nID0gKi8gMHgyZCkge1xuICAgICAgICAvLyBJZ25vcmUgZG91YmxlIG5lZ2F0aXZlICh0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBBZG9iZSBSZWFkZXIpLlxuICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAvKiAnKycgPSAqLyAweDJiKSB7XG4gICAgICBzaWduID0gMTtcbiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgIH1cbiAgICBpZiAoY2ggPT09IC8qIExGID0gKi8gMHgwYSB8fCBjaCA9PT0gLyogQ1IgPSAqLyAweDBkKSB7XG4gICAgICAvLyBJZ25vcmUgbGluZS1icmVha3MgKHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIEFkb2JlIFJlYWRlcikuXG4gICAgICBkbyB7XG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgfSB3aGlsZSAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpO1xuICAgIH1cbiAgICBpZiAoY2ggPT09IC8qICcuJyA9ICovIDB4MmUpIHtcbiAgICAgIGRpdmlkZUJ5ID0gMTA7XG4gICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICB9XG4gICAgaWYgKGNoIDwgLyogJzAnID0gKi8gMHgzMCB8fCBjaCA+IC8qICc5JyA9ICovIDB4MzkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGl2aWRlQnkgPT09IDEwICYmXG4gICAgICAgIHNpZ24gPT09IDAgJiZcbiAgICAgICAgKGlzV2hpdGVTcGFjZShjaCkgfHwgY2ggPT09IC8qIEVPRiA9ICovIC0xKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIEFkb2JlIFJlYWRlciAoZml4ZXMgaXNzdWU5MjUyLnBkZikuXG4gICAgICAgIHdhcm4oXCJMZXhlci5nZXROdW1iZXIgLSB0cmVhdGluZyBhIHNpbmdsZSBkZWNpbWFsIHBvaW50IGFzIHplcm8uXCIpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgYEludmFsaWQgbnVtYmVyOiAke1N0cmluZy5mcm9tQ2hhckNvZGUoY2gpfSAoY2hhckNvZGUgJHtjaH0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzaWduID0gc2lnbiB8fCAxO1xuICAgIGxldCBiYXNlVmFsdWUgPSBjaCAtIDB4MzA7IC8vICcwJ1xuICAgIGxldCBwb3dlclZhbHVlID0gMDtcbiAgICBsZXQgcG93ZXJWYWx1ZVNpZ24gPSAxO1xuXG4gICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkge1xuICAgICAgaWYgKGNoID49IC8qICcwJyA9ICovIDB4MzAgJiYgY2ggPD0gLyogJzknID0gKi8gMHgzOSkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGlnaXQgPSBjaCAtIDB4MzA7IC8vICcwJ1xuICAgICAgICBpZiAoZU5vdGF0aW9uKSB7XG4gICAgICAgICAgLy8gV2UgYXJlIGFmdGVyIGFuICdlJyBvciAnRScuXG4gICAgICAgICAgcG93ZXJWYWx1ZSA9IHBvd2VyVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZGl2aWRlQnkgIT09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGFyZSBhZnRlciBhIHBvaW50LlxuICAgICAgICAgICAgZGl2aWRlQnkgKj0gMTA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJhc2VWYWx1ZSA9IGJhc2VWYWx1ZSAqIDEwICsgY3VycmVudERpZ2l0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSAvKiAnLicgPSAqLyAweDJlKSB7XG4gICAgICAgIGlmIChkaXZpZGVCeSA9PT0gMCkge1xuICAgICAgICAgIGRpdmlkZUJ5ID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBIG51bWJlciBjYW4gaGF2ZSBvbmx5IG9uZSBkb3QuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IC8qICctJyA9ICovIDB4MmQpIHtcbiAgICAgICAgLy8gSWdub3JlIG1pbnVzIHNpZ25zIGluIHRoZSBtaWRkbGUgb2YgbnVtYmVycyB0byBtYXRjaFxuICAgICAgICAvLyBBZG9iZSdzIGJlaGF2aW9yLlxuICAgICAgICB3YXJuKFwiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlXCIpO1xuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gLyogJ0UnID0gKi8gMHg0NSB8fCBjaCA9PT0gLyogJ2UnID0gKi8gMHg2NSkge1xuICAgICAgICAvLyAnRScgY2FuIGJlIGVpdGhlciBhIHNjaWVudGlmaWMgbm90YXRpb24gb3IgdGhlIGJlZ2lubmluZyBvZiBhIG5ld1xuICAgICAgICAvLyBvcGVyYXRvci5cbiAgICAgICAgY2ggPSB0aGlzLnBlZWtDaGFyKCk7XG4gICAgICAgIGlmIChjaCA9PT0gLyogJysnID0gKi8gMHgyYiB8fCBjaCA9PT0gLyogJy0nID0gKi8gMHgyZCkge1xuICAgICAgICAgIHBvd2VyVmFsdWVTaWduID0gY2ggPT09IDB4MmQgPyAtMSA6IDE7XG4gICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOyAvLyBDb25zdW1lIHRoZSBzaWduIGNoYXJhY3Rlci5cbiAgICAgICAgfSBlbHNlIGlmIChjaCA8IC8qICcwJyA9ICovIDB4MzAgfHwgY2ggPiAvKiAnOScgPSAqLyAweDM5KSB7XG4gICAgICAgICAgLy8gVGhlICdFJyBtdXN0IGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgb3BlcmF0b3IuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZU5vdGF0aW9uID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBsYXN0IGNoYXJhY3RlciBkb2Vzbid0IGJlbG9uZyB0byB1cy5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7XG4gICAgICBiYXNlVmFsdWUgLz0gZGl2aWRlQnk7XG4gICAgfVxuICAgIGlmIChlTm90YXRpb24pIHtcbiAgICAgIGJhc2VWYWx1ZSAqPSAxMCAqKiAocG93ZXJWYWx1ZVNpZ24gKiBwb3dlclZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZ24gKiBiYXNlVmFsdWU7XG4gIH1cblxuICBnZXRTdHJpbmcoKSB7XG4gICAgbGV0IG51bVBhcmVuID0gMTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmO1xuICAgIHN0ckJ1Zi5sZW5ndGggPSAwO1xuXG4gICAgbGV0IGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgY2hhckJ1ZmZlcmVkID0gZmFsc2U7XG4gICAgICBzd2l0Y2ggKGNoIHwgMCkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIHdhcm4oXCJVbnRlcm1pbmF0ZWQgc3RyaW5nXCIpO1xuICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4Mjg6IC8vICcoJ1xuICAgICAgICAgICsrbnVtUGFyZW47XG4gICAgICAgICAgc3RyQnVmLnB1c2goXCIoXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4Mjk6IC8vICcpJ1xuICAgICAgICAgIGlmICgtLW51bVBhcmVuID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7IC8vIGNvbnN1bWUgc3RyaW5ncyAnKSdcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJCdWYucHVzaChcIilcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4NWM6IC8vICdcXFxcJ1xuICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICAgIHdhcm4oXCJVbnRlcm1pbmF0ZWQgc3RyaW5nXCIpO1xuICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NmU6IC8vICduJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcblwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NzI6IC8vICdyJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcclwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NzQ6IC8vICd0J1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcdFwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NjI6IC8vICdiJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcYlwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NjY6IC8vICdmJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChcIlxcZlwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NWM6IC8vICdcXCdcbiAgICAgICAgICAgIGNhc2UgMHgyODogLy8gJygnXG4gICAgICAgICAgICBjYXNlIDB4Mjk6IC8vICcpJ1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweDMwOiAvLyAnMCdcbiAgICAgICAgICAgIGNhc2UgMHgzMTogLy8gJzEnXG4gICAgICAgICAgICBjYXNlIDB4MzI6IC8vICcyJ1xuICAgICAgICAgICAgY2FzZSAweDMzOiAvLyAnMydcbiAgICAgICAgICAgIGNhc2UgMHgzNDogLy8gJzQnXG4gICAgICAgICAgICBjYXNlIDB4MzU6IC8vICc1J1xuICAgICAgICAgICAgY2FzZSAweDM2OiAvLyAnNidcbiAgICAgICAgICAgIGNhc2UgMHgzNzogLy8gJzcnXG4gICAgICAgICAgICAgIGxldCB4ID0gY2ggJiAweDBmO1xuICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgICAgICAgY2hhckJ1ZmZlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgaWYgKGNoID49IC8qICcwJyA9ICovIDB4MzAgJiYgY2ggPD0gLyogJzcnID0gKi8gMHgzNykge1xuICAgICAgICAgICAgICAgIHggPSAoeCA8PCAzKSArIChjaCAmIDB4MGYpO1xuICAgICAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA+PSAvKiAnMCcgPSAqLyAweDMwICYmIGNoIC8qICc3JyA9ICovIDw9IDB4MzcpIHtcbiAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgeCA9ICh4IDw8IDMpICsgKGNoICYgMHgwZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoeCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHgwZDogLy8gQ1JcbiAgICAgICAgICAgICAgaWYgKHRoaXMucGVla0NoYXIoKSA9PT0gLyogTEYgPSAqLyAweDBhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweDBhOiAvLyBMRlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGFyQnVmZmVyZWQpIHtcbiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbiAgfVxuXG4gIGdldE5hbWUoKSB7XG4gICAgbGV0IGNoLCBwcmV2aW91c0NoO1xuICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmO1xuICAgIHN0ckJ1Zi5sZW5ndGggPSAwO1xuXG4gICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAhc3BlY2lhbENoYXJzW2NoXSkge1xuICAgICAgaWYgKGNoID09PSAvKiAnIycgPSAqLyAweDIzKSB7XG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICBpZiAoc3BlY2lhbENoYXJzW2NoXSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBcIkxleGVyX2dldE5hbWU6IFwiICtcbiAgICAgICAgICAgICAgXCJOVU1CRVIgU0lHTiAoIykgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgaGV4YWRlY2ltYWwgbnVtYmVyLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzdHJCdWYucHVzaChcIiNcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeCA9IHRvSGV4RGlnaXQoY2gpO1xuICAgICAgICBpZiAoeCAhPT0gLTEpIHtcbiAgICAgICAgICBwcmV2aW91c0NoID0gY2g7XG4gICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgICAgY29uc3QgeDIgPSB0b0hleERpZ2l0KGNoKTtcbiAgICAgICAgICBpZiAoeDIgPT09IC0xKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBgTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0pIGAgK1xuICAgICAgICAgICAgICAgIFwiaW4gaGV4YWRlY2ltYWwgbnVtYmVyLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RyQnVmLnB1c2goXCIjXCIsIFN0cmluZy5mcm9tQ2hhckNvZGUocHJldmlvdXNDaCkpO1xuICAgICAgICAgICAgaWYgKHNwZWNpYWxDaGFyc1tjaF0pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgoeCA8PCA0KSB8IHgyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyQnVmLnB1c2goXCIjXCIsIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RyQnVmLmxlbmd0aCA+IDEyNykge1xuICAgICAgd2FybihgTmFtZSB0b2tlbiBpcyBsb25nZXIgdGhhbiBhbGxvd2VkIGJ5IHRoZSBzcGVjOiAke3N0ckJ1Zi5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBOYW1lLmdldChzdHJCdWYuam9pbihcIlwiKSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9oZXhTdHJpbmdXYXJuKGNoKSB7XG4gICAgY29uc3QgTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4gPSA1O1xuXG4gICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4rKyA9PT0gTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4pIHtcbiAgICAgIHdhcm4oXCJnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBhZGRpdGlvbmFsIGludmFsaWQgY2hhcmFjdGVycy5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID4gTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4pIHtcbiAgICAgIC8vIExpbWl0IHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyBwcmludGVkIGZvciBhIGB0aGlzLmdldEhleFN0cmluZ2BcbiAgICAgIC8vIGludm9jYXRpb24sIHNpbmNlIGNvcnJ1cHQgUERGIGRvY3VtZW50cyBtYXkgb3RoZXJ3aXNlIHNwYW0gdGhlIGNvbnNvbGVcbiAgICAgIC8vIGVub3VnaCB0byBhZmZlY3QgZ2VuZXJhbCBwZXJmb3JtYW5jZSBuZWdhdGl2ZWx5LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuKGBnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlcjogJHtjaH1gKTtcbiAgfVxuXG4gIGdldEhleFN0cmluZygpIHtcbiAgICBjb25zdCBzdHJCdWYgPSB0aGlzLnN0ckJ1ZjtcbiAgICBzdHJCdWYubGVuZ3RoID0gMDtcbiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyO1xuICAgIGxldCBpc0ZpcnN0SGV4ID0gdHJ1ZTtcbiAgICBsZXQgZmlyc3REaWdpdCwgc2Vjb25kRGlnaXQ7XG4gICAgdGhpcy5faGV4U3RyaW5nTnVtV2FybiA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGNoIDwgMCkge1xuICAgICAgICB3YXJuKFwiVW50ZXJtaW5hdGVkIGhleCBzdHJpbmdcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gLyogJz4nID0gKi8gMHgzZSkge1xuICAgICAgICB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdID09PSAxKSB7XG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0ZpcnN0SGV4KSB7XG4gICAgICAgICAgZmlyc3REaWdpdCA9IHRvSGV4RGlnaXQoY2gpO1xuICAgICAgICAgIGlmIChmaXJzdERpZ2l0ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5faGV4U3RyaW5nV2FybihjaCk7XG4gICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWNvbmREaWdpdCA9IHRvSGV4RGlnaXQoY2gpO1xuICAgICAgICAgIGlmIChzZWNvbmREaWdpdCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2hleFN0cmluZ1dhcm4oY2gpO1xuICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgoZmlyc3REaWdpdCA8PCA0KSB8IHNlY29uZERpZ2l0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNGaXJzdEhleCA9ICFpc0ZpcnN0SGV4O1xuICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0ckJ1Zi5qb2luKFwiXCIpO1xuICB9XG5cbiAgZ2V0T2JqKCkge1xuICAgIC8vIFNraXAgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMuXG4gICAgbGV0IGNvbW1lbnQgPSBmYWxzZTtcbiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoY2ggPCAwKSB7XG4gICAgICAgIHJldHVybiBFT0Y7XG4gICAgICB9XG4gICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAoY2ggPT09IC8qIExGID0gKi8gMHgwYSB8fCBjaCA9PT0gLyogQ1IgPSAqLyAweDBkKSB7XG4gICAgICAgICAgY29tbWVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSAvKiAnJScgPSAqLyAweDI1KSB7XG4gICAgICAgIGNvbW1lbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdICE9PSAxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgcmVhZGluZyBhIHRva2VuLlxuICAgIHN3aXRjaCAoY2ggfCAwKSB7XG4gICAgICBjYXNlIDB4MzA6IC8vICcwJ1xuICAgICAgY2FzZSAweDMxOiAvLyAnMSdcbiAgICAgIGNhc2UgMHgzMjogLy8gJzInXG4gICAgICBjYXNlIDB4MzM6IC8vICczJ1xuICAgICAgY2FzZSAweDM0OiAvLyAnNCdcbiAgICAgIGNhc2UgMHgzNTogLy8gJzUnXG4gICAgICBjYXNlIDB4MzY6IC8vICc2J1xuICAgICAgY2FzZSAweDM3OiAvLyAnNydcbiAgICAgIGNhc2UgMHgzODogLy8gJzgnXG4gICAgICBjYXNlIDB4Mzk6IC8vICc5J1xuICAgICAgY2FzZSAweDJiOiAvLyAnKydcbiAgICAgIGNhc2UgMHgyZDogLy8gJy0nXG4gICAgICBjYXNlIDB4MmU6IC8vICcuJ1xuICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTtcbiAgICAgIGNhc2UgMHgyODogLy8gJygnXG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygpO1xuICAgICAgY2FzZSAweDJmOiAvLyAnLydcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpO1xuICAgICAgLy8gYXJyYXkgcHVuY3R1YXRpb25cbiAgICAgIGNhc2UgMHg1YjogLy8gJ1snXG4gICAgICAgIHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgcmV0dXJuIENtZC5nZXQoXCJbXCIpO1xuICAgICAgY2FzZSAweDVkOiAvLyAnXSdcbiAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICByZXR1cm4gQ21kLmdldChcIl1cIik7XG4gICAgICAvLyBoZXggc3RyaW5nIG9yIGRpY3QgcHVuY3R1YXRpb25cbiAgICAgIGNhc2UgMHgzYzogLy8gJzwnXG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICBpZiAoY2ggPT09IDB4M2MpIHtcbiAgICAgICAgICAvLyBkaWN0IHB1bmN0dWF0aW9uXG4gICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgIHJldHVybiBDbWQuZ2V0KFwiPDxcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGV4U3RyaW5nKCk7XG4gICAgICAvLyBkaWN0IHB1bmN0dWF0aW9uXG4gICAgICBjYXNlIDB4M2U6IC8vICc+J1xuICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgaWYgKGNoID09PSAweDNlKSB7XG4gICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgIHJldHVybiBDbWQuZ2V0KFwiPj5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENtZC5nZXQoXCI+XCIpO1xuICAgICAgY2FzZSAweDdiOiAvLyAneydcbiAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICByZXR1cm4gQ21kLmdldChcIntcIik7XG4gICAgICBjYXNlIDB4N2Q6IC8vICd9J1xuICAgICAgICB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgIHJldHVybiBDbWQuZ2V0KFwifVwiKTtcbiAgICAgIGNhc2UgMHgyOTogLy8gJyknXG4gICAgICAgIC8vIENvbnN1bWUgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGluIG9yZGVyIHRvIGF2b2lkIHBlcm1hbmVudGx5IGhhbmdpbmdcbiAgICAgICAgLy8gdGhlIHdvcmtlciB0aHJlYWQgaWYgYExleGVyLmdldE9iamVjdGAgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgbG9vcFxuICAgICAgICAvLyBjb250YWluaW5nIHRyeS1jYXRjaCBzdGF0ZW1lbnRzLCBzaW5jZSB3ZSB3b3VsZCBvdGhlcndpc2UgYXR0ZW1wdFxuICAgICAgICAvLyB0byBwYXJzZSB0aGUgKnNhbWUqIGNoYXJhY3RlciBvdmVyIGFuZCBvdmVyIChmaXhlcyBpc3N1ZTgwNjEucGRmKS5cbiAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYElsbGVnYWwgY2hhcmFjdGVyOiAke2NofWApO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHJlYWRpbmcgYSBjb21tYW5kLlxuICAgIGxldCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICBjb25zdCBrbm93bkNvbW1hbmRzID0gdGhpcy5rbm93bkNvbW1hbmRzO1xuICAgIGxldCBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHMgJiYga25vd25Db21tYW5kc1tzdHJdICE9PSB1bmRlZmluZWQ7XG4gICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAhc3BlY2lhbENoYXJzW2NoXSkge1xuICAgICAgLy8gU3RvcCBpZiBhIGtub3duIGNvbW1hbmQgaXMgZm91bmQgYW5kIG5leHQgY2hhcmFjdGVyIGRvZXMgbm90IG1ha2VcbiAgICAgIC8vIHRoZSBzdHJpbmcgYSBjb21tYW5kLlxuICAgICAgY29uc3QgcG9zc2libGVDb21tYW5kID0gc3RyICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICBpZiAoa25vd25Db21tYW5kRm91bmQgJiYga25vd25Db21tYW5kc1twb3NzaWJsZUNvbW1hbmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTI4KSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHtzdHIubGVuZ3RofWApO1xuICAgICAgfVxuICAgICAgc3RyID0gcG9zc2libGVDb21tYW5kO1xuICAgICAga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzICYmIGtub3duQ29tbWFuZHNbc3RyXSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoc3RyID09PSBcInRydWVcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdHIgPT09IFwiZmFsc2VcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RyID09PSBcIm51bGxcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHN0ciA9PT0gXCJCSVwiKSB7XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiwgc2luY2UgaXQncyBuZWVkZWQgaW4gb3JkZXJcbiAgICAgIC8vIHRvIGNvcnJlY3RseSBjYWNoZSBpbmxpbmUgaW1hZ2VzOyBzZWUgYFBhcnNlci5tYWtlSW5saW5lSW1hZ2VgLlxuICAgICAgdGhpcy5iZWdpbklubGluZUltYWdlUG9zID0gdGhpcy5zdHJlYW0ucG9zO1xuICAgIH1cblxuICAgIHJldHVybiBDbWQuZ2V0KHN0cik7XG4gIH1cblxuICBwZWVrT2JqKCkge1xuICAgIGNvbnN0IHN0cmVhbVBvcyA9IHRoaXMuc3RyZWFtLnBvcyxcbiAgICAgIGN1cnJlbnRDaGFyID0gdGhpcy5jdXJyZW50Q2hhcixcbiAgICAgIGJlZ2luSW5saW5lSW1hZ2VQb3MgPSB0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3M7XG5cbiAgICBsZXQgbmV4dE9iajtcbiAgICB0cnkge1xuICAgICAgbmV4dE9iaiA9IHRoaXMuZ2V0T2JqKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgd2FybihgcGVla09iajogJHtleH1gKTtcbiAgICB9XG4gICAgLy8gRW5zdXJlIHRoYXQgd2UgcmVzZXQgKmFsbCogcmVsZXZhbnQgYExleGVyYC1pbnN0YW5jZSBzdGF0ZS5cbiAgICB0aGlzLnN0cmVhbS5wb3MgPSBzdHJlYW1Qb3M7XG4gICAgdGhpcy5jdXJyZW50Q2hhciA9IGN1cnJlbnRDaGFyO1xuICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IGJlZ2luSW5saW5lSW1hZ2VQb3M7XG5cbiAgICByZXR1cm4gbmV4dE9iajtcbiAgfVxuXG4gIHNraXBUb05leHRMaW5lKCkge1xuICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7XG4gICAgd2hpbGUgKGNoID49IDApIHtcbiAgICAgIGlmIChjaCA9PT0gLyogQ1IgPSAqLyAweDBkKSB7XG4gICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICBpZiAoY2ggPT09IC8qIExGID0gKi8gMHgwYSkge1xuICAgICAgICAgIHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IC8qIExGID0gKi8gMHgwYSkge1xuICAgICAgICB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIExpbmVhcml6YXRpb24ge1xuICBzdGF0aWMgY3JlYXRlKHN0cmVhbSkge1xuICAgIGZ1bmN0aW9uIGdldEludChsaW5EaWN0LCBuYW1lLCBhbGxvd1plcm9WYWx1ZSA9IGZhbHNlKSB7XG4gICAgICBjb25zdCBvYmogPSBsaW5EaWN0LmdldChuYW1lKTtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikgJiYgKGFsbG93WmVyb1ZhbHVlID8gb2JqID49IDAgOiBvYmogPiAwKSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIFwiJHtuYW1lfVwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBgICtcbiAgICAgICAgICBcImRpY3Rpb25hcnkgaXMgaW52YWxpZC5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRIaW50cyhsaW5EaWN0KSB7XG4gICAgICBjb25zdCBoaW50cyA9IGxpbkRpY3QuZ2V0KFwiSFwiKTtcbiAgICAgIGxldCBoaW50c0xlbmd0aDtcblxuICAgICAgaWYgKFxuICAgICAgICBBcnJheS5pc0FycmF5KGhpbnRzKSAmJlxuICAgICAgICAoKGhpbnRzTGVuZ3RoID0gaGludHMubGVuZ3RoKSA9PT0gMiB8fCBoaW50c0xlbmd0aCA9PT0gNClcbiAgICAgICkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaGludHNMZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBoaW50ID0gaGludHNbaW5kZXhdO1xuICAgICAgICAgIGlmICghKE51bWJlci5pc0ludGVnZXIoaGludCkgJiYgaGludCA+IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBIaW50ICgke2luZGV4fSkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaW50cztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkhpbnQgYXJyYXkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcbiAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSxcbiAgICAgIHhyZWY6IG51bGwsXG4gICAgfSk7XG4gICAgY29uc3Qgb2JqMSA9IHBhcnNlci5nZXRPYmooKTtcbiAgICBjb25zdCBvYmoyID0gcGFyc2VyLmdldE9iaigpO1xuICAgIGNvbnN0IG9iajMgPSBwYXJzZXIuZ2V0T2JqKCk7XG4gICAgY29uc3QgbGluRGljdCA9IHBhcnNlci5nZXRPYmooKTtcbiAgICBsZXQgb2JqLCBsZW5ndGg7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihvYmoxKSAmJlxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKG9iajIpICYmXG4gICAgICAgIGlzQ21kKG9iajMsIFwib2JqXCIpICYmXG4gICAgICAgIGlzRGljdChsaW5EaWN0KSAmJlxuICAgICAgICBpc051bSgob2JqID0gbGluRGljdC5nZXQoXCJMaW5lYXJpemVkXCIpKSkgJiZcbiAgICAgICAgb2JqID4gMFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIHZhbGlkIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBmb3VuZC5cbiAgICB9IGVsc2UgaWYgKChsZW5ndGggPSBnZXRJbnQobGluRGljdCwgXCJMXCIpKSAhPT0gc3RyZWFtLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIFwiTFwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5ICcgK1xuICAgICAgICAgIFwiZG9lcyBub3QgZXF1YWwgdGhlIHN0cmVhbSBsZW5ndGguXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsZW5ndGgsXG4gICAgICBoaW50czogZ2V0SGludHMobGluRGljdCksXG4gICAgICBvYmplY3ROdW1iZXJGaXJzdDogZ2V0SW50KGxpbkRpY3QsIFwiT1wiKSxcbiAgICAgIGVuZEZpcnN0OiBnZXRJbnQobGluRGljdCwgXCJFXCIpLFxuICAgICAgbnVtUGFnZXM6IGdldEludChsaW5EaWN0LCBcIk5cIiksXG4gICAgICBtYWluWFJlZkVudHJpZXNPZmZzZXQ6IGdldEludChsaW5EaWN0LCBcIlRcIiksXG4gICAgICBwYWdlRmlyc3Q6IGxpbkRpY3QuaGFzKFwiUFwiKVxuICAgICAgICA/IGdldEludChsaW5EaWN0LCBcIlBcIiwgLyogYWxsb3daZXJvVmFsdWUgPSAqLyB0cnVlKVxuICAgICAgICA6IDAsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgeyBMZXhlciwgTGluZWFyaXphdGlvbiwgUGFyc2VyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIENvcHlyaWdodCAxOTk2LTIwMDMgR2x5cGggJiBDb2csIExMQ1xuICpcbiAqIFRoZSBmbGF0ZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIEphdmFTY3JpcHQgcG9ydFxuICogb2YgWFBERidzIGltcGxlbWVudGF0aW9uLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZVxuICogbGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGb3JtYXRFcnJvciwgc3RyaW5nVG9CeXRlcywgdW5yZWFjaGFibGUgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IGlzRGljdCB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IGlzV2hpdGVTcGFjZSB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxudmFyIFN0cmVhbSA9IChmdW5jdGlvbiBTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIFN0cmVhbShhcnJheUJ1ZmZlciwgc3RhcnQsIGxlbmd0aCwgZGljdCkge1xuICAgIHRoaXMuYnl0ZXMgPVxuICAgICAgYXJyYXlCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICAgID8gYXJyYXlCdWZmZXJcbiAgICAgICAgOiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIHRoaXMuZW5kID0gc3RhcnQgKyBsZW5ndGggfHwgdGhpcy5ieXRlcy5sZW5ndGg7XG4gICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgfVxuXG4gIC8vIHJlcXVpcmVkIG1ldGhvZHMgZm9yIGEgc3RyZWFtLiBpZiBhIHBhcnRpY3VsYXIgc3RyZWFtIGRvZXMgbm90XG4gIC8vIGltcGxlbWVudCB0aGVzZSwgYW4gZXJyb3Igc2hvdWxkIGJlIHRocm93blxuICBTdHJlYW0ucHJvdG90eXBlID0ge1xuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmQgLSB0aGlzLnN0YXJ0O1xuICAgIH0sXG4gICAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7XG4gICAgfSxcbiAgICBnZXRCeXRlOiBmdW5jdGlvbiBTdHJlYW1fZ2V0Qnl0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmVuZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLnBvcysrXTtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gU3RyZWFtX2dldFVpbnQxNigpIHtcbiAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gU3RyZWFtX2dldEludDMyKCkge1xuICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIHZhciBiMiA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgdmFyIGIzID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMztcbiAgICB9LFxuICAgIC8vIFJldHVybnMgc3ViYXJyYXkgb2Ygb3JpZ2luYWwgYnVmZmVyLCBzaG91bGQgb25seSBiZSByZWFkLlxuICAgIGdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkID0gZmFsc2UpIHtcbiAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7XG4gICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICB2YXIgc3RyRW5kID0gdGhpcy5lbmQ7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpO1xuICAgICAgICAvLyBgdGhpcy5ieXRlc2AgaXMgYWx3YXlzIGEgYFVpbnQ4QXJyYXlgIGhlcmUuXG4gICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gICAgICB9XG4gICAgICB2YXIgZW5kID0gcG9zICsgbGVuZ3RoO1xuICAgICAgaWYgKGVuZCA+IHN0ckVuZCkge1xuICAgICAgICBlbmQgPSBzdHJFbmQ7XG4gICAgICB9XG4gICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgIGNvbnN0IHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpO1xuICAgICAgLy8gYHRoaXMuYnl0ZXNgIGlzIGFsd2F5cyBhIGBVaW50OEFycmF5YCBoZXJlLlxuICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTtcbiAgICB9LFxuICAgIHBlZWtCeXRlOiBmdW5jdGlvbiBTdHJlYW1fcGVla0J5dGUoKSB7XG4gICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgaWYgKHBlZWtlZEJ5dGUgIT09IC0xKSB7XG4gICAgICAgIHRoaXMucG9zLS07XG4gICAgICB9XG4gICAgICByZXR1cm4gcGVla2VkQnl0ZTtcbiAgICB9LFxuICAgIHBlZWtCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCA9IGZhbHNlKSB7XG4gICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTtcbiAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDtcbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9LFxuXG4gICAgZ2V0Qnl0ZVJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICAgIGlmIChiZWdpbiA8IDApIHtcbiAgICAgICAgYmVnaW4gPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCA+IHRoaXMuZW5kKSB7XG4gICAgICAgIGVuZCA9IHRoaXMuZW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uIFN0cmVhbV9za2lwKG4pIHtcbiAgICAgIGlmICghbikge1xuICAgICAgICBuID0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMucG9zICs9IG47XG4gICAgfSxcbiAgICByZXNldDogZnVuY3Rpb24gU3RyZWFtX3Jlc2V0KCkge1xuICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIH0sXG4gICAgbW92ZVN0YXJ0OiBmdW5jdGlvbiBTdHJlYW1fbW92ZVN0YXJ0KCkge1xuICAgICAgdGhpcy5zdGFydCA9IHRoaXMucG9zO1xuICAgIH0sXG4gICAgbWFrZVN1YlN0cmVhbTogZnVuY3Rpb24gU3RyZWFtX21ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCkge1xuICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIFN0cmVhbTtcbn0pKCk7XG5cbnZhciBTdHJpbmdTdHJlYW0gPSAoZnVuY3Rpb24gU3RyaW5nU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBTdHJpbmdTdHJlYW0oc3RyKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBzdHJpbmdUb0J5dGVzKHN0cik7XG4gICAgU3RyZWFtLmNhbGwodGhpcywgYnl0ZXMpO1xuICB9XG5cbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZSA9IFN0cmVhbS5wcm90b3R5cGU7XG5cbiAgcmV0dXJuIFN0cmluZ1N0cmVhbTtcbn0pKCk7XG5cbi8vIHN1cGVyIGNsYXNzIGZvciB0aGUgZGVjb2Rpbmcgc3RyZWFtc1xudmFyIERlY29kZVN0cmVhbSA9IChmdW5jdGlvbiBEZWNvZGVTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBMb3RzIG9mIERlY29kZVN0cmVhbXMgYXJlIGNyZWF0ZWQgd2hvc2UgYnVmZmVycyBhcmUgbmV2ZXIgdXNlZC4gIEZvciB0aGVzZVxuICAvLyB3ZSBzaGFyZSBhIHNpbmdsZSBlbXB0eSBidWZmZXIuIFRoaXMgaXMgKGEpIHNwYWNlLWVmZmljaWVudCBhbmQgKGIpIGF2b2lkc1xuICAvLyBoYXZpbmcgc3BlY2lhbCBjYXNlcyB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkIGlmIHdlIHVzZWQgfG51bGx8IGZvciBhbiBlbXB0eVxuICAvLyBidWZmZXIuXG4gIHZhciBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gRGVjb2RlU3RyZWFtKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7XG4gICAgdGhpcy5fcmF3TWluQnVmZmVyTGVuZ3RoID0gbWF5YmVNaW5CdWZmZXJMZW5ndGggfHwgMDtcblxuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgdGhpcy5lb2YgPSBmYWxzZTtcbiAgICB0aGlzLmJ1ZmZlciA9IGVtcHR5QnVmZmVyO1xuICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoID0gNTEyO1xuICAgIGlmIChtYXliZU1pbkJ1ZmZlckxlbmd0aCkge1xuICAgICAgLy8gQ29tcHV0ZSB0aGUgZmlyc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgYXMgYmlnIGFzIG1heWJlTWluQnVmZmVyTGVuZ3RoLlxuICAgICAgd2hpbGUgKHRoaXMubWluQnVmZmVyTGVuZ3RoIDwgbWF5YmVNaW5CdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggKj0gMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlID0ge1xuICAgIGdldCBpc0VtcHR5KCkge1xuICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwO1xuICAgIH0sXG4gICAgZW5zdXJlQnVmZmVyOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgaWYgKHJlcXVlc3RlZCA8PSBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgfVxuICAgICAgdmFyIHNpemUgPSB0aGlzLm1pbkJ1ZmZlckxlbmd0aDtcbiAgICAgIHdoaWxlIChzaXplIDwgcmVxdWVzdGVkKSB7XG4gICAgICAgIHNpemUgKj0gMjtcbiAgICAgIH1cbiAgICAgIHZhciBidWZmZXIyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICBidWZmZXIyLnNldChidWZmZXIpO1xuICAgICAgcmV0dXJuICh0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjIpO1xuICAgIH0sXG4gICAgZ2V0Qnl0ZTogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2dldEJ5dGUoKSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gcG9zKSB7XG4gICAgICAgIGlmICh0aGlzLmVvZikge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdO1xuICAgIH0sXG4gICAgZ2V0VWludDE2OiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0VWludDE2KCkge1xuICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTtcbiAgICB9LFxuICAgIGdldEludDMyOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0SW50MzIoKSB7XG4gICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgdmFyIGIyID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzO1xuICAgIH0sXG4gICAgZ2V0Qnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkge1xuICAgICAgdmFyIGVuZCxcbiAgICAgICAgcG9zID0gdGhpcy5wb3M7XG5cbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuZ3RoKTtcbiAgICAgICAgZW5kID0gcG9zICsgbGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPCBlbmQpIHtcbiAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA+IGJ1ZkVuZCkge1xuICAgICAgICAgIGVuZCA9IGJ1ZkVuZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmVvZikge1xuICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgY29uc3Qgc3ViYXJyYXkgPSB0aGlzLmJ1ZmZlci5zdWJhcnJheShwb3MsIGVuZCk7XG4gICAgICAvLyBgdGhpcy5idWZmZXJgIGlzIGVpdGhlciBhIGBVaW50OEFycmF5YCBvciBgVWludDhDbGFtcGVkQXJyYXlgIGhlcmUuXG4gICAgICByZXR1cm4gZm9yY2VDbGFtcGVkICYmICEoc3ViYXJyYXkgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlcbiAgICAgICAgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpXG4gICAgICAgIDogc3ViYXJyYXk7XG4gICAgfSxcbiAgICBwZWVrQnl0ZTogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3BlZWtCeXRlKCkge1xuICAgICAgdmFyIHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgIGlmIChwZWVrZWRCeXRlICE9PSAtMSkge1xuICAgICAgICB0aGlzLnBvcy0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7XG4gICAgfSxcbiAgICBwZWVrQnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkge1xuICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7XG4gICAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfSxcbiAgICBtYWtlU3ViU3RyZWFtOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0KSB7XG4gICAgICB2YXIgZW5kID0gc3RhcnQgKyBsZW5ndGg7XG4gICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gZW5kICYmICF0aGlzLmVvZikge1xuICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpO1xuICAgIH0sXG5cbiAgICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgRGVjb2RlU3RyZWFtLmdldEJ5dGVSYW5nZVwiKTtcbiAgICB9LFxuXG4gICAgc2tpcDogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3NraXAobikge1xuICAgICAgaWYgKCFuKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5wb3MgKz0gbjtcbiAgICB9LFxuICAgIHJlc2V0OiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fcmVzZXQoKSB7XG4gICAgICB0aGlzLnBvcyA9IDA7XG4gICAgfSxcbiAgICBnZXRCYXNlU3RyZWFtczogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2dldEJhc2VTdHJlYW1zKCkge1xuICAgICAgaWYgKHRoaXMuc3RyICYmIHRoaXMuc3RyLmdldEJhc2VTdHJlYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIERlY29kZVN0cmVhbTtcbn0pKCk7XG5cbnZhciBTdHJlYW1zU2VxdWVuY2VTdHJlYW0gPSAoZnVuY3Rpb24gU3RyZWFtc1NlcXVlbmNlU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBTdHJlYW1zU2VxdWVuY2VTdHJlYW0oc3RyZWFtcykge1xuICAgIHRoaXMuc3RyZWFtcyA9IHN0cmVhbXM7XG5cbiAgICBsZXQgbWF5YmVMZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0cmVhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1tpXTtcbiAgICAgIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEZWNvZGVTdHJlYW0pIHtcbiAgICAgICAgbWF5YmVMZW5ndGggKz0gc3RyZWFtLl9yYXdNaW5CdWZmZXJMZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXliZUxlbmd0aCArPSBzdHJlYW0ubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7XG4gIH1cblxuICBTdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtcblxuICBTdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIHN0cmVhbVNlcXVlbmNlU3RyZWFtUmVhZEJsb2NrKCkge1xuICAgIHZhciBzdHJlYW1zID0gdGhpcy5zdHJlYW1zO1xuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpO1xuICAgIHZhciBjaHVuayA9IHN0cmVhbS5nZXRCeXRlcygpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICB2YXIgbmV3TGVuZ3RoID0gYnVmZmVyTGVuZ3RoICsgY2h1bmsubGVuZ3RoO1xuICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihuZXdMZW5ndGgpO1xuICAgIGJ1ZmZlci5zZXQoY2h1bmssIGJ1ZmZlckxlbmd0aCk7XG4gICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7XG4gIH07XG5cbiAgU3RyZWFtc1NlcXVlbmNlU3RyZWFtLnByb3RvdHlwZS5nZXRCYXNlU3RyZWFtcyA9IGZ1bmN0aW9uIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbV9nZXRCYXNlU3RyZWFtcygpIHtcbiAgICB2YXIgYmFzZVN0cmVhbXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLnN0cmVhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtc1tpXTtcbiAgICAgIGlmIChzdHJlYW0uZ2V0QmFzZVN0cmVhbXMpIHtcbiAgICAgICAgYmFzZVN0cmVhbXMucHVzaCguLi5zdHJlYW0uZ2V0QmFzZVN0cmVhbXMoKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXNlU3RyZWFtcztcbiAgfTtcblxuICByZXR1cm4gU3RyZWFtc1NlcXVlbmNlU3RyZWFtO1xufSkoKTtcblxudmFyIEZsYXRlU3RyZWFtID0gKGZ1bmN0aW9uIEZsYXRlU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBjb2RlTGVuQ29kZU1hcCA9IG5ldyBJbnQzMkFycmF5KFtcbiAgICAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1XG4gIF0pO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsXG4gICAgMHgxMDAwYiwgMHgxMDAwZCwgMHgxMDAwZiwgMHgxMDAxMSwgMHgyMDAxMywgMHgyMDAxNywgMHgyMDAxYiwgMHgyMDAxZixcbiAgICAweDMwMDIzLCAweDMwMDJiLCAweDMwMDMzLCAweDMwMDNiLCAweDQwMDQzLCAweDQwMDUzLCAweDQwMDYzLCAweDQwMDczLFxuICAgIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJcbiAgXSk7XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBkaXN0RGVjb2RlID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDB4MDAwMDEsIDB4MDAwMDIsIDB4MDAwMDMsIDB4MDAwMDQsIDB4MTAwMDUsIDB4MTAwMDcsIDB4MjAwMDksIDB4MjAwMGQsXG4gICAgMHgzMDAxMSwgMHgzMDAxOSwgMHg0MDAyMSwgMHg0MDAzMSwgMHg1MDA0MSwgMHg1MDA2MSwgMHg2MDA4MSwgMHg2MDBjMSxcbiAgICAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLFxuICAgIDB4YjEwMDEsIDB4YjE4MDEsIDB4YzIwMDEsIDB4YzMwMDEsIDB4ZDQwMDEsIDB4ZDYwMDFcbiAgXSk7XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBmaXhlZExpdENvZGVUYWIgPSBbbmV3IEludDMyQXJyYXkoW1xuICAgIDB4NzAxMDAsIDB4ODAwNTAsIDB4ODAwMTAsIDB4ODAxMTgsIDB4NzAxMTAsIDB4ODAwNzAsIDB4ODAwMzAsIDB4OTAwYzAsXG4gICAgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMCwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMCxcbiAgICAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkwLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQwLFxuICAgIDB4NzAxMGMsIDB4ODAwNjgsIDB4ODAwMjgsIDB4OTAwYjAsIDB4ODAwMDgsIDB4ODAwODgsIDB4ODAwNDgsIDB4OTAwZjAsXG4gICAgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOCxcbiAgICAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE4LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU4LFxuICAgIDB4NzAxMDYsIDB4ODAwNWMsIDB4ODAwMWMsIDB4OTAwOTgsIDB4NzAxMTYsIDB4ODAwN2MsIDB4ODAwM2MsIDB4OTAwZDgsXG4gICAgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOCwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOCxcbiAgICAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM0LFxuICAgIDB4NzAxMDksIDB4ODAwNjIsIDB4ODAwMjIsIDB4OTAwYTQsIDB4ODAwMDIsIDB4ODAwODIsIDB4ODAwNDIsIDB4OTAwZTQsXG4gICAgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NCwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNCxcbiAgICAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI0LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY0LFxuICAgIDB4NzAxMDMsIDB4ODAwNTYsIDB4ODAwMTYsIDB4ODAxMWUsIDB4NzAxMTMsIDB4ODAwNzYsIDB4ODAwMzYsIDB4OTAwY2MsXG4gICAgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhYywgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlYyxcbiAgICAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDljLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRjLFxuICAgIDB4NzAxMGYsIDB4ODAwNmUsIDB4ODAwMmUsIDB4OTAwYmMsIDB4ODAwMGUsIDB4ODAwOGUsIDB4ODAwNGUsIDB4OTAwZmMsXG4gICAgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMixcbiAgICAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEyLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUyLFxuICAgIDB4NzAxMDQsIDB4ODAwNTksIDB4ODAwMTksIDB4OTAwOTIsIDB4NzAxMTQsIDB4ODAwNzksIDB4ODAwMzksIDB4OTAwZDIsXG4gICAgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMiwgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMixcbiAgICAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNhLFxuICAgIDB4NzAxMGEsIDB4ODAwNjUsIDB4ODAwMjUsIDB4OTAwYWEsIDB4ODAwMDUsIDB4ODAwODUsIDB4ODAwNDUsIDB4OTAwZWEsXG4gICAgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YSwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYSxcbiAgICAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJhLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZhLFxuICAgIDB4NzAxMDEsIDB4ODAwNTMsIDB4ODAwMTMsIDB4ODAxMWIsIDB4NzAxMTEsIDB4ODAwNzMsIDB4ODAwMzMsIDB4OTAwYzYsXG4gICAgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNiwgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNixcbiAgICAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk2LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ2LFxuICAgIDB4NzAxMGQsIDB4ODAwNmIsIDB4ODAwMmIsIDB4OTAwYjYsIDB4ODAwMGIsIDB4ODAwOGIsIDB4ODAwNGIsIDB4OTAwZjYsXG4gICAgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZSxcbiAgICAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFlLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVlLFxuICAgIDB4NzAxMDcsIDB4ODAwNWYsIDB4ODAwMWYsIDB4OTAwOWUsIDB4NzAxMTcsIDB4ODAwN2YsIDB4ODAwM2YsIDB4OTAwZGUsXG4gICAgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZSwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZSxcbiAgICAweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMxLFxuICAgIDB4NzAxMDgsIDB4ODAwNjAsIDB4ODAwMjAsIDB4OTAwYTEsIDB4ODAwMDAsIDB4ODAwODAsIDB4ODAwNDAsIDB4OTAwZTEsXG4gICAgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MSwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMSxcbiAgICAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIxLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYxLFxuICAgIDB4NzAxMDIsIDB4ODAwNTQsIDB4ODAwMTQsIDB4ODAxMWMsIDB4NzAxMTIsIDB4ODAwNzQsIDB4ODAwMzQsIDB4OTAwYzksXG4gICAgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOSwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOSxcbiAgICAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk5LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ5LFxuICAgIDB4NzAxMGUsIDB4ODAwNmMsIDB4ODAwMmMsIDB4OTAwYjksIDB4ODAwMGMsIDB4ODAwOGMsIDB4ODAwNGMsIDB4OTAwZjksXG4gICAgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNSxcbiAgICAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE1LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU1LFxuICAgIDB4NzAxMDUsIDB4ODAwNWEsIDB4ODAwMWEsIDB4OTAwOTUsIDB4NzAxMTUsIDB4ODAwN2EsIDB4ODAwM2EsIDB4OTAwZDUsXG4gICAgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNSwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNSxcbiAgICAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNkLFxuICAgIDB4NzAxMGIsIDB4ODAwNjYsIDB4ODAwMjYsIDB4OTAwYWQsIDB4ODAwMDYsIDB4ODAwODYsIDB4ODAwNDYsIDB4OTAwZWQsXG4gICAgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5ZCwgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkZCxcbiAgICAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJkLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZkLFxuICAgIDB4NzAxMDAsIDB4ODAwNTEsIDB4ODAwMTEsIDB4ODAxMTksIDB4NzAxMTAsIDB4ODAwNzEsIDB4ODAwMzEsIDB4OTAwYzMsXG4gICAgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMywgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMyxcbiAgICAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkzLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQzLFxuICAgIDB4NzAxMGMsIDB4ODAwNjksIDB4ODAwMjksIDB4OTAwYjMsIDB4ODAwMDksIDB4ODAwODksIDB4ODAwNDksIDB4OTAwZjMsXG4gICAgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYixcbiAgICAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFiLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGViLFxuICAgIDB4NzAxMDYsIDB4ODAwNWQsIDB4ODAwMWQsIDB4OTAwOWIsIDB4NzAxMTYsIDB4ODAwN2QsIDB4ODAwM2QsIDB4OTAwZGIsXG4gICAgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYiwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYixcbiAgICAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM3LFxuICAgIDB4NzAxMDksIDB4ODAwNjMsIDB4ODAwMjMsIDB4OTAwYTcsIDB4ODAwMDMsIDB4ODAwODMsIDB4ODAwNDMsIDB4OTAwZTcsXG4gICAgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NywgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNyxcbiAgICAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI3LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY3LFxuICAgIDB4NzAxMDMsIDB4ODAwNTcsIDB4ODAwMTcsIDB4ODAxMWYsIDB4NzAxMTMsIDB4ODAwNzcsIDB4ODAwMzcsIDB4OTAwY2YsXG4gICAgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZiwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZixcbiAgICAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDlmLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRmLFxuICAgIDB4NzAxMGYsIDB4ODAwNmYsIDB4ODAwMmYsIDB4OTAwYmYsIDB4ODAwMGYsIDB4ODAwOGYsIDB4ODAwNGYsIDB4OTAwZmZcbiAgXSksIDldO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbXG4gICAgMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYyxcbiAgICAweDUwMDAyLCAweDUwMDEyLCAweDUwMDBhLCAweDUwMDFhLCAweDUwMDA2LCAweDUwMDE2LCAweDUwMDBlLCAweDAwMDAwLFxuICAgIDB4NTAwMDEsIDB4NTAwMTEsIDB4NTAwMDksIDB4NTAwMTksIDB4NTAwMDUsIDB4NTAwMTUsIDB4NTAwMGQsIDB4NTAwMWQsXG4gICAgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMFxuICBdKSwgNV07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBGbGF0ZVN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7XG5cbiAgICB2YXIgY21mID0gc3RyLmdldEJ5dGUoKTtcbiAgICB2YXIgZmxnID0gc3RyLmdldEJ5dGUoKTtcbiAgICBpZiAoY21mID09PSAtMSB8fCBmbGcgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTtcbiAgICB9XG4gICAgaWYgKChjbWYgJiAweDBmKSAhPT0gMHgwOCkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICBgVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICgoKGNtZiA8PCA4KSArIGZsZykgJSAzMSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBCYWQgRkNIRUNLIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTtcbiAgICB9XG4gICAgaWYgKGZsZyAmIDB4MjApIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlU2l6ZSA9IDA7XG4gICAgdGhpcy5jb2RlQnVmID0gMDtcblxuICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTtcbiAgfVxuXG4gIEZsYXRlU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7XG5cbiAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldEJpdHMgPSBmdW5jdGlvbiBGbGF0ZVN0cmVhbV9nZXRCaXRzKGJpdHMpIHtcbiAgICB2YXIgc3RyID0gdGhpcy5zdHI7XG4gICAgdmFyIGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTtcbiAgICB2YXIgY29kZUJ1ZiA9IHRoaXMuY29kZUJ1ZjtcblxuICAgIHZhciBiO1xuICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJpdHMpIHtcbiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtXCIpO1xuICAgICAgfVxuICAgICAgY29kZUJ1ZiB8PSBiIDw8IGNvZGVTaXplO1xuICAgICAgY29kZVNpemUgKz0gODtcbiAgICB9XG4gICAgYiA9IGNvZGVCdWYgJiAoKDEgPDwgYml0cykgLSAxKTtcbiAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGJpdHM7XG4gICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC09IGJpdHM7XG5cbiAgICByZXR1cm4gYjtcbiAgfTtcblxuICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29kZSA9IGZ1bmN0aW9uIEZsYXRlU3RyZWFtX2dldENvZGUodGFibGUpIHtcbiAgICB2YXIgc3RyID0gdGhpcy5zdHI7XG4gICAgdmFyIGNvZGVzID0gdGFibGVbMF07XG4gICAgdmFyIG1heExlbiA9IHRhYmxlWzFdO1xuICAgIHZhciBjb2RlU2l6ZSA9IHRoaXMuY29kZVNpemU7XG4gICAgdmFyIGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7XG5cbiAgICB2YXIgYjtcbiAgICB3aGlsZSAoY29kZVNpemUgPCBtYXhMZW4pIHtcbiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAvLyBwcmVtYXR1cmUgZW5kIG9mIHN0cmVhbS4gY29kZSBtaWdodCBob3dldmVyIHN0aWxsIGJlIHZhbGlkLlxuICAgICAgICAvLyBjb2RlU2l6ZSA8IGNvZGVMZW4gY2hlY2sgYmVsb3cgZ3VhcmRzIGFnYWluc3QgaW5jb21wbGV0ZSBjb2RlVmFsLlxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTtcbiAgICAgIGNvZGVTaXplICs9IDg7XG4gICAgfVxuICAgIHZhciBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgoMSA8PCBtYXhMZW4pIC0gMSldO1xuICAgIHZhciBjb2RlTGVuID0gY29kZSA+PiAxNjtcbiAgICB2YXIgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7XG4gICAgaWYgKGNvZGVMZW4gPCAxIHx8IGNvZGVTaXplIDwgY29kZUxlbikge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbVwiKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBjb2RlTGVuO1xuICAgIHRoaXMuY29kZVNpemUgPSBjb2RlU2l6ZSAtIGNvZGVMZW47XG4gICAgcmV0dXJuIGNvZGVWYWw7XG4gIH07XG5cbiAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdlbmVyYXRlSHVmZm1hblRhYmxlID0gZnVuY3Rpb24gZmxhdGVTdHJlYW1HZW5lcmF0ZUh1ZmZtYW5UYWJsZShcbiAgICBsZW5ndGhzXG4gICkge1xuICAgIHZhciBuID0gbGVuZ3Rocy5sZW5ndGg7XG5cbiAgICAvLyBmaW5kIG1heCBjb2RlIGxlbmd0aFxuICAgIHZhciBtYXhMZW4gPSAwO1xuICAgIHZhciBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChsZW5ndGhzW2ldID4gbWF4TGVuKSB7XG4gICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYnVpbGQgdGhlIHRhYmxlXG4gICAgdmFyIHNpemUgPSAxIDw8IG1heExlbjtcbiAgICB2YXIgY29kZXMgPSBuZXcgSW50MzJBcnJheShzaXplKTtcbiAgICBmb3IgKFxuICAgICAgdmFyIGxlbiA9IDEsIGNvZGUgPSAwLCBza2lwID0gMjtcbiAgICAgIGxlbiA8PSBtYXhMZW47XG4gICAgICArK2xlbiwgY29kZSA8PD0gMSwgc2tpcCA8PD0gMVxuICAgICkge1xuICAgICAgZm9yICh2YXIgdmFsID0gMDsgdmFsIDwgbjsgKyt2YWwpIHtcbiAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7XG4gICAgICAgICAgLy8gYml0LXJldmVyc2UgdGhlIGNvZGVcbiAgICAgICAgICB2YXIgY29kZTIgPSAwO1xuICAgICAgICAgIHZhciB0ID0gY29kZTtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUyID0gKGNvZGUyIDw8IDEpIHwgKHQgJiAxKTtcbiAgICAgICAgICAgIHQgPj49IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmlsbCB0aGUgdGFibGUgZW50cmllc1xuICAgICAgICAgIGZvciAoaSA9IGNvZGUyOyBpIDwgc2l6ZTsgaSArPSBza2lwKSB7XG4gICAgICAgICAgICBjb2Rlc1tpXSA9IChsZW4gPDwgMTYpIHwgdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICArK2NvZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dO1xuICB9O1xuXG4gIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBGbGF0ZVN0cmVhbV9yZWFkQmxvY2soKSB7XG4gICAgdmFyIGJ1ZmZlciwgbGVuO1xuICAgIHZhciBzdHIgPSB0aGlzLnN0cjtcbiAgICAvLyByZWFkIGJsb2NrIGhlYWRlclxuICAgIHZhciBoZHIgPSB0aGlzLmdldEJpdHMoMyk7XG4gICAgaWYgKGhkciAmIDEpIHtcbiAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICB9XG4gICAgaGRyID4+PSAxO1xuXG4gICAgaWYgKGhkciA9PT0gMCkge1xuICAgICAgLy8gdW5jb21wcmVzc2VkIGJsb2NrXG4gICAgICB2YXIgYjtcblxuICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtXCIpO1xuICAgICAgfVxuICAgICAgdmFyIGJsb2NrTGVuID0gYjtcbiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbVwiKTtcbiAgICAgIH1cbiAgICAgIGJsb2NrTGVuIHw9IGIgPDwgODtcbiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbVwiKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGVjayA9IGI7XG4gICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW1cIik7XG4gICAgICB9XG4gICAgICBjaGVjayB8PSBiIDw8IDg7XG4gICAgICBpZiAoY2hlY2sgIT09ICh+YmxvY2tMZW4gJiAweGZmZmYpICYmIChibG9ja0xlbiAhPT0gMCB8fCBjaGVjayAhPT0gMCkpIHtcbiAgICAgICAgLy8gSWdub3JpbmcgZXJyb3IgZm9yIGJhZCBcImVtcHR5XCIgYmxvY2sgKHNlZSBpc3N1ZSAxMjc3KVxuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYWQgdW5jb21wcmVzc2VkIGJsb2NrIGxlbmd0aCBpbiBmbGF0ZSBzdHJlYW1cIik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29kZUJ1ZiA9IDA7XG4gICAgICB0aGlzLmNvZGVTaXplID0gMDtcblxuICAgICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGgsXG4gICAgICAgIGVuZCA9IGJ1ZmZlckxlbmd0aCArIGJsb2NrTGVuO1xuICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoZW5kKTtcbiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gZW5kO1xuXG4gICAgICBpZiAoYmxvY2tMZW4gPT09IDApIHtcbiAgICAgICAgaWYgKHN0ci5wZWVrQnl0ZSgpID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSBzdHIuZ2V0Qnl0ZXMoYmxvY2tMZW4pO1xuICAgICAgICBidWZmZXIuc2V0KGJsb2NrLCBidWZmZXJMZW5ndGgpO1xuICAgICAgICBpZiAoYmxvY2subGVuZ3RoIDwgYmxvY2tMZW4pIHtcbiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbGl0Q29kZVRhYmxlO1xuICAgIHZhciBkaXN0Q29kZVRhYmxlO1xuICAgIGlmIChoZHIgPT09IDEpIHtcbiAgICAgIC8vIGNvbXByZXNzZWQgYmxvY2ssIGZpeGVkIGNvZGVzXG4gICAgICBsaXRDb2RlVGFibGUgPSBmaXhlZExpdENvZGVUYWI7XG4gICAgICBkaXN0Q29kZVRhYmxlID0gZml4ZWREaXN0Q29kZVRhYjtcbiAgICB9IGVsc2UgaWYgKGhkciA9PT0gMikge1xuICAgICAgLy8gY29tcHJlc3NlZCBibG9jaywgZHluYW1pYyBjb2Rlc1xuICAgICAgdmFyIG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3O1xuICAgICAgdmFyIG51bURpc3RDb2RlcyA9IHRoaXMuZ2V0Qml0cyg1KSArIDE7XG4gICAgICB2YXIgbnVtQ29kZUxlbkNvZGVzID0gdGhpcy5nZXRCaXRzKDQpICsgNDtcblxuICAgICAgLy8gYnVpbGQgdGhlIGNvZGUgbGVuZ3RocyBjb2RlIHRhYmxlXG4gICAgICB2YXIgY29kZUxlbkNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbkNvZGVNYXAubGVuZ3RoKTtcblxuICAgICAgdmFyIGk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29kZUxlbkNvZGVzOyArK2kpIHtcbiAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTtcbiAgICAgIH1cbiAgICAgIHZhciBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTtcblxuICAgICAgLy8gYnVpbGQgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGUgdGFibGVzXG4gICAgICBsZW4gPSAwO1xuICAgICAgaSA9IDA7XG4gICAgICB2YXIgY29kZXMgPSBudW1MaXRDb2RlcyArIG51bURpc3RDb2RlcztcbiAgICAgIHZhciBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGNvZGVzKTtcbiAgICAgIHZhciBiaXRzTGVuZ3RoLCBiaXRzT2Zmc2V0LCB3aGF0O1xuICAgICAgd2hpbGUgKGkgPCBjb2Rlcykge1xuICAgICAgICB2YXIgY29kZSA9IHRoaXMuZ2V0Q29kZShjb2RlTGVuQ29kZVRhYik7XG4gICAgICAgIGlmIChjb2RlID09PSAxNikge1xuICAgICAgICAgIGJpdHNMZW5ndGggPSAyO1xuICAgICAgICAgIGJpdHNPZmZzZXQgPSAzO1xuICAgICAgICAgIHdoYXQgPSBsZW47XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTcpIHtcbiAgICAgICAgICBiaXRzTGVuZ3RoID0gMztcbiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMztcbiAgICAgICAgICB3aGF0ID0gbGVuID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAxOCkge1xuICAgICAgICAgIGJpdHNMZW5ndGggPSA3O1xuICAgICAgICAgIGJpdHNPZmZzZXQgPSAxMTtcbiAgICAgICAgICB3aGF0ID0gbGVuID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gbGVuID0gY29kZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXBlYXRMZW5ndGggPSB0aGlzLmdldEJpdHMoYml0c0xlbmd0aCkgKyBiaXRzT2Zmc2V0O1xuICAgICAgICB3aGlsZSAocmVwZWF0TGVuZ3RoLS0gPiAwKSB7XG4gICAgICAgICAgY29kZUxlbmd0aHNbaSsrXSA9IHdoYXQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGl0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShcbiAgICAgICAgY29kZUxlbmd0aHMuc3ViYXJyYXkoMCwgbnVtTGl0Q29kZXMpXG4gICAgICApO1xuICAgICAgZGlzdENvZGVUYWJsZSA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoXG4gICAgICAgIGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gYmxvY2sgdHlwZSBpbiBmbGF0ZSBzdHJlYW1cIik7XG4gICAgfVxuXG4gICAgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgdmFyIGxpbWl0ID0gYnVmZmVyID8gYnVmZmVyLmxlbmd0aCA6IDA7XG4gICAgdmFyIHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgY29kZTEgPSB0aGlzLmdldENvZGUobGl0Q29kZVRhYmxlKTtcbiAgICAgIGlmIChjb2RlMSA8IDI1Nikge1xuICAgICAgICBpZiAocG9zICsgMSA+PSBsaW1pdCkge1xuICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIDEpO1xuICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJbcG9zKytdID0gY29kZTE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUxID09PSAyNTYpIHtcbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvZGUxIC09IDI1NztcbiAgICAgIGNvZGUxID0gbGVuZ3RoRGVjb2RlW2NvZGUxXTtcbiAgICAgIHZhciBjb2RlMiA9IGNvZGUxID4+IDE2O1xuICAgICAgaWYgKGNvZGUyID4gMCkge1xuICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7XG4gICAgICB9XG4gICAgICBsZW4gPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7XG4gICAgICBjb2RlMSA9IHRoaXMuZ2V0Q29kZShkaXN0Q29kZVRhYmxlKTtcbiAgICAgIGNvZGUxID0gZGlzdERlY29kZVtjb2RlMV07XG4gICAgICBjb2RlMiA9IGNvZGUxID4+IDE2O1xuICAgICAgaWYgKGNvZGUyID4gMCkge1xuICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7XG4gICAgICB9XG4gICAgICB2YXIgZGlzdCA9IChjb2RlMSAmIDB4ZmZmZikgKyBjb2RlMjtcbiAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHtcbiAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuKTtcbiAgICAgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBsZW47ICsraywgKytwb3MpIHtcbiAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gZGlzdF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGbGF0ZVN0cmVhbTtcbn0pKCk7XG5cbnZhciBQcmVkaWN0b3JTdHJlYW0gPSAoZnVuY3Rpb24gUHJlZGljdG9yU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBQcmVkaWN0b3JTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7XG4gICAgaWYgKCFpc0RpY3QocGFyYW1zKSkge1xuICAgICAgcmV0dXJuIHN0cjsgLy8gbm8gcHJlZGljdGlvblxuICAgIH1cbiAgICB2YXIgcHJlZGljdG9yID0gKHRoaXMucHJlZGljdG9yID0gcGFyYW1zLmdldChcIlByZWRpY3RvclwiKSB8fCAxKTtcblxuICAgIGlmIChwcmVkaWN0b3IgPD0gMSkge1xuICAgICAgcmV0dXJuIHN0cjsgLy8gbm8gcHJlZGljdGlvblxuICAgIH1cbiAgICBpZiAocHJlZGljdG9yICE9PSAyICYmIChwcmVkaWN0b3IgPCAxMCB8fCBwcmVkaWN0b3IgPiAxNSkpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAke3ByZWRpY3Rvcn1gKTtcbiAgICB9XG5cbiAgICBpZiAocHJlZGljdG9yID09PSAyKSB7XG4gICAgICB0aGlzLnJlYWRCbG9jayA9IHRoaXMucmVhZEJsb2NrVGlmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWFkQmxvY2sgPSB0aGlzLnJlYWRCbG9ja1BuZztcbiAgICB9XG5cbiAgICB0aGlzLnN0ciA9IHN0cjtcbiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDtcblxuICAgIHZhciBjb2xvcnMgPSAodGhpcy5jb2xvcnMgPSBwYXJhbXMuZ2V0KFwiQ29sb3JzXCIpIHx8IDEpO1xuICAgIHZhciBiaXRzID0gKHRoaXMuYml0cyA9IHBhcmFtcy5nZXQoXCJCaXRzUGVyQ29tcG9uZW50XCIpIHx8IDgpO1xuICAgIHZhciBjb2x1bW5zID0gKHRoaXMuY29sdW1ucyA9IHBhcmFtcy5nZXQoXCJDb2x1bW5zXCIpIHx8IDEpO1xuXG4gICAgdGhpcy5waXhCeXRlcyA9IChjb2xvcnMgKiBiaXRzICsgNykgPj4gMztcbiAgICB0aGlzLnJvd0J5dGVzID0gKGNvbHVtbnMgKiBjb2xvcnMgKiBiaXRzICsgNykgPj4gMztcblxuICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIFByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIFByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrVGlmZiA9IGZ1bmN0aW9uIHByZWRpY3RvclN0cmVhbVJlYWRCbG9ja1RpZmYoKSB7XG4gICAgdmFyIHJvd0J5dGVzID0gdGhpcy5yb3dCeXRlcztcblxuICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgcm93Qnl0ZXMpO1xuXG4gICAgdmFyIGJpdHMgPSB0aGlzLmJpdHM7XG4gICAgdmFyIGNvbG9ycyA9IHRoaXMuY29sb3JzO1xuXG4gICAgdmFyIHJhd0J5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMocm93Qnl0ZXMpO1xuICAgIHRoaXMuZW9mID0gIXJhd0J5dGVzLmxlbmd0aDtcbiAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5idWYgPSAwLFxuICAgICAgb3V0YnVmID0gMDtcbiAgICB2YXIgaW5iaXRzID0gMCxcbiAgICAgIG91dGJpdHMgPSAwO1xuICAgIHZhciBwb3MgPSBidWZmZXJMZW5ndGg7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoYml0cyA9PT0gMSAmJiBjb2xvcnMgPT09IDEpIHtcbiAgICAgIC8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBsb29wIGluIHRoZSBcImVsc2VcIi1icmFuY2hcbiAgICAgIC8vIGZvciAxIGJpdC1wZXItY29tcG9uZW50IGFuZCAxIGNvbG9yIFRJRkYgaW1hZ2VzLlxuICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSByYXdCeXRlc1tpXSBeIGluYnVmO1xuICAgICAgICBjIF49IGMgPj4gMTtcbiAgICAgICAgYyBePSBjID4+IDI7XG4gICAgICAgIGMgXj0gYyA+PiA0O1xuICAgICAgICBpbmJ1ZiA9IChjICYgMSkgPDwgNztcbiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChiaXRzID09PSA4KSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyArK2kpIHtcbiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHJhd0J5dGVzW2ldO1xuICAgICAgfVxuICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7XG4gICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGNvbG9yc10gKyByYXdCeXRlc1tpXTtcbiAgICAgICAgcG9zKys7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChiaXRzID09PSAxNikge1xuICAgICAgdmFyIGJ5dGVzUGVyUGl4ZWwgPSBjb2xvcnMgKiAyO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzUGVyUGl4ZWw7ICsraSkge1xuICAgICAgICBidWZmZXJbcG9zKytdID0gcmF3Qnl0ZXNbaV07XG4gICAgICB9XG4gICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyBpICs9IDIpIHtcbiAgICAgICAgdmFyIHN1bSA9XG4gICAgICAgICAgKChyYXdCeXRlc1tpXSAmIDB4ZmYpIDw8IDgpICtcbiAgICAgICAgICAocmF3Qnl0ZXNbaSArIDFdICYgMHhmZikgK1xuICAgICAgICAgICgoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWxdICYgMHhmZikgPDwgOCkgK1xuICAgICAgICAgIChidWZmZXJbcG9zIC0gYnl0ZXNQZXJQaXhlbCArIDFdICYgMHhmZik7XG4gICAgICAgIGJ1ZmZlcltwb3MrK10gPSAoc3VtID4+IDgpICYgMHhmZjtcbiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHN1bSAmIDB4ZmY7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjb21wQXJyYXkgPSBuZXcgVWludDhBcnJheShjb2xvcnMgKyAxKTtcbiAgICAgIHZhciBiaXRNYXNrID0gKDEgPDwgYml0cykgLSAxO1xuICAgICAgdmFyIGogPSAwLFxuICAgICAgICBrID0gYnVmZmVyTGVuZ3RoO1xuICAgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY29sdW1uczsgKytpKSB7XG4gICAgICAgIGZvciAodmFyIGtrID0gMDsga2sgPCBjb2xvcnM7ICsra2spIHtcbiAgICAgICAgICBpZiAoaW5iaXRzIDwgYml0cykge1xuICAgICAgICAgICAgaW5idWYgPSAoaW5idWYgPDwgOCkgfCAocmF3Qnl0ZXNbaisrXSAmIDB4ZmYpO1xuICAgICAgICAgICAgaW5iaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbXBBcnJheVtra10gPVxuICAgICAgICAgICAgKGNvbXBBcnJheVtra10gKyAoaW5idWYgPj4gKGluYml0cyAtIGJpdHMpKSkgJiBiaXRNYXNrO1xuICAgICAgICAgIGluYml0cyAtPSBiaXRzO1xuICAgICAgICAgIG91dGJ1ZiA9IChvdXRidWYgPDwgYml0cykgfCBjb21wQXJyYXlba2tdO1xuICAgICAgICAgIG91dGJpdHMgKz0gYml0cztcbiAgICAgICAgICBpZiAob3V0Yml0cyA+PSA4KSB7XG4gICAgICAgICAgICBidWZmZXJbaysrXSA9IChvdXRidWYgPj4gKG91dGJpdHMgLSA4KSkgJiAweGZmO1xuICAgICAgICAgICAgb3V0Yml0cyAtPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG91dGJpdHMgPiAwKSB7XG4gICAgICAgIGJ1ZmZlcltrKytdID1cbiAgICAgICAgICAob3V0YnVmIDw8ICg4IC0gb3V0Yml0cykpICsgKGluYnVmICYgKCgxIDw8ICg4IC0gb3V0Yml0cykpIC0gMSkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlcztcbiAgfTtcblxuICBQcmVkaWN0b3JTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9ja1BuZyA9IGZ1bmN0aW9uIHByZWRpY3RvclN0cmVhbVJlYWRCbG9ja1BuZygpIHtcbiAgICB2YXIgcm93Qnl0ZXMgPSB0aGlzLnJvd0J5dGVzO1xuICAgIHZhciBwaXhCeXRlcyA9IHRoaXMucGl4Qnl0ZXM7XG5cbiAgICB2YXIgcHJlZGljdG9yID0gdGhpcy5zdHIuZ2V0Qnl0ZSgpO1xuICAgIHZhciByYXdCeXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKHJvd0J5dGVzKTtcbiAgICB0aGlzLmVvZiA9ICFyYXdCeXRlcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyByb3dCeXRlcyk7XG5cbiAgICB2YXIgcHJldlJvdyA9IGJ1ZmZlci5zdWJhcnJheShidWZmZXJMZW5ndGggLSByb3dCeXRlcywgYnVmZmVyTGVuZ3RoKTtcbiAgICBpZiAocHJldlJvdy5sZW5ndGggPT09IDApIHtcbiAgICAgIHByZXZSb3cgPSBuZXcgVWludDhBcnJheShyb3dCeXRlcyk7XG4gICAgfVxuXG4gICAgdmFyIGksXG4gICAgICBqID0gYnVmZmVyTGVuZ3RoLFxuICAgICAgdXAsXG4gICAgICBjO1xuICAgIHN3aXRjaCAocHJlZGljdG9yKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7XG4gICAgICAgICAgYnVmZmVyW2orK10gPSByYXdCeXRlc1tpXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHtcbiAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkge1xuICAgICAgICAgIGJ1ZmZlcltqXSA9IChidWZmZXJbaiAtIHBpeEJ5dGVzXSArIHJhd0J5dGVzW2ldKSAmIDB4ZmY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Qnl0ZXM7ICsraSkge1xuICAgICAgICAgIGJ1ZmZlcltqKytdID0gKHByZXZSb3dbaV0gKyByYXdCeXRlc1tpXSkgJiAweGZmO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4Qnl0ZXM7ICsraSkge1xuICAgICAgICAgIGJ1ZmZlcltqKytdID0gKHByZXZSb3dbaV0gPj4gMSkgKyByYXdCeXRlc1tpXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHtcbiAgICAgICAgICBidWZmZXJbal0gPVxuICAgICAgICAgICAgKCgocHJldlJvd1tpXSArIGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdKSA+PiAxKSArIHJhd0J5dGVzW2ldKSAmIDB4ZmY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHNhdmUgdGhlIHVwIGxlZnQgcGl4ZWxzIHZhbHVlcy4gdGhlIHNpbXBsZXN0IHdheVxuICAgICAgICAvLyBpcyB0byBjcmVhdGUgYSBuZXcgYnVmZmVyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7XG4gICAgICAgICAgdXAgPSBwcmV2Um93W2ldO1xuICAgICAgICAgIGMgPSByYXdCeXRlc1tpXTtcbiAgICAgICAgICBidWZmZXJbaisrXSA9IHVwICsgYztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHtcbiAgICAgICAgICB1cCA9IHByZXZSb3dbaV07XG4gICAgICAgICAgdmFyIHVwTGVmdCA9IHByZXZSb3dbaSAtIHBpeEJ5dGVzXTtcbiAgICAgICAgICB2YXIgbGVmdCA9IGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdO1xuICAgICAgICAgIHZhciBwID0gbGVmdCArIHVwIC0gdXBMZWZ0O1xuXG4gICAgICAgICAgdmFyIHBhID0gcCAtIGxlZnQ7XG4gICAgICAgICAgaWYgKHBhIDwgMCkge1xuICAgICAgICAgICAgcGEgPSAtcGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwYiA9IHAgLSB1cDtcbiAgICAgICAgICBpZiAocGIgPCAwKSB7XG4gICAgICAgICAgICBwYiA9IC1wYjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHBjID0gcCAtIHVwTGVmdDtcbiAgICAgICAgICBpZiAocGMgPCAwKSB7XG4gICAgICAgICAgICBwYyA9IC1wYztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjID0gcmF3Qnl0ZXNbaV07XG4gICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKSB7XG4gICAgICAgICAgICBidWZmZXJbaisrXSA9IGxlZnQgKyBjO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGIgPD0gcGMpIHtcbiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXAgKyBjO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidWZmZXJbaisrXSA9IHVwTGVmdCArIGM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICR7cHJlZGljdG9yfWApO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlcztcbiAgfTtcblxuICByZXR1cm4gUHJlZGljdG9yU3RyZWFtO1xufSkoKTtcblxudmFyIERlY3J5cHRTdHJlYW0gPSAoZnVuY3Rpb24gRGVjcnlwdFN0cmVhbUNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gRGVjcnlwdFN0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBkZWNyeXB0KSB7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7XG4gICAgdGhpcy5kZWNyeXB0ID0gZGVjcnlwdDtcbiAgICB0aGlzLm5leHRDaHVuayA9IG51bGw7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpO1xuICB9XG5cbiAgdmFyIGNodW5rU2l6ZSA9IDUxMjtcblxuICBEZWNyeXB0U3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7XG5cbiAgRGVjcnlwdFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gRGVjcnlwdFN0cmVhbV9yZWFkQmxvY2soKSB7XG4gICAgdmFyIGNodW5rO1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICBjaHVuayA9IHRoaXMubmV4dENodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7XG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFjaHVuayB8fCBjaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uZXh0Q2h1bmsgPSB0aGlzLnN0ci5nZXRCeXRlcyhjaHVua1NpemUpO1xuICAgIHZhciBoYXNNb3JlRGF0YSA9IHRoaXMubmV4dENodW5rICYmIHRoaXMubmV4dENodW5rLmxlbmd0aCA+IDA7XG5cbiAgICB2YXIgZGVjcnlwdCA9IHRoaXMuZGVjcnlwdDtcbiAgICBjaHVuayA9IGRlY3J5cHQoY2h1bmssICFoYXNNb3JlRGF0YSk7XG5cbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgdmFyIGksXG4gICAgICBuID0gY2h1bmsubGVuZ3RoO1xuICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gY2h1bmtbaV07XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBEZWNyeXB0U3RyZWFtO1xufSkoKTtcblxudmFyIEFzY2lpODVTdHJlYW0gPSAoZnVuY3Rpb24gQXNjaWk4NVN0cmVhbUNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQXNjaWk4NVN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7XG4gICAgdGhpcy5pbnB1dCA9IG5ldyBVaW50OEFycmF5KDUpO1xuXG4gICAgLy8gTW9zdCBzdHJlYW1zIGluY3JlYXNlIGluIHNpemUgd2hlbiBkZWNvZGVkLCBidXQgQXNjaWk4NSBzdHJlYW1zXG4gICAgLy8gdHlwaWNhbGx5IHNocmluayBieSB+MjAlLlxuICAgIGlmIChtYXliZUxlbmd0aCkge1xuICAgICAgbWF5YmVMZW5ndGggPSAwLjggKiBtYXliZUxlbmd0aDtcbiAgICB9XG4gICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpO1xuICB9XG5cbiAgQXNjaWk4NVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIEFzY2lpODVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIEFzY2lpODVTdHJlYW1fcmVhZEJsb2NrKCkge1xuICAgIHZhciBUSUxEQV9DSEFSID0gMHg3ZTsgLy8gJ34nXG4gICAgdmFyIFpfTE9XRVJfQ0hBUiA9IDB4N2E7IC8vICd6J1xuICAgIHZhciBFT0YgPSAtMTtcblxuICAgIHZhciBzdHIgPSB0aGlzLnN0cjtcblxuICAgIHZhciBjID0gc3RyLmdldEJ5dGUoKTtcbiAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGMpKSB7XG4gICAgICBjID0gc3RyLmdldEJ5dGUoKTtcbiAgICB9XG5cbiAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHtcbiAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGgsXG4gICAgICBidWZmZXI7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBzcGVjaWFsIGNvZGUgZm9yIHpcbiAgICBpZiAoYyA9PT0gWl9MT1dFUl9DSEFSKSB7XG4gICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyA0KTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQ7XG4gICAgICBpbnB1dFswXSA9IGM7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSB7XG4gICAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpO1xuICAgICAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGMpKSB7XG4gICAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dFtpXSA9IGM7XG5cbiAgICAgICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIGkgLSAxKTtcbiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxO1xuXG4gICAgICAvLyBwYXJ0aWFsIGVuZGluZztcbiAgICAgIGlmIChpIDwgNSkge1xuICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgIGlucHV0W2ldID0gMHgyMSArIDg0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciB0ID0gMDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHtcbiAgICAgICAgdCA9IHQgKiA4NSArIChpbnB1dFtpXSAtIDB4MjEpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAzOyBpID49IDA7IC0taSkge1xuICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjtcbiAgICAgICAgdCA+Pj0gODtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEFzY2lpODVTdHJlYW07XG59KSgpO1xuXG52YXIgQXNjaWlIZXhTdHJlYW0gPSAoZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEFzY2lpSGV4U3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgpIHtcbiAgICB0aGlzLnN0ciA9IHN0cjtcbiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDtcblxuICAgIHRoaXMuZmlyc3REaWdpdCA9IC0xO1xuXG4gICAgLy8gTW9zdCBzdHJlYW1zIGluY3JlYXNlIGluIHNpemUgd2hlbiBkZWNvZGVkLCBidXQgQXNjaWlIZXggc3RyZWFtcyBzaHJpbmtcbiAgICAvLyBieSA1MCUuXG4gICAgaWYgKG1heWJlTGVuZ3RoKSB7XG4gICAgICBtYXliZUxlbmd0aCA9IDAuNSAqIG1heWJlTGVuZ3RoO1xuICAgIH1cbiAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7XG4gIH1cblxuICBBc2NpaUhleFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIEFzY2lpSGV4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBBc2NpaUhleFN0cmVhbV9yZWFkQmxvY2soKSB7XG4gICAgdmFyIFVQU1RSRUFNX0JMT0NLX1NJWkUgPSA4MDAwO1xuICAgIHZhciBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKFVQU1RSRUFNX0JMT0NLX1NJWkUpO1xuICAgIGlmICghYnl0ZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG1heERlY29kZUxlbmd0aCA9IChieXRlcy5sZW5ndGggKyAxKSA+PiAxO1xuICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIG1heERlY29kZUxlbmd0aCk7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuXG4gICAgdmFyIGZpcnN0RGlnaXQgPSB0aGlzLmZpcnN0RGlnaXQ7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIGNoID0gYnl0ZXNbaV0sXG4gICAgICAgIGRpZ2l0O1xuICAgICAgaWYgKGNoID49IC8qICcwJyA9ICovIDB4MzAgJiYgY2ggPD0gLyogJzknID0gKi8gMHgzOSkge1xuICAgICAgICBkaWdpdCA9IGNoICYgMHgwZjtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChjaCA+PSAvKiAnQScgPSAqLyAweDQxICYmIGNoIDw9IC8qICdaJyA9ICovIDB4NDYpIHx8XG4gICAgICAgIChjaCA+PSAvKiAnYScgPSAqLyAweDYxICYmIGNoIDw9IC8qICd6JyA9ICovIDB4NjYpXG4gICAgICApIHtcbiAgICAgICAgZGlnaXQgPSAoY2ggJiAweDBmKSArIDk7XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSAvKiAnPicgPSAqLyAweDNlKSB7XG4gICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcm9iYWJseSB3aGl0ZXNwYWNlLCBpZ25vcmluZy5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZmlyc3REaWdpdCA8IDApIHtcbiAgICAgICAgZmlyc3REaWdpdCA9IGRpZ2l0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IChmaXJzdERpZ2l0IDw8IDQpIHwgZGlnaXQ7XG4gICAgICAgIGZpcnN0RGlnaXQgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpcnN0RGlnaXQgPj0gMCAmJiB0aGlzLmVvZikge1xuICAgICAgLy8gaW5jb21wbGV0ZSBieXRlXG4gICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0O1xuICAgICAgZmlyc3REaWdpdCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLmZpcnN0RGlnaXQgPSBmaXJzdERpZ2l0O1xuICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBBc2NpaUhleFN0cmVhbTtcbn0pKCk7XG5cbnZhciBSdW5MZW5ndGhTdHJlYW0gPSAoZnVuY3Rpb24gUnVuTGVuZ3RoU3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCkge1xuICAgIHRoaXMuc3RyID0gc3RyO1xuICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0O1xuXG4gICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpO1xuICB9XG5cbiAgUnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7XG5cbiAgUnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW1fcmVhZEJsb2NrKCkge1xuICAgIC8vIFRoZSByZXBlYXRIZWFkZXIgaGFzIGZvbGxvd2luZyBmb3JtYXQuIFRoZSBmaXJzdCBieXRlIGRlZmluZXMgdHlwZSBvZiBydW5cbiAgICAvLyBhbmQgYW1vdW50IG9mIGJ5dGVzIHRvIHJlcGVhdC9jb3B5OiBuID0gMCB0aHJvdWdoIDEyNyAtIGNvcHkgbmV4dCBuIGJ5dGVzXG4gICAgLy8gKGluIGFkZGl0aW9uIHRvIHRoZSBzZWNvbmQgYnl0ZSBmcm9tIHRoZSBoZWFkZXIpLCBuID0gMTI5IHRocm91Z2ggMjU1IC1cbiAgICAvLyBkdXBsaWNhdGUgdGhlIHNlY29uZCBieXRlIGZyb20gdGhlIGhlYWRlciAoMjU3IC0gbikgdGltZXMsIG4gPSAxMjggLSBlbmQuXG4gICAgdmFyIHJlcGVhdEhlYWRlciA9IHRoaXMuc3RyLmdldEJ5dGVzKDIpO1xuICAgIGlmICghcmVwZWF0SGVhZGVyIHx8IHJlcGVhdEhlYWRlci5sZW5ndGggPCAyIHx8IHJlcGVhdEhlYWRlclswXSA9PT0gMTI4KSB7XG4gICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlcjtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgdmFyIG4gPSByZXBlYXRIZWFkZXJbMF07XG4gICAgaWYgKG4gPCAxMjgpIHtcbiAgICAgIC8vIGNvcHkgbiBieXRlc1xuICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpO1xuICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IHJlcGVhdEhlYWRlclsxXTtcbiAgICAgIGlmIChuID4gMCkge1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zdHIuZ2V0Qnl0ZXMobik7XG4gICAgICAgIGJ1ZmZlci5zZXQoc291cmNlLCBidWZmZXJMZW5ndGgpO1xuICAgICAgICBidWZmZXJMZW5ndGggKz0gbjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbiA9IDI1NyAtIG47XG4gICAgICB2YXIgYiA9IHJlcGVhdEhlYWRlclsxXTtcbiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBiO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDtcbiAgfTtcblxuICByZXR1cm4gUnVuTGVuZ3RoU3RyZWFtO1xufSkoKTtcblxudmFyIExaV1N0cmVhbSA9IChmdW5jdGlvbiBMWldTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIExaV1N0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBlYXJseUNoYW5nZSkge1xuICAgIHRoaXMuc3RyID0gc3RyO1xuICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0O1xuICAgIHRoaXMuY2FjaGVkRGF0YSA9IDA7XG4gICAgdGhpcy5iaXRzQ2FjaGVkID0gMDtcblxuICAgIHZhciBtYXhMendEaWN0aW9uYXJ5U2l6ZSA9IDQwOTY7XG4gICAgdmFyIGx6d1N0YXRlID0ge1xuICAgICAgZWFybHlDaGFuZ2UsXG4gICAgICBjb2RlTGVuZ3RoOiA5LFxuICAgICAgbmV4dENvZGU6IDI1OCxcbiAgICAgIGRpY3Rpb25hcnlWYWx1ZXM6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgIGRpY3Rpb25hcnlMZW5ndGhzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgZGljdGlvbmFyeVByZXZDb2RlczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgIGN1cnJlbnRTZXF1ZW5jZTogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoOiAwLFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlc1tpXSA9IGk7XG4gICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3Roc1tpXSA9IDE7XG4gICAgfVxuICAgIHRoaXMubHp3U3RhdGUgPSBsendTdGF0ZTtcblxuICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTtcbiAgfVxuXG4gIExaV1N0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJpdHMgPSBmdW5jdGlvbiBMWldTdHJlYW1fcmVhZEJpdHMobikge1xuICAgIHZhciBiaXRzQ2FjaGVkID0gdGhpcy5iaXRzQ2FjaGVkO1xuICAgIHZhciBjYWNoZWREYXRhID0gdGhpcy5jYWNoZWREYXRhO1xuICAgIHdoaWxlIChiaXRzQ2FjaGVkIDwgbikge1xuICAgICAgdmFyIGMgPSB0aGlzLnN0ci5nZXRCeXRlKCk7XG4gICAgICBpZiAoYyA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhY2hlZERhdGEgPSAoY2FjaGVkRGF0YSA8PCA4KSB8IGM7XG4gICAgICBiaXRzQ2FjaGVkICs9IDg7XG4gICAgfVxuICAgIHRoaXMuYml0c0NhY2hlZCA9IGJpdHNDYWNoZWQgLT0gbjtcbiAgICB0aGlzLmNhY2hlZERhdGEgPSBjYWNoZWREYXRhO1xuICAgIHRoaXMubGFzdENvZGUgPSBudWxsO1xuICAgIHJldHVybiAoY2FjaGVkRGF0YSA+Pj4gYml0c0NhY2hlZCkgJiAoKDEgPDwgbikgLSAxKTtcbiAgfTtcblxuICBMWldTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIExaV1N0cmVhbV9yZWFkQmxvY2soKSB7XG4gICAgdmFyIGJsb2NrU2l6ZSA9IDUxMjtcbiAgICB2YXIgZXN0aW1hdGVkRGVjb2RlZFNpemUgPSBibG9ja1NpemUgKiAyLFxuICAgICAgZGVjb2RlZFNpemVEZWx0YSA9IGJsb2NrU2l6ZTtcbiAgICB2YXIgaSwgaiwgcTtcblxuICAgIHZhciBsendTdGF0ZSA9IHRoaXMubHp3U3RhdGU7XG4gICAgaWYgKCFsendTdGF0ZSkge1xuICAgICAgcmV0dXJuOyAvLyBlb2Ygd2FzIGZvdW5kXG4gICAgfVxuXG4gICAgdmFyIGVhcmx5Q2hhbmdlID0gbHp3U3RhdGUuZWFybHlDaGFuZ2U7XG4gICAgdmFyIG5leHRDb2RlID0gbHp3U3RhdGUubmV4dENvZGU7XG4gICAgdmFyIGRpY3Rpb25hcnlWYWx1ZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzO1xuICAgIHZhciBkaWN0aW9uYXJ5TGVuZ3RocyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzO1xuICAgIHZhciBkaWN0aW9uYXJ5UHJldkNvZGVzID0gbHp3U3RhdGUuZGljdGlvbmFyeVByZXZDb2RlcztcbiAgICB2YXIgY29kZUxlbmd0aCA9IGx6d1N0YXRlLmNvZGVMZW5ndGg7XG4gICAgdmFyIHByZXZDb2RlID0gbHp3U3RhdGUucHJldkNvZGU7XG4gICAgdmFyIGN1cnJlbnRTZXF1ZW5jZSA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZTtcbiAgICB2YXIgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuXG4gICAgdmFyIGRlY29kZWRMZW5ndGggPSAwO1xuICAgIHZhciBjdXJyZW50QnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7XG4gICAgICB2YXIgY29kZSA9IHRoaXMucmVhZEJpdHMoY29kZUxlbmd0aCk7XG4gICAgICB2YXIgaGFzUHJldiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA+IDA7XG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICBjdXJyZW50U2VxdWVuY2VbMF0gPSBjb2RlO1xuICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAxO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID49IDI1OCkge1xuICAgICAgICBpZiAoY29kZSA8IG5leHRDb2RlKSB7XG4gICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gZGljdGlvbmFyeUxlbmd0aHNbY29kZV07XG4gICAgICAgICAgZm9yIChqID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoIC0gMSwgcSA9IGNvZGU7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICBjdXJyZW50U2VxdWVuY2Vbal0gPSBkaWN0aW9uYXJ5VmFsdWVzW3FdO1xuICAgICAgICAgICAgcSA9IGRpY3Rpb25hcnlQcmV2Q29kZXNbcV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtjdXJyZW50U2VxdWVuY2VMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2VbMF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMjU2KSB7XG4gICAgICAgIGNvZGVMZW5ndGggPSA5O1xuICAgICAgICBuZXh0Q29kZSA9IDI1ODtcbiAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmx6d1N0YXRlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1ByZXYpIHtcbiAgICAgICAgZGljdGlvbmFyeVByZXZDb2Rlc1tuZXh0Q29kZV0gPSBwcmV2Q29kZTtcbiAgICAgICAgZGljdGlvbmFyeUxlbmd0aHNbbmV4dENvZGVdID0gZGljdGlvbmFyeUxlbmd0aHNbcHJldkNvZGVdICsgMTtcbiAgICAgICAgZGljdGlvbmFyeVZhbHVlc1tuZXh0Q29kZV0gPSBjdXJyZW50U2VxdWVuY2VbMF07XG4gICAgICAgIG5leHRDb2RlKys7XG4gICAgICAgIGNvZGVMZW5ndGggPVxuICAgICAgICAgIChuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAmIChuZXh0Q29kZSArIGVhcmx5Q2hhbmdlIC0gMSlcbiAgICAgICAgICAgID8gY29kZUxlbmd0aFxuICAgICAgICAgICAgOiBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBNYXRoLmxvZyhuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAvIDAuNjkzMTQ3MTgwNTU5OTQ1MyArIDEsXG4gICAgICAgICAgICAgICAgMTJcbiAgICAgICAgICAgICAgKSB8IDA7XG4gICAgICB9XG4gICAgICBwcmV2Q29kZSA9IGNvZGU7XG5cbiAgICAgIGRlY29kZWRMZW5ndGggKz0gY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuICAgICAgaWYgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgZXN0aW1hdGVkRGVjb2RlZFNpemUgKz0gZGVjb2RlZFNpemVEZWx0YTtcbiAgICAgICAgfSB3aGlsZSAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKTtcbiAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBlc3RpbWF0ZWREZWNvZGVkU2l6ZSk7XG4gICAgICB9XG4gICAgICBmb3IgKGogPSAwOyBqIDwgY3VycmVudFNlcXVlbmNlTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2Vbal07XG4gICAgICB9XG4gICAgfVxuICAgIGx6d1N0YXRlLm5leHRDb2RlID0gbmV4dENvZGU7XG4gICAgbHp3U3RhdGUuY29kZUxlbmd0aCA9IGNvZGVMZW5ndGg7XG4gICAgbHp3U3RhdGUucHJldkNvZGUgPSBwcmV2Q29kZTtcbiAgICBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGggPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7XG5cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGN1cnJlbnRCdWZmZXJMZW5ndGg7XG4gIH07XG5cbiAgcmV0dXJuIExaV1N0cmVhbTtcbn0pKCk7XG5cbnZhciBOdWxsU3RyZWFtID0gKGZ1bmN0aW9uIE51bGxTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE51bGxTdHJlYW0oKSB7XG4gICAgU3RyZWFtLmNhbGwodGhpcywgbmV3IFVpbnQ4QXJyYXkoMCkpO1xuICB9XG5cbiAgTnVsbFN0cmVhbS5wcm90b3R5cGUgPSBTdHJlYW0ucHJvdG90eXBlO1xuXG4gIHJldHVybiBOdWxsU3RyZWFtO1xufSkoKTtcblxuZXhwb3J0IHtcbiAgQXNjaWk4NVN0cmVhbSxcbiAgQXNjaWlIZXhTdHJlYW0sXG4gIERlY3J5cHRTdHJlYW0sXG4gIERlY29kZVN0cmVhbSxcbiAgRmxhdGVTdHJlYW0sXG4gIE51bGxTdHJlYW0sXG4gIFByZWRpY3RvclN0cmVhbSxcbiAgUnVuTGVuZ3RoU3RyZWFtLFxuICBTdHJlYW0sXG4gIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbSxcbiAgU3RyaW5nU3RyZWFtLFxuICBMWldTdHJlYW0sXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IERpY3QsIGlzRGljdCB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IENDSVRURmF4RGVjb2RlciB9IGZyb20gXCIuL2NjaXR0LmpzXCI7XG5pbXBvcnQgeyBEZWNvZGVTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcblxudmFyIENDSVRURmF4U3RyZWFtID0gKGZ1bmN0aW9uIENDSVRURmF4U3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBDQ0lUVEZheFN0cmVhbShzdHIsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHtcbiAgICB0aGlzLnN0ciA9IHN0cjtcbiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDtcblxuICAgIGlmICghaXNEaWN0KHBhcmFtcykpIHtcbiAgICAgIHBhcmFtcyA9IERpY3QuZW1wdHk7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5nZXRCeXRlKCk7XG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5jY2l0dEZheERlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKHNvdXJjZSwge1xuICAgICAgSzogcGFyYW1zLmdldChcIktcIiksXG4gICAgICBFbmRPZkxpbmU6IHBhcmFtcy5nZXQoXCJFbmRPZkxpbmVcIiksXG4gICAgICBFbmNvZGVkQnl0ZUFsaWduOiBwYXJhbXMuZ2V0KFwiRW5jb2RlZEJ5dGVBbGlnblwiKSxcbiAgICAgIENvbHVtbnM6IHBhcmFtcy5nZXQoXCJDb2x1bW5zXCIpLFxuICAgICAgUm93czogcGFyYW1zLmdldChcIlJvd3NcIiksXG4gICAgICBFbmRPZkJsb2NrOiBwYXJhbXMuZ2V0KFwiRW5kT2ZCbG9ja1wiKSxcbiAgICAgIEJsYWNrSXMxOiBwYXJhbXMuZ2V0KFwiQmxhY2tJczFcIiksXG4gICAgfSk7XG5cbiAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7XG4gIH1cblxuICBDQ0lUVEZheFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpO1xuXG4gIENDSVRURmF4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgd2hpbGUgKCF0aGlzLmVvZikge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY2NpdHRGYXhEZWNvZGVyLnJlYWROZXh0Q2hhcigpO1xuICAgICAgaWYgKGMgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyAxKTtcbiAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdID0gYztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENDSVRURmF4U3RyZWFtO1xufSkoKTtcblxuZXhwb3J0IHsgQ0NJVFRGYXhTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogQ29weXJpZ2h0IDE5OTYtMjAwMyBHbHlwaCAmIENvZywgTExDXG4gKlxuICogVGhlIENDSVRUIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgSmF2YVNjcmlwdCBwb3J0XG4gKiBvZiBYUERGJ3MgaW1wbGVtZW50YXRpb24sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlXG4gKiBsaWNlbnNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ0NJVFRGYXhEZWNvZGVyU291cmNlXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBuZXh0IC0gTWV0aG9kIHRoYXQgcmV0dXJuIG9uZSBieXRlIG9mIGRhdGEgZm9yIGRlY29kaW5nLFxuICogICBvciAtMSB3aGVuIEVPRiBpcyByZWFjaGVkLlxuICovXG5cbmltcG9ydCB7IGluZm8gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuY29uc3QgQ0NJVFRGYXhEZWNvZGVyID0gKGZ1bmN0aW9uIENDSVRURmF4RGVjb2RlcigpIHtcbiAgY29uc3QgY2NpdHRFT0wgPSAtMjtcbiAgY29uc3QgY2NpdHRFT0YgPSAtMTtcbiAgY29uc3QgdHdvRGltUGFzcyA9IDA7XG4gIGNvbnN0IHR3b0RpbUhvcml6ID0gMTtcbiAgY29uc3QgdHdvRGltVmVydDAgPSAyO1xuICBjb25zdCB0d29EaW1WZXJ0UjEgPSAzO1xuICBjb25zdCB0d29EaW1WZXJ0TDEgPSA0O1xuICBjb25zdCB0d29EaW1WZXJ0UjIgPSA1O1xuICBjb25zdCB0d29EaW1WZXJ0TDIgPSA2O1xuICBjb25zdCB0d29EaW1WZXJ0UjMgPSA3O1xuICBjb25zdCB0d29EaW1WZXJ0TDMgPSA4O1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCB0d29EaW1UYWJsZSA9IFtcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMHhcbiAgICBbNywgdHdvRGltVmVydEwzXSwgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTBcbiAgICBbNywgdHdvRGltVmVydFIzXSwgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTFcbiAgICBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRMMl0sIC8vIDAwMDAxMHhcbiAgICBbNiwgdHdvRGltVmVydFIyXSwgWzYsIHR3b0RpbVZlcnRSMl0sIC8vIDAwMDAxMXhcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgICAgIC8vIDAwMDF4eHhcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCAgIC8vIDAwMXh4eHhcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgLy8gMDEweHh4eFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIC8vIDAxMXh4eHhcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgICAvLyAxeHh4eHh4XG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXVxuICBdO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCB3aGl0ZVRhYmxlMSA9IFtcbiAgICBbLTEsIC0xXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDBcbiAgICBbMTIsIGNjaXR0RU9MXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDFcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMXhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDAxeHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDEweHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDExeHhcbiAgICBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCAgICAgICAgICAgICAgICAgLy8gMTAwMHhcbiAgICBbMTIsIDE5ODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAwMTBcbiAgICBbMTIsIDIwNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAwMTFcbiAgICBbMTIsIDIxMTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMDBcbiAgICBbMTIsIDIxNzZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMDFcbiAgICBbMTIsIDIyNDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMTBcbiAgICBbMTIsIDIzMDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMTFcbiAgICBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCAgICAgICAgICAgICAgICAgLy8gMTEwMHhcbiAgICBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCAgICAgICAgICAgICAgICAgLy8gMTEwMXhcbiAgICBbMTIsIDIzNjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMDBcbiAgICBbMTIsIDI0MzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMDFcbiAgICBbMTIsIDI0OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMTBcbiAgICBbMTIsIDI1NjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMTFcbiAgXTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3Qgd2hpdGVUYWJsZTIgPSBbXG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAvLyAwMDAwMDAweHhcbiAgICBbOCwgMjldLCBbOCwgMjldLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEweFxuICAgIFs4LCAzMF0sIFs4LCAzMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTF4XG4gICAgWzgsIDQ1XSwgWzgsIDQ1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMHhcbiAgICBbOCwgNDZdLCBbOCwgNDZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxeFxuICAgIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sICAgICAgICAgLy8gMDAwMDAxMXh4XG4gICAgWzcsIDIzXSwgWzcsIDIzXSwgWzcsIDIzXSwgWzcsIDIzXSwgICAgICAgICAvLyAwMDAwMTAweHhcbiAgICBbOCwgNDddLCBbOCwgNDddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMDEweFxuICAgIFs4LCA0OF0sIFs4LCA0OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDEwMTF4XG4gICAgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgICAgICAgICAvLyAwMDAwMTF4eHhcbiAgICBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLFxuICAgIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sICAgICAgICAgLy8gMDAwMTAwMHh4XG4gICAgWzgsIDMzXSwgWzgsIDMzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDAxMHhcbiAgICBbOCwgMzRdLCBbOCwgMzRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMDExeFxuICAgIFs4LCAzNV0sIFs4LCAzNV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAxMDB4XG4gICAgWzgsIDM2XSwgWzgsIDM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDEwMXhcbiAgICBbOCwgMzddLCBbOCwgMzddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMTEweFxuICAgIFs4LCAzOF0sIFs4LCAzOF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAxMTF4XG4gICAgWzcsIDE5XSwgWzcsIDE5XSwgWzcsIDE5XSwgWzcsIDE5XSwgICAgICAgICAvLyAwMDAxMTAweHhcbiAgICBbOCwgMzFdLCBbOCwgMzFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDExMDEweFxuICAgIFs4LCAzMl0sIFs4LCAzMl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTEwMTF4XG4gICAgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCAgICAgICAgICAgICAvLyAwMDAxMTF4eHhcbiAgICBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sXG4gICAgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgICAgICAgICAvLyAwMDEwMDB4eHhcbiAgICBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLFxuICAgIFs4LCA1M10sIFs4LCA1M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDAxMDB4XG4gICAgWzgsIDU0XSwgWzgsIDU0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMDEwMXhcbiAgICBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCAgICAgICAgIC8vIDAwMTAwMTF4eFxuICAgIFs4LCAzOV0sIFs4LCAzOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDEwMDB4XG4gICAgWzgsIDQwXSwgWzgsIDQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMTAwMXhcbiAgICBbOCwgNDFdLCBbOCwgNDFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAxMDEweFxuICAgIFs4LCA0Ml0sIFs4LCA0Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDEwMTF4XG4gICAgWzgsIDQzXSwgWzgsIDQzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMTEwMHhcbiAgICBbOCwgNDRdLCBbOCwgNDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAxMTAxeFxuICAgIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyMV0sICAgICAgICAgLy8gMDAxMDExMXh4XG4gICAgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgICAgICAgICAvLyAwMDExMDAweHhcbiAgICBbOCwgNjFdLCBbOCwgNjFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTEwMDEweFxuICAgIFs4LCA2Ml0sIFs4LCA2Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMTAwMTF4XG4gICAgWzgsIDYzXSwgWzgsIDYzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDExMDEwMHhcbiAgICBbOCwgMF0sIFs4LCAwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTEwMTAxeFxuICAgIFs4LCAzMjBdLCBbOCwgMzIwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMTAxMTB4XG4gICAgWzgsIDM4NF0sIFs4LCAzODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDExMDExMXhcbiAgICBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCAgICAgICAgIC8vIDAwMTExeHh4eFxuICAgIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sXG4gICAgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSxcbiAgICBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLFxuICAgIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sICAgICAgICAgLy8gMDEwMDB4eHh4XG4gICAgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSxcbiAgICBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLFxuICAgIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sXG4gICAgWzcsIDI3XSwgWzcsIDI3XSwgWzcsIDI3XSwgWzcsIDI3XSwgICAgICAgICAvLyAwMTAwMTAweHhcbiAgICBbOCwgNTldLCBbOCwgNTldLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDAxMDEweFxuICAgIFs4LCA2MF0sIFs4LCA2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMDEwMTF4XG4gICAgWzksIDE0NzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAwMTEwMDBcbiAgICBbOSwgMTUzNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDAxMTAwMVxuICAgIFs5LCAxNjAwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMDExMDEwXG4gICAgWzksIDE3MjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAwMTEwMTFcbiAgICBbNywgMThdLCBbNywgMThdLCBbNywgMThdLCBbNywgMThdLCAgICAgICAgIC8vIDAxMDAxMTF4eFxuICAgIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sICAgICAgICAgLy8gMDEwMTAwMHh4XG4gICAgWzgsIDQ5XSwgWzgsIDQ5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMDAxMHhcbiAgICBbOCwgNTBdLCBbOCwgNTBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDEwMDExeFxuICAgIFs4LCA1MV0sIFs4LCA1MV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTAxMDB4XG4gICAgWzgsIDUyXSwgWzgsIDUyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMDEwMXhcbiAgICBbNywgMjVdLCBbNywgMjVdLCBbNywgMjVdLCBbNywgMjVdLCAgICAgICAgIC8vIDAxMDEwMTF4eFxuICAgIFs4LCA1NV0sIFs4LCA1NV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTEwMDB4XG4gICAgWzgsIDU2XSwgWzgsIDU2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMTAwMXhcbiAgICBbOCwgNTddLCBbOCwgNTddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDExMDEweFxuICAgIFs4LCA1OF0sIFs4LCA1OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTEwMTF4XG4gICAgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sICAgICAvLyAwMTAxMTF4eHhcbiAgICBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSxcbiAgICBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIC8vIDAxMTAwMHh4eFxuICAgIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSxcbiAgICBbOCwgNDQ4XSwgWzgsIDQ0OF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAwMTAweFxuICAgIFs4LCA1MTJdLCBbOCwgNTEyXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDAxMDF4XG4gICAgWzksIDcwNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMDExMDBcbiAgICBbOSwgNzY4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAwMTEwMVxuICAgIFs4LCA2NDBdLCBbOCwgNjQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDAxMTF4XG4gICAgWzgsIDU3Nl0sIFs4LCA1NzZdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAwMHhcbiAgICBbOSwgODMyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMDAxMFxuICAgIFs5LCA4OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMDExXG4gICAgWzksIDk2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAxMDBcbiAgICBbOSwgMTAyNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMDEwMVxuICAgIFs5LCAxMDg4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMTEwXG4gICAgWzksIDExNTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAxMTFcbiAgICBbOSwgMTIxNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMTAwMFxuICAgIFs5LCAxMjgwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDExMDAxXG4gICAgWzksIDEzNDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTEwMTBcbiAgICBbOSwgMTQwOF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMTAxMVxuICAgIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCAgICAgLy8gMDExMDExMXh4XG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCAgICAgICAgICAgICAvLyAwMTExeHh4eHhcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSxcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSxcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCAgICAgICAgICAgICAvLyAxMDAweHh4eHhcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSxcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSxcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sICAgICAvLyAxMDAxMHh4eHhcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sICAgICAgICAgICAgIC8vIDEwMDExeHh4eFxuICAgIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSxcbiAgICBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sXG4gICAgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLFxuICAgIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgICAgICAgICAgICAgLy8gMTAxMDB4eHh4XG4gICAgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLFxuICAgIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSxcbiAgICBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sXG4gICAgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgICAgICAgICAvLyAxMDEwMTB4eHhcbiAgICBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLFxuICAgIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sICAgICAgICAgLy8gMTAxMDExeHh4XG4gICAgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sICAgICAgICAgICAgIC8vIDEwMTF4eHh4eFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sICAgICAgICAgICAgIC8vIDExMDB4eHh4eFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCAgICAgICAgIC8vIDExMDEwMHh4eFxuICAgIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sXG4gICAgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgICAgICAgICAvLyAxMTAxMDF4eHhcbiAgICBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLFxuICAgIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sICAgICAgICAgLy8gMTEwMTF4eHh4XG4gICAgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSxcbiAgICBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLFxuICAgIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCAgICAgICAgICAgICAvLyAxMTEweHh4eHhcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSxcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSxcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCAgICAgICAgICAgICAvLyAxMTExeHh4eHhcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSxcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSxcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN11cbiAgXTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3QgYmxhY2tUYWJsZTEgPSBbXG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDAwMDAweFxuICAgIFsxMiwgY2NpdHRFT0xdLCBbMTIsIGNjaXR0RU9MXSwgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAwMDAwMXhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDAwMXh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAwMTB4eFxuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgIC8vIDAwMDAwMDAwMDExeHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDEwMHh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAxMDF4eFxuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgIC8vIDAwMDAwMDAwMTEweHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDExMXh4XG4gICAgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgLy8gMDAwMDAwMDEwMDB4eFxuICAgIFsxMiwgMTk4NF0sIFsxMiwgMTk4NF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMDAxMHhcbiAgICBbMTIsIDIwNDhdLCBbMTIsIDIwNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTAwMTF4XG4gICAgWzEyLCAyMTEyXSwgWzEyLCAyMTEyXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDEwMTAweFxuICAgIFsxMiwgMjE3Nl0sIFsxMiwgMjE3Nl0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMDEwMXhcbiAgICBbMTIsIDIyNDBdLCBbMTIsIDIyNDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTAxMTB4XG4gICAgWzEyLCAyMzA0XSwgWzEyLCAyMzA0XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDEwMTExeFxuICAgIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIC8vIDAwMDAwMDAxMTAweHhcbiAgICBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCAvLyAwMDAwMDAwMTEwMXh4XG4gICAgWzEyLCAyMzY4XSwgWzEyLCAyMzY4XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDExMTAweFxuICAgIFsxMiwgMjQzMl0sIFsxMiwgMjQzMl0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMTEwMXhcbiAgICBbMTIsIDI0OTZdLCBbMTIsIDI0OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTExMTB4XG4gICAgWzEyLCAyNTYwXSwgWzEyLCAyNTYwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDExMTExeFxuICAgIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCAgICAgICAgIC8vIDAwMDAwMDEwMDB4eHhcbiAgICBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSxcbiAgICBbMTIsIDUyXSwgWzEyLCA1Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDAxMDB4XG4gICAgWzEzLCA2NDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAwMTAxMFxuICAgIFsxMywgNzA0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMDEwMTFcbiAgICBbMTMsIDc2OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDAxMTAwXG4gICAgWzEzLCA4MzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAwMTEwMVxuICAgIFsxMiwgNTVdLCBbMTIsIDU1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMDExMXhcbiAgICBbMTIsIDU2XSwgWzEyLCA1Nl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDEwMDB4XG4gICAgWzEzLCAxMjgwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMDAxMFxuICAgIFsxMywgMTM0NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTAwMTFcbiAgICBbMTMsIDE0MDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDEwMTAwXG4gICAgWzEzLCAxNDcyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMDEwMVxuICAgIFsxMiwgNTldLCBbMTIsIDU5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTAxMXhcbiAgICBbMTIsIDYwXSwgWzEyLCA2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDExMDB4XG4gICAgWzEzLCAxNTM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMTAxMFxuICAgIFsxMywgMTYwMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTEwMTFcbiAgICBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgICAgICAgICAvLyAwMDAwMDAxMDExMXh4XG4gICAgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sICAgICAgICAgLy8gMDAwMDAwMTEwMDB4eFxuICAgIFsxMywgMTY2NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDAxMDBcbiAgICBbMTMsIDE3MjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAwMTAxXG4gICAgWzEyLCAzMjBdLCBbMTIsIDMyMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMDExeFxuICAgIFsxMiwgMzg0XSwgWzEyLCAzODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDEwMHhcbiAgICBbMTIsIDQ0OF0sIFsxMiwgNDQ4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAxMDF4XG4gICAgWzEzLCA1MTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMTEwMFxuICAgIFsxMywgNTc2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDExMDFcbiAgICBbMTIsIDUzXSwgWzEyLCA1M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAxMTF4XG4gICAgWzEyLCA1NF0sIFsxMiwgNTRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDAweFxuICAgIFsxMywgODk2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAwMTBcbiAgICBbMTMsIDk2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTEwMDExXG4gICAgWzEzLCAxMDI0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDEwMFxuICAgIFsxMywgMTA4OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAxMDFcbiAgICBbMTMsIDExNTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTEwMTEwXG4gICAgWzEzLCAxMjE2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDExMVxuICAgIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCAgICAgICAgIC8vIDAwMDAwMDExMTF4eHhcbiAgICBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XVxuICBdO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBibGFja1RhYmxlMiA9IFtcbiAgICBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCAgICAgLy8gMDAwMDAxMDB4eHh4XG4gICAgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSxcbiAgICBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLFxuICAgIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sXG4gICAgWzExLCAyM10sIFsxMSwgMjNdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDAweFxuICAgIFsxMiwgNTBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAwMTBcbiAgICBbMTIsIDUxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDEwMDExXG4gICAgWzEyLCA0NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDEwMFxuICAgIFsxMiwgNDVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAxMDFcbiAgICBbMTIsIDQ2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDEwMTEwXG4gICAgWzEyLCA0N10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDExMVxuICAgIFsxMiwgNTddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTEwMDBcbiAgICBbMTIsIDU4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDExMDAxXG4gICAgWzEyLCA2MV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMTAxMFxuICAgIFsxMiwgMjU2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTEwMTFcbiAgICBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgLy8gMDAwMDAxMDExMXh4XG4gICAgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIC8vIDAwMDAwMTEwMDB4eFxuICAgIFsxMiwgNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDAxMDBcbiAgICBbMTIsIDQ5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAwMTAxXG4gICAgWzEyLCA2Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMDExMFxuICAgIFsxMiwgNjNdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDAxMTFcbiAgICBbMTIsIDMwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMDAwXG4gICAgWzEyLCAzMV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTAwMVxuICAgIFsxMiwgMzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDEwMTBcbiAgICBbMTIsIDMzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMDExXG4gICAgWzEyLCA0MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTEwMFxuICAgIFsxMiwgNDFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDExMDFcbiAgICBbMTEsIDIyXSwgWzExLCAyMl0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMTF4XG4gICAgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgICAgIC8vIDAwMDAwMTExeHh4eFxuICAgIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sXG4gICAgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSxcbiAgICBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sICAgICAvLyAwMDAwMTAweHh4eHhcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sXG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sXG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sICAgICAvLyAwMDAwMTAxeHh4eHhcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sXG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sXG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sICAgICAvLyAwMDAwMTEwMDB4eHhcbiAgICBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLFxuICAgIFsxMiwgMTI4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDEwMDBcbiAgICBbMTIsIDE5Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMDAxXG4gICAgWzEyLCAyNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAwMTAxMFxuICAgIFsxMiwgMjddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDEwMTFcbiAgICBbMTIsIDI4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMTAwXG4gICAgWzEyLCAyOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAwMTEwMVxuICAgIFsxMSwgMTldLCBbMTEsIDE5XSwgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDExMXhcbiAgICBbMTEsIDIwXSwgWzExLCAyMF0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMDB4XG4gICAgWzEyLCAzNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDAxMFxuICAgIFsxMiwgMzVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTAwMTFcbiAgICBbMTIsIDM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMTAwXG4gICAgWzEyLCAzN10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDEwMVxuICAgIFsxMiwgMzhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTAxMTBcbiAgICBbMTIsIDM5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMTExXG4gICAgWzExLCAyMV0sIFsxMSwgMjFdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMTAweFxuICAgIFsxMiwgNDJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTEwMTBcbiAgICBbMTIsIDQzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDExMDExXG4gICAgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgICAgIC8vIDAwMDAxMTAxMTF4eFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sICAgICAvLyAwMDAwMTExeHh4eHhcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sXG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSxcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sXG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSxcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXG4gIF07XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IGJsYWNrVGFibGUzID0gW1xuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAvLyAwMDAweHhcbiAgICBbNiwgOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAwXG4gICAgWzYsIDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMVxuICAgIFs1LCA3XSwgWzUsIDddLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMXhcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sICAgICAgICAgLy8gMDAxMHh4XG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCAgICAgICAgIC8vIDAwMTF4eFxuICAgIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgICAgICAgICAvLyAwMTB4eHhcbiAgICBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sXG4gICAgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCAgICAgICAgIC8vIDAxMXh4eFxuICAgIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSxcbiAgICBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sICAgICAgICAgLy8gMTB4eHh4XG4gICAgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLFxuICAgIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSxcbiAgICBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sXG4gICAgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCAgICAgICAgIC8vIDExeHh4eFxuICAgIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSxcbiAgICBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sXG4gICAgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdXG4gIF07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Q0NJVFRGYXhEZWNvZGVyU291cmNlfSBzb3VyY2UgLSBUaGUgZGF0YSB3aGljaCBzaG91bGQgYmUgZGVjb2RlZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIERlY29kaW5nIG9wdGlvbnMuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIENDSVRURmF4RGVjb2Rlcihzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UubmV4dCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgXCJzb3VyY2VcIiBwYXJhbWV0ZXIuJyk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMuZW9mID0gZmFsc2U7XG5cbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5LIHx8IDA7XG4gICAgdGhpcy5lb2xpbmUgPSBvcHRpb25zLkVuZE9mTGluZSB8fCBmYWxzZTtcbiAgICB0aGlzLmJ5dGVBbGlnbiA9IG9wdGlvbnMuRW5jb2RlZEJ5dGVBbGlnbiB8fCBmYWxzZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBvcHRpb25zLkNvbHVtbnMgfHwgMTcyODtcbiAgICB0aGlzLnJvd3MgPSBvcHRpb25zLlJvd3MgfHwgMDtcbiAgICBsZXQgZW9ibG9jayA9IG9wdGlvbnMuRW5kT2ZCbG9jaztcbiAgICBpZiAoZW9ibG9jayA9PT0gbnVsbCB8fCBlb2Jsb2NrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVvYmxvY2sgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmVvYmxvY2sgPSBlb2Jsb2NrO1xuICAgIHRoaXMuYmxhY2sgPSBvcHRpb25zLkJsYWNrSXMxIHx8IGZhbHNlO1xuXG4gICAgdGhpcy5jb2RpbmdMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDEpO1xuICAgIHRoaXMucmVmTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAyKTtcblxuICAgIHRoaXMuY29kaW5nTGluZVswXSA9IHRoaXMuY29sdW1ucztcbiAgICB0aGlzLmNvZGluZ1BvcyA9IDA7XG5cbiAgICB0aGlzLnJvdyA9IDA7XG4gICAgdGhpcy5uZXh0TGluZTJEID0gdGhpcy5lbmNvZGluZyA8IDA7XG4gICAgdGhpcy5pbnB1dEJpdHMgPSAwO1xuICAgIHRoaXMuaW5wdXRCdWYgPSAwO1xuICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7XG4gICAgdGhpcy5yb3dzRG9uZSA9IGZhbHNlO1xuXG4gICAgbGV0IGNvZGUxO1xuICAgIHdoaWxlICgoY29kZTEgPSB0aGlzLl9sb29rQml0cygxMikpID09PSAwKSB7XG4gICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgIH1cbiAgICBpZiAoY29kZTEgPT09IDEpIHtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHtcbiAgICAgIHRoaXMubmV4dExpbmUyRCA9ICF0aGlzLl9sb29rQml0cygxKTtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgfVxuICB9XG5cbiAgQ0NJVFRGYXhEZWNvZGVyLnByb3RvdHlwZSA9IHtcbiAgICByZWFkTmV4dENoYXIoKSB7XG4gICAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVmTGluZSA9IHRoaXMucmVmTGluZTtcbiAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuXG4gICAgICBsZXQgcmVmUG9zLCBibGFja1BpeGVscywgYml0cywgaTtcblxuICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA9PT0gMCkge1xuICAgICAgICBpZiAodGhpcy5yb3dzRG9uZSkge1xuICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcnIgPSBmYWxzZTtcblxuICAgICAgICBsZXQgY29kZTEsIGNvZGUyLCBjb2RlMztcbiAgICAgICAgaWYgKHRoaXMubmV4dExpbmUyRCkge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGNvZGluZ0xpbmVbaV0gPCBjb2x1bW5zOyArK2kpIHtcbiAgICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2RpbmdMaW5lW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWZMaW5lW2krK10gPSBjb2x1bW5zO1xuICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2x1bW5zO1xuICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwO1xuICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDtcbiAgICAgICAgICByZWZQb3MgPSAwO1xuICAgICAgICAgIGJsYWNrUGl4ZWxzID0gMDtcblxuICAgICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fZ2V0VHdvRGltQ29kZSgpO1xuICAgICAgICAgICAgc3dpdGNoIChjb2RlMSkge1xuICAgICAgICAgICAgICBjYXNlIHR3b0RpbVBhc3M6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zICsgMV0sIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmTGluZVtyZWZQb3MgKyAxXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1Ib3JpejpcbiAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUyID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLFxuICAgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhcbiAgICAgICAgICAgICAgICAgICAgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMixcbiAgICAgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXiAxXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjM6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDMsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjI6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDIsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjE6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDEsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0MDpcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwzOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAzLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAtLXJlZlBvcztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDI6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDIsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC0tcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgKytyZWZQb3M7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJlxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMTpcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMSwgYmxhY2tQaXhlbHMpO1xuICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgY2NpdHRFT0Y6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvbHVtbnMsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpbmZvKFwiYmFkIDJkIGNvZGVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvbHVtbnMsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29kaW5nTGluZVswXSA9IDA7XG4gICAgICAgICAgdGhpcy5jb2RpbmdQb3MgPSAwO1xuICAgICAgICAgIGJsYWNrUGl4ZWxzID0gMDtcbiAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICBjb2RlMSA9IDA7XG4gICAgICAgICAgICBpZiAoYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpO1xuICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMSwgYmxhY2tQaXhlbHMpO1xuICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZ290RU9MID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZUFsaWduKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dEJpdHMgJj0gfjc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZW9ibG9jayAmJiB0aGlzLnJvdyA9PT0gdGhpcy5yb3dzIC0gMSkge1xuICAgICAgICAgIHRoaXMucm93c0RvbmUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgIGlmICh0aGlzLmVvbGluZSkge1xuICAgICAgICAgICAgd2hpbGUgKGNvZGUxICE9PSBjY2l0dEVPRiAmJiBjb2RlMSAhPT0gMSkge1xuICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGNvZGUxID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29kZTEgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgICAgZ290RU9MID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUxID09PSBjY2l0dEVPRikge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5lb2YgJiYgdGhpcy5lbmNvZGluZyA+IDAgJiYgIXRoaXMucm93c0RvbmUpIHtcbiAgICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7XG4gICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVvYmxvY2sgJiYgZ290RU9MICYmIHRoaXMuYnl0ZUFsaWduKSB7XG4gICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7XG4gICAgICAgICAgaWYgKGNvZGUxID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTtcbiAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID49IDApIHtcbiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlMSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgaW5mbyhcImJhZCBydGMgY29kZTogXCIgKyBjb2RlMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVyciAmJiB0aGlzLmVvbGluZSkge1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEzKTtcbiAgICAgICAgICAgIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHtcbiAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZTEgPj4gMSA9PT0gMSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgICAgIHRoaXMubmV4dExpbmUyRCA9ICEoY29kZTEgJiAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kaW5nTGluZVswXSA+IDApIHtcbiAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWyh0aGlzLmNvZGluZ1BvcyA9IDApXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWyh0aGlzLmNvZGluZ1BvcyA9IDEpXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvdysrO1xuICAgICAgfVxuXG4gICAgICBsZXQgYztcbiAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPj0gOCkge1xuICAgICAgICBjID0gdGhpcy5jb2RpbmdQb3MgJiAxID8gMCA6IDB4ZmY7XG4gICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSA4O1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID09PSAwICYmIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7XG4gICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID1cbiAgICAgICAgICAgIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaXRzID0gODtcbiAgICAgICAgYyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykge1xuICAgICAgICAgICAgYyA8PD0gYml0cztcbiAgICAgICAgICAgIGlmICghKHRoaXMuY29kaW5nUG9zICYgMSkpIHtcbiAgICAgICAgICAgICAgYyB8PSAweGZmID4+ICg4IC0gYml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgLT0gYml0cztcbiAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjIDw8PSB0aGlzLm91dHB1dEJpdHM7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmNvZGluZ1BvcyAmIDEpKSB7XG4gICAgICAgICAgICAgIGMgfD0gMHhmZiA+PiAoOCAtIHRoaXMub3V0cHV0Qml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRzIC09IHRoaXMub3V0cHV0Qml0cztcbiAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7XG4gICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7XG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9XG4gICAgICAgICAgICAgICAgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gLSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zIC0gMV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJpdHMgPiAwKSB7XG4gICAgICAgICAgICAgIGMgPDw9IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYml0cyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ibGFjaykge1xuICAgICAgICBjIF49IDB4ZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYWRkUGl4ZWxzKGExLCBibGFja1BpeGVscykge1xuICAgICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTtcbiAgICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvcztcblxuICAgICAgaWYgKGExID4gY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7XG4gICAgICAgIGlmIChhMSA+IHRoaXMuY29sdW1ucykge1xuICAgICAgICAgIGluZm8oXCJyb3cgaXMgd3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTtcbiAgICAgICAgICBhMSA9IHRoaXMuY29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNvZGluZ1BvcyAmIDEpIF4gYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICArK2NvZGluZ1BvcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHtcbiAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7XG4gICAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7XG5cbiAgICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkge1xuICAgICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICBpbmZvKFwicm93IGlzIHdyb25nIGxlbmd0aFwiKTtcbiAgICAgICAgICB0aGlzLmVyciA9IHRydWU7XG4gICAgICAgICAgYTEgPSB0aGlzLmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjb2RpbmdQb3MgJiAxKSBeIGJsYWNrUGl4ZWxzKSB7XG4gICAgICAgICAgKytjb2RpbmdQb3M7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTtcbiAgICAgIH0gZWxzZSBpZiAoYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHtcbiAgICAgICAgaWYgKGExIDwgMCkge1xuICAgICAgICAgIGluZm8oXCJpbnZhbGlkIGNvZGVcIik7XG4gICAgICAgICAgdGhpcy5lcnIgPSB0cnVlO1xuICAgICAgICAgIGExID0gMDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY29kaW5nUG9zID4gMCAmJiBhMSA8IGNvZGluZ0xpbmVbY29kaW5nUG9zIC0gMV0pIHtcbiAgICAgICAgICAtLWNvZGluZ1BvcztcbiAgICAgICAgfVxuICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29kZSBmb3VuZCBmcm9tIHRoZSB0YWJsZS5cbiAgICAgKiBUaGUgc3RhcnQgYW5kIGVuZCBwYXJhbWV0ZXJzIHNldCB0aGUgYm91bmRhcmllcyBmb3Igc2VhcmNoaW5nIHRoZSB0YWJsZS5cbiAgICAgKiBUaGUgbGltaXQgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBGdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IHdpdGggdGhyZWVcbiAgICAgKiB2YWx1ZXMuIFRoZSBmaXJzdCBhcnJheSBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIGEgdmFsaWQgY29kZSBpcyBiZWluZ1xuICAgICAqIHJldHVybmVkLiBUaGUgc2Vjb25kIGFycmF5IGVsZW1lbnQgaXMgdGhlIGFjdHVhbCBjb2RlLiBUaGUgdGhpcmQgYXJyYXlcbiAgICAgKiBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIEVPRiB3YXMgcmVhY2hlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9maW5kVGFibGVDb2RlKHN0YXJ0LCBlbmQsIHRhYmxlLCBsaW1pdCkge1xuICAgICAgY29uc3QgbGltaXRWYWx1ZSA9IGxpbWl0IHx8IDA7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHtcbiAgICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7XG4gICAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCBlbmQpIHtcbiAgICAgICAgICBjb2RlIDw8PSBlbmQgLSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdO1xuICAgICAgICAgIGlmIChwWzBdID09PSBpKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXRCaXRzKGkpO1xuICAgICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0VHdvRGltQ29kZSgpIHtcbiAgICAgIGxldCBjb2RlID0gMDtcbiAgICAgIGxldCBwO1xuICAgICAgaWYgKHRoaXMuZW9ibG9jaykge1xuICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoNyk7XG4gICAgICAgIHAgPSB0d29EaW1UYWJsZVtjb2RlXTtcbiAgICAgICAgaWYgKHAgJiYgcFswXSA+IDApIHtcbiAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pO1xuICAgICAgICAgIHJldHVybiBwWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDcsIHR3b0RpbVRhYmxlKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSAmJiByZXN1bHRbMl0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmZvKFwiQmFkIHR3byBkaW0gY29kZVwiKTtcbiAgICAgIHJldHVybiBjY2l0dEVPRjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0V2hpdGVDb2RlKCkge1xuICAgICAgbGV0IGNvZGUgPSAwO1xuICAgICAgbGV0IHA7XG4gICAgICBpZiAodGhpcy5lb2Jsb2NrKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMik7XG4gICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPj4gNSA9PT0gMCkge1xuICAgICAgICAgIHAgPSB3aGl0ZVRhYmxlMVtjb2RlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwID0gd2hpdGVUYWJsZTJbY29kZSA+PiAzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwWzBdID4gMCkge1xuICAgICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7XG4gICAgICAgICAgcmV0dXJuIHBbMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDExLCAxMiwgd2hpdGVUYWJsZTEpO1xuICAgICAgICBpZiAocmVzdWx0WzBdKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5mbyhcImJhZCB3aGl0ZSBjb2RlXCIpO1xuICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRCbGFja0NvZGUoKSB7XG4gICAgICBsZXQgY29kZSwgcDtcbiAgICAgIGlmICh0aGlzLmVvYmxvY2spIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEzKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkge1xuICAgICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7XG4gICAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBbMF0gPiAwKSB7XG4gICAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTtcbiAgICAgICAgICByZXR1cm4gcFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMiwgNiwgYmxhY2tUYWJsZTMpO1xuICAgICAgICBpZiAocmVzdWx0WzBdKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoNywgMTIsIGJsYWNrVGFibGUyLCA2NCk7XG4gICAgICAgIGlmIChyZXN1bHRbMF0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluZm8oXCJiYWQgYmxhY2sgY29kZVwiKTtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfbG9va0JpdHMobikge1xuICAgICAgbGV0IGM7XG4gICAgICB3aGlsZSAodGhpcy5pbnB1dEJpdHMgPCBuKSB7XG4gICAgICAgIGlmICgoYyA9IHRoaXMuc291cmNlLm5leHQoKSkgPT09IC0xKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXRCaXRzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY2NpdHRFT0Y7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodGhpcy5pbnB1dEJ1ZiA8PCAobiAtIHRoaXMuaW5wdXRCaXRzKSkgJiAoMHhmZmZmID4+ICgxNiAtIG4pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0QnVmID0gKHRoaXMuaW5wdXRCdWYgPDwgOCkgfCBjO1xuICAgICAgICB0aGlzLmlucHV0Qml0cyArPSA4O1xuICAgICAgfVxuICAgICAgcmV0dXJuICh0aGlzLmlucHV0QnVmID4+ICh0aGlzLmlucHV0Qml0cyAtIG4pKSAmICgweGZmZmYgPj4gKDE2IC0gbikpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9lYXRCaXRzKG4pIHtcbiAgICAgIGlmICgodGhpcy5pbnB1dEJpdHMgLT0gbikgPCAwKSB7XG4gICAgICAgIHRoaXMuaW5wdXRCaXRzID0gMDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBDQ0lUVEZheERlY29kZXI7XG59KSgpO1xuXG5leHBvcnQgeyBDQ0lUVEZheERlY29kZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBpc0RpY3QsIGlzU3RyZWFtIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgRGVjb2RlU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBKYmlnMkltYWdlIH0gZnJvbSBcIi4vamJpZzIuanNcIjtcbmltcG9ydCB7IHNoYWRvdyB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG4vKipcbiAqIEZvciBKQklHMidzIHdlIHVzZSBhIGxpYnJhcnkgdG8gZGVjb2RlIHRoZXNlIGltYWdlcyBhbmRcbiAqIHRoZSBzdHJlYW0gYmVoYXZlcyBsaWtlIGFsbCB0aGUgb3RoZXIgRGVjb2RlU3RyZWFtcy5cbiAqL1xuY29uc3QgSmJpZzJTdHJlYW0gPSAoZnVuY3Rpb24gSmJpZzJTdHJlYW1DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEpiaWcyU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGRpY3QsIHBhcmFtcykge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDtcbiAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXG4gICAgRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpO1xuICB9XG5cbiAgSmJpZzJTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSmJpZzJTdHJlYW0ucHJvdG90eXBlLCBcImJ5dGVzXCIsIHtcbiAgICBnZXQoKSB7XG4gICAgICAvLyBJZiBgdGhpcy5tYXliZUxlbmd0aGAgaXMgbnVsbCwgd2UnbGwgZ2V0IHRoZSBlbnRpcmUgc3RyZWFtLlxuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImJ5dGVzXCIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG5cbiAgSmJpZzJTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlciA9IGZ1bmN0aW9uIChyZXF1ZXN0ZWQpIHtcbiAgICAvLyBOby1vcCwgc2luY2UgYHRoaXMucmVhZEJsb2NrYCB3aWxsIGFsd2F5cyBwYXJzZSB0aGUgZW50aXJlIGltYWdlIGFuZFxuICAgIC8vIGRpcmVjdGx5IGluc2VydCBhbGwgb2YgaXRzIGRhdGEgaW50byBgdGhpcy5idWZmZXJgLlxuICB9O1xuXG4gIEpiaWcyU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGpiaWcySW1hZ2UgPSBuZXcgSmJpZzJJbWFnZSgpO1xuXG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgaWYgKGlzRGljdCh0aGlzLnBhcmFtcykpIHtcbiAgICAgIGNvbnN0IGdsb2JhbHNTdHJlYW0gPSB0aGlzLnBhcmFtcy5nZXQoXCJKQklHMkdsb2JhbHNcIik7XG4gICAgICBpZiAoaXNTdHJlYW0oZ2xvYmFsc1N0cmVhbSkpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFscyA9IGdsb2JhbHNTdHJlYW0uZ2V0Qnl0ZXMoKTtcbiAgICAgICAgY2h1bmtzLnB1c2goeyBkYXRhOiBnbG9iYWxzLCBzdGFydDogMCwgZW5kOiBnbG9iYWxzLmxlbmd0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2h1bmtzLnB1c2goeyBkYXRhOiB0aGlzLmJ5dGVzLCBzdGFydDogMCwgZW5kOiB0aGlzLmJ5dGVzLmxlbmd0aCB9KTtcbiAgICBjb25zdCBkYXRhID0gamJpZzJJbWFnZS5wYXJzZUNodW5rcyhjaHVua3MpO1xuICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAgIC8vIEpCSUcyIGhhZCBibGFjayBhcyAxIGFuZCB3aGl0ZSBhcyAwLCBpbnZlcnRpbmcgdGhlIGNvbG9yc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgaSsrKSB7XG4gICAgICBkYXRhW2ldIF49IDB4ZmY7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGFMZW5ndGg7XG4gICAgdGhpcy5lb2YgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBKYmlnMlN0cmVhbTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpiaWcyU3RyZWFtIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiwgc2hhZG93IH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBsb2cyLCByZWFkSW50OCwgcmVhZFVpbnQxNiwgcmVhZFVpbnQzMiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IEFyaXRobWV0aWNEZWNvZGVyIH0gZnJvbSBcIi4vYXJpdGhtZXRpY19kZWNvZGVyLmpzXCI7XG5pbXBvcnQgeyBDQ0lUVEZheERlY29kZXIgfSBmcm9tIFwiLi9jY2l0dC5qc1wiO1xuXG5jbGFzcyBKYmlnMkVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKGBKQklHMiBlcnJvcjogJHttc2d9YCk7XG4gIH1cbn1cblxudmFyIEpiaWcySW1hZ2UgPSAoZnVuY3Rpb24gSmJpZzJJbWFnZUNsb3N1cmUoKSB7XG4gIC8vIFV0aWxpdHkgZGF0YSBzdHJ1Y3R1cmVzXG4gIGZ1bmN0aW9uIENvbnRleHRDYWNoZSgpIHt9XG5cbiAgQ29udGV4dENhY2hlLnByb3RvdHlwZSA9IHtcbiAgICBnZXRDb250ZXh0cyhpZCkge1xuICAgICAgaWYgKGlkIGluIHRoaXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaWRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuICh0aGlzW2lkXSA9IG5ldyBJbnQ4QXJyYXkoMSA8PCAxNikpO1xuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIERlY29kaW5nQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IGRlY29kZXIoKSB7XG4gICAgICB2YXIgZGVjb2RlciA9IG5ldyBBcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMuZW5kKTtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJkZWNvZGVyXCIsIGRlY29kZXIpO1xuICAgIH0sXG4gICAgZ2V0IGNvbnRleHRDYWNoZSgpIHtcbiAgICAgIHZhciBjYWNoZSA9IG5ldyBDb250ZXh0Q2FjaGUoKTtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJjb250ZXh0Q2FjaGVcIiwgY2FjaGUpO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gQW5uZXggQS4gQXJpdGhtZXRpYyBJbnRlZ2VyIERlY29kaW5nIFByb2NlZHVyZVxuICAvLyBBLjIgUHJvY2VkdXJlIGZvciBkZWNvZGluZyB2YWx1ZXNcbiAgZnVuY3Rpb24gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIHByb2NlZHVyZSwgZGVjb2Rlcikge1xuICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpO1xuICAgIHZhciBwcmV2ID0gMTtcblxuICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGxlbmd0aCkge1xuICAgICAgdmFyIHYgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTtcbiAgICAgICAgcHJldiA9XG4gICAgICAgICAgcHJldiA8IDI1NiA/IChwcmV2IDw8IDEpIHwgYml0IDogKCgocHJldiA8PCAxKSB8IGJpdCkgJiA1MTEpIHwgMjU2O1xuICAgICAgICB2ID0gKHYgPDwgMSkgfCBiaXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdiA+Pj4gMDtcbiAgICB9XG5cbiAgICB2YXIgc2lnbiA9IHJlYWRCaXRzKDEpO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4gICAgdmFyIHZhbHVlID0gcmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgICAocmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDMyKSArIDQ0MzYpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRCaXRzKDEyKSArIDM0MCkgOlxuICAgICAgICAgICAgICAgICAgICAgIHJlYWRCaXRzKDgpICsgODQpIDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZEJpdHMoNikgKyAyMCkgOlxuICAgICAgICAgICAgICAgICAgcmVhZEJpdHMoNCkgKyA0KSA6XG4gICAgICAgICAgICAgICAgcmVhZEJpdHMoMik7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuICAgIGlmIChzaWduID09PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgIHJldHVybiAtdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQS4zIFRoZSBJQUlEIGRlY29kaW5nIHByb2NlZHVyZVxuICBmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkge1xuICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhcIklBSURcIik7XG5cbiAgICB2YXIgcHJldiA9IDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpO1xuICAgICAgcHJldiA9IChwcmV2IDw8IDEpIHwgYml0O1xuICAgIH1cbiAgICBpZiAoY29kZUxlbmd0aCA8IDMxKSB7XG4gICAgICByZXR1cm4gcHJldiAmICgoMSA8PCBjb2RlTGVuZ3RoKSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gcHJldiAmIDB4N2ZmZmZmZmY7XG4gIH1cblxuICAvLyA3LjMgU2VnbWVudCB0eXBlc1xuICB2YXIgU2VnbWVudFR5cGVzID0gW1xuICAgIFwiU3ltYm9sRGljdGlvbmFyeVwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIFwiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgXCJJbW1lZGlhdGVUZXh0UmVnaW9uXCIsXG4gICAgXCJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb25cIixcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgXCJQYXR0ZXJuRGljdGlvbmFyeVwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIFwiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb25cIixcbiAgICBudWxsLFxuICAgIFwiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb25cIixcbiAgICBcIkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb25cIixcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBcIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb25cIixcbiAgICBudWxsLFxuICAgIFwiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvblwiLFxuICAgIFwiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uXCIsXG4gICAgXCJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgXCJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIFwiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgXCJQYWdlSW5mb3JtYXRpb25cIixcbiAgICBcIkVuZE9mUGFnZVwiLFxuICAgIFwiRW5kT2ZTdHJpcGVcIixcbiAgICBcIkVuZE9mRmlsZVwiLFxuICAgIFwiUHJvZmlsZXNcIixcbiAgICBcIlRhYmxlc1wiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBcIkV4dGVuc2lvblwiLFxuICBdO1xuXG4gIHZhciBDb2RpbmdUZW1wbGF0ZXMgPSBbXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAyLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtNCwgeTogMCB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMiwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAyLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMywgeTogLTEgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtNCwgeTogMCB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gIF07XG5cbiAgdmFyIFJlZmluZW1lbnRUZW1wbGF0ZXMgPSBbXG4gICAge1xuICAgICAgY29kaW5nOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICBdLFxuICAgICAgcmVmZXJlbmNlOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMCwgeTogMCB9LFxuICAgICAgICB7IHg6IDEsIHk6IDAgfSxcbiAgICAgICAgeyB4OiAtMSwgeTogMSB9LFxuICAgICAgICB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAxIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgY29kaW5nOiBbXG4gICAgICAgIHsgeDogLTEsIHk6IC0xIH0sXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICBdLFxuICAgICAgcmVmZXJlbmNlOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgICAgICB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMCwgeTogMSB9LFxuICAgICAgICB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXTtcblxuICAvLyBTZWUgNi4yLjUuNyBEZWNvZGluZyB0aGUgYml0bWFwLlxuICB2YXIgUmV1c2VkQ29udGV4dHMgPSBbXG4gICAgMHg5YjI1LCAvLyAxMDAxMSAwMTEwMDEwIDAxMDFcbiAgICAweDA3OTUsIC8vIDAwMTEgMTEwMDEwIDEwMVxuICAgIDB4MDBlNSwgLy8gMDAxIDExMDAxIDAxXG4gICAgMHgwMTk1LCAvLyAwMTEwMDEgMDEwMVxuICBdO1xuXG4gIHZhciBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHMgPSBbXG4gICAgMHgwMDIwLCAvLyAnMDAwJyArICcwJyAoY29kaW5nKSArICcwMDAxMDAwMCcgKyAnMCcgKHJlZmVyZW5jZSlcbiAgICAweDAwMDgsIC8vICcwMDAwJyArICcwMDEwMDAnXG4gIF07XG5cbiAgZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkge1xuICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7XG4gICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhcIkdCXCIpO1xuICAgIHZhciBjb250ZXh0TGFiZWwsXG4gICAgICBpLFxuICAgICAgaixcbiAgICAgIHBpeGVsLFxuICAgICAgcm93LFxuICAgICAgcm93MSxcbiAgICAgIHJvdzIsXG4gICAgICBiaXRtYXAgPSBbXTtcblxuICAgIC8vIC4uLm9vb29vLi4uLlxuICAgIC8vIC4ub29vb29vby4uLiBDb250ZXh0IHRlbXBsYXRlIGZvciBjdXJyZW50IHBpeGVsIChYKVxuICAgIC8vIC5vb29vWC4uLi4uLiAoY29uY2F0ZW5hdGUgdmFsdWVzIG9mICdvJy1waXhlbHMgdG8gZ2V0IGNvbnRleHRMYWJlbClcbiAgICB2YXIgT0xEX1BJWEVMX01BU0sgPSAweDdiZjc7IC8vIDAxMTExIDAxMTExMTEgMDExMVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICByb3cgPSBiaXRtYXBbaV0gPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICByb3cxID0gaSA8IDEgPyByb3cgOiBiaXRtYXBbaSAtIDFdO1xuICAgICAgcm93MiA9IGkgPCAyID8gcm93IDogYml0bWFwW2kgLSAyXTtcblxuICAgICAgLy8gQXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdzpcbiAgICAgIC8vIEZpbGwgY29udGV4dExhYmVsIHdpdGggcGl4ZWxzIHRoYXQgYXJlIGFib3ZlL3JpZ2h0IG9mIChYKVxuICAgICAgY29udGV4dExhYmVsID1cbiAgICAgICAgKHJvdzJbMF0gPDwgMTMpIHxcbiAgICAgICAgKHJvdzJbMV0gPDwgMTIpIHxcbiAgICAgICAgKHJvdzJbMl0gPDwgMTEpIHxcbiAgICAgICAgKHJvdzFbMF0gPDwgNykgfFxuICAgICAgICAocm93MVsxXSA8PCA2KSB8XG4gICAgICAgIChyb3cxWzJdIDw8IDUpIHxcbiAgICAgICAgKHJvdzFbM10gPDwgNCk7XG5cbiAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpO1xuXG4gICAgICAgIC8vIEF0IGVhY2ggcGl4ZWw6IENsZWFyIGNvbnRleHRMYWJlbCBwaXhlbHMgdGhhdCBhcmUgc2hpZnRlZFxuICAgICAgICAvLyBvdXQgb2YgdGhlIGNvbnRleHQsIHRoZW4gYWRkIG5ldyBvbmVzLlxuICAgICAgICBjb250ZXh0TGFiZWwgPVxuICAgICAgICAgICgoY29udGV4dExhYmVsICYgT0xEX1BJWEVMX01BU0spIDw8IDEpIHxcbiAgICAgICAgICAoaiArIDMgPCB3aWR0aCA/IHJvdzJbaiArIDNdIDw8IDExIDogMCkgfFxuICAgICAgICAgIChqICsgNCA8IHdpZHRoID8gcm93MVtqICsgNF0gPDwgNCA6IDApIHxcbiAgICAgICAgICBwaXhlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gNi4yIEdlbmVyaWMgUmVnaW9uIERlY29kaW5nIFByb2NlZHVyZVxuICBmdW5jdGlvbiBkZWNvZGVCaXRtYXAoXG4gICAgbW1yLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB0ZW1wbGF0ZUluZGV4LFxuICAgIHByZWRpY3Rpb24sXG4gICAgc2tpcCxcbiAgICBhdCxcbiAgICBkZWNvZGluZ0NvbnRleHRcbiAgKSB7XG4gICAgaWYgKG1tcikge1xuICAgICAgY29uc3QgaW5wdXQgPSBuZXcgUmVhZGVyKFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuZGF0YSxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuZW5kXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFVzZSBvcHRpbWl6ZWQgdmVyc2lvbiBmb3IgdGhlIG1vc3QgY29tbW9uIGNhc2VcbiAgICBpZiAoXG4gICAgICB0ZW1wbGF0ZUluZGV4ID09PSAwICYmXG4gICAgICAhc2tpcCAmJlxuICAgICAgIXByZWRpY3Rpb24gJiZcbiAgICAgIGF0Lmxlbmd0aCA9PT0gNCAmJlxuICAgICAgYXRbMF0ueCA9PT0gMyAmJlxuICAgICAgYXRbMF0ueSA9PT0gLTEgJiZcbiAgICAgIGF0WzFdLnggPT09IC0zICYmXG4gICAgICBhdFsxXS55ID09PSAtMSAmJlxuICAgICAgYXRbMl0ueCA9PT0gMiAmJlxuICAgICAgYXRbMl0ueSA9PT0gLTIgJiZcbiAgICAgIGF0WzNdLnggPT09IC0yICYmXG4gICAgICBhdFszXS55ID09PSAtMlxuICAgICkge1xuICAgICAgcmV0dXJuIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpO1xuICAgIH1cblxuICAgIHZhciB1c2Vza2lwID0gISFza2lwO1xuICAgIHZhciB0ZW1wbGF0ZSA9IENvZGluZ1RlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5jb25jYXQoYXQpO1xuXG4gICAgLy8gU29ydGluZyBpcyBub24tc3RhbmRhcmQsIGFuZCBpdCBpcyBub3QgcmVxdWlyZWQuIEJ1dCBzb3J0aW5nIGluY3JlYXNlc1xuICAgIC8vIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYml0cyB0aGF0IGNhbiBiZSByZXVzZWQgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyBjb250ZXh0TGFiZWwgaW4gdGhlIG1haW4gbG9vcC5cbiAgICB0ZW1wbGF0ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS55IC0gYi55IHx8IGEueCAtIGIueDtcbiAgICB9KTtcblxuICAgIHZhciB0ZW1wbGF0ZUxlbmd0aCA9IHRlbXBsYXRlLmxlbmd0aDtcbiAgICB2YXIgdGVtcGxhdGVYID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7XG4gICAgdmFyIHRlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkodGVtcGxhdGVMZW5ndGgpO1xuICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcyA9IFtdO1xuICAgIHZhciByZXVzZU1hc2sgPSAwLFxuICAgICAgbWluWCA9IDAsXG4gICAgICBtYXhYID0gMCxcbiAgICAgIG1pblkgPSAwO1xuICAgIHZhciBjLCBrO1xuXG4gICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyspIHtcbiAgICAgIHRlbXBsYXRlWFtrXSA9IHRlbXBsYXRlW2tdLng7XG4gICAgICB0ZW1wbGF0ZVlba10gPSB0ZW1wbGF0ZVtrXS55O1xuICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHRlbXBsYXRlW2tdLngpO1xuICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHRlbXBsYXRlW2tdLngpO1xuICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHRlbXBsYXRlW2tdLnkpO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRlbXBsYXRlIHBpeGVsIGFwcGVhcnMgaW4gdHdvIGNvbnNlY3V0aXZlIGNvbnRleHQgbGFiZWxzLFxuICAgICAgLy8gc28gaXQgY2FuIGJlIHJldXNlZC4gT3RoZXJ3aXNlLCB3ZSBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgY2hhbmdpbmdcbiAgICAgIC8vIHRlbXBsYXRlIGVudHJpZXMuXG4gICAgICBpZiAoXG4gICAgICAgIGsgPCB0ZW1wbGF0ZUxlbmd0aCAtIDEgJiZcbiAgICAgICAgdGVtcGxhdGVba10ueSA9PT0gdGVtcGxhdGVbayArIDFdLnkgJiZcbiAgICAgICAgdGVtcGxhdGVba10ueCA9PT0gdGVtcGxhdGVbayArIDFdLnggLSAxXG4gICAgICApIHtcbiAgICAgICAgcmV1c2VNYXNrIHw9IDEgPDwgKHRlbXBsYXRlTGVuZ3RoIC0gMSAtIGspO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMucHVzaChrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNoYW5naW5nRW50cmllc0xlbmd0aCA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLmxlbmd0aDtcblxuICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTtcbiAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7XG4gICAgdmFyIGNoYW5naW5nVGVtcGxhdGVCaXQgPSBuZXcgVWludDE2QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTtcbiAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoOyBjKyspIHtcbiAgICAgIGsgPSBjaGFuZ2luZ1RlbXBsYXRlRW50cmllc1tjXTtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVYW2NdID0gdGVtcGxhdGVba10ueDtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVZW2NdID0gdGVtcGxhdGVba10ueTtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVCaXRbY10gPSAxIDw8ICh0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHNhZmUgYm91bmRpbmcgYm94IGVkZ2VzIGZyb20gdGhlIHdpZHRoLCBoZWlnaHQsIG1pblgsIG1heFgsIG1pbllcbiAgICB2YXIgc2JiX2xlZnQgPSAtbWluWDtcbiAgICB2YXIgc2JiX3RvcCA9IC1taW5ZO1xuICAgIHZhciBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7XG5cbiAgICB2YXIgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07XG4gICAgdmFyIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICB2YXIgYml0bWFwID0gW107XG5cbiAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyO1xuICAgIHZhciBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoXCJHQlwiKTtcblxuICAgIHZhciBsdHAgPSAwLFxuICAgICAgaixcbiAgICAgIGkwLFxuICAgICAgajAsXG4gICAgICBjb250ZXh0TGFiZWwgPSAwLFxuICAgICAgYml0LFxuICAgICAgc2hpZnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgICAgaWYgKHByZWRpY3Rpb24pIHtcbiAgICAgICAgdmFyIHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7XG4gICAgICAgIGx0cCBePSBzbHRwO1xuICAgICAgICBpZiAobHRwKSB7XG4gICAgICAgICAgYml0bWFwLnB1c2gocm93KTsgLy8gZHVwbGljYXRlIHByZXZpb3VzIHJvd1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByb3cgPSBuZXcgVWludDhBcnJheShyb3cpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHtcbiAgICAgICAgICByb3dbal0gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFyZSB3ZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2NhbmxpbmUsIHNvIHdlIGNhbiByZXVzZSBjb250ZXh0TGFiZWxcbiAgICAgICAgLy8gYml0cz9cbiAgICAgICAgaWYgKGogPj0gc2JiX2xlZnQgJiYgaiA8IHNiYl9yaWdodCAmJiBpID49IHNiYl90b3ApIHtcbiAgICAgICAgICAvLyBJZiB5ZXMsIHdlIGNhbiBqdXN0IHNoaWZ0IHRoZSBiaXRzIHRoYXQgYXJlIHJldXNhYmxlIGFuZCBvbmx5XG4gICAgICAgICAgLy8gZmV0Y2ggdGhlIHJlbWFpbmluZyBvbmVzLlxuICAgICAgICAgIGNvbnRleHRMYWJlbCA9IChjb250ZXh0TGFiZWwgPDwgMSkgJiByZXVzZU1hc2s7XG4gICAgICAgICAgZm9yIChrID0gMDsgayA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBpMCA9IGkgKyBjaGFuZ2luZ1RlbXBsYXRlWVtrXTtcbiAgICAgICAgICAgIGowID0gaiArIGNoYW5naW5nVGVtcGxhdGVYW2tdO1xuICAgICAgICAgICAgYml0ID0gYml0bWFwW2kwXVtqMF07XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107XG4gICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGNvbnRleHRMYWJlbCBmcm9tIHNjcmF0Y2hcbiAgICAgICAgICBjb250ZXh0TGFiZWwgPSAwO1xuICAgICAgICAgIHNoaWZ0ID0gdGVtcGxhdGVMZW5ndGggLSAxO1xuICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZUxlbmd0aDsgaysrLCBzaGlmdC0tKSB7XG4gICAgICAgICAgICBqMCA9IGogKyB0ZW1wbGF0ZVhba107XG4gICAgICAgICAgICBpZiAoajAgPj0gMCAmJiBqMCA8IHdpZHRoKSB7XG4gICAgICAgICAgICAgIGkwID0gaSArIHRlbXBsYXRlWVtrXTtcbiAgICAgICAgICAgICAgaWYgKGkwID49IDApIHtcbiAgICAgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTtcbiAgICAgICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0TGFiZWwgfD0gYml0IDw8IHNoaWZ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gNi4zLjIgR2VuZXJpYyBSZWZpbmVtZW50IFJlZ2lvbiBEZWNvZGluZyBQcm9jZWR1cmVcbiAgZnVuY3Rpb24gZGVjb2RlUmVmaW5lbWVudChcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgdGVtcGxhdGVJbmRleCxcbiAgICByZWZlcmVuY2VCaXRtYXAsXG4gICAgb2Zmc2V0WCxcbiAgICBvZmZzZXRZLFxuICAgIHByZWRpY3Rpb24sXG4gICAgYXQsXG4gICAgZGVjb2RpbmdDb250ZXh0XG4gICkge1xuICAgIHZhciBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nO1xuICAgIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7XG4gICAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTtcbiAgICB9XG4gICAgdmFyIGNvZGluZ1RlbXBsYXRlTGVuZ3RoID0gY29kaW5nVGVtcGxhdGUubGVuZ3RoO1xuICAgIHZhciBjb2RpbmdUZW1wbGF0ZVggPSBuZXcgSW50MzJBcnJheShjb2RpbmdUZW1wbGF0ZUxlbmd0aCk7XG4gICAgdmFyIGNvZGluZ1RlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTtcbiAgICB2YXIgaztcbiAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykge1xuICAgICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDtcbiAgICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7XG4gICAgfVxuXG4gICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlID0gUmVmaW5lbWVudFRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5yZWZlcmVuY2U7XG4gICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHtcbiAgICAgIHJlZmVyZW5jZVRlbXBsYXRlID0gcmVmZXJlbmNlVGVtcGxhdGUuY29uY2F0KFthdFsxXV0pO1xuICAgIH1cbiAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGggPSByZWZlcmVuY2VUZW1wbGF0ZS5sZW5ndGg7XG4gICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTtcbiAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVZID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpO1xuICAgIGZvciAoayA9IDA7IGsgPCByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aDsgaysrKSB7XG4gICAgICByZWZlcmVuY2VUZW1wbGF0ZVhba10gPSByZWZlcmVuY2VUZW1wbGF0ZVtrXS54O1xuICAgICAgcmVmZXJlbmNlVGVtcGxhdGVZW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueTtcbiAgICB9XG4gICAgdmFyIHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDtcbiAgICB2YXIgcmVmZXJlbmNlSGVpZ2h0ID0gcmVmZXJlbmNlQml0bWFwLmxlbmd0aDtcblxuICAgIHZhciBwc2V1ZG9QaXhlbENvbnRleHQgPSBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07XG4gICAgdmFyIGJpdG1hcCA9IFtdO1xuXG4gICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjtcbiAgICB2YXIgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKFwiR1JcIik7XG5cbiAgICB2YXIgbHRwID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICBpZiAocHJlZGljdGlvbikge1xuICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTtcbiAgICAgICAgbHRwIF49IHNsdHA7XG4gICAgICAgIGlmIChsdHApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICAgIGJpdG1hcC5wdXNoKHJvdyk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgdmFyIGkwLCBqMDtcbiAgICAgICAgdmFyIGNvbnRleHRMYWJlbCA9IDA7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBjb2RpbmdUZW1wbGF0ZUxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgaTAgPSBpICsgY29kaW5nVGVtcGxhdGVZW2tdO1xuICAgICAgICAgIGowID0gaiArIGNvZGluZ1RlbXBsYXRlWFtrXTtcbiAgICAgICAgICBpZiAoaTAgPCAwIHx8IGowIDwgMCB8fCBqMCA+PSB3aWR0aCkge1xuICAgICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOyAvLyBvdXQgb2YgYm91bmQgcGl4ZWxcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCA8PCAxKSB8IGJpdG1hcFtpMF1bajBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykge1xuICAgICAgICAgIGkwID0gaSArIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSAtIG9mZnNldFk7XG4gICAgICAgICAgajAgPSBqICsgcmVmZXJlbmNlVGVtcGxhdGVYW2tdIC0gb2Zmc2V0WDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpMCA8IDAgfHxcbiAgICAgICAgICAgIGkwID49IHJlZmVyZW5jZUhlaWdodCB8fFxuICAgICAgICAgICAgajAgPCAwIHx8XG4gICAgICAgICAgICBqMCA+PSByZWZlcmVuY2VXaWR0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOyAvLyBvdXQgb2YgYm91bmQgcGl4ZWxcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCA8PCAxKSB8IHJlZmVyZW5jZUJpdG1hcFtpMF1bajBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICAvLyA2LjUuNSBEZWNvZGluZyB0aGUgc3ltYm9sIGRpY3Rpb25hcnlcbiAgZnVuY3Rpb24gZGVjb2RlU3ltYm9sRGljdGlvbmFyeShcbiAgICBodWZmbWFuLFxuICAgIHJlZmluZW1lbnQsXG4gICAgc3ltYm9scyxcbiAgICBudW1iZXJPZk5ld1N5bWJvbHMsXG4gICAgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsXG4gICAgaHVmZm1hblRhYmxlcyxcbiAgICB0ZW1wbGF0ZUluZGV4LFxuICAgIGF0LFxuICAgIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LFxuICAgIHJlZmluZW1lbnRBdCxcbiAgICBkZWNvZGluZ0NvbnRleHQsXG4gICAgaHVmZm1hbklucHV0XG4gICkge1xuICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgdmFyIG5ld1N5bWJvbHMgPSBbXTtcbiAgICB2YXIgY3VycmVudEhlaWdodCA9IDA7XG4gICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSBsb2cyKHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzKTtcblxuICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7XG4gICAgdmFyIGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7XG4gICAgbGV0IHRhYmxlQjEsIHN5bWJvbFdpZHRocztcbiAgICBpZiAoaHVmZm1hbikge1xuICAgICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7IC8vIHN0YW5kYXJkIHRhYmxlIEIuMVxuICAgICAgc3ltYm9sV2lkdGhzID0gW107XG4gICAgICBzeW1ib2xDb2RlTGVuZ3RoID0gTWF0aC5tYXgoc3ltYm9sQ29kZUxlbmd0aCwgMSk7IC8vIDYuNS44LjIuM1xuICAgIH1cblxuICAgIHdoaWxlIChuZXdTeW1ib2xzLmxlbmd0aCA8IG51bWJlck9mTmV3U3ltYm9scykge1xuICAgICAgdmFyIGRlbHRhSGVpZ2h0ID0gaHVmZm1hblxuICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YUhlaWdodC5kZWNvZGUoaHVmZm1hbklucHV0KVxuICAgICAgICA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBREhcIiwgZGVjb2Rlcik7IC8vIDYuNS42XG4gICAgICBjdXJyZW50SGVpZ2h0ICs9IGRlbHRhSGVpZ2h0O1xuICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IDAsXG4gICAgICAgIHRvdGFsV2lkdGggPSAwO1xuICAgICAgY29uc3QgZmlyc3RTeW1ib2wgPSBodWZmbWFuID8gc3ltYm9sV2lkdGhzLmxlbmd0aCA6IDA7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsdGFXaWR0aCA9IGh1ZmZtYW5cbiAgICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVdpZHRoLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQURXXCIsIGRlY29kZXIpOyAvLyA2LjUuN1xuICAgICAgICBpZiAoZGVsdGFXaWR0aCA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrOyAvLyBPT0JcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDtcbiAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7XG4gICAgICAgIHZhciBiaXRtYXA7XG4gICAgICAgIGlmIChyZWZpbmVtZW50KSB7XG4gICAgICAgICAgLy8gNi41LjguMiBSZWZpbmVtZW50L2FnZ3JlZ2F0ZS1jb2RlZCBzeW1ib2wgYml0bWFwXG4gICAgICAgICAgdmFyIG51bWJlck9mSW5zdGFuY2VzID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFBSVwiLCBkZWNvZGVyKTtcbiAgICAgICAgICBpZiAobnVtYmVyT2ZJbnN0YW5jZXMgPiAxKSB7XG4gICAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKFxuICAgICAgICAgICAgICBodWZmbWFuLFxuICAgICAgICAgICAgICByZWZpbmVtZW50LFxuICAgICAgICAgICAgICBjdXJyZW50V2lkdGgsXG4gICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIG51bWJlck9mSW5zdGFuY2VzLFxuICAgICAgICAgICAgICAxLCAvLyBzdHJpcCBzaXplXG4gICAgICAgICAgICAgIHN5bWJvbHMuY29uY2F0KG5ld1N5bWJvbHMpLFxuICAgICAgICAgICAgICBzeW1ib2xDb2RlTGVuZ3RoLFxuICAgICAgICAgICAgICAwLCAvLyB0cmFuc3Bvc2VkXG4gICAgICAgICAgICAgIDAsIC8vIGRzIG9mZnNldFxuICAgICAgICAgICAgICAxLCAvLyB0b3AgbGVmdCA3LjQuMy4xLjFcbiAgICAgICAgICAgICAgMCwgLy8gT1Igb3BlcmF0b3JcbiAgICAgICAgICAgICAgaHVmZm1hblRhYmxlcyxcbiAgICAgICAgICAgICAgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICAgIHJlZmluZW1lbnRBdCxcbiAgICAgICAgICAgICAgZGVjb2RpbmdDb250ZXh0LFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBodWZmbWFuSW5wdXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2xJZCA9IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciByZHggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWFwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjNcbiAgICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWVwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjRcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPVxuICAgICAgICAgICAgICBzeW1ib2xJZCA8IHN5bWJvbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBzeW1ib2xzW3N5bWJvbElkXVxuICAgICAgICAgICAgICAgIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTtcbiAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoXG4gICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCxcbiAgICAgICAgICAgICAgY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgICAgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgICAgcmR4LFxuICAgICAgICAgICAgICByZHksXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICByZWZpbmVtZW50QXQsXG4gICAgICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaHVmZm1hbikge1xuICAgICAgICAgIC8vIFN0b3JlIG9ubHkgc3ltYm9sIHdpZHRoIGFuZCBkZWNvZGUgYSBjb2xsZWN0aXZlIGJpdG1hcCB3aGVuIHRoZVxuICAgICAgICAgIC8vIGhlaWdodCBjbGFzcyBpcyBkb25lLlxuICAgICAgICAgIHN5bWJvbFdpZHRocy5wdXNoKGN1cnJlbnRXaWR0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gNi41LjguMSBEaXJlY3QtY29kZWQgc3ltYm9sIGJpdG1hcFxuICAgICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgY3VycmVudFdpZHRoLFxuICAgICAgICAgICAgY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgIHRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBhdCxcbiAgICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChodWZmbWFuICYmICFyZWZpbmVtZW50KSB7XG4gICAgICAgIC8vIDYuNS45IEhlaWdodCBjbGFzcyBjb2xsZWN0aXZlIGJpdG1hcFxuICAgICAgICBjb25zdCBiaXRtYXBTaXplID0gaHVmZm1hblRhYmxlcy50YWJsZUJpdG1hcFNpemUuZGVjb2RlKGh1ZmZtYW5JbnB1dCk7XG4gICAgICAgIGh1ZmZtYW5JbnB1dC5ieXRlQWxpZ24oKTtcbiAgICAgICAgbGV0IGNvbGxlY3RpdmVCaXRtYXA7XG4gICAgICAgIGlmIChiaXRtYXBTaXplID09PSAwKSB7XG4gICAgICAgICAgLy8gVW5jb21wcmVzc2VkIGNvbGxlY3RpdmUgYml0bWFwXG4gICAgICAgICAgY29sbGVjdGl2ZUJpdG1hcCA9IHJlYWRVbmNvbXByZXNzZWRCaXRtYXAoXG4gICAgICAgICAgICBodWZmbWFuSW5wdXQsXG4gICAgICAgICAgICB0b3RhbFdpZHRoLFxuICAgICAgICAgICAgY3VycmVudEhlaWdodFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTU1SIGNvbGxlY3RpdmUgYml0bWFwXG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kO1xuICAgICAgICAgIGNvbnN0IGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7XG4gICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDtcbiAgICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKFxuICAgICAgICAgICAgaHVmZm1hbklucHV0LFxuICAgICAgICAgICAgdG90YWxXaWR0aCxcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IG9yaWdpbmFsRW5kO1xuICAgICAgICAgIGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiA9IGJpdG1hcEVuZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkID0gc3ltYm9sV2lkdGhzLmxlbmd0aDtcbiAgICAgICAgaWYgKGZpcnN0U3ltYm9sID09PSBudW1iZXJPZlN5bWJvbHNEZWNvZGVkIC0gMSkge1xuICAgICAgICAgIC8vIGNvbGxlY3RpdmVCaXRtYXAgaXMgYSBzaW5nbGUgc3ltYm9sLlxuICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChjb2xsZWN0aXZlQml0bWFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEaXZpZGUgY29sbGVjdGl2ZUJpdG1hcCBpbnRvIHN5bWJvbHMuXG4gICAgICAgICAgbGV0IGksXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgeE1pbiA9IDAsXG4gICAgICAgICAgICB4TWF4LFxuICAgICAgICAgICAgYml0bWFwV2lkdGgsXG4gICAgICAgICAgICBzeW1ib2xCaXRtYXA7XG4gICAgICAgICAgZm9yIChpID0gZmlyc3RTeW1ib2w7IGkgPCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkOyBpKyspIHtcbiAgICAgICAgICAgIGJpdG1hcFdpZHRoID0gc3ltYm9sV2lkdGhzW2ldO1xuICAgICAgICAgICAgeE1heCA9IHhNaW4gKyBiaXRtYXBXaWR0aDtcbiAgICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IFtdO1xuICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChzeW1ib2xCaXRtYXApO1xuICAgICAgICAgICAgeE1pbiA9IHhNYXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNi41LjEwIEV4cG9ydGVkIHN5bWJvbHNcbiAgICB2YXIgZXhwb3J0ZWRTeW1ib2xzID0gW107XG4gICAgdmFyIGZsYWdzID0gW10sXG4gICAgICBjdXJyZW50RmxhZyA9IGZhbHNlO1xuICAgIHZhciB0b3RhbFN5bWJvbHNMZW5ndGggPSBzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9scztcbiAgICB3aGlsZSAoZmxhZ3MubGVuZ3RoIDwgdG90YWxTeW1ib2xzTGVuZ3RoKSB7XG4gICAgICB2YXIgcnVuTGVuZ3RoID0gaHVmZm1hblxuICAgICAgICA/IHRhYmxlQjEuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQUVYXCIsIGRlY29kZXIpO1xuICAgICAgd2hpbGUgKHJ1bkxlbmd0aC0tKSB7XG4gICAgICAgIGZsYWdzLnB1c2goY3VycmVudEZsYWcpO1xuICAgICAgfVxuICAgICAgY3VycmVudEZsYWcgPSAhY3VycmVudEZsYWc7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN5bWJvbHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgaWYgKGZsYWdzW2ldKSB7XG4gICAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKHN5bWJvbHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bWJlck9mTmV3U3ltYm9sczsgaSsrLCBqKyspIHtcbiAgICAgIGlmIChmbGFnc1tpXSkge1xuICAgICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChuZXdTeW1ib2xzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cG9ydGVkU3ltYm9scztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZVRleHRSZWdpb24oXG4gICAgaHVmZm1hbixcbiAgICByZWZpbmVtZW50LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkZWZhdWx0UGl4ZWxWYWx1ZSxcbiAgICBudW1iZXJPZlN5bWJvbEluc3RhbmNlcyxcbiAgICBzdHJpcFNpemUsXG4gICAgaW5wdXRTeW1ib2xzLFxuICAgIHN5bWJvbENvZGVMZW5ndGgsXG4gICAgdHJhbnNwb3NlZCxcbiAgICBkc09mZnNldCxcbiAgICByZWZlcmVuY2VDb3JuZXIsXG4gICAgY29tYmluYXRpb25PcGVyYXRvcixcbiAgICBodWZmbWFuVGFibGVzLFxuICAgIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LFxuICAgIHJlZmluZW1lbnRBdCxcbiAgICBkZWNvZGluZ0NvbnRleHQsXG4gICAgbG9nU3RyaXBTaXplLFxuICAgIGh1ZmZtYW5JbnB1dFxuICApIHtcbiAgICBpZiAoaHVmZm1hbiAmJiByZWZpbmVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBiaXRtYXBcbiAgICB2YXIgYml0bWFwID0gW107XG4gICAgdmFyIGksIHJvdztcbiAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgICByb3dbal0gPSBkZWZhdWx0UGl4ZWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyO1xuICAgIHZhciBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlO1xuXG4gICAgdmFyIHN0cmlwVCA9IGh1ZmZtYW5cbiAgICAgID8gLWh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgIDogLWRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBRFRcIiwgZGVjb2Rlcik7IC8vIDYuNC42XG4gICAgdmFyIGZpcnN0UyA9IDA7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykge1xuICAgICAgdmFyIGRlbHRhVCA9IGh1ZmZtYW5cbiAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFEVFwiLCBkZWNvZGVyKTsgLy8gNi40LjZcbiAgICAgIHN0cmlwVCArPSBkZWx0YVQ7XG5cbiAgICAgIHZhciBkZWx0YUZpcnN0UyA9IGh1ZmZtYW5cbiAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRmlyc3RTLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFGU1wiLCBkZWNvZGVyKTsgLy8gNi40LjdcbiAgICAgIGZpcnN0UyArPSBkZWx0YUZpcnN0UztcbiAgICAgIHZhciBjdXJyZW50UyA9IGZpcnN0UztcbiAgICAgIGRvIHtcbiAgICAgICAgbGV0IGN1cnJlbnRUID0gMDsgLy8gNi40LjlcbiAgICAgICAgaWYgKHN0cmlwU2l6ZSA+IDEpIHtcbiAgICAgICAgICBjdXJyZW50VCA9IGh1ZmZtYW5cbiAgICAgICAgICAgID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSlcbiAgICAgICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFJVFwiLCBkZWNvZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdCA9IHN0cmlwU2l6ZSAqIHN0cmlwVCArIGN1cnJlbnRUO1xuICAgICAgICB2YXIgc3ltYm9sSWQgPSBodWZmbWFuXG4gICAgICAgICAgPyBodWZmbWFuVGFibGVzLnN5bWJvbElEVGFibGUuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgICA6IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTtcbiAgICAgICAgdmFyIGFwcGx5UmVmaW5lbWVudCA9XG4gICAgICAgICAgcmVmaW5lbWVudCAmJlxuICAgICAgICAgIChodWZmbWFuXG4gICAgICAgICAgICA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0KClcbiAgICAgICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFSSVwiLCBkZWNvZGVyKSk7XG4gICAgICAgIHZhciBzeW1ib2xCaXRtYXAgPSBpbnB1dFN5bWJvbHNbc3ltYm9sSWRdO1xuICAgICAgICB2YXIgc3ltYm9sV2lkdGggPSBzeW1ib2xCaXRtYXBbMF0ubGVuZ3RoO1xuICAgICAgICB2YXIgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sQml0bWFwLmxlbmd0aDtcbiAgICAgICAgaWYgKGFwcGx5UmVmaW5lbWVudCkge1xuICAgICAgICAgIHZhciByZHcgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEV1wiLCBkZWNvZGVyKTsgLy8gNi40LjExLjFcbiAgICAgICAgICB2YXIgcmRoID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFSREhcIiwgZGVjb2Rlcik7IC8vIDYuNC4xMS4yXG4gICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBUkRYXCIsIGRlY29kZXIpOyAvLyA2LjQuMTEuM1xuICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWVwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjRcbiAgICAgICAgICBzeW1ib2xXaWR0aCArPSByZHc7XG4gICAgICAgICAgc3ltYm9sSGVpZ2h0ICs9IHJkaDtcbiAgICAgICAgICBzeW1ib2xCaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KFxuICAgICAgICAgICAgc3ltYm9sV2lkdGgsXG4gICAgICAgICAgICBzeW1ib2xIZWlnaHQsXG4gICAgICAgICAgICByZWZpbmVtZW50VGVtcGxhdGVJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEJpdG1hcCxcbiAgICAgICAgICAgIChyZHcgPj4gMSkgKyByZHgsXG4gICAgICAgICAgICAocmRoID4+IDEpICsgcmR5LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICByZWZpbmVtZW50QXQsXG4gICAgICAgICAgICBkZWNvZGluZ0NvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpO1xuICAgICAgICB2YXIgb2Zmc2V0UyA9IGN1cnJlbnRTIC0gKHJlZmVyZW5jZUNvcm5lciAmIDIgPyBzeW1ib2xXaWR0aCAtIDEgOiAwKTtcbiAgICAgICAgdmFyIHMyLCB0Miwgc3ltYm9sUm93O1xuICAgICAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgICAgIC8vIFBsYWNlIFN5bWJvbCBCaXRtYXAgZnJvbSBUMSxTMVxuICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbEhlaWdodDsgczIrKykge1xuICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFMgKyBzMl07XG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFtzMl07XG4gICAgICAgICAgICAvLyBUbyBpZ25vcmUgUGFydHMgb2YgU3ltYm9sIGJpdG1hcCB3aGljaCBnb2VzXG4gICAgICAgICAgICAvLyBvdXRzaWRlIGJpdG1hcCByZWdpb25cbiAgICAgICAgICAgIHZhciBtYXhXaWR0aCA9IE1hdGgubWluKHdpZHRoIC0gb2Zmc2V0VCwgc3ltYm9sV2lkdGgpO1xuICAgICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogLy8gT1JcbiAgICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykge1xuICAgICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gfD0gc3ltYm9sUm93W3QyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgMjogLy8gWE9SXG4gICAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHtcbiAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIF49IHN5bWJvbFJvd1t0Ml07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFxuICAgICAgICAgICAgICAgICAgYG9wZXJhdG9yICR7Y29tYmluYXRpb25PcGVyYXRvcn0gaXMgbm90IHN1cHBvcnRlZGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xIZWlnaHQgLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykge1xuICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07XG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFt0Ml07XG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiAvLyBPUlxuICAgICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7XG4gICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAyOiAvLyBYT1JcbiAgICAgICAgICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xXaWR0aDsgczIrKykge1xuICAgICAgICAgICAgICAgICAgcm93W29mZnNldFMgKyBzMl0gXj0gc3ltYm9sUm93W3MyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbFdpZHRoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICAgIHZhciBkZWx0YVMgPSBodWZmbWFuXG4gICAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFTLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQURTXCIsIGRlY29kZXIpOyAvLyA2LjQuOFxuICAgICAgICBpZiAoZGVsdGFTID09PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7IC8vIE9PQlxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTICs9IGRlbHRhUyArIGRzT2Zmc2V0O1xuICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShcbiAgICBtbXIsXG4gICAgcGF0dGVybldpZHRoLFxuICAgIHBhdHRlcm5IZWlnaHQsXG4gICAgbWF4UGF0dGVybkluZGV4LFxuICAgIHRlbXBsYXRlLFxuICAgIGRlY29kaW5nQ29udGV4dFxuICApIHtcbiAgICBjb25zdCBhdCA9IFtdO1xuICAgIGlmICghbW1yKSB7XG4gICAgICBhdC5wdXNoKHtcbiAgICAgICAgeDogLXBhdHRlcm5XaWR0aCxcbiAgICAgICAgeTogMCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0zLFxuICAgICAgICAgIHk6IC0xLFxuICAgICAgICB9KTtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAtMixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0yLFxuICAgICAgICAgIHk6IC0yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29sbGVjdGl2ZVdpZHRoID0gKG1heFBhdHRlcm5JbmRleCArIDEpICogcGF0dGVybldpZHRoO1xuICAgIGNvbnN0IGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVCaXRtYXAoXG4gICAgICBtbXIsXG4gICAgICBjb2xsZWN0aXZlV2lkdGgsXG4gICAgICBwYXR0ZXJuSGVpZ2h0LFxuICAgICAgdGVtcGxhdGUsXG4gICAgICBmYWxzZSxcbiAgICAgIG51bGwsXG4gICAgICBhdCxcbiAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICk7XG4gICAgLy8gRGl2aWRlIGNvbGxlY3RpdmUgYml0bWFwIGludG8gcGF0dGVybnMuXG4gICAgY29uc3QgcGF0dGVybnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBtYXhQYXR0ZXJuSW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVybkJpdG1hcCA9IFtdO1xuICAgICAgY29uc3QgeE1pbiA9IHBhdHRlcm5XaWR0aCAqIGk7XG4gICAgICBjb25zdCB4TWF4ID0geE1pbiArIHBhdHRlcm5XaWR0aDtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcGF0dGVybkhlaWdodDsgeSsrKSB7XG4gICAgICAgIHBhdHRlcm5CaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2gocGF0dGVybkJpdG1hcCk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZUhhbGZ0b25lUmVnaW9uKFxuICAgIG1tcixcbiAgICBwYXR0ZXJucyxcbiAgICB0ZW1wbGF0ZSxcbiAgICByZWdpb25XaWR0aCxcbiAgICByZWdpb25IZWlnaHQsXG4gICAgZGVmYXVsdFBpeGVsVmFsdWUsXG4gICAgZW5hYmxlU2tpcCxcbiAgICBjb21iaW5hdGlvbk9wZXJhdG9yLFxuICAgIGdyaWRXaWR0aCxcbiAgICBncmlkSGVpZ2h0LFxuICAgIGdyaWRPZmZzZXRYLFxuICAgIGdyaWRPZmZzZXRZLFxuICAgIGdyaWRWZWN0b3JYLFxuICAgIGdyaWRWZWN0b3JZLFxuICAgIGRlY29kaW5nQ29udGV4dFxuICApIHtcbiAgICBjb25zdCBza2lwID0gbnVsbDtcbiAgICBpZiAoZW5hYmxlU2tpcCkge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJza2lwIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuICAgIGlmIChjb21iaW5hdGlvbk9wZXJhdG9yICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcbiAgICAgICAgXCJvcGVyYXRvciBcIiArXG4gICAgICAgICAgY29tYmluYXRpb25PcGVyYXRvciArXG4gICAgICAgICAgXCIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb25cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIGJpdG1hcC5cbiAgICBjb25zdCByZWdpb25CaXRtYXAgPSBbXTtcbiAgICBsZXQgaSwgaiwgcm93O1xuICAgIGZvciAoaSA9IDA7IGkgPCByZWdpb25IZWlnaHQ7IGkrKykge1xuICAgICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocmVnaW9uV2lkdGgpO1xuICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCByZWdpb25XaWR0aDsgaisrKSB7XG4gICAgICAgICAgcm93W2pdID0gZGVmYXVsdFBpeGVsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgY29uc3QgbnVtYmVyT2ZQYXR0ZXJucyA9IHBhdHRlcm5zLmxlbmd0aDtcbiAgICBjb25zdCBwYXR0ZXJuMCA9IHBhdHRlcm5zWzBdO1xuICAgIGNvbnN0IHBhdHRlcm5XaWR0aCA9IHBhdHRlcm4wWzBdLmxlbmd0aCxcbiAgICAgIHBhdHRlcm5IZWlnaHQgPSBwYXR0ZXJuMC5sZW5ndGg7XG4gICAgY29uc3QgYml0c1BlclZhbHVlID0gbG9nMihudW1iZXJPZlBhdHRlcm5zKTtcbiAgICBjb25zdCBhdCA9IFtdO1xuICAgIGlmICghbW1yKSB7XG4gICAgICBhdC5wdXNoKHtcbiAgICAgICAgeDogdGVtcGxhdGUgPD0gMSA/IDMgOiAyLFxuICAgICAgICB5OiAtMSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0zLFxuICAgICAgICAgIHk6IC0xLFxuICAgICAgICB9KTtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAtMixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0yLFxuICAgICAgICAgIHk6IC0yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQW5uZXggQy4gR3JheS1zY2FsZSBJbWFnZSBEZWNvZGluZyBQcm9jZWR1cmUuXG4gICAgY29uc3QgZ3JheVNjYWxlQml0UGxhbmVzID0gW107XG4gICAgbGV0IG1tcklucHV0LCBiaXRtYXA7XG4gICAgaWYgKG1tcikge1xuICAgICAgLy8gTU1SIGJpdCBwbGFuZXMgYXJlIGluIG9uZSBjb250aW51b3VzIHN0cmVhbS4gT25seSBFT0ZCIGNvZGVzIGluZGljYXRlXG4gICAgICAvLyB0aGUgZW5kIG9mIGVhY2ggYml0bWFwLCBzbyBFT0ZCcyBtdXN0IGJlIGRlY29kZWQuXG4gICAgICBtbXJJbnB1dCA9IG5ldyBSZWFkZXIoXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5kYXRhLFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuc3RhcnQsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5lbmRcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoaSA9IGJpdHNQZXJWYWx1ZSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAobW1yKSB7XG4gICAgICAgIGJpdG1hcCA9IGRlY29kZU1NUkJpdG1hcChtbXJJbnB1dCwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBncmlkV2lkdGgsXG4gICAgICAgICAgZ3JpZEhlaWdodCxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBza2lwLFxuICAgICAgICAgIGF0LFxuICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZ3JheVNjYWxlQml0UGxhbmVzW2ldID0gYml0bWFwO1xuICAgIH1cbiAgICAvLyA2LjYuNS4yIFJlbmRlcmluZyB0aGUgcGF0dGVybnMuXG4gICAgbGV0IG1nLCBuZywgYml0LCBwYXR0ZXJuSW5kZXgsIHBhdHRlcm5CaXRtYXAsIHgsIHksIHBhdHRlcm5Sb3csIHJlZ2lvblJvdztcbiAgICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7XG4gICAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHtcbiAgICAgICAgYml0ID0gMDtcbiAgICAgICAgcGF0dGVybkluZGV4ID0gMDtcbiAgICAgICAgZm9yIChqID0gYml0c1BlclZhbHVlIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICBiaXQgPSBncmF5U2NhbGVCaXRQbGFuZXNbal1bbWddW25nXSBeIGJpdDsgLy8gR3JheSBkZWNvZGluZ1xuICAgICAgICAgIHBhdHRlcm5JbmRleCB8PSBiaXQgPDwgajtcbiAgICAgICAgfVxuICAgICAgICBwYXR0ZXJuQml0bWFwID0gcGF0dGVybnNbcGF0dGVybkluZGV4XTtcbiAgICAgICAgeCA9IChncmlkT2Zmc2V0WCArIG1nICogZ3JpZFZlY3RvclkgKyBuZyAqIGdyaWRWZWN0b3JYKSA+PiA4O1xuICAgICAgICB5ID0gKGdyaWRPZmZzZXRZICsgbWcgKiBncmlkVmVjdG9yWCAtIG5nICogZ3JpZFZlY3RvclkpID4+IDg7XG4gICAgICAgIC8vIERyYXcgcGF0dGVybkJpdG1hcCBhdCAoeCwgeSkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB4ID49IDAgJiZcbiAgICAgICAgICB4ICsgcGF0dGVybldpZHRoIDw9IHJlZ2lvbldpZHRoICYmXG4gICAgICAgICAgeSA+PSAwICYmXG4gICAgICAgICAgeSArIHBhdHRlcm5IZWlnaHQgPD0gcmVnaW9uSGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFt5ICsgaV07XG4gICAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykge1xuICAgICAgICAgICAgICByZWdpb25Sb3dbeCArIGpdIHw9IHBhdHRlcm5Sb3dbal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZWdpb25YLCByZWdpb25ZO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTtcbiAgICAgICAgICAgIGlmIChyZWdpb25ZIDwgMCB8fCByZWdpb25ZID49IHJlZ2lvbkhlaWdodCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFtyZWdpb25ZXTtcbiAgICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajtcbiAgICAgICAgICAgICAgaWYgKHJlZ2lvblggPj0gMCAmJiByZWdpb25YIDwgcmVnaW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICByZWdpb25Sb3dbcmVnaW9uWF0gfD0gcGF0dGVyblJvd1tqXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVnaW9uQml0bWFwO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZFNlZ21lbnRIZWFkZXIoZGF0YSwgc3RhcnQpIHtcbiAgICB2YXIgc2VnbWVudEhlYWRlciA9IHt9O1xuICAgIHNlZ21lbnRIZWFkZXIubnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCk7XG4gICAgdmFyIGZsYWdzID0gZGF0YVtzdGFydCArIDRdO1xuICAgIHZhciBzZWdtZW50VHlwZSA9IGZsYWdzICYgMHgzZjtcbiAgICBpZiAoIVNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV0pIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBzZWdtZW50IHR5cGU6IFwiICsgc2VnbWVudFR5cGUpO1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLnR5cGUgPSBzZWdtZW50VHlwZTtcbiAgICBzZWdtZW50SGVhZGVyLnR5cGVOYW1lID0gU2VnbWVudFR5cGVzW3NlZ21lbnRUeXBlXTtcbiAgICBzZWdtZW50SGVhZGVyLmRlZmVycmVkTm9uUmV0YWluID0gISEoZmxhZ3MgJiAweDgwKTtcblxuICAgIHZhciBwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUgPSAhIShmbGFncyAmIDB4NDApO1xuICAgIHZhciByZWZlcnJlZEZsYWdzID0gZGF0YVtzdGFydCArIDVdO1xuICAgIHZhciByZWZlcnJlZFRvQ291bnQgPSAocmVmZXJyZWRGbGFncyA+PiA1KSAmIDc7XG4gICAgdmFyIHJldGFpbkJpdHMgPSBbcmVmZXJyZWRGbGFncyAmIDMxXTtcbiAgICB2YXIgcG9zaXRpb24gPSBzdGFydCArIDY7XG4gICAgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDcpIHtcbiAgICAgIHJlZmVycmVkVG9Db3VudCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gLSAxKSAmIDB4MWZmZmZmZmY7XG4gICAgICBwb3NpdGlvbiArPSAzO1xuICAgICAgdmFyIGJ5dGVzID0gKHJlZmVycmVkVG9Db3VudCArIDcpID4+IDM7XG4gICAgICByZXRhaW5CaXRzWzBdID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgIHdoaWxlICgtLWJ5dGVzID4gMCkge1xuICAgICAgICByZXRhaW5CaXRzLnB1c2goZGF0YVtwb3NpdGlvbisrXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWZlcnJlZEZsYWdzID09PSA1IHx8IHJlZmVycmVkRmxhZ3MgPT09IDYpIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCByZWZlcnJlZC10byBmbGFnc1wiKTtcbiAgICB9XG5cbiAgICBzZWdtZW50SGVhZGVyLnJldGFpbkJpdHMgPSByZXRhaW5CaXRzO1xuXG4gICAgbGV0IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDQ7XG4gICAgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDI1Nikge1xuICAgICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDY1NTM2KSB7XG4gICAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAyO1xuICAgIH1cbiAgICB2YXIgcmVmZXJyZWRUbyA9IFtdO1xuICAgIHZhciBpLCBpaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgcmVmZXJyZWRUb0NvdW50OyBpKyspIHtcbiAgICAgIGxldCBudW1iZXI7XG4gICAgICBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAxKSB7XG4gICAgICAgIG51bWJlciA9IGRhdGFbcG9zaXRpb25dO1xuICAgICAgfSBlbHNlIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDIpIHtcbiAgICAgICAgbnVtYmVyID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1iZXIgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJlZmVycmVkVG8ucHVzaChudW1iZXIpO1xuICAgICAgcG9zaXRpb24gKz0gcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplO1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLnJlZmVycmVkVG8gPSByZWZlcnJlZFRvO1xuICAgIGlmICghcGFnZUFzc29jaWF0aW9uRmllbGRTaXplKSB7XG4gICAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlZ21lbnRIZWFkZXIucGFnZUFzc29jaWF0aW9uID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICBwb3NpdGlvbiArPSA0O1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgIHBvc2l0aW9uICs9IDQ7XG5cbiAgICBpZiAoc2VnbWVudEhlYWRlci5sZW5ndGggPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgIC8vIDcuMi43IFNlZ21lbnQgZGF0YSBsZW5ndGgsIHVua25vd24gc2VnbWVudCBsZW5ndGhcbiAgICAgIGlmIChzZWdtZW50VHlwZSA9PT0gMzgpIHtcbiAgICAgICAgLy8gSW1tZWRpYXRlR2VuZXJpY1JlZ2lvblxuICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvbkluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPVxuICAgICAgICAgIGRhdGFbcG9zaXRpb24gKyBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aF07XG4gICAgICAgIHZhciBnZW5lcmljUmVnaW9uTW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICAvLyBzZWFyY2hpbmcgZm9yIHRoZSBzZWdtZW50IGVuZFxuICAgICAgICB2YXIgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7XG4gICAgICAgIHZhciBzZWFyY2hQYXR0ZXJuID0gbmV3IFVpbnQ4QXJyYXkoc2VhcmNoUGF0dGVybkxlbmd0aCk7XG4gICAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbk1tcikge1xuICAgICAgICAgIHNlYXJjaFBhdHRlcm5bMF0gPSAweGZmO1xuICAgICAgICAgIHNlYXJjaFBhdHRlcm5bMV0gPSAweGFjO1xuICAgICAgICB9XG4gICAgICAgIHNlYXJjaFBhdHRlcm5bMl0gPSAoZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzZWFyY2hQYXR0ZXJuWzNdID0gKGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiAxNikgJiAweGZmO1xuICAgICAgICBzZWFyY2hQYXR0ZXJuWzRdID0gKGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHNlYXJjaFBhdHRlcm5bNV0gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgJiAweGZmO1xuICAgICAgICBmb3IgKGkgPSBwb3NpdGlvbiwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICB2YXIgaiA9IDA7XG4gICAgICAgICAgd2hpbGUgKGogPCBzZWFyY2hQYXR0ZXJuTGVuZ3RoICYmIHNlYXJjaFBhdHRlcm5bal0gPT09IGRhdGFbaSArIGpdKSB7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqID09PSBzZWFyY2hQYXR0ZXJuTGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9IGkgKyBzZWFyY2hQYXR0ZXJuTGVuZ3RoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikge1xuICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwic2VnbWVudCBlbmQgd2FzIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGhcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHNlZ21lbnRIZWFkZXIuaGVhZGVyRW5kID0gcG9zaXRpb247XG4gICAgcmV0dXJuIHNlZ21lbnRIZWFkZXI7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkU2VnbWVudHMoaGVhZGVyLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHNlZ21lbnRzID0gW107XG4gICAgdmFyIHBvc2l0aW9uID0gc3RhcnQ7XG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7XG4gICAgICB2YXIgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7XG4gICAgICB2YXIgc2VnbWVudCA9IHtcbiAgICAgICAgaGVhZGVyOiBzZWdtZW50SGVhZGVyLFxuICAgICAgICBkYXRhLFxuICAgICAgfTtcbiAgICAgIGlmICghaGVhZGVyLnJhbmRvbUFjY2Vzcykge1xuICAgICAgICBzZWdtZW50LnN0YXJ0ID0gcG9zaXRpb247XG4gICAgICAgIHBvc2l0aW9uICs9IHNlZ21lbnRIZWFkZXIubGVuZ3RoO1xuICAgICAgICBzZWdtZW50LmVuZCA9IHBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgIGlmIChzZWdtZW50SGVhZGVyLnR5cGUgPT09IDUxKSB7XG4gICAgICAgIGJyZWFrOyAvLyBlbmQgb2YgZmlsZSBpcyBmb3VuZFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGVhZGVyLnJhbmRvbUFjY2Vzcykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBzZWdtZW50c1tpXS5zdGFydCA9IHBvc2l0aW9uO1xuICAgICAgICBwb3NpdGlvbiArPSBzZWdtZW50c1tpXS5oZWFkZXIubGVuZ3RoO1xuICAgICAgICBzZWdtZW50c1tpXS5lbmQgPSBwb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgLy8gNy40LjEgUmVnaW9uIHNlZ21lbnQgaW5mb3JtYXRpb24gZmllbGRcbiAgZnVuY3Rpb24gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBzdGFydCkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCksXG4gICAgICBoZWlnaHQ6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA0KSxcbiAgICAgIHg6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA4KSxcbiAgICAgIHk6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxMiksXG4gICAgICBjb21iaW5hdGlvbk9wZXJhdG9yOiBkYXRhW3N0YXJ0ICsgMTZdICYgNyxcbiAgICB9O1xuICB9XG4gIHZhciBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3O1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHNlZ21lbnQsIHZpc2l0b3IpIHtcbiAgICB2YXIgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7XG5cbiAgICB2YXIgZGF0YSA9IHNlZ21lbnQuZGF0YSxcbiAgICAgIHBvc2l0aW9uID0gc2VnbWVudC5zdGFydCxcbiAgICAgIGVuZCA9IHNlZ21lbnQuZW5kO1xuICAgIHZhciBhcmdzLCBhdCwgaSwgYXRMZW5ndGg7XG4gICAgc3dpdGNoIChoZWFkZXIudHlwZSkge1xuICAgICAgY2FzZSAwOiAvLyBTeW1ib2xEaWN0aW9uYXJ5XG4gICAgICAgIC8vIDcuNC4yIFN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgc3ludGF4XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5ID0ge307XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5RmxhZ3MgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTsgLy8gNy40LjIuMS4xXG4gICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpO1xuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTtcbiAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yID0gKGRpY3Rpb25hcnlGbGFncyA+PiA0KSAmIDM7XG4gICAgICAgIGRpY3Rpb25hcnkuYml0bWFwU2l6ZVNlbGVjdG9yID0gKGRpY3Rpb25hcnlGbGFncyA+PiA2KSAmIDE7XG4gICAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gNykgJiAxO1xuICAgICAgICBkaWN0aW9uYXJ5LmJpdG1hcENvZGluZ0NvbnRleHRVc2VkID0gISEoZGljdGlvbmFyeUZsYWdzICYgMjU2KTtcbiAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0UmV0YWluZWQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiA1MTIpO1xuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlID0gKGRpY3Rpb25hcnlGbGFncyA+PiAxMCkgJiAzO1xuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gMTIpICYgMTtcbiAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgaWYgKCFkaWN0aW9uYXJ5Lmh1ZmZtYW4pIHtcbiAgICAgICAgICBhdExlbmd0aCA9IGRpY3Rpb25hcnkudGVtcGxhdGUgPT09IDAgPyA0IDogMTtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkaWN0aW9uYXJ5LmF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpY3Rpb25hcnkucmVmaW5lbWVudCAmJiAhZGljdGlvbmFyeS5yZWZpbmVtZW50VGVtcGxhdGUpIHtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksXG4gICAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudEF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgZGljdGlvbmFyeS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mTmV3U3ltYm9scyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBhcmdzID0gW1xuICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgaGVhZGVyLm51bWJlcixcbiAgICAgICAgICBoZWFkZXIucmVmZXJyZWRUbyxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIGVuZCxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6IC8vIEltbWVkaWF0ZVRleHRSZWdpb25cbiAgICAgIGNhc2UgNzogLy8gSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uXG4gICAgICAgIHZhciB0ZXh0UmVnaW9uID0ge307XG4gICAgICAgIHRleHRSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDtcbiAgICAgICAgdmFyIHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMik7XG4gICAgICAgIHRleHRSZWdpb24ubG9nU3RyaXBTaXplID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICB0ZXh0UmVnaW9uLnN0cmlwU2l6ZSA9IDEgPDwgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemU7XG4gICAgICAgIHRleHRSZWdpb24ucmVmZXJlbmNlQ29ybmVyID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gNCkgJiAzO1xuICAgICAgICB0ZXh0UmVnaW9uLnRyYW5zcG9zZWQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgNjQpO1xuICAgICAgICB0ZXh0UmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA3KSAmIDM7XG4gICAgICAgIHRleHRSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA5KSAmIDE7XG4gICAgICAgIHRleHRSZWdpb24uZHNPZmZzZXQgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA8PCAxNykgPj4gMjc7XG4gICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMTUpICYgMTtcbiAgICAgICAgaWYgKHRleHRSZWdpb24uaHVmZm1hbikge1xuICAgICAgICAgIHZhciB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5GUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRTID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRUID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNCkgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREVyA9ICh0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDYpICYgMztcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50REggPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA4KSAmIDM7XG4gICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERYID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTApICYgMztcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFkgPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMikgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRTaXplU2VsZWN0b3IgPSAhIShcbiAgICAgICAgICAgIHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAweDQwMDBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0UmVnaW9uLnJlZmluZW1lbnQgJiYgIXRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlKSB7XG4gICAgICAgICAgYXQgPSBbXTtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRBdCA9IGF0O1xuICAgICAgICB9XG4gICAgICAgIHRleHRSZWdpb24ubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgYXJncyA9IFt0ZXh0UmVnaW9uLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNjogLy8gUGF0dGVybkRpY3Rpb25hcnlcbiAgICAgICAgLy8gNy40LjQuIFBhdHRlcm4gZGljdGlvbmFyeSBzZWdtZW50IHN5bnRheFxuICAgICAgICBjb25zdCBwYXR0ZXJuRGljdGlvbmFyeSA9IHt9O1xuICAgICAgICBjb25zdCBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubW1yID0gISEocGF0dGVybkRpY3Rpb25hcnlGbGFncyAmIDEpO1xuICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS50ZW1wbGF0ZSA9IChwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID4+IDEpICYgMztcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybldpZHRoID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybkhlaWdodCA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBhcmdzID0gW3BhdHRlcm5EaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDIyOiAvLyBJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvblxuICAgICAgY2FzZSAyMzogLy8gSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvblxuICAgICAgICAvLyA3LjQuNSBIYWxmdG9uZSByZWdpb24gc2VnbWVudCBzeW50YXhcbiAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb24gPSB7fTtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDtcbiAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb25GbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLm1tciA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiAxKTtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24udGVtcGxhdGUgPSAoaGFsZnRvbmVSZWdpb25GbGFncyA+PiAxKSAmIDM7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmVuYWJsZVNraXAgPSAhIShoYWxmdG9uZVJlZ2lvbkZsYWdzICYgOCk7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSAoaGFsZnRvbmVSZWdpb25GbGFncyA+PiA0KSAmIDc7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gKGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gNykgJiAxO1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkV2lkdGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZEhlaWdodCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFkgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7XG4gICAgICAgIHBvc2l0aW9uICs9IDQ7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JYID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JZID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgIGFyZ3MgPSBbaGFsZnRvbmVSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OiAvLyBJbW1lZGlhdGVHZW5lcmljUmVnaW9uXG4gICAgICBjYXNlIDM5OiAvLyBJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb25cbiAgICAgICAgdmFyIGdlbmVyaWNSZWdpb24gPSB7fTtcbiAgICAgICAgZ2VuZXJpY1JlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoO1xuICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIGdlbmVyaWNSZWdpb24ubW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICBnZW5lcmljUmVnaW9uLnRlbXBsYXRlID0gKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPj4gMSkgJiAzO1xuICAgICAgICBnZW5lcmljUmVnaW9uLnByZWRpY3Rpb24gPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgOCk7XG4gICAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbi5tbXIpIHtcbiAgICAgICAgICBhdExlbmd0aCA9IGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPT09IDAgPyA0IDogMTtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZW5lcmljUmVnaW9uLmF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgYXJncyA9IFtnZW5lcmljUmVnaW9uLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ4OiAvLyBQYWdlSW5mb3JtYXRpb25cbiAgICAgICAgdmFyIHBhZ2VJbmZvID0ge1xuICAgICAgICAgIHdpZHRoOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSxcbiAgICAgICAgICBoZWlnaHQ6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KSxcbiAgICAgICAgICByZXNvbHV0aW9uWDogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDgpLFxuICAgICAgICAgIHJlc29sdXRpb25ZOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMTIpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAocGFnZUluZm8uaGVpZ2h0ID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgZGVsZXRlIHBhZ2VJbmZvLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFnZVNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyAxNl07XG4gICAgICAgIHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAxNyk7IC8vIHBhZ2VTdHJpcGluZ0luZm9ybWF0aW9uXG4gICAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpO1xuICAgICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IChwYWdlU2VnbWVudEZsYWdzID4+IDIpICYgMTtcbiAgICAgICAgcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvciA9IChwYWdlU2VnbWVudEZsYWdzID4+IDMpICYgMztcbiAgICAgICAgcGFnZUluZm8ucmVxdWlyZXNCdWZmZXIgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMzIpO1xuICAgICAgICBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGUgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgNjQpO1xuICAgICAgICBhcmdzID0gW3BhZ2VJbmZvXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ5OiAvLyBFbmRPZlBhZ2VcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDUwOiAvLyBFbmRPZlN0cmlwZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTE6IC8vIEVuZE9mRmlsZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTM6IC8vIFRhYmxlc1xuICAgICAgICBhcmdzID0gW2hlYWRlci5udW1iZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmRdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vIDcuNC4xNSBkZWZpbmVzIDIgZXh0ZW5zaW9uIHR5cGVzIHdoaWNoXG4gICAgICAgIC8vIGFyZSBjb21tZW50cyBhbmQgY2FuIGJlIGlnbm9yZWQuXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgYHNlZ21lbnQgdHlwZSAke2hlYWRlci50eXBlTmFtZX0oJHtoZWFkZXIudHlwZX0pYCArXG4gICAgICAgICAgICBcIiBpcyBub3QgaW1wbGVtZW50ZWRcIlxuICAgICAgICApO1xuICAgIH1cbiAgICB2YXIgY2FsbGJhY2tOYW1lID0gXCJvblwiICsgaGVhZGVyLnR5cGVOYW1lO1xuICAgIGlmIChjYWxsYmFja05hbWUgaW4gdmlzaXRvcikge1xuICAgICAgdmlzaXRvcltjYWxsYmFja05hbWVdLmFwcGx5KHZpc2l0b3IsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcikge1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHByb2Nlc3NTZWdtZW50KHNlZ21lbnRzW2ldLCB2aXNpdG9yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcykge1xuICAgIHZhciB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHZhciBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyh7fSwgY2h1bmsuZGF0YSwgY2h1bmsuc3RhcnQsIGNodW5rLmVuZCk7XG4gICAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaXRvci5idWZmZXI7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUpiaWcyKGRhdGEpIHtcbiAgICBjb25zdCBlbmQgPSBkYXRhLmxlbmd0aDtcbiAgICBsZXQgcG9zaXRpb24gPSAwO1xuXG4gICAgaWYgKFxuICAgICAgZGF0YVtwb3NpdGlvbl0gIT09IDB4OTcgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyAxXSAhPT0gMHg0YSB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDJdICE9PSAweDQyIHx8XG4gICAgICBkYXRhW3Bvc2l0aW9uICsgM10gIT09IDB4MzIgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyA0XSAhPT0gMHgwZCB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDVdICE9PSAweDBhIHx8XG4gICAgICBkYXRhW3Bvc2l0aW9uICsgNl0gIT09IDB4MWEgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyA3XSAhPT0gMHgwYVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJwYXJzZUpiaWcyIC0gaW52YWxpZCBoZWFkZXIuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcG9zaXRpb24gKz0gODtcbiAgICBjb25zdCBmbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgaGVhZGVyLnJhbmRvbUFjY2VzcyA9ICEoZmxhZ3MgJiAxKTtcbiAgICBpZiAoIShmbGFncyAmIDIpKSB7XG4gICAgICBoZWFkZXIubnVtYmVyT2ZQYWdlcyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmQpO1xuICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgU2ltcGxlU2VnbWVudFZpc2l0b3IoKTtcbiAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpO1xuXG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB2aXNpdG9yLmN1cnJlbnRQYWdlSW5mbztcbiAgICBjb25zdCBiaXRQYWNrZWQgPSB2aXNpdG9yLmJ1ZmZlcjtcbiAgICBjb25zdCBpbWdEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTtcbiAgICBsZXQgcSA9IDAsXG4gICAgICBrID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICBsZXQgbWFzayA9IDAsXG4gICAgICAgIGJ1ZmZlcjtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgIGJ1ZmZlciA9IGJpdFBhY2tlZFtrKytdO1xuICAgICAgICB9XG4gICAgICAgIGltZ0RhdGFbcSsrXSA9IGJ1ZmZlciAmIG1hc2sgPyAwIDogMjU1O1xuICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGltZ0RhdGEsIHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yKCkge31cblxuICBTaW1wbGVTZWdtZW50VmlzaXRvci5wcm90b3R5cGUgPSB7XG4gICAgb25QYWdlSW5mb3JtYXRpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uUGFnZUluZm9ybWF0aW9uKGluZm8pIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbztcbiAgICAgIHZhciByb3dTaXplID0gKGluZm8ud2lkdGggKyA3KSA+PiAzO1xuICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OENsYW1wZWRBcnJheShyb3dTaXplICogaW5mby5oZWlnaHQpO1xuICAgICAgLy8gVGhlIGNvbnRlbnRzIG9mIEFycmF5QnVmZmVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gMC5cbiAgICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIDB4RkYgb25seSBpZiBpbmZvLmRlZmF1bHRQaXhlbFZhbHVlIGlzIHNldFxuICAgICAgaWYgKGluZm8uZGVmYXVsdFBpeGVsVmFsdWUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICBidWZmZXJbaV0gPSAweGZmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICB9LFxuICAgIGRyYXdCaXRtYXA6IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX2RyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKSB7XG4gICAgICB2YXIgcGFnZUluZm8gPSB0aGlzLmN1cnJlbnRQYWdlSW5mbztcbiAgICAgIHZhciB3aWR0aCA9IHJlZ2lvbkluZm8ud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IHJlZ2lvbkluZm8uaGVpZ2h0O1xuICAgICAgdmFyIHJvd1NpemUgPSAocGFnZUluZm8ud2lkdGggKyA3KSA+PiAzO1xuICAgICAgdmFyIGNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGVcbiAgICAgICAgPyByZWdpb25JbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JcbiAgICAgICAgOiBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yO1xuICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgdmFyIG1hc2swID0gMTI4ID4+IChyZWdpb25JbmZvLnggJiA3KTtcbiAgICAgIHZhciBvZmZzZXQwID0gcmVnaW9uSW5mby55ICogcm93U2l6ZSArIChyZWdpb25JbmZvLnggPj4gMyk7XG4gICAgICB2YXIgaSwgaiwgbWFzaywgb2Zmc2V0O1xuICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgMDogLy8gT1JcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIG1hc2sgPSBtYXNrMDtcbiAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gfD0gbWFzaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgICAgICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6IC8vIFhPUlxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgICAgICAgICAgbWFzayA9IG1hc2swO1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSBePSBtYXNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgICAgICAgIGlmICghbWFzaykge1xuICAgICAgICAgICAgICAgIG1hc2sgPSAxMjg7XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgICBgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUdlbmVyaWNSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihcbiAgICAgIHJlZ2lvbixcbiAgICAgIGRhdGEsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgICkge1xuICAgICAgdmFyIHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbztcbiAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgICAgdmFyIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgcmVnaW9uLm1tcixcbiAgICAgICAgcmVnaW9uSW5mby53aWR0aCxcbiAgICAgICAgcmVnaW9uSW5mby5oZWlnaHQsXG4gICAgICAgIHJlZ2lvbi50ZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uLnByZWRpY3Rpb24sXG4gICAgICAgIG51bGwsXG4gICAgICAgIHJlZ2lvbi5hdCxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0XG4gICAgICApO1xuICAgICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24oKSB7XG4gICAgICB0aGlzLm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgb25TeW1ib2xEaWN0aW9uYXJ5OiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vblN5bWJvbERpY3Rpb25hcnkoXG4gICAgICBkaWN0aW9uYXJ5LFxuICAgICAgY3VycmVudFNlZ21lbnQsXG4gICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgKSB7XG4gICAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0O1xuICAgICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikge1xuICAgICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoXG4gICAgICAgICAgZGljdGlvbmFyeSxcbiAgICAgICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgICAgIHRoaXMuY3VzdG9tVGFibGVzXG4gICAgICAgICk7XG4gICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbWJpbmVzIGV4cG9ydGVkIHN5bWJvbHMgZnJvbSBhbGwgcmVmZXJyZWQgc2VnbWVudHNcbiAgICAgIHZhciBzeW1ib2xzID0gdGhpcy5zeW1ib2xzO1xuICAgICAgaWYgKCFzeW1ib2xzKSB7XG4gICAgICAgIHRoaXMuc3ltYm9scyA9IHN5bWJvbHMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdmFyIGlucHV0U3ltYm9scyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVmZXJyZWRTZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50c1tpXV07XG4gICAgICAgIC8vIHJlZmVycmVkU3ltYm9scyBpcyB1bmRlZmluZWQgd2hlbiB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgVGFibGVzXG4gICAgICAgIC8vIHNlZ21lbnQgaW5zdGVhZCBvZiBhIFN5bWJvbERpY3Rpb25hcnkuXG4gICAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHtcbiAgICAgICAgICBpbnB1dFN5bWJvbHMgPSBpbnB1dFN5bWJvbHMuY29uY2F0KHJlZmVycmVkU3ltYm9scyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoXG4gICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbixcbiAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50LFxuICAgICAgICBpbnB1dFN5bWJvbHMsXG4gICAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZOZXdTeW1ib2xzLFxuICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLFxuICAgICAgICBodWZmbWFuVGFibGVzLFxuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlLFxuICAgICAgICBkaWN0aW9uYXJ5LmF0LFxuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSxcbiAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50QXQsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dCxcbiAgICAgICAgaHVmZm1hbklucHV0XG4gICAgICApO1xuICAgIH0sXG4gICAgb25JbW1lZGlhdGVUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZVRleHRSZWdpb24oXG4gICAgICByZWdpb24sXG4gICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgKSB7XG4gICAgICB2YXIgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvO1xuICAgICAgbGV0IGh1ZmZtYW5UYWJsZXMsIGh1ZmZtYW5JbnB1dDtcblxuICAgICAgLy8gQ29tYmluZXMgZXhwb3J0ZWQgc3ltYm9scyBmcm9tIGFsbCByZWZlcnJlZCBzZWdtZW50c1xuICAgICAgdmFyIHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7XG4gICAgICB2YXIgaW5wdXRTeW1ib2xzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRzW2ldXTtcbiAgICAgICAgLy8gcmVmZXJyZWRTeW1ib2xzIGlzIHVuZGVmaW5lZCB3aGVuIHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYSBUYWJsZXNcbiAgICAgICAgLy8gc2VnbWVudCBpbnN0ZWFkIG9mIGEgU3ltYm9sRGljdGlvbmFyeS5cbiAgICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykge1xuICAgICAgICAgIGlucHV0U3ltYm9scyA9IGlucHV0U3ltYm9scy5jb25jYXQocmVmZXJyZWRTeW1ib2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSBsb2cyKGlucHV0U3ltYm9scy5sZW5ndGgpO1xuICAgICAgaWYgKHJlZ2lvbi5odWZmbWFuKSB7XG4gICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgcmVmZXJyZWRTZWdtZW50cyxcbiAgICAgICAgICB0aGlzLmN1c3RvbVRhYmxlcyxcbiAgICAgICAgICBpbnB1dFN5bWJvbHMubGVuZ3RoLFxuICAgICAgICAgIGh1ZmZtYW5JbnB1dFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKFxuICAgICAgICByZWdpb24uaHVmZm1hbixcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnQsXG4gICAgICAgIHJlZ2lvbkluZm8ud2lkdGgsXG4gICAgICAgIHJlZ2lvbkluZm8uaGVpZ2h0LFxuICAgICAgICByZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUsXG4gICAgICAgIHJlZ2lvbi5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyxcbiAgICAgICAgcmVnaW9uLnN0cmlwU2l6ZSxcbiAgICAgICAgaW5wdXRTeW1ib2xzLFxuICAgICAgICBzeW1ib2xDb2RlTGVuZ3RoLFxuICAgICAgICByZWdpb24udHJhbnNwb3NlZCxcbiAgICAgICAgcmVnaW9uLmRzT2Zmc2V0LFxuICAgICAgICByZWdpb24ucmVmZXJlbmNlQ29ybmVyLFxuICAgICAgICByZWdpb24uY29tYmluYXRpb25PcGVyYXRvcixcbiAgICAgICAgaHVmZm1hblRhYmxlcyxcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnRBdCxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LFxuICAgICAgICByZWdpb24ubG9nU3RyaXBTaXplLFxuICAgICAgICBodWZmbWFuSW5wdXRcbiAgICAgICk7XG4gICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTtcbiAgICB9LFxuICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpIHtcbiAgICAgIHRoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBvblBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgICBsZXQgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zO1xuICAgICAgaWYgKCFwYXR0ZXJucykge1xuICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShcbiAgICAgICAgZGljdGlvbmFyeS5tbXIsXG4gICAgICAgIGRpY3Rpb25hcnkucGF0dGVybldpZHRoLFxuICAgICAgICBkaWN0aW9uYXJ5LnBhdHRlcm5IZWlnaHQsXG4gICAgICAgIGRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4LFxuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlLFxuICAgICAgICBkZWNvZGluZ0NvbnRleHRcbiAgICAgICk7XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uKHJlZ2lvbiwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgICAgLy8gSGFsZnRvbmVSZWdpb24gcmVmZXJzIHRvIGV4YWN0bHkgb25lIFBhdHRlcm5EaWN0aW9uYXJ5LlxuICAgICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zW3JlZmVycmVkU2VnbWVudHNbMF1dO1xuICAgICAgY29uc3QgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvO1xuICAgICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZUhhbGZ0b25lUmVnaW9uKFxuICAgICAgICByZWdpb24ubW1yLFxuICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgcmVnaW9uLnRlbXBsYXRlLFxuICAgICAgICByZWdpb25JbmZvLndpZHRoLFxuICAgICAgICByZWdpb25JbmZvLmhlaWdodCxcbiAgICAgICAgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLFxuICAgICAgICByZWdpb24uZW5hYmxlU2tpcCxcbiAgICAgICAgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsXG4gICAgICAgIHJlZ2lvbi5ncmlkV2lkdGgsXG4gICAgICAgIHJlZ2lvbi5ncmlkSGVpZ2h0LFxuICAgICAgICByZWdpb24uZ3JpZE9mZnNldFgsXG4gICAgICAgIHJlZ2lvbi5ncmlkT2Zmc2V0WSxcbiAgICAgICAgcmVnaW9uLmdyaWRWZWN0b3JYLFxuICAgICAgICByZWdpb24uZ3JpZFZlY3RvclksXG4gICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApO1xuICAgIH0sXG4gICAgb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uKCkge1xuICAgICAgdGhpcy5vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgICAgbGV0IGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzO1xuICAgICAgaWYgKCFjdXN0b21UYWJsZXMpIHtcbiAgICAgICAgdGhpcy5jdXN0b21UYWJsZXMgPSBjdXN0b21UYWJsZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGN1c3RvbVRhYmxlc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gSHVmZm1hbkxpbmUobGluZURhdGEpIHtcbiAgICBpZiAobGluZURhdGEubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBPT0IgbGluZS5cbiAgICAgIHRoaXMuaXNPT0IgPSB0cnVlO1xuICAgICAgdGhpcy5yYW5nZUxvdyA9IDA7XG4gICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzBdO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IDA7XG4gICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVsxXTtcbiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vcm1hbCwgdXBwZXIgcmFuZ2Ugb3IgbG93ZXIgcmFuZ2UgbGluZS5cbiAgICAgIC8vIFVwcGVyIHJhbmdlIGxpbmVzIGFyZSBwcm9jZXNzZWQgbGlrZSBub3JtYWwgbGluZXMuXG4gICAgICB0aGlzLmlzT09CID0gZmFsc2U7XG4gICAgICB0aGlzLnJhbmdlTG93ID0gbGluZURhdGFbMF07XG4gICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzFdO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmVEYXRhWzJdO1xuICAgICAgdGhpcy5wcmVmaXhDb2RlID0gbGluZURhdGFbM107XG4gICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmVEYXRhWzRdID09PSBcImxvd2VyXCI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gSHVmZm1hblRyZWVOb2RlKGxpbmUpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIC8vIExlYWYgbm9kZVxuICAgICAgdGhpcy5pc0xlYWYgPSB0cnVlO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmUucmFuZ2VMZW5ndGg7XG4gICAgICB0aGlzLnJhbmdlTG93ID0gbGluZS5yYW5nZUxvdztcbiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gbGluZS5pc0xvd2VyUmFuZ2U7XG4gICAgICB0aGlzLmlzT09CID0gbGluZS5pc09PQjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJtZWRpYXRlIG9yIHJvb3Qgbm9kZVxuICAgICAgdGhpcy5pc0xlYWYgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBIdWZmbWFuVHJlZU5vZGUucHJvdG90eXBlID0ge1xuICAgIGJ1aWxkVHJlZShsaW5lLCBzaGlmdCkge1xuICAgICAgY29uc3QgYml0ID0gKGxpbmUucHJlZml4Q29kZSA+PiBzaGlmdCkgJiAxO1xuICAgICAgaWYgKHNoaWZ0IDw9IDApIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbGVhZiBub2RlLlxuICAgICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBuZXcgSHVmZm1hblRyZWVOb2RlKGxpbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGludGVybWVkaWF0ZSBub2RlIGFuZCBjb250aW51ZSByZWN1cnNpdmVseS5cbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW2JpdF07XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuYnVpbGRUcmVlKGxpbmUsIHNoaWZ0IC0gMSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWNvZGVOb2RlKHJlYWRlcikge1xuICAgICAgaWYgKHRoaXMuaXNMZWFmKSB7XG4gICAgICAgIGlmICh0aGlzLmlzT09CKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHRPZmZzZXQgPSByZWFkZXIucmVhZEJpdHModGhpcy5yYW5nZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlTG93ICsgKHRoaXMuaXNMb3dlclJhbmdlID8gLWh0T2Zmc2V0IDogaHRPZmZzZXQpO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY2hpbGRyZW5bcmVhZGVyLnJlYWRCaXQoKV07XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIEh1ZmZtYW4gZGF0YVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLmRlY29kZU5vZGUocmVhZGVyKTtcbiAgICB9LFxuICB9O1xuXG4gIGZ1bmN0aW9uIEh1ZmZtYW5UYWJsZShsaW5lcywgcHJlZml4Q29kZXNEb25lKSB7XG4gICAgaWYgKCFwcmVmaXhDb2Rlc0RvbmUpIHtcbiAgICAgIHRoaXMuYXNzaWduUHJlZml4Q29kZXMobGluZXMpO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgSHVmZm1hbiB0cmVlLlxuICAgIHRoaXMucm9vdE5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yb290Tm9kZS5idWlsZFRyZWUobGluZSwgbGluZS5wcmVmaXhMZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBIdWZmbWFuVGFibGUucHJvdG90eXBlID0ge1xuICAgIGRlY29kZShyZWFkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTtcbiAgICB9LFxuICAgIGFzc2lnblByZWZpeENvZGVzKGxpbmVzKSB7XG4gICAgICAvLyBBbm5leCBCLjMgQXNzaWduaW5nIHRoZSBwcmVmaXggY29kZXMuXG4gICAgICBjb25zdCBsaW5lc0xlbmd0aCA9IGxpbmVzLmxlbmd0aDtcbiAgICAgIGxldCBwcmVmaXhMZW5ndGhNYXggPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByZWZpeExlbmd0aE1heCA9IE1hdGgubWF4KHByZWZpeExlbmd0aE1heCwgbGluZXNbaV0ucHJlZml4TGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGlzdG9ncmFtID0gbmV3IFVpbnQzMkFycmF5KHByZWZpeExlbmd0aE1heCArIDEpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhpc3RvZ3JhbVtsaW5lc1tpXS5wcmVmaXhMZW5ndGhdKys7XG4gICAgICB9XG4gICAgICBsZXQgY3VycmVudExlbmd0aCA9IDEsXG4gICAgICAgIGZpcnN0Q29kZSA9IDAsXG4gICAgICAgIGN1cnJlbnRDb2RlLFxuICAgICAgICBjdXJyZW50VGVtcCxcbiAgICAgICAgbGluZTtcbiAgICAgIGhpc3RvZ3JhbVswXSA9IDA7XG5cbiAgICAgIHdoaWxlIChjdXJyZW50TGVuZ3RoIDw9IHByZWZpeExlbmd0aE1heCkge1xuICAgICAgICBmaXJzdENvZGUgPSAoZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSkgPDwgMTtcbiAgICAgICAgY3VycmVudENvZGUgPSBmaXJzdENvZGU7XG4gICAgICAgIGN1cnJlbnRUZW1wID0gMDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRUZW1wIDwgbGluZXNMZW5ndGgpIHtcbiAgICAgICAgICBsaW5lID0gbGluZXNbY3VycmVudFRlbXBdO1xuICAgICAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA9PT0gY3VycmVudExlbmd0aCkge1xuICAgICAgICAgICAgbGluZS5wcmVmaXhDb2RlID0gY3VycmVudENvZGU7XG4gICAgICAgICAgICBjdXJyZW50Q29kZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50VGVtcCsrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRMZW5ndGgrKztcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGZ1bmN0aW9uIGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIC8vIERlY29kZXMgYSBUYWJsZXMgc2VnbWVudCwgaS5lLiwgYSBjdXN0b20gSHVmZm1hbiB0YWJsZS5cbiAgICAvLyBBbm5leCBCLjIgQ29kZSB0YWJsZSBzdHJ1Y3R1cmUuXG4gICAgY29uc3QgZmxhZ3MgPSBkYXRhW3N0YXJ0XTtcbiAgICBjb25zdCBsb3dlc3RWYWx1ZSA9IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxKSAmIDB4ZmZmZmZmZmY7XG4gICAgY29uc3QgaGlnaGVzdFZhbHVlID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDUpICYgMHhmZmZmZmZmZjtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0ICsgOSwgZW5kKTtcblxuICAgIGNvbnN0IHByZWZpeFNpemVCaXRzID0gKChmbGFncyA+PiAxKSAmIDcpICsgMTtcbiAgICBjb25zdCByYW5nZVNpemVCaXRzID0gKChmbGFncyA+PiA0KSAmIDcpICsgMTtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGxldCBwcmVmaXhMZW5ndGgsXG4gICAgICByYW5nZUxlbmd0aCxcbiAgICAgIGN1cnJlbnRSYW5nZUxvdyA9IGxvd2VzdFZhbHVlO1xuXG4gICAgLy8gTm9ybWFsIHRhYmxlIGxpbmVzXG4gICAgZG8ge1xuICAgICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTtcbiAgICAgIHJhbmdlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHJhbmdlU2l6ZUJpdHMpO1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgbmV3IEh1ZmZtYW5MaW5lKFtjdXJyZW50UmFuZ2VMb3csIHByZWZpeExlbmd0aCwgcmFuZ2VMZW5ndGgsIDBdKVxuICAgICAgKTtcbiAgICAgIGN1cnJlbnRSYW5nZUxvdyArPSAxIDw8IHJhbmdlTGVuZ3RoO1xuICAgIH0gd2hpbGUgKGN1cnJlbnRSYW5nZUxvdyA8IGhpZ2hlc3RWYWx1ZSk7XG5cbiAgICAvLyBMb3dlciByYW5nZSB0YWJsZSBsaW5lXG4gICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgbmV3IEh1ZmZtYW5MaW5lKFtsb3dlc3RWYWx1ZSAtIDEsIHByZWZpeExlbmd0aCwgMzIsIDAsIFwibG93ZXJcIl0pXG4gICAgKTtcblxuICAgIC8vIFVwcGVyIHJhbmdlIHRhYmxlIGxpbmVcbiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpO1xuICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtoaWdoZXN0VmFsdWUsIHByZWZpeExlbmd0aCwgMzIsIDBdKSk7XG5cbiAgICBpZiAoZmxhZ3MgJiAxKSB7XG4gICAgICAvLyBPdXQtb2YtYmFuZCB0YWJsZSBsaW5lXG4gICAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpO1xuICAgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgZmFsc2UpO1xuICB9XG5cbiAgY29uc3Qgc3RhbmRhcmRUYWJsZXNDYWNoZSA9IHt9O1xuXG4gIGZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7XG4gICAgLy8gQW5uZXggQi41IFN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzLlxuICAgIGxldCB0YWJsZSA9IHN0YW5kYXJkVGFibGVzQ2FjaGVbbnVtYmVyXTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gICAgbGV0IGxpbmVzO1xuICAgIHN3aXRjaCAobnVtYmVyKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFswLCAxLCA0LCAweDBdLFxuICAgICAgICAgIFsxNiwgMiwgOCwgMHgyXSxcbiAgICAgICAgICBbMjcyLCAzLCAxNiwgMHg2XSxcbiAgICAgICAgICBbNjU4MDgsIDMsIDMyLCAweDddLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWzAsIDEsIDAsIDB4MF0sXG4gICAgICAgICAgWzEsIDIsIDAsIDB4Ml0sXG4gICAgICAgICAgWzIsIDMsIDAsIDB4Nl0sXG4gICAgICAgICAgWzMsIDQsIDMsIDB4ZV0sXG4gICAgICAgICAgWzExLCA1LCA2LCAweDFlXSxcbiAgICAgICAgICBbNzUsIDYsIDMyLCAweDNlXSwgLy8gdXBwZXJcbiAgICAgICAgICBbNiwgMHgzZl0sIC8vIE9PQlxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yNTYsIDgsIDgsIDB4ZmVdLFxuICAgICAgICAgIFswLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsxLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFsyLCAzLCAwLCAweDZdLFxuICAgICAgICAgIFszLCA0LCAzLCAweGVdLFxuICAgICAgICAgIFsxMSwgNSwgNiwgMHgxZV0sXG4gICAgICAgICAgWy0yNTcsIDgsIDMyLCAweGZmLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs3NSwgNywgMzIsIDB4N2VdLCAvLyB1cHBlclxuICAgICAgICAgIFs2LCAweDNlXSwgLy8gT09CXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbMSwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMiwgMiwgMCwgMHgyXSxcbiAgICAgICAgICBbMywgMywgMCwgMHg2XSxcbiAgICAgICAgICBbNCwgNCwgMywgMHhlXSxcbiAgICAgICAgICBbMTIsIDUsIDYsIDB4MWVdLFxuICAgICAgICAgIFs3NiwgNSwgMzIsIDB4MWZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yNTUsIDcsIDgsIDB4N2VdLFxuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFszLCAzLCAwLCAweDZdLFxuICAgICAgICAgIFs0LCA0LCAzLCAweGVdLFxuICAgICAgICAgIFsxMiwgNSwgNiwgMHgxZV0sXG4gICAgICAgICAgWy0yNTYsIDcsIDMyLCAweDdmLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs3NiwgNiwgMzIsIDB4M2VdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yMDQ4LCA1LCAxMCwgMHgxY10sXG4gICAgICAgICAgWy0xMDI0LCA0LCA5LCAweDhdLFxuICAgICAgICAgIFstNTEyLCA0LCA4LCAweDldLFxuICAgICAgICAgIFstMjU2LCA0LCA3LCAweGFdLFxuICAgICAgICAgIFstMTI4LCA1LCA2LCAweDFkXSxcbiAgICAgICAgICBbLTY0LCA1LCA1LCAweDFlXSxcbiAgICAgICAgICBbLTMyLCA0LCA1LCAweGJdLFxuICAgICAgICAgIFswLCAyLCA3LCAweDBdLFxuICAgICAgICAgIFsxMjgsIDMsIDcsIDB4Ml0sXG4gICAgICAgICAgWzI1NiwgMywgOCwgMHgzXSxcbiAgICAgICAgICBbNTEyLCA0LCA5LCAweGNdLFxuICAgICAgICAgIFsxMDI0LCA0LCAxMCwgMHhkXSxcbiAgICAgICAgICBbLTIwNDksIDYsIDMyLCAweDNlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFsyMDQ4LCA2LCAzMiwgMHgzZl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA3OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTEwMjQsIDQsIDksIDB4OF0sXG4gICAgICAgICAgWy01MTIsIDMsIDgsIDB4MF0sXG4gICAgICAgICAgWy0yNTYsIDQsIDcsIDB4OV0sXG4gICAgICAgICAgWy0xMjgsIDUsIDYsIDB4MWFdLFxuICAgICAgICAgIFstNjQsIDUsIDUsIDB4MWJdLFxuICAgICAgICAgIFstMzIsIDQsIDUsIDB4YV0sXG4gICAgICAgICAgWzAsIDQsIDUsIDB4Yl0sXG4gICAgICAgICAgWzMyLCA1LCA1LCAweDFjXSxcbiAgICAgICAgICBbNjQsIDUsIDYsIDB4MWRdLFxuICAgICAgICAgIFsxMjgsIDQsIDcsIDB4Y10sXG4gICAgICAgICAgWzI1NiwgMywgOCwgMHgxXSxcbiAgICAgICAgICBbNTEyLCAzLCA5LCAweDJdLFxuICAgICAgICAgIFsxMDI0LCAzLCAxMCwgMHgzXSxcbiAgICAgICAgICBbLTEwMjUsIDUsIDMyLCAweDFlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFsyMDQ4LCA1LCAzMiwgMHgxZl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTE1LCA4LCAzLCAweGZjXSxcbiAgICAgICAgICBbLTcsIDksIDEsIDB4MWZjXSxcbiAgICAgICAgICBbLTUsIDgsIDEsIDB4ZmRdLFxuICAgICAgICAgIFstMywgOSwgMCwgMHgxZmRdLFxuICAgICAgICAgIFstMiwgNywgMCwgMHg3Y10sXG4gICAgICAgICAgWy0xLCA0LCAwLCAweGFdLFxuICAgICAgICAgIFswLCAyLCAxLCAweDBdLFxuICAgICAgICAgIFsyLCA1LCAwLCAweDFhXSxcbiAgICAgICAgICBbMywgNiwgMCwgMHgzYV0sXG4gICAgICAgICAgWzQsIDMsIDQsIDB4NF0sXG4gICAgICAgICAgWzIwLCA2LCAxLCAweDNiXSxcbiAgICAgICAgICBbMjIsIDQsIDQsIDB4Yl0sXG4gICAgICAgICAgWzM4LCA0LCA1LCAweGNdLFxuICAgICAgICAgIFs3MCwgNSwgNiwgMHgxYl0sXG4gICAgICAgICAgWzEzNCwgNSwgNywgMHgxY10sXG4gICAgICAgICAgWzI2MiwgNiwgNywgMHgzY10sXG4gICAgICAgICAgWzM5MCwgNywgOCwgMHg3ZF0sXG4gICAgICAgICAgWzY0NiwgNiwgMTAsIDB4M2RdLFxuICAgICAgICAgIFstMTYsIDksIDMyLCAweDFmZSwgXCJsb3dlclwiXSxcbiAgICAgICAgICBbMTY3MCwgOSwgMzIsIDB4MWZmXSwgLy8gdXBwZXJcbiAgICAgICAgICBbMiwgMHgxXSwgLy8gT09CXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTMxLCA4LCA0LCAweGZjXSxcbiAgICAgICAgICBbLTE1LCA5LCAyLCAweDFmY10sXG4gICAgICAgICAgWy0xMSwgOCwgMiwgMHhmZF0sXG4gICAgICAgICAgWy03LCA5LCAxLCAweDFmZF0sXG4gICAgICAgICAgWy01LCA3LCAxLCAweDdjXSxcbiAgICAgICAgICBbLTMsIDQsIDEsIDB4YV0sXG4gICAgICAgICAgWy0xLCAzLCAxLCAweDJdLFxuICAgICAgICAgIFsxLCAzLCAxLCAweDNdLFxuICAgICAgICAgIFszLCA1LCAxLCAweDFhXSxcbiAgICAgICAgICBbNSwgNiwgMSwgMHgzYV0sXG4gICAgICAgICAgWzcsIDMsIDUsIDB4NF0sXG4gICAgICAgICAgWzM5LCA2LCAyLCAweDNiXSxcbiAgICAgICAgICBbNDMsIDQsIDUsIDB4Yl0sXG4gICAgICAgICAgWzc1LCA0LCA2LCAweGNdLFxuICAgICAgICAgIFsxMzksIDUsIDcsIDB4MWJdLFxuICAgICAgICAgIFsyNjcsIDUsIDgsIDB4MWNdLFxuICAgICAgICAgIFs1MjMsIDYsIDgsIDB4M2NdLFxuICAgICAgICAgIFs3NzksIDcsIDksIDB4N2RdLFxuICAgICAgICAgIFsxMjkxLCA2LCAxMSwgMHgzZF0sXG4gICAgICAgICAgWy0zMiwgOSwgMzIsIDB4MWZlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFszMzM5LCA5LCAzMiwgMHgxZmZdLCAvLyB1cHBlclxuICAgICAgICAgIFsyLCAweDBdLCAvLyBPT0JcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTIxLCA3LCA0LCAweDdhXSxcbiAgICAgICAgICBbLTUsIDgsIDAsIDB4ZmNdLFxuICAgICAgICAgIFstNCwgNywgMCwgMHg3Yl0sXG4gICAgICAgICAgWy0zLCA1LCAwLCAweDE4XSxcbiAgICAgICAgICBbLTIsIDIsIDIsIDB4MF0sXG4gICAgICAgICAgWzIsIDUsIDAsIDB4MTldLFxuICAgICAgICAgIFszLCA2LCAwLCAweDM2XSxcbiAgICAgICAgICBbNCwgNywgMCwgMHg3Y10sXG4gICAgICAgICAgWzUsIDgsIDAsIDB4ZmRdLFxuICAgICAgICAgIFs2LCAyLCA2LCAweDFdLFxuICAgICAgICAgIFs3MCwgNSwgNSwgMHgxYV0sXG4gICAgICAgICAgWzEwMiwgNiwgNSwgMHgzN10sXG4gICAgICAgICAgWzEzNCwgNiwgNiwgMHgzOF0sXG4gICAgICAgICAgWzE5OCwgNiwgNywgMHgzOV0sXG4gICAgICAgICAgWzMyNiwgNiwgOCwgMHgzYV0sXG4gICAgICAgICAgWzU4MiwgNiwgOSwgMHgzYl0sXG4gICAgICAgICAgWzEwOTQsIDYsIDEwLCAweDNjXSxcbiAgICAgICAgICBbMjExOCwgNywgMTEsIDB4N2RdLFxuICAgICAgICAgIFstMjIsIDgsIDMyLCAweGZlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs0MTY2LCA4LCAzMiwgMHhmZl0sIC8vIHVwcGVyXG4gICAgICAgICAgWzIsIDB4Ml0sIC8vIE9PQlxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAxLCAweDJdLFxuICAgICAgICAgIFs0LCA0LCAwLCAweGNdLFxuICAgICAgICAgIFs1LCA0LCAxLCAweGRdLFxuICAgICAgICAgIFs3LCA1LCAxLCAweDFjXSxcbiAgICAgICAgICBbOSwgNSwgMiwgMHgxZF0sXG4gICAgICAgICAgWzEzLCA2LCAyLCAweDNjXSxcbiAgICAgICAgICBbMTcsIDcsIDIsIDB4N2FdLFxuICAgICAgICAgIFsyMSwgNywgMywgMHg3Yl0sXG4gICAgICAgICAgWzI5LCA3LCA0LCAweDdjXSxcbiAgICAgICAgICBbNDUsIDcsIDUsIDB4N2RdLFxuICAgICAgICAgIFs3NywgNywgNiwgMHg3ZV0sXG4gICAgICAgICAgWzE0MSwgNywgMzIsIDB4N2ZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFszLCAzLCAxLCAweDZdLFxuICAgICAgICAgIFs1LCA1LCAwLCAweDFjXSxcbiAgICAgICAgICBbNiwgNSwgMSwgMHgxZF0sXG4gICAgICAgICAgWzgsIDYsIDEsIDB4M2NdLFxuICAgICAgICAgIFsxMCwgNywgMCwgMHg3YV0sXG4gICAgICAgICAgWzExLCA3LCAxLCAweDdiXSxcbiAgICAgICAgICBbMTMsIDcsIDIsIDB4N2NdLFxuICAgICAgICAgIFsxNywgNywgMywgMHg3ZF0sXG4gICAgICAgICAgWzI1LCA3LCA0LCAweDdlXSxcbiAgICAgICAgICBbNDEsIDgsIDUsIDB4ZmVdLFxuICAgICAgICAgIFs3MywgOCwgMzIsIDB4ZmZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAzLCAwLCAweDRdLFxuICAgICAgICAgIFszLCA0LCAwLCAweGNdLFxuICAgICAgICAgIFs0LCA1LCAwLCAweDFjXSxcbiAgICAgICAgICBbNSwgNCwgMSwgMHhkXSxcbiAgICAgICAgICBbNywgMywgMywgMHg1XSxcbiAgICAgICAgICBbMTUsIDYsIDEsIDB4M2FdLFxuICAgICAgICAgIFsxNywgNiwgMiwgMHgzYl0sXG4gICAgICAgICAgWzIxLCA2LCAzLCAweDNjXSxcbiAgICAgICAgICBbMjksIDYsIDQsIDB4M2RdLFxuICAgICAgICAgIFs0NSwgNiwgNSwgMHgzZV0sXG4gICAgICAgICAgWzc3LCA3LCA2LCAweDdlXSxcbiAgICAgICAgICBbMTQxLCA3LCAzMiwgMHg3Zl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNDpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yLCAzLCAwLCAweDRdLFxuICAgICAgICAgIFstMSwgMywgMCwgMHg1XSxcbiAgICAgICAgICBbMCwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMSwgMywgMCwgMHg2XSxcbiAgICAgICAgICBbMiwgMywgMCwgMHg3XSxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE1OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTI0LCA3LCA0LCAweDdjXSxcbiAgICAgICAgICBbLTgsIDYsIDIsIDB4M2NdLFxuICAgICAgICAgIFstNCwgNSwgMSwgMHgxY10sXG4gICAgICAgICAgWy0yLCA0LCAwLCAweGNdLFxuICAgICAgICAgIFstMSwgMywgMCwgMHg0XSxcbiAgICAgICAgICBbMCwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMSwgMywgMCwgMHg1XSxcbiAgICAgICAgICBbMiwgNCwgMCwgMHhkXSxcbiAgICAgICAgICBbMywgNSwgMSwgMHgxZF0sXG4gICAgICAgICAgWzUsIDYsIDIsIDB4M2RdLFxuICAgICAgICAgIFs5LCA3LCA0LCAweDdkXSxcbiAgICAgICAgICBbLTI1LCA3LCAzMiwgMHg3ZSwgXCJsb3dlclwiXSxcbiAgICAgICAgICBbMjUsIDcsIDMyLCAweDdmXSwgLy8gdXBwZXJcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBsaW5lc1tpXSA9IG5ldyBIdWZmbWFuTGluZShsaW5lc1tpXSk7XG4gICAgfVxuICAgIHRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgdHJ1ZSk7XG4gICAgc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdID0gdGFibGU7XG4gICAgcmV0dXJuIHRhYmxlO1xuICB9XG5cbiAgZnVuY3Rpb24gUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICB0aGlzLnBvc2l0aW9uID0gc3RhcnQ7XG4gICAgdGhpcy5zaGlmdCA9IC0xO1xuICAgIHRoaXMuY3VycmVudEJ5dGUgPSAwO1xuICB9XG5cbiAgUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICByZWFkQml0KCkge1xuICAgICAgaWYgKHRoaXMuc2hpZnQgPCAwKSB7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJlbmQgb2YgZGF0YSB3aGlsZSByZWFkaW5nIGJpdFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCeXRlID0gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107XG4gICAgICAgIHRoaXMuc2hpZnQgPSA3O1xuICAgICAgfVxuICAgICAgY29uc3QgYml0ID0gKHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCkgJiAxO1xuICAgICAgdGhpcy5zaGlmdC0tO1xuICAgICAgcmV0dXJuIGJpdDtcbiAgICB9LFxuXG4gICAgcmVhZEJpdHMobnVtQml0cykge1xuICAgICAgbGV0IHJlc3VsdCA9IDAsXG4gICAgICAgIGk7XG4gICAgICBmb3IgKGkgPSBudW1CaXRzIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgcmVzdWx0IHw9IHRoaXMucmVhZEJpdCgpIDw8IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBieXRlQWxpZ24oKSB7XG4gICAgICB0aGlzLnNoaWZ0ID0gLTE7XG4gICAgfSxcblxuICAgIG5leHQoKSB7XG4gICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSB0aGlzLmVuZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBnZXRDdXN0b21IdWZmbWFuVGFibGUoaW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcykge1xuICAgIC8vIFJldHVybnMgYSBUYWJsZXMgc2VnbWVudCB0aGF0IGhhcyBiZWVuIGVhcmxpZXIgZGVjb2RlZC5cbiAgICAvLyBTZWUgNy40LjIuMS42IChzeW1ib2wgZGljdGlvbmFyeSkgb3IgNy40LjMuMS42ICh0ZXh0IHJlZ2lvbikuXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmVmZXJyZWRUby5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IGN1c3RvbVRhYmxlc1tyZWZlcnJlZFRvW2ldXTtcbiAgICAgIGlmICh0YWJsZSkge1xuICAgICAgICBpZiAoaW5kZXggPT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0YWJsZTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJjYW4ndCBmaW5kIGN1c3RvbSBIdWZmbWFuIHRhYmxlXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMoXG4gICAgdGV4dFJlZ2lvbixcbiAgICByZWZlcnJlZFRvLFxuICAgIGN1c3RvbVRhYmxlcyxcbiAgICBudW1iZXJPZlN5bWJvbHMsXG4gICAgcmVhZGVyXG4gICkge1xuICAgIC8vIDcuNC4zLjEuNyBTeW1ib2wgSUQgSHVmZm1hbiB0YWJsZSBkZWNvZGluZ1xuXG4gICAgLy8gUmVhZCBjb2RlIGxlbmd0aHMgZm9yIFJVTkNPREVzIDAuLi4zNC5cbiAgICBjb25zdCBjb2RlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDM0OyBpKyspIHtcbiAgICAgIGNvbnN0IGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7XG4gICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTtcbiAgICB9XG4gICAgLy8gQXNzaWduIEh1ZmZtYW4gY29kZXMgZm9yIFJVTkNPREVzLlxuICAgIGNvbnN0IHJ1bkNvZGVzVGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGNvZGVzLCBmYWxzZSk7XG5cbiAgICAvLyBSZWFkIGEgSHVmZm1hbiBjb2RlIHVzaW5nIHRoZSBhc3NpZ25tZW50IGFib3ZlLlxuICAgIC8vIEludGVycHJldCB0aGUgUlVOQ09ERSBjb2RlcyBhbmQgdGhlIGFkZGl0aW9uYWwgYml0cyAoaWYgYW55KS5cbiAgICBjb2Rlcy5sZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZTeW1ib2xzOyApIHtcbiAgICAgIGNvbnN0IGNvZGVMZW5ndGggPSBydW5Db2Rlc1RhYmxlLmRlY29kZShyZWFkZXIpO1xuICAgICAgaWYgKGNvZGVMZW5ndGggPj0gMzIpIHtcbiAgICAgICAgbGV0IHJlcGVhdGVkTGVuZ3RoLCBudW1iZXJPZlJlcGVhdHMsIGo7XG4gICAgICAgIHN3aXRjaCAoY29kZUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygyKSArIDM7XG4gICAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IGNvZGVzW2kgLSAxXS5wcmVmaXhMZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMztcbiAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTtcbiAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgY29kZSBsZW5ndGggaW4gc3ltYm9sIElEIHRhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZlJlcGVhdHM7IGorKykge1xuICAgICAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCByZXBlYXRlZExlbmd0aCwgMCwgMF0pKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCBjb2RlTGVuZ3RoLCAwLCAwXSkpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJlYWRlci5ieXRlQWxpZ24oKTtcbiAgICBjb25zdCBzeW1ib2xJRFRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShjb2RlcywgZmFsc2UpO1xuXG4gICAgLy8gNy40LjMuMS42IFRleHQgcmVnaW9uIHNlZ21lbnQgSHVmZm1hbiB0YWJsZSBzZWxlY3Rpb25cblxuICAgIGxldCBjdXN0b21JbmRleCA9IDAsXG4gICAgICB0YWJsZUZpcnN0UyxcbiAgICAgIHRhYmxlRGVsdGFTLFxuICAgICAgdGFibGVEZWx0YVQ7XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkZTKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRhYmxlRmlyc3RTID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5GUyArIDYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVGaXJzdFMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoXG4gICAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgICBjdXN0b21UYWJsZXNcbiAgICAgICAgKTtcbiAgICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgSHVmZm1hbiBGUyBzZWxlY3RvclwiKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkRTKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRhYmxlRGVsdGFTID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5EUyArIDgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVEZWx0YVMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoXG4gICAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgICBjdXN0b21UYWJsZXNcbiAgICAgICAgKTtcbiAgICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgSHVmZm1hbiBEUyBzZWxlY3RvclwiKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkRUKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5EVCArIDExKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICAgIGN1c3RvbUluZGV4LFxuICAgICAgICAgIHJlZmVycmVkVG8sXG4gICAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICAgICk7XG4gICAgICAgIGN1c3RvbUluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIEh1ZmZtYW4gRFQgc2VsZWN0b3JcIik7XG4gICAgfVxuXG4gICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCkge1xuICAgICAgLy8gTG9hZCB0YWJsZXMgUkRXLCBSREgsIFJEWCBhbmQgUkRZLlxuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzeW1ib2xJRFRhYmxlLFxuICAgICAgdGFibGVGaXJzdFMsXG4gICAgICB0YWJsZURlbHRhUyxcbiAgICAgIHRhYmxlRGVsdGFULFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhcbiAgICBkaWN0aW9uYXJ5LFxuICAgIHJlZmVycmVkVG8sXG4gICAgY3VzdG9tVGFibGVzXG4gICkge1xuICAgIC8vIDcuNC4yLjEuNiBTeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IEh1ZmZtYW4gdGFibGUgc2VsZWN0aW9uXG5cbiAgICBsZXQgY3VzdG9tSW5kZXggPSAwLFxuICAgICAgdGFibGVEZWx0YUhlaWdodCxcbiAgICAgIHRhYmxlRGVsdGFXaWR0aDtcbiAgICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldFN0YW5kYXJkVGFibGUoZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciArIDQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgICApO1xuICAgICAgICBjdXN0b21JbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBIdWZmbWFuIERIIHNlbGVjdG9yXCIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3Rvcikge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IgKyAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgICApO1xuICAgICAgICBjdXN0b21JbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBIdWZmbWFuIERXIHNlbGVjdG9yXCIpO1xuICAgIH1cblxuICAgIGxldCB0YWJsZUJpdG1hcFNpemUsIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzO1xuICAgIGlmIChkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3Rvcikge1xuICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICApO1xuICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTtcbiAgICB9XG5cbiAgICBpZiAoZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yKSB7XG4gICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgIHJlZmVycmVkVG8sXG4gICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMgPSBnZXRTdGFuZGFyZFRhYmxlKDEpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZURlbHRhSGVpZ2h0LFxuICAgICAgdGFibGVEZWx0YVdpZHRoLFxuICAgICAgdGFibGVCaXRtYXBTaXplLFxuICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRVbmNvbXByZXNzZWRCaXRtYXAocmVhZGVyLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgYml0bWFwID0gW107XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpO1xuICAgICAgfVxuICAgICAgcmVhZGVyLmJ5dGVBbGlnbigpO1xuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlTU1SQml0bWFwKGlucHV0LCB3aWR0aCwgaGVpZ2h0LCBlbmRPZkJsb2NrKSB7XG4gICAgLy8gTU1SIGlzIHRoZSBzYW1lIGNvbXByZXNzaW9uIGFsZ29yaXRobSBhcyB0aGUgUERGIGZpbHRlclxuICAgIC8vIENDSVRURmF4RGVjb2RlIHdpdGggL0sgLTEuXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgSzogLTEsXG4gICAgICBDb2x1bW5zOiB3aWR0aCxcbiAgICAgIFJvd3M6IGhlaWdodCxcbiAgICAgIEJsYWNrSXMxOiB0cnVlLFxuICAgICAgRW5kT2ZCbG9jazogZW5kT2ZCbG9jayxcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKGlucHV0LCBwYXJhbXMpO1xuICAgIGNvbnN0IGJpdG1hcCA9IFtdO1xuICAgIGxldCBjdXJyZW50Qnl0ZSxcbiAgICAgIGVvZiA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGxldCBzaGlmdCA9IC0xO1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIGlmIChzaGlmdCA8IDApIHtcbiAgICAgICAgICBjdXJyZW50Qnl0ZSA9IGRlY29kZXIucmVhZE5leHRDaGFyKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRCeXRlID09PSAtMSkge1xuICAgICAgICAgICAgLy8gU2V0IHRoZSByZXN0IG9mIHRoZSBiaXRzIHRvIHplcm8uXG4gICAgICAgICAgICBjdXJyZW50Qnl0ZSA9IDA7XG4gICAgICAgICAgICBlb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGlmdCA9IDc7XG4gICAgICAgIH1cbiAgICAgICAgcm93W3hdID0gKGN1cnJlbnRCeXRlID4+IHNoaWZ0KSAmIDE7XG4gICAgICAgIHNoaWZ0LS07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVuZE9mQmxvY2sgJiYgIWVvZikge1xuICAgICAgLy8gUmVhZCB1bnRpbCBFT0ZCIGhhcyBiZWVuIGNvbnN1bWVkLlxuICAgICAgY29uc3QgbG9va0ZvckVPRkxpbWl0ID0gNTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va0ZvckVPRkxpbWl0OyBpKyspIHtcbiAgICAgICAgaWYgKGRlY29kZXIucmVhZE5leHRDaGFyKCkgPT09IC0xKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBKYmlnMkltYWdlKCkge31cblxuICBKYmlnMkltYWdlLnByb3RvdHlwZSA9IHtcbiAgICBwYXJzZUNodW5rcyhjaHVua3MpIHtcbiAgICAgIHJldHVybiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcyk7XG4gICAgfSxcblxuICAgIHBhcnNlKGRhdGEpIHtcbiAgICAgIGNvbnN0IHsgaW1nRGF0YSwgd2lkdGgsIGhlaWdodCB9ID0gcGFyc2VKYmlnMihkYXRhKTtcbiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgcmV0dXJuIGltZ0RhdGE7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gSmJpZzJJbWFnZTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpiaWcySW1hZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuLy8gVGFibGUgQy0yXG5jb25zdCBRZVRhYmxlID0gW1xuICB7IHFlOiAweDU2MDEsIG5tcHM6IDEsIG5scHM6IDEsIHN3aXRjaEZsYWc6IDEgfSxcbiAgeyBxZTogMHgzNDAxLCBubXBzOiAyLCBubHBzOiA2LCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4MTgwMSwgbm1wczogMywgbmxwczogOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDBhYzEsIG5tcHM6IDQsIG5scHM6IDEyLCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4MDUyMSwgbm1wczogNSwgbmxwczogMjksIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMjIxLCBubXBzOiAzOCwgbmxwczogMzMsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg1NjAxLCBubXBzOiA3LCBubHBzOiA2LCBzd2l0Y2hGbGFnOiAxIH0sXG4gIHsgcWU6IDB4NTQwMSwgbm1wczogOCwgbmxwczogMTQsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg0ODAxLCBubXBzOiA5LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM4MDEsIG5tcHM6IDEwLCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDMwMDEsIG5tcHM6IDExLCBubHBzOiAxNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI0MDEsIG5tcHM6IDEyLCBubHBzOiAxOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDFjMDEsIG5tcHM6IDEzLCBubHBzOiAyMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE2MDEsIG5tcHM6IDI5LCBubHBzOiAyMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDU2MDEsIG5tcHM6IDE1LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMSB9LFxuICB7IHFlOiAweDU0MDEsIG5tcHM6IDE2LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDUxMDEsIG5tcHM6IDE3LCBubHBzOiAxNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDQ4MDEsIG5tcHM6IDE4LCBubHBzOiAxNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM4MDEsIG5tcHM6IDE5LCBubHBzOiAxNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM0MDEsIG5tcHM6IDIwLCBubHBzOiAxOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDMwMDEsIG5tcHM6IDIxLCBubHBzOiAxOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI4MDEsIG5tcHM6IDIyLCBubHBzOiAxOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI0MDEsIG5tcHM6IDIzLCBubHBzOiAyMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDIyMDEsIG5tcHM6IDI0LCBubHBzOiAyMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDFjMDEsIG5tcHM6IDI1LCBubHBzOiAyMiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE4MDEsIG5tcHM6IDI2LCBubHBzOiAyMywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE2MDEsIG5tcHM6IDI3LCBubHBzOiAyNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE0MDEsIG5tcHM6IDI4LCBubHBzOiAyNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDEyMDEsIG5tcHM6IDI5LCBubHBzOiAyNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDExMDEsIG5tcHM6IDMwLCBubHBzOiAyNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDBhYzEsIG5tcHM6IDMxLCBubHBzOiAyOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA5YzEsIG5tcHM6IDMyLCBubHBzOiAyOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA4YTEsIG5tcHM6IDMzLCBubHBzOiAzMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA1MjEsIG5tcHM6IDM0LCBubHBzOiAzMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA0NDEsIG5tcHM6IDM1LCBubHBzOiAzMiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAyYTEsIG5tcHM6IDM2LCBubHBzOiAzMywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAyMjEsIG5tcHM6IDM3LCBubHBzOiAzNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAxNDEsIG5tcHM6IDM4LCBubHBzOiAzNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAxMTEsIG5tcHM6IDM5LCBubHBzOiAzNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwODUsIG5tcHM6IDQwLCBubHBzOiAzNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwNDksIG5tcHM6IDQxLCBubHBzOiAzOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMjUsIG5tcHM6IDQyLCBubHBzOiAzOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMTUsIG5tcHM6IDQzLCBubHBzOiA0MCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDksIG5tcHM6IDQ0LCBubHBzOiA0MSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDUsIG5tcHM6IDQ1LCBubHBzOiA0Miwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDEsIG5tcHM6IDQ1LCBubHBzOiA0Mywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDU2MDEsIG5tcHM6IDQ2LCBubHBzOiA0Niwgc3dpdGNoRmxhZzogMCB9LFxuXTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFFNIENvZGVyIGRlY29kaW5nIGFzIGRlZmluZWQgaW5cbiAqICAgSlBFRyAyMDAwIFBhcnQgSSBGaW5hbCBDb21taXR0ZWUgRHJhZnQgVmVyc2lvbiAxLjBcbiAqICAgQW5uZXggQy4zIEFyaXRobWV0aWMgZGVjb2RpbmcgcHJvY2VkdXJlXG4gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qcGVnLm9yZy9wdWJsaWMvZmNkMTU0NDQtMS5wZGZcbiAqXG4gKiBUaGUgYXJpdGhtZXRpYyBkZWNvZGVyIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBjb250ZXh0IG1vZGVscyB0byBkZWNvZGVcbiAqIEpQRUcyMDAwIGFuZCBKQklHMiBzdHJlYW1zLlxuICovXG5jbGFzcyBBcml0aG1ldGljRGVjb2RlciB7XG4gIC8vIEMuMy41IEluaXRpYWxpc2F0aW9uIG9mIHRoZSBkZWNvZGVyIChJTklUREVDKVxuICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLmJwID0gc3RhcnQ7XG4gICAgdGhpcy5kYXRhRW5kID0gZW5kO1xuXG4gICAgdGhpcy5jaGlnaCA9IGRhdGFbc3RhcnRdO1xuICAgIHRoaXMuY2xvdyA9IDA7XG5cbiAgICB0aGlzLmJ5dGVJbigpO1xuXG4gICAgdGhpcy5jaGlnaCA9ICgodGhpcy5jaGlnaCA8PCA3KSAmIDB4ZmZmZikgfCAoKHRoaXMuY2xvdyA+PiA5KSAmIDB4N2YpO1xuICAgIHRoaXMuY2xvdyA9ICh0aGlzLmNsb3cgPDwgNykgJiAweGZmZmY7XG4gICAgdGhpcy5jdCAtPSA3O1xuICAgIHRoaXMuYSA9IDB4ODAwMDtcbiAgfVxuXG4gIC8vIEMuMy40IENvbXByZXNzZWQgZGF0YSBpbnB1dCAoQllURUlOKVxuICBieXRlSW4oKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBsZXQgYnAgPSB0aGlzLmJwO1xuXG4gICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7XG4gICAgICBpZiAoZGF0YVticCArIDFdID4gMHg4Zikge1xuICAgICAgICB0aGlzLmNsb3cgKz0gMHhmZjAwO1xuICAgICAgICB0aGlzLmN0ID0gODtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJwKys7XG4gICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5O1xuICAgICAgICB0aGlzLmN0ID0gNztcbiAgICAgICAgdGhpcy5icCA9IGJwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBicCsrO1xuICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDtcbiAgICAgIHRoaXMuY3QgPSA4O1xuICAgICAgdGhpcy5icCA9IGJwO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbG93ID4gMHhmZmZmKSB7XG4gICAgICB0aGlzLmNoaWdoICs9IHRoaXMuY2xvdyA+PiAxNjtcbiAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7XG4gICAgfVxuICB9XG5cbiAgLy8gQy4zLjIgRGVjb2RpbmcgYSBkZWNpc2lvbiAoREVDT0RFKVxuICByZWFkQml0KGNvbnRleHRzLCBwb3MpIHtcbiAgICAvLyBDb250ZXh0cyBhcmUgcGFja2VkIGludG8gMSBieXRlOlxuICAgIC8vIGhpZ2hlc3QgNyBiaXRzIGNhcnJ5IGN4LmluZGV4LCBsb3dlc3QgYml0IGNhcnJpZXMgY3gubXBzXG4gICAgbGV0IGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLFxuICAgICAgY3hfbXBzID0gY29udGV4dHNbcG9zXSAmIDE7XG4gICAgY29uc3QgcWVUYWJsZUljeCA9IFFlVGFibGVbY3hfaW5kZXhdO1xuICAgIGNvbnN0IHFlSWN4ID0gcWVUYWJsZUljeC5xZTtcbiAgICBsZXQgZDtcbiAgICBsZXQgYSA9IHRoaXMuYSAtIHFlSWN4O1xuXG4gICAgaWYgKHRoaXMuY2hpZ2ggPCBxZUljeCkge1xuICAgICAgLy8gZXhjaGFuZ2VMcHNcbiAgICAgIGlmIChhIDwgcWVJY3gpIHtcbiAgICAgICAgYSA9IHFlSWN4O1xuICAgICAgICBkID0gY3hfbXBzO1xuICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGEgPSBxZUljeDtcbiAgICAgICAgZCA9IDEgXiBjeF9tcHM7XG4gICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHtcbiAgICAgICAgICBjeF9tcHMgPSBkO1xuICAgICAgICB9XG4gICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoaWdoIC09IHFlSWN4O1xuICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkge1xuICAgICAgICB0aGlzLmEgPSBhO1xuICAgICAgICByZXR1cm4gY3hfbXBzO1xuICAgICAgfVxuICAgICAgLy8gZXhjaGFuZ2VNcHNcbiAgICAgIGlmIChhIDwgcWVJY3gpIHtcbiAgICAgICAgZCA9IDEgXiBjeF9tcHM7XG4gICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHtcbiAgICAgICAgICBjeF9tcHMgPSBkO1xuICAgICAgICB9XG4gICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZCA9IGN4X21wcztcbiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5tcHM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEMuMy4zIHJlbm9ybUQ7XG4gICAgZG8ge1xuICAgICAgaWYgKHRoaXMuY3QgPT09IDApIHtcbiAgICAgICAgdGhpcy5ieXRlSW4oKTtcbiAgICAgIH1cblxuICAgICAgYSA8PD0gMTtcbiAgICAgIHRoaXMuY2hpZ2ggPSAoKHRoaXMuY2hpZ2ggPDwgMSkgJiAweGZmZmYpIHwgKCh0aGlzLmNsb3cgPj4gMTUpICYgMSk7XG4gICAgICB0aGlzLmNsb3cgPSAodGhpcy5jbG93IDw8IDEpICYgMHhmZmZmO1xuICAgICAgdGhpcy5jdC0tO1xuICAgIH0gd2hpbGUgKChhICYgMHg4MDAwKSA9PT0gMCk7XG4gICAgdGhpcy5hID0gYTtcblxuICAgIGNvbnRleHRzW3Bvc10gPSAoY3hfaW5kZXggPDwgMSkgfCBjeF9tcHM7XG4gICAgcmV0dXJuIGQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgQXJpdGhtZXRpY0RlY29kZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBEZWNvZGVTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcbmltcG9ydCB7IGlzRGljdCB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IEpwZWdJbWFnZSB9IGZyb20gXCIuL2pwZy5qc1wiO1xuaW1wb3J0IHsgc2hhZG93IH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbi8qKlxuICogRm9yIEpQRUcncyB3ZSB1c2UgYSBsaWJyYXJ5IHRvIGRlY29kZSB0aGVzZSBpbWFnZXMgYW5kIHRoZSBzdHJlYW0gYmVoYXZlc1xuICogbGlrZSBhbGwgdGhlIG90aGVyIERlY29kZVN0cmVhbXMuXG4gKi9cbmNvbnN0IEpwZWdTdHJlYW0gPSAoZnVuY3Rpb24gSnBlZ1N0cmVhbUNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gSnBlZ1N0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBkaWN0LCBwYXJhbXMpIHtcbiAgICAvLyBTb21lIGltYWdlcyBtYXkgY29udGFpbiAnanVuaycgYmVmb3JlIHRoZSBTT0kgKHN0YXJ0LW9mLWltYWdlKSBtYXJrZXIuXG4gICAgLy8gTm90ZTogdGhpcyBzZWVtcyB0byBtYWlubHkgYWZmZWN0IGlubGluZSBpbWFnZXMuXG4gICAgbGV0IGNoO1xuICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHtcbiAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIFNPSSBtYXJrZXIgKDB4RkZEOCkuXG4gICAgICBpZiAoY2ggPT09IDB4ZmYpIHtcbiAgICAgICAgc3RyZWFtLnNraXAoLTEpOyAvLyBSZXNldCB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIHRoZSBTT0kuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7XG4gICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblxuICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTtcbiAgfVxuXG4gIEpwZWdTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSnBlZ1N0cmVhbS5wcm90b3R5cGUsIFwiYnl0ZXNcIiwge1xuICAgIGdldDogZnVuY3Rpb24gSnBlZ1N0cmVhbV9ieXRlcygpIHtcbiAgICAgIC8vIElmIGB0aGlzLm1heWJlTGVuZ3RoYCBpcyBudWxsLCB3ZSdsbCBnZXQgdGhlIGVudGlyZSBzdHJlYW0uXG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiYnl0ZXNcIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpO1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcblxuICBKcGVnU3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7XG4gICAgLy8gTm8tb3AsIHNpbmNlIGB0aGlzLnJlYWRCbG9ja2Agd2lsbCBhbHdheXMgcGFyc2UgdGhlIGVudGlyZSBpbWFnZSBhbmRcbiAgICAvLyBkaXJlY3RseSBpbnNlcnQgYWxsIG9mIGl0cyBkYXRhIGludG8gYHRoaXMuYnVmZmVyYC5cbiAgfTtcblxuICBKcGVnU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGpwZWdPcHRpb25zID0ge1xuICAgICAgZGVjb2RlVHJhbnNmb3JtOiB1bmRlZmluZWQsXG4gICAgICBjb2xvclRyYW5zZm9ybTogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICAvLyBDaGVja2luZyBpZiB2YWx1ZXMgbmVlZCB0byBiZSB0cmFuc2Zvcm1lZCBiZWZvcmUgY29udmVyc2lvbi5cbiAgICBjb25zdCBkZWNvZGVBcnIgPSB0aGlzLmRpY3QuZ2V0QXJyYXkoXCJEZWNvZGVcIiwgXCJEXCIpO1xuICAgIGlmICh0aGlzLmZvcmNlUkdCICYmIEFycmF5LmlzQXJyYXkoZGVjb2RlQXJyKSkge1xuICAgICAgY29uc3QgYml0c1BlckNvbXBvbmVudCA9IHRoaXMuZGljdC5nZXQoXCJCaXRzUGVyQ29tcG9uZW50XCIpIHx8IDg7XG4gICAgICBjb25zdCBkZWNvZGVBcnJMZW5ndGggPSBkZWNvZGVBcnIubGVuZ3RoO1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEludDMyQXJyYXkoZGVjb2RlQXJyTGVuZ3RoKTtcbiAgICAgIGxldCB0cmFuc2Zvcm1OZWVkZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG1heFZhbHVlID0gKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVBcnJMZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB0cmFuc2Zvcm1baV0gPSAoKGRlY29kZUFycltpICsgMV0gLSBkZWNvZGVBcnJbaV0pICogMjU2KSB8IDA7XG4gICAgICAgIHRyYW5zZm9ybVtpICsgMV0gPSAoZGVjb2RlQXJyW2ldICogbWF4VmFsdWUpIHwgMDtcbiAgICAgICAgaWYgKHRyYW5zZm9ybVtpXSAhPT0gMjU2IHx8IHRyYW5zZm9ybVtpICsgMV0gIT09IDApIHtcbiAgICAgICAgICB0cmFuc2Zvcm1OZWVkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNmb3JtTmVlZGVkKSB7XG4gICAgICAgIGpwZWdPcHRpb25zLmRlY29kZVRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRmV0Y2hpbmcgdGhlICdDb2xvclRyYW5zZm9ybScgZW50cnksIGlmIGl0IGV4aXN0cy5cbiAgICBpZiAoaXNEaWN0KHRoaXMucGFyYW1zKSkge1xuICAgICAgY29uc3QgY29sb3JUcmFuc2Zvcm0gPSB0aGlzLnBhcmFtcy5nZXQoXCJDb2xvclRyYW5zZm9ybVwiKTtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGNvbG9yVHJhbnNmb3JtKSkge1xuICAgICAgICBqcGVnT3B0aW9ucy5jb2xvclRyYW5zZm9ybSA9IGNvbG9yVHJhbnNmb3JtO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBqcGVnSW1hZ2UgPSBuZXcgSnBlZ0ltYWdlKGpwZWdPcHRpb25zKTtcblxuICAgIGpwZWdJbWFnZS5wYXJzZSh0aGlzLmJ5dGVzKTtcbiAgICBjb25zdCBkYXRhID0ganBlZ0ltYWdlLmdldERhdGEoe1xuICAgICAgd2lkdGg6IHRoaXMuZHJhd1dpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmRyYXdIZWlnaHQsXG4gICAgICBmb3JjZVJHQjogdGhpcy5mb3JjZVJHQixcbiAgICAgIGlzU291cmNlUERGOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgfTtcblxuICByZXR1cm4gSnBlZ1N0cmVhbTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpwZWdTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGFzc2VydCwgQmFzZUV4Y2VwdGlvbiwgd2FybiB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgcmVhZFVpbnQxNiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuY2xhc3MgSnBlZ0Vycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKGBKUEVHIGVycm9yOiAke21zZ31gKTtcbiAgfVxufVxuXG5jbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzY2FuTGluZXMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnNjYW5MaW5lcyA9IHNjYW5MaW5lcztcbiAgfVxufVxuXG5jbGFzcyBFT0lNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuLyoqXG4gKiBUaGlzIGNvZGUgd2FzIGZvcmtlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3RtYXN0ZXJ5ZXQvanBnanMuXG4gKiBUaGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgY3JlYXRlZCBieSBHaXRIdWIgdXNlciBub3RtYXN0ZXJ5ZXQuXG4gKlxuICogLSBUaGUgSlBFRyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgSVRVIENDSVRUIFJlY29tbWVuZGF0aW9uIFQuODFcbiAqICAgKHd3dy53My5vcmcvR3JhcGhpY3MvSlBFRy9pdHUtdDgxLnBkZilcbiAqIC0gVGhlIEpGSUYgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIEpQRUcgRmlsZSBJbnRlcmNoYW5nZSBGb3JtYXRcbiAqICAgKHd3dy53My5vcmcvR3JhcGhpY3MvSlBFRy9qZmlmMy5wZGYpXG4gKiAtIFRoZSBBZG9iZSBBcHBsaWNhdGlvbi1TcGVjaWZpYyBKUEVHIG1hcmtlcnMgaW4gdGhlXG4gKiAgIFN1cHBvcnRpbmcgdGhlIERDVCBGaWx0ZXJzIGluIFBvc3RTY3JpcHQgTGV2ZWwgMiwgVGVjaG5pY2FsIE5vdGUgIzUxMTZcbiAqICAgKHBhcnRuZXJzLmFkb2JlLmNvbS9wdWJsaWMvZGV2ZWxvcGVyL2VuL3BzL3Nkay81MTE2LkRDVF9GaWx0ZXIucGRmKVxuICovXG5cbnZhciBKcGVnSW1hZ2UgPSAoZnVuY3Rpb24gSnBlZ0ltYWdlQ2xvc3VyZSgpIHtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBkY3RaaWdaYWcgPSBuZXcgVWludDhBcnJheShbXG4gICAgIDAsXG4gICAgIDEsICA4LFxuICAgIDE2LCAgOSwgIDIsXG4gICAgIDMsIDEwLCAxNywgMjQsXG4gICAgMzIsIDI1LCAxOCwgMTEsIDQsXG4gICAgIDUsIDEyLCAxOSwgMjYsIDMzLCA0MCxcbiAgICA0OCwgNDEsIDM0LCAyNywgMjAsIDEzLCAgNixcbiAgICAgNywgMTQsIDIxLCAyOCwgMzUsIDQyLCA0OSwgNTYsXG4gICAgNTcsIDUwLCA0MywgMzYsIDI5LCAyMiwgMTUsXG4gICAgMjMsIDMwLCAzNywgNDQsIDUxLCA1OCxcbiAgICA1OSwgNTIsIDQ1LCAzOCwgMzEsXG4gICAgMzksIDQ2LCA1MywgNjAsXG4gICAgNjEsIDU0LCA0NyxcbiAgICA1NSwgNjIsXG4gICAgNjNcbiAgXSk7XG5cbiAgdmFyIGRjdENvczEgPSA0MDE3OyAvLyBjb3MocGkvMTYpXG4gIHZhciBkY3RTaW4xID0gNzk5OyAvLyBzaW4ocGkvMTYpXG4gIHZhciBkY3RDb3MzID0gMzQwNjsgLy8gY29zKDMqcGkvMTYpXG4gIHZhciBkY3RTaW4zID0gMjI3NjsgLy8gc2luKDMqcGkvMTYpXG4gIHZhciBkY3RDb3M2ID0gMTU2NzsgLy8gY29zKDYqcGkvMTYpXG4gIHZhciBkY3RTaW42ID0gMzc4NDsgLy8gc2luKDYqcGkvMTYpXG4gIHZhciBkY3RTcXJ0MiA9IDU3OTM7IC8vIHNxcnQoMilcbiAgdmFyIGRjdFNxcnQxZDIgPSAyODk2OyAvLyBzcXJ0KDIpIC8gMlxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gSnBlZ0ltYWdlKHsgZGVjb2RlVHJhbnNmb3JtID0gbnVsbCwgY29sb3JUcmFuc2Zvcm0gPSAtMSB9ID0ge30pIHtcbiAgICB0aGlzLl9kZWNvZGVUcmFuc2Zvcm0gPSBkZWNvZGVUcmFuc2Zvcm07XG4gICAgdGhpcy5fY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCB2YWx1ZXMpIHtcbiAgICB2YXIgayA9IDAsXG4gICAgICBjb2RlID0gW10sXG4gICAgICBpLFxuICAgICAgaixcbiAgICAgIGxlbmd0aCA9IDE2O1xuICAgIHdoaWxlIChsZW5ndGggPiAwICYmICFjb2RlTGVuZ3Roc1tsZW5ndGggLSAxXSkge1xuICAgICAgbGVuZ3RoLS07XG4gICAgfVxuICAgIGNvZGUucHVzaCh7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSk7XG4gICAgdmFyIHAgPSBjb2RlWzBdLFxuICAgICAgcTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3Roc1tpXTsgaisrKSB7XG4gICAgICAgIHAgPSBjb2RlLnBvcCgpO1xuICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gdmFsdWVzW2tdO1xuICAgICAgICB3aGlsZSAocC5pbmRleCA+IDApIHtcbiAgICAgICAgICBwID0gY29kZS5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBwLmluZGV4Kys7XG4gICAgICAgIGNvZGUucHVzaChwKTtcbiAgICAgICAgd2hpbGUgKGNvZGUubGVuZ3RoIDw9IGkpIHtcbiAgICAgICAgICBjb2RlLnB1c2goKHEgPSB7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSkpO1xuICAgICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuO1xuICAgICAgICAgIHAgPSBxO1xuICAgICAgICB9XG4gICAgICAgIGsrKztcbiAgICAgIH1cbiAgICAgIGlmIChpICsgMSA8IGxlbmd0aCkge1xuICAgICAgICAvLyBwIGhlcmUgcG9pbnRzIHRvIGxhc3QgY29kZVxuICAgICAgICBjb2RlLnB1c2goKHEgPSB7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSkpO1xuICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjtcbiAgICAgICAgcCA9IHE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2RlWzBdLmNoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkge1xuICAgIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVTY2FuKFxuICAgIGRhdGEsXG4gICAgb2Zmc2V0LFxuICAgIGZyYW1lLFxuICAgIGNvbXBvbmVudHMsXG4gICAgcmVzZXRJbnRlcnZhbCxcbiAgICBzcGVjdHJhbFN0YXJ0LFxuICAgIHNwZWN0cmFsRW5kLFxuICAgIHN1Y2Nlc3NpdmVQcmV2LFxuICAgIHN1Y2Nlc3NpdmUsXG4gICAgcGFyc2VETkxNYXJrZXIgPSBmYWxzZVxuICApIHtcbiAgICB2YXIgbWN1c1BlckxpbmUgPSBmcmFtZS5tY3VzUGVyTGluZTtcbiAgICB2YXIgcHJvZ3Jlc3NpdmUgPSBmcmFtZS5wcm9ncmVzc2l2ZTtcblxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0O1xuICAgIGxldCBiaXRzRGF0YSA9IDAsXG4gICAgICBiaXRzQ291bnQgPSAwO1xuXG4gICAgZnVuY3Rpb24gcmVhZEJpdCgpIHtcbiAgICAgIGlmIChiaXRzQ291bnQgPiAwKSB7XG4gICAgICAgIGJpdHNDb3VudC0tO1xuICAgICAgICByZXR1cm4gKGJpdHNEYXRhID4+IGJpdHNDb3VudCkgJiAxO1xuICAgICAgfVxuICAgICAgYml0c0RhdGEgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgIGlmIChiaXRzRGF0YSA9PT0gMHhmZikge1xuICAgICAgICB2YXIgbmV4dEJ5dGUgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgaWYgKG5leHRCeXRlKSB7XG4gICAgICAgICAgaWYgKG5leHRCeXRlID09PSAvKiBETkwgPSAqLyAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICBjb25zdCBzY2FuTGluZXMgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIGlmIChzY2FuTGluZXMgPiAwICYmIHNjYW5MaW5lcyAhPT0gZnJhbWUuc2NhbkxpbmVzKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgICBcIkZvdW5kIEROTCBtYXJrZXIgKDB4RkZEQykgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGFcIixcbiAgICAgICAgICAgICAgICBzY2FuTGluZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRCeXRlID09PSAvKiBFT0kgPSAqLyAweGQ5KSB7XG4gICAgICAgICAgICBpZiAocGFyc2VETkxNYXJrZXIpIHtcbiAgICAgICAgICAgICAgLy8gTk9URTogb25seSA4LWJpdCBKUEVHIGltYWdlcyBhcmUgc3VwcG9ydGVkIGluIHRoaXMgZGVjb2Rlci5cbiAgICAgICAgICAgICAgY29uc3QgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7XG4gICAgICAgICAgICAgIC8vIEhldXJpc3RpYyB0byBhdHRlbXB0IHRvIGhhbmRsZSBjb3JydXB0IEpQRUcgaW1hZ2VzIHdpdGggdG9vXG4gICAgICAgICAgICAgIC8vIGxhcmdlIGBzY2FuTGluZXNgIHBhcmFtZXRlciwgYnkgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50bHlcbiAgICAgICAgICAgICAgLy8gcGFyc2VkIG51bWJlciBvZiBzY2FuTGluZXMgd2hlbiBpdCdzIGF0IGxlYXN0IChhcHByb3hpbWF0ZWx5KVxuICAgICAgICAgICAgICAvLyBvbmUgb3JkZXIgb2YgbWFnbml0dWRlIHNtYWxsZXIgdGhhbiBleHBlY3RlZCAoZml4ZXNcbiAgICAgICAgICAgICAgLy8gaXNzdWUxMDg4MC5wZGYgYW5kIGlzc3VlMTA5ODkucGRmKS5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1heWJlU2NhbkxpbmVzID4gMCAmJlxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZnJhbWUuc2NhbkxpbmVzIC8gbWF5YmVTY2FuTGluZXMpID49IDEwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInBvc3NpYmx5IGNhdXNlZCBieSBpbmNvcnJlY3QgYHNjYW5MaW5lc2AgcGFyYW1ldGVyXCIsXG4gICAgICAgICAgICAgICAgICBtYXliZVNjYW5MaW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFT0lNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgXCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXG4gICAgICAgICAgICBgdW5leHBlY3RlZCBtYXJrZXIgJHsoKGJpdHNEYXRhIDw8IDgpIHwgbmV4dEJ5dGUpLnRvU3RyaW5nKDE2KX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1bnN0dWZmIDBcbiAgICAgIH1cbiAgICAgIGJpdHNDb3VudCA9IDc7XG4gICAgICByZXR1cm4gYml0c0RhdGEgPj4+IDc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlSHVmZm1hbih0cmVlKSB7XG4gICAgICB2YXIgbm9kZSA9IHRyZWU7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBub2RlID0gbm9kZVtyZWFkQml0KCldO1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBub2RlKSB7XG4gICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCkge1xuICAgICAgdmFyIG4gPSAwO1xuICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgbiA9IChuIDw8IDEpIHwgcmVhZEJpdCgpO1xuICAgICAgICBsZW5ndGgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQobGVuZ3RoKSB7XG4gICAgICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiByZWFkQml0KCkgPT09IDEgPyAxIDogLTE7XG4gICAgICB9XG4gICAgICB2YXIgbiA9IHJlY2VpdmUobGVuZ3RoKTtcbiAgICAgIGlmIChuID49IDEgPDwgKGxlbmd0aCAtIDEpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gKyAoLTEgPDwgbGVuZ3RoKSArIDE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7XG4gICAgICB2YXIgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KTtcbiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdID0gY29tcG9uZW50LnByZWQgKz0gZGlmZjtcbiAgICAgIHZhciBrID0gMTtcbiAgICAgIHdoaWxlIChrIDwgNjQpIHtcbiAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpO1xuICAgICAgICB2YXIgcyA9IHJzICYgMTUsXG4gICAgICAgICAgciA9IHJzID4+IDQ7XG4gICAgICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGsgKz0gMTY7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgayArPSByO1xuICAgICAgICB2YXIgeiA9IGRjdFppZ1phZ1trXTtcbiAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldCArIHpdID0gcmVjZWl2ZUFuZEV4dGVuZChzKTtcbiAgICAgICAgaysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZURDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7XG4gICAgICB2YXIgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlO1xuICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZURDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7XG4gICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSB8PSByZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZTtcbiAgICB9XG5cbiAgICB2YXIgZW9icnVuID0gMDtcbiAgICBmdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHtcbiAgICAgIGlmIChlb2JydW4gPiAwKSB7XG4gICAgICAgIGVvYnJ1bi0tO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQsXG4gICAgICAgIGUgPSBzcGVjdHJhbEVuZDtcbiAgICAgIHdoaWxlIChrIDw9IGUpIHtcbiAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpO1xuICAgICAgICB2YXIgcyA9IHJzICYgMTUsXG4gICAgICAgICAgciA9IHJzID4+IDQ7XG4gICAgICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpIC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrICs9IDE2O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGsgKz0gcjtcbiAgICAgICAgdmFyIHogPSBkY3RaaWdaYWdba107XG4gICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9XG4gICAgICAgICAgcmVjZWl2ZUFuZEV4dGVuZChzKSAqICgxIDw8IHN1Y2Nlc3NpdmUpO1xuICAgICAgICBrKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMCxcbiAgICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZTtcbiAgICBmdW5jdGlvbiBkZWNvZGVBQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIGsgPSBzcGVjdHJhbFN0YXJ0O1xuICAgICAgdmFyIGUgPSBzcGVjdHJhbEVuZDtcbiAgICAgIHZhciByID0gMDtcbiAgICAgIHZhciBzO1xuICAgICAgdmFyIHJzO1xuICAgICAgd2hpbGUgKGsgPD0gZSkge1xuICAgICAgICBjb25zdCBvZmZzZXRaID0gYmxvY2tPZmZzZXQgKyBkY3RaaWdaYWdba107XG4gICAgICAgIGNvbnN0IHNpZ24gPSBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdIDwgMCA/IC0xIDogMTtcbiAgICAgICAgc3dpdGNoIChzdWNjZXNzaXZlQUNTdGF0ZSkge1xuICAgICAgICAgIGNhc2UgMDogLy8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7XG4gICAgICAgICAgICBzID0gcnMgJiAxNTtcbiAgICAgICAgICAgIHIgPSBycyA+PiA0O1xuICAgICAgICAgICAgaWYgKHMgPT09IDApIHtcbiAgICAgICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKTtcbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgciA9IDE2O1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHMgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiaW52YWxpZCBBQ24gZW5jb2RpbmdcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTtcbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIDE6IC8vIHNraXBwaW5nIHIgemVybyBpdGVtc1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLS07XG4gICAgICAgICAgICAgIGlmIChyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSBzdWNjZXNzaXZlQUNTdGF0ZSA9PT0gMiA/IDMgOiAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6IC8vIHNldCB2YWx1ZSBmb3IgYSB6ZXJvIGl0ZW1cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID1cbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNOZXh0VmFsdWUgPDwgc3VjY2Vzc2l2ZTtcbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OiAvLyBlb2JcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBrKys7XG4gICAgICB9XG4gICAgICBpZiAoc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDQpIHtcbiAgICAgICAgZW9icnVuLS07XG4gICAgICAgIGlmIChlb2JydW4gPT09IDApIHtcbiAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgYmxvY2tSb3cgPSAwO1xuICAgIGZ1bmN0aW9uIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZSwgbWN1LCByb3csIGNvbCkge1xuICAgICAgdmFyIG1jdVJvdyA9IChtY3UgLyBtY3VzUGVyTGluZSkgfCAwO1xuICAgICAgdmFyIG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lO1xuICAgICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdztcbiAgICAgIHZhciBibG9ja0NvbCA9IG1jdUNvbCAqIGNvbXBvbmVudC5oICsgY29sO1xuICAgICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7XG4gICAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGUsIG1jdSkge1xuICAgICAgYmxvY2tSb3cgPSAobWN1IC8gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUpIHwgMDtcbiAgICAgIHZhciBibG9ja0NvbCA9IG1jdSAlIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lO1xuICAgICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7XG4gICAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDtcbiAgICB2YXIgY29tcG9uZW50LCBpLCBqLCBrLCBuO1xuICAgIHZhciBkZWNvZGVGbjtcbiAgICBpZiAocHJvZ3Jlc3NpdmUpIHtcbiAgICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7XG4gICAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7XG4gICAgfVxuXG4gICAgdmFyIG1jdSA9IDAsXG4gICAgICBmaWxlTWFya2VyO1xuICAgIHZhciBtY3VFeHBlY3RlZDtcbiAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkge1xuICAgICAgbWN1RXhwZWN0ZWQgPSBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckxpbmUgKiBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckNvbHVtbjtcbiAgICB9IGVsc2Uge1xuICAgICAgbWN1RXhwZWN0ZWQgPSBtY3VzUGVyTGluZSAqIGZyYW1lLm1jdXNQZXJDb2x1bW47XG4gICAgfVxuXG4gICAgdmFyIGgsIHY7XG4gICAgd2hpbGUgKG1jdSA8PSBtY3VFeHBlY3RlZCkge1xuICAgICAgLy8gcmVzZXQgaW50ZXJ2YWwgc3R1ZmZcbiAgICAgIHZhciBtY3VUb1JlYWQgPSByZXNldEludGVydmFsXG4gICAgICAgID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpXG4gICAgICAgIDogbWN1RXhwZWN0ZWQ7XG5cbiAgICAgIC8vIFRoZSBgbWN1VG9SZWFkID09PSAwYCBjYXNlIHNob3VsZCBvbmx5IG9jY3VyIHdoZW4gYWxsIG9mIHRoZSBleHBlY3RlZFxuICAgICAgLy8gTUNVIGRhdGEgaGFzIGJlZW4gYWxyZWFkeSBwYXJzZWQsIGkuZS4gd2hlbiBgbWN1ID09PSBtY3VFeHBlY3RlZGAsIGJ1dFxuICAgICAgLy8gc29tZSBjb3JydXB0IEpQRUcgaW1hZ2VzIGNvbnRhaW4gbW9yZSBkYXRhIHRoYW4gaW50ZW5kZWQgYW5kIHdlIHRodXNcbiAgICAgIC8vIHdhbnQgdG8gc2tpcCBvdmVyIGFueSBleHRyYSBSU1R4IG1hcmtlcnMgYmVsb3cgKGZpeGVzIGlzc3VlMTE3OTQucGRmKS5cbiAgICAgIGlmIChtY3VUb1JlYWQgPiAwKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb21wb25lbnRzW2ldLnByZWQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVvYnJ1biA9IDA7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzWzBdO1xuICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykge1xuICAgICAgICAgICAgZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1KTtcbiAgICAgICAgICAgIG1jdSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgICAgaCA9IGNvbXBvbmVudC5oO1xuICAgICAgICAgICAgICB2ID0gY29tcG9uZW50LnY7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2OyBqKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1LCBqLCBrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1jdSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaW5kIG1hcmtlclxuICAgICAgYml0c0NvdW50ID0gMDtcbiAgICAgIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgb2Zmc2V0KTtcbiAgICAgIGlmICghZmlsZU1hcmtlcikge1xuICAgICAgICBicmVhazsgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhIHdpdGhvdXQgZmluZGluZyBhbnkgbWFya2VyLlxuICAgICAgfVxuICAgICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkge1xuICAgICAgICAvLyBTb21lIGJhZCBpbWFnZXMgc2VlbSB0byBwYWQgU2NhbiBibG9ja3Mgd2l0aCBlLmcuIHplcm8gYnl0ZXMsIHNraXBcbiAgICAgICAgLy8gcGFzdCB0aG9zZSB0byBhdHRlbXB0IHRvIGZpbmQgYSB2YWxpZCBtYXJrZXIgKGZpeGVzIGlzc3VlNDA5MC5wZGYpLlxuICAgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/IFwidW5leHBlY3RlZFwiIDogXCJleGNlc3NpdmVcIjtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgZGVjb2RlU2NhbiAtICR7cGFydGlhbE1zZ30gTUNVIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAke2ZpbGVNYXJrZXIuaW52YWxpZH1gXG4gICAgICAgICk7XG4gICAgICAgIG9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0O1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNYXJrZXIubWFya2VyID49IDB4ZmZkMCAmJiBmaWxlTWFya2VyLm1hcmtlciA8PSAweGZmZDcpIHtcbiAgICAgICAgLy8gUlNUeFxuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDtcbiAgfVxuXG4gIC8vIEEgcG9ydCBvZiBwb3BwbGVyJ3MgSURDVCBtZXRob2Qgd2hpY2ggaW4gdHVybiBpcyB0YWtlbiBmcm9tOlxuICAvLyAgIENocmlzdG9waCBMb2VmZmxlciwgQWRyaWFhbiBMaWd0ZW5iZXJnLCBHZW9yZ2UgUy4gTW9zY2h5dHosXG4gIC8vICAgJ1ByYWN0aWNhbCBGYXN0IDEtRCBEQ1QgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucycsXG4gIC8vICAgSUVFRSBJbnRsLiBDb25mLiBvbiBBY291c3RpY3MsIFNwZWVjaCAmIFNpZ25hbCBQcm9jZXNzaW5nLCAxOTg5LFxuICAvLyAgIDk4OC05OTEuXG4gIGZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIGJsb2NrQnVmZmVyT2Zmc2V0LCBwKSB7XG4gICAgdmFyIHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLFxuICAgICAgYmxvY2tEYXRhID0gY29tcG9uZW50LmJsb2NrRGF0YTtcbiAgICB2YXIgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3O1xuICAgIHZhciBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDc7XG4gICAgdmFyIHQ7XG5cbiAgICBpZiAoIXF0KSB7XG4gICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuXCIpO1xuICAgIH1cblxuICAgIC8vIGludmVyc2UgRENUIG9uIHJvd3NcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCA2NDsgcm93ICs9IDgpIHtcbiAgICAgIC8vIGdhdGhlciBibG9jayBkYXRhXG4gICAgICBwMCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvd107XG4gICAgICBwMSA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDFdO1xuICAgICAgcDIgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAyXTtcbiAgICAgIHAzID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgM107XG4gICAgICBwNCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDRdO1xuICAgICAgcDUgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA1XTtcbiAgICAgIHA2ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNl07XG4gICAgICBwNyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDddO1xuXG4gICAgICAvLyBkZXF1YW50IHAwXG4gICAgICBwMCAqPSBxdFtyb3ddO1xuXG4gICAgICAvLyBjaGVjayBmb3IgYWxsLXplcm8gQUMgY29lZmZpY2llbnRzXG4gICAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkge1xuICAgICAgICB0ID0gKGRjdFNxcnQyICogcDAgKyA1MTIpID4+IDEwO1xuICAgICAgICBwW3Jvd10gPSB0O1xuICAgICAgICBwW3JvdyArIDFdID0gdDtcbiAgICAgICAgcFtyb3cgKyAyXSA9IHQ7XG4gICAgICAgIHBbcm93ICsgM10gPSB0O1xuICAgICAgICBwW3JvdyArIDRdID0gdDtcbiAgICAgICAgcFtyb3cgKyA1XSA9IHQ7XG4gICAgICAgIHBbcm93ICsgNl0gPSB0O1xuICAgICAgICBwW3JvdyArIDddID0gdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBkZXF1YW50IHAxIC4uLiBwN1xuICAgICAgcDEgKj0gcXRbcm93ICsgMV07XG4gICAgICBwMiAqPSBxdFtyb3cgKyAyXTtcbiAgICAgIHAzICo9IHF0W3JvdyArIDNdO1xuICAgICAgcDQgKj0gcXRbcm93ICsgNF07XG4gICAgICBwNSAqPSBxdFtyb3cgKyA1XTtcbiAgICAgIHA2ICo9IHF0W3JvdyArIDZdO1xuICAgICAgcDcgKj0gcXRbcm93ICsgN107XG5cbiAgICAgIC8vIHN0YWdlIDRcbiAgICAgIHYwID0gKGRjdFNxcnQyICogcDAgKyAxMjgpID4+IDg7XG4gICAgICB2MSA9IChkY3RTcXJ0MiAqIHA0ICsgMTI4KSA+PiA4O1xuICAgICAgdjIgPSBwMjtcbiAgICAgIHYzID0gcDY7XG4gICAgICB2NCA9IChkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMTI4KSA+PiA4O1xuICAgICAgdjcgPSAoZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDEyOCkgPj4gODtcbiAgICAgIHY1ID0gcDMgPDwgNDtcbiAgICAgIHY2ID0gcDUgPDwgNDtcblxuICAgICAgLy8gc3RhZ2UgM1xuICAgICAgdjAgPSAodjAgKyB2MSArIDEpID4+IDE7XG4gICAgICB2MSA9IHYwIC0gdjE7XG4gICAgICB0ID0gKHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDEyOCkgPj4gODtcbiAgICAgIHYyID0gKHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDEyOCkgPj4gODtcbiAgICAgIHYzID0gdDtcbiAgICAgIHY0ID0gKHY0ICsgdjYgKyAxKSA+PiAxO1xuICAgICAgdjYgPSB2NCAtIHY2O1xuICAgICAgdjcgPSAodjcgKyB2NSArIDEpID4+IDE7XG4gICAgICB2NSA9IHY3IC0gdjU7XG5cbiAgICAgIC8vIHN0YWdlIDJcbiAgICAgIHYwID0gKHYwICsgdjMgKyAxKSA+PiAxO1xuICAgICAgdjMgPSB2MCAtIHYzO1xuICAgICAgdjEgPSAodjEgKyB2MiArIDEpID4+IDE7XG4gICAgICB2MiA9IHYxIC0gdjI7XG4gICAgICB0ID0gKHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDgpID4+IDEyO1xuICAgICAgdjQgPSAodjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NyA9IHQ7XG4gICAgICB0ID0gKHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDgpID4+IDEyO1xuICAgICAgdjUgPSAodjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NiA9IHQ7XG5cbiAgICAgIC8vIHN0YWdlIDFcbiAgICAgIHBbcm93XSA9IHYwICsgdjc7XG4gICAgICBwW3JvdyArIDddID0gdjAgLSB2NztcbiAgICAgIHBbcm93ICsgMV0gPSB2MSArIHY2O1xuICAgICAgcFtyb3cgKyA2XSA9IHYxIC0gdjY7XG4gICAgICBwW3JvdyArIDJdID0gdjIgKyB2NTtcbiAgICAgIHBbcm93ICsgNV0gPSB2MiAtIHY1O1xuICAgICAgcFtyb3cgKyAzXSA9IHYzICsgdjQ7XG4gICAgICBwW3JvdyArIDRdID0gdjMgLSB2NDtcbiAgICB9XG5cbiAgICAvLyBpbnZlcnNlIERDVCBvbiBjb2x1bW5zXG4gICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgODsgKytjb2wpIHtcbiAgICAgIHAwID0gcFtjb2xdO1xuICAgICAgcDEgPSBwW2NvbCArIDhdO1xuICAgICAgcDIgPSBwW2NvbCArIDE2XTtcbiAgICAgIHAzID0gcFtjb2wgKyAyNF07XG4gICAgICBwNCA9IHBbY29sICsgMzJdO1xuICAgICAgcDUgPSBwW2NvbCArIDQwXTtcbiAgICAgIHA2ID0gcFtjb2wgKyA0OF07XG4gICAgICBwNyA9IHBbY29sICsgNTZdO1xuXG4gICAgICAvLyBjaGVjayBmb3IgYWxsLXplcm8gQUMgY29lZmZpY2llbnRzXG4gICAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkge1xuICAgICAgICB0ID0gKGRjdFNxcnQyICogcDAgKyA4MTkyKSA+PiAxNDtcbiAgICAgICAgLy8gQ29udmVydCB0byA4LWJpdC5cbiAgICAgICAgaWYgKHQgPCAtMjA0MCkge1xuICAgICAgICAgIHQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPj0gMjAyNCkge1xuICAgICAgICAgIHQgPSAyNTU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdCA9ICh0ICsgMjA1NikgPj4gNDtcbiAgICAgICAgfVxuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSB0O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RhZ2UgNFxuICAgICAgdjAgPSAoZGN0U3FydDIgKiBwMCArIDIwNDgpID4+IDEyO1xuICAgICAgdjEgPSAoZGN0U3FydDIgKiBwNCArIDIwNDgpID4+IDEyO1xuICAgICAgdjIgPSBwMjtcbiAgICAgIHYzID0gcDY7XG4gICAgICB2NCA9IChkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NyA9IChkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NSA9IHAzO1xuICAgICAgdjYgPSBwNTtcblxuICAgICAgLy8gc3RhZ2UgM1xuICAgICAgLy8gU2hpZnQgdjAgYnkgMTI4LjUgPDwgNSBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHNoaWZ0IHAwLi4ucDcgd2hlblxuICAgICAgLy8gY29udmVydGluZyB0byBVSW50OCByYW5nZSBsYXRlci5cbiAgICAgIHYwID0gKCh2MCArIHYxICsgMSkgPj4gMSkgKyA0MTEyO1xuICAgICAgdjEgPSB2MCAtIHYxO1xuICAgICAgdCA9ICh2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHYyID0gKHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDIwNDgpID4+IDEyO1xuICAgICAgdjMgPSB0O1xuICAgICAgdjQgPSAodjQgKyB2NiArIDEpID4+IDE7XG4gICAgICB2NiA9IHY0IC0gdjY7XG4gICAgICB2NyA9ICh2NyArIHY1ICsgMSkgPj4gMTtcbiAgICAgIHY1ID0gdjcgLSB2NTtcblxuICAgICAgLy8gc3RhZ2UgMlxuICAgICAgdjAgPSAodjAgKyB2MyArIDEpID4+IDE7XG4gICAgICB2MyA9IHYwIC0gdjM7XG4gICAgICB2MSA9ICh2MSArIHYyICsgMSkgPj4gMTtcbiAgICAgIHYyID0gdjEgLSB2MjtcbiAgICAgIHQgPSAodjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NCA9ICh2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHY3ID0gdDtcbiAgICAgIHQgPSAodjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NSA9ICh2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHY2ID0gdDtcblxuICAgICAgLy8gc3RhZ2UgMVxuICAgICAgcDAgPSB2MCArIHY3O1xuICAgICAgcDcgPSB2MCAtIHY3O1xuICAgICAgcDEgPSB2MSArIHY2O1xuICAgICAgcDYgPSB2MSAtIHY2O1xuICAgICAgcDIgPSB2MiArIHY1O1xuICAgICAgcDUgPSB2MiAtIHY1O1xuICAgICAgcDMgPSB2MyArIHY0O1xuICAgICAgcDQgPSB2MyAtIHY0O1xuXG4gICAgICAvLyBDb252ZXJ0IHRvIDgtYml0IGludGVnZXJzLlxuICAgICAgaWYgKHAwIDwgMTYpIHtcbiAgICAgICAgcDAgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwMCA+PSA0MDgwKSB7XG4gICAgICAgIHAwID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDAgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDEgPCAxNikge1xuICAgICAgICBwMSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHAxID49IDQwODApIHtcbiAgICAgICAgcDEgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwMSA+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmIChwMiA8IDE2KSB7XG4gICAgICAgIHAyID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDIgPj0gNDA4MCkge1xuICAgICAgICBwMiA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAyID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHAzIDwgMTYpIHtcbiAgICAgICAgcDMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwMyA+PSA0MDgwKSB7XG4gICAgICAgIHAzID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDMgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDQgPCAxNikge1xuICAgICAgICBwNCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHA0ID49IDQwODApIHtcbiAgICAgICAgcDQgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwNCA+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmIChwNSA8IDE2KSB7XG4gICAgICAgIHA1ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDUgPj0gNDA4MCkge1xuICAgICAgICBwNSA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHA1ID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHA2IDwgMTYpIHtcbiAgICAgICAgcDYgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwNiA+PSA0MDgwKSB7XG4gICAgICAgIHA2ID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDYgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDcgPCAxNikge1xuICAgICAgICBwNyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHA3ID49IDQwODApIHtcbiAgICAgICAgcDcgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwNyA+Pj0gNDtcbiAgICAgIH1cblxuICAgICAgLy8gc3RvcmUgYmxvY2sgZGF0YVxuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHAwO1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSBwMTtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDE2XSA9IHAyO1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gcDM7XG4gICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSBwNDtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQwXSA9IHA1O1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gcDY7XG4gICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSBwNztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCkge1xuICAgIHZhciBibG9ja3NQZXJMaW5lID0gY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7XG4gICAgdmFyIGJsb2Nrc1BlckNvbHVtbiA9IGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW47XG4gICAgdmFyIGNvbXB1dGF0aW9uQnVmZmVyID0gbmV3IEludDE2QXJyYXkoNjQpO1xuXG4gICAgZm9yICh2YXIgYmxvY2tSb3cgPSAwOyBibG9ja1JvdyA8IGJsb2Nrc1BlckNvbHVtbjsgYmxvY2tSb3crKykge1xuICAgICAgZm9yICh2YXIgYmxvY2tDb2wgPSAwOyBibG9ja0NvbCA8IGJsb2Nrc1BlckxpbmU7IGJsb2NrQ29sKyspIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTtcbiAgICAgICAgcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgb2Zmc2V0LCBjb21wdXRhdGlvbkJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGN1cnJlbnRQb3MsIHN0YXJ0UG9zID0gY3VycmVudFBvcykge1xuICAgIGNvbnN0IG1heFBvcyA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICB2YXIgbmV3UG9zID0gc3RhcnRQb3MgPCBjdXJyZW50UG9zID8gc3RhcnRQb3MgOiBjdXJyZW50UG9zO1xuXG4gICAgaWYgKGN1cnJlbnRQb3MgPj0gbWF4UG9zKSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gRG9uJ3QgYXR0ZW1wdCB0byByZWFkIG5vbi1leGlzdGVudCBkYXRhIGFuZCBqdXN0IHJldHVybi5cbiAgICB9XG4gICAgdmFyIGN1cnJlbnRNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIGN1cnJlbnRQb3MpO1xuICAgIGlmIChjdXJyZW50TWFya2VyID49IDB4ZmZjMCAmJiBjdXJyZW50TWFya2VyIDw9IDB4ZmZmZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW52YWxpZDogbnVsbCxcbiAgICAgICAgbWFya2VyOiBjdXJyZW50TWFya2VyLFxuICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQb3MsXG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgbmV3TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBuZXdQb3MpO1xuICAgIHdoaWxlICghKG5ld01hcmtlciA+PSAweGZmYzAgJiYgbmV3TWFya2VyIDw9IDB4ZmZmZSkpIHtcbiAgICAgIGlmICgrK25ld1BvcyA+PSBtYXhQb3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIERvbid0IGF0dGVtcHQgdG8gcmVhZCBub24tZXhpc3RlbnQgZGF0YSBhbmQganVzdCByZXR1cm4uXG4gICAgICB9XG4gICAgICBuZXdNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG5ld1Bvcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpbnZhbGlkOiBjdXJyZW50TWFya2VyLnRvU3RyaW5nKDE2KSxcbiAgICAgIG1hcmtlcjogbmV3TWFya2VyLFxuICAgICAgb2Zmc2V0OiBuZXdQb3MsXG4gICAgfTtcbiAgfVxuXG4gIEpwZWdJbWFnZS5wcm90b3R5cGUgPSB7XG4gICAgcGFyc2UoZGF0YSwgeyBkbmxTY2FuTGluZXMgPSBudWxsIH0gPSB7fSkge1xuICAgICAgZnVuY3Rpb24gcmVhZERhdGFCbG9jaygpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgbGV0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7XG5cbiAgICAgICAgdmFyIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgZW5kT2Zmc2V0LCBvZmZzZXQpO1xuICAgICAgICBpZiAoZmlsZU1hcmtlciAmJiBmaWxlTWFya2VyLmludmFsaWQpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJyZWFkRGF0YUJsb2NrIC0gaW5jb3JyZWN0IGxlbmd0aCwgY3VycmVudCBtYXJrZXIgaXM6IFwiICtcbiAgICAgICAgICAgICAgZmlsZU1hcmtlci5pbnZhbGlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbmRPZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhcnJheSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBlbmRPZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7XG4gICAgICAgIHZhciBtY3VzUGVyTGluZSA9IE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDggLyBmcmFtZS5tYXhIKTtcbiAgICAgICAgdmFyIG1jdXNQZXJDb2x1bW4gPSBNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCAvIGZyYW1lLm1heFYpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgIHZhciBibG9ja3NQZXJMaW5lID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDgpICogY29tcG9uZW50LmgpIC8gZnJhbWUubWF4SFxuICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbiA9IE1hdGguY2VpbChcbiAgICAgICAgICAgIChNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCkgKiBjb21wb25lbnQudikgLyBmcmFtZS5tYXhWXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgYmxvY2tzUGVyTGluZUZvck1jdSA9IG1jdXNQZXJMaW5lICogY29tcG9uZW50Lmg7XG4gICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbkZvck1jdSA9IG1jdXNQZXJDb2x1bW4gKiBjb21wb25lbnQudjtcblxuICAgICAgICAgIHZhciBibG9ja3NCdWZmZXJTaXplID1cbiAgICAgICAgICAgIDY0ICogYmxvY2tzUGVyQ29sdW1uRm9yTWN1ICogKGJsb2Nrc1BlckxpbmVGb3JNY3UgKyAxKTtcbiAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhID0gbmV3IEludDE2QXJyYXkoYmxvY2tzQnVmZmVyU2l6ZSk7XG4gICAgICAgICAgY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgPSBibG9ja3NQZXJMaW5lO1xuICAgICAgICAgIGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4gPSBibG9ja3NQZXJDb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUubWN1c1BlckxpbmUgPSBtY3VzUGVyTGluZTtcbiAgICAgICAgZnJhbWUubWN1c1BlckNvbHVtbiA9IG1jdXNQZXJDb2x1bW47XG4gICAgICB9XG5cbiAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgdmFyIGpmaWYgPSBudWxsO1xuICAgICAgdmFyIGFkb2JlID0gbnVsbDtcbiAgICAgIHZhciBmcmFtZSwgcmVzZXRJbnRlcnZhbDtcbiAgICAgIGxldCBudW1TT1NNYXJrZXJzID0gMDtcbiAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTtcbiAgICAgIHZhciBodWZmbWFuVGFibGVzQUMgPSBbXSxcbiAgICAgICAgaHVmZm1hblRhYmxlc0RDID0gW107XG5cbiAgICAgIGxldCBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICBpZiAoZmlsZU1hcmtlciAhPT0gLyogU09JIChTdGFydCBvZiBJbWFnZSkgPSAqLyAweGZmZDgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcIlNPSSBub3QgZm91bmRcIik7XG4gICAgICB9XG4gICAgICBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG5cbiAgICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAvKiBFT0kgKEVuZCBvZiBJbWFnZSkgPSAqLyAweGZmZDkpIHtcbiAgICAgICAgdmFyIGksIGosIGw7XG4gICAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikge1xuICAgICAgICAgIGNhc2UgMHhmZmUwOiAvLyBBUFAwIChBcHBsaWNhdGlvbiBTcGVjaWZpYylcbiAgICAgICAgICBjYXNlIDB4ZmZlMTogLy8gQVBQMVxuICAgICAgICAgIGNhc2UgMHhmZmUyOiAvLyBBUFAyXG4gICAgICAgICAgY2FzZSAweGZmZTM6IC8vIEFQUDNcbiAgICAgICAgICBjYXNlIDB4ZmZlNDogLy8gQVBQNFxuICAgICAgICAgIGNhc2UgMHhmZmU1OiAvLyBBUFA1XG4gICAgICAgICAgY2FzZSAweGZmZTY6IC8vIEFQUDZcbiAgICAgICAgICBjYXNlIDB4ZmZlNzogLy8gQVBQN1xuICAgICAgICAgIGNhc2UgMHhmZmU4OiAvLyBBUFA4XG4gICAgICAgICAgY2FzZSAweGZmZTk6IC8vIEFQUDlcbiAgICAgICAgICBjYXNlIDB4ZmZlYTogLy8gQVBQMTBcbiAgICAgICAgICBjYXNlIDB4ZmZlYjogLy8gQVBQMTFcbiAgICAgICAgICBjYXNlIDB4ZmZlYzogLy8gQVBQMTJcbiAgICAgICAgICBjYXNlIDB4ZmZlZDogLy8gQVBQMTNcbiAgICAgICAgICBjYXNlIDB4ZmZlZTogLy8gQVBQMTRcbiAgICAgICAgICBjYXNlIDB4ZmZlZjogLy8gQVBQMTVcbiAgICAgICAgICBjYXNlIDB4ZmZmZTogLy8gQ09NIChDb21tZW50KVxuICAgICAgICAgICAgdmFyIGFwcERhdGEgPSByZWFkRGF0YUJsb2NrKCk7XG5cbiAgICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZTApIHtcbiAgICAgICAgICAgICAgLy8gJ0pGSUZcXHgwMCdcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFwcERhdGFbMF0gPT09IDB4NGEgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzFdID09PSAweDQ2ICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVsyXSA9PT0gMHg0OSAmJlxuICAgICAgICAgICAgICAgIGFwcERhdGFbM10gPT09IDB4NDYgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzRdID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGpmaWYgPSB7XG4gICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB7IG1ham9yOiBhcHBEYXRhWzVdLCBtaW5vcjogYXBwRGF0YVs2XSB9LFxuICAgICAgICAgICAgICAgICAgZGVuc2l0eVVuaXRzOiBhcHBEYXRhWzddLFxuICAgICAgICAgICAgICAgICAgeERlbnNpdHk6IChhcHBEYXRhWzhdIDw8IDgpIHwgYXBwRGF0YVs5XSxcbiAgICAgICAgICAgICAgICAgIHlEZW5zaXR5OiAoYXBwRGF0YVsxMF0gPDwgOCkgfCBhcHBEYXRhWzExXSxcbiAgICAgICAgICAgICAgICAgIHRodW1iV2lkdGg6IGFwcERhdGFbMTJdLFxuICAgICAgICAgICAgICAgICAgdGh1bWJIZWlnaHQ6IGFwcERhdGFbMTNdLFxuICAgICAgICAgICAgICAgICAgdGh1bWJEYXRhOiBhcHBEYXRhLnN1YmFycmF5KFxuICAgICAgICAgICAgICAgICAgICAxNCxcbiAgICAgICAgICAgICAgICAgICAgMTQgKyAzICogYXBwRGF0YVsxMl0gKiBhcHBEYXRhWzEzXVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPIEFQUDEgLSBFeGlmXG4gICAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmVlKSB7XG4gICAgICAgICAgICAgIC8vICdBZG9iZSdcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFwcERhdGFbMF0gPT09IDB4NDEgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzFdID09PSAweDY0ICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVsyXSA9PT0gMHg2ZiAmJlxuICAgICAgICAgICAgICAgIGFwcERhdGFbM10gPT09IDB4NjIgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzRdID09PSAweDY1XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFkb2JlID0ge1xuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogKGFwcERhdGFbNV0gPDwgOCkgfCBhcHBEYXRhWzZdLFxuICAgICAgICAgICAgICAgICAgZmxhZ3MwOiAoYXBwRGF0YVs3XSA8PCA4KSB8IGFwcERhdGFbOF0sXG4gICAgICAgICAgICAgICAgICBmbGFnczE6IChhcHBEYXRhWzldIDw8IDgpIHwgYXBwRGF0YVsxMF0sXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1Db2RlOiBhcHBEYXRhWzExXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRiOiAvLyBEUVQgKERlZmluZSBRdWFudGl6YXRpb24gVGFibGVzKVxuICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVzRW5kID0gcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoICsgb2Zmc2V0IC0gMjtcbiAgICAgICAgICAgIHZhciB6O1xuICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHF1YW50aXphdGlvblRhYmxlc0VuZCkge1xuICAgICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciB0YWJsZURhdGEgPSBuZXcgVWludDE2QXJyYXkoNjQpO1xuICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyA4IGJpdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTtcbiAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIDE2IGJpdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTtcbiAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiRFFUIC0gaW52YWxpZCB0YWJsZSBzcGVjXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlc1txdWFudGl6YXRpb25UYWJsZVNwZWMgJiAxNV0gPSB0YWJsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmMwOiAvLyBTT0YwIChTdGFydCBvZiBGcmFtZSwgQmFzZWxpbmUgRENUKVxuICAgICAgICAgIGNhc2UgMHhmZmMxOiAvLyBTT0YxIChTdGFydCBvZiBGcmFtZSwgRXh0ZW5kZWQgRENUKVxuICAgICAgICAgIGNhc2UgMHhmZmMyOiAvLyBTT0YyIChTdGFydCBvZiBGcmFtZSwgUHJvZ3Jlc3NpdmUgRENUKVxuICAgICAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXCJPbmx5IHNpbmdsZSBmcmFtZSBKUEVHcyBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICBmcmFtZSA9IHt9O1xuICAgICAgICAgICAgZnJhbWUuZXh0ZW5kZWQgPSBmaWxlTWFya2VyID09PSAweGZmYzE7XG4gICAgICAgICAgICBmcmFtZS5wcm9ncmVzc2l2ZSA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMjtcbiAgICAgICAgICAgIGZyYW1lLnByZWNpc2lvbiA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgY29uc3Qgc29mU2NhbkxpbmVzID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBmcmFtZS5zY2FuTGluZXMgPSBkbmxTY2FuTGluZXMgfHwgc29mU2NhbkxpbmVzO1xuICAgICAgICAgICAgZnJhbWUuc2FtcGxlc1BlckxpbmUgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkcyA9IHt9O1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IGRhdGFbb2Zmc2V0KytdLFxuICAgICAgICAgICAgICBjb21wb25lbnRJZDtcbiAgICAgICAgICAgIHZhciBtYXhIID0gMCxcbiAgICAgICAgICAgICAgbWF4ViA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgIHZhciBoID0gZGF0YVtvZmZzZXQgKyAxXSA+PiA0O1xuICAgICAgICAgICAgICB2YXIgdiA9IGRhdGFbb2Zmc2V0ICsgMV0gJiAxNTtcbiAgICAgICAgICAgICAgaWYgKG1heEggPCBoKSB7XG4gICAgICAgICAgICAgICAgbWF4SCA9IGg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG1heFYgPCB2KSB7XG4gICAgICAgICAgICAgICAgbWF4ViA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07XG4gICAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGgsXG4gICAgICAgICAgICAgICAgdixcbiAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLFxuICAgICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsLCAvLyBTZWUgY29tbWVudCBiZWxvdy5cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkc1tjb21wb25lbnRJZF0gPSBsIC0gMTtcbiAgICAgICAgICAgICAgb2Zmc2V0ICs9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcmFtZS5tYXhIID0gbWF4SDtcbiAgICAgICAgICAgIGZyYW1lLm1heFYgPSBtYXhWO1xuICAgICAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZjNDogLy8gREhUIChEZWZpbmUgSHVmZm1hbiBUYWJsZXMpXG4gICAgICAgICAgICBjb25zdCBodWZmbWFuTGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgaHVmZm1hbkxlbmd0aDsgKSB7XG4gICAgICAgICAgICAgIHZhciBodWZmbWFuVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgICAgICAgdmFyIGNvZGVMZW5ndGhTdW0gPSAwO1xuICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKywgb2Zmc2V0KyspIHtcbiAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoU3VtICs9IGNvZGVMZW5ndGhzW2pdID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3RoU3VtOyBqKyssIG9mZnNldCsrKSB7XG4gICAgICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTtcblxuICAgICAgICAgICAgICAoaHVmZm1hblRhYmxlU3BlYyA+PiA0ID09PSAwID8gaHVmZm1hblRhYmxlc0RDIDogaHVmZm1hblRhYmxlc0FDKVtcbiAgICAgICAgICAgICAgICBodWZmbWFuVGFibGVTcGVjICYgMTVcbiAgICAgICAgICAgICAgXSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAweGZmZGQ6IC8vIERSSSAoRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwpXG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICByZXNldEludGVydmFsID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRhOiAvLyBTT1MgKFN0YXJ0IG9mIFNjYW4pXG4gICAgICAgICAgICAvLyBBIEROTCBtYXJrZXIgKDB4RkZEQyksIGlmIGl0IGV4aXN0cywgaXMgb25seSBhbGxvd2VkIGF0IHRoZSBlbmRcbiAgICAgICAgICAgIC8vIG9mIHRoZSBmaXJzdCBzY2FuIHNlZ21lbnQgYW5kIG1heSBvbmx5IG9jY3VyIG9uY2UgaW4gYW4gaW1hZ2UuXG4gICAgICAgICAgICAvLyBGdXJ0aGVybW9yZSwgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLCBkbyAqbm90KiBhdHRlbXB0IHRvXG4gICAgICAgICAgICAvLyBwYXJzZSBETkwgbWFya2VycyBkdXJpbmcgcmUtcGFyc2luZyBvZiB0aGUgSlBFRyBzY2FuIGRhdGEuXG4gICAgICAgICAgICBjb25zdCBwYXJzZUROTE1hcmtlciA9ICsrbnVtU09TTWFya2VycyA9PT0gMSAmJiAhZG5sU2NhbkxpbmVzO1xuXG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JzQ291bnQgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnRzID0gW10sXG4gICAgICAgICAgICAgIGNvbXBvbmVudDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciBjb21wb25lbnRJbmRleCA9IGZyYW1lLmNvbXBvbmVudElkc1tpbmRleF07XG4gICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbY29tcG9uZW50SW5kZXhdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgdmFyIHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlREMgPSBodWZmbWFuVGFibGVzRENbdGFibGVTcGVjID4+IDRdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlQUMgPSBodWZmbWFuVGFibGVzQUNbdGFibGVTcGVjICYgMTVdO1xuICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzcGVjdHJhbFN0YXJ0ID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICB2YXIgc3BlY3RyYWxFbmQgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgIHZhciBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmFyIHByb2Nlc3NlZCA9IGRlY29kZVNjYW4oXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICAgICAgZnJhbWUsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgICAgICAgICByZXNldEludGVydmFsLFxuICAgICAgICAgICAgICAgIHNwZWN0cmFsU3RhcnQsXG4gICAgICAgICAgICAgICAgc3BlY3RyYWxFbmQsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPj4gNCxcbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LFxuICAgICAgICAgICAgICAgIHBhcnNlRE5MTWFya2VyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikge1xuICAgICAgICAgICAgICAgIHdhcm4oYCR7ZXgubWVzc2FnZX0gLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShkYXRhLCB7IGRubFNjYW5MaW5lczogZXguc2NhbkxpbmVzIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRU9JTWFya2VyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB3YXJuKGAke2V4Lm1lc3NhZ2V9IC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLmApO1xuICAgICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRjOiAvLyBETkwgKERlZmluZSBOdW1iZXIgb2YgTGluZXMpXG4gICAgICAgICAgICAvLyBJZ25vcmUgdGhlIG1hcmtlciwgc2luY2UgaXQncyBiZWluZyBoYW5kbGVkIGluIGBkZWNvZGVTY2FuYC5cbiAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZmZjogLy8gRmlsbCBieXRlc1xuICAgICAgICAgICAgaWYgKGRhdGFbb2Zmc2V0XSAhPT0gMHhmZikge1xuICAgICAgICAgICAgICAvLyBBdm9pZCBza2lwcGluZyBhIHZhbGlkIG1hcmtlci5cbiAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBDb3VsZCBiZSBpbmNvcnJlY3QgZW5jb2RpbmcgLS0gdGhlIGxhc3QgMHhGRiBieXRlIG9mIHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgLy8gYmxvY2sgY291bGQgaGF2ZSBiZWVuIGVhdGVuIGJ5IHRoZSBlbmNvZGVyLCBoZW5jZSB3ZSBmYWxsYmFjayB0b1xuICAgICAgICAgICAgLy8gYHN0YXJ0UG9zID0gb2Zmc2V0IC0gM2Agd2hlbiBsb29raW5nIGZvciB0aGUgbmV4dCB2YWxpZCBtYXJrZXIuXG4gICAgICAgICAgICBjb25zdCBuZXh0RmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgLyogY3VycmVudFBvcyA9ICovIG9mZnNldCAtIDIsXG4gICAgICAgICAgICAgIC8qIHN0YXJ0UG9zID0gKi8gb2Zmc2V0IC0gM1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChuZXh0RmlsZU1hcmtlciAmJiBuZXh0RmlsZU1hcmtlci5pbnZhbGlkKSB7XG4gICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgXCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiBcIiArXG4gICAgICAgICAgICAgICAgICBuZXh0RmlsZU1hcmtlci5pbnZhbGlkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG9mZnNldCA9IG5leHRGaWxlTWFya2VyLm9mZnNldDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID49IGRhdGEubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhIFwiICtcbiAgICAgICAgICAgICAgICAgIFwid2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWsgbWFya2VyTG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXG4gICAgICAgICAgICAgIFwiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6IFwiICsgZmlsZU1hcmtlci50b1N0cmluZygxNilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2lkdGggPSBmcmFtZS5zYW1wbGVzUGVyTGluZTtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gZnJhbWUuc2NhbkxpbmVzO1xuICAgICAgdGhpcy5qZmlmID0gamZpZjtcbiAgICAgIHRoaXMuYWRvYmUgPSBhZG9iZTtcbiAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tpXTtcblxuICAgICAgICAvLyBQcmV2ZW50IGVycm9ycyB3aGVuIERRVCBtYXJrZXJzIGFyZSBwbGFjZWQgYWZ0ZXIgU09Ge259IG1hcmtlcnMsXG4gICAgICAgIC8vIGJ5IGFzc2lnbmluZyB0aGUgYHF1YW50aXphdGlvblRhYmxlYCBlbnRyeSBhZnRlciB0aGUgZW50aXJlIGltYWdlXG4gICAgICAgIC8vIGhhcyBiZWVuIHBhcnNlZCAoZml4ZXMgaXNzdWU3NDA2LnBkZikuXG4gICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlc1tjb21wb25lbnQucXVhbnRpemF0aW9uSWRdO1xuICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGUpIHtcbiAgICAgICAgICBjb21wb25lbnQucXVhbnRpemF0aW9uVGFibGUgPSBxdWFudGl6YXRpb25UYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogY29tcG9uZW50LmluZGV4LFxuICAgICAgICAgIG91dHB1dDogYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpLFxuICAgICAgICAgIHNjYWxlWDogY29tcG9uZW50LmggLyBmcmFtZS5tYXhILFxuICAgICAgICAgIHNjYWxlWTogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWLFxuICAgICAgICAgIGJsb2Nrc1BlckxpbmU6IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lLFxuICAgICAgICAgIGJsb2Nrc1BlckNvbHVtbjogY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLm51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCwgaXNTb3VyY2VQREYgPSBmYWxzZSkge1xuICAgICAgdmFyIHNjYWxlWCA9IHRoaXMud2lkdGggLyB3aWR0aCxcbiAgICAgICAgc2NhbGVZID0gdGhpcy5oZWlnaHQgLyBoZWlnaHQ7XG5cbiAgICAgIHZhciBjb21wb25lbnQsIGNvbXBvbmVudFNjYWxlWCwgY29tcG9uZW50U2NhbGVZLCBibG9ja3NQZXJTY2FubGluZTtcbiAgICAgIHZhciB4LCB5LCBpLCBqLCBrO1xuICAgICAgdmFyIGluZGV4O1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICB2YXIgb3V0cHV0O1xuICAgICAgdmFyIG51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgdmFyIGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7XG4gICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoKTtcbiAgICAgIHZhciB4U2NhbGVCbG9ja09mZnNldCA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCk7XG4gICAgICB2YXIgbWFzazNMU0IgPSAweGZmZmZmZmY4OyAvLyB1c2VkIHRvIGNsZWFyIHRoZSAzIExTQnNcbiAgICAgIGxldCBsYXN0Q29tcG9uZW50U2NhbGVYO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7XG4gICAgICAgIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpXTtcbiAgICAgICAgY29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50LnNjYWxlWCAqIHNjYWxlWDtcbiAgICAgICAgY29tcG9uZW50U2NhbGVZID0gY29tcG9uZW50LnNjYWxlWSAqIHNjYWxlWTtcbiAgICAgICAgb2Zmc2V0ID0gaTtcbiAgICAgICAgb3V0cHV0ID0gY29tcG9uZW50Lm91dHB1dDtcbiAgICAgICAgYmxvY2tzUGVyU2NhbmxpbmUgPSAoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSA8PCAzO1xuICAgICAgICAvLyBQcmVjYWxjdWxhdGUgdGhlIGB4U2NhbGVCbG9ja09mZnNldGAuIFNpbmNlIGl0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgZGF0YSwgdGhhdCdzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYGNvbXBvbmVudFNjYWxlWGAgY2hhbmdlcy5cbiAgICAgICAgaWYgKGNvbXBvbmVudFNjYWxlWCAhPT0gbGFzdENvbXBvbmVudFNjYWxlWCkge1xuICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBqID0gMCB8ICh4ICogY29tcG9uZW50U2NhbGVYKTtcbiAgICAgICAgICAgIHhTY2FsZUJsb2NrT2Zmc2V0W3hdID0gKChqICYgbWFzazNMU0IpIDw8IDMpIHwgKGogJiA3KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDtcbiAgICAgICAgfVxuICAgICAgICAvLyBsaW5lYXJpemUgdGhlIGJsb2NrcyBvZiB0aGUgY29tcG9uZW50XG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICAgIGogPSAwIHwgKHkgKiBjb21wb25lbnRTY2FsZVkpO1xuICAgICAgICAgIGluZGV4ID0gKGJsb2Nrc1BlclNjYW5saW5lICogKGogJiBtYXNrM0xTQikpIHwgKChqICYgNykgPDwgMyk7XG4gICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9IG91dHB1dFtpbmRleCArIHhTY2FsZUJsb2NrT2Zmc2V0W3hdXTtcbiAgICAgICAgICAgIG9mZnNldCArPSBudW1Db21wb25lbnRzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkZWNvZGVUcmFuc2Zvcm0gY29udGFpbnMgcGFpcnMgb2YgbXVsdGlwbGllciAoLTI1Ni4uMjU2KSBhbmQgYWRkaXRpdmVcbiAgICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07XG5cbiAgICAgIC8vIEluIFBERiBmaWxlcywgSlBFRyBpbWFnZXMgd2l0aCBDTVlLIGNvbG91ciBzcGFjZXMgYXJlIHVzdWFsbHkgaW52ZXJ0ZWRcbiAgICAgIC8vICh0aGlzIGNhbiBiZSBvYnNlcnZlZCBieSBleHRyYWN0aW5nIHRoZSByYXcgaW1hZ2UgZGF0YSkuXG4gICAgICAvLyBTaW5jZSB0aGUgY29udmVyc2lvbiBhbGdvcml0aG1zIChzZWUgYmVsb3cpIHdlcmUgd3JpdHRlbiBwcmltYXJpbHkgZm9yXG4gICAgICAvLyB0aGUgUERGIHVzZS1jYXNlcywgYXR0ZW1wdGluZyB0byB1c2UgYEpwZWdJbWFnZWAgdG8gcGFyc2Ugc3RhbmRhbG9uZVxuICAgICAgLy8gSlBFRyAoQ01ZSykgaW1hZ2VzIG1heSB0aHVzIHJlc3VsdCBpbiBpbnZlcnRlZCBpbWFnZXMgKHNlZSBpc3N1ZSA5NTEzKS5cbiAgICAgIC8vXG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0J3Mgbm90IChhbHdheXMpIHBvc3NpYmxlIHRvIHRlbGwsIGZyb20gdGhlIGltYWdlIGRhdGFcbiAgICAgIC8vIGFsb25lLCBpZiBpdCBuZWVkcyB0byBiZSBpbnZlcnRlZC4gVGh1cyBpbiBhbiBhdHRlbXB0IHRvIHByb3ZpZGUgYmV0dGVyXG4gICAgICAvLyBvdXQtb2YtYm94IGJlaGF2aW91ciB3aGVuIGBKcGVnSW1hZ2VgIGlzIHVzZWQgc3RhbmRhbG9uZSwgZGVmYXVsdCB0b1xuICAgICAgLy8gaW52ZXJ0aW5nIEpQRUcgKENNWUspIGltYWdlcyBpZiBhbmQgb25seSBpZiB0aGUgaW1hZ2UgZGF0YSBkb2VzICpub3QqXG4gICAgICAvLyBjb21lIGZyb20gYSBQREYgZmlsZSBhbmQgbm8gYGRlY29kZVRyYW5zZm9ybWAgd2FzIHBhc3NlZCBieSB0aGUgdXNlci5cbiAgICAgIGlmICghaXNTb3VyY2VQREYgJiYgbnVtQ29tcG9uZW50cyA9PT0gNCAmJiAhdHJhbnNmb3JtKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShbXG4gICAgICAgICAgLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1XSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICkge1xuICAgICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgbnVtQ29tcG9uZW50czsgaisrLCBpKyssIGsgKz0gMikge1xuICAgICAgICAgICAgZGF0YVtpXSA9ICgoZGF0YVtpXSAqIHRyYW5zZm9ybVtrXSkgPj4gOCkgKyB0cmFuc2Zvcm1bayArIDFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIGdldCBfaXNDb2xvckNvbnZlcnNpb25OZWVkZWQoKSB7XG4gICAgICBpZiAodGhpcy5hZG9iZSkge1xuICAgICAgICAvLyBUaGUgYWRvYmUgdHJhbnNmb3JtIG1hcmtlciBvdmVycmlkZXMgYW55IHByZXZpb3VzIHNldHRpbmcuXG4gICAgICAgIHJldHVybiAhIXRoaXMuYWRvYmUudHJhbnNmb3JtQ29kZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbG9yVHJhbnNmb3JtID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIEFkb2JlIHRyYW5zZm9ybSBtYXJrZXIgaXMgbm90IHByZXNlbnQgYW5kIHRoZSBpbWFnZVxuICAgICAgICAgIC8vIGRpY3Rpb25hcnkgaGFzIGEgJ0NvbG9yVHJhbnNmb3JtJyBlbnRyeSwgZXhwbGljaXRseSBzZXQgdG8gYDBgLFxuICAgICAgICAgIC8vIHRoZW4gdGhlIGNvbG91cnMgc2hvdWxkICpub3QqIGJlIHRyYW5zZm9ybWVkLlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbMF0uaW5kZXggPT09IC8qIFwiUlwiID0gKi8gMHg1MiAmJlxuICAgICAgICAgIHRoaXMuY29tcG9uZW50c1sxXS5pbmRleCA9PT0gLyogXCJHXCIgPSAqLyAweDQ3ICYmXG4gICAgICAgICAgdGhpcy5jb21wb25lbnRzWzJdLmluZGV4ID09PSAvKiBcIkJcIiA9ICovIDB4NDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHRocmVlIGNvbXBvbmVudHMgYXJlIGluZGV4ZWQgYXMgUkdCIGluIEFTQ0lJXG4gICAgICAgICAgLy8gdGhlbiB0aGUgY29sb3VycyBzaG91bGQgKm5vdCogYmUgdHJhbnNmb3JtZWQuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gYHRoaXMubnVtQ29tcG9uZW50cyAhPT0gM2BcbiAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMSkge1xuICAgICAgICAvLyBJZiB0aGUgQWRvYmUgdHJhbnNmb3JtIG1hcmtlciBpcyBub3QgcHJlc2VudCBhbmQgdGhlIGltYWdlXG4gICAgICAgIC8vIGRpY3Rpb25hcnkgaGFzIGEgJ0NvbG9yVHJhbnNmb3JtJyBlbnRyeSwgZXhwbGljaXRseSBzZXQgdG8gYDFgLFxuICAgICAgICAvLyB0aGVuIHRoZSBjb2xvdXJzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIF9jb252ZXJ0WWNjVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRZY2NUb1JnYihkYXRhKSB7XG4gICAgICB2YXIgWSwgQ2IsIENyO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGRhdGFbaV0gPSBZIC0gMTc5LjQ1NiArIDEuNDAyICogQ3I7XG4gICAgICAgIGRhdGFbaSArIDFdID0gWSArIDEzNS40NTkgLSAwLjM0NCAqIENiIC0gMC43MTQgKiBDcjtcbiAgICAgICAgZGF0YVtpICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRZY2NrVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRZY2NrVG9SZ2IoZGF0YSkge1xuICAgICAgdmFyIFksIENiLCBDciwgaztcbiAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGsgPSBkYXRhW2kgKyAzXTtcblxuICAgICAgICBkYXRhW29mZnNldCsrXSA9XG4gICAgICAgICAgLTEyMi42NzE5NTQwNjg5NCArXG4gICAgICAgICAgQ2IgKlxuICAgICAgICAgICAgKC02LjYwNjM1NjY5NDIwMzY0ZS01ICogQ2IgK1xuICAgICAgICAgICAgICAwLjAwMDQzNzEzMDQ3NTkyNjIzMiAqIENyIC1cbiAgICAgICAgICAgICAgNS40MDgwNjEwMDY0NTk5ZS01ICogWSArXG4gICAgICAgICAgICAgIDAuMDAwNDg0NDk3OTcxMjAyODEgKiBrIC1cbiAgICAgICAgICAgICAgMC4xNTQzNjIxNTE4NzExMjYpICtcbiAgICAgICAgICBDciAqXG4gICAgICAgICAgICAoLTAuMDAwOTU3OTY0Mzc4NDQ1NzczICogQ3IgK1xuICAgICAgICAgICAgICAwLjAwMDgxNzA3NjkxMTM0NjYyNSAqIFkgLVxuICAgICAgICAgICAgICAwLjAwNDc3MjcxNDA1NDA4NzQ3ICogayArXG4gICAgICAgICAgICAgIDEuNTMzODAyNTMyMjE3MzQpICtcbiAgICAgICAgICBZICpcbiAgICAgICAgICAgICgwLjAwMDk2MTI1MDE4NDEzMDY4OCAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjY2MjU3MzMyMjgzOTMzICogayArXG4gICAgICAgICAgICAgIDAuNDgzNTcwODg0NTEyNjUpICtcbiAgICAgICAgICBrICogKC0wLjAwMDMzNjE5NzE3NzYxODM5NCAqIGsgKyAwLjQ4NDc5MTU2MTQ5MDc3Nik7XG5cbiAgICAgICAgZGF0YVtvZmZzZXQrK10gPVxuICAgICAgICAgIDEwNy4yNjgwMzkzOTc3MjQgK1xuICAgICAgICAgIENiICpcbiAgICAgICAgICAgICgyLjE5OTI3MTA0NTI1NzQxZS01ICogQ2IgLVxuICAgICAgICAgICAgICAwLjAwMDY0MDk5MjAxODI5Nzk0NSAqIENyICtcbiAgICAgICAgICAgICAgMC4wMDA2NTkzOTcwMDEyNDU1NzcgKiBZICtcbiAgICAgICAgICAgICAgMC4wMDA0MjYxMDU2NTI5Mzg4MzcgKiBrIC1cbiAgICAgICAgICAgICAgMC4xNzY0OTE3OTI0NjI4NzUpICtcbiAgICAgICAgICBDciAqXG4gICAgICAgICAgICAoLTAuMDAwNzc4MjY5OTQxNTEzNjgzICogQ3IgK1xuICAgICAgICAgICAgICAwLjAwMTMwODcyMjYxNDA4Mjc1ICogWSArXG4gICAgICAgICAgICAgIDAuMDAwNzcwNDgyNjMxODAxMTMyICogayAtXG4gICAgICAgICAgICAgIDAuMTUxMDUxNDkyNzc1NTYyKSArXG4gICAgICAgICAgWSAqXG4gICAgICAgICAgICAoMC4wMDEyNjkzNTM2ODExNDg0MyAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjY1MDkwMTg5MDEwODk4ICogayArXG4gICAgICAgICAgICAgIDAuMjU4MDI5MTAyMDY4NDUpICtcbiAgICAgICAgICBrICogKC0wLjAwMDMxODkxMzExNzU4ODMyOCAqIGsgLSAwLjIxMzc0MjQwMDMyMzY2NSk7XG5cbiAgICAgICAgZGF0YVtvZmZzZXQrK10gPVxuICAgICAgICAgIC0yMC44MTAwMTI1NDY5NDcgK1xuICAgICAgICAgIENiICpcbiAgICAgICAgICAgICgtMC4wMDA1NzAxMTUxOTY5NzM2NzcgKiBDYiAtXG4gICAgICAgICAgICAgIDIuNjM0MDkwNTEwMDQ1ODllLTUgKiBDciArXG4gICAgICAgICAgICAgIDAuMDAyMDc0MTA4ODExNTAxMiAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjg4MjYwMjM2ODUzNDQyICogayArXG4gICAgICAgICAgICAgIDAuODE0MjcyOTY4MzU5Mjk1KSArXG4gICAgICAgICAgQ3IgKlxuICAgICAgICAgICAgKC0xLjUzNDk2MDU3NDQwOTc1ZS01ICogQ3IgLVxuICAgICAgICAgICAgICAwLjAwMDEzMjY4OTA0Mzk2MTQ0NiAqIFkgK1xuICAgICAgICAgICAgICAwLjAwMDU2MDgzMzY5MTI0MjgxMiAqIGsgLVxuICAgICAgICAgICAgICAwLjE5NTE1MjAyNzUzNDA0OSkgK1xuICAgICAgICAgIFkgKlxuICAgICAgICAgICAgKDAuMDAxNzQ0MTgxMzI5Mjc1ODIgKiBZIC1cbiAgICAgICAgICAgICAgMC4wMDI1NTI0MzMyMTQzOTM0NyAqIGsgK1xuICAgICAgICAgICAgICAwLjExNjkzNTAyMDQ2NTE0NSkgK1xuICAgICAgICAgIGsgKiAoLTAuMDAwMzQzNTMxOTk2NTEwNTU1ICogayArIDAuMjQxNjUyNjAyMzI0MDcpO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHRoYXQgb25seSB0aGUgY29udmVydGVkIFJHQiBkYXRhIGlzIHJldHVybmVkLlxuICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgb2Zmc2V0KTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRZY2NrVG9DbXlrOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7XG4gICAgICB2YXIgWSwgQ2IsIENyO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGRhdGFbaV0gPSA0MzQuNDU2IC0gWSAtIDEuNDAyICogQ3I7XG4gICAgICAgIGRhdGFbaSArIDFdID0gMTE5LjU0MSAtIFkgKyAwLjM0NCAqIENiICsgMC43MTQgKiBDcjtcbiAgICAgICAgZGF0YVtpICsgMl0gPSA0ODEuODE2IC0gWSAtIDEuNzcyICogQ2I7XG4gICAgICAgIC8vIEsgaW4gZGF0YVtpICsgM10gaXMgdW5jaGFuZ2VkXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRDbXlrVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRDbXlrVG9SZ2IoZGF0YSkge1xuICAgICAgdmFyIGMsIG0sIHksIGs7XG4gICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGMgPSBkYXRhW2ldO1xuICAgICAgICBtID0gZGF0YVtpICsgMV07XG4gICAgICAgIHkgPSBkYXRhW2kgKyAyXTtcbiAgICAgICAgayA9IGRhdGFbaSArIDNdO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKC0wLjAwMDA2NzQ3MTQ3MDczNjAyNDQxICogYyArXG4gICAgICAgICAgICAgIDAuMDAwODM3OTI2MjEyMTAxMzcyNyAqIG0gK1xuICAgICAgICAgICAgICAwLjAwMDI4OTQ3MTgxODg2NDMyOTQgKiB5ICtcbiAgICAgICAgICAgICAgMC4wMDMyNjQyMzEwNTc1Mzc4MDYgKiBrIC1cbiAgICAgICAgICAgICAgMS4xMTg1NjExODY3MjAzOTM3KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoMC4wMDAwMjYzNzQxMDc2MTYwODk0MDUgKiBtIC1cbiAgICAgICAgICAgICAgMC4wMDAwODYyNjk0OTE1ODYzODU3MiAqIHkgLVxuICAgICAgICAgICAgICAwLjAwMDI3NDg3NjkwNjc0OTk0OTEgKiBrIC1cbiAgICAgICAgICAgICAgMC4wMjE1NTY4ODc5NDk3ODk2NykgK1xuICAgICAgICAgIHkgKlxuICAgICAgICAgICAgKC0wLjAwMDAzODc4MDk5MjEyODY5MzYzICogeSAtXG4gICAgICAgICAgICAgIDAuMDAwMzI2NzgwODI3OTQ4NTI4NiAqIGsgK1xuICAgICAgICAgICAgICAwLjA2ODY3NDIyMzg1OTUzNDUpIC1cbiAgICAgICAgICBrICogKDAuMDAwMzM2MTk3MTc3NjE4MzkzNyAqIGsgKyAwLjc0MzA2NTkxNTEzNDIyNTQpO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKDAuMDAwMTM1OTYzNzI4MTM1ODg4NDggKiBjICtcbiAgICAgICAgICAgICAgMC4wMDA5MjQ1MzcxMzI1NzM1ODUgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDAxMDU2NzM1OTYxODY4MzU5MyAqIHkgK1xuICAgICAgICAgICAgICAwLjAwMDQ3OTE4NjQ2ODc0MzY1MTIgKiBrIC1cbiAgICAgICAgICAgICAgMC4zMTA5Njg5NTg3NTE1ODc1KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoLTAuMDAwMjM1NDUzNDYxMDgzNzAzNDQgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDAyNzAyODQ1MjUzNTM0NzE0ICogeSArXG4gICAgICAgICAgICAgIDAuMDAyMDIwMDMwODk3NzMwNzE1NiAqIGsgLVxuICAgICAgICAgICAgICAwLjc0ODgwNTIxNjcwMTU0OTQpICtcbiAgICAgICAgICB5ICpcbiAgICAgICAgICAgICgwLjAwMDA2ODM0ODE1OTk4MjM1NjYyICogeSArXG4gICAgICAgICAgICAgIDAuMDAwMTUxNjg0NTIzNjM0NjA5NzMgKiBrIC1cbiAgICAgICAgICAgICAgMC4wOTc1MTkyNzc3NDcyODkzMykgLVxuICAgICAgICAgIGsgKiAoMC4wMDAzMTg5MTMxMTc1ODgzMjgxNCAqIGsgKyAwLjczNjQ4ODM4MDc3MzMxNjgpO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKDAuMDAwMDEzNTk4NjUwNDExMzg1MzA3ICogYyArXG4gICAgICAgICAgICAgIDAuMDAwMTI0MjM5NTYxNzU0OTA4NTEgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDA0NzUxOTg1MDk3NTgzNTg5ICogeSAtXG4gICAgICAgICAgICAgIDAuMDAwMDAzNjcyOTMxNzQ3NjYzMDQyMiAqIGsgLVxuICAgICAgICAgICAgICAwLjA1NTYyMTg2OTgwMjY0MDM0KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoMC4wMDAxNjE0MTM4MDU5ODcyNDY3NiAqIG0gK1xuICAgICAgICAgICAgICAwLjAwMDk2OTIyMzkxMzA3MjUxODYgKiB5ICtcbiAgICAgICAgICAgICAgMC4wMDA3NzgyNjkyNDUwMDM2MjUzICogayAtXG4gICAgICAgICAgICAgIDAuNDQwMTUyMzIzNjc1MjY0NjMpICtcbiAgICAgICAgICB5ICpcbiAgICAgICAgICAgICg1LjA2ODg4MjkxNDA2ODc2OWUtNyAqIHkgK1xuICAgICAgICAgICAgICAwLjAwMTc3NzgzNjkwMTEzNzUwNzEgKiBrIC1cbiAgICAgICAgICAgICAgMC43NTkxNDU0NjQ5NzQ5NjA5KSAtXG4gICAgICAgICAgayAqICgwLjAwMDM0MzUzMTk5NjUxMDU1NTMgKiBrICsgMC43MDYzNzcwMTg2MTYwMTQ0KTtcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGF0IG9ubHkgdGhlIGNvbnZlcnRlZCBSR0IgZGF0YSBpcyByZXR1cm5lZC5cbiAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7XG4gICAgfSxcblxuICAgIGdldERhdGEoeyB3aWR0aCwgaGVpZ2h0LCBmb3JjZVJHQiA9IGZhbHNlLCBpc1NvdXJjZVBERiA9IGZhbHNlIH0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGlzU291cmNlUERGID09PSB0cnVlLFxuICAgICAgICAgICdKcGVnSW1hZ2UuZ2V0RGF0YTogVW5leHBlY3RlZCBcImlzU291cmNlUERGXCIgdmFsdWUgZm9yIFBERiBmaWxlcy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID4gNCkge1xuICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZVwiKTtcbiAgICAgIH1cbiAgICAgIC8vIFR5cGUgb2YgZGF0YTogVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiBudW1Db21wb25lbnRzKVxuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTtcblxuICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMSAmJiBmb3JjZVJHQikge1xuICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICB2YXIgcmdiRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoICogMyk7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBncmF5Q29sb3IgPSBkYXRhW2ldO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZ2JEYXRhO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMgJiYgdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSA0KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCkge1xuICAgICAgICAgIGlmIChmb3JjZVJHQikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2IoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JjZVJHQikge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBKcGVnSW1hZ2U7XG59KSgpO1xuXG5leHBvcnQgeyBKcGVnSW1hZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBEZWNvZGVTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcbmltcG9ydCB7IEpweEltYWdlIH0gZnJvbSBcIi4vanB4LmpzXCI7XG5pbXBvcnQgeyBzaGFkb3cgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuLyoqXG4gKiBGb3IgSlBFRyAyMDAwJ3Mgd2UgdXNlIGEgbGlicmFyeSB0byBkZWNvZGUgdGhlc2UgaW1hZ2VzIGFuZFxuICogdGhlIHN0cmVhbSBiZWhhdmVzIGxpa2UgYWxsIHRoZSBvdGhlciBEZWNvZGVTdHJlYW1zLlxuICovXG5jb25zdCBKcHhTdHJlYW0gPSAoZnVuY3Rpb24gSnB4U3RyZWFtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBKcHhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZGljdCwgcGFyYW1zKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5tYXliZUxlbmd0aCA9IG1heWJlTGVuZ3RoO1xuICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cbiAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7XG4gIH1cblxuICBKcHhTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSnB4U3RyZWFtLnByb3RvdHlwZSwgXCJieXRlc1wiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBKcHhTdHJlYW1fYnl0ZXMoKSB7XG4gICAgICAvLyBJZiBgdGhpcy5tYXliZUxlbmd0aGAgaXMgbnVsbCwgd2UnbGwgZ2V0IHRoZSBlbnRpcmUgc3RyZWFtLlxuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImJ5dGVzXCIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG5cbiAgSnB4U3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7XG4gICAgLy8gTm8tb3AsIHNpbmNlIGB0aGlzLnJlYWRCbG9ja2Agd2lsbCBhbHdheXMgcGFyc2UgdGhlIGVudGlyZSBpbWFnZSBhbmRcbiAgICAvLyBkaXJlY3RseSBpbnNlcnQgYWxsIG9mIGl0cyBkYXRhIGludG8gYHRoaXMuYnVmZmVyYC5cbiAgfTtcblxuICBKcHhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QganB4SW1hZ2UgPSBuZXcgSnB4SW1hZ2UoKTtcbiAgICBqcHhJbWFnZS5wYXJzZSh0aGlzLmJ5dGVzKTtcblxuICAgIGNvbnN0IHdpZHRoID0ganB4SW1hZ2Uud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0ganB4SW1hZ2UuaGVpZ2h0O1xuICAgIGNvbnN0IGNvbXBvbmVudHNDb3VudCA9IGpweEltYWdlLmNvbXBvbmVudHNDb3VudDtcbiAgICBjb25zdCB0aWxlQ291bnQgPSBqcHhJbWFnZS50aWxlcy5sZW5ndGg7XG4gICAgaWYgKHRpbGVDb3VudCA9PT0gMSkge1xuICAgICAgdGhpcy5idWZmZXIgPSBqcHhJbWFnZS50aWxlc1swXS5pdGVtcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIGNvbXBvbmVudHNDb3VudCk7XG5cbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGlsZUNvdW50OyBrKyspIHtcbiAgICAgICAgY29uc3QgdGlsZUNvbXBvbmVudHMgPSBqcHhJbWFnZS50aWxlc1trXTtcbiAgICAgICAgY29uc3QgdGlsZVdpZHRoID0gdGlsZUNvbXBvbmVudHMud2lkdGg7XG4gICAgICAgIGNvbnN0IHRpbGVIZWlnaHQgPSB0aWxlQ29tcG9uZW50cy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IHRpbGVMZWZ0ID0gdGlsZUNvbXBvbmVudHMubGVmdDtcbiAgICAgICAgY29uc3QgdGlsZVRvcCA9IHRpbGVDb21wb25lbnRzLnRvcDtcblxuICAgICAgICBjb25zdCBzcmMgPSB0aWxlQ29tcG9uZW50cy5pdGVtcztcbiAgICAgICAgbGV0IHNyY1Bvc2l0aW9uID0gMDtcbiAgICAgICAgbGV0IGRhdGFQb3NpdGlvbiA9ICh3aWR0aCAqIHRpbGVUb3AgKyB0aWxlTGVmdCkgKiBjb21wb25lbnRzQ291bnQ7XG4gICAgICAgIGNvbnN0IGltZ1Jvd1NpemUgPSB3aWR0aCAqIGNvbXBvbmVudHNDb3VudDtcbiAgICAgICAgY29uc3QgdGlsZVJvd1NpemUgPSB0aWxlV2lkdGggKiBjb21wb25lbnRzQ291bnQ7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aWxlSGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICBjb25zdCByb3dCeXRlcyA9IHNyYy5zdWJhcnJheShzcmNQb3NpdGlvbiwgc3JjUG9zaXRpb24gKyB0aWxlUm93U2l6ZSk7XG4gICAgICAgICAgZGF0YS5zZXQocm93Qnl0ZXMsIGRhdGFQb3NpdGlvbik7XG4gICAgICAgICAgc3JjUG9zaXRpb24gKz0gdGlsZVJvd1NpemU7XG4gICAgICAgICAgZGF0YVBvc2l0aW9uICs9IGltZ1Jvd1NpemU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB9XG4gICAgdGhpcy5idWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgdGhpcy5lb2YgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBKcHhTdHJlYW07XG59KSgpO1xuXG5leHBvcnQgeyBKcHhTdHJlYW0gfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uLCBpbmZvLCB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBsb2cyLCByZWFkVWludDE2LCByZWFkVWludDMyIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgQXJpdGhtZXRpY0RlY29kZXIgfSBmcm9tIFwiLi9hcml0aG1ldGljX2RlY29kZXIuanNcIjtcblxuY2xhc3MgSnB4RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIoYEpQWCBlcnJvcjogJHttc2d9YCk7XG4gIH1cbn1cblxudmFyIEpweEltYWdlID0gKGZ1bmN0aW9uIEpweEltYWdlQ2xvc3VyZSgpIHtcbiAgLy8gVGFibGUgRS4xXG4gIHZhciBTdWJiYW5kc0dhaW5Mb2cyID0ge1xuICAgIExMOiAwLFxuICAgIExIOiAxLFxuICAgIEhMOiAxLFxuICAgIEhIOiAyLFxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gSnB4SW1hZ2UoKSB7XG4gICAgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSA9IGZhbHNlO1xuICB9XG4gIEpweEltYWdlLnByb3RvdHlwZSA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2UoZGF0YSkge1xuICAgICAgdmFyIGhlYWQgPSByZWFkVWludDE2KGRhdGEsIDApO1xuICAgICAgLy8gTm8gYm94IGhlYWRlciwgaW1tZWRpYXRlIHN0YXJ0IG9mIGNvZGVzdHJlYW0gKFNPQylcbiAgICAgIGlmIChoZWFkID09PSAweGZmNGYpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwb3NpdGlvbiA9IDAsXG4gICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBoZWFkZXJTaXplID0gODtcbiAgICAgICAgdmFyIGxib3ggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIHRib3ggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCk7XG4gICAgICAgIHBvc2l0aW9uICs9IGhlYWRlclNpemU7XG4gICAgICAgIGlmIChsYm94ID09PSAxKSB7XG4gICAgICAgICAgLy8gWExCb3g6IHJlYWQgVUludDY0IGFjY29yZGluZyB0byBzcGVjLlxuICAgICAgICAgIC8vIEphdmFTY3JpcHQncyBpbnQgcHJlY2lzaW9uIG9mIDUzIGJpdCBzaG91bGQgYmUgc3VmZmljaWVudCBoZXJlLlxuICAgICAgICAgIGxib3ggPVxuICAgICAgICAgICAgcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbikgKiA0Mjk0OTY3Mjk2ICtcbiAgICAgICAgICAgIHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KTtcbiAgICAgICAgICBwb3NpdGlvbiArPSA4O1xuICAgICAgICAgIGhlYWRlclNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGJveCA9PT0gMCkge1xuICAgICAgICAgIGxib3ggPSBsZW5ndGggLSBwb3NpdGlvbiArIGhlYWRlclNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxib3ggPCBoZWFkZXJTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiSW52YWxpZCBib3ggZmllbGQgc2l6ZVwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGxib3ggLSBoZWFkZXJTaXplO1xuICAgICAgICB2YXIganVtcERhdGFMZW5ndGggPSB0cnVlO1xuICAgICAgICBzd2l0Y2ggKHRib3gpIHtcbiAgICAgICAgICBjYXNlIDB4NmE3MDMyNjg6IC8vICdqcDJoJ1xuICAgICAgICAgICAganVtcERhdGFMZW5ndGggPSBmYWxzZTsgLy8gcGFyc2luZyBjaGlsZCBib3hlc1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDYzNmY2YzcyOiAvLyAnY29scidcbiAgICAgICAgICAgIC8vIENvbG9yc3BhY2VzIGFyZSBub3QgdXNlZCwgdGhlIENTIGZyb20gdGhlIFBERiBpcyB1c2VkLlxuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IGRhdGFbcG9zaXRpb25dO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gMSkge1xuICAgICAgICAgICAgICAvLyBlbnVtZXJhdGVkIGNvbG9yc3BhY2VcbiAgICAgICAgICAgICAgdmFyIGNvbG9yc3BhY2UgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMyk7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY29sb3JzcGFjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6IC8vIHRoaXMgaW5kaWNhdGVzIGEgc1JHQiBjb2xvcnNwYWNlXG4gICAgICAgICAgICAgICAgY2FzZSAxNzogLy8gdGhpcyBpbmRpY2F0ZXMgYSBncmF5c2NhbGUgY29sb3JzcGFjZVxuICAgICAgICAgICAgICAgIGNhc2UgMTg6IC8vIHRoaXMgaW5kaWNhdGVzIGEgWVVWIGNvbG9yc3BhY2VcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB3YXJuKFwiVW5rbm93biBjb2xvcnNwYWNlIFwiICsgY29sb3JzcGFjZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IDIpIHtcbiAgICAgICAgICAgICAgaW5mbyhcIklDQyBwcm9maWxlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4NmE3MDMyNjM6IC8vICdqcDJjJ1xuICAgICAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgcG9zaXRpb24sIHBvc2l0aW9uICsgZGF0YUxlbmd0aCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4NmE1MDIwMjA6IC8vICdqUFxcMDI0XFwwMjQnXG4gICAgICAgICAgICBpZiAocmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbikgIT09IDB4MGQwYTg3MGEpIHtcbiAgICAgICAgICAgICAgd2FybihcIkludmFsaWQgSlAyIHNpZ25hdHVyZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGVhZGVyIHR5cGVzIGFyZSB2YWxpZCBidXQgY3VycmVudGx5IG5vdCB1c2VkOlxuICAgICAgICAgIGNhc2UgMHg2YTUwMWExYTogLy8gJ2pQXFwwMzJcXDAzMidcbiAgICAgICAgICBjYXNlIDB4NjY3NDc5NzA6IC8vICdmdHlwJ1xuICAgICAgICAgIGNhc2UgMHg3MjcyNjU3MTogLy8gJ3JyZXEnXG4gICAgICAgICAgY2FzZSAweDcyNjU3MzIwOiAvLyAncmVzICdcbiAgICAgICAgICBjYXNlIDB4Njk2ODY0NzI6IC8vICdpaGRyJ1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciBoZWFkZXJUeXBlID0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICAgKHRib3ggPj4gMjQpICYgMHhmZixcbiAgICAgICAgICAgICAgKHRib3ggPj4gMTYpICYgMHhmZixcbiAgICAgICAgICAgICAgKHRib3ggPj4gOCkgJiAweGZmLFxuICAgICAgICAgICAgICB0Ym94ICYgMHhmZlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHdhcm4oXCJVbnN1cHBvcnRlZCBoZWFkZXIgdHlwZSBcIiArIHRib3ggKyBcIiAoXCIgKyBoZWFkZXJUeXBlICsgXCIpXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGp1bXBEYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgcG9zaXRpb24gKz0gZGF0YUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgcGFyc2VJbWFnZVByb3BlcnRpZXM6IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlSW1hZ2VQcm9wZXJ0aWVzKHN0cmVhbSkge1xuICAgICAgdmFyIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgd2hpbGUgKG5ld0J5dGUgPj0gMCkge1xuICAgICAgICB2YXIgb2xkQnl0ZSA9IG5ld0J5dGU7XG4gICAgICAgIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgY29kZSA9IChvbGRCeXRlIDw8IDgpIHwgbmV3Qnl0ZTtcbiAgICAgICAgLy8gSW1hZ2UgYW5kIHRpbGUgc2l6ZSAoU0laKVxuICAgICAgICBpZiAoY29kZSA9PT0gMHhmZjUxKSB7XG4gICAgICAgICAgc3RyZWFtLnNraXAoNCk7XG4gICAgICAgICAgdmFyIFhzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSA0XG4gICAgICAgICAgdmFyIFlzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSA4XG4gICAgICAgICAgdmFyIFhPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7IC8vIEJ5dGUgMTJcbiAgICAgICAgICB2YXIgWU9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSAxNlxuICAgICAgICAgIHN0cmVhbS5za2lwKDE2KTtcbiAgICAgICAgICB2YXIgQ3NpeiA9IHN0cmVhbS5nZXRVaW50MTYoKTsgLy8gQnl0ZSAzNlxuICAgICAgICAgIHRoaXMud2lkdGggPSBYc2l6IC0gWE9zaXo7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBZc2l6IC0gWU9zaXo7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRzQ291bnQgPSBDc2l6O1xuICAgICAgICAgIC8vIFJlc3VsdHMgYXJlIGFsd2F5cyByZXR1cm5lZCBhcyBgVWludDhDbGFtcGVkQXJyYXlgcy5cbiAgICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSA4O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbVwiKTtcbiAgICB9LFxuICAgIHBhcnNlQ29kZXN0cmVhbTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICB2YXIgZG9Ob3RSZWNvdmVyID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBzdGFydDtcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uICsgMSA8IGVuZCkge1xuICAgICAgICAgIHZhciBjb2RlID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24gKz0gMjtcblxuICAgICAgICAgIHZhciBsZW5ndGggPSAwLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIHNxY2QsXG4gICAgICAgICAgICBzcHFjZHMsXG4gICAgICAgICAgICBzcHFjZFNpemUsXG4gICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQsXG4gICAgICAgICAgICB0aWxlO1xuICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgY2FzZSAweGZmNGY6IC8vIFN0YXJ0IG9mIGNvZGVzdHJlYW0gKFNPQylcbiAgICAgICAgICAgICAgY29udGV4dC5tYWluSGVhZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmZkOTogLy8gRW5kIG9mIGNvZGVzdHJlYW0gKEVPQylcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1MTogLy8gSW1hZ2UgYW5kIHRpbGUgc2l6ZSAoU0laKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIHNpeiA9IHt9O1xuICAgICAgICAgICAgICBzaXouWHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KTtcbiAgICAgICAgICAgICAgc2l6LllzaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgOCk7XG4gICAgICAgICAgICAgIHNpei5YT3NpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxMik7XG4gICAgICAgICAgICAgIHNpei5ZT3NpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxNik7XG4gICAgICAgICAgICAgIHNpei5YVHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAyMCk7XG4gICAgICAgICAgICAgIHNpei5ZVHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAyNCk7XG4gICAgICAgICAgICAgIHNpei5YVE9zaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMjgpO1xuICAgICAgICAgICAgICBzaXouWVRPc2l6ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDMyKTtcbiAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAzNik7XG4gICAgICAgICAgICAgIHNpei5Dc2l6ID0gY29tcG9uZW50c0NvdW50O1xuICAgICAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAzODtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB7XG4gICAgICAgICAgICAgICAgICBwcmVjaXNpb246IChkYXRhW2pdICYgMHg3ZikgKyAxLFxuICAgICAgICAgICAgICAgICAgaXNTaWduZWQ6ICEhKGRhdGFbal0gJiAweDgwKSxcbiAgICAgICAgICAgICAgICAgIFhSc2l6OiBkYXRhW2ogKyAxXSxcbiAgICAgICAgICAgICAgICAgIFlSc2l6OiBkYXRhW2ogKyAyXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGogKz0gMztcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGNvbXBvbmVudCwgc2l6KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250ZXh0LlNJWiA9IHNpejtcbiAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgICAgICAgICAgICAgY2FsY3VsYXRlVGlsZUdyaWRzKGNvbnRleHQsIGNvbXBvbmVudHMpO1xuICAgICAgICAgICAgICBjb250ZXh0LlFDQyA9IFtdO1xuICAgICAgICAgICAgICBjb250ZXh0LkNPQyA9IFtdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjVjOiAvLyBRdWFudGl6YXRpb24gZGVmYXVsdCAoUUNEKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIHFjZCA9IHt9O1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyO1xuICAgICAgICAgICAgICBzcWNkID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHNxY2QgJiAweDFmKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gODtcbiAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSAxNjtcbiAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU1FjZCB2YWx1ZSBcIiArIHNxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjZC5ub1F1YW50aXphdGlvbiA9IHNwcWNkU2l6ZSA9PT0gODtcbiAgICAgICAgICAgICAgcWNkLnNjYWxhckV4cG91bmRlZCA9IHNjYWxhckV4cG91bmRlZDtcbiAgICAgICAgICAgICAgcWNkLmd1YXJkQml0cyA9IHNxY2QgPj4gNTtcbiAgICAgICAgICAgICAgc3BxY2RzID0gW107XG4gICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICsgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BxY2QgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9ICgoZGF0YVtqXSAmIDB4NykgPDwgOCkgfCBkYXRhW2ogKyAxXTtcbiAgICAgICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjZC5TUHFjZHMgPSBzcHFjZHM7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LlFDRCA9IHFjZDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRCA9IHFjZDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQyA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweGZmNWQ6IC8vIFF1YW50aXphdGlvbiBjb21wb25lbnQgKFFDQylcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHZhciBxY2MgPSB7fTtcbiAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjtcbiAgICAgICAgICAgICAgdmFyIGNxY2M7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0LlNJWi5Dc2l6IDwgMjU3KSB7XG4gICAgICAgICAgICAgICAgY3FjYyA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcWNjID0gcmVhZFVpbnQxNihkYXRhLCBqKTtcbiAgICAgICAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgc3dpdGNoIChzcWNkICYgMHgxZikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDg7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2O1xuICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNRY2QgdmFsdWUgXCIgKyBzcWNkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBxY2Mubm9RdWFudGl6YXRpb24gPSBzcHFjZFNpemUgPT09IDg7XG4gICAgICAgICAgICAgIHFjYy5zY2FsYXJFeHBvdW5kZWQgPSBzY2FsYXJFeHBvdW5kZWQ7XG4gICAgICAgICAgICAgIHFjYy5ndWFyZEJpdHMgPSBzcWNkID4+IDU7XG4gICAgICAgICAgICAgIHNwcWNkcyA9IFtdO1xuICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3BxY2QgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9ICgoZGF0YVtqXSAmIDB4NykgPDwgOCkgfCBkYXRhW2ogKyAxXTtcbiAgICAgICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjYy5TUHFjZHMgPSBzcHFjZHM7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LlFDQ1tjcWNjXSA9IHFjYztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjcWNjXSA9IHFjYztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjUyOiAvLyBDb2Rpbmcgc3R5bGUgZGVmYXVsdCAoQ09EKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIGNvZCA9IHt9O1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyO1xuICAgICAgICAgICAgICB2YXIgc2NvZCA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgY29kLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMgPSAhIShzY29kICYgMSk7XG4gICAgICAgICAgICAgIGNvZC5zb3BNYXJrZXJVc2VkID0gISEoc2NvZCAmIDIpO1xuICAgICAgICAgICAgICBjb2QuZXBoTWFya2VyVXNlZCA9ICEhKHNjb2QgJiA0KTtcbiAgICAgICAgICAgICAgY29kLnByb2dyZXNzaW9uT3JkZXIgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIGNvZC5sYXllcnNDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgaik7XG4gICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgY29kLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtID0gZGF0YVtqKytdO1xuXG4gICAgICAgICAgICAgIGNvZC5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIGNvZC54Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7XG4gICAgICAgICAgICAgIGNvZC55Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7XG4gICAgICAgICAgICAgIHZhciBibG9ja1N0eWxlID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICBjb2Quc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyA9ICEhKGJsb2NrU3R5bGUgJiAxKTtcbiAgICAgICAgICAgICAgY29kLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMgPSAhIShibG9ja1N0eWxlICYgMik7XG4gICAgICAgICAgICAgIGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MgPSAhIShibG9ja1N0eWxlICYgNCk7XG4gICAgICAgICAgICAgIGNvZC52ZXJ0aWNhbGx5U3RyaXBlID0gISEoYmxvY2tTdHlsZSAmIDgpO1xuICAgICAgICAgICAgICBjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbiA9ICEhKGJsb2NrU3R5bGUgJiAxNik7XG4gICAgICAgICAgICAgIGNvZC5zZWdtZW50YXRpb25TeW1ib2xVc2VkID0gISEoYmxvY2tTdHlsZSAmIDMyKTtcbiAgICAgICAgICAgICAgY29kLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbiA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgaWYgKGNvZC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemVzID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemUgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgICAgICBwcmVjaW5jdHNTaXplcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgUFB4OiBwcmVjaW5jdHNTaXplICYgMHhmLFxuICAgICAgICAgICAgICAgICAgICBQUHk6IHByZWNpbmN0c1NpemUgPj4gNCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2QucHJlY2luY3RzU2l6ZXMgPSBwcmVjaW5jdHNTaXplcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgdW5zdXBwb3J0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgaWYgKGNvZC5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzKSB7XG4gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaChcInNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3NcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzKSB7XG4gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaChcInJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXNcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MpIHtcbiAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKFwidGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2QudmVydGljYWxseVN0cmlwZSkge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goXCJ2ZXJ0aWNhbGx5U3RyaXBlXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbikge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goXCJwcmVkaWN0YWJsZVRlcm1pbmF0aW9uXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZG9Ob3RSZWNvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIlVuc3VwcG9ydGVkIENPRCBvcHRpb25zIChcIiArIHVuc3VwcG9ydGVkLmpvaW4oXCIsIFwiKSArIFwiKVwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5DT0QgPSBjb2Q7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0QgPSBjb2Q7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0MgPSBbXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjkwOiAvLyBTdGFydCBvZiB0aWxlLXBhcnQgKFNPVClcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHRpbGUgPSB7fTtcbiAgICAgICAgICAgICAgdGlsZS5pbmRleCA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAyKTtcbiAgICAgICAgICAgICAgdGlsZS5sZW5ndGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCk7XG4gICAgICAgICAgICAgIHRpbGUuZGF0YUVuZCA9IHRpbGUubGVuZ3RoICsgcG9zaXRpb24gLSAyO1xuICAgICAgICAgICAgICB0aWxlLnBhcnRJbmRleCA9IGRhdGFbcG9zaXRpb24gKyA4XTtcbiAgICAgICAgICAgICAgdGlsZS5wYXJ0c0NvdW50ID0gZGF0YVtwb3NpdGlvbiArIDldO1xuXG4gICAgICAgICAgICAgIGNvbnRleHQubWFpbkhlYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZXNldCBjb21wb25lbnQgc3BlY2lmaWMgc2V0dGluZ3NcbiAgICAgICAgICAgICAgICB0aWxlLkNPRCA9IGNvbnRleHQuQ09EO1xuICAgICAgICAgICAgICAgIHRpbGUuQ09DID0gY29udGV4dC5DT0Muc2xpY2UoMCk7IC8vIGNsb25lIG9mIHRoZSBnbG9iYWwgQ09DXG4gICAgICAgICAgICAgICAgdGlsZS5RQ0QgPSBjb250ZXh0LlFDRDtcbiAgICAgICAgICAgICAgICB0aWxlLlFDQyA9IGNvbnRleHQuUUNDLnNsaWNlKDApOyAvLyBjbG9uZSBvZiB0aGUgZ2xvYmFsIENPQ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUgPSB0aWxlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjkzOiAvLyBTdGFydCBvZiBkYXRhIChTT0QpXG4gICAgICAgICAgICAgIHRpbGUgPSBjb250ZXh0LmN1cnJlbnRUaWxlO1xuICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsaXplVGlsZShjb250ZXh0LCB0aWxlLmluZGV4KTtcbiAgICAgICAgICAgICAgICBidWlsZFBhY2tldHMoY29udGV4dCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBtb3ZpbmcgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YVxuICAgICAgICAgICAgICBsZW5ndGggPSB0aWxlLmRhdGFFbmQgLSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgcGFyc2VUaWxlUGFja2V0cyhjb250ZXh0LCBkYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1NTogLy8gVGlsZS1wYXJ0IGxlbmd0aHMsIG1haW4gaGVhZGVyIChUTE0pXG4gICAgICAgICAgICBjYXNlIDB4ZmY1NzogLy8gUGFja2V0IGxlbmd0aCwgbWFpbiBoZWFkZXIgKFBMTSlcbiAgICAgICAgICAgIGNhc2UgMHhmZjU4OiAvLyBQYWNrZXQgbGVuZ3RoLCB0aWxlLXBhcnQgaGVhZGVyIChQTFQpXG4gICAgICAgICAgICBjYXNlIDB4ZmY2NDogLy8gQ29tbWVudCAoQ09NKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgLy8gc2tpcHBpbmcgY29udGVudFxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjUzOiAvLyBDb2Rpbmcgc3R5bGUgY29tcG9uZW50IChDT0MpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNvZGVzdHJlYW0gY29kZSAweEZGNTMgKENPQykgaXMgbm90IGltcGxlbWVudGVkXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29kZXN0cmVhbSBjb2RlOiBcIiArIGNvZGUudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb05vdFJlY292ZXIgfHwgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJKUFg6IFRyeWluZyB0byByZWNvdmVyIGZyb206IFwiICsgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy50aWxlcyA9IHRyYW5zZm9ybUNvbXBvbmVudHMoY29udGV4dCk7XG4gICAgICB0aGlzLndpZHRoID0gY29udGV4dC5TSVouWHNpeiAtIGNvbnRleHQuU0laLlhPc2l6O1xuICAgICAgdGhpcy5oZWlnaHQgPSBjb250ZXh0LlNJWi5Zc2l6IC0gY29udGV4dC5TSVouWU9zaXo7XG4gICAgICB0aGlzLmNvbXBvbmVudHNDb3VudCA9IGNvbnRleHQuU0laLkNzaXo7XG4gICAgfSxcbiAgfTtcbiAgZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhjb21wb25lbnQsIHNpeikge1xuICAgIC8vIFNlY3Rpb24gQi4yIENvbXBvbmVudCBtYXBwaW5nXG4gICAgY29tcG9uZW50LngwID0gTWF0aC5jZWlsKHNpei5YT3NpeiAvIGNvbXBvbmVudC5YUnNpeik7XG4gICAgY29tcG9uZW50LngxID0gTWF0aC5jZWlsKHNpei5Yc2l6IC8gY29tcG9uZW50LlhSc2l6KTtcbiAgICBjb21wb25lbnQueTAgPSBNYXRoLmNlaWwoc2l6LllPc2l6IC8gY29tcG9uZW50LllSc2l6KTtcbiAgICBjb21wb25lbnQueTEgPSBNYXRoLmNlaWwoc2l6LllzaXogLyBjb21wb25lbnQuWVJzaXopO1xuICAgIGNvbXBvbmVudC53aWR0aCA9IGNvbXBvbmVudC54MSAtIGNvbXBvbmVudC54MDtcbiAgICBjb21wb25lbnQuaGVpZ2h0ID0gY29tcG9uZW50LnkxIC0gY29tcG9uZW50LnkwO1xuICB9XG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVHcmlkcyhjb250ZXh0LCBjb21wb25lbnRzKSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIC8vIFNlY3Rpb24gQi4zIERpdmlzaW9uIGludG8gdGlsZSBhbmQgdGlsZS1jb21wb25lbnRzXG4gICAgdmFyIHRpbGUsXG4gICAgICB0aWxlcyA9IFtdO1xuICAgIHZhciBudW1YdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Yc2l6IC0gc2l6LlhUT3NpeikgLyBzaXouWFRzaXopO1xuICAgIHZhciBudW1ZdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Zc2l6IC0gc2l6LllUT3NpeikgLyBzaXouWVRzaXopO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgbnVtWXRpbGVzOyBxKyspIHtcbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgbnVtWHRpbGVzOyBwKyspIHtcbiAgICAgICAgdGlsZSA9IHt9O1xuICAgICAgICB0aWxlLnR4MCA9IE1hdGgubWF4KHNpei5YVE9zaXogKyBwICogc2l6LlhUc2l6LCBzaXouWE9zaXopO1xuICAgICAgICB0aWxlLnR5MCA9IE1hdGgubWF4KHNpei5ZVE9zaXogKyBxICogc2l6LllUc2l6LCBzaXouWU9zaXopO1xuICAgICAgICB0aWxlLnR4MSA9IE1hdGgubWluKHNpei5YVE9zaXogKyAocCArIDEpICogc2l6LlhUc2l6LCBzaXouWHNpeik7XG4gICAgICAgIHRpbGUudHkxID0gTWF0aC5taW4oc2l6LllUT3NpeiArIChxICsgMSkgKiBzaXouWVRzaXosIHNpei5Zc2l6KTtcbiAgICAgICAgdGlsZS53aWR0aCA9IHRpbGUudHgxIC0gdGlsZS50eDA7XG4gICAgICAgIHRpbGUuaGVpZ2h0ID0gdGlsZS50eTEgLSB0aWxlLnR5MDtcbiAgICAgICAgdGlsZS5jb21wb25lbnRzID0gW107XG4gICAgICAgIHRpbGVzLnB1c2godGlsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQudGlsZXMgPSB0aWxlcztcblxuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjb21wb25lbnRzQ291bnQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHRpbGVzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgdmFyIHRpbGVDb21wb25lbnQgPSB7fTtcbiAgICAgICAgdGlsZSA9IHRpbGVzW2pdO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDAgPSBNYXRoLmNlaWwodGlsZS50eDAgLyBjb21wb25lbnQuWFJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTAgPSBNYXRoLmNlaWwodGlsZS50eTAgLyBjb21wb25lbnQuWVJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDEgPSBNYXRoLmNlaWwodGlsZS50eDEgLyBjb21wb25lbnQuWFJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTEgPSBNYXRoLmNlaWwodGlsZS50eTEgLyBjb21wb25lbnQuWVJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LndpZHRoID0gdGlsZUNvbXBvbmVudC50Y3gxIC0gdGlsZUNvbXBvbmVudC50Y3gwO1xuICAgICAgICB0aWxlQ29tcG9uZW50LmhlaWdodCA9IHRpbGVDb21wb25lbnQudGN5MSAtIHRpbGVDb21wb25lbnQudGN5MDtcbiAgICAgICAgdGlsZS5jb21wb25lbnRzW2ldID0gdGlsZUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpIHtcbiAgICB2YXIgY29kT3JDb2MgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAoIWNvZE9yQ29jLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpIHtcbiAgICAgIHJlc3VsdC5QUHggPSAxNTtcbiAgICAgIHJlc3VsdC5QUHkgPSAxNTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LlBQeCA9IGNvZE9yQ29jLnByZWNpbmN0c1NpemVzW3JdLlBQeDtcbiAgICAgIHJlc3VsdC5QUHkgPSBjb2RPckNvYy5wcmVjaW5jdHNTaXplc1tyXS5QUHk7XG4gICAgfVxuICAgIC8vIGNhbGN1bGF0ZSBjb2RlYmxvY2sgc2l6ZSBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiBCLjdcbiAgICByZXN1bHQueGNiXyA9XG4gICAgICByID4gMFxuICAgICAgICA/IE1hdGgubWluKGNvZE9yQ29jLnhjYiwgcmVzdWx0LlBQeCAtIDEpXG4gICAgICAgIDogTWF0aC5taW4oY29kT3JDb2MueGNiLCByZXN1bHQuUFB4KTtcbiAgICByZXN1bHQueWNiXyA9XG4gICAgICByID4gMFxuICAgICAgICA/IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSAtIDEpXG4gICAgICAgIDogTWF0aC5taW4oY29kT3JDb2MueWNiLCByZXN1bHQuUFB5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkUHJlY2luY3RzKGNvbnRleHQsIHJlc29sdXRpb24sIGRpbWVuc2lvbnMpIHtcbiAgICAvLyBTZWN0aW9uIEIuNiBEaXZpc2lvbiByZXNvbHV0aW9uIHRvIHByZWNpbmN0c1xuICAgIHZhciBwcmVjaW5jdFdpZHRoID0gMSA8PCBkaW1lbnNpb25zLlBQeDtcbiAgICB2YXIgcHJlY2luY3RIZWlnaHQgPSAxIDw8IGRpbWVuc2lvbnMuUFB5O1xuICAgIC8vIEphc3BlciBpbnRyb2R1Y2VzIGNvZGVibG9jayBncm91cHMgZm9yIG1hcHBpbmcgZWFjaCBzdWJiYW5kIGNvZGVibG9ja3NcbiAgICAvLyB0byBwcmVjaW5jdHMuIFByZWNpbmN0IHBhcnRpdGlvbiBkaXZpZGVzIGEgcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gd2lkdGhcbiAgICAvLyBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMuIFRoZSBzdWJiYW5kIHRoYXQgYmVsb25ncyB0byB0aGUgcmVzb2x1dGlvbiBsZXZlbFxuICAgIC8vIGhhcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gdGhlIGxldmVsLCB1bmxlc3MgaXQgaXMgdGhlIHplcm8gcmVzb2x1dGlvbi5cblxuICAgIC8vIEZyb20gSmFzcGVyIGRvY3VtZW50YXRpb246IGpwZWcyMDAwLnBkZiwgc2VjdGlvbiBLOiBUaWVyLTIgY29kaW5nOlxuICAgIC8vIFRoZSBwcmVjaW5jdCBwYXJ0aXRpb25pbmcgZm9yIGEgcGFydGljdWxhciBzdWJiYW5kIGlzIGRlcml2ZWQgZnJvbSBhXG4gICAgLy8gcGFydGl0aW9uaW5nIG9mIGl0cyBwYXJlbnQgTEwgYmFuZCAoaS5lLiwgdGhlIExMIGJhbmQgYXQgdGhlIG5leHQgaGlnaGVyXG4gICAgLy8gcmVzb2x1dGlvbiBsZXZlbCkuLi4gVGhlIExMIGJhbmQgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCBpc1xuICAgIC8vIGRpdmlkZWQgaW50byBwcmVjaW5jdHMuLi4gRWFjaCBvZiB0aGUgcmVzdWx0aW5nIHByZWNpbmN0IHJlZ2lvbnMgaXMgdGhlblxuICAgIC8vIG1hcHBlZCBpbnRvIGl0cyBjaGlsZCBzdWJiYW5kcyAoaWYgYW55KSBhdCB0aGUgbmV4dCBsb3dlciByZXNvbHV0aW9uXG4gICAgLy8gbGV2ZWwuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uXG4gICAgLy8gKHUsIHYpID0gKGNlaWwoeC8yKSwgY2VpbCh5LzIpKSB3aGVyZSAoeCwgeSkgYW5kICh1LCB2KSBhcmUgdGhlXG4gICAgLy8gY29vcmRpbmF0ZXMgb2YgYSBwb2ludCBpbiB0aGUgTEwgYmFuZCBhbmQgY2hpbGQgc3ViYmFuZCwgcmVzcGVjdGl2ZWx5LlxuICAgIHZhciBpc1plcm9SZXMgPSByZXNvbHV0aW9uLnJlc0xldmVsID09PSAwO1xuICAgIHZhciBwcmVjaW5jdFdpZHRoSW5TdWJiYW5kID0gMSA8PCAoZGltZW5zaW9ucy5QUHggKyAoaXNaZXJvUmVzID8gMCA6IC0xKSk7XG4gICAgdmFyIHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kID0gMSA8PCAoZGltZW5zaW9ucy5QUHkgKyAoaXNaZXJvUmVzID8gMCA6IC0xKSk7XG4gICAgdmFyIG51bXByZWNpbmN0c3dpZGUgPVxuICAgICAgcmVzb2x1dGlvbi50cngxID4gcmVzb2x1dGlvbi50cngwXG4gICAgICAgID8gTWF0aC5jZWlsKHJlc29sdXRpb24udHJ4MSAvIHByZWNpbmN0V2lkdGgpIC1cbiAgICAgICAgICBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ4MCAvIHByZWNpbmN0V2lkdGgpXG4gICAgICAgIDogMDtcbiAgICB2YXIgbnVtcHJlY2luY3RzaGlnaCA9XG4gICAgICByZXNvbHV0aW9uLnRyeTEgPiByZXNvbHV0aW9uLnRyeTBcbiAgICAgICAgPyBNYXRoLmNlaWwocmVzb2x1dGlvbi50cnkxIC8gcHJlY2luY3RIZWlnaHQpIC1cbiAgICAgICAgICBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ5MCAvIHByZWNpbmN0SGVpZ2h0KVxuICAgICAgICA6IDA7XG4gICAgdmFyIG51bXByZWNpbmN0cyA9IG51bXByZWNpbmN0c3dpZGUgKiBudW1wcmVjaW5jdHNoaWdoO1xuXG4gICAgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMgPSB7XG4gICAgICBwcmVjaW5jdFdpZHRoLFxuICAgICAgcHJlY2luY3RIZWlnaHQsXG4gICAgICBudW1wcmVjaW5jdHN3aWRlLFxuICAgICAgbnVtcHJlY2luY3RzaGlnaCxcbiAgICAgIG51bXByZWNpbmN0cyxcbiAgICAgIHByZWNpbmN0V2lkdGhJblN1YmJhbmQsXG4gICAgICBwcmVjaW5jdEhlaWdodEluU3ViYmFuZCxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBkaW1lbnNpb25zKSB7XG4gICAgLy8gU2VjdGlvbiBCLjcgRGl2aXNpb24gc3ViLWJhbmQgaW50byBjb2RlLWJsb2Nrc1xuICAgIHZhciB4Y2JfID0gZGltZW5zaW9ucy54Y2JfO1xuICAgIHZhciB5Y2JfID0gZGltZW5zaW9ucy55Y2JfO1xuICAgIHZhciBjb2RlYmxvY2tXaWR0aCA9IDEgPDwgeGNiXztcbiAgICB2YXIgY29kZWJsb2NrSGVpZ2h0ID0gMSA8PCB5Y2JfO1xuICAgIHZhciBjYngwID0gc3ViYmFuZC50YngwID4+IHhjYl87XG4gICAgdmFyIGNieTAgPSBzdWJiYW5kLnRieTAgPj4geWNiXztcbiAgICB2YXIgY2J4MSA9IChzdWJiYW5kLnRieDEgKyBjb2RlYmxvY2tXaWR0aCAtIDEpID4+IHhjYl87XG4gICAgdmFyIGNieTEgPSAoc3ViYmFuZC50YnkxICsgY29kZWJsb2NrSGVpZ2h0IC0gMSkgPj4geWNiXztcbiAgICB2YXIgcHJlY2luY3RQYXJhbWV0ZXJzID0gc3ViYmFuZC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycztcbiAgICB2YXIgY29kZWJsb2NrcyA9IFtdO1xuICAgIHZhciBwcmVjaW5jdHMgPSBbXTtcbiAgICB2YXIgaSwgaiwgY29kZWJsb2NrLCBwcmVjaW5jdE51bWJlcjtcbiAgICBmb3IgKGogPSBjYnkwOyBqIDwgY2J5MTsgaisrKSB7XG4gICAgICBmb3IgKGkgPSBjYngwOyBpIDwgY2J4MTsgaSsrKSB7XG4gICAgICAgIGNvZGVibG9jayA9IHtcbiAgICAgICAgICBjYng6IGksXG4gICAgICAgICAgY2J5OiBqLFxuICAgICAgICAgIHRieDA6IGNvZGVibG9ja1dpZHRoICogaSxcbiAgICAgICAgICB0YnkwOiBjb2RlYmxvY2tIZWlnaHQgKiBqLFxuICAgICAgICAgIHRieDE6IGNvZGVibG9ja1dpZHRoICogKGkgKyAxKSxcbiAgICAgICAgICB0YnkxOiBjb2RlYmxvY2tIZWlnaHQgKiAoaiArIDEpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvZGVibG9jay50YngwXyA9IE1hdGgubWF4KHN1YmJhbmQudGJ4MCwgY29kZWJsb2NrLnRieDApO1xuICAgICAgICBjb2RlYmxvY2sudGJ5MF8gPSBNYXRoLm1heChzdWJiYW5kLnRieTAsIGNvZGVibG9jay50YnkwKTtcbiAgICAgICAgY29kZWJsb2NrLnRieDFfID0gTWF0aC5taW4oc3ViYmFuZC50YngxLCBjb2RlYmxvY2sudGJ4MSk7XG4gICAgICAgIGNvZGVibG9jay50YnkxXyA9IE1hdGgubWluKHN1YmJhbmQudGJ5MSwgY29kZWJsb2NrLnRieTEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBwcmVjaW5jdCBudW1iZXIgZm9yIHRoaXMgY29kZWJsb2NrLCBjb2RlYmxvY2sgcG9zaXRpb25cbiAgICAgICAgLy8gc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGl0cyBzdWJiYW5kLCB1c2UgYWN0dWFsIGRpbWVuc2lvbiBhbmQgcG9zaXRpb25cbiAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdXQgY29kZWJsb2NrIGdyb3VwIHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgdmFyIHBpID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAoY29kZWJsb2NrLnRieDBfIC0gc3ViYmFuZC50YngwKSAvXG4gICAgICAgICAgICBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aEluU3ViYmFuZFxuICAgICAgICApO1xuICAgICAgICB2YXIgcGogPSBNYXRoLmZsb29yKFxuICAgICAgICAgIChjb2RlYmxvY2sudGJ5MF8gLSBzdWJiYW5kLnRieTApIC9cbiAgICAgICAgICAgIHByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdEhlaWdodEluU3ViYmFuZFxuICAgICAgICApO1xuICAgICAgICBwcmVjaW5jdE51bWJlciA9IHBpICsgcGogKiBwcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTtcblxuICAgICAgICBjb2RlYmxvY2sucHJlY2luY3ROdW1iZXIgPSBwcmVjaW5jdE51bWJlcjtcbiAgICAgICAgY29kZWJsb2NrLnN1YmJhbmRUeXBlID0gc3ViYmFuZC50eXBlO1xuICAgICAgICBjb2RlYmxvY2suTGJsb2NrID0gMztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29kZWJsb2NrLnRieDFfIDw9IGNvZGVibG9jay50YngwXyB8fFxuICAgICAgICAgIGNvZGVibG9jay50YnkxXyA8PSBjb2RlYmxvY2sudGJ5MF9cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7XG4gICAgICAgIC8vIGJ1aWxkaW5nIHByZWNpbmN0IGZvciB0aGUgc3ViLWJhbmRcbiAgICAgICAgdmFyIHByZWNpbmN0ID0gcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXTtcbiAgICAgICAgaWYgKHByZWNpbmN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoaSA8IHByZWNpbmN0LmNieE1pbikge1xuICAgICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gaTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBwcmVjaW5jdC5jYnhNYXgpIHtcbiAgICAgICAgICAgIHByZWNpbmN0LmNieE1heCA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqIDwgcHJlY2luY3QuY2J5TWluKSB7XG4gICAgICAgICAgICBwcmVjaW5jdC5jYnhNaW4gPSBqO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaiA+IHByZWNpbmN0LmNieU1heCkge1xuICAgICAgICAgICAgcHJlY2luY3QuY2J5TWF4ID0gajtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXSA9IHByZWNpbmN0ID0ge1xuICAgICAgICAgICAgY2J4TWluOiBpLFxuICAgICAgICAgICAgY2J5TWluOiBqLFxuICAgICAgICAgICAgY2J4TWF4OiBpLFxuICAgICAgICAgICAgY2J5TWF4OiBqLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0ID0gcHJlY2luY3Q7XG4gICAgICB9XG4gICAgfVxuICAgIHN1YmJhbmQuY29kZWJsb2NrUGFyYW1ldGVycyA9IHtcbiAgICAgIGNvZGVibG9ja1dpZHRoOiB4Y2JfLFxuICAgICAgY29kZWJsb2NrSGVpZ2h0OiB5Y2JfLFxuICAgICAgbnVtY29kZWJsb2Nrd2lkZTogY2J4MSAtIGNieDAgKyAxLFxuICAgICAgbnVtY29kZWJsb2NraGlnaDogY2J5MSAtIGNieTAgKyAxLFxuICAgIH07XG4gICAgc3ViYmFuZC5jb2RlYmxvY2tzID0gY29kZWJsb2NrcztcbiAgICBzdWJiYW5kLnByZWNpbmN0cyA9IHByZWNpbmN0cztcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcHJlY2luY3ROdW1iZXIsIGxheWVyTnVtYmVyKSB7XG4gICAgdmFyIHByZWNpbmN0Q29kZWJsb2NrcyA9IFtdO1xuICAgIC8vIFNlY3Rpb24gQi4xMC44IE9yZGVyIG9mIGluZm8gaW4gcGFja2V0XG4gICAgdmFyIHN1YmJhbmRzID0gcmVzb2x1dGlvbi5zdWJiYW5kcztcbiAgICAvLyBzdWItYmFuZHMgYWxyZWFkeSBvcmRlcmVkIGluICdMTCcsICdITCcsICdMSCcsIGFuZCAnSEgnIHNlcXVlbmNlXG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHN1YmJhbmQgPSBzdWJiYW5kc1tpXTtcbiAgICAgIHZhciBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gY29kZWJsb2Nrcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHZhciBjb2RlYmxvY2sgPSBjb2RlYmxvY2tzW2pdO1xuICAgICAgICBpZiAoY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyICE9PSBwcmVjaW5jdE51bWJlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHByZWNpbmN0Q29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsYXllck51bWJlcixcbiAgICAgIGNvZGVibG9ja3M6IHByZWNpbmN0Q29kZWJsb2NrcyxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHtcbiAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsXG4gICAgICAgIHRpbGUuY29tcG9uZW50c1txXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBsID0gMCxcbiAgICAgIHIgPSAwLFxuICAgICAgaSA9IDAsXG4gICAgICBrID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS4xIExheWVyLXJlc29sdXRpb24tY29tcG9uZW50LXBvc2l0aW9uXG4gICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHtcbiAgICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7ICkge1xuICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpO1xuICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgciA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHtcbiAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsXG4gICAgICAgIHRpbGUuY29tcG9uZW50c1txXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciByID0gMCxcbiAgICAgIGwgPSAwLFxuICAgICAgaSA9IDAsXG4gICAgICBrID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS4yIFJlc29sdXRpb24tbGF5ZXItY29tcG9uZW50LXBvc2l0aW9uXG4gICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykge1xuICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHtcbiAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7ICkge1xuICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpO1xuICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbCA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFJlc29sdXRpb25Qb3NpdGlvbkNvbXBvbmVudExheWVySXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBsLCByLCBjLCBwO1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgoXG4gICAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCxcbiAgICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnRcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciBtYXhOdW1QcmVjaW5jdHNJbkxldmVsID0gbmV3IEludDMyQXJyYXkoXG4gICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgKyAxXG4gICAgKTtcbiAgICBmb3IgKHIgPSAwOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgKytyKSB7XG4gICAgICB2YXIgbWF4TnVtUHJlY2luY3RzID0gMDtcbiAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7ICsrYykge1xuICAgICAgICB2YXIgcmVzb2x1dGlvbnMgPSB0aWxlLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnM7XG4gICAgICAgIGlmIChyIDwgcmVzb2x1dGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgbWF4TnVtUHJlY2luY3RzID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBtYXhOdW1QcmVjaW5jdHMsXG4gICAgICAgICAgICByZXNvbHV0aW9uc1tyXS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF4TnVtUHJlY2luY3RzSW5MZXZlbFtyXSA9IG1heE51bVByZWNpbmN0cztcbiAgICB9XG4gICAgbCA9IDA7XG4gICAgciA9IDA7XG4gICAgYyA9IDA7XG4gICAgcCA9IDA7XG5cbiAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkge1xuICAgICAgLy8gU2VjdGlvbiBCLjEyLjEuMyBSZXNvbHV0aW9uLXBvc2l0aW9uLWNvbXBvbmVudC1sYXllclxuICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgZm9yICg7IHAgPCBtYXhOdW1QcmVjaW5jdHNJbkxldmVsW3JdOyBwKyspIHtcbiAgICAgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBpZiAociA+IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgaWYgKHAgPj0gbnVtcHJlY2luY3RzKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcCwgbCk7XG4gICAgICAgICAgICAgIGwrKztcbiAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwID0gMDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBKcHhFcnJvcihcIk91dCBvZiBwYWNrZXRzXCIpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4O1xuICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdO1xuICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgdmFyIHByZWNpbmN0c1NpemVzID0gZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSh0aWxlKTtcbiAgICB2YXIgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMgPSBwcmVjaW5jdHNTaXplcztcbiAgICB2YXIgbCA9IDAsXG4gICAgICByID0gMCxcbiAgICAgIGMgPSAwLFxuICAgICAgcHggPSAwLFxuICAgICAgcHkgPSAwO1xuXG4gICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHtcbiAgICAgIC8vIFNlY3Rpb24gQi4xMi4xLjQgUG9zaXRpb24tY29tcG9uZW50LXJlc29sdXRpb24tbGF5ZXJcbiAgICAgIGZvciAoOyBweSA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bUhpZ2g7IHB5KyspIHtcbiAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykge1xuICAgICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID1cbiAgICAgICAgICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7XG4gICAgICAgICAgICBmb3IgKDsgciA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykge1xuICAgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTtcbiAgICAgICAgICAgICAgdmFyIHNpemVJbkltYWdlU2NhbGUgPVxuICAgICAgICAgICAgICAgIHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoXG4gICAgICAgICAgICAgICAgcHgsXG4gICAgICAgICAgICAgICAgcHksXG4gICAgICAgICAgICAgICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyxcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChrID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTtcbiAgICAgICAgICAgICAgICBsKys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjID0gMDtcbiAgICAgICAgfVxuICAgICAgICBweCA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7XG4gICAgdmFyIGwgPSAwLFxuICAgICAgciA9IDAsXG4gICAgICBjID0gMCxcbiAgICAgIHB4ID0gMCxcbiAgICAgIHB5ID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS41IENvbXBvbmVudC1wb3NpdGlvbi1yZXNvbHV0aW9uLWxheWVyXG4gICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgIHZhciBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY107XG4gICAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPVxuICAgICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7XG4gICAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykge1xuICAgICAgICAgICAgZm9yICg7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoXG4gICAgICAgICAgICAgICAgcHgsXG4gICAgICAgICAgICAgICAgcHksXG4gICAgICAgICAgICAgICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyxcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChrID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTtcbiAgICAgICAgICAgICAgICBsKys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBweCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHkgPSAwO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiT3V0IG9mIHBhY2tldHNcIik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcmVjaW5jdEluZGV4SWZFeGlzdChcbiAgICBweEluZGV4LFxuICAgIHB5SW5kZXgsXG4gICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICBwcmVjaW5jdEl0ZXJhdGlvblNpemVzLFxuICAgIHJlc29sdXRpb25cbiAgKSB7XG4gICAgdmFyIHBvc1ggPSBweEluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5XaWR0aDtcbiAgICB2YXIgcG9zWSA9IHB5SW5kZXggKiBwcmVjaW5jdEl0ZXJhdGlvblNpemVzLm1pbkhlaWdodDtcbiAgICBpZiAoXG4gICAgICBwb3NYICUgc2l6ZUluSW1hZ2VTY2FsZS53aWR0aCAhPT0gMCB8fFxuICAgICAgcG9zWSAlIHNpemVJbkltYWdlU2NhbGUuaGVpZ2h0ICE9PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHN0YXJ0UHJlY2luY3RSb3dJbmRleCA9XG4gICAgICAocG9zWSAvIHNpemVJbkltYWdlU2NhbGUud2lkdGgpICpcbiAgICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7XG4gICAgcmV0dXJuIHBvc1ggLyBzaXplSW5JbWFnZVNjYWxlLmhlaWdodCArIHN0YXJ0UHJlY2luY3RSb3dJbmRleDtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpIHtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gdGlsZS5jb21wb25lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIHZhciBtaW5IZWlnaHQgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIHZhciBtYXhOdW1XaWRlID0gMDtcbiAgICB2YXIgbWF4TnVtSGlnaCA9IDA7XG4gICAgdmFyIHNpemVQZXJDb21wb25lbnQgPSBuZXcgQXJyYXkoY29tcG9uZW50c0NvdW50KTtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9XG4gICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgdmFyIHNpemVQZXJSZXNvbHV0aW9uID0gbmV3IEFycmF5KGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCArIDEpO1xuICAgICAgdmFyIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB2YXIgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB2YXIgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQgPSAwO1xuICAgICAgdmFyIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50ID0gMDtcbiAgICAgIHZhciBzY2FsZSA9IDE7XG4gICAgICBmb3IgKHZhciByID0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByID49IDA7IC0tcikge1xuICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTtcbiAgICAgICAgdmFyIHdpZHRoQ3VycmVudFJlc29sdXRpb24gPVxuICAgICAgICAgIHNjYWxlICogcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aDtcbiAgICAgICAgdmFyIGhlaWdodEN1cnJlbnRSZXNvbHV0aW9uID1cbiAgICAgICAgICBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0O1xuICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1pbihcbiAgICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsXG4gICAgICAgICAgd2lkdGhDdXJyZW50UmVzb2x1dGlvblxuICAgICAgICApO1xuICAgICAgICBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4oXG4gICAgICAgICAgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCxcbiAgICAgICAgICBoZWlnaHRDdXJyZW50UmVzb2x1dGlvblxuICAgICAgICApO1xuICAgICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IE1hdGgubWF4KFxuICAgICAgICAgIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGVcbiAgICAgICAgKTtcbiAgICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChcbiAgICAgICAgICBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgICByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHNoaWdoXG4gICAgICAgICk7XG4gICAgICAgIHNpemVQZXJSZXNvbHV0aW9uW3JdID0ge1xuICAgICAgICAgIHdpZHRoOiB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0Q3VycmVudFJlc29sdXRpb24sXG4gICAgICAgIH07XG4gICAgICAgIHNjYWxlIDw8PSAxO1xuICAgICAgfVxuICAgICAgbWluV2lkdGggPSBNYXRoLm1pbihtaW5XaWR0aCwgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50KTtcbiAgICAgIG1pbkhlaWdodCA9IE1hdGgubWluKG1pbkhlaWdodCwgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCk7XG4gICAgICBtYXhOdW1XaWRlID0gTWF0aC5tYXgobWF4TnVtV2lkZSwgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQpO1xuICAgICAgbWF4TnVtSGlnaCA9IE1hdGgubWF4KG1heE51bUhpZ2gsIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50KTtcbiAgICAgIHNpemVQZXJDb21wb25lbnRbY10gPSB7XG4gICAgICAgIHJlc29sdXRpb25zOiBzaXplUGVyUmVzb2x1dGlvbixcbiAgICAgICAgbWluV2lkdGg6IG1pbldpZHRoQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgbWluSGVpZ2h0OiBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50LFxuICAgICAgICBtYXhOdW1XaWRlOiBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgbWF4TnVtSGlnaDogbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29tcG9uZW50czogc2l6ZVBlckNvbXBvbmVudCxcbiAgICAgIG1pbldpZHRoLFxuICAgICAgbWluSGVpZ2h0LFxuICAgICAgbWF4TnVtV2lkZSxcbiAgICAgIG1heE51bUhpZ2gsXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBidWlsZFBhY2tldHMoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgLy8gQ3JlYXRpbmcgcmVzb2x1dGlvbnMgYW5kIHN1Yi1iYW5kcyBmb3IgZWFjaCBjb21wb25lbnRcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9XG4gICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgLy8gU2VjdGlvbiBCLjUgUmVzb2x1dGlvbiBsZXZlbHMgYW5kIHN1Yi1iYW5kc1xuICAgICAgdmFyIHJlc29sdXRpb25zID0gW107XG4gICAgICB2YXIgc3ViYmFuZHMgPSBbXTtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7XG4gICAgICAgIHZhciBibG9ja3NEaW1lbnNpb25zID0gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpO1xuICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IHt9O1xuICAgICAgICB2YXIgc2NhbGUgPSAxIDw8IChkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByKTtcbiAgICAgICAgcmVzb2x1dGlvbi50cngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpO1xuICAgICAgICByZXNvbHV0aW9uLnRyeTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7XG4gICAgICAgIHJlc29sdXRpb24udHJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTtcbiAgICAgICAgcmVzb2x1dGlvbi50cnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpO1xuICAgICAgICByZXNvbHV0aW9uLnJlc0xldmVsID0gcjtcbiAgICAgICAgYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgYmxvY2tzRGltZW5zaW9ucyk7XG4gICAgICAgIHJlc29sdXRpb25zLnB1c2gocmVzb2x1dGlvbik7XG5cbiAgICAgICAgdmFyIHN1YmJhbmQ7XG4gICAgICAgIGlmIChyID09PSAwKSB7XG4gICAgICAgICAgLy8gb25lIHN1Yi1iYW5kIChMTCkgd2l0aCBsYXN0IGRlY29tcG9zaXRpb25cbiAgICAgICAgICBzdWJiYW5kID0ge307XG4gICAgICAgICAgc3ViYmFuZC50eXBlID0gXCJMTFwiO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIHNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gc2NhbGUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIHNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTtcbiAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuICAgICAgICAgIHJlc29sdXRpb24uc3ViYmFuZHMgPSBbc3ViYmFuZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJzY2FsZSA9IDEgPDwgKGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCAtIHIgKyAxKTtcbiAgICAgICAgICB2YXIgcmVzb2x1dGlvblN1YmJhbmRzID0gW107XG4gICAgICAgICAgLy8gdGhyZWUgc3ViLWJhbmRzIChITCwgTEggYW5kIEhIKSB3aXRoIHJlc3Qgb2YgZGVjb21wb3NpdGlvbnNcbiAgICAgICAgICBzdWJiYW5kID0ge307XG4gICAgICAgICAgc3ViYmFuZC50eXBlID0gXCJITFwiO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSAtIDAuNSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7XG4gICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTtcbiAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTtcblxuICAgICAgICAgIHN1YmJhbmQgPSB7fTtcbiAgICAgICAgICBzdWJiYW5kLnR5cGUgPSBcIkxIXCI7XG4gICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTtcbiAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuXG4gICAgICAgICAgc3ViYmFuZCA9IHt9O1xuICAgICAgICAgIHN1YmJhbmQudHlwZSA9IFwiSEhcIjtcbiAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSAtIDAuNSk7XG4gICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpO1xuICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7XG4gICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7XG5cbiAgICAgICAgICByZXNvbHV0aW9uLnN1YmJhbmRzID0gcmVzb2x1dGlvblN1YmJhbmRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wb25lbnQucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9ucztcbiAgICAgIGNvbXBvbmVudC5zdWJiYW5kcyA9IHN1YmJhbmRzO1xuICAgIH1cbiAgICAvLyBHZW5lcmF0ZSB0aGUgcGFja2V0cyBzZXF1ZW5jZVxuICAgIHZhciBwcm9ncmVzc2lvbk9yZGVyID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7XG4gICAgc3dpdGNoIChwcm9ncmVzc2lvbk9yZGVyKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvbkxheWVyQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0aWxlLnBhY2tldHNJdGVyYXRvciA9IG5ldyBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKGBVbnN1cHBvcnRlZCBwcm9ncmVzc2lvbiBvcmRlciAke3Byb2dyZXNzaW9uT3JkZXJ9YCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgb2Zmc2V0LCBkYXRhTGVuZ3RoKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICB2YXIgYnVmZmVyLFxuICAgICAgYnVmZmVyU2l6ZSA9IDAsXG4gICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGNvdW50KSB7XG4gICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IGNvdW50KSB7XG4gICAgICAgIHZhciBiID0gZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl07XG4gICAgICAgIHBvc2l0aW9uKys7XG4gICAgICAgIGlmIChza2lwTmV4dEJpdCkge1xuICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgNykgfCBiO1xuICAgICAgICAgIGJ1ZmZlclNpemUgKz0gNztcbiAgICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgOCkgfCBiO1xuICAgICAgICAgIGJ1ZmZlclNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiA9PT0gMHhmZikge1xuICAgICAgICAgIHNraXBOZXh0Qml0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVmZmVyU2l6ZSAtPSBjb3VudDtcbiAgICAgIHJldHVybiAoYnVmZmVyID4+PiBidWZmZXJTaXplKSAmICgoMSA8PCBjb3VudCkgLSAxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2tpcE1hcmtlcklmRXF1YWwodmFsdWUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbiAtIDFdID09PSAweGZmICYmXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSB2YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIHNraXBCeXRlcygxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBkYXRhW29mZnNldCArIHBvc2l0aW9uXSA9PT0gMHhmZiAmJlxuICAgICAgICBkYXRhW29mZnNldCArIHBvc2l0aW9uICsgMV0gPT09IHZhbHVlXG4gICAgICApIHtcbiAgICAgICAgc2tpcEJ5dGVzKDIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2tpcEJ5dGVzKGNvdW50KSB7XG4gICAgICBwb3NpdGlvbiArPSBjb3VudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKSB7XG4gICAgICBidWZmZXJTaXplID0gMDtcbiAgICAgIGlmIChza2lwTmV4dEJpdCkge1xuICAgICAgICBwb3NpdGlvbisrO1xuICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWFkQ29kaW5ncGFzc2VzKCkge1xuICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gcmVhZEJpdHMoMik7XG4gICAgICBpZiAodmFsdWUgPCAzKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSArIDM7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHJlYWRCaXRzKDUpO1xuICAgICAgaWYgKHZhbHVlIDwgMzEpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICsgNjtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gcmVhZEJpdHMoNyk7XG4gICAgICByZXR1cm4gdmFsdWUgKyAzNztcbiAgICB9XG4gICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgdmFyIHNvcE1hcmtlclVzZWQgPSBjb250ZXh0LkNPRC5zb3BNYXJrZXJVc2VkO1xuICAgIHZhciBlcGhNYXJrZXJVc2VkID0gY29udGV4dC5DT0QuZXBoTWFya2VyVXNlZDtcbiAgICB2YXIgcGFja2V0c0l0ZXJhdG9yID0gdGlsZS5wYWNrZXRzSXRlcmF0b3I7XG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgZGF0YUxlbmd0aCkge1xuICAgICAgYWxpZ25Ub0J5dGUoKTtcbiAgICAgIGlmIChzb3BNYXJrZXJVc2VkICYmIHNraXBNYXJrZXJJZkVxdWFsKDB4OTEpKSB7XG4gICAgICAgIC8vIFNraXAgYWxzbyBtYXJrZXIgc2VnbWVudCBsZW5ndGggYW5kIHBhY2tldCBzZXF1ZW5jZSBJRFxuICAgICAgICBza2lwQnl0ZXMoNCk7XG4gICAgICB9XG4gICAgICB2YXIgcGFja2V0ID0gcGFja2V0c0l0ZXJhdG9yLm5leHRQYWNrZXQoKTtcbiAgICAgIGlmICghcmVhZEJpdHMoMSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbGF5ZXJOdW1iZXIgPSBwYWNrZXQubGF5ZXJOdW1iZXI7XG4gICAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgY29kZWJsb2NrO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcGFja2V0LmNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXQuY29kZWJsb2Nrc1tpXTtcbiAgICAgICAgdmFyIHByZWNpbmN0ID0gY29kZWJsb2NrLnByZWNpbmN0O1xuICAgICAgICB2YXIgY29kZWJsb2NrQ29sdW1uID0gY29kZWJsb2NrLmNieCAtIHByZWNpbmN0LmNieE1pbjtcbiAgICAgICAgdmFyIGNvZGVibG9ja1JvdyA9IGNvZGVibG9jay5jYnkgLSBwcmVjaW5jdC5jYnlNaW47XG4gICAgICAgIHZhciBjb2RlYmxvY2tJbmNsdWRlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZmlyc3RUaW1lSW5jbHVzaW9uID0gZmFsc2U7XG4gICAgICAgIHZhciB2YWx1ZVJlYWR5O1xuICAgICAgICBpZiAoY29kZWJsb2NrLmluY2x1ZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb2RlYmxvY2tJbmNsdWRlZCA9ICEhcmVhZEJpdHMoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVhZGluZyBpbmNsdXNpb24gdHJlZVxuICAgICAgICAgIHByZWNpbmN0ID0gY29kZWJsb2NrLnByZWNpbmN0O1xuICAgICAgICAgIHZhciBpbmNsdXNpb25UcmVlLCB6ZXJvQml0UGxhbmVzVHJlZTtcbiAgICAgICAgICBpZiAocHJlY2luY3QuaW5jbHVzaW9uVHJlZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbmNsdXNpb25UcmVlID0gcHJlY2luY3QuaW5jbHVzaW9uVHJlZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYnVpbGRpbmcgaW5jbHVzaW9uIGFuZCB6ZXJvIGJpdC1wbGFuZXMgdHJlZXNcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHByZWNpbmN0LmNieE1heCAtIHByZWNpbmN0LmNieE1pbiArIDE7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcHJlY2luY3QuY2J5TWF4IC0gcHJlY2luY3QuY2J5TWluICsgMTtcbiAgICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBuZXcgSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBsYXllck51bWJlcik7XG4gICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IG5ldyBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgcHJlY2luY3QuaW5jbHVzaW9uVHJlZSA9IGluY2x1c2lvblRyZWU7XG4gICAgICAgICAgICBwcmVjaW5jdC56ZXJvQml0UGxhbmVzVHJlZSA9IHplcm9CaXRQbGFuZXNUcmVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbmNsdXNpb25UcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93LCBsYXllck51bWJlcikpIHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlUmVhZHkgPSAhaW5jbHVzaW9uVHJlZS5uZXh0TGV2ZWwoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgY29kZWJsb2NrLmluY2x1ZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGNvZGVibG9ja0luY2x1ZGVkID0gZmlyc3RUaW1lSW5jbHVzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmNsdXNpb25UcmVlLmluY3JlbWVudFZhbHVlKGxheWVyTnVtYmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvZGVibG9ja0luY2x1ZGVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0VGltZUluY2x1c2lvbikge1xuICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlID0gcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWU7XG4gICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUucmVzZXQoY29kZWJsb2NrQ29sdW1uLCBjb2RlYmxvY2tSb3cpO1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAocmVhZEJpdHMoMSkpIHtcbiAgICAgICAgICAgICAgdmFsdWVSZWFkeSA9ICF6ZXJvQml0UGxhbmVzVHJlZS5uZXh0TGV2ZWwoKTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlUmVhZHkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUuaW5jcmVtZW50VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMgPSB6ZXJvQml0UGxhbmVzVHJlZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kaW5ncGFzc2VzID0gcmVhZENvZGluZ3Bhc3NlcygpO1xuICAgICAgICB3aGlsZSAocmVhZEJpdHMoMSkpIHtcbiAgICAgICAgICBjb2RlYmxvY2suTGJsb2NrKys7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGluZ3Bhc3Nlc0xvZzIgPSBsb2cyKGNvZGluZ3Bhc3Nlcyk7XG4gICAgICAgIC8vIHJvdW5kaW5nIGRvd24gbG9nMlxuICAgICAgICB2YXIgYml0cyA9XG4gICAgICAgICAgKGNvZGluZ3Bhc3NlcyA8IDEgPDwgY29kaW5ncGFzc2VzTG9nMlxuICAgICAgICAgICAgPyBjb2RpbmdwYXNzZXNMb2cyIC0gMVxuICAgICAgICAgICAgOiBjb2RpbmdwYXNzZXNMb2cyKSArIGNvZGVibG9jay5MYmxvY2s7XG4gICAgICAgIHZhciBjb2RlZERhdGFMZW5ndGggPSByZWFkQml0cyhiaXRzKTtcbiAgICAgICAgcXVldWUucHVzaCh7XG4gICAgICAgICAgY29kZWJsb2NrLFxuICAgICAgICAgIGNvZGluZ3Bhc3NlcyxcbiAgICAgICAgICBkYXRhTGVuZ3RoOiBjb2RlZERhdGFMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYWxpZ25Ub0J5dGUoKTtcbiAgICAgIGlmIChlcGhNYXJrZXJVc2VkKSB7XG4gICAgICAgIHNraXBNYXJrZXJJZkVxdWFsKDB4OTIpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHBhY2tldEl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXRJdGVtLmNvZGVibG9jaztcbiAgICAgICAgaWYgKGNvZGVibG9jay5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb2RlYmxvY2suZGF0YSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVibG9jay5kYXRhLnB1c2goe1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgc3RhcnQ6IG9mZnNldCArIHBvc2l0aW9uLFxuICAgICAgICAgIGVuZDogb2Zmc2V0ICsgcG9zaXRpb24gKyBwYWNrZXRJdGVtLmRhdGFMZW5ndGgsXG4gICAgICAgICAgY29kaW5ncGFzc2VzOiBwYWNrZXRJdGVtLmNvZGluZ3Bhc3NlcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHBvc2l0aW9uICs9IHBhY2tldEl0ZW0uZGF0YUxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGNvcHlDb2VmZmljaWVudHMoXG4gICAgY29lZmZpY2llbnRzLFxuICAgIGxldmVsV2lkdGgsXG4gICAgbGV2ZWxIZWlnaHQsXG4gICAgc3ViYmFuZCxcbiAgICBkZWx0YSxcbiAgICBtYixcbiAgICByZXZlcnNpYmxlLFxuICAgIHNlZ21lbnRhdGlvblN5bWJvbFVzZWRcbiAgKSB7XG4gICAgdmFyIHgwID0gc3ViYmFuZC50YngwO1xuICAgIHZhciB5MCA9IHN1YmJhbmQudGJ5MDtcbiAgICB2YXIgd2lkdGggPSBzdWJiYW5kLnRieDEgLSBzdWJiYW5kLnRieDA7XG4gICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7XG4gICAgdmFyIHJpZ2h0ID0gc3ViYmFuZC50eXBlLmNoYXJBdCgwKSA9PT0gXCJIXCIgPyAxIDogMDtcbiAgICB2YXIgYm90dG9tID0gc3ViYmFuZC50eXBlLmNoYXJBdCgxKSA9PT0gXCJIXCIgPyBsZXZlbFdpZHRoIDogMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgdmFyIGNvZGVibG9jayA9IGNvZGVibG9ja3NbaV07XG4gICAgICB2YXIgYmxvY2tXaWR0aCA9IGNvZGVibG9jay50YngxXyAtIGNvZGVibG9jay50YngwXztcbiAgICAgIHZhciBibG9ja0hlaWdodCA9IGNvZGVibG9jay50YnkxXyAtIGNvZGVibG9jay50YnkwXztcbiAgICAgIGlmIChibG9ja1dpZHRoID09PSAwIHx8IGJsb2NrSGVpZ2h0ID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGVibG9jay5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBiaXRNb2RlbCwgY3VycmVudENvZGluZ3Bhc3NUeXBlO1xuICAgICAgYml0TW9kZWwgPSBuZXcgQml0TW9kZWwoXG4gICAgICAgIGJsb2NrV2lkdGgsXG4gICAgICAgIGJsb2NrSGVpZ2h0LFxuICAgICAgICBjb2RlYmxvY2suc3ViYmFuZFR5cGUsXG4gICAgICAgIGNvZGVibG9jay56ZXJvQml0UGxhbmVzLFxuICAgICAgICBtYlxuICAgICAgKTtcbiAgICAgIGN1cnJlbnRDb2RpbmdwYXNzVHlwZSA9IDI7IC8vIGZpcnN0IGJpdCBwbGFuZSBzdGFydHMgZnJvbSBjbGVhbnVwXG5cbiAgICAgIC8vIGNvbGxlY3QgZGF0YVxuICAgICAgdmFyIGRhdGEgPSBjb2RlYmxvY2suZGF0YSxcbiAgICAgICAgdG90YWxMZW5ndGggPSAwLFxuICAgICAgICBjb2RpbmdwYXNzZXMgPSAwO1xuICAgICAgdmFyIGosIGpqLCBkYXRhSXRlbTtcbiAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTtcbiAgICAgICAgdG90YWxMZW5ndGggKz0gZGF0YUl0ZW0uZW5kIC0gZGF0YUl0ZW0uc3RhcnQ7XG4gICAgICAgIGNvZGluZ3Bhc3NlcyArPSBkYXRhSXRlbS5jb2RpbmdwYXNzZXM7XG4gICAgICB9XG4gICAgICB2YXIgZW5jb2RlZERhdGEgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgICAgZm9yIChqID0gMCwgamogPSBkYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgZGF0YUl0ZW0gPSBkYXRhW2pdO1xuICAgICAgICB2YXIgY2h1bmsgPSBkYXRhSXRlbS5kYXRhLnN1YmFycmF5KGRhdGFJdGVtLnN0YXJ0LCBkYXRhSXRlbS5lbmQpO1xuICAgICAgICBlbmNvZGVkRGF0YS5zZXQoY2h1bmssIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gZGVjb2RpbmcgdGhlIGl0ZW1cbiAgICAgIHZhciBkZWNvZGVyID0gbmV3IEFyaXRobWV0aWNEZWNvZGVyKGVuY29kZWREYXRhLCAwLCB0b3RhbExlbmd0aCk7XG4gICAgICBiaXRNb2RlbC5zZXREZWNvZGVyKGRlY29kZXIpO1xuXG4gICAgICBmb3IgKGogPSAwOyBqIDwgY29kaW5ncGFzc2VzOyBqKyspIHtcbiAgICAgICAgc3dpdGNoIChjdXJyZW50Q29kaW5ncGFzc1R5cGUpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBiaXRNb2RlbC5ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGJpdE1vZGVsLnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBiaXRNb2RlbC5ydW5DbGVhbnVwUGFzcygpO1xuICAgICAgICAgICAgaWYgKHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpIHtcbiAgICAgICAgICAgICAgYml0TW9kZWwuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDb2RpbmdwYXNzVHlwZSA9IChjdXJyZW50Q29kaW5ncGFzc1R5cGUgKyAxKSAlIDM7XG4gICAgICB9XG5cbiAgICAgIHZhciBvZmZzZXQgPSBjb2RlYmxvY2sudGJ4MF8gLSB4MCArIChjb2RlYmxvY2sudGJ5MF8gLSB5MCkgKiB3aWR0aDtcbiAgICAgIHZhciBzaWduID0gYml0TW9kZWwuY29lZmZpY2VudHNTaWduO1xuICAgICAgdmFyIG1hZ25pdHVkZSA9IGJpdE1vZGVsLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgdmFyIGJpdHNEZWNvZGVkID0gYml0TW9kZWwuYml0c0RlY29kZWQ7XG4gICAgICB2YXIgbWFnbml0dWRlQ29ycmVjdGlvbiA9IHJldmVyc2libGUgPyAwIDogMC41O1xuICAgICAgdmFyIGssIG4sIG5iO1xuICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgLy8gRG8gdGhlIGludGVybGVhdmluZyBvZiBTZWN0aW9uIEYuMy4zIGhlcmUsIHNvIHdlIGRvIG5vdCBuZWVkXG4gICAgICAvLyB0byBjb3B5IGxhdGVyLiBMTCBsZXZlbCBpcyBub3QgaW50ZXJsZWF2ZWQsIGp1c3QgY29waWVkLlxuICAgICAgdmFyIGludGVybGVhdmUgPSBzdWJiYW5kLnR5cGUgIT09IFwiTExcIjtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBibG9ja0hlaWdodDsgaisrKSB7XG4gICAgICAgIHZhciByb3cgPSAob2Zmc2V0IC8gd2lkdGgpIHwgMDsgLy8gcm93IGluIHRoZSBub24taW50ZXJsZWF2ZWQgc3ViYmFuZFxuICAgICAgICB2YXIgbGV2ZWxPZmZzZXQgPSAyICogcm93ICogKGxldmVsV2lkdGggLSB3aWR0aCkgKyByaWdodCArIGJvdHRvbTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGJsb2NrV2lkdGg7IGsrKykge1xuICAgICAgICAgIG4gPSBtYWduaXR1ZGVbcG9zaXRpb25dO1xuICAgICAgICAgIGlmIChuICE9PSAwKSB7XG4gICAgICAgICAgICBuID0gKG4gKyBtYWduaXR1ZGVDb3JyZWN0aW9uKSAqIGRlbHRhO1xuICAgICAgICAgICAgaWYgKHNpZ25bcG9zaXRpb25dICE9PSAwKSB7XG4gICAgICAgICAgICAgIG4gPSAtbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5iID0gYml0c0RlY29kZWRbcG9zaXRpb25dO1xuICAgICAgICAgICAgdmFyIHBvcyA9IGludGVybGVhdmUgPyBsZXZlbE9mZnNldCArIChvZmZzZXQgPDwgMSkgOiBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAocmV2ZXJzaWJsZSAmJiBuYiA+PSBtYikge1xuICAgICAgICAgICAgICBjb2VmZmljaWVudHNbcG9zXSA9IG47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb2VmZmljaWVudHNbcG9zXSA9IG4gKiAoMSA8PCAobWIgLSBuYikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICBwb3NpdGlvbisrO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSB3aWR0aCAtIGJsb2NrV2lkdGg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYykge1xuICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgdmFyIGNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7XG4gICAgdmFyIHF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVycztcbiAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID1cbiAgICAgIGNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7XG4gICAgdmFyIHNwcWNkcyA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuU1BxY2RzO1xuICAgIHZhciBzY2FsYXJFeHBvdW5kZWQgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLnNjYWxhckV4cG91bmRlZDtcbiAgICB2YXIgZ3VhcmRCaXRzID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5ndWFyZEJpdHM7XG4gICAgdmFyIHNlZ21lbnRhdGlvblN5bWJvbFVzZWQgPSBjb2RpbmdTdHlsZVBhcmFtZXRlcnMuc2VnbWVudGF0aW9uU3ltYm9sVXNlZDtcbiAgICB2YXIgcHJlY2lzaW9uID0gY29udGV4dC5jb21wb25lbnRzW2NdLnByZWNpc2lvbjtcblxuICAgIHZhciByZXZlcnNpYmxlID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbjtcbiAgICB2YXIgdHJhbnNmb3JtID0gcmV2ZXJzaWJsZVxuICAgICAgPyBuZXcgUmV2ZXJzaWJsZVRyYW5zZm9ybSgpXG4gICAgICA6IG5ldyBJcnJldmVyc2libGVUcmFuc2Zvcm0oKTtcblxuICAgIHZhciBzdWJiYW5kQ29lZmZpY2llbnRzID0gW107XG4gICAgdmFyIGIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgaSsrKSB7XG4gICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tpXTtcblxuICAgICAgdmFyIHdpZHRoID0gcmVzb2x1dGlvbi50cngxIC0gcmVzb2x1dGlvbi50cngwO1xuICAgICAgdmFyIGhlaWdodCA9IHJlc29sdXRpb24udHJ5MSAtIHJlc29sdXRpb24udHJ5MDtcbiAgICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2hvbGUgc3VibGV2ZWwuXG4gICAgICB2YXIgY29lZmZpY2llbnRzID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCk7XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHJlc29sdXRpb24uc3ViYmFuZHMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICB2YXIgbXUsIGVwc2lsb247XG4gICAgICAgIGlmICghc2NhbGFyRXhwb3VuZGVkKSB7XG4gICAgICAgICAgLy8gZm9ybXVsYSBFLTVcbiAgICAgICAgICBtdSA9IHNwcWNkc1swXS5tdTtcbiAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzWzBdLmVwc2lsb24gKyAoaSA+IDAgPyAxIC0gaSA6IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11ID0gc3BxY2RzW2JdLm11O1xuICAgICAgICAgIGVwc2lsb24gPSBzcHFjZHNbYl0uZXBzaWxvbjtcbiAgICAgICAgICBiKys7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3ViYmFuZCA9IHJlc29sdXRpb24uc3ViYmFuZHNbal07XG4gICAgICAgIHZhciBnYWluTG9nMiA9IFN1YmJhbmRzR2FpbkxvZzJbc3ViYmFuZC50eXBlXTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgcXVhbnRpemF0aW9uIGNvZWZmaWNpZW50IChTZWN0aW9uIEUuMS4xLjEpXG4gICAgICAgIHZhciBkZWx0YSA9IHJldmVyc2libGVcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IDIgKiogKHByZWNpc2lvbiArIGdhaW5Mb2cyIC0gZXBzaWxvbikgKiAoMSArIG11IC8gMjA0OCk7XG4gICAgICAgIHZhciBtYiA9IGd1YXJkQml0cyArIGVwc2lsb24gLSAxO1xuXG4gICAgICAgIC8vIEluIHRoZSBmaXJzdCByZXNvbHV0aW9uIGxldmVsLCBjb3B5Q29lZmZpY2llbnRzIHdpbGwgZmlsbCB0aGVcbiAgICAgICAgLy8gd2hvbGUgYXJyYXkgd2l0aCBjb2VmZmljaWVudHMuIEluIHRoZSBzdWNjZWVkaW5nIHBhc3NlcyxcbiAgICAgICAgLy8gY29weUNvZWZmaWNpZW50cyB3aWxsIGNvbnNlY3V0aXZlbHkgZmlsbCBpbiB0aGUgdmFsdWVzIHRoYXQgYmVsb25nXG4gICAgICAgIC8vIHRvIHRoZSBpbnRlcmxlYXZlZCBwb3NpdGlvbnMgb2YgdGhlIEhMLCBMSCwgYW5kIEhIIGNvZWZmaWNpZW50cy5cbiAgICAgICAgLy8gVGhlIExMIGNvZWZmaWNpZW50cyB3aWxsIHRoZW4gYmUgaW50ZXJsZWF2ZWQgaW4gVHJhbnNmb3JtLml0ZXJhdGUoKS5cbiAgICAgICAgY29weUNvZWZmaWNpZW50cyhcbiAgICAgICAgICBjb2VmZmljaWVudHMsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHN1YmJhbmQsXG4gICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgbWIsXG4gICAgICAgICAgcmV2ZXJzaWJsZSxcbiAgICAgICAgICBzZWdtZW50YXRpb25TeW1ib2xVc2VkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLnB1c2goe1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBpdGVtczogY29lZmZpY2llbnRzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybS5jYWxjdWxhdGUoXG4gICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLFxuICAgICAgY29tcG9uZW50LnRjeDAsXG4gICAgICBjb21wb25lbnQudGN5MFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGNvbXBvbmVudC50Y3gwLFxuICAgICAgdG9wOiBjb21wb25lbnQudGN5MCxcbiAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlc3VsdC5oZWlnaHQsXG4gICAgICBpdGVtczogcmVzdWx0Lml0ZW1zLFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gdHJhbnNmb3JtQ29tcG9uZW50cyhjb250ZXh0KSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIHZhciBjb21wb25lbnRzID0gY29udGV4dC5jb21wb25lbnRzO1xuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICB2YXIgcmVzdWx0SW1hZ2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29udGV4dC50aWxlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbaV07XG4gICAgICB2YXIgdHJhbnNmb3JtZWRUaWxlcyA9IFtdO1xuICAgICAgdmFyIGM7XG4gICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHtcbiAgICAgICAgdHJhbnNmb3JtZWRUaWxlc1tjXSA9IHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYyk7XG4gICAgICB9XG4gICAgICB2YXIgdGlsZTAgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdO1xuICAgICAgdmFyIG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aWxlMC5pdGVtcy5sZW5ndGggKiBjb21wb25lbnRzQ291bnQpO1xuICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgbGVmdDogdGlsZTAubGVmdCxcbiAgICAgICAgdG9wOiB0aWxlMC50b3AsXG4gICAgICAgIHdpZHRoOiB0aWxlMC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0aWxlMC5oZWlnaHQsXG4gICAgICAgIGl0ZW1zOiBvdXQsXG4gICAgICB9O1xuXG4gICAgICAvLyBTZWN0aW9uIEcuMi4yIEludmVyc2UgbXVsdGkgY29tcG9uZW50IHRyYW5zZm9ybVxuICAgICAgdmFyIHNoaWZ0LCBvZmZzZXQ7XG4gICAgICB2YXIgcG9zID0gMCxcbiAgICAgICAgaixcbiAgICAgICAgamosXG4gICAgICAgIHkwLFxuICAgICAgICB5MSxcbiAgICAgICAgeTI7XG4gICAgICBpZiAodGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKSB7XG4gICAgICAgIHZhciBmb3VyQ29tcG9uZW50cyA9IGNvbXBvbmVudHNDb3VudCA9PT0gNDtcbiAgICAgICAgdmFyIHkwaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdLml0ZW1zO1xuICAgICAgICB2YXIgeTFpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMV0uaXRlbXM7XG4gICAgICAgIHZhciB5Mml0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1syXS5pdGVtcztcbiAgICAgICAgdmFyIHkzaXRlbXMgPSBmb3VyQ29tcG9uZW50cyA/IHRyYW5zZm9ybWVkVGlsZXNbM10uaXRlbXMgOiBudWxsO1xuXG4gICAgICAgIC8vIEhBQ0s6IFRoZSBtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtIGZvcm11bGFzIGJlbG93IGFzc3VtZSB0aGF0XG4gICAgICAgIC8vIGFsbCBjb21wb25lbnRzIGhhdmUgdGhlIHNhbWUgcHJlY2lzaW9uLiBXaXRoIHRoaXMgaW4gbWluZCwgd2VcbiAgICAgICAgLy8gY29tcHV0ZSBzaGlmdCBhbmQgb2Zmc2V0IG9ubHkgb25jZS5cbiAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzWzBdLnByZWNpc2lvbiAtIDg7XG4gICAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41O1xuXG4gICAgICAgIHZhciBjb21wb25lbnQwID0gdGlsZS5jb21wb25lbnRzWzBdO1xuICAgICAgICB2YXIgYWxwaGEwMSA9IGNvbXBvbmVudHNDb3VudCAtIDM7XG4gICAgICAgIGpqID0geTBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGlmICghY29tcG9uZW50MC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAgICAgLy8gaW52ZXJzZSBpcnJldmVyc2libGUgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybVxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqajsgaisrLCBwb3MgKz0gYWxwaGEwMSkge1xuICAgICAgICAgICAgeTAgPSB5MGl0ZW1zW2pdICsgb2Zmc2V0O1xuICAgICAgICAgICAgeTEgPSB5MWl0ZW1zW2pdO1xuICAgICAgICAgICAgeTIgPSB5Mml0ZW1zW2pdO1xuICAgICAgICAgICAgb3V0W3BvcysrXSA9ICh5MCArIDEuNDAyICogeTIpID4+IHNoaWZ0O1xuICAgICAgICAgICAgb3V0W3BvcysrXSA9ICh5MCAtIDAuMzQ0MTMgKiB5MSAtIDAuNzE0MTQgKiB5MikgPj4gc2hpZnQ7XG4gICAgICAgICAgICBvdXRbcG9zKytdID0gKHkwICsgMS43NzIgKiB5MSkgPj4gc2hpZnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGludmVyc2UgcmV2ZXJzaWJsZSBtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtXG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7XG4gICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7XG4gICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07XG4gICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07XG4gICAgICAgICAgICBjb25zdCBnID0geTAgLSAoKHkyICsgeTEpID4+IDIpO1xuXG4gICAgICAgICAgICBvdXRbcG9zKytdID0gKGcgKyB5MikgPj4gc2hpZnQ7XG4gICAgICAgICAgICBvdXRbcG9zKytdID0gZyA+PiBzaGlmdDtcbiAgICAgICAgICAgIG91dFtwb3MrK10gPSAoZyArIHkxKSA+PiBzaGlmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdXJDb21wb25lbnRzKSB7XG4gICAgICAgICAgZm9yIChqID0gMCwgcG9zID0gMzsgaiA8IGpqOyBqKyssIHBvcyArPSA0KSB7XG4gICAgICAgICAgICBvdXRbcG9zXSA9ICh5M2l0ZW1zW2pdICsgb2Zmc2V0KSA+PiBzaGlmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vIG11bHRpLWNvbXBvbmVudCB0cmFuc2Zvcm1cbiAgICAgICAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICAgICAgdmFyIGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1tjXS5pdGVtcztcbiAgICAgICAgICBzaGlmdCA9IGNvbXBvbmVudHNbY10ucHJlY2lzaW9uIC0gODtcbiAgICAgICAgICBvZmZzZXQgPSAoMTI4IDw8IHNoaWZ0KSArIDAuNTtcbiAgICAgICAgICBmb3IgKHBvcyA9IGMsIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgIG91dFtwb3NdID0gKGl0ZW1zW2pdICsgb2Zmc2V0KSA+PiBzaGlmdDtcbiAgICAgICAgICAgIHBvcyArPSBjb21wb25lbnRzQ291bnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHRJbWFnZXMucHVzaChyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0SW1hZ2VzO1xuICB9XG4gIGZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGNvbnRleHQsIHRpbGVJbmRleCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTtcbiAgICAgIHZhciBxY2RPclFjYyA9XG4gICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdXG4gICAgICAgICAgOiBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRDtcbiAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25QYXJhbWV0ZXJzID0gcWNkT3JRY2M7XG4gICAgICB2YXIgY29kT3JDb2MgPVxuICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXVxuICAgICAgICAgIDogY29udGV4dC5jdXJyZW50VGlsZS5DT0Q7XG4gICAgICBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzID0gY29kT3JDb2M7XG4gICAgfVxuICAgIHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycyA9IGNvbnRleHQuY3VycmVudFRpbGUuQ09EO1xuICB9XG5cbiAgLy8gU2VjdGlvbiBCLjEwLjIgVGFnIHRyZWVzXG4gIHZhciBUYWdUcmVlID0gKGZ1bmN0aW9uIFRhZ1RyZWVDbG9zdXJlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBmdW5jdGlvbiBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBsZXZlbHNMZW5ndGggPSBsb2cyKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7XG4gICAgICB0aGlzLmxldmVscyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGV2ZWwgPSB7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7XG4gICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7XG4gICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgVGFnVHJlZS5wcm90b3R5cGUgPSB7XG4gICAgICByZXNldDogZnVuY3Rpb24gVGFnVHJlZV9yZXNldChpLCBqKSB7XG4gICAgICAgIHZhciBjdXJyZW50TGV2ZWwgPSAwLFxuICAgICAgICAgIHZhbHVlID0gMCxcbiAgICAgICAgICBsZXZlbDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRMZXZlbCA8IHRoaXMubGV2ZWxzLmxlbmd0aCkge1xuICAgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoO1xuICAgICAgICAgIGlmIChsZXZlbC5pdGVtc1tpbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICBpID4+PSAxO1xuICAgICAgICAgIGogPj49IDE7XG4gICAgICAgICAgY3VycmVudExldmVsKys7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudExldmVsLS07XG4gICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTtcbiAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTtcbiAgICAgIH0sXG4gICAgICBpbmNyZW1lbnRWYWx1ZTogZnVuY3Rpb24gVGFnVHJlZV9pbmNyZW1lbnRWYWx1ZSgpIHtcbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxdO1xuICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0rKztcbiAgICAgIH0sXG4gICAgICBuZXh0TGV2ZWw6IGZ1bmN0aW9uIFRhZ1RyZWVfbmV4dExldmVsKCkge1xuICAgICAgICB2YXIgY3VycmVudExldmVsID0gdGhpcy5jdXJyZW50TGV2ZWw7XG4gICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTtcbiAgICAgICAgY3VycmVudExldmVsLS07XG4gICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPCAwKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gVGFnVHJlZTtcbiAgfSkoKTtcblxuICB2YXIgSW5jbHVzaW9uVHJlZSA9IChmdW5jdGlvbiBJbmNsdXNpb25UcmVlQ2xvc3VyZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciBsZXZlbHNMZW5ndGggPSBsb2cyKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7XG4gICAgICB0aGlzLmxldmVscyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbXMgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICBpdGVtc1tqXSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsZXZlbCA9IHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubGV2ZWxzLnB1c2gobGV2ZWwpO1xuXG4gICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7XG4gICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgSW5jbHVzaW9uVHJlZS5wcm90b3R5cGUgPSB7XG4gICAgICByZXNldDogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9yZXNldChpLCBqLCBzdG9wVmFsdWUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IDA7XG4gICAgICAgIHdoaWxlIChjdXJyZW50TGV2ZWwgPCB0aGlzLmxldmVscy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICAgIHZhciBpbmRleCA9IGkgKyBqICogbGV2ZWwud2lkdGg7XG4gICAgICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IDB4ZmYpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA+IHN0b3BWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7XG4gICAgICAgICAgICAvLyBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyBvbmUsIHByb3BhZ2F0aW5nIHRoZSB2YWx1ZSB0byB0b3AgbGV2ZWxzXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlcygpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgPj49IDE7XG4gICAgICAgICAgaiA+Pj0gMTtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbCAtIDE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKHN0b3BWYWx1ZSkge1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHN0b3BWYWx1ZSArIDE7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7XG4gICAgICB9LFxuICAgICAgcHJvcGFnYXRlVmFsdWVzOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Byb3BhZ2F0ZVZhbHVlcygpIHtcbiAgICAgICAgdmFyIGxldmVsSW5kZXggPSB0aGlzLmN1cnJlbnRMZXZlbDtcbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07XG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07XG4gICAgICAgIHdoaWxlICgtLWxldmVsSW5kZXggPj0gMCkge1xuICAgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07XG4gICAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbmV4dExldmVsOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX25leHRMZXZlbCgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IHRoaXMuY3VycmVudExldmVsO1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IDB4ZmY7XG4gICAgICAgIGN1cnJlbnRMZXZlbC0tO1xuICAgICAgICBpZiAoY3VycmVudExldmVsIDwgMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gSW5jbHVzaW9uVHJlZTtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIEQuIENvZWZmaWNpZW50IGJpdCBtb2RlbGluZ1xuICB2YXIgQml0TW9kZWwgPSAoZnVuY3Rpb24gQml0TW9kZWxDbG9zdXJlKCkge1xuICAgIHZhciBVTklGT1JNX0NPTlRFWFQgPSAxNztcbiAgICB2YXIgUlVOTEVOR1RIX0NPTlRFWFQgPSAxODtcbiAgICAvLyBUYWJsZSBELTFcbiAgICAvLyBUaGUgaW5kZXggaXMgYmluYXJ5IHByZXNlbnRhdGlvbjogMGRkZHZ2aGgsIGRkZCAtIHN1bSBvZiBEaSAoMC4uNCksXG4gICAgLy8gdnYgLSBzdW0gb2YgVmkgKDAuLjIpLCBhbmQgaGggLSBzdW0gb2YgSGkgKDAuLjIpXG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIExMQW5kTEhDb250ZXh0c0xhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgNSwgOCwgMCwgMywgNywgOCwgMCwgNCwgNywgOCwgMCwgMCwgMCwgMCwgMCwgMSwgNiwgOCwgMCwgMywgNywgOCwgMCwgNCxcbiAgICAgIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsXG4gICAgICA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4XG4gICAgXSk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIEhMQ29udGV4dExhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgMywgNCwgMCwgNSwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMSwgMywgNCwgMCwgNiwgNywgNywgMCwgOCxcbiAgICAgIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsXG4gICAgICA0LCAwLCA2LCA3LCA3LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAzLCA0LCAwLCA2LCA3LCA3LCAwLCA4LCA4LCA4XG4gICAgXSk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIEhIQ29udGV4dExhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgMSwgMiwgMCwgMSwgMiwgMiwgMCwgMiwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMywgNCwgNSwgMCwgNCwgNSwgNSwgMCwgNSxcbiAgICAgIDUsIDUsIDAsIDAsIDAsIDAsIDAsIDYsIDcsIDcsIDAsIDcsIDcsIDcsIDAsIDcsIDcsIDcsIDAsIDAsIDAsIDAsIDAsIDgsIDgsXG4gICAgICA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4XG4gICAgXSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gQml0TW9kZWwod2lkdGgsIGhlaWdodCwgc3ViYmFuZCwgemVyb0JpdFBsYW5lcywgbWIpIHtcbiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICBsZXQgY29udGV4dExhYmVsVGFibGU7XG4gICAgICBpZiAoc3ViYmFuZCA9PT0gXCJISFwiKSB7XG4gICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gSEhDb250ZXh0TGFiZWw7XG4gICAgICB9IGVsc2UgaWYgKHN1YmJhbmQgPT09IFwiSExcIikge1xuICAgICAgICBjb250ZXh0TGFiZWxUYWJsZSA9IEhMQ29udGV4dExhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dExhYmVsVGFibGUgPSBMTEFuZExIQ29udGV4dHNMYWJlbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGV4dExhYmVsVGFibGUgPSBjb250ZXh0TGFiZWxUYWJsZTtcblxuICAgICAgdmFyIGNvZWZmaWNpZW50Q291bnQgPSB3aWR0aCAqIGhlaWdodDtcblxuICAgICAgLy8gY29lZmZpY2llbnRzIG91dHNpZGUgdGhlIGVuY29kaW5nIHJlZ2lvbiB0cmVhdGVkIGFzIGluc2lnbmlmaWNhbnRcbiAgICAgIC8vIGFkZCBib3JkZXIgc3RhdGUgY2VsbHMgZm9yIHNpZ25pZmljYW5jZVN0YXRlXG4gICAgICB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgdGhpcy5jb2VmZmljZW50c1NpZ24gPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTtcbiAgICAgIGxldCBjb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgIGlmIChtYiA+IDE0KSB7XG4gICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQzMkFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgfSBlbHNlIGlmIChtYiA+IDYpIHtcbiAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDE2QXJyYXkoY29lZmZpY2llbnRDb3VudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgdGhpcy5wcm9jZXNzaW5nRmxhZ3MgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTtcblxuICAgICAgdmFyIGJpdHNEZWNvZGVkID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7XG4gICAgICBpZiAoemVyb0JpdFBsYW5lcyAhPT0gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZWZmaWNpZW50Q291bnQ7IGkrKykge1xuICAgICAgICAgIGJpdHNEZWNvZGVkW2ldID0gemVyb0JpdFBsYW5lcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5iaXRzRGVjb2RlZCA9IGJpdHNEZWNvZGVkO1xuXG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgQml0TW9kZWwucHJvdG90eXBlID0ge1xuICAgICAgc2V0RGVjb2RlcjogZnVuY3Rpb24gQml0TW9kZWxfc2V0RGVjb2RlcihkZWNvZGVyKSB7XG4gICAgICAgIHRoaXMuZGVjb2RlciA9IGRlY29kZXI7XG4gICAgICB9LFxuICAgICAgcmVzZXQ6IGZ1bmN0aW9uIEJpdE1vZGVsX3Jlc2V0KCkge1xuICAgICAgICAvLyBXZSBoYXZlIDE3IGNvbnRleHRzIHRoYXQgYXJlIGFjY2Vzc2VkIHZpYSBjb250ZXh0IGxhYmVscyxcbiAgICAgICAgLy8gcGx1cyB0aGUgdW5pZm9ybSBhbmQgcnVubGVuZ3RoIGNvbnRleHQuXG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXcgSW50OEFycmF5KDE5KTtcblxuICAgICAgICAvLyBDb250ZXh0cyBhcmUgcGFja2VkIGludG8gMSBieXRlOlxuICAgICAgICAvLyBoaWdoZXN0IDcgYml0cyBjYXJyeSB0aGUgaW5kZXgsIGxvd2VzdCBiaXQgY2FycmllcyBtcHNcbiAgICAgICAgdGhpcy5jb250ZXh0c1swXSA9ICg0IDw8IDEpIHwgMDtcbiAgICAgICAgdGhpcy5jb250ZXh0c1tVTklGT1JNX0NPTlRFWFRdID0gKDQ2IDw8IDEpIHwgMDtcbiAgICAgICAgdGhpcy5jb250ZXh0c1tSVU5MRU5HVEhfQ09OVEVYVF0gPSAoMyA8PCAxKSB8IDA7XG4gICAgICB9LFxuICAgICAgc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlOiBmdW5jdGlvbiBCaXRNb2RlbF9zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoXG4gICAgICAgIHJvdyxcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBpbmRleFxuICAgICAgKSB7XG4gICAgICAgIHZhciBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGxlZnQgPSBjb2x1bW4gPiAwO1xuICAgICAgICB2YXIgcmlnaHQgPSBjb2x1bW4gKyAxIDwgd2lkdGg7XG4gICAgICAgIHZhciBpO1xuXG4gICAgICAgIGlmIChyb3cgPiAwKSB7XG4gICAgICAgICAgaSA9IGluZGV4IC0gd2lkdGg7XG4gICAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaSArIDFdICs9IDB4MTA7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpXSArPSAweDA0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQpIHtcbiAgICAgICAgICBpID0gaW5kZXggKyB3aWR0aDtcbiAgICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgLSAxXSArPSAweDEwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2ldICs9IDB4MDQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleCAtIDFdICs9IDB4MDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4ICsgMV0gKz0gMHgwMTtcbiAgICAgICAgfVxuICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdIHw9IDB4ODA7XG4gICAgICB9LFxuICAgICAgcnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247XG4gICAgICAgIHZhciBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTtcbiAgICAgICAgdmFyIHByb2Nlc3NpbmdGbGFncyA9IHRoaXMucHJvY2Vzc2luZ0ZsYWdzO1xuICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzO1xuICAgICAgICB2YXIgbGFiZWxzID0gdGhpcy5jb250ZXh0TGFiZWxUYWJsZTtcbiAgICAgICAgdmFyIGJpdHNEZWNvZGVkID0gdGhpcy5iaXRzRGVjb2RlZDtcbiAgICAgICAgdmFyIHByb2Nlc3NlZEludmVyc2VNYXNrID0gfjE7XG4gICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTtcbiAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7XG5cbiAgICAgICAgZm9yICh2YXIgaTAgPSAwOyBpMCA8IGhlaWdodDsgaTAgKz0gNCkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gaTAgKiB3aWR0aCArIGo7XG4gICAgICAgICAgICBmb3IgKHZhciBpMSA9IDA7IGkxIDwgNDsgaTErKywgaW5kZXggKz0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSBpMCArIGkxO1xuICAgICAgICAgICAgICBpZiAoaSA+PSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBjbGVhciBwcm9jZXNzZWQgZmxhZyBmaXJzdFxuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICY9IHByb2Nlc3NlZEludmVyc2VNYXNrO1xuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gfHxcbiAgICAgICAgICAgICAgICAhbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSBsYWJlbHNbbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XV07XG4gICAgICAgICAgICAgIHZhciBkZWNpc2lvbiA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduO1xuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrO1xuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IHByb2Nlc3NlZE1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVjb2RlU2lnbkJpdDogZnVuY3Rpb24gQml0TW9kZWxfZGVjb2RlU2lnbkJpdChyb3csIGNvbHVtbiwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduO1xuICAgICAgICB2YXIgY29udHJpYnV0aW9uLCBzaWduMCwgc2lnbjEsIHNpZ25pZmljYW5jZTE7XG4gICAgICAgIHZhciBjb250ZXh0TGFiZWwsIGRlY29kZWQ7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGhvcml6b250YWwgY29udHJpYnV0aW9uXG4gICAgICAgIHNpZ25pZmljYW5jZTEgPSBjb2x1bW4gPiAwICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4IC0gMV0gIT09IDA7XG4gICAgICAgIGlmIChjb2x1bW4gKyAxIDwgd2lkdGggJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyAxXSAhPT0gMCkge1xuICAgICAgICAgIHNpZ24xID0gY29lZmZpY2VudHNTaWduW2luZGV4ICsgMV07XG4gICAgICAgICAgaWYgKHNpZ25pZmljYW5jZTEpIHtcbiAgICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gMV07XG4gICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNpZ25pZmljYW5jZTEpIHtcbiAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIDFdO1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMCAtIHNpZ24wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvcml6b250YWxDb250cmlidXRpb24gPSAzICogY29udHJpYnV0aW9uO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB2ZXJ0aWNhbCBjb250cmlidXRpb24gYW5kIGNvbWJpbmUgd2l0aCB0aGUgaG9yaXpvbnRhbFxuICAgICAgICBzaWduaWZpY2FuY2UxID0gcm93ID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIHdpZHRoXSAhPT0gMDtcbiAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyB3aWR0aF0gIT09IDApIHtcbiAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIHdpZHRoXTtcbiAgICAgICAgICBpZiAoc2lnbmlmaWNhbmNlMSkge1xuICAgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSB3aWR0aF07XG4gICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMCArIGhvcml6b250YWxDb250cmlidXRpb247XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24xICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkge1xuICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gd2lkdGhdO1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMCAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cmlidXRpb24gPSBob3Jpem9udGFsQ29udHJpYnV0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbiA+PSAwKSB7XG4gICAgICAgICAgY29udGV4dExhYmVsID0gOSArIGNvbnRyaWJ1dGlvbjtcbiAgICAgICAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0TGFiZWwgPSA5IC0gY29udHJpYnV0aW9uO1xuICAgICAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpIF4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgIH0sXG4gICAgICBydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzczogZnVuY3Rpb24gQml0TW9kZWxfcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7XG4gICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7XG4gICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7XG4gICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFncztcbiAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxO1xuICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgICB2YXIgd2lkdGg0ID0gd2lkdGggKiA0O1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4MCA9IDAsIGluZGV4TmV4dDsgaW5kZXgwIDwgbGVuZ3RoOyBpbmRleDAgPSBpbmRleE5leHQpIHtcbiAgICAgICAgICBpbmRleE5leHQgPSBNYXRoLm1pbihsZW5ndGgsIGluZGV4MCArIHdpZHRoNCk7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IGluZGV4MCArIGo7IGluZGV4IDwgaW5kZXhOZXh0OyBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICAvLyBzaWduaWZpY2FudCBidXQgbm90IHRob3NlIHRoYXQgaGF2ZSBqdXN0IGJlY29tZVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fFxuICAgICAgICAgICAgICAgIChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDBcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gMTY7XG4gICAgICAgICAgICAgIGlmICgocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIGZpcnN0TWFnbml0dWRlQml0TWFzaykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIF49IGZpcnN0TWFnbml0dWRlQml0TWFzaztcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZWZpbmVtZW50XG4gICAgICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gJiAxMjc7XG4gICAgICAgICAgICAgICAgY29udGV4dExhYmVsID0gc2lnbmlmaWNhbmNlID09PSAwID8gMTUgOiAxNDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA8PCAxKSB8IGJpdDtcbiAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7XG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gcHJvY2Vzc2VkTWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBydW5DbGVhbnVwUGFzczogZnVuY3Rpb24gQml0TW9kZWxfcnVuQ2xlYW51cFBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7XG4gICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7XG4gICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdmFyIGxhYmVscyA9IHRoaXMuY29udGV4dExhYmVsVGFibGU7XG4gICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7XG4gICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFncztcbiAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxO1xuICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjtcbiAgICAgICAgdmFyIG9uZVJvd0Rvd24gPSB3aWR0aDtcbiAgICAgICAgdmFyIHR3b1Jvd3NEb3duID0gd2lkdGggKiAyO1xuICAgICAgICB2YXIgdGhyZWVSb3dzRG93biA9IHdpZHRoICogMztcbiAgICAgICAgdmFyIGlOZXh0O1xuICAgICAgICBmb3IgKHZhciBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCA9IGlOZXh0KSB7XG4gICAgICAgICAgaU5leHQgPSBNYXRoLm1pbihpMCArIDQsIGhlaWdodCk7XG4gICAgICAgICAgdmFyIGluZGV4QmFzZSA9IGkwICogd2lkdGg7XG4gICAgICAgICAgdmFyIGNoZWNrQWxsRW1wdHkgPSBpMCArIDMgPCBoZWlnaHQ7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXgwID0gaW5kZXhCYXNlICsgajtcbiAgICAgICAgICAgIC8vIHVzaW5nIHRoZSBwcm9wZXJ0eTogbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dID09PSAwXG4gICAgICAgICAgICAvLyB3aGVuIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gPT09IDBcbiAgICAgICAgICAgIHZhciBhbGxFbXB0eSA9XG4gICAgICAgICAgICAgIGNoZWNrQWxsRW1wdHkgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MF0gPT09IDAgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDBdID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyBvbmVSb3dEb3duXSA9PT0gMCAmJlxuICAgICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXgwICsgdHdvUm93c0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0aHJlZVJvd3NEb3duXSA9PT0gMDtcbiAgICAgICAgICAgIHZhciBpMSA9IDAsXG4gICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwO1xuICAgICAgICAgICAgdmFyIGkgPSBpMCxcbiAgICAgICAgICAgICAgc2lnbjtcbiAgICAgICAgICAgIGlmIChhbGxFbXB0eSkge1xuICAgICAgICAgICAgICB2YXIgaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50ID0gZGVjb2Rlci5yZWFkQml0KFxuICAgICAgICAgICAgICAgIGNvbnRleHRzLFxuICAgICAgICAgICAgICAgIFJVTkxFTkdUSF9DT05URVhUXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICghaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50KSB7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwXSsrO1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIG9uZVJvd0Rvd25dKys7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgdHdvUm93c0Rvd25dKys7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgdGhyZWVSb3dzRG93bl0rKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbmV4dCBjb2x1bW5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpMSA9XG4gICAgICAgICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxKSB8XG4gICAgICAgICAgICAgICAgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpO1xuICAgICAgICAgICAgICBpZiAoaTEgIT09IDApIHtcbiAgICAgICAgICAgICAgICBpID0gaTAgKyBpMTtcbiAgICAgICAgICAgICAgICBpbmRleCArPSBpMSAqIHdpZHRoO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduO1xuICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPSAxO1xuICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrO1xuXG4gICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwO1xuICAgICAgICAgICAgICBmb3IgKHZhciBpMiA9IGkwOyBpMiA8PSBpOyBpMisrLCBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaTErKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IGkwICsgaTE7IGkgPCBpTmV4dDsgaSsrLCBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8XG4gICAgICAgICAgICAgICAgKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBwcm9jZXNzZWRNYXNrKSAhPT0gMFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSBsYWJlbHNbbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XV07XG4gICAgICAgICAgICAgIHZhciBkZWNpc2lvbiA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uID09PSAxKSB7XG4gICAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247XG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2hlY2tTZWdtZW50YXRpb25TeW1ib2w6IGZ1bmN0aW9uIEJpdE1vZGVsX2NoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCkge1xuICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdmFyIHN5bWJvbCA9XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAzKSB8XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAyKSB8XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxKSB8XG4gICAgICAgICAgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpO1xuICAgICAgICBpZiAoc3ltYm9sICE9PSAweGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJJbnZhbGlkIHNlZ21lbnRhdGlvbiBzeW1ib2xcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBCaXRNb2RlbDtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIEYsIERpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtYXRpb25cbiAgdmFyIFRyYW5zZm9ybSA9IChmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm0oKSB7fVxuXG4gICAgVHJhbnNmb3JtLnByb3RvdHlwZS5jYWxjdWxhdGUgPSBmdW5jdGlvbiB0cmFuc2Zvcm1DYWxjdWxhdGUoXG4gICAgICBzdWJiYW5kcyxcbiAgICAgIHUwLFxuICAgICAgdjBcbiAgICApIHtcbiAgICAgIHZhciBsbCA9IHN1YmJhbmRzWzBdO1xuICAgICAgZm9yICh2YXIgaSA9IDEsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBsbCA9IHRoaXMuaXRlcmF0ZShsbCwgc3ViYmFuZHNbaV0sIHUwLCB2MCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGw7XG4gICAgfTtcbiAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uIGV4dGVuZChidWZmZXIsIG9mZnNldCwgc2l6ZSkge1xuICAgICAgLy8gU2VjdGlvbiBGLjMuNyBleHRlbmRpbmcuLi4gdXNpbmcgbWF4IGV4dGVuc2lvbiBvZiA0XG4gICAgICB2YXIgaTEgPSBvZmZzZXQgLSAxLFxuICAgICAgICBqMSA9IG9mZnNldCArIDE7XG4gICAgICB2YXIgaTIgPSBvZmZzZXQgKyBzaXplIC0gMixcbiAgICAgICAgajIgPSBvZmZzZXQgKyBzaXplO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxXSA9IGJ1ZmZlcltqMV07XG4gICAgICBidWZmZXJbajJdID0gYnVmZmVyW2kyXTtcbiAgICB9O1xuICAgIFRyYW5zZm9ybS5wcm90b3R5cGUuaXRlcmF0ZSA9IGZ1bmN0aW9uIFRyYW5zZm9ybV9pdGVyYXRlKFxuICAgICAgbGwsXG4gICAgICBobF9saF9oaCxcbiAgICAgIHUwLFxuICAgICAgdjBcbiAgICApIHtcbiAgICAgIHZhciBsbFdpZHRoID0gbGwud2lkdGgsXG4gICAgICAgIGxsSGVpZ2h0ID0gbGwuaGVpZ2h0LFxuICAgICAgICBsbEl0ZW1zID0gbGwuaXRlbXM7XG4gICAgICB2YXIgd2lkdGggPSBobF9saF9oaC53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBobF9saF9oaC5oZWlnaHQ7XG4gICAgICB2YXIgaXRlbXMgPSBobF9saF9oaC5pdGVtcztcbiAgICAgIHZhciBpLCBqLCBrLCBsLCB1LCB2O1xuXG4gICAgICAvLyBJbnRlcmxlYXZlIExMIGFjY29yZGluZyB0byBTZWN0aW9uIEYuMy4zXG4gICAgICBmb3IgKGsgPSAwLCBpID0gMDsgaSA8IGxsSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgbCA9IGkgKiAyICogd2lkdGg7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsbFdpZHRoOyBqKyssIGsrKywgbCArPSAyKSB7XG4gICAgICAgICAgaXRlbXNbbF0gPSBsbEl0ZW1zW2tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgTEwgYmFuZCBpcyBub3QgbmVlZGVkIGFueW1vcmUuXG4gICAgICBsbEl0ZW1zID0gbGwuaXRlbXMgPSBudWxsO1xuXG4gICAgICB2YXIgYnVmZmVyUGFkZGluZyA9IDQ7XG4gICAgICB2YXIgcm93QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCArIDIgKiBidWZmZXJQYWRkaW5nKTtcblxuICAgICAgLy8gU2VjdGlvbiBGLjMuNCBIT1JfU1JcbiAgICAgIGlmICh3aWR0aCA9PT0gMSkge1xuICAgICAgICAvLyBpZiB3aWR0aCA9IDEsIHdoZW4gdTAgZXZlbiBrZWVwIGl0ZW1zIGFzIGlzLCB3aGVuIG9kZCBkaXZpZGUgYnkgMlxuICAgICAgICBpZiAoKHUwICYgMSkgIT09IDApIHtcbiAgICAgICAgICBmb3IgKHYgPSAwLCBrID0gMDsgdiA8IGhlaWdodDsgdisrLCBrICs9IHdpZHRoKSB7XG4gICAgICAgICAgICBpdGVtc1trXSAqPSAwLjU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHYgPSAwLCBrID0gMDsgdiA8IGhlaWdodDsgdisrLCBrICs9IHdpZHRoKSB7XG4gICAgICAgICAgcm93QnVmZmVyLnNldChpdGVtcy5zdWJhcnJheShrLCBrICsgd2lkdGgpLCBidWZmZXJQYWRkaW5nKTtcblxuICAgICAgICAgIHRoaXMuZXh0ZW5kKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpO1xuICAgICAgICAgIHRoaXMuZmlsdGVyKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpO1xuXG4gICAgICAgICAgaXRlbXMuc2V0KFxuICAgICAgICAgICAgcm93QnVmZmVyLnN1YmFycmF5KGJ1ZmZlclBhZGRpbmcsIGJ1ZmZlclBhZGRpbmcgKyB3aWR0aCksXG4gICAgICAgICAgICBrXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBY2Nlc3NlcyB0byB0aGUgaXRlbXMgYXJyYXkgY2FuIHRha2UgbG9uZywgYmVjYXVzZSBpdCBtYXkgbm90IGZpdCBpbnRvXG4gICAgICAvLyBDUFUgY2FjaGUgYW5kIGhhcyB0byBiZSBmZXRjaGVkIGZyb20gbWFpbiBtZW1vcnkuIFNpbmNlIHN1YnNlcXVlbnRcbiAgICAgIC8vIGFjY2Vzc2VzIHRvIHRoZSBpdGVtcyBhcnJheSBhcmUgbm90IGxvY2FsIHdoZW4gcmVhZGluZyBjb2x1bW5zLCB3ZVxuICAgICAgLy8gaGF2ZSBhIGNhY2hlIG1pc3MgZXZlcnkgdGltZS4gVG8gcmVkdWNlIGNhY2hlIG1pc3NlcywgZ2V0IHVwIHRvXG4gICAgICAvLyAnbnVtQnVmZmVycycgaXRlbXMgYXQgYSB0aW1lIGFuZCBzdG9yZSB0aGVtIGludG8gdGhlIGluZGl2aWR1YWxcbiAgICAgIC8vIGJ1ZmZlcnMuIFRoZSBjb2xCdWZmZXJzIHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggdG8gZml0IGludG8gQ1BVIGNhY2hlLlxuICAgICAgdmFyIG51bUJ1ZmZlcnMgPSAxNjtcbiAgICAgIHZhciBjb2xCdWZmZXJzID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKSB7XG4gICAgICAgIGNvbEJ1ZmZlcnMucHVzaChuZXcgRmxvYXQzMkFycmF5KGhlaWdodCArIDIgKiBidWZmZXJQYWRkaW5nKSk7XG4gICAgICB9XG4gICAgICB2YXIgYixcbiAgICAgICAgY3VycmVudEJ1ZmZlciA9IDA7XG4gICAgICBsbCA9IGJ1ZmZlclBhZGRpbmcgKyBoZWlnaHQ7XG5cbiAgICAgIC8vIFNlY3Rpb24gRi4zLjUgVkVSX1NSXG4gICAgICBpZiAoaGVpZ2h0ID09PSAxKSB7XG4gICAgICAgIC8vIGlmIGhlaWdodCA9IDEsIHdoZW4gdjAgZXZlbiBrZWVwIGl0ZW1zIGFzIGlzLCB3aGVuIG9kZCBkaXZpZGUgYnkgMlxuICAgICAgICBpZiAoKHYwICYgMSkgIT09IDApIHtcbiAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgd2lkdGg7IHUrKykge1xuICAgICAgICAgICAgaXRlbXNbdV0gKj0gMC41O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHtcbiAgICAgICAgICAvLyBpZiB3ZSByYW4gb3V0IG9mIGJ1ZmZlcnMsIGNvcHkgc2V2ZXJhbCBpbWFnZSBjb2x1bW5zIGF0IG9uY2VcbiAgICAgICAgICBpZiAoY3VycmVudEJ1ZmZlciA9PT0gMCkge1xuICAgICAgICAgICAgbnVtQnVmZmVycyA9IE1hdGgubWluKHdpZHRoIC0gdSwgbnVtQnVmZmVycyk7XG4gICAgICAgICAgICBmb3IgKGsgPSB1LCBsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHtcbiAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykge1xuICAgICAgICAgICAgICAgIGNvbEJ1ZmZlcnNbYl1bbF0gPSBpdGVtc1trICsgYl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBudW1CdWZmZXJzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1cnJlbnRCdWZmZXItLTtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gY29sQnVmZmVyc1tjdXJyZW50QnVmZmVyXTtcbiAgICAgICAgICB0aGlzLmV4dGVuZChidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7XG4gICAgICAgICAgdGhpcy5maWx0ZXIoYnVmZmVyLCBidWZmZXJQYWRkaW5nLCBoZWlnaHQpO1xuXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBsYXN0IGJ1ZmZlciBpbiB0aGlzIGdyb3VwIG9mIGJ1ZmZlcnMsIGZsdXNoIGFsbCBidWZmZXJzLlxuICAgICAgICAgIGlmIChjdXJyZW50QnVmZmVyID09PSAwKSB7XG4gICAgICAgICAgICBrID0gdSAtIG51bUJ1ZmZlcnMgKyAxO1xuICAgICAgICAgICAgZm9yIChsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHtcbiAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykge1xuICAgICAgICAgICAgICAgIGl0ZW1zW2sgKyBiXSA9IGNvbEJ1ZmZlcnNbYl1bbF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgaXRlbXMsXG4gICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIFRyYW5zZm9ybTtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIDMuOC4yIElycmV2ZXJzaWJsZSA5LTcgZmlsdGVyXG4gIHZhciBJcnJldmVyc2libGVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtQ2xvc3VyZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCkge1xuICAgICAgVHJhbnNmb3JtLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7XG4gICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiBpcnJldmVyc2libGVUcmFuc2Zvcm1GaWx0ZXIoXG4gICAgICB4LFxuICAgICAgb2Zmc2V0LFxuICAgICAgbGVuZ3RoXG4gICAgKSB7XG4gICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgICAgdmFyIGosIG4sIGN1cnJlbnQsIG5leHQ7XG5cbiAgICAgIHZhciBhbHBoYSA9IC0xLjU4NjEzNDM0MjA1OTkyNDtcbiAgICAgIHZhciBiZXRhID0gLTAuMDUyOTgwMTE4NTcyOTYxO1xuICAgICAgdmFyIGdhbW1hID0gMC44ODI5MTEwNzU1MzA5MzQ7XG4gICAgICB2YXIgZGVsdGEgPSAwLjQ0MzUwNjg1MjA0Mzk3MTtcbiAgICAgIHZhciBLID0gMS4yMzAxNzQxMDQ5MTQwMDE7XG4gICAgICB2YXIgS18gPSAxIC8gSztcblxuICAgICAgLy8gc3RlcCAxIGlzIGNvbWJpbmVkIHdpdGggc3RlcCAzXG5cbiAgICAgIC8vIHN0ZXAgMlxuICAgICAgaiA9IG9mZnNldCAtIDM7XG4gICAgICBmb3IgKG4gPSBsZW4gKyA0OyBuLS07IGogKz0gMikge1xuICAgICAgICB4W2pdICo9IEtfO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGVwIDEgJiAzXG4gICAgICBqID0gb2Zmc2V0IC0gMjtcbiAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiAtIDFdO1xuICAgICAgZm9yIChuID0gbGVuICsgMzsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgbmV4dCA9IGRlbHRhICogeFtqICsgMV07XG4gICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0O1xuICAgICAgICBpZiAobi0tKSB7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiArIDFdO1xuICAgICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0ZXAgNFxuICAgICAgaiA9IG9mZnNldCAtIDE7XG4gICAgICBjdXJyZW50ID0gZ2FtbWEgKiB4W2ogLSAxXTtcbiAgICAgIGZvciAobiA9IGxlbiArIDI7IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIG5leHQgPSBnYW1tYSAqIHhbaiArIDFdO1xuICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICBpZiAobi0tKSB7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIGN1cnJlbnQgPSBnYW1tYSAqIHhbaiArIDFdO1xuICAgICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc3RlcCA1XG4gICAgICBqID0gb2Zmc2V0O1xuICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogLSAxXTtcbiAgICAgIGZvciAobiA9IGxlbiArIDE7IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIG5leHQgPSBiZXRhICogeFtqICsgMV07XG4gICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7XG4gICAgICAgIGlmIChuLS0pIHtcbiAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogKyAxXTtcbiAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0ZXAgNlxuICAgICAgaWYgKGxlbiAhPT0gMCkge1xuICAgICAgICBqID0gb2Zmc2V0ICsgMTtcbiAgICAgICAgY3VycmVudCA9IGFscGhhICogeFtqIC0gMV07XG4gICAgICAgIGZvciAobiA9IGxlbjsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgICBuZXh0ID0gYWxwaGEgKiB4W2ogKyAxXTtcbiAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICAgIGlmIChuLS0pIHtcbiAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiArIDFdO1xuICAgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBJcnJldmVyc2libGVUcmFuc2Zvcm07XG4gIH0pKCk7XG5cbiAgLy8gU2VjdGlvbiAzLjguMSBSZXZlcnNpYmxlIDUtMyBmaWx0ZXJcbiAgdmFyIFJldmVyc2libGVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm0oKSB7XG4gICAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7XG4gICAgUmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gcmV2ZXJzaWJsZVRyYW5zZm9ybUZpbHRlcihcbiAgICAgIHgsXG4gICAgICBvZmZzZXQsXG4gICAgICBsZW5ndGhcbiAgICApIHtcbiAgICAgIHZhciBsZW4gPSBsZW5ndGggPj4gMTtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgICB2YXIgaiwgbjtcblxuICAgICAgZm9yIChqID0gb2Zmc2V0LCBuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgeFtqXSAtPSAoeFtqIC0gMV0gKyB4W2ogKyAxXSArIDIpID4+IDI7XG4gICAgICB9XG5cbiAgICAgIGZvciAoaiA9IG9mZnNldCArIDEsIG4gPSBsZW47IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIHhbal0gKz0gKHhbaiAtIDFdICsgeFtqICsgMV0pID4+IDE7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBSZXZlcnNpYmxlVHJhbnNmb3JtO1xuICB9KSgpO1xuXG4gIHJldHVybiBKcHhJbWFnZTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpweEltYWdlIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYnl0ZXNUb1N0cmluZyxcbiAgRm9ybWF0RXJyb3IsXG4gIFBhc3N3b3JkRXhjZXB0aW9uLFxuICBQYXNzd29yZFJlc3BvbnNlcyxcbiAgc3RyaW5nVG9CeXRlcyxcbiAgdW5yZWFjaGFibGUsXG4gIHV0ZjhTdHJpbmdUb1N0cmluZyxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBpc0RpY3QsIGlzTmFtZSwgTmFtZSB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IERlY3J5cHRTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcblxudmFyIEFSQ0ZvdXJDaXBoZXIgPSAoZnVuY3Rpb24gQVJDRm91ckNpcGhlckNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQVJDRm91ckNpcGhlcihrZXkpIHtcbiAgICB0aGlzLmEgPSAwO1xuICAgIHRoaXMuYiA9IDA7XG4gICAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICAgIHZhciBpLFxuICAgICAgaiA9IDAsXG4gICAgICB0bXAsXG4gICAgICBrZXlMZW5ndGggPSBrZXkubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgc1tpXSA9IGk7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgdG1wID0gc1tpXTtcbiAgICAgIGogPSAoaiArIHRtcCArIGtleVtpICUga2V5TGVuZ3RoXSkgJiAweGZmO1xuICAgICAgc1tpXSA9IHNbal07XG4gICAgICBzW2pdID0gdG1wO1xuICAgIH1cbiAgICB0aGlzLnMgPSBzO1xuICB9XG5cbiAgQVJDRm91ckNpcGhlci5wcm90b3R5cGUgPSB7XG4gICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiBBUkNGb3VyQ2lwaGVyX2VuY3J5cHRCbG9jayhkYXRhKSB7XG4gICAgICB2YXIgaSxcbiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLFxuICAgICAgICB0bXAsXG4gICAgICAgIHRtcDI7XG4gICAgICB2YXIgYSA9IHRoaXMuYSxcbiAgICAgICAgYiA9IHRoaXMuYixcbiAgICAgICAgcyA9IHRoaXMucztcbiAgICAgIHZhciBvdXRwdXQgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgYSA9IChhICsgMSkgJiAweGZmO1xuICAgICAgICB0bXAgPSBzW2FdO1xuICAgICAgICBiID0gKGIgKyB0bXApICYgMHhmZjtcbiAgICAgICAgdG1wMiA9IHNbYl07XG4gICAgICAgIHNbYV0gPSB0bXAyO1xuICAgICAgICBzW2JdID0gdG1wO1xuICAgICAgICBvdXRwdXRbaV0gPSBkYXRhW2ldIF4gc1sodG1wICsgdG1wMikgJiAweGZmXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYSA9IGE7XG4gICAgICB0aGlzLmIgPSBiO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9LFxuICB9O1xuICBBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5kZWNyeXB0QmxvY2sgPSBBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5lbmNyeXB0QmxvY2s7XG4gIEFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHQgPSBBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5lbmNyeXB0QmxvY2s7XG5cbiAgcmV0dXJuIEFSQ0ZvdXJDaXBoZXI7XG59KSgpO1xuXG52YXIgY2FsY3VsYXRlTUQ1ID0gKGZ1bmN0aW9uIGNhbGN1bGF0ZU1ENUNsb3N1cmUoKSB7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgciA9IG5ldyBVaW50OEFycmF5KFtcbiAgICA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLFxuICAgIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCxcbiAgICA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLFxuICAgIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjFdKTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgdmFyIGsgPSBuZXcgSW50MzJBcnJheShbXG4gICAgLTY4MDg3NjkzNiwgLTM4OTU2NDU4NiwgNjA2MTA1ODE5LCAtMTA0NDUyNTMzMCwgLTE3NjQxODg5NywgMTIwMDA4MDQyNixcbiAgICAtMTQ3MzIzMTM0MSwgLTQ1NzA1OTgzLCAxNzcwMDM1NDE2LCAtMTk1ODQxNDQxNywgLTQyMDYzLCAtMTk5MDQwNDE2MixcbiAgICAxODA0NjAzNjgyLCAtNDAzNDExMDEsIC0xNTAyMDAyMjkwLCAxMjM2NTM1MzI5LCAtMTY1Nzk2NTEwLCAtMTA2OTUwMTYzMixcbiAgICA2NDM3MTc3MTMsIC0zNzM4OTczMDIsIC03MDE1NTg2OTEsIDM4MDE2MDgzLCAtNjYwNDc4MzM1LCAtNDA1NTM3ODQ4LFxuICAgIDU2ODQ0NjQzOCwgLTEwMTk4MDM2OTAsIC0xODczNjM5NjEsIDExNjM1MzE1MDEsIC0xNDQ0NjgxNDY3LCAtNTE0MDM3ODQsXG4gICAgMTczNTMyODQ3MywgLTE5MjY2MDc3MzQsIC0zNzg1NTgsIC0yMDIyNTc0NDYzLCAxODM5MDMwNTYyLCAtMzUzMDk1NTYsXG4gICAgLTE1MzA5OTIwNjAsIDEyNzI4OTMzNTMsIC0xNTU0OTc2MzIsIC0xMDk0NzMwNjQwLCA2ODEyNzkxNzQsIC0zNTg1MzcyMjIsXG4gICAgLTcyMjUyMTk3OSwgNzYwMjkxODksIC02NDAzNjQ0ODcsIC00MjE4MTU4MzUsIDUzMDc0MjUyMCwgLTk5NTMzODY1MSxcbiAgICAtMTk4NjMwODQ0LCAxMTI2ODkxNDE1LCAtMTQxNjM1NDkwNSwgLTU3NDM0MDU1LCAxNzAwNDg1NTcxLCAtMTg5NDk4NjYwNixcbiAgICAtMTA1MTUyMywgLTIwNTQ5MjI3OTksIDE4NzMzMTMzNTksIC0zMDYxMTc0NCwgLTE1NjAxOTgzODAsIDEzMDkxNTE2NDksXG4gICAgLTE0NTUyMzA3MCwgLTExMjAyMTAzNzksIDcxODc4NzI1OSwgLTM0MzQ4NTU1MV0pO1xuXG4gIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICB2YXIgaDAgPSAxNzMyNTg0MTkzLFxuICAgICAgaDEgPSAtMjcxNzMzODc5LFxuICAgICAgaDIgPSAtMTczMjU4NDE5NCxcbiAgICAgIGgzID0gMjcxNzMzODc4O1xuICAgIC8vIHByZS1wcm9jZXNzaW5nXG4gICAgdmFyIHBhZGRlZExlbmd0aCA9IChsZW5ndGggKyA3MikgJiB+NjM7IC8vIGRhdGEgKyA5IGV4dHJhIGJ5dGVzXG4gICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7XG4gICAgdmFyIGksIGosIG47XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTtcbiAgICB9XG4gICAgcGFkZGVkW2krK10gPSAweDgwO1xuICAgIG4gPSBwYWRkZWRMZW5ndGggLSA4O1xuICAgIHdoaWxlIChpIDwgbikge1xuICAgICAgcGFkZGVkW2krK10gPSAwO1xuICAgIH1cbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPDwgMykgJiAweGZmO1xuICAgIHBhZGRlZFtpKytdID0gKGxlbmd0aCA+PiA1KSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDEzKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDIxKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+PiAyOSkgJiAweGZmO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHZhciB3ID0gbmV3IEludDMyQXJyYXkoMTYpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7ICkge1xuICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2osIGkgKz0gNCkge1xuICAgICAgICB3W2pdID1cbiAgICAgICAgICBwYWRkZWRbaV0gfFxuICAgICAgICAgIChwYWRkZWRbaSArIDFdIDw8IDgpIHxcbiAgICAgICAgICAocGFkZGVkW2kgKyAyXSA8PCAxNikgfFxuICAgICAgICAgIChwYWRkZWRbaSArIDNdIDw8IDI0KTtcbiAgICAgIH1cbiAgICAgIHZhciBhID0gaDAsXG4gICAgICAgIGIgPSBoMSxcbiAgICAgICAgYyA9IGgyLFxuICAgICAgICBkID0gaDMsXG4gICAgICAgIGYsXG4gICAgICAgIGc7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICsraikge1xuICAgICAgICBpZiAoaiA8IDE2KSB7XG4gICAgICAgICAgZiA9IChiICYgYykgfCAofmIgJiBkKTtcbiAgICAgICAgICBnID0gajtcbiAgICAgICAgfSBlbHNlIGlmIChqIDwgMzIpIHtcbiAgICAgICAgICBmID0gKGQgJiBiKSB8ICh+ZCAmIGMpO1xuICAgICAgICAgIGcgPSAoNSAqIGogKyAxKSAmIDE1O1xuICAgICAgICB9IGVsc2UgaWYgKGogPCA0OCkge1xuICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICAgICAgZyA9ICgzICogaiArIDUpICYgMTU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZiA9IGMgXiAoYiB8IH5kKTtcbiAgICAgICAgICBnID0gKDcgKiBqKSAmIDE1O1xuICAgICAgICB9XG4gICAgICAgIHZhciB0bXAgPSBkLFxuICAgICAgICAgIHJvdGF0ZUFyZyA9IChhICsgZiArIGtbal0gKyB3W2ddKSB8IDAsXG4gICAgICAgICAgcm90YXRlID0gcltqXTtcbiAgICAgICAgZCA9IGM7XG4gICAgICAgIGMgPSBiO1xuICAgICAgICBiID0gKGIgKyAoKHJvdGF0ZUFyZyA8PCByb3RhdGUpIHwgKHJvdGF0ZUFyZyA+Pj4gKDMyIC0gcm90YXRlKSkpKSB8IDA7XG4gICAgICAgIGEgPSB0bXA7XG4gICAgICB9XG4gICAgICBoMCA9IChoMCArIGEpIHwgMDtcbiAgICAgIGgxID0gKGgxICsgYikgfCAwO1xuICAgICAgaDIgPSAoaDIgKyBjKSB8IDA7XG4gICAgICBoMyA9IChoMyArIGQpIHwgMDtcbiAgICB9XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtcbiAgICAgIGgwICYgMHhGRiwgKGgwID4+IDgpICYgMHhGRiwgKGgwID4+IDE2KSAmIDB4RkYsIChoMCA+Pj4gMjQpICYgMHhGRixcbiAgICAgIGgxICYgMHhGRiwgKGgxID4+IDgpICYgMHhGRiwgKGgxID4+IDE2KSAmIDB4RkYsIChoMSA+Pj4gMjQpICYgMHhGRixcbiAgICAgIGgyICYgMHhGRiwgKGgyID4+IDgpICYgMHhGRiwgKGgyID4+IDE2KSAmIDB4RkYsIChoMiA+Pj4gMjQpICYgMHhGRixcbiAgICAgIGgzICYgMHhGRiwgKGgzID4+IDgpICYgMHhGRiwgKGgzID4+IDE2KSAmIDB4RkYsIChoMyA+Pj4gMjQpICYgMHhGRlxuICAgIF0pO1xuICB9XG5cbiAgcmV0dXJuIGhhc2g7XG59KSgpO1xudmFyIFdvcmQ2NCA9IChmdW5jdGlvbiBXb3JkNjRDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIFdvcmQ2NChoaWdoSW50ZWdlciwgbG93SW50ZWdlcikge1xuICAgIHRoaXMuaGlnaCA9IGhpZ2hJbnRlZ2VyIHwgMDtcbiAgICB0aGlzLmxvdyA9IGxvd0ludGVnZXIgfCAwO1xuICB9XG4gIFdvcmQ2NC5wcm90b3R5cGUgPSB7XG4gICAgYW5kOiBmdW5jdGlvbiBXb3JkNjRfYW5kKHdvcmQpIHtcbiAgICAgIHRoaXMuaGlnaCAmPSB3b3JkLmhpZ2g7XG4gICAgICB0aGlzLmxvdyAmPSB3b3JkLmxvdztcbiAgICB9LFxuICAgIHhvcjogZnVuY3Rpb24gV29yZDY0X3hvcih3b3JkKSB7XG4gICAgICB0aGlzLmhpZ2ggXj0gd29yZC5oaWdoO1xuICAgICAgdGhpcy5sb3cgXj0gd29yZC5sb3c7XG4gICAgfSxcblxuICAgIG9yOiBmdW5jdGlvbiBXb3JkNjRfb3Iod29yZCkge1xuICAgICAgdGhpcy5oaWdoIHw9IHdvcmQuaGlnaDtcbiAgICAgIHRoaXMubG93IHw9IHdvcmQubG93O1xuICAgIH0sXG5cbiAgICBzaGlmdFJpZ2h0OiBmdW5jdGlvbiBXb3JkNjRfc2hpZnRSaWdodChwbGFjZXMpIHtcbiAgICAgIGlmIChwbGFjZXMgPj0gMzIpIHtcbiAgICAgICAgdGhpcy5sb3cgPSAodGhpcy5oaWdoID4+PiAocGxhY2VzIC0gMzIpKSB8IDA7XG4gICAgICAgIHRoaXMuaGlnaCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvdyA9ICh0aGlzLmxvdyA+Pj4gcGxhY2VzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gcGxhY2VzKSk7XG4gICAgICAgIHRoaXMuaGlnaCA9ICh0aGlzLmhpZ2ggPj4+IHBsYWNlcykgfCAwO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBzaGlmdExlZnQ6IGZ1bmN0aW9uIFdvcmQ2NF9zaGlmdExlZnQocGxhY2VzKSB7XG4gICAgICBpZiAocGxhY2VzID49IDMyKSB7XG4gICAgICAgIHRoaXMuaGlnaCA9IHRoaXMubG93IDw8IChwbGFjZXMgLSAzMik7XG4gICAgICAgIHRoaXMubG93ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlnaCA9ICh0aGlzLmhpZ2ggPDwgcGxhY2VzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gcGxhY2VzKSk7XG4gICAgICAgIHRoaXMubG93ID0gdGhpcy5sb3cgPDwgcGxhY2VzO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICByb3RhdGVSaWdodDogZnVuY3Rpb24gV29yZDY0X3JvdGF0ZVJpZ2h0KHBsYWNlcykge1xuICAgICAgdmFyIGxvdywgaGlnaDtcbiAgICAgIGlmIChwbGFjZXMgJiAzMikge1xuICAgICAgICBoaWdoID0gdGhpcy5sb3c7XG4gICAgICAgIGxvdyA9IHRoaXMuaGlnaDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvdyA9IHRoaXMubG93O1xuICAgICAgICBoaWdoID0gdGhpcy5oaWdoO1xuICAgICAgfVxuICAgICAgcGxhY2VzICY9IDMxO1xuICAgICAgdGhpcy5sb3cgPSAobG93ID4+PiBwbGFjZXMpIHwgKGhpZ2ggPDwgKDMyIC0gcGxhY2VzKSk7XG4gICAgICB0aGlzLmhpZ2ggPSAoaGlnaCA+Pj4gcGxhY2VzKSB8IChsb3cgPDwgKDMyIC0gcGxhY2VzKSk7XG4gICAgfSxcblxuICAgIG5vdDogZnVuY3Rpb24gV29yZDY0X25vdCgpIHtcbiAgICAgIHRoaXMuaGlnaCA9IH50aGlzLmhpZ2g7XG4gICAgICB0aGlzLmxvdyA9IH50aGlzLmxvdztcbiAgICB9LFxuXG4gICAgYWRkOiBmdW5jdGlvbiBXb3JkNjRfYWRkKHdvcmQpIHtcbiAgICAgIHZhciBsb3dBZGQgPSAodGhpcy5sb3cgPj4+IDApICsgKHdvcmQubG93ID4+PiAwKTtcbiAgICAgIHZhciBoaWdoQWRkID0gKHRoaXMuaGlnaCA+Pj4gMCkgKyAod29yZC5oaWdoID4+PiAwKTtcbiAgICAgIGlmIChsb3dBZGQgPiAweGZmZmZmZmZmKSB7XG4gICAgICAgIGhpZ2hBZGQgKz0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG93ID0gbG93QWRkIHwgMDtcbiAgICAgIHRoaXMuaGlnaCA9IGhpZ2hBZGQgfCAwO1xuICAgIH0sXG5cbiAgICBjb3B5VG86IGZ1bmN0aW9uIFdvcmQ2NF9jb3B5VG8oYnl0ZXMsIG9mZnNldCkge1xuICAgICAgYnl0ZXNbb2Zmc2V0XSA9ICh0aGlzLmhpZ2ggPj4+IDI0KSAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyAxXSA9ICh0aGlzLmhpZ2ggPj4gMTYpICYgMHhmZjtcbiAgICAgIGJ5dGVzW29mZnNldCArIDJdID0gKHRoaXMuaGlnaCA+PiA4KSAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyAzXSA9IHRoaXMuaGlnaCAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyA0XSA9ICh0aGlzLmxvdyA+Pj4gMjQpICYgMHhmZjtcbiAgICAgIGJ5dGVzW29mZnNldCArIDVdID0gKHRoaXMubG93ID4+IDE2KSAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyA2XSA9ICh0aGlzLmxvdyA+PiA4KSAmIDB4ZmY7XG4gICAgICBieXRlc1tvZmZzZXQgKyA3XSA9IHRoaXMubG93ICYgMHhmZjtcbiAgICB9LFxuXG4gICAgYXNzaWduOiBmdW5jdGlvbiBXb3JkNjRfYXNzaWduKHdvcmQpIHtcbiAgICAgIHRoaXMuaGlnaCA9IHdvcmQuaGlnaDtcbiAgICAgIHRoaXMubG93ID0gd29yZC5sb3c7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIFdvcmQ2NDtcbn0pKCk7XG5cbnZhciBjYWxjdWxhdGVTSEEyNTYgPSAoZnVuY3Rpb24gY2FsY3VsYXRlU0hBMjU2Q2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gcm90cih4LCBuKSB7XG4gICAgcmV0dXJuICh4ID4+PiBuKSB8ICh4IDw8ICgzMiAtIG4pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoKHgsIHksIHopIHtcbiAgICByZXR1cm4gKHggJiB5KSBeICh+eCAmIHopO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFqKHgsIHksIHopIHtcbiAgICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbWEoeCkge1xuICAgIHJldHVybiByb3RyKHgsIDIpIF4gcm90cih4LCAxMykgXiByb3RyKHgsIDIyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZ21hUHJpbWUoeCkge1xuICAgIHJldHVybiByb3RyKHgsIDYpIF4gcm90cih4LCAxMSkgXiByb3RyKHgsIDI1KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpdHRsZVNpZ21hKHgpIHtcbiAgICByZXR1cm4gcm90cih4LCA3KSBeIHJvdHIoeCwgMTgpIF4gKHggPj4+IDMpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGl0dGxlU2lnbWFQcmltZSh4KSB7XG4gICAgcmV0dXJuIHJvdHIoeCwgMTcpIF4gcm90cih4LCAxOSkgXiAoeCA+Pj4gMTApO1xuICB9XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBrID0gWzB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gICAgICAgICAgIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gICAgICAgICAgIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gICAgICAgICAgIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gICAgICAgICAgIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gICAgICAgICAgIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gICAgICAgICAgIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gICAgICAgICAgIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gICAgICAgICAgIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gICAgICAgICAgIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gICAgICAgICAgIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gICAgICAgICAgIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gICAgICAgICAgIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gICAgICAgICAgIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gICAgICAgICAgIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gICAgICAgICAgIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJdO1xuXG4gIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAvLyBpbml0aWFsIGhhc2ggdmFsdWVzXG4gICAgdmFyIGgwID0gMHg2YTA5ZTY2NyxcbiAgICAgIGgxID0gMHhiYjY3YWU4NSxcbiAgICAgIGgyID0gMHgzYzZlZjM3MixcbiAgICAgIGgzID0gMHhhNTRmZjUzYSxcbiAgICAgIGg0ID0gMHg1MTBlNTI3ZixcbiAgICAgIGg1ID0gMHg5YjA1Njg4YyxcbiAgICAgIGg2ID0gMHgxZjgzZDlhYixcbiAgICAgIGg3ID0gMHg1YmUwY2QxOTtcbiAgICAvLyBwcmUtcHJvY2Vzc2luZ1xuICAgIHZhciBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDkpIC8gNjQpICogNjQ7XG4gICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7XG4gICAgdmFyIGksIGosIG47XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTtcbiAgICB9XG4gICAgcGFkZGVkW2krK10gPSAweDgwO1xuICAgIG4gPSBwYWRkZWRMZW5ndGggLSA4O1xuICAgIHdoaWxlIChpIDwgbikge1xuICAgICAgcGFkZGVkW2krK10gPSAwO1xuICAgIH1cbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPj4+IDI5KSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDIxKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDEzKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDUpICYgMHhmZjtcbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPDwgMykgJiAweGZmO1xuICAgIHZhciB3ID0gbmV3IFVpbnQzMkFycmF5KDY0KTtcbiAgICAvLyBmb3IgZWFjaCA1MTIgYml0IGJsb2NrXG4gICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDsgKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgICB3W2pdID1cbiAgICAgICAgICAocGFkZGVkW2ldIDw8IDI0KSB8XG4gICAgICAgICAgKHBhZGRlZFtpICsgMV0gPDwgMTYpIHxcbiAgICAgICAgICAocGFkZGVkW2kgKyAyXSA8PCA4KSB8XG4gICAgICAgICAgcGFkZGVkW2kgKyAzXTtcbiAgICAgICAgaSArPSA0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKGogPSAxNjsgaiA8IDY0OyArK2opIHtcbiAgICAgICAgd1tqXSA9XG4gICAgICAgICAgKGxpdHRsZVNpZ21hUHJpbWUod1tqIC0gMl0pICtcbiAgICAgICAgICAgIHdbaiAtIDddICtcbiAgICAgICAgICAgIGxpdHRsZVNpZ21hKHdbaiAtIDE1XSkgK1xuICAgICAgICAgICAgd1tqIC0gMTZdKSB8XG4gICAgICAgICAgMDtcbiAgICAgIH1cbiAgICAgIHZhciBhID0gaDAsXG4gICAgICAgIGIgPSBoMSxcbiAgICAgICAgYyA9IGgyLFxuICAgICAgICBkID0gaDMsXG4gICAgICAgIGUgPSBoNCxcbiAgICAgICAgZiA9IGg1LFxuICAgICAgICBnID0gaDYsXG4gICAgICAgIGggPSBoNyxcbiAgICAgICAgdDEsXG4gICAgICAgIHQyO1xuICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyArK2opIHtcbiAgICAgICAgdDEgPSBoICsgc2lnbWFQcmltZShlKSArIGNoKGUsIGYsIGcpICsga1tqXSArIHdbal07XG4gICAgICAgIHQyID0gc2lnbWEoYSkgKyBtYWooYSwgYiwgYyk7XG4gICAgICAgIGggPSBnO1xuICAgICAgICBnID0gZjtcbiAgICAgICAgZiA9IGU7XG4gICAgICAgIGUgPSAoZCArIHQxKSB8IDA7XG4gICAgICAgIGQgPSBjO1xuICAgICAgICBjID0gYjtcbiAgICAgICAgYiA9IGE7XG4gICAgICAgIGEgPSAodDEgKyB0MikgfCAwO1xuICAgICAgfVxuICAgICAgaDAgPSAoaDAgKyBhKSB8IDA7XG4gICAgICBoMSA9IChoMSArIGIpIHwgMDtcbiAgICAgIGgyID0gKGgyICsgYykgfCAwO1xuICAgICAgaDMgPSAoaDMgKyBkKSB8IDA7XG4gICAgICBoNCA9IChoNCArIGUpIHwgMDtcbiAgICAgIGg1ID0gKGg1ICsgZikgfCAwO1xuICAgICAgaDYgPSAoaDYgKyBnKSB8IDA7XG4gICAgICBoNyA9IChoNyArIGgpIHwgMDtcbiAgICB9XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtcbiAgICAgIChoMCA+PiAyNCkgJiAweEZGLCAoaDAgPj4gMTYpICYgMHhGRiwgKGgwID4+IDgpICYgMHhGRiwgKGgwKSAmIDB4RkYsXG4gICAgICAoaDEgPj4gMjQpICYgMHhGRiwgKGgxID4+IDE2KSAmIDB4RkYsIChoMSA+PiA4KSAmIDB4RkYsIChoMSkgJiAweEZGLFxuICAgICAgKGgyID4+IDI0KSAmIDB4RkYsIChoMiA+PiAxNikgJiAweEZGLCAoaDIgPj4gOCkgJiAweEZGLCAoaDIpICYgMHhGRixcbiAgICAgIChoMyA+PiAyNCkgJiAweEZGLCAoaDMgPj4gMTYpICYgMHhGRiwgKGgzID4+IDgpICYgMHhGRiwgKGgzKSAmIDB4RkYsXG4gICAgICAoaDQgPj4gMjQpICYgMHhGRiwgKGg0ID4+IDE2KSAmIDB4RkYsIChoNCA+PiA4KSAmIDB4RkYsIChoNCkgJiAweEZGLFxuICAgICAgKGg1ID4+IDI0KSAmIDB4RkYsIChoNSA+PiAxNikgJiAweEZGLCAoaDUgPj4gOCkgJiAweEZGLCAoaDUpICYgMHhGRixcbiAgICAgIChoNiA+PiAyNCkgJiAweEZGLCAoaDYgPj4gMTYpICYgMHhGRiwgKGg2ID4+IDgpICYgMHhGRiwgKGg2KSAmIDB4RkYsXG4gICAgICAoaDcgPj4gMjQpICYgMHhGRiwgKGg3ID4+IDE2KSAmIDB4RkYsIChoNyA+PiA4KSAmIDB4RkYsIChoNykgJiAweEZGXG4gICAgXSk7XG4gIH1cblxuICByZXR1cm4gaGFzaDtcbn0pKCk7XG5cbnZhciBjYWxjdWxhdGVTSEE1MTIgPSAoZnVuY3Rpb24gY2FsY3VsYXRlU0hBNTEyQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gY2gocmVzdWx0LCB4LCB5LCB6LCB0bXApIHtcbiAgICByZXN1bHQuYXNzaWduKHgpO1xuICAgIHJlc3VsdC5hbmQoeSk7XG4gICAgdG1wLmFzc2lnbih4KTtcbiAgICB0bXAubm90KCk7XG4gICAgdG1wLmFuZCh6KTtcbiAgICByZXN1bHQueG9yKHRtcCk7XG4gIH1cblxuICBmdW5jdGlvbiBtYWoocmVzdWx0LCB4LCB5LCB6LCB0bXApIHtcbiAgICByZXN1bHQuYXNzaWduKHgpO1xuICAgIHJlc3VsdC5hbmQoeSk7XG4gICAgdG1wLmFzc2lnbih4KTtcbiAgICB0bXAuYW5kKHopO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgICB0bXAuYXNzaWduKHkpO1xuICAgIHRtcC5hbmQoeik7XG4gICAgcmVzdWx0Lnhvcih0bXApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbWEocmVzdWx0LCB4LCB0bXApIHtcbiAgICByZXN1bHQuYXNzaWduKHgpO1xuICAgIHJlc3VsdC5yb3RhdGVSaWdodCgyOCk7XG4gICAgdG1wLmFzc2lnbih4KTtcbiAgICB0bXAucm90YXRlUmlnaHQoMzQpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgICB0bXAuYXNzaWduKHgpO1xuICAgIHRtcC5yb3RhdGVSaWdodCgzOSk7XG4gICAgcmVzdWx0Lnhvcih0bXApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbWFQcmltZShyZXN1bHQsIHgsIHRtcCkge1xuICAgIHJlc3VsdC5hc3NpZ24oeCk7XG4gICAgcmVzdWx0LnJvdGF0ZVJpZ2h0KDE0KTtcbiAgICB0bXAuYXNzaWduKHgpO1xuICAgIHRtcC5yb3RhdGVSaWdodCgxOCk7XG4gICAgcmVzdWx0Lnhvcih0bXApO1xuICAgIHRtcC5hc3NpZ24oeCk7XG4gICAgdG1wLnJvdGF0ZVJpZ2h0KDQxKTtcbiAgICByZXN1bHQueG9yKHRtcCk7XG4gIH1cblxuICBmdW5jdGlvbiBsaXR0bGVTaWdtYShyZXN1bHQsIHgsIHRtcCkge1xuICAgIHJlc3VsdC5hc3NpZ24oeCk7XG4gICAgcmVzdWx0LnJvdGF0ZVJpZ2h0KDEpO1xuICAgIHRtcC5hc3NpZ24oeCk7XG4gICAgdG1wLnJvdGF0ZVJpZ2h0KDgpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgICB0bXAuYXNzaWduKHgpO1xuICAgIHRtcC5zaGlmdFJpZ2h0KDcpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHtcbiAgICByZXN1bHQuYXNzaWduKHgpO1xuICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxOSk7XG4gICAgdG1wLmFzc2lnbih4KTtcbiAgICB0bXAucm90YXRlUmlnaHQoNjEpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgICB0bXAuYXNzaWduKHgpO1xuICAgIHRtcC5zaGlmdFJpZ2h0KDYpO1xuICAgIHJlc3VsdC54b3IodG1wKTtcbiAgfVxuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgayA9IFtcbiAgICBuZXcgV29yZDY0KDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIpLCBuZXcgV29yZDY0KDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QpLFxuICAgIG5ldyBXb3JkNjQoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIG5ldyBXb3JkNjQoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksXG4gICAgbmV3IFdvcmQ2NCgweDM5NTZjMjViLCAweGYzNDhiNTM4KSwgbmV3IFdvcmQ2NCgweDU5ZjExMWYxLCAweGI2MDVkMDE5KSxcbiAgICBuZXcgV29yZDY0KDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIpLCBuZXcgV29yZDY0KDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgpLFxuICAgIG5ldyBXb3JkNjQoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIG5ldyBXb3JkNjQoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksXG4gICAgbmV3IFdvcmQ2NCgweDI0MzE4NWJlLCAweDRlZTRiMjhjKSwgbmV3IFdvcmQ2NCgweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyKSxcbiAgICBuZXcgV29yZDY0KDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYpLCBuZXcgV29yZDY0KDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEpLFxuICAgIG5ldyBXb3JkNjQoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIG5ldyBXb3JkNjQoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksXG4gICAgbmV3IFdvcmQ2NCgweGU0OWI2OWMxLCAweDllZjE0YWQyKSwgbmV3IFdvcmQ2NCgweGVmYmU0Nzg2LCAweDM4NGYyNWUzKSxcbiAgICBuZXcgV29yZDY0KDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUpLCBuZXcgV29yZDY0KDB4MjQwY2ExY2MsIDB4NzdhYzljNjUpLFxuICAgIG5ldyBXb3JkNjQoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIG5ldyBXb3JkNjQoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksXG4gICAgbmV3IFdvcmQ2NCgweDVjYjBhOWRjLCAweGJkNDFmYmQ0KSwgbmV3IFdvcmQ2NCgweDc2Zjk4OGRhLCAweDgzMTE1M2I1KSxcbiAgICBuZXcgV29yZDY0KDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIpLCBuZXcgV29yZDY0KDB4YTgzMWM2NmQsIDB4MmRiNDMyMTApLFxuICAgIG5ldyBXb3JkNjQoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIG5ldyBXb3JkNjQoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksXG4gICAgbmV3IFdvcmQ2NCgweGM2ZTAwYmYzLCAweDNkYTg4ZmMyKSwgbmV3IFdvcmQ2NCgweGQ1YTc5MTQ3LCAweDkzMGFhNzI1KSxcbiAgICBuZXcgV29yZDY0KDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYpLCBuZXcgV29yZDY0KDB4MTQyOTI5NjcsIDB4MGEwZTZlNzApLFxuICAgIG5ldyBXb3JkNjQoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIG5ldyBXb3JkNjQoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksXG4gICAgbmV3IFdvcmQ2NCgweDRkMmM2ZGZjLCAweDVhYzQyYWVkKSwgbmV3IFdvcmQ2NCgweDUzMzgwZDEzLCAweDlkOTViM2RmKSxcbiAgICBuZXcgV29yZDY0KDB4NjUwYTczNTQsIDB4OGJhZjYzZGUpLCBuZXcgV29yZDY0KDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgpLFxuICAgIG5ldyBXb3JkNjQoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIG5ldyBXb3JkNjQoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksXG4gICAgbmV3IFdvcmQ2NCgweGEyYmZlOGExLCAweDRjZjEwMzY0KSwgbmV3IFdvcmQ2NCgweGE4MWE2NjRiLCAweGJjNDIzMDAxKSxcbiAgICBuZXcgV29yZDY0KDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEpLCBuZXcgV29yZDY0KDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzApLFxuICAgIG5ldyBXb3JkNjQoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIG5ldyBXb3JkNjQoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksXG4gICAgbmV3IFdvcmQ2NCgweGY0MGUzNTg1LCAweDU3NzEyMDJhKSwgbmV3IFdvcmQ2NCgweDEwNmFhMDcwLCAweDMyYmJkMWI4KSxcbiAgICBuZXcgV29yZDY0KDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgpLCBuZXcgV29yZDY0KDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMpLFxuICAgIG5ldyBXb3JkNjQoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIG5ldyBXb3JkNjQoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksXG4gICAgbmV3IFdvcmQ2NCgweDM5MWMwY2IzLCAweGM1Yzk1YTYzKSwgbmV3IFdvcmQ2NCgweDRlZDhhYTRhLCAweGUzNDE4YWNiKSxcbiAgICBuZXcgV29yZDY0KDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMpLCBuZXcgV29yZDY0KDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMpLFxuICAgIG5ldyBXb3JkNjQoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIG5ldyBXb3JkNjQoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksXG4gICAgbmV3IFdvcmQ2NCgweDg0Yzg3ODE0LCAweGExZjBhYjcyKSwgbmV3IFdvcmQ2NCgweDhjYzcwMjA4LCAweDFhNjQzOWVjKSxcbiAgICBuZXcgV29yZDY0KDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgpLCBuZXcgV29yZDY0KDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTkpLFxuICAgIG5ldyBXb3JkNjQoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIG5ldyBXb3JkNjQoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksXG4gICAgbmV3IFdvcmQ2NCgweGNhMjczZWNlLCAweGVhMjY2MTljKSwgbmV3IFdvcmQ2NCgweGQxODZiOGM3LCAweDIxYzBjMjA3KSxcbiAgICBuZXcgV29yZDY0KDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUpLCBuZXcgV29yZDY0KDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgpLFxuICAgIG5ldyBXb3JkNjQoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIG5ldyBXb3JkNjQoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksXG4gICAgbmV3IFdvcmQ2NCgweDExM2Y5ODA0LCAweGJlZjkwZGFlKSwgbmV3IFdvcmQ2NCgweDFiNzEwYjM1LCAweDEzMWM0NzFiKSxcbiAgICBuZXcgV29yZDY0KDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQpLCBuZXcgV29yZDY0KDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMpLFxuICAgIG5ldyBXb3JkNjQoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIG5ldyBXb3JkNjQoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksXG4gICAgbmV3IFdvcmQ2NCgweDRjYzVkNGJlLCAweGNiM2U0MmI2KSwgbmV3IFdvcmQ2NCgweDU5N2YyOTljLCAweGZjNjU3ZTJhKSxcbiAgICBuZXcgV29yZDY0KDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMpLCBuZXcgV29yZDY0KDB4NmM0NDE5OGMsIDB4NGE0NzU4MTcpXTtcblxuICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCBtb2RlMzg0KSB7XG4gICAgbW9kZTM4NCA9ICEhbW9kZTM4NDtcbiAgICAvLyBpbml0aWFsIGhhc2ggdmFsdWVzXG4gICAgdmFyIGgwLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBoNztcbiAgICBpZiAoIW1vZGUzODQpIHtcbiAgICAgIGgwID0gbmV3IFdvcmQ2NCgweDZhMDllNjY3LCAweGYzYmNjOTA4KTtcbiAgICAgIGgxID0gbmV3IFdvcmQ2NCgweGJiNjdhZTg1LCAweDg0Y2FhNzNiKTtcbiAgICAgIGgyID0gbmV3IFdvcmQ2NCgweDNjNmVmMzcyLCAweGZlOTRmODJiKTtcbiAgICAgIGgzID0gbmV3IFdvcmQ2NCgweGE1NGZmNTNhLCAweDVmMWQzNmYxKTtcbiAgICAgIGg0ID0gbmV3IFdvcmQ2NCgweDUxMGU1MjdmLCAweGFkZTY4MmQxKTtcbiAgICAgIGg1ID0gbmV3IFdvcmQ2NCgweDliMDU2ODhjLCAweDJiM2U2YzFmKTtcbiAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweDFmODNkOWFiLCAweGZiNDFiZDZiKTtcbiAgICAgIGg3ID0gbmV3IFdvcmQ2NCgweDViZTBjZDE5LCAweDEzN2UyMTc5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU0hBMzg0IGlzIGV4YWN0bHkgdGhlIHNhbWVcbiAgICAgIC8vIGV4Y2VwdCB3aXRoIGRpZmZlcmVudCBzdGFydGluZyB2YWx1ZXMgYW5kIGEgdHJpbW1lZCByZXN1bHRcbiAgICAgIGgwID0gbmV3IFdvcmQ2NCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KTtcbiAgICAgIGgxID0gbmV3IFdvcmQ2NCgweDYyOWEyOTJhLCAweDM2N2NkNTA3KTtcbiAgICAgIGgyID0gbmV3IFdvcmQ2NCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KTtcbiAgICAgIGgzID0gbmV3IFdvcmQ2NCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KTtcbiAgICAgIGg0ID0gbmV3IFdvcmQ2NCgweDY3MzMyNjY3LCAweGZmYzAwYjMxKTtcbiAgICAgIGg1ID0gbmV3IFdvcmQ2NCgweDhlYjQ0YTg3LCAweDY4NTgxNTExKTtcbiAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KTtcbiAgICAgIGg3ID0gbmV3IFdvcmQ2NCgweDQ3YjU0ODFkLCAweGJlZmE0ZmE0KTtcbiAgICB9XG5cbiAgICAvLyBwcmUtcHJvY2Vzc2luZ1xuICAgIHZhciBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDE3KSAvIDEyOCkgKiAxMjg7XG4gICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7XG4gICAgdmFyIGksIGosIG47XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTtcbiAgICB9XG4gICAgcGFkZGVkW2krK10gPSAweDgwO1xuICAgIG4gPSBwYWRkZWRMZW5ndGggLSAxNjtcbiAgICB3aGlsZSAoaSA8IG4pIHtcbiAgICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICB9XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IDA7XG4gICAgcGFkZGVkW2krK10gPSAwO1xuICAgIHBhZGRlZFtpKytdID0gMDtcbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPj4+IDI5KSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDIxKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDEzKSAmIDB4ZmY7XG4gICAgcGFkZGVkW2krK10gPSAobGVuZ3RoID4+IDUpICYgMHhmZjtcbiAgICBwYWRkZWRbaSsrXSA9IChsZW5ndGggPDwgMykgJiAweGZmO1xuXG4gICAgdmFyIHcgPSBuZXcgQXJyYXkoODApO1xuICAgIGZvciAoaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG4gICAgICB3W2ldID0gbmV3IFdvcmQ2NCgwLCAwKTtcbiAgICB9XG4gICAgdmFyIGEgPSBuZXcgV29yZDY0KDAsIDApLFxuICAgICAgYiA9IG5ldyBXb3JkNjQoMCwgMCksXG4gICAgICBjID0gbmV3IFdvcmQ2NCgwLCAwKTtcbiAgICB2YXIgZCA9IG5ldyBXb3JkNjQoMCwgMCksXG4gICAgICBlID0gbmV3IFdvcmQ2NCgwLCAwKSxcbiAgICAgIGYgPSBuZXcgV29yZDY0KDAsIDApO1xuICAgIHZhciBnID0gbmV3IFdvcmQ2NCgwLCAwKSxcbiAgICAgIGggPSBuZXcgV29yZDY0KDAsIDApO1xuICAgIHZhciB0MSA9IG5ldyBXb3JkNjQoMCwgMCksXG4gICAgICB0MiA9IG5ldyBXb3JkNjQoMCwgMCk7XG4gICAgdmFyIHRtcDEgPSBuZXcgV29yZDY0KDAsIDApLFxuICAgICAgdG1wMiA9IG5ldyBXb3JkNjQoMCwgMCksXG4gICAgICB0bXAzO1xuXG4gICAgLy8gZm9yIGVhY2ggMTAyNCBiaXQgYmxvY2tcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFkZGVkTGVuZ3RoOyApIHtcbiAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICAgIHdbal0uaGlnaCA9XG4gICAgICAgICAgKHBhZGRlZFtpXSA8PCAyNCkgfFxuICAgICAgICAgIChwYWRkZWRbaSArIDFdIDw8IDE2KSB8XG4gICAgICAgICAgKHBhZGRlZFtpICsgMl0gPDwgOCkgfFxuICAgICAgICAgIHBhZGRlZFtpICsgM107XG4gICAgICAgIHdbal0ubG93ID1cbiAgICAgICAgICAocGFkZGVkW2kgKyA0XSA8PCAyNCkgfFxuICAgICAgICAgIChwYWRkZWRbaSArIDVdIDw8IDE2KSB8XG4gICAgICAgICAgKHBhZGRlZFtpICsgNl0gPDwgOCkgfFxuICAgICAgICAgIHBhZGRlZFtpICsgN107XG4gICAgICAgIGkgKz0gODtcbiAgICAgIH1cbiAgICAgIGZvciAoaiA9IDE2OyBqIDwgODA7ICsraikge1xuICAgICAgICB0bXAzID0gd1tqXTtcbiAgICAgICAgbGl0dGxlU2lnbWFQcmltZSh0bXAzLCB3W2ogLSAyXSwgdG1wMik7XG4gICAgICAgIHRtcDMuYWRkKHdbaiAtIDddKTtcbiAgICAgICAgbGl0dGxlU2lnbWEodG1wMSwgd1tqIC0gMTVdLCB0bXAyKTtcbiAgICAgICAgdG1wMy5hZGQodG1wMSk7XG4gICAgICAgIHRtcDMuYWRkKHdbaiAtIDE2XSk7XG4gICAgICB9XG5cbiAgICAgIGEuYXNzaWduKGgwKTtcbiAgICAgIGIuYXNzaWduKGgxKTtcbiAgICAgIGMuYXNzaWduKGgyKTtcbiAgICAgIGQuYXNzaWduKGgzKTtcbiAgICAgIGUuYXNzaWduKGg0KTtcbiAgICAgIGYuYXNzaWduKGg1KTtcbiAgICAgIGcuYXNzaWduKGg2KTtcbiAgICAgIGguYXNzaWduKGg3KTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgICAgIHQxLmFzc2lnbihoKTtcbiAgICAgICAgc2lnbWFQcmltZSh0bXAxLCBlLCB0bXAyKTtcbiAgICAgICAgdDEuYWRkKHRtcDEpO1xuICAgICAgICBjaCh0bXAxLCBlLCBmLCBnLCB0bXAyKTtcbiAgICAgICAgdDEuYWRkKHRtcDEpO1xuICAgICAgICB0MS5hZGQoa1tqXSk7XG4gICAgICAgIHQxLmFkZCh3W2pdKTtcblxuICAgICAgICBzaWdtYSh0MiwgYSwgdG1wMik7XG4gICAgICAgIG1haih0bXAxLCBhLCBiLCBjLCB0bXAyKTtcbiAgICAgICAgdDIuYWRkKHRtcDEpO1xuXG4gICAgICAgIHRtcDMgPSBoO1xuICAgICAgICBoID0gZztcbiAgICAgICAgZyA9IGY7XG4gICAgICAgIGYgPSBlO1xuICAgICAgICBkLmFkZCh0MSk7XG4gICAgICAgIGUgPSBkO1xuICAgICAgICBkID0gYztcbiAgICAgICAgYyA9IGI7XG4gICAgICAgIGIgPSBhO1xuICAgICAgICB0bXAzLmFzc2lnbih0MSk7XG4gICAgICAgIHRtcDMuYWRkKHQyKTtcbiAgICAgICAgYSA9IHRtcDM7XG4gICAgICB9XG4gICAgICBoMC5hZGQoYSk7XG4gICAgICBoMS5hZGQoYik7XG4gICAgICBoMi5hZGQoYyk7XG4gICAgICBoMy5hZGQoZCk7XG4gICAgICBoNC5hZGQoZSk7XG4gICAgICBoNS5hZGQoZik7XG4gICAgICBoNi5hZGQoZyk7XG4gICAgICBoNy5hZGQoaCk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoIW1vZGUzODQpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDY0KTtcbiAgICAgIGgwLmNvcHlUbyhyZXN1bHQsIDApO1xuICAgICAgaDEuY29weVRvKHJlc3VsdCwgOCk7XG4gICAgICBoMi5jb3B5VG8ocmVzdWx0LCAxNik7XG4gICAgICBoMy5jb3B5VG8ocmVzdWx0LCAyNCk7XG4gICAgICBoNC5jb3B5VG8ocmVzdWx0LCAzMik7XG4gICAgICBoNS5jb3B5VG8ocmVzdWx0LCA0MCk7XG4gICAgICBoNi5jb3B5VG8ocmVzdWx0LCA0OCk7XG4gICAgICBoNy5jb3B5VG8ocmVzdWx0LCA1Nik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDQ4KTtcbiAgICAgIGgwLmNvcHlUbyhyZXN1bHQsIDApO1xuICAgICAgaDEuY29weVRvKHJlc3VsdCwgOCk7XG4gICAgICBoMi5jb3B5VG8ocmVzdWx0LCAxNik7XG4gICAgICBoMy5jb3B5VG8ocmVzdWx0LCAyNCk7XG4gICAgICBoNC5jb3B5VG8ocmVzdWx0LCAzMik7XG4gICAgICBoNS5jb3B5VG8ocmVzdWx0LCA0MCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gaGFzaDtcbn0pKCk7XG52YXIgY2FsY3VsYXRlU0hBMzg0ID0gKGZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTM4NENsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlU0hBNTEyKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoO1xufSkoKTtcbnZhciBOdWxsQ2lwaGVyID0gKGZ1bmN0aW9uIE51bGxDaXBoZXJDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE51bGxDaXBoZXIoKSB7fVxuXG4gIE51bGxDaXBoZXIucHJvdG90eXBlID0ge1xuICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gTnVsbENpcGhlcl9kZWNyeXB0QmxvY2soZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgICBlbmNyeXB0OiBmdW5jdGlvbiBOdWxsQ2lwaGVyX2VuY3J5cHQoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gTnVsbENpcGhlcjtcbn0pKCk7XG5cbmNsYXNzIEFFU0Jhc2VDaXBoZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQUVTQmFzZUNpcGhlcikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBBRVNCYXNlQ2lwaGVyLlwiKTtcbiAgICB9XG5cbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICB0aGlzLl9zID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYixcbiAgICAgIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsXG4gICAgICAweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLCAweGI3LCAweGZkLCAweDkzLCAweDI2LFxuICAgICAgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSxcbiAgICAgIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsXG4gICAgICAweGViLCAweDI3LCAweGIyLCAweDc1LCAweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLFxuICAgICAgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCxcbiAgICAgIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsXG4gICAgICAweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LCAweDQ1LCAweGY5LCAweDAyLCAweDdmLFxuICAgICAgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwgMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSxcbiAgICAgIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsXG4gICAgICAweDVmLCAweDk3LCAweDQ0LCAweDE3LCAweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLFxuICAgICAgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCxcbiAgICAgIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsXG4gICAgICAweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LCAweGU3LCAweGM4LCAweDM3LCAweDZkLFxuICAgICAgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCxcbiAgICAgIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsXG4gICAgICAweDRiLCAweGJkLCAweDhiLCAweDhhLCAweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLFxuICAgICAgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSxcbiAgICAgIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsXG4gICAgICAweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LCAweDQxLCAweDk5LCAweDJkLCAweDBmLFxuICAgICAgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNixcbiAgICBdKTtcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHRoaXMuX2ludl9zID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCwgMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSxcbiAgICAgIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcsXG4gICAgICAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAweDU0LCAweDdiLCAweDk0LCAweDMyLFxuICAgICAgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCwgMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSxcbiAgICAgIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksXG4gICAgICAweDZkLCAweDhiLCAweGQxLCAweDI1LCAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LFxuICAgICAgMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5MiwgMHg2YywgMHg3MCwgMHg0OCwgMHg1MCxcbiAgICAgIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQsXG4gICAgICAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LFxuICAgICAgMHhiOCwgMHhiMywgMHg0NSwgMHgwNiwgMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMixcbiAgICAgIDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIsIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsXG4gICAgICAweDRmLCAweDY3LCAweGRjLCAweGVhLCAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLFxuICAgICAgMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSwgMHhlMiwgMHhmOSwgMHgzNywgMHhlOCxcbiAgICAgIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODksXG4gICAgICAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAweGZjLCAweDU2LCAweDNlLCAweDRiLFxuICAgICAgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCwgMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCxcbiAgICAgIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksXG4gICAgICAweDI3LCAweDgwLCAweGVjLCAweDVmLCAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLFxuICAgICAgMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZiwgMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCxcbiAgICAgIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsXG4gICAgICAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLFxuICAgICAgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZCxcbiAgICBdKTtcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHRoaXMuX21peCA9IG5ldyBVaW50MzJBcnJheShbXG4gICAgICAweDAwMDAwMDAwLCAweDBlMDkwZDBiLCAweDFjMTIxYTE2LCAweDEyMWIxNzFkLCAweDM4MjQzNDJjLCAweDM2MmQzOTI3LFxuICAgICAgMHgyNDM2MmUzYSwgMHgyYTNmMjMzMSwgMHg3MDQ4Njg1OCwgMHg3ZTQxNjU1MywgMHg2YzVhNzI0ZSwgMHg2MjUzN2Y0NSxcbiAgICAgIDB4NDg2YzVjNzQsIDB4NDY2NTUxN2YsIDB4NTQ3ZTQ2NjIsIDB4NWE3NzRiNjksIDB4ZTA5MGQwYjAsIDB4ZWU5OWRkYmIsXG4gICAgICAweGZjODJjYWE2LCAweGYyOGJjN2FkLCAweGQ4YjRlNDljLCAweGQ2YmRlOTk3LCAweGM0YTZmZThhLCAweGNhYWZmMzgxLFxuICAgICAgMHg5MGQ4YjhlOCwgMHg5ZWQxYjVlMywgMHg4Y2NhYTJmZSwgMHg4MmMzYWZmNSwgMHhhOGZjOGNjNCwgMHhhNmY1ODFjZixcbiAgICAgIDB4YjRlZTk2ZDIsIDB4YmFlNzliZDksIDB4ZGIzYmJiN2IsIDB4ZDUzMmI2NzAsIDB4YzcyOWExNmQsIDB4YzkyMGFjNjYsXG4gICAgICAweGUzMWY4ZjU3LCAweGVkMTY4MjVjLCAweGZmMGQ5NTQxLCAweGYxMDQ5ODRhLCAweGFiNzNkMzIzLCAweGE1N2FkZTI4LFxuICAgICAgMHhiNzYxYzkzNSwgMHhiOTY4YzQzZSwgMHg5MzU3ZTcwZiwgMHg5ZDVlZWEwNCwgMHg4ZjQ1ZmQxOSwgMHg4MTRjZjAxMixcbiAgICAgIDB4M2JhYjZiY2IsIDB4MzVhMjY2YzAsIDB4MjdiOTcxZGQsIDB4MjliMDdjZDYsIDB4MDM4ZjVmZTcsIDB4MGQ4NjUyZWMsXG4gICAgICAweDFmOWQ0NWYxLCAweDExOTQ0OGZhLCAweDRiZTMwMzkzLCAweDQ1ZWEwZTk4LCAweDU3ZjExOTg1LCAweDU5ZjgxNDhlLFxuICAgICAgMHg3M2M3MzdiZiwgMHg3ZGNlM2FiNCwgMHg2ZmQ1MmRhOSwgMHg2MWRjMjBhMiwgMHhhZDc2NmRmNiwgMHhhMzdmNjBmZCxcbiAgICAgIDB4YjE2NDc3ZTAsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEsIDB4OWI1YjU0ZDEsIDB4ODk0MDQzY2MsIDB4ODc0OTRlYzcsXG4gICAgICAweGRkM2UwNWFlLCAweGQzMzcwOGE1LCAweGMxMmMxZmI4LCAweGNmMjUxMmIzLCAweGU1MWEzMTgyLCAweGViMTMzYzg5LFxuICAgICAgMHhmOTA4MmI5NCwgMHhmNzAxMjY5ZiwgMHg0ZGU2YmQ0NiwgMHg0M2VmYjA0ZCwgMHg1MWY0YTc1MCwgMHg1ZmZkYWE1YixcbiAgICAgIDB4NzVjMjg5NmEsIDB4N2JjYjg0NjEsIDB4NjlkMDkzN2MsIDB4NjdkOTllNzcsIDB4M2RhZWQ1MWUsIDB4MzNhN2Q4MTUsXG4gICAgICAweDIxYmNjZjA4LCAweDJmYjVjMjAzLCAweDA1OGFlMTMyLCAweDBiODNlYzM5LCAweDE5OThmYjI0LCAweDE3OTFmNjJmLFxuICAgICAgMHg3NjRkZDY4ZCwgMHg3ODQ0ZGI4NiwgMHg2YTVmY2M5YiwgMHg2NDU2YzE5MCwgMHg0ZTY5ZTJhMSwgMHg0MDYwZWZhYSxcbiAgICAgIDB4NTI3YmY4YjcsIDB4NWM3MmY1YmMsIDB4MDYwNWJlZDUsIDB4MDgwY2IzZGUsIDB4MWExN2E0YzMsIDB4MTQxZWE5YzgsXG4gICAgICAweDNlMjE4YWY5LCAweDMwMjg4N2YyLCAweDIyMzM5MGVmLCAweDJjM2E5ZGU0LCAweDk2ZGQwNjNkLCAweDk4ZDQwYjM2LFxuICAgICAgMHg4YWNmMWMyYiwgMHg4NGM2MTEyMCwgMHhhZWY5MzIxMSwgMHhhMGYwM2YxYSwgMHhiMmViMjgwNywgMHhiY2UyMjUwYyxcbiAgICAgIDB4ZTY5NTZlNjUsIDB4ZTg5YzYzNmUsIDB4ZmE4Nzc0NzMsIDB4ZjQ4ZTc5NzgsIDB4ZGViMTVhNDksIDB4ZDBiODU3NDIsXG4gICAgICAweGMyYTM0MDVmLCAweGNjYWE0ZDU0LCAweDQxZWNkYWY3LCAweDRmZTVkN2ZjLCAweDVkZmVjMGUxLCAweDUzZjdjZGVhLFxuICAgICAgMHg3OWM4ZWVkYiwgMHg3N2MxZTNkMCwgMHg2NWRhZjRjZCwgMHg2YmQzZjljNiwgMHgzMWE0YjJhZiwgMHgzZmFkYmZhNCxcbiAgICAgIDB4MmRiNmE4YjksIDB4MjNiZmE1YjIsIDB4MDk4MDg2ODMsIDB4MDc4OThiODgsIDB4MTU5MjljOTUsIDB4MWI5YjkxOWUsXG4gICAgICAweGExN2MwYTQ3LCAweGFmNzUwNzRjLCAweGJkNmUxMDUxLCAweGIzNjcxZDVhLCAweDk5NTgzZTZiLCAweDk3NTEzMzYwLFxuICAgICAgMHg4NTRhMjQ3ZCwgMHg4YjQzMjk3NiwgMHhkMTM0NjIxZiwgMHhkZjNkNmYxNCwgMHhjZDI2NzgwOSwgMHhjMzJmNzUwMixcbiAgICAgIDB4ZTkxMDU2MzMsIDB4ZTcxOTViMzgsIDB4ZjUwMjRjMjUsIDB4ZmIwYjQxMmUsIDB4OWFkNzYxOGMsIDB4OTRkZTZjODcsXG4gICAgICAweDg2YzU3YjlhLCAweDg4Y2M3NjkxLCAweGEyZjM1NWEwLCAweGFjZmE1OGFiLCAweGJlZTE0ZmI2LCAweGIwZTg0MmJkLFxuICAgICAgMHhlYTlmMDlkNCwgMHhlNDk2MDRkZiwgMHhmNjhkMTNjMiwgMHhmODg0MWVjOSwgMHhkMmJiM2RmOCwgMHhkY2IyMzBmMyxcbiAgICAgIDB4Y2VhOTI3ZWUsIDB4YzBhMDJhZTUsIDB4N2E0N2IxM2MsIDB4NzQ0ZWJjMzcsIDB4NjY1NWFiMmEsIDB4Njg1Y2E2MjEsXG4gICAgICAweDQyNjM4NTEwLCAweDRjNmE4ODFiLCAweDVlNzE5ZjA2LCAweDUwNzg5MjBkLCAweDBhMGZkOTY0LCAweDA0MDZkNDZmLFxuICAgICAgMHgxNjFkYzM3MiwgMHgxODE0Y2U3OSwgMHgzMjJiZWQ0OCwgMHgzYzIyZTA0MywgMHgyZTM5Zjc1ZSwgMHgyMDMwZmE1NSxcbiAgICAgIDB4ZWM5YWI3MDEsIDB4ZTI5M2JhMGEsIDB4ZjA4OGFkMTcsIDB4ZmU4MWEwMWMsIDB4ZDRiZTgzMmQsIDB4ZGFiNzhlMjYsXG4gICAgICAweGM4YWM5OTNiLCAweGM2YTU5NDMwLCAweDljZDJkZjU5LCAweDkyZGJkMjUyLCAweDgwYzBjNTRmLCAweDhlYzljODQ0LFxuICAgICAgMHhhNGY2ZWI3NSwgMHhhYWZmZTY3ZSwgMHhiOGU0ZjE2MywgMHhiNmVkZmM2OCwgMHgwYzBhNjdiMSwgMHgwMjAzNmFiYSxcbiAgICAgIDB4MTAxODdkYTcsIDB4MWUxMTcwYWMsIDB4MzQyZTUzOWQsIDB4M2EyNzVlOTYsIDB4MjgzYzQ5OGIsIDB4MjYzNTQ0ODAsXG4gICAgICAweDdjNDIwZmU5LCAweDcyNGIwMmUyLCAweDYwNTAxNWZmLCAweDZlNTkxOGY0LCAweDQ0NjYzYmM1LCAweDRhNmYzNmNlLFxuICAgICAgMHg1ODc0MjFkMywgMHg1NjdkMmNkOCwgMHgzN2ExMGM3YSwgMHgzOWE4MDE3MSwgMHgyYmIzMTY2YywgMHgyNWJhMWI2NyxcbiAgICAgIDB4MGY4NTM4NTYsIDB4MDE4YzM1NWQsIDB4MTM5NzIyNDAsIDB4MWQ5ZTJmNGIsIDB4NDdlOTY0MjIsIDB4NDllMDY5MjksXG4gICAgICAweDViZmI3ZTM0LCAweDU1ZjI3MzNmLCAweDdmY2Q1MDBlLCAweDcxYzQ1ZDA1LCAweDYzZGY0YTE4LCAweDZkZDY0NzEzLFxuICAgICAgMHhkNzMxZGNjYSwgMHhkOTM4ZDFjMSwgMHhjYjIzYzZkYywgMHhjNTJhY2JkNywgMHhlZjE1ZThlNiwgMHhlMTFjZTVlZCxcbiAgICAgIDB4ZjMwN2YyZjAsIDB4ZmQwZWZmZmIsIDB4YTc3OWI0OTIsIDB4YTk3MGI5OTksIDB4YmI2YmFlODQsIDB4YjU2MmEzOGYsXG4gICAgICAweDlmNWQ4MGJlLCAweDkxNTQ4ZGI1LCAweDgzNGY5YWE4LCAweDhkNDY5N2EzLFxuICAgIF0pO1xuXG4gICAgdGhpcy5fbWl4Q29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICBpZiAoaSA8IDEyOCkge1xuICAgICAgICB0aGlzLl9taXhDb2xbaV0gPSBpIDw8IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9taXhDb2xbaV0gPSAoaSA8PCAxKSBeIDB4MWI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgdGhpcy5idWZmZXJQb3NpdGlvbiA9IDA7XG4gIH1cblxuICBfZXhwYW5kS2V5KGNpcGhlcktleSkge1xuICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGNhbGwgYF9leHBhbmRLZXlgIG9uIHRoZSBiYXNlIGNsYXNzXCIpO1xuICB9XG5cbiAgX2RlY3J5cHQoaW5wdXQsIGtleSkge1xuICAgIGxldCB0LCB1LCB2O1xuICAgIGNvbnN0IHN0YXRlID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICAgIHN0YXRlLnNldChpbnB1dCk7XG5cbiAgICAvLyBBZGRSb3VuZEtleVxuICAgIGZvciAobGV0IGogPSAwLCBrID0gdGhpcy5fa2V5U2l6ZTsgaiA8IDE2OyArK2osICsraykge1xuICAgICAgc3RhdGVbal0gXj0ga2V5W2tdO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uIC0gMTsgaSA+PSAxOyAtLWkpIHtcbiAgICAgIC8vIEludlNoaWZ0Um93c1xuICAgICAgdCA9IHN0YXRlWzEzXTtcbiAgICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldO1xuICAgICAgc3RhdGVbOV0gPSBzdGF0ZVs1XTtcbiAgICAgIHN0YXRlWzVdID0gc3RhdGVbMV07XG4gICAgICBzdGF0ZVsxXSA9IHQ7XG4gICAgICB0ID0gc3RhdGVbMTRdO1xuICAgICAgdSA9IHN0YXRlWzEwXTtcbiAgICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdO1xuICAgICAgc3RhdGVbMTBdID0gc3RhdGVbMl07XG4gICAgICBzdGF0ZVs2XSA9IHQ7XG4gICAgICBzdGF0ZVsyXSA9IHU7XG4gICAgICB0ID0gc3RhdGVbMTVdO1xuICAgICAgdSA9IHN0YXRlWzExXTtcbiAgICAgIHYgPSBzdGF0ZVs3XTtcbiAgICAgIHN0YXRlWzE1XSA9IHN0YXRlWzNdO1xuICAgICAgc3RhdGVbMTFdID0gdDtcbiAgICAgIHN0YXRlWzddID0gdTtcbiAgICAgIHN0YXRlWzNdID0gdjtcbiAgICAgIC8vIEludlN1YkJ5dGVzXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgICAgc3RhdGVbal0gPSB0aGlzLl9pbnZfc1tzdGF0ZVtqXV07XG4gICAgICB9XG4gICAgICAvLyBBZGRSb3VuZEtleVxuICAgICAgZm9yIChsZXQgaiA9IDAsIGsgPSBpICogMTY7IGogPCAxNjsgKytqLCArK2spIHtcbiAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdO1xuICAgICAgfVxuICAgICAgLy8gSW52TWl4Q29sdW1uc1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgaiArPSA0KSB7XG4gICAgICAgIGNvbnN0IHMwID0gdGhpcy5fbWl4W3N0YXRlW2pdXTtcbiAgICAgICAgY29uc3QgczEgPSB0aGlzLl9taXhbc3RhdGVbaiArIDFdXTtcbiAgICAgICAgY29uc3QgczIgPSB0aGlzLl9taXhbc3RhdGVbaiArIDJdXTtcbiAgICAgICAgY29uc3QgczMgPSB0aGlzLl9taXhbc3RhdGVbaiArIDNdXTtcbiAgICAgICAgdCA9XG4gICAgICAgICAgczAgXlxuICAgICAgICAgIChzMSA+Pj4gOCkgXlxuICAgICAgICAgIChzMSA8PCAyNCkgXlxuICAgICAgICAgIChzMiA+Pj4gMTYpIF5cbiAgICAgICAgICAoczIgPDwgMTYpIF5cbiAgICAgICAgICAoczMgPj4+IDI0KSBeXG4gICAgICAgICAgKHMzIDw8IDgpO1xuICAgICAgICBzdGF0ZVtqXSA9ICh0ID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzdGF0ZVtqICsgMV0gPSAodCA+PiAxNikgJiAweGZmO1xuICAgICAgICBzdGF0ZVtqICsgMl0gPSAodCA+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlW2ogKyAzXSA9IHQgJiAweGZmO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJbnZTaGlmdFJvd3NcbiAgICB0ID0gc3RhdGVbMTNdO1xuICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldO1xuICAgIHN0YXRlWzldID0gc3RhdGVbNV07XG4gICAgc3RhdGVbNV0gPSBzdGF0ZVsxXTtcbiAgICBzdGF0ZVsxXSA9IHQ7XG4gICAgdCA9IHN0YXRlWzE0XTtcbiAgICB1ID0gc3RhdGVbMTBdO1xuICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdO1xuICAgIHN0YXRlWzEwXSA9IHN0YXRlWzJdO1xuICAgIHN0YXRlWzZdID0gdDtcbiAgICBzdGF0ZVsyXSA9IHU7XG4gICAgdCA9IHN0YXRlWzE1XTtcbiAgICB1ID0gc3RhdGVbMTFdO1xuICAgIHYgPSBzdGF0ZVs3XTtcbiAgICBzdGF0ZVsxNV0gPSBzdGF0ZVszXTtcbiAgICBzdGF0ZVsxMV0gPSB0O1xuICAgIHN0YXRlWzddID0gdTtcbiAgICBzdGF0ZVszXSA9IHY7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICAvLyBJbnZTdWJCeXRlc1xuICAgICAgc3RhdGVbal0gPSB0aGlzLl9pbnZfc1tzdGF0ZVtqXV07XG4gICAgICAvLyBBZGRSb3VuZEtleVxuICAgICAgc3RhdGVbal0gXj0ga2V5W2pdO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBfZW5jcnlwdChpbnB1dCwga2V5KSB7XG4gICAgY29uc3QgcyA9IHRoaXMuX3M7XG5cbiAgICBsZXQgdCwgdSwgdjtcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICBzdGF0ZS5zZXQoaW5wdXQpO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICAvLyBBZGRSb3VuZEtleVxuICAgICAgc3RhdGVbal0gXj0ga2V5W2pdO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uOyBpKyspIHtcbiAgICAgIC8vIFN1YkJ5dGVzXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgICAgc3RhdGVbal0gPSBzW3N0YXRlW2pdXTtcbiAgICAgIH1cbiAgICAgIC8vIFNoaWZ0Um93c1xuICAgICAgdiA9IHN0YXRlWzFdO1xuICAgICAgc3RhdGVbMV0gPSBzdGF0ZVs1XTtcbiAgICAgIHN0YXRlWzVdID0gc3RhdGVbOV07XG4gICAgICBzdGF0ZVs5XSA9IHN0YXRlWzEzXTtcbiAgICAgIHN0YXRlWzEzXSA9IHY7XG4gICAgICB2ID0gc3RhdGVbMl07XG4gICAgICB1ID0gc3RhdGVbNl07XG4gICAgICBzdGF0ZVsyXSA9IHN0YXRlWzEwXTtcbiAgICAgIHN0YXRlWzZdID0gc3RhdGVbMTRdO1xuICAgICAgc3RhdGVbMTBdID0gdjtcbiAgICAgIHN0YXRlWzE0XSA9IHU7XG4gICAgICB2ID0gc3RhdGVbM107XG4gICAgICB1ID0gc3RhdGVbN107XG4gICAgICB0ID0gc3RhdGVbMTFdO1xuICAgICAgc3RhdGVbM10gPSBzdGF0ZVsxNV07XG4gICAgICBzdGF0ZVs3XSA9IHY7XG4gICAgICBzdGF0ZVsxMV0gPSB1O1xuICAgICAgc3RhdGVbMTVdID0gdDtcbiAgICAgIC8vIE1peENvbHVtbnNcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGogKz0gNCkge1xuICAgICAgICBjb25zdCBzMCA9IHN0YXRlW2ogKyAwXTtcbiAgICAgICAgY29uc3QgczEgPSBzdGF0ZVtqICsgMV07XG4gICAgICAgIGNvbnN0IHMyID0gc3RhdGVbaiArIDJdO1xuICAgICAgICBjb25zdCBzMyA9IHN0YXRlW2ogKyAzXTtcbiAgICAgICAgdCA9IHMwIF4gczEgXiBzMiBeIHMzO1xuICAgICAgICBzdGF0ZVtqICsgMF0gXj0gdCBeIHRoaXMuX21peENvbFtzMCBeIHMxXTtcbiAgICAgICAgc3RhdGVbaiArIDFdIF49IHQgXiB0aGlzLl9taXhDb2xbczEgXiBzMl07XG4gICAgICAgIHN0YXRlW2ogKyAyXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MyIF4gczNdO1xuICAgICAgICBzdGF0ZVtqICsgM10gXj0gdCBeIHRoaXMuX21peENvbFtzMyBeIHMwXTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZFJvdW5kS2V5XG4gICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykge1xuICAgICAgICBzdGF0ZVtqXSBePSBrZXlba107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3ViQnl0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIHN0YXRlW2pdID0gc1tzdGF0ZVtqXV07XG4gICAgfVxuICAgIC8vIFNoaWZ0Um93c1xuICAgIHYgPSBzdGF0ZVsxXTtcbiAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdO1xuICAgIHN0YXRlWzVdID0gc3RhdGVbOV07XG4gICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107XG4gICAgc3RhdGVbMTNdID0gdjtcbiAgICB2ID0gc3RhdGVbMl07XG4gICAgdSA9IHN0YXRlWzZdO1xuICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdO1xuICAgIHN0YXRlWzZdID0gc3RhdGVbMTRdO1xuICAgIHN0YXRlWzEwXSA9IHY7XG4gICAgc3RhdGVbMTRdID0gdTtcbiAgICB2ID0gc3RhdGVbM107XG4gICAgdSA9IHN0YXRlWzddO1xuICAgIHQgPSBzdGF0ZVsxMV07XG4gICAgc3RhdGVbM10gPSBzdGF0ZVsxNV07XG4gICAgc3RhdGVbN10gPSB2O1xuICAgIHN0YXRlWzExXSA9IHU7XG4gICAgc3RhdGVbMTVdID0gdDtcbiAgICAvLyBBZGRSb3VuZEtleVxuICAgIGZvciAobGV0IGogPSAwLCBrID0gdGhpcy5fa2V5U2l6ZTsgaiA8IDE2OyArK2osICsraykge1xuICAgICAgc3RhdGVbal0gXj0ga2V5W2tdO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBfZGVjcnlwdEJsb2NrMihkYXRhLCBmaW5hbGl6ZSkge1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIGxldCBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcbiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGl2ID0gdGhpcy5pdjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTtcbiAgICAgICsrYnVmZmVyTGVuZ3RoO1xuICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDE2KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gYnVmZmVyIGlzIGZ1bGwsIGRlY3J5cHRpbmdcbiAgICAgIGNvbnN0IHBsYWluID0gdGhpcy5fZGVjcnlwdChidWZmZXIsIHRoaXMuX2tleSk7XG4gICAgICAvLyB4b3ItaW5nIHRoZSBJViB2ZWN0b3IgdG8gZ2V0IHBsYWluIHRleHRcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgICBwbGFpbltqXSBePSBpdltqXTtcbiAgICAgIH1cbiAgICAgIGl2ID0gYnVmZmVyO1xuICAgICAgcmVzdWx0LnB1c2gocGxhaW4pO1xuICAgICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICAgICAgYnVmZmVyTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgLy8gc2F2aW5nIGluY29tcGxldGUgYnVmZmVyXG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7XG4gICAgdGhpcy5pdiA9IGl2O1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgfVxuICAgIC8vIGNvbWJpbmluZyBwbGFpbiB0ZXh0IGJsb2NrcyBpbnRvIG9uZVxuICAgIGxldCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7XG4gICAgaWYgKGZpbmFsaXplKSB7XG4gICAgICAvLyB1bmRvIGEgcGFkZGluZyB0aGF0IGlzIGRlc2NyaWJlZCBpbiBSRkMgMjg5OFxuICAgICAgY29uc3QgbGFzdEJsb2NrID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGxldCBwc0xlbiA9IGxhc3RCbG9ja1sxNV07XG4gICAgICBpZiAocHNMZW4gPD0gMTYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE1LCBpaSA9IDE2IC0gcHNMZW47IGkgPj0gaWk7IC0taSkge1xuICAgICAgICAgIGlmIChsYXN0QmxvY2tbaV0gIT09IHBzTGVuKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIHBhZGRpbmcsIGFzc3VtZSB0aGF0IHRoZSBibG9jayBoYXMgbm8gcGFkZGluZy5cbiAgICAgICAgICAgIHBzTGVuID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRwdXRMZW5ndGggLT0gcHNMZW47XG4gICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBsYXN0QmxvY2suc3ViYXJyYXkoMCwgMTYgLSBwc0xlbik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG91dHB1dExlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7XG4gICAgICBvdXRwdXQuc2V0KHJlc3VsdFtpXSwgaik7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBkZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUsIGl2ID0gbnVsbCkge1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgIGxldCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uO1xuICAgIC8vIElmIGFuIElWIGlzIG5vdCBzdXBwbGllZCwgd2FpdCBmb3IgSVYgdmFsdWVzLiBUaGV5IGFyZSBhdCB0aGUgc3RhcnRcbiAgICAvLyBvZiB0aGUgc3RyZWFtLlxuICAgIGlmIChpdikge1xuICAgICAgdGhpcy5pdiA9IGl2O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGJ1ZmZlckxlbmd0aCA8IDE2ICYmIGkgPCBzb3VyY2VMZW5ndGg7XG4gICAgICAgICsraSwgKytidWZmZXJMZW5ndGhcbiAgICAgICkge1xuICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07XG4gICAgICB9XG4gICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgLy8gTmVlZCBtb3JlIGRhdGEuXG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICB9XG4gICAgICB0aGlzLml2ID0gYnVmZmVyO1xuICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoMTYpO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgLy8gc3RhcnRpbmcgZGVjcnlwdGlvblxuICAgIHRoaXMuZGVjcnlwdEJsb2NrID0gdGhpcy5fZGVjcnlwdEJsb2NrMjtcbiAgICByZXR1cm4gdGhpcy5kZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUpO1xuICB9XG5cbiAgZW5jcnlwdChkYXRhLCBpdikge1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIGxldCBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcbiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBpZiAoIWl2KSB7XG4gICAgICBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7ICsraSkge1xuICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aF0gPSBkYXRhW2ldO1xuICAgICAgKytidWZmZXJMZW5ndGg7XG4gICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgICBidWZmZXJbal0gXj0gaXZbal07XG4gICAgICB9XG5cbiAgICAgIC8vIGJ1ZmZlciBpcyBmdWxsLCBlbmNyeXB0aW5nXG4gICAgICBjb25zdCBjaXBoZXIgPSB0aGlzLl9lbmNyeXB0KGJ1ZmZlciwgdGhpcy5fa2V5KTtcbiAgICAgIGl2ID0gY2lwaGVyO1xuICAgICAgcmVzdWx0LnB1c2goY2lwaGVyKTtcbiAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgfVxuICAgIC8vIHNhdmluZyBpbmNvbXBsZXRlIGJ1ZmZlclxuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICAgIHRoaXMuaXYgPSBpdjtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICAvLyBjb21iaW5pbmcgcGxhaW4gdGV4dCBibG9ja3MgaW50byBvbmVcbiAgICBjb25zdCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7XG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlpID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGlpOyArK2ksIGogKz0gMTYpIHtcbiAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufVxuXG5jbGFzcyBBRVMxMjhDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHtcbiAgY29uc3RydWN0b3Ioa2V5KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbiA9IDEwO1xuICAgIHRoaXMuX2tleVNpemUgPSAxNjA7IC8vIGJpdHNcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHRoaXMuX3Jjb24gPSBuZXcgVWludDhBcnJheShbXG4gICAgICAweDhkLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2LCAweDZjLFxuICAgICAgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSxcbiAgICAgIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsXG4gICAgICAweDYxLCAweGMyLCAweDlmLCAweDI1LCAweDRhLCAweDk0LCAweDMzLCAweDY2LCAweGNjLCAweDgzLCAweDFkLCAweDNhLFxuICAgICAgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCxcbiAgICAgIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsXG4gICAgICAweDk3LCAweDM1LCAweDZhLCAweGQ0LCAweGIzLCAweDdkLCAweGZhLCAweGVmLCAweGM1LCAweDkxLCAweDM5LCAweDcyLFxuICAgICAgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYyxcbiAgICAgIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsXG4gICAgICAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2LCAweDZjLCAweGQ4LCAweGFiLCAweDRkLCAweDlhLCAweDJmLCAweDVlLFxuICAgICAgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSxcbiAgICAgIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsXG4gICAgICAweDMzLCAweDY2LCAweGNjLCAweDgzLCAweDFkLCAweDNhLCAweDc0LCAweGU4LCAweGNiLCAweDhkLCAweDAxLCAweDAyLFxuICAgICAgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCxcbiAgICAgIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsXG4gICAgICAweGZhLCAweGVmLCAweGM1LCAweDkxLCAweDM5LCAweDcyLCAweGU0LCAweGQzLCAweGJkLCAweDYxLCAweGMyLCAweDlmLFxuICAgICAgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYixcbiAgICAgIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsXG4gICAgICAweGQ4LCAweGFiLCAweDRkLCAweDlhLCAweDJmLCAweDVlLCAweGJjLCAweDYzLCAweGM2LCAweDk3LCAweDM1LCAweDZhLFxuICAgICAgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCxcbiAgICAgIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsXG4gICAgICAweDc0LCAweGU4LCAweGNiLCAweDhkLFxuICAgIF0pO1xuXG4gICAgdGhpcy5fa2V5ID0gdGhpcy5fZXhwYW5kS2V5KGtleSk7XG4gIH1cblxuICBfZXhwYW5kS2V5KGNpcGhlcktleSkge1xuICAgIGNvbnN0IGIgPSAxNzY7XG4gICAgY29uc3QgcyA9IHRoaXMuX3M7XG4gICAgY29uc3QgcmNvbiA9IHRoaXMuX3Jjb247XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShiKTtcbiAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7XG5cbiAgICBmb3IgKGxldCBqID0gMTYsIGkgPSAxOyBqIDwgYjsgKytpKSB7XG4gICAgICAvLyBSb3RXb3JkXG4gICAgICBsZXQgdDEgPSByZXN1bHRbaiAtIDNdO1xuICAgICAgbGV0IHQyID0gcmVzdWx0W2ogLSAyXTtcbiAgICAgIGxldCB0MyA9IHJlc3VsdFtqIC0gMV07XG4gICAgICBsZXQgdDQgPSByZXN1bHRbaiAtIDRdO1xuICAgICAgLy8gU3ViV29yZFxuICAgICAgdDEgPSBzW3QxXTtcbiAgICAgIHQyID0gc1t0Ml07XG4gICAgICB0MyA9IHNbdDNdO1xuICAgICAgdDQgPSBzW3Q0XTtcbiAgICAgIC8vIFJjb25cbiAgICAgIHQxID0gdDEgXiByY29uW2ldO1xuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA0OyArK24pIHtcbiAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAxNl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDIgXj0gcmVzdWx0W2ogLSAxNl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAxNl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAxNl07XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jbGFzcyBBRVMyNTZDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHtcbiAgY29uc3RydWN0b3Ioa2V5KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbiA9IDE0O1xuICAgIHRoaXMuX2tleVNpemUgPSAyMjQ7IC8vIGJpdHNcblxuICAgIHRoaXMuX2tleSA9IHRoaXMuX2V4cGFuZEtleShrZXkpO1xuICB9XG5cbiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHtcbiAgICBjb25zdCBiID0gMjQwO1xuICAgIGNvbnN0IHMgPSB0aGlzLl9zO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYik7XG4gICAgcmVzdWx0LnNldChjaXBoZXJLZXkpO1xuXG4gICAgbGV0IHIgPSAxO1xuICAgIGxldCB0MSwgdDIsIHQzLCB0NDtcbiAgICBmb3IgKGxldCBqID0gMzIsIGkgPSAxOyBqIDwgYjsgKytpKSB7XG4gICAgICBpZiAoaiAlIDMyID09PSAxNikge1xuICAgICAgICB0MSA9IHNbdDFdO1xuICAgICAgICB0MiA9IHNbdDJdO1xuICAgICAgICB0MyA9IHNbdDNdO1xuICAgICAgICB0NCA9IHNbdDRdO1xuICAgICAgfSBlbHNlIGlmIChqICUgMzIgPT09IDApIHtcbiAgICAgICAgLy8gUm90V29yZFxuICAgICAgICB0MSA9IHJlc3VsdFtqIC0gM107XG4gICAgICAgIHQyID0gcmVzdWx0W2ogLSAyXTtcbiAgICAgICAgdDMgPSByZXN1bHRbaiAtIDFdO1xuICAgICAgICB0NCA9IHJlc3VsdFtqIC0gNF07XG4gICAgICAgIC8vIFN1YldvcmRcbiAgICAgICAgdDEgPSBzW3QxXTtcbiAgICAgICAgdDIgPSBzW3QyXTtcbiAgICAgICAgdDMgPSBzW3QzXTtcbiAgICAgICAgdDQgPSBzW3Q0XTtcbiAgICAgICAgLy8gUmNvblxuICAgICAgICB0MSA9IHQxIF4gcjtcbiAgICAgICAgaWYgKChyIDw8PSAxKSA+PSAyNTYpIHtcbiAgICAgICAgICByID0gKHIgXiAweDFiKSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA0OyArK24pIHtcbiAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAzMl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDIgXj0gcmVzdWx0W2ogLSAzMl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAzMl07XG4gICAgICAgIGorKztcbiAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAzMl07XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG52YXIgUERGMTcgPSAoZnVuY3Rpb24gUERGMTdDbG9zdXJlKCkge1xuICBmdW5jdGlvbiBjb21wYXJlQnl0ZUFycmF5cyhhcnJheTEsIGFycmF5Mikge1xuICAgIGlmIChhcnJheTEubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUERGMTcoKSB7fVxuXG4gIFBERjE3LnByb3RvdHlwZSA9IHtcbiAgICBjaGVja093bmVyUGFzc3dvcmQ6IGZ1bmN0aW9uIFBERjE3X2NoZWNrT3duZXJQYXNzd29yZChcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgb3duZXJWYWxpZGF0aW9uU2FsdCxcbiAgICAgIHVzZXJCeXRlcyxcbiAgICAgIG93bmVyUGFzc3dvcmRcbiAgICApIHtcbiAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDU2KTtcbiAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7XG4gICAgICBoYXNoRGF0YS5zZXQob3duZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyVmFsaWRhdGlvblNhbHQubGVuZ3RoKTtcbiAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7XG4gICAgICByZXR1cm4gY29tcGFyZUJ5dGVBcnJheXMocmVzdWx0LCBvd25lclBhc3N3b3JkKTtcbiAgICB9LFxuICAgIGNoZWNrVXNlclBhc3N3b3JkOiBmdW5jdGlvbiBQREYxN19jaGVja1VzZXJQYXNzd29yZChcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgdXNlclZhbGlkYXRpb25TYWx0LFxuICAgICAgdXNlclBhc3N3b3JkXG4gICAgKSB7XG4gICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTtcbiAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7XG4gICAgICBoYXNoRGF0YS5zZXQodXNlclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpO1xuICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTtcbiAgICAgIHJldHVybiBjb21wYXJlQnl0ZUFycmF5cyhyZXN1bHQsIHVzZXJQYXNzd29yZCk7XG4gICAgfSxcbiAgICBnZXRPd25lcktleTogZnVuY3Rpb24gUERGMTdfZ2V0T3duZXJLZXkoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIG93bmVyS2V5U2FsdCxcbiAgICAgIHVzZXJCeXRlcyxcbiAgICAgIG93bmVyRW5jcnlwdGlvblxuICAgICkge1xuICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpO1xuICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTtcbiAgICAgIGhhc2hEYXRhLnNldChvd25lcktleVNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7XG4gICAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lcktleVNhbHQubGVuZ3RoKTtcbiAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpO1xuICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTtcbiAgICB9LFxuICAgIGdldFVzZXJLZXk6IGZ1bmN0aW9uIFBERjE3X2dldFVzZXJLZXkoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHVzZXJLZXlTYWx0LFxuICAgICAgdXNlckVuY3J5cHRpb25cbiAgICApIHtcbiAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpO1xuICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIC8vIGBrZXlgIGlzIHRoZSBkZWNyeXB0aW9uIGtleSBmb3IgdGhlIFVFIHN0cmluZy5cbiAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpO1xuICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sodXNlckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBQREYxNztcbn0pKCk7XG5cbnZhciBQREYyMCA9IChmdW5jdGlvbiBQREYyMENsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIGNvbmNhdEFycmF5cyhhcnJheTEsIGFycmF5Mikge1xuICAgIHZhciB0ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpO1xuICAgIHQuc2V0KGFycmF5MSwgMCk7XG4gICAgdC5zZXQoYXJyYXkyLCBhcnJheTEubGVuZ3RoKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykge1xuICAgIC8vIFRoaXMgcmVmZXJzIHRvIEFsZ29yaXRobSAyLkIgYXMgZGVmaW5lZCBpbiBJU08gMzIwMDAtMi5cbiAgICB2YXIgayA9IGNhbGN1bGF0ZVNIQTI1NihpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKS5zdWJhcnJheSgwLCAzMik7XG4gICAgdmFyIGUgPSBbMF07XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgNjQgfHwgZVtlLmxlbmd0aCAtIDFdID4gaSAtIDMyKSB7XG4gICAgICB2YXIgYXJyYXlMZW5ndGggPSBwYXNzd29yZC5sZW5ndGggKyBrLmxlbmd0aCArIHVzZXJCeXRlcy5sZW5ndGg7XG5cbiAgICAgIHZhciBrMSA9IG5ldyBVaW50OEFycmF5KGFycmF5TGVuZ3RoICogNjQpO1xuICAgICAgdmFyIGFycmF5ID0gY29uY2F0QXJyYXlzKHBhc3N3b3JkLCBrKTtcbiAgICAgIGFycmF5ID0gY29uY2F0QXJyYXlzKGFycmF5LCB1c2VyQnl0ZXMpO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIHBvcyA9IDA7IGogPCA2NDsgaisrLCBwb3MgKz0gYXJyYXlMZW5ndGgpIHtcbiAgICAgICAgazEuc2V0KGFycmF5LCBwb3MpO1xuICAgICAgfVxuICAgICAgLy8gQUVTMTI4IENCQyBOTyBQQURESU5HIHdpdGggZmlyc3QgMTYgYnl0ZXMgb2YgayBhcyB0aGUga2V5XG4gICAgICAvLyBhbmQgdGhlIHNlY29uZCAxNiBhcyB0aGUgaXYuXG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzEyOENpcGhlcihrLnN1YmFycmF5KDAsIDE2KSk7XG4gICAgICBlID0gY2lwaGVyLmVuY3J5cHQoazEsIGsuc3ViYXJyYXkoMTYsIDMyKSk7XG4gICAgICAvLyBOb3cgd2UgaGF2ZSB0byB0YWtlIHRoZSBmaXJzdCAxNiBieXRlcyBvZiBhbiB1bnNpZ25lZCBiaWcgZW5kaWFuXG4gICAgICAvLyBpbnRlZ2VyIGFuZCBjb21wdXRlIHRoZSByZW1haW5kZXIgbW9kdWxvIDMuIFRoYXQgaXMgYSBmYWlybHkgbGFyZ2VcbiAgICAgIC8vIG51bWJlciBhbmQgSmF2YVNjcmlwdCBpc24ndCBnb2luZyB0byBoYW5kbGUgdGhhdCB3ZWxsLCBzbyB3ZSdyZSB1c2luZ1xuICAgICAgLy8gYSB0cmljayB0aGF0IGFsbG93cyB1cyB0byBwZXJmb3JtIG1vZHVsbyBtYXRoIGJ5dGUgYnkgYnl0ZS5cbiAgICAgIHZhciByZW1haW5kZXIgPSAwO1xuICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCAxNjsgeisrKSB7XG4gICAgICAgIHJlbWFpbmRlciAqPSAyNTYgJSAzO1xuICAgICAgICByZW1haW5kZXIgJT0gMztcbiAgICAgICAgcmVtYWluZGVyICs9IChlW3pdID4+PiAwKSAlIDM7XG4gICAgICAgIHJlbWFpbmRlciAlPSAzO1xuICAgICAgfVxuICAgICAgaWYgKHJlbWFpbmRlciA9PT0gMCkge1xuICAgICAgICBrID0gY2FsY3VsYXRlU0hBMjU2KGUsIDAsIGUubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluZGVyID09PSAxKSB7XG4gICAgICAgIGsgPSBjYWxjdWxhdGVTSEEzODQoZSwgMCwgZS5sZW5ndGgpO1xuICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDIpIHtcbiAgICAgICAgayA9IGNhbGN1bGF0ZVNIQTUxMihlLCAwLCBlLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBrLnN1YmFycmF5KDAsIDMyKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUERGMjAoKSB7fVxuXG4gIGZ1bmN0aW9uIGNvbXBhcmVCeXRlQXJyYXlzKGFycmF5MSwgYXJyYXkyKSB7XG4gICAgaWYgKGFycmF5MS5sZW5ndGggIT09IGFycmF5Mi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJheTFbaV0gIT09IGFycmF5MltpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgUERGMjAucHJvdG90eXBlID0ge1xuICAgIGhhc2g6IGZ1bmN0aW9uIFBERjIwX2hhc2gocGFzc3dvcmQsIGNvbmNhdEJ5dGVzLCB1c2VyQnl0ZXMpIHtcbiAgICAgIHJldHVybiBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGNvbmNhdEJ5dGVzLCB1c2VyQnl0ZXMpO1xuICAgIH0sXG4gICAgY2hlY2tPd25lclBhc3N3b3JkOiBmdW5jdGlvbiBQREYyMF9jaGVja093bmVyUGFzc3dvcmQoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIG93bmVyVmFsaWRhdGlvblNhbHQsXG4gICAgICB1c2VyQnl0ZXMsXG4gICAgICBvd25lclBhc3N3b3JkXG4gICAgKSB7XG4gICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7XG4gICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApO1xuICAgICAgaGFzaERhdGEuc2V0KG93bmVyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7XG4gICAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lclZhbGlkYXRpb25TYWx0Lmxlbmd0aCk7XG4gICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgdXNlckJ5dGVzKTtcbiAgICAgIHJldHVybiBjb21wYXJlQnl0ZUFycmF5cyhyZXN1bHQsIG93bmVyUGFzc3dvcmQpO1xuICAgIH0sXG4gICAgY2hlY2tVc2VyUGFzc3dvcmQ6IGZ1bmN0aW9uIFBERjIwX2NoZWNrVXNlclBhc3N3b3JkKFxuICAgICAgcGFzc3dvcmQsXG4gICAgICB1c2VyVmFsaWRhdGlvblNhbHQsXG4gICAgICB1c2VyUGFzc3dvcmRcbiAgICApIHtcbiAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpO1xuICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7XG4gICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgW10pO1xuICAgICAgcmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKHJlc3VsdCwgdXNlclBhc3N3b3JkKTtcbiAgICB9LFxuICAgIGdldE93bmVyS2V5OiBmdW5jdGlvbiBQREYyMF9nZXRPd25lcktleShcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgb3duZXJLZXlTYWx0LFxuICAgICAgdXNlckJ5dGVzLFxuICAgICAgb3duZXJFbmNyeXB0aW9uXG4gICAgKSB7XG4gICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7XG4gICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApO1xuICAgICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpO1xuICAgICAgdmFyIGtleSA9IGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpO1xuICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTtcbiAgICB9LFxuICAgIGdldFVzZXJLZXk6IGZ1bmN0aW9uIFBERjIwX2dldFVzZXJLZXkoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHVzZXJLZXlTYWx0LFxuICAgICAgdXNlckVuY3J5cHRpb25cbiAgICApIHtcbiAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpO1xuICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTtcbiAgICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIC8vIGBrZXlgIGlzIHRoZSBkZWNyeXB0aW9uIGtleSBmb3IgdGhlIFVFIHN0cmluZy5cbiAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCBbXSk7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpO1xuICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sodXNlckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBQREYyMDtcbn0pKCk7XG5cbnZhciBDaXBoZXJUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm0oc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IsIHN0cmVhbUNpcGhlckNvbnN0cnVjdG9yKSB7XG4gICAgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvciA9IHN0cmluZ0NpcGhlckNvbnN0cnVjdG9yO1xuICAgIHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IgPSBzdHJlYW1DaXBoZXJDb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIENpcGhlclRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gICAgY3JlYXRlU3RyZWFtOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fY3JlYXRlU3RyZWFtKHN0cmVhbSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IoKTtcbiAgICAgIHJldHVybiBuZXcgRGVjcnlwdFN0cmVhbShcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBsZW5ndGgsXG4gICAgICAgIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybURlY3J5cHRTdHJlYW0oZGF0YSwgZmluYWxpemUpIHtcbiAgICAgICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICBkZWNyeXB0U3RyaW5nOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fZGVjcnlwdFN0cmluZyhzKSB7XG4gICAgICB2YXIgY2lwaGVyID0gbmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IoKTtcbiAgICAgIHZhciBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTtcbiAgICAgIGRhdGEgPSBjaXBoZXIuZGVjcnlwdEJsb2NrKGRhdGEsIHRydWUpO1xuICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoZGF0YSk7XG4gICAgfSxcbiAgICBlbmNyeXB0U3RyaW5nOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fZW5jcnlwdFN0cmluZyhzKSB7XG4gICAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKGNpcGhlciBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpIHtcbiAgICAgICAgLy8gQXBwZW5kIHNvbWUgY2hhcnMgZXF1YWwgdG8gXCIxNiAtIChNIG1vZCAxNilcIlxuICAgICAgICAvLyB3aGVyZSBNIGlzIHRoZSBzdHJpbmcgbGVuZ3RoIChzZWUgc2VjdGlvbiA3LjYuMiBpbiBQREYgc3BlY2lmaWNhdGlvbilcbiAgICAgICAgLy8gdG8gaGF2ZSBhIGZpbmFsIHN0cmluZyB3aGVyZSB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgMTYuXG4gICAgICAgIGNvbnN0IHN0ckxlbiA9IHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYWQgPSAxNiAtIChzdHJMZW4gJSAxNik7XG4gICAgICAgIGlmIChwYWQgIT09IDE2KSB7XG4gICAgICAgICAgcyA9IHMucGFkRW5kKDE2ICogTWF0aC5jZWlsKHN0ckxlbiAvIDE2KSwgU3RyaW5nLmZyb21DaGFyQ29kZShwYWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIGFuIGluaXRpYWxpemF0aW9uIHZlY3RvclxuICAgICAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGl2KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgIGl2W2ldID0gTWF0aC5mbG9vcigyNTYgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0YSA9IHN0cmluZ1RvQnl0ZXMocyk7XG4gICAgICAgIGRhdGEgPSBjaXBoZXIuZW5jcnlwdChkYXRhLCBpdik7XG5cbiAgICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGJ1Zi5zZXQoaXYpO1xuICAgICAgICBidWYuc2V0KGRhdGEsIDE2KTtcblxuICAgICAgICByZXR1cm4gYnl0ZXNUb1N0cmluZyhidWYpO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YSA9IHN0cmluZ1RvQnl0ZXMocyk7XG4gICAgICBkYXRhID0gY2lwaGVyLmVuY3J5cHQoZGF0YSk7XG4gICAgICByZXR1cm4gYnl0ZXNUb1N0cmluZyhkYXRhKTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gQ2lwaGVyVHJhbnNmb3JtO1xufSkoKTtcblxudmFyIENpcGhlclRyYW5zZm9ybUZhY3RvcnkgPSAoZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeUNsb3N1cmUoKSB7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgZGVmYXVsdFBhc3N3b3JkQnl0ZXMgPSBuZXcgVWludDhBcnJheShbXG4gICAgMHgyOCwgMHhCRiwgMHg0RSwgMHg1RSwgMHg0RSwgMHg3NSwgMHg4QSwgMHg0MSxcbiAgICAweDY0LCAweDAwLCAweDRFLCAweDU2LCAweEZGLCAweEZBLCAweDAxLCAweDA4LFxuICAgIDB4MkUsIDB4MkUsIDB4MDAsIDB4QjYsIDB4RDAsIDB4NjgsIDB4M0UsIDB4ODAsXG4gICAgMHgyRiwgMHgwQywgMHhBOSwgMHhGRSwgMHg2NCwgMHg1MywgMHg2OSwgMHg3QV0pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRpb25LZXkyMChcbiAgICByZXZpc2lvbixcbiAgICBwYXNzd29yZCxcbiAgICBvd25lclBhc3N3b3JkLFxuICAgIG93bmVyVmFsaWRhdGlvblNhbHQsXG4gICAgb3duZXJLZXlTYWx0LFxuICAgIHVCeXRlcyxcbiAgICB1c2VyUGFzc3dvcmQsXG4gICAgdXNlclZhbGlkYXRpb25TYWx0LFxuICAgIHVzZXJLZXlTYWx0LFxuICAgIG93bmVyRW5jcnlwdGlvbixcbiAgICB1c2VyRW5jcnlwdGlvbixcbiAgICBwZXJtc1xuICApIHtcbiAgICBpZiAocGFzc3dvcmQpIHtcbiAgICAgIHZhciBwYXNzd29yZExlbmd0aCA9IE1hdGgubWluKDEyNywgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmQuc3ViYXJyYXkoMCwgcGFzc3dvcmRMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXNzd29yZCA9IFtdO1xuICAgIH1cbiAgICB2YXIgcGRmQWxnb3JpdGhtO1xuICAgIGlmIChyZXZpc2lvbiA9PT0gNikge1xuICAgICAgcGRmQWxnb3JpdGhtID0gbmV3IFBERjIwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBkZkFsZ29yaXRobSA9IG5ldyBQREYxNygpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBkZkFsZ29yaXRobS5jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGRmQWxnb3JpdGhtLmdldFVzZXJLZXkocGFzc3dvcmQsIHVzZXJLZXlTYWx0LCB1c2VyRW5jcnlwdGlvbik7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhc3N3b3JkLmxlbmd0aCAmJlxuICAgICAgcGRmQWxnb3JpdGhtLmNoZWNrT3duZXJQYXNzd29yZChcbiAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgIG93bmVyVmFsaWRhdGlvblNhbHQsXG4gICAgICAgIHVCeXRlcyxcbiAgICAgICAgb3duZXJQYXNzd29yZFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHBkZkFsZ29yaXRobS5nZXRPd25lcktleShcbiAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgIG93bmVyS2V5U2FsdCxcbiAgICAgICAgdUJ5dGVzLFxuICAgICAgICBvd25lckVuY3J5cHRpb25cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlS2V5RGF0YShcbiAgICBmaWxlSWQsXG4gICAgcGFzc3dvcmQsXG4gICAgb3duZXJQYXNzd29yZCxcbiAgICB1c2VyUGFzc3dvcmQsXG4gICAgZmxhZ3MsXG4gICAgcmV2aXNpb24sXG4gICAga2V5TGVuZ3RoLFxuICAgIGVuY3J5cHRNZXRhZGF0YVxuICApIHtcbiAgICB2YXIgaGFzaERhdGFTaXplID0gNDAgKyBvd25lclBhc3N3b3JkLmxlbmd0aCArIGZpbGVJZC5sZW5ndGg7XG4gICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkoaGFzaERhdGFTaXplKSxcbiAgICAgIGkgPSAwLFxuICAgICAgaixcbiAgICAgIG47XG4gICAgaWYgKHBhc3N3b3JkKSB7XG4gICAgICBuID0gTWF0aC5taW4oMzIsIHBhc3N3b3JkLmxlbmd0aCk7XG4gICAgICBmb3IgKDsgaSA8IG47ICsraSkge1xuICAgICAgICBoYXNoRGF0YVtpXSA9IHBhc3N3b3JkW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICBqID0gMDtcbiAgICB3aGlsZSAoaSA8IDMyKSB7XG4gICAgICBoYXNoRGF0YVtpKytdID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTtcbiAgICB9XG4gICAgLy8gYXMgbm93IHRoZSBwYWRkZWQgcGFzc3dvcmQgaW4gdGhlIGhhc2hEYXRhWzAuLmldXG4gICAgZm9yIChqID0gMCwgbiA9IG93bmVyUGFzc3dvcmQubGVuZ3RoOyBqIDwgbjsgKytqKSB7XG4gICAgICBoYXNoRGF0YVtpKytdID0gb3duZXJQYXNzd29yZFtqXTtcbiAgICB9XG4gICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzICYgMHhmZjtcbiAgICBoYXNoRGF0YVtpKytdID0gKGZsYWdzID4+IDgpICYgMHhmZjtcbiAgICBoYXNoRGF0YVtpKytdID0gKGZsYWdzID4+IDE2KSAmIDB4ZmY7XG4gICAgaGFzaERhdGFbaSsrXSA9IChmbGFncyA+Pj4gMjQpICYgMHhmZjtcbiAgICBmb3IgKGogPSAwLCBuID0gZmlsZUlkLmxlbmd0aDsgaiA8IG47ICsraikge1xuICAgICAgaGFzaERhdGFbaSsrXSA9IGZpbGVJZFtqXTtcbiAgICB9XG4gICAgaWYgKHJldmlzaW9uID49IDQgJiYgIWVuY3J5cHRNZXRhZGF0YSkge1xuICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7XG4gICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjtcbiAgICAgIGhhc2hEYXRhW2krK10gPSAweGZmO1xuICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7XG4gICAgfVxuICAgIHZhciBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTtcbiAgICB2YXIga2V5TGVuZ3RoSW5CeXRlcyA9IGtleUxlbmd0aCA+PiAzO1xuICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikge1xuICAgICAgICBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2gsIDAsIGtleUxlbmd0aEluQnl0ZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZW5jcnlwdGlvbktleSA9IGhhc2guc3ViYXJyYXkoMCwga2V5TGVuZ3RoSW5CeXRlcyk7XG4gICAgdmFyIGNpcGhlciwgY2hlY2tEYXRhO1xuXG4gICAgaWYgKHJldmlzaW9uID49IDMpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7XG4gICAgICAgIGhhc2hEYXRhW2ldID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaV07XG4gICAgICB9XG4gICAgICBmb3IgKGogPSAwLCBuID0gZmlsZUlkLmxlbmd0aDsgaiA8IG47ICsraikge1xuICAgICAgICBoYXNoRGF0YVtpKytdID0gZmlsZUlkW2pdO1xuICAgICAgfVxuICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZW5jcnlwdGlvbktleSk7XG4gICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSkpO1xuICAgICAgbiA9IGVuY3J5cHRpb25LZXkubGVuZ3RoO1xuICAgICAgdmFyIGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShuKSxcbiAgICAgICAgaztcbiAgICAgIGZvciAoaiA9IDE7IGogPD0gMTk7ICsraikge1xuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgICAgICAgZGVyaXZlZEtleVtrXSA9IGVuY3J5cHRpb25LZXlba10gXiBqO1xuICAgICAgICB9XG4gICAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGRlcml2ZWRLZXkpO1xuICAgICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNoZWNrRGF0YSk7XG4gICAgICB9XG4gICAgICBmb3IgKGogPSAwLCBuID0gY2hlY2tEYXRhLmxlbmd0aDsgaiA8IG47ICsraikge1xuICAgICAgICBpZiAodXNlclBhc3N3b3JkW2pdICE9PSBjaGVja0RhdGFbal0pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihlbmNyeXB0aW9uS2V5KTtcbiAgICAgIGNoZWNrRGF0YSA9IGNpcGhlci5lbmNyeXB0QmxvY2soZGVmYXVsdFBhc3N3b3JkQnl0ZXMpO1xuICAgICAgZm9yIChqID0gMCwgbiA9IGNoZWNrRGF0YS5sZW5ndGg7IGogPCBuOyArK2opIHtcbiAgICAgICAgaWYgKHVzZXJQYXNzd29yZFtqXSAhPT0gY2hlY2tEYXRhW2pdKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuY3J5cHRpb25LZXk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpIHtcbiAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheSgzMiksXG4gICAgICBpID0gMCxcbiAgICAgIGosXG4gICAgICBuO1xuICAgIG4gPSBNYXRoLm1pbigzMiwgcGFzc3dvcmQubGVuZ3RoKTtcbiAgICBmb3IgKDsgaSA8IG47ICsraSkge1xuICAgICAgaGFzaERhdGFbaV0gPSBwYXNzd29yZFtpXTtcbiAgICB9XG4gICAgaiA9IDA7XG4gICAgd2hpbGUgKGkgPCAzMikge1xuICAgICAgaGFzaERhdGFbaSsrXSA9IGRlZmF1bHRQYXNzd29yZEJ5dGVzW2orK107XG4gICAgfVxuICAgIHZhciBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTtcbiAgICB2YXIga2V5TGVuZ3RoSW5CeXRlcyA9IGtleUxlbmd0aCA+PiAzO1xuICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikge1xuICAgICAgICBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2gsIDAsIGhhc2gubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2lwaGVyLCB1c2VyUGFzc3dvcmQ7XG4gICAgaWYgKHJldmlzaW9uID49IDMpIHtcbiAgICAgIHVzZXJQYXNzd29yZCA9IG93bmVyUGFzc3dvcmQ7XG4gICAgICB2YXIgZGVyaXZlZEtleSA9IG5ldyBVaW50OEFycmF5KGtleUxlbmd0aEluQnl0ZXMpLFxuICAgICAgICBrO1xuICAgICAgZm9yIChqID0gMTk7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBrZXlMZW5ndGhJbkJ5dGVzOyArK2spIHtcbiAgICAgICAgICBkZXJpdmVkS2V5W2tdID0gaGFzaFtrXSBeIGo7XG4gICAgICAgIH1cbiAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7XG4gICAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sodXNlclBhc3N3b3JkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoaGFzaC5zdWJhcnJheSgwLCBrZXlMZW5ndGhJbkJ5dGVzKSk7XG4gICAgICB1c2VyUGFzc3dvcmQgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKG93bmVyUGFzc3dvcmQpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlclBhc3N3b3JkO1xuICB9XG5cbiAgdmFyIGlkZW50aXR5TmFtZSA9IE5hbWUuZ2V0KFwiSWRlbnRpdHlcIik7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KGRpY3QsIGZpbGVJZCwgcGFzc3dvcmQpIHtcbiAgICB2YXIgZmlsdGVyID0gZGljdC5nZXQoXCJGaWx0ZXJcIik7XG4gICAgaWYgKCFpc05hbWUoZmlsdGVyLCBcIlN0YW5kYXJkXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJ1bmtub3duIGVuY3J5cHRpb24gbWV0aG9kXCIpO1xuICAgIH1cbiAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIHZhciBhbGdvcml0aG0gPSBkaWN0LmdldChcIlZcIik7XG4gICAgaWYgKFxuICAgICAgIU51bWJlci5pc0ludGVnZXIoYWxnb3JpdGhtKSB8fFxuICAgICAgKGFsZ29yaXRobSAhPT0gMSAmJiBhbGdvcml0aG0gIT09IDIgJiYgYWxnb3JpdGhtICE9PSA0ICYmIGFsZ29yaXRobSAhPT0gNSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcInVuc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnb3JpdGhtXCIpO1xuICAgIH1cbiAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTtcbiAgICB2YXIga2V5TGVuZ3RoID0gZGljdC5nZXQoXCJMZW5ndGhcIik7XG4gICAgaWYgKCFrZXlMZW5ndGgpIHtcbiAgICAgIC8vIFNwZWMgYXNrcyB0byByZWx5IG9uIGVuY3J5cHRpb24gZGljdGlvbmFyeSdzIExlbmd0aCBlbnRyeSwgaG93ZXZlclxuICAgICAgLy8gc29tZSBQREZzIGRvbid0IGhhdmUgaXQuIFRyeWluZyB0byByZWNvdmVyLlxuICAgICAgaWYgKGFsZ29yaXRobSA8PSAzKSB7XG4gICAgICAgIC8vIEZvciAxIGFuZCAyIGl0J3MgZml4ZWQgdG8gNDAtYml0LCBmb3IgMyA0MC1iaXQgaXMgYSBtaW5pbWFsIHZhbHVlLlxuICAgICAgICBrZXlMZW5ndGggPSA0MDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRyeWluZyB0byBmaW5kIGRlZmF1bHQgaGFuZGxlciAtLSBpdCB1c3VhbGx5IGhhcyBMZW5ndGguXG4gICAgICAgIHZhciBjZkRpY3QgPSBkaWN0LmdldChcIkNGXCIpO1xuICAgICAgICB2YXIgc3RyZWFtQ3J5cHRvTmFtZSA9IGRpY3QuZ2V0KFwiU3RtRlwiKTtcbiAgICAgICAgaWYgKGlzRGljdChjZkRpY3QpICYmIGlzTmFtZShzdHJlYW1DcnlwdG9OYW1lKSkge1xuICAgICAgICAgIGNmRGljdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOyAvLyBTZWUgY29tbWVudCBiZWxvdy5cbiAgICAgICAgICB2YXIgaGFuZGxlckRpY3QgPSBjZkRpY3QuZ2V0KHN0cmVhbUNyeXB0b05hbWUubmFtZSk7XG4gICAgICAgICAga2V5TGVuZ3RoID0gKGhhbmRsZXJEaWN0ICYmIGhhbmRsZXJEaWN0LmdldChcIkxlbmd0aFwiKSkgfHwgMTI4O1xuICAgICAgICAgIGlmIChrZXlMZW5ndGggPCA0MCkge1xuICAgICAgICAgICAgLy8gU29tZXRpbWVzIGl0J3MgaW5jb3JyZWN0IHZhbHVlIG9mIGJpdHMsIGdlbmVyYXRvcnMgc3BlY2lmeSBieXRlcy5cbiAgICAgICAgICAgIGtleUxlbmd0aCA8PD0gMztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtleUxlbmd0aCkgfHwga2V5TGVuZ3RoIDwgNDAgfHwga2V5TGVuZ3RoICUgOCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuICAgIH1cblxuICAgIC8vIHByZXBhcmUga2V5c1xuICAgIHZhciBvd25lclBhc3N3b3JkID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIk9cIikpLnN1YmFycmF5KDAsIDMyKTtcbiAgICB2YXIgdXNlclBhc3N3b3JkID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIlVcIikpLnN1YmFycmF5KDAsIDMyKTtcbiAgICB2YXIgZmxhZ3MgPSBkaWN0LmdldChcIlBcIik7XG4gICAgdmFyIHJldmlzaW9uID0gZGljdC5nZXQoXCJSXCIpO1xuICAgIC8vIG1lYW5pbmdmdWwgd2hlbiBWIGlzIDQgb3IgNVxuICAgIHZhciBlbmNyeXB0TWV0YWRhdGEgPVxuICAgICAgKGFsZ29yaXRobSA9PT0gNCB8fCBhbGdvcml0aG0gPT09IDUpICYmXG4gICAgICBkaWN0LmdldChcIkVuY3J5cHRNZXRhZGF0YVwiKSAhPT0gZmFsc2U7XG4gICAgdGhpcy5lbmNyeXB0TWV0YWRhdGEgPSBlbmNyeXB0TWV0YWRhdGE7XG5cbiAgICB2YXIgZmlsZUlkQnl0ZXMgPSBzdHJpbmdUb0J5dGVzKGZpbGVJZCk7XG4gICAgdmFyIHBhc3N3b3JkQnl0ZXM7XG4gICAgaWYgKHBhc3N3b3JkKSB7XG4gICAgICBpZiAocmV2aXNpb24gPT09IDYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXNzd29yZCA9IHV0ZjhTdHJpbmdUb1N0cmluZyhwYXNzd29yZCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeTogXCIgK1xuICAgICAgICAgICAgICBcIlVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhc3N3b3JkQnl0ZXMgPSBzdHJpbmdUb0J5dGVzKHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICB2YXIgZW5jcnlwdGlvbktleTtcbiAgICBpZiAoYWxnb3JpdGhtICE9PSA1KSB7XG4gICAgICBlbmNyeXB0aW9uS2V5ID0gcHJlcGFyZUtleURhdGEoXG4gICAgICAgIGZpbGVJZEJ5dGVzLFxuICAgICAgICBwYXNzd29yZEJ5dGVzLFxuICAgICAgICBvd25lclBhc3N3b3JkLFxuICAgICAgICB1c2VyUGFzc3dvcmQsXG4gICAgICAgIGZsYWdzLFxuICAgICAgICByZXZpc2lvbixcbiAgICAgICAga2V5TGVuZ3RoLFxuICAgICAgICBlbmNyeXB0TWV0YWRhdGFcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvd25lclZhbGlkYXRpb25TYWx0ID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIk9cIikpLnN1YmFycmF5KDMyLCA0MCk7XG4gICAgICB2YXIgb3duZXJLZXlTYWx0ID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIk9cIikpLnN1YmFycmF5KDQwLCA0OCk7XG4gICAgICB2YXIgdUJ5dGVzID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIlVcIikpLnN1YmFycmF5KDAsIDQ4KTtcbiAgICAgIHZhciB1c2VyVmFsaWRhdGlvblNhbHQgPSBzdHJpbmdUb0J5dGVzKGRpY3QuZ2V0KFwiVVwiKSkuc3ViYXJyYXkoMzIsIDQwKTtcbiAgICAgIHZhciB1c2VyS2V5U2FsdCA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoXCJVXCIpKS5zdWJhcnJheSg0MCwgNDgpO1xuICAgICAgdmFyIG93bmVyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoXCJPRVwiKSk7XG4gICAgICB2YXIgdXNlckVuY3J5cHRpb24gPSBzdHJpbmdUb0J5dGVzKGRpY3QuZ2V0KFwiVUVcIikpO1xuICAgICAgdmFyIHBlcm1zID0gc3RyaW5nVG9CeXRlcyhkaWN0LmdldChcIlBlcm1zXCIpKTtcbiAgICAgIGVuY3J5cHRpb25LZXkgPSBjcmVhdGVFbmNyeXB0aW9uS2V5MjAoXG4gICAgICAgIHJldmlzaW9uLFxuICAgICAgICBwYXNzd29yZEJ5dGVzLFxuICAgICAgICBvd25lclBhc3N3b3JkLFxuICAgICAgICBvd25lclZhbGlkYXRpb25TYWx0LFxuICAgICAgICBvd25lcktleVNhbHQsXG4gICAgICAgIHVCeXRlcyxcbiAgICAgICAgdXNlclBhc3N3b3JkLFxuICAgICAgICB1c2VyVmFsaWRhdGlvblNhbHQsXG4gICAgICAgIHVzZXJLZXlTYWx0LFxuICAgICAgICBvd25lckVuY3J5cHRpb24sXG4gICAgICAgIHVzZXJFbmNyeXB0aW9uLFxuICAgICAgICBwZXJtc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFlbmNyeXB0aW9uS2V5ICYmICFwYXNzd29yZCkge1xuICAgICAgdGhyb3cgbmV3IFBhc3N3b3JkRXhjZXB0aW9uKFxuICAgICAgICBcIk5vIHBhc3N3b3JkIGdpdmVuXCIsXG4gICAgICAgIFBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghZW5jcnlwdGlvbktleSAmJiBwYXNzd29yZCkge1xuICAgICAgLy8gQXR0ZW1wdGluZyB1c2UgdGhlIHBhc3N3b3JkIGFzIGFuIG93bmVyIHBhc3N3b3JkXG4gICAgICB2YXIgZGVjb2RlZFBhc3N3b3JkID0gZGVjb2RlVXNlclBhc3N3b3JkKFxuICAgICAgICBwYXNzd29yZEJ5dGVzLFxuICAgICAgICBvd25lclBhc3N3b3JkLFxuICAgICAgICByZXZpc2lvbixcbiAgICAgICAga2V5TGVuZ3RoXG4gICAgICApO1xuICAgICAgZW5jcnlwdGlvbktleSA9IHByZXBhcmVLZXlEYXRhKFxuICAgICAgICBmaWxlSWRCeXRlcyxcbiAgICAgICAgZGVjb2RlZFBhc3N3b3JkLFxuICAgICAgICBvd25lclBhc3N3b3JkLFxuICAgICAgICB1c2VyUGFzc3dvcmQsXG4gICAgICAgIGZsYWdzLFxuICAgICAgICByZXZpc2lvbixcbiAgICAgICAga2V5TGVuZ3RoLFxuICAgICAgICBlbmNyeXB0TWV0YWRhdGFcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFlbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgUGFzc3dvcmRFeGNlcHRpb24oXG4gICAgICAgIFwiSW5jb3JyZWN0IFBhc3N3b3JkXCIsXG4gICAgICAgIFBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuXG4gICAgaWYgKGFsZ29yaXRobSA+PSA0KSB7XG4gICAgICB2YXIgY2YgPSBkaWN0LmdldChcIkNGXCIpO1xuICAgICAgaWYgKGlzRGljdChjZikpIHtcbiAgICAgICAgLy8gVGhlICdDRicgZGljdGlvbmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBlbmNyeXB0ZWQsIGFuZCBieSBzZXR0aW5nXG4gICAgICAgIC8vIGBzdXBwcmVzc0VuY3J5cHRpb25gIHdlIGNhbiBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AgaW5zaWRlIG9mXG4gICAgICAgIC8vIGBYUmVmX2ZldGNoVW5jb21wcmVzc2VkYCBpZiB0aGUgZGljdGlvbmFyeSBjb250YWlucyBpbmRpcmVjdCBvYmplY3RzXG4gICAgICAgIC8vIChmaXhlcyBpc3N1ZTc2NjUucGRmKS5cbiAgICAgICAgY2Yuc3VwcHJlc3NFbmNyeXB0aW9uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2YgPSBjZjtcbiAgICAgIHRoaXMuc3RtZiA9IGRpY3QuZ2V0KFwiU3RtRlwiKSB8fCBpZGVudGl0eU5hbWU7XG4gICAgICB0aGlzLnN0cmYgPSBkaWN0LmdldChcIlN0ckZcIikgfHwgaWRlbnRpdHlOYW1lO1xuICAgICAgdGhpcy5lZmYgPSBkaWN0LmdldChcIkVGRlwiKSB8fCB0aGlzLnN0bWY7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGVuY3J5cHRpb25LZXksIGlzQWVzKSB7XG4gICAgdmFyIGtleSA9IG5ldyBVaW50OEFycmF5KGVuY3J5cHRpb25LZXkubGVuZ3RoICsgOSksXG4gICAgICBpLFxuICAgICAgbjtcbiAgICBmb3IgKGkgPSAwLCBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGtleVtpXSA9IGVuY3J5cHRpb25LZXlbaV07XG4gICAgfVxuICAgIGtleVtpKytdID0gbnVtICYgMHhmZjtcbiAgICBrZXlbaSsrXSA9IChudW0gPj4gOCkgJiAweGZmO1xuICAgIGtleVtpKytdID0gKG51bSA+PiAxNikgJiAweGZmO1xuICAgIGtleVtpKytdID0gZ2VuICYgMHhmZjtcbiAgICBrZXlbaSsrXSA9IChnZW4gPj4gOCkgJiAweGZmO1xuICAgIGlmIChpc0Flcykge1xuICAgICAga2V5W2krK10gPSAweDczO1xuICAgICAga2V5W2krK10gPSAweDQxO1xuICAgICAga2V5W2krK10gPSAweDZjO1xuICAgICAga2V5W2krK10gPSAweDU0O1xuICAgIH1cbiAgICB2YXIgaGFzaCA9IGNhbGN1bGF0ZU1ENShrZXksIDAsIGkpO1xuICAgIHJldHVybiBoYXNoLnN1YmFycmF5KDAsIE1hdGgubWluKGVuY3J5cHRpb25LZXkubGVuZ3RoICsgNSwgMTYpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkQ2lwaGVyQ29uc3RydWN0b3IoY2YsIG5hbWUsIG51bSwgZ2VuLCBrZXkpIHtcbiAgICBpZiAoIWlzTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS5cIik7XG4gICAgfVxuICAgIHZhciBjcnlwdEZpbHRlciA9IGNmLmdldChuYW1lLm5hbWUpO1xuICAgIHZhciBjZm07XG4gICAgaWYgKGNyeXB0RmlsdGVyICE9PSBudWxsICYmIGNyeXB0RmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNmbSA9IGNyeXB0RmlsdGVyLmdldChcIkNGTVwiKTtcbiAgICB9XG4gICAgaWYgKCFjZm0gfHwgY2ZtLm5hbWUgPT09IFwiTm9uZVwiKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JOb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IE51bGxDaXBoZXIoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChjZm0ubmFtZSA9PT0gXCJWMlwiKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JWMigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIGZhbHNlKSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoY2ZtLm5hbWUgPT09IFwiQUVTVjJcIikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yQUVTVjIoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQUVTMTI4Q2lwaGVyKGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIHRydWUpKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChjZm0ubmFtZSA9PT0gXCJBRVNWM1wiKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JBRVNWMygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIoa2V5KTtcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gY3J5cHRvIG1ldGhvZFwiKTtcbiAgfVxuXG4gIENpcGhlclRyYW5zZm9ybUZhY3RvcnkucHJvdG90eXBlID0ge1xuICAgIGNyZWF0ZUNpcGhlclRyYW5zZm9ybTogZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeV9jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oXG4gICAgICBudW0sXG4gICAgICBnZW5cbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmFsZ29yaXRobSA9PT0gNCB8fCB0aGlzLmFsZ29yaXRobSA9PT0gNSkge1xuICAgICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShcbiAgICAgICAgICBidWlsZENpcGhlckNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgdGhpcy5jZixcbiAgICAgICAgICAgIHRoaXMuc3RtZixcbiAgICAgICAgICAgIG51bSxcbiAgICAgICAgICAgIGdlbixcbiAgICAgICAgICAgIHRoaXMuZW5jcnlwdGlvbktleVxuICAgICAgICAgICksXG4gICAgICAgICAgYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihcbiAgICAgICAgICAgIHRoaXMuY2YsXG4gICAgICAgICAgICB0aGlzLnN0cmYsXG4gICAgICAgICAgICBudW0sXG4gICAgICAgICAgICBnZW4sXG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRpb25LZXlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBhbGdvcml0aG1zIDEgYW5kIDJcbiAgICAgIHZhciBrZXkgPSBidWlsZE9iamVjdEtleShudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5LCBmYWxzZSk7XG4gICAgICB2YXIgY2lwaGVyQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBidWlsZENpcGhlckNpcGhlckNvbnN0cnVjdG9yKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFSQ0ZvdXJDaXBoZXIoa2V5KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShjaXBoZXJDb25zdHJ1Y3RvciwgY2lwaGVyQ29uc3RydWN0b3IpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIENpcGhlclRyYW5zZm9ybUZhY3Rvcnk7XG59KSgpO1xuXG5leHBvcnQge1xuICBBRVMxMjhDaXBoZXIsXG4gIEFFUzI1NkNpcGhlcixcbiAgQVJDRm91ckNpcGhlcixcbiAgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeSxcbiAgUERGMTcsXG4gIFBERjIwLFxuICBjYWxjdWxhdGVNRDUsXG4gIGNhbGN1bGF0ZVNIQTI1NixcbiAgY2FsY3VsYXRlU0hBMzg0LFxuICBjYWxjdWxhdGVTSEE1MTIsXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIGFzc2VydCxcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIHNoYWRvdyxcbiAgdW5yZWFjaGFibGUsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgaXNEaWN0LCBpc05hbWUsIGlzU3RyZWFtLCBOYW1lLCBSZWYgfSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuLyoqXG4gKiBSZXNpemVzIGFuIFJHQiBpbWFnZSB3aXRoIDMgY29tcG9uZW50cy5cbiAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc3JjIC0gVGhlIHNvdXJjZSBidWZmZXIuXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGRlc3QgLSBUaGUgZGVzdGluYXRpb24gYnVmZmVyLlxuICogQHBhcmFtIHtudW1iZXJ9IHcxIC0gT3JpZ2luYWwgd2lkdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaDEgLSBPcmlnaW5hbCBoZWlnaHQuXG4gKiBAcGFyYW0ge251bWJlcn0gdzIgLSBOZXcgd2lkdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaDIgLSBOZXcgaGVpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhMDEgLSBTaXplIHJlc2VydmVkIGZvciB0aGUgYWxwaGEgY2hhbm5lbC5cbiAqL1xuZnVuY3Rpb24gcmVzaXplUmdiSW1hZ2Uoc3JjLCBkZXN0LCB3MSwgaDEsIHcyLCBoMiwgYWxwaGEwMSkge1xuICBjb25zdCBDT01QT05FTlRTID0gMztcbiAgYWxwaGEwMSA9IGFscGhhMDEgIT09IDEgPyAwIDogYWxwaGEwMTtcbiAgY29uc3QgeFJhdGlvID0gdzEgLyB3MjtcbiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjtcbiAgbGV0IG5ld0luZGV4ID0gMCxcbiAgICBvbGRJbmRleDtcbiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7XG4gIGNvbnN0IHcxU2NhbmxpbmUgPSB3MSAqIENPTVBPTkVOVFM7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB3MjsgaSsrKSB7XG4gICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbykgKiBDT01QT05FTlRTO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaDI7IGkrKykge1xuICAgIGNvbnN0IHB5ID0gTWF0aC5mbG9vcihpICogeVJhdGlvKSAqIHcxU2NhbmxpbmU7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB3MjsgaisrKSB7XG4gICAgICBvbGRJbmRleCA9IHB5ICsgeFNjYWxlZFtqXTtcbiAgICAgIGRlc3RbbmV3SW5kZXgrK10gPSBzcmNbb2xkSW5kZXgrK107XG4gICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdO1xuICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IHNyY1tvbGRJbmRleCsrXTtcbiAgICAgIG5ld0luZGV4ICs9IGFscGhhMDE7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIENvbG9yU3BhY2Uge1xuICBjb25zdHJ1Y3RvcihuYW1lLCBudW1Db21wcykge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBDb2xvclNwYWNlKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIENvbG9yU3BhY2UuXCIpO1xuICAgIH1cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubnVtQ29tcHMgPSBudW1Db21wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgY29sb3IgdmFsdWUgdG8gdGhlIFJHQiBjb2xvci4gVGhlIGNvbG9yIGNvbXBvbmVudHMgYXJlXG4gICAqIGxvY2F0ZWQgaW4gdGhlIHNyYyBhcnJheSBzdGFydGluZyBmcm9tIHRoZSBzcmNPZmZzZXQuIFJldHVybnMgdGhlIGFycmF5XG4gICAqIG9mIHRoZSByZ2IgY29tcG9uZW50cywgZWFjaCB2YWx1ZSByYW5naW5nIGZyb20gWzAsMjU1XS5cbiAgICovXG4gIGdldFJnYihzcmMsIHNyY09mZnNldCkge1xuICAgIGNvbnN0IHJnYiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtcbiAgICB0aGlzLmdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIHJnYiwgMCk7XG4gICAgcmV0dXJuIHJnYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgY29sb3IgdmFsdWUgdG8gdGhlIFJHQiBjb2xvciwgc2ltaWxhciB0byB0aGUgZ2V0UmdiIG1ldGhvZC5cbiAgICogVGhlIHJlc3VsdCBwbGFjZWQgaW50byB0aGUgZGVzdCBhcnJheSBzdGFydGluZyBmcm9tIHRoZSBkZXN0T2Zmc2V0LlxuICAgKi9cbiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgIHVucmVhY2hhYmxlKFwiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0UmdiSXRlbVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aGUgY29sb3IgdmFsdWVzIHRvIHRoZSBSR0IgY29sb3JzLlxuICAgKiBUaGUgY29sb3JzIGFyZSBsb2NhdGVkIGluIHRoZSBzcmMgYXJyYXkgc3RhcnRpbmcgZnJvbSB0aGUgc3JjT2Zmc2V0LlxuICAgKiBUaGUgcmVzdWx0IGlzIHBsYWNlZCBpbnRvIHRoZSBkZXN0IGFycmF5IHN0YXJ0aW5nIGZyb20gdGhlIGRlc3RPZmZzZXQuXG4gICAqIFRoZSBzcmMgYXJyYXkgaXRlbXMgc2hhbGwgYmUgaW4gWzAsMl5iaXRzKSByYW5nZSwgdGhlIGRlc3QgYXJyYXkgaXRlbXNcbiAgICogd2lsbCBiZSBpbiBbMCwyNTVdIHJhbmdlLiBhbHBoYTAxIGluZGljYXRlcyBob3cgbWFueSBhbHBoYSBjb21wb25lbnRzXG4gICAqIHRoZXJlIGFyZSBpbiB0aGUgZGVzdCBhcnJheTsgaXQgd2lsbCBiZSBlaXRoZXIgMCAoUkdCIGFycmF5KSBvciAxIChSR0JBXG4gICAqIGFycmF5KS5cbiAgICovXG4gIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHtcbiAgICB1bnJlYWNoYWJsZShcIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkJ1ZmZlclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGVcbiAgICogY29udmVyc2lvbiBkb25lIGJ5IHRoZSBnZXRSZ2JCdWZmZXIgbWV0aG9kLiBBcyBpbiBnZXRSZ2JCdWZmZXIsXG4gICAqIHxhbHBoYTAxfCBpcyBlaXRoZXIgMCAoUkdCIG91dHB1dCkgb3IgMSAoUkdCQSBvdXRwdXQpLlxuICAgKi9cbiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGhcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHNvdXJjZSBkYXRhIHdpbGwgYmUgZXF1YWwgdGhlIHJlc3VsdC9vdXRwdXQgZGF0YS5cbiAgICovXG4gIGlzUGFzc3Rocm91Z2goYml0cykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlciB0byB0aGUgc3RhdGljIGBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZWAgbWV0aG9kIGJlbG93LlxuICAgKi9cbiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7XG4gICAgcmV0dXJuIENvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgdGhpcy5udW1Db21wcyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsbHMgaW4gdGhlIFJHQiBjb2xvcnMgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIGFscGhhMDEgaW5kaWNhdGVzXG4gICAqIGhvdyBtYW55IGFscGhhIGNvbXBvbmVudHMgdGhlcmUgYXJlIGluIHRoZSBkZXN0IGFycmF5OyBpdCB3aWxsIGJlIGVpdGhlclxuICAgKiAwIChSR0IgYXJyYXkpIG9yIDEgKFJHQkEgYXJyYXkpLlxuICAgKi9cbiAgZmlsbFJnYihcbiAgICBkZXN0LFxuICAgIG9yaWdpbmFsV2lkdGgsXG4gICAgb3JpZ2luYWxIZWlnaHQsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGFjdHVhbEhlaWdodCxcbiAgICBicGMsXG4gICAgY29tcHMsXG4gICAgYWxwaGEwMVxuICApIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ0NvbG9yU3BhY2UuZmlsbFJnYjogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsV2lkdGggKiBvcmlnaW5hbEhlaWdodDtcbiAgICBsZXQgcmdiQnVmID0gbnVsbDtcbiAgICBjb25zdCBudW1Db21wb25lbnRDb2xvcnMgPSAxIDw8IGJwYztcbiAgICBjb25zdCBuZWVkc1Jlc2l6aW5nID0gb3JpZ2luYWxIZWlnaHQgIT09IGhlaWdodCB8fCBvcmlnaW5hbFdpZHRoICE9PSB3aWR0aDtcblxuICAgIGlmICh0aGlzLmlzUGFzc3Rocm91Z2goYnBjKSkge1xuICAgICAgcmdiQnVmID0gY29tcHM7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMubnVtQ29tcHMgPT09IDEgJiZcbiAgICAgIGNvdW50ID4gbnVtQ29tcG9uZW50Q29sb3JzICYmXG4gICAgICB0aGlzLm5hbWUgIT09IFwiRGV2aWNlR3JheVwiICYmXG4gICAgICB0aGlzLm5hbWUgIT09IFwiRGV2aWNlUkdCXCJcbiAgICApIHtcbiAgICAgIC8vIE9wdGltaXphdGlvbjogY3JlYXRlIGEgY29sb3IgbWFwIHdoZW4gdGhlcmUgaXMganVzdCBvbmUgY29tcG9uZW50IGFuZFxuICAgICAgLy8gd2UgYXJlIGNvbnZlcnRpbmcgbW9yZSBjb2xvcnMgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLiBXZVxuICAgICAgLy8gZG9uJ3QgYnVpbGQgdGhlIG1hcCBpZiB0aGUgY29sb3JzcGFjZSBpcyBncmF5IG9yIHJnYiBzaW5jZSB0aG9zZVxuICAgICAgLy8gbWV0aG9kcyBhcmUgZmFzdGVyIHRoYW4gYnVpbGRpbmcgYSBtYXAuIFRoaXMgbWFpbmx5IG9mZmVycyBiaWcgc3BlZWRcbiAgICAgIC8vIHVwcyBmb3IgaW5kZXhlZCBhbmQgYWx0ZXJuYXRlIGNvbG9yc3BhY2VzLlxuICAgICAgLy9cbiAgICAgIC8vIFRPRE8gaXQgbWF5IGJlIHdvcnRoIHdoaWxlIHRvIGNhY2hlIHRoZSBjb2xvciBtYXAuIFdoaWxlIHJ1bm5pbmdcbiAgICAgIC8vIHRlc3RpbmcgSSBuZXZlciBoaXQgYSBjYWNoZSBzbyBJIHdpbGwgbGVhdmUgdGhhdCBvdXQgZm9yIG5vdyAocGVyaGFwc1xuICAgICAgLy8gd2UgYXJlIHJlcGFyc2luZyBjb2xvcnNwYWNlcyB0b28gbXVjaD8pLlxuICAgICAgY29uc3QgYWxsQ29sb3JzID1cbiAgICAgICAgYnBjIDw9IDhcbiAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KG51bUNvbXBvbmVudENvbG9ycylcbiAgICAgICAgICA6IG5ldyBVaW50MTZBcnJheShudW1Db21wb25lbnRDb2xvcnMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRDb2xvcnM7IGkrKykge1xuICAgICAgICBhbGxDb2xvcnNbaV0gPSBpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sb3JNYXAgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobnVtQ29tcG9uZW50Q29sb3JzICogMyk7XG4gICAgICB0aGlzLmdldFJnYkJ1ZmZlcihcbiAgICAgICAgYWxsQ29sb3JzLFxuICAgICAgICAwLFxuICAgICAgICBudW1Db21wb25lbnRDb2xvcnMsXG4gICAgICAgIGNvbG9yTWFwLFxuICAgICAgICAwLFxuICAgICAgICBicGMsXG4gICAgICAgIC8qIGFscGhhMDEgPSAqLyAwXG4gICAgICApO1xuXG4gICAgICBpZiAoIW5lZWRzUmVzaXppbmcpIHtcbiAgICAgICAgLy8gRmlsbCBpbiB0aGUgUkdCIHZhbHVlcyBkaXJlY3RseSBpbnRvIHxkZXN0fC5cbiAgICAgICAgbGV0IGRlc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBjb21wc1tpXSAqIDM7XG4gICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gY29sb3JNYXBba2V5XTtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAyXTtcbiAgICAgICAgICBkZXN0UG9zICs9IGFscGhhMDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OEFycmF5KGNvdW50ICogMyk7XG4gICAgICAgIGxldCByZ2JQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBjb21wc1tpXSAqIDM7XG4gICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleV07XG4gICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleSArIDFdO1xuICAgICAgICAgIHJnYkJ1ZltyZ2JQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW5lZWRzUmVzaXppbmcpIHtcbiAgICAgICAgLy8gRmlsbCBpbiB0aGUgUkdCIHZhbHVlcyBkaXJlY3RseSBpbnRvIHxkZXN0fC5cbiAgICAgICAgdGhpcy5nZXRSZ2JCdWZmZXIoXG4gICAgICAgICAgY29tcHMsXG4gICAgICAgICAgMCxcbiAgICAgICAgICB3aWR0aCAqIGFjdHVhbEhlaWdodCxcbiAgICAgICAgICBkZXN0LFxuICAgICAgICAgIDAsXG4gICAgICAgICAgYnBjLFxuICAgICAgICAgIGFscGhhMDFcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShjb3VudCAqIDMpO1xuICAgICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgY291bnQsIHJnYkJ1ZiwgMCwgYnBjLCAvKiBhbHBoYTAxID0gKi8gMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJnYkJ1Zikge1xuICAgICAgaWYgKG5lZWRzUmVzaXppbmcpIHtcbiAgICAgICAgcmVzaXplUmdiSW1hZ2UoXG4gICAgICAgICAgcmdiQnVmLFxuICAgICAgICAgIGRlc3QsXG4gICAgICAgICAgb3JpZ2luYWxXaWR0aCxcbiAgICAgICAgICBvcmlnaW5hbEhlaWdodCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgYWxwaGEwMVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGRlc3RQb3MgPSAwLFxuICAgICAgICAgIHJnYlBvcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107XG4gICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTtcbiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdO1xuICAgICAgICAgIGRlc3RQb3MgKz0gYWxwaGEwMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIGlmIHRoZSBjb2xvcnNwYWNlIGhhcyBjb21wb25lbnRzIGluIHRoZSBkZWZhdWx0IHJhbmdlIG9mIFswLCAxXS5cbiAgICogVGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IgYWxsIGNvbG9yc3BhY2VzIGV4Y2VwdCBmb3IgbGFiIGNvbG9yIHNwYWNlc1xuICAgKiB3aGljaCBhcmUgWzAsMTAwXSwgWy0xMjgsIDEyN10sIFstMTI4LCAxMjddLlxuICAgKi9cbiAgZ2V0IHVzZXNaZXJvVG9PbmVSYW5nZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidXNlc1plcm9Ub09uZVJhbmdlXCIsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgX2NhY2hlKGNhY2hlS2V5LCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSkge1xuICAgIGlmICghbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgXCJsb2NhbENvbG9yU3BhY2VDYWNoZVwiIGFyZ3VtZW50LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkQ29sb3JTcGFjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCBcInBhcnNlZENvbG9yU3BhY2VcIiBhcmd1bWVudC4nXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgY3NOYW1lLCBjc1JlZjtcbiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgIGNzUmVmID0gY2FjaGVLZXk7XG5cbiAgICAgIC8vIElmIHBhcnNpbmcgc3VjY2VlZGVkLCB3ZSBrbm93IHRoYXQgdGhpcyBjYWxsIGNhbm5vdCB0aHJvdy5cbiAgICAgIGNhY2hlS2V5ID0geHJlZi5mZXRjaChjYWNoZUtleSk7XG4gICAgfVxuICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIE5hbWUpIHtcbiAgICAgIGNzTmFtZSA9IGNhY2hlS2V5Lm5hbWU7XG4gICAgfVxuICAgIGlmIChjc05hbWUgfHwgY3NSZWYpIHtcbiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLnNldChjc05hbWUsIGNzUmVmLCBwYXJzZWRDb2xvclNwYWNlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0Q2FjaGVkKGNhY2hlS2V5LCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkge1xuICAgIGlmICghbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NvbG9yU3BhY2UuZ2V0Q2FjaGVkIC0gZXhwZWN0ZWQgXCJsb2NhbENvbG9yU3BhY2VDYWNoZVwiIGFyZ3VtZW50LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgY29uc3QgbG9jYWxDb2xvclNwYWNlID0gbG9jYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlSZWYoY2FjaGVLZXkpO1xuICAgICAgaWYgKGxvY2FsQ29sb3JTcGFjZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxDb2xvclNwYWNlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjYWNoZUtleSA9IHhyZWYuZmV0Y2goY2FjaGVLZXkpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbnkgZXJyb3JzIHNob3VsZCBiZSBoYW5kbGVkIGR1cmluZyBwYXJzaW5nLCByYXRoZXIgdGhhbiBoZXJlLlxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBOYW1lKSB7XG4gICAgICBjb25zdCBsb2NhbENvbG9yU3BhY2UgPSBsb2NhbENvbG9yU3BhY2VDYWNoZS5nZXRCeU5hbWUoY2FjaGVLZXkubmFtZSk7XG4gICAgICBpZiAobG9jYWxDb2xvclNwYWNlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbENvbG9yU3BhY2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBhcnNlQXN5bmMoe1xuICAgIGNzLFxuICAgIHhyZWYsXG4gICAgcmVzb3VyY2VzID0gbnVsbCxcbiAgICBwZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIH0pIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgICF0aGlzLmdldENhY2hlZChjcywgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpLFxuICAgICAgICBcIkV4cGVjdGVkIGBDb2xvclNwYWNlLmdldENhY2hlZGAgdG8gaGF2ZSBiZWVuIG1hbnVhbGx5IGNoZWNrZWQgXCIgK1xuICAgICAgICAgIFwiYmVmb3JlIGNhbGxpbmcgYENvbG9yU3BhY2UucGFyc2VBc3luY2AuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZENvbG9yU3BhY2UgPSB0aGlzLl9wYXJzZShcbiAgICAgIGNzLFxuICAgICAgeHJlZixcbiAgICAgIHJlc291cmNlcyxcbiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeVxuICAgICk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGNhY2hlIHRoZSBwYXJzZWQgQ29sb3JTcGFjZSwgYnkgbmFtZSBhbmQvb3IgcmVmZXJlbmNlLlxuICAgIHRoaXMuX2NhY2hlKGNzLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSk7XG5cbiAgICByZXR1cm4gcGFyc2VkQ29sb3JTcGFjZTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZSh7XG4gICAgY3MsXG4gICAgeHJlZixcbiAgICByZXNvdXJjZXMgPSBudWxsLFxuICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgfSkge1xuICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSB0aGlzLmdldENhY2hlZChjcywgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpO1xuICAgIGlmIChjYWNoZWRDb2xvclNwYWNlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkQ29sb3JTcGFjZTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkQ29sb3JTcGFjZSA9IHRoaXMuX3BhcnNlKFxuICAgICAgY3MsXG4gICAgICB4cmVmLFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5XG4gICAgKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gY2FjaGUgdGhlIHBhcnNlZCBDb2xvclNwYWNlLCBieSBuYW1lIGFuZC9vciByZWZlcmVuY2UuXG4gICAgdGhpcy5fY2FjaGUoY3MsIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKTtcblxuICAgIHJldHVybiBwYXJzZWRDb2xvclNwYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgX3BhcnNlKGNzLCB4cmVmLCByZXNvdXJjZXMgPSBudWxsLCBwZGZGdW5jdGlvbkZhY3RvcnkpIHtcbiAgICBjcyA9IHhyZWYuZmV0Y2hJZlJlZihjcyk7XG4gICAgaWYgKGlzTmFtZShjcykpIHtcbiAgICAgIHN3aXRjaCAoY3MubmFtZSkge1xuICAgICAgICBjYXNlIFwiRGV2aWNlR3JheVwiOlxuICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtcbiAgICAgICAgY2FzZSBcIkRldmljZVJHQlwiOlxuICAgICAgICBjYXNlIFwiUkdCXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5yZ2I7XG4gICAgICAgIGNhc2UgXCJEZXZpY2VDTVlLXCI6XG4gICAgICAgIGNhc2UgXCJDTVlLXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKC8qIGJhc2VDUyA9ICovIG51bGwpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChpc0RpY3QocmVzb3VyY2VzKSkge1xuICAgICAgICAgICAgY29uc3QgY29sb3JTcGFjZXMgPSByZXNvdXJjZXMuZ2V0KFwiQ29sb3JTcGFjZVwiKTtcbiAgICAgICAgICAgIGlmIChpc0RpY3QoY29sb3JTcGFjZXMpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlc0NTID0gY29sb3JTcGFjZXMuZ2V0KGNzLm5hbWUpO1xuICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzQ1MpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYW1lKHJlc291cmNlc0NTKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlKFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNDUyxcbiAgICAgICAgICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnlcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNzID0gcmVzb3VyY2VzQ1M7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnJlY29nbml6ZWQgQ29sb3JTcGFjZTogJHtjcy5uYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjcykpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB4cmVmLmZldGNoSWZSZWYoY3NbMF0pLm5hbWU7XG4gICAgICBsZXQgcGFyYW1zLCBudW1Db21wcywgYmFzZUNTLCB3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYTtcblxuICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgIGNhc2UgXCJEZXZpY2VHcmF5XCI6XG4gICAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5O1xuICAgICAgICBjYXNlIFwiRGV2aWNlUkdCXCI6XG4gICAgICAgIGNhc2UgXCJSR0JcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtcbiAgICAgICAgY2FzZSBcIkRldmljZUNNWUtcIjpcbiAgICAgICAgY2FzZSBcIkNNWUtcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7XG4gICAgICAgIGNhc2UgXCJDYWxHcmF5XCI6XG4gICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTtcbiAgICAgICAgICB3aGl0ZVBvaW50ID0gcGFyYW1zLmdldEFycmF5KFwiV2hpdGVQb2ludFwiKTtcbiAgICAgICAgICBibGFja1BvaW50ID0gcGFyYW1zLmdldEFycmF5KFwiQmxhY2tQb2ludFwiKTtcbiAgICAgICAgICBnYW1tYSA9IHBhcmFtcy5nZXQoXCJHYW1tYVwiKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENhbEdyYXlDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSk7XG4gICAgICAgIGNhc2UgXCJDYWxSR0JcIjpcbiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pO1xuICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoXCJXaGl0ZVBvaW50XCIpO1xuICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoXCJCbGFja1BvaW50XCIpO1xuICAgICAgICAgIGdhbW1hID0gcGFyYW1zLmdldEFycmF5KFwiR2FtbWFcIik7XG4gICAgICAgICAgY29uc3QgbWF0cml4ID0gcGFyYW1zLmdldEFycmF5KFwiTWF0cml4XCIpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ2FsUkdCQ1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEsIG1hdHJpeCk7XG4gICAgICAgIGNhc2UgXCJJQ0NCYXNlZFwiOlxuICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7XG4gICAgICAgICAgY29uc3QgZGljdCA9IHN0cmVhbS5kaWN0O1xuICAgICAgICAgIG51bUNvbXBzID0gZGljdC5nZXQoXCJOXCIpO1xuICAgICAgICAgIGNvbnN0IGFsdCA9IGRpY3QuZ2V0KFwiQWx0ZXJuYXRlXCIpO1xuICAgICAgICAgIGlmIChhbHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsdENTID0gdGhpcy5fcGFyc2UoYWx0LCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7XG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgYXJlIGNvcnJlY3QsXG4gICAgICAgICAgICAvLyBhbmQgYWxzbyAoaW5kaXJlY3RseSkgdGhhdCBpdCBpcyBub3QgYSBQYXR0ZXJuQ1MuXG4gICAgICAgICAgICBpZiAoYWx0Q1MubnVtQ29tcHMgPT09IG51bUNvbXBzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhbHRDUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhcm4oXCJJQ0NCYXNlZCBjb2xvciBzcGFjZTogSWdub3JpbmcgaW5jb3JyZWN0IC9BbHRlcm5hdGUgZW50cnkuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVtQ29tcHMgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtcbiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSA0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICAgIGJhc2VDUyA9IGNzWzFdIHx8IG51bGw7XG4gICAgICAgICAgaWYgKGJhc2VDUykge1xuICAgICAgICAgICAgYmFzZUNTID0gdGhpcy5fcGFyc2UoYmFzZUNTLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKGJhc2VDUyk7XG4gICAgICAgIGNhc2UgXCJJbmRleGVkXCI6XG4gICAgICAgIGNhc2UgXCJJXCI6XG4gICAgICAgICAgYmFzZUNTID0gdGhpcy5fcGFyc2UoY3NbMV0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTtcbiAgICAgICAgICBjb25zdCBoaVZhbCA9IHhyZWYuZmV0Y2hJZlJlZihjc1syXSkgKyAxO1xuICAgICAgICAgIGNvbnN0IGxvb2t1cCA9IHhyZWYuZmV0Y2hJZlJlZihjc1szXSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBJbmRleGVkQ1MoYmFzZUNTLCBoaVZhbCwgbG9va3VwKTtcbiAgICAgICAgY2FzZSBcIlNlcGFyYXRpb25cIjpcbiAgICAgICAgY2FzZSBcIkRldmljZU5cIjpcbiAgICAgICAgICBjb25zdCBuYW1lID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTtcbiAgICAgICAgICBudW1Db21wcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lLmxlbmd0aCA6IDE7XG4gICAgICAgICAgYmFzZUNTID0gdGhpcy5fcGFyc2UoY3NbMl0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTtcbiAgICAgICAgICBjb25zdCB0aW50Rm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGNzWzNdKTtcbiAgICAgICAgICByZXR1cm4gbmV3IEFsdGVybmF0ZUNTKG51bUNvbXBzLCBiYXNlQ1MsIHRpbnRGbik7XG4gICAgICAgIGNhc2UgXCJMYWJcIjpcbiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pO1xuICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoXCJXaGl0ZVBvaW50XCIpO1xuICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoXCJCbGFja1BvaW50XCIpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlID0gcGFyYW1zLmdldEFycmF5KFwiUmFuZ2VcIik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBMYWJDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbmltcGxlbWVudGVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke21vZGV9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke2NzfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRlY29kZSBtYXAgbWF0Y2hlcyB0aGUgZGVmYXVsdCBkZWNvZGUgbWFwIGZvciBhIGNvbG9yIHNwYWNlLlxuICAgKiBUaGlzIGhhbmRsZXMgdGhlIGdlbmVyYWwgZGVjb2RlIG1hcHMgd2hlcmUgdGhlcmUgYXJlIHR3byB2YWx1ZXMgcGVyXG4gICAqIGNvbXBvbmVudCwgZS5nLiBbMCwgMSwgMCwgMSwgMCwgMV0gZm9yIGEgUkdCIGNvbG9yLlxuICAgKiBUaGlzIGRvZXMgbm90IGhhbmRsZSBMYWIsIEluZGV4ZWQsIG9yIFBhdHRlcm4gZGVjb2RlIG1hcHMgc2luY2UgdGhleSBhcmVcbiAgICogc2xpZ2h0bHkgZGlmZmVyZW50LlxuICAgKiBAcGFyYW0ge0FycmF5fSBkZWNvZGUgLSBEZWNvZGUgbWFwICh1c3VhbGx5IGZyb20gYW4gaW1hZ2UpLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtQ29tcHMgLSBOdW1iZXIgb2YgY29tcG9uZW50cyB0aGUgY29sb3Igc3BhY2UgaGFzLlxuICAgKi9cbiAgc3RhdGljIGlzRGVmYXVsdERlY29kZShkZWNvZGUsIG51bUNvbXBzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobnVtQ29tcHMgKiAyICE9PSBkZWNvZGUubGVuZ3RoKSB7XG4gICAgICB3YXJuKFwiVGhlIGRlY29kZSBtYXAgaXMgbm90IHRoZSBjb3JyZWN0IGxlbmd0aFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkZWNvZGUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgaWYgKGRlY29kZVtpXSAhPT0gMCB8fCBkZWNvZGVbaSArIDFdICE9PSAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHNpbmdsZXRvbnMoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInNpbmdsZXRvbnNcIiwge1xuICAgICAgZ2V0IGdyYXkoKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJncmF5XCIsIG5ldyBEZXZpY2VHcmF5Q1MoKSk7XG4gICAgICB9LFxuICAgICAgZ2V0IHJnYigpIHtcbiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInJnYlwiLCBuZXcgRGV2aWNlUmdiQ1MoKSk7XG4gICAgICB9LFxuICAgICAgZ2V0IGNteWsoKSB7XG4gICAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJjbXlrXCIsIG5ldyBEZXZpY2VDbXlrQ1MoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQWx0ZXJuYXRlIGNvbG9yIHNwYWNlIGhhbmRsZXMgYm90aCBTZXBhcmF0aW9uIGFuZCBEZXZpY2VOIGNvbG9yIHNwYWNlcy4gIEFcbiAqIFNlcGFyYXRpb24gY29sb3Igc3BhY2UgaXMgYWN0dWFsbHkganVzdCBhIERldmljZU4gd2l0aCBvbmUgY29sb3IgY29tcG9uZW50LlxuICogQm90aCBjb2xvciBzcGFjZXMgdXNlIGEgdGludGluZyBmdW5jdGlvbiB0byBjb252ZXJ0IGNvbG9ycyB0byBhIGJhc2UgY29sb3JcbiAqIHNwYWNlLlxuICpcbiAqIFRoZSBkZWZhdWx0IGNvbG9yIGlzIGBuZXcgRmxvYXQzMkFycmF5KG5ldyBBcnJheShudW1Db21wcykuZmlsbCgxKSlgLlxuICovXG5jbGFzcyBBbHRlcm5hdGVDUyBleHRlbmRzIENvbG9yU3BhY2Uge1xuICBjb25zdHJ1Y3RvcihudW1Db21wcywgYmFzZSwgdGludEZuKSB7XG4gICAgc3VwZXIoXCJBbHRlcm5hdGVcIiwgbnVtQ29tcHMpO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy50aW50Rm4gPSB0aW50Rm47XG4gICAgdGhpcy50bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KGJhc2UubnVtQ29tcHMpO1xuICB9XG5cbiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnQWx0ZXJuYXRlQ1MuZ2V0UmdiSXRlbTogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB0bXBCdWYgPSB0aGlzLnRtcEJ1ZjtcbiAgICB0aGlzLnRpbnRGbihzcmMsIHNyY09mZnNldCwgdG1wQnVmLCAwKTtcbiAgICB0aGlzLmJhc2UuZ2V0UmdiSXRlbSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpO1xuICB9XG5cbiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnQWx0ZXJuYXRlQ1MuZ2V0UmdiQnVmZmVyOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHRpbnRGbiA9IHRoaXMudGludEZuO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7XG4gICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7XG4gICAgY29uc3QgYmFzZU51bUNvbXBzID0gYmFzZS5udW1Db21wcztcbiAgICBjb25zdCB1c2VzWmVyb1RvT25lUmFuZ2UgPSBiYXNlLnVzZXNaZXJvVG9PbmVSYW5nZTtcbiAgICBjb25zdCBpc1Bhc3N0aHJvdWdoID1cbiAgICAgIChiYXNlLmlzUGFzc3Rocm91Z2goOCkgfHwgIXVzZXNaZXJvVG9PbmVSYW5nZSkgJiYgYWxwaGEwMSA9PT0gMDtcbiAgICBsZXQgcG9zID0gaXNQYXNzdGhyb3VnaCA/IGRlc3RPZmZzZXQgOiAwO1xuICAgIGNvbnN0IGJhc2VCdWYgPSBpc1Bhc3N0aHJvdWdoXG4gICAgICA/IGRlc3RcbiAgICAgIDogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJhc2VOdW1Db21wcyAqIGNvdW50KTtcbiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7XG5cbiAgICBjb25zdCBzY2FsZWQgPSBuZXcgRmxvYXQzMkFycmF5KG51bUNvbXBzKTtcbiAgICBjb25zdCB0aW50ZWQgPSBuZXcgRmxvYXQzMkFycmF5KGJhc2VOdW1Db21wcyk7XG4gICAgbGV0IGksIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgZm9yIChqID0gMDsgaiA8IG51bUNvbXBzOyBqKyspIHtcbiAgICAgICAgc2NhbGVkW2pdID0gc3JjW3NyY09mZnNldCsrXSAqIHNjYWxlO1xuICAgICAgfVxuICAgICAgdGludEZuKHNjYWxlZCwgMCwgdGludGVkLCAwKTtcbiAgICAgIGlmICh1c2VzWmVyb1RvT25lUmFuZ2UpIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGJhc2VOdW1Db21wczsgaisrKSB7XG4gICAgICAgICAgYmFzZUJ1Zltwb3MrK10gPSB0aW50ZWRbal0gKiAyNTU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2UuZ2V0UmdiSXRlbSh0aW50ZWQsIDAsIGJhc2VCdWYsIHBvcyk7XG4gICAgICAgIHBvcyArPSBiYXNlTnVtQ29tcHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc1Bhc3N0aHJvdWdoKSB7XG4gICAgICBiYXNlLmdldFJnYkJ1ZmZlcihiYXNlQnVmLCAwLCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoXG4gICAgICAoaW5wdXRMZW5ndGggKiB0aGlzLmJhc2UubnVtQ29tcHMpIC8gdGhpcy5udW1Db21wcyxcbiAgICAgIGFscGhhMDFcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2Uge1xuICBjb25zdHJ1Y3RvcihiYXNlQ1MpIHtcbiAgICBzdXBlcihcIlBhdHRlcm5cIiwgbnVsbCk7XG4gICAgdGhpcy5iYXNlID0gYmFzZUNTO1xuICB9XG5cbiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgUGF0dGVybkNTLmlzRGVmYXVsdERlY29kZVwiKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGNvbG9yIGlzIGBuZXcgVWludDhBcnJheShbMF0pYC5cbiAqL1xuY2xhc3MgSW5kZXhlZENTIGV4dGVuZHMgQ29sb3JTcGFjZSB7XG4gIGNvbnN0cnVjdG9yKGJhc2UsIGhpZ2hWYWwsIGxvb2t1cCkge1xuICAgIHN1cGVyKFwiSW5kZXhlZFwiLCAxKTtcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMuaGlnaFZhbCA9IGhpZ2hWYWw7XG5cbiAgICBjb25zdCBsZW5ndGggPSBiYXNlLm51bUNvbXBzICogaGlnaFZhbDtcbiAgICB0aGlzLmxvb2t1cCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG5cbiAgICBpZiAoaXNTdHJlYW0obG9va3VwKSkge1xuICAgICAgY29uc3QgYnl0ZXMgPSBsb29rdXAuZ2V0Qnl0ZXMobGVuZ3RoKTtcbiAgICAgIHRoaXMubG9va3VwLnNldChieXRlcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbG9va3VwID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIHRoaXMubG9va3VwW2ldID0gbG9va3VwLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICR7bG9va3VwfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ0luZGV4ZWRDUy5nZXRSZ2JJdGVtOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5iYXNlLm51bUNvbXBzO1xuICAgIGNvbnN0IHN0YXJ0ID0gc3JjW3NyY09mZnNldF0gKiBudW1Db21wcztcbiAgICB0aGlzLmJhc2UuZ2V0UmdiQnVmZmVyKHRoaXMubG9va3VwLCBzdGFydCwgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgMCk7XG4gIH1cblxuICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBkZXN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICdJbmRleGVkQ1MuZ2V0UmdiQnVmZmVyOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7XG4gICAgY29uc3QgbnVtQ29tcHMgPSBiYXNlLm51bUNvbXBzO1xuICAgIGNvbnN0IG91dHB1dERlbHRhID0gYmFzZS5nZXRPdXRwdXRMZW5ndGgobnVtQ29tcHMsIGFscGhhMDEpO1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBsb29rdXBQb3MgPSBzcmNbc3JjT2Zmc2V0KytdICogbnVtQ29tcHM7XG4gICAgICBiYXNlLmdldFJnYkJ1ZmZlcihsb29rdXAsIGxvb2t1cFBvcywgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7XG4gICAgICBkZXN0T2Zmc2V0ICs9IG91dHB1dERlbHRhO1xuICAgIH1cbiAgfVxuXG4gIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkge1xuICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoICogdGhpcy5iYXNlLm51bUNvbXBzLCBhbHBoYTAxKTtcbiAgfVxuXG4gIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNvZGVNYXApKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRlY29kZU1hcC5sZW5ndGggIT09IDIpIHtcbiAgICAgIHdhcm4oXCJEZWNvZGUgbWFwIGxlbmd0aCBpcyBub3QgY29ycmVjdFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYnBjKSB8fCBicGMgPCAxKSB7XG4gICAgICB3YXJuKFwiQml0cyBwZXIgY29tcG9uZW50IGlzIG5vdCBjb3JyZWN0XCIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVNYXBbMF0gPT09IDAgJiYgZGVjb2RlTWFwWzFdID09PSAoMSA8PCBicGMpIC0gMTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGNvbG9yIGlzIGBuZXcgRmxvYXQzMkFycmF5KFswXSlgLlxuICovXG5jbGFzcyBEZXZpY2VHcmF5Q1MgZXh0ZW5kcyBDb2xvclNwYWNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJEZXZpY2VHcmF5XCIsIDEpO1xuICB9XG5cbiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnRGV2aWNlR3JheUNTLmdldFJnYkl0ZW06IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYyA9IHNyY1tzcmNPZmZzZXRdICogMjU1O1xuICAgIGRlc3RbZGVzdE9mZnNldF0gPSBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IGRlc3RbZGVzdE9mZnNldCArIDJdID0gYztcbiAgfVxuXG4gIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ0RldmljZUdyYXlDUy5nZXRSZ2JCdWZmZXI6IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYml0cykgLSAxKTtcbiAgICBsZXQgaiA9IHNyY09mZnNldCxcbiAgICAgIHEgPSBkZXN0T2Zmc2V0O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgY29uc3QgYyA9IHNjYWxlICogc3JjW2orK107XG4gICAgICBkZXN0W3ErK10gPSBjO1xuICAgICAgZGVzdFtxKytdID0gYztcbiAgICAgIGRlc3RbcSsrXSA9IGM7XG4gICAgICBxICs9IGFscGhhMDE7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7XG4gICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGNvbG9yIGlzIGBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAwXSlgLlxuICovXG5jbGFzcyBEZXZpY2VSZ2JDUyBleHRlbmRzIENvbG9yU3BhY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIkRldmljZVJHQlwiLCAzKTtcbiAgfVxuXG4gIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ0RldmljZVJnYkNTLmdldFJnYkl0ZW06IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHNyY1tzcmNPZmZzZXRdICogMjU1O1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gc3JjW3NyY09mZnNldCArIDFdICogMjU1O1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc3JjW3NyY09mZnNldCArIDJdICogMjU1O1xuICB9XG5cbiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnRGV2aWNlUmdiQ1MuZ2V0UmdiQnVmZmVyOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChiaXRzID09PSA4ICYmIGFscGhhMDEgPT09IDApIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50ICogMyksIGRlc3RPZmZzZXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZSA9IDI1NSAvICgoMSA8PCBiaXRzKSAtIDEpO1xuICAgIGxldCBqID0gc3JjT2Zmc2V0LFxuICAgICAgcSA9IGRlc3RPZmZzZXQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICBkZXN0W3ErK10gPSBzY2FsZSAqIHNyY1tqKytdO1xuICAgICAgZGVzdFtxKytdID0gc2NhbGUgKiBzcmNbaisrXTtcbiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107XG4gICAgICBxICs9IGFscGhhMDE7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7XG4gICAgcmV0dXJuICgoaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpKSAvIDMpIHwgMDtcbiAgfVxuXG4gIGlzUGFzc3Rocm91Z2goYml0cykge1xuICAgIHJldHVybiBiaXRzID09PSA4O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgY29sb3IgaXMgYG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDAsIDFdKWAuXG4gKi9cbmNvbnN0IERldmljZUNteWtDUyA9IChmdW5jdGlvbiBEZXZpY2VDbXlrQ1NDbG9zdXJlKCkge1xuICAvLyBUaGUgY29lZmZpY2llbnRzIGJlbG93IHdhcyBmb3VuZCB1c2luZyBudW1lcmljYWwgYW5hbHlzaXM6IHRoZSBtZXRob2Qgb2ZcbiAgLy8gc3RlZXBlc3QgZGVzY2VudCBmb3IgdGhlIHN1bSgoZl9pIC0gY29sb3JfdmFsdWVfaSleMikgZm9yIHIvZy9iIGNvbG9ycyxcbiAgLy8gd2hlcmUgY29sb3JfdmFsdWUgaXMgdGhlIHRhYnVsYXIgdmFsdWUgZnJvbSB0aGUgdGFibGUgb2Ygc2FtcGxlZCBSR0IgY29sb3JzXG4gIC8vIGZyb20gQ01ZSyBVUyBXZWIgQ29hdGVkIChTV09QKSBjb2xvcnNwYWNlLCBhbmQgZl9pIGlzIHRoZSBjb3JyZXNwb25kaW5nXG4gIC8vIENNWUsgY29sb3IgY29udmVyc2lvbiB1c2luZyB0aGUgZXN0aW1hdGlvbiBiZWxvdzpcbiAgLy8gICBmKEEsIEIsLi4gTikgPSBBY2MrQmNtK0NjeStEY2srYytGbW0rR215K0htaytJbStKeXkrS3lrK0x5K01raytOaysyNTVcbiAgZnVuY3Rpb24gY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzcmNTY2FsZSwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgIGNvbnN0IGMgPSBzcmNbc3JjT2Zmc2V0XSAqIHNyY1NjYWxlO1xuICAgIGNvbnN0IG0gPSBzcmNbc3JjT2Zmc2V0ICsgMV0gKiBzcmNTY2FsZTtcbiAgICBjb25zdCB5ID0gc3JjW3NyY09mZnNldCArIDJdICogc3JjU2NhbGU7XG4gICAgY29uc3QgayA9IHNyY1tzcmNPZmZzZXQgKyAzXSAqIHNyY1NjYWxlO1xuXG4gICAgZGVzdFtkZXN0T2Zmc2V0XSA9XG4gICAgICAyNTUgK1xuICAgICAgYyAqXG4gICAgICAgICgtNC4zODczMzIzODQ2MDk5ODggKiBjICtcbiAgICAgICAgICA1NC40ODYxNTE5NDE4OTE3NiAqIG0gK1xuICAgICAgICAgIDE4LjgyMjkwNTAyMTY1MzAyICogeSArXG4gICAgICAgICAgMjEyLjI1NjYyNDUxNjM5NTg1ICogayArXG4gICAgICAgICAgLTI4NS4yMzMxMDI2MTM3MDA0KSArXG4gICAgICBtICpcbiAgICAgICAgKDEuNzE0OTc2MzQ3NzM2MjEzNCAqIG0gLVxuICAgICAgICAgIDUuNjA5NjczNjkwNDA0NzMxNSAqIHkgK1xuICAgICAgICAgIC0xNy44NzM4NzA4NjE0MTU0NDQgKiBrIC1cbiAgICAgICAgICA1LjQ5NzAwNjQyNzE5NjM2NikgK1xuICAgICAgeSAqXG4gICAgICAgICgtMi41MjE3MzQwMTMxNjgzMDMzICogeSAtIDIxLjI0ODkyMzMzNzM1MzA3MyAqIGsgKyAxNy41MTE5MjcwODQxODEzKSArXG4gICAgICBrICogKC0yMS44NjEyMjE0NzQ2MzYwNSAqIGsgLSAxODkuNDgxODA4MzU5MjI3NDcpO1xuXG4gICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPVxuICAgICAgMjU1ICtcbiAgICAgIGMgKlxuICAgICAgICAoOC44NDEwNDE0MjIwMzYxNDkgKiBjICtcbiAgICAgICAgICA2MC4xMTgwMjcwNDU1OTczNjYgKiBtICtcbiAgICAgICAgICA2Ljg3MTQyNTU5MjA0OTAwNyAqIHkgK1xuICAgICAgICAgIDMxLjE1OTEwMDEzMDA1NTkyMiAqIGsgK1xuICAgICAgICAgIC03OS4yOTcwODQ0ODE2NTQ4KSArXG4gICAgICBtICpcbiAgICAgICAgKC0xNS4zMTAzNjEzMDY5Njc4MTcgKiBtICtcbiAgICAgICAgICAxNy41NzUyNTEyNjExMDk0ODIgKiB5ICtcbiAgICAgICAgICAxMzEuMzUyNTA5MTI0OTM5NzYgKiBrIC1cbiAgICAgICAgICAxOTAuOTQ1MzMwMjU4ODk1MSkgK1xuICAgICAgeSAqICg0LjQ0NDMzOTEwMjg1MjczOSAqIHkgKyA5Ljg2MzI4NjE0OTM0MDUgKiBrIC0gMjQuODY3NDE1ODI1NTU4NzgpICtcbiAgICAgIGsgKiAoLTIwLjczNzMyNTQ3MTE4MTAzNCAqIGsgLSAxODcuODA0NTM3MDk3MTk1NzgpO1xuXG4gICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPVxuICAgICAgMjU1ICtcbiAgICAgIGMgKlxuICAgICAgICAoMC44ODQyNTIyNDMwMDAzMjk2ICogYyArXG4gICAgICAgICAgOC4wNzg2Nzc1MDMxMTI5MjggKiBtICtcbiAgICAgICAgICAzMC44OTk3ODMwOTcwMzcyOSAqIHkgLVxuICAgICAgICAgIDAuMjM4ODMyMzg2ODkxNzg5MzQgKiBrICtcbiAgICAgICAgICAtMTQuMTgzNTc2Nzk5NjczMjg2KSArXG4gICAgICBtICpcbiAgICAgICAgKDEwLjQ5NTkzMjczNDMyMDcyICogbSArXG4gICAgICAgICAgNjMuMDIzNzg0OTQ3NTQwNTIgKiB5ICtcbiAgICAgICAgICA1MC42MDY5NTc2NTYzNjA3MzQgKiBrIC1cbiAgICAgICAgICAxMTIuMjM4ODQyNTM3MTkyNDgpICtcbiAgICAgIHkgKlxuICAgICAgICAoMC4wMzI5NjA0MTExNDg3MzIxNyAqIHkgK1xuICAgICAgICAgIDExNS42MDM4NDQ0OTY0NjY0MSAqIGsgK1xuICAgICAgICAgIC0xOTMuNTgyMDkzNTY4NjE1MDUpICtcbiAgICAgIGsgKiAoLTIyLjMzODE2ODA3MzA5ODg2ICogayAtIDE4MC4xMjYxMzk3NDcwODM2Nyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNsYXNzIERldmljZUNteWtDUyBleHRlbmRzIENvbG9yU3BhY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoXCJEZXZpY2VDTVlLXCIsIDQpO1xuICAgIH1cblxuICAgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgICAnRGV2aWNlQ215a0NTLmdldFJnYkl0ZW06IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCAxLCBkZXN0LCBkZXN0T2Zmc2V0KTtcbiAgICB9XG5cbiAgICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBkZXN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICAgJ0RldmljZUNteWtDUy5nZXRSZ2JCdWZmZXI6IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzY2FsZSwgZGVzdCwgZGVzdE9mZnNldCk7XG4gICAgICAgIHNyY09mZnNldCArPSA0O1xuICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkge1xuICAgICAgcmV0dXJuICgoaW5wdXRMZW5ndGggLyA0KSAqICgzICsgYWxwaGEwMSkpIHwgMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERldmljZUNteWtDUztcbn0pKCk7XG5cbi8qKlxuICogQ2FsR3JheUNTOiBCYXNlZCBvbiBcIlBERiBSZWZlcmVuY2UsIFNpeHRoIEVkXCIsIHAuMjQ1XG4gKlxuICogVGhlIGRlZmF1bHQgY29sb3IgaXMgYG5ldyBGbG9hdDMyQXJyYXkoWzBdKWAuXG4gKi9cbmNvbnN0IENhbEdyYXlDUyA9IChmdW5jdGlvbiBDYWxHcmF5Q1NDbG9zdXJlKCkge1xuICBmdW5jdGlvbiBjb252ZXJ0VG9SZ2IoY3MsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSkge1xuICAgIC8vIEEgcmVwcmVzZW50cyBhIGdyYXkgY29tcG9uZW50IG9mIGEgY2FsaWJyYXRlZCBncmF5IHNwYWNlLlxuICAgIC8vIEEgPC0tLT4gQUcgaW4gdGhlIHNwZWNcbiAgICBjb25zdCBBID0gc3JjW3NyY09mZnNldF0gKiBzY2FsZTtcbiAgICBjb25zdCBBRyA9IEEgKiogY3MuRztcblxuICAgIC8vIENvbXB1dGVzIEwgYXMgcGVyIHNwZWMuICggPSBjcy5ZVyAqIEFHIClcbiAgICAvLyBFeGNlcHQgaWYgb3RoZXIgdGhhbiBkZWZhdWx0IEJsYWNrUG9pbnQgdmFsdWVzIGFyZSB1c2VkLlxuICAgIGNvbnN0IEwgPSBjcy5ZVyAqIEFHO1xuICAgIC8vIGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sLCBDaCA0LlxuICAgIC8vIENvbnZlcnQgdmFsdWVzIHRvIHJnYiByYW5nZSBbMCwgMjU1XS5cbiAgICBjb25zdCB2YWwgPSBNYXRoLm1heCgyOTUuOCAqIEwgKiogMC4zMzMzMzMzMzMzMzMzMzMzMzMgLSA0MC44LCAwKTtcbiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gdmFsO1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdmFsO1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gdmFsO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBjbGFzcyBDYWxHcmF5Q1MgZXh0ZW5kcyBDb2xvclNwYWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSkge1xuICAgICAgc3VwZXIoXCJDYWxHcmF5XCIsIDEpO1xuXG4gICAgICBpZiAoIXdoaXRlUG9pbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIFwiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXlcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQgfHwgWzAsIDAsIDBdO1xuICAgICAgZ2FtbWEgPSBnYW1tYSB8fCAxO1xuXG4gICAgICAvLyBUcmFuc2xhdGUgYXJndW1lbnRzIHRvIHNwZWMgdmFyaWFibGVzLlxuICAgICAgdGhpcy5YVyA9IHdoaXRlUG9pbnRbMF07XG4gICAgICB0aGlzLllXID0gd2hpdGVQb2ludFsxXTtcbiAgICAgIHRoaXMuWlcgPSB3aGl0ZVBvaW50WzJdO1xuXG4gICAgICB0aGlzLlhCID0gYmxhY2tQb2ludFswXTtcbiAgICAgIHRoaXMuWUIgPSBibGFja1BvaW50WzFdO1xuICAgICAgdGhpcy5aQiA9IGJsYWNrUG9pbnRbMl07XG5cbiAgICAgIHRoaXMuRyA9IGdhbW1hO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZXMgYXMgcGVyIHNwZWMuXG4gICAgICBpZiAodGhpcy5YVyA8IDAgfHwgdGhpcy5aVyA8IDAgfHwgdGhpcy5ZVyAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAgIFwiLCBubyBmYWxsYmFjayBhdmFpbGFibGVcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5YQiA8IDAgfHwgdGhpcy5ZQiA8IDAgfHwgdGhpcy5aQiA8IDApIHtcbiAgICAgICAgaW5mbyhgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApO1xuICAgICAgICB0aGlzLlhCID0gdGhpcy5ZQiA9IHRoaXMuWkIgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5YQiAhPT0gMCB8fCB0aGlzLllCICE9PSAwIHx8IHRoaXMuWkIgIT09IDApIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgJHt0aGlzLm5hbWV9LCBCbGFja1BvaW50OiBYQjogJHt0aGlzLlhCfSwgWUI6ICR7dGhpcy5ZQn0sIGAgK1xuICAgICAgICAgICAgYFpCOiAke3RoaXMuWkJ9LCBvbmx5IGRlZmF1bHQgdmFsdWVzIGFyZSBzdXBwb3J0ZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5HIDwgMSkge1xuICAgICAgICBpbmZvKFxuICAgICAgICAgIGBJbnZhbGlkIEdhbW1hOiAke3RoaXMuR30gZm9yICR7dGhpcy5uYW1lfSwgYCArXG4gICAgICAgICAgICBcImZhbGxpbmcgYmFjayB0byBkZWZhdWx0LlwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuRyA9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICAgICkge1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAgICdDYWxHcmF5Q1MuZ2V0UmdiSXRlbTogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIDEpO1xuICAgIH1cblxuICAgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgICAnQ2FsR3JheUNTLmdldFJnYkJ1ZmZlcjogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpO1xuICAgICAgICBzcmNPZmZzZXQgKz0gMTtcbiAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHtcbiAgICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBDYWxHcmF5Q1M7XG59KSgpO1xuXG4vKipcbiAqIENhbFJHQkNTOiBCYXNlZCBvbiBcIlBERiBSZWZlcmVuY2UsIFNpeHRoIEVkXCIsIHAuMjQ3XG4gKlxuICogVGhlIGRlZmF1bHQgY29sb3IgaXMgYG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDBdKWAuXG4gKi9cbmNvbnN0IENhbFJHQkNTID0gKGZ1bmN0aW9uIENhbFJHQkNTQ2xvc3VyZSgpIHtcbiAgLy8gU2VlIGh0dHA6Ly93d3cuYnJ1Y2VsaW5kYmxvb20uY29tL2luZGV4Lmh0bWw/RXFuX0Nocm9tQWRhcHQuaHRtbCBmb3IgdGhlc2VcbiAgLy8gbWF0cmljZXMuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBCUkFERk9SRF9TQ0FMRV9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAwLjg5NTEsIDAuMjY2NCwgLTAuMTYxNCxcbiAgICAtMC43NTAyLCAxLjcxMzUsIDAuMDM2NyxcbiAgICAwLjAzODksIC0wLjA2ODUsIDEuMDI5Nl0pO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBCUkFERk9SRF9TQ0FMRV9JTlZFUlNFX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgIDAuOTg2OTkyOSwgLTAuMTQ3MDU0MywgMC4xNTk5NjI3LFxuICAgIDAuNDMyMzA1MywgMC41MTgzNjAzLCAwLjA0OTI5MTIsXG4gICAgLTAuMDA4NTI4NywgMC4wNDAwNDI4LCAwLjk2ODQ4NjddKTtcblxuICAvLyBTZWUgaHR0cDovL3d3dy5icnVjZWxpbmRibG9vbS5jb20vaW5kZXguaHRtbD9FcW5fUkdCX1hZWl9NYXRyaXguaHRtbC5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IFNSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbXG4gICAgMy4yNDA0NTQyLCAtMS41MzcxMzg1LCAtMC40OTg1MzE0LFxuICAgIC0wLjk2OTI2NjAsIDEuODc2MDEwOCwgMC4wNDE1NTYwLFxuICAgIDAuMDU1NjQzNCwgLTAuMjA0MDI1OSwgMS4wNTcyMjUyXSk7XG5cbiAgY29uc3QgRkxBVF9XSElURVBPSU5UX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDFdKTtcblxuICBjb25zdCB0ZW1wTm9ybWFsaXplTWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgY29uc3QgdGVtcENvbnZlcnRNYXRyaXgxID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgY29uc3QgdGVtcENvbnZlcnRNYXRyaXgyID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcblxuICBjb25zdCBERUNPREVfTF9DT05TVEFOVCA9ICgoOCArIDE2KSAvIDExNikgKiogMyAvIDguMDtcblxuICBmdW5jdGlvbiBtYXRyaXhQcm9kdWN0KGEsIGIsIHJlc3VsdCkge1xuICAgIHJlc3VsdFswXSA9IGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbiAgICByZXN1bHRbMV0gPSBhWzNdICogYlswXSArIGFbNF0gKiBiWzFdICsgYVs1XSAqIGJbMl07XG4gICAgcmVzdWx0WzJdID0gYVs2XSAqIGJbMF0gKyBhWzddICogYlsxXSArIGFbOF0gKiBiWzJdO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFRvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIHJlc3VsdCkge1xuICAgIHJlc3VsdFswXSA9IChMTVNbMF0gKiAxKSAvIHNvdXJjZVdoaXRlUG9pbnRbMF07XG4gICAgcmVzdWx0WzFdID0gKExNU1sxXSAqIDEpIC8gc291cmNlV2hpdGVQb2ludFsxXTtcbiAgICByZXN1bHRbMl0gPSAoTE1TWzJdICogMSkgLyBzb3VyY2VXaGl0ZVBvaW50WzJdO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFRvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgcmVzdWx0KSB7XG4gICAgY29uc3QgRDY1WCA9IDAuOTUwNDc7XG4gICAgY29uc3QgRDY1WSA9IDE7XG4gICAgY29uc3QgRDY1WiA9IDEuMDg4ODM7XG5cbiAgICByZXN1bHRbMF0gPSAoTE1TWzBdICogRDY1WCkgLyBzb3VyY2VXaGl0ZVBvaW50WzBdO1xuICAgIHJlc3VsdFsxXSA9IChMTVNbMV0gKiBENjVZKSAvIHNvdXJjZVdoaXRlUG9pbnRbMV07XG4gICAgcmVzdWx0WzJdID0gKExNU1syXSAqIEQ2NVopIC8gc291cmNlV2hpdGVQb2ludFsyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNSR0JUcmFuc2ZlckZ1bmN0aW9uKGNvbG9yKSB7XG4gICAgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1JHQi5cbiAgICBpZiAoY29sb3IgPD0gMC4wMDMxMzA4KSB7XG4gICAgICByZXR1cm4gYWRqdXN0VG9SYW5nZSgwLCAxLCAxMi45MiAqIGNvbG9yKTtcbiAgICB9XG4gICAgLy8gT3B0aW1pemF0aW9uOlxuICAgIC8vIElmIGNvbG9yIGlzIGNsb3NlIGVub3VnaCB0byAxLCBza2lwIGNhbGxpbmcgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1cbiAgICAvLyBzaW5jZSBjYWxsaW5nIE1hdGgucG93IGlzIGV4cGVuc2l2ZS4gSWYgY29sb3IgaXMgbGFyZ2VyIHRoYW5cbiAgICAvLyB0aGUgdGhyZXNob2xkLCB0aGUgZmluYWwgcmVzdWx0IGlzIGxhcmdlciB0aGFuIDI1NC41IHNpbmNlXG4gICAgLy8gKCgxICsgMC4wNTUpICogMC45OTU1NDUyNSAqKiAoMSAvIDIuNCkgLSAwLjA1NSkgKiAyNTUgPT09XG4gICAgLy8gMjU0LjUwMDAwMDAzMTM0Njk5XG4gICAgaWYgKGNvbG9yID49IDAuOTk1NTQ1MjUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gYWRqdXN0VG9SYW5nZSgwLCAxLCAoMSArIDAuMDU1KSAqIGNvbG9yICoqICgxIC8gMi40KSAtIDAuMDU1KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkanVzdFRvUmFuZ2UobWluLCBtYXgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlTChMKSB7XG4gICAgaWYgKEwgPCAwKSB7XG4gICAgICByZXR1cm4gLWRlY29kZUwoLUwpO1xuICAgIH1cbiAgICBpZiAoTCA+IDguMCkge1xuICAgICAgcmV0dXJuICgoTCArIDE2KSAvIDExNikgKiogMztcbiAgICB9XG4gICAgcmV0dXJuIEwgKiBERUNPREVfTF9DT05TVEFOVDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBlbnNhdGVCbGFja1BvaW50KHNvdXJjZUJsYWNrUG9pbnQsIFhZWl9GbGF0LCByZXN1bHQpIHtcbiAgICAvLyBJbiBjYXNlIHRoZSBibGFja1BvaW50IGlzIGFscmVhZHkgdGhlIGRlZmF1bHQgYmxhY2tQb2ludCB0aGVuIHRoZXJlIGlzXG4gICAgLy8gbm8gbmVlZCB0byBkbyBjb21wZW5zYXRpb24uXG4gICAgaWYgKFxuICAgICAgc291cmNlQmxhY2tQb2ludFswXSA9PT0gMCAmJlxuICAgICAgc291cmNlQmxhY2tQb2ludFsxXSA9PT0gMCAmJlxuICAgICAgc291cmNlQmxhY2tQb2ludFsyXSA9PT0gMFxuICAgICkge1xuICAgICAgcmVzdWx0WzBdID0gWFlaX0ZsYXRbMF07XG4gICAgICByZXN1bHRbMV0gPSBYWVpfRmxhdFsxXTtcbiAgICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciB0aGUgYmxhY2tQb2ludCBjYWxjdWxhdGlvbiBkZXRhaWxzLCBwbGVhc2Ugc2VlXG4gICAgLy8gaHR0cDovL3d3dy5hZG9iZS5jb20vY29udGVudC9kYW0vQWRvYmUvZW4vZGV2bmV0L3Bob3Rvc2hvcC9zZGsvXG4gICAgLy8gQWRvYmVCUEMucGRmLlxuICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBibGFja1BvaW50IGlzIHRoZSBkZWZhdWx0IGJsYWNrUG9pbnQgWzAsIDAsIDBdLlxuICAgIGNvbnN0IHplcm9EZWNvZGVMID0gZGVjb2RlTCgwKTtcblxuICAgIGNvbnN0IFhfRFNUID0gemVyb0RlY29kZUw7XG4gICAgY29uc3QgWF9TUkMgPSBkZWNvZGVMKHNvdXJjZUJsYWNrUG9pbnRbMF0pO1xuXG4gICAgY29uc3QgWV9EU1QgPSB6ZXJvRGVjb2RlTDtcbiAgICBjb25zdCBZX1NSQyA9IGRlY29kZUwoc291cmNlQmxhY2tQb2ludFsxXSk7XG5cbiAgICBjb25zdCBaX0RTVCA9IHplcm9EZWNvZGVMO1xuICAgIGNvbnN0IFpfU1JDID0gZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzJdKTtcblxuICAgIGNvbnN0IFhfU2NhbGUgPSAoMSAtIFhfRFNUKSAvICgxIC0gWF9TUkMpO1xuICAgIGNvbnN0IFhfT2Zmc2V0ID0gMSAtIFhfU2NhbGU7XG5cbiAgICBjb25zdCBZX1NjYWxlID0gKDEgLSBZX0RTVCkgLyAoMSAtIFlfU1JDKTtcbiAgICBjb25zdCBZX09mZnNldCA9IDEgLSBZX1NjYWxlO1xuXG4gICAgY29uc3QgWl9TY2FsZSA9ICgxIC0gWl9EU1QpIC8gKDEgLSBaX1NSQyk7XG4gICAgY29uc3QgWl9PZmZzZXQgPSAxIC0gWl9TY2FsZTtcblxuICAgIHJlc3VsdFswXSA9IFhZWl9GbGF0WzBdICogWF9TY2FsZSArIFhfT2Zmc2V0O1xuICAgIHJlc3VsdFsxXSA9IFhZWl9GbGF0WzFdICogWV9TY2FsZSArIFlfT2Zmc2V0O1xuICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdICogWl9TY2FsZSArIFpfT2Zmc2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkge1xuICAgIC8vIEluIGNhc2UgdGhlIHdoaXRlUG9pbnQgaXMgYWxyZWFkeSBmbGF0IHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBkb1xuICAgIC8vIG5vcm1hbGl6YXRpb24uXG4gICAgaWYgKHNvdXJjZVdoaXRlUG9pbnRbMF0gPT09IDEgJiYgc291cmNlV2hpdGVQb2ludFsyXSA9PT0gMSkge1xuICAgICAgcmVzdWx0WzBdID0gWFlaX0luWzBdO1xuICAgICAgcmVzdWx0WzFdID0gWFlaX0luWzFdO1xuICAgICAgcmVzdWx0WzJdID0gWFlaX0luWzJdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IExNUyA9IHJlc3VsdDtcbiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpO1xuXG4gICAgY29uc3QgTE1TX0ZsYXQgPSB0ZW1wTm9ybWFsaXplTWF0cml4O1xuICAgIGNvbnZlcnRUb0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRmxhdCk7XG5cbiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRmxhdCwgcmVzdWx0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkge1xuICAgIGNvbnN0IExNUyA9IHJlc3VsdDtcbiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpO1xuXG4gICAgY29uc3QgTE1TX0Q2NSA9IHRlbXBOb3JtYWxpemVNYXRyaXg7XG4gICAgY29udmVydFRvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgTE1TX0Q2NSk7XG5cbiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRDY1LCByZXN1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFRvUmdiKGNzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpIHtcbiAgICAvLyBBLCBCIGFuZCBDIHJlcHJlc2VudCBhIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29tcG9uZW50cyBvZiBhIGNhbGlicmF0ZWRcbiAgICAvLyByZ2Igc3BhY2UuXG4gICAgY29uc3QgQSA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldF0gKiBzY2FsZSk7XG4gICAgY29uc3QgQiA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldCArIDFdICogc2NhbGUpO1xuICAgIGNvbnN0IEMgPSBhZGp1c3RUb1JhbmdlKDAsIDEsIHNyY1tzcmNPZmZzZXQgKyAyXSAqIHNjYWxlKTtcblxuICAgIC8vIEEgPC0tLT4gQUdSIGluIHRoZSBzcGVjXG4gICAgLy8gQiA8LS0tPiBCR0cgaW4gdGhlIHNwZWNcbiAgICAvLyBDIDwtLS0+IENHQiBpbiB0aGUgc3BlY1xuICAgIGNvbnN0IEFHUiA9IEEgPT09IDEgPyAxIDogQSAqKiBjcy5HUjtcbiAgICBjb25zdCBCR0cgPSBCID09PSAxID8gMSA6IEIgKiogY3MuR0c7XG4gICAgY29uc3QgQ0dCID0gQyA9PT0gMSA/IDEgOiBDICoqIGNzLkdCO1xuXG4gICAgLy8gQ29tcHV0ZXMgaW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBMLCBNLCBOIGFzIHBlciBzcGVjLlxuICAgIC8vIFRvIGRlY29kZSBYLCBZLCBaIHZhbHVlcyBtYXAgTCwgTSwgTiBkaXJlY3RseSB0byB0aGVtLlxuICAgIGNvbnN0IFggPSBjcy5NWEEgKiBBR1IgKyBjcy5NWEIgKiBCR0cgKyBjcy5NWEMgKiBDR0I7XG4gICAgY29uc3QgWSA9IGNzLk1ZQSAqIEFHUiArIGNzLk1ZQiAqIEJHRyArIGNzLk1ZQyAqIENHQjtcbiAgICBjb25zdCBaID0gY3MuTVpBICogQUdSICsgY3MuTVpCICogQkdHICsgY3MuTVpDICogQ0dCO1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoaXMgZG9jdW1lbnQ6XG4gICAgLy8gaHR0cDovL3d3dy5hZG9iZS5jb20vY29udGVudC9kYW0vQWRvYmUvZW4vZGV2bmV0L3Bob3Rvc2hvcC9zZGsvXG4gICAgLy8gQWRvYmVCUEMucGRmLlxuICAgIGNvbnN0IFhZWiA9IHRlbXBDb252ZXJ0TWF0cml4MTtcbiAgICBYWVpbMF0gPSBYO1xuICAgIFhZWlsxXSA9IFk7XG4gICAgWFlaWzJdID0gWjtcbiAgICBjb25zdCBYWVpfRmxhdCA9IHRlbXBDb252ZXJ0TWF0cml4MjtcblxuICAgIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQoY3Mud2hpdGVQb2ludCwgWFlaLCBYWVpfRmxhdCk7XG5cbiAgICBjb25zdCBYWVpfQmxhY2sgPSB0ZW1wQ29udmVydE1hdHJpeDE7XG4gICAgY29tcGVuc2F0ZUJsYWNrUG9pbnQoY3MuYmxhY2tQb2ludCwgWFlaX0ZsYXQsIFhZWl9CbGFjayk7XG5cbiAgICBjb25zdCBYWVpfRDY1ID0gdGVtcENvbnZlcnRNYXRyaXgyO1xuICAgIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShGTEFUX1dISVRFUE9JTlRfTUFUUklYLCBYWVpfQmxhY2ssIFhZWl9ENjUpO1xuXG4gICAgY29uc3QgU1JHQiA9IHRlbXBDb252ZXJ0TWF0cml4MTtcbiAgICBtYXRyaXhQcm9kdWN0KFNSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYLCBYWVpfRDY1LCBTUkdCKTtcblxuICAgIC8vIENvbnZlcnQgdGhlIHZhbHVlcyB0byByZ2IgcmFuZ2UgWzAsIDI1NV0uXG4gICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHNSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMF0pICogMjU1O1xuICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlsxXSkgKiAyNTU7XG4gICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzJdKSAqIDI1NTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgQ2FsUkdCQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KSB7XG4gICAgICBzdXBlcihcIkNhbFJHQlwiLCAzKTtcblxuICAgICAgaWYgKCF3aGl0ZVBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgICBcIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxSR0JcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQgfHwgbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgICAgIGdhbW1hID0gZ2FtbWEgfHwgbmV3IEZsb2F0MzJBcnJheShbMSwgMSwgMV0pO1xuICAgICAgbWF0cml4ID0gbWF0cml4IHx8IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdKTtcblxuICAgICAgLy8gVHJhbnNsYXRlIGFyZ3VtZW50cyB0byBzcGVjIHZhcmlhYmxlcy5cbiAgICAgIGNvbnN0IFhXID0gd2hpdGVQb2ludFswXTtcbiAgICAgIGNvbnN0IFlXID0gd2hpdGVQb2ludFsxXTtcbiAgICAgIGNvbnN0IFpXID0gd2hpdGVQb2ludFsyXTtcbiAgICAgIHRoaXMud2hpdGVQb2ludCA9IHdoaXRlUG9pbnQ7XG5cbiAgICAgIGNvbnN0IFhCID0gYmxhY2tQb2ludFswXTtcbiAgICAgIGNvbnN0IFlCID0gYmxhY2tQb2ludFsxXTtcbiAgICAgIGNvbnN0IFpCID0gYmxhY2tQb2ludFsyXTtcbiAgICAgIHRoaXMuYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQ7XG5cbiAgICAgIHRoaXMuR1IgPSBnYW1tYVswXTtcbiAgICAgIHRoaXMuR0cgPSBnYW1tYVsxXTtcbiAgICAgIHRoaXMuR0IgPSBnYW1tYVsyXTtcblxuICAgICAgdGhpcy5NWEEgPSBtYXRyaXhbMF07XG4gICAgICB0aGlzLk1ZQSA9IG1hdHJpeFsxXTtcbiAgICAgIHRoaXMuTVpBID0gbWF0cml4WzJdO1xuICAgICAgdGhpcy5NWEIgPSBtYXRyaXhbM107XG4gICAgICB0aGlzLk1ZQiA9IG1hdHJpeFs0XTtcbiAgICAgIHRoaXMuTVpCID0gbWF0cml4WzVdO1xuICAgICAgdGhpcy5NWEMgPSBtYXRyaXhbNl07XG4gICAgICB0aGlzLk1ZQyA9IG1hdHJpeFs3XTtcbiAgICAgIHRoaXMuTVpDID0gbWF0cml4WzhdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZXMgYXMgcGVyIHNwZWMuXG4gICAgICBpZiAoWFcgPCAwIHx8IFpXIDwgMCB8fCBZVyAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAgIFwiLCBubyBmYWxsYmFjayBhdmFpbGFibGVcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoWEIgPCAwIHx8IFlCIDwgMCB8fCBaQiA8IDApIHtcbiAgICAgICAgaW5mbyhcbiAgICAgICAgICBgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0gWyR7WEJ9LCAke1lCfSwgJHtaQn1dLCBgICtcbiAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5ibGFja1BvaW50ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuR1IgPCAwIHx8IHRoaXMuR0cgPCAwIHx8IHRoaXMuR0IgPCAwKSB7XG4gICAgICAgIGluZm8oXG4gICAgICAgICAgYEludmFsaWQgR2FtbWEgWyR7dGhpcy5HUn0sICR7dGhpcy5HR30sICR7dGhpcy5HQn1dIGZvciBgICtcbiAgICAgICAgICAgIGAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5HUiA9IHRoaXMuR0cgPSB0aGlzLkdCID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBkZXN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICAgJ0NhbFJHQkNTLmdldFJnYkl0ZW06IFVuc3VwcG9ydGVkIFwiZGVzdFwiIHR5cGUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29udmVydFRvUmdiKHRoaXMsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCAxKTtcbiAgICB9XG5cbiAgICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBkZXN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICAgJ0NhbFJHQkNTLmdldFJnYkJ1ZmZlcjogVW5zdXBwb3J0ZWQgXCJkZXN0XCIgdHlwZS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpO1xuICAgICAgICBzcmNPZmZzZXQgKz0gMztcbiAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHtcbiAgICAgIHJldHVybiAoKGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSkgLyAzKSB8IDA7XG4gICAgfVxuICB9XG4gIHJldHVybiBDYWxSR0JDUztcbn0pKCk7XG5cbi8qKlxuICogTGFiQ1M6IEJhc2VkIG9uIFwiUERGIFJlZmVyZW5jZSwgU2l4dGggRWRcIiwgcC4yNTBcbiAqXG4gKiBUaGUgZGVmYXVsdCBjb2xvciBpcyBgbmV3IEZsb2F0MzJBcnJheShbMCwgMCwgMF0pYC5cbiAqL1xuY29uc3QgTGFiQ1MgPSAoZnVuY3Rpb24gTGFiQ1NDbG9zdXJlKCkge1xuICAvLyBGdW5jdGlvbiBnKHgpIGZyb20gc3BlY1xuICBmdW5jdGlvbiBmbl9nKHgpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh4ID49IDYgLyAyOSkge1xuICAgICAgcmVzdWx0ID0geCAqIHggKiB4O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSAoMTA4IC8gODQxKSAqICh4IC0gNCAvIDI5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZSh2YWx1ZSwgaGlnaDEsIGxvdzIsIGhpZ2gyKSB7XG4gICAgcmV0dXJuIGxvdzIgKyAodmFsdWUgKiAoaGlnaDIgLSBsb3cyKSkgLyBoaWdoMTtcbiAgfVxuXG4gIC8vIElmIGRlY29kaW5nIGlzIG5lZWRlZCBtYXhWYWwgc2hvdWxkIGJlIDJeYml0cyBwZXIgY29tcG9uZW50IC0gMS5cbiAgZnVuY3Rpb24gY29udmVydFRvUmdiKGNzLCBzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KSB7XG4gICAgLy8gWFhYOiBMYWIgaW5wdXQgaXMgaW4gdGhlIHJhbmdlIG9mIFswLCAxMDBdLCBbYW1pbiwgYW1heF0sIFtibWluLCBibWF4XVxuICAgIC8vIG5vdCB0aGUgdXN1YWwgWzAsIDFdLiBJZiBhIGNvbW1hbmQgbGlrZSBzZXRGaWxsQ29sb3IgaXMgdXNlZCB0aGUgc3JjXG4gICAgLy8gdmFsdWVzIHdpbGwgYWxyZWFkeSBiZSB3aXRoaW4gdGhlIGNvcnJlY3QgcmFuZ2UuIEhvd2V2ZXIsIGlmIHdlIGFyZVxuICAgIC8vIGNvbnZlcnRpbmcgYW4gaW1hZ2Ugd2UgaGF2ZSB0byBtYXAgdGhlIHZhbHVlcyB0byB0aGUgY29ycmVjdCByYW5nZSBnaXZlblxuICAgIC8vIGFib3ZlLlxuICAgIC8vIExzLGFzLGJzIDwtLS0+IEwqLGEqLGIqIGluIHRoZSBzcGVjXG4gICAgbGV0IExzID0gc3JjW3NyY09mZnNldF07XG4gICAgbGV0IGFzID0gc3JjW3NyY09mZnNldCArIDFdO1xuICAgIGxldCBicyA9IHNyY1tzcmNPZmZzZXQgKyAyXTtcbiAgICBpZiAobWF4VmFsICE9PSBmYWxzZSkge1xuICAgICAgTHMgPSBkZWNvZGUoTHMsIG1heFZhbCwgMCwgMTAwKTtcbiAgICAgIGFzID0gZGVjb2RlKGFzLCBtYXhWYWwsIGNzLmFtaW4sIGNzLmFtYXgpO1xuICAgICAgYnMgPSBkZWNvZGUoYnMsIG1heFZhbCwgY3MuYm1pbiwgY3MuYm1heCk7XG4gICAgfVxuXG4gICAgLy8gQWRqdXN0IGxpbWl0cyBvZiAnYXMnIGFuZCAnYnMnXG4gICAgaWYgKGFzID4gY3MuYW1heCkge1xuICAgICAgYXMgPSBjcy5hbWF4O1xuICAgIH0gZWxzZSBpZiAoYXMgPCBjcy5hbWluKSB7XG4gICAgICBhcyA9IGNzLmFtaW47XG4gICAgfVxuICAgIGlmIChicyA+IGNzLmJtYXgpIHtcbiAgICAgIGJzID0gY3MuYm1heDtcbiAgICB9IGVsc2UgaWYgKGJzIDwgY3MuYm1pbikge1xuICAgICAgYnMgPSBjcy5ibWluO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGVzIGludGVybWVkaWF0ZSB2YXJpYWJsZXMgWCxZLFogYXMgcGVyIHNwZWNcbiAgICBjb25zdCBNID0gKExzICsgMTYpIC8gMTE2O1xuICAgIGNvbnN0IEwgPSBNICsgYXMgLyA1MDA7XG4gICAgY29uc3QgTiA9IE0gLSBicyAvIDIwMDtcblxuICAgIGNvbnN0IFggPSBjcy5YVyAqIGZuX2coTCk7XG4gICAgY29uc3QgWSA9IGNzLllXICogZm5fZyhNKTtcbiAgICBjb25zdCBaID0gY3MuWlcgKiBmbl9nKE4pO1xuXG4gICAgbGV0IHIsIGcsIGI7XG4gICAgLy8gVXNpbmcgZGlmZmVyZW50IGNvbnZlcnNpb25zIGZvciBENTAgYW5kIEQ2NSB3aGl0ZSBwb2ludHMsXG4gICAgLy8gcGVyIGh0dHA6Ly93d3cuY29sb3Iub3JnL3NyZ2IucGRmXG4gICAgaWYgKGNzLlpXIDwgMSkge1xuICAgICAgLy8gQXNzdW1pbmcgRDUwIChYPTAuOTY0MiwgWT0xLjAwLCBaPTAuODI0OSlcbiAgICAgIHIgPSBYICogMy4xMzM5ICsgWSAqIC0xLjYxNyArIFogKiAtMC40OTA2O1xuICAgICAgZyA9IFggKiAtMC45Nzg1ICsgWSAqIDEuOTE2ICsgWiAqIDAuMDMzMztcbiAgICAgIGIgPSBYICogMC4wNzIgKyBZICogLTAuMjI5ICsgWiAqIDEuNDA1NztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXNzdW1pbmcgRDY1IChYPTAuOTUwNSwgWT0xLjAwLCBaPTEuMDg4OClcbiAgICAgIHIgPSBYICogMy4yNDA2ICsgWSAqIC0xLjUzNzIgKyBaICogLTAuNDk4NjtcbiAgICAgIGcgPSBYICogLTAuOTY4OSArIFkgKiAxLjg3NTggKyBaICogMC4wNDE1O1xuICAgICAgYiA9IFggKiAwLjA1NTcgKyBZICogLTAuMjA0ICsgWiAqIDEuMDU3O1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IHRoZSBjb2xvciB2YWx1ZXMgdG8gdGhlIFswLDI1NV0gcmFuZ2UgKGNsYW1waW5nIGlzIGF1dG9tYXRpYykuXG4gICAgZGVzdFtkZXN0T2Zmc2V0XSA9IE1hdGguc3FydChyKSAqIDI1NTtcbiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IE1hdGguc3FydChnKSAqIDI1NTtcbiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IE1hdGguc3FydChiKSAqIDI1NTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgTGFiQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSkge1xuICAgICAgc3VwZXIoXCJMYWJcIiwgMyk7XG5cbiAgICAgIGlmICghd2hpdGVQb2ludCkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgXCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgTGFiXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IFswLCAwLCAwXTtcbiAgICAgIHJhbmdlID0gcmFuZ2UgfHwgWy0xMDAsIDEwMCwgLTEwMCwgMTAwXTtcblxuICAgICAgLy8gVHJhbnNsYXRlIGFyZ3MgdG8gc3BlYyB2YXJpYWJsZXNcbiAgICAgIHRoaXMuWFcgPSB3aGl0ZVBvaW50WzBdO1xuICAgICAgdGhpcy5ZVyA9IHdoaXRlUG9pbnRbMV07XG4gICAgICB0aGlzLlpXID0gd2hpdGVQb2ludFsyXTtcbiAgICAgIHRoaXMuYW1pbiA9IHJhbmdlWzBdO1xuICAgICAgdGhpcy5hbWF4ID0gcmFuZ2VbMV07XG4gICAgICB0aGlzLmJtaW4gPSByYW5nZVsyXTtcbiAgICAgIHRoaXMuYm1heCA9IHJhbmdlWzNdO1xuXG4gICAgICAvLyBUaGVzZSBhcmUgaGVyZSBqdXN0IGZvciBjb21wbGV0ZW5lc3MgLSB0aGUgc3BlYyBkb2Vzbid0IG9mZmVyIGFueVxuICAgICAgLy8gZm9ybXVsYXMgdGhhdCB1c2UgQmxhY2tQb2ludCBpbiBMYWJcbiAgICAgIHRoaXMuWEIgPSBibGFja1BvaW50WzBdO1xuICAgICAgdGhpcy5ZQiA9IGJsYWNrUG9pbnRbMV07XG4gICAgICB0aGlzLlpCID0gYmxhY2tQb2ludFsyXTtcblxuICAgICAgLy8gVmFsaWRhdGUgdmFycyBhcyBwZXIgc3BlY1xuICAgICAgaWYgKHRoaXMuWFcgPCAwIHx8IHRoaXMuWlcgPCAwIHx8IHRoaXMuWVcgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIFwiSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZVwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLlhCIDwgMCB8fCB0aGlzLllCIDwgMCB8fCB0aGlzLlpCIDwgMCkge1xuICAgICAgICBpbmZvKFwiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdFwiKTtcbiAgICAgICAgdGhpcy5YQiA9IHRoaXMuWUIgPSB0aGlzLlpCID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYW1pbiA+IHRoaXMuYW1heCB8fCB0aGlzLmJtaW4gPiB0aGlzLmJtYXgpIHtcbiAgICAgICAgaW5mbyhcIkludmFsaWQgUmFuZ2UsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0c1wiKTtcbiAgICAgICAgdGhpcy5hbWluID0gLTEwMDtcbiAgICAgICAgdGhpcy5hbWF4ID0gMTAwO1xuICAgICAgICB0aGlzLmJtaW4gPSAtMTAwO1xuICAgICAgICB0aGlzLmJtYXggPSAxMDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICAgICkge1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgZGVzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAgICdMYWJDUy5nZXRSZ2JJdGVtOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZmFsc2UsIGRlc3QsIGRlc3RPZmZzZXQpO1xuICAgIH1cblxuICAgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGRlc3QgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgICAnTGFiQ1MuZ2V0UmdiQnVmZmVyOiBVbnN1cHBvcnRlZCBcImRlc3RcIiB0eXBlLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heFZhbCA9ICgxIDw8IGJpdHMpIC0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIG1heFZhbCwgZGVzdCwgZGVzdE9mZnNldCk7XG4gICAgICAgIHNyY09mZnNldCArPSAzO1xuICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkge1xuICAgICAgcmV0dXJuICgoaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpKSAvIDMpIHwgMDtcbiAgICB9XG5cbiAgICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHtcbiAgICAgIC8vIFhYWDogRGVjb2RpbmcgaXMgaGFuZGxlZCB3aXRoIHRoZSBsYWIgY29udmVyc2lvbiBiZWNhdXNlIG9mIHRoZSBzdHJhbmdlXG4gICAgICAvLyByYW5nZXMgdGhhdCBhcmUgdXNlZC5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKSB7XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidXNlc1plcm9Ub09uZVJhbmdlXCIsIGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIExhYkNTO1xufSkoKTtcblxuZXhwb3J0IHsgQ29sb3JTcGFjZSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTkgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIGluZm8sIHNoYWRvdywgdW5yZWFjaGFibGUgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IFJlZlNldENhY2hlIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuXG5jbGFzcyBCYXNlTG9jYWxDYWNoZSB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUxvY2FsQ2FjaGUpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUxvY2FsQ2FjaGUuXCIpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMub25seVJlZnMpIHtcbiAgICAgIHRoaXMuX25hbWVSZWZNYXAgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLl9pbWFnZU1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpO1xuICB9XG5cbiAgZ2V0QnlOYW1lKG5hbWUpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLl9uYW1lUmVmTWFwLmdldChuYW1lKTtcbiAgICBpZiAocmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCeVJlZihyZWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faW1hZ2VNYXAuZ2V0KG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICBnZXRCeVJlZihyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKSB8fCBudWxsO1xuICB9XG5cbiAgc2V0KG5hbWUsIHJlZiwgZGF0YSkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBzZXRgIGNhbGxlZC5cIik7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxJbWFnZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUge1xuICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEltYWdlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgXCJuYW1lXCIgYXJndW1lbnQuJyk7XG4gICAgfVxuICAgIGlmIChyZWYpIHtcbiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7XG4gICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBuYW1lXG4gICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxDb2xvclNwYWNlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7XG4gIHNldChuYW1lID0gbnVsbCwgcmVmID0gbnVsbCwgZGF0YSkge1xuICAgIGlmICghbmFtZSAmJiAhcmVmKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMb2NhbENvbG9yU3BhY2VDYWNoZS5zZXQgLSBleHBlY3RlZCBcIm5hbWVcIiBhbmQvb3IgXCJyZWZcIiBhcmd1bWVudC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocmVmKSB7XG4gICAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICAvLyBPcHRpb25hbCB3aGVuIGByZWZgIGlzIGRlZmluZWQuXG4gICAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7XG4gICAgICB9XG4gICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBuYW1lXG4gICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxGdW5jdGlvbkNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIoeyBvbmx5UmVmczogdHJ1ZSB9KTtcbiAgfVxuXG4gIGdldEJ5TmFtZShuYW1lKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgYGdldEJ5TmFtZWAgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7XG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxGdW5jdGlvbkNhY2hlLnNldCAtIGV4cGVjdGVkIFwicmVmXCIgYXJndW1lbnQuJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxHU3RhdGVDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHtcbiAgc2V0KG5hbWUsIHJlZiA9IG51bGwsIGRhdGEpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxHU3RhdGVDYWNoZS5zZXQgLSBleHBlY3RlZCBcIm5hbWVcIiBhcmd1bWVudC4nKTtcbiAgICB9XG4gICAgaWYgKHJlZikge1xuICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTtcbiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIG5hbWVcbiAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTtcbiAgfVxufVxuXG5jbGFzcyBHbG9iYWxJbWFnZUNhY2hlIHtcbiAgc3RhdGljIGdldCBOVU1fUEFHRVNfVEhSRVNIT0xEKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJOVU1fUEFHRVNfVEhSRVNIT0xEXCIsIDIpO1xuICB9XG5cbiAgc3RhdGljIGdldCBNQVhfSU1BR0VTX1RPX0NBQ0hFKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJNQVhfSU1BR0VTX1RPX0NBQ0hFXCIsIDEwKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIiFQUk9EVUNUSU9OIHx8IFRFU1RJTkdcIilcbiAgICApIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEID4gMSxcbiAgICAgICAgXCJHbG9iYWxJbWFnZUNhY2hlIC0gaW52YWxpZCBOVU1fUEFHRVNfVEhSRVNIT0xEIGNvbnN0YW50LlwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9yZWZDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpO1xuICAgIHRoaXMuX2ltYWdlQ2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTtcbiAgfVxuXG4gIHNob3VsZENhY2hlKHJlZiwgcGFnZUluZGV4KSB7XG4gICAgY29uc3QgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7XG4gICAgY29uc3QgbnVtUGFnZXMgPSBwYWdlSW5kZXhTZXRcbiAgICAgID8gcGFnZUluZGV4U2V0LnNpemUgKyAocGFnZUluZGV4U2V0LmhhcyhwYWdlSW5kZXgpID8gMCA6IDEpXG4gICAgICA6IDE7XG5cbiAgICBpZiAobnVtUGFnZXMgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikgJiZcbiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA+PSBHbG9iYWxJbWFnZUNhY2hlLk1BWF9JTUFHRVNfVE9fQ0FDSEVcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhZGRQYWdlSW5kZXgocmVmLCBwYWdlSW5kZXgpIHtcbiAgICBsZXQgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7XG4gICAgaWYgKCFwYWdlSW5kZXhTZXQpIHtcbiAgICAgIHBhZ2VJbmRleFNldCA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMuX3JlZkNhY2hlLnB1dChyZWYsIHBhZ2VJbmRleFNldCk7XG4gICAgfVxuICAgIHBhZ2VJbmRleFNldC5hZGQocGFnZUluZGV4KTtcbiAgfVxuXG4gIGdldERhdGEocmVmLCBwYWdlSW5kZXgpIHtcbiAgICBjb25zdCBwYWdlSW5kZXhTZXQgPSB0aGlzLl9yZWZDYWNoZS5nZXQocmVmKTtcbiAgICBpZiAoIXBhZ2VJbmRleFNldCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChwYWdlSW5kZXhTZXQuc2l6ZSA8IEdsb2JhbEltYWdlQ2FjaGUuTlVNX1BBR0VTX1RIUkVTSE9MRCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICghdGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEVuc3VyZSB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgYWxsIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIGltYWdlIHJlZmVyZW5jZS5cbiAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKTtcbiAgfVxuXG4gIHNldERhdGEocmVmLCBkYXRhKSB7XG4gICAgaWYgKCF0aGlzLl9yZWZDYWNoZS5oYXMocmVmKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gZXhwZWN0ZWQgXCJhZGRQYWdlSW5kZXhcIiB0byBoYXZlIGJlZW4gY2FsbGVkLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLnNpemUgPj0gR2xvYmFsSW1hZ2VDYWNoZS5NQVhfSU1BR0VTX1RPX0NBQ0hFKSB7XG4gICAgICBpbmZvKFxuICAgICAgICBcIkdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YSAtIGlnbm9yaW5nIGltYWdlIGFib3ZlIE1BWF9JTUFHRVNfVE9fQ0FDSEUuXCJcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7XG4gIH1cblxuICBjbGVhcihvbmx5RGF0YSA9IGZhbHNlKSB7XG4gICAgaWYgKCFvbmx5RGF0YSkge1xuICAgICAgdGhpcy5fcmVmQ2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5faW1hZ2VDYWNoZS5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIExvY2FsSW1hZ2VDYWNoZSxcbiAgTG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIExvY2FsRnVuY3Rpb25DYWNoZSxcbiAgTG9jYWxHU3RhdGVDYWNoZSxcbiAgR2xvYmFsSW1hZ2VDYWNoZSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7XG4gIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUsXG4gIEFubm90YXRpb25GaWVsZEZsYWcsXG4gIEFubm90YXRpb25GbGFnLFxuICBBbm5vdGF0aW9uUmVwbHlUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgYXNzZXJ0LFxuICBlc2NhcGVTdHJpbmcsXG4gIGdldE1vZGlmaWNhdGlvbkRhdGUsXG4gIGlzU3RyaW5nLFxuICBPUFMsXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICBVdGlsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IENhdGFsb2csIEZpbGVTcGVjLCBPYmplY3RMb2FkZXIgfSBmcm9tIFwiLi9vYmouanNcIjtcbmltcG9ydCB7IERpY3QsIGlzRGljdCwgaXNOYW1lLCBpc1JlZiwgaXNTdHJlYW0sIE5hbWUgfSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBDb2xvclNwYWNlIH0gZnJvbSBcIi4vY29sb3JzcGFjZS5qc1wiO1xuaW1wb3J0IHsgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IE9wZXJhdG9yTGlzdCB9IGZyb20gXCIuL29wZXJhdG9yX2xpc3QuanNcIjtcbmltcG9ydCB7IFN0cmluZ1N0cmVhbSB9IGZyb20gXCIuL3N0cmVhbS5qc1wiO1xuaW1wb3J0IHsgd3JpdGVEaWN0IH0gZnJvbSBcIi4vd3JpdGVyLmpzXCI7XG5cbmNsYXNzIEFubm90YXRpb25GYWN0b3J5IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBgQW5ub3RhdGlvbmAgb2JqZWN0IG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHRoZSBnaXZlbiByZWZlcmVuY2VcbiAgICogdG8gYW4gYW5ub3RhdGlvbiBkaWN0aW9uYXJ5LiBUaGlzIHlpZWxkcyBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuXG4gICAqIHRoZSBgQW5ub3RhdGlvbmAgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1hSZWZ9IHhyZWZcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlZlxuICAgKiBAcGFyYW0ge1BERk1hbmFnZXJ9IHBkZk1hbmFnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGlkRmFjdG9yeVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbiB7QW5ub3RhdGlvbn1cbiAgICogICBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyLCBpZEZhY3RvcnkpIHtcbiAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKFwiYWNyb0Zvcm1cIikudGhlbihhY3JvRm9ybSA9PiB7XG4gICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmUodGhpcywgXCJfY3JlYXRlXCIsIFtcbiAgICAgICAgeHJlZixcbiAgICAgICAgcmVmLFxuICAgICAgICBwZGZNYW5hZ2VyLFxuICAgICAgICBpZEZhY3RvcnksXG4gICAgICAgIGFjcm9Gb3JtLFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRpYyBfY3JlYXRlKHhyZWYsIHJlZiwgcGRmTWFuYWdlciwgaWRGYWN0b3J5LCBhY3JvRm9ybSkge1xuICAgIGNvbnN0IGRpY3QgPSB4cmVmLmZldGNoSWZSZWYocmVmKTtcbiAgICBpZiAoIWlzRGljdChkaWN0KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IGlzUmVmKHJlZikgPyByZWYudG9TdHJpbmcoKSA6IGBhbm5vdF8ke2lkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIGFubm90YXRpb24ncyBzdWJ0eXBlLlxuICAgIGxldCBzdWJ0eXBlID0gZGljdC5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgIHN1YnR5cGUgPSBpc05hbWUoc3VidHlwZSkgPyBzdWJ0eXBlLm5hbWUgOiBudWxsO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByaWdodCBhbm5vdGF0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgc3VidHlwZSBhbmQgZmllbGQgdHlwZS5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgeHJlZixcbiAgICAgIHJlZixcbiAgICAgIGRpY3QsXG4gICAgICBzdWJ0eXBlLFxuICAgICAgaWQsXG4gICAgICBwZGZNYW5hZ2VyLFxuICAgICAgYWNyb0Zvcm06IGFjcm9Gb3JtIGluc3RhbmNlb2YgRGljdCA/IGFjcm9Gb3JtIDogRGljdC5lbXB0eSxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChzdWJ0eXBlKSB7XG4gICAgICBjYXNlIFwiTGlua1wiOlxuICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiVGV4dFwiOlxuICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiV2lkZ2V0XCI6XG4gICAgICAgIGxldCBmaWVsZFR5cGUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsgZGljdCwga2V5OiBcIkZUXCIgfSk7XG4gICAgICAgIGZpZWxkVHlwZSA9IGlzTmFtZShmaWVsZFR5cGUpID8gZmllbGRUeXBlLm5hbWUgOiBudWxsO1xuXG4gICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICAgICAgY2FzZSBcIlR4XCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuICAgICAgICAgIGNhc2UgXCJCdG5cIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiQ2hcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICB3YXJuKFxuICAgICAgICAgICdVbmltcGxlbWVudGVkIHdpZGdldCBmaWVsZCB0eXBlIFwiJyArXG4gICAgICAgICAgICBmaWVsZFR5cGUgK1xuICAgICAgICAgICAgJ1wiLCAnICtcbiAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGJhc2UgZmllbGQgdHlwZS5cIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJQb3B1cFwiOlxuICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIkZyZWVUZXh0XCI6XG4gICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiTGluZVwiOlxuICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiU3F1YXJlXCI6XG4gICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIkNpcmNsZVwiOlxuICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJQb2x5TGluZVwiOlxuICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIkNhcmV0XCI6XG4gICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiSW5rXCI6XG4gICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgY2FzZSBcIkhpZ2hsaWdodFwiOlxuICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJVbmRlcmxpbmVcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiU3F1aWdnbHlcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJTdHJpa2VPdXRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuXG4gICAgICBjYXNlIFwiU3RhbXBcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb24ocGFyYW1ldGVycyk7XG5cbiAgICAgIGNhc2UgXCJGaWxlQXR0YWNobWVudFwiOlxuICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKCFzdWJ0eXBlKSB7XG4gICAgICAgICAgd2FybihcIkFubm90YXRpb24gaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgL1N1YnR5cGUuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAnVW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9uIHR5cGUgXCInICtcbiAgICAgICAgICAgICAgc3VidHlwZSArXG4gICAgICAgICAgICAgICdcIiwgJyArXG4gICAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGJhc2UgYW5ub3RhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHBhcmFtZXRlcnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRRdWFkUG9pbnRzKGRpY3QsIHJlY3QpIHtcbiAgaWYgKCFkaWN0LmhhcyhcIlF1YWRQb2ludHNcIikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSByZWdpb24gaXMgZGVzY3JpYmVkIGFzIGEgbnVtYmVyIG9mIHF1YWRyaWxhdGVyYWxzLlxuICAvLyBFYWNoIHF1YWRyaWxhdGVyYWwgbXVzdCBjb25zaXN0IG9mIGVpZ2h0IGNvb3JkaW5hdGVzLlxuICBjb25zdCBxdWFkUG9pbnRzID0gZGljdC5nZXRBcnJheShcIlF1YWRQb2ludHNcIik7XG4gIGlmICghQXJyYXkuaXNBcnJheShxdWFkUG9pbnRzKSB8fCBxdWFkUG9pbnRzLmxlbmd0aCAlIDggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBxdWFkUG9pbnRzTGlzdHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGlpID0gcXVhZFBvaW50cy5sZW5ndGggLyA4OyBpIDwgaWk7IGkrKykge1xuICAgIC8vIEVhY2ggc2VyaWVzIG9mIGVpZ2h0IG51bWJlcnMgcmVwcmVzZW50cyB0aGUgY29vcmRpbmF0ZXMgZm9yIG9uZVxuICAgIC8vIHF1YWRyaWxhdGVyYWwgaW4gdGhlIG9yZGVyIFt4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTRdLlxuICAgIC8vIENvbnZlcnQgdGhpcyB0byBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggeCBhbmQgeSBjb29yZGluYXRlcy5cbiAgICBxdWFkUG9pbnRzTGlzdHMucHVzaChbXSk7XG4gICAgZm9yIChsZXQgaiA9IGkgKiA4LCBqaiA9IGkgKiA4ICsgODsgaiA8IGpqOyBqICs9IDIpIHtcbiAgICAgIGNvbnN0IHggPSBxdWFkUG9pbnRzW2pdO1xuICAgICAgY29uc3QgeSA9IHF1YWRQb2ludHNbaiArIDFdO1xuXG4gICAgICAvLyBUaGUgcXVhZHBvaW50cyBzaG91bGQgYmUgaWdub3JlZCBpZiBhbnkgY29vcmRpbmF0ZSBpbiB0aGUgYXJyYXlcbiAgICAgIC8vIGxpZXMgb3V0c2lkZSB0aGUgcmVnaW9uIHNwZWNpZmllZCBieSB0aGUgcmVjdGFuZ2xlLlxuICAgICAgaWYgKHggPCByZWN0WzBdIHx8IHggPiByZWN0WzJdIHx8IHkgPCByZWN0WzFdIHx8IHkgPiByZWN0WzNdKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcXVhZFBvaW50c0xpc3RzW2ldLnB1c2goeyB4LCB5IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcXVhZFBvaW50c0xpc3RzO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2Zvcm1NYXRyaXgocmVjdCwgYmJveCwgbWF0cml4KSB7XG4gIC8vIDEyLjUuNTogQWxnb3JpdGhtOiBBcHBlYXJhbmNlIHN0cmVhbXNcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChcbiAgICBiYm94LFxuICAgIG1hdHJpeFxuICApO1xuICBpZiAobWluWCA9PT0gbWF4WCB8fCBtaW5ZID09PSBtYXhZKSB7XG4gICAgLy8gRnJvbSByZWFsLWxpZmUgZmlsZSwgYmJveCB3YXMgWzAsIDAsIDAsIDBdLiBJbiB0aGlzIGNhc2UsXG4gICAgLy8ganVzdCBhcHBseSB0aGUgdHJhbnNmb3JtIGZvciByZWN0XG4gICAgcmV0dXJuIFsxLCAwLCAwLCAxLCByZWN0WzBdLCByZWN0WzFdXTtcbiAgfVxuXG4gIGNvbnN0IHhSYXRpbyA9IChyZWN0WzJdIC0gcmVjdFswXSkgLyAobWF4WCAtIG1pblgpO1xuICBjb25zdCB5UmF0aW8gPSAocmVjdFszXSAtIHJlY3RbMV0pIC8gKG1heFkgLSBtaW5ZKTtcbiAgcmV0dXJuIFtcbiAgICB4UmF0aW8sXG4gICAgMCxcbiAgICAwLFxuICAgIHlSYXRpbyxcbiAgICByZWN0WzBdIC0gbWluWCAqIHhSYXRpbyxcbiAgICByZWN0WzFdIC0gbWluWSAqIHlSYXRpbyxcbiAgXTtcbn1cblxuY2xhc3MgQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIGNvbnN0IGRpY3QgPSBwYXJhbXMuZGljdDtcblxuICAgIHRoaXMuc2V0Q29udGVudHMoZGljdC5nZXQoXCJDb250ZW50c1wiKSk7XG4gICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKGRpY3QuZ2V0KFwiTVwiKSk7XG4gICAgdGhpcy5zZXRGbGFncyhkaWN0LmdldChcIkZcIikpO1xuICAgIHRoaXMuc2V0UmVjdGFuZ2xlKGRpY3QuZ2V0QXJyYXkoXCJSZWN0XCIpKTtcbiAgICB0aGlzLnNldENvbG9yKGRpY3QuZ2V0QXJyYXkoXCJDXCIpKTtcbiAgICB0aGlzLnNldEJvcmRlclN0eWxlKGRpY3QpO1xuICAgIHRoaXMuc2V0QXBwZWFyYW5jZShkaWN0KTtcblxuICAgIC8vIEV4cG9zZSBwdWJsaWMgcHJvcGVydGllcyB1c2luZyBhIGRhdGEgb2JqZWN0LlxuICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgIGFubm90YXRpb25GbGFnczogdGhpcy5mbGFncyxcbiAgICAgIGJvcmRlclN0eWxlOiB0aGlzLmJvcmRlclN0eWxlLFxuICAgICAgY29sb3I6IHRoaXMuY29sb3IsXG4gICAgICBjb250ZW50czogdGhpcy5jb250ZW50cyxcbiAgICAgIGhhc0FwcGVhcmFuY2U6ICEhdGhpcy5hcHBlYXJhbmNlLFxuICAgICAgaWQ6IHBhcmFtcy5pZCxcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMubW9kaWZpY2F0aW9uRGF0ZSxcbiAgICAgIHJlY3Q6IHRoaXMucmVjdGFuZ2xlLFxuICAgICAgc3VidHlwZTogcGFyYW1zLnN1YnR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hhc0ZsYWcoZmxhZ3MsIGZsYWcpIHtcbiAgICByZXR1cm4gISEoZmxhZ3MgJiBmbGFnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2lzVmlld2FibGUoZmxhZ3MpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLklOVklTSUJMRSkgJiZcbiAgICAgICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBBbm5vdGF0aW9uRmxhZy5ISURERU4pICYmXG4gICAgICAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuTk9WSUVXKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pc1ByaW50YWJsZShmbGFncykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9oYXNGbGFnKGZsYWdzLCBBbm5vdGF0aW9uRmxhZy5QUklOVCkgJiZcbiAgICAgICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpICYmXG4gICAgICAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgdmlld2FibGUoKSB7XG4gICAgaWYgKHRoaXMuZmxhZ3MgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBwcmludGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZmxhZ3MgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lzUHJpbnRhYmxlKHRoaXMuZmxhZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY29udGVudHMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzIC0gVGV4dCB0byBkaXNwbGF5IGZvciB0aGUgYW5ub3RhdGlvbiBvciwgaWYgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgb2YgYW5ub3RhdGlvbiBkb2VzIG5vdCBkaXNwbGF5IHRleHQsIGFcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIGFubm90YXRpb24ncyBjb250ZW50c1xuICAgKi9cbiAgc2V0Q29udGVudHMoY29udGVudHMpIHtcbiAgICB0aGlzLmNvbnRlbnRzID0gc3RyaW5nVG9QREZTdHJpbmcoY29udGVudHMgfHwgXCJcIik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBtb2RpZmljYXRpb24gZGF0ZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kaWZpY2F0aW9uRGF0ZSAtIFBERiBkYXRlIHN0cmluZyB0aGF0IGluZGljYXRlcyB3aGVuIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24gd2FzIGxhc3QgbW9kaWZpZWRcbiAgICovXG4gIHNldE1vZGlmaWNhdGlvbkRhdGUobW9kaWZpY2F0aW9uRGF0ZSkge1xuICAgIHRoaXMubW9kaWZpY2F0aW9uRGF0ZSA9IGlzU3RyaW5nKG1vZGlmaWNhdGlvbkRhdGUpXG4gICAgICA/IG1vZGlmaWNhdGlvbkRhdGVcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZsYWdzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmbGFncyAtIFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHNwZWNpZnlpbmcgYW5ub3RhdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3NcbiAgICogQHNlZSB7QGxpbmsgc2hhcmVkL3V0aWwuanN9XG4gICAqL1xuICBzZXRGbGFncyhmbGFncykge1xuICAgIHRoaXMuZmxhZ3MgPSBOdW1iZXIuaXNJbnRlZ2VyKGZsYWdzKSAmJiBmbGFncyA+IDAgPyBmbGFncyA6IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBwcm92aWRlZCBmbGFnIGlzIHNldC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gZmxhZyAtIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBhbm5vdGF0aW9uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqIEBzZWUge0BsaW5rIHNoYXJlZC91dGlsLmpzfVxuICAgKi9cbiAgaGFzRmxhZyhmbGFnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgZmxhZyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWN0YW5nbGUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25cbiAgICogQHBhcmFtIHtBcnJheX0gcmVjdGFuZ2xlIC0gVGhlIHJlY3RhbmdsZSBhcnJheSB3aXRoIGV4YWN0bHkgZm91ciBlbnRyaWVzXG4gICAqL1xuICBzZXRSZWN0YW5nbGUocmVjdGFuZ2xlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjdGFuZ2xlKSAmJiByZWN0YW5nbGUubGVuZ3RoID09PSA0KSB7XG4gICAgICB0aGlzLnJlY3RhbmdsZSA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0YW5nbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlY3RhbmdsZSA9IFswLCAwLCAwLCAwXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb2xvciBhbmQgdGFrZSBjYXJlIG9mIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24uXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGJsYWNrLCBpbiBSR0IgY29sb3Igc3BhY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25cbiAgICogQHBhcmFtIHtBcnJheX0gY29sb3IgLSBUaGUgY29sb3IgYXJyYXkgY29udGFpbmluZyBlaXRoZXIgMFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICh0cmFuc3BhcmVudCksIDEgKGdyYXlzY2FsZSksIDMgKFJHQikgb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICA0IChDTVlLKSBlbGVtZW50c1xuICAgKi9cbiAgc2V0Q29sb3IoY29sb3IpIHtcbiAgICBjb25zdCByZ2JDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sb3IpKSB7XG4gICAgICB0aGlzLmNvbG9yID0gcmdiQ29sb3I7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2xvci5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogLy8gVHJhbnNwYXJlbnQsIHdoaWNoIHdlIGluZGljYXRlIHdpdGggYSBudWxsIHZhbHVlXG4gICAgICAgIHRoaXMuY29sb3IgPSBudWxsO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxOiAvLyBDb252ZXJ0IGdyYXlzY2FsZSB0byBSR0JcbiAgICAgICAgQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApO1xuICAgICAgICB0aGlzLmNvbG9yID0gcmdiQ29sb3I7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM6IC8vIENvbnZlcnQgUkdCIHBlcmNlbnRhZ2VzIHRvIFJHQlxuICAgICAgICBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTtcbiAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0OiAvLyBDb252ZXJ0IENNWUsgdG8gUkdCXG4gICAgICAgIENvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTtcbiAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5jb2xvciA9IHJnYkNvbG9yO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBib3JkZXIgc3R5bGUgKGFzIEFubm90YXRpb25Cb3JkZXJTdHlsZSBvYmplY3QpLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uXG4gICAqIEBwYXJhbSB7RGljdH0gYm9yZGVyU3R5bGUgLSBUaGUgYm9yZGVyIHN0eWxlIGRpY3Rpb25hcnlcbiAgICovXG4gIHNldEJvcmRlclN0eWxlKGJvcmRlclN0eWxlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KHRoaXMucmVjdGFuZ2xlLCBcInNldFJlY3RhbmdsZSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgcHJldmlvdXNseS5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5ib3JkZXJTdHlsZSA9IG5ldyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTtcbiAgICBpZiAoIWlzRGljdChib3JkZXJTdHlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGJvcmRlclN0eWxlLmhhcyhcIkJTXCIpKSB7XG4gICAgICBjb25zdCBkaWN0ID0gYm9yZGVyU3R5bGUuZ2V0KFwiQlNcIik7XG4gICAgICBjb25zdCBkaWN0VHlwZSA9IGRpY3QuZ2V0KFwiVHlwZVwiKTtcblxuICAgICAgaWYgKCFkaWN0VHlwZSB8fCBpc05hbWUoZGljdFR5cGUsIFwiQm9yZGVyXCIpKSB7XG4gICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgoZGljdC5nZXQoXCJXXCIpLCB0aGlzLnJlY3RhbmdsZSk7XG4gICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUoZGljdC5nZXQoXCJTXCIpKTtcbiAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoZGljdC5nZXRBcnJheShcIkRcIikpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYm9yZGVyU3R5bGUuaGFzKFwiQm9yZGVyXCIpKSB7XG4gICAgICBjb25zdCBhcnJheSA9IGJvcmRlclN0eWxlLmdldEFycmF5KFwiQm9yZGVyXCIpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyhhcnJheVswXSk7XG4gICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0VmVydGljYWxDb3JuZXJSYWRpdXMoYXJyYXlbMV0pO1xuICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGFycmF5WzJdLCB0aGlzLnJlY3RhbmdsZSk7XG5cbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgIC8vIERhc2ggYXJyYXkgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoYXJyYXlbM10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBubyBib3JkZXIgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeS4gQWNjb3JkaW5nIHRvIHRoZVxuICAgICAgLy8gc3BlY2lmaWNhdGlvbiwgd2Ugc2hvdWxkIGRyYXcgYSBzb2xpZCBib3JkZXIgb2Ygd2lkdGggMSBpbiB0aGF0XG4gICAgICAvLyBjYXNlLCBidXQgQWRvYmUgUmVhZGVyIGRpZCBub3QgaW1wbGVtZW50IHRoYXQgcGFydCBvZiB0aGVcbiAgICAgIC8vIHNwZWNpZmljYXRpb24gYW5kIGluc3RlYWQgZHJhd3Mgbm8gYm9yZGVyIGF0IGFsbCwgc28gd2UgZG8gdGhlIHNhbWUuXG4gICAgICAvLyBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9wZGYuanMvaXNzdWVzLzYxNzkuXG4gICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIChub3JtYWwpIGFwcGVhcmFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25cbiAgICogQHBhcmFtIHtEaWN0fSBkaWN0IC0gVGhlIGFubm90YXRpb24ncyBkYXRhIGRpY3Rpb25hcnlcbiAgICovXG4gIHNldEFwcGVhcmFuY2UoZGljdCkge1xuICAgIHRoaXMuYXBwZWFyYW5jZSA9IG51bGw7XG5cbiAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gZGljdC5nZXQoXCJBUFwiKTtcbiAgICBpZiAoIWlzRGljdChhcHBlYXJhbmNlU3RhdGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluIGNhc2UgdGhlIG5vcm1hbCBhcHBlYXJhbmNlIGlzIGEgc3RyZWFtLCB0aGVuIGl0IGlzIHVzZWQgZGlyZWN0bHkuXG4gICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZVN0YXRlID0gYXBwZWFyYW5jZVN0YXRlcy5nZXQoXCJOXCIpO1xuICAgIGlmIChpc1N0cmVhbShub3JtYWxBcHBlYXJhbmNlU3RhdGUpKSB7XG4gICAgICB0aGlzLmFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNEaWN0KG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBjYXNlIHRoZSBub3JtYWwgYXBwZWFyYW5jZSBpcyBhIGRpY3Rpb25hcnksIHRoZSBgQVNgIGVudHJ5IHByb3ZpZGVzXG4gICAgLy8gdGhlIGtleSBvZiB0aGUgc3RyZWFtIGluIHRoaXMgZGljdGlvbmFyeS5cbiAgICBjb25zdCBhcyA9IGRpY3QuZ2V0KFwiQVNcIik7XG4gICAgaWYgKCFpc05hbWUoYXMpIHx8ICFub3JtYWxBcHBlYXJhbmNlU3RhdGUuaGFzKGFzLm5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZS5nZXQoYXMubmFtZSk7XG4gIH1cblxuICBsb2FkUmVzb3VyY2VzKGtleXMpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlYXJhbmNlLmRpY3QuZ2V0QXN5bmMoXCJSZXNvdXJjZXNcIikudGhlbihyZXNvdXJjZXMgPT4ge1xuICAgICAgaWYgKCFyZXNvdXJjZXMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcihyZXNvdXJjZXMsIGtleXMsIHJlc291cmNlcy54cmVmKTtcbiAgICAgIHJldHVybiBvYmplY3RMb2FkZXIubG9hZCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVzb3VyY2VzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgT3BlcmF0b3JMaXN0KCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSB0aGlzLmFwcGVhcmFuY2U7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCBhcHBlYXJhbmNlRGljdCA9IGFwcGVhcmFuY2UuZGljdDtcbiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFtcbiAgICAgIFwiRXh0R1N0YXRlXCIsXG4gICAgICBcIkNvbG9yU3BhY2VcIixcbiAgICAgIFwiUGF0dGVyblwiLFxuICAgICAgXCJTaGFkaW5nXCIsXG4gICAgICBcIlhPYmplY3RcIixcbiAgICAgIFwiRm9udFwiLFxuICAgIF0pO1xuICAgIGNvbnN0IGJib3ggPSBhcHBlYXJhbmNlRGljdC5nZXRBcnJheShcIkJCb3hcIikgfHwgWzAsIDAsIDEsIDFdO1xuICAgIGNvbnN0IG1hdHJpeCA9IGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KFwiTWF0cml4XCIpIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgoZGF0YS5yZWN0LCBiYm94LCBtYXRyaXgpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlc1Byb21pc2UudGhlbihyZXNvdXJjZXMgPT4ge1xuICAgICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpO1xuICAgICAgb3BMaXN0LmFkZE9wKE9QUy5iZWdpbkFubm90YXRpb24sIFtkYXRhLnJlY3QsIHRyYW5zZm9ybSwgbWF0cml4XSk7XG4gICAgICByZXR1cm4gZXZhbHVhdG9yXG4gICAgICAgIC5nZXRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgIHN0cmVhbTogYXBwZWFyYW5jZSxcbiAgICAgICAgICB0YXNrLFxuICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIG9wTGlzdC5hZGRPcChPUFMuZW5kQW5ub3RhdGlvbiwgW10pO1xuICAgICAgICAgIGFwcGVhcmFuY2UucmVzZXQoKTtcbiAgICAgICAgICByZXR1cm4gb3BMaXN0O1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgYWxsIGRhdGEgcmVnYXJkaW5nIGFuIGFubm90YXRpb24ncyBib3JkZXIgc3R5bGUuXG4gKi9cbmNsYXNzIEFubm90YXRpb25Cb3JkZXJTdHlsZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMud2lkdGggPSAxO1xuICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEO1xuICAgIHRoaXMuZGFzaEFycmF5ID0gWzNdO1xuICAgIHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cyA9IDA7XG4gICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB3aWR0aC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvbkJvcmRlclN0eWxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cbiAgICogQHBhcmFtIHtBcnJheX0gcmVjdCAtIFRoZSBhbm5vdGF0aW9uIGBSZWN0YCBlbnRyeS5cbiAgICovXG4gIHNldFdpZHRoKHdpZHRoLCByZWN0ID0gWzAsIDAsIDAsIDBdKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBBcnJheS5pc0FycmF5KHJlY3QpICYmIHJlY3QubGVuZ3RoID09PSA0LFxuICAgICAgICBcIkEgdmFsaWQgYHJlY3RgIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNvbWUgY29ycnVwdCBQREYgZ2VuZXJhdG9ycyBtYXkgcHJvdmlkZSB0aGUgd2lkdGggYXMgYSBgTmFtZWAsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXMgYSBudW1iZXIgKGZpeGVzIGlzc3VlIDEwMzg1KS5cbiAgICBpZiAoaXNOYW1lKHdpZHRoKSkge1xuICAgICAgdGhpcy53aWR0aCA9IDA7IC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBiZWhhdmlvdXIgaW4gQWRvYmUgUmVhZGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih3aWR0aCkpIHtcbiAgICAgIGlmICh3aWR0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gMjtcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7XG5cbiAgICAgICAgLy8gSWdub3JlIGxhcmdlIGB3aWR0aGBzLCBzaW5jZSB0aGV5IGxlYWQgdG8gdGhlIEFubm90YXRpb24gb3ZlcmZsb3dpbmdcbiAgICAgICAgLy8gdGhlIHNpemUgc2V0IGJ5IHRoZSBgUmVjdGAgZW50cnkgdGh1cyBjYXVzaW5nIHRoZSBgYW5ub3RhdGlvbkxheWVyYFxuICAgICAgICAvLyB0byByZW5kZXIgaXQgb3ZlciB0aGUgc3Vycm91bmRpbmcgZG9jdW1lbnQgKGZpeGVzIGJ1ZzE1NTIxMTMucGRmKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1heFdpZHRoID4gMCAmJlxuICAgICAgICAgIG1heEhlaWdodCA+IDAgJiZcbiAgICAgICAgICAod2lkdGggPiBtYXhXaWR0aCB8fCB3aWR0aCA+IG1heEhlaWdodClcbiAgICAgICAgKSB7XG4gICAgICAgICAgd2FybihgQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICR7d2lkdGh9YCk7XG4gICAgICAgICAgd2lkdGggPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3R5bGUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25Cb3JkZXJTdHlsZVxuICAgKiBAcGFyYW0ge05hbWV9IHN0eWxlIC0gVGhlIGFubm90YXRpb24gc3R5bGUuXG4gICAqIEBzZWUge0BsaW5rIHNoYXJlZC91dGlsLmpzfVxuICAgKi9cbiAgc2V0U3R5bGUoc3R5bGUpIHtcbiAgICBpZiAoIWlzTmFtZShzdHlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChzdHlsZS5uYW1lKSB7XG4gICAgICBjYXNlIFwiU1wiOlxuICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJCXCI6XG4gICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiSVwiOlxuICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJVXCI6XG4gICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRhc2ggYXJyYXkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEFubm90YXRpb25Cb3JkZXJTdHlsZVxuICAgKiBAcGFyYW0ge0FycmF5fSBkYXNoQXJyYXkgLSBUaGUgZGFzaCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50XG4gICAqL1xuICBzZXREYXNoQXJyYXkoZGFzaEFycmF5KSB7XG4gICAgLy8gV2UgdmFsaWRhdGUgdGhlIGRhc2ggYXJyYXksIGJ1dCB3ZSBkbyBub3QgdXNlIGl0IGJlY2F1c2UgQ1NTIGRvZXMgbm90XG4gICAgLy8gYWxsb3cgdXMgdG8gY2hhbmdlIHNwYWNpbmcgb2YgZGFzaGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdmlzaXRcbiAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWJhY2tncm91bmQvI3RoZS1ib3JkZXItc3R5bGUuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGFzaEFycmF5KSAmJiBkYXNoQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBQREYgc3BlY2lmaWNhdGlvbjogdGhlIGVsZW1lbnRzIGluIGBkYXNoQXJyYXlgXG4gICAgICAvLyBzaGFsbCBiZSBudW1iZXJzIHRoYXQgYXJlIG5vbm5lZ2F0aXZlIGFuZCBub3QgYWxsIGVxdWFsIHRvIHplcm8uXG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgICBsZXQgYWxsWmVyb3MgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGRhc2hBcnJheSkge1xuICAgICAgICBjb25zdCB2YWxpZE51bWJlciA9ICtlbGVtZW50ID49IDA7XG4gICAgICAgIGlmICghdmFsaWROdW1iZXIpIHtcbiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA+IDApIHtcbiAgICAgICAgICBhbGxaZXJvcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHtcbiAgICAgICAgdGhpcy5kYXNoQXJyYXkgPSBkYXNoQXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndpZHRoID0gMDsgLy8gQWRvYmUgYmVoYXZpb3Igd2hlbiB0aGUgYXJyYXkgaXMgaW52YWxpZC5cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhc2hBcnJheSkge1xuICAgICAgdGhpcy53aWR0aCA9IDA7IC8vIEFkb2JlIGJlaGF2aW9yIHdoZW4gdGhlIGFycmF5IGlzIGludmFsaWQuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgaG9yaXpvbnRhbCBjb3JuZXIgcmFkaXVzIChmcm9tIGEgQm9yZGVyIGRpY3Rpb25hcnkpLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uQm9yZGVyU3R5bGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSBob3Jpem9udGFsIGNvcm5lciByYWRpdXMuXG4gICAqL1xuICBzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHJhZGl1cykge1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHJhZGl1cykpIHtcbiAgICAgIHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cyA9IHJhZGl1cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2ZXJ0aWNhbCBjb3JuZXIgcmFkaXVzIChmcm9tIGEgQm9yZGVyIGRpY3Rpb25hcnkpLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uQm9yZGVyU3R5bGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSB2ZXJ0aWNhbCBjb3JuZXIgcmFkaXVzLlxuICAgKi9cbiAgc2V0VmVydGljYWxDb3JuZXJSYWRpdXMocmFkaXVzKSB7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkge1xuICAgICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IHJhZGl1cztcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgTWFya3VwQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICBjb25zdCBkaWN0ID0gcGFyYW1ldGVycy5kaWN0O1xuXG4gICAgaWYgKGRpY3QuaGFzKFwiSVJUXCIpKSB7XG4gICAgICBjb25zdCByYXdJUlQgPSBkaWN0LmdldFJhdyhcIklSVFwiKTtcbiAgICAgIHRoaXMuZGF0YS5pblJlcGx5VG8gPSBpc1JlZihyYXdJUlQpID8gcmF3SVJULnRvU3RyaW5nKCkgOiBudWxsO1xuXG4gICAgICBjb25zdCBydCA9IGRpY3QuZ2V0KFwiUlRcIik7XG4gICAgICB0aGlzLmRhdGEucmVwbHlUeXBlID0gaXNOYW1lKHJ0KSA/IHJ0Lm5hbWUgOiBBbm5vdGF0aW9uUmVwbHlUeXBlLlJFUExZO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGEucmVwbHlUeXBlID09PSBBbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSB7XG4gICAgICAvLyBTdWJvcmRpbmF0ZSBhbm5vdGF0aW9ucyBpbiBhIGdyb3VwIHNob3VsZCBpbmhlcml0XG4gICAgICAvLyB0aGUgZ3JvdXAgYXR0cmlidXRlcyBmcm9tIHRoZSBwcmltYXJ5IGFubm90YXRpb24uXG4gICAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldChcIklSVFwiKTtcblxuICAgICAgdGhpcy5kYXRhLnRpdGxlID0gc3RyaW5nVG9QREZTdHJpbmcocGFyZW50LmdldChcIlRcIikgfHwgXCJcIik7XG5cbiAgICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50LmdldChcIkNvbnRlbnRzXCIpKTtcbiAgICAgIHRoaXMuZGF0YS5jb250ZW50cyA9IHRoaXMuY29udGVudHM7XG5cbiAgICAgIGlmICghcGFyZW50LmhhcyhcIkNyZWF0aW9uRGF0ZVwiKSkge1xuICAgICAgICB0aGlzLmRhdGEuY3JlYXRpb25EYXRlID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0Q3JlYXRpb25EYXRlKHBhcmVudC5nZXQoXCJDcmVhdGlvbkRhdGVcIikpO1xuICAgICAgICB0aGlzLmRhdGEuY3JlYXRpb25EYXRlID0gdGhpcy5jcmVhdGlvbkRhdGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFyZW50LmhhcyhcIk1cIikpIHtcbiAgICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKHBhcmVudC5nZXQoXCJNXCIpKTtcbiAgICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSB0aGlzLm1vZGlmaWNhdGlvbkRhdGU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0YS5oYXNQb3B1cCA9IHBhcmVudC5oYXMoXCJQb3B1cFwiKTtcblxuICAgICAgaWYgKCFwYXJlbnQuaGFzKFwiQ1wiKSkge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50LmdldEFycmF5KFwiQ1wiKSk7XG4gICAgICAgIHRoaXMuZGF0YS5jb2xvciA9IHRoaXMuY29sb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YS50aXRsZSA9IHN0cmluZ1RvUERGU3RyaW5nKGRpY3QuZ2V0KFwiVFwiKSB8fCBcIlwiKTtcblxuICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUoZGljdC5nZXQoXCJDcmVhdGlvbkRhdGVcIikpO1xuICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IHRoaXMuY3JlYXRpb25EYXRlO1xuXG4gICAgICB0aGlzLmRhdGEuaGFzUG9wdXAgPSBkaWN0LmhhcyhcIlBvcHVwXCIpO1xuXG4gICAgICBpZiAoIWRpY3QuaGFzKFwiQ1wiKSkge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjcmVhdGlvbiBkYXRlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBNYXJrdXBBbm5vdGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcmVhdGlvbkRhdGUgLSBQREYgZGF0ZSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgd2hlbiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24gd2FzIG9yaWdpbmFsbHkgY3JlYXRlZFxuICAgKi9cbiAgc2V0Q3JlYXRpb25EYXRlKGNyZWF0aW9uRGF0ZSkge1xuICAgIHRoaXMuY3JlYXRpb25EYXRlID0gaXNTdHJpbmcoY3JlYXRpb25EYXRlKSA/IGNyZWF0aW9uRGF0ZSA6IG51bGw7XG4gIH1cbn1cblxuY2xhc3MgV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgY29uc3QgZGljdCA9IHBhcmFtcy5kaWN0O1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgdGhpcy5yZWYgPSBwYXJhbXMucmVmO1xuXG4gICAgZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLldJREdFVDtcbiAgICBkYXRhLmZpZWxkTmFtZSA9IHRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KTtcblxuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHtcbiAgICAgIGRpY3QsXG4gICAgICBrZXk6IFwiVlwiLFxuICAgICAgZ2V0QXJyYXk6IHRydWUsXG4gICAgfSk7XG4gICAgZGF0YS5maWVsZFZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGZpZWxkVmFsdWUpO1xuXG4gICAgZGF0YS5hbHRlcm5hdGl2ZVRleHQgPSBzdHJpbmdUb1BERlN0cmluZyhkaWN0LmdldChcIlRVXCIpIHx8IFwiXCIpO1xuICAgIGRhdGEuZGVmYXVsdEFwcGVhcmFuY2UgPVxuICAgICAgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7IGRpY3QsIGtleTogXCJEQVwiIH0pIHx8XG4gICAgICBwYXJhbXMuYWNyb0Zvcm0uZ2V0KFwiREFcIikgfHxcbiAgICAgIFwiXCI7XG4gICAgY29uc3QgZmllbGRUeXBlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7IGRpY3QsIGtleTogXCJGVFwiIH0pO1xuICAgIGRhdGEuZmllbGRUeXBlID0gaXNOYW1lKGZpZWxkVHlwZSkgPyBmaWVsZFR5cGUubmFtZSA6IG51bGw7XG4gICAgdGhpcy5maWVsZFJlc291cmNlcyA9XG4gICAgICBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsgZGljdCwga2V5OiBcIkRSXCIgfSkgfHxcbiAgICAgIHBhcmFtcy5hY3JvRm9ybS5nZXQoXCJEUlwiKSB8fFxuICAgICAgRGljdC5lbXB0eTtcblxuICAgIGRhdGEuZmllbGRGbGFncyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoeyBkaWN0LCBrZXk6IFwiRmZcIiB9KTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF0YS5maWVsZEZsYWdzKSB8fCBkYXRhLmZpZWxkRmxhZ3MgPCAwKSB7XG4gICAgICBkYXRhLmZpZWxkRmxhZ3MgPSAwO1xuICAgIH1cblxuICAgIGRhdGEucmVhZE9ubHkgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJFQURPTkxZKTtcblxuICAgIC8vIEhpZGUgc2lnbmF0dXJlcyBiZWNhdXNlIHdlIGNhbm5vdCB2YWxpZGF0ZSB0aGVtLCBhbmQgdW5zZXQgdGhlIGZpZWxkVmFsdWVcbiAgICAvLyBzaW5jZSBpdCdzIChtb3N0IGxpa2VseSkgYSBgRGljdGAgd2hpY2ggaXMgbm9uLXNlcmlhbGl6YWJsZSBhbmQgd2lsbCB0aHVzXG4gICAgLy8gY2F1c2UgZXJyb3JzIHdoZW4gc2VuZGluZyBhbm5vdGF0aW9ucyB0byB0aGUgbWFpbi10aHJlYWQgKGlzc3VlIDEwMzQ3KS5cbiAgICBpZiAoZGF0YS5maWVsZFR5cGUgPT09IFwiU2lnXCIpIHtcbiAgICAgIGRhdGEuZmllbGRWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnNldEZsYWdzKEFubm90YXRpb25GbGFnLkhJRERFTik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCB0aGUgKGZ1bGx5IHF1YWxpZmllZCkgZmllbGQgbmFtZSBmcm9tIHRoZSAocGFydGlhbCkgZmllbGRcbiAgICogbmFtZXMgb2YgdGhlIGZpZWxkIGFuZCBpdHMgYW5jZXN0b3JzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgV2lkZ2V0QW5ub3RhdGlvblxuICAgKiBAcGFyYW0ge0RpY3R9IGRpY3QgLSBDb21wbGV0ZSB3aWRnZXQgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBfY29uc3RydWN0RmllbGROYW1lKGRpY3QpIHtcbiAgICAvLyBCb3RoIHRoZSBgUGFyZW50YCBhbmQgYFRgIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFdoaWxlIGF0IGxlYXN0IG9uZSBvZlxuICAgIC8vIHRoZW0gc2hvdWxkIGJlIHByb3ZpZGVkLCBiYWQgUERGIGdlbmVyYXRvcnMgbWF5IGZhaWwgdG8gZG8gc28uXG4gICAgaWYgKCFkaWN0LmhhcyhcIlRcIikgJiYgIWRpY3QuaGFzKFwiUGFyZW50XCIpKSB7XG4gICAgICB3YXJuKFwiVW5rbm93biBmaWVsZCBuYW1lLCBmYWxsaW5nIGJhY2sgdG8gZW1wdHkgZmllbGQgbmFtZS5cIik7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBwYXJlbnQgZXhpc3RzLCB0aGUgcGFydGlhbCBhbmQgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIGFyZSBlcXVhbC5cbiAgICBpZiAoIWRpY3QuaGFzKFwiUGFyZW50XCIpKSB7XG4gICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGljdC5nZXQoXCJUXCIpKTtcbiAgICB9XG5cbiAgICAvLyBGb3JtIHRoZSBmdWxseSBxdWFsaWZpZWQgZmllbGQgbmFtZSBieSBhcHBlbmRpbmcgdGhlIHBhcnRpYWwgbmFtZSB0b1xuICAgIC8vIHRoZSBwYXJlbnQncyBmdWxseSBxdWFsaWZpZWQgbmFtZSwgc2VwYXJhdGVkIGJ5IGEgcGVyaW9kLlxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IFtdO1xuICAgIGlmIChkaWN0LmhhcyhcIlRcIikpIHtcbiAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGRpY3QuZ2V0KFwiVFwiKSkpO1xuICAgIH1cblxuICAgIGxldCBsb29wRGljdCA9IGRpY3Q7XG4gICAgd2hpbGUgKGxvb3BEaWN0LmhhcyhcIlBhcmVudFwiKSkge1xuICAgICAgbG9vcERpY3QgPSBsb29wRGljdC5nZXQoXCJQYXJlbnRcIik7XG4gICAgICBpZiAoIWlzRGljdChsb29wRGljdCkpIHtcbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggaXQgaXMgbm90IGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBQREYgc3BlY2lmaWNhdGlvbixcbiAgICAgICAgLy8gYmFkIFBERiBnZW5lcmF0b3JzIG1heSBwcm92aWRlIGEgYFBhcmVudGAgZW50cnkgdGhhdCBpcyBub3QgYVxuICAgICAgICAvLyBkaWN0aW9uYXJ5LCBidXQgYG51bGxgIGZvciBleGFtcGxlIChpc3N1ZSA4MTQzKS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChsb29wRGljdC5oYXMoXCJUXCIpKSB7XG4gICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGxvb3BEaWN0LmdldChcIlRcIikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkTmFtZS5qb2luKFwiLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgdGhlIGdpdmVuIGZvcm0gdmFsdWUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBXaWRnZXRBbm5vdGF0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPnxOYW1lfHN0cmluZ30gZm9ybVZhbHVlIC0gVGhlIChwb3NzaWJseSBlbmNvZGVkKVxuICAgKiAgIGZvcm0gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fHN0cmluZ3xudWxsfVxuICAgKi9cbiAgX2RlY29kZUZvcm1WYWx1ZShmb3JtVmFsdWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtVmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybVZhbHVlXG4gICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpc1N0cmluZyhpdGVtKSlcbiAgICAgICAgLm1hcChpdGVtID0+IHN0cmluZ1RvUERGU3RyaW5nKGl0ZW0pKTtcbiAgICB9IGVsc2UgaWYgKGlzTmFtZShmb3JtVmFsdWUpKSB7XG4gICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZm9ybVZhbHVlLm5hbWUpO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoZm9ybVZhbHVlKSkge1xuICAgICAgcmV0dXJuIHN0cmluZ1RvUERGU3RyaW5nKGZvcm1WYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcHJvdmlkZWQgZmllbGQgZmxhZyBpcyBzZXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFdpZGdldEFubm90YXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZsYWcgLSBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBmb3IgYW4gYW5ub3RhdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGNoYXJhY3RlcmlzdGljXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAc2VlIHtAbGluayBzaGFyZWQvdXRpbC5qc31cbiAgICovXG4gIGhhc0ZpZWxkRmxhZyhmbGFnKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuZGF0YS5maWVsZEZsYWdzICYgZmxhZyk7XG4gIH1cblxuICBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICAvLyBEbyBub3QgcmVuZGVyIGZvcm0gZWxlbWVudHMgb24gdGhlIGNhbnZhcyB3aGVuIGludGVyYWN0aXZlIGZvcm1zIGFyZVxuICAgIC8vIGVuYWJsZWQuIFRoZSBkaXNwbGF5IGxheWVyIGlzIHJlc3BvbnNpYmxlIGZvciByZW5kZXJpbmcgdGhlbSBpbnN0ZWFkLlxuICAgIGlmIChyZW5kZXJGb3Jtcykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgT3BlcmF0b3JMaXN0KCkpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faGFzVGV4dCkge1xuICAgICAgcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChcbiAgICAgICAgZXZhbHVhdG9yLFxuICAgICAgICB0YXNrLFxuICAgICAgICByZW5kZXJGb3JtcyxcbiAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkudGhlbihcbiAgICAgIGNvbnRlbnQgPT4ge1xuICAgICAgICBpZiAodGhpcy5hcHBlYXJhbmNlICYmIGNvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KFxuICAgICAgICAgICAgZXZhbHVhdG9yLFxuICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgIHJlbmRlckZvcm1zLFxuICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpO1xuXG4gICAgICAgIC8vIEV2ZW4gaWYgdGhlcmUgaXMgYW4gYXBwZWFyYW5jZSBzdHJlYW0sIGlnbm9yZSBpdC4gVGhpcyBpcyB0aGVcbiAgICAgICAgLy8gYmVoYXZpb3VyIHVzZWQgYnkgQWRvYmUgUmVhZGVyLlxuICAgICAgICBpZiAoIXRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSB8fCBjb250ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG9wZXJhdG9yTGlzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICAgICAgY29uc3QgYmJveCA9IFtcbiAgICAgICAgICAwLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXSxcbiAgICAgICAgICB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeCh0aGlzLmRhdGEucmVjdCwgYmJveCwgbWF0cml4KTtcbiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbkFubm90YXRpb24sIFtcbiAgICAgICAgICB0aGlzLmRhdGEucmVjdCxcbiAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgbWF0cml4LFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdG9yXG4gICAgICAgICAgLmdldE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLmZpZWxkUmVzb3VyY2VzLFxuICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5lbmRBbm5vdGF0aW9uLCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gb3BlcmF0b3JMaXN0O1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBpZiAodGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBhcHBlYXJhbmNlID0gYXdhaXQgdGhpcy5fZ2V0QXBwZWFyYW5jZShcbiAgICAgIGV2YWx1YXRvcixcbiAgICAgIHRhc2ssXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZVxuICAgICk7XG4gICAgaWYgKGFwcGVhcmFuY2UgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRpY3QgPSBldmFsdWF0b3IueHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTtcbiAgICBpZiAoIWlzRGljdChkaWN0KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYmJveCA9IFtcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXSxcbiAgICAgIHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0sXG4gICAgXTtcblxuICAgIGNvbnN0IG5ld1JlZiA9IGV2YWx1YXRvci54cmVmLmdldE5ld1JlZigpO1xuICAgIGNvbnN0IEFQID0gbmV3IERpY3QoZXZhbHVhdG9yLnhyZWYpO1xuICAgIEFQLnNldChcIk5cIiwgbmV3UmVmKTtcblxuICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXTtcbiAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDtcbiAgICBsZXQgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsO1xuICAgIGxldCBuZXdUcmFuc2Zvcm0gPSBudWxsO1xuICAgIGlmIChlbmNyeXB0KSB7XG4gICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnJlZi5udW0sXG4gICAgICAgIHRoaXMucmVmLmdlblxuICAgICAgKTtcbiAgICAgIG5ld1RyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKG5ld1JlZi5udW0sIG5ld1JlZi5nZW4pO1xuICAgICAgYXBwZWFyYW5jZSA9IG5ld1RyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKGFwcGVhcmFuY2UpO1xuICAgIH1cblxuICAgIGRpY3Quc2V0KFwiVlwiLCB2YWx1ZSk7XG4gICAgZGljdC5zZXQoXCJBUFwiLCBBUCk7XG4gICAgZGljdC5zZXQoXCJNXCIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApO1xuXG4gICAgY29uc3QgYXBwZWFyYW5jZURpY3QgPSBuZXcgRGljdChldmFsdWF0b3IueHJlZik7XG4gICAgYXBwZWFyYW5jZURpY3Quc2V0KFwiTGVuZ3RoXCIsIGFwcGVhcmFuY2UubGVuZ3RoKTtcbiAgICBhcHBlYXJhbmNlRGljdC5zZXQoXCJTdWJ0eXBlXCIsIE5hbWUuZ2V0KFwiRm9ybVwiKSk7XG4gICAgYXBwZWFyYW5jZURpY3Quc2V0KFwiUmVzb3VyY2VzXCIsIHRoaXMuZmllbGRSZXNvdXJjZXMpO1xuICAgIGFwcGVhcmFuY2VEaWN0LnNldChcIkJCb3hcIiwgYmJveCk7XG5cbiAgICBjb25zdCBidWZmZXJPcmlnaW5hbCA9IFtgJHt0aGlzLnJlZi5udW19ICR7dGhpcy5yZWYuZ2VufSBvYmpcXG5gXTtcbiAgICB3cml0ZURpY3QoZGljdCwgYnVmZmVyT3JpZ2luYWwsIG9yaWdpbmFsVHJhbnNmb3JtKTtcbiAgICBidWZmZXJPcmlnaW5hbC5wdXNoKFwiXFxuZW5kb2JqXFxuXCIpO1xuXG4gICAgY29uc3QgYnVmZmVyTmV3ID0gW2Ake25ld1JlZi5udW19ICR7bmV3UmVmLmdlbn0gb2JqXFxuYF07XG4gICAgd3JpdGVEaWN0KGFwcGVhcmFuY2VEaWN0LCBidWZmZXJOZXcsIG5ld1RyYW5zZm9ybSk7XG4gICAgYnVmZmVyTmV3LnB1c2goXCIgc3RyZWFtXFxuXCIpO1xuICAgIGJ1ZmZlck5ldy5wdXNoKGFwcGVhcmFuY2UpO1xuICAgIGJ1ZmZlck5ldy5wdXNoKFwiXFxuZW5kc3RyZWFtXFxuZW5kb2JqXFxuXCIpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGRhdGEgZm9yIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgIC8vIFYgZmllbGQgY2hhbmdlZCArIHJlZmVyZW5jZSBmb3IgbmV3IEFQXG4gICAgICB7IHJlZjogdGhpcy5yZWYsIGRhdGE6IGJ1ZmZlck9yaWdpbmFsLmpvaW4oXCJcIikgfSxcbiAgICAgIC8vIGRhdGEgZm9yIHRoZSBuZXcgQVBcbiAgICAgIHsgcmVmOiBuZXdSZWYsIGRhdGE6IGJ1ZmZlck5ldy5qb2luKFwiXCIpIH0sXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIF9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBjb25zdCBpc1Bhc3N3b3JkID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCk7XG4gICAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSB8fCBpc1Bhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBhbm5vdGF0aW9uU3RvcmFnZVt0aGlzLmRhdGEuaWRdO1xuICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSAyO1xuICAgIGNvbnN0IGhQYWRkaW5nID0gZGVmYXVsdFBhZGRpbmc7XG4gICAgY29uc3QgdG90YWxIZWlnaHQgPSB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdO1xuICAgIGNvbnN0IHRvdGFsV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdO1xuXG4gICAgY29uc3QgZm9udEluZm8gPSBhd2FpdCB0aGlzLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2spO1xuICAgIGNvbnN0IFtmb250LCBmb250TmFtZV0gPSBmb250SW5mbztcbiAgICBsZXQgZm9udFNpemUgPSBmb250SW5mb1syXTtcblxuICAgIGZvbnRTaXplID0gdGhpcy5fY29tcHV0ZUZvbnRTaXplKGZvbnQsIGZvbnROYW1lLCBmb250U2l6ZSwgdG90YWxIZWlnaHQpO1xuXG4gICAgbGV0IGRlc2NlbnQgPSBmb250LmRlc2NlbnQ7XG4gICAgaWYgKGlzTmFOKGRlc2NlbnQpKSB7XG4gICAgICBkZXNjZW50ID0gMDtcbiAgICB9XG5cbiAgICBjb25zdCB2UGFkZGluZyA9IGRlZmF1bHRQYWRkaW5nICsgTWF0aC5hYnMoZGVzY2VudCkgKiBmb250U2l6ZTtcbiAgICBjb25zdCBkZWZhdWx0QXBwZWFyYW5jZSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZTtcbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLmRhdGEudGV4dEFsaWdubWVudDtcblxuICAgIGlmICh0aGlzLmRhdGEuY29tYikge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKFxuICAgICAgICBkZWZhdWx0QXBwZWFyYW5jZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRvdGFsV2lkdGgsXG4gICAgICAgIGhQYWRkaW5nLFxuICAgICAgICB2UGFkZGluZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoXG4gICAgICAgIGRlZmF1bHRBcHBlYXJhbmNlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZm9udCxcbiAgICAgICAgZm9udFNpemUsXG4gICAgICAgIHRvdGFsV2lkdGgsXG4gICAgICAgIHRvdGFsSGVpZ2h0LFxuICAgICAgICBhbGlnbm1lbnQsXG4gICAgICAgIGhQYWRkaW5nLFxuICAgICAgICB2UGFkZGluZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYWxpZ25tZW50ID09PSAwIHx8IGFsaWdubWVudCA+IDIpIHtcbiAgICAgIC8vIExlZnQgYWxpZ25tZW50OiBub3RoaW5nIHRvIGRvXG4gICAgICByZXR1cm4gKFxuICAgICAgICBcIi9UeCBCTUMgcSBCVCBcIiArXG4gICAgICAgIGRlZmF1bHRBcHBlYXJhbmNlICtcbiAgICAgICAgYCAxIDAgMCAxICR7aFBhZGRpbmd9ICR7dlBhZGRpbmd9IFRtICgke2VzY2FwZVN0cmluZyh2YWx1ZSl9KSBUamAgK1xuICAgICAgICBcIiBFVCBRIEVNQ1wiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IHRoaXMuX3JlbmRlclRleHQoXG4gICAgICB2YWx1ZSxcbiAgICAgIGZvbnQsXG4gICAgICBmb250U2l6ZSxcbiAgICAgIHRvdGFsV2lkdGgsXG4gICAgICBhbGlnbm1lbnQsXG4gICAgICBoUGFkZGluZyxcbiAgICAgIHZQYWRkaW5nXG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgXCIvVHggQk1DIHEgQlQgXCIgK1xuICAgICAgZGVmYXVsdEFwcGVhcmFuY2UgK1xuICAgICAgYCAxIDAgMCAxIDAgMCBUbSAke3JlbmRlcmVkVGV4dH1gICtcbiAgICAgIFwiIEVUIFEgRU1DXCJcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaykge1xuICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICBmb250U2l6ZTogMCxcbiAgICAgIGZvbnQ6IG51bGwsXG4gICAgICBmb250TmFtZTogbnVsbCxcbiAgICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IGV2YWx1YXRvci5nZXRPcGVyYXRvckxpc3Qoe1xuICAgICAgc3RyZWFtOiBuZXcgU3RyaW5nU3RyZWFtKHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSksXG4gICAgICB0YXNrLFxuICAgICAgcmVzb3VyY2VzOiB0aGlzLmZpZWxkUmVzb3VyY2VzLFxuICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgaW5pdGlhbFN0YXRlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtpbml0aWFsU3RhdGUuZm9udCwgaW5pdGlhbFN0YXRlLmZvbnROYW1lLCBpbml0aWFsU3RhdGUuZm9udFNpemVdO1xuICB9XG5cbiAgX2NvbXB1dGVGb250U2l6ZShmb250LCBmb250TmFtZSwgZm9udFNpemUsIGhlaWdodCkge1xuICAgIGlmIChmb250U2l6ZSA9PT0gbnVsbCB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgY29uc3QgZW0gPSBmb250LmNoYXJzVG9HbHlwaHMoXCJNXCIsIHRydWUpWzBdLndpZHRoIC8gMTAwMDtcbiAgICAgIC8vIEFjY29yZGluZyB0byBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbV8odHlwb2dyYXBoeSlcbiAgICAgIC8vIGFuIGF2ZXJhZ2UgY2FwIGhlaWdodCBzaG91bGQgYmUgNzAlIG9mIDFlbVxuICAgICAgY29uc3QgY2FwSGVpZ2h0ID0gMC43ICogZW07XG4gICAgICAvLyAxLjUgKiBjYXBIZWlnaHQgKiBmb250U2l6ZSBzZWVtcyB0byBiZSBhIGdvb2QgdmFsdWUgZm9yIGxpbmVIZWlnaHRcbiAgICAgIGZvbnRTaXplID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihoZWlnaHQgLyAoMS41ICogY2FwSGVpZ2h0KSkpO1xuXG4gICAgICBsZXQgZm9udFJlZ2V4ID0gbmV3IFJlZ0V4cChgLyR7Zm9udE5hbWV9XFxcXHMrWzAtOVxcLl0rXFxcXHMrVGZgKTtcbiAgICAgIGlmICh0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2Uuc2VhcmNoKGZvbnRSZWdleCkgPT09IC0xKSB7XG4gICAgICAgIC8vIFRoZSBmb250IHNpemUgaXMgbWlzc2luZ1xuICAgICAgICBmb250UmVnZXggPSBuZXcgUmVnRXhwKGAvJHtmb250TmFtZX1cXFxccytUZmApO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlLnJlcGxhY2UoXG4gICAgICAgIGZvbnRSZWdleCxcbiAgICAgICAgYC8ke2ZvbnROYW1lfSAke2ZvbnRTaXplfSBUZmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbiAgfVxuXG4gIF9yZW5kZXJUZXh0KHRleHQsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoLCBhbGlnbm1lbnQsIGhQYWRkaW5nLCB2UGFkZGluZykge1xuICAgIC8vIFdlIG5lZWQgdG8gZ2V0IHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBpbiBvcmRlciB0byBhbGlnbiBpdCBjb3JyZWN0bHlcbiAgICBjb25zdCBnbHlwaHMgPSBmb250LmNoYXJzVG9HbHlwaHModGV4dCk7XG4gICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7XG4gICAgbGV0IHdpZHRoID0gMDtcbiAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykge1xuICAgICAgd2lkdGggKz0gZ2x5cGgud2lkdGggKiBzY2FsZTtcbiAgICB9XG5cbiAgICBsZXQgc2hpZnQ7XG4gICAgaWYgKGFsaWdubWVudCA9PT0gMSkge1xuICAgICAgLy8gQ2VudGVyXG4gICAgICBzaGlmdCA9ICh0b3RhbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWdubWVudCA9PT0gMikge1xuICAgICAgLy8gUmlnaHRcbiAgICAgIHNoaWZ0ID0gdG90YWxXaWR0aCAtIHdpZHRoIC0gaFBhZGRpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoaWZ0ID0gaFBhZGRpbmc7XG4gICAgfVxuICAgIHNoaWZ0ID0gc2hpZnQudG9GaXhlZCgyKTtcbiAgICB2UGFkZGluZyA9IHZQYWRkaW5nLnRvRml4ZWQoMik7XG5cbiAgICByZXR1cm4gYCR7c2hpZnR9ICR7dlBhZGRpbmd9IFRkICgke2VzY2FwZVN0cmluZyh0ZXh0KX0pIFRqYDtcbiAgfVxufVxuXG5jbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgdGhpcy5faGFzVGV4dCA9IHRydWU7XG5cbiAgICBjb25zdCBkaWN0ID0gcGFyYW1zLmRpY3Q7XG5cbiAgICAvLyBUaGUgZmllbGQgdmFsdWUgaXMgYWx3YXlzIGEgc3RyaW5nLlxuICAgIGlmICghaXNTdHJpbmcodGhpcy5kYXRhLmZpZWxkVmFsdWUpKSB7XG4gICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFwiXCI7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBhbGlnbm1lbnQgb2YgdGV4dCBpbiB0aGUgZmllbGQuXG4gICAgbGV0IGFsaWdubWVudCA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoeyBkaWN0LCBrZXk6IFwiUVwiIH0pO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhbGlnbm1lbnQpIHx8IGFsaWdubWVudCA8IDAgfHwgYWxpZ25tZW50ID4gMikge1xuICAgICAgYWxpZ25tZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRleHQgaW4gdGhlIGZpZWxkLlxuICAgIGxldCBtYXhpbXVtTGVuZ3RoID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7IGRpY3QsIGtleTogXCJNYXhMZW5cIiB9KTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4aW11bUxlbmd0aCkgfHwgbWF4aW11bUxlbmd0aCA8IDApIHtcbiAgICAgIG1heGltdW1MZW5ndGggPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmRhdGEubWF4TGVuID0gbWF4aW11bUxlbmd0aDtcblxuICAgIC8vIFByb2Nlc3MgZmllbGQgZmxhZ3MgZm9yIHRoZSBkaXNwbGF5IGxheWVyLlxuICAgIHRoaXMuZGF0YS5tdWx0aUxpbmUgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7XG4gICAgdGhpcy5kYXRhLmNvbWIgPVxuICAgICAgdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSAmJlxuICAgICAgIXRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuTVVMVElMSU5FKSAmJlxuICAgICAgIXRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpICYmXG4gICAgICAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSAmJlxuICAgICAgdGhpcy5kYXRhLm1heExlbiAhPT0gbnVsbDtcbiAgfVxuXG4gIF9nZXRDb21iQXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSwgdGV4dCwgd2lkdGgsIGhQYWRkaW5nLCB2UGFkZGluZykge1xuICAgIGNvbnN0IGNvbWJXaWR0aCA9ICh3aWR0aCAvIHRoaXMuZGF0YS5tYXhMZW4pLnRvRml4ZWQoMik7XG4gICAgY29uc3QgYnVmID0gW107XG4gICAgZm9yIChjb25zdCBjaGFyYWN0ZXIgb2YgdGV4dCkge1xuICAgICAgYnVmLnB1c2goYCgke2VzY2FwZVN0cmluZyhjaGFyYWN0ZXIpfSkgVGpgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZW5kZXJlZENvbWIgPSBidWYuam9pbihgICR7Y29tYldpZHRofSAwIFRkIGApO1xuICAgIHJldHVybiAoXG4gICAgICBcIi9UeCBCTUMgcSBCVCBcIiArXG4gICAgICBkZWZhdWx0QXBwZWFyYW5jZSArXG4gICAgICBgIDEgMCAwIDEgJHtoUGFkZGluZ30gJHt2UGFkZGluZ30gVG0gJHtyZW5kZXJlZENvbWJ9YCArXG4gICAgICBcIiBFVCBRIEVNQ1wiXG4gICAgKTtcbiAgfVxuXG4gIF9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKFxuICAgIGRlZmF1bHRBcHBlYXJhbmNlLFxuICAgIHRleHQsXG4gICAgZm9udCxcbiAgICBmb250U2l6ZSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYWxpZ25tZW50LFxuICAgIGhQYWRkaW5nLFxuICAgIHZQYWRkaW5nXG4gICkge1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgICBjb25zdCBidWYgPSBbXTtcbiAgICBjb25zdCB0b3RhbFdpZHRoID0gd2lkdGggLSAyICogaFBhZGRpbmc7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCBjaHVua3MgPSB0aGlzLl9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgpO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IGJ1Zi5sZW5ndGggPT09IDAgPyBoUGFkZGluZyA6IDA7XG4gICAgICAgIGJ1Zi5wdXNoKFxuICAgICAgICAgIHRoaXMuX3JlbmRlclRleHQoXG4gICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgYWxpZ25tZW50LFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIC1mb250U2l6ZSAvLyA8MCBiZWNhdXNlIGEgbGluZSBpcyBiZWxvdyB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IGJ1Zi5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiAoXG4gICAgICBcIi9UeCBCTUMgcSBCVCBcIiArXG4gICAgICBkZWZhdWx0QXBwZWFyYW5jZSArXG4gICAgICBgIDEgMCAwIDEgMCAke2hlaWdodH0gVG0gJHtyZW5kZXJlZFRleHR9YCArXG4gICAgICBcIiBFVCBRIEVNQ1wiXG4gICAgKTtcbiAgfVxuXG4gIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoIDw9IDEpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gc3BsaXRcbiAgICAgIHJldHVybiBbbGluZV07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7XG4gICAgY29uc3Qgd2hpdGVzcGFjZSA9IGZvbnQuY2hhcnNUb0dseXBocyhcIiBcIiwgdHJ1ZSlbMF0ud2lkdGggKiBzY2FsZTtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcblxuICAgIGxldCBsYXN0U3BhY2VQb3MgPSAtMSxcbiAgICAgIHN0YXJ0Q2h1bmsgPSAwLFxuICAgICAgY3VycmVudFdpZHRoID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgY2hhcmFjdGVyID0gbGluZS5jaGFyQXQoaSk7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIiBcIikge1xuICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgd2hpdGVzcGFjZSA+IHdpZHRoKSB7XG4gICAgICAgICAgLy8gV2UgY2FuIGJyZWFrIGhlcmVcbiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBpKSk7XG4gICAgICAgICAgc3RhcnRDaHVuayA9IGk7XG4gICAgICAgICAgY3VycmVudFdpZHRoID0gd2hpdGVzcGFjZTtcbiAgICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50V2lkdGggKz0gd2hpdGVzcGFjZTtcbiAgICAgICAgICBsYXN0U3BhY2VQb3MgPSBpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGFyV2lkdGggPSBmb250LmNoYXJzVG9HbHlwaHMoY2hhcmFjdGVyLCBmYWxzZSlbMF0ud2lkdGggKiBzY2FsZTtcbiAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCArIGNoYXJXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgICAgLy8gV2UgbXVzdCBicmVhayB0byB0aGUgbGFzdCB3aGl0ZSBwb3NpdGlvbiAoaWYgYXZhaWxhYmxlKVxuICAgICAgICAgIGlmIChsYXN0U3BhY2VQb3MgIT09IC0xKSB7XG4gICAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsYXN0U3BhY2VQb3MgKyAxKSk7XG4gICAgICAgICAgICBzdGFydENodW5rID0gaSA9IGxhc3RTcGFjZVBvcyArIDE7XG4gICAgICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTtcbiAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEp1c3QgYnJlYWsgaW4gdGhlIG1pZGRsZSBvZiB0aGUgd29yZFxuICAgICAgICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgaSkpO1xuICAgICAgICAgICAgc3RhcnRDaHVuayA9IGk7XG4gICAgICAgICAgICBjdXJyZW50V2lkdGggPSBjaGFyV2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRXaWR0aCArPSBjaGFyV2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhcnRDaHVuayA8IGxpbmUubGVuZ3RoKSB7XG4gICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsaW5lLmxlbmd0aCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjaHVua3M7XG4gIH1cbn1cblxuY2xhc3MgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IG51bGw7XG4gICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbnVsbDtcblxuICAgIHRoaXMuZGF0YS5jaGVja0JveCA9XG4gICAgICAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5SQURJTykgJiZcbiAgICAgICF0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO1xuICAgIHRoaXMuZGF0YS5yYWRpb0J1dHRvbiA9XG4gICAgICB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJBRElPKSAmJlxuICAgICAgIXRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7XG4gICAgdGhpcy5kYXRhLnB1c2hCdXR0b24gPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5jaGVja0JveCkge1xuICAgICAgdGhpcy5fcHJvY2Vzc0NoZWNrQm94KHBhcmFtcyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHtcbiAgICAgIHRoaXMuX3Byb2Nlc3NSYWRpb0J1dHRvbihwYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnB1c2hCdXR0b24pIHtcbiAgICAgIHRoaXMuX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oXCJJbnZhbGlkIGZpZWxkIGZsYWdzIGZvciBidXR0b24gd2lkZ2V0IGFubm90YXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KFxuICAgICAgICBldmFsdWF0b3IsXG4gICAgICAgIHRhc2ssXG4gICAgICAgIGZhbHNlLCAvLyB3ZSB1c2Ugbm9ybWFsQXBwZWFyYW5jZSB0byByZW5kZXIgdGhlIGJ1dHRvblxuICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXSB8fCBmYWxzZTtcbiAgICAgIGxldCBhcHBlYXJhbmNlO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGFwcGVhcmFuY2UgPSB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZWFyYW5jZSA9IHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWRBcHBlYXJhbmNlID0gdGhpcy5hcHBlYXJhbmNlO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlO1xuICAgICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBzdXBlci5nZXRPcGVyYXRvckxpc3QoXG4gICAgICAgICAgZXZhbHVhdG9yLFxuICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgcmVuZGVyRm9ybXMsXG4gICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlID0gc2F2ZWRBcHBlYXJhbmNlO1xuICAgICAgICByZXR1cm4gb3BlcmF0b3JMaXN0O1xuICAgICAgfVxuXG4gICAgICAvLyBObyBhcHBlYXJhbmNlXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBPcGVyYXRvckxpc3QoKSk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoXG4gICAgICBldmFsdWF0b3IsXG4gICAgICB0YXNrLFxuICAgICAgcmVuZGVyRm9ybXMsXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZVxuICAgICk7XG4gIH1cblxuICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2F2ZUNoZWNrYm94KGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHtcbiAgICAgIHJldHVybiB0aGlzLl9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7XG4gIH1cblxuICBhc3luYyBfc2F2ZUNoZWNrYm94KGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZSAmJiB0aGlzLmRhdGEuZmllbGRWYWx1ZSAhPT0gXCJPZmZcIjtcbiAgICBjb25zdCB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF07XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpO1xuICAgIGlmICghaXNEaWN0KGRpY3QpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiBcIk9mZlwiKTtcbiAgICBkaWN0LnNldChcIlZcIiwgbmFtZSk7XG4gICAgZGljdC5zZXQoXCJBU1wiLCBuYW1lKTtcbiAgICBkaWN0LnNldChcIk1cIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7XG5cbiAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDtcbiAgICBsZXQgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsO1xuICAgIGlmIChlbmNyeXB0KSB7XG4gICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnJlZi5udW0sXG4gICAgICAgIHRoaXMucmVmLmdlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBbYCR7dGhpcy5yZWYubnVtfSAke3RoaXMucmVmLmdlbn0gb2JqXFxuYF07XG4gICAgd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgb3JpZ2luYWxUcmFuc2Zvcm0pO1xuICAgIGJ1ZmZlci5wdXNoKFwiXFxuZW5kb2JqXFxuXCIpO1xuXG4gICAgcmV0dXJuIFt7IHJlZjogdGhpcy5yZWYsIGRhdGE6IGJ1ZmZlci5qb2luKFwiXCIpIH1dO1xuICB9XG5cbiAgYXN5bmMgX3NhdmVSYWRpb0J1dHRvbihldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTtcbiAgICBjb25zdCB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF07XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpO1xuICAgIGlmICghaXNEaWN0KGRpY3QpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgOiBcIk9mZlwiKTtcbiAgICBsZXQgcGFyZW50QnVmZmVyID0gbnVsbDtcbiAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKGlzUmVmKHRoaXMucGFyZW50KSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBldmFsdWF0b3IueHJlZi5mZXRjaCh0aGlzLnBhcmVudCk7XG4gICAgICAgIGxldCBwYXJlbnRUcmFuc2Zvcm0gPSBudWxsO1xuICAgICAgICBpZiAoZW5jcnlwdCkge1xuICAgICAgICAgIHBhcmVudFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKFxuICAgICAgICAgICAgdGhpcy5wYXJlbnQubnVtLFxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZ2VuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQuc2V0KFwiVlwiLCBuYW1lKTtcbiAgICAgICAgcGFyZW50QnVmZmVyID0gW2Ake3RoaXMucGFyZW50Lm51bX0gJHt0aGlzLnBhcmVudC5nZW59IG9ialxcbmBdO1xuICAgICAgICB3cml0ZURpY3QocGFyZW50LCBwYXJlbnRCdWZmZXIsIHBhcmVudFRyYW5zZm9ybSk7XG4gICAgICAgIHBhcmVudEJ1ZmZlci5wdXNoKFwiXFxuZW5kb2JqXFxuXCIpO1xuICAgICAgfSBlbHNlIGlmIChpc0RpY3QodGhpcy5wYXJlbnQpKSB7XG4gICAgICAgIHRoaXMucGFyZW50LnNldChcIlZcIiwgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGljdC5zZXQoXCJBU1wiLCBuYW1lKTtcbiAgICBkaWN0LnNldChcIk1cIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7XG5cbiAgICBsZXQgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsO1xuICAgIGlmIChlbmNyeXB0KSB7XG4gICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnJlZi5udW0sXG4gICAgICAgIHRoaXMucmVmLmdlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBbYCR7dGhpcy5yZWYubnVtfSAke3RoaXMucmVmLmdlbn0gb2JqXFxuYF07XG4gICAgd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgb3JpZ2luYWxUcmFuc2Zvcm0pO1xuICAgIGJ1ZmZlci5wdXNoKFwiXFxuZW5kb2JqXFxuXCIpO1xuXG4gICAgY29uc3QgbmV3UmVmcyA9IFt7IHJlZjogdGhpcy5yZWYsIGRhdGE6IGJ1ZmZlci5qb2luKFwiXCIpIH1dO1xuICAgIGlmIChwYXJlbnRCdWZmZXIgIT09IG51bGwpIHtcbiAgICAgIG5ld1JlZnMucHVzaCh7IHJlZjogdGhpcy5wYXJlbnQsIGRhdGE6IHBhcmVudEJ1ZmZlci5qb2luKFwiXCIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdSZWZzO1xuICB9XG5cbiAgX3Byb2Nlc3NDaGVja0JveChwYXJhbXMpIHtcbiAgICBjb25zdCBjdXN0b21BcHBlYXJhbmNlID0gcGFyYW1zLmRpY3QuZ2V0KFwiQVBcIik7XG4gICAgaWYgKCFpc0RpY3QoY3VzdG9tQXBwZWFyYW5jZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxBcHBlYXJhbmNlID0gY3VzdG9tQXBwZWFyYW5jZS5nZXQoXCJOXCIpO1xuICAgIGlmICghaXNEaWN0KG5vcm1hbEFwcGVhcmFuY2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXhwb3J0VmFsdWVzID0gbm9ybWFsQXBwZWFyYW5jZS5nZXRLZXlzKCk7XG4gICAgaWYgKCFleHBvcnRWYWx1ZXMuaW5jbHVkZXMoXCJPZmZcIikpIHtcbiAgICAgIC8vIFRoZSAvT2ZmIGFwcGVhcmFuY2UgaXMgb3B0aW9uYWwuXG4gICAgICBleHBvcnRWYWx1ZXMucHVzaChcIk9mZlwiKTtcbiAgICB9XG4gICAgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgPVxuICAgICAgZXhwb3J0VmFsdWVzWzBdID09PSBcIk9mZlwiID8gZXhwb3J0VmFsdWVzWzFdIDogZXhwb3J0VmFsdWVzWzBdO1xuXG4gICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KHRoaXMuZGF0YS5leHBvcnRWYWx1ZSk7XG4gICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQoXCJPZmZcIikgfHwgbnVsbDtcbiAgfVxuXG4gIF9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKSB7XG4gICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBudWxsO1xuXG4gICAgLy8gVGhlIHBhcmVudCBmaWVsZCdzIGBWYCBlbnRyeSBob2xkcyBhIGBOYW1lYCBvYmplY3Qgd2l0aCB0aGUgYXBwZWFyYW5jZVxuICAgIC8vIHN0YXRlIG9mIHdoaWNoZXZlciBjaGlsZCBmaWVsZCBpcyBjdXJyZW50bHkgaW4gdGhlIFwib25cIiBzdGF0ZS5cbiAgICBjb25zdCBmaWVsZFBhcmVudCA9IHBhcmFtcy5kaWN0LmdldChcIlBhcmVudFwiKTtcbiAgICBpZiAoaXNEaWN0KGZpZWxkUGFyZW50KSAmJiBmaWVsZFBhcmVudC5oYXMoXCJWXCIpKSB7XG4gICAgICBjb25zdCBmaWVsZFBhcmVudFZhbHVlID0gZmllbGRQYXJlbnQuZ2V0KFwiVlwiKTtcbiAgICAgIGlmIChpc05hbWUoZmllbGRQYXJlbnRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMuZGljdC5nZXRSYXcoXCJQYXJlbnRcIik7XG4gICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGZpZWxkUGFyZW50VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBidXR0b24ncyB2YWx1ZSBjb3JyZXNwb25kcyB0byBpdHMgYXBwZWFyYW5jZSBzdGF0ZS5cbiAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gcGFyYW1zLmRpY3QuZ2V0KFwiQVBcIik7XG4gICAgaWYgKCFpc0RpY3QoYXBwZWFyYW5jZVN0YXRlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KFwiTlwiKTtcbiAgICBpZiAoIWlzRGljdChub3JtYWxBcHBlYXJhbmNlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBub3JtYWxBcHBlYXJhbmNlLmdldEtleXMoKSkge1xuICAgICAgaWYgKGtleSAhPT0gXCJPZmZcIikge1xuICAgICAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBrZXk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuYnV0dG9uVmFsdWUpO1xuICAgIHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KFwiT2ZmXCIpIHx8IG51bGw7XG4gIH1cblxuICBfcHJvY2Vzc1B1c2hCdXR0b24ocGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMuZGljdC5oYXMoXCJBXCIpKSB7XG4gICAgICB3YXJuKFwiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe1xuICAgICAgZGVzdERpY3Q6IHBhcmFtcy5kaWN0LFxuICAgICAgcmVzdWx0T2JqOiB0aGlzLmRhdGEsXG4gICAgICBkb2NCYXNlVXJsOiBwYXJhbXMucGRmTWFuYWdlci5kb2NCYXNlVXJsLFxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgb3B0aW9ucy4gVGhlIG9wdGlvbnMgYXJyYXkgbWF5IGNvbnNpc3Qgb2Ygc3RyaW5ncyBvclxuICAgIC8vIGFycmF5cy4gSWYgdGhlIGFycmF5IGNvbnNpc3RzIG9mIGFycmF5cywgdGhlbiB0aGUgZmlyc3QgZWxlbWVudCBvZlxuICAgIC8vIGVhY2ggYXJyYXkgaXMgdGhlIGV4cG9ydCB2YWx1ZSBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIGVhY2ggYXJyYXkgaXNcbiAgICAvLyB0aGUgZGlzcGxheSB2YWx1ZS4gSWYgdGhlIGFycmF5IGNvbnNpc3RzIG9mIHN0cmluZ3MsIHRoZW4gdGhlc2VcbiAgICAvLyByZXByZXNlbnQgYm90aCB0aGUgZXhwb3J0IGFuZCBkaXNwbGF5IHZhbHVlLiBJbiB0aGlzIGNhc2UsIHdlIGNvbnZlcnRcbiAgICAvLyBpdCB0byBhbiBhcnJheSBvZiBhcnJheXMgYXMgd2VsbCBmb3IgY29udmVuaWVuY2UgaW4gdGhlIGRpc3BsYXkgbGF5ZXIuXG4gICAgLy8gTm90ZSB0aGF0IHRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHN0YXRlIHRoYXQgdGhlIGBPcHRgIGZpZWxkIGlzXG4gICAgLy8gaW5oZXJpdGFibGUsIGJ1dCBpbiBwcmFjdGljZSBQREYgZ2VuZXJhdG9ycyBkbyBtYWtlIGFubm90YXRpb25zXG4gICAgLy8gaW5oZXJpdCB0aGUgb3B0aW9ucyBmcm9tIGEgcGFyZW50IGFubm90YXRpb24gKGlzc3VlIDgwOTQpLlxuICAgIHRoaXMuZGF0YS5vcHRpb25zID0gW107XG5cbiAgICBjb25zdCBvcHRpb25zID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7IGRpY3Q6IHBhcmFtcy5kaWN0LCBrZXk6IFwiT3B0XCIgfSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIGNvbnN0IHhyZWYgPSBwYXJhbXMueHJlZjtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb25zdCBvcHRpb24gPSB4cmVmLmZldGNoSWZSZWYob3B0aW9uc1tpXSk7XG4gICAgICAgIGNvbnN0IGlzT3B0aW9uQXJyYXkgPSBBcnJheS5pc0FycmF5KG9wdGlvbik7XG5cbiAgICAgICAgdGhpcy5kYXRhLm9wdGlvbnNbaV0gPSB7XG4gICAgICAgICAgZXhwb3J0VmFsdWU6IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShcbiAgICAgICAgICAgIGlzT3B0aW9uQXJyYXkgPyB4cmVmLmZldGNoSWZSZWYob3B0aW9uWzBdKSA6IG9wdGlvblxuICAgICAgICAgICksXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoXG4gICAgICAgICAgICBpc09wdGlvbkFycmF5ID8geHJlZi5mZXRjaElmUmVmKG9wdGlvblsxXSkgOiBvcHRpb25cbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBmaWVsZCB2YWx1ZSBjYW4gYmUgYG51bGxgIGlmIG5vIGl0ZW0gaXMgc2VsZWN0ZWQsIGEgc3RyaW5nIGlmIG9uZVxuICAgIC8vIGl0ZW0gaXMgc2VsZWN0ZWQgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpZiBtdWx0aXBsZSBpdGVtcyBhcmUgc2VsZWN0ZWQuXG4gICAgLy8gRm9yIGNvbnNpc3RlbmN5IGluIHRoZSBBUEkgYW5kIGNvbnZlbmllbmNlIGluIHRoZSBkaXNwbGF5IGxheWVyLCB3ZVxuICAgIC8vIGFsd2F5cyBtYWtlIHRoZSBmaWVsZCB2YWx1ZSBhbiBhcnJheSB3aXRoIHplcm8sIG9uZSBvciBtdWx0aXBsZSBpdGVtcy5cbiAgICBpZiAoaXNTdHJpbmcodGhpcy5kYXRhLmZpZWxkVmFsdWUpKSB7XG4gICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFt0aGlzLmRhdGEuZmllbGRWYWx1ZV07XG4gICAgfSBlbHNlIGlmICghdGhpcy5kYXRhLmZpZWxkVmFsdWUpIHtcbiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBmaWVsZCBmbGFncyBmb3IgdGhlIGRpc3BsYXkgbGF5ZXIuXG4gICAgdGhpcy5kYXRhLmNvbWJvID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CTyk7XG4gICAgdGhpcy5kYXRhLm11bHRpU2VsZWN0ID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSVNFTEVDVCk7XG4gICAgdGhpcy5faGFzVGV4dCA9IHRydWU7XG4gIH1cbn1cblxuY2xhc3MgVGV4dEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IERFRkFVTFRfSUNPTl9TSVpFID0gMjI7IC8vIHB4XG5cbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIGNvbnN0IGRpY3QgPSBwYXJhbWV0ZXJzLmRpY3Q7XG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVEVYVDtcblxuICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkge1xuICAgICAgdGhpcy5kYXRhLm5hbWUgPSBcIk5vSWNvblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEucmVjdFsxXSA9IHRoaXMuZGF0YS5yZWN0WzNdIC0gREVGQVVMVF9JQ09OX1NJWkU7XG4gICAgICB0aGlzLmRhdGEucmVjdFsyXSA9IHRoaXMuZGF0YS5yZWN0WzBdICsgREVGQVVMVF9JQ09OX1NJWkU7XG4gICAgICB0aGlzLmRhdGEubmFtZSA9IGRpY3QuaGFzKFwiTmFtZVwiKSA/IGRpY3QuZ2V0KFwiTmFtZVwiKS5uYW1lIDogXCJOb3RlXCI7XG4gICAgfVxuXG4gICAgaWYgKGRpY3QuaGFzKFwiU3RhdGVcIikpIHtcbiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IGRpY3QuZ2V0KFwiU3RhdGVcIikgfHwgbnVsbDtcbiAgICAgIHRoaXMuZGF0YS5zdGF0ZU1vZGVsID0gZGljdC5nZXQoXCJTdGF0ZU1vZGVsXCIpIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLmRhdGEuc3RhdGVNb2RlbCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIExpbmtBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcyk7XG5cbiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5MSU5LO1xuXG4gICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1zLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTtcbiAgICBpZiAocXVhZFBvaW50cykge1xuICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzO1xuICAgIH1cblxuICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7XG4gICAgICBkZXN0RGljdDogcGFyYW1zLmRpY3QsXG4gICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSxcbiAgICAgIGRvY0Jhc2VVcmw6IHBhcmFtcy5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwsXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgUG9wdXBBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlBPUFVQO1xuXG4gICAgbGV0IHBhcmVudEl0ZW0gPSBwYXJhbWV0ZXJzLmRpY3QuZ2V0KFwiUGFyZW50XCIpO1xuICAgIGlmICghcGFyZW50SXRlbSkge1xuICAgICAgd2FybihcIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRTdWJ0eXBlID0gcGFyZW50SXRlbS5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgIHRoaXMuZGF0YS5wYXJlbnRUeXBlID0gaXNOYW1lKHBhcmVudFN1YnR5cGUpID8gcGFyZW50U3VidHlwZS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCByYXdQYXJlbnQgPSBwYXJhbWV0ZXJzLmRpY3QuZ2V0UmF3KFwiUGFyZW50XCIpO1xuICAgIHRoaXMuZGF0YS5wYXJlbnRJZCA9IGlzUmVmKHJhd1BhcmVudCkgPyByYXdQYXJlbnQudG9TdHJpbmcoKSA6IG51bGw7XG5cbiAgICBjb25zdCBydCA9IHBhcmVudEl0ZW0uZ2V0KFwiUlRcIik7XG4gICAgaWYgKGlzTmFtZShydCwgQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkpIHtcbiAgICAgIC8vIFN1Ym9yZGluYXRlIGFubm90YXRpb25zIGluIGEgZ3JvdXAgc2hvdWxkIGluaGVyaXRcbiAgICAgIC8vIHRoZSBncm91cCBhdHRyaWJ1dGVzIGZyb20gdGhlIHByaW1hcnkgYW5ub3RhdGlvbi5cbiAgICAgIHBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtLmdldChcIklSVFwiKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudEl0ZW0uaGFzKFwiTVwiKSkge1xuICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50SXRlbS5nZXQoXCJNXCIpKTtcbiAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gdGhpcy5tb2RpZmljYXRpb25EYXRlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50SXRlbS5oYXMoXCJDXCIpKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgIHRoaXMuZGF0YS5jb2xvciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50SXRlbS5nZXRBcnJheShcIkNcIikpO1xuICAgICAgdGhpcy5kYXRhLmNvbG9yID0gdGhpcy5jb2xvcjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgUG9wdXAgYW5ub3RhdGlvbiBpcyBub3Qgdmlld2FibGUsIGJ1dCB0aGUgcGFyZW50IGFubm90YXRpb24gaXMsXG4gICAgLy8gdGhhdCBpcyBtb3N0IGxpa2VseSBhIGJ1Zy4gRmFsbGJhY2sgdG8gaW5oZXJpdCB0aGUgZmxhZ3MgZnJvbSB0aGUgcGFyZW50XG4gICAgLy8gYW5ub3RhdGlvbiAodGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGJlaGF2aW91ciBpbiBBZG9iZSBSZWFkZXIpLlxuICAgIGlmICghdGhpcy52aWV3YWJsZSkge1xuICAgICAgY29uc3QgcGFyZW50RmxhZ3MgPSBwYXJlbnRJdGVtLmdldChcIkZcIik7XG4gICAgICBpZiAodGhpcy5faXNWaWV3YWJsZShwYXJlbnRGbGFncykpIHtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhwYXJlbnRGbGFncyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhLnRpdGxlID0gc3RyaW5nVG9QREZTdHJpbmcocGFyZW50SXRlbS5nZXQoXCJUXCIpIHx8IFwiXCIpO1xuICAgIHRoaXMuZGF0YS5jb250ZW50cyA9IHN0cmluZ1RvUERGU3RyaW5nKHBhcmVudEl0ZW0uZ2V0KFwiQ29udGVudHNcIikgfHwgXCJcIik7XG4gIH1cbn1cblxuY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkZSRUVURVhUO1xuICB9XG59XG5cbmNsYXNzIExpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkxJTkU7XG5cbiAgICB0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzID0gVXRpbC5ub3JtYWxpemVSZWN0KFxuICAgICAgcGFyYW1ldGVycy5kaWN0LmdldEFycmF5KFwiTFwiKVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgU3F1YXJlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TUVVBUkU7XG4gIH1cbn1cblxuY2xhc3MgQ2lyY2xlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5DSVJDTEU7XG4gIH1cbn1cblxuY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlBPTFlMSU5FO1xuXG4gICAgLy8gVGhlIHZlcnRpY2VzIGFycmF5IGlzIGFuIGFycmF5IG9mIG51bWJlcnMgcmVwcmVzZW50aW5nIHRoZSBhbHRlcm5hdGluZ1xuICAgIC8vIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvb3JkaW5hdGVzLCByZXNwZWN0aXZlbHksIG9mIGVhY2ggdmVydGV4LlxuICAgIC8vIENvbnZlcnQgdGhpcyB0byBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggeCBhbmQgeSBjb29yZGluYXRlcy5cbiAgICBjb25zdCByYXdWZXJ0aWNlcyA9IHBhcmFtZXRlcnMuZGljdC5nZXRBcnJheShcIlZlcnRpY2VzXCIpO1xuICAgIHRoaXMuZGF0YS52ZXJ0aWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHJhd1ZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIHRoaXMuZGF0YS52ZXJ0aWNlcy5wdXNoKHtcbiAgICAgICAgeDogcmF3VmVydGljZXNbaV0sXG4gICAgICAgIHk6IHJhd1ZlcnRpY2VzW2kgKyAxXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBQb2x5Z29uQW5ub3RhdGlvbiBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICAvLyBQb2x5Z29ucyBhcmUgc3BlY2lmaWMgZm9ybXMgb2YgcG9seWxpbmVzLCBzbyByZXVzZSB0aGVpciBsb2dpYy5cbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlBPTFlHT047XG4gIH1cbn1cblxuY2xhc3MgQ2FyZXRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkNBUkVUO1xuICB9XG59XG5cbmNsYXNzIElua0Fubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuXG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuSU5LO1xuXG4gICAgY29uc3QgeHJlZiA9IHBhcmFtZXRlcnMueHJlZjtcbiAgICBjb25zdCBvcmlnaW5hbElua0xpc3RzID0gcGFyYW1ldGVycy5kaWN0LmdldEFycmF5KFwiSW5rTGlzdFwiKTtcbiAgICB0aGlzLmRhdGEuaW5rTGlzdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcmlnaW5hbElua0xpc3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIC8vIFRoZSByYXcgaW5rIGxpc3RzIGFycmF5IGNvbnRhaW5zIGFycmF5cyBvZiBudW1iZXJzIHJlcHJlc2VudGluZ1xuICAgICAgLy8gdGhlIGFsdGVybmF0aW5nIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvb3JkaW5hdGVzLCByZXNwZWN0aXZlbHksXG4gICAgICAvLyBvZiBlYWNoIHZlcnRleC4gQ29udmVydCB0aGlzIHRvIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB4IGFuZCB5XG4gICAgICAvLyBjb29yZGluYXRlcy5cbiAgICAgIHRoaXMuZGF0YS5pbmtMaXN0cy5wdXNoKFtdKTtcbiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IG9yaWdpbmFsSW5rTGlzdHNbaV0ubGVuZ3RoOyBqIDwgamo7IGogKz0gMikge1xuICAgICAgICB0aGlzLmRhdGEuaW5rTGlzdHNbaV0ucHVzaCh7XG4gICAgICAgICAgeDogeHJlZi5mZXRjaElmUmVmKG9yaWdpbmFsSW5rTGlzdHNbaV1bal0pLFxuICAgICAgICAgIHk6IHhyZWYuZmV0Y2hJZlJlZihvcmlnaW5hbElua0xpc3RzW2ldW2ogKyAxXSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBIaWdobGlnaHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkhJR0hMSUdIVDtcblxuICAgIGNvbnN0IHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKHBhcmFtZXRlcnMuZGljdCwgdGhpcy5yZWN0YW5nbGUpO1xuICAgIGlmIChxdWFkUG9pbnRzKSB7XG4gICAgICB0aGlzLmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFVuZGVybGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuXG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FO1xuXG4gICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1ldGVycy5kaWN0LCB0aGlzLnJlY3RhbmdsZSk7XG4gICAgaWYgKHF1YWRQb2ludHMpIHtcbiAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50cztcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNRVUlHR0xZO1xuXG4gICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1ldGVycy5kaWN0LCB0aGlzLnJlY3RhbmdsZSk7XG4gICAgaWYgKHF1YWRQb2ludHMpIHtcbiAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50cztcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24ge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG5cbiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ7XG5cbiAgICBjb25zdCBxdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhwYXJhbWV0ZXJzLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTtcbiAgICBpZiAocXVhZFBvaW50cykge1xuICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBTdGFtcEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuXG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuU1RBTVA7XG4gIH1cbn1cblxuY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcblxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZVNwZWMocGFyYW1ldGVycy5kaWN0LmdldChcIkZTXCIpLCBwYXJhbWV0ZXJzLnhyZWYpO1xuXG4gICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ7XG4gICAgdGhpcy5kYXRhLmZpbGUgPSBmaWxlLnNlcmlhbGl6YWJsZTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBBbm5vdGF0aW9uLFxuICBBbm5vdGF0aW9uQm9yZGVyU3R5bGUsXG4gIEFubm90YXRpb25GYWN0b3J5LFxuICBNYXJrdXBBbm5vdGF0aW9uLFxuICBnZXRRdWFkUG9pbnRzLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIEltYWdlS2luZCwgT1BTLCB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbnZhciBRdWV1ZU9wdGltaXplciA9IChmdW5jdGlvbiBRdWV1ZU9wdGltaXplckNsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIGFkZFN0YXRlKHBhcmVudFN0YXRlLCBwYXR0ZXJuLCBjaGVja0ZuLCBpdGVyYXRlRm4sIHByb2Nlc3NGbikge1xuICAgIHZhciBzdGF0ZSA9IHBhcmVudFN0YXRlO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhdHRlcm4ubGVuZ3RoIC0gMTsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gcGF0dGVybltpXTtcbiAgICAgIHN0YXRlID0gc3RhdGVbaXRlbV0gfHwgKHN0YXRlW2l0ZW1dID0gW10pO1xuICAgIH1cbiAgICBzdGF0ZVtwYXR0ZXJuW3BhdHRlcm4ubGVuZ3RoIC0gMV1dID0ge1xuICAgICAgY2hlY2tGbixcbiAgICAgIGl0ZXJhdGVGbixcbiAgICAgIHByb2Nlc3NGbixcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKFxuICAgIGlGaXJzdFNhdmUsXG4gICAgY291bnQsXG4gICAgZm5BcnJheSxcbiAgICBhcmdzQXJyYXlcbiAgKSB7XG4gICAgLy8gSGFuZGxlcyBzcGVjaWFsIGNhc2Ugb2YgbWFpbmx5IExhVGVYIGRvY3VtZW50cyB3aGljaCB1c2UgaW1hZ2UgbWFza3MgdG9cbiAgICAvLyBkcmF3IGxpbmVzIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBzdHlsZS5cbiAgICAvLyAnY291bnQnIGdyb3VwcyBvZiAoc2F2ZSwgdHJhbnNmb3JtLCBwYWludEltYWdlTWFza1hPYmplY3QsIHJlc3RvcmUpK1xuICAgIC8vIGhhdmUgYmVlbiBmb3VuZCBhdCBpRmlyc3RTYXZlLlxuICAgIHZhciBpRmlyc3RQSU1YTyA9IGlGaXJzdFNhdmUgKyAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgdmFyIGFyZyA9IGFyZ3NBcnJheVtpRmlyc3RQSU1YTyArIDQgKiBpXTtcbiAgICAgIHZhciBpbWFnZU1hc2sgPSBhcmcubGVuZ3RoID09PSAxICYmIGFyZ1swXTtcbiAgICAgIGlmIChcbiAgICAgICAgaW1hZ2VNYXNrICYmXG4gICAgICAgIGltYWdlTWFzay53aWR0aCA9PT0gMSAmJlxuICAgICAgICBpbWFnZU1hc2suaGVpZ2h0ID09PSAxICYmXG4gICAgICAgICghaW1hZ2VNYXNrLmRhdGEubGVuZ3RoIHx8XG4gICAgICAgICAgKGltYWdlTWFzay5kYXRhLmxlbmd0aCA9PT0gMSAmJiBpbWFnZU1hc2suZGF0YVswXSA9PT0gMCkpXG4gICAgICApIHtcbiAgICAgICAgZm5BcnJheVtpRmlyc3RQSU1YTyArIDQgKiBpXSA9IE9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2s7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBjb3VudCAtIGk7XG4gIH1cblxuICB2YXIgSW5pdGlhbFN0YXRlID0gW107XG5cbiAgLy8gVGhpcyByZXBsYWNlcyAoc2F2ZSwgdHJhbnNmb3JtLCBwYWludElubGluZUltYWdlWE9iamVjdCwgcmVzdG9yZSkrXG4gIC8vIHNlcXVlbmNlcyB3aXRoIG9uZSB8cGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cHwgb3BlcmF0aW9uLlxuICBhZGRTdGF0ZShcbiAgICBJbml0aWFsU3RhdGUsXG4gICAgW09QUy5zYXZlLCBPUFMudHJhbnNmb3JtLCBPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIE9QUy5yZXN0b3JlXSxcbiAgICBudWxsLFxuICAgIGZ1bmN0aW9uIGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHtcbiAgICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5O1xuICAgICAgdmFyIGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gMztcbiAgICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDtcbiAgICAgIHN3aXRjaCAocG9zKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnNhdmU7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnRyYW5zZm9ybTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnJlc3RvcmU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApO1xuICAgIH0sXG4gICAgZnVuY3Rpb24gZm91bmRJbmxpbmVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHtcbiAgICAgIHZhciBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAxMDtcbiAgICAgIHZhciBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAyMDA7XG4gICAgICB2YXIgTUFYX1dJRFRIID0gMTAwMDtcbiAgICAgIHZhciBJTUFHRV9QQURESU5HID0gMTtcblxuICAgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksXG4gICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5O1xuICAgICAgdmFyIGN1cnIgPSBjb250ZXh0LmlDdXJyO1xuICAgICAgdmFyIGlGaXJzdFNhdmUgPSBjdXJyIC0gMztcbiAgICAgIHZhciBpRmlyc3RUcmFuc2Zvcm0gPSBjdXJyIC0gMjtcbiAgICAgIHZhciBpRmlyc3RQSUlYTyA9IGN1cnIgLSAxO1xuXG4gICAgICB2YXIgY291bnQgPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCksXG4gICAgICAgIE1BWF9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DS1xuICAgICAgKTtcbiAgICAgIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSykge1xuICAgICAgICByZXR1cm4gaSAtICgoaSAtIGlGaXJzdFNhdmUpICUgNCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFzc3VtaW5nIHRoYXQgaGVpZ2h0cyBvZiB0aG9zZSBpbWFnZSBpcyB0b28gc21hbGwgKH4xIHBpeGVsKVxuICAgICAgLy8gcGFja2luZyBhcyBtdWNoIGFzIHBvc3NpYmxlIGJ5IGxpbmVzXG4gICAgICB2YXIgbWF4WCA9IDA7XG4gICAgICB2YXIgbWFwID0gW10sXG4gICAgICAgIG1heExpbmVIZWlnaHQgPSAwO1xuICAgICAgdmFyIGN1cnJlbnRYID0gSU1BR0VfUEFERElORyxcbiAgICAgICAgY3VycmVudFkgPSBJTUFHRV9QQURESU5HO1xuICAgICAgdmFyIHE7XG4gICAgICBmb3IgKHEgPSAwOyBxIDwgY291bnQ7IHErKykge1xuICAgICAgICB2YXIgdHJhbnNmb3JtID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybSArIChxIDw8IDIpXTtcbiAgICAgICAgdmFyIGltZyA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXTtcbiAgICAgICAgaWYgKGN1cnJlbnRYICsgaW1nLndpZHRoID4gTUFYX1dJRFRIKSB7XG4gICAgICAgICAgLy8gc3RhcnRpbmcgbmV3IGxpbmVcbiAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpO1xuICAgICAgICAgIGN1cnJlbnRZICs9IG1heExpbmVIZWlnaHQgKyAyICogSU1BR0VfUEFERElORztcbiAgICAgICAgICBjdXJyZW50WCA9IDA7XG4gICAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICB4OiBjdXJyZW50WCxcbiAgICAgICAgICB5OiBjdXJyZW50WSxcbiAgICAgICAgICB3OiBpbWcud2lkdGgsXG4gICAgICAgICAgaDogaW1nLmhlaWdodCxcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRYICs9IGltZy53aWR0aCArIDIgKiBJTUFHRV9QQURESU5HO1xuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgaW1nLmhlaWdodCk7XG4gICAgICB9XG4gICAgICB2YXIgaW1nV2lkdGggPSBNYXRoLm1heChtYXhYLCBjdXJyZW50WCkgKyBJTUFHRV9QQURESU5HO1xuICAgICAgdmFyIGltZ0hlaWdodCA9IGN1cnJlbnRZICsgbWF4TGluZUhlaWdodCArIElNQUdFX1BBRERJTkc7XG4gICAgICB2YXIgaW1nRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdXaWR0aCAqIGltZ0hlaWdodCAqIDQpO1xuICAgICAgdmFyIGltZ1Jvd1NpemUgPSBpbWdXaWR0aCA8PCAyO1xuICAgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyspIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF0uZGF0YTtcbiAgICAgICAgLy8gQ29weSBpbWFnZSBieSBsaW5lcyBhbmQgZXh0ZW5kcyBwaXhlbHMgaW50byBwYWRkaW5nLlxuICAgICAgICB2YXIgcm93U2l6ZSA9IG1hcFtxXS53IDw8IDI7XG4gICAgICAgIHZhciBkYXRhT2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldCA9IChtYXBbcV0ueCArIG1hcFtxXS55ICogaW1nV2lkdGgpIDw8IDI7XG4gICAgICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoMCwgcm93U2l6ZSksIG9mZnNldCAtIGltZ1Jvd1NpemUpO1xuICAgICAgICBmb3IgKHZhciBrID0gMCwga2sgPSBtYXBbcV0uaDsgayA8IGtrOyBrKyspIHtcbiAgICAgICAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KGRhdGFPZmZzZXQsIGRhdGFPZmZzZXQgKyByb3dTaXplKSwgb2Zmc2V0KTtcbiAgICAgICAgICBkYXRhT2Zmc2V0ICs9IHJvd1NpemU7XG4gICAgICAgICAgb2Zmc2V0ICs9IGltZ1Jvd1NpemU7XG4gICAgICAgIH1cbiAgICAgICAgaW1nRGF0YS5zZXQoZGF0YS5zdWJhcnJheShkYXRhT2Zmc2V0IC0gcm93U2l6ZSwgZGF0YU9mZnNldCksIG9mZnNldCk7XG4gICAgICAgIHdoaWxlIChvZmZzZXQgPj0gMCkge1xuICAgICAgICAgIGRhdGFbb2Zmc2V0IC0gNF0gPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgZGF0YVtvZmZzZXQgLSAzXSA9IGRhdGFbb2Zmc2V0ICsgMV07XG4gICAgICAgICAgZGF0YVtvZmZzZXQgLSAyXSA9IGRhdGFbb2Zmc2V0ICsgMl07XG4gICAgICAgICAgZGF0YVtvZmZzZXQgLSAxXSA9IGRhdGFbb2Zmc2V0ICsgM107XG4gICAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDRdO1xuICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSArIDFdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gM107XG4gICAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMl0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAyXTtcbiAgICAgICAgICBkYXRhW29mZnNldCArIHJvd1NpemUgKyAzXSA9IGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSAtIDFdO1xuICAgICAgICAgIG9mZnNldCAtPSBpbWdSb3dTaXplO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcGxhY2UgcXVldWUgaXRlbXMuXG4gICAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKTtcbiAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aDogaW1nV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBpbWdIZWlnaHQsXG4gICAgICAgICAga2luZDogSW1hZ2VLaW5kLlJHQkFfMzJCUFAsXG4gICAgICAgICAgZGF0YTogaW1nRGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgbWFwLFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiBpRmlyc3RTYXZlICsgMTtcbiAgICB9XG4gICk7XG5cbiAgLy8gVGhpcyByZXBsYWNlcyAoc2F2ZSwgdHJhbnNmb3JtLCBwYWludEltYWdlTWFza1hPYmplY3QsIHJlc3RvcmUpK1xuICAvLyBzZXF1ZW5jZXMgd2l0aCBvbmUgfHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwfCBvciBvbmVcbiAgLy8gfHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdHwgb3BlcmF0aW9uLlxuICBhZGRTdGF0ZShcbiAgICBJbml0aWFsU3RhdGUsXG4gICAgW09QUy5zYXZlLCBPUFMudHJhbnNmb3JtLCBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBPUFMucmVzdG9yZV0sXG4gICAgbnVsbCxcbiAgICBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkge1xuICAgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXk7XG4gICAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzO1xuICAgICAgdmFyIHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0O1xuICAgICAgc3dpdGNoIChwb3MpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2F2ZTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMudHJhbnNmb3JtO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5wYWludEltYWdlTWFza1hPYmplY3Q7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnJlc3RvcmU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbWFnZU1hc2tHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uIGZvdW5kSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkge1xuICAgICAgdmFyIE1JTl9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDtcbiAgICAgIHZhciBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTAwO1xuICAgICAgdmFyIE1BWF9TQU1FX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwMDA7XG5cbiAgICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LFxuICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTtcbiAgICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjtcbiAgICAgIHZhciBpRmlyc3RTYXZlID0gY3VyciAtIDM7XG4gICAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7XG4gICAgICB2YXIgaUZpcnN0UElNWE8gPSBjdXJyIC0gMTtcblxuICAgICAgLy8gQXQgdGhpcyBwb2ludCwgaSBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9wIHBhc3QgdGhlIGxhc3QgdmFsaWRcbiAgICAgIC8vIHF1YXJ0ZXQuXG4gICAgICB2YXIgY291bnQgPSBNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KTtcbiAgICAgIGNvdW50ID0gaGFuZGxlUGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKFxuICAgICAgICBpRmlyc3RTYXZlLFxuICAgICAgICBjb3VudCxcbiAgICAgICAgZm5BcnJheSxcbiAgICAgICAgYXJnc0FycmF5XG4gICAgICApO1xuICAgICAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSykge1xuICAgICAgICByZXR1cm4gaSAtICgoaSAtIGlGaXJzdFNhdmUpICUgNCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBxO1xuICAgICAgdmFyIGlzU2FtZUltYWdlID0gZmFsc2U7XG4gICAgICB2YXIgaVRyYW5zZm9ybSwgdHJhbnNmb3JtQXJncztcbiAgICAgIHZhciBmaXJzdFBJTVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSU1YT11bMF07XG4gICAgICBjb25zdCBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXSxcbiAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmcxID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMV0sXG4gICAgICAgIGZpcnN0VHJhbnNmb3JtQXJnMiA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdLFxuICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzMgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVszXTtcblxuICAgICAgaWYgKGZpcnN0VHJhbnNmb3JtQXJnMSA9PT0gZmlyc3RUcmFuc2Zvcm1BcmcyKSB7XG4gICAgICAgIGlzU2FtZUltYWdlID0gdHJ1ZTtcbiAgICAgICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybSArIDQ7XG4gICAgICAgIHZhciBpUElNWE8gPSBpRmlyc3RQSU1YTyArIDQ7XG4gICAgICAgIGZvciAocSA9IDE7IHEgPCBjb3VudDsgcSsrLCBpVHJhbnNmb3JtICs9IDQsIGlQSU1YTyArPSA0KSB7XG4gICAgICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhcmdzQXJyYXlbaVBJTVhPXVswXSAhPT0gZmlyc3RQSU1YT0FyZzAgfHxcbiAgICAgICAgICAgIHRyYW5zZm9ybUFyZ3NbMF0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMCB8fFxuICAgICAgICAgICAgdHJhbnNmb3JtQXJnc1sxXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcxIHx8XG4gICAgICAgICAgICB0cmFuc2Zvcm1BcmdzWzJdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzIgfHxcbiAgICAgICAgICAgIHRyYW5zZm9ybUFyZ3NbM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHEgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7XG4gICAgICAgICAgICAgIGlzU2FtZUltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb3VudCA9IHE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhazsgLy8gZGlmZmVyZW50IGltYWdlIG9yIHRyYW5zZm9ybVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNTYW1lSW1hZ2UpIHtcbiAgICAgICAgY291bnQgPSBNYXRoLm1pbihjb3VudCwgTUFYX1NBTUVfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTtcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTtcbiAgICAgICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTtcbiAgICAgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCkge1xuICAgICAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaVRyYW5zZm9ybV07XG4gICAgICAgICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdO1xuICAgICAgICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcGxhY2UgcXVldWUgaXRlbXMuXG4gICAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCk7XG4gICAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbXG4gICAgICAgICAgZmlyc3RQSU1YT0FyZzAsXG4gICAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmcwLFxuICAgICAgICAgIGZpcnN0VHJhbnNmb3JtQXJnMSxcbiAgICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzIsXG4gICAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmczLFxuICAgICAgICAgIHBvc2l0aW9ucyxcbiAgICAgICAgXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTtcbiAgICAgICAgdmFyIGltYWdlcyA9IFtdO1xuICAgICAgICBmb3IgKHEgPSAwOyBxIDwgY291bnQ7IHErKykge1xuICAgICAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtICsgKHEgPDwgMildO1xuICAgICAgICAgIHZhciBtYXNrUGFyYW1zID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPICsgKHEgPDwgMildWzBdO1xuICAgICAgICAgIGltYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IG1hc2tQYXJhbXMuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiBtYXNrUGFyYW1zLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBtYXNrUGFyYW1zLmhlaWdodCxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtQXJncyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcGxhY2UgcXVldWUgaXRlbXMuXG4gICAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwKTtcbiAgICAgICAgYXJnc0FycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIFtpbWFnZXNdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxO1xuICAgIH1cbiAgKTtcblxuICAvLyBUaGlzIHJlcGxhY2VzIChzYXZlLCB0cmFuc2Zvcm0sIHBhaW50SW1hZ2VYT2JqZWN0LCByZXN0b3JlKSsgc2VxdWVuY2VzXG4gIC8vIHdpdGggb25lIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0IG9wZXJhdGlvbiwgaWYgdGhlIHx0cmFuc2Zvcm18IGFuZFxuICAvLyB8cGFpbnRJbWFnZVhPYmplY3RSZXBlYXR8IG9wcyBhcmUgYXBwcm9wcmlhdGUuXG4gIGFkZFN0YXRlKFxuICAgIEluaXRpYWxTdGF0ZSxcbiAgICBbT1BTLnNhdmUsIE9QUy50cmFuc2Zvcm0sIE9QUy5wYWludEltYWdlWE9iamVjdCwgT1BTLnJlc3RvcmVdLFxuICAgIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB2YXIgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7XG4gICAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY29udGV4dC5pQ3VyciAtIDI7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSA9PT0gMCAmJlxuICAgICAgICBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSA9PT0gMFxuICAgICAgKTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uIGl0ZXJhdGVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHtcbiAgICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LFxuICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTtcbiAgICAgIHZhciBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7XG4gICAgICB2YXIgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7XG4gICAgICBzd2l0Y2ggKHBvcykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zYXZlO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IE9QUy50cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyO1xuICAgICAgICAgIHZhciBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXTtcbiAgICAgICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYXJnc0FycmF5W2ldWzBdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzAgfHxcbiAgICAgICAgICAgIGFyZ3NBcnJheVtpXVsxXSAhPT0gMCB8fFxuICAgICAgICAgICAgYXJnc0FycmF5W2ldWzJdICE9PSAwIHx8XG4gICAgICAgICAgICBhcmdzQXJyYXlbaV1bM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB0cmFuc2Zvcm1zIGRvbid0IG1hdGNoXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IE9QUy5wYWludEltYWdlWE9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaUZpcnN0UElYTyA9IGNvbnRleHQuaUN1cnIgLSAxO1xuICAgICAgICAgIHZhciBmaXJzdFBJWE9BcmcwID0gYXJnc0FycmF5W2lGaXJzdFBJWE9dWzBdO1xuICAgICAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0UElYT0FyZzApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gaW1hZ2VzIGRvbid0IG1hdGNoXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjb250ZXh0LCBpKSB7XG4gICAgICB2YXIgTUlOX0lNQUdFU19JTl9CTE9DSyA9IDM7XG4gICAgICB2YXIgTUFYX0lNQUdFU19JTl9CTE9DSyA9IDEwMDA7XG5cbiAgICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LFxuICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTtcbiAgICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjtcbiAgICAgIHZhciBpRmlyc3RTYXZlID0gY3VyciAtIDM7XG4gICAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7XG4gICAgICB2YXIgaUZpcnN0UElYTyA9IGN1cnIgLSAxO1xuICAgICAgdmFyIGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07XG4gICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF07XG4gICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGkgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvcCBwYXN0IHRoZSBsYXN0IHZhbGlkXG4gICAgICAvLyBxdWFydGV0LlxuICAgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGguZmxvb3IoKGkgLSBpRmlyc3RTYXZlKSAvIDQpLFxuICAgICAgICBNQVhfSU1BR0VTX0lOX0JMT0NLXG4gICAgICApO1xuICAgICAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9CTE9DSykge1xuICAgICAgICByZXR1cm4gaSAtICgoaSAtIGlGaXJzdFNhdmUpICUgNCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgdGhlICh4LHkpIHBvc2l0aW9ucyBmcm9tIGFsbCBvZiB0aGUgbWF0Y2hpbmcgdHJhbnNmb3Jtcy5cbiAgICAgIHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gICAgICB2YXIgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTtcbiAgICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0KSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dO1xuICAgICAgICBwb3NpdGlvbnNbcSA8PCAxXSA9IHRyYW5zZm9ybUFyZ3NbNF07XG4gICAgICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVwbGFjZSBxdWV1ZSBpdGVtcy5cbiAgICAgIHZhciBhcmdzID0gW1xuICAgICAgICBmaXJzdFBJWE9BcmcwLFxuICAgICAgICBmaXJzdFRyYW5zZm9ybUFyZzAsXG4gICAgICAgIGZpcnN0VHJhbnNmb3JtQXJnMyxcbiAgICAgICAgcG9zaXRpb25zLFxuICAgICAgXTtcbiAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KTtcbiAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBhcmdzKTtcblxuICAgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxO1xuICAgIH1cbiAgKTtcblxuICAvLyBUaGlzIHJlcGxhY2VzIChiZWdpblRleHQsIHNldEZvbnQsIHNldFRleHRNYXRyaXgsIHNob3dUZXh0LCBlbmRUZXh0KStcbiAgLy8gc2VxdWVuY2VzIHdpdGggKGJlZ2luVGV4dCwgc2V0Rm9udCwgKHNldFRleHRNYXRyaXgsIHNob3dUZXh0KSssIGVuZFRleHQpK1xuICAvLyBzZXF1ZW5jZXMsIGlmIHRoZSBmb250IGZvciBlYWNoIG9uZSBpcyB0aGUgc2FtZS5cbiAgYWRkU3RhdGUoXG4gICAgSW5pdGlhbFN0YXRlLFxuICAgIFtPUFMuYmVnaW5UZXh0LCBPUFMuc2V0Rm9udCwgT1BTLnNldFRleHRNYXRyaXgsIE9QUy5zaG93VGV4dCwgT1BTLmVuZFRleHRdLFxuICAgIG51bGwsXG4gICAgZnVuY3Rpb24gaXRlcmF0ZVNob3dUZXh0R3JvdXAoY29udGV4dCwgaSkge1xuICAgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksXG4gICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5O1xuICAgICAgdmFyIGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gNDtcbiAgICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNTtcbiAgICAgIHN3aXRjaCAocG9zKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLmJlZ2luVGV4dDtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2V0Rm9udDtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2V0VGV4dE1hdHJpeDtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGlmIChmbkFycmF5W2ldICE9PSBPUFMuc2hvd1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGlGaXJzdFNldEZvbnQgPSBjb250ZXh0LmlDdXJyIC0gMztcbiAgICAgICAgICB2YXIgZmlyc3RTZXRGb250QXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVswXTtcbiAgICAgICAgICB2YXIgZmlyc3RTZXRGb250QXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVsxXTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0U2V0Rm9udEFyZzAgfHxcbiAgICAgICAgICAgIGFyZ3NBcnJheVtpXVsxXSAhPT0gZmlyc3RTZXRGb250QXJnMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBmb250cyBkb24ndCBtYXRjaFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuZW5kVGV4dDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZVNob3dUZXh0R3JvdXAgLSBpbnZhbGlkIHBvczogJHtwb3N9YCk7XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoY29udGV4dCwgaSkge1xuICAgICAgdmFyIE1JTl9DSEFSU19JTl9CTE9DSyA9IDM7XG4gICAgICB2YXIgTUFYX0NIQVJTX0lOX0JMT0NLID0gMTAwMDtcblxuICAgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksXG4gICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5O1xuICAgICAgdmFyIGN1cnIgPSBjb250ZXh0LmlDdXJyO1xuICAgICAgdmFyIGlGaXJzdEJlZ2luVGV4dCA9IGN1cnIgLSA0O1xuICAgICAgdmFyIGlGaXJzdFNldEZvbnQgPSBjdXJyIC0gMztcbiAgICAgIHZhciBpRmlyc3RTZXRUZXh0TWF0cml4ID0gY3VyciAtIDI7XG4gICAgICB2YXIgaUZpcnN0U2hvd1RleHQgPSBjdXJyIC0gMTtcbiAgICAgIHZhciBpRmlyc3RFbmRUZXh0ID0gY3VycjtcbiAgICAgIHZhciBmaXJzdFNldEZvbnRBcmcwID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzBdO1xuICAgICAgdmFyIGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGkgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvcCBwYXN0IHRoZSBsYXN0IHZhbGlkXG4gICAgICAvLyBxdWludGV0LlxuICAgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGguZmxvb3IoKGkgLSBpRmlyc3RCZWdpblRleHQpIC8gNSksXG4gICAgICAgIE1BWF9DSEFSU19JTl9CTE9DS1xuICAgICAgKTtcbiAgICAgIGlmIChjb3VudCA8IE1JTl9DSEFSU19JTl9CTE9DSykge1xuICAgICAgICByZXR1cm4gaSAtICgoaSAtIGlGaXJzdEJlZ2luVGV4dCkgJSA1KTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHByZWNlZGluZyBxdWludGV0IGlzICg8c29tZXRoaW5nPiwgc2V0Rm9udCwgc2V0VGV4dE1hdHJpeCxcbiAgICAgIC8vIHNob3dUZXh0LCBlbmRUZXh0KSwgaW5jbHVkZSB0aGF0IGFzIHdlbGwuIChFLmcuIDxzb21ldGhpbmc+IG1pZ2h0IGJlXG4gICAgICAvLyB8ZGVwZW5kZW5jeXwuKVxuICAgICAgdmFyIGlGaXJzdCA9IGlGaXJzdEJlZ2luVGV4dDtcbiAgICAgIGlmIChcbiAgICAgICAgaUZpcnN0QmVnaW5UZXh0ID49IDQgJiZcbiAgICAgICAgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XSA9PT0gZm5BcnJheVtpRmlyc3RTZXRGb250XSAmJlxuICAgICAgICBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDNdID09PSBmbkFycmF5W2lGaXJzdFNldFRleHRNYXRyaXhdICYmXG4gICAgICAgIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMl0gPT09IGZuQXJyYXlbaUZpcnN0U2hvd1RleHRdICYmXG4gICAgICAgIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMV0gPT09IGZuQXJyYXlbaUZpcnN0RW5kVGV4dF0gJiZcbiAgICAgICAgYXJnc0FycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdWzBdID09PSBmaXJzdFNldEZvbnRBcmcwICYmXG4gICAgICAgIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVsxXSA9PT0gZmlyc3RTZXRGb250QXJnMVxuICAgICAgKSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlGaXJzdCAtPSA1O1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgKGVuZFRleHQsIGJlZ2luVGV4dCwgc2V0Rm9udCkgdHJpb3MuXG4gICAgICB2YXIgaUVuZFRleHQgPSBpRmlyc3QgKyA0O1xuICAgICAgZm9yICh2YXIgcSA9IDE7IHEgPCBjb3VudDsgcSsrKSB7XG4gICAgICAgIGZuQXJyYXkuc3BsaWNlKGlFbmRUZXh0LCAzKTtcbiAgICAgICAgYXJnc0FycmF5LnNwbGljZShpRW5kVGV4dCwgMyk7XG4gICAgICAgIGlFbmRUZXh0ICs9IDI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpRW5kVGV4dCArIDE7XG4gICAgfVxuICApO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUXVldWVPcHRpbWl6ZXIocXVldWUpIHtcbiAgICB0aGlzLnF1ZXVlID0gcXVldWU7XG4gICAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgaUN1cnI6IDAsXG4gICAgICBmbkFycmF5OiBxdWV1ZS5mbkFycmF5LFxuICAgICAgYXJnc0FycmF5OiBxdWV1ZS5hcmdzQXJyYXksXG4gICAgfTtcbiAgICB0aGlzLm1hdGNoID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSAwO1xuICB9XG5cbiAgUXVldWVPcHRpbWl6ZXIucHJvdG90eXBlID0ge1xuICAgIF9vcHRpbWl6ZSgpIHtcbiAgICAgIC8vIFByb2Nlc3MgbmV3IGZuQXJyYXkgaXRlbShzKSBjaHVuay5cbiAgICAgIGNvbnN0IGZuQXJyYXkgPSB0aGlzLnF1ZXVlLmZuQXJyYXk7XG4gICAgICBsZXQgaSA9IHRoaXMubGFzdFByb2Nlc3NlZCxcbiAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDtcbiAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICBsZXQgbWF0Y2ggPSB0aGlzLm1hdGNoO1xuICAgICAgaWYgKCFzdGF0ZSAmJiAhbWF0Y2ggJiYgaSArIDEgPT09IGlpICYmICFJbml0aWFsU3RhdGVbZm5BcnJheVtpXV0pIHtcbiAgICAgICAgLy8gTWljcm8tb3B0aW1pemF0aW9uIGZvciB0aGUgY29tbW9uIGNhc2U6IGxhc3QgaXRlbSBpcyBub3RcbiAgICAgICAgLy8gb3B0aW1pemFibGUsIGp1c3Qgc2tpcHBpbmcgaXQuXG4gICAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGlpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICB3aGlsZSAoaSA8IGlpKSB7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIC8vIEFscmVhZHkgZmluZCBhIGJsb2NrIG9mIHBvdGVudGlhbGx5IG9wdGltaXphYmxlIGl0ZW1zLCBpdGVyYXRpbmcuLi5cbiAgICAgICAgICBjb25zdCBpdGVyYXRlID0gKDAsIG1hdGNoLml0ZXJhdGVGbikoY29udGV4dCwgaSk7XG4gICAgICAgICAgaWYgKGl0ZXJhdGUpIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGb3VuZCBsYXN0IGl0ZW1zIGZvciB0aGUgYmxvY2ssIHByb2Nlc3NpbmcuLi5cbiAgICAgICAgICBpID0gKDAsIG1hdGNoLnByb2Nlc3NGbikoY29udGV4dCwgaSArIDEpO1xuICAgICAgICAgIGlpID0gZm5BcnJheS5sZW5ndGg7XG4gICAgICAgICAgbWF0Y2ggPSBudWxsO1xuICAgICAgICAgIHN0YXRlID0gbnVsbDtcbiAgICAgICAgICBpZiAoaSA+PSBpaSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmQgdGhlIHBvdGVudGlhbGx5IG9wdGltaXphYmxlIGl0ZW1zLlxuICAgICAgICBzdGF0ZSA9IChzdGF0ZSB8fCBJbml0aWFsU3RhdGUpW2ZuQXJyYXlbaV1dO1xuICAgICAgICBpZiAoIXN0YXRlIHx8IEFycmF5LmlzQXJyYXkoc3RhdGUpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvdW5kIGEgc3RhcnQgb2YgdGhlIGJsb2NrIGJhc2VkIG9uIGFkZFN0YXRlIHJ1bGVzLlxuICAgICAgICBjb250ZXh0LmlDdXJyID0gaTtcbiAgICAgICAgaSsrO1xuICAgICAgICBpZiAoc3RhdGUuY2hlY2tGbiAmJiAhKDAsIHN0YXRlLmNoZWNrRm4pKGNvbnRleHQpKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgZmFpbGVkLCBjb250aW51ZSBzZWFyY2guLi5cbiAgICAgICAgICBzdGF0ZSA9IG51bGw7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWF0Y2ggPSBzdGF0ZTtcbiAgICAgICAgc3RhdGUgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoO1xuICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gaTtcbiAgICB9LFxuXG4gICAgcHVzaChmbiwgYXJncykge1xuICAgICAgdGhpcy5xdWV1ZS5mbkFycmF5LnB1c2goZm4pO1xuICAgICAgdGhpcy5xdWV1ZS5hcmdzQXJyYXkucHVzaChhcmdzKTtcbiAgICAgIHRoaXMuX29wdGltaXplKCk7XG4gICAgfSxcblxuICAgIGZsdXNoKCkge1xuICAgICAgd2hpbGUgKHRoaXMubWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gKDAsIHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsIGxlbmd0aCk7XG4gICAgICAgIHRoaXMubWF0Y2ggPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgICAgICAgLy8gUmVwZWF0IG9wdGltaXphdGlvbiB1bnRpbCBhbGwgY2h1bmtzIGFyZSBleGhhdXN0ZWQuXG4gICAgICAgIHRoaXMuX29wdGltaXplKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLm1hdGNoID0gbnVsbDtcbiAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIFF1ZXVlT3B0aW1pemVyO1xufSkoKTtcblxudmFyIE51bGxPcHRpbWl6ZXIgPSAoZnVuY3Rpb24gTnVsbE9wdGltaXplckNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gTnVsbE9wdGltaXplcihxdWV1ZSkge1xuICAgIHRoaXMucXVldWUgPSBxdWV1ZTtcbiAgfVxuXG4gIE51bGxPcHRpbWl6ZXIucHJvdG90eXBlID0ge1xuICAgIHB1c2goZm4sIGFyZ3MpIHtcbiAgICAgIHRoaXMucXVldWUuZm5BcnJheS5wdXNoKGZuKTtcbiAgICAgIHRoaXMucXVldWUuYXJnc0FycmF5LnB1c2goYXJncyk7XG4gICAgfSxcblxuICAgIGZsdXNoKCkge30sXG5cbiAgICByZXNldCgpIHt9LFxuICB9O1xuXG4gIHJldHVybiBOdWxsT3B0aW1pemVyO1xufSkoKTtcblxudmFyIE9wZXJhdG9yTGlzdCA9IChmdW5jdGlvbiBPcGVyYXRvckxpc3RDbG9zdXJlKCkge1xuICB2YXIgQ0hVTktfU0laRSA9IDEwMDA7XG4gIHZhciBDSFVOS19TSVpFX0FCT1VUID0gQ0hVTktfU0laRSAtIDU7IC8vIGNsb3NlIHRvIGNodW5rIHNpemVcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE9wZXJhdG9yTGlzdChpbnRlbnQsIHN0cmVhbVNpbmspIHtcbiAgICB0aGlzLl9zdHJlYW1TaW5rID0gc3RyZWFtU2luaztcbiAgICB0aGlzLmZuQXJyYXkgPSBbXTtcbiAgICB0aGlzLmFyZ3NBcnJheSA9IFtdO1xuICAgIGlmIChzdHJlYW1TaW5rICYmIGludGVudCAhPT0gXCJvcGxpc3RcIikge1xuICAgICAgdGhpcy5vcHRpbWl6ZXIgPSBuZXcgUXVldWVPcHRpbWl6ZXIodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW1pemVyID0gbmV3IE51bGxPcHRpbWl6ZXIodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB0aGlzLndlaWdodCA9IDA7XG4gICAgdGhpcy5fcmVzb2x2ZWQgPSBzdHJlYW1TaW5rID8gbnVsbCA6IFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgT3BlcmF0b3JMaXN0LnByb3RvdHlwZSA9IHtcbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJnc0FycmF5Lmxlbmd0aDtcbiAgICB9LFxuXG4gICAgZ2V0IHJlYWR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkIHx8IHRoaXMuX3N0cmVhbVNpbmsucmVhZHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9IFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGVudGlyZSBvcGVyYXRvciBsaXN0LCBzaW5jZVxuICAgICAqICAgICAgICAgICAgICAgIGB0aGlzLmxlbmd0aCA9PT0gMGAgYWZ0ZXIgZmx1c2hpbmcuXG4gICAgICovXG4gICAgZ2V0IHRvdGFsTGVuZ3RoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsTGVuZ3RoICsgdGhpcy5sZW5ndGg7XG4gICAgfSxcblxuICAgIGFkZE9wKGZuLCBhcmdzKSB7XG4gICAgICB0aGlzLm9wdGltaXplci5wdXNoKGZuLCBhcmdzKTtcbiAgICAgIHRoaXMud2VpZ2h0Kys7XG4gICAgICBpZiAodGhpcy5fc3RyZWFtU2luaykge1xuICAgICAgICBpZiAodGhpcy53ZWlnaHQgPj0gQ0hVTktfU0laRSkge1xuICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLndlaWdodCA+PSBDSFVOS19TSVpFX0FCT1VUICYmXG4gICAgICAgICAgKGZuID09PSBPUFMucmVzdG9yZSB8fCBmbiA9PT0gT1BTLmVuZFRleHQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGhldXJpc3RpYyB0byBmbHVzaCBvbiBib3VuZGFyeSBvZiByZXN0b3JlIG9yIGVuZFRleHRcbiAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KSB7XG4gICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgIHRoaXMuYWRkT3AoT1BTLmRlcGVuZGVuY3ksIFtkZXBlbmRlbmN5XSk7XG4gICAgfSxcblxuICAgIGFkZERlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgdGhpcy5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRPcExpc3Qob3BMaXN0KSB7XG4gICAgICBpZiAoIShvcExpc3QgaW5zdGFuY2VvZiBPcGVyYXRvckxpc3QpKSB7XG4gICAgICAgIHdhcm4oJ2FkZE9wTGlzdCAtIGlnbm9yaW5nIGludmFsaWQgXCJvcExpc3RcIiBwYXJhbWV0ZXIuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvcExpc3QuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG9wTGlzdC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkT3Aob3BMaXN0LmZuQXJyYXlbaV0sIG9wTGlzdC5hcmdzQXJyYXlbaV0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRJUigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZuQXJyYXk6IHRoaXMuZm5BcnJheSxcbiAgICAgICAgYXJnc0FycmF5OiB0aGlzLmFyZ3NBcnJheSxcbiAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aCxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGdldCBfdHJhbnNmZXJzKCkge1xuICAgICAgY29uc3QgdHJhbnNmZXJzID0gW107XG4gICAgICBjb25zdCB7IGZuQXJyYXksIGFyZ3NBcnJheSwgbGVuZ3RoIH0gPSB0aGlzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBzd2l0Y2ggKGZuQXJyYXlbaV0pIHtcbiAgICAgICAgICBjYXNlIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdDpcbiAgICAgICAgICBjYXNlIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOlxuICAgICAgICAgIGNhc2UgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDpcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NBcnJheVtpXVswXTsgLy8gZmlyc3QgcGFyYW0gaW4gaW1nRGF0YVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgICBhcmcuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAgICAgICAgICdPcGVyYXRvckxpc3QuX3RyYW5zZmVyczogVW5zdXBwb3J0ZWQgXCJhcmcuZGF0YVwiIHR5cGUuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhcmcuY2FjaGVkKSB7XG4gICAgICAgICAgICAgIHRyYW5zZmVycy5wdXNoKGFyZy5kYXRhLmJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRyYW5zZmVycztcbiAgICB9LFxuXG4gICAgZmx1c2gobGFzdENodW5rID0gZmFsc2UpIHtcbiAgICAgIHRoaXMub3B0aW1pemVyLmZsdXNoKCk7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IGxlbmd0aDtcblxuICAgICAgdGhpcy5fc3RyZWFtU2luay5lbnF1ZXVlKFxuICAgICAgICB7XG4gICAgICAgICAgZm5BcnJheTogdGhpcy5mbkFycmF5LFxuICAgICAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksXG4gICAgICAgICAgbGFzdENodW5rLFxuICAgICAgICAgIGxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgICAgMSxcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJzXG4gICAgICApO1xuXG4gICAgICB0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO1xuICAgICAgdGhpcy5mbkFycmF5Lmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmFyZ3NBcnJheS5sZW5ndGggPSAwO1xuICAgICAgdGhpcy53ZWlnaHQgPSAwO1xuICAgICAgdGhpcy5vcHRpbWl6ZXIucmVzZXQoKTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBPcGVyYXRvckxpc3Q7XG59KSgpO1xuXG5leHBvcnQgeyBPcGVyYXRvckxpc3QgfTtcbiIsIi8qIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgYnl0ZXNUb1N0cmluZywgZXNjYXBlU3RyaW5nIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBEaWN0LCBpc0RpY3QsIGlzTmFtZSwgaXNSZWYsIGlzU3RyZWFtLCBOYW1lIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlTUQ1IH0gZnJvbSBcIi4vY3J5cHRvLmpzXCI7XG5cbmZ1bmN0aW9uIHdyaXRlRGljdChkaWN0LCBidWZmZXIsIHRyYW5zZm9ybSkge1xuICBidWZmZXIucHVzaChcIjw8XCIpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkaWN0LmdldEtleXMoKSkge1xuICAgIGJ1ZmZlci5wdXNoKGAgLyR7a2V5fSBgKTtcbiAgICB3cml0ZVZhbHVlKGRpY3QuZ2V0UmF3KGtleSksIGJ1ZmZlciwgdHJhbnNmb3JtKTtcbiAgfVxuICBidWZmZXIucHVzaChcIj4+XCIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVN0cmVhbShzdHJlYW0sIGJ1ZmZlciwgdHJhbnNmb3JtKSB7XG4gIHdyaXRlRGljdChzdHJlYW0uZGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pO1xuICBidWZmZXIucHVzaChcIiBzdHJlYW1cXG5cIik7XG4gIGxldCBzdHJpbmcgPSBieXRlc1RvU3RyaW5nKHN0cmVhbS5nZXRCeXRlcygpKTtcbiAgaWYgKHRyYW5zZm9ybSAhPT0gbnVsbCkge1xuICAgIHN0cmluZyA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHN0cmluZyk7XG4gIH1cbiAgYnVmZmVyLnB1c2goc3RyaW5nKTtcbiAgYnVmZmVyLnB1c2goXCJcXG5lbmRzdHJlYW1cXG5cIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQXJyYXkoYXJyYXksIGJ1ZmZlciwgdHJhbnNmb3JtKSB7XG4gIGJ1ZmZlci5wdXNoKFwiW1wiKTtcbiAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgZm9yIChjb25zdCB2YWwgb2YgYXJyYXkpIHtcbiAgICBpZiAoIWZpcnN0KSB7XG4gICAgICBidWZmZXIucHVzaChcIiBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHdyaXRlVmFsdWUodmFsLCBidWZmZXIsIHRyYW5zZm9ybSk7XG4gIH1cbiAgYnVmZmVyLnB1c2goXCJdXCIpO1xufVxuXG5mdW5jdGlvbiBudW1iZXJUb1N0cmluZyh2YWx1ZSkge1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGNvbnN0IHJvdW5kZWRWYWx1ZSA9IE1hdGgucm91bmQodmFsdWUgKiAxMDApO1xuICBpZiAocm91bmRlZFZhbHVlICUgMTAwID09PSAwKSB7XG4gICAgcmV0dXJuIChyb3VuZGVkVmFsdWUgLyAxMDApLnRvU3RyaW5nKCk7XG4gIH1cblxuICBpZiAocm91bmRlZFZhbHVlICUgMTAgPT09IDApIHtcbiAgICByZXR1cm4gdmFsdWUudG9GaXhlZCgxKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS50b0ZpeGVkKDIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVZhbHVlKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSkge1xuICBpZiAoaXNOYW1lKHZhbHVlKSkge1xuICAgIGJ1ZmZlci5wdXNoKGAvJHt2YWx1ZS5uYW1lfWApO1xuICB9IGVsc2UgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgIGJ1ZmZlci5wdXNoKGAke3ZhbHVlLm51bX0gJHt2YWx1ZS5nZW59IFJgKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHdyaXRlQXJyYXkodmFsdWUsIGJ1ZmZlciwgdHJhbnNmb3JtKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAodHJhbnNmb3JtICE9PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgYnVmZmVyLnB1c2goYCgke2VzY2FwZVN0cmluZyh2YWx1ZSl9KWApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGJ1ZmZlci5wdXNoKG51bWJlclRvU3RyaW5nKHZhbHVlKSk7XG4gIH0gZWxzZSBpZiAoaXNEaWN0KHZhbHVlKSkge1xuICAgIHdyaXRlRGljdCh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pO1xuICB9IGVsc2UgaWYgKGlzU3RyZWFtKHZhbHVlKSkge1xuICAgIHdyaXRlU3RyZWFtKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVJbnQobnVtYmVyLCBzaXplLCBvZmZzZXQsIGJ1ZmZlcikge1xuICBmb3IgKGxldCBpID0gc2l6ZSArIG9mZnNldCAtIDE7IGkgPiBvZmZzZXQgLSAxOyBpLS0pIHtcbiAgICBidWZmZXJbaV0gPSBudW1iZXIgJiAweGZmO1xuICAgIG51bWJlciA+Pj0gODtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTtcbn1cblxuZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyaW5nLCBvZmZzZXQsIGJ1ZmZlcikge1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmZmVyW29mZnNldCArIGldID0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVNRDUoZmlsZXNpemUsIHhyZWZJbmZvKSB7XG4gIGNvbnN0IHRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgY29uc3QgZmlsZW5hbWUgPSB4cmVmSW5mby5maWxlbmFtZSB8fCBcIlwiO1xuICBjb25zdCBtZDVCdWZmZXIgPSBbdGltZS50b1N0cmluZygpLCBmaWxlbmFtZSwgZmlsZXNpemUudG9TdHJpbmcoKV07XG4gIGxldCBtZDVCdWZmZXJMZW4gPSBtZDVCdWZmZXIucmVkdWNlKChhLCBzdHIpID0+IGEgKyBzdHIubGVuZ3RoLCAwKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKHhyZWZJbmZvLmluZm8pKSB7XG4gICAgbWQ1QnVmZmVyLnB1c2godmFsdWUpO1xuICAgIG1kNUJ1ZmZlckxlbiArPSB2YWx1ZS5sZW5ndGg7XG4gIH1cblxuICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KG1kNUJ1ZmZlckxlbik7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IHN0ciBvZiBtZDVCdWZmZXIpIHtcbiAgICB3cml0ZVN0cmluZyhzdHIsIG9mZnNldCwgYXJyYXkpO1xuICAgIG9mZnNldCArPSBzdHIubGVuZ3RoO1xuICB9XG4gIHJldHVybiBieXRlc1RvU3RyaW5nKGNhbGN1bGF0ZU1ENShhcnJheSkpO1xufVxuXG5mdW5jdGlvbiBpbmNyZW1lbnRhbFVwZGF0ZShvcmlnaW5hbERhdGEsIHhyZWZJbmZvLCBuZXdSZWZzKSB7XG4gIGNvbnN0IG5ld1hyZWYgPSBuZXcgRGljdChudWxsKTtcbiAgY29uc3QgcmVmRm9yWHJlZlRhYmxlID0geHJlZkluZm8ubmV3UmVmO1xuXG4gIGxldCBidWZmZXIsIGJhc2VPZmZzZXQ7XG4gIGNvbnN0IGxhc3RCeXRlID0gb3JpZ2luYWxEYXRhW29yaWdpbmFsRGF0YS5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RCeXRlID09PSAvKiBcXG4gKi8gMHgwYSB8fCBsYXN0Qnl0ZSA9PT0gLyogXFxyICovIDB4MGQpIHtcbiAgICBidWZmZXIgPSBbXTtcbiAgICBiYXNlT2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICAvLyBBdm9pZCB0byBjb25jYXRlbmF0ZSAlJUVPRiB3aXRoIGFuIG9iamVjdCBkZWZpbml0aW9uXG4gICAgYnVmZmVyID0gW1wiXFxuXCJdO1xuICAgIGJhc2VPZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoICsgMTtcbiAgfVxuXG4gIG5ld1hyZWYuc2V0KFwiU2l6ZVwiLCByZWZGb3JYcmVmVGFibGUubnVtICsgMSk7XG4gIG5ld1hyZWYuc2V0KFwiUHJldlwiLCB4cmVmSW5mby5zdGFydFhSZWYpO1xuICBuZXdYcmVmLnNldChcIlR5cGVcIiwgTmFtZS5nZXQoXCJYUmVmXCIpKTtcblxuICBpZiAoeHJlZkluZm8ucm9vdFJlZiAhPT0gbnVsbCkge1xuICAgIG5ld1hyZWYuc2V0KFwiUm9vdFwiLCB4cmVmSW5mby5yb290UmVmKTtcbiAgfVxuICBpZiAoeHJlZkluZm8uaW5mb1JlZiAhPT0gbnVsbCkge1xuICAgIG5ld1hyZWYuc2V0KFwiSW5mb1wiLCB4cmVmSW5mby5pbmZvUmVmKTtcbiAgfVxuICBpZiAoeHJlZkluZm8uZW5jcnlwdCAhPT0gbnVsbCkge1xuICAgIG5ld1hyZWYuc2V0KFwiRW5jcnlwdFwiLCB4cmVmSW5mby5lbmNyeXB0KTtcbiAgfVxuXG4gIC8vIEFkZCBhIHJlZiBmb3IgdGhlIG5ldyB4cmVmIGFuZCBzb3J0IHRoZW1cbiAgbmV3UmVmcy5wdXNoKHsgcmVmOiByZWZGb3JYcmVmVGFibGUsIGRhdGE6IFwiXCIgfSk7XG4gIG5ld1JlZnMgPSBuZXdSZWZzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAvLyBjb21wYXJlIHRoZSByZWZzXG4gICAgcmV0dXJuIGEucmVmLm51bSAtIGIucmVmLm51bTtcbiAgfSk7XG5cbiAgY29uc3QgeHJlZlRhYmxlRGF0YSA9IFtbMCwgMSwgMHhmZmZmXV07XG4gIGNvbnN0IGluZGV4ZXMgPSBbMCwgMV07XG4gIGxldCBtYXhPZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IHsgcmVmLCBkYXRhIH0gb2YgbmV3UmVmcykge1xuICAgIG1heE9mZnNldCA9IE1hdGgubWF4KG1heE9mZnNldCwgYmFzZU9mZnNldCk7XG4gICAgeHJlZlRhYmxlRGF0YS5wdXNoKFsxLCBiYXNlT2Zmc2V0LCBNYXRoLm1pbihyZWYuZ2VuLCAweGZmZmYpXSk7XG4gICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgICBpbmRleGVzLnB1c2gocmVmLm51bSk7XG4gICAgaW5kZXhlcy5wdXNoKDEpO1xuICAgIGJ1ZmZlci5wdXNoKGRhdGEpO1xuICB9XG5cbiAgbmV3WHJlZi5zZXQoXCJJbmRleFwiLCBpbmRleGVzKTtcblxuICBpZiAoeHJlZkluZm8uZmlsZUlkcy5sZW5ndGggIT09IDApIHtcbiAgICBjb25zdCBtZDUgPSBjb21wdXRlTUQ1KGJhc2VPZmZzZXQsIHhyZWZJbmZvKTtcbiAgICBuZXdYcmVmLnNldChcIklEXCIsIFt4cmVmSW5mby5maWxlSWRzWzBdLCBtZDVdKTtcbiAgfVxuXG4gIGNvbnN0IG9mZnNldFNpemUgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKG1heE9mZnNldCkgLyA4KTtcbiAgY29uc3Qgc2l6ZXMgPSBbMSwgb2Zmc2V0U2l6ZSwgMl07XG4gIGNvbnN0IHN0cnVjdFNpemUgPSBzaXplc1swXSArIHNpemVzWzFdICsgc2l6ZXNbMl07XG4gIGNvbnN0IHRhYmxlTGVuZ3RoID0gc3RydWN0U2l6ZSAqIHhyZWZUYWJsZURhdGEubGVuZ3RoO1xuICBuZXdYcmVmLnNldChcIldcIiwgc2l6ZXMpO1xuICBuZXdYcmVmLnNldChcIkxlbmd0aFwiLCB0YWJsZUxlbmd0aCk7XG5cbiAgYnVmZmVyLnB1c2goYCR7cmVmRm9yWHJlZlRhYmxlLm51bX0gJHtyZWZGb3JYcmVmVGFibGUuZ2VufSBvYmpcXG5gKTtcbiAgd3JpdGVEaWN0KG5ld1hyZWYsIGJ1ZmZlciwgbnVsbCk7XG4gIGJ1ZmZlci5wdXNoKFwiIHN0cmVhbVxcblwiKTtcblxuICBjb25zdCBidWZmZXJMZW4gPSBidWZmZXIucmVkdWNlKChhLCBzdHIpID0+IGEgKyBzdHIubGVuZ3RoLCAwKTtcbiAgY29uc3QgZm9vdGVyID0gYFxcbmVuZHN0cmVhbVxcbmVuZG9ialxcbnN0YXJ0eHJlZlxcbiR7YmFzZU9mZnNldH1cXG4lJUVPRlxcbmA7XG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgb3JpZ2luYWxEYXRhLmxlbmd0aCArIGJ1ZmZlckxlbiArIHRhYmxlTGVuZ3RoICsgZm9vdGVyLmxlbmd0aFxuICApO1xuXG4gIC8vIE9yaWdpbmFsIGRhdGFcbiAgYXJyYXkuc2V0KG9yaWdpbmFsRGF0YSk7XG4gIGxldCBvZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoO1xuXG4gIC8vIE5ldyBkYXRhXG4gIGZvciAoY29uc3Qgc3RyIG9mIGJ1ZmZlcikge1xuICAgIHdyaXRlU3RyaW5nKHN0ciwgb2Zmc2V0LCBhcnJheSk7XG4gICAgb2Zmc2V0ICs9IHN0ci5sZW5ndGg7XG4gIH1cblxuICAvLyBOZXcgeHJlZiB0YWJsZVxuICBmb3IgKGNvbnN0IFt0eXBlLCBvYmpPZmZzZXQsIGdlbl0gb2YgeHJlZlRhYmxlRGF0YSkge1xuICAgIG9mZnNldCA9IHdyaXRlSW50KHR5cGUsIHNpemVzWzBdLCBvZmZzZXQsIGFycmF5KTtcbiAgICBvZmZzZXQgPSB3cml0ZUludChvYmpPZmZzZXQsIHNpemVzWzFdLCBvZmZzZXQsIGFycmF5KTtcbiAgICBvZmZzZXQgPSB3cml0ZUludChnZW4sIHNpemVzWzJdLCBvZmZzZXQsIGFycmF5KTtcbiAgfVxuXG4gIC8vIEFkZCB0aGUgZm9vdGVyXG4gIHdyaXRlU3RyaW5nKGZvb3Rlciwgb2Zmc2V0LCBhcnJheSk7XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgeyB3cml0ZURpY3QsIGluY3JlbWVudGFsVXBkYXRlIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQWJvcnRFeGNlcHRpb24sXG4gIGFzc2VydCxcbiAgQ01hcENvbXByZXNzaW9uVHlwZSxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG4gIEZPTlRfSURFTlRJVFlfTUFUUklYLFxuICBGb3JtYXRFcnJvcixcbiAgSURFTlRJVFlfTUFUUklYLFxuICBpbmZvLFxuICBpc0FycmF5RXF1YWwsXG4gIGlzTnVtLFxuICBpc1N0cmluZyxcbiAgT1BTLFxuICBzaGFkb3csXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICBUZXh0UmVuZGVyaW5nTW9kZSxcbiAgVU5TVVBQT1JURURfRkVBVFVSRVMsXG4gIFV0aWwsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgQ01hcEZhY3RvcnksIElkZW50aXR5Q01hcCB9IGZyb20gXCIuL2NtYXAuanNcIjtcbmltcG9ydCB7XG4gIENtZCxcbiAgRGljdCxcbiAgRU9GLFxuICBpc0RpY3QsXG4gIGlzTmFtZSxcbiAgaXNSZWYsXG4gIGlzU3RyZWFtLFxuICBOYW1lLFxuICBSZWYsXG4gIFJlZlNldCxcbn0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHtcbiAgRXJyb3JGb250LFxuICBGb250LFxuICBGb250RmxhZ3MsXG4gIGdldEZvbnRUeXBlLFxuICBJZGVudGl0eVRvVW5pY29kZU1hcCxcbiAgVG9Vbmljb2RlTWFwLFxufSBmcm9tIFwiLi9mb250cy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW5jb2RpbmcsXG4gIE1hY1JvbWFuRW5jb2RpbmcsXG4gIFN0YW5kYXJkRW5jb2RpbmcsXG4gIFN5bWJvbFNldEVuY29kaW5nLFxuICBXaW5BbnNpRW5jb2RpbmcsXG4gIFphcGZEaW5nYmF0c0VuY29kaW5nLFxufSBmcm9tIFwiLi9lbmNvZGluZ3MuanNcIjtcbmltcG9ydCB7IGdldExvb2t1cFRhYmxlRmFjdG9yeSwgTWlzc2luZ0RhdGFFeGNlcHRpb24gfSBmcm9tIFwiLi9jb3JlX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBnZXROb3JtYWxpemVkVW5pY29kZXMsXG4gIGdldFVuaWNvZGVGb3JHbHlwaCxcbiAgcmV2ZXJzZUlmUnRsLFxufSBmcm9tIFwiLi91bmljb2RlLmpzXCI7XG5pbXBvcnQge1xuICBnZXRTZXJpZkZvbnRzLFxuICBnZXRTdGRGb250TWFwLFxuICBnZXRTeW1ib2xzRm9udHMsXG59IGZyb20gXCIuL3N0YW5kYXJkX2ZvbnRzLmpzXCI7XG5pbXBvcnQgeyBnZXRUaWxpbmdQYXR0ZXJuSVIsIFBhdHRlcm4gfSBmcm9tIFwiLi9wYXR0ZXJuLmpzXCI7XG5pbXBvcnQgeyBpc1BERkZ1bmN0aW9uLCBQREZGdW5jdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9mdW5jdGlvbi5qc1wiO1xuaW1wb3J0IHsgTGV4ZXIsIFBhcnNlciB9IGZyb20gXCIuL3BhcnNlci5qc1wiO1xuaW1wb3J0IHtcbiAgTG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIExvY2FsR1N0YXRlQ2FjaGUsXG4gIExvY2FsSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4vaW1hZ2VfdXRpbHMuanNcIjtcbmltcG9ydCB7IGJpZGkgfSBmcm9tIFwiLi9iaWRpLmpzXCI7XG5pbXBvcnQgeyBDb2xvclNwYWNlIH0gZnJvbSBcIi4vY29sb3JzcGFjZS5qc1wiO1xuaW1wb3J0IHsgRGVjb2RlU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBnZXRHbHlwaHNVbmljb2RlIH0gZnJvbSBcIi4vZ2x5cGhsaXN0LmpzXCI7XG5pbXBvcnQgeyBnZXRNZXRyaWNzIH0gZnJvbSBcIi4vbWV0cmljcy5qc1wiO1xuaW1wb3J0IHsgTXVybXVySGFzaDNfNjQgfSBmcm9tIFwiLi9tdXJtdXJoYXNoMy5qc1wiO1xuaW1wb3J0IHsgT3BlcmF0b3JMaXN0IH0gZnJvbSBcIi4vb3BlcmF0b3JfbGlzdC5qc1wiO1xuaW1wb3J0IHsgUERGSW1hZ2UgfSBmcm9tIFwiLi9pbWFnZS5qc1wiO1xuXG5jb25zdCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgbWF4SW1hZ2VTaXplOiAtMSxcbiAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSxcbiAgaWdub3JlRXJyb3JzOiBmYWxzZSxcbiAgaXNFdmFsU3VwcG9ydGVkOiB0cnVlLFxuICBmb250RXh0cmFQcm9wZXJ0aWVzOiBmYWxzZSxcbn0pO1xuXG5jb25zdCBQYXR0ZXJuVHlwZSA9IHtcbiAgVElMSU5HOiAxLFxuICBTSEFESU5HOiAyLFxufTtcblxuY29uc3QgZGVmZXJyZWQgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuLy8gQ29udmVydCBQREYgYmxlbmQgbW9kZSBuYW1lcyB0byBIVE1MNSBibGVuZCBtb2RlIG5hbWVzLlxuZnVuY3Rpb24gbm9ybWFsaXplQmxlbmRNb2RlKHZhbHVlLCBwYXJzaW5nQXJyYXkgPSBmYWxzZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBVc2UgdGhlIGZpcnN0ICpzdXBwb3J0ZWQqIEJNIHZhbHVlIGluIHRoZSBBcnJheSAoZml4ZXMgaXNzdWUxMTI3OS5wZGYpLlxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IG1heWJlQk0gPSBub3JtYWxpemVCbGVuZE1vZGUodmFsdWVbaV0sIC8qIHBhcnNpbmdBcnJheSA9ICovIHRydWUpO1xuICAgICAgaWYgKG1heWJlQk0pIHtcbiAgICAgICAgcmV0dXJuIG1heWJlQk07XG4gICAgICB9XG4gICAgfVxuICAgIHdhcm4oYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGUgQXJyYXk6ICR7dmFsdWV9YCk7XG4gICAgcmV0dXJuIFwic291cmNlLW92ZXJcIjtcbiAgfVxuXG4gIGlmICghaXNOYW1lKHZhbHVlKSkge1xuICAgIGlmIChwYXJzaW5nQXJyYXkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gXCJzb3VyY2Utb3ZlclwiO1xuICB9XG4gIHN3aXRjaCAodmFsdWUubmFtZSkge1xuICAgIGNhc2UgXCJOb3JtYWxcIjpcbiAgICBjYXNlIFwiQ29tcGF0aWJsZVwiOlxuICAgICAgcmV0dXJuIFwic291cmNlLW92ZXJcIjtcbiAgICBjYXNlIFwiTXVsdGlwbHlcIjpcbiAgICAgIHJldHVybiBcIm11bHRpcGx5XCI7XG4gICAgY2FzZSBcIlNjcmVlblwiOlxuICAgICAgcmV0dXJuIFwic2NyZWVuXCI7XG4gICAgY2FzZSBcIk92ZXJsYXlcIjpcbiAgICAgIHJldHVybiBcIm92ZXJsYXlcIjtcbiAgICBjYXNlIFwiRGFya2VuXCI6XG4gICAgICByZXR1cm4gXCJkYXJrZW5cIjtcbiAgICBjYXNlIFwiTGlnaHRlblwiOlxuICAgICAgcmV0dXJuIFwibGlnaHRlblwiO1xuICAgIGNhc2UgXCJDb2xvckRvZGdlXCI6XG4gICAgICByZXR1cm4gXCJjb2xvci1kb2RnZVwiO1xuICAgIGNhc2UgXCJDb2xvckJ1cm5cIjpcbiAgICAgIHJldHVybiBcImNvbG9yLWJ1cm5cIjtcbiAgICBjYXNlIFwiSGFyZExpZ2h0XCI6XG4gICAgICByZXR1cm4gXCJoYXJkLWxpZ2h0XCI7XG4gICAgY2FzZSBcIlNvZnRMaWdodFwiOlxuICAgICAgcmV0dXJuIFwic29mdC1saWdodFwiO1xuICAgIGNhc2UgXCJEaWZmZXJlbmNlXCI6XG4gICAgICByZXR1cm4gXCJkaWZmZXJlbmNlXCI7XG4gICAgY2FzZSBcIkV4Y2x1c2lvblwiOlxuICAgICAgcmV0dXJuIFwiZXhjbHVzaW9uXCI7XG4gICAgY2FzZSBcIkh1ZVwiOlxuICAgICAgcmV0dXJuIFwiaHVlXCI7XG4gICAgY2FzZSBcIlNhdHVyYXRpb25cIjpcbiAgICAgIHJldHVybiBcInNhdHVyYXRpb25cIjtcbiAgICBjYXNlIFwiQ29sb3JcIjpcbiAgICAgIHJldHVybiBcImNvbG9yXCI7XG4gICAgY2FzZSBcIkx1bWlub3NpdHlcIjpcbiAgICAgIHJldHVybiBcImx1bWlub3NpdHlcIjtcbiAgfVxuICBpZiAocGFyc2luZ0FycmF5KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgd2FybihgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZTogJHt2YWx1ZS5uYW1lfWApO1xuICByZXR1cm4gXCJzb3VyY2Utb3ZlclwiO1xufVxuXG4vLyBUcnlpbmcgdG8gbWluaW1pemUgRGF0ZS5ub3coKSB1c2FnZSBhbmQgY2hlY2sgZXZlcnkgMTAwIHRpbWUuXG5jbGFzcyBUaW1lU2xvdE1hbmFnZXIge1xuICBzdGF0aWMgZ2V0IFRJTUVfU0xPVF9EVVJBVElPTl9NUygpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiVElNRV9TTE9UX0RVUkFUSU9OX01TXCIsIDIwKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQ0hFQ0tfVElNRV9FVkVSWSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiQ0hFQ0tfVElNRV9FVkVSWVwiLCAxMDApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgY2hlY2soKSB7XG4gICAgaWYgKCsrdGhpcy5jaGVja2VkIDwgVGltZVNsb3RNYW5hZ2VyLkNIRUNLX1RJTUVfRVZFUlkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jaGVja2VkID0gMDtcbiAgICByZXR1cm4gdGhpcy5lbmRUaW1lIDw9IERhdGUubm93KCk7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLmVuZFRpbWUgPSBEYXRlLm5vdygpICsgVGltZVNsb3RNYW5hZ2VyLlRJTUVfU0xPVF9EVVJBVElPTl9NUztcbiAgICB0aGlzLmNoZWNrZWQgPSAwO1xuICB9XG59XG5cbmNsYXNzIFBhcnRpYWxFdmFsdWF0b3Ige1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgeHJlZixcbiAgICBoYW5kbGVyLFxuICAgIHBhZ2VJbmRleCxcbiAgICBpZEZhY3RvcnksXG4gICAgZm9udENhY2hlLFxuICAgIGJ1aWx0SW5DTWFwQ2FjaGUsXG4gICAgZ2xvYmFsSW1hZ2VDYWNoZSxcbiAgICBvcHRpb25zID0gbnVsbCxcbiAgfSkge1xuICAgIHRoaXMueHJlZiA9IHhyZWY7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLmlkRmFjdG9yeSA9IGlkRmFjdG9yeTtcbiAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTtcbiAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBidWlsdEluQ01hcENhY2hlO1xuICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IGdsb2JhbEltYWdlQ2FjaGU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnM7XG4gICAgdGhpcy5wYXJzaW5nVHlwZTNGb250ID0gZmFsc2U7XG5cbiAgICB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQgPSB0aGlzLmZldGNoQnVpbHRJbkNNYXAuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5jZSBGdW5jdGlvbnMgYXJlIG9ubHkgY2FjaGVkIChsb2NhbGx5KSBieSByZWZlcmVuY2UsIHdlIGNhbiBzaGFyZSBvbmVcbiAgICogYFBERkZ1bmN0aW9uRmFjdG9yeWAgaW5zdGFuY2Ugd2l0aGluIHRoaXMgYFBhcnRpYWxFdmFsdWF0b3JgIGluc3RhbmNlLlxuICAgKi9cbiAgZ2V0IF9wZGZGdW5jdGlvbkZhY3RvcnkoKSB7XG4gICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IFBERkZ1bmN0aW9uRmFjdG9yeSh7XG4gICAgICB4cmVmOiB0aGlzLnhyZWYsXG4gICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc0V2YWxTdXBwb3J0ZWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9wZGZGdW5jdGlvbkZhY3RvcnlcIiwgcGRmRnVuY3Rpb25GYWN0b3J5KTtcbiAgfVxuXG4gIGNsb25lKG5ld09wdGlvbnMgPSBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnMpIHtcbiAgICB2YXIgbmV3RXZhbHVhdG9yID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICBuZXdFdmFsdWF0b3Iub3B0aW9ucyA9IG5ld09wdGlvbnM7XG4gICAgcmV0dXJuIG5ld0V2YWx1YXRvcjtcbiAgfVxuXG4gIGhhc0JsZW5kTW9kZXMocmVzb3VyY2VzKSB7XG4gICAgaWYgKCEocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgUmVmU2V0KCk7XG4gICAgaWYgKHJlc291cmNlcy5vYmpJZCkge1xuICAgICAgcHJvY2Vzc2VkLnB1dChyZXNvdXJjZXMub2JqSWQpO1xuICAgIH1cblxuICAgIHZhciBub2RlcyA9IFtyZXNvdXJjZXNdLFxuICAgICAgeHJlZiA9IHRoaXMueHJlZjtcbiAgICB3aGlsZSAobm9kZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7XG4gICAgICAvLyBGaXJzdCBjaGVjayB0aGUgY3VycmVudCByZXNvdXJjZXMgZm9yIGJsZW5kIG1vZGVzLlxuICAgICAgdmFyIGdyYXBoaWNTdGF0ZXMgPSBub2RlLmdldChcIkV4dEdTdGF0ZVwiKTtcbiAgICAgIGlmIChncmFwaGljU3RhdGVzIGluc3RhbmNlb2YgRGljdCkge1xuICAgICAgICBmb3IgKGxldCBncmFwaGljU3RhdGUgb2YgZ3JhcGhpY1N0YXRlcy5nZXRSYXdWYWx1ZXMoKSkge1xuICAgICAgICAgIGlmIChncmFwaGljU3RhdGUgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGdyYXBoaWNTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7IC8vIFRoZSBFeHRHU3RhdGUgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBncmFwaGljU3RhdGUgPSB4cmVmLmZldGNoKGdyYXBoaWNTdGF0ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIEF2b2lkIHBhcnNpbmcgYSBjb3JydXB0IEV4dEdTdGF0ZSBtb3JlIHRoYW4gb25jZS5cbiAgICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dChncmFwaGljU3RhdGUpO1xuXG4gICAgICAgICAgICAgIGluZm8oYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBFeHRHU3RhdGU6IFwiJHtleH1cIi5gKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKGdyYXBoaWNTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGdyYXBoaWNTdGF0ZS5vYmpJZCkge1xuICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dChncmFwaGljU3RhdGUub2JqSWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJtID0gZ3JhcGhpY1N0YXRlLmdldChcIkJNXCIpO1xuICAgICAgICAgIGlmIChibSBpbnN0YW5jZW9mIE5hbWUpIHtcbiAgICAgICAgICAgIGlmIChibS5uYW1lICE9PSBcIk5vcm1hbFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChibSAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkoYm0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm0pIHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lICYmIGVsZW1lbnQubmFtZSAhPT0gXCJOb3JtYWxcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEZXNjZW5kIGludG8gdGhlIFhPYmplY3RzIHRvIGxvb2sgZm9yIG1vcmUgcmVzb3VyY2VzIGFuZCBibGVuZCBtb2Rlcy5cbiAgICAgIHZhciB4T2JqZWN0cyA9IG5vZGUuZ2V0KFwiWE9iamVjdFwiKTtcbiAgICAgIGlmICghKHhPYmplY3RzIGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCB4T2JqZWN0IG9mIHhPYmplY3RzLmdldFJhd1ZhbHVlcygpKSB7XG4gICAgICAgIGlmICh4T2JqZWN0IGluc3RhbmNlb2YgUmVmKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoeE9iamVjdCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSBYT2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLCBhbmQgYnkgYXZvaWRpbmcgYVxuICAgICAgICAgICAgLy8gcmVkdW5kYW50IGB4cmVmLmZldGNoYCB3ZSBjYW4gKnNpZ25pZmljYW50bHkqIHJlZHVjZSB0aGUgbG9hZFxuICAgICAgICAgICAgLy8gdGltZSBmb3IgYmFkbHkgZ2VuZXJhdGVkIFBERiBmaWxlcyAoZml4ZXMgaXNzdWU2OTYxLnBkZikuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHhPYmplY3QgPSB4cmVmLmZldGNoKHhPYmplY3QpO1xuICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF2b2lkIHBhcnNpbmcgYSBjb3JydXB0IFhPYmplY3QgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgICAgICBwcm9jZXNzZWQucHV0KHhPYmplY3QpO1xuXG4gICAgICAgICAgICBpbmZvKGBoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgWE9iamVjdDogXCIke2V4fVwiLmApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNTdHJlYW0oeE9iamVjdCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeE9iamVjdC5kaWN0Lm9iaklkKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4T2JqZWN0LmRpY3Qub2JqSWQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4UmVzb3VyY2VzID0geE9iamVjdC5kaWN0LmdldChcIlJlc291cmNlc1wiKTtcbiAgICAgICAgaWYgKCEoeFJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2tpbmcgb2JqSWQgdG8gZGV0ZWN0IGFuIGluZmluaXRlIGxvb3AuXG4gICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkICYmIHByb2Nlc3NlZC5oYXMoeFJlc291cmNlcy5vYmpJZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGVzLnB1c2goeFJlc291cmNlcyk7XG4gICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4UmVzb3VyY2VzLm9iaklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBmZXRjaEJ1aWx0SW5DTWFwKG5hbWUpIHtcbiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5idWlsdEluQ01hcENhY2hlLmdldChuYW1lKTtcbiAgICBpZiAoY2FjaGVkRGF0YSkge1xuICAgICAgcmV0dXJuIGNhY2hlZERhdGE7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5oYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiRmV0Y2hCdWlsdEluQ01hcFwiLCB7XG4gICAgICBuYW1lLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoeyB2YWx1ZSwgZG9uZSB9KSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgcHVtcCgpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgICAgcHVtcCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKGRhdGEuY29tcHJlc3Npb25UeXBlICE9PSBDTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpIHtcbiAgICAgIC8vIEdpdmVuIHRoZSBzaXplIG9mIHVuY29tcHJlc3NlZCBDTWFwcywgb25seSBjYWNoZSBjb21wcmVzc2VkIG9uZXMuXG4gICAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuc2V0KG5hbWUsIGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRm9ybVhPYmplY3QoXG4gICAgcmVzb3VyY2VzLFxuICAgIHhvYmosXG4gICAgc21hc2ssXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIHRhc2ssXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICkge1xuICAgIHZhciBkaWN0ID0geG9iai5kaWN0O1xuICAgIHZhciBtYXRyaXggPSBkaWN0LmdldEFycmF5KFwiTWF0cml4XCIpO1xuICAgIHZhciBiYm94ID0gZGljdC5nZXRBcnJheShcIkJCb3hcIik7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHtcbiAgICAgIGJib3ggPSBVdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJib3ggPSBudWxsO1xuICAgIH1cbiAgICBsZXQgb3B0aW9uYWxDb250ZW50ID0gbnVsbDtcbiAgICBpZiAoZGljdC5oYXMoXCJPQ1wiKSkge1xuICAgICAgb3B0aW9uYWxDb250ZW50ID0gYXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhcbiAgICAgICAgZGljdC5nZXQoXCJPQ1wiKSxcbiAgICAgICAgcmVzb3VyY2VzXG4gICAgICApO1xuICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgW1wiT0NcIiwgb3B0aW9uYWxDb250ZW50XSk7XG4gICAgfVxuICAgIHZhciBncm91cCA9IGRpY3QuZ2V0KFwiR3JvdXBcIik7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICB2YXIgZ3JvdXBPcHRpb25zID0ge1xuICAgICAgICBtYXRyaXgsXG4gICAgICAgIGJib3gsXG4gICAgICAgIHNtYXNrLFxuICAgICAgICBpc29sYXRlZDogZmFsc2UsXG4gICAgICAgIGtub2Nrb3V0OiBmYWxzZSxcbiAgICAgIH07XG5cbiAgICAgIHZhciBncm91cFN1YnR5cGUgPSBncm91cC5nZXQoXCJTXCIpO1xuICAgICAgdmFyIGNvbG9yU3BhY2UgPSBudWxsO1xuICAgICAgaWYgKGlzTmFtZShncm91cFN1YnR5cGUsIFwiVHJhbnNwYXJlbmN5XCIpKSB7XG4gICAgICAgIGdyb3VwT3B0aW9ucy5pc29sYXRlZCA9IGdyb3VwLmdldChcIklcIikgfHwgZmFsc2U7XG4gICAgICAgIGdyb3VwT3B0aW9ucy5rbm9ja291dCA9IGdyb3VwLmdldChcIktcIikgfHwgZmFsc2U7XG4gICAgICAgIGlmIChncm91cC5oYXMoXCJDU1wiKSkge1xuICAgICAgICAgIGNvbnN0IGNzID0gZ3JvdXAuZ2V0UmF3KFwiQ1NcIik7XG5cbiAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5nZXRDYWNoZWQoXG4gICAgICAgICAgICBjcyxcbiAgICAgICAgICAgIHRoaXMueHJlZixcbiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkge1xuICAgICAgICAgICAgY29sb3JTcGFjZSA9IGNhY2hlZENvbG9yU3BhY2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBhd2FpdCB0aGlzLnBhcnNlQ29sb3JTcGFjZSh7XG4gICAgICAgICAgICAgIGNzLFxuICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzbWFzayAmJiBzbWFzay5iYWNrZHJvcCkge1xuICAgICAgICBjb2xvclNwYWNlID0gY29sb3JTcGFjZSB8fCBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiO1xuICAgICAgICBzbWFzay5iYWNrZHJvcCA9IGNvbG9yU3BhY2UuZ2V0UmdiKHNtYXNrLmJhY2tkcm9wLCAwKTtcbiAgICAgIH1cblxuICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbkdyb3VwLCBbZ3JvdXBPcHRpb25zXSk7XG4gICAgfVxuXG4gICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW4sIFttYXRyaXgsIGJib3hdKTtcblxuICAgIHJldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7XG4gICAgICBzdHJlYW06IHhvYmosXG4gICAgICB0YXNrLFxuICAgICAgcmVzb3VyY2VzOiBkaWN0LmdldChcIlJlc291cmNlc1wiKSB8fCByZXNvdXJjZXMsXG4gICAgICBvcGVyYXRvckxpc3QsXG4gICAgICBpbml0aWFsU3RhdGUsXG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQsIFtdKTtcblxuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuZW5kR3JvdXAsIFtncm91cE9wdGlvbnNdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbmFsQ29udGVudCkge1xuICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9zZW5kSW1nRGF0YShvYmpJZCwgaW1nRGF0YSwgY2FjaGVHbG9iYWxseSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdHJhbnNmZXJzID0gaW1nRGF0YSA/IFtpbWdEYXRhLmRhdGEuYnVmZmVyXSA6IG51bGw7XG5cbiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250IHx8IGNhY2hlR2xvYmFsbHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZChcbiAgICAgICAgXCJjb21tb25vYmpcIixcbiAgICAgICAgW29iaklkLCBcIkltYWdlXCIsIGltZ0RhdGFdLFxuICAgICAgICB0cmFuc2ZlcnNcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZChcbiAgICAgIFwib2JqXCIsXG4gICAgICBbb2JqSWQsIHRoaXMucGFnZUluZGV4LCBcIkltYWdlXCIsIGltZ0RhdGFdLFxuICAgICAgdHJhbnNmZXJzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3Qoe1xuICAgIHJlc291cmNlcyxcbiAgICBpbWFnZSxcbiAgICBpc0lubGluZSA9IGZhbHNlLFxuICAgIG9wZXJhdG9yTGlzdCxcbiAgICBjYWNoZUtleSxcbiAgICBsb2NhbEltYWdlQ2FjaGUsXG4gICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIH0pIHtcbiAgICB2YXIgZGljdCA9IGltYWdlLmRpY3Q7XG4gICAgY29uc3QgaW1hZ2VSZWYgPSBkaWN0Lm9iaklkO1xuICAgIHZhciB3ID0gZGljdC5nZXQoXCJXaWR0aFwiLCBcIldcIik7XG4gICAgdmFyIGggPSBkaWN0LmdldChcIkhlaWdodFwiLCBcIkhcIik7XG5cbiAgICBpZiAoISh3ICYmIGlzTnVtKHcpKSB8fCAhKGggJiYgaXNOdW0oaCkpKSB7XG4gICAgICB3YXJuKFwiSW1hZ2UgZGltZW5zaW9ucyBhcmUgbWlzc2luZywgb3Igbm90IG51bWJlcnMuXCIpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIG1heEltYWdlU2l6ZSA9IHRoaXMub3B0aW9ucy5tYXhJbWFnZVNpemU7XG4gICAgaWYgKG1heEltYWdlU2l6ZSAhPT0gLTEgJiYgdyAqIGggPiBtYXhJbWFnZVNpemUpIHtcbiAgICAgIHdhcm4oXCJJbWFnZSBleGNlZWRlZCBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBhbmQgd2FzIHJlbW92ZWQuXCIpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgaW1hZ2VNYXNrID0gZGljdC5nZXQoXCJJbWFnZU1hc2tcIiwgXCJJTVwiKSB8fCBmYWxzZTtcbiAgICB2YXIgaW1nRGF0YSwgYXJncztcbiAgICBpZiAoaW1hZ2VNYXNrKSB7XG4gICAgICAvLyBUaGlzIGRlcGVuZHMgb24gYSB0bXBDYW52YXMgYmVpbmcgZmlsbGVkIHdpdGggdGhlXG4gICAgICAvLyBjdXJyZW50IGZpbGxTdHlsZSwgc3VjaCB0aGF0IHByb2Nlc3NpbmcgdGhlIHBpeGVsXG4gICAgICAvLyBkYXRhIGNhbid0IGJlIGRvbmUgaGVyZS4gSW5zdGVhZCBvZiBjcmVhdGluZyBhXG4gICAgICAvLyBjb21wbGV0ZSBQREZJbWFnZSwgb25seSByZWFkIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWRcbiAgICAgIC8vIGZvciBsYXRlci5cblxuICAgICAgdmFyIHdpZHRoID0gZGljdC5nZXQoXCJXaWR0aFwiLCBcIldcIik7XG4gICAgICB2YXIgaGVpZ2h0ID0gZGljdC5nZXQoXCJIZWlnaHRcIiwgXCJIXCIpO1xuICAgICAgdmFyIGJpdFN0cmlkZUxlbmd0aCA9ICh3aWR0aCArIDcpID4+IDM7XG4gICAgICB2YXIgaW1nQXJyYXkgPSBpbWFnZS5nZXRCeXRlcyhcbiAgICAgICAgYml0U3RyaWRlTGVuZ3RoICogaGVpZ2h0LFxuICAgICAgICAvKiBmb3JjZUNsYW1wZWQgPSAqLyB0cnVlXG4gICAgICApO1xuICAgICAgdmFyIGRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoXCJEZWNvZGVcIiwgXCJEXCIpO1xuXG4gICAgICBpbWdEYXRhID0gUERGSW1hZ2UuY3JlYXRlTWFzayh7XG4gICAgICAgIGltZ0FycmF5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbTogaW1hZ2UgaW5zdGFuY2VvZiBEZWNvZGVTdHJlYW0sXG4gICAgICAgIGludmVyc2VEZWNvZGU6ICEhZGVjb2RlICYmIGRlY29kZVswXSA+IDAsXG4gICAgICB9KTtcbiAgICAgIGltZ0RhdGEuY2FjaGVkID0gISFjYWNoZUtleTtcbiAgICAgIGFyZ3MgPSBbaW1nRGF0YV07XG5cbiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBhcmdzKTtcbiAgICAgIGlmIChjYWNoZUtleSkge1xuICAgICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwge1xuICAgICAgICAgIGZuOiBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgc29mdE1hc2sgPSBkaWN0LmdldChcIlNNYXNrXCIsIFwiU01cIikgfHwgZmFsc2U7XG4gICAgdmFyIG1hc2sgPSBkaWN0LmdldChcIk1hc2tcIikgfHwgZmFsc2U7XG5cbiAgICB2YXIgU01BTExfSU1BR0VfRElNRU5TSU9OUyA9IDIwMDtcbiAgICAvLyBJbmxpbmluZyBzbWFsbCBpbWFnZXMgaW50byB0aGUgcXVldWUgYXMgUkdCIGRhdGFcbiAgICBpZiAoaXNJbmxpbmUgJiYgIXNvZnRNYXNrICYmICFtYXNrICYmIHcgKyBoIDwgU01BTExfSU1BR0VfRElNRU5TSU9OUykge1xuICAgICAgY29uc3QgaW1hZ2VPYmogPSBuZXcgUERGSW1hZ2Uoe1xuICAgICAgICB4cmVmOiB0aGlzLnhyZWYsXG4gICAgICAgIHJlczogcmVzb3VyY2VzLFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgaXNJbmxpbmUsXG4gICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgIH0pO1xuICAgICAgLy8gV2UgZm9yY2UgdGhlIHVzZSBvZiBSR0JBXzMyQlBQIGltYWdlcyBoZXJlLCBiZWNhdXNlIHdlIGNhbid0IGhhbmRsZVxuICAgICAgLy8gYW55IG90aGVyIGtpbmQuXG4gICAgICBpbWdEYXRhID0gaW1hZ2VPYmouY3JlYXRlSW1hZ2VEYXRhKC8qIGZvcmNlUkdCQSA9ICovIHRydWUpO1xuICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5wYWludElubGluZUltYWdlWE9iamVjdCwgW2ltZ0RhdGFdKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gaW1hZ2VNYXNrLCBjcmVhdGUgdGhlIFBERkltYWdlIGFuZCBhIGxvdFxuICAgIC8vIG9mIGltYWdlIHByb2Nlc3NpbmcgY2FuIGJlIGRvbmUgaGVyZS5cbiAgICBsZXQgb2JqSWQgPSBgaW1nXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gLFxuICAgICAgY2FjaGVHbG9iYWxseSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCkge1xuICAgICAgb2JqSWQgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV90eXBlM18ke29iaklkfWA7XG4gICAgfSBlbHNlIGlmIChpbWFnZVJlZikge1xuICAgICAgY2FjaGVHbG9iYWxseSA9IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zaG91bGRDYWNoZShcbiAgICAgICAgaW1hZ2VSZWYsXG4gICAgICAgIHRoaXMucGFnZUluZGV4XG4gICAgICApO1xuXG4gICAgICBpZiAoY2FjaGVHbG9iYWxseSkge1xuICAgICAgICBvYmpJZCA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9XyR7b2JqSWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZGVwZW5kZW5jeSBpcyBhZGRlZCBiZWZvcmUgdGhlIGltYWdlIGlzIGRlY29kZWQuXG4gICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kob2JqSWQpO1xuICAgIGFyZ3MgPSBbb2JqSWQsIHcsIGhdO1xuXG4gICAgUERGSW1hZ2UuYnVpbGRJbWFnZSh7XG4gICAgICB4cmVmOiB0aGlzLnhyZWYsXG4gICAgICByZXM6IHJlc291cmNlcyxcbiAgICAgIGltYWdlLFxuICAgICAgaXNJbmxpbmUsXG4gICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgIH0pXG4gICAgICAudGhlbihpbWFnZU9iaiA9PiB7XG4gICAgICAgIGltZ0RhdGEgPSBpbWFnZU9iai5jcmVhdGVJbWFnZURhdGEoLyogZm9yY2VSR0JBID0gKi8gZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgaW1nRGF0YSwgY2FjaGVHbG9iYWxseSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgIHdhcm4oYFVuYWJsZSB0byBkZWNvZGUgaW1hZ2UgXCIke29iaklkfVwiOiBcIiR7cmVhc29ufVwiLmApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgLyogaW1nRGF0YSA9ICovIG51bGwsIGNhY2hlR2xvYmFsbHkpO1xuICAgICAgfSk7XG5cbiAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnBhaW50SW1hZ2VYT2JqZWN0LCBhcmdzKTtcbiAgICBpZiAoY2FjaGVLZXkpIHtcbiAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCB7XG4gICAgICAgIGZuOiBPUFMucGFpbnRJbWFnZVhPYmplY3QsXG4gICAgICAgIGFyZ3MsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGltYWdlUmVmKSB7XG4gICAgICAgIGFzc2VydCghaXNJbmxpbmUsIFwiQ2Fubm90IGNhY2hlIGFuIGlubGluZSBpbWFnZSBnbG9iYWxseS5cIik7XG4gICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRQYWdlSW5kZXgoaW1hZ2VSZWYsIHRoaXMucGFnZUluZGV4KTtcblxuICAgICAgICBpZiAoY2FjaGVHbG9iYWxseSkge1xuICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhKGltYWdlUmVmLCB7XG4gICAgICAgICAgICBvYmpJZCxcbiAgICAgICAgICAgIGZuOiBPUFMucGFpbnRJbWFnZVhPYmplY3QsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBoYW5kbGVTTWFzayhcbiAgICBzbWFzayxcbiAgICByZXNvdXJjZXMsXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIHRhc2ssXG4gICAgc3RhdGVNYW5hZ2VyLFxuICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICkge1xuICAgIHZhciBzbWFza0NvbnRlbnQgPSBzbWFzay5nZXQoXCJHXCIpO1xuICAgIHZhciBzbWFza09wdGlvbnMgPSB7XG4gICAgICBzdWJ0eXBlOiBzbWFzay5nZXQoXCJTXCIpLm5hbWUsXG4gICAgICBiYWNrZHJvcDogc21hc2suZ2V0KFwiQkNcIiksXG4gICAgfTtcblxuICAgIC8vIFRoZSBTTWFzayBtaWdodCBoYXZlIGEgYWxwaGEvbHVtaW5vc2l0eSB2YWx1ZSB0cmFuc2ZlciBmdW5jdGlvbiAtLVxuICAgIC8vIHdlIHdpbGwgYnVpbGQgYSBtYXAgb2YgaW50ZWdlciB2YWx1ZXMgaW4gcmFuZ2UgMC4uMjU1IHRvIGJlIGZhc3QuXG4gICAgdmFyIHRyYW5zZmVyT2JqID0gc21hc2suZ2V0KFwiVFJcIik7XG4gICAgaWYgKGlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7XG4gICAgICBjb25zdCB0cmFuc2ZlckZuID0gdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZSh0cmFuc2Zlck9iaik7XG4gICAgICB2YXIgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICAgICAgdmFyIHRtcCA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIHRtcFswXSA9IGkgLyAyNTU7XG4gICAgICAgIHRyYW5zZmVyRm4odG1wLCAwLCB0bXAsIDApO1xuICAgICAgICB0cmFuc2Zlck1hcFtpXSA9ICh0bXBbMF0gKiAyNTUpIHwgMDtcbiAgICAgIH1cbiAgICAgIHNtYXNrT3B0aW9ucy50cmFuc2Zlck1hcCA9IHRyYW5zZmVyTWFwO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJ1aWxkRm9ybVhPYmplY3QoXG4gICAgICByZXNvdXJjZXMsXG4gICAgICBzbWFza0NvbnRlbnQsXG4gICAgICBzbWFza09wdGlvbnMsXG4gICAgICBvcGVyYXRvckxpc3QsXG4gICAgICB0YXNrLFxuICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCksXG4gICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICk7XG4gIH1cblxuICBoYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKHRyKSB7XG4gICAgbGV0IHRyYW5zZmVyQXJyYXk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHIpKSB7XG4gICAgICB0cmFuc2ZlckFycmF5ID0gdHI7XG4gICAgfSBlbHNlIGlmIChpc1BERkZ1bmN0aW9uKHRyKSkge1xuICAgICAgdHJhbnNmZXJBcnJheSA9IFt0cl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBOb3QgYSB2YWxpZCB0cmFuc2ZlciBmdW5jdGlvbiBlbnRyeS5cbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2Zlck1hcHMgPSBbXTtcbiAgICBsZXQgbnVtRm5zID0gMCxcbiAgICAgIG51bUVmZmVjdGZ1bEZucyA9IDA7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0cmFuc2ZlckFycmF5KSB7XG4gICAgICBjb25zdCB0cmFuc2Zlck9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGVudHJ5KTtcbiAgICAgIG51bUZucysrO1xuXG4gICAgICBpZiAoaXNOYW1lKHRyYW5zZmVyT2JqLCBcIklkZW50aXR5XCIpKSB7XG4gICAgICAgIHRyYW5zZmVyTWFwcy5wdXNoKG51bGwpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBOb3QgYSB2YWxpZCB0cmFuc2ZlciBmdW5jdGlvbiBvYmplY3QuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyRm4gPSB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHRyYW5zZmVyT2JqKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVyTWFwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KSxcbiAgICAgICAgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMjU2OyBqKyspIHtcbiAgICAgICAgdG1wWzBdID0gaiAvIDI1NTtcbiAgICAgICAgdHJhbnNmZXJGbih0bXAsIDAsIHRtcCwgMCk7XG4gICAgICAgIHRyYW5zZmVyTWFwW2pdID0gKHRtcFswXSAqIDI1NSkgfCAwO1xuICAgICAgfVxuICAgICAgdHJhbnNmZXJNYXBzLnB1c2godHJhbnNmZXJNYXApO1xuICAgICAgbnVtRWZmZWN0ZnVsRm5zKys7XG4gICAgfVxuXG4gICAgaWYgKCEobnVtRm5zID09PSAxIHx8IG51bUZucyA9PT0gNCkpIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBPbmx5IDEgb3IgNCBmdW5jdGlvbnMgYXJlIHN1cHBvcnRlZCwgYnkgdGhlIHNwZWNpZmljYXRpb24uXG4gICAgfVxuICAgIGlmIChudW1FZmZlY3RmdWxGbnMgPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBPbmx5IC9JZGVudGl0eSB0cmFuc2ZlciBmdW5jdGlvbnMgZm91bmQsIHdoaWNoIGFyZSBuby1vcHMuXG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zlck1hcHM7XG4gIH1cblxuICBoYW5kbGVUaWxpbmdUeXBlKFxuICAgIGZuLFxuICAgIGFyZ3MsXG4gICAgcmVzb3VyY2VzLFxuICAgIHBhdHRlcm4sXG4gICAgcGF0dGVybkRpY3QsXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIHRhc2tcbiAgKSB7XG4gICAgLy8gQ3JlYXRlIGFuIElSIG9mIHRoZSBwYXR0ZXJuIGNvZGUuXG4gICAgY29uc3QgdGlsaW5nT3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpO1xuICAgIC8vIE1lcmdlIHRoZSBhdmFpbGFibGUgcmVzb3VyY2VzLCB0byBwcmV2ZW50IGlzc3VlcyB3aGVuIHRoZSBwYXR0ZXJuRGljdFxuICAgIC8vIGlzIG1pc3Npbmcgc29tZSAvUmVzb3VyY2VzIGVudHJpZXMgKGZpeGVzIGlzc3VlNjU0MS5wZGYpLlxuICAgIGNvbnN0IHBhdHRlcm5SZXNvdXJjZXMgPSBEaWN0Lm1lcmdlKHtcbiAgICAgIHhyZWY6IHRoaXMueHJlZixcbiAgICAgIGRpY3RBcnJheTogW3BhdHRlcm5EaWN0LmdldChcIlJlc291cmNlc1wiKSwgcmVzb3VyY2VzXSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7XG4gICAgICBzdHJlYW06IHBhdHRlcm4sXG4gICAgICB0YXNrLFxuICAgICAgcmVzb3VyY2VzOiBwYXR0ZXJuUmVzb3VyY2VzLFxuICAgICAgb3BlcmF0b3JMaXN0OiB0aWxpbmdPcExpc3QsXG4gICAgfSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldFRpbGluZ1BhdHRlcm5JUihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmbkFycmF5OiB0aWxpbmdPcExpc3QuZm5BcnJheSxcbiAgICAgICAgICAgIGFyZ3NBcnJheTogdGlsaW5nT3BMaXN0LmFyZ3NBcnJheSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdHRlcm5EaWN0LFxuICAgICAgICAgIGFyZ3NcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihcbiAgICAgICAgZnVuY3Rpb24gKHRpbGluZ1BhdHRlcm5JUikge1xuICAgICAgICAgIC8vIEFkZCB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBwYXJlbnQgb3BlcmF0b3IgbGlzdCBzbyB0aGV5IGFyZVxuICAgICAgICAgIC8vIHJlc29sdmVkIGJlZm9yZSB0aGUgc3ViIG9wZXJhdG9yIGxpc3QgaXMgZXhlY3V0ZWQgc3luY2hyb25vdXNseS5cbiAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRpbGluZ09wTGlzdC5kZXBlbmRlbmNpZXMpO1xuICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgdGlsaW5nUGF0dGVybklSKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgIC8vIEVycm9yKHMpIGluIHRoZSBUaWxpbmdQYXR0ZXJuIC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZVxuICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGFuZCBhbGxvdyByZW5kZXJpbmcgdG8gY29udGludWUuXG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JUaWxpbmdQYXR0ZXJuLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3YXJuKGBoYW5kbGVUaWxpbmdUeXBlIC0gaWdub3JpbmcgcGF0dGVybjogXCIke3JlYXNvbn1cIi5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGZvbnRBcmdzLCBmb250UmVmLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlKSB7XG4gICAgLy8gVE9ETyhtYWNrKTogTm90IG5lZWRlZD9cbiAgICB2YXIgZm9udE5hbWUsXG4gICAgICBmb250U2l6ZSA9IDA7XG4gICAgaWYgKGZvbnRBcmdzKSB7XG4gICAgICBmb250QXJncyA9IGZvbnRBcmdzLnNsaWNlKCk7XG4gICAgICBmb250TmFtZSA9IGZvbnRBcmdzWzBdLm5hbWU7XG4gICAgICBmb250U2l6ZSA9IGZvbnRBcmdzWzFdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxvYWRGb250KGZvbnROYW1lLCBmb250UmVmLCByZXNvdXJjZXMpXG4gICAgICAudGhlbih0cmFuc2xhdGVkID0+IHtcbiAgICAgICAgaWYgKCF0cmFuc2xhdGVkLmZvbnQuaXNUeXBlM0ZvbnQpIHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlZFxuICAgICAgICAgIC5sb2FkVHlwZTNEYXRhKHRoaXMsIHJlc291cmNlcywgdGFzaylcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgcGFyZW50IG9wZXJhdG9yTGlzdCBzbyB0aGV5IGFyZVxuICAgICAgICAgICAgLy8gcmVzb2x2ZWQgYmVmb3JlIFR5cGUzIG9wZXJhdG9yTGlzdHMgYXJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkuXG4gICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRyYW5zbGF0ZWQudHlwZTNEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgICAgLy8gRXJyb3IgaW4gdGhlIGZvbnQgZGF0YSAtLSBzZW5kaW5nIHVuc3VwcG9ydGVkIGZlYXR1cmVcbiAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbi5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKFwiVW5zdXBwb3J0ZWRGZWF0dXJlXCIsIHtcbiAgICAgICAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRMb2FkVHlwZTMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNsYXRlZEZvbnQoe1xuICAgICAgICAgICAgICBsb2FkZWROYW1lOiBcImdfZm9udF9lcnJvclwiLFxuICAgICAgICAgICAgICBmb250OiBuZXcgRXJyb3JGb250KGBUeXBlMyBmb250IGxvYWQgZXJyb3I6ICR7cmVhc29ufWApLFxuICAgICAgICAgICAgICBkaWN0OiB0cmFuc2xhdGVkLmZvbnQsXG4gICAgICAgICAgICAgIGV4dHJhUHJvcGVydGllczogdGhpcy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAudGhlbih0cmFuc2xhdGVkID0+IHtcbiAgICAgICAgc3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDtcbiAgICAgICAgc3RhdGUuZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgc3RhdGUuZm9udE5hbWUgPSBmb250TmFtZTtcbiAgICAgICAgdHJhbnNsYXRlZC5zZW5kKHRoaXMuaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkLmxvYWRlZE5hbWU7XG4gICAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVRleHQoY2hhcnMsIHN0YXRlKSB7XG4gICAgY29uc3QgZm9udCA9IHN0YXRlLmZvbnQ7XG4gICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGNoYXJzKTtcblxuICAgIGlmIChmb250LmRhdGEpIHtcbiAgICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEoXG4gICAgICAgIHN0YXRlLnRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBR1xuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgaXNBZGRUb1BhdGhTZXQgfHxcbiAgICAgICAgc3RhdGUuZmlsbENvbG9yU3BhY2UubmFtZSA9PT0gXCJQYXR0ZXJuXCIgfHxcbiAgICAgICAgZm9udC5kaXNhYmxlRm9udEZhY2UgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FibGVGb250RmFjZVxuICAgICAgKSB7XG4gICAgICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCB0aGlzLmhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2x5cGhzO1xuICB9XG5cbiAgZW5zdXJlU3RhdGVGb250KHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLmZvbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVhc29uID0gbmV3IEZvcm1hdEVycm9yKFxuICAgICAgXCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuXCJcbiAgICApO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgIC8vIE1pc3Npbmcgc2V0Rm9udCBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IgLS0gc2VuZGluZ1xuICAgICAgLy8gdW5zdXBwb3J0ZWQgZmVhdHVyZSBub3RpZmljYXRpb24gYW5kIGFsbG93IHJlbmRlcmluZyB0byBjb250aW51ZS5cbiAgICAgIHRoaXMuaGFuZGxlci5zZW5kKFwiVW5zdXBwb3J0ZWRGZWF0dXJlXCIsIHtcbiAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRTdGF0ZSxcbiAgICAgIH0pO1xuICAgICAgd2FybihgZW5zdXJlU3RhdGVGb250OiBcIiR7cmVhc29ufVwiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyByZWFzb247XG4gIH1cblxuICBhc3luYyBzZXRHU3RhdGUoe1xuICAgIHJlc291cmNlcyxcbiAgICBnU3RhdGUsXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIGNhY2hlS2V5LFxuICAgIHRhc2ssXG4gICAgc3RhdGVNYW5hZ2VyLFxuICAgIGxvY2FsR1N0YXRlQ2FjaGUsXG4gICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gIH0pIHtcbiAgICBjb25zdCBnU3RhdGVSZWYgPSBnU3RhdGUub2JqSWQ7XG4gICAgbGV0IGlzU2ltcGxlR1N0YXRlID0gdHJ1ZTtcbiAgICAvLyBUaGlzIGFycmF5IGhvbGRzIHRoZSBjb252ZXJ0ZWQvcHJvY2Vzc2VkIHN0YXRlIGRhdGEuXG4gICAgdmFyIGdTdGF0ZU9iaiA9IFtdO1xuICAgIHZhciBnU3RhdGVLZXlzID0gZ1N0YXRlLmdldEtleXMoKTtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGdTdGF0ZUtleXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gZ1N0YXRlS2V5c1tpXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ1N0YXRlLmdldChrZXkpO1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcIlR5cGVcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxXXCI6XG4gICAgICAgIGNhc2UgXCJMQ1wiOlxuICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgY2FzZSBcIk1MXCI6XG4gICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgIGNhc2UgXCJSSVwiOlxuICAgICAgICBjYXNlIFwiRkxcIjpcbiAgICAgICAgY2FzZSBcIkNBXCI6XG4gICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGb250XCI6XG4gICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTtcblxuICAgICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU2V0Rm9udChcbiAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICB2YWx1ZVswXSxcbiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGVcbiAgICAgICAgICAgICkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkge1xuICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTtcbiAgICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgW2xvYWRlZE5hbWUsIHZhbHVlWzFdXV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJCTVwiOlxuICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSldKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlNNYXNrXCI6XG4gICAgICAgICAgaWYgKGlzTmFtZSh2YWx1ZSwgXCJOb25lXCIpKSB7XG4gICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBmYWxzZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0RpY3QodmFsdWUpKSB7XG4gICAgICAgICAgICBpc1NpbXBsZUdTdGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU01hc2soXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCxcbiAgICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlcixcbiAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cnVlXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdhcm4oXCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlRSXCI6XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJNYXBzID0gdGhpcy5oYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKHZhbHVlKTtcbiAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cmFuc2Zlck1hcHNdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gT25seSBnZW5lcmF0ZSBpbmZvIGxvZyBtZXNzYWdlcyBmb3IgdGhlIGZvbGxvd2luZyBzaW5jZVxuICAgICAgICAvLyB0aGV5IGFyZSB1bmxpa2VseSB0byBoYXZlIGEgYmlnIGltcGFjdCBvbiB0aGUgcmVuZGVyaW5nLlxuICAgICAgICBjYXNlIFwiT1BcIjpcbiAgICAgICAgY2FzZSBcIm9wXCI6XG4gICAgICAgIGNhc2UgXCJPUE1cIjpcbiAgICAgICAgY2FzZSBcIkJHXCI6XG4gICAgICAgIGNhc2UgXCJCRzJcIjpcbiAgICAgICAgY2FzZSBcIlVDUlwiOlxuICAgICAgICBjYXNlIFwiVUNSMlwiOlxuICAgICAgICBjYXNlIFwiVFIyXCI6XG4gICAgICAgIGNhc2UgXCJIVFwiOlxuICAgICAgICBjYXNlIFwiU01cIjpcbiAgICAgICAgY2FzZSBcIlNBXCI6XG4gICAgICAgIGNhc2UgXCJBSVNcIjpcbiAgICAgICAgY2FzZSBcIlRLXCI6XG4gICAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0b3JzLlxuICAgICAgICAgIGluZm8oXCJncmFwaGljIHN0YXRlIG9wZXJhdG9yIFwiICsga2V5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbmZvKFwiVW5rbm93biBncmFwaGljIHN0YXRlIG9wZXJhdG9yIFwiICsga2V5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ1N0YXRlT2JqLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRHU3RhdGUsIFtnU3RhdGVPYmpdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU2ltcGxlR1N0YXRlKSB7XG4gICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUuc2V0KGNhY2hlS2V5LCBnU3RhdGVSZWYsIGdTdGF0ZU9iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkRm9udChmb250TmFtZSwgZm9udCwgcmVzb3VyY2VzKSB7XG4gICAgY29uc3QgZXJyb3JGb250ID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgbmV3IFRyYW5zbGF0ZWRGb250KHtcbiAgICAgICAgICBsb2FkZWROYW1lOiBcImdfZm9udF9lcnJvclwiLFxuICAgICAgICAgIGZvbnQ6IG5ldyBFcnJvckZvbnQoYEZvbnQgXCIke2ZvbnROYW1lfVwiIGlzIG5vdCBhdmFpbGFibGUuYCksXG4gICAgICAgICAgZGljdDogZm9udCxcbiAgICAgICAgICBleHRyYVByb3BlcnRpZXM6IHRoaXMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgdmFyIGZvbnRSZWYsXG4gICAgICB4cmVmID0gdGhpcy54cmVmO1xuICAgIGlmIChmb250KSB7XG4gICAgICAvLyBMb2FkaW5nIGJ5IHJlZi5cbiAgICAgIGlmICghaXNSZWYoZm9udCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdUaGUgXCJmb250XCIgb2JqZWN0IHNob3VsZCBiZSBhIHJlZmVyZW5jZS4nKTtcbiAgICAgIH1cbiAgICAgIGZvbnRSZWYgPSBmb250O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMb2FkaW5nIGJ5IG5hbWUuXG4gICAgICB2YXIgZm9udFJlcyA9IHJlc291cmNlcy5nZXQoXCJGb250XCIpO1xuICAgICAgaWYgKGZvbnRSZXMpIHtcbiAgICAgICAgZm9udFJlZiA9IGZvbnRSZXMuZ2V0UmF3KGZvbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb250UmVmKSB7XG4gICAgICBjb25zdCBwYXJ0aWFsTXNnID0gYEZvbnQgXCIke1xuICAgICAgICBmb250TmFtZSB8fCAoZm9udCAmJiBmb250LnRvU3RyaW5nKCkpXG4gICAgICB9XCIgaXMgbm90IGF2YWlsYWJsZWA7XG5cbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyAmJiAhdGhpcy5wYXJzaW5nVHlwZTNGb250KSB7XG4gICAgICAgIHdhcm4oYCR7cGFydGlhbE1zZ30uYCk7XG4gICAgICAgIHJldHVybiBlcnJvckZvbnQoKTtcbiAgICAgIH1cbiAgICAgIC8vIEZvbnQgbm90IGZvdW5kIC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZSBub3RpZmljYXRpb24uXG4gICAgICB0aGlzLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250TWlzc2luZyxcbiAgICAgIH0pO1xuICAgICAgd2FybihgJHtwYXJ0aWFsTXNnfSAtLSBhdHRlbXB0aW5nIHRvIGZhbGxiYWNrIHRvIGEgZGVmYXVsdCBmb250LmApO1xuXG4gICAgICAvLyBGYWxsaW5nIGJhY2sgdG8gYSBkZWZhdWx0IGZvbnQgdG8gYXZvaWQgY29tcGxldGVseSBicm9rZW4gcmVuZGVyaW5nLFxuICAgICAgLy8gYnV0IG5vdGUgdGhhdCB0aGVyZSdyZSBubyBndWFyYW50ZWVzIHRoYXQgdGhpbmdzIHdpbGwgbG9vayBcImNvcnJlY3RcIi5cbiAgICAgIGZvbnRSZWYgPSBQYXJ0aWFsRXZhbHVhdG9yLmZhbGxiYWNrRm9udERpY3Q7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9udENhY2hlLmhhcyhmb250UmVmKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250UmVmKTtcbiAgICB9XG5cbiAgICBmb250ID0geHJlZi5mZXRjaElmUmVmKGZvbnRSZWYpO1xuICAgIGlmICghaXNEaWN0KGZvbnQpKSB7XG4gICAgICByZXR1cm4gZXJyb3JGb250KCk7XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIGhvbGRpbmcgYGZvbnQudHJhbnNsYXRlZGAgcmVmZXJlbmNlcyBqdXN0IGZvciBgZm9udFJlZmBzIHRoYXRcbiAgICAvLyBhcmUgbm90IGFjdHVhbGx5IGBSZWZgcywgYnV0IHJhdGhlciBgRGljdGBzLiBTZWUgZXhwbGFuYXRpb24gYmVsb3cuXG4gICAgaWYgKGZvbnQudHJhbnNsYXRlZCkge1xuICAgICAgcmV0dXJuIGZvbnQudHJhbnNsYXRlZDtcbiAgICB9XG5cbiAgICB2YXIgZm9udENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuXG4gICAgdmFyIHByZUV2YWx1YXRlZEZvbnQgPSB0aGlzLnByZUV2YWx1YXRlRm9udChmb250KTtcbiAgICBjb25zdCB7IGRlc2NyaXB0b3IsIGhhc2ggfSA9IHByZUV2YWx1YXRlZEZvbnQ7XG5cbiAgICB2YXIgZm9udFJlZklzUmVmID0gaXNSZWYoZm9udFJlZiksXG4gICAgICBmb250SUQ7XG4gICAgaWYgKGZvbnRSZWZJc1JlZikge1xuICAgICAgZm9udElEID0gYGYke2ZvbnRSZWYudG9TdHJpbmcoKX1gO1xuICAgIH1cblxuICAgIGlmIChoYXNoICYmIGlzRGljdChkZXNjcmlwdG9yKSkge1xuICAgICAgaWYgKCFkZXNjcmlwdG9yLmZvbnRBbGlhc2VzKSB7XG4gICAgICAgIGRlc2NyaXB0b3IuZm9udEFsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgICAgdmFyIGZvbnRBbGlhc2VzID0gZGVzY3JpcHRvci5mb250QWxpYXNlcztcblxuICAgICAgaWYgKGZvbnRBbGlhc2VzW2hhc2hdKSB7XG4gICAgICAgIHZhciBhbGlhc0ZvbnRSZWYgPSBmb250QWxpYXNlc1toYXNoXS5hbGlhc1JlZjtcbiAgICAgICAgaWYgKGZvbnRSZWZJc1JlZiAmJiBhbGlhc0ZvbnRSZWYgJiYgdGhpcy5mb250Q2FjaGUuaGFzKGFsaWFzRm9udFJlZikpIHtcbiAgICAgICAgICB0aGlzLmZvbnRDYWNoZS5wdXRBbGlhcyhmb250UmVmLCBhbGlhc0ZvbnRSZWYpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZvbnRDYWNoZS5nZXQoZm9udFJlZik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvbnRBbGlhc2VzW2hhc2hdID0ge1xuICAgICAgICAgIGZvbnRJRDogdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb250UmVmSXNSZWYpIHtcbiAgICAgICAgZm9udEFsaWFzZXNbaGFzaF0uYWxpYXNSZWYgPSBmb250UmVmO1xuICAgICAgfVxuICAgICAgZm9udElEID0gZm9udEFsaWFzZXNbaGFzaF0uZm9udElEO1xuICAgIH1cblxuICAgIC8vIFdvcmthcm91bmQgZm9yIGJhZCBQREYgZ2VuZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSBmb250cyBpbmNvcnJlY3RseSxcbiAgICAvLyB3aGVyZSBgZm9udFJlZmAgaXMgYSBgRGljdGAgcmF0aGVyIHRoYW4gYSBgUmVmYCAoZml4ZXMgYnVnOTQ2NTA2LnBkZikuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNob3VsZCBub3QgcHV0IHRoZSBmb250IGludG8gYHRoaXMuZm9udENhY2hlYCAod2hpY2ggaXNcbiAgICAvLyBhIGBSZWZTZXRDYWNoZWApLCBzaW5jZSBpdCdzIG5vdCBtZWFuaW5nZnVsIHRvIHVzZSBhIGBEaWN0YCBhcyBhIGtleS5cbiAgICAvL1xuICAgIC8vIEhvd2V2ZXIsIGlmIHdlIGRvbid0IGNhY2hlIHRoZSBmb250IGl0J3Mgbm90IHBvc3NpYmxlIHRvIHJlbW92ZSBpdFxuICAgIC8vIHdoZW4gYGNsZWFudXBgIGlzIHRyaWdnZXJlZCBmcm9tIHRoZSBBUEksIHdoaWNoIGNhdXNlcyBpc3N1ZXMgb25cbiAgICAvLyBzdWJzZXF1ZW50IHJlbmRlcmluZyBvcGVyYXRpb25zIChzZWUgaXNzdWU3NDAzLnBkZikuXG4gICAgLy8gQSBzaW1wbGUgd29ya2Fyb3VuZCB3b3VsZCBiZSB0byBqdXN0IG5vdCBob2xkIGBmb250LnRyYW5zbGF0ZWRgXG4gICAgLy8gcmVmZXJlbmNlcyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdvdWxkIGZvcmNlIHVzIHRvIHVubmVjZXNzYXJpbHkgbG9hZFxuICAgIC8vIHRoZSBzYW1lIGZvbnRzIG92ZXIgYW5kIG92ZXIuXG4gICAgLy9cbiAgICAvLyBJbnN0ZWFkLCB3ZSBjaGVhdCBhIGJpdCBieSBhdHRlbXB0aW5nIHRvIHVzZSBhIG1vZGlmaWVkIGBmb250SURgIGFzIGFcbiAgICAvLyBrZXkgaW4gYHRoaXMuZm9udENhY2hlYCwgdG8gYWxsb3cgdGhlIGZvbnQgdG8gYmUgY2FjaGVkLlxuICAgIC8vIE5PVEU6IFRoaXMgd29ya3MgYmVjYXVzZSBgUmVmU2V0Q2FjaGVgIGNhbGxzIGB0b1N0cmluZygpYCBvbiBwcm92aWRlZFxuICAgIC8vICAgICAgIGtleXMuIEFsc28sIHNpbmNlIGBmb250UmVmYCBpcyB1c2VkIHdoZW4gZ2V0dGluZyBjYWNoZWQgZm9udHMsXG4gICAgLy8gICAgICAgd2UnbGwgbm90IGFjY2lkZW50YWxseSBtYXRjaCBmb250cyBjYWNoZWQgd2l0aCB0aGUgYGZvbnRJRGAuXG4gICAgaWYgKGZvbnRSZWZJc1JlZikge1xuICAgICAgdGhpcy5mb250Q2FjaGUucHV0KGZvbnRSZWYsIGZvbnRDYXBhYmlsaXR5LnByb21pc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWZvbnRJRCkge1xuICAgICAgICBmb250SUQgPSB0aGlzLmlkRmFjdG9yeS5jcmVhdGVGb250SWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9udENhY2hlLnB1dChgaWRfJHtmb250SUR9YCwgZm9udENhcGFiaWxpdHkucHJvbWlzZSk7XG4gICAgfVxuICAgIGFzc2VydChcbiAgICAgIGZvbnRJRCAmJiBmb250SUQuc3RhcnRzV2l0aChcImZcIiksXG4gICAgICAnVGhlIFwiZm9udElEXCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLidcbiAgICApO1xuXG4gICAgLy8gS2VlcCB0cmFjayBvZiBlYWNoIGZvbnQgd2UgdHJhbnNsYXRlZCBzbyB0aGUgY2FsbGVyIGNhblxuICAgIC8vIGxvYWQgdGhlbSBhc3luY2hyb25vdXNseSBiZWZvcmUgY2FsbGluZyBkaXNwbGF5IG9uIGEgcGFnZS5cbiAgICBmb250LmxvYWRlZE5hbWUgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke2ZvbnRJRH1gO1xuXG4gICAgZm9udC50cmFuc2xhdGVkID0gZm9udENhcGFiaWxpdHkucHJvbWlzZTtcblxuICAgIC8vIFRPRE8gbW92ZSBwcm9taXNlcyBpbnRvIHRyYW5zbGF0ZSBmb250XG4gICAgdmFyIHRyYW5zbGF0ZWRQcm9taXNlO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2xhdGVkUHJvbWlzZSA9IHRoaXMudHJhbnNsYXRlRm9udChwcmVFdmFsdWF0ZWRGb250KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0cmFuc2xhdGVkUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cblxuICAgIHRyYW5zbGF0ZWRQcm9taXNlXG4gICAgICAudGhlbih0cmFuc2xhdGVkRm9udCA9PiB7XG4gICAgICAgIGlmICh0cmFuc2xhdGVkRm9udC5mb250VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIHhyZWZGb250U3RhdHMgPSB4cmVmLnN0YXRzLmZvbnRUeXBlcztcbiAgICAgICAgICB4cmVmRm9udFN0YXRzW3RyYW5zbGF0ZWRGb250LmZvbnRUeXBlXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb250Q2FwYWJpbGl0eS5yZXNvbHZlKFxuICAgICAgICAgIG5ldyBUcmFuc2xhdGVkRm9udCh7XG4gICAgICAgICAgICBsb2FkZWROYW1lOiBmb250LmxvYWRlZE5hbWUsXG4gICAgICAgICAgICBmb250OiB0cmFuc2xhdGVkRm9udCxcbiAgICAgICAgICAgIGRpY3Q6IGZvbnQsXG4gICAgICAgICAgICBleHRyYVByb3BlcnRpZXM6IHRoaXMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgIC8vIFRPRE8gZm9udENhcGFiaWxpdHkucmVqZWN0P1xuICAgICAgICAvLyBFcnJvciBpbiB0aGUgZm9udCBkYXRhIC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZSBub3RpZmljYXRpb24uXG4gICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKFwiVW5zdXBwb3J0ZWRGZWF0dXJlXCIsIHtcbiAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udFRyYW5zbGF0ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBlcnJvciwgYnV0IGl0J3Mgc3RpbGwgbmljZSB0byBoYXZlIGZvbnQgdHlwZSByZXBvcnRlZFxuICAgICAgICAgIHZhciBmb250RmlsZTMgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZ2V0KFwiRm9udEZpbGUzXCIpO1xuICAgICAgICAgIHZhciBzdWJ0eXBlID0gZm9udEZpbGUzICYmIGZvbnRGaWxlMy5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgICAgICAgIHZhciBmb250VHlwZSA9IGdldEZvbnRUeXBlKFxuICAgICAgICAgICAgcHJlRXZhbHVhdGVkRm9udC50eXBlLFxuICAgICAgICAgICAgc3VidHlwZSAmJiBzdWJ0eXBlLm5hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIHZhciB4cmVmRm9udFN0YXRzID0geHJlZi5zdGF0cy5mb250VHlwZXM7XG4gICAgICAgICAgeHJlZkZvbnRTdGF0c1tmb250VHlwZV0gPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChleCkge31cblxuICAgICAgICBmb250Q2FwYWJpbGl0eS5yZXNvbHZlKFxuICAgICAgICAgIG5ldyBUcmFuc2xhdGVkRm9udCh7XG4gICAgICAgICAgICBsb2FkZWROYW1lOiBmb250LmxvYWRlZE5hbWUsXG4gICAgICAgICAgICBmb250OiBuZXcgRXJyb3JGb250KFxuICAgICAgICAgICAgICByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbi5tZXNzYWdlIDogcmVhc29uXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGljdDogZm9udCxcbiAgICAgICAgICAgIGV4dHJhUHJvcGVydGllczogdGhpcy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBmb250Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgYnVpbGRQYXRoKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIHBhcnNpbmdUZXh0ID0gZmFsc2UpIHtcbiAgICB2YXIgbGFzdEluZGV4ID0gb3BlcmF0b3JMaXN0Lmxlbmd0aCAtIDE7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICBhcmdzID0gW107XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGxhc3RJbmRleCA8IDAgfHxcbiAgICAgIG9wZXJhdG9yTGlzdC5mbkFycmF5W2xhc3RJbmRleF0gIT09IE9QUy5jb25zdHJ1Y3RQYXRoXG4gICAgKSB7XG4gICAgICAvLyBIYW5kbGUgY29ycnVwdCBQREYgZG9jdW1lbnRzIHRoYXQgY29udGFpbnMgcGF0aCBvcGVyYXRvcnMgaW5zaWRlIG9mXG4gICAgICAvLyB0ZXh0IG9iamVjdHMsIHdoaWNoIG1heSBzaGlmdCBzdWJzZXF1ZW50IHRleHQsIGJ5IGVuY2xvc2luZyB0aGUgcGF0aFxuICAgICAgLy8gb3BlcmF0b3IgaW4gc2F2ZS9yZXN0b3JlIG9wZXJhdG9ycyAoZml4ZXMgaXNzdWUxMDU0Ml9yZWR1Y2VkLnBkZikuXG4gICAgICAvL1xuICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBlZmZlY3RpdmVseSBkaXNhYmxlIHRoZSBvcHRpbWl6YXRpb24gaW4gdGhlXG4gICAgICAvLyBgZWxzZWAgYnJhbmNoIGJlbG93LCBidXQgZ2l2ZW4gdGhhdCB0aGlzIHR5cGUgb2YgY29ycnVwdGlvbiBpc1xuICAgICAgLy8gKmV4dHJlbWVseSogcmFyZSB0aGF0IHNob3VsZG4ndCByZWFsbHkgbWF0dGVyIG11Y2ggaW4gcHJhY3RpY2UuXG4gICAgICBpZiAocGFyc2luZ1RleHQpIHtcbiAgICAgICAgd2FybihgRW5jb3VudGVyZWQgcGF0aCBvcGVyYXRvciBcIiR7Zm59XCIgaW5zaWRlIG9mIGEgdGV4dCBvYmplY3QuYCk7XG4gICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2F2ZSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuY29uc3RydWN0UGF0aCwgW1tmbl0sIGFyZ3NdKTtcblxuICAgICAgaWYgKHBhcnNpbmdUZXh0KSB7XG4gICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucmVzdG9yZSwgbnVsbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvcEFyZ3MgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5W2xhc3RJbmRleF07XG4gICAgICBvcEFyZ3NbMF0ucHVzaChmbik7XG4gICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShvcEFyZ3NbMV0sIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlQ29sb3JTcGFjZSh7IGNzLCByZXNvdXJjZXMsIGxvY2FsQ29sb3JTcGFjZUNhY2hlIH0pIHtcbiAgICByZXR1cm4gQ29sb3JTcGFjZS5wYXJzZUFzeW5jKHtcbiAgICAgIGNzLFxuICAgICAgeHJlZjogdGhpcy54cmVmLFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgLy8gRXJyb3IocykgaW4gdGhlIENvbG9yU3BhY2UgLS0gc2VuZGluZyB1bnN1cHBvcnRlZCBmZWF0dXJlXG4gICAgICAgIC8vIG5vdGlmaWNhdGlvbiBhbmQgYWxsb3cgcmVuZGVyaW5nIHRvIGNvbnRpbnVlLlxuICAgICAgICB0aGlzLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgICAgZmVhdHVyZUlkOiBVTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckNvbG9yU3BhY2UsXG4gICAgICAgIH0pO1xuICAgICAgICB3YXJuKGBwYXJzZUNvbG9yU3BhY2UgLSBpZ25vcmluZyBDb2xvclNwYWNlOiBcIiR7cmVhc29ufVwiLmApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUNvbG9yTihcbiAgICBvcGVyYXRvckxpc3QsXG4gICAgZm4sXG4gICAgYXJncyxcbiAgICBjcyxcbiAgICBwYXR0ZXJucyxcbiAgICByZXNvdXJjZXMsXG4gICAgdGFzayxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICApIHtcbiAgICAvLyBjb21waWxlIHRpbGluZyBwYXR0ZXJuc1xuICAgIHZhciBwYXR0ZXJuTmFtZSA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAvLyBTQ04vc2NuIGFwcGxpZXMgcGF0dGVybnMgYWxvbmcgd2l0aCBub3JtYWwgY29sb3JzXG4gICAgdmFyIHBhdHRlcm47XG4gICAgaWYgKGlzTmFtZShwYXR0ZXJuTmFtZSkgJiYgKHBhdHRlcm4gPSBwYXR0ZXJucy5nZXQocGF0dGVybk5hbWUubmFtZSkpKSB7XG4gICAgICB2YXIgZGljdCA9IGlzU3RyZWFtKHBhdHRlcm4pID8gcGF0dGVybi5kaWN0IDogcGF0dGVybjtcbiAgICAgIHZhciB0eXBlTnVtID0gZGljdC5nZXQoXCJQYXR0ZXJuVHlwZVwiKTtcblxuICAgICAgaWYgKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlRJTElORykge1xuICAgICAgICB2YXIgY29sb3IgPSBjcy5iYXNlID8gY3MuYmFzZS5nZXRSZ2IoYXJncywgMCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVUaWxpbmdUeXBlKFxuICAgICAgICAgIGZuLFxuICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICBwYXR0ZXJuLFxuICAgICAgICAgIGRpY3QsXG4gICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgIHRhc2tcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZU51bSA9PT0gUGF0dGVyblR5cGUuU0hBRElORykge1xuICAgICAgICB2YXIgc2hhZGluZyA9IGRpY3QuZ2V0KFwiU2hhZGluZ1wiKTtcbiAgICAgICAgdmFyIG1hdHJpeCA9IGRpY3QuZ2V0QXJyYXkoXCJNYXRyaXhcIik7XG4gICAgICAgIHBhdHRlcm4gPSBQYXR0ZXJuLnBhcnNlU2hhZGluZyhcbiAgICAgICAgICBzaGFkaW5nLFxuICAgICAgICAgIG1hdHJpeCxcbiAgICAgICAgICB0aGlzLnhyZWYsXG4gICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgIHRoaXMuaGFuZGxlcixcbiAgICAgICAgICB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgICAgICAgKTtcbiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCBwYXR0ZXJuLmdldElSKCkpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbmtub3duIFBhdHRlcm5UeXBlOiAke3R5cGVOdW19YCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuTmFtZTogJHtwYXR0ZXJuTmFtZX1gKTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlTWFya2VkQ29udGVudFByb3BzKGNvbnRlbnRQcm9wZXJ0aWVzLCByZXNvdXJjZXMpIHtcbiAgICBsZXQgb3B0aW9uYWxDb250ZW50O1xuICAgIGlmIChpc05hbWUoY29udGVudFByb3BlcnRpZXMpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gcmVzb3VyY2VzLmdldChcIlByb3BlcnRpZXNcIik7XG4gICAgICBvcHRpb25hbENvbnRlbnQgPSBwcm9wZXJ0aWVzLmdldChjb250ZW50UHJvcGVydGllcy5uYW1lKTtcbiAgICB9IGVsc2UgaWYgKGlzRGljdChjb250ZW50UHJvcGVydGllcykpIHtcbiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGNvbnRlbnRQcm9wZXJ0aWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25hbENvbnRlbnRUeXBlID0gb3B0aW9uYWxDb250ZW50LmdldChcIlR5cGVcIikubmFtZTtcbiAgICBpZiAob3B0aW9uYWxDb250ZW50VHlwZSA9PT0gXCJPQ0dcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSxcbiAgICAgICAgaWQ6IG9wdGlvbmFsQ29udGVudC5vYmpJZCxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSBcIk9DTURcIikge1xuICAgICAgY29uc3Qgb3B0aW9uYWxDb250ZW50R3JvdXBzID0gb3B0aW9uYWxDb250ZW50LmdldChcIk9DR3NcIik7XG4gICAgICBpZiAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSB8fFxuICAgICAgICBpc0RpY3Qob3B0aW9uYWxDb250ZW50R3JvdXBzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwSWRzID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbmFsQ29udGVudEdyb3VwcykpIHtcbiAgICAgICAgICBvcHRpb25hbENvbnRlbnQuZ2V0KFwiT0NHc1wiKS5mb3JFYWNoKG9jZyA9PiB7XG4gICAgICAgICAgICBncm91cElkcy5wdXNoKG9jZy50b1N0cmluZygpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEaWN0aW9uYXJ5LCBqdXN0IHVzZSB0aGUgb2JqIGlkLlxuICAgICAgICAgIGdyb3VwSWRzLnB1c2gob3B0aW9uYWxDb250ZW50R3JvdXBzLm9iaklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBleHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbmFsQ29udGVudC5nZXQoXCJWRVwiKSkge1xuICAgICAgICAgIC8vIFRPRE8gc3VwcG9ydCB2aXNpYmlsaXR5IGV4cHJlc3Npb24uXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsXG4gICAgICAgICAgaWRzOiBncm91cElkcyxcbiAgICAgICAgICBwb2xpY3k6IGlzTmFtZShvcHRpb25hbENvbnRlbnQuZ2V0KFwiUFwiKSlcbiAgICAgICAgICAgID8gb3B0aW9uYWxDb250ZW50LmdldChcIlBcIikubmFtZVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVmKG9wdGlvbmFsQ29udGVudEdyb3VwcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBvcHRpb25hbENvbnRlbnRUeXBlLFxuICAgICAgICAgIGlkOiBvcHRpb25hbENvbnRlbnRHcm91cHMudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRPcGVyYXRvckxpc3Qoe1xuICAgIHN0cmVhbSxcbiAgICB0YXNrLFxuICAgIHJlc291cmNlcyxcbiAgICBvcGVyYXRvckxpc3QsXG4gICAgaW5pdGlhbFN0YXRlID0gbnVsbCxcbiAgfSkge1xuICAgIC8vIEVuc3VyZSB0aGF0IGByZXNvdXJjZXNgL2Bpbml0aWFsU3RhdGVgIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCxcbiAgICAvLyBldmVuIGlmIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIgaXMgZS5nLiBgbnVsbGAuXG4gICAgcmVzb3VyY2VzID0gcmVzb3VyY2VzIHx8IERpY3QuZW1wdHk7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlIHx8IG5ldyBFdmFsU3RhdGUoKTtcblxuICAgIGlmICghb3BlcmF0b3JMaXN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldE9wZXJhdG9yTGlzdDogbWlzc2luZyBcIm9wZXJhdG9yTGlzdFwiIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgeHJlZiA9IHRoaXMueHJlZjtcbiAgICBsZXQgcGFyc2luZ1RleHQgPSBmYWxzZTtcbiAgICBjb25zdCBsb2NhbEltYWdlQ2FjaGUgPSBuZXcgTG9jYWxJbWFnZUNhY2hlKCk7XG4gICAgY29uc3QgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTtcbiAgICBjb25zdCBsb2NhbEdTdGF0ZUNhY2hlID0gbmV3IExvY2FsR1N0YXRlQ2FjaGUoKTtcblxuICAgIHZhciB4b2JqcyA9IHJlc291cmNlcy5nZXQoXCJYT2JqZWN0XCIpIHx8IERpY3QuZW1wdHk7XG4gICAgdmFyIHBhdHRlcm5zID0gcmVzb3VyY2VzLmdldChcIlBhdHRlcm5cIikgfHwgRGljdC5lbXB0eTtcbiAgICB2YXIgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihpbml0aWFsU3RhdGUpO1xuICAgIHZhciBwcmVwcm9jZXNzb3IgPSBuZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKTtcbiAgICB2YXIgdGltZVNsb3RNYW5hZ2VyID0gbmV3IFRpbWVTbG90TWFuYWdlcigpO1xuXG4gICAgZnVuY3Rpb24gY2xvc2VQZW5kaW5nUmVzdG9yZU9QUyhhcmd1bWVudCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcHJlcHJvY2Vzc29yLnNhdmVkU3RhdGVzRGVwdGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucmVzdG9yZSwgW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlQm9keShyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBQcm9taXNlLmFsbChbcHJvbWlzZSwgb3BlcmF0b3JMaXN0LnJlYWR5XSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfTtcbiAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpO1xuICAgICAgdGltZVNsb3RNYW5hZ2VyLnJlc2V0KCk7XG4gICAgICB2YXIgc3RvcCxcbiAgICAgICAgb3BlcmF0aW9uID0ge30sXG4gICAgICAgIGksXG4gICAgICAgIGlpLFxuICAgICAgICBjcyxcbiAgICAgICAgbmFtZTtcbiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHtcbiAgICAgICAgLy8gVGhlIGFyZ3VtZW50cyBwYXJzZWQgYnkgcmVhZCgpIGFyZSB1c2VkIGJleW9uZCB0aGlzIGxvb3AsIHNvIHdlXG4gICAgICAgIC8vIGNhbm5vdCByZXVzZSB0aGUgc2FtZSBhcnJheSBvbiBlYWNoIGl0ZXJhdGlvbi4gVGhlcmVmb3JlIHdlIHBhc3NcbiAgICAgICAgLy8gaW4gfG51bGx8IGFzIHRoZSBpbml0aWFsIHZhbHVlIChzZWUgdGhlIGNvbW1lbnQgb25cbiAgICAgICAgLy8gRXZhbHVhdG9yUHJlcHJvY2Vzc29yX3JlYWQoKSBmb3Igd2h5KS5cbiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBudWxsO1xuICAgICAgICBpZiAoIXByZXByb2Nlc3Nvci5yZWFkKG9wZXJhdGlvbikpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXJncyA9IG9wZXJhdGlvbi5hcmdzO1xuICAgICAgICB2YXIgZm4gPSBvcGVyYXRpb24uZm47XG5cbiAgICAgICAgc3dpdGNoIChmbiB8IDApIHtcbiAgICAgICAgICBjYXNlIE9QUy5wYWludFhPYmplY3Q6XG4gICAgICAgICAgICAvLyBlYWdlcmx5IGNvbXBpbGUgWEZvcm0gb2JqZWN0c1xuICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpO1xuICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkge1xuICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChsb2NhbEltYWdlLmZuLCBsb2NhbEltYWdlLmFyZ3MpO1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5leHQoXG4gICAgICAgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlWE9iamVjdCwgcmVqZWN0WE9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiWE9iamVjdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB4b2JqID0geG9ianMuZ2V0UmF3KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh4b2JqIGluc3RhbmNlb2YgUmVmKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5UmVmKHhvYmopO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGxvY2FsSW1hZ2UuZm4sIGxvY2FsSW1hZ2UuYXJncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWxJbWFnZSA9IHNlbGYuZ2xvYmFsSW1hZ2VDYWNoZS5nZXREYXRhKFxuICAgICAgICAgICAgICAgICAgICB4b2JqLFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZ2VJbmRleFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxJbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShnbG9iYWxJbWFnZS5vYmpJZCk7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChnbG9iYWxJbWFnZS5mbiwgZ2xvYmFsSW1hZ2UuYXJncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzU3RyZWFtKHhvYmopKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJYT2JqZWN0IHNob3VsZCBiZSBhIHN0cmVhbVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0geG9iai5kaWN0LmdldChcIlN1YnR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hbWUodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGVcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUubmFtZSA9PT0gXCJGb3JtXCIpIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zYXZlKCk7XG4gICAgICAgICAgICAgICAgICBzZWxmXG4gICAgICAgICAgICAgICAgICAgIC5idWlsZEZvcm1YT2JqZWN0KFxuICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICB4b2JqLFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgICAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnJlc3RvcmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB9LCByZWplY3RYT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUubmFtZSA9PT0gXCJJbWFnZVwiKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmXG4gICAgICAgICAgICAgICAgICAgIC5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IHhvYmosXG4gICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSBcIlBTXCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFBvc3RTY3JpcHQgWE9iamVjdHMgYXJlIHVudXNlZCB3aGVuIHZpZXdpbmcgZG9jdW1lbnRzLlxuICAgICAgICAgICAgICAgICAgLy8gU2VlIHNlY3Rpb24gNC43LjEgb2YgQWRvYmUncyBQREYgcmVmZXJlbmNlLlxuICAgICAgICAgICAgICAgICAgaW5mbyhcIklnbm9yZWQgWE9iamVjdCBzdWJ0eXBlIFBTXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBVbmhhbmRsZWQgWE9iamVjdCBzdWJ0eXBlICR7dHlwZS5uYW1lfWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVycm9yKHMpIGluIHRoZSBYT2JqZWN0IC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGFuZCBhbGxvdyByZW5kZXJpbmcgdG8gY29udGludWUuXG4gICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JYT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBYT2JqZWN0OiBcIiR7cmVhc29ufVwiLmApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZvbnQ6XG4gICAgICAgICAgICB2YXIgZm9udFNpemUgPSBhcmdzWzFdO1xuICAgICAgICAgICAgLy8gZWFnZXJseSBjb2xsZWN0IGFsbCBmb250c1xuICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgIC5oYW5kbGVTZXRGb250KFxuICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsXG4gICAgICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChsb2FkZWROYW1lKSB7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2V0Rm9udCwgW2xvYWRlZE5hbWUsIGZvbnRTaXplXSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSBPUFMuYmVnaW5UZXh0OlxuICAgICAgICAgICAgcGFyc2luZ1RleHQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuZW5kVGV4dDpcbiAgICAgICAgICAgIHBhcnNpbmdUZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5lbmRJbmxpbmVJbWFnZTpcbiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IGFyZ3NbMF0uY2FjaGVLZXk7XG4gICAgICAgICAgICBpZiAoY2FjaGVLZXkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbG9jYWxJbWFnZSA9IGxvY2FsSW1hZ2VDYWNoZS5nZXRCeU5hbWUoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkge1xuICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChsb2NhbEltYWdlLmZuLCBsb2NhbEltYWdlLmFyZ3MpO1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0KFxuICAgICAgICAgICAgICBzZWxmLmJ1aWxkUGFpbnRJbWFnZVhPYmplY3Qoe1xuICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICBpbWFnZTogYXJnc1swXSxcbiAgICAgICAgICAgICAgICBpc0lubGluZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsXG4gICAgICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLFxuICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICBjYXNlIE9QUy5zaG93VGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXJyID0gYXJnc1swXTtcbiAgICAgICAgICAgIHZhciBjb21iaW5lZEdseXBocyA9IFtdO1xuICAgICAgICAgICAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGU7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgdmFyIGFyckl0ZW0gPSBhcnJbaV07XG4gICAgICAgICAgICAgIGlmIChpc1N0cmluZyhhcnJJdGVtKSkge1xuICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KFxuICAgICAgICAgICAgICAgICAgY29tYmluZWRHbHlwaHMsXG4gICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRleHQoYXJySXRlbSwgc3RhdGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bShhcnJJdGVtKSkge1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkR2x5cGhzLnB1c2goYXJySXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3NbMF0gPSBjb21iaW5lZEdseXBocztcbiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTaG93VGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLm5leHRMaW5lKTtcbiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6XG4gICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7XG4gICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5uZXh0TGluZSk7XG4gICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldFdvcmRTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7XG4gICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldENoYXJTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7XG4gICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7XG4gICAgICAgICAgICBmbiA9IE9QUy5zaG93VGV4dDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOlxuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnRleHRSZW5kZXJpbmdNb2RlID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yU3BhY2U6IHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSBDb2xvclNwYWNlLmdldENhY2hlZChcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkge1xuICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBjYWNoZWRDb2xvclNwYWNlO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgIC5wYXJzZUNvbG9yU3BhY2Uoe1xuICAgICAgICAgICAgICAgICAgY3M6IGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjb2xvclNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY29sb3JTcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBjb2xvclNwYWNlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvclNwYWNlOiB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5nZXRDYWNoZWQoXG4gICAgICAgICAgICAgIGFyZ3NbMF0sXG4gICAgICAgICAgICAgIHhyZWYsXG4gICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHtcbiAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBjYWNoZWRDb2xvclNwYWNlO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgIC5wYXJzZUNvbG9yU3BhY2Uoe1xuICAgICAgICAgICAgICAgICAgY3M6IGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjb2xvclNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY29sb3JTcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvcjpcbiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlO1xuICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNldEZpbGxSR0JDb2xvcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yOlxuICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZTtcbiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7XG4gICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OlxuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7XG4gICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGFyZ3MsIDApO1xuICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlR3JheTpcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7XG4gICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGFyZ3MsIDApO1xuICAgICAgICAgICAgZm4gPSBPUFMuc2V0U3Ryb2tlUkdCQ29sb3I7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ01ZS0NvbG9yOlxuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWs7XG4gICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKGFyZ3MsIDApO1xuICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOlxuICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMuY215aztcbiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoYXJncywgMCk7XG4gICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjpcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7XG4gICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoYXJncywgMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VSR0JDb2xvcjpcbiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjtcbiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihhcmdzLCAwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvck46XG4gICAgICAgICAgICBjcyA9IHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZTtcbiAgICAgICAgICAgIGlmIChjcy5uYW1lID09PSBcIlBhdHRlcm5cIikge1xuICAgICAgICAgICAgICBuZXh0KFxuICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQ29sb3JOKFxuICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LFxuICAgICAgICAgICAgICAgICAgT1BTLnNldEZpbGxDb2xvck4sXG4gICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgY3MsXG4gICAgICAgICAgICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNldEZpbGxSR0JDb2xvcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjpcbiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7XG4gICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gXCJQYXR0ZXJuXCIpIHtcbiAgICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUNvbG9yTihcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCxcbiAgICAgICAgICAgICAgICAgIE9QUy5zZXRTdHJva2VDb2xvck4sXG4gICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgY3MsXG4gICAgICAgICAgICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDpcbiAgICAgICAgICAgIHZhciBzaGFkaW5nUmVzID0gcmVzb3VyY2VzLmdldChcIlNoYWRpbmdcIik7XG4gICAgICAgICAgICBpZiAoIXNoYWRpbmdSZXMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTm8gc2hhZGluZyByZXNvdXJjZSBmb3VuZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNoYWRpbmcgPSBzaGFkaW5nUmVzLmdldChhcmdzWzBdLm5hbWUpO1xuICAgICAgICAgICAgaWYgKCFzaGFkaW5nKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk5vIHNoYWRpbmcgb2JqZWN0IGZvdW5kXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc2hhZGluZ0ZpbGwgPSBQYXR0ZXJuLnBhcnNlU2hhZGluZyhcbiAgICAgICAgICAgICAgc2hhZGluZyxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIsXG4gICAgICAgICAgICAgIHNlbGYuX3BkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgcGF0dGVybklSID0gc2hhZGluZ0ZpbGwuZ2V0SVIoKTtcbiAgICAgICAgICAgIGFyZ3MgPSBbcGF0dGVybklSXTtcbiAgICAgICAgICAgIGZuID0gT1BTLnNoYWRpbmdGaWxsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0R1N0YXRlOlxuICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxvY2FsR1N0YXRlT2JqID0gbG9jYWxHU3RhdGVDYWNoZS5nZXRCeU5hbWUobmFtZSk7XG4gICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iaikge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iai5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldEdTdGF0ZSwgW2xvY2FsR1N0YXRlT2JqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5leHQoXG4gICAgICAgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlR1N0YXRlLCByZWplY3RHU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IHJlc291cmNlcy5nZXQoXCJFeHRHU3RhdGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkV4dEdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBnU3RhdGUgPSBleHRHU3RhdGUuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEF0dGVtcHQgdG8gbG9va3VwIGNhY2hlZCBHU3RhdGVzIGJ5IHJlZmVyZW5jZSBhcyB3ZWxsLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGFyZSBQREYgZG9jdW1lbnRzIHdoZXJlIGRvaW5nIHNvXG4gICAgICAgICAgICAgICAgLy8gICAgICAgd291bGQgc2lnbmlmaWNhbnRseSBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICAgICAgICAgICAgICAgIGlmICghKGdTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgICAgLnNldEdTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgZ1N0YXRlLFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVycm9yKHMpIGluIHRoZSBFeHRHU3RhdGUgLS0gc2VuZGluZyB1bnN1cHBvcnRlZCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gYW5kIGFsbG93IHBhcnNpbmcvcmVuZGVyaW5nIHRvIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRXh0R1N0YXRlLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBFeHRHU3RhdGU6IFwiJHtyZWFzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSBPUFMubW92ZVRvOlxuICAgICAgICAgIGNhc2UgT1BTLmxpbmVUbzpcbiAgICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvOlxuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8yOlxuICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8zOlxuICAgICAgICAgIGNhc2UgT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6XG4gICAgICAgICAgICBzZWxmLmJ1aWxkUGF0aChvcGVyYXRvckxpc3QsIGZuLCBhcmdzLCBwYXJzaW5nVGV4dCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIE9QUy5tYXJrUG9pbnQ6XG4gICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50UHJvcHM6XG4gICAgICAgICAgY2FzZSBPUFMuYmVnaW5Db21wYXQ6XG4gICAgICAgICAgY2FzZSBPUFMuZW5kQ29tcGF0OlxuICAgICAgICAgICAgLy8gSWdub3JlIG9wZXJhdG9ycyB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGVycyBhcmUga25vd24gdG9cbiAgICAgICAgICAgIC8vIGJlIG5vLW9wIGluIENhbnZhc0dyYXBoaWNzIChkaXNwbGF5L2NhbnZhcy5qcykuIFRoaXMgcHJldmVudHNcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YXRpb24gZXJyb3JzIGFuZCBpcyBhbHNvIGEgYml0IG1vcmUgZWZmaWNpZW50LlxuICAgICAgICAgICAgLy8gV2UgY291bGQgYWxzbyB0cnkgdG8gc2VyaWFsaXplIGFsbCBvYmplY3RzIGluIGEgZ2VuZXJhbCB3YXksXG4gICAgICAgICAgICAvLyBlLmcuIGFzIGRvbmUgaW4gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcGRmLmpzL3B1bGwvNjI2NixcbiAgICAgICAgICAgIC8vIGJ1dCBkb2luZyBzbyBpcyBtZWFuaW5nbGVzcyB3aXRob3V0IGtub3dpbmcgdGhlIHNlbWFudGljcy5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzOlxuICAgICAgICAgICAgaWYgKCFpc05hbWUoYXJnc1swXSkpIHtcbiAgICAgICAgICAgICAgd2FybihgRXhwZWN0ZWQgbmFtZSBmb3IgYmVnaW5NYXJrZWRDb250ZW50UHJvcHMgYXJnMD0ke2FyZ3NbMF19YCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZ3NbMF0ubmFtZSA9PT0gXCJPQ1wiKSB7XG4gICAgICAgICAgICAgIG5leHQoXG4gICAgICAgICAgICAgICAgc2VsZlxuICAgICAgICAgICAgICAgICAgLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcylcbiAgICAgICAgICAgICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbXG4gICAgICAgICAgICAgICAgICAgICAgXCJPQ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2VuZChcIlVuc3VwcG9ydGVkRmVhdHVyZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yTWFya2VkQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiBcIiR7cmVhc29ufVwiLmBcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlciBtYXJrZWQgY29udGVudCB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldC5cbiAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1swXS5uYW1lXTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50OlxuICAgICAgICAgIGNhc2UgT1BTLmVuZE1hcmtlZENvbnRlbnQ6XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIE5vdGU6IElnbm9yZSB0aGUgb3BlcmF0b3IgaWYgaXQgaGFzIGBEaWN0YCBhcmd1bWVudHMsIHNpbmNlXG4gICAgICAgICAgICAvLyB0aG9zZSBhcmUgbm9uLXNlcmlhbGl6YWJsZSwgb3RoZXJ3aXNlIHBvc3RNZXNzYWdlIHdpbGwgdGhyb3dcbiAgICAgICAgICAgIC8vIFwiQW4gb2JqZWN0IGNvdWxkIG5vdCBiZSBjbG9uZWQuXCIuXG4gICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldIGluc3RhbmNlb2YgRGljdCkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpIDwgaWkpIHtcbiAgICAgICAgICAgICAgICB3YXJuKFwiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3Jpbmcgb3BlcmF0b3I6IFwiICsgZm4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdG9wKSB7XG4gICAgICAgIG5leHQoZGVmZXJyZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTb21lIFBERnMgZG9uJ3QgY2xvc2UgYWxsIHJlc3RvcmVzIGluc2lkZSBvYmplY3QvZm9ybS5cbiAgICAgIC8vIENsb3NpbmcgdGhvc2UgZm9yIHRoZW0uXG4gICAgICBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICAvLyBFcnJvcihzKSBpbiB0aGUgT3BlcmF0b3JMaXN0IC0tIHNlbmRpbmcgdW5zdXBwb3J0ZWQgZmVhdHVyZVxuICAgICAgICAvLyBub3RpZmljYXRpb24gYW5kIGFsbG93IHJlbmRlcmluZyB0byBjb250aW51ZS5cbiAgICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICAgIGZlYXR1cmVJZDogVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JPcGVyYXRvckxpc3QsXG4gICAgICAgIH0pO1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nIFwiJHt0YXNrLm5hbWV9XCIgYCArXG4gICAgICAgICAgICBgdGFzazogXCIke3JlYXNvbn1cIi5gXG4gICAgICAgICk7XG5cbiAgICAgICAgY2xvc2VQZW5kaW5nUmVzdG9yZU9QUygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG4gIH1cblxuICBnZXRUZXh0Q29udGVudCh7XG4gICAgc3RyZWFtLFxuICAgIHRhc2ssXG4gICAgcmVzb3VyY2VzLFxuICAgIHN0YXRlTWFuYWdlciA9IG51bGwsXG4gICAgbm9ybWFsaXplV2hpdGVzcGFjZSA9IGZhbHNlLFxuICAgIGNvbWJpbmVUZXh0SXRlbXMgPSBmYWxzZSxcbiAgICBzaW5rLFxuICAgIHNlZW5TdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpLFxuICB9KSB7XG4gICAgLy8gRW5zdXJlIHRoYXQgYHJlc291cmNlc2AvYHN0YXRlTWFuYWdlcmAgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkLFxuICAgIC8vIGV2ZW4gaWYgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBpcyBlLmcuIGBudWxsYC5cbiAgICByZXNvdXJjZXMgPSByZXNvdXJjZXMgfHwgRGljdC5lbXB0eTtcbiAgICBzdGF0ZU1hbmFnZXIgPSBzdGF0ZU1hbmFnZXIgfHwgbmV3IFN0YXRlTWFuYWdlcihuZXcgVGV4dFN0YXRlKCkpO1xuXG4gICAgdmFyIFdoaXRlc3BhY2VSZWdleHAgPSAvXFxzL2c7XG5cbiAgICB2YXIgdGV4dENvbnRlbnQgPSB7XG4gICAgICBpdGVtczogW10sXG4gICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgfTtcbiAgICB2YXIgdGV4dENvbnRlbnRJdGVtID0ge1xuICAgICAgaW5pdGlhbGl6ZWQ6IGZhbHNlLFxuICAgICAgc3RyOiBbXSxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgdmVydGljYWw6IGZhbHNlLFxuICAgICAgbGFzdEFkdmFuY2VXaWR0aDogMCxcbiAgICAgIGxhc3RBZHZhbmNlSGVpZ2h0OiAwLFxuICAgICAgdGV4dEFkdmFuY2VTY2FsZTogMCxcbiAgICAgIHNwYWNlV2lkdGg6IDAsXG4gICAgICBmYWtlU3BhY2VNaW46IEluZmluaXR5LFxuICAgICAgZmFrZU11bHRpU3BhY2VNaW46IEluZmluaXR5LFxuICAgICAgZmFrZU11bHRpU3BhY2VNYXg6IC0wLFxuICAgICAgdGV4dFJ1bkJyZWFrQWxsb3dlZDogZmFsc2UsXG4gICAgICB0cmFuc2Zvcm06IG51bGwsXG4gICAgICBmb250TmFtZTogbnVsbCxcbiAgICB9O1xuICAgIHZhciBTUEFDRV9GQUNUT1IgPSAwLjM7XG4gICAgdmFyIE1VTFRJX1NQQUNFX0ZBQ1RPUiA9IDEuNTtcbiAgICB2YXIgTVVMVElfU1BBQ0VfRkFDVE9SX01BWCA9IDQ7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7XG5cbiAgICAvLyBUaGUgeG9iaiBpcyBwYXJzZWQgaWZmIGl0J3MgbmVlZGVkLCBlLmcuIGlmIHRoZXJlIGlzIGEgYERPYCBjbWQuXG4gICAgdmFyIHhvYmpzID0gbnVsbDtcbiAgICBjb25zdCBlbXB0eVhPYmplY3RDYWNoZSA9IG5ldyBMb2NhbEltYWdlQ2FjaGUoKTtcbiAgICBjb25zdCBlbXB0eUdTdGF0ZUNhY2hlID0gbmV3IExvY2FsR1N0YXRlQ2FjaGUoKTtcblxuICAgIHZhciBwcmVwcm9jZXNzb3IgPSBuZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKTtcblxuICAgIHZhciB0ZXh0U3RhdGU7XG5cbiAgICBmdW5jdGlvbiBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKSB7XG4gICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7XG4gICAgICAgIHJldHVybiB0ZXh0Q29udGVudEl0ZW07XG4gICAgICB9XG4gICAgICB2YXIgZm9udCA9IHRleHRTdGF0ZS5mb250O1xuICAgICAgaWYgKCEoZm9udC5sb2FkZWROYW1lIGluIHNlZW5TdHlsZXMpKSB7XG4gICAgICAgIHNlZW5TdHlsZXNbZm9udC5sb2FkZWROYW1lXSA9IHRydWU7XG4gICAgICAgIHRleHRDb250ZW50LnN0eWxlc1tmb250LmxvYWRlZE5hbWVdID0ge1xuICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQuZmFsbGJhY2tOYW1lLFxuICAgICAgICAgIGFzY2VudDogZm9udC5hc2NlbnQsXG4gICAgICAgICAgZGVzY2VudDogZm9udC5kZXNjZW50LFxuICAgICAgICAgIHZlcnRpY2FsOiBmb250LnZlcnRpY2FsLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGV4dENvbnRlbnRJdGVtLmZvbnROYW1lID0gZm9udC5sb2FkZWROYW1lO1xuXG4gICAgICAvLyA5LjQuNCBUZXh0IFNwYWNlIERldGFpbHNcbiAgICAgIHZhciB0c20gPSBbXG4gICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSAqIHRleHRTdGF0ZS50ZXh0SFNjYWxlLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICB0ZXh0U3RhdGUuZm9udFNpemUsXG4gICAgICAgIDAsXG4gICAgICAgIHRleHRTdGF0ZS50ZXh0UmlzZSxcbiAgICAgIF07XG5cbiAgICAgIGlmIChcbiAgICAgICAgZm9udC5pc1R5cGUzRm9udCAmJlxuICAgICAgICB0ZXh0U3RhdGUuZm9udFNpemUgPD0gMSAmJlxuICAgICAgICAhaXNBcnJheUVxdWFsKHRleHRTdGF0ZS5mb250TWF0cml4LCBGT05UX0lERU5USVRZX01BVFJJWClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBnbHlwaEhlaWdodCA9IGZvbnQuYmJveFszXSAtIGZvbnQuYmJveFsxXTtcbiAgICAgICAgaWYgKGdseXBoSGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRzbVszXSAqPSBnbHlwaEhlaWdodCAqIHRleHRTdGF0ZS5mb250TWF0cml4WzNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB0cm0gPSBVdGlsLnRyYW5zZm9ybShcbiAgICAgICAgdGV4dFN0YXRlLmN0bSxcbiAgICAgICAgVXRpbC50cmFuc2Zvcm0odGV4dFN0YXRlLnRleHRNYXRyaXgsIHRzbSlcbiAgICAgICk7XG4gICAgICB0ZXh0Q29udGVudEl0ZW0udHJhbnNmb3JtID0gdHJtO1xuICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IDA7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgPSBNYXRoLnNxcnQodHJtWzJdICogdHJtWzJdICsgdHJtWzNdICogdHJtWzNdKTtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSBNYXRoLnNxcnQodHJtWzBdICogdHJtWzBdICsgdHJtWzFdICogdHJtWzFdKTtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IDA7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBhID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzBdO1xuICAgICAgdmFyIGIgPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMV07XG4gICAgICB2YXIgc2NhbGVMaW5lWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcbiAgICAgIGEgPSB0ZXh0U3RhdGUuY3RtWzBdO1xuICAgICAgYiA9IHRleHRTdGF0ZS5jdG1bMV07XG4gICAgICB2YXIgc2NhbGVDdG1YID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUN0bVggKiBzY2FsZUxpbmVYO1xuICAgICAgdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGggPSAwO1xuICAgICAgdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0ID0gMDtcblxuICAgICAgdmFyIHNwYWNlV2lkdGggPSAoZm9udC5zcGFjZVdpZHRoIC8gMTAwMCkgKiB0ZXh0U3RhdGUuZm9udFNpemU7XG4gICAgICBpZiAoc3BhY2VXaWR0aCkge1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0uc3BhY2VXaWR0aCA9IHNwYWNlV2lkdGg7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS5mYWtlU3BhY2VNaW4gPSBzcGFjZVdpZHRoICogU1BBQ0VfRkFDVE9SO1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNaW4gPSBzcGFjZVdpZHRoICogTVVMVElfU1BBQ0VfRkFDVE9SO1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXggPSBzcGFjZVdpZHRoICogTVVMVElfU1BBQ0VfRkFDVE9SX01BWDtcbiAgICAgICAgLy8gSXQncyBva2F5IGZvciBtb25vc3BhY2UgZm9udHMgdG8gZmFrZSBhcyBtdWNoIHNwYWNlIGFzIG5lZWRlZC5cbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgPSAhZm9udC5pc01vbm9zcGFjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRDb250ZW50SXRlbS5zcGFjZVdpZHRoID0gMDtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VTcGFjZU1pbiA9IEluZmluaXR5O1xuICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNaW4gPSBJbmZpbml0eTtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4ID0gMDtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0ZXh0Q29udGVudEl0ZW07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZVdoaXRlc3BhY2Uoc3RyKSB7XG4gICAgICAvLyBSZXBsYWNlcyBhbGwgd2hpdGVzcGFjZXMgd2l0aCBzdGFuZGFyZCBzcGFjZXMgKDB4MjApLCB0byBhdm9pZFxuICAgICAgLy8gYWxpZ25tZW50IGlzc3VlcyBiZXR3ZWVuIHRoZSB0ZXh0TGF5ZXIgYW5kIHRoZSBjYW52YXMgaWYgdGhlIHRleHRcbiAgICAgIC8vIGNvbnRhaW5zIGUuZy4gdGFicyAoZml4ZXMgaXNzdWU2NjEyLnBkZikuXG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgIGlpID0gc3RyLmxlbmd0aCxcbiAgICAgICAgY29kZTtcbiAgICAgIHdoaWxlIChpIDwgaWkgJiYgKGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKSkgPj0gMHgyMCAmJiBjb2RlIDw9IDB4N2YpIHtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGkgPCBpaSA/IHN0ci5yZXBsYWNlKFdoaXRlc3BhY2VSZWdleHAsIFwiIFwiKSA6IHN0cjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5CaWRpVHJhbnNmb3JtKHRleHRDaHVuaykge1xuICAgICAgdmFyIHN0ciA9IHRleHRDaHVuay5zdHIuam9pbihcIlwiKTtcbiAgICAgIHZhciBiaWRpUmVzdWx0ID0gYmlkaShzdHIsIC0xLCB0ZXh0Q2h1bmsudmVydGljYWwpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyOiBub3JtYWxpemVXaGl0ZXNwYWNlXG4gICAgICAgICAgPyByZXBsYWNlV2hpdGVzcGFjZShiaWRpUmVzdWx0LnN0cilcbiAgICAgICAgICA6IGJpZGlSZXN1bHQuc3RyLFxuICAgICAgICBkaXI6IGJpZGlSZXN1bHQuZGlyLFxuICAgICAgICB3aWR0aDogdGV4dENodW5rLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRleHRDaHVuay5oZWlnaHQsXG4gICAgICAgIHRyYW5zZm9ybTogdGV4dENodW5rLnRyYW5zZm9ybSxcbiAgICAgICAgZm9udE5hbWU6IHRleHRDaHVuay5mb250TmFtZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU2V0Rm9udChmb250TmFtZSwgZm9udFJlZikge1xuICAgICAgcmV0dXJuIHNlbGZcbiAgICAgICAgLmxvYWRGb250KGZvbnROYW1lLCBmb250UmVmLCByZXNvdXJjZXMpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uICh0cmFuc2xhdGVkKSB7XG4gICAgICAgICAgdGV4dFN0YXRlLmZvbnQgPSB0cmFuc2xhdGVkLmZvbnQ7XG4gICAgICAgICAgdGV4dFN0YXRlLmZvbnRNYXRyaXggPVxuICAgICAgICAgICAgdHJhbnNsYXRlZC5mb250LmZvbnRNYXRyaXggfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGNoYXJzKSB7XG4gICAgICB2YXIgZm9udCA9IHRleHRTdGF0ZS5mb250O1xuICAgICAgdmFyIHRleHRDaHVuayA9IGVuc3VyZVRleHRDb250ZW50SXRlbSgpO1xuICAgICAgdmFyIHdpZHRoID0gMDtcbiAgICAgIHZhciBoZWlnaHQgPSAwO1xuICAgICAgdmFyIGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICAgIHZhciBnbHlwaFdpZHRoID0gbnVsbDtcbiAgICAgICAgaWYgKGZvbnQudmVydGljYWwgJiYgZ2x5cGgudm1ldHJpYykge1xuICAgICAgICAgIGdseXBoV2lkdGggPSBnbHlwaC52bWV0cmljWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdseXBoV2lkdGggPSBnbHlwaC53aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBnbHlwaFVuaWNvZGUgPSBnbHlwaC51bmljb2RlO1xuICAgICAgICB2YXIgTm9ybWFsaXplZFVuaWNvZGVzID0gZ2V0Tm9ybWFsaXplZFVuaWNvZGVzKCk7XG4gICAgICAgIGlmIChOb3JtYWxpemVkVW5pY29kZXNbZ2x5cGhVbmljb2RlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ2x5cGhVbmljb2RlID0gTm9ybWFsaXplZFVuaWNvZGVzW2dseXBoVW5pY29kZV07XG4gICAgICAgIH1cbiAgICAgICAgZ2x5cGhVbmljb2RlID0gcmV2ZXJzZUlmUnRsKGdseXBoVW5pY29kZSk7XG5cbiAgICAgICAgdmFyIGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nO1xuICAgICAgICBpZiAoZ2x5cGguaXNTcGFjZSkge1xuICAgICAgICAgIHZhciB3b3JkU3BhY2luZyA9IHRleHRTdGF0ZS53b3JkU3BhY2luZztcbiAgICAgICAgICBjaGFyU3BhY2luZyArPSB3b3JkU3BhY2luZztcbiAgICAgICAgICBpZiAod29yZFNwYWNpbmcgPiAwKSB7XG4gICAgICAgICAgICBhZGRGYWtlU3BhY2VzKHdvcmRTcGFjaW5nLCB0ZXh0Q2h1bmsuc3RyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHggPSAwO1xuICAgICAgICB2YXIgdHkgPSAwO1xuICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHtcbiAgICAgICAgICB2YXIgdzAgPSBnbHlwaFdpZHRoICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF07XG4gICAgICAgICAgdHggPSAodzAgKiB0ZXh0U3RhdGUuZm9udFNpemUgKyBjaGFyU3BhY2luZykgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZTtcbiAgICAgICAgICB3aWR0aCArPSB0eDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdzEgPSBnbHlwaFdpZHRoICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF07XG4gICAgICAgICAgdHkgPSB3MSAqIHRleHRTdGF0ZS5mb250U2l6ZSArIGNoYXJTcGFjaW5nO1xuICAgICAgICAgIGhlaWdodCArPSB0eTtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCh0eCwgdHkpO1xuXG4gICAgICAgIHRleHRDaHVuay5zdHIucHVzaChnbHlwaFVuaWNvZGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZvbnQudmVydGljYWwpIHtcbiAgICAgICAgdGV4dENodW5rLmxhc3RBZHZhbmNlV2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGV4dENodW5rLndpZHRoICs9IHdpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dENodW5rLmxhc3RBZHZhbmNlSGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0ZXh0Q2h1bmsuaGVpZ2h0ICs9IE1hdGguYWJzKGhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZXh0Q2h1bms7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkRmFrZVNwYWNlcyh3aWR0aCwgc3RyQnVmKSB7XG4gICAgICBpZiAod2lkdGggPCB0ZXh0Q29udGVudEl0ZW0uZmFrZVNwYWNlTWluKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh3aWR0aCA8IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1pbikge1xuICAgICAgICBzdHJCdWYucHVzaChcIiBcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBmYWtlU3BhY2VzID0gTWF0aC5yb3VuZCh3aWR0aCAvIHRleHRDb250ZW50SXRlbS5zcGFjZVdpZHRoKTtcbiAgICAgIHdoaWxlIChmYWtlU3BhY2VzLS0gPiAwKSB7XG4gICAgICAgIHN0ckJ1Zi5wdXNoKFwiIFwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmbHVzaFRleHRDb250ZW50SXRlbSgpIHtcbiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRG8gZmluYWwgdGV4dCBzY2FsaW5nLlxuICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICo9IHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCAqPSB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTtcbiAgICAgIH1cbiAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2gocnVuQmlkaVRyYW5zZm9ybSh0ZXh0Q29udGVudEl0ZW0pKTtcblxuICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB0ZXh0Q29udGVudEl0ZW0uc3RyLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZUNodW5rKCkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgc2luay5lbnF1ZXVlKHRleHRDb250ZW50LCBsZW5ndGgpO1xuICAgICAgICB0ZXh0Q29udGVudC5pdGVtcyA9IFtdO1xuICAgICAgICB0ZXh0Q29udGVudC5zdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBjb25zdCBuZXh0ID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgZW5xdWV1ZUNodW5rKCk7XG4gICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBzaW5rLnJlYWR5XSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfTtcbiAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpO1xuICAgICAgdGltZVNsb3RNYW5hZ2VyLnJlc2V0KCk7XG4gICAgICB2YXIgc3RvcCxcbiAgICAgICAgb3BlcmF0aW9uID0ge30sXG4gICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHtcbiAgICAgICAgLy8gVGhlIGFyZ3VtZW50cyBwYXJzZWQgYnkgcmVhZCgpIGFyZSBub3QgdXNlZCBiZXlvbmQgdGhpcyBsb29wLCBzb1xuICAgICAgICAvLyB3ZSBjYW4gcmV1c2UgdGhlIHNhbWUgYXJyYXkgb24gZXZlcnkgaXRlcmF0aW9uLCB0aHVzIGF2b2lkaW5nXG4gICAgICAgIC8vIHVubmVjZXNzYXJ5IGFsbG9jYXRpb25zLlxuICAgICAgICBhcmdzLmxlbmd0aCA9IDA7XG4gICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJncztcbiAgICAgICAgaWYgKCFwcmVwcm9jZXNzb3IucmVhZChvcGVyYXRpb24pKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlO1xuICAgICAgICB2YXIgZm4gPSBvcGVyYXRpb24uZm47XG4gICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJncztcbiAgICAgICAgdmFyIGFkdmFuY2UsIGRpZmY7XG5cbiAgICAgICAgc3dpdGNoIChmbiB8IDApIHtcbiAgICAgICAgICBjYXNlIE9QUy5zZXRGb250OlxuICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIHRvIGlnbm9yZSBtdWx0aXBsZSBpZGVudGljYWwgVGYgY29tbWFuZHMuXG4gICAgICAgICAgICB2YXIgZm9udE5hbWVBcmcgPSBhcmdzWzBdLm5hbWUsXG4gICAgICAgICAgICAgIGZvbnRTaXplQXJnID0gYXJnc1sxXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnQgJiZcbiAgICAgICAgICAgICAgZm9udE5hbWVBcmcgPT09IHRleHRTdGF0ZS5mb250TmFtZSAmJlxuICAgICAgICAgICAgICBmb250U2l6ZUFyZyA9PT0gdGV4dFN0YXRlLmZvbnRTaXplXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUuZm9udE5hbWUgPSBmb250TmFtZUFyZztcbiAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplQXJnO1xuICAgICAgICAgICAgbmV4dChoYW5kbGVTZXRGb250KGZvbnROYW1lQXJnLCBudWxsKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJpc2U6XG4gICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRSaXNlID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldEhTY2FsZTpcbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUudGV4dEhTY2FsZSA9IGFyZ3NbMF0gLyAxMDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zZXRMZWFkaW5nOlxuICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5sZWFkaW5nID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm1vdmVUZXh0OlxuICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIHRvIHRyZWF0IHNhbWUgbGluZSBtb3ZlbWVudCBhcyBhZHZhbmNlXG4gICAgICAgICAgICB2YXIgaXNTYW1lVGV4dExpbmUgPSAhdGV4dFN0YXRlLmZvbnRcbiAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICA6ICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCA/IGFyZ3NbMF0gOiBhcmdzWzFdKSA9PT0gMDtcbiAgICAgICAgICAgIGFkdmFuY2UgPSBhcmdzWzBdIC0gYXJnc1sxXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY29tYmluZVRleHRJdGVtcyAmJlxuICAgICAgICAgICAgICBpc1NhbWVUZXh0TGluZSAmJlxuICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQgJiZcbiAgICAgICAgICAgICAgYWR2YW5jZSA+IDAgJiZcbiAgICAgICAgICAgICAgYWR2YW5jZSA8PSB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCArPVxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aDtcbiAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPVxuICAgICAgICAgICAgICAgIGFyZ3NbMV0gLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VIZWlnaHQ7XG4gICAgICAgICAgICAgIGRpZmYgPVxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gLVxuICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZVdpZHRoIC1cbiAgICAgICAgICAgICAgICAoYXJnc1sxXSAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZUhlaWdodCk7XG4gICAgICAgICAgICAgIGFkZEZha2VTcGFjZXMoZGlmZiwgdGV4dENvbnRlbnRJdGVtLnN0cik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXguc2xpY2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldExlYWRpbmdNb3ZlVGV4dDpcbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUubGVhZGluZyA9IC1hcmdzWzFdO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXguc2xpY2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lOlxuICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dE1hdHJpeDpcbiAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbiB0byB0cmVhdCBzYW1lIGxpbmUgbW92ZW1lbnQgYXMgYWR2YW5jZS5cbiAgICAgICAgICAgIGFkdmFuY2UgPSB0ZXh0U3RhdGUuY2FsY1RleHRMaW5lTWF0cml4QWR2YW5jZShcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgYXJnc1sxXSxcbiAgICAgICAgICAgICAgYXJnc1syXSxcbiAgICAgICAgICAgICAgYXJnc1szXSxcbiAgICAgICAgICAgICAgYXJnc1s0XSxcbiAgICAgICAgICAgICAgYXJnc1s1XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY29tYmluZVRleHRJdGVtcyAmJlxuICAgICAgICAgICAgICBhZHZhbmNlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCAmJlxuICAgICAgICAgICAgICBhZHZhbmNlLnZhbHVlID4gMCAmJlxuICAgICAgICAgICAgICBhZHZhbmNlLnZhbHVlIDw9IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TGluZU1hdHJpeChhZHZhbmNlLndpZHRoLCBhZHZhbmNlLmhlaWdodCk7XG4gICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCArPVxuICAgICAgICAgICAgICAgIGFkdmFuY2Uud2lkdGggLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aDtcbiAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPVxuICAgICAgICAgICAgICAgIGFkdmFuY2UuaGVpZ2h0IC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0O1xuICAgICAgICAgICAgICBkaWZmID1cbiAgICAgICAgICAgICAgICBhZHZhbmNlLndpZHRoIC1cbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aCAtXG4gICAgICAgICAgICAgICAgKGFkdmFuY2UuaGVpZ2h0IC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0KTtcbiAgICAgICAgICAgICAgYWRkRmFrZVNwYWNlcyhkaWZmLCB0ZXh0Q29udGVudEl0ZW0uc3RyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dE1hdHJpeChcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgYXJnc1sxXSxcbiAgICAgICAgICAgICAgYXJnc1syXSxcbiAgICAgICAgICAgICAgYXJnc1szXSxcbiAgICAgICAgICAgICAgYXJnc1s0XSxcbiAgICAgICAgICAgICAgYXJnc1s1XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5zZXRUZXh0TGluZU1hdHJpeChcbiAgICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgICAgYXJnc1sxXSxcbiAgICAgICAgICAgICAgYXJnc1syXSxcbiAgICAgICAgICAgICAgYXJnc1szXSxcbiAgICAgICAgICAgICAgYXJnc1s0XSxcbiAgICAgICAgICAgICAgYXJnc1s1XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJTcGFjaW5nOlxuICAgICAgICAgICAgdGV4dFN0YXRlLmNoYXJTcGFjaW5nID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLnNldFdvcmRTcGFjaW5nOlxuICAgICAgICAgICAgdGV4dFN0YXRlLndvcmRTcGFjaW5nID0gYXJnc1swXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLmJlZ2luVGV4dDpcbiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7XG4gICAgICAgICAgICB0ZXh0U3RhdGUudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpO1xuICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4ID0gSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaXRlbXMgPSBhcmdzWzBdO1xuICAgICAgICAgICAgdmFyIG9mZnNldDtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtc1tqXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGl0ZW1zW2pdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bShpdGVtc1tqXSkpIHtcbiAgICAgICAgICAgICAgICBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKTtcblxuICAgICAgICAgICAgICAgIC8vIFBERiBTcGVjaWZpY2F0aW9uIDUuMy4yIHN0YXRlczpcbiAgICAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIGlzIGV4cHJlc3NlZCBpbiB0aG91c2FuZHRocyBvZiBhIHVuaXQgb2YgdGV4dFxuICAgICAgICAgICAgICAgIC8vIHNwYWNlLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgYW1vdW50IGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgY3VycmVudCBob3Jpem9udGFsIG9yXG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWwgY29vcmRpbmF0ZSwgZGVwZW5kaW5nIG9uIHRoZSB3cml0aW5nIG1vZGUuXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY29vcmRpbmF0ZSBzeXN0ZW0sIGEgcG9zaXRpdmUgYWRqdXN0bWVudFxuICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgZWZmZWN0IG9mIG1vdmluZyB0aGUgbmV4dCBnbHlwaCBwYWludGVkIGVpdGhlciB0b1xuICAgICAgICAgICAgICAgIC8vIHRoZSBsZWZ0IG9yIGRvd24gYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgICAgICAgICAgICBhZHZhbmNlID0gKGl0ZW1zW2pdICogdGV4dFN0YXRlLmZvbnRTaXplKSAvIDEwMDA7XG4gICAgICAgICAgICAgICAgdmFyIGJyZWFrVGV4dFJ1biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYWR2YW5jZTtcbiAgICAgICAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICBicmVha1RleHRSdW4gPVxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0udGV4dFJ1bkJyZWFrQWxsb3dlZCAmJlxuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID4gdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4O1xuICAgICAgICAgICAgICAgICAgaWYgKCFicmVha1RleHRSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVmFsdWUgbmVlZHMgdG8gYmUgYWRkZWQgdG8gaGVpZ2h0IHRvIHBhaW50IGRvd24uXG4gICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgKz0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBhZHZhbmNlID0gLWFkdmFuY2U7XG4gICAgICAgICAgICAgICAgICBvZmZzZXQgPSBhZHZhbmNlICogdGV4dFN0YXRlLnRleHRIU2NhbGU7XG4gICAgICAgICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeChvZmZzZXQsIDApO1xuICAgICAgICAgICAgICAgICAgYnJlYWtUZXh0UnVuID1cbiAgICAgICAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA+IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heDtcbiAgICAgICAgICAgICAgICAgIGlmICghYnJlYWtUZXh0UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIG5lZWRzIHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB3aWR0aCB0byBwYWludCBsZWZ0LlxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnJlYWtUZXh0UnVuKSB7XG4gICAgICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWR2YW5jZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGFkZEZha2VTcGFjZXMoYWR2YW5jZSwgdGV4dENvbnRlbnRJdGVtLnN0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5zaG93VGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbShhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2hvd1RleHQ6XG4gICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7XG4gICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpO1xuICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDpcbiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHtcbiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpO1xuICAgICAgICAgICAgdGV4dFN0YXRlLndvcmRTcGFjaW5nID0gYXJnc1swXTtcbiAgICAgICAgICAgIHRleHRTdGF0ZS5jaGFyU3BhY2luZyA9IGFyZ3NbMV07XG4gICAgICAgICAgICB0ZXh0U3RhdGUuY2FycmlhZ2VSZXR1cm4oKTtcbiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPUFMucGFpbnRYT2JqZWN0OlxuICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgICAgIGlmICgheG9ianMpIHtcbiAgICAgICAgICAgICAgeG9ianMgPSByZXNvdXJjZXMuZ2V0KFwiWE9iamVjdFwiKSB8fCBEaWN0LmVtcHR5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmFtZSA9IGFyZ3NbMF0ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lICYmIGVtcHR5WE9iamVjdENhY2hlLmdldEJ5TmFtZShuYW1lKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV4dChcbiAgICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbXB0eVhPYmplY3RDYWNoZS5nZXRCeVJlZih4b2JqKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHhvYmogPSB4cmVmLmZldGNoKHhvYmopO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghaXNTdHJlYW0oeG9iaikpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4b2JqLmRpY3QuZ2V0KFwiU3VidHlwZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lICE9PSBcIkZvcm1cIikge1xuICAgICAgICAgICAgICAgICAgZW1wdHlYT2JqZWN0Q2FjaGUuc2V0KG5hbWUsIHhvYmouZGljdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGEgbmV3IGBTdGF0ZU1hbmFnZXJgIHRvIHByZXZlbnQgaW5jb3JyZWN0IHBvc2l0aW9uaW5nXG4gICAgICAgICAgICAgICAgLy8gb2YgdGV4dEl0ZW1zICphZnRlciogdGhlIEZvcm0gWE9iamVjdCwgc2luY2UgZXJyb3JzIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIGRhdGEgY2FuIG90aGVyd2lzZSBwcmV2ZW50IGByZXN0b3JlYCBvcGVyYXRvcnMgZnJvbVxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGluZy5cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBPbmx5IGFuIGlzc3VlIHdoZW4gYG9wdGlvbnMuaWdub3JlRXJyb3JzID09PSB0cnVlYC5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2JqU3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihjdXJyZW50U3RhdGUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0cml4ID0geG9iai5kaWN0LmdldEFycmF5KFwiTWF0cml4XCIpO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdHJpeCkgJiYgbWF0cml4Lmxlbmd0aCA9PT0gNikge1xuICAgICAgICAgICAgICAgICAgeE9ialN0YXRlTWFuYWdlci50cmFuc2Zvcm0obWF0cml4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBFbnF1ZXVlIHRoZSBgdGV4dENvbnRlbnRgIGNodW5rIGJlZm9yZSBwYXJzaW5nIHRoZSAvRm9ybVxuICAgICAgICAgICAgICAgIC8vIFhPYmplY3QuXG4gICAgICAgICAgICAgICAgZW5xdWV1ZUNodW5rKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2lua1dyYXBwZXIgPSB7XG4gICAgICAgICAgICAgICAgICBlbnF1ZXVlSW52b2tlZDogZmFsc2UsXG5cbiAgICAgICAgICAgICAgICAgIGVucXVldWUoY2h1bmssIHNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnF1ZXVlSW52b2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShjaHVuaywgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICBnZXQgZGVzaXJlZFNpemUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW5rLmRlc2lyZWRTaXplO1xuICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgZ2V0IHJlYWR5KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHNlbGZcbiAgICAgICAgICAgICAgICAgIC5nZXRUZXh0Q29udGVudCh7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbTogeG9iaixcbiAgICAgICAgICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiB4b2JqLmRpY3QuZ2V0KFwiUmVzb3VyY2VzXCIpIHx8IHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyOiB4T2JqU3RhdGVNYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlLFxuICAgICAgICAgICAgICAgICAgICBjb21iaW5lVGV4dEl0ZW1zLFxuICAgICAgICAgICAgICAgICAgICBzaW5rOiBzaW5rV3JhcHBlcixcbiAgICAgICAgICAgICAgICAgICAgc2VlblN0eWxlcyxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2lua1dyYXBwZXIuZW5xdWV1ZUludm9rZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbXB0eVhPYmplY3RDYWNoZS5zZXQobmFtZSwgeG9iai5kaWN0Lm9iaklkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVycm9yKHMpIGluIHRoZSBYT2JqZWN0IC0tIGFsbG93IHRleHQtZXh0cmFjdGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgICAgICAgICB3YXJuKGBnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIFhPYmplY3Q6IFwiJHtyZWFzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSBPUFMuc2V0R1N0YXRlOlxuICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lICYmIGVtcHR5R1N0YXRlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXh0KFxuICAgICAgICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJHU3RhdGUgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLlwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleHRHU3RhdGUgPSByZXNvdXJjZXMuZ2V0KFwiRXh0R1N0YXRlXCIpO1xuICAgICAgICAgICAgICAgIGlmICghKGV4dEdTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJFeHRHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZ1N0YXRlID0gZXh0R1N0YXRlLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBBdHRlbXB0IHRvIGxvb2t1cCBjYWNoZWQgR1N0YXRlcyBieSByZWZlcmVuY2UgYXMgd2VsbCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpZiBhbmQgb25seSBpZiB0aGVyZSBhcmUgUERGIGRvY3VtZW50cyB3aGVyZSBkb2luZyBzb1xuICAgICAgICAgICAgICAgIC8vICAgICAgIHdvdWxkIHNpZ25pZmljYW50bHkgaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAgICAgICAgICAgICAgICBpZiAoIShnU3RhdGUgaW5zdGFuY2VvZiBEaWN0KSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZUZvbnQgPSBnU3RhdGUuZ2V0KFwiRm9udFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIWdTdGF0ZUZvbnQpIHtcbiAgICAgICAgICAgICAgICAgIGVtcHR5R1N0YXRlQ2FjaGUuc2V0KG5hbWUsIGdTdGF0ZS5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgIHJlc29sdmVHU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcblxuICAgICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZ1N0YXRlRm9udFsxXTtcbiAgICAgICAgICAgICAgICBoYW5kbGVTZXRGb250KG51bGwsIGdTdGF0ZUZvbnRbMF0pLnRoZW4oXG4gICAgICAgICAgICAgICAgICByZXNvbHZlR1N0YXRlLFxuICAgICAgICAgICAgICAgICAgcmVqZWN0R1N0YXRlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICAgICAgICAgICAgLy8gRXJyb3IocykgaW4gdGhlIEV4dEdTdGF0ZSAtLSBhbGxvdyB0ZXh0LWV4dHJhY3Rpb24gdG9cbiAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6IFwiJHtyZWFzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gc3dpdGNoXG4gICAgICAgIGlmICh0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGggPj0gc2luay5kZXNpcmVkU2l6ZSkge1xuICAgICAgICAgIC8vIFdhaXQgZm9yIHJlYWR5LCBpZiB3ZSByZWFjaCBoaWdoV2F0ZXJNYXJrLlxuICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IC8vIHdoaWxlXG4gICAgICBpZiAoc3RvcCkge1xuICAgICAgICBuZXh0KGRlZmVycmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgIGVucXVldWVDaHVuaygpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgLy8gRXJyb3IocykgaW4gdGhlIFRleHRDb250ZW50IC0tIGFsbG93IHRleHQtZXh0cmFjdGlvbiB0byBjb250aW51ZS5cbiAgICAgICAgd2FybihcbiAgICAgICAgICBgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nIFwiJHt0YXNrLm5hbWV9XCIgYCArXG4gICAgICAgICAgICBgdGFzazogXCIke3JlYXNvbn1cIi5gXG4gICAgICAgICk7XG5cbiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTtcbiAgICAgICAgZW5xdWV1ZUNodW5rKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfVxuXG4gIGV4dHJhY3REYXRhU3RydWN0dXJlcyhkaWN0LCBiYXNlRGljdCwgcHJvcGVydGllcykge1xuICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7XG4gICAgbGV0IGNpZFRvR2lkQnl0ZXM7XG4gICAgLy8gOS4xMC4yXG4gICAgdmFyIHRvVW5pY29kZSA9IGRpY3QuZ2V0KFwiVG9Vbmljb2RlXCIpIHx8IGJhc2VEaWN0LmdldChcIlRvVW5pY29kZVwiKTtcbiAgICB2YXIgdG9Vbmljb2RlUHJvbWlzZSA9IHRvVW5pY29kZVxuICAgICAgPyB0aGlzLnJlYWRUb1VuaWNvZGUodG9Vbmljb2RlKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblxuICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkge1xuICAgICAgLy8gQ0lEU3lzdGVtSW5mbyBoZWxwcyB0byBtYXRjaCBDSUQgdG8gZ2x5cGhzXG4gICAgICB2YXIgY2lkU3lzdGVtSW5mbyA9IGRpY3QuZ2V0KFwiQ0lEU3lzdGVtSW5mb1wiKTtcbiAgICAgIGlmIChpc0RpY3QoY2lkU3lzdGVtSW5mbykpIHtcbiAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvID0ge1xuICAgICAgICAgIHJlZ2lzdHJ5OiBzdHJpbmdUb1BERlN0cmluZyhjaWRTeXN0ZW1JbmZvLmdldChcIlJlZ2lzdHJ5XCIpKSxcbiAgICAgICAgICBvcmRlcmluZzogc3RyaW5nVG9QREZTdHJpbmcoY2lkU3lzdGVtSW5mby5nZXQoXCJPcmRlcmluZ1wiKSksXG4gICAgICAgICAgc3VwcGxlbWVudDogY2lkU3lzdGVtSW5mby5nZXQoXCJTdXBwbGVtZW50XCIpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgY2lkVG9HaWRNYXAgPSBkaWN0LmdldChcIkNJRFRvR0lETWFwXCIpO1xuICAgICAgaWYgKGlzU3RyZWFtKGNpZFRvR2lkTWFwKSkge1xuICAgICAgICBjaWRUb0dpZEJ5dGVzID0gY2lkVG9HaWRNYXAuZ2V0Qnl0ZXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCYXNlZCBvbiA5LjYuNiBvZiB0aGUgc3BlYyB0aGUgZW5jb2RpbmcgY2FuIGNvbWUgZnJvbSBtdWx0aXBsZSBwbGFjZXNcbiAgICAvLyBhbmQgZGVwZW5kcyBvbiB0aGUgZm9udCB0eXBlLiBUaGUgYmFzZSBlbmNvZGluZyBhbmQgZGlmZmVyZW5jZXMgYXJlXG4gICAgLy8gcmVhZCBoZXJlLCBidXQgdGhlIGVuY29kaW5nIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBpcyBjaG9zZW4gZHVyaW5nXG4gICAgLy8gZ2x5cGggbWFwcGluZyBpbiB0aGUgZm9udC5cbiAgICAvLyBUT0RPOiBMb2FkaW5nIHRoZSBidWlsdCBpbiBlbmNvZGluZyBpbiB0aGUgZm9udCB3b3VsZCBhbGxvdyB0aGVcbiAgICAvLyBkaWZmZXJlbmNlcyB0byBiZSBtZXJnZWQgaW4gaGVyZSBub3QgcmVxdWlyZSB1cyB0byBob2xkIG9uIHRvIGl0LlxuICAgIHZhciBkaWZmZXJlbmNlcyA9IFtdO1xuICAgIHZhciBiYXNlRW5jb2RpbmdOYW1lID0gbnVsbDtcbiAgICB2YXIgZW5jb2Rpbmc7XG4gICAgaWYgKGRpY3QuaGFzKFwiRW5jb2RpbmdcIikpIHtcbiAgICAgIGVuY29kaW5nID0gZGljdC5nZXQoXCJFbmNvZGluZ1wiKTtcbiAgICAgIGlmIChpc0RpY3QoZW5jb2RpbmcpKSB7XG4gICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBlbmNvZGluZy5nZXQoXCJCYXNlRW5jb2RpbmdcIik7XG4gICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBpc05hbWUoYmFzZUVuY29kaW5nTmFtZSlcbiAgICAgICAgICA/IGJhc2VFbmNvZGluZ05hbWUubmFtZVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgLy8gTG9hZCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgYmFzZSBhbmQgb3JpZ2luYWxcbiAgICAgICAgaWYgKGVuY29kaW5nLmhhcyhcIkRpZmZlcmVuY2VzXCIpKSB7XG4gICAgICAgICAgdmFyIGRpZmZFbmNvZGluZyA9IGVuY29kaW5nLmdldChcIkRpZmZlcmVuY2VzXCIpO1xuICAgICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gZGlmZkVuY29kaW5nLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0geHJlZi5mZXRjaElmUmVmKGRpZmZFbmNvZGluZ1tqXSk7XG4gICAgICAgICAgICBpZiAoaXNOdW0oZGF0YSkpIHtcbiAgICAgICAgICAgICAgaW5kZXggPSBkYXRhO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc05hbWUoZGF0YSkpIHtcbiAgICAgICAgICAgICAgZGlmZmVyZW5jZXNbaW5kZXgrK10gPSBkYXRhLm5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgZW50cnkgaW4gJ0RpZmZlcmVuY2VzJyBhcnJheTogJHtkYXRhfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNOYW1lKGVuY29kaW5nKSkge1xuICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkVuY29kaW5nIGlzIG5vdCBhIE5hbWUgbm9yIGEgRGljdFwiKTtcbiAgICAgIH1cbiAgICAgIC8vIEFjY29yZGluZyB0byB0YWJsZSAxMTQgaWYgdGhlIGVuY29kaW5nIGlzIGEgbmFtZWQgZW5jb2RpbmcgaXQgbXVzdCBiZVxuICAgICAgLy8gb25lIG9mIHRoZXNlIHByZWRlZmluZWQgZW5jb2RpbmdzLlxuICAgICAgaWYgKFxuICAgICAgICBiYXNlRW5jb2RpbmdOYW1lICE9PSBcIk1hY1JvbWFuRW5jb2RpbmdcIiAmJlxuICAgICAgICBiYXNlRW5jb2RpbmdOYW1lICE9PSBcIk1hY0V4cGVydEVuY29kaW5nXCIgJiZcbiAgICAgICAgYmFzZUVuY29kaW5nTmFtZSAhPT0gXCJXaW5BbnNpRW5jb2RpbmdcIlxuICAgICAgKSB7XG4gICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYXNlRW5jb2RpbmdOYW1lKSB7XG4gICAgICBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZyA9IGdldEVuY29kaW5nKGJhc2VFbmNvZGluZ05hbWUpLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpc1N5bWJvbGljRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBGb250RmxhZ3MuU3ltYm9saWMpO1xuICAgICAgdmFyIGlzTm9uc3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5Ob25zeW1ib2xpYyk7XG4gICAgICAvLyBBY2NvcmRpbmcgdG8gXCJUYWJsZSAxMTRcIiBpbiBzZWN0aW9uIFwiOS42LjYuMSBHZW5lcmFsXCIgKHVuZGVyXG4gICAgICAvLyBcIjkuNi42IENoYXJhY3RlciBFbmNvZGluZ1wiKSBvZiB0aGUgUERGIHNwZWNpZmljYXRpb24sIGEgTm9uc3ltYm9saWNcbiAgICAgIC8vIGZvbnQgc2hvdWxkIHVzZSB0aGUgYFN0YW5kYXJkRW5jb2RpbmdgIGlmIG5vIGVuY29kaW5nIGlzIHNwZWNpZmllZC5cbiAgICAgIGVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZztcbiAgICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09IFwiVHJ1ZVR5cGVcIiAmJiAhaXNOb25zeW1ib2xpY0ZvbnQpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7XG4gICAgICB9XG4gICAgICAvLyBUaGUgU3ltYm9saWMgYXR0cmlidXRlIGNhbiBiZSBtaXN1c2VkIGZvciByZWd1bGFyIGZvbnRzXG4gICAgICAvLyBIZXVyaXN0aWM6IHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIGZvbnQgaXMgYSBzdGFuZGFyZCBvbmUgYWxzb1xuICAgICAgaWYgKGlzU3ltYm9saWNGb250KSB7XG4gICAgICAgIGVuY29kaW5nID0gTWFjUm9tYW5FbmNvZGluZztcbiAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmZpbGUpIHtcbiAgICAgICAgICBpZiAoL1N5bWJvbC9pLnRlc3QocHJvcGVydGllcy5uYW1lKSkge1xuICAgICAgICAgICAgZW5jb2RpbmcgPSBTeW1ib2xTZXRFbmNvZGluZztcbiAgICAgICAgICB9IGVsc2UgaWYgKC9EaW5nYmF0c3xXaW5nZGluZ3MvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gWmFwZkRpbmdiYXRzRW5jb2Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIH1cblxuICAgIHByb3BlcnRpZXMuZGlmZmVyZW5jZXMgPSBkaWZmZXJlbmNlcztcbiAgICBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lO1xuICAgIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcgPSAhIWJhc2VFbmNvZGluZ05hbWUgfHwgZGlmZmVyZW5jZXMubGVuZ3RoID4gMDtcbiAgICBwcm9wZXJ0aWVzLmRpY3QgPSBkaWN0O1xuICAgIHJldHVybiB0b1VuaWNvZGVQcm9taXNlXG4gICAgICAudGhlbihyZWFkVG9Vbmljb2RlID0+IHtcbiAgICAgICAgcHJvcGVydGllcy50b1VuaWNvZGUgPSByZWFkVG9Vbmljb2RlO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRvVW5pY29kZShwcm9wZXJ0aWVzKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihidWlsdFRvVW5pY29kZSA9PiB7XG4gICAgICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYnVpbHRUb1VuaWNvZGU7XG4gICAgICAgIGlmIChjaWRUb0dpZEJ5dGVzKSB7XG4gICAgICAgICAgcHJvcGVydGllcy5jaWRUb0dpZE1hcCA9IHRoaXMucmVhZENpZFRvR2lkTWFwKFxuICAgICAgICAgICAgY2lkVG9HaWRCeXRlcyxcbiAgICAgICAgICAgIGJ1aWx0VG9Vbmljb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtUb1VuaWNvZGVNYXB9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYnVpbGRTaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIGZvcmNlR2x5cGhzID0gZmFsc2UpIHtcbiAgICBhc3NlcnQoIXByb3BlcnRpZXMuY29tcG9zaXRlLCBcIk11c3QgYmUgYSBzaW1wbGUgZm9udC5cIik7XG5cbiAgICBjb25zdCB0b1VuaWNvZGUgPSBbXTtcbiAgICBjb25zdCBlbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nLnNsaWNlKCk7XG4gICAgY29uc3QgYmFzZUVuY29kaW5nTmFtZSA9IHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZTtcbiAgICAvLyBNZXJnZSBpbiB0aGUgZGlmZmVyZW5jZXMgYXJyYXkuXG4gICAgY29uc3QgZGlmZmVyZW5jZXMgPSBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzO1xuICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZGlmZmVyZW5jZXMpIHtcbiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJjb2RlXTtcbiAgICAgIGlmIChnbHlwaE5hbWUgPT09IFwiLm5vdGRlZlwiKSB7XG4gICAgICAgIC8vIFNraXAgLm5vdGRlZiB0byBwcmV2ZW50IHJlbmRlcmluZyBlcnJvcnMsIGUuZy4gYm94ZXMgYXBwZWFyaW5nXG4gICAgICAgIC8vIHdoZXJlIHRoZXJlIHNob3VsZCBiZSBzcGFjZXMgKGZpeGVzIGlzc3VlNTI1Ni5wZGYpLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGVuY29kaW5nW2NoYXJjb2RlXSA9IGdseXBoTmFtZTtcbiAgICB9XG4gICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTtcbiAgICBmb3IgKGNvbnN0IGNoYXJjb2RlIGluIGVuY29kaW5nKSB7XG4gICAgICAvLyBhKSBNYXAgdGhlIGNoYXJhY3RlciBjb2RlIHRvIGEgY2hhcmFjdGVyIG5hbWUuXG4gICAgICBsZXQgZ2x5cGhOYW1lID0gZW5jb2RpbmdbY2hhcmNvZGVdO1xuICAgICAgLy8gYikgTG9vayB1cCB0aGUgY2hhcmFjdGVyIG5hbWUgaW4gdGhlIEFkb2JlIEdseXBoIExpc3QgKHNlZSB0aGVcbiAgICAgIC8vICAgIEJpYmxpb2dyYXBoeSkgdG8gb2J0YWluIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgdmFsdWUuXG4gICAgICBpZiAoZ2x5cGhOYW1lID09PSBcIlwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmIChnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyAodW5kb2N1bWVudGVkKSBjKSBGZXcgaGV1cmlzdGljcyB0byByZWNvZ25pemUgdW5rbm93biBnbHlwaHNcbiAgICAgICAgLy8gTk9URTogQWRvYmUgUmVhZGVyIGRvZXMgbm90IGRvIHRoaXMgc3RlcCwgYnV0IE9TWCBQcmV2aWV3IGRvZXNcbiAgICAgICAgbGV0IGNvZGUgPSAwO1xuICAgICAgICBzd2l0Y2ggKGdseXBoTmFtZVswXSkge1xuICAgICAgICAgIGNhc2UgXCJHXCI6IC8vIEd4eCBnbHlwaFxuICAgICAgICAgICAgaWYgKGdseXBoTmFtZS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgICAgY29kZSA9IHBhcnNlSW50KGdseXBoTmFtZS5zdWJzdHJpbmcoMSksIDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJnXCI6IC8vIGcwMHh4IGdseXBoXG4gICAgICAgICAgICBpZiAoZ2x5cGhOYW1lLmxlbmd0aCA9PT0gNSkge1xuICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoZ2x5cGhOYW1lLnN1YnN0cmluZygxKSwgMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkNcIjogLy8gQ2Rke2R9IGdseXBoXG4gICAgICAgICAgY2FzZSBcImNcIjogLy8gY2Rke2R9IGdseXBoXG4gICAgICAgICAgICBpZiAoZ2x5cGhOYW1lLmxlbmd0aCA+PSAzICYmIGdseXBoTmFtZS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICBjb25zdCBjb2RlU3RyID0gZ2x5cGhOYW1lLnN1YnN0cmluZygxKTtcblxuICAgICAgICAgICAgICBpZiAoZm9yY2VHbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgMTYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIE5vcm1hbGx5IHRoZSBDZGR7ZH0vY2Rke2R9IGdseXBoTmFtZSBmb3JtYXQgd2lsbCBjb250YWluXG4gICAgICAgICAgICAgIC8vIHJlZ3VsYXIsIGkuZS4gYmFzZSAxMCwgY2hhckNvZGVzIChzZWUgaXNzdWU0NTUwLnBkZikuLi5cbiAgICAgICAgICAgICAgY29kZSA9ICtjb2RlU3RyO1xuXG4gICAgICAgICAgICAgIC8vIC4uLiBob3dldmVyIHNvbWUgUERGIGdlbmVyYXRvcnMgdmlvbGF0ZSB0aGF0IGFzc3VtcHRpb24gYnlcbiAgICAgICAgICAgICAgLy8gY29udGFpbmluZyBnbHlwaCwgaS5lLiBiYXNlIDE2LCBjb2RlcyBpbnN0ZWFkLlxuICAgICAgICAgICAgICAvLyBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byByZS1wYXJzZSB0aGUgKmVudGlyZSogZW5jb2RpbmcgdG9cbiAgICAgICAgICAgICAgLy8gcHJldmVudCBicm9rZW4gdGV4dC1zZWxlY3Rpb24gKGZpeGVzIGlzc3VlOTY1NV9yZWR1Y2VkLnBkZikuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNOYU4oY29kZSkgJiZcbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlSW50KGNvZGVTdHIsIDE2KSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAvKiBmb3JjZUdseXBocyAqLyB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vICd1bmlYWFhYJy8ndVhYWFh7WFh9JyBnbHlwaHNcbiAgICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSBnZXRVbmljb2RlRm9yR2x5cGgoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTtcbiAgICAgICAgICAgIGlmICh1bmljb2RlICE9PSAtMSkge1xuICAgICAgICAgICAgICBjb2RlID0gdW5pY29kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA+IDAgJiYgY29kZSA8PSAweDEwZmZmZiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7XG4gICAgICAgICAgLy8gSWYgYGJhc2VFbmNvZGluZ05hbWVgIGlzIG9uZSB0aGUgcHJlZGVmaW5lZCBlbmNvZGluZ3MsIGFuZCBgY29kZWBcbiAgICAgICAgICAvLyBlcXVhbHMgYGNoYXJjb2RlYCwgdXNpbmcgdGhlIGdseXBoIGRlZmluZWQgaW4gdGhlIGJhc2VFbmNvZGluZ1xuICAgICAgICAgIC8vIHNlZW1zIHRvIHlpZWxkIGEgYmV0dGVyIGB0b1VuaWNvZGVgIG1hcHBpbmcgKGZpeGVzIGlzc3VlIDUwNzApLlxuICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmdOYW1lICYmIGNvZGUgPT09ICtjaGFyY29kZSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZUVuY29kaW5nID0gZ2V0RW5jb2RpbmcoYmFzZUVuY29kaW5nTmFtZSk7XG4gICAgICAgICAgICBpZiAoYmFzZUVuY29kaW5nICYmIChnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbY2hhcmNvZGVdKSkge1xuICAgICAgICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICAgICBnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVG9Vbmljb2RlTWFwKHRvVW5pY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgY2hhciBjb2RlIHRvIHVuaWNvZGUgbWFwIGJhc2VkIG9uIHNlY3Rpb24gOS4xMCBvZiB0aGUgc3BlYy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgRm9udCBwcm9wZXJ0aWVzIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYVxuICAgKiAgIHtUb1VuaWNvZGVNYXB8SWRlbnRpdHlUb1VuaWNvZGVNYXB9IG9iamVjdC5cbiAgICovXG4gIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHtcbiAgICBwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwID1cbiAgICAgICEhcHJvcGVydGllcy50b1VuaWNvZGUgJiYgcHJvcGVydGllcy50b1VuaWNvZGUubGVuZ3RoID4gMDtcblxuICAgIC8vIFNlY3Rpb24gOS4xMC4yIE1hcHBpbmcgQ2hhcmFjdGVyIENvZGVzIHRvIFVuaWNvZGUgVmFsdWVzXG4gICAgaWYgKHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApIHtcbiAgICAgIC8vIFNvbWUgZm9udHMgY29udGFpbiBpbmNvbXBsZXRlIFRvVW5pY29kZSBkYXRhLCBjYXVzaW5nIGlzc3VlcyB3aXRoXG4gICAgICAvLyB0ZXh0LWV4dHJhY3Rpb24uIEZvciBzaW1wbGUgZm9udHMsIGNvbnRhaW5pbmcgZW5jb2RpbmcgaW5mb3JtYXRpb24sXG4gICAgICAvLyB1c2UgYSBmYWxsYmFjayBUb1VuaWNvZGUgbWFwIHRvIGltcHJvdmUgdGhpcyAoZml4ZXMgaXNzdWU4MjI5LnBkZikuXG4gICAgICBpZiAoIXByb3BlcnRpZXMuY29tcG9zaXRlICYmIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcpIHtcbiAgICAgICAgcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSA9IHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShcbiAgICAgICAgICBwcm9wZXJ0aWVzXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHJvcGVydGllcy50b1VuaWNvZGUpO1xuICAgIH1cblxuICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlYyBpZiB0aGUgZm9udCBpcyBhIHNpbXBsZSBmb250IHdlIHNob3VsZCBvbmx5IG1hcFxuICAgIC8vIHRvIHVuaWNvZGUgaWYgdGhlIGJhc2UgZW5jb2RpbmcgaXMgTWFjUm9tYW4sIE1hY0V4cGVydCwgb3IgV2luQW5zaSBvclxuICAgIC8vIHRoZSBkaWZmZXJlbmNlcyBhcnJheSBvbmx5IGNvbnRhaW5zIGFkb2JlIHN0YW5kYXJkIG9yIHN5bWJvbCBzZXQgbmFtZXMsXG4gICAgLy8gaW4gcHJhdGljZSBpdCBzZWVtcyBiZXR0ZXIgdG8gYWx3YXlzIHRyeSB0byBjcmVhdGUgYSB0b1VuaWNvZGUgbWFwXG4gICAgLy8gYmFzZWQgb2YgdGhlIGRlZmF1bHQgZW5jb2RpbmcuXG4gICAgaWYgKCFwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAvKiBpcyBzaW1wbGUgZm9udCAqLykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUocHJvcGVydGllcykpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBmb250IGlzIGEgY29tcG9zaXRlIGZvbnQgdGhhdCB1c2VzIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBDTWFwc1xuICAgIC8vIGxpc3RlZCBpbiBUYWJsZSAxMTggKGV4Y2VwdCBJZGVudGl0eeKAk0ggYW5kIElkZW50aXR54oCTVikgb3Igd2hvc2VcbiAgICAvLyBkZXNjZW5kYW50IENJREZvbnQgdXNlcyB0aGUgQWRvYmUtR0IxLCBBZG9iZS1DTlMxLCBBZG9iZS1KYXBhbjEsIG9yXG4gICAgLy8gQWRvYmUtS29yZWExIGNoYXJhY3RlciBjb2xsZWN0aW9uOlxuICAgIGlmIChcbiAgICAgIHByb3BlcnRpZXMuY29tcG9zaXRlICYmXG4gICAgICAoKHByb3BlcnRpZXMuY01hcC5idWlsdEluQ01hcCAmJlxuICAgICAgICAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkpIHx8XG4gICAgICAgIChwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ucmVnaXN0cnkgPT09IFwiQWRvYmVcIiAmJlxuICAgICAgICAgIChwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09IFwiR0IxXCIgfHxcbiAgICAgICAgICAgIHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gXCJDTlMxXCIgfHxcbiAgICAgICAgICAgIHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gXCJKYXBhbjFcIiB8fFxuICAgICAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSBcIktvcmVhMVwiKSkpXG4gICAgKSB7XG4gICAgICAvLyBUaGVuOlxuICAgICAgLy8gYSkgTWFwIHRoZSBjaGFyYWN0ZXIgY29kZSB0byBhIGNoYXJhY3RlciBpZGVudGlmaWVyIChDSUQpIGFjY29yZGluZ1xuICAgICAgLy8gdG8gdGhlIGZvbnTigJlzIENNYXAuXG4gICAgICAvLyBiKSBPYnRhaW4gdGhlIHJlZ2lzdHJ5IGFuZCBvcmRlcmluZyBvZiB0aGUgY2hhcmFjdGVyIGNvbGxlY3Rpb24gdXNlZFxuICAgICAgLy8gYnkgdGhlIGZvbnTigJlzIENNYXAgKGZvciBleGFtcGxlLCBBZG9iZSBhbmQgSmFwYW4xKSBmcm9tIGl0c1xuICAgICAgLy8gQ0lEU3lzdGVtSW5mbyBkaWN0aW9uYXJ5LlxuICAgICAgY29uc3QgcmVnaXN0cnkgPSBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ucmVnaXN0cnk7XG4gICAgICBjb25zdCBvcmRlcmluZyA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZztcbiAgICAgIC8vIGMpIENvbnN0cnVjdCBhIHNlY29uZCBDTWFwIG5hbWUgYnkgY29uY2F0ZW5hdGluZyB0aGUgcmVnaXN0cnkgYW5kXG4gICAgICAvLyBvcmRlcmluZyBvYnRhaW5lZCBpbiBzdGVwIChiKSBpbiB0aGUgZm9ybWF0IHJlZ2lzdHJ54oCTb3JkZXJpbmfigJNVQ1MyXG4gICAgICAvLyAoZm9yIGV4YW1wbGUsIEFkb2Jl4oCTSmFwYW4x4oCTVUNTMikuXG4gICAgICBjb25zdCB1Y3MyQ01hcE5hbWUgPSBOYW1lLmdldChyZWdpc3RyeSArIFwiLVwiICsgb3JkZXJpbmcgKyBcIi1VQ1MyXCIpO1xuICAgICAgLy8gZCkgT2J0YWluIHRoZSBDTWFwIHdpdGggdGhlIG5hbWUgY29uc3RydWN0ZWQgaW4gc3RlcCAoYykgKGF2YWlsYWJsZVxuICAgICAgLy8gZnJvbSB0aGUgQVNOIFdlYiBzaXRlOyBzZWUgdGhlIEJpYmxpb2dyYXBoeSkuXG4gICAgICByZXR1cm4gQ01hcEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgICAgZW5jb2Rpbmc6IHVjczJDTWFwTmFtZSxcbiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLFxuICAgICAgICB1c2VDTWFwOiBudWxsLFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodWNzMkNNYXApIHtcbiAgICAgICAgY29uc3QgY01hcCA9IHByb3BlcnRpZXMuY01hcDtcbiAgICAgICAgY29uc3QgdG9Vbmljb2RlID0gW107XG4gICAgICAgIGNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhcmNvZGUsIGNpZCkge1xuICAgICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzVcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGUpIE1hcCB0aGUgQ0lEIG9idGFpbmVkIGluIHN0ZXAgKGEpIGFjY29yZGluZyB0byB0aGUgQ01hcFxuICAgICAgICAgIC8vIG9idGFpbmVkIGluIHN0ZXAgKGQpLCBwcm9kdWNpbmcgYSBVbmljb2RlIHZhbHVlLlxuICAgICAgICAgIGNvbnN0IHVjczIgPSB1Y3MyQ01hcC5sb29rdXAoY2lkKTtcbiAgICAgICAgICBpZiAodWNzMikge1xuICAgICAgICAgICAgdG9Vbmljb2RlW2NoYXJjb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAgICh1Y3MyLmNoYXJDb2RlQXQoMCkgPDwgOCkgKyB1Y3MyLmNoYXJDb2RlQXQoMSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodG9Vbmljb2RlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSB2aWV3ZXIncyBjaG9pY2UsIGp1c3QgdXNlIGFuIGlkZW50aXR5IG1hcC5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKHByb3BlcnRpZXMuZmlyc3RDaGFyLCBwcm9wZXJ0aWVzLmxhc3RDaGFyKVxuICAgICk7XG4gIH1cblxuICByZWFkVG9Vbmljb2RlKHRvVW5pY29kZSkge1xuICAgIHZhciBjbWFwT2JqID0gdG9Vbmljb2RlO1xuICAgIGlmIChpc05hbWUoY21hcE9iaikpIHtcbiAgICAgIHJldHVybiBDTWFwRmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICBlbmNvZGluZzogY21hcE9iaixcbiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLFxuICAgICAgICB1c2VDTWFwOiBudWxsLFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY21hcCkge1xuICAgICAgICBpZiAoY21hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkge1xuICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpdHlUb1VuaWNvZGVNYXAoMCwgMHhmZmZmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRvVW5pY29kZU1hcChjbWFwLmdldE1hcCgpKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJlYW0oY21hcE9iaikpIHtcbiAgICAgIHJldHVybiBDTWFwRmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICBlbmNvZGluZzogY21hcE9iaixcbiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLFxuICAgICAgICB1c2VDTWFwOiBudWxsLFxuICAgICAgfSkudGhlbihcbiAgICAgICAgZnVuY3Rpb24gKGNtYXApIHtcbiAgICAgICAgICBpZiAoY21hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZGVudGl0eVRvVW5pY29kZU1hcCgwLCAweGZmZmYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbWFwID0gbmV3IEFycmF5KGNtYXAubGVuZ3RoKTtcbiAgICAgICAgICAvLyBDb252ZXJ0IFVURi0xNkJFXG4gICAgICAgICAgLy8gTk9URTogY21hcCBjYW4gYmUgYSBzcGFyc2UgYXJyYXksIHNvIHVzZSBmb3JFYWNoIGluc3RlYWQgb2ZcbiAgICAgICAgICAvLyBgZm9yKDs7KWAgdG8gaXRlcmF0ZSBvdmVyIGFsbCBrZXlzLlxuICAgICAgICAgIGNtYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHRva2VuKSB7XG4gICAgICAgICAgICB2YXIgc3RyID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRva2VuLmxlbmd0aDsgayArPSAyKSB7XG4gICAgICAgICAgICAgIHZhciB3MSA9ICh0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDgpIHwgdG9rZW4uY2hhckNvZGVBdChrICsgMSk7XG4gICAgICAgICAgICAgIGlmICgodzEgJiAweGY4MDApICE9PSAweGQ4MDApIHtcbiAgICAgICAgICAgICAgICAvLyB3MSA8IDB4RDgwMCB8fCB3MSA+IDB4REZGRlxuICAgICAgICAgICAgICAgIHN0ci5wdXNoKHcxKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBrICs9IDI7XG4gICAgICAgICAgICAgIHZhciB3MiA9ICh0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDgpIHwgdG9rZW4uY2hhckNvZGVBdChrICsgMSk7XG4gICAgICAgICAgICAgIHN0ci5wdXNoKCgodzEgJiAweDNmZikgPDwgMTApICsgKHcyICYgMHgzZmYpICsgMHgxMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXBbY2hhckNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLCBzdHIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgVG9Vbmljb2RlTWFwKG1hcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgIC8vIEVycm9yIGluIHRoZSBUb1VuaWNvZGUgZGF0YSAtLSBzZW5kaW5nIHVuc3VwcG9ydGVkIGZlYXR1cmVcbiAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBhbmQgYWxsb3cgZm9udCBwYXJzaW5nIHRvIGNvbnRpbnVlLlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udFRvVW5pY29kZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd2FybihgcmVhZFRvVW5pY29kZSAtIGlnbm9yaW5nIFRvVW5pY29kZSBkYXRhOiBcIiR7cmVhc29ufVwiLmApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHJlYWRDaWRUb0dpZE1hcChnbHlwaHNEYXRhLCB0b1VuaWNvZGUpIHtcbiAgICAvLyBFeHRyYWN0IHRoZSBlbmNvZGluZyBmcm9tIHRoZSBDSURUb0dJRE1hcFxuXG4gICAgLy8gU2V0IGVuY29kaW5nIDAgdG8gbGF0ZXIgdmVyaWZ5IHRoZSBmb250IGhhcyBhbiBlbmNvZGluZ1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBqID0gMCwgamogPSBnbHlwaHNEYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgIHZhciBnbHlwaElEID0gKGdseXBoc0RhdGFbaisrXSA8PCA4KSB8IGdseXBoc0RhdGFbal07XG4gICAgICBjb25zdCBjb2RlID0gaiA+PiAxO1xuICAgICAgaWYgKGdseXBoSUQgPT09IDAgJiYgIXRvVW5pY29kZS5oYXMoY29kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHRbY29kZV0gPSBnbHlwaElEO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZXh0cmFjdFdpZHRocyhkaWN0LCBkZXNjcmlwdG9yLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7XG4gICAgdmFyIGdseXBoc1dpZHRocyA9IFtdO1xuICAgIHZhciBkZWZhdWx0V2lkdGggPSAwO1xuICAgIHZhciBnbHlwaHNWTWV0cmljcyA9IFtdO1xuICAgIHZhciBkZWZhdWx0Vk1ldHJpY3M7XG4gICAgdmFyIGksIGlpLCBqLCBqaiwgc3RhcnQsIGNvZGUsIHdpZHRocztcbiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHtcbiAgICAgIGRlZmF1bHRXaWR0aCA9IGRpY3QuaGFzKFwiRFdcIikgPyBkaWN0LmdldChcIkRXXCIpIDogMTAwMDtcblxuICAgICAgd2lkdGhzID0gZGljdC5nZXQoXCJXXCIpO1xuICAgICAgaWYgKHdpZHRocykge1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgc3RhcnQgPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2krK10pO1xuICAgICAgICAgIGNvZGUgPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2ldKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2RlKSkge1xuICAgICAgICAgICAgZm9yIChqID0gMCwgamogPSBjb2RlLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW3N0YXJ0KytdID0geHJlZi5mZXRjaElmUmVmKGNvZGVbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzWysraV0pO1xuICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7XG4gICAgICAgICAgICAgIGdseXBoc1dpZHRoc1tqXSA9IHdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydGllcy52ZXJ0aWNhbCkge1xuICAgICAgICB2YXIgdm1ldHJpY3MgPSBkaWN0LmdldEFycmF5KFwiRFcyXCIpIHx8IFs4ODAsIC0xMDAwXTtcbiAgICAgICAgZGVmYXVsdFZNZXRyaWNzID0gW3ZtZXRyaWNzWzFdLCBkZWZhdWx0V2lkdGggKiAwLjUsIHZtZXRyaWNzWzBdXTtcbiAgICAgICAgdm1ldHJpY3MgPSBkaWN0LmdldChcIlcyXCIpO1xuICAgICAgICBpZiAodm1ldHJpY3MpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHZtZXRyaWNzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHN0YXJ0ID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2krK10pO1xuICAgICAgICAgICAgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpXSk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2RlKSkge1xuICAgICAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvZGUubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW3N0YXJ0KytdID0gW1xuICAgICAgICAgICAgICAgICAgeHJlZi5mZXRjaElmUmVmKGNvZGVbaisrXSksXG4gICAgICAgICAgICAgICAgICB4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSxcbiAgICAgICAgICAgICAgICAgIHhyZWYuZmV0Y2hJZlJlZihjb2RlW2pdKSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgdm1ldHJpYyA9IFtcbiAgICAgICAgICAgICAgICB4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSksXG4gICAgICAgICAgICAgICAgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pLFxuICAgICAgICAgICAgICAgIHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgZ2x5cGhzVk1ldHJpY3Nbal0gPSB2bWV0cmljO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdENoYXIgPSBwcm9wZXJ0aWVzLmZpcnN0Q2hhcjtcbiAgICAgIHdpZHRocyA9IGRpY3QuZ2V0KFwiV2lkdGhzXCIpO1xuICAgICAgaWYgKHdpZHRocykge1xuICAgICAgICBqID0gZmlyc3RDaGFyO1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgZ2x5cGhzV2lkdGhzW2orK10gPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0V2lkdGggPSBwYXJzZUZsb2F0KGRlc2NyaXB0b3IuZ2V0KFwiTWlzc2luZ1dpZHRoXCIpKSB8fCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVHJ5aW5nIGdldCB0aGUgQmFzZUZvbnQgbWV0cmljcyAoc2VlIGNvbW1lbnQgYWJvdmUpLlxuICAgICAgICB2YXIgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoXCJCYXNlRm9udFwiKTtcbiAgICAgICAgaWYgKGlzTmFtZShiYXNlRm9udE5hbWUpKSB7XG4gICAgICAgICAgdmFyIG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUubmFtZSk7XG5cbiAgICAgICAgICBnbHlwaHNXaWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICBkZWZhdWx0V2lkdGggPSBtZXRyaWNzLmRlZmF1bHRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhldXJpc3RpYzogZGV0ZWN0aW9uIG9mIG1vbm9zcGFjZSBmb250IGJ5IGNoZWNraW5nIGFsbCBub24temVybyB3aWR0aHNcbiAgICB2YXIgaXNNb25vc3BhY2UgPSB0cnVlO1xuICAgIHZhciBmaXJzdFdpZHRoID0gZGVmYXVsdFdpZHRoO1xuICAgIGZvciAodmFyIGdseXBoIGluIGdseXBoc1dpZHRocykge1xuICAgICAgdmFyIGdseXBoV2lkdGggPSBnbHlwaHNXaWR0aHNbZ2x5cGhdO1xuICAgICAgaWYgKCFnbHlwaFdpZHRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFmaXJzdFdpZHRoKSB7XG4gICAgICAgIGZpcnN0V2lkdGggPSBnbHlwaFdpZHRoO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXJzdFdpZHRoICE9PSBnbHlwaFdpZHRoKSB7XG4gICAgICAgIGlzTW9ub3NwYWNlID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNNb25vc3BhY2UpIHtcbiAgICAgIHByb3BlcnRpZXMuZmxhZ3MgfD0gRm9udEZsYWdzLkZpeGVkUGl0Y2g7XG4gICAgfVxuXG4gICAgcHJvcGVydGllcy5kZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGg7XG4gICAgcHJvcGVydGllcy53aWR0aHMgPSBnbHlwaHNXaWR0aHM7XG4gICAgcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3MgPSBkZWZhdWx0Vk1ldHJpY3M7XG4gICAgcHJvcGVydGllcy52bWV0cmljcyA9IGdseXBoc1ZNZXRyaWNzO1xuICB9XG5cbiAgaXNTZXJpZkZvbnQoYmFzZUZvbnROYW1lKSB7XG4gICAgLy8gU2ltdWxhdGluZyBkZXNjcmlwdG9yIGZsYWdzIGF0dHJpYnV0ZVxuICAgIHZhciBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoXCItXCIpWzBdO1xuICAgIHJldHVybiAoXG4gICAgICBmb250TmFtZVdvU3R5bGUgaW4gZ2V0U2VyaWZGb250cygpIHx8XG4gICAgICBmb250TmFtZVdvU3R5bGUuc2VhcmNoKC9zZXJpZi9naSkgIT09IC0xXG4gICAgKTtcbiAgfVxuXG4gIGdldEJhc2VGb250TWV0cmljcyhuYW1lKSB7XG4gICAgdmFyIGRlZmF1bHRXaWR0aCA9IDA7XG4gICAgdmFyIHdpZHRocyA9IFtdO1xuICAgIHZhciBtb25vc3BhY2UgPSBmYWxzZTtcbiAgICB2YXIgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTtcbiAgICB2YXIgbG9va3VwTmFtZSA9IHN0ZEZvbnRNYXBbbmFtZV0gfHwgbmFtZTtcbiAgICB2YXIgTWV0cmljcyA9IGdldE1ldHJpY3MoKTtcblxuICAgIGlmICghKGxvb2t1cE5hbWUgaW4gTWV0cmljcykpIHtcbiAgICAgIC8vIFVzZSBkZWZhdWx0IGZvbnRzIGZvciBsb29raW5nIHVwIGZvbnQgbWV0cmljcyBpZiB0aGUgcGFzc2VkXG4gICAgICAvLyBmb250IGlzIG5vdCBhIGJhc2UgZm9udFxuICAgICAgaWYgKHRoaXMuaXNTZXJpZkZvbnQobmFtZSkpIHtcbiAgICAgICAgbG9va3VwTmFtZSA9IFwiVGltZXMtUm9tYW5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvb2t1cE5hbWUgPSBcIkhlbHZldGljYVwiO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZ2x5cGhXaWR0aHMgPSBNZXRyaWNzW2xvb2t1cE5hbWVdO1xuXG4gICAgaWYgKGlzTnVtKGdseXBoV2lkdGhzKSkge1xuICAgICAgZGVmYXVsdFdpZHRoID0gZ2x5cGhXaWR0aHM7XG4gICAgICBtb25vc3BhY2UgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWR0aHMgPSBnbHlwaFdpZHRocygpOyAvLyBleHBhbmQgbGF6eSB3aWR0aHMgYXJyYXlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVmYXVsdFdpZHRoLFxuICAgICAgbW9ub3NwYWNlLFxuICAgICAgd2lkdGhzLFxuICAgIH07XG4gIH1cblxuICBidWlsZENoYXJDb2RlVG9XaWR0aCh3aWR0aHNCeUdseXBoTmFtZSwgcHJvcGVydGllcykge1xuICAgIHZhciB3aWR0aHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7XG4gICAgdmFyIGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgZm9yICh2YXIgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykge1xuICAgICAgaWYgKGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzICYmIHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV0pIHtcbiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXJDb2RlIGluIGVuY29kaW5nICYmIHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV0pIHtcbiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2lkdGhzO1xuICB9XG5cbiAgcHJlRXZhbHVhdGVGb250KGRpY3QpIHtcbiAgICB2YXIgYmFzZURpY3QgPSBkaWN0O1xuICAgIHZhciB0eXBlID0gZGljdC5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgIGlmICghaXNOYW1lKHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJpbnZhbGlkIGZvbnQgU3VidHlwZVwiKTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9zaXRlID0gZmFsc2U7XG4gICAgdmFyIHVpbnQ4YXJyYXk7XG4gICAgaWYgKHR5cGUubmFtZSA9PT0gXCJUeXBlMFwiKSB7XG4gICAgICAvLyBJZiBmb250IGlzIGEgY29tcG9zaXRlXG4gICAgICAvLyAgLSBnZXQgdGhlIGRlc2NlbmRhbnQgZm9udFxuICAgICAgLy8gIC0gc2V0IHRoZSB0eXBlIGFjY29yZGluZyB0byB0aGUgZGVzY2VuZGFudCBmb250XG4gICAgICAvLyAgLSBnZXQgdGhlIEZvbnREZXNjcmlwdG9yIGZyb20gdGhlIGRlc2NlbmRhbnQgZm9udFxuICAgICAgdmFyIGRmID0gZGljdC5nZXQoXCJEZXNjZW5kYW50Rm9udHNcIik7XG4gICAgICBpZiAoIWRmKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkRlc2NlbmRhbnQgZm9udHMgYXJlIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgICB9XG4gICAgICBkaWN0ID0gQXJyYXkuaXNBcnJheShkZikgPyB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkZlswXSkgOiBkZjtcblxuICAgICAgdHlwZSA9IGRpY3QuZ2V0KFwiU3VidHlwZVwiKTtcbiAgICAgIGlmICghaXNOYW1lKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcImludmFsaWQgZm9udCBTdWJ0eXBlXCIpO1xuICAgICAgfVxuICAgICAgY29tcG9zaXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgZGVzY3JpcHRvciA9IGRpY3QuZ2V0KFwiRm9udERlc2NyaXB0b3JcIik7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIHZhciBoYXNoID0gbmV3IE11cm11ckhhc2gzXzY0KCk7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBiYXNlRGljdC5nZXRSYXcoXCJFbmNvZGluZ1wiKTtcbiAgICAgIGlmIChpc05hbWUoZW5jb2RpbmcpKSB7XG4gICAgICAgIGhhc2gudXBkYXRlKGVuY29kaW5nLm5hbWUpO1xuICAgICAgfSBlbHNlIGlmIChpc1JlZihlbmNvZGluZykpIHtcbiAgICAgICAgaGFzaC51cGRhdGUoZW5jb2RpbmcudG9TdHJpbmcoKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGljdChlbmNvZGluZykpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbmNvZGluZy5nZXRSYXdWYWx1ZXMoKSkge1xuICAgICAgICAgIGlmIChpc05hbWUoZW50cnkpKSB7XG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShlbnRyeS5uYW1lKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVmKGVudHJ5KSkge1xuICAgICAgICAgICAgaGFzaC51cGRhdGUoZW50cnkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAgICAgLy8gJ0RpZmZlcmVuY2VzJyBhcnJheSAoZml4ZXMgYnVnMTE1NzQ5My5wZGYpLlxuICAgICAgICAgICAgdmFyIGRpZmZMZW5ndGggPSBlbnRyeS5sZW5ndGgsXG4gICAgICAgICAgICAgIGRpZmZCdWYgPSBuZXcgQXJyYXkoZGlmZkxlbmd0aCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGlmZkxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmRW50cnkgPSBlbnRyeVtqXTtcbiAgICAgICAgICAgICAgaWYgKGlzTmFtZShkaWZmRW50cnkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS5uYW1lO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTnVtKGRpZmZFbnRyeSkgfHwgaXNSZWYoZGlmZkVudHJ5KSkge1xuICAgICAgICAgICAgICAgIGRpZmZCdWZbal0gPSBkaWZmRW50cnkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFzaC51cGRhdGUoZGlmZkJ1Zi5qb2luKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdENoYXIgPSBkaWN0LmdldChcIkZpcnN0Q2hhclwiKSB8fCAwO1xuICAgICAgY29uc3QgbGFzdENoYXIgPSBkaWN0LmdldChcIkxhc3RDaGFyXCIpIHx8IChjb21wb3NpdGUgPyAweGZmZmYgOiAweGZmKTtcbiAgICAgIGhhc2gudXBkYXRlKGAke2ZpcnN0Q2hhcn0tJHtsYXN0Q2hhcn1gKTtcblxuICAgICAgdmFyIHRvVW5pY29kZSA9IGRpY3QuZ2V0KFwiVG9Vbmljb2RlXCIpIHx8IGJhc2VEaWN0LmdldChcIlRvVW5pY29kZVwiKTtcbiAgICAgIGlmIChpc1N0cmVhbSh0b1VuaWNvZGUpKSB7XG4gICAgICAgIHZhciBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTtcbiAgICAgICAgdWludDhhcnJheSA9IHN0cmVhbS5idWZmZXJcbiAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIuYnVmZmVyLCAwLCBzdHJlYW0uYnVmZmVyTGVuZ3RoKVxuICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgICAgICAgIHN0cmVhbS5ieXRlcy5idWZmZXIsXG4gICAgICAgICAgICAgIHN0cmVhbS5zdGFydCxcbiAgICAgICAgICAgICAgc3RyZWFtLmVuZCAtIHN0cmVhbS5zdGFydFxuICAgICAgICAgICAgKTtcbiAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFtZSh0b1VuaWNvZGUpKSB7XG4gICAgICAgIGhhc2gudXBkYXRlKHRvVW5pY29kZS5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHdpZHRocyA9IGRpY3QuZ2V0KFwiV2lkdGhzXCIpIHx8IGJhc2VEaWN0LmdldChcIldpZHRoc1wiKTtcbiAgICAgIGlmICh3aWR0aHMpIHtcbiAgICAgICAgdWludDhhcnJheSA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheSh3aWR0aHMpLmJ1ZmZlcik7XG4gICAgICAgIGhhc2gudXBkYXRlKHVpbnQ4YXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgZGljdCxcbiAgICAgIGJhc2VEaWN0LFxuICAgICAgY29tcG9zaXRlLFxuICAgICAgdHlwZTogdHlwZS5uYW1lLFxuICAgICAgaGFzaDogaGFzaCA/IGhhc2guaGV4ZGlnZXN0KCkgOiBcIlwiLFxuICAgIH07XG4gIH1cblxuICB0cmFuc2xhdGVGb250KHByZUV2YWx1YXRlZEZvbnQpIHtcbiAgICB2YXIgYmFzZURpY3QgPSBwcmVFdmFsdWF0ZWRGb250LmJhc2VEaWN0O1xuICAgIHZhciBkaWN0ID0gcHJlRXZhbHVhdGVkRm9udC5kaWN0O1xuICAgIHZhciBjb21wb3NpdGUgPSBwcmVFdmFsdWF0ZWRGb250LmNvbXBvc2l0ZTtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByZUV2YWx1YXRlZEZvbnQuZGVzY3JpcHRvcjtcbiAgICB2YXIgdHlwZSA9IHByZUV2YWx1YXRlZEZvbnQudHlwZTtcbiAgICB2YXIgbWF4Q2hhckluZGV4ID0gY29tcG9zaXRlID8gMHhmZmZmIDogMHhmZjtcbiAgICB2YXIgcHJvcGVydGllcztcbiAgICBjb25zdCBmaXJzdENoYXIgPSBkaWN0LmdldChcIkZpcnN0Q2hhclwiKSB8fCAwO1xuICAgIGNvbnN0IGxhc3RDaGFyID0gZGljdC5nZXQoXCJMYXN0Q2hhclwiKSB8fCBtYXhDaGFySW5kZXg7XG5cbiAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgIGlmICh0eXBlID09PSBcIlR5cGUzXCIpIHtcbiAgICAgICAgLy8gRm9udERlc2NyaXB0b3IgaXMgb25seSByZXF1aXJlZCBmb3IgVHlwZTMgZm9udHMgd2hlbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgLy8gaXMgYSB0YWdnZWQgcGRmLiBDcmVhdGUgYSBiYXJiZWJvbmVzIG9uZSB0byBnZXQgYnkuXG4gICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgRGljdChudWxsKTtcbiAgICAgICAgZGVzY3JpcHRvci5zZXQoXCJGb250TmFtZVwiLCBOYW1lLmdldCh0eXBlKSk7XG4gICAgICAgIGRlc2NyaXB0b3Iuc2V0KFwiRm9udEJCb3hcIiwgZGljdC5nZXRBcnJheShcIkZvbnRCQm94XCIpIHx8IFswLCAwLCAwLCAwXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCZWZvcmUgUERGIDEuNSBpZiB0aGUgZm9udCB3YXMgb25lIG9mIHRoZSBiYXNlIDE0IGZvbnRzLCBoYXZpbmcgYVxuICAgICAgICAvLyBGb250RGVzY3JpcHRvciB3YXMgbm90IHJlcXVpcmVkLlxuICAgICAgICAvLyBUaGlzIGNhc2UgaXMgaGVyZSBmb3IgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgdmFyIGJhc2VGb250TmFtZSA9IGRpY3QuZ2V0KFwiQmFzZUZvbnRcIik7XG4gICAgICAgIGlmICghaXNOYW1lKGJhc2VGb250TmFtZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJCYXNlIGZvbnQgaXMgbm90IHNwZWNpZmllZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzaW5nIGJhc2UgZm9udCBuYW1lIGFzIGEgZm9udCBuYW1lLlxuICAgICAgICBiYXNlRm9udE5hbWUgPSBiYXNlRm9udE5hbWUubmFtZS5yZXBsYWNlKC9bLF9dL2csIFwiLVwiKTtcbiAgICAgICAgdmFyIG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUpO1xuXG4gICAgICAgIC8vIFNpbXVsYXRpbmcgZGVzY3JpcHRvciBmbGFncyBhdHRyaWJ1dGVcbiAgICAgICAgdmFyIGZvbnROYW1lV29TdHlsZSA9IGJhc2VGb250TmFtZS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIHZhciBmbGFncyA9XG4gICAgICAgICAgKHRoaXMuaXNTZXJpZkZvbnQoZm9udE5hbWVXb1N0eWxlKSA/IEZvbnRGbGFncy5TZXJpZiA6IDApIHxcbiAgICAgICAgICAobWV0cmljcy5tb25vc3BhY2UgPyBGb250RmxhZ3MuRml4ZWRQaXRjaCA6IDApIHxcbiAgICAgICAgICAoZ2V0U3ltYm9sc0ZvbnRzKClbZm9udE5hbWVXb1N0eWxlXVxuICAgICAgICAgICAgPyBGb250RmxhZ3MuU3ltYm9saWNcbiAgICAgICAgICAgIDogRm9udEZsYWdzLk5vbnN5bWJvbGljKTtcblxuICAgICAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgbmFtZTogYmFzZUZvbnROYW1lLFxuICAgICAgICAgIHdpZHRoczogbWV0cmljcy53aWR0aHMsXG4gICAgICAgICAgZGVmYXVsdFdpZHRoOiBtZXRyaWNzLmRlZmF1bHRXaWR0aCxcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBmaXJzdENoYXIsXG4gICAgICAgICAgbGFzdENoYXIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHdpZHRocyA9IGRpY3QuZ2V0KFwiV2lkdGhzXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgZGljdCwgcHJvcGVydGllcykudGhlbihcbiAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0+IHtcbiAgICAgICAgICAgIGlmICh3aWR0aHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZ2x5cGhXaWR0aHMgPSBbXTtcbiAgICAgICAgICAgICAgbGV0IGogPSBmaXJzdENoYXI7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZ2x5cGhXaWR0aHNbaisrXSA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHdpZHRoc1tpXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBnbHlwaFdpZHRocztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMud2lkdGhzID0gdGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChcbiAgICAgICAgICAgICAgICBtZXRyaWNzLndpZHRocyxcbiAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvbnQoYmFzZUZvbnROYW1lLCBudWxsLCBuZXdQcm9wZXJ0aWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjIGlmICdGb250RGVzY3JpcHRvcicgaXMgZGVjbGFyZWQsICdGaXJzdENoYXInLFxuICAgIC8vICdMYXN0Q2hhcicgYW5kICdXaWR0aHMnIHNob3VsZCBleGlzdCB0b28sIGJ1dCBzb21lIFBERiBlbmNvZGVycyBzZWVtXG4gICAgLy8gdG8gaWdub3JlIHRoaXMgcnVsZSB3aGVuIGEgdmFyaWFudCBvZiBhIHN0YW5kYXJkIGZvbnQgaXMgdXNlZC5cbiAgICAvLyBUT0RPIEZpbGwgdGhlIHdpZHRoIGFycmF5IGRlcGVuZGluZyBvbiB3aGljaCBvZiB0aGUgYmFzZSBmb250IHRoaXMgaXNcbiAgICAvLyBhIHZhcmlhbnQuXG5cbiAgICB2YXIgZm9udE5hbWUgPSBkZXNjcmlwdG9yLmdldChcIkZvbnROYW1lXCIpO1xuICAgIHZhciBiYXNlRm9udCA9IGRpY3QuZ2V0KFwiQmFzZUZvbnRcIik7XG4gICAgLy8gU29tZSBiYWQgUERGcyBoYXZlIGEgc3RyaW5nIGFzIHRoZSBmb250IG5hbWUuXG4gICAgaWYgKGlzU3RyaW5nKGZvbnROYW1lKSkge1xuICAgICAgZm9udE5hbWUgPSBOYW1lLmdldChmb250TmFtZSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhiYXNlRm9udCkpIHtcbiAgICAgIGJhc2VGb250ID0gTmFtZS5nZXQoYmFzZUZvbnQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSBcIlR5cGUzXCIpIHtcbiAgICAgIHZhciBmb250TmFtZVN0ciA9IGZvbnROYW1lICYmIGZvbnROYW1lLm5hbWU7XG4gICAgICB2YXIgYmFzZUZvbnRTdHIgPSBiYXNlRm9udCAmJiBiYXNlRm9udC5uYW1lO1xuICAgICAgaWYgKGZvbnROYW1lU3RyICE9PSBiYXNlRm9udFN0cikge1xuICAgICAgICBpbmZvKFxuICAgICAgICAgIGBUaGUgRm9udERlc2NyaXB0b3JcXCdzIEZvbnROYW1lIGlzIFwiJHtmb250TmFtZVN0cn1cIiBidXQgYCArXG4gICAgICAgICAgICBgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250XFwncyBCYXNlRm9udCBcIiR7YmFzZUZvbnRTdHJ9XCIuYFxuICAgICAgICApO1xuICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBjYXNlcyB3aGVyZSBlLmcuIGZvbnROYW1lU3RyID0gJ0FyaWFsJyBhbmRcbiAgICAgICAgLy8gYmFzZUZvbnRTdHIgPSAnQXJpYWwsQm9sZCcgKG5lZWRlZCB3aGVuIG5vIGZvbnQgZmlsZSBpcyBlbWJlZGRlZCkuXG4gICAgICAgIGlmIChmb250TmFtZVN0ciAmJiBiYXNlRm9udFN0ciAmJiBiYXNlRm9udFN0ci5zdGFydHNXaXRoKGZvbnROYW1lU3RyKSkge1xuICAgICAgICAgIGZvbnROYW1lID0gYmFzZUZvbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9udE5hbWUgPSBmb250TmFtZSB8fCBiYXNlRm9udDtcblxuICAgIGlmICghaXNOYW1lKGZvbnROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiaW52YWxpZCBmb250IG5hbWVcIik7XG4gICAgfVxuXG4gICAgdmFyIGZvbnRGaWxlID0gZGVzY3JpcHRvci5nZXQoXCJGb250RmlsZVwiLCBcIkZvbnRGaWxlMlwiLCBcIkZvbnRGaWxlM1wiKTtcbiAgICBpZiAoZm9udEZpbGUpIHtcbiAgICAgIGlmIChmb250RmlsZS5kaWN0KSB7XG4gICAgICAgIHZhciBzdWJ0eXBlID0gZm9udEZpbGUuZGljdC5nZXQoXCJTdWJ0eXBlXCIpO1xuICAgICAgICBpZiAoc3VidHlwZSkge1xuICAgICAgICAgIHN1YnR5cGUgPSBzdWJ0eXBlLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aDEgPSBmb250RmlsZS5kaWN0LmdldChcIkxlbmd0aDFcIik7XG4gICAgICAgIHZhciBsZW5ndGgyID0gZm9udEZpbGUuZGljdC5nZXQoXCJMZW5ndGgyXCIpO1xuICAgICAgICB2YXIgbGVuZ3RoMyA9IGZvbnRGaWxlLmRpY3QuZ2V0KFwiTGVuZ3RoM1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgdHlwZSxcbiAgICAgIG5hbWU6IGZvbnROYW1lLm5hbWUsXG4gICAgICBzdWJ0eXBlLFxuICAgICAgZmlsZTogZm9udEZpbGUsXG4gICAgICBsZW5ndGgxLFxuICAgICAgbGVuZ3RoMixcbiAgICAgIGxlbmd0aDMsXG4gICAgICBsb2FkZWROYW1lOiBiYXNlRGljdC5sb2FkZWROYW1lLFxuICAgICAgY29tcG9zaXRlLFxuICAgICAgZml4ZWRQaXRjaDogZmFsc2UsXG4gICAgICBmb250TWF0cml4OiBkaWN0LmdldEFycmF5KFwiRm9udE1hdHJpeFwiKSB8fCBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgICAgIGZpcnN0Q2hhcjogZmlyc3RDaGFyIHx8IDAsXG4gICAgICBsYXN0Q2hhcjogbGFzdENoYXIgfHwgbWF4Q2hhckluZGV4LFxuICAgICAgYmJveDogZGVzY3JpcHRvci5nZXRBcnJheShcIkZvbnRCQm94XCIpLFxuICAgICAgYXNjZW50OiBkZXNjcmlwdG9yLmdldChcIkFzY2VudFwiKSxcbiAgICAgIGRlc2NlbnQ6IGRlc2NyaXB0b3IuZ2V0KFwiRGVzY2VudFwiKSxcbiAgICAgIHhIZWlnaHQ6IGRlc2NyaXB0b3IuZ2V0KFwiWEhlaWdodFwiKSxcbiAgICAgIGNhcEhlaWdodDogZGVzY3JpcHRvci5nZXQoXCJDYXBIZWlnaHRcIiksXG4gICAgICBmbGFnczogZGVzY3JpcHRvci5nZXQoXCJGbGFnc1wiKSxcbiAgICAgIGl0YWxpY0FuZ2xlOiBkZXNjcmlwdG9yLmdldChcIkl0YWxpY0FuZ2xlXCIpLFxuICAgICAgaXNUeXBlM0ZvbnQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICB2YXIgY01hcFByb21pc2U7XG4gICAgaWYgKGNvbXBvc2l0ZSkge1xuICAgICAgdmFyIGNpZEVuY29kaW5nID0gYmFzZURpY3QuZ2V0KFwiRW5jb2RpbmdcIik7XG4gICAgICBpZiAoaXNOYW1lKGNpZEVuY29kaW5nKSkge1xuICAgICAgICBwcm9wZXJ0aWVzLmNpZEVuY29kaW5nID0gY2lkRW5jb2RpbmcubmFtZTtcbiAgICAgIH1cbiAgICAgIGNNYXBQcm9taXNlID0gQ01hcEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgICAgZW5jb2Rpbmc6IGNpZEVuY29kaW5nLFxuICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsXG4gICAgICAgIHVzZUNNYXA6IG51bGwsXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjTWFwKSB7XG4gICAgICAgIHByb3BlcnRpZXMuY01hcCA9IGNNYXA7XG4gICAgICAgIHByb3BlcnRpZXMudmVydGljYWwgPSBwcm9wZXJ0aWVzLmNNYXAudmVydGljYWw7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY01hcFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY01hcFByb21pc2VcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIGJhc2VEaWN0LCBwcm9wZXJ0aWVzKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihuZXdQcm9wZXJ0aWVzID0+IHtcbiAgICAgICAgdGhpcy5leHRyYWN0V2lkdGhzKGRpY3QsIGRlc2NyaXB0b3IsIG5ld1Byb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmICh0eXBlID09PSBcIlR5cGUzXCIpIHtcbiAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmlzVHlwZTNGb250ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZvbnQoZm9udE5hbWUubmFtZSwgZm9udEZpbGUsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgfSk7XG4gIH1cblxuICBzdGF0aWMgYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCBoYW5kbGVyKSB7XG4gICAgZnVuY3Rpb24gYnVpbGRQYXRoKGZvbnRDaGFyKSB7XG4gICAgICBpZiAoZm9udC5yZW5kZXJlci5oYXNCdWlsdFBhdGgoZm9udENoYXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGhhbmRsZXIuc2VuZChcImNvbW1vbm9ialwiLCBbXG4gICAgICAgIGAke2ZvbnQubG9hZGVkTmFtZX1fcGF0aF8ke2ZvbnRDaGFyfWAsXG4gICAgICAgIFwiRm9udFBhdGhcIixcbiAgICAgICAgZm9udC5yZW5kZXJlci5nZXRQYXRoSnMoZm9udENoYXIpLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHtcbiAgICAgIGJ1aWxkUGF0aChnbHlwaC5mb250Q2hhcik7XG5cbiAgICAgIC8vIElmIHRoZSBnbHlwaCBoYXMgYW4gYWNjZW50IHdlIG5lZWQgdG8gYnVpbGQgYSBwYXRoIGZvciBpdHNcbiAgICAgIC8vIGZvbnRDaGFyIHRvbywgb3RoZXJ3aXNlIENhbnZhc0dyYXBoaWNzX3BhaW50Q2hhciB3aWxsIGZhaWwuXG4gICAgICBjb25zdCBhY2NlbnQgPSBnbHlwaC5hY2NlbnQ7XG4gICAgICBpZiAoYWNjZW50ICYmIGFjY2VudC5mb250Q2hhcikge1xuICAgICAgICBidWlsZFBhdGgoYWNjZW50LmZvbnRDaGFyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGZhbGxiYWNrRm9udERpY3QoKSB7XG4gICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KCk7XG4gICAgZGljdC5zZXQoXCJCYXNlRm9udFwiLCBOYW1lLmdldChcIlBERkpTLUZhbGxiYWNrRm9udFwiKSk7XG4gICAgZGljdC5zZXQoXCJUeXBlXCIsIE5hbWUuZ2V0KFwiRmFsbGJhY2tUeXBlXCIpKTtcbiAgICBkaWN0LnNldChcIlN1YnR5cGVcIiwgTmFtZS5nZXQoXCJGYWxsYmFja1R5cGVcIikpO1xuICAgIGRpY3Quc2V0KFwiRW5jb2RpbmdcIiwgTmFtZS5nZXQoXCJXaW5BbnNpRW5jb2RpbmdcIikpO1xuXG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImZhbGxiYWNrRm9udERpY3RcIiwgZGljdCk7XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNsYXRlZEZvbnQge1xuICBjb25zdHJ1Y3Rvcih7IGxvYWRlZE5hbWUsIGZvbnQsIGRpY3QsIGV4dHJhUHJvcGVydGllcyA9IGZhbHNlIH0pIHtcbiAgICB0aGlzLmxvYWRlZE5hbWUgPSBsb2FkZWROYW1lO1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB0aGlzLl9leHRyYVByb3BlcnRpZXMgPSBleHRyYVByb3BlcnRpZXM7XG4gICAgdGhpcy50eXBlM0xvYWRlZCA9IG51bGw7XG4gICAgdGhpcy50eXBlM0RlcGVuZGVuY2llcyA9IGZvbnQuaXNUeXBlM0ZvbnQgPyBuZXcgU2V0KCkgOiBudWxsO1xuICAgIHRoaXMuc2VudCA9IGZhbHNlO1xuICB9XG5cbiAgc2VuZChoYW5kbGVyKSB7XG4gICAgaWYgKHRoaXMuc2VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbnQgPSB0cnVlO1xuXG4gICAgaGFuZGxlci5zZW5kKFwiY29tbW9ub2JqXCIsIFtcbiAgICAgIHRoaXMubG9hZGVkTmFtZSxcbiAgICAgIFwiRm9udFwiLFxuICAgICAgdGhpcy5mb250LmV4cG9ydERhdGEodGhpcy5fZXh0cmFQcm9wZXJ0aWVzKSxcbiAgICBdKTtcbiAgfVxuXG4gIGZhbGxiYWNrKGhhbmRsZXIpIHtcbiAgICBpZiAoIXRoaXMuZm9udC5kYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFdoZW4gZm9udCBsb2FkaW5nIGZhaWxlZCwgZmFsbCBiYWNrIHRvIHRoZSBidWlsdC1pbiBmb250IHJlbmRlcmVyLlxuICAgIHRoaXMuZm9udC5kaXNhYmxlRm9udEZhY2UgPSB0cnVlO1xuICAgIC8vIEFuIGFyYml0cmFyeSBudW1iZXIgb2YgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3JzIGNvdWxkIGhhdmUgYmVlblxuICAgIC8vIGVuY291bnRlcmVkIGJldHdlZW4gdGhlIHBvaW50IGluIHRpbWUgd2hlbiB0aGUgJ0ZvbnQnIG1lc3NhZ2Ugd2FzIHNlbnRcbiAgICAvLyB0byB0aGUgbWFpbi10aHJlYWQsIGFuZCB0aGUgcG9pbnQgaW4gdGltZSB3aGVuIHRoZSAnRm9udEZhbGxiYWNrJ1xuICAgIC8vIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIG9uIHRoZSB3b3JrZXItdGhyZWFkLlxuICAgIC8vIFRvIGVuc3VyZSB0aGF0IGFsbCAnRm9udFBhdGgncyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBtYWluLXRocmVhZCwgd2hlblxuICAgIC8vIGZvbnQgbG9hZGluZyBmYWlsZWQsIGF0dGVtcHQgdG8gcmVzZW5kICphbGwqIHByZXZpb3VzbHkgcGFyc2VkIGdseXBocy5cbiAgICBjb25zdCBnbHlwaHMgPSB0aGlzLmZvbnQuZ2x5cGhDYWNoZVZhbHVlcztcbiAgICBQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKHRoaXMuZm9udCwgZ2x5cGhzLCBoYW5kbGVyKTtcbiAgfVxuXG4gIGxvYWRUeXBlM0RhdGEoZXZhbHVhdG9yLCByZXNvdXJjZXMsIHRhc2spIHtcbiAgICBpZiAodGhpcy50eXBlM0xvYWRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZTNMb2FkZWQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5mb250LmlzVHlwZTNGb250KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGJlIGEgVHlwZTMgZm9udC5cIik7XG4gICAgfVxuICAgIC8vIFdoZW4gcGFyc2luZyBUeXBlMyBnbHlwaHMsIGFsd2F5cyBpZ25vcmUgdGhlbSBpZiB0aGVyZSBhcmUgZXJyb3JzLlxuICAgIC8vIENvbXBhcmVkIHRvIHRoZSBwYXJzaW5nIG9mIGUuZy4gYW4gZW50aXJlIHBhZ2UsIGl0IGRvZXNuJ3QgcmVhbGx5XG4gICAgLy8gbWFrZSBzZW5zZSB0byBvbmx5IGJlIGFibGUgdG8gcmVuZGVyIGEgVHlwZTMgZ2x5cGggcGFydGlhbGx5LlxuICAgIHZhciB0eXBlM09wdGlvbnMgPSBPYmplY3QuY3JlYXRlKGV2YWx1YXRvci5vcHRpb25zKTtcbiAgICB0eXBlM09wdGlvbnMuaWdub3JlRXJyb3JzID0gZmFsc2U7XG4gICAgdmFyIHR5cGUzRXZhbHVhdG9yID0gZXZhbHVhdG9yLmNsb25lKHR5cGUzT3B0aW9ucyk7XG4gICAgdHlwZTNFdmFsdWF0b3IucGFyc2luZ1R5cGUzRm9udCA9IHRydWU7XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkRm9udCA9IHRoaXMuZm9udCxcbiAgICAgIHR5cGUzRGVwZW5kZW5jaWVzID0gdGhpcy50eXBlM0RlcGVuZGVuY2llcztcbiAgICB2YXIgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB2YXIgY2hhclByb2NzID0gdGhpcy5kaWN0LmdldChcIkNoYXJQcm9jc1wiKTtcbiAgICB2YXIgZm9udFJlc291cmNlcyA9IHRoaXMuZGljdC5nZXQoXCJSZXNvdXJjZXNcIikgfHwgcmVzb3VyY2VzO1xuICAgIHZhciBjaGFyUHJvY09wZXJhdG9yTGlzdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjaGFyUHJvY3MuZ2V0S2V5cygpKSB7XG4gICAgICBsb2FkQ2hhclByb2NzUHJvbWlzZSA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2x5cGhTdHJlYW0gPSBjaGFyUHJvY3MuZ2V0KGtleSk7XG4gICAgICAgIHZhciBvcGVyYXRvckxpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7XG4gICAgICAgIHJldHVybiB0eXBlM0V2YWx1YXRvclxuICAgICAgICAgIC5nZXRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgc3RyZWFtOiBnbHlwaFN0cmVhbSxcbiAgICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgICByZXNvdXJjZXM6IGZvbnRSZXNvdXJjZXMsXG4gICAgICAgICAgICBvcGVyYXRvckxpc3QsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gb3BlcmF0b3JMaXN0LmdldElSKCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvcGVyYXRvckxpc3QuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgIHR5cGUzRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICB3YXJuKGBUeXBlMyBmb250IHJlc291cmNlIFwiJHtrZXl9XCIgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgICAgICAgICAgIGNvbnN0IGR1bW15T3BlcmF0b3JMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpO1xuICAgICAgICAgICAgY2hhclByb2NPcGVyYXRvckxpc3Rba2V5XSA9IGR1bW15T3BlcmF0b3JMaXN0LmdldElSKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy50eXBlM0xvYWRlZCA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNsYXRlZEZvbnQuY2hhclByb2NPcGVyYXRvckxpc3QgPSBjaGFyUHJvY09wZXJhdG9yTGlzdDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy50eXBlM0xvYWRlZDtcbiAgfVxufVxuXG5jbGFzcyBTdGF0ZU1hbmFnZXIge1xuICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIHRoaXMuc3RhdGVTdGFjayA9IFtdO1xuICB9XG5cbiAgc2F2ZSgpIHtcbiAgICB2YXIgb2xkID0gdGhpcy5zdGF0ZTtcbiAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLnN0YXRlID0gb2xkLmNsb25lKCk7XG4gIH1cblxuICByZXN0b3JlKCkge1xuICAgIHZhciBwcmV2ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpO1xuICAgIGlmIChwcmV2KSB7XG4gICAgICB0aGlzLnN0YXRlID0gcHJldjtcbiAgICB9XG4gIH1cblxuICB0cmFuc2Zvcm0oYXJncykge1xuICAgIHRoaXMuc3RhdGUuY3RtID0gVXRpbC50cmFuc2Zvcm0odGhpcy5zdGF0ZS5jdG0sIGFyZ3MpO1xuICB9XG59XG5cbmNsYXNzIFRleHRTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY3RtID0gbmV3IEZsb2F0MzJBcnJheShJREVOVElUWV9NQVRSSVgpO1xuICAgIHRoaXMuZm9udE5hbWUgPSBudWxsO1xuICAgIHRoaXMuZm9udFNpemUgPSAwO1xuICAgIHRoaXMuZm9udCA9IG51bGw7XG4gICAgdGhpcy5mb250TWF0cml4ID0gRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgdGhpcy50ZXh0TWF0cml4ID0gSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7XG4gICAgdGhpcy50ZXh0TGluZU1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpO1xuICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwO1xuICAgIHRoaXMud29yZFNwYWNpbmcgPSAwO1xuICAgIHRoaXMubGVhZGluZyA9IDA7XG4gICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcbiAgICB0aGlzLnRleHRSaXNlID0gMDtcbiAgfVxuXG4gIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHZhciBtID0gdGhpcy50ZXh0TWF0cml4O1xuICAgIG1bMF0gPSBhO1xuICAgIG1bMV0gPSBiO1xuICAgIG1bMl0gPSBjO1xuICAgIG1bM10gPSBkO1xuICAgIG1bNF0gPSBlO1xuICAgIG1bNV0gPSBmO1xuICB9XG5cbiAgc2V0VGV4dExpbmVNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHZhciBtID0gdGhpcy50ZXh0TGluZU1hdHJpeDtcbiAgICBtWzBdID0gYTtcbiAgICBtWzFdID0gYjtcbiAgICBtWzJdID0gYztcbiAgICBtWzNdID0gZDtcbiAgICBtWzRdID0gZTtcbiAgICBtWzVdID0gZjtcbiAgfVxuXG4gIHRyYW5zbGF0ZVRleHRNYXRyaXgoeCwgeSkge1xuICAgIHZhciBtID0gdGhpcy50ZXh0TWF0cml4O1xuICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIH1cblxuICB0cmFuc2xhdGVUZXh0TGluZU1hdHJpeCh4LCB5KSB7XG4gICAgdmFyIG0gPSB0aGlzLnRleHRMaW5lTWF0cml4O1xuICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIH1cblxuICBjYWxjVGV4dExpbmVNYXRyaXhBZHZhbmNlKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICB2YXIgZm9udCA9IHRoaXMuZm9udDtcbiAgICBpZiAoIWZvbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7XG4gICAgaWYgKCEoYSA9PT0gbVswXSAmJiBiID09PSBtWzFdICYmIGMgPT09IG1bMl0gJiYgZCA9PT0gbVszXSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgdHhEaWZmID0gZSAtIG1bNF0sXG4gICAgICB0eURpZmYgPSBmIC0gbVs1XTtcbiAgICBpZiAoKGZvbnQudmVydGljYWwgJiYgdHhEaWZmICE9PSAwKSB8fCAoIWZvbnQudmVydGljYWwgJiYgdHlEaWZmICE9PSAwKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciB0eCxcbiAgICAgIHR5LFxuICAgICAgZGVub21pbmF0b3IgPSBhICogZCAtIGIgKiBjO1xuICAgIGlmIChmb250LnZlcnRpY2FsKSB7XG4gICAgICB0eCA9ICgtdHlEaWZmICogYykgLyBkZW5vbWluYXRvcjtcbiAgICAgIHR5ID0gKHR5RGlmZiAqIGEpIC8gZGVub21pbmF0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4ID0gKHR4RGlmZiAqIGQpIC8gZGVub21pbmF0b3I7XG4gICAgICB0eSA9ICgtdHhEaWZmICogYikgLyBkZW5vbWluYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIHsgd2lkdGg6IHR4LCBoZWlnaHQ6IHR5LCB2YWx1ZTogZm9udC52ZXJ0aWNhbCA/IHR5IDogdHggfTtcbiAgfVxuXG4gIGNhbGNSZW5kZXJNYXRyaXgoY3RtKSB7XG4gICAgLy8gOS40LjQgVGV4dCBTcGFjZSBEZXRhaWxzXG4gICAgdmFyIHRzbSA9IFtcbiAgICAgIHRoaXMuZm9udFNpemUgKiB0aGlzLnRleHRIU2NhbGUsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHRoaXMuZm9udFNpemUsXG4gICAgICAwLFxuICAgICAgdGhpcy50ZXh0UmlzZSxcbiAgICBdO1xuICAgIHJldHVybiBVdGlsLnRyYW5zZm9ybShjdG0sIFV0aWwudHJhbnNmb3JtKHRoaXMudGV4dE1hdHJpeCwgdHNtKSk7XG4gIH1cblxuICBjYXJyaWFnZVJldHVybigpIHtcbiAgICB0aGlzLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KDAsIC10aGlzLmxlYWRpbmcpO1xuICAgIHRoaXMudGV4dE1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHZhciBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgY2xvbmUudGV4dE1hdHJpeCA9IHRoaXMudGV4dE1hdHJpeC5zbGljZSgpO1xuICAgIGNsb25lLnRleHRMaW5lTWF0cml4ID0gdGhpcy50ZXh0TGluZU1hdHJpeC5zbGljZSgpO1xuICAgIGNsb25lLmZvbnRNYXRyaXggPSB0aGlzLmZvbnRNYXRyaXguc2xpY2UoKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cbn1cblxuY2xhc3MgRXZhbFN0YXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jdG0gPSBuZXcgRmxvYXQzMkFycmF5KElERU5USVRZX01BVFJJWCk7XG4gICAgdGhpcy5mb250ID0gbnVsbDtcbiAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcbiAgICB0aGlzLmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7XG4gICAgdGhpcy5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgfVxufVxuXG5jbGFzcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3Ige1xuICBzdGF0aWMgZ2V0IG9wTWFwKCkge1xuICAgIC8vIFNwZWNpZmllcyBwcm9wZXJ0aWVzIGZvciBlYWNoIGNvbW1hbmRcbiAgICAvL1xuICAgIC8vIElmIHZhcmlhYmxlQXJncyA9PT0gdHJ1ZTogWzAsIGBudW1BcmdzYF0gZXhwZWN0ZWRcbiAgICAvLyBJZiB2YXJpYWJsZUFyZ3MgPT09IGZhbHNlOiBleGFjdGx5IGBudW1BcmdzYCBleHBlY3RlZFxuICAgIGNvbnN0IGdldE9QTWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgICAvLyBHcmFwaGljIHN0YXRlXG4gICAgICB0LncgPSB7IGlkOiBPUFMuc2V0TGluZVdpZHRoLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LkogPSB7IGlkOiBPUFMuc2V0TGluZUNhcCwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5qID0geyBpZDogT1BTLnNldExpbmVKb2luLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0Lk0gPSB7IGlkOiBPUFMuc2V0TWl0ZXJMaW1pdCwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5kID0geyBpZDogT1BTLnNldERhc2gsIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQucmkgPSB7IGlkOiBPUFMuc2V0UmVuZGVyaW5nSW50ZW50LCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LmkgPSB7IGlkOiBPUFMuc2V0RmxhdG5lc3MsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuZ3MgPSB7IGlkOiBPUFMuc2V0R1N0YXRlLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LnEgPSB7IGlkOiBPUFMuc2F2ZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5RID0geyBpZDogT1BTLnJlc3RvcmUsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuY20gPSB7IGlkOiBPUFMudHJhbnNmb3JtLCBudW1BcmdzOiA2LCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG5cbiAgICAgIC8vIFBhdGhcbiAgICAgIHQubSA9IHsgaWQ6IE9QUy5tb3ZlVG8sIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQubCA9IHsgaWQ6IE9QUy5saW5lVG8sIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuYyA9IHsgaWQ6IE9QUy5jdXJ2ZVRvLCBudW1BcmdzOiA2LCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LnYgPSB7IGlkOiBPUFMuY3VydmVUbzIsIG51bUFyZ3M6IDQsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQueSA9IHsgaWQ6IE9QUy5jdXJ2ZVRvMywgbnVtQXJnczogNCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5oID0geyBpZDogT1BTLmNsb3NlUGF0aCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5yZSA9IHsgaWQ6IE9QUy5yZWN0YW5nbGUsIG51bUFyZ3M6IDQsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuUyA9IHsgaWQ6IE9QUy5zdHJva2UsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQucyA9IHsgaWQ6IE9QUy5jbG9zZVN0cm9rZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5mID0geyBpZDogT1BTLmZpbGwsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuRiA9IHsgaWQ6IE9QUy5maWxsLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0W1wiZipcIl0gPSB7IGlkOiBPUFMuZW9GaWxsLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LkIgPSB7IGlkOiBPUFMuZmlsbFN0cm9rZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdFtcIkIqXCJdID0geyBpZDogT1BTLmVvRmlsbFN0cm9rZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5iID0geyBpZDogT1BTLmNsb3NlRmlsbFN0cm9rZSwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdFtcImIqXCJdID0geyBpZDogT1BTLmNsb3NlRU9GaWxsU3Ryb2tlLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0Lm4gPSB7IGlkOiBPUFMuZW5kUGF0aCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuXG4gICAgICAvLyBDbGlwcGluZ1xuICAgICAgdC5XID0geyBpZDogT1BTLmNsaXAsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHRbXCJXKlwiXSA9IHsgaWQ6IE9QUy5lb0NsaXAsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcblxuICAgICAgLy8gVGV4dFxuICAgICAgdC5CVCA9IHsgaWQ6IE9QUy5iZWdpblRleHQsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuRVQgPSB7IGlkOiBPUFMuZW5kVGV4dCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UYyA9IHsgaWQ6IE9QUy5zZXRDaGFyU3BhY2luZywgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UdyA9IHsgaWQ6IE9QUy5zZXRXb3JkU3BhY2luZywgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UeiA9IHsgaWQ6IE9QUy5zZXRIU2NhbGUsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuVEwgPSB7IGlkOiBPUFMuc2V0TGVhZGluZywgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UZiA9IHsgaWQ6IE9QUy5zZXRGb250LCBudW1BcmdzOiAyLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LlRyID0geyBpZDogT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LlRzID0geyBpZDogT1BTLnNldFRleHRSaXNlLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LlRkID0geyBpZDogT1BTLm1vdmVUZXh0LCBudW1BcmdzOiAyLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LlREID0geyBpZDogT1BTLnNldExlYWRpbmdNb3ZlVGV4dCwgbnVtQXJnczogMiwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5UbSA9IHsgaWQ6IE9QUy5zZXRUZXh0TWF0cml4LCBudW1BcmdzOiA2LCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0W1wiVCpcIl0gPSB7IGlkOiBPUFMubmV4dExpbmUsIG51bUFyZ3M6IDAsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuVGogPSB7IGlkOiBPUFMuc2hvd1RleHQsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuVEogPSB7IGlkOiBPUFMuc2hvd1NwYWNlZFRleHQsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHRbXCInXCJdID0geyBpZDogT1BTLm5leHRMaW5lU2hvd1RleHQsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHRbJ1wiJ10gPSB7XG4gICAgICAgIGlkOiBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsXG4gICAgICAgIG51bUFyZ3M6IDMsXG4gICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICAvLyBUeXBlMyBmb250c1xuICAgICAgdC5kMCA9IHsgaWQ6IE9QUy5zZXRDaGFyV2lkdGgsIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuZDEgPSB7XG4gICAgICAgIGlkOiBPUFMuc2V0Q2hhcldpZHRoQW5kQm91bmRzLFxuICAgICAgICBudW1BcmdzOiA2LFxuICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlLFxuICAgICAgfTtcblxuICAgICAgLy8gQ29sb3JcbiAgICAgIHQuQ1MgPSB7IGlkOiBPUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZSwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5jcyA9IHsgaWQ6IE9QUy5zZXRGaWxsQ29sb3JTcGFjZSwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5TQyA9IHsgaWQ6IE9QUy5zZXRTdHJva2VDb2xvciwgbnVtQXJnczogNCwgdmFyaWFibGVBcmdzOiB0cnVlIH07XG4gICAgICB0LlNDTiA9IHsgaWQ6IE9QUy5zZXRTdHJva2VDb2xvck4sIG51bUFyZ3M6IDMzLCB2YXJpYWJsZUFyZ3M6IHRydWUgfTtcbiAgICAgIHQuc2MgPSB7IGlkOiBPUFMuc2V0RmlsbENvbG9yLCBudW1BcmdzOiA0LCB2YXJpYWJsZUFyZ3M6IHRydWUgfTtcbiAgICAgIHQuc2NuID0geyBpZDogT1BTLnNldEZpbGxDb2xvck4sIG51bUFyZ3M6IDMzLCB2YXJpYWJsZUFyZ3M6IHRydWUgfTtcbiAgICAgIHQuRyA9IHsgaWQ6IE9QUy5zZXRTdHJva2VHcmF5LCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LmcgPSB7IGlkOiBPUFMuc2V0RmlsbEdyYXksIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuUkcgPSB7IGlkOiBPUFMuc2V0U3Ryb2tlUkdCQ29sb3IsIG51bUFyZ3M6IDMsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQucmcgPSB7IGlkOiBPUFMuc2V0RmlsbFJHQkNvbG9yLCBudW1BcmdzOiAzLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LksgPSB7IGlkOiBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLCBudW1BcmdzOiA0LCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LmsgPSB7IGlkOiBPUFMuc2V0RmlsbENNWUtDb2xvciwgbnVtQXJnczogNCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuXG4gICAgICAvLyBTaGFkaW5nXG4gICAgICB0LnNoID0geyBpZDogT1BTLnNoYWRpbmdGaWxsLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG5cbiAgICAgIC8vIEltYWdlc1xuICAgICAgdC5CSSA9IHsgaWQ6IE9QUy5iZWdpbklubGluZUltYWdlLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LklEID0geyBpZDogT1BTLmJlZ2luSW1hZ2VEYXRhLCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LkVJID0geyBpZDogT1BTLmVuZElubGluZUltYWdlLCBudW1BcmdzOiAxLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG5cbiAgICAgIC8vIFhPYmplY3RzXG4gICAgICB0LkRvID0geyBpZDogT1BTLnBhaW50WE9iamVjdCwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5NUCA9IHsgaWQ6IE9QUy5tYXJrUG9pbnQsIG51bUFyZ3M6IDEsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuRFAgPSB7IGlkOiBPUFMubWFya1BvaW50UHJvcHMsIG51bUFyZ3M6IDIsIHZhcmlhYmxlQXJnczogZmFsc2UgfTtcbiAgICAgIHQuQk1DID0geyBpZDogT1BTLmJlZ2luTWFya2VkQ29udGVudCwgbnVtQXJnczogMSwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuICAgICAgdC5CREMgPSB7XG4gICAgICAgIGlkOiBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsXG4gICAgICAgIG51bUFyZ3M6IDIsXG4gICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UsXG4gICAgICB9O1xuICAgICAgdC5FTUMgPSB7IGlkOiBPUFMuZW5kTWFya2VkQ29udGVudCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuXG4gICAgICAvLyBDb21wYXRpYmlsaXR5XG4gICAgICB0LkJYID0geyBpZDogT1BTLmJlZ2luQ29tcGF0LCBudW1BcmdzOiAwLCB2YXJpYWJsZUFyZ3M6IGZhbHNlIH07XG4gICAgICB0LkVYID0geyBpZDogT1BTLmVuZENvbXBhdCwgbnVtQXJnczogMCwgdmFyaWFibGVBcmdzOiBmYWxzZSB9O1xuXG4gICAgICAvLyAocmVzZXJ2ZWQgcGFydGlhbCBjb21tYW5kcyBmb3IgdGhlIGxleGVyKVxuICAgICAgdC5CTSA9IG51bGw7XG4gICAgICB0LkJEID0gbnVsbDtcbiAgICAgIHQudHJ1ZSA9IG51bGw7XG4gICAgICB0LmZhID0gbnVsbDtcbiAgICAgIHQuZmFsID0gbnVsbDtcbiAgICAgIHQuZmFscyA9IG51bGw7XG4gICAgICB0LmZhbHNlID0gbnVsbDtcbiAgICAgIHQubnUgPSBudWxsO1xuICAgICAgdC5udWwgPSBudWxsO1xuICAgICAgdC5udWxsID0gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJvcE1hcFwiLCBnZXRPUE1hcCgpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTUFYX0lOVkFMSURfUEFUSF9PUFMoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIk1BWF9JTlZBTElEX1BBVEhfT1BTXCIsIDIwKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKSB7XG4gICAgLy8gVE9ETyhtZHVhbik6IHBhc3MgYXJyYXkgb2Yga25vd25Db21tYW5kcyByYXRoZXIgdGhhbiB0aGlzLm9wTWFwXG4gICAgLy8gZGljdGlvbmFyeVxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcih7XG4gICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSwgRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSxcbiAgICAgIHhyZWYsXG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZU1hbmFnZXIgPSBzdGF0ZU1hbmFnZXI7XG4gICAgdGhpcy5ub25Qcm9jZXNzZWRBcmdzID0gW107XG4gICAgdGhpcy5fbnVtSW52YWxpZFBhdGhPUFMgPSAwO1xuICB9XG5cbiAgZ2V0IHNhdmVkU3RhdGVzRGVwdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVNYW5hZ2VyLnN0YXRlU3RhY2subGVuZ3RoO1xuICB9XG5cbiAgLy8gfG9wZXJhdGlvbnwgaXMgYW4gb2JqZWN0IHdpdGggdHdvIGZpZWxkczpcbiAgLy9cbiAgLy8gLSB8Zm58IGlzIGFuIG91dCBwYXJhbS5cbiAgLy9cbiAgLy8gLSB8YXJnc3wgaXMgYW4gaW5vdXQgcGFyYW0uIE9uIGVudHJ5LCBpdCBzaG91bGQgaGF2ZSBvbmUgb2YgdHdvIHZhbHVlcy5cbiAgLy9cbiAgLy8gICAtIEFuIGVtcHR5IGFycmF5LiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjYWxsZXIgaXMgcHJvdmlkaW5nIHRoZVxuICAvLyAgICAgYXJyYXkgaW4gd2hpY2ggdGhlIGFyZ3Mgd2lsbCBiZSBzdG9yZWQgaW4uIFRoZSBjYWxsZXIgc2hvdWxkIHVzZVxuICAvLyAgICAgdGhpcyB2YWx1ZSBpZiBpdCBjYW4gcmV1c2UgYSBzaW5nbGUgYXJyYXkgZm9yIGVhY2ggY2FsbCB0byByZWFkKCkuXG4gIC8vXG4gIC8vICAgLSB8bnVsbHwuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxlciBuZWVkcyB0aGlzIGZ1bmN0aW9uIHRvIGNyZWF0ZVxuICAvLyAgICAgdGhlIGFycmF5IGluIHdoaWNoIGFueSBhcmdzIGFyZSBzdG9yZWQgaW4uIElmIHRoZXJlIGFyZSB6ZXJvIGFyZ3MsXG4gIC8vICAgICB0aGlzIGZ1bmN0aW9uIHdpbGwgbGVhdmUgfG9wZXJhdGlvbi5hcmdzfCBhcyB8bnVsbHwgKHRodXMgYXZvaWRpbmdcbiAgLy8gICAgIGFsbG9jYXRpb25zIHRoYXQgd291bGQgb2NjdXIgaWYgd2UgdXNlZCBhbiBlbXB0eSBhcnJheSB0byByZXByZXNlbnRcbiAgLy8gICAgIHplcm8gYXJndW1lbnRzKS4gT3RoZXJ3aXNlLCBpdCB3aWxsIHJlcGxhY2UgfG51bGx8IHdpdGggYSBuZXcgYXJyYXlcbiAgLy8gICAgIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cy4gVGhlIGNhbGxlciBzaG91bGQgdXNlIHRoaXMgdmFsdWUgaWYgaXRcbiAgLy8gICAgIGNhbm5vdCByZXVzZSBhbiBhcnJheSBmb3IgZWFjaCBjYWxsIHRvIHJlYWQoKS5cbiAgLy9cbiAgLy8gVGhlc2UgdHdvIG1vZGVzIGFyZSBwcmVzZW50IGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IGhvdCBhbmQgc29cbiAgLy8gYXZvaWRpbmcgYWxsb2NhdGlvbnMgd2hlcmUgcG9zc2libGUgaXMgd29ydGh3aGlsZS5cbiAgLy9cbiAgcmVhZChvcGVyYXRpb24pIHtcbiAgICB2YXIgYXJncyA9IG9wZXJhdGlvbi5hcmdzO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgb2JqID0gdGhpcy5wYXJzZXIuZ2V0T2JqKCk7XG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ21kKSB7XG4gICAgICAgIHZhciBjbWQgPSBvYmouY21kO1xuICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGlzIHZhbGlkXG4gICAgICAgIHZhciBvcFNwZWMgPSBFdmFsdWF0b3JQcmVwcm9jZXNzb3Iub3BNYXBbY21kXTtcbiAgICAgICAgaWYgKCFvcFNwZWMpIHtcbiAgICAgICAgICB3YXJuKGBVbmtub3duIGNvbW1hbmQgXCIke2NtZH1cIi5gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbiA9IG9wU3BlYy5pZDtcbiAgICAgICAgdmFyIG51bUFyZ3MgPSBvcFNwZWMubnVtQXJncztcbiAgICAgICAgdmFyIGFyZ3NMZW5ndGggPSBhcmdzICE9PSBudWxsID8gYXJncy5sZW5ndGggOiAwO1xuXG4gICAgICAgIGlmICghb3BTcGVjLnZhcmlhYmxlQXJncykge1xuICAgICAgICAgIC8vIFBvc3RzY3JpcHQgY29tbWFuZHMgY2FuIGJlIG5lc3RlZCwgZS5nLiAvRjIgL0dTMiBncyA1LjcxMSBUZlxuICAgICAgICAgIGlmIChhcmdzTGVuZ3RoICE9PSBudW1BcmdzKSB7XG4gICAgICAgICAgICB2YXIgbm9uUHJvY2Vzc2VkQXJncyA9IHRoaXMubm9uUHJvY2Vzc2VkQXJncztcbiAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoID4gbnVtQXJncykge1xuICAgICAgICAgICAgICBub25Qcm9jZXNzZWRBcmdzLnB1c2goYXJncy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgYXJnc0xlbmd0aC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGggPCBudW1BcmdzICYmIG5vblByb2Nlc3NlZEFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGFyZ3MudW5zaGlmdChub25Qcm9jZXNzZWRBcmdzLnBvcCgpKTtcbiAgICAgICAgICAgICAgYXJnc0xlbmd0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhcmdzTGVuZ3RoIDwgbnVtQXJncykge1xuICAgICAgICAgICAgY29uc3QgcGFydGlhbE1zZyA9XG4gICAgICAgICAgICAgIGBjb21tYW5kICR7Y21kfTogZXhwZWN0ZWQgJHtudW1BcmdzfSBhcmdzLCBgICtcbiAgICAgICAgICAgICAgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYDtcblxuICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBwYXRoIG9wZXJhdG9ycywgaW4gcGFydGljdWxhciwgY2FuIHJlc3VsdCBpbiBmYWlybHlcbiAgICAgICAgICAgIC8vIGNoYW90aWMgcmVuZGVyaW5nIGFydGlmYWN0cy4gSGVuY2UgdGhlIGZvbGxvd2luZyBoZXVyaXN0aWNzIGlzXG4gICAgICAgICAgICAvLyB1c2VkIHRvIGVycm9yLCByYXRoZXIgdGhhbiBqdXN0IHdhcm4sIG9uY2UgYSBudW1iZXIgb2YgaW52YWxpZFxuICAgICAgICAgICAgLy8gcGF0aCBvcGVyYXRvcnMgaGF2ZSBiZWVuIGVuY291bnRlcmVkIChmaXhlcyBidWcxNDQzMTQwLnBkZikuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZuID49IE9QUy5tb3ZlVG8gJiZcbiAgICAgICAgICAgICAgZm4gPD0gT1BTLmVuZFBhdGggJiYgLy8gUGF0aCBvcGVyYXRvclxuICAgICAgICAgICAgICArK3RoaXMuX251bUludmFsaWRQYXRoT1BTID5cbiAgICAgICAgICAgICAgICBFdmFsdWF0b3JQcmVwcm9jZXNzb3IuTUFYX0lOVkFMSURfUEFUSF9PUFNcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgJHtwYXJ0aWFsTXNnfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2UgcmVjZWl2ZSB0b28gZmV3IGFyZ3VtZW50cywgaXQncyBub3QgcG9zc2libGUgdG8gZXhlY3V0ZVxuICAgICAgICAgICAgLy8gdGhlIGNvbW1hbmQsIGhlbmNlIHdlIHNraXAgdGhlIGNvbW1hbmQuXG4gICAgICAgICAgICB3YXJuKGBTa2lwcGluZyAke3BhcnRpYWxNc2d9YCk7XG4gICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJnc0xlbmd0aCA+IG51bUFyZ3MpIHtcbiAgICAgICAgICBpbmZvKFxuICAgICAgICAgICAgYENvbW1hbmQgJHtjbWR9OiBleHBlY3RlZCBbMCwgJHtudW1BcmdzfV0gYXJncywgYCArXG4gICAgICAgICAgICAgIGBidXQgcmVjZWl2ZWQgJHthcmdzTGVuZ3RofSBhcmdzLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETyBmaWd1cmUgb3V0IGhvdyB0byB0eXBlLWNoZWNrIHZhcmFyZyBmdW5jdGlvbnNcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncyk7XG5cbiAgICAgICAgb3BlcmF0aW9uLmZuID0gZm47XG4gICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJncztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob2JqID09PSBFT0YpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBtb3JlIGNvbW1hbmRzXG4gICAgICB9XG4gICAgICAvLyBhcmd1bWVudFxuICAgICAgaWYgKG9iaiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoYXJncyA9PT0gbnVsbCkge1xuICAgICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBhcmdzLnB1c2gob2JqKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMzMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJUb28gbWFueSBhcmd1bWVudHNcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncykge1xuICAgIHN3aXRjaCAoZm4gfCAwKSB7XG4gICAgICBjYXNlIE9QUy5zYXZlOlxuICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPUFMucmVzdG9yZTpcbiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIucmVzdG9yZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT1BTLnRyYW5zZm9ybTpcbiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIudHJhbnNmb3JtKGFyZ3MpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGFydGlhbEV2YWx1YXRvciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIENNYXBDb21wcmVzc2lvblR5cGUsXG4gIEZvcm1hdEVycm9yLFxuICBpc1N0cmluZyxcbiAgdW5yZWFjaGFibGUsXG4gIHdhcm4sXG59IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgaXNDbWQsIGlzRU9GLCBpc05hbWUsIGlzU3RyZWFtIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgTGV4ZXIgfSBmcm9tIFwiLi9wYXJzZXIuanNcIjtcbmltcG9ydCB7IE1pc3NpbmdEYXRhRXhjZXB0aW9uIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5cbnZhciBCVUlMVF9JTl9DTUFQUyA9IFtcbiAgLy8gPDwgU3RhcnQgdW5pY29kZSBtYXBzLlxuICBcIkFkb2JlLUdCMS1VQ1MyXCIsXG4gIFwiQWRvYmUtQ05TMS1VQ1MyXCIsXG4gIFwiQWRvYmUtSmFwYW4xLVVDUzJcIixcbiAgXCJBZG9iZS1Lb3JlYTEtVUNTMlwiLFxuICAvLyA+PiBFbmQgdW5pY29kZSBtYXBzLlxuICBcIjc4LUVVQy1IXCIsXG4gIFwiNzgtRVVDLVZcIixcbiAgXCI3OC1IXCIsXG4gIFwiNzgtUktTSi1IXCIsXG4gIFwiNzgtUktTSi1WXCIsXG4gIFwiNzgtVlwiLFxuICBcIjc4bXMtUktTSi1IXCIsXG4gIFwiNzhtcy1SS1NKLVZcIixcbiAgXCI4M3B2LVJLU0otSFwiLFxuICBcIjkwbXMtUktTSi1IXCIsXG4gIFwiOTBtcy1SS1NKLVZcIixcbiAgXCI5MG1zcC1SS1NKLUhcIixcbiAgXCI5MG1zcC1SS1NKLVZcIixcbiAgXCI5MHB2LVJLU0otSFwiLFxuICBcIjkwcHYtUktTSi1WXCIsXG4gIFwiQWRkLUhcIixcbiAgXCJBZGQtUktTSi1IXCIsXG4gIFwiQWRkLVJLU0otVlwiLFxuICBcIkFkZC1WXCIsXG4gIFwiQWRvYmUtQ05TMS0wXCIsXG4gIFwiQWRvYmUtQ05TMS0xXCIsXG4gIFwiQWRvYmUtQ05TMS0yXCIsXG4gIFwiQWRvYmUtQ05TMS0zXCIsXG4gIFwiQWRvYmUtQ05TMS00XCIsXG4gIFwiQWRvYmUtQ05TMS01XCIsXG4gIFwiQWRvYmUtQ05TMS02XCIsXG4gIFwiQWRvYmUtR0IxLTBcIixcbiAgXCJBZG9iZS1HQjEtMVwiLFxuICBcIkFkb2JlLUdCMS0yXCIsXG4gIFwiQWRvYmUtR0IxLTNcIixcbiAgXCJBZG9iZS1HQjEtNFwiLFxuICBcIkFkb2JlLUdCMS01XCIsXG4gIFwiQWRvYmUtSmFwYW4xLTBcIixcbiAgXCJBZG9iZS1KYXBhbjEtMVwiLFxuICBcIkFkb2JlLUphcGFuMS0yXCIsXG4gIFwiQWRvYmUtSmFwYW4xLTNcIixcbiAgXCJBZG9iZS1KYXBhbjEtNFwiLFxuICBcIkFkb2JlLUphcGFuMS01XCIsXG4gIFwiQWRvYmUtSmFwYW4xLTZcIixcbiAgXCJBZG9iZS1Lb3JlYTEtMFwiLFxuICBcIkFkb2JlLUtvcmVhMS0xXCIsXG4gIFwiQWRvYmUtS29yZWExLTJcIixcbiAgXCJCNS1IXCIsXG4gIFwiQjUtVlwiLFxuICBcIkI1cGMtSFwiLFxuICBcIkI1cGMtVlwiLFxuICBcIkNOUy1FVUMtSFwiLFxuICBcIkNOUy1FVUMtVlwiLFxuICBcIkNOUzEtSFwiLFxuICBcIkNOUzEtVlwiLFxuICBcIkNOUzItSFwiLFxuICBcIkNOUzItVlwiLFxuICBcIkVUSEstQjUtSFwiLFxuICBcIkVUSEstQjUtVlwiLFxuICBcIkVUZW4tQjUtSFwiLFxuICBcIkVUZW4tQjUtVlwiLFxuICBcIkVUZW5tcy1CNS1IXCIsXG4gIFwiRVRlbm1zLUI1LVZcIixcbiAgXCJFVUMtSFwiLFxuICBcIkVVQy1WXCIsXG4gIFwiRXh0LUhcIixcbiAgXCJFeHQtUktTSi1IXCIsXG4gIFwiRXh0LVJLU0otVlwiLFxuICBcIkV4dC1WXCIsXG4gIFwiR0ItRVVDLUhcIixcbiAgXCJHQi1FVUMtVlwiLFxuICBcIkdCLUhcIixcbiAgXCJHQi1WXCIsXG4gIFwiR0JLLUVVQy1IXCIsXG4gIFwiR0JLLUVVQy1WXCIsXG4gIFwiR0JLMkstSFwiLFxuICBcIkdCSzJLLVZcIixcbiAgXCJHQktwLUVVQy1IXCIsXG4gIFwiR0JLcC1FVUMtVlwiLFxuICBcIkdCVC1FVUMtSFwiLFxuICBcIkdCVC1FVUMtVlwiLFxuICBcIkdCVC1IXCIsXG4gIFwiR0JULVZcIixcbiAgXCJHQlRwYy1FVUMtSFwiLFxuICBcIkdCVHBjLUVVQy1WXCIsXG4gIFwiR0JwYy1FVUMtSFwiLFxuICBcIkdCcGMtRVVDLVZcIixcbiAgXCJIXCIsXG4gIFwiSEtkbGEtQjUtSFwiLFxuICBcIkhLZGxhLUI1LVZcIixcbiAgXCJIS2RsYi1CNS1IXCIsXG4gIFwiSEtkbGItQjUtVlwiLFxuICBcIkhLZ2Njcy1CNS1IXCIsXG4gIFwiSEtnY2NzLUI1LVZcIixcbiAgXCJIS20zMTQtQjUtSFwiLFxuICBcIkhLbTMxNC1CNS1WXCIsXG4gIFwiSEttNDcxLUI1LUhcIixcbiAgXCJIS200NzEtQjUtVlwiLFxuICBcIkhLc2NzLUI1LUhcIixcbiAgXCJIS3Njcy1CNS1WXCIsXG4gIFwiSGFua2FrdVwiLFxuICBcIkhpcmFnYW5hXCIsXG4gIFwiS1NDLUVVQy1IXCIsXG4gIFwiS1NDLUVVQy1WXCIsXG4gIFwiS1NDLUhcIixcbiAgXCJLU0MtSm9oYWItSFwiLFxuICBcIktTQy1Kb2hhYi1WXCIsXG4gIFwiS1NDLVZcIixcbiAgXCJLU0Ntcy1VSEMtSFwiLFxuICBcIktTQ21zLVVIQy1IVy1IXCIsXG4gIFwiS1NDbXMtVUhDLUhXLVZcIixcbiAgXCJLU0Ntcy1VSEMtVlwiLFxuICBcIktTQ3BjLUVVQy1IXCIsXG4gIFwiS1NDcGMtRVVDLVZcIixcbiAgXCJLYXRha2FuYVwiLFxuICBcIk5XUC1IXCIsXG4gIFwiTldQLVZcIixcbiAgXCJSS1NKLUhcIixcbiAgXCJSS1NKLVZcIixcbiAgXCJSb21hblwiLFxuICBcIlVuaUNOUy1VQ1MyLUhcIixcbiAgXCJVbmlDTlMtVUNTMi1WXCIsXG4gIFwiVW5pQ05TLVVURjE2LUhcIixcbiAgXCJVbmlDTlMtVVRGMTYtVlwiLFxuICBcIlVuaUNOUy1VVEYzMi1IXCIsXG4gIFwiVW5pQ05TLVVURjMyLVZcIixcbiAgXCJVbmlDTlMtVVRGOC1IXCIsXG4gIFwiVW5pQ05TLVVURjgtVlwiLFxuICBcIlVuaUdCLVVDUzItSFwiLFxuICBcIlVuaUdCLVVDUzItVlwiLFxuICBcIlVuaUdCLVVURjE2LUhcIixcbiAgXCJVbmlHQi1VVEYxNi1WXCIsXG4gIFwiVW5pR0ItVVRGMzItSFwiLFxuICBcIlVuaUdCLVVURjMyLVZcIixcbiAgXCJVbmlHQi1VVEY4LUhcIixcbiAgXCJVbmlHQi1VVEY4LVZcIixcbiAgXCJVbmlKSVMtVUNTMi1IXCIsXG4gIFwiVW5pSklTLVVDUzItSFctSFwiLFxuICBcIlVuaUpJUy1VQ1MyLUhXLVZcIixcbiAgXCJVbmlKSVMtVUNTMi1WXCIsXG4gIFwiVW5pSklTLVVURjE2LUhcIixcbiAgXCJVbmlKSVMtVVRGMTYtVlwiLFxuICBcIlVuaUpJUy1VVEYzMi1IXCIsXG4gIFwiVW5pSklTLVVURjMyLVZcIixcbiAgXCJVbmlKSVMtVVRGOC1IXCIsXG4gIFwiVW5pSklTLVVURjgtVlwiLFxuICBcIlVuaUpJUzIwMDQtVVRGMTYtSFwiLFxuICBcIlVuaUpJUzIwMDQtVVRGMTYtVlwiLFxuICBcIlVuaUpJUzIwMDQtVVRGMzItSFwiLFxuICBcIlVuaUpJUzIwMDQtVVRGMzItVlwiLFxuICBcIlVuaUpJUzIwMDQtVVRGOC1IXCIsXG4gIFwiVW5pSklTMjAwNC1VVEY4LVZcIixcbiAgXCJVbmlKSVNQcm8tVUNTMi1IVy1WXCIsXG4gIFwiVW5pSklTUHJvLVVDUzItVlwiLFxuICBcIlVuaUpJU1Byby1VVEY4LVZcIixcbiAgXCJVbmlKSVNYMDIxMy1VVEYzMi1IXCIsXG4gIFwiVW5pSklTWDAyMTMtVVRGMzItVlwiLFxuICBcIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1IXCIsXG4gIFwiVW5pSklTWDAyMTMyMDA0LVVURjMyLVZcIixcbiAgXCJVbmlLUy1VQ1MyLUhcIixcbiAgXCJVbmlLUy1VQ1MyLVZcIixcbiAgXCJVbmlLUy1VVEYxNi1IXCIsXG4gIFwiVW5pS1MtVVRGMTYtVlwiLFxuICBcIlVuaUtTLVVURjMyLUhcIixcbiAgXCJVbmlLUy1VVEYzMi1WXCIsXG4gIFwiVW5pS1MtVVRGOC1IXCIsXG4gIFwiVW5pS1MtVVRGOC1WXCIsXG4gIFwiVlwiLFxuICBcIldQLVN5bWJvbFwiLFxuXTtcblxuLy8gSGV1cmlzdGljIHRvIGF2b2lkIGhhbmdpbmcgdGhlIHdvcmtlci10aHJlYWQgZm9yIENNYXAgZGF0YSB3aXRoIHJpZGljdWxvdXNseVxuLy8gbGFyZ2UgcmFuZ2VzLCBzdWNoIGFzIGUuZy4gMHhGRkZGRkZGRiAoZml4ZXMgaXNzdWUxMTkyMl9yZWR1Y2VkLnBkZikuXG5jb25zdCBNQVhfTUFQX1JBTkdFID0gMiAqKiAyNCAtIDE7IC8vID0gMHhGRkZGRkZcblxuLy8gQ01hcCwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggVHJ1ZVR5cGUncyBjbWFwLlxuY2xhc3MgQ01hcCB7XG4gIGNvbnN0cnVjdG9yKGJ1aWx0SW5DTWFwID0gZmFsc2UpIHtcbiAgICAvLyBDb2Rlc3BhY2UgcmFuZ2VzIGFyZSBzdG9yZWQgYXMgZm9sbG93czpcbiAgICAvLyBbWzFCeXRlUGFpcnNdLCBbMkJ5dGVQYWlyc10sIFszQnl0ZVBhaXJzXSwgWzRCeXRlUGFpcnNdXVxuICAgIC8vIHdoZXJlIG5CeXRlUGFpcnMgYXJlIHJhbmdlcyBlLmcuIFtsb3cxLCBoaWdoMSwgbG93MiwgaGlnaDIsIC4uLl1cbiAgICB0aGlzLmNvZGVzcGFjZVJhbmdlcyA9IFtbXSwgW10sIFtdLCBbXV07XG4gICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMgPSAwO1xuICAgIC8vIE1hcCBlbnRyaWVzIGhhdmUgb25lIG9mIHR3byBmb3Jtcy5cbiAgICAvLyAtIGNpZCBjaGFycyBhcmUgMTYtYml0IHVuc2lnbmVkIGludGVnZXJzLCBzdG9yZWQgYXMgaW50ZWdlcnMuXG4gICAgLy8gLSBiZiBjaGFycyBhcmUgdmFyaWFibGUtbGVuZ3RoIGJ5dGUgc2VxdWVuY2VzLCBzdG9yZWQgYXMgc3RyaW5ncywgd2l0aFxuICAgIC8vICAgb25lIGJ5dGUgcGVyIGNoYXJhY3Rlci5cbiAgICB0aGlzLl9tYXAgPSBbXTtcbiAgICB0aGlzLm5hbWUgPSBcIlwiO1xuICAgIHRoaXMudmVydGljYWwgPSBmYWxzZTtcbiAgICB0aGlzLnVzZUNNYXAgPSBudWxsO1xuICAgIHRoaXMuYnVpbHRJbkNNYXAgPSBidWlsdEluQ01hcDtcbiAgfVxuXG4gIGFkZENvZGVzcGFjZVJhbmdlKG4sIGxvdywgaGlnaCkge1xuICAgIHRoaXMuY29kZXNwYWNlUmFuZ2VzW24gLSAxXS5wdXNoKGxvdywgaGlnaCk7XG4gICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMrKztcbiAgfVxuXG4gIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7XG4gICAgaWYgKGhpZ2ggLSBsb3cgPiBNQVhfTUFQX1JBTkdFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtYXBDaWRSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS5cIik7XG4gICAgfVxuICAgIHdoaWxlIChsb3cgPD0gaGlnaCkge1xuICAgICAgdGhpcy5fbWFwW2xvdysrXSA9IGRzdExvdysrO1xuICAgIH1cbiAgfVxuXG4gIG1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHtcbiAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1hcEJmUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuXCIpO1xuICAgIH1cbiAgICB2YXIgbGFzdEJ5dGUgPSBkc3RMb3cubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3c7XG4gICAgICAvLyBPbmx5IHRoZSBsYXN0IGJ5dGUgaGFzIHRvIGJlIGluY3JlbWVudGVkLlxuICAgICAgZHN0TG93ID1cbiAgICAgICAgZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSkgK1xuICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGRzdExvdy5jaGFyQ29kZUF0KGxhc3RCeXRlKSArIDEpO1xuICAgIH1cbiAgfVxuXG4gIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHtcbiAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLlwiKTtcbiAgICB9XG4gICAgY29uc3QgaWkgPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChsb3cgPD0gaGlnaCAmJiBpIDwgaWkpIHtcbiAgICAgIHRoaXMuX21hcFtsb3ddID0gYXJyYXlbaSsrXTtcbiAgICAgICsrbG93O1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoaXMgaXMgdXNlZCBmb3IgYm90aCBiZiBhbmQgY2lkIGNoYXJzLlxuICBtYXBPbmUoc3JjLCBkc3QpIHtcbiAgICB0aGlzLl9tYXBbc3JjXSA9IGRzdDtcbiAgfVxuXG4gIGxvb2t1cChjb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcFtjb2RlXTtcbiAgfVxuXG4gIGNvbnRhaW5zKGNvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgLy8gTW9zdCBtYXBzIGhhdmUgZmV3ZXIgdGhhbiA2NTUzNiBlbnRyaWVzLCBhbmQgZm9yIHRob3NlIHdlIHVzZSBub3JtYWxcbiAgICAvLyBhcnJheSBpdGVyYXRpb24uIEJ1dCByZWFsbHkgc3BhcnNlIHRhYmxlcyBhcmUgcG9zc2libGUgLS0gZS5nLiB3aXRoXG4gICAgLy8gaW5kaWNlcyBpbiB0aGUgKmJpbGxpb25zKi4gRm9yIHN1Y2ggdGFibGVzIHdlIHVzZSBmb3IuLmluLCB3aGljaCBpc24ndFxuICAgIC8vIGlkZWFsIGJlY2F1c2UgaXQgc3RyaW5naWZpZXMgdGhlIGluZGljZXMgZm9yIGFsbCBwcmVzZW50IGVsZW1lbnRzLCBidXRcbiAgICAvLyBpdCBkb2VzIGF2b2lkIGl0ZXJhdGluZyBvdmVyIGV2ZXJ5IHVuZGVmaW5lZCBlbnRyeS5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgY29uc3QgbGVuZ3RoID0gbWFwLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDw9IDB4MTAwMDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG1hcFtpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGkgaW4gbWFwKSB7XG4gICAgICAgIGNhbGxiYWNrKGksIG1hcFtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hhckNvZGVPZih2YWx1ZSkge1xuICAgIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgaXMgKmV4dHJlbWVseSogaW5lZmZpY2llbnQgZm9yIGFycmF5cyB3aGljaFxuICAgIC8vIGFyZSBib3RoIHZlcnkgc3BhcnNlIGFuZCB2ZXJ5IGxhcmdlIChzZWUgaXNzdWU4MzcyLnBkZikuXG4gICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgIGlmIChtYXAubGVuZ3RoIDw9IDB4MTAwMDApIHtcbiAgICAgIHJldHVybiBtYXAuaW5kZXhPZih2YWx1ZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7XG4gICAgICBpZiAobWFwW2NoYXJDb2RlXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJDb2RlIHwgMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZ2V0TWFwKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXA7XG4gIH1cblxuICByZWFkQ2hhckNvZGUoc3RyLCBvZmZzZXQsIG91dCkge1xuICAgIGxldCBjID0gMDtcbiAgICBjb25zdCBjb2Rlc3BhY2VSYW5nZXMgPSB0aGlzLmNvZGVzcGFjZVJhbmdlcztcbiAgICAvLyA5LjcuNi4yIENNYXAgTWFwcGluZ1xuICAgIC8vIFRoZSBjb2RlIGxlbmd0aCBpcyBhdCBtb3N0IDQuXG4gICAgZm9yIChsZXQgbiA9IDAsIG5uID0gY29kZXNwYWNlUmFuZ2VzLmxlbmd0aDsgbiA8IG5uOyBuKyspIHtcbiAgICAgIGMgPSAoKGMgPDwgOCkgfCBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyBuKSkgPj4+IDA7XG4gICAgICAvLyBDaGVjayBlYWNoIGNvZGVzcGFjZSByYW5nZSB0byBzZWUgaWYgaXQgZmFsbHMgd2l0aGluLlxuICAgICAgY29uc3QgY29kZXNwYWNlUmFuZ2UgPSBjb2Rlc3BhY2VSYW5nZXNbbl07XG4gICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazsgKSB7XG4gICAgICAgIGNvbnN0IGxvdyA9IGNvZGVzcGFjZVJhbmdlW2srK107XG4gICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdO1xuICAgICAgICBpZiAoYyA+PSBsb3cgJiYgYyA8PSBoaWdoKSB7XG4gICAgICAgICAgb3V0LmNoYXJjb2RlID0gYztcbiAgICAgICAgICBvdXQubGVuZ3RoID0gbiArIDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG91dC5jaGFyY29kZSA9IDA7XG4gICAgb3V0Lmxlbmd0aCA9IDE7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXAubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGlzSWRlbnRpdHlDTWFwKCkge1xuICAgIGlmICghKHRoaXMubmFtZSA9PT0gXCJJZGVudGl0eS1IXCIgfHwgdGhpcy5uYW1lID09PSBcIklkZW50aXR5LVZcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21hcC5sZW5ndGggIT09IDB4MTAwMDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAweDEwMDAwOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl9tYXBbaV0gIT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBBIHNwZWNpYWwgY2FzZSBvZiBDTWFwLCB3aGVyZSB0aGUgX21hcCBhcnJheSBpbXBsaWNpdGx5IGhhcyBhIGxlbmd0aCBvZlxuLy8gNjU1MzYgYW5kIGVhY2ggZWxlbWVudCBpcyBlcXVhbCB0byBpdHMgaW5kZXguXG5jbGFzcyBJZGVudGl0eUNNYXAgZXh0ZW5kcyBDTWFwIHtcbiAgY29uc3RydWN0b3IodmVydGljYWwsIG4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy52ZXJ0aWNhbCA9IHZlcnRpY2FsO1xuICAgIHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UobiwgMCwgMHhmZmZmKTtcbiAgfVxuXG4gIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7XG4gICAgdW5yZWFjaGFibGUoXCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2VcIik7XG4gIH1cblxuICBtYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7XG4gICAgdW5yZWFjaGFibGUoXCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZVwiKTtcbiAgfVxuXG4gIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHtcbiAgICB1bnJlYWNoYWJsZShcInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlVG9BcnJheVwiKTtcbiAgfVxuXG4gIG1hcE9uZShzcmMsIGRzdCkge1xuICAgIHVucmVhY2hhYmxlKFwic2hvdWxkIG5vdCBjYWxsIG1hcENpZE9uZVwiKTtcbiAgfVxuXG4gIGxvb2t1cChjb2RlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29kZSkgJiYgY29kZSA8PSAweGZmZmYgPyBjb2RlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgY29udGFpbnMoY29kZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpICYmIGNvZGUgPD0gMHhmZmZmO1xuICB9XG5cbiAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKSB7XG4gICAgICBjYWxsYmFjayhpLCBpKTtcbiAgICB9XG4gIH1cblxuICBjaGFyQ29kZU9mKHZhbHVlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlIDw9IDB4ZmZmZiA/IHZhbHVlIDogLTE7XG4gIH1cblxuICBnZXRNYXAoKSB7XG4gICAgLy8gU29tZXRpbWVzIGlkZW50aXR5IG1hcHMgbXVzdCBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBpdCdzIHJhcmUuXG4gICAgY29uc3QgbWFwID0gbmV3IEFycmF5KDB4MTAwMDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKSB7XG4gICAgICBtYXBbaV0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gMHgxMDAwMDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnZXR0ZXItcmV0dXJuXG4gIGdldCBpc0lkZW50aXR5Q01hcCgpIHtcbiAgICB1bnJlYWNoYWJsZShcInNob3VsZCBub3QgYWNjZXNzIC5pc0lkZW50aXR5Q01hcFwiKTtcbiAgfVxufVxuXG52YXIgQmluYXJ5Q01hcFJlYWRlciA9IChmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gaGV4VG9JbnQoYSwgc2l6ZSkge1xuICAgIHZhciBuID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzaXplOyBpKyspIHtcbiAgICAgIG4gPSAobiA8PCA4KSB8IGFbaV07XG4gICAgfVxuICAgIHJldHVybiBuID4+PiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gaGV4VG9TdHIoYSwgc2l6ZSkge1xuICAgIC8vIFRoaXMgY29kZSBpcyBob3QuIFNwZWNpYWwtY2FzZSBzb21lIGNvbW1vbiB2YWx1ZXMgdG8gYXZvaWQgY3JlYXRpbmcgYW5cbiAgICAvLyBvYmplY3Qgd2l0aCBzdWJhcnJheSgpLlxuICAgIGlmIChzaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgaWYgKHNpemUgPT09IDMpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRIZXgoYSwgYiwgc2l6ZSkge1xuICAgIHZhciBjID0gMDtcbiAgICBmb3IgKHZhciBpID0gc2l6ZTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGMgKz0gYVtpXSArIGJbaV07XG4gICAgICBhW2ldID0gYyAmIDI1NTtcbiAgICAgIGMgPj49IDg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5jSGV4KGEsIHNpemUpIHtcbiAgICB2YXIgYyA9IDE7XG4gICAgZm9yICh2YXIgaSA9IHNpemU7IGkgPj0gMCAmJiBjID4gMDsgaS0tKSB7XG4gICAgICBjICs9IGFbaV07XG4gICAgICBhW2ldID0gYyAmIDI1NTtcbiAgICAgIGMgPj49IDg7XG4gICAgfVxuICB9XG5cbiAgdmFyIE1BWF9OVU1fU0laRSA9IDE2O1xuICB2YXIgTUFYX0VOQ09ERURfTlVNX1NJWkUgPSAxOTsgLy8gY2VpbChNQVhfTlVNX1NJWkUgKiA3IC8gOClcblxuICBmdW5jdGlvbiBCaW5hcnlDTWFwU3RyZWFtKGRhdGEpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMuZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgdGhpcy50bXBCdWYgPSBuZXcgVWludDhBcnJheShNQVhfRU5DT0RFRF9OVU1fU0laRSk7XG4gIH1cblxuICBCaW5hcnlDTWFwU3RyZWFtLnByb3RvdHlwZSA9IHtcbiAgICByZWFkQnl0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmVuZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107XG4gICAgfSxcbiAgICByZWFkTnVtYmVyKCkge1xuICAgICAgdmFyIG4gPSAwO1xuICAgICAgdmFyIGxhc3Q7XG4gICAgICBkbyB7XG4gICAgICAgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpO1xuICAgICAgICBpZiAoYiA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJ1bmV4cGVjdGVkIEVPRiBpbiBiY21hcFwiKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gIShiICYgMHg4MCk7XG4gICAgICAgIG4gPSAobiA8PCA3KSB8IChiICYgMHg3Zik7XG4gICAgICB9IHdoaWxlICghbGFzdCk7XG4gICAgICByZXR1cm4gbjtcbiAgICB9LFxuICAgIHJlYWRTaWduZWQoKSB7XG4gICAgICB2YXIgbiA9IHRoaXMucmVhZE51bWJlcigpO1xuICAgICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7XG4gICAgfSxcbiAgICByZWFkSGV4KG51bSwgc2l6ZSkge1xuICAgICAgbnVtLnNldCh0aGlzLmJ1ZmZlci5zdWJhcnJheSh0aGlzLnBvcywgdGhpcy5wb3MgKyBzaXplICsgMSkpO1xuICAgICAgdGhpcy5wb3MgKz0gc2l6ZSArIDE7XG4gICAgfSxcbiAgICByZWFkSGV4TnVtYmVyKG51bSwgc2l6ZSkge1xuICAgICAgdmFyIGxhc3Q7XG4gICAgICB2YXIgc3RhY2sgPSB0aGlzLnRtcEJ1ZixcbiAgICAgICAgc3AgPSAwO1xuICAgICAgZG8ge1xuICAgICAgICB2YXIgYiA9IHRoaXMucmVhZEJ5dGUoKTtcbiAgICAgICAgaWYgKGIgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwidW5leHBlY3RlZCBFT0YgaW4gYmNtYXBcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9ICEoYiAmIDB4ODApO1xuICAgICAgICBzdGFja1tzcCsrXSA9IGIgJiAweDdmO1xuICAgICAgfSB3aGlsZSAoIWxhc3QpO1xuICAgICAgdmFyIGkgPSBzaXplLFxuICAgICAgICBidWZmZXIgPSAwLFxuICAgICAgICBidWZmZXJTaXplID0gMDtcbiAgICAgIHdoaWxlIChpID49IDApIHtcbiAgICAgICAgd2hpbGUgKGJ1ZmZlclNpemUgPCA4ICYmIHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBidWZmZXIgPSAoc3RhY2tbLS1zcF0gPDwgYnVmZmVyU2l6ZSkgfCBidWZmZXI7XG4gICAgICAgICAgYnVmZmVyU2l6ZSArPSA3O1xuICAgICAgICB9XG4gICAgICAgIG51bVtpXSA9IGJ1ZmZlciAmIDI1NTtcbiAgICAgICAgaS0tO1xuICAgICAgICBidWZmZXIgPj49IDg7XG4gICAgICAgIGJ1ZmZlclNpemUgLT0gODtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlYWRIZXhTaWduZWQobnVtLCBzaXplKSB7XG4gICAgICB0aGlzLnJlYWRIZXhOdW1iZXIobnVtLCBzaXplKTtcbiAgICAgIHZhciBzaWduID0gbnVtW3NpemVdICYgMSA/IDI1NSA6IDA7XG4gICAgICB2YXIgYyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzaXplOyBpKyspIHtcbiAgICAgICAgYyA9ICgoYyAmIDEpIDw8IDgpIHwgbnVtW2ldO1xuICAgICAgICBudW1baV0gPSAoYyA+PiAxKSBeIHNpZ247XG4gICAgICB9XG4gICAgfSxcbiAgICByZWFkU3RyaW5nKCkge1xuICAgICAgdmFyIGxlbiA9IHRoaXMucmVhZE51bWJlcigpO1xuICAgICAgdmFyIHMgPSBcIlwiO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5yZWFkTnVtYmVyKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBwcm9jZXNzQmluYXJ5Q01hcChkYXRhLCBjTWFwLCBleHRlbmQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHN0cmVhbSA9IG5ldyBCaW5hcnlDTWFwU3RyZWFtKGRhdGEpO1xuICAgICAgdmFyIGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuICAgICAgY01hcC52ZXJ0aWNhbCA9ICEhKGhlYWRlciAmIDEpO1xuXG4gICAgICB2YXIgdXNlQ01hcCA9IG51bGw7XG4gICAgICB2YXIgc3RhcnQgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpO1xuICAgICAgdmFyIGVuZCA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7XG4gICAgICB2YXIgY2hhciA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7XG4gICAgICB2YXIgY2hhckNvZGUgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpO1xuICAgICAgdmFyIHRtcCA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7XG4gICAgICB2YXIgY29kZTtcblxuICAgICAgdmFyIGI7XG4gICAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZEJ5dGUoKSkgPj0gMCkge1xuICAgICAgICB2YXIgdHlwZSA9IGIgPj4gNTtcbiAgICAgICAgaWYgKHR5cGUgPT09IDcpIHtcbiAgICAgICAgICAvLyBtZXRhZGF0YSwgZS5nLiBjb21tZW50IG9yIHVzZWNtYXBcbiAgICAgICAgICBzd2l0Y2ggKGIgJiAweDFmKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHN0cmVhbS5yZWFkU3RyaW5nKCk7IC8vIHNraXBwaW5nIGNvbW1lbnRcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIHVzZUNNYXAgPSBzdHJlYW0ucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlcXVlbmNlID0gISEoYiAmIDB4MTApO1xuICAgICAgICB2YXIgZGF0YVNpemUgPSBiICYgMTU7XG5cbiAgICAgICAgaWYgKGRhdGFTaXplICsgMSA+IE1BWF9OVU1fU0laRSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInByb2Nlc3NCaW5hcnlDTWFwOiBJbnZhbGlkIGRhdGFTaXplLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1Y3MyRGF0YVNpemUgPSAxO1xuICAgICAgICB2YXIgc3ViaXRlbXNDb3VudCA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIDA6IC8vIGNvZGVzcGFjZXJhbmdlXG4gICAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShcbiAgICAgICAgICAgICAgZGF0YVNpemUgKyAxLFxuICAgICAgICAgICAgICBoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLFxuICAgICAgICAgICAgICBoZXhUb0ludChlbmQsIGRhdGFTaXplKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShcbiAgICAgICAgICAgICAgICBkYXRhU2l6ZSArIDEsXG4gICAgICAgICAgICAgICAgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSxcbiAgICAgICAgICAgICAgICBoZXhUb0ludChlbmQsIGRhdGFTaXplKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOiAvLyBub3RkZWZyYW5nZVxuICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkTnVtYmVyKCk7IC8vIGNvZGVcbiAgICAgICAgICAgIC8vIHVuZGVmaW5lZCByYW5nZSwgc2tpcHBpbmdcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsgLy8gY29kZVxuICAgICAgICAgICAgICAvLyBub3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjogLy8gY2lkY2hhclxuICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhciwgZGF0YVNpemUpO1xuICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7XG4gICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpO1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBpbmNIZXgoY2hhciwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIodG1wLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgICAgYWRkSGV4KGNoYXIsIHRtcCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZFNpZ25lZCgpICsgKGNvZGUgKyAxKTtcbiAgICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgZGF0YVNpemUpLCBjb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzogLy8gY2lkcmFuZ2VcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBjb2RlID0gc3RyZWFtLnJlYWROdW1iZXIoKTtcbiAgICAgICAgICAgIGNNYXAubWFwQ2lkUmFuZ2UoXG4gICAgICAgICAgICAgIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksXG4gICAgICAgICAgICAgIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLFxuICAgICAgICAgICAgICBjb2RlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpO1xuICAgICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKFxuICAgICAgICAgICAgICAgIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksXG4gICAgICAgICAgICAgICAgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSksXG4gICAgICAgICAgICAgICAgY29kZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OiAvLyBiZmNoYXJcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpO1xuICAgICAgICAgICAgY01hcC5tYXBPbmUoXG4gICAgICAgICAgICAgIGhleFRvSW50KGNoYXIsIHVjczJEYXRhU2l6ZSksXG4gICAgICAgICAgICAgIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGluY0hleChjaGFyLCB1Y3MyRGF0YVNpemUpO1xuICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIodG1wLCB1Y3MyRGF0YVNpemUpO1xuICAgICAgICAgICAgICAgIGFkZEhleChjaGFyLCB0bXAsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5jSGV4KGNoYXJDb2RlLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4U2lnbmVkKHRtcCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBhZGRIZXgoY2hhckNvZGUsIHRtcCwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBjTWFwLm1hcE9uZShcbiAgICAgICAgICAgICAgICBoZXhUb0ludChjaGFyLCB1Y3MyRGF0YVNpemUpLFxuICAgICAgICAgICAgICAgIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTogLy8gYmZyYW5nZVxuICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgdWNzMkRhdGFTaXplKTtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXJDb2RlLCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoXG4gICAgICAgICAgICAgIGhleFRvSW50KHN0YXJ0LCB1Y3MyRGF0YVNpemUpLFxuICAgICAgICAgICAgICBoZXhUb0ludChlbmQsIHVjczJEYXRhU2l6ZSksXG4gICAgICAgICAgICAgIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGluY0hleChlbmQsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgdWNzMkRhdGFTaXplKTtcbiAgICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgdWNzMkRhdGFTaXplKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7XG4gICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpO1xuICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpO1xuICAgICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoXG4gICAgICAgICAgICAgICAgaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksXG4gICAgICAgICAgICAgICAgaGV4VG9JbnQoZW5kLCB1Y3MyRGF0YVNpemUpLFxuICAgICAgICAgICAgICAgIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwicHJvY2Vzc0JpbmFyeUNNYXA6IFVua25vd24gdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHVzZUNNYXApIHtcbiAgICAgICAgcmVzb2x2ZShleHRlbmQodXNlQ01hcCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGNNYXApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyKCkge31cblxuICBCaW5hcnlDTWFwUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICBwcm9jZXNzOiBwcm9jZXNzQmluYXJ5Q01hcCxcbiAgfTtcblxuICByZXR1cm4gQmluYXJ5Q01hcFJlYWRlcjtcbn0pKCk7XG5cbnZhciBDTWFwRmFjdG9yeSA9IChmdW5jdGlvbiBDTWFwRmFjdG9yeUNsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIHN0clRvSW50KHN0cikge1xuICAgIHZhciBhID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgYSA9IChhIDw8IDgpIHwgc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBhID4+PiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwZWN0U3RyaW5nKG9iaikge1xuICAgIGlmICghaXNTdHJpbmcob2JqKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTWFsZm9ybWVkIENNYXA6IGV4cGVjdGVkIHN0cmluZy5cIik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXhwZWN0SW50KG9iaikge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgaW50LlwiKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcikge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICBpZiAoaXNFT0Yob2JqKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChpc0NtZChvYmosIFwiZW5kYmZjaGFyXCIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIHNyYyA9IHN0clRvSW50KG9iaik7XG4gICAgICBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIC8vIFRPRE8gYXJlIC9kc3ROYW1lIHVzZWQ/XG4gICAgICBleHBlY3RTdHJpbmcob2JqKTtcbiAgICAgIHZhciBkc3QgPSBvYmo7XG4gICAgICBjTWFwLm1hcE9uZShzcmMsIGRzdCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIGlmIChpc0VPRihvYmopKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGlzQ21kKG9iaiwgXCJlbmRiZnJhbmdlXCIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIGxvdyA9IHN0clRvSW50KG9iaik7XG4gICAgICBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopO1xuICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopIHx8IGlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgdmFyIGRzdExvdyA9IE51bWJlci5pc0ludGVnZXIob2JqKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUob2JqKSA6IG9iajtcbiAgICAgICAgY01hcC5tYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNDbWQob2JqLCBcIltcIikpIHtcbiAgICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICB3aGlsZSAoIWlzQ21kKG9iaiwgXCJdXCIpICYmICFpc0VPRihvYmopKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChvYmopO1xuICAgICAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgICB9XG4gICAgICAgIGNNYXAubWFwQmZSYW5nZVRvQXJyYXkobG93LCBoaWdoLCBhcnJheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBiZiByYW5nZS5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgaWYgKGlzRU9GKG9iaikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNDbWQob2JqLCBcImVuZGNpZGNoYXJcIikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXhwZWN0U3RyaW5nKG9iaik7XG4gICAgICB2YXIgc3JjID0gc3RyVG9JbnQob2JqKTtcbiAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgZXhwZWN0SW50KG9iaik7XG4gICAgICB2YXIgZHN0ID0gb2JqO1xuICAgICAgY01hcC5tYXBPbmUoc3JjLCBkc3QpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQ2lkUmFuZ2UoY01hcCwgbGV4ZXIpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgaWYgKGlzRU9GKG9iaikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNDbWQob2JqLCBcImVuZGNpZHJhbmdlXCIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIGxvdyA9IHN0clRvSW50KG9iaik7XG4gICAgICBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIGV4cGVjdFN0cmluZyhvYmopO1xuICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopO1xuICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICBleHBlY3RJbnQob2JqKTtcbiAgICAgIHZhciBkc3RMb3cgPSBvYmo7XG4gICAgICBjTWFwLm1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNvZGVzcGFjZVJhbmdlKGNNYXAsIGxleGVyKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTtcbiAgICAgIGlmIChpc0VPRihvYmopKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGlzQ21kKG9iaiwgXCJlbmRjb2Rlc3BhY2VyYW5nZVwiKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgbG93ID0gc3RyVG9JbnQob2JqKTtcbiAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgICAgaWYgKCFpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopO1xuICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShvYmoubGVuZ3RoLCBsb3csIGhpZ2gpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIGNvZGVzcGFjZSByYW5nZS5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKSB7XG4gICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHtcbiAgICAgIGNNYXAudmVydGljYWwgPSAhIW9iajtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKSB7XG4gICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpO1xuICAgIGlmIChpc05hbWUob2JqKSAmJiBpc1N0cmluZyhvYmoubmFtZSkpIHtcbiAgICAgIGNNYXAubmFtZSA9IG9iai5uYW1lO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkge1xuICAgIHZhciBwcmV2aW91cztcbiAgICB2YXIgZW1iZWRkZWRVc2VDTWFwO1xuICAgIG9iakxvb3A6IHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7XG4gICAgICAgIGlmIChpc0VPRihvYmopKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOYW1lKG9iaikpIHtcbiAgICAgICAgICBpZiAob2JqLm5hbWUgPT09IFwiV01vZGVcIikge1xuICAgICAgICAgICAgcGFyc2VXTW9kZShjTWFwLCBsZXhlcik7XG4gICAgICAgICAgfSBlbHNlIGlmIChvYmoubmFtZSA9PT0gXCJDTWFwTmFtZVwiKSB7XG4gICAgICAgICAgICBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJldmlvdXMgPSBvYmo7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDbWQob2JqKSkge1xuICAgICAgICAgIHN3aXRjaCAob2JqLmNtZCkge1xuICAgICAgICAgICAgY2FzZSBcImVuZGNtYXBcIjpcbiAgICAgICAgICAgICAgYnJlYWsgb2JqTG9vcDtcbiAgICAgICAgICAgIGNhc2UgXCJ1c2VjbWFwXCI6XG4gICAgICAgICAgICAgIGlmIChpc05hbWUocHJldmlvdXMpKSB7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWRVc2VDTWFwID0gcHJldmlvdXMubmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiZWdpbmNvZGVzcGFjZXJhbmdlXCI6XG4gICAgICAgICAgICAgIHBhcnNlQ29kZXNwYWNlUmFuZ2UoY01hcCwgbGV4ZXIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiZWdpbmJmY2hhclwiOlxuICAgICAgICAgICAgICBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImJlZ2luY2lkY2hhclwiOlxuICAgICAgICAgICAgICBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiZWdpbmJmcmFuZ2VcIjpcbiAgICAgICAgICAgICAgcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmVnaW5jaWRyYW5nZVwiOlxuICAgICAgICAgICAgICBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikge1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICAgIHdhcm4oXCJJbnZhbGlkIGNNYXAgZGF0YTogXCIgKyBleCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXNlQ01hcCAmJiBlbWJlZGRlZFVzZUNNYXApIHtcbiAgICAgIC8vIExvYWQgdGhlIHVzZUNNYXAgZGVmaW5pdGlvbiBmcm9tIHRoZSBmaWxlIG9ubHkgaWYgdGhlcmUgd2Fzbid0IG9uZVxuICAgICAgLy8gc3BlY2lmaWVkLlxuICAgICAgdXNlQ01hcCA9IGVtYmVkZGVkVXNlQ01hcDtcbiAgICB9XG4gICAgaWYgKHVzZUNNYXApIHtcbiAgICAgIHJldHVybiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNNYXApO1xuICB9XG5cbiAgZnVuY3Rpb24gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKHVzZUNNYXAsIGZldGNoQnVpbHRJbkNNYXApLnRoZW4oZnVuY3Rpb24gKFxuICAgICAgbmV3Q01hcFxuICAgICkge1xuICAgICAgY01hcC51c2VDTWFwID0gbmV3Q01hcDtcbiAgICAgIC8vIElmIHRoZXJlIGFyZW4ndCBhbnkgY29kZSBzcGFjZSByYW5nZXMgZGVmaW5lZCBjbG9uZSBhbGwgdGhlIHBhcmVudCBvbmVzXG4gICAgICAvLyBpbnRvIHRoaXMgY01hcC5cbiAgICAgIGlmIChjTWFwLm51bUNvZGVzcGFjZVJhbmdlcyA9PT0gMCkge1xuICAgICAgICB2YXIgdXNlQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLmNvZGVzcGFjZVJhbmdlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1c2VDb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjTWFwLmNvZGVzcGFjZVJhbmdlc1tpXSA9IHVzZUNvZGVzcGFjZVJhbmdlc1tpXS5zbGljZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlcztcbiAgICAgIH1cbiAgICAgIC8vIE1lcmdlIHRoZSBtYXAgaW50byB0aGUgY3VycmVudCBvbmUsIG1ha2luZyBzdXJlIG5vdCB0byBvdmVycmlkZVxuICAgICAgLy8gYW55IHByZXZpb3VzbHkgZGVmaW5lZCBlbnRyaWVzLlxuICAgICAgY01hcC51c2VDTWFwLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCFjTWFwLmNvbnRhaW5zKGtleSkpIHtcbiAgICAgICAgICBjTWFwLm1hcE9uZShrZXksIGNNYXAudXNlQ01hcC5sb29rdXAoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY01hcDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKG5hbWUsIGZldGNoQnVpbHRJbkNNYXApIHtcbiAgICBpZiAobmFtZSA9PT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IElkZW50aXR5Q01hcChmYWxzZSwgMikpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gXCJJZGVudGl0eS1WXCIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IElkZW50aXR5Q01hcCh0cnVlLCAyKSk7XG4gICAgfVxuICAgIGlmICghQlVJTFRfSU5fQ01BUFMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbmtub3duIENNYXAgbmFtZTogXCIgKyBuYW1lKSk7XG4gICAgfVxuICAgIGlmICghZmV0Y2hCdWlsdEluQ01hcCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXCJCdWlsdC1pbiBDTWFwIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm92aWRlZC5cIilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZldGNoQnVpbHRJbkNNYXAobmFtZSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIGNNYXBEYXRhID0gZGF0YS5jTWFwRGF0YSxcbiAgICAgICAgY29tcHJlc3Npb25UeXBlID0gZGF0YS5jb21wcmVzc2lvblR5cGU7XG4gICAgICB2YXIgY01hcCA9IG5ldyBDTWFwKHRydWUpO1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25UeXBlID09PSBDTWFwQ29tcHJlc3Npb25UeXBlLkJJTkFSWSkge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeUNNYXBSZWFkZXIoKS5wcm9jZXNzKGNNYXBEYXRhLCBjTWFwLCBmdW5jdGlvbiAoXG4gICAgICAgICAgdXNlQ01hcFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHJlc3Npb25UeXBlID09PSBDTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpIHtcbiAgICAgICAgdmFyIGxleGVyID0gbmV3IExleGVyKG5ldyBTdHJlYW0oY01hcERhdGEpKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgbnVsbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBcIlRPRE86IE9ubHkgQklOQVJZL05PTkUgQ01hcCBjb21wcmVzc2lvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlwiXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNyZWF0ZShwYXJhbXMpIHtcbiAgICAgIHZhciBlbmNvZGluZyA9IHBhcmFtcy5lbmNvZGluZztcbiAgICAgIHZhciBmZXRjaEJ1aWx0SW5DTWFwID0gcGFyYW1zLmZldGNoQnVpbHRJbkNNYXA7XG4gICAgICB2YXIgdXNlQ01hcCA9IHBhcmFtcy51c2VDTWFwO1xuXG4gICAgICBpZiAoaXNOYW1lKGVuY29kaW5nKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAoZW5jb2RpbmcubmFtZSwgZmV0Y2hCdWlsdEluQ01hcCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RyZWFtKGVuY29kaW5nKSkge1xuICAgICAgICB2YXIgY01hcCA9IG5ldyBDTWFwKCk7XG4gICAgICAgIHZhciBsZXhlciA9IG5ldyBMZXhlcihlbmNvZGluZyk7XG4gICAgICAgIHJldHVybiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApLnRoZW4oZnVuY3Rpb24gKFxuICAgICAgICAgIHBhcnNlZENNYXBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHBhcnNlZENNYXAuaXNJZGVudGl0eUNNYXApIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVCdWlsdEluQ01hcChwYXJzZWRDTWFwLm5hbWUsIGZldGNoQnVpbHRJbkNNYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFyc2VkQ01hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmNvZGluZyByZXF1aXJlZC5cIik7XG4gICAgfSxcbiAgfTtcbn0pKCk7XG5cbmV4cG9ydCB7IENNYXAsIElkZW50aXR5Q01hcCwgQ01hcEZhY3RvcnkgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGJ5dGVzVG9TdHJpbmcsXG4gIEZPTlRfSURFTlRJVFlfTUFUUklYLFxuICBGb250VHlwZSxcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIGlzTnVtLFxuICBzaGFkb3csXG4gIHN0cmluZzMyLFxuICB1bnJlYWNoYWJsZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBDRkYsXG4gIENGRkNoYXJzZXQsXG4gIENGRkNvbXBpbGVyLFxuICBDRkZIZWFkZXIsXG4gIENGRkluZGV4LFxuICBDRkZQYXJzZXIsXG4gIENGRlByaXZhdGVEaWN0LFxuICBDRkZTdGFuZGFyZFN0cmluZ3MsXG4gIENGRlN0cmluZ3MsXG4gIENGRlRvcERpY3QsXG59IGZyb20gXCIuL2NmZl9wYXJzZXIuanNcIjtcbmltcG9ydCB7IGdldERpbmdiYXRzR2x5cGhzVW5pY29kZSwgZ2V0R2x5cGhzVW5pY29kZSB9IGZyb20gXCIuL2dseXBobGlzdC5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW5jb2RpbmcsXG4gIE1hY1JvbWFuRW5jb2RpbmcsXG4gIFN0YW5kYXJkRW5jb2RpbmcsXG4gIFN5bWJvbFNldEVuY29kaW5nLFxuICBaYXBmRGluZ2JhdHNFbmNvZGluZyxcbn0gZnJvbSBcIi4vZW5jb2RpbmdzLmpzXCI7XG5pbXBvcnQge1xuICBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMsXG4gIGdldE5vblN0ZEZvbnRNYXAsXG4gIGdldFN0ZEZvbnRNYXAsXG4gIGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayxcbiAgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpLFxufSBmcm9tIFwiLi9zdGFuZGFyZF9mb250cy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0VW5pY29kZUZvckdseXBoLFxuICBnZXRVbmljb2RlUmFuZ2VGb3IsXG4gIG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzLFxufSBmcm9tIFwiLi91bmljb2RlLmpzXCI7XG5pbXBvcnQge1xuICBpc1doaXRlU3BhY2UsXG4gIE1pc3NpbmdEYXRhRXhjZXB0aW9uLFxuICByZWFkVWludDMyLFxufSBmcm9tIFwiLi9jb3JlX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBGb250UmVuZGVyZXJGYWN0b3J5IH0gZnJvbSBcIi4vZm9udF9yZW5kZXJlci5qc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlDTWFwIH0gZnJvbSBcIi4vY21hcC5qc1wiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBUeXBlMVBhcnNlciB9IGZyb20gXCIuL3R5cGUxX3BhcnNlci5qc1wiO1xuXG4vLyBVbmljb2RlIFByaXZhdGUgVXNlIEFyZWFzOlxuY29uc3QgUFJJVkFURV9VU0VfQVJFQVMgPSBbXG4gIFsweGUwMDAsIDB4ZjhmZl0sIC8vIEJNUCAoMClcbiAgWzB4MTAwMDAwLCAweDEwZmZmZF0sIC8vIFBVUCAoMTYpXG5dO1xuXG4vLyBQREYgR2x5cGggU3BhY2UgVW5pdHMgYXJlIG9uZSBUaG91c2FuZHRoIG9mIGEgVGV4dFNwYWNlIFVuaXRcbi8vIGV4Y2VwdCBmb3IgVHlwZSAzIGZvbnRzXG52YXIgUERGX0dMWVBIX1NQQUNFX1VOSVRTID0gMTAwMDtcblxuLy8gQWNjZW50ZWQgY2hhcmFjdGVycyBoYXZlIGlzc3VlcyBvbiBXaW5kb3dzIGFuZCBMaW51eC4gV2hlbiB0aGlzIGZsYWcgaXNcbi8vIGVuYWJsZWQgZ2x5cGhzIHRoYXQgdXNlIHNlYWMgYW5kIHNlYWMgc3R5bGUgZW5kY2hhciBvcGVyYXRvcnMgYXJlIHRydW5jYXRlZFxuLy8gYW5kIHdlIGluc3RlYWQganVzdCBzdG9yZSB0aGUgZ2x5cGggaWQncyBvZiB0aGUgYmFzZSBnbHlwaCBhbmQgaXRzIGFjY2VudCB0b1xuLy8gYmUgZHJhd24gaW5kaXZpZHVhbGx5LlxuLy8gTGludXggKGZyZWV0eXBlKSByZXF1aXJlcyB0aGF0IHdoZW4gYSBzZWFjIHN0eWxlIGVuZGNoYXIgaXMgdXNlZFxuLy8gdGhhdCB0aGUgY2hhcnNldCBtdXN0IGJlIGEgcHJlZGVmaW5lZCBvbmUsIGhvd2V2ZXIgd2UgYnVpbGQgYVxuLy8gY3VzdG9tIG9uZS4gV2luZG93cyBqdXN0IHJlZnVzZXMgdG8gZHJhdyBnbHlwaHMgd2l0aCBzZWFjIG9wZXJhdG9ycy5cbnZhciBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB0cnVlO1xuXG5jb25zdCBFWFBPUlRfREFUQV9QUk9QRVJUSUVTID0gW1xuICBcImFzY2VudFwiLFxuICBcImJib3hcIixcbiAgXCJibGFja1wiLFxuICBcImJvbGRcIixcbiAgXCJjaGFyUHJvY09wZXJhdG9yTGlzdFwiLFxuICBcImNvbXBvc2l0ZVwiLFxuICBcImRhdGFcIixcbiAgXCJkZWZhdWx0Vk1ldHJpY3NcIixcbiAgXCJkZWZhdWx0V2lkdGhcIixcbiAgXCJkZXNjZW50XCIsXG4gIFwiZmFsbGJhY2tOYW1lXCIsXG4gIFwiZm9udE1hdHJpeFwiLFxuICBcImZvbnRUeXBlXCIsXG4gIFwiaXNNb25vc3BhY2VcIixcbiAgXCJpc1NlcmlmRm9udFwiLFxuICBcImlzVHlwZTNGb250XCIsXG4gIFwiaXRhbGljXCIsXG4gIFwibG9hZGVkTmFtZVwiLFxuICBcIm1pbWV0eXBlXCIsXG4gIFwibWlzc2luZ0ZpbGVcIixcbiAgXCJuYW1lXCIsXG4gIFwicmVtZWFzdXJlXCIsXG4gIFwic3VidHlwZVwiLFxuICBcInR5cGVcIixcbiAgXCJ2ZXJ0aWNhbFwiLFxuXTtcblxuY29uc3QgRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFUyA9IFtcbiAgXCJjTWFwXCIsXG4gIFwiZGVmYXVsdEVuY29kaW5nXCIsXG4gIFwiZGlmZmVyZW5jZXNcIixcbiAgXCJpc1N5bWJvbGljRm9udFwiLFxuICBcInNlYWNNYXBcIixcbiAgXCJ0b0ZvbnRDaGFyXCIsXG4gIFwidG9Vbmljb2RlXCIsXG4gIFwidm1ldHJpY3NcIixcbiAgXCJ3aWR0aHNcIixcbl07XG5cbnZhciBGb250RmxhZ3MgPSB7XG4gIEZpeGVkUGl0Y2g6IDEsXG4gIFNlcmlmOiAyLFxuICBTeW1ib2xpYzogNCxcbiAgU2NyaXB0OiA4LFxuICBOb25zeW1ib2xpYzogMzIsXG4gIEl0YWxpYzogNjQsXG4gIEFsbENhcDogNjU1MzYsXG4gIFNtYWxsQ2FwOiAxMzEwNzIsXG4gIEZvcmNlQm9sZDogMjYyMTQ0LFxufTtcblxuLy8gcHJldHRpZXItaWdub3JlXG52YXIgTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nID0gW1xuICBcIi5ub3RkZWZcIiwgXCIubnVsbFwiLCBcIm5vbm1hcmtpbmdyZXR1cm5cIiwgXCJzcGFjZVwiLCBcImV4Y2xhbVwiLCBcInF1b3RlZGJsXCIsXG4gIFwibnVtYmVyc2lnblwiLCBcImRvbGxhclwiLCBcInBlcmNlbnRcIiwgXCJhbXBlcnNhbmRcIiwgXCJxdW90ZXNpbmdsZVwiLCBcInBhcmVubGVmdFwiLFxuICBcInBhcmVucmlnaHRcIiwgXCJhc3Rlcmlza1wiLCBcInBsdXNcIiwgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcInNsYXNoXCIsXG4gIFwiemVyb1wiLCBcIm9uZVwiLCBcInR3b1wiLCBcInRocmVlXCIsIFwiZm91clwiLCBcImZpdmVcIiwgXCJzaXhcIiwgXCJzZXZlblwiLCBcImVpZ2h0XCIsXG4gIFwibmluZVwiLCBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsIFwibGVzc1wiLCBcImVxdWFsXCIsIFwiZ3JlYXRlclwiLCBcInF1ZXN0aW9uXCIsIFwiYXRcIixcbiAgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIiwgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsIFwiTlwiLCBcIk9cIixcbiAgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIiwgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLCBcImJyYWNrZXRsZWZ0XCIsXG4gIFwiYmFja3NsYXNoXCIsIFwiYnJhY2tldHJpZ2h0XCIsIFwiYXNjaWljaXJjdW1cIiwgXCJ1bmRlcnNjb3JlXCIsIFwiZ3JhdmVcIiwgXCJhXCIsIFwiYlwiLFxuICBcImNcIiwgXCJkXCIsIFwiZVwiLCBcImZcIiwgXCJnXCIsIFwiaFwiLCBcImlcIiwgXCJqXCIsIFwia1wiLCBcImxcIiwgXCJtXCIsIFwiblwiLCBcIm9cIiwgXCJwXCIsIFwicVwiLFxuICBcInJcIiwgXCJzXCIsIFwidFwiLCBcInVcIiwgXCJ2XCIsIFwid1wiLCBcInhcIiwgXCJ5XCIsIFwielwiLCBcImJyYWNlbGVmdFwiLCBcImJhclwiLCBcImJyYWNlcmlnaHRcIixcbiAgXCJhc2NpaXRpbGRlXCIsIFwiQWRpZXJlc2lzXCIsIFwiQXJpbmdcIiwgXCJDY2VkaWxsYVwiLCBcIkVhY3V0ZVwiLCBcIk50aWxkZVwiLFxuICBcIk9kaWVyZXNpc1wiLCBcIlVkaWVyZXNpc1wiLCBcImFhY3V0ZVwiLCBcImFncmF2ZVwiLCBcImFjaXJjdW1mbGV4XCIsIFwiYWRpZXJlc2lzXCIsXG4gIFwiYXRpbGRlXCIsIFwiYXJpbmdcIiwgXCJjY2VkaWxsYVwiLCBcImVhY3V0ZVwiLCBcImVncmF2ZVwiLCBcImVjaXJjdW1mbGV4XCIsIFwiZWRpZXJlc2lzXCIsXG4gIFwiaWFjdXRlXCIsIFwiaWdyYXZlXCIsIFwiaWNpcmN1bWZsZXhcIiwgXCJpZGllcmVzaXNcIiwgXCJudGlsZGVcIiwgXCJvYWN1dGVcIiwgXCJvZ3JhdmVcIixcbiAgXCJvY2lyY3VtZmxleFwiLCBcIm9kaWVyZXNpc1wiLCBcIm90aWxkZVwiLCBcInVhY3V0ZVwiLCBcInVncmF2ZVwiLCBcInVjaXJjdW1mbGV4XCIsXG4gIFwidWRpZXJlc2lzXCIsIFwiZGFnZ2VyXCIsIFwiZGVncmVlXCIsIFwiY2VudFwiLCBcInN0ZXJsaW5nXCIsIFwic2VjdGlvblwiLCBcImJ1bGxldFwiLFxuICBcInBhcmFncmFwaFwiLCBcImdlcm1hbmRibHNcIiwgXCJyZWdpc3RlcmVkXCIsIFwiY29weXJpZ2h0XCIsIFwidHJhZGVtYXJrXCIsIFwiYWN1dGVcIixcbiAgXCJkaWVyZXNpc1wiLCBcIm5vdGVxdWFsXCIsIFwiQUVcIiwgXCJPc2xhc2hcIiwgXCJpbmZpbml0eVwiLCBcInBsdXNtaW51c1wiLCBcImxlc3NlcXVhbFwiLFxuICBcImdyZWF0ZXJlcXVhbFwiLCBcInllblwiLCBcIm11XCIsIFwicGFydGlhbGRpZmZcIiwgXCJzdW1tYXRpb25cIiwgXCJwcm9kdWN0XCIsIFwicGlcIixcbiAgXCJpbnRlZ3JhbFwiLCBcIm9yZGZlbWluaW5lXCIsIFwib3JkbWFzY3VsaW5lXCIsIFwiT21lZ2FcIiwgXCJhZVwiLCBcIm9zbGFzaFwiLFxuICBcInF1ZXN0aW9uZG93blwiLCBcImV4Y2xhbWRvd25cIiwgXCJsb2dpY2Fsbm90XCIsIFwicmFkaWNhbFwiLCBcImZsb3JpblwiLFxuICBcImFwcHJveGVxdWFsXCIsIFwiRGVsdGFcIiwgXCJndWlsbGVtb3RsZWZ0XCIsIFwiZ3VpbGxlbW90cmlnaHRcIiwgXCJlbGxpcHNpc1wiLFxuICBcIm5vbmJyZWFraW5nc3BhY2VcIiwgXCJBZ3JhdmVcIiwgXCJBdGlsZGVcIiwgXCJPdGlsZGVcIiwgXCJPRVwiLCBcIm9lXCIsIFwiZW5kYXNoXCIsXG4gIFwiZW1kYXNoXCIsIFwicXVvdGVkYmxsZWZ0XCIsIFwicXVvdGVkYmxyaWdodFwiLCBcInF1b3RlbGVmdFwiLCBcInF1b3RlcmlnaHRcIixcbiAgXCJkaXZpZGVcIiwgXCJsb3plbmdlXCIsIFwieWRpZXJlc2lzXCIsIFwiWWRpZXJlc2lzXCIsIFwiZnJhY3Rpb25cIiwgXCJjdXJyZW5jeVwiLFxuICBcImd1aWxzaW5nbGxlZnRcIiwgXCJndWlsc2luZ2xyaWdodFwiLCBcImZpXCIsIFwiZmxcIiwgXCJkYWdnZXJkYmxcIiwgXCJwZXJpb2RjZW50ZXJlZFwiLFxuICBcInF1b3Rlc2luZ2xiYXNlXCIsIFwicXVvdGVkYmxiYXNlXCIsIFwicGVydGhvdXNhbmRcIiwgXCJBY2lyY3VtZmxleFwiLFxuICBcIkVjaXJjdW1mbGV4XCIsIFwiQWFjdXRlXCIsIFwiRWRpZXJlc2lzXCIsIFwiRWdyYXZlXCIsIFwiSWFjdXRlXCIsIFwiSWNpcmN1bWZsZXhcIixcbiAgXCJJZGllcmVzaXNcIiwgXCJJZ3JhdmVcIiwgXCJPYWN1dGVcIiwgXCJPY2lyY3VtZmxleFwiLCBcImFwcGxlXCIsIFwiT2dyYXZlXCIsIFwiVWFjdXRlXCIsXG4gIFwiVWNpcmN1bWZsZXhcIiwgXCJVZ3JhdmVcIiwgXCJkb3RsZXNzaVwiLCBcImNpcmN1bWZsZXhcIiwgXCJ0aWxkZVwiLCBcIm1hY3JvblwiLFxuICBcImJyZXZlXCIsIFwiZG90YWNjZW50XCIsIFwicmluZ1wiLCBcImNlZGlsbGFcIiwgXCJodW5nYXJ1bWxhdXRcIiwgXCJvZ29uZWtcIiwgXCJjYXJvblwiLFxuICBcIkxzbGFzaFwiLCBcImxzbGFzaFwiLCBcIlNjYXJvblwiLCBcInNjYXJvblwiLCBcIlpjYXJvblwiLCBcInpjYXJvblwiLCBcImJyb2tlbmJhclwiLFxuICBcIkV0aFwiLCBcImV0aFwiLCBcIllhY3V0ZVwiLCBcInlhY3V0ZVwiLCBcIlRob3JuXCIsIFwidGhvcm5cIiwgXCJtaW51c1wiLCBcIm11bHRpcGx5XCIsXG4gIFwib25lc3VwZXJpb3JcIiwgXCJ0d29zdXBlcmlvclwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJvbmVoYWxmXCIsIFwib25lcXVhcnRlclwiLFxuICBcInRocmVlcXVhcnRlcnNcIiwgXCJmcmFuY1wiLCBcIkdicmV2ZVwiLCBcImdicmV2ZVwiLCBcIklkb3RhY2NlbnRcIiwgXCJTY2VkaWxsYVwiLFxuICBcInNjZWRpbGxhXCIsIFwiQ2FjdXRlXCIsIFwiY2FjdXRlXCIsIFwiQ2Nhcm9uXCIsIFwiY2Nhcm9uXCIsIFwiZGNyb2F0XCJdO1xuXG5mdW5jdGlvbiBhZGp1c3RXaWR0aHMocHJvcGVydGllcykge1xuICBpZiAoIXByb3BlcnRpZXMuZm9udE1hdHJpeCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvcGVydGllcy5mb250TWF0cml4WzBdID09PSBGT05UX0lERU5USVRZX01BVFJJWFswXSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBhZGp1c3Rpbmcgd2lkdGggdG8gZm9udE1hdHJpeCBzY2FsZVxuICB2YXIgc2NhbGUgPSAwLjAwMSAvIHByb3BlcnRpZXMuZm9udE1hdHJpeFswXTtcbiAgdmFyIGdseXBoc1dpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzO1xuICBmb3IgKHZhciBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHtcbiAgICBnbHlwaHNXaWR0aHNbZ2x5cGhdICo9IHNjYWxlO1xuICB9XG4gIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoICo9IHNjYWxlO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RUb1VuaWNvZGUocHJvcGVydGllcywgYnVpbHRJbkVuY29kaW5nKSB7XG4gIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7XG4gICAgcmV0dXJuOyAvLyBUaGUgZm9udCBkaWN0aW9uYXJ5IGhhcyBhIGBUb1VuaWNvZGVgIGVudHJ5LlxuICB9XG4gIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7XG4gICAgcmV0dXJuOyAvLyBUaGUgZm9udCBkaWN0aW9uYXJ5IGhhcyBhbiBgRW5jb2RpbmdgIGVudHJ5LlxuICB9XG4gIGlmIChidWlsdEluRW5jb2RpbmcgPT09IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nKSB7XG4gICAgcmV0dXJuOyAvLyBObyBwb2ludCBpbiB0cnlpbmcgdG8gYWRqdXN0IGB0b1VuaWNvZGVgIGlmIHRoZSBlbmNvZGluZ3MgbWF0Y2guXG4gIH1cbiAgaWYgKHByb3BlcnRpZXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHRvVW5pY29kZSA9IFtdLFxuICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7XG4gIGZvciAodmFyIGNoYXJDb2RlIGluIGJ1aWx0SW5FbmNvZGluZykge1xuICAgIHZhciBnbHlwaE5hbWUgPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdO1xuICAgIHZhciB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7XG4gICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7XG4gICAgICB0b1VuaWNvZGVbY2hhckNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlKTtcbiAgICB9XG4gIH1cbiAgcHJvcGVydGllcy50b1VuaWNvZGUuYW1lbmQodG9Vbmljb2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Rm9udFR5cGUodHlwZSwgc3VidHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiVHlwZTFcIjpcbiAgICAgIHJldHVybiBzdWJ0eXBlID09PSBcIlR5cGUxQ1wiID8gRm9udFR5cGUuVFlQRTFDIDogRm9udFR5cGUuVFlQRTE7XG4gICAgY2FzZSBcIkNJREZvbnRUeXBlMFwiOlxuICAgICAgcmV0dXJuIHN1YnR5cGUgPT09IFwiQ0lERm9udFR5cGUwQ1wiXG4gICAgICAgID8gRm9udFR5cGUuQ0lERk9OVFRZUEUwQ1xuICAgICAgICA6IEZvbnRUeXBlLkNJREZPTlRUWVBFMDtcbiAgICBjYXNlIFwiT3BlblR5cGVcIjpcbiAgICAgIHJldHVybiBGb250VHlwZS5PUEVOVFlQRTtcbiAgICBjYXNlIFwiVHJ1ZVR5cGVcIjpcbiAgICAgIHJldHVybiBGb250VHlwZS5UUlVFVFlQRTtcbiAgICBjYXNlIFwiQ0lERm9udFR5cGUyXCI6XG4gICAgICByZXR1cm4gRm9udFR5cGUuQ0lERk9OVFRZUEUyO1xuICAgIGNhc2UgXCJNTVR5cGUxXCI6XG4gICAgICByZXR1cm4gRm9udFR5cGUuTU1UWVBFMTtcbiAgICBjYXNlIFwiVHlwZTBcIjpcbiAgICAgIHJldHVybiBGb250VHlwZS5UWVBFMDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEZvbnRUeXBlLlVOS05PV047XG4gIH1cbn1cblxuLy8gU29tZSBiYWQgUERGIGdlbmVyYXRvcnMsIGUuZy4gU2NyaWJ1cyBQREYsIGluY2x1ZGUgZ2x5cGggbmFtZXNcbi8vIGluIGEgJ3VuaVhYWFgnIGZvcm1hdCAtLSBhdHRlbXB0aW5nIHRvIHJlY292ZXIgcHJvcGVyIG9uZXMuXG5mdW5jdGlvbiByZWNvdmVyR2x5cGhOYW1lKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApIHtcbiAgaWYgKGdseXBoc1VuaWNvZGVNYXBbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIC8vIFRoZSBnbHlwaCBuYW1lIGlzIG5vbi1zdGFuZGFyZCwgdHJ5aW5nIHRvIHJlY292ZXIuXG4gIHZhciB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApO1xuICBpZiAodW5pY29kZSAhPT0gLTEpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZ2x5cGhzVW5pY29kZU1hcCkge1xuICAgICAgaWYgKGdseXBoc1VuaWNvZGVNYXBba2V5XSA9PT0gdW5pY29kZSkge1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpbmZvKFwiVW5hYmxlIHRvIHJlY292ZXIgYSBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvcjogXCIgKyBuYW1lKTtcbiAgcmV0dXJuIG5hbWU7XG59XG5cbnZhciBHbHlwaCA9IChmdW5jdGlvbiBHbHlwaENsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gR2x5cGgoXG4gICAgZm9udENoYXIsXG4gICAgdW5pY29kZSxcbiAgICBhY2NlbnQsXG4gICAgd2lkdGgsXG4gICAgdm1ldHJpYyxcbiAgICBvcGVyYXRvckxpc3RJZCxcbiAgICBpc1NwYWNlLFxuICAgIGlzSW5Gb250XG4gICkge1xuICAgIHRoaXMuZm9udENoYXIgPSBmb250Q2hhcjtcbiAgICB0aGlzLnVuaWNvZGUgPSB1bmljb2RlO1xuICAgIHRoaXMuYWNjZW50ID0gYWNjZW50O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLnZtZXRyaWMgPSB2bWV0cmljO1xuICAgIHRoaXMub3BlcmF0b3JMaXN0SWQgPSBvcGVyYXRvckxpc3RJZDtcbiAgICB0aGlzLmlzU3BhY2UgPSBpc1NwYWNlO1xuICAgIHRoaXMuaXNJbkZvbnQgPSBpc0luRm9udDtcbiAgfVxuXG4gIEdseXBoLnByb3RvdHlwZS5tYXRjaGVzRm9yQ2FjaGUgPSBmdW5jdGlvbiAoXG4gICAgZm9udENoYXIsXG4gICAgdW5pY29kZSxcbiAgICBhY2NlbnQsXG4gICAgd2lkdGgsXG4gICAgdm1ldHJpYyxcbiAgICBvcGVyYXRvckxpc3RJZCxcbiAgICBpc1NwYWNlLFxuICAgIGlzSW5Gb250XG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmZvbnRDaGFyID09PSBmb250Q2hhciAmJlxuICAgICAgdGhpcy51bmljb2RlID09PSB1bmljb2RlICYmXG4gICAgICB0aGlzLmFjY2VudCA9PT0gYWNjZW50ICYmXG4gICAgICB0aGlzLndpZHRoID09PSB3aWR0aCAmJlxuICAgICAgdGhpcy52bWV0cmljID09PSB2bWV0cmljICYmXG4gICAgICB0aGlzLm9wZXJhdG9yTGlzdElkID09PSBvcGVyYXRvckxpc3RJZCAmJlxuICAgICAgdGhpcy5pc1NwYWNlID09PSBpc1NwYWNlICYmXG4gICAgICB0aGlzLmlzSW5Gb250ID09PSBpc0luRm9udFxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEdseXBoO1xufSkoKTtcblxudmFyIFRvVW5pY29kZU1hcCA9IChmdW5jdGlvbiBUb1VuaWNvZGVNYXBDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIFRvVW5pY29kZU1hcChjbWFwID0gW10pIHtcbiAgICAvLyBUaGUgZWxlbWVudHMgb2YgdGhpcy5fbWFwIGNhbiBiZSBpbnRlZ2VycyBvciBzdHJpbmdzLCBkZXBlbmRpbmcgb24gaG93XG4gICAgLy8gYGNtYXBgIHdhcyBjcmVhdGVkLlxuICAgIHRoaXMuX21hcCA9IGNtYXA7XG4gIH1cblxuICBUb1VuaWNvZGVNYXAucHJvdG90eXBlID0ge1xuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDtcbiAgICB9LFxuXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gdGhpcy5fbWFwKSB7XG4gICAgICAgIGNhbGxiYWNrKGNoYXJDb2RlLCB0aGlzLl9tYXBbY2hhckNvZGVdLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXMoaSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcFtpXSAhPT0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBnZXQoaSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcFtpXTtcbiAgICB9LFxuXG4gICAgY2hhckNvZGVPZih2YWx1ZSkge1xuICAgICAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBpcyAqZXh0cmVtZWx5KiBpbmVmZmljaWVudCBmb3IgYXJyYXlzIHdoaWNoXG4gICAgICAvLyBhcmUgYm90aCB2ZXJ5IHNwYXJzZSBhbmQgdmVyeSBsYXJnZSAoc2VlIGlzc3VlODM3Mi5wZGYpLlxuICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkge1xuICAgICAgICByZXR1cm4gbWFwLmluZGV4T2YodmFsdWUpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHtcbiAgICAgICAgaWYgKG1hcFtjaGFyQ29kZV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYXJDb2RlIHwgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH0sXG5cbiAgICBhbWVuZChtYXApIHtcbiAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIG1hcCkge1xuICAgICAgICB0aGlzLl9tYXBbY2hhckNvZGVdID0gbWFwW2NoYXJDb2RlXTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBUb1VuaWNvZGVNYXA7XG59KSgpO1xuXG52YXIgSWRlbnRpdHlUb1VuaWNvZGVNYXAgPSAoZnVuY3Rpb24gSWRlbnRpdHlUb1VuaWNvZGVNYXBDbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIElkZW50aXR5VG9Vbmljb2RlTWFwKGZpcnN0Q2hhciwgbGFzdENoYXIpIHtcbiAgICB0aGlzLmZpcnN0Q2hhciA9IGZpcnN0Q2hhcjtcbiAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7XG4gIH1cblxuICBJZGVudGl0eVRvVW5pY29kZU1hcC5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhc3RDaGFyICsgMSAtIHRoaXMuZmlyc3RDaGFyO1xuICAgIH0sXG5cbiAgICBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5maXJzdENoYXIsIGlpID0gdGhpcy5sYXN0Q2hhcjsgaSA8PSBpaTsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrKGksIGkpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXMoaSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyO1xuICAgIH0sXG5cbiAgICBnZXQoaSkge1xuICAgICAgaWYgKHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgY2hhckNvZGVPZih2KSB7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2KSAmJiB2ID49IHRoaXMuZmlyc3RDaGFyICYmIHYgPD0gdGhpcy5sYXN0Q2hhclxuICAgICAgICA/IHZcbiAgICAgICAgOiAtMTtcbiAgICB9LFxuXG4gICAgYW1lbmQobWFwKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpXCIpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIElkZW50aXR5VG9Vbmljb2RlTWFwO1xufSkoKTtcblxudmFyIE9wZW5UeXBlRmlsZUJ1aWxkZXIgPSAoZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlckNsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIHdyaXRlSW50MTYoZGVzdCwgb2Zmc2V0LCBudW0pIHtcbiAgICBkZXN0W29mZnNldF0gPSAobnVtID4+IDgpICYgMHhmZjtcbiAgICBkZXN0W29mZnNldCArIDFdID0gbnVtICYgMHhmZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlSW50MzIoZGVzdCwgb2Zmc2V0LCBudW0pIHtcbiAgICBkZXN0W29mZnNldF0gPSAobnVtID4+IDI0KSAmIDB4ZmY7XG4gICAgZGVzdFtvZmZzZXQgKyAxXSA9IChudW0gPj4gMTYpICYgMHhmZjtcbiAgICBkZXN0W29mZnNldCArIDJdID0gKG51bSA+PiA4KSAmIDB4ZmY7XG4gICAgZGVzdFtvZmZzZXQgKyAzXSA9IG51bSAmIDB4ZmY7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZURhdGEoZGVzdCwgb2Zmc2V0LCBkYXRhKSB7XG4gICAgdmFyIGksIGlpO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgZGVzdC5zZXQoZGF0YSwgb2Zmc2V0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBkZXN0W29mZnNldCsrXSA9IGRhdGEuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRyZWF0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBhcyBhcnJheVxuICAgICAgZm9yIChpID0gMCwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgZGVzdFtvZmZzZXQrK10gPSBkYXRhW2ldICYgMHhmZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXIoc2ZudCkge1xuICAgIHRoaXMuc2ZudCA9IHNmbnQ7XG4gICAgdGhpcy50YWJsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiBPcGVuVHlwZUZpbGVCdWlsZGVyX2dldFNlYXJjaFBhcmFtcyhcbiAgICBlbnRyaWVzQ291bnQsXG4gICAgZW50cnlTaXplXG4gICkge1xuICAgIHZhciBtYXhQb3dlcjIgPSAxLFxuICAgICAgbG9nMiA9IDA7XG4gICAgd2hpbGUgKChtYXhQb3dlcjIgXiBlbnRyaWVzQ291bnQpID4gbWF4UG93ZXIyKSB7XG4gICAgICBtYXhQb3dlcjIgPDw9IDE7XG4gICAgICBsb2cyKys7XG4gICAgfVxuICAgIHZhciBzZWFyY2hSYW5nZSA9IG1heFBvd2VyMiAqIGVudHJ5U2l6ZTtcbiAgICByZXR1cm4ge1xuICAgICAgcmFuZ2U6IHNlYXJjaFJhbmdlLFxuICAgICAgZW50cnk6IGxvZzIsXG4gICAgICByYW5nZVNoaWZ0OiBlbnRyeVNpemUgKiBlbnRyaWVzQ291bnQgLSBzZWFyY2hSYW5nZSxcbiAgICB9O1xuICB9O1xuXG4gIHZhciBPVEZfSEVBREVSX1NJWkUgPSAxMjtcbiAgdmFyIE9URl9UQUJMRV9FTlRSWV9TSVpFID0gMTY7XG5cbiAgT3BlblR5cGVGaWxlQnVpbGRlci5wcm90b3R5cGUgPSB7XG4gICAgdG9BcnJheTogZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl90b0FycmF5KCkge1xuICAgICAgdmFyIHNmbnQgPSB0aGlzLnNmbnQ7XG5cbiAgICAgIC8vIFRhYmxlcyBuZWVkcyB0byBiZSB3cml0dGVuIGJ5IGFzY2VuZGFudCBhbHBoYWJldGljIG9yZGVyXG4gICAgICB2YXIgdGFibGVzID0gdGhpcy50YWJsZXM7XG4gICAgICB2YXIgdGFibGVzTmFtZXMgPSBPYmplY3Qua2V5cyh0YWJsZXMpO1xuICAgICAgdGFibGVzTmFtZXMuc29ydCgpO1xuICAgICAgdmFyIG51bVRhYmxlcyA9IHRhYmxlc05hbWVzLmxlbmd0aDtcblxuICAgICAgdmFyIGksIGosIGpqLCB0YWJsZSwgdGFibGVOYW1lO1xuICAgICAgLy8gbGF5b3V0IHRoZSB0YWJsZXMgZGF0YVxuICAgICAgdmFyIG9mZnNldCA9IE9URl9IRUFERVJfU0laRSArIG51bVRhYmxlcyAqIE9URl9UQUJMRV9FTlRSWV9TSVpFO1xuICAgICAgdmFyIHRhYmxlT2Zmc2V0cyA9IFtvZmZzZXRdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7XG4gICAgICAgIHRhYmxlID0gdGFibGVzW3RhYmxlc05hbWVzW2ldXTtcbiAgICAgICAgdmFyIHBhZGRlZExlbmd0aCA9ICgodGFibGUubGVuZ3RoICsgMykgJiB+MykgPj4+IDA7XG4gICAgICAgIG9mZnNldCArPSBwYWRkZWRMZW5ndGg7XG4gICAgICAgIHRhYmxlT2Zmc2V0cy5wdXNoKG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWxlID0gbmV3IFVpbnQ4QXJyYXkob2Zmc2V0KTtcbiAgICAgIC8vIHdyaXRlIHRoZSB0YWJsZSBkYXRhIGZpcnN0IChtb3N0bHkgZm9yIGNoZWNrc3VtKVxuICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7XG4gICAgICAgIHRhYmxlID0gdGFibGVzW3RhYmxlc05hbWVzW2ldXTtcbiAgICAgICAgd3JpdGVEYXRhKGZpbGUsIHRhYmxlT2Zmc2V0c1tpXSwgdGFibGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBzZm50IHZlcnNpb24gKDQgYnl0ZXMpXG4gICAgICBpZiAoc2ZudCA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgLy8gV2luZG93cyBoYXRlcyB0aGUgTWFjIFRydWVUeXBlIHNmbnQgdmVyc2lvbiBudW1iZXJcbiAgICAgICAgc2ZudCA9IHN0cmluZzMyKDB4MDAwMTAwMDApO1xuICAgICAgfVxuICAgICAgZmlsZVswXSA9IHNmbnQuY2hhckNvZGVBdCgwKSAmIDB4ZmY7XG4gICAgICBmaWxlWzFdID0gc2ZudC5jaGFyQ29kZUF0KDEpICYgMHhmZjtcbiAgICAgIGZpbGVbMl0gPSBzZm50LmNoYXJDb2RlQXQoMikgJiAweGZmO1xuICAgICAgZmlsZVszXSA9IHNmbnQuY2hhckNvZGVBdCgzKSAmIDB4ZmY7XG5cbiAgICAgIC8vIG51bVRhYmxlcyAoMiBieXRlcylcbiAgICAgIHdyaXRlSW50MTYoZmlsZSwgNCwgbnVtVGFibGVzKTtcblxuICAgICAgdmFyIHNlYXJjaFBhcmFtcyA9IE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKG51bVRhYmxlcywgMTYpO1xuXG4gICAgICAvLyBzZWFyY2hSYW5nZSAoMiBieXRlcylcbiAgICAgIHdyaXRlSW50MTYoZmlsZSwgNiwgc2VhcmNoUGFyYW1zLnJhbmdlKTtcbiAgICAgIC8vIGVudHJ5U2VsZWN0b3IgKDIgYnl0ZXMpXG4gICAgICB3cml0ZUludDE2KGZpbGUsIDgsIHNlYXJjaFBhcmFtcy5lbnRyeSk7XG4gICAgICAvLyByYW5nZVNoaWZ0ICgyIGJ5dGVzKVxuICAgICAgd3JpdGVJbnQxNihmaWxlLCAxMCwgc2VhcmNoUGFyYW1zLnJhbmdlU2hpZnQpO1xuXG4gICAgICBvZmZzZXQgPSBPVEZfSEVBREVSX1NJWkU7XG4gICAgICAvLyB3cml0aW5nIHRhYmxlIGVudHJpZXNcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykge1xuICAgICAgICB0YWJsZU5hbWUgPSB0YWJsZXNOYW1lc1tpXTtcbiAgICAgICAgZmlsZVtvZmZzZXRdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMCkgJiAweGZmO1xuICAgICAgICBmaWxlW29mZnNldCArIDFdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMSkgJiAweGZmO1xuICAgICAgICBmaWxlW29mZnNldCArIDJdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMikgJiAweGZmO1xuICAgICAgICBmaWxlW29mZnNldCArIDNdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMykgJiAweGZmO1xuXG4gICAgICAgIC8vIGNoZWNrc3VtXG4gICAgICAgIHZhciBjaGVja3N1bSA9IDA7XG4gICAgICAgIGZvciAoaiA9IHRhYmxlT2Zmc2V0c1tpXSwgamogPSB0YWJsZU9mZnNldHNbaSArIDFdOyBqIDwgamo7IGogKz0gNCkge1xuICAgICAgICAgIHZhciBxdWFkID0gcmVhZFVpbnQzMihmaWxlLCBqKTtcbiAgICAgICAgICBjaGVja3N1bSA9IChjaGVja3N1bSArIHF1YWQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgNCwgY2hlY2tzdW0pO1xuXG4gICAgICAgIC8vIG9mZnNldFxuICAgICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDgsIHRhYmxlT2Zmc2V0c1tpXSk7XG4gICAgICAgIC8vIGxlbmd0aFxuICAgICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDEyLCB0YWJsZXNbdGFibGVOYW1lXS5sZW5ndGgpO1xuXG4gICAgICAgIG9mZnNldCArPSBPVEZfVEFCTEVfRU5UUllfU0laRTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWxlO1xuICAgIH0sXG5cbiAgICBhZGRUYWJsZTogZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl9hZGRUYWJsZSh0YWcsIGRhdGEpIHtcbiAgICAgIGlmICh0YWcgaW4gdGhpcy50YWJsZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgXCIgKyB0YWcgKyBcIiBhbHJlYWR5IGV4aXN0c1wiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGFibGVzW3RhZ10gPSBkYXRhO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIE9wZW5UeXBlRmlsZUJ1aWxkZXI7XG59KSgpO1xuXG4vKipcbiAqICdGb250JyBpcyB0aGUgY2xhc3MgdGhlIG91dHNpZGUgd29ybGQgc2hvdWxkIHVzZSwgaXQgZW5jYXBzdWxhdGUgYWxsIHRoZSBmb250XG4gKiBkZWNvZGluZyBsb2dpY3Mgd2hhdGV2ZXIgdHlwZSBpdCBpcyAoYXNzdW1pbmcgdGhlIGZvbnQgdHlwZSBpcyBzdXBwb3J0ZWQpLlxuICpcbiAqIEZvciBleGFtcGxlIHRvIHJlYWQgYSBUeXBlMSBmb250IGFuZCB0byBhdHRhY2ggaXQgdG8gdGhlIGRvY3VtZW50OlxuICogICB2YXIgdHlwZTFGb250ID0gbmV3IEZvbnQoXCJNeUZvbnROYW1lXCIsIGJpbmFyeUZpbGUsIHByb3BlcnRpZXNPYmplY3QpO1xuICogICB0eXBlMUZvbnQuYmluZCgpO1xuICovXG52YXIgRm9udCA9IChmdW5jdGlvbiBGb250Q2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpIHtcbiAgICB2YXIgY2hhckNvZGU7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubG9hZGVkTmFtZSA9IHByb3BlcnRpZXMubG9hZGVkTmFtZTtcbiAgICB0aGlzLmlzVHlwZTNGb250ID0gcHJvcGVydGllcy5pc1R5cGUzRm9udDtcbiAgICB0aGlzLm1pc3NpbmdGaWxlID0gZmFsc2U7XG5cbiAgICB0aGlzLmdseXBoQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdGhpcy5pc1NlcmlmRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBGb250RmxhZ3MuU2VyaWYpO1xuICAgIHRoaXMuaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlN5bWJvbGljKTtcbiAgICB0aGlzLmlzTW9ub3NwYWNlID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5GaXhlZFBpdGNoKTtcblxuICAgIHZhciB0eXBlID0gcHJvcGVydGllcy50eXBlO1xuICAgIHZhciBzdWJ0eXBlID0gcHJvcGVydGllcy5zdWJ0eXBlO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zdWJ0eXBlID0gc3VidHlwZTtcblxuICAgIGxldCBmYWxsYmFja05hbWUgPSBcInNhbnMtc2VyaWZcIjtcbiAgICBpZiAodGhpcy5pc01vbm9zcGFjZSkge1xuICAgICAgZmFsbGJhY2tOYW1lID0gXCJtb25vc3BhY2VcIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZXJpZkZvbnQpIHtcbiAgICAgIGZhbGxiYWNrTmFtZSA9IFwic2VyaWZcIjtcbiAgICB9XG4gICAgdGhpcy5mYWxsYmFja05hbWUgPSBmYWxsYmFja05hbWU7XG5cbiAgICB0aGlzLmRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlcztcbiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzO1xuICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gcHJvcGVydGllcy5kZWZhdWx0V2lkdGg7XG4gICAgdGhpcy5jb21wb3NpdGUgPSBwcm9wZXJ0aWVzLmNvbXBvc2l0ZTtcbiAgICB0aGlzLmNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7XG4gICAgdGhpcy5hc2NlbnQgPSBwcm9wZXJ0aWVzLmFzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUztcbiAgICB0aGlzLmRlc2NlbnQgPSBwcm9wZXJ0aWVzLmRlc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7XG4gICAgdGhpcy5mb250TWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4O1xuICAgIHRoaXMuYmJveCA9IHByb3BlcnRpZXMuYmJveDtcbiAgICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nO1xuXG4gICAgdGhpcy50b1VuaWNvZGUgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZTtcbiAgICB0aGlzLmZhbGxiYWNrVG9Vbmljb2RlID0gcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSB8fCBuZXcgVG9Vbmljb2RlTWFwKCk7XG5cbiAgICB0aGlzLnRvRm9udENoYXIgPSBbXTtcblxuICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09IFwiVHlwZTNcIikge1xuICAgICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7XG4gICAgICAgIHRoaXMudG9Gb250Q2hhcltjaGFyQ29kZV0gPVxuICAgICAgICAgIHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdIHx8IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nW2NoYXJDb2RlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9udFR5cGUgPSBGb250VHlwZS5UWVBFMztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNpZEVuY29kaW5nID0gcHJvcGVydGllcy5jaWRFbmNvZGluZztcbiAgICB0aGlzLnZlcnRpY2FsID0gISFwcm9wZXJ0aWVzLnZlcnRpY2FsO1xuICAgIGlmICh0aGlzLnZlcnRpY2FsKSB7XG4gICAgICB0aGlzLnZtZXRyaWNzID0gcHJvcGVydGllcy52bWV0cmljcztcbiAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7XG4gICAgfVxuXG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuaXNFbXB0eSkge1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgLy8gU29tZSBiYWQgUERGIGdlbmVyYXRvcnMgd2lsbCBpbmNsdWRlIGVtcHR5IGZvbnQgZmlsZXMsXG4gICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gcmVjb3ZlciBieSBhc3N1bWluZyB0aGF0IG5vIGZpbGUgZXhpc3RzLlxuICAgICAgICB3YXJuKCdGb250IGZpbGUgaXMgZW1wdHkgaW4gXCInICsgbmFtZSArICdcIiAoJyArIHRoaXMubG9hZGVkTmFtZSArIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgZm9udCBmaWxlIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB0eXBlL3N1YnR5cGUsIHJhdGhlciB0aGFuXG4gICAgLy8gcmVseWluZyBvbiB0aGUgKG9mdGVuIGluY29ycmVjdCkgZGF0YSBpbiB0aGUgZm9udCBkaWN0aW9uYXJ5OyAoc2VlIGUuZy5cbiAgICAvLyAgaXNzdWU2NzgyLnBkZiwgaXNzdWU3NTk4LnBkZiwgYW5kIGlzc3VlOTk0OS5wZGYpLlxuICAgIFt0eXBlLCBzdWJ0eXBlXSA9IGdldEZvbnRGaWxlVHlwZShmaWxlLCBwcm9wZXJ0aWVzKTtcblxuICAgIGlmICh0eXBlICE9PSB0aGlzLnR5cGUgfHwgc3VidHlwZSAhPT0gdGhpcy5zdWJ0eXBlKSB7XG4gICAgICBpbmZvKFxuICAgICAgICBcIkluY29uc2lzdGVudCBmb250IGZpbGUgVHlwZS9TdWJUeXBlLCBleHBlY3RlZDogXCIgK1xuICAgICAgICAgIGAke3RoaXMudHlwZX0vJHt0aGlzLnN1YnR5cGV9IGJ1dCBmb3VuZDogJHt0eXBlfS8ke3N1YnR5cGV9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBkYXRhO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJNTVR5cGUxXCI6XG4gICAgICAgICAgaW5mbyhcIk1NVHlwZTEgZm9udCAoXCIgKyBuYW1lICsgXCIpLCBmYWxsaW5nIGJhY2sgdG8gVHlwZTEuXCIpO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgXCJUeXBlMVwiOlxuICAgICAgICBjYXNlIFwiQ0lERm9udFR5cGUwXCI6XG4gICAgICAgICAgdGhpcy5taW1ldHlwZSA9IFwiZm9udC9vcGVudHlwZVwiO1xuXG4gICAgICAgICAgdmFyIGNmZiA9XG4gICAgICAgICAgICBzdWJ0eXBlID09PSBcIlR5cGUxQ1wiIHx8IHN1YnR5cGUgPT09IFwiQ0lERm9udFR5cGUwQ1wiXG4gICAgICAgICAgICAgID8gbmV3IENGRkZvbnQoZmlsZSwgcHJvcGVydGllcylcbiAgICAgICAgICAgICAgOiBuZXcgVHlwZTFGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgLy8gV3JhcCB0aGUgQ0ZGIGRhdGEgaW5zaWRlIGFuIE9URiBmb250IGZpbGVcbiAgICAgICAgICBkYXRhID0gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIk9wZW5UeXBlXCI6XG4gICAgICAgIGNhc2UgXCJUcnVlVHlwZVwiOlxuICAgICAgICBjYXNlIFwiQ0lERm9udFR5cGUyXCI6XG4gICAgICAgICAgdGhpcy5taW1ldHlwZSA9IFwiZm9udC9vcGVudHlwZVwiO1xuXG4gICAgICAgICAgLy8gUmVwYWlyIHRoZSBUcnVlVHlwZSBmaWxlLiBJdCBpcyBjYW4gYmUgZGFtYWdlZCBpbiB0aGUgcG9pbnQgb2ZcbiAgICAgICAgICAvLyB2aWV3IG9mIHRoZSBzYW5pdGl6ZXJcbiAgICAgICAgICBkYXRhID0gdGhpcy5jaGVja0FuZFJlcGFpcihuYW1lLCBmaWxlLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICBpZiAodGhpcy5pc09wZW5UeXBlKSB7XG4gICAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7XG5cbiAgICAgICAgICAgIHR5cGUgPSBcIk9wZW5UeXBlXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBGb250ICR7dHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHdhcm4oZSk7XG4gICAgICB0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLmZvbnRUeXBlID0gZ2V0Rm9udFR5cGUodHlwZSwgc3VidHlwZSk7XG5cbiAgICAvLyBUcmFuc2ZlciBzb21lIHByb3BlcnRpZXMgYWdhaW4gdGhhdCBjb3VsZCBjaGFuZ2UgZHVyaW5nIGZvbnQgY29udmVyc2lvblxuICAgIHRoaXMuZm9udE1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeDtcbiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzO1xuICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gcHJvcGVydGllcy5kZWZhdWx0V2lkdGg7XG4gICAgdGhpcy50b1VuaWNvZGUgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZTtcbiAgICB0aGlzLnNlYWNNYXAgPSBwcm9wZXJ0aWVzLnNlYWNNYXA7XG4gIH1cblxuICBmdW5jdGlvbiBpbnQxNihiMCwgYjEpIHtcbiAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZVNpZ25lZEludDE2KGJ5dGVzLCBpbmRleCwgdmFsdWUpIHtcbiAgICBieXRlc1tpbmRleCArIDFdID0gdmFsdWU7XG4gICAgYnl0ZXNbaW5kZXhdID0gdmFsdWUgPj4+IDg7XG4gIH1cblxuICBmdW5jdGlvbiBzaWduZWRJbnQxNihiMCwgYjEpIHtcbiAgICB2YXIgdmFsdWUgPSAoYjAgPDwgOCkgKyBiMTtcbiAgICByZXR1cm4gdmFsdWUgJiAoMSA8PCAxNSkgPyB2YWx1ZSAtIDB4MTAwMDAgOiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludDMyKGIwLCBiMSwgYjIsIGIzKSB7XG4gICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpbmcxNih2YWx1ZSkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCh2YWx1ZSA+PiA4KSAmIDB4ZmYsIHZhbHVlICYgMHhmZik7XG4gIH1cblxuICBmdW5jdGlvbiBzYWZlU3RyaW5nMTYodmFsdWUpIHtcbiAgICAvLyBjbGFtcCB2YWx1ZSB0byB0aGUgMTYtYml0IGludCByYW5nZVxuICAgIGlmICh2YWx1ZSA+IDB4N2ZmZikge1xuICAgICAgdmFsdWUgPSAweDdmZmY7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IC0weDgwMDApIHtcbiAgICAgIHZhbHVlID0gLTB4ODAwMDtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKHZhbHVlID4+IDgpICYgMHhmZiwgdmFsdWUgJiAweGZmKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVHJ1ZVR5cGVGaWxlKGZpbGUpIHtcbiAgICB2YXIgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHJlYWRVaW50MzIoaGVhZGVyLCAwKSA9PT0gMHgwMDAxMDAwMCB8fCBieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09IFwidHJ1ZVwiXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmaWxlKSB7XG4gICAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7XG4gICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoaGVhZGVyKSA9PT0gXCJ0dGNmXCI7XG4gIH1cblxuICBmdW5jdGlvbiBpc09wZW5UeXBlRmlsZShmaWxlKSB7XG4gICAgdmFyIGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpO1xuICAgIHJldHVybiBieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09IFwiT1RUT1wiO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNUeXBlMUZpbGUoZmlsZSkge1xuICAgIHZhciBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcygyKTtcbiAgICAvLyBBbGwgVHlwZTEgZm9udCBwcm9ncmFtcyBtdXN0IGJlZ2luIHdpdGggdGhlIGNvbW1lbnQgJyUhJyAoMHgyNSArIDB4MjEpLlxuICAgIGlmIChoZWFkZXJbMF0gPT09IDB4MjUgJiYgaGVhZGVyWzFdID09PSAweDIxKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gLi4uIG9idmlvdXNseSBzb21lIGZvbnRzIHZpb2xhdGUgdGhhdCBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLFxuICAgIC8vIHBsZWFzZSByZWZlciB0byB0aGUgY29tbWVudCBpbiB8VHlwZTFGb250fCBiZWxvdyAocGZiIGZpbGUgaGVhZGVyKS5cbiAgICBpZiAoaGVhZGVyWzBdID09PSAweDgwICYmIGhlYWRlclsxXSA9PT0gMHgwMSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlZCB0byBvdGhlciBmb250IGZvcm1hdHMsIHRoZSBoZWFkZXIgaW4gQ0ZGIGZpbGVzIGlzIG5vdCBjb25zdGFudFxuICAgKiBidXQgY29udGFpbnMgdmVyc2lvbiBudW1iZXJzLiBUbyByZWR1Y2UgdGhlIHBvc3NpYmlsaXR5IG9mIG1pc2NsYXNzaWZ5aW5nXG4gICAqIGZvbnQgZmlsZXMgYXMgQ0ZGLCBpdCdzIHJlY29tbWVuZGVkIHRvIGNoZWNrIGZvciBvdGhlciBmb250IGZvcm1hdHMgZmlyc3QuXG4gICAqL1xuICBmdW5jdGlvbiBpc0NGRkZpbGUoZmlsZSkge1xuICAgIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpO1xuICAgIGlmIChcbiAgICAgIC8qIG1ham9yIHZlcnNpb24sIFsxLCAyNTVdICovIGhlYWRlclswXSA+PSAxICYmXG4gICAgICAvKiBtaW5vciB2ZXJzaW9uLCBbMCwgMjU1XTsgaGVhZGVyWzFdICovXG4gICAgICAvKiBoZWFkZXIgc2l6ZSwgWzAsIDI1NV07IGhlYWRlclsyXSAqL1xuICAgICAgLyogb2Zmc2V0KDApIHNpemUsIFsxLCA0XSAqLyBoZWFkZXJbM10gPj0gMSAmJlxuICAgICAgaGVhZGVyWzNdIDw9IDRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb250RmlsZVR5cGUoZmlsZSwgeyB0eXBlLCBzdWJ0eXBlLCBjb21wb3NpdGUgfSkge1xuICAgIGxldCBmaWxlVHlwZSwgZmlsZVN1YnR5cGU7XG5cbiAgICBpZiAoaXNUcnVlVHlwZUZpbGUoZmlsZSkgfHwgaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpKSB7XG4gICAgICBpZiAoY29tcG9zaXRlKSB7XG4gICAgICAgIGZpbGVUeXBlID0gXCJDSURGb250VHlwZTJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVUeXBlID0gXCJUcnVlVHlwZVwiO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPcGVuVHlwZUZpbGUoZmlsZSkpIHtcbiAgICAgIGlmIChjb21wb3NpdGUpIHtcbiAgICAgICAgZmlsZVR5cGUgPSBcIkNJREZvbnRUeXBlMlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZVR5cGUgPSBcIk9wZW5UeXBlXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1R5cGUxRmlsZShmaWxlKSkge1xuICAgICAgaWYgKGNvbXBvc2l0ZSkge1xuICAgICAgICBmaWxlVHlwZSA9IFwiQ0lERm9udFR5cGUwXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlVHlwZSA9IHR5cGUgPT09IFwiTU1UeXBlMVwiID8gXCJNTVR5cGUxXCIgOiBcIlR5cGUxXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0NGRkZpbGUoZmlsZSkpIHtcbiAgICAgIGlmIChjb21wb3NpdGUpIHtcbiAgICAgICAgZmlsZVR5cGUgPSBcIkNJREZvbnRUeXBlMFwiO1xuICAgICAgICBmaWxlU3VidHlwZSA9IFwiQ0lERm9udFR5cGUwQ1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSBcIk1NVHlwZTFcIiA/IFwiTU1UeXBlMVwiIDogXCJUeXBlMVwiO1xuICAgICAgICBmaWxlU3VidHlwZSA9IFwiVHlwZTFDXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oXCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLlwiKTtcbiAgICAgIGZpbGVUeXBlID0gdHlwZTtcbiAgICAgIGZpbGVTdWJ0eXBlID0gc3VidHlwZTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2ZpbGVUeXBlLCBmaWxlU3VidHlwZV07XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFRvRm9udENoYXIoZW5jb2RpbmcsIGdseXBoc1VuaWNvZGVNYXAsIGRpZmZlcmVuY2VzKSB7XG4gICAgdmFyIHRvRm9udENoYXIgPSBbXSxcbiAgICAgIHVuaWNvZGU7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZW5jb2RpbmcubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChlbmNvZGluZ1tpXSwgZ2x5cGhzVW5pY29kZU1hcCk7XG4gICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHtcbiAgICAgICAgdG9Gb250Q2hhcltpXSA9IHVuaWNvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzKSB7XG4gICAgICB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGRpZmZlcmVuY2VzW2NoYXJDb2RlXSwgZ2x5cGhzVW5pY29kZU1hcCk7XG4gICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHtcbiAgICAgICAgdG9Gb250Q2hhclsrY2hhckNvZGVdID0gdW5pY29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvRm9udENoYXI7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZHMgdGhlIGNoYXIgY29kZSB0byBnbHlwaCBJRCBtYXAgYnkgbW92aW5nIGFsbCBjaGFyIGNvZGVzIHRvIHRoZVxuICAgKiBwcml2YXRlIHVzZSBhcmVhLiBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgaXNzdWVzIHdpdGggdmFyaW91cyBwcm9ibGVtYXRpY1xuICAgKiB1bmljb2RlIGFyZWFzIHdoZXJlIGVpdGhlciBhIGdseXBoIHdvbid0IGJlIGRyYXduIG9yIGlzIGRlZm9ybWVkIGJ5IGFcbiAgICogc2hhcGVyLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUd28gcHJvcGVydGllczpcbiAgICogJ3RvRm9udENoYXInIC0gbWFwcyBvcmlnaW5hbCBjaGFyIGNvZGVzKHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgcmVhZFxuICAgKiBmcm9tIGNvbW1hbmRzIHN1Y2ggYXMgc2hvdyB0ZXh0KSB0byB0aGUgY2hhciBjb2RlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGVcbiAgICogZm9udCB0aGF0IHdlIGJ1aWxkXG4gICAqICdjaGFyQ29kZVRvR2x5cGhJZCcgLSBtYXBzIHRoZSBuZXcgZm9udCBjaGFyIGNvZGVzIHRvIGdseXBoIGlkc1xuICAgKi9cbiAgZnVuY3Rpb24gYWRqdXN0TWFwcGluZyhjaGFyQ29kZVRvR2x5cGhJZCwgaGFzR2x5cGgsIG5ld0dseXBoWmVyb0lkKSB7XG4gICAgdmFyIG5ld01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIHRvRm9udENoYXIgPSBbXTtcbiAgICB2YXIgcHJpdmF0ZVVzZUFyZWFJbmRleCA9IDA7XG4gICAgdmFyIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTtcbiAgICB2YXIgcHJpdmF0ZVVzZU9mZmV0RW5kID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMV07XG4gICAgZm9yICh2YXIgb3JpZ2luYWxDaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkge1xuICAgICAgb3JpZ2luYWxDaGFyQ29kZSB8PSAwO1xuICAgICAgdmFyIGdseXBoSWQgPSBjaGFyQ29kZVRvR2x5cGhJZFtvcmlnaW5hbENoYXJDb2RlXTtcbiAgICAgIC8vIEZvciBtaXNzaW5nIGdseXBocyBkb24ndCBjcmVhdGUgdGhlIG1hcHBpbmdzIHNvIHRoZSBnbHlwaCBpc24ndFxuICAgICAgLy8gZHJhd24uXG4gICAgICBpZiAoIWhhc0dseXBoKGdseXBoSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPiBwcml2YXRlVXNlT2ZmZXRFbmQpIHtcbiAgICAgICAgcHJpdmF0ZVVzZUFyZWFJbmRleCsrO1xuICAgICAgICBpZiAocHJpdmF0ZVVzZUFyZWFJbmRleCA+PSBQUklWQVRFX1VTRV9BUkVBUy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuKFwiUmFuIG91dCBvZiBzcGFjZSBpbiBmb250IHByaXZhdGUgdXNlIGFyZWEuXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTtcbiAgICAgICAgcHJpdmF0ZVVzZU9mZmV0RW5kID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMV07XG4gICAgICB9XG4gICAgICB2YXIgZm9udENoYXJDb2RlID0gbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrO1xuICAgICAgaWYgKGdseXBoSWQgPT09IDApIHtcbiAgICAgICAgZ2x5cGhJZCA9IG5ld0dseXBoWmVyb0lkO1xuICAgICAgfVxuXG4gICAgICBuZXdNYXBbZm9udENoYXJDb2RlXSA9IGdseXBoSWQ7XG4gICAgICB0b0ZvbnRDaGFyW29yaWdpbmFsQ2hhckNvZGVdID0gZm9udENoYXJDb2RlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdG9Gb250Q2hhcixcbiAgICAgIGNoYXJDb2RlVG9HbHlwaElkOiBuZXdNYXAsXG4gICAgICBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSYW5nZXMoZ2x5cGhzLCBudW1HbHlwaHMpIHtcbiAgICAvLyBBcnJheS5zb3J0KCkgc29ydHMgYnkgY2hhcmFjdGVycywgbm90IG51bWVyaWNhbGx5LCBzbyBjb252ZXJ0IHRvIGFuXG4gICAgLy8gYXJyYXkgb2YgY2hhcmFjdGVycy5cbiAgICB2YXIgY29kZXMgPSBbXTtcbiAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBnbHlwaHMpIHtcbiAgICAgIC8vIFJlbW92ZSBhbiBpbnZhbGlkIGdseXBoIElEIG1hcHBpbmdzIHRvIG1ha2UgT1RTIGhhcHB5LlxuICAgICAgaWYgKGdseXBoc1tjaGFyQ29kZV0gPj0gbnVtR2x5cGhzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29kZXMucHVzaCh7IGZvbnRDaGFyQ29kZTogY2hhckNvZGUgfCAwLCBnbHlwaElkOiBnbHlwaHNbY2hhckNvZGVdIH0pO1xuICAgIH1cbiAgICAvLyBTb21lIGZvbnRzIGhhdmUgemVybyBnbHlwaHMgYW5kIGFyZSB1c2VkIG9ubHkgZm9yIHRleHQgc2VsZWN0aW9uLCBidXRcbiAgICAvLyB0aGVyZSBuZWVkcyB0byBiZSBhdCBsZWFzdCBvbmUgdG8gYnVpbGQgYSB2YWxpZCBjbWFwIHRhYmxlLlxuICAgIGlmIChjb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvZGVzLnB1c2goeyBmb250Q2hhckNvZGU6IDAsIGdseXBoSWQ6IDAgfSk7XG4gICAgfVxuICAgIGNvZGVzLnNvcnQoZnVuY3Rpb24gZm9udEdldFJhbmdlc1NvcnQoYSwgYikge1xuICAgICAgcmV0dXJuIGEuZm9udENoYXJDb2RlIC0gYi5mb250Q2hhckNvZGU7XG4gICAgfSk7XG5cbiAgICAvLyBTcGxpdCB0aGUgc29ydGVkIGNvZGVzIGludG8gcmFuZ2VzLlxuICAgIHZhciByYW5nZXMgPSBbXTtcbiAgICB2YXIgbGVuZ3RoID0gY29kZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbGVuZ3RoOyApIHtcbiAgICAgIHZhciBzdGFydCA9IGNvZGVzW25dLmZvbnRDaGFyQ29kZTtcbiAgICAgIHZhciBjb2RlSW5kaWNlcyA9IFtjb2Rlc1tuXS5nbHlwaElkXTtcbiAgICAgICsrbjtcbiAgICAgIHZhciBlbmQgPSBzdGFydDtcbiAgICAgIHdoaWxlIChuIDwgbGVuZ3RoICYmIGVuZCArIDEgPT09IGNvZGVzW25dLmZvbnRDaGFyQ29kZSkge1xuICAgICAgICBjb2RlSW5kaWNlcy5wdXNoKGNvZGVzW25dLmdseXBoSWQpO1xuICAgICAgICArK2VuZDtcbiAgICAgICAgKytuO1xuICAgICAgICBpZiAoZW5kID09PSAweGZmZmYpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmFuZ2VzLnB1c2goW3N0YXJ0LCBlbmQsIGNvZGVJbmRpY2VzXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNtYXBUYWJsZShnbHlwaHMsIG51bUdseXBocykge1xuICAgIHZhciByYW5nZXMgPSBnZXRSYW5nZXMoZ2x5cGhzLCBudW1HbHlwaHMpO1xuICAgIHZhciBudW1UYWJsZXMgPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdWzFdID4gMHhmZmZmID8gMiA6IDE7XG4gICAgdmFyIGNtYXAgPVxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyB2ZXJzaW9uXG4gICAgICBzdHJpbmcxNihudW1UYWJsZXMpICsgLy8gbnVtVGFibGVzXG4gICAgICBcIlxceDAwXFx4MDNcIiArIC8vIHBsYXRmb3JtSURcbiAgICAgIFwiXFx4MDBcXHgwMVwiICsgLy8gZW5jb2RpbmdJRFxuICAgICAgc3RyaW5nMzIoNCArIG51bVRhYmxlcyAqIDgpOyAvLyBzdGFydCBvZiB0aGUgdGFibGUgcmVjb3JkXG5cbiAgICB2YXIgaSwgaWksIGosIGpqO1xuICAgIGZvciAoaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgaWYgKHJhbmdlc1tpXVswXSA8PSAweGZmZmYpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBibXBMZW5ndGggPSBpICsgMTtcblxuICAgIGlmIChyYW5nZXNbaV1bMF0gPCAweGZmZmYgJiYgcmFuZ2VzW2ldWzFdID09PSAweGZmZmYpIHtcbiAgICAgIHJhbmdlc1tpXVsxXSA9IDB4ZmZmZTtcbiAgICB9XG4gICAgdmFyIHRyYWlsaW5nUmFuZ2VzQ291bnQgPSByYW5nZXNbaV1bMV0gPCAweGZmZmYgPyAxIDogMDtcbiAgICB2YXIgc2VnQ291bnQgPSBibXBMZW5ndGggKyB0cmFpbGluZ1Jhbmdlc0NvdW50O1xuICAgIHZhciBzZWFyY2hQYXJhbXMgPSBPcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcyhzZWdDb3VudCwgMik7XG5cbiAgICAvLyBGaWxsIHVwIHRoZSA0IHBhcmFsbGVsIGFycmF5cyBkZXNjcmliaW5nIHRoZSBzZWdtZW50cy5cbiAgICB2YXIgc3RhcnRDb3VudCA9IFwiXCI7XG4gICAgdmFyIGVuZENvdW50ID0gXCJcIjtcbiAgICB2YXIgaWREZWx0YXMgPSBcIlwiO1xuICAgIHZhciBpZFJhbmdlT2Zmc2V0cyA9IFwiXCI7XG4gICAgdmFyIGdseXBoc0lkcyA9IFwiXCI7XG4gICAgdmFyIGJpYXMgPSAwO1xuXG4gICAgdmFyIHJhbmdlLCBzdGFydCwgZW5kLCBjb2RlcztcbiAgICBmb3IgKGkgPSAwLCBpaSA9IGJtcExlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgc3RhcnQgPSByYW5nZVswXTtcbiAgICAgIGVuZCA9IHJhbmdlWzFdO1xuICAgICAgc3RhcnRDb3VudCArPSBzdHJpbmcxNihzdGFydCk7XG4gICAgICBlbmRDb3VudCArPSBzdHJpbmcxNihlbmQpO1xuICAgICAgY29kZXMgPSByYW5nZVsyXTtcbiAgICAgIHZhciBjb250aWd1b3VzID0gdHJ1ZTtcbiAgICAgIGZvciAoaiA9IDEsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgICAgICBpZiAoY29kZXNbal0gIT09IGNvZGVzW2ogLSAxXSArIDEpIHtcbiAgICAgICAgICBjb250aWd1b3VzID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghY29udGlndW91cykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gKHNlZ0NvdW50IC0gaSkgKiAyICsgYmlhcyAqIDI7XG4gICAgICAgIGJpYXMgKz0gZW5kIC0gc3RhcnQgKyAxO1xuXG4gICAgICAgIGlkRGVsdGFzICs9IHN0cmluZzE2KDApO1xuICAgICAgICBpZFJhbmdlT2Zmc2V0cyArPSBzdHJpbmcxNihvZmZzZXQpO1xuXG4gICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgICAgICAgIGdseXBoc0lkcyArPSBzdHJpbmcxNihjb2Rlc1tqXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzdGFydENvZGUgPSBjb2Rlc1swXTtcblxuICAgICAgICBpZERlbHRhcyArPSBzdHJpbmcxNigoc3RhcnRDb2RlIC0gc3RhcnQpICYgMHhmZmZmKTtcbiAgICAgICAgaWRSYW5nZU9mZnNldHMgKz0gc3RyaW5nMTYoMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRyYWlsaW5nUmFuZ2VzQ291bnQgPiAwKSB7XG4gICAgICBlbmRDb3VudCArPSBcIlxceEZGXFx4RkZcIjtcbiAgICAgIHN0YXJ0Q291bnQgKz0gXCJcXHhGRlxceEZGXCI7XG4gICAgICBpZERlbHRhcyArPSBcIlxceDAwXFx4MDFcIjtcbiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IFwiXFx4MDBcXHgwMFwiO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQzMTQgPVxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyBsYW5ndWFnZVxuICAgICAgc3RyaW5nMTYoMiAqIHNlZ0NvdW50KSArXG4gICAgICBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2UpICtcbiAgICAgIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5lbnRyeSkgK1xuICAgICAgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLnJhbmdlU2hpZnQpICtcbiAgICAgIGVuZENvdW50ICtcbiAgICAgIFwiXFx4MDBcXHgwMFwiICtcbiAgICAgIHN0YXJ0Q291bnQgK1xuICAgICAgaWREZWx0YXMgK1xuICAgICAgaWRSYW5nZU9mZnNldHMgK1xuICAgICAgZ2x5cGhzSWRzO1xuXG4gICAgdmFyIGZvcm1hdDMxMDEyID0gXCJcIjtcbiAgICB2YXIgaGVhZGVyMzEwMTIgPSBcIlwiO1xuICAgIGlmIChudW1UYWJsZXMgPiAxKSB7XG4gICAgICBjbWFwICs9XG4gICAgICAgIFwiXFx4MDBcXHgwM1wiICsgLy8gcGxhdGZvcm1JRFxuICAgICAgICBcIlxceDAwXFx4MEFcIiArIC8vIGVuY29kaW5nSURcbiAgICAgICAgc3RyaW5nMzIoNCArIG51bVRhYmxlcyAqIDggKyA0ICsgZm9ybWF0MzE0Lmxlbmd0aCk7IC8vIHN0YXJ0IG9mIHRoZSB0YWJsZSByZWNvcmRcbiAgICAgIGZvcm1hdDMxMDEyID0gXCJcIjtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gcmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgIHN0YXJ0ID0gcmFuZ2VbMF07XG4gICAgICAgIGNvZGVzID0gcmFuZ2VbMl07XG4gICAgICAgIHZhciBjb2RlID0gY29kZXNbMF07XG4gICAgICAgIGZvciAoaiA9IDEsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgICAgICAgIGlmIChjb2Rlc1tqXSAhPT0gY29kZXNbaiAtIDFdICsgMSkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2VbMF0gKyBqIC0gMTtcbiAgICAgICAgICAgIGZvcm1hdDMxMDEyICs9XG4gICAgICAgICAgICAgIHN0cmluZzMyKHN0YXJ0KSArIC8vIHN0YXJ0Q2hhckNvZGVcbiAgICAgICAgICAgICAgc3RyaW5nMzIoZW5kKSArIC8vIGVuZENoYXJDb2RlXG4gICAgICAgICAgICAgIHN0cmluZzMyKGNvZGUpOyAvLyBzdGFydEdseXBoSURcbiAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTtcbiAgICAgICAgICAgIGNvZGUgPSBjb2Rlc1tqXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9ybWF0MzEwMTIgKz1cbiAgICAgICAgICBzdHJpbmczMihzdGFydCkgKyAvLyBzdGFydENoYXJDb2RlXG4gICAgICAgICAgc3RyaW5nMzIocmFuZ2VbMV0pICsgLy8gZW5kQ2hhckNvZGVcbiAgICAgICAgICBzdHJpbmczMihjb2RlKTsgLy8gc3RhcnRHbHlwaElEXG4gICAgICB9XG4gICAgICBoZWFkZXIzMTAxMiA9XG4gICAgICAgIFwiXFx4MDBcXHgwQ1wiICsgLy8gZm9ybWF0XG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gcmVzZXJ2ZWRcbiAgICAgICAgc3RyaW5nMzIoZm9ybWF0MzEwMTIubGVuZ3RoICsgMTYpICsgLy8gbGVuZ3RoXG4gICAgICAgIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcIiArIC8vIGxhbmd1YWdlXG4gICAgICAgIHN0cmluZzMyKGZvcm1hdDMxMDEyLmxlbmd0aCAvIDEyKTsgLy8gbkdyb3Vwc1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjbWFwICtcbiAgICAgIFwiXFx4MDBcXHgwNFwiICsgLy8gZm9ybWF0XG4gICAgICBzdHJpbmcxNihmb3JtYXQzMTQubGVuZ3RoICsgNCkgKyAvLyBsZW5ndGhcbiAgICAgIGZvcm1hdDMxNCArXG4gICAgICBoZWFkZXIzMTAxMiArXG4gICAgICBmb3JtYXQzMTAxMlxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZU9TMlRhYmxlKG9zMiwgZmlsZSkge1xuICAgIGZpbGUucG9zID0gKGZpbGUuc3RhcnQgfHwgMCkgKyBvczIub2Zmc2V0O1xuICAgIHZhciB2ZXJzaW9uID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAvLyBUT0RPIHZlcmlmeSBhbGwgT1MvMiB0YWJsZXMgZmllbGRzLCBidXQgY3VycmVudGx5IHdlIHZhbGlkYXRlIG9ubHkgdGhvc2VcbiAgICAvLyB0aGF0IGdpdmUgdXMgaXNzdWVzXG4gICAgZmlsZS5za2lwKDYwKTsgLy8gc2tpcHBpbmcgdHlwZSwgbWlzYyBzaXplcywgcGFub3NlLCB1bmljb2RlIHJhbmdlc1xuICAgIHZhciBzZWxlY3Rpb24gPSBmaWxlLmdldFVpbnQxNigpO1xuICAgIGlmICh2ZXJzaW9uIDwgNCAmJiBzZWxlY3Rpb24gJiAweDAzMDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGZpcnN0Q2hhciA9IGZpbGUuZ2V0VWludDE2KCk7XG4gICAgdmFyIGxhc3RDaGFyID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICBpZiAoZmlyc3RDaGFyID4gbGFzdENoYXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZmlsZS5za2lwKDYpOyAvLyBza2lwcGluZyBzVHlwb0FzY2VuZGVyL0Rlc2NlbmRlci9MaW5lR2FwXG4gICAgdmFyIHVzV2luQXNjZW50ID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICBpZiAodXNXaW5Bc2NlbnQgPT09IDApIHtcbiAgICAgIC8vIG1ha2VzIGZvbnQgdW5yZWFkYWJsZSBieSB3aW5kb3dzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT1MvMiBhcHBlYXJzIHRvIGJlIHZhbGlkLCByZXNldHRpbmcgc29tZSBmaWVsZHNcbiAgICBvczIuZGF0YVs4XSA9IG9zMi5kYXRhWzldID0gMDsgLy8gSUUgcmVqZWN0cyBmb250cyBpZiBmc1R5cGUgIT0gMFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgY2hhcnN0cmluZ3MsIG92ZXJyaWRlKSB7XG4gICAgb3ZlcnJpZGUgPSBvdmVycmlkZSB8fCB7XG4gICAgICB1bml0c1BlckVtOiAwLFxuICAgICAgeU1heDogMCxcbiAgICAgIHlNaW46IDAsXG4gICAgICBhc2NlbnQ6IDAsXG4gICAgICBkZXNjZW50OiAwLFxuICAgIH07XG5cbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UxID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UyID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2UzID0gMDtcbiAgICB2YXIgdWxVbmljb2RlUmFuZ2U0ID0gMDtcblxuICAgIHZhciBmaXJzdENoYXJJbmRleCA9IG51bGw7XG4gICAgdmFyIGxhc3RDaGFySW5kZXggPSAwO1xuXG4gICAgaWYgKGNoYXJzdHJpbmdzKSB7XG4gICAgICBmb3IgKHZhciBjb2RlIGluIGNoYXJzdHJpbmdzKSB7XG4gICAgICAgIGNvZGUgfD0gMDtcbiAgICAgICAgaWYgKGZpcnN0Q2hhckluZGV4ID4gY29kZSB8fCAhZmlyc3RDaGFySW5kZXgpIHtcbiAgICAgICAgICBmaXJzdENoYXJJbmRleCA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RDaGFySW5kZXggPCBjb2RlKSB7XG4gICAgICAgICAgbGFzdENoYXJJbmRleCA9IGNvZGU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9zaXRpb24gPSBnZXRVbmljb2RlUmFuZ2VGb3IoY29kZSk7XG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDMyKSB7XG4gICAgICAgICAgdWxVbmljb2RlUmFuZ2UxIHw9IDEgPDwgcG9zaXRpb247XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCA2NCkge1xuICAgICAgICAgIHVsVW5pY29kZVJhbmdlMiB8PSAxIDw8IChwb3NpdGlvbiAtIDMyKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDk2KSB7XG4gICAgICAgICAgdWxVbmljb2RlUmFuZ2UzIHw9IDEgPDwgKHBvc2l0aW9uIC0gNjQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgMTIzKSB7XG4gICAgICAgICAgdWxVbmljb2RlUmFuZ2U0IHw9IDEgPDwgKHBvc2l0aW9uIC0gOTYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgICAgIFwiVW5pY29kZSByYW5nZXMgQml0cyA+IDEyMyBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobGFzdENoYXJJbmRleCA+IDB4ZmZmZikge1xuICAgICAgICAvLyBPUzIgb25seSBzdXBwb3J0cyBhIDE2IGJpdCBpbnQuIFRoZSBzcGVjIHNheXMgaWYgc3VwcGxlbWVudGFyeVxuICAgICAgICAvLyBjaGFyYWN0ZXJzIGFyZSB1c2VkIHRoZSBmaWVsZCBzaG91bGQganVzdCBiZSBzZXQgdG8gMHhGRkZGLlxuICAgICAgICBsYXN0Q2hhckluZGV4ID0gMHhmZmZmO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPXG4gICAgICBmaXJzdENoYXJJbmRleCA9IDA7XG4gICAgICBsYXN0Q2hhckluZGV4ID0gMjU1O1xuICAgIH1cblxuICAgIHZhciBiYm94ID0gcHJvcGVydGllcy5iYm94IHx8IFswLCAwLCAwLCAwXTtcbiAgICB2YXIgdW5pdHNQZXJFbSA9XG4gICAgICBvdmVycmlkZS51bml0c1BlckVtIHx8XG4gICAgICAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWClbMF07XG5cbiAgICAvLyBpZiB0aGUgZm9udCB1bml0cyBkaWZmZXIgdG8gdGhlIFBERiBnbHlwaCBzcGFjZSB1bml0c1xuICAgIC8vIHRoZW4gc2NhbGUgdXAgdGhlIHZhbHVlc1xuICAgIHZhciBzY2FsZSA9IHByb3BlcnRpZXMuYXNjZW50U2NhbGVkXG4gICAgICA/IDEuMFxuICAgICAgOiB1bml0c1BlckVtIC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTO1xuXG4gICAgdmFyIHR5cG9Bc2NlbnQgPVxuICAgICAgb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpO1xuICAgIHZhciB0eXBvRGVzY2VudCA9XG4gICAgICBvdmVycmlkZS5kZXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5kZXNjZW50IHx8IGJib3hbMV0pKTtcbiAgICBpZiAodHlwb0Rlc2NlbnQgPiAwICYmIHByb3BlcnRpZXMuZGVzY2VudCA+IDAgJiYgYmJveFsxXSA8IDApIHtcbiAgICAgIHR5cG9EZXNjZW50ID0gLXR5cG9EZXNjZW50OyAvLyBmaXhpbmcgaW5jb3JyZWN0IGRlc2NlbnRcbiAgICB9XG4gICAgdmFyIHdpbkFzY2VudCA9IG92ZXJyaWRlLnlNYXggfHwgdHlwb0FzY2VudDtcbiAgICB2YXIgd2luRGVzY2VudCA9IC1vdmVycmlkZS55TWluIHx8IC10eXBvRGVzY2VudDtcblxuICAgIHJldHVybiAoXG4gICAgICBcIlxceDAwXFx4MDNcIiArIC8vIHZlcnNpb25cbiAgICAgIFwiXFx4MDJcXHgyNFwiICsgLy8geEF2Z0NoYXJXaWR0aFxuICAgICAgXCJcXHgwMVxceEY0XCIgKyAvLyB1c1dlaWdodENsYXNzXG4gICAgICBcIlxceDAwXFx4MDVcIiArIC8vIHVzV2lkdGhDbGFzc1xuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyBmc3R5cGUgKDAgdG8gbGV0IHRoZSBmb250IGxvYWRzIHZpYSBmb250LWZhY2Ugb24gSUUpXG4gICAgICBcIlxceDAyXFx4OEFcIiArIC8vIHlTdWJzY3JpcHRYU2l6ZVxuICAgICAgXCJcXHgwMlxceEJCXCIgKyAvLyB5U3Vic2NyaXB0WVNpemVcbiAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8geVN1YnNjcmlwdFhPZmZzZXRcbiAgICAgIFwiXFx4MDBcXHg4Q1wiICsgLy8geVN1YnNjcmlwdFlPZmZzZXRcbiAgICAgIFwiXFx4MDJcXHg4QVwiICsgLy8geVN1cGVyU2NyaXB0WFNpemVcbiAgICAgIFwiXFx4MDJcXHhCQlwiICsgLy8geVN1cGVyU2NyaXB0WVNpemVcbiAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8geVN1cGVyU2NyaXB0WE9mZnNldFxuICAgICAgXCJcXHgwMVxceERGXCIgKyAvLyB5U3VwZXJTY3JpcHRZT2Zmc2V0XG4gICAgICBcIlxceDAwXFx4MzFcIiArIC8vIHlTdHJpa2VPdXRTaXplXG4gICAgICBcIlxceDAxXFx4MDJcIiArIC8vIHlTdHJpa2VPdXRQb3NpdGlvblxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyBzRmFtaWx5Q2xhc3NcbiAgICAgIFwiXFx4MDBcXHgwMFxceDA2XCIgK1xuICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZShwcm9wZXJ0aWVzLmZpeGVkUGl0Y2ggPyAweDA5IDogMHgwMCkgK1xuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcIiArIC8vIFBhbm9zZVxuICAgICAgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2UxKSArIC8vIHVsVW5pY29kZVJhbmdlMSAoQml0cyAwLTMxKVxuICAgICAgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2UyKSArIC8vIHVsVW5pY29kZVJhbmdlMiAoQml0cyAzMi02MylcbiAgICAgIHN0cmluZzMyKHVsVW5pY29kZVJhbmdlMykgKyAvLyB1bFVuaWNvZGVSYW5nZTMgKEJpdHMgNjQtOTUpXG4gICAgICBzdHJpbmczMih1bFVuaWNvZGVSYW5nZTQpICsgLy8gdWxVbmljb2RlUmFuZ2U0IChCaXRzIDk2LTEyNylcbiAgICAgIFwiXFx4MkFcXHgzMlxceDMxXFx4MkFcIiArIC8vIGFjaFZlbmRJRFxuICAgICAgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDEgOiAwKSArIC8vIGZzU2VsZWN0aW9uXG4gICAgICBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyAvLyB1c0ZpcnN0Q2hhckluZGV4XG4gICAgICBzdHJpbmcxNihsYXN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMubGFzdENoYXIpICsgLy8gdXNMYXN0Q2hhckluZGV4XG4gICAgICBzdHJpbmcxNih0eXBvQXNjZW50KSArIC8vIHNUeXBvQXNjZW5kZXJcbiAgICAgIHN0cmluZzE2KHR5cG9EZXNjZW50KSArIC8vIHNUeXBvRGVzY2VuZGVyXG4gICAgICBcIlxceDAwXFx4NjRcIiArIC8vIHNUeXBvTGluZUdhcCAoNyUtMTAlIG9mIHRoZSB1bml0c1BlckVNIHZhbHVlKVxuICAgICAgc3RyaW5nMTYod2luQXNjZW50KSArIC8vIHVzV2luQXNjZW50XG4gICAgICBzdHJpbmcxNih3aW5EZXNjZW50KSArIC8vIHVzV2luRGVzY2VudFxuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiICsgLy8gdWxDb2RlUGFnZVJhbmdlMSAoQml0cyAwLTMxKVxuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiICsgLy8gdWxDb2RlUGFnZVJhbmdlMiAoQml0cyAzMi02MylcbiAgICAgIHN0cmluZzE2KHByb3BlcnRpZXMueEhlaWdodCkgKyAvLyBzeEhlaWdodFxuICAgICAgc3RyaW5nMTYocHJvcGVydGllcy5jYXBIZWlnaHQpICsgLy8gc0NhcEhlaWdodFxuICAgICAgc3RyaW5nMTYoMCkgKyAvLyB1c0RlZmF1bHRDaGFyXG4gICAgICBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyAvLyB1c0JyZWFrQ2hhclxuICAgICAgXCJcXHgwMFxceDAzXCJcbiAgICApOyAvLyB1c01heENvbnRleHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBvc3RUYWJsZShwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGFuZ2xlID0gTWF0aC5mbG9vcihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlICogMiAqKiAxNik7XG4gICAgcmV0dXJuIChcbiAgICAgIFwiXFx4MDBcXHgwM1xceDAwXFx4MDBcIiArIC8vIFZlcnNpb24gbnVtYmVyXG4gICAgICBzdHJpbmczMihhbmdsZSkgKyAvLyBpdGFsaWNBbmdsZVxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyB1bmRlcmxpbmVQb3NpdGlvblxuICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyB1bmRlcmxpbmVUaGlja25lc3NcbiAgICAgIHN0cmluZzMyKHByb3BlcnRpZXMuZml4ZWRQaXRjaCkgKyAvLyBpc0ZpeGVkUGl0Y2hcbiAgICAgIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcIiArIC8vIG1pbk1lbVR5cGU0MlxuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiICsgLy8gbWF4TWVtVHlwZTQyXG4gICAgICBcIlxceDAwXFx4MDBcXHgwMFxceDAwXCIgKyAvLyBtaW5NZW1UeXBlMVxuICAgICAgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiXG4gICAgKTsgLy8gbWF4TWVtVHlwZTFcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykge1xuICAgIGlmICghcHJvdG8pIHtcbiAgICAgIHByb3RvID0gW1tdLCBbXV07IC8vIG5vIHN0cmluZ3MgYW5kIHVuaWNvZGUgc3RyaW5nc1xuICAgIH1cblxuICAgIHZhciBzdHJpbmdzID0gW1xuICAgICAgcHJvdG9bMF1bMF0gfHwgXCJPcmlnaW5hbCBsaWNlbmNlXCIsIC8vIDAuQ29weXJpZ2h0XG4gICAgICBwcm90b1swXVsxXSB8fCBuYW1lLCAvLyAxLkZvbnQgZmFtaWx5XG4gICAgICBwcm90b1swXVsyXSB8fCBcIlVua25vd25cIiwgLy8gMi5Gb250IHN1YmZhbWlseSAoZm9udCB3ZWlnaHQpXG4gICAgICBwcm90b1swXVszXSB8fCBcInVuaXF1ZUlEXCIsIC8vIDMuVW5pcXVlIElEXG4gICAgICBwcm90b1swXVs0XSB8fCBuYW1lLCAvLyA0LkZ1bGwgZm9udCBuYW1lXG4gICAgICBwcm90b1swXVs1XSB8fCBcIlZlcnNpb24gMC4xMVwiLCAvLyA1LlZlcnNpb25cbiAgICAgIHByb3RvWzBdWzZdIHx8IFwiXCIsIC8vIDYuUG9zdHNjcmlwdCBuYW1lXG4gICAgICBwcm90b1swXVs3XSB8fCBcIlVua25vd25cIiwgLy8gNy5UcmFkZW1hcmtcbiAgICAgIHByb3RvWzBdWzhdIHx8IFwiVW5rbm93blwiLCAvLyA4Lk1hbnVmYWN0dXJlclxuICAgICAgcHJvdG9bMF1bOV0gfHwgXCJVbmtub3duXCIsIC8vIDkuRGVzaWduZXJcbiAgICBdO1xuXG4gICAgLy8gTWFjIHdhbnQgMS1ieXRlIHBlciBjaGFyYWN0ZXIgc3RyaW5ncyB3aGlsZSBXaW5kb3dzIHdhbnRcbiAgICAvLyAyLWJ5dGVzIHBlciBjaGFyYWN0ZXIsIHNvIGR1cGxpY2F0ZSB0aGUgbmFtZXMgdGFibGVcbiAgICB2YXIgc3RyaW5nc1VuaWNvZGUgPSBbXTtcbiAgICB2YXIgaSwgaWksIGosIGpqLCBzdHI7XG4gICAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07XG5cbiAgICAgIHZhciBzdHJCdWZVbmljb2RlID0gW107XG4gICAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpO1xuICAgICAgfVxuICAgICAgc3RyaW5nc1VuaWNvZGUucHVzaChzdHJCdWZVbmljb2RlLmpvaW4oXCJcIikpO1xuICAgIH1cblxuICAgIHZhciBuYW1lcyA9IFtzdHJpbmdzLCBzdHJpbmdzVW5pY29kZV07XG4gICAgdmFyIHBsYXRmb3JtcyA9IFtcIlxceDAwXFx4MDFcIiwgXCJcXHgwMFxceDAzXCJdO1xuICAgIHZhciBlbmNvZGluZ3MgPSBbXCJcXHgwMFxceDAwXCIsIFwiXFx4MDBcXHgwMVwiXTtcbiAgICB2YXIgbGFuZ3VhZ2VzID0gW1wiXFx4MDBcXHgwMFwiLCBcIlxceDA0XFx4MDlcIl07XG5cbiAgICB2YXIgbmFtZXNSZWNvcmRDb3VudCA9IHN0cmluZ3MubGVuZ3RoICogcGxhdGZvcm1zLmxlbmd0aDtcbiAgICB2YXIgbmFtZVRhYmxlID1cbiAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gZm9ybWF0XG4gICAgICBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIC8vIE51bWJlciBvZiBuYW1lcyBSZWNvcmRcbiAgICAgIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOyAvLyBTdG9yYWdlXG5cbiAgICAvLyBCdWlsZCB0aGUgbmFtZSByZWNvcmRzIGZpZWxkXG4gICAgdmFyIHN0ck9mZnNldCA9IDA7XG4gICAgZm9yIChpID0gMCwgaWkgPSBwbGF0Zm9ybXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHN0cnMgPSBuYW1lc1tpXTtcbiAgICAgIGZvciAoaiA9IDAsIGpqID0gc3Rycy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHN0ciA9IHN0cnNbal07XG4gICAgICAgIHZhciBuYW1lUmVjb3JkID1cbiAgICAgICAgICBwbGF0Zm9ybXNbaV0gKyAvLyBwbGF0Zm9ybSBJRFxuICAgICAgICAgIGVuY29kaW5nc1tpXSArIC8vIGVuY29kaW5nIElEXG4gICAgICAgICAgbGFuZ3VhZ2VzW2ldICsgLy8gbGFuZ3VhZ2UgSURcbiAgICAgICAgICBzdHJpbmcxNihqKSArIC8vIG5hbWUgSURcbiAgICAgICAgICBzdHJpbmcxNihzdHIubGVuZ3RoKSArXG4gICAgICAgICAgc3RyaW5nMTYoc3RyT2Zmc2V0KTtcbiAgICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7XG4gICAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5hbWVUYWJsZSArPSBzdHJpbmdzLmpvaW4oXCJcIikgKyBzdHJpbmdzVW5pY29kZS5qb2luKFwiXCIpO1xuICAgIHJldHVybiBuYW1lVGFibGU7XG4gIH1cblxuICBGb250LnByb3RvdHlwZSA9IHtcbiAgICBuYW1lOiBudWxsLFxuICAgIGZvbnQ6IG51bGwsXG4gICAgbWltZXR5cGU6IG51bGwsXG4gICAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSxcblxuICAgIGdldCByZW5kZXJlcigpIHtcbiAgICAgIHZhciByZW5kZXJlciA9IEZvbnRSZW5kZXJlckZhY3RvcnkuY3JlYXRlKHRoaXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicmVuZGVyZXJcIiwgcmVuZGVyZXIpO1xuICAgIH0sXG5cbiAgICBleHBvcnREYXRhKGV4dHJhUHJvcGVydGllcyA9IGZhbHNlKSB7XG4gICAgICBjb25zdCBleHBvcnREYXRhUHJvcGVydGllcyA9IGV4dHJhUHJvcGVydGllc1xuICAgICAgICA/IFsuLi5FWFBPUlRfREFUQV9QUk9QRVJUSUVTLCAuLi5FWFBPUlRfREFUQV9FWFRSQV9QUk9QRVJUSUVTXVxuICAgICAgICA6IEVYUE9SVF9EQVRBX1BST1BFUlRJRVM7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgbGV0IHByb3BlcnR5LCB2YWx1ZTtcbiAgICAgIGZvciAocHJvcGVydHkgb2YgZXhwb3J0RGF0YVByb3BlcnRpZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzW3Byb3BlcnR5XTtcbiAgICAgICAgLy8gSWdub3JlIHByb3BlcnRpZXMgdGhhdCBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBzZXQuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIGZhbGxiYWNrVG9TeXN0ZW1Gb250OiBmdW5jdGlvbiBGb250X2ZhbGxiYWNrVG9TeXN0ZW1Gb250KCkge1xuICAgICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7XG4gICAgICAvLyBUaGUgZmlsZSBkYXRhIGlzIG5vdCBzcGVjaWZpZWQuIFRyeWluZyB0byBmaXggdGhlIGZvbnQgbmFtZVxuICAgICAgLy8gdG8gYmUgdXNlZCB3aXRoIHRoZSBjYW52YXMuZm9udC5cbiAgICAgIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICB2YXIgc3VidHlwZSA9IHRoaXMuc3VidHlwZTtcbiAgICAgIGxldCBmb250TmFtZSA9IG5hbWUucmVwbGFjZSgvWyxfXS9nLCBcIi1cIikucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xuICAgICAgdmFyIHN0ZEZvbnRNYXAgPSBnZXRTdGRGb250TWFwKCksXG4gICAgICAgIG5vblN0ZEZvbnRNYXAgPSBnZXROb25TdGRGb250TWFwKCk7XG4gICAgICB2YXIgaXNTdGFuZGFyZEZvbnQgPVxuICAgICAgICAhIXN0ZEZvbnRNYXBbZm9udE5hbWVdIHx8XG4gICAgICAgICEhKG5vblN0ZEZvbnRNYXBbZm9udE5hbWVdICYmIHN0ZEZvbnRNYXBbbm9uU3RkRm9udE1hcFtmb250TmFtZV1dKTtcbiAgICAgIGZvbnROYW1lID0gc3RkRm9udE1hcFtmb250TmFtZV0gfHwgbm9uU3RkRm9udE1hcFtmb250TmFtZV0gfHwgZm9udE5hbWU7XG5cbiAgICAgIHRoaXMuYm9sZCA9IGZvbnROYW1lLnNlYXJjaCgvYm9sZC9naSkgIT09IC0xO1xuICAgICAgdGhpcy5pdGFsaWMgPVxuICAgICAgICBmb250TmFtZS5zZWFyY2goL29ibGlxdWUvZ2kpICE9PSAtMSB8fFxuICAgICAgICBmb250TmFtZS5zZWFyY2goL2l0YWxpYy9naSkgIT09IC0xO1xuXG4gICAgICAvLyBVc2UgJ25hbWUnIGluc3RlYWQgb2YgJ2ZvbnROYW1lJyBoZXJlIGJlY2F1c2UgdGhlIG9yaWdpbmFsXG4gICAgICAvLyBuYW1lIEFyaWFsQmxhY2sgZm9yIGV4YW1wbGUgd2lsbCBiZSByZXBsYWNlZCBieSBIZWx2ZXRpY2EuXG4gICAgICB0aGlzLmJsYWNrID0gbmFtZS5zZWFyY2goL0JsYWNrL2cpICE9PSAtMTtcblxuICAgICAgLy8gaWYgYXQgbGVhc3Qgb25lIHdpZHRoIGlzIHByZXNlbnQsIHJlbWVhc3VyZSBhbGwgY2hhcnMgd2hlbiBleGlzdHNcbiAgICAgIHRoaXMucmVtZWFzdXJlID0gT2JqZWN0LmtleXModGhpcy53aWR0aHMpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoXG4gICAgICAgIGlzU3RhbmRhcmRGb250ICYmXG4gICAgICAgIHR5cGUgPT09IFwiQ0lERm9udFR5cGUyXCIgJiZcbiAgICAgICAgdGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKFwiSWRlbnRpdHktXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgR2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzID0gZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzKCk7XG4gICAgICAgIC8vIFN0YW5kYXJkIGZvbnRzIG1pZ2h0IGJlIGVtYmVkZGVkIGFzIENJRCBmb250IHdpdGhvdXQgZ2x5cGggbWFwcGluZy5cbiAgICAgICAgLy8gQnVpbGRpbmcgb25lIGJhc2VkIG9uIEdseXBoTWFwRm9yU3RhbmRhcmRGb250cy5cbiAgICAgICAgY29uc3QgbWFwID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gR2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzKSB7XG4gICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHNbY2hhckNvZGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvQXJpYWwtP0JsYWNrL2kudGVzdChuYW1lKSkge1xuICAgICAgICAgIHZhciBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2soKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaykge1xuICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2tbY2hhckNvZGVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgvQ2FsaWJyaS9pLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSkge1xuICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmlbY2hhckNvZGVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpc0lkZW50aXR5VW5pY29kZSA9IHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXA7XG4gICAgICAgIGlmICghaXNJZGVudGl0eVVuaWNvZGUpIHtcbiAgICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSB7XG4gICAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBtYXA7XG4gICAgICAgIHRoaXMudG9Vbmljb2RlID0gbmV3IFRvVW5pY29kZU1hcChtYXApO1xuICAgICAgfSBlbHNlIGlmICgvU3ltYm9sL2kudGVzdChmb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKFxuICAgICAgICAgIFN5bWJvbFNldEVuY29kaW5nLFxuICAgICAgICAgIGdldEdseXBoc1VuaWNvZGUoKSxcbiAgICAgICAgICB0aGlzLmRpZmZlcmVuY2VzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKC9EaW5nYmF0cy9pLnRlc3QoZm9udE5hbWUpKSB7XG4gICAgICAgIGlmICgvV2luZ2RpbmdzL2kudGVzdChuYW1lKSkge1xuICAgICAgICAgIHdhcm4oXCJOb24tZW1iZWRkZWQgV2luZ2RpbmdzIGZvbnQsIGZhbGxpbmcgYmFjayB0byBaYXBmRGluZ2JhdHMuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihcbiAgICAgICAgICBaYXBmRGluZ2JhdHNFbmNvZGluZyxcbiAgICAgICAgICBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUoKSxcbiAgICAgICAgICB0aGlzLmRpZmZlcmVuY2VzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RhbmRhcmRGb250KSB7XG4gICAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihcbiAgICAgICAgICB0aGlzLmRlZmF1bHRFbmNvZGluZyxcbiAgICAgICAgICBnZXRHbHlwaHNVbmljb2RlKCksXG4gICAgICAgICAgdGhpcy5kaWZmZXJlbmNlc1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTtcbiAgICAgICAgY29uc3QgbWFwID0gW107XG4gICAgICAgIHRoaXMudG9Vbmljb2RlLmZvckVhY2goKGNoYXJDb2RlLCB1bmljb2RlQ2hhckNvZGUpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29tcG9zaXRlKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGhOYW1lID1cbiAgICAgICAgICAgICAgdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhckNvZGVdO1xuICAgICAgICAgICAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApO1xuICAgICAgICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7XG4gICAgICAgICAgICAgIHVuaWNvZGVDaGFyQ29kZSA9IHVuaWNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGltcHJvdmUgdGhlIGdseXBoIG1hcHBpbmcgZm9yIChzb21lKSBjb21wb3NpdGUgZm9udHMgdGhhdFxuICAgICAgICAvLyBhcHBlYXIgdG8gbGFjayBtZWFuaW5nZnVsIFRvVW5pY29kZSBkYXRhLlxuICAgICAgICBpZiAodGhpcy5jb21wb3NpdGUgJiYgdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkge1xuICAgICAgICAgIGlmICgvVmVyZGFuYS9pLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEZpeGVzIGlzc3VlMTEyNDJfcmVkdWNlZC5wZGZcbiAgICAgICAgICAgIGNvbnN0IEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cygpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMpIHtcbiAgICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHNbY2hhckNvZGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBtYXA7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRlZE5hbWUgPSBmb250TmFtZS5zcGxpdChcIi1cIilbMF07XG4gICAgICB0aGlzLmZvbnRUeXBlID0gZ2V0Rm9udFR5cGUodHlwZSwgc3VidHlwZSk7XG4gICAgfSxcblxuICAgIGNoZWNrQW5kUmVwYWlyOiBmdW5jdGlvbiBGb250X2NoZWNrQW5kUmVwYWlyKG5hbWUsIGZvbnQsIHByb3BlcnRpZXMpIHtcbiAgICAgIGNvbnN0IFZBTElEX1RBQkxFUyA9IFtcbiAgICAgICAgXCJPUy8yXCIsXG4gICAgICAgIFwiY21hcFwiLFxuICAgICAgICBcImhlYWRcIixcbiAgICAgICAgXCJoaGVhXCIsXG4gICAgICAgIFwiaG10eFwiLFxuICAgICAgICBcIm1heHBcIixcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgIFwicG9zdFwiLFxuICAgICAgICBcImxvY2FcIixcbiAgICAgICAgXCJnbHlmXCIsXG4gICAgICAgIFwiZnBnbVwiLFxuICAgICAgICBcInByZXBcIixcbiAgICAgICAgXCJjdnQgXCIsXG4gICAgICAgIFwiQ0ZGIFwiLFxuICAgICAgXTtcblxuICAgICAgZnVuY3Rpb24gcmVhZFRhYmxlcyhmaWxlLCBudW1UYWJsZXMpIHtcbiAgICAgICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGFibGVzW1wiT1MvMlwiXSA9IG51bGw7XG4gICAgICAgIHRhYmxlcy5jbWFwID0gbnVsbDtcbiAgICAgICAgdGFibGVzLmhlYWQgPSBudWxsO1xuICAgICAgICB0YWJsZXMuaGhlYSA9IG51bGw7XG4gICAgICAgIHRhYmxlcy5obXR4ID0gbnVsbDtcbiAgICAgICAgdGFibGVzLm1heHAgPSBudWxsO1xuICAgICAgICB0YWJsZXMubmFtZSA9IG51bGw7XG4gICAgICAgIHRhYmxlcy5wb3N0ID0gbnVsbDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdGFibGUgPSByZWFkVGFibGVFbnRyeShmaWxlKTtcbiAgICAgICAgICBpZiAoIVZBTElEX1RBQkxFUy5pbmNsdWRlcyh0YWJsZS50YWcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcHBpbmcgdGFibGUgaWYgaXQncyBub3QgYSByZXF1aXJlZCBvciBvcHRpb25hbCB0YWJsZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGFibGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcHBpbmcgZW1wdHkgdGFibGVzXG4gICAgICAgICAgfVxuICAgICAgICAgIHRhYmxlc1t0YWJsZS50YWddID0gdGFibGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhYmxlcztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVhZFRhYmxlRW50cnkoZmlsZSkge1xuICAgICAgICB2YXIgdGFnID0gYnl0ZXNUb1N0cmluZyhmaWxlLmdldEJ5dGVzKDQpKTtcblxuICAgICAgICB2YXIgY2hlY2tzdW0gPSBmaWxlLmdldEludDMyKCkgPj4+IDA7XG4gICAgICAgIHZhciBvZmZzZXQgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7XG4gICAgICAgIHZhciBsZW5ndGggPSBmaWxlLmdldEludDMyKCkgPj4+IDA7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgdGFibGUgYXNzb2NpYXRlZCBkYXRhXG4gICAgICAgIHZhciBwcmV2aW91c1Bvc2l0aW9uID0gZmlsZS5wb3M7XG4gICAgICAgIGZpbGUucG9zID0gZmlsZS5zdGFydCA/IGZpbGUuc3RhcnQgOiAwO1xuICAgICAgICBmaWxlLnNraXAob2Zmc2V0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBmaWxlLmdldEJ5dGVzKGxlbmd0aCk7XG4gICAgICAgIGZpbGUucG9zID0gcHJldmlvdXNQb3NpdGlvbjtcblxuICAgICAgICBpZiAodGFnID09PSBcImhlYWRcIikge1xuICAgICAgICAgIC8vIGNsZWFyaW5nIGNoZWNrc3VtIGFkanVzdG1lbnRcbiAgICAgICAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPSAwO1xuICAgICAgICAgIGRhdGFbMTddIHw9IDB4MjA7IC8vIFNldCBmb250IG9wdGltaXplZCBmb3IgY2xlYXJ0eXBlIGZsYWcuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRhZyxcbiAgICAgICAgICBjaGVja3N1bSxcbiAgICAgICAgICBsZW5ndGgsXG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0dGYpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJzaW9uOiBieXRlc1RvU3RyaW5nKHR0Zi5nZXRCeXRlcyg0KSksXG4gICAgICAgICAgbnVtVGFibGVzOiB0dGYuZ2V0VWludDE2KCksXG4gICAgICAgICAgc2VhcmNoUmFuZ2U6IHR0Zi5nZXRVaW50MTYoKSxcbiAgICAgICAgICBlbnRyeVNlbGVjdG9yOiB0dGYuZ2V0VWludDE2KCksXG4gICAgICAgICAgcmFuZ2VTaGlmdDogdHRmLmdldFVpbnQxNigpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yykge1xuICAgICAgICBjb25zdCB0dGNUYWcgPSBieXRlc1RvU3RyaW5nKHR0Yy5nZXRCeXRlcyg0KSk7XG4gICAgICAgIGFzc2VydCh0dGNUYWcgPT09IFwidHRjZlwiLCBcIk11c3QgYmUgYSBUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQuXCIpO1xuXG4gICAgICAgIGNvbnN0IG1ham9yVmVyc2lvbiA9IHR0Yy5nZXRVaW50MTYoKTtcbiAgICAgICAgY29uc3QgbWlub3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpO1xuICAgICAgICBjb25zdCBudW1Gb250cyA9IHR0Yy5nZXRJbnQzMigpID4+PiAwO1xuICAgICAgICBjb25zdCBvZmZzZXRUYWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZvbnRzOyBpKyspIHtcbiAgICAgICAgICBvZmZzZXRUYWJsZS5wdXNoKHR0Yy5nZXRJbnQzMigpID4+PiAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHtcbiAgICAgICAgICB0dGNUYWcsXG4gICAgICAgICAgbWFqb3JWZXJzaW9uLFxuICAgICAgICAgIG1pbm9yVmVyc2lvbixcbiAgICAgICAgICBudW1Gb250cyxcbiAgICAgICAgICBvZmZzZXRUYWJsZSxcbiAgICAgICAgfTtcbiAgICAgICAgc3dpdGNoIChtYWpvclZlcnNpb24pIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGhlYWRlci5kc2lnVGFnID0gdHRjLmdldEludDMyKCkgPj4+IDA7XG4gICAgICAgICAgICBoZWFkZXIuZHNpZ0xlbmd0aCA9IHR0Yy5nZXRJbnQzMigpID4+PiAwO1xuICAgICAgICAgICAgaGVhZGVyLmRzaWdPZmZzZXQgPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDtcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIFRydWVUeXBlIENvbGxlY3Rpb24gbWFqb3JWZXJzaW9uOiAke21ham9yVmVyc2lvbn0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uRGF0YSh0dGMsIGZvbnROYW1lKSB7XG4gICAgICAgIGNvbnN0IHsgbnVtRm9udHMsIG9mZnNldFRhYmxlIH0gPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Gb250czsgaSsrKSB7XG4gICAgICAgICAgdHRjLnBvcyA9ICh0dGMuc3RhcnQgfHwgMCkgKyBvZmZzZXRUYWJsZVtpXTtcbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWxIZWFkZXIgPSByZWFkT3BlblR5cGVIZWFkZXIodHRjKTtcbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWxUYWJsZXMgPSByZWFkVGFibGVzKHR0YywgcG90ZW50aWFsSGVhZGVyLm51bVRhYmxlcyk7XG5cbiAgICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlcy5uYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICAgICdUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQgbXVzdCBjb250YWluIGEgXCJuYW1lXCIgdGFibGUuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmFtZVRhYmxlID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7XG5cbiAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamogPSBuYW1lVGFibGUubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDAsIGtrID0gbmFtZVRhYmxlW2pdLmxlbmd0aDsgayA8IGtrOyBrKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZUVudHJ5ID0gbmFtZVRhYmxlW2pdW2tdO1xuICAgICAgICAgICAgICBpZiAobmFtZUVudHJ5ICYmIG5hbWVFbnRyeS5yZXBsYWNlKC9cXHMvZywgXCJcIikgPT09IGZvbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGhlYWRlcjogcG90ZW50aWFsSGVhZGVyLFxuICAgICAgICAgICAgICAgICAgdGFibGVzOiBwb3RlbnRpYWxUYWJsZXMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgYFRydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiBcIiR7Zm9udE5hbWV9XCIgZm9udC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVhZCB0aGUgYXBwcm9wcmlhdGUgc3VidGFibGUgZnJvbSB0aGUgY21hcCBhY2NvcmRpbmcgdG8gOS42LjYuNCBmcm9tXG4gICAgICAgKiBQREYgc3BlY1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiByZWFkQ21hcFRhYmxlKGNtYXAsIGZpbGUsIGlzU3ltYm9saWNGb250LCBoYXNFbmNvZGluZykge1xuICAgICAgICBpZiAoIWNtYXApIHtcbiAgICAgICAgICB3YXJuKFwiTm8gY21hcCB0YWJsZSBhdmFpbGFibGUuXCIpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSxcbiAgICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLFxuICAgICAgICAgICAgbWFwcGluZ3M6IFtdLFxuICAgICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBzZWdtZW50O1xuICAgICAgICB2YXIgc3RhcnQgPSAoZmlsZS5zdGFydCA/IGZpbGUuc3RhcnQgOiAwKSArIGNtYXAub2Zmc2V0O1xuICAgICAgICBmaWxlLnBvcyA9IHN0YXJ0O1xuXG4gICAgICAgIGZpbGUuc2tpcCgyKTsgLy8gdmVyc2lvblxuICAgICAgICB2YXIgbnVtVGFibGVzID0gZmlsZS5nZXRVaW50MTYoKTtcblxuICAgICAgICB2YXIgcG90ZW50aWFsVGFibGU7XG4gICAgICAgIHZhciBjYW5CcmVhayA9IGZhbHNlO1xuICAgICAgICAvLyBUaGVyZSdzIGFuIG9yZGVyIG9mIHByZWZlcmVuY2UgaW4gdGVybXMgb2Ygd2hpY2ggY21hcCBzdWJ0YWJsZSB0b1xuICAgICAgICAvLyB1c2U6XG4gICAgICAgIC8vIC0gbm9uLXN5bWJvbGljIGZvbnRzIHRoZSBwcmVmZXJlbmNlIGlzIGEgMywxIHRhYmxlIHRoZW4gYSAxLDAgdGFibGVcbiAgICAgICAgLy8gLSBzeW1ib2xpYyBmb250cyB0aGUgcHJlZmVyZW5jZSBpcyBhIDMsMCB0YWJsZSB0aGVuIGEgMSwwIHRhYmxlXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIHRhYmxlcyBhcmUgc29ydGVkXG4gICAgICAgIC8vIHRvIHdvcmsuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHtcbiAgICAgICAgICB2YXIgcGxhdGZvcm1JZCA9IGZpbGUuZ2V0VWludDE2KCk7XG4gICAgICAgICAgdmFyIGVuY29kaW5nSWQgPSBmaWxlLmdldFVpbnQxNigpO1xuICAgICAgICAgIHZhciBvZmZzZXQgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7XG4gICAgICAgICAgdmFyIHVzZVRhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBTb21ldGltZXMgdGhlcmUgYXJlIG11bHRpcGxlIG9mIHRoZSBzYW1lIHR5cGUgb2YgdGFibGUuIERlZmF1bHRcbiAgICAgICAgICAvLyB0byBjaG9vc2luZyB0aGUgZmlyc3QgdGFibGUgYW5kIHNraXAgdGhlIHJlc3QuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcG90ZW50aWFsVGFibGUgJiZcbiAgICAgICAgICAgIHBvdGVudGlhbFRhYmxlLnBsYXRmb3JtSWQgPT09IHBsYXRmb3JtSWQgJiZcbiAgICAgICAgICAgIHBvdGVudGlhbFRhYmxlLmVuY29kaW5nSWQgPT09IGVuY29kaW5nSWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBsYXRmb3JtSWQgPT09IDAgJiZcbiAgICAgICAgICAgIChlbmNvZGluZ0lkID09PSAvKiBVbmljb2RlIERlZmF1bHQgKi8gMCB8fFxuICAgICAgICAgICAgICBlbmNvZGluZ0lkID09PSAvKiBVbmljb2RlIDEuMSAqLyAxIHx8XG4gICAgICAgICAgICAgIGVuY29kaW5nSWQgPT09IC8qIFVuaWNvZGUgQk1QICovIDMpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBDb250aW51ZSB0aGUgbG9vcCBzaW5jZSB0aGVyZSBzdGlsbCBtYXkgYmUgYSBoaWdoZXIgcHJpb3JpdHlcbiAgICAgICAgICAgIC8vIHRhYmxlLlxuICAgICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1JZCA9PT0gMSAmJiBlbmNvZGluZ0lkID09PSAwKSB7XG4gICAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBDb250aW51ZSB0aGUgbG9vcCBzaW5jZSB0aGVyZSBzdGlsbCBtYXkgYmUgYSBoaWdoZXIgcHJpb3JpdHlcbiAgICAgICAgICAgIC8vIHRhYmxlLlxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBwbGF0Zm9ybUlkID09PSAzICYmXG4gICAgICAgICAgICBlbmNvZGluZ0lkID09PSAxICYmXG4gICAgICAgICAgICAoaGFzRW5jb2RpbmcgfHwgIXBvdGVudGlhbFRhYmxlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdXNlVGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFpc1N5bWJvbGljRm9udCkge1xuICAgICAgICAgICAgICBjYW5CcmVhayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCAmJiBwbGF0Zm9ybUlkID09PSAzICYmIGVuY29kaW5nSWQgPT09IDApIHtcbiAgICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbkJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXNlVGFibGUpIHtcbiAgICAgICAgICAgIHBvdGVudGlhbFRhYmxlID0ge1xuICAgICAgICAgICAgICBwbGF0Zm9ybUlkLFxuICAgICAgICAgICAgICBlbmNvZGluZ0lkLFxuICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2FuQnJlYWspIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3RlbnRpYWxUYWJsZSkge1xuICAgICAgICAgIGZpbGUucG9zID0gc3RhcnQgKyBwb3RlbnRpYWxUYWJsZS5vZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwb3RlbnRpYWxUYWJsZSB8fCBmaWxlLnBlZWtCeXRlKCkgPT09IC0xKSB7XG4gICAgICAgICAgd2FybihcIkNvdWxkIG5vdCBmaW5kIGEgcHJlZmVycmVkIGNtYXAgdGFibGUuXCIpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSxcbiAgICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLFxuICAgICAgICAgICAgbWFwcGluZ3M6IFtdLFxuICAgICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZvcm1hdCA9IGZpbGUuZ2V0VWludDE2KCk7XG4gICAgICAgIGZpbGUuc2tpcCgyICsgMik7IC8vIGxlbmd0aCArIGxhbmd1YWdlXG5cbiAgICAgICAgdmFyIGhhc1Nob3J0Q21hcCA9IGZhbHNlO1xuICAgICAgICB2YXIgbWFwcGluZ3MgPSBbXTtcbiAgICAgICAgdmFyIGosIGdseXBoSWQ7XG5cbiAgICAgICAgLy8gVE9ETyhtYWNrKTogcmVmYWN0b3IgdGhpcyBjbWFwIHN1YnRhYmxlIHJlYWRpbmcgbG9naWMgb3V0XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDApIHtcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGZpbGUuZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgaWYgKCFpbmRleCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgICBjaGFyQ29kZTogaixcbiAgICAgICAgICAgICAgZ2x5cGhJZDogaW5kZXgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFzU2hvcnRDbWFwID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDQpIHtcbiAgICAgICAgICAvLyByZS1jcmVhdGluZyB0aGUgdGFibGUgaW4gZm9ybWF0IDQgc2luY2UgdGhlIGVuY29kaW5nXG4gICAgICAgICAgLy8gbWlnaHQgYmUgY2hhbmdlZFxuICAgICAgICAgIHZhciBzZWdDb3VudCA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMTtcbiAgICAgICAgICBmaWxlLnNraXAoNik7IC8vIHNraXBwaW5nIHJhbmdlIGZpZWxkc1xuICAgICAgICAgIHZhciBzZWdJbmRleCxcbiAgICAgICAgICAgIHNlZ21lbnRzID0gW107XG4gICAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHtcbiAgICAgICAgICAgIHNlZ21lbnRzLnB1c2goeyBlbmQ6IGZpbGUuZ2V0VWludDE2KCkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpbGUuc2tpcCgyKTtcbiAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykge1xuICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLnN0YXJ0ID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykge1xuICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLmRlbHRhID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgb2Zmc2V0c0NvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykge1xuICAgICAgICAgICAgc2VnbWVudCA9IHNlZ21lbnRzW3NlZ0luZGV4XTtcbiAgICAgICAgICAgIHZhciByYW5nZU9mZnNldCA9IGZpbGUuZ2V0VWludDE2KCk7XG4gICAgICAgICAgICBpZiAoIXJhbmdlT2Zmc2V0KSB7XG4gICAgICAgICAgICAgIHNlZ21lbnQub2Zmc2V0SW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvZmZzZXRJbmRleCA9IChyYW5nZU9mZnNldCA+PiAxKSAtIChzZWdDb3VudCAtIHNlZ0luZGV4KTtcbiAgICAgICAgICAgIHNlZ21lbnQub2Zmc2V0SW5kZXggPSBvZmZzZXRJbmRleDtcbiAgICAgICAgICAgIG9mZnNldHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICBvZmZzZXRzQ291bnQsXG4gICAgICAgICAgICAgIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgb2Zmc2V0cyA9IFtdO1xuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvZmZzZXRzQ291bnQ7IGorKykge1xuICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKGZpbGUuZ2V0VWludDE2KCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7XG4gICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdO1xuICAgICAgICAgICAgc3RhcnQgPSBzZWdtZW50LnN0YXJ0O1xuICAgICAgICAgICAgdmFyIGVuZCA9IHNlZ21lbnQuZW5kO1xuICAgICAgICAgICAgdmFyIGRlbHRhID0gc2VnbWVudC5kZWx0YTtcbiAgICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDtcblxuICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKGogPT09IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ2x5cGhJZCA9IG9mZnNldEluZGV4IDwgMCA/IGogOiBvZmZzZXRzW29mZnNldEluZGV4ICsgaiAtIHN0YXJ0XTtcbiAgICAgICAgICAgICAgZ2x5cGhJZCA9IChnbHlwaElkICsgZGVsdGEpICYgMHhmZmZmO1xuICAgICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjaGFyQ29kZTogaixcbiAgICAgICAgICAgICAgICBnbHlwaElkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA2KSB7XG4gICAgICAgICAgLy8gRm9ybWF0IDYgaXMgYSAyLWJ5dGVzIGRlbnNlIG1hcHBpbmcsIHdoaWNoIG1lYW5zIHRoZSBmb250IGRhdGFcbiAgICAgICAgICAvLyBsaXZlcyBnbHVlIHRvZ2V0aGVyIGV2ZW4gaWYgdGhleSBhcmUgcHJldHR5IGZhciBpbiB0aGUgdW5pY29kZVxuICAgICAgICAgIC8vIHRhYmxlLiAoVGhpcyBsb29rcyB3ZWlyZCwgc28gSSBjYW4gaGF2ZSBtaXNzZWQgc29tZXRoaW5nKSwgdGhpc1xuICAgICAgICAgIC8vIHdvcmtzIG9uIExpbnV4IGJ1dCBzZWVtcyB0byBmYWlscyBvbiBNYWMgc28gbGV0J3MgcmV3cml0ZSB0aGVcbiAgICAgICAgICAvLyBjbWFwIHRhYmxlIHRvIGEgMy0xLTQgc3R5bGVcbiAgICAgICAgICB2YXIgZmlyc3RDb2RlID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAgICAgICB2YXIgZW50cnlDb3VudCA9IGZpbGUuZ2V0VWludDE2KCk7XG5cbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZW50cnlDb3VudDsgaisrKSB7XG4gICAgICAgICAgICBnbHlwaElkID0gZmlsZS5nZXRVaW50MTYoKTtcbiAgICAgICAgICAgIHZhciBjaGFyQ29kZSA9IGZpcnN0Q29kZSArIGo7XG5cbiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgICBjaGFyQ29kZSxcbiAgICAgICAgICAgICAgZ2x5cGhJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuKFwiY21hcCB0YWJsZSBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0OiBcIiArIGZvcm1hdCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLFxuICAgICAgICAgICAgZW5jb2RpbmdJZDogLTEsXG4gICAgICAgICAgICBtYXBwaW5nczogW10sXG4gICAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmluZyBkdXBsaWNhdGUgZW50cmllc1xuICAgICAgICBtYXBwaW5ncy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGEuY2hhckNvZGUgLSBiLmNoYXJDb2RlO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKG1hcHBpbmdzW2kgLSAxXS5jaGFyQ29kZSA9PT0gbWFwcGluZ3NbaV0uY2hhckNvZGUpIHtcbiAgICAgICAgICAgIG1hcHBpbmdzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBsYXRmb3JtSWQ6IHBvdGVudGlhbFRhYmxlLnBsYXRmb3JtSWQsXG4gICAgICAgICAgZW5jb2RpbmdJZDogcG90ZW50aWFsVGFibGUuZW5jb2RpbmdJZCxcbiAgICAgICAgICBtYXBwaW5ncyxcbiAgICAgICAgICBoYXNTaG9ydENtYXAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNhbml0aXplTWV0cmljcyhcbiAgICAgICAgZmlsZSxcbiAgICAgICAgaGVhZGVyLFxuICAgICAgICBtZXRyaWNzLFxuICAgICAgICBudW1HbHlwaHMsXG4gICAgICAgIGR1cEZpcnN0RW50cnlcbiAgICAgICkge1xuICAgICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICAgIGlmIChtZXRyaWNzKSB7XG4gICAgICAgICAgICBtZXRyaWNzLmRhdGEgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0ID8gZmlsZS5zdGFydCA6IDApICsgaGVhZGVyLm9mZnNldDtcbiAgICAgICAgZmlsZS5wb3MgKz0gNDsgLy8gdmVyc2lvblxuICAgICAgICBmaWxlLnBvcyArPSAyOyAvLyBhc2NlbnRcbiAgICAgICAgZmlsZS5wb3MgKz0gMjsgLy8gZGVzY2VudFxuICAgICAgICBmaWxlLnBvcyArPSAyOyAvLyBsaW5lZ2FwXG4gICAgICAgIGZpbGUucG9zICs9IDI7IC8vIGFkdl93aWR0aF9tYXhcbiAgICAgICAgZmlsZS5wb3MgKz0gMjsgLy8gbWluX3NiMVxuICAgICAgICBmaWxlLnBvcyArPSAyOyAvLyBtaW5fc2IyXG4gICAgICAgIGZpbGUucG9zICs9IDI7IC8vIG1heF9leHRlbnRcbiAgICAgICAgZmlsZS5wb3MgKz0gMjsgLy8gY2FyZXRfc2xvcGVfcmlzZVxuICAgICAgICBmaWxlLnBvcyArPSAyOyAvLyBjYXJldF9zbG9wZV9ydW5cbiAgICAgICAgZmlsZS5wb3MgKz0gMjsgLy8gY2FyZXRfb2Zmc2V0XG4gICAgICAgIGZpbGUucG9zICs9IDg7IC8vIHJlc2VydmVkXG4gICAgICAgIGZpbGUucG9zICs9IDI7IC8vIGZvcm1hdFxuICAgICAgICB2YXIgbnVtT2ZNZXRyaWNzID0gZmlsZS5nZXRVaW50MTYoKTtcblxuICAgICAgICBpZiAobnVtT2ZNZXRyaWNzID4gbnVtR2x5cGhzKSB7XG4gICAgICAgICAgaW5mbyhcbiAgICAgICAgICAgIFwiVGhlIG51bU9mTWV0cmljcyAoXCIgK1xuICAgICAgICAgICAgICBudW1PZk1ldHJpY3MgK1xuICAgICAgICAgICAgICBcIikgc2hvdWxkIG5vdCBiZSBcIiArXG4gICAgICAgICAgICAgIFwiZ3JlYXRlciB0aGFuIHRoZSBudW1HbHlwaHMgKFwiICtcbiAgICAgICAgICAgICAgbnVtR2x5cGhzICtcbiAgICAgICAgICAgICAgXCIpXCJcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFJlZHVjZSBudW1PZk1ldHJpY3MgaWYgaXQgaXMgZ3JlYXRlciB0aGFuIG51bUdseXBoc1xuICAgICAgICAgIG51bU9mTWV0cmljcyA9IG51bUdseXBocztcbiAgICAgICAgICBoZWFkZXIuZGF0YVszNF0gPSAobnVtT2ZNZXRyaWNzICYgMHhmZjAwKSA+PiA4O1xuICAgICAgICAgIGhlYWRlci5kYXRhWzM1XSA9IG51bU9mTWV0cmljcyAmIDB4MDBmZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBudW1PZlNpZGViZWFyaW5ncyA9IG51bUdseXBocyAtIG51bU9mTWV0cmljcztcbiAgICAgICAgdmFyIG51bU1pc3NpbmcgPVxuICAgICAgICAgIG51bU9mU2lkZWJlYXJpbmdzIC0gKChtZXRyaWNzLmxlbmd0aCAtIG51bU9mTWV0cmljcyAqIDQpID4+IDEpO1xuXG4gICAgICAgIGlmIChudW1NaXNzaW5nID4gMCkge1xuICAgICAgICAgIC8vIEZvciBlYWNoIG1pc3NpbmcgZ2x5cGgsIHdlIHNldCBib3RoIHRoZSB3aWR0aCBhbmQgbHNiIHRvIDAgKHplcm8pLlxuICAgICAgICAgIC8vIFNpbmNlIHdlIG5lZWQgdG8gYWRkIHR3byBwcm9wZXJ0aWVzIGZvciBlYWNoIGdseXBoLCB0aGlzIGV4cGxhaW5zXG4gICAgICAgICAgLy8gdGhlIHVzZSBvZiB8bnVtTWlzc2luZyAqIDJ8IHdoZW4gaW5pdGlhbGl6aW5nIHRoZSB0eXBlZCBhcnJheS5cbiAgICAgICAgICB2YXIgZW50cmllcyA9IG5ldyBVaW50OEFycmF5KG1ldHJpY3MubGVuZ3RoICsgbnVtTWlzc2luZyAqIDIpO1xuICAgICAgICAgIGVudHJpZXMuc2V0KG1ldHJpY3MuZGF0YSk7XG4gICAgICAgICAgaWYgKGR1cEZpcnN0RW50cnkpIHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgc2lkZWJlYXJpbmcgdmFsdWUgb2YgdGhlIGR1cGxpY2F0ZWQgZ2x5cGguXG4gICAgICAgICAgICBlbnRyaWVzW21ldHJpY3MubGVuZ3RoXSA9IG1ldHJpY3MuZGF0YVsyXTtcbiAgICAgICAgICAgIGVudHJpZXNbbWV0cmljcy5sZW5ndGggKyAxXSA9IG1ldHJpY3MuZGF0YVszXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWV0cmljcy5kYXRhID0gZW50cmllcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoKFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHNvdXJjZVN0YXJ0LFxuICAgICAgICBzb3VyY2VFbmQsXG4gICAgICAgIGRlc3QsXG4gICAgICAgIGRlc3RTdGFydCxcbiAgICAgICAgaGludHNWYWxpZFxuICAgICAgKSB7XG4gICAgICAgIHZhciBnbHlwaFByb2ZpbGUgPSB7XG4gICAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICAgIHNpemVPZkluc3RydWN0aW9uczogMCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0IDw9IDEyKSB7XG4gICAgICAgICAgLy8gZ2x5cGggd2l0aCBkYXRhIGxlc3MgdGhhbiAxMiBpcyBpbnZhbGlkIG9uZVxuICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdseWYgPSBzb3VyY2Uuc3ViYXJyYXkoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7XG4gICAgICAgIHZhciBjb250b3Vyc0NvdW50ID0gc2lnbmVkSW50MTYoZ2x5ZlswXSwgZ2x5ZlsxXSk7XG4gICAgICAgIGlmIChjb250b3Vyc0NvdW50IDwgMCkge1xuICAgICAgICAgIC8vIE9UUyBkb2Vzbid0IGxpa2UgY29udG91ciBjb3VudCB0byBiZSBsZXNzIHRoYW4gLTEuXG4gICAgICAgICAgY29udG91cnNDb3VudCA9IC0xO1xuICAgICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgMCwgY29udG91cnNDb3VudCk7XG4gICAgICAgICAgLy8gY29tcGxleCBnbHlwaCwgd3JpdGluZyBhcyBpc1xuICAgICAgICAgIGRlc3Quc2V0KGdseWYsIGRlc3RTdGFydCk7XG4gICAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoO1xuICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSxcbiAgICAgICAgICBqID0gMTAsXG4gICAgICAgICAgZmxhZ3NDb3VudCA9IDA7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250b3Vyc0NvdW50OyBpKyspIHtcbiAgICAgICAgICB2YXIgZW5kUG9pbnQgPSAoZ2x5ZltqXSA8PCA4KSB8IGdseWZbaiArIDFdO1xuICAgICAgICAgIGZsYWdzQ291bnQgPSBlbmRQb2ludCArIDE7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNraXBwaW5nIGluc3RydWN0aW9uc1xuICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zU3RhcnQgPSBqO1xuICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gKGdseWZbal0gPDwgOCkgfCBnbHlmW2ogKyAxXTtcbiAgICAgICAgZ2x5cGhQcm9maWxlLnNpemVPZkluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uc0xlbmd0aDtcbiAgICAgICAgaiArPSAyICsgaW5zdHJ1Y3Rpb25zTGVuZ3RoO1xuICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zRW5kID0gajtcbiAgICAgICAgLy8gdmFsaWRhdGluZyBmbGFnc1xuICAgICAgICB2YXIgY29vcmRpbmF0ZXNMZW5ndGggPSAwO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmxhZ3NDb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZsYWcgPSBnbHlmW2orK107XG4gICAgICAgICAgaWYgKGZsYWcgJiAweGMwKSB7XG4gICAgICAgICAgICAvLyByZXNlcnZlZCBmbGFncyBtdXN0IGJlIHplcm8sIGNsZWFuaW5nIHVwXG4gICAgICAgICAgICBnbHlmW2ogLSAxXSA9IGZsYWcgJiAweDNmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgeExlbmd0aCA9IDI7XG4gICAgICAgICAgaWYgKGZsYWcgJiAyKSB7XG4gICAgICAgICAgICB4TGVuZ3RoID0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZsYWcgJiAxNikge1xuICAgICAgICAgICAgeExlbmd0aCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB5TGVuZ3RoID0gMjtcbiAgICAgICAgICBpZiAoZmxhZyAmIDQpIHtcbiAgICAgICAgICAgIHlMZW5ndGggPSAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIDMyKSB7XG4gICAgICAgICAgICB5TGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeHlMZW5ndGggPSB4TGVuZ3RoICsgeUxlbmd0aDtcbiAgICAgICAgICBjb29yZGluYXRlc0xlbmd0aCArPSB4eUxlbmd0aDtcbiAgICAgICAgICBpZiAoZmxhZyAmIDgpIHtcbiAgICAgICAgICAgIHZhciByZXBlYXQgPSBnbHlmW2orK107XG4gICAgICAgICAgICBpICs9IHJlcGVhdDtcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHJlcGVhdCAqIHh5TGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBnbHlwaCB3aXRob3V0IGNvb3JkaW5hdGVzIHdpbGwgYmUgcmVqZWN0ZWRcbiAgICAgICAgaWYgKGNvb3JkaW5hdGVzTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2x5cGhEYXRhTGVuZ3RoID0gaiArIGNvb3JkaW5hdGVzTGVuZ3RoO1xuICAgICAgICBpZiAoZ2x5cGhEYXRhTGVuZ3RoID4gZ2x5Zi5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEgZm9yIGNvb3JkaW5hdGVzXG4gICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhpbnRzVmFsaWQgJiYgaW5zdHJ1Y3Rpb25zTGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoMCwgaW5zdHJ1Y3Rpb25zU3RhcnQpLCBkZXN0U3RhcnQpO1xuICAgICAgICAgIGRlc3Quc2V0KFswLCAwXSwgZGVzdFN0YXJ0ICsgaW5zdHJ1Y3Rpb25zU3RhcnQpO1xuICAgICAgICAgIGRlc3Quc2V0KFxuICAgICAgICAgICAgZ2x5Zi5zdWJhcnJheShpbnN0cnVjdGlvbnNFbmQsIGdseXBoRGF0YUxlbmd0aCksXG4gICAgICAgICAgICBkZXN0U3RhcnQgKyBpbnN0cnVjdGlvbnNTdGFydCArIDJcbiAgICAgICAgICApO1xuICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCAtPSBpbnN0cnVjdGlvbnNMZW5ndGg7XG4gICAgICAgICAgaWYgKGdseWYubGVuZ3RoIC0gZ2x5cGhEYXRhTGVuZ3RoID4gMykge1xuICAgICAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoID0gKGdseXBoRGF0YUxlbmd0aCArIDMpICYgfjM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7XG4gICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7XG4gICAgICAgICAgLy8gdHJ1bmNhdGluZyBhbmQgYWxpZ25pbmcgdG8gNCBieXRlcyB0aGUgbG9uZyBnbHlwaCBkYXRhXG4gICAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoID0gKGdseXBoRGF0YUxlbmd0aCArIDMpICYgfjM7XG4gICAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheSgwLCBnbHlwaERhdGFMZW5ndGgpLCBkZXN0U3RhcnQpO1xuICAgICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7XG4gICAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnbHlwaCBkYXRhIGlzIGZpbmVcbiAgICAgICAgZGVzdC5zZXQoZ2x5ZiwgZGVzdFN0YXJ0KTtcbiAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYW5pdGl6ZUhlYWQoaGVhZCwgbnVtR2x5cGhzLCBsb2NhTGVuZ3RoKSB7XG4gICAgICAgIHZhciBkYXRhID0gaGVhZC5kYXRhO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHZlcnNpb246XG4gICAgICAgIC8vIFNob3VsZCBhbHdheXMgYmUgMHgwMDAxMDAwMFxuICAgICAgICB2YXIgdmVyc2lvbiA9IGludDMyKGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pO1xuICAgICAgICBpZiAodmVyc2lvbiA+PiAxNiAhPT0gMSkge1xuICAgICAgICAgIGluZm8oXCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogXCIgKyB2ZXJzaW9uKTtcbiAgICAgICAgICBkYXRhWzBdID0gMDtcbiAgICAgICAgICBkYXRhWzFdID0gMTtcbiAgICAgICAgICBkYXRhWzJdID0gMDtcbiAgICAgICAgICBkYXRhWzNdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRleFRvTG9jRm9ybWF0ID0gaW50MTYoZGF0YVs1MF0sIGRhdGFbNTFdKTtcbiAgICAgICAgaWYgKGluZGV4VG9Mb2NGb3JtYXQgPCAwIHx8IGluZGV4VG9Mb2NGb3JtYXQgPiAxKSB7XG4gICAgICAgICAgaW5mbyhcbiAgICAgICAgICAgIFwiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCBpbmRleFRvTG9jRm9ybWF0IGluIGhlYWQgdGFibGU6IFwiICtcbiAgICAgICAgICAgICAgaW5kZXhUb0xvY0Zvcm1hdFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBUaGUgdmFsdWUgb2YgaW5kZXhUb0xvY0Zvcm1hdCBzaG91bGQgYmUgMCBpZiB0aGUgbG9jYSB0YWJsZVxuICAgICAgICAgIC8vIGNvbnNpc3RzIG9mIHNob3J0IG9mZnNldHMsIGFuZCBzaG91bGQgYmUgMSBpZiB0aGUgbG9jYSB0YWJsZVxuICAgICAgICAgIC8vIGNvbnNpc3RzIG9mIGxvbmcgb2Zmc2V0cy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbG9jYSB0YWJsZSBzaG91bGQgYmUgbnVtR2x5cGhzICsgMS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFVzaW5nIHRoaXMgaW5mb3JtYXRpb24sIHdlIGNhbiB3b3JrIGJhY2t3YXJkcyB0byBkZWR1Y2UgaWYgdGhlXG4gICAgICAgICAgLy8gc2l6ZSBvZiBlYWNoIG9mZnNldCBpbiB0aGUgbG9jYSB0YWJsZSwgYW5kIHRodXMgZmlndXJlIG91dCB0aGVcbiAgICAgICAgICAvLyBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgaW5kZXhUb0xvY0Zvcm1hdC5cblxuICAgICAgICAgIHZhciBudW1HbHlwaHNQbHVzT25lID0gbnVtR2x5cGhzICsgMTtcbiAgICAgICAgICBpZiAobG9jYUxlbmd0aCA9PT0gbnVtR2x5cGhzUGx1c09uZSA8PCAxKSB7XG4gICAgICAgICAgICAvLyAweDAwMDAgaW5kaWNhdGVzIHRoZSBsb2NhIHRhYmxlIGNvbnNpc3RzIG9mIHNob3J0IG9mZnNldHNcbiAgICAgICAgICAgIGRhdGFbNTBdID0gMDtcbiAgICAgICAgICAgIGRhdGFbNTFdID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FMZW5ndGggPT09IG51bUdseXBoc1BsdXNPbmUgPDwgMikge1xuICAgICAgICAgICAgLy8gMHgwMDAxIGluZGljYXRlcyB0aGUgbG9jYSB0YWJsZSBjb25zaXN0cyBvZiBsb25nIG9mZnNldHNcbiAgICAgICAgICAgIGRhdGFbNTBdID0gMDtcbiAgICAgICAgICAgIGRhdGFbNTFdID0gMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICAgICAgICBcIkNvdWxkIG5vdCBmaXggaW5kZXhUb0xvY0Zvcm1hdDogXCIgKyBpbmRleFRvTG9jRm9ybWF0XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoTG9jYXRpb25zKFxuICAgICAgICBsb2NhLFxuICAgICAgICBnbHlmLFxuICAgICAgICBudW1HbHlwaHMsXG4gICAgICAgIGlzR2x5cGhMb2NhdGlvbnNMb25nLFxuICAgICAgICBoaW50c1ZhbGlkLFxuICAgICAgICBkdXBGaXJzdEVudHJ5LFxuICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnNcbiAgICAgICkge1xuICAgICAgICB2YXIgaXRlbVNpemUsIGl0ZW1EZWNvZGUsIGl0ZW1FbmNvZGU7XG4gICAgICAgIGlmIChpc0dseXBoTG9jYXRpb25zTG9uZykge1xuICAgICAgICAgIGl0ZW1TaXplID0gNDtcbiAgICAgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGVMb25nKGRhdGEsIG9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICAgICAgICAgICAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICAgICAgICAgICAoZGF0YVtvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgM11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVtRW5jb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGVMb25nKGRhdGEsIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4gOCkgJiAweGZmO1xuICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZjtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1TaXplID0gMjtcbiAgICAgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGUoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gKGRhdGFbb2Zmc2V0XSA8PCA5KSB8IChkYXRhW29mZnNldCArIDFdIDw8IDEpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaXRlbUVuY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRW5jb2RlKGRhdGEsIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9ICh2YWx1ZSA+PiA5KSAmIDB4ZmY7XG4gICAgICAgICAgICBkYXRhW29mZnNldCArIDFdID0gKHZhbHVlID4+IDEpICYgMHhmZjtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBmaXJzdCBnbHlwaCBpcyBkdXBsaWNhdGVkLlxuICAgICAgICB2YXIgbnVtR2x5cGhzT3V0ID0gZHVwRmlyc3RFbnRyeSA/IG51bUdseXBocyArIDEgOiBudW1HbHlwaHM7XG4gICAgICAgIHZhciBsb2NhRGF0YVNpemUgPSBpdGVtU2l6ZSAqICgxICsgbnVtR2x5cGhzT3V0KTtcbiAgICAgICAgLy8gUmVzaXplIGxvY2EgdGFibGUgdG8gYWNjb3VudCBmb3IgZHVwbGljYXRlZCBnbHlwaC5cbiAgICAgICAgdmFyIGxvY2FEYXRhID0gbmV3IFVpbnQ4QXJyYXkobG9jYURhdGFTaXplKTtcbiAgICAgICAgbG9jYURhdGEuc2V0KGxvY2EuZGF0YS5zdWJhcnJheSgwLCBsb2NhRGF0YVNpemUpKTtcbiAgICAgICAgbG9jYS5kYXRhID0gbG9jYURhdGE7XG4gICAgICAgIC8vIHJlbW92aW5nIHRoZSBpbnZhbGlkIGdseXBoc1xuICAgICAgICB2YXIgb2xkR2x5ZkRhdGEgPSBnbHlmLmRhdGE7XG4gICAgICAgIHZhciBvbGRHbHlmRGF0YUxlbmd0aCA9IG9sZEdseWZEYXRhLmxlbmd0aDtcbiAgICAgICAgdmFyIG5ld0dseWZEYXRhID0gbmV3IFVpbnQ4QXJyYXkob2xkR2x5ZkRhdGFMZW5ndGgpO1xuXG4gICAgICAgIC8vIFRoZSBzcGVjIHNheXMgdGhlIG9mZnNldHMgc2hvdWxkIGJlIGluIGFzY2VuZGluZyBvcmRlciwgaG93ZXZlclxuICAgICAgICAvLyB0aGlzIGlzIG5vdCB0cnVlIGZvciBzb21lIGZvbnRzIG9yIHRoZXkgdXNlIHRoZSBvZmZzZXQgb2YgMCB0byBtYXJrIGFcbiAgICAgICAgLy8gZ2x5cGggYXMgbWlzc2luZy4gT1RTIHJlcXVpcmVzIHRoZSBvZmZzZXRzIHRvIGJlIGluIG9yZGVyIGFuZCBub3QgdG9cbiAgICAgICAgLy8gYmUgemVybywgc28gd2UgbXVzdCBzb3J0IGFuZCByZWJ1aWxkIHRoZSBsb2NhIHRhYmxlIGFuZCBwb3RlbnRpYWxseVxuICAgICAgICAvLyByZS1hcnJhbmdlIHRoZSBnbHlmIGRhdGEuXG4gICAgICAgIHZhciBpLCBqO1xuICAgICAgICBjb25zdCBsb2NhRW50cmllcyA9IFtdO1xuICAgICAgICAvLyBUaGVyZSBhcmUgbnVtR2x5cGhzICsgMSBsb2NhIHRhYmxlIGVudHJpZXMuXG4gICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbnVtR2x5cGhzICsgMTsgaSsrLCBqICs9IGl0ZW1TaXplKSB7XG4gICAgICAgICAgbGV0IG9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYURhdGEsIGopO1xuICAgICAgICAgIGlmIChvZmZzZXQgPiBvbGRHbHlmRGF0YUxlbmd0aCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2xkR2x5ZkRhdGFMZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvY2FFbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBlbmRPZmZzZXQ6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYUVudHJpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIHJldHVybiBhLm9mZnNldCAtIGIub2Zmc2V0O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTm93IHRoZSBvZmZzZXRzIGFyZSBzb3J0ZWQsIGNhbGN1bGF0ZSB0aGUgZW5kIG9mZnNldCBvZiBlYWNoIGdseXBoLlxuICAgICAgICAvLyBUaGUgbGFzdCBsb2NhIGVudHJ5J3MgZW5kT2Zmc2V0IGlzIG5vdCBjYWxjdWxhdGVkIHNpbmNlIGl0J3MgdGhlIGVuZFxuICAgICAgICAvLyBvZiB0aGUgZGF0YSBhbmQgd2lsbCBiZSBzdG9yZWQgb24gdGhlIHByZXZpb3VzIGVudHJ5J3MgZW5kT2Zmc2V0LlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHtcbiAgICAgICAgICBsb2NhRW50cmllc1tpXS5lbmRPZmZzZXQgPSBsb2NhRW50cmllc1tpICsgMV0ub2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlLXNvcnQgc28gZ2x5cGhzIGFyZW4ndCBvdXQgb2Ygb3JkZXIuXG4gICAgICAgIGxvY2FFbnRyaWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBtaXNzaW5nR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIHdyaXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgMCwgd3JpdGVPZmZzZXQpO1xuICAgICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHM7IGkrKywgaiArPSBpdGVtU2l6ZSkge1xuICAgICAgICAgIHZhciBnbHlwaFByb2ZpbGUgPSBzYW5pdGl6ZUdseXBoKFxuICAgICAgICAgICAgb2xkR2x5ZkRhdGEsXG4gICAgICAgICAgICBsb2NhRW50cmllc1tpXS5vZmZzZXQsXG4gICAgICAgICAgICBsb2NhRW50cmllc1tpXS5lbmRPZmZzZXQsXG4gICAgICAgICAgICBuZXdHbHlmRGF0YSxcbiAgICAgICAgICAgIHdyaXRlT2Zmc2V0LFxuICAgICAgICAgICAgaGludHNWYWxpZFxuICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIG5ld0xlbmd0aCA9IGdseXBoUHJvZmlsZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKG5ld0xlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbWlzc2luZ0dseXBoc1tpXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID4gbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3cml0ZU9mZnNldCArPSBuZXdMZW5ndGg7XG4gICAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgaiwgd3JpdGVPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdyaXRlT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgLy8gZ2x5ZiB0YWJsZSBjYW5ub3QgYmUgZW1wdHkgLS0gcmVkb2luZyB0aGUgZ2x5ZiBhbmQgbG9jYSB0YWJsZXNcbiAgICAgICAgICAvLyB0byBoYXZlIHNpbmdsZSBnbHlwaCB3aXRoIG9uZSBwb2ludFxuICAgICAgICAgIHZhciBzaW1wbGVHbHlwaCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgNDksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGZvciAoaSA9IDAsIGogPSBpdGVtU2l6ZTsgaSA8IG51bUdseXBoc091dDsgaSsrLCBqICs9IGl0ZW1TaXplKSB7XG4gICAgICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCBzaW1wbGVHbHlwaC5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnbHlmLmRhdGEgPSBzaW1wbGVHbHlwaDtcbiAgICAgICAgfSBlbHNlIGlmIChkdXBGaXJzdEVudHJ5KSB7XG4gICAgICAgICAgLy8gQnJvd3NlcnMgd2lsbCBub3QgZGlzcGxheSBhIGdseXBoIGF0IHBvc2l0aW9uIDAuIFR5cGljYWxseSBnbHlwaCAwXG4gICAgICAgICAgLy8gaXMgbm90ZGVmLCBidXQgYSBudW1iZXIgb2YgZm9udHMgcHV0IGEgdmFsaWQgZ2x5cGggdGhlcmUgc28gaXQgbXVzdFxuICAgICAgICAgIC8vIGJlIGR1cGxpY2F0ZWQgYW5kIGFwcGVuZGVkLlxuICAgICAgICAgIHZhciBmaXJzdEVudHJ5TGVuZ3RoID0gaXRlbURlY29kZShsb2NhRGF0YSwgaXRlbVNpemUpO1xuICAgICAgICAgIGlmIChuZXdHbHlmRGF0YS5sZW5ndGggPiBmaXJzdEVudHJ5TGVuZ3RoICsgd3JpdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdseWYuZGF0YSA9IG5ldyBVaW50OEFycmF5KGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7XG4gICAgICAgICAgICBnbHlmLmRhdGEuc2V0KG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdseWYuZGF0YS5zZXQobmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgZmlyc3RFbnRyeUxlbmd0aCksIHdyaXRlT2Zmc2V0KTtcbiAgICAgICAgICBpdGVtRW5jb2RlKFxuICAgICAgICAgICAgbG9jYS5kYXRhLFxuICAgICAgICAgICAgbG9jYURhdGEubGVuZ3RoIC0gaXRlbVNpemUsXG4gICAgICAgICAgICB3cml0ZU9mZnNldCArIGZpcnN0RW50cnlMZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1pc3NpbmdHbHlwaHMsXG4gICAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWFkUG9zdFNjcmlwdFRhYmxlKHBvc3QsIHByb3BlcnRpZXNPYmosIG1heHBOdW1HbHlwaHMpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gKGZvbnQuc3RhcnQgPyBmb250LnN0YXJ0IDogMCkgKyBwb3N0Lm9mZnNldDtcbiAgICAgICAgZm9udC5wb3MgPSBzdGFydDtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gcG9zdC5sZW5ndGgsXG4gICAgICAgICAgZW5kID0gc3RhcnQgKyBsZW5ndGg7XG4gICAgICAgIHZhciB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpO1xuICAgICAgICAvLyBza2lwIHJlc3QgdG8gdGhlIHRhYmxlc1xuICAgICAgICBmb250LnNraXAoMjgpO1xuXG4gICAgICAgIHZhciBnbHlwaE5hbWVzO1xuICAgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuICAgICAgICB2YXIgaTtcblxuICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICBjYXNlIDB4MDAwMTAwMDA6XG4gICAgICAgICAgICBnbHlwaE5hbWVzID0gTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDAwMDIwMDAwOlxuICAgICAgICAgICAgdmFyIG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7XG4gICAgICAgICAgICBpZiAobnVtR2x5cGhzICE9PSBtYXhwTnVtR2x5cGhzKSB7XG4gICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGdseXBoTmFtZUluZGV4ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkge1xuICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmb250LmdldFVpbnQxNigpO1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMzI3NjgpIHtcbiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGdseXBoTmFtZUluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGN1c3RvbU5hbWVzID0gW107XG4gICAgICAgICAgICB2YXIgc3RyQnVmID0gW107XG4gICAgICAgICAgICB3aGlsZSAoZm9udC5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgICAgdmFyIHN0cmluZ0xlbmd0aCA9IGZvbnQuZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgICBzdHJCdWYubGVuZ3RoID0gc3RyaW5nTGVuZ3RoO1xuICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBzdHJCdWZbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0Qnl0ZSgpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjdXN0b21OYW1lcy5wdXNoKHN0ckJ1Zi5qb2luKFwiXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdseXBoTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkge1xuICAgICAgICAgICAgICB2YXIgaiA9IGdseXBoTmFtZUluZGV4ZXNbaV07XG4gICAgICAgICAgICAgIGlmIChqIDwgMjU4KSB7XG4gICAgICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tqXSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKGN1c3RvbU5hbWVzW2ogLSAyNThdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgwMDAzMDAwMDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB3YXJuKFwiVW5rbm93bi91bnN1cHBvcnRlZCBwb3N0IHRhYmxlIHZlcnNpb24gXCIgKyB2ZXJzaW9uKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllc09iai5kZWZhdWx0RW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgZ2x5cGhOYW1lcyA9IHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcHJvcGVydGllc09iai5nbHlwaE5hbWVzID0gZ2x5cGhOYW1lcztcbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZWFkTmFtZVRhYmxlKG5hbWVUYWJsZSkge1xuICAgICAgICB2YXIgc3RhcnQgPSAoZm9udC5zdGFydCA/IGZvbnQuc3RhcnQgOiAwKSArIG5hbWVUYWJsZS5vZmZzZXQ7XG4gICAgICAgIGZvbnQucG9zID0gc3RhcnQ7XG5cbiAgICAgICAgdmFyIG5hbWVzID0gW1tdLCBbXV07XG4gICAgICAgIHZhciBsZW5ndGggPSBuYW1lVGFibGUubGVuZ3RoLFxuICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoO1xuICAgICAgICB2YXIgZm9ybWF0ID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgICAgdmFyIEZPUk1BVF8wX0hFQURFUl9MRU5HVEggPSA2O1xuICAgICAgICBpZiAoZm9ybWF0ICE9PSAwIHx8IGxlbmd0aCA8IEZPUk1BVF8wX0hFQURFUl9MRU5HVEgpIHtcbiAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBuYW1lIHRhYmxlIGZvcm1hdCBvciB0YWJsZSBcInRvb1wiIHNtYWxsXG4gICAgICAgICAgcmV0dXJuIG5hbWVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBudW1SZWNvcmRzID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgICAgdmFyIHN0cmluZ3NTdGFydCA9IGZvbnQuZ2V0VWludDE2KCk7XG4gICAgICAgIHZhciByZWNvcmRzID0gW107XG4gICAgICAgIHZhciBOQU1FX1JFQ09SRF9MRU5HVEggPSAxMjtcbiAgICAgICAgdmFyIGksIGlpO1xuXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgaSA8IG51bVJlY29yZHMgJiYgZm9udC5wb3MgKyBOQU1FX1JFQ09SRF9MRU5HVEggPD0gZW5kO1xuICAgICAgICAgIGkrK1xuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgciA9IHtcbiAgICAgICAgICAgIHBsYXRmb3JtOiBmb250LmdldFVpbnQxNigpLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IGZvbnQuZ2V0VWludDE2KCksXG4gICAgICAgICAgICBsYW5ndWFnZTogZm9udC5nZXRVaW50MTYoKSxcbiAgICAgICAgICAgIG5hbWU6IGZvbnQuZ2V0VWludDE2KCksXG4gICAgICAgICAgICBsZW5ndGg6IGZvbnQuZ2V0VWludDE2KCksXG4gICAgICAgICAgICBvZmZzZXQ6IGZvbnQuZ2V0VWludDE2KCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyB1c2luZyBvbmx5IE1hY2ludG9zaCBhbmQgV2luZG93cyBwbGF0Zm9ybS9lbmNvZGluZyBuYW1lc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChyLnBsYXRmb3JtID09PSAxICYmIHIuZW5jb2RpbmcgPT09IDAgJiYgci5sYW5ndWFnZSA9PT0gMCkgfHxcbiAgICAgICAgICAgIChyLnBsYXRmb3JtID09PSAzICYmIHIuZW5jb2RpbmcgPT09IDEgJiYgci5sYW5ndWFnZSA9PT0gMHg0MDkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZWNvcmRzLnB1c2gocik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gcmVjb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IHJlY29yZHNbaV07XG4gICAgICAgICAgaWYgKHJlY29yZC5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIE5vdGhpbmcgdG8gcHJvY2VzcywgaWdub3JpbmcuXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwb3MgPSBzdGFydCArIHN0cmluZ3NTdGFydCArIHJlY29yZC5vZmZzZXQ7XG4gICAgICAgICAgaWYgKHBvcyArIHJlY29yZC5sZW5ndGggPiBlbmQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBvdXRzaWRlIG9mIG5hbWUgdGFibGUsIGlnbm9yaW5nXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvbnQucG9zID0gcG9zO1xuICAgICAgICAgIHZhciBuYW1lSW5kZXggPSByZWNvcmQubmFtZTtcbiAgICAgICAgICBpZiAocmVjb3JkLmVuY29kaW5nKSB7XG4gICAgICAgICAgICAvLyB1bmljb2RlXG4gICAgICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHJlY29yZC5sZW5ndGg7IGogPCBqajsgaiArPSAyKSB7XG4gICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0VWludDE2KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFtZXNbMV1bbmFtZUluZGV4XSA9IHN0cjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmFtZXNbMF1bbmFtZUluZGV4XSA9IGJ5dGVzVG9TdHJpbmcoZm9udC5nZXRCeXRlcyhyZWNvcmQubGVuZ3RoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lcztcbiAgICAgIH1cblxuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICB2YXIgVFRPcHNTdGFja0RlbHRhcyA9IFtcbiAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTIsIC0yLCAtMiwgLTIsIDAsIDAsIC0yLCAtNSxcbiAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAtMSwgMCwgLTEsIC0xLCAtMSwgLTEsXG4gICAgICAgIDEsIC0xLCAtOTk5LCAwLCAxLCAwLCAtMSwgLTIsIDAsIC0xLCAtMiwgLTEsIC0xLCAwLCAtMSwgLTEsXG4gICAgICAgIDAsIDAsIC05OTksIC05OTksIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTk5OSwgLTIsIC0yLCAtOTk5LCAwLCAtMiwgLTIsXG4gICAgICAgIDAsIDAsIC0yLCAwLCAtMiwgMCwgMCwgMCwgLTIsIC0xLCAtMSwgMSwgMSwgMCwgMCwgLTEsXG4gICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgLTEsIDAsIC05OTksIC0xLCAtMSxcbiAgICAgICAgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gICAgICAgIC0yLCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtMSwgLTEsIC0yLCAtMiwgMCwgMCwgMCwgMCwgLTEsIC0xLFxuICAgICAgICAtOTk5LCAtMiwgLTIsIDAsIDAsIC0xLCAtMiwgLTIsIDAsIDAsIDAsIC0xLCAtMSwgLTEsIC0yXTtcbiAgICAgIC8vIDB4QzAtREYgPT0gLTEgYW5kIDB4RTAtRkYgPT0gLTJcblxuICAgICAgZnVuY3Rpb24gc2FuaXRpemVUVFByb2dyYW0odGFibGUsIHR0Q29udGV4dCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRhYmxlLmRhdGE7XG4gICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICBqLFxuICAgICAgICAgIG4sXG4gICAgICAgICAgYixcbiAgICAgICAgICBmdW5jSWQsXG4gICAgICAgICAgcGMsXG4gICAgICAgICAgbGFzdEVuZGYgPSAwLFxuICAgICAgICAgIGxhc3REZWZmID0gMDtcbiAgICAgICAgdmFyIHN0YWNrID0gW107XG4gICAgICAgIHZhciBjYWxsc3RhY2sgPSBbXTtcbiAgICAgICAgdmFyIGZ1bmN0aW9uc0NhbGxlZCA9IFtdO1xuICAgICAgICB2YXIgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucztcbiAgICAgICAgdmFyIGluRkRFRiA9IGZhbHNlLFxuICAgICAgICAgIGlmTGV2ZWwgPSAwLFxuICAgICAgICAgIGluRUxTRSA9IDA7XG4gICAgICAgIGZvciAodmFyIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgKSB7XG4gICAgICAgICAgdmFyIG9wID0gZGF0YVtpKytdO1xuICAgICAgICAgIC8vIFRoZSBUcnVlVHlwZSBpbnN0cnVjdGlvbiBzZXQgZG9jcyBjYW4gYmUgZm91bmQgYXRcbiAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVFRSZWZNYW4vUk0wNS9DaGFwNS5odG1sXG4gICAgICAgICAgaWYgKG9wID09PSAweDQwKSB7XG4gICAgICAgICAgICAvLyBOUFVTSEIgLSBwdXNoZXMgbiBieXRlc1xuICAgICAgICAgICAgbiA9IGRhdGFbaSsrXTtcbiAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7XG4gICAgICAgICAgICAgIGkgKz0gbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDQxKSB7XG4gICAgICAgICAgICAvLyBOUFVTSFcgLSBwdXNoZXMgbiB3b3Jkc1xuICAgICAgICAgICAgbiA9IGRhdGFbaSsrXTtcbiAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7XG4gICAgICAgICAgICAgIGkgKz0gbiAqIDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICAgICAgICAgICAgYiA9IGRhdGFbaSsrXTtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKChiIDw8IDgpIHwgZGF0YVtpKytdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmOCkgPT09IDB4YjApIHtcbiAgICAgICAgICAgIC8vIFBVU0hCIC0gcHVzaGVzIGJ5dGVzXG4gICAgICAgICAgICBuID0gb3AgLSAweGIwICsgMTtcbiAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7XG4gICAgICAgICAgICAgIGkgKz0gbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZjgpID09PSAweGI4KSB7XG4gICAgICAgICAgICAvLyBQVVNIVyAtIHB1c2hlcyB3b3Jkc1xuICAgICAgICAgICAgbiA9IG9wIC0gMHhiOCArIDE7XG4gICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkge1xuICAgICAgICAgICAgICBpICs9IG4gKiAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgICAgICAgICAgIGIgPSBkYXRhW2krK107XG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaCgoYiA8PCA4KSB8IGRhdGFbaSsrXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJiICYmICF0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIENBTExcbiAgICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHtcbiAgICAgICAgICAgICAgLy8gY29sbGVjdGluZyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBmdW5jdGlvbnMgYXJlIHVzZWRcbiAgICAgICAgICAgICAgZnVuY0lkID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgIGlmIChpc05hTihmdW5jSWQpKSB7XG4gICAgICAgICAgICAgICAgaW5mbyhcIlRUOiBDQUxMIGVtcHR5IHN0YWNrIChvciBpbnZhbGlkIGVudHJ5KS5cIik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc1VzZWRbZnVuY0lkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNJZCBpbiB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YWNrTGVuZ3RoID1cbiAgICAgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoICsgdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW2Z1bmNJZF07XG4gICAgICAgICAgICAgICAgICBpZiAobmV3U3RhY2tMZW5ndGggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oXCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS5cIik7XG4gICAgICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IG5ld1N0YWNrTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICFmdW5jdGlvbnNDYWxsZWQuaW5jbHVkZXMoZnVuY0lkKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2FsbHN0YWNrLnB1c2goeyBkYXRhLCBpLCBzdGFja1RvcDogc3RhY2subGVuZ3RoIC0gMSB9KTtcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uc0NhbGxlZC5wdXNoKGZ1bmNJZCk7XG4gICAgICAgICAgICAgICAgICBwYyA9IHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkW2Z1bmNJZF07XG4gICAgICAgICAgICAgICAgICBpZiAoIXBjKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oXCJUVDogQ0FMTCBub24tZXhpc3RlbnQgZnVuY3Rpb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYy5kYXRhO1xuICAgICAgICAgICAgICAgICAgaSA9IHBjLmk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgyYyAmJiAhdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7XG4gICAgICAgICAgICAvLyBGREVGXG4gICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkge1xuICAgICAgICAgICAgICB3YXJuKFwiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZFwiKTtcbiAgICAgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluRkRFRiA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb2xsZWN0aW5nIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZFxuICAgICAgICAgICAgbGFzdERlZmYgPSBpO1xuICAgICAgICAgICAgZnVuY0lkID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtmdW5jSWRdID0geyBkYXRhLCBpIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgyZCkge1xuICAgICAgICAgICAgLy8gRU5ERiAtIGVuZCBvZiBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKGluRkRFRikge1xuICAgICAgICAgICAgICBpbkZERUYgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbGFzdEVuZGYgPSBpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGMgPSBjYWxsc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIGlmICghcGMpIHtcbiAgICAgICAgICAgICAgICB3YXJuKFwiVFQ6IEVOREYgYmFkIHN0YWNrXCIpO1xuICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZ1bmNJZCA9IGZ1bmN0aW9uc0NhbGxlZC5wb3AoKTtcbiAgICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7XG4gICAgICAgICAgICAgIGkgPSBwYy5pO1xuICAgICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXSA9XG4gICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoIC0gcGMuc3RhY2tUb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg4OSkge1xuICAgICAgICAgICAgLy8gSURFRiAtIGluc3RydWN0aW9uIGRlZmluaXRpb25cbiAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7XG4gICAgICAgICAgICAgIHdhcm4oXCJUVDogbmVzdGVkIElERUZzIG5vdCBhbGxvd2VkXCIpO1xuICAgICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5GREVGID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHJlY29yZGluZyBpdCBhcyBhIGZ1bmN0aW9uIHRvIHRyYWNrIEVOREZcbiAgICAgICAgICAgIGxhc3REZWZmID0gaTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDU4KSB7XG4gICAgICAgICAgICAvLyBJRlxuICAgICAgICAgICAgKytpZkxldmVsO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWIpIHtcbiAgICAgICAgICAgIC8vIEVMU0VcbiAgICAgICAgICAgIGluRUxTRSA9IGlmTGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OSkge1xuICAgICAgICAgICAgLy8gRUlGXG4gICAgICAgICAgICBpZiAoaW5FTFNFID09PSBpZkxldmVsKSB7XG4gICAgICAgICAgICAgIGluRUxTRSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAtLWlmTGV2ZWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgxYykge1xuICAgICAgICAgICAgLy8gSk1QUlxuICAgICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkge1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgIC8vIG9ubHkganVtcGluZyBmb3J3YXJkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgICAgIGkgKz0gb2Zmc2V0IC0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBZGp1c3Rpbmcgc3RhY2sgbm90IGV4dGFjdGx5LCBidXQganVzdCBlbm91Z2ggdG8gZ2V0IGZ1bmN0aW9uIGlkXG4gICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkge1xuICAgICAgICAgICAgbGV0IHN0YWNrRGVsdGEgPSAwO1xuICAgICAgICAgICAgaWYgKG9wIDw9IDB4OGUpIHtcbiAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IFRUT3BzU3RhY2tEZWx0YXNbb3BdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA+PSAweGMwICYmIG9wIDw9IDB4ZGYpIHtcbiAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA+PSAweGUwKSB7XG4gICAgICAgICAgICAgIHN0YWNrRGVsdGEgPSAtMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcCA+PSAweDcxICYmIG9wIDw9IDB4NzUpIHtcbiAgICAgICAgICAgICAgbiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICBpZiAoIWlzTmFOKG4pKSB7XG4gICAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC1uICogMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHN0YWNrRGVsdGEgPCAwICYmIHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHN0YWNrRGVsdGErKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChzdGFja0RlbHRhID4gMCkge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKE5hTik7IC8vIHB1c2hpbmcgYW55IG51bWJlciBpbnRvIHN0YWNrXG4gICAgICAgICAgICAgIHN0YWNrRGVsdGEtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucztcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBbZGF0YV07XG4gICAgICAgIGlmIChpID4gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICBjb250ZW50LnB1c2gobmV3IFVpbnQ4QXJyYXkoaSAtIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3REZWZmID4gbGFzdEVuZGYpIHtcbiAgICAgICAgICB3YXJuKFwiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWxcIik7XG4gICAgICAgICAgLy8gbmV3IGZ1bmN0aW9uIGRlZmluaXRpb24gc3RhcnRlZCwgYnV0IG5vdCBmaW5pc2hlZFxuICAgICAgICAgIC8vIGNvbXBsZXRlIGZ1bmN0aW9uIGJ5IFtDTEVBUiwgRU5ERl1cbiAgICAgICAgICBjb250ZW50LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzB4MjIsIDB4MmRdKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjaGVja0ludmFsaWRGdW5jdGlvbnModHRDb250ZXh0LCBtYXhGdW5jdGlvbkRlZnMpIHtcbiAgICAgICAgaWYgKHR0Q29udGV4dC50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkLmxlbmd0aCA+IG1heEZ1bmN0aW9uRGVmcykge1xuICAgICAgICAgIHdhcm4oXCJUVDogbW9yZSBmdW5jdGlvbnMgZGVmaW5lZCB0aGFuIGV4cGVjdGVkXCIpO1xuICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICBpZiAoaiA+IG1heEZ1bmN0aW9uRGVmcykge1xuICAgICAgICAgICAgd2FybihcIlRUOiBpbnZhbGlkIGZ1bmN0aW9uIGlkOiBcIiArIGopO1xuICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2pdICYmICF0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtqXSkge1xuICAgICAgICAgICAgd2FybihcIlRUOiB1bmRlZmluZWQgZnVuY3Rpb246IFwiICsgaik7XG4gICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmb2xkVFRUYWJsZSh0YWJsZSwgY29udGVudCkge1xuICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gY29uY2F0ZW5hdGluZyB0aGUgY29udGVudCBpdGVtc1xuICAgICAgICAgIHZhciBuZXdMZW5ndGggPSAwO1xuICAgICAgICAgIHZhciBqLCBqajtcbiAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvbnRlbnQubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgbmV3TGVuZ3RoICs9IGNvbnRlbnRbal0ubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdMZW5ndGggPSAobmV3TGVuZ3RoICsgMykgJiB+MztcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobmV3TGVuZ3RoKTtcbiAgICAgICAgICB2YXIgcG9zID0gMDtcbiAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvbnRlbnQubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgcmVzdWx0LnNldChjb250ZW50W2pdLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IGNvbnRlbnRbal0ubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0YWJsZS5kYXRhID0gcmVzdWx0O1xuICAgICAgICAgIHRhYmxlLmxlbmd0aCA9IG5ld0xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbXMoZnBnbSwgcHJlcCwgY3Z0LCBtYXhGdW5jdGlvbkRlZnMpIHtcbiAgICAgICAgdmFyIHR0Q29udGV4dCA9IHtcbiAgICAgICAgICBmdW5jdGlvbnNEZWZpbmVkOiBbXSxcbiAgICAgICAgICBmdW5jdGlvbnNVc2VkOiBbXSxcbiAgICAgICAgICBmdW5jdGlvbnNTdGFja0RlbHRhczogW10sXG4gICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOiBmYWxzZSxcbiAgICAgICAgICBoaW50c1ZhbGlkOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoZnBnbSkge1xuICAgICAgICAgIHNhbml0aXplVFRQcm9ncmFtKGZwZ20sIHR0Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXApIHtcbiAgICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShwcmVwLCB0dENvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcGdtKSB7XG4gICAgICAgICAgY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3Z0ICYmIGN2dC5sZW5ndGggJiAxKSB7XG4gICAgICAgICAgdmFyIGN2dERhdGEgPSBuZXcgVWludDhBcnJheShjdnQubGVuZ3RoICsgMSk7XG4gICAgICAgICAgY3Z0RGF0YS5zZXQoY3Z0LmRhdGEpO1xuICAgICAgICAgIGN2dC5kYXRhID0gY3Z0RGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHRDb250ZXh0LmhpbnRzVmFsaWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc3RlcHMgbW9kaWZ5IHRoZSBvcmlnaW5hbCBmb250IGRhdGEsIG1ha2luZyBjb3B5XG4gICAgICBmb250ID0gbmV3IFN0cmVhbShuZXcgVWludDhBcnJheShmb250LmdldEJ5dGVzKCkpKTtcblxuICAgICAgbGV0IGhlYWRlciwgdGFibGVzO1xuICAgICAgaWYgKGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmb250KSkge1xuICAgICAgICBjb25zdCB0dGNEYXRhID0gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkRhdGEoZm9udCwgdGhpcy5uYW1lKTtcbiAgICAgICAgaGVhZGVyID0gdHRjRGF0YS5oZWFkZXI7XG4gICAgICAgIHRhYmxlcyA9IHR0Y0RhdGEudGFibGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZGVyID0gcmVhZE9wZW5UeXBlSGVhZGVyKGZvbnQpO1xuICAgICAgICB0YWJsZXMgPSByZWFkVGFibGVzKGZvbnQsIGhlYWRlci5udW1UYWJsZXMpO1xuICAgICAgfVxuICAgICAgbGV0IGNmZiwgY2ZmRmlsZTtcblxuICAgICAgdmFyIGlzVHJ1ZVR5cGUgPSAhdGFibGVzW1wiQ0ZGIFwiXTtcbiAgICAgIGlmICghaXNUcnVlVHlwZSkge1xuICAgICAgICBjb25zdCBpc0NvbXBvc2l0ZSA9XG4gICAgICAgICAgcHJvcGVydGllcy5jb21wb3NpdGUgJiZcbiAgICAgICAgICAoKHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW10pLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICEocHJvcGVydGllcy5jTWFwIGluc3RhbmNlb2YgSWRlbnRpdHlDTWFwKSk7XG4gICAgICAgIC8vIE9wZW5UeXBlIGZvbnQgKHNraXAgY29tcG9zaXRlIGZvbnRzIHdpdGggbm9uLWRlZmF1bHQgZ2x5cGggbWFwcGluZykuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoaGVhZGVyLnZlcnNpb24gPT09IFwiT1RUT1wiICYmICFpc0NvbXBvc2l0ZSkgfHxcbiAgICAgICAgICAhdGFibGVzLmhlYWQgfHxcbiAgICAgICAgICAhdGFibGVzLmhoZWEgfHxcbiAgICAgICAgICAhdGFibGVzLm1heHAgfHxcbiAgICAgICAgICAhdGFibGVzLnBvc3RcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTm8gbWFqb3IgdGFibGVzOiB0aHJvd2luZyBldmVyeXRoaW5nIGF0IGBDRkZGb250YC5cbiAgICAgICAgICBjZmZGaWxlID0gbmV3IFN0cmVhbSh0YWJsZXNbXCJDRkYgXCJdLmRhdGEpO1xuICAgICAgICAgIGNmZiA9IG5ldyBDRkZGb250KGNmZkZpbGUsIHByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydChuYW1lLCBjZmYsIHByb3BlcnRpZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRhYmxlcy5nbHlmO1xuICAgICAgICBkZWxldGUgdGFibGVzLmxvY2E7XG4gICAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTtcbiAgICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwO1xuICAgICAgICBkZWxldGUgdGFibGVzW1wiY3Z0IFwiXTtcbiAgICAgICAgdGhpcy5pc09wZW5UeXBlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGFibGVzLmxvY2EpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1JlcXVpcmVkIFwibG9jYVwiIHRhYmxlIGlzIG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFibGVzLmdseWYpIHtcbiAgICAgICAgICB3YXJuKCdSZXF1aXJlZCBcImdseWZcIiB0YWJsZSBpcyBub3QgZm91bmQgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7XG4gICAgICAgICAgLy8gTm90ZTogV2UgdXNlIGBzYW5pdGl6ZUdseXBoTG9jYXRpb25zYCB0byBhZGQgZHVtbXkgZ2x5ZiBkYXRhIGJlbG93LlxuICAgICAgICAgIHRhYmxlcy5nbHlmID0ge1xuICAgICAgICAgICAgdGFnOiBcImdseWZcIixcbiAgICAgICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc09wZW5UeXBlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGFibGVzLm1heHApIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCBcIm1heHBcIiB0YWJsZSBpcyBub3QgZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgZm9udC5wb3MgPSAoZm9udC5zdGFydCB8fCAwKSArIHRhYmxlcy5tYXhwLm9mZnNldDtcbiAgICAgIHZhciB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpO1xuICAgICAgY29uc3QgbnVtR2x5cGhzID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgIC8vIEdseXBoIDAgaXMgZHVwbGljYXRlZCBhbmQgYXBwZW5kZWQuXG4gICAgICBsZXQgbnVtR2x5cGhzT3V0ID0gbnVtR2x5cGhzICsgMTtcbiAgICAgIGxldCBkdXBGaXJzdEVudHJ5ID0gdHJ1ZTtcbiAgICAgIGlmIChudW1HbHlwaHNPdXQgPiAweGZmZmYpIHtcbiAgICAgICAgZHVwRmlyc3RFbnRyeSA9IGZhbHNlO1xuICAgICAgICBudW1HbHlwaHNPdXQgPSBudW1HbHlwaHM7XG4gICAgICAgIHdhcm4oXCJOb3QgZW5vdWdoIHNwYWNlIGluIGdseWZzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC5cIik7XG4gICAgICB9XG4gICAgICB2YXIgbWF4RnVuY3Rpb25EZWZzID0gMDtcbiAgICAgIHZhciBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSAwO1xuICAgICAgaWYgKHZlcnNpb24gPj0gMHgwMDAxMDAwMCAmJiB0YWJsZXMubWF4cC5sZW5ndGggPj0gMjIpIHtcbiAgICAgICAgLy8gbWF4Wm9uZXMgY2FuIGJlIGludmFsaWRcbiAgICAgICAgZm9udC5wb3MgKz0gODtcbiAgICAgICAgdmFyIG1heFpvbmVzID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgICAgaWYgKG1heFpvbmVzID4gMikge1xuICAgICAgICAgIC8vIHJlc2V0IHRvIDIgaWYgZm9udCBoYXMgaW52YWxpZCBtYXhab25lc1xuICAgICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMTRdID0gMDtcbiAgICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE1XSA9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZm9udC5wb3MgKz0gNDtcbiAgICAgICAgbWF4RnVuY3Rpb25EZWZzID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgICAgZm9udC5wb3MgKz0gNDtcbiAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID0gZm9udC5nZXRVaW50MTYoKTtcbiAgICAgIH1cblxuICAgICAgdGFibGVzLm1heHAuZGF0YVs0XSA9IG51bUdseXBoc091dCA+PiA4O1xuICAgICAgdGFibGVzLm1heHAuZGF0YVs1XSA9IG51bUdseXBoc091dCAmIDI1NTtcblxuICAgICAgdmFyIGhpbnRzVmFsaWQgPSBzYW5pdGl6ZVRUUHJvZ3JhbXMoXG4gICAgICAgIHRhYmxlcy5mcGdtLFxuICAgICAgICB0YWJsZXMucHJlcCxcbiAgICAgICAgdGFibGVzW1wiY3Z0IFwiXSxcbiAgICAgICAgbWF4RnVuY3Rpb25EZWZzXG4gICAgICApO1xuICAgICAgaWYgKCFoaW50c1ZhbGlkKSB7XG4gICAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTtcbiAgICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwO1xuICAgICAgICBkZWxldGUgdGFibGVzW1wiY3Z0IFwiXTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHRoZSBobXR4IHRhYmxlIGNvbnRhaW5zIHRoZSBhZHZhbmNlIHdpZHRoIGFuZFxuICAgICAgLy8gc2lkZWJlYXJpbmdzIGluZm9ybWF0aW9uIGZvciBudW1HbHlwaHMgaW4gdGhlIG1heHAgdGFibGVcbiAgICAgIHNhbml0aXplTWV0cmljcyhcbiAgICAgICAgZm9udCxcbiAgICAgICAgdGFibGVzLmhoZWEsXG4gICAgICAgIHRhYmxlcy5obXR4LFxuICAgICAgICBudW1HbHlwaHNPdXQsXG4gICAgICAgIGR1cEZpcnN0RW50cnlcbiAgICAgICk7XG5cbiAgICAgIGlmICghdGFibGVzLmhlYWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCBcImhlYWRcIiB0YWJsZSBpcyBub3QgZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgc2FuaXRpemVIZWFkKHRhYmxlcy5oZWFkLCBudW1HbHlwaHMsIGlzVHJ1ZVR5cGUgPyB0YWJsZXMubG9jYS5sZW5ndGggOiAwKTtcblxuICAgICAgdmFyIG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgaWYgKGlzVHJ1ZVR5cGUpIHtcbiAgICAgICAgdmFyIGlzR2x5cGhMb2NhdGlvbnNMb25nID0gaW50MTYoXG4gICAgICAgICAgdGFibGVzLmhlYWQuZGF0YVs1MF0sXG4gICAgICAgICAgdGFibGVzLmhlYWQuZGF0YVs1MV1cbiAgICAgICAgKTtcbiAgICAgICAgdmFyIGdseXBoc0luZm8gPSBzYW5pdGl6ZUdseXBoTG9jYXRpb25zKFxuICAgICAgICAgIHRhYmxlcy5sb2NhLFxuICAgICAgICAgIHRhYmxlcy5nbHlmLFxuICAgICAgICAgIG51bUdseXBocyxcbiAgICAgICAgICBpc0dseXBoTG9jYXRpb25zTG9uZyxcbiAgICAgICAgICBoaW50c1ZhbGlkLFxuICAgICAgICAgIGR1cEZpcnN0RW50cnksXG4gICAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zXG4gICAgICAgICk7XG4gICAgICAgIG1pc3NpbmdHbHlwaHMgPSBnbHlwaHNJbmZvLm1pc3NpbmdHbHlwaHM7XG5cbiAgICAgICAgLy8gU29tZSBmb250cyBoYXZlIGluY29ycmVjdCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWVzLCBzbyB3ZSB1c2VcbiAgICAgICAgLy8gdGhlIGNvbXB1dGVkIHZhbHVlIGluc3RlYWQuXG4gICAgICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDIyKSB7XG4gICAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyNl0gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyA+PiA4O1xuICAgICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMjddID0gZ2x5cGhzSW5mby5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgJiAyNTU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGFibGVzLmhoZWEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCBcImhoZWFcIiB0YWJsZSBpcyBub3QgZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemVyIHJlZHVjZXMgdGhlIGdseXBoIGFkdmFuY2VXaWR0aCB0byB0aGUgbWF4QWR2YW5jZVdpZHRoXG4gICAgICAvLyBTb21ldGltZXMgaXQncyAwLiBUaGF0IG5lZWRzIHRvIGJlIGZpeGVkXG4gICAgICBpZiAodGFibGVzLmhoZWEuZGF0YVsxMF0gPT09IDAgJiYgdGFibGVzLmhoZWEuZGF0YVsxMV0gPT09IDApIHtcbiAgICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMF0gPSAweGZmO1xuICAgICAgICB0YWJsZXMuaGhlYS5kYXRhWzExXSA9IDB4ZmY7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3Qgc29tZSBtb3JlIGZvbnQgcHJvcGVydGllcyBmcm9tIHRoZSBPcGVuVHlwZSBoZWFkIGFuZFxuICAgICAgLy8gaGhlYSB0YWJsZXM7IHlNaW4gYW5kIGRlc2NlbnQgdmFsdWUgYXJlIGFsd2F5cyBuZWdhdGl2ZS5cbiAgICAgIHZhciBtZXRyaWNzT3ZlcnJpZGUgPSB7XG4gICAgICAgIHVuaXRzUGVyRW06IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbMThdLCB0YWJsZXMuaGVhZC5kYXRhWzE5XSksXG4gICAgICAgIHlNYXg6IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbNDJdLCB0YWJsZXMuaGVhZC5kYXRhWzQzXSksXG4gICAgICAgIHlNaW46IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbMzhdLCB0YWJsZXMuaGVhZC5kYXRhWzM5XSksXG4gICAgICAgIGFzY2VudDogaW50MTYodGFibGVzLmhoZWEuZGF0YVs0XSwgdGFibGVzLmhoZWEuZGF0YVs1XSksXG4gICAgICAgIGRlc2NlbnQ6IHNpZ25lZEludDE2KHRhYmxlcy5oaGVhLmRhdGFbNl0sIHRhYmxlcy5oaGVhLmRhdGFbN10pLFxuICAgICAgfTtcblxuICAgICAgLy8gUERGIEZvbnREZXNjcmlwdG9yIG1ldHJpY3MgbGllIC0tIHVzaW5nIGRhdGEgZnJvbSBhY3R1YWwgZm9udC5cbiAgICAgIHRoaXMuYXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmFzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtO1xuICAgICAgdGhpcy5kZXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmRlc2NlbnQgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTtcblxuICAgICAgLy8gVGhlICdwb3N0JyB0YWJsZSBoYXMgZ2x5cGhzIG5hbWVzLlxuICAgICAgaWYgKHRhYmxlcy5wb3N0KSB7XG4gICAgICAgIHJlYWRQb3N0U2NyaXB0VGFibGUodGFibGVzLnBvc3QsIHByb3BlcnRpZXMsIG51bUdseXBocyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBvcmlnaW5hbCAncG9zdCcgdGFibGUgaXMgbm90IG5lZWRlZCwgcmVwbGFjZSBpdC5cbiAgICAgIHRhYmxlcy5wb3N0ID0ge1xuICAgICAgICB0YWc6IFwicG9zdFwiLFxuICAgICAgICBkYXRhOiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcyksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IFtdO1xuXG4gICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gdHJ5IHRvIHNraXAgbWFwcGluZyBvZiBlbXB0eSBnbHlwaHMuXG4gICAgICBmdW5jdGlvbiBoYXNHbHlwaChnbHlwaElkKSB7XG4gICAgICAgIHJldHVybiAhbWlzc2luZ0dseXBoc1tnbHlwaElkXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7XG4gICAgICAgIHZhciBjaWRUb0dpZE1hcCA9IHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW107XG4gICAgICAgIHZhciBpc0NpZFRvR2lkTWFwRW1wdHkgPSBjaWRUb0dpZE1hcC5sZW5ndGggPT09IDA7XG5cbiAgICAgICAgcHJvcGVydGllcy5jTWFwLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCBjaWQpIHtcbiAgICAgICAgICBpZiAoY2lkID4gMHhmZmZmKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJNYXggc2l6ZSBvZiBDSUQgaXMgNjUsNTM1XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZ2x5cGhJZCA9IC0xO1xuICAgICAgICAgIGlmIChpc0NpZFRvR2lkTWFwRW1wdHkpIHtcbiAgICAgICAgICAgIGdseXBoSWQgPSBjaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGdseXBoSWQgPSBjaWRUb0dpZE1hcFtjaWRdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChnbHlwaElkID49IDAgJiYgZ2x5cGhJZCA8IG51bUdseXBocyAmJiBoYXNHbHlwaChnbHlwaElkKSkge1xuICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTW9zdCBvZiB0aGUgZm9sbG93aW5nIGxvZ2ljIGluIHRoaXMgY29kZSBicmFuY2ggaXMgYmFzZWQgb24gdGhlXG4gICAgICAgIC8vIDkuNi42LjQgb2YgdGhlIFBERiBzcGVjLlxuICAgICAgICB2YXIgY21hcFRhYmxlID0gcmVhZENtYXBUYWJsZShcbiAgICAgICAgICB0YWJsZXMuY21hcCxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIHRoaXMuaXNTeW1ib2xpY0ZvbnQsXG4gICAgICAgICAgcHJvcGVydGllcy5oYXNFbmNvZGluZ1xuICAgICAgICApO1xuICAgICAgICB2YXIgY21hcFBsYXRmb3JtSWQgPSBjbWFwVGFibGUucGxhdGZvcm1JZDtcbiAgICAgICAgdmFyIGNtYXBFbmNvZGluZ0lkID0gY21hcFRhYmxlLmVuY29kaW5nSWQ7XG4gICAgICAgIHZhciBjbWFwTWFwcGluZ3MgPSBjbWFwVGFibGUubWFwcGluZ3M7XG4gICAgICAgIHZhciBjbWFwTWFwcGluZ3NMZW5ndGggPSBjbWFwTWFwcGluZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgYmFzZUVuY29kaW5nID0gW107XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nICYmXG4gICAgICAgICAgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSA9PT0gXCJNYWNSb21hbkVuY29kaW5nXCIgfHxcbiAgICAgICAgICAgIHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSA9PT0gXCJXaW5BbnNpRW5jb2RpbmdcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmFzZUVuY29kaW5nID0gZ2V0RW5jb2RpbmcocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBmb250IGhhcyBhbiBlbmNvZGluZyBhbmQgaXMgbm90IHN5bWJvbGljIHRoZW4gZm9sbG93IHRoZVxuICAgICAgICAvLyBydWxlcyBpbiBzZWN0aW9uIDkuNi42LjQgb2YgdGhlIHNwZWMgb24gaG93IHRvIG1hcCAzLDEgYW5kIDEsMFxuICAgICAgICAvLyBjbWFwcy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcgJiZcbiAgICAgICAgICAhdGhpcy5pc1N5bWJvbGljRm9udCAmJlxuICAgICAgICAgICgoY21hcFBsYXRmb3JtSWQgPT09IDMgJiYgY21hcEVuY29kaW5nSWQgPT09IDEpIHx8XG4gICAgICAgICAgICAoY21hcFBsYXRmb3JtSWQgPT09IDEgJiYgY21hcEVuY29kaW5nSWQgPT09IDApKVxuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTtcbiAgICAgICAgICBmb3IgKGxldCBjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGhOYW1lLCBzdGFuZGFyZEdseXBoTmFtZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpZmZlcmVuY2VzICYmIGNoYXJDb2RlIGluIHRoaXMuZGlmZmVyZW5jZXMpIHtcbiAgICAgICAgICAgICAgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBjaGFyQ29kZSBpbiBiYXNlRW5jb2RpbmcgJiZcbiAgICAgICAgICAgICAgYmFzZUVuY29kaW5nW2NoYXJDb2RlXSAhPT0gXCJcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyQ29kZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBnbHlwaE5hbWUgPSBTdGFuZGFyZEVuY29kaW5nW2NoYXJDb2RlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZ2x5cGhOYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm9uLXN0YW5kYXJkIGdseXBoIG5hbWVzIGFyZSByZXNvbHZlZCB0byB2YWxpZCBvbmVzLlxuICAgICAgICAgICAgc3RhbmRhcmRHbHlwaE5hbWUgPSByZWNvdmVyR2x5cGhOYW1lKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7XG5cbiAgICAgICAgICAgIHZhciB1bmljb2RlT3JDaGFyQ29kZTtcbiAgICAgICAgICAgIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMSkge1xuICAgICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IGdseXBoc1VuaWNvZGVNYXBbc3RhbmRhcmRHbHlwaE5hbWVdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMSAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiB0aGUgZW5jb2RpbmcgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIG1hYyBvcyB0YWJsZS5cbiAgICAgICAgICAgICAgdW5pY29kZU9yQ2hhckNvZGUgPSBNYWNSb21hbkVuY29kaW5nLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGlmIChjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGUgIT09IHVuaWNvZGVPckNoYXJDb2RlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gY21hcE1hcHBpbmdzW2ldLmdseXBoSWQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMCkge1xuICAgICAgICAgIC8vIERlZmF1bHQgVW5pY29kZSBzZW1hbnRpY3MsIHVzZSB0aGUgY2hhcmNvZGVzIGFzIGlzLlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY21hcE1hcHBpbmdzTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NtYXBNYXBwaW5nc1tpXS5jaGFyQ29kZV0gPVxuICAgICAgICAgICAgICBjbWFwTWFwcGluZ3NbaV0uZ2x5cGhJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBvbmx5IGEgKDEsIDApIGNtYXAgdGFibGUsIHRoZSBjaGFyIGNvZGUgaXMgYSBzaW5nbGVcbiAgICAgICAgICAvLyBieXRlIGFuZCBpdCBpcyB1c2VkIGRpcmVjdGx5IGFzIHRoZSBjaGFyIGNvZGUuXG5cbiAgICAgICAgICAvLyBXaGVuIGEgKDMsIDApIGNtYXAgdGFibGUgaXMgcHJlc2VudCwgaXQgaXMgdXNlZCBpbnN0ZWFkIGJ1dCB0aGVcbiAgICAgICAgICAvLyBzcGVjIGhhcyBzcGVjaWFsIHJ1bGVzIGZvciBjaGFyIGNvZGVzIGluIHRoZSByYW5nZSBvZiAweEYwMDAgdG9cbiAgICAgICAgICAvLyAweEYwRkYgYW5kIGl0IHNheXMgdGhlICgzLCAwKSB0YWJsZSBzaG91bGQgbWFwIHRoZSB2YWx1ZXMgZnJvbVxuICAgICAgICAgIC8vIHRoZSAoMSwgMCkgdGFibGUgYnkgcHJlcGVuZGluZyAweEYwIHRvIHRoZSBjaGFyIGNvZGVzLiBUbyByZXZlcnNlXG4gICAgICAgICAgLy8gdGhpcywgdGhlIHVwcGVyIGJpdHMgb2YgdGhlIGNoYXIgY29kZSBhcmUgY2xlYXJlZCwgYnV0IG9ubHkgZm9yIHRoZVxuICAgICAgICAgIC8vIHNwZWNpYWwgcmFuZ2Ugc2luY2Ugc29tZSBQREZzIGhhdmUgY2hhciBjb2RlcyBvdXRzaWRlIG9mIHRoaXMgcmFuZ2VcbiAgICAgICAgICAvLyAoZS5nLiAweDIwMTMpIHdoaWNoIHdoZW4gbWFza2VkIHdvdWxkIG92ZXJ3cml0ZSBvdGhlciB2YWx1ZXMgaW4gdGhlXG4gICAgICAgICAgLy8gY21hcC5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY2hhckNvZGUgPSBjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGU7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGNtYXBQbGF0Zm9ybUlkID09PSAzICYmXG4gICAgICAgICAgICAgIGNoYXJDb2RlID49IDB4ZjAwMCAmJlxuICAgICAgICAgICAgICBjaGFyQ29kZSA8PSAweGYwZmZcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjaGFyQ29kZSAmPSAweGZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gY21hcE1hcHBpbmdzW2ldLmdseXBoSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGFzdCwgdHJ5IHRvIG1hcCBhbnkgbWlzc2luZyBjaGFyY29kZXMgdXNpbmcgdGhlIHBvc3QgdGFibGUuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzLmdseXBoTmFtZXMgJiYgYmFzZUVuY29kaW5nLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjaGFyQ29kZVRvR2x5cGhJZFtpXSA9PT0gdW5kZWZpbmVkICYmIGJhc2VFbmNvZGluZ1tpXSkge1xuICAgICAgICAgICAgICBnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbaV07XG4gICAgICAgICAgICAgIGNvbnN0IGdseXBoSWQgPSBwcm9wZXJ0aWVzLmdseXBoTmFtZXMuaW5kZXhPZihnbHlwaE5hbWUpO1xuICAgICAgICAgICAgICBpZiAoZ2x5cGhJZCA+IDAgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHtcbiAgICAgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtpXSA9IGdseXBoSWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXJDb2RlVG9HbHlwaElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBkZWZpbmVzIGF0IGxlYXN0IG9uZSBnbHlwaFxuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFswXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGljYWxseSBnbHlwaCAwIGlzIGR1cGxpY2F0ZWQgYW5kIHRoZSBtYXBwaW5nIG11c3QgYmUgdXBkYXRlZCwgYnV0IGlmXG4gICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSB0byBkdXBsaWNhdGUsIHRoZSBnbHlwaCBpZCBpcyBsZWZ0IHRoZSBzYW1lLiBJblxuICAgICAgLy8gdGhpcyBjYXNlLCBnbHlwaCAwIG1heSBub3Qgd29yayBjb3JyZWN0bHksIGJ1dCB0aGF0IGlzIGJldHRlciB0aGFuXG4gICAgICAvLyBoYXZpbmcgdGhlIHdob2xlIGZvbnQgZmFpbC5cbiAgICAgIGxldCBnbHlwaFplcm9JZCA9IG51bUdseXBoc091dCAtIDE7XG4gICAgICBpZiAoIWR1cEZpcnN0RW50cnkpIHtcbiAgICAgICAgZ2x5cGhaZXJvSWQgPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0aW5nIGdseXBocyBhbmQgaWRzIGludG8gZm9udCdzIGNtYXAgdGFibGVcbiAgICAgIHZhciBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhjaGFyQ29kZVRvR2x5cGhJZCwgaGFzR2x5cGgsIGdseXBoWmVyb0lkKTtcbiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG5ld01hcHBpbmcudG9Gb250Q2hhcjtcbiAgICAgIHRhYmxlcy5jbWFwID0ge1xuICAgICAgICB0YWc6IFwiY21hcFwiLFxuICAgICAgICBkYXRhOiBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbnVtR2x5cGhzT3V0KSxcbiAgICAgIH07XG5cbiAgICAgIGlmICghdGFibGVzW1wiT1MvMlwiXSB8fCAhdmFsaWRhdGVPUzJUYWJsZSh0YWJsZXNbXCJPUy8yXCJdLCBmb250KSkge1xuICAgICAgICB0YWJsZXNbXCJPUy8yXCJdID0ge1xuICAgICAgICAgIHRhZzogXCJPUy8yXCIsXG4gICAgICAgICAgZGF0YTogY3JlYXRlT1MyVGFibGUoXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCxcbiAgICAgICAgICAgIG1ldHJpY3NPdmVycmlkZVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNUcnVlVHlwZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRyeWluZyB0byByZXBhaXIgQ0ZGIGZpbGVcbiAgICAgICAgICBjZmZGaWxlID0gbmV3IFN0cmVhbSh0YWJsZXNbXCJDRkYgXCJdLmRhdGEpO1xuICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgQ0ZGUGFyc2VyKFxuICAgICAgICAgICAgY2ZmRmlsZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICBTRUFDX0FOQUxZU0lTX0VOQUJMRURcbiAgICAgICAgICApO1xuICAgICAgICAgIGNmZiA9IHBhcnNlci5wYXJzZSgpO1xuICAgICAgICAgIGNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7XG4gICAgICAgICAgdmFyIGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKGNmZik7XG4gICAgICAgICAgdGFibGVzW1wiQ0ZGIFwiXS5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2FybihcIkZhaWxlZCB0byBjb21waWxlIGZvbnQgXCIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLWNyZWF0aW5nICduYW1lJyB0YWJsZVxuICAgICAgaWYgKCF0YWJsZXMubmFtZSkge1xuICAgICAgICB0YWJsZXMubmFtZSA9IHtcbiAgICAgICAgICB0YWc6IFwibmFtZVwiLFxuICAgICAgICAgIGRhdGE6IGNyZWF0ZU5hbWVUYWJsZSh0aGlzLm5hbWUpLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gLi4uIHVzaW5nIGV4aXN0aW5nICduYW1lJyB0YWJsZSBhcyBwcm90b3R5cGVcbiAgICAgICAgdmFyIG5hbWVQcm90b3R5cGUgPSByZWFkTmFtZVRhYmxlKHRhYmxlcy5uYW1lKTtcbiAgICAgICAgdGFibGVzLm5hbWUuZGF0YSA9IGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBuYW1lUHJvdG90eXBlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgT3BlblR5cGVGaWxlQnVpbGRlcihoZWFkZXIudmVyc2lvbik7XG4gICAgICBmb3IgKHZhciB0YWJsZVRhZyBpbiB0YWJsZXMpIHtcbiAgICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTtcbiAgICB9LFxuXG4gICAgY29udmVydDogZnVuY3Rpb24gRm9udF9jb252ZXJ0KGZvbnROYW1lLCBmb250LCBwcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBUT0RPOiBDaGVjayB0aGUgY2hhcnN0cmluZyB3aWR0aHMgdG8gZGV0ZXJtaW5lIHRoaXMuXG4gICAgICBwcm9wZXJ0aWVzLmZpeGVkUGl0Y2ggPSBmYWxzZTtcblxuICAgICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7XG4gICAgICAgIC8vIEZvciBUeXBlMSBmb250cyB0aGF0IGRvIG5vdCBpbmNsdWRlIGVpdGhlciBgVG9Vbmljb2RlYCBvciBgRW5jb2RpbmdgXG4gICAgICAgIC8vIGRhdGEsIGF0dGVtcHQgdG8gdXNlIHRoZSBgYnVpbHRJbkVuY29kaW5nYCB0byBpbXByb3ZlIHRleHQgc2VsZWN0aW9uLlxuICAgICAgICBhZGp1c3RUb1VuaWNvZGUocHJvcGVydGllcywgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpO1xuICAgICAgfVxuXG4gICAgICAvLyBUeXBlIDEgZm9udHMgaGF2ZSBhIG5vdGRlZiBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nLCBzbyBnbHlwaCAwXG4gICAgICAvLyBiZWNvbWVzIGdseXBoIDEuIEluIGEgQ0ZGIGZvbnQgZ2x5cGggMCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZVxuICAgICAgLy8gY2hhciBzdHJpbmdzLlxuICAgICAgbGV0IGdseXBoWmVyb0lkID0gMTtcbiAgICAgIGlmIChmb250IGluc3RhbmNlb2YgQ0ZGRm9udCkge1xuICAgICAgICBnbHlwaFplcm9JZCA9IGZvbnQubnVtR2x5cGhzIC0gMTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXBwaW5nID0gZm9udC5nZXRHbHlwaE1hcHBpbmcocHJvcGVydGllcyk7XG4gICAgICB2YXIgbmV3TWFwcGluZyA9IGFkanVzdE1hcHBpbmcoXG4gICAgICAgIG1hcHBpbmcsXG4gICAgICAgIGZvbnQuaGFzR2x5cGhJZC5iaW5kKGZvbnQpLFxuICAgICAgICBnbHlwaFplcm9JZFxuICAgICAgKTtcbiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG5ld01hcHBpbmcudG9Gb250Q2hhcjtcbiAgICAgIHZhciBudW1HbHlwaHMgPSBmb250Lm51bUdseXBocztcblxuICAgICAgZnVuY3Rpb24gZ2V0Q2hhckNvZGVzKGNoYXJDb2RlVG9HbHlwaElkLCBnbHlwaElkKSB7XG4gICAgICAgIHZhciBjaGFyQ29kZXMgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkge1xuICAgICAgICAgIGlmIChnbHlwaElkID09PSBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0pIHtcbiAgICAgICAgICAgIGlmICghY2hhckNvZGVzKSB7XG4gICAgICAgICAgICAgIGNoYXJDb2RlcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hhckNvZGVzLnB1c2goY2hhckNvZGUgfCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYXJDb2RlcztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHtcbiAgICAgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHtcbiAgICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkW1xuICAgICAgICAgIG5ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZVxuICAgICAgICBdID0gZ2x5cGhJZDtcbiAgICAgICAgcmV0dXJuIG5ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VhY3MgPSBmb250LnNlYWNzO1xuICAgICAgaWYgKFNFQUNfQU5BTFlTSVNfRU5BQkxFRCAmJiBzZWFjcyAmJiBzZWFjcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgICAgdmFyIGNoYXJzZXQgPSBmb250LmdldENoYXJzZXQoKTtcbiAgICAgICAgdmFyIHNlYWNNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKHZhciBnbHlwaElkIGluIHNlYWNzKSB7XG4gICAgICAgICAgZ2x5cGhJZCB8PSAwO1xuICAgICAgICAgIHZhciBzZWFjID0gc2VhY3NbZ2x5cGhJZF07XG4gICAgICAgICAgdmFyIGJhc2VHbHlwaE5hbWUgPSBTdGFuZGFyZEVuY29kaW5nW3NlYWNbMl1dO1xuICAgICAgICAgIHZhciBhY2NlbnRHbHlwaE5hbWUgPSBTdGFuZGFyZEVuY29kaW5nW3NlYWNbM11dO1xuICAgICAgICAgIHZhciBiYXNlR2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihiYXNlR2x5cGhOYW1lKTtcbiAgICAgICAgICB2YXIgYWNjZW50R2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihhY2NlbnRHbHlwaE5hbWUpO1xuICAgICAgICAgIGlmIChiYXNlR2x5cGhJZCA8IDAgfHwgYWNjZW50R2x5cGhJZCA8IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYWNjZW50T2Zmc2V0ID0ge1xuICAgICAgICAgICAgeDogc2VhY1swXSAqIG1hdHJpeFswXSArIHNlYWNbMV0gKiBtYXRyaXhbMl0gKyBtYXRyaXhbNF0sXG4gICAgICAgICAgICB5OiBzZWFjWzBdICogbWF0cml4WzFdICsgc2VhY1sxXSAqIG1hdHJpeFszXSArIG1hdHJpeFs1XSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdmFyIGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTtcbiAgICAgICAgICBpZiAoIWNoYXJDb2Rlcykge1xuICAgICAgICAgICAgLy8gVGhlcmUncyBubyBwb2ludCBpbiBtYXBwaW5nIGl0IGlmIHRoZSBjaGFyIGNvZGUgd2FzIG5ldmVyIG1hcHBlZFxuICAgICAgICAgICAgLy8gdG8gYmVnaW4gd2l0aC5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGFyQ29kZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gY2hhckNvZGVzW2ldO1xuICAgICAgICAgICAgLy8gRmluZCBhIGZvbnRDaGFyQ29kZSB0aGF0IG1hcHMgdG8gdGhlIGJhc2UgYW5kIGFjY2VudCBnbHlwaHMuXG4gICAgICAgICAgICAvLyBJZiBvbmUgZG9lc24ndCBleGlzdHMsIGNyZWF0ZSBpdC5cbiAgICAgICAgICAgIHZhciBjaGFyQ29kZVRvR2x5cGhJZCA9IG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQ7XG4gICAgICAgICAgICB2YXIgYmFzZUZvbnRDaGFyQ29kZSA9IGNyZWF0ZUNoYXJDb2RlKFxuICAgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZCxcbiAgICAgICAgICAgICAgYmFzZUdseXBoSWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgYWNjZW50Rm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoXG4gICAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkLFxuICAgICAgICAgICAgICBhY2NlbnRHbHlwaElkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2VhY01hcFtjaGFyQ29kZV0gPSB7XG4gICAgICAgICAgICAgIGJhc2VGb250Q2hhckNvZGUsXG4gICAgICAgICAgICAgIGFjY2VudEZvbnRDaGFyQ29kZSxcbiAgICAgICAgICAgICAgYWNjZW50T2Zmc2V0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvcGVydGllcy5zZWFjTWFwID0gc2VhY01hcDtcbiAgICAgIH1cblxuICAgICAgdmFyIHVuaXRzUGVyRW0gPSAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWClbMF07XG5cbiAgICAgIHZhciBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoXCJcXHg0RlxceDU0XFx4NTRcXHg0RlwiKTtcbiAgICAgIC8vIFBvc3RTY3JpcHQgRm9udCBQcm9ncmFtXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFwiQ0ZGIFwiLCBmb250LmRhdGEpO1xuICAgICAgLy8gT1MvMiBhbmQgV2luZG93cyBTcGVjaWZpYyBtZXRyaWNzXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFxuICAgICAgICBcIk9TLzJcIixcbiAgICAgICAgY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZClcbiAgICAgICk7XG4gICAgICAvLyBDaGFyYWN0ZXIgdG8gZ2x5cGhzIG1hcHBpbmdcbiAgICAgIGJ1aWxkZXIuYWRkVGFibGUoXG4gICAgICAgIFwiY21hcFwiLFxuICAgICAgICBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbnVtR2x5cGhzKVxuICAgICAgKTtcbiAgICAgIC8vIEZvbnQgaGVhZGVyXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFxuICAgICAgICBcImhlYWRcIixcbiAgICAgICAgXCJcXHgwMFxceDAxXFx4MDBcXHgwMFwiICsgLy8gVmVyc2lvbiBudW1iZXJcbiAgICAgICAgXCJcXHgwMFxceDAwXFx4MTBcXHgwMFwiICsgLy8gZm9udFJldmlzaW9uXG4gICAgICAgIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcIiArIC8vIGNoZWNrc3VtQWRqdXN0ZW1lbnRcbiAgICAgICAgXCJcXHg1RlxceDBGXFx4M0NcXHhGNVwiICsgLy8gbWFnaWNOdW1iZXJcbiAgICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyBGbGFnc1xuICAgICAgICBzYWZlU3RyaW5nMTYodW5pdHNQZXJFbSkgKyAvLyB1bml0c1BlckVNXG4gICAgICAgIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHg5ZVxceDBiXFx4N2VcXHgyN1wiICsgLy8gY3JlYXRpb24gZGF0ZVxuICAgICAgICBcIlxceDAwXFx4MDBcXHgwMFxceDAwXFx4OWVcXHgwYlxceDdlXFx4MjdcIiArIC8vIG1vZGlmaWZpY2F0aW9uIGRhdGVcbiAgICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyB4TWluXG4gICAgICAgIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmRlc2NlbnQpICsgLy8geU1pblxuICAgICAgICBcIlxceDBGXFx4RkZcIiArIC8vIHhNYXhcbiAgICAgICAgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuYXNjZW50KSArIC8vIHlNYXhcbiAgICAgICAgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDIgOiAwKSArIC8vIG1hY1N0eWxlXG4gICAgICAgIFwiXFx4MDBcXHgxMVwiICsgLy8gbG93ZXN0UmVjUFBFTVxuICAgICAgICBcIlxceDAwXFx4MDBcIiArIC8vIGZvbnREaXJlY3Rpb25IaW50XG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gaW5kZXhUb0xvY0Zvcm1hdFxuICAgICAgICAgIFwiXFx4MDBcXHgwMFwiXG4gICAgICApOyAvLyBnbHlwaERhdGFGb3JtYXRcblxuICAgICAgLy8gSG9yaXpvbnRhbCBoZWFkZXJcbiAgICAgIGJ1aWxkZXIuYWRkVGFibGUoXG4gICAgICAgIFwiaGhlYVwiLFxuICAgICAgICBcIlxceDAwXFx4MDFcXHgwMFxceDAwXCIgKyAvLyBWZXJzaW9uIG51bWJlclxuICAgICAgICBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgLy8gVHlwb2dyYXBoaWMgQXNjZW50XG4gICAgICAgIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmRlc2NlbnQpICsgLy8gVHlwb2dyYXBoaWMgRGVzY2VudFxuICAgICAgICBcIlxceDAwXFx4MDBcIiArIC8vIExpbmUgR2FwXG4gICAgICAgIFwiXFx4RkZcXHhGRlwiICsgLy8gYWR2YW5jZVdpZHRoTWF4XG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gbWluTGVmdFNpZGViZWFyaW5nXG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gbWluUmlnaHRTaWRlYmVhcmluZ1xuICAgICAgICBcIlxceDAwXFx4MDBcIiArIC8vIHhNYXhFeHRlbnRcbiAgICAgICAgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuY2FwSGVpZ2h0KSArIC8vIGNhcmV0U2xvcGVSaXNlXG4gICAgICAgIHNhZmVTdHJpbmcxNihNYXRoLnRhbihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlKSAqIHByb3BlcnRpZXMueEhlaWdodCkgKyAvLyBjYXJldFNsb3BlUnVuXG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gY2FyZXRPZmZzZXRcbiAgICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyAtcmVzZXJ2ZWQtXG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gLXJlc2VydmVkLVxuICAgICAgICBcIlxceDAwXFx4MDBcIiArIC8vIC1yZXNlcnZlZC1cbiAgICAgICAgXCJcXHgwMFxceDAwXCIgKyAvLyAtcmVzZXJ2ZWQtXG4gICAgICAgIFwiXFx4MDBcXHgwMFwiICsgLy8gbWV0cmljRGF0YUZvcm1hdFxuICAgICAgICAgIHN0cmluZzE2KG51bUdseXBocylcbiAgICAgICk7IC8vIE51bWJlciBvZiBITWV0cmljc1xuXG4gICAgICAvLyBIb3Jpem9udGFsIG1ldHJpY3NcbiAgICAgIGJ1aWxkZXIuYWRkVGFibGUoXG4gICAgICAgIFwiaG10eFwiLFxuICAgICAgICAoZnVuY3Rpb24gZm9udEZpZWxkc0htdHgoKSB7XG4gICAgICAgICAgdmFyIGNoYXJzdHJpbmdzID0gZm9udC5jaGFyc3RyaW5ncztcbiAgICAgICAgICB2YXIgY2ZmV2lkdGhzID0gZm9udC5jZmYgPyBmb250LmNmZi53aWR0aHMgOiBudWxsO1xuICAgICAgICAgIHZhciBobXR4ID0gXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiOyAvLyBGYWtlIC5ub3RkZWZcbiAgICAgICAgICBmb3IgKGxldCBpID0gMSwgaWkgPSBudW1HbHlwaHM7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSAwO1xuICAgICAgICAgICAgaWYgKGNoYXJzdHJpbmdzKSB7XG4gICAgICAgICAgICAgIHZhciBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbaSAtIDFdO1xuICAgICAgICAgICAgICB3aWR0aCA9IFwid2lkdGhcIiBpbiBjaGFyc3RyaW5nID8gY2hhcnN0cmluZy53aWR0aCA6IDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNmZldpZHRocykge1xuICAgICAgICAgICAgICB3aWR0aCA9IE1hdGguY2VpbChjZmZXaWR0aHNbaV0gfHwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBobXR4ICs9IHN0cmluZzE2KHdpZHRoKSArIHN0cmluZzE2KDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaG10eDtcbiAgICAgICAgfSkoKVxuICAgICAgKTtcblxuICAgICAgLy8gTWF4aW11bSBwcm9maWxlXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFxuICAgICAgICBcIm1heHBcIixcbiAgICAgICAgXCJcXHgwMFxceDAwXFx4NTBcXHgwMFwiICsgc3RyaW5nMTYobnVtR2x5cGhzKSAvLyBWZXJzaW9uIG51bWJlclxuICAgICAgKTsgLy8gTnVtIG9mIGdseXBoc1xuXG4gICAgICAvLyBOYW1pbmcgdGFibGVzXG4gICAgICBidWlsZGVyLmFkZFRhYmxlKFwibmFtZVwiLCBjcmVhdGVOYW1lVGFibGUoZm9udE5hbWUpKTtcblxuICAgICAgLy8gUG9zdFNjcmlwdCBpbmZvcm1hdGlvblxuICAgICAgYnVpbGRlci5hZGRUYWJsZShcInBvc3RcIiwgY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpKTtcblxuICAgICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpO1xuICAgIH0sXG5cbiAgICBnZXQgc3BhY2VXaWR0aCgpIHtcbiAgICAgIC8vIHRyeWluZyB0byBlc3RpbWF0ZSBzcGFjZSBjaGFyYWN0ZXIgd2lkdGhcbiAgICAgIHZhciBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzID0gW1wic3BhY2VcIiwgXCJtaW51c1wiLCBcIm9uZVwiLCBcImlcIiwgXCJJXCJdO1xuICAgICAgdmFyIHdpZHRoO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcG9zc2libGVTcGFjZVJlcGxhY2VtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHZhciBnbHlwaE5hbWUgPSBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzW2ldO1xuICAgICAgICAvLyBpZiBwb3NzaWJsZSwgZ2V0dGluZyB3aWR0aCBieSBnbHlwaCBuYW1lXG4gICAgICAgIGlmIChnbHlwaE5hbWUgaW4gdGhpcy53aWR0aHMpIHtcbiAgICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2dseXBoTmFtZV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7XG4gICAgICAgIHZhciBnbHlwaFVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV07XG4gICAgICAgIC8vIGZpbmRpbmcgdGhlIGNoYXJjb2RlIHZpYSB1bmljb2RlVG9DSUQgbWFwXG4gICAgICAgIHZhciBjaGFyY29kZSA9IDA7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvc2l0ZSAmJiB0aGlzLmNNYXAuY29udGFpbnMoZ2x5cGhVbmljb2RlKSkge1xuICAgICAgICAgIGNoYXJjb2RlID0gdGhpcy5jTWFwLmxvb2t1cChnbHlwaFVuaWNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIC4uLiB2aWEgdG9Vbmljb2RlIG1hcFxuICAgICAgICBpZiAoIWNoYXJjb2RlICYmIHRoaXMudG9Vbmljb2RlKSB7XG4gICAgICAgICAgY2hhcmNvZGUgPSB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGdseXBoVW5pY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0dGluZyBpdCB0byB1bmljb2RlIGlmIG5lZ2F0aXZlIG9yIHVuZGVmaW5lZFxuICAgICAgICBpZiAoY2hhcmNvZGUgPD0gMCkge1xuICAgICAgICAgIGNoYXJjb2RlID0gZ2x5cGhVbmljb2RlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRyeWluZyB0byBnZXQgd2lkdGggdmlhIGNoYXJjb2RlXG4gICAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbY2hhcmNvZGVdO1xuICAgICAgICBpZiAod2lkdGgpIHtcbiAgICAgICAgICBicmVhazsgLy8gdGhlIG5vbi16ZXJvIHdpZHRoIGZvdW5kXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdpZHRoID0gd2lkdGggfHwgdGhpcy5kZWZhdWx0V2lkdGg7XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwic3BhY2VXaWR0aFwiLCB3aWR0aCk7XG4gICAgfSxcblxuICAgIGNoYXJUb0dseXBoOiBmdW5jdGlvbiBGb250X2NoYXJUb0dseXBoKGNoYXJjb2RlLCBpc1NwYWNlKSB7XG4gICAgICB2YXIgZm9udENoYXJDb2RlLCB3aWR0aCwgb3BlcmF0b3JMaXN0SWQ7XG5cbiAgICAgIHZhciB3aWR0aENvZGUgPSBjaGFyY29kZTtcbiAgICAgIGlmICh0aGlzLmNNYXAgJiYgdGhpcy5jTWFwLmNvbnRhaW5zKGNoYXJjb2RlKSkge1xuICAgICAgICB3aWR0aENvZGUgPSB0aGlzLmNNYXAubG9va3VwKGNoYXJjb2RlKTtcbiAgICAgIH1cbiAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbd2lkdGhDb2RlXTtcbiAgICAgIHdpZHRoID0gaXNOdW0od2lkdGgpID8gd2lkdGggOiB0aGlzLmRlZmF1bHRXaWR0aDtcbiAgICAgIHZhciB2bWV0cmljID0gdGhpcy52bWV0cmljcyAmJiB0aGlzLnZtZXRyaWNzW3dpZHRoQ29kZV07XG5cbiAgICAgIGxldCB1bmljb2RlID1cbiAgICAgICAgdGhpcy50b1VuaWNvZGUuZ2V0KGNoYXJjb2RlKSB8fFxuICAgICAgICB0aGlzLmZhbGxiYWNrVG9Vbmljb2RlLmdldChjaGFyY29kZSkgfHxcbiAgICAgICAgY2hhcmNvZGU7XG4gICAgICBpZiAodHlwZW9mIHVuaWNvZGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgdW5pY29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc0luRm9udCA9IGNoYXJjb2RlIGluIHRoaXMudG9Gb250Q2hhcjtcbiAgICAgIC8vIEZpcnN0IHRyeSB0aGUgdG9Gb250Q2hhciBtYXAsIGlmIGl0J3Mgbm90IHRoZXJlIHRoZW4gdHJ5IGZhbGxpbmdcbiAgICAgIC8vIGJhY2sgdG8gdGhlIGNoYXIgY29kZS5cbiAgICAgIGZvbnRDaGFyQ29kZSA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gfHwgY2hhcmNvZGU7XG4gICAgICBpZiAodGhpcy5taXNzaW5nRmlsZSkge1xuICAgICAgICBjb25zdCBnbHlwaE5hbWUgPVxuICAgICAgICAgIHRoaXMuZGlmZmVyZW5jZXNbY2hhcmNvZGVdIHx8IHRoaXMuZGVmYXVsdEVuY29kaW5nW2NoYXJjb2RlXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChnbHlwaE5hbWUgPT09IFwiLm5vdGRlZlwiIHx8IGdseXBoTmFtZSA9PT0gXCJcIikgJiZcbiAgICAgICAgICB0aGlzLnR5cGUgPT09IFwiVHlwZTFcIlxuICAgICAgICApIHtcbiAgICAgICAgICAvLyAubm90ZGVmIGdseXBocyBzaG91bGQgYmUgaW52aXNpYmxlIGluIG5vbi1lbWJlZGRlZCBUeXBlMSBmb250cywgc29cbiAgICAgICAgICAvLyByZXBsYWNlIHRoZW0gd2l0aCBzcGFjZXMuXG4gICAgICAgICAgZm9udENoYXJDb2RlID0gMHgyMDtcbiAgICAgICAgfVxuICAgICAgICBmb250Q2hhckNvZGUgPSBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhmb250Q2hhckNvZGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1R5cGUzRm9udCkge1xuICAgICAgICAvLyBGb250IGNoYXIgY29kZSBpbiB0aGlzIGNhc2UgaXMgYWN0dWFsbHkgYSBnbHlwaCBuYW1lLlxuICAgICAgICBvcGVyYXRvckxpc3RJZCA9IGZvbnRDaGFyQ29kZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjY2VudCA9IG51bGw7XG4gICAgICBpZiAodGhpcy5zZWFjTWFwICYmIHRoaXMuc2VhY01hcFtjaGFyY29kZV0pIHtcbiAgICAgICAgaXNJbkZvbnQgPSB0cnVlO1xuICAgICAgICB2YXIgc2VhYyA9IHRoaXMuc2VhY01hcFtjaGFyY29kZV07XG4gICAgICAgIGZvbnRDaGFyQ29kZSA9IHNlYWMuYmFzZUZvbnRDaGFyQ29kZTtcbiAgICAgICAgYWNjZW50ID0ge1xuICAgICAgICAgIGZvbnRDaGFyOiBTdHJpbmcuZnJvbUNvZGVQb2ludChzZWFjLmFjY2VudEZvbnRDaGFyQ29kZSksXG4gICAgICAgICAgb2Zmc2V0OiBzZWFjLmFjY2VudE9mZnNldCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZvbnRDaGFyID0gXCJcIjtcbiAgICAgIGlmICh0eXBlb2YgZm9udENoYXJDb2RlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGlmIChmb250Q2hhckNvZGUgPD0gMHgxMGZmZmYpIHtcbiAgICAgICAgICBmb250Q2hhciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGZvbnRDaGFyQ29kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybihgY2hhclRvR2x5cGggLSBpbnZhbGlkIGZvbnRDaGFyQ29kZTogJHtmb250Q2hhckNvZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGdseXBoID0gdGhpcy5nbHlwaENhY2hlW2NoYXJjb2RlXTtcbiAgICAgIGlmIChcbiAgICAgICAgIWdseXBoIHx8XG4gICAgICAgICFnbHlwaC5tYXRjaGVzRm9yQ2FjaGUoXG4gICAgICAgICAgZm9udENoYXIsXG4gICAgICAgICAgdW5pY29kZSxcbiAgICAgICAgICBhY2NlbnQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgdm1ldHJpYyxcbiAgICAgICAgICBvcGVyYXRvckxpc3RJZCxcbiAgICAgICAgICBpc1NwYWNlLFxuICAgICAgICAgIGlzSW5Gb250XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBnbHlwaCA9IG5ldyBHbHlwaChcbiAgICAgICAgICBmb250Q2hhcixcbiAgICAgICAgICB1bmljb2RlLFxuICAgICAgICAgIGFjY2VudCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB2bWV0cmljLFxuICAgICAgICAgIG9wZXJhdG9yTGlzdElkLFxuICAgICAgICAgIGlzU3BhY2UsXG4gICAgICAgICAgaXNJbkZvbnRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5nbHlwaENhY2hlW2NoYXJjb2RlXSA9IGdseXBoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdseXBoO1xuICAgIH0sXG5cbiAgICBjaGFyc1RvR2x5cGhzOiBmdW5jdGlvbiBGb250X2NoYXJzVG9HbHlwaHMoY2hhcnMpIHtcbiAgICAgIHZhciBjaGFyc0NhY2hlID0gdGhpcy5jaGFyc0NhY2hlO1xuICAgICAgdmFyIGdseXBocywgZ2x5cGgsIGNoYXJjb2RlO1xuXG4gICAgICAvLyBpZiB3ZSB0cmFuc2xhdGVkIHRoaXMgc3RyaW5nIGJlZm9yZSwganVzdCBncmFiIGl0IGZyb20gdGhlIGNhY2hlXG4gICAgICBpZiAoY2hhcnNDYWNoZSkge1xuICAgICAgICBnbHlwaHMgPSBjaGFyc0NhY2hlW2NoYXJzXTtcbiAgICAgICAgaWYgKGdseXBocykge1xuICAgICAgICAgIHJldHVybiBnbHlwaHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbGF6aWx5IGNyZWF0ZSB0aGUgdHJhbnNsYXRpb24gY2FjaGVcbiAgICAgIGlmICghY2hhcnNDYWNoZSkge1xuICAgICAgICBjaGFyc0NhY2hlID0gdGhpcy5jaGFyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cblxuICAgICAgZ2x5cGhzID0gW107XG4gICAgICB2YXIgY2hhcnNDYWNoZUtleSA9IGNoYXJzO1xuICAgICAgdmFyIGkgPSAwLFxuICAgICAgICBpaTtcblxuICAgICAgaWYgKHRoaXMuY01hcCkge1xuICAgICAgICAvLyBjb21wb3NpdGUgZm9udHMgaGF2ZSBtdWx0aS1ieXRlIHN0cmluZ3MgY29udmVydCB0aGUgc3RyaW5nIGZyb21cbiAgICAgICAgLy8gc2luZ2xlLWJ5dGUgdG8gbXVsdGktYnl0ZVxuICAgICAgICB2YXIgYyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHdoaWxlIChpIDwgY2hhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5jTWFwLnJlYWRDaGFyQ29kZShjaGFycywgaSwgYyk7XG4gICAgICAgICAgY2hhcmNvZGUgPSBjLmNoYXJjb2RlO1xuICAgICAgICAgIHZhciBsZW5ndGggPSBjLmxlbmd0aDtcbiAgICAgICAgICBpICs9IGxlbmd0aDtcbiAgICAgICAgICAvLyBTcGFjZSBpcyBjaGFyIHdpdGggY29kZSAweDIwIGFuZCBsZW5ndGggMSBpbiBtdWx0aXBsZS1ieXRlIGNvZGVzLlxuICAgICAgICAgIHZhciBpc1NwYWNlID0gbGVuZ3RoID09PSAxICYmIGNoYXJzLmNoYXJDb2RlQXQoaSAtIDEpID09PSAweDIwO1xuICAgICAgICAgIGdseXBoID0gdGhpcy5jaGFyVG9HbHlwaChjaGFyY29kZSwgaXNTcGFjZSk7XG4gICAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICBjaGFyY29kZSA9IGNoYXJzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgZ2x5cGggPSB0aGlzLmNoYXJUb0dseXBoKGNoYXJjb2RlLCBjaGFyY29kZSA9PT0gMHgyMCk7XG4gICAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVudGVyIHRoZSB0cmFuc2xhdGVkIHN0cmluZyBpbnRvIHRoZSBjYWNoZVxuICAgICAgcmV0dXJuIChjaGFyc0NhY2hlW2NoYXJzQ2FjaGVLZXldID0gZ2x5cGhzKTtcbiAgICB9LFxuXG4gICAgZ2V0IGdseXBoQ2FjaGVWYWx1ZXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmdseXBoQ2FjaGUpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIEZvbnQ7XG59KSgpO1xuXG52YXIgRXJyb3JGb250ID0gKGZ1bmN0aW9uIEVycm9yRm9udENsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gRXJyb3JGb250KGVycm9yKSB7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgIHRoaXMubG9hZGVkTmFtZSA9IFwiZ19mb250X2Vycm9yXCI7XG4gICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7XG4gIH1cblxuICBFcnJvckZvbnQucHJvdG90eXBlID0ge1xuICAgIGNoYXJzVG9HbHlwaHM6IGZ1bmN0aW9uIEVycm9yRm9udF9jaGFyc1RvR2x5cGhzKCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgZXhwb3J0RGF0YShleHRyYVByb3BlcnRpZXMgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IHRoaXMuZXJyb3IgfTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBFcnJvckZvbnQ7XG59KSgpO1xuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgYnVpbGRpbmcgYSBjaGFyIGNvZGUgdG8gZ2x5cGggaWQgbWFwcGluZyBmb3IgVHlwZTEgYW5kXG4gKiBzaW1wbGUgQ0ZGIGZvbnRzLiBTZWUgc2VjdGlvbiA5LjYuNi4yIG9mIHRoZSBzcGVjLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgRm9udCBwcm9wZXJ0aWVzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBidWlsdEluRW5jb2RpbmcgVGhlIGVuY29kaW5nIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGFjdHVhbCBmb250XG4gKiBkYXRhLlxuICogQHBhcmFtIHtBcnJheX0gZ2x5cGhOYW1lcyBBcnJheSBvZiBnbHlwaCBuYW1lcyB3aGVyZSB0aGUgaW5kZXggaXMgdGhlXG4gKiBnbHlwaCBJRC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IEEgY2hhciBjb2RlIHRvIGdseXBoIElEIG1hcC5cbiAqL1xuZnVuY3Rpb24gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhOYW1lcykge1xuICB2YXIgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgZ2x5cGhJZCwgY2hhckNvZGUsIGJhc2VFbmNvZGluZztcbiAgdmFyIGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7XG5cbiAgaWYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSkge1xuICAgIC8vIElmIGEgdmFsaWQgYmFzZSBlbmNvZGluZyBuYW1lIHdhcyB1c2VkLCB0aGUgbWFwcGluZyBpcyBpbml0aWFsaXplZCB3aXRoXG4gICAgLy8gdGhhdC5cbiAgICBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpO1xuICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHtcbiAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoYmFzZUVuY29kaW5nW2NoYXJDb2RlXSk7XG4gICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7XG4gICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOyAvLyBub3RkZWZcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTeW1ib2xpY0ZvbnQpIHtcbiAgICAvLyBGb3IgYSBzeW1ib2xpYyBmb250IHRoZSBlbmNvZGluZyBzaG91bGQgYmUgdGhlIGZvbnRzIGJ1aWx0LWluIGVuY29kaW5nLlxuICAgIGZvciAoY2hhckNvZGUgaW4gYnVpbHRJbkVuY29kaW5nKSB7XG4gICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGb3Igbm9uLXN5bWJvbGljIGZvbnRzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJhc2UgZW5jb2RpbmcgdGhlIHN0YW5kYXJkXG4gICAgLy8gZW5jb2Rpbmcgc2hvdWxkIGJlIHVzZWQuXG4gICAgYmFzZUVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZztcbiAgICBmb3IgKGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCBiYXNlRW5jb2RpbmcubGVuZ3RoOyBjaGFyQ29kZSsrKSB7XG4gICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0pO1xuICAgICAgaWYgKGdseXBoSWQgPj0gMCkge1xuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gMDsgLy8gbm90ZGVmXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTGFzdGx5LCBtZXJnZSBpbiB0aGUgZGlmZmVyZW5jZXMuXG4gIHZhciBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXMsXG4gICAgZ2x5cGhzVW5pY29kZU1hcDtcbiAgaWYgKGRpZmZlcmVuY2VzKSB7XG4gICAgZm9yIChjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcykge1xuICAgICAgdmFyIGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJDb2RlXTtcbiAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoZ2x5cGhOYW1lKTtcblxuICAgICAgaWYgKGdseXBoSWQgPT09IC0xKSB7XG4gICAgICAgIGlmICghZ2x5cGhzVW5pY29kZU1hcCkge1xuICAgICAgICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YW5kYXJkR2x5cGhOYW1lID0gcmVjb3ZlckdseXBoTmFtZShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApO1xuICAgICAgICBpZiAoc3RhbmRhcmRHbHlwaE5hbWUgIT09IGdseXBoTmFtZSkge1xuICAgICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7XG4gICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOyAvLyBub3RkZWZcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkO1xufVxuXG4vLyBUeXBlMUZvbnQgaXMgYWxzbyBhIENJREZvbnRUeXBlMC5cbnZhciBUeXBlMUZvbnQgPSAoZnVuY3Rpb24gVHlwZTFGb250Q2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gZmluZEJsb2NrKHN0cmVhbUJ5dGVzLCBzaWduYXR1cmUsIHN0YXJ0SW5kZXgpIHtcbiAgICB2YXIgc3RyZWFtQnl0ZXNMZW5ndGggPSBzdHJlYW1CeXRlcy5sZW5ndGg7XG4gICAgdmFyIHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG4gICAgdmFyIHNjYW5MZW5ndGggPSBzdHJlYW1CeXRlc0xlbmd0aCAtIHNpZ25hdHVyZUxlbmd0aDtcblxuICAgIHZhciBpID0gc3RhcnRJbmRleCxcbiAgICAgIGosXG4gICAgICBmb3VuZCA9IGZhbHNlO1xuICAgIHdoaWxlIChpIDwgc2Nhbkxlbmd0aCkge1xuICAgICAgaiA9IDA7XG4gICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzdHJlYW1CeXRlc1tpICsgal0gPT09IHNpZ25hdHVyZVtqXSkge1xuICAgICAgICBqKys7XG4gICAgICB9XG4gICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHtcbiAgICAgICAgLy8gYHNpZ25hdHVyZWAgZm91bmQsIHNraXAgb3ZlciB3aGl0ZXNwYWNlLlxuICAgICAgICBpICs9IGo7XG4gICAgICAgIHdoaWxlIChpIDwgc3RyZWFtQnl0ZXNMZW5ndGggJiYgaXNXaGl0ZVNwYWNlKHN0cmVhbUJ5dGVzW2ldKSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZm91bmQsXG4gICAgICBsZW5ndGg6IGksXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEhlYWRlckJsb2NrKHN0cmVhbSwgc3VnZ2VzdGVkTGVuZ3RoKSB7XG4gICAgdmFyIEVFWEVDX1NJR05BVFVSRSA9IFsweDY1LCAweDY1LCAweDc4LCAweDY1LCAweDYzXTtcblxuICAgIHZhciBzdHJlYW1TdGFydFBvcyA9IHN0cmVhbS5wb3M7IC8vIFNhdmUgdGhlIGluaXRpYWwgc3RyZWFtIHBvc2l0aW9uLlxuICAgIHZhciBoZWFkZXJCeXRlcywgaGVhZGVyQnl0ZXNMZW5ndGgsIGJsb2NrO1xuICAgIHRyeSB7XG4gICAgICBoZWFkZXJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcyhzdWdnZXN0ZWRMZW5ndGgpO1xuICAgICAgaGVhZGVyQnl0ZXNMZW5ndGggPSBoZWFkZXJCeXRlcy5sZW5ndGg7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiB0aGUgYHN1Z2dlc3RlZExlbmd0aGAgaXMgaHVnZSBlbm91Z2ggdGhhdCBhIFVpbnQ4QXJyYXlcbiAgICAgIC8vIGNhbm5vdCBob2xkIHRoZSByZXN1bHQgb2YgYGdldEJ5dGVzYCwgYW5kIGZhbGxiYWNrIHRvIHNpbXBseSBjaGVja2luZ1xuICAgICAgLy8gdGhlIGVudGlyZSBzdHJlYW0gKGZpeGVzIGlzc3VlMzkyOC5wZGYpLlxuICAgIH1cblxuICAgIGlmIChoZWFkZXJCeXRlc0xlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7XG4gICAgICAvLyBNb3N0IG9mIHRoZSB0aW1lIGBzdWdnZXN0ZWRMZW5ndGhgIGlzIGNvcnJlY3QsIHNvIHRvIHNwZWVkIHRoaW5ncyB1cCB3ZVxuICAgICAgLy8gaW5pdGlhbGx5IG9ubHkgY2hlY2sgdGhlIGxhc3QgZmV3IGJ5dGVzIHRvIHNlZSBpZiB0aGUgaGVhZGVyIHdhcyBmb3VuZC5cbiAgICAgIC8vIE90aGVyd2lzZSB3ZSAocG90ZW50aWFsbHkpIGNoZWNrIHRoZSBlbnRpcmUgc3RyZWFtIHRvIHByZXZlbnQgZXJyb3JzIGluXG4gICAgICAvLyBgVHlwZTFQYXJzZXJgIChmaXhlcyBpc3N1ZTU2ODYucGRmKS5cbiAgICAgIGJsb2NrID0gZmluZEJsb2NrKFxuICAgICAgICBoZWFkZXJCeXRlcyxcbiAgICAgICAgRUVYRUNfU0lHTkFUVVJFLFxuICAgICAgICBzdWdnZXN0ZWRMZW5ndGggLSAyICogRUVYRUNfU0lHTkFUVVJFLmxlbmd0aFxuICAgICAgKTtcblxuICAgICAgaWYgKGJsb2NrLmZvdW5kICYmIGJsb2NrLmxlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RyZWFtOiBuZXcgU3RyZWFtKGhlYWRlckJ5dGVzKSxcbiAgICAgICAgICBsZW5ndGg6IHN1Z2dlc3RlZExlbmd0aCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2FybignSW52YWxpZCBcIkxlbmd0aDFcIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHRyeWluZyB0byByZWNvdmVyLicpO1xuICAgIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsgLy8gUmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbi5cblxuICAgIHZhciBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7XG4gICAgdmFyIGFjdHVhbExlbmd0aDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpO1xuICAgICAgYmxvY2sgPSBmaW5kQmxvY2soc2NhbkJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIDApO1xuXG4gICAgICBpZiAoYmxvY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RyZWFtLnBvcyArPSBibG9jay5sZW5ndGg7IC8vIFVwZGF0ZSB0aGUgc3RyZWFtIHBvc2l0aW9uLlxuXG4gICAgICBpZiAoYmxvY2suZm91bmQpIHtcbiAgICAgICAgYWN0dWFsTGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0cmVhbVN0YXJ0UG9zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXJ0UG9zOyAvLyBSZXNldCB0aGUgc3RyZWFtIHBvc2l0aW9uLlxuXG4gICAgaWYgKGFjdHVhbExlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyZWFtOiBuZXcgU3RyZWFtKHN0cmVhbS5nZXRCeXRlcyhhY3R1YWxMZW5ndGgpKSxcbiAgICAgICAgbGVuZ3RoOiBhY3R1YWxMZW5ndGgsXG4gICAgICB9O1xuICAgIH1cbiAgICB3YXJuKCdVbmFibGUgdG8gcmVjb3ZlciBcIkxlbmd0aDFcIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHVzaW5nIGFzIGlzLicpO1xuICAgIHJldHVybiB7XG4gICAgICBzdHJlYW06IG5ldyBTdHJlYW0oc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCkpLFxuICAgICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVleGVjQmxvY2soc3RyZWFtLCBzdWdnZXN0ZWRMZW5ndGgpIHtcbiAgICAvLyBXZSBzaG91bGQgaWRlYWxseSBwYXJzZSB0aGUgZWV4ZWMgYmxvY2sgdG8gZW5zdXJlIHRoYXQgYHN1Z2dlc3RlZExlbmd0aGBcbiAgICAvLyBpcyBjb3JyZWN0LCBzbyB3ZSBkb24ndCB0cnVuY2F0ZSB0aGUgYmxvY2sgZGF0YSBpZiBpdCdzIHRvbyBzbWFsbC5cbiAgICAvLyBIb3dldmVyLCB0aGlzIHdvdWxkIGFsc28gcmVxdWlyZSBjaGVja2luZyBpZiB0aGUgZml4ZWQtY29udGVudCBwb3J0aW9uXG4gICAgLy8gZXhpc3RzICh1c2luZyB0aGUgJ0xlbmd0aDMnIHByb3BlcnR5KSwgYW5kIGVuc3VyaW5nIHRoYXQgaXQncyB2YWxpZC5cbiAgICAvL1xuICAgIC8vIEdpdmVuIHRoYXQgYHN1Z2dlc3RlZExlbmd0aGAgYWxtb3N0IGFsd2F5cyBpcyBjb3JyZWN0LCBhbGwgdGhlIHZhbGlkYXRpb25cbiAgICAvLyB3b3VsZCByZXF1aXJlIGEgZ3JlYXQgZGVhbCBvZiB1bm5lY2Vzc2FyeSBwYXJzaW5nIGZvciBtb3N0IGZvbnRzLlxuICAgIC8vIFRvIHNhdmUgdGltZSwgd2UgYWx3YXlzIGZldGNoIHRoZSBlbnRpcmUgc3RyZWFtIGluc3RlYWQsIHdoaWNoIGFsc28gYXZvaWRcbiAgICAvLyBpc3N1ZXMgaWYgYHN1Z2dlc3RlZExlbmd0aGAgaXMgaHVnZSAoc2VlIGNvbW1lbnQgaW4gYGdldEhlYWRlckJsb2NrYCkuXG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbiBpbmNsdWRlIHRoZSBmaXhlZC1jb250ZW50IHBvcnRpb25cbiAgICAvLyBpbiB0aGUgcmV0dXJuZWQgZWV4ZWMgYmxvY2suIEluIHByYWN0aWNlIHRoaXMgZG9lcyAqbm90KiBzZWVtIHRvIG1hdHRlcixcbiAgICAvLyBzaW5jZSBgVHlwZTFQYXJzZXJfZXh0cmFjdEZvbnRQcm9ncmFtYCB3aWxsIHNraXAgb3ZlciBhbnkgbm9uLWNvbW1hbmRzLlxuICAgIHZhciBlZXhlY0J5dGVzID0gc3RyZWFtLmdldEJ5dGVzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbTogbmV3IFN0cmVhbShlZXhlY0J5dGVzKSxcbiAgICAgIGxlbmd0aDogZWV4ZWNCeXRlcy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gVHlwZTFGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpIHtcbiAgICAvLyBTb21lIGJhZCBnZW5lcmF0b3JzIGVtYmVkIHBmYiBmaWxlIGFzIGlzLCB3ZSBoYXZlIHRvIHN0cmlwIDYtYnl0ZSBoZWFkZXIuXG4gICAgLy8gQWxzbywgbGVuZ3RoMSBhbmQgbGVuZ3RoMiBtaWdodCBiZSBvZmYgYnkgNiBieXRlcyBhcyB3ZWxsLlxuICAgIC8vIGh0dHA6Ly93d3cubWF0aC51YmMuY2EvfmNhc3MvcGlzY3JpcHQvdHlwZTEucGRmXG4gICAgdmFyIFBGQl9IRUFERVJfU0laRSA9IDY7XG4gICAgdmFyIGhlYWRlckJsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgxO1xuICAgIHZhciBlZXhlY0Jsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgyO1xuICAgIHZhciBwZmJIZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyhQRkJfSEVBREVSX1NJWkUpO1xuICAgIHZhciBwZmJIZWFkZXJQcmVzZW50ID0gcGZiSGVhZGVyWzBdID09PSAweDgwICYmIHBmYkhlYWRlclsxXSA9PT0gMHgwMTtcbiAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkge1xuICAgICAgZmlsZS5za2lwKFBGQl9IRUFERVJfU0laRSk7XG4gICAgICBoZWFkZXJCbG9ja0xlbmd0aCA9XG4gICAgICAgIChwZmJIZWFkZXJbNV0gPDwgMjQpIHxcbiAgICAgICAgKHBmYkhlYWRlcls0XSA8PCAxNikgfFxuICAgICAgICAocGZiSGVhZGVyWzNdIDw8IDgpIHxcbiAgICAgICAgcGZiSGVhZGVyWzJdO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGF0YSBibG9jayBjb250YWluaW5nIGdseXBocyBhbmQgc3VicnMgaW5mb3JtYXRpb25cbiAgICB2YXIgaGVhZGVyQmxvY2sgPSBnZXRIZWFkZXJCbG9jayhmaWxlLCBoZWFkZXJCbG9ja0xlbmd0aCk7XG4gICAgdmFyIGhlYWRlckJsb2NrUGFyc2VyID0gbmV3IFR5cGUxUGFyc2VyKFxuICAgICAgaGVhZGVyQmxvY2suc3RyZWFtLFxuICAgICAgZmFsc2UsXG4gICAgICBTRUFDX0FOQUxZU0lTX0VOQUJMRURcbiAgICApO1xuICAgIGhlYWRlckJsb2NrUGFyc2VyLmV4dHJhY3RGb250SGVhZGVyKHByb3BlcnRpZXMpO1xuXG4gICAgaWYgKHBmYkhlYWRlclByZXNlbnQpIHtcbiAgICAgIHBmYkhlYWRlciA9IGZpbGUuZ2V0Qnl0ZXMoUEZCX0hFQURFUl9TSVpFKTtcbiAgICAgIGVleGVjQmxvY2tMZW5ndGggPVxuICAgICAgICAocGZiSGVhZGVyWzVdIDw8IDI0KSB8XG4gICAgICAgIChwZmJIZWFkZXJbNF0gPDwgMTYpIHxcbiAgICAgICAgKHBmYkhlYWRlclszXSA8PCA4KSB8XG4gICAgICAgIHBmYkhlYWRlclsyXTtcbiAgICB9XG5cbiAgICAvLyBEZWNyeXB0IHRoZSBkYXRhIGJsb2NrcyBhbmQgcmV0cmlldmUgaXQncyBjb250ZW50XG4gICAgdmFyIGVleGVjQmxvY2sgPSBnZXRFZXhlY0Jsb2NrKGZpbGUsIGVleGVjQmxvY2tMZW5ndGgpO1xuICAgIHZhciBlZXhlY0Jsb2NrUGFyc2VyID0gbmV3IFR5cGUxUGFyc2VyKFxuICAgICAgZWV4ZWNCbG9jay5zdHJlYW0sXG4gICAgICB0cnVlLFxuICAgICAgU0VBQ19BTkFMWVNJU19FTkFCTEVEXG4gICAgKTtcbiAgICB2YXIgZGF0YSA9IGVleGVjQmxvY2tQYXJzZXIuZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEucHJvcGVydGllcykge1xuICAgICAgcHJvcGVydGllc1trZXldID0gZGF0YS5wcm9wZXJ0aWVzW2tleV07XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzdHJpbmdzID0gZGF0YS5jaGFyc3RyaW5ncztcbiAgICB2YXIgdHlwZTJDaGFyc3RyaW5ncyA9IHRoaXMuZ2V0VHlwZTJDaGFyc3RyaW5ncyhjaGFyc3RyaW5ncyk7XG4gICAgdmFyIHN1YnJzID0gdGhpcy5nZXRUeXBlMlN1YnJzKGRhdGEuc3VicnMpO1xuXG4gICAgdGhpcy5jaGFyc3RyaW5ncyA9IGNoYXJzdHJpbmdzO1xuICAgIHRoaXMuZGF0YSA9IHRoaXMud3JhcChcbiAgICAgIG5hbWUsXG4gICAgICB0eXBlMkNoYXJzdHJpbmdzLFxuICAgICAgdGhpcy5jaGFyc3RyaW5ncyxcbiAgICAgIHN1YnJzLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gICAgdGhpcy5zZWFjcyA9IHRoaXMuZ2V0U2VhY3MoZGF0YS5jaGFyc3RyaW5ncyk7XG4gIH1cblxuICBUeXBlMUZvbnQucHJvdG90eXBlID0ge1xuICAgIGdldCBudW1HbHlwaHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggKyAxO1xuICAgIH0sXG5cbiAgICBnZXRDaGFyc2V0OiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0Q2hhcnNldCgpIHtcbiAgICAgIHZhciBjaGFyc2V0ID0gW1wiLm5vdGRlZlwiXTtcbiAgICAgIHZhciBjaGFyc3RyaW5ncyA9IHRoaXMuY2hhcnN0cmluZ3M7XG4gICAgICBmb3IgKHZhciBnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7XG4gICAgICAgIGNoYXJzZXQucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoYXJzZXQ7XG4gICAgfSxcblxuICAgIGdldEdseXBoTWFwcGluZzogZnVuY3Rpb24gVHlwZTFGb250X2dldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzO1xuXG4gICAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBNYXAgQ0lEcyBkaXJlY3RseSB0byBHSURzLlxuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBnbHlwaElkID0gMCwgY2hhcnN0cmluZ3NMZW4gPSBjaGFyc3RyaW5ncy5sZW5ndGg7XG4gICAgICAgICAgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzTGVuO1xuICAgICAgICAgIGdseXBoSWQrK1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGdseXBoSWQpO1xuICAgICAgICAgIC8vIEFkZCAxIGJlY2F1c2UgZ2x5cGggMCBpcyBkdXBsaWNhdGVkLlxuICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGdseXBoTmFtZXMgPSBbXCIubm90ZGVmXCJdLFxuICAgICAgICBnbHlwaElkO1xuICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7XG4gICAgICAgIGdseXBoTmFtZXMucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpO1xuICAgICAgfVxuICAgICAgdmFyIGVuY29kaW5nID0gcHJvcGVydGllcy5idWlsdEluRW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcpIHtcbiAgICAgICAgdmFyIGJ1aWx0SW5FbmNvZGluZyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIGVuY29kaW5nKSB7XG4gICAgICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihlbmNvZGluZ1tjaGFyQ29kZV0pO1xuICAgICAgICAgIGlmIChnbHlwaElkID49IDApIHtcbiAgICAgICAgICAgIGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV0gPSBnbHlwaElkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhOYW1lcyk7XG4gICAgfSxcblxuICAgIGhhc0dseXBoSWQ6IGZ1bmN0aW9uIFR5cGUxRm9udF9oYXNHbHlwaElEKGlkKSB7XG4gICAgICBpZiAoaWQgPCAwIHx8IGlkID49IHRoaXMubnVtR2x5cGhzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpZCA9PT0gMCkge1xuICAgICAgICAvLyBub3RkZWYgaXMgYWx3YXlzIGRlZmluZWQuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdseXBoID0gdGhpcy5jaGFyc3RyaW5nc1tpZCAtIDFdO1xuICAgICAgcmV0dXJuIGdseXBoLmNoYXJzdHJpbmcubGVuZ3RoID4gMDtcbiAgICB9LFxuXG4gICAgZ2V0U2VhY3M6IGZ1bmN0aW9uIFR5cGUxRm9udF9nZXRTZWFjcyhjaGFyc3RyaW5ncykge1xuICAgICAgdmFyIGksIGlpO1xuICAgICAgdmFyIHNlYWNNYXAgPSBbXTtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gY2hhcnN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICB2YXIgY2hhcnN0cmluZyA9IGNoYXJzdHJpbmdzW2ldO1xuICAgICAgICBpZiAoY2hhcnN0cmluZy5zZWFjKSB7XG4gICAgICAgICAgLy8gT2Zmc2V0IGJ5IDEgZm9yIC5ub3RkZWZcbiAgICAgICAgICBzZWFjTWFwW2kgKyAxXSA9IGNoYXJzdHJpbmcuc2VhYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNlYWNNYXA7XG4gICAgfSxcblxuICAgIGdldFR5cGUyQ2hhcnN0cmluZ3M6IGZ1bmN0aW9uIFR5cGUxRm9udF9nZXRUeXBlMkNoYXJzdHJpbmdzKFxuICAgICAgdHlwZTFDaGFyc3RyaW5nc1xuICAgICkge1xuICAgICAgdmFyIHR5cGUyQ2hhcnN0cmluZ3MgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHR5cGUxQ2hhcnN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICB0eXBlMkNoYXJzdHJpbmdzLnB1c2godHlwZTFDaGFyc3RyaW5nc1tpXS5jaGFyc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlMkNoYXJzdHJpbmdzO1xuICAgIH0sXG5cbiAgICBnZXRUeXBlMlN1YnJzOiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0VHlwZTJTdWJycyh0eXBlMVN1YnJzKSB7XG4gICAgICB2YXIgYmlhcyA9IDA7XG4gICAgICB2YXIgY291bnQgPSB0eXBlMVN1YnJzLmxlbmd0aDtcbiAgICAgIGlmIChjb3VudCA8IDExMzMpIHtcbiAgICAgICAgYmlhcyA9IDEwNztcbiAgICAgIH0gZWxzZSBpZiAoY291bnQgPCAzMzc2OSkge1xuICAgICAgICBiaWFzID0gMTEzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpYXMgPSAzMjc2ODtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGEgYnVuY2ggb2YgZW1wdHkgc3VicnMgdG8gZGVhbCB3aXRoIHRoZSBUeXBlMiBiaWFzXG4gICAgICB2YXIgdHlwZTJTdWJycyA9IFtdO1xuICAgICAgdmFyIGk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYmlhczsgaSsrKSB7XG4gICAgICAgIHR5cGUyU3VicnMucHVzaChbMHgwYl0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICB0eXBlMlN1YnJzLnB1c2godHlwZTFTdWJyc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlMlN1YnJzO1xuICAgIH0sXG5cbiAgICB3cmFwOiBmdW5jdGlvbiBUeXBlMUZvbnRfd3JhcChcbiAgICAgIG5hbWUsXG4gICAgICBnbHlwaHMsXG4gICAgICBjaGFyc3RyaW5ncyxcbiAgICAgIHN1YnJzLFxuICAgICAgcHJvcGVydGllc1xuICAgICkge1xuICAgICAgdmFyIGNmZiA9IG5ldyBDRkYoKTtcbiAgICAgIGNmZi5oZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKDEsIDAsIDQsIDQpO1xuXG4gICAgICBjZmYubmFtZXMgPSBbbmFtZV07XG5cbiAgICAgIHZhciB0b3BEaWN0ID0gbmV3IENGRlRvcERpY3QoKTtcbiAgICAgIC8vIENGRiBzdHJpbmdzIElEcyAwLi4uMzkwIGFyZSBwcmVkZWZpbmVkIG5hbWVzLCBzbyByZWZlcmluZ1xuICAgICAgLy8gdG8gZW50cmllcyBpbiBvdXIgb3duIFN0cmluZyBJTkRFWCBzdGFydHMgYXQgU0lEIDM5MS5cbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwidmVyc2lvblwiLCAzOTEpO1xuICAgICAgdG9wRGljdC5zZXRCeU5hbWUoXCJOb3RpY2VcIiwgMzkyKTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiRnVsbE5hbWVcIiwgMzkzKTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiRmFtaWx5TmFtZVwiLCAzOTQpO1xuICAgICAgdG9wRGljdC5zZXRCeU5hbWUoXCJXZWlnaHRcIiwgMzk1KTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiRW5jb2RpbmdcIiwgbnVsbCk7IC8vIHBsYWNlaG9sZGVyXG4gICAgICB0b3BEaWN0LnNldEJ5TmFtZShcIkZvbnRNYXRyaXhcIiwgcHJvcGVydGllcy5mb250TWF0cml4KTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiRm9udEJCb3hcIiwgcHJvcGVydGllcy5iYm94KTtcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiY2hhcnNldFwiLCBudWxsKTsgLy8gcGxhY2Vob2xkZXJcbiAgICAgIHRvcERpY3Quc2V0QnlOYW1lKFwiQ2hhclN0cmluZ3NcIiwgbnVsbCk7IC8vIHBsYWNlaG9sZGVyXG4gICAgICB0b3BEaWN0LnNldEJ5TmFtZShcIlByaXZhdGVcIiwgbnVsbCk7IC8vIHBsYWNlaG9sZGVyXG4gICAgICBjZmYudG9wRGljdCA9IHRvcERpY3Q7XG5cbiAgICAgIHZhciBzdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTtcbiAgICAgIHN0cmluZ3MuYWRkKFwiVmVyc2lvbiAwLjExXCIpOyAvLyBWZXJzaW9uXG4gICAgICBzdHJpbmdzLmFkZChcIlNlZSBvcmlnaW5hbCBub3RpY2VcIik7IC8vIE5vdGljZVxuICAgICAgc3RyaW5ncy5hZGQobmFtZSk7IC8vIEZ1bGxOYW1lXG4gICAgICBzdHJpbmdzLmFkZChuYW1lKTsgLy8gRmFtaWx5TmFtZVxuICAgICAgc3RyaW5ncy5hZGQoXCJNZWRpdW1cIik7IC8vIFdlaWdodFxuICAgICAgY2ZmLnN0cmluZ3MgPSBzdHJpbmdzO1xuXG4gICAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7XG5cbiAgICAgIHZhciBjb3VudCA9IGdseXBocy5sZW5ndGg7XG4gICAgICB2YXIgY2hhcnNldEFycmF5ID0gW1wiLm5vdGRlZlwiXTtcbiAgICAgIHZhciBpLCBpaTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGNoYXJzdHJpbmdzW2ldLmdseXBoTmFtZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihnbHlwaE5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgc3RyaW5ncy5hZGQoZ2x5cGhOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjaGFyc2V0QXJyYXkucHVzaChnbHlwaE5hbWUpO1xuICAgICAgfVxuICAgICAgY2ZmLmNoYXJzZXQgPSBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgMCwgY2hhcnNldEFycmF5KTtcblxuICAgICAgdmFyIGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTtcbiAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKFsweDhiLCAweDBlXSk7IC8vIC5ub3RkZWZcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoc1tpXSk7XG4gICAgICB9XG4gICAgICBjZmYuY2hhclN0cmluZ3MgPSBjaGFyU3RyaW5nc0luZGV4O1xuXG4gICAgICB2YXIgcHJpdmF0ZURpY3QgPSBuZXcgQ0ZGUHJpdmF0ZURpY3QoKTtcbiAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZShcIlN1YnJzXCIsIG51bGwpOyAvLyBwbGFjZWhvbGRlclxuICAgICAgdmFyIGZpZWxkcyA9IFtcbiAgICAgICAgXCJCbHVlVmFsdWVzXCIsXG4gICAgICAgIFwiT3RoZXJCbHVlc1wiLFxuICAgICAgICBcIkZhbWlseUJsdWVzXCIsXG4gICAgICAgIFwiRmFtaWx5T3RoZXJCbHVlc1wiLFxuICAgICAgICBcIlN0ZW1TbmFwSFwiLFxuICAgICAgICBcIlN0ZW1TbmFwVlwiLFxuICAgICAgICBcIkJsdWVTaGlmdFwiLFxuICAgICAgICBcIkJsdWVGdXp6XCIsXG4gICAgICAgIFwiQmx1ZVNjYWxlXCIsXG4gICAgICAgIFwiTGFuZ3VhZ2VHcm91cFwiLFxuICAgICAgICBcIkV4cGFuc2lvbkZhY3RvclwiLFxuICAgICAgICBcIkZvcmNlQm9sZFwiLFxuICAgICAgICBcIlN0ZEhXXCIsXG4gICAgICAgIFwiU3RkVldcIixcbiAgICAgIF07XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZWxkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgaWYgKCEoZmllbGQgaW4gcHJvcGVydGllcy5wcml2YXRlRGF0YSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2ZpZWxkXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgLy8gQWxsIG9mIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgYXJyYXkgZGF0YSBpbiBDRkYgbXVzdCBiZSBzdG9yZWQgYXNcbiAgICAgICAgICAvLyBcImRlbHRhLWVuY29kZWRcIiBudW1iZXJzLlxuICAgICAgICAgIGZvciAodmFyIGogPSB2YWx1ZS5sZW5ndGggLSAxOyBqID4gMDsgai0tKSB7XG4gICAgICAgICAgICB2YWx1ZVtqXSAtPSB2YWx1ZVtqIC0gMV07IC8vIC4uLiBkaWZmZXJlbmNlIGZyb20gcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJpdmF0ZURpY3Quc2V0QnlOYW1lKGZpZWxkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0O1xuXG4gICAgICB2YXIgc3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IHN1YnJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgc3VickluZGV4LmFkZChzdWJyc1tpXSk7XG4gICAgICB9XG4gICAgICBwcml2YXRlRGljdC5zdWJyc0luZGV4ID0gc3VickluZGV4O1xuXG4gICAgICB2YXIgY29tcGlsZXIgPSBuZXcgQ0ZGQ29tcGlsZXIoY2ZmKTtcbiAgICAgIHJldHVybiBjb21waWxlci5jb21waWxlKCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gVHlwZTFGb250O1xufSkoKTtcblxudmFyIENGRkZvbnQgPSAoZnVuY3Rpb24gQ0ZGRm9udENsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQ0ZGRm9udChmaWxlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblxuICAgIHZhciBwYXJzZXIgPSBuZXcgQ0ZGUGFyc2VyKGZpbGUsIHByb3BlcnRpZXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7XG4gICAgdGhpcy5jZmYgPSBwYXJzZXIucGFyc2UoKTtcbiAgICB0aGlzLmNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7XG4gICAgdmFyIGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKHRoaXMuY2ZmKTtcbiAgICB0aGlzLnNlYWNzID0gdGhpcy5jZmYuc2VhY3M7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZGF0YSA9IGNvbXBpbGVyLmNvbXBpbGUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB3YXJuKFwiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCBcIiArIHByb3BlcnRpZXMubG9hZGVkTmFtZSk7XG4gICAgICAvLyBUaGVyZSBtYXkgaGF2ZSBqdXN0IGJlZW4gYW4gaXNzdWUgd2l0aCB0aGUgY29tcGlsZXIsIHNldCB0aGUgZGF0YVxuICAgICAgLy8gYW55d2F5IGFuZCBob3BlIHRoZSBmb250IGxvYWRlZC5cbiAgICAgIHRoaXMuZGF0YSA9IGZpbGU7XG4gICAgfVxuICB9XG5cbiAgQ0ZGRm9udC5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IG51bUdseXBocygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNmZi5jaGFyU3RyaW5ncy5jb3VudDtcbiAgICB9LFxuICAgIGdldENoYXJzZXQ6IGZ1bmN0aW9uIENGRkZvbnRfZ2V0Q2hhcnNldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNmZi5jaGFyc2V0LmNoYXJzZXQ7XG4gICAgfSxcbiAgICBnZXRHbHlwaE1hcHBpbmc6IGZ1bmN0aW9uIENGRkZvbnRfZ2V0R2x5cGhNYXBwaW5nKCkge1xuICAgICAgdmFyIGNmZiA9IHRoaXMuY2ZmO1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7XG4gICAgICB2YXIgY2hhcnNldHMgPSBjZmYuY2hhcnNldC5jaGFyc2V0O1xuICAgICAgdmFyIGNoYXJDb2RlVG9HbHlwaElkO1xuICAgICAgdmFyIGdseXBoSWQ7XG5cbiAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkge1xuICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBjaGFyQ29kZTtcbiAgICAgICAgaWYgKGNmZi5pc0NJREZvbnQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZm9udCBpcyBhY3R1YWxseSBhIENJRCBmb250IHRoZW4gd2Ugc2hvdWxkIHVzZSB0aGUgY2hhcnNldFxuICAgICAgICAgIC8vIHRvIG1hcCBDSURzIHRvIEdJRHMuXG4gICAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzZXRzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7XG4gICAgICAgICAgICB2YXIgY2lkID0gY2hhcnNldHNbZ2x5cGhJZF07XG4gICAgICAgICAgICBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGNpZCk7XG4gICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBpdCBpcyBOT1QgYWN0dWFsbHkgYSBDSUQgZm9udCB0aGVuIENJRHMgc2hvdWxkIGJlIG1hcHBlZFxuICAgICAgICAgIC8vIGRpcmVjdGx5IHRvIEdJRHMuXG4gICAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNmZi5jaGFyU3RyaW5ncy5jb3VudDsgZ2x5cGhJZCsrKSB7XG4gICAgICAgICAgICBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGdseXBoSWQpO1xuICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW5jb2RpbmcgPSBjZmYuZW5jb2RpbmcgPyBjZmYuZW5jb2RpbmcuZW5jb2RpbmcgOiBudWxsO1xuICAgICAgY2hhckNvZGVUb0dseXBoSWQgPSB0eXBlMUZvbnRHbHlwaE1hcHBpbmcocHJvcGVydGllcywgZW5jb2RpbmcsIGNoYXJzZXRzKTtcbiAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDtcbiAgICB9LFxuICAgIGhhc0dseXBoSWQ6IGZ1bmN0aW9uIENGRkZvbnRfaGFzR2x5cGhJRChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2ZmLmhhc0dseXBoSWQoaWQpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIENGRkZvbnQ7XG59KSgpO1xuXG5leHBvcnQge1xuICBTRUFDX0FOQUxZU0lTX0VOQUJMRUQsXG4gIEVycm9yRm9udCxcbiAgRm9udCxcbiAgRm9udEZsYWdzLFxuICBUb1VuaWNvZGVNYXAsXG4gIElkZW50aXR5VG9Vbmljb2RlTWFwLFxuICBnZXRGb250VHlwZSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYnl0ZXNUb1N0cmluZyxcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIHNoYWRvdyxcbiAgc3RyaW5nVG9CeXRlcyxcbiAgVXRpbCxcbiAgd2Fybixcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQge1xuICBFeHBlcnRDaGFyc2V0LFxuICBFeHBlcnRTdWJzZXRDaGFyc2V0LFxuICBJU09BZG9iZUNoYXJzZXQsXG59IGZyb20gXCIuL2NoYXJzZXRzLmpzXCI7XG5pbXBvcnQgeyBFeHBlcnRFbmNvZGluZywgU3RhbmRhcmRFbmNvZGluZyB9IGZyb20gXCIuL2VuY29kaW5ncy5qc1wiO1xuXG4vLyBNYXhpbXVtIHN1YnJvdXRpbmUgY2FsbCBkZXB0aCBvZiB0eXBlIDIgY2hhcnRyaW5ncy4gTWF0Y2hlcyBPVFMuXG52YXIgTUFYX1NVQlJfTkVTVElORyA9IDEwO1xuXG4vKipcbiAqIFRoZSBDRkYgY2xhc3MgdGFrZXMgYSBUeXBlMSBmaWxlIGFuZCB3cmFwIGl0IGludG8gYVxuICogJ0NvbXBhY3QgRm9udCBGb3JtYXQnIHdoaWNoIGl0c2VsZiBlbWJlZCBUeXBlMiBjaGFyc3RyaW5ncy5cbiAqL1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgQ0ZGU3RhbmRhcmRTdHJpbmdzID0gW1xuICBcIi5ub3RkZWZcIiwgXCJzcGFjZVwiLCBcImV4Y2xhbVwiLCBcInF1b3RlZGJsXCIsIFwibnVtYmVyc2lnblwiLCBcImRvbGxhclwiLCBcInBlcmNlbnRcIixcbiAgXCJhbXBlcnNhbmRcIiwgXCJxdW90ZXJpZ2h0XCIsIFwicGFyZW5sZWZ0XCIsIFwicGFyZW5yaWdodFwiLCBcImFzdGVyaXNrXCIsIFwicGx1c1wiLFxuICBcImNvbW1hXCIsIFwiaHlwaGVuXCIsIFwicGVyaW9kXCIsIFwic2xhc2hcIiwgXCJ6ZXJvXCIsIFwib25lXCIsIFwidHdvXCIsIFwidGhyZWVcIiwgXCJmb3VyXCIsXG4gIFwiZml2ZVwiLCBcInNpeFwiLCBcInNldmVuXCIsIFwiZWlnaHRcIiwgXCJuaW5lXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIiwgXCJsZXNzXCIsXG4gIFwiZXF1YWxcIiwgXCJncmVhdGVyXCIsIFwicXVlc3Rpb25cIiwgXCJhdFwiLCBcIkFcIiwgXCJCXCIsIFwiQ1wiLCBcIkRcIiwgXCJFXCIsIFwiRlwiLCBcIkdcIiwgXCJIXCIsXG4gIFwiSVwiLCBcIkpcIiwgXCJLXCIsIFwiTFwiLCBcIk1cIiwgXCJOXCIsIFwiT1wiLCBcIlBcIiwgXCJRXCIsIFwiUlwiLCBcIlNcIiwgXCJUXCIsIFwiVVwiLCBcIlZcIiwgXCJXXCIsXG4gIFwiWFwiLCBcIllcIiwgXCJaXCIsIFwiYnJhY2tldGxlZnRcIiwgXCJiYWNrc2xhc2hcIiwgXCJicmFja2V0cmlnaHRcIiwgXCJhc2NpaWNpcmN1bVwiLFxuICBcInVuZGVyc2NvcmVcIiwgXCJxdW90ZWxlZnRcIiwgXCJhXCIsIFwiYlwiLCBcImNcIiwgXCJkXCIsIFwiZVwiLCBcImZcIiwgXCJnXCIsIFwiaFwiLCBcImlcIiwgXCJqXCIsXG4gIFwia1wiLCBcImxcIiwgXCJtXCIsIFwiblwiLCBcIm9cIiwgXCJwXCIsIFwicVwiLCBcInJcIiwgXCJzXCIsIFwidFwiLCBcInVcIiwgXCJ2XCIsIFwid1wiLCBcInhcIiwgXCJ5XCIsXG4gIFwielwiLCBcImJyYWNlbGVmdFwiLCBcImJhclwiLCBcImJyYWNlcmlnaHRcIiwgXCJhc2NpaXRpbGRlXCIsIFwiZXhjbGFtZG93blwiLCBcImNlbnRcIixcbiAgXCJzdGVybGluZ1wiLCBcImZyYWN0aW9uXCIsIFwieWVuXCIsIFwiZmxvcmluXCIsIFwic2VjdGlvblwiLCBcImN1cnJlbmN5XCIsXG4gIFwicXVvdGVzaW5nbGVcIiwgXCJxdW90ZWRibGxlZnRcIiwgXCJndWlsbGVtb3RsZWZ0XCIsIFwiZ3VpbHNpbmdsbGVmdFwiLFxuICBcImd1aWxzaW5nbHJpZ2h0XCIsIFwiZmlcIiwgXCJmbFwiLCBcImVuZGFzaFwiLCBcImRhZ2dlclwiLCBcImRhZ2dlcmRibFwiLFxuICBcInBlcmlvZGNlbnRlcmVkXCIsIFwicGFyYWdyYXBoXCIsIFwiYnVsbGV0XCIsIFwicXVvdGVzaW5nbGJhc2VcIiwgXCJxdW90ZWRibGJhc2VcIixcbiAgXCJxdW90ZWRibHJpZ2h0XCIsIFwiZ3VpbGxlbW90cmlnaHRcIiwgXCJlbGxpcHNpc1wiLCBcInBlcnRob3VzYW5kXCIsIFwicXVlc3Rpb25kb3duXCIsXG4gIFwiZ3JhdmVcIiwgXCJhY3V0ZVwiLCBcImNpcmN1bWZsZXhcIiwgXCJ0aWxkZVwiLCBcIm1hY3JvblwiLCBcImJyZXZlXCIsIFwiZG90YWNjZW50XCIsXG4gIFwiZGllcmVzaXNcIiwgXCJyaW5nXCIsIFwiY2VkaWxsYVwiLCBcImh1bmdhcnVtbGF1dFwiLCBcIm9nb25la1wiLCBcImNhcm9uXCIsIFwiZW1kYXNoXCIsXG4gIFwiQUVcIiwgXCJvcmRmZW1pbmluZVwiLCBcIkxzbGFzaFwiLCBcIk9zbGFzaFwiLCBcIk9FXCIsIFwib3JkbWFzY3VsaW5lXCIsIFwiYWVcIixcbiAgXCJkb3RsZXNzaVwiLCBcImxzbGFzaFwiLCBcIm9zbGFzaFwiLCBcIm9lXCIsIFwiZ2VybWFuZGJsc1wiLCBcIm9uZXN1cGVyaW9yXCIsXG4gIFwibG9naWNhbG5vdFwiLCBcIm11XCIsIFwidHJhZGVtYXJrXCIsIFwiRXRoXCIsIFwib25laGFsZlwiLCBcInBsdXNtaW51c1wiLCBcIlRob3JuXCIsXG4gIFwib25lcXVhcnRlclwiLCBcImRpdmlkZVwiLCBcImJyb2tlbmJhclwiLCBcImRlZ3JlZVwiLCBcInRob3JuXCIsIFwidGhyZWVxdWFydGVyc1wiLFxuICBcInR3b3N1cGVyaW9yXCIsIFwicmVnaXN0ZXJlZFwiLCBcIm1pbnVzXCIsIFwiZXRoXCIsIFwibXVsdGlwbHlcIiwgXCJ0aHJlZXN1cGVyaW9yXCIsXG4gIFwiY29weXJpZ2h0XCIsIFwiQWFjdXRlXCIsIFwiQWNpcmN1bWZsZXhcIiwgXCJBZGllcmVzaXNcIiwgXCJBZ3JhdmVcIiwgXCJBcmluZ1wiLFxuICBcIkF0aWxkZVwiLCBcIkNjZWRpbGxhXCIsIFwiRWFjdXRlXCIsIFwiRWNpcmN1bWZsZXhcIiwgXCJFZGllcmVzaXNcIiwgXCJFZ3JhdmVcIixcbiAgXCJJYWN1dGVcIiwgXCJJY2lyY3VtZmxleFwiLCBcIklkaWVyZXNpc1wiLCBcIklncmF2ZVwiLCBcIk50aWxkZVwiLCBcIk9hY3V0ZVwiLFxuICBcIk9jaXJjdW1mbGV4XCIsIFwiT2RpZXJlc2lzXCIsIFwiT2dyYXZlXCIsIFwiT3RpbGRlXCIsIFwiU2Nhcm9uXCIsIFwiVWFjdXRlXCIsXG4gIFwiVWNpcmN1bWZsZXhcIiwgXCJVZGllcmVzaXNcIiwgXCJVZ3JhdmVcIiwgXCJZYWN1dGVcIiwgXCJZZGllcmVzaXNcIiwgXCJaY2Fyb25cIixcbiAgXCJhYWN1dGVcIiwgXCJhY2lyY3VtZmxleFwiLCBcImFkaWVyZXNpc1wiLCBcImFncmF2ZVwiLCBcImFyaW5nXCIsIFwiYXRpbGRlXCIsXG4gIFwiY2NlZGlsbGFcIiwgXCJlYWN1dGVcIiwgXCJlY2lyY3VtZmxleFwiLCBcImVkaWVyZXNpc1wiLCBcImVncmF2ZVwiLCBcImlhY3V0ZVwiLFxuICBcImljaXJjdW1mbGV4XCIsIFwiaWRpZXJlc2lzXCIsIFwiaWdyYXZlXCIsIFwibnRpbGRlXCIsIFwib2FjdXRlXCIsIFwib2NpcmN1bWZsZXhcIixcbiAgXCJvZGllcmVzaXNcIiwgXCJvZ3JhdmVcIiwgXCJvdGlsZGVcIiwgXCJzY2Fyb25cIiwgXCJ1YWN1dGVcIiwgXCJ1Y2lyY3VtZmxleFwiLFxuICBcInVkaWVyZXNpc1wiLCBcInVncmF2ZVwiLCBcInlhY3V0ZVwiLCBcInlkaWVyZXNpc1wiLCBcInpjYXJvblwiLCBcImV4Y2xhbXNtYWxsXCIsXG4gIFwiSHVuZ2FydW1sYXV0c21hbGxcIiwgXCJkb2xsYXJvbGRzdHlsZVwiLCBcImRvbGxhcnN1cGVyaW9yXCIsIFwiYW1wZXJzYW5kc21hbGxcIixcbiAgXCJBY3V0ZXNtYWxsXCIsIFwicGFyZW5sZWZ0c3VwZXJpb3JcIiwgXCJwYXJlbnJpZ2h0c3VwZXJpb3JcIiwgXCJ0d29kb3RlbmxlYWRlclwiLFxuICBcIm9uZWRvdGVubGVhZGVyXCIsIFwiemVyb29sZHN0eWxlXCIsIFwib25lb2xkc3R5bGVcIiwgXCJ0d29vbGRzdHlsZVwiLFxuICBcInRocmVlb2xkc3R5bGVcIiwgXCJmb3Vyb2xkc3R5bGVcIiwgXCJmaXZlb2xkc3R5bGVcIiwgXCJzaXhvbGRzdHlsZVwiLFxuICBcInNldmVub2xkc3R5bGVcIiwgXCJlaWdodG9sZHN0eWxlXCIsIFwibmluZW9sZHN0eWxlXCIsIFwiY29tbWFzdXBlcmlvclwiLFxuICBcInRocmVlcXVhcnRlcnNlbWRhc2hcIiwgXCJwZXJpb2RzdXBlcmlvclwiLCBcInF1ZXN0aW9uc21hbGxcIiwgXCJhc3VwZXJpb3JcIixcbiAgXCJic3VwZXJpb3JcIiwgXCJjZW50c3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIiwgXCJlc3VwZXJpb3JcIiwgXCJpc3VwZXJpb3JcIixcbiAgXCJsc3VwZXJpb3JcIiwgXCJtc3VwZXJpb3JcIiwgXCJuc3VwZXJpb3JcIiwgXCJvc3VwZXJpb3JcIiwgXCJyc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIixcbiAgXCJ0c3VwZXJpb3JcIiwgXCJmZlwiLCBcImZmaVwiLCBcImZmbFwiLCBcInBhcmVubGVmdGluZmVyaW9yXCIsIFwicGFyZW5yaWdodGluZmVyaW9yXCIsXG4gIFwiQ2lyY3VtZmxleHNtYWxsXCIsIFwiaHlwaGVuc3VwZXJpb3JcIiwgXCJHcmF2ZXNtYWxsXCIsIFwiQXNtYWxsXCIsIFwiQnNtYWxsXCIsXG4gIFwiQ3NtYWxsXCIsIFwiRHNtYWxsXCIsIFwiRXNtYWxsXCIsIFwiRnNtYWxsXCIsIFwiR3NtYWxsXCIsIFwiSHNtYWxsXCIsIFwiSXNtYWxsXCIsXG4gIFwiSnNtYWxsXCIsIFwiS3NtYWxsXCIsIFwiTHNtYWxsXCIsIFwiTXNtYWxsXCIsIFwiTnNtYWxsXCIsIFwiT3NtYWxsXCIsIFwiUHNtYWxsXCIsXG4gIFwiUXNtYWxsXCIsIFwiUnNtYWxsXCIsIFwiU3NtYWxsXCIsIFwiVHNtYWxsXCIsIFwiVXNtYWxsXCIsIFwiVnNtYWxsXCIsIFwiV3NtYWxsXCIsXG4gIFwiWHNtYWxsXCIsIFwiWXNtYWxsXCIsIFwiWnNtYWxsXCIsIFwiY29sb25tb25ldGFyeVwiLCBcIm9uZWZpdHRlZFwiLCBcInJ1cGlhaFwiLFxuICBcIlRpbGRlc21hbGxcIiwgXCJleGNsYW1kb3duc21hbGxcIiwgXCJjZW50b2xkc3R5bGVcIiwgXCJMc2xhc2hzbWFsbFwiLFxuICBcIlNjYXJvbnNtYWxsXCIsIFwiWmNhcm9uc21hbGxcIiwgXCJEaWVyZXNpc3NtYWxsXCIsIFwiQnJldmVzbWFsbFwiLCBcIkNhcm9uc21hbGxcIixcbiAgXCJEb3RhY2NlbnRzbWFsbFwiLCBcIk1hY3JvbnNtYWxsXCIsIFwiZmlndXJlZGFzaFwiLCBcImh5cGhlbmluZmVyaW9yXCIsXG4gIFwiT2dvbmVrc21hbGxcIiwgXCJSaW5nc21hbGxcIiwgXCJDZWRpbGxhc21hbGxcIiwgXCJxdWVzdGlvbmRvd25zbWFsbFwiLCBcIm9uZWVpZ2h0aFwiLFxuICBcInRocmVlZWlnaHRoc1wiLCBcImZpdmVlaWdodGhzXCIsIFwic2V2ZW5laWdodGhzXCIsIFwib25ldGhpcmRcIiwgXCJ0d290aGlyZHNcIixcbiAgXCJ6ZXJvc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIiwgXCJzaXhzdXBlcmlvclwiLFxuICBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsIFwibmluZXN1cGVyaW9yXCIsIFwiemVyb2luZmVyaW9yXCIsXG4gIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLCBcInRocmVlaW5mZXJpb3JcIiwgXCJmb3VyaW5mZXJpb3JcIixcbiAgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIiwgXCJlaWdodGluZmVyaW9yXCIsXG4gIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsIFwiZG9sbGFyaW5mZXJpb3JcIiwgXCJwZXJpb2RpbmZlcmlvclwiLFxuICBcImNvbW1haW5mZXJpb3JcIiwgXCJBZ3JhdmVzbWFsbFwiLCBcIkFhY3V0ZXNtYWxsXCIsIFwiQWNpcmN1bWZsZXhzbWFsbFwiLFxuICBcIkF0aWxkZXNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIiwgXCJBcmluZ3NtYWxsXCIsIFwiQUVzbWFsbFwiLCBcIkNjZWRpbGxhc21hbGxcIixcbiAgXCJFZ3JhdmVzbWFsbFwiLCBcIkVhY3V0ZXNtYWxsXCIsIFwiRWNpcmN1bWZsZXhzbWFsbFwiLCBcIkVkaWVyZXNpc3NtYWxsXCIsXG4gIFwiSWdyYXZlc21hbGxcIiwgXCJJYWN1dGVzbWFsbFwiLCBcIkljaXJjdW1mbGV4c21hbGxcIiwgXCJJZGllcmVzaXNzbWFsbFwiLFxuICBcIkV0aHNtYWxsXCIsIFwiTnRpbGRlc21hbGxcIiwgXCJPZ3JhdmVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsIFwiT2NpcmN1bWZsZXhzbWFsbFwiLFxuICBcIk90aWxkZXNtYWxsXCIsIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPRXNtYWxsXCIsIFwiT3NsYXNoc21hbGxcIiwgXCJVZ3JhdmVzbWFsbFwiLFxuICBcIlVhY3V0ZXNtYWxsXCIsIFwiVWNpcmN1bWZsZXhzbWFsbFwiLCBcIlVkaWVyZXNpc3NtYWxsXCIsIFwiWWFjdXRlc21hbGxcIixcbiAgXCJUaG9ybnNtYWxsXCIsIFwiWWRpZXJlc2lzc21hbGxcIiwgXCIwMDEuMDAwXCIsIFwiMDAxLjAwMVwiLCBcIjAwMS4wMDJcIiwgXCIwMDEuMDAzXCIsXG4gIFwiQmxhY2tcIiwgXCJCb2xkXCIsIFwiQm9va1wiLCBcIkxpZ2h0XCIsIFwiTWVkaXVtXCIsIFwiUmVndWxhclwiLCBcIlJvbWFuXCIsIFwiU2VtaWJvbGRcIlxuXTtcblxuY29uc3QgTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTID0gMzkxO1xuXG52YXIgQ0ZGUGFyc2VyID0gKGZ1bmN0aW9uIENGRlBhcnNlckNsb3N1cmUoKSB7XG4gIHZhciBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGEgPSBbXG4gICAgbnVsbCxcbiAgICB7IGlkOiBcImhzdGVtXCIsIG1pbjogMiwgc3RhY2tDbGVhcmluZzogdHJ1ZSwgc3RlbTogdHJ1ZSB9LFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJ2c3RlbVwiLCBtaW46IDIsIHN0YWNrQ2xlYXJpbmc6IHRydWUsIHN0ZW06IHRydWUgfSxcbiAgICB7IGlkOiBcInZtb3ZldG9cIiwgbWluOiAxLCBzdGFja0NsZWFyaW5nOiB0cnVlIH0sXG4gICAgeyBpZDogXCJybGluZXRvXCIsIG1pbjogMiwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiaGxpbmV0b1wiLCBtaW46IDEsIHJlc2V0U3RhY2s6IHRydWUgfSxcbiAgICB7IGlkOiBcInZsaW5ldG9cIiwgbWluOiAxLCByZXNldFN0YWNrOiB0cnVlIH0sXG4gICAgeyBpZDogXCJycmN1cnZldG9cIiwgbWluOiA2LCByZXNldFN0YWNrOiB0cnVlIH0sXG4gICAgbnVsbCxcbiAgICB7IGlkOiBcImNhbGxzdWJyXCIsIG1pbjogMSwgdW5kZWZTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwicmV0dXJuXCIsIG1pbjogMCwgdW5kZWZTdGFjazogdHJ1ZSB9LFxuICAgIG51bGwsIC8vIDEyXG4gICAgbnVsbCxcbiAgICB7IGlkOiBcImVuZGNoYXJcIiwgbWluOiAwLCBzdGFja0NsZWFyaW5nOiB0cnVlIH0sXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJoc3RlbWhtXCIsIG1pbjogMiwgc3RhY2tDbGVhcmluZzogdHJ1ZSwgc3RlbTogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiaGludG1hc2tcIiwgbWluOiAwLCBzdGFja0NsZWFyaW5nOiB0cnVlIH0sXG4gICAgeyBpZDogXCJjbnRybWFza1wiLCBtaW46IDAsIHN0YWNrQ2xlYXJpbmc6IHRydWUgfSxcbiAgICB7IGlkOiBcInJtb3ZldG9cIiwgbWluOiAyLCBzdGFja0NsZWFyaW5nOiB0cnVlIH0sXG4gICAgeyBpZDogXCJobW92ZXRvXCIsIG1pbjogMSwgc3RhY2tDbGVhcmluZzogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwidnN0ZW1obVwiLCBtaW46IDIsIHN0YWNrQ2xlYXJpbmc6IHRydWUsIHN0ZW06IHRydWUgfSxcbiAgICB7IGlkOiBcInJjdXJ2ZWxpbmVcIiwgbWluOiA4LCByZXNldFN0YWNrOiB0cnVlIH0sXG4gICAgeyBpZDogXCJybGluZWN1cnZlXCIsIG1pbjogOCwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwidnZjdXJ2ZXRvXCIsIG1pbjogNCwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiaGhjdXJ2ZXRvXCIsIG1pbjogNCwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIG51bGwsIC8vIHNob3J0aW50XG4gICAgeyBpZDogXCJjYWxsZ3N1YnJcIiwgbWluOiAxLCB1bmRlZlN0YWNrOiB0cnVlIH0sXG4gICAgeyBpZDogXCJ2aGN1cnZldG9cIiwgbWluOiA0LCByZXNldFN0YWNrOiB0cnVlIH0sXG4gICAgeyBpZDogXCJodmN1cnZldG9cIiwgbWluOiA0LCByZXNldFN0YWNrOiB0cnVlIH0sXG4gIF07XG4gIHZhciBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGExMiA9IFtcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICB7IGlkOiBcImFuZFwiLCBtaW46IDIsIHN0YWNrRGVsdGE6IC0xIH0sXG4gICAgeyBpZDogXCJvclwiLCBtaW46IDIsIHN0YWNrRGVsdGE6IC0xIH0sXG4gICAgeyBpZDogXCJub3RcIiwgbWluOiAxLCBzdGFja0RlbHRhOiAwIH0sXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJhYnNcIiwgbWluOiAxLCBzdGFja0RlbHRhOiAwIH0sXG4gICAge1xuICAgICAgaWQ6IFwiYWRkXCIsXG4gICAgICBtaW46IDIsXG4gICAgICBzdGFja0RlbHRhOiAtMSxcbiAgICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHtcbiAgICAgICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKyBzdGFja1tpbmRleCAtIDFdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBcInN1YlwiLFxuICAgICAgbWluOiAyLFxuICAgICAgc3RhY2tEZWx0YTogLTEsXG4gICAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7XG4gICAgICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdIC0gc3RhY2tbaW5kZXggLSAxXTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogXCJkaXZcIixcbiAgICAgIG1pbjogMixcbiAgICAgIHN0YWNrRGVsdGE6IC0xLFxuICAgICAgc3RhY2tGbjogZnVuY3Rpb24gc3RhY2tfZGl2KHN0YWNrLCBpbmRleCkge1xuICAgICAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAvIHN0YWNrW2luZGV4IC0gMV07XG4gICAgICB9LFxuICAgIH0sXG4gICAgbnVsbCxcbiAgICB7XG4gICAgICBpZDogXCJuZWdcIixcbiAgICAgIG1pbjogMSxcbiAgICAgIHN0YWNrRGVsdGE6IDAsXG4gICAgICBzdGFja0ZuOiBmdW5jdGlvbiBzdGFja19kaXYoc3RhY2ssIGluZGV4KSB7XG4gICAgICAgIHN0YWNrW2luZGV4IC0gMV0gPSAtc3RhY2tbaW5kZXggLSAxXTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiBcImVxXCIsIG1pbjogMiwgc3RhY2tEZWx0YTogLTEgfSxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJkcm9wXCIsIG1pbjogMSwgc3RhY2tEZWx0YTogLTEgfSxcbiAgICBudWxsLFxuICAgIHsgaWQ6IFwicHV0XCIsIG1pbjogMiwgc3RhY2tEZWx0YTogLTIgfSxcbiAgICB7IGlkOiBcImdldFwiLCBtaW46IDEsIHN0YWNrRGVsdGE6IDAgfSxcbiAgICB7IGlkOiBcImlmZWxzZVwiLCBtaW46IDQsIHN0YWNrRGVsdGE6IC0zIH0sXG4gICAgeyBpZDogXCJyYW5kb21cIiwgbWluOiAwLCBzdGFja0RlbHRhOiAxIH0sXG4gICAge1xuICAgICAgaWQ6IFwibXVsXCIsXG4gICAgICBtaW46IDIsXG4gICAgICBzdGFja0RlbHRhOiAtMSxcbiAgICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHtcbiAgICAgICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKiBzdGFja1tpbmRleCAtIDFdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJzcXJ0XCIsIG1pbjogMSwgc3RhY2tEZWx0YTogMCB9LFxuICAgIHsgaWQ6IFwiZHVwXCIsIG1pbjogMSwgc3RhY2tEZWx0YTogMSB9LFxuICAgIHsgaWQ6IFwiZXhjaFwiLCBtaW46IDIsIHN0YWNrRGVsdGE6IDAgfSxcbiAgICB7IGlkOiBcImluZGV4XCIsIG1pbjogMiwgc3RhY2tEZWx0YTogMCB9LFxuICAgIHsgaWQ6IFwicm9sbFwiLCBtaW46IDMsIHN0YWNrRGVsdGE6IC0yIH0sXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgeyBpZDogXCJoZmxleFwiLCBtaW46IDcsIHJlc2V0U3RhY2s6IHRydWUgfSxcbiAgICB7IGlkOiBcImZsZXhcIiwgbWluOiAxMywgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiaGZsZXgxXCIsIG1pbjogOSwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICAgIHsgaWQ6IFwiZmxleDFcIiwgbWluOiAxMSwgcmVzZXRTdGFjazogdHJ1ZSB9LFxuICBdO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgQ0ZGUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihmaWxlLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7XG4gICAgICB0aGlzLmJ5dGVzID0gZmlsZS5nZXRCeXRlcygpO1xuICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDtcbiAgICB9XG5cbiAgICBwYXJzZSgpIHtcbiAgICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgdmFyIGNmZiA9IG5ldyBDRkYoKTtcbiAgICAgIHRoaXMuY2ZmID0gY2ZmO1xuXG4gICAgICAvLyBUaGUgZmlyc3QgZml2ZSBzZWN0aW9ucyBtdXN0IGJlIGluIG9yZGVyLCBhbGwgdGhlIG90aGVycyBhcmUgcmVhY2hlZFxuICAgICAgLy8gdmlhIG9mZnNldHMgY29udGFpbmVkIGluIG9uZSBvZiB0aGUgYmVsb3cuXG4gICAgICB2YXIgaGVhZGVyID0gdGhpcy5wYXJzZUhlYWRlcigpO1xuICAgICAgdmFyIG5hbWVJbmRleCA9IHRoaXMucGFyc2VJbmRleChoZWFkZXIuZW5kUG9zKTtcbiAgICAgIHZhciB0b3BEaWN0SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgobmFtZUluZGV4LmVuZFBvcyk7XG4gICAgICB2YXIgc3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdEluZGV4LmVuZFBvcyk7XG4gICAgICB2YXIgZ2xvYmFsU3VickluZGV4ID0gdGhpcy5wYXJzZUluZGV4KHN0cmluZ0luZGV4LmVuZFBvcyk7XG5cbiAgICAgIHZhciB0b3BEaWN0UGFyc2VkID0gdGhpcy5wYXJzZURpY3QodG9wRGljdEluZGV4Lm9iai5nZXQoMCkpO1xuICAgICAgdmFyIHRvcERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdG9wRGljdFBhcnNlZCwgY2ZmLnN0cmluZ3MpO1xuXG4gICAgICBjZmYuaGVhZGVyID0gaGVhZGVyLm9iajtcbiAgICAgIGNmZi5uYW1lcyA9IHRoaXMucGFyc2VOYW1lSW5kZXgobmFtZUluZGV4Lm9iaik7XG4gICAgICBjZmYuc3RyaW5ncyA9IHRoaXMucGFyc2VTdHJpbmdJbmRleChzdHJpbmdJbmRleC5vYmopO1xuICAgICAgY2ZmLnRvcERpY3QgPSB0b3BEaWN0O1xuICAgICAgY2ZmLmdsb2JhbFN1YnJJbmRleCA9IGdsb2JhbFN1YnJJbmRleC5vYmo7XG5cbiAgICAgIHRoaXMucGFyc2VQcml2YXRlRGljdChjZmYudG9wRGljdCk7XG5cbiAgICAgIGNmZi5pc0NJREZvbnQgPSB0b3BEaWN0Lmhhc05hbWUoXCJST1NcIik7XG5cbiAgICAgIHZhciBjaGFyU3RyaW5nT2Zmc2V0ID0gdG9wRGljdC5nZXRCeU5hbWUoXCJDaGFyU3RyaW5nc1wiKTtcbiAgICAgIHZhciBjaGFyU3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoY2hhclN0cmluZ09mZnNldCkub2JqO1xuXG4gICAgICB2YXIgZm9udE1hdHJpeCA9IHRvcERpY3QuZ2V0QnlOYW1lKFwiRm9udE1hdHJpeFwiKTtcbiAgICAgIGlmIChmb250TWF0cml4KSB7XG4gICAgICAgIHByb3BlcnRpZXMuZm9udE1hdHJpeCA9IGZvbnRNYXRyaXg7XG4gICAgICB9XG5cbiAgICAgIHZhciBmb250QkJveCA9IHRvcERpY3QuZ2V0QnlOYW1lKFwiRm9udEJCb3hcIik7XG4gICAgICBpZiAoZm9udEJCb3gpIHtcbiAgICAgICAgLy8gYWRqdXN0aW5nIGFzY2VudC9kZXNjZW50XG4gICAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTtcbiAgICAgICAgcHJvcGVydGllcy5kZXNjZW50ID0gTWF0aC5taW4oZm9udEJCb3hbMV0sIGZvbnRCQm94WzNdKTtcbiAgICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hhcnNldCwgZW5jb2Rpbmc7XG4gICAgICBpZiAoY2ZmLmlzQ0lERm9udCkge1xuICAgICAgICB2YXIgZmRBcnJheUluZGV4ID0gdGhpcy5wYXJzZUluZGV4KHRvcERpY3QuZ2V0QnlOYW1lKFwiRkRBcnJheVwiKSkub2JqO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmZEFycmF5SW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgdmFyIGRpY3RSYXcgPSBmZEFycmF5SW5kZXguZ2V0KGkpO1xuICAgICAgICAgIHZhciBmb250RGljdCA9IHRoaXMuY3JlYXRlRGljdChcbiAgICAgICAgICAgIENGRlRvcERpY3QsXG4gICAgICAgICAgICB0aGlzLnBhcnNlRGljdChkaWN0UmF3KSxcbiAgICAgICAgICAgIGNmZi5zdHJpbmdzXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnBhcnNlUHJpdmF0ZURpY3QoZm9udERpY3QpO1xuICAgICAgICAgIGNmZi5mZEFycmF5LnB1c2goZm9udERpY3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNpZCBmb250cyBkb24ndCBoYXZlIGFuIGVuY29kaW5nXG4gICAgICAgIGVuY29kaW5nID0gbnVsbDtcbiAgICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyhcbiAgICAgICAgICB0b3BEaWN0LmdldEJ5TmFtZShcImNoYXJzZXRcIiksXG4gICAgICAgICAgY2hhclN0cmluZ0luZGV4LmNvdW50LFxuICAgICAgICAgIGNmZi5zdHJpbmdzLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgY2ZmLmZkU2VsZWN0ID0gdGhpcy5wYXJzZUZEU2VsZWN0KFxuICAgICAgICAgIHRvcERpY3QuZ2V0QnlOYW1lKFwiRkRTZWxlY3RcIiksXG4gICAgICAgICAgY2hhclN0cmluZ0luZGV4LmNvdW50XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFyc2V0ID0gdGhpcy5wYXJzZUNoYXJzZXRzKFxuICAgICAgICAgIHRvcERpY3QuZ2V0QnlOYW1lKFwiY2hhcnNldFwiKSxcbiAgICAgICAgICBjaGFyU3RyaW5nSW5kZXguY291bnQsXG4gICAgICAgICAgY2ZmLnN0cmluZ3MsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgICAgZW5jb2RpbmcgPSB0aGlzLnBhcnNlRW5jb2RpbmcoXG4gICAgICAgICAgdG9wRGljdC5nZXRCeU5hbWUoXCJFbmNvZGluZ1wiKSxcbiAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgIGNmZi5zdHJpbmdzLFxuICAgICAgICAgIGNoYXJzZXQuY2hhcnNldFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjZmYuY2hhcnNldCA9IGNoYXJzZXQ7XG4gICAgICBjZmYuZW5jb2RpbmcgPSBlbmNvZGluZztcblxuICAgICAgdmFyIGNoYXJTdHJpbmdzQW5kU2VhY3MgPSB0aGlzLnBhcnNlQ2hhclN0cmluZ3Moe1xuICAgICAgICBjaGFyU3RyaW5nczogY2hhclN0cmluZ0luZGV4LFxuICAgICAgICBsb2NhbFN1YnJJbmRleDogdG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4LFxuICAgICAgICBnbG9iYWxTdWJySW5kZXg6IGdsb2JhbFN1YnJJbmRleC5vYmosXG4gICAgICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsXG4gICAgICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5LFxuICAgICAgICBwcml2YXRlRGljdDogdG9wRGljdC5wcml2YXRlRGljdCxcbiAgICAgIH0pO1xuICAgICAgY2ZmLmNoYXJTdHJpbmdzID0gY2hhclN0cmluZ3NBbmRTZWFjcy5jaGFyU3RyaW5ncztcbiAgICAgIGNmZi5zZWFjcyA9IGNoYXJTdHJpbmdzQW5kU2VhY3Muc2VhY3M7XG4gICAgICBjZmYud2lkdGhzID0gY2hhclN0cmluZ3NBbmRTZWFjcy53aWR0aHM7XG5cbiAgICAgIHJldHVybiBjZmY7XG4gICAgfVxuXG4gICAgcGFyc2VIZWFkZXIoKSB7XG4gICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzO1xuICAgICAgdmFyIGJ5dGVzTGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICAgIC8vIFByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCwgYnkgY2hlY2tpbmcgdGhhdCB0aGUgb2Zmc2V0IGlzIHdpdGhpbiB0aGVcbiAgICAgIC8vIGJvdW5kcyBvZiB0aGUgYnl0ZXMgYXJyYXkuIE5lY2Vzc2FyeSBpbiBlbXB0eSwgb3IgaW52YWxpZCwgZm9udCBmaWxlcy5cbiAgICAgIHdoaWxlIChvZmZzZXQgPCBieXRlc0xlbmd0aCAmJiBieXRlc1tvZmZzZXRdICE9PSAxKSB7XG4gICAgICAgICsrb2Zmc2V0O1xuICAgICAgfVxuICAgICAgaWYgKG9mZnNldCA+PSBieXRlc0xlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJJbnZhbGlkIENGRiBoZWFkZXJcIik7XG4gICAgICB9XG4gICAgICBpZiAob2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgIGluZm8oXCJjZmYgZGF0YSBpcyBzaGlmdGVkXCIpO1xuICAgICAgICBieXRlcyA9IGJ5dGVzLnN1YmFycmF5KG9mZnNldCk7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlcztcbiAgICAgIH1cbiAgICAgIHZhciBtYWpvciA9IGJ5dGVzWzBdO1xuICAgICAgdmFyIG1pbm9yID0gYnl0ZXNbMV07XG4gICAgICB2YXIgaGRyU2l6ZSA9IGJ5dGVzWzJdO1xuICAgICAgdmFyIG9mZlNpemUgPSBieXRlc1szXTtcbiAgICAgIHZhciBoZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSk7XG4gICAgICByZXR1cm4geyBvYmo6IGhlYWRlciwgZW5kUG9zOiBoZHJTaXplIH07XG4gICAgfVxuXG4gICAgcGFyc2VEaWN0KGRpY3QpIHtcbiAgICAgIHZhciBwb3MgPSAwO1xuXG4gICAgICBmdW5jdGlvbiBwYXJzZU9wZXJhbmQoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRpY3RbcG9zKytdO1xuICAgICAgICBpZiAodmFsdWUgPT09IDMwKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXRPcGVyYW5kKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7XG4gICAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTtcbiAgICAgICAgICB2YWx1ZSA9ICgodmFsdWUgPDwgMjQpIHwgKGRpY3RbcG9zKytdIDw8IDE2KSkgPj4gMTY7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOSkge1xuICAgICAgICAgIHZhbHVlID0gZGljdFtwb3MrK107XG4gICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBkaWN0W3BvcysrXTtcbiAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IGRpY3RbcG9zKytdO1xuICAgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgZGljdFtwb3MrK107XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDMyICYmIHZhbHVlIDw9IDI0Nikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZSAtIDEzOTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNDcgJiYgdmFsdWUgPD0gMjUwKSB7XG4gICAgICAgICAgcmV0dXJuICh2YWx1ZSAtIDI0NykgKiAyNTYgKyBkaWN0W3BvcysrXSArIDEwODtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNTEgJiYgdmFsdWUgPD0gMjU0KSB7XG4gICAgICAgICAgcmV0dXJuIC0oKHZhbHVlIC0gMjUxKSAqIDI1NikgLSBkaWN0W3BvcysrXSAtIDEwODtcbiAgICAgICAgfVxuICAgICAgICB3YXJuKCdDRkZQYXJzZXJfcGFyc2VEaWN0OiBcIicgKyB2YWx1ZSArICdcIiBpcyBhIHJlc2VydmVkIGNvbW1hbmQuJyk7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBhcnNlRmxvYXRPcGVyYW5kKCkge1xuICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgdmFyIGVvZiA9IDE1O1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY29uc3QgbG9va3VwID0gW1wiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjlcIiwgXCIuXCIsIFwiRVwiLCBcIkUtXCIsIG51bGwsIFwiLVwiXTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGRpY3QubGVuZ3RoO1xuICAgICAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGIgPSBkaWN0W3BvcysrXTtcbiAgICAgICAgICB2YXIgYjEgPSBiID4+IDQ7XG4gICAgICAgICAgdmFyIGIyID0gYiAmIDE1O1xuXG4gICAgICAgICAgaWYgKGIxID09PSBlb2YpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdHIgKz0gbG9va3VwW2IxXTtcblxuICAgICAgICAgIGlmIChiMiA9PT0gZW9mKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyICs9IGxvb2t1cFtiMl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9wZXJhbmRzID0gW107XG4gICAgICB2YXIgZW50cmllcyA9IFtdO1xuXG4gICAgICBwb3MgPSAwO1xuICAgICAgdmFyIGVuZCA9IGRpY3QubGVuZ3RoO1xuICAgICAgd2hpbGUgKHBvcyA8IGVuZCkge1xuICAgICAgICB2YXIgYiA9IGRpY3RbcG9zXTtcbiAgICAgICAgaWYgKGIgPD0gMjEpIHtcbiAgICAgICAgICBpZiAoYiA9PT0gMTIpIHtcbiAgICAgICAgICAgIGIgPSAoYiA8PCA4KSB8IGRpY3RbKytwb3NdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyaWVzLnB1c2goW2IsIG9wZXJhbmRzXSk7XG4gICAgICAgICAgb3BlcmFuZHMgPSBbXTtcbiAgICAgICAgICArK3BvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKHBhcnNlT3BlcmFuZCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfVxuXG4gICAgcGFyc2VJbmRleChwb3MpIHtcbiAgICAgIHZhciBjZmZJbmRleCA9IG5ldyBDRkZJbmRleCgpO1xuICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICAgIHZhciBjb3VudCA9IChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107XG4gICAgICB2YXIgb2Zmc2V0cyA9IFtdO1xuICAgICAgdmFyIGVuZCA9IHBvcztcbiAgICAgIHZhciBpLCBpaTtcblxuICAgICAgaWYgKGNvdW50ICE9PSAwKSB7XG4gICAgICAgIHZhciBvZmZzZXRTaXplID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICAvLyBhZGQgMSBmb3Igb2Zmc2V0IHRvIGRldGVybWluZSBzaXplIG9mIGxhc3Qgb2JqZWN0XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHBvcyArIChjb3VudCArIDEpICogb2Zmc2V0U2l6ZSAtIDE7XG5cbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBjb3VudCArIDE7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvZmZzZXRTaXplOyArK2opIHtcbiAgICAgICAgICAgIG9mZnNldCA8PD0gODtcbiAgICAgICAgICAgIG9mZnNldCArPSBieXRlc1twb3MrK107XG4gICAgICAgICAgfVxuICAgICAgICAgIG9mZnNldHMucHVzaChzdGFydFBvcyArIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kID0gb2Zmc2V0c1tjb3VudF07XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IG9mZnNldHMubGVuZ3RoIC0gMTsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgdmFyIG9mZnNldFN0YXJ0ID0gb2Zmc2V0c1tpXTtcbiAgICAgICAgdmFyIG9mZnNldEVuZCA9IG9mZnNldHNbaSArIDFdO1xuICAgICAgICBjZmZJbmRleC5hZGQoYnl0ZXMuc3ViYXJyYXkob2Zmc2V0U3RhcnQsIG9mZnNldEVuZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgb2JqOiBjZmZJbmRleCwgZW5kUG9zOiBlbmQgfTtcbiAgICB9XG5cbiAgICBwYXJzZU5hbWVJbmRleChpbmRleCkge1xuICAgICAgdmFyIG5hbWVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbmRleC5jb3VudDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBpbmRleC5nZXQoaSk7XG4gICAgICAgIG5hbWVzLnB1c2goYnl0ZXNUb1N0cmluZyhuYW1lKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmFtZXM7XG4gICAgfVxuXG4gICAgcGFyc2VTdHJpbmdJbmRleChpbmRleCkge1xuICAgICAgdmFyIHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgIHZhciBkYXRhID0gaW5kZXguZ2V0KGkpO1xuICAgICAgICBzdHJpbmdzLmFkZChieXRlc1RvU3RyaW5nKGRhdGEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzO1xuICAgIH1cblxuICAgIGNyZWF0ZURpY3QoVHlwZSwgZGljdCwgc3RyaW5ncykge1xuICAgICAgdmFyIGNmZkRpY3QgPSBuZXcgVHlwZShzdHJpbmdzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3QubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICB2YXIgcGFpciA9IGRpY3RbaV07XG4gICAgICAgIHZhciBrZXkgPSBwYWlyWzBdO1xuICAgICAgICB2YXIgdmFsdWUgPSBwYWlyWzFdO1xuICAgICAgICBjZmZEaWN0LnNldEJ5S2V5KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNmZkRpY3Q7XG4gICAgfVxuXG4gICAgcGFyc2VDaGFyU3RyaW5nKHN0YXRlLCBkYXRhLCBsb2NhbFN1YnJJbmRleCwgZ2xvYmFsU3VickluZGV4KSB7XG4gICAgICBpZiAoIWRhdGEgfHwgc3RhdGUuY2FsbERlcHRoID4gTUFYX1NVQlJfTkVTVElORykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplO1xuICAgICAgdmFyIHN0YWNrID0gc3RhdGUuc3RhY2s7XG5cbiAgICAgIHZhciBsZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7ICkge1xuICAgICAgICB2YXIgdmFsdWUgPSBkYXRhW2orK107XG4gICAgICAgIHZhciB2YWxpZGF0aW9uQ29tbWFuZCA9IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHtcbiAgICAgICAgICB2YXIgcSA9IGRhdGFbaisrXTtcbiAgICAgICAgICBpZiAocSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhlIENGRiBzcGVjaWZpY2F0aW9uIHN0YXRlIHRoYXQgdGhlICdkb3RzZWN0aW9uJyBjb21tYW5kXG4gICAgICAgICAgICAvLyAoMTIsIDApIGlzIGRlcHJlY2F0ZWQgYW5kIHRyZWF0ZWQgYXMgYSBuby1vcCwgYnV0IGFsbCBUeXBlMlxuICAgICAgICAgICAgLy8gY2hhcnN0cmluZ3MgcHJvY2Vzc29ycyBzaG91bGQgc3VwcG9ydCB0aGVtLiBVbmZvcnR1bmF0ZWx5XG4gICAgICAgICAgICAvLyB0aGUgZm9udCBzYW5pdGl6ZXIgZG9uJ3QuIEFzIGEgd29ya2Fyb3VuZCB0aGUgc2VxdWVuY2UgKDEyLCAwKVxuICAgICAgICAgICAgLy8gaXMgcmVwbGFjZWQgYnkgYSB1c2VsZXNzICgwLCBobW92ZXRvKS5cbiAgICAgICAgICAgIGRhdGFbaiAtIDJdID0gMTM5O1xuICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSAyMjtcbiAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhMTJbcV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOCkge1xuICAgICAgICAgIC8vIG51bWJlciAoMTYgYml0KVxuICAgICAgICAgIHN0YWNrW3N0YWNrU2l6ZV0gPSAoKGRhdGFbal0gPDwgMjQpIHwgKGRhdGFbaiArIDFdIDw8IDE2KSkgPj4gMTY7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIHN0YWNrU2l6ZSsrO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxNCkge1xuICAgICAgICAgIGlmIChzdGFja1NpemUgPj0gNCkge1xuICAgICAgICAgICAgc3RhY2tTaXplIC09IDQ7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlYWMgPSBzdGFjay5zbGljZShzdGFja1NpemUsIHN0YWNrU2l6ZSArIDQpO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAzMiAmJiB2YWx1ZSA8PSAyNDYpIHtcbiAgICAgICAgICAvLyBudW1iZXJcbiAgICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgLSAxMzk7XG4gICAgICAgICAgc3RhY2tTaXplKys7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMjQ3ICYmIHZhbHVlIDw9IDI1NCkge1xuICAgICAgICAgIC8vIG51bWJlciAoKzEgYnl0ZXMpXG4gICAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9XG4gICAgICAgICAgICB2YWx1ZSA8IDI1MVxuICAgICAgICAgICAgICA/ICgodmFsdWUgLSAyNDcpIDw8IDgpICsgZGF0YVtqXSArIDEwOFxuICAgICAgICAgICAgICA6IC0oKHZhbHVlIC0gMjUxKSA8PCA4KSAtIGRhdGFbal0gLSAxMDg7XG4gICAgICAgICAgaisrO1xuICAgICAgICAgIHN0YWNrU2l6ZSsrO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyNTUpIHtcbiAgICAgICAgICAvLyBudW1iZXIgKDMyIGJpdClcbiAgICAgICAgICBzdGFja1tzdGFja1NpemVdID1cbiAgICAgICAgICAgICgoZGF0YVtqXSA8PCAyNCkgfFxuICAgICAgICAgICAgICAoZGF0YVtqICsgMV0gPDwgMTYpIHxcbiAgICAgICAgICAgICAgKGRhdGFbaiArIDJdIDw8IDgpIHxcbiAgICAgICAgICAgICAgZGF0YVtqICsgM10pIC9cbiAgICAgICAgICAgIDY1NTM2O1xuICAgICAgICAgIGogKz0gNDtcbiAgICAgICAgICBzdGFja1NpemUrKztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTkgfHwgdmFsdWUgPT09IDIwKSB7XG4gICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7XG4gICAgICAgICAgLy8gc2tpcHBpbmcgcmlnaHQgYW1vdW50IG9mIGhpbnRzIGZsYWcgZGF0YVxuICAgICAgICAgIGogKz0gKHN0YXRlLmhpbnRzICsgNykgPj4gMztcbiAgICAgICAgICBzdGFja1NpemUgJT0gMjtcbiAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDEwIHx8IHZhbHVlID09PSAyOSkge1xuICAgICAgICAgIHZhciBzdWJyc0luZGV4O1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMTApIHtcbiAgICAgICAgICAgIHN1YnJzSW5kZXggPSBsb2NhbFN1YnJJbmRleDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VicnNJbmRleCA9IGdsb2JhbFN1YnJJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJyc0luZGV4KSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07XG4gICAgICAgICAgICB3YXJuKFwiTWlzc2luZyBzdWJyc0luZGV4IGZvciBcIiArIHZhbGlkYXRpb25Db21tYW5kLmlkKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGJpYXMgPSAzMjc2ODtcbiAgICAgICAgICBpZiAoc3VicnNJbmRleC5jb3VudCA8IDEyNDApIHtcbiAgICAgICAgICAgIGJpYXMgPSAxMDc7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMzM5MDApIHtcbiAgICAgICAgICAgIGJpYXMgPSAxMTMxO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc3Vick51bWJlciA9IHN0YWNrWy0tc3RhY2tTaXplXSArIGJpYXM7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3Vick51bWJlciA8IDAgfHxcbiAgICAgICAgICAgIHN1YnJOdW1iZXIgPj0gc3VicnNJbmRleC5jb3VudCB8fFxuICAgICAgICAgICAgaXNOYU4oc3Vick51bWJlcilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTtcbiAgICAgICAgICAgIHdhcm4oXCJPdXQgb2YgYm91bmRzIHN1YnJJbmRleCBmb3IgXCIgKyB2YWxpZGF0aW9uQ29tbWFuZC5pZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTtcbiAgICAgICAgICBzdGF0ZS5jYWxsRGVwdGgrKztcbiAgICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgc3VicnNJbmRleC5nZXQoc3Vick51bWJlciksXG4gICAgICAgICAgICBsb2NhbFN1YnJJbmRleCxcbiAgICAgICAgICAgIGdsb2JhbFN1YnJJbmRleFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5jYWxsRGVwdGgtLTtcbiAgICAgICAgICBzdGFja1NpemUgPSBzdGF0ZS5zdGFja1NpemU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDExKSB7XG4gICAgICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQpIHtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkge1xuICAgICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IDMgfHwgdmFsdWUgPT09IDIzKSB7XG4gICAgICAgICAgICAgIC8vIHZzdGVtIG9yIHZzdGVtaG0uXG4gICAgICAgICAgICAgIHN0YXRlLmhhc1ZTdGVtcyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhhc1ZTdGVtcyAmJiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDE4KSkge1xuICAgICAgICAgICAgICAvLyBTb21lIGJyb3dzZXJzIGRvbid0IGRyYXcgZ2x5cGhzIHRoYXQgc3BlY2lmeSB2c3RlbXMgYmVmb3JlXG4gICAgICAgICAgICAgIC8vIGhzdGVtcy4gQXMgYSB3b3JrYXJvdW5kLCByZXBsYWNlIGhzdGVtICgxKSBhbmQgaHN0ZW1obSAoMTgpXG4gICAgICAgICAgICAgIC8vIHdpdGggYSBwb2ludGxlc3MgdnN0ZW0gKDMpIG9yIHZzdGVtaG0gKDIzKS5cbiAgICAgICAgICAgICAgd2FybihcIkNGRiBzdGVtIGhpbnRzIGFyZSBpbiB3cm9uZyBvcmRlclwiKTtcbiAgICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFwibWluXCIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHtcbiAgICAgICAgICAgIGlmICghc3RhdGUudW5kZWZTdGFjayAmJiBzdGFja1NpemUgPCB2YWxpZGF0aW9uQ29tbWFuZC5taW4pIHtcbiAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICBcIk5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgXCIgK1xuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQuaWQgK1xuICAgICAgICAgICAgICAgICAgXCI7IGFjdHVhbDogXCIgK1xuICAgICAgICAgICAgICAgICAgc3RhY2tTaXplICtcbiAgICAgICAgICAgICAgICAgIFwiLCBleHBlY3RlZDogXCIgK1xuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQubWluXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyAmJiB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0NsZWFyaW5nKSB7XG4gICAgICAgICAgICBzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHRoZSBvcHRpb25hbCBjaGFyYWN0ZXIgd2lkdGggY2FuIGJlIGZvdW5kIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAgICAgICAgIC8vIHN0YWNrLWNsZWFyaW5nIGNvbW1hbmQgYXJndW1lbnRzXG4gICAgICAgICAgICBzdGFja1NpemUgLT0gdmFsaWRhdGlvbkNvbW1hbmQubWluO1xuICAgICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+PSAyICYmIHZhbGlkYXRpb25Db21tYW5kLnN0ZW0pIHtcbiAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGV2ZW4gYW1vdW50IG9mIGFyZ3VtZW50cyBmb3Igc3RlbSBjb21tYW5kc1xuICAgICAgICAgICAgICBzdGFja1NpemUgJT0gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tTaXplID4gMSkge1xuICAgICAgICAgICAgICB3YXJuKFwiRm91bmQgdG9vIG1hbnkgcGFyYW1ldGVycyBmb3Igc3RhY2stY2xlYXJpbmcgY29tbWFuZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGFja1NpemUgPiAwICYmIHN0YWNrW3N0YWNrU2l6ZSAtIDFdID49IDApIHtcbiAgICAgICAgICAgICAgc3RhdGUud2lkdGggPSBzdGFja1tzdGFja1NpemUgLSAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFwic3RhY2tEZWx0YVwiIGluIHZhbGlkYXRpb25Db21tYW5kKSB7XG4gICAgICAgICAgICBpZiAoXCJzdGFja0ZuXCIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tGbihzdGFjaywgc3RhY2tTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YWNrU2l6ZSArPSB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0RlbHRhO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykge1xuICAgICAgICAgICAgc3RhY2tTaXplID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnJlc2V0U3RhY2spIHtcbiAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7XG4gICAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC51bmRlZlN0YWNrKSB7XG4gICAgICAgICAgICBzdGFja1NpemUgPSAwO1xuICAgICAgICAgICAgc3RhdGUudW5kZWZTdGFjayA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHBhcnNlQ2hhclN0cmluZ3Moe1xuICAgICAgY2hhclN0cmluZ3MsXG4gICAgICBsb2NhbFN1YnJJbmRleCxcbiAgICAgIGdsb2JhbFN1YnJJbmRleCxcbiAgICAgIGZkU2VsZWN0LFxuICAgICAgZmRBcnJheSxcbiAgICAgIHByaXZhdGVEaWN0LFxuICAgIH0pIHtcbiAgICAgIHZhciBzZWFjcyA9IFtdO1xuICAgICAgdmFyIHdpZHRocyA9IFtdO1xuICAgICAgdmFyIGNvdW50ID0gY2hhclN0cmluZ3MuY291bnQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgdmFyIGNoYXJzdHJpbmcgPSBjaGFyU3RyaW5ncy5nZXQoaSk7XG4gICAgICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgICAgICBjYWxsRGVwdGg6IDAsXG4gICAgICAgICAgc3RhY2tTaXplOiAwLFxuICAgICAgICAgIHN0YWNrOiBbXSxcbiAgICAgICAgICB1bmRlZlN0YWNrOiB0cnVlLFxuICAgICAgICAgIGhpbnRzOiAwLFxuICAgICAgICAgIGZpcnN0U3RhY2tDbGVhcmluZzogdHJ1ZSxcbiAgICAgICAgICBzZWFjOiBudWxsLFxuICAgICAgICAgIHdpZHRoOiBudWxsLFxuICAgICAgICAgIGhhc1ZTdGVtczogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHZhciB2YWxpZCA9IHRydWU7XG4gICAgICAgIHZhciBsb2NhbFN1YnJUb1VzZSA9IG51bGw7XG4gICAgICAgIHZhciBwcml2YXRlRGljdFRvVXNlID0gcHJpdmF0ZURpY3Q7XG4gICAgICAgIGlmIChmZFNlbGVjdCAmJiBmZEFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIHZhciBmZEluZGV4ID0gZmRTZWxlY3QuZ2V0RkRJbmRleChpKTtcbiAgICAgICAgICBpZiAoZmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHdhcm4oXCJHbHlwaCBpbmRleCBpcyBub3QgaW4gZmQgc2VsZWN0LlwiKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmZEluZGV4ID49IGZkQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICB3YXJuKFwiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguXCIpO1xuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICBwcml2YXRlRGljdFRvVXNlID0gZmRBcnJheVtmZEluZGV4XS5wcml2YXRlRGljdDtcbiAgICAgICAgICAgIGxvY2FsU3ViclRvVXNlID0gcHJpdmF0ZURpY3RUb1VzZS5zdWJyc0luZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbFN1YnJJbmRleCkge1xuICAgICAgICAgIGxvY2FsU3ViclRvVXNlID0gbG9jYWxTdWJySW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgY2hhcnN0cmluZyxcbiAgICAgICAgICAgIGxvY2FsU3ViclRvVXNlLFxuICAgICAgICAgICAgZ2xvYmFsU3VickluZGV4XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBub21pbmFsV2lkdGggPSBwcml2YXRlRGljdFRvVXNlLmdldEJ5TmFtZShcIm5vbWluYWxXaWR0aFhcIik7XG4gICAgICAgICAgd2lkdGhzW2ldID0gbm9taW5hbFdpZHRoICsgc3RhdGUud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoXCJkZWZhdWx0V2lkdGhYXCIpO1xuICAgICAgICAgIHdpZHRoc1tpXSA9IGRlZmF1bHRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuc2VhYyAhPT0gbnVsbCkge1xuICAgICAgICAgIHNlYWNzW2ldID0gc3RhdGUuc2VhYztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgLy8gcmVzZXR0aW5nIGludmFsaWQgY2hhcnN0cmluZyB0byBzaW5nbGUgJ2VuZGNoYXInXG4gICAgICAgICAgY2hhclN0cmluZ3Muc2V0KGksIG5ldyBVaW50OEFycmF5KFsxNF0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2hhclN0cmluZ3MsIHNlYWNzLCB3aWR0aHMgfTtcbiAgICB9XG5cbiAgICBlbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpIHtcbiAgICAgIHZhciBwcml2YXRlRGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZQcml2YXRlRGljdCwgW10sIHBhcmVudERpY3Quc3RyaW5ncyk7XG4gICAgICBwYXJlbnREaWN0LnNldEJ5S2V5KDE4LCBbMCwgMF0pO1xuICAgICAgcGFyZW50RGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0O1xuICAgIH1cblxuICAgIHBhcnNlUHJpdmF0ZURpY3QocGFyZW50RGljdCkge1xuICAgICAgLy8gbm8gcHJpdmF0ZSBkaWN0LCBkbyBub3RoaW5nXG4gICAgICBpZiAoIXBhcmVudERpY3QuaGFzTmFtZShcIlByaXZhdGVcIikpIHtcbiAgICAgICAgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcHJpdmF0ZU9mZnNldCA9IHBhcmVudERpY3QuZ2V0QnlOYW1lKFwiUHJpdmF0ZVwiKTtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1zIGFyZSBmb3JtYXR0ZWQgY29ycmVjdGx5XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJpdmF0ZU9mZnNldCkgfHwgcHJpdmF0ZU9mZnNldC5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgcGFyZW50RGljdC5yZW1vdmVCeU5hbWUoXCJQcml2YXRlXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgc2l6ZSA9IHByaXZhdGVPZmZzZXRbMF07XG4gICAgICB2YXIgb2Zmc2V0ID0gcHJpdmF0ZU9mZnNldFsxXTtcbiAgICAgIC8vIHJlbW92ZSBlbXB0eSBkaWN0cyBvciBvbmVzIHRoYXQgcmVmZXIgdG8gaW52YWxpZCBsb2NhdGlvblxuICAgICAgaWYgKHNpemUgPT09IDAgfHwgb2Zmc2V0ID49IHRoaXMuYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJpdmF0ZURpY3RFbmQgPSBvZmZzZXQgKyBzaXplO1xuICAgICAgdmFyIGRpY3REYXRhID0gdGhpcy5ieXRlcy5zdWJhcnJheShvZmZzZXQsIHByaXZhdGVEaWN0RW5kKTtcbiAgICAgIHZhciBkaWN0ID0gdGhpcy5wYXJzZURpY3QoZGljdERhdGEpO1xuICAgICAgdmFyIHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KFxuICAgICAgICBDRkZQcml2YXRlRGljdCxcbiAgICAgICAgZGljdCxcbiAgICAgICAgcGFyZW50RGljdC5zdHJpbmdzXG4gICAgICApO1xuICAgICAgcGFyZW50RGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0O1xuXG4gICAgICAvLyBQYXJzZSB0aGUgU3VicnMgaW5kZXggYWxzbyBzaW5jZSBpdCdzIHJlbGF0aXZlIHRvIHRoZSBwcml2YXRlIGRpY3QuXG4gICAgICBpZiAoIXByaXZhdGVEaWN0LmdldEJ5TmFtZShcIlN1YnJzXCIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBzdWJyc09mZnNldCA9IHByaXZhdGVEaWN0LmdldEJ5TmFtZShcIlN1YnJzXCIpO1xuICAgICAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gb2Zmc2V0ICsgc3VicnNPZmZzZXQ7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgb2Zmc2V0LlxuICAgICAgaWYgKHN1YnJzT2Zmc2V0ID09PSAwIHx8IHJlbGF0aXZlT2Zmc2V0ID49IHRoaXMuYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHN1YnJzSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgocmVsYXRpdmVPZmZzZXQpO1xuICAgICAgcHJpdmF0ZURpY3Quc3VicnNJbmRleCA9IHN1YnJzSW5kZXgub2JqO1xuICAgIH1cblxuICAgIHBhcnNlQ2hhcnNldHMocG9zLCBsZW5ndGgsIHN0cmluZ3MsIGNpZCkge1xuICAgICAgaWYgKHBvcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQoXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLklTT19BRE9CRSxcbiAgICAgICAgICBJU09BZG9iZUNoYXJzZXRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJULFxuICAgICAgICAgIEV4cGVydENoYXJzZXRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocG9zID09PSAyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJUX1NVQlNFVCxcbiAgICAgICAgICBFeHBlcnRTdWJzZXRDaGFyc2V0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7XG4gICAgICB2YXIgc3RhcnQgPSBwb3M7XG4gICAgICB2YXIgZm9ybWF0ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgY29uc3QgY2hhcnNldCA9IFtjaWQgPyAwIDogXCIubm90ZGVmXCJdO1xuICAgICAgdmFyIGlkLCBjb3VudCwgaTtcblxuICAgICAgLy8gc3VidHJhY3QgMSBmb3IgdGhlIC5ub3RkZWYgZ2x5cGhcbiAgICAgIGxlbmd0aCAtPSAxO1xuXG4gICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZCA9IChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107XG4gICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQgOiBzdHJpbmdzLmdldChpZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSB8IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGNvdW50ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCsrIDogc3RyaW5ncy5nZXQoaWQrKykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSB8IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGNvdW50ID0gKGJ5dGVzW3BvcysrXSA8PCA4KSB8IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiVW5rbm93biBjaGFyc2V0IGZvcm1hdFwiKTtcbiAgICAgIH1cbiAgICAgIC8vIFJhdyB3b24ndCBiZSBuZWVkZWQgaWYgd2UgYWN0dWFsbHkgY29tcGlsZSB0aGUgY2hhcnNldC5cbiAgICAgIHZhciBlbmQgPSBwb3M7XG4gICAgICB2YXIgcmF3ID0gYnl0ZXMuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG5cbiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgZm9ybWF0LCBjaGFyc2V0LCByYXcpO1xuICAgIH1cblxuICAgIHBhcnNlRW5jb2RpbmcocG9zLCBwcm9wZXJ0aWVzLCBzdHJpbmdzLCBjaGFyc2V0KSB7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICAgIHZhciBwcmVkZWZpbmVkID0gZmFsc2U7XG4gICAgICB2YXIgZm9ybWF0LCBpLCBpaTtcbiAgICAgIHZhciByYXcgPSBudWxsO1xuXG4gICAgICBmdW5jdGlvbiByZWFkU3VwcGxlbWVudCgpIHtcbiAgICAgICAgdmFyIHN1cHBsZW1lbnRzQ291bnQgPSBieXRlc1twb3MrK107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdXBwbGVtZW50c0NvdW50OyBpKyspIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICB2YXIgc2lkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSArIChieXRlc1twb3MrK10gJiAweGZmKTtcbiAgICAgICAgICBlbmNvZGluZ1tjb2RlXSA9IGNoYXJzZXQuaW5kZXhPZihzdHJpbmdzLmdldChzaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9zID09PSAwIHx8IHBvcyA9PT0gMSkge1xuICAgICAgICBwcmVkZWZpbmVkID0gdHJ1ZTtcbiAgICAgICAgZm9ybWF0ID0gcG9zO1xuICAgICAgICB2YXIgYmFzZUVuY29kaW5nID0gcG9zID8gRXhwZXJ0RW5jb2RpbmcgOiBTdGFuZGFyZEVuY29kaW5nO1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIHZhciBpbmRleCA9IGJhc2VFbmNvZGluZy5pbmRleE9mKGNoYXJzZXRbaV0pO1xuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZGF0YVN0YXJ0ID0gcG9zO1xuICAgICAgICBmb3JtYXQgPSBieXRlc1twb3MrK107XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0ICYgMHg3Zikge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHZhciBnbHlwaHNDb3VudCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBlbmNvZGluZ1tieXRlc1twb3MrK11dID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdmFyIHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICAgICAgdmFyIGdpZCA9IDE7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBieXRlc1twb3MrK107XG4gICAgICAgICAgICAgIHZhciBsZWZ0ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPD0gc3RhcnQgKyBsZWZ0OyBqKyspIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZ1tqXSA9IGdpZCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVua25vd24gZW5jb2RpbmcgZm9ybWF0OiAke2Zvcm1hdH0gaW4gQ0ZGYCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGFFbmQgPSBwb3M7XG4gICAgICAgIGlmIChmb3JtYXQgJiAweDgwKSB7XG4gICAgICAgICAgLy8gaGFzU3VwcGxlbWVudFxuICAgICAgICAgIC8vIFRoZSBmb250IHNhbml0aXplciBkb2VzIG5vdCBzdXBwb3J0IENGRiBlbmNvZGluZyB3aXRoIGFcbiAgICAgICAgICAvLyBzdXBwbGVtZW50LCBzaW5jZSB0aGUgZW5jb2RpbmcgaXMgbm90IHJlYWxseSB1c2VkIHRvIG1hcFxuICAgICAgICAgIC8vIGJldHdlZW4gZ2lkIHRvIGdseXBoLCBsZXQncyBvdmVyd3JpdGUgd2hhdCBpcyBkZWNsYXJlZCBpblxuICAgICAgICAgIC8vIHRoZSB0b3AgZGljdGlvbmFyeSB0byBsZXQgdGhlIHNhbml0aXplciB0aGluayB0aGUgZm9udCB1c2VcbiAgICAgICAgICAvLyBTdGFuZGFyZEVuY29kaW5nLCB0aGF0J3MgYSBsaWUgYnV0IHRoYXQncyBvay5cbiAgICAgICAgICBieXRlc1tkYXRhU3RhcnRdICY9IDB4N2Y7XG4gICAgICAgICAgcmVhZFN1cHBsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICByYXcgPSBieXRlcy5zdWJhcnJheShkYXRhU3RhcnQsIGRhdGFFbmQpO1xuICAgICAgfVxuICAgICAgZm9ybWF0ID0gZm9ybWF0ICYgMHg3ZjtcbiAgICAgIHJldHVybiBuZXcgQ0ZGRW5jb2RpbmcocHJlZGVmaW5lZCwgZm9ybWF0LCBlbmNvZGluZywgcmF3KTtcbiAgICB9XG5cbiAgICBwYXJzZUZEU2VsZWN0KHBvcywgbGVuZ3RoKSB7XG4gICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzO1xuICAgICAgdmFyIGZvcm1hdCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgIHZhciBmZFNlbGVjdCA9IFtdO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHZhciByYW5nZXNDb3VudCA9IChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhbmdlc0NvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdCA9IChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBmaXJzdCAhPT0gMCkge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwicGFyc2VGRFNlbGVjdDogVGhlIGZpcnN0IHJhbmdlIG11c3QgaGF2ZSBhIGZpcnN0IEdJRCBvZiAwXCIgK1xuICAgICAgICAgICAgICAgICAgXCIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgZmlyc3QgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGZkSW5kZXggPSBieXRlc1twb3MrK107XG4gICAgICAgICAgICB2YXIgbmV4dCA9IChieXRlc1twb3NdIDw8IDgpIHwgYnl0ZXNbcG9zICsgMV07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gZmlyc3Q7IGogPCBuZXh0OyArK2opIHtcbiAgICAgICAgICAgICAgZmRTZWxlY3QucHVzaChmZEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWR2YW5jZSBwYXN0IHRoZSBzZW50aW5lbChuZXh0KS5cbiAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYHBhcnNlRkRTZWxlY3Q6IFVua25vd24gZm9ybWF0IFwiJHtmb3JtYXR9XCIuYCk7XG4gICAgICB9XG4gICAgICBpZiAoZmRTZWxlY3QubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwicGFyc2VGRFNlbGVjdDogSW52YWxpZCBmb250IGRhdGEuXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IENGRkZEU2VsZWN0KGZvcm1hdCwgZmRTZWxlY3QpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQ0ZGUGFyc2VyO1xufSkoKTtcblxuLy8gQ29tcGFjdCBGb250IEZvcm1hdFxuY2xhc3MgQ0ZGIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWFkZXIgPSBudWxsO1xuICAgIHRoaXMubmFtZXMgPSBbXTtcbiAgICB0aGlzLnRvcERpY3QgPSBudWxsO1xuICAgIHRoaXMuc3RyaW5ncyA9IG5ldyBDRkZTdHJpbmdzKCk7XG4gICAgdGhpcy5nbG9iYWxTdWJySW5kZXggPSBudWxsO1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb3VsZCByZWFsbHkgYmUgcGVyIGZvbnQsIGJ1dCBzaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGZvbnRcbiAgICAvLyBzdG9yZSB0aGVtIGhlcmUuXG4gICAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gICAgdGhpcy5jaGFyc2V0ID0gbnVsbDtcbiAgICB0aGlzLmNoYXJTdHJpbmdzID0gbnVsbDtcbiAgICB0aGlzLmZkQXJyYXkgPSBbXTtcbiAgICB0aGlzLmZkU2VsZWN0ID0gbnVsbDtcblxuICAgIHRoaXMuaXNDSURGb250ID0gZmFsc2U7XG4gIH1cblxuICBkdXBsaWNhdGVGaXJzdEdseXBoKCkge1xuICAgIC8vIEJyb3dzZXJzIHdpbGwgbm90IGRpc3BsYXkgYSBnbHlwaCBhdCBwb3NpdGlvbiAwLiBUeXBpY2FsbHkgZ2x5cGggMCBpc1xuICAgIC8vIG5vdGRlZiwgYnV0IGEgbnVtYmVyIG9mIGZvbnRzIHB1dCBhIHZhbGlkIGdseXBoIHRoZXJlIHNvIGl0IG11c3QgYmVcbiAgICAvLyBkdXBsaWNhdGVkIGFuZCBhcHBlbmRlZC5cbiAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkge1xuICAgICAgd2FybihcIk5vdCBlbm91Z2ggc3BhY2UgaW4gY2hhcnN0cmluZ3MgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGdseXBoWmVybyA9IHRoaXMuY2hhclN0cmluZ3MuZ2V0KDApO1xuICAgIHRoaXMuY2hhclN0cmluZ3MuYWRkKGdseXBoWmVybyk7XG4gICAgaWYgKHRoaXMuaXNDSURGb250KSB7XG4gICAgICB0aGlzLmZkU2VsZWN0LmZkU2VsZWN0LnB1c2godGhpcy5mZFNlbGVjdC5mZFNlbGVjdFswXSk7XG4gICAgfVxuICB9XG5cbiAgaGFzR2x5cGhJZChpZCkge1xuICAgIGlmIChpZCA8IDAgfHwgaWQgPj0gdGhpcy5jaGFyU3RyaW5ncy5jb3VudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZ2x5cGggPSB0aGlzLmNoYXJTdHJpbmdzLmdldChpZCk7XG4gICAgcmV0dXJuIGdseXBoLmxlbmd0aCA+IDA7XG4gIH1cbn1cblxuY2xhc3MgQ0ZGSGVhZGVyIHtcbiAgY29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKSB7XG4gICAgdGhpcy5tYWpvciA9IG1ham9yO1xuICAgIHRoaXMubWlub3IgPSBtaW5vcjtcbiAgICB0aGlzLmhkclNpemUgPSBoZHJTaXplO1xuICAgIHRoaXMub2ZmU2l6ZSA9IG9mZlNpemU7XG4gIH1cbn1cblxuY2xhc3MgQ0ZGU3RyaW5ncyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RyaW5ncyA9IFtdO1xuICB9XG5cbiAgZ2V0KGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIC0gMSkge1xuICAgICAgcmV0dXJuIENGRlN0YW5kYXJkU3RyaW5nc1tpbmRleF07XG4gICAgfVxuICAgIGlmIChpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA8PSB0aGlzLnN0cmluZ3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdzW2luZGV4IC0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTXTtcbiAgICB9XG4gICAgcmV0dXJuIENGRlN0YW5kYXJkU3RyaW5nc1swXTtcbiAgfVxuXG4gIGdldFNJRChzdHIpIHtcbiAgICBsZXQgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihzdHIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgaW5kZXggPSB0aGlzLnN0cmluZ3MuaW5kZXhPZihzdHIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBpbmRleCArIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgYWRkKHZhbHVlKSB7XG4gICAgdGhpcy5zdHJpbmdzLnB1c2godmFsdWUpO1xuICB9XG5cbiAgZ2V0IGNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnN0cmluZ3MubGVuZ3RoO1xuICB9XG59XG5cbmNsYXNzIENGRkluZGV4IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vYmplY3RzID0gW107XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgYWRkKGRhdGEpIHtcbiAgICB0aGlzLmxlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICB0aGlzLm9iamVjdHMucHVzaChkYXRhKTtcbiAgfVxuXG4gIHNldChpbmRleCwgZGF0YSkge1xuICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoIC0gdGhpcy5vYmplY3RzW2luZGV4XS5sZW5ndGg7XG4gICAgdGhpcy5vYmplY3RzW2luZGV4XSA9IGRhdGE7XG4gIH1cblxuICBnZXQoaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3RzW2luZGV4XTtcbiAgfVxuXG4gIGdldCBjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDtcbiAgfVxufVxuXG5jbGFzcyBDRkZEaWN0IHtcbiAgY29uc3RydWN0b3IodGFibGVzLCBzdHJpbmdzKSB7XG4gICAgdGhpcy5rZXlUb05hbWVNYXAgPSB0YWJsZXMua2V5VG9OYW1lTWFwO1xuICAgIHRoaXMubmFtZVRvS2V5TWFwID0gdGFibGVzLm5hbWVUb0tleU1hcDtcbiAgICB0aGlzLmRlZmF1bHRzID0gdGFibGVzLmRlZmF1bHRzO1xuICAgIHRoaXMudHlwZXMgPSB0YWJsZXMudHlwZXM7XG4gICAgdGhpcy5vcGNvZGVzID0gdGFibGVzLm9wY29kZXM7XG4gICAgdGhpcy5vcmRlciA9IHRhYmxlcy5vcmRlcjtcbiAgICB0aGlzLnN0cmluZ3MgPSBzdHJpbmdzO1xuICAgIHRoaXMudmFsdWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIHZhbHVlIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXlcbiAgc2V0QnlLZXkoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmtleVRvTmFtZU1hcCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIC8vIGlnbm9yZSBlbXB0eSB2YWx1ZXNcbiAgICBpZiAodmFsdWVMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBJZ25vcmUgaW52YWxpZCB2YWx1ZXMgKGZpeGVzIGJ1ZzEwNjg0MzIucGRmIGFuZCBidWcxMzA4NTM2LnBkZikuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZUxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWVbaV0pKSB7XG4gICAgICAgIHdhcm4oJ0ludmFsaWQgQ0ZGRGljdCB2YWx1ZTogXCInICsgdmFsdWUgKyAnXCIgZm9yIGtleSBcIicgKyBrZXkgKyAnXCIuJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdHlwZSA9IHRoaXMudHlwZXNba2V5XTtcbiAgICAvLyByZW1vdmUgdGhlIGFycmF5IHdyYXBwaW5nIHRoZXNlIHR5cGVzIG9mIHZhbHVlc1xuICAgIGlmICh0eXBlID09PSBcIm51bVwiIHx8IHR5cGUgPT09IFwic2lkXCIgfHwgdHlwZSA9PT0gXCJvZmZzZXRcIikge1xuICAgICAgdmFsdWUgPSB2YWx1ZVswXTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2V0QnlOYW1lKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLm5hbWVUb0tleU1hcCkpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXNbdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV1dID0gdmFsdWU7XG4gIH1cblxuICBoYXNOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV0gaW4gdGhpcy52YWx1ZXM7XG4gIH1cblxuICBnZXRCeU5hbWUobmFtZSkge1xuICAgIGlmICghKG5hbWUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZGljdGlvbmFyeSBuYW1lICR7bmFtZX1cImApO1xuICAgIH1cbiAgICB2YXIga2V5ID0gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV07XG4gICAgaWYgKCEoa2V5IGluIHRoaXMudmFsdWVzKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdHNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2tleV07XG4gIH1cblxuICByZW1vdmVCeU5hbWUobmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtuYW1lXV07XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGFibGVzKGxheW91dCkge1xuICAgIHZhciB0YWJsZXMgPSB7XG4gICAgICBrZXlUb05hbWVNYXA6IHt9LFxuICAgICAgbmFtZVRvS2V5TWFwOiB7fSxcbiAgICAgIGRlZmF1bHRzOiB7fSxcbiAgICAgIHR5cGVzOiB7fSxcbiAgICAgIG9wY29kZXM6IHt9LFxuICAgICAgb3JkZXI6IFtdLFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbGF5b3V0Lmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIHZhciBlbnRyeSA9IGxheW91dFtpXTtcbiAgICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KGVudHJ5WzBdKVxuICAgICAgICA/IChlbnRyeVswXVswXSA8PCA4KSArIGVudHJ5WzBdWzFdXG4gICAgICAgIDogZW50cnlbMF07XG4gICAgICB0YWJsZXMua2V5VG9OYW1lTWFwW2tleV0gPSBlbnRyeVsxXTtcbiAgICAgIHRhYmxlcy5uYW1lVG9LZXlNYXBbZW50cnlbMV1dID0ga2V5O1xuICAgICAgdGFibGVzLnR5cGVzW2tleV0gPSBlbnRyeVsyXTtcbiAgICAgIHRhYmxlcy5kZWZhdWx0c1trZXldID0gZW50cnlbM107XG4gICAgICB0YWJsZXMub3Bjb2Rlc1trZXldID0gQXJyYXkuaXNBcnJheShlbnRyeVswXSkgPyBlbnRyeVswXSA6IFtlbnRyeVswXV07XG4gICAgICB0YWJsZXMub3JkZXIucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdGFibGVzO1xuICB9XG59XG5cbnZhciBDRkZUb3BEaWN0ID0gKGZ1bmN0aW9uIENGRlRvcERpY3RDbG9zdXJlKCkge1xuICB2YXIgbGF5b3V0ID0gW1xuICAgIFtbMTIsIDMwXSwgXCJST1NcIiwgW1wic2lkXCIsIFwic2lkXCIsIFwibnVtXCJdLCBudWxsXSxcbiAgICBbWzEyLCAyMF0sIFwiU3ludGhldGljQmFzZVwiLCBcIm51bVwiLCBudWxsXSxcbiAgICBbMCwgXCJ2ZXJzaW9uXCIsIFwic2lkXCIsIG51bGxdLFxuICAgIFsxLCBcIk5vdGljZVwiLCBcInNpZFwiLCBudWxsXSxcbiAgICBbWzEyLCAwXSwgXCJDb3B5cmlnaHRcIiwgXCJzaWRcIiwgbnVsbF0sXG4gICAgWzIsIFwiRnVsbE5hbWVcIiwgXCJzaWRcIiwgbnVsbF0sXG4gICAgWzMsIFwiRmFtaWx5TmFtZVwiLCBcInNpZFwiLCBudWxsXSxcbiAgICBbNCwgXCJXZWlnaHRcIiwgXCJzaWRcIiwgbnVsbF0sXG4gICAgW1sxMiwgMV0sIFwiaXNGaXhlZFBpdGNoXCIsIFwibnVtXCIsIDBdLFxuICAgIFtbMTIsIDJdLCBcIkl0YWxpY0FuZ2xlXCIsIFwibnVtXCIsIDBdLFxuICAgIFtbMTIsIDNdLCBcIlVuZGVybGluZVBvc2l0aW9uXCIsIFwibnVtXCIsIC0xMDBdLFxuICAgIFtbMTIsIDRdLCBcIlVuZGVybGluZVRoaWNrbmVzc1wiLCBcIm51bVwiLCA1MF0sXG4gICAgW1sxMiwgNV0sIFwiUGFpbnRUeXBlXCIsIFwibnVtXCIsIDBdLFxuICAgIFtbMTIsIDZdLCBcIkNoYXJzdHJpbmdUeXBlXCIsIFwibnVtXCIsIDJdLFxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIFtbMTIsIDddLCBcIkZvbnRNYXRyaXhcIiwgW1wibnVtXCIsIFwibnVtXCIsIFwibnVtXCIsIFwibnVtXCIsIFwibnVtXCIsIFwibnVtXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdXSxcbiAgICBbMTMsIFwiVW5pcXVlSURcIiwgXCJudW1cIiwgbnVsbF0sXG4gICAgWzUsIFwiRm9udEJCb3hcIiwgW1wibnVtXCIsIFwibnVtXCIsIFwibnVtXCIsIFwibnVtXCJdLCBbMCwgMCwgMCwgMF1dLFxuICAgIFtbMTIsIDhdLCBcIlN0cm9rZVdpZHRoXCIsIFwibnVtXCIsIDBdLFxuICAgIFsxNCwgXCJYVUlEXCIsIFwiYXJyYXlcIiwgbnVsbF0sXG4gICAgWzE1LCBcImNoYXJzZXRcIiwgXCJvZmZzZXRcIiwgMF0sXG4gICAgWzE2LCBcIkVuY29kaW5nXCIsIFwib2Zmc2V0XCIsIDBdLFxuICAgIFsxNywgXCJDaGFyU3RyaW5nc1wiLCBcIm9mZnNldFwiLCAwXSxcbiAgICBbMTgsIFwiUHJpdmF0ZVwiLCBbXCJvZmZzZXRcIiwgXCJvZmZzZXRcIl0sIG51bGxdLFxuICAgIFtbMTIsIDIxXSwgXCJQb3N0U2NyaXB0XCIsIFwic2lkXCIsIG51bGxdLFxuICAgIFtbMTIsIDIyXSwgXCJCYXNlRm9udE5hbWVcIiwgXCJzaWRcIiwgbnVsbF0sXG4gICAgW1sxMiwgMjNdLCBcIkJhc2VGb250QmxlbmRcIiwgXCJkZWx0YVwiLCBudWxsXSxcbiAgICBbWzEyLCAzMV0sIFwiQ0lERm9udFZlcnNpb25cIiwgXCJudW1cIiwgMF0sXG4gICAgW1sxMiwgMzJdLCBcIkNJREZvbnRSZXZpc2lvblwiLCBcIm51bVwiLCAwXSxcbiAgICBbWzEyLCAzM10sIFwiQ0lERm9udFR5cGVcIiwgXCJudW1cIiwgMF0sXG4gICAgW1sxMiwgMzRdLCBcIkNJRENvdW50XCIsIFwibnVtXCIsIDg3MjBdLFxuICAgIFtbMTIsIDM1XSwgXCJVSURCYXNlXCIsIFwibnVtXCIsIG51bGxdLFxuICAgIC8vIFhYWDogQ0lEIEZvbnRzIG9uIERpcmVjdFdyaXRlIDYuMSBvbmx5IHNlZW0gdG8gd29yayBpZiBGRFNlbGVjdCBjb21lc1xuICAgIC8vIGJlZm9yZSBGREFycmF5LlxuICAgIFtbMTIsIDM3XSwgXCJGRFNlbGVjdFwiLCBcIm9mZnNldFwiLCBudWxsXSxcbiAgICBbWzEyLCAzNl0sIFwiRkRBcnJheVwiLCBcIm9mZnNldFwiLCBudWxsXSxcbiAgICBbWzEyLCAzOF0sIFwiRm9udE5hbWVcIiwgXCJzaWRcIiwgbnVsbF0sXG4gIF07XG4gIHZhciB0YWJsZXMgPSBudWxsO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgQ0ZGVG9wRGljdCBleHRlbmRzIENGRkRpY3Qge1xuICAgIGNvbnN0cnVjdG9yKHN0cmluZ3MpIHtcbiAgICAgIGlmICh0YWJsZXMgPT09IG51bGwpIHtcbiAgICAgICAgdGFibGVzID0gQ0ZGRGljdC5jcmVhdGVUYWJsZXMobGF5b3V0KTtcbiAgICAgIH1cbiAgICAgIHN1cGVyKHRhYmxlcywgc3RyaW5ncyk7XG4gICAgICB0aGlzLnByaXZhdGVEaWN0ID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENGRlRvcERpY3Q7XG59KSgpO1xuXG52YXIgQ0ZGUHJpdmF0ZURpY3QgPSAoZnVuY3Rpb24gQ0ZGUHJpdmF0ZURpY3RDbG9zdXJlKCkge1xuICB2YXIgbGF5b3V0ID0gW1xuICAgIFs2LCBcIkJsdWVWYWx1ZXNcIiwgXCJkZWx0YVwiLCBudWxsXSxcbiAgICBbNywgXCJPdGhlckJsdWVzXCIsIFwiZGVsdGFcIiwgbnVsbF0sXG4gICAgWzgsIFwiRmFtaWx5Qmx1ZXNcIiwgXCJkZWx0YVwiLCBudWxsXSxcbiAgICBbOSwgXCJGYW1pbHlPdGhlckJsdWVzXCIsIFwiZGVsdGFcIiwgbnVsbF0sXG4gICAgW1sxMiwgOV0sIFwiQmx1ZVNjYWxlXCIsIFwibnVtXCIsIDAuMDM5NjI1XSxcbiAgICBbWzEyLCAxMF0sIFwiQmx1ZVNoaWZ0XCIsIFwibnVtXCIsIDddLFxuICAgIFtbMTIsIDExXSwgXCJCbHVlRnV6elwiLCBcIm51bVwiLCAxXSxcbiAgICBbMTAsIFwiU3RkSFdcIiwgXCJudW1cIiwgbnVsbF0sXG4gICAgWzExLCBcIlN0ZFZXXCIsIFwibnVtXCIsIG51bGxdLFxuICAgIFtbMTIsIDEyXSwgXCJTdGVtU25hcEhcIiwgXCJkZWx0YVwiLCBudWxsXSxcbiAgICBbWzEyLCAxM10sIFwiU3RlbVNuYXBWXCIsIFwiZGVsdGFcIiwgbnVsbF0sXG4gICAgW1sxMiwgMTRdLCBcIkZvcmNlQm9sZFwiLCBcIm51bVwiLCAwXSxcbiAgICBbWzEyLCAxN10sIFwiTGFuZ3VhZ2VHcm91cFwiLCBcIm51bVwiLCAwXSxcbiAgICBbWzEyLCAxOF0sIFwiRXhwYW5zaW9uRmFjdG9yXCIsIFwibnVtXCIsIDAuMDZdLFxuICAgIFtbMTIsIDE5XSwgXCJpbml0aWFsUmFuZG9tU2VlZFwiLCBcIm51bVwiLCAwXSxcbiAgICBbMjAsIFwiZGVmYXVsdFdpZHRoWFwiLCBcIm51bVwiLCAwXSxcbiAgICBbMjEsIFwibm9taW5hbFdpZHRoWFwiLCBcIm51bVwiLCAwXSxcbiAgICBbMTksIFwiU3VicnNcIiwgXCJvZmZzZXRcIiwgbnVsbF0sXG4gIF07XG4gIHZhciB0YWJsZXMgPSBudWxsO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgY2xhc3MgQ0ZGUHJpdmF0ZURpY3QgZXh0ZW5kcyBDRkZEaWN0IHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpbmdzKSB7XG4gICAgICBpZiAodGFibGVzID09PSBudWxsKSB7XG4gICAgICAgIHRhYmxlcyA9IENGRkRpY3QuY3JlYXRlVGFibGVzKGxheW91dCk7XG4gICAgICB9XG4gICAgICBzdXBlcih0YWJsZXMsIHN0cmluZ3MpO1xuICAgICAgdGhpcy5zdWJyc0luZGV4ID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENGRlByaXZhdGVEaWN0O1xufSkoKTtcblxudmFyIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMgPSB7XG4gIElTT19BRE9CRTogMCxcbiAgRVhQRVJUOiAxLFxuICBFWFBFUlRfU1VCU0VUOiAyLFxufTtcbmNsYXNzIENGRkNoYXJzZXQge1xuICBjb25zdHJ1Y3RvcihwcmVkZWZpbmVkLCBmb3JtYXQsIGNoYXJzZXQsIHJhdykge1xuICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7XG4gICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgdGhpcy5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICB0aGlzLnJhdyA9IHJhdztcbiAgfVxufVxuXG5jbGFzcyBDRkZFbmNvZGluZyB7XG4gIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgZW5jb2RpbmcsIHJhdykge1xuICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7XG4gICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIHRoaXMucmF3ID0gcmF3O1xuICB9XG59XG5cbmNsYXNzIENGRkZEU2VsZWN0IHtcbiAgY29uc3RydWN0b3IoZm9ybWF0LCBmZFNlbGVjdCkge1xuICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIHRoaXMuZmRTZWxlY3QgPSBmZFNlbGVjdDtcbiAgfVxuXG4gIGdldEZESW5kZXgoZ2x5cGhJbmRleCkge1xuICAgIGlmIChnbHlwaEluZGV4IDwgMCB8fCBnbHlwaEluZGV4ID49IHRoaXMuZmRTZWxlY3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZkU2VsZWN0W2dseXBoSW5kZXhdO1xuICB9XG59XG5cbi8vIEhlbHBlciBjbGFzcyB0byBrZWVwIHRyYWNrIG9mIHdoZXJlIGFuIG9mZnNldCBpcyB3aXRoaW4gdGhlIGRhdGEgYW5kIGhlbHBzXG4vLyBmaWxsaW5nIGluIHRoYXQgb2Zmc2V0IG9uY2UgaXQncyBrbm93bi5cbmNsYXNzIENGRk9mZnNldFRyYWNrZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9mZnNldHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgaXNUcmFja2luZyhrZXkpIHtcbiAgICByZXR1cm4ga2V5IGluIHRoaXMub2Zmc2V0cztcbiAgfVxuXG4gIHRyYWNrKGtleSwgbG9jYXRpb24pIHtcbiAgICBpZiAoa2V5IGluIHRoaXMub2Zmc2V0cykge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBBbHJlYWR5IHRyYWNraW5nIGxvY2F0aW9uIG9mICR7a2V5fWApO1xuICAgIH1cbiAgICB0aGlzLm9mZnNldHNba2V5XSA9IGxvY2F0aW9uO1xuICB9XG5cbiAgb2Zmc2V0KHZhbHVlKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMub2Zmc2V0cykge1xuICAgICAgdGhpcy5vZmZzZXRzW2tleV0gKz0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc2V0RW50cnlMb2NhdGlvbihrZXksIHZhbHVlcywgb3V0cHV0KSB7XG4gICAgaWYgKCEoa2V5IGluIHRoaXMub2Zmc2V0cykpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgTm90IHRyYWNraW5nIGxvY2F0aW9uIG9mICR7a2V5fWApO1xuICAgIH1cbiAgICB2YXIgZGF0YSA9IG91dHB1dC5kYXRhO1xuICAgIHZhciBkYXRhT2Zmc2V0ID0gdGhpcy5vZmZzZXRzW2tleV07XG4gICAgdmFyIHNpemUgPSA1O1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHZhbHVlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICB2YXIgb2Zmc2V0MCA9IGkgKiBzaXplICsgZGF0YU9mZnNldDtcbiAgICAgIHZhciBvZmZzZXQxID0gb2Zmc2V0MCArIDE7XG4gICAgICB2YXIgb2Zmc2V0MiA9IG9mZnNldDAgKyAyO1xuICAgICAgdmFyIG9mZnNldDMgPSBvZmZzZXQwICsgMztcbiAgICAgIHZhciBvZmZzZXQ0ID0gb2Zmc2V0MCArIDQ7XG4gICAgICAvLyBJdCdzIGVhc3kgdG8gc2NyZXcgdXAgb2Zmc2V0cyBzbyBwZXJmb3JtIHRoaXMgc2FuaXR5IGNoZWNrLlxuICAgICAgaWYgKFxuICAgICAgICBkYXRhW29mZnNldDBdICE9PSAweDFkIHx8XG4gICAgICAgIGRhdGFbb2Zmc2V0MV0gIT09IDAgfHxcbiAgICAgICAgZGF0YVtvZmZzZXQyXSAhPT0gMCB8fFxuICAgICAgICBkYXRhW29mZnNldDNdICE9PSAwIHx8XG4gICAgICAgIGRhdGFbb2Zmc2V0NF0gIT09IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJ3cml0aW5nIHRvIGFuIG9mZnNldCB0aGF0IGlzIG5vdCBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgIGRhdGFbb2Zmc2V0MF0gPSAweDFkO1xuICAgICAgZGF0YVtvZmZzZXQxXSA9ICh2YWx1ZSA+PiAyNCkgJiAweGZmO1xuICAgICAgZGF0YVtvZmZzZXQyXSA9ICh2YWx1ZSA+PiAxNikgJiAweGZmO1xuICAgICAgZGF0YVtvZmZzZXQzXSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7XG4gICAgICBkYXRhW29mZnNldDRdID0gdmFsdWUgJiAweGZmO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUYWtlcyBhIENGRiBhbmQgY29udmVydHMgaXQgdG8gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbi5cbmNsYXNzIENGRkNvbXBpbGVyIHtcbiAgY29uc3RydWN0b3IoY2ZmKSB7XG4gICAgdGhpcy5jZmYgPSBjZmY7XG4gIH1cblxuICBjb21waWxlKCkge1xuICAgIHZhciBjZmYgPSB0aGlzLmNmZjtcbiAgICB2YXIgb3V0cHV0ID0ge1xuICAgICAgZGF0YTogW10sXG4gICAgICBsZW5ndGg6IDAsXG4gICAgICBhZGQ6IGZ1bmN0aW9uIENGRkNvbXBpbGVyX2FkZChkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZGF0YSk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIENvbXBpbGUgdGhlIGZpdmUgZW50cmllcyB0aGF0IG11c3QgYmUgaW4gb3JkZXIuXG4gICAgdmFyIGhlYWRlciA9IHRoaXMuY29tcGlsZUhlYWRlcihjZmYuaGVhZGVyKTtcbiAgICBvdXRwdXQuYWRkKGhlYWRlcik7XG5cbiAgICB2YXIgbmFtZUluZGV4ID0gdGhpcy5jb21waWxlTmFtZUluZGV4KGNmZi5uYW1lcyk7XG4gICAgb3V0cHV0LmFkZChuYW1lSW5kZXgpO1xuXG4gICAgaWYgKGNmZi5pc0NJREZvbnQpIHtcbiAgICAgIC8vIFRoZSBzcGVjIGlzIHVuY2xlYXIgb24gaG93IGZvbnQgbWF0cmljZXMgc2hvdWxkIHJlbGF0ZSB0byBlYWNoIG90aGVyXG4gICAgICAvLyB3aGVuIHRoZXJlIGlzIG9uZSBpbiB0aGUgbWFpbiB0b3AgZGljdCBhbmQgdGhlIHN1YiB0b3AgZGljdHMuXG4gICAgICAvLyBXaW5kb3dzIGhhbmRsZXMgdGhpcyBkaWZmZXJlbnRseSB0aGFuIGxpbnV4IGFuZCBvc3ggc28gd2UgaGF2ZSB0b1xuICAgICAgLy8gbm9ybWFsaXplIHRvIHdvcmsgb24gYWxsLlxuICAgICAgLy8gUnVsZXMgYmFzZWQgb2ZmIG9mIHNvbWUgbWFpbGluZyBsaXN0IGRpc2N1c3Npb25zOlxuICAgICAgLy8gLSBJZiBtYWluIGZvbnQgaGFzIGEgbWF0cml4IGFuZCBzdWJmb250IGRvZXNuJ3QsIHVzZSB0aGUgbWFpbiBtYXRyaXguXG4gICAgICAvLyAtIElmIG5vIG1haW4gZm9udCBtYXRyaXggYW5kIHRoZXJlIGlzIGEgc3ViZm9udCBtYXRyaXgsIHVzZSB0aGVcbiAgICAgIC8vICAgc3ViZm9udCBtYXRyaXguXG4gICAgICAvLyAtIElmIGJvdGggaGF2ZSBtYXRyaWNlcywgY29uY2F0IHRvZ2V0aGVyLlxuICAgICAgLy8gLSBJZiBuZWl0aGVyIGhhdmUgbWF0cmljZXMsIHVzZSBkZWZhdWx0LlxuICAgICAgLy8gVG8gbWFrZSB0aGlzIHdvcmsgb24gYWxsIHBsYXRmb3JtcyB3ZSBtb3ZlIHRoZSB0b3AgbWF0cml4IGludG8gZWFjaFxuICAgICAgLy8gc3ViIHRvcCBkaWN0IGFuZCBjb25jYXQgaWYgbmVjZXNzYXJ5LlxuICAgICAgaWYgKGNmZi50b3BEaWN0Lmhhc05hbWUoXCJGb250TWF0cml4XCIpKSB7XG4gICAgICAgIHZhciBiYXNlID0gY2ZmLnRvcERpY3QuZ2V0QnlOYW1lKFwiRm9udE1hdHJpeFwiKTtcbiAgICAgICAgY2ZmLnRvcERpY3QucmVtb3ZlQnlOYW1lKFwiRm9udE1hdHJpeFwiKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2ZmLmZkQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIHZhciBzdWJEaWN0ID0gY2ZmLmZkQXJyYXlbaV07XG4gICAgICAgICAgdmFyIG1hdHJpeCA9IGJhc2Uuc2xpY2UoMCk7XG4gICAgICAgICAgaWYgKHN1YkRpY3QuaGFzTmFtZShcIkZvbnRNYXRyaXhcIikpIHtcbiAgICAgICAgICAgIG1hdHJpeCA9IFV0aWwudHJhbnNmb3JtKG1hdHJpeCwgc3ViRGljdC5nZXRCeU5hbWUoXCJGb250TWF0cml4XCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3ViRGljdC5zZXRCeU5hbWUoXCJGb250TWF0cml4XCIsIG1hdHJpeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjZmYudG9wRGljdC5zZXRCeU5hbWUoXCJjaGFyc2V0XCIsIDApO1xuICAgIHZhciBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKFxuICAgICAgW2NmZi50b3BEaWN0XSxcbiAgICAgIG91dHB1dC5sZW5ndGgsXG4gICAgICBjZmYuaXNDSURGb250XG4gICAgKTtcbiAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7XG4gICAgdmFyIHRvcERpY3RUcmFja2VyID0gY29tcGlsZWQudHJhY2tlcnNbMF07XG5cbiAgICB2YXIgc3RyaW5nSW5kZXggPSB0aGlzLmNvbXBpbGVTdHJpbmdJbmRleChjZmYuc3RyaW5ncy5zdHJpbmdzKTtcbiAgICBvdXRwdXQuYWRkKHN0cmluZ0luZGV4KTtcblxuICAgIHZhciBnbG9iYWxTdWJySW5kZXggPSB0aGlzLmNvbXBpbGVJbmRleChjZmYuZ2xvYmFsU3VickluZGV4KTtcbiAgICBvdXRwdXQuYWRkKGdsb2JhbFN1YnJJbmRleCk7XG5cbiAgICAvLyBOb3cgc3RhcnQgb24gdGhlIG90aGVyIGVudHJpZXMgdGhhdCBoYXZlIG5vIHNwZWNpZmljIG9yZGVyLlxuICAgIGlmIChjZmYuZW5jb2RpbmcgJiYgY2ZmLnRvcERpY3QuaGFzTmFtZShcIkVuY29kaW5nXCIpKSB7XG4gICAgICBpZiAoY2ZmLmVuY29kaW5nLnByZWRlZmluZWQpIHtcbiAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbihcbiAgICAgICAgICBcIkVuY29kaW5nXCIsXG4gICAgICAgICAgW2NmZi5lbmNvZGluZy5mb3JtYXRdLFxuICAgICAgICAgIG91dHB1dFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVuY29kaW5nID0gdGhpcy5jb21waWxlRW5jb2RpbmcoY2ZmLmVuY29kaW5nKTtcbiAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbihcIkVuY29kaW5nXCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTtcbiAgICAgICAgb3V0cHV0LmFkZChlbmNvZGluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjaGFyc2V0ID0gdGhpcy5jb21waWxlQ2hhcnNldChcbiAgICAgIGNmZi5jaGFyc2V0LFxuICAgICAgY2ZmLmNoYXJTdHJpbmdzLmNvdW50LFxuICAgICAgY2ZmLnN0cmluZ3MsXG4gICAgICBjZmYuaXNDSURGb250XG4gICAgKTtcbiAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKFwiY2hhcnNldFwiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7XG4gICAgb3V0cHV0LmFkZChjaGFyc2V0KTtcblxuICAgIHZhciBjaGFyU3RyaW5ncyA9IHRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGNmZi5jaGFyU3RyaW5ncyk7XG4gICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbihcIkNoYXJTdHJpbmdzXCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTtcbiAgICBvdXRwdXQuYWRkKGNoYXJTdHJpbmdzKTtcblxuICAgIGlmIChjZmYuaXNDSURGb250KSB7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gRkRTZWxlY3QgbXVzdCBiZSBpbiBmcm9udCBvZiBGREFycmF5IG9uIHdpbmRvd3MuIE9TWFxuICAgICAgLy8gYW5kIGxpbnV4IGRvbid0IHNlZW0gdG8gY2FyZS5cbiAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oXCJGRFNlbGVjdFwiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7XG4gICAgICB2YXIgZmRTZWxlY3QgPSB0aGlzLmNvbXBpbGVGRFNlbGVjdChjZmYuZmRTZWxlY3QpO1xuICAgICAgb3V0cHV0LmFkZChmZFNlbGVjdCk7XG4gICAgICAvLyBJdCBpcyB1bmNsZWFyIGlmIHRoZSBzdWIgZm9udCBkaWN0aW9uYXJ5IGNhbiBoYXZlIENJRCByZWxhdGVkXG4gICAgICAvLyBkaWN0aW9uYXJ5IGtleXMsIGJ1dCB0aGUgc2FuaXRpemVyIGRvZXNuJ3QgbGlrZSB0aGVtIHNvIHJlbW92ZSB0aGVtLlxuICAgICAgY29tcGlsZWQgPSB0aGlzLmNvbXBpbGVUb3BEaWN0cyhjZmYuZmRBcnJheSwgb3V0cHV0Lmxlbmd0aCwgdHJ1ZSk7XG4gICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKFwiRkRBcnJheVwiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7XG4gICAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7XG4gICAgICB2YXIgZm9udERpY3RUcmFja2VycyA9IGNvbXBpbGVkLnRyYWNrZXJzO1xuXG4gICAgICB0aGlzLmNvbXBpbGVQcml2YXRlRGljdHMoY2ZmLmZkQXJyYXksIGZvbnREaWN0VHJhY2tlcnMsIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKFtjZmYudG9wRGljdF0sIFt0b3BEaWN0VHJhY2tlcl0sIG91dHB1dCk7XG5cbiAgICAvLyBJZiB0aGUgZm9udCBkYXRhIGVuZHMgd2l0aCBJTkRFWCB3aG9zZSBvYmplY3QgZGF0YSBpcyB6ZXJvLWxlbmd0aCxcbiAgICAvLyB0aGUgc2FuaXRpemVyIHdpbGwgYmFpbCBvdXQuIEFkZCBhIGR1bW15IGJ5dGUgdG8gYXZvaWQgdGhhdC5cbiAgICBvdXRwdXQuYWRkKFswXSk7XG5cbiAgICByZXR1cm4gb3V0cHV0LmRhdGE7XG4gIH1cblxuICBlbmNvZGVOdW1iZXIodmFsdWUpIHtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuY29kZUludGVnZXIodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmNvZGVGbG9hdCh2YWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCkge1xuICAgIHJldHVybiBzaGFkb3coXG4gICAgICB0aGlzLFxuICAgICAgXCJFbmNvZGVGbG9hdFJlZ0V4cFwiLFxuICAgICAgL1xcLihcXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXFxkezAsMn0oPzplKC4rKXwkKS9cbiAgICApO1xuICB9XG5cbiAgZW5jb2RlRmxvYXQobnVtKSB7XG4gICAgdmFyIHZhbHVlID0gbnVtLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBSb3VuZGluZyBpbmFjY3VyYXRlIGRvdWJsZXMuXG4gICAgdmFyIG0gPSBDRkZDb21waWxlci5FbmNvZGVGbG9hdFJlZ0V4cC5leGVjKHZhbHVlKTtcbiAgICBpZiAobSkge1xuICAgICAgdmFyIGVwc2lsb24gPSBwYXJzZUZsb2F0KFwiMWVcIiArICgobVsyXSA/ICttWzJdIDogMCkgKyBtWzFdLmxlbmd0aCkpO1xuICAgICAgdmFsdWUgPSAoTWF0aC5yb3VuZChudW0gKiBlcHNpbG9uKSAvIGVwc2lsb24pLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgdmFyIG5pYmJsZXMgPSBcIlwiO1xuICAgIHZhciBpLCBpaTtcbiAgICBmb3IgKGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIHZhciBhID0gdmFsdWVbaV07XG4gICAgICBpZiAoYSA9PT0gXCJlXCIpIHtcbiAgICAgICAgbmliYmxlcyArPSB2YWx1ZVsrK2ldID09PSBcIi1cIiA/IFwiY1wiIDogXCJiXCI7XG4gICAgICB9IGVsc2UgaWYgKGEgPT09IFwiLlwiKSB7XG4gICAgICAgIG5pYmJsZXMgKz0gXCJhXCI7XG4gICAgICB9IGVsc2UgaWYgKGEgPT09IFwiLVwiKSB7XG4gICAgICAgIG5pYmJsZXMgKz0gXCJlXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuaWJibGVzICs9IGE7XG4gICAgICB9XG4gICAgfVxuICAgIG5pYmJsZXMgKz0gbmliYmxlcy5sZW5ndGggJiAxID8gXCJmXCIgOiBcImZmXCI7XG4gICAgdmFyIG91dCA9IFszMF07XG4gICAgZm9yIChpID0gMCwgaWkgPSBuaWJibGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIG91dC5wdXNoKHBhcnNlSW50KG5pYmJsZXMuc3Vic3RyaW5nKGksIGkgKyAyKSwgMTYpKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGVuY29kZUludGVnZXIodmFsdWUpIHtcbiAgICB2YXIgY29kZTtcbiAgICBpZiAodmFsdWUgPj0gLTEwNyAmJiB2YWx1ZSA8PSAxMDcpIHtcbiAgICAgIGNvZGUgPSBbdmFsdWUgKyAxMzldO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgLSAxMDg7XG4gICAgICBjb2RlID0gWyh2YWx1ZSA+PiA4KSArIDI0NywgdmFsdWUgJiAweGZmXTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0xMTMxICYmIHZhbHVlIDw9IC0xMDgpIHtcbiAgICAgIHZhbHVlID0gLXZhbHVlIC0gMTA4O1xuICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNTEsIHZhbHVlICYgMHhmZl07XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAtMzI3NjggJiYgdmFsdWUgPD0gMzI3NjcpIHtcbiAgICAgIGNvZGUgPSBbMHgxYywgKHZhbHVlID4+IDgpICYgMHhmZiwgdmFsdWUgJiAweGZmXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9IFtcbiAgICAgICAgMHgxZCxcbiAgICAgICAgKHZhbHVlID4+IDI0KSAmIDB4ZmYsXG4gICAgICAgICh2YWx1ZSA+PiAxNikgJiAweGZmLFxuICAgICAgICAodmFsdWUgPj4gOCkgJiAweGZmLFxuICAgICAgICB2YWx1ZSAmIDB4ZmYsXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIGNvbXBpbGVIZWFkZXIoaGVhZGVyKSB7XG4gICAgcmV0dXJuIFtoZWFkZXIubWFqb3IsIGhlYWRlci5taW5vciwgaGVhZGVyLmhkclNpemUsIGhlYWRlci5vZmZTaXplXTtcbiAgfVxuXG4gIGNvbXBpbGVOYW1lSW5kZXgobmFtZXMpIHtcbiAgICB2YXIgbmFtZUluZGV4ID0gbmV3IENGRkluZGV4KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIC8vIE9UUyBkb2Vzbid0IGFsbG93IG5hbWVzIHRvIGJlIG92ZXIgMTI3IGNoYXJhY3RlcnMuXG4gICAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7XG4gICAgICB2YXIgc2FuaXRpemVkTmFtZSA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7IGorKykge1xuICAgICAgICAvLyBPVFMgcmVxdWlyZXMgY2hhcnMgdG8gYmUgYmV0d2VlbiBhIHJhbmdlIGFuZCBub3QgY2VydGFpbiBvdGhlclxuICAgICAgICAvLyBjaGFycy5cbiAgICAgICAgdmFyIGNoYXIgPSBuYW1lW2pdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hhciA8IFwiIVwiIHx8XG4gICAgICAgICAgY2hhciA+IFwiflwiIHx8XG4gICAgICAgICAgY2hhciA9PT0gXCJbXCIgfHxcbiAgICAgICAgICBjaGFyID09PSBcIl1cIiB8fFxuICAgICAgICAgIGNoYXIgPT09IFwiKFwiIHx8XG4gICAgICAgICAgY2hhciA9PT0gXCIpXCIgfHxcbiAgICAgICAgICBjaGFyID09PSBcIntcIiB8fFxuICAgICAgICAgIGNoYXIgPT09IFwifVwiIHx8XG4gICAgICAgICAgY2hhciA9PT0gXCI8XCIgfHxcbiAgICAgICAgICBjaGFyID09PSBcIj5cIiB8fFxuICAgICAgICAgIGNoYXIgPT09IFwiL1wiIHx8XG4gICAgICAgICAgY2hhciA9PT0gXCIlXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY2hhciA9IFwiX1wiO1xuICAgICAgICB9XG4gICAgICAgIHNhbml0aXplZE5hbWVbal0gPSBjaGFyO1xuICAgICAgfVxuICAgICAgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplZE5hbWUuam9pbihcIlwiKTtcblxuICAgICAgaWYgKHNhbml0aXplZE5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgc2FuaXRpemVkTmFtZSA9IFwiQmFkX0ZvbnRfTmFtZVwiO1xuICAgICAgfVxuICAgICAgbmFtZUluZGV4LmFkZChzdHJpbmdUb0J5dGVzKHNhbml0aXplZE5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KG5hbWVJbmRleCk7XG4gIH1cblxuICBjb21waWxlVG9wRGljdHMoZGljdHMsIGxlbmd0aCwgcmVtb3ZlQ2lkS2V5cykge1xuICAgIHZhciBmb250RGljdFRyYWNrZXJzID0gW107XG4gICAgdmFyIGZkQXJyYXlJbmRleCA9IG5ldyBDRkZJbmRleCgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIHZhciBmb250RGljdCA9IGRpY3RzW2ldO1xuICAgICAgaWYgKHJlbW92ZUNpZEtleXMpIHtcbiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKFwiQ0lERm9udFZlcnNpb25cIik7XG4gICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZShcIkNJREZvbnRSZXZpc2lvblwiKTtcbiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKFwiQ0lERm9udFR5cGVcIik7XG4gICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZShcIkNJRENvdW50XCIpO1xuICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoXCJVSURCYXNlXCIpO1xuICAgICAgfVxuICAgICAgdmFyIGZvbnREaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7XG4gICAgICB2YXIgZm9udERpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChmb250RGljdCwgZm9udERpY3RUcmFja2VyKTtcbiAgICAgIGZvbnREaWN0VHJhY2tlcnMucHVzaChmb250RGljdFRyYWNrZXIpO1xuICAgICAgZmRBcnJheUluZGV4LmFkZChmb250RGljdERhdGEpO1xuICAgICAgZm9udERpY3RUcmFja2VyLm9mZnNldChsZW5ndGgpO1xuICAgIH1cbiAgICBmZEFycmF5SW5kZXggPSB0aGlzLmNvbXBpbGVJbmRleChmZEFycmF5SW5kZXgsIGZvbnREaWN0VHJhY2tlcnMpO1xuICAgIHJldHVybiB7XG4gICAgICB0cmFja2VyczogZm9udERpY3RUcmFja2VycyxcbiAgICAgIG91dHB1dDogZmRBcnJheUluZGV4LFxuICAgIH07XG4gIH1cblxuICBjb21waWxlUHJpdmF0ZURpY3RzKGRpY3RzLCB0cmFja2Vycywgb3V0cHV0KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGljdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgdmFyIGZvbnREaWN0ID0gZGljdHNbaV07XG4gICAgICB2YXIgcHJpdmF0ZURpY3QgPSBmb250RGljdC5wcml2YXRlRGljdDtcbiAgICAgIGlmICghcHJpdmF0ZURpY3QgfHwgIWZvbnREaWN0Lmhhc05hbWUoXCJQcml2YXRlXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlRoZXJlIG11c3QgYmUgYSBwcml2YXRlIGRpY3Rpb25hcnkuXCIpO1xuICAgICAgfVxuICAgICAgdmFyIHByaXZhdGVEaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7XG4gICAgICB2YXIgcHJpdmF0ZURpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChwcml2YXRlRGljdCwgcHJpdmF0ZURpY3RUcmFja2VyKTtcblxuICAgICAgdmFyIG91dHB1dExlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG4gICAgICBwcml2YXRlRGljdFRyYWNrZXIub2Zmc2V0KG91dHB1dExlbmd0aCk7XG4gICAgICBpZiAoIXByaXZhdGVEaWN0RGF0YS5sZW5ndGgpIHtcbiAgICAgICAgLy8gVGhlIHByaXZhdGUgZGljdGlvbmFyeSB3YXMgZW1wdHksIHNldCB0aGUgb3V0cHV0IGxlbmd0aCB0byB6ZXJvIHRvXG4gICAgICAgIC8vIGVuc3VyZSB0aGUgb2Zmc2V0IGxlbmd0aCBpc24ndCBvdXQgb2YgYm91bmRzIGluIHRoZSBleWVzIG9mIHRoZVxuICAgICAgICAvLyBzYW5pdGl6ZXIuXG4gICAgICAgIG91dHB1dExlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRyYWNrZXJzW2ldLnNldEVudHJ5TG9jYXRpb24oXG4gICAgICAgIFwiUHJpdmF0ZVwiLFxuICAgICAgICBbcHJpdmF0ZURpY3REYXRhLmxlbmd0aCwgb3V0cHV0TGVuZ3RoXSxcbiAgICAgICAgb3V0cHV0XG4gICAgICApO1xuICAgICAgb3V0cHV0LmFkZChwcml2YXRlRGljdERhdGEpO1xuXG4gICAgICBpZiAocHJpdmF0ZURpY3Quc3VicnNJbmRleCAmJiBwcml2YXRlRGljdC5oYXNOYW1lKFwiU3VicnNcIikpIHtcbiAgICAgICAgdmFyIHN1YnJzID0gdGhpcy5jb21waWxlSW5kZXgocHJpdmF0ZURpY3Quc3VicnNJbmRleCk7XG4gICAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKFxuICAgICAgICAgIFwiU3VicnNcIixcbiAgICAgICAgICBbcHJpdmF0ZURpY3REYXRhLmxlbmd0aF0sXG4gICAgICAgICAgb3V0cHV0XG4gICAgICAgICk7XG4gICAgICAgIG91dHB1dC5hZGQoc3VicnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbXBpbGVEaWN0KGRpY3QsIG9mZnNldFRyYWNrZXIpIHtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgLy8gVGhlIGRpY3Rpb25hcnkga2V5cyBtdXN0IGJlIGluIGEgY2VydGFpbiBvcmRlci5cbiAgICB2YXIgb3JkZXIgPSBkaWN0Lm9yZGVyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBvcmRlcltpXTtcbiAgICAgIGlmICghKGtleSBpbiBkaWN0LnZhbHVlcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWVzID0gZGljdC52YWx1ZXNba2V5XTtcbiAgICAgIHZhciB0eXBlcyA9IGRpY3QudHlwZXNba2V5XTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlcykpIHtcbiAgICAgICAgdHlwZXMgPSBbdHlwZXNdO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBhbnkgZW1wdHkgZGljdCB2YWx1ZXMuXG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gdHlwZXMubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2pdO1xuICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbal07XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJudW1cIjpcbiAgICAgICAgICBjYXNlIFwic2lkXCI6XG4gICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwib2Zmc2V0XCI6XG4gICAgICAgICAgICAvLyBGb3Igb2Zmc2V0cyB3ZSBqdXN0IGluc2VydCBhIDMyYml0IGludGVnZXIgc28gd2UgZG9uJ3QgaGF2ZSB0b1xuICAgICAgICAgICAgLy8gZGVhbCB3aXRoIGZpZ3VyaW5nIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBvZmZzZXQgd2hlbiBpdCBnZXRzXG4gICAgICAgICAgICAvLyByZXBsYWNlZCBsYXRlciBvbiBieSB0aGUgY29tcGlsZXIuXG4gICAgICAgICAgICB2YXIgbmFtZSA9IGRpY3Qua2V5VG9OYW1lTWFwW2tleV07XG4gICAgICAgICAgICAvLyBTb21lIG9mZnNldHMgaGF2ZSB0aGUgb2Zmc2V0IGFuZCB0aGUgbGVuZ3RoLCBzbyBqdXN0IHJlY29yZCB0aGVcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvbmUuXG4gICAgICAgICAgICBpZiAoIW9mZnNldFRyYWNrZXIuaXNUcmFja2luZyhuYW1lKSkge1xuICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLnRyYWNrKG5hbWUsIG91dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdChbMHgxZCwgMCwgMCwgMCwgMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgY2FzZSBcImRlbHRhXCI6XG4gICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMSwga2sgPSB2YWx1ZXMubGVuZ3RoOyBrIDwga2s7ICsraykge1xuICAgICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlc1trXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgb2YgJHt0eXBlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvdXQgPSBvdXQuY29uY2F0KGRpY3Qub3Bjb2Rlc1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGNvbXBpbGVTdHJpbmdJbmRleChzdHJpbmdzKSB7XG4gICAgdmFyIHN0cmluZ0luZGV4ID0gbmV3IENGRkluZGV4KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3RyaW5ncy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICBzdHJpbmdJbmRleC5hZGQoc3RyaW5nVG9CeXRlcyhzdHJpbmdzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChzdHJpbmdJbmRleCk7XG4gIH1cblxuICBjb21waWxlR2xvYmFsU3VickluZGV4KCkge1xuICAgIHZhciBnbG9iYWxTdWJySW5kZXggPSB0aGlzLmNmZi5nbG9iYWxTdWJySW5kZXg7XG4gICAgdGhpcy5vdXQud3JpdGVCeXRlQXJyYXkodGhpcy5jb21waWxlSW5kZXgoZ2xvYmFsU3VickluZGV4KSk7XG4gIH1cblxuICBjb21waWxlQ2hhclN0cmluZ3MoY2hhclN0cmluZ3MpIHtcbiAgICB2YXIgY2hhclN0cmluZ3NJbmRleCA9IG5ldyBDRkZJbmRleCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhclN0cmluZ3MuY291bnQ7IGkrKykge1xuICAgICAgdmFyIGdseXBoID0gY2hhclN0cmluZ3MuZ2V0KGkpO1xuICAgICAgLy8gSWYgdGhlIENoYXJTdHJpbmcgb3V0bGluZSBpcyBlbXB0eSwgcmVwbGFjZSBpdCB3aXRoIC5ub3RkZWYgdG9cbiAgICAgIC8vIHByZXZlbnQgT1RTIGZyb20gcmVqZWN0aW5nIHRoZSBmb250IChmaXhlcyBidWcxMjUyNDIwLnBkZikuXG4gICAgICBpZiAoZ2x5cGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKG5ldyBVaW50OEFycmF5KFsweDhiLCAweDBlXSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KGNoYXJTdHJpbmdzSW5kZXgpO1xuICB9XG5cbiAgY29tcGlsZUNoYXJzZXQoY2hhcnNldCwgbnVtR2x5cGhzLCBzdHJpbmdzLCBpc0NJREZvbnQpIHtcbiAgICAvLyBGcmVldHlwZSByZXF1aXJlcyB0aGUgbnVtYmVyIG9mIGNoYXJzZXQgc3RyaW5ncyBiZSBjb3JyZWN0IGFuZCBNYWNPU1xuICAgIC8vIHJlcXVpcmVzIGEgdmFsaWQgbWFwcGluZyBmb3IgcHJpbnRpbmcuXG4gICAgbGV0IG91dDtcbiAgICBjb25zdCBudW1HbHlwaHNMZXNzTm90RGVmID0gbnVtR2x5cGhzIC0gMTtcbiAgICBpZiAoaXNDSURGb250KSB7XG4gICAgICAvLyBJbiBhIENJRCBmb250LCB0aGUgY2hhcnNldCBpcyBhIG1hcHBpbmcgb2YgQ0lEcyBub3QgU0lEcyBzbyBqdXN0XG4gICAgICAvLyBjcmVhdGUgYW4gaWRlbnRpdHkgbWFwcGluZy5cbiAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgMiwgLy8gZm9ybWF0XG4gICAgICAgIDAsIC8vIGZpcnN0IENJRCB1cHBlciBieXRlXG4gICAgICAgIDAsIC8vIGZpcnN0IENJRCBsb3dlciBieXRlXG4gICAgICAgIChudW1HbHlwaHNMZXNzTm90RGVmID4+IDgpICYgMHhmZixcbiAgICAgICAgbnVtR2x5cGhzTGVzc05vdERlZiAmIDB4ZmYsXG4gICAgICBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGVuZ3RoID0gMSArIG51bUdseXBoc0xlc3NOb3REZWYgKiAyO1xuICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICAgIG91dFswXSA9IDA7IC8vIGZvcm1hdCAwXG4gICAgICBsZXQgY2hhcnNldEluZGV4ID0gMDtcbiAgICAgIGNvbnN0IG51bUNoYXJzZXRzID0gY2hhcnNldC5jaGFyc2V0Lmxlbmd0aDtcbiAgICAgIGxldCB3YXJuZWQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGxldCBzaWQgPSAwO1xuICAgICAgICBpZiAoY2hhcnNldEluZGV4IDwgbnVtQ2hhcnNldHMpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gY2hhcnNldC5jaGFyc2V0W2NoYXJzZXRJbmRleCsrXTtcbiAgICAgICAgICBzaWQgPSBzdHJpbmdzLmdldFNJRChuYW1lKTtcbiAgICAgICAgICBpZiAoc2lkID09PSAtMSkge1xuICAgICAgICAgICAgc2lkID0gMDtcbiAgICAgICAgICAgIGlmICghd2FybmVkKSB7XG4gICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgIHdhcm4oYENvdWxkbid0IGZpbmQgJHtuYW1lfSBpbiBDRkYgc3RyaW5nc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRbaV0gPSAoc2lkID4+IDgpICYgMHhmZjtcbiAgICAgICAgb3V0W2kgKyAxXSA9IHNpZCAmIDB4ZmY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KG91dCk7XG4gIH1cblxuICBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShlbmNvZGluZy5yYXcpO1xuICB9XG5cbiAgY29tcGlsZUZEU2VsZWN0KGZkU2VsZWN0KSB7XG4gICAgY29uc3QgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0O1xuICAgIGxldCBvdXQsIGk7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoMSArIGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aCk7XG4gICAgICAgIG91dFswXSA9IGZvcm1hdDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb3V0W2kgKyAxXSA9IGZkU2VsZWN0LmZkU2VsZWN0W2ldO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBjb25zdCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTtcbiAgICAgICAgY29uc3QgcmFuZ2VzID0gW1xuICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAwLCAvLyBuUmFuZ2VzIHBsYWNlIGhvbGRlclxuICAgICAgICAgIDAsIC8vIG5SYW5nZXMgcGxhY2UgaG9sZGVyXG4gICAgICAgICAgKHN0YXJ0ID4+IDgpICYgMHhmZixcbiAgICAgICAgICBzdGFydCAmIDB4ZmYsXG4gICAgICAgICAgbGFzdEZELFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFtpXTtcbiAgICAgICAgICBpZiAoY3VycmVudEZEICE9PSBsYXN0RkQpIHtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKChpID4+IDgpICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7XG4gICAgICAgICAgICBsYXN0RkQgPSBjdXJyZW50RkQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDMgYnl0ZXMgYXJlIHB1c2hlZCBmb3IgZXZlcnkgcmFuZ2UgYW5kIHRoZXJlIGFyZSAzIGhlYWRlciBieXRlcy5cbiAgICAgICAgY29uc3QgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7XG4gICAgICAgIHJhbmdlc1sxXSA9IChudW1SYW5nZXMgPj4gOCkgJiAweGZmO1xuICAgICAgICByYW5nZXNbMl0gPSBudW1SYW5nZXMgJiAweGZmO1xuICAgICAgICAvLyBzZW50aW5lbFxuICAgICAgICByYW5nZXMucHVzaCgoaSA+PiA4KSAmIDB4ZmYsIGkgJiAweGZmKTtcbiAgICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkocmFuZ2VzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KG91dCk7XG4gIH1cblxuICBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgb3V0W2ldID0gZGF0YVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGNvbXBpbGVJbmRleChpbmRleCwgdHJhY2tlcnMgPSBbXSkge1xuICAgIHZhciBvYmplY3RzID0gaW5kZXgub2JqZWN0cztcbiAgICAvLyBGaXJzdCAyIGJ5dGVzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBjb250YWluZWQgaW50byB0aGlzIGluZGV4XG4gICAgdmFyIGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBvYmplY3QsIGp1c3QgY3JlYXRlIGFuIGluZGV4LiBUaGlzIHRlY2huaWNhbGx5XG4gICAgLy8gc2hvdWxkIGp1c3QgYmUgWzAsIDBdIGJ1dCBPVFMgaGFzIGFuIGlzc3VlIHdpdGggdGhhdC5cbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBbMCwgMCwgMF07XG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSBbKGNvdW50ID4+IDgpICYgMHhmZiwgY291bnQgJiAweGZmXTtcblxuICAgIHZhciBsYXN0T2Zmc2V0ID0gMSxcbiAgICAgIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgIGxhc3RPZmZzZXQgKz0gb2JqZWN0c1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldFNpemU7XG4gICAgaWYgKGxhc3RPZmZzZXQgPCAweDEwMCkge1xuICAgICAgb2Zmc2V0U2l6ZSA9IDE7XG4gICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMCkge1xuICAgICAgb2Zmc2V0U2l6ZSA9IDI7XG4gICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMDAwKSB7XG4gICAgICBvZmZzZXRTaXplID0gMztcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0U2l6ZSA9IDQ7XG4gICAgfVxuXG4gICAgLy8gTmV4dCBieXRlIGNvbnRhaW5zIHRoZSBvZmZzZXQgc2l6ZSB1c2UgdG8gcmVmZXJlbmNlIG9iamVjdCBpbiB0aGUgZmlsZVxuICAgIGRhdGEucHVzaChvZmZzZXRTaXplKTtcblxuICAgIC8vIEFkZCBhbm90aGVyIG9mZnNldCBhZnRlciB0aGlzIG9uZSBiZWNhdXNlIHdlIG5lZWQgYSBuZXcgb2Zmc2V0XG4gICAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gMTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgKyAxOyBpKyspIHtcbiAgICAgIGlmIChvZmZzZXRTaXplID09PSAxKSB7XG4gICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpO1xuICAgICAgfSBlbHNlIGlmIChvZmZzZXRTaXplID09PSAyKSB7XG4gICAgICAgIGRhdGEucHVzaCgocmVsYXRpdmVPZmZzZXQgPj4gOCkgJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpO1xuICAgICAgfSBlbHNlIGlmIChvZmZzZXRTaXplID09PSAzKSB7XG4gICAgICAgIGRhdGEucHVzaChcbiAgICAgICAgICAocmVsYXRpdmVPZmZzZXQgPj4gMTYpICYgMHhmZixcbiAgICAgICAgICAocmVsYXRpdmVPZmZzZXQgPj4gOCkgJiAweGZmLFxuICAgICAgICAgIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5wdXNoKFxuICAgICAgICAgIChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQpICYgMHhmZixcbiAgICAgICAgICAocmVsYXRpdmVPZmZzZXQgPj4gMTYpICYgMHhmZixcbiAgICAgICAgICAocmVsYXRpdmVPZmZzZXQgPj4gOCkgJiAweGZmLFxuICAgICAgICAgIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAob2JqZWN0c1tpXSkge1xuICAgICAgICByZWxhdGl2ZU9mZnNldCArPSBvYmplY3RzW2ldLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgLy8gTm90aWZ5IHRoZSB0cmFja2VyIHdoZXJlIHRoZSBvYmplY3Qgd2lsbCBiZSBvZmZzZXQgaW4gdGhlIGRhdGEuXG4gICAgICBpZiAodHJhY2tlcnNbaV0pIHtcbiAgICAgICAgdHJhY2tlcnNbaV0ub2Zmc2V0KGRhdGEubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IG9iamVjdHNbaV0ubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBkYXRhLnB1c2gob2JqZWN0c1tpXVtqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIENGRlN0YW5kYXJkU3RyaW5ncyxcbiAgQ0ZGUGFyc2VyLFxuICBDRkYsXG4gIENGRkhlYWRlcixcbiAgQ0ZGU3RyaW5ncyxcbiAgQ0ZGSW5kZXgsXG4gIENGRkNoYXJzZXQsXG4gIENGRlRvcERpY3QsXG4gIENGRlByaXZhdGVEaWN0LFxuICBDRkZDb21waWxlcixcbiAgQ0ZGRkRTZWxlY3QsXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IElTT0Fkb2JlQ2hhcnNldCA9IFtcbiAgXCIubm90ZGVmXCIsIFwic3BhY2VcIiwgXCJleGNsYW1cIiwgXCJxdW90ZWRibFwiLCBcIm51bWJlcnNpZ25cIiwgXCJkb2xsYXJcIixcbiAgXCJwZXJjZW50XCIsIFwiYW1wZXJzYW5kXCIsIFwicXVvdGVyaWdodFwiLCBcInBhcmVubGVmdFwiLCBcInBhcmVucmlnaHRcIixcbiAgXCJhc3Rlcmlza1wiLCBcInBsdXNcIiwgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcInNsYXNoXCIsIFwiemVyb1wiLFxuICBcIm9uZVwiLCBcInR3b1wiLCBcInRocmVlXCIsIFwiZm91clwiLCBcImZpdmVcIiwgXCJzaXhcIiwgXCJzZXZlblwiLCBcImVpZ2h0XCIsXG4gIFwibmluZVwiLCBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsIFwibGVzc1wiLCBcImVxdWFsXCIsIFwiZ3JlYXRlclwiLCBcInF1ZXN0aW9uXCIsXG4gIFwiYXRcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIiwgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsXG4gIFwiTlwiLCBcIk9cIiwgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIiwgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLFxuICBcImJyYWNrZXRsZWZ0XCIsIFwiYmFja3NsYXNoXCIsIFwiYnJhY2tldHJpZ2h0XCIsIFwiYXNjaWljaXJjdW1cIiwgXCJ1bmRlcnNjb3JlXCIsXG4gIFwicXVvdGVsZWZ0XCIsIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiwgXCJmXCIsIFwiZ1wiLCBcImhcIiwgXCJpXCIsIFwialwiLCBcImtcIiwgXCJsXCIsXG4gIFwibVwiLCBcIm5cIiwgXCJvXCIsIFwicFwiLCBcInFcIiwgXCJyXCIsIFwic1wiLCBcInRcIiwgXCJ1XCIsIFwidlwiLCBcIndcIiwgXCJ4XCIsIFwieVwiLCBcInpcIixcbiAgXCJicmFjZWxlZnRcIiwgXCJiYXJcIiwgXCJicmFjZXJpZ2h0XCIsIFwiYXNjaWl0aWxkZVwiLCBcImV4Y2xhbWRvd25cIiwgXCJjZW50XCIsXG4gIFwic3RlcmxpbmdcIiwgXCJmcmFjdGlvblwiLCBcInllblwiLCBcImZsb3JpblwiLCBcInNlY3Rpb25cIiwgXCJjdXJyZW5jeVwiLFxuICBcInF1b3Rlc2luZ2xlXCIsIFwicXVvdGVkYmxsZWZ0XCIsIFwiZ3VpbGxlbW90bGVmdFwiLCBcImd1aWxzaW5nbGxlZnRcIixcbiAgXCJndWlsc2luZ2xyaWdodFwiLCBcImZpXCIsIFwiZmxcIiwgXCJlbmRhc2hcIiwgXCJkYWdnZXJcIiwgXCJkYWdnZXJkYmxcIixcbiAgXCJwZXJpb2RjZW50ZXJlZFwiLCBcInBhcmFncmFwaFwiLCBcImJ1bGxldFwiLCBcInF1b3Rlc2luZ2xiYXNlXCIsXG4gIFwicXVvdGVkYmxiYXNlXCIsIFwicXVvdGVkYmxyaWdodFwiLCBcImd1aWxsZW1vdHJpZ2h0XCIsIFwiZWxsaXBzaXNcIixcbiAgXCJwZXJ0aG91c2FuZFwiLCBcInF1ZXN0aW9uZG93blwiLCBcImdyYXZlXCIsIFwiYWN1dGVcIiwgXCJjaXJjdW1mbGV4XCIsIFwidGlsZGVcIixcbiAgXCJtYWNyb25cIiwgXCJicmV2ZVwiLCBcImRvdGFjY2VudFwiLCBcImRpZXJlc2lzXCIsIFwicmluZ1wiLCBcImNlZGlsbGFcIixcbiAgXCJodW5nYXJ1bWxhdXRcIiwgXCJvZ29uZWtcIiwgXCJjYXJvblwiLCBcImVtZGFzaFwiLCBcIkFFXCIsIFwib3JkZmVtaW5pbmVcIixcbiAgXCJMc2xhc2hcIiwgXCJPc2xhc2hcIiwgXCJPRVwiLCBcIm9yZG1hc2N1bGluZVwiLCBcImFlXCIsIFwiZG90bGVzc2lcIiwgXCJsc2xhc2hcIixcbiAgXCJvc2xhc2hcIiwgXCJvZVwiLCBcImdlcm1hbmRibHNcIiwgXCJvbmVzdXBlcmlvclwiLCBcImxvZ2ljYWxub3RcIiwgXCJtdVwiLFxuICBcInRyYWRlbWFya1wiLCBcIkV0aFwiLCBcIm9uZWhhbGZcIiwgXCJwbHVzbWludXNcIiwgXCJUaG9yblwiLCBcIm9uZXF1YXJ0ZXJcIixcbiAgXCJkaXZpZGVcIiwgXCJicm9rZW5iYXJcIiwgXCJkZWdyZWVcIiwgXCJ0aG9yblwiLCBcInRocmVlcXVhcnRlcnNcIiwgXCJ0d29zdXBlcmlvclwiLFxuICBcInJlZ2lzdGVyZWRcIiwgXCJtaW51c1wiLCBcImV0aFwiLCBcIm11bHRpcGx5XCIsIFwidGhyZWVzdXBlcmlvclwiLCBcImNvcHlyaWdodFwiLFxuICBcIkFhY3V0ZVwiLCBcIkFjaXJjdW1mbGV4XCIsIFwiQWRpZXJlc2lzXCIsIFwiQWdyYXZlXCIsIFwiQXJpbmdcIiwgXCJBdGlsZGVcIixcbiAgXCJDY2VkaWxsYVwiLCBcIkVhY3V0ZVwiLCBcIkVjaXJjdW1mbGV4XCIsIFwiRWRpZXJlc2lzXCIsIFwiRWdyYXZlXCIsIFwiSWFjdXRlXCIsXG4gIFwiSWNpcmN1bWZsZXhcIiwgXCJJZGllcmVzaXNcIiwgXCJJZ3JhdmVcIiwgXCJOdGlsZGVcIiwgXCJPYWN1dGVcIiwgXCJPY2lyY3VtZmxleFwiLFxuICBcIk9kaWVyZXNpc1wiLCBcIk9ncmF2ZVwiLCBcIk90aWxkZVwiLCBcIlNjYXJvblwiLCBcIlVhY3V0ZVwiLCBcIlVjaXJjdW1mbGV4XCIsXG4gIFwiVWRpZXJlc2lzXCIsIFwiVWdyYXZlXCIsIFwiWWFjdXRlXCIsIFwiWWRpZXJlc2lzXCIsIFwiWmNhcm9uXCIsIFwiYWFjdXRlXCIsXG4gIFwiYWNpcmN1bWZsZXhcIiwgXCJhZGllcmVzaXNcIiwgXCJhZ3JhdmVcIiwgXCJhcmluZ1wiLCBcImF0aWxkZVwiLCBcImNjZWRpbGxhXCIsXG4gIFwiZWFjdXRlXCIsIFwiZWNpcmN1bWZsZXhcIiwgXCJlZGllcmVzaXNcIiwgXCJlZ3JhdmVcIiwgXCJpYWN1dGVcIiwgXCJpY2lyY3VtZmxleFwiLFxuICBcImlkaWVyZXNpc1wiLCBcImlncmF2ZVwiLCBcIm50aWxkZVwiLCBcIm9hY3V0ZVwiLCBcIm9jaXJjdW1mbGV4XCIsIFwib2RpZXJlc2lzXCIsXG4gIFwib2dyYXZlXCIsIFwib3RpbGRlXCIsIFwic2Nhcm9uXCIsIFwidWFjdXRlXCIsIFwidWNpcmN1bWZsZXhcIiwgXCJ1ZGllcmVzaXNcIixcbiAgXCJ1Z3JhdmVcIiwgXCJ5YWN1dGVcIiwgXCJ5ZGllcmVzaXNcIiwgXCJ6Y2Fyb25cIlxuXTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBFeHBlcnRDaGFyc2V0ID0gW1xuICBcIi5ub3RkZWZcIiwgXCJzcGFjZVwiLCBcImV4Y2xhbXNtYWxsXCIsIFwiSHVuZ2FydW1sYXV0c21hbGxcIiwgXCJkb2xsYXJvbGRzdHlsZVwiLFxuICBcImRvbGxhcnN1cGVyaW9yXCIsIFwiYW1wZXJzYW5kc21hbGxcIiwgXCJBY3V0ZXNtYWxsXCIsIFwicGFyZW5sZWZ0c3VwZXJpb3JcIixcbiAgXCJwYXJlbnJpZ2h0c3VwZXJpb3JcIiwgXCJ0d29kb3RlbmxlYWRlclwiLCBcIm9uZWRvdGVubGVhZGVyXCIsIFwiY29tbWFcIixcbiAgXCJoeXBoZW5cIiwgXCJwZXJpb2RcIiwgXCJmcmFjdGlvblwiLCBcInplcm9vbGRzdHlsZVwiLCBcIm9uZW9sZHN0eWxlXCIsXG4gIFwidHdvb2xkc3R5bGVcIiwgXCJ0aHJlZW9sZHN0eWxlXCIsIFwiZm91cm9sZHN0eWxlXCIsIFwiZml2ZW9sZHN0eWxlXCIsXG4gIFwic2l4b2xkc3R5bGVcIiwgXCJzZXZlbm9sZHN0eWxlXCIsIFwiZWlnaHRvbGRzdHlsZVwiLCBcIm5pbmVvbGRzdHlsZVwiLFxuICBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsIFwiY29tbWFzdXBlcmlvclwiLCBcInRocmVlcXVhcnRlcnNlbWRhc2hcIixcbiAgXCJwZXJpb2RzdXBlcmlvclwiLCBcInF1ZXN0aW9uc21hbGxcIiwgXCJhc3VwZXJpb3JcIiwgXCJic3VwZXJpb3JcIixcbiAgXCJjZW50c3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIiwgXCJlc3VwZXJpb3JcIiwgXCJpc3VwZXJpb3JcIiwgXCJsc3VwZXJpb3JcIixcbiAgXCJtc3VwZXJpb3JcIiwgXCJuc3VwZXJpb3JcIiwgXCJvc3VwZXJpb3JcIiwgXCJyc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIixcbiAgXCJ0c3VwZXJpb3JcIiwgXCJmZlwiLCBcImZpXCIsIFwiZmxcIiwgXCJmZmlcIiwgXCJmZmxcIiwgXCJwYXJlbmxlZnRpbmZlcmlvclwiLFxuICBcInBhcmVucmlnaHRpbmZlcmlvclwiLCBcIkNpcmN1bWZsZXhzbWFsbFwiLCBcImh5cGhlbnN1cGVyaW9yXCIsIFwiR3JhdmVzbWFsbFwiLFxuICBcIkFzbWFsbFwiLCBcIkJzbWFsbFwiLCBcIkNzbWFsbFwiLCBcIkRzbWFsbFwiLCBcIkVzbWFsbFwiLCBcIkZzbWFsbFwiLCBcIkdzbWFsbFwiLFxuICBcIkhzbWFsbFwiLCBcIklzbWFsbFwiLCBcIkpzbWFsbFwiLCBcIktzbWFsbFwiLCBcIkxzbWFsbFwiLCBcIk1zbWFsbFwiLCBcIk5zbWFsbFwiLFxuICBcIk9zbWFsbFwiLCBcIlBzbWFsbFwiLCBcIlFzbWFsbFwiLCBcIlJzbWFsbFwiLCBcIlNzbWFsbFwiLCBcIlRzbWFsbFwiLCBcIlVzbWFsbFwiLFxuICBcIlZzbWFsbFwiLCBcIldzbWFsbFwiLCBcIlhzbWFsbFwiLCBcIllzbWFsbFwiLCBcIlpzbWFsbFwiLCBcImNvbG9ubW9uZXRhcnlcIixcbiAgXCJvbmVmaXR0ZWRcIiwgXCJydXBpYWhcIiwgXCJUaWxkZXNtYWxsXCIsIFwiZXhjbGFtZG93bnNtYWxsXCIsIFwiY2VudG9sZHN0eWxlXCIsXG4gIFwiTHNsYXNoc21hbGxcIiwgXCJTY2Fyb25zbWFsbFwiLCBcIlpjYXJvbnNtYWxsXCIsIFwiRGllcmVzaXNzbWFsbFwiLFxuICBcIkJyZXZlc21hbGxcIiwgXCJDYXJvbnNtYWxsXCIsIFwiRG90YWNjZW50c21hbGxcIiwgXCJNYWNyb25zbWFsbFwiLFxuICBcImZpZ3VyZWRhc2hcIiwgXCJoeXBoZW5pbmZlcmlvclwiLCBcIk9nb25la3NtYWxsXCIsIFwiUmluZ3NtYWxsXCIsXG4gIFwiQ2VkaWxsYXNtYWxsXCIsIFwib25lcXVhcnRlclwiLCBcIm9uZWhhbGZcIiwgXCJ0aHJlZXF1YXJ0ZXJzXCIsXG4gIFwicXVlc3Rpb25kb3duc21hbGxcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLFxuICBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiemVyb3N1cGVyaW9yXCIsIFwib25lc3VwZXJpb3JcIixcbiAgXCJ0d29zdXBlcmlvclwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIixcbiAgXCJzaXhzdXBlcmlvclwiLCBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsIFwibmluZXN1cGVyaW9yXCIsXG4gIFwiemVyb2luZmVyaW9yXCIsIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLCBcInRocmVlaW5mZXJpb3JcIixcbiAgXCJmb3VyaW5mZXJpb3JcIiwgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIixcbiAgXCJlaWdodGluZmVyaW9yXCIsIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsIFwiZG9sbGFyaW5mZXJpb3JcIixcbiAgXCJwZXJpb2RpbmZlcmlvclwiLCBcImNvbW1haW5mZXJpb3JcIiwgXCJBZ3JhdmVzbWFsbFwiLCBcIkFhY3V0ZXNtYWxsXCIsXG4gIFwiQWNpcmN1bWZsZXhzbWFsbFwiLCBcIkF0aWxkZXNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIiwgXCJBcmluZ3NtYWxsXCIsXG4gIFwiQUVzbWFsbFwiLCBcIkNjZWRpbGxhc21hbGxcIiwgXCJFZ3JhdmVzbWFsbFwiLCBcIkVhY3V0ZXNtYWxsXCIsXG4gIFwiRWNpcmN1bWZsZXhzbWFsbFwiLCBcIkVkaWVyZXNpc3NtYWxsXCIsIFwiSWdyYXZlc21hbGxcIiwgXCJJYWN1dGVzbWFsbFwiLFxuICBcIkljaXJjdW1mbGV4c21hbGxcIiwgXCJJZGllcmVzaXNzbWFsbFwiLCBcIkV0aHNtYWxsXCIsIFwiTnRpbGRlc21hbGxcIixcbiAgXCJPZ3JhdmVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsIFwiT2NpcmN1bWZsZXhzbWFsbFwiLCBcIk90aWxkZXNtYWxsXCIsXG4gIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPRXNtYWxsXCIsIFwiT3NsYXNoc21hbGxcIiwgXCJVZ3JhdmVzbWFsbFwiLCBcIlVhY3V0ZXNtYWxsXCIsXG4gIFwiVWNpcmN1bWZsZXhzbWFsbFwiLCBcIlVkaWVyZXNpc3NtYWxsXCIsIFwiWWFjdXRlc21hbGxcIiwgXCJUaG9ybnNtYWxsXCIsXG4gIFwiWWRpZXJlc2lzc21hbGxcIlxuXTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBFeHBlcnRTdWJzZXRDaGFyc2V0ID0gW1xuICBcIi5ub3RkZWZcIiwgXCJzcGFjZVwiLCBcImRvbGxhcm9sZHN0eWxlXCIsIFwiZG9sbGFyc3VwZXJpb3JcIixcbiAgXCJwYXJlbmxlZnRzdXBlcmlvclwiLCBcInBhcmVucmlnaHRzdXBlcmlvclwiLCBcInR3b2RvdGVubGVhZGVyXCIsXG4gIFwib25lZG90ZW5sZWFkZXJcIiwgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcImZyYWN0aW9uXCIsXG4gIFwiemVyb29sZHN0eWxlXCIsIFwib25lb2xkc3R5bGVcIiwgXCJ0d29vbGRzdHlsZVwiLCBcInRocmVlb2xkc3R5bGVcIixcbiAgXCJmb3Vyb2xkc3R5bGVcIiwgXCJmaXZlb2xkc3R5bGVcIiwgXCJzaXhvbGRzdHlsZVwiLCBcInNldmVub2xkc3R5bGVcIixcbiAgXCJlaWdodG9sZHN0eWxlXCIsIFwibmluZW9sZHN0eWxlXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIiwgXCJjb21tYXN1cGVyaW9yXCIsXG4gIFwidGhyZWVxdWFydGVyc2VtZGFzaFwiLCBcInBlcmlvZHN1cGVyaW9yXCIsIFwiYXN1cGVyaW9yXCIsIFwiYnN1cGVyaW9yXCIsXG4gIFwiY2VudHN1cGVyaW9yXCIsIFwiZHN1cGVyaW9yXCIsIFwiZXN1cGVyaW9yXCIsIFwiaXN1cGVyaW9yXCIsIFwibHN1cGVyaW9yXCIsXG4gIFwibXN1cGVyaW9yXCIsIFwibnN1cGVyaW9yXCIsIFwib3N1cGVyaW9yXCIsIFwicnN1cGVyaW9yXCIsIFwic3N1cGVyaW9yXCIsXG4gIFwidHN1cGVyaW9yXCIsIFwiZmZcIiwgXCJmaVwiLCBcImZsXCIsIFwiZmZpXCIsIFwiZmZsXCIsIFwicGFyZW5sZWZ0aW5mZXJpb3JcIixcbiAgXCJwYXJlbnJpZ2h0aW5mZXJpb3JcIiwgXCJoeXBoZW5zdXBlcmlvclwiLCBcImNvbG9ubW9uZXRhcnlcIiwgXCJvbmVmaXR0ZWRcIixcbiAgXCJydXBpYWhcIiwgXCJjZW50b2xkc3R5bGVcIiwgXCJmaWd1cmVkYXNoXCIsIFwiaHlwaGVuaW5mZXJpb3JcIiwgXCJvbmVxdWFydGVyXCIsXG4gIFwib25laGFsZlwiLCBcInRocmVlcXVhcnRlcnNcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLFxuICBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiemVyb3N1cGVyaW9yXCIsIFwib25lc3VwZXJpb3JcIixcbiAgXCJ0d29zdXBlcmlvclwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIixcbiAgXCJzaXhzdXBlcmlvclwiLCBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsIFwibmluZXN1cGVyaW9yXCIsXG4gIFwiemVyb2luZmVyaW9yXCIsIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLCBcInRocmVlaW5mZXJpb3JcIixcbiAgXCJmb3VyaW5mZXJpb3JcIiwgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIixcbiAgXCJlaWdodGluZmVyaW9yXCIsIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsIFwiZG9sbGFyaW5mZXJpb3JcIixcbiAgXCJwZXJpb2RpbmZlcmlvclwiLCBcImNvbW1haW5mZXJpb3JcIlxuXTtcblxuZXhwb3J0IHsgSVNPQWRvYmVDaGFyc2V0LCBFeHBlcnRDaGFyc2V0LCBFeHBlcnRTdWJzZXRDaGFyc2V0IH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBFeHBlcnRFbmNvZGluZyA9IFtcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJzcGFjZVwiLCBcImV4Y2xhbXNtYWxsXCIsIFwiSHVuZ2FydW1sYXV0c21hbGxcIiwgXCJcIiwgXCJkb2xsYXJvbGRzdHlsZVwiLFxuICBcImRvbGxhcnN1cGVyaW9yXCIsIFwiYW1wZXJzYW5kc21hbGxcIiwgXCJBY3V0ZXNtYWxsXCIsIFwicGFyZW5sZWZ0c3VwZXJpb3JcIixcbiAgXCJwYXJlbnJpZ2h0c3VwZXJpb3JcIiwgXCJ0d29kb3RlbmxlYWRlclwiLCBcIm9uZWRvdGVubGVhZGVyXCIsIFwiY29tbWFcIixcbiAgXCJoeXBoZW5cIiwgXCJwZXJpb2RcIiwgXCJmcmFjdGlvblwiLCBcInplcm9vbGRzdHlsZVwiLCBcIm9uZW9sZHN0eWxlXCIsXG4gIFwidHdvb2xkc3R5bGVcIiwgXCJ0aHJlZW9sZHN0eWxlXCIsIFwiZm91cm9sZHN0eWxlXCIsIFwiZml2ZW9sZHN0eWxlXCIsXG4gIFwic2l4b2xkc3R5bGVcIiwgXCJzZXZlbm9sZHN0eWxlXCIsIFwiZWlnaHRvbGRzdHlsZVwiLCBcIm5pbmVvbGRzdHlsZVwiLCBcImNvbG9uXCIsXG4gIFwic2VtaWNvbG9uXCIsIFwiY29tbWFzdXBlcmlvclwiLCBcInRocmVlcXVhcnRlcnNlbWRhc2hcIiwgXCJwZXJpb2RzdXBlcmlvclwiLFxuICBcInF1ZXN0aW9uc21hbGxcIiwgXCJcIiwgXCJhc3VwZXJpb3JcIiwgXCJic3VwZXJpb3JcIiwgXCJjZW50c3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIixcbiAgXCJlc3VwZXJpb3JcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJpc3VwZXJpb3JcIiwgXCJcIiwgXCJcIiwgXCJsc3VwZXJpb3JcIiwgXCJtc3VwZXJpb3JcIixcbiAgXCJuc3VwZXJpb3JcIiwgXCJvc3VwZXJpb3JcIiwgXCJcIiwgXCJcIiwgXCJyc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIiwgXCJ0c3VwZXJpb3JcIixcbiAgXCJcIiwgXCJmZlwiLCBcImZpXCIsIFwiZmxcIiwgXCJmZmlcIiwgXCJmZmxcIiwgXCJwYXJlbmxlZnRpbmZlcmlvclwiLCBcIlwiLFxuICBcInBhcmVucmlnaHRpbmZlcmlvclwiLCBcIkNpcmN1bWZsZXhzbWFsbFwiLCBcImh5cGhlbnN1cGVyaW9yXCIsIFwiR3JhdmVzbWFsbFwiLFxuICBcIkFzbWFsbFwiLCBcIkJzbWFsbFwiLCBcIkNzbWFsbFwiLCBcIkRzbWFsbFwiLCBcIkVzbWFsbFwiLCBcIkZzbWFsbFwiLCBcIkdzbWFsbFwiLFxuICBcIkhzbWFsbFwiLCBcIklzbWFsbFwiLCBcIkpzbWFsbFwiLCBcIktzbWFsbFwiLCBcIkxzbWFsbFwiLCBcIk1zbWFsbFwiLCBcIk5zbWFsbFwiLFxuICBcIk9zbWFsbFwiLCBcIlBzbWFsbFwiLCBcIlFzbWFsbFwiLCBcIlJzbWFsbFwiLCBcIlNzbWFsbFwiLCBcIlRzbWFsbFwiLCBcIlVzbWFsbFwiLFxuICBcIlZzbWFsbFwiLCBcIldzbWFsbFwiLCBcIlhzbWFsbFwiLCBcIllzbWFsbFwiLCBcIlpzbWFsbFwiLCBcImNvbG9ubW9uZXRhcnlcIixcbiAgXCJvbmVmaXR0ZWRcIiwgXCJydXBpYWhcIiwgXCJUaWxkZXNtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiZXhjbGFtZG93bnNtYWxsXCIsIFwiY2VudG9sZHN0eWxlXCIsIFwiTHNsYXNoc21hbGxcIixcbiAgXCJcIiwgXCJcIiwgXCJTY2Fyb25zbWFsbFwiLCBcIlpjYXJvbnNtYWxsXCIsIFwiRGllcmVzaXNzbWFsbFwiLCBcIkJyZXZlc21hbGxcIixcbiAgXCJDYXJvbnNtYWxsXCIsIFwiXCIsIFwiRG90YWNjZW50c21hbGxcIiwgXCJcIiwgXCJcIiwgXCJNYWNyb25zbWFsbFwiLCBcIlwiLCBcIlwiLFxuICBcImZpZ3VyZWRhc2hcIiwgXCJoeXBoZW5pbmZlcmlvclwiLCBcIlwiLCBcIlwiLCBcIk9nb25la3NtYWxsXCIsIFwiUmluZ3NtYWxsXCIsXG4gIFwiQ2VkaWxsYXNtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwib25lcXVhcnRlclwiLCBcIm9uZWhhbGZcIiwgXCJ0aHJlZXF1YXJ0ZXJzXCIsXG4gIFwicXVlc3Rpb25kb3duc21hbGxcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLFxuICBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiXCIsIFwiXCIsIFwiemVyb3N1cGVyaW9yXCIsXG4gIFwib25lc3VwZXJpb3JcIiwgXCJ0d29zdXBlcmlvclwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIixcbiAgXCJmaXZlc3VwZXJpb3JcIiwgXCJzaXhzdXBlcmlvclwiLCBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsXG4gIFwibmluZXN1cGVyaW9yXCIsIFwiemVyb2luZmVyaW9yXCIsIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLFxuICBcInRocmVlaW5mZXJpb3JcIiwgXCJmb3VyaW5mZXJpb3JcIiwgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLFxuICBcInNldmVuaW5mZXJpb3JcIiwgXCJlaWdodGluZmVyaW9yXCIsIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsXG4gIFwiZG9sbGFyaW5mZXJpb3JcIiwgXCJwZXJpb2RpbmZlcmlvclwiLCBcImNvbW1haW5mZXJpb3JcIiwgXCJBZ3JhdmVzbWFsbFwiLFxuICBcIkFhY3V0ZXNtYWxsXCIsIFwiQWNpcmN1bWZsZXhzbWFsbFwiLCBcIkF0aWxkZXNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIixcbiAgXCJBcmluZ3NtYWxsXCIsIFwiQUVzbWFsbFwiLCBcIkNjZWRpbGxhc21hbGxcIiwgXCJFZ3JhdmVzbWFsbFwiLCBcIkVhY3V0ZXNtYWxsXCIsXG4gIFwiRWNpcmN1bWZsZXhzbWFsbFwiLCBcIkVkaWVyZXNpc3NtYWxsXCIsIFwiSWdyYXZlc21hbGxcIiwgXCJJYWN1dGVzbWFsbFwiLFxuICBcIkljaXJjdW1mbGV4c21hbGxcIiwgXCJJZGllcmVzaXNzbWFsbFwiLCBcIkV0aHNtYWxsXCIsIFwiTnRpbGRlc21hbGxcIixcbiAgXCJPZ3JhdmVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsIFwiT2NpcmN1bWZsZXhzbWFsbFwiLCBcIk90aWxkZXNtYWxsXCIsXG4gIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPRXNtYWxsXCIsIFwiT3NsYXNoc21hbGxcIiwgXCJVZ3JhdmVzbWFsbFwiLCBcIlVhY3V0ZXNtYWxsXCIsXG4gIFwiVWNpcmN1bWZsZXhzbWFsbFwiLCBcIlVkaWVyZXNpc3NtYWxsXCIsIFwiWWFjdXRlc21hbGxcIiwgXCJUaG9ybnNtYWxsXCIsXG4gIFwiWWRpZXJlc2lzc21hbGxcIl07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgTWFjRXhwZXJ0RW5jb2RpbmcgPSBbXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwic3BhY2VcIiwgXCJleGNsYW1zbWFsbFwiLCBcIkh1bmdhcnVtbGF1dHNtYWxsXCIsIFwiY2VudG9sZHN0eWxlXCIsXG4gIFwiZG9sbGFyb2xkc3R5bGVcIiwgXCJkb2xsYXJzdXBlcmlvclwiLCBcImFtcGVyc2FuZHNtYWxsXCIsIFwiQWN1dGVzbWFsbFwiLFxuICBcInBhcmVubGVmdHN1cGVyaW9yXCIsIFwicGFyZW5yaWdodHN1cGVyaW9yXCIsIFwidHdvZG90ZW5sZWFkZXJcIixcbiAgXCJvbmVkb3RlbmxlYWRlclwiLCBcImNvbW1hXCIsIFwiaHlwaGVuXCIsIFwicGVyaW9kXCIsIFwiZnJhY3Rpb25cIiwgXCJ6ZXJvb2xkc3R5bGVcIixcbiAgXCJvbmVvbGRzdHlsZVwiLCBcInR3b29sZHN0eWxlXCIsIFwidGhyZWVvbGRzdHlsZVwiLCBcImZvdXJvbGRzdHlsZVwiLFxuICBcImZpdmVvbGRzdHlsZVwiLCBcInNpeG9sZHN0eWxlXCIsIFwic2V2ZW5vbGRzdHlsZVwiLCBcImVpZ2h0b2xkc3R5bGVcIixcbiAgXCJuaW5lb2xkc3R5bGVcIiwgXCJjb2xvblwiLCBcInNlbWljb2xvblwiLCBcIlwiLCBcInRocmVlcXVhcnRlcnNlbWRhc2hcIiwgXCJcIixcbiAgXCJxdWVzdGlvbnNtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiRXRoc21hbGxcIiwgXCJcIiwgXCJcIiwgXCJvbmVxdWFydGVyXCIsXG4gIFwib25laGFsZlwiLCBcInRocmVlcXVhcnRlcnNcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLFxuICBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiZmZcIixcbiAgXCJmaVwiLCBcImZsXCIsIFwiZmZpXCIsIFwiZmZsXCIsIFwicGFyZW5sZWZ0aW5mZXJpb3JcIiwgXCJcIiwgXCJwYXJlbnJpZ2h0aW5mZXJpb3JcIixcbiAgXCJDaXJjdW1mbGV4c21hbGxcIiwgXCJoeXBoZW5pbmZlcmlvclwiLCBcIkdyYXZlc21hbGxcIiwgXCJBc21hbGxcIiwgXCJCc21hbGxcIixcbiAgXCJDc21hbGxcIiwgXCJEc21hbGxcIiwgXCJFc21hbGxcIiwgXCJGc21hbGxcIiwgXCJHc21hbGxcIiwgXCJIc21hbGxcIiwgXCJJc21hbGxcIixcbiAgXCJKc21hbGxcIiwgXCJLc21hbGxcIiwgXCJMc21hbGxcIiwgXCJNc21hbGxcIiwgXCJOc21hbGxcIiwgXCJPc21hbGxcIiwgXCJQc21hbGxcIixcbiAgXCJRc21hbGxcIiwgXCJSc21hbGxcIiwgXCJTc21hbGxcIiwgXCJUc21hbGxcIiwgXCJVc21hbGxcIiwgXCJWc21hbGxcIiwgXCJXc21hbGxcIixcbiAgXCJYc21hbGxcIiwgXCJZc21hbGxcIiwgXCJac21hbGxcIiwgXCJjb2xvbm1vbmV0YXJ5XCIsIFwib25lZml0dGVkXCIsIFwicnVwaWFoXCIsXG4gIFwiVGlsZGVzbWFsbFwiLCBcIlwiLCBcIlwiLCBcImFzdXBlcmlvclwiLCBcImNlbnRzdXBlcmlvclwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIkFhY3V0ZXNtYWxsXCIsIFwiQWdyYXZlc21hbGxcIiwgXCJBY2lyY3VtZmxleHNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIixcbiAgXCJBdGlsZGVzbWFsbFwiLCBcIkFyaW5nc21hbGxcIiwgXCJDY2VkaWxsYXNtYWxsXCIsIFwiRWFjdXRlc21hbGxcIiwgXCJFZ3JhdmVzbWFsbFwiLFxuICBcIkVjaXJjdW1mbGV4c21hbGxcIiwgXCJFZGllcmVzaXNzbWFsbFwiLCBcIklhY3V0ZXNtYWxsXCIsIFwiSWdyYXZlc21hbGxcIixcbiAgXCJJY2lyY3VtZmxleHNtYWxsXCIsIFwiSWRpZXJlc2lzc21hbGxcIiwgXCJOdGlsZGVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsXG4gIFwiT2dyYXZlc21hbGxcIiwgXCJPY2lyY3VtZmxleHNtYWxsXCIsIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPdGlsZGVzbWFsbFwiLFxuICBcIlVhY3V0ZXNtYWxsXCIsIFwiVWdyYXZlc21hbGxcIiwgXCJVY2lyY3VtZmxleHNtYWxsXCIsIFwiVWRpZXJlc2lzc21hbGxcIiwgXCJcIixcbiAgXCJlaWdodHN1cGVyaW9yXCIsIFwiZm91cmluZmVyaW9yXCIsIFwidGhyZWVpbmZlcmlvclwiLCBcInNpeGluZmVyaW9yXCIsXG4gIFwiZWlnaHRpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIiwgXCJTY2Fyb25zbWFsbFwiLCBcIlwiLCBcImNlbnRpbmZlcmlvclwiLFxuICBcInR3b2luZmVyaW9yXCIsIFwiXCIsIFwiRGllcmVzaXNzbWFsbFwiLCBcIlwiLCBcIkNhcm9uc21hbGxcIiwgXCJvc3VwZXJpb3JcIixcbiAgXCJmaXZlaW5mZXJpb3JcIiwgXCJcIiwgXCJjb21tYWluZmVyaW9yXCIsIFwicGVyaW9kaW5mZXJpb3JcIiwgXCJZYWN1dGVzbWFsbFwiLCBcIlwiLFxuICBcImRvbGxhcmluZmVyaW9yXCIsIFwiXCIsIFwiXCIsIFwiVGhvcm5zbWFsbFwiLCBcIlwiLCBcIm5pbmVpbmZlcmlvclwiLCBcInplcm9pbmZlcmlvclwiLFxuICBcIlpjYXJvbnNtYWxsXCIsIFwiQUVzbWFsbFwiLCBcIk9zbGFzaHNtYWxsXCIsIFwicXVlc3Rpb25kb3duc21hbGxcIixcbiAgXCJvbmVpbmZlcmlvclwiLCBcIkxzbGFzaHNtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiQ2VkaWxsYXNtYWxsXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiT0VzbWFsbFwiLCBcImZpZ3VyZWRhc2hcIiwgXCJoeXBoZW5zdXBlcmlvclwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcImV4Y2xhbWRvd25zbWFsbFwiLCBcIlwiLCBcIllkaWVyZXNpc3NtYWxsXCIsIFwiXCIsIFwib25lc3VwZXJpb3JcIiwgXCJ0d29zdXBlcmlvclwiLFxuICBcInRocmVlc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIiwgXCJzaXhzdXBlcmlvclwiLFxuICBcInNldmVuc3VwZXJpb3JcIiwgXCJuaW5lc3VwZXJpb3JcIiwgXCJ6ZXJvc3VwZXJpb3JcIiwgXCJcIiwgXCJlc3VwZXJpb3JcIixcbiAgXCJyc3VwZXJpb3JcIiwgXCJ0c3VwZXJpb3JcIiwgXCJcIiwgXCJcIiwgXCJpc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJsc3VwZXJpb3JcIiwgXCJPZ29uZWtzbWFsbFwiLCBcIkJyZXZlc21hbGxcIixcbiAgXCJNYWNyb25zbWFsbFwiLCBcImJzdXBlcmlvclwiLCBcIm5zdXBlcmlvclwiLCBcIm1zdXBlcmlvclwiLCBcImNvbW1hc3VwZXJpb3JcIixcbiAgXCJwZXJpb2RzdXBlcmlvclwiLCBcIkRvdGFjY2VudHNtYWxsXCIsIFwiUmluZ3NtYWxsXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCJdO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IE1hY1JvbWFuRW5jb2RpbmcgPSBbXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwic3BhY2VcIiwgXCJleGNsYW1cIiwgXCJxdW90ZWRibFwiLCBcIm51bWJlcnNpZ25cIiwgXCJkb2xsYXJcIiwgXCJwZXJjZW50XCIsXG4gIFwiYW1wZXJzYW5kXCIsIFwicXVvdGVzaW5nbGVcIiwgXCJwYXJlbmxlZnRcIiwgXCJwYXJlbnJpZ2h0XCIsIFwiYXN0ZXJpc2tcIiwgXCJwbHVzXCIsXG4gIFwiY29tbWFcIiwgXCJoeXBoZW5cIiwgXCJwZXJpb2RcIiwgXCJzbGFzaFwiLCBcInplcm9cIiwgXCJvbmVcIiwgXCJ0d29cIiwgXCJ0aHJlZVwiLFxuICBcImZvdXJcIiwgXCJmaXZlXCIsIFwic2l4XCIsIFwic2V2ZW5cIiwgXCJlaWdodFwiLCBcIm5pbmVcIiwgXCJjb2xvblwiLCBcInNlbWljb2xvblwiLFxuICBcImxlc3NcIiwgXCJlcXVhbFwiLCBcImdyZWF0ZXJcIiwgXCJxdWVzdGlvblwiLCBcImF0XCIsIFwiQVwiLCBcIkJcIiwgXCJDXCIsIFwiRFwiLCBcIkVcIiwgXCJGXCIsXG4gIFwiR1wiLCBcIkhcIiwgXCJJXCIsIFwiSlwiLCBcIktcIiwgXCJMXCIsIFwiTVwiLCBcIk5cIiwgXCJPXCIsIFwiUFwiLCBcIlFcIiwgXCJSXCIsIFwiU1wiLCBcIlRcIiwgXCJVXCIsXG4gIFwiVlwiLCBcIldcIiwgXCJYXCIsIFwiWVwiLCBcIlpcIiwgXCJicmFja2V0bGVmdFwiLCBcImJhY2tzbGFzaFwiLCBcImJyYWNrZXRyaWdodFwiLFxuICBcImFzY2lpY2lyY3VtXCIsIFwidW5kZXJzY29yZVwiLCBcImdyYXZlXCIsIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiwgXCJmXCIsIFwiZ1wiLFxuICBcImhcIiwgXCJpXCIsIFwialwiLCBcImtcIiwgXCJsXCIsIFwibVwiLCBcIm5cIiwgXCJvXCIsIFwicFwiLCBcInFcIiwgXCJyXCIsIFwic1wiLCBcInRcIiwgXCJ1XCIsIFwidlwiLFxuICBcIndcIiwgXCJ4XCIsIFwieVwiLCBcInpcIiwgXCJicmFjZWxlZnRcIiwgXCJiYXJcIiwgXCJicmFjZXJpZ2h0XCIsIFwiYXNjaWl0aWxkZVwiLCBcIlwiLFxuICBcIkFkaWVyZXNpc1wiLCBcIkFyaW5nXCIsIFwiQ2NlZGlsbGFcIiwgXCJFYWN1dGVcIiwgXCJOdGlsZGVcIiwgXCJPZGllcmVzaXNcIixcbiAgXCJVZGllcmVzaXNcIiwgXCJhYWN1dGVcIiwgXCJhZ3JhdmVcIiwgXCJhY2lyY3VtZmxleFwiLCBcImFkaWVyZXNpc1wiLCBcImF0aWxkZVwiLFxuICBcImFyaW5nXCIsIFwiY2NlZGlsbGFcIiwgXCJlYWN1dGVcIiwgXCJlZ3JhdmVcIiwgXCJlY2lyY3VtZmxleFwiLCBcImVkaWVyZXNpc1wiLFxuICBcImlhY3V0ZVwiLCBcImlncmF2ZVwiLCBcImljaXJjdW1mbGV4XCIsIFwiaWRpZXJlc2lzXCIsIFwibnRpbGRlXCIsIFwib2FjdXRlXCIsXG4gIFwib2dyYXZlXCIsIFwib2NpcmN1bWZsZXhcIiwgXCJvZGllcmVzaXNcIiwgXCJvdGlsZGVcIiwgXCJ1YWN1dGVcIiwgXCJ1Z3JhdmVcIixcbiAgXCJ1Y2lyY3VtZmxleFwiLCBcInVkaWVyZXNpc1wiLCBcImRhZ2dlclwiLCBcImRlZ3JlZVwiLCBcImNlbnRcIiwgXCJzdGVybGluZ1wiLFxuICBcInNlY3Rpb25cIiwgXCJidWxsZXRcIiwgXCJwYXJhZ3JhcGhcIiwgXCJnZXJtYW5kYmxzXCIsIFwicmVnaXN0ZXJlZFwiLCBcImNvcHlyaWdodFwiLFxuICBcInRyYWRlbWFya1wiLCBcImFjdXRlXCIsIFwiZGllcmVzaXNcIiwgXCJub3RlcXVhbFwiLCBcIkFFXCIsIFwiT3NsYXNoXCIsIFwiaW5maW5pdHlcIixcbiAgXCJwbHVzbWludXNcIiwgXCJsZXNzZXF1YWxcIiwgXCJncmVhdGVyZXF1YWxcIiwgXCJ5ZW5cIiwgXCJtdVwiLCBcInBhcnRpYWxkaWZmXCIsXG4gIFwic3VtbWF0aW9uXCIsIFwicHJvZHVjdFwiLCBcInBpXCIsIFwiaW50ZWdyYWxcIiwgXCJvcmRmZW1pbmluZVwiLCBcIm9yZG1hc2N1bGluZVwiLFxuICBcIk9tZWdhXCIsIFwiYWVcIiwgXCJvc2xhc2hcIiwgXCJxdWVzdGlvbmRvd25cIiwgXCJleGNsYW1kb3duXCIsIFwibG9naWNhbG5vdFwiLFxuICBcInJhZGljYWxcIiwgXCJmbG9yaW5cIiwgXCJhcHByb3hlcXVhbFwiLCBcIkRlbHRhXCIsIFwiZ3VpbGxlbW90bGVmdFwiLFxuICBcImd1aWxsZW1vdHJpZ2h0XCIsIFwiZWxsaXBzaXNcIiwgXCJzcGFjZVwiLCBcIkFncmF2ZVwiLCBcIkF0aWxkZVwiLCBcIk90aWxkZVwiLCBcIk9FXCIsXG4gIFwib2VcIiwgXCJlbmRhc2hcIiwgXCJlbWRhc2hcIiwgXCJxdW90ZWRibGxlZnRcIiwgXCJxdW90ZWRibHJpZ2h0XCIsIFwicXVvdGVsZWZ0XCIsXG4gIFwicXVvdGVyaWdodFwiLCBcImRpdmlkZVwiLCBcImxvemVuZ2VcIiwgXCJ5ZGllcmVzaXNcIiwgXCJZZGllcmVzaXNcIiwgXCJmcmFjdGlvblwiLFxuICBcImN1cnJlbmN5XCIsIFwiZ3VpbHNpbmdsbGVmdFwiLCBcImd1aWxzaW5nbHJpZ2h0XCIsIFwiZmlcIiwgXCJmbFwiLCBcImRhZ2dlcmRibFwiLFxuICBcInBlcmlvZGNlbnRlcmVkXCIsIFwicXVvdGVzaW5nbGJhc2VcIiwgXCJxdW90ZWRibGJhc2VcIiwgXCJwZXJ0aG91c2FuZFwiLFxuICBcIkFjaXJjdW1mbGV4XCIsIFwiRWNpcmN1bWZsZXhcIiwgXCJBYWN1dGVcIiwgXCJFZGllcmVzaXNcIiwgXCJFZ3JhdmVcIiwgXCJJYWN1dGVcIixcbiAgXCJJY2lyY3VtZmxleFwiLCBcIklkaWVyZXNpc1wiLCBcIklncmF2ZVwiLCBcIk9hY3V0ZVwiLCBcIk9jaXJjdW1mbGV4XCIsIFwiYXBwbGVcIixcbiAgXCJPZ3JhdmVcIiwgXCJVYWN1dGVcIiwgXCJVY2lyY3VtZmxleFwiLCBcIlVncmF2ZVwiLCBcImRvdGxlc3NpXCIsIFwiY2lyY3VtZmxleFwiLFxuICBcInRpbGRlXCIsIFwibWFjcm9uXCIsIFwiYnJldmVcIiwgXCJkb3RhY2NlbnRcIiwgXCJyaW5nXCIsIFwiY2VkaWxsYVwiLCBcImh1bmdhcnVtbGF1dFwiLFxuICBcIm9nb25la1wiLCBcImNhcm9uXCJdO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFN0YW5kYXJkRW5jb2RpbmcgPSBbXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsXG4gIFwic3BhY2VcIiwgXCJleGNsYW1cIiwgXCJxdW90ZWRibFwiLCBcIm51bWJlcnNpZ25cIiwgXCJkb2xsYXJcIiwgXCJwZXJjZW50XCIsXG4gIFwiYW1wZXJzYW5kXCIsIFwicXVvdGVyaWdodFwiLCBcInBhcmVubGVmdFwiLCBcInBhcmVucmlnaHRcIiwgXCJhc3Rlcmlza1wiLCBcInBsdXNcIixcbiAgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcInNsYXNoXCIsIFwiemVyb1wiLCBcIm9uZVwiLCBcInR3b1wiLCBcInRocmVlXCIsXG4gIFwiZm91clwiLCBcImZpdmVcIiwgXCJzaXhcIiwgXCJzZXZlblwiLCBcImVpZ2h0XCIsIFwibmluZVwiLCBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsXG4gIFwibGVzc1wiLCBcImVxdWFsXCIsIFwiZ3JlYXRlclwiLCBcInF1ZXN0aW9uXCIsIFwiYXRcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIixcbiAgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsIFwiTlwiLCBcIk9cIiwgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIixcbiAgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLCBcImJyYWNrZXRsZWZ0XCIsIFwiYmFja3NsYXNoXCIsIFwiYnJhY2tldHJpZ2h0XCIsXG4gIFwiYXNjaWljaXJjdW1cIiwgXCJ1bmRlcnNjb3JlXCIsIFwicXVvdGVsZWZ0XCIsIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiwgXCJmXCIsXG4gIFwiZ1wiLCBcImhcIiwgXCJpXCIsIFwialwiLCBcImtcIiwgXCJsXCIsIFwibVwiLCBcIm5cIiwgXCJvXCIsIFwicFwiLCBcInFcIiwgXCJyXCIsIFwic1wiLCBcInRcIiwgXCJ1XCIsXG4gIFwidlwiLCBcIndcIiwgXCJ4XCIsIFwieVwiLCBcInpcIiwgXCJicmFjZWxlZnRcIiwgXCJiYXJcIiwgXCJicmFjZXJpZ2h0XCIsIFwiYXNjaWl0aWxkZVwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcImV4Y2xhbWRvd25cIixcbiAgXCJjZW50XCIsIFwic3RlcmxpbmdcIiwgXCJmcmFjdGlvblwiLCBcInllblwiLCBcImZsb3JpblwiLCBcInNlY3Rpb25cIiwgXCJjdXJyZW5jeVwiLFxuICBcInF1b3Rlc2luZ2xlXCIsIFwicXVvdGVkYmxsZWZ0XCIsIFwiZ3VpbGxlbW90bGVmdFwiLCBcImd1aWxzaW5nbGxlZnRcIixcbiAgXCJndWlsc2luZ2xyaWdodFwiLCBcImZpXCIsIFwiZmxcIiwgXCJcIiwgXCJlbmRhc2hcIiwgXCJkYWdnZXJcIiwgXCJkYWdnZXJkYmxcIixcbiAgXCJwZXJpb2RjZW50ZXJlZFwiLCBcIlwiLCBcInBhcmFncmFwaFwiLCBcImJ1bGxldFwiLCBcInF1b3Rlc2luZ2xiYXNlXCIsXG4gIFwicXVvdGVkYmxiYXNlXCIsIFwicXVvdGVkYmxyaWdodFwiLCBcImd1aWxsZW1vdHJpZ2h0XCIsIFwiZWxsaXBzaXNcIixcbiAgXCJwZXJ0aG91c2FuZFwiLCBcIlwiLCBcInF1ZXN0aW9uZG93blwiLCBcIlwiLCBcImdyYXZlXCIsIFwiYWN1dGVcIiwgXCJjaXJjdW1mbGV4XCIsXG4gIFwidGlsZGVcIiwgXCJtYWNyb25cIiwgXCJicmV2ZVwiLCBcImRvdGFjY2VudFwiLCBcImRpZXJlc2lzXCIsIFwiXCIsIFwicmluZ1wiLCBcImNlZGlsbGFcIixcbiAgXCJcIiwgXCJodW5nYXJ1bWxhdXRcIiwgXCJvZ29uZWtcIiwgXCJjYXJvblwiLCBcImVtZGFzaFwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIkFFXCIsIFwiXCIsIFwib3JkZmVtaW5pbmVcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJMc2xhc2hcIiwgXCJPc2xhc2hcIiwgXCJPRVwiLCBcIm9yZG1hc2N1bGluZVwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcImFlXCIsXG4gIFwiXCIsIFwiXCIsIFwiXCIsIFwiZG90bGVzc2lcIiwgXCJcIiwgXCJcIiwgXCJsc2xhc2hcIiwgXCJvc2xhc2hcIiwgXCJvZVwiLCBcImdlcm1hbmRibHNcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIl07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgV2luQW5zaUVuY29kaW5nID0gW1xuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcInNwYWNlXCIsIFwiZXhjbGFtXCIsIFwicXVvdGVkYmxcIiwgXCJudW1iZXJzaWduXCIsIFwiZG9sbGFyXCIsIFwicGVyY2VudFwiLFxuICBcImFtcGVyc2FuZFwiLCBcInF1b3Rlc2luZ2xlXCIsIFwicGFyZW5sZWZ0XCIsIFwicGFyZW5yaWdodFwiLCBcImFzdGVyaXNrXCIsIFwicGx1c1wiLFxuICBcImNvbW1hXCIsIFwiaHlwaGVuXCIsIFwicGVyaW9kXCIsIFwic2xhc2hcIiwgXCJ6ZXJvXCIsIFwib25lXCIsIFwidHdvXCIsIFwidGhyZWVcIixcbiAgXCJmb3VyXCIsIFwiZml2ZVwiLCBcInNpeFwiLCBcInNldmVuXCIsIFwiZWlnaHRcIiwgXCJuaW5lXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIixcbiAgXCJsZXNzXCIsIFwiZXF1YWxcIiwgXCJncmVhdGVyXCIsIFwicXVlc3Rpb25cIiwgXCJhdFwiLCBcIkFcIiwgXCJCXCIsIFwiQ1wiLCBcIkRcIiwgXCJFXCIsIFwiRlwiLFxuICBcIkdcIiwgXCJIXCIsIFwiSVwiLCBcIkpcIiwgXCJLXCIsIFwiTFwiLCBcIk1cIiwgXCJOXCIsIFwiT1wiLCBcIlBcIiwgXCJRXCIsIFwiUlwiLCBcIlNcIiwgXCJUXCIsIFwiVVwiLFxuICBcIlZcIiwgXCJXXCIsIFwiWFwiLCBcIllcIiwgXCJaXCIsIFwiYnJhY2tldGxlZnRcIiwgXCJiYWNrc2xhc2hcIiwgXCJicmFja2V0cmlnaHRcIixcbiAgXCJhc2NpaWNpcmN1bVwiLCBcInVuZGVyc2NvcmVcIiwgXCJncmF2ZVwiLCBcImFcIiwgXCJiXCIsIFwiY1wiLCBcImRcIiwgXCJlXCIsIFwiZlwiLCBcImdcIixcbiAgXCJoXCIsIFwiaVwiLCBcImpcIiwgXCJrXCIsIFwibFwiLCBcIm1cIiwgXCJuXCIsIFwib1wiLCBcInBcIiwgXCJxXCIsIFwiclwiLCBcInNcIiwgXCJ0XCIsIFwidVwiLCBcInZcIixcbiAgXCJ3XCIsIFwieFwiLCBcInlcIiwgXCJ6XCIsIFwiYnJhY2VsZWZ0XCIsIFwiYmFyXCIsIFwiYnJhY2VyaWdodFwiLCBcImFzY2lpdGlsZGVcIixcbiAgXCJidWxsZXRcIiwgXCJFdXJvXCIsIFwiYnVsbGV0XCIsIFwicXVvdGVzaW5nbGJhc2VcIiwgXCJmbG9yaW5cIiwgXCJxdW90ZWRibGJhc2VcIixcbiAgXCJlbGxpcHNpc1wiLCBcImRhZ2dlclwiLCBcImRhZ2dlcmRibFwiLCBcImNpcmN1bWZsZXhcIiwgXCJwZXJ0aG91c2FuZFwiLCBcIlNjYXJvblwiLFxuICBcImd1aWxzaW5nbGxlZnRcIiwgXCJPRVwiLCBcImJ1bGxldFwiLCBcIlpjYXJvblwiLCBcImJ1bGxldFwiLCBcImJ1bGxldFwiLCBcInF1b3RlbGVmdFwiLFxuICBcInF1b3RlcmlnaHRcIiwgXCJxdW90ZWRibGxlZnRcIiwgXCJxdW90ZWRibHJpZ2h0XCIsIFwiYnVsbGV0XCIsIFwiZW5kYXNoXCIsXG4gIFwiZW1kYXNoXCIsIFwidGlsZGVcIiwgXCJ0cmFkZW1hcmtcIiwgXCJzY2Fyb25cIiwgXCJndWlsc2luZ2xyaWdodFwiLCBcIm9lXCIsIFwiYnVsbGV0XCIsXG4gIFwiemNhcm9uXCIsIFwiWWRpZXJlc2lzXCIsIFwic3BhY2VcIiwgXCJleGNsYW1kb3duXCIsIFwiY2VudFwiLCBcInN0ZXJsaW5nXCIsXG4gIFwiY3VycmVuY3lcIiwgXCJ5ZW5cIiwgXCJicm9rZW5iYXJcIiwgXCJzZWN0aW9uXCIsIFwiZGllcmVzaXNcIiwgXCJjb3B5cmlnaHRcIixcbiAgXCJvcmRmZW1pbmluZVwiLCBcImd1aWxsZW1vdGxlZnRcIiwgXCJsb2dpY2Fsbm90XCIsIFwiaHlwaGVuXCIsIFwicmVnaXN0ZXJlZFwiLFxuICBcIm1hY3JvblwiLCBcImRlZ3JlZVwiLCBcInBsdXNtaW51c1wiLCBcInR3b3N1cGVyaW9yXCIsIFwidGhyZWVzdXBlcmlvclwiLCBcImFjdXRlXCIsXG4gIFwibXVcIiwgXCJwYXJhZ3JhcGhcIiwgXCJwZXJpb2RjZW50ZXJlZFwiLCBcImNlZGlsbGFcIiwgXCJvbmVzdXBlcmlvclwiLFxuICBcIm9yZG1hc2N1bGluZVwiLCBcImd1aWxsZW1vdHJpZ2h0XCIsIFwib25lcXVhcnRlclwiLCBcIm9uZWhhbGZcIiwgXCJ0aHJlZXF1YXJ0ZXJzXCIsXG4gIFwicXVlc3Rpb25kb3duXCIsIFwiQWdyYXZlXCIsIFwiQWFjdXRlXCIsIFwiQWNpcmN1bWZsZXhcIiwgXCJBdGlsZGVcIiwgXCJBZGllcmVzaXNcIixcbiAgXCJBcmluZ1wiLCBcIkFFXCIsIFwiQ2NlZGlsbGFcIiwgXCJFZ3JhdmVcIiwgXCJFYWN1dGVcIiwgXCJFY2lyY3VtZmxleFwiLCBcIkVkaWVyZXNpc1wiLFxuICBcIklncmF2ZVwiLCBcIklhY3V0ZVwiLCBcIkljaXJjdW1mbGV4XCIsIFwiSWRpZXJlc2lzXCIsIFwiRXRoXCIsIFwiTnRpbGRlXCIsIFwiT2dyYXZlXCIsXG4gIFwiT2FjdXRlXCIsIFwiT2NpcmN1bWZsZXhcIiwgXCJPdGlsZGVcIiwgXCJPZGllcmVzaXNcIiwgXCJtdWx0aXBseVwiLCBcIk9zbGFzaFwiLFxuICBcIlVncmF2ZVwiLCBcIlVhY3V0ZVwiLCBcIlVjaXJjdW1mbGV4XCIsIFwiVWRpZXJlc2lzXCIsIFwiWWFjdXRlXCIsIFwiVGhvcm5cIixcbiAgXCJnZXJtYW5kYmxzXCIsIFwiYWdyYXZlXCIsIFwiYWFjdXRlXCIsIFwiYWNpcmN1bWZsZXhcIiwgXCJhdGlsZGVcIiwgXCJhZGllcmVzaXNcIixcbiAgXCJhcmluZ1wiLCBcImFlXCIsIFwiY2NlZGlsbGFcIiwgXCJlZ3JhdmVcIiwgXCJlYWN1dGVcIiwgXCJlY2lyY3VtZmxleFwiLCBcImVkaWVyZXNpc1wiLFxuICBcImlncmF2ZVwiLCBcImlhY3V0ZVwiLCBcImljaXJjdW1mbGV4XCIsIFwiaWRpZXJlc2lzXCIsIFwiZXRoXCIsIFwibnRpbGRlXCIsIFwib2dyYXZlXCIsXG4gIFwib2FjdXRlXCIsIFwib2NpcmN1bWZsZXhcIiwgXCJvdGlsZGVcIiwgXCJvZGllcmVzaXNcIiwgXCJkaXZpZGVcIiwgXCJvc2xhc2hcIixcbiAgXCJ1Z3JhdmVcIiwgXCJ1YWN1dGVcIiwgXCJ1Y2lyY3VtZmxleFwiLCBcInVkaWVyZXNpc1wiLCBcInlhY3V0ZVwiLCBcInRob3JuXCIsXG4gIFwieWRpZXJlc2lzXCJdO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFN5bWJvbFNldEVuY29kaW5nID0gW1xuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLFxuICBcInNwYWNlXCIsIFwiZXhjbGFtXCIsIFwidW5pdmVyc2FsXCIsIFwibnVtYmVyc2lnblwiLCBcImV4aXN0ZW50aWFsXCIsIFwicGVyY2VudFwiLFxuICBcImFtcGVyc2FuZFwiLCBcInN1Y2h0aGF0XCIsIFwicGFyZW5sZWZ0XCIsIFwicGFyZW5yaWdodFwiLCBcImFzdGVyaXNrbWF0aFwiLCBcInBsdXNcIixcbiAgXCJjb21tYVwiLCBcIm1pbnVzXCIsIFwicGVyaW9kXCIsIFwic2xhc2hcIiwgXCJ6ZXJvXCIsIFwib25lXCIsIFwidHdvXCIsIFwidGhyZWVcIiwgXCJmb3VyXCIsXG4gIFwiZml2ZVwiLCBcInNpeFwiLCBcInNldmVuXCIsIFwiZWlnaHRcIiwgXCJuaW5lXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIiwgXCJsZXNzXCIsXG4gIFwiZXF1YWxcIiwgXCJncmVhdGVyXCIsIFwicXVlc3Rpb25cIiwgXCJjb25ncnVlbnRcIiwgXCJBbHBoYVwiLCBcIkJldGFcIiwgXCJDaGlcIixcbiAgXCJEZWx0YVwiLCBcIkVwc2lsb25cIiwgXCJQaGlcIiwgXCJHYW1tYVwiLCBcIkV0YVwiLCBcIklvdGFcIiwgXCJ0aGV0YTFcIiwgXCJLYXBwYVwiLFxuICBcIkxhbWJkYVwiLCBcIk11XCIsIFwiTnVcIiwgXCJPbWljcm9uXCIsIFwiUGlcIiwgXCJUaGV0YVwiLCBcIlJob1wiLCBcIlNpZ21hXCIsIFwiVGF1XCIsXG4gIFwiVXBzaWxvblwiLCBcInNpZ21hMVwiLCBcIk9tZWdhXCIsIFwiWGlcIiwgXCJQc2lcIiwgXCJaZXRhXCIsIFwiYnJhY2tldGxlZnRcIixcbiAgXCJ0aGVyZWZvcmVcIiwgXCJicmFja2V0cmlnaHRcIiwgXCJwZXJwZW5kaWN1bGFyXCIsIFwidW5kZXJzY29yZVwiLCBcInJhZGljYWxleFwiLFxuICBcImFscGhhXCIsIFwiYmV0YVwiLCBcImNoaVwiLCBcImRlbHRhXCIsIFwiZXBzaWxvblwiLCBcInBoaVwiLCBcImdhbW1hXCIsIFwiZXRhXCIsIFwiaW90YVwiLFxuICBcInBoaTFcIiwgXCJrYXBwYVwiLCBcImxhbWJkYVwiLCBcIm11XCIsIFwibnVcIiwgXCJvbWljcm9uXCIsIFwicGlcIiwgXCJ0aGV0YVwiLCBcInJob1wiLFxuICBcInNpZ21hXCIsIFwidGF1XCIsIFwidXBzaWxvblwiLCBcIm9tZWdhMVwiLCBcIm9tZWdhXCIsIFwieGlcIiwgXCJwc2lcIiwgXCJ6ZXRhXCIsXG4gIFwiYnJhY2VsZWZ0XCIsIFwiYmFyXCIsIFwiYnJhY2VyaWdodFwiLCBcInNpbWlsYXJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJFdXJvXCIsIFwiVXBzaWxvbjFcIiwgXCJtaW51dGVcIiwgXCJsZXNzZXF1YWxcIixcbiAgXCJmcmFjdGlvblwiLCBcImluZmluaXR5XCIsIFwiZmxvcmluXCIsIFwiY2x1YlwiLCBcImRpYW1vbmRcIiwgXCJoZWFydFwiLCBcInNwYWRlXCIsXG4gIFwiYXJyb3dib3RoXCIsIFwiYXJyb3dsZWZ0XCIsIFwiYXJyb3d1cFwiLCBcImFycm93cmlnaHRcIiwgXCJhcnJvd2Rvd25cIiwgXCJkZWdyZWVcIixcbiAgXCJwbHVzbWludXNcIiwgXCJzZWNvbmRcIiwgXCJncmVhdGVyZXF1YWxcIiwgXCJtdWx0aXBseVwiLCBcInByb3BvcnRpb25hbFwiLFxuICBcInBhcnRpYWxkaWZmXCIsIFwiYnVsbGV0XCIsIFwiZGl2aWRlXCIsIFwibm90ZXF1YWxcIiwgXCJlcXVpdmFsZW5jZVwiLFxuICBcImFwcHJveGVxdWFsXCIsIFwiZWxsaXBzaXNcIiwgXCJhcnJvd3ZlcnRleFwiLCBcImFycm93aG9yaXpleFwiLCBcImNhcnJpYWdlcmV0dXJuXCIsXG4gIFwiYWxlcGhcIiwgXCJJZnJha3R1clwiLCBcIlJmcmFrdHVyXCIsIFwid2VpZXJzdHJhc3NcIiwgXCJjaXJjbGVtdWx0aXBseVwiLFxuICBcImNpcmNsZXBsdXNcIiwgXCJlbXB0eXNldFwiLCBcImludGVyc2VjdGlvblwiLCBcInVuaW9uXCIsIFwicHJvcGVyc3VwZXJzZXRcIixcbiAgXCJyZWZsZXhzdXBlcnNldFwiLCBcIm5vdHN1YnNldFwiLCBcInByb3BlcnN1YnNldFwiLCBcInJlZmxleHN1YnNldFwiLCBcImVsZW1lbnRcIixcbiAgXCJub3RlbGVtZW50XCIsIFwiYW5nbGVcIiwgXCJncmFkaWVudFwiLCBcInJlZ2lzdGVyc2VyaWZcIiwgXCJjb3B5cmlnaHRzZXJpZlwiLFxuICBcInRyYWRlbWFya3NlcmlmXCIsIFwicHJvZHVjdFwiLCBcInJhZGljYWxcIiwgXCJkb3RtYXRoXCIsIFwibG9naWNhbG5vdFwiLFxuICBcImxvZ2ljYWxhbmRcIiwgXCJsb2dpY2Fsb3JcIiwgXCJhcnJvd2RibGJvdGhcIiwgXCJhcnJvd2RibGxlZnRcIiwgXCJhcnJvd2RibHVwXCIsXG4gIFwiYXJyb3dkYmxyaWdodFwiLCBcImFycm93ZGJsZG93blwiLCBcImxvemVuZ2VcIiwgXCJhbmdsZWxlZnRcIiwgXCJyZWdpc3RlcnNhbnNcIixcbiAgXCJjb3B5cmlnaHRzYW5zXCIsIFwidHJhZGVtYXJrc2Fuc1wiLCBcInN1bW1hdGlvblwiLCBcInBhcmVubGVmdHRwXCIsXG4gIFwicGFyZW5sZWZ0ZXhcIiwgXCJwYXJlbmxlZnRidFwiLCBcImJyYWNrZXRsZWZ0dHBcIiwgXCJicmFja2V0bGVmdGV4XCIsXG4gIFwiYnJhY2tldGxlZnRidFwiLCBcImJyYWNlbGVmdHRwXCIsIFwiYnJhY2VsZWZ0bWlkXCIsIFwiYnJhY2VsZWZ0YnRcIiwgXCJicmFjZWV4XCIsXG4gIFwiXCIsIFwiYW5nbGVyaWdodFwiLCBcImludGVncmFsXCIsIFwiaW50ZWdyYWx0cFwiLCBcImludGVncmFsZXhcIiwgXCJpbnRlZ3JhbGJ0XCIsXG4gIFwicGFyZW5yaWdodHRwXCIsIFwicGFyZW5yaWdodGV4XCIsIFwicGFyZW5yaWdodGJ0XCIsIFwiYnJhY2tldHJpZ2h0dHBcIixcbiAgXCJicmFja2V0cmlnaHRleFwiLCBcImJyYWNrZXRyaWdodGJ0XCIsIFwiYnJhY2VyaWdodHRwXCIsIFwiYnJhY2VyaWdodG1pZFwiLFxuICBcImJyYWNlcmlnaHRidFwiLCBcIlwiXTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBaYXBmRGluZ2JhdHNFbmNvZGluZyA9IFtcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJzcGFjZVwiLCBcImExXCIsIFwiYTJcIiwgXCJhMjAyXCIsIFwiYTNcIiwgXCJhNFwiLCBcImE1XCIsIFwiYTExOVwiLCBcImExMThcIiwgXCJhMTE3XCIsXG4gIFwiYTExXCIsIFwiYTEyXCIsIFwiYTEzXCIsIFwiYTE0XCIsIFwiYTE1XCIsIFwiYTE2XCIsIFwiYTEwNVwiLCBcImExN1wiLCBcImExOFwiLCBcImExOVwiLFxuICBcImEyMFwiLCBcImEyMVwiLCBcImEyMlwiLCBcImEyM1wiLCBcImEyNFwiLCBcImEyNVwiLCBcImEyNlwiLCBcImEyN1wiLCBcImEyOFwiLCBcImE2XCIsIFwiYTdcIixcbiAgXCJhOFwiLCBcImE5XCIsIFwiYTEwXCIsIFwiYTI5XCIsIFwiYTMwXCIsIFwiYTMxXCIsIFwiYTMyXCIsIFwiYTMzXCIsIFwiYTM0XCIsIFwiYTM1XCIsIFwiYTM2XCIsXG4gIFwiYTM3XCIsIFwiYTM4XCIsIFwiYTM5XCIsIFwiYTQwXCIsIFwiYTQxXCIsIFwiYTQyXCIsIFwiYTQzXCIsIFwiYTQ0XCIsIFwiYTQ1XCIsIFwiYTQ2XCIsXG4gIFwiYTQ3XCIsIFwiYTQ4XCIsIFwiYTQ5XCIsIFwiYTUwXCIsIFwiYTUxXCIsIFwiYTUyXCIsIFwiYTUzXCIsIFwiYTU0XCIsIFwiYTU1XCIsIFwiYTU2XCIsXG4gIFwiYTU3XCIsIFwiYTU4XCIsIFwiYTU5XCIsIFwiYTYwXCIsIFwiYTYxXCIsIFwiYTYyXCIsIFwiYTYzXCIsIFwiYTY0XCIsIFwiYTY1XCIsIFwiYTY2XCIsXG4gIFwiYTY3XCIsIFwiYTY4XCIsIFwiYTY5XCIsIFwiYTcwXCIsIFwiYTcxXCIsIFwiYTcyXCIsIFwiYTczXCIsIFwiYTc0XCIsIFwiYTIwM1wiLCBcImE3NVwiLFxuICBcImEyMDRcIiwgXCJhNzZcIiwgXCJhNzdcIiwgXCJhNzhcIiwgXCJhNzlcIiwgXCJhODFcIiwgXCJhODJcIiwgXCJhODNcIiwgXCJhODRcIiwgXCJhOTdcIixcbiAgXCJhOThcIiwgXCJhOTlcIiwgXCJhMTAwXCIsIFwiXCIsIFwiYTg5XCIsIFwiYTkwXCIsIFwiYTkzXCIsIFwiYTk0XCIsIFwiYTkxXCIsIFwiYTkyXCIsIFwiYTIwNVwiLFxuICBcImE4NVwiLCBcImEyMDZcIiwgXCJhODZcIiwgXCJhODdcIiwgXCJhODhcIiwgXCJhOTVcIiwgXCJhOTZcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIixcbiAgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJhMTAxXCIsIFwiYTEwMlwiLCBcImExMDNcIixcbiAgXCJhMTA0XCIsIFwiYTEwNlwiLCBcImExMDdcIiwgXCJhMTA4XCIsIFwiYTExMlwiLCBcImExMTFcIiwgXCJhMTEwXCIsIFwiYTEwOVwiLCBcImExMjBcIixcbiAgXCJhMTIxXCIsIFwiYTEyMlwiLCBcImExMjNcIiwgXCJhMTI0XCIsIFwiYTEyNVwiLCBcImExMjZcIiwgXCJhMTI3XCIsIFwiYTEyOFwiLCBcImExMjlcIixcbiAgXCJhMTMwXCIsIFwiYTEzMVwiLCBcImExMzJcIiwgXCJhMTMzXCIsIFwiYTEzNFwiLCBcImExMzVcIiwgXCJhMTM2XCIsIFwiYTEzN1wiLCBcImExMzhcIixcbiAgXCJhMTM5XCIsIFwiYTE0MFwiLCBcImExNDFcIiwgXCJhMTQyXCIsIFwiYTE0M1wiLCBcImExNDRcIiwgXCJhMTQ1XCIsIFwiYTE0NlwiLCBcImExNDdcIixcbiAgXCJhMTQ4XCIsIFwiYTE0OVwiLCBcImExNTBcIiwgXCJhMTUxXCIsIFwiYTE1MlwiLCBcImExNTNcIiwgXCJhMTU0XCIsIFwiYTE1NVwiLCBcImExNTZcIixcbiAgXCJhMTU3XCIsIFwiYTE1OFwiLCBcImExNTlcIiwgXCJhMTYwXCIsIFwiYTE2MVwiLCBcImExNjNcIiwgXCJhMTY0XCIsIFwiYTE5NlwiLCBcImExNjVcIixcbiAgXCJhMTkyXCIsIFwiYTE2NlwiLCBcImExNjdcIiwgXCJhMTY4XCIsIFwiYTE2OVwiLCBcImExNzBcIiwgXCJhMTcxXCIsIFwiYTE3MlwiLCBcImExNzNcIixcbiAgXCJhMTYyXCIsIFwiYTE3NFwiLCBcImExNzVcIiwgXCJhMTc2XCIsIFwiYTE3N1wiLCBcImExNzhcIiwgXCJhMTc5XCIsIFwiYTE5M1wiLCBcImExODBcIixcbiAgXCJhMTk5XCIsIFwiYTE4MVwiLCBcImEyMDBcIiwgXCJhMTgyXCIsIFwiXCIsIFwiYTIwMVwiLCBcImExODNcIiwgXCJhMTg0XCIsIFwiYTE5N1wiLCBcImExODVcIixcbiAgXCJhMTk0XCIsIFwiYTE5OFwiLCBcImExODZcIiwgXCJhMTk1XCIsIFwiYTE4N1wiLCBcImExODhcIiwgXCJhMTg5XCIsIFwiYTE5MFwiLCBcImExOTFcIiwgXCJcIl07XG5cbmZ1bmN0aW9uIGdldEVuY29kaW5nKGVuY29kaW5nTmFtZSkge1xuICBzd2l0Y2ggKGVuY29kaW5nTmFtZSkge1xuICAgIGNhc2UgXCJXaW5BbnNpRW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBXaW5BbnNpRW5jb2Rpbmc7XG4gICAgY2FzZSBcIlN0YW5kYXJkRW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBTdGFuZGFyZEVuY29kaW5nO1xuICAgIGNhc2UgXCJNYWNSb21hbkVuY29kaW5nXCI6XG4gICAgICByZXR1cm4gTWFjUm9tYW5FbmNvZGluZztcbiAgICBjYXNlIFwiU3ltYm9sU2V0RW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBTeW1ib2xTZXRFbmNvZGluZztcbiAgICBjYXNlIFwiWmFwZkRpbmdiYXRzRW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBaYXBmRGluZ2JhdHNFbmNvZGluZztcbiAgICBjYXNlIFwiRXhwZXJ0RW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBFeHBlcnRFbmNvZGluZztcbiAgICBjYXNlIFwiTWFjRXhwZXJ0RW5jb2RpbmdcIjpcbiAgICAgIHJldHVybiBNYWNFeHBlcnRFbmNvZGluZztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgV2luQW5zaUVuY29kaW5nLFxuICBTdGFuZGFyZEVuY29kaW5nLFxuICBNYWNSb21hbkVuY29kaW5nLFxuICBTeW1ib2xTZXRFbmNvZGluZyxcbiAgWmFwZkRpbmdiYXRzRW5jb2RpbmcsXG4gIEV4cGVydEVuY29kaW5nLFxuICBnZXRFbmNvZGluZyxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIG5vLWJhYmVsLXByZXNldCAqL1xuXG52YXIgZ2V0TG9va3VwVGFibGVGYWN0b3J5ID0gcmVxdWlyZShcIi4vY29yZV91dGlscy5qc1wiKS5nZXRMb29rdXBUYWJsZUZhY3Rvcnk7XG5cbnZhciBnZXRHbHlwaHNVbmljb2RlID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gIHQuQSA9IDB4MDA0MTtcbiAgdC5BRSA9IDB4MDBjNjtcbiAgdC5BRWFjdXRlID0gMHgwMWZjO1xuICB0LkFFbWFjcm9uID0gMHgwMWUyO1xuICB0LkFFc21hbGwgPSAweGY3ZTY7XG4gIHQuQWFjdXRlID0gMHgwMGMxO1xuICB0LkFhY3V0ZXNtYWxsID0gMHhmN2UxO1xuICB0LkFicmV2ZSA9IDB4MDEwMjtcbiAgdC5BYnJldmVhY3V0ZSA9IDB4MWVhZTtcbiAgdC5BYnJldmVjeXJpbGxpYyA9IDB4MDRkMDtcbiAgdC5BYnJldmVkb3RiZWxvdyA9IDB4MWViNjtcbiAgdC5BYnJldmVncmF2ZSA9IDB4MWViMDtcbiAgdC5BYnJldmVob29rYWJvdmUgPSAweDFlYjI7XG4gIHQuQWJyZXZldGlsZGUgPSAweDFlYjQ7XG4gIHQuQWNhcm9uID0gMHgwMWNkO1xuICB0LkFjaXJjbGUgPSAweDI0YjY7XG4gIHQuQWNpcmN1bWZsZXggPSAweDAwYzI7XG4gIHQuQWNpcmN1bWZsZXhhY3V0ZSA9IDB4MWVhNDtcbiAgdC5BY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFjO1xuICB0LkFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTY7XG4gIHQuQWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYTg7XG4gIHQuQWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlMjtcbiAgdC5BY2lyY3VtZmxleHRpbGRlID0gMHgxZWFhO1xuICB0LkFjdXRlID0gMHhmNmM5O1xuICB0LkFjdXRlc21hbGwgPSAweGY3YjQ7XG4gIHQuQWN5cmlsbGljID0gMHgwNDEwO1xuICB0LkFkYmxncmF2ZSA9IDB4MDIwMDtcbiAgdC5BZGllcmVzaXMgPSAweDAwYzQ7XG4gIHQuQWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDI7XG4gIHQuQWRpZXJlc2lzbWFjcm9uID0gMHgwMWRlO1xuICB0LkFkaWVyZXNpc3NtYWxsID0gMHhmN2U0O1xuICB0LkFkb3RiZWxvdyA9IDB4MWVhMDtcbiAgdC5BZG90bWFjcm9uID0gMHgwMWUwO1xuICB0LkFncmF2ZSA9IDB4MDBjMDtcbiAgdC5BZ3JhdmVzbWFsbCA9IDB4ZjdlMDtcbiAgdC5BaG9va2Fib3ZlID0gMHgxZWEyO1xuICB0LkFpZWN5cmlsbGljID0gMHgwNGQ0O1xuICB0LkFpbnZlcnRlZGJyZXZlID0gMHgwMjAyO1xuICB0LkFscGhhID0gMHgwMzkxO1xuICB0LkFscGhhdG9ub3MgPSAweDAzODY7XG4gIHQuQW1hY3JvbiA9IDB4MDEwMDtcbiAgdC5BbW9ub3NwYWNlID0gMHhmZjIxO1xuICB0LkFvZ29uZWsgPSAweDAxMDQ7XG4gIHQuQXJpbmcgPSAweDAwYzU7XG4gIHQuQXJpbmdhY3V0ZSA9IDB4MDFmYTtcbiAgdC5BcmluZ2JlbG93ID0gMHgxZTAwO1xuICB0LkFyaW5nc21hbGwgPSAweGY3ZTU7XG4gIHQuQXNtYWxsID0gMHhmNzYxO1xuICB0LkF0aWxkZSA9IDB4MDBjMztcbiAgdC5BdGlsZGVzbWFsbCA9IDB4ZjdlMztcbiAgdC5BeWJhcm1lbmlhbiA9IDB4MDUzMTtcbiAgdC5CID0gMHgwMDQyO1xuICB0LkJjaXJjbGUgPSAweDI0Yjc7XG4gIHQuQmRvdGFjY2VudCA9IDB4MWUwMjtcbiAgdC5CZG90YmVsb3cgPSAweDFlMDQ7XG4gIHQuQmVjeXJpbGxpYyA9IDB4MDQxMTtcbiAgdC5CZW5hcm1lbmlhbiA9IDB4MDUzMjtcbiAgdC5CZXRhID0gMHgwMzkyO1xuICB0LkJob29rID0gMHgwMTgxO1xuICB0LkJsaW5lYmVsb3cgPSAweDFlMDY7XG4gIHQuQm1vbm9zcGFjZSA9IDB4ZmYyMjtcbiAgdC5CcmV2ZXNtYWxsID0gMHhmNmY0O1xuICB0LkJzbWFsbCA9IDB4Zjc2MjtcbiAgdC5CdG9wYmFyID0gMHgwMTgyO1xuICB0LkMgPSAweDAwNDM7XG4gIHQuQ2Fhcm1lbmlhbiA9IDB4MDUzZTtcbiAgdC5DYWN1dGUgPSAweDAxMDY7XG4gIHQuQ2Fyb24gPSAweGY2Y2E7XG4gIHQuQ2Fyb25zbWFsbCA9IDB4ZjZmNTtcbiAgdC5DY2Fyb24gPSAweDAxMGM7XG4gIHQuQ2NlZGlsbGEgPSAweDAwYzc7XG4gIHQuQ2NlZGlsbGFhY3V0ZSA9IDB4MWUwODtcbiAgdC5DY2VkaWxsYXNtYWxsID0gMHhmN2U3O1xuICB0LkNjaXJjbGUgPSAweDI0Yjg7XG4gIHQuQ2NpcmN1bWZsZXggPSAweDAxMDg7XG4gIHQuQ2RvdCA9IDB4MDEwYTtcbiAgdC5DZG90YWNjZW50ID0gMHgwMTBhO1xuICB0LkNlZGlsbGFzbWFsbCA9IDB4ZjdiODtcbiAgdC5DaGFhcm1lbmlhbiA9IDB4MDU0OTtcbiAgdC5DaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiYztcbiAgdC5DaGVjeXJpbGxpYyA9IDB4MDQyNztcbiAgdC5DaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZTtcbiAgdC5DaGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiNjtcbiAgdC5DaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY0O1xuICB0LkNoZWhhcm1lbmlhbiA9IDB4MDU0MztcbiAgdC5DaGVraGFrYXNzaWFuY3lyaWxsaWMgPSAweDA0Y2I7XG4gIHQuQ2hldmVydGljYWxzdHJva2VjeXJpbGxpYyA9IDB4MDRiODtcbiAgdC5DaGkgPSAweDAzYTc7XG4gIHQuQ2hvb2sgPSAweDAxODc7XG4gIHQuQ2lyY3VtZmxleHNtYWxsID0gMHhmNmY2O1xuICB0LkNtb25vc3BhY2UgPSAweGZmMjM7XG4gIHQuQ29hcm1lbmlhbiA9IDB4MDU1MTtcbiAgdC5Dc21hbGwgPSAweGY3NjM7XG4gIHQuRCA9IDB4MDA0NDtcbiAgdC5EWiA9IDB4MDFmMTtcbiAgdC5EWmNhcm9uID0gMHgwMWM0O1xuICB0LkRhYXJtZW5pYW4gPSAweDA1MzQ7XG4gIHQuRGFmcmljYW4gPSAweDAxODk7XG4gIHQuRGNhcm9uID0gMHgwMTBlO1xuICB0LkRjZWRpbGxhID0gMHgxZTEwO1xuICB0LkRjaXJjbGUgPSAweDI0Yjk7XG4gIHQuRGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxMjtcbiAgdC5EY3JvYXQgPSAweDAxMTA7XG4gIHQuRGRvdGFjY2VudCA9IDB4MWUwYTtcbiAgdC5EZG90YmVsb3cgPSAweDFlMGM7XG4gIHQuRGVjeXJpbGxpYyA9IDB4MDQxNDtcbiAgdC5EZWljb3B0aWMgPSAweDAzZWU7XG4gIHQuRGVsdGEgPSAweDIyMDY7XG4gIHQuRGVsdGFncmVlayA9IDB4MDM5NDtcbiAgdC5EaG9vayA9IDB4MDE4YTtcbiAgdC5EaWVyZXNpcyA9IDB4ZjZjYjtcbiAgdC5EaWVyZXNpc0FjdXRlID0gMHhmNmNjO1xuICB0LkRpZXJlc2lzR3JhdmUgPSAweGY2Y2Q7XG4gIHQuRGllcmVzaXNzbWFsbCA9IDB4ZjdhODtcbiAgdC5EaWdhbW1hZ3JlZWsgPSAweDAzZGM7XG4gIHQuRGplY3lyaWxsaWMgPSAweDA0MDI7XG4gIHQuRGxpbmViZWxvdyA9IDB4MWUwZTtcbiAgdC5EbW9ub3NwYWNlID0gMHhmZjI0O1xuICB0LkRvdGFjY2VudHNtYWxsID0gMHhmNmY3O1xuICB0LkRzbGFzaCA9IDB4MDExMDtcbiAgdC5Ec21hbGwgPSAweGY3NjQ7XG4gIHQuRHRvcGJhciA9IDB4MDE4YjtcbiAgdC5EeiA9IDB4MDFmMjtcbiAgdC5EemNhcm9uID0gMHgwMWM1O1xuICB0LkR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUwO1xuICB0LkR6ZWN5cmlsbGljID0gMHgwNDA1O1xuICB0LkR6aGVjeXJpbGxpYyA9IDB4MDQwZjtcbiAgdC5FID0gMHgwMDQ1O1xuICB0LkVhY3V0ZSA9IDB4MDBjOTtcbiAgdC5FYWN1dGVzbWFsbCA9IDB4ZjdlOTtcbiAgdC5FYnJldmUgPSAweDAxMTQ7XG4gIHQuRWNhcm9uID0gMHgwMTFhO1xuICB0LkVjZWRpbGxhYnJldmUgPSAweDFlMWM7XG4gIHQuRWNoYXJtZW5pYW4gPSAweDA1MzU7XG4gIHQuRWNpcmNsZSA9IDB4MjRiYTtcbiAgdC5FY2lyY3VtZmxleCA9IDB4MDBjYTtcbiAgdC5FY2lyY3VtZmxleGFjdXRlID0gMHgxZWJlO1xuICB0LkVjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTg7XG4gIHQuRWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVjNjtcbiAgdC5FY2lyY3VtZmxleGdyYXZlID0gMHgxZWMwO1xuICB0LkVjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWMyO1xuICB0LkVjaXJjdW1mbGV4c21hbGwgPSAweGY3ZWE7XG4gIHQuRWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNDtcbiAgdC5FY3lyaWxsaWMgPSAweDA0MDQ7XG4gIHQuRWRibGdyYXZlID0gMHgwMjA0O1xuICB0LkVkaWVyZXNpcyA9IDB4MDBjYjtcbiAgdC5FZGllcmVzaXNzbWFsbCA9IDB4ZjdlYjtcbiAgdC5FZG90ID0gMHgwMTE2O1xuICB0LkVkb3RhY2NlbnQgPSAweDAxMTY7XG4gIHQuRWRvdGJlbG93ID0gMHgxZWI4O1xuICB0LkVmY3lyaWxsaWMgPSAweDA0MjQ7XG4gIHQuRWdyYXZlID0gMHgwMGM4O1xuICB0LkVncmF2ZXNtYWxsID0gMHhmN2U4O1xuICB0LkVoYXJtZW5pYW4gPSAweDA1Mzc7XG4gIHQuRWhvb2thYm92ZSA9IDB4MWViYTtcbiAgdC5FaWdodHJvbWFuID0gMHgyMTY3O1xuICB0LkVpbnZlcnRlZGJyZXZlID0gMHgwMjA2O1xuICB0LkVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY0O1xuICB0LkVsY3lyaWxsaWMgPSAweDA0MWI7XG4gIHQuRWxldmVucm9tYW4gPSAweDIxNmE7XG4gIHQuRW1hY3JvbiA9IDB4MDExMjtcbiAgdC5FbWFjcm9uYWN1dGUgPSAweDFlMTY7XG4gIHQuRW1hY3JvbmdyYXZlID0gMHgxZTE0O1xuICB0LkVtY3lyaWxsaWMgPSAweDA0MWM7XG4gIHQuRW1vbm9zcGFjZSA9IDB4ZmYyNTtcbiAgdC5FbmN5cmlsbGljID0gMHgwNDFkO1xuICB0LkVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTI7XG4gIHQuRW5nID0gMHgwMTRhO1xuICB0LkVuZ2hlY3lyaWxsaWMgPSAweDA0YTQ7XG4gIHQuRW5ob29rY3lyaWxsaWMgPSAweDA0Yzc7XG4gIHQuRW9nb25layA9IDB4MDExODtcbiAgdC5Fb3BlbiA9IDB4MDE5MDtcbiAgdC5FcHNpbG9uID0gMHgwMzk1O1xuICB0LkVwc2lsb250b25vcyA9IDB4MDM4ODtcbiAgdC5FcmN5cmlsbGljID0gMHgwNDIwO1xuICB0LkVyZXZlcnNlZCA9IDB4MDE4ZTtcbiAgdC5FcmV2ZXJzZWRjeXJpbGxpYyA9IDB4MDQyZDtcbiAgdC5Fc2N5cmlsbGljID0gMHgwNDIxO1xuICB0LkVzZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWE7XG4gIHQuRXNoID0gMHgwMWE5O1xuICB0LkVzbWFsbCA9IDB4Zjc2NTtcbiAgdC5FdGEgPSAweDAzOTc7XG4gIHQuRXRhcm1lbmlhbiA9IDB4MDUzODtcbiAgdC5FdGF0b25vcyA9IDB4MDM4OTtcbiAgdC5FdGggPSAweDAwZDA7XG4gIHQuRXRoc21hbGwgPSAweGY3ZjA7XG4gIHQuRXRpbGRlID0gMHgxZWJjO1xuICB0LkV0aWxkZWJlbG93ID0gMHgxZTFhO1xuICB0LkV1cm8gPSAweDIwYWM7XG4gIHQuRXpoID0gMHgwMWI3O1xuICB0LkV6aGNhcm9uID0gMHgwMWVlO1xuICB0LkV6aHJldmVyc2VkID0gMHgwMWI4O1xuICB0LkYgPSAweDAwNDY7XG4gIHQuRmNpcmNsZSA9IDB4MjRiYjtcbiAgdC5GZG90YWNjZW50ID0gMHgxZTFlO1xuICB0LkZlaGFybWVuaWFuID0gMHgwNTU2O1xuICB0LkZlaWNvcHRpYyA9IDB4MDNlNDtcbiAgdC5GaG9vayA9IDB4MDE5MTtcbiAgdC5GaXRhY3lyaWxsaWMgPSAweDA0NzI7XG4gIHQuRml2ZXJvbWFuID0gMHgyMTY0O1xuICB0LkZtb25vc3BhY2UgPSAweGZmMjY7XG4gIHQuRm91cnJvbWFuID0gMHgyMTYzO1xuICB0LkZzbWFsbCA9IDB4Zjc2NjtcbiAgdC5HID0gMHgwMDQ3O1xuICB0LkdCc3F1YXJlID0gMHgzMzg3O1xuICB0LkdhY3V0ZSA9IDB4MDFmNDtcbiAgdC5HYW1tYSA9IDB4MDM5MztcbiAgdC5HYW1tYWFmcmljYW4gPSAweDAxOTQ7XG4gIHQuR2FuZ2lhY29wdGljID0gMHgwM2VhO1xuICB0LkdicmV2ZSA9IDB4MDExZTtcbiAgdC5HY2Fyb24gPSAweDAxZTY7XG4gIHQuR2NlZGlsbGEgPSAweDAxMjI7XG4gIHQuR2NpcmNsZSA9IDB4MjRiYztcbiAgdC5HY2lyY3VtZmxleCA9IDB4MDExYztcbiAgdC5HY29tbWFhY2NlbnQgPSAweDAxMjI7XG4gIHQuR2RvdCA9IDB4MDEyMDtcbiAgdC5HZG90YWNjZW50ID0gMHgwMTIwO1xuICB0LkdlY3lyaWxsaWMgPSAweDA0MTM7XG4gIHQuR2hhZGFybWVuaWFuID0gMHgwNTQyO1xuICB0LkdoZW1pZGRsZWhvb2tjeXJpbGxpYyA9IDB4MDQ5NDtcbiAgdC5HaGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MjtcbiAgdC5HaGV1cHR1cm5jeXJpbGxpYyA9IDB4MDQ5MDtcbiAgdC5HaG9vayA9IDB4MDE5MztcbiAgdC5HaW1hcm1lbmlhbiA9IDB4MDUzMztcbiAgdC5HamVjeXJpbGxpYyA9IDB4MDQwMztcbiAgdC5HbWFjcm9uID0gMHgxZTIwO1xuICB0Lkdtb25vc3BhY2UgPSAweGZmMjc7XG4gIHQuR3JhdmUgPSAweGY2Y2U7XG4gIHQuR3JhdmVzbWFsbCA9IDB4Zjc2MDtcbiAgdC5Hc21hbGwgPSAweGY3Njc7XG4gIHQuR3NtYWxsaG9vayA9IDB4MDI5YjtcbiAgdC5Hc3Ryb2tlID0gMHgwMWU0O1xuICB0LkggPSAweDAwNDg7XG4gIHQuSDE4NTMzID0gMHgyNWNmO1xuICB0LkgxODU0MyA9IDB4MjVhYTtcbiAgdC5IMTg1NTEgPSAweDI1YWI7XG4gIHQuSDIyMDczID0gMHgyNWExO1xuICB0LkhQc3F1YXJlID0gMHgzM2NiO1xuICB0LkhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTg7XG4gIHQuSGFkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiMjtcbiAgdC5IYXJkc2lnbmN5cmlsbGljID0gMHgwNDJhO1xuICB0LkhiYXIgPSAweDAxMjY7XG4gIHQuSGJyZXZlYmVsb3cgPSAweDFlMmE7XG4gIHQuSGNlZGlsbGEgPSAweDFlMjg7XG4gIHQuSGNpcmNsZSA9IDB4MjRiZDtcbiAgdC5IY2lyY3VtZmxleCA9IDB4MDEyNDtcbiAgdC5IZGllcmVzaXMgPSAweDFlMjY7XG4gIHQuSGRvdGFjY2VudCA9IDB4MWUyMjtcbiAgdC5IZG90YmVsb3cgPSAweDFlMjQ7XG4gIHQuSG1vbm9zcGFjZSA9IDB4ZmYyODtcbiAgdC5Ib2FybWVuaWFuID0gMHgwNTQwO1xuICB0Lkhvcmljb3B0aWMgPSAweDAzZTg7XG4gIHQuSHNtYWxsID0gMHhmNzY4O1xuICB0Lkh1bmdhcnVtbGF1dCA9IDB4ZjZjZjtcbiAgdC5IdW5nYXJ1bWxhdXRzbWFsbCA9IDB4ZjZmODtcbiAgdC5IenNxdWFyZSA9IDB4MzM5MDtcbiAgdC5JID0gMHgwMDQ5O1xuICB0LklBY3lyaWxsaWMgPSAweDA0MmY7XG4gIHQuSUogPSAweDAxMzI7XG4gIHQuSVVjeXJpbGxpYyA9IDB4MDQyZTtcbiAgdC5JYWN1dGUgPSAweDAwY2Q7XG4gIHQuSWFjdXRlc21hbGwgPSAweGY3ZWQ7XG4gIHQuSWJyZXZlID0gMHgwMTJjO1xuICB0LkljYXJvbiA9IDB4MDFjZjtcbiAgdC5JY2lyY2xlID0gMHgyNGJlO1xuICB0LkljaXJjdW1mbGV4ID0gMHgwMGNlO1xuICB0LkljaXJjdW1mbGV4c21hbGwgPSAweGY3ZWU7XG4gIHQuSWN5cmlsbGljID0gMHgwNDA2O1xuICB0LklkYmxncmF2ZSA9IDB4MDIwODtcbiAgdC5JZGllcmVzaXMgPSAweDAwY2Y7XG4gIHQuSWRpZXJlc2lzYWN1dGUgPSAweDFlMmU7XG4gIHQuSWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTQ7XG4gIHQuSWRpZXJlc2lzc21hbGwgPSAweGY3ZWY7XG4gIHQuSWRvdCA9IDB4MDEzMDtcbiAgdC5JZG90YWNjZW50ID0gMHgwMTMwO1xuICB0Lklkb3RiZWxvdyA9IDB4MWVjYTtcbiAgdC5JZWJyZXZlY3lyaWxsaWMgPSAweDA0ZDY7XG4gIHQuSWVjeXJpbGxpYyA9IDB4MDQxNTtcbiAgdC5JZnJha3R1ciA9IDB4MjExMTtcbiAgdC5JZ3JhdmUgPSAweDAwY2M7XG4gIHQuSWdyYXZlc21hbGwgPSAweGY3ZWM7XG4gIHQuSWhvb2thYm92ZSA9IDB4MWVjODtcbiAgdC5JaWN5cmlsbGljID0gMHgwNDE4O1xuICB0LklpbnZlcnRlZGJyZXZlID0gMHgwMjBhO1xuICB0Lklpc2hvcnRjeXJpbGxpYyA9IDB4MDQxOTtcbiAgdC5JbWFjcm9uID0gMHgwMTJhO1xuICB0LkltYWNyb25jeXJpbGxpYyA9IDB4MDRlMjtcbiAgdC5JbW9ub3NwYWNlID0gMHhmZjI5O1xuICB0LkluaWFybWVuaWFuID0gMHgwNTNiO1xuICB0LklvY3lyaWxsaWMgPSAweDA0MDE7XG4gIHQuSW9nb25layA9IDB4MDEyZTtcbiAgdC5Jb3RhID0gMHgwMzk5O1xuICB0LklvdGFhZnJpY2FuID0gMHgwMTk2O1xuICB0LklvdGFkaWVyZXNpcyA9IDB4MDNhYTtcbiAgdC5Jb3RhdG9ub3MgPSAweDAzOGE7XG4gIHQuSXNtYWxsID0gMHhmNzY5O1xuICB0LklzdHJva2UgPSAweDAxOTc7XG4gIHQuSXRpbGRlID0gMHgwMTI4O1xuICB0Lkl0aWxkZWJlbG93ID0gMHgxZTJjO1xuICB0Lkl6aGl0c2FjeXJpbGxpYyA9IDB4MDQ3NDtcbiAgdC5JemhpdHNhZGJsZ3JhdmVjeXJpbGxpYyA9IDB4MDQ3NjtcbiAgdC5KID0gMHgwMDRhO1xuICB0LkphYXJtZW5pYW4gPSAweDA1NDE7XG4gIHQuSmNpcmNsZSA9IDB4MjRiZjtcbiAgdC5KY2lyY3VtZmxleCA9IDB4MDEzNDtcbiAgdC5KZWN5cmlsbGljID0gMHgwNDA4O1xuICB0LkpoZWhhcm1lbmlhbiA9IDB4MDU0YjtcbiAgdC5KbW9ub3NwYWNlID0gMHhmZjJhO1xuICB0LkpzbWFsbCA9IDB4Zjc2YTtcbiAgdC5LID0gMHgwMDRiO1xuICB0LktCc3F1YXJlID0gMHgzMzg1O1xuICB0LktLc3F1YXJlID0gMHgzM2NkO1xuICB0LkthYmFzaGtpcmN5cmlsbGljID0gMHgwNGEwO1xuICB0LkthY3V0ZSA9IDB4MWUzMDtcbiAgdC5LYWN5cmlsbGljID0gMHgwNDFhO1xuICB0LkthZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OWE7XG4gIHQuS2Fob29rY3lyaWxsaWMgPSAweDA0YzM7XG4gIHQuS2FwcGEgPSAweDAzOWE7XG4gIHQuS2FzdHJva2VjeXJpbGxpYyA9IDB4MDQ5ZTtcbiAgdC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWM7XG4gIHQuS2Nhcm9uID0gMHgwMWU4O1xuICB0LktjZWRpbGxhID0gMHgwMTM2O1xuICB0LktjaXJjbGUgPSAweDI0YzA7XG4gIHQuS2NvbW1hYWNjZW50ID0gMHgwMTM2O1xuICB0Lktkb3RiZWxvdyA9IDB4MWUzMjtcbiAgdC5LZWhhcm1lbmlhbiA9IDB4MDU1NDtcbiAgdC5LZW5hcm1lbmlhbiA9IDB4MDUzZjtcbiAgdC5LaGFjeXJpbGxpYyA9IDB4MDQyNTtcbiAgdC5LaGVpY29wdGljID0gMHgwM2U2O1xuICB0Lktob29rID0gMHgwMTk4O1xuICB0LktqZWN5cmlsbGljID0gMHgwNDBjO1xuICB0LktsaW5lYmVsb3cgPSAweDFlMzQ7XG4gIHQuS21vbm9zcGFjZSA9IDB4ZmYyYjtcbiAgdC5Lb3BwYWN5cmlsbGljID0gMHgwNDgwO1xuICB0LktvcHBhZ3JlZWsgPSAweDAzZGU7XG4gIHQuS3NpY3lyaWxsaWMgPSAweDA0NmU7XG4gIHQuS3NtYWxsID0gMHhmNzZiO1xuICB0LkwgPSAweDAwNGM7XG4gIHQuTEogPSAweDAxYzc7XG4gIHQuTEwgPSAweGY2YmY7XG4gIHQuTGFjdXRlID0gMHgwMTM5O1xuICB0LkxhbWJkYSA9IDB4MDM5YjtcbiAgdC5MY2Fyb24gPSAweDAxM2Q7XG4gIHQuTGNlZGlsbGEgPSAweDAxM2I7XG4gIHQuTGNpcmNsZSA9IDB4MjRjMTtcbiAgdC5MY2lyY3VtZmxleGJlbG93ID0gMHgxZTNjO1xuICB0Lkxjb21tYWFjY2VudCA9IDB4MDEzYjtcbiAgdC5MZG90ID0gMHgwMTNmO1xuICB0Lkxkb3RhY2NlbnQgPSAweDAxM2Y7XG4gIHQuTGRvdGJlbG93ID0gMHgxZTM2O1xuICB0Lkxkb3RiZWxvd21hY3JvbiA9IDB4MWUzODtcbiAgdC5MaXduYXJtZW5pYW4gPSAweDA1M2M7XG4gIHQuTGogPSAweDAxYzg7XG4gIHQuTGplY3lyaWxsaWMgPSAweDA0MDk7XG4gIHQuTGxpbmViZWxvdyA9IDB4MWUzYTtcbiAgdC5MbW9ub3NwYWNlID0gMHhmZjJjO1xuICB0LkxzbGFzaCA9IDB4MDE0MTtcbiAgdC5Mc2xhc2hzbWFsbCA9IDB4ZjZmOTtcbiAgdC5Mc21hbGwgPSAweGY3NmM7XG4gIHQuTSA9IDB4MDA0ZDtcbiAgdC5NQnNxdWFyZSA9IDB4MzM4NjtcbiAgdC5NYWNyb24gPSAweGY2ZDA7XG4gIHQuTWFjcm9uc21hbGwgPSAweGY3YWY7XG4gIHQuTWFjdXRlID0gMHgxZTNlO1xuICB0Lk1jaXJjbGUgPSAweDI0YzI7XG4gIHQuTWRvdGFjY2VudCA9IDB4MWU0MDtcbiAgdC5NZG90YmVsb3cgPSAweDFlNDI7XG4gIHQuTWVuYXJtZW5pYW4gPSAweDA1NDQ7XG4gIHQuTW1vbm9zcGFjZSA9IDB4ZmYyZDtcbiAgdC5Nc21hbGwgPSAweGY3NmQ7XG4gIHQuTXR1cm5lZCA9IDB4MDE5YztcbiAgdC5NdSA9IDB4MDM5YztcbiAgdC5OID0gMHgwMDRlO1xuICB0Lk5KID0gMHgwMWNhO1xuICB0Lk5hY3V0ZSA9IDB4MDE0MztcbiAgdC5OY2Fyb24gPSAweDAxNDc7XG4gIHQuTmNlZGlsbGEgPSAweDAxNDU7XG4gIHQuTmNpcmNsZSA9IDB4MjRjMztcbiAgdC5OY2lyY3VtZmxleGJlbG93ID0gMHgxZTRhO1xuICB0Lk5jb21tYWFjY2VudCA9IDB4MDE0NTtcbiAgdC5OZG90YWNjZW50ID0gMHgxZTQ0O1xuICB0Lk5kb3RiZWxvdyA9IDB4MWU0NjtcbiAgdC5OaG9va2xlZnQgPSAweDAxOWQ7XG4gIHQuTmluZXJvbWFuID0gMHgyMTY4O1xuICB0Lk5qID0gMHgwMWNiO1xuICB0Lk5qZWN5cmlsbGljID0gMHgwNDBhO1xuICB0Lk5saW5lYmVsb3cgPSAweDFlNDg7XG4gIHQuTm1vbm9zcGFjZSA9IDB4ZmYyZTtcbiAgdC5Ob3dhcm1lbmlhbiA9IDB4MDU0NjtcbiAgdC5Oc21hbGwgPSAweGY3NmU7XG4gIHQuTnRpbGRlID0gMHgwMGQxO1xuICB0Lk50aWxkZXNtYWxsID0gMHhmN2YxO1xuICB0Lk51ID0gMHgwMzlkO1xuICB0Lk8gPSAweDAwNGY7XG4gIHQuT0UgPSAweDAxNTI7XG4gIHQuT0VzbWFsbCA9IDB4ZjZmYTtcbiAgdC5PYWN1dGUgPSAweDAwZDM7XG4gIHQuT2FjdXRlc21hbGwgPSAweGY3ZjM7XG4gIHQuT2JhcnJlZGN5cmlsbGljID0gMHgwNGU4O1xuICB0Lk9iYXJyZWRkaWVyZXNpc2N5cmlsbGljID0gMHgwNGVhO1xuICB0Lk9icmV2ZSA9IDB4MDE0ZTtcbiAgdC5PY2Fyb24gPSAweDAxZDE7XG4gIHQuT2NlbnRlcmVkdGlsZGUgPSAweDAxOWY7XG4gIHQuT2NpcmNsZSA9IDB4MjRjNDtcbiAgdC5PY2lyY3VtZmxleCA9IDB4MDBkNDtcbiAgdC5PY2lyY3VtZmxleGFjdXRlID0gMHgxZWQwO1xuICB0Lk9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDg7XG4gIHQuT2NpcmN1bWZsZXhncmF2ZSA9IDB4MWVkMjtcbiAgdC5PY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVkNDtcbiAgdC5PY2lyY3VtZmxleHNtYWxsID0gMHhmN2Y0O1xuICB0Lk9jaXJjdW1mbGV4dGlsZGUgPSAweDFlZDY7XG4gIHQuT2N5cmlsbGljID0gMHgwNDFlO1xuICB0Lk9kYmxhY3V0ZSA9IDB4MDE1MDtcbiAgdC5PZGJsZ3JhdmUgPSAweDAyMGM7XG4gIHQuT2RpZXJlc2lzID0gMHgwMGQ2O1xuICB0Lk9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU2O1xuICB0Lk9kaWVyZXNpc3NtYWxsID0gMHhmN2Y2O1xuICB0Lk9kb3RiZWxvdyA9IDB4MWVjYztcbiAgdC5PZ29uZWtzbWFsbCA9IDB4ZjZmYjtcbiAgdC5PZ3JhdmUgPSAweDAwZDI7XG4gIHQuT2dyYXZlc21hbGwgPSAweGY3ZjI7XG4gIHQuT2hhcm1lbmlhbiA9IDB4MDU1NTtcbiAgdC5PaG0gPSAweDIxMjY7XG4gIHQuT2hvb2thYm92ZSA9IDB4MWVjZTtcbiAgdC5PaG9ybiA9IDB4MDFhMDtcbiAgdC5PaG9ybmFjdXRlID0gMHgxZWRhO1xuICB0Lk9ob3JuZG90YmVsb3cgPSAweDFlZTI7XG4gIHQuT2hvcm5ncmF2ZSA9IDB4MWVkYztcbiAgdC5PaG9ybmhvb2thYm92ZSA9IDB4MWVkZTtcbiAgdC5PaG9ybnRpbGRlID0gMHgxZWUwO1xuICB0Lk9odW5nYXJ1bWxhdXQgPSAweDAxNTA7XG4gIHQuT2kgPSAweDAxYTI7XG4gIHQuT2ludmVydGVkYnJldmUgPSAweDAyMGU7XG4gIHQuT21hY3JvbiA9IDB4MDE0YztcbiAgdC5PbWFjcm9uYWN1dGUgPSAweDFlNTI7XG4gIHQuT21hY3JvbmdyYXZlID0gMHgxZTUwO1xuICB0Lk9tZWdhID0gMHgyMTI2O1xuICB0Lk9tZWdhY3lyaWxsaWMgPSAweDA0NjA7XG4gIHQuT21lZ2FncmVlayA9IDB4MDNhOTtcbiAgdC5PbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2E7XG4gIHQuT21lZ2F0aXRsb2N5cmlsbGljID0gMHgwNDdjO1xuICB0Lk9tZWdhdG9ub3MgPSAweDAzOGY7XG4gIHQuT21pY3JvbiA9IDB4MDM5ZjtcbiAgdC5PbWljcm9udG9ub3MgPSAweDAzOGM7XG4gIHQuT21vbm9zcGFjZSA9IDB4ZmYyZjtcbiAgdC5PbmVyb21hbiA9IDB4MjE2MDtcbiAgdC5Pb2dvbmVrID0gMHgwMWVhO1xuICB0Lk9vZ29uZWttYWNyb24gPSAweDAxZWM7XG4gIHQuT29wZW4gPSAweDAxODY7XG4gIHQuT3NsYXNoID0gMHgwMGQ4O1xuICB0Lk9zbGFzaGFjdXRlID0gMHgwMWZlO1xuICB0Lk9zbGFzaHNtYWxsID0gMHhmN2Y4O1xuICB0Lk9zbWFsbCA9IDB4Zjc2ZjtcbiAgdC5Pc3Ryb2tlYWN1dGUgPSAweDAxZmU7XG4gIHQuT3RjeXJpbGxpYyA9IDB4MDQ3ZTtcbiAgdC5PdGlsZGUgPSAweDAwZDU7XG4gIHQuT3RpbGRlYWN1dGUgPSAweDFlNGM7XG4gIHQuT3RpbGRlZGllcmVzaXMgPSAweDFlNGU7XG4gIHQuT3RpbGRlc21hbGwgPSAweGY3ZjU7XG4gIHQuUCA9IDB4MDA1MDtcbiAgdC5QYWN1dGUgPSAweDFlNTQ7XG4gIHQuUGNpcmNsZSA9IDB4MjRjNTtcbiAgdC5QZG90YWNjZW50ID0gMHgxZTU2O1xuICB0LlBlY3lyaWxsaWMgPSAweDA0MWY7XG4gIHQuUGVoYXJtZW5pYW4gPSAweDA1NGE7XG4gIHQuUGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0YTY7XG4gIHQuUGhpID0gMHgwM2E2O1xuICB0LlBob29rID0gMHgwMWE0O1xuICB0LlBpID0gMHgwM2EwO1xuICB0LlBpd3Jhcm1lbmlhbiA9IDB4MDU1MztcbiAgdC5QbW9ub3NwYWNlID0gMHhmZjMwO1xuICB0LlBzaSA9IDB4MDNhODtcbiAgdC5Qc2ljeXJpbGxpYyA9IDB4MDQ3MDtcbiAgdC5Qc21hbGwgPSAweGY3NzA7XG4gIHQuUSA9IDB4MDA1MTtcbiAgdC5RY2lyY2xlID0gMHgyNGM2O1xuICB0LlFtb25vc3BhY2UgPSAweGZmMzE7XG4gIHQuUXNtYWxsID0gMHhmNzcxO1xuICB0LlIgPSAweDAwNTI7XG4gIHQuUmFhcm1lbmlhbiA9IDB4MDU0YztcbiAgdC5SYWN1dGUgPSAweDAxNTQ7XG4gIHQuUmNhcm9uID0gMHgwMTU4O1xuICB0LlJjZWRpbGxhID0gMHgwMTU2O1xuICB0LlJjaXJjbGUgPSAweDI0Yzc7XG4gIHQuUmNvbW1hYWNjZW50ID0gMHgwMTU2O1xuICB0LlJkYmxncmF2ZSA9IDB4MDIxMDtcbiAgdC5SZG90YWNjZW50ID0gMHgxZTU4O1xuICB0LlJkb3RiZWxvdyA9IDB4MWU1YTtcbiAgdC5SZG90YmVsb3dtYWNyb24gPSAweDFlNWM7XG4gIHQuUmVoYXJtZW5pYW4gPSAweDA1NTA7XG4gIHQuUmZyYWt0dXIgPSAweDIxMWM7XG4gIHQuUmhvID0gMHgwM2ExO1xuICB0LlJpbmdzbWFsbCA9IDB4ZjZmYztcbiAgdC5SaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMjtcbiAgdC5SbGluZWJlbG93ID0gMHgxZTVlO1xuICB0LlJtb25vc3BhY2UgPSAweGZmMzI7XG4gIHQuUnNtYWxsID0gMHhmNzcyO1xuICB0LlJzbWFsbGludmVydGVkID0gMHgwMjgxO1xuICB0LlJzbWFsbGludmVydGVkc3VwZXJpb3IgPSAweDAyYjY7XG4gIHQuUyA9IDB4MDA1MztcbiAgdC5TRjAxMDAwMCA9IDB4MjUwYztcbiAgdC5TRjAyMDAwMCA9IDB4MjUxNDtcbiAgdC5TRjAzMDAwMCA9IDB4MjUxMDtcbiAgdC5TRjA0MDAwMCA9IDB4MjUxODtcbiAgdC5TRjA1MDAwMCA9IDB4MjUzYztcbiAgdC5TRjA2MDAwMCA9IDB4MjUyYztcbiAgdC5TRjA3MDAwMCA9IDB4MjUzNDtcbiAgdC5TRjA4MDAwMCA9IDB4MjUxYztcbiAgdC5TRjA5MDAwMCA9IDB4MjUyNDtcbiAgdC5TRjEwMDAwMCA9IDB4MjUwMDtcbiAgdC5TRjExMDAwMCA9IDB4MjUwMjtcbiAgdC5TRjE5MDAwMCA9IDB4MjU2MTtcbiAgdC5TRjIwMDAwMCA9IDB4MjU2MjtcbiAgdC5TRjIxMDAwMCA9IDB4MjU1NjtcbiAgdC5TRjIyMDAwMCA9IDB4MjU1NTtcbiAgdC5TRjIzMDAwMCA9IDB4MjU2MztcbiAgdC5TRjI0MDAwMCA9IDB4MjU1MTtcbiAgdC5TRjI1MDAwMCA9IDB4MjU1NztcbiAgdC5TRjI2MDAwMCA9IDB4MjU1ZDtcbiAgdC5TRjI3MDAwMCA9IDB4MjU1YztcbiAgdC5TRjI4MDAwMCA9IDB4MjU1YjtcbiAgdC5TRjM2MDAwMCA9IDB4MjU1ZTtcbiAgdC5TRjM3MDAwMCA9IDB4MjU1ZjtcbiAgdC5TRjM4MDAwMCA9IDB4MjU1YTtcbiAgdC5TRjM5MDAwMCA9IDB4MjU1NDtcbiAgdC5TRjQwMDAwMCA9IDB4MjU2OTtcbiAgdC5TRjQxMDAwMCA9IDB4MjU2NjtcbiAgdC5TRjQyMDAwMCA9IDB4MjU2MDtcbiAgdC5TRjQzMDAwMCA9IDB4MjU1MDtcbiAgdC5TRjQ0MDAwMCA9IDB4MjU2YztcbiAgdC5TRjQ1MDAwMCA9IDB4MjU2NztcbiAgdC5TRjQ2MDAwMCA9IDB4MjU2ODtcbiAgdC5TRjQ3MDAwMCA9IDB4MjU2NDtcbiAgdC5TRjQ4MDAwMCA9IDB4MjU2NTtcbiAgdC5TRjQ5MDAwMCA9IDB4MjU1OTtcbiAgdC5TRjUwMDAwMCA9IDB4MjU1ODtcbiAgdC5TRjUxMDAwMCA9IDB4MjU1MjtcbiAgdC5TRjUyMDAwMCA9IDB4MjU1MztcbiAgdC5TRjUzMDAwMCA9IDB4MjU2YjtcbiAgdC5TRjU0MDAwMCA9IDB4MjU2YTtcbiAgdC5TYWN1dGUgPSAweDAxNWE7XG4gIHQuU2FjdXRlZG90YWNjZW50ID0gMHgxZTY0O1xuICB0LlNhbXBpZ3JlZWsgPSAweDAzZTA7XG4gIHQuU2Nhcm9uID0gMHgwMTYwO1xuICB0LlNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NjtcbiAgdC5TY2Fyb25zbWFsbCA9IDB4ZjZmZDtcbiAgdC5TY2VkaWxsYSA9IDB4MDE1ZTtcbiAgdC5TY2h3YSA9IDB4MDE4ZjtcbiAgdC5TY2h3YWN5cmlsbGljID0gMHgwNGQ4O1xuICB0LlNjaHdhZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkYTtcbiAgdC5TY2lyY2xlID0gMHgyNGM4O1xuICB0LlNjaXJjdW1mbGV4ID0gMHgwMTVjO1xuICB0LlNjb21tYWFjY2VudCA9IDB4MDIxODtcbiAgdC5TZG90YWNjZW50ID0gMHgxZTYwO1xuICB0LlNkb3RiZWxvdyA9IDB4MWU2MjtcbiAgdC5TZG90YmVsb3dkb3RhY2NlbnQgPSAweDFlNjg7XG4gIHQuU2VoYXJtZW5pYW4gPSAweDA1NGQ7XG4gIHQuU2V2ZW5yb21hbiA9IDB4MjE2NjtcbiAgdC5TaGFhcm1lbmlhbiA9IDB4MDU0NztcbiAgdC5TaGFjeXJpbGxpYyA9IDB4MDQyODtcbiAgdC5TaGNoYWN5cmlsbGljID0gMHgwNDI5O1xuICB0LlNoZWljb3B0aWMgPSAweDAzZTI7XG4gIHQuU2hoYWN5cmlsbGljID0gMHgwNGJhO1xuICB0LlNoaW1hY29wdGljID0gMHgwM2VjO1xuICB0LlNpZ21hID0gMHgwM2EzO1xuICB0LlNpeHJvbWFuID0gMHgyMTY1O1xuICB0LlNtb25vc3BhY2UgPSAweGZmMzM7XG4gIHQuU29mdHNpZ25jeXJpbGxpYyA9IDB4MDQyYztcbiAgdC5Tc21hbGwgPSAweGY3NzM7XG4gIHQuU3RpZ21hZ3JlZWsgPSAweDAzZGE7XG4gIHQuVCA9IDB4MDA1NDtcbiAgdC5UYXUgPSAweDAzYTQ7XG4gIHQuVGJhciA9IDB4MDE2NjtcbiAgdC5UY2Fyb24gPSAweDAxNjQ7XG4gIHQuVGNlZGlsbGEgPSAweDAxNjI7XG4gIHQuVGNpcmNsZSA9IDB4MjRjOTtcbiAgdC5UY2lyY3VtZmxleGJlbG93ID0gMHgxZTcwO1xuICB0LlRjb21tYWFjY2VudCA9IDB4MDE2MjtcbiAgdC5UZG90YWNjZW50ID0gMHgxZTZhO1xuICB0LlRkb3RiZWxvdyA9IDB4MWU2YztcbiAgdC5UZWN5cmlsbGljID0gMHgwNDIyO1xuICB0LlRlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWM7XG4gIHQuVGVucm9tYW4gPSAweDIxNjk7XG4gIHQuVGV0c2VjeXJpbGxpYyA9IDB4MDRiNDtcbiAgdC5UaGV0YSA9IDB4MDM5ODtcbiAgdC5UaG9vayA9IDB4MDFhYztcbiAgdC5UaG9ybiA9IDB4MDBkZTtcbiAgdC5UaG9ybnNtYWxsID0gMHhmN2ZlO1xuICB0LlRocmVlcm9tYW4gPSAweDIxNjI7XG4gIHQuVGlsZGVzbWFsbCA9IDB4ZjZmZTtcbiAgdC5UaXduYXJtZW5pYW4gPSAweDA1NGY7XG4gIHQuVGxpbmViZWxvdyA9IDB4MWU2ZTtcbiAgdC5UbW9ub3NwYWNlID0gMHhmZjM0O1xuICB0LlRvYXJtZW5pYW4gPSAweDA1Mzk7XG4gIHQuVG9uZWZpdmUgPSAweDAxYmM7XG4gIHQuVG9uZXNpeCA9IDB4MDE4NDtcbiAgdC5Ub25ldHdvID0gMHgwMWE3O1xuICB0LlRyZXRyb2ZsZXhob29rID0gMHgwMWFlO1xuICB0LlRzZWN5cmlsbGljID0gMHgwNDI2O1xuICB0LlRzaGVjeXJpbGxpYyA9IDB4MDQwYjtcbiAgdC5Uc21hbGwgPSAweGY3NzQ7XG4gIHQuVHdlbHZlcm9tYW4gPSAweDIxNmI7XG4gIHQuVHdvcm9tYW4gPSAweDIxNjE7XG4gIHQuVSA9IDB4MDA1NTtcbiAgdC5VYWN1dGUgPSAweDAwZGE7XG4gIHQuVWFjdXRlc21hbGwgPSAweGY3ZmE7XG4gIHQuVWJyZXZlID0gMHgwMTZjO1xuICB0LlVjYXJvbiA9IDB4MDFkMztcbiAgdC5VY2lyY2xlID0gMHgyNGNhO1xuICB0LlVjaXJjdW1mbGV4ID0gMHgwMGRiO1xuICB0LlVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzY7XG4gIHQuVWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdmYjtcbiAgdC5VY3lyaWxsaWMgPSAweDA0MjM7XG4gIHQuVWRibGFjdXRlID0gMHgwMTcwO1xuICB0LlVkYmxncmF2ZSA9IDB4MDIxNDtcbiAgdC5VZGllcmVzaXMgPSAweDAwZGM7XG4gIHQuVWRpZXJlc2lzYWN1dGUgPSAweDAxZDc7XG4gIHQuVWRpZXJlc2lzYmVsb3cgPSAweDFlNzI7XG4gIHQuVWRpZXJlc2lzY2Fyb24gPSAweDAxZDk7XG4gIHQuVWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjA7XG4gIHQuVWRpZXJlc2lzZ3JhdmUgPSAweDAxZGI7XG4gIHQuVWRpZXJlc2lzbWFjcm9uID0gMHgwMWQ1O1xuICB0LlVkaWVyZXNpc3NtYWxsID0gMHhmN2ZjO1xuICB0LlVkb3RiZWxvdyA9IDB4MWVlNDtcbiAgdC5VZ3JhdmUgPSAweDAwZDk7XG4gIHQuVWdyYXZlc21hbGwgPSAweGY3Zjk7XG4gIHQuVWhvb2thYm92ZSA9IDB4MWVlNjtcbiAgdC5VaG9ybiA9IDB4MDFhZjtcbiAgdC5VaG9ybmFjdXRlID0gMHgxZWU4O1xuICB0LlVob3JuZG90YmVsb3cgPSAweDFlZjA7XG4gIHQuVWhvcm5ncmF2ZSA9IDB4MWVlYTtcbiAgdC5VaG9ybmhvb2thYm92ZSA9IDB4MWVlYztcbiAgdC5VaG9ybnRpbGRlID0gMHgxZWVlO1xuICB0LlVodW5nYXJ1bWxhdXQgPSAweDAxNzA7XG4gIHQuVWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYyO1xuICB0LlVpbnZlcnRlZGJyZXZlID0gMHgwMjE2O1xuICB0LlVrY3lyaWxsaWMgPSAweDA0Nzg7XG4gIHQuVW1hY3JvbiA9IDB4MDE2YTtcbiAgdC5VbWFjcm9uY3lyaWxsaWMgPSAweDA0ZWU7XG4gIHQuVW1hY3JvbmRpZXJlc2lzID0gMHgxZTdhO1xuICB0LlVtb25vc3BhY2UgPSAweGZmMzU7XG4gIHQuVW9nb25layA9IDB4MDE3MjtcbiAgdC5VcHNpbG9uID0gMHgwM2E1O1xuICB0LlVwc2lsb24xID0gMHgwM2QyO1xuICB0LlVwc2lsb25hY3V0ZWhvb2tzeW1ib2xncmVlayA9IDB4MDNkMztcbiAgdC5VcHNpbG9uYWZyaWNhbiA9IDB4MDFiMTtcbiAgdC5VcHNpbG9uZGllcmVzaXMgPSAweDAzYWI7XG4gIHQuVXBzaWxvbmRpZXJlc2lzaG9va3N5bWJvbGdyZWVrID0gMHgwM2Q0O1xuICB0LlVwc2lsb25ob29rc3ltYm9sID0gMHgwM2QyO1xuICB0LlVwc2lsb250b25vcyA9IDB4MDM4ZTtcbiAgdC5VcmluZyA9IDB4MDE2ZTtcbiAgdC5Vc2hvcnRjeXJpbGxpYyA9IDB4MDQwZTtcbiAgdC5Vc21hbGwgPSAweGY3NzU7XG4gIHQuVXN0cmFpZ2h0Y3lyaWxsaWMgPSAweDA0YWU7XG4gIHQuVXN0cmFpZ2h0c3Ryb2tlY3lyaWxsaWMgPSAweDA0YjA7XG4gIHQuVXRpbGRlID0gMHgwMTY4O1xuICB0LlV0aWxkZWFjdXRlID0gMHgxZTc4O1xuICB0LlV0aWxkZWJlbG93ID0gMHgxZTc0O1xuICB0LlYgPSAweDAwNTY7XG4gIHQuVmNpcmNsZSA9IDB4MjRjYjtcbiAgdC5WZG90YmVsb3cgPSAweDFlN2U7XG4gIHQuVmVjeXJpbGxpYyA9IDB4MDQxMjtcbiAgdC5WZXdhcm1lbmlhbiA9IDB4MDU0ZTtcbiAgdC5WaG9vayA9IDB4MDFiMjtcbiAgdC5WbW9ub3NwYWNlID0gMHhmZjM2O1xuICB0LlZvYXJtZW5pYW4gPSAweDA1NDg7XG4gIHQuVnNtYWxsID0gMHhmNzc2O1xuICB0LlZ0aWxkZSA9IDB4MWU3YztcbiAgdC5XID0gMHgwMDU3O1xuICB0LldhY3V0ZSA9IDB4MWU4MjtcbiAgdC5XY2lyY2xlID0gMHgyNGNjO1xuICB0LldjaXJjdW1mbGV4ID0gMHgwMTc0O1xuICB0LldkaWVyZXNpcyA9IDB4MWU4NDtcbiAgdC5XZG90YWNjZW50ID0gMHgxZTg2O1xuICB0Lldkb3RiZWxvdyA9IDB4MWU4ODtcbiAgdC5XZ3JhdmUgPSAweDFlODA7XG4gIHQuV21vbm9zcGFjZSA9IDB4ZmYzNztcbiAgdC5Xc21hbGwgPSAweGY3Nzc7XG4gIHQuWCA9IDB4MDA1ODtcbiAgdC5YY2lyY2xlID0gMHgyNGNkO1xuICB0LlhkaWVyZXNpcyA9IDB4MWU4YztcbiAgdC5YZG90YWNjZW50ID0gMHgxZThhO1xuICB0LlhlaGFybWVuaWFuID0gMHgwNTNkO1xuICB0LlhpID0gMHgwMzllO1xuICB0Llhtb25vc3BhY2UgPSAweGZmMzg7XG4gIHQuWHNtYWxsID0gMHhmNzc4O1xuICB0LlkgPSAweDAwNTk7XG4gIHQuWWFjdXRlID0gMHgwMGRkO1xuICB0LllhY3V0ZXNtYWxsID0gMHhmN2ZkO1xuICB0LllhdGN5cmlsbGljID0gMHgwNDYyO1xuICB0LlljaXJjbGUgPSAweDI0Y2U7XG4gIHQuWWNpcmN1bWZsZXggPSAweDAxNzY7XG4gIHQuWWRpZXJlc2lzID0gMHgwMTc4O1xuICB0LllkaWVyZXNpc3NtYWxsID0gMHhmN2ZmO1xuICB0Lllkb3RhY2NlbnQgPSAweDFlOGU7XG4gIHQuWWRvdGJlbG93ID0gMHgxZWY0O1xuICB0LlllcmljeXJpbGxpYyA9IDB4MDQyYjtcbiAgdC5ZZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmODtcbiAgdC5ZZ3JhdmUgPSAweDFlZjI7XG4gIHQuWWhvb2sgPSAweDAxYjM7XG4gIHQuWWhvb2thYm92ZSA9IDB4MWVmNjtcbiAgdC5ZaWFybWVuaWFuID0gMHgwNTQ1O1xuICB0LllpY3lyaWxsaWMgPSAweDA0MDc7XG4gIHQuWWl3bmFybWVuaWFuID0gMHgwNTUyO1xuICB0Llltb25vc3BhY2UgPSAweGZmMzk7XG4gIHQuWXNtYWxsID0gMHhmNzc5O1xuICB0Lll0aWxkZSA9IDB4MWVmODtcbiAgdC5ZdXNiaWdjeXJpbGxpYyA9IDB4MDQ2YTtcbiAgdC5ZdXNiaWdpb3RpZmllZGN5cmlsbGljID0gMHgwNDZjO1xuICB0Lll1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY2O1xuICB0Lll1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njg7XG4gIHQuWiA9IDB4MDA1YTtcbiAgdC5aYWFybWVuaWFuID0gMHgwNTM2O1xuICB0LlphY3V0ZSA9IDB4MDE3OTtcbiAgdC5aY2Fyb24gPSAweDAxN2Q7XG4gIHQuWmNhcm9uc21hbGwgPSAweGY2ZmY7XG4gIHQuWmNpcmNsZSA9IDB4MjRjZjtcbiAgdC5aY2lyY3VtZmxleCA9IDB4MWU5MDtcbiAgdC5aZG90ID0gMHgwMTdiO1xuICB0Llpkb3RhY2NlbnQgPSAweDAxN2I7XG4gIHQuWmRvdGJlbG93ID0gMHgxZTkyO1xuICB0LlplY3lyaWxsaWMgPSAweDA0MTc7XG4gIHQuWmVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5ODtcbiAgdC5aZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGU7XG4gIHQuWmV0YSA9IDB4MDM5NjtcbiAgdC5aaGVhcm1lbmlhbiA9IDB4MDUzYTtcbiAgdC5aaGVicmV2ZWN5cmlsbGljID0gMHgwNGMxO1xuICB0LlpoZWN5cmlsbGljID0gMHgwNDE2O1xuICB0LlpoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk2O1xuICB0LlpoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGM7XG4gIHQuWmxpbmViZWxvdyA9IDB4MWU5NDtcbiAgdC5abW9ub3NwYWNlID0gMHhmZjNhO1xuICB0LlpzbWFsbCA9IDB4Zjc3YTtcbiAgdC5ac3Ryb2tlID0gMHgwMWI1O1xuICB0LmEgPSAweDAwNjE7XG4gIHQuYWFiZW5nYWxpID0gMHgwOTg2O1xuICB0LmFhY3V0ZSA9IDB4MDBlMTtcbiAgdC5hYWRldmEgPSAweDA5MDY7XG4gIHQuYWFndWphcmF0aSA9IDB4MGE4NjtcbiAgdC5hYWd1cm11a2hpID0gMHgwYTA2O1xuICB0LmFhbWF0cmFndXJtdWtoaSA9IDB4MGEzZTtcbiAgdC5hYXJ1c3F1YXJlID0gMHgzMzAzO1xuICB0LmFhdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZTtcbiAgdC5hYXZvd2Vsc2lnbmRldmEgPSAweDA5M2U7XG4gIHQuYWF2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFiZTtcbiAgdC5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4gPSAweDA1NWY7XG4gIHQuYWJicmV2aWF0aW9uc2lnbmRldmEgPSAweDA5NzA7XG4gIHQuYWJlbmdhbGkgPSAweDA5ODU7XG4gIHQuYWJvcG9tb2ZvID0gMHgzMTFhO1xuICB0LmFicmV2ZSA9IDB4MDEwMztcbiAgdC5hYnJldmVhY3V0ZSA9IDB4MWVhZjtcbiAgdC5hYnJldmVjeXJpbGxpYyA9IDB4MDRkMTtcbiAgdC5hYnJldmVkb3RiZWxvdyA9IDB4MWViNztcbiAgdC5hYnJldmVncmF2ZSA9IDB4MWViMTtcbiAgdC5hYnJldmVob29rYWJvdmUgPSAweDFlYjM7XG4gIHQuYWJyZXZldGlsZGUgPSAweDFlYjU7XG4gIHQuYWNhcm9uID0gMHgwMWNlO1xuICB0LmFjaXJjbGUgPSAweDI0ZDA7XG4gIHQuYWNpcmN1bWZsZXggPSAweDAwZTI7XG4gIHQuYWNpcmN1bWZsZXhhY3V0ZSA9IDB4MWVhNTtcbiAgdC5hY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFkO1xuICB0LmFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTc7XG4gIHQuYWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYTk7XG4gIHQuYWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVhYjtcbiAgdC5hY3V0ZSA9IDB4MDBiNDtcbiAgdC5hY3V0ZWJlbG93Y21iID0gMHgwMzE3O1xuICB0LmFjdXRlY21iID0gMHgwMzAxO1xuICB0LmFjdXRlY29tYiA9IDB4MDMwMTtcbiAgdC5hY3V0ZWRldmEgPSAweDA5NTQ7XG4gIHQuYWN1dGVsb3dtb2QgPSAweDAyY2Y7XG4gIHQuYWN1dGV0b25lY21iID0gMHgwMzQxO1xuICB0LmFjeXJpbGxpYyA9IDB4MDQzMDtcbiAgdC5hZGJsZ3JhdmUgPSAweDAyMDE7XG4gIHQuYWRkYWtndXJtdWtoaSA9IDB4MGE3MTtcbiAgdC5hZGV2YSA9IDB4MDkwNTtcbiAgdC5hZGllcmVzaXMgPSAweDAwZTQ7XG4gIHQuYWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDM7XG4gIHQuYWRpZXJlc2lzbWFjcm9uID0gMHgwMWRmO1xuICB0LmFkb3RiZWxvdyA9IDB4MWVhMTtcbiAgdC5hZG90bWFjcm9uID0gMHgwMWUxO1xuICB0LmFlID0gMHgwMGU2O1xuICB0LmFlYWN1dGUgPSAweDAxZmQ7XG4gIHQuYWVrb3JlYW4gPSAweDMxNTA7XG4gIHQuYWVtYWNyb24gPSAweDAxZTM7XG4gIHQuYWZpaTAwMjA4ID0gMHgyMDE1O1xuICB0LmFmaWkwODk0MSA9IDB4MjBhNDtcbiAgdC5hZmlpMTAwMTcgPSAweDA0MTA7XG4gIHQuYWZpaTEwMDE4ID0gMHgwNDExO1xuICB0LmFmaWkxMDAxOSA9IDB4MDQxMjtcbiAgdC5hZmlpMTAwMjAgPSAweDA0MTM7XG4gIHQuYWZpaTEwMDIxID0gMHgwNDE0O1xuICB0LmFmaWkxMDAyMiA9IDB4MDQxNTtcbiAgdC5hZmlpMTAwMjMgPSAweDA0MDE7XG4gIHQuYWZpaTEwMDI0ID0gMHgwNDE2O1xuICB0LmFmaWkxMDAyNSA9IDB4MDQxNztcbiAgdC5hZmlpMTAwMjYgPSAweDA0MTg7XG4gIHQuYWZpaTEwMDI3ID0gMHgwNDE5O1xuICB0LmFmaWkxMDAyOCA9IDB4MDQxYTtcbiAgdC5hZmlpMTAwMjkgPSAweDA0MWI7XG4gIHQuYWZpaTEwMDMwID0gMHgwNDFjO1xuICB0LmFmaWkxMDAzMSA9IDB4MDQxZDtcbiAgdC5hZmlpMTAwMzIgPSAweDA0MWU7XG4gIHQuYWZpaTEwMDMzID0gMHgwNDFmO1xuICB0LmFmaWkxMDAzNCA9IDB4MDQyMDtcbiAgdC5hZmlpMTAwMzUgPSAweDA0MjE7XG4gIHQuYWZpaTEwMDM2ID0gMHgwNDIyO1xuICB0LmFmaWkxMDAzNyA9IDB4MDQyMztcbiAgdC5hZmlpMTAwMzggPSAweDA0MjQ7XG4gIHQuYWZpaTEwMDM5ID0gMHgwNDI1O1xuICB0LmFmaWkxMDA0MCA9IDB4MDQyNjtcbiAgdC5hZmlpMTAwNDEgPSAweDA0Mjc7XG4gIHQuYWZpaTEwMDQyID0gMHgwNDI4O1xuICB0LmFmaWkxMDA0MyA9IDB4MDQyOTtcbiAgdC5hZmlpMTAwNDQgPSAweDA0MmE7XG4gIHQuYWZpaTEwMDQ1ID0gMHgwNDJiO1xuICB0LmFmaWkxMDA0NiA9IDB4MDQyYztcbiAgdC5hZmlpMTAwNDcgPSAweDA0MmQ7XG4gIHQuYWZpaTEwMDQ4ID0gMHgwNDJlO1xuICB0LmFmaWkxMDA0OSA9IDB4MDQyZjtcbiAgdC5hZmlpMTAwNTAgPSAweDA0OTA7XG4gIHQuYWZpaTEwMDUxID0gMHgwNDAyO1xuICB0LmFmaWkxMDA1MiA9IDB4MDQwMztcbiAgdC5hZmlpMTAwNTMgPSAweDA0MDQ7XG4gIHQuYWZpaTEwMDU0ID0gMHgwNDA1O1xuICB0LmFmaWkxMDA1NSA9IDB4MDQwNjtcbiAgdC5hZmlpMTAwNTYgPSAweDA0MDc7XG4gIHQuYWZpaTEwMDU3ID0gMHgwNDA4O1xuICB0LmFmaWkxMDA1OCA9IDB4MDQwOTtcbiAgdC5hZmlpMTAwNTkgPSAweDA0MGE7XG4gIHQuYWZpaTEwMDYwID0gMHgwNDBiO1xuICB0LmFmaWkxMDA2MSA9IDB4MDQwYztcbiAgdC5hZmlpMTAwNjIgPSAweDA0MGU7XG4gIHQuYWZpaTEwMDYzID0gMHhmNmM0O1xuICB0LmFmaWkxMDA2NCA9IDB4ZjZjNTtcbiAgdC5hZmlpMTAwNjUgPSAweDA0MzA7XG4gIHQuYWZpaTEwMDY2ID0gMHgwNDMxO1xuICB0LmFmaWkxMDA2NyA9IDB4MDQzMjtcbiAgdC5hZmlpMTAwNjggPSAweDA0MzM7XG4gIHQuYWZpaTEwMDY5ID0gMHgwNDM0O1xuICB0LmFmaWkxMDA3MCA9IDB4MDQzNTtcbiAgdC5hZmlpMTAwNzEgPSAweDA0NTE7XG4gIHQuYWZpaTEwMDcyID0gMHgwNDM2O1xuICB0LmFmaWkxMDA3MyA9IDB4MDQzNztcbiAgdC5hZmlpMTAwNzQgPSAweDA0Mzg7XG4gIHQuYWZpaTEwMDc1ID0gMHgwNDM5O1xuICB0LmFmaWkxMDA3NiA9IDB4MDQzYTtcbiAgdC5hZmlpMTAwNzcgPSAweDA0M2I7XG4gIHQuYWZpaTEwMDc4ID0gMHgwNDNjO1xuICB0LmFmaWkxMDA3OSA9IDB4MDQzZDtcbiAgdC5hZmlpMTAwODAgPSAweDA0M2U7XG4gIHQuYWZpaTEwMDgxID0gMHgwNDNmO1xuICB0LmFmaWkxMDA4MiA9IDB4MDQ0MDtcbiAgdC5hZmlpMTAwODMgPSAweDA0NDE7XG4gIHQuYWZpaTEwMDg0ID0gMHgwNDQyO1xuICB0LmFmaWkxMDA4NSA9IDB4MDQ0MztcbiAgdC5hZmlpMTAwODYgPSAweDA0NDQ7XG4gIHQuYWZpaTEwMDg3ID0gMHgwNDQ1O1xuICB0LmFmaWkxMDA4OCA9IDB4MDQ0NjtcbiAgdC5hZmlpMTAwODkgPSAweDA0NDc7XG4gIHQuYWZpaTEwMDkwID0gMHgwNDQ4O1xuICB0LmFmaWkxMDA5MSA9IDB4MDQ0OTtcbiAgdC5hZmlpMTAwOTIgPSAweDA0NGE7XG4gIHQuYWZpaTEwMDkzID0gMHgwNDRiO1xuICB0LmFmaWkxMDA5NCA9IDB4MDQ0YztcbiAgdC5hZmlpMTAwOTUgPSAweDA0NGQ7XG4gIHQuYWZpaTEwMDk2ID0gMHgwNDRlO1xuICB0LmFmaWkxMDA5NyA9IDB4MDQ0ZjtcbiAgdC5hZmlpMTAwOTggPSAweDA0OTE7XG4gIHQuYWZpaTEwMDk5ID0gMHgwNDUyO1xuICB0LmFmaWkxMDEwMCA9IDB4MDQ1MztcbiAgdC5hZmlpMTAxMDEgPSAweDA0NTQ7XG4gIHQuYWZpaTEwMTAyID0gMHgwNDU1O1xuICB0LmFmaWkxMDEwMyA9IDB4MDQ1NjtcbiAgdC5hZmlpMTAxMDQgPSAweDA0NTc7XG4gIHQuYWZpaTEwMTA1ID0gMHgwNDU4O1xuICB0LmFmaWkxMDEwNiA9IDB4MDQ1OTtcbiAgdC5hZmlpMTAxMDcgPSAweDA0NWE7XG4gIHQuYWZpaTEwMTA4ID0gMHgwNDViO1xuICB0LmFmaWkxMDEwOSA9IDB4MDQ1YztcbiAgdC5hZmlpMTAxMTAgPSAweDA0NWU7XG4gIHQuYWZpaTEwMTQ1ID0gMHgwNDBmO1xuICB0LmFmaWkxMDE0NiA9IDB4MDQ2MjtcbiAgdC5hZmlpMTAxNDcgPSAweDA0NzI7XG4gIHQuYWZpaTEwMTQ4ID0gMHgwNDc0O1xuICB0LmFmaWkxMDE5MiA9IDB4ZjZjNjtcbiAgdC5hZmlpMTAxOTMgPSAweDA0NWY7XG4gIHQuYWZpaTEwMTk0ID0gMHgwNDYzO1xuICB0LmFmaWkxMDE5NSA9IDB4MDQ3MztcbiAgdC5hZmlpMTAxOTYgPSAweDA0NzU7XG4gIHQuYWZpaTEwODMxID0gMHhmNmM3O1xuICB0LmFmaWkxMDgzMiA9IDB4ZjZjODtcbiAgdC5hZmlpMTA4NDYgPSAweDA0ZDk7XG4gIHQuYWZpaTI5OSA9IDB4MjAwZTtcbiAgdC5hZmlpMzAwID0gMHgyMDBmO1xuICB0LmFmaWkzMDEgPSAweDIwMGQ7XG4gIHQuYWZpaTU3MzgxID0gMHgwNjZhO1xuICB0LmFmaWk1NzM4OCA9IDB4MDYwYztcbiAgdC5hZmlpNTczOTIgPSAweDA2NjA7XG4gIHQuYWZpaTU3MzkzID0gMHgwNjYxO1xuICB0LmFmaWk1NzM5NCA9IDB4MDY2MjtcbiAgdC5hZmlpNTczOTUgPSAweDA2NjM7XG4gIHQuYWZpaTU3Mzk2ID0gMHgwNjY0O1xuICB0LmFmaWk1NzM5NyA9IDB4MDY2NTtcbiAgdC5hZmlpNTczOTggPSAweDA2NjY7XG4gIHQuYWZpaTU3Mzk5ID0gMHgwNjY3O1xuICB0LmFmaWk1NzQwMCA9IDB4MDY2ODtcbiAgdC5hZmlpNTc0MDEgPSAweDA2Njk7XG4gIHQuYWZpaTU3NDAzID0gMHgwNjFiO1xuICB0LmFmaWk1NzQwNyA9IDB4MDYxZjtcbiAgdC5hZmlpNTc0MDkgPSAweDA2MjE7XG4gIHQuYWZpaTU3NDEwID0gMHgwNjIyO1xuICB0LmFmaWk1NzQxMSA9IDB4MDYyMztcbiAgdC5hZmlpNTc0MTIgPSAweDA2MjQ7XG4gIHQuYWZpaTU3NDEzID0gMHgwNjI1O1xuICB0LmFmaWk1NzQxNCA9IDB4MDYyNjtcbiAgdC5hZmlpNTc0MTUgPSAweDA2Mjc7XG4gIHQuYWZpaTU3NDE2ID0gMHgwNjI4O1xuICB0LmFmaWk1NzQxNyA9IDB4MDYyOTtcbiAgdC5hZmlpNTc0MTggPSAweDA2MmE7XG4gIHQuYWZpaTU3NDE5ID0gMHgwNjJiO1xuICB0LmFmaWk1NzQyMCA9IDB4MDYyYztcbiAgdC5hZmlpNTc0MjEgPSAweDA2MmQ7XG4gIHQuYWZpaTU3NDIyID0gMHgwNjJlO1xuICB0LmFmaWk1NzQyMyA9IDB4MDYyZjtcbiAgdC5hZmlpNTc0MjQgPSAweDA2MzA7XG4gIHQuYWZpaTU3NDI1ID0gMHgwNjMxO1xuICB0LmFmaWk1NzQyNiA9IDB4MDYzMjtcbiAgdC5hZmlpNTc0MjcgPSAweDA2MzM7XG4gIHQuYWZpaTU3NDI4ID0gMHgwNjM0O1xuICB0LmFmaWk1NzQyOSA9IDB4MDYzNTtcbiAgdC5hZmlpNTc0MzAgPSAweDA2MzY7XG4gIHQuYWZpaTU3NDMxID0gMHgwNjM3O1xuICB0LmFmaWk1NzQzMiA9IDB4MDYzODtcbiAgdC5hZmlpNTc0MzMgPSAweDA2Mzk7XG4gIHQuYWZpaTU3NDM0ID0gMHgwNjNhO1xuICB0LmFmaWk1NzQ0MCA9IDB4MDY0MDtcbiAgdC5hZmlpNTc0NDEgPSAweDA2NDE7XG4gIHQuYWZpaTU3NDQyID0gMHgwNjQyO1xuICB0LmFmaWk1NzQ0MyA9IDB4MDY0MztcbiAgdC5hZmlpNTc0NDQgPSAweDA2NDQ7XG4gIHQuYWZpaTU3NDQ1ID0gMHgwNjQ1O1xuICB0LmFmaWk1NzQ0NiA9IDB4MDY0NjtcbiAgdC5hZmlpNTc0NDggPSAweDA2NDg7XG4gIHQuYWZpaTU3NDQ5ID0gMHgwNjQ5O1xuICB0LmFmaWk1NzQ1MCA9IDB4MDY0YTtcbiAgdC5hZmlpNTc0NTEgPSAweDA2NGI7XG4gIHQuYWZpaTU3NDUyID0gMHgwNjRjO1xuICB0LmFmaWk1NzQ1MyA9IDB4MDY0ZDtcbiAgdC5hZmlpNTc0NTQgPSAweDA2NGU7XG4gIHQuYWZpaTU3NDU1ID0gMHgwNjRmO1xuICB0LmFmaWk1NzQ1NiA9IDB4MDY1MDtcbiAgdC5hZmlpNTc0NTcgPSAweDA2NTE7XG4gIHQuYWZpaTU3NDU4ID0gMHgwNjUyO1xuICB0LmFmaWk1NzQ3MCA9IDB4MDY0NztcbiAgdC5hZmlpNTc1MDUgPSAweDA2YTQ7XG4gIHQuYWZpaTU3NTA2ID0gMHgwNjdlO1xuICB0LmFmaWk1NzUwNyA9IDB4MDY4NjtcbiAgdC5hZmlpNTc1MDggPSAweDA2OTg7XG4gIHQuYWZpaTU3NTA5ID0gMHgwNmFmO1xuICB0LmFmaWk1NzUxMSA9IDB4MDY3OTtcbiAgdC5hZmlpNTc1MTIgPSAweDA2ODg7XG4gIHQuYWZpaTU3NTEzID0gMHgwNjkxO1xuICB0LmFmaWk1NzUxNCA9IDB4MDZiYTtcbiAgdC5hZmlpNTc1MTkgPSAweDA2ZDI7XG4gIHQuYWZpaTU3NTM0ID0gMHgwNmQ1O1xuICB0LmFmaWk1NzYzNiA9IDB4MjBhYTtcbiAgdC5hZmlpNTc2NDUgPSAweDA1YmU7XG4gIHQuYWZpaTU3NjU4ID0gMHgwNWMzO1xuICB0LmFmaWk1NzY2NCA9IDB4MDVkMDtcbiAgdC5hZmlpNTc2NjUgPSAweDA1ZDE7XG4gIHQuYWZpaTU3NjY2ID0gMHgwNWQyO1xuICB0LmFmaWk1NzY2NyA9IDB4MDVkMztcbiAgdC5hZmlpNTc2NjggPSAweDA1ZDQ7XG4gIHQuYWZpaTU3NjY5ID0gMHgwNWQ1O1xuICB0LmFmaWk1NzY3MCA9IDB4MDVkNjtcbiAgdC5hZmlpNTc2NzEgPSAweDA1ZDc7XG4gIHQuYWZpaTU3NjcyID0gMHgwNWQ4O1xuICB0LmFmaWk1NzY3MyA9IDB4MDVkOTtcbiAgdC5hZmlpNTc2NzQgPSAweDA1ZGE7XG4gIHQuYWZpaTU3Njc1ID0gMHgwNWRiO1xuICB0LmFmaWk1NzY3NiA9IDB4MDVkYztcbiAgdC5hZmlpNTc2NzcgPSAweDA1ZGQ7XG4gIHQuYWZpaTU3Njc4ID0gMHgwNWRlO1xuICB0LmFmaWk1NzY3OSA9IDB4MDVkZjtcbiAgdC5hZmlpNTc2ODAgPSAweDA1ZTA7XG4gIHQuYWZpaTU3NjgxID0gMHgwNWUxO1xuICB0LmFmaWk1NzY4MiA9IDB4MDVlMjtcbiAgdC5hZmlpNTc2ODMgPSAweDA1ZTM7XG4gIHQuYWZpaTU3Njg0ID0gMHgwNWU0O1xuICB0LmFmaWk1NzY4NSA9IDB4MDVlNTtcbiAgdC5hZmlpNTc2ODYgPSAweDA1ZTY7XG4gIHQuYWZpaTU3Njg3ID0gMHgwNWU3O1xuICB0LmFmaWk1NzY4OCA9IDB4MDVlODtcbiAgdC5hZmlpNTc2ODkgPSAweDA1ZTk7XG4gIHQuYWZpaTU3NjkwID0gMHgwNWVhO1xuICB0LmFmaWk1NzY5NCA9IDB4ZmIyYTtcbiAgdC5hZmlpNTc2OTUgPSAweGZiMmI7XG4gIHQuYWZpaTU3NzAwID0gMHhmYjRiO1xuICB0LmFmaWk1NzcwNSA9IDB4ZmIxZjtcbiAgdC5hZmlpNTc3MTYgPSAweDA1ZjA7XG4gIHQuYWZpaTU3NzE3ID0gMHgwNWYxO1xuICB0LmFmaWk1NzcxOCA9IDB4MDVmMjtcbiAgdC5hZmlpNTc3MjMgPSAweGZiMzU7XG4gIHQuYWZpaTU3NzkzID0gMHgwNWI0O1xuICB0LmFmaWk1Nzc5NCA9IDB4MDViNTtcbiAgdC5hZmlpNTc3OTUgPSAweDA1YjY7XG4gIHQuYWZpaTU3Nzk2ID0gMHgwNWJiO1xuICB0LmFmaWk1Nzc5NyA9IDB4MDViODtcbiAgdC5hZmlpNTc3OTggPSAweDA1Yjc7XG4gIHQuYWZpaTU3Nzk5ID0gMHgwNWIwO1xuICB0LmFmaWk1NzgwMCA9IDB4MDViMjtcbiAgdC5hZmlpNTc4MDEgPSAweDA1YjE7XG4gIHQuYWZpaTU3ODAyID0gMHgwNWIzO1xuICB0LmFmaWk1NzgwMyA9IDB4MDVjMjtcbiAgdC5hZmlpNTc4MDQgPSAweDA1YzE7XG4gIHQuYWZpaTU3ODA2ID0gMHgwNWI5O1xuICB0LmFmaWk1NzgwNyA9IDB4MDViYztcbiAgdC5hZmlpNTc4MzkgPSAweDA1YmQ7XG4gIHQuYWZpaTU3ODQxID0gMHgwNWJmO1xuICB0LmFmaWk1Nzg0MiA9IDB4MDVjMDtcbiAgdC5hZmlpNTc5MjkgPSAweDAyYmM7XG4gIHQuYWZpaTYxMjQ4ID0gMHgyMTA1O1xuICB0LmFmaWk2MTI4OSA9IDB4MjExMztcbiAgdC5hZmlpNjEzNTIgPSAweDIxMTY7XG4gIHQuYWZpaTYxNTczID0gMHgyMDJjO1xuICB0LmFmaWk2MTU3NCA9IDB4MjAyZDtcbiAgdC5hZmlpNjE1NzUgPSAweDIwMmU7XG4gIHQuYWZpaTYxNjY0ID0gMHgyMDBjO1xuICB0LmFmaWk2MzE2NyA9IDB4MDY2ZDtcbiAgdC5hZmlpNjQ5MzcgPSAweDAyYmQ7XG4gIHQuYWdyYXZlID0gMHgwMGUwO1xuICB0LmFndWphcmF0aSA9IDB4MGE4NTtcbiAgdC5hZ3VybXVraGkgPSAweDBhMDU7XG4gIHQuYWhpcmFnYW5hID0gMHgzMDQyO1xuICB0LmFob29rYWJvdmUgPSAweDFlYTM7XG4gIHQuYWliZW5nYWxpID0gMHgwOTkwO1xuICB0LmFpYm9wb21vZm8gPSAweDMxMWU7XG4gIHQuYWlkZXZhID0gMHgwOTEwO1xuICB0LmFpZWN5cmlsbGljID0gMHgwNGQ1O1xuICB0LmFpZ3VqYXJhdGkgPSAweDBhOTA7XG4gIHQuYWlndXJtdWtoaSA9IDB4MGExMDtcbiAgdC5haW1hdHJhZ3VybXVraGkgPSAweDBhNDg7XG4gIHQuYWluYXJhYmljID0gMHgwNjM5O1xuICB0LmFpbmZpbmFsYXJhYmljID0gMHhmZWNhO1xuICB0LmFpbmluaXRpYWxhcmFiaWMgPSAweGZlY2I7XG4gIHQuYWlubWVkaWFsYXJhYmljID0gMHhmZWNjO1xuICB0LmFpbnZlcnRlZGJyZXZlID0gMHgwMjAzO1xuICB0LmFpdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljODtcbiAgdC5haXZvd2Vsc2lnbmRldmEgPSAweDA5NDg7XG4gIHQuYWl2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjODtcbiAgdC5ha2F0YWthbmEgPSAweDMwYTI7XG4gIHQuYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcxO1xuICB0LmFrb3JlYW4gPSAweDMxNGY7XG4gIHQuYWxlZiA9IDB4MDVkMDtcbiAgdC5hbGVmYXJhYmljID0gMHgwNjI3O1xuICB0LmFsZWZkYWdlc2hoZWJyZXcgPSAweGZiMzA7XG4gIHQuYWxlZmZpbmFsYXJhYmljID0gMHhmZThlO1xuICB0LmFsZWZoYW16YWFib3ZlYXJhYmljID0gMHgwNjIzO1xuICB0LmFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODQ7XG4gIHQuYWxlZmhhbXphYmVsb3dhcmFiaWMgPSAweDA2MjU7XG4gIHQuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmU4ODtcbiAgdC5hbGVmaGVicmV3ID0gMHgwNWQwO1xuICB0LmFsZWZsYW1lZGhlYnJldyA9IDB4ZmI0ZjtcbiAgdC5hbGVmbWFkZGFhYm92ZWFyYWJpYyA9IDB4MDYyMjtcbiAgdC5hbGVmbWFkZGFhYm92ZWZpbmFsYXJhYmljID0gMHhmZTgyO1xuICB0LmFsZWZtYWtzdXJhYXJhYmljID0gMHgwNjQ5O1xuICB0LmFsZWZtYWtzdXJhZmluYWxhcmFiaWMgPSAweGZlZjA7XG4gIHQuYWxlZm1ha3N1cmFpbml0aWFsYXJhYmljID0gMHhmZWYzO1xuICB0LmFsZWZtYWtzdXJhbWVkaWFsYXJhYmljID0gMHhmZWY0O1xuICB0LmFsZWZwYXRhaGhlYnJldyA9IDB4ZmIyZTtcbiAgdC5hbGVmcWFtYXRzaGVicmV3ID0gMHhmYjJmO1xuICB0LmFsZXBoID0gMHgyMTM1O1xuICB0LmFsbGVxdWFsID0gMHgyMjRjO1xuICB0LmFscGhhID0gMHgwM2IxO1xuICB0LmFscGhhdG9ub3MgPSAweDAzYWM7XG4gIHQuYW1hY3JvbiA9IDB4MDEwMTtcbiAgdC5hbW9ub3NwYWNlID0gMHhmZjQxO1xuICB0LmFtcGVyc2FuZCA9IDB4MDAyNjtcbiAgdC5hbXBlcnNhbmRtb25vc3BhY2UgPSAweGZmMDY7XG4gIHQuYW1wZXJzYW5kc21hbGwgPSAweGY3MjY7XG4gIHQuYW1zcXVhcmUgPSAweDMzYzI7XG4gIHQuYW5ib3BvbW9mbyA9IDB4MzEyMjtcbiAgdC5hbmdib3BvbW9mbyA9IDB4MzEyNDtcbiAgdC5hbmdicmFja2V0bGVmdCA9IDB4MzAwODsgLy8gR2x5cGggaXMgbWlzc2luZyBmcm9tIEFkb2JlJ3Mgb3JpZ2luYWwgbGlzdC5cbiAgdC5hbmdicmFja2V0cmlnaHQgPSAweDMwMDk7IC8vIEdseXBoIGlzIG1pc3NpbmcgZnJvbSBBZG9iZSdzIG9yaWdpbmFsIGxpc3QuXG4gIHQuYW5na2hhbmtodXRoYWkgPSAweDBlNWE7XG4gIHQuYW5nbGUgPSAweDIyMjA7XG4gIHQuYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwODtcbiAgdC5hbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Y7XG4gIHQuYW5nbGVicmFja2V0cmlnaHQgPSAweDMwMDk7XG4gIHQuYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0MDtcbiAgdC5hbmdsZWxlZnQgPSAweDIzMjk7XG4gIHQuYW5nbGVyaWdodCA9IDB4MjMyYTtcbiAgdC5hbmdzdHJvbSA9IDB4MjEyYjtcbiAgdC5hbm90ZWxlaWEgPSAweDAzODc7XG4gIHQuYW51ZGF0dGFkZXZhID0gMHgwOTUyO1xuICB0LmFudXN2YXJhYmVuZ2FsaSA9IDB4MDk4MjtcbiAgdC5hbnVzdmFyYWRldmEgPSAweDA5MDI7XG4gIHQuYW51c3ZhcmFndWphcmF0aSA9IDB4MGE4MjtcbiAgdC5hb2dvbmVrID0gMHgwMTA1O1xuICB0LmFwYWF0b3NxdWFyZSA9IDB4MzMwMDtcbiAgdC5hcGFyZW4gPSAweDI0OWM7XG4gIHQuYXBvc3Ryb3BoZWFybWVuaWFuID0gMHgwNTVhO1xuICB0LmFwb3N0cm9waGVtb2QgPSAweDAyYmM7XG4gIHQuYXBwbGUgPSAweGY4ZmY7XG4gIHQuYXBwcm9hY2hlcyA9IDB4MjI1MDtcbiAgdC5hcHByb3hlcXVhbCA9IDB4MjI0ODtcbiAgdC5hcHByb3hlcXVhbG9yaW1hZ2UgPSAweDIyNTI7XG4gIHQuYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjQ1O1xuICB0LmFyYWVhZWtvcmVhbiA9IDB4MzE4ZTtcbiAgdC5hcmFlYWtvcmVhbiA9IDB4MzE4ZDtcbiAgdC5hcmMgPSAweDIzMTI7XG4gIHQuYXJpZ2h0aGFsZnJpbmcgPSAweDFlOWE7XG4gIHQuYXJpbmcgPSAweDAwZTU7XG4gIHQuYXJpbmdhY3V0ZSA9IDB4MDFmYjtcbiAgdC5hcmluZ2JlbG93ID0gMHgxZTAxO1xuICB0LmFycm93Ym90aCA9IDB4MjE5NDtcbiAgdC5hcnJvd2Rhc2hkb3duID0gMHgyMWUzO1xuICB0LmFycm93ZGFzaGxlZnQgPSAweDIxZTA7XG4gIHQuYXJyb3dkYXNocmlnaHQgPSAweDIxZTI7XG4gIHQuYXJyb3dkYXNodXAgPSAweDIxZTE7XG4gIHQuYXJyb3dkYmxib3RoID0gMHgyMWQ0O1xuICB0LmFycm93ZGJsZG93biA9IDB4MjFkMztcbiAgdC5hcnJvd2RibGxlZnQgPSAweDIxZDA7XG4gIHQuYXJyb3dkYmxyaWdodCA9IDB4MjFkMjtcbiAgdC5hcnJvd2RibHVwID0gMHgyMWQxO1xuICB0LmFycm93ZG93biA9IDB4MjE5MztcbiAgdC5hcnJvd2Rvd25sZWZ0ID0gMHgyMTk5O1xuICB0LmFycm93ZG93bnJpZ2h0ID0gMHgyMTk4O1xuICB0LmFycm93ZG93bndoaXRlID0gMHgyMWU5O1xuICB0LmFycm93aGVhZGRvd25tb2QgPSAweDAyYzU7XG4gIHQuYXJyb3doZWFkbGVmdG1vZCA9IDB4MDJjMjtcbiAgdC5hcnJvd2hlYWRyaWdodG1vZCA9IDB4MDJjMztcbiAgdC5hcnJvd2hlYWR1cG1vZCA9IDB4MDJjNDtcbiAgdC5hcnJvd2hvcml6ZXggPSAweGY4ZTc7XG4gIHQuYXJyb3dsZWZ0ID0gMHgyMTkwO1xuICB0LmFycm93bGVmdGRibCA9IDB4MjFkMDtcbiAgdC5hcnJvd2xlZnRkYmxzdHJva2UgPSAweDIxY2Q7XG4gIHQuYXJyb3dsZWZ0b3ZlcnJpZ2h0ID0gMHgyMWM2O1xuICB0LmFycm93bGVmdHdoaXRlID0gMHgyMWU2O1xuICB0LmFycm93cmlnaHQgPSAweDIxOTI7XG4gIHQuYXJyb3dyaWdodGRibHN0cm9rZSA9IDB4MjFjZjtcbiAgdC5hcnJvd3JpZ2h0aGVhdnkgPSAweDI3OWU7XG4gIHQuYXJyb3dyaWdodG92ZXJsZWZ0ID0gMHgyMWM0O1xuICB0LmFycm93cmlnaHR3aGl0ZSA9IDB4MjFlODtcbiAgdC5hcnJvd3RhYmxlZnQgPSAweDIxZTQ7XG4gIHQuYXJyb3d0YWJyaWdodCA9IDB4MjFlNTtcbiAgdC5hcnJvd3VwID0gMHgyMTkxO1xuICB0LmFycm93dXBkbiA9IDB4MjE5NTtcbiAgdC5hcnJvd3VwZG5ic2UgPSAweDIxYTg7XG4gIHQuYXJyb3d1cGRvd25iYXNlID0gMHgyMWE4O1xuICB0LmFycm93dXBsZWZ0ID0gMHgyMTk2O1xuICB0LmFycm93dXBsZWZ0b2Zkb3duID0gMHgyMWM1O1xuICB0LmFycm93dXByaWdodCA9IDB4MjE5NztcbiAgdC5hcnJvd3Vwd2hpdGUgPSAweDIxZTc7XG4gIHQuYXJyb3d2ZXJ0ZXggPSAweGY4ZTY7XG4gIHQuYXNjaWljaXJjdW0gPSAweDAwNWU7XG4gIHQuYXNjaWljaXJjdW1tb25vc3BhY2UgPSAweGZmM2U7XG4gIHQuYXNjaWl0aWxkZSA9IDB4MDA3ZTtcbiAgdC5hc2NpaXRpbGRlbW9ub3NwYWNlID0gMHhmZjVlO1xuICB0LmFzY3JpcHQgPSAweDAyNTE7XG4gIHQuYXNjcmlwdHR1cm5lZCA9IDB4MDI1MjtcbiAgdC5hc21hbGxoaXJhZ2FuYSA9IDB4MzA0MTtcbiAgdC5hc21hbGxrYXRha2FuYSA9IDB4MzBhMTtcbiAgdC5hc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NztcbiAgdC5hc3RlcmlzayA9IDB4MDAyYTtcbiAgdC5hc3Rlcmlza2FsdG9uZWFyYWJpYyA9IDB4MDY2ZDtcbiAgdC5hc3Rlcmlza2FyYWJpYyA9IDB4MDY2ZDtcbiAgdC5hc3Rlcmlza21hdGggPSAweDIyMTc7XG4gIHQuYXN0ZXJpc2ttb25vc3BhY2UgPSAweGZmMGE7XG4gIHQuYXN0ZXJpc2tzbWFsbCA9IDB4ZmU2MTtcbiAgdC5hc3RlcmlzbSA9IDB4MjA0MjtcbiAgdC5hc3VwZXJpb3IgPSAweGY2ZTk7XG4gIHQuYXN5bXB0b3RpY2FsbHllcXVhbCA9IDB4MjI0MztcbiAgdC5hdCA9IDB4MDA0MDtcbiAgdC5hdGlsZGUgPSAweDAwZTM7XG4gIHQuYXRtb25vc3BhY2UgPSAweGZmMjA7XG4gIHQuYXRzbWFsbCA9IDB4ZmU2YjtcbiAgdC5hdHVybmVkID0gMHgwMjUwO1xuICB0LmF1YmVuZ2FsaSA9IDB4MDk5NDtcbiAgdC5hdWJvcG9tb2ZvID0gMHgzMTIwO1xuICB0LmF1ZGV2YSA9IDB4MDkxNDtcbiAgdC5hdWd1amFyYXRpID0gMHgwYTk0O1xuICB0LmF1Z3VybXVraGkgPSAweDBhMTQ7XG4gIHQuYXVsZW5ndGhtYXJrYmVuZ2FsaSA9IDB4MDlkNztcbiAgdC5hdW1hdHJhZ3VybXVraGkgPSAweDBhNGM7XG4gIHQuYXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNjO1xuICB0LmF1dm93ZWxzaWduZGV2YSA9IDB4MDk0YztcbiAgdC5hdXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWNjO1xuICB0LmF2YWdyYWhhZGV2YSA9IDB4MDkzZDtcbiAgdC5heWJhcm1lbmlhbiA9IDB4MDU2MTtcbiAgdC5heWluID0gMHgwNWUyO1xuICB0LmF5aW5hbHRvbmVoZWJyZXcgPSAweGZiMjA7XG4gIHQuYXlpbmhlYnJldyA9IDB4MDVlMjtcbiAgdC5iID0gMHgwMDYyO1xuICB0LmJhYmVuZ2FsaSA9IDB4MDlhYztcbiAgdC5iYWNrc2xhc2ggPSAweDAwNWM7XG4gIHQuYmFja3NsYXNobW9ub3NwYWNlID0gMHhmZjNjO1xuICB0LmJhZGV2YSA9IDB4MDkyYztcbiAgdC5iYWd1amFyYXRpID0gMHgwYWFjO1xuICB0LmJhZ3VybXVraGkgPSAweDBhMmM7XG4gIHQuYmFoaXJhZ2FuYSA9IDB4MzA3MDtcbiAgdC5iYWh0dGhhaSA9IDB4MGUzZjtcbiAgdC5iYWthdGFrYW5hID0gMHgzMGQwO1xuICB0LmJhciA9IDB4MDA3YztcbiAgdC5iYXJtb25vc3BhY2UgPSAweGZmNWM7XG4gIHQuYmJvcG9tb2ZvID0gMHgzMTA1O1xuICB0LmJjaXJjbGUgPSAweDI0ZDE7XG4gIHQuYmRvdGFjY2VudCA9IDB4MWUwMztcbiAgdC5iZG90YmVsb3cgPSAweDFlMDU7XG4gIHQuYmVhbWVkc2l4dGVlbnRobm90ZXMgPSAweDI2NmM7XG4gIHQuYmVjYXVzZSA9IDB4MjIzNTtcbiAgdC5iZWN5cmlsbGljID0gMHgwNDMxO1xuICB0LmJlaGFyYWJpYyA9IDB4MDYyODtcbiAgdC5iZWhmaW5hbGFyYWJpYyA9IDB4ZmU5MDtcbiAgdC5iZWhpbml0aWFsYXJhYmljID0gMHhmZTkxO1xuICB0LmJlaGlyYWdhbmEgPSAweDMwNzk7XG4gIHQuYmVobWVkaWFsYXJhYmljID0gMHhmZTkyO1xuICB0LmJlaG1lZW1pbml0aWFsYXJhYmljID0gMHhmYzlmO1xuICB0LmJlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwODtcbiAgdC5iZWhub29uZmluYWxhcmFiaWMgPSAweGZjNmQ7XG4gIHQuYmVrYXRha2FuYSA9IDB4MzBkOTtcbiAgdC5iZW5hcm1lbmlhbiA9IDB4MDU2MjtcbiAgdC5iZXQgPSAweDA1ZDE7XG4gIHQuYmV0YSA9IDB4MDNiMjtcbiAgdC5iZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDA7XG4gIHQuYmV0ZGFnZXNoID0gMHhmYjMxO1xuICB0LmJldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMTtcbiAgdC5iZXRoZWJyZXcgPSAweDA1ZDE7XG4gIHQuYmV0cmFmZWhlYnJldyA9IDB4ZmI0YztcbiAgdC5iaGFiZW5nYWxpID0gMHgwOWFkO1xuICB0LmJoYWRldmEgPSAweDA5MmQ7XG4gIHQuYmhhZ3VqYXJhdGkgPSAweDBhYWQ7XG4gIHQuYmhhZ3VybXVraGkgPSAweDBhMmQ7XG4gIHQuYmhvb2sgPSAweDAyNTM7XG4gIHQuYmloaXJhZ2FuYSA9IDB4MzA3MztcbiAgdC5iaWthdGFrYW5hID0gMHgzMGQzO1xuICB0LmJpbGFiaWFsY2xpY2sgPSAweDAyOTg7XG4gIHQuYmluZGlndXJtdWtoaSA9IDB4MGEwMjtcbiAgdC5iaXJ1c3F1YXJlID0gMHgzMzMxO1xuICB0LmJsYWNrY2lyY2xlID0gMHgyNWNmO1xuICB0LmJsYWNrZGlhbW9uZCA9IDB4MjVjNjtcbiAgdC5ibGFja2Rvd25wb2ludGluZ3RyaWFuZ2xlID0gMHgyNWJjO1xuICB0LmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciA9IDB4MjVjNDtcbiAgdC5ibGFja2xlZnRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWMwO1xuICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0ID0gMHgzMDEwO1xuICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2I7XG4gIHQuYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0ID0gMHgzMDExO1xuICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTNjO1xuICB0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTM7XG4gIHQuYmxhY2tsb3dlcnJpZ2h0dHJpYW5nbGUgPSAweDI1ZTI7XG4gIHQuYmxhY2tyZWN0YW5nbGUgPSAweDI1YWM7XG4gIHQuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciA9IDB4MjViYTtcbiAgdC5ibGFja3JpZ2h0cG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViNjtcbiAgdC5ibGFja3NtYWxsc3F1YXJlID0gMHgyNWFhO1xuICB0LmJsYWNrc21pbGluZ2ZhY2UgPSAweDI2M2I7XG4gIHQuYmxhY2tzcXVhcmUgPSAweDI1YTA7XG4gIHQuYmxhY2tzdGFyID0gMHgyNjA1O1xuICB0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTQ7XG4gIHQuYmxhY2t1cHBlcnJpZ2h0dHJpYW5nbGUgPSAweDI1ZTU7XG4gIHQuYmxhY2t1cHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViNDtcbiAgdC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMjtcbiAgdC5ibGFuayA9IDB4MjQyMztcbiAgdC5ibGluZWJlbG93ID0gMHgxZTA3O1xuICB0LmJsb2NrID0gMHgyNTg4O1xuICB0LmJtb25vc3BhY2UgPSAweGZmNDI7XG4gIHQuYm9iYWltYWl0aGFpID0gMHgwZTFhO1xuICB0LmJvaGlyYWdhbmEgPSAweDMwN2M7XG4gIHQuYm9rYXRha2FuYSA9IDB4MzBkYztcbiAgdC5icGFyZW4gPSAweDI0OWQ7XG4gIHQuYnFzcXVhcmUgPSAweDMzYzM7XG4gIHQuYnJhY2VleCA9IDB4ZjhmNDtcbiAgdC5icmFjZWxlZnQgPSAweDAwN2I7XG4gIHQuYnJhY2VsZWZ0YnQgPSAweGY4ZjM7XG4gIHQuYnJhY2VsZWZ0bWlkID0gMHhmOGYyO1xuICB0LmJyYWNlbGVmdG1vbm9zcGFjZSA9IDB4ZmY1YjtcbiAgdC5icmFjZWxlZnRzbWFsbCA9IDB4ZmU1YjtcbiAgdC5icmFjZWxlZnR0cCA9IDB4ZjhmMTtcbiAgdC5icmFjZWxlZnR2ZXJ0aWNhbCA9IDB4ZmUzNztcbiAgdC5icmFjZXJpZ2h0ID0gMHgwMDdkO1xuICB0LmJyYWNlcmlnaHRidCA9IDB4ZjhmZTtcbiAgdC5icmFjZXJpZ2h0bWlkID0gMHhmOGZkO1xuICB0LmJyYWNlcmlnaHRtb25vc3BhY2UgPSAweGZmNWQ7XG4gIHQuYnJhY2VyaWdodHNtYWxsID0gMHhmZTVjO1xuICB0LmJyYWNlcmlnaHR0cCA9IDB4ZjhmYztcbiAgdC5icmFjZXJpZ2h0dmVydGljYWwgPSAweGZlMzg7XG4gIHQuYnJhY2tldGxlZnQgPSAweDAwNWI7XG4gIHQuYnJhY2tldGxlZnRidCA9IDB4ZjhmMDtcbiAgdC5icmFja2V0bGVmdGV4ID0gMHhmOGVmO1xuICB0LmJyYWNrZXRsZWZ0bW9ub3NwYWNlID0gMHhmZjNiO1xuICB0LmJyYWNrZXRsZWZ0dHAgPSAweGY4ZWU7XG4gIHQuYnJhY2tldHJpZ2h0ID0gMHgwMDVkO1xuICB0LmJyYWNrZXRyaWdodGJ0ID0gMHhmOGZiO1xuICB0LmJyYWNrZXRyaWdodGV4ID0gMHhmOGZhO1xuICB0LmJyYWNrZXRyaWdodG1vbm9zcGFjZSA9IDB4ZmYzZDtcbiAgdC5icmFja2V0cmlnaHR0cCA9IDB4ZjhmOTtcbiAgdC5icmV2ZSA9IDB4MDJkODtcbiAgdC5icmV2ZWJlbG93Y21iID0gMHgwMzJlO1xuICB0LmJyZXZlY21iID0gMHgwMzA2O1xuICB0LmJyZXZlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyZjtcbiAgdC5icmV2ZWludmVydGVkY21iID0gMHgwMzExO1xuICB0LmJyZXZlaW52ZXJ0ZWRkb3VibGVjbWIgPSAweDAzNjE7XG4gIHQuYnJpZGdlYmVsb3djbWIgPSAweDAzMmE7XG4gIHQuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMzYTtcbiAgdC5icm9rZW5iYXIgPSAweDAwYTY7XG4gIHQuYnN0cm9rZSA9IDB4MDE4MDtcbiAgdC5ic3VwZXJpb3IgPSAweGY2ZWE7XG4gIHQuYnRvcGJhciA9IDB4MDE4MztcbiAgdC5idWhpcmFnYW5hID0gMHgzMDc2O1xuICB0LmJ1a2F0YWthbmEgPSAweDMwZDY7XG4gIHQuYnVsbGV0ID0gMHgyMDIyO1xuICB0LmJ1bGxldGludmVyc2UgPSAweDI1ZDg7XG4gIHQuYnVsbGV0b3BlcmF0b3IgPSAweDIyMTk7XG4gIHQuYnVsbHNleWUgPSAweDI1Y2U7XG4gIHQuYyA9IDB4MDA2MztcbiAgdC5jYWFybWVuaWFuID0gMHgwNTZlO1xuICB0LmNhYmVuZ2FsaSA9IDB4MDk5YTtcbiAgdC5jYWN1dGUgPSAweDAxMDc7XG4gIHQuY2FkZXZhID0gMHgwOTFhO1xuICB0LmNhZ3VqYXJhdGkgPSAweDBhOWE7XG4gIHQuY2FndXJtdWtoaSA9IDB4MGExYTtcbiAgdC5jYWxzcXVhcmUgPSAweDMzODg7XG4gIHQuY2FuZHJhYmluZHViZW5nYWxpID0gMHgwOTgxO1xuICB0LmNhbmRyYWJpbmR1Y21iID0gMHgwMzEwO1xuICB0LmNhbmRyYWJpbmR1ZGV2YSA9IDB4MDkwMTtcbiAgdC5jYW5kcmFiaW5kdWd1amFyYXRpID0gMHgwYTgxO1xuICB0LmNhcHNsb2NrID0gMHgyMWVhO1xuICB0LmNhcmVvZiA9IDB4MjEwNTtcbiAgdC5jYXJvbiA9IDB4MDJjNztcbiAgdC5jYXJvbmJlbG93Y21iID0gMHgwMzJjO1xuICB0LmNhcm9uY21iID0gMHgwMzBjO1xuICB0LmNhcnJpYWdlcmV0dXJuID0gMHgyMWI1O1xuICB0LmNib3BvbW9mbyA9IDB4MzExODtcbiAgdC5jY2Fyb24gPSAweDAxMGQ7XG4gIHQuY2NlZGlsbGEgPSAweDAwZTc7XG4gIHQuY2NlZGlsbGFhY3V0ZSA9IDB4MWUwOTtcbiAgdC5jY2lyY2xlID0gMHgyNGQyO1xuICB0LmNjaXJjdW1mbGV4ID0gMHgwMTA5O1xuICB0LmNjdXJsID0gMHgwMjU1O1xuICB0LmNkb3QgPSAweDAxMGI7XG4gIHQuY2RvdGFjY2VudCA9IDB4MDEwYjtcbiAgdC5jZHNxdWFyZSA9IDB4MzNjNTtcbiAgdC5jZWRpbGxhID0gMHgwMGI4O1xuICB0LmNlZGlsbGFjbWIgPSAweDAzMjc7XG4gIHQuY2VudCA9IDB4MDBhMjtcbiAgdC5jZW50aWdyYWRlID0gMHgyMTAzO1xuICB0LmNlbnRpbmZlcmlvciA9IDB4ZjZkZjtcbiAgdC5jZW50bW9ub3NwYWNlID0gMHhmZmUwO1xuICB0LmNlbnRvbGRzdHlsZSA9IDB4ZjdhMjtcbiAgdC5jZW50c3VwZXJpb3IgPSAweGY2ZTA7XG4gIHQuY2hhYXJtZW5pYW4gPSAweDA1Nzk7XG4gIHQuY2hhYmVuZ2FsaSA9IDB4MDk5YjtcbiAgdC5jaGFkZXZhID0gMHgwOTFiO1xuICB0LmNoYWd1amFyYXRpID0gMHgwYTliO1xuICB0LmNoYWd1cm11a2hpID0gMHgwYTFiO1xuICB0LmNoYm9wb21vZm8gPSAweDMxMTQ7XG4gIHQuY2hlYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmQ7XG4gIHQuY2hlY2ttYXJrID0gMHgyNzEzO1xuICB0LmNoZWN5cmlsbGljID0gMHgwNDQ3O1xuICB0LmNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJmO1xuICB0LmNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI3O1xuICB0LmNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjU7XG4gIHQuY2hlaGFybWVuaWFuID0gMHgwNTczO1xuICB0LmNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYztcbiAgdC5jaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI5O1xuICB0LmNoaSA9IDB4MDNjNztcbiAgdC5jaGlldWNoYWNpcmNsZWtvcmVhbiA9IDB4MzI3NztcbiAgdC5jaGlldWNoYXBhcmVua29yZWFuID0gMHgzMjE3O1xuICB0LmNoaWV1Y2hjaXJjbGVrb3JlYW4gPSAweDMyNjk7XG4gIHQuY2hpZXVjaGtvcmVhbiA9IDB4MzE0YTtcbiAgdC5jaGlldWNocGFyZW5rb3JlYW4gPSAweDMyMDk7XG4gIHQuY2hvY2hhbmd0aGFpID0gMHgwZTBhO1xuICB0LmNob2NoYW50aGFpID0gMHgwZTA4O1xuICB0LmNob2NoaW5ndGhhaSA9IDB4MGUwOTtcbiAgdC5jaG9jaG9ldGhhaSA9IDB4MGUwYztcbiAgdC5jaG9vayA9IDB4MDE4ODtcbiAgdC5jaWV1Y2FjaXJjbGVrb3JlYW4gPSAweDMyNzY7XG4gIHQuY2lldWNhcGFyZW5rb3JlYW4gPSAweDMyMTY7XG4gIHQuY2lldWNjaXJjbGVrb3JlYW4gPSAweDMyNjg7XG4gIHQuY2lldWNrb3JlYW4gPSAweDMxNDg7XG4gIHQuY2lldWNwYXJlbmtvcmVhbiA9IDB4MzIwODtcbiAgdC5jaWV1Y3VwYXJlbmtvcmVhbiA9IDB4MzIxYztcbiAgdC5jaXJjbGUgPSAweDI1Y2I7XG4gIHQuY2lyY2xlY29weXJ0ID0gMHgwMGE5OyAvLyBHbHlwaCBpcyBtaXNzaW5nIGZyb20gQWRvYmUncyBvcmlnaW5hbCBsaXN0LlxuICB0LmNpcmNsZW11bHRpcGx5ID0gMHgyMjk3O1xuICB0LmNpcmNsZW90ID0gMHgyMjk5O1xuICB0LmNpcmNsZXBsdXMgPSAweDIyOTU7XG4gIHQuY2lyY2xlcG9zdGFsbWFyayA9IDB4MzAzNjtcbiAgdC5jaXJjbGV3aXRobGVmdGhhbGZibGFjayA9IDB4MjVkMDtcbiAgdC5jaXJjbGV3aXRocmlnaHRoYWxmYmxhY2sgPSAweDI1ZDE7XG4gIHQuY2lyY3VtZmxleCA9IDB4MDJjNjtcbiAgdC5jaXJjdW1mbGV4YmVsb3djbWIgPSAweDAzMmQ7XG4gIHQuY2lyY3VtZmxleGNtYiA9IDB4MDMwMjtcbiAgdC5jbGVhciA9IDB4MjMyNztcbiAgdC5jbGlja2FsdmVvbGFyID0gMHgwMWMyO1xuICB0LmNsaWNrZGVudGFsID0gMHgwMWMwO1xuICB0LmNsaWNrbGF0ZXJhbCA9IDB4MDFjMTtcbiAgdC5jbGlja3JldHJvZmxleCA9IDB4MDFjMztcbiAgdC5jbHViID0gMHgyNjYzO1xuICB0LmNsdWJzdWl0YmxhY2sgPSAweDI2NjM7XG4gIHQuY2x1YnN1aXR3aGl0ZSA9IDB4MjY2NztcbiAgdC5jbWN1YmVkc3F1YXJlID0gMHgzM2E0O1xuICB0LmNtb25vc3BhY2UgPSAweGZmNDM7XG4gIHQuY21zcXVhcmVkc3F1YXJlID0gMHgzM2EwO1xuICB0LmNvYXJtZW5pYW4gPSAweDA1ODE7XG4gIHQuY29sb24gPSAweDAwM2E7XG4gIHQuY29sb25tb25ldGFyeSA9IDB4MjBhMTtcbiAgdC5jb2xvbm1vbm9zcGFjZSA9IDB4ZmYxYTtcbiAgdC5jb2xvbnNpZ24gPSAweDIwYTE7XG4gIHQuY29sb25zbWFsbCA9IDB4ZmU1NTtcbiAgdC5jb2xvbnRyaWFuZ3VsYXJoYWxmbW9kID0gMHgwMmQxO1xuICB0LmNvbG9udHJpYW5ndWxhcm1vZCA9IDB4MDJkMDtcbiAgdC5jb21tYSA9IDB4MDAyYztcbiAgdC5jb21tYWFib3ZlY21iID0gMHgwMzEzO1xuICB0LmNvbW1hYWJvdmVyaWdodGNtYiA9IDB4MDMxNTtcbiAgdC5jb21tYWFjY2VudCA9IDB4ZjZjMztcbiAgdC5jb21tYWFyYWJpYyA9IDB4MDYwYztcbiAgdC5jb21tYWFybWVuaWFuID0gMHgwNTVkO1xuICB0LmNvbW1haW5mZXJpb3IgPSAweGY2ZTE7XG4gIHQuY29tbWFtb25vc3BhY2UgPSAweGZmMGM7XG4gIHQuY29tbWFyZXZlcnNlZGFib3ZlY21iID0gMHgwMzE0O1xuICB0LmNvbW1hcmV2ZXJzZWRtb2QgPSAweDAyYmQ7XG4gIHQuY29tbWFzbWFsbCA9IDB4ZmU1MDtcbiAgdC5jb21tYXN1cGVyaW9yID0gMHhmNmUyO1xuICB0LmNvbW1hdHVybmVkYWJvdmVjbWIgPSAweDAzMTI7XG4gIHQuY29tbWF0dXJuZWRtb2QgPSAweDAyYmI7XG4gIHQuY29tcGFzcyA9IDB4MjYzYztcbiAgdC5jb25ncnVlbnQgPSAweDIyNDU7XG4gIHQuY29udG91cmludGVncmFsID0gMHgyMjJlO1xuICB0LmNvbnRyb2wgPSAweDIzMDM7XG4gIHQuY29udHJvbEFDSyA9IDB4MDAwNjtcbiAgdC5jb250cm9sQkVMID0gMHgwMDA3O1xuICB0LmNvbnRyb2xCUyA9IDB4MDAwODtcbiAgdC5jb250cm9sQ0FOID0gMHgwMDE4O1xuICB0LmNvbnRyb2xDUiA9IDB4MDAwZDtcbiAgdC5jb250cm9sREMxID0gMHgwMDExO1xuICB0LmNvbnRyb2xEQzIgPSAweDAwMTI7XG4gIHQuY29udHJvbERDMyA9IDB4MDAxMztcbiAgdC5jb250cm9sREM0ID0gMHgwMDE0O1xuICB0LmNvbnRyb2xERUwgPSAweDAwN2Y7XG4gIHQuY29udHJvbERMRSA9IDB4MDAxMDtcbiAgdC5jb250cm9sRU0gPSAweDAwMTk7XG4gIHQuY29udHJvbEVOUSA9IDB4MDAwNTtcbiAgdC5jb250cm9sRU9UID0gMHgwMDA0O1xuICB0LmNvbnRyb2xFU0MgPSAweDAwMWI7XG4gIHQuY29udHJvbEVUQiA9IDB4MDAxNztcbiAgdC5jb250cm9sRVRYID0gMHgwMDAzO1xuICB0LmNvbnRyb2xGRiA9IDB4MDAwYztcbiAgdC5jb250cm9sRlMgPSAweDAwMWM7XG4gIHQuY29udHJvbEdTID0gMHgwMDFkO1xuICB0LmNvbnRyb2xIVCA9IDB4MDAwOTtcbiAgdC5jb250cm9sTEYgPSAweDAwMGE7XG4gIHQuY29udHJvbE5BSyA9IDB4MDAxNTtcbiAgdC5jb250cm9sTlVMTCA9IDB4MDAwMDsgLy8gR2x5cGggaXMgbWlzc2luZyBmcm9tIEFkb2JlJ3Mgb3JpZ2luYWwgbGlzdC5cbiAgdC5jb250cm9sUlMgPSAweDAwMWU7XG4gIHQuY29udHJvbFNJID0gMHgwMDBmO1xuICB0LmNvbnRyb2xTTyA9IDB4MDAwZTtcbiAgdC5jb250cm9sU09UID0gMHgwMDAyO1xuICB0LmNvbnRyb2xTVFggPSAweDAwMDE7XG4gIHQuY29udHJvbFNVQiA9IDB4MDAxYTtcbiAgdC5jb250cm9sU1lOID0gMHgwMDE2O1xuICB0LmNvbnRyb2xVUyA9IDB4MDAxZjtcbiAgdC5jb250cm9sVlQgPSAweDAwMGI7XG4gIHQuY29weXJpZ2h0ID0gMHgwMGE5O1xuICB0LmNvcHlyaWdodHNhbnMgPSAweGY4ZTk7XG4gIHQuY29weXJpZ2h0c2VyaWYgPSAweGY2ZDk7XG4gIHQuY29ybmVyYnJhY2tldGxlZnQgPSAweDMwMGM7XG4gIHQuY29ybmVyYnJhY2tldGxlZnRoYWxmd2lkdGggPSAweGZmNjI7XG4gIHQuY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MTtcbiAgdC5jb3JuZXJicmFja2V0cmlnaHQgPSAweDMwMGQ7XG4gIHQuY29ybmVyYnJhY2tldHJpZ2h0aGFsZndpZHRoID0gMHhmZjYzO1xuICB0LmNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQyO1xuICB0LmNvcnBvcmF0aW9uc3F1YXJlID0gMHgzMzdmO1xuICB0LmNvc3F1YXJlID0gMHgzM2M3O1xuICB0LmNvdmVya2dzcXVhcmUgPSAweDMzYzY7XG4gIHQuY3BhcmVuID0gMHgyNDllO1xuICB0LmNydXplaXJvID0gMHgyMGEyO1xuICB0LmNzdHJldGNoZWQgPSAweDAyOTc7XG4gIHQuY3VybHlhbmQgPSAweDIyY2Y7XG4gIHQuY3VybHlvciA9IDB4MjJjZTtcbiAgdC5jdXJyZW5jeSA9IDB4MDBhNDtcbiAgdC5jeXJCcmV2ZSA9IDB4ZjZkMTtcbiAgdC5jeXJGbGV4ID0gMHhmNmQyO1xuICB0LmN5cmJyZXZlID0gMHhmNmQ0O1xuICB0LmN5cmZsZXggPSAweGY2ZDU7XG4gIHQuZCA9IDB4MDA2NDtcbiAgdC5kYWFybWVuaWFuID0gMHgwNTY0O1xuICB0LmRhYmVuZ2FsaSA9IDB4MDlhNjtcbiAgdC5kYWRhcmFiaWMgPSAweDA2MzY7XG4gIHQuZGFkZXZhID0gMHgwOTI2O1xuICB0LmRhZGZpbmFsYXJhYmljID0gMHhmZWJlO1xuICB0LmRhZGluaXRpYWxhcmFiaWMgPSAweGZlYmY7XG4gIHQuZGFkbWVkaWFsYXJhYmljID0gMHhmZWMwO1xuICB0LmRhZ2VzaCA9IDB4MDViYztcbiAgdC5kYWdlc2hoZWJyZXcgPSAweDA1YmM7XG4gIHQuZGFnZ2VyID0gMHgyMDIwO1xuICB0LmRhZ2dlcmRibCA9IDB4MjAyMTtcbiAgdC5kYWd1amFyYXRpID0gMHgwYWE2O1xuICB0LmRhZ3VybXVraGkgPSAweDBhMjY7XG4gIHQuZGFoaXJhZ2FuYSA9IDB4MzA2MDtcbiAgdC5kYWthdGFrYW5hID0gMHgzMGMwO1xuICB0LmRhbGFyYWJpYyA9IDB4MDYyZjtcbiAgdC5kYWxldCA9IDB4MDVkMztcbiAgdC5kYWxldGRhZ2VzaCA9IDB4ZmIzMztcbiAgdC5kYWxldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMztcbiAgdC5kYWxldGhlYnJldyA9IDB4MDVkMztcbiAgdC5kYWxmaW5hbGFyYWJpYyA9IDB4ZmVhYTtcbiAgdC5kYW1tYWFyYWJpYyA9IDB4MDY0ZjtcbiAgdC5kYW1tYWxvd2FyYWJpYyA9IDB4MDY0ZjtcbiAgdC5kYW1tYXRhbmFsdG9uZWFyYWJpYyA9IDB4MDY0YztcbiAgdC5kYW1tYXRhbmFyYWJpYyA9IDB4MDY0YztcbiAgdC5kYW5kYSA9IDB4MDk2NDtcbiAgdC5kYXJnYWhlYnJldyA9IDB4MDVhNztcbiAgdC5kYXJnYWxlZnRoZWJyZXcgPSAweDA1YTc7XG4gIHQuZGFzaWFwbmV1bWF0YWN5cmlsbGljY21iID0gMHgwNDg1O1xuICB0LmRibEdyYXZlID0gMHhmNmQzO1xuICB0LmRibGFuZ2xlYnJhY2tldGxlZnQgPSAweDMwMGE7XG4gIHQuZGJsYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTNkO1xuICB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDBiO1xuICB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2U7XG4gIHQuZGJsYXJjaGludmVydGVkYmVsb3djbWIgPSAweDAzMmI7XG4gIHQuZGJsYXJyb3dsZWZ0ID0gMHgyMWQ0O1xuICB0LmRibGFycm93cmlnaHQgPSAweDIxZDI7XG4gIHQuZGJsZGFuZGEgPSAweDA5NjU7XG4gIHQuZGJsZ3JhdmUgPSAweGY2ZDY7XG4gIHQuZGJsZ3JhdmVjbWIgPSAweDAzMGY7XG4gIHQuZGJsaW50ZWdyYWwgPSAweDIyMmM7XG4gIHQuZGJsbG93bGluZSA9IDB4MjAxNztcbiAgdC5kYmxsb3dsaW5lY21iID0gMHgwMzMzO1xuICB0LmRibG92ZXJsaW5lY21iID0gMHgwMzNmO1xuICB0LmRibHByaW1lbW9kID0gMHgwMmJhO1xuICB0LmRibHZlcnRpY2FsYmFyID0gMHgyMDE2O1xuICB0LmRibHZlcnRpY2FsbGluZWFib3ZlY21iID0gMHgwMzBlO1xuICB0LmRib3BvbW9mbyA9IDB4MzEwOTtcbiAgdC5kYnNxdWFyZSA9IDB4MzNjODtcbiAgdC5kY2Fyb24gPSAweDAxMGY7XG4gIHQuZGNlZGlsbGEgPSAweDFlMTE7XG4gIHQuZGNpcmNsZSA9IDB4MjRkMztcbiAgdC5kY2lyY3VtZmxleGJlbG93ID0gMHgxZTEzO1xuICB0LmRjcm9hdCA9IDB4MDExMTtcbiAgdC5kZGFiZW5nYWxpID0gMHgwOWExO1xuICB0LmRkYWRldmEgPSAweDA5MjE7XG4gIHQuZGRhZ3VqYXJhdGkgPSAweDBhYTE7XG4gIHQuZGRhZ3VybXVraGkgPSAweDBhMjE7XG4gIHQuZGRhbGFyYWJpYyA9IDB4MDY4ODtcbiAgdC5kZGFsZmluYWxhcmFiaWMgPSAweGZiODk7XG4gIHQuZGRkaGFkZXZhID0gMHgwOTVjO1xuICB0LmRkaGFiZW5nYWxpID0gMHgwOWEyO1xuICB0LmRkaGFkZXZhID0gMHgwOTIyO1xuICB0LmRkaGFndWphcmF0aSA9IDB4MGFhMjtcbiAgdC5kZGhhZ3VybXVraGkgPSAweDBhMjI7XG4gIHQuZGRvdGFjY2VudCA9IDB4MWUwYjtcbiAgdC5kZG90YmVsb3cgPSAweDFlMGQ7XG4gIHQuZGVjaW1hbHNlcGFyYXRvcmFyYWJpYyA9IDB4MDY2YjtcbiAgdC5kZWNpbWFsc2VwYXJhdG9ycGVyc2lhbiA9IDB4MDY2YjtcbiAgdC5kZWN5cmlsbGljID0gMHgwNDM0O1xuICB0LmRlZ3JlZSA9IDB4MDBiMDtcbiAgdC5kZWhpaGVicmV3ID0gMHgwNWFkO1xuICB0LmRlaGlyYWdhbmEgPSAweDMwNjc7XG4gIHQuZGVpY29wdGljID0gMHgwM2VmO1xuICB0LmRla2F0YWthbmEgPSAweDMwYzc7XG4gIHQuZGVsZXRlbGVmdCA9IDB4MjMyYjtcbiAgdC5kZWxldGVyaWdodCA9IDB4MjMyNjtcbiAgdC5kZWx0YSA9IDB4MDNiNDtcbiAgdC5kZWx0YXR1cm5lZCA9IDB4MDE4ZDtcbiAgdC5kZW5vbWluYXRvcm1pbnVzb25lbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmODtcbiAgdC5kZXpoID0gMHgwMmE0O1xuICB0LmRoYWJlbmdhbGkgPSAweDA5YTc7XG4gIHQuZGhhZGV2YSA9IDB4MDkyNztcbiAgdC5kaGFndWphcmF0aSA9IDB4MGFhNztcbiAgdC5kaGFndXJtdWtoaSA9IDB4MGEyNztcbiAgdC5kaG9vayA9IDB4MDI1NztcbiAgdC5kaWFseXRpa2F0b25vcyA9IDB4MDM4NTtcbiAgdC5kaWFseXRpa2F0b25vc2NtYiA9IDB4MDM0NDtcbiAgdC5kaWFtb25kID0gMHgyNjY2O1xuICB0LmRpYW1vbmRzdWl0d2hpdGUgPSAweDI2NjI7XG4gIHQuZGllcmVzaXMgPSAweDAwYTg7XG4gIHQuZGllcmVzaXNhY3V0ZSA9IDB4ZjZkNztcbiAgdC5kaWVyZXNpc2JlbG93Y21iID0gMHgwMzI0O1xuICB0LmRpZXJlc2lzY21iID0gMHgwMzA4O1xuICB0LmRpZXJlc2lzZ3JhdmUgPSAweGY2ZDg7XG4gIHQuZGllcmVzaXN0b25vcyA9IDB4MDM4NTtcbiAgdC5kaWhpcmFnYW5hID0gMHgzMDYyO1xuICB0LmRpa2F0YWthbmEgPSAweDMwYzI7XG4gIHQuZGl0dG9tYXJrID0gMHgzMDAzO1xuICB0LmRpdmlkZSA9IDB4MDBmNztcbiAgdC5kaXZpZGVzID0gMHgyMjIzO1xuICB0LmRpdmlzaW9uc2xhc2ggPSAweDIyMTU7XG4gIHQuZGplY3lyaWxsaWMgPSAweDA0NTI7XG4gIHQuZGtzaGFkZSA9IDB4MjU5MztcbiAgdC5kbGluZWJlbG93ID0gMHgxZTBmO1xuICB0LmRsc3F1YXJlID0gMHgzMzk3O1xuICB0LmRtYWNyb24gPSAweDAxMTE7XG4gIHQuZG1vbm9zcGFjZSA9IDB4ZmY0NDtcbiAgdC5kbmJsb2NrID0gMHgyNTg0O1xuICB0LmRvY2hhZGF0aGFpID0gMHgwZTBlO1xuICB0LmRvZGVrdGhhaSA9IDB4MGUxNDtcbiAgdC5kb2hpcmFnYW5hID0gMHgzMDY5O1xuICB0LmRva2F0YWthbmEgPSAweDMwYzk7XG4gIHQuZG9sbGFyID0gMHgwMDI0O1xuICB0LmRvbGxhcmluZmVyaW9yID0gMHhmNmUzO1xuICB0LmRvbGxhcm1vbm9zcGFjZSA9IDB4ZmYwNDtcbiAgdC5kb2xsYXJvbGRzdHlsZSA9IDB4ZjcyNDtcbiAgdC5kb2xsYXJzbWFsbCA9IDB4ZmU2OTtcbiAgdC5kb2xsYXJzdXBlcmlvciA9IDB4ZjZlNDtcbiAgdC5kb25nID0gMHgyMGFiO1xuICB0LmRvcnVzcXVhcmUgPSAweDMzMjY7XG4gIHQuZG90YWNjZW50ID0gMHgwMmQ5O1xuICB0LmRvdGFjY2VudGNtYiA9IDB4MDMwNztcbiAgdC5kb3RiZWxvd2NtYiA9IDB4MDMyMztcbiAgdC5kb3RiZWxvd2NvbWIgPSAweDAzMjM7XG4gIHQuZG90a2F0YWthbmEgPSAweDMwZmI7XG4gIHQuZG90bGVzc2kgPSAweDAxMzE7XG4gIHQuZG90bGVzc2ogPSAweGY2YmU7XG4gIHQuZG90bGVzc2pzdHJva2Vob29rID0gMHgwMjg0O1xuICB0LmRvdG1hdGggPSAweDIyYzU7XG4gIHQuZG90dGVkY2lyY2xlID0gMHgyNWNjO1xuICB0LmRvdWJsZXlvZHBhdGFoID0gMHhmYjFmO1xuICB0LmRvdWJsZXlvZHBhdGFoaGVicmV3ID0gMHhmYjFmO1xuICB0LmRvd250YWNrYmVsb3djbWIgPSAweDAzMWU7XG4gIHQuZG93bnRhY2ttb2QgPSAweDAyZDU7XG4gIHQuZHBhcmVuID0gMHgyNDlmO1xuICB0LmRzdXBlcmlvciA9IDB4ZjZlYjtcbiAgdC5kdGFpbCA9IDB4MDI1NjtcbiAgdC5kdG9wYmFyID0gMHgwMThjO1xuICB0LmR1aGlyYWdhbmEgPSAweDMwNjU7XG4gIHQuZHVrYXRha2FuYSA9IDB4MzBjNTtcbiAgdC5keiA9IDB4MDFmMztcbiAgdC5kemFsdG9uZSA9IDB4MDJhMztcbiAgdC5kemNhcm9uID0gMHgwMWM2O1xuICB0LmR6Y3VybCA9IDB4MDJhNTtcbiAgdC5kemVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRlMTtcbiAgdC5kemVjeXJpbGxpYyA9IDB4MDQ1NTtcbiAgdC5kemhlY3lyaWxsaWMgPSAweDA0NWY7XG4gIHQuZSA9IDB4MDA2NTtcbiAgdC5lYWN1dGUgPSAweDAwZTk7XG4gIHQuZWFydGggPSAweDI2NDE7XG4gIHQuZWJlbmdhbGkgPSAweDA5OGY7XG4gIHQuZWJvcG9tb2ZvID0gMHgzMTFjO1xuICB0LmVicmV2ZSA9IDB4MDExNTtcbiAgdC5lY2FuZHJhZGV2YSA9IDB4MDkwZDtcbiAgdC5lY2FuZHJhZ3VqYXJhdGkgPSAweDBhOGQ7XG4gIHQuZWNhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDU7XG4gIHQuZWNhbmRyYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM1O1xuICB0LmVjYXJvbiA9IDB4MDExYjtcbiAgdC5lY2VkaWxsYWJyZXZlID0gMHgxZTFkO1xuICB0LmVjaGFybWVuaWFuID0gMHgwNTY1O1xuICB0LmVjaHlpd25hcm1lbmlhbiA9IDB4MDU4NztcbiAgdC5lY2lyY2xlID0gMHgyNGQ0O1xuICB0LmVjaXJjdW1mbGV4ID0gMHgwMGVhO1xuICB0LmVjaXJjdW1mbGV4YWN1dGUgPSAweDFlYmY7XG4gIHQuZWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxOTtcbiAgdC5lY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWM3O1xuICB0LmVjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYzE7XG4gIHQuZWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzM7XG4gIHQuZWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNTtcbiAgdC5lY3lyaWxsaWMgPSAweDA0NTQ7XG4gIHQuZWRibGdyYXZlID0gMHgwMjA1O1xuICB0LmVkZXZhID0gMHgwOTBmO1xuICB0LmVkaWVyZXNpcyA9IDB4MDBlYjtcbiAgdC5lZG90ID0gMHgwMTE3O1xuICB0LmVkb3RhY2NlbnQgPSAweDAxMTc7XG4gIHQuZWRvdGJlbG93ID0gMHgxZWI5O1xuICB0LmVlZ3VybXVraGkgPSAweDBhMGY7XG4gIHQuZWVtYXRyYWd1cm11a2hpID0gMHgwYTQ3O1xuICB0LmVmY3lyaWxsaWMgPSAweDA0NDQ7XG4gIHQuZWdyYXZlID0gMHgwMGU4O1xuICB0LmVndWphcmF0aSA9IDB4MGE4ZjtcbiAgdC5laGFybWVuaWFuID0gMHgwNTY3O1xuICB0LmVoYm9wb21vZm8gPSAweDMxMWQ7XG4gIHQuZWhpcmFnYW5hID0gMHgzMDQ4O1xuICB0LmVob29rYWJvdmUgPSAweDFlYmI7XG4gIHQuZWlib3BvbW9mbyA9IDB4MzExZjtcbiAgdC5laWdodCA9IDB4MDAzODtcbiAgdC5laWdodGFyYWJpYyA9IDB4MDY2ODtcbiAgdC5laWdodGJlbmdhbGkgPSAweDA5ZWU7XG4gIHQuZWlnaHRjaXJjbGUgPSAweDI0Njc7XG4gIHQuZWlnaHRjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzkxO1xuICB0LmVpZ2h0ZGV2YSA9IDB4MDk2ZTtcbiAgdC5laWdodGVlbmNpcmNsZSA9IDB4MjQ3MTtcbiAgdC5laWdodGVlbnBhcmVuID0gMHgyNDg1O1xuICB0LmVpZ2h0ZWVucGVyaW9kID0gMHgyNDk5O1xuICB0LmVpZ2h0Z3VqYXJhdGkgPSAweDBhZWU7XG4gIHQuZWlnaHRndXJtdWtoaSA9IDB4MGE2ZTtcbiAgdC5laWdodGhhY2thcmFiaWMgPSAweDA2Njg7XG4gIHQuZWlnaHRoYW5nemhvdSA9IDB4MzAyODtcbiAgdC5laWdodGhub3RlYmVhbWVkID0gMHgyNjZiO1xuICB0LmVpZ2h0aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNztcbiAgdC5laWdodGluZmVyaW9yID0gMHgyMDg4O1xuICB0LmVpZ2h0bW9ub3NwYWNlID0gMHhmZjE4O1xuICB0LmVpZ2h0b2xkc3R5bGUgPSAweGY3Mzg7XG4gIHQuZWlnaHRwYXJlbiA9IDB4MjQ3YjtcbiAgdC5laWdodHBlcmlvZCA9IDB4MjQ4ZjtcbiAgdC5laWdodHBlcnNpYW4gPSAweDA2Zjg7XG4gIHQuZWlnaHRyb21hbiA9IDB4MjE3NztcbiAgdC5laWdodHN1cGVyaW9yID0gMHgyMDc4O1xuICB0LmVpZ2h0dGhhaSA9IDB4MGU1ODtcbiAgdC5laW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNztcbiAgdC5laW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2NTtcbiAgdC5la2F0YWthbmEgPSAweDMwYTg7XG4gIHQuZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc0O1xuICB0LmVrb25rYXJndXJtdWtoaSA9IDB4MGE3NDtcbiAgdC5la29yZWFuID0gMHgzMTU0O1xuICB0LmVsY3lyaWxsaWMgPSAweDA0M2I7XG4gIHQuZWxlbWVudCA9IDB4MjIwODtcbiAgdC5lbGV2ZW5jaXJjbGUgPSAweDI0NmE7XG4gIHQuZWxldmVucGFyZW4gPSAweDI0N2U7XG4gIHQuZWxldmVucGVyaW9kID0gMHgyNDkyO1xuICB0LmVsZXZlbnJvbWFuID0gMHgyMTdhO1xuICB0LmVsbGlwc2lzID0gMHgyMDI2O1xuICB0LmVsbGlwc2lzdmVydGljYWwgPSAweDIyZWU7XG4gIHQuZW1hY3JvbiA9IDB4MDExMztcbiAgdC5lbWFjcm9uYWN1dGUgPSAweDFlMTc7XG4gIHQuZW1hY3JvbmdyYXZlID0gMHgxZTE1O1xuICB0LmVtY3lyaWxsaWMgPSAweDA0M2M7XG4gIHQuZW1kYXNoID0gMHgyMDE0O1xuICB0LmVtZGFzaHZlcnRpY2FsID0gMHhmZTMxO1xuICB0LmVtb25vc3BhY2UgPSAweGZmNDU7XG4gIHQuZW1waGFzaXNtYXJrYXJtZW5pYW4gPSAweDA1NWI7XG4gIHQuZW1wdHlzZXQgPSAweDIyMDU7XG4gIHQuZW5ib3BvbW9mbyA9IDB4MzEyMztcbiAgdC5lbmN5cmlsbGljID0gMHgwNDNkO1xuICB0LmVuZGFzaCA9IDB4MjAxMztcbiAgdC5lbmRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMjtcbiAgdC5lbmRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGEzO1xuICB0LmVuZyA9IDB4MDE0YjtcbiAgdC5lbmdib3BvbW9mbyA9IDB4MzEyNTtcbiAgdC5lbmdoZWN5cmlsbGljID0gMHgwNGE1O1xuICB0LmVuaG9va2N5cmlsbGljID0gMHgwNGM4O1xuICB0LmVuc3BhY2UgPSAweDIwMDI7XG4gIHQuZW9nb25layA9IDB4MDExOTtcbiAgdC5lb2tvcmVhbiA9IDB4MzE1MztcbiAgdC5lb3BlbiA9IDB4MDI1YjtcbiAgdC5lb3BlbmNsb3NlZCA9IDB4MDI5YTtcbiAgdC5lb3BlbnJldmVyc2VkID0gMHgwMjVjO1xuICB0LmVvcGVucmV2ZXJzZWRjbG9zZWQgPSAweDAyNWU7XG4gIHQuZW9wZW5yZXZlcnNlZGhvb2sgPSAweDAyNWQ7XG4gIHQuZXBhcmVuID0gMHgyNGEwO1xuICB0LmVwc2lsb24gPSAweDAzYjU7XG4gIHQuZXBzaWxvbnRvbm9zID0gMHgwM2FkO1xuICB0LmVxdWFsID0gMHgwMDNkO1xuICB0LmVxdWFsbW9ub3NwYWNlID0gMHhmZjFkO1xuICB0LmVxdWFsc21hbGwgPSAweGZlNjY7XG4gIHQuZXF1YWxzdXBlcmlvciA9IDB4MjA3YztcbiAgdC5lcXVpdmFsZW5jZSA9IDB4MjI2MTtcbiAgdC5lcmJvcG9tb2ZvID0gMHgzMTI2O1xuICB0LmVyY3lyaWxsaWMgPSAweDA0NDA7XG4gIHQuZXJldmVyc2VkID0gMHgwMjU4O1xuICB0LmVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDRkO1xuICB0LmVzY3lyaWxsaWMgPSAweDA0NDE7XG4gIHQuZXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYjtcbiAgdC5lc2ggPSAweDAyODM7XG4gIHQuZXNoY3VybCA9IDB4MDI4NjtcbiAgdC5lc2hvcnRkZXZhID0gMHgwOTBlO1xuICB0LmVzaG9ydHZvd2Vsc2lnbmRldmEgPSAweDA5NDY7XG4gIHQuZXNocmV2ZXJzZWRsb29wID0gMHgwMWFhO1xuICB0LmVzaHNxdWF0cmV2ZXJzZWQgPSAweDAyODU7XG4gIHQuZXNtYWxsaGlyYWdhbmEgPSAweDMwNDc7XG4gIHQuZXNtYWxsa2F0YWthbmEgPSAweDMwYTc7XG4gIHQuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmE7XG4gIHQuZXN0aW1hdGVkID0gMHgyMTJlO1xuICB0LmVzdXBlcmlvciA9IDB4ZjZlYztcbiAgdC5ldGEgPSAweDAzYjc7XG4gIHQuZXRhcm1lbmlhbiA9IDB4MDU2ODtcbiAgdC5ldGF0b25vcyA9IDB4MDNhZTtcbiAgdC5ldGggPSAweDAwZjA7XG4gIHQuZXRpbGRlID0gMHgxZWJkO1xuICB0LmV0aWxkZWJlbG93ID0gMHgxZTFiO1xuICB0LmV0bmFodGFmb3VraGhlYnJldyA9IDB4MDU5MTtcbiAgdC5ldG5haHRhZm91a2hsZWZ0aGVicmV3ID0gMHgwNTkxO1xuICB0LmV0bmFodGFoZWJyZXcgPSAweDA1OTE7XG4gIHQuZXRuYWh0YWxlZnRoZWJyZXcgPSAweDA1OTE7XG4gIHQuZXR1cm5lZCA9IDB4MDFkZDtcbiAgdC5ldWtvcmVhbiA9IDB4MzE2MTtcbiAgdC5ldXJvID0gMHgyMGFjO1xuICB0LmV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWM3O1xuICB0LmV2b3dlbHNpZ25kZXZhID0gMHgwOTQ3O1xuICB0LmV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNztcbiAgdC5leGNsYW0gPSAweDAwMjE7XG4gIHQuZXhjbGFtYXJtZW5pYW4gPSAweDA1NWM7XG4gIHQuZXhjbGFtZGJsID0gMHgyMDNjO1xuICB0LmV4Y2xhbWRvd24gPSAweDAwYTE7XG4gIHQuZXhjbGFtZG93bnNtYWxsID0gMHhmN2ExO1xuICB0LmV4Y2xhbW1vbm9zcGFjZSA9IDB4ZmYwMTtcbiAgdC5leGNsYW1zbWFsbCA9IDB4ZjcyMTtcbiAgdC5leGlzdGVudGlhbCA9IDB4MjIwMztcbiAgdC5lemggPSAweDAyOTI7XG4gIHQuZXpoY2Fyb24gPSAweDAxZWY7XG4gIHQuZXpoY3VybCA9IDB4MDI5MztcbiAgdC5lemhyZXZlcnNlZCA9IDB4MDFiOTtcbiAgdC5lemh0YWlsID0gMHgwMWJhO1xuICB0LmYgPSAweDAwNjY7XG4gIHQuZmFkZXZhID0gMHgwOTVlO1xuICB0LmZhZ3VybXVraGkgPSAweDBhNWU7XG4gIHQuZmFocmVuaGVpdCA9IDB4MjEwOTtcbiAgdC5mYXRoYWFyYWJpYyA9IDB4MDY0ZTtcbiAgdC5mYXRoYWxvd2FyYWJpYyA9IDB4MDY0ZTtcbiAgdC5mYXRoYXRhbmFyYWJpYyA9IDB4MDY0YjtcbiAgdC5mYm9wb21vZm8gPSAweDMxMDg7XG4gIHQuZmNpcmNsZSA9IDB4MjRkNTtcbiAgdC5mZG90YWNjZW50ID0gMHgxZTFmO1xuICB0LmZlaGFyYWJpYyA9IDB4MDY0MTtcbiAgdC5mZWhhcm1lbmlhbiA9IDB4MDU4NjtcbiAgdC5mZWhmaW5hbGFyYWJpYyA9IDB4ZmVkMjtcbiAgdC5mZWhpbml0aWFsYXJhYmljID0gMHhmZWQzO1xuICB0LmZlaG1lZGlhbGFyYWJpYyA9IDB4ZmVkNDtcbiAgdC5mZWljb3B0aWMgPSAweDAzZTU7XG4gIHQuZmVtYWxlID0gMHgyNjQwO1xuICB0LmZmID0gMHhmYjAwO1xuICB0LmZfZiA9IDB4ZmIwMDsgLy8gRml4ZXMgaXNzdWUgMTEwMTYuXG4gIHQuZmZpID0gMHhmYjAzO1xuICB0LmZmbCA9IDB4ZmIwNDtcbiAgdC5maSA9IDB4ZmIwMTtcbiAgdC5maWZ0ZWVuY2lyY2xlID0gMHgyNDZlO1xuICB0LmZpZnRlZW5wYXJlbiA9IDB4MjQ4MjtcbiAgdC5maWZ0ZWVucGVyaW9kID0gMHgyNDk2O1xuICB0LmZpZ3VyZWRhc2ggPSAweDIwMTI7XG4gIHQuZmlsbGVkYm94ID0gMHgyNWEwO1xuICB0LmZpbGxlZHJlY3QgPSAweDI1YWM7XG4gIHQuZmluYWxrYWYgPSAweDA1ZGE7XG4gIHQuZmluYWxrYWZkYWdlc2ggPSAweGZiM2E7XG4gIHQuZmluYWxrYWZkYWdlc2hoZWJyZXcgPSAweGZiM2E7XG4gIHQuZmluYWxrYWZoZWJyZXcgPSAweDA1ZGE7XG4gIHQuZmluYWxtZW0gPSAweDA1ZGQ7XG4gIHQuZmluYWxtZW1oZWJyZXcgPSAweDA1ZGQ7XG4gIHQuZmluYWxudW4gPSAweDA1ZGY7XG4gIHQuZmluYWxudW5oZWJyZXcgPSAweDA1ZGY7XG4gIHQuZmluYWxwZSA9IDB4MDVlMztcbiAgdC5maW5hbHBlaGVicmV3ID0gMHgwNWUzO1xuICB0LmZpbmFsdHNhZGkgPSAweDA1ZTU7XG4gIHQuZmluYWx0c2FkaWhlYnJldyA9IDB4MDVlNTtcbiAgdC5maXJzdHRvbmVjaGluZXNlID0gMHgwMmM5O1xuICB0LmZpc2hleWUgPSAweDI1Yzk7XG4gIHQuZml0YWN5cmlsbGljID0gMHgwNDczO1xuICB0LmZpdmUgPSAweDAwMzU7XG4gIHQuZml2ZWFyYWJpYyA9IDB4MDY2NTtcbiAgdC5maXZlYmVuZ2FsaSA9IDB4MDllYjtcbiAgdC5maXZlY2lyY2xlID0gMHgyNDY0O1xuICB0LmZpdmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhlO1xuICB0LmZpdmVkZXZhID0gMHgwOTZiO1xuICB0LmZpdmVlaWdodGhzID0gMHgyMTVkO1xuICB0LmZpdmVndWphcmF0aSA9IDB4MGFlYjtcbiAgdC5maXZlZ3VybXVraGkgPSAweDBhNmI7XG4gIHQuZml2ZWhhY2thcmFiaWMgPSAweDA2NjU7XG4gIHQuZml2ZWhhbmd6aG91ID0gMHgzMDI1O1xuICB0LmZpdmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI0O1xuICB0LmZpdmVpbmZlcmlvciA9IDB4MjA4NTtcbiAgdC5maXZlbW9ub3NwYWNlID0gMHhmZjE1O1xuICB0LmZpdmVvbGRzdHlsZSA9IDB4ZjczNTtcbiAgdC5maXZlcGFyZW4gPSAweDI0Nzg7XG4gIHQuZml2ZXBlcmlvZCA9IDB4MjQ4YztcbiAgdC5maXZlcGVyc2lhbiA9IDB4MDZmNTtcbiAgdC5maXZlcm9tYW4gPSAweDIxNzQ7XG4gIHQuZml2ZXN1cGVyaW9yID0gMHgyMDc1O1xuICB0LmZpdmV0aGFpID0gMHgwZTU1O1xuICB0LmZsID0gMHhmYjAyO1xuICB0LmZsb3JpbiA9IDB4MDE5MjtcbiAgdC5mbW9ub3NwYWNlID0gMHhmZjQ2O1xuICB0LmZtc3F1YXJlID0gMHgzMzk5O1xuICB0LmZvZmFudGhhaSA9IDB4MGUxZjtcbiAgdC5mb2ZhdGhhaSA9IDB4MGUxZDtcbiAgdC5mb25nbWFudGhhaSA9IDB4MGU0ZjtcbiAgdC5mb3JhbGwgPSAweDIyMDA7XG4gIHQuZm91ciA9IDB4MDAzNDtcbiAgdC5mb3VyYXJhYmljID0gMHgwNjY0O1xuICB0LmZvdXJiZW5nYWxpID0gMHgwOWVhO1xuICB0LmZvdXJjaXJjbGUgPSAweDI0NjM7XG4gIHQuZm91cmNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGQ7XG4gIHQuZm91cmRldmEgPSAweDA5NmE7XG4gIHQuZm91cmd1amFyYXRpID0gMHgwYWVhO1xuICB0LmZvdXJndXJtdWtoaSA9IDB4MGE2YTtcbiAgdC5mb3VyaGFja2FyYWJpYyA9IDB4MDY2NDtcbiAgdC5mb3VyaGFuZ3pob3UgPSAweDMwMjQ7XG4gIHQuZm91cmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjM7XG4gIHQuZm91cmluZmVyaW9yID0gMHgyMDg0O1xuICB0LmZvdXJtb25vc3BhY2UgPSAweGZmMTQ7XG4gIHQuZm91cm51bWVyYXRvcmJlbmdhbGkgPSAweDA5Zjc7XG4gIHQuZm91cm9sZHN0eWxlID0gMHhmNzM0O1xuICB0LmZvdXJwYXJlbiA9IDB4MjQ3NztcbiAgdC5mb3VycGVyaW9kID0gMHgyNDhiO1xuICB0LmZvdXJwZXJzaWFuID0gMHgwNmY0O1xuICB0LmZvdXJyb21hbiA9IDB4MjE3MztcbiAgdC5mb3Vyc3VwZXJpb3IgPSAweDIwNzQ7XG4gIHQuZm91cnRlZW5jaXJjbGUgPSAweDI0NmQ7XG4gIHQuZm91cnRlZW5wYXJlbiA9IDB4MjQ4MTtcbiAgdC5mb3VydGVlbnBlcmlvZCA9IDB4MjQ5NTtcbiAgdC5mb3VydGhhaSA9IDB4MGU1NDtcbiAgdC5mb3VydGh0b25lY2hpbmVzZSA9IDB4MDJjYjtcbiAgdC5mcGFyZW4gPSAweDI0YTE7XG4gIHQuZnJhY3Rpb24gPSAweDIwNDQ7XG4gIHQuZnJhbmMgPSAweDIwYTM7XG4gIHQuZyA9IDB4MDA2NztcbiAgdC5nYWJlbmdhbGkgPSAweDA5OTc7XG4gIHQuZ2FjdXRlID0gMHgwMWY1O1xuICB0LmdhZGV2YSA9IDB4MDkxNztcbiAgdC5nYWZhcmFiaWMgPSAweDA2YWY7XG4gIHQuZ2FmZmluYWxhcmFiaWMgPSAweGZiOTM7XG4gIHQuZ2FmaW5pdGlhbGFyYWJpYyA9IDB4ZmI5NDtcbiAgdC5nYWZtZWRpYWxhcmFiaWMgPSAweGZiOTU7XG4gIHQuZ2FndWphcmF0aSA9IDB4MGE5NztcbiAgdC5nYWd1cm11a2hpID0gMHgwYTE3O1xuICB0LmdhaGlyYWdhbmEgPSAweDMwNGM7XG4gIHQuZ2FrYXRha2FuYSA9IDB4MzBhYztcbiAgdC5nYW1tYSA9IDB4MDNiMztcbiAgdC5nYW1tYWxhdGluc21hbGwgPSAweDAyNjM7XG4gIHQuZ2FtbWFzdXBlcmlvciA9IDB4MDJlMDtcbiAgdC5nYW5naWFjb3B0aWMgPSAweDAzZWI7XG4gIHQuZ2JvcG9tb2ZvID0gMHgzMTBkO1xuICB0LmdicmV2ZSA9IDB4MDExZjtcbiAgdC5nY2Fyb24gPSAweDAxZTc7XG4gIHQuZ2NlZGlsbGEgPSAweDAxMjM7XG4gIHQuZ2NpcmNsZSA9IDB4MjRkNjtcbiAgdC5nY2lyY3VtZmxleCA9IDB4MDExZDtcbiAgdC5nY29tbWFhY2NlbnQgPSAweDAxMjM7XG4gIHQuZ2RvdCA9IDB4MDEyMTtcbiAgdC5nZG90YWNjZW50ID0gMHgwMTIxO1xuICB0LmdlY3lyaWxsaWMgPSAweDA0MzM7XG4gIHQuZ2VoaXJhZ2FuYSA9IDB4MzA1MjtcbiAgdC5nZWthdGFrYW5hID0gMHgzMGIyO1xuICB0Lmdlb21ldHJpY2FsbHllcXVhbCA9IDB4MjI1MTtcbiAgdC5nZXJlc2hhY2NlbnRoZWJyZXcgPSAweDA1OWM7XG4gIHQuZ2VyZXNoaGVicmV3ID0gMHgwNWYzO1xuICB0LmdlcmVzaG11cWRhbWhlYnJldyA9IDB4MDU5ZDtcbiAgdC5nZXJtYW5kYmxzID0gMHgwMGRmO1xuICB0LmdlcnNoYXlpbWFjY2VudGhlYnJldyA9IDB4MDU5ZTtcbiAgdC5nZXJzaGF5aW1oZWJyZXcgPSAweDA1ZjQ7XG4gIHQuZ2V0YW1hcmsgPSAweDMwMTM7XG4gIHQuZ2hhYmVuZ2FsaSA9IDB4MDk5ODtcbiAgdC5naGFkYXJtZW5pYW4gPSAweDA1NzI7XG4gIHQuZ2hhZGV2YSA9IDB4MDkxODtcbiAgdC5naGFndWphcmF0aSA9IDB4MGE5ODtcbiAgdC5naGFndXJtdWtoaSA9IDB4MGExODtcbiAgdC5naGFpbmFyYWJpYyA9IDB4MDYzYTtcbiAgdC5naGFpbmZpbmFsYXJhYmljID0gMHhmZWNlO1xuICB0LmdoYWluaW5pdGlhbGFyYWJpYyA9IDB4ZmVjZjtcbiAgdC5naGFpbm1lZGlhbGFyYWJpYyA9IDB4ZmVkMDtcbiAgdC5naGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTU7XG4gIHQuZ2hlc3Ryb2tlY3lyaWxsaWMgPSAweDA0OTM7XG4gIHQuZ2hldXB0dXJuY3lyaWxsaWMgPSAweDA0OTE7XG4gIHQuZ2hoYWRldmEgPSAweDA5NWE7XG4gIHQuZ2hoYWd1cm11a2hpID0gMHgwYTVhO1xuICB0Lmdob29rID0gMHgwMjYwO1xuICB0LmdoenNxdWFyZSA9IDB4MzM5MztcbiAgdC5naWhpcmFnYW5hID0gMHgzMDRlO1xuICB0Lmdpa2F0YWthbmEgPSAweDMwYWU7XG4gIHQuZ2ltYXJtZW5pYW4gPSAweDA1NjM7XG4gIHQuZ2ltZWwgPSAweDA1ZDI7XG4gIHQuZ2ltZWxkYWdlc2ggPSAweGZiMzI7XG4gIHQuZ2ltZWxkYWdlc2hoZWJyZXcgPSAweGZiMzI7XG4gIHQuZ2ltZWxoZWJyZXcgPSAweDA1ZDI7XG4gIHQuZ2plY3lyaWxsaWMgPSAweDA0NTM7XG4gIHQuZ2xvdHRhbGludmVydGVkc3Ryb2tlID0gMHgwMWJlO1xuICB0Lmdsb3R0YWxzdG9wID0gMHgwMjk0O1xuICB0Lmdsb3R0YWxzdG9waW52ZXJ0ZWQgPSAweDAyOTY7XG4gIHQuZ2xvdHRhbHN0b3Btb2QgPSAweDAyYzA7XG4gIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZCA9IDB4MDI5NTtcbiAgdC5nbG90dGFsc3RvcHJldmVyc2VkbW9kID0gMHgwMmMxO1xuICB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvciA9IDB4MDJlNDtcbiAgdC5nbG90dGFsc3RvcHN0cm9rZSA9IDB4MDJhMTtcbiAgdC5nbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkID0gMHgwMmEyO1xuICB0LmdtYWNyb24gPSAweDFlMjE7XG4gIHQuZ21vbm9zcGFjZSA9IDB4ZmY0NztcbiAgdC5nb2hpcmFnYW5hID0gMHgzMDU0O1xuICB0Lmdva2F0YWthbmEgPSAweDMwYjQ7XG4gIHQuZ3BhcmVuID0gMHgyNGEyO1xuICB0LmdwYXNxdWFyZSA9IDB4MzNhYztcbiAgdC5ncmFkaWVudCA9IDB4MjIwNztcbiAgdC5ncmF2ZSA9IDB4MDA2MDtcbiAgdC5ncmF2ZWJlbG93Y21iID0gMHgwMzE2O1xuICB0LmdyYXZlY21iID0gMHgwMzAwO1xuICB0LmdyYXZlY29tYiA9IDB4MDMwMDtcbiAgdC5ncmF2ZWRldmEgPSAweDA5NTM7XG4gIHQuZ3JhdmVsb3dtb2QgPSAweDAyY2U7XG4gIHQuZ3JhdmVtb25vc3BhY2UgPSAweGZmNDA7XG4gIHQuZ3JhdmV0b25lY21iID0gMHgwMzQwO1xuICB0LmdyZWF0ZXIgPSAweDAwM2U7XG4gIHQuZ3JlYXRlcmVxdWFsID0gMHgyMjY1O1xuICB0LmdyZWF0ZXJlcXVhbG9ybGVzcyA9IDB4MjJkYjtcbiAgdC5ncmVhdGVybW9ub3NwYWNlID0gMHhmZjFlO1xuICB0LmdyZWF0ZXJvcmVxdWl2YWxlbnQgPSAweDIyNzM7XG4gIHQuZ3JlYXRlcm9ybGVzcyA9IDB4MjI3NztcbiAgdC5ncmVhdGVyb3ZlcmVxdWFsID0gMHgyMjY3O1xuICB0LmdyZWF0ZXJzbWFsbCA9IDB4ZmU2NTtcbiAgdC5nc2NyaXB0ID0gMHgwMjYxO1xuICB0LmdzdHJva2UgPSAweDAxZTU7XG4gIHQuZ3VoaXJhZ2FuYSA9IDB4MzA1MDtcbiAgdC5ndWlsbGVtb3RsZWZ0ID0gMHgwMGFiO1xuICB0Lmd1aWxsZW1vdHJpZ2h0ID0gMHgwMGJiO1xuICB0Lmd1aWxzaW5nbGxlZnQgPSAweDIwMzk7XG4gIHQuZ3VpbHNpbmdscmlnaHQgPSAweDIwM2E7XG4gIHQuZ3VrYXRha2FuYSA9IDB4MzBiMDtcbiAgdC5ndXJhbXVzcXVhcmUgPSAweDMzMTg7XG4gIHQuZ3lzcXVhcmUgPSAweDMzYzk7XG4gIHQuaCA9IDB4MDA2ODtcbiAgdC5oYWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGE5O1xuICB0LmhhYWx0b25lYXJhYmljID0gMHgwNmMxO1xuICB0LmhhYmVuZ2FsaSA9IDB4MDliOTtcbiAgdC5oYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGIzO1xuICB0LmhhZGV2YSA9IDB4MDkzOTtcbiAgdC5oYWd1amFyYXRpID0gMHgwYWI5O1xuICB0LmhhZ3VybXVraGkgPSAweDBhMzk7XG4gIHQuaGFoYXJhYmljID0gMHgwNjJkO1xuICB0LmhhaGZpbmFsYXJhYmljID0gMHhmZWEyO1xuICB0LmhhaGluaXRpYWxhcmFiaWMgPSAweGZlYTM7XG4gIHQuaGFoaXJhZ2FuYSA9IDB4MzA2ZjtcbiAgdC5oYWhtZWRpYWxhcmFiaWMgPSAweGZlYTQ7XG4gIHQuaGFpdHVzcXVhcmUgPSAweDMzMmE7XG4gIHQuaGFrYXRha2FuYSA9IDB4MzBjZjtcbiAgdC5oYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhhO1xuICB0LmhhbGFudGd1cm11a2hpID0gMHgwYTRkO1xuICB0LmhhbXphYXJhYmljID0gMHgwNjIxO1xuICB0LmhhbXphbG93YXJhYmljID0gMHgwNjIxO1xuICB0Lmhhbmd1bGZpbGxlciA9IDB4MzE2NDtcbiAgdC5oYXJkc2lnbmN5cmlsbGljID0gMHgwNDRhO1xuICB0LmhhcnBvb25sZWZ0YmFyYnVwID0gMHgyMWJjO1xuICB0LmhhcnBvb25yaWdodGJhcmJ1cCA9IDB4MjFjMDtcbiAgdC5oYXNxdWFyZSA9IDB4MzNjYTtcbiAgdC5oYXRhZnBhdGFoID0gMHgwNWIyO1xuICB0LmhhdGFmcGF0YWgxNiA9IDB4MDViMjtcbiAgdC5oYXRhZnBhdGFoMjMgPSAweDA1YjI7XG4gIHQuaGF0YWZwYXRhaDJmID0gMHgwNWIyO1xuICB0LmhhdGFmcGF0YWhoZWJyZXcgPSAweDA1YjI7XG4gIHQuaGF0YWZwYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViMjtcbiAgdC5oYXRhZnBhdGFocXVhcnRlcmhlYnJldyA9IDB4MDViMjtcbiAgdC5oYXRhZnBhdGFod2lkZWhlYnJldyA9IDB4MDViMjtcbiAgdC5oYXRhZnFhbWF0cyA9IDB4MDViMztcbiAgdC5oYXRhZnFhbWF0czFiID0gMHgwNWIzO1xuICB0LmhhdGFmcWFtYXRzMjggPSAweDA1YjM7XG4gIHQuaGF0YWZxYW1hdHMzNCA9IDB4MDViMztcbiAgdC5oYXRhZnFhbWF0c2hlYnJldyA9IDB4MDViMztcbiAgdC5oYXRhZnFhbWF0c25hcnJvd2hlYnJldyA9IDB4MDViMztcbiAgdC5oYXRhZnFhbWF0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1YjM7XG4gIHQuaGF0YWZxYW1hdHN3aWRlaGVicmV3ID0gMHgwNWIzO1xuICB0LmhhdGFmc2Vnb2wgPSAweDA1YjE7XG4gIHQuaGF0YWZzZWdvbDE3ID0gMHgwNWIxO1xuICB0LmhhdGFmc2Vnb2wyNCA9IDB4MDViMTtcbiAgdC5oYXRhZnNlZ29sMzAgPSAweDA1YjE7XG4gIHQuaGF0YWZzZWdvbGhlYnJldyA9IDB4MDViMTtcbiAgdC5oYXRhZnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWIxO1xuICB0LmhhdGFmc2Vnb2xxdWFydGVyaGVicmV3ID0gMHgwNWIxO1xuICB0LmhhdGFmc2Vnb2x3aWRlaGVicmV3ID0gMHgwNWIxO1xuICB0LmhiYXIgPSAweDAxMjc7XG4gIHQuaGJvcG9tb2ZvID0gMHgzMTBmO1xuICB0LmhicmV2ZWJlbG93ID0gMHgxZTJiO1xuICB0LmhjZWRpbGxhID0gMHgxZTI5O1xuICB0LmhjaXJjbGUgPSAweDI0ZDc7XG4gIHQuaGNpcmN1bWZsZXggPSAweDAxMjU7XG4gIHQuaGRpZXJlc2lzID0gMHgxZTI3O1xuICB0Lmhkb3RhY2NlbnQgPSAweDFlMjM7XG4gIHQuaGRvdGJlbG93ID0gMHgxZTI1O1xuICB0LmhlID0gMHgwNWQ0O1xuICB0LmhlYXJ0ID0gMHgyNjY1O1xuICB0LmhlYXJ0c3VpdGJsYWNrID0gMHgyNjY1O1xuICB0LmhlYXJ0c3VpdHdoaXRlID0gMHgyNjYxO1xuICB0LmhlZGFnZXNoID0gMHhmYjM0O1xuICB0LmhlZGFnZXNoaGVicmV3ID0gMHhmYjM0O1xuICB0LmhlaGFsdG9uZWFyYWJpYyA9IDB4MDZjMTtcbiAgdC5oZWhhcmFiaWMgPSAweDA2NDc7XG4gIHQuaGVoZWJyZXcgPSAweDA1ZDQ7XG4gIHQuaGVoZmluYWxhbHRvbmVhcmFiaWMgPSAweGZiYTc7XG4gIHQuaGVoZmluYWxhbHR0d29hcmFiaWMgPSAweGZlZWE7XG4gIHQuaGVoZmluYWxhcmFiaWMgPSAweGZlZWE7XG4gIHQuaGVoaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmYmE1O1xuICB0LmhlaGhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmJhNDtcbiAgdC5oZWhpbml0aWFsYWx0b25lYXJhYmljID0gMHhmYmE4O1xuICB0LmhlaGluaXRpYWxhcmFiaWMgPSAweGZlZWI7XG4gIHQuaGVoaXJhZ2FuYSA9IDB4MzA3ODtcbiAgdC5oZWhtZWRpYWxhbHRvbmVhcmFiaWMgPSAweGZiYTk7XG4gIHQuaGVobWVkaWFsYXJhYmljID0gMHhmZWVjO1xuICB0LmhlaXNlaWVyYXNxdWFyZSA9IDB4MzM3YjtcbiAgdC5oZWthdGFrYW5hID0gMHgzMGQ4O1xuICB0Lmhla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGQ7XG4gIHQuaGVrdXRhYXJ1c3F1YXJlID0gMHgzMzM2O1xuICB0Lmhlbmdob29rID0gMHgwMjY3O1xuICB0LmhlcnV0dXNxdWFyZSA9IDB4MzMzOTtcbiAgdC5oZXQgPSAweDA1ZDc7XG4gIHQuaGV0aGVicmV3ID0gMHgwNWQ3O1xuICB0Lmhob29rID0gMHgwMjY2O1xuICB0Lmhob29rc3VwZXJpb3IgPSAweDAyYjE7XG4gIHQuaGlldWhhY2lyY2xla29yZWFuID0gMHgzMjdiO1xuICB0LmhpZXVoYXBhcmVua29yZWFuID0gMHgzMjFiO1xuICB0LmhpZXVoY2lyY2xla29yZWFuID0gMHgzMjZkO1xuICB0LmhpZXVoa29yZWFuID0gMHgzMTRlO1xuICB0LmhpZXVocGFyZW5rb3JlYW4gPSAweDMyMGQ7XG4gIHQuaGloaXJhZ2FuYSA9IDB4MzA3MjtcbiAgdC5oaWthdGFrYW5hID0gMHgzMGQyO1xuICB0Lmhpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGI7XG4gIHQuaGlyaXEgPSAweDA1YjQ7XG4gIHQuaGlyaXExNCA9IDB4MDViNDtcbiAgdC5oaXJpcTIxID0gMHgwNWI0O1xuICB0LmhpcmlxMmQgPSAweDA1YjQ7XG4gIHQuaGlyaXFoZWJyZXcgPSAweDA1YjQ7XG4gIHQuaGlyaXFuYXJyb3doZWJyZXcgPSAweDA1YjQ7XG4gIHQuaGlyaXFxdWFydGVyaGVicmV3ID0gMHgwNWI0O1xuICB0Lmhpcmlxd2lkZWhlYnJldyA9IDB4MDViNDtcbiAgdC5obGluZWJlbG93ID0gMHgxZTk2O1xuICB0Lmhtb25vc3BhY2UgPSAweGZmNDg7XG4gIHQuaG9hcm1lbmlhbiA9IDB4MDU3MDtcbiAgdC5ob2hpcHRoYWkgPSAweDBlMmI7XG4gIHQuaG9oaXJhZ2FuYSA9IDB4MzA3YjtcbiAgdC5ob2thdGFrYW5hID0gMHgzMGRiO1xuICB0Lmhva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGU7XG4gIHQuaG9sYW0gPSAweDA1Yjk7XG4gIHQuaG9sYW0xOSA9IDB4MDViOTtcbiAgdC5ob2xhbTI2ID0gMHgwNWI5O1xuICB0LmhvbGFtMzIgPSAweDA1Yjk7XG4gIHQuaG9sYW1oZWJyZXcgPSAweDA1Yjk7XG4gIHQuaG9sYW1uYXJyb3doZWJyZXcgPSAweDA1Yjk7XG4gIHQuaG9sYW1xdWFydGVyaGVicmV3ID0gMHgwNWI5O1xuICB0LmhvbGFtd2lkZWhlYnJldyA9IDB4MDViOTtcbiAgdC5ob25va2h1a3RoYWkgPSAweDBlMmU7XG4gIHQuaG9va2Fib3ZlY29tYiA9IDB4MDMwOTtcbiAgdC5ob29rY21iID0gMHgwMzA5O1xuICB0Lmhvb2twYWxhdGFsaXplZGJlbG93Y21iID0gMHgwMzIxO1xuICB0Lmhvb2tyZXRyb2ZsZXhiZWxvd2NtYiA9IDB4MDMyMjtcbiAgdC5ob29uc3F1YXJlID0gMHgzMzQyO1xuICB0Lmhvcmljb3B0aWMgPSAweDAzZTk7XG4gIHQuaG9yaXpvbnRhbGJhciA9IDB4MjAxNTtcbiAgdC5ob3JuY21iID0gMHgwMzFiO1xuICB0LmhvdHNwcmluZ3MgPSAweDI2Njg7XG4gIHQuaG91c2UgPSAweDIzMDI7XG4gIHQuaHBhcmVuID0gMHgyNGEzO1xuICB0LmhzdXBlcmlvciA9IDB4MDJiMDtcbiAgdC5odHVybmVkID0gMHgwMjY1O1xuICB0Lmh1aGlyYWdhbmEgPSAweDMwNzU7XG4gIHQuaHVpaXRvc3F1YXJlID0gMHgzMzMzO1xuICB0Lmh1a2F0YWthbmEgPSAweDMwZDU7XG4gIHQuaHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YztcbiAgdC5odW5nYXJ1bWxhdXQgPSAweDAyZGQ7XG4gIHQuaHVuZ2FydW1sYXV0Y21iID0gMHgwMzBiO1xuICB0Lmh2ID0gMHgwMTk1O1xuICB0Lmh5cGhlbiA9IDB4MDAyZDtcbiAgdC5oeXBoZW5pbmZlcmlvciA9IDB4ZjZlNTtcbiAgdC5oeXBoZW5tb25vc3BhY2UgPSAweGZmMGQ7XG4gIHQuaHlwaGVuc21hbGwgPSAweGZlNjM7XG4gIHQuaHlwaGVuc3VwZXJpb3IgPSAweGY2ZTY7XG4gIHQuaHlwaGVudHdvID0gMHgyMDEwO1xuICB0LmkgPSAweDAwNjk7XG4gIHQuaWFjdXRlID0gMHgwMGVkO1xuICB0LmlhY3lyaWxsaWMgPSAweDA0NGY7XG4gIHQuaWJlbmdhbGkgPSAweDA5ODc7XG4gIHQuaWJvcG9tb2ZvID0gMHgzMTI3O1xuICB0LmlicmV2ZSA9IDB4MDEyZDtcbiAgdC5pY2Fyb24gPSAweDAxZDA7XG4gIHQuaWNpcmNsZSA9IDB4MjRkODtcbiAgdC5pY2lyY3VtZmxleCA9IDB4MDBlZTtcbiAgdC5pY3lyaWxsaWMgPSAweDA0NTY7XG4gIHQuaWRibGdyYXZlID0gMHgwMjA5O1xuICB0LmlkZW9ncmFwaGVhcnRoY2lyY2xlID0gMHgzMjhmO1xuICB0LmlkZW9ncmFwaGZpcmVjaXJjbGUgPSAweDMyOGI7XG4gIHQuaWRlb2dyYXBoaWNhbGxpYW5jZXBhcmVuID0gMHgzMjNmO1xuICB0LmlkZW9ncmFwaGljY2FsbHBhcmVuID0gMHgzMjNhO1xuICB0LmlkZW9ncmFwaGljY2VudHJlY2lyY2xlID0gMHgzMmE1O1xuICB0LmlkZW9ncmFwaGljY2xvc2UgPSAweDMwMDY7XG4gIHQuaWRlb2dyYXBoaWNjb21tYSA9IDB4MzAwMTtcbiAgdC5pZGVvZ3JhcGhpY2NvbW1hbGVmdCA9IDB4ZmY2NDtcbiAgdC5pZGVvZ3JhcGhpY2NvbmdyYXR1bGF0aW9ucGFyZW4gPSAweDMyMzc7XG4gIHQuaWRlb2dyYXBoaWNjb3JyZWN0Y2lyY2xlID0gMHgzMmEzO1xuICB0LmlkZW9ncmFwaGljZWFydGhwYXJlbiA9IDB4MzIyZjtcbiAgdC5pZGVvZ3JhcGhpY2VudGVycHJpc2VwYXJlbiA9IDB4MzIzZDtcbiAgdC5pZGVvZ3JhcGhpY2V4Y2VsbGVudGNpcmNsZSA9IDB4MzI5ZDtcbiAgdC5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW4gPSAweDMyNDA7XG4gIHQuaWRlb2dyYXBoaWNmaW5hbmNpYWxjaXJjbGUgPSAweDMyOTY7XG4gIHQuaWRlb2dyYXBoaWNmaW5hbmNpYWxwYXJlbiA9IDB4MzIzNjtcbiAgdC5pZGVvZ3JhcGhpY2ZpcmVwYXJlbiA9IDB4MzIyYjtcbiAgdC5pZGVvZ3JhcGhpY2hhdmVwYXJlbiA9IDB4MzIzMjtcbiAgdC5pZGVvZ3JhcGhpY2hpZ2hjaXJjbGUgPSAweDMyYTQ7XG4gIHQuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrID0gMHgzMDA1O1xuICB0LmlkZW9ncmFwaGljbGFib3JjaXJjbGUgPSAweDMyOTg7XG4gIHQuaWRlb2dyYXBoaWNsYWJvcnBhcmVuID0gMHgzMjM4O1xuICB0LmlkZW9ncmFwaGljbGVmdGNpcmNsZSA9IDB4MzJhNztcbiAgdC5pZGVvZ3JhcGhpY2xvd2NpcmNsZSA9IDB4MzJhNjtcbiAgdC5pZGVvZ3JhcGhpY21lZGljaW5lY2lyY2xlID0gMHgzMmE5O1xuICB0LmlkZW9ncmFwaGljbWV0YWxwYXJlbiA9IDB4MzIyZTtcbiAgdC5pZGVvZ3JhcGhpY21vb25wYXJlbiA9IDB4MzIyYTtcbiAgdC5pZGVvZ3JhcGhpY25hbWVwYXJlbiA9IDB4MzIzNDtcbiAgdC5pZGVvZ3JhcGhpY3BlcmlvZCA9IDB4MzAwMjtcbiAgdC5pZGVvZ3JhcGhpY3ByaW50Y2lyY2xlID0gMHgzMjllO1xuICB0LmlkZW9ncmFwaGljcmVhY2hwYXJlbiA9IDB4MzI0MztcbiAgdC5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuID0gMHgzMjM5O1xuICB0LmlkZW9ncmFwaGljcmVzb3VyY2VwYXJlbiA9IDB4MzIzZTtcbiAgdC5pZGVvZ3JhcGhpY3JpZ2h0Y2lyY2xlID0gMHgzMmE4O1xuICB0LmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlID0gMHgzMjk5O1xuICB0LmlkZW9ncmFwaGljc2VsZnBhcmVuID0gMHgzMjQyO1xuICB0LmlkZW9ncmFwaGljc29jaWV0eXBhcmVuID0gMHgzMjMzO1xuICB0LmlkZW9ncmFwaGljc3BhY2UgPSAweDMwMDA7XG4gIHQuaWRlb2dyYXBoaWNzcGVjaWFscGFyZW4gPSAweDMyMzU7XG4gIHQuaWRlb2dyYXBoaWNzdG9ja3BhcmVuID0gMHgzMjMxO1xuICB0LmlkZW9ncmFwaGljc3R1ZHlwYXJlbiA9IDB4MzIzYjtcbiAgdC5pZGVvZ3JhcGhpY3N1bnBhcmVuID0gMHgzMjMwO1xuICB0LmlkZW9ncmFwaGljc3VwZXJ2aXNlcGFyZW4gPSAweDMyM2M7XG4gIHQuaWRlb2dyYXBoaWN3YXRlcnBhcmVuID0gMHgzMjJjO1xuICB0LmlkZW9ncmFwaGljd29vZHBhcmVuID0gMHgzMjJkO1xuICB0LmlkZW9ncmFwaGljemVybyA9IDB4MzAwNztcbiAgdC5pZGVvZ3JhcGhtZXRhbGNpcmNsZSA9IDB4MzI4ZTtcbiAgdC5pZGVvZ3JhcGhtb29uY2lyY2xlID0gMHgzMjhhO1xuICB0LmlkZW9ncmFwaG5hbWVjaXJjbGUgPSAweDMyOTQ7XG4gIHQuaWRlb2dyYXBoc3VuY2lyY2xlID0gMHgzMjkwO1xuICB0LmlkZW9ncmFwaHdhdGVyY2lyY2xlID0gMHgzMjhjO1xuICB0LmlkZW9ncmFwaHdvb2RjaXJjbGUgPSAweDMyOGQ7XG4gIHQuaWRldmEgPSAweDA5MDc7XG4gIHQuaWRpZXJlc2lzID0gMHgwMGVmO1xuICB0LmlkaWVyZXNpc2FjdXRlID0gMHgxZTJmO1xuICB0LmlkaWVyZXNpc2N5cmlsbGljID0gMHgwNGU1O1xuICB0Lmlkb3RiZWxvdyA9IDB4MWVjYjtcbiAgdC5pZWJyZXZlY3lyaWxsaWMgPSAweDA0ZDc7XG4gIHQuaWVjeXJpbGxpYyA9IDB4MDQzNTtcbiAgdC5pZXVuZ2FjaXJjbGVrb3JlYW4gPSAweDMyNzU7XG4gIHQuaWV1bmdhcGFyZW5rb3JlYW4gPSAweDMyMTU7XG4gIHQuaWV1bmdjaXJjbGVrb3JlYW4gPSAweDMyNjc7XG4gIHQuaWV1bmdrb3JlYW4gPSAweDMxNDc7XG4gIHQuaWV1bmdwYXJlbmtvcmVhbiA9IDB4MzIwNztcbiAgdC5pZ3JhdmUgPSAweDAwZWM7XG4gIHQuaWd1amFyYXRpID0gMHgwYTg3O1xuICB0LmlndXJtdWtoaSA9IDB4MGEwNztcbiAgdC5paGlyYWdhbmEgPSAweDMwNDQ7XG4gIHQuaWhvb2thYm92ZSA9IDB4MWVjOTtcbiAgdC5paWJlbmdhbGkgPSAweDA5ODg7XG4gIHQuaWljeXJpbGxpYyA9IDB4MDQzODtcbiAgdC5paWRldmEgPSAweDA5MDg7XG4gIHQuaWlndWphcmF0aSA9IDB4MGE4ODtcbiAgdC5paWd1cm11a2hpID0gMHgwYTA4O1xuICB0LmlpbWF0cmFndXJtdWtoaSA9IDB4MGE0MDtcbiAgdC5paW52ZXJ0ZWRicmV2ZSA9IDB4MDIwYjtcbiAgdC5paXNob3J0Y3lyaWxsaWMgPSAweDA0Mzk7XG4gIHQuaWl2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMwO1xuICB0Lmlpdm93ZWxzaWduZGV2YSA9IDB4MDk0MDtcbiAgdC5paXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMwO1xuICB0LmlqID0gMHgwMTMzO1xuICB0LmlrYXRha2FuYSA9IDB4MzBhNDtcbiAgdC5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzI7XG4gIHQuaWtvcmVhbiA9IDB4MzE2MztcbiAgdC5pbGRlID0gMHgwMmRjO1xuICB0LmlsdXloZWJyZXcgPSAweDA1YWM7XG4gIHQuaW1hY3JvbiA9IDB4MDEyYjtcbiAgdC5pbWFjcm9uY3lyaWxsaWMgPSAweDA0ZTM7XG4gIHQuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbCA9IDB4MjI1MztcbiAgdC5pbWF0cmFndXJtdWtoaSA9IDB4MGEzZjtcbiAgdC5pbW9ub3NwYWNlID0gMHhmZjQ5O1xuICB0LmluY3JlbWVudCA9IDB4MjIwNjtcbiAgdC5pbmZpbml0eSA9IDB4MjIxZTtcbiAgdC5pbmlhcm1lbmlhbiA9IDB4MDU2YjtcbiAgdC5pbnRlZ3JhbCA9IDB4MjIyYjtcbiAgdC5pbnRlZ3JhbGJvdHRvbSA9IDB4MjMyMTtcbiAgdC5pbnRlZ3JhbGJ0ID0gMHgyMzIxO1xuICB0LmludGVncmFsZXggPSAweGY4ZjU7XG4gIHQuaW50ZWdyYWx0b3AgPSAweDIzMjA7XG4gIHQuaW50ZWdyYWx0cCA9IDB4MjMyMDtcbiAgdC5pbnRlcnNlY3Rpb24gPSAweDIyMjk7XG4gIHQuaW50aXNxdWFyZSA9IDB4MzMwNTtcbiAgdC5pbnZidWxsZXQgPSAweDI1ZDg7XG4gIHQuaW52Y2lyY2xlID0gMHgyNWQ5O1xuICB0LmludnNtaWxlZmFjZSA9IDB4MjYzYjtcbiAgdC5pb2N5cmlsbGljID0gMHgwNDUxO1xuICB0LmlvZ29uZWsgPSAweDAxMmY7XG4gIHQuaW90YSA9IDB4MDNiOTtcbiAgdC5pb3RhZGllcmVzaXMgPSAweDAzY2E7XG4gIHQuaW90YWRpZXJlc2lzdG9ub3MgPSAweDAzOTA7XG4gIHQuaW90YWxhdGluID0gMHgwMjY5O1xuICB0LmlvdGF0b25vcyA9IDB4MDNhZjtcbiAgdC5pcGFyZW4gPSAweDI0YTQ7XG4gIHQuaXJpZ3VybXVraGkgPSAweDBhNzI7XG4gIHQuaXNtYWxsaGlyYWdhbmEgPSAweDMwNDM7XG4gIHQuaXNtYWxsa2F0YWthbmEgPSAweDMwYTM7XG4gIHQuaXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjg7XG4gIHQuaXNzaGFyYmVuZ2FsaSA9IDB4MDlmYTtcbiAgdC5pc3Ryb2tlID0gMHgwMjY4O1xuICB0LmlzdXBlcmlvciA9IDB4ZjZlZDtcbiAgdC5pdGVyYXRpb25oaXJhZ2FuYSA9IDB4MzA5ZDtcbiAgdC5pdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZDtcbiAgdC5pdGlsZGUgPSAweDAxMjk7XG4gIHQuaXRpbGRlYmVsb3cgPSAweDFlMmQ7XG4gIHQuaXVib3BvbW9mbyA9IDB4MzEyOTtcbiAgdC5pdWN5cmlsbGljID0gMHgwNDRlO1xuICB0Lml2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWJmO1xuICB0Lml2b3dlbHNpZ25kZXZhID0gMHgwOTNmO1xuICB0Lml2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFiZjtcbiAgdC5pemhpdHNhY3lyaWxsaWMgPSAweDA0NzU7XG4gIHQuaXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0Nzc7XG4gIHQuaiA9IDB4MDA2YTtcbiAgdC5qYWFybWVuaWFuID0gMHgwNTcxO1xuICB0LmphYmVuZ2FsaSA9IDB4MDk5YztcbiAgdC5qYWRldmEgPSAweDA5MWM7XG4gIHQuamFndWphcmF0aSA9IDB4MGE5YztcbiAgdC5qYWd1cm11a2hpID0gMHgwYTFjO1xuICB0Lmpib3BvbW9mbyA9IDB4MzExMDtcbiAgdC5qY2Fyb24gPSAweDAxZjA7XG4gIHQuamNpcmNsZSA9IDB4MjRkOTtcbiAgdC5qY2lyY3VtZmxleCA9IDB4MDEzNTtcbiAgdC5qY3Jvc3NlZHRhaWwgPSAweDAyOWQ7XG4gIHQuamRvdGxlc3NzdHJva2UgPSAweDAyNWY7XG4gIHQuamVjeXJpbGxpYyA9IDB4MDQ1ODtcbiAgdC5qZWVtYXJhYmljID0gMHgwNjJjO1xuICB0LmplZW1maW5hbGFyYWJpYyA9IDB4ZmU5ZTtcbiAgdC5qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmU5ZjtcbiAgdC5qZWVtbWVkaWFsYXJhYmljID0gMHhmZWEwO1xuICB0LmplaGFyYWJpYyA9IDB4MDY5ODtcbiAgdC5qZWhmaW5hbGFyYWJpYyA9IDB4ZmI4YjtcbiAgdC5qaGFiZW5nYWxpID0gMHgwOTlkO1xuICB0LmpoYWRldmEgPSAweDA5MWQ7XG4gIHQuamhhZ3VqYXJhdGkgPSAweDBhOWQ7XG4gIHQuamhhZ3VybXVraGkgPSAweDBhMWQ7XG4gIHQuamhlaGFybWVuaWFuID0gMHgwNTdiO1xuICB0LmppcyA9IDB4MzAwNDtcbiAgdC5qbW9ub3NwYWNlID0gMHhmZjRhO1xuICB0LmpwYXJlbiA9IDB4MjRhNTtcbiAgdC5qc3VwZXJpb3IgPSAweDAyYjI7XG4gIHQuayA9IDB4MDA2YjtcbiAgdC5rYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMTtcbiAgdC5rYWJlbmdhbGkgPSAweDA5OTU7XG4gIHQua2FjdXRlID0gMHgxZTMxO1xuICB0LmthY3lyaWxsaWMgPSAweDA0M2E7XG4gIHQua2FkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5YjtcbiAgdC5rYWRldmEgPSAweDA5MTU7XG4gIHQua2FmID0gMHgwNWRiO1xuICB0LmthZmFyYWJpYyA9IDB4MDY0MztcbiAgdC5rYWZkYWdlc2ggPSAweGZiM2I7XG4gIHQua2FmZGFnZXNoaGVicmV3ID0gMHhmYjNiO1xuICB0LmthZmZpbmFsYXJhYmljID0gMHhmZWRhO1xuICB0LmthZmhlYnJldyA9IDB4MDVkYjtcbiAgdC5rYWZpbml0aWFsYXJhYmljID0gMHhmZWRiO1xuICB0LmthZm1lZGlhbGFyYWJpYyA9IDB4ZmVkYztcbiAgdC5rYWZyYWZlaGVicmV3ID0gMHhmYjRkO1xuICB0LmthZ3VqYXJhdGkgPSAweDBhOTU7XG4gIHQua2FndXJtdWtoaSA9IDB4MGExNTtcbiAgdC5rYWhpcmFnYW5hID0gMHgzMDRiO1xuICB0LmthaG9va2N5cmlsbGljID0gMHgwNGM0O1xuICB0Lmtha2F0YWthbmEgPSAweDMwYWI7XG4gIHQua2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NjtcbiAgdC5rYXBwYSA9IDB4MDNiYTtcbiAgdC5rYXBwYXN5bWJvbGdyZWVrID0gMHgwM2YwO1xuICB0LmthcHllb3VubWlldW1rb3JlYW4gPSAweDMxNzE7XG4gIHQua2FweWVvdW5waGlldXBoa29yZWFuID0gMHgzMTg0O1xuICB0LmthcHllb3VucGlldXBrb3JlYW4gPSAweDMxNzg7XG4gIHQua2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTc5O1xuICB0Lmthcm9yaWlzcXVhcmUgPSAweDMzMGQ7XG4gIHQua2FzaGlkYWF1dG9hcmFiaWMgPSAweDA2NDA7XG4gIHQua2FzaGlkYWF1dG9ub3NpZGViZWFyaW5nYXJhYmljID0gMHgwNjQwO1xuICB0Lmthc21hbGxrYXRha2FuYSA9IDB4MzBmNTtcbiAgdC5rYXNxdWFyZSA9IDB4MzM4NDtcbiAgdC5rYXNyYWFyYWJpYyA9IDB4MDY1MDtcbiAgdC5rYXNyYXRhbmFyYWJpYyA9IDB4MDY0ZDtcbiAgdC5rYXN0cm9rZWN5cmlsbGljID0gMHgwNDlmO1xuICB0LmthdGFoaXJhcHJvbG9uZ21hcmtoYWxmd2lkdGggPSAweGZmNzA7XG4gIHQua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNDlkO1xuICB0Lmtib3BvbW9mbyA9IDB4MzEwZTtcbiAgdC5rY2Fsc3F1YXJlID0gMHgzMzg5O1xuICB0LmtjYXJvbiA9IDB4MDFlOTtcbiAgdC5rY2VkaWxsYSA9IDB4MDEzNztcbiAgdC5rY2lyY2xlID0gMHgyNGRhO1xuICB0Lmtjb21tYWFjY2VudCA9IDB4MDEzNztcbiAgdC5rZG90YmVsb3cgPSAweDFlMzM7XG4gIHQua2VoYXJtZW5pYW4gPSAweDA1ODQ7XG4gIHQua2VoaXJhZ2FuYSA9IDB4MzA1MTtcbiAgdC5rZWthdGFrYW5hID0gMHgzMGIxO1xuICB0Lmtla2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzk7XG4gIHQua2VuYXJtZW5pYW4gPSAweDA1NmY7XG4gIHQua2VzbWFsbGthdGFrYW5hID0gMHgzMGY2O1xuICB0LmtncmVlbmxhbmRpYyA9IDB4MDEzODtcbiAgdC5raGFiZW5nYWxpID0gMHgwOTk2O1xuICB0LmtoYWN5cmlsbGljID0gMHgwNDQ1O1xuICB0LmtoYWRldmEgPSAweDA5MTY7XG4gIHQua2hhZ3VqYXJhdGkgPSAweDBhOTY7XG4gIHQua2hhZ3VybXVraGkgPSAweDBhMTY7XG4gIHQua2hhaGFyYWJpYyA9IDB4MDYyZTtcbiAgdC5raGFoZmluYWxhcmFiaWMgPSAweGZlYTY7XG4gIHQua2hhaGluaXRpYWxhcmFiaWMgPSAweGZlYTc7XG4gIHQua2hhaG1lZGlhbGFyYWJpYyA9IDB4ZmVhODtcbiAgdC5raGVpY29wdGljID0gMHgwM2U3O1xuICB0LmtoaGFkZXZhID0gMHgwOTU5O1xuICB0LmtoaGFndXJtdWtoaSA9IDB4MGE1OTtcbiAgdC5raGlldWtoYWNpcmNsZWtvcmVhbiA9IDB4MzI3ODtcbiAgdC5raGlldWtoYXBhcmVua29yZWFuID0gMHgzMjE4O1xuICB0LmtoaWV1a2hjaXJjbGVrb3JlYW4gPSAweDMyNmE7XG4gIHQua2hpZXVraGtvcmVhbiA9IDB4MzE0YjtcbiAgdC5raGlldWtocGFyZW5rb3JlYW4gPSAweDMyMGE7XG4gIHQua2hva2hhaXRoYWkgPSAweDBlMDI7XG4gIHQua2hva2hvbnRoYWkgPSAweDBlMDU7XG4gIHQua2hva2h1YXR0aGFpID0gMHgwZTAzO1xuICB0Lmtob2tod2FpdGhhaSA9IDB4MGUwNDtcbiAgdC5raG9tdXR0aGFpID0gMHgwZTViO1xuICB0Lmtob29rID0gMHgwMTk5O1xuICB0Lmtob3Jha2hhbmd0aGFpID0gMHgwZTA2O1xuICB0LmtoenNxdWFyZSA9IDB4MzM5MTtcbiAgdC5raWhpcmFnYW5hID0gMHgzMDRkO1xuICB0Lmtpa2F0YWthbmEgPSAweDMwYWQ7XG4gIHQua2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NztcbiAgdC5raXJvZ3VyYW11c3F1YXJlID0gMHgzMzE1O1xuICB0Lmtpcm9tZWV0b3J1c3F1YXJlID0gMHgzMzE2O1xuICB0Lmtpcm9zcXVhcmUgPSAweDMzMTQ7XG4gIHQua2l5ZW9rYWNpcmNsZWtvcmVhbiA9IDB4MzI2ZTtcbiAgdC5raXllb2thcGFyZW5rb3JlYW4gPSAweDMyMGU7XG4gIHQua2l5ZW9rY2lyY2xla29yZWFuID0gMHgzMjYwO1xuICB0LmtpeWVva2tvcmVhbiA9IDB4MzEzMTtcbiAgdC5raXllb2twYXJlbmtvcmVhbiA9IDB4MzIwMDtcbiAgdC5raXllb2tzaW9za29yZWFuID0gMHgzMTMzO1xuICB0LmtqZWN5cmlsbGljID0gMHgwNDVjO1xuICB0LmtsaW5lYmVsb3cgPSAweDFlMzU7XG4gIHQua2xzcXVhcmUgPSAweDMzOTg7XG4gIHQua21jdWJlZHNxdWFyZSA9IDB4MzNhNjtcbiAgdC5rbW9ub3NwYWNlID0gMHhmZjRiO1xuICB0Lmttc3F1YXJlZHNxdWFyZSA9IDB4MzNhMjtcbiAgdC5rb2hpcmFnYW5hID0gMHgzMDUzO1xuICB0LmtvaG1zcXVhcmUgPSAweDMzYzA7XG4gIHQua29rYWl0aGFpID0gMHgwZTAxO1xuICB0Lmtva2F0YWthbmEgPSAweDMwYjM7XG4gIHQua29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YTtcbiAgdC5rb29wb3NxdWFyZSA9IDB4MzMxZTtcbiAgdC5rb3BwYWN5cmlsbGljID0gMHgwNDgxO1xuICB0LmtvcmVhbnN0YW5kYXJkc3ltYm9sID0gMHgzMjdmO1xuICB0Lmtvcm9uaXNjbWIgPSAweDAzNDM7XG4gIHQua3BhcmVuID0gMHgyNGE2O1xuICB0LmtwYXNxdWFyZSA9IDB4MzNhYTtcbiAgdC5rc2ljeXJpbGxpYyA9IDB4MDQ2ZjtcbiAgdC5rdHNxdWFyZSA9IDB4MzNjZjtcbiAgdC5rdHVybmVkID0gMHgwMjllO1xuICB0Lmt1aGlyYWdhbmEgPSAweDMwNGY7XG4gIHQua3VrYXRha2FuYSA9IDB4MzBhZjtcbiAgdC5rdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc4O1xuICB0Lmt2c3F1YXJlID0gMHgzM2I4O1xuICB0Lmt3c3F1YXJlID0gMHgzM2JlO1xuICB0LmwgPSAweDAwNmM7XG4gIHQubGFiZW5nYWxpID0gMHgwOWIyO1xuICB0LmxhY3V0ZSA9IDB4MDEzYTtcbiAgdC5sYWRldmEgPSAweDA5MzI7XG4gIHQubGFndWphcmF0aSA9IDB4MGFiMjtcbiAgdC5sYWd1cm11a2hpID0gMHgwYTMyO1xuICB0Lmxha2toYW5neWFvdGhhaSA9IDB4MGU0NTtcbiAgdC5sYW1hbGVmZmluYWxhcmFiaWMgPSAweGZlZmM7XG4gIHQubGFtYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmVmODtcbiAgdC5sYW1hbGVmaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmZWY3O1xuICB0LmxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWMgPSAweGZlZmE7XG4gIHQubGFtYWxlZmhhbXphYmVsb3dpc29sYXRlZGFyYWJpYyA9IDB4ZmVmOTtcbiAgdC5sYW1hbGVmaXNvbGF0ZWRhcmFiaWMgPSAweGZlZmI7XG4gIHQubGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmVmNjtcbiAgdC5sYW1hbGVmbWFkZGFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmZWY1O1xuICB0LmxhbWFyYWJpYyA9IDB4MDY0NDtcbiAgdC5sYW1iZGEgPSAweDAzYmI7XG4gIHQubGFtYmRhc3Ryb2tlID0gMHgwMTliO1xuICB0LmxhbWVkID0gMHgwNWRjO1xuICB0LmxhbWVkZGFnZXNoID0gMHhmYjNjO1xuICB0LmxhbWVkZGFnZXNoaGVicmV3ID0gMHhmYjNjO1xuICB0LmxhbWVkaGVicmV3ID0gMHgwNWRjO1xuICB0LmxhbWZpbmFsYXJhYmljID0gMHhmZWRlO1xuICB0LmxhbWhhaGluaXRpYWxhcmFiaWMgPSAweGZjY2E7XG4gIHQubGFtaW5pdGlhbGFyYWJpYyA9IDB4ZmVkZjtcbiAgdC5sYW1qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNjOTtcbiAgdC5sYW1raGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNjYjtcbiAgdC5sYW1sYW1oZWhpc29sYXRlZGFyYWJpYyA9IDB4ZmRmMjtcbiAgdC5sYW1tZWRpYWxhcmFiaWMgPSAweGZlZTA7XG4gIHQubGFtbWVlbWhhaGluaXRpYWxhcmFiaWMgPSAweGZkODg7XG4gIHQubGFtbWVlbWluaXRpYWxhcmFiaWMgPSAweGZjY2M7XG4gIHQubGFyZ2VjaXJjbGUgPSAweDI1ZWY7XG4gIHQubGJhciA9IDB4MDE5YTtcbiAgdC5sYmVsdCA9IDB4MDI2YztcbiAgdC5sYm9wb21vZm8gPSAweDMxMGM7XG4gIHQubGNhcm9uID0gMHgwMTNlO1xuICB0LmxjZWRpbGxhID0gMHgwMTNjO1xuICB0LmxjaXJjbGUgPSAweDI0ZGI7XG4gIHQubGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzZDtcbiAgdC5sY29tbWFhY2NlbnQgPSAweDAxM2M7XG4gIHQubGRvdCA9IDB4MDE0MDtcbiAgdC5sZG90YWNjZW50ID0gMHgwMTQwO1xuICB0Lmxkb3RiZWxvdyA9IDB4MWUzNztcbiAgdC5sZG90YmVsb3dtYWNyb24gPSAweDFlMzk7XG4gIHQubGVmdGFuZ2xlYWJvdmVjbWIgPSAweDAzMWE7XG4gIHQubGVmdHRhY2tiZWxvd2NtYiA9IDB4MDMxODtcbiAgdC5sZXNzID0gMHgwMDNjO1xuICB0Lmxlc3NlcXVhbCA9IDB4MjI2NDtcbiAgdC5sZXNzZXF1YWxvcmdyZWF0ZXIgPSAweDIyZGE7XG4gIHQubGVzc21vbm9zcGFjZSA9IDB4ZmYxYztcbiAgdC5sZXNzb3JlcXVpdmFsZW50ID0gMHgyMjcyO1xuICB0Lmxlc3NvcmdyZWF0ZXIgPSAweDIyNzY7XG4gIHQubGVzc292ZXJlcXVhbCA9IDB4MjI2NjtcbiAgdC5sZXNzc21hbGwgPSAweGZlNjQ7XG4gIHQubGV6aCA9IDB4MDI2ZTtcbiAgdC5sZmJsb2NrID0gMHgyNThjO1xuICB0Lmxob29rcmV0cm9mbGV4ID0gMHgwMjZkO1xuICB0LmxpcmEgPSAweDIwYTQ7XG4gIHQubGl3bmFybWVuaWFuID0gMHgwNTZjO1xuICB0LmxqID0gMHgwMWM5O1xuICB0LmxqZWN5cmlsbGljID0gMHgwNDU5O1xuICB0LmxsID0gMHhmNmMwO1xuICB0LmxsYWRldmEgPSAweDA5MzM7XG4gIHQubGxhZ3VqYXJhdGkgPSAweDBhYjM7XG4gIHQubGxpbmViZWxvdyA9IDB4MWUzYjtcbiAgdC5sbGxhZGV2YSA9IDB4MDkzNDtcbiAgdC5sbHZvY2FsaWNiZW5nYWxpID0gMHgwOWUxO1xuICB0Lmxsdm9jYWxpY2RldmEgPSAweDA5NjE7XG4gIHQubGx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDllMztcbiAgdC5sbHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYzO1xuICB0LmxtaWRkbGV0aWxkZSA9IDB4MDI2YjtcbiAgdC5sbW9ub3NwYWNlID0gMHhmZjRjO1xuICB0Lmxtc3F1YXJlID0gMHgzM2QwO1xuICB0LmxvY2h1bGF0aGFpID0gMHgwZTJjO1xuICB0LmxvZ2ljYWxhbmQgPSAweDIyMjc7XG4gIHQubG9naWNhbG5vdCA9IDB4MDBhYztcbiAgdC5sb2dpY2Fsbm90cmV2ZXJzZWQgPSAweDIzMTA7XG4gIHQubG9naWNhbG9yID0gMHgyMjI4O1xuICB0LmxvbGluZ3RoYWkgPSAweDBlMjU7XG4gIHQubG9uZ3MgPSAweDAxN2Y7XG4gIHQubG93bGluZWNlbnRlcmxpbmUgPSAweGZlNGU7XG4gIHQubG93bGluZWNtYiA9IDB4MDMzMjtcbiAgdC5sb3dsaW5lZGFzaGVkID0gMHhmZTRkO1xuICB0LmxvemVuZ2UgPSAweDI1Y2E7XG4gIHQubHBhcmVuID0gMHgyNGE3O1xuICB0LmxzbGFzaCA9IDB4MDE0MjtcbiAgdC5sc3F1YXJlID0gMHgyMTEzO1xuICB0LmxzdXBlcmlvciA9IDB4ZjZlZTtcbiAgdC5sdHNoYWRlID0gMHgyNTkxO1xuICB0Lmx1dGhhaSA9IDB4MGUyNjtcbiAgdC5sdm9jYWxpY2JlbmdhbGkgPSAweDA5OGM7XG4gIHQubHZvY2FsaWNkZXZhID0gMHgwOTBjO1xuICB0Lmx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDllMjtcbiAgdC5sdm9jYWxpY3Zvd2Vsc2lnbmRldmEgPSAweDA5NjI7XG4gIHQubHhzcXVhcmUgPSAweDMzZDM7XG4gIHQubSA9IDB4MDA2ZDtcbiAgdC5tYWJlbmdhbGkgPSAweDA5YWU7XG4gIHQubWFjcm9uID0gMHgwMGFmO1xuICB0Lm1hY3JvbmJlbG93Y21iID0gMHgwMzMxO1xuICB0Lm1hY3JvbmNtYiA9IDB4MDMwNDtcbiAgdC5tYWNyb25sb3dtb2QgPSAweDAyY2Q7XG4gIHQubWFjcm9ubW9ub3NwYWNlID0gMHhmZmUzO1xuICB0Lm1hY3V0ZSA9IDB4MWUzZjtcbiAgdC5tYWRldmEgPSAweDA5MmU7XG4gIHQubWFndWphcmF0aSA9IDB4MGFhZTtcbiAgdC5tYWd1cm11a2hpID0gMHgwYTJlO1xuICB0Lm1haGFwYWtoaGVicmV3ID0gMHgwNWE0O1xuICB0Lm1haGFwYWtobGVmdGhlYnJldyA9IDB4MDVhNDtcbiAgdC5tYWhpcmFnYW5hID0gMHgzMDdlO1xuICB0Lm1haWNoYXR0YXdhbG93bGVmdHRoYWkgPSAweGY4OTU7XG4gIHQubWFpY2hhdHRhd2Fsb3dyaWdodHRoYWkgPSAweGY4OTQ7XG4gIHQubWFpY2hhdHRhd2F0aGFpID0gMHgwZTRiO1xuICB0Lm1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MztcbiAgdC5tYWlla2xvd2xlZnR0aGFpID0gMHhmODhjO1xuICB0Lm1haWVrbG93cmlnaHR0aGFpID0gMHhmODhiO1xuICB0Lm1haWVrdGhhaSA9IDB4MGU0ODtcbiAgdC5tYWlla3VwcGVybGVmdHRoYWkgPSAweGY4OGE7XG4gIHQubWFpaGFuYWthdGxlZnR0aGFpID0gMHhmODg0O1xuICB0Lm1haWhhbmFrYXR0aGFpID0gMHgwZTMxO1xuICB0Lm1haXRhaWtodWxlZnR0aGFpID0gMHhmODg5O1xuICB0Lm1haXRhaWtodXRoYWkgPSAweDBlNDc7XG4gIHQubWFpdGhvbG93bGVmdHRoYWkgPSAweGY4OGY7XG4gIHQubWFpdGhvbG93cmlnaHR0aGFpID0gMHhmODhlO1xuICB0Lm1haXRob3RoYWkgPSAweDBlNDk7XG4gIHQubWFpdGhvdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4ZDtcbiAgdC5tYWl0cmlsb3dsZWZ0dGhhaSA9IDB4Zjg5MjtcbiAgdC5tYWl0cmlsb3dyaWdodHRoYWkgPSAweGY4OTE7XG4gIHQubWFpdHJpdGhhaSA9IDB4MGU0YTtcbiAgdC5tYWl0cml1cHBlcmxlZnR0aGFpID0gMHhmODkwO1xuICB0Lm1haXlhbW9rdGhhaSA9IDB4MGU0NjtcbiAgdC5tYWthdGFrYW5hID0gMHgzMGRlO1xuICB0Lm1ha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGY7XG4gIHQubWFsZSA9IDB4MjY0MjtcbiAgdC5tYW5zeW9uc3F1YXJlID0gMHgzMzQ3O1xuICB0Lm1hcWFmaGVicmV3ID0gMHgwNWJlO1xuICB0Lm1hcnMgPSAweDI2NDI7XG4gIHQubWFzb3JhY2lyY2xlaGVicmV3ID0gMHgwNWFmO1xuICB0Lm1hc3F1YXJlID0gMHgzMzgzO1xuICB0Lm1ib3BvbW9mbyA9IDB4MzEwNztcbiAgdC5tYnNxdWFyZSA9IDB4MzNkNDtcbiAgdC5tY2lyY2xlID0gMHgyNGRjO1xuICB0Lm1jdWJlZHNxdWFyZSA9IDB4MzNhNTtcbiAgdC5tZG90YWNjZW50ID0gMHgxZTQxO1xuICB0Lm1kb3RiZWxvdyA9IDB4MWU0MztcbiAgdC5tZWVtYXJhYmljID0gMHgwNjQ1O1xuICB0Lm1lZW1maW5hbGFyYWJpYyA9IDB4ZmVlMjtcbiAgdC5tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmVlMztcbiAgdC5tZWVtbWVkaWFsYXJhYmljID0gMHhmZWU0O1xuICB0Lm1lZW1tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMTtcbiAgdC5tZWVtbWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzQ4O1xuICB0Lm1lZXRvcnVzcXVhcmUgPSAweDMzNGQ7XG4gIHQubWVoaXJhZ2FuYSA9IDB4MzA4MTtcbiAgdC5tZWl6aWVyYXNxdWFyZSA9IDB4MzM3ZTtcbiAgdC5tZWthdGFrYW5hID0gMHgzMGUxO1xuICB0Lm1la2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTI7XG4gIHQubWVtID0gMHgwNWRlO1xuICB0Lm1lbWRhZ2VzaCA9IDB4ZmIzZTtcbiAgdC5tZW1kYWdlc2hoZWJyZXcgPSAweGZiM2U7XG4gIHQubWVtaGVicmV3ID0gMHgwNWRlO1xuICB0Lm1lbmFybWVuaWFuID0gMHgwNTc0O1xuICB0Lm1lcmtoYWhlYnJldyA9IDB4MDVhNTtcbiAgdC5tZXJraGFrZWZ1bGFoZWJyZXcgPSAweDA1YTY7XG4gIHQubWVya2hha2VmdWxhbGVmdGhlYnJldyA9IDB4MDVhNjtcbiAgdC5tZXJraGFsZWZ0aGVicmV3ID0gMHgwNWE1O1xuICB0Lm1ob29rID0gMHgwMjcxO1xuICB0Lm1oenNxdWFyZSA9IDB4MzM5MjtcbiAgdC5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NTtcbiAgdC5taWRkb3QgPSAweDAwYjc7XG4gIHQubWlldW1hY2lyY2xla29yZWFuID0gMHgzMjcyO1xuICB0Lm1pZXVtYXBhcmVua29yZWFuID0gMHgzMjEyO1xuICB0Lm1pZXVtY2lyY2xla29yZWFuID0gMHgzMjY0O1xuICB0Lm1pZXVta29yZWFuID0gMHgzMTQxO1xuICB0Lm1pZXVtcGFuc2lvc2tvcmVhbiA9IDB4MzE3MDtcbiAgdC5taWV1bXBhcmVua29yZWFuID0gMHgzMjA0O1xuICB0Lm1pZXVtcGlldXBrb3JlYW4gPSAweDMxNmU7XG4gIHQubWlldW1zaW9za29yZWFuID0gMHgzMTZmO1xuICB0Lm1paGlyYWdhbmEgPSAweDMwN2Y7XG4gIHQubWlrYXRha2FuYSA9IDB4MzBkZjtcbiAgdC5taWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkwO1xuICB0Lm1pbnVzID0gMHgyMjEyO1xuICB0Lm1pbnVzYmVsb3djbWIgPSAweDAzMjA7XG4gIHQubWludXNjaXJjbGUgPSAweDIyOTY7XG4gIHQubWludXNtb2QgPSAweDAyZDc7XG4gIHQubWludXNwbHVzID0gMHgyMjEzO1xuICB0Lm1pbnV0ZSA9IDB4MjAzMjtcbiAgdC5taXJpYmFhcnVzcXVhcmUgPSAweDMzNGE7XG4gIHQubWlyaXNxdWFyZSA9IDB4MzM0OTtcbiAgdC5tbG9uZ2xlZ3R1cm5lZCA9IDB4MDI3MDtcbiAgdC5tbHNxdWFyZSA9IDB4MzM5NjtcbiAgdC5tbWN1YmVkc3F1YXJlID0gMHgzM2EzO1xuICB0Lm1tb25vc3BhY2UgPSAweGZmNGQ7XG4gIHQubW1zcXVhcmVkc3F1YXJlID0gMHgzMzlmO1xuICB0Lm1vaGlyYWdhbmEgPSAweDMwODI7XG4gIHQubW9obXNxdWFyZSA9IDB4MzNjMTtcbiAgdC5tb2thdGFrYW5hID0gMHgzMGUyO1xuICB0Lm1va2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTM7XG4gIHQubW9sc3F1YXJlID0gMHgzM2Q2O1xuICB0Lm1vbWF0aGFpID0gMHgwZTIxO1xuICB0Lm1vdmVyc3NxdWFyZSA9IDB4MzNhNztcbiAgdC5tb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2E4O1xuICB0Lm1wYXJlbiA9IDB4MjRhODtcbiAgdC5tcGFzcXVhcmUgPSAweDMzYWI7XG4gIHQubXNzcXVhcmUgPSAweDMzYjM7XG4gIHQubXN1cGVyaW9yID0gMHhmNmVmO1xuICB0Lm10dXJuZWQgPSAweDAyNmY7XG4gIHQubXUgPSAweDAwYjU7XG4gIHQubXUxID0gMHgwMGI1O1xuICB0Lm11YXNxdWFyZSA9IDB4MzM4MjtcbiAgdC5tdWNoZ3JlYXRlciA9IDB4MjI2YjtcbiAgdC5tdWNobGVzcyA9IDB4MjI2YTtcbiAgdC5tdWZzcXVhcmUgPSAweDMzOGM7XG4gIHQubXVncmVlayA9IDB4MDNiYztcbiAgdC5tdWdzcXVhcmUgPSAweDMzOGQ7XG4gIHQubXVoaXJhZ2FuYSA9IDB4MzA4MDtcbiAgdC5tdWthdGFrYW5hID0gMHgzMGUwO1xuICB0Lm11a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTE7XG4gIHQubXVsc3F1YXJlID0gMHgzMzk1O1xuICB0Lm11bHRpcGx5ID0gMHgwMGQ3O1xuICB0Lm11bXNxdWFyZSA9IDB4MzM5YjtcbiAgdC5tdW5haGhlYnJldyA9IDB4MDVhMztcbiAgdC5tdW5haGxlZnRoZWJyZXcgPSAweDA1YTM7XG4gIHQubXVzaWNhbG5vdGUgPSAweDI2NmE7XG4gIHQubXVzaWNhbG5vdGVkYmwgPSAweDI2NmI7XG4gIHQubXVzaWNmbGF0c2lnbiA9IDB4MjY2ZDtcbiAgdC5tdXNpY3NoYXJwc2lnbiA9IDB4MjY2ZjtcbiAgdC5tdXNzcXVhcmUgPSAweDMzYjI7XG4gIHQubXV2c3F1YXJlID0gMHgzM2I2O1xuICB0Lm11d3NxdWFyZSA9IDB4MzNiYztcbiAgdC5tdm1lZ2FzcXVhcmUgPSAweDMzYjk7XG4gIHQubXZzcXVhcmUgPSAweDMzYjc7XG4gIHQubXdtZWdhc3F1YXJlID0gMHgzM2JmO1xuICB0Lm13c3F1YXJlID0gMHgzM2JkO1xuICB0Lm4gPSAweDAwNmU7XG4gIHQubmFiZW5nYWxpID0gMHgwOWE4O1xuICB0Lm5hYmxhID0gMHgyMjA3O1xuICB0Lm5hY3V0ZSA9IDB4MDE0NDtcbiAgdC5uYWRldmEgPSAweDA5Mjg7XG4gIHQubmFndWphcmF0aSA9IDB4MGFhODtcbiAgdC5uYWd1cm11a2hpID0gMHgwYTI4O1xuICB0Lm5haGlyYWdhbmEgPSAweDMwNmE7XG4gIHQubmFrYXRha2FuYSA9IDB4MzBjYTtcbiAgdC5uYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg1O1xuICB0Lm5hcG9zdHJvcGhlID0gMHgwMTQ5O1xuICB0Lm5hc3F1YXJlID0gMHgzMzgxO1xuICB0Lm5ib3BvbW9mbyA9IDB4MzEwYjtcbiAgdC5uYnNwYWNlID0gMHgwMGEwO1xuICB0Lm5jYXJvbiA9IDB4MDE0ODtcbiAgdC5uY2VkaWxsYSA9IDB4MDE0NjtcbiAgdC5uY2lyY2xlID0gMHgyNGRkO1xuICB0Lm5jaXJjdW1mbGV4YmVsb3cgPSAweDFlNGI7XG4gIHQubmNvbW1hYWNjZW50ID0gMHgwMTQ2O1xuICB0Lm5kb3RhY2NlbnQgPSAweDFlNDU7XG4gIHQubmRvdGJlbG93ID0gMHgxZTQ3O1xuICB0Lm5laGlyYWdhbmEgPSAweDMwNmQ7XG4gIHQubmVrYXRha2FuYSA9IDB4MzBjZDtcbiAgdC5uZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg4O1xuICB0Lm5ld3NoZXFlbHNpZ24gPSAweDIwYWE7XG4gIHQubmZzcXVhcmUgPSAweDMzOGI7XG4gIHQubmdhYmVuZ2FsaSA9IDB4MDk5OTtcbiAgdC5uZ2FkZXZhID0gMHgwOTE5O1xuICB0Lm5nYWd1amFyYXRpID0gMHgwYTk5O1xuICB0Lm5nYWd1cm11a2hpID0gMHgwYTE5O1xuICB0Lm5nb25ndXRoYWkgPSAweDBlMDc7XG4gIHQubmhpcmFnYW5hID0gMHgzMDkzO1xuICB0Lm5ob29rbGVmdCA9IDB4MDI3MjtcbiAgdC5uaG9va3JldHJvZmxleCA9IDB4MDI3MztcbiAgdC5uaWV1bmFjaXJjbGVrb3JlYW4gPSAweDMyNmY7XG4gIHQubmlldW5hcGFyZW5rb3JlYW4gPSAweDMyMGY7XG4gIHQubmlldW5jaWV1Y2tvcmVhbiA9IDB4MzEzNTtcbiAgdC5uaWV1bmNpcmNsZWtvcmVhbiA9IDB4MzI2MTtcbiAgdC5uaWV1bmhpZXVoa29yZWFuID0gMHgzMTM2O1xuICB0Lm5pZXVua29yZWFuID0gMHgzMTM0O1xuICB0Lm5pZXVucGFuc2lvc2tvcmVhbiA9IDB4MzE2ODtcbiAgdC5uaWV1bnBhcmVua29yZWFuID0gMHgzMjAxO1xuICB0Lm5pZXVuc2lvc2tvcmVhbiA9IDB4MzE2NztcbiAgdC5uaWV1bnRpa2V1dGtvcmVhbiA9IDB4MzE2NjtcbiAgdC5uaWhpcmFnYW5hID0gMHgzMDZiO1xuICB0Lm5pa2F0YWthbmEgPSAweDMwY2I7XG4gIHQubmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NjtcbiAgdC5uaWtoYWhpdGxlZnR0aGFpID0gMHhmODk5O1xuICB0Lm5pa2hhaGl0dGhhaSA9IDB4MGU0ZDtcbiAgdC5uaW5lID0gMHgwMDM5O1xuICB0Lm5pbmVhcmFiaWMgPSAweDA2Njk7XG4gIHQubmluZWJlbmdhbGkgPSAweDA5ZWY7XG4gIHQubmluZWNpcmNsZSA9IDB4MjQ2ODtcbiAgdC5uaW5lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MjtcbiAgdC5uaW5lZGV2YSA9IDB4MDk2ZjtcbiAgdC5uaW5lZ3VqYXJhdGkgPSAweDBhZWY7XG4gIHQubmluZWd1cm11a2hpID0gMHgwYTZmO1xuICB0Lm5pbmVoYWNrYXJhYmljID0gMHgwNjY5O1xuICB0Lm5pbmVoYW5nemhvdSA9IDB4MzAyOTtcbiAgdC5uaW5laWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyODtcbiAgdC5uaW5laW5mZXJpb3IgPSAweDIwODk7XG4gIHQubmluZW1vbm9zcGFjZSA9IDB4ZmYxOTtcbiAgdC5uaW5lb2xkc3R5bGUgPSAweGY3Mzk7XG4gIHQubmluZXBhcmVuID0gMHgyNDdjO1xuICB0Lm5pbmVwZXJpb2QgPSAweDI0OTA7XG4gIHQubmluZXBlcnNpYW4gPSAweDA2Zjk7XG4gIHQubmluZXJvbWFuID0gMHgyMTc4O1xuICB0Lm5pbmVzdXBlcmlvciA9IDB4MjA3OTtcbiAgdC5uaW5ldGVlbmNpcmNsZSA9IDB4MjQ3MjtcbiAgdC5uaW5ldGVlbnBhcmVuID0gMHgyNDg2O1xuICB0Lm5pbmV0ZWVucGVyaW9kID0gMHgyNDlhO1xuICB0Lm5pbmV0aGFpID0gMHgwZTU5O1xuICB0Lm5qID0gMHgwMWNjO1xuICB0Lm5qZWN5cmlsbGljID0gMHgwNDVhO1xuICB0Lm5rYXRha2FuYSA9IDB4MzBmMztcbiAgdC5ua2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWQ7XG4gIHQubmxlZ3JpZ2h0bG9uZyA9IDB4MDE5ZTtcbiAgdC5ubGluZWJlbG93ID0gMHgxZTQ5O1xuICB0Lm5tb25vc3BhY2UgPSAweGZmNGU7XG4gIHQubm1zcXVhcmUgPSAweDMzOWE7XG4gIHQubm5hYmVuZ2FsaSA9IDB4MDlhMztcbiAgdC5ubmFkZXZhID0gMHgwOTIzO1xuICB0Lm5uYWd1amFyYXRpID0gMHgwYWEzO1xuICB0Lm5uYWd1cm11a2hpID0gMHgwYTIzO1xuICB0Lm5ubmFkZXZhID0gMHgwOTI5O1xuICB0Lm5vaGlyYWdhbmEgPSAweDMwNmU7XG4gIHQubm9rYXRha2FuYSA9IDB4MzBjZTtcbiAgdC5ub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjg5O1xuICB0Lm5vbmJyZWFraW5nc3BhY2UgPSAweDAwYTA7XG4gIHQubm9uZW50aGFpID0gMHgwZTEzO1xuICB0Lm5vbnV0aGFpID0gMHgwZTE5O1xuICB0Lm5vb25hcmFiaWMgPSAweDA2NDY7XG4gIHQubm9vbmZpbmFsYXJhYmljID0gMHhmZWU2O1xuICB0Lm5vb25naHVubmFhcmFiaWMgPSAweDA2YmE7XG4gIHQubm9vbmdodW5uYWZpbmFsYXJhYmljID0gMHhmYjlmO1xuICB0Lm5vb25pbml0aWFsYXJhYmljID0gMHhmZWU3O1xuICB0Lm5vb25qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMjtcbiAgdC5ub29uamVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzRiO1xuICB0Lm5vb25tZWRpYWxhcmFiaWMgPSAweGZlZTg7XG4gIHQubm9vbm1lZW1pbml0aWFsYXJhYmljID0gMHhmY2Q1O1xuICB0Lm5vb25tZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNGU7XG4gIHQubm9vbm5vb25maW5hbGFyYWJpYyA9IDB4ZmM4ZDtcbiAgdC5ub3Rjb250YWlucyA9IDB4MjIwYztcbiAgdC5ub3RlbGVtZW50ID0gMHgyMjA5O1xuICB0Lm5vdGVsZW1lbnRvZiA9IDB4MjIwOTtcbiAgdC5ub3RlcXVhbCA9IDB4MjI2MDtcbiAgdC5ub3RncmVhdGVyID0gMHgyMjZmO1xuICB0Lm5vdGdyZWF0ZXJub3JlcXVhbCA9IDB4MjI3MTtcbiAgdC5ub3RncmVhdGVybm9ybGVzcyA9IDB4MjI3OTtcbiAgdC5ub3RpZGVudGljYWwgPSAweDIyNjI7XG4gIHQubm90bGVzcyA9IDB4MjI2ZTtcbiAgdC5ub3RsZXNzbm9yZXF1YWwgPSAweDIyNzA7XG4gIHQubm90cGFyYWxsZWwgPSAweDIyMjY7XG4gIHQubm90cHJlY2VkZXMgPSAweDIyODA7XG4gIHQubm90c3Vic2V0ID0gMHgyMjg0O1xuICB0Lm5vdHN1Y2NlZWRzID0gMHgyMjgxO1xuICB0Lm5vdHN1cGVyc2V0ID0gMHgyMjg1O1xuICB0Lm5vd2FybWVuaWFuID0gMHgwNTc2O1xuICB0Lm5wYXJlbiA9IDB4MjRhOTtcbiAgdC5uc3NxdWFyZSA9IDB4MzNiMTtcbiAgdC5uc3VwZXJpb3IgPSAweDIwN2Y7XG4gIHQubnRpbGRlID0gMHgwMGYxO1xuICB0Lm51ID0gMHgwM2JkO1xuICB0Lm51aGlyYWdhbmEgPSAweDMwNmM7XG4gIHQubnVrYXRha2FuYSA9IDB4MzBjYztcbiAgdC5udWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg3O1xuICB0Lm51a3RhYmVuZ2FsaSA9IDB4MDliYztcbiAgdC5udWt0YWRldmEgPSAweDA5M2M7XG4gIHQubnVrdGFndWphcmF0aSA9IDB4MGFiYztcbiAgdC5udWt0YWd1cm11a2hpID0gMHgwYTNjO1xuICB0Lm51bWJlcnNpZ24gPSAweDAwMjM7XG4gIHQubnVtYmVyc2lnbm1vbm9zcGFjZSA9IDB4ZmYwMztcbiAgdC5udW1iZXJzaWduc21hbGwgPSAweGZlNWY7XG4gIHQubnVtZXJhbHNpZ25ncmVlayA9IDB4MDM3NDtcbiAgdC5udW1lcmFsc2lnbmxvd2VyZ3JlZWsgPSAweDAzNzU7XG4gIHQubnVtZXJvID0gMHgyMTE2O1xuICB0Lm51biA9IDB4MDVlMDtcbiAgdC5udW5kYWdlc2ggPSAweGZiNDA7XG4gIHQubnVuZGFnZXNoaGVicmV3ID0gMHhmYjQwO1xuICB0Lm51bmhlYnJldyA9IDB4MDVlMDtcbiAgdC5udnNxdWFyZSA9IDB4MzNiNTtcbiAgdC5ud3NxdWFyZSA9IDB4MzNiYjtcbiAgdC5ueWFiZW5nYWxpID0gMHgwOTllO1xuICB0Lm55YWRldmEgPSAweDA5MWU7XG4gIHQubnlhZ3VqYXJhdGkgPSAweDBhOWU7XG4gIHQubnlhZ3VybXVraGkgPSAweDBhMWU7XG4gIHQubyA9IDB4MDA2ZjtcbiAgdC5vYWN1dGUgPSAweDAwZjM7XG4gIHQub2FuZ3RoYWkgPSAweDBlMmQ7XG4gIHQub2JhcnJlZCA9IDB4MDI3NTtcbiAgdC5vYmFycmVkY3lyaWxsaWMgPSAweDA0ZTk7XG4gIHQub2JhcnJlZGRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZWI7XG4gIHQub2JlbmdhbGkgPSAweDA5OTM7XG4gIHQub2JvcG9tb2ZvID0gMHgzMTFiO1xuICB0Lm9icmV2ZSA9IDB4MDE0ZjtcbiAgdC5vY2FuZHJhZGV2YSA9IDB4MDkxMTtcbiAgdC5vY2FuZHJhZ3VqYXJhdGkgPSAweDBhOTE7XG4gIHQub2NhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDk7XG4gIHQub2NhbmRyYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM5O1xuICB0Lm9jYXJvbiA9IDB4MDFkMjtcbiAgdC5vY2lyY2xlID0gMHgyNGRlO1xuICB0Lm9jaXJjdW1mbGV4ID0gMHgwMGY0O1xuICB0Lm9jaXJjdW1mbGV4YWN1dGUgPSAweDFlZDE7XG4gIHQub2NpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVkOTtcbiAgdC5vY2lyY3VtZmxleGdyYXZlID0gMHgxZWQzO1xuICB0Lm9jaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWQ1O1xuICB0Lm9jaXJjdW1mbGV4dGlsZGUgPSAweDFlZDc7XG4gIHQub2N5cmlsbGljID0gMHgwNDNlO1xuICB0Lm9kYmxhY3V0ZSA9IDB4MDE1MTtcbiAgdC5vZGJsZ3JhdmUgPSAweDAyMGQ7XG4gIHQub2RldmEgPSAweDA5MTM7XG4gIHQub2RpZXJlc2lzID0gMHgwMGY2O1xuICB0Lm9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU3O1xuICB0Lm9kb3RiZWxvdyA9IDB4MWVjZDtcbiAgdC5vZSA9IDB4MDE1MztcbiAgdC5vZWtvcmVhbiA9IDB4MzE1YTtcbiAgdC5vZ29uZWsgPSAweDAyZGI7XG4gIHQub2dvbmVrY21iID0gMHgwMzI4O1xuICB0Lm9ncmF2ZSA9IDB4MDBmMjtcbiAgdC5vZ3VqYXJhdGkgPSAweDBhOTM7XG4gIHQub2hhcm1lbmlhbiA9IDB4MDU4NTtcbiAgdC5vaGlyYWdhbmEgPSAweDMwNGE7XG4gIHQub2hvb2thYm92ZSA9IDB4MWVjZjtcbiAgdC5vaG9ybiA9IDB4MDFhMTtcbiAgdC5vaG9ybmFjdXRlID0gMHgxZWRiO1xuICB0Lm9ob3JuZG90YmVsb3cgPSAweDFlZTM7XG4gIHQub2hvcm5ncmF2ZSA9IDB4MWVkZDtcbiAgdC5vaG9ybmhvb2thYm92ZSA9IDB4MWVkZjtcbiAgdC5vaG9ybnRpbGRlID0gMHgxZWUxO1xuICB0Lm9odW5nYXJ1bWxhdXQgPSAweDAxNTE7XG4gIHQub2kgPSAweDAxYTM7XG4gIHQub2ludmVydGVkYnJldmUgPSAweDAyMGY7XG4gIHQub2thdGFrYW5hID0gMHgzMGFhO1xuICB0Lm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NTtcbiAgdC5va29yZWFuID0gMHgzMTU3O1xuICB0Lm9sZWhlYnJldyA9IDB4MDVhYjtcbiAgdC5vbWFjcm9uID0gMHgwMTRkO1xuICB0Lm9tYWNyb25hY3V0ZSA9IDB4MWU1MztcbiAgdC5vbWFjcm9uZ3JhdmUgPSAweDFlNTE7XG4gIHQub21kZXZhID0gMHgwOTUwO1xuICB0Lm9tZWdhID0gMHgwM2M5O1xuICB0Lm9tZWdhMSA9IDB4MDNkNjtcbiAgdC5vbWVnYWN5cmlsbGljID0gMHgwNDYxO1xuICB0Lm9tZWdhbGF0aW5jbG9zZWQgPSAweDAyNzc7XG4gIHQub21lZ2Fyb3VuZGN5cmlsbGljID0gMHgwNDdiO1xuICB0Lm9tZWdhdGl0bG9jeXJpbGxpYyA9IDB4MDQ3ZDtcbiAgdC5vbWVnYXRvbm9zID0gMHgwM2NlO1xuICB0Lm9tZ3VqYXJhdGkgPSAweDBhZDA7XG4gIHQub21pY3JvbiA9IDB4MDNiZjtcbiAgdC5vbWljcm9udG9ub3MgPSAweDAzY2M7XG4gIHQub21vbm9zcGFjZSA9IDB4ZmY0ZjtcbiAgdC5vbmUgPSAweDAwMzE7XG4gIHQub25lYXJhYmljID0gMHgwNjYxO1xuICB0Lm9uZWJlbmdhbGkgPSAweDA5ZTc7XG4gIHQub25lY2lyY2xlID0gMHgyNDYwO1xuICB0Lm9uZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGE7XG4gIHQub25lZGV2YSA9IDB4MDk2NztcbiAgdC5vbmVkb3RlbmxlYWRlciA9IDB4MjAyNDtcbiAgdC5vbmVlaWdodGggPSAweDIxNWI7XG4gIHQub25lZml0dGVkID0gMHhmNmRjO1xuICB0Lm9uZWd1amFyYXRpID0gMHgwYWU3O1xuICB0Lm9uZWd1cm11a2hpID0gMHgwYTY3O1xuICB0Lm9uZWhhY2thcmFiaWMgPSAweDA2NjE7XG4gIHQub25laGFsZiA9IDB4MDBiZDtcbiAgdC5vbmVoYW5nemhvdSA9IDB4MzAyMTtcbiAgdC5vbmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIwO1xuICB0Lm9uZWluZmVyaW9yID0gMHgyMDgxO1xuICB0Lm9uZW1vbm9zcGFjZSA9IDB4ZmYxMTtcbiAgdC5vbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY0O1xuICB0Lm9uZW9sZHN0eWxlID0gMHhmNzMxO1xuICB0Lm9uZXBhcmVuID0gMHgyNDc0O1xuICB0Lm9uZXBlcmlvZCA9IDB4MjQ4ODtcbiAgdC5vbmVwZXJzaWFuID0gMHgwNmYxO1xuICB0Lm9uZXF1YXJ0ZXIgPSAweDAwYmM7XG4gIHQub25lcm9tYW4gPSAweDIxNzA7XG4gIHQub25lc3VwZXJpb3IgPSAweDAwYjk7XG4gIHQub25ldGhhaSA9IDB4MGU1MTtcbiAgdC5vbmV0aGlyZCA9IDB4MjE1MztcbiAgdC5vb2dvbmVrID0gMHgwMWViO1xuICB0Lm9vZ29uZWttYWNyb24gPSAweDAxZWQ7XG4gIHQub29ndXJtdWtoaSA9IDB4MGExMztcbiAgdC5vb21hdHJhZ3VybXVraGkgPSAweDBhNGI7XG4gIHQub29wZW4gPSAweDAyNTQ7XG4gIHQub3BhcmVuID0gMHgyNGFhO1xuICB0Lm9wZW5idWxsZXQgPSAweDI1ZTY7XG4gIHQub3B0aW9uID0gMHgyMzI1O1xuICB0Lm9yZGZlbWluaW5lID0gMHgwMGFhO1xuICB0Lm9yZG1hc2N1bGluZSA9IDB4MDBiYTtcbiAgdC5vcnRob2dvbmFsID0gMHgyMjFmO1xuICB0Lm9zaG9ydGRldmEgPSAweDA5MTI7XG4gIHQub3Nob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0YTtcbiAgdC5vc2xhc2ggPSAweDAwZjg7XG4gIHQub3NsYXNoYWN1dGUgPSAweDAxZmY7XG4gIHQub3NtYWxsaGlyYWdhbmEgPSAweDMwNDk7XG4gIHQub3NtYWxsa2F0YWthbmEgPSAweDMwYTk7XG4gIHQub3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmI7XG4gIHQub3N0cm9rZWFjdXRlID0gMHgwMWZmO1xuICB0Lm9zdXBlcmlvciA9IDB4ZjZmMDtcbiAgdC5vdGN5cmlsbGljID0gMHgwNDdmO1xuICB0Lm90aWxkZSA9IDB4MDBmNTtcbiAgdC5vdGlsZGVhY3V0ZSA9IDB4MWU0ZDtcbiAgdC5vdGlsZGVkaWVyZXNpcyA9IDB4MWU0ZjtcbiAgdC5vdWJvcG9tb2ZvID0gMHgzMTIxO1xuICB0Lm92ZXJsaW5lID0gMHgyMDNlO1xuICB0Lm92ZXJsaW5lY2VudGVybGluZSA9IDB4ZmU0YTtcbiAgdC5vdmVybGluZWNtYiA9IDB4MDMwNTtcbiAgdC5vdmVybGluZWRhc2hlZCA9IDB4ZmU0OTtcbiAgdC5vdmVybGluZWRibHdhdnkgPSAweGZlNGM7XG4gIHQub3ZlcmxpbmV3YXZ5ID0gMHhmZTRiO1xuICB0Lm92ZXJzY29yZSA9IDB4MDBhZjtcbiAgdC5vdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljYjtcbiAgdC5vdm93ZWxzaWduZGV2YSA9IDB4MDk0YjtcbiAgdC5vdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhY2I7XG4gIHQucCA9IDB4MDA3MDtcbiAgdC5wYWFtcHNzcXVhcmUgPSAweDMzODA7XG4gIHQucGFhc2VudG9zcXVhcmUgPSAweDMzMmI7XG4gIHQucGFiZW5nYWxpID0gMHgwOWFhO1xuICB0LnBhY3V0ZSA9IDB4MWU1NTtcbiAgdC5wYWRldmEgPSAweDA5MmE7XG4gIHQucGFnZWRvd24gPSAweDIxZGY7XG4gIHQucGFnZXVwID0gMHgyMWRlO1xuICB0LnBhZ3VqYXJhdGkgPSAweDBhYWE7XG4gIHQucGFndXJtdWtoaSA9IDB4MGEyYTtcbiAgdC5wYWhpcmFnYW5hID0gMHgzMDcxO1xuICB0LnBhaXlhbm5vaXRoYWkgPSAweDBlMmY7XG4gIHQucGFrYXRha2FuYSA9IDB4MzBkMTtcbiAgdC5wYWxhdGFsaXphdGlvbmN5cmlsbGljY21iID0gMHgwNDg0O1xuICB0LnBhbG9jaGthY3lyaWxsaWMgPSAweDA0YzA7XG4gIHQucGFuc2lvc2tvcmVhbiA9IDB4MzE3ZjtcbiAgdC5wYXJhZ3JhcGggPSAweDAwYjY7XG4gIHQucGFyYWxsZWwgPSAweDIyMjU7XG4gIHQucGFyZW5sZWZ0ID0gMHgwMDI4O1xuICB0LnBhcmVubGVmdGFsdG9uZWFyYWJpYyA9IDB4ZmQzZTtcbiAgdC5wYXJlbmxlZnRidCA9IDB4ZjhlZDtcbiAgdC5wYXJlbmxlZnRleCA9IDB4ZjhlYztcbiAgdC5wYXJlbmxlZnRpbmZlcmlvciA9IDB4MjA4ZDtcbiAgdC5wYXJlbmxlZnRtb25vc3BhY2UgPSAweGZmMDg7XG4gIHQucGFyZW5sZWZ0c21hbGwgPSAweGZlNTk7XG4gIHQucGFyZW5sZWZ0c3VwZXJpb3IgPSAweDIwN2Q7XG4gIHQucGFyZW5sZWZ0dHAgPSAweGY4ZWI7XG4gIHQucGFyZW5sZWZ0dmVydGljYWwgPSAweGZlMzU7XG4gIHQucGFyZW5yaWdodCA9IDB4MDAyOTtcbiAgdC5wYXJlbnJpZ2h0YWx0b25lYXJhYmljID0gMHhmZDNmO1xuICB0LnBhcmVucmlnaHRidCA9IDB4ZjhmODtcbiAgdC5wYXJlbnJpZ2h0ZXggPSAweGY4Zjc7XG4gIHQucGFyZW5yaWdodGluZmVyaW9yID0gMHgyMDhlO1xuICB0LnBhcmVucmlnaHRtb25vc3BhY2UgPSAweGZmMDk7XG4gIHQucGFyZW5yaWdodHNtYWxsID0gMHhmZTVhO1xuICB0LnBhcmVucmlnaHRzdXBlcmlvciA9IDB4MjA3ZTtcbiAgdC5wYXJlbnJpZ2h0dHAgPSAweGY4ZjY7XG4gIHQucGFyZW5yaWdodHZlcnRpY2FsID0gMHhmZTM2O1xuICB0LnBhcnRpYWxkaWZmID0gMHgyMjAyO1xuICB0LnBhc2VxaGVicmV3ID0gMHgwNWMwO1xuICB0LnBhc2h0YWhlYnJldyA9IDB4MDU5OTtcbiAgdC5wYXNxdWFyZSA9IDB4MzNhOTtcbiAgdC5wYXRhaCA9IDB4MDViNztcbiAgdC5wYXRhaDExID0gMHgwNWI3O1xuICB0LnBhdGFoMWQgPSAweDA1Yjc7XG4gIHQucGF0YWgyYSA9IDB4MDViNztcbiAgdC5wYXRhaGhlYnJldyA9IDB4MDViNztcbiAgdC5wYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViNztcbiAgdC5wYXRhaHF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjc7XG4gIHQucGF0YWh3aWRlaGVicmV3ID0gMHgwNWI3O1xuICB0LnBhemVyaGVicmV3ID0gMHgwNWExO1xuICB0LnBib3BvbW9mbyA9IDB4MzEwNjtcbiAgdC5wY2lyY2xlID0gMHgyNGRmO1xuICB0LnBkb3RhY2NlbnQgPSAweDFlNTc7XG4gIHQucGUgPSAweDA1ZTQ7XG4gIHQucGVjeXJpbGxpYyA9IDB4MDQzZjtcbiAgdC5wZWRhZ2VzaCA9IDB4ZmI0NDtcbiAgdC5wZWRhZ2VzaGhlYnJldyA9IDB4ZmI0NDtcbiAgdC5wZWV6aXNxdWFyZSA9IDB4MzMzYjtcbiAgdC5wZWZpbmFsZGFnZXNoaGVicmV3ID0gMHhmYjQzO1xuICB0LnBlaGFyYWJpYyA9IDB4MDY3ZTtcbiAgdC5wZWhhcm1lbmlhbiA9IDB4MDU3YTtcbiAgdC5wZWhlYnJldyA9IDB4MDVlNDtcbiAgdC5wZWhmaW5hbGFyYWJpYyA9IDB4ZmI1NztcbiAgdC5wZWhpbml0aWFsYXJhYmljID0gMHhmYjU4O1xuICB0LnBlaGlyYWdhbmEgPSAweDMwN2E7XG4gIHQucGVobWVkaWFsYXJhYmljID0gMHhmYjU5O1xuICB0LnBla2F0YWthbmEgPSAweDMwZGE7XG4gIHQucGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0YTc7XG4gIHQucGVyYWZlaGVicmV3ID0gMHhmYjRlO1xuICB0LnBlcmNlbnQgPSAweDAwMjU7XG4gIHQucGVyY2VudGFyYWJpYyA9IDB4MDY2YTtcbiAgdC5wZXJjZW50bW9ub3NwYWNlID0gMHhmZjA1O1xuICB0LnBlcmNlbnRzbWFsbCA9IDB4ZmU2YTtcbiAgdC5wZXJpb2QgPSAweDAwMmU7XG4gIHQucGVyaW9kYXJtZW5pYW4gPSAweDA1ODk7XG4gIHQucGVyaW9kY2VudGVyZWQgPSAweDAwYjc7XG4gIHQucGVyaW9kaGFsZndpZHRoID0gMHhmZjYxO1xuICB0LnBlcmlvZGluZmVyaW9yID0gMHhmNmU3O1xuICB0LnBlcmlvZG1vbm9zcGFjZSA9IDB4ZmYwZTtcbiAgdC5wZXJpb2RzbWFsbCA9IDB4ZmU1MjtcbiAgdC5wZXJpb2RzdXBlcmlvciA9IDB4ZjZlODtcbiAgdC5wZXJpc3BvbWVuaWdyZWVrY21iID0gMHgwMzQyO1xuICB0LnBlcnBlbmRpY3VsYXIgPSAweDIyYTU7XG4gIHQucGVydGhvdXNhbmQgPSAweDIwMzA7XG4gIHQucGVzZXRhID0gMHgyMGE3O1xuICB0LnBmc3F1YXJlID0gMHgzMzhhO1xuICB0LnBoYWJlbmdhbGkgPSAweDA5YWI7XG4gIHQucGhhZGV2YSA9IDB4MDkyYjtcbiAgdC5waGFndWphcmF0aSA9IDB4MGFhYjtcbiAgdC5waGFndXJtdWtoaSA9IDB4MGEyYjtcbiAgdC5waGkgPSAweDAzYzY7XG4gIHQucGhpMSA9IDB4MDNkNTtcbiAgdC5waGlldXBoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YTtcbiAgdC5waGlldXBoYXBhcmVua29yZWFuID0gMHgzMjFhO1xuICB0LnBoaWV1cGhjaXJjbGVrb3JlYW4gPSAweDMyNmM7XG4gIHQucGhpZXVwaGtvcmVhbiA9IDB4MzE0ZDtcbiAgdC5waGlldXBocGFyZW5rb3JlYW4gPSAweDMyMGM7XG4gIHQucGhpbGF0aW4gPSAweDAyNzg7XG4gIHQucGhpbnRodXRoYWkgPSAweDBlM2E7XG4gIHQucGhpc3ltYm9sZ3JlZWsgPSAweDAzZDU7XG4gIHQucGhvb2sgPSAweDAxYTU7XG4gIHQucGhvcGhhbnRoYWkgPSAweDBlMWU7XG4gIHQucGhvcGh1bmd0aGFpID0gMHgwZTFjO1xuICB0LnBob3NhbXBoYW90aGFpID0gMHgwZTIwO1xuICB0LnBpID0gMHgwM2MwO1xuICB0LnBpZXVwYWNpcmNsZWtvcmVhbiA9IDB4MzI3MztcbiAgdC5waWV1cGFwYXJlbmtvcmVhbiA9IDB4MzIxMztcbiAgdC5waWV1cGNpZXVja29yZWFuID0gMHgzMTc2O1xuICB0LnBpZXVwY2lyY2xla29yZWFuID0gMHgzMjY1O1xuICB0LnBpZXVwa2l5ZW9ra29yZWFuID0gMHgzMTcyO1xuICB0LnBpZXVwa29yZWFuID0gMHgzMTQyO1xuICB0LnBpZXVwcGFyZW5rb3JlYW4gPSAweDMyMDU7XG4gIHQucGlldXBzaW9za2l5ZW9ra29yZWFuID0gMHgzMTc0O1xuICB0LnBpZXVwc2lvc2tvcmVhbiA9IDB4MzE0NDtcbiAgdC5waWV1cHNpb3N0aWtldXRrb3JlYW4gPSAweDMxNzU7XG4gIHQucGlldXB0aGlldXRoa29yZWFuID0gMHgzMTc3O1xuICB0LnBpZXVwdGlrZXV0a29yZWFuID0gMHgzMTczO1xuICB0LnBpaGlyYWdhbmEgPSAweDMwNzQ7XG4gIHQucGlrYXRha2FuYSA9IDB4MzBkNDtcbiAgdC5waXN5bWJvbGdyZWVrID0gMHgwM2Q2O1xuICB0LnBpd3Jhcm1lbmlhbiA9IDB4MDU4MztcbiAgdC5wbHVzID0gMHgwMDJiO1xuICB0LnBsdXNiZWxvd2NtYiA9IDB4MDMxZjtcbiAgdC5wbHVzY2lyY2xlID0gMHgyMjk1O1xuICB0LnBsdXNtaW51cyA9IDB4MDBiMTtcbiAgdC5wbHVzbW9kID0gMHgwMmQ2O1xuICB0LnBsdXNtb25vc3BhY2UgPSAweGZmMGI7XG4gIHQucGx1c3NtYWxsID0gMHhmZTYyO1xuICB0LnBsdXNzdXBlcmlvciA9IDB4MjA3YTtcbiAgdC5wbW9ub3NwYWNlID0gMHhmZjUwO1xuICB0LnBtc3F1YXJlID0gMHgzM2Q4O1xuICB0LnBvaGlyYWdhbmEgPSAweDMwN2Q7XG4gIHQucG9pbnRpbmdpbmRleGRvd253aGl0ZSA9IDB4MjYxZjtcbiAgdC5wb2ludGluZ2luZGV4bGVmdHdoaXRlID0gMHgyNjFjO1xuICB0LnBvaW50aW5naW5kZXhyaWdodHdoaXRlID0gMHgyNjFlO1xuICB0LnBvaW50aW5naW5kZXh1cHdoaXRlID0gMHgyNjFkO1xuICB0LnBva2F0YWthbmEgPSAweDMwZGQ7XG4gIHQucG9wbGF0aGFpID0gMHgwZTFiO1xuICB0LnBvc3RhbG1hcmsgPSAweDMwMTI7XG4gIHQucG9zdGFsbWFya2ZhY2UgPSAweDMwMjA7XG4gIHQucHBhcmVuID0gMHgyNGFiO1xuICB0LnByZWNlZGVzID0gMHgyMjdhO1xuICB0LnByZXNjcmlwdGlvbiA9IDB4MjExZTtcbiAgdC5wcmltZW1vZCA9IDB4MDJiOTtcbiAgdC5wcmltZXJldmVyc2VkID0gMHgyMDM1O1xuICB0LnByb2R1Y3QgPSAweDIyMGY7XG4gIHQucHJvamVjdGl2ZSA9IDB4MjMwNTtcbiAgdC5wcm9sb25nZWRrYW5hID0gMHgzMGZjO1xuICB0LnByb3BlbGxvciA9IDB4MjMxODtcbiAgdC5wcm9wZXJzdWJzZXQgPSAweDIyODI7XG4gIHQucHJvcGVyc3VwZXJzZXQgPSAweDIyODM7XG4gIHQucHJvcG9ydGlvbiA9IDB4MjIzNztcbiAgdC5wcm9wb3J0aW9uYWwgPSAweDIyMWQ7XG4gIHQucHNpID0gMHgwM2M4O1xuICB0LnBzaWN5cmlsbGljID0gMHgwNDcxO1xuICB0LnBzaWxpcG5ldW1hdGFjeXJpbGxpY2NtYiA9IDB4MDQ4NjtcbiAgdC5wc3NxdWFyZSA9IDB4MzNiMDtcbiAgdC5wdWhpcmFnYW5hID0gMHgzMDc3O1xuICB0LnB1a2F0YWthbmEgPSAweDMwZDc7XG4gIHQucHZzcXVhcmUgPSAweDMzYjQ7XG4gIHQucHdzcXVhcmUgPSAweDMzYmE7XG4gIHQucSA9IDB4MDA3MTtcbiAgdC5xYWRldmEgPSAweDA5NTg7XG4gIHQucWFkbWFoZWJyZXcgPSAweDA1YTg7XG4gIHQucWFmYXJhYmljID0gMHgwNjQyO1xuICB0LnFhZmZpbmFsYXJhYmljID0gMHhmZWQ2O1xuICB0LnFhZmluaXRpYWxhcmFiaWMgPSAweGZlZDc7XG4gIHQucWFmbWVkaWFsYXJhYmljID0gMHhmZWQ4O1xuICB0LnFhbWF0cyA9IDB4MDViODtcbiAgdC5xYW1hdHMxMCA9IDB4MDViODtcbiAgdC5xYW1hdHMxYSA9IDB4MDViODtcbiAgdC5xYW1hdHMxYyA9IDB4MDViODtcbiAgdC5xYW1hdHMyNyA9IDB4MDViODtcbiAgdC5xYW1hdHMyOSA9IDB4MDViODtcbiAgdC5xYW1hdHMzMyA9IDB4MDViODtcbiAgdC5xYW1hdHNkZSA9IDB4MDViODtcbiAgdC5xYW1hdHNoZWJyZXcgPSAweDA1Yjg7XG4gIHQucWFtYXRzbmFycm93aGVicmV3ID0gMHgwNWI4O1xuICB0LnFhbWF0c3FhdGFuaGVicmV3ID0gMHgwNWI4O1xuICB0LnFhbWF0c3FhdGFubmFycm93aGVicmV3ID0gMHgwNWI4O1xuICB0LnFhbWF0c3FhdGFucXVhcnRlcmhlYnJldyA9IDB4MDViODtcbiAgdC5xYW1hdHNxYXRhbndpZGVoZWJyZXcgPSAweDA1Yjg7XG4gIHQucWFtYXRzcXVhcnRlcmhlYnJldyA9IDB4MDViODtcbiAgdC5xYW1hdHN3aWRlaGVicmV3ID0gMHgwNWI4O1xuICB0LnFhcm5leXBhcmFoZWJyZXcgPSAweDA1OWY7XG4gIHQucWJvcG9tb2ZvID0gMHgzMTExO1xuICB0LnFjaXJjbGUgPSAweDI0ZTA7XG4gIHQucWhvb2sgPSAweDAyYTA7XG4gIHQucW1vbm9zcGFjZSA9IDB4ZmY1MTtcbiAgdC5xb2YgPSAweDA1ZTc7XG4gIHQucW9mZGFnZXNoID0gMHhmYjQ3O1xuICB0LnFvZmRhZ2VzaGhlYnJldyA9IDB4ZmI0NztcbiAgdC5xb2ZoZWJyZXcgPSAweDA1ZTc7XG4gIHQucXBhcmVuID0gMHgyNGFjO1xuICB0LnF1YXJ0ZXJub3RlID0gMHgyNjY5O1xuICB0LnF1YnV0cyA9IDB4MDViYjtcbiAgdC5xdWJ1dHMxOCA9IDB4MDViYjtcbiAgdC5xdWJ1dHMyNSA9IDB4MDViYjtcbiAgdC5xdWJ1dHMzMSA9IDB4MDViYjtcbiAgdC5xdWJ1dHNoZWJyZXcgPSAweDA1YmI7XG4gIHQucXVidXRzbmFycm93aGVicmV3ID0gMHgwNWJiO1xuICB0LnF1YnV0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1YmI7XG4gIHQucXVidXRzd2lkZWhlYnJldyA9IDB4MDViYjtcbiAgdC5xdWVzdGlvbiA9IDB4MDAzZjtcbiAgdC5xdWVzdGlvbmFyYWJpYyA9IDB4MDYxZjtcbiAgdC5xdWVzdGlvbmFybWVuaWFuID0gMHgwNTVlO1xuICB0LnF1ZXN0aW9uZG93biA9IDB4MDBiZjtcbiAgdC5xdWVzdGlvbmRvd25zbWFsbCA9IDB4ZjdiZjtcbiAgdC5xdWVzdGlvbmdyZWVrID0gMHgwMzdlO1xuICB0LnF1ZXN0aW9ubW9ub3NwYWNlID0gMHhmZjFmO1xuICB0LnF1ZXN0aW9uc21hbGwgPSAweGY3M2Y7XG4gIHQucXVvdGVkYmwgPSAweDAwMjI7XG4gIHQucXVvdGVkYmxiYXNlID0gMHgyMDFlO1xuICB0LnF1b3RlZGJsbGVmdCA9IDB4MjAxYztcbiAgdC5xdW90ZWRibG1vbm9zcGFjZSA9IDB4ZmYwMjtcbiAgdC5xdW90ZWRibHByaW1lID0gMHgzMDFlO1xuICB0LnF1b3RlZGJscHJpbWVyZXZlcnNlZCA9IDB4MzAxZDtcbiAgdC5xdW90ZWRibHJpZ2h0ID0gMHgyMDFkO1xuICB0LnF1b3RlbGVmdCA9IDB4MjAxODtcbiAgdC5xdW90ZWxlZnRyZXZlcnNlZCA9IDB4MjAxYjtcbiAgdC5xdW90ZXJldmVyc2VkID0gMHgyMDFiO1xuICB0LnF1b3RlcmlnaHQgPSAweDIwMTk7XG4gIHQucXVvdGVyaWdodG4gPSAweDAxNDk7XG4gIHQucXVvdGVzaW5nbGJhc2UgPSAweDIwMWE7XG4gIHQucXVvdGVzaW5nbGUgPSAweDAwMjc7XG4gIHQucXVvdGVzaW5nbGVtb25vc3BhY2UgPSAweGZmMDc7XG4gIHQuciA9IDB4MDA3MjtcbiAgdC5yYWFybWVuaWFuID0gMHgwNTdjO1xuICB0LnJhYmVuZ2FsaSA9IDB4MDliMDtcbiAgdC5yYWN1dGUgPSAweDAxNTU7XG4gIHQucmFkZXZhID0gMHgwOTMwO1xuICB0LnJhZGljYWwgPSAweDIyMWE7XG4gIHQucmFkaWNhbGV4ID0gMHhmOGU1O1xuICB0LnJhZG92ZXJzc3F1YXJlID0gMHgzM2FlO1xuICB0LnJhZG92ZXJzc3F1YXJlZHNxdWFyZSA9IDB4MzNhZjtcbiAgdC5yYWRzcXVhcmUgPSAweDMzYWQ7XG4gIHQucmFmZSA9IDB4MDViZjtcbiAgdC5yYWZlaGVicmV3ID0gMHgwNWJmO1xuICB0LnJhZ3VqYXJhdGkgPSAweDBhYjA7XG4gIHQucmFndXJtdWtoaSA9IDB4MGEzMDtcbiAgdC5yYWhpcmFnYW5hID0gMHgzMDg5O1xuICB0LnJha2F0YWthbmEgPSAweDMwZTk7XG4gIHQucmFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NztcbiAgdC5yYWxvd2VyZGlhZ29uYWxiZW5nYWxpID0gMHgwOWYxO1xuICB0LnJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpID0gMHgwOWYwO1xuICB0LnJhbXNob3JuID0gMHgwMjY0O1xuICB0LnJhdGlvID0gMHgyMjM2O1xuICB0LnJib3BvbW9mbyA9IDB4MzExNjtcbiAgdC5yY2Fyb24gPSAweDAxNTk7XG4gIHQucmNlZGlsbGEgPSAweDAxNTc7XG4gIHQucmNpcmNsZSA9IDB4MjRlMTtcbiAgdC5yY29tbWFhY2NlbnQgPSAweDAxNTc7XG4gIHQucmRibGdyYXZlID0gMHgwMjExO1xuICB0LnJkb3RhY2NlbnQgPSAweDFlNTk7XG4gIHQucmRvdGJlbG93ID0gMHgxZTViO1xuICB0LnJkb3RiZWxvd21hY3JvbiA9IDB4MWU1ZDtcbiAgdC5yZWZlcmVuY2VtYXJrID0gMHgyMDNiO1xuICB0LnJlZmxleHN1YnNldCA9IDB4MjI4NjtcbiAgdC5yZWZsZXhzdXBlcnNldCA9IDB4MjI4NztcbiAgdC5yZWdpc3RlcmVkID0gMHgwMGFlO1xuICB0LnJlZ2lzdGVyc2FucyA9IDB4ZjhlODtcbiAgdC5yZWdpc3RlcnNlcmlmID0gMHhmNmRhO1xuICB0LnJlaGFyYWJpYyA9IDB4MDYzMTtcbiAgdC5yZWhhcm1lbmlhbiA9IDB4MDU4MDtcbiAgdC5yZWhmaW5hbGFyYWJpYyA9IDB4ZmVhZTtcbiAgdC5yZWhpcmFnYW5hID0gMHgzMDhjO1xuICB0LnJla2F0YWthbmEgPSAweDMwZWM7XG4gIHQucmVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YTtcbiAgdC5yZXNoID0gMHgwNWU4O1xuICB0LnJlc2hkYWdlc2hoZWJyZXcgPSAweGZiNDg7XG4gIHQucmVzaGhlYnJldyA9IDB4MDVlODtcbiAgdC5yZXZlcnNlZHRpbGRlID0gMHgyMjNkO1xuICB0LnJldmlhaGVicmV3ID0gMHgwNTk3O1xuICB0LnJldmlhbXVncmFzaGhlYnJldyA9IDB4MDU5NztcbiAgdC5yZXZsb2dpY2Fsbm90ID0gMHgyMzEwO1xuICB0LnJmaXNoaG9vayA9IDB4MDI3ZTtcbiAgdC5yZmlzaGhvb2tyZXZlcnNlZCA9IDB4MDI3ZjtcbiAgdC5yaGFiZW5nYWxpID0gMHgwOWRkO1xuICB0LnJoYWRldmEgPSAweDA5NWQ7XG4gIHQucmhvID0gMHgwM2MxO1xuICB0LnJob29rID0gMHgwMjdkO1xuICB0LnJob29rdHVybmVkID0gMHgwMjdiO1xuICB0LnJob29rdHVybmVkc3VwZXJpb3IgPSAweDAyYjU7XG4gIHQucmhvc3ltYm9sZ3JlZWsgPSAweDAzZjE7XG4gIHQucmhvdGljaG9va21vZCA9IDB4MDJkZTtcbiAgdC5yaWV1bGFjaXJjbGVrb3JlYW4gPSAweDMyNzE7XG4gIHQucmlldWxhcGFyZW5rb3JlYW4gPSAweDMyMTE7XG4gIHQucmlldWxjaXJjbGVrb3JlYW4gPSAweDMyNjM7XG4gIHQucmlldWxoaWV1aGtvcmVhbiA9IDB4MzE0MDtcbiAgdC5yaWV1bGtpeWVva2tvcmVhbiA9IDB4MzEzYTtcbiAgdC5yaWV1bGtpeWVva3Npb3Nrb3JlYW4gPSAweDMxNjk7XG4gIHQucmlldWxrb3JlYW4gPSAweDMxMzk7XG4gIHQucmlldWxtaWV1bWtvcmVhbiA9IDB4MzEzYjtcbiAgdC5yaWV1bHBhbnNpb3Nrb3JlYW4gPSAweDMxNmM7XG4gIHQucmlldWxwYXJlbmtvcmVhbiA9IDB4MzIwMztcbiAgdC5yaWV1bHBoaWV1cGhrb3JlYW4gPSAweDMxM2Y7XG4gIHQucmlldWxwaWV1cGtvcmVhbiA9IDB4MzEzYztcbiAgdC5yaWV1bHBpZXVwc2lvc2tvcmVhbiA9IDB4MzE2YjtcbiAgdC5yaWV1bHNpb3Nrb3JlYW4gPSAweDMxM2Q7XG4gIHQucmlldWx0aGlldXRoa29yZWFuID0gMHgzMTNlO1xuICB0LnJpZXVsdGlrZXV0a29yZWFuID0gMHgzMTZhO1xuICB0LnJpZXVseWVvcmluaGlldWhrb3JlYW4gPSAweDMxNmQ7XG4gIHQucmlnaHRhbmdsZSA9IDB4MjIxZjtcbiAgdC5yaWdodHRhY2tiZWxvd2NtYiA9IDB4MDMxOTtcbiAgdC5yaWdodHRyaWFuZ2xlID0gMHgyMmJmO1xuICB0LnJpaGlyYWdhbmEgPSAweDMwOGE7XG4gIHQucmlrYXRha2FuYSA9IDB4MzBlYTtcbiAgdC5yaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk4O1xuICB0LnJpbmcgPSAweDAyZGE7XG4gIHQucmluZ2JlbG93Y21iID0gMHgwMzI1O1xuICB0LnJpbmdjbWIgPSAweDAzMGE7XG4gIHQucmluZ2hhbGZsZWZ0ID0gMHgwMmJmO1xuICB0LnJpbmdoYWxmbGVmdGFybWVuaWFuID0gMHgwNTU5O1xuICB0LnJpbmdoYWxmbGVmdGJlbG93Y21iID0gMHgwMzFjO1xuICB0LnJpbmdoYWxmbGVmdGNlbnRlcmVkID0gMHgwMmQzO1xuICB0LnJpbmdoYWxmcmlnaHQgPSAweDAyYmU7XG4gIHQucmluZ2hhbGZyaWdodGJlbG93Y21iID0gMHgwMzM5O1xuICB0LnJpbmdoYWxmcmlnaHRjZW50ZXJlZCA9IDB4MDJkMjtcbiAgdC5yaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMztcbiAgdC5yaXR0b3J1c3F1YXJlID0gMHgzMzUxO1xuICB0LnJsaW5lYmVsb3cgPSAweDFlNWY7XG4gIHQucmxvbmdsZWcgPSAweDAyN2M7XG4gIHQucmxvbmdsZWd0dXJuZWQgPSAweDAyN2E7XG4gIHQucm1vbm9zcGFjZSA9IDB4ZmY1MjtcbiAgdC5yb2hpcmFnYW5hID0gMHgzMDhkO1xuICB0LnJva2F0YWthbmEgPSAweDMwZWQ7XG4gIHQucm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YjtcbiAgdC5yb3J1YXRoYWkgPSAweDBlMjM7XG4gIHQucnBhcmVuID0gMHgyNGFkO1xuICB0LnJyYWJlbmdhbGkgPSAweDA5ZGM7XG4gIHQucnJhZGV2YSA9IDB4MDkzMTtcbiAgdC5ycmFndXJtdWtoaSA9IDB4MGE1YztcbiAgdC5ycmVoYXJhYmljID0gMHgwNjkxO1xuICB0LnJyZWhmaW5hbGFyYWJpYyA9IDB4ZmI4ZDtcbiAgdC5ycnZvY2FsaWNiZW5nYWxpID0gMHgwOWUwO1xuICB0LnJydm9jYWxpY2RldmEgPSAweDA5NjA7XG4gIHQucnJ2b2NhbGljZ3VqYXJhdGkgPSAweDBhZTA7XG4gIHQucnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljNDtcbiAgdC5ycnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQ0O1xuICB0LnJydm9jYWxpY3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM0O1xuICB0LnJzdXBlcmlvciA9IDB4ZjZmMTtcbiAgdC5ydGJsb2NrID0gMHgyNTkwO1xuICB0LnJ0dXJuZWQgPSAweDAyNzk7XG4gIHQucnR1cm5lZHN1cGVyaW9yID0gMHgwMmI0O1xuICB0LnJ1aGlyYWdhbmEgPSAweDMwOGI7XG4gIHQucnVrYXRha2FuYSA9IDB4MzBlYjtcbiAgdC5ydWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk5O1xuICB0LnJ1cGVlbWFya2JlbmdhbGkgPSAweDA5ZjI7XG4gIHQucnVwZWVzaWduYmVuZ2FsaSA9IDB4MDlmMztcbiAgdC5ydXBpYWggPSAweGY2ZGQ7XG4gIHQucnV0aGFpID0gMHgwZTI0O1xuICB0LnJ2b2NhbGljYmVuZ2FsaSA9IDB4MDk4YjtcbiAgdC5ydm9jYWxpY2RldmEgPSAweDA5MGI7XG4gIHQucnZvY2FsaWNndWphcmF0aSA9IDB4MGE4YjtcbiAgdC5ydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzM7XG4gIHQucnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQzO1xuICB0LnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzM7XG4gIHQucyA9IDB4MDA3MztcbiAgdC5zYWJlbmdhbGkgPSAweDA5Yjg7XG4gIHQuc2FjdXRlID0gMHgwMTViO1xuICB0LnNhY3V0ZWRvdGFjY2VudCA9IDB4MWU2NTtcbiAgdC5zYWRhcmFiaWMgPSAweDA2MzU7XG4gIHQuc2FkZXZhID0gMHgwOTM4O1xuICB0LnNhZGZpbmFsYXJhYmljID0gMHhmZWJhO1xuICB0LnNhZGluaXRpYWxhcmFiaWMgPSAweGZlYmI7XG4gIHQuc2FkbWVkaWFsYXJhYmljID0gMHhmZWJjO1xuICB0LnNhZ3VqYXJhdGkgPSAweDBhYjg7XG4gIHQuc2FndXJtdWtoaSA9IDB4MGEzODtcbiAgdC5zYWhpcmFnYW5hID0gMHgzMDU1O1xuICB0LnNha2F0YWthbmEgPSAweDMwYjU7XG4gIHQuc2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YjtcbiAgdC5zYWxsYWxsYWhvdWFsYXloZXdhc2FsbGFtYXJhYmljID0gMHhmZGZhO1xuICB0LnNhbWVraCA9IDB4MDVlMTtcbiAgdC5zYW1la2hkYWdlc2ggPSAweGZiNDE7XG4gIHQuc2FtZWtoZGFnZXNoaGVicmV3ID0gMHhmYjQxO1xuICB0LnNhbWVraGhlYnJldyA9IDB4MDVlMTtcbiAgdC5zYXJhYWF0aGFpID0gMHgwZTMyO1xuICB0LnNhcmFhZXRoYWkgPSAweDBlNDE7XG4gIHQuc2FyYWFpbWFpbWFsYWl0aGFpID0gMHgwZTQ0O1xuICB0LnNhcmFhaW1haW11YW50aGFpID0gMHgwZTQzO1xuICB0LnNhcmFhbXRoYWkgPSAweDBlMzM7XG4gIHQuc2FyYWF0aGFpID0gMHgwZTMwO1xuICB0LnNhcmFldGhhaSA9IDB4MGU0MDtcbiAgdC5zYXJhaWlsZWZ0dGhhaSA9IDB4Zjg4NjtcbiAgdC5zYXJhaWl0aGFpID0gMHgwZTM1O1xuICB0LnNhcmFpbGVmdHRoYWkgPSAweGY4ODU7XG4gIHQuc2FyYWl0aGFpID0gMHgwZTM0O1xuICB0LnNhcmFvdGhhaSA9IDB4MGU0MjtcbiAgdC5zYXJhdWVlbGVmdHRoYWkgPSAweGY4ODg7XG4gIHQuc2FyYXVlZXRoYWkgPSAweDBlMzc7XG4gIHQuc2FyYXVlbGVmdHRoYWkgPSAweGY4ODc7XG4gIHQuc2FyYXVldGhhaSA9IDB4MGUzNjtcbiAgdC5zYXJhdXRoYWkgPSAweDBlMzg7XG4gIHQuc2FyYXV1dGhhaSA9IDB4MGUzOTtcbiAgdC5zYm9wb21vZm8gPSAweDMxMTk7XG4gIHQuc2Nhcm9uID0gMHgwMTYxO1xuICB0LnNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NztcbiAgdC5zY2VkaWxsYSA9IDB4MDE1ZjtcbiAgdC5zY2h3YSA9IDB4MDI1OTtcbiAgdC5zY2h3YWN5cmlsbGljID0gMHgwNGQ5O1xuICB0LnNjaHdhZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkYjtcbiAgdC5zY2h3YWhvb2sgPSAweDAyNWE7XG4gIHQuc2NpcmNsZSA9IDB4MjRlMjtcbiAgdC5zY2lyY3VtZmxleCA9IDB4MDE1ZDtcbiAgdC5zY29tbWFhY2NlbnQgPSAweDAyMTk7XG4gIHQuc2RvdGFjY2VudCA9IDB4MWU2MTtcbiAgdC5zZG90YmVsb3cgPSAweDFlNjM7XG4gIHQuc2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY5O1xuICB0LnNlYWd1bGxiZWxvd2NtYiA9IDB4MDMzYztcbiAgdC5zZWNvbmQgPSAweDIwMzM7XG4gIHQuc2Vjb25kdG9uZWNoaW5lc2UgPSAweDAyY2E7XG4gIHQuc2VjdGlvbiA9IDB4MDBhNztcbiAgdC5zZWVuYXJhYmljID0gMHgwNjMzO1xuICB0LnNlZW5maW5hbGFyYWJpYyA9IDB4ZmViMjtcbiAgdC5zZWVuaW5pdGlhbGFyYWJpYyA9IDB4ZmViMztcbiAgdC5zZWVubWVkaWFsYXJhYmljID0gMHhmZWI0O1xuICB0LnNlZ29sID0gMHgwNWI2O1xuICB0LnNlZ29sMTMgPSAweDA1YjY7XG4gIHQuc2Vnb2wxZiA9IDB4MDViNjtcbiAgdC5zZWdvbDJjID0gMHgwNWI2O1xuICB0LnNlZ29saGVicmV3ID0gMHgwNWI2O1xuICB0LnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWI2O1xuICB0LnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViNjtcbiAgdC5zZWdvbHRhaGVicmV3ID0gMHgwNTkyO1xuICB0LnNlZ29sd2lkZWhlYnJldyA9IDB4MDViNjtcbiAgdC5zZWhhcm1lbmlhbiA9IDB4MDU3ZDtcbiAgdC5zZWhpcmFnYW5hID0gMHgzMDViO1xuICB0LnNla2F0YWthbmEgPSAweDMwYmI7XG4gIHQuc2VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZTtcbiAgdC5zZW1pY29sb24gPSAweDAwM2I7XG4gIHQuc2VtaWNvbG9uYXJhYmljID0gMHgwNjFiO1xuICB0LnNlbWljb2xvbm1vbm9zcGFjZSA9IDB4ZmYxYjtcbiAgdC5zZW1pY29sb25zbWFsbCA9IDB4ZmU1NDtcbiAgdC5zZW1pdm9pY2VkbWFya2thbmEgPSAweDMwOWM7XG4gIHQuc2VtaXZvaWNlZG1hcmtrYW5haGFsZndpZHRoID0gMHhmZjlmO1xuICB0LnNlbnRpc3F1YXJlID0gMHgzMzIyO1xuICB0LnNlbnRvc3F1YXJlID0gMHgzMzIzO1xuICB0LnNldmVuID0gMHgwMDM3O1xuICB0LnNldmVuYXJhYmljID0gMHgwNjY3O1xuICB0LnNldmVuYmVuZ2FsaSA9IDB4MDllZDtcbiAgdC5zZXZlbmNpcmNsZSA9IDB4MjQ2NjtcbiAgdC5zZXZlbmNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OTA7XG4gIHQuc2V2ZW5kZXZhID0gMHgwOTZkO1xuICB0LnNldmVuZWlnaHRocyA9IDB4MjE1ZTtcbiAgdC5zZXZlbmd1amFyYXRpID0gMHgwYWVkO1xuICB0LnNldmVuZ3VybXVraGkgPSAweDBhNmQ7XG4gIHQuc2V2ZW5oYWNrYXJhYmljID0gMHgwNjY3O1xuICB0LnNldmVuaGFuZ3pob3UgPSAweDMwMjc7XG4gIHQuc2V2ZW5pZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI2O1xuICB0LnNldmVuaW5mZXJpb3IgPSAweDIwODc7XG4gIHQuc2V2ZW5tb25vc3BhY2UgPSAweGZmMTc7XG4gIHQuc2V2ZW5vbGRzdHlsZSA9IDB4ZjczNztcbiAgdC5zZXZlbnBhcmVuID0gMHgyNDdhO1xuICB0LnNldmVucGVyaW9kID0gMHgyNDhlO1xuICB0LnNldmVucGVyc2lhbiA9IDB4MDZmNztcbiAgdC5zZXZlbnJvbWFuID0gMHgyMTc2O1xuICB0LnNldmVuc3VwZXJpb3IgPSAweDIwNzc7XG4gIHQuc2V2ZW50ZWVuY2lyY2xlID0gMHgyNDcwO1xuICB0LnNldmVudGVlbnBhcmVuID0gMHgyNDg0O1xuICB0LnNldmVudGVlbnBlcmlvZCA9IDB4MjQ5ODtcbiAgdC5zZXZlbnRoYWkgPSAweDBlNTc7XG4gIHQuc2Z0aHlwaGVuID0gMHgwMGFkO1xuICB0LnNoYWFybWVuaWFuID0gMHgwNTc3O1xuICB0LnNoYWJlbmdhbGkgPSAweDA5YjY7XG4gIHQuc2hhY3lyaWxsaWMgPSAweDA0NDg7XG4gIHQuc2hhZGRhYXJhYmljID0gMHgwNjUxO1xuICB0LnNoYWRkYWRhbW1hYXJhYmljID0gMHhmYzYxO1xuICB0LnNoYWRkYWRhbW1hdGFuYXJhYmljID0gMHhmYzVlO1xuICB0LnNoYWRkYWZhdGhhYXJhYmljID0gMHhmYzYwO1xuICB0LnNoYWRkYWthc3JhYXJhYmljID0gMHhmYzYyO1xuICB0LnNoYWRkYWthc3JhdGFuYXJhYmljID0gMHhmYzVmO1xuICB0LnNoYWRlID0gMHgyNTkyO1xuICB0LnNoYWRlZGFyayA9IDB4MjU5MztcbiAgdC5zaGFkZWxpZ2h0ID0gMHgyNTkxO1xuICB0LnNoYWRlbWVkaXVtID0gMHgyNTkyO1xuICB0LnNoYWRldmEgPSAweDA5MzY7XG4gIHQuc2hhZ3VqYXJhdGkgPSAweDBhYjY7XG4gIHQuc2hhZ3VybXVraGkgPSAweDBhMzY7XG4gIHQuc2hhbHNoZWxldGhlYnJldyA9IDB4MDU5MztcbiAgdC5zaGJvcG9tb2ZvID0gMHgzMTE1O1xuICB0LnNoY2hhY3lyaWxsaWMgPSAweDA0NDk7XG4gIHQuc2hlZW5hcmFiaWMgPSAweDA2MzQ7XG4gIHQuc2hlZW5maW5hbGFyYWJpYyA9IDB4ZmViNjtcbiAgdC5zaGVlbmluaXRpYWxhcmFiaWMgPSAweGZlYjc7XG4gIHQuc2hlZW5tZWRpYWxhcmFiaWMgPSAweGZlYjg7XG4gIHQuc2hlaWNvcHRpYyA9IDB4MDNlMztcbiAgdC5zaGVxZWwgPSAweDIwYWE7XG4gIHQuc2hlcWVsaGVicmV3ID0gMHgyMGFhO1xuICB0LnNoZXZhID0gMHgwNWIwO1xuICB0LnNoZXZhMTE1ID0gMHgwNWIwO1xuICB0LnNoZXZhMTUgPSAweDA1YjA7XG4gIHQuc2hldmEyMiA9IDB4MDViMDtcbiAgdC5zaGV2YTJlID0gMHgwNWIwO1xuICB0LnNoZXZhaGVicmV3ID0gMHgwNWIwO1xuICB0LnNoZXZhbmFycm93aGVicmV3ID0gMHgwNWIwO1xuICB0LnNoZXZhcXVhcnRlcmhlYnJldyA9IDB4MDViMDtcbiAgdC5zaGV2YXdpZGVoZWJyZXcgPSAweDA1YjA7XG4gIHQuc2hoYWN5cmlsbGljID0gMHgwNGJiO1xuICB0LnNoaW1hY29wdGljID0gMHgwM2VkO1xuICB0LnNoaW4gPSAweDA1ZTk7XG4gIHQuc2hpbmRhZ2VzaCA9IDB4ZmI0OTtcbiAgdC5zaGluZGFnZXNoaGVicmV3ID0gMHhmYjQ5O1xuICB0LnNoaW5kYWdlc2hzaGluZG90ID0gMHhmYjJjO1xuICB0LnNoaW5kYWdlc2hzaGluZG90aGVicmV3ID0gMHhmYjJjO1xuICB0LnNoaW5kYWdlc2hzaW5kb3QgPSAweGZiMmQ7XG4gIHQuc2hpbmRhZ2VzaHNpbmRvdGhlYnJldyA9IDB4ZmIyZDtcbiAgdC5zaGluZG90aGVicmV3ID0gMHgwNWMxO1xuICB0LnNoaW5oZWJyZXcgPSAweDA1ZTk7XG4gIHQuc2hpbnNoaW5kb3QgPSAweGZiMmE7XG4gIHQuc2hpbnNoaW5kb3RoZWJyZXcgPSAweGZiMmE7XG4gIHQuc2hpbnNpbmRvdCA9IDB4ZmIyYjtcbiAgdC5zaGluc2luZG90aGVicmV3ID0gMHhmYjJiO1xuICB0LnNob29rID0gMHgwMjgyO1xuICB0LnNpZ21hID0gMHgwM2MzO1xuICB0LnNpZ21hMSA9IDB4MDNjMjtcbiAgdC5zaWdtYWZpbmFsID0gMHgwM2MyO1xuICB0LnNpZ21hbHVuYXRlc3ltYm9sZ3JlZWsgPSAweDAzZjI7XG4gIHQuc2loaXJhZ2FuYSA9IDB4MzA1NztcbiAgdC5zaWthdGFrYW5hID0gMHgzMGI3O1xuICB0LnNpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2M7XG4gIHQuc2lsdXFoZWJyZXcgPSAweDA1YmQ7XG4gIHQuc2lsdXFsZWZ0aGVicmV3ID0gMHgwNWJkO1xuICB0LnNpbWlsYXIgPSAweDIyM2M7XG4gIHQuc2luZG90aGVicmV3ID0gMHgwNWMyO1xuICB0LnNpb3NhY2lyY2xla29yZWFuID0gMHgzMjc0O1xuICB0LnNpb3NhcGFyZW5rb3JlYW4gPSAweDMyMTQ7XG4gIHQuc2lvc2NpZXVja29yZWFuID0gMHgzMTdlO1xuICB0LnNpb3NjaXJjbGVrb3JlYW4gPSAweDMyNjY7XG4gIHQuc2lvc2tpeWVva2tvcmVhbiA9IDB4MzE3YTtcbiAgdC5zaW9za29yZWFuID0gMHgzMTQ1O1xuICB0LnNpb3NuaWV1bmtvcmVhbiA9IDB4MzE3YjtcbiAgdC5zaW9zcGFyZW5rb3JlYW4gPSAweDMyMDY7XG4gIHQuc2lvc3BpZXVwa29yZWFuID0gMHgzMTdkO1xuICB0LnNpb3N0aWtldXRrb3JlYW4gPSAweDMxN2M7XG4gIHQuc2l4ID0gMHgwMDM2O1xuICB0LnNpeGFyYWJpYyA9IDB4MDY2NjtcbiAgdC5zaXhiZW5nYWxpID0gMHgwOWVjO1xuICB0LnNpeGNpcmNsZSA9IDB4MjQ2NTtcbiAgdC5zaXhjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhmO1xuICB0LnNpeGRldmEgPSAweDA5NmM7XG4gIHQuc2l4Z3VqYXJhdGkgPSAweDBhZWM7XG4gIHQuc2l4Z3VybXVraGkgPSAweDBhNmM7XG4gIHQuc2l4aGFja2FyYWJpYyA9IDB4MDY2NjtcbiAgdC5zaXhoYW5nemhvdSA9IDB4MzAyNjtcbiAgdC5zaXhpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI1O1xuICB0LnNpeGluZmVyaW9yID0gMHgyMDg2O1xuICB0LnNpeG1vbm9zcGFjZSA9IDB4ZmYxNjtcbiAgdC5zaXhvbGRzdHlsZSA9IDB4ZjczNjtcbiAgdC5zaXhwYXJlbiA9IDB4MjQ3OTtcbiAgdC5zaXhwZXJpb2QgPSAweDI0OGQ7XG4gIHQuc2l4cGVyc2lhbiA9IDB4MDZmNjtcbiAgdC5zaXhyb21hbiA9IDB4MjE3NTtcbiAgdC5zaXhzdXBlcmlvciA9IDB4MjA3NjtcbiAgdC5zaXh0ZWVuY2lyY2xlID0gMHgyNDZmO1xuICB0LnNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaSA9IDB4MDlmOTtcbiAgdC5zaXh0ZWVucGFyZW4gPSAweDI0ODM7XG4gIHQuc2l4dGVlbnBlcmlvZCA9IDB4MjQ5NztcbiAgdC5zaXh0aGFpID0gMHgwZTU2O1xuICB0LnNsYXNoID0gMHgwMDJmO1xuICB0LnNsYXNobW9ub3NwYWNlID0gMHhmZjBmO1xuICB0LnNsb25nID0gMHgwMTdmO1xuICB0LnNsb25nZG90YWNjZW50ID0gMHgxZTliO1xuICB0LnNtaWxlZmFjZSA9IDB4MjYzYTtcbiAgdC5zbW9ub3NwYWNlID0gMHhmZjUzO1xuICB0LnNvZnBhc3VxaGVicmV3ID0gMHgwNWMzO1xuICB0LnNvZnRoeXBoZW4gPSAweDAwYWQ7XG4gIHQuc29mdHNpZ25jeXJpbGxpYyA9IDB4MDQ0YztcbiAgdC5zb2hpcmFnYW5hID0gMHgzMDVkO1xuICB0LnNva2F0YWthbmEgPSAweDMwYmQ7XG4gIHQuc29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZjtcbiAgdC5zb2xpZHVzbG9uZ292ZXJsYXljbWIgPSAweDAzMzg7XG4gIHQuc29saWR1c3Nob3J0b3ZlcmxheWNtYiA9IDB4MDMzNztcbiAgdC5zb3J1c2l0aGFpID0gMHgwZTI5O1xuICB0LnNvc2FsYXRoYWkgPSAweDBlMjg7XG4gIHQuc29zb3RoYWkgPSAweDBlMGI7XG4gIHQuc29zdWF0aGFpID0gMHgwZTJhO1xuICB0LnNwYWNlID0gMHgwMDIwO1xuICB0LnNwYWNlaGFja2FyYWJpYyA9IDB4MDAyMDtcbiAgdC5zcGFkZSA9IDB4MjY2MDtcbiAgdC5zcGFkZXN1aXRibGFjayA9IDB4MjY2MDtcbiAgdC5zcGFkZXN1aXR3aGl0ZSA9IDB4MjY2NDtcbiAgdC5zcGFyZW4gPSAweDI0YWU7XG4gIHQuc3F1YXJlYmVsb3djbWIgPSAweDAzM2I7XG4gIHQuc3F1YXJlY2MgPSAweDMzYzQ7XG4gIHQuc3F1YXJlY20gPSAweDMzOWQ7XG4gIHQuc3F1YXJlZGlhZ29uYWxjcm9zc2hhdGNoZmlsbCA9IDB4MjVhOTtcbiAgdC5zcXVhcmVob3Jpem9udGFsZmlsbCA9IDB4MjVhNDtcbiAgdC5zcXVhcmVrZyA9IDB4MzM4ZjtcbiAgdC5zcXVhcmVrbSA9IDB4MzM5ZTtcbiAgdC5zcXVhcmVrbWNhcGl0YWwgPSAweDMzY2U7XG4gIHQuc3F1YXJlbG4gPSAweDMzZDE7XG4gIHQuc3F1YXJlbG9nID0gMHgzM2QyO1xuICB0LnNxdWFyZW1nID0gMHgzMzhlO1xuICB0LnNxdWFyZW1pbCA9IDB4MzNkNTtcbiAgdC5zcXVhcmVtbSA9IDB4MzM5YztcbiAgdC5zcXVhcmVtc3F1YXJlZCA9IDB4MzNhMTtcbiAgdC5zcXVhcmVvcnRob2dvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTY7XG4gIHQuc3F1YXJldXBwZXJsZWZ0dG9sb3dlcnJpZ2h0ZmlsbCA9IDB4MjVhNztcbiAgdC5zcXVhcmV1cHBlcnJpZ2h0dG9sb3dlcmxlZnRmaWxsID0gMHgyNWE4O1xuICB0LnNxdWFyZXZlcnRpY2FsZmlsbCA9IDB4MjVhNTtcbiAgdC5zcXVhcmV3aGl0ZXdpdGhzbWFsbGJsYWNrID0gMHgyNWEzO1xuICB0LnNyc3F1YXJlID0gMHgzM2RiO1xuICB0LnNzYWJlbmdhbGkgPSAweDA5Yjc7XG4gIHQuc3NhZGV2YSA9IDB4MDkzNztcbiAgdC5zc2FndWphcmF0aSA9IDB4MGFiNztcbiAgdC5zc2FuZ2NpZXVja29yZWFuID0gMHgzMTQ5O1xuICB0LnNzYW5naGlldWhrb3JlYW4gPSAweDMxODU7XG4gIHQuc3NhbmdpZXVuZ2tvcmVhbiA9IDB4MzE4MDtcbiAgdC5zc2FuZ2tpeWVva2tvcmVhbiA9IDB4MzEzMjtcbiAgdC5zc2FuZ25pZXVua29yZWFuID0gMHgzMTY1O1xuICB0LnNzYW5ncGlldXBrb3JlYW4gPSAweDMxNDM7XG4gIHQuc3NhbmdzaW9za29yZWFuID0gMHgzMTQ2O1xuICB0LnNzYW5ndGlrZXV0a29yZWFuID0gMHgzMTM4O1xuICB0LnNzdXBlcmlvciA9IDB4ZjZmMjtcbiAgdC5zdGVybGluZyA9IDB4MDBhMztcbiAgdC5zdGVybGluZ21vbm9zcGFjZSA9IDB4ZmZlMTtcbiAgdC5zdHJva2Vsb25nb3ZlcmxheWNtYiA9IDB4MDMzNjtcbiAgdC5zdHJva2VzaG9ydG92ZXJsYXljbWIgPSAweDAzMzU7XG4gIHQuc3Vic2V0ID0gMHgyMjgyO1xuICB0LnN1YnNldG5vdGVxdWFsID0gMHgyMjhhO1xuICB0LnN1YnNldG9yZXF1YWwgPSAweDIyODY7XG4gIHQuc3VjY2VlZHMgPSAweDIyN2I7XG4gIHQuc3VjaHRoYXQgPSAweDIyMGI7XG4gIHQuc3VoaXJhZ2FuYSA9IDB4MzA1OTtcbiAgdC5zdWthdGFrYW5hID0gMHgzMGI5O1xuICB0LnN1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2Q7XG4gIHQuc3VrdW5hcmFiaWMgPSAweDA2NTI7XG4gIHQuc3VtbWF0aW9uID0gMHgyMjExO1xuICB0LnN1biA9IDB4MjYzYztcbiAgdC5zdXBlcnNldCA9IDB4MjI4MztcbiAgdC5zdXBlcnNldG5vdGVxdWFsID0gMHgyMjhiO1xuICB0LnN1cGVyc2V0b3JlcXVhbCA9IDB4MjI4NztcbiAgdC5zdnNxdWFyZSA9IDB4MzNkYztcbiAgdC5zeW91d2FlcmFzcXVhcmUgPSAweDMzN2M7XG4gIHQudCA9IDB4MDA3NDtcbiAgdC50YWJlbmdhbGkgPSAweDA5YTQ7XG4gIHQudGFja2Rvd24gPSAweDIyYTQ7XG4gIHQudGFja2xlZnQgPSAweDIyYTM7XG4gIHQudGFkZXZhID0gMHgwOTI0O1xuICB0LnRhZ3VqYXJhdGkgPSAweDBhYTQ7XG4gIHQudGFndXJtdWtoaSA9IDB4MGEyNDtcbiAgdC50YWhhcmFiaWMgPSAweDA2Mzc7XG4gIHQudGFoZmluYWxhcmFiaWMgPSAweGZlYzI7XG4gIHQudGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjMztcbiAgdC50YWhpcmFnYW5hID0gMHgzMDVmO1xuICB0LnRhaG1lZGlhbGFyYWJpYyA9IDB4ZmVjNDtcbiAgdC50YWlzeW91ZXJhc3F1YXJlID0gMHgzMzdkO1xuICB0LnRha2F0YWthbmEgPSAweDMwYmY7XG4gIHQudGFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MDtcbiAgdC50YXR3ZWVsYXJhYmljID0gMHgwNjQwO1xuICB0LnRhdSA9IDB4MDNjNDtcbiAgdC50YXYgPSAweDA1ZWE7XG4gIHQudGF2ZGFnZXMgPSAweGZiNGE7XG4gIHQudGF2ZGFnZXNoID0gMHhmYjRhO1xuICB0LnRhdmRhZ2VzaGhlYnJldyA9IDB4ZmI0YTtcbiAgdC50YXZoZWJyZXcgPSAweDA1ZWE7XG4gIHQudGJhciA9IDB4MDE2NztcbiAgdC50Ym9wb21vZm8gPSAweDMxMGE7XG4gIHQudGNhcm9uID0gMHgwMTY1O1xuICB0LnRjY3VybCA9IDB4MDJhODtcbiAgdC50Y2VkaWxsYSA9IDB4MDE2MztcbiAgdC50Y2hlaGFyYWJpYyA9IDB4MDY4NjtcbiAgdC50Y2hlaGZpbmFsYXJhYmljID0gMHhmYjdiO1xuICB0LnRjaGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI3YztcbiAgdC50Y2hlaG1lZGlhbGFyYWJpYyA9IDB4ZmI3ZDtcbiAgdC50Y2lyY2xlID0gMHgyNGUzO1xuICB0LnRjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzE7XG4gIHQudGNvbW1hYWNjZW50ID0gMHgwMTYzO1xuICB0LnRkaWVyZXNpcyA9IDB4MWU5NztcbiAgdC50ZG90YWNjZW50ID0gMHgxZTZiO1xuICB0LnRkb3RiZWxvdyA9IDB4MWU2ZDtcbiAgdC50ZWN5cmlsbGljID0gMHgwNDQyO1xuICB0LnRlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWQ7XG4gIHQudGVoYXJhYmljID0gMHgwNjJhO1xuICB0LnRlaGZpbmFsYXJhYmljID0gMHhmZTk2O1xuICB0LnRlaGhhaGluaXRpYWxhcmFiaWMgPSAweGZjYTI7XG4gIHQudGVoaGFoaXNvbGF0ZWRhcmFiaWMgPSAweGZjMGM7XG4gIHQudGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5NztcbiAgdC50ZWhpcmFnYW5hID0gMHgzMDY2O1xuICB0LnRlaGplZW1pbml0aWFsYXJhYmljID0gMHhmY2ExO1xuICB0LnRlaGplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwYjtcbiAgdC50ZWhtYXJidXRhYXJhYmljID0gMHgwNjI5O1xuICB0LnRlaG1hcmJ1dGFmaW5hbGFyYWJpYyA9IDB4ZmU5NDtcbiAgdC50ZWhtZWRpYWxhcmFiaWMgPSAweGZlOTg7XG4gIHQudGVobWVlbWluaXRpYWxhcmFiaWMgPSAweGZjYTQ7XG4gIHQudGVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzBlO1xuICB0LnRlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM3MztcbiAgdC50ZWthdGFrYW5hID0gMHgzMGM2O1xuICB0LnRla2F0YWthbmFoYWxmd2lkdGggPSAweGZmODM7XG4gIHQudGVsZXBob25lID0gMHgyMTIxO1xuICB0LnRlbGVwaG9uZWJsYWNrID0gMHgyNjBlO1xuICB0LnRlbGlzaGFnZWRvbGFoZWJyZXcgPSAweDA1YTA7XG4gIHQudGVsaXNoYXFldGFuYWhlYnJldyA9IDB4MDVhOTtcbiAgdC50ZW5jaXJjbGUgPSAweDI0Njk7XG4gIHQudGVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyOTtcbiAgdC50ZW5wYXJlbiA9IDB4MjQ3ZDtcbiAgdC50ZW5wZXJpb2QgPSAweDI0OTE7XG4gIHQudGVucm9tYW4gPSAweDIxNzk7XG4gIHQudGVzaCA9IDB4MDJhNztcbiAgdC50ZXQgPSAweDA1ZDg7XG4gIHQudGV0ZGFnZXNoID0gMHhmYjM4O1xuICB0LnRldGRhZ2VzaGhlYnJldyA9IDB4ZmIzODtcbiAgdC50ZXRoZWJyZXcgPSAweDA1ZDg7XG4gIHQudGV0c2VjeXJpbGxpYyA9IDB4MDRiNTtcbiAgdC50ZXZpcmhlYnJldyA9IDB4MDU5YjtcbiAgdC50ZXZpcmxlZnRoZWJyZXcgPSAweDA1OWI7XG4gIHQudGhhYmVuZ2FsaSA9IDB4MDlhNTtcbiAgdC50aGFkZXZhID0gMHgwOTI1O1xuICB0LnRoYWd1amFyYXRpID0gMHgwYWE1O1xuICB0LnRoYWd1cm11a2hpID0gMHgwYTI1O1xuICB0LnRoYWxhcmFiaWMgPSAweDA2MzA7XG4gIHQudGhhbGZpbmFsYXJhYmljID0gMHhmZWFjO1xuICB0LnRoYW50aGFraGF0bG93bGVmdHRoYWkgPSAweGY4OTg7XG4gIHQudGhhbnRoYWtoYXRsb3dyaWdodHRoYWkgPSAweGY4OTc7XG4gIHQudGhhbnRoYWtoYXR0aGFpID0gMHgwZTRjO1xuICB0LnRoYW50aGFraGF0dXBwZXJsZWZ0dGhhaSA9IDB4Zjg5NjtcbiAgdC50aGVoYXJhYmljID0gMHgwNjJiO1xuICB0LnRoZWhmaW5hbGFyYWJpYyA9IDB4ZmU5YTtcbiAgdC50aGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5YjtcbiAgdC50aGVobWVkaWFsYXJhYmljID0gMHhmZTljO1xuICB0LnRoZXJlZXhpc3RzID0gMHgyMjAzO1xuICB0LnRoZXJlZm9yZSA9IDB4MjIzNDtcbiAgdC50aGV0YSA9IDB4MDNiODtcbiAgdC50aGV0YTEgPSAweDAzZDE7XG4gIHQudGhldGFzeW1ib2xncmVlayA9IDB4MDNkMTtcbiAgdC50aGlldXRoYWNpcmNsZWtvcmVhbiA9IDB4MzI3OTtcbiAgdC50aGlldXRoYXBhcmVua29yZWFuID0gMHgzMjE5O1xuICB0LnRoaWV1dGhjaXJjbGVrb3JlYW4gPSAweDMyNmI7XG4gIHQudGhpZXV0aGtvcmVhbiA9IDB4MzE0YztcbiAgdC50aGlldXRocGFyZW5rb3JlYW4gPSAweDMyMGI7XG4gIHQudGhpcnRlZW5jaXJjbGUgPSAweDI0NmM7XG4gIHQudGhpcnRlZW5wYXJlbiA9IDB4MjQ4MDtcbiAgdC50aGlydGVlbnBlcmlvZCA9IDB4MjQ5NDtcbiAgdC50aG9uYW5nbW9udGhvdGhhaSA9IDB4MGUxMTtcbiAgdC50aG9vayA9IDB4MDFhZDtcbiAgdC50aG9waHV0aGFvdGhhaSA9IDB4MGUxMjtcbiAgdC50aG9ybiA9IDB4MDBmZTtcbiAgdC50aG90aGFoYW50aGFpID0gMHgwZTE3O1xuICB0LnRob3RoYW50aGFpID0gMHgwZTEwO1xuICB0LnRob3Rob25ndGhhaSA9IDB4MGUxODtcbiAgdC50aG90aHVuZ3RoYWkgPSAweDBlMTY7XG4gIHQudGhvdXNhbmRjeXJpbGxpYyA9IDB4MDQ4MjtcbiAgdC50aG91c2FuZHNzZXBhcmF0b3JhcmFiaWMgPSAweDA2NmM7XG4gIHQudGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbiA9IDB4MDY2YztcbiAgdC50aHJlZSA9IDB4MDAzMztcbiAgdC50aHJlZWFyYWJpYyA9IDB4MDY2MztcbiAgdC50aHJlZWJlbmdhbGkgPSAweDA5ZTk7XG4gIHQudGhyZWVjaXJjbGUgPSAweDI0NjI7XG4gIHQudGhyZWVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhjO1xuICB0LnRocmVlZGV2YSA9IDB4MDk2OTtcbiAgdC50aHJlZWVpZ2h0aHMgPSAweDIxNWM7XG4gIHQudGhyZWVndWphcmF0aSA9IDB4MGFlOTtcbiAgdC50aHJlZWd1cm11a2hpID0gMHgwYTY5O1xuICB0LnRocmVlaGFja2FyYWJpYyA9IDB4MDY2MztcbiAgdC50aHJlZWhhbmd6aG91ID0gMHgzMDIzO1xuICB0LnRocmVlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMjtcbiAgdC50aHJlZWluZmVyaW9yID0gMHgyMDgzO1xuICB0LnRocmVlbW9ub3NwYWNlID0gMHhmZjEzO1xuICB0LnRocmVlbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNjtcbiAgdC50aHJlZW9sZHN0eWxlID0gMHhmNzMzO1xuICB0LnRocmVlcGFyZW4gPSAweDI0NzY7XG4gIHQudGhyZWVwZXJpb2QgPSAweDI0OGE7XG4gIHQudGhyZWVwZXJzaWFuID0gMHgwNmYzO1xuICB0LnRocmVlcXVhcnRlcnMgPSAweDAwYmU7XG4gIHQudGhyZWVxdWFydGVyc2VtZGFzaCA9IDB4ZjZkZTtcbiAgdC50aHJlZXJvbWFuID0gMHgyMTcyO1xuICB0LnRocmVlc3VwZXJpb3IgPSAweDAwYjM7XG4gIHQudGhyZWV0aGFpID0gMHgwZTUzO1xuICB0LnRoenNxdWFyZSA9IDB4MzM5NDtcbiAgdC50aWhpcmFnYW5hID0gMHgzMDYxO1xuICB0LnRpa2F0YWthbmEgPSAweDMwYzE7XG4gIHQudGlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MTtcbiAgdC50aWtldXRhY2lyY2xla29yZWFuID0gMHgzMjcwO1xuICB0LnRpa2V1dGFwYXJlbmtvcmVhbiA9IDB4MzIxMDtcbiAgdC50aWtldXRjaXJjbGVrb3JlYW4gPSAweDMyNjI7XG4gIHQudGlrZXV0a29yZWFuID0gMHgzMTM3O1xuICB0LnRpa2V1dHBhcmVua29yZWFuID0gMHgzMjAyO1xuICB0LnRpbGRlID0gMHgwMmRjO1xuICB0LnRpbGRlYmVsb3djbWIgPSAweDAzMzA7XG4gIHQudGlsZGVjbWIgPSAweDAzMDM7XG4gIHQudGlsZGVjb21iID0gMHgwMzAzO1xuICB0LnRpbGRlZG91YmxlY21iID0gMHgwMzYwO1xuICB0LnRpbGRlb3BlcmF0b3IgPSAweDIyM2M7XG4gIHQudGlsZGVvdmVybGF5Y21iID0gMHgwMzM0O1xuICB0LnRpbGRldmVydGljYWxjbWIgPSAweDAzM2U7XG4gIHQudGltZXNjaXJjbGUgPSAweDIyOTc7XG4gIHQudGlwZWhhaGVicmV3ID0gMHgwNTk2O1xuICB0LnRpcGVoYWxlZnRoZWJyZXcgPSAweDA1OTY7XG4gIHQudGlwcGlndXJtdWtoaSA9IDB4MGE3MDtcbiAgdC50aXRsb2N5cmlsbGljY21iID0gMHgwNDgzO1xuICB0LnRpd25hcm1lbmlhbiA9IDB4MDU3ZjtcbiAgdC50bGluZWJlbG93ID0gMHgxZTZmO1xuICB0LnRtb25vc3BhY2UgPSAweGZmNTQ7XG4gIHQudG9hcm1lbmlhbiA9IDB4MDU2OTtcbiAgdC50b2hpcmFnYW5hID0gMHgzMDY4O1xuICB0LnRva2F0YWthbmEgPSAweDMwYzg7XG4gIHQudG9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NDtcbiAgdC50b25lYmFyZXh0cmFoaWdobW9kID0gMHgwMmU1O1xuICB0LnRvbmViYXJleHRyYWxvd21vZCA9IDB4MDJlOTtcbiAgdC50b25lYmFyaGlnaG1vZCA9IDB4MDJlNjtcbiAgdC50b25lYmFybG93bW9kID0gMHgwMmU4O1xuICB0LnRvbmViYXJtaWRtb2QgPSAweDAyZTc7XG4gIHQudG9uZWZpdmUgPSAweDAxYmQ7XG4gIHQudG9uZXNpeCA9IDB4MDE4NTtcbiAgdC50b25ldHdvID0gMHgwMWE4O1xuICB0LnRvbm9zID0gMHgwMzg0O1xuICB0LnRvbnNxdWFyZSA9IDB4MzMyNztcbiAgdC50b3BhdGFrdGhhaSA9IDB4MGUwZjtcbiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQgPSAweDMwMTQ7XG4gIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0c21hbGwgPSAweGZlNWQ7XG4gIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlMzk7XG4gIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxNTtcbiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0c21hbGwgPSAweGZlNWU7XG4gIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTNhO1xuICB0LnRvdGFvdGhhaSA9IDB4MGUxNTtcbiAgdC50cGFsYXRhbGhvb2sgPSAweDAxYWI7XG4gIHQudHBhcmVuID0gMHgyNGFmO1xuICB0LnRyYWRlbWFyayA9IDB4MjEyMjtcbiAgdC50cmFkZW1hcmtzYW5zID0gMHhmOGVhO1xuICB0LnRyYWRlbWFya3NlcmlmID0gMHhmNmRiO1xuICB0LnRyZXRyb2ZsZXhob29rID0gMHgwMjg4O1xuICB0LnRyaWFnZG4gPSAweDI1YmM7XG4gIHQudHJpYWdsZiA9IDB4MjVjNDtcbiAgdC50cmlhZ3J0ID0gMHgyNWJhO1xuICB0LnRyaWFndXAgPSAweDI1YjI7XG4gIHQudHMgPSAweDAyYTY7XG4gIHQudHNhZGkgPSAweDA1ZTY7XG4gIHQudHNhZGlkYWdlc2ggPSAweGZiNDY7XG4gIHQudHNhZGlkYWdlc2hoZWJyZXcgPSAweGZiNDY7XG4gIHQudHNhZGloZWJyZXcgPSAweDA1ZTY7XG4gIHQudHNlY3lyaWxsaWMgPSAweDA0NDY7XG4gIHQudHNlcmUgPSAweDA1YjU7XG4gIHQudHNlcmUxMiA9IDB4MDViNTtcbiAgdC50c2VyZTFlID0gMHgwNWI1O1xuICB0LnRzZXJlMmIgPSAweDA1YjU7XG4gIHQudHNlcmVoZWJyZXcgPSAweDA1YjU7XG4gIHQudHNlcmVuYXJyb3doZWJyZXcgPSAweDA1YjU7XG4gIHQudHNlcmVxdWFydGVyaGVicmV3ID0gMHgwNWI1O1xuICB0LnRzZXJld2lkZWhlYnJldyA9IDB4MDViNTtcbiAgdC50c2hlY3lyaWxsaWMgPSAweDA0NWI7XG4gIHQudHN1cGVyaW9yID0gMHhmNmYzO1xuICB0LnR0YWJlbmdhbGkgPSAweDA5OWY7XG4gIHQudHRhZGV2YSA9IDB4MDkxZjtcbiAgdC50dGFndWphcmF0aSA9IDB4MGE5ZjtcbiAgdC50dGFndXJtdWtoaSA9IDB4MGExZjtcbiAgdC50dGVoYXJhYmljID0gMHgwNjc5O1xuICB0LnR0ZWhmaW5hbGFyYWJpYyA9IDB4ZmI2NztcbiAgdC50dGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI2ODtcbiAgdC50dGVobWVkaWFsYXJhYmljID0gMHhmYjY5O1xuICB0LnR0aGFiZW5nYWxpID0gMHgwOWEwO1xuICB0LnR0aGFkZXZhID0gMHgwOTIwO1xuICB0LnR0aGFndWphcmF0aSA9IDB4MGFhMDtcbiAgdC50dGhhZ3VybXVraGkgPSAweDBhMjA7XG4gIHQudHR1cm5lZCA9IDB4MDI4NztcbiAgdC50dWhpcmFnYW5hID0gMHgzMDY0O1xuICB0LnR1a2F0YWthbmEgPSAweDMwYzQ7XG4gIHQudHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MjtcbiAgdC50dXNtYWxsaGlyYWdhbmEgPSAweDMwNjM7XG4gIHQudHVzbWFsbGthdGFrYW5hID0gMHgzMGMzO1xuICB0LnR1c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ZjtcbiAgdC50d2VsdmVjaXJjbGUgPSAweDI0NmI7XG4gIHQudHdlbHZlcGFyZW4gPSAweDI0N2Y7XG4gIHQudHdlbHZlcGVyaW9kID0gMHgyNDkzO1xuICB0LnR3ZWx2ZXJvbWFuID0gMHgyMTdiO1xuICB0LnR3ZW50eWNpcmNsZSA9IDB4MjQ3MztcbiAgdC50d2VudHloYW5nemhvdSA9IDB4NTM0NDtcbiAgdC50d2VudHlwYXJlbiA9IDB4MjQ4NztcbiAgdC50d2VudHlwZXJpb2QgPSAweDI0OWI7XG4gIHQudHdvID0gMHgwMDMyO1xuICB0LnR3b2FyYWJpYyA9IDB4MDY2MjtcbiAgdC50d29iZW5nYWxpID0gMHgwOWU4O1xuICB0LnR3b2NpcmNsZSA9IDB4MjQ2MTtcbiAgdC50d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhiO1xuICB0LnR3b2RldmEgPSAweDA5Njg7XG4gIHQudHdvZG90ZW5sZWFkZXIgPSAweDIwMjU7XG4gIHQudHdvZG90bGVhZGVyID0gMHgyMDI1O1xuICB0LnR3b2RvdGxlYWRlcnZlcnRpY2FsID0gMHhmZTMwO1xuICB0LnR3b2d1amFyYXRpID0gMHgwYWU4O1xuICB0LnR3b2d1cm11a2hpID0gMHgwYTY4O1xuICB0LnR3b2hhY2thcmFiaWMgPSAweDA2NjI7XG4gIHQudHdvaGFuZ3pob3UgPSAweDMwMjI7XG4gIHQudHdvaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMTtcbiAgdC50d29pbmZlcmlvciA9IDB4MjA4MjtcbiAgdC50d29tb25vc3BhY2UgPSAweGZmMTI7XG4gIHQudHdvbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNTtcbiAgdC50d29vbGRzdHlsZSA9IDB4ZjczMjtcbiAgdC50d29wYXJlbiA9IDB4MjQ3NTtcbiAgdC50d29wZXJpb2QgPSAweDI0ODk7XG4gIHQudHdvcGVyc2lhbiA9IDB4MDZmMjtcbiAgdC50d29yb21hbiA9IDB4MjE3MTtcbiAgdC50d29zdHJva2UgPSAweDAxYmI7XG4gIHQudHdvc3VwZXJpb3IgPSAweDAwYjI7XG4gIHQudHdvdGhhaSA9IDB4MGU1MjtcbiAgdC50d290aGlyZHMgPSAweDIxNTQ7XG4gIHQudSA9IDB4MDA3NTtcbiAgdC51YWN1dGUgPSAweDAwZmE7XG4gIHQudWJhciA9IDB4MDI4OTtcbiAgdC51YmVuZ2FsaSA9IDB4MDk4OTtcbiAgdC51Ym9wb21vZm8gPSAweDMxMjg7XG4gIHQudWJyZXZlID0gMHgwMTZkO1xuICB0LnVjYXJvbiA9IDB4MDFkNDtcbiAgdC51Y2lyY2xlID0gMHgyNGU0O1xuICB0LnVjaXJjdW1mbGV4ID0gMHgwMGZiO1xuICB0LnVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzc7XG4gIHQudWN5cmlsbGljID0gMHgwNDQzO1xuICB0LnVkYXR0YWRldmEgPSAweDA5NTE7XG4gIHQudWRibGFjdXRlID0gMHgwMTcxO1xuICB0LnVkYmxncmF2ZSA9IDB4MDIxNTtcbiAgdC51ZGV2YSA9IDB4MDkwOTtcbiAgdC51ZGllcmVzaXMgPSAweDAwZmM7XG4gIHQudWRpZXJlc2lzYWN1dGUgPSAweDAxZDg7XG4gIHQudWRpZXJlc2lzYmVsb3cgPSAweDFlNzM7XG4gIHQudWRpZXJlc2lzY2Fyb24gPSAweDAxZGE7XG4gIHQudWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjE7XG4gIHQudWRpZXJlc2lzZ3JhdmUgPSAweDAxZGM7XG4gIHQudWRpZXJlc2lzbWFjcm9uID0gMHgwMWQ2O1xuICB0LnVkb3RiZWxvdyA9IDB4MWVlNTtcbiAgdC51Z3JhdmUgPSAweDAwZjk7XG4gIHQudWd1amFyYXRpID0gMHgwYTg5O1xuICB0LnVndXJtdWtoaSA9IDB4MGEwOTtcbiAgdC51aGlyYWdhbmEgPSAweDMwNDY7XG4gIHQudWhvb2thYm92ZSA9IDB4MWVlNztcbiAgdC51aG9ybiA9IDB4MDFiMDtcbiAgdC51aG9ybmFjdXRlID0gMHgxZWU5O1xuICB0LnVob3JuZG90YmVsb3cgPSAweDFlZjE7XG4gIHQudWhvcm5ncmF2ZSA9IDB4MWVlYjtcbiAgdC51aG9ybmhvb2thYm92ZSA9IDB4MWVlZDtcbiAgdC51aG9ybnRpbGRlID0gMHgxZWVmO1xuICB0LnVodW5nYXJ1bWxhdXQgPSAweDAxNzE7XG4gIHQudWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYzO1xuICB0LnVpbnZlcnRlZGJyZXZlID0gMHgwMjE3O1xuICB0LnVrYXRha2FuYSA9IDB4MzBhNjtcbiAgdC51a2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzM7XG4gIHQudWtjeXJpbGxpYyA9IDB4MDQ3OTtcbiAgdC51a29yZWFuID0gMHgzMTVjO1xuICB0LnVtYWNyb24gPSAweDAxNmI7XG4gIHQudW1hY3JvbmN5cmlsbGljID0gMHgwNGVmO1xuICB0LnVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YjtcbiAgdC51bWF0cmFndXJtdWtoaSA9IDB4MGE0MTtcbiAgdC51bW9ub3NwYWNlID0gMHhmZjU1O1xuICB0LnVuZGVyc2NvcmUgPSAweDAwNWY7XG4gIHQudW5kZXJzY29yZWRibCA9IDB4MjAxNztcbiAgdC51bmRlcnNjb3JlbW9ub3NwYWNlID0gMHhmZjNmO1xuICB0LnVuZGVyc2NvcmV2ZXJ0aWNhbCA9IDB4ZmUzMztcbiAgdC51bmRlcnNjb3Jld2F2eSA9IDB4ZmU0ZjtcbiAgdC51bmlvbiA9IDB4MjIyYTtcbiAgdC51bml2ZXJzYWwgPSAweDIyMDA7XG4gIHQudW9nb25layA9IDB4MDE3MztcbiAgdC51cGFyZW4gPSAweDI0YjA7XG4gIHQudXBibG9jayA9IDB4MjU4MDtcbiAgdC51cHBlcmRvdGhlYnJldyA9IDB4MDVjNDtcbiAgdC51cHNpbG9uID0gMHgwM2M1O1xuICB0LnVwc2lsb25kaWVyZXNpcyA9IDB4MDNjYjtcbiAgdC51cHNpbG9uZGllcmVzaXN0b25vcyA9IDB4MDNiMDtcbiAgdC51cHNpbG9ubGF0aW4gPSAweDAyOGE7XG4gIHQudXBzaWxvbnRvbm9zID0gMHgwM2NkO1xuICB0LnVwdGFja2JlbG93Y21iID0gMHgwMzFkO1xuICB0LnVwdGFja21vZCA9IDB4MDJkNDtcbiAgdC51cmFndXJtdWtoaSA9IDB4MGE3MztcbiAgdC51cmluZyA9IDB4MDE2ZjtcbiAgdC51c2hvcnRjeXJpbGxpYyA9IDB4MDQ1ZTtcbiAgdC51c21hbGxoaXJhZ2FuYSA9IDB4MzA0NTtcbiAgdC51c21hbGxrYXRha2FuYSA9IDB4MzBhNTtcbiAgdC51c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2OTtcbiAgdC51c3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZjtcbiAgdC51c3RyYWlnaHRzdHJva2VjeXJpbGxpYyA9IDB4MDRiMTtcbiAgdC51dGlsZGUgPSAweDAxNjk7XG4gIHQudXRpbGRlYWN1dGUgPSAweDFlNzk7XG4gIHQudXRpbGRlYmVsb3cgPSAweDFlNzU7XG4gIHQudXViZW5nYWxpID0gMHgwOThhO1xuICB0LnV1ZGV2YSA9IDB4MDkwYTtcbiAgdC51dWd1amFyYXRpID0gMHgwYThhO1xuICB0LnV1Z3VybXVraGkgPSAweDBhMGE7XG4gIHQudXVtYXRyYWd1cm11a2hpID0gMHgwYTQyO1xuICB0LnV1dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMjtcbiAgdC51dXZvd2Vsc2lnbmRldmEgPSAweDA5NDI7XG4gIHQudXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMjtcbiAgdC51dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMTtcbiAgdC51dm93ZWxzaWduZGV2YSA9IDB4MDk0MTtcbiAgdC51dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzE7XG4gIHQudiA9IDB4MDA3NjtcbiAgdC52YWRldmEgPSAweDA5MzU7XG4gIHQudmFndWphcmF0aSA9IDB4MGFiNTtcbiAgdC52YWd1cm11a2hpID0gMHgwYTM1O1xuICB0LnZha2F0YWthbmEgPSAweDMwZjc7XG4gIHQudmF2ID0gMHgwNWQ1O1xuICB0LnZhdmRhZ2VzaCA9IDB4ZmIzNTtcbiAgdC52YXZkYWdlc2g2NSA9IDB4ZmIzNTtcbiAgdC52YXZkYWdlc2hoZWJyZXcgPSAweGZiMzU7XG4gIHQudmF2aGVicmV3ID0gMHgwNWQ1O1xuICB0LnZhdmhvbGFtID0gMHhmYjRiO1xuICB0LnZhdmhvbGFtaGVicmV3ID0gMHhmYjRiO1xuICB0LnZhdnZhdmhlYnJldyA9IDB4MDVmMDtcbiAgdC52YXZ5b2RoZWJyZXcgPSAweDA1ZjE7XG4gIHQudmNpcmNsZSA9IDB4MjRlNTtcbiAgdC52ZG90YmVsb3cgPSAweDFlN2Y7XG4gIHQudmVjeXJpbGxpYyA9IDB4MDQzMjtcbiAgdC52ZWhhcmFiaWMgPSAweDA2YTQ7XG4gIHQudmVoZmluYWxhcmFiaWMgPSAweGZiNmI7XG4gIHQudmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI2YztcbiAgdC52ZWhtZWRpYWxhcmFiaWMgPSAweGZiNmQ7XG4gIHQudmVrYXRha2FuYSA9IDB4MzBmOTtcbiAgdC52ZW51cyA9IDB4MjY0MDtcbiAgdC52ZXJ0aWNhbGJhciA9IDB4MDA3YztcbiAgdC52ZXJ0aWNhbGxpbmVhYm92ZWNtYiA9IDB4MDMwZDtcbiAgdC52ZXJ0aWNhbGxpbmViZWxvd2NtYiA9IDB4MDMyOTtcbiAgdC52ZXJ0aWNhbGxpbmVsb3dtb2QgPSAweDAyY2M7XG4gIHQudmVydGljYWxsaW5lbW9kID0gMHgwMmM4O1xuICB0LnZld2FybWVuaWFuID0gMHgwNTdlO1xuICB0LnZob29rID0gMHgwMjhiO1xuICB0LnZpa2F0YWthbmEgPSAweDMwZjg7XG4gIHQudmlyYW1hYmVuZ2FsaSA9IDB4MDljZDtcbiAgdC52aXJhbWFkZXZhID0gMHgwOTRkO1xuICB0LnZpcmFtYWd1amFyYXRpID0gMHgwYWNkO1xuICB0LnZpc2FyZ2FiZW5nYWxpID0gMHgwOTgzO1xuICB0LnZpc2FyZ2FkZXZhID0gMHgwOTAzO1xuICB0LnZpc2FyZ2FndWphcmF0aSA9IDB4MGE4MztcbiAgdC52bW9ub3NwYWNlID0gMHhmZjU2O1xuICB0LnZvYXJtZW5pYW4gPSAweDA1Nzg7XG4gIHQudm9pY2VkaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWU7XG4gIHQudm9pY2VkaXRlcmF0aW9ua2F0YWthbmEgPSAweDMwZmU7XG4gIHQudm9pY2VkbWFya2thbmEgPSAweDMwOWI7XG4gIHQudm9pY2VkbWFya2thbmFoYWxmd2lkdGggPSAweGZmOWU7XG4gIHQudm9rYXRha2FuYSA9IDB4MzBmYTtcbiAgdC52cGFyZW4gPSAweDI0YjE7XG4gIHQudnRpbGRlID0gMHgxZTdkO1xuICB0LnZ0dXJuZWQgPSAweDAyOGM7XG4gIHQudnVoaXJhZ2FuYSA9IDB4MzA5NDtcbiAgdC52dWthdGFrYW5hID0gMHgzMGY0O1xuICB0LncgPSAweDAwNzc7XG4gIHQud2FjdXRlID0gMHgxZTgzO1xuICB0LndhZWtvcmVhbiA9IDB4MzE1OTtcbiAgdC53YWhpcmFnYW5hID0gMHgzMDhmO1xuICB0Lndha2F0YWthbmEgPSAweDMwZWY7XG4gIHQud2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YztcbiAgdC53YWtvcmVhbiA9IDB4MzE1ODtcbiAgdC53YXNtYWxsaGlyYWdhbmEgPSAweDMwOGU7XG4gIHQud2FzbWFsbGthdGFrYW5hID0gMHgzMGVlO1xuICB0LndhdHRvc3F1YXJlID0gMHgzMzU3O1xuICB0LndhdmVkYXNoID0gMHgzMDFjO1xuICB0Lndhdnl1bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzQ7XG4gIHQud2F3YXJhYmljID0gMHgwNjQ4O1xuICB0Lndhd2ZpbmFsYXJhYmljID0gMHhmZWVlO1xuICB0Lndhd2hhbXphYWJvdmVhcmFiaWMgPSAweDA2MjQ7XG4gIHQud2F3aGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZTg2O1xuICB0Lndic3F1YXJlID0gMHgzM2RkO1xuICB0LndjaXJjbGUgPSAweDI0ZTY7XG4gIHQud2NpcmN1bWZsZXggPSAweDAxNzU7XG4gIHQud2RpZXJlc2lzID0gMHgxZTg1O1xuICB0Lndkb3RhY2NlbnQgPSAweDFlODc7XG4gIHQud2RvdGJlbG93ID0gMHgxZTg5O1xuICB0LndlaGlyYWdhbmEgPSAweDMwOTE7XG4gIHQud2VpZXJzdHJhc3MgPSAweDIxMTg7XG4gIHQud2VrYXRha2FuYSA9IDB4MzBmMTtcbiAgdC53ZWtvcmVhbiA9IDB4MzE1ZTtcbiAgdC53ZW9rb3JlYW4gPSAweDMxNWQ7XG4gIHQud2dyYXZlID0gMHgxZTgxO1xuICB0LndoaXRlYnVsbGV0ID0gMHgyNWU2O1xuICB0LndoaXRlY2lyY2xlID0gMHgyNWNiO1xuICB0LndoaXRlY2lyY2xlaW52ZXJzZSA9IDB4MjVkOTtcbiAgdC53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0ID0gMHgzMDBlO1xuICB0LndoaXRlY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MztcbiAgdC53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZjtcbiAgdC53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQ0O1xuICB0LndoaXRlZGlhbW9uZCA9IDB4MjVjNztcbiAgdC53aGl0ZWRpYW1vbmRjb250YWluaW5nYmxhY2tzbWFsbGRpYW1vbmQgPSAweDI1Yzg7XG4gIHQud2hpdGVkb3ducG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWJmO1xuICB0LndoaXRlZG93bnBvaW50aW5ndHJpYW5nbGUgPSAweDI1YmQ7XG4gIHQud2hpdGVsZWZ0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWMzO1xuICB0LndoaXRlbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzE7XG4gIHQud2hpdGVsZW50aWN1bGFyYnJhY2tldGxlZnQgPSAweDMwMTY7XG4gIHQud2hpdGVsZW50aWN1bGFyYnJhY2tldHJpZ2h0ID0gMHgzMDE3O1xuICB0LndoaXRlcmlnaHRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1Yjk7XG4gIHQud2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGUgPSAweDI1Yjc7XG4gIHQud2hpdGVzbWFsbHNxdWFyZSA9IDB4MjVhYjtcbiAgdC53aGl0ZXNtaWxpbmdmYWNlID0gMHgyNjNhO1xuICB0LndoaXRlc3F1YXJlID0gMHgyNWExO1xuICB0LndoaXRlc3RhciA9IDB4MjYwNjtcbiAgdC53aGl0ZXRlbGVwaG9uZSA9IDB4MjYwZjtcbiAgdC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdCA9IDB4MzAxODtcbiAgdC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQgPSAweDMwMTk7XG4gIHQud2hpdGV1cHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViNTtcbiAgdC53aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMztcbiAgdC53aWhpcmFnYW5hID0gMHgzMDkwO1xuICB0Lndpa2F0YWthbmEgPSAweDMwZjA7XG4gIHQud2lrb3JlYW4gPSAweDMxNWY7XG4gIHQud21vbm9zcGFjZSA9IDB4ZmY1NztcbiAgdC53b2hpcmFnYW5hID0gMHgzMDkyO1xuICB0Lndva2F0YWthbmEgPSAweDMwZjI7XG4gIHQud29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NjtcbiAgdC53b24gPSAweDIwYTk7XG4gIHQud29ubW9ub3NwYWNlID0gMHhmZmU2O1xuICB0Lndvd2FlbnRoYWkgPSAweDBlMjc7XG4gIHQud3BhcmVuID0gMHgyNGIyO1xuICB0LndyaW5nID0gMHgxZTk4O1xuICB0LndzdXBlcmlvciA9IDB4MDJiNztcbiAgdC53dHVybmVkID0gMHgwMjhkO1xuICB0Lnd5bm4gPSAweDAxYmY7XG4gIHQueCA9IDB4MDA3ODtcbiAgdC54YWJvdmVjbWIgPSAweDAzM2Q7XG4gIHQueGJvcG9tb2ZvID0gMHgzMTEyO1xuICB0LnhjaXJjbGUgPSAweDI0ZTc7XG4gIHQueGRpZXJlc2lzID0gMHgxZThkO1xuICB0Lnhkb3RhY2NlbnQgPSAweDFlOGI7XG4gIHQueGVoYXJtZW5pYW4gPSAweDA1NmQ7XG4gIHQueGkgPSAweDAzYmU7XG4gIHQueG1vbm9zcGFjZSA9IDB4ZmY1ODtcbiAgdC54cGFyZW4gPSAweDI0YjM7XG4gIHQueHN1cGVyaW9yID0gMHgwMmUzO1xuICB0LnkgPSAweDAwNzk7XG4gIHQueWFhZG9zcXVhcmUgPSAweDMzNGU7XG4gIHQueWFiZW5nYWxpID0gMHgwOWFmO1xuICB0LnlhY3V0ZSA9IDB4MDBmZDtcbiAgdC55YWRldmEgPSAweDA5MmY7XG4gIHQueWFla29yZWFuID0gMHgzMTUyO1xuICB0LnlhZ3VqYXJhdGkgPSAweDBhYWY7XG4gIHQueWFndXJtdWtoaSA9IDB4MGEyZjtcbiAgdC55YWhpcmFnYW5hID0gMHgzMDg0O1xuICB0Lnlha2F0YWthbmEgPSAweDMwZTQ7XG4gIHQueWFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NDtcbiAgdC55YWtvcmVhbiA9IDB4MzE1MTtcbiAgdC55YW1ha2thbnRoYWkgPSAweDBlNGU7XG4gIHQueWFzbWFsbGhpcmFnYW5hID0gMHgzMDgzO1xuICB0Lnlhc21hbGxrYXRha2FuYSA9IDB4MzBlMztcbiAgdC55YXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmM7XG4gIHQueWF0Y3lyaWxsaWMgPSAweDA0NjM7XG4gIHQueWNpcmNsZSA9IDB4MjRlODtcbiAgdC55Y2lyY3VtZmxleCA9IDB4MDE3NztcbiAgdC55ZGllcmVzaXMgPSAweDAwZmY7XG4gIHQueWRvdGFjY2VudCA9IDB4MWU4ZjtcbiAgdC55ZG90YmVsb3cgPSAweDFlZjU7XG4gIHQueWVoYXJhYmljID0gMHgwNjRhO1xuICB0LnllaGJhcnJlZWFyYWJpYyA9IDB4MDZkMjtcbiAgdC55ZWhiYXJyZWVmaW5hbGFyYWJpYyA9IDB4ZmJhZjtcbiAgdC55ZWhmaW5hbGFyYWJpYyA9IDB4ZmVmMjtcbiAgdC55ZWhoYW16YWFib3ZlYXJhYmljID0gMHgwNjI2O1xuICB0LnllaGhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4YTtcbiAgdC55ZWhoYW16YWFib3ZlaW5pdGlhbGFyYWJpYyA9IDB4ZmU4YjtcbiAgdC55ZWhoYW16YWFib3ZlbWVkaWFsYXJhYmljID0gMHhmZThjO1xuICB0LnllaGluaXRpYWxhcmFiaWMgPSAweGZlZjM7XG4gIHQueWVobWVkaWFsYXJhYmljID0gMHhmZWY0O1xuICB0LnllaG1lZW1pbml0aWFsYXJhYmljID0gMHhmY2RkO1xuICB0LnllaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM1ODtcbiAgdC55ZWhub29uZmluYWxhcmFiaWMgPSAweGZjOTQ7XG4gIHQueWVodGhyZWVkb3RzYmVsb3dhcmFiaWMgPSAweDA2ZDE7XG4gIHQueWVrb3JlYW4gPSAweDMxNTY7XG4gIHQueWVuID0gMHgwMGE1O1xuICB0Lnllbm1vbm9zcGFjZSA9IDB4ZmZlNTtcbiAgdC55ZW9rb3JlYW4gPSAweDMxNTU7XG4gIHQueWVvcmluaGlldWhrb3JlYW4gPSAweDMxODY7XG4gIHQueWVyYWhiZW55b21vaGVicmV3ID0gMHgwNWFhO1xuICB0LnllcmFoYmVueW9tb2xlZnRoZWJyZXcgPSAweDA1YWE7XG4gIHQueWVyaWN5cmlsbGljID0gMHgwNDRiO1xuICB0LnllcnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY5O1xuICB0Lnllc2lldW5na29yZWFuID0gMHgzMTgxO1xuICB0Lnllc2lldW5ncGFuc2lvc2tvcmVhbiA9IDB4MzE4MztcbiAgdC55ZXNpZXVuZ3Npb3Nrb3JlYW4gPSAweDMxODI7XG4gIHQueWV0aXZoZWJyZXcgPSAweDA1OWE7XG4gIHQueWdyYXZlID0gMHgxZWYzO1xuICB0Lnlob29rID0gMHgwMWI0O1xuICB0Lnlob29rYWJvdmUgPSAweDFlZjc7XG4gIHQueWlhcm1lbmlhbiA9IDB4MDU3NTtcbiAgdC55aWN5cmlsbGljID0gMHgwNDU3O1xuICB0Lnlpa29yZWFuID0gMHgzMTYyO1xuICB0LnlpbnlhbmcgPSAweDI2MmY7XG4gIHQueWl3bmFybWVuaWFuID0gMHgwNTgyO1xuICB0Lnltb25vc3BhY2UgPSAweGZmNTk7XG4gIHQueW9kID0gMHgwNWQ5O1xuICB0LnlvZGRhZ2VzaCA9IDB4ZmIzOTtcbiAgdC55b2RkYWdlc2hoZWJyZXcgPSAweGZiMzk7XG4gIHQueW9kaGVicmV3ID0gMHgwNWQ5O1xuICB0LnlvZHlvZGhlYnJldyA9IDB4MDVmMjtcbiAgdC55b2R5b2RwYXRhaGhlYnJldyA9IDB4ZmIxZjtcbiAgdC55b2hpcmFnYW5hID0gMHgzMDg4O1xuICB0LnlvaWtvcmVhbiA9IDB4MzE4OTtcbiAgdC55b2thdGFrYW5hID0gMHgzMGU4O1xuICB0Lnlva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTY7XG4gIHQueW9rb3JlYW4gPSAweDMxNWI7XG4gIHQueW9zbWFsbGhpcmFnYW5hID0gMHgzMDg3O1xuICB0Lnlvc21hbGxrYXRha2FuYSA9IDB4MzBlNztcbiAgdC55b3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmU7XG4gIHQueW90Z3JlZWsgPSAweDAzZjM7XG4gIHQueW95YWVrb3JlYW4gPSAweDMxODg7XG4gIHQueW95YWtvcmVhbiA9IDB4MzE4NztcbiAgdC55b3lha3RoYWkgPSAweDBlMjI7XG4gIHQueW95aW5ndGhhaSA9IDB4MGUwZDtcbiAgdC55cGFyZW4gPSAweDI0YjQ7XG4gIHQueXBvZ2VncmFtbWVuaSA9IDB4MDM3YTtcbiAgdC55cG9nZWdyYW1tZW5pZ3JlZWtjbWIgPSAweDAzNDU7XG4gIHQueXIgPSAweDAxYTY7XG4gIHQueXJpbmcgPSAweDFlOTk7XG4gIHQueXN1cGVyaW9yID0gMHgwMmI4O1xuICB0Lnl0aWxkZSA9IDB4MWVmOTtcbiAgdC55dHVybmVkID0gMHgwMjhlO1xuICB0Lnl1aGlyYWdhbmEgPSAweDMwODY7XG4gIHQueXVpa29yZWFuID0gMHgzMThjO1xuICB0Lnl1a2F0YWthbmEgPSAweDMwZTY7XG4gIHQueXVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NTtcbiAgdC55dWtvcmVhbiA9IDB4MzE2MDtcbiAgdC55dXNiaWdjeXJpbGxpYyA9IDB4MDQ2YjtcbiAgdC55dXNiaWdpb3RpZmllZGN5cmlsbGljID0gMHgwNDZkO1xuICB0Lnl1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY3O1xuICB0Lnl1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njk7XG4gIHQueXVzbWFsbGhpcmFnYW5hID0gMHgzMDg1O1xuICB0Lnl1c21hbGxrYXRha2FuYSA9IDB4MzBlNTtcbiAgdC55dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmQ7XG4gIHQueXV5ZWtvcmVhbiA9IDB4MzE4YjtcbiAgdC55dXllb2tvcmVhbiA9IDB4MzE4YTtcbiAgdC55eWFiZW5nYWxpID0gMHgwOWRmO1xuICB0Lnl5YWRldmEgPSAweDA5NWY7XG4gIHQueiA9IDB4MDA3YTtcbiAgdC56YWFybWVuaWFuID0gMHgwNTY2O1xuICB0LnphY3V0ZSA9IDB4MDE3YTtcbiAgdC56YWRldmEgPSAweDA5NWI7XG4gIHQuemFndXJtdWtoaSA9IDB4MGE1YjtcbiAgdC56YWhhcmFiaWMgPSAweDA2Mzg7XG4gIHQuemFoZmluYWxhcmFiaWMgPSAweGZlYzY7XG4gIHQuemFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjNztcbiAgdC56YWhpcmFnYW5hID0gMHgzMDU2O1xuICB0LnphaG1lZGlhbGFyYWJpYyA9IDB4ZmVjODtcbiAgdC56YWluYXJhYmljID0gMHgwNjMyO1xuICB0LnphaW5maW5hbGFyYWJpYyA9IDB4ZmViMDtcbiAgdC56YWthdGFrYW5hID0gMHgzMGI2O1xuICB0LnphcWVmZ2Fkb2xoZWJyZXcgPSAweDA1OTU7XG4gIHQuemFxZWZxYXRhbmhlYnJldyA9IDB4MDU5NDtcbiAgdC56YXJxYWhlYnJldyA9IDB4MDU5ODtcbiAgdC56YXlpbiA9IDB4MDVkNjtcbiAgdC56YXlpbmRhZ2VzaCA9IDB4ZmIzNjtcbiAgdC56YXlpbmRhZ2VzaGhlYnJldyA9IDB4ZmIzNjtcbiAgdC56YXlpbmhlYnJldyA9IDB4MDVkNjtcbiAgdC56Ym9wb21vZm8gPSAweDMxMTc7XG4gIHQuemNhcm9uID0gMHgwMTdlO1xuICB0LnpjaXJjbGUgPSAweDI0ZTk7XG4gIHQuemNpcmN1bWZsZXggPSAweDFlOTE7XG4gIHQuemN1cmwgPSAweDAyOTE7XG4gIHQuemRvdCA9IDB4MDE3YztcbiAgdC56ZG90YWNjZW50ID0gMHgwMTdjO1xuICB0Lnpkb3RiZWxvdyA9IDB4MWU5MztcbiAgdC56ZWN5cmlsbGljID0gMHgwNDM3O1xuICB0LnplZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTk7XG4gIHQuemVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRmO1xuICB0LnplaGlyYWdhbmEgPSAweDMwNWM7XG4gIHQuemVrYXRha2FuYSA9IDB4MzBiYztcbiAgdC56ZXJvID0gMHgwMDMwO1xuICB0Lnplcm9hcmFiaWMgPSAweDA2NjA7XG4gIHQuemVyb2JlbmdhbGkgPSAweDA5ZTY7XG4gIHQuemVyb2RldmEgPSAweDA5NjY7XG4gIHQuemVyb2d1amFyYXRpID0gMHgwYWU2O1xuICB0Lnplcm9ndXJtdWtoaSA9IDB4MGE2NjtcbiAgdC56ZXJvaGFja2FyYWJpYyA9IDB4MDY2MDtcbiAgdC56ZXJvaW5mZXJpb3IgPSAweDIwODA7XG4gIHQuemVyb21vbm9zcGFjZSA9IDB4ZmYxMDtcbiAgdC56ZXJvb2xkc3R5bGUgPSAweGY3MzA7XG4gIHQuemVyb3BlcnNpYW4gPSAweDA2ZjA7XG4gIHQuemVyb3N1cGVyaW9yID0gMHgyMDcwO1xuICB0Lnplcm90aGFpID0gMHgwZTUwO1xuICB0Lnplcm93aWR0aGpvaW5lciA9IDB4ZmVmZjtcbiAgdC56ZXJvd2lkdGhub25qb2luZXIgPSAweDIwMGM7XG4gIHQuemVyb3dpZHRoc3BhY2UgPSAweDIwMGI7XG4gIHQuemV0YSA9IDB4MDNiNjtcbiAgdC56aGJvcG9tb2ZvID0gMHgzMTEzO1xuICB0LnpoZWFybWVuaWFuID0gMHgwNTZhO1xuICB0LnpoZWJyZXZlY3lyaWxsaWMgPSAweDA0YzI7XG4gIHQuemhlY3lyaWxsaWMgPSAweDA0MzY7XG4gIHQuemhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTc7XG4gIHQuemhlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZDtcbiAgdC56aWhpcmFnYW5hID0gMHgzMDU4O1xuICB0Lnppa2F0YWthbmEgPSAweDMwYjg7XG4gIHQuemlub3JoZWJyZXcgPSAweDA1YWU7XG4gIHQuemxpbmViZWxvdyA9IDB4MWU5NTtcbiAgdC56bW9ub3NwYWNlID0gMHhmZjVhO1xuICB0LnpvaGlyYWdhbmEgPSAweDMwNWU7XG4gIHQuem9rYXRha2FuYSA9IDB4MzBiZTtcbiAgdC56cGFyZW4gPSAweDI0YjU7XG4gIHQuenJldHJvZmxleGhvb2sgPSAweDAyOTA7XG4gIHQuenN0cm9rZSA9IDB4MDFiNjtcbiAgdC56dWhpcmFnYW5hID0gMHgzMDVhO1xuICB0Lnp1a2F0YWthbmEgPSAweDMwYmE7XG4gIHRbXCIubm90ZGVmXCJdID0gMHgwMDAwO1xuXG4gIC8vIFRlWC1zcGVjaWZpYyBnbHlwaCBuYW1lcy5cbiAgdC5hbmdicmFja2V0bGVmdGJpZyA9IDB4MjMyOTtcbiAgdC5hbmdicmFja2V0bGVmdEJpZyA9IDB4MjMyOTtcbiAgdC5hbmdicmFja2V0bGVmdGJpZ2cgPSAweDIzMjk7XG4gIHQuYW5nYnJhY2tldGxlZnRCaWdnID0gMHgyMzI5O1xuICB0LmFuZ2JyYWNrZXRyaWdodEJpZyA9IDB4MjMyYTtcbiAgdC5hbmdicmFja2V0cmlnaHRiaWcgPSAweDIzMmE7XG4gIHQuYW5nYnJhY2tldHJpZ2h0QmlnZyA9IDB4MjMyYTtcbiAgdC5hbmdicmFja2V0cmlnaHRiaWdnID0gMHgyMzJhO1xuICB0LmFycm93aG9va2xlZnQgPSAweDIxYWE7XG4gIHQuYXJyb3dob29rcmlnaHQgPSAweDIxYTk7XG4gIHQuYXJyb3dsZWZ0dG9waGFsZiA9IDB4MjFiYztcbiAgdC5hcnJvd2xlZnRib3RoYWxmID0gMHgyMWJkO1xuICB0LmFycm93bm9ydGhlYXN0ID0gMHgyMTk3O1xuICB0LmFycm93bm9ydGh3ZXN0ID0gMHgyMTk2O1xuICB0LmFycm93cmlnaHR0b3BoYWxmID0gMHgyMWMwO1xuICB0LmFycm93cmlnaHRib3RoYWxmID0gMHgyMWMxO1xuICB0LmFycm93c291dGhlYXN0ID0gMHgyMTk4O1xuICB0LmFycm93c291dGh3ZXN0ID0gMHgyMTk5O1xuICB0LmJhY2tzbGFzaGJpZyA9IDB4MjIxNjtcbiAgdC5iYWNrc2xhc2hCaWcgPSAweDIyMTY7XG4gIHQuYmFja3NsYXNoQmlnZyA9IDB4MjIxNjtcbiAgdC5iYWNrc2xhc2hiaWdnID0gMHgyMjE2O1xuICB0LmJhcmRibCA9IDB4MjAxNjtcbiAgdC5icmFjZWh0aXBkb3dubGVmdCA9IDB4ZmUzNztcbiAgdC5icmFjZWh0aXBkb3ducmlnaHQgPSAweGZlMzc7XG4gIHQuYnJhY2VodGlwdXBsZWZ0ID0gMHhmZTM4O1xuICB0LmJyYWNlaHRpcHVwcmlnaHQgPSAweGZlMzg7XG4gIHQuYnJhY2VsZWZ0QmlnID0gMHgwMDdiO1xuICB0LmJyYWNlbGVmdGJpZyA9IDB4MDA3YjtcbiAgdC5icmFjZWxlZnRiaWdnID0gMHgwMDdiO1xuICB0LmJyYWNlbGVmdEJpZ2cgPSAweDAwN2I7XG4gIHQuYnJhY2VyaWdodEJpZyA9IDB4MDA3ZDtcbiAgdC5icmFjZXJpZ2h0YmlnID0gMHgwMDdkO1xuICB0LmJyYWNlcmlnaHRiaWdnID0gMHgwMDdkO1xuICB0LmJyYWNlcmlnaHRCaWdnID0gMHgwMDdkO1xuICB0LmJyYWNrZXRsZWZ0YmlnID0gMHgwMDViO1xuICB0LmJyYWNrZXRsZWZ0QmlnID0gMHgwMDViO1xuICB0LmJyYWNrZXRsZWZ0YmlnZyA9IDB4MDA1YjtcbiAgdC5icmFja2V0bGVmdEJpZ2cgPSAweDAwNWI7XG4gIHQuYnJhY2tldHJpZ2h0QmlnID0gMHgwMDVkO1xuICB0LmJyYWNrZXRyaWdodGJpZyA9IDB4MDA1ZDtcbiAgdC5icmFja2V0cmlnaHRiaWdnID0gMHgwMDVkO1xuICB0LmJyYWNrZXRyaWdodEJpZ2cgPSAweDAwNWQ7XG4gIHQuY2VpbGluZ2xlZnRiaWcgPSAweDIzMDg7XG4gIHQuY2VpbGluZ2xlZnRCaWcgPSAweDIzMDg7XG4gIHQuY2VpbGluZ2xlZnRCaWdnID0gMHgyMzA4O1xuICB0LmNlaWxpbmdsZWZ0YmlnZyA9IDB4MjMwODtcbiAgdC5jZWlsaW5ncmlnaHRiaWcgPSAweDIzMDk7XG4gIHQuY2VpbGluZ3JpZ2h0QmlnID0gMHgyMzA5O1xuICB0LmNlaWxpbmdyaWdodGJpZ2cgPSAweDIzMDk7XG4gIHQuY2VpbGluZ3JpZ2h0QmlnZyA9IDB4MjMwOTtcbiAgdC5jaXJjbGVkb3RkaXNwbGF5ID0gMHgyMjk5O1xuICB0LmNpcmNsZWRvdHRleHQgPSAweDIyOTk7XG4gIHQuY2lyY2xlbXVsdGlwbHlkaXNwbGF5ID0gMHgyMjk3O1xuICB0LmNpcmNsZW11bHRpcGx5dGV4dCA9IDB4MjI5NztcbiAgdC5jaXJjbGVwbHVzZGlzcGxheSA9IDB4MjI5NTtcbiAgdC5jaXJjbGVwbHVzdGV4dCA9IDB4MjI5NTtcbiAgdC5jb250aW50ZWdyYWxkaXNwbGF5ID0gMHgyMjJlO1xuICB0LmNvbnRpbnRlZ3JhbHRleHQgPSAweDIyMmU7XG4gIHQuY29wcm9kdWN0ZGlzcGxheSA9IDB4MjIxMDtcbiAgdC5jb3Byb2R1Y3R0ZXh0ID0gMHgyMjEwO1xuICB0LmZsb29ybGVmdEJpZyA9IDB4MjMwYTtcbiAgdC5mbG9vcmxlZnRiaWcgPSAweDIzMGE7XG4gIHQuZmxvb3JsZWZ0YmlnZyA9IDB4MjMwYTtcbiAgdC5mbG9vcmxlZnRCaWdnID0gMHgyMzBhO1xuICB0LmZsb29ycmlnaHRiaWcgPSAweDIzMGI7XG4gIHQuZmxvb3JyaWdodEJpZyA9IDB4MjMwYjtcbiAgdC5mbG9vcnJpZ2h0QmlnZyA9IDB4MjMwYjtcbiAgdC5mbG9vcnJpZ2h0YmlnZyA9IDB4MjMwYjtcbiAgdC5oYXR3aWRlID0gMHgwMzAyO1xuICB0LmhhdHdpZGVyID0gMHgwMzAyO1xuICB0LmhhdHdpZGVzdCA9IDB4MDMwMjtcbiAgdC5pbnRlcmNhbCA9IDB4MWQ0MDtcbiAgdC5pbnRlZ3JhbGRpc3BsYXkgPSAweDIyMmI7XG4gIHQuaW50ZWdyYWx0ZXh0ID0gMHgyMjJiO1xuICB0LmludGVyc2VjdGlvbmRpc3BsYXkgPSAweDIyYzI7XG4gIHQuaW50ZXJzZWN0aW9udGV4dCA9IDB4MjJjMjtcbiAgdC5sb2dpY2FsYW5kZGlzcGxheSA9IDB4MjIyNztcbiAgdC5sb2dpY2FsYW5kdGV4dCA9IDB4MjIyNztcbiAgdC5sb2dpY2Fsb3JkaXNwbGF5ID0gMHgyMjI4O1xuICB0LmxvZ2ljYWxvcnRleHQgPSAweDIyMjg7XG4gIHQucGFyZW5sZWZ0QmlnID0gMHgwMDI4O1xuICB0LnBhcmVubGVmdGJpZyA9IDB4MDAyODtcbiAgdC5wYXJlbmxlZnRCaWdnID0gMHgwMDI4O1xuICB0LnBhcmVubGVmdGJpZ2cgPSAweDAwMjg7XG4gIHQucGFyZW5yaWdodEJpZyA9IDB4MDAyOTtcbiAgdC5wYXJlbnJpZ2h0YmlnID0gMHgwMDI5O1xuICB0LnBhcmVucmlnaHRCaWdnID0gMHgwMDI5O1xuICB0LnBhcmVucmlnaHRiaWdnID0gMHgwMDI5O1xuICB0LnByaW1lID0gMHgyMDMyO1xuICB0LnByb2R1Y3RkaXNwbGF5ID0gMHgyMjBmO1xuICB0LnByb2R1Y3R0ZXh0ID0gMHgyMjBmO1xuICB0LnJhZGljYWxiaWcgPSAweDIyMWE7XG4gIHQucmFkaWNhbEJpZyA9IDB4MjIxYTtcbiAgdC5yYWRpY2FsQmlnZyA9IDB4MjIxYTtcbiAgdC5yYWRpY2FsYmlnZyA9IDB4MjIxYTtcbiAgdC5yYWRpY2FsYnQgPSAweDIyMWE7XG4gIHQucmFkaWNhbHRwID0gMHgyMjFhO1xuICB0LnJhZGljYWx2ZXJ0ZXggPSAweDIyMWE7XG4gIHQuc2xhc2hiaWcgPSAweDAwMmY7XG4gIHQuc2xhc2hCaWcgPSAweDAwMmY7XG4gIHQuc2xhc2hCaWdnID0gMHgwMDJmO1xuICB0LnNsYXNoYmlnZyA9IDB4MDAyZjtcbiAgdC5zdW1tYXRpb25kaXNwbGF5ID0gMHgyMjExO1xuICB0LnN1bW1hdGlvbnRleHQgPSAweDIyMTE7XG4gIHQudGlsZGV3aWRlID0gMHgwMmRjO1xuICB0LnRpbGRld2lkZXIgPSAweDAyZGM7XG4gIHQudGlsZGV3aWRlc3QgPSAweDAyZGM7XG4gIHQudW5pb25kaXNwbGF5ID0gMHgyMmMzO1xuICB0LnVuaW9ubXVsdGlkaXNwbGF5ID0gMHgyMjhlO1xuICB0LnVuaW9ubXVsdGl0ZXh0ID0gMHgyMjhlO1xuICB0LnVuaW9uc3FkaXNwbGF5ID0gMHgyMjk0O1xuICB0LnVuaW9uc3F0ZXh0ID0gMHgyMjk0O1xuICB0LnVuaW9udGV4dCA9IDB4MjJjMztcbiAgdC52ZXh0ZW5kZG91YmxlID0gMHgyMjI1O1xuICB0LnZleHRlbmRzaW5nbGUgPSAweDIyMjM7XG59KTtcblxudmFyIGdldERpbmdiYXRzR2x5cGhzVW5pY29kZSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0LnNwYWNlID0gMHgwMDIwO1xuICB0LmExID0gMHgyNzAxO1xuICB0LmEyID0gMHgyNzAyO1xuICB0LmEyMDIgPSAweDI3MDM7XG4gIHQuYTMgPSAweDI3MDQ7XG4gIHQuYTQgPSAweDI2MGU7XG4gIHQuYTUgPSAweDI3MDY7XG4gIHQuYTExOSA9IDB4MjcwNztcbiAgdC5hMTE4ID0gMHgyNzA4O1xuICB0LmExMTcgPSAweDI3MDk7XG4gIHQuYTExID0gMHgyNjFiO1xuICB0LmExMiA9IDB4MjYxZTtcbiAgdC5hMTMgPSAweDI3MGM7XG4gIHQuYTE0ID0gMHgyNzBkO1xuICB0LmExNSA9IDB4MjcwZTtcbiAgdC5hMTYgPSAweDI3MGY7XG4gIHQuYTEwNSA9IDB4MjcxMDtcbiAgdC5hMTcgPSAweDI3MTE7XG4gIHQuYTE4ID0gMHgyNzEyO1xuICB0LmExOSA9IDB4MjcxMztcbiAgdC5hMjAgPSAweDI3MTQ7XG4gIHQuYTIxID0gMHgyNzE1O1xuICB0LmEyMiA9IDB4MjcxNjtcbiAgdC5hMjMgPSAweDI3MTc7XG4gIHQuYTI0ID0gMHgyNzE4O1xuICB0LmEyNSA9IDB4MjcxOTtcbiAgdC5hMjYgPSAweDI3MWE7XG4gIHQuYTI3ID0gMHgyNzFiO1xuICB0LmEyOCA9IDB4MjcxYztcbiAgdC5hNiA9IDB4MjcxZDtcbiAgdC5hNyA9IDB4MjcxZTtcbiAgdC5hOCA9IDB4MjcxZjtcbiAgdC5hOSA9IDB4MjcyMDtcbiAgdC5hMTAgPSAweDI3MjE7XG4gIHQuYTI5ID0gMHgyNzIyO1xuICB0LmEzMCA9IDB4MjcyMztcbiAgdC5hMzEgPSAweDI3MjQ7XG4gIHQuYTMyID0gMHgyNzI1O1xuICB0LmEzMyA9IDB4MjcyNjtcbiAgdC5hMzQgPSAweDI3Mjc7XG4gIHQuYTM1ID0gMHgyNjA1O1xuICB0LmEzNiA9IDB4MjcyOTtcbiAgdC5hMzcgPSAweDI3MmE7XG4gIHQuYTM4ID0gMHgyNzJiO1xuICB0LmEzOSA9IDB4MjcyYztcbiAgdC5hNDAgPSAweDI3MmQ7XG4gIHQuYTQxID0gMHgyNzJlO1xuICB0LmE0MiA9IDB4MjcyZjtcbiAgdC5hNDMgPSAweDI3MzA7XG4gIHQuYTQ0ID0gMHgyNzMxO1xuICB0LmE0NSA9IDB4MjczMjtcbiAgdC5hNDYgPSAweDI3MzM7XG4gIHQuYTQ3ID0gMHgyNzM0O1xuICB0LmE0OCA9IDB4MjczNTtcbiAgdC5hNDkgPSAweDI3MzY7XG4gIHQuYTUwID0gMHgyNzM3O1xuICB0LmE1MSA9IDB4MjczODtcbiAgdC5hNTIgPSAweDI3Mzk7XG4gIHQuYTUzID0gMHgyNzNhO1xuICB0LmE1NCA9IDB4MjczYjtcbiAgdC5hNTUgPSAweDI3M2M7XG4gIHQuYTU2ID0gMHgyNzNkO1xuICB0LmE1NyA9IDB4MjczZTtcbiAgdC5hNTggPSAweDI3M2Y7XG4gIHQuYTU5ID0gMHgyNzQwO1xuICB0LmE2MCA9IDB4Mjc0MTtcbiAgdC5hNjEgPSAweDI3NDI7XG4gIHQuYTYyID0gMHgyNzQzO1xuICB0LmE2MyA9IDB4Mjc0NDtcbiAgdC5hNjQgPSAweDI3NDU7XG4gIHQuYTY1ID0gMHgyNzQ2O1xuICB0LmE2NiA9IDB4Mjc0NztcbiAgdC5hNjcgPSAweDI3NDg7XG4gIHQuYTY4ID0gMHgyNzQ5O1xuICB0LmE2OSA9IDB4Mjc0YTtcbiAgdC5hNzAgPSAweDI3NGI7XG4gIHQuYTcxID0gMHgyNWNmO1xuICB0LmE3MiA9IDB4Mjc0ZDtcbiAgdC5hNzMgPSAweDI1YTA7XG4gIHQuYTc0ID0gMHgyNzRmO1xuICB0LmEyMDMgPSAweDI3NTA7XG4gIHQuYTc1ID0gMHgyNzUxO1xuICB0LmEyMDQgPSAweDI3NTI7XG4gIHQuYTc2ID0gMHgyNWIyO1xuICB0LmE3NyA9IDB4MjViYztcbiAgdC5hNzggPSAweDI1YzY7XG4gIHQuYTc5ID0gMHgyNzU2O1xuICB0LmE4MSA9IDB4MjVkNztcbiAgdC5hODIgPSAweDI3NTg7XG4gIHQuYTgzID0gMHgyNzU5O1xuICB0LmE4NCA9IDB4Mjc1YTtcbiAgdC5hOTcgPSAweDI3NWI7XG4gIHQuYTk4ID0gMHgyNzVjO1xuICB0LmE5OSA9IDB4Mjc1ZDtcbiAgdC5hMTAwID0gMHgyNzVlO1xuICB0LmExMDEgPSAweDI3NjE7XG4gIHQuYTEwMiA9IDB4Mjc2MjtcbiAgdC5hMTAzID0gMHgyNzYzO1xuICB0LmExMDQgPSAweDI3NjQ7XG4gIHQuYTEwNiA9IDB4Mjc2NTtcbiAgdC5hMTA3ID0gMHgyNzY2O1xuICB0LmExMDggPSAweDI3Njc7XG4gIHQuYTExMiA9IDB4MjY2MztcbiAgdC5hMTExID0gMHgyNjY2O1xuICB0LmExMTAgPSAweDI2NjU7XG4gIHQuYTEwOSA9IDB4MjY2MDtcbiAgdC5hMTIwID0gMHgyNDYwO1xuICB0LmExMjEgPSAweDI0NjE7XG4gIHQuYTEyMiA9IDB4MjQ2MjtcbiAgdC5hMTIzID0gMHgyNDYzO1xuICB0LmExMjQgPSAweDI0NjQ7XG4gIHQuYTEyNSA9IDB4MjQ2NTtcbiAgdC5hMTI2ID0gMHgyNDY2O1xuICB0LmExMjcgPSAweDI0Njc7XG4gIHQuYTEyOCA9IDB4MjQ2ODtcbiAgdC5hMTI5ID0gMHgyNDY5O1xuICB0LmExMzAgPSAweDI3NzY7XG4gIHQuYTEzMSA9IDB4Mjc3NztcbiAgdC5hMTMyID0gMHgyNzc4O1xuICB0LmExMzMgPSAweDI3Nzk7XG4gIHQuYTEzNCA9IDB4Mjc3YTtcbiAgdC5hMTM1ID0gMHgyNzdiO1xuICB0LmExMzYgPSAweDI3N2M7XG4gIHQuYTEzNyA9IDB4Mjc3ZDtcbiAgdC5hMTM4ID0gMHgyNzdlO1xuICB0LmExMzkgPSAweDI3N2Y7XG4gIHQuYTE0MCA9IDB4Mjc4MDtcbiAgdC5hMTQxID0gMHgyNzgxO1xuICB0LmExNDIgPSAweDI3ODI7XG4gIHQuYTE0MyA9IDB4Mjc4MztcbiAgdC5hMTQ0ID0gMHgyNzg0O1xuICB0LmExNDUgPSAweDI3ODU7XG4gIHQuYTE0NiA9IDB4Mjc4NjtcbiAgdC5hMTQ3ID0gMHgyNzg3O1xuICB0LmExNDggPSAweDI3ODg7XG4gIHQuYTE0OSA9IDB4Mjc4OTtcbiAgdC5hMTUwID0gMHgyNzhhO1xuICB0LmExNTEgPSAweDI3OGI7XG4gIHQuYTE1MiA9IDB4Mjc4YztcbiAgdC5hMTUzID0gMHgyNzhkO1xuICB0LmExNTQgPSAweDI3OGU7XG4gIHQuYTE1NSA9IDB4Mjc4ZjtcbiAgdC5hMTU2ID0gMHgyNzkwO1xuICB0LmExNTcgPSAweDI3OTE7XG4gIHQuYTE1OCA9IDB4Mjc5MjtcbiAgdC5hMTU5ID0gMHgyNzkzO1xuICB0LmExNjAgPSAweDI3OTQ7XG4gIHQuYTE2MSA9IDB4MjE5MjtcbiAgdC5hMTYzID0gMHgyMTk0O1xuICB0LmExNjQgPSAweDIxOTU7XG4gIHQuYTE5NiA9IDB4Mjc5ODtcbiAgdC5hMTY1ID0gMHgyNzk5O1xuICB0LmExOTIgPSAweDI3OWE7XG4gIHQuYTE2NiA9IDB4Mjc5YjtcbiAgdC5hMTY3ID0gMHgyNzljO1xuICB0LmExNjggPSAweDI3OWQ7XG4gIHQuYTE2OSA9IDB4Mjc5ZTtcbiAgdC5hMTcwID0gMHgyNzlmO1xuICB0LmExNzEgPSAweDI3YTA7XG4gIHQuYTE3MiA9IDB4MjdhMTtcbiAgdC5hMTczID0gMHgyN2EyO1xuICB0LmExNjIgPSAweDI3YTM7XG4gIHQuYTE3NCA9IDB4MjdhNDtcbiAgdC5hMTc1ID0gMHgyN2E1O1xuICB0LmExNzYgPSAweDI3YTY7XG4gIHQuYTE3NyA9IDB4MjdhNztcbiAgdC5hMTc4ID0gMHgyN2E4O1xuICB0LmExNzkgPSAweDI3YTk7XG4gIHQuYTE5MyA9IDB4MjdhYTtcbiAgdC5hMTgwID0gMHgyN2FiO1xuICB0LmExOTkgPSAweDI3YWM7XG4gIHQuYTE4MSA9IDB4MjdhZDtcbiAgdC5hMjAwID0gMHgyN2FlO1xuICB0LmExODIgPSAweDI3YWY7XG4gIHQuYTIwMSA9IDB4MjdiMTtcbiAgdC5hMTgzID0gMHgyN2IyO1xuICB0LmExODQgPSAweDI3YjM7XG4gIHQuYTE5NyA9IDB4MjdiNDtcbiAgdC5hMTg1ID0gMHgyN2I1O1xuICB0LmExOTQgPSAweDI3YjY7XG4gIHQuYTE5OCA9IDB4MjdiNztcbiAgdC5hMTg2ID0gMHgyN2I4O1xuICB0LmExOTUgPSAweDI3Yjk7XG4gIHQuYTE4NyA9IDB4MjdiYTtcbiAgdC5hMTg4ID0gMHgyN2JiO1xuICB0LmExODkgPSAweDI3YmM7XG4gIHQuYTE5MCA9IDB4MjdiZDtcbiAgdC5hMTkxID0gMHgyN2JlO1xuICB0LmE4OSA9IDB4Mjc2ODsgLy8gMHhGOEQ3XG4gIHQuYTkwID0gMHgyNzY5OyAvLyAweEY4RDhcbiAgdC5hOTMgPSAweDI3NmE7IC8vIDB4RjhEOVxuICB0LmE5NCA9IDB4Mjc2YjsgLy8gMHhGOERBXG4gIHQuYTkxID0gMHgyNzZjOyAvLyAweEY4REJcbiAgdC5hOTIgPSAweDI3NmQ7IC8vIDB4RjhEQ1xuICB0LmEyMDUgPSAweDI3NmU7IC8vIDB4RjhERFxuICB0LmE4NSA9IDB4Mjc2ZjsgLy8gMHhGOERFXG4gIHQuYTIwNiA9IDB4Mjc3MDsgLy8gMHhGOERGXG4gIHQuYTg2ID0gMHgyNzcxOyAvLyAweEY4RTBcbiAgdC5hODcgPSAweDI3NzI7IC8vIDB4RjhFMVxuICB0LmE4OCA9IDB4Mjc3MzsgLy8gMHhGOEUyXG4gIHQuYTk1ID0gMHgyNzc0OyAvLyAweEY4RTNcbiAgdC5hOTYgPSAweDI3NzU7IC8vIDB4RjhFNFxuICB0W1wiLm5vdGRlZlwiXSA9IDB4MDAwMDtcbn0pO1xuXG5leHBvcnRzLmdldEdseXBoc1VuaWNvZGUgPSBnZXRHbHlwaHNVbmljb2RlO1xuZXhwb3J0cy5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGUgPSBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGU7XG4iLCIvKiBDb3B5cmlnaHQgMjAxNSBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7IGdldExvb2t1cFRhYmxlRmFjdG9yeSB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuLyoqXG4gKiBIb2xkIGEgbWFwIG9mIGRlY29kZWQgZm9udHMgYW5kIG9mIHRoZSBzdGFuZGFyZCBmb3VydGVlbiBUeXBlMVxuICogZm9udHMgYW5kIHRoZWlyIGFjcm9ueW1zLlxuICovXG5jb25zdCBnZXRTdGRGb250TWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gIHQuQXJpYWxOYXJyb3cgPSBcIkhlbHZldGljYVwiO1xuICB0W1wiQXJpYWxOYXJyb3ctQm9sZFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRcIjtcbiAgdFtcIkFyaWFsTmFycm93LUJvbGRJdGFsaWNcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiQXJpYWxOYXJyb3ctSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICB0LkFyaWFsQmxhY2sgPSBcIkhlbHZldGljYVwiO1xuICB0W1wiQXJpYWxCbGFjay1Cb2xkXCJdID0gXCJIZWx2ZXRpY2EtQm9sZFwiO1xuICB0W1wiQXJpYWxCbGFjay1Cb2xkSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIjtcbiAgdFtcIkFyaWFsQmxhY2stSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICB0W1wiQXJpYWwtQmxhY2tcIl0gPSBcIkhlbHZldGljYVwiO1xuICB0W1wiQXJpYWwtQmxhY2stQm9sZFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRcIjtcbiAgdFtcIkFyaWFsLUJsYWNrLUJvbGRJdGFsaWNcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiQXJpYWwtQmxhY2stSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICB0LkFyaWFsID0gXCJIZWx2ZXRpY2FcIjtcbiAgdFtcIkFyaWFsLUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJBcmlhbC1Cb2xkSXRhbGljXCJdID0gXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIjtcbiAgdFtcIkFyaWFsLUl0YWxpY1wiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgdFtcIkFyaWFsLUJvbGRJdGFsaWNNVFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI7XG4gIHRbXCJBcmlhbC1Cb2xkTVRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJBcmlhbC1JdGFsaWNNVFwiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgdC5BcmlhbE1UID0gXCJIZWx2ZXRpY2FcIjtcbiAgdFtcIkNvdXJpZXItQm9sZFwiXSA9IFwiQ291cmllci1Cb2xkXCI7XG4gIHRbXCJDb3VyaWVyLUJvbGRJdGFsaWNcIl0gPSBcIkNvdXJpZXItQm9sZE9ibGlxdWVcIjtcbiAgdFtcIkNvdXJpZXItSXRhbGljXCJdID0gXCJDb3VyaWVyLU9ibGlxdWVcIjtcbiAgdC5Db3VyaWVyTmV3ID0gXCJDb3VyaWVyXCI7XG4gIHRbXCJDb3VyaWVyTmV3LUJvbGRcIl0gPSBcIkNvdXJpZXItQm9sZFwiO1xuICB0W1wiQ291cmllck5ldy1Cb2xkSXRhbGljXCJdID0gXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCI7XG4gIHRbXCJDb3VyaWVyTmV3LUl0YWxpY1wiXSA9IFwiQ291cmllci1PYmxpcXVlXCI7XG4gIHRbXCJDb3VyaWVyTmV3UFMtQm9sZEl0YWxpY01UXCJdID0gXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCI7XG4gIHRbXCJDb3VyaWVyTmV3UFMtQm9sZE1UXCJdID0gXCJDb3VyaWVyLUJvbGRcIjtcbiAgdFtcIkNvdXJpZXJOZXdQUy1JdGFsaWNNVFwiXSA9IFwiQ291cmllci1PYmxpcXVlXCI7XG4gIHQuQ291cmllck5ld1BTTVQgPSBcIkNvdXJpZXJcIjtcbiAgdC5IZWx2ZXRpY2EgPSBcIkhlbHZldGljYVwiO1xuICB0W1wiSGVsdmV0aWNhLUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJIZWx2ZXRpY2EtQm9sZEl0YWxpY1wiXSA9IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI7XG4gIHRbXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiSGVsdmV0aWNhLUl0YWxpY1wiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgdFtcIkhlbHZldGljYS1PYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICB0W1wiU3ltYm9sLUJvbGRcIl0gPSBcIlN5bWJvbFwiO1xuICB0W1wiU3ltYm9sLUJvbGRJdGFsaWNcIl0gPSBcIlN5bWJvbFwiO1xuICB0W1wiU3ltYm9sLUl0YWxpY1wiXSA9IFwiU3ltYm9sXCI7XG4gIHQuVGltZXNOZXdSb21hbiA9IFwiVGltZXMtUm9tYW5cIjtcbiAgdFtcIlRpbWVzTmV3Um9tYW4tQm9sZFwiXSA9IFwiVGltZXMtQm9sZFwiO1xuICB0W1wiVGltZXNOZXdSb21hbi1Cb2xkSXRhbGljXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuLUl0YWxpY1wiXSA9IFwiVGltZXMtSXRhbGljXCI7XG4gIHQuVGltZXNOZXdSb21hblBTID0gXCJUaW1lcy1Sb21hblwiO1xuICB0W1wiVGltZXNOZXdSb21hblBTLUJvbGRcIl0gPSBcIlRpbWVzLUJvbGRcIjtcbiAgdFtcIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpY01UXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFMtQm9sZE1UXCJdID0gXCJUaW1lcy1Cb2xkXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFMtSXRhbGljXCJdID0gXCJUaW1lcy1JdGFsaWNcIjtcbiAgdFtcIlRpbWVzTmV3Um9tYW5QUy1JdGFsaWNNVFwiXSA9IFwiVGltZXMtSXRhbGljXCI7XG4gIHQuVGltZXNOZXdSb21hblBTTVQgPSBcIlRpbWVzLVJvbWFuXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkXCJdID0gXCJUaW1lcy1Cb2xkXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkSXRhbGljXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJUaW1lc05ld1JvbWFuUFNNVC1JdGFsaWNcIl0gPSBcIlRpbWVzLUl0YWxpY1wiO1xufSk7XG5cbi8qKlxuICogSG9sZHMgdGhlIG1hcCBvZiB0aGUgbm9uLXN0YW5kYXJkIGZvbnRzIHRoYXQgbWlnaHQgYmUgaW5jbHVkZWQgYXNcbiAqIGEgc3RhbmRhcmQgZm9udHMgd2l0aG91dCBnbHlwaCBkYXRhLlxuICovXG5jb25zdCBnZXROb25TdGRGb250TWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gIHQuQ2FsaWJyaSA9IFwiSGVsdmV0aWNhXCI7XG4gIHRbXCJDYWxpYnJpLUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJDYWxpYnJpLUJvbGRJdGFsaWNcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiQ2FsaWJyaS1JdGFsaWNcIl0gPSBcIkhlbHZldGljYS1PYmxpcXVlXCI7XG4gIHQuQ2VudHVyeUdvdGhpYyA9IFwiSGVsdmV0aWNhXCI7XG4gIHRbXCJDZW50dXJ5R290aGljLUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gIHRbXCJDZW50dXJ5R290aGljLUJvbGRJdGFsaWNcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiQ2VudHVyeUdvdGhpYy1JdGFsaWNcIl0gPSBcIkhlbHZldGljYS1PYmxpcXVlXCI7XG4gIHQuQ29taWNTYW5zTVMgPSBcIkNvbWljIFNhbnMgTVNcIjtcbiAgdFtcIkNvbWljU2Fuc01TLUJvbGRcIl0gPSBcIkNvbWljIFNhbnMgTVMtQm9sZFwiO1xuICB0W1wiQ29taWNTYW5zTVMtQm9sZEl0YWxpY1wiXSA9IFwiQ29taWMgU2FucyBNUy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJDb21pY1NhbnNNUy1JdGFsaWNcIl0gPSBcIkNvbWljIFNhbnMgTVMtSXRhbGljXCI7XG4gIHQuTHVjaWRhQ29uc29sZSA9IFwiQ291cmllclwiO1xuICB0W1wiTHVjaWRhQ29uc29sZS1Cb2xkXCJdID0gXCJDb3VyaWVyLUJvbGRcIjtcbiAgdFtcIkx1Y2lkYUNvbnNvbGUtQm9sZEl0YWxpY1wiXSA9IFwiQ291cmllci1Cb2xkT2JsaXF1ZVwiO1xuICB0W1wiTHVjaWRhQ29uc29sZS1JdGFsaWNcIl0gPSBcIkNvdXJpZXItT2JsaXF1ZVwiO1xuICB0W1wiTHVjaWRhU2Fucy1EZW1pXCJdID0gXCJIZWx2ZXRpY2EtQm9sZFwiO1xuICB0W1wiTVMtR290aGljXCJdID0gXCJNUyBHb3RoaWNcIjtcbiAgdFtcIk1TLUdvdGhpYy1Cb2xkXCJdID0gXCJNUyBHb3RoaWMtQm9sZFwiO1xuICB0W1wiTVMtR290aGljLUJvbGRJdGFsaWNcIl0gPSBcIk1TIEdvdGhpYy1Cb2xkSXRhbGljXCI7XG4gIHRbXCJNUy1Hb3RoaWMtSXRhbGljXCJdID0gXCJNUyBHb3RoaWMtSXRhbGljXCI7XG4gIHRbXCJNUy1NaW5jaG9cIl0gPSBcIk1TIE1pbmNob1wiO1xuICB0W1wiTVMtTWluY2hvLUJvbGRcIl0gPSBcIk1TIE1pbmNoby1Cb2xkXCI7XG4gIHRbXCJNUy1NaW5jaG8tQm9sZEl0YWxpY1wiXSA9IFwiTVMgTWluY2hvLUJvbGRJdGFsaWNcIjtcbiAgdFtcIk1TLU1pbmNoby1JdGFsaWNcIl0gPSBcIk1TIE1pbmNoby1JdGFsaWNcIjtcbiAgdFtcIk1TLVBHb3RoaWNcIl0gPSBcIk1TIFBHb3RoaWNcIjtcbiAgdFtcIk1TLVBHb3RoaWMtQm9sZFwiXSA9IFwiTVMgUEdvdGhpYy1Cb2xkXCI7XG4gIHRbXCJNUy1QR290aGljLUJvbGRJdGFsaWNcIl0gPSBcIk1TIFBHb3RoaWMtQm9sZEl0YWxpY1wiO1xuICB0W1wiTVMtUEdvdGhpYy1JdGFsaWNcIl0gPSBcIk1TIFBHb3RoaWMtSXRhbGljXCI7XG4gIHRbXCJNUy1QTWluY2hvXCJdID0gXCJNUyBQTWluY2hvXCI7XG4gIHRbXCJNUy1QTWluY2hvLUJvbGRcIl0gPSBcIk1TIFBNaW5jaG8tQm9sZFwiO1xuICB0W1wiTVMtUE1pbmNoby1Cb2xkSXRhbGljXCJdID0gXCJNUyBQTWluY2hvLUJvbGRJdGFsaWNcIjtcbiAgdFtcIk1TLVBNaW5jaG8tSXRhbGljXCJdID0gXCJNUyBQTWluY2hvLUl0YWxpY1wiO1xuICB0Lk51cHRpYWxTY3JpcHQgPSBcIlRpbWVzLUl0YWxpY1wiO1xuICB0LlNlZ29lVUlTeW1ib2wgPSBcIkhlbHZldGljYVwiO1xuICB0LldpbmdkaW5ncyA9IFwiWmFwZkRpbmdiYXRzXCI7XG4gIHRbXCJXaW5nZGluZ3MtUmVndWxhclwiXSA9IFwiWmFwZkRpbmdiYXRzXCI7XG59KTtcblxuY29uc3QgZ2V0U2VyaWZGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0W1wiQWRvYmUgSmVuc29uXCJdID0gdHJ1ZTtcbiAgdFtcIkFkb2JlIFRleHRcIl0gPSB0cnVlO1xuICB0LkFsYmVydHVzID0gdHJ1ZTtcbiAgdC5BbGR1cyA9IHRydWU7XG4gIHQuQWxleGFuZHJpYSA9IHRydWU7XG4gIHQuQWxnZXJpYW4gPSB0cnVlO1xuICB0W1wiQW1lcmljYW4gVHlwZXdyaXRlclwiXSA9IHRydWU7XG4gIHQuQW50aXF1YSA9IHRydWU7XG4gIHQuQXBleCA9IHRydWU7XG4gIHQuQXJubyA9IHRydWU7XG4gIHQuQXN0ZXIgPSB0cnVlO1xuICB0LkF1cm9yYSA9IHRydWU7XG4gIHQuQmFza2VydmlsbGUgPSB0cnVlO1xuICB0LkJlbGwgPSB0cnVlO1xuICB0LkJlbWJvID0gdHJ1ZTtcbiAgdFtcIkJlbWJvIFNjaG9vbGJvb2tcIl0gPSB0cnVlO1xuICB0LkJlbmd1aWF0ID0gdHJ1ZTtcbiAgdFtcIkJlcmtlbGV5IE9sZCBTdHlsZVwiXSA9IHRydWU7XG4gIHRbXCJCZXJuaGFyZCBNb2Rlcm5cIl0gPSB0cnVlO1xuICB0W1wiQmVydGhvbGQgQ2l0eVwiXSA9IHRydWU7XG4gIHQuQm9kb25pID0gdHJ1ZTtcbiAgdFtcIkJhdWVyIEJvZG9uaVwiXSA9IHRydWU7XG4gIHRbXCJCb29rIEFudGlxdWFcIl0gPSB0cnVlO1xuICB0LkJvb2ttYW4gPSB0cnVlO1xuICB0W1wiQm9yZGVhdXggUm9tYW5cIl0gPSB0cnVlO1xuICB0W1wiQ2FsaWZvcm5pYW4gRkJcIl0gPSB0cnVlO1xuICB0LkNhbGlzdG8gPSB0cnVlO1xuICB0LkNhbHZlcnQgPSB0cnVlO1xuICB0LkNhcGl0YWxzID0gdHJ1ZTtcbiAgdC5DYW1icmlhID0gdHJ1ZTtcbiAgdC5DYXJ0aWVyID0gdHJ1ZTtcbiAgdC5DYXNsb24gPSB0cnVlO1xuICB0LkNhdHVsbCA9IHRydWU7XG4gIHQuQ2VudGF1ciA9IHRydWU7XG4gIHRbXCJDZW50dXJ5IE9sZCBTdHlsZVwiXSA9IHRydWU7XG4gIHRbXCJDZW50dXJ5IFNjaG9vbGJvb2tcIl0gPSB0cnVlO1xuICB0LkNoYXBhcnJhbCA9IHRydWU7XG4gIHRbXCJDaGFyaXMgU0lMXCJdID0gdHJ1ZTtcbiAgdC5DaGVsdGVuaGFtID0gdHJ1ZTtcbiAgdFtcIkNob2xsYSBTbGFiXCJdID0gdHJ1ZTtcbiAgdC5DbGFyZW5kb24gPSB0cnVlO1xuICB0LkNsZWFyZmFjZSA9IHRydWU7XG4gIHQuQ29jaGluID0gdHJ1ZTtcbiAgdC5Db2xvbm5hID0gdHJ1ZTtcbiAgdFtcIkNvbXB1dGVyIE1vZGVyblwiXSA9IHRydWU7XG4gIHRbXCJDb25jcmV0ZSBSb21hblwiXSA9IHRydWU7XG4gIHQuQ29uc3RhbnRpYSA9IHRydWU7XG4gIHRbXCJDb29wZXIgQmxhY2tcIl0gPSB0cnVlO1xuICB0LkNvcm9uYSA9IHRydWU7XG4gIHQuRWNvdHlwZSA9IHRydWU7XG4gIHQuRWd5cHRpZW5uZSA9IHRydWU7XG4gIHQuRWxlcGhhbnQgPSB0cnVlO1xuICB0LkV4Y2Vsc2lvciA9IHRydWU7XG4gIHQuRmFpcmZpZWxkID0gdHJ1ZTtcbiAgdFtcIkZGIFNjYWxhXCJdID0gdHJ1ZTtcbiAgdC5Gb2xrYXJkID0gdHJ1ZTtcbiAgdC5Gb290bGlnaHQgPSB0cnVlO1xuICB0LkZyZWVTZXJpZiA9IHRydWU7XG4gIHRbXCJGcml6IFF1YWRyYXRhXCJdID0gdHJ1ZTtcbiAgdC5HYXJhbW9uZCA9IHRydWU7XG4gIHQuR2VudGl1bSA9IHRydWU7XG4gIHQuR2VvcmdpYSA9IHRydWU7XG4gIHQuR2xvdWNlc3RlciA9IHRydWU7XG4gIHRbXCJHb3VkeSBPbGQgU3R5bGVcIl0gPSB0cnVlO1xuICB0W1wiR291ZHkgU2Nob29sYm9va1wiXSA9IHRydWU7XG4gIHRbXCJHb3VkeSBQcm8gRm9udFwiXSA9IHRydWU7XG4gIHQuR3JhbmpvbiA9IHRydWU7XG4gIHRbXCJHdWFyZGlhbiBFZ3lwdGlhblwiXSA9IHRydWU7XG4gIHQuSGVhdGhlciA9IHRydWU7XG4gIHQuSGVyY3VsZXMgPSB0cnVlO1xuICB0W1wiSGlnaCBUb3dlciBUZXh0XCJdID0gdHJ1ZTtcbiAgdC5IaXJvc2hpZ2UgPSB0cnVlO1xuICB0W1wiSG9lZmxlciBUZXh0XCJdID0gdHJ1ZTtcbiAgdFtcIkh1bWFuYSBTZXJpZlwiXSA9IHRydWU7XG4gIHQuSW1wcmludCA9IHRydWU7XG4gIHRbXCJJb25pYyBOby4gNVwiXSA9IHRydWU7XG4gIHQuSmFuc29uID0gdHJ1ZTtcbiAgdC5Kb2FubmEgPSB0cnVlO1xuICB0LktvcmlubmEgPSB0cnVlO1xuICB0LkxleGljb24gPSB0cnVlO1xuICB0W1wiTGliZXJhdGlvbiBTZXJpZlwiXSA9IHRydWU7XG4gIHRbXCJMaW51eCBMaWJlcnRpbmVcIl0gPSB0cnVlO1xuICB0LkxpdGVyYXR1cm5heWEgPSB0cnVlO1xuICB0Lkx1Y2lkYSA9IHRydWU7XG4gIHRbXCJMdWNpZGEgQnJpZ2h0XCJdID0gdHJ1ZTtcbiAgdC5NZWxpb3IgPSB0cnVlO1xuICB0Lk1lbXBoaXMgPSB0cnVlO1xuICB0Lk1pbGxlciA9IHRydWU7XG4gIHQuTWluaW9uID0gdHJ1ZTtcbiAgdC5Nb2Rlcm4gPSB0cnVlO1xuICB0W1wiTW9uYSBMaXNhXCJdID0gdHJ1ZTtcbiAgdFtcIk1ycyBFYXZlc1wiXSA9IHRydWU7XG4gIHRbXCJNUyBTZXJpZlwiXSA9IHRydWU7XG4gIHRbXCJNdXNlbyBTbGFiXCJdID0gdHJ1ZTtcbiAgdFtcIk5ldyBZb3JrXCJdID0gdHJ1ZTtcbiAgdFtcIk5pbWJ1cyBSb21hblwiXSA9IHRydWU7XG4gIHRbXCJOUFMgUmF3bGluc29uIFJvYWR3YXlcIl0gPSB0cnVlO1xuICB0Lk51cHRpYWxTY3JpcHQgPSB0cnVlO1xuICB0LlBhbGF0aW5vID0gdHJ1ZTtcbiAgdC5QZXJwZXR1YSA9IHRydWU7XG4gIHQuUGxhbnRpbiA9IHRydWU7XG4gIHRbXCJQbGFudGluIFNjaG9vbGJvb2tcIl0gPSB0cnVlO1xuICB0LlBsYXliaWxsID0gdHJ1ZTtcbiAgdFtcIlBvb3IgUmljaGFyZFwiXSA9IHRydWU7XG4gIHRbXCJSYXdsaW5zb24gUm9hZHdheVwiXSA9IHRydWU7XG4gIHQuUmVuYXVsdCA9IHRydWU7XG4gIHQuUmVxdWllbSA9IHRydWU7XG4gIHQuUm9ja3dlbGwgPSB0cnVlO1xuICB0LlJvbWFuID0gdHJ1ZTtcbiAgdFtcIlJvdGlzIFNlcmlmXCJdID0gdHJ1ZTtcbiAgdC5TYWJvbiA9IHRydWU7XG4gIHQuU2NhbGEgPSB0cnVlO1xuICB0LlNlYWd1bGwgPSB0cnVlO1xuICB0LlNpc3RpbmEgPSB0cnVlO1xuICB0LlNvdXZlbmlyID0gdHJ1ZTtcbiAgdC5TVElYID0gdHJ1ZTtcbiAgdFtcIlN0b25lIEluZm9ybWFsXCJdID0gdHJ1ZTtcbiAgdFtcIlN0b25lIFNlcmlmXCJdID0gdHJ1ZTtcbiAgdC5TeWxmYWVuID0gdHJ1ZTtcbiAgdC5UaW1lcyA9IHRydWU7XG4gIHQuVHJhamFuID0gdHJ1ZTtcbiAgdFtcIlRyaW5pdMOpXCJdID0gdHJ1ZTtcbiAgdFtcIlRydW1wIE1lZGlhZXZhbFwiXSA9IHRydWU7XG4gIHQuVXRvcGlhID0gdHJ1ZTtcbiAgdFtcIlZhbGUgVHlwZVwiXSA9IHRydWU7XG4gIHRbXCJCaXRzdHJlYW0gVmVyYVwiXSA9IHRydWU7XG4gIHRbXCJWZXJhIFNlcmlmXCJdID0gdHJ1ZTtcbiAgdC5WZXJzYWlsbGVzID0gdHJ1ZTtcbiAgdC5XYW50ZWQgPSB0cnVlO1xuICB0LldlaXNzID0gdHJ1ZTtcbiAgdFtcIldpZGUgTGF0aW5cIl0gPSB0cnVlO1xuICB0LldpbmRzb3IgPSB0cnVlO1xuICB0LlhJVFMgPSB0cnVlO1xufSk7XG5cbmNvbnN0IGdldFN5bWJvbHNGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0LkRpbmdiYXRzID0gdHJ1ZTtcbiAgdC5TeW1ib2wgPSB0cnVlO1xuICB0LlphcGZEaW5nYmF0cyA9IHRydWU7XG59KTtcblxuLy8gR2x5cGggbWFwIGZvciB3ZWxsLWtub3duIHN0YW5kYXJkIGZvbnRzLiBTb21ldGltZXMgR2hvc3RzY3JpcHQgdXNlcyBDSURcbi8vIGZvbnRzLCBidXQgZG9lcyBub3QgZW1iZWQgdGhlIENJRCB0byBHSUQgbWFwcGluZy4gVGhlIG1hcHBpbmcgaXMgaW5jb21wbGV0ZVxuLy8gZm9yIGFsbCBnbHlwaHMsIGJ1dCBjb21tb24gZm9yIHNvbWUgc2V0IG9mIHRoZSBzdGFuZGFyZCBmb250cy5cbmNvbnN0IGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0WzJdID0gMTA7XG4gIHRbM10gPSAzMjtcbiAgdFs0XSA9IDMzO1xuICB0WzVdID0gMzQ7XG4gIHRbNl0gPSAzNTtcbiAgdFs3XSA9IDM2O1xuICB0WzhdID0gMzc7XG4gIHRbOV0gPSAzODtcbiAgdFsxMF0gPSAzOTtcbiAgdFsxMV0gPSA0MDtcbiAgdFsxMl0gPSA0MTtcbiAgdFsxM10gPSA0MjtcbiAgdFsxNF0gPSA0MztcbiAgdFsxNV0gPSA0NDtcbiAgdFsxNl0gPSA0NTtcbiAgdFsxN10gPSA0NjtcbiAgdFsxOF0gPSA0NztcbiAgdFsxOV0gPSA0ODtcbiAgdFsyMF0gPSA0OTtcbiAgdFsyMV0gPSA1MDtcbiAgdFsyMl0gPSA1MTtcbiAgdFsyM10gPSA1MjtcbiAgdFsyNF0gPSA1MztcbiAgdFsyNV0gPSA1NDtcbiAgdFsyNl0gPSA1NTtcbiAgdFsyN10gPSA1NjtcbiAgdFsyOF0gPSA1NztcbiAgdFsyOV0gPSA1ODtcbiAgdFszMF0gPSA4OTQ7XG4gIHRbMzFdID0gNjA7XG4gIHRbMzJdID0gNjE7XG4gIHRbMzNdID0gNjI7XG4gIHRbMzRdID0gNjM7XG4gIHRbMzVdID0gNjQ7XG4gIHRbMzZdID0gNjU7XG4gIHRbMzddID0gNjY7XG4gIHRbMzhdID0gNjc7XG4gIHRbMzldID0gNjg7XG4gIHRbNDBdID0gNjk7XG4gIHRbNDFdID0gNzA7XG4gIHRbNDJdID0gNzE7XG4gIHRbNDNdID0gNzI7XG4gIHRbNDRdID0gNzM7XG4gIHRbNDVdID0gNzQ7XG4gIHRbNDZdID0gNzU7XG4gIHRbNDddID0gNzY7XG4gIHRbNDhdID0gNzc7XG4gIHRbNDldID0gNzg7XG4gIHRbNTBdID0gNzk7XG4gIHRbNTFdID0gODA7XG4gIHRbNTJdID0gODE7XG4gIHRbNTNdID0gODI7XG4gIHRbNTRdID0gODM7XG4gIHRbNTVdID0gODQ7XG4gIHRbNTZdID0gODU7XG4gIHRbNTddID0gODY7XG4gIHRbNThdID0gODc7XG4gIHRbNTldID0gODg7XG4gIHRbNjBdID0gODk7XG4gIHRbNjFdID0gOTA7XG4gIHRbNjJdID0gOTE7XG4gIHRbNjNdID0gOTI7XG4gIHRbNjRdID0gOTM7XG4gIHRbNjVdID0gOTQ7XG4gIHRbNjZdID0gOTU7XG4gIHRbNjddID0gOTY7XG4gIHRbNjhdID0gOTc7XG4gIHRbNjldID0gOTg7XG4gIHRbNzBdID0gOTk7XG4gIHRbNzFdID0gMTAwO1xuICB0WzcyXSA9IDEwMTtcbiAgdFs3M10gPSAxMDI7XG4gIHRbNzRdID0gMTAzO1xuICB0Wzc1XSA9IDEwNDtcbiAgdFs3Nl0gPSAxMDU7XG4gIHRbNzddID0gMTA2O1xuICB0Wzc4XSA9IDEwNztcbiAgdFs3OV0gPSAxMDg7XG4gIHRbODBdID0gMTA5O1xuICB0WzgxXSA9IDExMDtcbiAgdFs4Ml0gPSAxMTE7XG4gIHRbODNdID0gMTEyO1xuICB0Wzg0XSA9IDExMztcbiAgdFs4NV0gPSAxMTQ7XG4gIHRbODZdID0gMTE1O1xuICB0Wzg3XSA9IDExNjtcbiAgdFs4OF0gPSAxMTc7XG4gIHRbODldID0gMTE4O1xuICB0WzkwXSA9IDExOTtcbiAgdFs5MV0gPSAxMjA7XG4gIHRbOTJdID0gMTIxO1xuICB0WzkzXSA9IDEyMjtcbiAgdFs5NF0gPSAxMjM7XG4gIHRbOTVdID0gMTI0O1xuICB0Wzk2XSA9IDEyNTtcbiAgdFs5N10gPSAxMjY7XG4gIHRbOThdID0gMTk2O1xuICB0Wzk5XSA9IDE5NztcbiAgdFsxMDBdID0gMTk5O1xuICB0WzEwMV0gPSAyMDE7XG4gIHRbMTAyXSA9IDIwOTtcbiAgdFsxMDNdID0gMjE0O1xuICB0WzEwNF0gPSAyMjA7XG4gIHRbMTA1XSA9IDIyNTtcbiAgdFsxMDZdID0gMjI0O1xuICB0WzEwN10gPSAyMjY7XG4gIHRbMTA4XSA9IDIyODtcbiAgdFsxMDldID0gMjI3O1xuICB0WzExMF0gPSAyMjk7XG4gIHRbMTExXSA9IDIzMTtcbiAgdFsxMTJdID0gMjMzO1xuICB0WzExM10gPSAyMzI7XG4gIHRbMTE0XSA9IDIzNDtcbiAgdFsxMTVdID0gMjM1O1xuICB0WzExNl0gPSAyMzc7XG4gIHRbMTE3XSA9IDIzNjtcbiAgdFsxMThdID0gMjM4O1xuICB0WzExOV0gPSAyMzk7XG4gIHRbMTIwXSA9IDI0MTtcbiAgdFsxMjFdID0gMjQzO1xuICB0WzEyMl0gPSAyNDI7XG4gIHRbMTIzXSA9IDI0NDtcbiAgdFsxMjRdID0gMjQ2O1xuICB0WzEyNV0gPSAyNDU7XG4gIHRbMTI2XSA9IDI1MDtcbiAgdFsxMjddID0gMjQ5O1xuICB0WzEyOF0gPSAyNTE7XG4gIHRbMTI5XSA9IDI1MjtcbiAgdFsxMzBdID0gODIyNDtcbiAgdFsxMzFdID0gMTc2O1xuICB0WzEzMl0gPSAxNjI7XG4gIHRbMTMzXSA9IDE2MztcbiAgdFsxMzRdID0gMTY3O1xuICB0WzEzNV0gPSA4MjI2O1xuICB0WzEzNl0gPSAxODI7XG4gIHRbMTM3XSA9IDIyMztcbiAgdFsxMzhdID0gMTc0O1xuICB0WzEzOV0gPSAxNjk7XG4gIHRbMTQwXSA9IDg0ODI7XG4gIHRbMTQxXSA9IDE4MDtcbiAgdFsxNDJdID0gMTY4O1xuICB0WzE0M10gPSA4ODAwO1xuICB0WzE0NF0gPSAxOTg7XG4gIHRbMTQ1XSA9IDIxNjtcbiAgdFsxNDZdID0gODczNDtcbiAgdFsxNDddID0gMTc3O1xuICB0WzE0OF0gPSA4ODA0O1xuICB0WzE0OV0gPSA4ODA1O1xuICB0WzE1MF0gPSAxNjU7XG4gIHRbMTUxXSA9IDE4MTtcbiAgdFsxNTJdID0gODcwNjtcbiAgdFsxNTNdID0gODcyMTtcbiAgdFsxNTRdID0gODcxOTtcbiAgdFsxNTZdID0gODc0NztcbiAgdFsxNTddID0gMTcwO1xuICB0WzE1OF0gPSAxODY7XG4gIHRbMTU5XSA9IDg0ODY7XG4gIHRbMTYwXSA9IDIzMDtcbiAgdFsxNjFdID0gMjQ4O1xuICB0WzE2Ml0gPSAxOTE7XG4gIHRbMTYzXSA9IDE2MTtcbiAgdFsxNjRdID0gMTcyO1xuICB0WzE2NV0gPSA4NzMwO1xuICB0WzE2Nl0gPSA0MDI7XG4gIHRbMTY3XSA9IDg3NzY7XG4gIHRbMTY4XSA9IDg3MTA7XG4gIHRbMTY5XSA9IDE3MTtcbiAgdFsxNzBdID0gMTg3O1xuICB0WzE3MV0gPSA4MjMwO1xuICB0WzIxMF0gPSAyMTg7XG4gIHRbMjIzXSA9IDcxMTtcbiAgdFsyMjRdID0gMzIxO1xuICB0WzIyNV0gPSAzMjI7XG4gIHRbMjI3XSA9IDM1MztcbiAgdFsyMjldID0gMzgyO1xuICB0WzIzNF0gPSAyNTM7XG4gIHRbMjUyXSA9IDI2MztcbiAgdFsyNTNdID0gMjY4O1xuICB0WzI1NF0gPSAyNjk7XG4gIHRbMjU4XSA9IDI1ODtcbiAgdFsyNjBdID0gMjYwO1xuICB0WzI2MV0gPSAyNjE7XG4gIHRbMjY1XSA9IDI4MDtcbiAgdFsyNjZdID0gMjgxO1xuICB0WzI2OF0gPSAyODM7XG4gIHRbMjY5XSA9IDMxMztcbiAgdFsyNzVdID0gMzIzO1xuICB0WzI3Nl0gPSAzMjQ7XG4gIHRbMjc4XSA9IDMyODtcbiAgdFsyODRdID0gMzQ1O1xuICB0WzI4NV0gPSAzNDY7XG4gIHRbMjg2XSA9IDM0NztcbiAgdFsyOTJdID0gMzY3O1xuICB0WzI5NV0gPSAzNzc7XG4gIHRbMjk2XSA9IDM3ODtcbiAgdFsyOThdID0gMzgwO1xuICB0WzMwNV0gPSA5NjM7XG4gIHRbMzA2XSA9IDk2NDtcbiAgdFszMDddID0gOTY2O1xuICB0WzMwOF0gPSA4MjE1O1xuICB0WzMwOV0gPSA4MjUyO1xuICB0WzMxMF0gPSA4MzE5O1xuICB0WzMxMV0gPSA4MzU5O1xuICB0WzMxMl0gPSA4NTkyO1xuICB0WzMxM10gPSA4NTkzO1xuICB0WzMzN10gPSA5NTUyO1xuICB0WzQ5M10gPSAxMDM5O1xuICB0WzQ5NF0gPSAxMDQwO1xuICB0WzcwNV0gPSAxNTI0O1xuICB0WzcwNl0gPSA4MzYyO1xuICB0WzcxMF0gPSA2NDI4ODtcbiAgdFs3MTFdID0gNjQyOTg7XG4gIHRbNzU5XSA9IDE2MTc7XG4gIHRbNzYxXSA9IDE3NzY7XG4gIHRbNzYzXSA9IDE3Nzg7XG4gIHRbNzc1XSA9IDE2NTI7XG4gIHRbNzc3XSA9IDE3NjQ7XG4gIHRbNzc4XSA9IDE3ODA7XG4gIHRbNzc5XSA9IDE3ODE7XG4gIHRbNzgwXSA9IDE3ODI7XG4gIHRbNzgyXSA9IDc3MTtcbiAgdFs3ODNdID0gNjQ3MjY7XG4gIHRbNzg2XSA9IDgzNjM7XG4gIHRbNzg4XSA9IDg1MzI7XG4gIHRbNzkwXSA9IDc2ODtcbiAgdFs3OTFdID0gNzY5O1xuICB0Wzc5Ml0gPSA3Njg7XG4gIHRbNzk1XSA9IDgwMztcbiAgdFs3OTddID0gNjQzMzY7XG4gIHRbNzk4XSA9IDY0MzM3O1xuICB0Wzc5OV0gPSA2NDM0MjtcbiAgdFs4MDBdID0gNjQzNDM7XG4gIHRbODAxXSA9IDY0MzQ0O1xuICB0WzgwMl0gPSA2NDM0NTtcbiAgdFs4MDNdID0gNjQzNjI7XG4gIHRbODA0XSA9IDY0MzYzO1xuICB0WzgwNV0gPSA2NDM2NDtcbiAgdFsyNDI0XSA9IDc4MjE7XG4gIHRbMjQyNV0gPSA3ODIyO1xuICB0WzI0MjZdID0gNzgyMztcbiAgdFsyNDI3XSA9IDc4MjQ7XG4gIHRbMjQyOF0gPSA3ODI1O1xuICB0WzI0MjldID0gNzgyNjtcbiAgdFsyNDMwXSA9IDc4Mjc7XG4gIHRbMjQzM10gPSA3NjgyO1xuICB0WzI2NzhdID0gODA0NTtcbiAgdFsyNjc5XSA9IDgwNDY7XG4gIHRbMjgzMF0gPSAxNTUyO1xuICB0WzI4MzhdID0gNjg2O1xuICB0WzI4NDBdID0gNzUxO1xuICB0WzI4NDJdID0gNzUzO1xuICB0WzI4NDNdID0gNzU0O1xuICB0WzI4NDRdID0gNzU1O1xuICB0WzI4NDZdID0gNzU3O1xuICB0WzI4NTZdID0gNzY3O1xuICB0WzI4NTddID0gODQ4O1xuICB0WzI4NThdID0gODQ5O1xuICB0WzI4NjJdID0gODUzO1xuICB0WzI4NjNdID0gODU0O1xuICB0WzI4NjRdID0gODU1O1xuICB0WzI4NjVdID0gODYxO1xuICB0WzI4NjZdID0gODYyO1xuICB0WzI5MDZdID0gNzQ2MDtcbiAgdFsyOTA4XSA9IDc0NjI7XG4gIHRbMjkwOV0gPSA3NDYzO1xuICB0WzI5MTBdID0gNzQ2NDtcbiAgdFsyOTEyXSA9IDc0NjY7XG4gIHRbMjkxM10gPSA3NDY3O1xuICB0WzI5MTRdID0gNzQ2ODtcbiAgdFsyOTE2XSA9IDc0NzA7XG4gIHRbMjkxN10gPSA3NDcxO1xuICB0WzI5MThdID0gNzQ3MjtcbiAgdFsyOTIwXSA9IDc0NzQ7XG4gIHRbMjkyMV0gPSA3NDc1O1xuICB0WzI5MjJdID0gNzQ3NjtcbiAgdFsyOTI0XSA9IDc0Nzg7XG4gIHRbMjkyNV0gPSA3NDc5O1xuICB0WzI5MjZdID0gNzQ4MDtcbiAgdFsyOTI4XSA9IDc0ODI7XG4gIHRbMjkyOV0gPSA3NDgzO1xuICB0WzI5MzBdID0gNzQ4NDtcbiAgdFsyOTMyXSA9IDc0ODY7XG4gIHRbMjkzM10gPSA3NDg3O1xuICB0WzI5MzRdID0gNzQ4ODtcbiAgdFsyOTM2XSA9IDc0OTA7XG4gIHRbMjkzN10gPSA3NDkxO1xuICB0WzI5MzhdID0gNzQ5MjtcbiAgdFsyOTQwXSA9IDc0OTQ7XG4gIHRbMjk0MV0gPSA3NDk1O1xuICB0WzI5NDJdID0gNzQ5NjtcbiAgdFsyOTQ0XSA9IDc0OTg7XG4gIHRbMjk0Nl0gPSA3NTAwO1xuICB0WzI5NDhdID0gNzUwMjtcbiAgdFsyOTUwXSA9IDc1MDQ7XG4gIHRbMjk1MV0gPSA3NTA1O1xuICB0WzI5NTJdID0gNzUwNjtcbiAgdFsyOTU0XSA9IDc1MDg7XG4gIHRbMjk1NV0gPSA3NTA5O1xuICB0WzI5NTZdID0gNzUxMDtcbiAgdFsyOTU4XSA9IDc1MTI7XG4gIHRbMjk1OV0gPSA3NTEzO1xuICB0WzI5NjBdID0gNzUxNDtcbiAgdFsyOTYyXSA9IDc1MTY7XG4gIHRbMjk2M10gPSA3NTE3O1xuICB0WzI5NjRdID0gNzUxODtcbiAgdFsyOTY2XSA9IDc1MjA7XG4gIHRbMjk2N10gPSA3NTIxO1xuICB0WzI5NjhdID0gNzUyMjtcbiAgdFsyOTcwXSA9IDc1MjQ7XG4gIHRbMjk3MV0gPSA3NTI1O1xuICB0WzI5NzJdID0gNzUyNjtcbiAgdFsyOTc0XSA9IDc1Mjg7XG4gIHRbMjk3NV0gPSA3NTI5O1xuICB0WzI5NzZdID0gNzUzMDtcbiAgdFsyOTc4XSA9IDE1Mzc7XG4gIHRbMjk3OV0gPSAxNTM4O1xuICB0WzI5ODBdID0gMTUzOTtcbiAgdFsyOTgyXSA9IDE1NDk7XG4gIHRbMjk4M10gPSAxNTUxO1xuICB0WzI5ODRdID0gMTU1MjtcbiAgdFsyOTg2XSA9IDE1NTQ7XG4gIHRbMjk4N10gPSAxNTU1O1xuICB0WzI5ODhdID0gMTU1NjtcbiAgdFsyOTkwXSA9IDE2MjM7XG4gIHRbMjk5MV0gPSAxNjI0O1xuICB0WzI5OTVdID0gMTc3NTtcbiAgdFsyOTk5XSA9IDE3OTE7XG4gIHRbMzAwMl0gPSA2NDI5MDtcbiAgdFszMDAzXSA9IDY0MjkxO1xuICB0WzMwMDRdID0gNjQyOTI7XG4gIHRbMzAwNl0gPSA2NDI5NDtcbiAgdFszMDA3XSA9IDY0Mjk1O1xuICB0WzMwMDhdID0gNjQyOTY7XG4gIHRbMzAxMV0gPSAxOTAwO1xuICB0WzMwMTRdID0gODIyMztcbiAgdFszMDE1XSA9IDgyNDQ7XG4gIHRbMzAxN10gPSA3NTMyO1xuICB0WzMwMThdID0gNzUzMztcbiAgdFszMDE5XSA9IDc1MzQ7XG4gIHRbMzA3NV0gPSA3NTkwO1xuICB0WzMwNzZdID0gNzU5MTtcbiAgdFszMDc5XSA9IDc1OTQ7XG4gIHRbMzA4MF0gPSA3NTk1O1xuICB0WzMwODNdID0gNzU5ODtcbiAgdFszMDg0XSA9IDc1OTk7XG4gIHRbMzA4N10gPSA3NjAyO1xuICB0WzMwODhdID0gNzYwMztcbiAgdFszMDkxXSA9IDc2MDY7XG4gIHRbMzA5Ml0gPSA3NjA3O1xuICB0WzMwOTVdID0gNzYxMDtcbiAgdFszMDk2XSA9IDc2MTE7XG4gIHRbMzA5OV0gPSA3NjE0O1xuICB0WzMxMDBdID0gNzYxNTtcbiAgdFszMTAzXSA9IDc2MTg7XG4gIHRbMzEwNF0gPSA3NjE5O1xuICB0WzMxMDddID0gODMzNztcbiAgdFszMTA4XSA9IDgzMzg7XG4gIHRbMzExNl0gPSAxODg0O1xuICB0WzMxMTldID0gMTg4NTtcbiAgdFszMTIwXSA9IDE4ODU7XG4gIHRbMzEyM10gPSAxODg2O1xuICB0WzMxMjRdID0gMTg4NjtcbiAgdFszMTI3XSA9IDE4ODc7XG4gIHRbMzEyOF0gPSAxODg3O1xuICB0WzMxMzFdID0gMTg4ODtcbiAgdFszMTMyXSA9IDE4ODg7XG4gIHRbMzEzNV0gPSAxODg5O1xuICB0WzMxMzZdID0gMTg4OTtcbiAgdFszMTM5XSA9IDE4OTA7XG4gIHRbMzE0MF0gPSAxODkwO1xuICB0WzMxNDNdID0gMTg5MTtcbiAgdFszMTQ0XSA9IDE4OTE7XG4gIHRbMzE0N10gPSAxODkyO1xuICB0WzMxNDhdID0gMTg5MjtcbiAgdFszMTUzXSA9IDU4MDtcbiAgdFszMTU0XSA9IDU4MTtcbiAgdFszMTU3XSA9IDU4NDtcbiAgdFszMTU4XSA9IDU4NTtcbiAgdFszMTYxXSA9IDU4ODtcbiAgdFszMTYyXSA9IDU4OTtcbiAgdFszMTY1XSA9IDg5MTtcbiAgdFszMTY2XSA9IDg5MjtcbiAgdFszMTY5XSA9IDEyNzQ7XG4gIHRbMzE3MF0gPSAxMjc1O1xuICB0WzMxNzNdID0gMTI3ODtcbiAgdFszMTc0XSA9IDEyNzk7XG4gIHRbMzE4MV0gPSA3NjIyO1xuICB0WzMxODJdID0gNzYyMztcbiAgdFszMjgyXSA9IDExNzk5O1xuICB0WzMzMTZdID0gNTc4O1xuICB0WzMzNzldID0gNDI3ODU7XG4gIHRbMzM5M10gPSAxMTU5O1xuICB0WzM0MTZdID0gODM3Nztcbn0pO1xuXG4vLyBUaGUgZ2x5cGggbWFwIGZvciBBcmlhbEJsYWNrIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aGUgZ2x5cGggbWFwIHVzZWQgZm9yXG4vLyBvdGhlciB3ZWxsLWtub3duIHN0YW5kYXJkIGZvbnRzLiBIZW5jZSB3ZSB1c2UgdGhpcyAoaW5jb21wbGV0ZSkgQ0lEIHRvIEdJRFxuLy8gbWFwcGluZyB0byBhZGp1c3QgdGhlIGdseXBoIG1hcCBmb3Igbm9uLWVtYmVkZGVkIEFyaWFsQmxhY2sgZm9udHMuXG5jb25zdCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKFxuICB0XG4pIHtcbiAgdFsyMjddID0gMzIyO1xuICB0WzI2NF0gPSAyNjE7XG4gIHRbMjkxXSA9IDM0Njtcbn0pO1xuXG4vLyBUaGUgZ2x5cGggbWFwIGZvciBDYWxpYnJpIChhIFdpbmRvd3MgZm9udCkgZGlmZmVycyBmcm9tIHRoZSBnbHlwaCBtYXAgdXNlZFxuLy8gaW4gdGhlIHN0YW5kYXJkIGZvbnRzLiBIZW5jZSB3ZSB1c2UgdGhpcyAoaW5jb21wbGV0ZSkgQ0lEIHRvIEdJRCBtYXBwaW5nIHRvXG4vLyBhZGp1c3QgdGhlIGdseXBoIG1hcCBmb3Igbm9uLWVtYmVkZGVkIENhbGlicmkgZm9udHMuXG5jb25zdCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHtcbiAgdFsxXSA9IDMyO1xuICB0WzRdID0gNjU7XG4gIHRbMTddID0gNjY7XG4gIHRbMThdID0gNjc7XG4gIHRbMjRdID0gNjg7XG4gIHRbMjhdID0gNjk7XG4gIHRbMzhdID0gNzA7XG4gIHRbMzldID0gNzE7XG4gIHRbNDRdID0gNzI7XG4gIHRbNDddID0gNzM7XG4gIHRbNThdID0gNzQ7XG4gIHRbNjBdID0gNzU7XG4gIHRbNjJdID0gNzY7XG4gIHRbNjhdID0gNzc7XG4gIHRbNjldID0gNzg7XG4gIHRbNzVdID0gNzk7XG4gIHRbODddID0gODA7XG4gIHRbODldID0gODE7XG4gIHRbOTBdID0gODI7XG4gIHRbOTRdID0gODM7XG4gIHRbMTAwXSA9IDg0O1xuICB0WzEwNF0gPSA4NTtcbiAgdFsxMTVdID0gODY7XG4gIHRbMTE2XSA9IDg3O1xuICB0WzEyMV0gPSA4ODtcbiAgdFsxMjJdID0gODk7XG4gIHRbMTI3XSA9IDkwO1xuICB0WzI1OF0gPSA5NztcbiAgdFsyNjhdID0gMjYxO1xuICB0WzI3MV0gPSA5ODtcbiAgdFsyNzJdID0gOTk7XG4gIHRbMjczXSA9IDI2MztcbiAgdFsyODJdID0gMTAwO1xuICB0WzI4Nl0gPSAxMDE7XG4gIHRbMjk1XSA9IDI4MTtcbiAgdFsyOTZdID0gMTAyO1xuICB0WzMzNl0gPSAxMDM7XG4gIHRbMzQ2XSA9IDEwNDtcbiAgdFszNDldID0gMTA1O1xuICB0WzM2MV0gPSAxMDY7XG4gIHRbMzY0XSA9IDEwNztcbiAgdFszNjddID0gMTA4O1xuICB0WzM3MV0gPSAzMjI7XG4gIHRbMzczXSA9IDEwOTtcbiAgdFszNzRdID0gMTEwO1xuICB0WzM4MV0gPSAxMTE7XG4gIHRbMzgzXSA9IDI0MztcbiAgdFszOTNdID0gMTEyO1xuICB0WzM5NV0gPSAxMTM7XG4gIHRbMzk2XSA9IDExNDtcbiAgdFs0MDBdID0gMTE1O1xuICB0WzQwMV0gPSAzNDc7XG4gIHRbNDEwXSA9IDExNjtcbiAgdFs0MzddID0gMTE3O1xuICB0WzQ0OF0gPSAxMTg7XG4gIHRbNDQ5XSA9IDExOTtcbiAgdFs0NTRdID0gMTIwO1xuICB0WzQ1NV0gPSAxMjE7XG4gIHRbNDYwXSA9IDEyMjtcbiAgdFs0NjNdID0gMzgwO1xuICB0Wzg1M10gPSA0NDtcbiAgdFs4NTVdID0gNTg7XG4gIHRbODU2XSA9IDQ2O1xuICB0Wzg3Nl0gPSA0NztcbiAgdFs4NzhdID0gNDU7XG4gIHRbODgyXSA9IDQ1O1xuICB0Wzg5NF0gPSA0MDtcbiAgdFs4OTVdID0gNDE7XG4gIHRbODk2XSA9IDkxO1xuICB0Wzg5N10gPSA5MztcbiAgdFs5MjNdID0gNjQ7XG4gIHRbMTAwNF0gPSA0ODtcbiAgdFsxMDA1XSA9IDQ5O1xuICB0WzEwMDZdID0gNTA7XG4gIHRbMTAwN10gPSA1MTtcbiAgdFsxMDA4XSA9IDUyO1xuICB0WzEwMDldID0gNTM7XG4gIHRbMTAxMF0gPSA1NDtcbiAgdFsxMDExXSA9IDU1O1xuICB0WzEwMTJdID0gNTY7XG4gIHRbMTAxM10gPSA1NztcbiAgdFsxMDgxXSA9IDM3O1xuICB0WzEwODVdID0gNDM7XG4gIHRbMTA4Nl0gPSA0NTtcbn0pO1xuXG5leHBvcnQge1xuICBnZXRTdGRGb250TWFwLFxuICBnZXROb25TdGRGb250TWFwLFxuICBnZXRTZXJpZkZvbnRzLFxuICBnZXRTeW1ib2xzRm9udHMsXG4gIGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyxcbiAgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrLFxuICBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmksXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTYgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBuby1iYWJlbC1wcmVzZXQgKi9cblxudmFyIGdldExvb2t1cFRhYmxlRmFjdG9yeSA9IHJlcXVpcmUoXCIuL2NvcmVfdXRpbHMuanNcIikuZ2V0TG9va3VwVGFibGVGYWN0b3J5O1xuXG4vLyBTb21lIGNoYXJhY3RlcnMsIGUuZy4gY29weXJpZ2h0c2VyaWYsIGFyZSBtYXBwZWQgdG8gdGhlIHByaXZhdGUgdXNlIGFyZWFcbi8vIGFuZCBtaWdodCBub3QgYmUgZGlzcGxheWVkIHVzaW5nIHN0YW5kYXJkIGZvbnRzLiBNYXBwaW5nL2hhY2tpbmcgd2VsbC1rbm93blxuLy8gY2hhcnMgdG8gdGhlIHNpbWlsYXIgZXF1aXZhbGVudHMgaW4gdGhlIG5vcm1hbCBjaGFyYWN0ZXJzIHJhbmdlLlxudmFyIGdldFNwZWNpYWxQVUFTeW1ib2xzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gIHRbNjM3MjFdID0gMHgwMGE5OyAvLyBjb3B5cmlnaHRzYW5zICgweEY4RTkpID0+IGNvcHlyaWdodFxuICB0WzYzMTkzXSA9IDB4MDBhOTsgLy8gY29weXJpZ2h0c2VyaWYgKDB4RjZEOSkgPT4gY29weXJpZ2h0XG4gIHRbNjM3MjBdID0gMHgwMGFlOyAvLyByZWdpc3RlcnNhbnMgKDB4RjhFOCkgPT4gcmVnaXN0ZXJlZFxuICB0WzYzMTk0XSA9IDB4MDBhZTsgLy8gcmVnaXN0ZXJzZXJpZiAoMHhGNkRBKSA9PiByZWdpc3RlcmVkXG4gIHRbNjM3MjJdID0gMHgyMTIyOyAvLyB0cmFkZW1hcmtzYW5zICgweEY4RUEpID0+IHRyYWRlbWFya1xuICB0WzYzMTk1XSA9IDB4MjEyMjsgLy8gdHJhZGVtYXJrc2VyaWYgKDB4RjZEQikgPT4gdHJhZGVtYXJrXG4gIHRbNjM3MjldID0gMHgyM2E3OyAvLyBicmFjZWxlZnR0cCAoMHhGOEYxKVxuICB0WzYzNzMwXSA9IDB4MjNhODsgLy8gYnJhY2VsZWZ0bWlkICgweEY4RjIpXG4gIHRbNjM3MzFdID0gMHgyM2E5OyAvLyBicmFjZWxlZnRidCAoMHhGOEYzKVxuICB0WzYzNzQwXSA9IDB4MjNhYjsgLy8gYnJhY2VyaWdodHRwICgweEY4RkMpXG4gIHRbNjM3NDFdID0gMHgyM2FjOyAvLyBicmFjZXJpZ2h0bWlkICgweEY4RkQpXG4gIHRbNjM3NDJdID0gMHgyM2FkOyAvLyBicmFjZXJpZ2h0YnQgKDB4RjhGRSlcbiAgdFs2MzcyNl0gPSAweDIzYTE7IC8vIGJyYWNrZXRsZWZ0dHAgKDB4RjhFRSlcbiAgdFs2MzcyN10gPSAweDIzYTI7IC8vIGJyYWNrZXRsZWZ0ZXggKDB4RjhFRilcbiAgdFs2MzcyOF0gPSAweDIzYTM7IC8vIGJyYWNrZXRsZWZ0YnQgKDB4RjhGMClcbiAgdFs2MzczN10gPSAweDIzYTQ7IC8vIGJyYWNrZXRyaWdodHRwICgweEY4RjkpXG4gIHRbNjM3MzhdID0gMHgyM2E1OyAvLyBicmFja2V0cmlnaHRleCAoMHhGOEZBKVxuICB0WzYzNzM5XSA9IDB4MjNhNjsgLy8gYnJhY2tldHJpZ2h0YnQgKDB4RjhGQilcbiAgdFs2MzcyM10gPSAweDIzOWI7IC8vIHBhcmVubGVmdHRwICgweEY4RUIpXG4gIHRbNjM3MjRdID0gMHgyMzljOyAvLyBwYXJlbmxlZnRleCAoMHhGOEVDKVxuICB0WzYzNzI1XSA9IDB4MjM5ZDsgLy8gcGFyZW5sZWZ0YnQgKDB4RjhFRClcbiAgdFs2MzczNF0gPSAweDIzOWU7IC8vIHBhcmVucmlnaHR0cCAoMHhGOEY2KVxuICB0WzYzNzM1XSA9IDB4MjM5ZjsgLy8gcGFyZW5yaWdodGV4ICgweEY4RjcpXG4gIHRbNjM3MzZdID0gMHgyM2EwOyAvLyBwYXJlbnJpZ2h0YnQgKDB4RjhGOClcbn0pO1xuXG5mdW5jdGlvbiBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhjb2RlKSB7XG4gIGlmIChjb2RlID49IDB4ZmZmMCAmJiBjb2RlIDw9IDB4ZmZmZikge1xuICAgIC8vIFNwZWNpYWxzIHVuaWNvZGUgYmxvY2suXG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAoY29kZSA+PSAweGY2MDAgJiYgY29kZSA8PSAweGY4ZmYpIHtcbiAgICByZXR1cm4gZ2V0U3BlY2lhbFBVQVN5bWJvbHMoKVtjb2RlXSB8fCBjb2RlO1xuICB9IGVsc2UgaWYgKGNvZGUgPT09IC8qIHNvZnRoeXBoZW4gPSAqLyAweDAwYWQpIHtcbiAgICByZXR1cm4gMHgwMDJkOyAvLyBoeXBoZW5cbiAgfVxuICByZXR1cm4gY29kZTtcbn1cblxuZnVuY3Rpb24gZ2V0VW5pY29kZUZvckdseXBoKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApIHtcbiAgdmFyIHVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW25hbWVdO1xuICBpZiAodW5pY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuaWNvZGU7XG4gIH1cbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8vIFRyeSB0byByZWNvdmVyIHZhbGlkIFVuaWNvZGUgdmFsdWVzIGZyb20gJ3VuaVhYWFgnLyd1WFhYWHtYWH0nIGdseXBocy5cbiAgaWYgKG5hbWVbMF0gPT09IFwidVwiKSB7XG4gICAgdmFyIG5hbWVMZW4gPSBuYW1lLmxlbmd0aCxcbiAgICAgIGhleFN0cjtcblxuICAgIGlmIChuYW1lTGVuID09PSA3ICYmIG5hbWVbMV0gPT09IFwiblwiICYmIG5hbWVbMl0gPT09IFwiaVwiKSB7XG4gICAgICAvLyAndW5pWFhYWCdcbiAgICAgIGhleFN0ciA9IG5hbWUuc3Vic3RyaW5nKDMpO1xuICAgIH0gZWxzZSBpZiAobmFtZUxlbiA+PSA1ICYmIG5hbWVMZW4gPD0gNykge1xuICAgICAgLy8gJ3VYWFhYe1hYfSdcbiAgICAgIGhleFN0ciA9IG5hbWUuc3Vic3RyaW5nKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciB1cHBlci1jYXNlIGhleGFkZWNpbWFsIGNoYXJhY3RlcnMsIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcy5cbiAgICBpZiAoaGV4U3RyID09PSBoZXhTdHIudG9VcHBlckNhc2UoKSkge1xuICAgICAgdW5pY29kZSA9IHBhcnNlSW50KGhleFN0ciwgMTYpO1xuICAgICAgaWYgKHVuaWNvZGUgPj0gMCkge1xuICAgICAgICByZXR1cm4gdW5pY29kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG52YXIgVW5pY29kZVJhbmdlcyA9IFtcbiAgeyBiZWdpbjogMHgwMDAwLCBlbmQ6IDB4MDA3ZiB9LCAvLyBCYXNpYyBMYXRpblxuICB7IGJlZ2luOiAweDAwODAsIGVuZDogMHgwMGZmIH0sIC8vIExhdGluLTEgU3VwcGxlbWVudFxuICB7IGJlZ2luOiAweDAxMDAsIGVuZDogMHgwMTdmIH0sIC8vIExhdGluIEV4dGVuZGVkLUFcbiAgeyBiZWdpbjogMHgwMTgwLCBlbmQ6IDB4MDI0ZiB9LCAvLyBMYXRpbiBFeHRlbmRlZC1CXG4gIHsgYmVnaW46IDB4MDI1MCwgZW5kOiAweDAyYWYgfSwgLy8gSVBBIEV4dGVuc2lvbnNcbiAgeyBiZWdpbjogMHgwMmIwLCBlbmQ6IDB4MDJmZiB9LCAvLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnNcbiAgeyBiZWdpbjogMHgwMzAwLCBlbmQ6IDB4MDM2ZiB9LCAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3NcbiAgeyBiZWdpbjogMHgwMzcwLCBlbmQ6IDB4MDNmZiB9LCAvLyBHcmVlayBhbmQgQ29wdGljXG4gIHsgYmVnaW46IDB4MmM4MCwgZW5kOiAweDJjZmYgfSwgLy8gQ29wdGljXG4gIHsgYmVnaW46IDB4MDQwMCwgZW5kOiAweDA0ZmYgfSwgLy8gQ3lyaWxsaWNcbiAgeyBiZWdpbjogMHgwNTMwLCBlbmQ6IDB4MDU4ZiB9LCAvLyBBcm1lbmlhblxuICB7IGJlZ2luOiAweDA1OTAsIGVuZDogMHgwNWZmIH0sIC8vIEhlYnJld1xuICB7IGJlZ2luOiAweGE1MDAsIGVuZDogMHhhNjNmIH0sIC8vIFZhaVxuICB7IGJlZ2luOiAweDA2MDAsIGVuZDogMHgwNmZmIH0sIC8vIEFyYWJpY1xuICB7IGJlZ2luOiAweDA3YzAsIGVuZDogMHgwN2ZmIH0sIC8vIE5Lb1xuICB7IGJlZ2luOiAweDA5MDAsIGVuZDogMHgwOTdmIH0sIC8vIERldmFuYWdhcmlcbiAgeyBiZWdpbjogMHgwOTgwLCBlbmQ6IDB4MDlmZiB9LCAvLyBCZW5nYWxpXG4gIHsgYmVnaW46IDB4MGEwMCwgZW5kOiAweDBhN2YgfSwgLy8gR3VybXVraGlcbiAgeyBiZWdpbjogMHgwYTgwLCBlbmQ6IDB4MGFmZiB9LCAvLyBHdWphcmF0aVxuICB7IGJlZ2luOiAweDBiMDAsIGVuZDogMHgwYjdmIH0sIC8vIE9yaXlhXG4gIHsgYmVnaW46IDB4MGI4MCwgZW5kOiAweDBiZmYgfSwgLy8gVGFtaWxcbiAgeyBiZWdpbjogMHgwYzAwLCBlbmQ6IDB4MGM3ZiB9LCAvLyBUZWx1Z3VcbiAgeyBiZWdpbjogMHgwYzgwLCBlbmQ6IDB4MGNmZiB9LCAvLyBLYW5uYWRhXG4gIHsgYmVnaW46IDB4MGQwMCwgZW5kOiAweDBkN2YgfSwgLy8gTWFsYXlhbGFtXG4gIHsgYmVnaW46IDB4MGUwMCwgZW5kOiAweDBlN2YgfSwgLy8gVGhhaVxuICB7IGJlZ2luOiAweDBlODAsIGVuZDogMHgwZWZmIH0sIC8vIExhb1xuICB7IGJlZ2luOiAweDEwYTAsIGVuZDogMHgxMGZmIH0sIC8vIEdlb3JnaWFuXG4gIHsgYmVnaW46IDB4MWIwMCwgZW5kOiAweDFiN2YgfSwgLy8gQmFsaW5lc2VcbiAgeyBiZWdpbjogMHgxMTAwLCBlbmQ6IDB4MTFmZiB9LCAvLyBIYW5ndWwgSmFtb1xuICB7IGJlZ2luOiAweDFlMDAsIGVuZDogMHgxZWZmIH0sIC8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWxcbiAgeyBiZWdpbjogMHgxZjAwLCBlbmQ6IDB4MWZmZiB9LCAvLyBHcmVlayBFeHRlbmRlZFxuICB7IGJlZ2luOiAweDIwMDAsIGVuZDogMHgyMDZmIH0sIC8vIEdlbmVyYWwgUHVuY3R1YXRpb25cbiAgeyBiZWdpbjogMHgyMDcwLCBlbmQ6IDB4MjA5ZiB9LCAvLyBTdXBlcnNjcmlwdHMgQW5kIFN1YnNjcmlwdHNcbiAgeyBiZWdpbjogMHgyMGEwLCBlbmQ6IDB4MjBjZiB9LCAvLyBDdXJyZW5jeSBTeW1ib2xcbiAgeyBiZWdpbjogMHgyMGQwLCBlbmQ6IDB4MjBmZiB9LCAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3NcbiAgeyBiZWdpbjogMHgyMTAwLCBlbmQ6IDB4MjE0ZiB9LCAvLyBMZXR0ZXJsaWtlIFN5bWJvbHNcbiAgeyBiZWdpbjogMHgyMTUwLCBlbmQ6IDB4MjE4ZiB9LCAvLyBOdW1iZXIgRm9ybXNcbiAgeyBiZWdpbjogMHgyMTkwLCBlbmQ6IDB4MjFmZiB9LCAvLyBBcnJvd3NcbiAgeyBiZWdpbjogMHgyMjAwLCBlbmQ6IDB4MjJmZiB9LCAvLyBNYXRoZW1hdGljYWwgT3BlcmF0b3JzXG4gIHsgYmVnaW46IDB4MjMwMCwgZW5kOiAweDIzZmYgfSwgLy8gTWlzY2VsbGFuZW91cyBUZWNobmljYWxcbiAgeyBiZWdpbjogMHgyNDAwLCBlbmQ6IDB4MjQzZiB9LCAvLyBDb250cm9sIFBpY3R1cmVzXG4gIHsgYmVnaW46IDB4MjQ0MCwgZW5kOiAweDI0NWYgfSwgLy8gT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb25cbiAgeyBiZWdpbjogMHgyNDYwLCBlbmQ6IDB4MjRmZiB9LCAvLyBFbmNsb3NlZCBBbHBoYW51bWVyaWNzXG4gIHsgYmVnaW46IDB4MjUwMCwgZW5kOiAweDI1N2YgfSwgLy8gQm94IERyYXdpbmdcbiAgeyBiZWdpbjogMHgyNTgwLCBlbmQ6IDB4MjU5ZiB9LCAvLyBCbG9jayBFbGVtZW50c1xuICB7IGJlZ2luOiAweDI1YTAsIGVuZDogMHgyNWZmIH0sIC8vIEdlb21ldHJpYyBTaGFwZXNcbiAgeyBiZWdpbjogMHgyNjAwLCBlbmQ6IDB4MjZmZiB9LCAvLyBNaXNjZWxsYW5lb3VzIFN5bWJvbHNcbiAgeyBiZWdpbjogMHgyNzAwLCBlbmQ6IDB4MjdiZiB9LCAvLyBEaW5nYmF0c1xuICB7IGJlZ2luOiAweDMwMDAsIGVuZDogMHgzMDNmIH0sIC8vIENKSyBTeW1ib2xzIEFuZCBQdW5jdHVhdGlvblxuICB7IGJlZ2luOiAweDMwNDAsIGVuZDogMHgzMDlmIH0sIC8vIEhpcmFnYW5hXG4gIHsgYmVnaW46IDB4MzBhMCwgZW5kOiAweDMwZmYgfSwgLy8gS2F0YWthbmFcbiAgeyBiZWdpbjogMHgzMTAwLCBlbmQ6IDB4MzEyZiB9LCAvLyBCb3BvbW9mb1xuICB7IGJlZ2luOiAweDMxMzAsIGVuZDogMHgzMThmIH0sIC8vIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW9cbiAgeyBiZWdpbjogMHhhODQwLCBlbmQ6IDB4YTg3ZiB9LCAvLyBQaGFncy1wYVxuICB7IGJlZ2luOiAweDMyMDAsIGVuZDogMHgzMmZmIH0sIC8vIEVuY2xvc2VkIENKSyBMZXR0ZXJzIEFuZCBNb250aHNcbiAgeyBiZWdpbjogMHgzMzAwLCBlbmQ6IDB4MzNmZiB9LCAvLyBDSksgQ29tcGF0aWJpbGl0eVxuICB7IGJlZ2luOiAweGFjMDAsIGVuZDogMHhkN2FmIH0sIC8vIEhhbmd1bCBTeWxsYWJsZXNcbiAgeyBiZWdpbjogMHhkODAwLCBlbmQ6IDB4ZGZmZiB9LCAvLyBOb24tUGxhbmUgMCAqXG4gIHsgYmVnaW46IDB4MTA5MDAsIGVuZDogMHgxMDkxZiB9LCAvLyBQaG9lbmljaWFcbiAgeyBiZWdpbjogMHg0ZTAwLCBlbmQ6IDB4OWZmZiB9LCAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzXG4gIHsgYmVnaW46IDB4ZTAwMCwgZW5kOiAweGY4ZmYgfSwgLy8gUHJpdmF0ZSBVc2UgQXJlYSAocGxhbmUgMClcbiAgeyBiZWdpbjogMHgzMWMwLCBlbmQ6IDB4MzFlZiB9LCAvLyBDSksgU3Ryb2tlc1xuICB7IGJlZ2luOiAweGZiMDAsIGVuZDogMHhmYjRmIH0sIC8vIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zXG4gIHsgYmVnaW46IDB4ZmI1MCwgZW5kOiAweGZkZmYgfSwgLy8gQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BXG4gIHsgYmVnaW46IDB4ZmUyMCwgZW5kOiAweGZlMmYgfSwgLy8gQ29tYmluaW5nIEhhbGYgTWFya3NcbiAgeyBiZWdpbjogMHhmZTEwLCBlbmQ6IDB4ZmUxZiB9LCAvLyBWZXJ0aWNhbCBGb3Jtc1xuICB7IGJlZ2luOiAweGZlNTAsIGVuZDogMHhmZTZmIH0sIC8vIFNtYWxsIEZvcm0gVmFyaWFudHNcbiAgeyBiZWdpbjogMHhmZTcwLCBlbmQ6IDB4ZmVmZiB9LCAvLyBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUJcbiAgeyBiZWdpbjogMHhmZjAwLCBlbmQ6IDB4ZmZlZiB9LCAvLyBIYWxmd2lkdGggQW5kIEZ1bGx3aWR0aCBGb3Jtc1xuICB7IGJlZ2luOiAweGZmZjAsIGVuZDogMHhmZmZmIH0sIC8vIFNwZWNpYWxzXG4gIHsgYmVnaW46IDB4MGYwMCwgZW5kOiAweDBmZmYgfSwgLy8gVGliZXRhblxuICB7IGJlZ2luOiAweDA3MDAsIGVuZDogMHgwNzRmIH0sIC8vIFN5cmlhY1xuICB7IGJlZ2luOiAweDA3ODAsIGVuZDogMHgwN2JmIH0sIC8vIFRoYWFuYVxuICB7IGJlZ2luOiAweDBkODAsIGVuZDogMHgwZGZmIH0sIC8vIFNpbmhhbGFcbiAgeyBiZWdpbjogMHgxMDAwLCBlbmQ6IDB4MTA5ZiB9LCAvLyBNeWFubWFyXG4gIHsgYmVnaW46IDB4MTIwMCwgZW5kOiAweDEzN2YgfSwgLy8gRXRoaW9waWNcbiAgeyBiZWdpbjogMHgxM2EwLCBlbmQ6IDB4MTNmZiB9LCAvLyBDaGVyb2tlZVxuICB7IGJlZ2luOiAweDE0MDAsIGVuZDogMHgxNjdmIH0sIC8vIFVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3NcbiAgeyBiZWdpbjogMHgxNjgwLCBlbmQ6IDB4MTY5ZiB9LCAvLyBPZ2hhbVxuICB7IGJlZ2luOiAweDE2YTAsIGVuZDogMHgxNmZmIH0sIC8vIFJ1bmljXG4gIHsgYmVnaW46IDB4MTc4MCwgZW5kOiAweDE3ZmYgfSwgLy8gS2htZXJcbiAgeyBiZWdpbjogMHgxODAwLCBlbmQ6IDB4MThhZiB9LCAvLyBNb25nb2xpYW5cbiAgeyBiZWdpbjogMHgyODAwLCBlbmQ6IDB4MjhmZiB9LCAvLyBCcmFpbGxlIFBhdHRlcm5zXG4gIHsgYmVnaW46IDB4YTAwMCwgZW5kOiAweGE0OGYgfSwgLy8gWWkgU3lsbGFibGVzXG4gIHsgYmVnaW46IDB4MTcwMCwgZW5kOiAweDE3MWYgfSwgLy8gVGFnYWxvZ1xuICB7IGJlZ2luOiAweDEwMzAwLCBlbmQ6IDB4MTAzMmYgfSwgLy8gT2xkIEl0YWxpY1xuICB7IGJlZ2luOiAweDEwMzMwLCBlbmQ6IDB4MTAzNGYgfSwgLy8gR290aGljXG4gIHsgYmVnaW46IDB4MTA0MDAsIGVuZDogMHgxMDQ0ZiB9LCAvLyBEZXNlcmV0XG4gIHsgYmVnaW46IDB4MWQwMDAsIGVuZDogMHgxZDBmZiB9LCAvLyBCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzXG4gIHsgYmVnaW46IDB4MWQ0MDAsIGVuZDogMHgxZDdmZiB9LCAvLyBNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHNcbiAgeyBiZWdpbjogMHhmZjAwMCwgZW5kOiAweGZmZmZkIH0sIC8vIFByaXZhdGUgVXNlIChwbGFuZSAxNSlcbiAgeyBiZWdpbjogMHhmZTAwLCBlbmQ6IDB4ZmUwZiB9LCAvLyBWYXJpYXRpb24gU2VsZWN0b3JzXG4gIHsgYmVnaW46IDB4ZTAwMDAsIGVuZDogMHhlMDA3ZiB9LCAvLyBUYWdzXG4gIHsgYmVnaW46IDB4MTkwMCwgZW5kOiAweDE5NGYgfSwgLy8gTGltYnVcbiAgeyBiZWdpbjogMHgxOTUwLCBlbmQ6IDB4MTk3ZiB9LCAvLyBUYWkgTGVcbiAgeyBiZWdpbjogMHgxOTgwLCBlbmQ6IDB4MTlkZiB9LCAvLyBOZXcgVGFpIEx1ZVxuICB7IGJlZ2luOiAweDFhMDAsIGVuZDogMHgxYTFmIH0sIC8vIEJ1Z2luZXNlXG4gIHsgYmVnaW46IDB4MmMwMCwgZW5kOiAweDJjNWYgfSwgLy8gR2xhZ29saXRpY1xuICB7IGJlZ2luOiAweDJkMzAsIGVuZDogMHgyZDdmIH0sIC8vIFRpZmluYWdoXG4gIHsgYmVnaW46IDB4NGRjMCwgZW5kOiAweDRkZmYgfSwgLy8gWWlqaW5nIEhleGFncmFtIFN5bWJvbHNcbiAgeyBiZWdpbjogMHhhODAwLCBlbmQ6IDB4YTgyZiB9LCAvLyBTeWxvdGkgTmFncmlcbiAgeyBiZWdpbjogMHgxMDAwMCwgZW5kOiAweDEwMDdmIH0sIC8vIExpbmVhciBCIFN5bGxhYmFyeVxuICB7IGJlZ2luOiAweDEwMTQwLCBlbmQ6IDB4MTAxOGYgfSwgLy8gQW5jaWVudCBHcmVlayBOdW1iZXJzXG4gIHsgYmVnaW46IDB4MTAzODAsIGVuZDogMHgxMDM5ZiB9LCAvLyBVZ2FyaXRpY1xuICB7IGJlZ2luOiAweDEwM2EwLCBlbmQ6IDB4MTAzZGYgfSwgLy8gT2xkIFBlcnNpYW5cbiAgeyBiZWdpbjogMHgxMDQ1MCwgZW5kOiAweDEwNDdmIH0sIC8vIFNoYXZpYW5cbiAgeyBiZWdpbjogMHgxMDQ4MCwgZW5kOiAweDEwNGFmIH0sIC8vIE9zbWFueWFcbiAgeyBiZWdpbjogMHgxMDgwMCwgZW5kOiAweDEwODNmIH0sIC8vIEN5cHJpb3QgU3lsbGFiYXJ5XG4gIHsgYmVnaW46IDB4MTBhMDAsIGVuZDogMHgxMGE1ZiB9LCAvLyBLaGFyb3NodGhpXG4gIHsgYmVnaW46IDB4MWQzMDAsIGVuZDogMHgxZDM1ZiB9LCAvLyBUYWkgWHVhbiBKaW5nIFN5bWJvbHNcbiAgeyBiZWdpbjogMHgxMjAwMCwgZW5kOiAweDEyM2ZmIH0sIC8vIEN1bmVpZm9ybVxuICB7IGJlZ2luOiAweDFkMzYwLCBlbmQ6IDB4MWQzN2YgfSwgLy8gQ291bnRpbmcgUm9kIE51bWVyYWxzXG4gIHsgYmVnaW46IDB4MWI4MCwgZW5kOiAweDFiYmYgfSwgLy8gU3VuZGFuZXNlXG4gIHsgYmVnaW46IDB4MWMwMCwgZW5kOiAweDFjNGYgfSwgLy8gTGVwY2hhXG4gIHsgYmVnaW46IDB4MWM1MCwgZW5kOiAweDFjN2YgfSwgLy8gT2wgQ2hpa2lcbiAgeyBiZWdpbjogMHhhODgwLCBlbmQ6IDB4YThkZiB9LCAvLyBTYXVyYXNodHJhXG4gIHsgYmVnaW46IDB4YTkwMCwgZW5kOiAweGE5MmYgfSwgLy8gS2F5YWggTGlcbiAgeyBiZWdpbjogMHhhOTMwLCBlbmQ6IDB4YTk1ZiB9LCAvLyBSZWphbmdcbiAgeyBiZWdpbjogMHhhYTAwLCBlbmQ6IDB4YWE1ZiB9LCAvLyBDaGFtXG4gIHsgYmVnaW46IDB4MTAxOTAsIGVuZDogMHgxMDFjZiB9LCAvLyBBbmNpZW50IFN5bWJvbHNcbiAgeyBiZWdpbjogMHgxMDFkMCwgZW5kOiAweDEwMWZmIH0sIC8vIFBoYWlzdG9zIERpc2NcbiAgeyBiZWdpbjogMHgxMDJhMCwgZW5kOiAweDEwMmRmIH0sIC8vIENhcmlhblxuICB7IGJlZ2luOiAweDFmMDMwLCBlbmQ6IDB4MWYwOWYgfSwgLy8gRG9taW5vIFRpbGVzXG5dO1xuXG5mdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodmFsdWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGlpID0gVW5pY29kZVJhbmdlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgdmFyIHJhbmdlID0gVW5pY29kZVJhbmdlc1tpXTtcbiAgICBpZiAodmFsdWUgPj0gcmFuZ2UuYmVnaW4gJiYgdmFsdWUgPCByYW5nZS5lbmQpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzUlRMUmFuZ2VGb3IodmFsdWUpIHtcbiAgdmFyIHJhbmdlID0gVW5pY29kZVJhbmdlc1sxM107XG4gIGlmICh2YWx1ZSA+PSByYW5nZS5iZWdpbiAmJiB2YWx1ZSA8IHJhbmdlLmVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJhbmdlID0gVW5pY29kZVJhbmdlc1sxMV07XG4gIGlmICh2YWx1ZSA+PSByYW5nZS5iZWdpbiAmJiB2YWx1ZSA8IHJhbmdlLmVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gVGhlIG5vcm1hbGl6YXRpb24gdGFibGUgaXMgb2J0YWluZWQgYnkgZmlsdGVyaW5nIHRoZSBVbmljb2RlIGNoYXJhY3RlcnNcbi8vIGRhdGFiYXNlIHdpdGggPGNvbXBhdD4gZW50cmllcy5cbnZhciBnZXROb3JtYWxpemVkVW5pY29kZXMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHtcbiAgdFtcIlxcdTAwQThcIl0gPSBcIlxcdTAwMjBcXHUwMzA4XCI7XG4gIHRbXCJcXHUwMEFGXCJdID0gXCJcXHUwMDIwXFx1MDMwNFwiO1xuICB0W1wiXFx1MDBCNFwiXSA9IFwiXFx1MDAyMFxcdTAzMDFcIjtcbiAgdFtcIlxcdTAwQjVcIl0gPSBcIlxcdTAzQkNcIjtcbiAgdFtcIlxcdTAwQjhcIl0gPSBcIlxcdTAwMjBcXHUwMzI3XCI7XG4gIHRbXCJcXHUwMTMyXCJdID0gXCJcXHUwMDQ5XFx1MDA0QVwiO1xuICB0W1wiXFx1MDEzM1wiXSA9IFwiXFx1MDA2OVxcdTAwNkFcIjtcbiAgdFtcIlxcdTAxM0ZcIl0gPSBcIlxcdTAwNENcXHUwMEI3XCI7XG4gIHRbXCJcXHUwMTQwXCJdID0gXCJcXHUwMDZDXFx1MDBCN1wiO1xuICB0W1wiXFx1MDE0OVwiXSA9IFwiXFx1MDJCQ1xcdTAwNkVcIjtcbiAgdFtcIlxcdTAxN0ZcIl0gPSBcIlxcdTAwNzNcIjtcbiAgdFtcIlxcdTAxQzRcIl0gPSBcIlxcdTAwNDRcXHUwMTdEXCI7XG4gIHRbXCJcXHUwMUM1XCJdID0gXCJcXHUwMDQ0XFx1MDE3RVwiO1xuICB0W1wiXFx1MDFDNlwiXSA9IFwiXFx1MDA2NFxcdTAxN0VcIjtcbiAgdFtcIlxcdTAxQzdcIl0gPSBcIlxcdTAwNENcXHUwMDRBXCI7XG4gIHRbXCJcXHUwMUM4XCJdID0gXCJcXHUwMDRDXFx1MDA2QVwiO1xuICB0W1wiXFx1MDFDOVwiXSA9IFwiXFx1MDA2Q1xcdTAwNkFcIjtcbiAgdFtcIlxcdTAxQ0FcIl0gPSBcIlxcdTAwNEVcXHUwMDRBXCI7XG4gIHRbXCJcXHUwMUNCXCJdID0gXCJcXHUwMDRFXFx1MDA2QVwiO1xuICB0W1wiXFx1MDFDQ1wiXSA9IFwiXFx1MDA2RVxcdTAwNkFcIjtcbiAgdFtcIlxcdTAxRjFcIl0gPSBcIlxcdTAwNDRcXHUwMDVBXCI7XG4gIHRbXCJcXHUwMUYyXCJdID0gXCJcXHUwMDQ0XFx1MDA3QVwiO1xuICB0W1wiXFx1MDFGM1wiXSA9IFwiXFx1MDA2NFxcdTAwN0FcIjtcbiAgdFtcIlxcdTAyRDhcIl0gPSBcIlxcdTAwMjBcXHUwMzA2XCI7XG4gIHRbXCJcXHUwMkQ5XCJdID0gXCJcXHUwMDIwXFx1MDMwN1wiO1xuICB0W1wiXFx1MDJEQVwiXSA9IFwiXFx1MDAyMFxcdTAzMEFcIjtcbiAgdFtcIlxcdTAyREJcIl0gPSBcIlxcdTAwMjBcXHUwMzI4XCI7XG4gIHRbXCJcXHUwMkRDXCJdID0gXCJcXHUwMDIwXFx1MDMwM1wiO1xuICB0W1wiXFx1MDJERFwiXSA9IFwiXFx1MDAyMFxcdTAzMEJcIjtcbiAgdFtcIlxcdTAzN0FcIl0gPSBcIlxcdTAwMjBcXHUwMzQ1XCI7XG4gIHRbXCJcXHUwMzg0XCJdID0gXCJcXHUwMDIwXFx1MDMwMVwiO1xuICB0W1wiXFx1MDNEMFwiXSA9IFwiXFx1MDNCMlwiO1xuICB0W1wiXFx1MDNEMVwiXSA9IFwiXFx1MDNCOFwiO1xuICB0W1wiXFx1MDNEMlwiXSA9IFwiXFx1MDNBNVwiO1xuICB0W1wiXFx1MDNENVwiXSA9IFwiXFx1MDNDNlwiO1xuICB0W1wiXFx1MDNENlwiXSA9IFwiXFx1MDNDMFwiO1xuICB0W1wiXFx1MDNGMFwiXSA9IFwiXFx1MDNCQVwiO1xuICB0W1wiXFx1MDNGMVwiXSA9IFwiXFx1MDNDMVwiO1xuICB0W1wiXFx1MDNGMlwiXSA9IFwiXFx1MDNDMlwiO1xuICB0W1wiXFx1MDNGNFwiXSA9IFwiXFx1MDM5OFwiO1xuICB0W1wiXFx1MDNGNVwiXSA9IFwiXFx1MDNCNVwiO1xuICB0W1wiXFx1MDNGOVwiXSA9IFwiXFx1MDNBM1wiO1xuICB0W1wiXFx1MDU4N1wiXSA9IFwiXFx1MDU2NVxcdTA1ODJcIjtcbiAgdFtcIlxcdTA2NzVcIl0gPSBcIlxcdTA2MjdcXHUwNjc0XCI7XG4gIHRbXCJcXHUwNjc2XCJdID0gXCJcXHUwNjQ4XFx1MDY3NFwiO1xuICB0W1wiXFx1MDY3N1wiXSA9IFwiXFx1MDZDN1xcdTA2NzRcIjtcbiAgdFtcIlxcdTA2NzhcIl0gPSBcIlxcdTA2NEFcXHUwNjc0XCI7XG4gIHRbXCJcXHUwRTMzXCJdID0gXCJcXHUwRTREXFx1MEUzMlwiO1xuICB0W1wiXFx1MEVCM1wiXSA9IFwiXFx1MEVDRFxcdTBFQjJcIjtcbiAgdFtcIlxcdTBFRENcIl0gPSBcIlxcdTBFQUJcXHUwRTk5XCI7XG4gIHRbXCJcXHUwRUREXCJdID0gXCJcXHUwRUFCXFx1MEVBMVwiO1xuICB0W1wiXFx1MEY3N1wiXSA9IFwiXFx1MEZCMlxcdTBGODFcIjtcbiAgdFtcIlxcdTBGNzlcIl0gPSBcIlxcdTBGQjNcXHUwRjgxXCI7XG4gIHRbXCJcXHUxRTlBXCJdID0gXCJcXHUwMDYxXFx1MDJCRVwiO1xuICB0W1wiXFx1MUZCRFwiXSA9IFwiXFx1MDAyMFxcdTAzMTNcIjtcbiAgdFtcIlxcdTFGQkZcIl0gPSBcIlxcdTAwMjBcXHUwMzEzXCI7XG4gIHRbXCJcXHUxRkMwXCJdID0gXCJcXHUwMDIwXFx1MDM0MlwiO1xuICB0W1wiXFx1MUZGRVwiXSA9IFwiXFx1MDAyMFxcdTAzMTRcIjtcbiAgdFtcIlxcdTIwMDJcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDNcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDRcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDVcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDZcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDhcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMDlcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMEFcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwMTdcIl0gPSBcIlxcdTAwMjBcXHUwMzMzXCI7XG4gIHRbXCJcXHUyMDI0XCJdID0gXCJcXHUwMDJFXCI7XG4gIHRbXCJcXHUyMDI1XCJdID0gXCJcXHUwMDJFXFx1MDAyRVwiO1xuICB0W1wiXFx1MjAyNlwiXSA9IFwiXFx1MDAyRVxcdTAwMkVcXHUwMDJFXCI7XG4gIHRbXCJcXHUyMDMzXCJdID0gXCJcXHUyMDMyXFx1MjAzMlwiO1xuICB0W1wiXFx1MjAzNFwiXSA9IFwiXFx1MjAzMlxcdTIwMzJcXHUyMDMyXCI7XG4gIHRbXCJcXHUyMDM2XCJdID0gXCJcXHUyMDM1XFx1MjAzNVwiO1xuICB0W1wiXFx1MjAzN1wiXSA9IFwiXFx1MjAzNVxcdTIwMzVcXHUyMDM1XCI7XG4gIHRbXCJcXHUyMDNDXCJdID0gXCJcXHUwMDIxXFx1MDAyMVwiO1xuICB0W1wiXFx1MjAzRVwiXSA9IFwiXFx1MDAyMFxcdTAzMDVcIjtcbiAgdFtcIlxcdTIwNDdcIl0gPSBcIlxcdTAwM0ZcXHUwMDNGXCI7XG4gIHRbXCJcXHUyMDQ4XCJdID0gXCJcXHUwMDNGXFx1MDAyMVwiO1xuICB0W1wiXFx1MjA0OVwiXSA9IFwiXFx1MDAyMVxcdTAwM0ZcIjtcbiAgdFtcIlxcdTIwNTdcIl0gPSBcIlxcdTIwMzJcXHUyMDMyXFx1MjAzMlxcdTIwMzJcIjtcbiAgdFtcIlxcdTIwNUZcIl0gPSBcIlxcdTAwMjBcIjtcbiAgdFtcIlxcdTIwQThcIl0gPSBcIlxcdTAwNTJcXHUwMDczXCI7XG4gIHRbXCJcXHUyMTAwXCJdID0gXCJcXHUwMDYxXFx1MDAyRlxcdTAwNjNcIjtcbiAgdFtcIlxcdTIxMDFcIl0gPSBcIlxcdTAwNjFcXHUwMDJGXFx1MDA3M1wiO1xuICB0W1wiXFx1MjEwM1wiXSA9IFwiXFx1MDBCMFxcdTAwNDNcIjtcbiAgdFtcIlxcdTIxMDVcIl0gPSBcIlxcdTAwNjNcXHUwMDJGXFx1MDA2RlwiO1xuICB0W1wiXFx1MjEwNlwiXSA9IFwiXFx1MDA2M1xcdTAwMkZcXHUwMDc1XCI7XG4gIHRbXCJcXHUyMTA3XCJdID0gXCJcXHUwMTkwXCI7XG4gIHRbXCJcXHUyMTA5XCJdID0gXCJcXHUwMEIwXFx1MDA0NlwiO1xuICB0W1wiXFx1MjExNlwiXSA9IFwiXFx1MDA0RVxcdTAwNkZcIjtcbiAgdFtcIlxcdTIxMjFcIl0gPSBcIlxcdTAwNTRcXHUwMDQ1XFx1MDA0Q1wiO1xuICB0W1wiXFx1MjEzNVwiXSA9IFwiXFx1MDVEMFwiO1xuICB0W1wiXFx1MjEzNlwiXSA9IFwiXFx1MDVEMVwiO1xuICB0W1wiXFx1MjEzN1wiXSA9IFwiXFx1MDVEMlwiO1xuICB0W1wiXFx1MjEzOFwiXSA9IFwiXFx1MDVEM1wiO1xuICB0W1wiXFx1MjEzQlwiXSA9IFwiXFx1MDA0NlxcdTAwNDFcXHUwMDU4XCI7XG4gIHRbXCJcXHUyMTYwXCJdID0gXCJcXHUwMDQ5XCI7XG4gIHRbXCJcXHUyMTYxXCJdID0gXCJcXHUwMDQ5XFx1MDA0OVwiO1xuICB0W1wiXFx1MjE2MlwiXSA9IFwiXFx1MDA0OVxcdTAwNDlcXHUwMDQ5XCI7XG4gIHRbXCJcXHUyMTYzXCJdID0gXCJcXHUwMDQ5XFx1MDA1NlwiO1xuICB0W1wiXFx1MjE2NFwiXSA9IFwiXFx1MDA1NlwiO1xuICB0W1wiXFx1MjE2NVwiXSA9IFwiXFx1MDA1NlxcdTAwNDlcIjtcbiAgdFtcIlxcdTIxNjZcIl0gPSBcIlxcdTAwNTZcXHUwMDQ5XFx1MDA0OVwiO1xuICB0W1wiXFx1MjE2N1wiXSA9IFwiXFx1MDA1NlxcdTAwNDlcXHUwMDQ5XFx1MDA0OVwiO1xuICB0W1wiXFx1MjE2OFwiXSA9IFwiXFx1MDA0OVxcdTAwNThcIjtcbiAgdFtcIlxcdTIxNjlcIl0gPSBcIlxcdTAwNThcIjtcbiAgdFtcIlxcdTIxNkFcIl0gPSBcIlxcdTAwNThcXHUwMDQ5XCI7XG4gIHRbXCJcXHUyMTZCXCJdID0gXCJcXHUwMDU4XFx1MDA0OVxcdTAwNDlcIjtcbiAgdFtcIlxcdTIxNkNcIl0gPSBcIlxcdTAwNENcIjtcbiAgdFtcIlxcdTIxNkRcIl0gPSBcIlxcdTAwNDNcIjtcbiAgdFtcIlxcdTIxNkVcIl0gPSBcIlxcdTAwNDRcIjtcbiAgdFtcIlxcdTIxNkZcIl0gPSBcIlxcdTAwNERcIjtcbiAgdFtcIlxcdTIxNzBcIl0gPSBcIlxcdTAwNjlcIjtcbiAgdFtcIlxcdTIxNzFcIl0gPSBcIlxcdTAwNjlcXHUwMDY5XCI7XG4gIHRbXCJcXHUyMTcyXCJdID0gXCJcXHUwMDY5XFx1MDA2OVxcdTAwNjlcIjtcbiAgdFtcIlxcdTIxNzNcIl0gPSBcIlxcdTAwNjlcXHUwMDc2XCI7XG4gIHRbXCJcXHUyMTc0XCJdID0gXCJcXHUwMDc2XCI7XG4gIHRbXCJcXHUyMTc1XCJdID0gXCJcXHUwMDc2XFx1MDA2OVwiO1xuICB0W1wiXFx1MjE3NlwiXSA9IFwiXFx1MDA3NlxcdTAwNjlcXHUwMDY5XCI7XG4gIHRbXCJcXHUyMTc3XCJdID0gXCJcXHUwMDc2XFx1MDA2OVxcdTAwNjlcXHUwMDY5XCI7XG4gIHRbXCJcXHUyMTc4XCJdID0gXCJcXHUwMDY5XFx1MDA3OFwiO1xuICB0W1wiXFx1MjE3OVwiXSA9IFwiXFx1MDA3OFwiO1xuICB0W1wiXFx1MjE3QVwiXSA9IFwiXFx1MDA3OFxcdTAwNjlcIjtcbiAgdFtcIlxcdTIxN0JcIl0gPSBcIlxcdTAwNzhcXHUwMDY5XFx1MDA2OVwiO1xuICB0W1wiXFx1MjE3Q1wiXSA9IFwiXFx1MDA2Q1wiO1xuICB0W1wiXFx1MjE3RFwiXSA9IFwiXFx1MDA2M1wiO1xuICB0W1wiXFx1MjE3RVwiXSA9IFwiXFx1MDA2NFwiO1xuICB0W1wiXFx1MjE3RlwiXSA9IFwiXFx1MDA2RFwiO1xuICB0W1wiXFx1MjIyQ1wiXSA9IFwiXFx1MjIyQlxcdTIyMkJcIjtcbiAgdFtcIlxcdTIyMkRcIl0gPSBcIlxcdTIyMkJcXHUyMjJCXFx1MjIyQlwiO1xuICB0W1wiXFx1MjIyRlwiXSA9IFwiXFx1MjIyRVxcdTIyMkVcIjtcbiAgdFtcIlxcdTIyMzBcIl0gPSBcIlxcdTIyMkVcXHUyMjJFXFx1MjIyRVwiO1xuICB0W1wiXFx1MjQ3NFwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNDc1XCJdID0gXCJcXHUwMDI4XFx1MDAzMlxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0NzZcIl0gPSBcIlxcdTAwMjhcXHUwMDMzXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3N1wiXSA9IFwiXFx1MDAyOFxcdTAwMzRcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNDc4XCJdID0gXCJcXHUwMDI4XFx1MDAzNVxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0NzlcIl0gPSBcIlxcdTAwMjhcXHUwMDM2XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3QVwiXSA9IFwiXFx1MDAyOFxcdTAwMzdcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNDdCXCJdID0gXCJcXHUwMDI4XFx1MDAzOFxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0N0NcIl0gPSBcIlxcdTAwMjhcXHUwMDM5XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3RFwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDMwXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3RVwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDMxXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ3RlwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDMyXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4MFwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDMzXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4MVwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM0XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4MlwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM1XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4M1wiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM2XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4NFwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM3XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4NVwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM4XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4NlwiXSA9IFwiXFx1MDAyOFxcdTAwMzFcXHUwMDM5XFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4N1wiXSA9IFwiXFx1MDAyOFxcdTAwMzJcXHUwMDMwXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ4OFwiXSA9IFwiXFx1MDAzMVxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0ODlcIl0gPSBcIlxcdTAwMzJcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDhBXCJdID0gXCJcXHUwMDMzXFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ4QlwiXSA9IFwiXFx1MDAzNFxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OENcIl0gPSBcIlxcdTAwMzVcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDhEXCJdID0gXCJcXHUwMDM2XFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ4RVwiXSA9IFwiXFx1MDAzN1xcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OEZcIl0gPSBcIlxcdTAwMzhcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDkwXCJdID0gXCJcXHUwMDM5XFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ5MVwiXSA9IFwiXFx1MDAzMVxcdTAwMzBcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDkyXCJdID0gXCJcXHUwMDMxXFx1MDAzMVxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OTNcIl0gPSBcIlxcdTAwMzFcXHUwMDMyXFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ5NFwiXSA9IFwiXFx1MDAzMVxcdTAwMzNcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDk1XCJdID0gXCJcXHUwMDMxXFx1MDAzNFxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OTZcIl0gPSBcIlxcdTAwMzFcXHUwMDM1XFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ5N1wiXSA9IFwiXFx1MDAzMVxcdTAwMzZcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDk4XCJdID0gXCJcXHUwMDMxXFx1MDAzN1xcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OTlcIl0gPSBcIlxcdTAwMzFcXHUwMDM4XFx1MDAyRVwiO1xuICB0W1wiXFx1MjQ5QVwiXSA9IFwiXFx1MDAzMVxcdTAwMzlcXHUwMDJFXCI7XG4gIHRbXCJcXHUyNDlCXCJdID0gXCJcXHUwMDMyXFx1MDAzMFxcdTAwMkVcIjtcbiAgdFtcIlxcdTI0OUNcIl0gPSBcIlxcdTAwMjhcXHUwMDYxXFx1MDAyOVwiO1xuICB0W1wiXFx1MjQ5RFwiXSA9IFwiXFx1MDAyOFxcdTAwNjJcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNDlFXCJdID0gXCJcXHUwMDI4XFx1MDA2M1xcdTAwMjlcIjtcbiAgdFtcIlxcdTI0OUZcIl0gPSBcIlxcdTAwMjhcXHUwMDY0XFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBMFwiXSA9IFwiXFx1MDAyOFxcdTAwNjVcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEExXCJdID0gXCJcXHUwMDI4XFx1MDA2NlxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QTJcIl0gPSBcIlxcdTAwMjhcXHUwMDY3XFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBM1wiXSA9IFwiXFx1MDAyOFxcdTAwNjhcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEE0XCJdID0gXCJcXHUwMDI4XFx1MDA2OVxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QTVcIl0gPSBcIlxcdTAwMjhcXHUwMDZBXFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBNlwiXSA9IFwiXFx1MDAyOFxcdTAwNkJcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEE3XCJdID0gXCJcXHUwMDI4XFx1MDA2Q1xcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QThcIl0gPSBcIlxcdTAwMjhcXHUwMDZEXFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBOVwiXSA9IFwiXFx1MDAyOFxcdTAwNkVcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEFBXCJdID0gXCJcXHUwMDI4XFx1MDA2RlxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QUJcIl0gPSBcIlxcdTAwMjhcXHUwMDcwXFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBQ1wiXSA9IFwiXFx1MDAyOFxcdTAwNzFcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEFEXCJdID0gXCJcXHUwMDI4XFx1MDA3MlxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QUVcIl0gPSBcIlxcdTAwMjhcXHUwMDczXFx1MDAyOVwiO1xuICB0W1wiXFx1MjRBRlwiXSA9IFwiXFx1MDAyOFxcdTAwNzRcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEIwXCJdID0gXCJcXHUwMDI4XFx1MDA3NVxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QjFcIl0gPSBcIlxcdTAwMjhcXHUwMDc2XFx1MDAyOVwiO1xuICB0W1wiXFx1MjRCMlwiXSA9IFwiXFx1MDAyOFxcdTAwNzdcXHUwMDI5XCI7XG4gIHRbXCJcXHUyNEIzXCJdID0gXCJcXHUwMDI4XFx1MDA3OFxcdTAwMjlcIjtcbiAgdFtcIlxcdTI0QjRcIl0gPSBcIlxcdTAwMjhcXHUwMDc5XFx1MDAyOVwiO1xuICB0W1wiXFx1MjRCNVwiXSA9IFwiXFx1MDAyOFxcdTAwN0FcXHUwMDI5XCI7XG4gIHRbXCJcXHUyQTBDXCJdID0gXCJcXHUyMjJCXFx1MjIyQlxcdTIyMkJcXHUyMjJCXCI7XG4gIHRbXCJcXHUyQTc0XCJdID0gXCJcXHUwMDNBXFx1MDAzQVxcdTAwM0RcIjtcbiAgdFtcIlxcdTJBNzVcIl0gPSBcIlxcdTAwM0RcXHUwMDNEXCI7XG4gIHRbXCJcXHUyQTc2XCJdID0gXCJcXHUwMDNEXFx1MDAzRFxcdTAwM0RcIjtcbiAgdFtcIlxcdTJFOUZcIl0gPSBcIlxcdTZCQ0RcIjtcbiAgdFtcIlxcdTJFRjNcIl0gPSBcIlxcdTlGOUZcIjtcbiAgdFtcIlxcdTJGMDBcIl0gPSBcIlxcdTRFMDBcIjtcbiAgdFtcIlxcdTJGMDFcIl0gPSBcIlxcdTRFMjhcIjtcbiAgdFtcIlxcdTJGMDJcIl0gPSBcIlxcdTRFMzZcIjtcbiAgdFtcIlxcdTJGMDNcIl0gPSBcIlxcdTRFM0ZcIjtcbiAgdFtcIlxcdTJGMDRcIl0gPSBcIlxcdTRFNTlcIjtcbiAgdFtcIlxcdTJGMDVcIl0gPSBcIlxcdTRFODVcIjtcbiAgdFtcIlxcdTJGMDZcIl0gPSBcIlxcdTRFOENcIjtcbiAgdFtcIlxcdTJGMDdcIl0gPSBcIlxcdTRFQTBcIjtcbiAgdFtcIlxcdTJGMDhcIl0gPSBcIlxcdTRFQkFcIjtcbiAgdFtcIlxcdTJGMDlcIl0gPSBcIlxcdTUxM0ZcIjtcbiAgdFtcIlxcdTJGMEFcIl0gPSBcIlxcdTUxNjVcIjtcbiAgdFtcIlxcdTJGMEJcIl0gPSBcIlxcdTUxNkJcIjtcbiAgdFtcIlxcdTJGMENcIl0gPSBcIlxcdTUxODJcIjtcbiAgdFtcIlxcdTJGMERcIl0gPSBcIlxcdTUxOTZcIjtcbiAgdFtcIlxcdTJGMEVcIl0gPSBcIlxcdTUxQUJcIjtcbiAgdFtcIlxcdTJGMEZcIl0gPSBcIlxcdTUxRTBcIjtcbiAgdFtcIlxcdTJGMTBcIl0gPSBcIlxcdTUxRjVcIjtcbiAgdFtcIlxcdTJGMTFcIl0gPSBcIlxcdTUyMDBcIjtcbiAgdFtcIlxcdTJGMTJcIl0gPSBcIlxcdTUyOUJcIjtcbiAgdFtcIlxcdTJGMTNcIl0gPSBcIlxcdTUyRjlcIjtcbiAgdFtcIlxcdTJGMTRcIl0gPSBcIlxcdTUzMTVcIjtcbiAgdFtcIlxcdTJGMTVcIl0gPSBcIlxcdTUzMUFcIjtcbiAgdFtcIlxcdTJGMTZcIl0gPSBcIlxcdTUzMzhcIjtcbiAgdFtcIlxcdTJGMTdcIl0gPSBcIlxcdTUzNDFcIjtcbiAgdFtcIlxcdTJGMThcIl0gPSBcIlxcdTUzNUNcIjtcbiAgdFtcIlxcdTJGMTlcIl0gPSBcIlxcdTUzNjlcIjtcbiAgdFtcIlxcdTJGMUFcIl0gPSBcIlxcdTUzODJcIjtcbiAgdFtcIlxcdTJGMUJcIl0gPSBcIlxcdTUzQjZcIjtcbiAgdFtcIlxcdTJGMUNcIl0gPSBcIlxcdTUzQzhcIjtcbiAgdFtcIlxcdTJGMURcIl0gPSBcIlxcdTUzRTNcIjtcbiAgdFtcIlxcdTJGMUVcIl0gPSBcIlxcdTU2RDdcIjtcbiAgdFtcIlxcdTJGMUZcIl0gPSBcIlxcdTU3MUZcIjtcbiAgdFtcIlxcdTJGMjBcIl0gPSBcIlxcdTU4RUJcIjtcbiAgdFtcIlxcdTJGMjFcIl0gPSBcIlxcdTU5MDJcIjtcbiAgdFtcIlxcdTJGMjJcIl0gPSBcIlxcdTU5MEFcIjtcbiAgdFtcIlxcdTJGMjNcIl0gPSBcIlxcdTU5MTVcIjtcbiAgdFtcIlxcdTJGMjRcIl0gPSBcIlxcdTU5MjdcIjtcbiAgdFtcIlxcdTJGMjVcIl0gPSBcIlxcdTU5NzNcIjtcbiAgdFtcIlxcdTJGMjZcIl0gPSBcIlxcdTVCNTBcIjtcbiAgdFtcIlxcdTJGMjdcIl0gPSBcIlxcdTVCODBcIjtcbiAgdFtcIlxcdTJGMjhcIl0gPSBcIlxcdTVCRjhcIjtcbiAgdFtcIlxcdTJGMjlcIl0gPSBcIlxcdTVDMEZcIjtcbiAgdFtcIlxcdTJGMkFcIl0gPSBcIlxcdTVDMjJcIjtcbiAgdFtcIlxcdTJGMkJcIl0gPSBcIlxcdTVDMzhcIjtcbiAgdFtcIlxcdTJGMkNcIl0gPSBcIlxcdTVDNkVcIjtcbiAgdFtcIlxcdTJGMkRcIl0gPSBcIlxcdTVDNzFcIjtcbiAgdFtcIlxcdTJGMkVcIl0gPSBcIlxcdTVEREJcIjtcbiAgdFtcIlxcdTJGMkZcIl0gPSBcIlxcdTVERTVcIjtcbiAgdFtcIlxcdTJGMzBcIl0gPSBcIlxcdTVERjFcIjtcbiAgdFtcIlxcdTJGMzFcIl0gPSBcIlxcdTVERkVcIjtcbiAgdFtcIlxcdTJGMzJcIl0gPSBcIlxcdTVFNzJcIjtcbiAgdFtcIlxcdTJGMzNcIl0gPSBcIlxcdTVFN0FcIjtcbiAgdFtcIlxcdTJGMzRcIl0gPSBcIlxcdTVFN0ZcIjtcbiAgdFtcIlxcdTJGMzVcIl0gPSBcIlxcdTVFRjRcIjtcbiAgdFtcIlxcdTJGMzZcIl0gPSBcIlxcdTVFRkVcIjtcbiAgdFtcIlxcdTJGMzdcIl0gPSBcIlxcdTVGMEJcIjtcbiAgdFtcIlxcdTJGMzhcIl0gPSBcIlxcdTVGMTNcIjtcbiAgdFtcIlxcdTJGMzlcIl0gPSBcIlxcdTVGNTBcIjtcbiAgdFtcIlxcdTJGM0FcIl0gPSBcIlxcdTVGNjFcIjtcbiAgdFtcIlxcdTJGM0JcIl0gPSBcIlxcdTVGNzNcIjtcbiAgdFtcIlxcdTJGM0NcIl0gPSBcIlxcdTVGQzNcIjtcbiAgdFtcIlxcdTJGM0RcIl0gPSBcIlxcdTYyMDhcIjtcbiAgdFtcIlxcdTJGM0VcIl0gPSBcIlxcdTYyMzZcIjtcbiAgdFtcIlxcdTJGM0ZcIl0gPSBcIlxcdTYyNEJcIjtcbiAgdFtcIlxcdTJGNDBcIl0gPSBcIlxcdTY1MkZcIjtcbiAgdFtcIlxcdTJGNDFcIl0gPSBcIlxcdTY1MzRcIjtcbiAgdFtcIlxcdTJGNDJcIl0gPSBcIlxcdTY1ODdcIjtcbiAgdFtcIlxcdTJGNDNcIl0gPSBcIlxcdTY1OTdcIjtcbiAgdFtcIlxcdTJGNDRcIl0gPSBcIlxcdTY1QTRcIjtcbiAgdFtcIlxcdTJGNDVcIl0gPSBcIlxcdTY1QjlcIjtcbiAgdFtcIlxcdTJGNDZcIl0gPSBcIlxcdTY1RTBcIjtcbiAgdFtcIlxcdTJGNDdcIl0gPSBcIlxcdTY1RTVcIjtcbiAgdFtcIlxcdTJGNDhcIl0gPSBcIlxcdTY2RjBcIjtcbiAgdFtcIlxcdTJGNDlcIl0gPSBcIlxcdTY3MDhcIjtcbiAgdFtcIlxcdTJGNEFcIl0gPSBcIlxcdTY3MjhcIjtcbiAgdFtcIlxcdTJGNEJcIl0gPSBcIlxcdTZCMjBcIjtcbiAgdFtcIlxcdTJGNENcIl0gPSBcIlxcdTZCNjJcIjtcbiAgdFtcIlxcdTJGNERcIl0gPSBcIlxcdTZCNzlcIjtcbiAgdFtcIlxcdTJGNEVcIl0gPSBcIlxcdTZCQjNcIjtcbiAgdFtcIlxcdTJGNEZcIl0gPSBcIlxcdTZCQ0JcIjtcbiAgdFtcIlxcdTJGNTBcIl0gPSBcIlxcdTZCRDRcIjtcbiAgdFtcIlxcdTJGNTFcIl0gPSBcIlxcdTZCREJcIjtcbiAgdFtcIlxcdTJGNTJcIl0gPSBcIlxcdTZDMEZcIjtcbiAgdFtcIlxcdTJGNTNcIl0gPSBcIlxcdTZDMTRcIjtcbiAgdFtcIlxcdTJGNTRcIl0gPSBcIlxcdTZDMzRcIjtcbiAgdFtcIlxcdTJGNTVcIl0gPSBcIlxcdTcwNkJcIjtcbiAgdFtcIlxcdTJGNTZcIl0gPSBcIlxcdTcyMkFcIjtcbiAgdFtcIlxcdTJGNTdcIl0gPSBcIlxcdTcyMzZcIjtcbiAgdFtcIlxcdTJGNThcIl0gPSBcIlxcdTcyM0JcIjtcbiAgdFtcIlxcdTJGNTlcIl0gPSBcIlxcdTcyM0ZcIjtcbiAgdFtcIlxcdTJGNUFcIl0gPSBcIlxcdTcyNDdcIjtcbiAgdFtcIlxcdTJGNUJcIl0gPSBcIlxcdTcyNTlcIjtcbiAgdFtcIlxcdTJGNUNcIl0gPSBcIlxcdTcyNUJcIjtcbiAgdFtcIlxcdTJGNURcIl0gPSBcIlxcdTcyQUNcIjtcbiAgdFtcIlxcdTJGNUVcIl0gPSBcIlxcdTczODRcIjtcbiAgdFtcIlxcdTJGNUZcIl0gPSBcIlxcdTczODlcIjtcbiAgdFtcIlxcdTJGNjBcIl0gPSBcIlxcdTc0RENcIjtcbiAgdFtcIlxcdTJGNjFcIl0gPSBcIlxcdTc0RTZcIjtcbiAgdFtcIlxcdTJGNjJcIl0gPSBcIlxcdTc1MThcIjtcbiAgdFtcIlxcdTJGNjNcIl0gPSBcIlxcdTc1MUZcIjtcbiAgdFtcIlxcdTJGNjRcIl0gPSBcIlxcdTc1MjhcIjtcbiAgdFtcIlxcdTJGNjVcIl0gPSBcIlxcdTc1MzBcIjtcbiAgdFtcIlxcdTJGNjZcIl0gPSBcIlxcdTc1OEJcIjtcbiAgdFtcIlxcdTJGNjdcIl0gPSBcIlxcdTc1OTJcIjtcbiAgdFtcIlxcdTJGNjhcIl0gPSBcIlxcdTc2NzZcIjtcbiAgdFtcIlxcdTJGNjlcIl0gPSBcIlxcdTc2N0RcIjtcbiAgdFtcIlxcdTJGNkFcIl0gPSBcIlxcdTc2QUVcIjtcbiAgdFtcIlxcdTJGNkJcIl0gPSBcIlxcdTc2QkZcIjtcbiAgdFtcIlxcdTJGNkNcIl0gPSBcIlxcdTc2RUVcIjtcbiAgdFtcIlxcdTJGNkRcIl0gPSBcIlxcdTc3REJcIjtcbiAgdFtcIlxcdTJGNkVcIl0gPSBcIlxcdTc3RTJcIjtcbiAgdFtcIlxcdTJGNkZcIl0gPSBcIlxcdTc3RjNcIjtcbiAgdFtcIlxcdTJGNzBcIl0gPSBcIlxcdTc5M0FcIjtcbiAgdFtcIlxcdTJGNzFcIl0gPSBcIlxcdTc5QjhcIjtcbiAgdFtcIlxcdTJGNzJcIl0gPSBcIlxcdTc5QkVcIjtcbiAgdFtcIlxcdTJGNzNcIl0gPSBcIlxcdTdBNzRcIjtcbiAgdFtcIlxcdTJGNzRcIl0gPSBcIlxcdTdBQ0JcIjtcbiAgdFtcIlxcdTJGNzVcIl0gPSBcIlxcdTdBRjlcIjtcbiAgdFtcIlxcdTJGNzZcIl0gPSBcIlxcdTdDNzNcIjtcbiAgdFtcIlxcdTJGNzdcIl0gPSBcIlxcdTdDRjhcIjtcbiAgdFtcIlxcdTJGNzhcIl0gPSBcIlxcdTdGMzZcIjtcbiAgdFtcIlxcdTJGNzlcIl0gPSBcIlxcdTdGNTFcIjtcbiAgdFtcIlxcdTJGN0FcIl0gPSBcIlxcdTdGOEFcIjtcbiAgdFtcIlxcdTJGN0JcIl0gPSBcIlxcdTdGQkRcIjtcbiAgdFtcIlxcdTJGN0NcIl0gPSBcIlxcdTgwMDFcIjtcbiAgdFtcIlxcdTJGN0RcIl0gPSBcIlxcdTgwMENcIjtcbiAgdFtcIlxcdTJGN0VcIl0gPSBcIlxcdTgwMTJcIjtcbiAgdFtcIlxcdTJGN0ZcIl0gPSBcIlxcdTgwMzNcIjtcbiAgdFtcIlxcdTJGODBcIl0gPSBcIlxcdTgwN0ZcIjtcbiAgdFtcIlxcdTJGODFcIl0gPSBcIlxcdTgwODlcIjtcbiAgdFtcIlxcdTJGODJcIl0gPSBcIlxcdTgxRTNcIjtcbiAgdFtcIlxcdTJGODNcIl0gPSBcIlxcdTgxRUFcIjtcbiAgdFtcIlxcdTJGODRcIl0gPSBcIlxcdTgxRjNcIjtcbiAgdFtcIlxcdTJGODVcIl0gPSBcIlxcdTgxRkNcIjtcbiAgdFtcIlxcdTJGODZcIl0gPSBcIlxcdTgyMENcIjtcbiAgdFtcIlxcdTJGODdcIl0gPSBcIlxcdTgyMUJcIjtcbiAgdFtcIlxcdTJGODhcIl0gPSBcIlxcdTgyMUZcIjtcbiAgdFtcIlxcdTJGODlcIl0gPSBcIlxcdTgyNkVcIjtcbiAgdFtcIlxcdTJGOEFcIl0gPSBcIlxcdTgyNzJcIjtcbiAgdFtcIlxcdTJGOEJcIl0gPSBcIlxcdTgyNzhcIjtcbiAgdFtcIlxcdTJGOENcIl0gPSBcIlxcdTg2NERcIjtcbiAgdFtcIlxcdTJGOERcIl0gPSBcIlxcdTg2NkJcIjtcbiAgdFtcIlxcdTJGOEVcIl0gPSBcIlxcdTg4NDBcIjtcbiAgdFtcIlxcdTJGOEZcIl0gPSBcIlxcdTg4NENcIjtcbiAgdFtcIlxcdTJGOTBcIl0gPSBcIlxcdTg4NjNcIjtcbiAgdFtcIlxcdTJGOTFcIl0gPSBcIlxcdTg5N0VcIjtcbiAgdFtcIlxcdTJGOTJcIl0gPSBcIlxcdTg5OEJcIjtcbiAgdFtcIlxcdTJGOTNcIl0gPSBcIlxcdTg5RDJcIjtcbiAgdFtcIlxcdTJGOTRcIl0gPSBcIlxcdThBMDBcIjtcbiAgdFtcIlxcdTJGOTVcIl0gPSBcIlxcdThDMzdcIjtcbiAgdFtcIlxcdTJGOTZcIl0gPSBcIlxcdThDNDZcIjtcbiAgdFtcIlxcdTJGOTdcIl0gPSBcIlxcdThDNTVcIjtcbiAgdFtcIlxcdTJGOThcIl0gPSBcIlxcdThDNzhcIjtcbiAgdFtcIlxcdTJGOTlcIl0gPSBcIlxcdThDOURcIjtcbiAgdFtcIlxcdTJGOUFcIl0gPSBcIlxcdThENjRcIjtcbiAgdFtcIlxcdTJGOUJcIl0gPSBcIlxcdThENzBcIjtcbiAgdFtcIlxcdTJGOUNcIl0gPSBcIlxcdThEQjNcIjtcbiAgdFtcIlxcdTJGOURcIl0gPSBcIlxcdThFQUJcIjtcbiAgdFtcIlxcdTJGOUVcIl0gPSBcIlxcdThFQ0FcIjtcbiAgdFtcIlxcdTJGOUZcIl0gPSBcIlxcdThGOUJcIjtcbiAgdFtcIlxcdTJGQTBcIl0gPSBcIlxcdThGQjBcIjtcbiAgdFtcIlxcdTJGQTFcIl0gPSBcIlxcdThGQjVcIjtcbiAgdFtcIlxcdTJGQTJcIl0gPSBcIlxcdTkwOTFcIjtcbiAgdFtcIlxcdTJGQTNcIl0gPSBcIlxcdTkxNDlcIjtcbiAgdFtcIlxcdTJGQTRcIl0gPSBcIlxcdTkxQzZcIjtcbiAgdFtcIlxcdTJGQTVcIl0gPSBcIlxcdTkxQ0NcIjtcbiAgdFtcIlxcdTJGQTZcIl0gPSBcIlxcdTkxRDFcIjtcbiAgdFtcIlxcdTJGQTdcIl0gPSBcIlxcdTk1NzdcIjtcbiAgdFtcIlxcdTJGQThcIl0gPSBcIlxcdTk1ODBcIjtcbiAgdFtcIlxcdTJGQTlcIl0gPSBcIlxcdTk2MUNcIjtcbiAgdFtcIlxcdTJGQUFcIl0gPSBcIlxcdTk2QjZcIjtcbiAgdFtcIlxcdTJGQUJcIl0gPSBcIlxcdTk2QjlcIjtcbiAgdFtcIlxcdTJGQUNcIl0gPSBcIlxcdTk2RThcIjtcbiAgdFtcIlxcdTJGQURcIl0gPSBcIlxcdTk3NTFcIjtcbiAgdFtcIlxcdTJGQUVcIl0gPSBcIlxcdTk3NUVcIjtcbiAgdFtcIlxcdTJGQUZcIl0gPSBcIlxcdTk3NjJcIjtcbiAgdFtcIlxcdTJGQjBcIl0gPSBcIlxcdTk3NjlcIjtcbiAgdFtcIlxcdTJGQjFcIl0gPSBcIlxcdTk3Q0JcIjtcbiAgdFtcIlxcdTJGQjJcIl0gPSBcIlxcdTk3RURcIjtcbiAgdFtcIlxcdTJGQjNcIl0gPSBcIlxcdTk3RjNcIjtcbiAgdFtcIlxcdTJGQjRcIl0gPSBcIlxcdTk4MDFcIjtcbiAgdFtcIlxcdTJGQjVcIl0gPSBcIlxcdTk4QThcIjtcbiAgdFtcIlxcdTJGQjZcIl0gPSBcIlxcdTk4REJcIjtcbiAgdFtcIlxcdTJGQjdcIl0gPSBcIlxcdTk4REZcIjtcbiAgdFtcIlxcdTJGQjhcIl0gPSBcIlxcdTk5OTZcIjtcbiAgdFtcIlxcdTJGQjlcIl0gPSBcIlxcdTk5OTlcIjtcbiAgdFtcIlxcdTJGQkFcIl0gPSBcIlxcdTk5QUNcIjtcbiAgdFtcIlxcdTJGQkJcIl0gPSBcIlxcdTlBQThcIjtcbiAgdFtcIlxcdTJGQkNcIl0gPSBcIlxcdTlBRDhcIjtcbiAgdFtcIlxcdTJGQkRcIl0gPSBcIlxcdTlBREZcIjtcbiAgdFtcIlxcdTJGQkVcIl0gPSBcIlxcdTlCMjVcIjtcbiAgdFtcIlxcdTJGQkZcIl0gPSBcIlxcdTlCMkZcIjtcbiAgdFtcIlxcdTJGQzBcIl0gPSBcIlxcdTlCMzJcIjtcbiAgdFtcIlxcdTJGQzFcIl0gPSBcIlxcdTlCM0NcIjtcbiAgdFtcIlxcdTJGQzJcIl0gPSBcIlxcdTlCNUFcIjtcbiAgdFtcIlxcdTJGQzNcIl0gPSBcIlxcdTlDRTVcIjtcbiAgdFtcIlxcdTJGQzRcIl0gPSBcIlxcdTlFNzVcIjtcbiAgdFtcIlxcdTJGQzVcIl0gPSBcIlxcdTlFN0ZcIjtcbiAgdFtcIlxcdTJGQzZcIl0gPSBcIlxcdTlFQTVcIjtcbiAgdFtcIlxcdTJGQzdcIl0gPSBcIlxcdTlFQkJcIjtcbiAgdFtcIlxcdTJGQzhcIl0gPSBcIlxcdTlFQzNcIjtcbiAgdFtcIlxcdTJGQzlcIl0gPSBcIlxcdTlFQ0RcIjtcbiAgdFtcIlxcdTJGQ0FcIl0gPSBcIlxcdTlFRDFcIjtcbiAgdFtcIlxcdTJGQ0JcIl0gPSBcIlxcdTlFRjlcIjtcbiAgdFtcIlxcdTJGQ0NcIl0gPSBcIlxcdTlFRkRcIjtcbiAgdFtcIlxcdTJGQ0RcIl0gPSBcIlxcdTlGMEVcIjtcbiAgdFtcIlxcdTJGQ0VcIl0gPSBcIlxcdTlGMTNcIjtcbiAgdFtcIlxcdTJGQ0ZcIl0gPSBcIlxcdTlGMjBcIjtcbiAgdFtcIlxcdTJGRDBcIl0gPSBcIlxcdTlGM0JcIjtcbiAgdFtcIlxcdTJGRDFcIl0gPSBcIlxcdTlGNEFcIjtcbiAgdFtcIlxcdTJGRDJcIl0gPSBcIlxcdTlGNTJcIjtcbiAgdFtcIlxcdTJGRDNcIl0gPSBcIlxcdTlGOERcIjtcbiAgdFtcIlxcdTJGRDRcIl0gPSBcIlxcdTlGOUNcIjtcbiAgdFtcIlxcdTJGRDVcIl0gPSBcIlxcdTlGQTBcIjtcbiAgdFtcIlxcdTMwMzZcIl0gPSBcIlxcdTMwMTJcIjtcbiAgdFtcIlxcdTMwMzhcIl0gPSBcIlxcdTUzNDFcIjtcbiAgdFtcIlxcdTMwMzlcIl0gPSBcIlxcdTUzNDRcIjtcbiAgdFtcIlxcdTMwM0FcIl0gPSBcIlxcdTUzNDVcIjtcbiAgdFtcIlxcdTMwOUJcIl0gPSBcIlxcdTAwMjBcXHUzMDk5XCI7XG4gIHRbXCJcXHUzMDlDXCJdID0gXCJcXHUwMDIwXFx1MzA5QVwiO1xuICB0W1wiXFx1MzEzMVwiXSA9IFwiXFx1MTEwMFwiO1xuICB0W1wiXFx1MzEzMlwiXSA9IFwiXFx1MTEwMVwiO1xuICB0W1wiXFx1MzEzM1wiXSA9IFwiXFx1MTFBQVwiO1xuICB0W1wiXFx1MzEzNFwiXSA9IFwiXFx1MTEwMlwiO1xuICB0W1wiXFx1MzEzNVwiXSA9IFwiXFx1MTFBQ1wiO1xuICB0W1wiXFx1MzEzNlwiXSA9IFwiXFx1MTFBRFwiO1xuICB0W1wiXFx1MzEzN1wiXSA9IFwiXFx1MTEwM1wiO1xuICB0W1wiXFx1MzEzOFwiXSA9IFwiXFx1MTEwNFwiO1xuICB0W1wiXFx1MzEzOVwiXSA9IFwiXFx1MTEwNVwiO1xuICB0W1wiXFx1MzEzQVwiXSA9IFwiXFx1MTFCMFwiO1xuICB0W1wiXFx1MzEzQlwiXSA9IFwiXFx1MTFCMVwiO1xuICB0W1wiXFx1MzEzQ1wiXSA9IFwiXFx1MTFCMlwiO1xuICB0W1wiXFx1MzEzRFwiXSA9IFwiXFx1MTFCM1wiO1xuICB0W1wiXFx1MzEzRVwiXSA9IFwiXFx1MTFCNFwiO1xuICB0W1wiXFx1MzEzRlwiXSA9IFwiXFx1MTFCNVwiO1xuICB0W1wiXFx1MzE0MFwiXSA9IFwiXFx1MTExQVwiO1xuICB0W1wiXFx1MzE0MVwiXSA9IFwiXFx1MTEwNlwiO1xuICB0W1wiXFx1MzE0MlwiXSA9IFwiXFx1MTEwN1wiO1xuICB0W1wiXFx1MzE0M1wiXSA9IFwiXFx1MTEwOFwiO1xuICB0W1wiXFx1MzE0NFwiXSA9IFwiXFx1MTEyMVwiO1xuICB0W1wiXFx1MzE0NVwiXSA9IFwiXFx1MTEwOVwiO1xuICB0W1wiXFx1MzE0NlwiXSA9IFwiXFx1MTEwQVwiO1xuICB0W1wiXFx1MzE0N1wiXSA9IFwiXFx1MTEwQlwiO1xuICB0W1wiXFx1MzE0OFwiXSA9IFwiXFx1MTEwQ1wiO1xuICB0W1wiXFx1MzE0OVwiXSA9IFwiXFx1MTEwRFwiO1xuICB0W1wiXFx1MzE0QVwiXSA9IFwiXFx1MTEwRVwiO1xuICB0W1wiXFx1MzE0QlwiXSA9IFwiXFx1MTEwRlwiO1xuICB0W1wiXFx1MzE0Q1wiXSA9IFwiXFx1MTExMFwiO1xuICB0W1wiXFx1MzE0RFwiXSA9IFwiXFx1MTExMVwiO1xuICB0W1wiXFx1MzE0RVwiXSA9IFwiXFx1MTExMlwiO1xuICB0W1wiXFx1MzE0RlwiXSA9IFwiXFx1MTE2MVwiO1xuICB0W1wiXFx1MzE1MFwiXSA9IFwiXFx1MTE2MlwiO1xuICB0W1wiXFx1MzE1MVwiXSA9IFwiXFx1MTE2M1wiO1xuICB0W1wiXFx1MzE1MlwiXSA9IFwiXFx1MTE2NFwiO1xuICB0W1wiXFx1MzE1M1wiXSA9IFwiXFx1MTE2NVwiO1xuICB0W1wiXFx1MzE1NFwiXSA9IFwiXFx1MTE2NlwiO1xuICB0W1wiXFx1MzE1NVwiXSA9IFwiXFx1MTE2N1wiO1xuICB0W1wiXFx1MzE1NlwiXSA9IFwiXFx1MTE2OFwiO1xuICB0W1wiXFx1MzE1N1wiXSA9IFwiXFx1MTE2OVwiO1xuICB0W1wiXFx1MzE1OFwiXSA9IFwiXFx1MTE2QVwiO1xuICB0W1wiXFx1MzE1OVwiXSA9IFwiXFx1MTE2QlwiO1xuICB0W1wiXFx1MzE1QVwiXSA9IFwiXFx1MTE2Q1wiO1xuICB0W1wiXFx1MzE1QlwiXSA9IFwiXFx1MTE2RFwiO1xuICB0W1wiXFx1MzE1Q1wiXSA9IFwiXFx1MTE2RVwiO1xuICB0W1wiXFx1MzE1RFwiXSA9IFwiXFx1MTE2RlwiO1xuICB0W1wiXFx1MzE1RVwiXSA9IFwiXFx1MTE3MFwiO1xuICB0W1wiXFx1MzE1RlwiXSA9IFwiXFx1MTE3MVwiO1xuICB0W1wiXFx1MzE2MFwiXSA9IFwiXFx1MTE3MlwiO1xuICB0W1wiXFx1MzE2MVwiXSA9IFwiXFx1MTE3M1wiO1xuICB0W1wiXFx1MzE2MlwiXSA9IFwiXFx1MTE3NFwiO1xuICB0W1wiXFx1MzE2M1wiXSA9IFwiXFx1MTE3NVwiO1xuICB0W1wiXFx1MzE2NFwiXSA9IFwiXFx1MTE2MFwiO1xuICB0W1wiXFx1MzE2NVwiXSA9IFwiXFx1MTExNFwiO1xuICB0W1wiXFx1MzE2NlwiXSA9IFwiXFx1MTExNVwiO1xuICB0W1wiXFx1MzE2N1wiXSA9IFwiXFx1MTFDN1wiO1xuICB0W1wiXFx1MzE2OFwiXSA9IFwiXFx1MTFDOFwiO1xuICB0W1wiXFx1MzE2OVwiXSA9IFwiXFx1MTFDQ1wiO1xuICB0W1wiXFx1MzE2QVwiXSA9IFwiXFx1MTFDRVwiO1xuICB0W1wiXFx1MzE2QlwiXSA9IFwiXFx1MTFEM1wiO1xuICB0W1wiXFx1MzE2Q1wiXSA9IFwiXFx1MTFEN1wiO1xuICB0W1wiXFx1MzE2RFwiXSA9IFwiXFx1MTFEOVwiO1xuICB0W1wiXFx1MzE2RVwiXSA9IFwiXFx1MTExQ1wiO1xuICB0W1wiXFx1MzE2RlwiXSA9IFwiXFx1MTFERFwiO1xuICB0W1wiXFx1MzE3MFwiXSA9IFwiXFx1MTFERlwiO1xuICB0W1wiXFx1MzE3MVwiXSA9IFwiXFx1MTExRFwiO1xuICB0W1wiXFx1MzE3MlwiXSA9IFwiXFx1MTExRVwiO1xuICB0W1wiXFx1MzE3M1wiXSA9IFwiXFx1MTEyMFwiO1xuICB0W1wiXFx1MzE3NFwiXSA9IFwiXFx1MTEyMlwiO1xuICB0W1wiXFx1MzE3NVwiXSA9IFwiXFx1MTEyM1wiO1xuICB0W1wiXFx1MzE3NlwiXSA9IFwiXFx1MTEyN1wiO1xuICB0W1wiXFx1MzE3N1wiXSA9IFwiXFx1MTEyOVwiO1xuICB0W1wiXFx1MzE3OFwiXSA9IFwiXFx1MTEyQlwiO1xuICB0W1wiXFx1MzE3OVwiXSA9IFwiXFx1MTEyQ1wiO1xuICB0W1wiXFx1MzE3QVwiXSA9IFwiXFx1MTEyRFwiO1xuICB0W1wiXFx1MzE3QlwiXSA9IFwiXFx1MTEyRVwiO1xuICB0W1wiXFx1MzE3Q1wiXSA9IFwiXFx1MTEyRlwiO1xuICB0W1wiXFx1MzE3RFwiXSA9IFwiXFx1MTEzMlwiO1xuICB0W1wiXFx1MzE3RVwiXSA9IFwiXFx1MTEzNlwiO1xuICB0W1wiXFx1MzE3RlwiXSA9IFwiXFx1MTE0MFwiO1xuICB0W1wiXFx1MzE4MFwiXSA9IFwiXFx1MTE0N1wiO1xuICB0W1wiXFx1MzE4MVwiXSA9IFwiXFx1MTE0Q1wiO1xuICB0W1wiXFx1MzE4MlwiXSA9IFwiXFx1MTFGMVwiO1xuICB0W1wiXFx1MzE4M1wiXSA9IFwiXFx1MTFGMlwiO1xuICB0W1wiXFx1MzE4NFwiXSA9IFwiXFx1MTE1N1wiO1xuICB0W1wiXFx1MzE4NVwiXSA9IFwiXFx1MTE1OFwiO1xuICB0W1wiXFx1MzE4NlwiXSA9IFwiXFx1MTE1OVwiO1xuICB0W1wiXFx1MzE4N1wiXSA9IFwiXFx1MTE4NFwiO1xuICB0W1wiXFx1MzE4OFwiXSA9IFwiXFx1MTE4NVwiO1xuICB0W1wiXFx1MzE4OVwiXSA9IFwiXFx1MTE4OFwiO1xuICB0W1wiXFx1MzE4QVwiXSA9IFwiXFx1MTE5MVwiO1xuICB0W1wiXFx1MzE4QlwiXSA9IFwiXFx1MTE5MlwiO1xuICB0W1wiXFx1MzE4Q1wiXSA9IFwiXFx1MTE5NFwiO1xuICB0W1wiXFx1MzE4RFwiXSA9IFwiXFx1MTE5RVwiO1xuICB0W1wiXFx1MzE4RVwiXSA9IFwiXFx1MTFBMVwiO1xuICB0W1wiXFx1MzIwMFwiXSA9IFwiXFx1MDAyOFxcdTExMDBcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjAxXCJdID0gXCJcXHUwMDI4XFx1MTEwMlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMDJcIl0gPSBcIlxcdTAwMjhcXHUxMTAzXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIwM1wiXSA9IFwiXFx1MDAyOFxcdTExMDVcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjA0XCJdID0gXCJcXHUwMDI4XFx1MTEwNlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMDVcIl0gPSBcIlxcdTAwMjhcXHUxMTA3XFx1MDAyOVwiO1xuICB0W1wiXFx1MzIwNlwiXSA9IFwiXFx1MDAyOFxcdTExMDlcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjA3XCJdID0gXCJcXHUwMDI4XFx1MTEwQlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMDhcIl0gPSBcIlxcdTAwMjhcXHUxMTBDXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIwOVwiXSA9IFwiXFx1MDAyOFxcdTExMEVcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjBBXCJdID0gXCJcXHUwMDI4XFx1MTEwRlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMEJcIl0gPSBcIlxcdTAwMjhcXHUxMTEwXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIwQ1wiXSA9IFwiXFx1MDAyOFxcdTExMTFcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjBEXCJdID0gXCJcXHUwMDI4XFx1MTExMlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMEVcIl0gPSBcIlxcdTAwMjhcXHUxMTAwXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMEZcIl0gPSBcIlxcdTAwMjhcXHUxMTAyXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTBcIl0gPSBcIlxcdTAwMjhcXHUxMTAzXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTFcIl0gPSBcIlxcdTAwMjhcXHUxMTA1XFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTJcIl0gPSBcIlxcdTAwMjhcXHUxMTA2XFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTNcIl0gPSBcIlxcdTAwMjhcXHUxMTA3XFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTRcIl0gPSBcIlxcdTAwMjhcXHUxMTA5XFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTVcIl0gPSBcIlxcdTAwMjhcXHUxMTBCXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTZcIl0gPSBcIlxcdTAwMjhcXHUxMTBDXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTdcIl0gPSBcIlxcdTAwMjhcXHUxMTBFXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMThcIl0gPSBcIlxcdTAwMjhcXHUxMTBGXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMTlcIl0gPSBcIlxcdTAwMjhcXHUxMTEwXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMUFcIl0gPSBcIlxcdTAwMjhcXHUxMTExXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMUJcIl0gPSBcIlxcdTAwMjhcXHUxMTEyXFx1MTE2MVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMUNcIl0gPSBcIlxcdTAwMjhcXHUxMTBDXFx1MTE2RVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMURcIl0gPSBcIlxcdTAwMjhcXHUxMTBCXFx1MTE2OVxcdTExMENcXHUxMTY1XFx1MTFBQlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMUVcIl0gPSBcIlxcdTAwMjhcXHUxMTBCXFx1MTE2OVxcdTExMTJcXHUxMTZFXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyMFwiXSA9IFwiXFx1MDAyOFxcdTRFMDBcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjIxXCJdID0gXCJcXHUwMDI4XFx1NEU4Q1xcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMjJcIl0gPSBcIlxcdTAwMjhcXHU0RTA5XFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyM1wiXSA9IFwiXFx1MDAyOFxcdTU2REJcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjI0XCJdID0gXCJcXHUwMDI4XFx1NEU5NFxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMjVcIl0gPSBcIlxcdTAwMjhcXHU1MTZEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyNlwiXSA9IFwiXFx1MDAyOFxcdTRFMDNcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjI3XCJdID0gXCJcXHUwMDI4XFx1NTE2QlxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMjhcIl0gPSBcIlxcdTAwMjhcXHU0RTVEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyOVwiXSA9IFwiXFx1MDAyOFxcdTUzNDFcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjJBXCJdID0gXCJcXHUwMDI4XFx1NjcwOFxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMkJcIl0gPSBcIlxcdTAwMjhcXHU3MDZCXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyQ1wiXSA9IFwiXFx1MDAyOFxcdTZDMzRcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjJEXCJdID0gXCJcXHUwMDI4XFx1NjcyOFxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMkVcIl0gPSBcIlxcdTAwMjhcXHU5MUQxXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIyRlwiXSA9IFwiXFx1MDAyOFxcdTU3MUZcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjMwXCJdID0gXCJcXHUwMDI4XFx1NjVFNVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMzFcIl0gPSBcIlxcdTAwMjhcXHU2ODJBXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzMlwiXSA9IFwiXFx1MDAyOFxcdTY3MDlcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjMzXCJdID0gXCJcXHUwMDI4XFx1NzkzRVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMzRcIl0gPSBcIlxcdTAwMjhcXHU1NDBEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzNVwiXSA9IFwiXFx1MDAyOFxcdTcyNzlcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjM2XCJdID0gXCJcXHUwMDI4XFx1OENBMVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyMzdcIl0gPSBcIlxcdTAwMjhcXHU3OTVEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzOFwiXSA9IFwiXFx1MDAyOFxcdTUyQjRcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjM5XCJdID0gXCJcXHUwMDI4XFx1NEVFM1xcdTAwMjlcIjtcbiAgdFtcIlxcdTMyM0FcIl0gPSBcIlxcdTAwMjhcXHU1NDdDXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzQlwiXSA9IFwiXFx1MDAyOFxcdTVCNjZcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjNDXCJdID0gXCJcXHUwMDI4XFx1NzZFM1xcdTAwMjlcIjtcbiAgdFtcIlxcdTMyM0RcIl0gPSBcIlxcdTAwMjhcXHU0RjAxXFx1MDAyOVwiO1xuICB0W1wiXFx1MzIzRVwiXSA9IFwiXFx1MDAyOFxcdThDQzdcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjNGXCJdID0gXCJcXHUwMDI4XFx1NTM1NFxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyNDBcIl0gPSBcIlxcdTAwMjhcXHU3OTZEXFx1MDAyOVwiO1xuICB0W1wiXFx1MzI0MVwiXSA9IFwiXFx1MDAyOFxcdTRGMTFcXHUwMDI5XCI7XG4gIHRbXCJcXHUzMjQyXCJdID0gXCJcXHUwMDI4XFx1ODFFQVxcdTAwMjlcIjtcbiAgdFtcIlxcdTMyNDNcIl0gPSBcIlxcdTAwMjhcXHU4MUYzXFx1MDAyOVwiO1xuICB0W1wiXFx1MzJDMFwiXSA9IFwiXFx1MDAzMVxcdTY3MDhcIjtcbiAgdFtcIlxcdTMyQzFcIl0gPSBcIlxcdTAwMzJcXHU2NzA4XCI7XG4gIHRbXCJcXHUzMkMyXCJdID0gXCJcXHUwMDMzXFx1NjcwOFwiO1xuICB0W1wiXFx1MzJDM1wiXSA9IFwiXFx1MDAzNFxcdTY3MDhcIjtcbiAgdFtcIlxcdTMyQzRcIl0gPSBcIlxcdTAwMzVcXHU2NzA4XCI7XG4gIHRbXCJcXHUzMkM1XCJdID0gXCJcXHUwMDM2XFx1NjcwOFwiO1xuICB0W1wiXFx1MzJDNlwiXSA9IFwiXFx1MDAzN1xcdTY3MDhcIjtcbiAgdFtcIlxcdTMyQzdcIl0gPSBcIlxcdTAwMzhcXHU2NzA4XCI7XG4gIHRbXCJcXHUzMkM4XCJdID0gXCJcXHUwMDM5XFx1NjcwOFwiO1xuICB0W1wiXFx1MzJDOVwiXSA9IFwiXFx1MDAzMVxcdTAwMzBcXHU2NzA4XCI7XG4gIHRbXCJcXHUzMkNBXCJdID0gXCJcXHUwMDMxXFx1MDAzMVxcdTY3MDhcIjtcbiAgdFtcIlxcdTMyQ0JcIl0gPSBcIlxcdTAwMzFcXHUwMDMyXFx1NjcwOFwiO1xuICB0W1wiXFx1MzM1OFwiXSA9IFwiXFx1MDAzMFxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNTlcIl0gPSBcIlxcdTAwMzFcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzVBXCJdID0gXCJcXHUwMDMyXFx1NzBCOVwiO1xuICB0W1wiXFx1MzM1QlwiXSA9IFwiXFx1MDAzM1xcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNUNcIl0gPSBcIlxcdTAwMzRcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzVEXCJdID0gXCJcXHUwMDM1XFx1NzBCOVwiO1xuICB0W1wiXFx1MzM1RVwiXSA9IFwiXFx1MDAzNlxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNUZcIl0gPSBcIlxcdTAwMzdcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzYwXCJdID0gXCJcXHUwMDM4XFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2MVwiXSA9IFwiXFx1MDAzOVxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNjJcIl0gPSBcIlxcdTAwMzFcXHUwMDMwXFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2M1wiXSA9IFwiXFx1MDAzMVxcdTAwMzFcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzY0XCJdID0gXCJcXHUwMDMxXFx1MDAzMlxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNjVcIl0gPSBcIlxcdTAwMzFcXHUwMDMzXFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2NlwiXSA9IFwiXFx1MDAzMVxcdTAwMzRcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzY3XCJdID0gXCJcXHUwMDMxXFx1MDAzNVxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNjhcIl0gPSBcIlxcdTAwMzFcXHUwMDM2XFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2OVwiXSA9IFwiXFx1MDAzMVxcdTAwMzdcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzZBXCJdID0gXCJcXHUwMDMxXFx1MDAzOFxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNkJcIl0gPSBcIlxcdTAwMzFcXHUwMDM5XFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2Q1wiXSA9IFwiXFx1MDAzMlxcdTAwMzBcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzZEXCJdID0gXCJcXHUwMDMyXFx1MDAzMVxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzNkVcIl0gPSBcIlxcdTAwMzJcXHUwMDMyXFx1NzBCOVwiO1xuICB0W1wiXFx1MzM2RlwiXSA9IFwiXFx1MDAzMlxcdTAwMzNcXHU3MEI5XCI7XG4gIHRbXCJcXHUzMzcwXCJdID0gXCJcXHUwMDMyXFx1MDAzNFxcdTcwQjlcIjtcbiAgdFtcIlxcdTMzRTBcIl0gPSBcIlxcdTAwMzFcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0UxXCJdID0gXCJcXHUwMDMyXFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFMlwiXSA9IFwiXFx1MDAzM1xcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRTNcIl0gPSBcIlxcdTAwMzRcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0U0XCJdID0gXCJcXHUwMDM1XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFNVwiXSA9IFwiXFx1MDAzNlxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRTZcIl0gPSBcIlxcdTAwMzdcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0U3XCJdID0gXCJcXHUwMDM4XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFOFwiXSA9IFwiXFx1MDAzOVxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRTlcIl0gPSBcIlxcdTAwMzFcXHUwMDMwXFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFQVwiXSA9IFwiXFx1MDAzMVxcdTAwMzFcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0VCXCJdID0gXCJcXHUwMDMxXFx1MDAzMlxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRUNcIl0gPSBcIlxcdTAwMzFcXHUwMDMzXFx1NjVFNVwiO1xuICB0W1wiXFx1MzNFRFwiXSA9IFwiXFx1MDAzMVxcdTAwMzRcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0VFXCJdID0gXCJcXHUwMDMxXFx1MDAzNVxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRUZcIl0gPSBcIlxcdTAwMzFcXHUwMDM2XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGMFwiXSA9IFwiXFx1MDAzMVxcdTAwMzdcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0YxXCJdID0gXCJcXHUwMDMxXFx1MDAzOFxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRjJcIl0gPSBcIlxcdTAwMzFcXHUwMDM5XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGM1wiXSA9IFwiXFx1MDAzMlxcdTAwMzBcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0Y0XCJdID0gXCJcXHUwMDMyXFx1MDAzMVxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRjVcIl0gPSBcIlxcdTAwMzJcXHUwMDMyXFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGNlwiXSA9IFwiXFx1MDAzMlxcdTAwMzNcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0Y3XCJdID0gXCJcXHUwMDMyXFx1MDAzNFxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRjhcIl0gPSBcIlxcdTAwMzJcXHUwMDM1XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGOVwiXSA9IFwiXFx1MDAzMlxcdTAwMzZcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0ZBXCJdID0gXCJcXHUwMDMyXFx1MDAzN1xcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRkJcIl0gPSBcIlxcdTAwMzJcXHUwMDM4XFx1NjVFNVwiO1xuICB0W1wiXFx1MzNGQ1wiXSA9IFwiXFx1MDAzMlxcdTAwMzlcXHU2NUU1XCI7XG4gIHRbXCJcXHUzM0ZEXCJdID0gXCJcXHUwMDMzXFx1MDAzMFxcdTY1RTVcIjtcbiAgdFtcIlxcdTMzRkVcIl0gPSBcIlxcdTAwMzNcXHUwMDMxXFx1NjVFNVwiO1xuICB0W1wiXFx1RkIwMFwiXSA9IFwiXFx1MDA2NlxcdTAwNjZcIjtcbiAgdFtcIlxcdUZCMDFcIl0gPSBcIlxcdTAwNjZcXHUwMDY5XCI7XG4gIHRbXCJcXHVGQjAyXCJdID0gXCJcXHUwMDY2XFx1MDA2Q1wiO1xuICB0W1wiXFx1RkIwM1wiXSA9IFwiXFx1MDA2NlxcdTAwNjZcXHUwMDY5XCI7XG4gIHRbXCJcXHVGQjA0XCJdID0gXCJcXHUwMDY2XFx1MDA2NlxcdTAwNkNcIjtcbiAgdFtcIlxcdUZCMDVcIl0gPSBcIlxcdTAxN0ZcXHUwMDc0XCI7XG4gIHRbXCJcXHVGQjA2XCJdID0gXCJcXHUwMDczXFx1MDA3NFwiO1xuICB0W1wiXFx1RkIxM1wiXSA9IFwiXFx1MDU3NFxcdTA1NzZcIjtcbiAgdFtcIlxcdUZCMTRcIl0gPSBcIlxcdTA1NzRcXHUwNTY1XCI7XG4gIHRbXCJcXHVGQjE1XCJdID0gXCJcXHUwNTc0XFx1MDU2QlwiO1xuICB0W1wiXFx1RkIxNlwiXSA9IFwiXFx1MDU3RVxcdTA1NzZcIjtcbiAgdFtcIlxcdUZCMTdcIl0gPSBcIlxcdTA1NzRcXHUwNTZEXCI7XG4gIHRbXCJcXHVGQjRGXCJdID0gXCJcXHUwNUQwXFx1MDVEQ1wiO1xuICB0W1wiXFx1RkI1MFwiXSA9IFwiXFx1MDY3MVwiO1xuICB0W1wiXFx1RkI1MVwiXSA9IFwiXFx1MDY3MVwiO1xuICB0W1wiXFx1RkI1MlwiXSA9IFwiXFx1MDY3QlwiO1xuICB0W1wiXFx1RkI1M1wiXSA9IFwiXFx1MDY3QlwiO1xuICB0W1wiXFx1RkI1NFwiXSA9IFwiXFx1MDY3QlwiO1xuICB0W1wiXFx1RkI1NVwiXSA9IFwiXFx1MDY3QlwiO1xuICB0W1wiXFx1RkI1NlwiXSA9IFwiXFx1MDY3RVwiO1xuICB0W1wiXFx1RkI1N1wiXSA9IFwiXFx1MDY3RVwiO1xuICB0W1wiXFx1RkI1OFwiXSA9IFwiXFx1MDY3RVwiO1xuICB0W1wiXFx1RkI1OVwiXSA9IFwiXFx1MDY3RVwiO1xuICB0W1wiXFx1RkI1QVwiXSA9IFwiXFx1MDY4MFwiO1xuICB0W1wiXFx1RkI1QlwiXSA9IFwiXFx1MDY4MFwiO1xuICB0W1wiXFx1RkI1Q1wiXSA9IFwiXFx1MDY4MFwiO1xuICB0W1wiXFx1RkI1RFwiXSA9IFwiXFx1MDY4MFwiO1xuICB0W1wiXFx1RkI1RVwiXSA9IFwiXFx1MDY3QVwiO1xuICB0W1wiXFx1RkI1RlwiXSA9IFwiXFx1MDY3QVwiO1xuICB0W1wiXFx1RkI2MFwiXSA9IFwiXFx1MDY3QVwiO1xuICB0W1wiXFx1RkI2MVwiXSA9IFwiXFx1MDY3QVwiO1xuICB0W1wiXFx1RkI2MlwiXSA9IFwiXFx1MDY3RlwiO1xuICB0W1wiXFx1RkI2M1wiXSA9IFwiXFx1MDY3RlwiO1xuICB0W1wiXFx1RkI2NFwiXSA9IFwiXFx1MDY3RlwiO1xuICB0W1wiXFx1RkI2NVwiXSA9IFwiXFx1MDY3RlwiO1xuICB0W1wiXFx1RkI2NlwiXSA9IFwiXFx1MDY3OVwiO1xuICB0W1wiXFx1RkI2N1wiXSA9IFwiXFx1MDY3OVwiO1xuICB0W1wiXFx1RkI2OFwiXSA9IFwiXFx1MDY3OVwiO1xuICB0W1wiXFx1RkI2OVwiXSA9IFwiXFx1MDY3OVwiO1xuICB0W1wiXFx1RkI2QVwiXSA9IFwiXFx1MDZBNFwiO1xuICB0W1wiXFx1RkI2QlwiXSA9IFwiXFx1MDZBNFwiO1xuICB0W1wiXFx1RkI2Q1wiXSA9IFwiXFx1MDZBNFwiO1xuICB0W1wiXFx1RkI2RFwiXSA9IFwiXFx1MDZBNFwiO1xuICB0W1wiXFx1RkI2RVwiXSA9IFwiXFx1MDZBNlwiO1xuICB0W1wiXFx1RkI2RlwiXSA9IFwiXFx1MDZBNlwiO1xuICB0W1wiXFx1RkI3MFwiXSA9IFwiXFx1MDZBNlwiO1xuICB0W1wiXFx1RkI3MVwiXSA9IFwiXFx1MDZBNlwiO1xuICB0W1wiXFx1RkI3MlwiXSA9IFwiXFx1MDY4NFwiO1xuICB0W1wiXFx1RkI3M1wiXSA9IFwiXFx1MDY4NFwiO1xuICB0W1wiXFx1RkI3NFwiXSA9IFwiXFx1MDY4NFwiO1xuICB0W1wiXFx1RkI3NVwiXSA9IFwiXFx1MDY4NFwiO1xuICB0W1wiXFx1RkI3NlwiXSA9IFwiXFx1MDY4M1wiO1xuICB0W1wiXFx1RkI3N1wiXSA9IFwiXFx1MDY4M1wiO1xuICB0W1wiXFx1RkI3OFwiXSA9IFwiXFx1MDY4M1wiO1xuICB0W1wiXFx1RkI3OVwiXSA9IFwiXFx1MDY4M1wiO1xuICB0W1wiXFx1RkI3QVwiXSA9IFwiXFx1MDY4NlwiO1xuICB0W1wiXFx1RkI3QlwiXSA9IFwiXFx1MDY4NlwiO1xuICB0W1wiXFx1RkI3Q1wiXSA9IFwiXFx1MDY4NlwiO1xuICB0W1wiXFx1RkI3RFwiXSA9IFwiXFx1MDY4NlwiO1xuICB0W1wiXFx1RkI3RVwiXSA9IFwiXFx1MDY4N1wiO1xuICB0W1wiXFx1RkI3RlwiXSA9IFwiXFx1MDY4N1wiO1xuICB0W1wiXFx1RkI4MFwiXSA9IFwiXFx1MDY4N1wiO1xuICB0W1wiXFx1RkI4MVwiXSA9IFwiXFx1MDY4N1wiO1xuICB0W1wiXFx1RkI4MlwiXSA9IFwiXFx1MDY4RFwiO1xuICB0W1wiXFx1RkI4M1wiXSA9IFwiXFx1MDY4RFwiO1xuICB0W1wiXFx1RkI4NFwiXSA9IFwiXFx1MDY4Q1wiO1xuICB0W1wiXFx1RkI4NVwiXSA9IFwiXFx1MDY4Q1wiO1xuICB0W1wiXFx1RkI4NlwiXSA9IFwiXFx1MDY4RVwiO1xuICB0W1wiXFx1RkI4N1wiXSA9IFwiXFx1MDY4RVwiO1xuICB0W1wiXFx1RkI4OFwiXSA9IFwiXFx1MDY4OFwiO1xuICB0W1wiXFx1RkI4OVwiXSA9IFwiXFx1MDY4OFwiO1xuICB0W1wiXFx1RkI4QVwiXSA9IFwiXFx1MDY5OFwiO1xuICB0W1wiXFx1RkI4QlwiXSA9IFwiXFx1MDY5OFwiO1xuICB0W1wiXFx1RkI4Q1wiXSA9IFwiXFx1MDY5MVwiO1xuICB0W1wiXFx1RkI4RFwiXSA9IFwiXFx1MDY5MVwiO1xuICB0W1wiXFx1RkI4RVwiXSA9IFwiXFx1MDZBOVwiO1xuICB0W1wiXFx1RkI4RlwiXSA9IFwiXFx1MDZBOVwiO1xuICB0W1wiXFx1RkI5MFwiXSA9IFwiXFx1MDZBOVwiO1xuICB0W1wiXFx1RkI5MVwiXSA9IFwiXFx1MDZBOVwiO1xuICB0W1wiXFx1RkI5MlwiXSA9IFwiXFx1MDZBRlwiO1xuICB0W1wiXFx1RkI5M1wiXSA9IFwiXFx1MDZBRlwiO1xuICB0W1wiXFx1RkI5NFwiXSA9IFwiXFx1MDZBRlwiO1xuICB0W1wiXFx1RkI5NVwiXSA9IFwiXFx1MDZBRlwiO1xuICB0W1wiXFx1RkI5NlwiXSA9IFwiXFx1MDZCM1wiO1xuICB0W1wiXFx1RkI5N1wiXSA9IFwiXFx1MDZCM1wiO1xuICB0W1wiXFx1RkI5OFwiXSA9IFwiXFx1MDZCM1wiO1xuICB0W1wiXFx1RkI5OVwiXSA9IFwiXFx1MDZCM1wiO1xuICB0W1wiXFx1RkI5QVwiXSA9IFwiXFx1MDZCMVwiO1xuICB0W1wiXFx1RkI5QlwiXSA9IFwiXFx1MDZCMVwiO1xuICB0W1wiXFx1RkI5Q1wiXSA9IFwiXFx1MDZCMVwiO1xuICB0W1wiXFx1RkI5RFwiXSA9IFwiXFx1MDZCMVwiO1xuICB0W1wiXFx1RkI5RVwiXSA9IFwiXFx1MDZCQVwiO1xuICB0W1wiXFx1RkI5RlwiXSA9IFwiXFx1MDZCQVwiO1xuICB0W1wiXFx1RkJBMFwiXSA9IFwiXFx1MDZCQlwiO1xuICB0W1wiXFx1RkJBMVwiXSA9IFwiXFx1MDZCQlwiO1xuICB0W1wiXFx1RkJBMlwiXSA9IFwiXFx1MDZCQlwiO1xuICB0W1wiXFx1RkJBM1wiXSA9IFwiXFx1MDZCQlwiO1xuICB0W1wiXFx1RkJBNFwiXSA9IFwiXFx1MDZDMFwiO1xuICB0W1wiXFx1RkJBNVwiXSA9IFwiXFx1MDZDMFwiO1xuICB0W1wiXFx1RkJBNlwiXSA9IFwiXFx1MDZDMVwiO1xuICB0W1wiXFx1RkJBN1wiXSA9IFwiXFx1MDZDMVwiO1xuICB0W1wiXFx1RkJBOFwiXSA9IFwiXFx1MDZDMVwiO1xuICB0W1wiXFx1RkJBOVwiXSA9IFwiXFx1MDZDMVwiO1xuICB0W1wiXFx1RkJBQVwiXSA9IFwiXFx1MDZCRVwiO1xuICB0W1wiXFx1RkJBQlwiXSA9IFwiXFx1MDZCRVwiO1xuICB0W1wiXFx1RkJBQ1wiXSA9IFwiXFx1MDZCRVwiO1xuICB0W1wiXFx1RkJBRFwiXSA9IFwiXFx1MDZCRVwiO1xuICB0W1wiXFx1RkJBRVwiXSA9IFwiXFx1MDZEMlwiO1xuICB0W1wiXFx1RkJBRlwiXSA9IFwiXFx1MDZEMlwiO1xuICB0W1wiXFx1RkJCMFwiXSA9IFwiXFx1MDZEM1wiO1xuICB0W1wiXFx1RkJCMVwiXSA9IFwiXFx1MDZEM1wiO1xuICB0W1wiXFx1RkJEM1wiXSA9IFwiXFx1MDZBRFwiO1xuICB0W1wiXFx1RkJENFwiXSA9IFwiXFx1MDZBRFwiO1xuICB0W1wiXFx1RkJENVwiXSA9IFwiXFx1MDZBRFwiO1xuICB0W1wiXFx1RkJENlwiXSA9IFwiXFx1MDZBRFwiO1xuICB0W1wiXFx1RkJEN1wiXSA9IFwiXFx1MDZDN1wiO1xuICB0W1wiXFx1RkJEOFwiXSA9IFwiXFx1MDZDN1wiO1xuICB0W1wiXFx1RkJEOVwiXSA9IFwiXFx1MDZDNlwiO1xuICB0W1wiXFx1RkJEQVwiXSA9IFwiXFx1MDZDNlwiO1xuICB0W1wiXFx1RkJEQlwiXSA9IFwiXFx1MDZDOFwiO1xuICB0W1wiXFx1RkJEQ1wiXSA9IFwiXFx1MDZDOFwiO1xuICB0W1wiXFx1RkJERFwiXSA9IFwiXFx1MDY3N1wiO1xuICB0W1wiXFx1RkJERVwiXSA9IFwiXFx1MDZDQlwiO1xuICB0W1wiXFx1RkJERlwiXSA9IFwiXFx1MDZDQlwiO1xuICB0W1wiXFx1RkJFMFwiXSA9IFwiXFx1MDZDNVwiO1xuICB0W1wiXFx1RkJFMVwiXSA9IFwiXFx1MDZDNVwiO1xuICB0W1wiXFx1RkJFMlwiXSA9IFwiXFx1MDZDOVwiO1xuICB0W1wiXFx1RkJFM1wiXSA9IFwiXFx1MDZDOVwiO1xuICB0W1wiXFx1RkJFNFwiXSA9IFwiXFx1MDZEMFwiO1xuICB0W1wiXFx1RkJFNVwiXSA9IFwiXFx1MDZEMFwiO1xuICB0W1wiXFx1RkJFNlwiXSA9IFwiXFx1MDZEMFwiO1xuICB0W1wiXFx1RkJFN1wiXSA9IFwiXFx1MDZEMFwiO1xuICB0W1wiXFx1RkJFOFwiXSA9IFwiXFx1MDY0OVwiO1xuICB0W1wiXFx1RkJFOVwiXSA9IFwiXFx1MDY0OVwiO1xuICB0W1wiXFx1RkJFQVwiXSA9IFwiXFx1MDYyNlxcdTA2MjdcIjtcbiAgdFtcIlxcdUZCRUJcIl0gPSBcIlxcdTA2MjZcXHUwNjI3XCI7XG4gIHRbXCJcXHVGQkVDXCJdID0gXCJcXHUwNjI2XFx1MDZENVwiO1xuICB0W1wiXFx1RkJFRFwiXSA9IFwiXFx1MDYyNlxcdTA2RDVcIjtcbiAgdFtcIlxcdUZCRUVcIl0gPSBcIlxcdTA2MjZcXHUwNjQ4XCI7XG4gIHRbXCJcXHVGQkVGXCJdID0gXCJcXHUwNjI2XFx1MDY0OFwiO1xuICB0W1wiXFx1RkJGMFwiXSA9IFwiXFx1MDYyNlxcdTA2QzdcIjtcbiAgdFtcIlxcdUZCRjFcIl0gPSBcIlxcdTA2MjZcXHUwNkM3XCI7XG4gIHRbXCJcXHVGQkYyXCJdID0gXCJcXHUwNjI2XFx1MDZDNlwiO1xuICB0W1wiXFx1RkJGM1wiXSA9IFwiXFx1MDYyNlxcdTA2QzZcIjtcbiAgdFtcIlxcdUZCRjRcIl0gPSBcIlxcdTA2MjZcXHUwNkM4XCI7XG4gIHRbXCJcXHVGQkY1XCJdID0gXCJcXHUwNjI2XFx1MDZDOFwiO1xuICB0W1wiXFx1RkJGNlwiXSA9IFwiXFx1MDYyNlxcdTA2RDBcIjtcbiAgdFtcIlxcdUZCRjdcIl0gPSBcIlxcdTA2MjZcXHUwNkQwXCI7XG4gIHRbXCJcXHVGQkY4XCJdID0gXCJcXHUwNjI2XFx1MDZEMFwiO1xuICB0W1wiXFx1RkJGOVwiXSA9IFwiXFx1MDYyNlxcdTA2NDlcIjtcbiAgdFtcIlxcdUZCRkFcIl0gPSBcIlxcdTA2MjZcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQkZCXCJdID0gXCJcXHUwNjI2XFx1MDY0OVwiO1xuICB0W1wiXFx1RkJGQ1wiXSA9IFwiXFx1MDZDQ1wiO1xuICB0W1wiXFx1RkJGRFwiXSA9IFwiXFx1MDZDQ1wiO1xuICB0W1wiXFx1RkJGRVwiXSA9IFwiXFx1MDZDQ1wiO1xuICB0W1wiXFx1RkJGRlwiXSA9IFwiXFx1MDZDQ1wiO1xuICB0W1wiXFx1RkMwMFwiXSA9IFwiXFx1MDYyNlxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDMDFcIl0gPSBcIlxcdTA2MjZcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzAyXCJdID0gXCJcXHUwNjI2XFx1MDY0NVwiO1xuICB0W1wiXFx1RkMwM1wiXSA9IFwiXFx1MDYyNlxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDMDRcIl0gPSBcIlxcdTA2MjZcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQzA1XCJdID0gXCJcXHUwNjI4XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMwNlwiXSA9IFwiXFx1MDYyOFxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDMDdcIl0gPSBcIlxcdTA2MjhcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQzA4XCJdID0gXCJcXHUwNjI4XFx1MDY0NVwiO1xuICB0W1wiXFx1RkMwOVwiXSA9IFwiXFx1MDYyOFxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDMEFcIl0gPSBcIlxcdTA2MjhcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQzBCXCJdID0gXCJcXHUwNjJBXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMwQ1wiXSA9IFwiXFx1MDYyQVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDMERcIl0gPSBcIlxcdTA2MkFcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQzBFXCJdID0gXCJcXHUwNjJBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkMwRlwiXSA9IFwiXFx1MDYyQVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDMTBcIl0gPSBcIlxcdTA2MkFcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQzExXCJdID0gXCJcXHUwNjJCXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMxMlwiXSA9IFwiXFx1MDYyQlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMTNcIl0gPSBcIlxcdTA2MkJcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzE0XCJdID0gXCJcXHUwNjJCXFx1MDY0QVwiO1xuICB0W1wiXFx1RkMxNVwiXSA9IFwiXFx1MDYyQ1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZDMTZcIl0gPSBcIlxcdTA2MkNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzE3XCJdID0gXCJcXHUwNjJEXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMxOFwiXSA9IFwiXFx1MDYyRFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMTlcIl0gPSBcIlxcdTA2MkVcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzFBXCJdID0gXCJcXHUwNjJFXFx1MDYyRFwiO1xuICB0W1wiXFx1RkMxQlwiXSA9IFwiXFx1MDYyRVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMUNcIl0gPSBcIlxcdTA2MzNcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzFEXCJdID0gXCJcXHUwNjMzXFx1MDYyRFwiO1xuICB0W1wiXFx1RkMxRVwiXSA9IFwiXFx1MDYzM1xcdTA2MkVcIjtcbiAgdFtcIlxcdUZDMUZcIl0gPSBcIlxcdTA2MzNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzIwXCJdID0gXCJcXHUwNjM1XFx1MDYyRFwiO1xuICB0W1wiXFx1RkMyMVwiXSA9IFwiXFx1MDYzNVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMjJcIl0gPSBcIlxcdTA2MzZcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzIzXCJdID0gXCJcXHUwNjM2XFx1MDYyRFwiO1xuICB0W1wiXFx1RkMyNFwiXSA9IFwiXFx1MDYzNlxcdTA2MkVcIjtcbiAgdFtcIlxcdUZDMjVcIl0gPSBcIlxcdTA2MzZcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzI2XCJdID0gXCJcXHUwNjM3XFx1MDYyRFwiO1xuICB0W1wiXFx1RkMyN1wiXSA9IFwiXFx1MDYzN1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMjhcIl0gPSBcIlxcdTA2MzhcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzI5XCJdID0gXCJcXHUwNjM5XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMyQVwiXSA9IFwiXFx1MDYzOVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMkJcIl0gPSBcIlxcdTA2M0FcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzJDXCJdID0gXCJcXHUwNjNBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkMyRFwiXSA9IFwiXFx1MDY0MVxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDMkVcIl0gPSBcIlxcdTA2NDFcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzJGXCJdID0gXCJcXHUwNjQxXFx1MDYyRVwiO1xuICB0W1wiXFx1RkMzMFwiXSA9IFwiXFx1MDY0MVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDMzFcIl0gPSBcIlxcdTA2NDFcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzMyXCJdID0gXCJcXHUwNjQxXFx1MDY0QVwiO1xuICB0W1wiXFx1RkMzM1wiXSA9IFwiXFx1MDY0MlxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDMzRcIl0gPSBcIlxcdTA2NDJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzM1XCJdID0gXCJcXHUwNjQyXFx1MDY0OVwiO1xuICB0W1wiXFx1RkMzNlwiXSA9IFwiXFx1MDY0MlxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDMzdcIl0gPSBcIlxcdTA2NDNcXHUwNjI3XCI7XG4gIHRbXCJcXHVGQzM4XCJdID0gXCJcXHUwNjQzXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkMzOVwiXSA9IFwiXFx1MDY0M1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZDM0FcIl0gPSBcIlxcdTA2NDNcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQzNCXCJdID0gXCJcXHUwNjQzXFx1MDY0NFwiO1xuICB0W1wiXFx1RkMzQ1wiXSA9IFwiXFx1MDY0M1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDM0RcIl0gPSBcIlxcdTA2NDNcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzNFXCJdID0gXCJcXHUwNjQzXFx1MDY0QVwiO1xuICB0W1wiXFx1RkMzRlwiXSA9IFwiXFx1MDY0NFxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDNDBcIl0gPSBcIlxcdTA2NDRcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzQxXCJdID0gXCJcXHUwNjQ0XFx1MDYyRVwiO1xuICB0W1wiXFx1RkM0MlwiXSA9IFwiXFx1MDY0NFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNDNcIl0gPSBcIlxcdTA2NDRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzQ0XCJdID0gXCJcXHUwNjQ0XFx1MDY0QVwiO1xuICB0W1wiXFx1RkM0NVwiXSA9IFwiXFx1MDY0NVxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDNDZcIl0gPSBcIlxcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzQ3XCJdID0gXCJcXHUwNjQ1XFx1MDYyRVwiO1xuICB0W1wiXFx1RkM0OFwiXSA9IFwiXFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNDlcIl0gPSBcIlxcdTA2NDVcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzRBXCJdID0gXCJcXHUwNjQ1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkM0QlwiXSA9IFwiXFx1MDY0NlxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDNENcIl0gPSBcIlxcdTA2NDZcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzREXCJdID0gXCJcXHUwNjQ2XFx1MDYyRVwiO1xuICB0W1wiXFx1RkM0RVwiXSA9IFwiXFx1MDY0NlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNEZcIl0gPSBcIlxcdTA2NDZcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzUwXCJdID0gXCJcXHUwNjQ2XFx1MDY0QVwiO1xuICB0W1wiXFx1RkM1MVwiXSA9IFwiXFx1MDY0N1xcdTA2MkNcIjtcbiAgdFtcIlxcdUZDNTJcIl0gPSBcIlxcdTA2NDdcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzUzXCJdID0gXCJcXHUwNjQ3XFx1MDY0OVwiO1xuICB0W1wiXFx1RkM1NFwiXSA9IFwiXFx1MDY0N1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNTVcIl0gPSBcIlxcdTA2NEFcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzU2XCJdID0gXCJcXHUwNjRBXFx1MDYyRFwiO1xuICB0W1wiXFx1RkM1N1wiXSA9IFwiXFx1MDY0QVxcdTA2MkVcIjtcbiAgdFtcIlxcdUZDNThcIl0gPSBcIlxcdTA2NEFcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzU5XCJdID0gXCJcXHUwNjRBXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM1QVwiXSA9IFwiXFx1MDY0QVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNUJcIl0gPSBcIlxcdTA2MzBcXHUwNjcwXCI7XG4gIHRbXCJcXHVGQzVDXCJdID0gXCJcXHUwNjMxXFx1MDY3MFwiO1xuICB0W1wiXFx1RkM1RFwiXSA9IFwiXFx1MDY0OVxcdTA2NzBcIjtcbiAgdFtcIlxcdUZDNUVcIl0gPSBcIlxcdTAwMjBcXHUwNjRDXFx1MDY1MVwiO1xuICB0W1wiXFx1RkM1RlwiXSA9IFwiXFx1MDAyMFxcdTA2NERcXHUwNjUxXCI7XG4gIHRbXCJcXHVGQzYwXCJdID0gXCJcXHUwMDIwXFx1MDY0RVxcdTA2NTFcIjtcbiAgdFtcIlxcdUZDNjFcIl0gPSBcIlxcdTAwMjBcXHUwNjRGXFx1MDY1MVwiO1xuICB0W1wiXFx1RkM2MlwiXSA9IFwiXFx1MDAyMFxcdTA2NTBcXHUwNjUxXCI7XG4gIHRbXCJcXHVGQzYzXCJdID0gXCJcXHUwMDIwXFx1MDY1MVxcdTA2NzBcIjtcbiAgdFtcIlxcdUZDNjRcIl0gPSBcIlxcdTA2MjZcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzY1XCJdID0gXCJcXHUwNjI2XFx1MDYzMlwiO1xuICB0W1wiXFx1RkM2NlwiXSA9IFwiXFx1MDYyNlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNjdcIl0gPSBcIlxcdTA2MjZcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzY4XCJdID0gXCJcXHUwNjI2XFx1MDY0OVwiO1xuICB0W1wiXFx1RkM2OVwiXSA9IFwiXFx1MDYyNlxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNkFcIl0gPSBcIlxcdTA2MjhcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzZCXCJdID0gXCJcXHUwNjI4XFx1MDYzMlwiO1xuICB0W1wiXFx1RkM2Q1wiXSA9IFwiXFx1MDYyOFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNkRcIl0gPSBcIlxcdTA2MjhcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzZFXCJdID0gXCJcXHUwNjI4XFx1MDY0OVwiO1xuICB0W1wiXFx1RkM2RlwiXSA9IFwiXFx1MDYyOFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNzBcIl0gPSBcIlxcdTA2MkFcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzcxXCJdID0gXCJcXHUwNjJBXFx1MDYzMlwiO1xuICB0W1wiXFx1RkM3MlwiXSA9IFwiXFx1MDYyQVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNzNcIl0gPSBcIlxcdTA2MkFcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzc0XCJdID0gXCJcXHUwNjJBXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM3NVwiXSA9IFwiXFx1MDYyQVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDNzZcIl0gPSBcIlxcdTA2MkJcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzc3XCJdID0gXCJcXHUwNjJCXFx1MDYzMlwiO1xuICB0W1wiXFx1RkM3OFwiXSA9IFwiXFx1MDYyQlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDNzlcIl0gPSBcIlxcdTA2MkJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzdBXCJdID0gXCJcXHUwNjJCXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM3QlwiXSA9IFwiXFx1MDYyQlxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDN0NcIl0gPSBcIlxcdTA2NDFcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzdEXCJdID0gXCJcXHUwNjQxXFx1MDY0QVwiO1xuICB0W1wiXFx1RkM3RVwiXSA9IFwiXFx1MDY0MlxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDN0ZcIl0gPSBcIlxcdTA2NDJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQzgwXCJdID0gXCJcXHUwNjQzXFx1MDYyN1wiO1xuICB0W1wiXFx1RkM4MVwiXSA9IFwiXFx1MDY0M1xcdTA2NDRcIjtcbiAgdFtcIlxcdUZDODJcIl0gPSBcIlxcdTA2NDNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzgzXCJdID0gXCJcXHUwNjQzXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM4NFwiXSA9IFwiXFx1MDY0M1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZDODVcIl0gPSBcIlxcdTA2NDRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzg2XCJdID0gXCJcXHUwNjQ0XFx1MDY0OVwiO1xuICB0W1wiXFx1RkM4N1wiXSA9IFwiXFx1MDY0NFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDODhcIl0gPSBcIlxcdTA2NDVcXHUwNjI3XCI7XG4gIHRbXCJcXHVGQzg5XCJdID0gXCJcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkM4QVwiXSA9IFwiXFx1MDY0NlxcdTA2MzFcIjtcbiAgdFtcIlxcdUZDOEJcIl0gPSBcIlxcdTA2NDZcXHUwNjMyXCI7XG4gIHRbXCJcXHVGQzhDXCJdID0gXCJcXHUwNjQ2XFx1MDY0NVwiO1xuICB0W1wiXFx1RkM4RFwiXSA9IFwiXFx1MDY0NlxcdTA2NDZcIjtcbiAgdFtcIlxcdUZDOEVcIl0gPSBcIlxcdTA2NDZcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQzhGXCJdID0gXCJcXHUwNjQ2XFx1MDY0QVwiO1xuICB0W1wiXFx1RkM5MFwiXSA9IFwiXFx1MDY0OVxcdTA2NzBcIjtcbiAgdFtcIlxcdUZDOTFcIl0gPSBcIlxcdTA2NEFcXHUwNjMxXCI7XG4gIHRbXCJcXHVGQzkyXCJdID0gXCJcXHUwNjRBXFx1MDYzMlwiO1xuICB0W1wiXFx1RkM5M1wiXSA9IFwiXFx1MDY0QVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDOTRcIl0gPSBcIlxcdTA2NEFcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGQzk1XCJdID0gXCJcXHUwNjRBXFx1MDY0OVwiO1xuICB0W1wiXFx1RkM5NlwiXSA9IFwiXFx1MDY0QVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZDOTdcIl0gPSBcIlxcdTA2MjZcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQzk4XCJdID0gXCJcXHUwNjI2XFx1MDYyRFwiO1xuICB0W1wiXFx1RkM5OVwiXSA9IFwiXFx1MDYyNlxcdTA2MkVcIjtcbiAgdFtcIlxcdUZDOUFcIl0gPSBcIlxcdTA2MjZcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQzlCXCJdID0gXCJcXHUwNjI2XFx1MDY0N1wiO1xuICB0W1wiXFx1RkM5Q1wiXSA9IFwiXFx1MDYyOFxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDOURcIl0gPSBcIlxcdTA2MjhcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQzlFXCJdID0gXCJcXHUwNjI4XFx1MDYyRVwiO1xuICB0W1wiXFx1RkM5RlwiXSA9IFwiXFx1MDYyOFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQTBcIl0gPSBcIlxcdTA2MjhcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0ExXCJdID0gXCJcXHUwNjJBXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNBMlwiXSA9IFwiXFx1MDYyQVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDQTNcIl0gPSBcIlxcdTA2MkFcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0E0XCJdID0gXCJcXHUwNjJBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNBNVwiXSA9IFwiXFx1MDYyQVxcdTA2NDdcIjtcbiAgdFtcIlxcdUZDQTZcIl0gPSBcIlxcdTA2MkJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0E3XCJdID0gXCJcXHUwNjJDXFx1MDYyRFwiO1xuICB0W1wiXFx1RkNBOFwiXSA9IFwiXFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQTlcIl0gPSBcIlxcdTA2MkRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQ0FBXCJdID0gXCJcXHUwNjJEXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNBQlwiXSA9IFwiXFx1MDYyRVxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDQUNcIl0gPSBcIlxcdTA2MkVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0FEXCJdID0gXCJcXHUwNjMzXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNBRVwiXSA9IFwiXFx1MDYzM1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZDQUZcIl0gPSBcIlxcdTA2MzNcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0IwXCJdID0gXCJcXHUwNjMzXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNCMVwiXSA9IFwiXFx1MDYzNVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDQjJcIl0gPSBcIlxcdTA2MzVcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0IzXCJdID0gXCJcXHUwNjM1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkNCNFwiXSA9IFwiXFx1MDYzNlxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDQjVcIl0gPSBcIlxcdTA2MzZcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQ0I2XCJdID0gXCJcXHUwNjM2XFx1MDYyRVwiO1xuICB0W1wiXFx1RkNCN1wiXSA9IFwiXFx1MDYzNlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQjhcIl0gPSBcIlxcdTA2MzdcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQ0I5XCJdID0gXCJcXHUwNjM4XFx1MDY0NVwiO1xuICB0W1wiXFx1RkNCQVwiXSA9IFwiXFx1MDYzOVxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDQkJcIl0gPSBcIlxcdTA2MzlcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0JDXCJdID0gXCJcXHUwNjNBXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNCRFwiXSA9IFwiXFx1MDYzQVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQkVcIl0gPSBcIlxcdTA2NDFcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQ0JGXCJdID0gXCJcXHUwNjQxXFx1MDYyRFwiO1xuICB0W1wiXFx1RkNDMFwiXSA9IFwiXFx1MDY0MVxcdTA2MkVcIjtcbiAgdFtcIlxcdUZDQzFcIl0gPSBcIlxcdTA2NDFcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0MyXCJdID0gXCJcXHUwNjQyXFx1MDYyRFwiO1xuICB0W1wiXFx1RkNDM1wiXSA9IFwiXFx1MDY0MlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQzRcIl0gPSBcIlxcdTA2NDNcXHUwNjJDXCI7XG4gIHRbXCJcXHVGQ0M1XCJdID0gXCJcXHUwNjQzXFx1MDYyRFwiO1xuICB0W1wiXFx1RkNDNlwiXSA9IFwiXFx1MDY0M1xcdTA2MkVcIjtcbiAgdFtcIlxcdUZDQzdcIl0gPSBcIlxcdTA2NDNcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGQ0M4XCJdID0gXCJcXHUwNjQzXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNDOVwiXSA9IFwiXFx1MDY0NFxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDQ0FcIl0gPSBcIlxcdTA2NDRcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQ0NCXCJdID0gXCJcXHUwNjQ0XFx1MDYyRVwiO1xuICB0W1wiXFx1RkNDQ1wiXSA9IFwiXFx1MDY0NFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDQ0RcIl0gPSBcIlxcdTA2NDRcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0NFXCJdID0gXCJcXHUwNjQ1XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNDRlwiXSA9IFwiXFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDRDBcIl0gPSBcIlxcdTA2NDVcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0QxXCJdID0gXCJcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkNEMlwiXSA9IFwiXFx1MDY0NlxcdTA2MkNcIjtcbiAgdFtcIlxcdUZDRDNcIl0gPSBcIlxcdTA2NDZcXHUwNjJEXCI7XG4gIHRbXCJcXHVGQ0Q0XCJdID0gXCJcXHUwNjQ2XFx1MDYyRVwiO1xuICB0W1wiXFx1RkNENVwiXSA9IFwiXFx1MDY0NlxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRDZcIl0gPSBcIlxcdTA2NDZcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0Q3XCJdID0gXCJcXHUwNjQ3XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNEOFwiXSA9IFwiXFx1MDY0N1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRDlcIl0gPSBcIlxcdTA2NDdcXHUwNjcwXCI7XG4gIHRbXCJcXHVGQ0RBXCJdID0gXCJcXHUwNjRBXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkNEQlwiXSA9IFwiXFx1MDY0QVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZDRENcIl0gPSBcIlxcdTA2NEFcXHUwNjJFXCI7XG4gIHRbXCJcXHVGQ0REXCJdID0gXCJcXHUwNjRBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNERVwiXSA9IFwiXFx1MDY0QVxcdTA2NDdcIjtcbiAgdFtcIlxcdUZDREZcIl0gPSBcIlxcdTA2MjZcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0UwXCJdID0gXCJcXHUwNjI2XFx1MDY0N1wiO1xuICB0W1wiXFx1RkNFMVwiXSA9IFwiXFx1MDYyOFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRTJcIl0gPSBcIlxcdTA2MjhcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0UzXCJdID0gXCJcXHUwNjJBXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNFNFwiXSA9IFwiXFx1MDYyQVxcdTA2NDdcIjtcbiAgdFtcIlxcdUZDRTVcIl0gPSBcIlxcdTA2MkJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0U2XCJdID0gXCJcXHUwNjJCXFx1MDY0N1wiO1xuICB0W1wiXFx1RkNFN1wiXSA9IFwiXFx1MDYzM1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRThcIl0gPSBcIlxcdTA2MzNcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0U5XCJdID0gXCJcXHUwNjM0XFx1MDY0NVwiO1xuICB0W1wiXFx1RkNFQVwiXSA9IFwiXFx1MDYzNFxcdTA2NDdcIjtcbiAgdFtcIlxcdUZDRUJcIl0gPSBcIlxcdTA2NDNcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGQ0VDXCJdID0gXCJcXHUwNjQzXFx1MDY0NVwiO1xuICB0W1wiXFx1RkNFRFwiXSA9IFwiXFx1MDY0NFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRUVcIl0gPSBcIlxcdTA2NDZcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGQ0VGXCJdID0gXCJcXHUwNjQ2XFx1MDY0N1wiO1xuICB0W1wiXFx1RkNGMFwiXSA9IFwiXFx1MDY0QVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZDRjFcIl0gPSBcIlxcdTA2NEFcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGQ0YyXCJdID0gXCJcXHUwNjQwXFx1MDY0RVxcdTA2NTFcIjtcbiAgdFtcIlxcdUZDRjNcIl0gPSBcIlxcdTA2NDBcXHUwNjRGXFx1MDY1MVwiO1xuICB0W1wiXFx1RkNGNFwiXSA9IFwiXFx1MDY0MFxcdTA2NTBcXHUwNjUxXCI7XG4gIHRbXCJcXHVGQ0Y1XCJdID0gXCJcXHUwNjM3XFx1MDY0OVwiO1xuICB0W1wiXFx1RkNGNlwiXSA9IFwiXFx1MDYzN1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZDRjdcIl0gPSBcIlxcdTA2MzlcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQ0Y4XCJdID0gXCJcXHUwNjM5XFx1MDY0QVwiO1xuICB0W1wiXFx1RkNGOVwiXSA9IFwiXFx1MDYzQVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZDRkFcIl0gPSBcIlxcdTA2M0FcXHUwNjRBXCI7XG4gIHRbXCJcXHVGQ0ZCXCJdID0gXCJcXHUwNjMzXFx1MDY0OVwiO1xuICB0W1wiXFx1RkNGQ1wiXSA9IFwiXFx1MDYzM1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZDRkRcIl0gPSBcIlxcdTA2MzRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGQ0ZFXCJdID0gXCJcXHUwNjM0XFx1MDY0QVwiO1xuICB0W1wiXFx1RkNGRlwiXSA9IFwiXFx1MDYyRFxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMDBcIl0gPSBcIlxcdTA2MkRcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDAxXCJdID0gXCJcXHUwNjJDXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQwMlwiXSA9IFwiXFx1MDYyQ1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMDNcIl0gPSBcIlxcdTA2MkVcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDA0XCJdID0gXCJcXHUwNjJFXFx1MDY0QVwiO1xuICB0W1wiXFx1RkQwNVwiXSA9IFwiXFx1MDYzNVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMDZcIl0gPSBcIlxcdTA2MzVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDA3XCJdID0gXCJcXHUwNjM2XFx1MDY0OVwiO1xuICB0W1wiXFx1RkQwOFwiXSA9IFwiXFx1MDYzNlxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMDlcIl0gPSBcIlxcdTA2MzRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDBBXCJdID0gXCJcXHUwNjM0XFx1MDYyRFwiO1xuICB0W1wiXFx1RkQwQlwiXSA9IFwiXFx1MDYzNFxcdTA2MkVcIjtcbiAgdFtcIlxcdUZEMENcIl0gPSBcIlxcdTA2MzRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDBEXCJdID0gXCJcXHUwNjM0XFx1MDYzMVwiO1xuICB0W1wiXFx1RkQwRVwiXSA9IFwiXFx1MDYzM1xcdTA2MzFcIjtcbiAgdFtcIlxcdUZEMEZcIl0gPSBcIlxcdTA2MzVcXHUwNjMxXCI7XG4gIHRbXCJcXHVGRDEwXCJdID0gXCJcXHUwNjM2XFx1MDYzMVwiO1xuICB0W1wiXFx1RkQxMVwiXSA9IFwiXFx1MDYzN1xcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMTJcIl0gPSBcIlxcdTA2MzdcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDEzXCJdID0gXCJcXHUwNjM5XFx1MDY0OVwiO1xuICB0W1wiXFx1RkQxNFwiXSA9IFwiXFx1MDYzOVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMTVcIl0gPSBcIlxcdTA2M0FcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDE2XCJdID0gXCJcXHUwNjNBXFx1MDY0QVwiO1xuICB0W1wiXFx1RkQxN1wiXSA9IFwiXFx1MDYzM1xcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMThcIl0gPSBcIlxcdTA2MzNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDE5XCJdID0gXCJcXHUwNjM0XFx1MDY0OVwiO1xuICB0W1wiXFx1RkQxQVwiXSA9IFwiXFx1MDYzNFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMUJcIl0gPSBcIlxcdTA2MkRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDFDXCJdID0gXCJcXHUwNjJEXFx1MDY0QVwiO1xuICB0W1wiXFx1RkQxRFwiXSA9IFwiXFx1MDYyQ1xcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMUVcIl0gPSBcIlxcdTA2MkNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDFGXCJdID0gXCJcXHUwNjJFXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQyMFwiXSA9IFwiXFx1MDYyRVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEMjFcIl0gPSBcIlxcdTA2MzVcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDIyXCJdID0gXCJcXHUwNjM1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkQyM1wiXSA9IFwiXFx1MDYzNlxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEMjRcIl0gPSBcIlxcdTA2MzZcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDI1XCJdID0gXCJcXHUwNjM0XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQyNlwiXSA9IFwiXFx1MDYzNFxcdTA2MkRcIjtcbiAgdFtcIlxcdUZEMjdcIl0gPSBcIlxcdTA2MzRcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRDI4XCJdID0gXCJcXHUwNjM0XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQyOVwiXSA9IFwiXFx1MDYzNFxcdTA2MzFcIjtcbiAgdFtcIlxcdUZEMkFcIl0gPSBcIlxcdTA2MzNcXHUwNjMxXCI7XG4gIHRbXCJcXHVGRDJCXCJdID0gXCJcXHUwNjM1XFx1MDYzMVwiO1xuICB0W1wiXFx1RkQyQ1wiXSA9IFwiXFx1MDYzNlxcdTA2MzFcIjtcbiAgdFtcIlxcdUZEMkRcIl0gPSBcIlxcdTA2MzRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDJFXCJdID0gXCJcXHUwNjM0XFx1MDYyRFwiO1xuICB0W1wiXFx1RkQyRlwiXSA9IFwiXFx1MDYzNFxcdTA2MkVcIjtcbiAgdFtcIlxcdUZEMzBcIl0gPSBcIlxcdTA2MzRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDMxXCJdID0gXCJcXHUwNjMzXFx1MDY0N1wiO1xuICB0W1wiXFx1RkQzMlwiXSA9IFwiXFx1MDYzNFxcdTA2NDdcIjtcbiAgdFtcIlxcdUZEMzNcIl0gPSBcIlxcdTA2MzdcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDM0XCJdID0gXCJcXHUwNjMzXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQzNVwiXSA9IFwiXFx1MDYzM1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZEMzZcIl0gPSBcIlxcdTA2MzNcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRDM3XCJdID0gXCJcXHUwNjM0XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQzOFwiXSA9IFwiXFx1MDYzNFxcdTA2MkRcIjtcbiAgdFtcIlxcdUZEMzlcIl0gPSBcIlxcdTA2MzRcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRDNBXCJdID0gXCJcXHUwNjM3XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQzQlwiXSA9IFwiXFx1MDYzOFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZEM0NcIl0gPSBcIlxcdTA2MjdcXHUwNjRCXCI7XG4gIHRbXCJcXHVGRDNEXCJdID0gXCJcXHUwNjI3XFx1MDY0QlwiO1xuICB0W1wiXFx1RkQ1MFwiXSA9IFwiXFx1MDYyQVxcdTA2MkNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDUxXCJdID0gXCJcXHUwNjJBXFx1MDYyRFxcdTA2MkNcIjtcbiAgdFtcIlxcdUZENTJcIl0gPSBcIlxcdTA2MkFcXHUwNjJEXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ1M1wiXSA9IFwiXFx1MDYyQVxcdTA2MkRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDU0XCJdID0gXCJcXHUwNjJBXFx1MDYyRVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENTVcIl0gPSBcIlxcdTA2MkFcXHUwNjQ1XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ1NlwiXSA9IFwiXFx1MDYyQVxcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDU3XCJdID0gXCJcXHUwNjJBXFx1MDY0NVxcdTA2MkVcIjtcbiAgdFtcIlxcdUZENThcIl0gPSBcIlxcdTA2MkNcXHUwNjQ1XFx1MDYyRFwiO1xuICB0W1wiXFx1RkQ1OVwiXSA9IFwiXFx1MDYyQ1xcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDVBXCJdID0gXCJcXHUwNjJEXFx1MDY0NVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZENUJcIl0gPSBcIlxcdTA2MkRcXHUwNjQ1XFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ1Q1wiXSA9IFwiXFx1MDYzM1xcdTA2MkRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDVEXCJdID0gXCJcXHUwNjMzXFx1MDYyQ1xcdTA2MkRcIjtcbiAgdFtcIlxcdUZENUVcIl0gPSBcIlxcdTA2MzNcXHUwNjJDXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ1RlwiXSA9IFwiXFx1MDYzM1xcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDYwXCJdID0gXCJcXHUwNjMzXFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZENjFcIl0gPSBcIlxcdTA2MzNcXHUwNjQ1XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ2MlwiXSA9IFwiXFx1MDYzM1xcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDYzXCJdID0gXCJcXHUwNjMzXFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENjRcIl0gPSBcIlxcdTA2MzVcXHUwNjJEXFx1MDYyRFwiO1xuICB0W1wiXFx1RkQ2NVwiXSA9IFwiXFx1MDYzNVxcdTA2MkRcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDY2XCJdID0gXCJcXHUwNjM1XFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENjdcIl0gPSBcIlxcdTA2MzRcXHUwNjJEXFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ2OFwiXSA9IFwiXFx1MDYzNFxcdTA2MkRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDY5XCJdID0gXCJcXHUwNjM0XFx1MDYyQ1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZENkFcIl0gPSBcIlxcdTA2MzRcXHUwNjQ1XFx1MDYyRVwiO1xuICB0W1wiXFx1RkQ2QlwiXSA9IFwiXFx1MDYzNFxcdTA2NDVcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRDZDXCJdID0gXCJcXHUwNjM0XFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENkRcIl0gPSBcIlxcdTA2MzRcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ2RVwiXSA9IFwiXFx1MDYzNlxcdTA2MkRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRDZGXCJdID0gXCJcXHUwNjM2XFx1MDYyRVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZENzBcIl0gPSBcIlxcdTA2MzZcXHUwNjJFXFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3MVwiXSA9IFwiXFx1MDYzN1xcdTA2NDVcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDcyXCJdID0gXCJcXHUwNjM3XFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZENzNcIl0gPSBcIlxcdTA2MzdcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3NFwiXSA9IFwiXFx1MDYzN1xcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDc1XCJdID0gXCJcXHUwNjM5XFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZENzZcIl0gPSBcIlxcdTA2MzlcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3N1wiXSA9IFwiXFx1MDYzOVxcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDc4XCJdID0gXCJcXHUwNjM5XFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZENzlcIl0gPSBcIlxcdTA2M0FcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3QVwiXSA9IFwiXFx1MDYzQVxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDdCXCJdID0gXCJcXHUwNjNBXFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEN0NcIl0gPSBcIlxcdTA2NDFcXHUwNjJFXFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ3RFwiXSA9IFwiXFx1MDY0MVxcdTA2MkVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDdFXCJdID0gXCJcXHUwNjQyXFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZEN0ZcIl0gPSBcIlxcdTA2NDJcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ4MFwiXSA9IFwiXFx1MDY0NFxcdTA2MkRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDgxXCJdID0gXCJcXHUwNjQ0XFx1MDYyRFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEODJcIl0gPSBcIlxcdTA2NDRcXHUwNjJEXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ4M1wiXSA9IFwiXFx1MDY0NFxcdTA2MkNcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDg0XCJdID0gXCJcXHUwNjQ0XFx1MDYyQ1xcdTA2MkNcIjtcbiAgdFtcIlxcdUZEODVcIl0gPSBcIlxcdTA2NDRcXHUwNjJFXFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ4NlwiXSA9IFwiXFx1MDY0NFxcdTA2MkVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDg3XCJdID0gXCJcXHUwNjQ0XFx1MDY0NVxcdTA2MkRcIjtcbiAgdFtcIlxcdUZEODhcIl0gPSBcIlxcdTA2NDRcXHUwNjQ1XFx1MDYyRFwiO1xuICB0W1wiXFx1RkQ4OVwiXSA9IFwiXFx1MDY0NVxcdTA2MkRcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRDhBXCJdID0gXCJcXHUwNjQ1XFx1MDYyRFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZEOEJcIl0gPSBcIlxcdTA2NDVcXHUwNjJEXFx1MDY0QVwiO1xuICB0W1wiXFx1RkQ4Q1wiXSA9IFwiXFx1MDY0NVxcdTA2MkNcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRDhEXCJdID0gXCJcXHUwNjQ1XFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZEOEVcIl0gPSBcIlxcdTA2NDVcXHUwNjJFXFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ4RlwiXSA9IFwiXFx1MDY0NVxcdTA2MkVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDkyXCJdID0gXCJcXHUwNjQ1XFx1MDYyQ1xcdTA2MkVcIjtcbiAgdFtcIlxcdUZEOTNcIl0gPSBcIlxcdTA2NDdcXHUwNjQ1XFx1MDYyQ1wiO1xuICB0W1wiXFx1RkQ5NFwiXSA9IFwiXFx1MDY0N1xcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDk1XCJdID0gXCJcXHUwNjQ2XFx1MDYyRFxcdTA2NDVcIjtcbiAgdFtcIlxcdUZEOTZcIl0gPSBcIlxcdTA2NDZcXHUwNjJEXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ5N1wiXSA9IFwiXFx1MDY0NlxcdTA2MkNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDk4XCJdID0gXCJcXHUwNjQ2XFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZEOTlcIl0gPSBcIlxcdTA2NDZcXHUwNjJDXFx1MDY0OVwiO1xuICB0W1wiXFx1RkQ5QVwiXSA9IFwiXFx1MDY0NlxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRDlCXCJdID0gXCJcXHUwNjQ2XFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEOUNcIl0gPSBcIlxcdTA2NEFcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkQ5RFwiXSA9IFwiXFx1MDY0QVxcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRDlFXCJdID0gXCJcXHUwNjI4XFx1MDYyRVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEOUZcIl0gPSBcIlxcdTA2MkFcXHUwNjJDXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRBMFwiXSA9IFwiXFx1MDYyQVxcdTA2MkNcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGREExXCJdID0gXCJcXHUwNjJBXFx1MDYyRVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQTJcIl0gPSBcIlxcdTA2MkFcXHUwNjJFXFx1MDY0OVwiO1xuICB0W1wiXFx1RkRBM1wiXSA9IFwiXFx1MDYyQVxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREE0XCJdID0gXCJcXHUwNjJBXFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEQTVcIl0gPSBcIlxcdTA2MkNcXHUwNjQ1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkRBNlwiXSA9IFwiXFx1MDYyQ1xcdTA2MkRcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGREE3XCJdID0gXCJcXHUwNjJDXFx1MDY0NVxcdTA2NDlcIjtcbiAgdFtcIlxcdUZEQThcIl0gPSBcIlxcdTA2MzNcXHUwNjJFXFx1MDY0OVwiO1xuICB0W1wiXFx1RkRBOVwiXSA9IFwiXFx1MDYzNVxcdTA2MkRcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREFBXCJdID0gXCJcXHUwNjM0XFx1MDYyRFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQUJcIl0gPSBcIlxcdTA2MzZcXHUwNjJEXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRBQ1wiXSA9IFwiXFx1MDY0NFxcdTA2MkNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREFEXCJdID0gXCJcXHUwNjQ0XFx1MDY0NVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQUVcIl0gPSBcIlxcdTA2NEFcXHUwNjJEXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRBRlwiXSA9IFwiXFx1MDY0QVxcdTA2MkNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREIwXCJdID0gXCJcXHUwNjRBXFx1MDY0NVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQjFcIl0gPSBcIlxcdTA2NDVcXHUwNjQ1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkRCMlwiXSA9IFwiXFx1MDY0MlxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREIzXCJdID0gXCJcXHUwNjQ2XFx1MDYyRFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQjRcIl0gPSBcIlxcdTA2NDJcXHUwNjQ1XFx1MDYyRFwiO1xuICB0W1wiXFx1RkRCNVwiXSA9IFwiXFx1MDY0NFxcdTA2MkRcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGREI2XCJdID0gXCJcXHUwNjM5XFx1MDY0NVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQjdcIl0gPSBcIlxcdTA2NDNcXHUwNjQ1XFx1MDY0QVwiO1xuICB0W1wiXFx1RkRCOFwiXSA9IFwiXFx1MDY0NlxcdTA2MkNcXHUwNjJEXCI7XG4gIHRbXCJcXHVGREI5XCJdID0gXCJcXHUwNjQ1XFx1MDYyRVxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQkFcIl0gPSBcIlxcdTA2NDRcXHUwNjJDXFx1MDY0NVwiO1xuICB0W1wiXFx1RkRCQlwiXSA9IFwiXFx1MDY0M1xcdTA2NDVcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGREJDXCJdID0gXCJcXHUwNjQ0XFx1MDYyQ1xcdTA2NDVcIjtcbiAgdFtcIlxcdUZEQkRcIl0gPSBcIlxcdTA2NDZcXHUwNjJDXFx1MDYyRFwiO1xuICB0W1wiXFx1RkRCRVwiXSA9IFwiXFx1MDYyQ1xcdTA2MkRcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREJGXCJdID0gXCJcXHUwNjJEXFx1MDYyQ1xcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQzBcIl0gPSBcIlxcdTA2NDVcXHUwNjJDXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRDMVwiXSA9IFwiXFx1MDY0MVxcdTA2NDVcXHUwNjRBXCI7XG4gIHRbXCJcXHVGREMyXCJdID0gXCJcXHUwNjI4XFx1MDYyRFxcdTA2NEFcIjtcbiAgdFtcIlxcdUZEQzNcIl0gPSBcIlxcdTA2NDNcXHUwNjQ1XFx1MDY0NVwiO1xuICB0W1wiXFx1RkRDNFwiXSA9IFwiXFx1MDYzOVxcdTA2MkNcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGREM1XCJdID0gXCJcXHUwNjM1XFx1MDY0NVxcdTA2NDVcIjtcbiAgdFtcIlxcdUZEQzZcIl0gPSBcIlxcdTA2MzNcXHUwNjJFXFx1MDY0QVwiO1xuICB0W1wiXFx1RkRDN1wiXSA9IFwiXFx1MDY0NlxcdTA2MkNcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRTQ5XCJdID0gXCJcXHUyMDNFXCI7XG4gIHRbXCJcXHVGRTRBXCJdID0gXCJcXHUyMDNFXCI7XG4gIHRbXCJcXHVGRTRCXCJdID0gXCJcXHUyMDNFXCI7XG4gIHRbXCJcXHVGRTRDXCJdID0gXCJcXHUyMDNFXCI7XG4gIHRbXCJcXHVGRTREXCJdID0gXCJcXHUwMDVGXCI7XG4gIHRbXCJcXHVGRTRFXCJdID0gXCJcXHUwMDVGXCI7XG4gIHRbXCJcXHVGRTRGXCJdID0gXCJcXHUwMDVGXCI7XG4gIHRbXCJcXHVGRTgwXCJdID0gXCJcXHUwNjIxXCI7XG4gIHRbXCJcXHVGRTgxXCJdID0gXCJcXHUwNjIyXCI7XG4gIHRbXCJcXHVGRTgyXCJdID0gXCJcXHUwNjIyXCI7XG4gIHRbXCJcXHVGRTgzXCJdID0gXCJcXHUwNjIzXCI7XG4gIHRbXCJcXHVGRTg0XCJdID0gXCJcXHUwNjIzXCI7XG4gIHRbXCJcXHVGRTg1XCJdID0gXCJcXHUwNjI0XCI7XG4gIHRbXCJcXHVGRTg2XCJdID0gXCJcXHUwNjI0XCI7XG4gIHRbXCJcXHVGRTg3XCJdID0gXCJcXHUwNjI1XCI7XG4gIHRbXCJcXHVGRTg4XCJdID0gXCJcXHUwNjI1XCI7XG4gIHRbXCJcXHVGRTg5XCJdID0gXCJcXHUwNjI2XCI7XG4gIHRbXCJcXHVGRThBXCJdID0gXCJcXHUwNjI2XCI7XG4gIHRbXCJcXHVGRThCXCJdID0gXCJcXHUwNjI2XCI7XG4gIHRbXCJcXHVGRThDXCJdID0gXCJcXHUwNjI2XCI7XG4gIHRbXCJcXHVGRThEXCJdID0gXCJcXHUwNjI3XCI7XG4gIHRbXCJcXHVGRThFXCJdID0gXCJcXHUwNjI3XCI7XG4gIHRbXCJcXHVGRThGXCJdID0gXCJcXHUwNjI4XCI7XG4gIHRbXCJcXHVGRTkwXCJdID0gXCJcXHUwNjI4XCI7XG4gIHRbXCJcXHVGRTkxXCJdID0gXCJcXHUwNjI4XCI7XG4gIHRbXCJcXHVGRTkyXCJdID0gXCJcXHUwNjI4XCI7XG4gIHRbXCJcXHVGRTkzXCJdID0gXCJcXHUwNjI5XCI7XG4gIHRbXCJcXHVGRTk0XCJdID0gXCJcXHUwNjI5XCI7XG4gIHRbXCJcXHVGRTk1XCJdID0gXCJcXHUwNjJBXCI7XG4gIHRbXCJcXHVGRTk2XCJdID0gXCJcXHUwNjJBXCI7XG4gIHRbXCJcXHVGRTk3XCJdID0gXCJcXHUwNjJBXCI7XG4gIHRbXCJcXHVGRTk4XCJdID0gXCJcXHUwNjJBXCI7XG4gIHRbXCJcXHVGRTk5XCJdID0gXCJcXHUwNjJCXCI7XG4gIHRbXCJcXHVGRTlBXCJdID0gXCJcXHUwNjJCXCI7XG4gIHRbXCJcXHVGRTlCXCJdID0gXCJcXHUwNjJCXCI7XG4gIHRbXCJcXHVGRTlDXCJdID0gXCJcXHUwNjJCXCI7XG4gIHRbXCJcXHVGRTlEXCJdID0gXCJcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRTlFXCJdID0gXCJcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRTlGXCJdID0gXCJcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRUEwXCJdID0gXCJcXHUwNjJDXCI7XG4gIHRbXCJcXHVGRUExXCJdID0gXCJcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRUEyXCJdID0gXCJcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRUEzXCJdID0gXCJcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRUE0XCJdID0gXCJcXHUwNjJEXCI7XG4gIHRbXCJcXHVGRUE1XCJdID0gXCJcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRUE2XCJdID0gXCJcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRUE3XCJdID0gXCJcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRUE4XCJdID0gXCJcXHUwNjJFXCI7XG4gIHRbXCJcXHVGRUE5XCJdID0gXCJcXHUwNjJGXCI7XG4gIHRbXCJcXHVGRUFBXCJdID0gXCJcXHUwNjJGXCI7XG4gIHRbXCJcXHVGRUFCXCJdID0gXCJcXHUwNjMwXCI7XG4gIHRbXCJcXHVGRUFDXCJdID0gXCJcXHUwNjMwXCI7XG4gIHRbXCJcXHVGRUFEXCJdID0gXCJcXHUwNjMxXCI7XG4gIHRbXCJcXHVGRUFFXCJdID0gXCJcXHUwNjMxXCI7XG4gIHRbXCJcXHVGRUFGXCJdID0gXCJcXHUwNjMyXCI7XG4gIHRbXCJcXHVGRUIwXCJdID0gXCJcXHUwNjMyXCI7XG4gIHRbXCJcXHVGRUIxXCJdID0gXCJcXHUwNjMzXCI7XG4gIHRbXCJcXHVGRUIyXCJdID0gXCJcXHUwNjMzXCI7XG4gIHRbXCJcXHVGRUIzXCJdID0gXCJcXHUwNjMzXCI7XG4gIHRbXCJcXHVGRUI0XCJdID0gXCJcXHUwNjMzXCI7XG4gIHRbXCJcXHVGRUI1XCJdID0gXCJcXHUwNjM0XCI7XG4gIHRbXCJcXHVGRUI2XCJdID0gXCJcXHUwNjM0XCI7XG4gIHRbXCJcXHVGRUI3XCJdID0gXCJcXHUwNjM0XCI7XG4gIHRbXCJcXHVGRUI4XCJdID0gXCJcXHUwNjM0XCI7XG4gIHRbXCJcXHVGRUI5XCJdID0gXCJcXHUwNjM1XCI7XG4gIHRbXCJcXHVGRUJBXCJdID0gXCJcXHUwNjM1XCI7XG4gIHRbXCJcXHVGRUJCXCJdID0gXCJcXHUwNjM1XCI7XG4gIHRbXCJcXHVGRUJDXCJdID0gXCJcXHUwNjM1XCI7XG4gIHRbXCJcXHVGRUJEXCJdID0gXCJcXHUwNjM2XCI7XG4gIHRbXCJcXHVGRUJFXCJdID0gXCJcXHUwNjM2XCI7XG4gIHRbXCJcXHVGRUJGXCJdID0gXCJcXHUwNjM2XCI7XG4gIHRbXCJcXHVGRUMwXCJdID0gXCJcXHUwNjM2XCI7XG4gIHRbXCJcXHVGRUMxXCJdID0gXCJcXHUwNjM3XCI7XG4gIHRbXCJcXHVGRUMyXCJdID0gXCJcXHUwNjM3XCI7XG4gIHRbXCJcXHVGRUMzXCJdID0gXCJcXHUwNjM3XCI7XG4gIHRbXCJcXHVGRUM0XCJdID0gXCJcXHUwNjM3XCI7XG4gIHRbXCJcXHVGRUM1XCJdID0gXCJcXHUwNjM4XCI7XG4gIHRbXCJcXHVGRUM2XCJdID0gXCJcXHUwNjM4XCI7XG4gIHRbXCJcXHVGRUM3XCJdID0gXCJcXHUwNjM4XCI7XG4gIHRbXCJcXHVGRUM4XCJdID0gXCJcXHUwNjM4XCI7XG4gIHRbXCJcXHVGRUM5XCJdID0gXCJcXHUwNjM5XCI7XG4gIHRbXCJcXHVGRUNBXCJdID0gXCJcXHUwNjM5XCI7XG4gIHRbXCJcXHVGRUNCXCJdID0gXCJcXHUwNjM5XCI7XG4gIHRbXCJcXHVGRUNDXCJdID0gXCJcXHUwNjM5XCI7XG4gIHRbXCJcXHVGRUNEXCJdID0gXCJcXHUwNjNBXCI7XG4gIHRbXCJcXHVGRUNFXCJdID0gXCJcXHUwNjNBXCI7XG4gIHRbXCJcXHVGRUNGXCJdID0gXCJcXHUwNjNBXCI7XG4gIHRbXCJcXHVGRUQwXCJdID0gXCJcXHUwNjNBXCI7XG4gIHRbXCJcXHVGRUQxXCJdID0gXCJcXHUwNjQxXCI7XG4gIHRbXCJcXHVGRUQyXCJdID0gXCJcXHUwNjQxXCI7XG4gIHRbXCJcXHVGRUQzXCJdID0gXCJcXHUwNjQxXCI7XG4gIHRbXCJcXHVGRUQ0XCJdID0gXCJcXHUwNjQxXCI7XG4gIHRbXCJcXHVGRUQ1XCJdID0gXCJcXHUwNjQyXCI7XG4gIHRbXCJcXHVGRUQ2XCJdID0gXCJcXHUwNjQyXCI7XG4gIHRbXCJcXHVGRUQ3XCJdID0gXCJcXHUwNjQyXCI7XG4gIHRbXCJcXHVGRUQ4XCJdID0gXCJcXHUwNjQyXCI7XG4gIHRbXCJcXHVGRUQ5XCJdID0gXCJcXHUwNjQzXCI7XG4gIHRbXCJcXHVGRURBXCJdID0gXCJcXHUwNjQzXCI7XG4gIHRbXCJcXHVGRURCXCJdID0gXCJcXHUwNjQzXCI7XG4gIHRbXCJcXHVGRURDXCJdID0gXCJcXHUwNjQzXCI7XG4gIHRbXCJcXHVGRUREXCJdID0gXCJcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGRURFXCJdID0gXCJcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGRURGXCJdID0gXCJcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGRUUwXCJdID0gXCJcXHUwNjQ0XCI7XG4gIHRbXCJcXHVGRUUxXCJdID0gXCJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRUUyXCJdID0gXCJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRUUzXCJdID0gXCJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRUU0XCJdID0gXCJcXHUwNjQ1XCI7XG4gIHRbXCJcXHVGRUU1XCJdID0gXCJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGRUU2XCJdID0gXCJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGRUU3XCJdID0gXCJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGRUU4XCJdID0gXCJcXHUwNjQ2XCI7XG4gIHRbXCJcXHVGRUU5XCJdID0gXCJcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGRUVBXCJdID0gXCJcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGRUVCXCJdID0gXCJcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGRUVDXCJdID0gXCJcXHUwNjQ3XCI7XG4gIHRbXCJcXHVGRUVEXCJdID0gXCJcXHUwNjQ4XCI7XG4gIHRbXCJcXHVGRUVFXCJdID0gXCJcXHUwNjQ4XCI7XG4gIHRbXCJcXHVGRUVGXCJdID0gXCJcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRUYwXCJdID0gXCJcXHUwNjQ5XCI7XG4gIHRbXCJcXHVGRUYxXCJdID0gXCJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRUYyXCJdID0gXCJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRUYzXCJdID0gXCJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRUY0XCJdID0gXCJcXHUwNjRBXCI7XG4gIHRbXCJcXHVGRUY1XCJdID0gXCJcXHUwNjQ0XFx1MDYyMlwiO1xuICB0W1wiXFx1RkVGNlwiXSA9IFwiXFx1MDY0NFxcdTA2MjJcIjtcbiAgdFtcIlxcdUZFRjdcIl0gPSBcIlxcdTA2NDRcXHUwNjIzXCI7XG4gIHRbXCJcXHVGRUY4XCJdID0gXCJcXHUwNjQ0XFx1MDYyM1wiO1xuICB0W1wiXFx1RkVGOVwiXSA9IFwiXFx1MDY0NFxcdTA2MjVcIjtcbiAgdFtcIlxcdUZFRkFcIl0gPSBcIlxcdTA2NDRcXHUwNjI1XCI7XG4gIHRbXCJcXHVGRUZCXCJdID0gXCJcXHUwNjQ0XFx1MDYyN1wiO1xuICB0W1wiXFx1RkVGQ1wiXSA9IFwiXFx1MDY0NFxcdTA2MjdcIjtcbn0pO1xuXG5mdW5jdGlvbiByZXZlcnNlSWZSdGwoY2hhcnMpIHtcbiAgdmFyIGNoYXJzTGVuZ3RoID0gY2hhcnMubGVuZ3RoO1xuICAvLyBSZXZlcnNlIGFuIGFyYWJpYyBsaWdhdHVyZS5cbiAgaWYgKGNoYXJzTGVuZ3RoIDw9IDEgfHwgIWlzUlRMUmFuZ2VGb3IoY2hhcnMuY2hhckNvZGVBdCgwKSkpIHtcbiAgICByZXR1cm4gY2hhcnM7XG4gIH1cbiAgdmFyIHMgPSBcIlwiO1xuICBmb3IgKHZhciBpaSA9IGNoYXJzTGVuZ3RoIC0gMTsgaWkgPj0gMDsgaWktLSkge1xuICAgIHMgKz0gY2hhcnNbaWldO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG5leHBvcnRzLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzID0gbWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXM7XG5leHBvcnRzLnJldmVyc2VJZlJ0bCA9IHJldmVyc2VJZlJ0bDtcbmV4cG9ydHMuZ2V0VW5pY29kZVJhbmdlRm9yID0gZ2V0VW5pY29kZVJhbmdlRm9yO1xuZXhwb3J0cy5nZXROb3JtYWxpemVkVW5pY29kZXMgPSBnZXROb3JtYWxpemVkVW5pY29kZXM7XG5leHBvcnRzLmdldFVuaWNvZGVGb3JHbHlwaCA9IGdldFVuaWNvZGVGb3JHbHlwaDtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBieXRlc1RvU3RyaW5nLFxuICBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgRm9ybWF0RXJyb3IsXG4gIHVucmVhY2hhYmxlLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IENGRlBhcnNlciB9IGZyb20gXCIuL2NmZl9wYXJzZXIuanNcIjtcbmltcG9ydCB7IGdldEdseXBoc1VuaWNvZGUgfSBmcm9tIFwiLi9nbHlwaGxpc3QuanNcIjtcbmltcG9ydCB7IFN0YW5kYXJkRW5jb2RpbmcgfSBmcm9tIFwiLi9lbmNvZGluZ3MuanNcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuL3N0cmVhbS5qc1wiO1xuXG52YXIgRm9udFJlbmRlcmVyRmFjdG9yeSA9IChmdW5jdGlvbiBGb250UmVuZGVyZXJGYWN0b3J5Q2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gZ2V0TG9uZyhkYXRhLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICAgKGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAgIChkYXRhW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAgIGRhdGFbb2Zmc2V0ICsgM11cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VXNob3J0KGRhdGEsIG9mZnNldCkge1xuICAgIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDgpIHwgZGF0YVtvZmZzZXQgKyAxXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFN1YnJvdXRpbmVCaWFzKHN1YnJzKSB7XG4gICAgY29uc3QgbnVtU3VicnMgPSBzdWJycy5sZW5ndGg7XG4gICAgbGV0IGJpYXMgPSAzMjc2ODtcbiAgICBpZiAobnVtU3VicnMgPCAxMjQwKSB7XG4gICAgICBiaWFzID0gMTA3O1xuICAgIH0gZWxzZSBpZiAobnVtU3VicnMgPCAzMzkwMCkge1xuICAgICAgYmlhcyA9IDExMzE7XG4gICAgfVxuICAgIHJldHVybiBiaWFzO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VDbWFwKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgb2Zmc2V0ID1cbiAgICAgIGdldFVzaG9ydChkYXRhLCBzdGFydCArIDIpID09PSAxXG4gICAgICAgID8gZ2V0TG9uZyhkYXRhLCBzdGFydCArIDgpXG4gICAgICAgIDogZ2V0TG9uZyhkYXRhLCBzdGFydCArIDE2KTtcbiAgICB2YXIgZm9ybWF0ID0gZ2V0VXNob3J0KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0KTtcbiAgICB2YXIgcmFuZ2VzLCBwLCBpO1xuICAgIGlmIChmb3JtYXQgPT09IDQpIHtcbiAgICAgIGdldFVzaG9ydChkYXRhLCBzdGFydCArIG9mZnNldCArIDIpOyAvLyBsZW5ndGhcbiAgICAgIHZhciBzZWdDb3VudCA9IGdldFVzaG9ydChkYXRhLCBzdGFydCArIG9mZnNldCArIDYpID4+IDE7XG4gICAgICBwID0gc3RhcnQgKyBvZmZzZXQgKyAxNDtcbiAgICAgIHJhbmdlcyA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikge1xuICAgICAgICByYW5nZXNbaV0gPSB7IGVuZDogZ2V0VXNob3J0KGRhdGEsIHApIH07XG4gICAgICB9XG4gICAgICBwICs9IDI7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7XG4gICAgICAgIHJhbmdlc1tpXS5zdGFydCA9IGdldFVzaG9ydChkYXRhLCBwKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHtcbiAgICAgICAgcmFuZ2VzW2ldLmlkRGVsdGEgPSBnZXRVc2hvcnQoZGF0YSwgcCk7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7XG4gICAgICAgIHZhciBpZE9mZnNldCA9IGdldFVzaG9ydChkYXRhLCBwKTtcbiAgICAgICAgaWYgKGlkT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmFuZ2VzW2ldLmlkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSByYW5nZXNbaV0uZW5kIC0gcmFuZ2VzW2ldLnN0YXJ0ICsgMTsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICByYW5nZXNbaV0uaWRzW2pdID0gZ2V0VXNob3J0KGRhdGEsIHAgKyBpZE9mZnNldCk7XG4gICAgICAgICAgaWRPZmZzZXQgKz0gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMTIpIHtcbiAgICAgIGdldExvbmcoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA0KTsgLy8gbGVuZ3RoXG4gICAgICB2YXIgZ3JvdXBzID0gZ2V0TG9uZyhkYXRhLCBzdGFydCArIG9mZnNldCArIDEyKTtcbiAgICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE2O1xuICAgICAgcmFuZ2VzID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0OiBnZXRMb25nKGRhdGEsIHApLFxuICAgICAgICAgIGVuZDogZ2V0TG9uZyhkYXRhLCBwICsgNCksXG4gICAgICAgICAgaWREZWx0YTogZ2V0TG9uZyhkYXRhLCBwICsgOCkgLSBnZXRMb25nKGRhdGEsIHApLFxuICAgICAgICB9KTtcbiAgICAgICAgcCArPSAxMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByYW5nZXM7XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5zdXBwb3J0ZWQgY21hcDogJHtmb3JtYXR9YCk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNmZihkYXRhLCBzdGFydCwgZW5kLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB7fTtcbiAgICB2YXIgcGFyc2VyID0gbmV3IENGRlBhcnNlcihcbiAgICAgIG5ldyBTdHJlYW0oZGF0YSwgc3RhcnQsIGVuZCAtIHN0YXJ0KSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBzZWFjQW5hbHlzaXNFbmFibGVkXG4gICAgKTtcbiAgICB2YXIgY2ZmID0gcGFyc2VyLnBhcnNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdseXBoczogY2ZmLmNoYXJTdHJpbmdzLm9iamVjdHMsXG4gICAgICBzdWJyczpcbiAgICAgICAgY2ZmLnRvcERpY3QucHJpdmF0ZURpY3QgJiZcbiAgICAgICAgY2ZmLnRvcERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleCAmJlxuICAgICAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHMsXG4gICAgICBnc3VicnM6IGNmZi5nbG9iYWxTdWJySW5kZXggJiYgY2ZmLmdsb2JhbFN1YnJJbmRleC5vYmplY3RzLFxuICAgICAgaXNDRkZDSURGb250OiBjZmYuaXNDSURGb250LFxuICAgICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCxcbiAgICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUdseWZUYWJsZShnbHlmLCBsb2NhLCBpc0dseXBoTG9jYXRpb25zTG9uZykge1xuICAgIHZhciBpdGVtU2l6ZSwgaXRlbURlY29kZTtcbiAgICBpZiAoaXNHbHlwaExvY2F0aW9uc0xvbmcpIHtcbiAgICAgIGl0ZW1TaXplID0gNDtcbiAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZUxvbmcoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICAgICAgIChkYXRhW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgICAgICAgKGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgM11cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1TaXplID0gMjtcbiAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZShkYXRhLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgOSkgfCAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBnbHlwaHMgPSBbXTtcbiAgICB2YXIgc3RhcnRPZmZzZXQgPSBpdGVtRGVjb2RlKGxvY2EsIDApO1xuICAgIGZvciAodmFyIGogPSBpdGVtU2l6ZTsgaiA8IGxvY2EubGVuZ3RoOyBqICs9IGl0ZW1TaXplKSB7XG4gICAgICB2YXIgZW5kT2Zmc2V0ID0gaXRlbURlY29kZShsb2NhLCBqKTtcbiAgICAgIGdseXBocy5wdXNoKGdseWYuc3ViYXJyYXkoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCkpO1xuICAgICAgc3RhcnRPZmZzZXQgPSBlbmRPZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiBnbHlwaHM7XG4gIH1cblxuICBmdW5jdGlvbiBsb29rdXBDbWFwKHJhbmdlcywgdW5pY29kZSkge1xuICAgIHZhciBjb2RlID0gdW5pY29kZS5jb2RlUG9pbnRBdCgwKSxcbiAgICAgIGdpZCA9IDA7XG4gICAgdmFyIGwgPSAwLFxuICAgICAgciA9IHJhbmdlcy5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChsIDwgcikge1xuICAgICAgdmFyIGMgPSAobCArIHIgKyAxKSA+PiAxO1xuICAgICAgaWYgKGNvZGUgPCByYW5nZXNbY10uc3RhcnQpIHtcbiAgICAgICAgciA9IGMgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbCA9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyYW5nZXNbbF0uc3RhcnQgPD0gY29kZSAmJiBjb2RlIDw9IHJhbmdlc1tsXS5lbmQpIHtcbiAgICAgIGdpZCA9XG4gICAgICAgIChyYW5nZXNbbF0uaWREZWx0YSArXG4gICAgICAgICAgKHJhbmdlc1tsXS5pZHMgPyByYW5nZXNbbF0uaWRzW2NvZGUgLSByYW5nZXNbbF0uc3RhcnRdIDogY29kZSkpICZcbiAgICAgICAgMHhmZmZmO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY2hhckNvZGU6IGNvZGUsXG4gICAgICBnbHlwaElkOiBnaWQsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIGZvbnQpIHtcbiAgICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkge1xuICAgICAgY21kcy5wdXNoKHsgY21kOiBcIm1vdmVUb1wiLCBhcmdzOiBbeCwgeV0gfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7XG4gICAgICBjbWRzLnB1c2goeyBjbWQ6IFwibGluZVRvXCIsIGFyZ3M6IFt4LCB5XSB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVhZHJhdGljQ3VydmVUbyh4YSwgeWEsIHgsIHkpIHtcbiAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJxdWFkcmF0aWNDdXJ2ZVRvXCIsIGFyZ3M6IFt4YSwgeWEsIHgsIHldIH0pO1xuICAgIH1cblxuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbnVtYmVyT2ZDb250b3VycyA9ICgoY29kZVtpXSA8PCAyNCkgfCAoY29kZVtpICsgMV0gPDwgMTYpKSA+PiAxNjtcbiAgICB2YXIgZmxhZ3M7XG4gICAgdmFyIHggPSAwLFxuICAgICAgeSA9IDA7XG4gICAgaSArPSAxMDtcbiAgICBpZiAobnVtYmVyT2ZDb250b3VycyA8IDApIHtcbiAgICAgIC8vIGNvbXBvc2l0ZSBnbHlwaFxuICAgICAgZG8ge1xuICAgICAgICBmbGFncyA9IChjb2RlW2ldIDw8IDgpIHwgY29kZVtpICsgMV07XG4gICAgICAgIHZhciBnbHlwaEluZGV4ID0gKGNvZGVbaSArIDJdIDw8IDgpIHwgY29kZVtpICsgM107XG4gICAgICAgIGkgKz0gNDtcbiAgICAgICAgdmFyIGFyZzEsIGFyZzI7XG4gICAgICAgIGlmIChmbGFncyAmIDB4MDEpIHtcbiAgICAgICAgICBhcmcxID0gKChjb2RlW2ldIDw8IDI0KSB8IChjb2RlW2kgKyAxXSA8PCAxNikpID4+IDE2O1xuICAgICAgICAgIGFyZzIgPSAoKGNvZGVbaSArIDJdIDw8IDI0KSB8IChjb2RlW2kgKyAzXSA8PCAxNikpID4+IDE2O1xuICAgICAgICAgIGkgKz0gNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmcxID0gY29kZVtpKytdO1xuICAgICAgICAgIGFyZzIgPSBjb2RlW2krK107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsYWdzICYgMHgwMikge1xuICAgICAgICAgIHggPSBhcmcxO1xuICAgICAgICAgIHkgPSBhcmcyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHggPSAwO1xuICAgICAgICAgIHkgPSAwOyAvLyBUT0RPIFwidGhleSBhcmUgcG9pbnRzXCIgP1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY2FsZVggPSAxLFxuICAgICAgICAgIHNjYWxlWSA9IDEsXG4gICAgICAgICAgc2NhbGUwMSA9IDAsXG4gICAgICAgICAgc2NhbGUxMCA9IDA7XG4gICAgICAgIGlmIChmbGFncyAmIDB4MDgpIHtcbiAgICAgICAgICBzY2FsZVggPSBzY2FsZVkgPVxuICAgICAgICAgICAgKChjb2RlW2ldIDw8IDI0KSB8IChjb2RlW2kgKyAxXSA8PCAxNikpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgICBpICs9IDI7XG4gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDQwKSB7XG4gICAgICAgICAgc2NhbGVYID0gKChjb2RlW2ldIDw8IDI0KSB8IChjb2RlW2kgKyAxXSA8PCAxNikpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgICBzY2FsZVkgPSAoKGNvZGVbaSArIDJdIDw8IDI0KSB8IChjb2RlW2kgKyAzXSA8PCAxNikpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgICBpICs9IDQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDgwKSB7XG4gICAgICAgICAgc2NhbGVYID0gKChjb2RlW2ldIDw8IDI0KSB8IChjb2RlW2kgKyAxXSA8PCAxNikpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgICBzY2FsZTAxID0gKChjb2RlW2kgKyAyXSA8PCAyNCkgfCAoY29kZVtpICsgM10gPDwgMTYpKSAvIDEwNzM3NDE4MjQ7XG4gICAgICAgICAgc2NhbGUxMCA9ICgoY29kZVtpICsgNF0gPDwgMjQpIHwgKGNvZGVbaSArIDVdIDw8IDE2KSkgLyAxMDczNzQxODI0O1xuICAgICAgICAgIHNjYWxlWSA9ICgoY29kZVtpICsgNl0gPDwgMjQpIHwgKGNvZGVbaSArIDddIDw8IDE2KSkgLyAxMDczNzQxODI0O1xuICAgICAgICAgIGkgKz0gODtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3ViZ2x5cGggPSBmb250LmdseXBoc1tnbHlwaEluZGV4XTtcbiAgICAgICAgaWYgKHN1YmdseXBoKSB7XG4gICAgICAgICAgY21kcy5wdXNoKHsgY21kOiBcInNhdmVcIiB9KTtcbiAgICAgICAgICBjbWRzLnB1c2goe1xuICAgICAgICAgICAgY21kOiBcInRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgYXJnczogW3NjYWxlWCwgc2NhbGUwMSwgc2NhbGUxMCwgc2NhbGVZLCB4LCB5XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb21waWxlR2x5ZihzdWJnbHlwaCwgY21kcywgZm9udCk7XG4gICAgICAgICAgY21kcy5wdXNoKHsgY21kOiBcInJlc3RvcmVcIiB9KTtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoZmxhZ3MgJiAweDIwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2ltcGxlIGdseXBoXG4gICAgICB2YXIgZW5kUHRzT2ZDb250b3VycyA9IFtdO1xuICAgICAgdmFyIGosIGpqO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mQ29udG91cnM7IGorKykge1xuICAgICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2goKGNvZGVbaV0gPDwgOCkgfCBjb2RlW2kgKyAxXSk7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgIH1cbiAgICAgIHZhciBpbnN0cnVjdGlvbkxlbmd0aCA9IChjb2RlW2ldIDw8IDgpIHwgY29kZVtpICsgMV07XG4gICAgICBpICs9IDIgKyBpbnN0cnVjdGlvbkxlbmd0aDsgLy8gc2tpcHBpbmcgdGhlIGluc3RydWN0aW9uc1xuICAgICAgdmFyIG51bWJlck9mUG9pbnRzID0gZW5kUHRzT2ZDb250b3Vyc1tlbmRQdHNPZkNvbnRvdXJzLmxlbmd0aCAtIDFdICsgMTtcbiAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgIHdoaWxlIChwb2ludHMubGVuZ3RoIDwgbnVtYmVyT2ZQb2ludHMpIHtcbiAgICAgICAgZmxhZ3MgPSBjb2RlW2krK107XG4gICAgICAgIHZhciByZXBlYXQgPSAxO1xuICAgICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7XG4gICAgICAgICAgcmVwZWF0ICs9IGNvZGVbaSsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSB7XG4gICAgICAgICAgcG9pbnRzLnB1c2goeyBmbGFncyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHtcbiAgICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDEyKSB7XG4gICAgICAgICAgY2FzZSAweDAwOlxuICAgICAgICAgICAgeCArPSAoKGNvZGVbaV0gPDwgMjQpIHwgKGNvZGVbaSArIDFdIDw8IDE2KSkgPj4gMTY7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDI6XG4gICAgICAgICAgICB4IC09IGNvZGVbaSsrXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgxMjpcbiAgICAgICAgICAgIHggKz0gY29kZVtpKytdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzW2pdLnggPSB4O1xuICAgICAgfVxuICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHtcbiAgICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDI0KSB7XG4gICAgICAgICAgY2FzZSAweDAwOlxuICAgICAgICAgICAgeSArPSAoKGNvZGVbaV0gPDwgMjQpIHwgKGNvZGVbaSArIDFdIDw8IDE2KSkgPj4gMTY7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDQ6XG4gICAgICAgICAgICB5IC09IGNvZGVbaSsrXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgyNDpcbiAgICAgICAgICAgIHkgKz0gY29kZVtpKytdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzW2pdLnkgPSB5O1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhcnRQb2ludCA9IDA7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyT2ZDb250b3VyczsgaSsrKSB7XG4gICAgICAgIHZhciBlbmRQb2ludCA9IGVuZFB0c09mQ29udG91cnNbaV07XG4gICAgICAgIC8vIGNvbnRvdXJzIG1pZ2h0IGhhdmUgaW1wbGljaXQgcG9pbnRzLCB3aGljaCBpcyBsb2NhdGVkIGluIHRoZSBtaWRkbGVcbiAgICAgICAgLy8gYmV0d2VlbiB0d28gbmVpZ2hib3Jpbmcgb2ZmLWN1cnZlIHBvaW50c1xuICAgICAgICB2YXIgY29udG91ciA9IHBvaW50cy5zbGljZShzdGFydFBvaW50LCBlbmRQb2ludCArIDEpO1xuICAgICAgICBpZiAoY29udG91clswXS5mbGFncyAmIDEpIHtcbiAgICAgICAgICBjb250b3VyLnB1c2goY29udG91clswXSk7IC8vIHVzaW5nIHN0YXJ0IHBvaW50IGF0IHRoZSBjb250b3VyIGVuZFxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRvdXJbY29udG91ci5sZW5ndGggLSAxXS5mbGFncyAmIDEpIHtcbiAgICAgICAgICAvLyBmaXJzdCBpcyBvZmYtY3VydmUgcG9pbnQsIHRyeWluZyB0byB1c2Ugb25lIGZyb20gdGhlIGVuZFxuICAgICAgICAgIGNvbnRvdXIudW5zaGlmdChjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN0YXJ0IGFuZCBlbmQgYXJlIG9mZi1jdXJ2ZSBwb2ludHMsIGNyZWF0aW5nIGltcGxpY2l0IG9uZVxuICAgICAgICAgIHZhciBwID0ge1xuICAgICAgICAgICAgZmxhZ3M6IDEsXG4gICAgICAgICAgICB4OiAoY29udG91clswXS54ICsgY29udG91cltjb250b3VyLmxlbmd0aCAtIDFdLngpIC8gMixcbiAgICAgICAgICAgIHk6IChjb250b3VyWzBdLnkgKyBjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0ueSkgLyAyLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29udG91ci51bnNoaWZ0KHApO1xuICAgICAgICAgIGNvbnRvdXIucHVzaChwKTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlVG8oY29udG91clswXS54LCBjb250b3VyWzBdLnkpO1xuICAgICAgICBmb3IgKGogPSAxLCBqaiA9IGNvbnRvdXIubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgIGlmIChjb250b3VyW2pdLmZsYWdzICYgMSkge1xuICAgICAgICAgICAgbGluZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRvdXJbaiArIDFdLmZsYWdzICYgMSkge1xuICAgICAgICAgICAgcXVhZHJhdGljQ3VydmVUbyhcbiAgICAgICAgICAgICAgY29udG91cltqXS54LFxuICAgICAgICAgICAgICBjb250b3VyW2pdLnksXG4gICAgICAgICAgICAgIGNvbnRvdXJbaiArIDFdLngsXG4gICAgICAgICAgICAgIGNvbnRvdXJbaiArIDFdLnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1YWRyYXRpY0N1cnZlVG8oXG4gICAgICAgICAgICAgIGNvbnRvdXJbal0ueCxcbiAgICAgICAgICAgICAgY29udG91cltqXS55LFxuICAgICAgICAgICAgICAoY29udG91cltqXS54ICsgY29udG91cltqICsgMV0ueCkgLyAyLFxuICAgICAgICAgICAgICAoY29udG91cltqXS55ICsgY29udG91cltqICsgMV0ueSkgLyAyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGFydFBvaW50ID0gZW5kUG9pbnQgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBpbGVDaGFyU3RyaW5nKGNoYXJTdHJpbmdDb2RlLCBjbWRzLCBmb250LCBnbHlwaElkKSB7XG4gICAgZnVuY3Rpb24gbW92ZVRvKHgsIHkpIHtcbiAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJtb3ZlVG9cIiwgYXJnczogW3gsIHldIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lVG8oeCwgeSkge1xuICAgICAgY21kcy5wdXNoKHsgY21kOiBcImxpbmVUb1wiLCBhcmdzOiBbeCwgeV0gfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJlemllckN1cnZlVG8oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHtcbiAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJiZXppZXJDdXJ2ZVRvXCIsIGFyZ3M6IFt4MSwgeTEsIHgyLCB5MiwgeCwgeV0gfSk7XG4gICAgfVxuXG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIHggPSAwLFxuICAgICAgeSA9IDA7XG4gICAgdmFyIHN0ZW1zID0gMDtcblxuICAgIGZ1bmN0aW9uIHBhcnNlKGNvZGUpIHtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHN0YWNrQ2xlYW4gPSBmYWxzZTtcbiAgICAgICAgdmFyIHYgPSBjb2RlW2krK107XG4gICAgICAgIHZhciB4YSwgeGIsIHlhLCB5YiwgeTEsIHkyLCB5Mywgbiwgc3VickNvZGU7XG4gICAgICAgIHN3aXRjaCAodikge1xuICAgICAgICAgIGNhc2UgMTogLy8gaHN0ZW1cbiAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6IC8vIHZzdGVtXG4gICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTtcbiAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OiAvLyB2bW92ZXRvXG4gICAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDU6IC8vIHJsaW5ldG9cbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDY6IC8vIGhsaW5ldG9cbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgbGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDc6IC8vIHZsaW5ldG9cbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgbGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDg6IC8vIHJyY3VydmV0b1xuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTA6IC8vIGNhbGxzdWJyXG4gICAgICAgICAgICBuID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdWJyQ29kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZm9udC5pc0NGRkNJREZvbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgZmRJbmRleCA9IGZvbnQuZmRTZWxlY3QuZ2V0RkRJbmRleChnbHlwaElkKTtcbiAgICAgICAgICAgICAgaWYgKGZkSW5kZXggPj0gMCAmJiBmZEluZGV4IDwgZm9udC5mZEFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnREaWN0ID0gZm9udC5mZEFycmF5W2ZkSW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBzdWJycztcbiAgICAgICAgICAgICAgICBpZiAoZm9udERpY3QucHJpdmF0ZURpY3QgJiYgZm9udERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleCkge1xuICAgICAgICAgICAgICAgICAgc3VicnMgPSBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdWJycykge1xuICAgICAgICAgICAgICAgICAgLy8gQWRkIHN1YnJvdXRpbmUgYmlhcy5cbiAgICAgICAgICAgICAgICAgIG4gKz0gZ2V0U3Vicm91dGluZUJpYXMoc3VicnMpO1xuICAgICAgICAgICAgICAgICAgc3VickNvZGUgPSBzdWJyc1tuXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2FybihcIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LlwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3VickNvZGUgPSBmb250LnN1YnJzW24gKyBmb250LnN1YnJzQmlhc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VickNvZGUpIHtcbiAgICAgICAgICAgICAgcGFyc2Uoc3VickNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxMTogLy8gcmV0dXJuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIHYgPSBjb2RlW2krK107XG4gICAgICAgICAgICBzd2l0Y2ggKHYpIHtcbiAgICAgICAgICAgICAgY2FzZSAzNDogLy8gZmxleFxuICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHksIHhiLCB5MSwgeCwgeTEpO1xuICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHksIHgsIHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDM1OiAvLyBmbGV4XG4gICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpO1xuICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpOyAvLyBmZFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDM2OiAvLyBoZmxleDFcbiAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHkxID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeTIgPSB5MSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHkyLCB4LCB5Mik7XG4gICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5MyA9IHkyICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkyLCB4YiwgeTMsIHgsIHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDM3OiAvLyBmbGV4MVxuICAgICAgICAgICAgICAgIHZhciB4MCA9IHgsXG4gICAgICAgICAgICAgICAgICB5MCA9IHk7XG4gICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IHhiO1xuICAgICAgICAgICAgICAgIHkgPSB5YjtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoeCAtIHgwKSA+IE1hdGguYWJzKHkgLSB5MCkpIHtcbiAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYHVua25vd24gb3BlcmF0b3I6IDEyICR7dn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTQ6IC8vIGVuZGNoYXJcbiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPj0gNCkge1xuICAgICAgICAgICAgICB2YXIgYWNoYXIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgdmFyIGJjaGFyID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICBjbWRzLnB1c2goeyBjbWQ6IFwic2F2ZVwiIH0pO1xuICAgICAgICAgICAgICBjbWRzLnB1c2goeyBjbWQ6IFwidHJhbnNsYXRlXCIsIGFyZ3M6IFt4LCB5XSB9KTtcbiAgICAgICAgICAgICAgdmFyIGNtYXAgPSBsb29rdXBDbWFwKFxuICAgICAgICAgICAgICAgIGZvbnQuY21hcCxcbiAgICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYWNoYXJdXSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29tcGlsZUNoYXJTdHJpbmcoXG4gICAgICAgICAgICAgICAgZm9udC5nbHlwaHNbY21hcC5nbHlwaElkXSxcbiAgICAgICAgICAgICAgICBjbWRzLFxuICAgICAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICAgICAgY21hcC5nbHlwaElkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJyZXN0b3JlXCIgfSk7XG5cbiAgICAgICAgICAgICAgY21hcCA9IGxvb2t1cENtYXAoXG4gICAgICAgICAgICAgICAgZm9udC5jbWFwLFxuICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nbHlwaE5hbWVNYXBbU3RhbmRhcmRFbmNvZGluZ1tiY2hhcl1dKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhcbiAgICAgICAgICAgICAgICBmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLFxuICAgICAgICAgICAgICAgIGNtZHMsXG4gICAgICAgICAgICAgICAgZm9udCxcbiAgICAgICAgICAgICAgICBjbWFwLmdseXBoSWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICBjYXNlIDE4OiAvLyBoc3RlbWhtXG4gICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTtcbiAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOTogLy8gaGludG1hc2tcbiAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgICAgICAgaSArPSAoc3RlbXMgKyA3KSA+PiAzO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIwOiAvLyBjbnRybWFza1xuICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7XG4gICAgICAgICAgICBpICs9IChzdGVtcyArIDcpID4+IDM7XG4gICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjE6IC8vIHJtb3ZldG9cbiAgICAgICAgICAgIHkgKz0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIyOiAvLyBobW92ZXRvXG4gICAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIzOiAvLyB2c3RlbWhtXG4gICAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTtcbiAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyNDogLy8gcmN1cnZlbGluZVxuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgIGxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjU6IC8vIHJsaW5lY3VydmVcbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiA2KSB7XG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyNjogLy8gdnZjdXJ2ZXRvXG4gICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikge1xuICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB4YSA9IHg7XG4gICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeCA9IHhiO1xuICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjc6IC8vIGhoY3VydmV0b1xuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWEgPSB5O1xuICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgPSB5YjtcbiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgc3RhY2sucHVzaCgoKGNvZGVbaV0gPDwgMjQpIHwgKGNvZGVbaSArIDFdIDw8IDE2KSkgPj4gMTYpO1xuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOTogLy8gY2FsbGdzdWJyXG4gICAgICAgICAgICBuID0gc3RhY2sucG9wKCkgKyBmb250LmdzdWJyc0JpYXM7XG4gICAgICAgICAgICBzdWJyQ29kZSA9IGZvbnQuZ3N1YnJzW25dO1xuICAgICAgICAgICAgaWYgKHN1YnJDb2RlKSB7XG4gICAgICAgICAgICAgIHBhcnNlKHN1YnJDb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzA6IC8vIHZoY3VydmV0b1xuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgeGEgPSB4O1xuICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7XG4gICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpO1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5YSA9IHk7XG4gICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeCA9IHhiICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTtcbiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDMxOiAvLyBodmN1cnZldG9cbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHlhID0geTtcbiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4ID0geGIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApO1xuICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTtcbiAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgeGEgPSB4O1xuICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7XG4gICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICh2IDwgMzIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAke3Z9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodiA8IDI0Nykge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKHYgLSAxMzkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2IDwgMjUxKSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goKHYgLSAyNDcpICogMjU2ICsgY29kZVtpKytdICsgMTA4KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1NSkge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKC0odiAtIDI1MSkgKiAyNTYgLSBjb2RlW2krK10gLSAxMDgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaChcbiAgICAgICAgICAgICAgICAoKGNvZGVbaV0gPDwgMjQpIHxcbiAgICAgICAgICAgICAgICAgIChjb2RlW2kgKyAxXSA8PCAxNikgfFxuICAgICAgICAgICAgICAgICAgKGNvZGVbaSArIDJdIDw8IDgpIHxcbiAgICAgICAgICAgICAgICAgIGNvZGVbaSArIDNdKSAvXG4gICAgICAgICAgICAgICAgICA2NTUzNlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpICs9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhY2tDbGVhbikge1xuICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGFyc2UoY2hhclN0cmluZ0NvZGUpO1xuICB9XG5cbiAgY29uc3QgTk9PUCA9IFtdO1xuXG4gIGNsYXNzIENvbXBpbGVkRm9udCB7XG4gICAgY29uc3RydWN0b3IoZm9udE1hdHJpeCkge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IENvbXBpbGVkRm9udCkge1xuICAgICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIENvbXBpbGVkRm9udC5cIik7XG4gICAgICB9XG4gICAgICB0aGlzLmZvbnRNYXRyaXggPSBmb250TWF0cml4O1xuXG4gICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuXG4gICAgZ2V0UGF0aEpzKHVuaWNvZGUpIHtcbiAgICAgIGNvbnN0IGNtYXAgPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7XG4gICAgICBsZXQgZm4gPSB0aGlzLmNvbXBpbGVkR2x5cGhzW2NtYXAuZ2x5cGhJZF07XG4gICAgICBpZiAoIWZuKSB7XG4gICAgICAgIGZuID0gdGhpcy5jb21waWxlR2x5cGgodGhpcy5nbHlwaHNbY21hcC5nbHlwaElkXSwgY21hcC5nbHlwaElkKTtcbiAgICAgICAgdGhpcy5jb21waWxlZEdseXBoc1tjbWFwLmdseXBoSWRdID0gZm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NtYXAuY2hhckNvZGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NtYXAuY2hhckNvZGVdID0gY21hcC5nbHlwaElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZuO1xuICAgIH1cblxuICAgIGNvbXBpbGVHbHlwaChjb2RlLCBnbHlwaElkKSB7XG4gICAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggPT09IDAgfHwgY29kZVswXSA9PT0gMTQpIHtcbiAgICAgICAgcmV0dXJuIE5PT1A7XG4gICAgICB9XG5cbiAgICAgIGxldCBmb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4O1xuICAgICAgaWYgKHRoaXMuaXNDRkZDSURGb250KSB7XG4gICAgICAgIC8vIFRvcCBESUNUJ3MgRm9udE1hdHJpeCBjYW4gYmUgaWdub3JlZCBiZWNhdXNlIENGRkNvbXBpbGVyIGFsd2F5c1xuICAgICAgICAvLyByZW1vdmVzIGl0IGFuZCBjb3BpZXMgdG8gRkRBcnJheSBESUNUcy5cbiAgICAgICAgY29uc3QgZmRJbmRleCA9IHRoaXMuZmRTZWxlY3QuZ2V0RkRJbmRleChnbHlwaElkKTtcbiAgICAgICAgaWYgKGZkSW5kZXggPj0gMCAmJiBmZEluZGV4IDwgdGhpcy5mZEFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGZvbnREaWN0ID0gdGhpcy5mZEFycmF5W2ZkSW5kZXhdO1xuICAgICAgICAgIGZvbnRNYXRyaXggPSBmb250RGljdC5nZXRCeU5hbWUoXCJGb250TWF0cml4XCIpIHx8IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY21kcyA9IFtdO1xuICAgICAgY21kcy5wdXNoKHsgY21kOiBcInNhdmVcIiB9KTtcbiAgICAgIGNtZHMucHVzaCh7IGNtZDogXCJ0cmFuc2Zvcm1cIiwgYXJnczogZm9udE1hdHJpeC5zbGljZSgpIH0pO1xuICAgICAgY21kcy5wdXNoKHsgY21kOiBcInNjYWxlXCIsIGFyZ3M6IFtcInNpemVcIiwgXCItc2l6ZVwiXSB9KTtcblxuICAgICAgdGhpcy5jb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMsIGdseXBoSWQpO1xuXG4gICAgICBjbWRzLnB1c2goeyBjbWQ6IFwicmVzdG9yZVwiIH0pO1xuXG4gICAgICByZXR1cm4gY21kcztcbiAgICB9XG5cbiAgICBjb21waWxlR2x5cGhJbXBsKCkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDaGlsZHJlbiBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcy5cIik7XG4gICAgfVxuXG4gICAgaGFzQnVpbHRQYXRoKHVuaWNvZGUpIHtcbiAgICAgIGNvbnN0IGNtYXAgPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzW2NtYXAuZ2x5cGhJZF0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY21hcC5jaGFyQ29kZV0gIT09IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBUcnVlVHlwZUNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHtcbiAgICBjb25zdHJ1Y3RvcihnbHlwaHMsIGNtYXAsIGZvbnRNYXRyaXgpIHtcbiAgICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAwNDg4LCAwLCAwLCAwLjAwMDQ4OCwgMCwgMF0pO1xuXG4gICAgICB0aGlzLmdseXBocyA9IGdseXBocztcbiAgICAgIHRoaXMuY21hcCA9IGNtYXA7XG4gICAgfVxuXG4gICAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzKSB7XG4gICAgICBjb21waWxlR2x5Zihjb2RlLCBjbWRzLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBUeXBlMkNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHtcbiAgICBjb25zdHJ1Y3RvcihjZmZJbmZvLCBjbWFwLCBmb250TWF0cml4LCBnbHlwaE5hbWVNYXApIHtcbiAgICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF0pO1xuXG4gICAgICB0aGlzLmdseXBocyA9IGNmZkluZm8uZ2x5cGhzO1xuICAgICAgdGhpcy5nc3VicnMgPSBjZmZJbmZvLmdzdWJycyB8fCBbXTtcbiAgICAgIHRoaXMuc3VicnMgPSBjZmZJbmZvLnN1YnJzIHx8IFtdO1xuICAgICAgdGhpcy5jbWFwID0gY21hcDtcbiAgICAgIHRoaXMuZ2x5cGhOYW1lTWFwID0gZ2x5cGhOYW1lTWFwIHx8IGdldEdseXBoc1VuaWNvZGUoKTtcblxuICAgICAgdGhpcy5nc3VicnNCaWFzID0gZ2V0U3Vicm91dGluZUJpYXModGhpcy5nc3VicnMpO1xuICAgICAgdGhpcy5zdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyh0aGlzLnN1YnJzKTtcblxuICAgICAgdGhpcy5pc0NGRkNJREZvbnQgPSBjZmZJbmZvLmlzQ0ZGQ0lERm9udDtcbiAgICAgIHRoaXMuZmRTZWxlY3QgPSBjZmZJbmZvLmZkU2VsZWN0O1xuICAgICAgdGhpcy5mZEFycmF5ID0gY2ZmSW5mby5mZEFycmF5O1xuICAgIH1cblxuICAgIGNvbXBpbGVHbHlwaEltcGwoY29kZSwgY21kcywgZ2x5cGhJZCkge1xuICAgICAgY29tcGlsZUNoYXJTdHJpbmcoY29kZSwgY21kcywgdGhpcywgZ2x5cGhJZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIEZvbnRSZW5kZXJlckZhY3RvcnlfY3JlYXRlKGZvbnQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHtcbiAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZm9udC5kYXRhKTtcbiAgICAgIHZhciBjbWFwLCBnbHlmLCBsb2NhLCBjZmYsIGluZGV4VG9Mb2NGb3JtYXQsIHVuaXRzUGVyRW07XG4gICAgICB2YXIgbnVtVGFibGVzID0gZ2V0VXNob3J0KGRhdGEsIDQpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSAxMjsgaSA8IG51bVRhYmxlczsgaSsrLCBwICs9IDE2KSB7XG4gICAgICAgIHZhciB0YWcgPSBieXRlc1RvU3RyaW5nKGRhdGEuc3ViYXJyYXkocCwgcCArIDQpKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IGdldExvbmcoZGF0YSwgcCArIDgpO1xuICAgICAgICB2YXIgbGVuZ3RoID0gZ2V0TG9uZyhkYXRhLCBwICsgMTIpO1xuICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgIGNhc2UgXCJjbWFwXCI6XG4gICAgICAgICAgICBjbWFwID0gcGFyc2VDbWFwKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJnbHlmXCI6XG4gICAgICAgICAgICBnbHlmID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibG9jYVwiOlxuICAgICAgICAgICAgbG9jYSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImhlYWRcIjpcbiAgICAgICAgICAgIHVuaXRzUGVyRW0gPSBnZXRVc2hvcnQoZGF0YSwgb2Zmc2V0ICsgMTgpO1xuICAgICAgICAgICAgaW5kZXhUb0xvY0Zvcm1hdCA9IGdldFVzaG9ydChkYXRhLCBvZmZzZXQgKyA1MCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQ0ZGIFwiOlxuICAgICAgICAgICAgY2ZmID0gcGFyc2VDZmYoZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgsIHNlYWNBbmFseXNpc0VuYWJsZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGdseWYpIHtcbiAgICAgICAgdmFyIGZvbnRNYXRyaXggPSAhdW5pdHNQZXJFbVxuICAgICAgICAgID8gZm9udC5mb250TWF0cml4XG4gICAgICAgICAgOiBbMSAvIHVuaXRzUGVyRW0sIDAsIDAsIDEgLyB1bml0c1BlckVtLCAwLCAwXTtcbiAgICAgICAgcmV0dXJuIG5ldyBUcnVlVHlwZUNvbXBpbGVkKFxuICAgICAgICAgIHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGluZGV4VG9Mb2NGb3JtYXQpLFxuICAgICAgICAgIGNtYXAsXG4gICAgICAgICAgZm9udE1hdHJpeFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBUeXBlMkNvbXBpbGVkKGNmZiwgY21hcCwgZm9udC5mb250TWF0cml4LCBmb250LmdseXBoTmFtZU1hcCk7XG4gICAgfSxcbiAgfTtcbn0pKCk7XG5cbmV4cG9ydCB7IEZvbnRSZW5kZXJlckZhY3RvcnkgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRFbmNvZGluZyB9IGZyb20gXCIuL2VuY29kaW5ncy5qc1wiO1xuaW1wb3J0IHsgaXNXaGl0ZVNwYWNlIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbi8vIEhpbnRpbmcgaXMgY3VycmVudGx5IGRpc2FibGVkIGR1ZSB0byB1bmtub3duIHByb2JsZW1zIG9uIHdpbmRvd3Ncbi8vIGluIHRyYWNlbW9ua2V5IGFuZCB2YXJpb3VzIG90aGVyIHBkZnMgd2l0aCB0eXBlMSBmb250cy5cbnZhciBISU5USU5HX0VOQUJMRUQgPSBmYWxzZTtcblxuLypcbiAqIENoYXJTdHJpbmdzIGFyZSBlbmNvZGVkIGZvbGxvd2luZyB0aGUgdGhlIENoYXJTdHJpbmcgRW5jb2Rpbmcgc2VxdWVuY2VcbiAqIGRlc2NyaWJlIGluIENoYXB0ZXIgNiBvZiB0aGUgXCJBZG9iZSBUeXBlMSBGb250IEZvcm1hdFwiIHNwZWNpZmljYXRpb24uXG4gKiBUaGUgdmFsdWUgaW4gYSBieXRlIGluZGljYXRlcyBhIGNvbW1hbmQsIGEgbnVtYmVyLCBvciBzdWJzZXF1ZW50IGJ5dGVzXG4gKiB0aGF0IGFyZSB0byBiZSBpbnRlcnByZXRlZCBpbiBhIHNwZWNpYWwgd2F5LlxuICpcbiAqIENoYXJTdHJpbmcgTnVtYmVyIEVuY29kaW5nOlxuICogIEEgQ2hhclN0cmluZyBieXRlIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmcm9tIDMyIHRocm91Z2ggMjU1IGluY2x1c2l2ZVxuICogIGluZGljYXRlIGFuIGludGVnZXIuIFRoZXNlIHZhbHVlcyBhcmUgZGVjb2RlZCBpbiBmb3VyIHJhbmdlcy5cbiAqXG4gKiAxLiBBIENoYXJTdHJpbmcgYnl0ZSBjb250YWluaW5nIGEgdmFsdWUsIHYsIGJldHdlZW4gMzIgYW5kIDI0NiBpbmNsdXNpdmUsXG4gKiBpbmRpY2F0ZSB0aGUgaW50ZWdlciB2IC0gMTM5LiBUaHVzLCB0aGUgaW50ZWdlciB2YWx1ZXMgZnJvbSAtMTA3IHRocm91Z2hcbiAqIDEwNyBpbmNsdXNpdmUgbWF5IGJlIGVuY29kZWQgaW4gc2luZ2xlIGJ5dGUuXG4gKlxuICogMi4gQSBDaGFyU3RyaW5nIGJ5dGUgY29udGFpbmluZyBhIHZhbHVlLCB2LCBiZXR3ZWVuIDI0NyBhbmQgMjUwIGluY2x1c2l2ZSxcbiAqIGluZGljYXRlcyBhbiBpbnRlZ2VyIGludm9sdmluZyB0aGUgbmV4dCBieXRlLCB3LCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6XG4gKiBbKHYgLSAyNDcpIHggMjU2XSArIHcgKyAxMDhcbiAqXG4gKiAzLiBBIENoYXJTdHJpbmcgYnl0ZSBjb250YWluaW5nIGEgdmFsdWUsIHYsIGJldHdlZW4gMjUxIGFuZCAyNTQgaW5jbHVzaXZlLFxuICogaW5kaWNhdGVzIGFuIGludGVnZXIgaW52b2x2aW5nIHRoZSBuZXh0IGJ5dGUsIHcsIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYTpcbiAqIC1bKHYgLSAyNTEpICogMjU2XSAtIHcgLSAxMDhcbiAqXG4gKiA0LiBBIENoYXJTdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUgMjU1IGluZGljYXRlcyB0aGF0IHRoZSBuZXh0IDQgYnl0ZXNcbiAqIGFyZSBhIHR3byBjb21wbGVtZW50IHNpZ25lZCBpbnRlZ2VyLiBUaGUgZmlyc3Qgb2YgdGhlc2UgYnl0ZXMgY29udGFpbnMgdGhlXG4gKiBoaWdoZXN0IG9yZGVyIGJpdHMsIHRoZSBzZWNvbmQgYnl0ZSBjb250YWlucyB0aGUgbmV4dCBoaWdoZXIgb3JkZXIgYml0c1xuICogYW5kIHRoZSBmb3VydGggYnl0ZSBjb250YWluIHRoZSBsb3dlc3Qgb3JkZXIgYml0cy5cbiAqXG4gKlxuICogQ2hhclN0cmluZyBDb21tYW5kIEVuY29kaW5nOlxuICogIENoYXJTdHJpbmdzIGNvbW1hbmRzIGFyZSBlbmNvZGVkIGluIDEgb3IgMiBieXRlcy5cbiAqXG4gKiAgU2luZ2xlIGJ5dGUgY29tbWFuZHMgYXJlIGVuY29kZWQgaW4gMSBieXRlIHRoYXQgY29udGFpbnMgYSB2YWx1ZSBiZXR3ZWVuXG4gKiAgMCBhbmQgMzEgaW5jbHVzaXZlLlxuICogIElmIGEgY29tbWFuZCBieXRlIGNvbnRhaW5zIHRoZSB2YWx1ZSAxMiwgdGhlbiB0aGUgdmFsdWUgaW4gdGhlIG5leHQgYnl0ZVxuICogIGluZGljYXRlcyBhIGNvbW1hbmQuIFRoaXMgXCJlc2NhcGVcIiBtZWNoYW5pc20gYWxsb3dzIG1hbnkgZXh0cmEgY29tbWFuZHNcbiAqIHRvIGJlIGVuY29kZWQgYW5kIHRoaXMgZW5jb2RpbmcgdGVjaG5pcXVlIGhlbHBzIHRvIG1pbmltaXplIHRoZSBsZW5ndGggb2ZcbiAqIHRoZSBjaGFyU3RyaW5ncy5cbiAqL1xudmFyIFR5cGUxQ2hhclN0cmluZyA9IChmdW5jdGlvbiBUeXBlMUNoYXJTdHJpbmdDbG9zdXJlKCkge1xuICB2YXIgQ09NTUFORF9NQVAgPSB7XG4gICAgaHN0ZW06IFsxXSxcbiAgICB2c3RlbTogWzNdLFxuICAgIHZtb3ZldG86IFs0XSxcbiAgICBybGluZXRvOiBbNV0sXG4gICAgaGxpbmV0bzogWzZdLFxuICAgIHZsaW5ldG86IFs3XSxcbiAgICBycmN1cnZldG86IFs4XSxcbiAgICBjYWxsc3VicjogWzEwXSxcbiAgICBmbGV4OiBbMTIsIDM1XSxcbiAgICBkcm9wOiBbMTIsIDE4XSxcbiAgICBlbmRjaGFyOiBbMTRdLFxuICAgIHJtb3ZldG86IFsyMV0sXG4gICAgaG1vdmV0bzogWzIyXSxcbiAgICB2aGN1cnZldG86IFszMF0sXG4gICAgaHZjdXJ2ZXRvOiBbMzFdLFxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gVHlwZTFDaGFyU3RyaW5nKCkge1xuICAgIHRoaXMud2lkdGggPSAwO1xuICAgIHRoaXMubHNiID0gMDtcbiAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm91dHB1dCA9IFtdO1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgfVxuXG4gIFR5cGUxQ2hhclN0cmluZy5wcm90b3R5cGUgPSB7XG4gICAgY29udmVydDogZnVuY3Rpb24gVHlwZTFDaGFyU3RyaW5nX2NvbnZlcnQoXG4gICAgICBlbmNvZGVkLFxuICAgICAgc3VicnMsXG4gICAgICBzZWFjQW5hbHlzaXNFbmFibGVkXG4gICAgKSB7XG4gICAgICB2YXIgY291bnQgPSBlbmNvZGVkLmxlbmd0aDtcbiAgICAgIHZhciBlcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIHd4LCBzYngsIHN1YnJOdW1iZXI7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZW5jb2RlZFtpXTtcbiAgICAgICAgaWYgKHZhbHVlIDwgMzIpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IDEyKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSArIGVuY29kZWRbKytpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAxOiAvLyBoc3RlbVxuICAgICAgICAgICAgICBpZiAoIUhJTlRJTkdfRU5BQkxFRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaHN0ZW0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzogLy8gdnN0ZW1cbiAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6IC8vIHZtb3ZldG9cbiAgICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGR4IGZvciBmbGV4IGFuZCBidXQgYWxzbyBzd2FwIHRoZSB2YWx1ZXMgc28gdGhleSBhcmVcbiAgICAgICAgICAgICAgICAvLyB0aGUgcmlnaHQgb3JkZXIuXG4gICAgICAgICAgICAgICAgdmFyIGR5ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCwgZHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bW92ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDU6IC8vIHJsaW5ldG9cbiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnJsaW5ldG8pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNjogLy8gaGxpbmV0b1xuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAuaGxpbmV0byk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA3OiAvLyB2bGluZXRvXG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bGluZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDg6IC8vIHJyY3VydmV0b1xuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNiwgQ09NTUFORF9NQVAucnJjdXJ2ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDk6IC8vIGNsb3NlcGF0aFxuICAgICAgICAgICAgICAvLyBjbG9zZXBhdGggaXMgYSBUeXBlMSBjb21tYW5kIHRoYXQgZG9lcyBub3QgdGFrZSBhcmd1bWVudCBhbmQgaXNcbiAgICAgICAgICAgICAgLy8gdXNlbGVzcyBpbiBUeXBlMiBhbmQgaXQgY2FuIHNpbXBseSBiZSBpZ25vcmVkLlxuICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMDogLy8gY2FsbHN1YnJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdWJyTnVtYmVyID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgaWYgKCFzdWJyc1tzdWJyTnVtYmVyXSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuY29udmVydChcbiAgICAgICAgICAgICAgICBzdWJyc1tzdWJyTnVtYmVyXSxcbiAgICAgICAgICAgICAgICBzdWJycyxcbiAgICAgICAgICAgICAgICBzZWFjQW5hbHlzaXNFbmFibGVkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMTogLy8gcmV0dXJuXG4gICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIGNhc2UgMTM6IC8vIGhzYndcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUbyBjb252ZXJ0IHRvIHR5cGUyIHdlIGhhdmUgdG8gbW92ZSB0aGUgd2lkdGggdmFsdWUgdG8gdGhlXG4gICAgICAgICAgICAgIC8vIGZpcnN0IHBhcnQgb2YgdGhlIGNoYXJzdHJpbmcgYW5kIHRoZW4gdXNlIGhtb3ZldG8gd2l0aCBsc2IuXG4gICAgICAgICAgICAgIHd4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7XG4gICAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDtcbiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngpO1xuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaG1vdmV0byk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxNDogLy8gZW5kY2hhclxuICAgICAgICAgICAgICB0aGlzLm91dHB1dC5wdXNoKENPTU1BTkRfTUFQLmVuZGNoYXJbMF0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjE6IC8vIHJtb3ZldG9cbiAgICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybW92ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDIyOiAvLyBobW92ZXRvXG4gICAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGR5IGZvciBmbGV4LlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCgwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAuaG1vdmV0byk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzMDogLy8gdmhjdXJ2ZXRvXG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC52aGN1cnZldG8pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzE6IC8vIGh2Y3VydmV0b1xuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNCwgQ09NTUFORF9NQVAuaHZjdXJ2ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDA6IC8vIGRvdHNlY3Rpb25cbiAgICAgICAgICAgICAgLy8gZG90c2VjdGlvbiBpcyBhIFR5cGUxIGNvbW1hbmQgdG8gc3BlY2lmeSBzb21lIGhpbnRpbmcgZmVhdHVyZVxuICAgICAgICAgICAgICAvLyBmb3IgZG90cyB0aGF0IGRvIG5vdCB0YWtlIGEgcGFyYW1ldGVyIGFuZCBpdCBjYW4gc2FmZWx5IGJlXG4gICAgICAgICAgICAgIC8vIGlnbm9yZWQgZm9yIFR5cGUyLlxuICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxOiAvLyB2c3RlbTNcbiAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gW3ZoXXN0ZW0zIGFyZSBUeXBlMSBvbmx5IGFuZCBUeXBlMiBzdXBwb3J0cyBbdmhdc3RlbSB3aXRoXG4gICAgICAgICAgICAgIC8vIG11bHRpcGxlIHBhcmFtZXRlcnMsIHNvIGluc3RlYWQgb2YgcmV0dXJuaW5nIFt2aF1zdGVtMyB0YWtlIGFcbiAgICAgICAgICAgICAgLy8gc2hvcnRjdXQgYW5kIHJldHVybiBbdmhzdGVtXSBpbnN0ZWFkLlxuICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAudnN0ZW0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMjogLy8gaHN0ZW0zXG4gICAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNlZSB2c3RlbTMuXG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA2OiAvLyBzZWFjXG4gICAgICAgICAgICAgIC8vIHNlYWMgaXMgbGlrZSB0eXBlIDIncyBzcGVjaWFsIGVuZGNoYXIgYnV0IGl0IGRvZXNuJ3QgdXNlIHRoZVxuICAgICAgICAgICAgICAvLyBmaXJzdCBhcmd1bWVudCBhc2IsIHNvIHJlbW92ZSBpdC5cbiAgICAgICAgICAgICAgaWYgKHNlYWNBbmFseXNpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhc2IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gNV07XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFjID0gdGhpcy5zdGFjay5zcGxpY2UoLTQsIDQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhY1swXSArPSB0aGlzLmxzYiAtIGFzYjtcbiAgICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMCwgQ09NTUFORF9NQVAuZW5kY2hhcik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDQsIENPTU1BTkRfTUFQLmVuZGNoYXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA3OiAvLyBzYndcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgNCkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUbyBjb252ZXJ0IHRvIHR5cGUyIHdlIGhhdmUgdG8gbW92ZSB0aGUgd2lkdGggdmFsdWUgdG8gdGhlXG4gICAgICAgICAgICAgIC8vIGZpcnN0IHBhcnQgb2YgdGhlIGNoYXJzdHJpbmcgYW5kIHRoZW4gdXNlIHJtb3ZldG8gd2l0aFxuICAgICAgICAgICAgICAvLyAoZHgsIGR5KS4gVGhlIGhlaWdodCBhcmd1bWVudCB3aWxsIG5vdCBiZSB1c2VkIGZvciB2bXR4IGFuZFxuICAgICAgICAgICAgICAvLyB2aGVhIHRhYmxlcyByZWNvbnN0cnVjdGlvbiAtLSBpZ25vcmluZyBpdC5cbiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsgLy8gd3lcbiAgICAgICAgICAgICAgd3ggPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICB2YXIgc2J5ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7XG4gICAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDtcbiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngsIHNieSk7XG4gICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgzLCBDT01NQU5EX01BUC5ybW92ZXRvKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDEyOiAvLyBkaXZcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgbnVtMiA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHZhciBudW0xID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKG51bTEgLyBudW0yKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE2OiAvLyBjYWxsb3RoZXJzdWJyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHZhciBudW1BcmdzID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgaWYgKHN1YnJOdW1iZXIgPT09IDAgJiYgbnVtQXJncyA9PT0gMykge1xuICAgICAgICAgICAgICAgIHZhciBmbGV4QXJncyA9IHRoaXMuc3RhY2suc3BsaWNlKHRoaXMuc3RhY2subGVuZ3RoIC0gMTcsIDE3KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goXG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1syXSArIGZsZXhBcmdzWzBdLCAvLyBiY3AxeCArIHJweFxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbM10gKyBmbGV4QXJnc1sxXSwgLy8gYmNwMXkgKyBycHlcbiAgICAgICAgICAgICAgICAgIGZsZXhBcmdzWzRdLCAvLyBiY3AyeFxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbNV0sIC8vIGJjcDJ5XG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1s2XSwgLy8gcDJ4XG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1s3XSwgLy8gcDJ5XG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1s4XSwgLy8gYmNwM3hcbiAgICAgICAgICAgICAgICAgIGZsZXhBcmdzWzldLCAvLyBiY3AzeVxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbMTBdLCAvLyBiY3A0eFxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbMTFdLCAvLyBiY3A0eVxuICAgICAgICAgICAgICAgICAgZmxleEFyZ3NbMTJdLCAvLyBwM3hcbiAgICAgICAgICAgICAgICAgIGZsZXhBcmdzWzEzXSwgLy8gcDN5XG4gICAgICAgICAgICAgICAgICBmbGV4QXJnc1sxNF0gLy8gZmxleERlcHRoXG4gICAgICAgICAgICAgICAgICAvLyAxNSA9IGZpbmFseCB1bnVzZWQgYnkgZmxleFxuICAgICAgICAgICAgICAgICAgLy8gMTYgPSBmaW5hbHkgdW51c2VkIGJ5IGZsZXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxMywgQ09NTUFORF9NQVAuZmxleCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbGV4aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGZsZXhBcmdzWzE1XSwgZmxleEFyZ3NbMTZdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJyTnVtYmVyID09PSAxICYmIG51bUFyZ3MgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNzogLy8gcG9wXG4gICAgICAgICAgICAgIC8vIElnbm9yZSB0aGlzIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCB3aXRoIG90aGVyc3Vici5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDMzOiAvLyBzZXRjdXJyZW50cG9pbnRcbiAgICAgICAgICAgICAgLy8gSWdub3JlIGZvciBub3cuXG4gICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB3YXJuKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgXCInICsgdmFsdWUgKyAnXCInKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI0Nikge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUgLSAxMzk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjUwKSB7XG4gICAgICAgICAgdmFsdWUgPSAodmFsdWUgLSAyNDcpICogMjU2ICsgZW5jb2RlZFsrK2ldICsgMTA4O1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1NCkge1xuICAgICAgICAgIHZhbHVlID0gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGVuY29kZWRbKytpXSAtIDEwODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9XG4gICAgICAgICAgICAoKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDI0KSB8XG4gICAgICAgICAgICAoKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDE2KSB8XG4gICAgICAgICAgICAoKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDgpIHxcbiAgICAgICAgICAgICgoZW5jb2RlZFsrK2ldICYgMHhmZikgPDwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuXG4gICAgZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykge1xuICAgICAgdmFyIHN0YWNrTGVuZ3RoID0gdGhpcy5zdGFjay5sZW5ndGg7XG4gICAgICBpZiAoaG93TWFueUFyZ3MgPiBzdGFja0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdGFydCA9IHN0YWNrTGVuZ3RoIC0gaG93TWFueUFyZ3M7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBzdGFja0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc3RhY2tbaV07XG4gICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgIHRoaXMub3V0cHV0LnB1c2goMjgsICh2YWx1ZSA+PiA4KSAmIDB4ZmYsIHZhbHVlICYgMHhmZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZml4ZWQgcG9pbnRcbiAgICAgICAgICB2YWx1ZSA9ICg2NTUzNiAqIHZhbHVlKSB8IDA7XG4gICAgICAgICAgdGhpcy5vdXRwdXQucHVzaChcbiAgICAgICAgICAgIDI1NSxcbiAgICAgICAgICAgICh2YWx1ZSA+PiAyNCkgJiAweGZmLFxuICAgICAgICAgICAgKHZhbHVlID4+IDE2KSAmIDB4ZmYsXG4gICAgICAgICAgICAodmFsdWUgPj4gOCkgJiAweGZmLFxuICAgICAgICAgICAgdmFsdWUgJiAweGZmXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5vdXRwdXQucHVzaC5hcHBseSh0aGlzLm91dHB1dCwgY29tbWFuZCk7XG4gICAgICBpZiAoa2VlcFN0YWNrKSB7XG4gICAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gVHlwZTFDaGFyU3RyaW5nO1xufSkoKTtcblxuLypcbiAqIFR5cGUxUGFyc2VyIGVuY2Fwc3VsYXRlIHRoZSBuZWVkZWQgY29kZSBmb3IgcGFyc2luZyBhIFR5cGUxIGZvbnRcbiAqIHByb2dyYW0uIFNvbWUgb2YgaXRzIGxvZ2ljIGRlcGVuZHMgb24gdGhlIFR5cGUyIGNoYXJzdHJpbmdzXG4gKiBzdHJ1Y3R1cmUuXG4gKiBOb3RlOiB0aGlzIGRvZXNuJ3QgcmVhbGx5IHBhcnNlIHRoZSBmb250IHNpbmNlIHRoYXQgd291bGQgcmVxdWlyZSBldmFsdWF0aW9uXG4gKiBvZiBQb3N0U2NyaXB0LCBidXQgaXQgaXMgcG9zc2libGUgaW4gbW9zdCBjYXNlcyB0byBleHRyYWN0IHdoYXQgd2UgbmVlZFxuICogd2l0aG91dCBhIGZ1bGwgcGFyc2UuXG4gKi9cbnZhciBUeXBlMVBhcnNlciA9IChmdW5jdGlvbiBUeXBlMVBhcnNlckNsb3N1cmUoKSB7XG4gIC8qXG4gICAqIERlY3J5cHQgYSBTZXF1ZW5jZSBvZiBDaXBoZXJ0ZXh0IEJ5dGVzIHRvIFByb2R1Y2UgdGhlIE9yaWdpbmFsIFNlcXVlbmNlXG4gICAqIG9mIFBsYWludGV4dCBCeXRlcy4gVGhlIGZ1bmN0aW9uIHRvb2sgYSBrZXkgYXMgYSBwYXJhbWV0ZXIgd2hpY2ggY2FuIGJlXG4gICAqIGZvciBkZWNyeXB0aW5nIHRoZSBlZXhlYyBibG9jayBvZiBmb3IgZGVjb2RpbmcgY2hhclN0cmluZ3MuXG4gICAqL1xuICB2YXIgRUVYRUNfRU5DUllQVF9LRVkgPSA1NTY2NTtcbiAgdmFyIENIQVJfU1RSU19FTkNSWVBUX0tFWSA9IDQzMzA7XG5cbiAgZnVuY3Rpb24gaXNIZXhEaWdpdChjb2RlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHx8IC8vICcwJy0nOSdcbiAgICAgIChjb2RlID49IDY1ICYmIGNvZGUgPD0gNzApIHx8IC8vICdBJy0nRidcbiAgICAgIChjb2RlID49IDk3ICYmIGNvZGUgPD0gMTAyKSAvLyAnYSctJ2YnXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY3J5cHQoZGF0YSwga2V5LCBkaXNjYXJkTnVtYmVyKSB7XG4gICAgaWYgKGRpc2NhcmROdW1iZXIgPj0gZGF0YS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgdmFyIHIgPSBrZXkgfCAwLFxuICAgICAgYzEgPSA1Mjg0NSxcbiAgICAgIGMyID0gMjI3MTksXG4gICAgICBpLFxuICAgICAgajtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZGlzY2FyZE51bWJlcjsgaSsrKSB7XG4gICAgICByID0gKChkYXRhW2ldICsgcikgKiBjMSArIGMyKSAmICgoMSA8PCAxNikgLSAxKTtcbiAgICB9XG4gICAgdmFyIGNvdW50ID0gZGF0YS5sZW5ndGggLSBkaXNjYXJkTnVtYmVyO1xuICAgIHZhciBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShjb3VudCk7XG4gICAgZm9yIChpID0gZGlzY2FyZE51bWJlciwgaiA9IDA7IGogPCBjb3VudDsgaSsrLCBqKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGRhdGFbaV07XG4gICAgICBkZWNyeXB0ZWRbal0gPSB2YWx1ZSBeIChyID4+IDgpO1xuICAgICAgciA9ICgodmFsdWUgKyByKSAqIGMxICsgYzIpICYgKCgxIDw8IDE2KSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVjcnlwdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikge1xuICAgIHZhciByID0ga2V5IHwgMCxcbiAgICAgIGMxID0gNTI4NDUsXG4gICAgICBjMiA9IDIyNzE5O1xuICAgIHZhciBjb3VudCA9IGRhdGEubGVuZ3RoLFxuICAgICAgbWF5YmVMZW5ndGggPSBjb3VudCA+Pj4gMTtcbiAgICB2YXIgZGVjcnlwdGVkID0gbmV3IFVpbnQ4QXJyYXkobWF5YmVMZW5ndGgpO1xuICAgIHZhciBpLCBqO1xuICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgdmFyIGRpZ2l0MSA9IGRhdGFbaV07XG4gICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQxKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICAgIHZhciBkaWdpdDI7XG4gICAgICB3aGlsZSAoaSA8IGNvdW50ICYmICFpc0hleERpZ2l0KChkaWdpdDIgPSBkYXRhW2ldKSkpIHtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgaWYgKGkgPCBjb3VudCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZUludChTdHJpbmcuZnJvbUNoYXJDb2RlKGRpZ2l0MSwgZGlnaXQyKSwgMTYpO1xuICAgICAgICBkZWNyeXB0ZWRbaisrXSA9IHZhbHVlIF4gKHIgPj4gOCk7XG4gICAgICAgIHIgPSAoKHZhbHVlICsgcikgKiBjMSArIGMyKSAmICgoMSA8PCAxNikgLSAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlY3J5cHRlZC5zbGljZShkaXNjYXJkTnVtYmVyLCBqKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3BlY2lhbChjKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGMgPT09IC8qICcvJyA9ICovIDB4MmYgfHxcbiAgICAgIGMgPT09IC8qICdbJyA9ICovIDB4NWIgfHxcbiAgICAgIGMgPT09IC8qICddJyA9ICovIDB4NWQgfHxcbiAgICAgIGMgPT09IC8qICd7JyA9ICovIDB4N2IgfHxcbiAgICAgIGMgPT09IC8qICd9JyA9ICovIDB4N2QgfHxcbiAgICAgIGMgPT09IC8qICcoJyA9ICovIDB4MjggfHxcbiAgICAgIGMgPT09IC8qICcpJyA9ICovIDB4MjlcbiAgICApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBUeXBlMVBhcnNlcihzdHJlYW0sIGVuY3J5cHRlZCwgc2VhY0FuYWx5c2lzRW5hYmxlZCkge1xuICAgIGlmIChlbmNyeXB0ZWQpIHtcbiAgICAgIHZhciBkYXRhID0gc3RyZWFtLmdldEJ5dGVzKCk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSAhKFxuICAgICAgICAoaXNIZXhEaWdpdChkYXRhWzBdKSB8fCBpc1doaXRlU3BhY2UoZGF0YVswXSkpICYmXG4gICAgICAgIGlzSGV4RGlnaXQoZGF0YVsxXSkgJiZcbiAgICAgICAgaXNIZXhEaWdpdChkYXRhWzJdKSAmJlxuICAgICAgICBpc0hleERpZ2l0KGRhdGFbM10pICYmXG4gICAgICAgIGlzSGV4RGlnaXQoZGF0YVs0XSkgJiZcbiAgICAgICAgaXNIZXhEaWdpdChkYXRhWzVdKSAmJlxuICAgICAgICBpc0hleERpZ2l0KGRhdGFbNl0pICYmXG4gICAgICAgIGlzSGV4RGlnaXQoZGF0YVs3XSlcbiAgICAgICk7XG4gICAgICBzdHJlYW0gPSBuZXcgU3RyZWFtKFxuICAgICAgICBpc0JpbmFyeVxuICAgICAgICAgID8gZGVjcnlwdChkYXRhLCBFRVhFQ19FTkNSWVBUX0tFWSwgNClcbiAgICAgICAgICA6IGRlY3J5cHRBc2NpaShkYXRhLCBFRVhFQ19FTkNSWVBUX0tFWSwgNClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDtcblxuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMubmV4dENoYXIoKTtcbiAgfVxuXG4gIFR5cGUxUGFyc2VyLnByb3RvdHlwZSA9IHtcbiAgICByZWFkTnVtYmVyQXJyYXk6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWROdW1iZXJBcnJheSgpIHtcbiAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCAnWycgb3IgJ3snIChhcnJheXMgY2FuIHN0YXJ0IHdpdGggZWl0aGVyKVxuICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gXCJdXCIgfHwgdG9rZW4gPT09IFwifVwiKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXkucHVzaChwYXJzZUZsb2F0KHRva2VuIHx8IDApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9LFxuXG4gICAgcmVhZE51bWJlcjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZE51bWJlcigpIHtcbiAgICAgIHZhciB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRva2VuIHx8IDApO1xuICAgIH0sXG5cbiAgICByZWFkSW50OiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkSW50KCkge1xuICAgICAgLy8gVXNlICd8IDAnIHRvIHByZXZlbnQgc2V0dGluZyBhIGRvdWJsZSBpbnRvIGxlbmd0aCBzdWNoIGFzIHRoZSBkb3VibGVcbiAgICAgIC8vIGRvZXMgbm90IGZsb3cgaW50byB0aGUgbG9vcCB2YXJpYWJsZS5cbiAgICAgIHZhciB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgIHJldHVybiBwYXJzZUludCh0b2tlbiB8fCAwLCAxMCkgfCAwO1xuICAgIH0sXG5cbiAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZEJvb2xlYW4oKSB7XG4gICAgICB2YXIgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG5cbiAgICAgIC8vIFVzZSAxIGFuZCAwIHNpbmNlIHRoYXQncyB3aGF0IHR5cGUyIGNoYXJzdHJpbmdzIHVzZS5cbiAgICAgIHJldHVybiB0b2tlbiA9PT0gXCJ0cnVlXCIgPyAxIDogMDtcbiAgICB9LFxuXG4gICAgbmV4dENoYXI6IGZ1bmN0aW9uIFR5cGUxX25leHRDaGFyKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKTtcbiAgICB9LFxuXG4gICAgZ2V0VG9rZW46IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX2dldFRva2VuKCkge1xuICAgICAgLy8gRWF0IHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLlxuICAgICAgdmFyIGNvbW1lbnQgPSBmYWxzZTtcbiAgICAgIHZhciBjaCA9IHRoaXMuY3VycmVudENoYXI7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoY2ggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkge1xuICAgICAgICAgICAgY29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gLyogJyUnID0gKi8gMHgyNSkge1xuICAgICAgICAgIGNvbW1lbnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTcGVjaWFsKGNoKSkge1xuICAgICAgICB0aGlzLm5leHRDaGFyKCk7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgIH1cbiAgICAgIHZhciB0b2tlbiA9IFwiXCI7XG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTtcbiAgICAgIH0gd2hpbGUgKGNoID49IDAgJiYgIWlzV2hpdGVTcGFjZShjaCkgJiYgIWlzU3BlY2lhbChjaCkpO1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH0sXG5cbiAgICByZWFkQ2hhclN0cmluZ3M6IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX3JlYWRDaGFyU3RyaW5ncyhieXRlcywgbGVuSVYpIHtcbiAgICAgIGlmIChsZW5JViA9PT0gLTEpIHtcbiAgICAgICAgLy8gVGhpcyBpc24ndCBpbiB0aGUgc3BlYywgYnV0IEFkb2JlJ3MgdHggcHJvZ3JhbSBoYW5kbGVzIC0xXG4gICAgICAgIC8vIGFzIHBsYWluIHRleHQuXG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWNyeXB0KGJ5dGVzLCBDSEFSX1NUUlNfRU5DUllQVF9LRVksIGxlbklWKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIGEgU3VicnMgYXJyYXkgYW5kIGEgQ2hhclN0cmluZ3NcbiAgICAgKiBhcnJheSBleHRyYWN0ZWQgZnJvbSBhbmQgZWV4ZWMgZW5jcnlwdGVkIGJsb2NrIG9mIGRhdGFcbiAgICAgKi9cbiAgICBleHRyYWN0Rm9udFByb2dyYW06IGZ1bmN0aW9uIFR5cGUxUGFyc2VyX2V4dHJhY3RGb250UHJvZ3JhbShwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07XG5cbiAgICAgIHZhciBzdWJycyA9IFtdLFxuICAgICAgICBjaGFyc3RyaW5ncyA9IFtdO1xuICAgICAgdmFyIHByaXZhdGVEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHByaXZhdGVEYXRhLmxlbklWID0gNDtcbiAgICAgIHZhciBwcm9ncmFtID0ge1xuICAgICAgICBzdWJyczogW10sXG4gICAgICAgIGNoYXJzdHJpbmdzOiBbXSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHByaXZhdGVEYXRhLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHZhciB0b2tlbiwgbGVuZ3RoLCBkYXRhLCBsZW5JViwgZW5jb2RlZDtcbiAgICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmdldFRva2VuKCkpICE9PSBudWxsKSB7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gXCIvXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICAgIGNhc2UgXCJDaGFyU3RyaW5nc1wiOlxuICAgICAgICAgICAgLy8gVGhlIG51bWJlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgQ2hhclN0cmluZ3MgbXVzdCBiZSBncmVhdGVyIG9yXG4gICAgICAgICAgICAvLyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIENoYXJTdHJpbmdzLlxuICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIGluICdkaWN0J1xuICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIGluICdkdXAnXG4gICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7IC8vIHJlYWQgaW4gJ2JlZ2luJ1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gXCJlbmRcIikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHRva2VuICE9PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBnbHlwaCA9IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5yZWFkSW50KCk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnUkQnIG9yICctfCdcbiAgICAgICAgICAgICAgZGF0YSA9IGxlbmd0aCA+IDAgPyBzdHJlYW0uZ2V0Qnl0ZXMobGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICAgICAgICBsZW5JViA9IHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjtcbiAgICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMucmVhZENoYXJTdHJpbmdzKGRhdGEsIGxlbklWKTtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnTkQnIG9yICd8LSdcbiAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBcIm5vYWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7IC8vIHJlYWQgaW4gJ2RlZidcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaGFyc3RyaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgICBnbHlwaCxcbiAgICAgICAgICAgICAgICBlbmNvZGVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJTdWJyc1wiOlxuICAgICAgICAgICAgdGhpcy5yZWFkSW50KCk7IC8vIG51bVxuICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIGluICdhcnJheSdcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmdldFRva2VuKCkgPT09IFwiZHVwXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlYWRJbnQoKTtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5yZWFkSW50KCk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnUkQnIG9yICctfCdcbiAgICAgICAgICAgICAgZGF0YSA9IGxlbmd0aCA+IDAgPyBzdHJlYW0uZ2V0Qnl0ZXMobGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICAgICAgICBsZW5JViA9IHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjtcbiAgICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMucmVhZENoYXJTdHJpbmdzKGRhdGEsIGxlbklWKTtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnTlAnIG9yICd8J1xuICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IFwibm9hY2Nlc3NcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAncHV0J1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN1YnJzW2luZGV4XSA9IGVuY29kZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQmx1ZVZhbHVlc1wiOlxuICAgICAgICAgIGNhc2UgXCJPdGhlckJsdWVzXCI6XG4gICAgICAgICAgY2FzZSBcIkZhbWlseUJsdWVzXCI6XG4gICAgICAgICAgY2FzZSBcIkZhbWlseU90aGVyQmx1ZXNcIjpcbiAgICAgICAgICAgIHZhciBibHVlQXJyYXkgPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpO1xuICAgICAgICAgICAgLy8gKkJsdWUqIHZhbHVlcyBtYXkgY29udGFpbiBpbnZhbGlkIGRhdGE6IGRpc2FibGVzIHJlYWRpbmcgb2ZcbiAgICAgICAgICAgIC8vIHRob3NlIHZhbHVlcyB3aGVuIGhpbnRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGJsdWVBcnJheS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGJsdWVBcnJheS5sZW5ndGggJSAyID09PSAwICYmXG4gICAgICAgICAgICAgIEhJTlRJTkdfRU5BQkxFRFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSBibHVlQXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiU3RlbVNuYXBIXCI6XG4gICAgICAgICAgY2FzZSBcIlN0ZW1TbmFwVlwiOlxuICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlckFycmF5KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiU3RkSFdcIjpcbiAgICAgICAgICBjYXNlIFwiU3RkVldcIjpcbiAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkJsdWVTaGlmdFwiOlxuICAgICAgICAgIGNhc2UgXCJsZW5JVlwiOlxuICAgICAgICAgIGNhc2UgXCJCbHVlRnV6elwiOlxuICAgICAgICAgIGNhc2UgXCJCbHVlU2NhbGVcIjpcbiAgICAgICAgICBjYXNlIFwiTGFuZ3VhZ2VHcm91cFwiOlxuICAgICAgICAgIGNhc2UgXCJFeHBhbnNpb25GYWN0b3JcIjpcbiAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXIoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJGb3JjZUJvbGRcIjpcbiAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWRCb29sZWFuKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGdseXBoID0gY2hhcnN0cmluZ3NbaV0uZ2x5cGg7XG4gICAgICAgIGVuY29kZWQgPSBjaGFyc3RyaW5nc1tpXS5lbmNvZGVkO1xuICAgICAgICB2YXIgY2hhclN0cmluZyA9IG5ldyBUeXBlMUNoYXJTdHJpbmcoKTtcbiAgICAgICAgdmFyIGVycm9yID0gY2hhclN0cmluZy5jb252ZXJ0KFxuICAgICAgICAgIGVuY29kZWQsXG4gICAgICAgICAgc3VicnMsXG4gICAgICAgICAgdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkXG4gICAgICAgICk7XG4gICAgICAgIHZhciBvdXRwdXQgPSBjaGFyU3RyaW5nLm91dHB1dDtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgLy8gSXQgc2VlbXMgd2hlbiBGcmVlVHlwZSBlbmNvdW50ZXJzIGFuIGVycm9yIHdoaWxlIGV2YWx1YXRpbmcgYSBnbHlwaFxuICAgICAgICAgIC8vIHRoYXQgaXQgY29tcGxldGVseSBpZ25vcmVzIHRoZSBnbHlwaCBzbyB3ZSdsbCBtaW1pYyB0aGF0IGJlaGF2aW91clxuICAgICAgICAgIC8vIGhlcmUgYW5kIHB1dCBhbiBlbmRjaGFyIHRvIG1ha2UgdGhlIHZhbGlkYXRvciBoYXBweS5cbiAgICAgICAgICBvdXRwdXQgPSBbMTRdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYXJTdHJpbmdPYmplY3QgPSB7XG4gICAgICAgICAgZ2x5cGhOYW1lOiBnbHlwaCxcbiAgICAgICAgICBjaGFyc3RyaW5nOiBvdXRwdXQsXG4gICAgICAgICAgd2lkdGg6IGNoYXJTdHJpbmcud2lkdGgsXG4gICAgICAgICAgbHNiOiBjaGFyU3RyaW5nLmxzYixcbiAgICAgICAgICBzZWFjOiBjaGFyU3RyaW5nLnNlYWMsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChnbHlwaCA9PT0gXCIubm90ZGVmXCIpIHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgLm5vdGRlZiBpcyBhdCBpbmRleCB6ZXJvIChpc3N1ZSAjMTE0NzcpLlxuICAgICAgICAgIHByb2dyYW0uY2hhcnN0cmluZ3MudW5zaGlmdChjaGFyU3RyaW5nT2JqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9ncmFtLmNoYXJzdHJpbmdzLnB1c2goY2hhclN0cmluZ09iamVjdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRlbXB0IHRvIHJlcGxhY2UgbWlzc2luZyB3aWR0aHMsIGZyb20gdGhlIGZvbnQgZGljdGlvbmFyeSAvV2lkdGhzXG4gICAgICAgIC8vIGVudHJ5LCB3aXRoIG9uZXMgZnJvbSB0aGUgZm9udCBkYXRhIChmaXhlcyBpc3N1ZTExMTUwX3JlZHVjZWQucGRmKS5cbiAgICAgICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZy5pbmRleE9mKGdseXBoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbmRleCA+IC0xICYmXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLndpZHRoc1tpbmRleF0gPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgaW5kZXggPj0gcHJvcGVydGllcy5maXJzdENoYXIgJiZcbiAgICAgICAgICAgIGluZGV4IDw9IHByb3BlcnRpZXMubGFzdENoYXJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9IGNoYXJTdHJpbmcud2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH0sXG5cbiAgICBleHRyYWN0Rm9udEhlYWRlcjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcykge1xuICAgICAgdmFyIHRva2VuO1xuICAgICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHRva2VuICE9PSBcIi9cIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpO1xuICAgICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgICAgY2FzZSBcIkZvbnRNYXRyaXhcIjpcbiAgICAgICAgICAgIHZhciBtYXRyaXggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpO1xuICAgICAgICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gbWF0cml4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkVuY29kaW5nXCI6XG4gICAgICAgICAgICB2YXIgZW5jb2RpbmdBcmcgPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICB2YXIgZW5jb2Rpbmc7XG4gICAgICAgICAgICBpZiAoIS9eXFxkKyQvLnRlc3QoZW5jb2RpbmdBcmcpKSB7XG4gICAgICAgICAgICAgIC8vIGVuY29kaW5nIG5hbWUgaXMgc3BlY2lmaWVkXG4gICAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoZW5jb2RpbmdBcmcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW5jb2RpbmcgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIHNpemUgPSBwYXJzZUludChlbmNvZGluZ0FyZywgMTApIHwgMDtcbiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIGluICdhcnJheSdcblxuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNpemU7IGorKykge1xuICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpO1xuICAgICAgICAgICAgICAgIC8vIHNraXBwaW5nIHRpbGwgZmlyc3QgZHVwIG9yIGRlZiAoZS5nLiBpZ25vcmluZyBmb3Igc3RhdGVtZW50KVxuICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbiAhPT0gXCJkdXBcIiAmJiB0b2tlbiAhPT0gXCJkZWZcIikge1xuICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBpbnZhbGlkIGhlYWRlclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IFwiZGVmXCIpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyByZWFkIGFsbCBhcnJheSBkYXRhXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMucmVhZEludCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gcmVhZCBpbiAnLydcbiAgICAgICAgICAgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gZ2x5cGg7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOyAvLyByZWFkIHRoZSBpbiAncHV0J1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkZvbnRCQm94XCI6XG4gICAgICAgICAgICB2YXIgZm9udEJCb3ggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpO1xuICAgICAgICAgICAgLy8gYWRqdXN0aW5nIGFzY2VudC9kZXNjZW50XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudCA9IE1hdGgubWF4KGZvbnRCQm94WzNdLCBmb250QkJveFsxXSk7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmRlc2NlbnQgPSBNYXRoLm1pbihmb250QkJveFsxXSwgZm9udEJCb3hbM10pO1xuICAgICAgICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBUeXBlMVBhcnNlcjtcbn0pKCk7XG5cbmV4cG9ydCB7IFR5cGUxUGFyc2VyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBGb3JtYXRFcnJvcixcbiAgaW5mbyxcbiAgdW5yZWFjaGFibGUsXG4gIFVOU1VQUE9SVEVEX0ZFQVRVUkVTLFxuICBVdGlsLFxuICB3YXJuLFxufSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IENvbG9yU3BhY2UgfSBmcm9tIFwiLi9jb2xvcnNwYWNlLmpzXCI7XG5pbXBvcnQgeyBpc1N0cmVhbSB9IGZyb20gXCIuL3ByaW1pdGl2ZXMuanNcIjtcbmltcG9ydCB7IE1pc3NpbmdEYXRhRXhjZXB0aW9uIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuXG52YXIgU2hhZGluZ1R5cGUgPSB7XG4gIEZVTkNUSU9OX0JBU0VEOiAxLFxuICBBWElBTDogMixcbiAgUkFESUFMOiAzLFxuICBGUkVFX0ZPUk1fTUVTSDogNCxcbiAgTEFUVElDRV9GT1JNX01FU0g6IDUsXG4gIENPT05TX1BBVENIX01FU0g6IDYsXG4gIFRFTlNPUl9QQVRDSF9NRVNIOiA3LFxufTtcblxudmFyIFBhdHRlcm4gPSAoZnVuY3Rpb24gUGF0dGVybkNsb3N1cmUoKSB7XG4gIC8vIENvbnN0cnVjdG9yIHNob3VsZCBkZWZpbmUgdGhpcy5nZXRQYXR0ZXJuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUGF0dGVybigpIHtcbiAgICB1bnJlYWNoYWJsZShcInNob3VsZCBub3QgY2FsbCBQYXR0ZXJuIGNvbnN0cnVjdG9yXCIpO1xuICB9XG5cbiAgUGF0dGVybi5wcm90b3R5cGUgPSB7XG4gICAgLy8gSW5wdXQ6IGN1cnJlbnQgQ2FudmFzIGNvbnRleHRcbiAgICAvLyBPdXRwdXQ6IHRoZSBhcHByb3ByaWF0ZSBmaWxsU3R5bGUgb3Igc3Ryb2tlU3R5bGVcbiAgICBnZXRQYXR0ZXJuOiBmdW5jdGlvbiBQYXR0ZXJuX2dldFBhdHRlcm4oY3R4KSB7XG4gICAgICB1bnJlYWNoYWJsZShgU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm4uZ2V0U3R5bGU6ICR7Y3R4fWApO1xuICAgIH0sXG4gIH07XG5cbiAgUGF0dGVybi5wYXJzZVNoYWRpbmcgPSBmdW5jdGlvbiAoXG4gICAgc2hhZGluZyxcbiAgICBtYXRyaXgsXG4gICAgeHJlZixcbiAgICByZXMsXG4gICAgaGFuZGxlcixcbiAgICBwZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgbG9jYWxDb2xvclNwYWNlQ2FjaGVcbiAgKSB7XG4gICAgdmFyIGRpY3QgPSBpc1N0cmVhbShzaGFkaW5nKSA/IHNoYWRpbmcuZGljdCA6IHNoYWRpbmc7XG4gICAgdmFyIHR5cGUgPSBkaWN0LmdldChcIlNoYWRpbmdUeXBlXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLkFYSUFMOlxuICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLlJBRElBTDpcbiAgICAgICAgICAvLyBCb3RoIHJhZGlhbCBhbmQgYXhpYWwgc2hhZGluZ3MgYXJlIGhhbmRsZWQgYnkgUmFkaWFsQXhpYWwgc2hhZGluZy5cbiAgICAgICAgICByZXR1cm4gbmV3IFNoYWRpbmdzLlJhZGlhbEF4aWFsKFxuICAgICAgICAgICAgZGljdCxcbiAgICAgICAgICAgIG1hdHJpeCxcbiAgICAgICAgICAgIHhyZWYsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6XG4gICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6XG4gICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDpcbiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDpcbiAgICAgICAgICByZXR1cm4gbmV3IFNoYWRpbmdzLk1lc2goXG4gICAgICAgICAgICBzaGFkaW5nLFxuICAgICAgICAgICAgbWF0cml4LFxuICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJVbnN1cHBvcnRlZCBTaGFkaW5nVHlwZTogXCIgKyB0eXBlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICBoYW5kbGVyLnNlbmQoXCJVbnN1cHBvcnRlZEZlYXR1cmVcIiwge1xuICAgICAgICBmZWF0dXJlSWQ6IFVOU1VQUE9SVEVEX0ZFQVRVUkVTLnNoYWRpbmdQYXR0ZXJuLFxuICAgICAgfSk7XG4gICAgICB3YXJuKGV4KTtcbiAgICAgIHJldHVybiBuZXcgU2hhZGluZ3MuRHVtbXkoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBQYXR0ZXJuO1xufSkoKTtcblxudmFyIFNoYWRpbmdzID0ge307XG5cbi8vIEEgc21hbGwgbnVtYmVyIHRvIG9mZnNldCB0aGUgZmlyc3QvbGFzdCBjb2xvciBzdG9wcyBzbyB3ZSBjYW4gaW5zZXJ0IG9uZXMgdG9cbi8vIHN1cHBvcnQgZXh0ZW5kLiBOdW1iZXIuTUlOX1ZBTFVFIGlzIHRvbyBzbWFsbCBhbmQgYnJlYWtzIHRoZSBleHRlbmQuXG5TaGFkaW5ncy5TTUFMTF9OVU1CRVIgPSAxZS02O1xuXG4vLyBSYWRpYWwgYW5kIGF4aWFsIHNoYWRpbmcgaGF2ZSB2ZXJ5IHNpbWlsYXIgaW1wbGVtZW50YXRpb25zXG4vLyBJZiBuZWVkZWQsIHRoZSBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIGJyb2tlbiBpbnRvIHR3byBjbGFzc2VzXG5TaGFkaW5ncy5SYWRpYWxBeGlhbCA9IChmdW5jdGlvbiBSYWRpYWxBeGlhbENsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIFJhZGlhbEF4aWFsKFxuICAgIGRpY3QsXG4gICAgbWF0cml4LFxuICAgIHhyZWYsXG4gICAgcmVzb3VyY2VzLFxuICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICApIHtcbiAgICB0aGlzLm1hdHJpeCA9IG1hdHJpeDtcbiAgICB0aGlzLmNvb3Jkc0FyciA9IGRpY3QuZ2V0QXJyYXkoXCJDb29yZHNcIik7XG4gICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KFwiU2hhZGluZ1R5cGVcIik7XG4gICAgdGhpcy50eXBlID0gXCJQYXR0ZXJuXCI7XG4gICAgY29uc3QgY3MgPSBDb2xvclNwYWNlLnBhcnNlKHtcbiAgICAgIGNzOiBkaWN0LmdldFJhdyhcIkNvbG9yU3BhY2VcIikgfHwgZGljdC5nZXRSYXcoXCJDU1wiKSxcbiAgICAgIHhyZWYsXG4gICAgICByZXNvdXJjZXMsXG4gICAgICBwZGZGdW5jdGlvbkZhY3RvcnksXG4gICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICB9KTtcbiAgICB0aGlzLmNzID0gY3M7XG4gICAgY29uc3QgYmJveCA9IGRpY3QuZ2V0QXJyYXkoXCJCQm94XCIpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7XG4gICAgICB0aGlzLmJib3ggPSBVdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmJveCA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHQwID0gMC4wLFxuICAgICAgdDEgPSAxLjA7XG4gICAgaWYgKGRpY3QuaGFzKFwiRG9tYWluXCIpKSB7XG4gICAgICB2YXIgZG9tYWluQXJyID0gZGljdC5nZXRBcnJheShcIkRvbWFpblwiKTtcbiAgICAgIHQwID0gZG9tYWluQXJyWzBdO1xuICAgICAgdDEgPSBkb21haW5BcnJbMV07XG4gICAgfVxuXG4gICAgdmFyIGV4dGVuZFN0YXJ0ID0gZmFsc2UsXG4gICAgICBleHRlbmRFbmQgPSBmYWxzZTtcbiAgICBpZiAoZGljdC5oYXMoXCJFeHRlbmRcIikpIHtcbiAgICAgIHZhciBleHRlbmRBcnIgPSBkaWN0LmdldEFycmF5KFwiRXh0ZW5kXCIpO1xuICAgICAgZXh0ZW5kU3RhcnQgPSBleHRlbmRBcnJbMF07XG4gICAgICBleHRlbmRFbmQgPSBleHRlbmRBcnJbMV07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMICYmXG4gICAgICAoIWV4dGVuZFN0YXJ0IHx8ICFleHRlbmRFbmQpXG4gICAgKSB7XG4gICAgICAvLyBSYWRpYWwgZ3JhZGllbnQgb25seSBjdXJyZW50bHkgd29ya3MgaWYgZWl0aGVyIGNpcmNsZSBpcyBmdWxseSB3aXRoaW5cbiAgICAgIC8vIHRoZSBvdGhlciBjaXJjbGUuXG4gICAgICB2YXIgeDEgPSB0aGlzLmNvb3Jkc0FyclswXTtcbiAgICAgIHZhciB5MSA9IHRoaXMuY29vcmRzQXJyWzFdO1xuICAgICAgdmFyIHIxID0gdGhpcy5jb29yZHNBcnJbMl07XG4gICAgICB2YXIgeDIgPSB0aGlzLmNvb3Jkc0FyclszXTtcbiAgICAgIHZhciB5MiA9IHRoaXMuY29vcmRzQXJyWzRdO1xuICAgICAgdmFyIHIyID0gdGhpcy5jb29yZHNBcnJbNV07XG4gICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoKHgxIC0geDIpICogKHgxIC0geDIpICsgKHkxIC0geTIpICogKHkxIC0geTIpKTtcbiAgICAgIGlmIChyMSA8PSByMiArIGRpc3RhbmNlICYmIHIyIDw9IHIxICsgZGlzdGFuY2UpIHtcbiAgICAgICAgd2FybihcIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5leHRlbmRTdGFydCA9IGV4dGVuZFN0YXJ0O1xuICAgIHRoaXMuZXh0ZW5kRW5kID0gZXh0ZW5kRW5kO1xuXG4gICAgdmFyIGZuT2JqID0gZGljdC5nZXRSYXcoXCJGdW5jdGlvblwiKTtcbiAgICB2YXIgZm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlRnJvbUFycmF5KGZuT2JqKTtcblxuICAgIC8vIDEwIHNhbXBsZXMgc2VlbXMgZ29vZCBlbm91Z2ggZm9yIG5vdywgYnV0IHByb2JhYmx5IHdvbid0IHdvcmtcbiAgICAvLyBpZiB0aGVyZSBhcmUgc2hhcnAgY29sb3IgY2hhbmdlcy4gSWRlYWxseSwgd2Ugd291bGQgaW1wbGVtZW50XG4gICAgLy8gdGhlIHNwZWMgZmFpdGhmdWxseSBhbmQgYWRkIGxvc3NsZXNzIG9wdGltaXphdGlvbnMuXG4gICAgY29uc3QgTlVNQkVSX09GX1NBTVBMRVMgPSAxMDtcbiAgICBjb25zdCBzdGVwID0gKHQxIC0gdDApIC8gTlVNQkVSX09GX1NBTVBMRVM7XG5cbiAgICB2YXIgY29sb3JTdG9wcyA9ICh0aGlzLmNvbG9yU3RvcHMgPSBbXSk7XG5cbiAgICAvLyBQcm90ZWN0IGFnYWluc3QgYmFkIGRvbWFpbnMuXG4gICAgaWYgKHQwID49IHQxIHx8IHN0ZXAgPD0gMCkge1xuICAgICAgLy8gQWNyb2JhdCBkb2Vzbid0IHNlZW0gdG8gaGFuZGxlIHRoZXNlIGNhc2VzIHNvIHdlJ2xsIGlnbm9yZSBmb3JcbiAgICAgIC8vIG5vdy5cbiAgICAgIGluZm8oXCJCYWQgc2hhZGluZyBkb21haW4uXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjb2xvciA9IG5ldyBGbG9hdDMyQXJyYXkoY3MubnVtQ29tcHMpLFxuICAgICAgcmF0aW8gPSBuZXcgRmxvYXQzMkFycmF5KDEpO1xuICAgIHZhciByZ2JDb2xvcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBOVU1CRVJfT0ZfU0FNUExFUzsgaSsrKSB7XG4gICAgICByYXRpb1swXSA9IHQwICsgaSAqIHN0ZXA7XG4gICAgICBmbihyYXRpbywgMCwgY29sb3IsIDApO1xuICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoY29sb3IsIDApO1xuICAgICAgdmFyIGNzc0NvbG9yID0gVXRpbC5tYWtlQ3NzUmdiKHJnYkNvbG9yWzBdLCByZ2JDb2xvclsxXSwgcmdiQ29sb3JbMl0pO1xuICAgICAgY29sb3JTdG9wcy5wdXNoKFtpIC8gTlVNQkVSX09GX1NBTVBMRVMsIGNzc0NvbG9yXSk7XG4gICAgfVxuXG4gICAgdmFyIGJhY2tncm91bmQgPSBcInRyYW5zcGFyZW50XCI7XG4gICAgaWYgKGRpY3QuaGFzKFwiQmFja2dyb3VuZFwiKSkge1xuICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoZGljdC5nZXQoXCJCYWNrZ3JvdW5kXCIpLCAwKTtcbiAgICAgIGJhY2tncm91bmQgPSBVdGlsLm1ha2VDc3NSZ2IocmdiQ29sb3JbMF0sIHJnYkNvbG9yWzFdLCByZ2JDb2xvclsyXSk7XG4gICAgfVxuXG4gICAgaWYgKCFleHRlbmRTdGFydCkge1xuICAgICAgLy8gSW5zZXJ0IGEgY29sb3Igc3RvcCBhdCB0aGUgZnJvbnQgYW5kIG9mZnNldCB0aGUgZmlyc3QgcmVhbCBjb2xvciBzdG9wXG4gICAgICAvLyBzbyBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggdGhlIG9uZSB3ZSBpbnNlcnQuXG4gICAgICBjb2xvclN0b3BzLnVuc2hpZnQoWzAsIGJhY2tncm91bmRdKTtcbiAgICAgIGNvbG9yU3RvcHNbMV1bMF0gKz0gU2hhZGluZ3MuU01BTExfTlVNQkVSO1xuICAgIH1cbiAgICBpZiAoIWV4dGVuZEVuZCkge1xuICAgICAgLy8gU2FtZSBpZGVhIGFzIGFib3ZlIGluIGV4dGVuZFN0YXJ0IGJ1dCBmb3IgdGhlIGVuZC5cbiAgICAgIGNvbG9yU3RvcHNbY29sb3JTdG9wcy5sZW5ndGggLSAxXVswXSAtPSBTaGFkaW5ncy5TTUFMTF9OVU1CRVI7XG4gICAgICBjb2xvclN0b3BzLnB1c2goWzEsIGJhY2tncm91bmRdKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbG9yU3RvcHMgPSBjb2xvclN0b3BzO1xuICB9XG5cbiAgUmFkaWFsQXhpYWwucHJvdG90eXBlID0ge1xuICAgIGdldElSOiBmdW5jdGlvbiBSYWRpYWxBeGlhbF9nZXRJUigpIHtcbiAgICAgIHZhciBjb29yZHNBcnIgPSB0aGlzLmNvb3Jkc0FycjtcbiAgICAgIHZhciBzaGFkaW5nVHlwZSA9IHRoaXMuc2hhZGluZ1R5cGU7XG4gICAgICB2YXIgdHlwZSwgcDAsIHAxLCByMCwgcjE7XG4gICAgICBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLkFYSUFMKSB7XG4gICAgICAgIHAwID0gW2Nvb3Jkc0FyclswXSwgY29vcmRzQXJyWzFdXTtcbiAgICAgICAgcDEgPSBbY29vcmRzQXJyWzJdLCBjb29yZHNBcnJbM11dO1xuICAgICAgICByMCA9IG51bGw7XG4gICAgICAgIHIxID0gbnVsbDtcbiAgICAgICAgdHlwZSA9IFwiYXhpYWxcIjtcbiAgICAgIH0gZWxzZSBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkge1xuICAgICAgICBwMCA9IFtjb29yZHNBcnJbMF0sIGNvb3Jkc0FyclsxXV07XG4gICAgICAgIHAxID0gW2Nvb3Jkc0FyclszXSwgY29vcmRzQXJyWzRdXTtcbiAgICAgICAgcjAgPSBjb29yZHNBcnJbMl07XG4gICAgICAgIHIxID0gY29vcmRzQXJyWzVdO1xuICAgICAgICB0eXBlID0gXCJyYWRpYWxcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVucmVhY2hhYmxlKGBnZXRQYXR0ZXJuIHR5cGUgdW5rbm93bjogJHtzaGFkaW5nVHlwZX1gKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xuICAgICAgaWYgKG1hdHJpeCkge1xuICAgICAgICBwMCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0ocDAsIG1hdHJpeCk7XG4gICAgICAgIHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShwMSwgbWF0cml4KTtcbiAgICAgICAgaWYgKHNoYWRpbmdUeXBlID09PSBTaGFkaW5nVHlwZS5SQURJQUwpIHtcbiAgICAgICAgICB2YXIgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG1hdHJpeCk7XG4gICAgICAgICAgcjAgKj0gc2NhbGVbMF07XG4gICAgICAgICAgcjEgKj0gc2NhbGVbMV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtcIlJhZGlhbEF4aWFsXCIsIHR5cGUsIHRoaXMuYmJveCwgdGhpcy5jb2xvclN0b3BzLCBwMCwgcDEsIHIwLCByMV07XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gUmFkaWFsQXhpYWw7XG59KSgpO1xuXG4vLyBBbGwgbWVzaCBzaGFkaW5nLiBGb3Igbm93LCB0aGV5IHdpbGwgYmUgcHJlc2VudGVkIGFzIHNldCBvZiB0aGUgdHJpYW5nbGVzXG4vLyB0byBiZSBkcmF3biBvbiB0aGUgY2FudmFzIGFuZCByZ2IgY29sb3IgZm9yIGVhY2ggdmVydGV4LlxuU2hhZGluZ3MuTWVzaCA9IChmdW5jdGlvbiBNZXNoQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcihzdHJlYW0sIGNvbnRleHQpIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuYnVmZmVyID0gMDtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7XG5cbiAgICB2YXIgbnVtQ29tcHMgPSBjb250ZXh0Lm51bUNvbXBzO1xuICAgIHRoaXMudG1wQ29tcHNCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUNvbXBzKTtcbiAgICB2YXIgY3NOdW1Db21wcyA9IGNvbnRleHQuY29sb3JTcGFjZS5udW1Db21wcztcbiAgICB0aGlzLnRtcENzQ29tcHNCdWYgPSBjb250ZXh0LmNvbG9yRm5cbiAgICAgID8gbmV3IEZsb2F0MzJBcnJheShjc051bUNvbXBzKVxuICAgICAgOiB0aGlzLnRtcENvbXBzQnVmO1xuICB9XG4gIE1lc2hTdHJlYW1SZWFkZXIucHJvdG90eXBlID0ge1xuICAgIGdldCBoYXNEYXRhKCkge1xuICAgICAgaWYgKHRoaXMuc3RyZWFtLmVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucG9zIDwgdGhpcy5zdHJlYW0uZW5kO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYnVmZmVyTGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgIGlmIChuZXh0Qnl0ZSA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5idWZmZXIgPSBuZXh0Qnl0ZTtcbiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gODtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgcmVhZEJpdHM6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZEJpdHMobikge1xuICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgaWYgKG4gPT09IDMyKSB7XG4gICAgICAgIGlmIChidWZmZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKCh0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgMjQpIHxcbiAgICAgICAgICAgICAgKHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAxNikgfFxuICAgICAgICAgICAgICAodGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDgpIHxcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKSA+Pj5cbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlciA9XG4gICAgICAgICAgKGJ1ZmZlciA8PCAyNCkgfFxuICAgICAgICAgICh0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgMTYpIHxcbiAgICAgICAgICAodGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDgpIHxcbiAgICAgICAgICB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXh0Qnl0ZSAmICgoMSA8PCBidWZmZXJMZW5ndGgpIC0gMSk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKChidWZmZXIgPDwgKDggLSBidWZmZXJMZW5ndGgpKSB8XG4gICAgICAgICAgICAoKG5leHRCeXRlICYgMHhmZikgPj4gYnVmZmVyTGVuZ3RoKSkgPj4+XG4gICAgICAgICAgMFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG4gPT09IDggJiYgYnVmZmVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoYnVmZmVyTGVuZ3RoIDwgbikge1xuICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDgpIHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICBidWZmZXJMZW5ndGggKz0gODtcbiAgICAgIH1cbiAgICAgIGJ1ZmZlckxlbmd0aCAtPSBuO1xuICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7XG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciAmICgoMSA8PCBidWZmZXJMZW5ndGgpIC0gMSk7XG4gICAgICByZXR1cm4gYnVmZmVyID4+IGJ1ZmZlckxlbmd0aDtcbiAgICB9LFxuICAgIGFsaWduOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX2FsaWduKCkge1xuICAgICAgdGhpcy5idWZmZXIgPSAwO1xuICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSAwO1xuICAgIH0sXG4gICAgcmVhZEZsYWc6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZEZsYWcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQml0cyh0aGlzLmNvbnRleHQuYml0c1BlckZsYWcpO1xuICAgIH0sXG4gICAgcmVhZENvb3JkaW5hdGU6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZENvb3JkaW5hdGUoKSB7XG4gICAgICB2YXIgYml0c1BlckNvb3JkaW5hdGUgPSB0aGlzLmNvbnRleHQuYml0c1BlckNvb3JkaW5hdGU7XG4gICAgICB2YXIgeGkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTtcbiAgICAgIHZhciB5aSA9IHRoaXMucmVhZEJpdHMoYml0c1BlckNvb3JkaW5hdGUpO1xuICAgICAgdmFyIGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7XG4gICAgICB2YXIgc2NhbGUgPVxuICAgICAgICBiaXRzUGVyQ29vcmRpbmF0ZSA8IDMyXG4gICAgICAgICAgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb29yZGluYXRlKSAtIDEpXG4gICAgICAgICAgOiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyIF4gLTMyXG4gICAgICByZXR1cm4gW1xuICAgICAgICB4aSAqIHNjYWxlICogKGRlY29kZVsxXSAtIGRlY29kZVswXSkgKyBkZWNvZGVbMF0sXG4gICAgICAgIHlpICogc2NhbGUgKiAoZGVjb2RlWzNdIC0gZGVjb2RlWzJdKSArIGRlY29kZVsyXSxcbiAgICAgIF07XG4gICAgfSxcbiAgICByZWFkQ29tcG9uZW50czogZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9yZWFkQ29tcG9uZW50cygpIHtcbiAgICAgIHZhciBudW1Db21wcyA9IHRoaXMuY29udGV4dC5udW1Db21wcztcbiAgICAgIHZhciBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5jb250ZXh0LmJpdHNQZXJDb21wb25lbnQ7XG4gICAgICB2YXIgc2NhbGUgPVxuICAgICAgICBiaXRzUGVyQ29tcG9uZW50IDwgMzJcbiAgICAgICAgICA/IDEgLyAoKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxKVxuICAgICAgICAgIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMiBeIC0zMlxuICAgICAgdmFyIGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7XG4gICAgICB2YXIgY29tcG9uZW50cyA9IHRoaXMudG1wQ29tcHNCdWY7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDQ7IGkgPCBudW1Db21wczsgaSsrLCBqICs9IDIpIHtcbiAgICAgICAgdmFyIGNpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29tcG9uZW50KTtcbiAgICAgICAgY29tcG9uZW50c1tpXSA9IGNpICogc2NhbGUgKiAoZGVjb2RlW2ogKyAxXSAtIGRlY29kZVtqXSkgKyBkZWNvZGVbal07XG4gICAgICB9XG4gICAgICB2YXIgY29sb3IgPSB0aGlzLnRtcENzQ29tcHNCdWY7XG4gICAgICBpZiAodGhpcy5jb250ZXh0LmNvbG9yRm4pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNvbG9yRm4oY29tcG9uZW50cywgMCwgY29sb3IsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb2xvclNwYWNlLmdldFJnYihjb2xvciwgMCk7XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBkZWNvZGVUeXBlNFNoYWRpbmcobWVzaCwgcmVhZGVyKSB7XG4gICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzO1xuICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9ycztcbiAgICB2YXIgb3BlcmF0b3JzID0gW107XG4gICAgdmFyIHBzID0gW107IC8vIG5vdCBtYWludGFpbmluZyBjcyBzaW5jZSB0aGF0IHdpbGwgbWF0Y2ggcHNcbiAgICB2YXIgdmVydGljZXNMZWZ0ID0gMDsgLy8gYXNzdW1pbmcgd2UgaGF2ZSBhbGwgZGF0YSB0byBzdGFydCBhIG5ldyB0cmlhbmdsZVxuICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkge1xuICAgICAgdmFyIGYgPSByZWFkZXIucmVhZEZsYWcoKTtcbiAgICAgIHZhciBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpO1xuICAgICAgdmFyIGNvbG9yID0gcmVhZGVyLnJlYWRDb21wb25lbnRzKCk7XG4gICAgICBpZiAodmVydGljZXNMZWZ0ID09PSAwKSB7XG4gICAgICAgIC8vIGlnbm9yaW5nIGZsYWdzIGlmIHdlIHN0YXJ0ZWQgYSB0cmlhbmdsZVxuICAgICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gdHlwZTQgZmxhZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGYpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcHMucHVzaChwc1twcy5sZW5ndGggLSAyXSwgcHNbcHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgdmVydGljZXNMZWZ0ID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHBzLnB1c2gocHNbcHMubGVuZ3RoIC0gM10sIHBzW3BzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBvcGVyYXRvcnMucHVzaChmKTtcbiAgICAgIH1cbiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7XG4gICAgICBjb29yZHMucHVzaChjb29yZCk7XG4gICAgICBjb2xvcnMucHVzaChjb2xvcik7XG4gICAgICB2ZXJ0aWNlc0xlZnQtLTtcblxuICAgICAgcmVhZGVyLmFsaWduKCk7XG4gICAgfVxuICAgIG1lc2guZmlndXJlcy5wdXNoKHtcbiAgICAgIHR5cGU6IFwidHJpYW5nbGVzXCIsXG4gICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSxcbiAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkocHMpLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlVHlwZTVTaGFkaW5nKG1lc2gsIHJlYWRlciwgdmVydGljZXNQZXJSb3cpIHtcbiAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHM7XG4gICAgdmFyIGNvbG9ycyA9IG1lc2guY29sb3JzO1xuICAgIHZhciBwcyA9IFtdOyAvLyBub3QgbWFpbnRhaW5pbmcgY3Mgc2luY2UgdGhhdCB3aWxsIG1hdGNoIHBzXG4gICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7XG4gICAgICB2YXIgY29vcmQgPSByZWFkZXIucmVhZENvb3JkaW5hdGUoKTtcbiAgICAgIHZhciBjb2xvciA9IHJlYWRlci5yZWFkQ29tcG9uZW50cygpO1xuICAgICAgcHMucHVzaChjb29yZHMubGVuZ3RoKTtcbiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICAgIGNvbG9ycy5wdXNoKGNvbG9yKTtcbiAgICB9XG4gICAgbWVzaC5maWd1cmVzLnB1c2goe1xuICAgICAgdHlwZTogXCJsYXR0aWNlXCIsXG4gICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSxcbiAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkocHMpLFxuICAgICAgdmVydGljZXNQZXJSb3csXG4gICAgfSk7XG4gIH1cblxuICB2YXIgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQgPSAzO1xuICB2YXIgTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQgPSAyMDtcblxuICB2YXIgVFJJQU5HTEVfREVOU0lUWSA9IDIwOyAvLyBjb3VudCBvZiB0cmlhbmdsZXMgcGVyIGVudGlyZSBtZXNoIGJvdW5kc1xuXG4gIHZhciBnZXRCID0gKGZ1bmN0aW9uIGdldEJDbG9zdXJlKCkge1xuICAgIGZ1bmN0aW9uIGJ1aWxkQihjb3VudCkge1xuICAgICAgdmFyIGx1dCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgICB2YXIgdCA9IGkgLyBjb3VudCxcbiAgICAgICAgICB0XyA9IDEgLSB0O1xuICAgICAgICBsdXQucHVzaChcbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICAgICAgIHRfICogdF8gKiB0XyxcbiAgICAgICAgICAgIDMgKiB0ICogdF8gKiB0XyxcbiAgICAgICAgICAgIDMgKiB0ICogdCAqIHRfLFxuICAgICAgICAgICAgdCAqIHQgKiB0LFxuICAgICAgICAgIF0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbHV0O1xuICAgIH1cbiAgICB2YXIgY2FjaGUgPSBbXTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICByZXR1cm4gZnVuY3Rpb24gZ2V0Qihjb3VudCkge1xuICAgICAgaWYgKCFjYWNoZVtjb3VudF0pIHtcbiAgICAgICAgY2FjaGVbY291bnRdID0gYnVpbGRCKGNvdW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWNoZVtjb3VudF07XG4gICAgfTtcbiAgfSkoKTtcblxuICBmdW5jdGlvbiBidWlsZEZpZ3VyZUZyb21QYXRjaChtZXNoLCBpbmRleCkge1xuICAgIHZhciBmaWd1cmUgPSBtZXNoLmZpZ3VyZXNbaW5kZXhdO1xuICAgIGFzc2VydChmaWd1cmUudHlwZSA9PT0gXCJwYXRjaFwiLCBcIlVuZXhwZWN0ZWQgcGF0Y2ggbWVzaCBmaWd1cmVcIik7XG5cbiAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHMsXG4gICAgICBjb2xvcnMgPSBtZXNoLmNvbG9ycztcbiAgICB2YXIgcGkgPSBmaWd1cmUuY29vcmRzO1xuICAgIHZhciBjaSA9IGZpZ3VyZS5jb2xvcnM7XG5cbiAgICB2YXIgZmlndXJlTWluWCA9IE1hdGgubWluKFxuICAgICAgY29vcmRzW3BpWzBdXVswXSxcbiAgICAgIGNvb3Jkc1twaVszXV1bMF0sXG4gICAgICBjb29yZHNbcGlbMTJdXVswXSxcbiAgICAgIGNvb3Jkc1twaVsxNV1dWzBdXG4gICAgKTtcbiAgICB2YXIgZmlndXJlTWluWSA9IE1hdGgubWluKFxuICAgICAgY29vcmRzW3BpWzBdXVsxXSxcbiAgICAgIGNvb3Jkc1twaVszXV1bMV0sXG4gICAgICBjb29yZHNbcGlbMTJdXVsxXSxcbiAgICAgIGNvb3Jkc1twaVsxNV1dWzFdXG4gICAgKTtcbiAgICB2YXIgZmlndXJlTWF4WCA9IE1hdGgubWF4KFxuICAgICAgY29vcmRzW3BpWzBdXVswXSxcbiAgICAgIGNvb3Jkc1twaVszXV1bMF0sXG4gICAgICBjb29yZHNbcGlbMTJdXVswXSxcbiAgICAgIGNvb3Jkc1twaVsxNV1dWzBdXG4gICAgKTtcbiAgICB2YXIgZmlndXJlTWF4WSA9IE1hdGgubWF4KFxuICAgICAgY29vcmRzW3BpWzBdXVsxXSxcbiAgICAgIGNvb3Jkc1twaVszXV1bMV0sXG4gICAgICBjb29yZHNbcGlbMTJdXVsxXSxcbiAgICAgIGNvb3Jkc1twaVsxNV1dWzFdXG4gICAgKTtcbiAgICB2YXIgc3BsaXRYQnkgPSBNYXRoLmNlaWwoXG4gICAgICAoKGZpZ3VyZU1heFggLSBmaWd1cmVNaW5YKSAqIFRSSUFOR0xFX0RFTlNJVFkpIC9cbiAgICAgICAgKG1lc2guYm91bmRzWzJdIC0gbWVzaC5ib3VuZHNbMF0pXG4gICAgKTtcbiAgICBzcGxpdFhCeSA9IE1hdGgubWF4KFxuICAgICAgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsXG4gICAgICBNYXRoLm1pbihNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgc3BsaXRYQnkpXG4gICAgKTtcbiAgICB2YXIgc3BsaXRZQnkgPSBNYXRoLmNlaWwoXG4gICAgICAoKGZpZ3VyZU1heFkgLSBmaWd1cmVNaW5ZKSAqIFRSSUFOR0xFX0RFTlNJVFkpIC9cbiAgICAgICAgKG1lc2guYm91bmRzWzNdIC0gbWVzaC5ib3VuZHNbMV0pXG4gICAgKTtcbiAgICBzcGxpdFlCeSA9IE1hdGgubWF4KFxuICAgICAgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsXG4gICAgICBNYXRoLm1pbihNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgc3BsaXRZQnkpXG4gICAgKTtcblxuICAgIHZhciB2ZXJ0aWNlc1BlclJvdyA9IHNwbGl0WEJ5ICsgMTtcbiAgICB2YXIgZmlndXJlQ29vcmRzID0gbmV3IEludDMyQXJyYXkoKHNwbGl0WUJ5ICsgMSkgKiB2ZXJ0aWNlc1BlclJvdyk7XG4gICAgdmFyIGZpZ3VyZUNvbG9ycyA9IG5ldyBJbnQzMkFycmF5KChzcGxpdFlCeSArIDEpICogdmVydGljZXNQZXJSb3cpO1xuICAgIHZhciBrID0gMDtcbiAgICB2YXIgY2wgPSBuZXcgVWludDhBcnJheSgzKSxcbiAgICAgIGNyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgdmFyIGMwID0gY29sb3JzW2NpWzBdXSxcbiAgICAgIGMxID0gY29sb3JzW2NpWzFdXSxcbiAgICAgIGMyID0gY29sb3JzW2NpWzJdXSxcbiAgICAgIGMzID0gY29sb3JzW2NpWzNdXTtcbiAgICB2YXIgYlJvdyA9IGdldEIoc3BsaXRZQnkpLFxuICAgICAgYkNvbCA9IGdldEIoc3BsaXRYQnkpO1xuICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8PSBzcGxpdFlCeTsgcm93KyspIHtcbiAgICAgIGNsWzBdID0gKChjMFswXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlswXSAqIHJvdykgLyBzcGxpdFlCeSkgfCAwO1xuICAgICAgY2xbMV0gPSAoKGMwWzFdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzFdICogcm93KSAvIHNwbGl0WUJ5KSB8IDA7XG4gICAgICBjbFsyXSA9ICgoYzBbMl0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMl0gKiByb3cpIC8gc3BsaXRZQnkpIHwgMDtcblxuICAgICAgY3JbMF0gPSAoKGMxWzBdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzBdICogcm93KSAvIHNwbGl0WUJ5KSB8IDA7XG4gICAgICBjclsxXSA9ICgoYzFbMV0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMV0gKiByb3cpIC8gc3BsaXRZQnkpIHwgMDtcbiAgICAgIGNyWzJdID0gKChjMVsyXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1syXSAqIHJvdykgLyBzcGxpdFlCeSkgfCAwO1xuXG4gICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPD0gc3BsaXRYQnk7IGNvbCsrLCBrKyspIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChyb3cgPT09IDAgfHwgcm93ID09PSBzcGxpdFlCeSkgJiZcbiAgICAgICAgICAoY29sID09PSAwIHx8IGNvbCA9PT0gc3BsaXRYQnkpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4ID0gMCxcbiAgICAgICAgICB5ID0gMDtcbiAgICAgICAgdmFyIHEgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSAzOyBpKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAzOyBqKyssIHErKykge1xuICAgICAgICAgICAgdmFyIG0gPSBiUm93W3Jvd11baV0gKiBiQ29sW2NvbF1bal07XG4gICAgICAgICAgICB4ICs9IGNvb3Jkc1twaVtxXV1bMF0gKiBtO1xuICAgICAgICAgICAgeSArPSBjb29yZHNbcGlbcV1dWzFdICogbTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlndXJlQ29vcmRzW2tdID0gY29vcmRzLmxlbmd0aDtcbiAgICAgICAgY29vcmRzLnB1c2goW3gsIHldKTtcbiAgICAgICAgZmlndXJlQ29sb3JzW2tdID0gY29sb3JzLmxlbmd0aDtcbiAgICAgICAgdmFyIG5ld0NvbG9yID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgICAgIG5ld0NvbG9yWzBdID0gKChjbFswXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclswXSAqIGNvbCkgLyBzcGxpdFhCeSkgfCAwO1xuICAgICAgICBuZXdDb2xvclsxXSA9ICgoY2xbMV0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMV0gKiBjb2wpIC8gc3BsaXRYQnkpIHwgMDtcbiAgICAgICAgbmV3Q29sb3JbMl0gPSAoKGNsWzJdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzJdICogY29sKSAvIHNwbGl0WEJ5KSB8IDA7XG4gICAgICAgIGNvbG9ycy5wdXNoKG5ld0NvbG9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmlndXJlQ29vcmRzWzBdID0gcGlbMF07XG4gICAgZmlndXJlQ29sb3JzWzBdID0gY2lbMF07XG4gICAgZmlndXJlQ29vcmRzW3NwbGl0WEJ5XSA9IHBpWzNdO1xuICAgIGZpZ3VyZUNvbG9yc1tzcGxpdFhCeV0gPSBjaVsxXTtcbiAgICBmaWd1cmVDb29yZHNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeV0gPSBwaVsxMl07XG4gICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gY2lbMl07XG4gICAgZmlndXJlQ29vcmRzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnkgKyBzcGxpdFhCeV0gPSBwaVsxNV07XG4gICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnkgKyBzcGxpdFhCeV0gPSBjaVszXTtcblxuICAgIG1lc2guZmlndXJlc1tpbmRleF0gPSB7XG4gICAgICB0eXBlOiBcImxhdHRpY2VcIixcbiAgICAgIGNvb3JkczogZmlndXJlQ29vcmRzLFxuICAgICAgY29sb3JzOiBmaWd1cmVDb2xvcnMsXG4gICAgICB2ZXJ0aWNlc1BlclJvdyxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlVHlwZTZTaGFkaW5nKG1lc2gsIHJlYWRlcikge1xuICAgIC8vIEEgc3BlY2lhbCBjYXNlIG9mIFR5cGUgNy4gVGhlIHAxMSwgcDEyLCBwMjEsIHAyMiBhdXRvbWF0aWNhbGx5IGZpbGxlZFxuICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkcztcbiAgICB2YXIgY29sb3JzID0gbWVzaC5jb2xvcnM7XG4gICAgdmFyIHBzID0gbmV3IEludDMyQXJyYXkoMTYpOyAvLyBwMDAsIHAxMCwgLi4uLCBwMzAsIHAwMSwgLi4uLCBwMzNcbiAgICB2YXIgY3MgPSBuZXcgSW50MzJBcnJheSg0KTsgLy8gYzAwLCBjMzAsIGMwMywgYzMzXG4gICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7XG4gICAgICB2YXIgZiA9IHJlYWRlci5yZWFkRmxhZygpO1xuICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiVW5rbm93biB0eXBlNiBmbGFnXCIpO1xuICAgICAgfVxuICAgICAgdmFyIGksIGlpO1xuICAgICAgdmFyIHBpID0gY29vcmRzLmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDggOiAxMjsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29vcmRzLnB1c2gocmVhZGVyLnJlYWRDb29yZGluYXRlKCkpO1xuICAgICAgfVxuICAgICAgdmFyIGNpID0gY29sb3JzLmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb2xvcnMucHVzaChyZWFkZXIucmVhZENvbXBvbmVudHMoKSk7XG4gICAgICB9XG4gICAgICB2YXIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDtcbiAgICAgIHN3aXRjaCAoZikge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHBzWzEyXSA9IHBpICsgMzsgcHNbMTNdID0gcGkgKyA0OyAgcHNbMTRdID0gcGkgKyA1OyAgcHNbMTVdID0gcGkgKyA2O1xuICAgICAgICAgIHBzWyA4XSA9IHBpICsgMjsgLyogdmFsdWVzIGZvciA1LCA2LCA5LCAxMCBhcmUgICAgKi8gcHNbMTFdID0gcGkgKyA3O1xuICAgICAgICAgIHBzWyA0XSA9IHBpICsgMTsgLyogY2FsY3VsYXRlZCBiZWxvdyAgICAgICAgICAgICAgKi8gcHNbIDddID0gcGkgKyA4O1xuICAgICAgICAgIHBzWyAwXSA9IHBpOyAgICAgcHNbIDFdID0gcGkgKyAxMTsgcHNbIDJdID0gcGkgKyAxMDsgcHNbIDNdID0gcGkgKyA5O1xuICAgICAgICAgIGNzWzJdID0gY2kgKyAxOyBjc1szXSA9IGNpICsgMjtcbiAgICAgICAgICBjc1swXSA9IGNpOyAgICAgY3NbMV0gPSBjaSArIDM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdG1wMSA9IHBzWzEyXTsgdG1wMiA9IHBzWzEzXTsgdG1wMyA9IHBzWzE0XTsgdG1wNCA9IHBzWzE1XTtcbiAgICAgICAgICBwc1sxMl0gPSB0bXA0OyBwc1sxM10gPSBwaSArIDA7ICBwc1sxNF0gPSBwaSArIDE7ICBwc1sxNV0gPSBwaSArIDI7XG4gICAgICAgICAgcHNbIDhdID0gdG1wMzsgLyogdmFsdWVzIGZvciA1LCA2LCA5LCAxMCBhcmUgICAgKi8gcHNbMTFdID0gcGkgKyAzO1xuICAgICAgICAgIHBzWyA0XSA9IHRtcDI7IC8qIGNhbGN1bGF0ZWQgYmVsb3cgICAgICAgICAgICAgICovIHBzWyA3XSA9IHBpICsgNDtcbiAgICAgICAgICBwc1sgMF0gPSB0bXAxOyBwc1sgMV0gPSBwaSArIDc7ICAgcHNbIDJdID0gcGkgKyA2OyBwc1sgM10gPSBwaSArIDU7XG4gICAgICAgICAgdG1wMSA9IGNzWzJdOyB0bXAyID0gY3NbM107XG4gICAgICAgICAgY3NbMl0gPSB0bXAyOyAgIGNzWzNdID0gY2k7XG4gICAgICAgICAgY3NbMF0gPSB0bXAxOyAgIGNzWzFdID0gY2kgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRtcDEgPSBwc1sxNV07XG4gICAgICAgICAgdG1wMiA9IHBzWzExXTtcbiAgICAgICAgICBwc1sxMl0gPSBwc1szXTsgIHBzWzEzXSA9IHBpICsgMDsgcHNbMTRdID0gcGkgKyAxOyAgIHBzWzE1XSA9IHBpICsgMjtcbiAgICAgICAgICBwc1sgOF0gPSBwc1s3XTsgIC8qIHZhbHVlcyBmb3IgNSwgNiwgOSwgMTAgYXJlICAgICovIHBzWzExXSA9IHBpICsgMztcbiAgICAgICAgICBwc1sgNF0gPSB0bXAyOyAgIC8qIGNhbGN1bGF0ZWQgYmVsb3cgICAgICAgICAgICAgICovIHBzWyA3XSA9IHBpICsgNDtcbiAgICAgICAgICBwc1sgMF0gPSB0bXAxOyAgcHNbIDFdID0gcGkgKyA3OyAgIHBzWyAyXSA9IHBpICsgNjsgIHBzWyAzXSA9IHBpICsgNTtcbiAgICAgICAgICB0bXAxID0gY3NbM107XG4gICAgICAgICAgY3NbMl0gPSBjc1sxXTsgY3NbM10gPSBjaTtcbiAgICAgICAgICBjc1swXSA9IHRtcDE7ICBjc1sxXSA9IGNpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBwc1sxMl0gPSBwc1swXTsgIHBzWzEzXSA9IHBpICsgMDsgICBwc1sxNF0gPSBwaSArIDE7IHBzWzE1XSA9IHBpICsgMjtcbiAgICAgICAgICBwc1sgOF0gPSBwc1sxXTsgIC8qIHZhbHVlcyBmb3IgNSwgNiwgOSwgMTAgYXJlICAgICovIHBzWzExXSA9IHBpICsgMztcbiAgICAgICAgICBwc1sgNF0gPSBwc1syXTsgIC8qIGNhbGN1bGF0ZWQgYmVsb3cgICAgICAgICAgICAgICovIHBzWyA3XSA9IHBpICsgNDtcbiAgICAgICAgICBwc1sgMF0gPSBwc1szXTsgIHBzWyAxXSA9IHBpICsgNzsgICBwc1sgMl0gPSBwaSArIDY7IHBzWyAzXSA9IHBpICsgNTtcbiAgICAgICAgICBjc1syXSA9IGNzWzBdOyBjc1szXSA9IGNpO1xuICAgICAgICAgIGNzWzBdID0gY3NbMV07IGNzWzFdID0gY2kgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gc2V0IHAxMSwgcDEyLCBwMjEsIHAyMlxuICAgICAgcHNbNV0gPSBjb29yZHMubGVuZ3RoO1xuICAgICAgY29vcmRzLnB1c2goW1xuICAgICAgICAoLTQgKiBjb29yZHNbcHNbMF1dWzBdIC1cbiAgICAgICAgICBjb29yZHNbcHNbMTVdXVswXSArXG4gICAgICAgICAgNiAqIChjb29yZHNbcHNbNF1dWzBdICsgY29vcmRzW3BzWzFdXVswXSkgLVxuICAgICAgICAgIDIgKiAoY29vcmRzW3BzWzEyXV1bMF0gKyBjb29yZHNbcHNbM11dWzBdKSArXG4gICAgICAgICAgMyAqIChjb29yZHNbcHNbMTNdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pKSAvXG4gICAgICAgICAgOSxcbiAgICAgICAgKC00ICogY29vcmRzW3BzWzBdXVsxXSAtXG4gICAgICAgICAgY29vcmRzW3BzWzE1XV1bMV0gK1xuICAgICAgICAgIDYgKiAoY29vcmRzW3BzWzRdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pIC1cbiAgICAgICAgICAyICogKGNvb3Jkc1twc1sxMl1dWzFdICsgY29vcmRzW3BzWzNdXVsxXSkgK1xuICAgICAgICAgIDMgKiAoY29vcmRzW3BzWzEzXV1bMV0gKyBjb29yZHNbcHNbN11dWzFdKSkgL1xuICAgICAgICAgIDksXG4gICAgICBdKTtcbiAgICAgIHBzWzZdID0gY29vcmRzLmxlbmd0aDtcbiAgICAgIGNvb3Jkcy5wdXNoKFtcbiAgICAgICAgKC00ICogY29vcmRzW3BzWzNdXVswXSAtXG4gICAgICAgICAgY29vcmRzW3BzWzEyXV1bMF0gK1xuICAgICAgICAgIDYgKiAoY29vcmRzW3BzWzJdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pIC1cbiAgICAgICAgICAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgK1xuICAgICAgICAgIDMgKiAoY29vcmRzW3BzWzRdXVswXSArIGNvb3Jkc1twc1sxNF1dWzBdKSkgL1xuICAgICAgICAgIDksXG4gICAgICAgICgtNCAqIGNvb3Jkc1twc1szXV1bMV0gLVxuICAgICAgICAgIGNvb3Jkc1twc1sxMl1dWzFdICtcbiAgICAgICAgICA2ICogKGNvb3Jkc1twc1syXV1bMV0gKyBjb29yZHNbcHNbN11dWzFdKSAtXG4gICAgICAgICAgMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICtcbiAgICAgICAgICAzICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkpIC9cbiAgICAgICAgICA5LFxuICAgICAgXSk7XG4gICAgICBwc1s5XSA9IGNvb3Jkcy5sZW5ndGg7XG4gICAgICBjb29yZHMucHVzaChbXG4gICAgICAgICgtNCAqIGNvb3Jkc1twc1sxMl1dWzBdIC1cbiAgICAgICAgICBjb29yZHNbcHNbM11dWzBdICtcbiAgICAgICAgICA2ICogKGNvb3Jkc1twc1s4XV1bMF0gKyBjb29yZHNbcHNbMTNdXVswXSkgLVxuICAgICAgICAgIDIgKiAoY29vcmRzW3BzWzBdXVswXSArIGNvb3Jkc1twc1sxNV1dWzBdKSArXG4gICAgICAgICAgMyAqIChjb29yZHNbcHNbMTFdXVswXSArIGNvb3Jkc1twc1sxXV1bMF0pKSAvXG4gICAgICAgICAgOSxcbiAgICAgICAgKC00ICogY29vcmRzW3BzWzEyXV1bMV0gLVxuICAgICAgICAgIGNvb3Jkc1twc1szXV1bMV0gK1xuICAgICAgICAgIDYgKiAoY29vcmRzW3BzWzhdXVsxXSArIGNvb3Jkc1twc1sxM11dWzFdKSAtXG4gICAgICAgICAgMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICtcbiAgICAgICAgICAzICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzFdXVsxXSkpIC9cbiAgICAgICAgICA5LFxuICAgICAgXSk7XG4gICAgICBwc1sxMF0gPSBjb29yZHMubGVuZ3RoO1xuICAgICAgY29vcmRzLnB1c2goW1xuICAgICAgICAoLTQgKiBjb29yZHNbcHNbMTVdXVswXSAtXG4gICAgICAgICAgY29vcmRzW3BzWzBdXVswXSArXG4gICAgICAgICAgNiAqIChjb29yZHNbcHNbMTFdXVswXSArIGNvb3Jkc1twc1sxNF1dWzBdKSAtXG4gICAgICAgICAgMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICtcbiAgICAgICAgICAzICogKGNvb3Jkc1twc1syXV1bMF0gKyBjb29yZHNbcHNbOF1dWzBdKSkgL1xuICAgICAgICAgIDksXG4gICAgICAgICgtNCAqIGNvb3Jkc1twc1sxNV1dWzFdIC1cbiAgICAgICAgICBjb29yZHNbcHNbMF1dWzFdICtcbiAgICAgICAgICA2ICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzE0XV1bMV0pIC1cbiAgICAgICAgICAyICogKGNvb3Jkc1twc1sxMl1dWzFdICsgY29vcmRzW3BzWzNdXVsxXSkgK1xuICAgICAgICAgIDMgKiAoY29vcmRzW3BzWzJdXVsxXSArIGNvb3Jkc1twc1s4XV1bMV0pKSAvXG4gICAgICAgICAgOSxcbiAgICAgIF0pO1xuICAgICAgbWVzaC5maWd1cmVzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInBhdGNoXCIsXG4gICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLCAvLyBtYWtpbmcgY29waWVzIG9mIHBzIGFuZCBjc1xuICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZVR5cGU3U2hhZGluZyhtZXNoLCByZWFkZXIpIHtcbiAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHM7XG4gICAgdmFyIGNvbG9ycyA9IG1lc2guY29sb3JzO1xuICAgIHZhciBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsgLy8gcDAwLCBwMTAsIC4uLiwgcDMwLCBwMDEsIC4uLiwgcDMzXG4gICAgdmFyIGNzID0gbmV3IEludDMyQXJyYXkoNCk7IC8vIGMwMCwgYzMwLCBjMDMsIGMzM1xuICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkge1xuICAgICAgdmFyIGYgPSByZWFkZXIucmVhZEZsYWcoKTtcbiAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gdHlwZTcgZmxhZ1wiKTtcbiAgICAgIH1cbiAgICAgIHZhciBpLCBpaTtcbiAgICAgIHZhciBwaSA9IGNvb3Jkcy5sZW5ndGg7XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IGYgIT09IDAgPyAxMiA6IDE2OyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgY2kgPSBjb2xvcnMubGVuZ3RoO1xuICAgICAgZm9yIChpID0gMCwgaWkgPSBmICE9PSAwID8gMiA6IDQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTtcbiAgICAgIH1cbiAgICAgIHZhciB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0O1xuICAgICAgc3dpdGNoIChmKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcHNbMTJdID0gcGkgKyAzOyBwc1sxM10gPSBwaSArIDQ7ICBwc1sxNF0gPSBwaSArIDU7ICBwc1sxNV0gPSBwaSArIDY7XG4gICAgICAgICAgcHNbIDhdID0gcGkgKyAyOyBwc1sgOV0gPSBwaSArIDEzOyBwc1sxMF0gPSBwaSArIDE0OyBwc1sxMV0gPSBwaSArIDc7XG4gICAgICAgICAgcHNbIDRdID0gcGkgKyAxOyBwc1sgNV0gPSBwaSArIDEyOyBwc1sgNl0gPSBwaSArIDE1OyBwc1sgN10gPSBwaSArIDg7XG4gICAgICAgICAgcHNbIDBdID0gcGk7ICAgICBwc1sgMV0gPSBwaSArIDExOyBwc1sgMl0gPSBwaSArIDEwOyBwc1sgM10gPSBwaSArIDk7XG4gICAgICAgICAgY3NbMl0gPSBjaSArIDE7IGNzWzNdID0gY2kgKyAyO1xuICAgICAgICAgIGNzWzBdID0gY2k7ICAgICBjc1sxXSA9IGNpICsgMztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0bXAxID0gcHNbMTJdOyB0bXAyID0gcHNbMTNdOyB0bXAzID0gcHNbMTRdOyB0bXA0ID0gcHNbMTVdO1xuICAgICAgICAgIHBzWzEyXSA9IHRtcDQ7ICAgcHNbMTNdID0gcGkgKyAwOyAgcHNbMTRdID0gcGkgKyAxOyAgcHNbMTVdID0gcGkgKyAyO1xuICAgICAgICAgIHBzWyA4XSA9IHRtcDM7ICAgcHNbIDldID0gcGkgKyA5OyAgcHNbMTBdID0gcGkgKyAxMDsgcHNbMTFdID0gcGkgKyAzO1xuICAgICAgICAgIHBzWyA0XSA9IHRtcDI7ICAgcHNbIDVdID0gcGkgKyA4OyAgcHNbIDZdID0gcGkgKyAxMTsgcHNbIDddID0gcGkgKyA0O1xuICAgICAgICAgIHBzWyAwXSA9IHRtcDE7ICAgcHNbIDFdID0gcGkgKyA3OyAgcHNbIDJdID0gcGkgKyA2OyAgcHNbIDNdID0gcGkgKyA1O1xuICAgICAgICAgIHRtcDEgPSBjc1syXTsgdG1wMiA9IGNzWzNdO1xuICAgICAgICAgIGNzWzJdID0gdG1wMjsgICBjc1szXSA9IGNpO1xuICAgICAgICAgIGNzWzBdID0gdG1wMTsgICBjc1sxXSA9IGNpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0bXAxID0gcHNbMTVdO1xuICAgICAgICAgIHRtcDIgPSBwc1sxMV07XG4gICAgICAgICAgcHNbMTJdID0gcHNbM107IHBzWzEzXSA9IHBpICsgMDsgcHNbMTRdID0gcGkgKyAxOyAgcHNbMTVdID0gcGkgKyAyO1xuICAgICAgICAgIHBzWyA4XSA9IHBzWzddOyBwc1sgOV0gPSBwaSArIDk7IHBzWzEwXSA9IHBpICsgMTA7IHBzWzExXSA9IHBpICsgMztcbiAgICAgICAgICBwc1sgNF0gPSB0bXAyOyAgcHNbIDVdID0gcGkgKyA4OyBwc1sgNl0gPSBwaSArIDExOyBwc1sgN10gPSBwaSArIDQ7XG4gICAgICAgICAgcHNbIDBdID0gdG1wMTsgIHBzWyAxXSA9IHBpICsgNzsgcHNbIDJdID0gcGkgKyA2OyAgcHNbIDNdID0gcGkgKyA1O1xuICAgICAgICAgIHRtcDEgPSBjc1szXTtcbiAgICAgICAgICBjc1syXSA9IGNzWzFdOyBjc1szXSA9IGNpO1xuICAgICAgICAgIGNzWzBdID0gdG1wMTsgIGNzWzFdID0gY2kgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHBzWzEyXSA9IHBzWzBdOyAgcHNbMTNdID0gcGkgKyAwOyAgcHNbMTRdID0gcGkgKyAxOyAgcHNbMTVdID0gcGkgKyAyO1xuICAgICAgICAgIHBzWyA4XSA9IHBzWzFdOyAgcHNbIDldID0gcGkgKyA5OyAgcHNbMTBdID0gcGkgKyAxMDsgcHNbMTFdID0gcGkgKyAzO1xuICAgICAgICAgIHBzWyA0XSA9IHBzWzJdOyAgcHNbIDVdID0gcGkgKyA4OyAgcHNbIDZdID0gcGkgKyAxMTsgcHNbIDddID0gcGkgKyA0O1xuICAgICAgICAgIHBzWyAwXSA9IHBzWzNdOyAgcHNbIDFdID0gcGkgKyA3OyAgcHNbIDJdID0gcGkgKyA2OyAgcHNbIDNdID0gcGkgKyA1O1xuICAgICAgICAgIGNzWzJdID0gY3NbMF07IGNzWzNdID0gY2k7XG4gICAgICAgICAgY3NbMF0gPSBjc1sxXTsgY3NbMV0gPSBjaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBtZXNoLmZpZ3VyZXMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgY29vcmRzOiBuZXcgSW50MzJBcnJheShwcyksIC8vIG1ha2luZyBjb3BpZXMgb2YgcHMgYW5kIGNzXG4gICAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkoY3MpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQm91bmRzKG1lc2gpIHtcbiAgICB2YXIgbWluWCA9IG1lc2guY29vcmRzWzBdWzBdLFxuICAgICAgbWluWSA9IG1lc2guY29vcmRzWzBdWzFdLFxuICAgICAgbWF4WCA9IG1pblgsXG4gICAgICBtYXhZID0gbWluWTtcbiAgICBmb3IgKHZhciBpID0gMSwgaWkgPSBtZXNoLmNvb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgeCA9IG1lc2guY29vcmRzW2ldWzBdLFxuICAgICAgICB5ID0gbWVzaC5jb29yZHNbaV1bMV07XG4gICAgICBtaW5YID0gbWluWCA+IHggPyB4IDogbWluWDtcbiAgICAgIG1pblkgPSBtaW5ZID4geSA/IHkgOiBtaW5ZO1xuICAgICAgbWF4WCA9IG1heFggPCB4ID8geCA6IG1heFg7XG4gICAgICBtYXhZID0gbWF4WSA8IHkgPyB5IDogbWF4WTtcbiAgICB9XG4gICAgbWVzaC5ib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gIH1cblxuICBmdW5jdGlvbiBwYWNrRGF0YShtZXNoKSB7XG4gICAgdmFyIGksIGlpLCBqLCBqajtcblxuICAgIHZhciBjb29yZHMgPSBtZXNoLmNvb3JkcztcbiAgICB2YXIgY29vcmRzUGFja2VkID0gbmV3IEZsb2F0MzJBcnJheShjb29yZHMubGVuZ3RoICogMik7XG4gICAgZm9yIChpID0gMCwgaiA9IDAsIGlpID0gY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciB4eSA9IGNvb3Jkc1tpXTtcbiAgICAgIGNvb3Jkc1BhY2tlZFtqKytdID0geHlbMF07XG4gICAgICBjb29yZHNQYWNrZWRbaisrXSA9IHh5WzFdO1xuICAgIH1cbiAgICBtZXNoLmNvb3JkcyA9IGNvb3Jkc1BhY2tlZDtcblxuICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9ycztcbiAgICB2YXIgY29sb3JzUGFja2VkID0gbmV3IFVpbnQ4QXJyYXkoY29sb3JzLmxlbmd0aCAqIDMpO1xuICAgIGZvciAoaSA9IDAsIGogPSAwLCBpaSA9IGNvbG9ycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgYyA9IGNvbG9yc1tpXTtcbiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1swXTtcbiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1sxXTtcbiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1syXTtcbiAgICB9XG4gICAgbWVzaC5jb2xvcnMgPSBjb2xvcnNQYWNrZWQ7XG5cbiAgICB2YXIgZmlndXJlcyA9IG1lc2guZmlndXJlcztcbiAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIGZpZ3VyZSA9IGZpZ3VyZXNbaV0sXG4gICAgICAgIHBzID0gZmlndXJlLmNvb3JkcyxcbiAgICAgICAgY3MgPSBmaWd1cmUuY29sb3JzO1xuICAgICAgZm9yIChqID0gMCwgamogPSBwcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHBzW2pdICo9IDI7XG4gICAgICAgIGNzW2pdICo9IDM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gTWVzaChcbiAgICBzdHJlYW0sXG4gICAgbWF0cml4LFxuICAgIHhyZWYsXG4gICAgcmVzb3VyY2VzLFxuICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZVxuICApIHtcbiAgICBpZiAoIWlzU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk1lc2ggZGF0YSBpcyBub3QgYSBzdHJlYW1cIik7XG4gICAgfVxuICAgIHZhciBkaWN0ID0gc3RyZWFtLmRpY3Q7XG4gICAgdGhpcy5tYXRyaXggPSBtYXRyaXg7XG4gICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KFwiU2hhZGluZ1R5cGVcIik7XG4gICAgdGhpcy50eXBlID0gXCJQYXR0ZXJuXCI7XG4gICAgY29uc3QgYmJveCA9IGRpY3QuZ2V0QXJyYXkoXCJCQm94XCIpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7XG4gICAgICB0aGlzLmJib3ggPSBVdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmJveCA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNzID0gQ29sb3JTcGFjZS5wYXJzZSh7XG4gICAgICBjczogZGljdC5nZXRSYXcoXCJDb2xvclNwYWNlXCIpIHx8IGRpY3QuZ2V0UmF3KFwiQ1NcIiksXG4gICAgICB4cmVmLFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gICAgfSk7XG4gICAgdGhpcy5jcyA9IGNzO1xuICAgIHRoaXMuYmFja2dyb3VuZCA9IGRpY3QuaGFzKFwiQmFja2dyb3VuZFwiKVxuICAgICAgPyBjcy5nZXRSZ2IoZGljdC5nZXQoXCJCYWNrZ3JvdW5kXCIpLCAwKVxuICAgICAgOiBudWxsO1xuXG4gICAgdmFyIGZuT2JqID0gZGljdC5nZXRSYXcoXCJGdW5jdGlvblwiKTtcbiAgICB2YXIgZm4gPSBmbk9iaiA/IHBkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGVGcm9tQXJyYXkoZm5PYmopIDogbnVsbDtcblxuICAgIHRoaXMuY29vcmRzID0gW107XG4gICAgdGhpcy5jb2xvcnMgPSBbXTtcbiAgICB0aGlzLmZpZ3VyZXMgPSBbXTtcblxuICAgIHZhciBkZWNvZGVDb250ZXh0ID0ge1xuICAgICAgYml0c1BlckNvb3JkaW5hdGU6IGRpY3QuZ2V0KFwiQml0c1BlckNvb3JkaW5hdGVcIiksXG4gICAgICBiaXRzUGVyQ29tcG9uZW50OiBkaWN0LmdldChcIkJpdHNQZXJDb21wb25lbnRcIiksXG4gICAgICBiaXRzUGVyRmxhZzogZGljdC5nZXQoXCJCaXRzUGVyRmxhZ1wiKSxcbiAgICAgIGRlY29kZTogZGljdC5nZXRBcnJheShcIkRlY29kZVwiKSxcbiAgICAgIGNvbG9yRm46IGZuLFxuICAgICAgY29sb3JTcGFjZTogY3MsXG4gICAgICBudW1Db21wczogZm4gPyAxIDogY3MubnVtQ29tcHMsXG4gICAgfTtcbiAgICB2YXIgcmVhZGVyID0gbmV3IE1lc2hTdHJlYW1SZWFkZXIoc3RyZWFtLCBkZWNvZGVDb250ZXh0KTtcblxuICAgIHZhciBwYXRjaE1lc2ggPSBmYWxzZTtcbiAgICBzd2l0Y2ggKHRoaXMuc2hhZGluZ1R5cGUpIHtcbiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6XG4gICAgICAgIGRlY29kZVR5cGU0U2hhZGluZyh0aGlzLCByZWFkZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6XG4gICAgICAgIHZhciB2ZXJ0aWNlc1BlclJvdyA9IGRpY3QuZ2V0KFwiVmVydGljZXNQZXJSb3dcIikgfCAwO1xuICAgICAgICBpZiAodmVydGljZXNQZXJSb3cgPCAyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW52YWxpZCBWZXJ0aWNlc1BlclJvd1wiKTtcbiAgICAgICAgfVxuICAgICAgICBkZWNvZGVUeXBlNVNoYWRpbmcodGhpcywgcmVhZGVyLCB2ZXJ0aWNlc1BlclJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTaGFkaW5nVHlwZS5DT09OU19QQVRDSF9NRVNIOlxuICAgICAgICBkZWNvZGVUeXBlNlNoYWRpbmcodGhpcywgcmVhZGVyKTtcbiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNoYWRpbmdUeXBlLlRFTlNPUl9QQVRDSF9NRVNIOlxuICAgICAgICBkZWNvZGVUeXBlN1NoYWRpbmcodGhpcywgcmVhZGVyKTtcbiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB1bnJlYWNoYWJsZShcIlVuc3VwcG9ydGVkIG1lc2ggdHlwZS5cIik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwYXRjaE1lc2gpIHtcbiAgICAgIC8vIGRpcnR5IGJvdW5kcyBjYWxjdWxhdGlvbiBmb3IgZGV0ZXJtaW5pbmcsIGhvdyBkZW5zZSBzaGFsbCBiZSB0cmlhbmdsZXNcbiAgICAgIHVwZGF0ZUJvdW5kcyh0aGlzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGJ1aWxkRmlndXJlRnJvbVBhdGNoKHRoaXMsIGkpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgYm91bmRzXG4gICAgdXBkYXRlQm91bmRzKHRoaXMpO1xuXG4gICAgcGFja0RhdGEodGhpcyk7XG4gIH1cblxuICBNZXNoLnByb3RvdHlwZSA9IHtcbiAgICBnZXRJUjogZnVuY3Rpb24gTWVzaF9nZXRJUigpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiTWVzaFwiLFxuICAgICAgICB0aGlzLnNoYWRpbmdUeXBlLFxuICAgICAgICB0aGlzLmNvb3JkcyxcbiAgICAgICAgdGhpcy5jb2xvcnMsXG4gICAgICAgIHRoaXMuZmlndXJlcyxcbiAgICAgICAgdGhpcy5ib3VuZHMsXG4gICAgICAgIHRoaXMubWF0cml4LFxuICAgICAgICB0aGlzLmJib3gsXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCxcbiAgICAgIF07XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gTWVzaDtcbn0pKCk7XG5cblNoYWRpbmdzLkR1bW15ID0gKGZ1bmN0aW9uIER1bW15Q2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gRHVtbXkoKSB7XG4gICAgdGhpcy50eXBlID0gXCJQYXR0ZXJuXCI7XG4gIH1cblxuICBEdW1teS5wcm90b3R5cGUgPSB7XG4gICAgZ2V0SVI6IGZ1bmN0aW9uIER1bW15X2dldElSKCkge1xuICAgICAgcmV0dXJuIFtcIkR1bW15XCJdO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBEdW1teTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGdldFRpbGluZ1BhdHRlcm5JUihvcGVyYXRvckxpc3QsIGRpY3QsIGFyZ3MpIHtcbiAgY29uc3QgbWF0cml4ID0gZGljdC5nZXRBcnJheShcIk1hdHJpeFwiKTtcbiAgY29uc3QgYmJveCA9IFV0aWwubm9ybWFsaXplUmVjdChkaWN0LmdldEFycmF5KFwiQkJveFwiKSk7XG4gIGNvbnN0IHhzdGVwID0gZGljdC5nZXQoXCJYU3RlcFwiKTtcbiAgY29uc3QgeXN0ZXAgPSBkaWN0LmdldChcIllTdGVwXCIpO1xuICBjb25zdCBwYWludFR5cGUgPSBkaWN0LmdldChcIlBhaW50VHlwZVwiKTtcbiAgY29uc3QgdGlsaW5nVHlwZSA9IGRpY3QuZ2V0KFwiVGlsaW5nVHlwZVwiKTtcblxuICAvLyBFbnN1cmUgdGhhdCB0aGUgcGF0dGVybiBoYXMgYSBub24temVybyB3aWR0aCBhbmQgaGVpZ2h0LCB0byBwcmV2ZW50IGVycm9yc1xuICAvLyBpbiBgcGF0dGVybl9oZWxwZXIuanNgIChmaXhlcyBpc3N1ZTgzMzAucGRmKS5cbiAgaWYgKGJib3hbMl0gLSBiYm94WzBdID09PSAwIHx8IGJib3hbM10gLSBiYm94WzFdID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvQkJveCBhcnJheTogWyR7YmJveH1dLmApO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBcIlRpbGluZ1BhdHRlcm5cIixcbiAgICBhcmdzLFxuICAgIG9wZXJhdG9yTGlzdCxcbiAgICBtYXRyaXgsXG4gICAgYmJveCxcbiAgICB4c3RlcCxcbiAgICB5c3RlcCxcbiAgICBwYWludFR5cGUsXG4gICAgdGlsaW5nVHlwZSxcbiAgXTtcbn1cblxuZXhwb3J0IHsgUGF0dGVybiwgZ2V0VGlsaW5nUGF0dGVybklSIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRGljdCwgaXNEaWN0LCBpc1N0cmVhbSwgUmVmIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHtcbiAgRm9ybWF0RXJyb3IsXG4gIGluZm8sXG4gIGlzQm9vbCxcbiAgSXNFdmFsU3VwcG9ydGVkQ2FjaGVkLFxuICB1bnJlYWNoYWJsZSxcbn0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBQb3N0U2NyaXB0TGV4ZXIsIFBvc3RTY3JpcHRQYXJzZXIgfSBmcm9tIFwiLi9wc19wYXJzZXIuanNcIjtcbmltcG9ydCB7IExvY2FsRnVuY3Rpb25DYWNoZSB9IGZyb20gXCIuL2ltYWdlX3V0aWxzLmpzXCI7XG5cbmNsYXNzIFBERkZ1bmN0aW9uRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkID0gdHJ1ZSB9KSB7XG4gICAgdGhpcy54cmVmID0geHJlZjtcbiAgICB0aGlzLmlzRXZhbFN1cHBvcnRlZCA9IGlzRXZhbFN1cHBvcnRlZCAhPT0gZmFsc2U7XG4gICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlID0gbnVsbDsgLy8gSW5pdGlhbGl6ZWQgbGF6aWx5LlxuICB9XG5cbiAgY3JlYXRlKGZuKSB7XG4gICAgY29uc3QgY2FjaGVkRnVuY3Rpb24gPSB0aGlzLmdldENhY2hlZChmbik7XG4gICAgaWYgKGNhY2hlZEZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gY2FjaGVkRnVuY3Rpb247XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZEZ1bmN0aW9uID0gUERGRnVuY3Rpb24ucGFyc2Uoe1xuICAgICAgeHJlZjogdGhpcy54cmVmLFxuICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLmlzRXZhbFN1cHBvcnRlZCxcbiAgICAgIGZuOiBmbiBpbnN0YW5jZW9mIFJlZiA/IHRoaXMueHJlZi5mZXRjaChmbikgOiBmbixcbiAgICB9KTtcblxuICAgIC8vIEF0dGVtcHQgdG8gY2FjaGUgdGhlIHBhcnNlZCBGdW5jdGlvbiwgYnkgcmVmZXJlbmNlLlxuICAgIHRoaXMuX2NhY2hlKGZuLCBwYXJzZWRGdW5jdGlvbik7XG5cbiAgICByZXR1cm4gcGFyc2VkRnVuY3Rpb247XG4gIH1cblxuICBjcmVhdGVGcm9tQXJyYXkoZm5PYmopIHtcbiAgICBjb25zdCBjYWNoZWRGdW5jdGlvbiA9IHRoaXMuZ2V0Q2FjaGVkKGZuT2JqKTtcbiAgICBpZiAoY2FjaGVkRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiBjYWNoZWRGdW5jdGlvbjtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkRnVuY3Rpb24gPSBQREZGdW5jdGlvbi5wYXJzZUFycmF5KHtcbiAgICAgIHhyZWY6IHRoaXMueHJlZixcbiAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5pc0V2YWxTdXBwb3J0ZWQsXG4gICAgICBmbk9iajogZm5PYmogaW5zdGFuY2VvZiBSZWYgPyB0aGlzLnhyZWYuZmV0Y2goZm5PYmopIDogZm5PYmosXG4gICAgfSk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGNhY2hlIHRoZSBwYXJzZWQgRnVuY3Rpb24sIGJ5IHJlZmVyZW5jZS5cbiAgICB0aGlzLl9jYWNoZShmbk9iaiwgcGFyc2VkRnVuY3Rpb24pO1xuXG4gICAgcmV0dXJuIHBhcnNlZEZ1bmN0aW9uO1xuICB9XG5cbiAgZ2V0Q2FjaGVkKGNhY2hlS2V5KSB7XG4gICAgbGV0IGZuUmVmO1xuICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgZm5SZWYgPSBjYWNoZUtleTtcbiAgICB9IGVsc2UgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgRGljdCkge1xuICAgICAgZm5SZWYgPSBjYWNoZUtleS5vYmpJZDtcbiAgICB9IGVsc2UgaWYgKGlzU3RyZWFtKGNhY2hlS2V5KSkge1xuICAgICAgZm5SZWYgPSBjYWNoZUtleS5kaWN0ICYmIGNhY2hlS2V5LmRpY3Qub2JqSWQ7XG4gICAgfVxuICAgIGlmIChmblJlZikge1xuICAgICAgaWYgKCF0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlID0gbmV3IExvY2FsRnVuY3Rpb25DYWNoZSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgbG9jYWxGdW5jdGlvbiA9IHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5nZXRCeVJlZihmblJlZik7XG4gICAgICBpZiAobG9jYWxGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gbG9jYWxGdW5jdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jYWNoZShjYWNoZUtleSwgcGFyc2VkRnVuY3Rpb24pIHtcbiAgICBpZiAoIXBhcnNlZEZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdQREZGdW5jdGlvbkZhY3RvcnkuX2NhY2hlIC0gZXhwZWN0ZWQgXCJwYXJzZWRGdW5jdGlvblwiIGFyZ3VtZW50LidcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBmblJlZjtcbiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgIGZuUmVmID0gY2FjaGVLZXk7XG4gICAgfSBlbHNlIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIERpY3QpIHtcbiAgICAgIGZuUmVmID0gY2FjaGVLZXkub2JqSWQ7XG4gICAgfSBlbHNlIGlmIChpc1N0cmVhbShjYWNoZUtleSkpIHtcbiAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdCAmJiBjYWNoZUtleS5kaWN0Lm9iaklkO1xuICAgIH1cbiAgICBpZiAoZm5SZWYpIHtcbiAgICAgIGlmICghdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZSA9IG5ldyBMb2NhbEZ1bmN0aW9uQ2FjaGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5zZXQoLyogbmFtZSA9ICovIG51bGwsIGZuUmVmLCBwYXJzZWRGdW5jdGlvbik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvTnVtYmVyQXJyYXkoYXJyKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICh0eXBlb2YgYXJyW2ldICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAvLyBOb24tbnVtYmVyIGlzIGZvdW5kIC0tIGNvbnZlcnQgYWxsIGl0ZW1zIHRvIG51bWJlcnMuXG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcmVzdWx0W2pdID0gK2FycltqXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcnI7XG59XG5cbnZhciBQREZGdW5jdGlvbiA9IChmdW5jdGlvbiBQREZGdW5jdGlvbkNsb3N1cmUoKSB7XG4gIGNvbnN0IENPTlNUUlVDVF9TQU1QTEVEID0gMDtcbiAgY29uc3QgQ09OU1RSVUNUX0lOVEVSUE9MQVRFRCA9IDI7XG4gIGNvbnN0IENPTlNUUlVDVF9TVElDSEVEID0gMztcbiAgY29uc3QgQ09OU1RSVUNUX1BPU1RTQ1JJUFQgPSA0O1xuXG4gIHJldHVybiB7XG4gICAgZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBzdHJlYW0pIHtcbiAgICAgIHZhciBpLCBpaTtcbiAgICAgIHZhciBsZW5ndGggPSAxO1xuICAgICAgZm9yIChpID0gMCwgaWkgPSBzaXplLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgbGVuZ3RoICo9IHNpemVbaV07XG4gICAgICB9XG4gICAgICBsZW5ndGggKj0gb3V0cHV0U2l6ZTtcblxuICAgICAgdmFyIGFycmF5ID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICB2YXIgY29kZVNpemUgPSAwO1xuICAgICAgdmFyIGNvZGVCdWYgPSAwO1xuICAgICAgLy8gMzIgaXMgYSB2YWxpZCBicHMgc28gc2hpZnRpbmcgd29uJ3Qgd29ya1xuICAgICAgdmFyIHNhbXBsZU11bCA9IDEuMCAvICgyLjAgKiogYnBzIC0gMSk7XG5cbiAgICAgIHZhciBzdHJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcygobGVuZ3RoICogYnBzICsgNykgLyA4KTtcbiAgICAgIHZhciBzdHJJZHggPSAwO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJwcykge1xuICAgICAgICAgIGNvZGVCdWYgPDw9IDg7XG4gICAgICAgICAgY29kZUJ1ZiB8PSBzdHJCeXRlc1tzdHJJZHgrK107XG4gICAgICAgICAgY29kZVNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBjb2RlU2l6ZSAtPSBicHM7XG4gICAgICAgIGFycmF5W2ldID0gKGNvZGVCdWYgPj4gY29kZVNpemUpICogc2FtcGxlTXVsO1xuICAgICAgICBjb2RlQnVmICY9ICgxIDw8IGNvZGVTaXplKSAtIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfSxcblxuICAgIGdldElSKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiB9KSB7XG4gICAgICB2YXIgZGljdCA9IGZuLmRpY3Q7XG4gICAgICBpZiAoIWRpY3QpIHtcbiAgICAgICAgZGljdCA9IGZuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHlwZXMgPSBbXG4gICAgICAgIHRoaXMuY29uc3RydWN0U2FtcGxlZCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQsXG4gICAgICAgIHRoaXMuY29uc3RydWN0U3RpY2hlZCxcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0LFxuICAgICAgXTtcblxuICAgICAgdmFyIHR5cGVOdW0gPSBkaWN0LmdldChcIkZ1bmN0aW9uVHlwZVwiKTtcbiAgICAgIHZhciB0eXBlRm4gPSB0eXBlc1t0eXBlTnVtXTtcbiAgICAgIGlmICghdHlwZUZuKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIlVua25vd24gdHlwZSBvZiBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHR5cGVGbi5jYWxsKHRoaXMsIHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiwgZGljdCB9KTtcbiAgICB9LFxuXG4gICAgZnJvbUlSKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBJUiB9KSB7XG4gICAgICB2YXIgdHlwZSA9IElSWzBdO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgQ09OU1RSVUNUX1NBTVBMRUQ6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0U2FtcGxlZEZyb21JUih7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgSVIgfSk7XG4gICAgICAgIGNhc2UgQ09OU1RSVUNUX0lOVEVSUE9MQVRFRDpcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVIoe1xuICAgICAgICAgICAgeHJlZixcbiAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCxcbiAgICAgICAgICAgIElSLFxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIENPTlNUUlVDVF9TVElDSEVEOlxuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFN0aWNoZWRGcm9tSVIoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIElSIH0pO1xuICAgICAgICAvLyBjYXNlIENPTlNUUlVDVF9QT1NUU0NSSVBUOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFBvc3RTY3JpcHRGcm9tSVIoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIElSIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZSh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm4gfSkge1xuICAgICAgY29uc3QgSVIgPSB0aGlzLmdldElSKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiB9KTtcbiAgICAgIHJldHVybiB0aGlzLmZyb21JUih7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgSVIgfSk7XG4gICAgfSxcblxuICAgIHBhcnNlQXJyYXkoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIGZuT2JqIH0pIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmbk9iaikpIHtcbiAgICAgICAgLy8gbm90IGFuIGFycmF5IC0tIHBhcnNpbmcgYXMgcmVndWxhciBmdW5jdGlvblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZSh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm46IGZuT2JqIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgZm5BcnJheSA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gZm5PYmoubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBmbkFycmF5LnB1c2goXG4gICAgICAgICAgdGhpcy5wYXJzZSh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm46IHhyZWYuZmV0Y2hJZlJlZihmbk9ialtqXSkgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZm5BcnJheS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgZm5BcnJheVtpXShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCArIGkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb25zdHJ1Y3RTYW1wbGVkKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiwgZGljdCB9KSB7XG4gICAgICBmdW5jdGlvbiB0b011bHRpQXJyYXkoYXJyKSB7XG4gICAgICAgIHZhciBpbnB1dExlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgb3V0W2luZGV4XSA9IFthcnJbaV0sIGFycltpICsgMV1dO1xuICAgICAgICAgICsraW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH1cbiAgICAgIHZhciBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoXCJEb21haW5cIikpO1xuICAgICAgdmFyIHJhbmdlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiUmFuZ2VcIikpO1xuXG4gICAgICBpZiAoIWRvbWFpbiB8fCAhcmFuZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTm8gZG9tYWluIG9yIHJhbmdlXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgb3V0cHV0U2l6ZSA9IHJhbmdlLmxlbmd0aCAvIDI7XG5cbiAgICAgIGRvbWFpbiA9IHRvTXVsdGlBcnJheShkb21haW4pO1xuICAgICAgcmFuZ2UgPSB0b011bHRpQXJyYXkocmFuZ2UpO1xuXG4gICAgICB2YXIgc2l6ZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheShcIlNpemVcIikpO1xuICAgICAgdmFyIGJwcyA9IGRpY3QuZ2V0KFwiQml0c1BlclNhbXBsZVwiKTtcbiAgICAgIHZhciBvcmRlciA9IGRpY3QuZ2V0KFwiT3JkZXJcIikgfHwgMTtcbiAgICAgIGlmIChvcmRlciAhPT0gMSkge1xuICAgICAgICAvLyBObyBkZXNjcmlwdGlvbiBob3cgY3ViaWMgc3BsaW5lIGludGVycG9sYXRpb24gd29ya3MgaW4gUERGMzIwMDA6MjAwOFxuICAgICAgICAvLyBBcyBpbiBwb3BwbGVyLCBpZ25vcmluZyBvcmRlciwgbGluZWFyIGludGVycG9sYXRpb24gbWF5IHdvcmsgYXMgZ29vZFxuICAgICAgICBpbmZvKFwiTm8gc3VwcG9ydCBmb3IgY3ViaWMgc3BsaW5lIGludGVycG9sYXRpb246IFwiICsgb3JkZXIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW5jb2RlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiRW5jb2RlXCIpKTtcbiAgICAgIGlmICghZW5jb2RlKSB7XG4gICAgICAgIGVuY29kZSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0U2l6ZTsgKytpKSB7XG4gICAgICAgICAgZW5jb2RlLnB1c2goWzAsIHNpemVbaV0gLSAxXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuY29kZSA9IHRvTXVsdGlBcnJheShlbmNvZGUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVjb2RlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiRGVjb2RlXCIpKTtcbiAgICAgIGlmICghZGVjb2RlKSB7XG4gICAgICAgIGRlY29kZSA9IHJhbmdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlID0gdG9NdWx0aUFycmF5KGRlY29kZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzYW1wbGVzID0gdGhpcy5nZXRTYW1wbGVBcnJheShzaXplLCBvdXRwdXRTaXplLCBicHMsIGZuKTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgQ09OU1RSVUNUX1NBTVBMRUQsXG4gICAgICAgIGlucHV0U2l6ZSxcbiAgICAgICAgZG9tYWluLFxuICAgICAgICBlbmNvZGUsXG4gICAgICAgIGRlY29kZSxcbiAgICAgICAgc2FtcGxlcyxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgb3V0cHV0U2l6ZSxcbiAgICAgICAgMiAqKiBicHMgLSAxLFxuICAgICAgICByYW5nZSxcbiAgICAgIF07XG4gICAgfSxcblxuICAgIGNvbnN0cnVjdFNhbXBsZWRGcm9tSVIoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIElSIH0pIHtcbiAgICAgIC8vIFNlZSBjaGFwdGVyIDMsIHBhZ2UgMTA5IG9mIHRoZSBQREYgcmVmZXJlbmNlXG4gICAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh4LCB4bWluLCB4bWF4LCB5bWluLCB5bWF4KSB7XG4gICAgICAgIHJldHVybiB5bWluICsgKHggLSB4bWluKSAqICgoeW1heCAtIHltaW4pIC8gKHhtYXggLSB4bWluKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTYW1wbGVkRnJvbUlSUmVzdWx0KFxuICAgICAgICBzcmMsXG4gICAgICAgIHNyY09mZnNldCxcbiAgICAgICAgZGVzdCxcbiAgICAgICAgZGVzdE9mZnNldFxuICAgICAgKSB7XG4gICAgICAgIC8vIFNlZSBjaGFwdGVyIDMsIHBhZ2UgMTEwIG9mIHRoZSBQREYgcmVmZXJlbmNlLlxuICAgICAgICB2YXIgbSA9IElSWzFdO1xuICAgICAgICB2YXIgZG9tYWluID0gSVJbMl07XG4gICAgICAgIHZhciBlbmNvZGUgPSBJUlszXTtcbiAgICAgICAgdmFyIGRlY29kZSA9IElSWzRdO1xuICAgICAgICB2YXIgc2FtcGxlcyA9IElSWzVdO1xuICAgICAgICB2YXIgc2l6ZSA9IElSWzZdO1xuICAgICAgICB2YXIgbiA9IElSWzddO1xuICAgICAgICAvLyB2YXIgbWFzayA9IElSWzhdO1xuICAgICAgICB2YXIgcmFuZ2UgPSBJUls5XTtcblxuICAgICAgICAvLyBCdWlsZGluZyB0aGUgY3ViZSB2ZXJ0aWNlczogaXRzIHBhcnQgYW5kIHNhbXBsZSBpbmRleFxuICAgICAgICAvLyBodHRwOi8vcmp3YWduZXI0OS5jb20vTWF0aGVtYXRpY3MvSW50ZXJwb2xhdGlvbi5wZGZcbiAgICAgICAgdmFyIGN1YmVWZXJ0aWNlcyA9IDEgPDwgbTtcbiAgICAgICAgdmFyIGN1YmVOID0gbmV3IEZsb2F0NjRBcnJheShjdWJlVmVydGljZXMpO1xuICAgICAgICB2YXIgY3ViZVZlcnRleCA9IG5ldyBVaW50MzJBcnJheShjdWJlVmVydGljZXMpO1xuICAgICAgICB2YXIgaSwgajtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1YmVWZXJ0aWNlczsgaisrKSB7XG4gICAgICAgICAgY3ViZU5bal0gPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGsgPSBuLFxuICAgICAgICAgIHBvcyA9IDE7XG4gICAgICAgIC8vIE1hcCB4X2kgdG8geV9qIGZvciAwIDw9IGkgPCBtIHVzaW5nIHRoZSBzYW1wbGVkIGZ1bmN0aW9uLlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7XG4gICAgICAgICAgLy8geF9pJyA9IG1pbihtYXgoeF9pLCBEb21haW5fMmkpLCBEb21haW5fMmkrMSlcbiAgICAgICAgICB2YXIgZG9tYWluXzJpID0gZG9tYWluW2ldWzBdO1xuICAgICAgICAgIHZhciBkb21haW5fMmlfMSA9IGRvbWFpbltpXVsxXTtcbiAgICAgICAgICB2YXIgeGkgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGgubWF4KHNyY1tzcmNPZmZzZXQgKyBpXSwgZG9tYWluXzJpKSxcbiAgICAgICAgICAgIGRvbWFpbl8yaV8xXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIGVfaSA9IEludGVycG9sYXRlKHhfaScsIERvbWFpbl8yaSwgRG9tYWluXzJpKzEsXG4gICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgRW5jb2RlXzJpLCBFbmNvZGVfMmkrMSlcbiAgICAgICAgICB2YXIgZSA9IGludGVycG9sYXRlKFxuICAgICAgICAgICAgeGksXG4gICAgICAgICAgICBkb21haW5fMmksXG4gICAgICAgICAgICBkb21haW5fMmlfMSxcbiAgICAgICAgICAgIGVuY29kZVtpXVswXSxcbiAgICAgICAgICAgIGVuY29kZVtpXVsxXVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBlX2knID0gbWluKG1heChlX2ksIDApLCBTaXplX2kgLSAxKVxuICAgICAgICAgIHZhciBzaXplX2kgPSBzaXplW2ldO1xuICAgICAgICAgIGUgPSBNYXRoLm1pbihNYXRoLm1heChlLCAwKSwgc2l6ZV9pIC0gMSk7XG5cbiAgICAgICAgICAvLyBBZGp1c3RpbmcgdGhlIGN1YmU6IE4gYW5kIHZlcnRleCBzYW1wbGUgaW5kZXhcbiAgICAgICAgICB2YXIgZTAgPSBlIDwgc2l6ZV9pIC0gMSA/IE1hdGguZmxvb3IoZSkgOiBlIC0gMTsgLy8gZTEgPSBlMCArIDE7XG4gICAgICAgICAgdmFyIG4wID0gZTAgKyAxIC0gZTsgLy8gKGUxIC0gZSkgLyAoZTEgLSBlMCk7XG4gICAgICAgICAgdmFyIG4xID0gZSAtIGUwOyAvLyAoZSAtIGUwKSAvIChlMSAtIGUwKTtcbiAgICAgICAgICB2YXIgb2Zmc2V0MCA9IGUwICogaztcbiAgICAgICAgICB2YXIgb2Zmc2V0MSA9IG9mZnNldDAgKyBrOyAvLyBlMSAqIGtcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3ViZVZlcnRpY2VzOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChqICYgcG9zKSB7XG4gICAgICAgICAgICAgIGN1YmVOW2pdICo9IG4xO1xuICAgICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjdWJlTltqXSAqPSBuMDtcbiAgICAgICAgICAgICAgY3ViZVZlcnRleFtqXSArPSBvZmZzZXQwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGsgKj0gc2l6ZV9pO1xuICAgICAgICAgIHBvcyA8PD0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHtcbiAgICAgICAgICAvLyBTdW0gYWxsIGN1YmUgdmVydGljZXMnIHNhbXBsZXMgcG9ydGlvbnNcbiAgICAgICAgICB2YXIgcmogPSAwO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdWJlVmVydGljZXM7IGkrKykge1xuICAgICAgICAgICAgcmogKz0gc2FtcGxlc1tjdWJlVmVydGV4W2ldICsgal0gKiBjdWJlTltpXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyByX2onID0gSW50ZXJwb2xhdGUocl9qLCAwLCAyXkJpdHNQZXJTYW1wbGUgLSAxLFxuICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBEZWNvZGVfMmosIERlY29kZV8yaisxKVxuICAgICAgICAgIHJqID0gaW50ZXJwb2xhdGUocmosIDAsIDEsIGRlY29kZVtqXVswXSwgZGVjb2RlW2pdWzFdKTtcblxuICAgICAgICAgIC8vIHlfaiA9IG1pbihtYXgocl9qLCByYW5nZV8yaiksIHJhbmdlXzJqKzEpXG4gICAgICAgICAgZGVzdFtkZXN0T2Zmc2V0ICsgal0gPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGgubWF4KHJqLCByYW5nZVtqXVswXSksXG4gICAgICAgICAgICByYW5nZVtqXVsxXVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcblxuICAgIGNvbnN0cnVjdEludGVycG9sYXRlZCh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm4sIGRpY3QgfSkge1xuICAgICAgdmFyIGMwID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiQzBcIikpIHx8IFswXTtcbiAgICAgIHZhciBjMSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheShcIkMxXCIpKSB8fCBbMV07XG4gICAgICB2YXIgbiA9IGRpY3QuZ2V0KFwiTlwiKTtcblxuICAgICAgdmFyIGxlbmd0aCA9IGMwLmxlbmd0aDtcbiAgICAgIHZhciBkaWZmID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGRpZmYucHVzaChjMVtpXSAtIGMwW2ldKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtDT05TVFJVQ1RfSU5URVJQT0xBVEVELCBjMCwgZGlmZiwgbl07XG4gICAgfSxcblxuICAgIGNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUih7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgSVIgfSkge1xuICAgICAgdmFyIGMwID0gSVJbMV07XG4gICAgICB2YXIgZGlmZiA9IElSWzJdO1xuICAgICAgdmFyIG4gPSBJUlszXTtcblxuICAgICAgdmFyIGxlbmd0aCA9IGRpZmYubGVuZ3RoO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0SW50ZXJwb2xhdGVkRnJvbUlSUmVzdWx0KFxuICAgICAgICBzcmMsXG4gICAgICAgIHNyY09mZnNldCxcbiAgICAgICAgZGVzdCxcbiAgICAgICAgZGVzdE9mZnNldFxuICAgICAgKSB7XG4gICAgICAgIHZhciB4ID0gbiA9PT0gMSA/IHNyY1tzcmNPZmZzZXRdIDogc3JjW3NyY09mZnNldF0gKiogbjtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgZGVzdFtkZXN0T2Zmc2V0ICsgal0gPSBjMFtqXSArIHggKiBkaWZmW2pdO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb25zdHJ1Y3RTdGljaGVkKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBmbiwgZGljdCB9KSB7XG4gICAgICB2YXIgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiRG9tYWluXCIpKTtcblxuICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTm8gZG9tYWluXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7XG4gICAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIkJhZCBkb21haW4gZm9yIHN0aWNoZWQgZnVuY3Rpb25cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBmblJlZnMgPSBkaWN0LmdldChcIkZ1bmN0aW9uc1wiKTtcbiAgICAgIHZhciBmbnMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGZuUmVmcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgIGZucy5wdXNoKFxuICAgICAgICAgIHRoaXMucGFyc2UoeyB4cmVmLCBpc0V2YWxTdXBwb3J0ZWQsIGZuOiB4cmVmLmZldGNoSWZSZWYoZm5SZWZzW2ldKSB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB2YXIgYm91bmRzID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KFwiQm91bmRzXCIpKTtcbiAgICAgIHZhciBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoXCJFbmNvZGVcIikpO1xuXG4gICAgICByZXR1cm4gW0NPTlNUUlVDVF9TVElDSEVELCBkb21haW4sIGJvdW5kcywgZW5jb2RlLCBmbnNdO1xuICAgIH0sXG5cbiAgICBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSKHsgeHJlZiwgaXNFdmFsU3VwcG9ydGVkLCBJUiB9KSB7XG4gICAgICB2YXIgZG9tYWluID0gSVJbMV07XG4gICAgICB2YXIgYm91bmRzID0gSVJbMl07XG4gICAgICB2YXIgZW5jb2RlID0gSVJbM107XG4gICAgICB2YXIgZm5zID0gSVJbNF07XG4gICAgICB2YXIgdG1wQnVmID0gbmV3IEZsb2F0MzJBcnJheSgxKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGcm9tSVJSZXN1bHQoXG4gICAgICAgIHNyYyxcbiAgICAgICAgc3JjT2Zmc2V0LFxuICAgICAgICBkZXN0LFxuICAgICAgICBkZXN0T2Zmc2V0XG4gICAgICApIHtcbiAgICAgICAgdmFyIGNsaXAgPSBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSQ2xpcCh2LCBtaW4sIG1heCkge1xuICAgICAgICAgIGlmICh2ID4gbWF4KSB7XG4gICAgICAgICAgICB2ID0gbWF4O1xuICAgICAgICAgIH0gZWxzZSBpZiAodiA8IG1pbikge1xuICAgICAgICAgICAgdiA9IG1pbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gY2xpcCB0byBkb21haW5cbiAgICAgICAgdmFyIHYgPSBjbGlwKHNyY1tzcmNPZmZzZXRdLCBkb21haW5bMF0sIGRvbWFpblsxXSk7XG4gICAgICAgIC8vIGNhbGN1bGF0ZSB3aGljaCBib3VuZCB0aGUgdmFsdWUgaXMgaW5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYm91bmRzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICBpZiAodiA8IGJvdW5kc1tpXSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5jb2RlIHZhbHVlIGludG8gZG9tYWluIG9mIGZ1bmN0aW9uXG4gICAgICAgIHZhciBkbWluID0gZG9tYWluWzBdO1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBkbWluID0gYm91bmRzW2kgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZG1heCA9IGRvbWFpblsxXTtcbiAgICAgICAgaWYgKGkgPCBib3VuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgZG1heCA9IGJvdW5kc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBybWluID0gZW5jb2RlWzIgKiBpXTtcbiAgICAgICAgdmFyIHJtYXggPSBlbmNvZGVbMiAqIGkgKyAxXTtcblxuICAgICAgICAvLyBQcmV2ZW50IHRoZSB2YWx1ZSBmcm9tIGJlY29taW5nIE5hTiBhcyBhIHJlc3VsdFxuICAgICAgICAvLyBvZiBkaXZpc2lvbiBieSB6ZXJvIChmaXhlcyBpc3N1ZTYxMTMucGRmKS5cbiAgICAgICAgdG1wQnVmWzBdID1cbiAgICAgICAgICBkbWluID09PSBkbWF4XG4gICAgICAgICAgICA/IHJtaW5cbiAgICAgICAgICAgIDogcm1pbiArICgodiAtIGRtaW4pICogKHJtYXggLSBybWluKSkgLyAoZG1heCAtIGRtaW4pO1xuXG4gICAgICAgIC8vIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uXG4gICAgICAgIGZuc1tpXSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpO1xuICAgICAgfTtcbiAgICB9LFxuXG4gICAgY29uc3RydWN0UG9zdFNjcmlwdCh7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgZm4sIGRpY3QgfSkge1xuICAgICAgdmFyIGRvbWFpbiA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheShcIkRvbWFpblwiKSk7XG4gICAgICB2YXIgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoXCJSYW5nZVwiKSk7XG5cbiAgICAgIGlmICghZG9tYWluKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk5vIGRvbWFpbi5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiTm8gcmFuZ2UuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGV4ZXIgPSBuZXcgUG9zdFNjcmlwdExleGVyKGZuKTtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgUG9zdFNjcmlwdFBhcnNlcihsZXhlcik7XG4gICAgICB2YXIgY29kZSA9IHBhcnNlci5wYXJzZSgpO1xuXG4gICAgICByZXR1cm4gW0NPTlNUUlVDVF9QT1NUU0NSSVBULCBkb21haW4sIHJhbmdlLCBjb2RlXTtcbiAgICB9LFxuXG4gICAgY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUih7IHhyZWYsIGlzRXZhbFN1cHBvcnRlZCwgSVIgfSkge1xuICAgICAgdmFyIGRvbWFpbiA9IElSWzFdO1xuICAgICAgdmFyIHJhbmdlID0gSVJbMl07XG4gICAgICB2YXIgY29kZSA9IElSWzNdO1xuXG4gICAgICBpZiAoaXNFdmFsU3VwcG9ydGVkICYmIElzRXZhbFN1cHBvcnRlZENhY2hlZC52YWx1ZSkge1xuICAgICAgICBjb25zdCBjb21waWxlZCA9IG5ldyBQb3N0U2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpO1xuICAgICAgICBpZiAoY29tcGlsZWQpIHtcbiAgICAgICAgICAvLyBDb21waWxlZCBmdW5jdGlvbiBjb25zaXN0cyBvZiBzaW1wbGUgZXhwcmVzc2lvbnMgc3VjaCBhcyBhZGRpdGlvbixcbiAgICAgICAgICAvLyBzdWJ0cmFjdGlvbiwgTWF0aC5tYXgsIGFuZCBhbHNvIGNvbnRhaW5zICd2YXInIGFuZCAncmV0dXJuJ1xuICAgICAgICAgIC8vIHN0YXRlbWVudHMuIFNlZSB0aGUgZ2VuZXJhdGlvbiBpbiB0aGUgUG9zdFNjcmlwdENvbXBpbGVyIGJlbG93LlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oXG4gICAgICAgICAgICBcInNyY1wiLFxuICAgICAgICAgICAgXCJzcmNPZmZzZXRcIixcbiAgICAgICAgICAgIFwiZGVzdFwiLFxuICAgICAgICAgICAgXCJkZXN0T2Zmc2V0XCIsXG4gICAgICAgICAgICBjb21waWxlZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluZm8oXCJVbmFibGUgdG8gY29tcGlsZSBQUyBmdW5jdGlvblwiKTtcblxuICAgICAgdmFyIG51bU91dHB1dHMgPSByYW5nZS5sZW5ndGggPj4gMTtcbiAgICAgIHZhciBudW1JbnB1dHMgPSBkb21haW4ubGVuZ3RoID4+IDE7XG4gICAgICB2YXIgZXZhbHVhdG9yID0gbmV3IFBvc3RTY3JpcHRFdmFsdWF0b3IoY29kZSk7XG4gICAgICAvLyBDYWNoZSB0aGUgdmFsdWVzIGZvciBhIGJpZyBzcGVlZCB1cCwgdGhlIGNhY2hlIHNpemUgaXMgbGltaXRlZCB0aG91Z2hcbiAgICAgIC8vIHNpbmNlIHRoZSBudW1iZXIgb2YgcG9zc2libGUgdmFsdWVzIGNhbiBiZSBodWdlIGZyb20gYSBQUyBmdW5jdGlvbi5cbiAgICAgIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAvLyBUaGUgTUFYX0NBQ0hFX1NJWkUgaXMgc2V0IHRvIH40eCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzXG4gICAgICAvLyBzZWVuIGluIG91ciB0ZXN0cy5cbiAgICAgIHZhciBNQVhfQ0FDSEVfU0laRSA9IDIwNDggKiA0O1xuICAgICAgdmFyIGNhY2hlX2F2YWlsYWJsZSA9IE1BWF9DQUNIRV9TSVpFO1xuICAgICAgdmFyIHRtcEJ1ZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtSW5wdXRzKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFBvc3RTY3JpcHRGcm9tSVJSZXN1bHQoXG4gICAgICAgIHNyYyxcbiAgICAgICAgc3JjT2Zmc2V0LFxuICAgICAgICBkZXN0LFxuICAgICAgICBkZXN0T2Zmc2V0XG4gICAgICApIHtcbiAgICAgICAgdmFyIGksIHZhbHVlO1xuICAgICAgICB2YXIga2V5ID0gXCJcIjtcbiAgICAgICAgdmFyIGlucHV0ID0gdG1wQnVmO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtSW5wdXRzOyBpKyspIHtcbiAgICAgICAgICB2YWx1ZSA9IHNyY1tzcmNPZmZzZXQgKyBpXTtcbiAgICAgICAgICBpbnB1dFtpXSA9IHZhbHVlO1xuICAgICAgICAgIGtleSArPSB2YWx1ZSArIFwiX1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gY2FjaGVba2V5XTtcbiAgICAgICAgaWYgKGNhY2hlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZXN0LnNldChjYWNoZWRWYWx1ZSwgZGVzdE9mZnNldCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkobnVtT3V0cHV0cyk7XG4gICAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRvci5leGVjdXRlKGlucHV0KTtcbiAgICAgICAgdmFyIHN0YWNrSW5kZXggPSBzdGFjay5sZW5ndGggLSBudW1PdXRwdXRzO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgaSsrKSB7XG4gICAgICAgICAgdmFsdWUgPSBzdGFja1tzdGFja0luZGV4ICsgaV07XG4gICAgICAgICAgdmFyIGJvdW5kID0gcmFuZ2VbaSAqIDJdO1xuICAgICAgICAgIGlmICh2YWx1ZSA8IGJvdW5kKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJvdW5kO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib3VuZCA9IHJhbmdlW2kgKiAyICsgMV07XG4gICAgICAgICAgICBpZiAodmFsdWUgPiBib3VuZCkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGJvdW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXRbaV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FjaGVfYXZhaWxhYmxlID4gMCkge1xuICAgICAgICAgIGNhY2hlX2F2YWlsYWJsZS0tO1xuICAgICAgICAgIGNhY2hlW2tleV0gPSBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdC5zZXQob3V0cHV0LCBkZXN0T2Zmc2V0KTtcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGlzUERGRnVuY3Rpb24odikge1xuICB2YXIgZm5EaWN0O1xuICBpZiAodHlwZW9mIHYgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNEaWN0KHYpKSB7XG4gICAgZm5EaWN0ID0gdjtcbiAgfSBlbHNlIGlmIChpc1N0cmVhbSh2KSkge1xuICAgIGZuRGljdCA9IHYuZGljdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGZuRGljdC5oYXMoXCJGdW5jdGlvblR5cGVcIik7XG59XG5cbnZhciBQb3N0U2NyaXB0U3RhY2sgPSAoZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrQ2xvc3VyZSgpIHtcbiAgdmFyIE1BWF9TVEFDS19TSVpFID0gMTAwO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrKGluaXRpYWxTdGFjaykge1xuICAgIHRoaXMuc3RhY2sgPSAhaW5pdGlhbFN0YWNrXG4gICAgICA/IFtdXG4gICAgICA6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGluaXRpYWxTdGFjaywgMCk7XG4gIH1cblxuICBQb3N0U2NyaXB0U3RhY2sucHJvdG90eXBlID0ge1xuICAgIHB1c2g6IGZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19wdXNoKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPj0gTUFYX1NUQUNLX1NJWkUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy5cIik7XG4gICAgICB9XG4gICAgICB0aGlzLnN0YWNrLnB1c2godmFsdWUpO1xuICAgIH0sXG4gICAgcG9wOiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcG9wKCkge1xuICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayB1bmRlcmZsb3cuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RhY2sucG9wKCk7XG4gICAgfSxcbiAgICBjb3B5OiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfY29weShuKSB7XG4gICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggKyBuID49IE1BWF9TVEFDS19TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuXCIpO1xuICAgICAgfVxuICAgICAgdmFyIHN0YWNrID0gdGhpcy5zdGFjaztcbiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSBuLCBqID0gbiAtIDE7IGogPj0gMDsgai0tLCBpKyspIHtcbiAgICAgICAgc3RhY2sucHVzaChzdGFja1tpXSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpbmRleDogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX2luZGV4KG4pIHtcbiAgICAgIHRoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbiAtIDFdKTtcbiAgICB9LFxuICAgIC8vIHJvdGF0ZSB0aGUgbGFzdCBuIHN0YWNrIGVsZW1lbnRzIHAgdGltZXNcbiAgICByb2xsOiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcm9sbChuLCBwKSB7XG4gICAgICB2YXIgc3RhY2sgPSB0aGlzLnN0YWNrO1xuICAgICAgdmFyIGwgPSBzdGFjay5sZW5ndGggLSBuO1xuICAgICAgdmFyIHIgPSBzdGFjay5sZW5ndGggLSAxLFxuICAgICAgICBjID0gbCArIChwIC0gTWF0aC5mbG9vcihwIC8gbikgKiBuKSxcbiAgICAgICAgaSxcbiAgICAgICAgaixcbiAgICAgICAgdDtcbiAgICAgIGZvciAoaSA9IGwsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHtcbiAgICAgICAgdCA9IHN0YWNrW2ldO1xuICAgICAgICBzdGFja1tpXSA9IHN0YWNrW2pdO1xuICAgICAgICBzdGFja1tqXSA9IHQ7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSBsLCBqID0gYyAtIDE7IGkgPCBqOyBpKyssIGotLSkge1xuICAgICAgICB0ID0gc3RhY2tbaV07XG4gICAgICAgIHN0YWNrW2ldID0gc3RhY2tbal07XG4gICAgICAgIHN0YWNrW2pdID0gdDtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IGMsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHtcbiAgICAgICAgdCA9IHN0YWNrW2ldO1xuICAgICAgICBzdGFja1tpXSA9IHN0YWNrW2pdO1xuICAgICAgICBzdGFja1tqXSA9IHQ7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIFBvc3RTY3JpcHRTdGFjaztcbn0pKCk7XG52YXIgUG9zdFNjcmlwdEV2YWx1YXRvciA9IChmdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yQ2xvc3VyZSgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yKG9wZXJhdG9ycykge1xuICAgIHRoaXMub3BlcmF0b3JzID0gb3BlcmF0b3JzO1xuICB9XG4gIFBvc3RTY3JpcHRFdmFsdWF0b3IucHJvdG90eXBlID0ge1xuICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIFBvc3RTY3JpcHRFdmFsdWF0b3JfZXhlY3V0ZShpbml0aWFsU3RhY2spIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBQb3N0U2NyaXB0U3RhY2soaW5pdGlhbFN0YWNrKTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciBvcGVyYXRvcnMgPSB0aGlzLm9wZXJhdG9ycztcbiAgICAgIHZhciBsZW5ndGggPSBvcGVyYXRvcnMubGVuZ3RoO1xuICAgICAgdmFyIG9wZXJhdG9yLCBhLCBiO1xuICAgICAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICAgICAgb3BlcmF0b3IgPSBvcGVyYXRvcnNbY291bnRlcisrXTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcGVyYXRvciA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIC8vIE9wZXJhdG9yIGlzIHJlYWxseSBhbiBvcGVyYW5kIGFuZCBzaG91bGQgYmUgcHVzaGVkIHRvIHRoZSBzdGFjay5cbiAgICAgICAgICBzdGFjay5wdXNoKG9wZXJhdG9yKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgLy8gbm9uIHN0YW5kYXJkIHBzIG9wZXJhdG9yc1xuICAgICAgICAgIGNhc2UgXCJqelwiOiAvLyBqdW1wIGlmIGZhbHNlXG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWEpIHtcbiAgICAgICAgICAgICAgY291bnRlciA9IGI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwialwiOiAvLyBqdW1wXG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBjb3VudGVyID0gYTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgLy8gYWxsIHBzIG9wZXJhdG9ycyBpbiBhbHBoYWJldGljYWwgb3JkZXIgKGV4Y2x1ZGluZyBpZi9pZmVsc2UpXG4gICAgICAgICAgY2FzZSBcImFic1wiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmFicyhhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgKyBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhbmRcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGlmIChpc0Jvb2woYSkgJiYgaXNCb29sKGIpKSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmJiBiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmIGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImF0YW5cIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hdGFuKGEpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJiaXRzaGlmdFwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKGEgPiAwKSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA8PCBiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA+PiBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjZWlsaW5nXCI6XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY2VpbChhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiY29weVwiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2suY29weShhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjb3NcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5jb3MoYSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImN2aVwiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpIHwgMDtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiY3ZyXCI6XG4gICAgICAgICAgICAvLyBub29wXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZGl2XCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgLyBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJkdXBcIjpcbiAgICAgICAgICAgIHN0YWNrLmNvcHkoMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSA9PT0gYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZXhjaFwiOlxuICAgICAgICAgICAgc3RhY2sucm9sbCgyLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJleHBcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSAqKiBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmYWxzZVwiOlxuICAgICAgICAgICAgc3RhY2sucHVzaChmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZmxvb3JcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5mbG9vcihhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZ2VcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSA+PSBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhID4gYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiaWRpdlwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaCgoYSAvIGIpIHwgMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiaW5kZXhcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLmluZGV4KGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImxlXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgPD0gYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibG5cIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5sb2coYSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImxvZ1wiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmxvZyhhKSAvIE1hdGguTE4xMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibHRcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYSA8IGIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm1vZFwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhICUgYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibXVsXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgKiBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJuZVwiOlxuICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhICE9PSBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJuZWdcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goLWEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5vdFwiOlxuICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKGlzQm9vbChhKSkge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKCFhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2gofmEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm9yXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAoaXNCb29sKGEpICYmIGlzQm9vbChiKSkge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgfHwgYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgfCBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJwb3BcIjpcbiAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInJvbGxcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnJvbGwoYSwgYik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwicm91bmRcIjpcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5yb3VuZChhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic2luXCI6XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc2luKGEpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJzcXJ0XCI6XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc3FydChhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3ViXCI6XG4gICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGEgLSBiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ0cnVlXCI6XG4gICAgICAgICAgICBzdGFjay5wdXNoKHRydWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInRydW5jYXRlXCI6XG4gICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhID0gYSA8IDAgPyBNYXRoLmNlaWwoYSkgOiBNYXRoLmZsb29yKGEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ4b3JcIjpcbiAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGlmIChpc0Jvb2woYSkgJiYgaXNCb29sKGIpKSB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAhPT0gYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgXiBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVua25vd24gb3BlcmF0b3IgJHtvcGVyYXRvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YWNrLnN0YWNrO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBQb3N0U2NyaXB0RXZhbHVhdG9yO1xufSkoKTtcblxuLy8gTW9zdCBvZiB0aGUgUERGcyBmdW5jdGlvbnMgY29uc2lzdCBvZiBzaW1wbGUgb3BlcmF0aW9ucyBzdWNoIGFzOlxuLy8gICByb2xsLCBleGNoLCBzdWIsIGN2ciwgcG9wLCBpbmRleCwgZHVwLCBtdWwsIGlmLCBndCwgYWRkLlxuLy9cbi8vIFdlIGNhbiBjb21waWxlIG1vc3Qgb2Ygc3VjaCBwcm9ncmFtcywgYW5kIGF0IHRoZSBzYW1lIG1vbWVudCwgd2UgY2FuXG4vLyBvcHRpbWl6ZSBzb21lIGV4cHJlc3Npb25zIHVzaW5nIGJhc2ljIG1hdGggcHJvcGVydGllcy4gS2VlcGluZyB0cmFjayBvZlxuLy8gbWluL21heCB2YWx1ZXMgd2lsbCBhbGxvdyB1cyB0byBhdm9pZCBleHRyYSBNYXRoLm1pbi9NYXRoLm1heCBjYWxscy5cbnZhciBQb3N0U2NyaXB0Q29tcGlsZXIgPSAoZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gQXN0Tm9kZSh0eXBlKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuICBBc3ROb2RlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdW5yZWFjaGFibGUoXCJhYnN0cmFjdCBtZXRob2RcIik7XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN0QXJndW1lbnQoaW5kZXgsIG1pbiwgbWF4KSB7XG4gICAgQXN0Tm9kZS5jYWxsKHRoaXMsIFwiYXJnc1wiKTtcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gIH1cbiAgQXN0QXJndW1lbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBc3ROb2RlLnByb3RvdHlwZSk7XG4gIEFzdEFyZ3VtZW50LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdEFyZ3VtZW50KHRoaXMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzdExpdGVyYWwobnVtYmVyKSB7XG4gICAgQXN0Tm9kZS5jYWxsKHRoaXMsIFwibGl0ZXJhbFwiKTtcbiAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICB0aGlzLm1pbiA9IG51bWJlcjtcbiAgICB0aGlzLm1heCA9IG51bWJlcjtcbiAgfVxuICBBc3RMaXRlcmFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpO1xuICBBc3RMaXRlcmFsLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdExpdGVyYWwodGhpcyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN0QmluYXJ5T3BlcmF0aW9uKG9wLCBhcmcxLCBhcmcyLCBtaW4sIG1heCkge1xuICAgIEFzdE5vZGUuY2FsbCh0aGlzLCBcImJpbmFyeVwiKTtcbiAgICB0aGlzLm9wID0gb3A7XG4gICAgdGhpcy5hcmcxID0gYXJnMTtcbiAgICB0aGlzLmFyZzIgPSBhcmcyO1xuICAgIHRoaXMubWluID0gbWluO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG4gIEFzdEJpbmFyeU9wZXJhdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtcbiAgQXN0QmluYXJ5T3BlcmF0aW9uLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdEJpbmFyeU9wZXJhdGlvbih0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3RNaW4oYXJnLCBtYXgpIHtcbiAgICBBc3ROb2RlLmNhbGwodGhpcywgXCJtYXhcIik7XG4gICAgdGhpcy5hcmcgPSBhcmc7XG4gICAgdGhpcy5taW4gPSBhcmcubWluO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG4gIEFzdE1pbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtcbiAgQXN0TWluLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdE1pbih0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3RWYXJpYWJsZShpbmRleCwgbWluLCBtYXgpIHtcbiAgICBBc3ROb2RlLmNhbGwodGhpcywgXCJ2YXJcIik7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIHRoaXMubWluID0gbWluO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG4gIEFzdFZhcmlhYmxlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpO1xuICBBc3RWYXJpYWJsZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikge1xuICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZSh0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3RWYXJpYWJsZURlZmluaXRpb24odmFyaWFibGUsIGFyZykge1xuICAgIEFzdE5vZGUuY2FsbCh0aGlzLCBcImRlZmluaXRpb25cIik7XG4gICAgdGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlO1xuICAgIHRoaXMuYXJnID0gYXJnO1xuICB9XG4gIEFzdFZhcmlhYmxlRGVmaW5pdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtcbiAgQXN0VmFyaWFibGVEZWZpbml0aW9uLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgdmlzaXRvci52aXNpdFZhcmlhYmxlRGVmaW5pdGlvbih0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKSB7XG4gICAgdGhpcy5wYXJ0cyA9IFtdO1xuICB9XG4gIEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvci5wcm90b3R5cGUgPSB7XG4gICAgdmlzaXRBcmd1bWVudChhcmcpIHtcbiAgICAgIHRoaXMucGFydHMucHVzaChcbiAgICAgICAgXCJNYXRoLm1heChcIixcbiAgICAgICAgYXJnLm1pbixcbiAgICAgICAgXCIsIE1hdGgubWluKFwiLFxuICAgICAgICBhcmcubWF4LFxuICAgICAgICBcIiwgc3JjW3NyY09mZnNldCArIFwiLFxuICAgICAgICBhcmcuaW5kZXgsXG4gICAgICAgIFwiXSkpXCJcbiAgICAgICk7XG4gICAgfSxcbiAgICB2aXNpdFZhcmlhYmxlKHZhcmlhYmxlKSB7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCJ2XCIsIHZhcmlhYmxlLmluZGV4KTtcbiAgICB9LFxuICAgIHZpc2l0TGl0ZXJhbChsaXRlcmFsKSB7XG4gICAgICB0aGlzLnBhcnRzLnB1c2gobGl0ZXJhbC5udW1iZXIpO1xuICAgIH0sXG4gICAgdmlzaXRCaW5hcnlPcGVyYXRpb24ob3BlcmF0aW9uKSB7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIoXCIpO1xuICAgICAgb3BlcmF0aW9uLmFyZzEudmlzaXQodGhpcyk7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIgXCIsIG9wZXJhdGlvbi5vcCwgXCIgXCIpO1xuICAgICAgb3BlcmF0aW9uLmFyZzIudmlzaXQodGhpcyk7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIpXCIpO1xuICAgIH0sXG4gICAgdmlzaXRWYXJpYWJsZURlZmluaXRpb24oZGVmaW5pdGlvbikge1xuICAgICAgdGhpcy5wYXJ0cy5wdXNoKFwidmFyIFwiKTtcbiAgICAgIGRlZmluaXRpb24udmFyaWFibGUudmlzaXQodGhpcyk7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIgPSBcIik7XG4gICAgICBkZWZpbml0aW9uLmFyZy52aXNpdCh0aGlzKTtcbiAgICAgIHRoaXMucGFydHMucHVzaChcIjtcIik7XG4gICAgfSxcbiAgICB2aXNpdE1pbihtYXgpIHtcbiAgICAgIHRoaXMucGFydHMucHVzaChcIk1hdGgubWluKFwiKTtcbiAgICAgIG1heC5hcmcudmlzaXQodGhpcyk7XG4gICAgICB0aGlzLnBhcnRzLnB1c2goXCIsIFwiLCBtYXgubWF4LCBcIilcIik7XG4gICAgfSxcbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIik7XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSB7XG4gICAgaWYgKG51bTIudHlwZSA9PT0gXCJsaXRlcmFsXCIgJiYgbnVtMi5udW1iZXIgPT09IDApIHtcbiAgICAgIC8vIG9wdGltaXphdGlvbjogc2Vjb25kIG9wZXJhbmQgaXMgMFxuICAgICAgcmV0dXJuIG51bTE7XG4gICAgfVxuICAgIGlmIChudW0xLnR5cGUgPT09IFwibGl0ZXJhbFwiICYmIG51bTEubnVtYmVyID09PSAwKSB7XG4gICAgICAvLyBvcHRpbWl6YXRpb246IGZpcnN0IG9wZXJhbmQgaXMgMFxuICAgICAgcmV0dXJuIG51bTI7XG4gICAgfVxuICAgIGlmIChudW0yLnR5cGUgPT09IFwibGl0ZXJhbFwiICYmIG51bTEudHlwZSA9PT0gXCJsaXRlcmFsXCIpIHtcbiAgICAgIC8vIG9wdGltaXphdGlvbjogb3BlcmFuZHMgb3BlcmFuZCBhcmUgbGl0ZXJhbHNcbiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciArIG51bTIubnVtYmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oXG4gICAgICBcIitcIixcbiAgICAgIG51bTEsXG4gICAgICBudW0yLFxuICAgICAgbnVtMS5taW4gKyBudW0yLm1pbixcbiAgICAgIG51bTEubWF4ICsgbnVtMi5tYXhcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRNdWxPcGVyYXRpb24obnVtMSwgbnVtMikge1xuICAgIGlmIChudW0yLnR5cGUgPT09IFwibGl0ZXJhbFwiKSB7XG4gICAgICAvLyBvcHRpbWl6YXRpb246IHNlY29uZCBvcGVyYW5kcyBpcyBhIGxpdGVyYWwuLi5cbiAgICAgIGlmIChudW0yLm51bWJlciA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwoMCk7IC8vIGFuZCBpdCdzIDBcbiAgICAgIH0gZWxzZSBpZiAobnVtMi5udW1iZXIgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG51bTE7IC8vIGFuZCBpdCdzIDFcbiAgICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSBcImxpdGVyYWxcIikge1xuICAgICAgICAvLyAuLi4gYW5kIGZpcnN0IG9wZXJhbmRzIGlzIGEgbGl0ZXJhbCB0b29cbiAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICogbnVtMi5udW1iZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVtMS50eXBlID09PSBcImxpdGVyYWxcIikge1xuICAgICAgLy8gb3B0aW1pemF0aW9uOiBmaXJzdCBvcGVyYW5kcyBpcyBhIGxpdGVyYWwuLi5cbiAgICAgIGlmIChudW0xLm51bWJlciA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwoMCk7IC8vIGFuZCBpdCdzIDBcbiAgICAgIH0gZWxzZSBpZiAobnVtMS5udW1iZXIgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG51bTI7IC8vIGFuZCBpdCdzIDFcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1pbiA9IE1hdGgubWluKFxuICAgICAgbnVtMS5taW4gKiBudW0yLm1pbixcbiAgICAgIG51bTEubWluICogbnVtMi5tYXgsXG4gICAgICBudW0xLm1heCAqIG51bTIubWluLFxuICAgICAgbnVtMS5tYXggKiBudW0yLm1heFxuICAgICk7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KFxuICAgICAgbnVtMS5taW4gKiBudW0yLm1pbixcbiAgICAgIG51bTEubWluICogbnVtMi5tYXgsXG4gICAgICBudW0xLm1heCAqIG51bTIubWluLFxuICAgICAgbnVtMS5tYXggKiBudW0yLm1heFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oXCIqXCIsIG51bTEsIG51bTIsIG1pbiwgbWF4KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkU3ViT3BlcmF0aW9uKG51bTEsIG51bTIpIHtcbiAgICBpZiAobnVtMi50eXBlID09PSBcImxpdGVyYWxcIikge1xuICAgICAgLy8gb3B0aW1pemF0aW9uOiBzZWNvbmQgb3BlcmFuZHMgaXMgYSBsaXRlcmFsLi4uXG4gICAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bTE7IC8vIC4uLiBhbmQgaXQncyAwXG4gICAgICB9IGVsc2UgaWYgKG51bTEudHlwZSA9PT0gXCJsaXRlcmFsXCIpIHtcbiAgICAgICAgLy8gLi4uIGFuZCBmaXJzdCBvcGVyYW5kcyBpcyBhIGxpdGVyYWwgdG9vXG4gICAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciAtIG51bTIubnVtYmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgbnVtMi50eXBlID09PSBcImJpbmFyeVwiICYmXG4gICAgICBudW0yLm9wID09PSBcIi1cIiAmJlxuICAgICAgbnVtMS50eXBlID09PSBcImxpdGVyYWxcIiAmJlxuICAgICAgbnVtMS5udW1iZXIgPT09IDEgJiZcbiAgICAgIG51bTIuYXJnMS50eXBlID09PSBcImxpdGVyYWxcIiAmJlxuICAgICAgbnVtMi5hcmcxLm51bWJlciA9PT0gMVxuICAgICkge1xuICAgICAgLy8gb3B0aW1pemF0aW9uIGZvciBjYXNlOiAxIC0gKDEgLSB4KVxuICAgICAgcmV0dXJuIG51bTIuYXJnMjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oXG4gICAgICBcIi1cIixcbiAgICAgIG51bTEsXG4gICAgICBudW0yLFxuICAgICAgbnVtMS5taW4gLSBudW0yLm1heCxcbiAgICAgIG51bTEubWF4IC0gbnVtMi5taW5cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRNaW5PcGVyYXRpb24obnVtMSwgbWF4KSB7XG4gICAgaWYgKG51bTEubWluID49IG1heCkge1xuICAgICAgLy8gb3B0aW1pemF0aW9uOiBudW0xIG1pbiB2YWx1ZSBpcyBub3QgbGVzcyB0aGFuIHJlcXVpcmVkIG1heFxuICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG1heCk7IC8vIGp1c3QgcmV0dXJuaW5nIG1heFxuICAgIH0gZWxzZSBpZiAobnVtMS5tYXggPD0gbWF4KSB7XG4gICAgICAvLyBvcHRpbWl6YXRpb246IG51bTEgbWF4IHZhbHVlIGlzIG5vdCBncmVhdGVyIHRoYW4gcmVxdWlyZWQgbWF4XG4gICAgICByZXR1cm4gbnVtMTsgLy8ganVzdCByZXR1cm5pbmcgYW4gYXJndW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBc3RNaW4obnVtMSwgbWF4KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyKCkge31cbiAgUG9zdFNjcmlwdENvbXBpbGVyLnByb3RvdHlwZSA9IHtcbiAgICBjb21waWxlOiBmdW5jdGlvbiBQb3N0U2NyaXB0Q29tcGlsZXJfY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKSB7XG4gICAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICAgIHZhciBpbnN0cnVjdGlvbnMgPSBbXTtcbiAgICAgIHZhciBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoID4+IDEsXG4gICAgICAgIG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggPj4gMTtcbiAgICAgIHZhciBsYXN0UmVnaXN0ZXIgPSAwO1xuICAgICAgdmFyIG4sIGo7XG4gICAgICB2YXIgbnVtMSwgbnVtMiwgYXN0MSwgYXN0MiwgdG1wVmFyLCBpdGVtO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNpemU7IGkrKykge1xuICAgICAgICBzdGFjay5wdXNoKG5ldyBBc3RBcmd1bWVudChpLCBkb21haW5baSAqIDJdLCBkb21haW5baSAqIDIgKyAxXSkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb2RlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaXRlbSA9IGNvZGVbaV07XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHN0YWNrLnB1c2gobmV3IEFzdExpdGVyYWwoaXRlbSkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChpdGVtKSB7XG4gICAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkQWRkT3BlcmF0aW9uKG51bTEsIG51bTIpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjdnJcIjpcbiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm11bFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTXVsT3BlcmF0aW9uKG51bTEsIG51bTIpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJzdWJcIjpcbiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChidWlsZFN1Yk9wZXJhdGlvbihudW0xLCBudW0yKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZXhjaFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3QxID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBhc3QyID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEsIGFzdDIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInBvcFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJpbmRleFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAobnVtMS50eXBlICE9PSBcImxpdGVyYWxcIikge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG4gPSBudW0xLm51bWJlcjtcbiAgICAgICAgICAgIGlmIChuIDwgMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCBzdGFjay5sZW5ndGggPCBuKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXN0MSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXTtcbiAgICAgICAgICAgIGlmIChhc3QxLnR5cGUgPT09IFwibGl0ZXJhbFwiIHx8IGFzdDEudHlwZSA9PT0gXCJ2YXJcIikge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTtcbiAgICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXSA9IHRtcFZhcjtcbiAgICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZHVwXCI6XG4gICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdHlwZW9mIGNvZGVbaSArIDFdID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICAgIGNvZGVbaSArIDJdID09PSBcImd0XCIgJiZcbiAgICAgICAgICAgICAgY29kZVtpICsgM10gPT09IGkgKyA3ICYmXG4gICAgICAgICAgICAgIGNvZGVbaSArIDRdID09PSBcImp6XCIgJiZcbiAgICAgICAgICAgICAgY29kZVtpICsgNV0gPT09IFwicG9wXCIgJiZcbiAgICAgICAgICAgICAgY29kZVtpICsgNl0gPT09IGNvZGVbaSArIDFdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIG9mIHRoZSBjb21tYW5kcyBzZXF1ZW5jZSBmb3IgdGhlIG1pbiBvcGVyYXRpb25cbiAgICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIGNvZGVbaSArIDFdKSk7XG4gICAgICAgICAgICAgIGkgKz0gNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3QxID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAoYXN0MS50eXBlID09PSBcImxpdGVyYWxcIiB8fCBhc3QxLnR5cGUgPT09IFwidmFyXCIpIHtcbiAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSB0byBzYXZlIGludG8gaW50ZXJtZWRpYXRlIHZhcmlhYmxlIGEgbGl0ZXJhbCBvclxuICAgICAgICAgICAgICAvLyB2YXJpYWJsZS5cbiAgICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7XG4gICAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9IHRtcFZhcjtcbiAgICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwicm9sbFwiOlxuICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBpZiAobnVtMi50eXBlICE9PSBcImxpdGVyYWxcIiB8fCBudW0xLnR5cGUgIT09IFwibGl0ZXJhbFwiKSB7XG4gICAgICAgICAgICAgIC8vIGJvdGggcm9sbCBvcGVyYW5kcyBtdXN0IGJlIG51bWJlcnNcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqID0gbnVtMi5udW1iZXI7XG4gICAgICAgICAgICBuID0gbnVtMS5udW1iZXI7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG4gPD0gMCB8fFxuICAgICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fFxuICAgICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihqKSB8fFxuICAgICAgICAgICAgICBzdGFjay5sZW5ndGggPCBuXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gLi4uIGFuZCBpbnRlZ2Vyc1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGogPSAoKGogJSBuKSArIG4pICUgbjtcbiAgICAgICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrOyAvLyBqdXN0IHNraXBwaW5nIC0tIHRoZXJlIGFyZSBub3RoaW5nIHRvIHJvdGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoXG4gICAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgICBzdGFjay5zcGxpY2Uoc3RhY2subGVuZ3RoIC0gbiwgbiAtIGopXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyB1bnN1cHBvcnRlZCBvcGVyYXRvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFjay5sZW5ndGggIT09IG91dHB1dFNpemUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGluc3RydWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnN0cnVjdGlvbikge1xuICAgICAgICB2YXIgc3RhdGVtZW50QnVpbGRlciA9IG5ldyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24udmlzaXQoc3RhdGVtZW50QnVpbGRlcik7XG4gICAgICAgIHJlc3VsdC5wdXNoKHN0YXRlbWVudEJ1aWxkZXIudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICAgIHN0YWNrLmZvckVhY2goZnVuY3Rpb24gKGV4cHIsIGkpIHtcbiAgICAgICAgdmFyIHN0YXRlbWVudEJ1aWxkZXIgPSBuZXcgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yKCk7XG4gICAgICAgIGV4cHIudmlzaXQoc3RhdGVtZW50QnVpbGRlcik7XG4gICAgICAgIHZhciBtaW4gPSByYW5nZVtpICogMl0sXG4gICAgICAgICAgbWF4ID0gcmFuZ2VbaSAqIDIgKyAxXTtcbiAgICAgICAgdmFyIG91dCA9IFtzdGF0ZW1lbnRCdWlsZGVyLnRvU3RyaW5nKCldO1xuICAgICAgICBpZiAobWluID4gZXhwci5taW4pIHtcbiAgICAgICAgICBvdXQudW5zaGlmdChcIk1hdGgubWF4KFwiLCBtaW4sIFwiLCBcIik7XG4gICAgICAgICAgb3V0LnB1c2goXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggPCBleHByLm1heCkge1xuICAgICAgICAgIG91dC51bnNoaWZ0KFwiTWF0aC5taW4oXCIsIG1heCwgXCIsIFwiKTtcbiAgICAgICAgICBvdXQucHVzaChcIilcIik7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LnVuc2hpZnQoXCJkZXN0W2Rlc3RPZmZzZXQgKyBcIiwgaSwgXCJdID0gXCIpO1xuICAgICAgICBvdXQucHVzaChcIjtcIik7XG4gICAgICAgIHJlc3VsdC5wdXNoKG91dC5qb2luKFwiXCIpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXFxuXCIpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIFBvc3RTY3JpcHRDb21waWxlcjtcbn0pKCk7XG5cbmV4cG9ydCB7XG4gIGlzUERGRnVuY3Rpb24sXG4gIFBERkZ1bmN0aW9uRmFjdG9yeSxcbiAgUG9zdFNjcmlwdEV2YWx1YXRvcixcbiAgUG9zdFNjcmlwdENvbXBpbGVyLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgRm9ybWF0RXJyb3IsIHNoYWRvdyB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgRU9GIH0gZnJvbSBcIi4vcHJpbWl0aXZlcy5qc1wiO1xuaW1wb3J0IHsgaXNXaGl0ZVNwYWNlIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuXG5jbGFzcyBQb3N0U2NyaXB0UGFyc2VyIHtcbiAgY29uc3RydWN0b3IobGV4ZXIpIHtcbiAgICB0aGlzLmxleGVyID0gbGV4ZXI7XG4gICAgdGhpcy5vcGVyYXRvcnMgPSBbXTtcbiAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICB9XG5cbiAgbmV4dFRva2VuKCkge1xuICAgIHRoaXMucHJldiA9IHRoaXMudG9rZW47XG4gICAgdGhpcy50b2tlbiA9IHRoaXMubGV4ZXIuZ2V0VG9rZW4oKTtcbiAgfVxuXG4gIGFjY2VwdCh0eXBlKSB7XG4gICAgaWYgKHRoaXMudG9rZW4udHlwZSA9PT0gdHlwZSkge1xuICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBleHBlY3QodHlwZSkge1xuICAgIGlmICh0aGlzLmFjY2VwdCh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgIGBVbmV4cGVjdGVkIHN5bWJvbDogZm91bmQgJHt0aGlzLnRva2VuLnR5cGV9IGV4cGVjdGVkICR7dHlwZX0uYFxuICAgICk7XG4gIH1cblxuICBwYXJzZSgpIHtcbiAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgIHRoaXMuZXhwZWN0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSk7XG4gICAgdGhpcy5wYXJzZUJsb2NrKCk7XG4gICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnM7XG4gIH1cblxuICBwYXJzZUJsb2NrKCkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuTlVNQkVSKSkge1xuICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk9QRVJBVE9SKSkge1xuICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSkpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNvbmRpdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlQ29uZGl0aW9uKCkge1xuICAgIC8vIEFkZCB0d28gcGxhY2UgaG9sZGVycyB0aGF0IHdpbGwgYmUgdXBkYXRlZCBsYXRlclxuICAgIGNvbnN0IGNvbmRpdGlvbkxvY2F0aW9uID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoO1xuICAgIHRoaXMub3BlcmF0b3JzLnB1c2gobnVsbCwgbnVsbCk7XG5cbiAgICB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpO1xuICAgIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRikpIHtcbiAgICAgIC8vIFRoZSB0cnVlIGJsb2NrIGlzIHJpZ2h0IGFmdGVyIHRoZSAnaWYnIHNvIGl0IGp1c3QgZmFsbHMgdGhyb3VnaCBvbiB0cnVlXG4gICAgICAvLyBlbHNlIGl0IGp1bXBzIGFuZCBza2lwcyB0aGUgdHJ1ZSBibG9jay5cbiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDtcbiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSBcImp6XCI7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7XG4gICAgICBjb25zdCBqdW1wTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7XG4gICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsIG51bGwpO1xuICAgICAgY29uc3QgZW5kT2ZUcnVlID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoO1xuICAgICAgdGhpcy5wYXJzZUJsb2NrKCk7XG4gICAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpO1xuICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFKTtcbiAgICAgIC8vIFRoZSBqdW1wIGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHRydWUgYmxvY2sgdG8gc2tpcCB0aGUgZmFsc2UgYmxvY2suXG4gICAgICB0aGlzLm9wZXJhdG9yc1tqdW1wTG9jYXRpb25dID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoO1xuICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uICsgMV0gPSBcImpcIjtcblxuICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb25dID0gZW5kT2ZUcnVlO1xuICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb24gKyAxXSA9IFwianpcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiUFMgRnVuY3Rpb246IGVycm9yIHBhcnNpbmcgY29uZGl0aW9uYWwuXCIpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBQb3N0U2NyaXB0VG9rZW5UeXBlcyA9IHtcbiAgTEJSQUNFOiAwLFxuICBSQlJBQ0U6IDEsXG4gIE5VTUJFUjogMixcbiAgT1BFUkFUT1I6IDMsXG4gIElGOiA0LFxuICBJRkVMU0U6IDUsXG59O1xuXG5jb25zdCBQb3N0U2NyaXB0VG9rZW4gPSAoZnVuY3Rpb24gUG9zdFNjcmlwdFRva2VuQ2xvc3VyZSgpIHtcbiAgY29uc3Qgb3BDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBjbGFzcyBQb3N0U2NyaXB0VG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRPcGVyYXRvcihvcCkge1xuICAgICAgY29uc3Qgb3BWYWx1ZSA9IG9wQ2FjaGVbb3BdO1xuICAgICAgaWYgKG9wVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG9wQ2FjaGVbb3BdID0gbmV3IFBvc3RTY3JpcHRUb2tlbihcbiAgICAgICAgUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IsXG4gICAgICAgIG9wXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IExCUkFDRSgpIHtcbiAgICAgIHJldHVybiBzaGFkb3coXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiTEJSQUNFXCIsXG4gICAgICAgIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFLCBcIntcIilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBSQlJBQ0UoKSB7XG4gICAgICByZXR1cm4gc2hhZG93KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlJCUkFDRVwiLFxuICAgICAgICBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLlJCUkFDRSwgXCJ9XCIpXG4gICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgSUYoKSB7XG4gICAgICByZXR1cm4gc2hhZG93KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIklGXCIsXG4gICAgICAgIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuSUYsIFwiSUZcIilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBJRkVMU0UoKSB7XG4gICAgICByZXR1cm4gc2hhZG93KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIklGRUxTRVwiLFxuICAgICAgICBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLklGRUxTRSwgXCJJRkVMU0VcIilcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBQb3N0U2NyaXB0VG9rZW47XG59KSgpO1xuXG5jbGFzcyBQb3N0U2NyaXB0TGV4ZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLm5leHRDaGFyKCk7XG5cbiAgICB0aGlzLnN0ckJ1ZiA9IFtdO1xuICB9XG5cbiAgbmV4dENoYXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKTtcbiAgfVxuXG4gIGdldFRva2VuKCkge1xuICAgIGxldCBjb21tZW50ID0gZmFsc2U7XG4gICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjtcblxuICAgIC8vIHNraXAgY29tbWVudHNcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGNoIDwgMCkge1xuICAgICAgICByZXR1cm4gRU9GO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHtcbiAgICAgICAgICBjb21tZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IC8qICclJyA9ICovIDB4MjUpIHtcbiAgICAgICAgY29tbWVudCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7XG4gICAgfVxuICAgIHN3aXRjaCAoY2ggfCAwKSB7XG4gICAgICBjYXNlIDB4MzA6IC8vICcwJ1xuICAgICAgY2FzZSAweDMxOiAvLyAnMSdcbiAgICAgIGNhc2UgMHgzMjogLy8gJzInXG4gICAgICBjYXNlIDB4MzM6IC8vICczJ1xuICAgICAgY2FzZSAweDM0OiAvLyAnNCdcbiAgICAgIGNhc2UgMHgzNTogLy8gJzUnXG4gICAgICBjYXNlIDB4MzY6IC8vICc2J1xuICAgICAgY2FzZSAweDM3OiAvLyAnNydcbiAgICAgIGNhc2UgMHgzODogLy8gJzgnXG4gICAgICBjYXNlIDB4Mzk6IC8vICc5J1xuICAgICAgY2FzZSAweDJiOiAvLyAnKydcbiAgICAgIGNhc2UgMHgyZDogLy8gJy0nXG4gICAgICBjYXNlIDB4MmU6IC8vICcuJ1xuICAgICAgICByZXR1cm4gbmV3IFBvc3RTY3JpcHRUb2tlbihcbiAgICAgICAgICBQb3N0U2NyaXB0VG9rZW5UeXBlcy5OVU1CRVIsXG4gICAgICAgICAgdGhpcy5nZXROdW1iZXIoKVxuICAgICAgICApO1xuICAgICAgY2FzZSAweDdiOiAvLyAneydcbiAgICAgICAgdGhpcy5uZXh0Q2hhcigpO1xuICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTtcbiAgICAgIGNhc2UgMHg3ZDogLy8gJ30nXG4gICAgICAgIHRoaXMubmV4dENoYXIoKTtcbiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5SQlJBQ0U7XG4gICAgfVxuICAgIC8vIG9wZXJhdG9yXG4gICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7XG4gICAgc3RyQnVmLmxlbmd0aCA9IDA7XG4gICAgc3RyQnVmWzBdID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG5cbiAgICB3aGlsZSAoXG4gICAgICAoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiZcbiAgICAgICgoY2ggPj0gLyogJ0EnID0gKi8gMHg0MSAmJiBjaCA8PSAvKiAnWicgPSAqLyAweDVhKSB8fFxuICAgICAgICAoY2ggPj0gLyogJ2EnID0gKi8gMHg2MSAmJiBjaCA8PSAvKiAneicgPSAqLyAweDdhKSlcbiAgICApIHtcbiAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyID0gc3RyQnVmLmpvaW4oXCJcIik7XG4gICAgc3dpdGNoIChzdHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImlmXCI6XG4gICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7XG4gICAgICBjYXNlIFwiaWZlbHNlXCI6XG4gICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUZFTFNFO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5nZXRPcGVyYXRvcihzdHIpO1xuICAgIH1cbiAgfVxuXG4gIGdldE51bWJlcigpIHtcbiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyO1xuICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmO1xuICAgIHN0ckJ1Zi5sZW5ndGggPSAwO1xuICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuXG4gICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkge1xuICAgICAgaWYgKFxuICAgICAgICAoY2ggPj0gLyogJzAnID0gKi8gMHgzMCAmJiBjaCA8PSAvKiAnOScgPSAqLyAweDM5KSB8fFxuICAgICAgICBjaCA9PT0gLyogJy0nID0gKi8gMHgyZCB8fFxuICAgICAgICBjaCA9PT0gLyogJy4nID0gKi8gMHgyZVxuICAgICAgKSB7XG4gICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3RyQnVmLmpvaW4oXCJcIikpO1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXI6ICR7dmFsdWV9YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgeyBQb3N0U2NyaXB0TGV4ZXIsIFBvc3RTY3JpcHRQYXJzZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbi8vIENoYXJhY3RlciB0eXBlcyBmb3Igc3ltYm9scyBmcm9tIDAwMDAgdG8gMDBGRi5cbi8vIFNvdXJjZTogZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1VuaWNvZGVEYXRhLnR4dFxuLy8gcHJldHRpZXItaWdub3JlXG52YXIgYmFzZVR5cGVzID0gW1xuICBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIlNcIiwgXCJCXCIsIFwiU1wiLFxuICBcIldTXCIsIFwiQlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsXG4gIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCXCIsIFwiQlwiLCBcIkJcIiwgXCJTXCIsIFwiV1NcIiwgXCJPTlwiLCBcIk9OXCIsIFwiRVRcIixcbiAgXCJFVFwiLCBcIkVUXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIkVTXCIsIFwiQ1NcIiwgXCJFU1wiLCBcIkNTXCIsIFwiQ1NcIixcbiAgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkNTXCIsIFwiT05cIixcbiAgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIixcbiAgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLFxuICBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJMXCIsIFwiTFwiLCBcIkxcIixcbiAgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLFxuICBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsXG4gIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIixcbiAgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIixcbiAgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJCTlwiLCBcIkJOXCIsIFwiQk5cIiwgXCJDU1wiLCBcIk9OXCIsIFwiRVRcIixcbiAgXCJFVFwiLCBcIkVUXCIsIFwiRVRcIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIkxcIiwgXCJPTlwiLCBcIk9OXCIsIFwiQk5cIiwgXCJPTlwiLFxuICBcIk9OXCIsIFwiRVRcIiwgXCJFVFwiLCBcIkVOXCIsIFwiRU5cIiwgXCJPTlwiLCBcIkxcIiwgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJFTlwiLCBcIkxcIixcbiAgXCJPTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJPTlwiLCBcIk9OXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIixcbiAgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLFxuICBcIkxcIiwgXCJPTlwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLFxuICBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsXG4gIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJPTlwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCIsIFwiTFwiLCBcIkxcIiwgXCJMXCJcbl07XG5cbi8vIENoYXJhY3RlciB0eXBlcyBmb3Igc3ltYm9scyBmcm9tIDA2MDAgdG8gMDZGRi5cbi8vIFNvdXJjZTogZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1VuaWNvZGVEYXRhLnR4dFxuLy8gTm90ZSB0aGF0IDA2MUQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIFVuaWNvZGUgc3RhbmRhcmQgKHNlZVxuLy8gaHR0cDovL3VuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTA2MDAucGRmKSwgc28gd2UgcmVwbGFjZSBpdCB3aXRoIGFuXG4vLyBlbXB0eSBzdHJpbmcgYW5kIGlzc3VlIGEgd2FybmluZyBpZiB3ZSBlbmNvdW50ZXIgdGhpcyBjaGFyYWN0ZXIuIFRoZVxuLy8gZW1wdHkgc3RyaW5nIGlzIHJlcXVpcmVkIHRvIHByb3Blcmx5IGluZGV4IHRoZSBpdGVtcyBhZnRlciBpdC5cbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGFyYWJpY1R5cGVzID0gW1xuICBcIkFOXCIsIFwiQU5cIiwgXCJBTlwiLCBcIkFOXCIsIFwiQU5cIiwgXCJBTlwiLCBcIk9OXCIsIFwiT05cIiwgXCJBTFwiLCBcIkVUXCIsIFwiRVRcIiwgXCJBTFwiLFxuICBcIkNTXCIsIFwiQUxcIiwgXCJPTlwiLCBcIk9OXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsXG4gIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiTlNNXCIsIFwiQUxcIiwgXCJBTFwiLCBcIlwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIixcbiAgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIixcbiAgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIixcbiAgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIixcbiAgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLFxuICBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLFxuICBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIkFOXCIsIFwiQU5cIiwgXCJBTlwiLCBcIkFOXCIsIFwiQU5cIiwgXCJBTlwiLCBcIkFOXCIsXG4gIFwiQU5cIiwgXCJBTlwiLCBcIkFOXCIsIFwiRVRcIiwgXCJBTlwiLCBcIkFOXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiTlNNXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLFxuICBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIk5TTVwiLCBcIkFOXCIsXG4gIFwiT05cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJBTFwiLCBcIkFMXCIsIFwiTlNNXCIsIFwiTlNNXCIsXG4gIFwiT05cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJOU01cIiwgXCJBTFwiLCBcIkFMXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIixcbiAgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJFTlwiLCBcIkVOXCIsIFwiRU5cIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIiwgXCJBTFwiLCBcIkFMXCIsIFwiQUxcIlxuXTtcblxuZnVuY3Rpb24gaXNPZGQoaSkge1xuICByZXR1cm4gKGkgJiAxKSAhPT0gMDtcbn1cblxuZnVuY3Rpb24gaXNFdmVuKGkpIHtcbiAgcmV0dXJuIChpICYgMSkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRVbmVxdWFsKGFyciwgc3RhcnQsIHZhbHVlKSB7XG4gIGZvciAodmFyIGogPSBzdGFydCwgamogPSBhcnIubGVuZ3RoOyBqIDwgamo7ICsraikge1xuICAgIGlmIChhcnJbal0gIT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gajtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGo7XG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlcyhhcnIsIHN0YXJ0LCBlbmQsIHZhbHVlKSB7XG4gIGZvciAodmFyIGogPSBzdGFydDsgaiA8IGVuZDsgKytqKSB7XG4gICAgYXJyW2pdID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVZhbHVlcyhhcnIsIHN0YXJ0LCBlbmQpIHtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gMTsgaSA8IGo7ICsraSwgLS1qKSB7XG4gICAgdmFyIHRlbXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRlbXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUiwgdmVydGljYWwgPSBmYWxzZSkge1xuICBsZXQgZGlyID0gXCJsdHJcIjtcbiAgaWYgKHZlcnRpY2FsKSB7XG4gICAgZGlyID0gXCJ0dGJcIjtcbiAgfSBlbHNlIGlmICghaXNMVFIpIHtcbiAgICBkaXIgPSBcInJ0bFwiO1xuICB9XG4gIHJldHVybiB7IHN0ciwgZGlyIH07XG59XG5cbi8vIFRoZXNlIGFyZSB1c2VkIGluIGJpZGkoKSwgd2hpY2ggaXMgY2FsbGVkIGZyZXF1ZW50bHkuIFdlIHJlLXVzZSB0aGVtIG9uXG4vLyBlYWNoIGNhbGwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYWxsb2NhdGlvbnMuXG52YXIgY2hhcnMgPSBbXTtcbnZhciB0eXBlcyA9IFtdO1xuXG5mdW5jdGlvbiBiaWRpKHN0ciwgc3RhcnRMZXZlbCwgdmVydGljYWwpIHtcbiAgdmFyIGlzTFRSID0gdHJ1ZTtcbiAgdmFyIHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIGlmIChzdHJMZW5ndGggPT09IDAgfHwgdmVydGljYWwpIHtcbiAgICByZXR1cm4gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUiwgdmVydGljYWwpO1xuICB9XG5cbiAgLy8gR2V0IHR5cGVzIGFuZCBmaWxsIGFycmF5c1xuICBjaGFycy5sZW5ndGggPSBzdHJMZW5ndGg7XG4gIHR5cGVzLmxlbmd0aCA9IHN0ckxlbmd0aDtcbiAgdmFyIG51bUJpZGkgPSAwO1xuXG4gIHZhciBpLCBpaTtcbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgY2hhcnNbaV0gPSBzdHIuY2hhckF0KGkpO1xuXG4gICAgdmFyIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgdmFyIGNoYXJUeXBlID0gXCJMXCI7XG4gICAgaWYgKGNoYXJDb2RlIDw9IDB4MDBmZikge1xuICAgICAgY2hhclR5cGUgPSBiYXNlVHlwZXNbY2hhckNvZGVdO1xuICAgIH0gZWxzZSBpZiAoMHgwNTkwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDVmNCkge1xuICAgICAgY2hhclR5cGUgPSBcIlJcIjtcbiAgICB9IGVsc2UgaWYgKDB4MDYwMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDA2ZmYpIHtcbiAgICAgIGNoYXJUeXBlID0gYXJhYmljVHlwZXNbY2hhckNvZGUgJiAweGZmXTtcbiAgICAgIGlmICghY2hhclR5cGUpIHtcbiAgICAgICAgd2FybihcIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgXCIgKyBjaGFyQ29kZS50b1N0cmluZygxNikpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoMHgwNzAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDhhYykge1xuICAgICAgY2hhclR5cGUgPSBcIkFMXCI7XG4gICAgfVxuICAgIGlmIChjaGFyVHlwZSA9PT0gXCJSXCIgfHwgY2hhclR5cGUgPT09IFwiQUxcIiB8fCBjaGFyVHlwZSA9PT0gXCJBTlwiKSB7XG4gICAgICBudW1CaWRpKys7XG4gICAgfVxuICAgIHR5cGVzW2ldID0gY2hhclR5cGU7XG4gIH1cblxuICAvLyBEZXRlY3QgdGhlIGJpZGkgbWV0aG9kXG4gIC8vIC0gSWYgdGhlcmUgYXJlIG5vIHJ0bCBjaGFyYWN0ZXJzIHRoZW4gbm8gYmlkaSBuZWVkZWRcbiAgLy8gLSBJZiBsZXNzIHRoYW4gMzAlIGNoYXJzIGFyZSBydGwgdGhlbiBzdHJpbmcgaXMgcHJpbWFyaWx5IGx0clxuICAvLyAtIElmIG1vcmUgdGhhbiAzMCUgY2hhcnMgYXJlIHJ0bCB0aGVuIHN0cmluZyBpcyBwcmltYXJpbHkgcnRsXG4gIGlmIChudW1CaWRpID09PSAwKSB7XG4gICAgaXNMVFIgPSB0cnVlO1xuICAgIHJldHVybiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSKTtcbiAgfVxuXG4gIGlmIChzdGFydExldmVsID09PSAtMSkge1xuICAgIGlmIChudW1CaWRpIC8gc3RyTGVuZ3RoIDwgMC4zKSB7XG4gICAgICBpc0xUUiA9IHRydWU7XG4gICAgICBzdGFydExldmVsID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNMVFIgPSBmYWxzZTtcbiAgICAgIHN0YXJ0TGV2ZWwgPSAxO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsZXZlbHMgPSBbXTtcbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgbGV2ZWxzW2ldID0gc3RhcnRMZXZlbDtcbiAgfVxuXG4gIC8qXG4gICBYMS1YMTA6IHNraXAgbW9zdCBvZiB0aGlzLCBzaW5jZSB3ZSBhcmUgTk9UIGRvaW5nIHRoZSBlbWJlZGRpbmdzLlxuICAgKi9cbiAgdmFyIGUgPSBpc09kZChzdGFydExldmVsKSA/IFwiUlwiIDogXCJMXCI7XG4gIHZhciBzb3IgPSBlO1xuICB2YXIgZW9yID0gc29yO1xuXG4gIC8qXG4gICBXMS4gRXhhbWluZSBlYWNoIG5vbi1zcGFjaW5nIG1hcmsgKE5TTSkgaW4gdGhlIGxldmVsIHJ1biwgYW5kIGNoYW5nZSB0aGVcbiAgIHR5cGUgb2YgdGhlIE5TTSB0byB0aGUgdHlwZSBvZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZVxuICAgc3RhcnQgb2YgdGhlIGxldmVsIHJ1biwgaXQgd2lsbCBnZXQgdGhlIHR5cGUgb2Ygc29yLlxuICAgKi9cbiAgdmFyIGxhc3RUeXBlID0gc29yO1xuICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodHlwZXNbaV0gPT09IFwiTlNNXCIpIHtcbiAgICAgIHR5cGVzW2ldID0gbGFzdFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RUeXBlID0gdHlwZXNbaV07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlciB1bnRpbCB0aGVcbiAgIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBBTCwgb3Igc29yKSBpcyBmb3VuZC4gIElmIGFuIEFMIGlzIGZvdW5kLCBjaGFuZ2VcbiAgIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljIG51bWJlci5cbiAgICovXG4gIGxhc3RUeXBlID0gc29yO1xuICB2YXIgdDtcbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgdCA9IHR5cGVzW2ldO1xuICAgIGlmICh0ID09PSBcIkVOXCIpIHtcbiAgICAgIHR5cGVzW2ldID0gbGFzdFR5cGUgPT09IFwiQUxcIiA/IFwiQU5cIiA6IFwiRU5cIjtcbiAgICB9IGVsc2UgaWYgKHQgPT09IFwiUlwiIHx8IHQgPT09IFwiTFwiIHx8IHQgPT09IFwiQUxcIikge1xuICAgICAgbGFzdFR5cGUgPSB0O1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBXMy4gQ2hhbmdlIGFsbCBBTHMgdG8gUi5cbiAgICovXG4gIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkge1xuICAgIHQgPSB0eXBlc1tpXTtcbiAgICBpZiAodCA9PT0gXCJBTFwiKSB7XG4gICAgICB0eXBlc1tpXSA9IFwiUlwiO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBXNC4gQSBzaW5nbGUgRXVyb3BlYW4gc2VwYXJhdG9yIGJldHdlZW4gdHdvIEV1cm9wZWFuIG51bWJlcnMgY2hhbmdlcyB0byBhXG4gICBFdXJvcGVhbiBudW1iZXIuIEEgc2luZ2xlIGNvbW1vbiBzZXBhcmF0b3IgYmV0d2VlbiB0d28gbnVtYmVycyBvZiB0aGUgc2FtZVxuICAgdHlwZSBjaGFuZ2VzIHRvIHRoYXQgdHlwZTpcbiAgICovXG4gIGZvciAoaSA9IDE7IGkgPCBzdHJMZW5ndGggLSAxOyArK2kpIHtcbiAgICBpZiAodHlwZXNbaV0gPT09IFwiRVNcIiAmJiB0eXBlc1tpIC0gMV0gPT09IFwiRU5cIiAmJiB0eXBlc1tpICsgMV0gPT09IFwiRU5cIikge1xuICAgICAgdHlwZXNbaV0gPSBcIkVOXCI7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVzW2ldID09PSBcIkNTXCIgJiZcbiAgICAgICh0eXBlc1tpIC0gMV0gPT09IFwiRU5cIiB8fCB0eXBlc1tpIC0gMV0gPT09IFwiQU5cIikgJiZcbiAgICAgIHR5cGVzW2kgKyAxXSA9PT0gdHlwZXNbaSAtIDFdXG4gICAgKSB7XG4gICAgICB0eXBlc1tpXSA9IHR5cGVzW2kgLSAxXTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgVzUuIEEgc2VxdWVuY2Ugb2YgRXVyb3BlYW4gdGVybWluYXRvcnMgYWRqYWNlbnQgdG8gRXVyb3BlYW4gbnVtYmVycyBjaGFuZ2VzXG4gICB0byBhbGwgRXVyb3BlYW4gbnVtYmVyczpcbiAgICovXG4gIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkge1xuICAgIGlmICh0eXBlc1tpXSA9PT0gXCJFTlwiKSB7XG4gICAgICAvLyBkbyBiZWZvcmVcbiAgICAgIHZhciBqO1xuICAgICAgZm9yIChqID0gaSAtIDE7IGogPj0gMDsgLS1qKSB7XG4gICAgICAgIGlmICh0eXBlc1tqXSAhPT0gXCJFVFwiKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdHlwZXNbal0gPSBcIkVOXCI7XG4gICAgICB9XG4gICAgICAvLyBkbyBhZnRlclxuICAgICAgZm9yIChqID0gaSArIDE7IGogPCBzdHJMZW5ndGg7ICsraikge1xuICAgICAgICBpZiAodHlwZXNbal0gIT09IFwiRVRcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHR5cGVzW2pdID0gXCJFTlwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXIgTmV1dHJhbDpcbiAgICovXG4gIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkge1xuICAgIHQgPSB0eXBlc1tpXTtcbiAgICBpZiAodCA9PT0gXCJXU1wiIHx8IHQgPT09IFwiRVNcIiB8fCB0ID09PSBcIkVUXCIgfHwgdCA9PT0gXCJDU1wiKSB7XG4gICAgICB0eXBlc1tpXSA9IFwiT05cIjtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgVzcuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyIHVudGlsIHRoZVxuICAgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuIEwgaXMgZm91bmQsICB0aGVuIGNoYW5nZVxuICAgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBMLlxuICAgKi9cbiAgbGFzdFR5cGUgPSBzb3I7XG4gIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkge1xuICAgIHQgPSB0eXBlc1tpXTtcbiAgICBpZiAodCA9PT0gXCJFTlwiKSB7XG4gICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlID09PSBcIkxcIiA/IFwiTFwiIDogXCJFTlwiO1xuICAgIH0gZWxzZSBpZiAodCA9PT0gXCJSXCIgfHwgdCA9PT0gXCJMXCIpIHtcbiAgICAgIGxhc3RUeXBlID0gdDtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgTjEuIEEgc2VxdWVuY2Ugb2YgbmV1dHJhbHMgdGFrZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3Vycm91bmRpbmcgc3Ryb25nXG4gICB0ZXh0IGlmIHRoZSB0ZXh0IG9uIGJvdGggc2lkZXMgaGFzIHRoZSBzYW1lIGRpcmVjdGlvbi4gRXVyb3BlYW4gYW5kIEFyYWJpY1xuICAgbnVtYmVycyBhcmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIFIuIFN0YXJ0LW9mLWxldmVsLXJ1biAoc29yKSBhbmRcbiAgIGVuZC1vZi1sZXZlbC1ydW4gKGVvcikgYXJlIHVzZWQgYXQgbGV2ZWwgcnVuIGJvdW5kYXJpZXMuXG4gICAqL1xuICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodHlwZXNbaV0gPT09IFwiT05cIikge1xuICAgICAgdmFyIGVuZCA9IGZpbmRVbmVxdWFsKHR5cGVzLCBpICsgMSwgXCJPTlwiKTtcbiAgICAgIHZhciBiZWZvcmUgPSBzb3I7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgYmVmb3JlID0gdHlwZXNbaSAtIDFdO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWZ0ZXIgPSBlb3I7XG4gICAgICBpZiAoZW5kICsgMSA8IHN0ckxlbmd0aCkge1xuICAgICAgICBhZnRlciA9IHR5cGVzW2VuZCArIDFdO1xuICAgICAgfVxuICAgICAgaWYgKGJlZm9yZSAhPT0gXCJMXCIpIHtcbiAgICAgICAgYmVmb3JlID0gXCJSXCI7XG4gICAgICB9XG4gICAgICBpZiAoYWZ0ZXIgIT09IFwiTFwiKSB7XG4gICAgICAgIGFmdGVyID0gXCJSXCI7XG4gICAgICB9XG4gICAgICBpZiAoYmVmb3JlID09PSBhZnRlcikge1xuICAgICAgICBzZXRWYWx1ZXModHlwZXMsIGksIGVuZCwgYmVmb3JlKTtcbiAgICAgIH1cbiAgICAgIGkgPSBlbmQgLSAxOyAvLyByZXNldCB0byBlbmQgKC0xIHNvIG5leHQgaXRlcmF0aW9uIGlzIG9rKVxuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBOMi4gQW55IHJlbWFpbmluZyBuZXV0cmFscyB0YWtlIHRoZSBlbWJlZGRpbmcgZGlyZWN0aW9uLlxuICAgKi9cbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHR5cGVzW2ldID09PSBcIk9OXCIpIHtcbiAgICAgIHR5cGVzW2ldID0gZTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgSTEuIEZvciBhbGwgY2hhcmFjdGVycyB3aXRoIGFuIGV2ZW4gKGxlZnQtdG8tcmlnaHQpIGVtYmVkZGluZyBkaXJlY3Rpb24sXG4gICB0aG9zZSBvZiB0eXBlIFIgZ28gdXAgb25lIGxldmVsIGFuZCB0aG9zZSBvZiB0eXBlIEFOIG9yIEVOIGdvIHVwIHR3b1xuICAgbGV2ZWxzLlxuICAgSTIuIEZvciBhbGwgY2hhcmFjdGVycyB3aXRoIGFuIG9kZCAocmlnaHQtdG8tbGVmdCkgZW1iZWRkaW5nIGRpcmVjdGlvbixcbiAgIHRob3NlIG9mIHR5cGUgTCwgRU4gb3IgQU4gZ28gdXAgb25lIGxldmVsLlxuICAgKi9cbiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7XG4gICAgdCA9IHR5cGVzW2ldO1xuICAgIGlmIChpc0V2ZW4obGV2ZWxzW2ldKSkge1xuICAgICAgaWYgKHQgPT09IFwiUlwiKSB7XG4gICAgICAgIGxldmVsc1tpXSArPSAxO1xuICAgICAgfSBlbHNlIGlmICh0ID09PSBcIkFOXCIgfHwgdCA9PT0gXCJFTlwiKSB7XG4gICAgICAgIGxldmVsc1tpXSArPSAyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpc09kZFxuICAgICAgaWYgKHQgPT09IFwiTFwiIHx8IHQgPT09IFwiQU5cIiB8fCB0ID09PSBcIkVOXCIpIHtcbiAgICAgICAgbGV2ZWxzW2ldICs9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIEwxLiBPbiBlYWNoIGxpbmUsIHJlc2V0IHRoZSBlbWJlZGRpbmcgbGV2ZWwgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIHRvXG4gICB0aGUgcGFyYWdyYXBoIGVtYmVkZGluZyBsZXZlbDpcblxuICAgc2VnbWVudCBzZXBhcmF0b3JzLFxuICAgcGFyYWdyYXBoIHNlcGFyYXRvcnMsXG4gICBhbnkgc2VxdWVuY2Ugb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyBhIHNlZ21lbnQgc2VwYXJhdG9yIG9yXG4gICBwYXJhZ3JhcGggc2VwYXJhdG9yLCBhbmQgYW55IHNlcXVlbmNlIG9mIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgYXQgdGhlIGVuZFxuICAgb2YgdGhlIGxpbmUuXG4gICAqL1xuXG4gIC8vIGRvbid0IGJvdGhlciBhcyB0ZXh0IGlzIG9ubHkgc2luZ2xlIGxpbmVcblxuICAvKlxuICAgTDIuIEZyb20gdGhlIGhpZ2hlc3QgbGV2ZWwgZm91bmQgaW4gdGhlIHRleHQgdG8gdGhlIGxvd2VzdCBvZGQgbGV2ZWwgb25cbiAgIGVhY2ggbGluZSwgcmV2ZXJzZSBhbnkgY29udGlndW91cyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGF0IHRoYXRcbiAgIGxldmVsIG9yIGhpZ2hlci5cbiAgICovXG5cbiAgLy8gZmluZCBoaWdoZXN0IGxldmVsICYgbG93ZXN0IG9kZCBsZXZlbFxuICB2YXIgaGlnaGVzdExldmVsID0gLTE7XG4gIHZhciBsb3dlc3RPZGRMZXZlbCA9IDk5O1xuICB2YXIgbGV2ZWw7XG4gIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICBsZXZlbCA9IGxldmVsc1tpXTtcbiAgICBpZiAoaGlnaGVzdExldmVsIDwgbGV2ZWwpIHtcbiAgICAgIGhpZ2hlc3RMZXZlbCA9IGxldmVsO1xuICAgIH1cbiAgICBpZiAobG93ZXN0T2RkTGV2ZWwgPiBsZXZlbCAmJiBpc09kZChsZXZlbCkpIHtcbiAgICAgIGxvd2VzdE9kZExldmVsID0gbGV2ZWw7XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJldmVyc2UgYmV0d2VlbiB0aG9zZSBsaW1pdHNcbiAgZm9yIChsZXZlbCA9IGhpZ2hlc3RMZXZlbDsgbGV2ZWwgPj0gbG93ZXN0T2RkTGV2ZWw7IC0tbGV2ZWwpIHtcbiAgICAvLyBmaW5kIHNlZ21lbnRzIHRvIHJldmVyc2VcbiAgICB2YXIgc3RhcnQgPSAtMTtcbiAgICBmb3IgKGkgPSAwLCBpaSA9IGxldmVscy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICBpZiAobGV2ZWxzW2ldIDwgbGV2ZWwpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICByZXZlcnNlVmFsdWVzKGNoYXJzLCBzdGFydCwgaSk7XG4gICAgICAgICAgc3RhcnQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgcmV2ZXJzZVZhbHVlcyhjaGFycywgc3RhcnQsIGxldmVscy5sZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBMMy4gQ29tYmluaW5nIG1hcmtzIGFwcGxpZWQgdG8gYSByaWdodC10by1sZWZ0IGJhc2UgY2hhcmFjdGVyIHdpbGwgYXQgdGhpc1xuICAgcG9pbnQgcHJlY2VkZSB0aGVpciBiYXNlIGNoYXJhY3Rlci4gSWYgdGhlIHJlbmRlcmluZyBlbmdpbmUgZXhwZWN0cyB0aGVtIHRvXG4gICBmb2xsb3cgdGhlIGJhc2UgY2hhcmFjdGVycyBpbiB0aGUgZmluYWwgZGlzcGxheSBwcm9jZXNzLCB0aGVuIHRoZSBvcmRlcmluZ1xuICAgb2YgdGhlIG1hcmtzIGFuZCB0aGUgYmFzZSBjaGFyYWN0ZXIgbXVzdCBiZSByZXZlcnNlZC5cbiAgICovXG5cbiAgLy8gZG9uJ3QgYm90aGVyIGZvciBub3dcblxuICAvKlxuICAgTDQuIEEgY2hhcmFjdGVyIHRoYXQgcG9zc2Vzc2VzIHRoZSBtaXJyb3JlZCBwcm9wZXJ0eSBhcyBzcGVjaWZpZWQgYnlcbiAgIFNlY3Rpb24gNC43LCBNaXJyb3JlZCwgbXVzdCBiZSBkZXBpY3RlZCBieSBhIG1pcnJvcmVkIGdseXBoIGlmIHRoZSByZXNvbHZlZFxuICAgZGlyZWN0aW9uYWxpdHkgb2YgdGhhdCBjaGFyYWN0ZXIgaXMgUi5cbiAgICovXG5cbiAgLy8gZG9uJ3QgbWlycm9yIGFzIGNoYXJhY3RlcnMgYXJlIGFscmVhZHkgbWlycm9yZWQgaW4gdGhlIHBkZlxuXG4gIC8vIEZpbmFsbHksIHJldHVybiBzdHJpbmdcbiAgZm9yIChpID0gMCwgaWkgPSBjaGFycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgdmFyIGNoID0gY2hhcnNbaV07XG4gICAgaWYgKGNoID09PSBcIjxcIiB8fCBjaCA9PT0gXCI+XCIpIHtcbiAgICAgIGNoYXJzW2ldID0gXCJcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KGNoYXJzLmpvaW4oXCJcIiksIGlzTFRSKTtcbn1cblxuZXhwb3J0IHsgYmlkaSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldExvb2t1cFRhYmxlRmFjdG9yeSB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuLy8gVGhlIE1ldHJpY3Mgb2JqZWN0IGNvbnRhaW5zIGdseXBoIHdpZHRocyAoaW4gZ2x5cGggc3BhY2UgdW5pdHMpLlxuLy8gQXMgcGVyIFBERiBzcGVjLCBmb3IgbW9zdCBmb250cyAoVHlwZSAzIGJlaW5nIGFuIGV4Y2VwdGlvbikgYSBnbHlwaFxuLy8gc3BhY2UgdW5pdCBjb3JyZXNwb25kcyB0byAxLzEwMDB0aCBvZiB0ZXh0IHNwYWNlIHVuaXQuXG52YXIgZ2V0TWV0cmljcyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICB0LkNvdXJpZXIgPSA2MDA7XG4gIHRbXCJDb3VyaWVyLUJvbGRcIl0gPSA2MDA7XG4gIHRbXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCJdID0gNjAwO1xuICB0W1wiQ291cmllci1PYmxpcXVlXCJdID0gNjAwO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHQuSGVsdmV0aWNhID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgdC5zcGFjZSA9IDI3ODtcbiAgICB0LmV4Y2xhbSA9IDI3ODtcbiAgICB0LnF1b3RlZGJsID0gMzU1O1xuICAgIHQubnVtYmVyc2lnbiA9IDU1NjtcbiAgICB0LmRvbGxhciA9IDU1NjtcbiAgICB0LnBlcmNlbnQgPSA4ODk7XG4gICAgdC5hbXBlcnNhbmQgPSA2Njc7XG4gICAgdC5xdW90ZXJpZ2h0ID0gMjIyO1xuICAgIHQucGFyZW5sZWZ0ID0gMzMzO1xuICAgIHQucGFyZW5yaWdodCA9IDMzMztcbiAgICB0LmFzdGVyaXNrID0gMzg5O1xuICAgIHQucGx1cyA9IDU4NDtcbiAgICB0LmNvbW1hID0gMjc4O1xuICAgIHQuaHlwaGVuID0gMzMzO1xuICAgIHQucGVyaW9kID0gMjc4O1xuICAgIHQuc2xhc2ggPSAyNzg7XG4gICAgdC56ZXJvID0gNTU2O1xuICAgIHQub25lID0gNTU2O1xuICAgIHQudHdvID0gNTU2O1xuICAgIHQudGhyZWUgPSA1NTY7XG4gICAgdC5mb3VyID0gNTU2O1xuICAgIHQuZml2ZSA9IDU1NjtcbiAgICB0LnNpeCA9IDU1NjtcbiAgICB0LnNldmVuID0gNTU2O1xuICAgIHQuZWlnaHQgPSA1NTY7XG4gICAgdC5uaW5lID0gNTU2O1xuICAgIHQuY29sb24gPSAyNzg7XG4gICAgdC5zZW1pY29sb24gPSAyNzg7XG4gICAgdC5sZXNzID0gNTg0O1xuICAgIHQuZXF1YWwgPSA1ODQ7XG4gICAgdC5ncmVhdGVyID0gNTg0O1xuICAgIHQucXVlc3Rpb24gPSA1NTY7XG4gICAgdC5hdCA9IDEwMTU7XG4gICAgdC5BID0gNjY3O1xuICAgIHQuQiA9IDY2NztcbiAgICB0LkMgPSA3MjI7XG4gICAgdC5EID0gNzIyO1xuICAgIHQuRSA9IDY2NztcbiAgICB0LkYgPSA2MTE7XG4gICAgdC5HID0gNzc4O1xuICAgIHQuSCA9IDcyMjtcbiAgICB0LkkgPSAyNzg7XG4gICAgdC5KID0gNTAwO1xuICAgIHQuSyA9IDY2NztcbiAgICB0LkwgPSA1NTY7XG4gICAgdC5NID0gODMzO1xuICAgIHQuTiA9IDcyMjtcbiAgICB0Lk8gPSA3Nzg7XG4gICAgdC5QID0gNjY3O1xuICAgIHQuUSA9IDc3ODtcbiAgICB0LlIgPSA3MjI7XG4gICAgdC5TID0gNjY3O1xuICAgIHQuVCA9IDYxMTtcbiAgICB0LlUgPSA3MjI7XG4gICAgdC5WID0gNjY3O1xuICAgIHQuVyA9IDk0NDtcbiAgICB0LlggPSA2Njc7XG4gICAgdC5ZID0gNjY3O1xuICAgIHQuWiA9IDYxMTtcbiAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4O1xuICAgIHQuYmFja3NsYXNoID0gMjc4O1xuICAgIHQuYnJhY2tldHJpZ2h0ID0gMjc4O1xuICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7XG4gICAgdC51bmRlcnNjb3JlID0gNTU2O1xuICAgIHQucXVvdGVsZWZ0ID0gMjIyO1xuICAgIHQuYSA9IDU1NjtcbiAgICB0LmIgPSA1NTY7XG4gICAgdC5jID0gNTAwO1xuICAgIHQuZCA9IDU1NjtcbiAgICB0LmUgPSA1NTY7XG4gICAgdC5mID0gMjc4O1xuICAgIHQuZyA9IDU1NjtcbiAgICB0LmggPSA1NTY7XG4gICAgdC5pID0gMjIyO1xuICAgIHQuaiA9IDIyMjtcbiAgICB0LmsgPSA1MDA7XG4gICAgdC5sID0gMjIyO1xuICAgIHQubSA9IDgzMztcbiAgICB0Lm4gPSA1NTY7XG4gICAgdC5vID0gNTU2O1xuICAgIHQucCA9IDU1NjtcbiAgICB0LnEgPSA1NTY7XG4gICAgdC5yID0gMzMzO1xuICAgIHQucyA9IDUwMDtcbiAgICB0LnQgPSAyNzg7XG4gICAgdC51ID0gNTU2O1xuICAgIHQudiA9IDUwMDtcbiAgICB0LncgPSA3MjI7XG4gICAgdC54ID0gNTAwO1xuICAgIHQueSA9IDUwMDtcbiAgICB0LnogPSA1MDA7XG4gICAgdC5icmFjZWxlZnQgPSAzMzQ7XG4gICAgdC5iYXIgPSAyNjA7XG4gICAgdC5icmFjZXJpZ2h0ID0gMzM0O1xuICAgIHQuYXNjaWl0aWxkZSA9IDU4NDtcbiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7XG4gICAgdC5jZW50ID0gNTU2O1xuICAgIHQuc3RlcmxpbmcgPSA1NTY7XG4gICAgdC5mcmFjdGlvbiA9IDE2NztcbiAgICB0LnllbiA9IDU1NjtcbiAgICB0LmZsb3JpbiA9IDU1NjtcbiAgICB0LnNlY3Rpb24gPSA1NTY7XG4gICAgdC5jdXJyZW5jeSA9IDU1NjtcbiAgICB0LnF1b3Rlc2luZ2xlID0gMTkxO1xuICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzO1xuICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjtcbiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7XG4gICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMztcbiAgICB0LmZpID0gNTAwO1xuICAgIHQuZmwgPSA1MDA7XG4gICAgdC5lbmRhc2ggPSA1NTY7XG4gICAgdC5kYWdnZXIgPSA1NTY7XG4gICAgdC5kYWdnZXJkYmwgPSA1NTY7XG4gICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODtcbiAgICB0LnBhcmFncmFwaCA9IDUzNztcbiAgICB0LmJ1bGxldCA9IDM1MDtcbiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyO1xuICAgIHQucXVvdGVkYmxiYXNlID0gMzMzO1xuICAgIHQucXVvdGVkYmxyaWdodCA9IDMzMztcbiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2O1xuICAgIHQuZWxsaXBzaXMgPSAxMDAwO1xuICAgIHQucGVydGhvdXNhbmQgPSAxMDAwO1xuICAgIHQucXVlc3Rpb25kb3duID0gNjExO1xuICAgIHQuZ3JhdmUgPSAzMzM7XG4gICAgdC5hY3V0ZSA9IDMzMztcbiAgICB0LmNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC50aWxkZSA9IDMzMztcbiAgICB0Lm1hY3JvbiA9IDMzMztcbiAgICB0LmJyZXZlID0gMzMzO1xuICAgIHQuZG90YWNjZW50ID0gMzMzO1xuICAgIHQuZGllcmVzaXMgPSAzMzM7XG4gICAgdC5yaW5nID0gMzMzO1xuICAgIHQuY2VkaWxsYSA9IDMzMztcbiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMztcbiAgICB0Lm9nb25layA9IDMzMztcbiAgICB0LmNhcm9uID0gMzMzO1xuICAgIHQuZW1kYXNoID0gMTAwMDtcbiAgICB0LkFFID0gMTAwMDtcbiAgICB0Lm9yZGZlbWluaW5lID0gMzcwO1xuICAgIHQuTHNsYXNoID0gNTU2O1xuICAgIHQuT3NsYXNoID0gNzc4O1xuICAgIHQuT0UgPSAxMDAwO1xuICAgIHQub3JkbWFzY3VsaW5lID0gMzY1O1xuICAgIHQuYWUgPSA4ODk7XG4gICAgdC5kb3RsZXNzaSA9IDI3ODtcbiAgICB0LmxzbGFzaCA9IDIyMjtcbiAgICB0Lm9zbGFzaCA9IDYxMTtcbiAgICB0Lm9lID0gOTQ0O1xuICAgIHQuZ2VybWFuZGJscyA9IDYxMTtcbiAgICB0LklkaWVyZXNpcyA9IDI3ODtcbiAgICB0LmVhY3V0ZSA9IDU1NjtcbiAgICB0LmFicmV2ZSA9IDU1NjtcbiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7XG4gICAgdC5lY2Fyb24gPSA1NTY7XG4gICAgdC5ZZGllcmVzaXMgPSA2Njc7XG4gICAgdC5kaXZpZGUgPSA1ODQ7XG4gICAgdC5ZYWN1dGUgPSA2Njc7XG4gICAgdC5BY2lyY3VtZmxleCA9IDY2NztcbiAgICB0LmFhY3V0ZSA9IDU1NjtcbiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQueWFjdXRlID0gNTAwO1xuICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwO1xuICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5VcmluZyA9IDcyMjtcbiAgICB0LlVkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmFvZ29uZWsgPSA1NTY7XG4gICAgdC5VYWN1dGUgPSA3MjI7XG4gICAgdC51b2dvbmVrID0gNTU2O1xuICAgIHQuRWRpZXJlc2lzID0gNjY3O1xuICAgIHQuRGNyb2F0ID0gNzIyO1xuICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7XG4gICAgdC5jb3B5cmlnaHQgPSA3Mzc7XG4gICAgdC5FbWFjcm9uID0gNjY3O1xuICAgIHQuY2Nhcm9uID0gNTAwO1xuICAgIHQuYXJpbmcgPSA1NTY7XG4gICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5sYWN1dGUgPSAyMjI7XG4gICAgdC5hZ3JhdmUgPSA1NTY7XG4gICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5DYWN1dGUgPSA3MjI7XG4gICAgdC5hdGlsZGUgPSA1NTY7XG4gICAgdC5FZG90YWNjZW50ID0gNjY3O1xuICAgIHQuc2Nhcm9uID0gNTAwO1xuICAgIHQuc2NlZGlsbGEgPSA1MDA7XG4gICAgdC5pYWN1dGUgPSAyNzg7XG4gICAgdC5sb3plbmdlID0gNDcxO1xuICAgIHQuUmNhcm9uID0gNzIyO1xuICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4O1xuICAgIHQudWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5hY2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LkFtYWNyb24gPSA2Njc7XG4gICAgdC5yY2Fyb24gPSAzMzM7XG4gICAgdC5jY2VkaWxsYSA9IDUwMDtcbiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7XG4gICAgdC5UaG9ybiA9IDY2NztcbiAgICB0Lk9tYWNyb24gPSA3Nzg7XG4gICAgdC5SYWN1dGUgPSA3MjI7XG4gICAgdC5TYWN1dGUgPSA2Njc7XG4gICAgdC5kY2Fyb24gPSA2NDM7XG4gICAgdC5VbWFjcm9uID0gNzIyO1xuICAgIHQudXJpbmcgPSA1NTY7XG4gICAgdC50aHJlZXN1cGVyaW9yID0gMzMzO1xuICAgIHQuT2dyYXZlID0gNzc4O1xuICAgIHQuQWdyYXZlID0gNjY3O1xuICAgIHQuQWJyZXZlID0gNjY3O1xuICAgIHQubXVsdGlwbHkgPSA1ODQ7XG4gICAgdC51YWN1dGUgPSA1NTY7XG4gICAgdC5UY2Fyb24gPSA2MTE7XG4gICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjtcbiAgICB0LnlkaWVyZXNpcyA9IDUwMDtcbiAgICB0Lk5hY3V0ZSA9IDcyMjtcbiAgICB0LmljaXJjdW1mbGV4ID0gMjc4O1xuICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7XG4gICAgdC5hZGllcmVzaXMgPSA1NTY7XG4gICAgdC5lZGllcmVzaXMgPSA1NTY7XG4gICAgdC5jYWN1dGUgPSA1MDA7XG4gICAgdC5uYWN1dGUgPSA1NTY7XG4gICAgdC51bWFjcm9uID0gNTU2O1xuICAgIHQuTmNhcm9uID0gNzIyO1xuICAgIHQuSWFjdXRlID0gMjc4O1xuICAgIHQucGx1c21pbnVzID0gNTg0O1xuICAgIHQuYnJva2VuYmFyID0gMjYwO1xuICAgIHQucmVnaXN0ZXJlZCA9IDczNztcbiAgICB0LkdicmV2ZSA9IDc3ODtcbiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7XG4gICAgdC5zdW1tYXRpb24gPSA2MDA7XG4gICAgdC5FZ3JhdmUgPSA2Njc7XG4gICAgdC5yYWN1dGUgPSAzMzM7XG4gICAgdC5vbWFjcm9uID0gNTU2O1xuICAgIHQuWmFjdXRlID0gNjExO1xuICAgIHQuWmNhcm9uID0gNjExO1xuICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5O1xuICAgIHQuRXRoID0gNzIyO1xuICAgIHQuQ2NlZGlsbGEgPSA3MjI7XG4gICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7XG4gICAgdC50Y2Fyb24gPSAzMTc7XG4gICAgdC5lb2dvbmVrID0gNTU2O1xuICAgIHQuVW9nb25layA9IDcyMjtcbiAgICB0LkFhY3V0ZSA9IDY2NztcbiAgICB0LkFkaWVyZXNpcyA9IDY2NztcbiAgICB0LmVncmF2ZSA9IDU1NjtcbiAgICB0LnphY3V0ZSA9IDUwMDtcbiAgICB0LmlvZ29uZWsgPSAyMjI7XG4gICAgdC5PYWN1dGUgPSA3Nzg7XG4gICAgdC5vYWN1dGUgPSA1NTY7XG4gICAgdC5hbWFjcm9uID0gNTU2O1xuICAgIHQuc2FjdXRlID0gNTAwO1xuICAgIHQuaWRpZXJlc2lzID0gMjc4O1xuICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7XG4gICAgdC5VZ3JhdmUgPSA3MjI7XG4gICAgdC5EZWx0YSA9IDYxMjtcbiAgICB0LnRob3JuID0gNTU2O1xuICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7XG4gICAgdC5PZGllcmVzaXMgPSA3Nzg7XG4gICAgdC5tdSA9IDU1NjtcbiAgICB0LmlncmF2ZSA9IDI3ODtcbiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1NTY7XG4gICAgdC5Fb2dvbmVrID0gNjY3O1xuICAgIHQuZGNyb2F0ID0gNTU2O1xuICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDtcbiAgICB0LlNjZWRpbGxhID0gNjY3O1xuICAgIHQubGNhcm9uID0gMjk5O1xuICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQuTGFjdXRlID0gNTU2O1xuICAgIHQudHJhZGVtYXJrID0gMTAwMDtcbiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7XG4gICAgdC5JZ3JhdmUgPSAyNzg7XG4gICAgdC5JbWFjcm9uID0gMjc4O1xuICAgIHQuTGNhcm9uID0gNTU2O1xuICAgIHQub25laGFsZiA9IDgzNDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNTU2O1xuICAgIHQubnRpbGRlID0gNTU2O1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDY2NztcbiAgICB0LmVtYWNyb24gPSA1NTY7XG4gICAgdC5nYnJldmUgPSA1NTY7XG4gICAgdC5vbmVxdWFydGVyID0gODM0O1xuICAgIHQuU2Nhcm9uID0gNjY3O1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDU1NjtcbiAgICB0LkNjYXJvbiA9IDcyMjtcbiAgICB0LnVncmF2ZSA9IDU1NjtcbiAgICB0LnJhZGljYWwgPSA0NTM7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7XG4gICAgdC5OdGlsZGUgPSA3MjI7XG4gICAgdC5vdGlsZGUgPSA1NTY7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5BdGlsZGUgPSA2Njc7XG4gICAgdC5Bb2dvbmVrID0gNjY3O1xuICAgIHQuQXJpbmcgPSA2Njc7XG4gICAgdC5PdGlsZGUgPSA3Nzg7XG4gICAgdC56ZG90YWNjZW50ID0gNTAwO1xuICAgIHQuRWNhcm9uID0gNjY3O1xuICAgIHQuSW9nb25layA9IDI3ODtcbiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDtcbiAgICB0Lm1pbnVzID0gNTg0O1xuICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7XG4gICAgdC5uY2Fyb24gPSA1NTY7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC5sb2dpY2Fsbm90ID0gNTg0O1xuICAgIHQub2RpZXJlc2lzID0gNTU2O1xuICAgIHQudWRpZXJlc2lzID0gNTU2O1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5ldGggPSA1NTY7XG4gICAgdC56Y2Fyb24gPSA1MDA7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMzMztcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTU2O1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0W1wiSGVsdmV0aWNhLUJvbGRcIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHtcbiAgICB0LnNwYWNlID0gMjc4O1xuICAgIHQuZXhjbGFtID0gMzMzO1xuICAgIHQucXVvdGVkYmwgPSA0NzQ7XG4gICAgdC5udW1iZXJzaWduID0gNTU2O1xuICAgIHQuZG9sbGFyID0gNTU2O1xuICAgIHQucGVyY2VudCA9IDg4OTtcbiAgICB0LmFtcGVyc2FuZCA9IDcyMjtcbiAgICB0LnF1b3RlcmlnaHQgPSAyNzg7XG4gICAgdC5wYXJlbmxlZnQgPSAzMzM7XG4gICAgdC5wYXJlbnJpZ2h0ID0gMzMzO1xuICAgIHQuYXN0ZXJpc2sgPSAzODk7XG4gICAgdC5wbHVzID0gNTg0O1xuICAgIHQuY29tbWEgPSAyNzg7XG4gICAgdC5oeXBoZW4gPSAzMzM7XG4gICAgdC5wZXJpb2QgPSAyNzg7XG4gICAgdC5zbGFzaCA9IDI3ODtcbiAgICB0Lnplcm8gPSA1NTY7XG4gICAgdC5vbmUgPSA1NTY7XG4gICAgdC50d28gPSA1NTY7XG4gICAgdC50aHJlZSA9IDU1NjtcbiAgICB0LmZvdXIgPSA1NTY7XG4gICAgdC5maXZlID0gNTU2O1xuICAgIHQuc2l4ID0gNTU2O1xuICAgIHQuc2V2ZW4gPSA1NTY7XG4gICAgdC5laWdodCA9IDU1NjtcbiAgICB0Lm5pbmUgPSA1NTY7XG4gICAgdC5jb2xvbiA9IDMzMztcbiAgICB0LnNlbWljb2xvbiA9IDMzMztcbiAgICB0Lmxlc3MgPSA1ODQ7XG4gICAgdC5lcXVhbCA9IDU4NDtcbiAgICB0LmdyZWF0ZXIgPSA1ODQ7XG4gICAgdC5xdWVzdGlvbiA9IDYxMTtcbiAgICB0LmF0ID0gOTc1O1xuICAgIHQuQSA9IDcyMjtcbiAgICB0LkIgPSA3MjI7XG4gICAgdC5DID0gNzIyO1xuICAgIHQuRCA9IDcyMjtcbiAgICB0LkUgPSA2Njc7XG4gICAgdC5GID0gNjExO1xuICAgIHQuRyA9IDc3ODtcbiAgICB0LkggPSA3MjI7XG4gICAgdC5JID0gMjc4O1xuICAgIHQuSiA9IDU1NjtcbiAgICB0LksgPSA3MjI7XG4gICAgdC5MID0gNjExO1xuICAgIHQuTSA9IDgzMztcbiAgICB0Lk4gPSA3MjI7XG4gICAgdC5PID0gNzc4O1xuICAgIHQuUCA9IDY2NztcbiAgICB0LlEgPSA3Nzg7XG4gICAgdC5SID0gNzIyO1xuICAgIHQuUyA9IDY2NztcbiAgICB0LlQgPSA2MTE7XG4gICAgdC5VID0gNzIyO1xuICAgIHQuViA9IDY2NztcbiAgICB0LlcgPSA5NDQ7XG4gICAgdC5YID0gNjY3O1xuICAgIHQuWSA9IDY2NztcbiAgICB0LlogPSA2MTE7XG4gICAgdC5icmFja2V0bGVmdCA9IDMzMztcbiAgICB0LmJhY2tzbGFzaCA9IDI3ODtcbiAgICB0LmJyYWNrZXRyaWdodCA9IDMzMztcbiAgICB0LmFzY2lpY2lyY3VtID0gNTg0O1xuICAgIHQudW5kZXJzY29yZSA9IDU1NjtcbiAgICB0LnF1b3RlbGVmdCA9IDI3ODtcbiAgICB0LmEgPSA1NTY7XG4gICAgdC5iID0gNjExO1xuICAgIHQuYyA9IDU1NjtcbiAgICB0LmQgPSA2MTE7XG4gICAgdC5lID0gNTU2O1xuICAgIHQuZiA9IDMzMztcbiAgICB0LmcgPSA2MTE7XG4gICAgdC5oID0gNjExO1xuICAgIHQuaSA9IDI3ODtcbiAgICB0LmogPSAyNzg7XG4gICAgdC5rID0gNTU2O1xuICAgIHQubCA9IDI3ODtcbiAgICB0Lm0gPSA4ODk7XG4gICAgdC5uID0gNjExO1xuICAgIHQubyA9IDYxMTtcbiAgICB0LnAgPSA2MTE7XG4gICAgdC5xID0gNjExO1xuICAgIHQuciA9IDM4OTtcbiAgICB0LnMgPSA1NTY7XG4gICAgdC50ID0gMzMzO1xuICAgIHQudSA9IDYxMTtcbiAgICB0LnYgPSA1NTY7XG4gICAgdC53ID0gNzc4O1xuICAgIHQueCA9IDU1NjtcbiAgICB0LnkgPSA1NTY7XG4gICAgdC56ID0gNTAwO1xuICAgIHQuYnJhY2VsZWZ0ID0gMzg5O1xuICAgIHQuYmFyID0gMjgwO1xuICAgIHQuYnJhY2VyaWdodCA9IDM4OTtcbiAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7XG4gICAgdC5leGNsYW1kb3duID0gMzMzO1xuICAgIHQuY2VudCA9IDU1NjtcbiAgICB0LnN0ZXJsaW5nID0gNTU2O1xuICAgIHQuZnJhY3Rpb24gPSAxNjc7XG4gICAgdC55ZW4gPSA1NTY7XG4gICAgdC5mbG9yaW4gPSA1NTY7XG4gICAgdC5zZWN0aW9uID0gNTU2O1xuICAgIHQuY3VycmVuY3kgPSA1NTY7XG4gICAgdC5xdW90ZXNpbmdsZSA9IDIzODtcbiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDtcbiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7XG4gICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzO1xuICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7XG4gICAgdC5maSA9IDYxMTtcbiAgICB0LmZsID0gNjExO1xuICAgIHQuZW5kYXNoID0gNTU2O1xuICAgIHQuZGFnZ2VyID0gNTU2O1xuICAgIHQuZGFnZ2VyZGJsID0gNTU2O1xuICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7XG4gICAgdC5wYXJhZ3JhcGggPSA1NTY7XG4gICAgdC5idWxsZXQgPSAzNTA7XG4gICAgdC5xdW90ZXNpbmdsYmFzZSA9IDI3ODtcbiAgICB0LnF1b3RlZGJsYmFzZSA9IDUwMDtcbiAgICB0LnF1b3RlZGJscmlnaHQgPSA1MDA7XG4gICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjtcbiAgICB0LmVsbGlwc2lzID0gMTAwMDtcbiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDtcbiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTtcbiAgICB0LmdyYXZlID0gMzMzO1xuICAgIHQuYWN1dGUgPSAzMzM7XG4gICAgdC5jaXJjdW1mbGV4ID0gMzMzO1xuICAgIHQudGlsZGUgPSAzMzM7XG4gICAgdC5tYWNyb24gPSAzMzM7XG4gICAgdC5icmV2ZSA9IDMzMztcbiAgICB0LmRvdGFjY2VudCA9IDMzMztcbiAgICB0LmRpZXJlc2lzID0gMzMzO1xuICAgIHQucmluZyA9IDMzMztcbiAgICB0LmNlZGlsbGEgPSAzMzM7XG4gICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7XG4gICAgdC5vZ29uZWsgPSAzMzM7XG4gICAgdC5jYXJvbiA9IDMzMztcbiAgICB0LmVtZGFzaCA9IDEwMDA7XG4gICAgdC5BRSA9IDEwMDA7XG4gICAgdC5vcmRmZW1pbmluZSA9IDM3MDtcbiAgICB0LkxzbGFzaCA9IDYxMTtcbiAgICB0Lk9zbGFzaCA9IDc3ODtcbiAgICB0Lk9FID0gMTAwMDtcbiAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTtcbiAgICB0LmFlID0gODg5O1xuICAgIHQuZG90bGVzc2kgPSAyNzg7XG4gICAgdC5sc2xhc2ggPSAyNzg7XG4gICAgdC5vc2xhc2ggPSA2MTE7XG4gICAgdC5vZSA9IDk0NDtcbiAgICB0Lmdlcm1hbmRibHMgPSA2MTE7XG4gICAgdC5JZGllcmVzaXMgPSAyNzg7XG4gICAgdC5lYWN1dGUgPSA1NTY7XG4gICAgdC5hYnJldmUgPSA1NTY7XG4gICAgdC51aHVuZ2FydW1sYXV0ID0gNjExO1xuICAgIHQuZWNhcm9uID0gNTU2O1xuICAgIHQuWWRpZXJlc2lzID0gNjY3O1xuICAgIHQuZGl2aWRlID0gNTg0O1xuICAgIHQuWWFjdXRlID0gNjY3O1xuICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7XG4gICAgdC5hYWN1dGUgPSA1NTY7XG4gICAgdC5VY2lyY3VtZmxleCA9IDcyMjtcbiAgICB0LnlhY3V0ZSA9IDU1NjtcbiAgICB0LnNjb21tYWFjY2VudCA9IDU1NjtcbiAgICB0LmVjaXJjdW1mbGV4ID0gNTU2O1xuICAgIHQuVXJpbmcgPSA3MjI7XG4gICAgdC5VZGllcmVzaXMgPSA3MjI7XG4gICAgdC5hb2dvbmVrID0gNTU2O1xuICAgIHQuVWFjdXRlID0gNzIyO1xuICAgIHQudW9nb25layA9IDYxMTtcbiAgICB0LkVkaWVyZXNpcyA9IDY2NztcbiAgICB0LkRjcm9hdCA9IDcyMjtcbiAgICB0LmNvbW1hYWNjZW50ID0gMjUwO1xuICAgIHQuY29weXJpZ2h0ID0gNzM3O1xuICAgIHQuRW1hY3JvbiA9IDY2NztcbiAgICB0LmNjYXJvbiA9IDU1NjtcbiAgICB0LmFyaW5nID0gNTU2O1xuICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQubGFjdXRlID0gMjc4O1xuICAgIHQuYWdyYXZlID0gNTU2O1xuICAgIHQuVGNvbW1hYWNjZW50ID0gNjExO1xuICAgIHQuQ2FjdXRlID0gNzIyO1xuICAgIHQuYXRpbGRlID0gNTU2O1xuICAgIHQuRWRvdGFjY2VudCA9IDY2NztcbiAgICB0LnNjYXJvbiA9IDU1NjtcbiAgICB0LnNjZWRpbGxhID0gNTU2O1xuICAgIHQuaWFjdXRlID0gMjc4O1xuICAgIHQubG96ZW5nZSA9IDQ5NDtcbiAgICB0LlJjYXJvbiA9IDcyMjtcbiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODtcbiAgICB0LnVjaXJjdW1mbGV4ID0gNjExO1xuICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5BbWFjcm9uID0gNzIyO1xuICAgIHQucmNhcm9uID0gMzg5O1xuICAgIHQuY2NlZGlsbGEgPSA1NTY7XG4gICAgdC5aZG90YWNjZW50ID0gNjExO1xuICAgIHQuVGhvcm4gPSA2Njc7XG4gICAgdC5PbWFjcm9uID0gNzc4O1xuICAgIHQuUmFjdXRlID0gNzIyO1xuICAgIHQuU2FjdXRlID0gNjY3O1xuICAgIHQuZGNhcm9uID0gNzQzO1xuICAgIHQuVW1hY3JvbiA9IDcyMjtcbiAgICB0LnVyaW5nID0gNjExO1xuICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMztcbiAgICB0Lk9ncmF2ZSA9IDc3ODtcbiAgICB0LkFncmF2ZSA9IDcyMjtcbiAgICB0LkFicmV2ZSA9IDcyMjtcbiAgICB0Lm11bHRpcGx5ID0gNTg0O1xuICAgIHQudWFjdXRlID0gNjExO1xuICAgIHQuVGNhcm9uID0gNjExO1xuICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7XG4gICAgdC55ZGllcmVzaXMgPSA1NTY7XG4gICAgdC5OYWN1dGUgPSA3MjI7XG4gICAgdC5pY2lyY3VtZmxleCA9IDI3ODtcbiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3O1xuICAgIHQuYWRpZXJlc2lzID0gNTU2O1xuICAgIHQuZWRpZXJlc2lzID0gNTU2O1xuICAgIHQuY2FjdXRlID0gNTU2O1xuICAgIHQubmFjdXRlID0gNjExO1xuICAgIHQudW1hY3JvbiA9IDYxMTtcbiAgICB0Lk5jYXJvbiA9IDcyMjtcbiAgICB0LklhY3V0ZSA9IDI3ODtcbiAgICB0LnBsdXNtaW51cyA9IDU4NDtcbiAgICB0LmJyb2tlbmJhciA9IDI4MDtcbiAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7XG4gICAgdC5HYnJldmUgPSA3Nzg7XG4gICAgdC5JZG90YWNjZW50ID0gMjc4O1xuICAgIHQuc3VtbWF0aW9uID0gNjAwO1xuICAgIHQuRWdyYXZlID0gNjY3O1xuICAgIHQucmFjdXRlID0gMzg5O1xuICAgIHQub21hY3JvbiA9IDYxMTtcbiAgICB0LlphY3V0ZSA9IDYxMTtcbiAgICB0LlpjYXJvbiA9IDYxMTtcbiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTtcbiAgICB0LkV0aCA9IDcyMjtcbiAgICB0LkNjZWRpbGxhID0gNzIyO1xuICAgIHQubGNvbW1hYWNjZW50ID0gMjc4O1xuICAgIHQudGNhcm9uID0gMzg5O1xuICAgIHQuZW9nb25layA9IDU1NjtcbiAgICB0LlVvZ29uZWsgPSA3MjI7XG4gICAgdC5BYWN1dGUgPSA3MjI7XG4gICAgdC5BZGllcmVzaXMgPSA3MjI7XG4gICAgdC5lZ3JhdmUgPSA1NTY7XG4gICAgdC56YWN1dGUgPSA1MDA7XG4gICAgdC5pb2dvbmVrID0gMjc4O1xuICAgIHQuT2FjdXRlID0gNzc4O1xuICAgIHQub2FjdXRlID0gNjExO1xuICAgIHQuYW1hY3JvbiA9IDU1NjtcbiAgICB0LnNhY3V0ZSA9IDU1NjtcbiAgICB0LmlkaWVyZXNpcyA9IDI3ODtcbiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4O1xuICAgIHQuVWdyYXZlID0gNzIyO1xuICAgIHQuRGVsdGEgPSA2MTI7XG4gICAgdC50aG9ybiA9IDYxMTtcbiAgICB0LnR3b3N1cGVyaW9yID0gMzMzO1xuICAgIHQuT2RpZXJlc2lzID0gNzc4O1xuICAgIHQubXUgPSA2MTE7XG4gICAgdC5pZ3JhdmUgPSAyNzg7XG4gICAgdC5vaHVuZ2FydW1sYXV0ID0gNjExO1xuICAgIHQuRW9nb25layA9IDY2NztcbiAgICB0LmRjcm9hdCA9IDYxMTtcbiAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7XG4gICAgdC5TY2VkaWxsYSA9IDY2NztcbiAgICB0LmxjYXJvbiA9IDQwMDtcbiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LkxhY3V0ZSA9IDYxMTtcbiAgICB0LnRyYWRlbWFyayA9IDEwMDA7XG4gICAgdC5lZG90YWNjZW50ID0gNTU2O1xuICAgIHQuSWdyYXZlID0gMjc4O1xuICAgIHQuSW1hY3JvbiA9IDI3ODtcbiAgICB0LkxjYXJvbiA9IDYxMTtcbiAgICB0Lm9uZWhhbGYgPSA4MzQ7XG4gICAgdC5sZXNzZXF1YWwgPSA1NDk7XG4gICAgdC5vY2lyY3VtZmxleCA9IDYxMTtcbiAgICB0Lm50aWxkZSA9IDYxMTtcbiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7XG4gICAgdC5FYWN1dGUgPSA2Njc7XG4gICAgdC5lbWFjcm9uID0gNTU2O1xuICAgIHQuZ2JyZXZlID0gNjExO1xuICAgIHQub25lcXVhcnRlciA9IDgzNDtcbiAgICB0LlNjYXJvbiA9IDY2NztcbiAgICB0LlNjb21tYWFjY2VudCA9IDY2NztcbiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7XG4gICAgdC5kZWdyZWUgPSA0MDA7XG4gICAgdC5vZ3JhdmUgPSA2MTE7XG4gICAgdC5DY2Fyb24gPSA3MjI7XG4gICAgdC51Z3JhdmUgPSA2MTE7XG4gICAgdC5yYWRpY2FsID0gNTQ5O1xuICAgIHQuRGNhcm9uID0gNzIyO1xuICAgIHQucmNvbW1hYWNjZW50ID0gMzg5O1xuICAgIHQuTnRpbGRlID0gNzIyO1xuICAgIHQub3RpbGRlID0gNjExO1xuICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQuTGNvbW1hYWNjZW50ID0gNjExO1xuICAgIHQuQXRpbGRlID0gNzIyO1xuICAgIHQuQW9nb25layA9IDcyMjtcbiAgICB0LkFyaW5nID0gNzIyO1xuICAgIHQuT3RpbGRlID0gNzc4O1xuICAgIHQuemRvdGFjY2VudCA9IDUwMDtcbiAgICB0LkVjYXJvbiA9IDY2NztcbiAgICB0LklvZ29uZWsgPSAyNzg7XG4gICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5taW51cyA9IDU4NDtcbiAgICB0LkljaXJjdW1mbGV4ID0gMjc4O1xuICAgIHQubmNhcm9uID0gNjExO1xuICAgIHQudGNvbW1hYWNjZW50ID0gMzMzO1xuICAgIHQubG9naWNhbG5vdCA9IDU4NDtcbiAgICB0Lm9kaWVyZXNpcyA9IDYxMTtcbiAgICB0LnVkaWVyZXNpcyA9IDYxMTtcbiAgICB0Lm5vdGVxdWFsID0gNTQ5O1xuICAgIHQuZ2NvbW1hYWNjZW50ID0gNjExO1xuICAgIHQuZXRoID0gNjExO1xuICAgIHQuemNhcm9uID0gNTAwO1xuICAgIHQubmNvbW1hYWNjZW50ID0gNjExO1xuICAgIHQub25lc3VwZXJpb3IgPSAzMzM7XG4gICAgdC5pbWFjcm9uID0gMjc4O1xuICAgIHQuRXVybyA9IDU1NjtcbiAgfSk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgdFtcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiXSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICAgIHQuc3BhY2UgPSAyNzg7XG4gICAgdC5leGNsYW0gPSAzMzM7XG4gICAgdC5xdW90ZWRibCA9IDQ3NDtcbiAgICB0Lm51bWJlcnNpZ24gPSA1NTY7XG4gICAgdC5kb2xsYXIgPSA1NTY7XG4gICAgdC5wZXJjZW50ID0gODg5O1xuICAgIHQuYW1wZXJzYW5kID0gNzIyO1xuICAgIHQucXVvdGVyaWdodCA9IDI3ODtcbiAgICB0LnBhcmVubGVmdCA9IDMzMztcbiAgICB0LnBhcmVucmlnaHQgPSAzMzM7XG4gICAgdC5hc3RlcmlzayA9IDM4OTtcbiAgICB0LnBsdXMgPSA1ODQ7XG4gICAgdC5jb21tYSA9IDI3ODtcbiAgICB0Lmh5cGhlbiA9IDMzMztcbiAgICB0LnBlcmlvZCA9IDI3ODtcbiAgICB0LnNsYXNoID0gMjc4O1xuICAgIHQuemVybyA9IDU1NjtcbiAgICB0Lm9uZSA9IDU1NjtcbiAgICB0LnR3byA9IDU1NjtcbiAgICB0LnRocmVlID0gNTU2O1xuICAgIHQuZm91ciA9IDU1NjtcbiAgICB0LmZpdmUgPSA1NTY7XG4gICAgdC5zaXggPSA1NTY7XG4gICAgdC5zZXZlbiA9IDU1NjtcbiAgICB0LmVpZ2h0ID0gNTU2O1xuICAgIHQubmluZSA9IDU1NjtcbiAgICB0LmNvbG9uID0gMzMzO1xuICAgIHQuc2VtaWNvbG9uID0gMzMzO1xuICAgIHQubGVzcyA9IDU4NDtcbiAgICB0LmVxdWFsID0gNTg0O1xuICAgIHQuZ3JlYXRlciA9IDU4NDtcbiAgICB0LnF1ZXN0aW9uID0gNjExO1xuICAgIHQuYXQgPSA5NzU7XG4gICAgdC5BID0gNzIyO1xuICAgIHQuQiA9IDcyMjtcbiAgICB0LkMgPSA3MjI7XG4gICAgdC5EID0gNzIyO1xuICAgIHQuRSA9IDY2NztcbiAgICB0LkYgPSA2MTE7XG4gICAgdC5HID0gNzc4O1xuICAgIHQuSCA9IDcyMjtcbiAgICB0LkkgPSAyNzg7XG4gICAgdC5KID0gNTU2O1xuICAgIHQuSyA9IDcyMjtcbiAgICB0LkwgPSA2MTE7XG4gICAgdC5NID0gODMzO1xuICAgIHQuTiA9IDcyMjtcbiAgICB0Lk8gPSA3Nzg7XG4gICAgdC5QID0gNjY3O1xuICAgIHQuUSA9IDc3ODtcbiAgICB0LlIgPSA3MjI7XG4gICAgdC5TID0gNjY3O1xuICAgIHQuVCA9IDYxMTtcbiAgICB0LlUgPSA3MjI7XG4gICAgdC5WID0gNjY3O1xuICAgIHQuVyA9IDk0NDtcbiAgICB0LlggPSA2Njc7XG4gICAgdC5ZID0gNjY3O1xuICAgIHQuWiA9IDYxMTtcbiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzO1xuICAgIHQuYmFja3NsYXNoID0gMjc4O1xuICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzO1xuICAgIHQuYXNjaWljaXJjdW0gPSA1ODQ7XG4gICAgdC51bmRlcnNjb3JlID0gNTU2O1xuICAgIHQucXVvdGVsZWZ0ID0gMjc4O1xuICAgIHQuYSA9IDU1NjtcbiAgICB0LmIgPSA2MTE7XG4gICAgdC5jID0gNTU2O1xuICAgIHQuZCA9IDYxMTtcbiAgICB0LmUgPSA1NTY7XG4gICAgdC5mID0gMzMzO1xuICAgIHQuZyA9IDYxMTtcbiAgICB0LmggPSA2MTE7XG4gICAgdC5pID0gMjc4O1xuICAgIHQuaiA9IDI3ODtcbiAgICB0LmsgPSA1NTY7XG4gICAgdC5sID0gMjc4O1xuICAgIHQubSA9IDg4OTtcbiAgICB0Lm4gPSA2MTE7XG4gICAgdC5vID0gNjExO1xuICAgIHQucCA9IDYxMTtcbiAgICB0LnEgPSA2MTE7XG4gICAgdC5yID0gMzg5O1xuICAgIHQucyA9IDU1NjtcbiAgICB0LnQgPSAzMzM7XG4gICAgdC51ID0gNjExO1xuICAgIHQudiA9IDU1NjtcbiAgICB0LncgPSA3Nzg7XG4gICAgdC54ID0gNTU2O1xuICAgIHQueSA9IDU1NjtcbiAgICB0LnogPSA1MDA7XG4gICAgdC5icmFjZWxlZnQgPSAzODk7XG4gICAgdC5iYXIgPSAyODA7XG4gICAgdC5icmFjZXJpZ2h0ID0gMzg5O1xuICAgIHQuYXNjaWl0aWxkZSA9IDU4NDtcbiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7XG4gICAgdC5jZW50ID0gNTU2O1xuICAgIHQuc3RlcmxpbmcgPSA1NTY7XG4gICAgdC5mcmFjdGlvbiA9IDE2NztcbiAgICB0LnllbiA9IDU1NjtcbiAgICB0LmZsb3JpbiA9IDU1NjtcbiAgICB0LnNlY3Rpb24gPSA1NTY7XG4gICAgdC5jdXJyZW5jeSA9IDU1NjtcbiAgICB0LnF1b3Rlc2luZ2xlID0gMjM4O1xuICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwO1xuICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjtcbiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7XG4gICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMztcbiAgICB0LmZpID0gNjExO1xuICAgIHQuZmwgPSA2MTE7XG4gICAgdC5lbmRhc2ggPSA1NTY7XG4gICAgdC5kYWdnZXIgPSA1NTY7XG4gICAgdC5kYWdnZXJkYmwgPSA1NTY7XG4gICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODtcbiAgICB0LnBhcmFncmFwaCA9IDU1NjtcbiAgICB0LmJ1bGxldCA9IDM1MDtcbiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjc4O1xuICAgIHQucXVvdGVkYmxiYXNlID0gNTAwO1xuICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDtcbiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2O1xuICAgIHQuZWxsaXBzaXMgPSAxMDAwO1xuICAgIHQucGVydGhvdXNhbmQgPSAxMDAwO1xuICAgIHQucXVlc3Rpb25kb3duID0gNjExO1xuICAgIHQuZ3JhdmUgPSAzMzM7XG4gICAgdC5hY3V0ZSA9IDMzMztcbiAgICB0LmNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC50aWxkZSA9IDMzMztcbiAgICB0Lm1hY3JvbiA9IDMzMztcbiAgICB0LmJyZXZlID0gMzMzO1xuICAgIHQuZG90YWNjZW50ID0gMzMzO1xuICAgIHQuZGllcmVzaXMgPSAzMzM7XG4gICAgdC5yaW5nID0gMzMzO1xuICAgIHQuY2VkaWxsYSA9IDMzMztcbiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMztcbiAgICB0Lm9nb25layA9IDMzMztcbiAgICB0LmNhcm9uID0gMzMzO1xuICAgIHQuZW1kYXNoID0gMTAwMDtcbiAgICB0LkFFID0gMTAwMDtcbiAgICB0Lm9yZGZlbWluaW5lID0gMzcwO1xuICAgIHQuTHNsYXNoID0gNjExO1xuICAgIHQuT3NsYXNoID0gNzc4O1xuICAgIHQuT0UgPSAxMDAwO1xuICAgIHQub3JkbWFzY3VsaW5lID0gMzY1O1xuICAgIHQuYWUgPSA4ODk7XG4gICAgdC5kb3RsZXNzaSA9IDI3ODtcbiAgICB0LmxzbGFzaCA9IDI3ODtcbiAgICB0Lm9zbGFzaCA9IDYxMTtcbiAgICB0Lm9lID0gOTQ0O1xuICAgIHQuZ2VybWFuZGJscyA9IDYxMTtcbiAgICB0LklkaWVyZXNpcyA9IDI3ODtcbiAgICB0LmVhY3V0ZSA9IDU1NjtcbiAgICB0LmFicmV2ZSA9IDU1NjtcbiAgICB0LnVodW5nYXJ1bWxhdXQgPSA2MTE7XG4gICAgdC5lY2Fyb24gPSA1NTY7XG4gICAgdC5ZZGllcmVzaXMgPSA2Njc7XG4gICAgdC5kaXZpZGUgPSA1ODQ7XG4gICAgdC5ZYWN1dGUgPSA2Njc7XG4gICAgdC5BY2lyY3VtZmxleCA9IDcyMjtcbiAgICB0LmFhY3V0ZSA9IDU1NjtcbiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQueWFjdXRlID0gNTU2O1xuICAgIHQuc2NvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5VcmluZyA9IDcyMjtcbiAgICB0LlVkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmFvZ29uZWsgPSA1NTY7XG4gICAgdC5VYWN1dGUgPSA3MjI7XG4gICAgdC51b2dvbmVrID0gNjExO1xuICAgIHQuRWRpZXJlc2lzID0gNjY3O1xuICAgIHQuRGNyb2F0ID0gNzIyO1xuICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7XG4gICAgdC5jb3B5cmlnaHQgPSA3Mzc7XG4gICAgdC5FbWFjcm9uID0gNjY3O1xuICAgIHQuY2Nhcm9uID0gNTU2O1xuICAgIHQuYXJpbmcgPSA1NTY7XG4gICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5sYWN1dGUgPSAyNzg7XG4gICAgdC5hZ3JhdmUgPSA1NTY7XG4gICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5DYWN1dGUgPSA3MjI7XG4gICAgdC5hdGlsZGUgPSA1NTY7XG4gICAgdC5FZG90YWNjZW50ID0gNjY3O1xuICAgIHQuc2Nhcm9uID0gNTU2O1xuICAgIHQuc2NlZGlsbGEgPSA1NTY7XG4gICAgdC5pYWN1dGUgPSAyNzg7XG4gICAgdC5sb3plbmdlID0gNDk0O1xuICAgIHQuUmNhcm9uID0gNzIyO1xuICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4O1xuICAgIHQudWNpcmN1bWZsZXggPSA2MTE7XG4gICAgdC5hY2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LkFtYWNyb24gPSA3MjI7XG4gICAgdC5yY2Fyb24gPSAzODk7XG4gICAgdC5jY2VkaWxsYSA9IDU1NjtcbiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7XG4gICAgdC5UaG9ybiA9IDY2NztcbiAgICB0Lk9tYWNyb24gPSA3Nzg7XG4gICAgdC5SYWN1dGUgPSA3MjI7XG4gICAgdC5TYWN1dGUgPSA2Njc7XG4gICAgdC5kY2Fyb24gPSA3NDM7XG4gICAgdC5VbWFjcm9uID0gNzIyO1xuICAgIHQudXJpbmcgPSA2MTE7XG4gICAgdC50aHJlZXN1cGVyaW9yID0gMzMzO1xuICAgIHQuT2dyYXZlID0gNzc4O1xuICAgIHQuQWdyYXZlID0gNzIyO1xuICAgIHQuQWJyZXZlID0gNzIyO1xuICAgIHQubXVsdGlwbHkgPSA1ODQ7XG4gICAgdC51YWN1dGUgPSA2MTE7XG4gICAgdC5UY2Fyb24gPSA2MTE7XG4gICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDtcbiAgICB0LnlkaWVyZXNpcyA9IDU1NjtcbiAgICB0Lk5hY3V0ZSA9IDcyMjtcbiAgICB0LmljaXJjdW1mbGV4ID0gMjc4O1xuICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7XG4gICAgdC5hZGllcmVzaXMgPSA1NTY7XG4gICAgdC5lZGllcmVzaXMgPSA1NTY7XG4gICAgdC5jYWN1dGUgPSA1NTY7XG4gICAgdC5uYWN1dGUgPSA2MTE7XG4gICAgdC51bWFjcm9uID0gNjExO1xuICAgIHQuTmNhcm9uID0gNzIyO1xuICAgIHQuSWFjdXRlID0gMjc4O1xuICAgIHQucGx1c21pbnVzID0gNTg0O1xuICAgIHQuYnJva2VuYmFyID0gMjgwO1xuICAgIHQucmVnaXN0ZXJlZCA9IDczNztcbiAgICB0LkdicmV2ZSA9IDc3ODtcbiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7XG4gICAgdC5zdW1tYXRpb24gPSA2MDA7XG4gICAgdC5FZ3JhdmUgPSA2Njc7XG4gICAgdC5yYWN1dGUgPSAzODk7XG4gICAgdC5vbWFjcm9uID0gNjExO1xuICAgIHQuWmFjdXRlID0gNjExO1xuICAgIHQuWmNhcm9uID0gNjExO1xuICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5O1xuICAgIHQuRXRoID0gNzIyO1xuICAgIHQuQ2NlZGlsbGEgPSA3MjI7XG4gICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC50Y2Fyb24gPSAzODk7XG4gICAgdC5lb2dvbmVrID0gNTU2O1xuICAgIHQuVW9nb25layA9IDcyMjtcbiAgICB0LkFhY3V0ZSA9IDcyMjtcbiAgICB0LkFkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmVncmF2ZSA9IDU1NjtcbiAgICB0LnphY3V0ZSA9IDUwMDtcbiAgICB0LmlvZ29uZWsgPSAyNzg7XG4gICAgdC5PYWN1dGUgPSA3Nzg7XG4gICAgdC5vYWN1dGUgPSA2MTE7XG4gICAgdC5hbWFjcm9uID0gNTU2O1xuICAgIHQuc2FjdXRlID0gNTU2O1xuICAgIHQuaWRpZXJlc2lzID0gMjc4O1xuICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7XG4gICAgdC5VZ3JhdmUgPSA3MjI7XG4gICAgdC5EZWx0YSA9IDYxMjtcbiAgICB0LnRob3JuID0gNjExO1xuICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7XG4gICAgdC5PZGllcmVzaXMgPSA3Nzg7XG4gICAgdC5tdSA9IDYxMTtcbiAgICB0LmlncmF2ZSA9IDI3ODtcbiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7XG4gICAgdC5Fb2dvbmVrID0gNjY3O1xuICAgIHQuZGNyb2F0ID0gNjExO1xuICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDtcbiAgICB0LlNjZWRpbGxhID0gNjY3O1xuICAgIHQubGNhcm9uID0gNDAwO1xuICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQuTGFjdXRlID0gNjExO1xuICAgIHQudHJhZGVtYXJrID0gMTAwMDtcbiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7XG4gICAgdC5JZ3JhdmUgPSAyNzg7XG4gICAgdC5JbWFjcm9uID0gMjc4O1xuICAgIHQuTGNhcm9uID0gNjExO1xuICAgIHQub25laGFsZiA9IDgzNDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNjExO1xuICAgIHQubnRpbGRlID0gNjExO1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDY2NztcbiAgICB0LmVtYWNyb24gPSA1NTY7XG4gICAgdC5nYnJldmUgPSA2MTE7XG4gICAgdC5vbmVxdWFydGVyID0gODM0O1xuICAgIHQuU2Nhcm9uID0gNjY3O1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDYxMTtcbiAgICB0LkNjYXJvbiA9IDcyMjtcbiAgICB0LnVncmF2ZSA9IDYxMTtcbiAgICB0LnJhZGljYWwgPSA1NDk7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzODk7XG4gICAgdC5OdGlsZGUgPSA3MjI7XG4gICAgdC5vdGlsZGUgPSA2MTE7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5BdGlsZGUgPSA3MjI7XG4gICAgdC5Bb2dvbmVrID0gNzIyO1xuICAgIHQuQXJpbmcgPSA3MjI7XG4gICAgdC5PdGlsZGUgPSA3Nzg7XG4gICAgdC56ZG90YWNjZW50ID0gNTAwO1xuICAgIHQuRWNhcm9uID0gNjY3O1xuICAgIHQuSW9nb25layA9IDI3ODtcbiAgICB0Lmtjb21tYWFjY2VudCA9IDU1NjtcbiAgICB0Lm1pbnVzID0gNTg0O1xuICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7XG4gICAgdC5uY2Fyb24gPSA2MTE7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7XG4gICAgdC5sb2dpY2Fsbm90ID0gNTg0O1xuICAgIHQub2RpZXJlc2lzID0gNjExO1xuICAgIHQudWRpZXJlc2lzID0gNjExO1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5ldGggPSA2MTE7XG4gICAgdC56Y2Fyb24gPSA1MDA7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMzMztcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTU2O1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0W1wiSGVsdmV0aWNhLU9ibGlxdWVcIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHtcbiAgICB0LnNwYWNlID0gMjc4O1xuICAgIHQuZXhjbGFtID0gMjc4O1xuICAgIHQucXVvdGVkYmwgPSAzNTU7XG4gICAgdC5udW1iZXJzaWduID0gNTU2O1xuICAgIHQuZG9sbGFyID0gNTU2O1xuICAgIHQucGVyY2VudCA9IDg4OTtcbiAgICB0LmFtcGVyc2FuZCA9IDY2NztcbiAgICB0LnF1b3RlcmlnaHQgPSAyMjI7XG4gICAgdC5wYXJlbmxlZnQgPSAzMzM7XG4gICAgdC5wYXJlbnJpZ2h0ID0gMzMzO1xuICAgIHQuYXN0ZXJpc2sgPSAzODk7XG4gICAgdC5wbHVzID0gNTg0O1xuICAgIHQuY29tbWEgPSAyNzg7XG4gICAgdC5oeXBoZW4gPSAzMzM7XG4gICAgdC5wZXJpb2QgPSAyNzg7XG4gICAgdC5zbGFzaCA9IDI3ODtcbiAgICB0Lnplcm8gPSA1NTY7XG4gICAgdC5vbmUgPSA1NTY7XG4gICAgdC50d28gPSA1NTY7XG4gICAgdC50aHJlZSA9IDU1NjtcbiAgICB0LmZvdXIgPSA1NTY7XG4gICAgdC5maXZlID0gNTU2O1xuICAgIHQuc2l4ID0gNTU2O1xuICAgIHQuc2V2ZW4gPSA1NTY7XG4gICAgdC5laWdodCA9IDU1NjtcbiAgICB0Lm5pbmUgPSA1NTY7XG4gICAgdC5jb2xvbiA9IDI3ODtcbiAgICB0LnNlbWljb2xvbiA9IDI3ODtcbiAgICB0Lmxlc3MgPSA1ODQ7XG4gICAgdC5lcXVhbCA9IDU4NDtcbiAgICB0LmdyZWF0ZXIgPSA1ODQ7XG4gICAgdC5xdWVzdGlvbiA9IDU1NjtcbiAgICB0LmF0ID0gMTAxNTtcbiAgICB0LkEgPSA2Njc7XG4gICAgdC5CID0gNjY3O1xuICAgIHQuQyA9IDcyMjtcbiAgICB0LkQgPSA3MjI7XG4gICAgdC5FID0gNjY3O1xuICAgIHQuRiA9IDYxMTtcbiAgICB0LkcgPSA3Nzg7XG4gICAgdC5IID0gNzIyO1xuICAgIHQuSSA9IDI3ODtcbiAgICB0LkogPSA1MDA7XG4gICAgdC5LID0gNjY3O1xuICAgIHQuTCA9IDU1NjtcbiAgICB0Lk0gPSA4MzM7XG4gICAgdC5OID0gNzIyO1xuICAgIHQuTyA9IDc3ODtcbiAgICB0LlAgPSA2Njc7XG4gICAgdC5RID0gNzc4O1xuICAgIHQuUiA9IDcyMjtcbiAgICB0LlMgPSA2Njc7XG4gICAgdC5UID0gNjExO1xuICAgIHQuVSA9IDcyMjtcbiAgICB0LlYgPSA2Njc7XG4gICAgdC5XID0gOTQ0O1xuICAgIHQuWCA9IDY2NztcbiAgICB0LlkgPSA2Njc7XG4gICAgdC5aID0gNjExO1xuICAgIHQuYnJhY2tldGxlZnQgPSAyNzg7XG4gICAgdC5iYWNrc2xhc2ggPSAyNzg7XG4gICAgdC5icmFja2V0cmlnaHQgPSAyNzg7XG4gICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTtcbiAgICB0LnVuZGVyc2NvcmUgPSA1NTY7XG4gICAgdC5xdW90ZWxlZnQgPSAyMjI7XG4gICAgdC5hID0gNTU2O1xuICAgIHQuYiA9IDU1NjtcbiAgICB0LmMgPSA1MDA7XG4gICAgdC5kID0gNTU2O1xuICAgIHQuZSA9IDU1NjtcbiAgICB0LmYgPSAyNzg7XG4gICAgdC5nID0gNTU2O1xuICAgIHQuaCA9IDU1NjtcbiAgICB0LmkgPSAyMjI7XG4gICAgdC5qID0gMjIyO1xuICAgIHQuayA9IDUwMDtcbiAgICB0LmwgPSAyMjI7XG4gICAgdC5tID0gODMzO1xuICAgIHQubiA9IDU1NjtcbiAgICB0Lm8gPSA1NTY7XG4gICAgdC5wID0gNTU2O1xuICAgIHQucSA9IDU1NjtcbiAgICB0LnIgPSAzMzM7XG4gICAgdC5zID0gNTAwO1xuICAgIHQudCA9IDI3ODtcbiAgICB0LnUgPSA1NTY7XG4gICAgdC52ID0gNTAwO1xuICAgIHQudyA9IDcyMjtcbiAgICB0LnggPSA1MDA7XG4gICAgdC55ID0gNTAwO1xuICAgIHQueiA9IDUwMDtcbiAgICB0LmJyYWNlbGVmdCA9IDMzNDtcbiAgICB0LmJhciA9IDI2MDtcbiAgICB0LmJyYWNlcmlnaHQgPSAzMzQ7XG4gICAgdC5hc2NpaXRpbGRlID0gNTg0O1xuICAgIHQuZXhjbGFtZG93biA9IDMzMztcbiAgICB0LmNlbnQgPSA1NTY7XG4gICAgdC5zdGVybGluZyA9IDU1NjtcbiAgICB0LmZyYWN0aW9uID0gMTY3O1xuICAgIHQueWVuID0gNTU2O1xuICAgIHQuZmxvcmluID0gNTU2O1xuICAgIHQuc2VjdGlvbiA9IDU1NjtcbiAgICB0LmN1cnJlbmN5ID0gNTU2O1xuICAgIHQucXVvdGVzaW5nbGUgPSAxOTE7XG4gICAgdC5xdW90ZWRibGxlZnQgPSAzMzM7XG4gICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2O1xuICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMztcbiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzO1xuICAgIHQuZmkgPSA1MDA7XG4gICAgdC5mbCA9IDUwMDtcbiAgICB0LmVuZGFzaCA9IDU1NjtcbiAgICB0LmRhZ2dlciA9IDU1NjtcbiAgICB0LmRhZ2dlcmRibCA9IDU1NjtcbiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4O1xuICAgIHQucGFyYWdyYXBoID0gNTM3O1xuICAgIHQuYnVsbGV0ID0gMzUwO1xuICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyMjI7XG4gICAgdC5xdW90ZWRibGJhc2UgPSAzMzM7XG4gICAgdC5xdW90ZWRibHJpZ2h0ID0gMzMzO1xuICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7XG4gICAgdC5lbGxpcHNpcyA9IDEwMDA7XG4gICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7XG4gICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7XG4gICAgdC5ncmF2ZSA9IDMzMztcbiAgICB0LmFjdXRlID0gMzMzO1xuICAgIHQuY2lyY3VtZmxleCA9IDMzMztcbiAgICB0LnRpbGRlID0gMzMzO1xuICAgIHQubWFjcm9uID0gMzMzO1xuICAgIHQuYnJldmUgPSAzMzM7XG4gICAgdC5kb3RhY2NlbnQgPSAzMzM7XG4gICAgdC5kaWVyZXNpcyA9IDMzMztcbiAgICB0LnJpbmcgPSAzMzM7XG4gICAgdC5jZWRpbGxhID0gMzMzO1xuICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzO1xuICAgIHQub2dvbmVrID0gMzMzO1xuICAgIHQuY2Fyb24gPSAzMzM7XG4gICAgdC5lbWRhc2ggPSAxMDAwO1xuICAgIHQuQUUgPSAxMDAwO1xuICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7XG4gICAgdC5Mc2xhc2ggPSA1NTY7XG4gICAgdC5Pc2xhc2ggPSA3Nzg7XG4gICAgdC5PRSA9IDEwMDA7XG4gICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7XG4gICAgdC5hZSA9IDg4OTtcbiAgICB0LmRvdGxlc3NpID0gMjc4O1xuICAgIHQubHNsYXNoID0gMjIyO1xuICAgIHQub3NsYXNoID0gNjExO1xuICAgIHQub2UgPSA5NDQ7XG4gICAgdC5nZXJtYW5kYmxzID0gNjExO1xuICAgIHQuSWRpZXJlc2lzID0gMjc4O1xuICAgIHQuZWFjdXRlID0gNTU2O1xuICAgIHQuYWJyZXZlID0gNTU2O1xuICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjtcbiAgICB0LmVjYXJvbiA9IDU1NjtcbiAgICB0LllkaWVyZXNpcyA9IDY2NztcbiAgICB0LmRpdmlkZSA9IDU4NDtcbiAgICB0LllhY3V0ZSA9IDY2NztcbiAgICB0LkFjaXJjdW1mbGV4ID0gNjY3O1xuICAgIHQuYWFjdXRlID0gNTU2O1xuICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7XG4gICAgdC55YWN1dGUgPSA1MDA7XG4gICAgdC5zY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5lY2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LlVyaW5nID0gNzIyO1xuICAgIHQuVWRpZXJlc2lzID0gNzIyO1xuICAgIHQuYW9nb25layA9IDU1NjtcbiAgICB0LlVhY3V0ZSA9IDcyMjtcbiAgICB0LnVvZ29uZWsgPSA1NTY7XG4gICAgdC5FZGllcmVzaXMgPSA2Njc7XG4gICAgdC5EY3JvYXQgPSA3MjI7XG4gICAgdC5jb21tYWFjY2VudCA9IDI1MDtcbiAgICB0LmNvcHlyaWdodCA9IDczNztcbiAgICB0LkVtYWNyb24gPSA2Njc7XG4gICAgdC5jY2Fyb24gPSA1MDA7XG4gICAgdC5hcmluZyA9IDU1NjtcbiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LmxhY3V0ZSA9IDIyMjtcbiAgICB0LmFncmF2ZSA9IDU1NjtcbiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTtcbiAgICB0LkNhY3V0ZSA9IDcyMjtcbiAgICB0LmF0aWxkZSA9IDU1NjtcbiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7XG4gICAgdC5zY2Fyb24gPSA1MDA7XG4gICAgdC5zY2VkaWxsYSA9IDUwMDtcbiAgICB0LmlhY3V0ZSA9IDI3ODtcbiAgICB0LmxvemVuZ2UgPSA0NzE7XG4gICAgdC5SY2Fyb24gPSA3MjI7XG4gICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7XG4gICAgdC51Y2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LmFjaXJjdW1mbGV4ID0gNTU2O1xuICAgIHQuQW1hY3JvbiA9IDY2NztcbiAgICB0LnJjYXJvbiA9IDMzMztcbiAgICB0LmNjZWRpbGxhID0gNTAwO1xuICAgIHQuWmRvdGFjY2VudCA9IDYxMTtcbiAgICB0LlRob3JuID0gNjY3O1xuICAgIHQuT21hY3JvbiA9IDc3ODtcbiAgICB0LlJhY3V0ZSA9IDcyMjtcbiAgICB0LlNhY3V0ZSA9IDY2NztcbiAgICB0LmRjYXJvbiA9IDY0MztcbiAgICB0LlVtYWNyb24gPSA3MjI7XG4gICAgdC51cmluZyA9IDU1NjtcbiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7XG4gICAgdC5PZ3JhdmUgPSA3Nzg7XG4gICAgdC5BZ3JhdmUgPSA2Njc7XG4gICAgdC5BYnJldmUgPSA2Njc7XG4gICAgdC5tdWx0aXBseSA9IDU4NDtcbiAgICB0LnVhY3V0ZSA9IDU1NjtcbiAgICB0LlRjYXJvbiA9IDYxMTtcbiAgICB0LnBhcnRpYWxkaWZmID0gNDc2O1xuICAgIHQueWRpZXJlc2lzID0gNTAwO1xuICAgIHQuTmFjdXRlID0gNzIyO1xuICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7XG4gICAgdC5FY2lyY3VtZmxleCA9IDY2NztcbiAgICB0LmFkaWVyZXNpcyA9IDU1NjtcbiAgICB0LmVkaWVyZXNpcyA9IDU1NjtcbiAgICB0LmNhY3V0ZSA9IDUwMDtcbiAgICB0Lm5hY3V0ZSA9IDU1NjtcbiAgICB0LnVtYWNyb24gPSA1NTY7XG4gICAgdC5OY2Fyb24gPSA3MjI7XG4gICAgdC5JYWN1dGUgPSAyNzg7XG4gICAgdC5wbHVzbWludXMgPSA1ODQ7XG4gICAgdC5icm9rZW5iYXIgPSAyNjA7XG4gICAgdC5yZWdpc3RlcmVkID0gNzM3O1xuICAgIHQuR2JyZXZlID0gNzc4O1xuICAgIHQuSWRvdGFjY2VudCA9IDI3ODtcbiAgICB0LnN1bW1hdGlvbiA9IDYwMDtcbiAgICB0LkVncmF2ZSA9IDY2NztcbiAgICB0LnJhY3V0ZSA9IDMzMztcbiAgICB0Lm9tYWNyb24gPSA1NTY7XG4gICAgdC5aYWN1dGUgPSA2MTE7XG4gICAgdC5aY2Fyb24gPSA2MTE7XG4gICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7XG4gICAgdC5FdGggPSA3MjI7XG4gICAgdC5DY2VkaWxsYSA9IDcyMjtcbiAgICB0Lmxjb21tYWFjY2VudCA9IDIyMjtcbiAgICB0LnRjYXJvbiA9IDMxNztcbiAgICB0LmVvZ29uZWsgPSA1NTY7XG4gICAgdC5Vb2dvbmVrID0gNzIyO1xuICAgIHQuQWFjdXRlID0gNjY3O1xuICAgIHQuQWRpZXJlc2lzID0gNjY3O1xuICAgIHQuZWdyYXZlID0gNTU2O1xuICAgIHQuemFjdXRlID0gNTAwO1xuICAgIHQuaW9nb25layA9IDIyMjtcbiAgICB0Lk9hY3V0ZSA9IDc3ODtcbiAgICB0Lm9hY3V0ZSA9IDU1NjtcbiAgICB0LmFtYWNyb24gPSA1NTY7XG4gICAgdC5zYWN1dGUgPSA1MDA7XG4gICAgdC5pZGllcmVzaXMgPSAyNzg7XG4gICAgdC5PY2lyY3VtZmxleCA9IDc3ODtcbiAgICB0LlVncmF2ZSA9IDcyMjtcbiAgICB0LkRlbHRhID0gNjEyO1xuICAgIHQudGhvcm4gPSA1NTY7XG4gICAgdC50d29zdXBlcmlvciA9IDMzMztcbiAgICB0Lk9kaWVyZXNpcyA9IDc3ODtcbiAgICB0Lm11ID0gNTU2O1xuICAgIHQuaWdyYXZlID0gMjc4O1xuICAgIHQub2h1bmdhcnVtbGF1dCA9IDU1NjtcbiAgICB0LkVvZ29uZWsgPSA2Njc7XG4gICAgdC5kY3JvYXQgPSA1NTY7XG4gICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0O1xuICAgIHQuU2NlZGlsbGEgPSA2Njc7XG4gICAgdC5sY2Fyb24gPSAyOTk7XG4gICAgdC5LY29tbWFhY2NlbnQgPSA2Njc7XG4gICAgdC5MYWN1dGUgPSA1NTY7XG4gICAgdC50cmFkZW1hcmsgPSAxMDAwO1xuICAgIHQuZWRvdGFjY2VudCA9IDU1NjtcbiAgICB0LklncmF2ZSA9IDI3ODtcbiAgICB0LkltYWNyb24gPSAyNzg7XG4gICAgdC5MY2Fyb24gPSA1NTY7XG4gICAgdC5vbmVoYWxmID0gODM0O1xuICAgIHQubGVzc2VxdWFsID0gNTQ5O1xuICAgIHQub2NpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5udGlsZGUgPSA1NTY7XG4gICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyO1xuICAgIHQuRWFjdXRlID0gNjY3O1xuICAgIHQuZW1hY3JvbiA9IDU1NjtcbiAgICB0LmdicmV2ZSA9IDU1NjtcbiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7XG4gICAgdC5TY2Fyb24gPSA2Njc7XG4gICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7XG4gICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4O1xuICAgIHQuZGVncmVlID0gNDAwO1xuICAgIHQub2dyYXZlID0gNTU2O1xuICAgIHQuQ2Nhcm9uID0gNzIyO1xuICAgIHQudWdyYXZlID0gNTU2O1xuICAgIHQucmFkaWNhbCA9IDQ1MztcbiAgICB0LkRjYXJvbiA9IDcyMjtcbiAgICB0LnJjb21tYWFjY2VudCA9IDMzMztcbiAgICB0Lk50aWxkZSA9IDcyMjtcbiAgICB0Lm90aWxkZSA9IDU1NjtcbiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjtcbiAgICB0LkF0aWxkZSA9IDY2NztcbiAgICB0LkFvZ29uZWsgPSA2Njc7XG4gICAgdC5BcmluZyA9IDY2NztcbiAgICB0Lk90aWxkZSA9IDc3ODtcbiAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7XG4gICAgdC5FY2Fyb24gPSA2Njc7XG4gICAgdC5Jb2dvbmVrID0gMjc4O1xuICAgIHQua2NvbW1hYWNjZW50ID0gNTAwO1xuICAgIHQubWludXMgPSA1ODQ7XG4gICAgdC5JY2lyY3VtZmxleCA9IDI3ODtcbiAgICB0Lm5jYXJvbiA9IDU1NjtcbiAgICB0LnRjb21tYWFjY2VudCA9IDI3ODtcbiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7XG4gICAgdC5vZGllcmVzaXMgPSA1NTY7XG4gICAgdC51ZGllcmVzaXMgPSA1NTY7XG4gICAgdC5ub3RlcXVhbCA9IDU0OTtcbiAgICB0Lmdjb21tYWFjY2VudCA9IDU1NjtcbiAgICB0LmV0aCA9IDU1NjtcbiAgICB0LnpjYXJvbiA9IDUwMDtcbiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjtcbiAgICB0Lm9uZXN1cGVyaW9yID0gMzMzO1xuICAgIHQuaW1hY3JvbiA9IDI3ODtcbiAgICB0LkV1cm8gPSA1NTY7XG4gIH0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHQuU3ltYm9sID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgdC5zcGFjZSA9IDI1MDtcbiAgICB0LmV4Y2xhbSA9IDMzMztcbiAgICB0LnVuaXZlcnNhbCA9IDcxMztcbiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7XG4gICAgdC5leGlzdGVudGlhbCA9IDU0OTtcbiAgICB0LnBlcmNlbnQgPSA4MzM7XG4gICAgdC5hbXBlcnNhbmQgPSA3Nzg7XG4gICAgdC5zdWNodGhhdCA9IDQzOTtcbiAgICB0LnBhcmVubGVmdCA9IDMzMztcbiAgICB0LnBhcmVucmlnaHQgPSAzMzM7XG4gICAgdC5hc3Rlcmlza21hdGggPSA1MDA7XG4gICAgdC5wbHVzID0gNTQ5O1xuICAgIHQuY29tbWEgPSAyNTA7XG4gICAgdC5taW51cyA9IDU0OTtcbiAgICB0LnBlcmlvZCA9IDI1MDtcbiAgICB0LnNsYXNoID0gMjc4O1xuICAgIHQuemVybyA9IDUwMDtcbiAgICB0Lm9uZSA9IDUwMDtcbiAgICB0LnR3byA9IDUwMDtcbiAgICB0LnRocmVlID0gNTAwO1xuICAgIHQuZm91ciA9IDUwMDtcbiAgICB0LmZpdmUgPSA1MDA7XG4gICAgdC5zaXggPSA1MDA7XG4gICAgdC5zZXZlbiA9IDUwMDtcbiAgICB0LmVpZ2h0ID0gNTAwO1xuICAgIHQubmluZSA9IDUwMDtcbiAgICB0LmNvbG9uID0gMjc4O1xuICAgIHQuc2VtaWNvbG9uID0gMjc4O1xuICAgIHQubGVzcyA9IDU0OTtcbiAgICB0LmVxdWFsID0gNTQ5O1xuICAgIHQuZ3JlYXRlciA9IDU0OTtcbiAgICB0LnF1ZXN0aW9uID0gNDQ0O1xuICAgIHQuY29uZ3J1ZW50ID0gNTQ5O1xuICAgIHQuQWxwaGEgPSA3MjI7XG4gICAgdC5CZXRhID0gNjY3O1xuICAgIHQuQ2hpID0gNzIyO1xuICAgIHQuRGVsdGEgPSA2MTI7XG4gICAgdC5FcHNpbG9uID0gNjExO1xuICAgIHQuUGhpID0gNzYzO1xuICAgIHQuR2FtbWEgPSA2MDM7XG4gICAgdC5FdGEgPSA3MjI7XG4gICAgdC5Jb3RhID0gMzMzO1xuICAgIHQudGhldGExID0gNjMxO1xuICAgIHQuS2FwcGEgPSA3MjI7XG4gICAgdC5MYW1iZGEgPSA2ODY7XG4gICAgdC5NdSA9IDg4OTtcbiAgICB0Lk51ID0gNzIyO1xuICAgIHQuT21pY3JvbiA9IDcyMjtcbiAgICB0LlBpID0gNzY4O1xuICAgIHQuVGhldGEgPSA3NDE7XG4gICAgdC5SaG8gPSA1NTY7XG4gICAgdC5TaWdtYSA9IDU5MjtcbiAgICB0LlRhdSA9IDYxMTtcbiAgICB0LlVwc2lsb24gPSA2OTA7XG4gICAgdC5zaWdtYTEgPSA0Mzk7XG4gICAgdC5PbWVnYSA9IDc2ODtcbiAgICB0LlhpID0gNjQ1O1xuICAgIHQuUHNpID0gNzk1O1xuICAgIHQuWmV0YSA9IDYxMTtcbiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzO1xuICAgIHQudGhlcmVmb3JlID0gODYzO1xuICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzO1xuICAgIHQucGVycGVuZGljdWxhciA9IDY1ODtcbiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7XG4gICAgdC5yYWRpY2FsZXggPSA1MDA7XG4gICAgdC5hbHBoYSA9IDYzMTtcbiAgICB0LmJldGEgPSA1NDk7XG4gICAgdC5jaGkgPSA1NDk7XG4gICAgdC5kZWx0YSA9IDQ5NDtcbiAgICB0LmVwc2lsb24gPSA0Mzk7XG4gICAgdC5waGkgPSA1MjE7XG4gICAgdC5nYW1tYSA9IDQxMTtcbiAgICB0LmV0YSA9IDYwMztcbiAgICB0LmlvdGEgPSAzMjk7XG4gICAgdC5waGkxID0gNjAzO1xuICAgIHQua2FwcGEgPSA1NDk7XG4gICAgdC5sYW1iZGEgPSA1NDk7XG4gICAgdC5tdSA9IDU3NjtcbiAgICB0Lm51ID0gNTIxO1xuICAgIHQub21pY3JvbiA9IDU0OTtcbiAgICB0LnBpID0gNTQ5O1xuICAgIHQudGhldGEgPSA1MjE7XG4gICAgdC5yaG8gPSA1NDk7XG4gICAgdC5zaWdtYSA9IDYwMztcbiAgICB0LnRhdSA9IDQzOTtcbiAgICB0LnVwc2lsb24gPSA1NzY7XG4gICAgdC5vbWVnYTEgPSA3MTM7XG4gICAgdC5vbWVnYSA9IDY4NjtcbiAgICB0LnhpID0gNDkzO1xuICAgIHQucHNpID0gNjg2O1xuICAgIHQuemV0YSA9IDQ5NDtcbiAgICB0LmJyYWNlbGVmdCA9IDQ4MDtcbiAgICB0LmJhciA9IDIwMDtcbiAgICB0LmJyYWNlcmlnaHQgPSA0ODA7XG4gICAgdC5zaW1pbGFyID0gNTQ5O1xuICAgIHQuRXVybyA9IDc1MDtcbiAgICB0LlVwc2lsb24xID0gNjIwO1xuICAgIHQubWludXRlID0gMjQ3O1xuICAgIHQubGVzc2VxdWFsID0gNTQ5O1xuICAgIHQuZnJhY3Rpb24gPSAxNjc7XG4gICAgdC5pbmZpbml0eSA9IDcxMztcbiAgICB0LmZsb3JpbiA9IDUwMDtcbiAgICB0LmNsdWIgPSA3NTM7XG4gICAgdC5kaWFtb25kID0gNzUzO1xuICAgIHQuaGVhcnQgPSA3NTM7XG4gICAgdC5zcGFkZSA9IDc1MztcbiAgICB0LmFycm93Ym90aCA9IDEwNDI7XG4gICAgdC5hcnJvd2xlZnQgPSA5ODc7XG4gICAgdC5hcnJvd3VwID0gNjAzO1xuICAgIHQuYXJyb3dyaWdodCA9IDk4NztcbiAgICB0LmFycm93ZG93biA9IDYwMztcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0LnBsdXNtaW51cyA9IDU0OTtcbiAgICB0LnNlY29uZCA9IDQxMTtcbiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTtcbiAgICB0Lm11bHRpcGx5ID0gNTQ5O1xuICAgIHQucHJvcG9ydGlvbmFsID0gNzEzO1xuICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7XG4gICAgdC5idWxsZXQgPSA0NjA7XG4gICAgdC5kaXZpZGUgPSA1NDk7XG4gICAgdC5ub3RlcXVhbCA9IDU0OTtcbiAgICB0LmVxdWl2YWxlbmNlID0gNTQ5O1xuICAgIHQuYXBwcm94ZXF1YWwgPSA1NDk7XG4gICAgdC5lbGxpcHNpcyA9IDEwMDA7XG4gICAgdC5hcnJvd3ZlcnRleCA9IDYwMztcbiAgICB0LmFycm93aG9yaXpleCA9IDEwMDA7XG4gICAgdC5jYXJyaWFnZXJldHVybiA9IDY1ODtcbiAgICB0LmFsZXBoID0gODIzO1xuICAgIHQuSWZyYWt0dXIgPSA2ODY7XG4gICAgdC5SZnJha3R1ciA9IDc5NTtcbiAgICB0LndlaWVyc3RyYXNzID0gOTg3O1xuICAgIHQuY2lyY2xlbXVsdGlwbHkgPSA3Njg7XG4gICAgdC5jaXJjbGVwbHVzID0gNzY4O1xuICAgIHQuZW1wdHlzZXQgPSA4MjM7XG4gICAgdC5pbnRlcnNlY3Rpb24gPSA3Njg7XG4gICAgdC51bmlvbiA9IDc2ODtcbiAgICB0LnByb3BlcnN1cGVyc2V0ID0gNzEzO1xuICAgIHQucmVmbGV4c3VwZXJzZXQgPSA3MTM7XG4gICAgdC5ub3RzdWJzZXQgPSA3MTM7XG4gICAgdC5wcm9wZXJzdWJzZXQgPSA3MTM7XG4gICAgdC5yZWZsZXhzdWJzZXQgPSA3MTM7XG4gICAgdC5lbGVtZW50ID0gNzEzO1xuICAgIHQubm90ZWxlbWVudCA9IDcxMztcbiAgICB0LmFuZ2xlID0gNzY4O1xuICAgIHQuZ3JhZGllbnQgPSA3MTM7XG4gICAgdC5yZWdpc3RlcnNlcmlmID0gNzkwO1xuICAgIHQuY29weXJpZ2h0c2VyaWYgPSA3OTA7XG4gICAgdC50cmFkZW1hcmtzZXJpZiA9IDg5MDtcbiAgICB0LnByb2R1Y3QgPSA4MjM7XG4gICAgdC5yYWRpY2FsID0gNTQ5O1xuICAgIHQuZG90bWF0aCA9IDI1MDtcbiAgICB0LmxvZ2ljYWxub3QgPSA3MTM7XG4gICAgdC5sb2dpY2FsYW5kID0gNjAzO1xuICAgIHQubG9naWNhbG9yID0gNjAzO1xuICAgIHQuYXJyb3dkYmxib3RoID0gMTA0MjtcbiAgICB0LmFycm93ZGJsbGVmdCA9IDk4NztcbiAgICB0LmFycm93ZGJsdXAgPSA2MDM7XG4gICAgdC5hcnJvd2RibHJpZ2h0ID0gOTg3O1xuICAgIHQuYXJyb3dkYmxkb3duID0gNjAzO1xuICAgIHQubG96ZW5nZSA9IDQ5NDtcbiAgICB0LmFuZ2xlbGVmdCA9IDMyOTtcbiAgICB0LnJlZ2lzdGVyc2FucyA9IDc5MDtcbiAgICB0LmNvcHlyaWdodHNhbnMgPSA3OTA7XG4gICAgdC50cmFkZW1hcmtzYW5zID0gNzg2O1xuICAgIHQuc3VtbWF0aW9uID0gNzEzO1xuICAgIHQucGFyZW5sZWZ0dHAgPSAzODQ7XG4gICAgdC5wYXJlbmxlZnRleCA9IDM4NDtcbiAgICB0LnBhcmVubGVmdGJ0ID0gMzg0O1xuICAgIHQuYnJhY2tldGxlZnR0cCA9IDM4NDtcbiAgICB0LmJyYWNrZXRsZWZ0ZXggPSAzODQ7XG4gICAgdC5icmFja2V0bGVmdGJ0ID0gMzg0O1xuICAgIHQuYnJhY2VsZWZ0dHAgPSA0OTQ7XG4gICAgdC5icmFjZWxlZnRtaWQgPSA0OTQ7XG4gICAgdC5icmFjZWxlZnRidCA9IDQ5NDtcbiAgICB0LmJyYWNlZXggPSA0OTQ7XG4gICAgdC5hbmdsZXJpZ2h0ID0gMzI5O1xuICAgIHQuaW50ZWdyYWwgPSAyNzQ7XG4gICAgdC5pbnRlZ3JhbHRwID0gNjg2O1xuICAgIHQuaW50ZWdyYWxleCA9IDY4NjtcbiAgICB0LmludGVncmFsYnQgPSA2ODY7XG4gICAgdC5wYXJlbnJpZ2h0dHAgPSAzODQ7XG4gICAgdC5wYXJlbnJpZ2h0ZXggPSAzODQ7XG4gICAgdC5wYXJlbnJpZ2h0YnQgPSAzODQ7XG4gICAgdC5icmFja2V0cmlnaHR0cCA9IDM4NDtcbiAgICB0LmJyYWNrZXRyaWdodGV4ID0gMzg0O1xuICAgIHQuYnJhY2tldHJpZ2h0YnQgPSAzODQ7XG4gICAgdC5icmFjZXJpZ2h0dHAgPSA0OTQ7XG4gICAgdC5icmFjZXJpZ2h0bWlkID0gNDk0O1xuICAgIHQuYnJhY2VyaWdodGJ0ID0gNDk0O1xuICAgIHQuYXBwbGUgPSA3OTA7XG4gIH0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRbXCJUaW1lcy1Sb21hblwiXSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICAgIHQuc3BhY2UgPSAyNTA7XG4gICAgdC5leGNsYW0gPSAzMzM7XG4gICAgdC5xdW90ZWRibCA9IDQwODtcbiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7XG4gICAgdC5kb2xsYXIgPSA1MDA7XG4gICAgdC5wZXJjZW50ID0gODMzO1xuICAgIHQuYW1wZXJzYW5kID0gNzc4O1xuICAgIHQucXVvdGVyaWdodCA9IDMzMztcbiAgICB0LnBhcmVubGVmdCA9IDMzMztcbiAgICB0LnBhcmVucmlnaHQgPSAzMzM7XG4gICAgdC5hc3RlcmlzayA9IDUwMDtcbiAgICB0LnBsdXMgPSA1NjQ7XG4gICAgdC5jb21tYSA9IDI1MDtcbiAgICB0Lmh5cGhlbiA9IDMzMztcbiAgICB0LnBlcmlvZCA9IDI1MDtcbiAgICB0LnNsYXNoID0gMjc4O1xuICAgIHQuemVybyA9IDUwMDtcbiAgICB0Lm9uZSA9IDUwMDtcbiAgICB0LnR3byA9IDUwMDtcbiAgICB0LnRocmVlID0gNTAwO1xuICAgIHQuZm91ciA9IDUwMDtcbiAgICB0LmZpdmUgPSA1MDA7XG4gICAgdC5zaXggPSA1MDA7XG4gICAgdC5zZXZlbiA9IDUwMDtcbiAgICB0LmVpZ2h0ID0gNTAwO1xuICAgIHQubmluZSA9IDUwMDtcbiAgICB0LmNvbG9uID0gMjc4O1xuICAgIHQuc2VtaWNvbG9uID0gMjc4O1xuICAgIHQubGVzcyA9IDU2NDtcbiAgICB0LmVxdWFsID0gNTY0O1xuICAgIHQuZ3JlYXRlciA9IDU2NDtcbiAgICB0LnF1ZXN0aW9uID0gNDQ0O1xuICAgIHQuYXQgPSA5MjE7XG4gICAgdC5BID0gNzIyO1xuICAgIHQuQiA9IDY2NztcbiAgICB0LkMgPSA2Njc7XG4gICAgdC5EID0gNzIyO1xuICAgIHQuRSA9IDYxMTtcbiAgICB0LkYgPSA1NTY7XG4gICAgdC5HID0gNzIyO1xuICAgIHQuSCA9IDcyMjtcbiAgICB0LkkgPSAzMzM7XG4gICAgdC5KID0gMzg5O1xuICAgIHQuSyA9IDcyMjtcbiAgICB0LkwgPSA2MTE7XG4gICAgdC5NID0gODg5O1xuICAgIHQuTiA9IDcyMjtcbiAgICB0Lk8gPSA3MjI7XG4gICAgdC5QID0gNTU2O1xuICAgIHQuUSA9IDcyMjtcbiAgICB0LlIgPSA2Njc7XG4gICAgdC5TID0gNTU2O1xuICAgIHQuVCA9IDYxMTtcbiAgICB0LlUgPSA3MjI7XG4gICAgdC5WID0gNzIyO1xuICAgIHQuVyA9IDk0NDtcbiAgICB0LlggPSA3MjI7XG4gICAgdC5ZID0gNzIyO1xuICAgIHQuWiA9IDYxMTtcbiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzO1xuICAgIHQuYmFja3NsYXNoID0gMjc4O1xuICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzO1xuICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7XG4gICAgdC51bmRlcnNjb3JlID0gNTAwO1xuICAgIHQucXVvdGVsZWZ0ID0gMzMzO1xuICAgIHQuYSA9IDQ0NDtcbiAgICB0LmIgPSA1MDA7XG4gICAgdC5jID0gNDQ0O1xuICAgIHQuZCA9IDUwMDtcbiAgICB0LmUgPSA0NDQ7XG4gICAgdC5mID0gMzMzO1xuICAgIHQuZyA9IDUwMDtcbiAgICB0LmggPSA1MDA7XG4gICAgdC5pID0gMjc4O1xuICAgIHQuaiA9IDI3ODtcbiAgICB0LmsgPSA1MDA7XG4gICAgdC5sID0gMjc4O1xuICAgIHQubSA9IDc3ODtcbiAgICB0Lm4gPSA1MDA7XG4gICAgdC5vID0gNTAwO1xuICAgIHQucCA9IDUwMDtcbiAgICB0LnEgPSA1MDA7XG4gICAgdC5yID0gMzMzO1xuICAgIHQucyA9IDM4OTtcbiAgICB0LnQgPSAyNzg7XG4gICAgdC51ID0gNTAwO1xuICAgIHQudiA9IDUwMDtcbiAgICB0LncgPSA3MjI7XG4gICAgdC54ID0gNTAwO1xuICAgIHQueSA9IDUwMDtcbiAgICB0LnogPSA0NDQ7XG4gICAgdC5icmFjZWxlZnQgPSA0ODA7XG4gICAgdC5iYXIgPSAyMDA7XG4gICAgdC5icmFjZXJpZ2h0ID0gNDgwO1xuICAgIHQuYXNjaWl0aWxkZSA9IDU0MTtcbiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7XG4gICAgdC5jZW50ID0gNTAwO1xuICAgIHQuc3RlcmxpbmcgPSA1MDA7XG4gICAgdC5mcmFjdGlvbiA9IDE2NztcbiAgICB0LnllbiA9IDUwMDtcbiAgICB0LmZsb3JpbiA9IDUwMDtcbiAgICB0LnNlY3Rpb24gPSA1MDA7XG4gICAgdC5jdXJyZW5jeSA9IDUwMDtcbiAgICB0LnF1b3Rlc2luZ2xlID0gMTgwO1xuICAgIHQucXVvdGVkYmxsZWZ0ID0gNDQ0O1xuICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDtcbiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7XG4gICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMztcbiAgICB0LmZpID0gNTU2O1xuICAgIHQuZmwgPSA1NTY7XG4gICAgdC5lbmRhc2ggPSA1MDA7XG4gICAgdC5kYWdnZXIgPSA1MDA7XG4gICAgdC5kYWdnZXJkYmwgPSA1MDA7XG4gICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI1MDtcbiAgICB0LnBhcmFncmFwaCA9IDQ1MztcbiAgICB0LmJ1bGxldCA9IDM1MDtcbiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMzMzO1xuICAgIHQucXVvdGVkYmxiYXNlID0gNDQ0O1xuICAgIHQucXVvdGVkYmxyaWdodCA9IDQ0NDtcbiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTAwO1xuICAgIHQuZWxsaXBzaXMgPSAxMDAwO1xuICAgIHQucGVydGhvdXNhbmQgPSAxMDAwO1xuICAgIHQucXVlc3Rpb25kb3duID0gNDQ0O1xuICAgIHQuZ3JhdmUgPSAzMzM7XG4gICAgdC5hY3V0ZSA9IDMzMztcbiAgICB0LmNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC50aWxkZSA9IDMzMztcbiAgICB0Lm1hY3JvbiA9IDMzMztcbiAgICB0LmJyZXZlID0gMzMzO1xuICAgIHQuZG90YWNjZW50ID0gMzMzO1xuICAgIHQuZGllcmVzaXMgPSAzMzM7XG4gICAgdC5yaW5nID0gMzMzO1xuICAgIHQuY2VkaWxsYSA9IDMzMztcbiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMztcbiAgICB0Lm9nb25layA9IDMzMztcbiAgICB0LmNhcm9uID0gMzMzO1xuICAgIHQuZW1kYXNoID0gMTAwMDtcbiAgICB0LkFFID0gODg5O1xuICAgIHQub3JkZmVtaW5pbmUgPSAyNzY7XG4gICAgdC5Mc2xhc2ggPSA2MTE7XG4gICAgdC5Pc2xhc2ggPSA3MjI7XG4gICAgdC5PRSA9IDg4OTtcbiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDtcbiAgICB0LmFlID0gNjY3O1xuICAgIHQuZG90bGVzc2kgPSAyNzg7XG4gICAgdC5sc2xhc2ggPSAyNzg7XG4gICAgdC5vc2xhc2ggPSA1MDA7XG4gICAgdC5vZSA9IDcyMjtcbiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7XG4gICAgdC5JZGllcmVzaXMgPSAzMzM7XG4gICAgdC5lYWN1dGUgPSA0NDQ7XG4gICAgdC5hYnJldmUgPSA0NDQ7XG4gICAgdC51aHVuZ2FydW1sYXV0ID0gNTAwO1xuICAgIHQuZWNhcm9uID0gNDQ0O1xuICAgIHQuWWRpZXJlc2lzID0gNzIyO1xuICAgIHQuZGl2aWRlID0gNTY0O1xuICAgIHQuWWFjdXRlID0gNzIyO1xuICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7XG4gICAgdC5hYWN1dGUgPSA0NDQ7XG4gICAgdC5VY2lyY3VtZmxleCA9IDcyMjtcbiAgICB0LnlhY3V0ZSA9IDUwMDtcbiAgICB0LnNjb21tYWFjY2VudCA9IDM4OTtcbiAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0O1xuICAgIHQuVXJpbmcgPSA3MjI7XG4gICAgdC5VZGllcmVzaXMgPSA3MjI7XG4gICAgdC5hb2dvbmVrID0gNDQ0O1xuICAgIHQuVWFjdXRlID0gNzIyO1xuICAgIHQudW9nb25layA9IDUwMDtcbiAgICB0LkVkaWVyZXNpcyA9IDYxMTtcbiAgICB0LkRjcm9hdCA9IDcyMjtcbiAgICB0LmNvbW1hYWNjZW50ID0gMjUwO1xuICAgIHQuY29weXJpZ2h0ID0gNzYwO1xuICAgIHQuRW1hY3JvbiA9IDYxMTtcbiAgICB0LmNjYXJvbiA9IDQ0NDtcbiAgICB0LmFyaW5nID0gNDQ0O1xuICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQubGFjdXRlID0gMjc4O1xuICAgIHQuYWdyYXZlID0gNDQ0O1xuICAgIHQuVGNvbW1hYWNjZW50ID0gNjExO1xuICAgIHQuQ2FjdXRlID0gNjY3O1xuICAgIHQuYXRpbGRlID0gNDQ0O1xuICAgIHQuRWRvdGFjY2VudCA9IDYxMTtcbiAgICB0LnNjYXJvbiA9IDM4OTtcbiAgICB0LnNjZWRpbGxhID0gMzg5O1xuICAgIHQuaWFjdXRlID0gMjc4O1xuICAgIHQubG96ZW5nZSA9IDQ3MTtcbiAgICB0LlJjYXJvbiA9IDY2NztcbiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LnVjaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQuYWNpcmN1bWZsZXggPSA0NDQ7XG4gICAgdC5BbWFjcm9uID0gNzIyO1xuICAgIHQucmNhcm9uID0gMzMzO1xuICAgIHQuY2NlZGlsbGEgPSA0NDQ7XG4gICAgdC5aZG90YWNjZW50ID0gNjExO1xuICAgIHQuVGhvcm4gPSA1NTY7XG4gICAgdC5PbWFjcm9uID0gNzIyO1xuICAgIHQuUmFjdXRlID0gNjY3O1xuICAgIHQuU2FjdXRlID0gNTU2O1xuICAgIHQuZGNhcm9uID0gNTg4O1xuICAgIHQuVW1hY3JvbiA9IDcyMjtcbiAgICB0LnVyaW5nID0gNTAwO1xuICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDtcbiAgICB0Lk9ncmF2ZSA9IDcyMjtcbiAgICB0LkFncmF2ZSA9IDcyMjtcbiAgICB0LkFicmV2ZSA9IDcyMjtcbiAgICB0Lm11bHRpcGx5ID0gNTY0O1xuICAgIHQudWFjdXRlID0gNTAwO1xuICAgIHQuVGNhcm9uID0gNjExO1xuICAgIHQucGFydGlhbGRpZmYgPSA0NzY7XG4gICAgdC55ZGllcmVzaXMgPSA1MDA7XG4gICAgdC5OYWN1dGUgPSA3MjI7XG4gICAgdC5pY2lyY3VtZmxleCA9IDI3ODtcbiAgICB0LkVjaXJjdW1mbGV4ID0gNjExO1xuICAgIHQuYWRpZXJlc2lzID0gNDQ0O1xuICAgIHQuZWRpZXJlc2lzID0gNDQ0O1xuICAgIHQuY2FjdXRlID0gNDQ0O1xuICAgIHQubmFjdXRlID0gNTAwO1xuICAgIHQudW1hY3JvbiA9IDUwMDtcbiAgICB0Lk5jYXJvbiA9IDcyMjtcbiAgICB0LklhY3V0ZSA9IDMzMztcbiAgICB0LnBsdXNtaW51cyA9IDU2NDtcbiAgICB0LmJyb2tlbmJhciA9IDIwMDtcbiAgICB0LnJlZ2lzdGVyZWQgPSA3NjA7XG4gICAgdC5HYnJldmUgPSA3MjI7XG4gICAgdC5JZG90YWNjZW50ID0gMzMzO1xuICAgIHQuc3VtbWF0aW9uID0gNjAwO1xuICAgIHQuRWdyYXZlID0gNjExO1xuICAgIHQucmFjdXRlID0gMzMzO1xuICAgIHQub21hY3JvbiA9IDUwMDtcbiAgICB0LlphY3V0ZSA9IDYxMTtcbiAgICB0LlpjYXJvbiA9IDYxMTtcbiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTtcbiAgICB0LkV0aCA9IDcyMjtcbiAgICB0LkNjZWRpbGxhID0gNjY3O1xuICAgIHQubGNvbW1hYWNjZW50ID0gMjc4O1xuICAgIHQudGNhcm9uID0gMzI2O1xuICAgIHQuZW9nb25layA9IDQ0NDtcbiAgICB0LlVvZ29uZWsgPSA3MjI7XG4gICAgdC5BYWN1dGUgPSA3MjI7XG4gICAgdC5BZGllcmVzaXMgPSA3MjI7XG4gICAgdC5lZ3JhdmUgPSA0NDQ7XG4gICAgdC56YWN1dGUgPSA0NDQ7XG4gICAgdC5pb2dvbmVrID0gMjc4O1xuICAgIHQuT2FjdXRlID0gNzIyO1xuICAgIHQub2FjdXRlID0gNTAwO1xuICAgIHQuYW1hY3JvbiA9IDQ0NDtcbiAgICB0LnNhY3V0ZSA9IDM4OTtcbiAgICB0LmlkaWVyZXNpcyA9IDI3ODtcbiAgICB0Lk9jaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQuVWdyYXZlID0gNzIyO1xuICAgIHQuRGVsdGEgPSA2MTI7XG4gICAgdC50aG9ybiA9IDUwMDtcbiAgICB0LnR3b3N1cGVyaW9yID0gMzAwO1xuICAgIHQuT2RpZXJlc2lzID0gNzIyO1xuICAgIHQubXUgPSA1MDA7XG4gICAgdC5pZ3JhdmUgPSAyNzg7XG4gICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwO1xuICAgIHQuRW9nb25layA9IDYxMTtcbiAgICB0LmRjcm9hdCA9IDUwMDtcbiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7XG4gICAgdC5TY2VkaWxsYSA9IDU1NjtcbiAgICB0LmxjYXJvbiA9IDM0NDtcbiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LkxhY3V0ZSA9IDYxMTtcbiAgICB0LnRyYWRlbWFyayA9IDk4MDtcbiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7XG4gICAgdC5JZ3JhdmUgPSAzMzM7XG4gICAgdC5JbWFjcm9uID0gMzMzO1xuICAgIHQuTGNhcm9uID0gNjExO1xuICAgIHQub25laGFsZiA9IDc1MDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQubnRpbGRlID0gNTAwO1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDYxMTtcbiAgICB0LmVtYWNyb24gPSA0NDQ7XG4gICAgdC5nYnJldmUgPSA1MDA7XG4gICAgdC5vbmVxdWFydGVyID0gNzUwO1xuICAgIHQuU2Nhcm9uID0gNTU2O1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDUwMDtcbiAgICB0LkNjYXJvbiA9IDY2NztcbiAgICB0LnVncmF2ZSA9IDUwMDtcbiAgICB0LnJhZGljYWwgPSA0NTM7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7XG4gICAgdC5OdGlsZGUgPSA3MjI7XG4gICAgdC5vdGlsZGUgPSA1MDA7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA2Njc7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5BdGlsZGUgPSA3MjI7XG4gICAgdC5Bb2dvbmVrID0gNzIyO1xuICAgIHQuQXJpbmcgPSA3MjI7XG4gICAgdC5PdGlsZGUgPSA3MjI7XG4gICAgdC56ZG90YWNjZW50ID0gNDQ0O1xuICAgIHQuRWNhcm9uID0gNjExO1xuICAgIHQuSW9nb25layA9IDMzMztcbiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDtcbiAgICB0Lm1pbnVzID0gNTY0O1xuICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC5uY2Fyb24gPSA1MDA7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC5sb2dpY2Fsbm90ID0gNTY0O1xuICAgIHQub2RpZXJlc2lzID0gNTAwO1xuICAgIHQudWRpZXJlc2lzID0gNTAwO1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5ldGggPSA1MDA7XG4gICAgdC56Y2Fyb24gPSA0NDQ7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMwMDtcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTAwO1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0W1wiVGltZXMtQm9sZFwiXSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICAgIHQuc3BhY2UgPSAyNTA7XG4gICAgdC5leGNsYW0gPSAzMzM7XG4gICAgdC5xdW90ZWRibCA9IDU1NTtcbiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7XG4gICAgdC5kb2xsYXIgPSA1MDA7XG4gICAgdC5wZXJjZW50ID0gMTAwMDtcbiAgICB0LmFtcGVyc2FuZCA9IDgzMztcbiAgICB0LnF1b3RlcmlnaHQgPSAzMzM7XG4gICAgdC5wYXJlbmxlZnQgPSAzMzM7XG4gICAgdC5wYXJlbnJpZ2h0ID0gMzMzO1xuICAgIHQuYXN0ZXJpc2sgPSA1MDA7XG4gICAgdC5wbHVzID0gNTcwO1xuICAgIHQuY29tbWEgPSAyNTA7XG4gICAgdC5oeXBoZW4gPSAzMzM7XG4gICAgdC5wZXJpb2QgPSAyNTA7XG4gICAgdC5zbGFzaCA9IDI3ODtcbiAgICB0Lnplcm8gPSA1MDA7XG4gICAgdC5vbmUgPSA1MDA7XG4gICAgdC50d28gPSA1MDA7XG4gICAgdC50aHJlZSA9IDUwMDtcbiAgICB0LmZvdXIgPSA1MDA7XG4gICAgdC5maXZlID0gNTAwO1xuICAgIHQuc2l4ID0gNTAwO1xuICAgIHQuc2V2ZW4gPSA1MDA7XG4gICAgdC5laWdodCA9IDUwMDtcbiAgICB0Lm5pbmUgPSA1MDA7XG4gICAgdC5jb2xvbiA9IDMzMztcbiAgICB0LnNlbWljb2xvbiA9IDMzMztcbiAgICB0Lmxlc3MgPSA1NzA7XG4gICAgdC5lcXVhbCA9IDU3MDtcbiAgICB0LmdyZWF0ZXIgPSA1NzA7XG4gICAgdC5xdWVzdGlvbiA9IDUwMDtcbiAgICB0LmF0ID0gOTMwO1xuICAgIHQuQSA9IDcyMjtcbiAgICB0LkIgPSA2Njc7XG4gICAgdC5DID0gNzIyO1xuICAgIHQuRCA9IDcyMjtcbiAgICB0LkUgPSA2Njc7XG4gICAgdC5GID0gNjExO1xuICAgIHQuRyA9IDc3ODtcbiAgICB0LkggPSA3Nzg7XG4gICAgdC5JID0gMzg5O1xuICAgIHQuSiA9IDUwMDtcbiAgICB0LksgPSA3Nzg7XG4gICAgdC5MID0gNjY3O1xuICAgIHQuTSA9IDk0NDtcbiAgICB0Lk4gPSA3MjI7XG4gICAgdC5PID0gNzc4O1xuICAgIHQuUCA9IDYxMTtcbiAgICB0LlEgPSA3Nzg7XG4gICAgdC5SID0gNzIyO1xuICAgIHQuUyA9IDU1NjtcbiAgICB0LlQgPSA2Njc7XG4gICAgdC5VID0gNzIyO1xuICAgIHQuViA9IDcyMjtcbiAgICB0LlcgPSAxMDAwO1xuICAgIHQuWCA9IDcyMjtcbiAgICB0LlkgPSA3MjI7XG4gICAgdC5aID0gNjY3O1xuICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7XG4gICAgdC5iYWNrc2xhc2ggPSAyNzg7XG4gICAgdC5icmFja2V0cmlnaHQgPSAzMzM7XG4gICAgdC5hc2NpaWNpcmN1bSA9IDU4MTtcbiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7XG4gICAgdC5xdW90ZWxlZnQgPSAzMzM7XG4gICAgdC5hID0gNTAwO1xuICAgIHQuYiA9IDU1NjtcbiAgICB0LmMgPSA0NDQ7XG4gICAgdC5kID0gNTU2O1xuICAgIHQuZSA9IDQ0NDtcbiAgICB0LmYgPSAzMzM7XG4gICAgdC5nID0gNTAwO1xuICAgIHQuaCA9IDU1NjtcbiAgICB0LmkgPSAyNzg7XG4gICAgdC5qID0gMzMzO1xuICAgIHQuayA9IDU1NjtcbiAgICB0LmwgPSAyNzg7XG4gICAgdC5tID0gODMzO1xuICAgIHQubiA9IDU1NjtcbiAgICB0Lm8gPSA1MDA7XG4gICAgdC5wID0gNTU2O1xuICAgIHQucSA9IDU1NjtcbiAgICB0LnIgPSA0NDQ7XG4gICAgdC5zID0gMzg5O1xuICAgIHQudCA9IDMzMztcbiAgICB0LnUgPSA1NTY7XG4gICAgdC52ID0gNTAwO1xuICAgIHQudyA9IDcyMjtcbiAgICB0LnggPSA1MDA7XG4gICAgdC55ID0gNTAwO1xuICAgIHQueiA9IDQ0NDtcbiAgICB0LmJyYWNlbGVmdCA9IDM5NDtcbiAgICB0LmJhciA9IDIyMDtcbiAgICB0LmJyYWNlcmlnaHQgPSAzOTQ7XG4gICAgdC5hc2NpaXRpbGRlID0gNTIwO1xuICAgIHQuZXhjbGFtZG93biA9IDMzMztcbiAgICB0LmNlbnQgPSA1MDA7XG4gICAgdC5zdGVybGluZyA9IDUwMDtcbiAgICB0LmZyYWN0aW9uID0gMTY3O1xuICAgIHQueWVuID0gNTAwO1xuICAgIHQuZmxvcmluID0gNTAwO1xuICAgIHQuc2VjdGlvbiA9IDUwMDtcbiAgICB0LmN1cnJlbmN5ID0gNTAwO1xuICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7XG4gICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7XG4gICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwO1xuICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMztcbiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzO1xuICAgIHQuZmkgPSA1NTY7XG4gICAgdC5mbCA9IDU1NjtcbiAgICB0LmVuZGFzaCA9IDUwMDtcbiAgICB0LmRhZ2dlciA9IDUwMDtcbiAgICB0LmRhZ2dlcmRibCA9IDUwMDtcbiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwO1xuICAgIHQucGFyYWdyYXBoID0gNTQwO1xuICAgIHQuYnVsbGV0ID0gMzUwO1xuICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7XG4gICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7XG4gICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwO1xuICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7XG4gICAgdC5lbGxpcHNpcyA9IDEwMDA7XG4gICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7XG4gICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7XG4gICAgdC5ncmF2ZSA9IDMzMztcbiAgICB0LmFjdXRlID0gMzMzO1xuICAgIHQuY2lyY3VtZmxleCA9IDMzMztcbiAgICB0LnRpbGRlID0gMzMzO1xuICAgIHQubWFjcm9uID0gMzMzO1xuICAgIHQuYnJldmUgPSAzMzM7XG4gICAgdC5kb3RhY2NlbnQgPSAzMzM7XG4gICAgdC5kaWVyZXNpcyA9IDMzMztcbiAgICB0LnJpbmcgPSAzMzM7XG4gICAgdC5jZWRpbGxhID0gMzMzO1xuICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzO1xuICAgIHQub2dvbmVrID0gMzMzO1xuICAgIHQuY2Fyb24gPSAzMzM7XG4gICAgdC5lbWRhc2ggPSAxMDAwO1xuICAgIHQuQUUgPSAxMDAwO1xuICAgIHQub3JkZmVtaW5pbmUgPSAzMDA7XG4gICAgdC5Mc2xhc2ggPSA2Njc7XG4gICAgdC5Pc2xhc2ggPSA3Nzg7XG4gICAgdC5PRSA9IDEwMDA7XG4gICAgdC5vcmRtYXNjdWxpbmUgPSAzMzA7XG4gICAgdC5hZSA9IDcyMjtcbiAgICB0LmRvdGxlc3NpID0gMjc4O1xuICAgIHQubHNsYXNoID0gMjc4O1xuICAgIHQub3NsYXNoID0gNTAwO1xuICAgIHQub2UgPSA3MjI7XG4gICAgdC5nZXJtYW5kYmxzID0gNTU2O1xuICAgIHQuSWRpZXJlc2lzID0gMzg5O1xuICAgIHQuZWFjdXRlID0gNDQ0O1xuICAgIHQuYWJyZXZlID0gNTAwO1xuICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjtcbiAgICB0LmVjYXJvbiA9IDQ0NDtcbiAgICB0LllkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmRpdmlkZSA9IDU3MDtcbiAgICB0LllhY3V0ZSA9IDcyMjtcbiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQuYWFjdXRlID0gNTAwO1xuICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7XG4gICAgdC55YWN1dGUgPSA1MDA7XG4gICAgdC5zY29tbWFhY2NlbnQgPSAzODk7XG4gICAgdC5lY2lyY3VtZmxleCA9IDQ0NDtcbiAgICB0LlVyaW5nID0gNzIyO1xuICAgIHQuVWRpZXJlc2lzID0gNzIyO1xuICAgIHQuYW9nb25layA9IDUwMDtcbiAgICB0LlVhY3V0ZSA9IDcyMjtcbiAgICB0LnVvZ29uZWsgPSA1NTY7XG4gICAgdC5FZGllcmVzaXMgPSA2Njc7XG4gICAgdC5EY3JvYXQgPSA3MjI7XG4gICAgdC5jb21tYWFjY2VudCA9IDI1MDtcbiAgICB0LmNvcHlyaWdodCA9IDc0NztcbiAgICB0LkVtYWNyb24gPSA2Njc7XG4gICAgdC5jY2Fyb24gPSA0NDQ7XG4gICAgdC5hcmluZyA9IDUwMDtcbiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LmxhY3V0ZSA9IDI3ODtcbiAgICB0LmFncmF2ZSA9IDUwMDtcbiAgICB0LlRjb21tYWFjY2VudCA9IDY2NztcbiAgICB0LkNhY3V0ZSA9IDcyMjtcbiAgICB0LmF0aWxkZSA9IDUwMDtcbiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7XG4gICAgdC5zY2Fyb24gPSAzODk7XG4gICAgdC5zY2VkaWxsYSA9IDM4OTtcbiAgICB0LmlhY3V0ZSA9IDI3ODtcbiAgICB0LmxvemVuZ2UgPSA0OTQ7XG4gICAgdC5SY2Fyb24gPSA3MjI7XG4gICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7XG4gICAgdC51Y2lyY3VtZmxleCA9IDU1NjtcbiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQuQW1hY3JvbiA9IDcyMjtcbiAgICB0LnJjYXJvbiA9IDQ0NDtcbiAgICB0LmNjZWRpbGxhID0gNDQ0O1xuICAgIHQuWmRvdGFjY2VudCA9IDY2NztcbiAgICB0LlRob3JuID0gNjExO1xuICAgIHQuT21hY3JvbiA9IDc3ODtcbiAgICB0LlJhY3V0ZSA9IDcyMjtcbiAgICB0LlNhY3V0ZSA9IDU1NjtcbiAgICB0LmRjYXJvbiA9IDY3MjtcbiAgICB0LlVtYWNyb24gPSA3MjI7XG4gICAgdC51cmluZyA9IDU1NjtcbiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7XG4gICAgdC5PZ3JhdmUgPSA3Nzg7XG4gICAgdC5BZ3JhdmUgPSA3MjI7XG4gICAgdC5BYnJldmUgPSA3MjI7XG4gICAgdC5tdWx0aXBseSA9IDU3MDtcbiAgICB0LnVhY3V0ZSA9IDU1NjtcbiAgICB0LlRjYXJvbiA9IDY2NztcbiAgICB0LnBhcnRpYWxkaWZmID0gNDk0O1xuICAgIHQueWRpZXJlc2lzID0gNTAwO1xuICAgIHQuTmFjdXRlID0gNzIyO1xuICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7XG4gICAgdC5FY2lyY3VtZmxleCA9IDY2NztcbiAgICB0LmFkaWVyZXNpcyA9IDUwMDtcbiAgICB0LmVkaWVyZXNpcyA9IDQ0NDtcbiAgICB0LmNhY3V0ZSA9IDQ0NDtcbiAgICB0Lm5hY3V0ZSA9IDU1NjtcbiAgICB0LnVtYWNyb24gPSA1NTY7XG4gICAgdC5OY2Fyb24gPSA3MjI7XG4gICAgdC5JYWN1dGUgPSAzODk7XG4gICAgdC5wbHVzbWludXMgPSA1NzA7XG4gICAgdC5icm9rZW5iYXIgPSAyMjA7XG4gICAgdC5yZWdpc3RlcmVkID0gNzQ3O1xuICAgIHQuR2JyZXZlID0gNzc4O1xuICAgIHQuSWRvdGFjY2VudCA9IDM4OTtcbiAgICB0LnN1bW1hdGlvbiA9IDYwMDtcbiAgICB0LkVncmF2ZSA9IDY2NztcbiAgICB0LnJhY3V0ZSA9IDQ0NDtcbiAgICB0Lm9tYWNyb24gPSA1MDA7XG4gICAgdC5aYWN1dGUgPSA2Njc7XG4gICAgdC5aY2Fyb24gPSA2Njc7XG4gICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7XG4gICAgdC5FdGggPSA3MjI7XG4gICAgdC5DY2VkaWxsYSA9IDcyMjtcbiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODtcbiAgICB0LnRjYXJvbiA9IDQxNjtcbiAgICB0LmVvZ29uZWsgPSA0NDQ7XG4gICAgdC5Vb2dvbmVrID0gNzIyO1xuICAgIHQuQWFjdXRlID0gNzIyO1xuICAgIHQuQWRpZXJlc2lzID0gNzIyO1xuICAgIHQuZWdyYXZlID0gNDQ0O1xuICAgIHQuemFjdXRlID0gNDQ0O1xuICAgIHQuaW9nb25layA9IDI3ODtcbiAgICB0Lk9hY3V0ZSA9IDc3ODtcbiAgICB0Lm9hY3V0ZSA9IDUwMDtcbiAgICB0LmFtYWNyb24gPSA1MDA7XG4gICAgdC5zYWN1dGUgPSAzODk7XG4gICAgdC5pZGllcmVzaXMgPSAyNzg7XG4gICAgdC5PY2lyY3VtZmxleCA9IDc3ODtcbiAgICB0LlVncmF2ZSA9IDcyMjtcbiAgICB0LkRlbHRhID0gNjEyO1xuICAgIHQudGhvcm4gPSA1NTY7XG4gICAgdC50d29zdXBlcmlvciA9IDMwMDtcbiAgICB0Lk9kaWVyZXNpcyA9IDc3ODtcbiAgICB0Lm11ID0gNTU2O1xuICAgIHQuaWdyYXZlID0gMjc4O1xuICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDtcbiAgICB0LkVvZ29uZWsgPSA2Njc7XG4gICAgdC5kY3JvYXQgPSA1NTY7XG4gICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwO1xuICAgIHQuU2NlZGlsbGEgPSA1NTY7XG4gICAgdC5sY2Fyb24gPSAzOTQ7XG4gICAgdC5LY29tbWFhY2NlbnQgPSA3Nzg7XG4gICAgdC5MYWN1dGUgPSA2Njc7XG4gICAgdC50cmFkZW1hcmsgPSAxMDAwO1xuICAgIHQuZWRvdGFjY2VudCA9IDQ0NDtcbiAgICB0LklncmF2ZSA9IDM4OTtcbiAgICB0LkltYWNyb24gPSAzODk7XG4gICAgdC5MY2Fyb24gPSA2Njc7XG4gICAgdC5vbmVoYWxmID0gNzUwO1xuICAgIHQubGVzc2VxdWFsID0gNTQ5O1xuICAgIHQub2NpcmN1bWZsZXggPSA1MDA7XG4gICAgdC5udGlsZGUgPSA1NTY7XG4gICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyO1xuICAgIHQuRWFjdXRlID0gNjY3O1xuICAgIHQuZW1hY3JvbiA9IDQ0NDtcbiAgICB0LmdicmV2ZSA9IDUwMDtcbiAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7XG4gICAgdC5TY2Fyb24gPSA1NTY7XG4gICAgdC5TY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4O1xuICAgIHQuZGVncmVlID0gNDAwO1xuICAgIHQub2dyYXZlID0gNTAwO1xuICAgIHQuQ2Nhcm9uID0gNzIyO1xuICAgIHQudWdyYXZlID0gNTU2O1xuICAgIHQucmFkaWNhbCA9IDU0OTtcbiAgICB0LkRjYXJvbiA9IDcyMjtcbiAgICB0LnJjb21tYWFjY2VudCA9IDQ0NDtcbiAgICB0Lk50aWxkZSA9IDcyMjtcbiAgICB0Lm90aWxkZSA9IDUwMDtcbiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0Lkxjb21tYWFjY2VudCA9IDY2NztcbiAgICB0LkF0aWxkZSA9IDcyMjtcbiAgICB0LkFvZ29uZWsgPSA3MjI7XG4gICAgdC5BcmluZyA9IDcyMjtcbiAgICB0Lk90aWxkZSA9IDc3ODtcbiAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7XG4gICAgdC5FY2Fyb24gPSA2Njc7XG4gICAgdC5Jb2dvbmVrID0gMzg5O1xuICAgIHQua2NvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQubWludXMgPSA1NzA7XG4gICAgdC5JY2lyY3VtZmxleCA9IDM4OTtcbiAgICB0Lm5jYXJvbiA9IDU1NjtcbiAgICB0LnRjb21tYWFjY2VudCA9IDMzMztcbiAgICB0LmxvZ2ljYWxub3QgPSA1NzA7XG4gICAgdC5vZGllcmVzaXMgPSA1MDA7XG4gICAgdC51ZGllcmVzaXMgPSA1NTY7XG4gICAgdC5ub3RlcXVhbCA9IDU0OTtcbiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDtcbiAgICB0LmV0aCA9IDUwMDtcbiAgICB0LnpjYXJvbiA9IDQ0NDtcbiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjtcbiAgICB0Lm9uZXN1cGVyaW9yID0gMzAwO1xuICAgIHQuaW1hY3JvbiA9IDI3ODtcbiAgICB0LkV1cm8gPSA1MDA7XG4gIH0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRbXCJUaW1lcy1Cb2xkSXRhbGljXCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgdC5zcGFjZSA9IDI1MDtcbiAgICB0LmV4Y2xhbSA9IDM4OTtcbiAgICB0LnF1b3RlZGJsID0gNTU1O1xuICAgIHQubnVtYmVyc2lnbiA9IDUwMDtcbiAgICB0LmRvbGxhciA9IDUwMDtcbiAgICB0LnBlcmNlbnQgPSA4MzM7XG4gICAgdC5hbXBlcnNhbmQgPSA3Nzg7XG4gICAgdC5xdW90ZXJpZ2h0ID0gMzMzO1xuICAgIHQucGFyZW5sZWZ0ID0gMzMzO1xuICAgIHQucGFyZW5yaWdodCA9IDMzMztcbiAgICB0LmFzdGVyaXNrID0gNTAwO1xuICAgIHQucGx1cyA9IDU3MDtcbiAgICB0LmNvbW1hID0gMjUwO1xuICAgIHQuaHlwaGVuID0gMzMzO1xuICAgIHQucGVyaW9kID0gMjUwO1xuICAgIHQuc2xhc2ggPSAyNzg7XG4gICAgdC56ZXJvID0gNTAwO1xuICAgIHQub25lID0gNTAwO1xuICAgIHQudHdvID0gNTAwO1xuICAgIHQudGhyZWUgPSA1MDA7XG4gICAgdC5mb3VyID0gNTAwO1xuICAgIHQuZml2ZSA9IDUwMDtcbiAgICB0LnNpeCA9IDUwMDtcbiAgICB0LnNldmVuID0gNTAwO1xuICAgIHQuZWlnaHQgPSA1MDA7XG4gICAgdC5uaW5lID0gNTAwO1xuICAgIHQuY29sb24gPSAzMzM7XG4gICAgdC5zZW1pY29sb24gPSAzMzM7XG4gICAgdC5sZXNzID0gNTcwO1xuICAgIHQuZXF1YWwgPSA1NzA7XG4gICAgdC5ncmVhdGVyID0gNTcwO1xuICAgIHQucXVlc3Rpb24gPSA1MDA7XG4gICAgdC5hdCA9IDgzMjtcbiAgICB0LkEgPSA2Njc7XG4gICAgdC5CID0gNjY3O1xuICAgIHQuQyA9IDY2NztcbiAgICB0LkQgPSA3MjI7XG4gICAgdC5FID0gNjY3O1xuICAgIHQuRiA9IDY2NztcbiAgICB0LkcgPSA3MjI7XG4gICAgdC5IID0gNzc4O1xuICAgIHQuSSA9IDM4OTtcbiAgICB0LkogPSA1MDA7XG4gICAgdC5LID0gNjY3O1xuICAgIHQuTCA9IDYxMTtcbiAgICB0Lk0gPSA4ODk7XG4gICAgdC5OID0gNzIyO1xuICAgIHQuTyA9IDcyMjtcbiAgICB0LlAgPSA2MTE7XG4gICAgdC5RID0gNzIyO1xuICAgIHQuUiA9IDY2NztcbiAgICB0LlMgPSA1NTY7XG4gICAgdC5UID0gNjExO1xuICAgIHQuVSA9IDcyMjtcbiAgICB0LlYgPSA2Njc7XG4gICAgdC5XID0gODg5O1xuICAgIHQuWCA9IDY2NztcbiAgICB0LlkgPSA2MTE7XG4gICAgdC5aID0gNjExO1xuICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7XG4gICAgdC5iYWNrc2xhc2ggPSAyNzg7XG4gICAgdC5icmFja2V0cmlnaHQgPSAzMzM7XG4gICAgdC5hc2NpaWNpcmN1bSA9IDU3MDtcbiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7XG4gICAgdC5xdW90ZWxlZnQgPSAzMzM7XG4gICAgdC5hID0gNTAwO1xuICAgIHQuYiA9IDUwMDtcbiAgICB0LmMgPSA0NDQ7XG4gICAgdC5kID0gNTAwO1xuICAgIHQuZSA9IDQ0NDtcbiAgICB0LmYgPSAzMzM7XG4gICAgdC5nID0gNTAwO1xuICAgIHQuaCA9IDU1NjtcbiAgICB0LmkgPSAyNzg7XG4gICAgdC5qID0gMjc4O1xuICAgIHQuayA9IDUwMDtcbiAgICB0LmwgPSAyNzg7XG4gICAgdC5tID0gNzc4O1xuICAgIHQubiA9IDU1NjtcbiAgICB0Lm8gPSA1MDA7XG4gICAgdC5wID0gNTAwO1xuICAgIHQucSA9IDUwMDtcbiAgICB0LnIgPSAzODk7XG4gICAgdC5zID0gMzg5O1xuICAgIHQudCA9IDI3ODtcbiAgICB0LnUgPSA1NTY7XG4gICAgdC52ID0gNDQ0O1xuICAgIHQudyA9IDY2NztcbiAgICB0LnggPSA1MDA7XG4gICAgdC55ID0gNDQ0O1xuICAgIHQueiA9IDM4OTtcbiAgICB0LmJyYWNlbGVmdCA9IDM0ODtcbiAgICB0LmJhciA9IDIyMDtcbiAgICB0LmJyYWNlcmlnaHQgPSAzNDg7XG4gICAgdC5hc2NpaXRpbGRlID0gNTcwO1xuICAgIHQuZXhjbGFtZG93biA9IDM4OTtcbiAgICB0LmNlbnQgPSA1MDA7XG4gICAgdC5zdGVybGluZyA9IDUwMDtcbiAgICB0LmZyYWN0aW9uID0gMTY3O1xuICAgIHQueWVuID0gNTAwO1xuICAgIHQuZmxvcmluID0gNTAwO1xuICAgIHQuc2VjdGlvbiA9IDUwMDtcbiAgICB0LmN1cnJlbmN5ID0gNTAwO1xuICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7XG4gICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7XG4gICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwO1xuICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMztcbiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzO1xuICAgIHQuZmkgPSA1NTY7XG4gICAgdC5mbCA9IDU1NjtcbiAgICB0LmVuZGFzaCA9IDUwMDtcbiAgICB0LmRhZ2dlciA9IDUwMDtcbiAgICB0LmRhZ2dlcmRibCA9IDUwMDtcbiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwO1xuICAgIHQucGFyYWdyYXBoID0gNTAwO1xuICAgIHQuYnVsbGV0ID0gMzUwO1xuICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7XG4gICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7XG4gICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwO1xuICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7XG4gICAgdC5lbGxpcHNpcyA9IDEwMDA7XG4gICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7XG4gICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7XG4gICAgdC5ncmF2ZSA9IDMzMztcbiAgICB0LmFjdXRlID0gMzMzO1xuICAgIHQuY2lyY3VtZmxleCA9IDMzMztcbiAgICB0LnRpbGRlID0gMzMzO1xuICAgIHQubWFjcm9uID0gMzMzO1xuICAgIHQuYnJldmUgPSAzMzM7XG4gICAgdC5kb3RhY2NlbnQgPSAzMzM7XG4gICAgdC5kaWVyZXNpcyA9IDMzMztcbiAgICB0LnJpbmcgPSAzMzM7XG4gICAgdC5jZWRpbGxhID0gMzMzO1xuICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzO1xuICAgIHQub2dvbmVrID0gMzMzO1xuICAgIHQuY2Fyb24gPSAzMzM7XG4gICAgdC5lbWRhc2ggPSAxMDAwO1xuICAgIHQuQUUgPSA5NDQ7XG4gICAgdC5vcmRmZW1pbmluZSA9IDI2NjtcbiAgICB0LkxzbGFzaCA9IDYxMTtcbiAgICB0Lk9zbGFzaCA9IDcyMjtcbiAgICB0Lk9FID0gOTQ0O1xuICAgIHQub3JkbWFzY3VsaW5lID0gMzAwO1xuICAgIHQuYWUgPSA3MjI7XG4gICAgdC5kb3RsZXNzaSA9IDI3ODtcbiAgICB0LmxzbGFzaCA9IDI3ODtcbiAgICB0Lm9zbGFzaCA9IDUwMDtcbiAgICB0Lm9lID0gNzIyO1xuICAgIHQuZ2VybWFuZGJscyA9IDUwMDtcbiAgICB0LklkaWVyZXNpcyA9IDM4OTtcbiAgICB0LmVhY3V0ZSA9IDQ0NDtcbiAgICB0LmFicmV2ZSA9IDUwMDtcbiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7XG4gICAgdC5lY2Fyb24gPSA0NDQ7XG4gICAgdC5ZZGllcmVzaXMgPSA2MTE7XG4gICAgdC5kaXZpZGUgPSA1NzA7XG4gICAgdC5ZYWN1dGUgPSA2MTE7XG4gICAgdC5BY2lyY3VtZmxleCA9IDY2NztcbiAgICB0LmFhY3V0ZSA9IDUwMDtcbiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQueWFjdXRlID0gNDQ0O1xuICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5O1xuICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7XG4gICAgdC5VcmluZyA9IDcyMjtcbiAgICB0LlVkaWVyZXNpcyA9IDcyMjtcbiAgICB0LmFvZ29uZWsgPSA1MDA7XG4gICAgdC5VYWN1dGUgPSA3MjI7XG4gICAgdC51b2dvbmVrID0gNTU2O1xuICAgIHQuRWRpZXJlc2lzID0gNjY3O1xuICAgIHQuRGNyb2F0ID0gNzIyO1xuICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7XG4gICAgdC5jb3B5cmlnaHQgPSA3NDc7XG4gICAgdC5FbWFjcm9uID0gNjY3O1xuICAgIHQuY2Nhcm9uID0gNDQ0O1xuICAgIHQuYXJpbmcgPSA1MDA7XG4gICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7XG4gICAgdC5sYWN1dGUgPSAyNzg7XG4gICAgdC5hZ3JhdmUgPSA1MDA7XG4gICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5DYWN1dGUgPSA2Njc7XG4gICAgdC5hdGlsZGUgPSA1MDA7XG4gICAgdC5FZG90YWNjZW50ID0gNjY3O1xuICAgIHQuc2Nhcm9uID0gMzg5O1xuICAgIHQuc2NlZGlsbGEgPSAzODk7XG4gICAgdC5pYWN1dGUgPSAyNzg7XG4gICAgdC5sb3plbmdlID0gNDk0O1xuICAgIHQuUmNhcm9uID0gNjY3O1xuICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyO1xuICAgIHQudWNpcmN1bWZsZXggPSA1NTY7XG4gICAgdC5hY2lyY3VtZmxleCA9IDUwMDtcbiAgICB0LkFtYWNyb24gPSA2Njc7XG4gICAgdC5yY2Fyb24gPSAzODk7XG4gICAgdC5jY2VkaWxsYSA9IDQ0NDtcbiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7XG4gICAgdC5UaG9ybiA9IDYxMTtcbiAgICB0Lk9tYWNyb24gPSA3MjI7XG4gICAgdC5SYWN1dGUgPSA2Njc7XG4gICAgdC5TYWN1dGUgPSA1NTY7XG4gICAgdC5kY2Fyb24gPSA2MDg7XG4gICAgdC5VbWFjcm9uID0gNzIyO1xuICAgIHQudXJpbmcgPSA1NTY7XG4gICAgdC50aHJlZXN1cGVyaW9yID0gMzAwO1xuICAgIHQuT2dyYXZlID0gNzIyO1xuICAgIHQuQWdyYXZlID0gNjY3O1xuICAgIHQuQWJyZXZlID0gNjY3O1xuICAgIHQubXVsdGlwbHkgPSA1NzA7XG4gICAgdC51YWN1dGUgPSA1NTY7XG4gICAgdC5UY2Fyb24gPSA2MTE7XG4gICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDtcbiAgICB0LnlkaWVyZXNpcyA9IDQ0NDtcbiAgICB0Lk5hY3V0ZSA9IDcyMjtcbiAgICB0LmljaXJjdW1mbGV4ID0gMjc4O1xuICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7XG4gICAgdC5hZGllcmVzaXMgPSA1MDA7XG4gICAgdC5lZGllcmVzaXMgPSA0NDQ7XG4gICAgdC5jYWN1dGUgPSA0NDQ7XG4gICAgdC5uYWN1dGUgPSA1NTY7XG4gICAgdC51bWFjcm9uID0gNTU2O1xuICAgIHQuTmNhcm9uID0gNzIyO1xuICAgIHQuSWFjdXRlID0gMzg5O1xuICAgIHQucGx1c21pbnVzID0gNTcwO1xuICAgIHQuYnJva2VuYmFyID0gMjIwO1xuICAgIHQucmVnaXN0ZXJlZCA9IDc0NztcbiAgICB0LkdicmV2ZSA9IDcyMjtcbiAgICB0Lklkb3RhY2NlbnQgPSAzODk7XG4gICAgdC5zdW1tYXRpb24gPSA2MDA7XG4gICAgdC5FZ3JhdmUgPSA2Njc7XG4gICAgdC5yYWN1dGUgPSAzODk7XG4gICAgdC5vbWFjcm9uID0gNTAwO1xuICAgIHQuWmFjdXRlID0gNjExO1xuICAgIHQuWmNhcm9uID0gNjExO1xuICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5O1xuICAgIHQuRXRoID0gNzIyO1xuICAgIHQuQ2NlZGlsbGEgPSA2Njc7XG4gICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC50Y2Fyb24gPSAzNjY7XG4gICAgdC5lb2dvbmVrID0gNDQ0O1xuICAgIHQuVW9nb25layA9IDcyMjtcbiAgICB0LkFhY3V0ZSA9IDY2NztcbiAgICB0LkFkaWVyZXNpcyA9IDY2NztcbiAgICB0LmVncmF2ZSA9IDQ0NDtcbiAgICB0LnphY3V0ZSA9IDM4OTtcbiAgICB0LmlvZ29uZWsgPSAyNzg7XG4gICAgdC5PYWN1dGUgPSA3MjI7XG4gICAgdC5vYWN1dGUgPSA1MDA7XG4gICAgdC5hbWFjcm9uID0gNTAwO1xuICAgIHQuc2FjdXRlID0gMzg5O1xuICAgIHQuaWRpZXJlc2lzID0gMjc4O1xuICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7XG4gICAgdC5VZ3JhdmUgPSA3MjI7XG4gICAgdC5EZWx0YSA9IDYxMjtcbiAgICB0LnRob3JuID0gNTAwO1xuICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7XG4gICAgdC5PZGllcmVzaXMgPSA3MjI7XG4gICAgdC5tdSA9IDU3NjtcbiAgICB0LmlncmF2ZSA9IDI3ODtcbiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7XG4gICAgdC5Fb2dvbmVrID0gNjY3O1xuICAgIHQuZGNyb2F0ID0gNTAwO1xuICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDtcbiAgICB0LlNjZWRpbGxhID0gNTU2O1xuICAgIHQubGNhcm9uID0gMzgyO1xuICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQuTGFjdXRlID0gNjExO1xuICAgIHQudHJhZGVtYXJrID0gMTAwMDtcbiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7XG4gICAgdC5JZ3JhdmUgPSAzODk7XG4gICAgdC5JbWFjcm9uID0gMzg5O1xuICAgIHQuTGNhcm9uID0gNjExO1xuICAgIHQub25laGFsZiA9IDc1MDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQubnRpbGRlID0gNTU2O1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDY2NztcbiAgICB0LmVtYWNyb24gPSA0NDQ7XG4gICAgdC5nYnJldmUgPSA1MDA7XG4gICAgdC5vbmVxdWFydGVyID0gNzUwO1xuICAgIHQuU2Nhcm9uID0gNTU2O1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDUwMDtcbiAgICB0LkNjYXJvbiA9IDY2NztcbiAgICB0LnVncmF2ZSA9IDU1NjtcbiAgICB0LnJhZGljYWwgPSA1NDk7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzODk7XG4gICAgdC5OdGlsZGUgPSA3MjI7XG4gICAgdC5vdGlsZGUgPSA1MDA7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA2Njc7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5BdGlsZGUgPSA2Njc7XG4gICAgdC5Bb2dvbmVrID0gNjY3O1xuICAgIHQuQXJpbmcgPSA2Njc7XG4gICAgdC5PdGlsZGUgPSA3MjI7XG4gICAgdC56ZG90YWNjZW50ID0gMzg5O1xuICAgIHQuRWNhcm9uID0gNjY3O1xuICAgIHQuSW9nb25layA9IDM4OTtcbiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDtcbiAgICB0Lm1pbnVzID0gNjA2O1xuICAgIHQuSWNpcmN1bWZsZXggPSAzODk7XG4gICAgdC5uY2Fyb24gPSA1NTY7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC5sb2dpY2Fsbm90ID0gNjA2O1xuICAgIHQub2RpZXJlc2lzID0gNTAwO1xuICAgIHQudWRpZXJlc2lzID0gNTU2O1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5ldGggPSA1MDA7XG4gICAgdC56Y2Fyb24gPSAzODk7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMwMDtcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTAwO1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0W1wiVGltZXMtSXRhbGljXCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7XG4gICAgdC5zcGFjZSA9IDI1MDtcbiAgICB0LmV4Y2xhbSA9IDMzMztcbiAgICB0LnF1b3RlZGJsID0gNDIwO1xuICAgIHQubnVtYmVyc2lnbiA9IDUwMDtcbiAgICB0LmRvbGxhciA9IDUwMDtcbiAgICB0LnBlcmNlbnQgPSA4MzM7XG4gICAgdC5hbXBlcnNhbmQgPSA3Nzg7XG4gICAgdC5xdW90ZXJpZ2h0ID0gMzMzO1xuICAgIHQucGFyZW5sZWZ0ID0gMzMzO1xuICAgIHQucGFyZW5yaWdodCA9IDMzMztcbiAgICB0LmFzdGVyaXNrID0gNTAwO1xuICAgIHQucGx1cyA9IDY3NTtcbiAgICB0LmNvbW1hID0gMjUwO1xuICAgIHQuaHlwaGVuID0gMzMzO1xuICAgIHQucGVyaW9kID0gMjUwO1xuICAgIHQuc2xhc2ggPSAyNzg7XG4gICAgdC56ZXJvID0gNTAwO1xuICAgIHQub25lID0gNTAwO1xuICAgIHQudHdvID0gNTAwO1xuICAgIHQudGhyZWUgPSA1MDA7XG4gICAgdC5mb3VyID0gNTAwO1xuICAgIHQuZml2ZSA9IDUwMDtcbiAgICB0LnNpeCA9IDUwMDtcbiAgICB0LnNldmVuID0gNTAwO1xuICAgIHQuZWlnaHQgPSA1MDA7XG4gICAgdC5uaW5lID0gNTAwO1xuICAgIHQuY29sb24gPSAzMzM7XG4gICAgdC5zZW1pY29sb24gPSAzMzM7XG4gICAgdC5sZXNzID0gNjc1O1xuICAgIHQuZXF1YWwgPSA2NzU7XG4gICAgdC5ncmVhdGVyID0gNjc1O1xuICAgIHQucXVlc3Rpb24gPSA1MDA7XG4gICAgdC5hdCA9IDkyMDtcbiAgICB0LkEgPSA2MTE7XG4gICAgdC5CID0gNjExO1xuICAgIHQuQyA9IDY2NztcbiAgICB0LkQgPSA3MjI7XG4gICAgdC5FID0gNjExO1xuICAgIHQuRiA9IDYxMTtcbiAgICB0LkcgPSA3MjI7XG4gICAgdC5IID0gNzIyO1xuICAgIHQuSSA9IDMzMztcbiAgICB0LkogPSA0NDQ7XG4gICAgdC5LID0gNjY3O1xuICAgIHQuTCA9IDU1NjtcbiAgICB0Lk0gPSA4MzM7XG4gICAgdC5OID0gNjY3O1xuICAgIHQuTyA9IDcyMjtcbiAgICB0LlAgPSA2MTE7XG4gICAgdC5RID0gNzIyO1xuICAgIHQuUiA9IDYxMTtcbiAgICB0LlMgPSA1MDA7XG4gICAgdC5UID0gNTU2O1xuICAgIHQuVSA9IDcyMjtcbiAgICB0LlYgPSA2MTE7XG4gICAgdC5XID0gODMzO1xuICAgIHQuWCA9IDYxMTtcbiAgICB0LlkgPSA1NTY7XG4gICAgdC5aID0gNTU2O1xuICAgIHQuYnJhY2tldGxlZnQgPSAzODk7XG4gICAgdC5iYWNrc2xhc2ggPSAyNzg7XG4gICAgdC5icmFja2V0cmlnaHQgPSAzODk7XG4gICAgdC5hc2NpaWNpcmN1bSA9IDQyMjtcbiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7XG4gICAgdC5xdW90ZWxlZnQgPSAzMzM7XG4gICAgdC5hID0gNTAwO1xuICAgIHQuYiA9IDUwMDtcbiAgICB0LmMgPSA0NDQ7XG4gICAgdC5kID0gNTAwO1xuICAgIHQuZSA9IDQ0NDtcbiAgICB0LmYgPSAyNzg7XG4gICAgdC5nID0gNTAwO1xuICAgIHQuaCA9IDUwMDtcbiAgICB0LmkgPSAyNzg7XG4gICAgdC5qID0gMjc4O1xuICAgIHQuayA9IDQ0NDtcbiAgICB0LmwgPSAyNzg7XG4gICAgdC5tID0gNzIyO1xuICAgIHQubiA9IDUwMDtcbiAgICB0Lm8gPSA1MDA7XG4gICAgdC5wID0gNTAwO1xuICAgIHQucSA9IDUwMDtcbiAgICB0LnIgPSAzODk7XG4gICAgdC5zID0gMzg5O1xuICAgIHQudCA9IDI3ODtcbiAgICB0LnUgPSA1MDA7XG4gICAgdC52ID0gNDQ0O1xuICAgIHQudyA9IDY2NztcbiAgICB0LnggPSA0NDQ7XG4gICAgdC55ID0gNDQ0O1xuICAgIHQueiA9IDM4OTtcbiAgICB0LmJyYWNlbGVmdCA9IDQwMDtcbiAgICB0LmJhciA9IDI3NTtcbiAgICB0LmJyYWNlcmlnaHQgPSA0MDA7XG4gICAgdC5hc2NpaXRpbGRlID0gNTQxO1xuICAgIHQuZXhjbGFtZG93biA9IDM4OTtcbiAgICB0LmNlbnQgPSA1MDA7XG4gICAgdC5zdGVybGluZyA9IDUwMDtcbiAgICB0LmZyYWN0aW9uID0gMTY3O1xuICAgIHQueWVuID0gNTAwO1xuICAgIHQuZmxvcmluID0gNTAwO1xuICAgIHQuc2VjdGlvbiA9IDUwMDtcbiAgICB0LmN1cnJlbmN5ID0gNTAwO1xuICAgIHQucXVvdGVzaW5nbGUgPSAyMTQ7XG4gICAgdC5xdW90ZWRibGxlZnQgPSA1NTY7XG4gICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwO1xuICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMztcbiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzO1xuICAgIHQuZmkgPSA1MDA7XG4gICAgdC5mbCA9IDUwMDtcbiAgICB0LmVuZGFzaCA9IDUwMDtcbiAgICB0LmRhZ2dlciA9IDUwMDtcbiAgICB0LmRhZ2dlcmRibCA9IDUwMDtcbiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwO1xuICAgIHQucGFyYWdyYXBoID0gNTIzO1xuICAgIHQuYnVsbGV0ID0gMzUwO1xuICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7XG4gICAgdC5xdW90ZWRibGJhc2UgPSA1NTY7XG4gICAgdC5xdW90ZWRibHJpZ2h0ID0gNTU2O1xuICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7XG4gICAgdC5lbGxpcHNpcyA9IDg4OTtcbiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDtcbiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDtcbiAgICB0LmdyYXZlID0gMzMzO1xuICAgIHQuYWN1dGUgPSAzMzM7XG4gICAgdC5jaXJjdW1mbGV4ID0gMzMzO1xuICAgIHQudGlsZGUgPSAzMzM7XG4gICAgdC5tYWNyb24gPSAzMzM7XG4gICAgdC5icmV2ZSA9IDMzMztcbiAgICB0LmRvdGFjY2VudCA9IDMzMztcbiAgICB0LmRpZXJlc2lzID0gMzMzO1xuICAgIHQucmluZyA9IDMzMztcbiAgICB0LmNlZGlsbGEgPSAzMzM7XG4gICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7XG4gICAgdC5vZ29uZWsgPSAzMzM7XG4gICAgdC5jYXJvbiA9IDMzMztcbiAgICB0LmVtZGFzaCA9IDg4OTtcbiAgICB0LkFFID0gODg5O1xuICAgIHQub3JkZmVtaW5pbmUgPSAyNzY7XG4gICAgdC5Mc2xhc2ggPSA1NTY7XG4gICAgdC5Pc2xhc2ggPSA3MjI7XG4gICAgdC5PRSA9IDk0NDtcbiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDtcbiAgICB0LmFlID0gNjY3O1xuICAgIHQuZG90bGVzc2kgPSAyNzg7XG4gICAgdC5sc2xhc2ggPSAyNzg7XG4gICAgdC5vc2xhc2ggPSA1MDA7XG4gICAgdC5vZSA9IDY2NztcbiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7XG4gICAgdC5JZGllcmVzaXMgPSAzMzM7XG4gICAgdC5lYWN1dGUgPSA0NDQ7XG4gICAgdC5hYnJldmUgPSA1MDA7XG4gICAgdC51aHVuZ2FydW1sYXV0ID0gNTAwO1xuICAgIHQuZWNhcm9uID0gNDQ0O1xuICAgIHQuWWRpZXJlc2lzID0gNTU2O1xuICAgIHQuZGl2aWRlID0gNjc1O1xuICAgIHQuWWFjdXRlID0gNTU2O1xuICAgIHQuQWNpcmN1bWZsZXggPSA2MTE7XG4gICAgdC5hYWN1dGUgPSA1MDA7XG4gICAgdC5VY2lyY3VtZmxleCA9IDcyMjtcbiAgICB0LnlhY3V0ZSA9IDQ0NDtcbiAgICB0LnNjb21tYWFjY2VudCA9IDM4OTtcbiAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0O1xuICAgIHQuVXJpbmcgPSA3MjI7XG4gICAgdC5VZGllcmVzaXMgPSA3MjI7XG4gICAgdC5hb2dvbmVrID0gNTAwO1xuICAgIHQuVWFjdXRlID0gNzIyO1xuICAgIHQudW9nb25layA9IDUwMDtcbiAgICB0LkVkaWVyZXNpcyA9IDYxMTtcbiAgICB0LkRjcm9hdCA9IDcyMjtcbiAgICB0LmNvbW1hYWNjZW50ID0gMjUwO1xuICAgIHQuY29weXJpZ2h0ID0gNzYwO1xuICAgIHQuRW1hY3JvbiA9IDYxMTtcbiAgICB0LmNjYXJvbiA9IDQ0NDtcbiAgICB0LmFyaW5nID0gNTAwO1xuICAgIHQuTmNvbW1hYWNjZW50ID0gNjY3O1xuICAgIHQubGFjdXRlID0gMjc4O1xuICAgIHQuYWdyYXZlID0gNTAwO1xuICAgIHQuVGNvbW1hYWNjZW50ID0gNTU2O1xuICAgIHQuQ2FjdXRlID0gNjY3O1xuICAgIHQuYXRpbGRlID0gNTAwO1xuICAgIHQuRWRvdGFjY2VudCA9IDYxMTtcbiAgICB0LnNjYXJvbiA9IDM4OTtcbiAgICB0LnNjZWRpbGxhID0gMzg5O1xuICAgIHQuaWFjdXRlID0gMjc4O1xuICAgIHQubG96ZW5nZSA9IDQ3MTtcbiAgICB0LlJjYXJvbiA9IDYxMTtcbiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjtcbiAgICB0LnVjaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7XG4gICAgdC5BbWFjcm9uID0gNjExO1xuICAgIHQucmNhcm9uID0gMzg5O1xuICAgIHQuY2NlZGlsbGEgPSA0NDQ7XG4gICAgdC5aZG90YWNjZW50ID0gNTU2O1xuICAgIHQuVGhvcm4gPSA2MTE7XG4gICAgdC5PbWFjcm9uID0gNzIyO1xuICAgIHQuUmFjdXRlID0gNjExO1xuICAgIHQuU2FjdXRlID0gNTAwO1xuICAgIHQuZGNhcm9uID0gNTQ0O1xuICAgIHQuVW1hY3JvbiA9IDcyMjtcbiAgICB0LnVyaW5nID0gNTAwO1xuICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDtcbiAgICB0Lk9ncmF2ZSA9IDcyMjtcbiAgICB0LkFncmF2ZSA9IDYxMTtcbiAgICB0LkFicmV2ZSA9IDYxMTtcbiAgICB0Lm11bHRpcGx5ID0gNjc1O1xuICAgIHQudWFjdXRlID0gNTAwO1xuICAgIHQuVGNhcm9uID0gNTU2O1xuICAgIHQucGFydGlhbGRpZmYgPSA0NzY7XG4gICAgdC55ZGllcmVzaXMgPSA0NDQ7XG4gICAgdC5OYWN1dGUgPSA2Njc7XG4gICAgdC5pY2lyY3VtZmxleCA9IDI3ODtcbiAgICB0LkVjaXJjdW1mbGV4ID0gNjExO1xuICAgIHQuYWRpZXJlc2lzID0gNTAwO1xuICAgIHQuZWRpZXJlc2lzID0gNDQ0O1xuICAgIHQuY2FjdXRlID0gNDQ0O1xuICAgIHQubmFjdXRlID0gNTAwO1xuICAgIHQudW1hY3JvbiA9IDUwMDtcbiAgICB0Lk5jYXJvbiA9IDY2NztcbiAgICB0LklhY3V0ZSA9IDMzMztcbiAgICB0LnBsdXNtaW51cyA9IDY3NTtcbiAgICB0LmJyb2tlbmJhciA9IDI3NTtcbiAgICB0LnJlZ2lzdGVyZWQgPSA3NjA7XG4gICAgdC5HYnJldmUgPSA3MjI7XG4gICAgdC5JZG90YWNjZW50ID0gMzMzO1xuICAgIHQuc3VtbWF0aW9uID0gNjAwO1xuICAgIHQuRWdyYXZlID0gNjExO1xuICAgIHQucmFjdXRlID0gMzg5O1xuICAgIHQub21hY3JvbiA9IDUwMDtcbiAgICB0LlphY3V0ZSA9IDU1NjtcbiAgICB0LlpjYXJvbiA9IDU1NjtcbiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTtcbiAgICB0LkV0aCA9IDcyMjtcbiAgICB0LkNjZWRpbGxhID0gNjY3O1xuICAgIHQubGNvbW1hYWNjZW50ID0gMjc4O1xuICAgIHQudGNhcm9uID0gMzAwO1xuICAgIHQuZW9nb25layA9IDQ0NDtcbiAgICB0LlVvZ29uZWsgPSA3MjI7XG4gICAgdC5BYWN1dGUgPSA2MTE7XG4gICAgdC5BZGllcmVzaXMgPSA2MTE7XG4gICAgdC5lZ3JhdmUgPSA0NDQ7XG4gICAgdC56YWN1dGUgPSAzODk7XG4gICAgdC5pb2dvbmVrID0gMjc4O1xuICAgIHQuT2FjdXRlID0gNzIyO1xuICAgIHQub2FjdXRlID0gNTAwO1xuICAgIHQuYW1hY3JvbiA9IDUwMDtcbiAgICB0LnNhY3V0ZSA9IDM4OTtcbiAgICB0LmlkaWVyZXNpcyA9IDI3ODtcbiAgICB0Lk9jaXJjdW1mbGV4ID0gNzIyO1xuICAgIHQuVWdyYXZlID0gNzIyO1xuICAgIHQuRGVsdGEgPSA2MTI7XG4gICAgdC50aG9ybiA9IDUwMDtcbiAgICB0LnR3b3N1cGVyaW9yID0gMzAwO1xuICAgIHQuT2RpZXJlc2lzID0gNzIyO1xuICAgIHQubXUgPSA1MDA7XG4gICAgdC5pZ3JhdmUgPSAyNzg7XG4gICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwO1xuICAgIHQuRW9nb25layA9IDYxMTtcbiAgICB0LmRjcm9hdCA9IDUwMDtcbiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7XG4gICAgdC5TY2VkaWxsYSA9IDUwMDtcbiAgICB0LmxjYXJvbiA9IDMwMDtcbiAgICB0Lktjb21tYWFjY2VudCA9IDY2NztcbiAgICB0LkxhY3V0ZSA9IDU1NjtcbiAgICB0LnRyYWRlbWFyayA9IDk4MDtcbiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7XG4gICAgdC5JZ3JhdmUgPSAzMzM7XG4gICAgdC5JbWFjcm9uID0gMzMzO1xuICAgIHQuTGNhcm9uID0gNjExO1xuICAgIHQub25laGFsZiA9IDc1MDtcbiAgICB0Lmxlc3NlcXVhbCA9IDU0OTtcbiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwO1xuICAgIHQubnRpbGRlID0gNTAwO1xuICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LkVhY3V0ZSA9IDYxMTtcbiAgICB0LmVtYWNyb24gPSA0NDQ7XG4gICAgdC5nYnJldmUgPSA1MDA7XG4gICAgdC5vbmVxdWFydGVyID0gNzUwO1xuICAgIHQuU2Nhcm9uID0gNTAwO1xuICAgIHQuU2NvbW1hYWNjZW50ID0gNTAwO1xuICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjtcbiAgICB0LmRlZ3JlZSA9IDQwMDtcbiAgICB0Lm9ncmF2ZSA9IDUwMDtcbiAgICB0LkNjYXJvbiA9IDY2NztcbiAgICB0LnVncmF2ZSA9IDUwMDtcbiAgICB0LnJhZGljYWwgPSA0NTM7XG4gICAgdC5EY2Fyb24gPSA3MjI7XG4gICAgdC5yY29tbWFhY2NlbnQgPSAzODk7XG4gICAgdC5OdGlsZGUgPSA2Njc7XG4gICAgdC5vdGlsZGUgPSA1MDA7XG4gICAgdC5SY29tbWFhY2NlbnQgPSA2MTE7XG4gICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7XG4gICAgdC5BdGlsZGUgPSA2MTE7XG4gICAgdC5Bb2dvbmVrID0gNjExO1xuICAgIHQuQXJpbmcgPSA2MTE7XG4gICAgdC5PdGlsZGUgPSA3MjI7XG4gICAgdC56ZG90YWNjZW50ID0gMzg5O1xuICAgIHQuRWNhcm9uID0gNjExO1xuICAgIHQuSW9nb25layA9IDMzMztcbiAgICB0Lmtjb21tYWFjY2VudCA9IDQ0NDtcbiAgICB0Lm1pbnVzID0gNjc1O1xuICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7XG4gICAgdC5uY2Fyb24gPSA1MDA7XG4gICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7XG4gICAgdC5sb2dpY2Fsbm90ID0gNjc1O1xuICAgIHQub2RpZXJlc2lzID0gNTAwO1xuICAgIHQudWRpZXJlc2lzID0gNTAwO1xuICAgIHQubm90ZXF1YWwgPSA1NDk7XG4gICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5ldGggPSA1MDA7XG4gICAgdC56Y2Fyb24gPSAzODk7XG4gICAgdC5uY29tbWFhY2NlbnQgPSA1MDA7XG4gICAgdC5vbmVzdXBlcmlvciA9IDMwMDtcbiAgICB0LmltYWNyb24gPSAyNzg7XG4gICAgdC5FdXJvID0gNTAwO1xuICB9KTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICB0LlphcGZEaW5nYmF0cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkge1xuICAgIHQuc3BhY2UgPSAyNzg7XG4gICAgdC5hMSA9IDk3NDtcbiAgICB0LmEyID0gOTYxO1xuICAgIHQuYTIwMiA9IDk3NDtcbiAgICB0LmEzID0gOTgwO1xuICAgIHQuYTQgPSA3MTk7XG4gICAgdC5hNSA9IDc4OTtcbiAgICB0LmExMTkgPSA3OTA7XG4gICAgdC5hMTE4ID0gNzkxO1xuICAgIHQuYTExNyA9IDY5MDtcbiAgICB0LmExMSA9IDk2MDtcbiAgICB0LmExMiA9IDkzOTtcbiAgICB0LmExMyA9IDU0OTtcbiAgICB0LmExNCA9IDg1NTtcbiAgICB0LmExNSA9IDkxMTtcbiAgICB0LmExNiA9IDkzMztcbiAgICB0LmExMDUgPSA5MTE7XG4gICAgdC5hMTcgPSA5NDU7XG4gICAgdC5hMTggPSA5NzQ7XG4gICAgdC5hMTkgPSA3NTU7XG4gICAgdC5hMjAgPSA4NDY7XG4gICAgdC5hMjEgPSA3NjI7XG4gICAgdC5hMjIgPSA3NjE7XG4gICAgdC5hMjMgPSA1NzE7XG4gICAgdC5hMjQgPSA2Nzc7XG4gICAgdC5hMjUgPSA3NjM7XG4gICAgdC5hMjYgPSA3NjA7XG4gICAgdC5hMjcgPSA3NTk7XG4gICAgdC5hMjggPSA3NTQ7XG4gICAgdC5hNiA9IDQ5NDtcbiAgICB0LmE3ID0gNTUyO1xuICAgIHQuYTggPSA1Mzc7XG4gICAgdC5hOSA9IDU3NztcbiAgICB0LmExMCA9IDY5MjtcbiAgICB0LmEyOSA9IDc4NjtcbiAgICB0LmEzMCA9IDc4ODtcbiAgICB0LmEzMSA9IDc4ODtcbiAgICB0LmEzMiA9IDc5MDtcbiAgICB0LmEzMyA9IDc5MztcbiAgICB0LmEzNCA9IDc5NDtcbiAgICB0LmEzNSA9IDgxNjtcbiAgICB0LmEzNiA9IDgyMztcbiAgICB0LmEzNyA9IDc4OTtcbiAgICB0LmEzOCA9IDg0MTtcbiAgICB0LmEzOSA9IDgyMztcbiAgICB0LmE0MCA9IDgzMztcbiAgICB0LmE0MSA9IDgxNjtcbiAgICB0LmE0MiA9IDgzMTtcbiAgICB0LmE0MyA9IDkyMztcbiAgICB0LmE0NCA9IDc0NDtcbiAgICB0LmE0NSA9IDcyMztcbiAgICB0LmE0NiA9IDc0OTtcbiAgICB0LmE0NyA9IDc5MDtcbiAgICB0LmE0OCA9IDc5MjtcbiAgICB0LmE0OSA9IDY5NTtcbiAgICB0LmE1MCA9IDc3NjtcbiAgICB0LmE1MSA9IDc2ODtcbiAgICB0LmE1MiA9IDc5MjtcbiAgICB0LmE1MyA9IDc1OTtcbiAgICB0LmE1NCA9IDcwNztcbiAgICB0LmE1NSA9IDcwODtcbiAgICB0LmE1NiA9IDY4MjtcbiAgICB0LmE1NyA9IDcwMTtcbiAgICB0LmE1OCA9IDgyNjtcbiAgICB0LmE1OSA9IDgxNTtcbiAgICB0LmE2MCA9IDc4OTtcbiAgICB0LmE2MSA9IDc4OTtcbiAgICB0LmE2MiA9IDcwNztcbiAgICB0LmE2MyA9IDY4NztcbiAgICB0LmE2NCA9IDY5NjtcbiAgICB0LmE2NSA9IDY4OTtcbiAgICB0LmE2NiA9IDc4NjtcbiAgICB0LmE2NyA9IDc4NztcbiAgICB0LmE2OCA9IDcxMztcbiAgICB0LmE2OSA9IDc5MTtcbiAgICB0LmE3MCA9IDc4NTtcbiAgICB0LmE3MSA9IDc5MTtcbiAgICB0LmE3MiA9IDg3MztcbiAgICB0LmE3MyA9IDc2MTtcbiAgICB0LmE3NCA9IDc2MjtcbiAgICB0LmEyMDMgPSA3NjI7XG4gICAgdC5hNzUgPSA3NTk7XG4gICAgdC5hMjA0ID0gNzU5O1xuICAgIHQuYTc2ID0gODkyO1xuICAgIHQuYTc3ID0gODkyO1xuICAgIHQuYTc4ID0gNzg4O1xuICAgIHQuYTc5ID0gNzg0O1xuICAgIHQuYTgxID0gNDM4O1xuICAgIHQuYTgyID0gMTM4O1xuICAgIHQuYTgzID0gMjc3O1xuICAgIHQuYTg0ID0gNDE1O1xuICAgIHQuYTk3ID0gMzkyO1xuICAgIHQuYTk4ID0gMzkyO1xuICAgIHQuYTk5ID0gNjY4O1xuICAgIHQuYTEwMCA9IDY2ODtcbiAgICB0LmE4OSA9IDM5MDtcbiAgICB0LmE5MCA9IDM5MDtcbiAgICB0LmE5MyA9IDMxNztcbiAgICB0LmE5NCA9IDMxNztcbiAgICB0LmE5MSA9IDI3NjtcbiAgICB0LmE5MiA9IDI3NjtcbiAgICB0LmEyMDUgPSA1MDk7XG4gICAgdC5hODUgPSA1MDk7XG4gICAgdC5hMjA2ID0gNDEwO1xuICAgIHQuYTg2ID0gNDEwO1xuICAgIHQuYTg3ID0gMjM0O1xuICAgIHQuYTg4ID0gMjM0O1xuICAgIHQuYTk1ID0gMzM0O1xuICAgIHQuYTk2ID0gMzM0O1xuICAgIHQuYTEwMSA9IDczMjtcbiAgICB0LmExMDIgPSA1NDQ7XG4gICAgdC5hMTAzID0gNTQ0O1xuICAgIHQuYTEwNCA9IDkxMDtcbiAgICB0LmExMDYgPSA2Njc7XG4gICAgdC5hMTA3ID0gNzYwO1xuICAgIHQuYTEwOCA9IDc2MDtcbiAgICB0LmExMTIgPSA3NzY7XG4gICAgdC5hMTExID0gNTk1O1xuICAgIHQuYTExMCA9IDY5NDtcbiAgICB0LmExMDkgPSA2MjY7XG4gICAgdC5hMTIwID0gNzg4O1xuICAgIHQuYTEyMSA9IDc4ODtcbiAgICB0LmExMjIgPSA3ODg7XG4gICAgdC5hMTIzID0gNzg4O1xuICAgIHQuYTEyNCA9IDc4ODtcbiAgICB0LmExMjUgPSA3ODg7XG4gICAgdC5hMTI2ID0gNzg4O1xuICAgIHQuYTEyNyA9IDc4ODtcbiAgICB0LmExMjggPSA3ODg7XG4gICAgdC5hMTI5ID0gNzg4O1xuICAgIHQuYTEzMCA9IDc4ODtcbiAgICB0LmExMzEgPSA3ODg7XG4gICAgdC5hMTMyID0gNzg4O1xuICAgIHQuYTEzMyA9IDc4ODtcbiAgICB0LmExMzQgPSA3ODg7XG4gICAgdC5hMTM1ID0gNzg4O1xuICAgIHQuYTEzNiA9IDc4ODtcbiAgICB0LmExMzcgPSA3ODg7XG4gICAgdC5hMTM4ID0gNzg4O1xuICAgIHQuYTEzOSA9IDc4ODtcbiAgICB0LmExNDAgPSA3ODg7XG4gICAgdC5hMTQxID0gNzg4O1xuICAgIHQuYTE0MiA9IDc4ODtcbiAgICB0LmExNDMgPSA3ODg7XG4gICAgdC5hMTQ0ID0gNzg4O1xuICAgIHQuYTE0NSA9IDc4ODtcbiAgICB0LmExNDYgPSA3ODg7XG4gICAgdC5hMTQ3ID0gNzg4O1xuICAgIHQuYTE0OCA9IDc4ODtcbiAgICB0LmExNDkgPSA3ODg7XG4gICAgdC5hMTUwID0gNzg4O1xuICAgIHQuYTE1MSA9IDc4ODtcbiAgICB0LmExNTIgPSA3ODg7XG4gICAgdC5hMTUzID0gNzg4O1xuICAgIHQuYTE1NCA9IDc4ODtcbiAgICB0LmExNTUgPSA3ODg7XG4gICAgdC5hMTU2ID0gNzg4O1xuICAgIHQuYTE1NyA9IDc4ODtcbiAgICB0LmExNTggPSA3ODg7XG4gICAgdC5hMTU5ID0gNzg4O1xuICAgIHQuYTE2MCA9IDg5NDtcbiAgICB0LmExNjEgPSA4Mzg7XG4gICAgdC5hMTYzID0gMTAxNjtcbiAgICB0LmExNjQgPSA0NTg7XG4gICAgdC5hMTk2ID0gNzQ4O1xuICAgIHQuYTE2NSA9IDkyNDtcbiAgICB0LmExOTIgPSA3NDg7XG4gICAgdC5hMTY2ID0gOTE4O1xuICAgIHQuYTE2NyA9IDkyNztcbiAgICB0LmExNjggPSA5Mjg7XG4gICAgdC5hMTY5ID0gOTI4O1xuICAgIHQuYTE3MCA9IDgzNDtcbiAgICB0LmExNzEgPSA4NzM7XG4gICAgdC5hMTcyID0gODI4O1xuICAgIHQuYTE3MyA9IDkyNDtcbiAgICB0LmExNjIgPSA5MjQ7XG4gICAgdC5hMTc0ID0gOTE3O1xuICAgIHQuYTE3NSA9IDkzMDtcbiAgICB0LmExNzYgPSA5MzE7XG4gICAgdC5hMTc3ID0gNDYzO1xuICAgIHQuYTE3OCA9IDg4MztcbiAgICB0LmExNzkgPSA4MzY7XG4gICAgdC5hMTkzID0gODM2O1xuICAgIHQuYTE4MCA9IDg2NztcbiAgICB0LmExOTkgPSA4Njc7XG4gICAgdC5hMTgxID0gNjk2O1xuICAgIHQuYTIwMCA9IDY5NjtcbiAgICB0LmExODIgPSA4NzQ7XG4gICAgdC5hMjAxID0gODc0O1xuICAgIHQuYTE4MyA9IDc2MDtcbiAgICB0LmExODQgPSA5NDY7XG4gICAgdC5hMTk3ID0gNzcxO1xuICAgIHQuYTE4NSA9IDg2NTtcbiAgICB0LmExOTQgPSA3NzE7XG4gICAgdC5hMTk4ID0gODg4O1xuICAgIHQuYTE4NiA9IDk2NztcbiAgICB0LmExOTUgPSA4ODg7XG4gICAgdC5hMTg3ID0gODMxO1xuICAgIHQuYTE4OCA9IDg3MztcbiAgICB0LmExODkgPSA5Mjc7XG4gICAgdC5hMTkwID0gOTcwO1xuICAgIHQuYTE5MSA9IDkxODtcbiAgfSk7XG59KTtcblxuZXhwb3J0IHsgZ2V0TWV0cmljcyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTQgT3BlcmEgU29mdHdhcmUgQVNBXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqXG4gKiBCYXNlZCBvbiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3NtaGFzaGVyL3dpa2kvTXVybXVySGFzaDMuXG4gKiBIYXNoZXMgcm91Z2hseSAxMDAgS0IgcGVyIG1pbGxpc2Vjb25kIG9uIGk3IDMuNCBHSHouXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7IGlzQXJyYXlCdWZmZXIsIGlzU3RyaW5nIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbmNvbnN0IFNFRUQgPSAweGMzZDJlMWYwO1xuLy8gV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBtYXRoIHByZWNpc2lvbiBpbiBKUy5cbmNvbnN0IE1BU0tfSElHSCA9IDB4ZmZmZjAwMDA7XG5jb25zdCBNQVNLX0xPVyA9IDB4ZmZmZjtcblxuY2xhc3MgTXVybXVySGFzaDNfNjQge1xuICBjb25zdHJ1Y3RvcihzZWVkKSB7XG4gICAgdGhpcy5oMSA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7XG4gICAgdGhpcy5oMiA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7XG4gIH1cblxuICB1cGRhdGUoaW5wdXQpIHtcbiAgICBsZXQgZGF0YSwgbGVuZ3RoO1xuICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTtcbiAgICAgIGxlbmd0aCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbnB1dC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY29kZSA8PSAweGZmKSB7XG4gICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSA+Pj4gODtcbiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGUgJiAweGZmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5QnVmZmVyKGlucHV0KSkge1xuICAgICAgZGF0YSA9IGlucHV0O1xuICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiBcIiArXG4gICAgICAgICAgXCJJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2NrQ291bnRzID0gbGVuZ3RoID4+IDI7XG4gICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDtcbiAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IGVuZGlhbm5lc3MgaGVyZS5cbiAgICBjb25zdCBkYXRhVWludDMyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyLCAwLCBibG9ja0NvdW50cyk7XG4gICAgbGV0IGsxID0gMCxcbiAgICAgIGsyID0gMDtcbiAgICBsZXQgaDEgPSB0aGlzLmgxLFxuICAgICAgaDIgPSB0aGlzLmgyO1xuICAgIGNvbnN0IEMxID0gMHhjYzllMmQ1MSxcbiAgICAgIEMyID0gMHgxYjg3MzU5MztcbiAgICBjb25zdCBDMV9MT1cgPSBDMSAmIE1BU0tfTE9XLFxuICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykge1xuICAgICAgaWYgKGkgJiAxKSB7XG4gICAgICAgIGsxID0gZGF0YVVpbnQzMltpXTtcbiAgICAgICAgazEgPSAoKGsxICogQzEpICYgTUFTS19ISUdIKSB8ICgoazEgKiBDMV9MT1cpICYgTUFTS19MT1cpO1xuICAgICAgICBrMSA9IChrMSA8PCAxNSkgfCAoazEgPj4+IDE3KTtcbiAgICAgICAgazEgPSAoKGsxICogQzIpICYgTUFTS19ISUdIKSB8ICgoazEgKiBDMl9MT1cpICYgTUFTS19MT1cpO1xuICAgICAgICBoMSBePSBrMTtcbiAgICAgICAgaDEgPSAoaDEgPDwgMTMpIHwgKGgxID4+PiAxOSk7XG4gICAgICAgIGgxID0gaDEgKiA1ICsgMHhlNjU0NmI2NDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsyID0gZGF0YVVpbnQzMltpXTtcbiAgICAgICAgazIgPSAoKGsyICogQzEpICYgTUFTS19ISUdIKSB8ICgoazIgKiBDMV9MT1cpICYgTUFTS19MT1cpO1xuICAgICAgICBrMiA9IChrMiA8PCAxNSkgfCAoazIgPj4+IDE3KTtcbiAgICAgICAgazIgPSAoKGsyICogQzIpICYgTUFTS19ISUdIKSB8ICgoazIgKiBDMl9MT1cpICYgTUFTS19MT1cpO1xuICAgICAgICBoMiBePSBrMjtcbiAgICAgICAgaDIgPSAoaDIgPDwgMTMpIHwgKGgyID4+PiAxOSk7XG4gICAgICAgIGgyID0gaDIgKiA1ICsgMHhlNjU0NmI2NDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBrMSA9IDA7XG5cbiAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAyXSA8PCAxNjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAxXSA8PCA4O1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAxOlxuICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNF07XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgICAgICBrMSA9ICgoazEgKiBDMSkgJiBNQVNLX0hJR0gpIHwgKChrMSAqIEMxX0xPVykgJiBNQVNLX0xPVyk7XG4gICAgICAgIGsxID0gKGsxIDw8IDE1KSB8IChrMSA+Pj4gMTcpO1xuICAgICAgICBrMSA9ICgoazEgKiBDMikgJiBNQVNLX0hJR0gpIHwgKChrMSAqIEMyX0xPVykgJiBNQVNLX0xPVyk7XG4gICAgICAgIGlmIChibG9ja0NvdW50cyAmIDEpIHtcbiAgICAgICAgICBoMSBePSBrMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoMiBePSBrMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaDEgPSBoMTtcbiAgICB0aGlzLmgyID0gaDI7XG4gIH1cblxuICBoZXhkaWdlc3QoKSB7XG4gICAgbGV0IGgxID0gdGhpcy5oMSxcbiAgICAgIGgyID0gdGhpcy5oMjtcblxuICAgIGgxIF49IGgyID4+PiAxO1xuICAgIGgxID0gKChoMSAqIDB4ZWQ1NThjY2QpICYgTUFTS19ISUdIKSB8ICgoaDEgKiAweDhjY2QpICYgTUFTS19MT1cpO1xuICAgIGgyID1cbiAgICAgICgoaDIgKiAweGZmNTFhZmQ3KSAmIE1BU0tfSElHSCkgfFxuICAgICAgKCgoKChoMiA8PCAxNikgfCAoaDEgPj4+IDE2KSkgKiAweGFmZDdlZDU1KSAmIE1BU0tfSElHSCkgPj4+IDE2KTtcbiAgICBoMSBePSBoMiA+Pj4gMTtcbiAgICBoMSA9ICgoaDEgKiAweDFhODVlYzUzKSAmIE1BU0tfSElHSCkgfCAoKGgxICogMHhlYzUzKSAmIE1BU0tfTE9XKTtcbiAgICBoMiA9XG4gICAgICAoKGgyICogMHhjNGNlYjlmZSkgJiBNQVNLX0hJR0gpIHxcbiAgICAgICgoKCgoaDIgPDwgMTYpIHwgKGgxID4+PiAxNikpICogMHhiOWZlMWE4NSkgJiBNQVNLX0hJR0gpID4+PiAxNik7XG4gICAgaDEgXj0gaDIgPj4+IDE7XG5cbiAgICBjb25zdCBoZXgxID0gKGgxID4+PiAwKS50b1N0cmluZygxNiksXG4gICAgICBoZXgyID0gKGgyID4+PiAwKS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIGhleDEucGFkU3RhcnQoOCwgXCIwXCIpICsgaGV4Mi5wYWRTdGFydCg4LCBcIjBcIik7XG4gIH1cbn1cblxuZXhwb3J0IHsgTXVybXVySGFzaDNfNjQgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIEZvcm1hdEVycm9yLCBJbWFnZUtpbmQsIGluZm8sIHdhcm4gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IGlzTmFtZSwgaXNTdHJlYW0sIE5hbWUgfSBmcm9tIFwiLi9wcmltaXRpdmVzLmpzXCI7XG5pbXBvcnQgeyBDb2xvclNwYWNlIH0gZnJvbSBcIi4vY29sb3JzcGFjZS5qc1wiO1xuaW1wb3J0IHsgRGVjb2RlU3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgeyBKcGVnU3RyZWFtIH0gZnJvbSBcIi4vanBlZ19zdHJlYW0uanNcIjtcbmltcG9ydCB7IEpweEltYWdlIH0gZnJvbSBcIi4vanB4LmpzXCI7XG5cbi8qKlxuICogRGVjb2RlIGFuZCBjbGFtcCBhIHZhbHVlLiBUaGUgZm9ybXVsYSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3BlYyBiZWNhdXNlIHdlXG4gKiBkb24ndCBkZWNvZGUgdG8gZmxvYXQgcmFuZ2UgWzAsMV0sIHdlIGRlY29kZSBpdCBpbiB0aGUgWzAsbWF4XSByYW5nZS5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlQW5kQ2xhbXAodmFsdWUsIGFkZGVuZCwgY29lZmZpY2llbnQsIG1heCkge1xuICB2YWx1ZSA9IGFkZGVuZCArIHZhbHVlICogY29lZmZpY2llbnQ7XG4gIC8vIENsYW1wIHRoZSB2YWx1ZSB0byB0aGUgcmFuZ2VcbiAgaWYgKHZhbHVlIDwgMCkge1xuICAgIHZhbHVlID0gMDtcbiAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkge1xuICAgIHZhbHVlID0gbWF4O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXNpemVzIGFuIGltYWdlIG1hc2sgd2l0aCAxIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc3JjIC0gVGhlIHNvdXJjZSBidWZmZXIuXG4gKiBAcGFyYW0ge251bWJlcn0gYnBjIC0gTnVtYmVyIG9mIGJpdHMgcGVyIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3MSAtIE9yaWdpbmFsIHdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGgxIC0gT3JpZ2luYWwgaGVpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IHcyIC0gTmV3IHdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGgyIC0gTmV3IGhlaWdodC5cbiAqIEByZXR1cm5zIHtUeXBlZEFycmF5fSBUaGUgcmVzaXplZCBpbWFnZSBtYXNrIGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gcmVzaXplSW1hZ2VNYXNrKHNyYywgYnBjLCB3MSwgaDEsIHcyLCBoMikge1xuICB2YXIgbGVuZ3RoID0gdzIgKiBoMjtcbiAgbGV0IGRlc3Q7XG4gIGlmIChicGMgPD0gOCkge1xuICAgIGRlc3QgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICB9IGVsc2UgaWYgKGJwYyA8PSAxNikge1xuICAgIGRlc3QgPSBuZXcgVWludDE2QXJyYXkobGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBkZXN0ID0gbmV3IFVpbnQzMkFycmF5KGxlbmd0aCk7XG4gIH1cbiAgdmFyIHhSYXRpbyA9IHcxIC8gdzI7XG4gIHZhciB5UmF0aW8gPSBoMSAvIGgyO1xuICB2YXIgaSxcbiAgICBqLFxuICAgIHB5LFxuICAgIG5ld0luZGV4ID0gMCxcbiAgICBvbGRJbmRleDtcbiAgdmFyIHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpO1xuICB2YXIgdzFTY2FubGluZSA9IHcxO1xuXG4gIGZvciAoaSA9IDA7IGkgPCB3MjsgaSsrKSB7XG4gICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbyk7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IGgyOyBpKyspIHtcbiAgICBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lO1xuICAgIGZvciAoaiA9IDA7IGogPCB3MjsgaisrKSB7XG4gICAgICBvbGRJbmRleCA9IHB5ICsgeFNjYWxlZFtqXTtcbiAgICAgIGRlc3RbbmV3SW5kZXgrK10gPSBzcmNbb2xkSW5kZXhdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdDtcbn1cblxuY2xhc3MgUERGSW1hZ2Uge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgeHJlZixcbiAgICByZXMsXG4gICAgaW1hZ2UsXG4gICAgaXNJbmxpbmUgPSBmYWxzZSxcbiAgICBzbWFzayA9IG51bGwsXG4gICAgbWFzayA9IG51bGwsXG4gICAgaXNNYXNrID0gZmFsc2UsXG4gICAgcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICB9KSB7XG4gICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgIHZhciBkaWN0ID0gaW1hZ2UuZGljdDtcblxuICAgIGNvbnN0IGZpbHRlciA9IGRpY3QuZ2V0KFwiRmlsdGVyXCIpO1xuICAgIGlmIChpc05hbWUoZmlsdGVyKSkge1xuICAgICAgc3dpdGNoIChmaWx0ZXIubmFtZSkge1xuICAgICAgICBjYXNlIFwiSlBYRGVjb2RlXCI6XG4gICAgICAgICAgdmFyIGpweEltYWdlID0gbmV3IEpweEltYWdlKCk7XG4gICAgICAgICAganB4SW1hZ2UucGFyc2VJbWFnZVByb3BlcnRpZXMoaW1hZ2Uuc3RyZWFtKTtcbiAgICAgICAgICBpbWFnZS5zdHJlYW0ucmVzZXQoKTtcblxuICAgICAgICAgIGltYWdlLndpZHRoID0ganB4SW1hZ2Uud2lkdGg7XG4gICAgICAgICAgaW1hZ2UuaGVpZ2h0ID0ganB4SW1hZ2UuaGVpZ2h0O1xuICAgICAgICAgIGltYWdlLmJpdHNQZXJDb21wb25lbnQgPSBqcHhJbWFnZS5iaXRzUGVyQ29tcG9uZW50O1xuICAgICAgICAgIGltYWdlLm51bUNvbXBzID0ganB4SW1hZ2UuY29tcG9uZW50c0NvdW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiSkJJRzJEZWNvZGVcIjpcbiAgICAgICAgICBpbWFnZS5iaXRzUGVyQ29tcG9uZW50ID0gMTtcbiAgICAgICAgICBpbWFnZS5udW1Db21wcyA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE8gY2FjaGUgcmVuZGVyZWQgaW1hZ2VzP1xuXG4gICAgbGV0IHdpZHRoID0gZGljdC5nZXQoXCJXaWR0aFwiLCBcIldcIik7XG4gICAgbGV0IGhlaWdodCA9IGRpY3QuZ2V0KFwiSGVpZ2h0XCIsIFwiSFwiKTtcblxuICAgIGlmIChcbiAgICAgIE51bWJlci5pc0ludGVnZXIoaW1hZ2Uud2lkdGgpICYmXG4gICAgICBpbWFnZS53aWR0aCA+IDAgJiZcbiAgICAgIE51bWJlci5pc0ludGVnZXIoaW1hZ2UuaGVpZ2h0KSAmJlxuICAgICAgaW1hZ2UuaGVpZ2h0ID4gMCAmJlxuICAgICAgKGltYWdlLndpZHRoICE9PSB3aWR0aCB8fCBpbWFnZS5oZWlnaHQgIT09IGhlaWdodClcbiAgICApIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwiUERGSW1hZ2UgLSB1c2luZyB0aGUgV2lkdGgvSGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLCBcIiArXG4gICAgICAgICAgXCJyYXRoZXIgdGhhbiB0aGUgaW1hZ2UgZGljdGlvbmFyeS5cIlxuICAgICAgKTtcbiAgICAgIHdpZHRoID0gaW1hZ2Uud2lkdGg7XG4gICAgICBoZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XG4gICAgfVxuICAgIGlmICh3aWR0aCA8IDEgfHwgaGVpZ2h0IDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFxuICAgICAgICBgSW52YWxpZCBpbWFnZSB3aWR0aDogJHt3aWR0aH0gb3IgaGVpZ2h0OiAke2hlaWdodH1gXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICB0aGlzLmludGVycG9sYXRlID0gZGljdC5nZXQoXCJJbnRlcnBvbGF0ZVwiLCBcIklcIikgfHwgZmFsc2U7XG4gICAgdGhpcy5pbWFnZU1hc2sgPSBkaWN0LmdldChcIkltYWdlTWFza1wiLCBcIklNXCIpIHx8IGZhbHNlO1xuICAgIHRoaXMubWF0dGUgPSBkaWN0LmdldChcIk1hdHRlXCIpIHx8IGZhbHNlO1xuXG4gICAgdmFyIGJpdHNQZXJDb21wb25lbnQgPSBpbWFnZS5iaXRzUGVyQ29tcG9uZW50O1xuICAgIGlmICghYml0c1BlckNvbXBvbmVudCkge1xuICAgICAgYml0c1BlckNvbXBvbmVudCA9IGRpY3QuZ2V0KFwiQml0c1BlckNvbXBvbmVudFwiLCBcIkJQQ1wiKTtcbiAgICAgIGlmICghYml0c1BlckNvbXBvbmVudCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZU1hc2spIHtcbiAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50ID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXG4gICAgICAgICAgICBgQml0cyBwZXIgY29tcG9uZW50IG1pc3NpbmcgaW4gaW1hZ2U6ICR7dGhpcy5pbWFnZU1hc2t9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5icGMgPSBiaXRzUGVyQ29tcG9uZW50O1xuXG4gICAgaWYgKCF0aGlzLmltYWdlTWFzaykge1xuICAgICAgbGV0IGNvbG9yU3BhY2UgPSBkaWN0LmdldFJhdyhcIkNvbG9yU3BhY2VcIikgfHwgZGljdC5nZXRSYXcoXCJDU1wiKTtcbiAgICAgIGlmICghY29sb3JTcGFjZSkge1xuICAgICAgICBpbmZvKFwiSlBYIGltYWdlcyAod2hpY2ggZG8gbm90IHJlcXVpcmUgY29sb3Igc3BhY2VzKVwiKTtcbiAgICAgICAgc3dpdGNoIChpbWFnZS5udW1Db21wcykge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBOYW1lLmdldChcIkRldmljZUdyYXlcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoXCJEZXZpY2VSR0JcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoXCJEZXZpY2VDTVlLXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEpQWCBpbWFnZXMgd2l0aCAke2ltYWdlLm51bUNvbXBzfSBgICtcbiAgICAgICAgICAgICAgICBcImNvbG9yIGNvbXBvbmVudHMgbm90IHN1cHBvcnRlZC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jb2xvclNwYWNlID0gQ29sb3JTcGFjZS5wYXJzZSh7XG4gICAgICAgIGNzOiBjb2xvclNwYWNlLFxuICAgICAgICB4cmVmLFxuICAgICAgICByZXNvdXJjZXM6IGlzSW5saW5lID8gcmVzIDogbnVsbCxcbiAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5udW1Db21wcyA9IHRoaXMuY29sb3JTcGFjZS5udW1Db21wcztcbiAgICB9XG5cbiAgICB0aGlzLmRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoXCJEZWNvZGVcIiwgXCJEXCIpO1xuICAgIHRoaXMubmVlZHNEZWNvZGUgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmRlY29kZSAmJlxuICAgICAgKCh0aGlzLmNvbG9yU3BhY2UgJiZcbiAgICAgICAgIXRoaXMuY29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUodGhpcy5kZWNvZGUsIGJpdHNQZXJDb21wb25lbnQpKSB8fFxuICAgICAgICAoaXNNYXNrICYmXG4gICAgICAgICAgIUNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLCAvKiBudW1Db21wcyA9ICovIDEpKSlcbiAgICApIHtcbiAgICAgIHRoaXMubmVlZHNEZWNvZGUgPSB0cnVlO1xuICAgICAgLy8gRG8gc29tZSBwcmVwcm9jZXNzaW5nIHRvIGF2b2lkIG1vcmUgbWF0aC5cbiAgICAgIHZhciBtYXggPSAoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDE7XG4gICAgICB0aGlzLmRlY29kZUNvZWZmaWNpZW50cyA9IFtdO1xuICAgICAgdGhpcy5kZWNvZGVBZGRlbmRzID0gW107XG4gICAgICBjb25zdCBpc0luZGV4ZWQgPSB0aGlzLmNvbG9yU3BhY2UgJiYgdGhpcy5jb2xvclNwYWNlLm5hbWUgPT09IFwiSW5kZXhlZFwiO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kZWNvZGUubGVuZ3RoOyBpICs9IDIsICsraikge1xuICAgICAgICB2YXIgZG1pbiA9IHRoaXMuZGVjb2RlW2ldO1xuICAgICAgICB2YXIgZG1heCA9IHRoaXMuZGVjb2RlW2kgKyAxXTtcbiAgICAgICAgdGhpcy5kZWNvZGVDb2VmZmljaWVudHNbal0gPSBpc0luZGV4ZWRcbiAgICAgICAgICA/IChkbWF4IC0gZG1pbikgLyBtYXhcbiAgICAgICAgICA6IGRtYXggLSBkbWluO1xuICAgICAgICB0aGlzLmRlY29kZUFkZGVuZHNbal0gPSBpc0luZGV4ZWQgPyBkbWluIDogbWF4ICogZG1pbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc21hc2spIHtcbiAgICAgIHRoaXMuc21hc2sgPSBuZXcgUERGSW1hZ2Uoe1xuICAgICAgICB4cmVmLFxuICAgICAgICByZXMsXG4gICAgICAgIGltYWdlOiBzbWFzayxcbiAgICAgICAgaXNJbmxpbmUsXG4gICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hc2spIHtcbiAgICAgIGlmIChpc1N0cmVhbShtYXNrKSkge1xuICAgICAgICB2YXIgbWFza0RpY3QgPSBtYXNrLmRpY3QsXG4gICAgICAgICAgaW1hZ2VNYXNrID0gbWFza0RpY3QuZ2V0KFwiSW1hZ2VNYXNrXCIsIFwiSU1cIik7XG4gICAgICAgIGlmICghaW1hZ2VNYXNrKSB7XG4gICAgICAgICAgd2FybihcIklnbm9yaW5nIC9NYXNrIGluIGltYWdlIHdpdGhvdXQgL0ltYWdlTWFzay5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tYXNrID0gbmV3IFBERkltYWdlKHtcbiAgICAgICAgICAgIHhyZWYsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICBpbWFnZTogbWFzayxcbiAgICAgICAgICAgIGlzSW5saW5lLFxuICAgICAgICAgICAgaXNNYXNrOiB0cnVlLFxuICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LFxuICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENvbG9yIGtleSBtYXNrIChqdXN0IGFuIGFycmF5KS5cbiAgICAgICAgdGhpcy5tYXNrID0gbWFzaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBwcm9jZXNzaW5nIG9mIGltYWdlIGRhdGEgYW5kIHJldHVybnMgdGhlIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZFxuICAgKiB3aXRoIGEgUERGSW1hZ2Ugd2hlbiB0aGUgaW1hZ2UgaXMgcmVhZHkgdG8gYmUgdXNlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBidWlsZEltYWdlKHtcbiAgICB4cmVmLFxuICAgIHJlcyxcbiAgICBpbWFnZSxcbiAgICBpc0lubGluZSA9IGZhbHNlLFxuICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSxcbiAgfSkge1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlO1xuICAgIGxldCBzbWFza0RhdGEgPSBudWxsO1xuICAgIGxldCBtYXNrRGF0YSA9IG51bGw7XG5cbiAgICBjb25zdCBzbWFzayA9IGltYWdlLmRpY3QuZ2V0KFwiU01hc2tcIik7XG4gICAgY29uc3QgbWFzayA9IGltYWdlLmRpY3QuZ2V0KFwiTWFza1wiKTtcblxuICAgIGlmIChzbWFzaykge1xuICAgICAgc21hc2tEYXRhID0gc21hc2s7XG4gICAgfSBlbHNlIGlmIChtYXNrKSB7XG4gICAgICBpZiAoaXNTdHJlYW0obWFzaykgfHwgQXJyYXkuaXNBcnJheShtYXNrKSkge1xuICAgICAgICBtYXNrRGF0YSA9IG1hc2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFwiVW5zdXBwb3J0ZWQgbWFzayBmb3JtYXQuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUERGSW1hZ2Uoe1xuICAgICAgeHJlZixcbiAgICAgIHJlcyxcbiAgICAgIGltYWdlOiBpbWFnZURhdGEsXG4gICAgICBpc0lubGluZSxcbiAgICAgIHNtYXNrOiBzbWFza0RhdGEsXG4gICAgICBtYXNrOiBtYXNrRGF0YSxcbiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSxcbiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1hc2soe1xuICAgIGltZ0FycmF5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbSxcbiAgICBpbnZlcnNlRGVjb2RlLFxuICB9KSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBpbWdBcnJheSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnUERGSW1hZ2UuY3JlYXRlTWFzazogVW5zdXBwb3J0ZWQgXCJpbWdBcnJheVwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgLy8gfGltZ0FycmF5fCBtaWdodCBub3QgY29udGFpbiBmdWxsIGRhdGEgZm9yIGV2ZXJ5IHBpeGVsIG9mIHRoZSBtYXNrLCBzb1xuICAgIC8vIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB8Y29tcHV0ZWRMZW5ndGh8IGFuZCB8YWN0dWFsTGVuZ3RofC5cbiAgICAvLyBJbiBwYXJ0aWN1bGFyLCBpZiBpbnZlcnNlRGVjb2RlIGlzIHRydWUsIHRoZW4gdGhlIGFycmF5IHdlIHJldHVybiBtdXN0XG4gICAgLy8gaGF2ZSBhIGxlbmd0aCBvZiB8Y29tcHV0ZWRMZW5ndGh8LlxuXG4gICAgdmFyIGNvbXB1dGVkTGVuZ3RoID0gKCh3aWR0aCArIDcpID4+IDMpICogaGVpZ2h0O1xuICAgIHZhciBhY3R1YWxMZW5ndGggPSBpbWdBcnJheS5ieXRlTGVuZ3RoO1xuICAgIHZhciBoYXZlRnVsbERhdGEgPSBjb21wdXRlZExlbmd0aCA9PT0gYWN0dWFsTGVuZ3RoO1xuICAgIHZhciBkYXRhLCBpO1xuXG4gICAgaWYgKGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtICYmICghaW52ZXJzZURlY29kZSB8fCBoYXZlRnVsbERhdGEpKSB7XG4gICAgICAvLyBpbWdBcnJheSBjYW1lIGZyb20gYSBEZWNvZGVTdHJlYW0gYW5kIGl0cyBkYXRhIGlzIGluIGFuIGFwcHJvcHJpYXRlXG4gICAgICAvLyBmb3JtLCBzbyB3ZSBjYW4ganVzdCB0cmFuc2ZlciBpdC5cbiAgICAgIGRhdGEgPSBpbWdBcnJheTtcbiAgICB9IGVsc2UgaWYgKCFpbnZlcnNlRGVjb2RlKSB7XG4gICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGFjdHVhbExlbmd0aCk7XG4gICAgICBkYXRhLnNldChpbWdBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoY29tcHV0ZWRMZW5ndGgpO1xuICAgICAgZGF0YS5zZXQoaW1nQXJyYXkpO1xuICAgICAgZm9yIChpID0gYWN0dWFsTGVuZ3RoOyBpIDwgY29tcHV0ZWRMZW5ndGg7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBuZWNlc3NhcnksIGludmVydCB0aGUgb3JpZ2luYWwgbWFzayBkYXRhIChidXQgbm90IGFueSBleHRyYSB3ZSBtaWdodFxuICAgIC8vIGhhdmUgYWRkZWQgYWJvdmUpLiBJdCdzIHNhZmUgdG8gbW9kaWZ5IHRoZSBhcnJheSAtLSB3aGV0aGVyIGl0J3MgdGhlXG4gICAgLy8gb3JpZ2luYWwgb3IgYSBjb3B5LCB3ZSdyZSBhYm91dCB0byB0cmFuc2ZlciBpdCBhbnl3YXksIHNvIG5vdGhpbmcgZWxzZVxuICAgIC8vIGluIHRoaXMgdGhyZWFkIGNhbiBiZSByZWx5aW5nIG9uIGl0cyBjb250ZW50cy5cbiAgICBpZiAoaW52ZXJzZURlY29kZSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gXj0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH07XG4gIH1cblxuICBnZXQgZHJhd1dpZHRoKCkge1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgIHRoaXMud2lkdGgsXG4gICAgICAodGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLndpZHRoKSB8fCAwLFxuICAgICAgKHRoaXMubWFzayAmJiB0aGlzLm1hc2sud2lkdGgpIHx8IDBcbiAgICApO1xuICB9XG5cbiAgZ2V0IGRyYXdIZWlnaHQoKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgdGhpcy5oZWlnaHQsXG4gICAgICAodGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLmhlaWdodCkgfHwgMCxcbiAgICAgICh0aGlzLm1hc2sgJiYgdGhpcy5tYXNrLmhlaWdodCkgfHwgMFxuICAgICk7XG4gIH1cblxuICBkZWNvZGVCdWZmZXIoYnVmZmVyKSB7XG4gICAgdmFyIGJwYyA9IHRoaXMuYnBjO1xuICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7XG5cbiAgICB2YXIgZGVjb2RlQWRkZW5kcyA9IHRoaXMuZGVjb2RlQWRkZW5kcztcbiAgICB2YXIgZGVjb2RlQ29lZmZpY2llbnRzID0gdGhpcy5kZWNvZGVDb2VmZmljaWVudHM7XG4gICAgdmFyIG1heCA9ICgxIDw8IGJwYykgLSAxO1xuICAgIHZhciBpLCBpaTtcblxuICAgIGlmIChicGMgPT09IDEpIHtcbiAgICAgIC8vIElmIHRoZSBidWZmZXIgbmVlZGVkIGRlY29kZSB0aGF0IG1lYW5zIGl0IGp1c3QgbmVlZHMgdG8gYmUgaW52ZXJ0ZWQuXG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9ICshYnVmZmVyW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAoaSA9IDAsIGlpID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0OyBpIDwgaWk7IGkrKykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Db21wczsgaisrKSB7XG4gICAgICAgIGJ1ZmZlcltpbmRleF0gPSBkZWNvZGVBbmRDbGFtcChcbiAgICAgICAgICBidWZmZXJbaW5kZXhdLFxuICAgICAgICAgIGRlY29kZUFkZGVuZHNbal0sXG4gICAgICAgICAgZGVjb2RlQ29lZmZpY2llbnRzW2pdLFxuICAgICAgICAgIG1heFxuICAgICAgICApO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudHMoYnVmZmVyKSB7XG4gICAgdmFyIGJwYyA9IHRoaXMuYnBjO1xuXG4gICAgLy8gVGhpcyBpbWFnZSBkb2Vzbid0IHJlcXVpcmUgYW55IGV4dHJhIHdvcmsuXG4gICAgaWYgKGJwYyA9PT0gOCkge1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzO1xuXG4gICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcHM7XG4gICAgdmFyIGJ1ZmZlclBvcyA9IDA7XG4gICAgbGV0IG91dHB1dDtcbiAgICBpZiAoYnBjIDw9IDgpIHtcbiAgICAgIG91dHB1dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgfSBlbHNlIGlmIChicGMgPD0gMTYpIHtcbiAgICAgIG91dHB1dCA9IG5ldyBVaW50MTZBcnJheShsZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIHJvd0NvbXBzID0gd2lkdGggKiBudW1Db21wcztcblxuICAgIHZhciBtYXggPSAoMSA8PCBicGMpIC0gMTtcbiAgICB2YXIgaSA9IDAsXG4gICAgICBpaSxcbiAgICAgIGJ1ZjtcblxuICAgIGlmIChicGMgPT09IDEpIHtcbiAgICAgIC8vIE9wdGltaXphdGlvbiBmb3IgcmVhZGluZyAxIGJwYyBpbWFnZXMuXG4gICAgICB2YXIgbWFzaywgbG9vcDFFbmQsIGxvb3AyRW5kO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykge1xuICAgICAgICBsb29wMUVuZCA9IGkgKyAocm93Q29tcHMgJiB+Nyk7XG4gICAgICAgIGxvb3AyRW5kID0gaSArIHJvd0NvbXBzO1xuXG4gICAgICAgIC8vIHVucm9sbCBsb29wIGZvciBhbGwgZnVsbCBieXRlc1xuICAgICAgICB3aGlsZSAoaSA8IGxvb3AxRW5kKSB7XG4gICAgICAgICAgYnVmID0gYnVmZmVyW2J1ZmZlclBvcysrXTtcbiAgICAgICAgICBvdXRwdXRbaV0gPSAoYnVmID4+IDcpICYgMTtcbiAgICAgICAgICBvdXRwdXRbaSArIDFdID0gKGJ1ZiA+PiA2KSAmIDE7XG4gICAgICAgICAgb3V0cHV0W2kgKyAyXSA9IChidWYgPj4gNSkgJiAxO1xuICAgICAgICAgIG91dHB1dFtpICsgM10gPSAoYnVmID4+IDQpICYgMTtcbiAgICAgICAgICBvdXRwdXRbaSArIDRdID0gKGJ1ZiA+PiAzKSAmIDE7XG4gICAgICAgICAgb3V0cHV0W2kgKyA1XSA9IChidWYgPj4gMikgJiAxO1xuICAgICAgICAgIG91dHB1dFtpICsgNl0gPSAoYnVmID4+IDEpICYgMTtcbiAgICAgICAgICBvdXRwdXRbaSArIDddID0gYnVmICYgMTtcbiAgICAgICAgICBpICs9IDg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgcmVtYWluaW5nIGJpdHNcbiAgICAgICAgaWYgKGkgPCBsb29wMkVuZCkge1xuICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcltidWZmZXJQb3MrK107XG4gICAgICAgICAgbWFzayA9IDEyODtcbiAgICAgICAgICB3aGlsZSAoaSA8IGxvb3AyRW5kKSB7XG4gICAgICAgICAgICBvdXRwdXRbaSsrXSA9ICshIShidWYgJiBtYXNrKTtcbiAgICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBnZW5lcmFsIGNhc2UgdGhhdCBoYW5kbGVzIGFsbCBvdGhlciBicGMgdmFsdWVzLlxuICAgICAgdmFyIGJpdHMgPSAwO1xuICAgICAgYnVmID0gMDtcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gbGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICBpZiAoaSAlIHJvd0NvbXBzID09PSAwKSB7XG4gICAgICAgICAgYnVmID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChiaXRzIDwgYnBjKSB7XG4gICAgICAgICAgYnVmID0gKGJ1ZiA8PCA4KSB8IGJ1ZmZlcltidWZmZXJQb3MrK107XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlbWFpbmluZ0JpdHMgPSBiaXRzIC0gYnBjO1xuICAgICAgICBsZXQgdmFsdWUgPSBidWYgPj4gcmVtYWluaW5nQml0cztcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkge1xuICAgICAgICAgIHZhbHVlID0gbWF4O1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFtpXSA9IHZhbHVlO1xuICAgICAgICBidWYgPSBidWYgJiAoKDEgPDwgcmVtYWluaW5nQml0cykgLSAxKTtcbiAgICAgICAgYml0cyA9IHJlbWFpbmluZ0JpdHM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBmaWxsT3BhY2l0eShyZ2JhQnVmLCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGltYWdlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICByZ2JhQnVmIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXksXG4gICAgICAgICdQREZJbWFnZS5maWxsT3BhY2l0eTogVW5zdXBwb3J0ZWQgXCJyZ2JhQnVmXCIgdHlwZS4nXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgc21hc2sgPSB0aGlzLnNtYXNrO1xuICAgIHZhciBtYXNrID0gdGhpcy5tYXNrO1xuICAgIHZhciBhbHBoYUJ1Ziwgc3csIHNoLCBpLCBpaSwgajtcblxuICAgIGlmIChzbWFzaykge1xuICAgICAgc3cgPSBzbWFzay53aWR0aDtcbiAgICAgIHNoID0gc21hc2suaGVpZ2h0O1xuICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3cgKiBzaCk7XG4gICAgICBzbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7XG4gICAgICBpZiAoc3cgIT09IHdpZHRoIHx8IHNoICE9PSBoZWlnaHQpIHtcbiAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIHNtYXNrLmJwYywgc3csIHNoLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1hc2spIHtcbiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgUERGSW1hZ2UpIHtcbiAgICAgICAgc3cgPSBtYXNrLndpZHRoO1xuICAgICAgICBzaCA9IG1hc2suaGVpZ2h0O1xuICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzdyAqIHNoKTtcbiAgICAgICAgbWFzay5udW1Db21wcyA9IDE7XG4gICAgICAgIG1hc2suZmlsbEdyYXlCdWZmZXIoYWxwaGFCdWYpO1xuXG4gICAgICAgIC8vIE5lZWQgdG8gaW52ZXJ0IHZhbHVlcyBpbiByZ2JhQnVmXG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gc3cgKiBzaDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICBhbHBoYUJ1ZltpXSA9IDI1NSAtIGFscGhhQnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN3ICE9PSB3aWR0aCB8fCBzaCAhPT0gaGVpZ2h0KSB7XG4gICAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIG1hc2suYnBjLCBzdywgc2gsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWFzaykpIHtcbiAgICAgICAgLy8gQ29sb3Iga2V5IG1hc2s6IGlmIGFueSBvZiB0aGUgY29tcG9uZW50cyBhcmUgb3V0c2lkZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gdGhlbiB0aGV5IHNob3VsZCBiZSBwYWludGVkLlxuICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gICAgICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGggKiBoZWlnaHQ7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgdmFyIG9wYWNpdHkgPSAwO1xuICAgICAgICAgIHZhciBpbWFnZU9mZnNldCA9IGkgKiBudW1Db21wcztcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7ICsraikge1xuICAgICAgICAgICAgdmFyIGNvbG9yID0gaW1hZ2VbaW1hZ2VPZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIHZhciBtYXNrT2Zmc2V0ID0gaiAqIDI7XG4gICAgICAgICAgICBpZiAoY29sb3IgPCBtYXNrW21hc2tPZmZzZXRdIHx8IGNvbG9yID4gbWFza1ttYXNrT2Zmc2V0ICsgMV0pIHtcbiAgICAgICAgICAgICAgb3BhY2l0eSA9IDI1NTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFscGhhQnVmW2ldID0gb3BhY2l0eTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiVW5rbm93biBtYXNrIGZvcm1hdC5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFscGhhQnVmKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkge1xuICAgICAgICByZ2JhQnVmW2pdID0gYWxwaGFCdWZbaV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG1hc2suXG4gICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkge1xuICAgICAgICByZ2JhQnVmW2pdID0gMjU1O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVuZG9QcmVibGVuZChidWZmZXIsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICAnUERGSW1hZ2UudW5kb1ByZWJsZW5kOiBVbnN1cHBvcnRlZCBcImJ1ZmZlclwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIG1hdHRlID0gdGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLm1hdHRlO1xuICAgIGlmICghbWF0dGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG1hdHRlUmdiID0gdGhpcy5jb2xvclNwYWNlLmdldFJnYihtYXR0ZSwgMCk7XG4gICAgdmFyIG1hdHRlUiA9IG1hdHRlUmdiWzBdO1xuICAgIHZhciBtYXR0ZUcgPSBtYXR0ZVJnYlsxXTtcbiAgICB2YXIgbWF0dGVCID0gbWF0dGVSZ2JbMl07XG4gICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgYWxwaGEgPSBidWZmZXJbaSArIDNdO1xuICAgICAgaWYgKGFscGhhID09PSAwKSB7XG4gICAgICAgIC8vIGFjY29yZGluZyBmb3JtdWxhIHdlIGhhdmUgdG8gZ2V0IEluZmluaXR5IGluIGFsbCBjb21wb25lbnRzXG4gICAgICAgIC8vIG1ha2luZyBpdCB3aGl0ZSAodHlwaWNhbCBwYXBlciBjb2xvcikgc2hvdWxkIGJlIG9rYXlcbiAgICAgICAgYnVmZmVyW2ldID0gMjU1O1xuICAgICAgICBidWZmZXJbaSArIDFdID0gMjU1O1xuICAgICAgICBidWZmZXJbaSArIDJdID0gMjU1O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBrID0gMjU1IC8gYWxwaGE7XG4gICAgICBidWZmZXJbaV0gPSAoYnVmZmVyW2ldIC0gbWF0dGVSKSAqIGsgKyBtYXR0ZVI7XG4gICAgICBidWZmZXJbaSArIDFdID0gKGJ1ZmZlcltpICsgMV0gLSBtYXR0ZUcpICogayArIG1hdHRlRztcbiAgICAgIGJ1ZmZlcltpICsgMl0gPSAoYnVmZmVyW2kgKyAyXSAtIG1hdHRlQikgKiBrICsgbWF0dGVCO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUltYWdlRGF0YShmb3JjZVJHQkEgPSBmYWxzZSkge1xuICAgIHZhciBkcmF3V2lkdGggPSB0aGlzLmRyYXdXaWR0aDtcbiAgICB2YXIgZHJhd0hlaWdodCA9IHRoaXMuZHJhd0hlaWdodDtcbiAgICB2YXIgaW1nRGF0YSA9IHtcbiAgICAgIHdpZHRoOiBkcmF3V2lkdGgsXG4gICAgICBoZWlnaHQ6IGRyYXdIZWlnaHQsXG4gICAgICBraW5kOiAwLFxuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIC8vIE90aGVyIGZpZWxkcyBhcmUgZmlsbGVkIGluIGJlbG93LlxuICAgIH07XG5cbiAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzO1xuICAgIHZhciBvcmlnaW5hbFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICB2YXIgb3JpZ2luYWxIZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICB2YXIgYnBjID0gdGhpcy5icGM7XG5cbiAgICAvLyBSb3dzIHN0YXJ0IGF0IGJ5dGUgYm91bmRhcnkuXG4gICAgdmFyIHJvd0J5dGVzID0gKG9yaWdpbmFsV2lkdGggKiBudW1Db21wcyAqIGJwYyArIDcpID4+IDM7XG4gICAgdmFyIGltZ0FycmF5O1xuXG4gICAgaWYgKCFmb3JjZVJHQkEpIHtcbiAgICAgIC8vIElmIGl0IGlzIGEgMS1iaXQtcGVyLXBpeGVsIGdyYXlzY2FsZSAoaS5lLiBibGFjay1hbmQtd2hpdGUpIGltYWdlXG4gICAgICAvLyB3aXRob3V0IGFueSBjb21wbGljYXRpb25zLCB3ZSBwYXNzIGEgc2FtZS1zaXplZCBjb3B5IHRvIHRoZSBtYWluXG4gICAgICAvLyB0aHJlYWQgcmF0aGVyIHRoYW4gZXhwYW5kaW5nIGJ5IDMyeCB0byBSR0JBIGZvcm0uIFRoaXMgc2F2ZXMgKmxvdHMqXG4gICAgICAvLyBvZiBtZW1vcnkgZm9yIG1hbnkgc2Nhbm5lZCBkb2N1bWVudHMuIEl0J3MgYWxzbyBtdWNoIGZhc3Rlci5cbiAgICAgIC8vXG4gICAgICAvLyBTaW1pbGFybHksIGlmIGl0IGlzIGEgMjQtYml0LXBlciBwaXhlbCBSR0IgaW1hZ2Ugd2l0aG91dCBhbnlcbiAgICAgIC8vIGNvbXBsaWNhdGlvbnMsIHdlIGF2b2lkIGV4cGFuZGluZyBieSAxLjMzM3ggdG8gUkdCQSBmb3JtLlxuICAgICAgdmFyIGtpbmQ7XG4gICAgICBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09IFwiRGV2aWNlR3JheVwiICYmIGJwYyA9PT0gMSkge1xuICAgICAgICBraW5kID0gSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5jb2xvclNwYWNlLm5hbWUgPT09IFwiRGV2aWNlUkdCXCIgJiZcbiAgICAgICAgYnBjID09PSA4ICYmXG4gICAgICAgICF0aGlzLm5lZWRzRGVjb2RlXG4gICAgICApIHtcbiAgICAgICAga2luZCA9IEltYWdlS2luZC5SR0JfMjRCUFA7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGtpbmQgJiZcbiAgICAgICAgIXRoaXMuc21hc2sgJiZcbiAgICAgICAgIXRoaXMubWFzayAmJlxuICAgICAgICBkcmF3V2lkdGggPT09IG9yaWdpbmFsV2lkdGggJiZcbiAgICAgICAgZHJhd0hlaWdodCA9PT0gb3JpZ2luYWxIZWlnaHRcbiAgICAgICkge1xuICAgICAgICBpbWdEYXRhLmtpbmQgPSBraW5kO1xuXG4gICAgICAgIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMpO1xuICAgICAgICAvLyBJZiBpbWdBcnJheSBjYW1lIGZyb20gYSBEZWNvZGVTdHJlYW0sIHdlJ3JlIHNhZmUgdG8gdHJhbnNmZXIgaXRcbiAgICAgICAgLy8gKGFuZCB0aHVzIGRldGFjaCBpdHMgdW5kZXJseWluZyBidWZmZXIpIGJlY2F1c2UgaXQgd2lsbCBjb25zdGl0dXRlXG4gICAgICAgIC8vIHRoZSBlbnRpcmUgRGVjb2RlU3RyZWFtJ3MgZGF0YS4gIEJ1dCBpZiBpdCBjYW1lIGZyb20gYSBTdHJlYW0sIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gY29weSBpdCBiZWNhdXNlIGl0J2xsIG9ubHkgYmUgYSBwb3J0aW9uIG9mIHRoZSBTdHJlYW0nc1xuICAgICAgICAvLyBkYXRhLCBhbmQgdGhlIHJlc3Qgd2lsbCBiZSByZWFkIGxhdGVyIG9uLlxuICAgICAgICBpZiAodGhpcy5pbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSkge1xuICAgICAgICAgIGltZ0RhdGEuZGF0YSA9IGltZ0FycmF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuZXdBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdBcnJheS5sZW5ndGgpO1xuICAgICAgICAgIG5ld0FycmF5LnNldChpbWdBcnJheSk7XG4gICAgICAgICAgaW1nRGF0YS5kYXRhID0gbmV3QXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHtcbiAgICAgICAgICAvLyBJbnZlcnQgdGhlIGJ1ZmZlciAod2hpY2ggbXVzdCBiZSBncmF5c2NhbGUgaWYgd2UgcmVhY2hlZCBoZXJlKS5cbiAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICBraW5kID09PSBJbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAsXG4gICAgICAgICAgICBcIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gaW1nRGF0YS5kYXRhO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBidWZmZXJbaV0gXj0gMHhmZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGltZ0RhdGE7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pbWFnZSBpbnN0YW5jZW9mIEpwZWdTdHJlYW0gJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzaykge1xuICAgICAgICBsZXQgaW1hZ2VMZW5ndGggPSBvcmlnaW5hbEhlaWdodCAqIHJvd0J5dGVzO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY29sb3JTcGFjZS5uYW1lKSB7XG4gICAgICAgICAgY2FzZSBcIkRldmljZUdyYXlcIjpcbiAgICAgICAgICAgIC8vIEF2b2lkIHRydW5jYXRpbmcgdGhlIGltYWdlLCBzaW5jZSBgSnBlZ0ltYWdlLmdldERhdGFgXG4gICAgICAgICAgICAvLyB3aWxsIGV4cGFuZCB0aGUgaW1hZ2UgZGF0YSB3aGVuIGBmb3JjZVJHQiA9PT0gdHJ1ZWAuXG4gICAgICAgICAgICBpbWFnZUxlbmd0aCAqPSAzO1xuICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICBjYXNlIFwiRGV2aWNlUkdCXCI6XG4gICAgICAgICAgY2FzZSBcIkRldmljZUNNWUtcIjpcbiAgICAgICAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JfMjRCUFA7XG4gICAgICAgICAgICBpbWdEYXRhLmRhdGEgPSB0aGlzLmdldEltYWdlQnl0ZXMoXG4gICAgICAgICAgICAgIGltYWdlTGVuZ3RoLFxuICAgICAgICAgICAgICBkcmF3V2lkdGgsXG4gICAgICAgICAgICAgIGRyYXdIZWlnaHQsXG4gICAgICAgICAgICAgIC8qIGZvcmNlUkdCID0gKi8gdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBpbWdEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW1nQXJyYXkgPSB0aGlzLmdldEltYWdlQnl0ZXMob3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlcyk7XG4gICAgLy8gaW1nQXJyYXkgY2FuIGJlIGluY29tcGxldGUgKGUuZy4gYWZ0ZXIgQ0NJVFQgZmF4IGVuY29kaW5nKS5cbiAgICB2YXIgYWN0dWFsSGVpZ2h0ID1cbiAgICAgIDAgfCAoKChpbWdBcnJheS5sZW5ndGggLyByb3dCeXRlcykgKiBkcmF3SGVpZ2h0KSAvIG9yaWdpbmFsSGVpZ2h0KTtcblxuICAgIHZhciBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7XG5cbiAgICAvLyBJZiBvcGFjaXR5IGRhdGEgaXMgcHJlc2VudCwgdXNlIFJHQkFfMzJCUFAgZm9ybS4gT3RoZXJ3aXNlLCB1c2UgdGhlXG4gICAgLy8gbW9yZSBjb21wYWN0IFJHQl8yNEJQUCBmb3JtIGlmIGFsbG93YWJsZS5cbiAgICB2YXIgYWxwaGEwMSwgbWF5YmVVbmRvUHJlYmxlbmQ7XG4gICAgaWYgKCFmb3JjZVJHQkEgJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzaykge1xuICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDtcbiAgICAgIGltZ0RhdGEuZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkcmF3V2lkdGggKiBkcmF3SGVpZ2h0ICogMyk7XG4gICAgICBhbHBoYTAxID0gMDtcbiAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JBXzMyQlBQO1xuICAgICAgaW1nRGF0YS5kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiA0KTtcbiAgICAgIGFscGhhMDEgPSAxO1xuICAgICAgbWF5YmVVbmRvUHJlYmxlbmQgPSB0cnVlO1xuXG4gICAgICAvLyBDb2xvciBrZXkgbWFza2luZyAob3BhY2l0eSkgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGRlY29kaW5nLlxuICAgICAgdGhpcy5maWxsT3BhY2l0eShcbiAgICAgICAgaW1nRGF0YS5kYXRhLFxuICAgICAgICBkcmF3V2lkdGgsXG4gICAgICAgIGRyYXdIZWlnaHQsXG4gICAgICAgIGFjdHVhbEhlaWdodCxcbiAgICAgICAgY29tcHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHtcbiAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTtcbiAgICB9XG4gICAgdGhpcy5jb2xvclNwYWNlLmZpbGxSZ2IoXG4gICAgICBpbWdEYXRhLmRhdGEsXG4gICAgICBvcmlnaW5hbFdpZHRoLFxuICAgICAgb3JpZ2luYWxIZWlnaHQsXG4gICAgICBkcmF3V2lkdGgsXG4gICAgICBkcmF3SGVpZ2h0LFxuICAgICAgYWN0dWFsSGVpZ2h0LFxuICAgICAgYnBjLFxuICAgICAgY29tcHMsXG4gICAgICBhbHBoYTAxXG4gICAgKTtcbiAgICBpZiAobWF5YmVVbmRvUHJlYmxlbmQpIHtcbiAgICAgIHRoaXMudW5kb1ByZWJsZW5kKGltZ0RhdGEuZGF0YSwgZHJhd1dpZHRoLCBhY3R1YWxIZWlnaHQpO1xuICAgIH1cblxuICAgIHJldHVybiBpbWdEYXRhO1xuICB9XG5cbiAgZmlsbEdyYXlCdWZmZXIoYnVmZmVyKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBidWZmZXIgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAgICAgJ1BERkltYWdlLmZpbGxHcmF5QnVmZmVyOiBVbnN1cHBvcnRlZCBcImJ1ZmZlclwiIHR5cGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIG51bUNvbXBzID0gdGhpcy5udW1Db21wcztcbiAgICBpZiAobnVtQ29tcHMgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcbiAgICAgICAgYFJlYWRpbmcgZ3JheSBzY2FsZSBmcm9tIGEgY29sb3IgaW1hZ2U6ICR7bnVtQ29tcHN9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICB2YXIgYnBjID0gdGhpcy5icGM7XG5cbiAgICAvLyByb3dzIHN0YXJ0IGF0IGJ5dGUgYm91bmRhcnlcbiAgICB2YXIgcm93Qnl0ZXMgPSAod2lkdGggKiBudW1Db21wcyAqIGJwYyArIDcpID4+IDM7XG4gICAgdmFyIGltZ0FycmF5ID0gdGhpcy5nZXRJbWFnZUJ5dGVzKGhlaWdodCAqIHJvd0J5dGVzKTtcblxuICAgIHZhciBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7XG4gICAgdmFyIGksIGxlbmd0aDtcblxuICAgIGlmIChicGMgPT09IDEpIHtcbiAgICAgIC8vIGlubGluZSBkZWNvZGluZyAoPSBpbnZlcnNpb24pIGZvciAxIGJwYyBpbWFnZXNcbiAgICAgIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHtcbiAgICAgICAgLy8gaW52ZXJ0IGFuZCBzY2FsZSB0byB7MCwgMjU1fVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBidWZmZXJbaV0gPSAoY29tcHNbaV0gLSAxKSAmIDI1NTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2NhbGUgdG8gezAsIDI1NX1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgYnVmZmVyW2ldID0gLWNvbXBzW2ldICYgMjU1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHtcbiAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTtcbiAgICB9XG4gICAgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQ7XG4gICAgLy8gd2UgYXJlbid0IHVzaW5nIGEgY29sb3JzcGFjZSBzbyB3ZSBuZWVkIHRvIHNjYWxlIHRoZSB2YWx1ZVxuICAgIHZhciBzY2FsZSA9IDI1NSAvICgoMSA8PCBicGMpIC0gMSk7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBidWZmZXJbaV0gPSBzY2FsZSAqIGNvbXBzW2ldO1xuICAgIH1cbiAgfVxuXG4gIGdldEltYWdlQnl0ZXMobGVuZ3RoLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIGZvcmNlUkdCID0gZmFsc2UpIHtcbiAgICB0aGlzLmltYWdlLnJlc2V0KCk7XG4gICAgdGhpcy5pbWFnZS5kcmF3V2lkdGggPSBkcmF3V2lkdGggfHwgdGhpcy53aWR0aDtcbiAgICB0aGlzLmltYWdlLmRyYXdIZWlnaHQgPSBkcmF3SGVpZ2h0IHx8IHRoaXMuaGVpZ2h0O1xuICAgIHRoaXMuaW1hZ2UuZm9yY2VSR0IgPSAhIWZvcmNlUkdCO1xuICAgIHJldHVybiB0aGlzLmltYWdlLmdldEJ5dGVzKGxlbmd0aCwgLyogZm9yY2VDbGFtcGVkID0gKi8gdHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGSW1hZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE4IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IsIHByZWZlci1jb25zdDogZXJyb3IgKi9cblxuaW1wb3J0IHtcbiAgQWJvcnRFeGNlcHRpb24sXG4gIGFzc2VydCxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG4gIE1pc3NpbmdQREZFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbiAgVW5rbm93bkVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwiLi91dGlsLmpzXCI7XG5cbmNvbnN0IENhbGxiYWNrS2luZCA9IHtcbiAgVU5LTk9XTjogMCxcbiAgREFUQTogMSxcbiAgRVJST1I6IDIsXG59O1xuXG5jb25zdCBTdHJlYW1LaW5kID0ge1xuICBVTktOT1dOOiAwLFxuICBDQU5DRUw6IDEsXG4gIENBTkNFTF9DT01QTEVURTogMixcbiAgQ0xPU0U6IDMsXG4gIEVOUVVFVUU6IDQsXG4gIEVSUk9SOiA1LFxuICBQVUxMOiA2LFxuICBQVUxMX0NPTVBMRVRFOiA3LFxuICBTVEFSVF9DT01QTEVURTogOCxcbn07XG5cbmZ1bmN0aW9uIHdyYXBSZWFzb24ocmVhc29uKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICApIHtcbiAgICBhc3NlcnQoXG4gICAgICByZWFzb24gaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgICAgICAodHlwZW9mIHJlYXNvbiA9PT0gXCJvYmplY3RcIiAmJiByZWFzb24gIT09IG51bGwpLFxuICAgICAgJ3dyYXBSZWFzb246IEV4cGVjdGVkIFwicmVhc29uXCIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbiAhPT0gXCJvYmplY3RcIiB8fCByZWFzb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiByZWFzb247XG4gICAgfVxuICB9XG4gIHN3aXRjaCAocmVhc29uLm5hbWUpIHtcbiAgICBjYXNlIFwiQWJvcnRFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uc3RhdHVzKTtcbiAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmRldGFpbHMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnRvU3RyaW5nKCkpO1xuICB9XG59XG5cbmNsYXNzIE1lc3NhZ2VIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Ioc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7XG4gICAgdGhpcy5zb3VyY2VOYW1lID0gc291cmNlTmFtZTtcbiAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lO1xuICAgIHRoaXMuY29tT2JqID0gY29tT2JqO1xuICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7XG4gICAgdGhpcy5zdHJlYW1JZCA9IDE7XG4gICAgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHRydWU7XG4gICAgdGhpcy5zdHJlYW1TaW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zdHJlYW1Db250cm9sbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGE7XG4gICAgICBpZiAoZGF0YS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuc3RyZWFtKSB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5jYWxsYmFjaykge1xuICAgICAgICBjb25zdCBjYWxsYmFja0lkID0gZGF0YS5jYWxsYmFja0lkO1xuICAgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXR5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayAke2NhbGxiYWNrSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07XG5cbiAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5EQVRBKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEuZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkVSUk9SKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuICAgICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHtcbiAgICAgICAgY29uc3QgY2JTb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgICAgICBjb25zdCBjYlRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhKSk7XG4gICAgICAgIH0pLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuREFUQSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLFxuICAgICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLFxuICAgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLFxuICAgICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5zdHJlYW1JZCkge1xuICAgICAgICB0aGlzLl9jcmVhdGVTdHJlYW1TaW5rKGRhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhY3Rpb24oZGF0YS5kYXRhKTtcbiAgICB9O1xuICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7XG4gIH1cblxuICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICB0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiLFxuICAgICAgICAnTWVzc2FnZUhhbmRsZXIub246IEV4cGVjdGVkIFwiaGFuZGxlclwiIHRvIGJlIGEgZnVuY3Rpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYWggPSB0aGlzLmFjdGlvbkhhbmRsZXI7XG4gICAgaWYgKGFoW2FjdGlvbk5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgXCIke2FjdGlvbk5hbWV9XCJgKTtcbiAgICB9XG4gICAgYWhbYWN0aW9uTmFtZV0gPSBoYW5kbGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY29tT2JqIHRvIGludm9rZSB0aGUgYWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gQWN0aW9uIHRvIGNhbGwuXG4gICAqIEBwYXJhbSB7SlNPTn0gZGF0YSAtIEpTT04gZGF0YSB0byBzZW5kLlxuICAgKiBAcGFyYW0ge0FycmF5fSBbdHJhbnNmZXJzXSAtIExpc3Qgb2YgdHJhbnNmZXJzL0FycmF5QnVmZmVycy5cbiAgICovXG4gIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG4gICAgdGhpcy5fcG9zdE1lc3NhZ2UoXG4gICAgICB7XG4gICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLFxuICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICAgdHJhbnNmZXJzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGNvbU9iaiB0byBpbnZva2UgdGhlIGFjdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBkYXRhLlxuICAgKiBFeHBlY3RzIHRoYXQgdGhlIG90aGVyIHNpZGUgd2lsbCBjYWxsYmFjayB3aXRoIHRoZSByZXNwb25zZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gdG8gY2FsbC5cbiAgICogQHBhcmFtIHtKU09OfSBkYXRhIC0gSlNPTiBkYXRhIHRvIHNlbmQuXG4gICAqIEBwYXJhbSB7QXJyYXl9IFt0cmFuc2ZlcnNdIC0gTGlzdCBvZiB0cmFuc2ZlcnMvQXJyYXlCdWZmZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0byBiZSByZXNvbHZlZCB3aXRoIHJlc3BvbnNlIGRhdGEuXG4gICAqL1xuICBzZW5kV2l0aFByb21pc2UoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG4gICAgY29uc3QgY2FsbGJhY2tJZCA9IHRoaXMuY2FsbGJhY2tJZCsrO1xuICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF0gPSBjYXBhYmlsaXR5O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9wb3N0TWVzc2FnZShcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgICAgIGNhbGxiYWNrSWQsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmZXJzXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjYXBhYmlsaXR5LnJlamVjdChleCk7XG4gICAgfVxuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBjb21PYmogdG8gaW52b2tlIHRoZSBhY3Rpb24gd2l0aCB0aGUgc3VwcGxpZWQgZGF0YS5cbiAgICogRXhwZWN0IHRoYXQgdGhlIG90aGVyIHNpZGUgd2lsbCBjYWxsYmFjayB0byBzaWduYWwgJ3N0YXJ0X2NvbXBsZXRlJy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gdG8gY2FsbC5cbiAgICogQHBhcmFtIHtKU09OfSBkYXRhIC0gSlNPTiBkYXRhIHRvIHNlbmQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBxdWV1ZWluZ1N0cmF0ZWd5IC0gU3RyYXRlZ3kgdG8gc2lnbmFsIGJhY2twcmVzc3VyZSBiYXNlZCBvblxuICAgKiAgICAgICAgICAgICAgICAgaW50ZXJuYWwgcXVldWUuXG4gICAqIEBwYXJhbSB7QXJyYXl9IFt0cmFuc2ZlcnNdIC0gTGlzdCBvZiB0cmFuc2ZlcnMvQXJyYXlCdWZmZXJzLlxuICAgKiBAcmV0dXJucyB7UmVhZGFibGVTdHJlYW19IFJlYWRhYmxlU3RyZWFtIHRvIHJlYWQgZGF0YSBpbiBjaHVua3MuXG4gICAqL1xuICBzZW5kV2l0aFN0cmVhbShhY3Rpb25OYW1lLCBkYXRhLCBxdWV1ZWluZ1N0cmF0ZWd5LCB0cmFuc2ZlcnMpIHtcbiAgICBjb25zdCBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKztcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgIGNvbnN0IHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWU7XG4gICAgY29uc3QgY29tT2JqID0gdGhpcy5jb21PYmo7XG5cbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgICAge1xuICAgICAgICBzdGFydDogY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSA9IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICBzdGFydENhbGw6IHN0YXJ0Q2FwYWJpbGl0eSxcbiAgICAgICAgICAgIHB1bGxDYWxsOiBudWxsLFxuICAgICAgICAgICAgY2FuY2VsQ2FsbDogbnVsbCxcbiAgICAgICAgICAgIGlzQ2xvc2VkOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX3Bvc3RNZXNzYWdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG4gICAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFuc2ZlcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFJldHVybiBQcm9taXNlIGZvciBBc3luYyBwcm9jZXNzLCB0byBzaWduYWwgc3VjY2Vzcy9mYWlsdXJlLlxuICAgICAgICAgIHJldHVybiBzdGFydENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBwdWxsOiBjb250cm9sbGVyID0+IHtcbiAgICAgICAgICBjb25zdCBwdWxsQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwgPSBwdWxsQ2FwYWJpbGl0eTtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTCxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gUmV0dXJuaW5nIFByb21pc2Ugd2lsbCBub3QgY2FsbCBcInB1bGxcIlxuICAgICAgICAgIC8vIGFnYWluIHVudGlsIGN1cnJlbnQgcHVsbCBpcyByZXNvbHZlZC5cbiAgICAgICAgICByZXR1cm4gcHVsbENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBjYW5jZWw6IHJlYXNvbiA9PiB7XG4gICAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCBcImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbCA9IGNhbmNlbENhcGFiaWxpdHk7XG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFJldHVybiBQcm9taXNlIHRvIHNpZ25hbCBzdWNjZXNzIG9yIGZhaWx1cmUuXG4gICAgICAgICAgcmV0dXJuIGNhbmNlbENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBxdWV1ZWluZ1N0cmF0ZWd5XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkO1xuICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7XG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTtcbiAgICBjb25zdCBjb21PYmogPSB0aGlzLmNvbU9iajtcblxuICAgIGNvbnN0IHN0cmVhbVNpbmsgPSB7XG4gICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3REZXNpcmVkU2l6ZSA9IHRoaXMuZGVzaXJlZFNpemU7XG4gICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gc2l6ZTtcbiAgICAgICAgLy8gRW5xdWV1ZSBkZWNyZWFzZXMgdGhlIGRlc2lyZWRTaXplIHByb3BlcnR5IG9mIHNpbmssXG4gICAgICAgIC8vIHNvIHdoZW4gaXQgY2hhbmdlcyBmcm9tIHBvc2l0aXZlIHRvIG5lZ2F0aXZlLFxuICAgICAgICAvLyBzZXQgcmVhZHkgYXMgdW5yZXNvbHZlZCBwcm9taXNlLlxuICAgICAgICBpZiAobGFzdERlc2lyZWRTaXplID4gMCAmJiB0aGlzLmRlc2lyZWRTaXplIDw9IDApIHtcbiAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuX3Bvc3RNZXNzYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVOUVVFVUUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJhbnNmZXJzXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DTE9TRSxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKHJlYXNvbikge1xuICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVSUk9SLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbmtDYXBhYmlsaXR5OiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpLFxuICAgICAgb25QdWxsOiBudWxsLFxuICAgICAgb25DYW5jZWw6IG51bGwsXG4gICAgICBpc0NhbmNlbGxlZDogZmFsc2UsXG4gICAgICBkZXNpcmVkU2l6ZTogZGF0YS5kZXNpcmVkU2l6ZSxcbiAgICAgIHJlYWR5OiBudWxsLFxuICAgIH07XG5cbiAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICBzdHJlYW1TaW5rLnJlYWR5ID0gc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdID0gc3RyZWFtU2luaztcbiAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhLCBzdHJlYW1TaW5rKSk7XG4gICAgfSkudGhlbihcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZDtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgIGNvbnN0IHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG4gICAgY29uc3QgY29tT2JqID0gdGhpcy5jb21PYmo7XG5cbiAgICBzd2l0Y2ggKGRhdGEuc3RyZWFtKSB7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5zdGFydENhbGwucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnN0YXJ0Q2FsbC5yZWplY3QoXG4gICAgICAgICAgICB3cmFwUmVhc29uKGRhdGEucmVhc29uKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbC5yZWplY3QoXG4gICAgICAgICAgICB3cmFwUmVhc29uKGRhdGEucmVhc29uKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTDpcbiAgICAgICAgLy8gSWdub3JlIGFueSBwdWxsIGFmdGVyIGNsb3NlIGlzIGNhbGxlZC5cbiAgICAgICAgaWYgKCF0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFB1bGwgaW5jcmVhc2VzIHRoZSBkZXNpcmVkU2l6ZSBwcm9wZXJ0eSBvZiBzaW5rLFxuICAgICAgICAvLyBzbyB3aGVuIGl0IGNoYW5nZXMgZnJvbSBuZWdhdGl2ZSB0byBwb3NpdGl2ZSxcbiAgICAgICAgLy8gc2V0IHJlYWR5IHByb3BlcnR5IGFzIHJlc29sdmVkIHByb21pc2UuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5kZXNpcmVkU2l6ZSA8PSAwICYmXG4gICAgICAgICAgZGF0YS5kZXNpcmVkU2l6ZSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IGRlc2lyZWRTaXplIHByb3BlcnR5IG9mIHNpbmsgb24gZXZlcnkgcHVsbC5cbiAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uZGVzaXJlZFNpemUgPSBkYXRhLmRlc2lyZWRTaXplO1xuICAgICAgICBjb25zdCB7IG9uUHVsbCB9ID0gdGhpcy5zdHJlYW1TaW5rc1tkYXRhLnN0cmVhbUlkXTtcbiAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKG9uUHVsbCAmJiBvblB1bGwoKSk7XG4gICAgICAgIH0pLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOlxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sXG4gICAgICAgICAgXCJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5lbnF1ZXVlKGRhdGEuY2h1bmspO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRTpcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLFxuICAgICAgICAgIFwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIlxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOlxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sXG4gICAgICAgICAgXCJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgd3JhcFJlYXNvbihkYXRhLnJlYXNvbilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwucmVqZWN0KFxuICAgICAgICAgICAgd3JhcFJlYXNvbihkYXRhLnJlYXNvbilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUw6XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG9uQ2FuY2VsIH0gPSB0aGlzLnN0cmVhbVNpbmtzW2RhdGEuc3RyZWFtSWRdO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUob25DYW5jZWwgJiYgb25DYW5jZWwod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpKTtcbiAgICAgICAgfSkudGhlbihcbiAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLFxuICAgICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSxcbiAgICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXS5zaW5rQ2FwYWJpbGl0eS5yZWplY3QoXG4gICAgICAgICAgd3JhcFJlYXNvbihkYXRhLnJlYXNvbilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBzdHJlYW0gY2FzZVwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIF9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKSB7XG4gICAgLy8gRGVsZXRlIHRoZSBgc3RyZWFtQ29udHJvbGxlcmAgb25seSB3aGVuIHRoZSBzdGFydCwgcHVsbCwgYW5kIGNhbmNlbFxuICAgIC8vIGNhcGFiaWxpdGllcyBoYXZlIHNldHRsZWQsIHRvIHByZXZlbnQgYFR5cGVFcnJvcmBzLlxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIFtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLFxuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCxcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbCxcbiAgICAgIF0ubWFwKGZ1bmN0aW9uIChjYXBhYmlsaXR5KSB7XG4gICAgICAgIHJldHVybiBjYXBhYmlsaXR5ICYmIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgcmF3IG1lc3NhZ2UgdG8gdGhlIGNvbU9iai5cbiAgICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2UgLSBSYXcgbWVzc2FnZS5cbiAgICogQHBhcmFtIHRyYW5zZmVycyBMaXN0IG9mIHRyYW5zZmVycy9BcnJheUJ1ZmZlcnMsIG9yIHVuZGVmaW5lZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2ZlcnMpIHtcbiAgICBpZiAodHJhbnNmZXJzICYmIHRoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMpIHtcbiAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCB7IE1lc3NhZ2VIYW5kbGVyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxOSBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW19ICovXG5jbGFzcyBQREZXb3JrZXJTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihtc2dIYW5kbGVyKSB7XG4gICAgdGhpcy5fbXNnSGFuZGxlciA9IG1zZ0hhbmRsZXI7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuXG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLFxuICAgICAgXCJQREZXb3JrZXJTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIlxuICAgICk7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmVhZGVyKHRoaXMuX21zZ0hhbmRsZXIpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuXG4gIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCwgdGhpcy5fbXNnSGFuZGxlcik7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfVxuXG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikge1xuICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlcnMgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApO1xuICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmVhZGVyKSB7XG4gICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmVhZGVyfSAqL1xuY2xhc3MgUERGV29ya2VyU3RyZWFtUmVhZGVyIHtcbiAgY29uc3RydWN0b3IobXNnSGFuZGxlcikge1xuICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gbnVsbDtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbShcIkdldFJlYWRlclwiKTtcbiAgICB0aGlzLl9yZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcblxuICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IHRoaXMuX21zZ0hhbmRsZXJcbiAgICAgIC5zZW5kV2l0aFByb21pc2UoXCJSZWFkZXJIZWFkZXJzUmVhZHlcIilcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGRhdGEuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gICAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBkYXRhLmlzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBkYXRhLmNvbnRlbnRMZW5ndGg7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTtcbiAgfVxuXG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuXG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG5cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgfVxuICAgIC8vIGB2YWx1ZWAgaXMgd3JhcHBlZCBpbnRvIFVpbnQ4QXJyYXksIHdlIG5lZWQgdG9cbiAgICAvLyB1bndyYXAgaXQgdG8gQXJyYXlCdWZmZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy5cbiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUuYnVmZmVyLCBkb25lOiBmYWxzZSB9O1xuICB9XG5cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgfVxufVxuXG4vKiogQGltcGxlbWVudHMge0lQREZTdHJlYW1SYW5nZVJlYWRlcn0gKi9cbmNsYXNzIFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCwgbXNnSGFuZGxlcikge1xuICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cbiAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRSYW5nZVJlYWRlclwiLCB7XG4gICAgICBiZWdpbixcbiAgICAgIGVuZCxcbiAgICB9KTtcbiAgICB0aGlzLl9yZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgfVxuXG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZWFkKCkge1xuICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLmJ1ZmZlciwgZG9uZTogZmFsc2UgfTtcbiAgfVxuXG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGV29ya2VyU3RyZWFtIH07XG4iXSwic291cmNlUm9vdCI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXM1L2J1aWxkL3BkZi53b3JrZXIubWluLmpzIGIvZXM1L2J1aWxkL3BkZi53b3JrZXIubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZGEwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9lczUvYnVpbGQvcGRmLndvcmtlci5taW4uanMKQEAgLTAsMCArMSwyMiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworIWZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHQscil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1yKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciIsW10scik6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHNbInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciJdPXIoKTp0WyJwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIiXT10LnBkZmpzV29ya2VyPXIoKX0odGhpcywoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9e307ZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhhKXtpZihyW2FdKXJldHVybiByW2FdLmV4cG9ydHM7dmFyIGk9clthXT17aTphLGw6ITEsZXhwb3J0czp7fX07dFthXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxfX3dfcGRmanNfcmVxdWlyZV9fKTtpLmw9ITA7cmV0dXJuIGkuZXhwb3J0c31fX3dfcGRmanNfcmVxdWlyZV9fLm09dDtfX3dfcGRmanNfcmVxdWlyZV9fLmM9cjtfX3dfcGRmanNfcmVxdWlyZV9fLmQ9ZnVuY3Rpb24odCxyLGEpe19fd19wZGZqc19yZXF1aXJlX18ubyh0LHIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHtlbnVtZXJhYmxlOiEwLGdldDphfSl9O19fd19wZGZqc19yZXF1aXJlX18ucj1mdW5jdGlvbih0KXsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfTtfX3dfcGRmanNfcmVxdWlyZV9fLnQ9ZnVuY3Rpb24odCxyKXsxJnImJih0PV9fd19wZGZqc19yZXF1aXJlX18odCkpO2lmKDgmcilyZXR1cm4gdDtpZig0JnImJiJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBhPU9iamVjdC5jcmVhdGUobnVsbCk7X193X3BkZmpzX3JlcXVpcmVfXy5yKGEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSk7aWYoMiZyJiYic3RyaW5nIiE9dHlwZW9mIHQpZm9yKHZhciBpIGluIHQpX193X3BkZmpzX3JlcXVpcmVfXy5kKGEsaSxmdW5jdGlvbihyKXtyZXR1cm4gdFtyXX0uYmluZChudWxsLGkpKTtyZXR1cm4gYX07X193X3BkZmpzX3JlcXVpcmVfXy5uPWZ1bmN0aW9uKHQpe3ZhciByPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbiBnZXREZWZhdWx0KCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpe3JldHVybiB0fTtfX3dfcGRmanNfcmVxdWlyZV9fLmQociwiYSIscik7cmV0dXJuIHJ9O19fd19wZGZqc19yZXF1aXJlX18ubz1mdW5jdGlvbih0LHIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKX07X193X3BkZmpzX3JlcXVpcmVfXy5wPSIiO3JldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucz0wKX0oW2Z1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJXb3JrZXJNZXNzYWdlSGFuZGxlciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBpLldvcmtlck1lc3NhZ2VIYW5kbGVyfX0pO3ZhciBpPWEoMSl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuV29ya2VyTWVzc2FnZUhhbmRsZXI9ci5Xb3JrZXJUYXNrPXZvaWQgMDt2YXIgaT1mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oYSgyKSksbz1hKDUpLGM9YSgyMDIpLGw9YSgyMDMpLHU9YSgyMjQpLGg9YSg3KSxkPWEoMjQzKSxwPWEoMjQ0KSxtPWEoMjA1KTtmdW5jdGlvbiBfdG9BcnJheSh0KXtyZXR1cm4gX2FycmF5V2l0aEhvbGVzKHQpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQpfHxfbm9uSXRlcmFibGVSZXN0KCl9ZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkodCxyKXtyZXR1cm4gX2FycmF5V2l0aEhvbGVzKHQpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQodCxyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIGE9W10saT0hMCxvPSExLGM9dm9pZCAwO3RyeXtmb3IodmFyIGwsdT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KGw9dS5uZXh0KCkpLmRvbmUpO2k9ITApe2EucHVzaChsLnZhbHVlKTtpZihyJiZhLmxlbmd0aD09PXIpYnJlYWt9fWNhdGNoKHQpe289ITA7Yz10fWZpbmFsbHl7dHJ5e2l8fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYobyl0aHJvdyBjfX1yZXR1cm4gYX0odCxyKXx8X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil8fF9ub25JdGVyYWJsZVJlc3QoKX1mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX1mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscik7dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpOyJPYmplY3QiPT09YSYmdC5jb25zdHJ1Y3RvciYmKGE9dC5jb25zdHJ1Y3Rvci5uYW1lKTtyZXR1cm4iTWFwIj09PWF8fCJTZXQiPT09YT9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSk/X2FycmF5TGlrZVRvQXJyYXkodCxyKTp2b2lkIDB9fWZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHQscil7KG51bGw9PXJ8fHI+dC5sZW5ndGgpJiYocj10Lmxlbmd0aCk7Zm9yKHZhciBhPTAsaT1uZXcgQXJyYXkocik7YTxyO2ErKylpW2FdPXRbYV07cmV0dXJuIGl9ZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9ZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKHQscixhLGksbyxjLGwpe3RyeXt2YXIgdT10W2NdKGwpLGg9dS52YWx1ZX1jYXRjaCh0KXthKHQpO3JldHVybn11LmRvbmU/cihoKTpQcm9taXNlLnJlc29sdmUoaCkudGhlbihpLG8pfWZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsYT1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLG8pe3ZhciBjPXQuYXBwbHkocixhKTtmdW5jdGlvbiBfbmV4dCh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJuZXh0Iix0KX1mdW5jdGlvbiBfdGhyb3codCl7YXN5bmNHZW5lcmF0b3JTdGVwKGMsaSxvLF9uZXh0LF90aHJvdywidGhyb3ciLHQpfV9uZXh0KHZvaWQgMCl9KSl9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBpPXJbYV07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITE7aS5jb25maWd1cmFibGU9ITA7InZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fXZhciBnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gV29ya2VyVGFzayh0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxXb3JrZXJUYXNrKTt0aGlzLm5hbWU9dDt0aGlzLnRlcm1pbmF0ZWQ9ITE7dGhpcy5fY2FwYWJpbGl0eT0oMCxvLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpfV9jcmVhdGVDbGFzcyhXb3JrZXJUYXNrLFt7a2V5OiJmaW5pc2giLHZhbHVlOmZ1bmN0aW9uIGZpbmlzaCgpe3RoaXMuX2NhcGFiaWxpdHkucmVzb2x2ZSgpfX0se2tleToidGVybWluYXRlIix2YWx1ZTpmdW5jdGlvbiB0ZXJtaW5hdGUoKXt0aGlzLnRlcm1pbmF0ZWQ9ITB9fSx7a2V5OiJlbnN1cmVOb3RUZXJtaW5hdGVkIix2YWx1ZTpmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCl7aWYodGhpcy50ZXJtaW5hdGVkKXRocm93IG5ldyBFcnJvcigiV29ya2VyIHRhc2sgd2FzIHRlcm1pbmF0ZWQiKX19LHtrZXk6ImZpbmlzaGVkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZX19XSk7cmV0dXJuIFdvcmtlclRhc2t9KCk7ci5Xb3JrZXJUYXNrPWc7dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBXb3JrZXJNZXNzYWdlSGFuZGxlcigpe19jbGFzc0NhbGxDaGVjayh0aGlzLFdvcmtlck1lc3NhZ2VIYW5kbGVyKX1fY3JlYXRlQ2xhc3MoV29ya2VyTWVzc2FnZUhhbmRsZXIsbnVsbCxbe2tleToic2V0dXAiLHZhbHVlOmZ1bmN0aW9uIHNldHVwKHQscil7dmFyIGE9ITE7dC5vbigidGVzdCIsKGZ1bmN0aW9uIHdwaFNldHVwVGVzdChyKXtpZighYSl7YT0hMDtpZihyIGluc3RhbmNlb2YgVWludDhBcnJheSl7dmFyIGk9MjU1PT09clswXTt0LnBvc3RNZXNzYWdlVHJhbnNmZXJzPWk7dC5zZW5kKCJ0ZXN0Iix7c3VwcG9ydFRyYW5zZmVyczppfSl9ZWxzZSB0LnNlbmQoInRlc3QiLG51bGwpfX0pKTt0Lm9uKCJjb25maWd1cmUiLChmdW5jdGlvbiB3cGhDb25maWd1cmUodCl7KDAsby5zZXRWZXJib3NpdHlMZXZlbCkodC52ZXJib3NpdHkpfSkpO3Qub24oIkdldERvY1JlcXVlc3QiLChmdW5jdGlvbiB3cGhTZXR1cERvYyh0KXtyZXR1cm4gV29ya2VyTWVzc2FnZUhhbmRsZXIuY3JlYXRlRG9jdW1lbnRIYW5kbGVyKHQscil9KSl9fSx7a2V5OiJjcmVhdGVEb2N1bWVudEhhbmRsZXIiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50SGFuZGxlcih0LHIpe3ZhciBhLGg9ITEseT1udWxsLGI9W10sdj0oMCxvLmdldFZlcmJvc2l0eUxldmVsKSgpLFM9dC5hcGlWZXJzaW9uO2lmKCIyLjYuMzQ3IiE9PVMpdGhyb3cgbmV3IEVycm9yKCdUaGUgQVBJIHZlcnNpb24gIicuY29uY2F0KFMsJyIgZG9lcyBub3QgbWF0Y2ggJykrJ3RoZSBXb3JrZXIgdmVyc2lvbiAiJy5jb25jYXQoIjIuNi4zNDciLCciLicpKTt2YXIgaz1bXTtmb3IodmFyIHcgaW5bXSlrLnB1c2godyk7aWYoay5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgYEFycmF5LnByb3RvdHlwZWAgY29udGFpbnMgdW5leHBlY3RlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXM6ICIray5qb2luKCIsICIpKyI7IHRodXMgYnJlYWtpbmcgZS5nLiBgZm9yLi4uaW5gIGl0ZXJhdGlvbiBvZiBgQXJyYXlgcy4iKTt2YXIgQz10LmRvY0lkLF89dC5kb2NCYXNlVXJsLHg9dC5kb2NJZCsiX3dvcmtlciIsQT1uZXcgZC5NZXNzYWdlSGFuZGxlcih4LEMscik7QS5wb3N0TWVzc2FnZVRyYW5zZmVycz10LnBvc3RNZXNzYWdlVHJhbnNmZXJzO2Z1bmN0aW9uIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKXtpZihoKXRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIil9ZnVuY3Rpb24gc3RhcnRXb3JrZXJUYXNrKHQpe2IucHVzaCh0KX1mdW5jdGlvbiBmaW5pc2hXb3JrZXJUYXNrKHQpe3QuZmluaXNoKCk7dmFyIHI9Yi5pbmRleE9mKHQpO2Iuc3BsaWNlKHIsMSl9ZnVuY3Rpb24gbG9hZERvY3VtZW50KHQpe3JldHVybiBfbG9hZERvY3VtZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBfbG9hZERvY3VtZW50KCl7cmV0dXJuKF9sb2FkRG9jdW1lbnQ9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUodCl7dmFyIHIsbyxjLGw7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlJChpKXtmb3IoOzspc3dpdGNoKGkucHJldj1pLm5leHQpe2Nhc2UgMDppLm5leHQ9MjtyZXR1cm4gYS5lbnN1cmVEb2MoImNoZWNrSGVhZGVyIik7Y2FzZSAyOmkubmV4dD00O3JldHVybiBhLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKTtjYXNlIDQ6aS5uZXh0PTY7cmV0dXJuIGEuZW5zdXJlRG9jKCJwYXJzZSIsW3RdKTtjYXNlIDY6aWYodCl7aS5uZXh0PTk7YnJlYWt9aS5uZXh0PTk7cmV0dXJuIGEuZW5zdXJlRG9jKCJjaGVja0ZpcnN0UGFnZSIpO2Nhc2UgOTppLm5leHQ9MTE7cmV0dXJuIFByb21pc2UuYWxsKFthLmVuc3VyZURvYygibnVtUGFnZXMiKSxhLmVuc3VyZURvYygiZmluZ2VycHJpbnQiKV0pO2Nhc2UgMTE6cj1pLnNlbnQ7bz1fc2xpY2VkVG9BcnJheShyLDIpO2M9b1swXTtsPW9bMV07cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHtudW1QYWdlczpjLGZpbmdlcnByaW50Omx9KTtjYXNlIDE2OmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZSl9KSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZ2V0UGRmTWFuYWdlcih0LHIpe3ZhciBhLGk9KDAsby5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSxjPXQuc291cmNlO2lmKGMuZGF0YSl7dHJ5e2E9bmV3IGwuTG9jYWxQZGZNYW5hZ2VyKEMsYy5kYXRhLGMucGFzc3dvcmQscixfKTtpLnJlc29sdmUoYSl9Y2F0Y2godCl7aS5yZWplY3QodCl9cmV0dXJuIGkucHJvbWlzZX12YXIgdSxoPVtdO3RyeXt1PW5ldyBwLlBERldvcmtlclN0cmVhbShBKX1jYXRjaCh0KXtpLnJlamVjdCh0KTtyZXR1cm4gaS5wcm9taXNlfXZhciBkPXUuZ2V0RnVsbFJlYWRlcigpO2QuaGVhZGVyc1JlYWR5LnRoZW4oKGZ1bmN0aW9uKCl7aWYoZC5pc1JhbmdlU3VwcG9ydGVkKXt2YXIgdD1jLmRpc2FibGVBdXRvRmV0Y2h8fGQuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7YT1uZXcgbC5OZXR3b3JrUGRmTWFuYWdlcihDLHUse21zZ0hhbmRsZXI6QSxwYXNzd29yZDpjLnBhc3N3b3JkLGxlbmd0aDpkLmNvbnRlbnRMZW5ndGgsZGlzYWJsZUF1dG9GZXRjaDp0LHJhbmdlQ2h1bmtTaXplOmMucmFuZ2VDaHVua1NpemV9LHIsXyk7Zm9yKHZhciBvPTA7bzxoLmxlbmd0aDtvKyspYS5zZW5kUHJvZ3Jlc3NpdmVEYXRhKGhbb10pO2g9W107aS5yZXNvbHZlKGEpO3k9bnVsbH19KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2kucmVqZWN0KHQpO3k9bnVsbH0pKTt2YXIgbT0wO25ldyBQcm9taXNlKChmdW5jdGlvbih0LHUpe2QucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIHJlYWRDaHVuayh0KXt2YXIgcD10LnZhbHVlLGc9dC5kb25lO3RyeXtlbnN1cmVOb3RUZXJtaW5hdGVkKCk7aWYoZyl7YXx8ZnVuY3Rpb24gZmx1c2hDaHVua3MoKXt2YXIgdD0oMCxvLmFycmF5c1RvQnl0ZXMpKGgpO2MubGVuZ3RoJiZ0Lmxlbmd0aCE9PWMubGVuZ3RoJiYoMCxvLndhcm4pKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTt0cnl7YT1uZXcgbC5Mb2NhbFBkZk1hbmFnZXIoQyx0LGMucGFzc3dvcmQscixfKTtpLnJlc29sdmUoYSl9Y2F0Y2godCl7aS5yZWplY3QodCl9aD1bXX0oKTt5PW51bGw7cmV0dXJufW0rPSgwLG8uYXJyYXlCeXRlTGVuZ3RoKShwKTtkLmlzU3RyZWFtaW5nU3VwcG9ydGVkfHxBLnNlbmQoIkRvY1Byb2dyZXNzIix7bG9hZGVkOm0sdG90YWw6TWF0aC5tYXgobSxkLmNvbnRlbnRMZW5ndGh8fDApfSk7YT9hLnNlbmRQcm9ncmVzc2l2ZURhdGEocCk6aC5wdXNoKHApO2QucmVhZCgpLnRoZW4ocmVhZENodW5rLHUpfWNhdGNoKHQpe3UodCl9fSksdSl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2kucmVqZWN0KHQpO3k9bnVsbH0pKTt5PWZ1bmN0aW9uIGNhbmNlbFhIUnModCl7dS5jYW5jZWxBbGxSZXF1ZXN0cyh0KX07cmV0dXJuIGkucHJvbWlzZX1BLm9uKCJHZXRQYWdlIiwoZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlKHQpe3JldHVybiBhLmdldFBhZ2UodC5wYWdlSW5kZXgpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLmFsbChbYS5lbnN1cmUodCwicm90YXRlIiksYS5lbnN1cmUodCwicmVmIiksYS5lbnN1cmUodCwidXNlclVuaXQiKSxhLmVuc3VyZSh0LCJ2aWV3IildKS50aGVuKChmdW5jdGlvbih0KXt2YXIgcj1fc2xpY2VkVG9BcnJheSh0LDQpO3JldHVybntyb3RhdGU6clswXSxyZWY6clsxXSx1c2VyVW5pdDpyWzJdLHZpZXc6clszXX19KSl9KSl9KSk7QS5vbigiR2V0UGFnZUluZGV4IiwoZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlSW5kZXgodCl7dmFyIHI9dC5yZWYsaT1jLlJlZi5nZXQoci5udW0sci5nZW4pO3JldHVybiBhLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsW2ldKX0pKTtBLm9uKCJHZXREZXN0aW5hdGlvbnMiLChmdW5jdGlvbiB3cGhTZXR1cEdldERlc3RpbmF0aW9ucyh0KXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJkZXN0aW5hdGlvbnMiKX0pKTtBLm9uKCJHZXREZXN0aW5hdGlvbiIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0RGVzdGluYXRpb24odCl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygiZ2V0RGVzdGluYXRpb24iLFt0LmlkXSl9KSk7QS5vbigiR2V0UGFnZUxhYmVscyIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUxhYmVscyh0KXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJwYWdlTGFiZWxzIil9KSk7QS5vbigiR2V0UGFnZUxheW91dCIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZUxheW91dCh0KXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJwYWdlTGF5b3V0Iil9KSk7QS5vbigiR2V0UGFnZU1vZGUiLChmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2VNb2RlKHQpe3JldHVybiBhLmVuc3VyZUNhdGFsb2coInBhZ2VNb2RlIil9KSk7QS5vbigiR2V0Vmlld2VyUHJlZmVyZW5jZXMiLChmdW5jdGlvbih0KXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJ2aWV3ZXJQcmVmZXJlbmNlcyIpfSkpO0Eub24oIkdldE9wZW5BY3Rpb24iLChmdW5jdGlvbih0KXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJvcGVuQWN0aW9uIil9KSk7QS5vbigiR2V0QXR0YWNobWVudHMiLChmdW5jdGlvbiB3cGhTZXR1cEdldEF0dGFjaG1lbnRzKHQpe3JldHVybiBhLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIil9KSk7QS5vbigiR2V0SmF2YVNjcmlwdCIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0SmF2YVNjcmlwdCh0KXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJqYXZhU2NyaXB0Iil9KSk7QS5vbigiR2V0T3V0bGluZSIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0T3V0bGluZSh0KXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJkb2N1bWVudE91dGxpbmUiKX0pKTtBLm9uKCJHZXRPcHRpb25hbENvbnRlbnRDb25maWciLChmdW5jdGlvbih0KXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJvcHRpb25hbENvbnRlbnRDb25maWciKX0pKTtBLm9uKCJHZXRQZXJtaXNzaW9ucyIsKGZ1bmN0aW9uKHQpe3JldHVybiBhLmVuc3VyZUNhdGFsb2coInBlcm1pc3Npb25zIil9KSk7QS5vbigiR2V0TWV0YWRhdGEiLChmdW5jdGlvbiB3cGhTZXR1cEdldE1ldGFkYXRhKHQpe3JldHVybiBQcm9taXNlLmFsbChbYS5lbnN1cmVEb2MoImRvY3VtZW50SW5mbyIpLGEuZW5zdXJlQ2F0YWxvZygibWV0YWRhdGEiKV0pfSkpO0Eub24oIkdldERhdGEiLChmdW5jdGlvbiB3cGhTZXR1cEdldERhdGEodCl7YS5yZXF1ZXN0TG9hZGVkU3RyZWFtKCk7cmV0dXJuIGEub25Mb2FkZWRTdHJlYW0oKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC5ieXRlc30pKX0pKTtBLm9uKCJHZXRTdGF0cyIsKGZ1bmN0aW9uIHdwaFNldHVwR2V0U3RhdHModCl7cmV0dXJuIGEuZW5zdXJlWFJlZigic3RhdHMiKX0pKTtBLm9uKCJHZXRBbm5vdGF0aW9ucyIsKGZ1bmN0aW9uKHQpe3ZhciByPXQucGFnZUluZGV4LGk9dC5pbnRlbnQ7cmV0dXJuIGEuZ2V0UGFnZShyKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRBbm5vdGF0aW9uc0RhdGEoaSl9KSl9KSk7QS5vbigiU2F2ZURvY3VtZW50IiwoZnVuY3Rpb24odCl7dmFyIHI9dC5udW1QYWdlcyxpPXQuYW5ub3RhdGlvblN0b3JhZ2UsYz10LmZpbGVuYW1lO2EucmVxdWVzdExvYWRlZFN0cmVhbSgpO2Zvcih2YXIgbD1bYS5vbkxvYWRlZFN0cmVhbSgpXSxoPWEucGRmRG9jdW1lbnQsZD1mdW5jdGlvbiBfbG9vcCh0KXtsLnB1c2goYS5nZXRQYWdlKHQpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBhPW5ldyBnKCJTYXZlOiBwYWdlICIuY29uY2F0KHQpKTtyZXR1cm4gci5zYXZlKEEsYSxpKX0pKSl9LHA9MDtwPHI7cCsrKWQocCk7cmV0dXJuIFByb21pc2UuYWxsKGwpLnRoZW4oKGZ1bmN0aW9uKHQpe3ZhciByLGE9X3RvQXJyYXkodCksaT1hWzBdLGw9W10sZD1mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0LHIpe3ZhciBhO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgU3ltYm9sfHxudWxsPT10W1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkodCl8fChhPV91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSh0KSl8fHImJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe2EmJih0PWEpO3ZhciBpPTAsbz1mdW5jdGlvbiBGKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24gbigpe3JldHVybiBpPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtpKytdfX0sZTpmdW5jdGlvbiBlKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBjLGw9ITAsdT0hMTtyZXR1cm57czpmdW5jdGlvbiBzKCl7YT10W1N5bWJvbC5pdGVyYXRvcl0oKX0sbjpmdW5jdGlvbiBuKCl7dmFyIHQ9YS5uZXh0KCk7bD10LmRvbmU7cmV0dXJuIHR9LGU6ZnVuY3Rpb24gZSh0KXt1PSEwO2M9dH0sZjpmdW5jdGlvbiBmKCl7dHJ5e2x8fG51bGw9PWEucmV0dXJufHxhLnJldHVybigpfWZpbmFsbHl7aWYodSl0aHJvdyBjfX19fShhLnNsaWNlKDEpKTt0cnl7Zm9yKGQucygpOyEocj1kLm4oKSkuZG9uZTspe2w9ci52YWx1ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dH0pKS5yZWR1Y2UoKGZ1bmN0aW9uKHQscil7cmV0dXJuIHQuY29uY2F0KHIpfSksbCl9fWNhdGNoKHQpe2QuZSh0KX1maW5hbGx5e2QuZigpfWlmKDA9PT1sLmxlbmd0aClyZXR1cm4gaS5ieXRlczt2YXIgcD1oLnhyZWYsbT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHAudHJhaWxlcil7dmFyIGc9T2JqZWN0LmNyZWF0ZShudWxsKSx5PXAudHJhaWxlci5nZXQoIkluZm8iKXx8bnVsbDt5JiZ5LmZvckVhY2goKGZ1bmN0aW9uKHQscil7KDAsby5pc1N0cmluZykodCkmJigwLG8uaXNTdHJpbmcpKHIpJiYoZ1t0XT0oMCxvLnN0cmluZ1RvUERGU3RyaW5nKShyKSl9KSk7bT17cm9vdFJlZjpwLnRyYWlsZXIuZ2V0UmF3KCJSb290Iil8fG51bGwsZW5jcnlwdDpwLnRyYWlsZXIuZ2V0UmF3KCJFbmNyeXB0Iil8fG51bGwsbmV3UmVmOnAuZ2V0TmV3UmVmKCksaW5mb1JlZjpwLnRyYWlsZXIuZ2V0UmF3KCJJbmZvIil8fG51bGwsaW5mbzpnLGZpbGVJZHM6cC50cmFpbGVyLmdldFJhdygiSUQiKXx8bnVsbCxzdGFydFhSZWY6aC5zdGFydFhSZWYsZmlsZW5hbWU6Y319cC5yZXNldE5ld1JlZigpO3JldHVybigwLHUuaW5jcmVtZW50YWxVcGRhdGUpKGkuYnl0ZXMsbSxsKX0pKX0pKTtBLm9uKCJHZXRPcGVyYXRvckxpc3QiLChmdW5jdGlvbiB3cGhTZXR1cFJlbmRlclBhZ2UodCxyKXt2YXIgaT10LnBhZ2VJbmRleDthLmdldFBhZ2UoaSkudGhlbigoZnVuY3Rpb24oYSl7dmFyIGM9bmV3IGcoIkdldE9wZXJhdG9yTGlzdDogcGFnZSAiLmNvbmNhdChpKSk7c3RhcnRXb3JrZXJUYXNrKGMpO3ZhciBsPXY+PW8uVmVyYm9zaXR5TGV2ZWwuSU5GT1M/RGF0ZS5ub3coKTowO2EuZ2V0T3BlcmF0b3JMaXN0KHtoYW5kbGVyOkEsc2luazpyLHRhc2s6YyxpbnRlbnQ6dC5pbnRlbnQscmVuZGVySW50ZXJhY3RpdmVGb3Jtczp0LnJlbmRlckludGVyYWN0aXZlRm9ybXMsYW5ub3RhdGlvblN0b3JhZ2U6dC5hbm5vdGF0aW9uU3RvcmFnZX0pLnRoZW4oKGZ1bmN0aW9uKHQpe2ZpbmlzaFdvcmtlclRhc2soYyk7bCYmKDAsby5pbmZvKSgicGFnZT0iLmNvbmNhdChpKzEsIiAtIGdldE9wZXJhdG9yTGlzdDogdGltZT0iKSsiIi5jb25jYXQoRGF0ZS5ub3coKS1sLCJtcywgbGVuPSIpLmNvbmNhdCh0Lmxlbmd0aCkpO3IuY2xvc2UoKX0pLChmdW5jdGlvbih0KXtmaW5pc2hXb3JrZXJUYXNrKGMpO2lmKCFjLnRlcm1pbmF0ZWQpe0Euc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOm8uVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JPcGVyYXRvckxpc3R9KTtyLmVycm9yKHQpfX0pKX0pKX0pLHRoaXMpO0Eub24oIkdldFRleHRDb250ZW50IiwoZnVuY3Rpb24gd3BoRXh0cmFjdFRleHQodCxyKXt2YXIgaT10LnBhZ2VJbmRleDtyLm9uUHVsbD1mdW5jdGlvbih0KXt9O3Iub25DYW5jZWw9ZnVuY3Rpb24odCl7fTthLmdldFBhZ2UoaSkudGhlbigoZnVuY3Rpb24oYSl7dmFyIGM9bmV3IGcoIkdldFRleHRDb250ZW50OiBwYWdlICIraSk7c3RhcnRXb3JrZXJUYXNrKGMpO3ZhciBsPXY+PW8uVmVyYm9zaXR5TGV2ZWwuSU5GT1M/RGF0ZS5ub3coKTowO2EuZXh0cmFjdFRleHRDb250ZW50KHtoYW5kbGVyOkEsdGFzazpjLHNpbms6cixub3JtYWxpemVXaGl0ZXNwYWNlOnQubm9ybWFsaXplV2hpdGVzcGFjZSxjb21iaW5lVGV4dEl0ZW1zOnQuY29tYmluZVRleHRJdGVtc30pLnRoZW4oKGZ1bmN0aW9uKCl7ZmluaXNoV29ya2VyVGFzayhjKTtsJiYoMCxvLmluZm8pKCJwYWdlPSIuY29uY2F0KGkrMSwiIC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9IikrIiIuY29uY2F0KERhdGUubm93KCktbCwibXMiKSk7ci5jbG9zZSgpfSksKGZ1bmN0aW9uKHQpe2ZpbmlzaFdvcmtlclRhc2soYyk7Yy50ZXJtaW5hdGVkfHxyLmVycm9yKHQpfSkpfSkpfSkpO0Eub24oIkZvbnRGYWxsYmFjayIsKGZ1bmN0aW9uKHQpe3JldHVybiBhLmZvbnRGYWxsYmFjayh0LmlkLEEpfSkpO0Eub24oIkNsZWFudXAiLChmdW5jdGlvbiB3cGhDbGVhbnVwKHQpe3JldHVybiBhLmNsZWFudXAoITApfSkpO0Eub24oIlRlcm1pbmF0ZSIsKGZ1bmN0aW9uIHdwaFRlcm1pbmF0ZSh0KXtoPSEwO3ZhciByPVtdO2lmKGEpe2EudGVybWluYXRlKG5ldyBvLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpO3ZhciBpPWEuY2xlYW51cCgpO3IucHVzaChpKTthPW51bGx9ZWxzZSgwLGMuY2xlYXJQcmltaXRpdmVDYWNoZXMpKCk7eSYmeShuZXcgby5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTtiLmZvckVhY2goKGZ1bmN0aW9uKHQpe3IucHVzaCh0LmZpbmlzaGVkKTt0LnRlcm1pbmF0ZSgpfSkpO3JldHVybiBQcm9taXNlLmFsbChyKS50aGVuKChmdW5jdGlvbigpe0EuZGVzdHJveSgpO0E9bnVsbH0pKX0pKTtBLm9uKCJSZWFkeSIsKGZ1bmN0aW9uIHdwaFJlYWR5KHIpeyFmdW5jdGlvbiBzZXR1cERvYyh0KXtmdW5jdGlvbiBvblN1Y2Nlc3ModCl7ZW5zdXJlTm90VGVybWluYXRlZCgpO0Euc2VuZCgiR2V0RG9jIix7cGRmSW5mbzp0fSl9ZnVuY3Rpb24gb25GYWlsdXJlKHQpe2Vuc3VyZU5vdFRlcm1pbmF0ZWQoKTtpZih0IGluc3RhbmNlb2Ygby5QYXNzd29yZEV4Y2VwdGlvbil7dmFyIHI9bmV3IGcoIlBhc3N3b3JkRXhjZXB0aW9uOiByZXNwb25zZSAiLmNvbmNhdCh0LmNvZGUpKTtzdGFydFdvcmtlclRhc2socik7QS5zZW5kV2l0aFByb21pc2UoIlBhc3N3b3JkUmVxdWVzdCIsdCkudGhlbigoZnVuY3Rpb24odCl7dmFyIGk9dC5wYXNzd29yZDtmaW5pc2hXb3JrZXJUYXNrKHIpO2EudXBkYXRlUGFzc3dvcmQoaSk7cGRmTWFuYWdlclJlYWR5KCl9KSkuY2F0Y2goKGZ1bmN0aW9uKCl7ZmluaXNoV29ya2VyVGFzayhyKTtBLnNlbmQoIkRvY0V4Y2VwdGlvbiIsdCl9KSl9ZWxzZSB0IGluc3RhbmNlb2Ygby5JbnZhbGlkUERGRXhjZXB0aW9ufHx0IGluc3RhbmNlb2Ygby5NaXNzaW5nUERGRXhjZXB0aW9ufHx0IGluc3RhbmNlb2Ygby5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb258fHQgaW5zdGFuY2VvZiBvLlVua25vd25FcnJvckV4Y2VwdGlvbj9BLnNlbmQoIkRvY0V4Y2VwdGlvbiIsdCk6QS5zZW5kKCJEb2NFeGNlcHRpb24iLG5ldyBvLlVua25vd25FcnJvckV4Y2VwdGlvbih0Lm1lc3NhZ2UsdC50b1N0cmluZygpKSl9ZnVuY3Rpb24gcGRmTWFuYWdlclJlYWR5KCl7ZW5zdXJlTm90VGVybWluYXRlZCgpO2xvYWREb2N1bWVudCghMSkudGhlbihvblN1Y2Nlc3MsKGZ1bmN0aW9uKHQpe2Vuc3VyZU5vdFRlcm1pbmF0ZWQoKTtpZih0IGluc3RhbmNlb2YgbS5YUmVmUGFyc2VFeGNlcHRpb24pe2EucmVxdWVzdExvYWRlZFN0cmVhbSgpO2Eub25Mb2FkZWRTdHJlYW0oKS50aGVuKChmdW5jdGlvbigpe2Vuc3VyZU5vdFRlcm1pbmF0ZWQoKTtsb2FkRG9jdW1lbnQoITApLnRoZW4ob25TdWNjZXNzLG9uRmFpbHVyZSl9KSl9ZWxzZSBvbkZhaWx1cmUodCl9KSl9ZW5zdXJlTm90VGVybWluYXRlZCgpO2dldFBkZk1hbmFnZXIodCx7bWF4SW1hZ2VTaXplOnQubWF4SW1hZ2VTaXplLGRpc2FibGVGb250RmFjZTp0LmRpc2FibGVGb250RmFjZSxpZ25vcmVFcnJvcnM6dC5pZ25vcmVFcnJvcnMsaXNFdmFsU3VwcG9ydGVkOnQuaXNFdmFsU3VwcG9ydGVkLGZvbnRFeHRyYVByb3BlcnRpZXM6dC5mb250RXh0cmFQcm9wZXJ0aWVzfSkudGhlbigoZnVuY3Rpb24odCl7aWYoaCl7dC50ZXJtaW5hdGUobmV3IG8uQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7dGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQiKX0oYT10KS5vbkxvYWRlZFN0cmVhbSgpLnRoZW4oKGZ1bmN0aW9uKHQpe0Euc2VuZCgiRGF0YUxvYWRlZCIse2xlbmd0aDp0LmJ5dGVzLmJ5dGVMZW5ndGh9KX0pKX0pKS50aGVuKHBkZk1hbmFnZXJSZWFkeSxvbkZhaWx1cmUpfSh0KTt0PW51bGx9KSk7cmV0dXJuIHh9fSx7a2V5OiJpbml0aWFsaXplRnJvbVBvcnQiLHZhbHVlOmZ1bmN0aW9uIGluaXRpYWxpemVGcm9tUG9ydCh0KXt2YXIgcj1uZXcgZC5NZXNzYWdlSGFuZGxlcigid29ya2VyIiwibWFpbiIsdCk7V29ya2VyTWVzc2FnZUhhbmRsZXIuc2V0dXAocix0KTtyLnNlbmQoInJlYWR5IixudWxsKX19XSk7cmV0dXJuIFdvcmtlck1lc3NhZ2VIYW5kbGVyfSgpO3IuV29ya2VyTWVzc2FnZUhhbmRsZXI9eTsidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdyYmIWguaXNOb2RlSlMmJiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmZnVuY3Rpb24gaXNNZXNzYWdlUG9ydCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5wb3N0TWVzc2FnZSYmIm9ubWVzc2FnZSJpbiB0fShzZWxmKSYmeS5pbml0aWFsaXplRnJvbVBvcnQoc2VsZil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWEoMyl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9dmFyIHI9ZnVuY3Rpb24odCl7dmFyIHI9T2JqZWN0LnByb3RvdHlwZSxhPXIuaGFzT3duUHJvcGVydHksaT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxvPWkuaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixjPWkuYXN5bmNJdGVyYXRvcnx8IkBAYXN5bmNJdGVyYXRvciIsbD1pLnRvU3RyaW5nVGFnfHwiQEB0b1N0cmluZ1RhZyI7ZnVuY3Rpb24gZGVmaW5lKHQscixhKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHt2YWx1ZTphLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk7cmV0dXJuIHRbcl19dHJ5e2RlZmluZSh7fSwiIil9Y2F0Y2godCl7ZGVmaW5lPWZ1bmN0aW9uIGRlZmluZSh0LHIsYSl7cmV0dXJuIHRbcl09YX19ZnVuY3Rpb24gd3JhcCh0LHIsYSxpKXt2YXIgbz1yJiZyLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvcj9yOkdlbmVyYXRvcixjPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGw9bmV3IENvbnRleHQoaXx8W10pO2MuX2ludm9rZT1mdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKHQscixhKXt2YXIgaT0ic3VzcGVuZGVkU3RhcnQiO3JldHVybiBmdW5jdGlvbiBpbnZva2UobyxjKXtpZigiZXhlY3V0aW5nIj09PWkpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoImNvbXBsZXRlZCI9PT1pKXtpZigidGhyb3ciPT09byl0aHJvdyBjO3JldHVybiBkb25lUmVzdWx0KCl9YS5tZXRob2Q9bzthLmFyZz1jO2Zvcig7Oyl7dmFyIGw9YS5kZWxlZ2F0ZTtpZihsKXt2YXIgaD1tYXliZUludm9rZURlbGVnYXRlKGwsYSk7aWYoaCl7aWYoaD09PXUpY29udGludWU7cmV0dXJuIGh9fWlmKCJuZXh0Ij09PWEubWV0aG9kKWEuc2VudD1hLl9zZW50PWEuYXJnO2Vsc2UgaWYoInRocm93Ij09PWEubWV0aG9kKXtpZigic3VzcGVuZGVkU3RhcnQiPT09aSl7aT0iY29tcGxldGVkIjt0aHJvdyBhLmFyZ31hLmRpc3BhdGNoRXhjZXB0aW9uKGEuYXJnKX1lbHNlInJldHVybiI9PT1hLm1ldGhvZCYmYS5hYnJ1cHQoInJldHVybiIsYS5hcmcpO2k9ImV4ZWN1dGluZyI7dmFyIGQ9dHJ5Q2F0Y2godCxyLGEpO2lmKCJub3JtYWwiPT09ZC50eXBlKXtpPWEuZG9uZT8iY29tcGxldGVkIjoic3VzcGVuZGVkWWllbGQiO2lmKGQuYXJnPT09dSljb250aW51ZTtyZXR1cm57dmFsdWU6ZC5hcmcsZG9uZTphLmRvbmV9fWlmKCJ0aHJvdyI9PT1kLnR5cGUpe2k9ImNvbXBsZXRlZCI7YS5tZXRob2Q9InRocm93IjthLmFyZz1kLmFyZ319fX0odCxhLGwpO3JldHVybiBjfXQud3JhcD13cmFwO2Z1bmN0aW9uIHRyeUNhdGNoKHQscixhKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOnQuY2FsbChyLGEpfX1jYXRjaCh0KXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzp0fX19dmFyIHU9e307ZnVuY3Rpb24gR2VuZXJhdG9yKCl7fWZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCl7fWZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCl7fXZhciBoPXt9O2hbb109ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dmFyIGQ9T2JqZWN0LmdldFByb3RvdHlwZU9mLHA9ZCYmZChkKHZhbHVlcyhbXSkpKTtwJiZwIT09ciYmYS5jYWxsKHAsbykmJihoPXApO3ZhciBtPUdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZT1HZW5lcmF0b3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaCk7R2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlPW0uY29uc3RydWN0b3I9R2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7R2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3I9R2VuZXJhdG9yRnVuY3Rpb247R2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWU9ZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLGwsIkdlbmVyYXRvckZ1bmN0aW9uIik7ZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaCgoZnVuY3Rpb24ocil7ZGVmaW5lKHQsciwoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZShyLHQpfSkpfSkpfXQuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbih0KXt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4hIXImJihyPT09R2VuZXJhdG9yRnVuY3Rpb258fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0oci5kaXNwbGF5TmFtZXx8ci5uYW1lKSl9O3QubWFyaz1mdW5jdGlvbih0KXtpZihPYmplY3Quc2V0UHJvdG90eXBlT2YpT2JqZWN0LnNldFByb3RvdHlwZU9mKHQsR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO2Vsc2V7dC5fX3Byb3RvX189R2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7ZGVmaW5lKHQsbCwiR2VuZXJhdG9yRnVuY3Rpb24iKX10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG0pO3JldHVybiB0fTt0LmF3cmFwPWZ1bmN0aW9uKHQpe3JldHVybntfX2F3YWl0OnR9fTtmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKHQscil7dmFyIGk7dGhpcy5faW52b2tlPWZ1bmN0aW9uIGVucXVldWUobyxjKXtmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpe3JldHVybiBuZXcgcigoZnVuY3Rpb24oaSxsKXshZnVuY3Rpb24gaW52b2tlKGksbyxjLGwpe3ZhciB1PXRyeUNhdGNoKHRbaV0sdCxvKTtpZigidGhyb3ciIT09dS50eXBlKXt2YXIgaD11LmFyZyxkPWgudmFsdWU7cmV0dXJuIGQmJiJvYmplY3QiPT09X3R5cGVvZihkKSYmYS5jYWxsKGQsIl9fYXdhaXQiKT9yLnJlc29sdmUoZC5fX2F3YWl0KS50aGVuKChmdW5jdGlvbih0KXtpbnZva2UoIm5leHQiLHQsYyxsKX0pLChmdW5jdGlvbih0KXtpbnZva2UoInRocm93Iix0LGMsbCl9KSk6ci5yZXNvbHZlKGQpLnRoZW4oKGZ1bmN0aW9uKHQpe2gudmFsdWU9dDtjKGgpfSksKGZ1bmN0aW9uKHQpe3JldHVybiBpbnZva2UoInRocm93Iix0LGMsbCl9KSl9bCh1LmFyZyl9KG8sYyxpLGwpfSkpfXJldHVybiBpPWk/aS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKTpjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpfX1kZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO0FzeW5jSXRlcmF0b3IucHJvdG90eXBlW2NdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuQXN5bmNJdGVyYXRvcj1Bc3luY0l0ZXJhdG9yO3QuYXN5bmM9ZnVuY3Rpb24ocixhLGksbyxjKXt2b2lkIDA9PT1jJiYoYz1Qcm9taXNlKTt2YXIgbD1uZXcgQXN5bmNJdGVyYXRvcih3cmFwKHIsYSxpLG8pLGMpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24oYSk/bDpsLm5leHQoKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6bC5uZXh0KCl9KSl9O2Z1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUodCxyKXt2YXIgYT10Lml0ZXJhdG9yW3IubWV0aG9kXTtpZih2b2lkIDA9PT1hKXtyLmRlbGVnYXRlPW51bGw7aWYoInRocm93Ij09PXIubWV0aG9kKXtpZih0Lml0ZXJhdG9yLnJldHVybil7ci5tZXRob2Q9InJldHVybiI7ci5hcmc9dm9pZCAwO21heWJlSW52b2tlRGVsZWdhdGUodCxyKTtpZigidGhyb3ciPT09ci5tZXRob2QpcmV0dXJuIHV9ci5tZXRob2Q9InRocm93IjtyLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIHV9dmFyIGk9dHJ5Q2F0Y2goYSx0Lml0ZXJhdG9yLHIuYXJnKTtpZigidGhyb3ciPT09aS50eXBlKXtyLm1ldGhvZD0idGhyb3ciO3IuYXJnPWkuYXJnO3IuZGVsZWdhdGU9bnVsbDtyZXR1cm4gdX12YXIgbz1pLmFyZztpZighbyl7ci5tZXRob2Q9InRocm93IjtyLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpO3IuZGVsZWdhdGU9bnVsbDtyZXR1cm4gdX1pZighby5kb25lKXJldHVybiBvO3JbdC5yZXN1bHROYW1lXT1vLnZhbHVlO3IubmV4dD10Lm5leHRMb2M7aWYoInJldHVybiIhPT1yLm1ldGhvZCl7ci5tZXRob2Q9Im5leHQiO3IuYXJnPXZvaWQgMH1yLmRlbGVnYXRlPW51bGw7cmV0dXJuIHV9ZGVmaW5lSXRlcmF0b3JNZXRob2RzKG0pO2RlZmluZShtLGwsIkdlbmVyYXRvciIpO21bb109ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307bS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifTtmdW5jdGlvbiBwdXNoVHJ5RW50cnkodCl7dmFyIHI9e3RyeUxvYzp0WzBdfTsxIGluIHQmJihyLmNhdGNoTG9jPXRbMV0pO2lmKDIgaW4gdCl7ci5maW5hbGx5TG9jPXRbMl07ci5hZnRlckxvYz10WzNdfXRoaXMudHJ5RW50cmllcy5wdXNoKHIpfWZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkodCl7dmFyIHI9dC5jb21wbGV0aW9ufHx7fTtyLnR5cGU9Im5vcm1hbCI7ZGVsZXRlIHIuYXJnO3QuY29tcGxldGlvbj1yfWZ1bmN0aW9uIENvbnRleHQodCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dO3QuZm9yRWFjaChwdXNoVHJ5RW50cnksdGhpcyk7dGhpcy5yZXNldCghMCl9dC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciByPVtdO2Zvcih2YXIgYSBpbiB0KXIucHVzaChhKTtyLnJldmVyc2UoKTtyZXR1cm4gZnVuY3Rpb24gbmV4dCgpe2Zvcig7ci5sZW5ndGg7KXt2YXIgYT1yLnBvcCgpO2lmKGEgaW4gdCl7bmV4dC52YWx1ZT1hO25leHQuZG9uZT0hMTtyZXR1cm4gbmV4dH19bmV4dC5kb25lPSEwO3JldHVybiBuZXh0fX07ZnVuY3Rpb24gdmFsdWVzKHQpe2lmKHQpe3ZhciByPXRbb107aWYocilyZXR1cm4gci5jYWxsKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIGk9LTEsYz1mdW5jdGlvbiBuZXh0KCl7Zm9yKDsrK2k8dC5sZW5ndGg7KWlmKGEuY2FsbCh0LGkpKXtuZXh0LnZhbHVlPXRbaV07bmV4dC5kb25lPSExO3JldHVybiBuZXh0fW5leHQudmFsdWU9dm9pZCAwO25leHQuZG9uZT0hMDtyZXR1cm4gbmV4dH07cmV0dXJuIGMubmV4dD1jfX1yZXR1cm57bmV4dDpkb25lUmVzdWx0fX10LnZhbHVlcz12YWx1ZXM7ZnVuY3Rpb24gZG9uZVJlc3VsdCgpe3JldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19Q29udGV4dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkNvbnRleHQscmVzZXQ6ZnVuY3Rpb24gcmVzZXQodCl7dGhpcy5wcmV2PTA7dGhpcy5uZXh0PTA7dGhpcy5zZW50PXRoaXMuX3NlbnQ9dm9pZCAwO3RoaXMuZG9uZT0hMTt0aGlzLmRlbGVnYXRlPW51bGw7dGhpcy5tZXRob2Q9Im5leHQiO3RoaXMuYXJnPXZvaWQgMDt0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtpZighdClmb3IodmFyIHIgaW4gdGhpcykidCI9PT1yLmNoYXJBdCgwKSYmYS5jYWxsKHRoaXMscikmJiFpc05hTigrci5zbGljZSgxKSkmJih0aGlzW3JdPXZvaWQgMCl9LHN0b3A6ZnVuY3Rpb24gc3RvcCgpe3RoaXMuZG9uZT0hMDt2YXIgdD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKHQpe2lmKHRoaXMuZG9uZSl0aHJvdyB0O3ZhciByPXRoaXM7ZnVuY3Rpb24gaGFuZGxlKGEsaSl7Yy50eXBlPSJ0aHJvdyI7Yy5hcmc9dDtyLm5leHQ9YTtpZihpKXtyLm1ldGhvZD0ibmV4dCI7ci5hcmc9dm9pZCAwfXJldHVybiEhaX1mb3IodmFyIGk9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbaV0sYz1vLmNvbXBsZXRpb247aWYoInJvb3QiPT09by50cnlMb2MpcmV0dXJuIGhhbmRsZSgiZW5kIik7aWYoby50cnlMb2M8PXRoaXMucHJldil7dmFyIGw9YS5jYWxsKG8sImNhdGNoTG9jIiksdT1hLmNhbGwobywiZmluYWxseUxvYyIpO2lmKGwmJnUpe2lmKHRoaXMucHJldjxvLmNhdGNoTG9jKXJldHVybiBoYW5kbGUoby5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PG8uZmluYWxseUxvYylyZXR1cm4gaGFuZGxlKG8uZmluYWxseUxvYyl9ZWxzZSBpZihsKXtpZih0aGlzLnByZXY8by5jYXRjaExvYylyZXR1cm4gaGFuZGxlKG8uY2F0Y2hMb2MsITApfWVsc2V7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxvLmZpbmFsbHlMb2MpcmV0dXJuIGhhbmRsZShvLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24gYWJydXB0KHQscil7Zm9yKHZhciBpPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIG89dGhpcy50cnlFbnRyaWVzW2ldO2lmKG8udHJ5TG9jPD10aGlzLnByZXYmJmEuY2FsbChvLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxvLmZpbmFsbHlMb2Mpe3ZhciBjPW87YnJlYWt9fWMmJigiYnJlYWsiPT09dHx8ImNvbnRpbnVlIj09PXQpJiZjLnRyeUxvYzw9ciYmcjw9Yy5maW5hbGx5TG9jJiYoYz1udWxsKTt2YXIgbD1jP2MuY29tcGxldGlvbjp7fTtsLnR5cGU9dDtsLmFyZz1yO2lmKGMpe3RoaXMubWV0aG9kPSJuZXh0Ijt0aGlzLm5leHQ9Yy5maW5hbGx5TG9jO3JldHVybiB1fXJldHVybiB0aGlzLmNvbXBsZXRlKGwpfSxjb21wbGV0ZTpmdW5jdGlvbiBjb21wbGV0ZSh0LHIpe2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7aWYoImJyZWFrIj09PXQudHlwZXx8ImNvbnRpbnVlIj09PXQudHlwZSl0aGlzLm5leHQ9dC5hcmc7ZWxzZSBpZigicmV0dXJuIj09PXQudHlwZSl7dGhpcy5ydmFsPXRoaXMuYXJnPXQuYXJnO3RoaXMubWV0aG9kPSJyZXR1cm4iO3RoaXMubmV4dD0iZW5kIn1lbHNlIm5vcm1hbCI9PT10LnR5cGUmJnImJih0aGlzLm5leHQ9cik7cmV0dXJuIHV9LGZpbmlzaDpmdW5jdGlvbiBmaW5pc2godCl7Zm9yKHZhciByPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtyPj0wOy0tcil7dmFyIGE9dGhpcy50cnlFbnRyaWVzW3JdO2lmKGEuZmluYWxseUxvYz09PXQpe3RoaXMuY29tcGxldGUoYS5jb21wbGV0aW9uLGEuYWZ0ZXJMb2MpO3Jlc2V0VHJ5RW50cnkoYSk7cmV0dXJuIHV9fX0sY2F0Y2g6ZnVuY3Rpb24gX2NhdGNoKHQpe2Zvcih2YXIgcj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7cj49MDstLXIpe3ZhciBhPXRoaXMudHJ5RW50cmllc1tyXTtpZihhLnRyeUxvYz09PXQpe3ZhciBpPWEuY29tcGxldGlvbjtpZigidGhyb3ciPT09aS50eXBlKXt2YXIgbz1pLmFyZztyZXNldFRyeUVudHJ5KGEpfXJldHVybiBvfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uIGRlbGVnYXRlWWllbGQodCxyLGEpe3RoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOnZhbHVlcyh0KSxyZXN1bHROYW1lOnIsbmV4dExvYzphfTsibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPXZvaWQgMCk7cmV0dXJuIHV9fTtyZXR1cm4gdH0oIm9iamVjdCI9PT1fdHlwZW9mKHQpP3QuZXhwb3J0czp7fSk7dHJ5e3JlZ2VuZXJhdG9yUnVudGltZT1yfWNhdGNoKHQpe0Z1bmN0aW9uKCJyIiwicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHIpfX0pLmNhbGwodGhpcyxhKDQpKHQpKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXQud2VicGFja1BvbHlmaWxsKXt0LmRlcHJlY2F0ZT1mdW5jdGlvbigpe307dC5wYXRocz1bXTt0LmNoaWxkcmVufHwodC5jaGlsZHJlbj1bXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImxvYWRlZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0Lmx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImlkIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHQuaX19KTt0LndlYnBhY2tQb2x5ZmlsbD0xfXJldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5hcnJheUJ5dGVMZW5ndGg9YXJyYXlCeXRlTGVuZ3RoO3IuYXJyYXlzVG9CeXRlcz1mdW5jdGlvbiBhcnJheXNUb0J5dGVzKHQpe3ZhciByPXQubGVuZ3RoO2lmKDE9PT1yJiZ0WzBdaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiB0WzBdO2Zvcih2YXIgYT0wLGk9MDtpPHI7aSsrKWErPWFycmF5Qnl0ZUxlbmd0aCh0W2ldKTtmb3IodmFyIG89MCxjPW5ldyBVaW50OEFycmF5KGEpLGw9MDtsPHI7bCsrKXt2YXIgdT10W2xdO3UgaW5zdGFuY2VvZiBVaW50OEFycmF5fHwodT0ic3RyaW5nIj09dHlwZW9mIHU/c3RyaW5nVG9CeXRlcyh1KTpuZXcgVWludDhBcnJheSh1KSk7dmFyIGg9dS5ieXRlTGVuZ3RoO2Muc2V0KHUsbyk7bys9aH1yZXR1cm4gY307ci5hc3NlcnQ9YXNzZXJ0O3IuYnl0ZXNUb1N0cmluZz1mdW5jdGlvbiBieXRlc1RvU3RyaW5nKHQpe2Fzc2VydChudWxsIT09dCYmIm9iamVjdCI9PT1fdHlwZW9mKHQpJiZ2b2lkIDAhPT10Lmxlbmd0aCwiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZyIpO3ZhciByPXQubGVuZ3RoO2lmKHI8ODE5MilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHQpO2Zvcih2YXIgYT1bXSxpPTA7aTxyO2krPTgxOTIpe3ZhciBvPU1hdGgubWluKGkrODE5MixyKSxjPXQuc3ViYXJyYXkoaSxvKTthLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGMpKX1yZXR1cm4gYS5qb2luKCIiKX07ci5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCkscj0hMTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwic2V0dGxlZCIse2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gcn19KTt0LnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGEsaSl7dC5yZXNvbHZlPWZ1bmN0aW9uKHQpe3I9ITA7YSh0KX07dC5yZWplY3Q9ZnVuY3Rpb24odCl7cj0hMDtpKHQpfX0pKTtyZXR1cm4gdH07ci5lc2NhcGVTdHJpbmc9ZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHQpe3JldHVybiB0LnJlcGxhY2UoLyhbXChcKVxcXSkvZywiXFwkMSIpfTtyLmdldE1vZGlmaWNhdGlvbkRhdGU9ZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpuZXcgRGF0ZShEYXRlLm5vdygpKSxyPVt0LmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwodC5nZXRVVENNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLCh0LmdldFVUQ0RhdGUoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSx0LmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksdC5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksdC5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIildO3JldHVybiByLmpvaW4oIiIpfTtyLmdldFZlcmJvc2l0eUxldmVsPWZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCl7cmV0dXJuIG99O3IuaW5mbz1mdW5jdGlvbiBpbmZvKHQpe28+PWkuSU5GT1MmJmNvbnNvbGUubG9nKCJJbmZvOiAiLmNvbmNhdCh0KSl9O3IuaXNBcnJheUJ1ZmZlcj1mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHQpe3JldHVybiJvYmplY3QiPT09X3R5cGVvZih0KSYmbnVsbCE9PXQmJnZvaWQgMCE9PXQuYnl0ZUxlbmd0aH07ci5pc0FycmF5RXF1YWw9ZnVuY3Rpb24gaXNBcnJheUVxdWFsKHQscil7aWYodC5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4hMTtyZXR1cm4gdC5ldmVyeSgoZnVuY3Rpb24odCxhKXtyZXR1cm4gdD09PXJbYV19KSl9O3IuaXNCb29sPWZ1bmN0aW9uIGlzQm9vbCh0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fTtyLmlzTnVtPWZ1bmN0aW9uIGlzTnVtKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH07ci5pc1N0cmluZz1mdW5jdGlvbiBpc1N0cmluZyh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9O3IuaXNTYW1lT3JpZ2luPWZ1bmN0aW9uIGlzU2FtZU9yaWdpbih0LHIpe3ZhciBhO3RyeXtpZighKGE9bmV3IFVSTCh0KSkub3JpZ2lufHwibnVsbCI9PT1hLm9yaWdpbilyZXR1cm4hMX1jYXRjaCh0KXtyZXR1cm4hMX12YXIgaT1uZXcgVVJMKHIsYSk7cmV0dXJuIGEub3JpZ2luPT09aS5vcmlnaW59O3IuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybD1mdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHQscil7aWYoIXQpcmV0dXJuIG51bGw7dHJ5e3ZhciBhPXI/bmV3IFVSTCh0LHIpOm5ldyBVUkwodCk7aWYoZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh0KXtpZighdClyZXR1cm4hMTtzd2l0Y2godC5wcm90b2NvbCl7Y2FzZSJodHRwOiI6Y2FzZSJodHRwczoiOmNhc2UiZnRwOiI6Y2FzZSJtYWlsdG86IjpjYXNlInRlbDoiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fShhKSlyZXR1cm4gYX1jYXRjaCh0KXt9cmV0dXJuIG51bGx9O3IucmVtb3ZlTnVsbENoYXJhY3RlcnM9ZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnModCl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXt3YXJuKCJUaGUgYXJndW1lbnQgZm9yIHJlbW92ZU51bGxDaGFyYWN0ZXJzIG11c3QgYmUgYSBzdHJpbmcuIik7cmV0dXJuIHR9cmV0dXJuIHQucmVwbGFjZSh5LCIiKX07ci5zZXRWZXJib3NpdHlMZXZlbD1mdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbCh0KXtOdW1iZXIuaXNJbnRlZ2VyKHQpJiYobz10KX07ci5zaGFkb3c9c2hhZG93O3Iuc3RyaW5nMzI9ZnVuY3Rpb24gc3RyaW5nMzIodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodD4+MjQmMjU1LHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCl9O3Iuc3RyaW5nVG9CeXRlcz1zdHJpbmdUb0J5dGVzO3Iuc3RyaW5nVG9QREZTdHJpbmc9ZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcodCl7dmFyIHI9dC5sZW5ndGgsYT1bXTtpZigiw74iPT09dFswXSYmIsO/Ij09PXRbMV0pZm9yKHZhciBpPTI7aTxyO2krPTIpYS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZUF0KGkpPDw4fHQuY2hhckNvZGVBdChpKzEpKSk7ZWxzZSBpZigiw78iPT09dFswXSYmIsO+Ij09PXRbMV0pZm9yKHZhciBvPTI7bzxyO28rPTIpYS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZUF0KG8rMSk8PDh8dC5jaGFyQ29kZUF0KG8pKSk7ZWxzZSBmb3IodmFyIGM9MDtjPHI7KytjKXt2YXIgbD13W3QuY2hhckNvZGVBdChjKV07YS5wdXNoKGw/U3RyaW5nLmZyb21DaGFyQ29kZShsKTp0LmNoYXJBdChjKSl9cmV0dXJuIGEuam9pbigiIil9O3Iuc3RyaW5nVG9VVEY4U3RyaW5nPWZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyh0KXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh0KSl9O3IudXRmOFN0cmluZ1RvU3RyaW5nPWZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyh0KXtyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQpKX07ci53YXJuPXdhcm47ci51bnJlYWNoYWJsZT11bnJlYWNoYWJsZTtyLklzRXZhbFN1cHBvcnRlZENhY2hlZD1yLklzTGl0dGxlRW5kaWFuQ2FjaGVkPXIuY3JlYXRlT2JqZWN0VVJMPXIuRm9ybWF0RXJyb3I9ci5VdGlsPXIuVW5rbm93bkVycm9yRXhjZXB0aW9uPXIuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uPXIuVGV4dFJlbmRlcmluZ01vZGU9ci5TdHJlYW1UeXBlPXIuUGVybWlzc2lvbkZsYWc9ci5QYXNzd29yZFJlc3BvbnNlcz1yLlBhc3N3b3JkRXhjZXB0aW9uPXIuTWlzc2luZ1BERkV4Y2VwdGlvbj1yLkludmFsaWRQREZFeGNlcHRpb249ci5BYm9ydEV4Y2VwdGlvbj1yLkNNYXBDb21wcmVzc2lvblR5cGU9ci5JbWFnZUtpbmQ9ci5Gb250VHlwZT1yLkFubm90YXRpb25UeXBlPXIuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlPXIuQW5ub3RhdGlvblJldmlld1N0YXRlPXIuQW5ub3RhdGlvblJlcGx5VHlwZT1yLkFubm90YXRpb25NYXJrZWRTdGF0ZT1yLkFubm90YXRpb25GbGFnPXIuQW5ub3RhdGlvbkZpZWxkRmxhZz1yLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9ci5VTlNVUFBPUlRFRF9GRUFUVVJFUz1yLlZlcmJvc2l0eUxldmVsPXIuT1BTPXIuSURFTlRJVFlfTUFUUklYPXIuRk9OVF9JREVOVElUWV9NQVRSSVg9ci5CYXNlRXhjZXB0aW9uPXZvaWQgMDthKDYpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBpPXJbYV07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITE7aS5jb25maWd1cmFibGU9ITA7InZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1yLklERU5USVRZX01BVFJJWD1bMSwwLDAsMSwwLDBdO3IuRk9OVF9JREVOVElUWV9NQVRSSVg9Wy4wMDEsMCwwLC4wMDEsMCwwXTtyLlBlcm1pc3Npb25GbGFnPXtQUklOVDo0LE1PRElGWV9DT05URU5UUzo4LENPUFk6MTYsTU9ESUZZX0FOTk9UQVRJT05TOjMyLEZJTExfSU5URVJBQ1RJVkVfRk9STVM6MjU2LENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6NTEyLEFTU0VNQkxFOjEwMjQsUFJJTlRfSElHSF9RVUFMSVRZOjIwNDh9O3IuVGV4dFJlbmRlcmluZ01vZGU9e0ZJTEw6MCxTVFJPS0U6MSxGSUxMX1NUUk9LRToyLElOVklTSUJMRTozLEZJTExfQUREX1RPX1BBVEg6NCxTVFJPS0VfQUREX1RPX1BBVEg6NSxGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDo2LEFERF9UT19QQVRIOjcsRklMTF9TVFJPS0VfTUFTSzozLEFERF9UT19QQVRIX0ZMQUc6NH07ci5JbWFnZUtpbmQ9e0dSQVlTQ0FMRV8xQlBQOjEsUkdCXzI0QlBQOjIsUkdCQV8zMkJQUDozfTtyLkFubm90YXRpb25UeXBlPXtURVhUOjEsTElOSzoyLEZSRUVURVhUOjMsTElORTo0LFNRVUFSRTo1LENJUkNMRTo2LFBPTFlHT046NyxQT0xZTElORTo4LEhJR0hMSUdIVDo5LFVOREVSTElORToxMCxTUVVJR0dMWToxMSxTVFJJS0VPVVQ6MTIsU1RBTVA6MTMsQ0FSRVQ6MTQsSU5LOjE1LFBPUFVQOjE2LEZJTEVBVFRBQ0hNRU5UOjE3LFNPVU5EOjE4LE1PVklFOjE5LFdJREdFVDoyMCxTQ1JFRU46MjEsUFJJTlRFUk1BUks6MjIsVFJBUE5FVDoyMyxXQVRFUk1BUks6MjQsVEhSRUVEOjI1LFJFREFDVDoyNn07ci5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGU9e01BUktFRDoiTWFya2VkIixSRVZJRVc6IlJldmlldyJ9O3IuQW5ub3RhdGlvbk1hcmtlZFN0YXRlPXtNQVJLRUQ6Ik1hcmtlZCIsVU5NQVJLRUQ6IlVubWFya2VkIn07ci5Bbm5vdGF0aW9uUmV2aWV3U3RhdGU9e0FDQ0VQVEVEOiJBY2NlcHRlZCIsUkVKRUNURUQ6IlJlamVjdGVkIixDQU5DRUxMRUQ6IkNhbmNlbGxlZCIsQ09NUExFVEVEOiJDb21wbGV0ZWQiLE5PTkU6Ik5vbmUifTtyLkFubm90YXRpb25SZXBseVR5cGU9e0dST1VQOiJHcm91cCIsUkVQTFk6IlIifTtyLkFubm90YXRpb25GbGFnPXtJTlZJU0lCTEU6MSxISURERU46MixQUklOVDo0LE5PWk9PTTo4LE5PUk9UQVRFOjE2LE5PVklFVzozMixSRUFET05MWTo2NCxMT0NLRUQ6MTI4LFRPR0dMRU5PVklFVzoyNTYsTE9DS0VEQ09OVEVOVFM6NTEyfTtyLkFubm90YXRpb25GaWVsZEZsYWc9e1JFQURPTkxZOjEsUkVRVUlSRUQ6MixOT0VYUE9SVDo0LE1VTFRJTElORTo0MDk2LFBBU1NXT1JEOjgxOTIsTk9UT0dHTEVUT09GRjoxNjM4NCxSQURJTzozMjc2OCxQVVNIQlVUVE9OOjY1NTM2LENPTUJPOjEzMTA3MixFRElUOjI2MjE0NCxTT1JUOjUyNDI4OCxGSUxFU0VMRUNUOjEwNDg1NzYsTVVMVElTRUxFQ1Q6MjA5NzE1MixET05PVFNQRUxMQ0hFQ0s6NDE5NDMwNCxET05PVFNDUk9MTDo4Mzg4NjA4LENPTUI6MTY3NzcyMTYsUklDSFRFWFQ6MzM1NTQ0MzIsUkFESU9TSU5VTklTT046MzM1NTQ0MzIsQ09NTUlUT05TRUxDSEFOR0U6NjcxMDg4NjR9O3IuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZT17U09MSUQ6MSxEQVNIRUQ6MixCRVZFTEVEOjMsSU5TRVQ6NCxVTkRFUkxJTkU6NX07ci5TdHJlYW1UeXBlPXtVTktOT1dOOiJVTktOT1dOIixGTEFURToiRkxBVEUiLExaVzoiTFpXIixEQ1Q6IkRDVCIsSlBYOiJKUFgiLEpCSUc6IkpCSUciLEE4NToiQTg1IixBSFg6IkFIWCIsQ0NGOiJDQ0YiLFJMWDoiUkxYIn07ci5Gb250VHlwZT17VU5LTk9XTjoiVU5LTk9XTiIsVFlQRTE6IlRZUEUxIixUWVBFMUM6IlRZUEUxQyIsQ0lERk9OVFRZUEUwOiJDSURGT05UVFlQRTAiLENJREZPTlRUWVBFMEM6IkNJREZPTlRUWVBFMEMiLFRSVUVUWVBFOiJUUlVFVFlQRSIsQ0lERk9OVFRZUEUyOiJDSURGT05UVFlQRTIiLFRZUEUzOiJUWVBFMyIsT1BFTlRZUEU6Ik9QRU5UWVBFIixUWVBFMDoiVFlQRTAiLE1NVFlQRTE6Ik1NVFlQRTEifTt2YXIgaT17RVJST1JTOjAsV0FSTklOR1M6MSxJTkZPUzo1fTtyLlZlcmJvc2l0eUxldmVsPWk7ci5DTWFwQ29tcHJlc3Npb25UeXBlPXtOT05FOjAsQklOQVJZOjEsU1RSRUFNOjJ9O3IuT1BTPXtkZXBlbmRlbmN5OjEsc2V0TGluZVdpZHRoOjIsc2V0TGluZUNhcDozLHNldExpbmVKb2luOjQsc2V0TWl0ZXJMaW1pdDo1LHNldERhc2g6NixzZXRSZW5kZXJpbmdJbnRlbnQ6NyxzZXRGbGF0bmVzczo4LHNldEdTdGF0ZTo5LHNhdmU6MTAscmVzdG9yZToxMSx0cmFuc2Zvcm06MTIsbW92ZVRvOjEzLGxpbmVUbzoxNCxjdXJ2ZVRvOjE1LGN1cnZlVG8yOjE2LGN1cnZlVG8zOjE3LGNsb3NlUGF0aDoxOCxyZWN0YW5nbGU6MTksc3Ryb2tlOjIwLGNsb3NlU3Ryb2tlOjIxLGZpbGw6MjIsZW9GaWxsOjIzLGZpbGxTdHJva2U6MjQsZW9GaWxsU3Ryb2tlOjI1LGNsb3NlRmlsbFN0cm9rZToyNixjbG9zZUVPRmlsbFN0cm9rZToyNyxlbmRQYXRoOjI4LGNsaXA6MjksZW9DbGlwOjMwLGJlZ2luVGV4dDozMSxlbmRUZXh0OjMyLHNldENoYXJTcGFjaW5nOjMzLHNldFdvcmRTcGFjaW5nOjM0LHNldEhTY2FsZTozNSxzZXRMZWFkaW5nOjM2LHNldEZvbnQ6Mzcsc2V0VGV4dFJlbmRlcmluZ01vZGU6Mzgsc2V0VGV4dFJpc2U6MzksbW92ZVRleHQ6NDAsc2V0TGVhZGluZ01vdmVUZXh0OjQxLHNldFRleHRNYXRyaXg6NDIsbmV4dExpbmU6NDMsc2hvd1RleHQ6NDQsc2hvd1NwYWNlZFRleHQ6NDUsbmV4dExpbmVTaG93VGV4dDo0NixuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDo0NyxzZXRDaGFyV2lkdGg6NDgsc2V0Q2hhcldpZHRoQW5kQm91bmRzOjQ5LHNldFN0cm9rZUNvbG9yU3BhY2U6NTAsc2V0RmlsbENvbG9yU3BhY2U6NTEsc2V0U3Ryb2tlQ29sb3I6NTIsc2V0U3Ryb2tlQ29sb3JOOjUzLHNldEZpbGxDb2xvcjo1NCxzZXRGaWxsQ29sb3JOOjU1LHNldFN0cm9rZUdyYXk6NTYsc2V0RmlsbEdyYXk6NTcsc2V0U3Ryb2tlUkdCQ29sb3I6NTgsc2V0RmlsbFJHQkNvbG9yOjU5LHNldFN0cm9rZUNNWUtDb2xvcjo2MCxzZXRGaWxsQ01ZS0NvbG9yOjYxLHNoYWRpbmdGaWxsOjYyLGJlZ2luSW5saW5lSW1hZ2U6NjMsYmVnaW5JbWFnZURhdGE6NjQsZW5kSW5saW5lSW1hZ2U6NjUscGFpbnRYT2JqZWN0OjY2LG1hcmtQb2ludDo2NyxtYXJrUG9pbnRQcm9wczo2OCxiZWdpbk1hcmtlZENvbnRlbnQ6NjksYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6NzAsZW5kTWFya2VkQ29udGVudDo3MSxiZWdpbkNvbXBhdDo3MixlbmRDb21wYXQ6NzMscGFpbnRGb3JtWE9iamVjdEJlZ2luOjc0LHBhaW50Rm9ybVhPYmplY3RFbmQ6NzUsYmVnaW5Hcm91cDo3NixlbmRHcm91cDo3NyxiZWdpbkFubm90YXRpb25zOjc4LGVuZEFubm90YXRpb25zOjc5LGJlZ2luQW5ub3RhdGlvbjo4MCxlbmRBbm5vdGF0aW9uOjgxLHBhaW50SnBlZ1hPYmplY3Q6ODIscGFpbnRJbWFnZU1hc2tYT2JqZWN0OjgzLHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOjg0LHBhaW50SW1hZ2VYT2JqZWN0Ojg1LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0Ojg2LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6ODcscGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6ODgscGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0Ojg5LHBhaW50U29saWRDb2xvckltYWdlTWFzazo5MCxjb25zdHJ1Y3RQYXRoOjkxfTtyLlVOU1VQUE9SVEVEX0ZFQVRVUkVTPXt1bmtub3duOiJ1bmtub3duIixmb3JtczoiZm9ybXMiLGphdmFTY3JpcHQ6ImphdmFTY3JpcHQiLHNtYXNrOiJzbWFzayIsc2hhZGluZ1BhdHRlcm46InNoYWRpbmdQYXR0ZXJuIixmb250OiJmb250IixlcnJvclRpbGluZ1BhdHRlcm46ImVycm9yVGlsaW5nUGF0dGVybiIsZXJyb3JFeHRHU3RhdGU6ImVycm9yRXh0R1N0YXRlIixlcnJvclhPYmplY3Q6ImVycm9yWE9iamVjdCIsZXJyb3JGb250TG9hZFR5cGUzOiJlcnJvckZvbnRMb2FkVHlwZTMiLGVycm9yRm9udFN0YXRlOiJlcnJvckZvbnRTdGF0ZSIsZXJyb3JGb250TWlzc2luZzoiZXJyb3JGb250TWlzc2luZyIsZXJyb3JGb250VHJhbnNsYXRlOiJlcnJvckZvbnRUcmFuc2xhdGUiLGVycm9yQ29sb3JTcGFjZToiZXJyb3JDb2xvclNwYWNlIixlcnJvck9wZXJhdG9yTGlzdDoiZXJyb3JPcGVyYXRvckxpc3QiLGVycm9yRm9udFRvVW5pY29kZToiZXJyb3JGb250VG9Vbmljb2RlIixlcnJvckZvbnRMb2FkTmF0aXZlOiJlcnJvckZvbnRMb2FkTmF0aXZlIixlcnJvckZvbnRHZXRQYXRoOiJlcnJvckZvbnRHZXRQYXRoIixlcnJvck1hcmtlZENvbnRlbnQ6ImVycm9yTWFya2VkQ29udGVudCJ9O3IuUGFzc3dvcmRSZXNwb25zZXM9e05FRURfUEFTU1dPUkQ6MSxJTkNPUlJFQ1RfUEFTU1dPUkQ6Mn07dmFyIG89aS5XQVJOSU5HUztmdW5jdGlvbiB3YXJuKHQpe28+PWkuV0FSTklOR1MmJmNvbnNvbGUubG9nKCJXYXJuaW5nOiAiLmNvbmNhdCh0KSl9ZnVuY3Rpb24gdW5yZWFjaGFibGUodCl7dGhyb3cgbmV3IEVycm9yKHQpfWZ1bmN0aW9uIGFzc2VydCh0LHIpe3R8fHVucmVhY2hhYmxlKHIpfWZ1bmN0aW9uIHNoYWRvdyh0LHIsYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQscix7dmFsdWU6YSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMX0pO3JldHVybiBhfXZhciBjPWZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCl7ZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbih0KXt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZUV4Y2VwdGlvbiYmdW5yZWFjaGFibGUoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uIik7dGhpcy5tZXNzYWdlPXQ7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZX1CYXNlRXhjZXB0aW9uLnByb3RvdHlwZT1uZXcgRXJyb3I7QmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3Rvcj1CYXNlRXhjZXB0aW9uO3JldHVybiBCYXNlRXhjZXB0aW9ufSgpO3IuQmFzZUV4Y2VwdGlvbj1jO3ZhciBsPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhQYXNzd29yZEV4Y2VwdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoUGFzc3dvcmRFeGNlcHRpb24pO2Z1bmN0aW9uIFBhc3N3b3JkRXhjZXB0aW9uKHQsYSl7dmFyIGk7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUGFzc3dvcmRFeGNlcHRpb24pOyhpPXIuY2FsbCh0aGlzLHQpKS5jb2RlPWE7cmV0dXJuIGl9cmV0dXJuIFBhc3N3b3JkRXhjZXB0aW9ufShjKTtyLlBhc3N3b3JkRXhjZXB0aW9uPWw7dmFyIHU9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFVua25vd25FcnJvckV4Y2VwdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoVW5rbm93bkVycm9yRXhjZXB0aW9uKTtmdW5jdGlvbiBVbmtub3duRXJyb3JFeGNlcHRpb24odCxhKXt2YXIgaTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxVbmtub3duRXJyb3JFeGNlcHRpb24pOyhpPXIuY2FsbCh0aGlzLHQpKS5kZXRhaWxzPWE7cmV0dXJuIGl9cmV0dXJuIFVua25vd25FcnJvckV4Y2VwdGlvbn0oYyk7ci5Vbmtub3duRXJyb3JFeGNlcHRpb249dTt2YXIgaD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoSW52YWxpZFBERkV4Y2VwdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoSW52YWxpZFBERkV4Y2VwdGlvbik7ZnVuY3Rpb24gSW52YWxpZFBERkV4Y2VwdGlvbigpe19jbGFzc0NhbGxDaGVjayh0aGlzLEludmFsaWRQREZFeGNlcHRpb24pO3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSW52YWxpZFBERkV4Y2VwdGlvbn0oYyk7ci5JbnZhbGlkUERGRXhjZXB0aW9uPWg7dmFyIGQ9ZnVuY3Rpb24odCl7X2luaGVyaXRzKE1pc3NpbmdQREZFeGNlcHRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKE1pc3NpbmdQREZFeGNlcHRpb24pO2Z1bmN0aW9uIE1pc3NpbmdQREZFeGNlcHRpb24oKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxNaXNzaW5nUERGRXhjZXB0aW9uKTtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE1pc3NpbmdQREZFeGNlcHRpb259KGMpO3IuTWlzc2luZ1BERkV4Y2VwdGlvbj1kO3ZhciBwPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbik7ZnVuY3Rpb24gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHQsYSl7dmFyIGk7X2NsYXNzQ2FsbENoZWNrKHRoaXMsVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKTsoaT1yLmNhbGwodGhpcyx0KSkuc3RhdHVzPWE7cmV0dXJuIGl9cmV0dXJuIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbn0oYyk7ci5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249cDt2YXIgbT1mdW5jdGlvbih0KXtfaW5oZXJpdHMoRm9ybWF0RXJyb3IsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKEZvcm1hdEVycm9yKTtmdW5jdGlvbiBGb3JtYXRFcnJvcigpe19jbGFzc0NhbGxDaGVjayh0aGlzLEZvcm1hdEVycm9yKTtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIEZvcm1hdEVycm9yfShjKTtyLkZvcm1hdEVycm9yPW07dmFyIGc9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEFib3J0RXhjZXB0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihBYm9ydEV4Y2VwdGlvbik7ZnVuY3Rpb24gQWJvcnRFeGNlcHRpb24oKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxBYm9ydEV4Y2VwdGlvbik7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBBYm9ydEV4Y2VwdGlvbn0oYyk7ci5BYm9ydEV4Y2VwdGlvbj1nO3ZhciB5PS9ceDAwL2c7ZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyh0KXthc3NlcnQoInN0cmluZyI9PXR5cGVvZiB0LCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzIik7Zm9yKHZhciByPXQubGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkociksaT0wO2k8cjsrK2kpYVtpXT0yNTUmdC5jaGFyQ29kZUF0KGkpO3JldHVybiBhfWZ1bmN0aW9uIGFycmF5Qnl0ZUxlbmd0aCh0KXtpZih2b2lkIDAhPT10Lmxlbmd0aClyZXR1cm4gdC5sZW5ndGg7YXNzZXJ0KHZvaWQgMCE9PXQuYnl0ZUxlbmd0aCwiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC4iKTtyZXR1cm4gdC5ieXRlTGVuZ3RofXZhciBiPXtnZXQgdmFsdWUoKXtyZXR1cm4gc2hhZG93KHRoaXMsInZhbHVlIixmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpe3ZhciB0PW5ldyBVaW50OEFycmF5KDQpO3RbMF09MTtyZXR1cm4gMT09PW5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlciwwLDEpWzBdfSgpKX19O3IuSXNMaXR0bGVFbmRpYW5DYWNoZWQ9Yjt2YXIgdj17Z2V0IHZhbHVlKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJ2YWx1ZSIsZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCl7dHJ5e25ldyBGdW5jdGlvbigiIik7cmV0dXJuITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpKX19O3IuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkPXY7dmFyIFM9WyJyZ2IoIiwwLCIsIiwwLCIsIiwwLCIpIl0saz1mdW5jdGlvbigpe2Z1bmN0aW9uIFV0aWwoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxVdGlsKX0hZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fShVdGlsLG51bGwsW3trZXk6Im1ha2VDc3NSZ2IiLHZhbHVlOmZ1bmN0aW9uIG1ha2VDc3NSZ2IodCxyLGEpe1NbMV09dDtTWzNdPXI7U1s1XT1hO3JldHVybiBTLmpvaW4oIiIpfX0se2tleToidHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiB0cmFuc2Zvcm0odCxyKXtyZXR1cm5bdFswXSpyWzBdK3RbMl0qclsxXSx0WzFdKnJbMF0rdFszXSpyWzFdLHRbMF0qclsyXSt0WzJdKnJbM10sdFsxXSpyWzJdK3RbM10qclszXSx0WzBdKnJbNF0rdFsyXSpyWzVdK3RbNF0sdFsxXSpyWzRdK3RbM10qcls1XSt0WzVdXX19LHtrZXk6ImFwcGx5VHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiBhcHBseVRyYW5zZm9ybSh0LHIpe3JldHVyblt0WzBdKnJbMF0rdFsxXSpyWzJdK3JbNF0sdFswXSpyWzFdK3RbMV0qclszXStyWzVdXX19LHtrZXk6ImFwcGx5SW52ZXJzZVRyYW5zZm9ybSIsdmFsdWU6ZnVuY3Rpb24gYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHQscil7dmFyIGE9clswXSpyWzNdLXJbMV0qclsyXTtyZXR1cm5bKHRbMF0qclszXS10WzFdKnJbMl0rclsyXSpyWzVdLXJbNF0qclszXSkvYSwoLXRbMF0qclsxXSt0WzFdKnJbMF0rcls0XSpyWzFdLXJbNV0qclswXSkvYV19fSx7a2V5OiJnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24gZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3godCxyKXt2YXIgYT1VdGlsLmFwcGx5VHJhbnNmb3JtKHQsciksaT1VdGlsLmFwcGx5VHJhbnNmb3JtKHQuc2xpY2UoMiw0KSxyKSxvPVV0aWwuYXBwbHlUcmFuc2Zvcm0oW3RbMF0sdFszXV0sciksYz1VdGlsLmFwcGx5VHJhbnNmb3JtKFt0WzJdLHRbMV1dLHIpO3JldHVybltNYXRoLm1pbihhWzBdLGlbMF0sb1swXSxjWzBdKSxNYXRoLm1pbihhWzFdLGlbMV0sb1sxXSxjWzFdKSxNYXRoLm1heChhWzBdLGlbMF0sb1swXSxjWzBdKSxNYXRoLm1heChhWzFdLGlbMV0sb1sxXSxjWzFdKV19fSx7a2V5OiJpbnZlcnNlVHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiBpbnZlcnNlVHJhbnNmb3JtKHQpe3ZhciByPXRbMF0qdFszXS10WzFdKnRbMl07cmV0dXJuW3RbM10vciwtdFsxXS9yLC10WzJdL3IsdFswXS9yLCh0WzJdKnRbNV0tdFs0XSp0WzNdKS9yLCh0WzRdKnRbMV0tdFs1XSp0WzBdKS9yXX19LHtrZXk6ImFwcGx5M2RUcmFuc2Zvcm0iLHZhbHVlOmZ1bmN0aW9uIGFwcGx5M2RUcmFuc2Zvcm0odCxyKXtyZXR1cm5bdFswXSpyWzBdK3RbMV0qclsxXSt0WzJdKnJbMl0sdFszXSpyWzBdK3RbNF0qclsxXSt0WzVdKnJbMl0sdFs2XSpyWzBdK3RbN10qclsxXSt0WzhdKnJbMl1dfX0se2tleToic2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUiLHZhbHVlOmZ1bmN0aW9uIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHQpe3ZhciByPVt0WzBdLHRbMl0sdFsxXSx0WzNdXSxhPXRbMF0qclswXSt0WzFdKnJbMl0saT10WzBdKnJbMV0rdFsxXSpyWzNdLG89dFsyXSpyWzBdK3RbM10qclsyXSxjPXRbMl0qclsxXSt0WzNdKnJbM10sbD0oYStjKS8yLHU9TWF0aC5zcXJ0KChhK2MpKihhK2MpLTQqKGEqYy1vKmkpKS8yLGg9bCt1fHwxLGQ9bC11fHwxO3JldHVybltNYXRoLnNxcnQoaCksTWF0aC5zcXJ0KGQpXX19LHtrZXk6Im5vcm1hbGl6ZVJlY3QiLHZhbHVlOmZ1bmN0aW9uIG5vcm1hbGl6ZVJlY3QodCl7dmFyIHI9dC5zbGljZSgwKTtpZih0WzBdPnRbMl0pe3JbMF09dFsyXTtyWzJdPXRbMF19aWYodFsxXT50WzNdKXtyWzFdPXRbM107clszXT10WzFdfXJldHVybiByfX0se2tleToiaW50ZXJzZWN0Iix2YWx1ZTpmdW5jdGlvbiBpbnRlcnNlY3QodCxyKXtmdW5jdGlvbiBjb21wYXJlKHQscil7cmV0dXJuIHQtcn12YXIgYT1bdFswXSx0WzJdLHJbMF0sclsyXV0uc29ydChjb21wYXJlKSxpPVt0WzFdLHRbM10sclsxXSxyWzNdXS5zb3J0KGNvbXBhcmUpLG89W107dD1VdGlsLm5vcm1hbGl6ZVJlY3QodCk7cj1VdGlsLm5vcm1hbGl6ZVJlY3Qocik7aWYoIShhWzBdPT09dFswXSYmYVsxXT09PXJbMF18fGFbMF09PT1yWzBdJiZhWzFdPT09dFswXSkpcmV0dXJuIG51bGw7b1swXT1hWzFdO29bMl09YVsyXTtpZighKGlbMF09PT10WzFdJiZpWzFdPT09clsxXXx8aVswXT09PXJbMV0mJmlbMV09PT10WzFdKSlyZXR1cm4gbnVsbDtvWzFdPWlbMV07b1szXT1pWzJdO3JldHVybiBvfX1dKTtyZXR1cm4gVXRpbH0oKTtyLlV0aWw9azt2YXIgdz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzI4LDcxMSw3MTAsNzI5LDczMyw3MzEsNzMwLDczMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MjI2LDgyMjQsODIyNSw4MjMwLDgyMTIsODIxMSw0MDIsODI2MCw4MjQ5LDgyNTAsODcyMiw4MjQwLDgyMjIsODIyMCw4MjIxLDgyMTYsODIxNyw4MjE4LDg0ODIsNjQyNTcsNjQyNTgsMzIxLDMzOCwzNTIsMzc2LDM4MSwzMDUsMzIyLDMzOSwzNTMsMzgyLDAsODM2NF07dmFyIEM9ZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMQ2xvc3VyZSgpe3ZhciB0PSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7cmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChyLGEpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07aWYoIWkmJlVSTC5jcmVhdGVPYmplY3RVUkwpe3ZhciBvPW5ldyBCbG9iKFtyXSx7dHlwZTphfSk7cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobyl9Zm9yKHZhciBjPSJkYXRhOiIuY29uY2F0KGEsIjtiYXNlNjQsIiksbD0wLHU9ci5sZW5ndGg7bDx1O2wrPTMpe3ZhciBoPTI1NSZyW2xdLGQ9MjU1JnJbbCsxXSxwPTI1NSZyW2wrMl0sbT1oPj4yLGc9KDMmaCk8PDR8ZD4+NCx5PWwrMTx1PygxNSZkKTw8MnxwPj42OjY0LGI9bCsyPHU/NjMmcDo2NDtjKz10W21dK3RbZ10rdFt5XSt0W2JdfXJldHVybiBjfX0oKTtyLmNyZWF0ZU9iamVjdFVSTD1DfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoNyk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1pZigidW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbFRoaXN8fCFnbG9iYWxUaGlzLl9wZGZqc0NvbXBhdGliaWxpdHlDaGVja2VkKXsidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMuTWF0aD09PU1hdGh8fChnbG9iYWxUaGlzPWEoOCkpO2dsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQ9ITA7dmFyIG89Im9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3c/InVuZGVmaW5lZCI6X3R5cGVvZih3aW5kb3cpKSYmIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudD8idW5kZWZpbmVkIjpfdHlwZW9mKGRvY3VtZW50KSksYz0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yLnVzZXJBZ2VudHx8IiIsbD0vVHJpZGVudC8udGVzdChjKTshZnVuY3Rpb24gY2hlY2tOb2RlQnRvYSgpeyFnbG9iYWxUaGlzLmJ0b2EmJmkuaXNOb2RlSlMmJihnbG9iYWxUaGlzLmJ0b2E9ZnVuY3Rpb24odCl7cmV0dXJuIEJ1ZmZlci5mcm9tKHQsImJpbmFyeSIpLnRvU3RyaW5nKCJiYXNlNjQiKX0pfSgpOyFmdW5jdGlvbiBjaGVja05vZGVBdG9iKCl7IWdsb2JhbFRoaXMuYXRvYiYmaS5pc05vZGVKUyYmKGdsb2JhbFRoaXMuYXRvYj1mdW5jdGlvbih0KXtyZXR1cm4gQnVmZmVyLmZyb20odCwiYmFzZTY0IikudG9TdHJpbmcoImJpbmFyeSIpfSl9KCk7IWZ1bmN0aW9uIGNoZWNrQ2hpbGROb2RlUmVtb3ZlKCl7byYmdm9pZCAwPT09RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlJiYoRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyl9KX0oKTshZnVuY3Rpb24gY2hlY2tET01Ub2tlbkxpc3RBZGRSZW1vdmUoKXtpZihvJiYhaS5pc05vZGVKUyl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc0xpc3QuYWRkKCJ0ZXN0T25lIiwidGVzdFR3byIpO2lmKCEwIT09dC5jbGFzc0xpc3QuY29udGFpbnMoInRlc3RPbmUiKXx8ITAhPT10LmNsYXNzTGlzdC5jb250YWlucygidGVzdFR3byIpKXt2YXIgcj1ET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCxhPURPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO0RPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkodCksaT0wO2k8dDtpKyspYVtpXT1hcmd1bWVudHNbaV07Zm9yKHZhciBvPTAsYz1hO288Yy5sZW5ndGg7bysrKXt2YXIgbD1jW29dO3IuY2FsbCh0aGlzLGwpfX07RE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheSh0KSxpPTA7aTx0O2krKylyW2ldPWFyZ3VtZW50c1tpXTtmb3IodmFyIG89MCxjPXI7bzxjLmxlbmd0aDtvKyspe3ZhciBsPWNbb107YS5jYWxsKHRoaXMsbCl9fX19fSgpOyFmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpe2lmKG8mJiFpLmlzTm9kZUpTKXshMSE9PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmNsYXNzTGlzdC50b2dnbGUoInRlc3QiLDApJiYoRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24odCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xPyEhYXJndW1lbnRzWzFdOiF0aGlzLmNvbnRhaW5zKHQpO3JldHVybiB0aGlzW3I/ImFkZCI6InJlbW92ZSJdKHQpLHJ9KX19KCk7IWZ1bmN0aW9uIGNoZWNrV2luZG93SGlzdG9yeVB1c2hTdGF0ZVJlcGxhY2VTdGF0ZSgpe2lmKG8mJmwpe3ZhciB0PXdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSxyPXdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZTt3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU9ZnVuY3Rpb24ocixhLGkpe3ZhciBvPXZvaWQgMD09PWk/W3IsYV06W3IsYSxpXTt0LmFwcGx5KHRoaXMsbyl9O3dpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZT1mdW5jdGlvbih0LGEsaSl7dmFyIG89dm9pZCAwPT09aT9bdCxhXTpbdCxhLGldO3IuYXBwbHkodGhpcyxvKX19fSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ1N0YXJ0c1dpdGgoKXtTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGh8fGEoNTMpfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ0VuZHNXaXRoKCl7U3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aHx8YSg2NCl9KCk7IWZ1bmN0aW9uIGNoZWNrU3RyaW5nSW5jbHVkZXMoKXtTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzfHxhKDY2KX0oKTshZnVuY3Rpb24gY2hlY2tBcnJheUluY2x1ZGVzKCl7QXJyYXkucHJvdG90eXBlLmluY2x1ZGVzfHxhKDY4KX0oKTshZnVuY3Rpb24gY2hlY2tBcnJheUZyb20oKXtBcnJheS5mcm9tfHxhKDc2KX0oKTshZnVuY3Rpb24gY2hlY2tPYmplY3RBc3NpZ24oKXtPYmplY3QuYXNzaWdufHxhKDk4KX0oKTshZnVuY3Rpb24gY2hlY2tPYmplY3RGcm9tRW50cmllcygpe09iamVjdC5mcm9tRW50cmllc3x8YSgxMDEpfSgpOyFmdW5jdGlvbiBjaGVja01hdGhMb2cyKCl7TWF0aC5sb2cyfHwoTWF0aC5sb2cyPWEoMTA1KSl9KCk7IWZ1bmN0aW9uIGNoZWNrTnVtYmVySXNOYU4oKXtOdW1iZXIuaXNOYU58fChOdW1iZXIuaXNOYU49YSgxMDcpKX0oKTshZnVuY3Rpb24gY2hlY2tOdW1iZXJJc0ludGVnZXIoKXtOdW1iZXIuaXNJbnRlZ2VyfHwoTnVtYmVyLmlzSW50ZWdlcj1hKDEwOSkpfSgpOyFmdW5jdGlvbiBjaGVja1R5cGVkQXJyYXlTbGljZSgpe1VpbnQ4QXJyYXkucHJvdG90eXBlLnNsaWNlfHxhKDExMil9KCk7IWZ1bmN0aW9uIGNoZWNrUHJvbWlzZSgpe2dsb2JhbFRoaXMuUHJvbWlzZSYmZ2xvYmFsVGhpcy5Qcm9taXNlLmFsbFNldHRsZWR8fChnbG9iYWxUaGlzLlByb21pc2U9YSgxMTcpKX0oKTshZnVuY3Rpb24gY2hlY2tVUkwoKXtnbG9iYWxUaGlzLlVSTD1hKDEzOCl9KCk7IWZ1bmN0aW9uIGNoZWNrUmVhZGFibGVTdHJlYW0oKXt2YXIgdD0hMTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFJlYWRhYmxlU3RyZWFtKXRyeXtuZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0OmZ1bmN0aW9uIHN0YXJ0KHQpe3QuY2xvc2UoKX19KTt0PSEwfWNhdGNoKHQpe310fHwoZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbT1hKDE0NSkuUmVhZGFibGVTdHJlYW0pfSgpOyFmdW5jdGlvbiBjaGVja01hcEVudHJpZXMoKXtnbG9iYWxUaGlzLk1hcCYmZ2xvYmFsVGhpcy5NYXAucHJvdG90eXBlLmVudHJpZXN8fChnbG9iYWxUaGlzLk1hcD1hKDE0NikpfSgpOyFmdW5jdGlvbiBjaGVja1NldEVudHJpZXMoKXtnbG9iYWxUaGlzLlNldCYmZ2xvYmFsVGhpcy5TZXQucHJvdG90eXBlLmVudHJpZXN8fChnbG9iYWxUaGlzLlNldD1hKDE1MykpfSgpOyFmdW5jdGlvbiBjaGVja1dlYWtNYXAoKXtnbG9iYWxUaGlzLldlYWtNYXB8fChnbG9iYWxUaGlzLldlYWtNYXA9YSgxNTUpKX0oKTshZnVuY3Rpb24gY2hlY2tXZWFrU2V0KCl7Z2xvYmFsVGhpcy5XZWFrU2V0fHwoZ2xvYmFsVGhpcy5XZWFrU2V0PWEoMTYxKSl9KCk7IWZ1bmN0aW9uIGNoZWNrU3RyaW5nQ29kZVBvaW50QXQoKXtTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0fHxhKDE2Myl9KCk7IWZ1bmN0aW9uIGNoZWNrU3RyaW5nRnJvbUNvZGVQb2ludCgpe1N0cmluZy5mcm9tQ29kZVBvaW50fHwoU3RyaW5nLmZyb21Db2RlUG9pbnQ9YSgxNjUpKX0oKTshZnVuY3Rpb24gY2hlY2tTeW1ib2woKXtnbG9iYWxUaGlzLlN5bWJvbHx8YSgxNjcpfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ1BhZFN0YXJ0KCl7U3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydHx8YSgxOTApfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ1BhZEVuZCgpe1N0cmluZy5wcm90b3R5cGUucGFkRW5kfHxhKDE5NSl9KCk7IWZ1bmN0aW9uIGNoZWNrT2JqZWN0VmFsdWVzKCl7T2JqZWN0LnZhbHVlc3x8KE9iamVjdC52YWx1ZXM9YSgxOTcpKX0oKTshZnVuY3Rpb24gY2hlY2tPYmplY3RFbnRyaWVzKCl7T2JqZWN0LmVudHJpZXN8fChPYmplY3QuZW50cmllcz1hKDIwMCkpfSgpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5pc05vZGVKUz12b2lkIDA7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX12YXIgaT0hKCJvYmplY3QiIT09KCJ1bmRlZmluZWQiPT10eXBlb2YgcHJvY2Vzcz8idW5kZWZpbmVkIjpfdHlwZW9mKHByb2Nlc3MpKXx8cHJvY2VzcysiIiE9IltvYmplY3QgcHJvY2Vzc10ifHxwcm9jZXNzLnZlcnNpb25zLm53fHxwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uJiZwcm9jZXNzLnR5cGUmJiJicm93c2VyIiE9PXByb2Nlc3MudHlwZSk7ci5pc05vZGVKUz1pfSxmdW5jdGlvbih0LHIsYSl7YSg5KTt0LmV4cG9ydHM9YSgxMSl9LGZ1bmN0aW9uKHQscixhKXthKDEwKSh7Z2xvYmFsOiEwfSx7Z2xvYmFsVGhpczphKDExKX0pfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMSksbz1hKDEyKS5mLGM9YSgyNiksbD1hKDI5KSx1PWEoMzApLGg9YSg0MCksZD1hKDUyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXt2YXIgYSxwLG0sZyx5LGI9dC50YXJnZXQsdj10Lmdsb2JhbCxTPXQuc3RhdDtpZihhPXY/aTpTP2lbYl18fHUoYix7fSk6KGlbYl18fHt9KS5wcm90b3R5cGUpZm9yKHAgaW4gcil7Zz1yW3BdO209dC5ub1RhcmdldEdldD8oeT1vKGEscCkpJiZ5LnZhbHVlOmFbcF07aWYoIWQodj9wOmIrKFM/Ii4iOiIjIikrcCx0LmZvcmNlZCkmJnZvaWQgMCE9PW0pe2lmKHR5cGVvZiBnPT10eXBlb2YgbSljb250aW51ZTtoKGcsbSl9KHQuc2hhbXx8bSYmbS5zaGFtKSYmYyhnLCJzaGFtIiwhMCk7bChhLHAsZyx0KX19fSxmdW5jdGlvbih0LHIpe3ZhciBjaGVjaz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5NYXRoPT1NYXRoJiZ0fTt0LmV4cG9ydHM9Y2hlY2soIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzKXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyl8fGNoZWNrKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZil8fGNoZWNrKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwpfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMyksbz1hKDE1KSxjPWEoMTYpLGw9YSgxNyksdT1hKDIxKSxoPWEoMjMpLGQ9YSgyNCkscD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO3IuZj1pP3A6ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscil7dD1sKHQpO3I9dShyLCEwKTtpZihkKXRyeXtyZXR1cm4gcCh0LHIpfWNhdGNoKHQpe31pZihoKHQscikpcmV0dXJuIGMoIW8uZi5jYWxsKHQsciksdFtyXSl9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxNCk7dC5leHBvcnRzPSFpKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sMSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSlbMV19KSl9LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixjPW8mJiFpLmNhbGwoezE6Mn0sMSk7ci5mPWM/ZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUodCl7dmFyIHI9byh0aGlzLHQpO3JldHVybiEhciYmci5lbnVtZXJhYmxlfTppfSxmdW5jdGlvbih0LHIpe3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTpyfX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDE4KSxvPWEoMjApO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDE0KSxvPWEoMTkpLGM9IiIuc3BsaXQ7dC5leHBvcnRzPWkoKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSkpP2Z1bmN0aW9uKHQpe3JldHVybiJTdHJpbmciPT1vKHQpP2MuY2FsbCh0LCIiKTpPYmplY3QodCl9Ok9iamVjdH0sZnVuY3Rpb24odCxyKXt2YXIgYT17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGEuY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe2lmKCFpKHQpKXJldHVybiB0O3ZhciBhLG87aWYociYmImZ1bmN0aW9uIj09dHlwZW9mKGE9dC50b1N0cmluZykmJiFpKG89YS5jYWxsKHQpKSlyZXR1cm4gbztpZigiZnVuY3Rpb24iPT10eXBlb2YoYT10LnZhbHVlT2YpJiYhaShvPWEuY2FsbCh0KSkpcmV0dXJuIG87aWYoIXImJiJmdW5jdGlvbiI9PXR5cGVvZihhPXQudG9TdHJpbmcpJiYhaShvPWEuY2FsbCh0KSkpcmV0dXJuIG87dGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdD9udWxsIT09dDoiZnVuY3Rpb24iPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQscil7dmFyIGE9e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7cmV0dXJuIGEuY2FsbCh0LHIpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTMpLG89YSgxNCksYz1hKDI1KTt0LmV4cG9ydHM9IWkmJiFvKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoYygiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMSksbz1hKDIyKSxjPWkuZG9jdW1lbnQsbD1vKGMpJiZvKGMuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBsP2MuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDEzKSxvPWEoMjcpLGM9YSgxNik7dC5leHBvcnRzPWk/ZnVuY3Rpb24odCxyLGEpe3JldHVybiBvLmYodCxyLGMoMSxhKSl9OmZ1bmN0aW9uKHQscixhKXt0W3JdPWE7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMyksbz1hKDI0KSxjPWEoMjgpLGw9YSgyMSksdT1PYmplY3QuZGVmaW5lUHJvcGVydHk7ci5mPWk/dTpmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LHIsYSl7Yyh0KTtyPWwociwhMCk7YyhhKTtpZihvKXRyeXtyZXR1cm4gdSh0LHIsYSl9Y2F0Y2godCl7fWlmKCJnZXQiaW4gYXx8InNldCJpbiBhKXRocm93IFR5cGVFcnJvcigiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQiKTsidmFsdWUiaW4gYSYmKHRbcl09YS52YWx1ZSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFpKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMSksbz1hKDI2KSxjPWEoMjMpLGw9YSgzMCksdT1hKDMxKSxoPWEoMzMpLGQ9aC5nZXQscD1oLmVuZm9yY2UsbT1TdHJpbmcoU3RyaW5nKS5zcGxpdCgiU3RyaW5nIik7KHQuZXhwb3J0cz1mdW5jdGlvbih0LHIsYSx1KXt2YXIgaD0hIXUmJiEhdS51bnNhZmUsZD0hIXUmJiEhdS5lbnVtZXJhYmxlLGc9ISF1JiYhIXUubm9UYXJnZXRHZXQ7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpeyJzdHJpbmciIT10eXBlb2Ygcnx8YyhhLCJuYW1lIil8fG8oYSwibmFtZSIscik7cChhKS5zb3VyY2U9bS5qb2luKCJzdHJpbmciPT10eXBlb2Ygcj9yOiIiKX1pZih0IT09aSl7aD8hZyYmdFtyXSYmKGQ9ITApOmRlbGV0ZSB0W3JdO2Q/dFtyXT1hOm8odCxyLGEpfWVsc2UgZD90W3JdPWE6bChyLGEpfSkoRnVuY3Rpb24ucHJvdG90eXBlLCJ0b1N0cmluZyIsKGZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMmJmQodGhpcykuc291cmNlfHx1KHRoaXMpfSkpfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMSksbz1hKDI2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXt0cnl7byhpLHQscil9Y2F0Y2goYSl7aVt0XT1yfXJldHVybiByfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMzIpLG89RnVuY3Rpb24udG9TdHJpbmc7ImZ1bmN0aW9uIiE9dHlwZW9mIGkuaW5zcGVjdFNvdXJjZSYmKGkuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKHQpfSk7dC5leHBvcnRzPWkuaW5zcGVjdFNvdXJjZX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTEpLG89YSgzMCksYz1pWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7dC5leHBvcnRzPWN9LGZ1bmN0aW9uKHQscixhKXt2YXIgaSxvLGMsbD1hKDM0KSx1PWEoMTEpLGg9YSgyMiksZD1hKDI2KSxwPWEoMjMpLG09YSgzNSksZz1hKDM5KSx5PXUuV2Vha01hcDtpZihsKXt2YXIgYj1uZXcgeSx2PWIuZ2V0LFM9Yi5oYXMsaz1iLnNldDtpPWZ1bmN0aW9uKHQscil7ay5jYWxsKGIsdCxyKTtyZXR1cm4gcn07bz1mdW5jdGlvbih0KXtyZXR1cm4gdi5jYWxsKGIsdCl8fHt9fTtjPWZ1bmN0aW9uKHQpe3JldHVybiBTLmNhbGwoYix0KX19ZWxzZXt2YXIgdz1tKCJzdGF0ZSIpO2dbd109ITA7aT1mdW5jdGlvbih0LHIpe2QodCx3LHIpO3JldHVybiByfTtvPWZ1bmN0aW9uKHQpe3JldHVybiBwKHQsdyk/dFt3XTp7fX07Yz1mdW5jdGlvbih0KXtyZXR1cm4gcCh0LHcpfX10LmV4cG9ydHM9e3NldDppLGdldDpvLGhhczpjLGVuZm9yY2U6ZnVuY3Rpb24odCl7cmV0dXJuIGModCk/byh0KTppKHQse30pfSxnZXR0ZXJGb3I6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBhO2lmKCFoKHIpfHwoYT1vKHIpKS50eXBlIT09dCl0aHJvdyBUeXBlRXJyb3IoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIit0KyIgcmVxdWlyZWQiKTtyZXR1cm4gYX19fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTEpLG89YSgzMSksYz1pLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBjJiYvbmF0aXZlIGNvZGUvLnRlc3QobyhjKSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDM2KSxvPWEoMzgpLGM9aSgia2V5cyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gY1t0XXx8KGNbdF09byh0KSl9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgzNyksbz1hKDMyKTsodC5leHBvcnRzPWZ1bmN0aW9uKHQscil7cmV0dXJuIG9bdF18fChvW3RdPXZvaWQgMCE9PXI/cjp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjYuNSIsbW9kZTppPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMjAgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPSExfSxmdW5jdGlvbih0LHIpe3ZhciBhPTAsaT1NYXRoLnJhbmRvbSgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4iU3ltYm9sKCIrU3RyaW5nKHZvaWQgMD09PXQ/IiI6dCkrIilfIisoKythK2kpLnRvU3RyaW5nKDM2KX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgyMyksbz1hKDQxKSxjPWEoMTIpLGw9YSgyNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7Zm9yKHZhciBhPW8ociksdT1sLmYsaD1jLmYsZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgcD1hW2RdO2kodCxwKXx8dSh0LHAsaChyLHApKX19fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSg0Miksbz1hKDQ0KSxjPWEoNTEpLGw9YSgyOCk7dC5leHBvcnRzPWkoIlJlZmxlY3QiLCJvd25LZXlzIil8fGZ1bmN0aW9uIG93bktleXModCl7dmFyIHI9by5mKGwodCkpLGE9Yy5mO3JldHVybiBhP3IuY29uY2F0KGEodCkpOnJ9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSg0Myksbz1hKDExKSxhRnVuY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2b2lkIDB9O3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/YUZ1bmN0aW9uKGlbdF0pfHxhRnVuY3Rpb24ob1t0XSk6aVt0XSYmaVt0XVtyXXx8b1t0XSYmb1t0XVtyXX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDExKTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoNDUpLG89YSg1MCkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTtyLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXModCl7cmV0dXJuIGkodCxvKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDIzKSxvPWEoMTcpLGM9YSg0NikuaW5kZXhPZixsPWEoMzkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3ZhciBhLHU9byh0KSxoPTAsZD1bXTtmb3IoYSBpbiB1KSFpKGwsYSkmJmkodSxhKSYmZC5wdXNoKGEpO2Zvcig7ci5sZW5ndGg+aDspaSh1LGE9cltoKytdKSYmKH5jKGQsYSl8fGQucHVzaChhKSk7cmV0dXJuIGR9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxNyksbz1hKDQ3KSxjPWEoNDkpLGNyZWF0ZU1ldGhvZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocixhLGwpe3ZhciB1LGg9aShyKSxkPW8oaC5sZW5ndGgpLHA9YyhsLGQpO2lmKHQmJmEhPWEpe2Zvcig7ZD5wOylpZigodT1oW3ArK10pIT11KXJldHVybiEwfWVsc2UgZm9yKDtkPnA7cCsrKWlmKCh0fHxwIGluIGgpJiZoW3BdPT09YSlyZXR1cm4gdHx8cHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmNyZWF0ZU1ldGhvZCghMCksaW5kZXhPZjpjcmVhdGVNZXRob2QoITEpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoNDgpLG89TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/byhpKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LHIpe3ZhciBhPU1hdGguY2VpbCxpPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/aTphKSh0KX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDQ4KSxvPU1hdGgubWF4LGM9TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7dmFyIGE9aSh0KTtyZXR1cm4gYTwwP28oYStyLDApOmMoYSxyKX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQscil7ci5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDE0KSxvPS8jfFwucHJvdG90eXBlXC4vLGlzRm9yY2VkPWZ1bmN0aW9uKHQscil7dmFyIGE9bFtjKHQpXTtyZXR1cm4gYT09aHx8YSE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiByP2kocik6ISFyKX0sYz1pc0ZvcmNlZC5ub3JtYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKG8sIi4iKS50b0xvd2VyQ2FzZSgpfSxsPWlzRm9yY2VkLmRhdGE9e30sdT1pc0ZvcmNlZC5OQVRJVkU9Ik4iLGg9aXNGb3JjZWQuUE9MWUZJTEw9IlAiO3QuZXhwb3J0cz1pc0ZvcmNlZH0sZnVuY3Rpb24odCxyLGEpe2EoNTQpO3ZhciBpPWEoNjEpO3QuZXhwb3J0cz1pKCJTdHJpbmciLCJzdGFydHNXaXRoIil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGksbz1hKDEwKSxjPWEoMTIpLmYsbD1hKDQ3KSx1PWEoNTUpLGg9YSgyMCksZD1hKDYwKSxwPWEoMzcpLG09IiIuc3RhcnRzV2l0aCxnPU1hdGgubWluLHk9ZCgic3RhcnRzV2l0aCIpO28oe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6ISghcCYmIXkmJiEhKGk9YyhTdHJpbmcucHJvdG90eXBlLCJzdGFydHNXaXRoIiksaSYmIWkud3JpdGFibGUpKSYmIXl9LHtzdGFydHNXaXRoOmZ1bmN0aW9uIHN0YXJ0c1dpdGgodCl7dmFyIHI9U3RyaW5nKGgodGhpcykpO3UodCk7dmFyIGE9bChnKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHIubGVuZ3RoKSksaT1TdHJpbmcodCk7cmV0dXJuIG0/bS5jYWxsKHIsaSxhKTpyLnNsaWNlKGEsYStpLmxlbmd0aCk9PT1pfX0pfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSg1Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKGkodCkpdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDIyKSxvPWEoMTkpLGM9YSg1NykoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciByO3JldHVybiBpKHQpJiYodm9pZCAwIT09KHI9dFtjXSk/ISFyOiJSZWdFeHAiPT1vKHQpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDExKSxvPWEoMzYpLGM9YSgyMyksbD1hKDM4KSx1PWEoNTgpLGg9YSg1OSksZD1vKCJ3a3MiKSxwPWkuU3ltYm9sLG09aD9wOnAmJnAud2l0aG91dFNldHRlcnx8bDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7YyhkLHQpfHwodSYmYyhwLHQpP2RbdF09cFt0XTpkW3RdPW0oIlN5bWJvbC4iK3QpKTtyZXR1cm4gZFt0XX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDE0KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhaSgoZnVuY3Rpb24oKXtyZXR1cm4hU3RyaW5nKFN5bWJvbCgpKX0pKX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoNTgpO3QuZXhwb3J0cz1pJiYhU3ltYm9sLnNoYW0mJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSg1NykoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciByPS8uLzt0cnl7Ii8uLyJbdF0ocil9Y2F0Y2goYSl7dHJ5e3JbaV09ITE7cmV0dXJuIi8uLyJbdF0ocil9Y2F0Y2godCl7fX1yZXR1cm4hMX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDExKSxvPWEoNjIpLGM9RnVuY3Rpb24uY2FsbDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyLGEpe3JldHVybiBvKGMsaVt0XS5wcm90b3R5cGVbcl0sYSl9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSg2Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXtpKHQpO2lmKHZvaWQgMD09PXIpcmV0dXJuIHQ7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5jYWxsKHIpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiB0LmNhbGwocixhKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihhLGkpe3JldHVybiB0LmNhbGwocixhLGkpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGEsaSxvKXtyZXR1cm4gdC5jYWxsKHIsYSxpLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShyLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxyKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIsYSl7YSg2NSk7dmFyIGk9YSg2MSk7dC5leHBvcnRzPWkoIlN0cmluZyIsImVuZHNXaXRoIil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGksbz1hKDEwKSxjPWEoMTIpLmYsbD1hKDQ3KSx1PWEoNTUpLGg9YSgyMCksZD1hKDYwKSxwPWEoMzcpLG09IiIuZW5kc1dpdGgsZz1NYXRoLm1pbix5PWQoImVuZHNXaXRoIik7byh7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohKCFwJiYheSYmISEoaT1jKFN0cmluZy5wcm90b3R5cGUsImVuZHNXaXRoIiksaSYmIWkud3JpdGFibGUpKSYmIXl9LHtlbmRzV2l0aDpmdW5jdGlvbiBlbmRzV2l0aCh0KXt2YXIgcj1TdHJpbmcoaCh0aGlzKSk7dSh0KTt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCxpPWwoci5sZW5ndGgpLG89dm9pZCAwPT09YT9pOmcobChhKSxpKSxjPVN0cmluZyh0KTtyZXR1cm4gbT9tLmNhbGwocixjLG8pOnIuc2xpY2Uoby1jLmxlbmd0aCxvKT09PWN9fSl9LGZ1bmN0aW9uKHQscixhKXthKDY3KTt2YXIgaT1hKDYxKTt0LmV4cG9ydHM9aSgiU3RyaW5nIiwiaW5jbHVkZXMiKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDEwKSxvPWEoNTUpLGM9YSgyMCk7aSh7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohYSg2MCkoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyh0KXtyZXR1cm4hIX5TdHJpbmcoYyh0aGlzKSkuaW5kZXhPZihvKHQpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxyLGEpe2EoNjkpO3ZhciBpPWEoNjEpO3QuZXhwb3J0cz1pKCJBcnJheSIsImluY2x1ZGVzIil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGk9YSgxMCksbz1hKDQ2KS5pbmNsdWRlcyxjPWEoNzApO2koe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohYSg3NSkoImluZGV4T2YiLHtBQ0NFU1NPUlM6ITAsMTowfSl9LHtpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyh0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pO2MoImluY2x1ZGVzIil9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDU3KSxvPWEoNzEpLGM9YSgyNyksbD1pKCJ1bnNjb3BhYmxlcyIpLHU9QXJyYXkucHJvdG90eXBlO251bGw9PXVbbF0mJmMuZih1LGwse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpvKG51bGwpfSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3VbbF1bdF09ITB9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGksbz1hKDI4KSxjPWEoNzIpLGw9YSg1MCksdT1hKDM5KSxoPWEoNzQpLGQ9YSgyNSkscD1hKDM1KSxtPXAoIklFX1BST1RPIiksRW1wdHlDb25zdHJ1Y3Rvcj1mdW5jdGlvbigpe30sc2NyaXB0VGFnPWZ1bmN0aW9uKHQpe3JldHVybiI8c2NyaXB0PiIrdCsiPFwvc2NyaXB0PiJ9LE51bGxQcm90b09iamVjdD1mdW5jdGlvbigpe3RyeXtpPWRvY3VtZW50LmRvbWFpbiYmbmV3IEFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIil9Y2F0Y2godCl7fU51bGxQcm90b09iamVjdD1pP2Z1bmN0aW9uKHQpe3Qud3JpdGUoc2NyaXB0VGFnKCIiKSk7dC5jbG9zZSgpO3ZhciByPXQucGFyZW50V2luZG93Lk9iamVjdDt0PW51bGw7cmV0dXJuIHJ9KGkpOmZ1bmN0aW9uKCl7dmFyIHQscj1kKCJpZnJhbWUiKTtyLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2guYXBwZW5kQ2hpbGQocik7ci5zcmM9U3RyaW5nKCJqYXZhc2NyaXB0OiIpOyh0PXIuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpO3Qud3JpdGUoc2NyaXB0VGFnKCJkb2N1bWVudC5GPU9iamVjdCIpKTt0LmNsb3NlKCk7cmV0dXJuIHQuRn0oKTtmb3IodmFyIHQ9bC5sZW5ndGg7dC0tOylkZWxldGUgTnVsbFByb3RvT2JqZWN0LnByb3RvdHlwZVtsW3RdXTtyZXR1cm4gTnVsbFByb3RvT2JqZWN0KCl9O3VbbV09ITA7dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uIGNyZWF0ZSh0LHIpe3ZhciBhO2lmKG51bGwhPT10KXtFbXB0eUNvbnN0cnVjdG9yLnByb3RvdHlwZT1vKHQpO2E9bmV3IEVtcHR5Q29uc3RydWN0b3I7RW1wdHlDb25zdHJ1Y3Rvci5wcm90b3R5cGU9bnVsbDthW21dPXR9ZWxzZSBhPU51bGxQcm90b09iamVjdCgpO3JldHVybiB2b2lkIDA9PT1yP2E6YyhhLHIpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTMpLG89YSgyNyksYz1hKDI4KSxsPWEoNzMpO3QuZXhwb3J0cz1pP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModCxyKXtjKHQpO2Zvcih2YXIgYSxpPWwociksdT1pLmxlbmd0aCxoPTA7dT5oOylvLmYodCxhPWlbaCsrXSxyW2FdKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDQ1KSxvPWEoNTApO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ga2V5cyh0KXtyZXR1cm4gaSh0LG8pfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoNDIpO3QuZXhwb3J0cz1pKCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIpfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMyksbz1hKDE0KSxjPWEoMjMpLGw9T2JqZWN0LmRlZmluZVByb3BlcnR5LHU9e30sdGhyb3dlcj1mdW5jdGlvbih0KXt0aHJvdyB0fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXtpZihjKHUsdCkpcmV0dXJuIHVbdF07cnx8KHI9e30pO3ZhciBhPVtdW3RdLGg9ISFjKHIsIkFDQ0VTU09SUyIpJiZyLkFDQ0VTU09SUyxkPWMociwwKT9yWzBdOnRocm93ZXIscD1jKHIsMSk/clsxXTp2b2lkIDA7cmV0dXJuIHVbdF09ISFhJiYhbygoZnVuY3Rpb24oKXtpZihoJiYhaSlyZXR1cm4hMDt2YXIgdD17bGVuZ3RoOi0xfTtoP2wodCwxLHtlbnVtZXJhYmxlOiEwLGdldDp0aHJvd2VyfSk6dFsxXT0xO2EuY2FsbCh0LGQscCl9KSl9fSxmdW5jdGlvbih0LHIsYSl7YSg3Nyk7YSg4OSk7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuQXJyYXkuZnJvbX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDc4KS5jaGFyQXQsbz1hKDMzKSxjPWEoNzkpLGw9by5zZXQsdT1vLmdldHRlckZvcigiU3RyaW5nIEl0ZXJhdG9yIik7YyhTdHJpbmcsIlN0cmluZyIsKGZ1bmN0aW9uKHQpe2wodGhpcyx7dHlwZToiU3RyaW5nIEl0ZXJhdG9yIixzdHJpbmc6U3RyaW5nKHQpLGluZGV4OjB9KX0pLChmdW5jdGlvbiBuZXh0KCl7dmFyIHQscj11KHRoaXMpLGE9ci5zdHJpbmcsbz1yLmluZGV4O2lmKG8+PWEubGVuZ3RoKXJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH07dD1pKGEsbyk7ci5pbmRleCs9dC5sZW5ndGg7cmV0dXJue3ZhbHVlOnQsZG9uZTohMX19KSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDQ4KSxvPWEoMjApLGNyZWF0ZU1ldGhvZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocixhKXt2YXIgYyxsLHU9U3RyaW5nKG8ocikpLGg9aShhKSxkPXUubGVuZ3RoO3JldHVybiBoPDB8fGg+PWQ/dD8iIjp2b2lkIDA6KGM9dS5jaGFyQ29kZUF0KGgpKTw1NTI5Nnx8Yz41NjMxOXx8aCsxPT09ZHx8KGw9dS5jaGFyQ29kZUF0KGgrMSkpPDU2MzIwfHxsPjU3MzQzP3Q/dS5jaGFyQXQoaCk6Yzp0P3Uuc2xpY2UoaCxoKzIpOmwtNTYzMjArKGMtNTUyOTY8PDEwKSs2NTUzNn19O3QuZXhwb3J0cz17Y29kZUF0OmNyZWF0ZU1ldGhvZCghMSksY2hhckF0OmNyZWF0ZU1ldGhvZCghMCl9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTApLG89YSg4MCksYz1hKDgyKSxsPWEoODcpLHU9YSg4NSksaD1hKDI2KSxkPWEoMjkpLHA9YSg1NyksbT1hKDM3KSxnPWEoODYpLHk9YSg4MSksYj15Lkl0ZXJhdG9yUHJvdG90eXBlLHY9eS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLFM9cCgiaXRlcmF0b3IiKSxyZXR1cm5UaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LHIsYSxwLHksayx3KXtvKGEscixwKTt2YXIgQyxfLHgsZ2V0SXRlcmF0aW9uTWV0aG9kPWZ1bmN0aW9uKHQpe2lmKHQ9PT15JiZQKXJldHVybiBQO2lmKCF2JiZ0IGluIFIpcmV0dXJuIFJbdF07c3dpdGNoKHQpe2Nhc2Uia2V5cyI6cmV0dXJuIGZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gbmV3IGEodGhpcyx0KX07Y2FzZSJ2YWx1ZXMiOnJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXtyZXR1cm4gbmV3IGEodGhpcyx0KX07Y2FzZSJlbnRyaWVzIjpyZXR1cm4gZnVuY3Rpb24gZW50cmllcygpe3JldHVybiBuZXcgYSh0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEodGhpcyl9fSxBPXIrIiBJdGVyYXRvciIsVD0hMSxSPXQucHJvdG90eXBlLEk9UltTXXx8UlsiQEBpdGVyYXRvciJdfHx5JiZSW3ldLFA9IXYmJkl8fGdldEl0ZXJhdGlvbk1ldGhvZCh5KSxPPSJBcnJheSI9PXImJlIuZW50cmllc3x8STtpZihPKXtDPWMoTy5jYWxsKG5ldyB0KSk7aWYoYiE9PU9iamVjdC5wcm90b3R5cGUmJkMubmV4dCl7bXx8YyhDKT09PWJ8fChsP2woQyxiKToiZnVuY3Rpb24iIT10eXBlb2YgQ1tTXSYmaChDLFMscmV0dXJuVGhpcykpO3UoQyxBLCEwLCEwKTttJiYoZ1tBXT1yZXR1cm5UaGlzKX19aWYoInZhbHVlcyI9PXkmJkkmJiJ2YWx1ZXMiIT09SS5uYW1lKXtUPSEwO1A9ZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIEkuY2FsbCh0aGlzKX19bSYmIXd8fFJbU109PT1QfHxoKFIsUyxQKTtnW3JdPVA7aWYoeSl7Xz17dmFsdWVzOmdldEl0ZXJhdGlvbk1ldGhvZCgidmFsdWVzIiksa2V5czprP1A6Z2V0SXRlcmF0aW9uTWV0aG9kKCJrZXlzIiksZW50cmllczpnZXRJdGVyYXRpb25NZXRob2QoImVudHJpZXMiKX07aWYodylmb3IoeCBpbiBfKSh2fHxUfHwhKHggaW4gUikpJiZkKFIseCxfW3hdKTtlbHNlIGkoe3RhcmdldDpyLHByb3RvOiEwLGZvcmNlZDp2fHxUfSxfKX1yZXR1cm4gX319LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGk9YSg4MSkuSXRlcmF0b3JQcm90b3R5cGUsbz1hKDcxKSxjPWEoMTYpLGw9YSg4NSksdT1hKDg2KSxyZXR1cm5UaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LHIsYSl7dmFyIGg9cisiIEl0ZXJhdG9yIjt0LnByb3RvdHlwZT1vKGkse25leHQ6YygxLGEpfSk7bCh0LGgsITEsITApO3VbaF09cmV0dXJuVGhpcztyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGksbyxjLGw9YSg4MiksdT1hKDI2KSxoPWEoMjMpLGQ9YSg1NykscD1hKDM3KSxtPWQoIml0ZXJhdG9yIiksZz0hMTtbXS5rZXlzJiYoIm5leHQiaW4oYz1bXS5rZXlzKCkpPyhvPWwobChjKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmKGk9byk6Zz0hMCk7bnVsbD09aSYmKGk9e30pO3B8fGgoaSxtKXx8dShpLG0sKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSk7dC5leHBvcnRzPXtJdGVyYXRvclByb3RvdHlwZTppLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6Z319LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDIzKSxvPWEoODMpLGM9YSgzNSksbD1hKDg0KSx1PWMoIklFX1BST1RPIiksaD1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1sP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXt0PW8odCk7cmV0dXJuIGkodCx1KT90W3VdOiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P2g6bnVsbH19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDIwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChpKHQpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDE0KTt0LmV4cG9ydHM9IWkoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gRigpe31GLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYpIT09Ri5wcm90b3R5cGV9KSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDI3KS5mLG89YSgyMyksYz1hKDU3KSgidG9TdHJpbmdUYWciKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyLGEpe3QmJiFvKHQ9YT90OnQucHJvdG90eXBlLGMpJiZpKHQsYyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnJ9KX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgyOCksbz1hKDg4KTt0LmV4cG9ydHM9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIHQscj0hMSxhPXt9O3RyeXsodD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLnNldCkuY2FsbChhLFtdKTtyPWEgaW5zdGFuY2VvZiBBcnJheX1jYXRjaCh0KXt9cmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKGEsYyl7aShhKTtvKGMpO3I/dC5jYWxsKGEsYyk6YS5fX3Byb3RvX189YztyZXR1cm4gYX19KCk6dm9pZCAwKX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighaSh0KSYmbnVsbCE9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIitTdHJpbmcodCkrIiBhcyBhIHByb3RvdHlwZSIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTApLG89YSg5MCk7aSh7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IWEoOTcpKChmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSkpfSx7ZnJvbTpvfSl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGk9YSg2Miksbz1hKDgzKSxjPWEoOTEpLGw9YSg5MiksdT1hKDQ3KSxoPWEoOTMpLGQ9YSg5NCk7dC5leHBvcnRzPWZ1bmN0aW9uIGZyb20odCl7dmFyIHIsYSxwLG0sZyx5LGI9byh0KSx2PSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6QXJyYXksUz1hcmd1bWVudHMubGVuZ3RoLGs9Uz4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsdz12b2lkIDAhPT1rLEM9ZChiKSxfPTA7dyYmKGs9aShrLFM+Mj9hcmd1bWVudHNbMl06dm9pZCAwLDIpKTtpZihudWxsPT1DfHx2PT1BcnJheSYmbChDKSl7YT1uZXcgdihyPXUoYi5sZW5ndGgpKTtmb3IoO3I+XztfKyspe3k9dz9rKGJbX10sXyk6YltfXTtoKGEsXyx5KX19ZWxzZXtnPShtPUMuY2FsbChiKSkubmV4dDthPW5ldyB2O2Zvcig7IShwPWcuY2FsbChtKSkuZG9uZTtfKyspe3k9dz9jKG0sayxbcC52YWx1ZSxfXSwhMCk6cC52YWx1ZTtoKGEsXyx5KX19YS5sZW5ndGg9XztyZXR1cm4gYX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDI4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyLGEsbyl7dHJ5e3JldHVybiBvP3IoaShhKVswXSxhWzFdKTpyKGEpfWNhdGNoKHIpe3ZhciBjPXQucmV0dXJuO3ZvaWQgMCE9PWMmJmkoYy5jYWxsKHQpKTt0aHJvdyByfX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDU3KSxvPWEoODYpLGM9aSgiaXRlcmF0b3IiKSxsPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihvLkFycmF5PT09dHx8bFtjXT09PXQpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDIxKSxvPWEoMjcpLGM9YSgxNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXt2YXIgbD1pKHIpO2wgaW4gdD9vLmYodCxsLGMoMCxhKSk6dFtsXT1hfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoOTUpLG89YSg4NiksYz1hKDU3KSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtjXXx8dFsiQEBpdGVyYXRvciJdfHxvW2kodCldfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoOTYpLG89YSgxOSksYz1hKDU3KSgidG9TdHJpbmdUYWciKSxsPSJBcmd1bWVudHMiPT1vKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWk/bzpmdW5jdGlvbih0KXt2YXIgcixhLGk7cmV0dXJuIHZvaWQgMD09PXQ/IlVuZGVmaW5lZCI6bnVsbD09PXQ/Ik51bGwiOiJzdHJpbmciPT10eXBlb2YoYT1mdW5jdGlvbih0LHIpe3RyeXtyZXR1cm4gdFtyXX1jYXRjaCh0KXt9fShyPU9iamVjdCh0KSxjKSk/YTpsP28ocik6Ik9iamVjdCI9PShpPW8ocikpJiYiZnVuY3Rpb24iPT10eXBlb2Ygci5jYWxsZWU/IkFyZ3VtZW50cyI6aX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT17fTtpW2EoNTcpKCJ0b1N0cmluZ1RhZyIpXT0ieiI7dC5leHBvcnRzPSJbb2JqZWN0IHpdIj09PVN0cmluZyhpKX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoNTcpKCJpdGVyYXRvciIpLG89ITE7dHJ5e3ZhciBjPTAsbD17bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOiEhYysrfX0scmV0dXJuOmZ1bmN0aW9uKCl7bz0hMH19O2xbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307QXJyYXkuZnJvbShsLChmdW5jdGlvbigpe3Rocm93IDJ9KSl9Y2F0Y2godCl7fXQuZXhwb3J0cz1mdW5jdGlvbih0LHIpe2lmKCFyJiYhbylyZXR1cm4hMTt2YXIgYT0hMTt0cnl7dmFyIGM9e307Y1tpXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6YT0hMH19fX07dChjKX1jYXRjaCh0KXt9cmV0dXJuIGF9fSxmdW5jdGlvbih0LHIsYSl7YSg5OSk7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuT2JqZWN0LmFzc2lnbn0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTApLG89YSgxMDApO2koe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuYXNzaWduIT09b30se2Fzc2lnbjpvfSl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGk9YSgxMyksbz1hKDE0KSxjPWEoNzMpLGw9YSg1MSksdT1hKDE1KSxoPWEoODMpLGQ9YSgxOCkscD1PYmplY3QuYXNzaWduLG09T2JqZWN0LmRlZmluZVByb3BlcnR5O3QuZXhwb3J0cz0hcHx8bygoZnVuY3Rpb24oKXtpZihpJiYxIT09cCh7YjoxfSxwKG0oe30sImEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe20odGhpcywiYiIse3ZhbHVlOjMsZW51bWVyYWJsZTohMX0pfX0pLHtiOjJ9KSkuYilyZXR1cm4hMDt2YXIgdD17fSxyPXt9LGE9U3ltYm9sKCk7dFthXT03OyJhYmNkZWZnaGlqa2xtbm9wcXJzdCIuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbdF09dH0pKTtyZXR1cm4gNyE9cCh7fSx0KVthXXx8ImFiY2RlZmdoaWprbG1ub3BxcnN0IiE9YyhwKHt9LHIpKS5qb2luKCIiKX0pKT9mdW5jdGlvbiBhc3NpZ24odCxyKXtmb3IodmFyIGE9aCh0KSxvPWFyZ3VtZW50cy5sZW5ndGgscD0xLG09bC5mLGc9dS5mO28+cDspZm9yKHZhciB5LGI9ZChhcmd1bWVudHNbcCsrXSksdj1tP2MoYikuY29uY2F0KG0oYikpOmMoYiksUz12Lmxlbmd0aCxrPTA7Uz5rOyl7eT12W2srK107aSYmIWcuY2FsbChiLHkpfHwoYVt5XT1iW3ldKX1yZXR1cm4gYX06cH0sZnVuY3Rpb24odCxyLGEpe2EoMTAyKTthKDEwMyk7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuT2JqZWN0LmZyb21FbnRyaWVzfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTcpLG89YSg3MCksYz1hKDg2KSxsPWEoMzMpLHU9YSg3OSksaD1sLnNldCxkPWwuZ2V0dGVyRm9yKCJBcnJheSBJdGVyYXRvciIpO3QuZXhwb3J0cz11KEFycmF5LCJBcnJheSIsKGZ1bmN0aW9uKHQscil7aCh0aGlzLHt0eXBlOiJBcnJheSBJdGVyYXRvciIsdGFyZ2V0OmkodCksaW5kZXg6MCxraW5kOnJ9KX0pLChmdW5jdGlvbigpe3ZhciB0PWQodGhpcykscj10LnRhcmdldCxhPXQua2luZCxpPXQuaW5kZXgrKztpZighcnx8aT49ci5sZW5ndGgpe3QudGFyZ2V0PXZvaWQgMDtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fXJldHVybiJrZXlzIj09YT97dmFsdWU6aSxkb25lOiExfToidmFsdWVzIj09YT97dmFsdWU6cltpXSxkb25lOiExfTp7dmFsdWU6W2kscltpXV0sZG9uZTohMX19KSwidmFsdWVzIik7Yy5Bcmd1bWVudHM9Yy5BcnJheTtvKCJrZXlzIik7bygidmFsdWVzIik7bygiZW50cmllcyIpfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMCksbz1hKDEwNCksYz1hKDkzKTtpKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMH0se2Zyb21FbnRyaWVzOmZ1bmN0aW9uIGZyb21FbnRyaWVzKHQpe3ZhciByPXt9O28odCwoZnVuY3Rpb24odCxhKXtjKHIsdCxhKX0pLHZvaWQgMCwhMCk7cmV0dXJuIHJ9fSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDI4KSxvPWEoOTIpLGM9YSg0NyksbD1hKDYyKSx1PWEoOTQpLGg9YSg5MSksUmVzdWx0PWZ1bmN0aW9uKHQscil7dGhpcy5zdG9wcGVkPXQ7dGhpcy5yZXN1bHQ9cn07KHQuZXhwb3J0cz1mdW5jdGlvbih0LHIsYSxkLHApe3ZhciBtLGcseSxiLHYsUyxrLHc9bChyLGEsZD8yOjEpO2lmKHApbT10O2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mKGc9dSh0KSkpdGhyb3cgVHlwZUVycm9yKCJUYXJnZXQgaXMgbm90IGl0ZXJhYmxlIik7aWYobyhnKSl7Zm9yKHk9MCxiPWModC5sZW5ndGgpO2I+eTt5KyspaWYoKHY9ZD93KGkoaz10W3ldKVswXSxrWzFdKTp3KHRbeV0pKSYmdiBpbnN0YW5jZW9mIFJlc3VsdClyZXR1cm4gdjtyZXR1cm4gbmV3IFJlc3VsdCghMSl9bT1nLmNhbGwodCl9Uz1tLm5leHQ7Zm9yKDshKGs9Uy5jYWxsKG0pKS5kb25lOylpZigib2JqZWN0Ij09dHlwZW9mKHY9aChtLHcsay52YWx1ZSxkKSkmJnYmJnYgaW5zdGFuY2VvZiBSZXN1bHQpcmV0dXJuIHY7cmV0dXJuIG5ldyBSZXN1bHQoITEpfSkuc3RvcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFJlc3VsdCghMCx0KX19LGZ1bmN0aW9uKHQscixhKXthKDEwNik7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuTWF0aC5sb2cyfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMCksbz1NYXRoLmxvZyxjPU1hdGguTE4yO2koe3RhcmdldDoiTWF0aCIsc3RhdDohMH0se2xvZzI6ZnVuY3Rpb24gbG9nMih0KXtyZXR1cm4gbyh0KS9jfX0pfSxmdW5jdGlvbih0LHIsYSl7YSgxMDgpO3ZhciBpPWEoNDMpO3QuZXhwb3J0cz1pLk51bWJlci5pc05hTn0sZnVuY3Rpb24odCxyLGEpe2EoMTApKHt0YXJnZXQ6Ik51bWJlciIsc3RhdDohMH0se2lzTmFOOmZ1bmN0aW9uIGlzTmFOKHQpe3JldHVybiB0IT10fX0pfSxmdW5jdGlvbih0LHIsYSl7YSgxMTApO3ZhciBpPWEoNDMpO3QuZXhwb3J0cz1pLk51bWJlci5pc0ludGVnZXJ9LGZ1bmN0aW9uKHQscixhKXthKDEwKSh7dGFyZ2V0OiJOdW1iZXIiLHN0YXQ6ITB9LHtpc0ludGVnZXI6YSgxMTEpfSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDIyKSxvPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uIGlzSW50ZWdlcih0KXtyZXR1cm4haSh0KSYmaXNGaW5pdGUodCkmJm8odCk9PT10fX0sZnVuY3Rpb24odCxyLGEpe2EoMTEzKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDExNCksbz1hKDExNiksYz1hKDE0KSxsPWkuYVR5cGVkQXJyYXksdT1pLmFUeXBlZEFycmF5Q29uc3RydWN0b3IsaD1pLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsZD1bXS5zbGljZTtoKCJzbGljZSIsKGZ1bmN0aW9uIHNsaWNlKHQscil7Zm9yKHZhciBhPWQuY2FsbChsKHRoaXMpLHQsciksaT1vKHRoaXMsdGhpcy5jb25zdHJ1Y3RvciksYz0wLGg9YS5sZW5ndGgscD1uZXcodShpKSkoaCk7aD5jOylwW2NdPWFbYysrXTtyZXR1cm4gcH0pLGMoKGZ1bmN0aW9uKCl7bmV3IEludDhBcnJheSgxKS5zbGljZSgpfSkpKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaSxvPWEoMTE1KSxjPWEoMTMpLGw9YSgxMSksdT1hKDIyKSxoPWEoMjMpLGQ9YSg5NSkscD1hKDI2KSxtPWEoMjkpLGc9YSgyNykuZix5PWEoODIpLGI9YSg4Nyksdj1hKDU3KSxTPWEoMzgpLGs9bC5JbnQ4QXJyYXksdz1rJiZrLnByb3RvdHlwZSxDPWwuVWludDhDbGFtcGVkQXJyYXksXz1DJiZDLnByb3RvdHlwZSx4PWsmJnkoayksQT13JiZ5KHcpLFQ9T2JqZWN0LnByb3RvdHlwZSxSPVQuaXNQcm90b3R5cGVPZixJPXYoInRvU3RyaW5nVGFnIiksUD1TKCJUWVBFRF9BUlJBWV9UQUciKSxPPW8mJiEhYiYmIk9wZXJhIiE9PWQobC5vcGVyYSksRT0hMSxCPXtJbnQ4QXJyYXk6MSxVaW50OEFycmF5OjEsVWludDhDbGFtcGVkQXJyYXk6MSxJbnQxNkFycmF5OjIsVWludDE2QXJyYXk6MixJbnQzMkFycmF5OjQsVWludDMyQXJyYXk6NCxGbG9hdDMyQXJyYXk6NCxGbG9hdDY0QXJyYXk6OH0saXNUeXBlZEFycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB1KHQpJiZoKEIsZCh0KSl9O2ZvcihpIGluIEIpbFtpXXx8KE89ITEpO2lmKCFPfHwiZnVuY3Rpb24iIT10eXBlb2YgeHx8eD09PUZ1bmN0aW9uLnByb3RvdHlwZSl7eD1mdW5jdGlvbiBUeXBlZEFycmF5KCl7dGhyb3cgVHlwZUVycm9yKCJJbmNvcnJlY3QgaW52b2NhdGlvbiIpfTtpZihPKWZvcihpIGluIEIpbFtpXSYmYihsW2ldLHgpfWlmKCFPfHwhQXx8QT09PVQpe0E9eC5wcm90b3R5cGU7aWYoTylmb3IoaSBpbiBCKWxbaV0mJmIobFtpXS5wcm90b3R5cGUsQSl9TyYmeShfKSE9PUEmJmIoXyxBKTtpZihjJiYhaChBLEkpKXtFPSEwO2coQSxJLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdSh0aGlzKT90aGlzW1BdOnZvaWQgMH19KTtmb3IoaSBpbiBCKWxbaV0mJnAobFtpXSxQLGkpfXQuZXhwb3J0cz17TkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzpPLFRZUEVEX0FSUkFZX1RBRzpFJiZQLGFUeXBlZEFycmF5OmZ1bmN0aW9uKHQpe2lmKGlzVHlwZWRBcnJheSh0KSlyZXR1cm4gdDt0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheSIpfSxhVHlwZWRBcnJheUNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe2lmKGIpe2lmKFIuY2FsbCh4LHQpKXJldHVybiB0fWVsc2UgZm9yKHZhciByIGluIEIpaWYoaChCLGkpKXt2YXIgYT1sW3JdO2lmKGEmJih0PT09YXx8Ui5jYWxsKGEsdCkpKXJldHVybiB0fXRocm93IFR5cGVFcnJvcigiVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIil9LGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6ZnVuY3Rpb24odCxyLGEpe2lmKGMpe2lmKGEpZm9yKHZhciBpIGluIEIpe3ZhciBvPWxbaV07byYmaChvLnByb3RvdHlwZSx0KSYmZGVsZXRlIG8ucHJvdG90eXBlW3RdfUFbdF0mJiFhfHxtKEEsdCxhP3I6TyYmd1t0XXx8cil9fSxleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOmZ1bmN0aW9uKHQscixhKXt2YXIgaSxvO2lmKGMpe2lmKGIpe2lmKGEpZm9yKGkgaW4gQikobz1sW2ldKSYmaChvLHQpJiZkZWxldGUgb1t0XTtpZih4W3RdJiYhYSlyZXR1cm47dHJ5e3JldHVybiBtKHgsdCxhP3I6TyYma1t0XXx8cil9Y2F0Y2godCl7fX1mb3IoaSBpbiBCKSEobz1sW2ldKXx8b1t0XSYmIWF8fG0obyx0LHIpfX0saXNWaWV3OmZ1bmN0aW9uIGlzVmlldyh0KXt2YXIgcj1kKHQpO3JldHVybiJEYXRhVmlldyI9PT1yfHxoKEIscil9LGlzVHlwZWRBcnJheTppc1R5cGVkQXJyYXksVHlwZWRBcnJheTp4LFR5cGVkQXJyYXlQcm90b3R5cGU6QX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJ1bmRlZmluZWQiIT10eXBlb2YgRGF0YVZpZXd9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDI4KSxvPWEoNjMpLGM9YSg1NykoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXt2YXIgYSxsPWkodCkuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PWx8fG51bGw9PShhPWkobClbY10pP3I6byhhKX19LGZ1bmN0aW9uKHQscixhKXthKDExOCk7YSg3Nyk7YSgxMjApO2EoMTIyKTthKDEzNik7YSgxMzcpO3ZhciBpPWEoNDMpO3QuZXhwb3J0cz1pLlByb21pc2V9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDk2KSxvPWEoMjkpLGM9YSgxMTkpO2l8fG8oT2JqZWN0LnByb3RvdHlwZSwidG9TdHJpbmciLGMse3Vuc2FmZTohMH0pfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoOTYpLG89YSg5NSk7dC5leHBvcnRzPWk/e30udG9TdHJpbmc6ZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4iW29iamVjdCAiK28odGhpcykrIl0ifX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTEpLG89YSgxMjEpLGM9YSgxMDIpLGw9YSgyNiksdT1hKDU3KSxoPXUoIml0ZXJhdG9yIiksZD11KCJ0b1N0cmluZ1RhZyIpLHA9Yy52YWx1ZXM7Zm9yKHZhciBtIGluIG8pe3ZhciBnPWlbbV0seT1nJiZnLnByb3RvdHlwZTtpZih5KXtpZih5W2hdIT09cCl0cnl7bCh5LGgscCl9Y2F0Y2godCl7eVtoXT1wfXlbZF18fGwoeSxkLG0pO2lmKG9bbV0pZm9yKHZhciBiIGluIGMpaWYoeVtiXSE9PWNbYl0pdHJ5e2woeSxiLGNbYl0pfWNhdGNoKHQpe3lbYl09Y1tiXX19fX0sZnVuY3Rpb24odCxyKXt0LmV4cG9ydHM9e0NTU1J1bGVMaXN0OjAsQ1NTU3R5bGVEZWNsYXJhdGlvbjowLENTU1ZhbHVlTGlzdDowLENsaWVudFJlY3RMaXN0OjAsRE9NUmVjdExpc3Q6MCxET01TdHJpbmdMaXN0OjAsRE9NVG9rZW5MaXN0OjEsRGF0YVRyYW5zZmVySXRlbUxpc3Q6MCxGaWxlTGlzdDowLEhUTUxBbGxDb2xsZWN0aW9uOjAsSFRNTENvbGxlY3Rpb246MCxIVE1MRm9ybUVsZW1lbnQ6MCxIVE1MU2VsZWN0RWxlbWVudDowLE1lZGlhTGlzdDowLE1pbWVUeXBlQXJyYXk6MCxOYW1lZE5vZGVNYXA6MCxOb2RlTGlzdDoxLFBhaW50UmVxdWVzdExpc3Q6MCxQbHVnaW46MCxQbHVnaW5BcnJheTowLFNWR0xlbmd0aExpc3Q6MCxTVkdOdW1iZXJMaXN0OjAsU1ZHUGF0aFNlZ0xpc3Q6MCxTVkdQb2ludExpc3Q6MCxTVkdTdHJpbmdMaXN0OjAsU1ZHVHJhbnNmb3JtTGlzdDowLFNvdXJjZUJ1ZmZlckxpc3Q6MCxTdHlsZVNoZWV0TGlzdDowLFRleHRUcmFja0N1ZUxpc3Q6MCxUZXh0VHJhY2tMaXN0OjAsVG91Y2hMaXN0OjB9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpLG8sYyxsLHU9YSgxMCksaD1hKDM3KSxkPWEoMTEpLHA9YSg0MiksbT1hKDEyMyksZz1hKDI5KSx5PWEoMTI0KSxiPWEoODUpLHY9YSgxMjUpLFM9YSgyMiksaz1hKDYzKSx3PWEoMTI2KSxDPWEoMTkpLF89YSgzMSkseD1hKDEwNCksQT1hKDk3KSxUPWEoMTE2KSxSPWEoMTI3KS5zZXQsST1hKDEzMCksUD1hKDEzMSksTz1hKDEzMyksRT1hKDEzMiksQj1hKDEzNCksRD1hKDMzKSxNPWEoNTIpLEw9YSg1NyksTj1hKDEzNSksVT1MKCJzcGVjaWVzIiksaj0iUHJvbWlzZSIscT1ELmdldCxXPUQuc2V0LHo9RC5nZXR0ZXJGb3IoaiksRz1tLEg9ZC5UeXBlRXJyb3IsVj1kLmRvY3VtZW50LFg9ZC5wcm9jZXNzLFk9cCgiZmV0Y2giKSxLPUUuZixKPUssWj0icHJvY2VzcyI9PUMoWCksUT0hIShWJiZWLmNyZWF0ZUV2ZW50JiZkLmRpc3BhdGNoRXZlbnQpLCQ9TShqLChmdW5jdGlvbigpe2lmKCEoXyhHKSE9PVN0cmluZyhHKSkpe2lmKDY2PT09TilyZXR1cm4hMDtpZighWiYmImZ1bmN0aW9uIiE9dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudClyZXR1cm4hMH1pZihoJiYhRy5wcm90b3R5cGUuZmluYWxseSlyZXR1cm4hMDtpZihOPj01MSYmL25hdGl2ZSBjb2RlLy50ZXN0KEcpKXJldHVybiExO3ZhciB0PUcucmVzb2x2ZSgxKSxGYWtlUHJvbWlzZT1mdW5jdGlvbih0KXt0KChmdW5jdGlvbigpe30pLChmdW5jdGlvbigpe30pKX07KHQuY29uc3RydWN0b3I9e30pW1VdPUZha2VQcm9taXNlO3JldHVybiEodC50aGVuKChmdW5jdGlvbigpe30pKWluc3RhbmNlb2YgRmFrZVByb21pc2UpfSkpLGVlPSR8fCFBKChmdW5jdGlvbih0KXtHLmFsbCh0KS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9KSksaXNUaGVuYWJsZT1mdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4hKCFTKHQpfHwiZnVuY3Rpb24iIT10eXBlb2Yocj10LnRoZW4pKSYmcn0sbm90aWZ5PWZ1bmN0aW9uKHQscixhKXtpZighci5ub3RpZmllZCl7ci5ub3RpZmllZD0hMDt2YXIgaT1yLnJlYWN0aW9ucztJKChmdW5jdGlvbigpe2Zvcih2YXIgbz1yLnZhbHVlLGM9MT09ci5zdGF0ZSxsPTA7aS5sZW5ndGg+bDspe3ZhciB1LGgsZCxwPWlbbCsrXSxtPWM/cC5vazpwLmZhaWwsZz1wLnJlc29sdmUseT1wLnJlamVjdCxiPXAuZG9tYWluO3RyeXtpZihtKXtpZighYyl7Mj09PXIucmVqZWN0aW9uJiZvbkhhbmRsZVVuaGFuZGxlZCh0LHIpO3IucmVqZWN0aW9uPTF9aWYoITA9PT1tKXU9bztlbHNle2ImJmIuZW50ZXIoKTt1PW0obyk7aWYoYil7Yi5leGl0KCk7ZD0hMH19dT09PXAucHJvbWlzZT95KEgoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KGg9aXNUaGVuYWJsZSh1KSk/aC5jYWxsKHUsZyx5KTpnKHUpfWVsc2UgeShvKX1jYXRjaCh0KXtiJiYhZCYmYi5leGl0KCk7eSh0KX19ci5yZWFjdGlvbnM9W107ci5ub3RpZmllZD0hMTthJiYhci5yZWplY3Rpb24mJm9uVW5oYW5kbGVkKHQscil9KSl9fSxkaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKHQscixhKXt2YXIgaSxvO2lmKFEpeyhpPVYuY3JlYXRlRXZlbnQoIkV2ZW50IikpLnByb21pc2U9cjtpLnJlYXNvbj1hO2kuaW5pdEV2ZW50KHQsITEsITApO2QuZGlzcGF0Y2hFdmVudChpKX1lbHNlIGk9e3Byb21pc2U6cixyZWFzb246YX07KG89ZFsib24iK3RdKT9vKGkpOiJ1bmhhbmRsZWRyZWplY3Rpb24iPT09dCYmTygiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixhKX0sb25VbmhhbmRsZWQ9ZnVuY3Rpb24odCxyKXtSLmNhbGwoZCwoZnVuY3Rpb24oKXt2YXIgYSxpPXIudmFsdWU7aWYoaXNVbmhhbmRsZWQocikpe2E9QigoZnVuY3Rpb24oKXtaP1guZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixpLHQpOmRpc3BhdGNoRXZlbnQoInVuaGFuZGxlZHJlamVjdGlvbiIsdCxpKX0pKTtyLnJlamVjdGlvbj1afHxpc1VuaGFuZGxlZChyKT8yOjE7aWYoYS5lcnJvcil0aHJvdyBhLnZhbHVlfX0pKX0saXNVbmhhbmRsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEhPT10LnJlamVjdGlvbiYmIXQucGFyZW50fSxvbkhhbmRsZVVuaGFuZGxlZD1mdW5jdGlvbih0LHIpe1IuY2FsbChkLChmdW5jdGlvbigpe1o/WC5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpkaXNwYXRjaEV2ZW50KCJyZWplY3Rpb25oYW5kbGVkIix0LHIudmFsdWUpfSkpfSxiaW5kPWZ1bmN0aW9uKHQscixhLGkpe3JldHVybiBmdW5jdGlvbihvKXt0KHIsYSxvLGkpfX0saW50ZXJuYWxSZWplY3Q9ZnVuY3Rpb24odCxyLGEsaSl7aWYoIXIuZG9uZSl7ci5kb25lPSEwO2kmJihyPWkpO3IudmFsdWU9YTtyLnN0YXRlPTI7bm90aWZ5KHQsciwhMCl9fSxpbnRlcm5hbFJlc29sdmU9ZnVuY3Rpb24odCxyLGEsaSl7aWYoIXIuZG9uZSl7ci5kb25lPSEwO2kmJihyPWkpO3RyeXtpZih0PT09YSl0aHJvdyBIKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpO3ZhciBvPWlzVGhlbmFibGUoYSk7aWYobylJKChmdW5jdGlvbigpe3ZhciBpPXtkb25lOiExfTt0cnl7by5jYWxsKGEsYmluZChpbnRlcm5hbFJlc29sdmUsdCxpLHIpLGJpbmQoaW50ZXJuYWxSZWplY3QsdCxpLHIpKX1jYXRjaChhKXtpbnRlcm5hbFJlamVjdCh0LGksYSxyKX19KSk7ZWxzZXtyLnZhbHVlPWE7ci5zdGF0ZT0xO25vdGlmeSh0LHIsITEpfX1jYXRjaChhKXtpbnRlcm5hbFJlamVjdCh0LHtkb25lOiExfSxhLHIpfX19O2lmKCQpe0c9ZnVuY3Rpb24gUHJvbWlzZSh0KXt3KHRoaXMsRyxqKTtrKHQpO2kuY2FsbCh0aGlzKTt2YXIgcj1xKHRoaXMpO3RyeXt0KGJpbmQoaW50ZXJuYWxSZXNvbHZlLHRoaXMsciksYmluZChpbnRlcm5hbFJlamVjdCx0aGlzLHIpKX1jYXRjaCh0KXtpbnRlcm5hbFJlamVjdCh0aGlzLHIsdCl9fTsoaT1mdW5jdGlvbiBQcm9taXNlKHQpe1codGhpcyx7dHlwZTpqLGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpbXSxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT15KEcucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uIHRoZW4odCxyKXt2YXIgYT16KHRoaXMpLGk9SyhUKHRoaXMsRykpO2kub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHQ7aS5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiByJiZyO2kuZG9tYWluPVo/WC5kb21haW46dm9pZCAwO2EucGFyZW50PSEwO2EucmVhY3Rpb25zLnB1c2goaSk7MCE9YS5zdGF0ZSYmbm90aWZ5KHRoaXMsYSwhMSk7cmV0dXJuIGkucHJvbWlzZX0sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsdCl9fSk7bz1mdW5jdGlvbigpe3ZhciB0PW5ldyBpLHI9cSh0KTt0aGlzLnByb21pc2U9dDt0aGlzLnJlc29sdmU9YmluZChpbnRlcm5hbFJlc29sdmUsdCxyKTt0aGlzLnJlamVjdD1iaW5kKGludGVybmFsUmVqZWN0LHQscil9O0UuZj1LPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09R3x8dD09PWM/bmV3IG8odCk6Sih0KX07aWYoIWgmJiJmdW5jdGlvbiI9PXR5cGVvZiBtKXtsPW0ucHJvdG90eXBlLnRoZW47ZyhtLnByb3RvdHlwZSwidGhlbiIsKGZ1bmN0aW9uIHRoZW4odCxyKXt2YXIgYT10aGlzO3JldHVybiBuZXcgRygoZnVuY3Rpb24odCxyKXtsLmNhbGwoYSx0LHIpfSkpLnRoZW4odCxyKX0pLHt1bnNhZmU6ITB9KTsiZnVuY3Rpb24iPT10eXBlb2YgWSYmdSh7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24gZmV0Y2godCl7cmV0dXJuIFAoRyxZLmFwcGx5KGQsYXJndW1lbnRzKSl9fSl9fXUoe2dsb2JhbDohMCx3cmFwOiEwLGZvcmNlZDokfSx7UHJvbWlzZTpHfSk7YihHLGosITEsITApO3Yoaik7Yz1wKGopO3Uoe3RhcmdldDpqLHN0YXQ6ITAsZm9yY2VkOiR9LHtyZWplY3Q6ZnVuY3Rpb24gcmVqZWN0KHQpe3ZhciByPUsodGhpcyk7ci5yZWplY3QuY2FsbCh2b2lkIDAsdCk7cmV0dXJuIHIucHJvbWlzZX19KTt1KHt0YXJnZXQ6aixzdGF0OiEwLGZvcmNlZDpofHwkfSx7cmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlKHQpe3JldHVybiBQKGgmJnRoaXM9PT1jP0c6dGhpcyx0KX19KTt1KHt0YXJnZXQ6aixzdGF0OiEwLGZvcmNlZDplZX0se2FsbDpmdW5jdGlvbiBhbGwodCl7dmFyIHI9dGhpcyxhPUsociksaT1hLnJlc29sdmUsbz1hLnJlamVjdCxjPUIoKGZ1bmN0aW9uKCl7dmFyIGE9ayhyLnJlc29sdmUpLGM9W10sbD0wLHU9MTt4KHQsKGZ1bmN0aW9uKHQpe3ZhciBoPWwrKyxkPSExO2MucHVzaCh2b2lkIDApO3UrKzthLmNhbGwocix0KS50aGVuKChmdW5jdGlvbih0KXtpZighZCl7ZD0hMDtjW2hdPXQ7LS11fHxpKGMpfX0pLG8pfSkpOy0tdXx8aShjKX0pKTtjLmVycm9yJiZvKGMudmFsdWUpO3JldHVybiBhLnByb21pc2V9LHJhY2U6ZnVuY3Rpb24gcmFjZSh0KXt2YXIgcj10aGlzLGE9SyhyKSxpPWEucmVqZWN0LG89QigoZnVuY3Rpb24oKXt2YXIgbz1rKHIucmVzb2x2ZSk7eCh0LChmdW5jdGlvbih0KXtvLmNhbGwocix0KS50aGVuKGEucmVzb2x2ZSxpKX0pKX0pKTtvLmVycm9yJiZpKG8udmFsdWUpO3JldHVybiBhLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDExKTt0LmV4cG9ydHM9aS5Qcm9taXNlfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgyOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXtmb3IodmFyIG8gaW4gcilpKHQsbyxyW29dLGEpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDQyKSxvPWEoMjcpLGM9YSg1NyksbD1hKDEzKSx1PWMoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIHI9aSh0KSxhPW8uZjtsJiZyJiYhclt1XSYmYShyLHUse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LGZ1bmN0aW9uKHQscil7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCAiKyhhP2ErIiAiOiIiKSsiaW52b2NhdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpLG8sYyxsPWEoMTEpLHU9YSgxNCksaD1hKDE5KSxkPWEoNjIpLHA9YSg3NCksbT1hKDI1KSxnPWEoMTI4KSx5PWwubG9jYXRpb24sYj1sLnNldEltbWVkaWF0ZSx2PWwuY2xlYXJJbW1lZGlhdGUsUz1sLnByb2Nlc3Msaz1sLk1lc3NhZ2VDaGFubmVsLHc9bC5EaXNwYXRjaCxDPTAsXz17fSxydW49ZnVuY3Rpb24odCl7aWYoXy5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIHI9X1t0XTtkZWxldGUgX1t0XTtyKCl9fSxydW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cnVuKHQpfX0sbGlzdGVuZXI9ZnVuY3Rpb24odCl7cnVuKHQuZGF0YSl9LHBvc3Q9ZnVuY3Rpb24odCl7bC5wb3N0TWVzc2FnZSh0KyIiLHkucHJvdG9jb2wrIi8vIit5Lmhvc3QpfTtpZighYnx8IXYpe2I9ZnVuY3Rpb24gc2V0SW1tZWRpYXRlKHQpe2Zvcih2YXIgcj1bXSxhPTE7YXJndW1lbnRzLmxlbmd0aD5hOylyLnB1c2goYXJndW1lbnRzW2ErK10pO19bKytDXT1mdW5jdGlvbigpeygiZnVuY3Rpb24iPT10eXBlb2YgdD90OkZ1bmN0aW9uKHQpKS5hcHBseSh2b2lkIDAscil9O2koQyk7cmV0dXJuIEN9O3Y9ZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUodCl7ZGVsZXRlIF9bdF19O2lmKCJwcm9jZXNzIj09aChTKSlpPWZ1bmN0aW9uKHQpe1MubmV4dFRpY2socnVubmVyKHQpKX07ZWxzZSBpZih3JiZ3Lm5vdylpPWZ1bmN0aW9uKHQpe3cubm93KHJ1bm5lcih0KSl9O2Vsc2UgaWYoayYmIWcpe2M9KG89bmV3IGspLnBvcnQyO28ucG9ydDEub25tZXNzYWdlPWxpc3RlbmVyO2k9ZChjLnBvc3RNZXNzYWdlLGMsMSl9ZWxzZSBpZighbC5hZGRFdmVudExpc3RlbmVyfHwiZnVuY3Rpb24iIT10eXBlb2YgcG9zdE1lc3NhZ2V8fGwuaW1wb3J0U2NyaXB0c3x8dShwb3N0KXx8ImZpbGU6Ij09PXkucHJvdG9jb2wpaT0ib25yZWFkeXN0YXRlY2hhbmdlImluIG0oInNjcmlwdCIpP2Z1bmN0aW9uKHQpe3AuYXBwZW5kQ2hpbGQobSgic2NyaXB0IikpLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3AucmVtb3ZlQ2hpbGQodGhpcyk7cnVuKHQpfX06ZnVuY3Rpb24odCl7c2V0VGltZW91dChydW5uZXIodCksMCl9O2Vsc2V7aT1wb3N0O2wuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbGlzdGVuZXIsITEpfX10LmV4cG9ydHM9e3NldDpiLGNsZWFyOnZ9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMjkpO3QuZXhwb3J0cz0vKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QoaSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDQyKTt0LmV4cG9ydHM9aSgibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LHIsYSl7dmFyIGksbyxjLGwsdSxoLGQscCxtPWEoMTEpLGc9YSgxMikuZix5PWEoMTkpLGI9YSgxMjcpLnNldCx2PWEoMTI4KSxTPW0uTXV0YXRpb25PYnNlcnZlcnx8bS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLGs9bS5wcm9jZXNzLHc9bS5Qcm9taXNlLEM9InByb2Nlc3MiPT15KGspLF89ZyhtLCJxdWV1ZU1pY3JvdGFzayIpLHg9XyYmXy52YWx1ZTtpZigheCl7aT1mdW5jdGlvbigpe3ZhciB0LHI7QyYmKHQ9ay5kb21haW4pJiZ0LmV4aXQoKTtmb3IoO287KXtyPW8uZm47bz1vLm5leHQ7dHJ5e3IoKX1jYXRjaCh0KXtvP2woKTpjPXZvaWQgMDt0aHJvdyB0fX1jPXZvaWQgMDt0JiZ0LmVudGVyKCl9O2lmKEMpbD1mdW5jdGlvbigpe2submV4dFRpY2soaSl9O2Vsc2UgaWYoUyYmIXYpe3U9ITA7aD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IFMoaSkub2JzZXJ2ZShoLHtjaGFyYWN0ZXJEYXRhOiEwfSk7bD1mdW5jdGlvbigpe2guZGF0YT11PSF1fX1lbHNlIGlmKHcmJncucmVzb2x2ZSl7ZD13LnJlc29sdmUodm9pZCAwKTtwPWQudGhlbjtsPWZ1bmN0aW9uKCl7cC5jYWxsKGQsaSl9fWVsc2UgbD1mdW5jdGlvbigpe2IuY2FsbChtLGkpfX10LmV4cG9ydHM9eHx8ZnVuY3Rpb24odCl7dmFyIHI9e2ZuOnQsbmV4dDp2b2lkIDB9O2MmJihjLm5leHQ9cik7aWYoIW8pe289cjtsKCl9Yz1yfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMjgpLG89YSgyMiksYz1hKDEzMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7aSh0KTtpZihvKHIpJiZyLmNvbnN0cnVjdG9yPT09dClyZXR1cm4gcjt2YXIgYT1jLmYodCk7KDAsYS5yZXNvbHZlKShyKTtyZXR1cm4gYS5wcm9taXNlfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDYzKSxQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbih0KXt2YXIgcixhO3RoaXMucHJvbWlzZT1uZXcgdCgoZnVuY3Rpb24odCxpKXtpZih2b2lkIDAhPT1yfHx2b2lkIDAhPT1hKXRocm93IFR5cGVFcnJvcigiQmFkIFByb21pc2UgY29uc3RydWN0b3IiKTtyPXQ7YT1pfSkpO3RoaXMucmVzb2x2ZT1pKHIpO3RoaXMucmVqZWN0PWkoYSl9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkodCl9fSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7dmFyIGE9aS5jb25zb2xlO2EmJmEuZXJyb3ImJigxPT09YXJndW1lbnRzLmxlbmd0aD9hLmVycm9yKHQpOmEuZXJyb3IodCxyKSl9fSxmdW5jdGlvbih0LHIpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJue2Vycm9yOiExLHZhbHVlOnQoKX19Y2F0Y2godCl7cmV0dXJue2Vycm9yOiEwLHZhbHVlOnR9fX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaSxvLGM9YSgxMSksbD1hKDEyOSksdT1jLnByb2Nlc3MsaD11JiZ1LnZlcnNpb25zLGQ9aCYmaC52ODtkP289KGk9ZC5zcGxpdCgiLiIpKVswXStpWzFdOmwmJighKGk9bC5tYXRjaCgvRWRnZVwvKFxkKykvKSl8fGlbMV0+PTc0KSYmKGk9bC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pKSYmKG89aVsxXSk7dC5leHBvcnRzPW8mJitvfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTApLG89YSg2MyksYz1hKDEzMiksbD1hKDEzNCksdT1hKDEwNCk7aSh7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YWxsU2V0dGxlZDpmdW5jdGlvbiBhbGxTZXR0bGVkKHQpe3ZhciByPXRoaXMsYT1jLmYociksaT1hLnJlc29sdmUsaD1hLnJlamVjdCxkPWwoKGZ1bmN0aW9uKCl7dmFyIGE9byhyLnJlc29sdmUpLGM9W10sbD0wLGg9MTt1KHQsKGZ1bmN0aW9uKHQpe3ZhciBvPWwrKyx1PSExO2MucHVzaCh2b2lkIDApO2grKzthLmNhbGwocix0KS50aGVuKChmdW5jdGlvbih0KXtpZighdSl7dT0hMDtjW29dPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6dH07LS1ofHxpKGMpfX0pLChmdW5jdGlvbih0KXtpZighdSl7dT0hMDtjW29dPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246dH07LS1ofHxpKGMpfX0pKX0pKTstLWh8fGkoYyl9KSk7ZC5lcnJvciYmaChkLnZhbHVlKTtyZXR1cm4gYS5wcm9taXNlfX0pfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTApLG89YSgzNyksYz1hKDEyMyksbD1hKDE0KSx1PWEoNDIpLGg9YSgxMTYpLGQ9YSgxMzEpLHA9YSgyOSk7aSh7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohIWMmJmwoKGZ1bmN0aW9uKCl7Yy5wcm90b3R5cGUuZmluYWxseS5jYWxsKHt0aGVuOmZ1bmN0aW9uKCl7fX0sKGZ1bmN0aW9uKCl7fSkpfSkpfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgcj1oKHRoaXMsdSgiUHJvbWlzZSIpKSxhPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4oYT9mdW5jdGlvbihhKXtyZXR1cm4gZChyLHQoKSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKX06dCxhP2Z1bmN0aW9uKGEpe3JldHVybiBkKHIsdCgpKS50aGVuKChmdW5jdGlvbigpe3Rocm93IGF9KSl9OnQpfX0pO298fCJmdW5jdGlvbiIhPXR5cGVvZiBjfHxjLnByb3RvdHlwZS5maW5hbGx5fHxwKGMucHJvdG90eXBlLCJmaW5hbGx5Iix1KCJQcm9taXNlIikucHJvdG90eXBlLmZpbmFsbHkpfSxmdW5jdGlvbih0LHIsYSl7YSgxMzkpO2EoMTQ0KTthKDE0Mik7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuVVJMfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO2EoNzcpO3ZhciBpLG89YSgxMCksYz1hKDEzKSxsPWEoMTQwKSx1PWEoMTEpLGg9YSg3MiksZD1hKDI5KSxwPWEoMTI2KSxtPWEoMjMpLGc9YSgxMDApLHk9YSg5MCksYj1hKDc4KS5jb2RlQXQsdj1hKDE0MSksUz1hKDg1KSxrPWEoMTQyKSx3PWEoMzMpLEM9dS5VUkwsXz1rLlVSTFNlYXJjaFBhcmFtcyx4PWsuZ2V0U3RhdGUsQT13LnNldCxUPXcuZ2V0dGVyRm9yKCJVUkwiKSxSPU1hdGguZmxvb3IsST1NYXRoLnBvdyxQPS9bQS1aYS16XS8sTz0vW1xkKy0uQS1aYS16XS8sRT0vXGQvLEI9L14oMHh8MFgpLyxEPS9eWzAtN10rJC8sTT0vXlxkKyQvLEw9L15bXGRBLUZhLWZdKyQvLE49L1tcdTAwMDBcdTAwMDlcdTAwMEFcdTAwMEQgIyUvOj9AW1xcXV0vLFU9L1tcdTAwMDBcdTAwMDlcdTAwMEFcdTAwMEQgIy86P0BbXFxdXS8saj0vXltcdTAwMDAtXHUwMDFGIF0rfFtcdTAwMDAtXHUwMDFGIF0rJC9nLHE9L1tcdTAwMDlcdTAwMEFcdTAwMERdL2cscGFyc2VIb3N0PWZ1bmN0aW9uKHQscil7dmFyIGEsaSxvO2lmKCJbIj09ci5jaGFyQXQoMCkpe2lmKCJdIiE9ci5jaGFyQXQoci5sZW5ndGgtMSkpcmV0dXJuIkludmFsaWQgaG9zdCI7aWYoIShhPXBhcnNlSVB2NihyLnNsaWNlKDEsLTEpKSkpcmV0dXJuIkludmFsaWQgaG9zdCI7dC5ob3N0PWF9ZWxzZSBpZihpc1NwZWNpYWwodCkpe3I9dihyKTtpZihOLnRlc3QocikpcmV0dXJuIkludmFsaWQgaG9zdCI7aWYobnVsbD09PShhPXBhcnNlSVB2NChyKSkpcmV0dXJuIkludmFsaWQgaG9zdCI7dC5ob3N0PWF9ZWxzZXtpZihVLnRlc3QocikpcmV0dXJuIkludmFsaWQgaG9zdCI7YT0iIjtpPXkocik7Zm9yKG89MDtvPGkubGVuZ3RoO28rKylhKz1wZXJjZW50RW5jb2RlKGlbb10sVyk7dC5ob3N0PWF9fSxwYXJzZUlQdjQ9ZnVuY3Rpb24odCl7dmFyIHIsYSxpLG8sYyxsLHUsaD10LnNwbGl0KCIuIik7aC5sZW5ndGgmJiIiPT1oW2gubGVuZ3RoLTFdJiZoLnBvcCgpO2lmKChyPWgubGVuZ3RoKT40KXJldHVybiB0O2E9W107Zm9yKGk9MDtpPHI7aSsrKXtpZigiIj09KG89aFtpXSkpcmV0dXJuIHQ7Yz0xMDtpZihvLmxlbmd0aD4xJiYiMCI9PW8uY2hhckF0KDApKXtjPUIudGVzdChvKT8xNjo4O289by5zbGljZSg4PT1jPzE6Mil9aWYoIiI9PT1vKWw9MDtlbHNle2lmKCEoMTA9PWM/TTo4PT1jP0Q6TCkudGVzdChvKSlyZXR1cm4gdDtsPXBhcnNlSW50KG8sYyl9YS5wdXNoKGwpfWZvcihpPTA7aTxyO2krKyl7bD1hW2ldO2lmKGk9PXItMSl7aWYobD49SSgyNTYsNS1yKSlyZXR1cm4gbnVsbH1lbHNlIGlmKGw+MjU1KXJldHVybiBudWxsfXU9YS5wb3AoKTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKXUrPWFbaV0qSSgyNTYsMy1pKTtyZXR1cm4gdX0scGFyc2VJUHY2PWZ1bmN0aW9uKHQpe3ZhciByLGEsaSxvLGMsbCx1LGg9WzAsMCwwLDAsMCwwLDAsMF0sZD0wLHA9bnVsbCxtPTAsY2hhcj1mdW5jdGlvbigpe3JldHVybiB0LmNoYXJBdChtKX07aWYoIjoiPT1jaGFyKCkpe2lmKCI6IiE9dC5jaGFyQXQoMSkpcmV0dXJuO20rPTI7cD0rK2R9Zm9yKDtjaGFyKCk7KXtpZig4PT1kKXJldHVybjtpZigiOiIhPWNoYXIoKSl7cj1hPTA7Zm9yKDthPDQmJkwudGVzdChjaGFyKCkpOyl7cj0xNipyK3BhcnNlSW50KGNoYXIoKSwxNik7bSsrO2ErK31pZigiLiI9PWNoYXIoKSl7aWYoMD09YSlyZXR1cm47bS09YTtpZihkPjYpcmV0dXJuO2k9MDtmb3IoO2NoYXIoKTspe289bnVsbDtpZihpPjApe2lmKCEoIi4iPT1jaGFyKCkmJmk8NCkpcmV0dXJuO20rK31pZighRS50ZXN0KGNoYXIoKSkpcmV0dXJuO2Zvcig7RS50ZXN0KGNoYXIoKSk7KXtjPXBhcnNlSW50KGNoYXIoKSwxMCk7aWYobnVsbD09PW8pbz1jO2Vsc2V7aWYoMD09bylyZXR1cm47bz0xMCpvK2N9aWYobz4yNTUpcmV0dXJuO20rK31oW2RdPTI1NipoW2RdK287MiE9KytpJiY0IT1pfHxkKyt9aWYoNCE9aSlyZXR1cm47YnJlYWt9aWYoIjoiPT1jaGFyKCkpe20rKztpZighY2hhcigpKXJldHVybn1lbHNlIGlmKGNoYXIoKSlyZXR1cm47aFtkKytdPXJ9ZWxzZXtpZihudWxsIT09cClyZXR1cm47bSsrO3A9KytkfX1pZihudWxsIT09cCl7bD1kLXA7ZD03O2Zvcig7MCE9ZCYmbD4wOyl7dT1oW2RdO2hbZC0tXT1oW3ArbC0xXTtoW3ArLS1sXT11fX1lbHNlIGlmKDghPWQpcmV0dXJuO3JldHVybiBofSxzZXJpYWxpemVIb3N0PWZ1bmN0aW9uKHQpe3ZhciByLGEsaSxvO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7cj1bXTtmb3IoYT0wO2E8NDthKyspe3IudW5zaGlmdCh0JTI1Nik7dD1SKHQvMjU2KX1yZXR1cm4gci5qb2luKCIuIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtyPSIiO2k9ZnVuY3Rpb24odCl7Zm9yKHZhciByPW51bGwsYT0xLGk9bnVsbCxvPTAsYz0wO2M8ODtjKyspaWYoMCE9PXRbY10pe2lmKG8+YSl7cj1pO2E9b31pPW51bGw7bz0wfWVsc2V7bnVsbD09PWkmJihpPWMpOysrb31pZihvPmEpe3I9aTthPW99cmV0dXJuIHJ9KHQpO2ZvcihhPTA7YTw4O2ErKylpZighb3x8MCE9PXRbYV0pe28mJihvPSExKTtpZihpPT09YSl7cis9YT8iOiI6Ijo6IjtvPSEwfWVsc2V7cis9dFthXS50b1N0cmluZygxNik7YTw3JiYocis9IjoiKX19cmV0dXJuIlsiK3IrIl0ifXJldHVybiB0fSxXPXt9LHo9Zyh7fSxXLHsiICI6MSwnIic6MSwiPCI6MSwiPiI6MSwiYCI6MX0pLEc9Zyh7fSx6LHsiIyI6MSwiPyI6MSwieyI6MSwifSI6MX0pLEg9Zyh7fSxHLHsiLyI6MSwiOiI6MSwiOyI6MSwiPSI6MSwiQCI6MSwiWyI6MSwiXFwiOjEsIl0iOjEsIl4iOjEsInwiOjF9KSxwZXJjZW50RW5jb2RlPWZ1bmN0aW9uKHQscil7dmFyIGE9Yih0LDApO3JldHVybiBhPjMyJiZhPDEyNyYmIW0ocix0KT90OmVuY29kZVVSSUNvbXBvbmVudCh0KX0sVj17ZnRwOjIxLGZpbGU6bnVsbCxodHRwOjgwLGh0dHBzOjQ0Myx3czo4MCx3c3M6NDQzfSxpc1NwZWNpYWw9ZnVuY3Rpb24odCl7cmV0dXJuIG0oVix0LnNjaGVtZSl9LGluY2x1ZGVzQ3JlZGVudGlhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIiIhPXQudXNlcm5hbWV8fCIiIT10LnBhc3N3b3JkfSxjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIXQuaG9zdHx8dC5jYW5ub3RCZUFCYXNlVVJMfHwiZmlsZSI9PXQuc2NoZW1lfSxpc1dpbmRvd3NEcml2ZUxldHRlcj1mdW5jdGlvbih0LHIpe3ZhciBhO3JldHVybiAyPT10Lmxlbmd0aCYmUC50ZXN0KHQuY2hhckF0KDApKSYmKCI6Ij09KGE9dC5jaGFyQXQoMSkpfHwhciYmInwiPT1hKX0sc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcj1mdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4gdC5sZW5ndGg+MSYmaXNXaW5kb3dzRHJpdmVMZXR0ZXIodC5zbGljZSgwLDIpKSYmKDI9PXQubGVuZ3RofHwiLyI9PT0ocj10LmNoYXJBdCgyKSl8fCJcXCI9PT1yfHwiPyI9PT1yfHwiIyI9PT1yKX0sc2hvcnRlblVSTHNQYXRoPWZ1bmN0aW9uKHQpe3ZhciByPXQucGF0aCxhPXIubGVuZ3RoOyFhfHwiZmlsZSI9PXQuc2NoZW1lJiYxPT1hJiZpc1dpbmRvd3NEcml2ZUxldHRlcihyWzBdLCEwKXx8ci5wb3AoKX0saXNTaW5nbGVEb3Q9ZnVuY3Rpb24odCl7cmV0dXJuIi4iPT09dHx8IiUyZSI9PT10LnRvTG93ZXJDYXNlKCl9LFg9e30sWT17fSxLPXt9LEo9e30sWj17fSxRPXt9LCQ9e30sZWU9e30sdGU9e30scmU9e30sYWU9e30sbmU9e30saWU9e30sb2U9e30sc2U9e30sY2U9e30sbGU9e30sdWU9e30sZmU9e30saGU9e30sZGU9e30scGFyc2VVUkw9ZnVuY3Rpb24odCxyLGEsbyl7dmFyIGMsbCx1LGgsZCxwPWF8fFgsZz0wLGI9IiIsdj0hMSxTPSExLGs9ITE7aWYoIWEpe3Quc2NoZW1lPSIiO3QudXNlcm5hbWU9IiI7dC5wYXNzd29yZD0iIjt0Lmhvc3Q9bnVsbDt0LnBvcnQ9bnVsbDt0LnBhdGg9W107dC5xdWVyeT1udWxsO3QuZnJhZ21lbnQ9bnVsbDt0LmNhbm5vdEJlQUJhc2VVUkw9ITE7cj1yLnJlcGxhY2UoaiwiIil9cj1yLnJlcGxhY2UocSwiIik7Yz15KHIpO2Zvcig7Zzw9Yy5sZW5ndGg7KXtsPWNbZ107c3dpdGNoKHApe2Nhc2UgWDppZighbHx8IVAudGVzdChsKSl7aWYoYSlyZXR1cm4iSW52YWxpZCBzY2hlbWUiO3A9Sztjb250aW51ZX1iKz1sLnRvTG93ZXJDYXNlKCk7cD1ZO2JyZWFrO2Nhc2UgWTppZihsJiYoTy50ZXN0KGwpfHwiKyI9PWx8fCItIj09bHx8Ii4iPT1sKSliKz1sLnRvTG93ZXJDYXNlKCk7ZWxzZXtpZigiOiIhPWwpe2lmKGEpcmV0dXJuIkludmFsaWQgc2NoZW1lIjtiPSIiO3A9SztnPTA7Y29udGludWV9aWYoYSYmKGlzU3BlY2lhbCh0KSE9bShWLGIpfHwiZmlsZSI9PWImJihpbmNsdWRlc0NyZWRlbnRpYWxzKHQpfHxudWxsIT09dC5wb3J0KXx8ImZpbGUiPT10LnNjaGVtZSYmIXQuaG9zdCkpcmV0dXJuO3Quc2NoZW1lPWI7aWYoYSl7aXNTcGVjaWFsKHQpJiZWW3Quc2NoZW1lXT09dC5wb3J0JiYodC5wb3J0PW51bGwpO3JldHVybn1iPSIiO2lmKCJmaWxlIj09dC5zY2hlbWUpcD1vZTtlbHNlIGlmKGlzU3BlY2lhbCh0KSYmbyYmby5zY2hlbWU9PXQuc2NoZW1lKXA9SjtlbHNlIGlmKGlzU3BlY2lhbCh0KSlwPWVlO2Vsc2UgaWYoIi8iPT1jW2crMV0pe3A9WjtnKyt9ZWxzZXt0LmNhbm5vdEJlQUJhc2VVUkw9ITA7dC5wYXRoLnB1c2goIiIpO3A9ZmV9fWJyZWFrO2Nhc2UgSzppZighb3x8by5jYW5ub3RCZUFCYXNlVVJMJiYiIyIhPWwpcmV0dXJuIkludmFsaWQgc2NoZW1lIjtpZihvLmNhbm5vdEJlQUJhc2VVUkwmJiIjIj09bCl7dC5zY2hlbWU9by5zY2hlbWU7dC5wYXRoPW8ucGF0aC5zbGljZSgpO3QucXVlcnk9by5xdWVyeTt0LmZyYWdtZW50PSIiO3QuY2Fubm90QmVBQmFzZVVSTD0hMDtwPWRlO2JyZWFrfXA9ImZpbGUiPT1vLnNjaGVtZT9vZTpRO2NvbnRpbnVlO2Nhc2UgSjppZigiLyIhPWx8fCIvIiE9Y1tnKzFdKXtwPVE7Y29udGludWV9cD10ZTtnKys7YnJlYWs7Y2FzZSBaOmlmKCIvIj09bCl7cD1yZTticmVha31wPXVlO2NvbnRpbnVlO2Nhc2UgUTp0LnNjaGVtZT1vLnNjaGVtZTtpZihsPT1pKXt0LnVzZXJuYW1lPW8udXNlcm5hbWU7dC5wYXNzd29yZD1vLnBhc3N3b3JkO3QuaG9zdD1vLmhvc3Q7dC5wb3J0PW8ucG9ydDt0LnBhdGg9by5wYXRoLnNsaWNlKCk7dC5xdWVyeT1vLnF1ZXJ5fWVsc2UgaWYoIi8iPT1sfHwiXFwiPT1sJiZpc1NwZWNpYWwodCkpcD0kO2Vsc2UgaWYoIj8iPT1sKXt0LnVzZXJuYW1lPW8udXNlcm5hbWU7dC5wYXNzd29yZD1vLnBhc3N3b3JkO3QuaG9zdD1vLmhvc3Q7dC5wb3J0PW8ucG9ydDt0LnBhdGg9by5wYXRoLnNsaWNlKCk7dC5xdWVyeT0iIjtwPWhlfWVsc2V7aWYoIiMiIT1sKXt0LnVzZXJuYW1lPW8udXNlcm5hbWU7dC5wYXNzd29yZD1vLnBhc3N3b3JkO3QuaG9zdD1vLmhvc3Q7dC5wb3J0PW8ucG9ydDt0LnBhdGg9by5wYXRoLnNsaWNlKCk7dC5wYXRoLnBvcCgpO3A9dWU7Y29udGludWV9dC51c2VybmFtZT1vLnVzZXJuYW1lO3QucGFzc3dvcmQ9by5wYXNzd29yZDt0Lmhvc3Q9by5ob3N0O3QucG9ydD1vLnBvcnQ7dC5wYXRoPW8ucGF0aC5zbGljZSgpO3QucXVlcnk9by5xdWVyeTt0LmZyYWdtZW50PSIiO3A9ZGV9YnJlYWs7Y2FzZSAkOmlmKCFpc1NwZWNpYWwodCl8fCIvIiE9bCYmIlxcIiE9bCl7aWYoIi8iIT1sKXt0LnVzZXJuYW1lPW8udXNlcm5hbWU7dC5wYXNzd29yZD1vLnBhc3N3b3JkO3QuaG9zdD1vLmhvc3Q7dC5wb3J0PW8ucG9ydDtwPXVlO2NvbnRpbnVlfXA9cmV9ZWxzZSBwPXRlO2JyZWFrO2Nhc2UgZWU6cD10ZTtpZigiLyIhPWx8fCIvIiE9Yi5jaGFyQXQoZysxKSljb250aW51ZTtnKys7YnJlYWs7Y2FzZSB0ZTppZigiLyIhPWwmJiJcXCIhPWwpe3A9cmU7Y29udGludWV9YnJlYWs7Y2FzZSByZTppZigiQCI9PWwpe3YmJihiPSIlNDAiK2IpO3Y9ITA7dT15KGIpO2Zvcih2YXIgdz0wO3c8dS5sZW5ndGg7dysrKXt2YXIgQz11W3ddO2lmKCI6IiE9Q3x8ayl7dmFyIF89cGVyY2VudEVuY29kZShDLEgpO2s/dC5wYXNzd29yZCs9Xzp0LnVzZXJuYW1lKz1ffWVsc2Ugaz0hMH1iPSIifWVsc2UgaWYobD09aXx8Ii8iPT1sfHwiPyI9PWx8fCIjIj09bHx8IlxcIj09bCYmaXNTcGVjaWFsKHQpKXtpZih2JiYiIj09YilyZXR1cm4iSW52YWxpZCBhdXRob3JpdHkiO2ctPXkoYikubGVuZ3RoKzE7Yj0iIjtwPWFlfWVsc2UgYis9bDticmVhaztjYXNlIGFlOmNhc2UgbmU6aWYoYSYmImZpbGUiPT10LnNjaGVtZSl7cD1jZTtjb250aW51ZX1pZigiOiIhPWx8fFMpe2lmKGw9PWl8fCIvIj09bHx8Ij8iPT1sfHwiIyI9PWx8fCJcXCI9PWwmJmlzU3BlY2lhbCh0KSl7aWYoaXNTcGVjaWFsKHQpJiYiIj09YilyZXR1cm4iSW52YWxpZCBob3N0IjtpZihhJiYiIj09YiYmKGluY2x1ZGVzQ3JlZGVudGlhbHModCl8fG51bGwhPT10LnBvcnQpKXJldHVybjtpZihoPXBhcnNlSG9zdCh0LGIpKXJldHVybiBoO2I9IiI7cD1sZTtpZihhKXJldHVybjtjb250aW51ZX0iWyI9PWw/Uz0hMDoiXSI9PWwmJihTPSExKTtiKz1sfWVsc2V7aWYoIiI9PWIpcmV0dXJuIkludmFsaWQgaG9zdCI7aWYoaD1wYXJzZUhvc3QodCxiKSlyZXR1cm4gaDtiPSIiO3A9aWU7aWYoYT09bmUpcmV0dXJufWJyZWFrO2Nhc2UgaWU6aWYoIUUudGVzdChsKSl7aWYobD09aXx8Ii8iPT1sfHwiPyI9PWx8fCIjIj09bHx8IlxcIj09bCYmaXNTcGVjaWFsKHQpfHxhKXtpZigiIiE9Yil7dmFyIHg9cGFyc2VJbnQoYiwxMCk7aWYoeD42NTUzNSlyZXR1cm4iSW52YWxpZCBwb3J0Ijt0LnBvcnQ9aXNTcGVjaWFsKHQpJiZ4PT09Vlt0LnNjaGVtZV0/bnVsbDp4O2I9IiJ9aWYoYSlyZXR1cm47cD1sZTtjb250aW51ZX1yZXR1cm4iSW52YWxpZCBwb3J0In1iKz1sO2JyZWFrO2Nhc2Ugb2U6dC5zY2hlbWU9ImZpbGUiO2lmKCIvIj09bHx8IlxcIj09bClwPXNlO2Vsc2V7aWYoIW98fCJmaWxlIiE9by5zY2hlbWUpe3A9dWU7Y29udGludWV9aWYobD09aSl7dC5ob3N0PW8uaG9zdDt0LnBhdGg9by5wYXRoLnNsaWNlKCk7dC5xdWVyeT1vLnF1ZXJ5fWVsc2UgaWYoIj8iPT1sKXt0Lmhvc3Q9by5ob3N0O3QucGF0aD1vLnBhdGguc2xpY2UoKTt0LnF1ZXJ5PSIiO3A9aGV9ZWxzZXtpZigiIyIhPWwpe2lmKCFzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGMuc2xpY2UoZykuam9pbigiIikpKXt0Lmhvc3Q9by5ob3N0O3QucGF0aD1vLnBhdGguc2xpY2UoKTtzaG9ydGVuVVJMc1BhdGgodCl9cD11ZTtjb250aW51ZX10Lmhvc3Q9by5ob3N0O3QucGF0aD1vLnBhdGguc2xpY2UoKTt0LnF1ZXJ5PW8ucXVlcnk7dC5mcmFnbWVudD0iIjtwPWRlfX1icmVhaztjYXNlIHNlOmlmKCIvIj09bHx8IlxcIj09bCl7cD1jZTticmVha31vJiYiZmlsZSI9PW8uc2NoZW1lJiYhc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihjLnNsaWNlKGcpLmpvaW4oIiIpKSYmKGlzV2luZG93c0RyaXZlTGV0dGVyKG8ucGF0aFswXSwhMCk/dC5wYXRoLnB1c2goby5wYXRoWzBdKTp0Lmhvc3Q9by5ob3N0KTtwPXVlO2NvbnRpbnVlO2Nhc2UgY2U6aWYobD09aXx8Ii8iPT1sfHwiXFwiPT1sfHwiPyI9PWx8fCIjIj09bCl7aWYoIWEmJmlzV2luZG93c0RyaXZlTGV0dGVyKGIpKXA9dWU7ZWxzZSBpZigiIj09Yil7dC5ob3N0PSIiO2lmKGEpcmV0dXJuO3A9bGV9ZWxzZXtpZihoPXBhcnNlSG9zdCh0LGIpKXJldHVybiBoOyJsb2NhbGhvc3QiPT10Lmhvc3QmJih0Lmhvc3Q9IiIpO2lmKGEpcmV0dXJuO2I9IiI7cD1sZX1jb250aW51ZX1iKz1sO2JyZWFrO2Nhc2UgbGU6aWYoaXNTcGVjaWFsKHQpKXtwPXVlO2lmKCIvIiE9bCYmIlxcIiE9bCljb250aW51ZX1lbHNlIGlmKGF8fCI/IiE9bClpZihhfHwiIyIhPWwpe2lmKGwhPWkpe3A9dWU7aWYoIi8iIT1sKWNvbnRpbnVlfX1lbHNle3QuZnJhZ21lbnQ9IiI7cD1kZX1lbHNle3QucXVlcnk9IiI7cD1oZX1icmVhaztjYXNlIHVlOmlmKGw9PWl8fCIvIj09bHx8IlxcIj09bCYmaXNTcGVjaWFsKHQpfHwhYSYmKCI/Ij09bHx8IiMiPT1sKSl7aWYoIi4uIj09PShkPShkPWIpLnRvTG93ZXJDYXNlKCkpfHwiJTJlLiI9PT1kfHwiLiUyZSI9PT1kfHwiJTJlJTJlIj09PWQpe3Nob3J0ZW5VUkxzUGF0aCh0KTsiLyI9PWx8fCJcXCI9PWwmJmlzU3BlY2lhbCh0KXx8dC5wYXRoLnB1c2goIiIpfWVsc2UgaWYoaXNTaW5nbGVEb3QoYikpIi8iPT1sfHwiXFwiPT1sJiZpc1NwZWNpYWwodCl8fHQucGF0aC5wdXNoKCIiKTtlbHNle2lmKCJmaWxlIj09dC5zY2hlbWUmJiF0LnBhdGgubGVuZ3RoJiZpc1dpbmRvd3NEcml2ZUxldHRlcihiKSl7dC5ob3N0JiYodC5ob3N0PSIiKTtiPWIuY2hhckF0KDApKyI6In10LnBhdGgucHVzaChiKX1iPSIiO2lmKCJmaWxlIj09dC5zY2hlbWUmJihsPT1pfHwiPyI9PWx8fCIjIj09bCkpZm9yKDt0LnBhdGgubGVuZ3RoPjEmJiIiPT09dC5wYXRoWzBdOyl0LnBhdGguc2hpZnQoKTtpZigiPyI9PWwpe3QucXVlcnk9IiI7cD1oZX1lbHNlIGlmKCIjIj09bCl7dC5mcmFnbWVudD0iIjtwPWRlfX1lbHNlIGIrPXBlcmNlbnRFbmNvZGUobCxHKTticmVhaztjYXNlIGZlOmlmKCI/Ij09bCl7dC5xdWVyeT0iIjtwPWhlfWVsc2UgaWYoIiMiPT1sKXt0LmZyYWdtZW50PSIiO3A9ZGV9ZWxzZSBsIT1pJiYodC5wYXRoWzBdKz1wZXJjZW50RW5jb2RlKGwsVykpO2JyZWFrO2Nhc2UgaGU6aWYoYXx8IiMiIT1sKWwhPWkmJigiJyI9PWwmJmlzU3BlY2lhbCh0KT90LnF1ZXJ5Kz0iJTI3Ijp0LnF1ZXJ5Kz0iIyI9PWw/IiUyMyI6cGVyY2VudEVuY29kZShsLFcpKTtlbHNle3QuZnJhZ21lbnQ9IiI7cD1kZX1icmVhaztjYXNlIGRlOmwhPWkmJih0LmZyYWdtZW50Kz1wZXJjZW50RW5jb2RlKGwseikpfWcrK319LHBlPWZ1bmN0aW9uIFVSTCh0KXt2YXIgcixhLGk9cCh0aGlzLHBlLCJVUkwiKSxvPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLGw9U3RyaW5nKHQpLHU9QShpLHt0eXBlOiJVUkwifSk7aWYodm9pZCAwIT09bylpZihvIGluc3RhbmNlb2YgcGUpcj1UKG8pO2Vsc2UgaWYoYT1wYXJzZVVSTChyPXt9LFN0cmluZyhvKSkpdGhyb3cgVHlwZUVycm9yKGEpO2lmKGE9cGFyc2VVUkwodSxsLG51bGwscikpdGhyb3cgVHlwZUVycm9yKGEpO3ZhciBoPXUuc2VhcmNoUGFyYW1zPW5ldyBfLGQ9eChoKTtkLnVwZGF0ZVNlYXJjaFBhcmFtcyh1LnF1ZXJ5KTtkLnVwZGF0ZVVSTD1mdW5jdGlvbigpe3UucXVlcnk9U3RyaW5nKGgpfHxudWxsfTtpZighYyl7aS5ocmVmPXNlcmlhbGl6ZVVSTC5jYWxsKGkpO2kub3JpZ2luPWdldE9yaWdpbi5jYWxsKGkpO2kucHJvdG9jb2w9Z2V0UHJvdG9jb2wuY2FsbChpKTtpLnVzZXJuYW1lPWdldFVzZXJuYW1lLmNhbGwoaSk7aS5wYXNzd29yZD1nZXRQYXNzd29yZC5jYWxsKGkpO2kuaG9zdD1nZXRIb3N0LmNhbGwoaSk7aS5ob3N0bmFtZT1nZXRIb3N0bmFtZS5jYWxsKGkpO2kucG9ydD1nZXRQb3J0LmNhbGwoaSk7aS5wYXRobmFtZT1nZXRQYXRobmFtZS5jYWxsKGkpO2kuc2VhcmNoPWdldFNlYXJjaC5jYWxsKGkpO2kuc2VhcmNoUGFyYW1zPWdldFNlYXJjaFBhcmFtcy5jYWxsKGkpO2kuaGFzaD1nZXRIYXNoLmNhbGwoaSl9fSxtZT1wZS5wcm90b3R5cGUsc2VyaWFsaXplVVJMPWZ1bmN0aW9uKCl7dmFyIHQ9VCh0aGlzKSxyPXQuc2NoZW1lLGE9dC51c2VybmFtZSxpPXQucGFzc3dvcmQsbz10Lmhvc3QsYz10LnBvcnQsbD10LnBhdGgsdT10LnF1ZXJ5LGg9dC5mcmFnbWVudCxkPXIrIjoiO2lmKG51bGwhPT1vKXtkKz0iLy8iO2luY2x1ZGVzQ3JlZGVudGlhbHModCkmJihkKz1hKyhpPyI6IitpOiIiKSsiQCIpO2QrPXNlcmlhbGl6ZUhvc3Qobyk7bnVsbCE9PWMmJihkKz0iOiIrYyl9ZWxzZSJmaWxlIj09ciYmKGQrPSIvLyIpO2QrPXQuY2Fubm90QmVBQmFzZVVSTD9sWzBdOmwubGVuZ3RoPyIvIitsLmpvaW4oIi8iKToiIjtudWxsIT09dSYmKGQrPSI/Iit1KTtudWxsIT09aCYmKGQrPSIjIitoKTtyZXR1cm4gZH0sZ2V0T3JpZ2luPWZ1bmN0aW9uKCl7dmFyIHQ9VCh0aGlzKSxyPXQuc2NoZW1lLGE9dC5wb3J0O2lmKCJibG9iIj09cil0cnl7cmV0dXJuIG5ldyBVUkwoci5wYXRoWzBdKS5vcmlnaW59Y2F0Y2godCl7cmV0dXJuIm51bGwifXJldHVybiJmaWxlIiE9ciYmaXNTcGVjaWFsKHQpP3IrIjovLyIrc2VyaWFsaXplSG9zdCh0Lmhvc3QpKyhudWxsIT09YT8iOiIrYToiIik6Im51bGwifSxnZXRQcm90b2NvbD1mdW5jdGlvbigpe3JldHVybiBUKHRoaXMpLnNjaGVtZSsiOiJ9LGdldFVzZXJuYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFQodGhpcykudXNlcm5hbWV9LGdldFBhc3N3b3JkPWZ1bmN0aW9uKCl7cmV0dXJuIFQodGhpcykucGFzc3dvcmR9LGdldEhvc3Q9ZnVuY3Rpb24oKXt2YXIgdD1UKHRoaXMpLHI9dC5ob3N0LGE9dC5wb3J0O3JldHVybiBudWxsPT09cj8iIjpudWxsPT09YT9zZXJpYWxpemVIb3N0KHIpOnNlcmlhbGl6ZUhvc3QocikrIjoiK2F9LGdldEhvc3RuYW1lPWZ1bmN0aW9uKCl7dmFyIHQ9VCh0aGlzKS5ob3N0O3JldHVybiBudWxsPT09dD8iIjpzZXJpYWxpemVIb3N0KHQpfSxnZXRQb3J0PWZ1bmN0aW9uKCl7dmFyIHQ9VCh0aGlzKS5wb3J0O3JldHVybiBudWxsPT09dD8iIjpTdHJpbmcodCl9LGdldFBhdGhuYW1lPWZ1bmN0aW9uKCl7dmFyIHQ9VCh0aGlzKSxyPXQucGF0aDtyZXR1cm4gdC5jYW5ub3RCZUFCYXNlVVJMP3JbMF06ci5sZW5ndGg/Ii8iK3Iuam9pbigiLyIpOiIifSxnZXRTZWFyY2g9ZnVuY3Rpb24oKXt2YXIgdD1UKHRoaXMpLnF1ZXJ5O3JldHVybiB0PyI/Iit0OiIifSxnZXRTZWFyY2hQYXJhbXM9ZnVuY3Rpb24oKXtyZXR1cm4gVCh0aGlzKS5zZWFyY2hQYXJhbXN9LGdldEhhc2g9ZnVuY3Rpb24oKXt2YXIgdD1UKHRoaXMpLmZyYWdtZW50O3JldHVybiB0PyIjIit0OiIifSxhY2Nlc3NvckRlc2NyaXB0b3I9ZnVuY3Rpb24odCxyKXtyZXR1cm57Z2V0OnQsc2V0OnIsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9fTtjJiZoKG1lLHtocmVmOmFjY2Vzc29yRGVzY3JpcHRvcihzZXJpYWxpemVVUkwsKGZ1bmN0aW9uKHQpe3ZhciByPVQodGhpcyksYT1TdHJpbmcodCksaT1wYXJzZVVSTChyLGEpO2lmKGkpdGhyb3cgVHlwZUVycm9yKGkpO3goci5zZWFyY2hQYXJhbXMpLnVwZGF0ZVNlYXJjaFBhcmFtcyhyLnF1ZXJ5KX0pKSxvcmlnaW46YWNjZXNzb3JEZXNjcmlwdG9yKGdldE9yaWdpbikscHJvdG9jb2w6YWNjZXNzb3JEZXNjcmlwdG9yKGdldFByb3RvY29sLChmdW5jdGlvbih0KXt2YXIgcj1UKHRoaXMpO3BhcnNlVVJMKHIsU3RyaW5nKHQpKyI6IixYKX0pKSx1c2VybmFtZTphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0VXNlcm5hbWUsKGZ1bmN0aW9uKHQpe3ZhciByPVQodGhpcyksYT15KFN0cmluZyh0KSk7aWYoIWNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydChyKSl7ci51c2VybmFtZT0iIjtmb3IodmFyIGk9MDtpPGEubGVuZ3RoO2krKylyLnVzZXJuYW1lKz1wZXJjZW50RW5jb2RlKGFbaV0sSCl9fSkpLHBhc3N3b3JkOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXNzd29yZCwoZnVuY3Rpb24odCl7dmFyIHI9VCh0aGlzKSxhPXkoU3RyaW5nKHQpKTtpZighY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHIpKXtyLnBhc3N3b3JkPSIiO2Zvcih2YXIgaT0wO2k8YS5sZW5ndGg7aSsrKXIucGFzc3dvcmQrPXBlcmNlbnRFbmNvZGUoYVtpXSxIKX19KSksaG9zdDphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdCwoZnVuY3Rpb24odCl7dmFyIHI9VCh0aGlzKTtyLmNhbm5vdEJlQUJhc2VVUkx8fHBhcnNlVVJMKHIsU3RyaW5nKHQpLGFlKX0pKSxob3N0bmFtZTphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdG5hbWUsKGZ1bmN0aW9uKHQpe3ZhciByPVQodGhpcyk7ci5jYW5ub3RCZUFCYXNlVVJMfHxwYXJzZVVSTChyLFN0cmluZyh0KSxuZSl9KSkscG9ydDphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UG9ydCwoZnVuY3Rpb24odCl7dmFyIHI9VCh0aGlzKTtjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQocil8fCgiIj09KHQ9U3RyaW5nKHQpKT9yLnBvcnQ9bnVsbDpwYXJzZVVSTChyLHQsaWUpKX0pKSxwYXRobmFtZTphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UGF0aG5hbWUsKGZ1bmN0aW9uKHQpe3ZhciByPVQodGhpcyk7aWYoIXIuY2Fubm90QmVBQmFzZVVSTCl7ci5wYXRoPVtdO3BhcnNlVVJMKHIsdCsiIixsZSl9fSkpLHNlYXJjaDphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0U2VhcmNoLChmdW5jdGlvbih0KXt2YXIgcj1UKHRoaXMpO2lmKCIiPT0odD1TdHJpbmcodCkpKXIucXVlcnk9bnVsbDtlbHNleyI/Ij09dC5jaGFyQXQoMCkmJih0PXQuc2xpY2UoMSkpO3IucXVlcnk9IiI7cGFyc2VVUkwocix0LGhlKX14KHIuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXMoci5xdWVyeSl9KSksc2VhcmNoUGFyYW1zOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRTZWFyY2hQYXJhbXMpLGhhc2g6YWNjZXNzb3JEZXNjcmlwdG9yKGdldEhhc2gsKGZ1bmN0aW9uKHQpe3ZhciByPVQodGhpcyk7aWYoIiIhPSh0PVN0cmluZyh0KSkpeyIjIj09dC5jaGFyQXQoMCkmJih0PXQuc2xpY2UoMSkpO3IuZnJhZ21lbnQ9IiI7cGFyc2VVUkwocix0LGRlKX1lbHNlIHIuZnJhZ21lbnQ9bnVsbH0pKX0pO2QobWUsInRvSlNPTiIsKGZ1bmN0aW9uIHRvSlNPTigpe3JldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKX0pLHtlbnVtZXJhYmxlOiEwfSk7ZChtZSwidG9TdHJpbmciLChmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKX0pLHtlbnVtZXJhYmxlOiEwfSk7aWYoQyl7dmFyIGdlPUMuY3JlYXRlT2JqZWN0VVJMLHllPUMucmV2b2tlT2JqZWN0VVJMO2dlJiZkKHBlLCJjcmVhdGVPYmplY3RVUkwiLChmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwodCl7cmV0dXJuIGdlLmFwcGx5KEMsYXJndW1lbnRzKX0pKTt5ZSYmZChwZSwicmV2b2tlT2JqZWN0VVJMIiwoZnVuY3Rpb24gcmV2b2tlT2JqZWN0VVJMKHQpe3JldHVybiB5ZS5hcHBseShDLGFyZ3VtZW50cyl9KSl9UyhwZSwiVVJMIik7byh7Z2xvYmFsOiEwLGZvcmNlZDohbCxzaGFtOiFjfSx7VVJMOnBlfSl9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDE0KSxvPWEoNTcpLGM9YSgzNyksbD1vKCJpdGVyYXRvciIpO3QuZXhwb3J0cz0haSgoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2E9MSZiPTImYz0zIiwiaHR0cDovL2EiKSxyPXQuc2VhcmNoUGFyYW1zLGE9IiI7dC5wYXRobmFtZT0iYyUyMGQiO3IuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtyLmRlbGV0ZSgiYiIpO2ErPWkrdH0pKTtyZXR1cm4gYyYmIXQudG9KU09OfHwhci5zb3J0fHwiaHR0cDovL2EvYyUyMGQ/YT0xJmM9MyIhPT10LmhyZWZ8fCIzIiE9PXIuZ2V0KCJjIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFyW2xdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofHwiYTFjMyIhPT1hfHwieCIhPT1uZXcgVVJMKCJodHRwOi8veCIsdm9pZCAwKS5ob3N0fSkpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPS9bXlwwLVx1MDA3RV0vLG89L1suXHUzMDAyXHVGRjBFXHVGRjYxXS9nLGM9Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIixsPU1hdGguZmxvb3IsdT1TdHJpbmcuZnJvbUNoYXJDb2RlLGRpZ2l0VG9CYXNpYz1mdW5jdGlvbih0KXtyZXR1cm4gdCsyMis3NSoodDwyNil9LGFkYXB0PWZ1bmN0aW9uKHQscixhKXt2YXIgaT0wO3Q9YT9sKHQvNzAwKTp0Pj4xO3QrPWwodC9yKTtmb3IoO3Q+NDU1O2krPTM2KXQ9bCh0LzM1KTtyZXR1cm4gbChpKzM2KnQvKHQrMzgpKX0sZW5jb2RlPWZ1bmN0aW9uKHQpe3ZhciByLGEsaT1bXSxvPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXSxhPTAsaT10Lmxlbmd0aDthPGk7KXt2YXIgbz10LmNoYXJDb2RlQXQoYSsrKTtpZihvPj01NTI5NiYmbzw9NTYzMTkmJmE8aSl7dmFyIGM9dC5jaGFyQ29kZUF0KGErKyk7aWYoNTYzMjA9PSg2NDUxMiZjKSlyLnB1c2goKCgxMDIzJm8pPDwxMCkrKDEwMjMmYykrNjU1MzYpO2Vsc2V7ci5wdXNoKG8pO2EtLX19ZWxzZSByLnB1c2gobyl9cmV0dXJuIHJ9KHQpKS5sZW5ndGgsaD0xMjgsZD0wLHA9NzI7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKykoYT10W3JdKTwxMjgmJmkucHVzaCh1KGEpKTt2YXIgbT1pLmxlbmd0aCxnPW07bSYmaS5wdXNoKCItIik7Zm9yKDtnPG87KXt2YXIgeT0yMTQ3NDgzNjQ3O2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspKGE9dFtyXSk+PWgmJmE8eSYmKHk9YSk7dmFyIGI9ZysxO2lmKHktaD5sKCgyMTQ3NDgzNjQ3LWQpL2IpKXRocm93IFJhbmdlRXJyb3IoYyk7ZCs9KHktaCkqYjtoPXk7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7aWYoKGE9dFtyXSk8aCYmKytkPjIxNDc0ODM2NDcpdGhyb3cgUmFuZ2VFcnJvcihjKTtpZihhPT1oKXtmb3IodmFyIHY9ZCxTPTM2OztTKz0zNil7dmFyIGs9Uzw9cD8xOlM+PXArMjY/MjY6Uy1wO2lmKHY8aylicmVhazt2YXIgdz12LWssQz0zNi1rO2kucHVzaCh1KGRpZ2l0VG9CYXNpYyhrK3clQykpKTt2PWwody9DKX1pLnB1c2godShkaWdpdFRvQmFzaWModikpKTtwPWFkYXB0KGQsYixnPT1tKTtkPTA7KytnfX0rK2Q7KytofXJldHVybiBpLmpvaW4oIiIpfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIHIsYSxjPVtdLGw9dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobywiLiIpLnNwbGl0KCIuIik7Zm9yKHI9MDtyPGwubGVuZ3RoO3IrKyl7YT1sW3JdO2MucHVzaChpLnRlc3QoYSk/InhuLS0iK2VuY29kZShhKTphKX1yZXR1cm4gYy5qb2luKCIuIil9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO2EoMTAyKTt2YXIgaT1hKDEwKSxvPWEoNDIpLGM9YSgxNDApLGw9YSgyOSksdT1hKDEyNCksaD1hKDg1KSxkPWEoODApLHA9YSgzMyksbT1hKDEyNiksZz1hKDIzKSx5PWEoNjIpLGI9YSg5NSksdj1hKDI4KSxTPWEoMjIpLGs9YSg3MSksdz1hKDE2KSxDPWEoMTQzKSxfPWEoOTQpLHg9YSg1NyksQT1vKCJmZXRjaCIpLFQ9bygiSGVhZGVycyIpLFI9eCgiaXRlcmF0b3IiKSxJPXAuc2V0LFA9cC5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLE89cC5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksRT0vXCsvZyxCPUFycmF5KDQpLHBlcmNlbnRTZXF1ZW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gQlt0LTFdfHwoQlt0LTFdPVJlZ0V4cCgiKCg/OiVbXFxkYS1mXXsyfSl7Iit0KyJ9KSIsImdpIikpfSxwZXJjZW50RGVjb2RlPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQpfWNhdGNoKHIpe3JldHVybiB0fX0sZGVzZXJpYWxpemU9ZnVuY3Rpb24odCl7dmFyIHI9dC5yZXBsYWNlKEUsIiAiKSxhPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQocil9Y2F0Y2godCl7Zm9yKDthOylyPXIucmVwbGFjZShwZXJjZW50U2VxdWVuY2UoYS0tKSxwZXJjZW50RGVjb2RlKTtyZXR1cm4gcn19LEQ9L1shJygpfl18JTIwL2csTT17IiEiOiIlMjEiLCInIjoiJTI3IiwiKCI6IiUyOCIsIikiOiIlMjkiLCJ+IjoiJTdFIiwiJTIwIjoiKyJ9LHJlcGxhY2VyPWZ1bmN0aW9uKHQpe3JldHVybiBNW3RdfSxzZXJpYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKEQscmVwbGFjZXIpfSxwYXJzZVNlYXJjaFBhcmFtcz1mdW5jdGlvbih0LHIpe2lmKHIpZm9yKHZhciBhLGksbz1yLnNwbGl0KCImIiksYz0wO2M8by5sZW5ndGg7KWlmKChhPW9bYysrXSkubGVuZ3RoKXtpPWEuc3BsaXQoIj0iKTt0LnB1c2goe2tleTpkZXNlcmlhbGl6ZShpLnNoaWZ0KCkpLHZhbHVlOmRlc2VyaWFsaXplKGkuam9pbigiPSIpKX0pfX0sdXBkYXRlU2VhcmNoUGFyYW1zPWZ1bmN0aW9uKHQpe3RoaXMuZW50cmllcy5sZW5ndGg9MDtwYXJzZVNlYXJjaFBhcmFtcyh0aGlzLmVudHJpZXMsdCl9LHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoPWZ1bmN0aW9uKHQscil7aWYodDxyKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTD1kKChmdW5jdGlvbiBJdGVyYXRvcih0LHIpe0kodGhpcyx7dHlwZToiVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3IiLGl0ZXJhdG9yOkMoUCh0KS5lbnRyaWVzKSxraW5kOnJ9KX0pLCJJdGVyYXRvciIsKGZ1bmN0aW9uIG5leHQoKXt2YXIgdD1PKHRoaXMpLHI9dC5raW5kLGE9dC5pdGVyYXRvci5uZXh0KCksaT1hLnZhbHVlO2EuZG9uZXx8KGEudmFsdWU9ImtleXMiPT09cj9pLmtleToidmFsdWVzIj09PXI/aS52YWx1ZTpbaS5rZXksaS52YWx1ZV0pO3JldHVybiBhfSkpLE49ZnVuY3Rpb24gVVJMU2VhcmNoUGFyYW1zKCl7bSh0aGlzLE4sIlVSTFNlYXJjaFBhcmFtcyIpO3ZhciB0LHIsYSxpLG8sYyxsLHUsaCxkPWFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwLHA9dGhpcyx5PVtdO0kocCx7dHlwZToiVVJMU2VhcmNoUGFyYW1zIixlbnRyaWVzOnksdXBkYXRlVVJMOmZ1bmN0aW9uKCl7fSx1cGRhdGVTZWFyY2hQYXJhbXM6dXBkYXRlU2VhcmNoUGFyYW1zfSk7aWYodm9pZCAwIT09ZClpZihTKGQpKWlmKCJmdW5jdGlvbiI9PXR5cGVvZih0PV8oZCkpKXthPShyPXQuY2FsbChkKSkubmV4dDtmb3IoOyEoaT1hLmNhbGwocikpLmRvbmU7KXtpZigobD0oYz0obz1DKHYoaS52YWx1ZSkpKS5uZXh0KS5jYWxsKG8pKS5kb25lfHwodT1jLmNhbGwobykpLmRvbmV8fCFjLmNhbGwobykuZG9uZSl0aHJvdyBUeXBlRXJyb3IoIkV4cGVjdGVkIHNlcXVlbmNlIHdpdGggbGVuZ3RoIDIiKTt5LnB1c2goe2tleTpsLnZhbHVlKyIiLHZhbHVlOnUudmFsdWUrIiJ9KX19ZWxzZSBmb3IoaCBpbiBkKWcoZCxoKSYmeS5wdXNoKHtrZXk6aCx2YWx1ZTpkW2hdKyIifSk7ZWxzZSBwYXJzZVNlYXJjaFBhcmFtcyh5LCJzdHJpbmciPT10eXBlb2YgZD8iPyI9PT1kLmNoYXJBdCgwKT9kLnNsaWNlKDEpOmQ6ZCsiIil9LFU9Ti5wcm90b3R5cGU7dShVLHthcHBlbmQ6ZnVuY3Rpb24gYXBwZW5kKHQscil7dmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwyKTt2YXIgYT1QKHRoaXMpO2EuZW50cmllcy5wdXNoKHtrZXk6dCsiIix2YWx1ZTpyKyIifSk7YS51cGRhdGVVUkwoKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe3ZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciByPVAodGhpcyksYT1yLmVudHJpZXMsaT10KyIiLG89MDtvPGEubGVuZ3RoOylhW29dLmtleT09PWk/YS5zcGxpY2UobywxKTpvKys7ci51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uIGdldCh0KXt2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1QKHRoaXMpLmVudHJpZXMsYT10KyIiLGk9MDtpPHIubGVuZ3RoO2krKylpZihyW2ldLmtleT09PWEpcmV0dXJuIHJbaV0udmFsdWU7cmV0dXJuIG51bGx9LGdldEFsbDpmdW5jdGlvbiBnZXRBbGwodCl7dmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIHI9UCh0aGlzKS5lbnRyaWVzLGE9dCsiIixpPVtdLG89MDtvPHIubGVuZ3RoO28rKylyW29dLmtleT09PWEmJmkucHVzaChyW29dLnZhbHVlKTtyZXR1cm4gaX0saGFzOmZ1bmN0aW9uIGhhcyh0KXt2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1QKHRoaXMpLmVudHJpZXMsYT10KyIiLGk9MDtpPHIubGVuZ3RoOylpZihyW2krK10ua2V5PT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uIHNldCh0LHIpe3ZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBhLGk9UCh0aGlzKSxvPWkuZW50cmllcyxjPSExLGw9dCsiIix1PXIrIiIsaD0wO2g8by5sZW5ndGg7aCsrKWlmKChhPW9baF0pLmtleT09PWwpaWYoYylvLnNwbGljZShoLS0sMSk7ZWxzZXtjPSEwO2EudmFsdWU9dX1jfHxvLnB1c2goe2tleTpsLHZhbHVlOnV9KTtpLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uIHNvcnQoKXt2YXIgdCxyLGEsaT1QKHRoaXMpLG89aS5lbnRyaWVzLGM9by5zbGljZSgpO28ubGVuZ3RoPTA7Zm9yKGE9MDthPGMubGVuZ3RoO2ErKyl7dD1jW2FdO2ZvcihyPTA7cjxhO3IrKylpZihvW3JdLmtleT50LmtleSl7by5zcGxpY2UociwwLHQpO2JyZWFrfXI9PT1hJiZvLnB1c2godCl9aS51cGRhdGVVUkwoKX0sZm9yRWFjaDpmdW5jdGlvbiBmb3JFYWNoKHQpe2Zvcih2YXIgcixhPVAodGhpcykuZW50cmllcyxpPXkodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxhLmxlbmd0aDspaSgocj1hW28rK10pLnZhbHVlLHIua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gbmV3IEwodGhpcywia2V5cyIpfSx2YWx1ZXM6ZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIG5ldyBMKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uIGVudHJpZXMoKXtyZXR1cm4gbmV3IEwodGhpcywiZW50cmllcyIpfX0se2VudW1lcmFibGU6ITB9KTtsKFUsUixVLmVudHJpZXMpO2woVSwidG9TdHJpbmciLChmdW5jdGlvbiB0b1N0cmluZygpe2Zvcih2YXIgdCxyPVAodGhpcykuZW50cmllcyxhPVtdLGk9MDtpPHIubGVuZ3RoOyl7dD1yW2krK107YS5wdXNoKHNlcmlhbGl6ZSh0LmtleSkrIj0iK3NlcmlhbGl6ZSh0LnZhbHVlKSl9cmV0dXJuIGEuam9pbigiJiIpfSkse2VudW1lcmFibGU6ITB9KTtoKE4sIlVSTFNlYXJjaFBhcmFtcyIpO2koe2dsb2JhbDohMCxmb3JjZWQ6IWN9LHtVUkxTZWFyY2hQYXJhbXM6Tn0pO2N8fCJmdW5jdGlvbiIhPXR5cGVvZiBBfHwiZnVuY3Rpb24iIT10eXBlb2YgVHx8aSh7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24gZmV0Y2godCl7dmFyIHIsYSxpLG89W3RdO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7aWYoUyhyPWFyZ3VtZW50c1sxXSkpe2E9ci5ib2R5O2lmKCJVUkxTZWFyY2hQYXJhbXMiPT09YihhKSl7KGk9ci5oZWFkZXJzP25ldyBUKHIuaGVhZGVycyk6bmV3IFQpLmhhcygiY29udGVudC10eXBlIil8fGkuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpO3I9ayhyLHtib2R5OncoMCxTdHJpbmcoYSkpLGhlYWRlcnM6dygwLGkpfSl9fW8ucHVzaChyKX1yZXR1cm4gQS5hcHBseSh0aGlzLG8pfX0pO3QuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOk4sZ2V0U3RhdGU6UH19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDI4KSxvPWEoOTQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgcj1vKHQpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gaShyLmNhbGwodCkpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjthKDEwKSh7dGFyZ2V0OiJVUkwiLHByb3RvOiEwLGVudW1lcmFibGU6ITB9LHt0b0pTT046ZnVuY3Rpb24gdG9KU09OKCl7cmV0dXJuIFVSTC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKX19KX0sZnVuY3Rpb24odCxyLGEpeyFmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/U3ltYm9sOmZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIit0KyIpIn07ZnVuY3Rpb24gbm9vcCgpe312YXIgYT1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT10fSxpPW5vb3A7ZnVuY3Rpb24gdHlwZUlzT2JqZWN0KHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGNyZWF0ZUFycmF5RnJvbUxpc3QodCl7cmV0dXJuIHQuc2xpY2UoKX1mdW5jdGlvbiBJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHQpe3JldHVybiExIT09ZnVuY3Rpb24gSXNOb25OZWdhdGl2ZU51bWJlcih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJighYSh0KSYmISh0PDApKX0odCkmJnQhPT0xLzB9ZnVuY3Rpb24gQ2FsbCh0LHIsYSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgaXMgbm90IGEgZnVuY3Rpb24iKTtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodCxyLGEpfWZ1bmN0aW9uIENyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHQscixhLGkpe3ZhciBvPXRbcl07aWYodm9pZCAwIT09byl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcihvKyIgaXMgbm90IGEgbWV0aG9kIik7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZUNhbGwobyx0LGkpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBhPVtyXS5jb25jYXQoaSk7cmV0dXJuIFByb21pc2VDYWxsKG8sdCxhKX19fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHZvaWQgMCl9fWZ1bmN0aW9uIEludm9rZU9yTm9vcCh0LHIsYSl7dmFyIGk9dFtyXTtpZih2b2lkIDAhPT1pKXJldHVybiBDYWxsKGksdCxhKX1mdW5jdGlvbiBQcm9taXNlQ2FsbCh0LHIsYSl7dHJ5e3JldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKENhbGwodCxyLGEpKX1jYXRjaCh0KXtyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh0KX19ZnVuY3Rpb24gVmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKHQpe3Q9TnVtYmVyKHQpO2lmKGEodCl8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiaGlnaFdhdGVyTWFyayBwcm9wZXJ0eSBvZiBhIHF1ZXVpbmcgc3RyYXRlZ3kgbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIG5vbi1OYU4iKTtyZXR1cm4gdH1mdW5jdGlvbiBNYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gMX07aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZSBwcm9wZXJ0eSBvZiBhIHF1ZXVpbmcgc3RyYXRlZ3kgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0KHIpfX12YXIgbz1Qcm9taXNlLGM9UHJvbWlzZS5wcm90b3R5cGUudGhlbixsPVByb21pc2UucmVzb2x2ZS5iaW5kKG8pLHU9UHJvbWlzZS5yZWplY3QuYmluZChvKTtmdW5jdGlvbiBuZXdQcm9taXNlKHQpe3JldHVybiBuZXcgbyh0KX1mdW5jdGlvbiBwcm9taXNlUmVzb2x2ZWRXaXRoKHQpe3JldHVybiBsKHQpfWZ1bmN0aW9uIHByb21pc2VSZWplY3RlZFdpdGgodCl7cmV0dXJuIHUodCl9ZnVuY3Rpb24gUGVyZm9ybVByb21pc2VUaGVuKHQscixhKXtyZXR1cm4gYy5jYWxsKHQscixhKX1mdW5jdGlvbiB1cG9uUHJvbWlzZSh0LHIsYSl7UGVyZm9ybVByb21pc2VUaGVuKFBlcmZvcm1Qcm9taXNlVGhlbih0LHIsYSksdm9pZCAwLGkpfWZ1bmN0aW9uIHVwb25GdWxmaWxsbWVudCh0LHIpe3Vwb25Qcm9taXNlKHQscil9ZnVuY3Rpb24gdXBvblJlamVjdGlvbih0LHIpe3Vwb25Qcm9taXNlKHQsdm9pZCAwLHIpfWZ1bmN0aW9uIHRyYW5zZm9ybVByb21pc2VXaXRoKHQscixhKXtyZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHQscixhKX1mdW5jdGlvbiBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHQpe1BlcmZvcm1Qcm9taXNlVGhlbih0LHZvaWQgMCxpKX12YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIFNpbXBsZVF1ZXVlKCl7dGhpcy5fY3Vyc29yPTA7dGhpcy5fc2l6ZT0wO3RoaXMuX2Zyb250PXtfZWxlbWVudHM6W10sX25leHQ6dm9pZCAwfTt0aGlzLl9iYWNrPXRoaXMuX2Zyb250O3RoaXMuX2N1cnNvcj0wO3RoaXMuX3NpemU9MH1PYmplY3QuZGVmaW5lUHJvcGVydHkoU2ltcGxlUXVldWUucHJvdG90eXBlLCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtTaW1wbGVRdWV1ZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt2YXIgcj10aGlzLl9iYWNrLGE9cjsxNjM4Mz09PXIuX2VsZW1lbnRzLmxlbmd0aCYmKGE9e19lbGVtZW50czpbXSxfbmV4dDp2b2lkIDB9KTtyLl9lbGVtZW50cy5wdXNoKHQpO2lmKGEhPT1yKXt0aGlzLl9iYWNrPWE7ci5fbmV4dD1hfSsrdGhpcy5fc2l6ZX07U2ltcGxlUXVldWUucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZnJvbnQscj10LGE9dGhpcy5fY3Vyc29yLGk9YSsxLG89dC5fZWxlbWVudHMsYz1vW2FdO2lmKDE2Mzg0PT09aSl7cj10Ll9uZXh0O2k9MH0tLXRoaXMuX3NpemU7dGhpcy5fY3Vyc29yPWk7dCE9PXImJih0aGlzLl9mcm9udD1yKTtvW2FdPXZvaWQgMDtyZXR1cm4gY307U2ltcGxlUXVldWUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7Zm9yKHZhciByPXRoaXMuX2N1cnNvcixhPXRoaXMuX2Zyb250LGk9YS5fZWxlbWVudHM7ciE9PWkubGVuZ3RofHx2b2lkIDAhPT1hLl9uZXh0Oyl7aWYocj09PWkubGVuZ3RoKXtyPTA7aWYoMD09PShpPShhPWEuX25leHQpLl9lbGVtZW50cykubGVuZ3RoKWJyZWFrfXQoaVtyXSk7KytyfX07U2ltcGxlUXVldWUucHJvdG90eXBlLnBlZWs9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9mcm9udCxyPXRoaXMuX2N1cnNvcjtyZXR1cm4gdC5fZWxlbWVudHNbcl19O3JldHVybiBTaW1wbGVRdWV1ZX0oKTtmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodCxyLGEpe3ZhciBpPW51bGw7ITA9PT1hJiYoaT1PYmplY3QucHJvdG90eXBlKTt2YXIgbz1PYmplY3QuY3JlYXRlKGkpO28udmFsdWU9dDtvLmRvbmU9cjtyZXR1cm4gb31mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHQscil7dC5fZm9yQXV0aG9yQ29kZT0hMDt0Ll9vd25lclJlYWRhYmxlU3RyZWFtPXI7ci5fcmVhZGVyPXQ7InJlYWRhYmxlIj09PXIuX3N0YXRlP2RlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0KToiY2xvc2VkIj09PXIuX3N0YXRlP2Z1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodCl7ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHQpO2RlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh0KX0odCk6ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0LHIuX3N0b3JlZEVycm9yKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwodCxyKXtyZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwodC5fb3duZXJSZWFkYWJsZVN0cmVhbSxyKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHQpeyJyZWFkYWJsZSI9PT10Ll9vd25lclJlYWRhYmxlU3RyZWFtLl9zdGF0ZT9kZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh0LG5ldyBUeXBlRXJyb3IoIlJlYWRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzIikpOmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHQscil7ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0LHIpfSh0LG5ldyBUeXBlRXJyb3IoIlJlYWRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzIikpO3QuX293bmVyUmVhZGFibGVTdHJlYW0uX3JlYWRlcj12b2lkIDA7dC5fb3duZXJSZWFkYWJsZVN0cmVhbT12b2lkIDB9ZnVuY3Rpb24gcmVhZGVyTG9ja0V4Y2VwdGlvbih0KXtyZXR1cm4gbmV3IFR5cGVFcnJvcigiQ2Fubm90ICIrdCsiIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgcmVhZGVyIil9ZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHQpe3QuX2Nsb3NlZFByb21pc2U9bmV3UHJvbWlzZSgoZnVuY3Rpb24ocixhKXt0Ll9jbG9zZWRQcm9taXNlX3Jlc29sdmU9cjt0Ll9jbG9zZWRQcm9taXNlX3JlamVjdD1hfSkpfWZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodCxyKXtkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUodCk7ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QodCxyKX1mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh0LHIpe3NldFByb21pc2VJc0hhbmRsZWRUb1RydWUodC5fY2xvc2VkUHJvbWlzZSk7dC5fY2xvc2VkUHJvbWlzZV9yZWplY3Qocik7dC5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlPXZvaWQgMDt0Ll9jbG9zZWRQcm9taXNlX3JlamVjdD12b2lkIDB9ZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHQpe3QuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSh2b2lkIDApO3QuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZT12b2lkIDA7dC5fY2xvc2VkUHJvbWlzZV9yZWplY3Q9dm9pZCAwfXZhciBkPXIoIltbQ2FuY2VsU3RlcHNdXSIpLHA9cigiW1tQdWxsU3RlcHNdXSIpO2Z1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodCxyKXt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGE9bmV3IHkodCk7YS5fZm9yQXV0aG9yQ29kZT1yO3JldHVybiBhfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3QodCl7cmV0dXJuIG5ld1Byb21pc2UoKGZ1bmN0aW9uKHIsYSl7dmFyIGk9e19yZXNvbHZlOnIsX3JlamVjdDphfTt0Ll9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5wdXNoKGkpfSkpfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHQscixhKXt2YXIgaT10Ll9yZWFkZXI7aS5fcmVhZFJlcXVlc3RzLnNoaWZ0KCkuX3Jlc29sdmUoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHIsYSxpLl9mb3JBdXRob3JDb2RlKSl9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHModCl7cmV0dXJuIHQuX3JlYWRlci5fcmVhZFJlcXVlc3RzLmxlbmd0aH1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIodCl7dmFyIHI9dC5fcmVhZGVyO3JldHVybiB2b2lkIDAhPT1yJiYhIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHIpfXZhciBtLGcseT1mdW5jdGlvbigpe2Z1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0KXtpZighMT09PUlzUmVhZGFibGVTdHJlYW0odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIGNhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBSZWFkYWJsZVN0cmVhbSBpbnN0YW5jZSIpO2lmKCEwPT09SXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHJlYWRpbmcgYnkgYW5vdGhlciByZWFkZXIiKTtSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsdCk7dGhpcy5fcmVhZFJlcXVlc3RzPW5ldyBofU9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLCJjbG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcyk/dGhpcy5fY2xvc2VkUHJvbWlzZTpwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJjbG9zZWQiKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk7UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24odCl7cmV0dXJuIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpP3ZvaWQgMD09PXRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0/cHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCJjYW5jZWwiKSk6UmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHRoaXMsdCk6cHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiY2FuY2VsIikpfTtSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcyk/dm9pZCAwPT09dGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbT9wcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oInJlYWQgZnJvbSIpKTpSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHRoaXMpOnByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oInJlYWQiKSl9O1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5wcm90b3R5cGUucmVsZWFzZUxvY2s9ZnVuY3Rpb24oKXtpZighSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykpdGhyb3cgZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oInJlbGVhc2VMb2NrIik7aWYodm9pZCAwIT09dGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSl7aWYodGhpcy5fcmVhZFJlcXVlc3RzLmxlbmd0aD4wKXRocm93IG5ldyBUeXBlRXJyb3IoIlRyaWVkIHRvIHJlbGVhc2UgYSByZWFkZXIgbG9jayB3aGVuIHRoYXQgcmVhZGVyIGhhcyBwZW5kaW5nIHJlYWQoKSBjYWxscyB1bi1zZXR0bGVkIik7UmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSh0aGlzKX19O3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJ9KCk7ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodCl7cmV0dXJuISF0eXBlSXNPYmplY3QodCkmJiEhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIl9yZWFkUmVxdWVzdHMiKX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHQpe3ZhciByPXQuX293bmVyUmVhZGFibGVTdHJlYW07ci5fZGlzdHVyYmVkPSEwO3JldHVybiJjbG9zZWQiPT09ci5fc3RhdGU/cHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodm9pZCAwLCEwLHQuX2ZvckF1dGhvckNvZGUpKToiZXJyb3JlZCI9PT1yLl9zdGF0ZT9wcm9taXNlUmVqZWN0ZWRXaXRoKHIuX3N0b3JlZEVycm9yKTpyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXJbcF0oKX1mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbih0KXtyZXR1cm4gbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS4iK3QrIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIil9aWYoInN5bWJvbCI9PXR5cGVvZiByLmFzeW5jSXRlcmF0b3Ipe2c9KChtPXt9KVtyLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLHIuYXN5bmNJdGVyYXRvcix7ZW51bWVyYWJsZTohMX0pfXZhciBiPXtuZXh0OmZ1bmN0aW9uKCl7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbigibmV4dCIpKTt2YXIgdD10aGlzLl9hc3luY0l0ZXJhdG9yUmVhZGVyO3JldHVybiB2b2lkIDA9PT10Ll9vd25lclJlYWRhYmxlU3RyZWFtP3Byb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigiaXRlcmF0ZSIpKTp0cmFuc2Zvcm1Qcm9taXNlV2l0aChSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHQpLChmdW5jdGlvbihyKXt2YXIgYT1yLmRvbmU7YSYmUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSh0KTtyZXR1cm4gUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHIudmFsdWUsYSwhMCl9KSl9LHJldHVybjpmdW5jdGlvbih0KXtpZighMT09PUlzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpKXJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKCJuZXh0IikpO3ZhciByPXRoaXMuX2FzeW5jSXRlcmF0b3JSZWFkZXI7aWYodm9pZCAwPT09ci5fb3duZXJSZWFkYWJsZVN0cmVhbSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCJmaW5pc2ggaXRlcmF0aW5nIikpO2lmKHIuX3JlYWRSZXF1ZXN0cy5sZW5ndGg+MClyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCIpKTtpZighMT09PXRoaXMuX3ByZXZlbnRDYW5jZWwpe3ZhciBhPVJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbChyLHQpO1JlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2Uocik7cmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKGEsKGZ1bmN0aW9uKCl7cmV0dXJuIFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh0LCEwLCEwKX0pKX1SZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHIpO3JldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdCh0LCEwLCEwKSl9fTt2b2lkIDAhPT1nJiZPYmplY3Quc2V0UHJvdG90eXBlT2YoYixnKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwibmV4dCIse2VudW1lcmFibGU6ITF9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwicmV0dXJuIix7ZW51bWVyYWJsZTohMX0pO2Z1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfYXN5bmNJdGVyYXRvclJlYWRlciIpfWZ1bmN0aW9uIHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RlYW1Bc3luY0l0ZXJhdG9yIil9ZnVuY3Rpb24gRGVxdWV1ZVZhbHVlKHQpe3ZhciByPXQuX3F1ZXVlLnNoaWZ0KCk7dC5fcXVldWVUb3RhbFNpemUtPXIuc2l6ZTt0Ll9xdWV1ZVRvdGFsU2l6ZTwwJiYodC5fcXVldWVUb3RhbFNpemU9MCk7cmV0dXJuIHIudmFsdWV9ZnVuY3Rpb24gRW5xdWV1ZVZhbHVlV2l0aFNpemUodCxyLGEpe2lmKCFJc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKGE9TnVtYmVyKGEpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiU2l6ZSBtdXN0IGJlIGEgZmluaXRlLCBub24tTmFOLCBub24tbmVnYXRpdmUgbnVtYmVyLiIpO3QuX3F1ZXVlLnB1c2goe3ZhbHVlOnIsc2l6ZTphfSk7dC5fcXVldWVUb3RhbFNpemUrPWF9ZnVuY3Rpb24gUmVzZXRRdWV1ZSh0KXt0Ll9xdWV1ZT1uZXcgaDt0Ll9xdWV1ZVRvdGFsU2l6ZT0wfXZhciB2PXIoIltbQWJvcnRTdGVwc11dIiksUz1yKCJbW0Vycm9yU3RlcHNdXSIpLGs9ZnVuY3Rpb24oKXtmdW5jdGlvbiBXcml0YWJsZVN0cmVhbSh0LHIpe3ZvaWQgMD09PXQmJih0PXt9KTt2b2lkIDA9PT1yJiYocj17fSk7SW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHRoaXMpO3ZhciBhPXIuc2l6ZSxpPXIuaGlnaFdhdGVyTWFyaztpZih2b2lkIDAhPT10LnR5cGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQiKTt2YXIgbz1NYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oYSk7dm9pZCAwPT09aSYmKGk9MSk7IWZ1bmN0aW9uIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU2luayh0LHIsYSxpKXt2YXIgbz1PYmplY3QuY3JlYXRlKEMucHJvdG90eXBlKSxjPUNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHIsIndyaXRlIiwxLFtvXSksbD1DcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZChyLCJjbG9zZSIsMCxbXSksdT1DcmVhdGVBbGdvcml0aG1Gcm9tVW5kZXJseWluZ01ldGhvZChyLCJhYm9ydCIsMSxbXSk7U2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHQsbywoZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKXtyZXR1cm4gSW52b2tlT3JOb29wKHIsInN0YXJ0Iixbb10pfSksYyxsLHUsYSxpKX0odGhpcyx0LGk9VmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGkpLG8pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUsImxvY2tlZCIse2dldDpmdW5jdGlvbigpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbSh0aGlzKSl0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCJsb2NrZWQiKTtyZXR1cm4gSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuITE9PT1Jc1dyaXRhYmxlU3RyZWFtKHRoaXMpP3Byb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbigiYWJvcnQiKSk6ITA9PT1Jc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpP3Byb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiQ2Fubm90IGFib3J0IGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXIiKSk6V3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLHQpfTtXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PUlzV3JpdGFibGVTdHJlYW0odGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCJjbG9zZSIpKTohMD09PUlzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2xvc2UgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHdyaXRlciIpKTohMD09PVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHRoaXMpP3Byb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiQ2Fubm90IGNsb3NlIGFuIGFscmVhZHktY2xvc2luZyBzdHJlYW0iKSk6V3JpdGFibGVTdHJlYW1DbG9zZSh0aGlzKX07V3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLmdldFdyaXRlcj1mdW5jdGlvbigpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbSh0aGlzKSl0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCJnZXRXcml0ZXIiKTtyZXR1cm4gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKX07cmV0dXJuIFdyaXRhYmxlU3RyZWFtfSgpO2Z1bmN0aW9uIEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodCl7cmV0dXJuIG5ldyB3KHQpfWZ1bmN0aW9uIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbSh0KXt0Ll9zdGF0ZT0id3JpdGFibGUiO3QuX3N0b3JlZEVycm9yPXZvaWQgMDt0Ll93cml0ZXI9dm9pZCAwO3QuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcj12b2lkIDA7dC5fd3JpdGVSZXF1ZXN0cz1uZXcgaDt0Ll9pbkZsaWdodFdyaXRlUmVxdWVzdD12b2lkIDA7dC5fY2xvc2VSZXF1ZXN0PXZvaWQgMDt0Ll9pbkZsaWdodENsb3NlUmVxdWVzdD12b2lkIDA7dC5fcGVuZGluZ0Fib3J0UmVxdWVzdD12b2lkIDA7dC5fYmFja3ByZXNzdXJlPSExfWZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW0odCl7cmV0dXJuISF0eXBlSXNPYmplY3QodCkmJiEhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIiKX1mdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHQpe3JldHVybiB2b2lkIDAhPT10Ll93cml0ZXJ9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BYm9ydCh0LHIpe3ZhciBhPXQuX3N0YXRlO2lmKCJjbG9zZWQiPT09YXx8ImVycm9yZWQiPT09YSlyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApO2lmKHZvaWQgMCE9PXQuX3BlbmRpbmdBYm9ydFJlcXVlc3QpcmV0dXJuIHQuX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2U7dmFyIGk9ITE7aWYoImVycm9yaW5nIj09PWEpe2k9ITA7cj12b2lkIDB9dmFyIG89bmV3UHJvbWlzZSgoZnVuY3Rpb24oYSxvKXt0Ll9wZW5kaW5nQWJvcnRSZXF1ZXN0PXtfcHJvbWlzZTp2b2lkIDAsX3Jlc29sdmU6YSxfcmVqZWN0Om8sX3JlYXNvbjpyLF93YXNBbHJlYWR5RXJyb3Jpbmc6aX19KSk7dC5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcHJvbWlzZT1vOyExPT09aSYmV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHQscik7cmV0dXJuIG99ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZSh0KXt2YXIgcj10Ll9zdGF0ZTtpZigiY2xvc2VkIj09PXJ8fCJlcnJvcmVkIj09PXIpcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiVGhlIHN0cmVhbSAoaW4gIityKyIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgd3JpdGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBjbG9zZWQiKSk7dmFyIGE9bmV3UHJvbWlzZSgoZnVuY3Rpb24ocixhKXt2YXIgaT17X3Jlc29sdmU6cixfcmVqZWN0OmF9O3QuX2Nsb3NlUmVxdWVzdD1pfSkpLGk9dC5fd3JpdGVyO3ZvaWQgMCE9PWkmJiEwPT09dC5fYmFja3ByZXNzdXJlJiYid3JpdGFibGUiPT09ciYmZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUoaSk7IWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0KXtFbnF1ZXVlVmFsdWVXaXRoU2l6ZSh0LCJjbG9zZSIsMCk7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKHQpfSh0Ll93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIpO3JldHVybiBhfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24odCxyKXsid3JpdGFibGUiIT09dC5fc3RhdGU/V3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyh0KTpXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3JpbmcodCxyKX1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3JpbmcodCxyKXt2YXIgYT10Ll93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXI7dC5fc3RhdGU9ImVycm9yaW5nIjt0Ll9zdG9yZWRFcnJvcj1yO3ZhciBpPXQuX3dyaXRlcjt2b2lkIDAhPT1pJiZXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZChpLHIpOyExPT09ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1IYXNPcGVyYXRpb25NYXJrZWRJbkZsaWdodCh0KXtyZXR1cm4gdm9pZCAwIT09dC5faW5GbGlnaHRXcml0ZVJlcXVlc3R8fHZvaWQgMCE9PXQuX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0fSh0KSYmITA9PT1hLl9zdGFydGVkJiZXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHQpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3JpbmcodCl7dC5fc3RhdGU9ImVycm9yZWQiO3QuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltTXSgpO3ZhciByPXQuX3N0b3JlZEVycm9yO3QuX3dyaXRlUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5fcmVqZWN0KHIpfSkpO3QuX3dyaXRlUmVxdWVzdHM9bmV3IGg7aWYodm9pZCAwIT09dC5fcGVuZGluZ0Fib3J0UmVxdWVzdCl7dmFyIGE9dC5fcGVuZGluZ0Fib3J0UmVxdWVzdDt0Ll9wZW5kaW5nQWJvcnRSZXF1ZXN0PXZvaWQgMDtpZighMCE9PWEuX3dhc0FscmVhZHlFcnJvcmluZyl1cG9uUHJvbWlzZSh0Ll93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXJbdl0oYS5fcmVhc29uKSwoZnVuY3Rpb24oKXthLl9yZXNvbHZlKCk7V3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZCh0KX0pLChmdW5jdGlvbihyKXthLl9yZWplY3Qocik7V3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZCh0KX0pKTtlbHNle2EuX3JlamVjdChyKTtXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHQpfX1lbHNlIFdyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQodCl9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQodCl7cmV0dXJuIHZvaWQgMCE9PXQuX2Nsb3NlUmVxdWVzdHx8dm9pZCAwIT09dC5faW5GbGlnaHRDbG9zZVJlcXVlc3R9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZCh0KXtpZih2b2lkIDAhPT10Ll9jbG9zZVJlcXVlc3Qpe3QuX2Nsb3NlUmVxdWVzdC5fcmVqZWN0KHQuX3N0b3JlZEVycm9yKTt0Ll9jbG9zZVJlcXVlc3Q9dm9pZCAwfXZhciByPXQuX3dyaXRlcjt2b2lkIDAhPT1yJiZkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyLHQuX3N0b3JlZEVycm9yKX1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZSh0LHIpe3ZhciBhPXQuX3dyaXRlcjt2b2lkIDAhPT1hJiZyIT09dC5fYmFja3ByZXNzdXJlJiYoITA9PT1yP2Z1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCh0KXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0KX0oYSk6ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUoYSkpO3QuX2JhY2twcmVzc3VyZT1yfXZhciB3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHQpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFdyaXRhYmxlU3RyZWFtIGluc3RhbmNlIik7aWYoITA9PT1Jc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgd3JpdGluZyBieSBhbm90aGVyIHdyaXRlciIpO3RoaXMuX293bmVyV3JpdGFibGVTdHJlYW09dDt0Ll93cml0ZXI9dGhpczt2YXIgcj10Ll9zdGF0ZTtpZigid3JpdGFibGUiPT09cil7ITE9PT1Xcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodCh0KSYmITA9PT10Ll9iYWNrcHJlc3N1cmU/ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUodGhpcyk6ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO2RlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKX1lbHNlIGlmKCJlcnJvcmluZyI9PT1yKXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcyx0Ll9zdG9yZWRFcnJvcik7ZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpfWVsc2UgaWYoImNsb3NlZCI9PT1yKXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7IWZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodCl7ZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHQpO2RlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh0KX0odGhpcyl9ZWxzZXt2YXIgYT10Ll9zdG9yZWRFcnJvcjtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcyxhKTtkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsYSl9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCJjbG9zZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMT09PUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpP3Byb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oImNsb3NlZCIpKTp0aGlzLl9jbG9zZWRQcm9taXNlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCJkZXNpcmVkU2l6ZSIse2dldDpmdW5jdGlvbigpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykpdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oImRlc2lyZWRTaXplIik7aWYodm9pZCAwPT09dGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbSl0aHJvdyBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbigiZGVzaXJlZFNpemUiKTtyZXR1cm4gZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUodCl7dmFyIHI9dC5fb3duZXJXcml0YWJsZVN0cmVhbSxhPXIuX3N0YXRlO3JldHVybiJlcnJvcmVkIj09PWF8fCJlcnJvcmluZyI9PT1hP251bGw6ImNsb3NlZCI9PT1hPzA6V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHIuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcil9KHRoaXMpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLCJyZWFkeSIse2dldDpmdW5jdGlvbigpe3JldHVybiExPT09SXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigicmVhZHkiKSk6dGhpcy5fcmVhZHlQcm9taXNlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuITE9PT1Jc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKT9wcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJhYm9ydCIpKTp2b2lkIDA9PT10aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtP3Byb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oImFib3J0IikpOmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckFib3J0KHQscil7cmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQodC5fb3duZXJXcml0YWJsZVN0cmVhbSxyKX0odGhpcyx0KX07V3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe2lmKCExPT09SXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykpcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oImNsb3NlIikpO3ZhciB0PXRoaXMuX293bmVyV3JpdGFibGVTdHJlYW07cmV0dXJuIHZvaWQgMD09PXQ/cHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbigiY2xvc2UiKSk6ITA9PT1Xcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodCh0KT9wcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjbG9zZSBhbiBhbHJlYWR5LWNsb3Npbmcgc3RyZWFtIikpOldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHRoaXMpfTtXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLnJlbGVhc2VMb2NrPWZ1bmN0aW9uKCl7aWYoITE9PT1Jc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSl0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigicmVsZWFzZUxvY2siKTt2b2lkIDAhPT10aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtJiZXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHRoaXMpfTtXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiExPT09SXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigid3JpdGUiKSk6dm9pZCAwPT09dGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbT9wcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCJ3cml0ZSB0byIpKTpXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh0aGlzLHQpfTtyZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyfSgpO2Z1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfb3duZXJXcml0YWJsZVN0cmVhbSIpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHQpe3JldHVybiBXcml0YWJsZVN0cmVhbUNsb3NlKHQuX293bmVyV3JpdGFibGVTdHJlYW0pfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZUNsb3NlZFByb21pc2VSZWplY3RlZCh0LHIpeyJwZW5kaW5nIj09PXQuX2Nsb3NlZFByb21pc2VTdGF0ZT9kZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh0LHIpOmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHQscil7ZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0LHIpfSh0LHIpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHQscil7InBlbmRpbmciPT09dC5fcmVhZHlQcm9taXNlU3RhdGU/ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh0LHIpOmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQodCxyKXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodCxyKX0odCxyKX1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHQpe3ZhciByPXQuX293bmVyV3JpdGFibGVTdHJlYW0sYT1uZXcgVHlwZUVycm9yKCJXcml0ZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtJ3MgY2xvc2VkbmVzcyIpO1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHQsYSk7V3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHQsYSk7ci5fd3JpdGVyPXZvaWQgMDt0Ll9vd25lcldyaXRhYmxlU3RyZWFtPXZvaWQgMH1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh0LHIpe3ZhciBhPXQuX293bmVyV3JpdGFibGVTdHJlYW0saT1hLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIsbz1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0Q2h1bmtTaXplKHQscil7dHJ5e3JldHVybiB0Ll9zdHJhdGVneVNpemVBbGdvcml0aG0ocil9Y2F0Y2gocil7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQodCxyKTtyZXR1cm4gMX19KGkscik7aWYoYSE9PXQuX293bmVyV3JpdGFibGVTdHJlYW0pcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oIndyaXRlIHRvIikpO3ZhciBjPWEuX3N0YXRlO2lmKCJlcnJvcmVkIj09PWMpcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYS5fc3RvcmVkRXJyb3IpO2lmKCEwPT09V3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoYSl8fCJjbG9zZWQiPT09YylyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJUaGUgc3RyZWFtIGlzIGNsb3Npbmcgb3IgY2xvc2VkIGFuZCBjYW5ub3QgYmUgd3JpdHRlbiB0byIpKTtpZigiZXJyb3JpbmciPT09YylyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChhLl9zdG9yZWRFcnJvcik7dmFyIGw9ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3QodCl7cmV0dXJuIG5ld1Byb21pc2UoKGZ1bmN0aW9uKHIsYSl7dmFyIGk9e19yZXNvbHZlOnIsX3JlamVjdDphfTt0Ll93cml0ZVJlcXVlc3RzLnB1c2goaSl9KSl9KGEpOyFmdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyV3JpdGUodCxyLGEpe3ZhciBpPXtjaHVuazpyfTt0cnl7RW5xdWV1ZVZhbHVlV2l0aFNpemUodCxpLGEpfWNhdGNoKHIpe1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKHQscik7cmV0dXJufXZhciBvPXQuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtpZighMT09PVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KG8pJiYid3JpdGFibGUiPT09by5fc3RhdGUpe3ZhciBjPVdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUodCk7V3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUobyxjKX1Xcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQodCl9KGkscixvKTtyZXR1cm4gbH12YXIgQz1mdW5jdGlvbigpe2Z1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBleHBsaWNpdGx5Iil9V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7aWYoITE9PT1mdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodCl7cmV0dXJuISF0eXBlSXNPYmplY3QodCkmJiEhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0iKX0odGhpcykpdGhyb3cgbmV3IFR5cGVFcnJvcigiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuZXJyb3IgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiKTsid3JpdGFibGUiPT09dGhpcy5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZSYmV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHRoaXMsdCl9O1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW3ZdPWZ1bmN0aW9uKHQpe3ZhciByPXRoaXMuX2Fib3J0QWxnb3JpdGhtKHQpO1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7cmV0dXJuIHJ9O1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW1NdPWZ1bmN0aW9uKCl7UmVzZXRRdWV1ZSh0aGlzKX07cmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJ9KCk7ZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHQscixhLGksbyxjLGwsdSl7ci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtPXQ7dC5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyPXI7ci5fcXVldWU9dm9pZCAwO3IuX3F1ZXVlVG90YWxTaXplPXZvaWQgMDtSZXNldFF1ZXVlKHIpO3IuX3N0YXJ0ZWQ9ITE7ci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtPXU7ci5fc3RyYXRlZ3lIV009bDtyLl93cml0ZUFsZ29yaXRobT1pO3IuX2Nsb3NlQWxnb3JpdGhtPW87ci5fYWJvcnRBbGdvcml0aG09Yzt2YXIgaD1Xcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKHIpO1dyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlKHQsaCk7dXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChhKCkpLChmdW5jdGlvbigpe3IuX3N0YXJ0ZWQ9ITA7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKHIpfSksKGZ1bmN0aW9uKGEpe3IuX3N0YXJ0ZWQ9ITA7V3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbih0LGEpfSkpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCl7dC5fd3JpdGVBbGdvcml0aG09dm9pZCAwO3QuX2Nsb3NlQWxnb3JpdGhtPXZvaWQgMDt0Ll9hYm9ydEFsZ29yaXRobT12b2lkIDA7dC5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtPXZvaWQgMH1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodCl7cmV0dXJuIHQuX3N0cmF0ZWd5SFdNLXQuX3F1ZXVlVG90YWxTaXplfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZCh0KXt2YXIgcj10Ll9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07aWYoITEhPT10Ll9zdGFydGVkJiZ2b2lkIDA9PT1yLl9pbkZsaWdodFdyaXRlUmVxdWVzdClpZigiZXJyb3JpbmciIT09ci5fc3RhdGUpe2lmKDAhPT10Ll9xdWV1ZS5sZW5ndGgpe3ZhciBhPWZ1bmN0aW9uIFBlZWtRdWV1ZVZhbHVlKHQpe3JldHVybiB0Ll9xdWV1ZS5wZWVrKCkudmFsdWV9KHQpOyJjbG9zZSI9PT1hP2Z1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UodCl7dmFyIHI9dC5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtOyFmdW5jdGlvbiBXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodCh0KXt0Ll9pbkZsaWdodENsb3NlUmVxdWVzdD10Ll9jbG9zZVJlcXVlc3Q7dC5fY2xvc2VSZXF1ZXN0PXZvaWQgMH0ocik7RGVxdWV1ZVZhbHVlKHQpO3ZhciBhPXQuX2Nsb3NlQWxnb3JpdGhtKCk7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTt1cG9uUHJvbWlzZShhLChmdW5jdGlvbigpeyFmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2UodCl7dC5faW5GbGlnaHRDbG9zZVJlcXVlc3QuX3Jlc29sdmUodm9pZCAwKTt0Ll9pbkZsaWdodENsb3NlUmVxdWVzdD12b2lkIDA7aWYoImVycm9yaW5nIj09PXQuX3N0YXRlKXt0Ll9zdG9yZWRFcnJvcj12b2lkIDA7aWYodm9pZCAwIT09dC5fcGVuZGluZ0Fib3J0UmVxdWVzdCl7dC5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVzb2x2ZSgpO3QuX3BlbmRpbmdBYm9ydFJlcXVlc3Q9dm9pZCAwfX10Ll9zdGF0ZT0iY2xvc2VkIjt2YXIgcj10Ll93cml0ZXI7dm9pZCAwIT09ciYmZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHIpfShyKX0pLChmdW5jdGlvbih0KXshZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHQscil7dC5faW5GbGlnaHRDbG9zZVJlcXVlc3QuX3JlamVjdChyKTt0Ll9pbkZsaWdodENsb3NlUmVxdWVzdD12b2lkIDA7aWYodm9pZCAwIT09dC5fcGVuZGluZ0Fib3J0UmVxdWVzdCl7dC5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVqZWN0KHIpO3QuX3BlbmRpbmdBYm9ydFJlcXVlc3Q9dm9pZCAwfVdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24odCxyKX0ocix0KX0pKX0odCk6ZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZSh0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTshZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodCh0KXt0Ll9pbkZsaWdodFdyaXRlUmVxdWVzdD10Ll93cml0ZVJlcXVlc3RzLnNoaWZ0KCl9KGEpO3Vwb25Qcm9taXNlKHQuX3dyaXRlQWxnb3JpdGhtKHIpLChmdW5jdGlvbigpeyFmdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUodCl7dC5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3Jlc29sdmUodm9pZCAwKTt0Ll9pbkZsaWdodFdyaXRlUmVxdWVzdD12b2lkIDB9KGEpO3ZhciByPWEuX3N0YXRlO0RlcXVldWVWYWx1ZSh0KTtpZighMT09PVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGEpJiYid3JpdGFibGUiPT09cil7dmFyIGk9V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZSh0KTtXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShhLGkpfVdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZCh0KX0pLChmdW5jdGlvbihyKXsid3JpdGFibGUiPT09YS5fc3RhdGUmJldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCk7IWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZVdpdGhFcnJvcih0LHIpe3QuX2luRmxpZ2h0V3JpdGVSZXF1ZXN0Ll9yZWplY3Qocik7dC5faW5GbGlnaHRXcml0ZVJlcXVlc3Q9dm9pZCAwO1dyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24odCxyKX0oYSxyKX0pKX0odCxhLmNodW5rKX19ZWxzZSBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHIpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKHQscil7IndyaXRhYmxlIj09PXQuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbS5fc3RhdGUmJldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0LHIpfWZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUodCl7cmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0KTw9MH1mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodCxyKXt2YXIgYT10Ll9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3JpbmcoYSxyKX1mdW5jdGlvbiBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtIil9ZnVuY3Rpb24gZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24odCl7cmV0dXJuIG5ldyBUeXBlRXJyb3IoIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIpfWZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJDYW5ub3QgIit0KyIgYSBzdHJlYW0gdXNpbmcgYSByZWxlYXNlZCB3cml0ZXIiKX1mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUodCl7dC5fY2xvc2VkUHJvbWlzZT1uZXdQcm9taXNlKChmdW5jdGlvbihyLGEpe3QuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZT1yO3QuX2Nsb3NlZFByb21pc2VfcmVqZWN0PWE7dC5fY2xvc2VkUHJvbWlzZVN0YXRlPSJwZW5kaW5nIn0pKX1mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHQscil7ZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHQpO2RlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHQscil9ZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3QodCxyKXtzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHQuX2Nsb3NlZFByb21pc2UpO3QuX2Nsb3NlZFByb21pc2VfcmVqZWN0KHIpO3QuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZT12b2lkIDA7dC5fY2xvc2VkUHJvbWlzZV9yZWplY3Q9dm9pZCAwO3QuX2Nsb3NlZFByb21pc2VTdGF0ZT0icmVqZWN0ZWQifWZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh0KXt0Ll9jbG9zZWRQcm9taXNlX3Jlc29sdmUodm9pZCAwKTt0Ll9jbG9zZWRQcm9taXNlX3Jlc29sdmU9dm9pZCAwO3QuX2Nsb3NlZFByb21pc2VfcmVqZWN0PXZvaWQgMDt0Ll9jbG9zZWRQcm9taXNlU3RhdGU9InJlc29sdmVkIn1mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0KXt0Ll9yZWFkeVByb21pc2U9bmV3UHJvbWlzZSgoZnVuY3Rpb24ocixhKXt0Ll9yZWFkeVByb21pc2VfcmVzb2x2ZT1yO3QuX3JlYWR5UHJvbWlzZV9yZWplY3Q9YX0pKTt0Ll9yZWFkeVByb21pc2VTdGF0ZT0icGVuZGluZyJ9ZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHQscil7ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUodCk7ZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh0LHIpfWZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0KXtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0KTtkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh0KX1mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVqZWN0KHQscil7c2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh0Ll9yZWFkeVByb21pc2UpO3QuX3JlYWR5UHJvbWlzZV9yZWplY3Qocik7dC5fcmVhZHlQcm9taXNlX3Jlc29sdmU9dm9pZCAwO3QuX3JlYWR5UHJvbWlzZV9yZWplY3Q9dm9pZCAwO3QuX3JlYWR5UHJvbWlzZVN0YXRlPSJyZWplY3RlZCJ9ZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUodCl7dC5fcmVhZHlQcm9taXNlX3Jlc29sdmUodm9pZCAwKTt0Ll9yZWFkeVByb21pc2VfcmVzb2x2ZT12b2lkIDA7dC5fcmVhZHlQcm9taXNlX3JlamVjdD12b2lkIDA7dC5fcmVhZHlQcm9taXNlU3RhdGU9ImZ1bGZpbGxlZCJ9ZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh0KXtpZigib2JqZWN0IiE9dHlwZW9mIHR8fG51bGw9PT10KXJldHVybiExO3RyeXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0LmFib3J0ZWR9Y2F0Y2godCl7cmV0dXJuITF9fXZhciBfPSJ1bmRlZmluZWQiIT10eXBlb2YgRE9NRXhjZXB0aW9uP0RPTUV4Y2VwdGlvbjp2b2lkIDAseD1mdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuITE7dHJ5e25ldyB0O3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oXyk/XzpmdW5jdGlvbiBjcmVhdGVET01FeGNlcHRpb25Qb2x5ZmlsbCgpe3ZhciB0PWZ1bmN0aW9uIERPTUV4Y2VwdGlvbih0LHIpe3RoaXMubWVzc2FnZT10fHwiIjt0aGlzLm5hbWU9cnx8IkVycm9yIjtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKX07dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3JldHVybiB0fSgpO2Z1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUGlwZVRvKHQscixhLGksbyxjKXt2YXIgbD1BY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHQpLHU9QWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihyKTt0Ll9kaXN0dXJiZWQ9ITA7dmFyIGg9ITEsZD1wcm9taXNlUmVzb2x2ZWRXaXRoKHZvaWQgMCk7cmV0dXJuIG5ld1Byb21pc2UoKGZ1bmN0aW9uKHAsbSl7dmFyIGc7aWYodm9pZCAwIT09Yyl7Zz1mdW5jdGlvbigpe3ZhciBhPW5ldyB4KCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpLGM9W107ITE9PT1pJiZjLnB1c2goKGZ1bmN0aW9uKCl7cmV0dXJuIndyaXRhYmxlIj09PXIuX3N0YXRlP1dyaXRhYmxlU3RyZWFtQWJvcnQocixhKTpwcm9taXNlUmVzb2x2ZWRXaXRoKHZvaWQgMCl9KSk7ITE9PT1vJiZjLnB1c2goKGZ1bmN0aW9uKCl7cmV0dXJuInJlYWRhYmxlIj09PXQuX3N0YXRlP1JlYWRhYmxlU3RyZWFtQ2FuY2VsKHQsYSk6cHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApfSkpO3NodXRkb3duV2l0aEFjdGlvbigoZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5hbGwoYy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSkpfSksITAsYSl9O2lmKCEwPT09Yy5hYm9ydGVkKXtnKCk7cmV0dXJufWMuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGcpfWlzT3JCZWNvbWVzRXJyb3JlZCh0LGwuX2Nsb3NlZFByb21pc2UsKGZ1bmN0aW9uKHQpeyExPT09aT9zaHV0ZG93bldpdGhBY3Rpb24oKGZ1bmN0aW9uKCl7cmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQocix0KX0pLCEwLHQpOnNodXRkb3duKCEwLHQpfSkpO2lzT3JCZWNvbWVzRXJyb3JlZChyLHUuX2Nsb3NlZFByb21pc2UsKGZ1bmN0aW9uKHIpeyExPT09bz9zaHV0ZG93bldpdGhBY3Rpb24oKGZ1bmN0aW9uKCl7cmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHQscil9KSwhMCxyKTpzaHV0ZG93bighMCxyKX0pKTshZnVuY3Rpb24gaXNPckJlY29tZXNDbG9zZWQodCxyLGEpeyJjbG9zZWQiPT09dC5fc3RhdGU/YSgpOnVwb25GdWxmaWxsbWVudChyLGEpfSh0LGwuX2Nsb3NlZFByb21pc2UsKGZ1bmN0aW9uKCl7ITE9PT1hP3NodXRkb3duV2l0aEFjdGlvbigoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih0KXt2YXIgcj10Ll9vd25lcldyaXRhYmxlU3RyZWFtLGE9ci5fc3RhdGU7cmV0dXJuITA9PT1Xcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChyKXx8ImNsb3NlZCI9PT1hP3Byb21pc2VSZXNvbHZlZFdpdGgodm9pZCAwKToiZXJyb3JlZCI9PT1hP3Byb21pc2VSZWplY3RlZFdpdGgoci5fc3RvcmVkRXJyb3IpOldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHQpfSh1KX0pKTpzaHV0ZG93bigpfSkpO2lmKCEwPT09V3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQocil8fCJjbG9zZWQiPT09ci5fc3RhdGUpe3ZhciB5PW5ldyBUeXBlRXJyb3IoInRoZSBkZXN0aW5hdGlvbiB3cml0YWJsZSBzdHJlYW0gY2xvc2VkIGJlZm9yZSBhbGwgZGF0YSBjb3VsZCBiZSBwaXBlZCB0byBpdCIpOyExPT09bz9zaHV0ZG93bldpdGhBY3Rpb24oKGZ1bmN0aW9uKCl7cmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHQseSl9KSwhMCx5KTpzaHV0ZG93bighMCx5KX1zZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKGZ1bmN0aW9uIHBpcGVMb29wKCl7cmV0dXJuIG5ld1Byb21pc2UoKGZ1bmN0aW9uKHQscil7IWZ1bmN0aW9uIG5leHQoYSl7YT90KCk6UGVyZm9ybVByb21pc2VUaGVuKGZ1bmN0aW9uIHBpcGVTdGVwKCl7cmV0dXJuITA9PT1oP3Byb21pc2VSZXNvbHZlZFdpdGgoITApOlBlcmZvcm1Qcm9taXNlVGhlbih1Ll9yZWFkeVByb21pc2UsKGZ1bmN0aW9uKCl7cmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKGwpLChmdW5jdGlvbih0KXtpZighMD09PXQuZG9uZSlyZXR1cm4hMDtkPVBlcmZvcm1Qcm9taXNlVGhlbihXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh1LHQudmFsdWUpLHZvaWQgMCxub29wKTtyZXR1cm4hMX0pKX0pKX0oKSxuZXh0LHIpfSghMSl9KSl9KCkpO2Z1bmN0aW9uIHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpe3ZhciB0PWQ7cmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihkLChmdW5jdGlvbigpe3JldHVybiB0IT09ZD93YWl0Rm9yV3JpdGVzVG9GaW5pc2goKTp2b2lkIDB9KSl9ZnVuY3Rpb24gaXNPckJlY29tZXNFcnJvcmVkKHQscixhKXsiZXJyb3JlZCI9PT10Ll9zdGF0ZT9hKHQuX3N0b3JlZEVycm9yKTp1cG9uUmVqZWN0aW9uKHIsYSl9ZnVuY3Rpb24gc2h1dGRvd25XaXRoQWN0aW9uKHQsYSxpKXtpZighMCE9PWgpe2g9ITA7IndyaXRhYmxlIj09PXIuX3N0YXRlJiYhMT09PVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHIpP3Vwb25GdWxmaWxsbWVudCh3YWl0Rm9yV3JpdGVzVG9GaW5pc2goKSxkb1RoZVJlc3QpOmRvVGhlUmVzdCgpfWZ1bmN0aW9uIGRvVGhlUmVzdCgpe3Vwb25Qcm9taXNlKHQoKSwoZnVuY3Rpb24oKXtyZXR1cm4gZmluYWxpemUoYSxpKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gZmluYWxpemUoITAsdCl9KSl9fWZ1bmN0aW9uIHNodXRkb3duKHQsYSl7aWYoITAhPT1oKXtoPSEwOyJ3cml0YWJsZSI9PT1yLl9zdGF0ZSYmITE9PT1Xcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChyKT91cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksKGZ1bmN0aW9uKCl7cmV0dXJuIGZpbmFsaXplKHQsYSl9KSk6ZmluYWxpemUodCxhKX19ZnVuY3Rpb24gZmluYWxpemUodCxyKXtXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHUpO1JlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UobCk7dm9pZCAwIT09YyYmYy5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsZyk7dD9tKHIpOnAodm9pZCAwKX19KSl9dmFyIEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKCl7dGhyb3cgbmV3IFR5cGVFcnJvcn1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsImRlc2lyZWRTaXplIix7Z2V0OmZ1bmN0aW9uKCl7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJkZXNpcmVkU2l6ZSIpO3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtpZighMT09PUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSl0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oImNsb3NlIik7aWYoITE9PT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgY2xvc2UiKTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UodGhpcyl9O1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24odCl7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJlbnF1ZXVlIik7aWYoITE9PT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZSIpO3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLHQpfTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXtpZighMT09PUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSl0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oImVycm9yIik7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHRoaXMsdCl9O1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW2RdPWZ1bmN0aW9uKHQpe1Jlc2V0UXVldWUodGhpcyk7dmFyIHI9dGhpcy5fY2FuY2VsQWxnb3JpdGhtKHQpO1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7cmV0dXJuIHJ9O1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlW3BdPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO2lmKHRoaXMuX3F1ZXVlLmxlbmd0aD4wKXt2YXIgcj1EZXF1ZXVlVmFsdWUodGhpcyk7aWYoITA9PT10aGlzLl9jbG9zZVJlcXVlc3RlZCYmMD09PXRoaXMuX3F1ZXVlLmxlbmd0aCl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtSZWFkYWJsZVN0cmVhbUNsb3NlKHQpfWVsc2UgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodGhpcyk7cmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoUmVhZGFibGVTdHJlYW1DcmVhdGVSZWFkUmVzdWx0KHIsITEsdC5fcmVhZGVyLl9mb3JBdXRob3JDb2RlKSl9dmFyIGE9UmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdCh0KTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0aGlzKTtyZXR1cm4gYX07cmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJ9KCk7ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtIil9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl7aWYoITEhPT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwodCkpaWYoITAhPT10Ll9wdWxsaW5nKXt0Ll9wdWxsaW5nPSEwO3Vwb25Qcm9taXNlKHQuX3B1bGxBbGdvcml0aG0oKSwoZnVuY3Rpb24oKXt0Ll9wdWxsaW5nPSExO2lmKCEwPT09dC5fcHVsbEFnYWluKXt0Ll9wdWxsQWdhaW49ITE7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl9fSksKGZ1bmN0aW9uKHIpe1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0LHIpfSkpfWVsc2UgdC5fcHVsbEFnYWluPSEwfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCh0KXt2YXIgcj10Ll9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07cmV0dXJuITEhPT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodCkmJiExIT09dC5fc3RhcnRlZCYmKCEwPT09SXNSZWFkYWJsZVN0cmVhbUxvY2tlZChyKSYmUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMocik+MHx8UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHQpPjApfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCl7dC5fcHVsbEFsZ29yaXRobT12b2lkIDA7dC5fY2FuY2VsQWxnb3JpdGhtPXZvaWQgMDt0Ll9zdHJhdGVneVNpemVBbGdvcml0aG09dm9pZCAwfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0KXt2YXIgcj10Ll9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07dC5fY2xvc2VSZXF1ZXN0ZWQ9ITA7aWYoMD09PXQuX3F1ZXVlLmxlbmd0aCl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtSZWFkYWJsZVN0cmVhbUNsb3NlKHIpfX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtpZighMD09PUlzUmVhZGFibGVTdHJlYW1Mb2NrZWQoYSkmJlJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKGEpPjApUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3QoYSxyLCExKTtlbHNle3ZhciBpPXZvaWQgMDt0cnl7aT10Ll9zdHJhdGVneVNpemVBbGdvcml0aG0ocil9Y2F0Y2gocil7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHQscik7dGhyb3cgcn10cnl7RW5xdWV1ZVZhbHVlV2l0aFNpemUodCxyLGkpfWNhdGNoKHIpe1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0LHIpO3Rocm93IHJ9fVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHQpfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtpZigicmVhZGFibGUiPT09YS5fc3RhdGUpe1Jlc2V0UXVldWUodCk7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtSZWFkYWJsZVN0cmVhbUVycm9yKGEscil9fWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0KXt2YXIgcj10Ll9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0uX3N0YXRlO3JldHVybiJlcnJvcmVkIj09PXI/bnVsbDoiY2xvc2VkIj09PXI/MDp0Ll9zdHJhdGVneUhXTS10Ll9xdWV1ZVRvdGFsU2l6ZX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodCl7dmFyIHI9dC5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTtyZXR1cm4hMT09PXQuX2Nsb3NlUmVxdWVzdGVkJiYicmVhZGFibGUiPT09cn1mdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodCxyLGEsaSxvLGMsbCl7ci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtPXQ7ci5fcXVldWU9dm9pZCAwO3IuX3F1ZXVlVG90YWxTaXplPXZvaWQgMDtSZXNldFF1ZXVlKHIpO3IuX3N0YXJ0ZWQ9ITE7ci5fY2xvc2VSZXF1ZXN0ZWQ9ITE7ci5fcHVsbEFnYWluPSExO3IuX3B1bGxpbmc9ITE7ci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtPWw7ci5fc3RyYXRlZ3lIV009YztyLl9wdWxsQWxnb3JpdGhtPWk7ci5fY2FuY2VsQWxnb3JpdGhtPW87dC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyPXI7dXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChhKCkpLChmdW5jdGlvbigpe3IuX3N0YXJ0ZWQ9ITA7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQocil9KSwoZnVuY3Rpb24odCl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHIsdCl9KSl9ZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS4iK3QrIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIpfXZhciBUPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmaXNGaW5pdGUodCkmJk1hdGguZmxvb3IodCk9PT10fSxSPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QgY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkiKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUsInZpZXciLHtnZXQ6ZnVuY3Rpb24oKXtpZighMT09PUlzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCh0aGlzKSl0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oInZpZXciKTtyZXR1cm4gdGhpcy5fdmlld30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS5yZXNwb25kPWZ1bmN0aW9uKHQpe2lmKCExPT09SXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKXRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigicmVzcG9uZCIpO2lmKHZvaWQgMD09PXRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoaXMgQllPQiByZXF1ZXN0IGhhcyBiZWVuIGludmFsaWRhdGVkIik7dGhpcy5fdmlldy5idWZmZXI7IWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKHQscil7aWYoITE9PT1Jc0Zpbml0ZU5vbk5lZ2F0aXZlTnVtYmVyKHI9TnVtYmVyKHIpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiYnl0ZXNXcml0dGVuIG11c3QgYmUgYSBmaW5pdGUiKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEludGVybmFsKHQscil9KHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLHQpfTtSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS5yZXNwb25kV2l0aE5ld1ZpZXc9ZnVuY3Rpb24odCl7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QodGhpcykpdGhyb3cgYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKCJyZXNwb25kIik7aWYodm9pZCAwPT09dGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQiKTtpZighQXJyYXlCdWZmZXIuaXNWaWV3KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIllvdSBjYW4gb25seSByZXNwb25kIHdpdGggYXJyYXkgYnVmZmVyIHZpZXdzIik7dC5idWZmZXI7IWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcodCxyKXt2YXIgYT10Ll9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtpZihhLmJ5dGVPZmZzZXQrYS5ieXRlc0ZpbGxlZCE9PXIuYnl0ZU9mZnNldCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVGhlIHJlZ2lvbiBzcGVjaWZpZWQgYnkgdmlldyBkb2VzIG5vdCBtYXRjaCBieW9iUmVxdWVzdCIpO2lmKGEuYnl0ZUxlbmd0aCE9PXIuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVGhlIGJ1ZmZlciBvZiB2aWV3IGhhcyBkaWZmZXJlbnQgY2FwYWNpdHkgdGhhbiBieW9iUmVxdWVzdCIpO2EuYnVmZmVyPXIuYnVmZmVyO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwodCxyLmJ5dGVMZW5ndGgpfSh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcix0KX07cmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3R9KCksST1mdW5jdGlvbigpe2Z1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5Iil9T2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCJieW9iUmVxdWVzdCIse2dldDpmdW5jdGlvbigpe2lmKCExPT09SXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKXRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiYnlvYlJlcXVlc3QiKTtpZih2b2lkIDA9PT10aGlzLl9ieW9iUmVxdWVzdCYmdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MCl7dmFyIHQ9dGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCkscj1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrdC5ieXRlc0ZpbGxlZCx0LmJ5dGVMZW5ndGgtdC5ieXRlc0ZpbGxlZCksYT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTshZnVuY3Rpb24gU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHQscixhKXt0Ll9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcj1yO3QuX3ZpZXc9YX0oYSx0aGlzLHIpO3RoaXMuX2J5b2JSZXF1ZXN0PWF9cmV0dXJuIHRoaXMuX2J5b2JSZXF1ZXN0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSwiZGVzaXJlZFNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtpZighMT09PUlzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSl0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oImRlc2lyZWRTaXplIik7cmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe2lmKCExPT09SXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKXRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiY2xvc2UiKTtpZighMD09PXRoaXMuX2Nsb3NlUmVxdWVzdGVkKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQ7IGRvIG5vdCBjbG9zZSBpdCBhZ2FpbiEiKTt2YXIgdD10aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtpZigicmVhZGFibGUiIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgc3RyZWFtIChpbiAiK3QrIiBzdGF0ZSkgaXMgbm90IGluIHRoZSByZWFkYWJsZSBzdGF0ZSBhbmQgY2Fubm90IGJlIGNsb3NlZCIpOyFmdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UodCl7dmFyIHI9dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtpZih0Ll9xdWV1ZVRvdGFsU2l6ZT4wKXQuX2Nsb3NlUmVxdWVzdGVkPSEwO2Vsc2V7aWYodC5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MCYmdC5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCkuYnl0ZXNGaWxsZWQ+MCl7dmFyIGE9bmV3IFR5cGVFcnJvcigiSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlciIpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcih0LGEpO3Rocm93IGF9UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtSZWFkYWJsZVN0cmVhbUNsb3NlKHIpfX0odGhpcyl9O1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24odCl7aWYoITE9PT1Jc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJlbnF1ZXVlIik7aWYoITA9PT10aGlzLl9jbG9zZVJlcXVlc3RlZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nIik7dmFyIHI9dGhpcy5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7aWYoInJlYWRhYmxlIiE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHN0cmVhbSAoaW4gIityKyIgc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBlbnF1ZXVlZCB0byIpO2lmKCFBcnJheUJ1ZmZlci5pc1ZpZXcodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IGNhbiBvbmx5IGVucXVldWUgYXJyYXkgYnVmZmVyIHZpZXdzIHdoZW4gdXNpbmcgYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIik7dC5idWZmZXI7IWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKHQscil7dmFyIGE9dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSxpPXIuYnVmZmVyLG89ci5ieXRlT2Zmc2V0LGM9ci5ieXRlTGVuZ3RoLGw9aTtpZighMD09PVJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihhKSlpZigwPT09UmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoYSkpUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUodCxsLG8sYyk7ZWxzZXt2YXIgdT1uZXcgVWludDhBcnJheShsLG8sYyk7UmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3QoYSx1LCExKX1lbHNlIGlmKCEwPT09UmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKGEpKXtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZSh0LGwsbyxjKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKHQpfWVsc2UgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUodCxsLG8sYyk7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl9KHRoaXMsdCl9O1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKHQpe2lmKCExPT09SXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKXRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiZXJyb3IiKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IodGhpcyx0KX07UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGVbZF09ZnVuY3Rpb24odCl7dGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MCYmKHRoaXMuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpLmJ5dGVzRmlsbGVkPTApO1Jlc2V0UXVldWUodGhpcyk7dmFyIHI9dGhpcy5fY2FuY2VsQWxnb3JpdGhtKHQpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7cmV0dXJuIHJ9O1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlW3BdPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtpZih0aGlzLl9xdWV1ZVRvdGFsU2l6ZT4wKXt2YXIgcj10aGlzLl9xdWV1ZS5zaGlmdCgpO3RoaXMuX3F1ZXVlVG90YWxTaXplLT1yLmJ5dGVMZW5ndGg7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4odGhpcyk7dmFyIGE9dm9pZCAwO3RyeXthPW5ldyBVaW50OEFycmF5KHIuYnVmZmVyLHIuYnl0ZU9mZnNldCxyLmJ5dGVMZW5ndGgpfWNhdGNoKHQpe3JldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHQpfXJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChhLCExLHQuX3JlYWRlci5fZm9yQXV0aG9yQ29kZSkpfXZhciBpPXRoaXMuX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZTtpZih2b2lkIDAhPT1pKXt2YXIgbz12b2lkIDA7dHJ5e289bmV3IEFycmF5QnVmZmVyKGkpfWNhdGNoKHQpe3JldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHQpfXZhciBjPXtidWZmZXI6byxieXRlT2Zmc2V0OjAsYnl0ZUxlbmd0aDppLGJ5dGVzRmlsbGVkOjAsZWxlbWVudFNpemU6MSxjdG9yOlVpbnQ4QXJyYXkscmVhZGVyVHlwZToiZGVmYXVsdCJ9O3RoaXMuX3BlbmRpbmdQdWxsSW50b3MucHVzaChjKX12YXIgbD1SZWFkYWJsZVN0cmVhbUFkZFJlYWRSZXF1ZXN0KHQpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO3JldHVybiBsfTtyZXR1cm4gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcn0oKTtmdW5jdGlvbiBJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodCl7cmV0dXJuISF0eXBlSXNPYmplY3QodCkmJiEhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtIil9ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiKX1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0KXtpZighMSE9PWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCh0KXt2YXIgcj10Ll9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO3JldHVybiJyZWFkYWJsZSI9PT1yLl9zdGF0ZSYmKCEwIT09dC5fY2xvc2VSZXF1ZXN0ZWQmJighMSE9PXQuX3N0YXJ0ZWQmJighMD09PVJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihyKSYmUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMocik+MHx8KCEwPT09UmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHIpJiZSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMocik+MHx8UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKHQpPjApKSkpfSh0KSlpZighMCE9PXQuX3B1bGxpbmcpe3QuX3B1bGxpbmc9ITA7dXBvblByb21pc2UodC5fcHVsbEFsZ29yaXRobSgpLChmdW5jdGlvbigpe3QuX3B1bGxpbmc9ITE7aWYoITA9PT10Ll9wdWxsQWdhaW4pe3QuX3B1bGxBZ2Fpbj0hMTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0KX19KSwoZnVuY3Rpb24ocil7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKHQscil9KSl9ZWxzZSB0Ll9wdWxsQWdhaW49ITB9ZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcih0LHIpe3ZhciBhPSExOyJjbG9zZWQiPT09dC5fc3RhdGUmJihhPSEwKTt2YXIgaT1SZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihyKTsiZGVmYXVsdCI9PT1yLnJlYWRlclR5cGU/UmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3QodCxpLGEpOmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRJbnRvUmVxdWVzdCh0LHIsYSl7dmFyIGk9dC5fcmVhZGVyO2kuX3JlYWRJbnRvUmVxdWVzdHMuc2hpZnQoKS5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQocixhLGkuX2ZvckF1dGhvckNvZGUpKX0odCxpLGEpfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yKHQpe3ZhciByPXQuYnl0ZXNGaWxsZWQsYT10LmVsZW1lbnRTaXplO3JldHVybiBuZXcgdC5jdG9yKHQuYnVmZmVyLHQuYnl0ZU9mZnNldCxyL2EpfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKHQscixhLGkpe3QuX3F1ZXVlLnB1c2goe2J1ZmZlcjpyLGJ5dGVPZmZzZXQ6YSxieXRlTGVuZ3RoOml9KTt0Ll9xdWV1ZVRvdGFsU2l6ZSs9aX1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSh0LHIpe3ZhciBhPXIuZWxlbWVudFNpemUsaT1yLmJ5dGVzRmlsbGVkLXIuYnl0ZXNGaWxsZWQlYSxvPU1hdGgubWluKHQuX3F1ZXVlVG90YWxTaXplLHIuYnl0ZUxlbmd0aC1yLmJ5dGVzRmlsbGVkKSxjPXIuYnl0ZXNGaWxsZWQrbyxsPWMtYyVhLHU9byxoPSExO2lmKGw+aSl7dT1sLXIuYnl0ZXNGaWxsZWQ7aD0hMH1mb3IodmFyIGQscCxtLGcseSxiPXQuX3F1ZXVlO3U+MDspe3ZhciB2PWIucGVlaygpLFM9TWF0aC5taW4odSx2LmJ5dGVMZW5ndGgpLGs9ci5ieXRlT2Zmc2V0K3IuYnl0ZXNGaWxsZWQ7ZD1yLmJ1ZmZlcixwPWssbT12LmJ1ZmZlcixnPXYuYnl0ZU9mZnNldCx5PVMsbmV3IFVpbnQ4QXJyYXkoZCkuc2V0KG5ldyBVaW50OEFycmF5KG0sZyx5KSxwKTtpZih2LmJ5dGVMZW5ndGg9PT1TKWIuc2hpZnQoKTtlbHNle3YuYnl0ZU9mZnNldCs9Uzt2LmJ5dGVMZW5ndGgtPVN9dC5fcXVldWVUb3RhbFNpemUtPVM7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKHQsUyxyKTt1LT1TfXJldHVybiBofWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvcih0LHIsYSl7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdCh0KTthLmJ5dGVzRmlsbGVkKz1yfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKHQpe2lmKDA9PT10Ll9xdWV1ZVRvdGFsU2l6ZSYmITA9PT10Ll9jbG9zZVJlcXVlc3RlZCl7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0KTtSZWFkYWJsZVN0cmVhbUNsb3NlKHQuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0pfWVsc2UgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl9ZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdCh0KXtpZih2b2lkIDAhPT10Ll9ieW9iUmVxdWVzdCl7dC5fYnlvYlJlcXVlc3QuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyPXZvaWQgMDt0Ll9ieW9iUmVxdWVzdC5fdmlldz12b2lkIDA7dC5fYnlvYlJlcXVlc3Q9dm9pZCAwfX1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKHQpe2Zvcig7dC5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MDspe2lmKDA9PT10Ll9xdWV1ZVRvdGFsU2l6ZSlyZXR1cm47dmFyIHI9dC5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7aWYoITA9PT1SZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSh0LHIpKXtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8odCk7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcih0Ll9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLHIpfX19ZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbCh0LHIpe3ZhciBhPXQuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO2lmKCJjbG9zZWQiPT09dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGUpe2lmKDAhPT1yKXRocm93IG5ldyBUeXBlRXJyb3IoImJ5dGVzV3JpdHRlbiBtdXN0IGJlIDAgd2hlbiBjYWxsaW5nIHJlc3BvbmQoKSBvbiBhIGNsb3NlZCBzdHJlYW0iKTshZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlKHQscil7ci5idWZmZXI9ci5idWZmZXI7dmFyIGE9dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtpZighMD09PVJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihhKSlmb3IoO1JlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyhhKT4wOylSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGEsUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKHQpKX0odCxhKX1lbHNlIWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKHQscixhKXtpZihhLmJ5dGVzRmlsbGVkK3I+YS5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJieXRlc1dyaXR0ZW4gb3V0IG9mIHJhbmdlIik7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKHQscixhKTtpZighKGEuYnl0ZXNGaWxsZWQ8YS5lbGVtZW50U2l6ZSkpe1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byh0KTt2YXIgaT1hLmJ5dGVzRmlsbGVkJWEuZWxlbWVudFNpemU7aWYoaT4wKXt2YXIgbz1hLmJ5dGVPZmZzZXQrYS5ieXRlc0ZpbGxlZCxjPWEuYnVmZmVyLnNsaWNlKG8taSxvKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZSh0LGMsMCxjLmJ5dGVMZW5ndGgpfWEuYnVmZmVyPWEuYnVmZmVyO2EuYnl0ZXNGaWxsZWQtPWk7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcih0Ll9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLGEpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUodCl9fSh0LHIsYSk7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodCl9ZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKHQpe3ZhciByPXQuX3BlbmRpbmdQdWxsSW50b3Muc2hpZnQoKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KHQpO3JldHVybiByfWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCl7dC5fcHVsbEFsZ29yaXRobT12b2lkIDA7dC5fY2FuY2VsQWxnb3JpdGhtPXZvaWQgMH1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IodCxyKXt2YXIgYT10Ll9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO2lmKCJyZWFkYWJsZSI9PT1hLl9zdGF0ZSl7IWZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3ModCl7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdCh0KTt0Ll9wZW5kaW5nUHVsbEludG9zPW5ldyBofSh0KTtSZXNldFF1ZXVlKHQpO1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModCk7UmVhZGFibGVTdHJlYW1FcnJvcihhLHIpfX1mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUodCl7dmFyIHI9dC5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7cmV0dXJuImVycm9yZWQiPT09cj9udWxsOiJjbG9zZWQiPT09cj8wOnQuX3N0cmF0ZWd5SFdNLXQuX3F1ZXVlVG90YWxTaXplfWZ1bmN0aW9uIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHQscixhKXt2YXIgaT1PYmplY3QuY3JlYXRlKEkucHJvdG90eXBlKSxvPUNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHIsInB1bGwiLDAsW2ldKSxjPUNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHIsImNhbmNlbCIsMSxbXSksbD1yLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtpZih2b2lkIDAhPT1sKXtsPU51bWJlcihsKTtpZighMT09PVQobCl8fGw8PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoImF1dG9BbGxvY2F0ZUNodW5rU2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpfSFmdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodCxyLGEsaSxvLGMsbCl7ci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbT10O3IuX3B1bGxBZ2Fpbj0hMTtyLl9wdWxsaW5nPSExO3IuX2J5b2JSZXF1ZXN0PXZvaWQgMDtyLl9xdWV1ZT1yLl9xdWV1ZVRvdGFsU2l6ZT12b2lkIDA7UmVzZXRRdWV1ZShyKTtyLl9jbG9zZVJlcXVlc3RlZD0hMTtyLl9zdGFydGVkPSExO3IuX3N0cmF0ZWd5SFdNPVZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhjKTtyLl9wdWxsQWxnb3JpdGhtPWk7ci5fY2FuY2VsQWxnb3JpdGhtPW87ci5fYXV0b0FsbG9jYXRlQ2h1bmtTaXplPWw7ci5fcGVuZGluZ1B1bGxJbnRvcz1uZXcgaDt0Ll9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI9cjt1cG9uUHJvbWlzZShwcm9taXNlUmVzb2x2ZWRXaXRoKGEoKSksKGZ1bmN0aW9uKCl7ci5fc3RhcnRlZD0hMDtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChyKX0pLChmdW5jdGlvbih0KXtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3Iocix0KX0pKX0odCxpLChmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpe3JldHVybiBJbnZva2VPck5vb3Aociwic3RhcnQiLFtpXSl9KSxvLGMsYSxsKX1mdW5jdGlvbiBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24odCl7cmV0dXJuIG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLiIrdCsiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0Iil9ZnVuY3Rpb24gYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS4iK3QrIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIpfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHQpe3JldHVybiBuZXdQcm9taXNlKChmdW5jdGlvbihyLGEpe3ZhciBpPXtfcmVzb2x2ZTpyLF9yZWplY3Q6YX07dC5fcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLnB1c2goaSl9KSl9ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzKHQpe3JldHVybiB0Ll9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RofWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcih0KXt2YXIgcj10Ll9yZWFkZXI7cmV0dXJuIHZvaWQgMCE9PXImJiEhSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIocil9dmFyIFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodCl7aWYoIUlzUmVhZGFibGVTdHJlYW0odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIGNhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBSZWFkYWJsZVN0cmVhbSBpbnN0YW5jZSBnaXZlbiBhIGJ5dGUgc291cmNlIik7aWYoITE9PT1Jc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29uc3RydWN0IGEgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIGZvciBhIHN0cmVhbSBub3QgY29uc3RydWN0ZWQgd2l0aCBhIGJ5dGUgc291cmNlIik7aWYoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHJlYWRpbmcgYnkgYW5vdGhlciByZWFkZXIiKTtSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsdCk7dGhpcy5fcmVhZEludG9SZXF1ZXN0cz1uZXcgaH1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZSwiY2xvc2VkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIElzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpP3RoaXMuX2Nsb3NlZFByb21pc2U6cHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigiY2xvc2VkIikpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiBJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKT92b2lkIDA9PT10aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtP3Byb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigiY2FuY2VsIikpOlJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLHQpOnByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oImNhbmNlbCIpKX07UmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe2lmKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigicmVhZCIpKTtpZih2b2lkIDA9PT10aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtKXJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oInJlYWQgZnJvbSIpKTtpZighQXJyYXlCdWZmZXIuaXNWaWV3KHQpKXJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoInZpZXcgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldyIpKTt0LmJ1ZmZlcjtyZXR1cm4gMD09PXQuYnl0ZUxlbmd0aD9wcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoInZpZXcgbXVzdCBoYXZlIG5vbi16ZXJvIGJ5dGVMZW5ndGgiKSk6ZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyUmVhZCh0LHIpe3ZhciBhPXQuX293bmVyUmVhZGFibGVTdHJlYW07YS5fZGlzdHVyYmVkPSEwO3JldHVybiJlcnJvcmVkIj09PWEuX3N0YXRlP3Byb21pc2VSZWplY3RlZFdpdGgoYS5fc3RvcmVkRXJyb3IpOmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byh0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0saT0xO3IuY29uc3RydWN0b3IhPT1EYXRhVmlldyYmKGk9ci5jb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVCk7dmFyIG89ci5jb25zdHJ1Y3RvcixjPXtidWZmZXI6ci5idWZmZXIsYnl0ZU9mZnNldDpyLmJ5dGVPZmZzZXQsYnl0ZUxlbmd0aDpyLmJ5dGVMZW5ndGgsYnl0ZXNGaWxsZWQ6MCxlbGVtZW50U2l6ZTppLGN0b3I6byxyZWFkZXJUeXBlOiJieW9iIn07aWYodC5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGg+MCl7dC5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKGMpO3JldHVybiBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChhKX1pZigiY2xvc2VkIj09PWEuX3N0YXRlKXJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKFJlYWRhYmxlU3RyZWFtQ3JlYXRlUmVhZFJlc3VsdChuZXcgbyhjLmJ1ZmZlcixjLmJ5dGVPZmZzZXQsMCksITAsYS5fcmVhZGVyLl9mb3JBdXRob3JDb2RlKSk7aWYodC5fcXVldWVUb3RhbFNpemU+MCl7aWYoITA9PT1SZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSh0LGMpKXt2YXIgbD1SZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihjKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbih0KTtyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQobCwhMSxhLl9yZWFkZXIuX2ZvckF1dGhvckNvZGUpKX1pZighMD09PXQuX2Nsb3NlUmVxdWVzdGVkKXt2YXIgdT1uZXcgVHlwZUVycm9yKCJJbnN1ZmZpY2llbnQgYnl0ZXMgdG8gZmlsbCBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gYnVmZmVyIik7UmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKHQsdSk7cmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgodSl9fXQuX3BlbmRpbmdQdWxsSW50b3MucHVzaChjKTt2YXIgaD1SZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChhKTtSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0KTtyZXR1cm4gaH0oYS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLHIpfSh0aGlzLHQpfTtSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLnJlbGVhc2VMb2NrPWZ1bmN0aW9uKCl7aWYoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKXRocm93IGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCJyZWxlYXNlTG9jayIpO2lmKHZvaWQgMCE9PXRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0pe2lmKHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoPjApdGhyb3cgbmV3IFR5cGVFcnJvcigiVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQiKTtSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpfX07cmV0dXJuIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcn0oKTtmdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0KXtyZXR1cm4hIXR5cGVJc09iamVjdCh0KSYmISFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiX3JlYWRJbnRvUmVxdWVzdHMiKX1mdW5jdGlvbiBieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbih0KXtyZXR1cm4gbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZS4iK3QrIiBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIil9dmFyIE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbSh0LHIpe3ZvaWQgMD09PXQmJih0PXt9KTt2b2lkIDA9PT1yJiYocj17fSk7SW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHRoaXMpO3ZhciBhPXIuc2l6ZSxpPXIuaGlnaFdhdGVyTWFyayxvPXQudHlwZTtpZigiYnl0ZXMiPT09U3RyaW5nKG8pKXtpZih2b2lkIDAhPT1hKXRocm93IG5ldyBSYW5nZUVycm9yKCJUaGUgc3RyYXRlZ3kgZm9yIGEgYnl0ZSBzdHJlYW0gY2Fubm90IGhhdmUgYSBzaXplIGZ1bmN0aW9uIik7dm9pZCAwPT09aSYmKGk9MCk7U2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRnJvbVVuZGVybHlpbmdTb3VyY2UodGhpcyx0LGk9VmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGkpKX1lbHNle2lmKHZvaWQgMCE9PW8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQiKTt2YXIgYz1NYWtlU2l6ZUFsZ29yaXRobUZyb21TaXplRnVuY3Rpb24oYSk7dm9pZCAwPT09aSYmKGk9MSk7IWZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHQscixhLGkpe3ZhciBvPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLGM9Q3JlYXRlQWxnb3JpdGhtRnJvbVVuZGVybHlpbmdNZXRob2QociwicHVsbCIsMCxbb10pLGw9Q3JlYXRlQWxnb3JpdGhtRnJvbVVuZGVybHlpbmdNZXRob2QociwiY2FuY2VsIiwxLFtdKTtTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodCxvLChmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpe3JldHVybiBJbnZva2VPck5vb3Aociwic3RhcnQiLFtvXSl9KSxjLGwsYSxpKX0odGhpcyx0LGk9VmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGkpLGMpfX1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCJsb2NrZWQiLHtnZXQ6ZnVuY3Rpb24oKXtpZighMT09PUlzUmVhZGFibGVTdHJlYW0odGhpcykpdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCJsb2NrZWQiKTtyZXR1cm4gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiExPT09SXNSZWFkYWJsZVN0cmVhbSh0aGlzKT9wcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgiY2FuY2VsIikpOiEwPT09SXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKT9wcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYW5jZWwgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHJlYWRlciIpKTpSZWFkYWJsZVN0cmVhbUNhbmNlbCh0aGlzLHQpfTtSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuZ2V0UmVhZGVyPWZ1bmN0aW9uKHQpe3ZhciByPSh2b2lkIDA9PT10P3t9OnQpLm1vZGU7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtKHRoaXMpKXRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgiZ2V0UmVhZGVyIik7aWYodm9pZCAwPT09cilyZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzLCEwKTtpZigiYnlvYiI9PT0ocj1TdHJpbmcocikpKXJldHVybiBmdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHQscil7dm9pZCAwPT09ciYmKHI9ITEpO3ZhciBhPW5ldyBQKHQpO2EuX2ZvckF1dGhvckNvZGU9cjtyZXR1cm4gYX0odGhpcywhMCk7dGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgbW9kZSBpcyBzcGVjaWZpZWQiKX07UmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUaHJvdWdoPWZ1bmN0aW9uKHQscil7dmFyIGE9dC53cml0YWJsZSxpPXQucmVhZGFibGUsbz12b2lkIDA9PT1yP3t9OnIsYz1vLnByZXZlbnRDbG9zZSxsPW8ucHJldmVudEFib3J0LHU9by5wcmV2ZW50Q2FuY2VsLGg9by5zaWduYWw7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtKHRoaXMpKXRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgicGlwZVRocm91Z2giKTtpZighMT09PUlzV3JpdGFibGVTdHJlYW0oYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigid3JpdGFibGUgYXJndW1lbnQgdG8gcGlwZVRocm91Z2ggbXVzdCBiZSBhIFdyaXRhYmxlU3RyZWFtIik7aWYoITE9PT1Jc1JlYWRhYmxlU3RyZWFtKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlYWRhYmxlIGFyZ3VtZW50IHRvIHBpcGVUaHJvdWdoIG11c3QgYmUgYSBSZWFkYWJsZVN0cmVhbSIpO2M9Qm9vbGVhbihjKTtsPUJvb2xlYW4obCk7dT1Cb29sZWFuKHUpO2lmKHZvaWQgMCE9PWgmJiFpc0Fib3J0U2lnbmFsKGgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVGhyb3VnaCdzIHNpZ25hbCBvcHRpb24gbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCIpO2lmKCEwPT09SXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0iKTtpZighMD09PUlzV3JpdGFibGVTdHJlYW1Mb2NrZWQoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUaHJvdWdoIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFdyaXRhYmxlU3RyZWFtIik7c2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShSZWFkYWJsZVN0cmVhbVBpcGVUbyh0aGlzLGEsYyxsLHUsaCkpO3JldHVybiBpfTtSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvPWZ1bmN0aW9uKHQscil7dmFyIGE9dm9pZCAwPT09cj97fTpyLGk9YS5wcmV2ZW50Q2xvc2Usbz1hLnByZXZlbnRBYm9ydCxjPWEucHJldmVudENhbmNlbCxsPWEuc2lnbmFsO2lmKCExPT09SXNSZWFkYWJsZVN0cmVhbSh0aGlzKSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoInBpcGVUbyIpKTtpZighMT09PUlzV3JpdGFibGVTdHJlYW0odCkpcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUbydzIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBXcml0YWJsZVN0cmVhbSIpKTtpPUJvb2xlYW4oaSk7bz1Cb29sZWFuKG8pO2M9Qm9vbGVhbihjKTtyZXR1cm4gdm9pZCAwPT09bHx8aXNBYm9ydFNpZ25hbChsKT8hMD09PUlzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcyk/cHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFJlYWRhYmxlU3RyZWFtIikpOiEwPT09SXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0KT9wcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0iKSk6UmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcyx0LGksbyxjLGwpOnByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigiUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUbydzIHNpZ25hbCBvcHRpb24gbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCIpKX07UmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnRlZT1mdW5jdGlvbigpe2lmKCExPT09SXNSZWFkYWJsZVN0cmVhbSh0aGlzKSl0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoInRlZSIpO3ZhciB0PWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtVGVlKHQscil7dmFyIGEsaSxvLGMsbCx1PUFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodCksaD0hMSxkPSExLHA9ITEsbT1uZXdQcm9taXNlKChmdW5jdGlvbih0KXtsPXR9KSk7ZnVuY3Rpb24gcHVsbEFsZ29yaXRobSgpe2lmKCEwPT09aClyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApO2g9ITA7c2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh0cmFuc2Zvcm1Qcm9taXNlV2l0aChSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHUpLChmdW5jdGlvbih0KXtoPSExO2lmKCEwIT09dC5kb25lKXt2YXIgcj10LnZhbHVlLGE9cixpPXI7ITE9PT1kJiZSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShvLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsYSk7ITE9PT1wJiZSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsaSl9ZWxzZXshMT09PWQmJlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShvLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpOyExPT09cCYmUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGMuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcil9fSkpKTtyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApfWZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCl7fW89Q3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0scHVsbEFsZ29yaXRobSwoZnVuY3Rpb24gY2FuY2VsMUFsZ29yaXRobShyKXtkPSEwO2E9cjtpZighMD09PXApe3ZhciBvPWNyZWF0ZUFycmF5RnJvbUxpc3QoW2EsaV0pLGM9UmVhZGFibGVTdHJlYW1DYW5jZWwodCxvKTtsKGMpfXJldHVybiBtfSkpO2M9Q3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0scHVsbEFsZ29yaXRobSwoZnVuY3Rpb24gY2FuY2VsMkFsZ29yaXRobShyKXtwPSEwO2k9cjtpZighMD09PWQpe3ZhciBvPWNyZWF0ZUFycmF5RnJvbUxpc3QoW2EsaV0pLGM9UmVhZGFibGVTdHJlYW1DYW5jZWwodCxvKTtsKGMpfXJldHVybiBtfSkpO3Vwb25SZWplY3Rpb24odS5fY2xvc2VkUHJvbWlzZSwoZnVuY3Rpb24odCl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKG8uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcix0KTtSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYy5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLHQpfSkpO3JldHVybltvLGNdfSh0aGlzKTtyZXR1cm4gY3JlYXRlQXJyYXlGcm9tTGlzdCh0KX07UmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLmdldEl0ZXJhdG9yPWZ1bmN0aW9uKHQpe3ZhciByPSh2b2lkIDA9PT10P3t9OnQpLnByZXZlbnRDYW5jZWwsYT12b2lkIDAhPT1yJiZyO2lmKCExPT09SXNSZWFkYWJsZVN0cmVhbSh0aGlzKSl0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoImdldEl0ZXJhdG9yIik7cmV0dXJuIGZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodCxyKXt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGE9QWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0KSxpPU9iamVjdC5jcmVhdGUoYik7aS5fYXN5bmNJdGVyYXRvclJlYWRlcj1hO2kuX3ByZXZlbnRDYW5jZWw9Qm9vbGVhbihyKTtyZXR1cm4gaX0odGhpcyxhKX07cmV0dXJuIFJlYWRhYmxlU3RyZWFtfSgpOyJzeW1ib2wiPT10eXBlb2Ygci5hc3luY0l0ZXJhdG9yJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoTy5wcm90b3R5cGUsci5hc3luY0l0ZXJhdG9yLHt2YWx1ZTpPLnByb3RvdHlwZS5nZXRJdGVyYXRvcixlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO2Z1bmN0aW9uIENyZWF0ZVJlYWRhYmxlU3RyZWFtKHQscixhLGksbyl7dm9pZCAwPT09aSYmKGk9MSk7dm9pZCAwPT09byYmKG89ZnVuY3Rpb24oKXtyZXR1cm4gMX0pO3ZhciBjPU9iamVjdC5jcmVhdGUoTy5wcm90b3R5cGUpO0luaXRpYWxpemVSZWFkYWJsZVN0cmVhbShjKTtTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoYyxPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx0LHIsYSxpLG8pO3JldHVybiBjfWZ1bmN0aW9uIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbSh0KXt0Ll9zdGF0ZT0icmVhZGFibGUiO3QuX3JlYWRlcj12b2lkIDA7dC5fc3RvcmVkRXJyb3I9dm9pZCAwO3QuX2Rpc3R1cmJlZD0hMX1mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyIil9ZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0KXtyZXR1cm4gdm9pZCAwIT09dC5fcmVhZGVyfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHQscil7dC5fZGlzdHVyYmVkPSEwO2lmKCJjbG9zZWQiPT09dC5fc3RhdGUpcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodm9pZCAwKTtpZigiZXJyb3JlZCI9PT10Ll9zdGF0ZSlyZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh0Ll9zdG9yZWRFcnJvcik7UmVhZGFibGVTdHJlYW1DbG9zZSh0KTtyZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgodC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyW2RdKHIpLG5vb3ApfWZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2xvc2UodCl7dC5fc3RhdGU9ImNsb3NlZCI7dmFyIHI9dC5fcmVhZGVyO2lmKHZvaWQgMCE9PXIpe2lmKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHIpKXtyLl9yZWFkUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5fcmVzb2x2ZShSZWFkYWJsZVN0cmVhbUNyZWF0ZVJlYWRSZXN1bHQodm9pZCAwLCEwLHIuX2ZvckF1dGhvckNvZGUpKX0pKTtyLl9yZWFkUmVxdWVzdHM9bmV3IGh9ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHIpfX1mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUVycm9yKHQscil7dC5fc3RhdGU9ImVycm9yZWQiO3QuX3N0b3JlZEVycm9yPXI7dmFyIGE9dC5fcmVhZGVyO2lmKHZvaWQgMCE9PWEpe2lmKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKGEpKXthLl9yZWFkUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5fcmVqZWN0KHIpfSkpO2EuX3JlYWRSZXF1ZXN0cz1uZXcgaH1lbHNle2EuX3JlYWRJbnRvUmVxdWVzdHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5fcmVqZWN0KHIpfSkpO2EuX3JlYWRJbnRvUmVxdWVzdHM9bmV3IGh9ZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QoYSxyKX19ZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtIil9dmFyIEU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5KHQpe3ZhciByPXQuaGlnaFdhdGVyTWFyazt0aGlzLmhpZ2hXYXRlck1hcms9cn1CeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiB0LmJ5dGVMZW5ndGh9O3JldHVybiBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5fSgpLEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBDb3VudFF1ZXVpbmdTdHJhdGVneSh0KXt2YXIgcj10LmhpZ2hXYXRlck1hcms7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ9Q291bnRRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gMX07cmV0dXJuIENvdW50UXVldWluZ1N0cmF0ZWd5fSgpLEQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0odCxyLGEpe3ZvaWQgMD09PXQmJih0PXt9KTt2b2lkIDA9PT1yJiYocj17fSk7dm9pZCAwPT09YSYmKGE9e30pO3ZhciBpPXIuc2l6ZSxvPXIuaGlnaFdhdGVyTWFyayxjPWEuc2l6ZSxsPWEuaGlnaFdhdGVyTWFyaztpZih2b2lkIDAhPT10LndyaXRhYmxlVHlwZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB3cml0YWJsZSB0eXBlIHNwZWNpZmllZCIpO3ZhciB1PU1ha2VTaXplQWxnb3JpdGhtRnJvbVNpemVGdW5jdGlvbihpKTt2b2lkIDA9PT1vJiYobz0xKTtvPVZhbGlkYXRlQW5kTm9ybWFsaXplSGlnaFdhdGVyTWFyayhvKTtpZih2b2lkIDAhPT10LnJlYWRhYmxlVHlwZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCByZWFkYWJsZSB0eXBlIHNwZWNpZmllZCIpO3ZhciBoLGQ9TWFrZVNpemVBbGdvcml0aG1Gcm9tU2l6ZUZ1bmN0aW9uKGMpO3ZvaWQgMD09PWwmJihsPTApO2w9VmFsaWRhdGVBbmROb3JtYWxpemVIaWdoV2F0ZXJNYXJrKGwpOyFmdW5jdGlvbiBJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtKHQscixhLGksbyxjKXtmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpe3JldHVybiByfXQuX3dyaXRhYmxlPWZ1bmN0aW9uIENyZWF0ZVdyaXRhYmxlU3RyZWFtKHQscixhLGksbyxjKXt2b2lkIDA9PT1vJiYobz0xKTt2b2lkIDA9PT1jJiYoYz1mdW5jdGlvbigpe3JldHVybiAxfSk7dmFyIGw9T2JqZWN0LmNyZWF0ZShrLnByb3RvdHlwZSk7SW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKGwpO1NldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihsLE9iamVjdC5jcmVhdGUoQy5wcm90b3R5cGUpLHQscixhLGksbyxjKTtyZXR1cm4gbH0oc3RhcnRBbGdvcml0aG0sKGZ1bmN0aW9uIHdyaXRlQWxnb3JpdGhtKHIpe3JldHVybiBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua1dyaXRlQWxnb3JpdGhtKHQscil7dmFyIGE9dC5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcjtyZXR1cm4hMD09PXQuX2JhY2twcmVzc3VyZT90cmFuc2Zvcm1Qcm9taXNlV2l0aCh0Ll9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlLChmdW5jdGlvbigpe3ZhciBpPXQuX3dyaXRhYmxlO2lmKCJlcnJvcmluZyI9PT1pLl9zdGF0ZSl0aHJvdyBpLl9zdG9yZWRFcnJvcjtyZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGEscil9KSk6VHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGEscil9KHQscil9KSwoZnVuY3Rpb24gY2xvc2VBbGdvcml0aG0oKXtyZXR1cm4gZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobSh0KXt2YXIgcj10Ll9yZWFkYWJsZSxhPXQuX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIsaT1hLl9mbHVzaEFsZ29yaXRobSgpO1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGEpO3JldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChpLChmdW5jdGlvbigpe2lmKCJlcnJvcmVkIj09PXIuX3N0YXRlKXRocm93IHIuX3N0b3JlZEVycm9yO3ZhciB0PXIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjshMD09PVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZSh0KSYmUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHQpfSksKGZ1bmN0aW9uKGEpe1RyYW5zZm9ybVN0cmVhbUVycm9yKHQsYSk7dGhyb3cgci5fc3RvcmVkRXJyb3J9KSl9KHQpfSksKGZ1bmN0aW9uIGFib3J0QWxnb3JpdGhtKHIpe3JldHVybiBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Fib3J0QWxnb3JpdGhtKHQscil7VHJhbnNmb3JtU3RyZWFtRXJyb3IodCxyKTtyZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh2b2lkIDApfSh0LHIpfSksYSxpKTt0Ll9yZWFkYWJsZT1DcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwoZnVuY3Rpb24gcHVsbEFsZ29yaXRobSgpe3JldHVybiBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobSh0KXtUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUodCwhMSk7cmV0dXJuIHQuX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2V9KHQpfSksKGZ1bmN0aW9uIGNhbmNlbEFsZ29yaXRobShyKXtUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHQscik7cmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodm9pZCAwKX0pLG8sYyk7dC5fYmFja3ByZXNzdXJlPXZvaWQgMDt0Ll9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlPXZvaWQgMDt0Ll9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmU9dm9pZCAwO1RyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSh0LCEwKTt0Ll90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyPXZvaWQgMH0odGhpcyxuZXdQcm9taXNlKChmdW5jdGlvbih0KXtoPXR9KSksbyx1LGwsZCk7IWZ1bmN0aW9uIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIodCxyKXt2YXIgYT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKSx0cmFuc2Zvcm1BbGdvcml0aG09ZnVuY3Rpb24odCl7dHJ5e1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShhLHQpO3JldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHZvaWQgMCl9Y2F0Y2godCl7cmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgodCl9fSxpPXIudHJhbnNmb3JtO2lmKHZvaWQgMCE9PWkpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBpKXRocm93IG5ldyBUeXBlRXJyb3IoInRyYW5zZm9ybSBpcyBub3QgYSBtZXRob2QiKTt0cmFuc2Zvcm1BbGdvcml0aG09ZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2VDYWxsKGkscixbdCxhXSl9fXZhciBvPUNyZWF0ZUFsZ29yaXRobUZyb21VbmRlcmx5aW5nTWV0aG9kKHIsImZsdXNoIiwwLFthXSk7IWZ1bmN0aW9uIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodCxyLGEsaSl7ci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbT10O3QuX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXI9cjtyLl90cmFuc2Zvcm1BbGdvcml0aG09YTtyLl9mbHVzaEFsZ29yaXRobT1pfSh0LGEsdHJhbnNmb3JtQWxnb3JpdGhtLG8pfSh0aGlzLHQpO3ZhciBwPUludm9rZU9yTm9vcCh0LCJzdGFydCIsW3RoaXMuX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXJdKTtoKHApfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLCJyZWFkYWJsZSIse2dldDpmdW5jdGlvbigpe2lmKCExPT09SXNUcmFuc2Zvcm1TdHJlYW0odGhpcykpdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCJyZWFkYWJsZSIpO3JldHVybiB0aGlzLl9yZWFkYWJsZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZSwid3JpdGFibGUiLHtnZXQ6ZnVuY3Rpb24oKXtpZighMT09PUlzVHJhbnNmb3JtU3RyZWFtKHRoaXMpKXRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMigid3JpdGFibGUiKTtyZXR1cm4gdGhpcy5fd3JpdGFibGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk7cmV0dXJuIFRyYW5zZm9ybVN0cmVhbX0oKTtmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbSh0KXtyZXR1cm4hIXR5cGVJc09iamVjdCh0KSYmISFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIiKX1mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcih0LHIpe1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0Ll9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLHIpO1RyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUodCxyKX1mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHQscil7VHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModC5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcik7V3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQodC5fd3JpdGFibGUuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcixyKTshMD09PXQuX2JhY2twcmVzc3VyZSYmVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHQsITEpfWZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSh0LHIpe3ZvaWQgMCE9PXQuX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UmJnQuX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSgpO3QuX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2U9bmV3UHJvbWlzZSgoZnVuY3Rpb24ocil7dC5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlPXJ9KSk7dC5fYmFja3ByZXNzdXJlPXJ9dmFyIE09ZnVuY3Rpb24oKXtmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIGluc3RhbmNlcyBjYW5ub3QgYmUgY3JlYXRlZCBkaXJlY3RseSIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsImRlc2lyZWRTaXplIix7Z2V0OmZ1bmN0aW9uKCl7aWYoITE9PT1Jc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKXRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCJkZXNpcmVkU2l6ZSIpO3JldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcy5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcil9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk7VHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24odCl7aWYoITE9PT1Jc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKXRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCJlbnF1ZXVlIik7VHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsdCl9O1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXtpZighMT09PUlzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoImVycm9yIik7IWZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodCxyKXtUcmFuc2Zvcm1TdHJlYW1FcnJvcih0Ll9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLHIpfSh0aGlzLHQpfTtUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUudGVybWluYXRlPWZ1bmN0aW9uKCl7aWYoITE9PT1Jc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKXRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCJ0ZXJtaW5hdGUiKTshZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUodCl7dmFyIHI9dC5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSxhPXIuX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7ITA9PT1SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoYSkmJlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShhKTt2YXIgaT1uZXcgVHlwZUVycm9yKCJUcmFuc2Zvcm1TdHJlYW0gdGVybWluYXRlZCIpO1RyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUocixpKX0odGhpcyl9O3JldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcn0oKTtmdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHQpe3JldHVybiEhdHlwZUlzT2JqZWN0KHQpJiYhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJfY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSIpfWZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHQpe3QuX3RyYW5zZm9ybUFsZ29yaXRobT12b2lkIDA7dC5fZmx1c2hBbGdvcml0aG09dm9pZCAwfWZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0LHIpe3ZhciBhPXQuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0saT1hLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyO2lmKCExPT09UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoIlJlYWRhYmxlIHNpZGUgaXMgbm90IGluIGEgc3RhdGUgdGhhdCBwZXJtaXRzIGVucXVldWUiKTt0cnl7UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoaSxyKX1jYXRjaCh0KXtUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKGEsdCk7dGhyb3cgYS5fcmVhZGFibGUuX3N0b3JlZEVycm9yfShmdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVySGFzQmFja3ByZXNzdXJlKHQpe3JldHVybiEwIT09UmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKHQpfSkoaSkhPT1hLl9iYWNrcHJlc3N1cmUmJlRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShhLCEwKX1mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0odCxyKXtyZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgodC5fdHJhbnNmb3JtQWxnb3JpdGhtKHIpLHZvaWQgMCwoZnVuY3Rpb24ocil7VHJhbnNmb3JtU3RyZWFtRXJyb3IodC5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSxyKTt0aHJvdyByfSkpfWZ1bmN0aW9uIGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuIit0KyIgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIil9ZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLiIrdCsiIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW0iKX10LkJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3k9RTt0LkNvdW50UXVldWluZ1N0cmF0ZWd5PUI7dC5SZWFkYWJsZVN0cmVhbT1PO3QuVHJhbnNmb3JtU3RyZWFtPUQ7dC5Xcml0YWJsZVN0cmVhbT1rO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0ocil9LGZ1bmN0aW9uKHQscixhKXthKDE0Nyk7YSgxMTgpO2EoNzcpO2EoMTIwKTt2YXIgaT1hKDQzKTt0LmV4cG9ydHM9aS5NYXB9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGk9YSgxNDgpLG89YSgxNTIpO3QuZXhwb3J0cz1pKCJNYXAiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gTWFwKCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTp2b2lkIDApfX0pLG8pfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTApLG89YSgxMSksYz1hKDUyKSxsPWEoMjkpLHU9YSgxNDkpLGg9YSgxMDQpLGQ9YSgxMjYpLHA9YSgyMiksbT1hKDE0KSxnPWEoOTcpLHk9YSg4NSksYj1hKDE1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixhKXt2YXIgdj0tMSE9PXQuaW5kZXhPZigiTWFwIiksUz0tMSE9PXQuaW5kZXhPZigiV2VhayIpLGs9dj8ic2V0IjoiYWRkIix3PW9bdF0sQz13JiZ3LnByb3RvdHlwZSxfPXcseD17fSxmaXhNZXRob2Q9ZnVuY3Rpb24odCl7dmFyIHI9Q1t0XTtsKEMsdCwiYWRkIj09dD9mdW5jdGlvbiBhZGQodCl7ci5jYWxsKHRoaXMsMD09PXQ/MDp0KTtyZXR1cm4gdGhpc306ImRlbGV0ZSI9PXQ/ZnVuY3Rpb24odCl7cmV0dXJuIShTJiYhcCh0KSkmJnIuY2FsbCh0aGlzLDA9PT10PzA6dCl9OiJnZXQiPT10P2Z1bmN0aW9uIGdldCh0KXtyZXR1cm4gUyYmIXAodCk/dm9pZCAwOnIuY2FsbCh0aGlzLDA9PT10PzA6dCl9OiJoYXMiPT10P2Z1bmN0aW9uIGhhcyh0KXtyZXR1cm4hKFMmJiFwKHQpKSYmci5jYWxsKHRoaXMsMD09PXQ/MDp0KX06ZnVuY3Rpb24gc2V0KHQsYSl7ci5jYWxsKHRoaXMsMD09PXQ/MDp0LGEpO3JldHVybiB0aGlzfSl9O2lmKGModCwiZnVuY3Rpb24iIT10eXBlb2Ygd3x8IShTfHxDLmZvckVhY2gmJiFtKChmdW5jdGlvbigpeyhuZXcgdykuZW50cmllcygpLm5leHQoKX0pKSkpKXtfPWEuZ2V0Q29uc3RydWN0b3Iocix0LHYsayk7dS5SRVFVSVJFRD0hMH1lbHNlIGlmKGModCwhMCkpe3ZhciBBPW5ldyBfLFQ9QVtrXShTP3t9Oi0wLDEpIT1BLFI9bSgoZnVuY3Rpb24oKXtBLmhhcygxKX0pKSxJPWcoKGZ1bmN0aW9uKHQpe25ldyB3KHQpfSkpLFA9IVMmJm0oKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyB3LHI9NTtyLS07KXRba10ocixyKTtyZXR1cm4hdC5oYXMoLTApfSkpO2lmKCFJKXsoXz1yKChmdW5jdGlvbihyLGEpe2QocixfLHQpO3ZhciBpPWIobmV3IHcscixfKTtudWxsIT1hJiZoKGEsaVtrXSxpLHYpO3JldHVybiBpfSkpKS5wcm90b3R5cGU9QztDLmNvbnN0cnVjdG9yPV99aWYoUnx8UCl7Zml4TWV0aG9kKCJkZWxldGUiKTtmaXhNZXRob2QoImhhcyIpO3YmJmZpeE1ldGhvZCgiZ2V0Iil9KFB8fFQpJiZmaXhNZXRob2Qoayk7UyYmQy5jbGVhciYmZGVsZXRlIEMuY2xlYXJ9eFt0XT1fO2koe2dsb2JhbDohMCxmb3JjZWQ6XyE9d30seCk7eShfLHQpO1N8fGEuc2V0U3Ryb25nKF8sdCx2KTtyZXR1cm4gX319LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDM5KSxvPWEoMjIpLGM9YSgyMyksbD1hKDI3KS5mLHU9YSgzOCksaD1hKDE1MCksZD11KCJtZXRhIikscD0wLG09T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2V0TWV0YWRhdGE9ZnVuY3Rpb24odCl7bCh0LGQse3ZhbHVlOntvYmplY3RJRDoiTyIrICsrcCx3ZWFrRGF0YTp7fX19KX0sZz10LmV4cG9ydHM9e1JFUVVJUkVEOiExLGZhc3RLZXk6ZnVuY3Rpb24odCxyKXtpZighbyh0KSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHQ/dDooInN0cmluZyI9PXR5cGVvZiB0PyJTIjoiUCIpK3Q7aWYoIWModCxkKSl7aWYoIW0odCkpcmV0dXJuIkYiO2lmKCFyKXJldHVybiJFIjtzZXRNZXRhZGF0YSh0KX1yZXR1cm4gdFtkXS5vYmplY3RJRH0sZ2V0V2Vha0RhdGE6ZnVuY3Rpb24odCxyKXtpZighYyh0LGQpKXtpZighbSh0KSlyZXR1cm4hMDtpZighcilyZXR1cm4hMTtzZXRNZXRhZGF0YSh0KX1yZXR1cm4gdFtkXS53ZWFrRGF0YX0sb25GcmVlemU6ZnVuY3Rpb24odCl7aCYmZy5SRVFVSVJFRCYmbSh0KSYmIWModCxkKSYmc2V0TWV0YWRhdGEodCk7cmV0dXJuIHR9fTtpW2RdPSEwfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxNCk7dC5leHBvcnRzPSFpKChmdW5jdGlvbigpe3JldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpfSkpfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgyMiksbz1hKDg3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyLGEpe3ZhciBjLGw7byYmImZ1bmN0aW9uIj09dHlwZW9mKGM9ci5jb25zdHJ1Y3RvcikmJmMhPT1hJiZpKGw9Yy5wcm90b3R5cGUpJiZsIT09YS5wcm90b3R5cGUmJm8odCxsKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGk9YSgyNykuZixvPWEoNzEpLGM9YSgxMjQpLGw9YSg2MiksdT1hKDEyNiksaD1hKDEwNCksZD1hKDc5KSxwPWEoMTI1KSxtPWEoMTMpLGc9YSgxNDkpLmZhc3RLZXkseT1hKDMzKSxiPXkuc2V0LHY9eS5nZXR0ZXJGb3I7dC5leHBvcnRzPXtnZXRDb25zdHJ1Y3RvcjpmdW5jdGlvbih0LHIsYSxkKXt2YXIgcD10KChmdW5jdGlvbih0LGkpe3UodCxwLHIpO2IodCx7dHlwZTpyLGluZGV4Om8obnVsbCksZmlyc3Q6dm9pZCAwLGxhc3Q6dm9pZCAwLHNpemU6MH0pO218fCh0LnNpemU9MCk7bnVsbCE9aSYmaChpLHRbZF0sdCxhKX0pKSx5PXYociksZGVmaW5lPWZ1bmN0aW9uKHQscixhKXt2YXIgaSxvLGM9eSh0KSxsPWdldEVudHJ5KHQscik7aWYobClsLnZhbHVlPWE7ZWxzZXtjLmxhc3Q9bD17aW5kZXg6bz1nKHIsITApLGtleTpyLHZhbHVlOmEscHJldmlvdXM6aT1jLmxhc3QsbmV4dDp2b2lkIDAscmVtb3ZlZDohMX07Yy5maXJzdHx8KGMuZmlyc3Q9bCk7aSYmKGkubmV4dD1sKTttP2Muc2l6ZSsrOnQuc2l6ZSsrOyJGIiE9PW8mJihjLmluZGV4W29dPWwpfXJldHVybiB0fSxnZXRFbnRyeT1mdW5jdGlvbih0LHIpe3ZhciBhLGk9eSh0KSxvPWcocik7aWYoIkYiIT09bylyZXR1cm4gaS5pbmRleFtvXTtmb3IoYT1pLmZpcnN0O2E7YT1hLm5leHQpaWYoYS5rZXk9PXIpcmV0dXJuIGF9O2MocC5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uIGNsZWFyKCl7Zm9yKHZhciB0PXkodGhpcykscj10LmluZGV4LGE9dC5maXJzdDthOyl7YS5yZW1vdmVkPSEwO2EucHJldmlvdXMmJihhLnByZXZpb3VzPWEucHJldmlvdXMubmV4dD12b2lkIDApO2RlbGV0ZSByW2EuaW5kZXhdO2E9YS5uZXh0fXQuZmlyc3Q9dC5sYXN0PXZvaWQgMDttP3Quc2l6ZT0wOnRoaXMuc2l6ZT0wfSxkZWxldGU6ZnVuY3Rpb24odCl7dmFyIHI9eSh0aGlzKSxhPWdldEVudHJ5KHRoaXMsdCk7aWYoYSl7dmFyIGk9YS5uZXh0LG89YS5wcmV2aW91cztkZWxldGUgci5pbmRleFthLmluZGV4XTthLnJlbW92ZWQ9ITA7byYmKG8ubmV4dD1pKTtpJiYoaS5wcmV2aW91cz1vKTtyLmZpcnN0PT1hJiYoci5maXJzdD1pKTtyLmxhc3Q9PWEmJihyLmxhc3Q9byk7bT9yLnNpemUtLTp0aGlzLnNpemUtLX1yZXR1cm4hIWF9LGZvckVhY2g6ZnVuY3Rpb24gZm9yRWFjaCh0KXtmb3IodmFyIHIsYT15KHRoaXMpLGk9bCh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3I9cj9yLm5leHQ6YS5maXJzdDspe2koci52YWx1ZSxyLmtleSx0aGlzKTtmb3IoO3ImJnIucmVtb3ZlZDspcj1yLnByZXZpb3VzfX0saGFzOmZ1bmN0aW9uIGhhcyh0KXtyZXR1cm4hIWdldEVudHJ5KHRoaXMsdCl9fSk7YyhwLnByb3RvdHlwZSxhP3tnZXQ6ZnVuY3Rpb24gZ2V0KHQpe3ZhciByPWdldEVudHJ5KHRoaXMsdCk7cmV0dXJuIHImJnIudmFsdWV9LHNldDpmdW5jdGlvbiBzZXQodCxyKXtyZXR1cm4gZGVmaW5lKHRoaXMsMD09PXQ/MDp0LHIpfX06e2FkZDpmdW5jdGlvbiBhZGQodCl7cmV0dXJuIGRlZmluZSh0aGlzLHQ9MD09PXQ/MDp0LHQpfX0pO20mJmkocC5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geSh0aGlzKS5zaXplfX0pO3JldHVybiBwfSxzZXRTdHJvbmc6ZnVuY3Rpb24odCxyLGEpe3ZhciBpPXIrIiBJdGVyYXRvciIsbz12KHIpLGM9dihpKTtkKHQsciwoZnVuY3Rpb24odCxyKXtiKHRoaXMse3R5cGU6aSx0YXJnZXQ6dCxzdGF0ZTpvKHQpLGtpbmQ6cixsYXN0OnZvaWQgMH0pfSksKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWModGhpcykscj10LmtpbmQsYT10Lmxhc3Q7YSYmYS5yZW1vdmVkOylhPWEucHJldmlvdXM7aWYoIXQudGFyZ2V0fHwhKHQubGFzdD1hPWE/YS5uZXh0OnQuc3RhdGUuZmlyc3QpKXt0LnRhcmdldD12b2lkIDA7cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX1yZXR1cm4ia2V5cyI9PXI/e3ZhbHVlOmEua2V5LGRvbmU6ITF9OiJ2YWx1ZXMiPT1yP3t2YWx1ZTphLnZhbHVlLGRvbmU6ITF9Ont2YWx1ZTpbYS5rZXksYS52YWx1ZV0sZG9uZTohMX19KSxhPyJlbnRyaWVzIjoidmFsdWVzIiwhYSwhMCk7cChyKX19fSxmdW5jdGlvbih0LHIsYSl7YSgxNTQpO2EoMTE4KTthKDc3KTthKDEyMCk7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuU2V0fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTQ4KSxvPWEoMTUyKTt0LmV4cG9ydHM9aSgiU2V0IiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFNldCgpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19KSxvKX0sZnVuY3Rpb24odCxyLGEpe2EoMTE4KTthKDE1Nik7YSgxMjApO3ZhciBpPWEoNDMpO3QuZXhwb3J0cz1pLldlYWtNYXB9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGksbz1hKDExKSxjPWEoMTI0KSxsPWEoMTQ5KSx1PWEoMTQ4KSxoPWEoMTU3KSxkPWEoMjIpLHA9YSgzMykuZW5mb3JjZSxtPWEoMzQpLGc9IW8uQWN0aXZlWE9iamVjdCYmIkFjdGl2ZVhPYmplY3QiaW4gbyx5PU9iamVjdC5pc0V4dGVuc2libGUsd3JhcHBlcj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19LGI9dC5leHBvcnRzPXUoIldlYWtNYXAiLHdyYXBwZXIsaCk7aWYobSYmZyl7aT1oLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIldlYWtNYXAiLCEwKTtsLlJFUVVJUkVEPSEwO3ZhciB2PWIucHJvdG90eXBlLFM9di5kZWxldGUsaz12Lmhhcyx3PXYuZ2V0LEM9di5zZXQ7Yyh2LHtkZWxldGU6ZnVuY3Rpb24odCl7aWYoZCh0KSYmIXkodCkpe3ZhciByPXAodGhpcyk7ci5mcm96ZW58fChyLmZyb3plbj1uZXcgaSk7cmV0dXJuIFMuY2FsbCh0aGlzLHQpfHxyLmZyb3plbi5kZWxldGUodCl9cmV0dXJuIFMuY2FsbCh0aGlzLHQpfSxoYXM6ZnVuY3Rpb24gaGFzKHQpe2lmKGQodCkmJiF5KHQpKXt2YXIgcj1wKHRoaXMpO3IuZnJvemVufHwoci5mcm96ZW49bmV3IGkpO3JldHVybiBrLmNhbGwodGhpcyx0KXx8ci5mcm96ZW4uaGFzKHQpfXJldHVybiBrLmNhbGwodGhpcyx0KX0sZ2V0OmZ1bmN0aW9uIGdldCh0KXtpZihkKHQpJiYheSh0KSl7dmFyIHI9cCh0aGlzKTtyLmZyb3plbnx8KHIuZnJvemVuPW5ldyBpKTtyZXR1cm4gay5jYWxsKHRoaXMsdCk/dy5jYWxsKHRoaXMsdCk6ci5mcm96ZW4uZ2V0KHQpfXJldHVybiB3LmNhbGwodGhpcyx0KX0sc2V0OmZ1bmN0aW9uIHNldCh0LHIpe2lmKGQodCkmJiF5KHQpKXt2YXIgYT1wKHRoaXMpO2EuZnJvemVufHwoYS5mcm96ZW49bmV3IGkpO2suY2FsbCh0aGlzLHQpP0MuY2FsbCh0aGlzLHQscik6YS5mcm96ZW4uc2V0KHQscil9ZWxzZSBDLmNhbGwodGhpcyx0LHIpO3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDEyNCksbz1hKDE0OSkuZ2V0V2Vha0RhdGEsYz1hKDI4KSxsPWEoMjIpLHU9YSgxMjYpLGg9YSgxMDQpLGQ9YSgxNTgpLHA9YSgyMyksbT1hKDMzKSxnPW0uc2V0LHk9bS5nZXR0ZXJGb3IsYj1kLmZpbmQsdj1kLmZpbmRJbmRleCxTPTAsdW5jYXVnaHRGcm96ZW5TdG9yZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5mcm96ZW58fCh0LmZyb3plbj1uZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSl9LFVuY2F1Z2h0RnJvemVuU3RvcmU9ZnVuY3Rpb24oKXt0aGlzLmVudHJpZXM9W119LGZpbmRVbmNhdWdodEZyb3plbj1mdW5jdGlvbih0LHIpe3JldHVybiBiKHQuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT1yfSkpfTtVbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKHQpe3ZhciByPWZpbmRVbmNhdWdodEZyb3plbih0aGlzLHQpO2lmKHIpcmV0dXJuIHJbMV19LGhhczpmdW5jdGlvbih0KXtyZXR1cm4hIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLHQpfSxzZXQ6ZnVuY3Rpb24odCxyKXt2YXIgYT1maW5kVW5jYXVnaHRGcm96ZW4odGhpcyx0KTthP2FbMV09cjp0aGlzLmVudHJpZXMucHVzaChbdCxyXSl9LGRlbGV0ZTpmdW5jdGlvbih0KXt2YXIgcj12KHRoaXMuZW50cmllcywoZnVuY3Rpb24ocil7cmV0dXJuIHJbMF09PT10fSkpO35yJiZ0aGlzLmVudHJpZXMuc3BsaWNlKHIsMSk7cmV0dXJuISF+cn19O3QuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24odCxyLGEsZCl7dmFyIG09dCgoZnVuY3Rpb24odCxpKXt1KHQsbSxyKTtnKHQse3R5cGU6cixpZDpTKyssZnJvemVuOnZvaWQgMH0pO251bGwhPWkmJmgoaSx0W2RdLHQsYSl9KSksYj15KHIpLGRlZmluZT1mdW5jdGlvbih0LHIsYSl7dmFyIGk9Yih0KSxsPW8oYyhyKSwhMCk7ITA9PT1sP3VuY2F1Z2h0RnJvemVuU3RvcmUoaSkuc2V0KHIsYSk6bFtpLmlkXT1hO3JldHVybiB0fTtpKG0ucHJvdG90eXBlLHtkZWxldGU6ZnVuY3Rpb24odCl7dmFyIHI9Yih0aGlzKTtpZighbCh0KSlyZXR1cm4hMTt2YXIgYT1vKHQpO3JldHVybiEwPT09YT91bmNhdWdodEZyb3plblN0b3JlKHIpLmRlbGV0ZSh0KTphJiZwKGEsci5pZCkmJmRlbGV0ZSBhW3IuaWRdfSxoYXM6ZnVuY3Rpb24gaGFzKHQpe3ZhciByPWIodGhpcyk7aWYoIWwodCkpcmV0dXJuITE7dmFyIGE9byh0KTtyZXR1cm4hMD09PWE/dW5jYXVnaHRGcm96ZW5TdG9yZShyKS5oYXModCk6YSYmcChhLHIuaWQpfX0pO2kobS5wcm90b3R5cGUsYT97Z2V0OmZ1bmN0aW9uIGdldCh0KXt2YXIgcj1iKHRoaXMpO2lmKGwodCkpe3ZhciBhPW8odCk7cmV0dXJuITA9PT1hP3VuY2F1Z2h0RnJvemVuU3RvcmUocikuZ2V0KHQpOmE/YVtyLmlkXTp2b2lkIDB9fSxzZXQ6ZnVuY3Rpb24gc2V0KHQscil7cmV0dXJuIGRlZmluZSh0aGlzLHQscil9fTp7YWRkOmZ1bmN0aW9uIGFkZCh0KXtyZXR1cm4gZGVmaW5lKHRoaXMsdCwhMCl9fSk7cmV0dXJuIG19fX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoNjIpLG89YSgxOCksYz1hKDgzKSxsPWEoNDcpLHU9YSgxNTkpLGg9W10ucHVzaCxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24odCl7dmFyIHI9MT09dCxhPTI9PXQsZD0zPT10LHA9ND09dCxtPTY9PXQsZz01PT10fHxtO3JldHVybiBmdW5jdGlvbih5LGIsdixTKXtmb3IodmFyIGssdyxDPWMoeSksXz1vKEMpLHg9aShiLHYsMyksQT1sKF8ubGVuZ3RoKSxUPTAsUj1TfHx1LEk9cj9SKHksQSk6YT9SKHksMCk6dm9pZCAwO0E+VDtUKyspaWYoZ3x8VCBpbiBfKXt3PXgoaz1fW1RdLFQsQyk7aWYodClpZihyKUlbVF09dztlbHNlIGlmKHcpc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIGs7Y2FzZSA2OnJldHVybiBUO2Nhc2UgMjpoLmNhbGwoSSxrKX1lbHNlIGlmKHApcmV0dXJuITF9cmV0dXJuIG0/LTE6ZHx8cD9wOkl9fTt0LmV4cG9ydHM9e2ZvckVhY2g6Y3JlYXRlTWV0aG9kKDApLG1hcDpjcmVhdGVNZXRob2QoMSksZmlsdGVyOmNyZWF0ZU1ldGhvZCgyKSxzb21lOmNyZWF0ZU1ldGhvZCgzKSxldmVyeTpjcmVhdGVNZXRob2QoNCksZmluZDpjcmVhdGVNZXRob2QoNSksZmluZEluZGV4OmNyZWF0ZU1ldGhvZCg2KX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDIyKSxvPWEoMTYwKSxjPWEoNTcpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7dmFyIGE7byh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihhPXQuY29uc3RydWN0b3IpfHxhIT09QXJyYXkmJiFvKGEucHJvdG90eXBlKT9pKGEpJiZudWxsPT09KGE9YVtjXSkmJihhPXZvaWQgMCk6YT12b2lkIDApO3JldHVybiBuZXcodm9pZCAwPT09YT9BcnJheTphKSgwPT09cj8wOnIpfX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTkpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbiBpc0FycmF5KHQpe3JldHVybiJBcnJheSI9PWkodCl9fSxmdW5jdGlvbih0LHIsYSl7YSgxMTgpO2EoMTYyKTthKDEyMCk7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuV2Vha1NldH0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjthKDE0OCkoIldlYWtTZXQiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19KSxhKDE1NykpfSxmdW5jdGlvbih0LHIsYSl7YSgxNjQpO3ZhciBpPWEoNjEpO3QuZXhwb3J0cz1pKCJTdHJpbmciLCJjb2RlUG9pbnRBdCIpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTApLG89YSg3OCkuY29kZUF0O2koe3RhcmdldDoiU3RyaW5nIixwcm90bzohMH0se2NvZGVQb2ludEF0OmZ1bmN0aW9uIGNvZGVQb2ludEF0KHQpe3JldHVybiBvKHRoaXMsdCl9fSl9LGZ1bmN0aW9uKHQscixhKXthKDE2Nik7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuU3RyaW5nLmZyb21Db2RlUG9pbnR9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDEwKSxvPWEoNDkpLGM9U3RyaW5nLmZyb21DaGFyQ29kZSxsPVN0cmluZy5mcm9tQ29kZVBvaW50O2koe3RhcmdldDoiU3RyaW5nIixzdGF0OiEwLGZvcmNlZDohIWwmJjEhPWwubGVuZ3RofSx7ZnJvbUNvZGVQb2ludDpmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHQpe2Zvcih2YXIgcixhPVtdLGk9YXJndW1lbnRzLmxlbmd0aCxsPTA7aT5sOyl7cj0rYXJndW1lbnRzW2wrK107aWYobyhyLDExMTQxMTEpIT09cil0aHJvdyBSYW5nZUVycm9yKHIrIiBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Iik7YS5wdXNoKHI8NjU1MzY/YyhyKTpjKDU1Mjk2Kygoci09NjU1MzYpPj4xMCksciUxMDI0KzU2MzIwKSl9cmV0dXJuIGEuam9pbigiIil9fSl9LGZ1bmN0aW9uKHQscixhKXthKDE2OCk7YSgxMTgpO2EoMTcwKTthKDE3NCk7YSgxNzUpO2EoMTc2KTthKDE3Nyk7YSgxNzgpO2EoMTc5KTthKDE4MCk7YSgxODEpO2EoMTgyKTthKDE4Myk7YSgxODQpO2EoMTg1KTthKDE4Nik7YSgxODcpO2EoMTg4KTthKDE4OSk7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuU3ltYm9sfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTApLG89YSgxNCksYz1hKDE2MCksbD1hKDIyKSx1PWEoODMpLGg9YSg0NyksZD1hKDkzKSxwPWEoMTU5KSxtPWEoMTY5KSxnPWEoNTcpLHk9YSgxMzUpLGI9ZygiaXNDb25jYXRTcHJlYWRhYmxlIiksdj15Pj01MXx8IW8oKGZ1bmN0aW9uKCl7dmFyIHQ9W107dFtiXT0hMTtyZXR1cm4gdC5jb25jYXQoKVswXSE9PXR9KSksUz1tKCJjb25jYXQiKSxpc0NvbmNhdFNwcmVhZGFibGU9ZnVuY3Rpb24odCl7aWYoIWwodCkpcmV0dXJuITE7dmFyIHI9dFtiXTtyZXR1cm4gdm9pZCAwIT09cj8hIXI6Yyh0KX07aSh7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiF2fHwhU30se2NvbmNhdDpmdW5jdGlvbiBjb25jYXQodCl7dmFyIHIsYSxpLG8sYyxsPXUodGhpcyksbT1wKGwsMCksZz0wO2ZvcihyPS0xLGk9YXJndW1lbnRzLmxlbmd0aDtyPGk7cisrKWlmKGlzQ29uY2F0U3ByZWFkYWJsZShjPS0xPT09cj9sOmFyZ3VtZW50c1tyXSkpe2lmKGcrKG89aChjLmxlbmd0aCkpPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgVHlwZUVycm9yKCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQiKTtmb3IoYT0wO2E8bzthKyssZysrKWEgaW4gYyYmZChtLGcsY1thXSl9ZWxzZXtpZihnPj05MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7ZChtLGcrKyxjKX1tLmxlbmd0aD1nO3JldHVybiBtfX0pfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxNCksbz1hKDU3KSxjPWEoMTM1KSxsPW8oInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGM+PTUxfHwhaSgoZnVuY3Rpb24oKXt2YXIgcj1bXTsoci5jb25zdHJ1Y3Rvcj17fSlbbF09ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fTtyZXR1cm4gMSE9PXJbdF0oQm9vbGVhbikuZm9vfSkpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDEwKSxvPWEoMTEpLGM9YSg0MiksbD1hKDM3KSx1PWEoMTMpLGg9YSg1OCksZD1hKDU5KSxwPWEoMTQpLG09YSgyMyksZz1hKDE2MCkseT1hKDIyKSxiPWEoMjgpLHY9YSg4MyksUz1hKDE3KSxrPWEoMjEpLHc9YSgxNiksQz1hKDcxKSxfPWEoNzMpLHg9YSg0NCksQT1hKDE3MSksVD1hKDUxKSxSPWEoMTIpLEk9YSgyNyksUD1hKDE1KSxPPWEoMjYpLEU9YSgyOSksQj1hKDM2KSxEPWEoMzUpLE09YSgzOSksTD1hKDM4KSxOPWEoNTcpLFU9YSgxNzIpLGo9YSgxNzMpLHE9YSg4NSksVz1hKDMzKSx6PWEoMTU4KS5mb3JFYWNoLEc9RCgiaGlkZGVuIiksSD1OKCJ0b1ByaW1pdGl2ZSIpLFY9Vy5zZXQsWD1XLmdldHRlckZvcigiU3ltYm9sIiksWT1PYmplY3QucHJvdG90eXBlLEs9by5TeW1ib2wsSj1jKCJKU09OIiwic3RyaW5naWZ5IiksWj1SLmYsUT1JLmYsJD1BLmYsZWU9UC5mLHRlPUIoInN5bWJvbHMiKSxyZT1CKCJvcC1zeW1ib2xzIiksYWU9Qigic3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeSIpLG5lPUIoInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnkiKSxpZT1CKCJ3a3MiKSxvZT1vLlFPYmplY3Qsc2U9IW9lfHwhb2UucHJvdG90eXBlfHwhb2UucHJvdG90eXBlLmZpbmRDaGlsZCxjZT11JiZwKChmdW5jdGlvbigpe3JldHVybiA3IT1DKFEoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUSh0aGlzLCJhIix7dmFsdWU6N30pLmF9fSkpLmF9KSk/ZnVuY3Rpb24odCxyLGEpe3ZhciBpPVooWSxyKTtpJiZkZWxldGUgWVtyXTtRKHQscixhKTtpJiZ0IT09WSYmUShZLHIsaSl9OlEsd3JhcD1mdW5jdGlvbih0LHIpe3ZhciBhPXRlW3RdPUMoSy5wcm90b3R5cGUpO1YoYSx7dHlwZToiU3ltYm9sIix0YWc6dCxkZXNjcmlwdGlvbjpyfSk7dXx8KGEuZGVzY3JpcHRpb249cik7cmV0dXJuIGF9LGxlPWQ/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBLfSx1ZT1mdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LHIsYSl7dD09PVkmJnVlKHJlLHIsYSk7Yih0KTt2YXIgaT1rKHIsITApO2IoYSk7aWYobSh0ZSxpKSl7aWYoYS5lbnVtZXJhYmxlKXttKHQsRykmJnRbR11baV0mJih0W0ddW2ldPSExKTthPUMoYSx7ZW51bWVyYWJsZTp3KDAsITEpfSl9ZWxzZXttKHQsRyl8fFEodCxHLHcoMSx7fSkpO3RbR11baV09ITB9cmV0dXJuIGNlKHQsaSxhKX1yZXR1cm4gUSh0LGksYSl9LGZlPWZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModCxyKXtiKHQpO3ZhciBhPVMociksaT1fKGEpLmNvbmNhdChtZShhKSk7eihpLChmdW5jdGlvbihyKXt1JiYhaGUuY2FsbChhLHIpfHx1ZSh0LHIsYVtyXSl9KSk7cmV0dXJuIHR9LGhlPWZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKHQpe3ZhciByPWsodCwhMCksYT1lZS5jYWxsKHRoaXMscik7cmV0dXJuISh0aGlzPT09WSYmbSh0ZSxyKSYmIW0ocmUscikpJiYoIShhfHwhbSh0aGlzLHIpfHwhbSh0ZSxyKXx8bSh0aGlzLEcpJiZ0aGlzW0ddW3JdKXx8YSl9LGRlPWZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpe3ZhciBhPVModCksaT1rKHIsITApO2lmKGEhPT1ZfHwhbSh0ZSxpKXx8bShyZSxpKSl7dmFyIG89WihhLGkpOyFvfHwhbSh0ZSxpKXx8bShhLEcpJiZhW0ddW2ldfHwoby5lbnVtZXJhYmxlPSEwKTtyZXR1cm4gb319LHBlPWZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXModCl7dmFyIHI9JChTKHQpKSxhPVtdO3oociwoZnVuY3Rpb24odCl7bSh0ZSx0KXx8bShNLHQpfHxhLnB1c2godCl9KSk7cmV0dXJuIGF9LG1lPWZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyh0KXt2YXIgcj10PT09WSxhPSQocj9yZTpTKHQpKSxpPVtdO3ooYSwoZnVuY3Rpb24odCl7IW0odGUsdCl8fHImJiFtKFksdCl8fGkucHVzaCh0ZVt0XSl9KSk7cmV0dXJuIGl9O2lmKCFoKXtFKChLPWZ1bmN0aW9uIFN5bWJvbCgpe2lmKHRoaXMgaW5zdGFuY2VvZiBLKXRocm93IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP1N0cmluZyhhcmd1bWVudHNbMF0pOnZvaWQgMCxyPUwodCksc2V0dGVyPWZ1bmN0aW9uKHQpe3RoaXM9PT1ZJiZzZXR0ZXIuY2FsbChyZSx0KTttKHRoaXMsRykmJm0odGhpc1tHXSxyKSYmKHRoaXNbR11bcl09ITEpO2NlKHRoaXMscix3KDEsdCkpfTt1JiZzZSYmY2UoWSxyLHtjb25maWd1cmFibGU6ITAsc2V0OnNldHRlcn0pO3JldHVybiB3cmFwKHIsdCl9KS5wcm90b3R5cGUsInRvU3RyaW5nIiwoZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4gWCh0aGlzKS50YWd9KSk7RShLLCJ3aXRob3V0U2V0dGVyIiwoZnVuY3Rpb24odCl7cmV0dXJuIHdyYXAoTCh0KSx0KX0pKTtQLmY9aGU7SS5mPXVlO1IuZj1kZTt4LmY9QS5mPXBlO1QuZj1tZTtVLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHdyYXAoTih0KSx0KX07aWYodSl7UShLLnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uIGRlc2NyaXB0aW9uKCl7cmV0dXJuIFgodGhpcykuZGVzY3JpcHRpb259fSk7bHx8RShZLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsaGUse3Vuc2FmZTohMH0pfX1pKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IWgsc2hhbTohaH0se1N5bWJvbDpLfSk7eihfKGllKSwoZnVuY3Rpb24odCl7aih0KX0pKTtpKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IWh9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIHI9U3RyaW5nKHQpO2lmKG0oYWUscikpcmV0dXJuIGFlW3JdO3ZhciBhPUsocik7YWVbcl09YTtuZVthXT1yO3JldHVybiBhfSxrZXlGb3I6ZnVuY3Rpb24ga2V5Rm9yKHQpe2lmKCFsZSh0KSl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIHN5bWJvbCIpO2lmKG0obmUsdCkpcmV0dXJuIG5lW3RdfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtzZT0hMH0sdXNlU2ltcGxlOmZ1bmN0aW9uKCl7c2U9ITF9fSk7aSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFoLHNoYW06IXV9LHtjcmVhdGU6ZnVuY3Rpb24gY3JlYXRlKHQscil7cmV0dXJuIHZvaWQgMD09PXI/Qyh0KTpmZShDKHQpLHIpfSxkZWZpbmVQcm9wZXJ0eTp1ZSxkZWZpbmVQcm9wZXJ0aWVzOmZlLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpkZX0pO2koe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohaH0se2dldE93blByb3BlcnR5TmFtZXM6cGUsZ2V0T3duUHJvcGVydHlTeW1ib2xzOm1lfSk7aSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOnAoKGZ1bmN0aW9uKCl7VC5mKDEpfSkpfSx7Z2V0T3duUHJvcGVydHlTeW1ib2xzOmZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyh0KXtyZXR1cm4gVC5mKHYodCkpfX0pO2lmKEope2koe3RhcmdldDoiSlNPTiIsc3RhdDohMCxmb3JjZWQ6IWh8fHAoKGZ1bmN0aW9uKCl7dmFyIHQ9SygpO3JldHVybiJbbnVsbF0iIT1KKFt0XSl8fCJ7fSIhPUooe2E6dH0pfHwie30iIT1KKE9iamVjdCh0KSl9KSl9LHtzdHJpbmdpZnk6ZnVuY3Rpb24gc3RyaW5naWZ5KHQscixhKXtmb3IodmFyIGksbz1bdF0sYz0xO2FyZ3VtZW50cy5sZW5ndGg+Yzspby5wdXNoKGFyZ3VtZW50c1tjKytdKTtpPXI7aWYoKHkocil8fHZvaWQgMCE9PXQpJiYhbGUodCkpe2cocil8fChyPWZ1bmN0aW9uKHQscil7ImZ1bmN0aW9uIj09dHlwZW9mIGkmJihyPWkuY2FsbCh0aGlzLHQscikpO2lmKCFsZShyKSlyZXR1cm4gcn0pO29bMV09cjtyZXR1cm4gSi5hcHBseShudWxsLG8pfX19KX1LLnByb3RvdHlwZVtIXXx8TyhLLnByb3RvdHlwZSxILEsucHJvdG90eXBlLnZhbHVlT2YpO3EoSywiU3ltYm9sIik7TVtHXT0hMH0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTcpLG89YSg0NCkuZixjPXt9LnRvU3RyaW5nLGw9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKHQpe3JldHVybiBsJiYiW29iamVjdCBXaW5kb3ddIj09Yy5jYWxsKHQpP2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gbyh0KX1jYXRjaCh0KXtyZXR1cm4gbC5zbGljZSgpfX0odCk6byhpKHQpKX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDU3KTtyLmY9aX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoNDMpLG89YSgyMyksYz1hKDE3MiksbD1hKDI3KS5mO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgcj1pLlN5bWJvbHx8KGkuU3ltYm9sPXt9KTtvKHIsdCl8fGwocix0LHt2YWx1ZTpjLmYodCl9KX19LGZ1bmN0aW9uKHQscixhKXthKDE3MykoImFzeW5jSXRlcmF0b3IiKX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDEwKSxvPWEoMTMpLGM9YSgxMSksbD1hKDIzKSx1PWEoMjIpLGg9YSgyNykuZixkPWEoNDApLHA9Yy5TeW1ib2w7aWYobyYmImZ1bmN0aW9uIj09dHlwZW9mIHAmJighKCJkZXNjcmlwdGlvbiJpbiBwLnByb3RvdHlwZSl8fHZvaWQgMCE9PXAoKS5kZXNjcmlwdGlvbikpe3ZhciBtPXt9LGc9ZnVuY3Rpb24gU3ltYm9sKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDwxfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/dm9pZCAwOlN0cmluZyhhcmd1bWVudHNbMF0pLHI9dGhpcyBpbnN0YW5jZW9mIGc/bmV3IHAodCk6dm9pZCAwPT09dD9wKCk6cCh0KTsiIj09PXQmJihtW3JdPSEwKTtyZXR1cm4gcn07ZChnLHApO3ZhciB5PWcucHJvdG90eXBlPXAucHJvdG90eXBlO3kuY29uc3RydWN0b3I9Zzt2YXIgYj15LnRvU3RyaW5nLHY9IlN5bWJvbCh0ZXN0KSI9PVN0cmluZyhwKCJ0ZXN0IikpLFM9L15TeW1ib2xcKCguKilcKVteKV0rJC87aCh5LCJkZXNjcmlwdGlvbiIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZGVzY3JpcHRpb24oKXt2YXIgdD11KHRoaXMpP3RoaXMudmFsdWVPZigpOnRoaXMscj1iLmNhbGwodCk7aWYobChtLHQpKXJldHVybiIiO3ZhciBhPXY/ci5zbGljZSg3LC0xKTpyLnJlcGxhY2UoUywiJDEiKTtyZXR1cm4iIj09PWE/dm9pZCAwOmF9fSk7aSh7Z2xvYmFsOiEwLGZvcmNlZDohMH0se1N5bWJvbDpnfSl9fSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJoYXNJbnN0YW5jZSIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgibWF0Y2giKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgibWF0Y2hBbGwiKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJzZWFyY2giKX0sZnVuY3Rpb24odCxyLGEpe2EoMTczKSgic3BlY2llcyIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJ0b1ByaW1pdGl2ZSIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJ0b1N0cmluZ1RhZyIpfSxmdW5jdGlvbih0LHIsYSl7YSgxNzMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LHIsYSl7YSg4NSkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMSk7YSg4NSkoaS5KU09OLCJKU09OIiwhMCl9LGZ1bmN0aW9uKHQscixhKXthKDE5MSk7dmFyIGk9YSg2MSk7dC5leHBvcnRzPWkoIlN0cmluZyIsInBhZFN0YXJ0Iil9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7dmFyIGk9YSgxMCksbz1hKDE5Mikuc3RhcnQ7aSh7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDphKDE5NCl9LHtwYWRTdGFydDpmdW5jdGlvbiBwYWRTdGFydCh0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSg0Nyksbz1hKDE5MyksYz1hKDIwKSxsPU1hdGguY2VpbCxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHIsYSx1KXt2YXIgaCxkLHA9U3RyaW5nKGMocikpLG09cC5sZW5ndGgsZz12b2lkIDA9PT11PyIgIjpTdHJpbmcodSkseT1pKGEpO2lmKHk8PW18fCIiPT1nKXJldHVybiBwO2g9eS1tOyhkPW8uY2FsbChnLGwoaC9nLmxlbmd0aCkpKS5sZW5ndGg+aCYmKGQ9ZC5zbGljZSgwLGgpKTtyZXR1cm4gdD9wK2Q6ZCtwfX07dC5leHBvcnRzPXtzdGFydDpjcmVhdGVNZXRob2QoITEpLGVuZDpjcmVhdGVNZXRob2QoITApfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1hKDQ4KSxvPWEoMjApO3QuZXhwb3J0cz0iIi5yZXBlYXR8fGZ1bmN0aW9uIHJlcGVhdCh0KXt2YXIgcj1TdHJpbmcobyh0aGlzKSksYT0iIixjPWkodCk7aWYoYzwwfHxjPT0xLzApdGhyb3cgUmFuZ2VFcnJvcigiV3JvbmcgbnVtYmVyIG9mIHJlcGV0aXRpb25zIik7Zm9yKDtjPjA7KGM+Pj49MSkmJihyKz1yKSkxJmMmJihhKz1yKTtyZXR1cm4gYX19LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDEyOSk7dC5leHBvcnRzPS9WZXJzaW9uXC8xMFwuXGQrKFwuXGQrKT8oIE1vYmlsZVwvXHcrKT8gU2FmYXJpXC8vLnRlc3QoaSl9LGZ1bmN0aW9uKHQscixhKXthKDE5Nik7dmFyIGk9YSg2MSk7dC5leHBvcnRzPWkoIlN0cmluZyIsInBhZEVuZCIpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO3ZhciBpPWEoMTApLG89YSgxOTIpLmVuZDtpKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOmEoMTk0KX0se3BhZEVuZDpmdW5jdGlvbiBwYWRFbmQodCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxyLGEpe2EoMTk4KTt2YXIgaT1hKDQzKTt0LmV4cG9ydHM9aS5PYmplY3QudmFsdWVzfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgxMCksbz1hKDE5OSkudmFsdWVzO2koe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7dmFsdWVzOmZ1bmN0aW9uIHZhbHVlcyh0KXtyZXR1cm4gbyh0KX19KX0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMTMpLG89YSg3MyksYz1hKDE3KSxsPWEoMTUpLmYsY3JlYXRlTWV0aG9kPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihyKXtmb3IodmFyIGEsdT1jKHIpLGg9byh1KSxkPWgubGVuZ3RoLHA9MCxtPVtdO2Q+cDspe2E9aFtwKytdO2kmJiFsLmNhbGwodSxhKXx8bS5wdXNoKHQ/W2EsdVthXV06dVthXSl9cmV0dXJuIG19fTt0LmV4cG9ydHM9e2VudHJpZXM6Y3JlYXRlTWV0aG9kKCEwKSx2YWx1ZXM6Y3JlYXRlTWV0aG9kKCExKX19LGZ1bmN0aW9uKHQscixhKXthKDIwMSk7dmFyIGk9YSg0Myk7dC5leHBvcnRzPWkuT2JqZWN0LmVudHJpZXN9LGZ1bmN0aW9uKHQscixhKXt2YXIgaT1hKDEwKSxvPWEoMTk5KS5lbnRyaWVzO2koe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7ZW50cmllczpmdW5jdGlvbiBlbnRyaWVzKHQpe3JldHVybiBvKHQpfX0pfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLmNsZWFyUHJpbWl0aXZlQ2FjaGVzPWZ1bmN0aW9uIGNsZWFyUHJpbWl0aXZlQ2FjaGVzKCl7bC5fY2xlYXJDYWNoZSgpO2MuX2NsZWFyQ2FjaGUoKTtoLl9jbGVhckNhY2hlKCl9O3IuaXNFT0Y9ZnVuY3Rpb24gaXNFT0YodCl7cmV0dXJuIHQ9PT1vfTtyLmlzQ21kPWZ1bmN0aW9uIGlzQ21kKHQscil7cmV0dXJuIHQgaW5zdGFuY2VvZiBsJiYodm9pZCAwPT09cnx8dC5jbWQ9PT1yKX07ci5pc0RpY3Q9ZnVuY3Rpb24gaXNEaWN0KHQscil7cmV0dXJuIHQgaW5zdGFuY2VvZiB1JiYodm9pZCAwPT09cnx8aXNOYW1lKHQuZ2V0KCJUeXBlIikscikpfTtyLmlzTmFtZT1pc05hbWU7ci5pc1JlZj1mdW5jdGlvbiBpc1JlZih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGh9O3IuaXNSZWZzRXF1YWw9ZnVuY3Rpb24gaXNSZWZzRXF1YWwodCxyKXtyZXR1cm4gdC5udW09PT1yLm51bSYmdC5nZW49PT1yLmdlbn07ci5pc1N0cmVhbT1mdW5jdGlvbiBpc1N0cmVhbSh0KXtyZXR1cm4ib2JqZWN0Ij09PV90eXBlb2YodCkmJm51bGwhPT10JiZ2b2lkIDAhPT10LmdldEJ5dGVzfTtyLlJlZlNldENhY2hlPXIuUmVmU2V0PXIuUmVmPXIuTmFtZT1yLkRpY3Q9ci5DbWQ9ci5FT0Y9dm9pZCAwO3ZhciBpPWZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShhKDIpKTthKDUpO2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGk9clthXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMTtpLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9ZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkodCxyKXtyZXR1cm4gZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9KHQpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQodCxyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIGE9W10saT0hMCxvPSExLGM9dm9pZCAwO3RyeXtmb3IodmFyIGwsdT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KGw9dS5uZXh0KCkpLmRvbmUpO2k9ITApe2EucHVzaChsLnZhbHVlKTtpZihyJiZhLmxlbmd0aD09PXIpYnJlYWt9fWNhdGNoKHQpe289ITA7Yz10fWZpbmFsbHl7dHJ5e2l8fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYobyl0aHJvdyBjfX1yZXR1cm4gYX0odCxyKXx8X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil8fGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQscil7dmFyIGE7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KGE9X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQpKXx8ciYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7YSYmKHQ9YSk7dmFyIGk9MCxvPWZ1bmN0aW9uIEYoKXt9O3JldHVybntzOm8sbjpmdW5jdGlvbiBuKCl7cmV0dXJuIGk+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W2krK119fSxlOmZ1bmN0aW9uIGUodCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGMsbD0hMCx1PSExO3JldHVybntzOmZ1bmN0aW9uIHMoKXthPXRbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uIG4oKXt2YXIgdD1hLm5leHQoKTtsPXQuZG9uZTtyZXR1cm4gdH0sZTpmdW5jdGlvbiBlKHQpe3U9ITA7Yz10fSxmOmZ1bmN0aW9uIGYoKXt0cnl7bHx8bnVsbD09YS5yZXR1cm58fGEucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IGN9fX19ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7cmV0dXJuIk1hcCI9PT1hfHwiU2V0Ij09PWE/QXJyYXkuZnJvbSh0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP19hcnJheUxpa2VUb0FycmF5KHQscik6dm9pZCAwfX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLGk9bmV3IEFycmF5KHIpO2E8cjthKyspaVthXT10W2FdO3JldHVybiBpfWZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcCh0LHIsYSxpLG8sYyxsKXt0cnl7dmFyIHU9dFtjXShsKSxoPXUudmFsdWV9Y2F0Y2godCl7YSh0KTtyZXR1cm59dS5kb25lP3IoaCk6UHJvbWlzZS5yZXNvbHZlKGgpLnRoZW4oaSxvKX12YXIgbz17fTtyLkVPRj1vO3ZhciBjPWZ1bmN0aW9uIE5hbWVDbG9zdXJlKCl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBOYW1lKHQpe3RoaXMubmFtZT10fU5hbWUucHJvdG90eXBlPXt9O05hbWUuZ2V0PWZ1bmN0aW9uIE5hbWVfZ2V0KHIpe3ZhciBhPXRbcl07cmV0dXJuIGF8fCh0W3JdPW5ldyBOYW1lKHIpKX07TmFtZS5fY2xlYXJDYWNoZT1mdW5jdGlvbigpe3Q9T2JqZWN0LmNyZWF0ZShudWxsKX07cmV0dXJuIE5hbWV9KCk7ci5OYW1lPWM7dmFyIGw9ZnVuY3Rpb24gQ21kQ2xvc3VyZSgpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gQ21kKHQpe3RoaXMuY21kPXR9Q21kLnByb3RvdHlwZT17fTtDbWQuZ2V0PWZ1bmN0aW9uIENtZF9nZXQocil7dmFyIGE9dFtyXTtyZXR1cm4gYXx8KHRbcl09bmV3IENtZChyKSl9O0NtZC5fY2xlYXJDYWNoZT1mdW5jdGlvbigpe3Q9T2JqZWN0LmNyZWF0ZShudWxsKX07cmV0dXJuIENtZH0oKTtyLkNtZD1sO3ZhciB1PWZ1bmN0aW9uIERpY3RDbG9zdXJlKCl7dmFyIHQ9ZnVuY3Rpb24gbm9uU2VyaWFsaXphYmxlQ2xvc3VyZSgpe3JldHVybiB0fTtmdW5jdGlvbiBEaWN0KHIpe3RoaXMuX21hcD1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMueHJlZj1yO3RoaXMub2JqSWQ9bnVsbDt0aGlzLnN1cHByZXNzRW5jcnlwdGlvbj0hMTt0aGlzLl9fbm9uU2VyaWFsaXphYmxlX189dH1EaWN0LnByb3RvdHlwZT17YXNzaWduWHJlZjpmdW5jdGlvbiBEaWN0X2Fzc2lnblhyZWYodCl7dGhpcy54cmVmPXR9LGdldCBzaXplKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21hcCkubGVuZ3RofSxnZXQ6ZnVuY3Rpb24gZ2V0KHQscixhKXt2YXIgaT10aGlzLl9tYXBbdF07dm9pZCAwPT09aSYmdm9pZCAwIT09ciYmdm9pZCAwPT09KGk9dGhpcy5fbWFwW3JdKSYmdm9pZCAwIT09YSYmKGk9dGhpcy5fbWFwW2FdKTtyZXR1cm4gaSBpbnN0YW5jZW9mIGgmJnRoaXMueHJlZj90aGlzLnhyZWYuZmV0Y2goaSx0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik6aX0sZ2V0QXN5bmM6ZnVuY3Rpb24gZ2V0QXN5bmModCxyLGEpe3ZhciBvPXRoaXM7cmV0dXJuIGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsYT1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLG8pe3ZhciBjPXQuYXBwbHkocixhKTtmdW5jdGlvbiBfbmV4dCh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJuZXh0Iix0KX1mdW5jdGlvbiBfdGhyb3codCl7YXN5bmNHZW5lcmF0b3JTdGVwKGMsaSxvLF9uZXh0LF90aHJvdywidGhyb3ciLHQpfV9uZXh0KHZvaWQgMCl9KSl9fShpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSgpe3ZhciBjO3JldHVybiBpLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZSQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6dm9pZCAwPT09KGM9by5fbWFwW3RdKSYmdm9pZCAwIT09ciYmdm9pZCAwPT09KGM9by5fbWFwW3JdKSYmdm9pZCAwIT09YSYmKGM9by5fbWFwW2FdKTtpZighKGMgaW5zdGFuY2VvZiBoJiZvLnhyZWYpKXtpLm5leHQ9NDticmVha31yZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsby54cmVmLmZldGNoQXN5bmMoYyxvLnN1cHByZXNzRW5jcnlwdGlvbikpO2Nhc2UgNDpyZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsYyk7Y2FzZSA1OmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZSl9KSkpKCl9LGdldEFycmF5OmZ1bmN0aW9uIGdldEFycmF5KHQscixhKXt2YXIgaT10aGlzLmdldCh0LHIsYSk7aWYoIUFycmF5LmlzQXJyYXkoaSl8fCF0aGlzLnhyZWYpcmV0dXJuIGk7Zm9yKHZhciBvPTAsYz0oaT1pLnNsaWNlKCkpLmxlbmd0aDtvPGM7bysrKWlbb11pbnN0YW5jZW9mIGgmJihpW29dPXRoaXMueHJlZi5mZXRjaChpW29dLHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKSk7cmV0dXJuIGl9LGdldFJhdzpmdW5jdGlvbiBEaWN0X2dldFJhdyh0KXtyZXR1cm4gdGhpcy5fbWFwW3RdfSxnZXRLZXlzOmZ1bmN0aW9uIERpY3RfZ2V0S2V5cygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApfSxnZXRSYXdWYWx1ZXM6ZnVuY3Rpb24gRGljdF9nZXRSYXdWYWx1ZXMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9tYXApfSxzZXQ6ZnVuY3Rpb24gRGljdF9zZXQodCxyKXt0aGlzLl9tYXBbdF09cn0saGFzOmZ1bmN0aW9uIERpY3RfaGFzKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLl9tYXBbdF19LGZvckVhY2g6ZnVuY3Rpb24gRGljdF9mb3JFYWNoKHQpe2Zvcih2YXIgciBpbiB0aGlzLl9tYXApdChyLHRoaXMuZ2V0KHIpKX19O0RpY3QuZW1wdHk9bmV3IERpY3QobnVsbCk7RGljdC5tZXJnZT1mdW5jdGlvbih0KXt2YXIgcj10LnhyZWYsYT10LmRpY3RBcnJheSxpPXQubWVyZ2VTdWJEaWN0cyxvPXZvaWQgMCE9PWkmJmksYz1uZXcgRGljdChyKTtpZighbyl7dmFyIGwsdT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihhKTt0cnl7Zm9yKHUucygpOyEobD11Lm4oKSkuZG9uZTspe3ZhciBoPWwudmFsdWU7aWYoaCBpbnN0YW5jZW9mIERpY3QpZm9yKHZhciBkPTAscD1PYmplY3QuZW50cmllcyhoLl9tYXApO2Q8cC5sZW5ndGg7ZCsrKXt2YXIgbT1fc2xpY2VkVG9BcnJheShwW2RdLDIpLGc9bVswXSx5PW1bMV07dm9pZCAwPT09Yy5fbWFwW2ddJiYoYy5fbWFwW2ddPXkpfX19Y2F0Y2godCl7dS5lKHQpfWZpbmFsbHl7dS5mKCl9cmV0dXJuIGMuc2l6ZT4wP2M6RGljdC5lbXB0eX12YXIgYix2PW5ldyBNYXAsUz1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihhKTt0cnl7Zm9yKFMucygpOyEoYj1TLm4oKSkuZG9uZTspe3ZhciBrPWIudmFsdWU7aWYoayBpbnN0YW5jZW9mIERpY3QpZm9yKHZhciB3PTAsQz1PYmplY3QuZW50cmllcyhrLl9tYXApO3c8Qy5sZW5ndGg7dysrKXt2YXIgXz1fc2xpY2VkVG9BcnJheShDW3ddLDIpLHg9X1swXSxBPV9bMV0sVD12LmdldCh4KTtpZih2b2lkIDA9PT1UKXtUPVtdO3Yuc2V0KHgsVCl9VC5wdXNoKEEpfX19Y2F0Y2godCl7Uy5lKHQpfWZpbmFsbHl7Uy5mKCl9dmFyIFIsST1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih2KTt0cnl7Zm9yKEkucygpOyEoUj1JLm4oKSkuZG9uZTspe3ZhciBQPV9zbGljZWRUb0FycmF5KFIudmFsdWUsMiksTz1QWzBdLEU9UFsxXTtpZigxIT09RS5sZW5ndGgmJkVbMF1pbnN0YW5jZW9mIERpY3Qpe3ZhciBCLEQ9bmV3IERpY3QociksTT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihFKTt0cnl7Zm9yKE0ucygpOyEoQj1NLm4oKSkuZG9uZTspe3ZhciBMPUIudmFsdWU7aWYoTCBpbnN0YW5jZW9mIERpY3QpZm9yKHZhciBOPTAsVT1PYmplY3QuZW50cmllcyhMLl9tYXApO048VS5sZW5ndGg7TisrKXt2YXIgaj1fc2xpY2VkVG9BcnJheShVW05dLDIpLHE9alswXSxXPWpbMV07dm9pZCAwPT09RC5fbWFwW3FdJiYoRC5fbWFwW3FdPVcpfX19Y2F0Y2godCl7TS5lKHQpfWZpbmFsbHl7TS5mKCl9RC5zaXplPjAmJihjLl9tYXBbT109RCl9ZWxzZSBjLl9tYXBbT109RVswXX19Y2F0Y2godCl7SS5lKHQpfWZpbmFsbHl7SS5mKCl9di5jbGVhcigpO3JldHVybiBjLnNpemU+MD9jOkRpY3QuZW1wdHl9O3JldHVybiBEaWN0fSgpO3IuRGljdD11O3ZhciBoPWZ1bmN0aW9uIFJlZkNsb3N1cmUoKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIFJlZih0LHIpe3RoaXMubnVtPXQ7dGhpcy5nZW49cn1SZWYucHJvdG90eXBlPXt0b1N0cmluZzpmdW5jdGlvbiBSZWZfdG9TdHJpbmcoKXtyZXR1cm4gMD09PXRoaXMuZ2VuPyIiLmNvbmNhdCh0aGlzLm51bSwiUiIpOiIiLmNvbmNhdCh0aGlzLm51bSwiUiIpLmNvbmNhdCh0aGlzLmdlbil9fTtSZWYuZ2V0PWZ1bmN0aW9uKHIsYSl7dmFyIGk9MD09PWE/IiIuY29uY2F0KHIsIlIiKToiIi5jb25jYXQociwiUiIpLmNvbmNhdChhKSxvPXRbaV07cmV0dXJuIG98fCh0W2ldPW5ldyBSZWYocixhKSl9O1JlZi5fY2xlYXJDYWNoZT1mdW5jdGlvbigpe3Q9T2JqZWN0LmNyZWF0ZShudWxsKX07cmV0dXJuIFJlZn0oKTtyLlJlZj1oO3ZhciBkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUmVmU2V0KCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUmVmU2V0KTt0aGlzLl9zZXQ9bmV3IFNldH1fY3JlYXRlQ2xhc3MoUmVmU2V0LFt7a2V5OiJoYXMiLHZhbHVlOmZ1bmN0aW9uIGhhcyh0KXtyZXR1cm4gdGhpcy5fc2V0Lmhhcyh0LnRvU3RyaW5nKCkpfX0se2tleToicHV0Iix2YWx1ZTpmdW5jdGlvbiBwdXQodCl7dGhpcy5fc2V0LmFkZCh0LnRvU3RyaW5nKCkpfX0se2tleToicmVtb3ZlIix2YWx1ZTpmdW5jdGlvbiByZW1vdmUodCl7dGhpcy5fc2V0LmRlbGV0ZSh0LnRvU3RyaW5nKCkpfX1dKTtyZXR1cm4gUmVmU2V0fSgpO3IuUmVmU2V0PWQ7dmFyIHA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBSZWZTZXRDYWNoZSgpe19jbGFzc0NhbGxDaGVjayh0aGlzLFJlZlNldENhY2hlKTt0aGlzLl9tYXA9bmV3IE1hcH1fY3JlYXRlQ2xhc3MoUmVmU2V0Q2FjaGUsW3trZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24gZ2V0KHQpe3JldHVybiB0aGlzLl9tYXAuZ2V0KHQudG9TdHJpbmcoKSl9fSx7a2V5OiJoYXMiLHZhbHVlOmZ1bmN0aW9uIGhhcyh0KXtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0LnRvU3RyaW5nKCkpfX0se2tleToicHV0Iix2YWx1ZTpmdW5jdGlvbiBwdXQodCxyKXt0aGlzLl9tYXAuc2V0KHQudG9TdHJpbmcoKSxyKX19LHtrZXk6InB1dEFsaWFzIix2YWx1ZTpmdW5jdGlvbiBwdXRBbGlhcyh0LHIpe3RoaXMuX21hcC5zZXQodC50b1N0cmluZygpLHRoaXMuZ2V0KHIpKX19LHtrZXk6ImZvckVhY2giLHZhbHVlOmZ1bmN0aW9uIGZvckVhY2godCl7dmFyIHIsYT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLl9tYXAudmFsdWVzKCkpO3RyeXtmb3IoYS5zKCk7IShyPWEubigpKS5kb25lOyl7dChyLnZhbHVlKX19Y2F0Y2godCl7YS5lKHQpfWZpbmFsbHl7YS5mKCl9fX0se2tleToiY2xlYXIiLHZhbHVlOmZ1bmN0aW9uIGNsZWFyKCl7dGhpcy5fbWFwLmNsZWFyKCl9fSx7a2V5OiJzaXplIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX21hcC5zaXplfX1dKTtyZXR1cm4gUmVmU2V0Q2FjaGV9KCk7ci5SZWZTZXRDYWNoZT1wO2Z1bmN0aW9uIGlzTmFtZSh0LHIpe3JldHVybiB0IGluc3RhbmNlb2YgYyYmKHZvaWQgMD09PXJ8fHQubmFtZT09PXIpfX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5OZXR3b3JrUGRmTWFuYWdlcj1yLkxvY2FsUGRmTWFuYWdlcj12b2lkIDA7dmFyIGk9ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KGEoMikpLG89YSg1KSxjPWEoMjA0KSxsPWEoMjA1KSx1PWEoMjA2KSxoPWEoMjA5KTtmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIF9pbmhlcml0cyh0LHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByJiZudWxsIT09cil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtyJiZfc2V0UHJvdG90eXBlT2YodCxyKX1mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXtyZXR1cm4oX3NldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7dC5fX3Byb3RvX189cjtyZXR1cm4gdH0pKHQscil9ZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKHQpe3ZhciByPWZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7RGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSk7cmV0dXJuITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpe3ZhciBhLGk9X2dldFByb3RvdHlwZU9mKHQpO2lmKHIpe3ZhciBvPV9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjthPVJlZmxlY3QuY29uc3RydWN0KGksYXJndW1lbnRzLG8pfWVsc2UgYT1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcyxhKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCxyKXtyZXR1cm4hcnx8Im9iamVjdCIhPT1fdHlwZW9mKHIpJiYiZnVuY3Rpb24iIT10eXBlb2Ygcj9fYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpOnJ9ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxyLGEsaSxvLGMsbCl7dHJ5e3ZhciB1PXRbY10obCksaD11LnZhbHVlfWNhdGNoKHQpe2EodCk7cmV0dXJufXUuZG9uZT9yKGgpOlByb21pc2UucmVzb2x2ZShoKS50aGVuKGksbyl9ZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksbyl7dmFyIGM9dC5hcHBseShyLGEpO2Z1bmN0aW9uIF9uZXh0KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChjLGksbyxfbmV4dCxfdGhyb3csIm5leHQiLHQpfWZ1bmN0aW9uIF90aHJvdyh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJ0aHJvdyIsdCl9X25leHQodm9pZCAwKX0pKX19ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGk9clthXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMTtpLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9dmFyIGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBCYXNlUGRmTWFuYWdlcigpe19jbGFzc0NhbGxDaGVjayh0aGlzLEJhc2VQZGZNYW5hZ2VyKTt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZVBkZk1hbmFnZXImJigwLG8udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlUGRmTWFuYWdlci4iKX1fY3JlYXRlQ2xhc3MoQmFzZVBkZk1hbmFnZXIsW3trZXk6Im9uTG9hZGVkU3RyZWFtIix2YWx1ZTpmdW5jdGlvbiBvbkxvYWRlZFN0cmVhbSgpeygwLG8udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYG9uTG9hZGVkU3RyZWFtYCBjYWxsZWQiKX19LHtrZXk6ImVuc3VyZURvYyIsdmFsdWU6ZnVuY3Rpb24gZW5zdXJlRG9jKHQscil7cmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQsdCxyKX19LHtrZXk6ImVuc3VyZVhSZWYiLHZhbHVlOmZ1bmN0aW9uIGVuc3VyZVhSZWYodCxyKXtyZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC54cmVmLHQscil9fSx7a2V5OiJlbnN1cmVDYXRhbG9nIix2YWx1ZTpmdW5jdGlvbiBlbnN1cmVDYXRhbG9nKHQscil7cmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZyx0LHIpfX0se2tleToiZ2V0UGFnZSIsdmFsdWU6ZnVuY3Rpb24gZ2V0UGFnZSh0KXtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKHQpfX0se2tleToiZm9udEZhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbiBmb250RmFsbGJhY2sodCxyKXtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5mb250RmFsbGJhY2sodCxyKX19LHtrZXk6ImNsZWFudXAiLHZhbHVlOmZ1bmN0aW9uIGNsZWFudXAoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnBkZkRvY3VtZW50LmNsZWFudXAodCl9fSx7a2V5OiJlbnN1cmUiLHZhbHVlOih0PV9hc3luY1RvR2VuZXJhdG9yKGkuZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlKHQscixhKXtyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUkKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOigwLG8udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGVuc3VyZWAgY2FsbGVkIik7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksX2NhbGxlZSl9KSkpLGZ1bmN0aW9uIGVuc3VyZShyLGEsaSl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6InJlcXVlc3RSYW5nZSIsdmFsdWU6ZnVuY3Rpb24gcmVxdWVzdFJhbmdlKHQscil7KDAsby51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdFJhbmdlYCBjYWxsZWQiKX19LHtrZXk6InJlcXVlc3RMb2FkZWRTdHJlYW0iLHZhbHVlOmZ1bmN0aW9uIHJlcXVlc3RMb2FkZWRTdHJlYW0oKXsoMCxvLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0TG9hZGVkU3RyZWFtYCBjYWxsZWQiKX19LHtrZXk6InNlbmRQcm9ncmVzc2l2ZURhdGEiLHZhbHVlOmZ1bmN0aW9uIHNlbmRQcm9ncmVzc2l2ZURhdGEodCl7KDAsby51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkIil9fSx7a2V5OiJ1cGRhdGVQYXNzd29yZCIsdmFsdWU6ZnVuY3Rpb24gdXBkYXRlUGFzc3dvcmQodCl7dGhpcy5fcGFzc3dvcmQ9dH19LHtrZXk6InRlcm1pbmF0ZSIsdmFsdWU6ZnVuY3Rpb24gdGVybWluYXRlKHQpeygwLG8udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHRlcm1pbmF0ZWAgY2FsbGVkIil9fSx7a2V5OiJkb2NJZCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9kb2NJZH19LHtrZXk6InBhc3N3b3JkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3Bhc3N3b3JkfX0se2tleToiZG9jQmFzZVVybCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PW51bGw7aWYodGhpcy5fZG9jQmFzZVVybCl7dmFyIHI9KDAsby5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSh0aGlzLl9kb2NCYXNlVXJsKTtyP3Q9ci5ocmVmOigwLG8ud2FybikoJ0ludmFsaWQgYWJzb2x1dGUgZG9jQmFzZVVybDogIicuY29uY2F0KHRoaXMuX2RvY0Jhc2VVcmwsJyIuJykpfXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJkb2NCYXNlVXJsIix0KX19XSk7dmFyIHQ7cmV0dXJuIEJhc2VQZGZNYW5hZ2VyfSgpLHA9ZnVuY3Rpb24odCl7X2luaGVyaXRzKExvY2FsUGRmTWFuYWdlcix0KTt2YXIgcixhPV9jcmVhdGVTdXBlcihMb2NhbFBkZk1hbmFnZXIpO2Z1bmN0aW9uIExvY2FsUGRmTWFuYWdlcih0LHIsaSxvLGMpe3ZhciBsO19jbGFzc0NhbGxDaGVjayh0aGlzLExvY2FsUGRmTWFuYWdlcik7KGw9YS5jYWxsKHRoaXMpKS5fZG9jSWQ9dDtsLl9wYXNzd29yZD1pO2wuX2RvY0Jhc2VVcmw9YztsLmV2YWx1YXRvck9wdGlvbnM9bzt2YXIgZD1uZXcgaC5TdHJlYW0ocik7bC5wZGZEb2N1bWVudD1uZXcgdS5QREZEb2N1bWVudChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGwpLGQpO2wuX2xvYWRlZFN0cmVhbVByb21pc2U9UHJvbWlzZS5yZXNvbHZlKGQpO3JldHVybiBsfV9jcmVhdGVDbGFzcyhMb2NhbFBkZk1hbmFnZXIsW3trZXk6ImVuc3VyZSIsdmFsdWU6KHI9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUyKHQscixhKXt2YXIgbztyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUyJChpKXtmb3IoOzspc3dpdGNoKGkucHJldj1pLm5leHQpe2Nhc2UgMDppZigiZnVuY3Rpb24iIT10eXBlb2Yobz10W3JdKSl7aS5uZXh0PTM7YnJlYWt9cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLG8uYXBwbHkodCxhKSk7Y2FzZSAzOnJldHVybiBpLmFicnVwdCgicmV0dXJuIixvKTtjYXNlIDQ6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19KSxfY2FsbGVlMil9KSkpLGZ1bmN0aW9uIGVuc3VyZSh0LGEsaSl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6InJlcXVlc3RSYW5nZSIsdmFsdWU6ZnVuY3Rpb24gcmVxdWVzdFJhbmdlKHQscil7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfX0se2tleToicmVxdWVzdExvYWRlZFN0cmVhbSIsdmFsdWU6ZnVuY3Rpb24gcmVxdWVzdExvYWRlZFN0cmVhbSgpe319LHtrZXk6Im9uTG9hZGVkU3RyZWFtIix2YWx1ZTpmdW5jdGlvbiBvbkxvYWRlZFN0cmVhbSgpe3JldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1Qcm9taXNlfX0se2tleToidGVybWluYXRlIix2YWx1ZTpmdW5jdGlvbiB0ZXJtaW5hdGUodCl7fX1dKTtyZXR1cm4gTG9jYWxQZGZNYW5hZ2VyfShkKTtyLkxvY2FsUGRmTWFuYWdlcj1wO3ZhciBtPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhOZXR3b3JrUGRmTWFuYWdlcix0KTt2YXIgcixhPV9jcmVhdGVTdXBlcihOZXR3b3JrUGRmTWFuYWdlcik7ZnVuY3Rpb24gTmV0d29ya1BkZk1hbmFnZXIodCxyLGksbyxsKXt2YXIgaDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxOZXR3b3JrUGRmTWFuYWdlcik7KGg9YS5jYWxsKHRoaXMpKS5fZG9jSWQ9dDtoLl9wYXNzd29yZD1pLnBhc3N3b3JkO2guX2RvY0Jhc2VVcmw9bDtoLm1zZ0hhbmRsZXI9aS5tc2dIYW5kbGVyO2guZXZhbHVhdG9yT3B0aW9ucz1vO2guc3RyZWFtTWFuYWdlcj1uZXcgYy5DaHVua2VkU3RyZWFtTWFuYWdlcihyLHttc2dIYW5kbGVyOmkubXNnSGFuZGxlcixsZW5ndGg6aS5sZW5ndGgsZGlzYWJsZUF1dG9GZXRjaDppLmRpc2FibGVBdXRvRmV0Y2gscmFuZ2VDaHVua1NpemU6aS5yYW5nZUNodW5rU2l6ZX0pO2gucGRmRG9jdW1lbnQ9bmV3IHUuUERGRG9jdW1lbnQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChoKSxoLnN0cmVhbU1hbmFnZXIuZ2V0U3RyZWFtKCkpO3JldHVybiBofV9jcmVhdGVDbGFzcyhOZXR3b3JrUGRmTWFuYWdlcixbe2tleToiZW5zdXJlIix2YWx1ZToocj1fYXN5bmNUb0dlbmVyYXRvcihpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZTModCxyLGEpe3ZhciBvO3JldHVybiBpLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZTMkKGkpe2Zvcig7Oylzd2l0Y2goaS5wcmV2PWkubmV4dCl7Y2FzZSAwOmkucHJldj0wO2lmKCJmdW5jdGlvbiIhPXR5cGVvZihvPXRbcl0pKXtpLm5leHQ9NDticmVha31yZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsby5hcHBseSh0LGEpKTtjYXNlIDQ6cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLG8pO2Nhc2UgNzppLnByZXY9NztpLnQwPWkuY2F0Y2goMCk7aWYoaS50MCBpbnN0YW5jZW9mIGwuTWlzc2luZ0RhdGFFeGNlcHRpb24pe2kubmV4dD0xMTticmVha310aHJvdyBpLnQwO2Nhc2UgMTE6aS5uZXh0PTEzO3JldHVybiB0aGlzLnJlcXVlc3RSYW5nZShpLnQwLmJlZ2luLGkudDAuZW5kKTtjYXNlIDEzOnJldHVybiBpLmFicnVwdCgicmV0dXJuIix0aGlzLmVuc3VyZSh0LHIsYSkpO2Nhc2UgMTQ6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19KSxfY2FsbGVlMyx0aGlzLFtbMCw3XV0pfSkpKSxmdW5jdGlvbiBlbnN1cmUodCxhLGkpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJyZXF1ZXN0UmFuZ2UiLHZhbHVlOmZ1bmN0aW9uIHJlcXVlc3RSYW5nZSh0LHIpe3JldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdFJhbmdlKHQscil9fSx7a2V5OiJyZXF1ZXN0TG9hZGVkU3RyZWFtIix2YWx1ZTpmdW5jdGlvbiByZXF1ZXN0TG9hZGVkU3RyZWFtKCl7dGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RBbGxDaHVua3MoKX19LHtrZXk6InNlbmRQcm9ncmVzc2l2ZURhdGEiLHZhbHVlOmZ1bmN0aW9uIHNlbmRQcm9ncmVzc2l2ZURhdGEodCl7dGhpcy5zdHJlYW1NYW5hZ2VyLm9uUmVjZWl2ZURhdGEoe2NodW5rOnR9KX19LHtrZXk6Im9uTG9hZGVkU3RyZWFtIix2YWx1ZTpmdW5jdGlvbiBvbkxvYWRlZFN0cmVhbSgpe3JldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKX19LHtrZXk6InRlcm1pbmF0ZSIsdmFsdWU6ZnVuY3Rpb24gdGVybWluYXRlKHQpe3RoaXMuc3RyZWFtTWFuYWdlci5hYm9ydCh0KX19XSk7cmV0dXJuIE5ldHdvcmtQZGZNYW5hZ2VyfShkKTtyLk5ldHdvcmtQZGZNYW5hZ2VyPW19LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuQ2h1bmtlZFN0cmVhbU1hbmFnZXI9ci5DaHVua2VkU3RyZWFtPXZvaWQgMDt2YXIgaT1hKDUpLG89YSgyMDUpO2Z1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQscil7dmFyIGE7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KGE9ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYoIXQpcmV0dXJuO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKTt2YXIgYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7Ik9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09YXx8IlNldCI9PT1hKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKCJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSkpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscil9KHQpKXx8ciYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7YSYmKHQ9YSk7dmFyIGk9MCxvPWZ1bmN0aW9uIEYoKXt9O3JldHVybntzOm8sbjpmdW5jdGlvbiBuKCl7cmV0dXJuIGk+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W2krK119fSxlOmZ1bmN0aW9uIGUodCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGMsbD0hMCx1PSExO3JldHVybntzOmZ1bmN0aW9uIHMoKXthPXRbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uIG4oKXt2YXIgdD1hLm5leHQoKTtsPXQuZG9uZTtyZXR1cm4gdH0sZTpmdW5jdGlvbiBlKHQpe3U9ITA7Yz10fSxmOmZ1bmN0aW9uIGYoKXt0cnl7bHx8bnVsbD09YS5yZXR1cm58fGEucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IGN9fX19ZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkodCxyKXsobnVsbD09cnx8cj50Lmxlbmd0aCkmJihyPXQubGVuZ3RoKTtmb3IodmFyIGE9MCxpPW5ldyBBcnJheShyKTthPHI7YSsrKWlbYV09dFthXTtyZXR1cm4gaX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgYz1mdW5jdGlvbigpe2Z1bmN0aW9uIENodW5rZWRTdHJlYW0odCxyLGEpe19jbGFzc0NhbGxDaGVjayh0aGlzLENodW5rZWRTdHJlYW0pO3RoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodCk7dGhpcy5zdGFydD0wO3RoaXMucG9zPTA7dGhpcy5lbmQ9dDt0aGlzLmNodW5rU2l6ZT1yO3RoaXMuX2xvYWRlZENodW5rcz1uZXcgU2V0O3RoaXMubnVtQ2h1bmtzPU1hdGguY2VpbCh0L3IpO3RoaXMubWFuYWdlcj1hO3RoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoPTA7dGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaz0tMX1fY3JlYXRlQ2xhc3MoQ2h1bmtlZFN0cmVhbSxbe2tleToiZ2V0TWlzc2luZ0NodW5rcyIsdmFsdWU6ZnVuY3Rpb24gZ2V0TWlzc2luZ0NodW5rcygpe2Zvcih2YXIgdD1bXSxyPTAsYT10aGlzLm51bUNodW5rcztyPGE7KytyKXRoaXMuX2xvYWRlZENodW5rcy5oYXMocil8fHQucHVzaChyKTtyZXR1cm4gdH19LHtrZXk6ImdldEJhc2VTdHJlYW1zIix2YWx1ZTpmdW5jdGlvbiBnZXRCYXNlU3RyZWFtcygpe3JldHVyblt0aGlzXX19LHtrZXk6ImFsbENodW5rc0xvYWRlZCIsdmFsdWU6ZnVuY3Rpb24gYWxsQ2h1bmtzTG9hZGVkKCl7cmV0dXJuIHRoaXMubnVtQ2h1bmtzTG9hZGVkPT09dGhpcy5udW1DaHVua3N9fSx7a2V5OiJvblJlY2VpdmVEYXRhIix2YWx1ZTpmdW5jdGlvbiBvblJlY2VpdmVEYXRhKHQscil7dmFyIGE9dGhpcy5jaHVua1NpemU7aWYodCVhIT0wKXRocm93IG5ldyBFcnJvcigiQmFkIGJlZ2luIG9mZnNldDogIi5jb25jYXQodCkpO3ZhciBpPXQrci5ieXRlTGVuZ3RoO2lmKGklYSE9MCYmaSE9PXRoaXMuYnl0ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQmFkIGVuZCBvZmZzZXQ6ICIuY29uY2F0KGkpKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShyKSx0KTtmb3IodmFyIG89TWF0aC5mbG9vcih0L2EpLGM9TWF0aC5mbG9vcigoaS0xKS9hKSsxLGw9bztsPGM7KytsKXRoaXMuX2xvYWRlZENodW5rcy5hZGQobCl9fSx7a2V5OiJvblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEiLHZhbHVlOmZ1bmN0aW9uIG9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YSh0KXt2YXIgcj10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCxhPU1hdGguZmxvb3Ioci90aGlzLmNodW5rU2l6ZSk7dGhpcy5ieXRlcy5zZXQobmV3IFVpbnQ4QXJyYXkodCkscik7cis9dC5ieXRlTGVuZ3RoO3RoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoPXI7Zm9yKHZhciBpPXI+PXRoaXMuZW5kP3RoaXMubnVtQ2h1bmtzOk1hdGguZmxvb3Ioci90aGlzLmNodW5rU2l6ZSksbz1hO288aTsrK28pdGhpcy5fbG9hZGVkQ2h1bmtzLmFkZChvKX19LHtrZXk6ImVuc3VyZUJ5dGUiLHZhbHVlOmZ1bmN0aW9uIGVuc3VyZUJ5dGUodCl7aWYoISh0PHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSl7dmFyIHI9TWF0aC5mbG9vcih0L3RoaXMuY2h1bmtTaXplKTtpZihyIT09dGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayl7aWYoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMocikpdGhyb3cgbmV3IG8uTWlzc2luZ0RhdGFFeGNlcHRpb24odCx0KzEpO3RoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bms9cn19fX0se2tleToiZW5zdXJlUmFuZ2UiLHZhbHVlOmZ1bmN0aW9uIGVuc3VyZVJhbmdlKHQscil7aWYoISh0Pj1yfHxyPD10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkpZm9yKHZhciBhPXRoaXMuY2h1bmtTaXplLGk9TWF0aC5mbG9vcih0L2EpLGM9TWF0aC5mbG9vcigoci0xKS9hKSsxLGw9aTtsPGM7KytsKWlmKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGwpKXRocm93IG5ldyBvLk1pc3NpbmdEYXRhRXhjZXB0aW9uKHQscil9fSx7a2V5OiJuZXh0RW1wdHlDaHVuayIsdmFsdWU6ZnVuY3Rpb24gbmV4dEVtcHR5Q2h1bmsodCl7Zm9yKHZhciByPXRoaXMubnVtQ2h1bmtzLGE9MDthPHI7KythKXt2YXIgaT0odCthKSVyO2lmKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGkpKXJldHVybiBpfXJldHVybiBudWxsfX0se2tleToiaGFzQ2h1bmsiLHZhbHVlOmZ1bmN0aW9uIGhhc0NodW5rKHQpe3JldHVybiB0aGlzLl9sb2FkZWRDaHVua3MuaGFzKHQpfX0se2tleToiZ2V0Qnl0ZSIsdmFsdWU6ZnVuY3Rpb24gZ2V0Qnl0ZSgpe3ZhciB0PXRoaXMucG9zO2lmKHQ+PXRoaXMuZW5kKXJldHVybi0xO3Q+PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZUJ5dGUodCk7cmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK119fSx7a2V5OiJnZXRVaW50MTYiLHZhbHVlOmZ1bmN0aW9uIGdldFVpbnQxNigpe3ZhciB0PXRoaXMuZ2V0Qnl0ZSgpLHI9dGhpcy5nZXRCeXRlKCk7cmV0dXJuLTE9PT10fHwtMT09PXI/LTE6KHQ8PDgpK3J9fSx7a2V5OiJnZXRJbnQzMiIsdmFsdWU6ZnVuY3Rpb24gZ2V0SW50MzIoKXtyZXR1cm4odGhpcy5nZXRCeXRlKCk8PDI0KSsodGhpcy5nZXRCeXRlKCk8PDE2KSsodGhpcy5nZXRCeXRlKCk8PDgpK3RoaXMuZ2V0Qnl0ZSgpfX0se2tleToiZ2V0Qnl0ZXMiLHZhbHVlOmZ1bmN0aW9uIGdldEJ5dGVzKHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sYT10aGlzLmJ5dGVzLGk9dGhpcy5wb3Msbz10aGlzLmVuZDtpZighdCl7bz50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZShpLG8pO3ZhciBjPWEuc3ViYXJyYXkoaSxvKTtyZXR1cm4gcj9uZXcgVWludDhDbGFtcGVkQXJyYXkoYyk6Y312YXIgbD1pK3Q7bD5vJiYobD1vKTtsPnRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZVJhbmdlKGksbCk7dGhpcy5wb3M9bDt2YXIgdT1hLnN1YmFycmF5KGksbCk7cmV0dXJuIHI/bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHUpOnV9fSx7a2V5OiJwZWVrQnl0ZSIsdmFsdWU6ZnVuY3Rpb24gcGVla0J5dGUoKXt2YXIgdD10aGlzLmdldEJ5dGUoKTstMSE9PXQmJnRoaXMucG9zLS07cmV0dXJuIHR9fSx7a2V5OiJwZWVrQnl0ZXMiLHZhbHVlOmZ1bmN0aW9uIHBlZWtCeXRlcyh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGE9dGhpcy5nZXRCeXRlcyh0LHIpO3RoaXMucG9zLT1hLmxlbmd0aDtyZXR1cm4gYX19LHtrZXk6ImdldEJ5dGVSYW5nZSIsdmFsdWU6ZnVuY3Rpb24gZ2V0Qnl0ZVJhbmdlKHQscil7dDwwJiYodD0wKTtyPnRoaXMuZW5kJiYocj10aGlzLmVuZCk7cj50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZSh0LHIpO3JldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KHQscil9fSx7a2V5OiJza2lwIix2YWx1ZTpmdW5jdGlvbiBza2lwKHQpe3R8fCh0PTEpO3RoaXMucG9zKz10fX0se2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uIHJlc2V0KCl7dGhpcy5wb3M9dGhpcy5zdGFydH19LHtrZXk6Im1vdmVTdGFydCIsdmFsdWU6ZnVuY3Rpb24gbW92ZVN0YXJ0KCl7dGhpcy5zdGFydD10aGlzLnBvc319LHtrZXk6Im1ha2VTdWJTdHJlYW0iLHZhbHVlOmZ1bmN0aW9uIG1ha2VTdWJTdHJlYW0odCxyLGEpe3I/dCtyPnRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZVJhbmdlKHQsdCtyKTp0Pj10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVCeXRlKHQpO2Z1bmN0aW9uIENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKXt9Q2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0aGlzKTtDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5nZXRNaXNzaW5nQ2h1bmtzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuY2h1bmtTaXplLHI9TWF0aC5mbG9vcih0aGlzLnN0YXJ0L3QpLGE9TWF0aC5mbG9vcigodGhpcy5lbmQtMSkvdCkrMSxpPVtdLG89cjtvPGE7KytvKXRoaXMuX2xvYWRlZENodW5rcy5oYXMobyl8fGkucHVzaChvKTtyZXR1cm4gaX07Q2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUuYWxsQ2h1bmtzTG9hZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtQ2h1bmtzTG9hZGVkPT09dGhpcy5udW1DaHVua3N8fDA9PT10aGlzLmdldE1pc3NpbmdDaHVua3MoKS5sZW5ndGh9O3ZhciBpPW5ldyBDaHVua2VkU3RyZWFtU3Vic3RyZWFtO2kucG9zPWkuc3RhcnQ9dDtpLmVuZD10K3J8fHRoaXMuZW5kO2kuZGljdD1hO3JldHVybiBpfX0se2tleToibnVtQ2h1bmtzTG9hZGVkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5zaXplfX0se2tleToibGVuZ3RoIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZW5kLXRoaXMuc3RhcnR9fSx7a2V5OiJpc0VtcHR5IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDA9PT10aGlzLmxlbmd0aH19XSk7cmV0dXJuIENodW5rZWRTdHJlYW19KCk7ci5DaHVua2VkU3RyZWFtPWM7dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBDaHVua2VkU3RyZWFtTWFuYWdlcih0LHIpe19jbGFzc0NhbGxDaGVjayh0aGlzLENodW5rZWRTdHJlYW1NYW5hZ2VyKTt0aGlzLmxlbmd0aD1yLmxlbmd0aDt0aGlzLmNodW5rU2l6ZT1yLnJhbmdlQ2h1bmtTaXplO3RoaXMuc3RyZWFtPW5ldyBjKHRoaXMubGVuZ3RoLHRoaXMuY2h1bmtTaXplLHRoaXMpO3RoaXMucGRmTmV0d29ya1N0cmVhbT10O3RoaXMuZGlzYWJsZUF1dG9GZXRjaD1yLmRpc2FibGVBdXRvRmV0Y2g7dGhpcy5tc2dIYW5kbGVyPXIubXNnSGFuZGxlcjt0aGlzLmN1cnJSZXF1ZXN0SWQ9MDt0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Q9bmV3IE1hcDt0aGlzLl9yZXF1ZXN0c0J5Q2h1bms9bmV3IE1hcDt0aGlzLl9wcm9taXNlc0J5UmVxdWVzdD1uZXcgTWFwO3RoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoPTA7dGhpcy5hYm9ydGVkPSExO3RoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHk9KDAsaS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKX1fY3JlYXRlQ2xhc3MoQ2h1bmtlZFN0cmVhbU1hbmFnZXIsW3trZXk6Im9uTG9hZGVkU3RyZWFtIix2YWx1ZTpmdW5jdGlvbiBvbkxvYWRlZFN0cmVhbSgpe3JldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2V9fSx7a2V5OiJzZW5kUmVxdWVzdCIsdmFsdWU6ZnVuY3Rpb24gc2VuZFJlcXVlc3QodCxyKXt2YXIgYT10aGlzLG89dGhpcy5wZGZOZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKHQscik7by5pc1N0cmVhbWluZ1N1cHBvcnRlZHx8KG8ub25Qcm9ncmVzcz10aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzKSk7dmFyIGM9W10sbD0wO25ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe28ucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIHJlYWRDaHVuayh1KXt0cnl7aWYoIXUuZG9uZSl7dmFyIGg9dS52YWx1ZTtjLnB1c2goaCk7bCs9KDAsaS5hcnJheUJ5dGVMZW5ndGgpKGgpO28uaXNTdHJlYW1pbmdTdXBwb3J0ZWQmJmEub25Qcm9ncmVzcyh7bG9hZGVkOmx9KTtvLnJlYWQoKS50aGVuKHJlYWRDaHVuayxyKTtyZXR1cm59dmFyIGQ9KDAsaS5hcnJheXNUb0J5dGVzKShjKTtjPW51bGw7dChkKX1jYXRjaCh0KXtyKHQpfX0pLHIpfSkpLnRoZW4oKGZ1bmN0aW9uKHIpe2EuYWJvcnRlZHx8YS5vblJlY2VpdmVEYXRhKHtjaHVuazpyLGJlZ2luOnR9KX0pKX19LHtrZXk6InJlcXVlc3RBbGxDaHVua3MiLHZhbHVlOmZ1bmN0aW9uIHJlcXVlc3RBbGxDaHVua3MoKXt2YXIgdD10aGlzLnN0cmVhbS5nZXRNaXNzaW5nQ2h1bmtzKCk7dGhpcy5fcmVxdWVzdENodW5rcyh0KTtyZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5wcm9taXNlfX0se2tleToiX3JlcXVlc3RDaHVua3MiLHZhbHVlOmZ1bmN0aW9uIF9yZXF1ZXN0Q2h1bmtzKHQpe3ZhciByPXRoaXMsYT10aGlzLmN1cnJSZXF1ZXN0SWQrKyxvPW5ldyBTZXQ7dGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0LnNldChhLG8pO3ZhciBjLGw9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCk7dHJ5e2ZvcihsLnMoKTshKGM9bC5uKCkpLmRvbmU7KXt2YXIgdT1jLnZhbHVlO3RoaXMuc3RyZWFtLmhhc0NodW5rKHUpfHxvLmFkZCh1KX19Y2F0Y2godCl7bC5lKHQpfWZpbmFsbHl7bC5mKCl9aWYoMD09PW8uc2l6ZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIGg9KDAsaS5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTt0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5zZXQoYSxoKTt2YXIgZCxwPVtdLG09X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobyk7dHJ5e2ZvcihtLnMoKTshKGQ9bS5uKCkpLmRvbmU7KXt2YXIgZz1kLnZhbHVlLHk9dGhpcy5fcmVxdWVzdHNCeUNodW5rLmdldChnKTtpZigheSl7eT1bXTt0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuc2V0KGcseSk7cC5wdXNoKGcpfXkucHVzaChhKX19Y2F0Y2godCl7bS5lKHQpfWZpbmFsbHl7bS5mKCl9aWYocC5sZW5ndGg+MCl7dmFyIGIsdj1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmdyb3VwQ2h1bmtzKHApKTt0cnl7Zm9yKHYucygpOyEoYj12Lm4oKSkuZG9uZTspe3ZhciBTPWIudmFsdWUsaz1TLmJlZ2luQ2h1bmsqdGhpcy5jaHVua1NpemUsdz1NYXRoLm1pbihTLmVuZENodW5rKnRoaXMuY2h1bmtTaXplLHRoaXMubGVuZ3RoKTt0aGlzLnNlbmRSZXF1ZXN0KGssdyl9fWNhdGNoKHQpe3YuZSh0KX1maW5hbGx5e3YuZigpfX1yZXR1cm4gaC5wcm9taXNlLmNhdGNoKChmdW5jdGlvbih0KXtpZighci5hYm9ydGVkKXRocm93IHR9KSl9fSx7a2V5OiJnZXRTdHJlYW0iLHZhbHVlOmZ1bmN0aW9uIGdldFN0cmVhbSgpe3JldHVybiB0aGlzLnN0cmVhbX19LHtrZXk6InJlcXVlc3RSYW5nZSIsdmFsdWU6ZnVuY3Rpb24gcmVxdWVzdFJhbmdlKHQscil7cj1NYXRoLm1pbihyLHRoaXMubGVuZ3RoKTtmb3IodmFyIGE9dGhpcy5nZXRCZWdpbkNodW5rKHQpLGk9dGhpcy5nZXRFbmRDaHVuayhyKSxvPVtdLGM9YTtjPGk7KytjKW8ucHVzaChjKTtyZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhvKX19LHtrZXk6InJlcXVlc3RSYW5nZXMiLHZhbHVlOmZ1bmN0aW9uIHJlcXVlc3RSYW5nZXMoKXt2YXIgdCxyPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxhPVtdLGk9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocik7dHJ5e2ZvcihpLnMoKTshKHQ9aS5uKCkpLmRvbmU7KWZvcih2YXIgbz10LnZhbHVlLGM9dGhpcy5nZXRCZWdpbkNodW5rKG8uYmVnaW4pLGw9dGhpcy5nZXRFbmRDaHVuayhvLmVuZCksdT1jO3U8bDsrK3UpYS5pbmNsdWRlcyh1KXx8YS5wdXNoKHUpfWNhdGNoKHQpe2kuZSh0KX1maW5hbGx5e2kuZigpfWEuc29ydCgoZnVuY3Rpb24odCxyKXtyZXR1cm4gdC1yfSkpO3JldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGEpfX0se2tleToiZ3JvdXBDaHVua3MiLHZhbHVlOmZ1bmN0aW9uIGdyb3VwQ2h1bmtzKHQpe2Zvcih2YXIgcj1bXSxhPS0xLGk9LTEsbz0wLGM9dC5sZW5ndGg7bzxjOysrbyl7dmFyIGw9dFtvXTthPDAmJihhPWwpO2lmKGk+PTAmJmkrMSE9PWwpe3IucHVzaCh7YmVnaW5DaHVuazphLGVuZENodW5rOmkrMX0pO2E9bH1vKzE9PT10Lmxlbmd0aCYmci5wdXNoKHtiZWdpbkNodW5rOmEsZW5kQ2h1bms6bCsxfSk7aT1sfXJldHVybiByfX0se2tleToib25Qcm9ncmVzcyIsdmFsdWU6ZnVuY3Rpb24gb25Qcm9ncmVzcyh0KXt0aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLHtsb2FkZWQ6dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKnRoaXMuY2h1bmtTaXplK3QubG9hZGVkLHRvdGFsOnRoaXMubGVuZ3RofSl9fSx7a2V5OiJvblJlY2VpdmVEYXRhIix2YWx1ZTpmdW5jdGlvbiBvblJlY2VpdmVEYXRhKHQpe3ZhciByPXQuY2h1bmssYT12b2lkIDA9PT10LmJlZ2luLGk9YT90aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aDp0LmJlZ2luLG89aStyLmJ5dGVMZW5ndGgsYz1NYXRoLmZsb29yKGkvdGhpcy5jaHVua1NpemUpLGw9bzx0aGlzLmxlbmd0aD9NYXRoLmZsb29yKG8vdGhpcy5jaHVua1NpemUpOk1hdGguY2VpbChvL3RoaXMuY2h1bmtTaXplKTtpZihhKXt0aGlzLnN0cmVhbS5vblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEocik7dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg9b31lbHNlIHRoaXMuc3RyZWFtLm9uUmVjZWl2ZURhdGEoaSxyKTt0aGlzLnN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSYmdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5yZXNvbHZlKHRoaXMuc3RyZWFtKTtmb3IodmFyIHU9W10saD1jO2g8bDsrK2gpe3ZhciBkPXRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoaCk7aWYoZCl7dGhpcy5fcmVxdWVzdHNCeUNodW5rLmRlbGV0ZShoKTt2YXIgcCxtPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGQpO3RyeXtmb3IobS5zKCk7IShwPW0ubigpKS5kb25lOyl7dmFyIGc9cC52YWx1ZSx5PXRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdC5nZXQoZyk7eS5oYXMoaCkmJnkuZGVsZXRlKGgpO3kuc2l6ZT4wfHx1LnB1c2goZyl9fWNhdGNoKHQpe20uZSh0KX1maW5hbGx5e20uZigpfX19aWYoIXRoaXMuZGlzYWJsZUF1dG9GZXRjaCYmMD09PXRoaXMuX3JlcXVlc3RzQnlDaHVuay5zaXplKXt2YXIgYjtpZigxPT09dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKXt2YXIgdj10aGlzLnN0cmVhbS5udW1DaHVua3MtMTt0aGlzLnN0cmVhbS5oYXNDaHVuayh2KXx8KGI9dil9ZWxzZSBiPXRoaXMuc3RyZWFtLm5leHRFbXB0eUNodW5rKGwpO051bWJlci5pc0ludGVnZXIoYikmJnRoaXMuX3JlcXVlc3RDaHVua3MoW2JdKX1mb3IodmFyIFM9MCxrPXU7UzxrLmxlbmd0aDtTKyspe3ZhciB3PWtbU10sQz10aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5nZXQodyk7dGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZGVsZXRlKHcpO0MucmVzb2x2ZSgpfXRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIse2xvYWRlZDp0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQqdGhpcy5jaHVua1NpemUsdG90YWw6dGhpcy5sZW5ndGh9KX19LHtrZXk6Im9uRXJyb3IiLHZhbHVlOmZ1bmN0aW9uIG9uRXJyb3IodCl7dGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5yZWplY3QodCl9fSx7a2V5OiJnZXRCZWdpbkNodW5rIix2YWx1ZTpmdW5jdGlvbiBnZXRCZWdpbkNodW5rKHQpe3JldHVybiBNYXRoLmZsb29yKHQvdGhpcy5jaHVua1NpemUpfX0se2tleToiZ2V0RW5kQ2h1bmsiLHZhbHVlOmZ1bmN0aW9uIGdldEVuZENodW5rKHQpe3JldHVybiBNYXRoLmZsb29yKCh0LTEpL3RoaXMuY2h1bmtTaXplKSsxfX0se2tleToiYWJvcnQiLHZhbHVlOmZ1bmN0aW9uIGFib3J0KHQpe3RoaXMuYWJvcnRlZD0hMDt0aGlzLnBkZk5ldHdvcmtTdHJlYW0mJnRoaXMucGRmTmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyh0KTt2YXIgcixhPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LnZhbHVlcygpKTt0cnl7Zm9yKGEucygpOyEocj1hLm4oKSkuZG9uZTspe3IudmFsdWUucmVqZWN0KHQpfX1jYXRjaCh0KXthLmUodCl9ZmluYWxseXthLmYoKX19fV0pO3JldHVybiBDaHVua2VkU3RyZWFtTWFuYWdlcn0oKTtyLkNodW5rZWRTdHJlYW1NYW5hZ2VyPWx9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuZ2V0TG9va3VwVGFibGVGYWN0b3J5PWZ1bmN0aW9uIGdldExvb2t1cFRhYmxlRmFjdG9yeSh0KXt2YXIgcjtyZXR1cm4gZnVuY3Rpb24oKXtpZih0KXtyPU9iamVjdC5jcmVhdGUobnVsbCk7dChyKTt0PW51bGx9cmV0dXJuIHJ9fTtyLmdldEluaGVyaXRhYmxlUHJvcGVydHk9ZnVuY3Rpb24gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh0KXt2YXIgcixhPXQuZGljdCxvPXQua2V5LGM9dC5nZXRBcnJheSxsPXZvaWQgMCE9PWMmJmMsdT10LnN0b3BXaGVuRm91bmQsaD12b2lkIDA9PT11fHx1LGQ9MDtmb3IoO2E7KXt2YXIgcD1sP2EuZ2V0QXJyYXkobyk6YS5nZXQobyk7aWYodm9pZCAwIT09cCl7aWYoaClyZXR1cm4gcDtyfHwocj1bXSk7ci5wdXNoKHApfWlmKCsrZD4xMDApeygwLGkud2FybikoJ2dldEluaGVyaXRhYmxlUHJvcGVydHk6IG1heGltdW0gbG9vcCBjb3VudCBleGNlZWRlZCBmb3IgIicuY29uY2F0KG8sJyInKSk7YnJlYWt9YT1hLmdldCgiUGFyZW50Iil9cmV0dXJuIHJ9O3IudG9Sb21hbk51bWVyYWxzPWZ1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdOygwLGkuYXNzZXJ0KShOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0PjAsIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4iKTt2YXIgYSxvPVtdO2Zvcig7dD49MWUzOyl7dC09MWUzO28ucHVzaCgiTSIpfWE9dC8xMDB8MDt0JT0xMDA7by5wdXNoKHVbYV0pO2E9dC8xMHwwO3QlPTEwO28ucHVzaCh1WzEwK2FdKTtvLnB1c2godVsyMCt0XSk7dmFyIGM9by5qb2luKCIiKTtyZXR1cm4gcj9jLnRvTG93ZXJDYXNlKCk6Y307ci5sb2cyPWZ1bmN0aW9uIGxvZzIodCl7aWYodDw9MClyZXR1cm4gMDtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nMih0KSl9O3IucmVhZEludDg9ZnVuY3Rpb24gcmVhZEludDgodCxyKXtyZXR1cm4gdFtyXTw8MjQ+PjI0fTtyLnJlYWRVaW50MTY9ZnVuY3Rpb24gcmVhZFVpbnQxNih0LHIpe3JldHVybiB0W3JdPDw4fHRbcisxXX07ci5yZWFkVWludDMyPWZ1bmN0aW9uIHJlYWRVaW50MzIodCxyKXtyZXR1cm4odFtyXTw8MjR8dFtyKzFdPDwxNnx0W3IrMl08PDh8dFtyKzNdKT4+PjB9O3IuaXNXaGl0ZVNwYWNlPWZ1bmN0aW9uIGlzV2hpdGVTcGFjZSh0KXtyZXR1cm4gMzI9PT10fHw5PT09dHx8MTM9PT10fHwxMD09PXR9O3IuWFJlZlBhcnNlRXhjZXB0aW9uPXIuWFJlZkVudHJ5RXhjZXB0aW9uPXIuTWlzc2luZ0RhdGFFeGNlcHRpb249dm9pZCAwO3ZhciBpPWEoNSk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX12YXIgbz1mdW5jdGlvbih0KXtfaW5oZXJpdHMoTWlzc2luZ0RhdGFFeGNlcHRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKE1pc3NpbmdEYXRhRXhjZXB0aW9uKTtmdW5jdGlvbiBNaXNzaW5nRGF0YUV4Y2VwdGlvbih0LGEpe3ZhciBpO19jbGFzc0NhbGxDaGVjayh0aGlzLE1pc3NpbmdEYXRhRXhjZXB0aW9uKTsoaT1yLmNhbGwodGhpcywiTWlzc2luZyBkYXRhIFsiLmNvbmNhdCh0LCIsICIpLmNvbmNhdChhLCIpIikpKS5iZWdpbj10O2kuZW5kPWE7cmV0dXJuIGl9cmV0dXJuIE1pc3NpbmdEYXRhRXhjZXB0aW9ufShpLkJhc2VFeGNlcHRpb24pO3IuTWlzc2luZ0RhdGFFeGNlcHRpb249bzt2YXIgYz1mdW5jdGlvbih0KXtfaW5oZXJpdHMoWFJlZkVudHJ5RXhjZXB0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihYUmVmRW50cnlFeGNlcHRpb24pO2Z1bmN0aW9uIFhSZWZFbnRyeUV4Y2VwdGlvbigpe19jbGFzc0NhbGxDaGVjayh0aGlzLFhSZWZFbnRyeUV4Y2VwdGlvbik7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBYUmVmRW50cnlFeGNlcHRpb259KGkuQmFzZUV4Y2VwdGlvbik7ci5YUmVmRW50cnlFeGNlcHRpb249Yzt2YXIgbD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoWFJlZlBhcnNlRXhjZXB0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihYUmVmUGFyc2VFeGNlcHRpb24pO2Z1bmN0aW9uIFhSZWZQYXJzZUV4Y2VwdGlvbigpe19jbGFzc0NhbGxDaGVjayh0aGlzLFhSZWZQYXJzZUV4Y2VwdGlvbik7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBYUmVmUGFyc2VFeGNlcHRpb259KGkuQmFzZUV4Y2VwdGlvbik7ci5YUmVmUGFyc2VFeGNlcHRpb249bDt2YXIgdT1bIiIsIkMiLCJDQyIsIkNDQyIsIkNEIiwiRCIsIkRDIiwiRENDIiwiRENDQyIsIkNNIiwiIiwiWCIsIlhYIiwiWFhYIiwiWEwiLCJMIiwiTFgiLCJMWFgiLCJMWFhYIiwiWEMiLCIiLCJJIiwiSUkiLCJJSUkiLCJJViIsIlYiLCJWSSIsIlZJSSIsIlZJSUkiLCJJWCJdfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBERkRvY3VtZW50PXIuUGFnZT12b2lkIDA7dmFyIGk9ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KGEoMikpLG89YSg1KSxjPWEoMjA3KSxsPWEoMjAyKSx1PWEoMjA1KSxoPWEoMjA5KSxkPWEoMjIyKSxwPWEoMjE5KSxtPWEoMjA4KSxnPWEoMjIzKSx5PWEoMjI1KTtmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxyLGEsaSxvLGMsbCl7dHJ5e3ZhciB1PXRbY10obCksaD11LnZhbHVlfWNhdGNoKHQpe2EodCk7cmV0dXJufXUuZG9uZT9yKGgpOlByb21pc2UucmVzb2x2ZShoKS50aGVuKGksbyl9ZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksbyl7dmFyIGM9dC5hcHBseShyLGEpO2Z1bmN0aW9uIF9uZXh0KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChjLGksbyxfbmV4dCxfdGhyb3csIm5leHQiLHQpfWZ1bmN0aW9uIF90aHJvdyh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJ0aHJvdyIsdCl9X25leHQodm9pZCAwKX0pKX19ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfc2xpY2VkVG9BcnJheSh0LHIpe3JldHVybiBmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXModCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH0odCl8fGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdCh0LHIpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpKXJldHVybjt2YXIgYT1bXSxpPSEwLG89ITEsYz12b2lkIDA7dHJ5e2Zvcih2YXIgbCx1PXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEoaT0obD11Lm5leHQoKSkuZG9uZSk7aT0hMCl7YS5wdXNoKGwudmFsdWUpO2lmKHImJmEubGVuZ3RoPT09cilicmVha319Y2F0Y2godCl7bz0hMDtjPXR9ZmluYWxseXt0cnl7aXx8bnVsbD09dS5yZXR1cm58fHUucmV0dXJuKCl9ZmluYWxseXtpZihvKXRocm93IGN9fXJldHVybiBhfSh0LHIpfHxfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXx8ZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCxyKXt2YXIgYTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwoYT1fdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCkpfHxyJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXthJiYodD1hKTt2YXIgaT0wLG89ZnVuY3Rpb24gRigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uIG4oKXtyZXR1cm4gaT49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbaSsrXX19LGU6ZnVuY3Rpb24gZSh0KXt0aHJvdyB0fSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgYyxsPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24gcygpe2E9dFtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24gbigpe3ZhciB0PWEubmV4dCgpO2w9dC5kb25lO3JldHVybiB0fSxlOmZ1bmN0aW9uIGUodCl7dT0hMDtjPXR9LGY6ZnVuY3Rpb24gZigpe3RyeXtsfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgY319fX1mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscik7dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpOyJPYmplY3QiPT09YSYmdC5jb25zdHJ1Y3RvciYmKGE9dC5jb25zdHJ1Y3Rvci5uYW1lKTtyZXR1cm4iTWFwIj09PWF8fCJTZXQiPT09YT9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSk/X2FycmF5TGlrZVRvQXJyYXkodCxyKTp2b2lkIDB9fWZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHQscil7KG51bGw9PXJ8fHI+dC5sZW5ndGgpJiYocj10Lmxlbmd0aCk7Zm9yKHZhciBhPTAsaT1uZXcgQXJyYXkocik7YTxyO2ErKylpW2FdPXRbYV07cmV0dXJuIGl9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgYj1bMCwwLDYxMiw3OTJdO2Z1bmN0aW9uIGlzQW5ub3RhdGlvblJlbmRlcmFibGUodCxyKXtyZXR1cm4iZGlzcGxheSI9PT1yJiZ0LnZpZXdhYmxlfHwicHJpbnQiPT09ciYmdC5wcmludGFibGV9dmFyIHY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQYWdlKHQpe3ZhciByPXQucGRmTWFuYWdlcixhPXQueHJlZixpPXQucGFnZUluZGV4LG89dC5wYWdlRGljdCxjPXQucmVmLGw9dC5nbG9iYWxJZEZhY3RvcnksdT10LmZvbnRDYWNoZSxoPXQuYnVpbHRJbkNNYXBDYWNoZSxkPXQuZ2xvYmFsSW1hZ2VDYWNoZTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQYWdlKTt0aGlzLnBkZk1hbmFnZXI9cjt0aGlzLnBhZ2VJbmRleD1pO3RoaXMucGFnZURpY3Q9bzt0aGlzLnhyZWY9YTt0aGlzLnJlZj1jO3RoaXMuZm9udENhY2hlPXU7dGhpcy5idWlsdEluQ01hcENhY2hlPWg7dGhpcy5nbG9iYWxJbWFnZUNhY2hlPWQ7dGhpcy5ldmFsdWF0b3JPcHRpb25zPXIuZXZhbHVhdG9yT3B0aW9uczt0aGlzLnJlc291cmNlc1Byb21pc2U9bnVsbDt2YXIgcD17b2JqOjB9O3RoaXMuX2xvY2FsSWRGYWN0b3J5PWZ1bmN0aW9uKHQpeyFmdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9KF9jbGFzcyx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoX2NsYXNzKTtmdW5jdGlvbiBfY2xhc3MoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxfY2xhc3MpO3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1fY3JlYXRlQ2xhc3MoX2NsYXNzLG51bGwsW3trZXk6ImNyZWF0ZU9iaklkIix2YWx1ZTpmdW5jdGlvbiBjcmVhdGVPYmpJZCgpe3JldHVybiJwIi5jb25jYXQoaSwiXyIpLmNvbmNhdCgrK3Aub2JqKX19XSk7cmV0dXJuIF9jbGFzc30obCl9X2NyZWF0ZUNsYXNzKFBhZ2UsW3trZXk6Il9nZXRJbmhlcml0YWJsZVByb3BlcnR5Iix2YWx1ZTpmdW5jdGlvbiBfZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGE9KDAsdS5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDp0aGlzLnBhZ2VEaWN0LGtleTp0LGdldEFycmF5OnIsc3RvcFdoZW5Gb3VuZDohMX0pO3JldHVybiBBcnJheS5pc0FycmF5KGEpPzEhPT1hLmxlbmd0aCYmKDAsbC5pc0RpY3QpKGFbMF0pP2wuRGljdC5tZXJnZSh7eHJlZjp0aGlzLnhyZWYsZGljdEFycmF5OmF9KTphWzBdOmF9fSx7a2V5OiJfZ2V0Qm91bmRpbmdCb3giLHZhbHVlOmZ1bmN0aW9uIF9nZXRCb3VuZGluZ0JveCh0KXt2YXIgcj10aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KHQsITApO2lmKEFycmF5LmlzQXJyYXkocikmJjQ9PT1yLmxlbmd0aCl7aWYoclsyXS1yWzBdIT0wJiZyWzNdLXJbMV0hPTApcmV0dXJuIHI7KDAsby53YXJuKSgiRW1wdHkgLyIuY29uY2F0KHQsIiBlbnRyeS4iKSl9cmV0dXJuIG51bGx9fSx7a2V5OiJnZXRDb250ZW50U3RyZWFtIix2YWx1ZTpmdW5jdGlvbiBnZXRDb250ZW50U3RyZWFtKCl7dmFyIHQscj10aGlzLmNvbnRlbnQ7aWYoQXJyYXkuaXNBcnJheShyKSl7dmFyIGEsaT10aGlzLnhyZWYsbz1bXSxjPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHIpO3RyeXtmb3IoYy5zKCk7IShhPWMubigpKS5kb25lOyl7dmFyIHU9YS52YWx1ZTtvLnB1c2goaS5mZXRjaElmUmVmKHUpKX19Y2F0Y2godCl7Yy5lKHQpfWZpbmFsbHl7Yy5mKCl9dD1uZXcgaC5TdHJlYW1zU2VxdWVuY2VTdHJlYW0obyl9ZWxzZSB0PSgwLGwuaXNTdHJlYW0pKHIpP3I6bmV3IGguTnVsbFN0cmVhbTtyZXR1cm4gdH19LHtrZXk6InNhdmUiLHZhbHVlOmZ1bmN0aW9uIHNhdmUodCxyLGEpe3ZhciBpPW5ldyB5LlBhcnRpYWxFdmFsdWF0b3Ioe3hyZWY6dGhpcy54cmVmLGhhbmRsZXI6dCxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgsaWRGYWN0b3J5OnRoaXMuX2xvY2FsSWRGYWN0b3J5LGZvbnRDYWNoZTp0aGlzLmZvbnRDYWNoZSxidWlsdEluQ01hcENhY2hlOnRoaXMuYnVpbHRJbkNNYXBDYWNoZSxnbG9iYWxJbWFnZUNhY2hlOnRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pO3JldHVybiB0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucy50aGVuKChmdW5jdGlvbih0KXt2YXIgYyxsPVtdLHU9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCk7dHJ5e2Zvcih1LnMoKTshKGM9dS5uKCkpLmRvbmU7KXt2YXIgaD1jLnZhbHVlO2lzQW5ub3RhdGlvblJlbmRlcmFibGUoaCwicHJpbnQiKSYmbC5wdXNoKGguc2F2ZShpLHIsYSkuY2F0Y2goKGZ1bmN0aW9uKHQpeygwLG8ud2FybikoInNhdmUgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIrJyInLmNvbmNhdChyLm5hbWUsJyIgdGFzazogIicpLmNvbmNhdCh0LCciLicpKTtyZXR1cm4gbnVsbH0pKSl9fWNhdGNoKHQpe3UuZSh0KX1maW5hbGx5e3UuZigpfXJldHVybiBQcm9taXNlLmFsbChsKX0pKX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uIGxvYWRSZXNvdXJjZXModCl7dmFyIHI9dGhpczt0aGlzLnJlc291cmNlc1Byb21pc2V8fCh0aGlzLnJlc291cmNlc1Byb21pc2U9dGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCJyZXNvdXJjZXMiKSk7cmV0dXJuIHRoaXMucmVzb3VyY2VzUHJvbWlzZS50aGVuKChmdW5jdGlvbigpe3JldHVybiBuZXcgYy5PYmplY3RMb2FkZXIoci5yZXNvdXJjZXMsdCxyLnhyZWYpLmxvYWQoKX0pKX19LHtrZXk6ImdldE9wZXJhdG9yTGlzdCIsdmFsdWU6ZnVuY3Rpb24gZ2V0T3BlcmF0b3JMaXN0KHQpe3ZhciByPXRoaXMsYT10LmhhbmRsZXIsaT10LnNpbmssYz10LnRhc2ssbD10LmludGVudCx1PXQucmVuZGVySW50ZXJhY3RpdmVGb3JtcyxoPXQuYW5ub3RhdGlvblN0b3JhZ2UsZD10aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsImdldENvbnRlbnRTdHJlYW0iKSxwPXRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsIkNvbG9yU3BhY2UiLCJQYXR0ZXJuIiwiU2hhZGluZyIsIlhPYmplY3QiLCJGb250Il0pLG09bmV3IHkuUGFydGlhbEV2YWx1YXRvcih7eHJlZjp0aGlzLnhyZWYsaGFuZGxlcjphLHBhZ2VJbmRleDp0aGlzLnBhZ2VJbmRleCxpZEZhY3Rvcnk6dGhpcy5fbG9jYWxJZEZhY3RvcnksZm9udENhY2hlOnRoaXMuZm9udENhY2hlLGJ1aWx0SW5DTWFwQ2FjaGU6dGhpcy5idWlsdEluQ01hcENhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLG9wdGlvbnM6dGhpcy5ldmFsdWF0b3JPcHRpb25zfSksYj1Qcm9taXNlLmFsbChbZCxwXSkudGhlbigoZnVuY3Rpb24odCl7dmFyIG89X3NsaWNlZFRvQXJyYXkodCwxKVswXSx1PW5ldyBnLk9wZXJhdG9yTGlzdChsLGkpO2Euc2VuZCgiU3RhcnRSZW5kZXJQYWdlIix7dHJhbnNwYXJlbmN5Om0uaGFzQmxlbmRNb2RlcyhyLnJlc291cmNlcykscGFnZUluZGV4OnIucGFnZUluZGV4LGludGVudDpsfSk7cmV0dXJuIG0uZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06byx0YXNrOmMscmVzb3VyY2VzOnIucmVzb3VyY2VzLG9wZXJhdG9yTGlzdDp1fSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKX0pKTtyZXR1cm4gUHJvbWlzZS5hbGwoW2IsdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnNdKS50aGVuKChmdW5jdGlvbih0KXt2YXIgcj1fc2xpY2VkVG9BcnJheSh0LDIpLGE9clswXSxpPXJbMV07aWYoMD09PWkubGVuZ3RoKXthLmZsdXNoKCEwKTtyZXR1cm57bGVuZ3RoOmEudG90YWxMZW5ndGh9fXZhciBkLHA9W10sZz1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpKTt0cnl7Zm9yKGcucygpOyEoZD1nLm4oKSkuZG9uZTspe3ZhciB5PWQudmFsdWU7aXNBbm5vdGF0aW9uUmVuZGVyYWJsZSh5LGwpJiZwLnB1c2goeS5nZXRPcGVyYXRvckxpc3QobSxjLHUsaCkuY2F0Y2goKGZ1bmN0aW9uKHQpeygwLG8ud2FybikoImdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGFubm90YXRpb24gZGF0YSBkdXJpbmcgIisnIicuY29uY2F0KGMubmFtZSwnIiB0YXNrOiAiJykuY29uY2F0KHQsJyIuJykpO3JldHVybiBudWxsfSkpKX19Y2F0Y2godCl7Zy5lKHQpfWZpbmFsbHl7Zy5mKCl9cmV0dXJuIFByb21pc2UuYWxsKHApLnRoZW4oKGZ1bmN0aW9uKHQpe2EuYWRkT3Aoby5PUFMuYmVnaW5Bbm5vdGF0aW9ucyxbXSk7dmFyIHIsaT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0KTt0cnl7Zm9yKGkucygpOyEocj1pLm4oKSkuZG9uZTspe3ZhciBjPXIudmFsdWU7YS5hZGRPcExpc3QoYyl9fWNhdGNoKHQpe2kuZSh0KX1maW5hbGx5e2kuZigpfWEuYWRkT3Aoby5PUFMuZW5kQW5ub3RhdGlvbnMsW10pO2EuZmx1c2goITApO3JldHVybntsZW5ndGg6YS50b3RhbExlbmd0aH19KSl9KSl9fSx7a2V5OiJleHRyYWN0VGV4dENvbnRlbnQiLHZhbHVlOmZ1bmN0aW9uIGV4dHJhY3RUZXh0Q29udGVudCh0KXt2YXIgcj10aGlzLGE9dC5oYW5kbGVyLGk9dC50YXNrLG89dC5ub3JtYWxpemVXaGl0ZXNwYWNlLGM9dC5zaW5rLGw9dC5jb21iaW5lVGV4dEl0ZW1zLHU9dGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCJnZXRDb250ZW50U3RyZWFtIiksaD10aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCJYT2JqZWN0IiwiRm9udCJdKTtyZXR1cm4gUHJvbWlzZS5hbGwoW3UsaF0pLnRoZW4oKGZ1bmN0aW9uKHQpe3ZhciB1PV9zbGljZWRUb0FycmF5KHQsMSlbMF07cmV0dXJuIG5ldyB5LlBhcnRpYWxFdmFsdWF0b3Ioe3hyZWY6ci54cmVmLGhhbmRsZXI6YSxwYWdlSW5kZXg6ci5wYWdlSW5kZXgsaWRGYWN0b3J5OnIuX2xvY2FsSWRGYWN0b3J5LGZvbnRDYWNoZTpyLmZvbnRDYWNoZSxidWlsdEluQ01hcENhY2hlOnIuYnVpbHRJbkNNYXBDYWNoZSxnbG9iYWxJbWFnZUNhY2hlOnIuZ2xvYmFsSW1hZ2VDYWNoZSxvcHRpb25zOnIuZXZhbHVhdG9yT3B0aW9uc30pLmdldFRleHRDb250ZW50KHtzdHJlYW06dSx0YXNrOmkscmVzb3VyY2VzOnIucmVzb3VyY2VzLG5vcm1hbGl6ZVdoaXRlc3BhY2U6byxjb21iaW5lVGV4dEl0ZW1zOmwsc2luazpjfSl9KSl9fSx7a2V5OiJnZXRBbm5vdGF0aW9uc0RhdGEiLHZhbHVlOmZ1bmN0aW9uIGdldEFubm90YXRpb25zRGF0YSh0KXtyZXR1cm4gdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMudGhlbigoZnVuY3Rpb24ocil7Zm9yKHZhciBhPVtdLGk9MCxvPXIubGVuZ3RoO2k8bztpKyspdCYmIWlzQW5ub3RhdGlvblJlbmRlcmFibGUocltpXSx0KXx8YS5wdXNoKHJbaV0uZGF0YSk7cmV0dXJuIGF9KSl9fSx7a2V5OiJjb250ZW50IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucGFnZURpY3QuZ2V0KCJDb250ZW50cyIpfX0se2tleToicmVzb3VyY2VzIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsInJlc291cmNlcyIsdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiUmVzb3VyY2VzIil8fGwuRGljdC5lbXB0eSl9fSx7a2V5OiJtZWRpYUJveCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJtZWRpYUJveCIsdGhpcy5fZ2V0Qm91bmRpbmdCb3goIk1lZGlhQm94Iil8fGIpfX0se2tleToiY3JvcEJveCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJjcm9wQm94Iix0aGlzLl9nZXRCb3VuZGluZ0JveCgiQ3JvcEJveCIpfHx0aGlzLm1lZGlhQm94KX19LHtrZXk6InVzZXJVbml0IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9dGhpcy5wYWdlRGljdC5nZXQoIlVzZXJVbml0Iik7KCEoMCxvLmlzTnVtKSh0KXx8dDw9MCkmJih0PTEpO3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJ1c2VyVW5pdCIsdCl9fSx7a2V5OiJ2aWV3IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQscj10aGlzLmNyb3BCb3gsYT10aGlzLm1lZGlhQm94O2lmKHI9PT1hfHwoMCxvLmlzQXJyYXlFcXVhbCkocixhKSl0PWE7ZWxzZXt2YXIgaT1vLlV0aWwuaW50ZXJzZWN0KHIsYSk7aSYmaVsyXS1pWzBdIT0wJiZpWzNdLWlbMV0hPTA/dD1pOigwLG8ud2FybikoIkVtcHR5IC9Dcm9wQm94IGFuZCAvTWVkaWFCb3ggaW50ZXJzZWN0aW9uLiIpfXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJ2aWV3Iix0fHxhKX19LHtrZXk6InJvdGF0ZSIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJvdGF0ZSIpfHwwO3QlOTAhPTA/dD0wOnQ+PTM2MD90JT0zNjA6dDwwJiYodD0odCUzNjArMzYwKSUzNjApO3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJyb3RhdGUiLHQpfX0se2tleToiYW5ub3RhdGlvbnMiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4oMCxvLnNoYWRvdykodGhpcywiYW5ub3RhdGlvbnMiLHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIkFubm90cyIpfHxbXSl9fSx7a2V5OiJfcGFyc2VkQW5ub3RhdGlvbnMiLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD10aGlzLHI9dGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCJhbm5vdGF0aW9ucyIpLnRoZW4oKGZ1bmN0aW9uKCl7dmFyIHIsYT1bXSxpPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQuYW5ub3RhdGlvbnMpO3RyeXtmb3IoaS5zKCk7IShyPWkubigpKS5kb25lOyl7dmFyIGM9ci52YWx1ZTthLnB1c2goZC5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUodC54cmVmLGMsdC5wZGZNYW5hZ2VyLHQuX2xvY2FsSWRGYWN0b3J5KS5jYXRjaCgoZnVuY3Rpb24odCl7KDAsby53YXJuKSgnX3BhcnNlZEFubm90YXRpb25zOiAiJy5jb25jYXQodCwnIi4nKSk7cmV0dXJuIG51bGx9KSkpfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm4gUHJvbWlzZS5hbGwoYSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hIXR9KSl9KSl9KSk7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsIl9wYXJzZWRBbm5vdGF0aW9ucyIscil9fV0pO3JldHVybiBQYWdlfSgpO3IuUGFnZT12O3ZhciBTPW5ldyBVaW50OEFycmF5KFszNyw4MCw2OCw3MCw0NV0pLGs9bmV3IFVpbnQ4QXJyYXkoWzExNSwxMTYsOTcsMTE0LDExNiwxMjAsMTE0LDEwMSwxMDJdKSx3PW5ldyBVaW50OEFycmF5KFsxMDEsMTEwLDEwMCwxMTEsOTgsMTA2XSksQz0vXlsxLTldXC5bMC05XSQvO2Z1bmN0aW9uIGZpbmQodCxyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MTAyNCxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM10sbz1yLmxlbmd0aCxjPXQucGVla0J5dGVzKGEpLGw9Yy5sZW5ndGgtbztpZihsPD0wKXJldHVybiExO2lmKGkpZm9yKHZhciB1PW8tMSxoPWMubGVuZ3RoLTE7aD49dTspe2Zvcih2YXIgZD0wO2Q8byYmY1toLWRdPT09clt1LWRdOylkKys7aWYoZD49byl7dC5wb3MrPWgtdTtyZXR1cm4hMH1oLS19ZWxzZSBmb3IodmFyIHA9MDtwPD1sOyl7Zm9yKHZhciBtPTA7bTxvJiZjW3ArbV09PT1yW21dOyltKys7aWYobT49byl7dC5wb3MrPXA7cmV0dXJuITB9cCsrfXJldHVybiExfXZhciBfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGRG9jdW1lbnQodCxyKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQREZEb2N1bWVudCk7dmFyIGE7aWYoKDAsbC5pc1N0cmVhbSkocikpYT1yO2Vsc2V7aWYoISgwLG8uaXNBcnJheUJ1ZmZlcikocikpdGhyb3cgbmV3IEVycm9yKCJQREZEb2N1bWVudDogVW5rbm93biBhcmd1bWVudCB0eXBlIik7YT1uZXcgaC5TdHJlYW0ocil9aWYoYS5sZW5ndGg8PTApdGhyb3cgbmV3IG8uSW52YWxpZFBERkV4Y2VwdGlvbigiVGhlIFBERiBmaWxlIGlzIGVtcHR5LCBpLmUuIGl0cyBzaXplIGlzIHplcm8gYnl0ZXMuIik7dGhpcy5wZGZNYW5hZ2VyPXQ7dGhpcy5zdHJlYW09YTt0aGlzLnhyZWY9bmV3IGMuWFJlZihhLHQpO3RoaXMuX3BhZ2VQcm9taXNlcz1bXTt0aGlzLl92ZXJzaW9uPW51bGw7dmFyIGk9e2ZvbnQ6MH07dGhpcy5fZ2xvYmFsSWRGYWN0b3J5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gX2NsYXNzMigpe19jbGFzc0NhbGxDaGVjayh0aGlzLF9jbGFzczIpfV9jcmVhdGVDbGFzcyhfY2xhc3MyLG51bGwsW3trZXk6ImdldERvY0lkIix2YWx1ZTpmdW5jdGlvbiBnZXREb2NJZCgpe3JldHVybiJnXyIuY29uY2F0KHQuZG9jSWQpfX0se2tleToiY3JlYXRlRm9udElkIix2YWx1ZTpmdW5jdGlvbiBjcmVhdGVGb250SWQoKXtyZXR1cm4iZiIuY29uY2F0KCsraS5mb250KX19LHtrZXk6ImNyZWF0ZU9iaklkIix2YWx1ZTpmdW5jdGlvbiBjcmVhdGVPYmpJZCgpeygwLG8udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGNyZWF0ZU9iaklkYCBjYWxsZWQuIil9fV0pO3JldHVybiBfY2xhc3MyfSgpfV9jcmVhdGVDbGFzcyhQREZEb2N1bWVudCxbe2tleToicGFyc2UiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlKHQpe3RoaXMueHJlZi5wYXJzZSh0KTt0aGlzLmNhdGFsb2c9bmV3IGMuQ2F0YWxvZyh0aGlzLnBkZk1hbmFnZXIsdGhpcy54cmVmKTt0aGlzLmNhdGFsb2cudmVyc2lvbiYmKHRoaXMuX3ZlcnNpb249dGhpcy5jYXRhbG9nLnZlcnNpb24pfX0se2tleToiY2hlY2tIZWFkZXIiLHZhbHVlOmZ1bmN0aW9uIGNoZWNrSGVhZGVyKCl7dmFyIHQ9dGhpcy5zdHJlYW07dC5yZXNldCgpO2lmKGZpbmQodCxTKSl7dC5tb3ZlU3RhcnQoKTtmb3IodmFyIHIsYT0iIjsocj10LmdldEJ5dGUoKSk+MzImJiEoYS5sZW5ndGg+PTEyKTspYSs9U3RyaW5nLmZyb21DaGFyQ29kZShyKTt0aGlzLl92ZXJzaW9ufHwodGhpcy5fdmVyc2lvbj1hLnN1YnN0cmluZyg1KSl9fX0se2tleToicGFyc2VTdGFydFhSZWYiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlU3RhcnRYUmVmKCl7dGhpcy54cmVmLnNldFN0YXJ0WFJlZih0aGlzLnN0YXJ0WFJlZil9fSx7a2V5OiJfaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyIsdmFsdWU6ZnVuY3Rpb24gX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXModCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGk9MTA7cmV0dXJuIHQuZXZlcnkoKGZ1bmN0aW9uKHQpe2lmKCh0PXIueHJlZi5mZXRjaElmUmVmKHQpKS5oYXMoIktpZHMiKSl7aWYoKythPmkpeygwLG8ud2FybikoIl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOiBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCByZWFjaGVkIik7cmV0dXJuITF9cmV0dXJuIHIuX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXModC5nZXQoIktpZHMiKSxhKX12YXIgYz0oMCxsLmlzTmFtZSkodC5nZXQoIkZUIiksIlNpZyIpLHU9dC5nZXQoIlJlY3QiKSxoPUFycmF5LmlzQXJyYXkodSkmJnUuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dH0pKTtyZXR1cm4gYyYmaH0pKX19LHtrZXk6Il9nZXRMaW5lYXJpemF0aW9uUGFnZSIsdmFsdWU6ZnVuY3Rpb24gX2dldExpbmVhcml6YXRpb25QYWdlKHQpe3ZhciByPXRoaXMuY2F0YWxvZyxhPXRoaXMubGluZWFyaXphdGlvbixpPWwuUmVmLmdldChhLm9iamVjdE51bWJlckZpcnN0LDApO3JldHVybiB0aGlzLnhyZWYuZmV0Y2hBc3luYyhpKS50aGVuKChmdW5jdGlvbih0KXtpZigoMCxsLmlzRGljdCkodCwiUGFnZSIpfHwoMCxsLmlzRGljdCkodCkmJiF0LmhhcygiVHlwZSIpJiZ0LmhhcygiQ29udGVudHMiKSl7aSYmIXIucGFnZUtpZHNDb3VudENhY2hlLmhhcyhpKSYmci5wYWdlS2lkc0NvdW50Q2FjaGUucHV0KGksMSk7cmV0dXJuW3QsaV19dGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlRoZSBMaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgZG9lc24ndCBwb2ludCB0byBhIHZhbGlkIFBhZ2UgZGljdGlvbmFyeS4iKX0pKS5jYXRjaCgoZnVuY3Rpb24oYSl7KDAsby5pbmZvKShhKTtyZXR1cm4gci5nZXRQYWdlRGljdCh0KX0pKX19LHtrZXk6ImdldFBhZ2UiLHZhbHVlOmZ1bmN0aW9uIGdldFBhZ2UodCl7dmFyIHI9dGhpcztpZih2b2lkIDAhPT10aGlzLl9wYWdlUHJvbWlzZXNbdF0pcmV0dXJuIHRoaXMuX3BhZ2VQcm9taXNlc1t0XTt2YXIgYT10aGlzLmNhdGFsb2csaT10aGlzLmxpbmVhcml6YXRpb24sbz1pJiZpLnBhZ2VGaXJzdD09PXQ/dGhpcy5fZ2V0TGluZWFyaXphdGlvblBhZ2UodCk6YS5nZXRQYWdlRGljdCh0KTtyZXR1cm4gdGhpcy5fcGFnZVByb21pc2VzW3RdPW8udGhlbigoZnVuY3Rpb24oaSl7dmFyIG89X3NsaWNlZFRvQXJyYXkoaSwyKSxjPW9bMF0sbD1vWzFdO3JldHVybiBuZXcgdih7cGRmTWFuYWdlcjpyLnBkZk1hbmFnZXIseHJlZjpyLnhyZWYscGFnZUluZGV4OnQscGFnZURpY3Q6YyxyZWY6bCxnbG9iYWxJZEZhY3Rvcnk6ci5fZ2xvYmFsSWRGYWN0b3J5LGZvbnRDYWNoZTphLmZvbnRDYWNoZSxidWlsdEluQ01hcENhY2hlOmEuYnVpbHRJbkNNYXBDYWNoZSxnbG9iYWxJbWFnZUNhY2hlOmEuZ2xvYmFsSW1hZ2VDYWNoZX0pfSkpfX0se2tleToiY2hlY2tGaXJzdFBhZ2UiLHZhbHVlOmZ1bmN0aW9uIGNoZWNrRmlyc3RQYWdlKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5nZXRQYWdlKDApLmNhdGNoKGZ1bmN0aW9uKCl7dmFyIHI9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUocil7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlJChhKXtmb3IoOzspc3dpdGNoKGEucHJldj1hLm5leHQpe2Nhc2UgMDppZighKHIgaW5zdGFuY2VvZiB1LlhSZWZFbnRyeUV4Y2VwdGlvbikpe2EubmV4dD01O2JyZWFrfXQuX3BhZ2VQcm9taXNlcy5sZW5ndGg9MDthLm5leHQ9NDtyZXR1cm4gdC5jbGVhbnVwKCk7Y2FzZSA0OnRocm93IG5ldyB1LlhSZWZQYXJzZUV4Y2VwdGlvbjtjYXNlIDU6Y2FzZSJlbmQiOnJldHVybiBhLnN0b3AoKX19KSxfY2FsbGVlKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpfX0se2tleToiZm9udEZhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbiBmb250RmFsbGJhY2sodCxyKXtyZXR1cm4gdGhpcy5jYXRhbG9nLmZvbnRGYWxsYmFjayh0LHIpfX0se2tleToiY2xlYW51cCIsdmFsdWU6KHQ9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUyKCl7dmFyIHQscj1hcmd1bWVudHM7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMiQoYSl7Zm9yKDs7KXN3aXRjaChhLnByZXY9YS5uZXh0KXtjYXNlIDA6dD1yLmxlbmd0aD4wJiZ2b2lkIDAhPT1yWzBdJiZyWzBdO3JldHVybiBhLmFicnVwdCgicmV0dXJuIix0aGlzLmNhdGFsb2c/dGhpcy5jYXRhbG9nLmNsZWFudXAodCk6KDAsbC5jbGVhclByaW1pdGl2ZUNhY2hlcykoKSk7Y2FzZSAyOmNhc2UiZW5kIjpyZXR1cm4gYS5zdG9wKCl9fSksX2NhbGxlZTIsdGhpcyl9KSkpLGZ1bmN0aW9uIGNsZWFudXAoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToibGluZWFyaXphdGlvbiIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PW51bGw7dHJ5e3Q9bS5MaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSl9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIHUuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgdDsoMCxvLmluZm8pKHQpfXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJsaW5lYXJpemF0aW9uIix0KX19LHtrZXk6InN0YXJ0WFJlZiIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXRoaXMuc3RyZWFtLHI9MDtpZih0aGlzLmxpbmVhcml6YXRpb24pe3QucmVzZXQoKTtmaW5kKHQsdykmJihyPXQucG9zKzYtdC5zdGFydCl9ZWxzZXtmb3IodmFyIGE9ay5sZW5ndGgsaT0hMSxjPXQuZW5kOyFpJiZjPjA7KXsoYy09MTAyNC1hKTwwJiYoYz0wKTt0LnBvcz1jO2k9ZmluZCh0LGssMTAyNCwhMCl9aWYoaSl7dC5za2lwKDkpO3ZhciBsO2Rve2w9dC5nZXRCeXRlKCl9d2hpbGUoKDAsdS5pc1doaXRlU3BhY2UpKGwpKTtmb3IodmFyIGg9IiI7bD49MzImJmw8PTU3Oyl7aCs9U3RyaW5nLmZyb21DaGFyQ29kZShsKTtsPXQuZ2V0Qnl0ZSgpfXI9cGFyc2VJbnQoaCwxMCk7aXNOYU4ocikmJihyPTApfX1yZXR1cm4oMCxvLnNoYWRvdykodGhpcywic3RhcnRYUmVmIixyKX19LHtrZXk6Im51bVBhZ2VzIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9dGhpcy5saW5lYXJpemF0aW9uLHI9dD90Lm51bVBhZ2VzOnRoaXMuY2F0YWxvZy5udW1QYWdlcztyZXR1cm4oMCxvLnNoYWRvdykodGhpcywibnVtUGFnZXMiLHIpfX0se2tleToiZm9ybUluZm8iLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD17aGFzQWNyb0Zvcm06ITEsaGFzWGZhOiExfSxyPXRoaXMuY2F0YWxvZy5hY3JvRm9ybTtpZighcilyZXR1cm4oMCxvLnNoYWRvdykodGhpcywiZm9ybUluZm8iLHQpO3RyeXt2YXIgYT1yLmdldCgiWEZBIiksaT1BcnJheS5pc0FycmF5KGEpJiZhLmxlbmd0aD4wfHwoMCxsLmlzU3RyZWFtKShhKSYmIWEuaXNFbXB0eTt0Lmhhc1hmYT1pO3ZhciBjPXIuZ2V0KCJGaWVsZHMiKSxoPUFycmF5LmlzQXJyYXkoYykmJmMubGVuZ3RoPjAsZD0hISgxJnIuZ2V0KCJTaWdGbGFncyIpKSYmdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhjKTt0Lmhhc0Fjcm9Gb3JtPWgmJiFkfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiB1Lk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7KDAsby5pbmZvKSgiQ2Fubm90IGZldGNoIGZvcm0gaW5mb3JtYXRpb24uIil9cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsImZvcm1JbmZvIix0KX19LHtrZXk6ImRvY3VtZW50SW5mbyIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXtUaXRsZTpvLmlzU3RyaW5nLEF1dGhvcjpvLmlzU3RyaW5nLFN1YmplY3Q6by5pc1N0cmluZyxLZXl3b3JkczpvLmlzU3RyaW5nLENyZWF0b3I6by5pc1N0cmluZyxQcm9kdWNlcjpvLmlzU3RyaW5nLENyZWF0aW9uRGF0ZTpvLmlzU3RyaW5nLE1vZERhdGU6by5pc1N0cmluZyxUcmFwcGVkOmwuaXNOYW1lfSxyPXRoaXMuX3ZlcnNpb247aWYoInN0cmluZyIhPXR5cGVvZiByfHwhQy50ZXN0KHIpKXsoMCxvLndhcm4pKCJJbnZhbGlkIFBERiBoZWFkZXIgdmVyc2lvbiBudW1iZXI6ICIuY29uY2F0KHIpKTtyPW51bGx9dmFyIGEsaT17UERGRm9ybWF0VmVyc2lvbjpyLElzTGluZWFyaXplZDohIXRoaXMubGluZWFyaXphdGlvbixJc0Fjcm9Gb3JtUHJlc2VudDp0aGlzLmZvcm1JbmZvLmhhc0Fjcm9Gb3JtLElzWEZBUHJlc2VudDp0aGlzLmZvcm1JbmZvLmhhc1hmYSxJc0NvbGxlY3Rpb25QcmVzZW50OiEhdGhpcy5jYXRhbG9nLmNvbGxlY3Rpb259O3RyeXthPXRoaXMueHJlZi50cmFpbGVyLmdldCgiSW5mbyIpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiB1Lk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7KDAsby5pbmZvKSgiVGhlIGRvY3VtZW50IGluZm9ybWF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKX1pZigoMCxsLmlzRGljdCkoYSkpe3ZhciBjLGg9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYS5nZXRLZXlzKCkpO3RyeXtmb3IoaC5zKCk7IShjPWgubigpKS5kb25lOyl7dmFyIGQ9Yy52YWx1ZSxwPWEuZ2V0KGQpO2lmKHRbZF0pdFtkXShwKT9pW2RdPSJzdHJpbmciIT10eXBlb2YgcD9wOigwLG8uc3RyaW5nVG9QREZTdHJpbmcpKHApOigwLG8uaW5mbykoJ0JhZCB2YWx1ZSBpbiBkb2N1bWVudCBpbmZvIGZvciAiJy5jb25jYXQoZCwnIi4nKSk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGQpe3ZhciBtPXZvaWQgMDtpZigoMCxvLmlzU3RyaW5nKShwKSltPSgwLG8uc3RyaW5nVG9QREZTdHJpbmcpKHApO2Vsc2V7aWYoISgoMCxsLmlzTmFtZSkocCl8fCgwLG8uaXNOdW0pKHApfHwoMCxvLmlzQm9vbCkocCkpKXsoMCxvLmluZm8pKCdVbnN1cHBvcnRlZCB2YWx1ZSBpbiBkb2N1bWVudCBpbmZvIGZvciAoY3VzdG9tKSAiJy5jb25jYXQoZCwnIi4nKSk7Y29udGludWV9bT1wfWkuQ3VzdG9tfHwoaS5DdXN0b209T2JqZWN0LmNyZWF0ZShudWxsKSk7aS5DdXN0b21bZF09bX19fWNhdGNoKHQpe2guZSh0KX1maW5hbGx5e2guZigpfX1yZXR1cm4oMCxvLnNoYWRvdykodGhpcywiZG9jdW1lbnRJbmZvIixpKX19LHtrZXk6ImZpbmdlcnByaW50IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7Zm9yKHZhciB0LHI9dGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJRCIpLGE9W10saT0wLGM9KHQ9QXJyYXkuaXNBcnJheShyKSYmclswXSYmKDAsby5pc1N0cmluZykoclswXSkmJiJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIhPT1yWzBdPygwLG8uc3RyaW5nVG9CeXRlcykoclswXSk6KDAscC5jYWxjdWxhdGVNRDUpKHRoaXMuc3RyZWFtLmdldEJ5dGVSYW5nZSgwLDEwMjQpLDAsMTAyNCkpLmxlbmd0aDtpPGM7aSsrKXt2YXIgbD10W2ldLnRvU3RyaW5nKDE2KTthLnB1c2gobC5wYWRTdGFydCgyLCIwIikpfXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJmaW5nZXJwcmludCIsYS5qb2luKCIiKSl9fV0pO3ZhciB0O3JldHVybiBQREZEb2N1bWVudH0oKTtyLlBERkRvY3VtZW50PV99LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuRmlsZVNwZWM9ci5YUmVmPXIuT2JqZWN0TG9hZGVyPXIuQ2F0YWxvZz12b2lkIDA7dmFyIGk9ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KGEoMikpLG89YSg1KSxjPWEoMjAyKSxsPWEoMjA4KSx1PWEoMjA1KSxoPWEoMjE5KSxkPWEoMjIwKSxwPWEoMjIxKTtmdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxyLGEsaSxvLGMsbCl7dHJ5e3ZhciB1PXRbY10obCksaD11LnZhbHVlfWNhdGNoKHQpe2EodCk7cmV0dXJufXUuZG9uZT9yKGgpOlByb21pc2UucmVzb2x2ZShoKS50aGVuKGksbyl9ZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksbyl7dmFyIGM9dC5hcHBseShyLGEpO2Z1bmN0aW9uIF9uZXh0KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChjLGksbyxfbmV4dCxfdGhyb3csIm5leHQiLHQpfWZ1bmN0aW9uIF90aHJvdyh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJ0aHJvdyIsdCl9X25leHQodm9pZCAwKX0pKX19ZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkodCxyKXtyZXR1cm4gZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9KHQpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQodCxyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIGE9W10saT0hMCxvPSExLGM9dm9pZCAwO3RyeXtmb3IodmFyIGwsdT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KGw9dS5uZXh0KCkpLmRvbmUpO2k9ITApe2EucHVzaChsLnZhbHVlKTtpZihyJiZhLmxlbmd0aD09PXIpYnJlYWt9fWNhdGNoKHQpe289ITA7Yz10fWZpbmFsbHl7dHJ5e2l8fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYobyl0aHJvdyBjfX1yZXR1cm4gYX0odCxyKXx8X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil8fGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCxyKXt2YXIgYTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwoYT1fdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCkpfHxyJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXthJiYodD1hKTt2YXIgaT0wLG89ZnVuY3Rpb24gRigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uIG4oKXtyZXR1cm4gaT49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbaSsrXX19LGU6ZnVuY3Rpb24gZSh0KXt0aHJvdyB0fSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgYyxsPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24gcygpe2E9dFtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24gbigpe3ZhciB0PWEubmV4dCgpO2w9dC5kb25lO3JldHVybiB0fSxlOmZ1bmN0aW9uIGUodCl7dT0hMDtjPXR9LGY6ZnVuY3Rpb24gZigpe3RyeXtsfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgY319fX1mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscik7dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpOyJPYmplY3QiPT09YSYmdC5jb25zdHJ1Y3RvciYmKGE9dC5jb25zdHJ1Y3Rvci5uYW1lKTtyZXR1cm4iTWFwIj09PWF8fCJTZXQiPT09YT9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSk/X2FycmF5TGlrZVRvQXJyYXkodCxyKTp2b2lkIDB9fWZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHQscil7KG51bGw9PXJ8fHI+dC5sZW5ndGgpJiYocj10Lmxlbmd0aCk7Zm9yKHZhciBhPTAsaT1uZXcgQXJyYXkocik7YTxyO2ErKylpW2FdPXRbYV07cmV0dXJuIGl9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGk9clthXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMTtpLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9ZnVuY3Rpb24gZmV0Y2hEZXN0aW5hdGlvbih0KXtyZXR1cm4oMCxjLmlzRGljdCkodCk/dC5nZXQoIkQiKTp0fXZhciBtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ2F0YWxvZyh0LHIpe19jbGFzc0NhbGxDaGVjayh0aGlzLENhdGFsb2cpO3RoaXMucGRmTWFuYWdlcj10O3RoaXMueHJlZj1yO3RoaXMuX2NhdERpY3Q9ci5nZXRDYXRhbG9nT2JqKCk7aWYoISgwLGMuaXNEaWN0KSh0aGlzLl9jYXREaWN0KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiQ2F0YWxvZyBvYmplY3QgaXMgbm90IGEgZGljdGlvbmFyeS4iKTt0aGlzLmZvbnRDYWNoZT1uZXcgYy5SZWZTZXRDYWNoZTt0aGlzLmJ1aWx0SW5DTWFwQ2FjaGU9bmV3IE1hcDt0aGlzLmdsb2JhbEltYWdlQ2FjaGU9bmV3IHAuR2xvYmFsSW1hZ2VDYWNoZTt0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZT1uZXcgYy5SZWZTZXRDYWNoZX1fY3JlYXRlQ2xhc3MoQ2F0YWxvZyxbe2tleToiX3JlYWREb2N1bWVudE91dGxpbmUiLHZhbHVlOmZ1bmN0aW9uIF9yZWFkRG9jdW1lbnRPdXRsaW5lKCl7dmFyIHQ9dGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7aWYoISgwLGMuaXNEaWN0KSh0KSlyZXR1cm4gbnVsbDt0PXQuZ2V0UmF3KCJGaXJzdCIpO2lmKCEoMCxjLmlzUmVmKSh0KSlyZXR1cm4gbnVsbDt2YXIgcj17aXRlbXM6W119LGE9W3tvYmo6dCxwYXJlbnQ6cn1dLGk9bmV3IGMuUmVmU2V0O2kucHV0KHQpO2Zvcih2YXIgbD10aGlzLnhyZWYsdT1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7YS5sZW5ndGg+MDspe3ZhciBoPWEuc2hpZnQoKSxwPWwuZmV0Y2hJZlJlZihoLm9iaik7aWYobnVsbCE9PXApe2lmKCFwLmhhcygiVGl0bGUiKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7dmFyIG09e3VybDpudWxsLGRlc3Q6bnVsbH07Q2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHtkZXN0RGljdDpwLHJlc3VsdE9iajptLGRvY0Jhc2VVcmw6dGhpcy5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmx9KTt2YXIgZz1wLmdldCgiVGl0bGUiKSx5PXAuZ2V0KCJGIil8fDAsYj1wLmdldEFycmF5KCJDIiksdj1wLmdldCgiQ291bnQiKSxTPXU7IUFycmF5LmlzQXJyYXkoYil8fDMhPT1iLmxlbmd0aHx8MD09PWJbMF0mJjA9PT1iWzFdJiYwPT09YlsyXXx8KFM9ZC5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihiLDApKTt2YXIgaz17ZGVzdDptLmRlc3QsdXJsOm0udXJsLHVuc2FmZVVybDptLnVuc2FmZVVybCxuZXdXaW5kb3c6bS5uZXdXaW5kb3csdGl0bGU6KDAsby5zdHJpbmdUb1BERlN0cmluZykoZyksY29sb3I6Uyxjb3VudDpOdW1iZXIuaXNJbnRlZ2VyKHYpP3Y6dm9pZCAwLGJvbGQ6ISEoMiZ5KSxpdGFsaWM6ISEoMSZ5KSxpdGVtczpbXX07aC5wYXJlbnQuaXRlbXMucHVzaChrKTt0PXAuZ2V0UmF3KCJGaXJzdCIpO2lmKCgwLGMuaXNSZWYpKHQpJiYhaS5oYXModCkpe2EucHVzaCh7b2JqOnQscGFyZW50Omt9KTtpLnB1dCh0KX10PXAuZ2V0UmF3KCJOZXh0Iik7aWYoKDAsYy5pc1JlZikodCkmJiFpLmhhcyh0KSl7YS5wdXNoKHtvYmo6dCxwYXJlbnQ6aC5wYXJlbnR9KTtpLnB1dCh0KX19fXJldHVybiByLml0ZW1zLmxlbmd0aD4wP3IuaXRlbXM6bnVsbH19LHtrZXk6Il9yZWFkUGVybWlzc2lvbnMiLHZhbHVlOmZ1bmN0aW9uIF9yZWFkUGVybWlzc2lvbnMoKXt2YXIgdD10aGlzLnhyZWYudHJhaWxlci5nZXQoIkVuY3J5cHQiKTtpZighKDAsYy5pc0RpY3QpKHQpKXJldHVybiBudWxsO3ZhciByPXQuZ2V0KCJQIik7aWYoISgwLG8uaXNOdW0pKHIpKXJldHVybiBudWxsO3IrPU1hdGgucG93KDIsMzIpO3ZhciBhPVtdO2Zvcih2YXIgaSBpbiBvLlBlcm1pc3Npb25GbGFnKXt2YXIgbD1vLlBlcm1pc3Npb25GbGFnW2ldO3ImbCYmYS5wdXNoKGwpfXJldHVybiBhfX0se2tleToiX3JlYWRPcHRpb25hbENvbnRlbnRDb25maWciLHZhbHVlOmZ1bmN0aW9uIF9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKHQscil7ZnVuY3Rpb24gcGFyc2VPbk9mZih0KXt2YXIgYT1bXTtpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgaSxvPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQpO3RyeXtmb3Ioby5zKCk7IShpPW8ubigpKS5kb25lOyl7dmFyIGw9aS52YWx1ZTsoMCxjLmlzUmVmKShsKSYmKHIuaW5jbHVkZXMobCkmJmEucHVzaChsLnRvU3RyaW5nKCkpKX19Y2F0Y2godCl7by5lKHQpfWZpbmFsbHl7by5mKCl9fXJldHVybiBhfWZ1bmN0aW9uIHBhcnNlT3JkZXIodCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIG51bGw7dmFyIG8sbD1bXSx1PV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQpO3RyeXtmb3IodS5zKCk7IShvPXUubigpKS5kb25lOyl7dmFyIGg9by52YWx1ZTtpZigoMCxjLmlzUmVmKShoKSYmci5pbmNsdWRlcyhoKSl7aS5wdXQoaCk7bC5wdXNoKGgudG9TdHJpbmcoKSl9ZWxzZXt2YXIgZD1wYXJzZU5lc3RlZE9yZGVyKGgsYSk7ZCYmbC5wdXNoKGQpfX19Y2F0Y2godCl7dS5lKHQpfWZpbmFsbHl7dS5mKCl9aWYoYT4wKXJldHVybiBsO3ZhciBwLG09W10sZz1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyKTt0cnl7Zm9yKGcucygpOyEocD1nLm4oKSkuZG9uZTspe3ZhciB5PXAudmFsdWU7aS5oYXMoeSl8fG0ucHVzaCh5LnRvU3RyaW5nKCkpfX1jYXRjaCh0KXtnLmUodCl9ZmluYWxseXtnLmYoKX1tLmxlbmd0aCYmbC5wdXNoKHtuYW1lOm51bGwsb3JkZXI6bX0pO3JldHVybiBsfWZ1bmN0aW9uIHBhcnNlTmVzdGVkT3JkZXIodCxyKXtpZigrK3I+bCl7KDAsby53YXJuKSgicGFyc2VOZXN0ZWRPcmRlciAtIHJlYWNoZWQgTUFYX05FU1RFRF9MRVZFTFMuIik7cmV0dXJuIG51bGx9dmFyIGk9YS5mZXRjaElmUmVmKHQpO2lmKCFBcnJheS5pc0FycmF5KGkpKXJldHVybiBudWxsO3ZhciBjPWEuZmV0Y2hJZlJlZihpWzBdKTtpZigic3RyaW5nIiE9dHlwZW9mIGMpcmV0dXJuIG51bGw7dmFyIHU9cGFyc2VPcmRlcihpLnNsaWNlKDEpLHIpO3JldHVybiB1JiZ1Lmxlbmd0aD97bmFtZTooMCxvLnN0cmluZ1RvUERGU3RyaW5nKShjKSxvcmRlcjp1fTpudWxsfXZhciBhPXRoaXMueHJlZixpPW5ldyBjLlJlZlNldCxsPTEwO3JldHVybntuYW1lOigwLG8uaXNTdHJpbmcpKHQuZ2V0KCJOYW1lIikpPygwLG8uc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJOYW1lIikpOm51bGwsY3JlYXRvcjooMCxvLmlzU3RyaW5nKSh0LmdldCgiQ3JlYXRvciIpKT8oMCxvLnN0cmluZ1RvUERGU3RyaW5nKSh0LmdldCgiQ3JlYXRvciIpKTpudWxsLGJhc2VTdGF0ZTooMCxjLmlzTmFtZSkodC5nZXQoIkJhc2VTdGF0ZSIpKT90LmdldCgiQmFzZVN0YXRlIikubmFtZTpudWxsLG9uOnBhcnNlT25PZmYodC5nZXQoIk9OIikpLG9mZjpwYXJzZU9uT2ZmKHQuZ2V0KCJPRkYiKSksb3JkZXI6cGFyc2VPcmRlcih0LmdldCgiT3JkZXIiKSksZ3JvdXBzOm51bGx9fX0se2tleToiZ2V0RGVzdGluYXRpb24iLHZhbHVlOmZ1bmN0aW9uIGdldERlc3RpbmF0aW9uKHQpe3ZhciByPXRoaXMuX3JlYWREZXN0cygpO3JldHVybiByIGluc3RhbmNlb2YgYnx8ciBpbnN0YW5jZW9mIGMuRGljdD9mZXRjaERlc3RpbmF0aW9uKHIuZ2V0KHQpfHxudWxsKTpudWxsfX0se2tleToiX3JlYWREZXN0cyIsdmFsdWU6ZnVuY3Rpb24gX3JlYWREZXN0cygpe3ZhciB0PXRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpO3JldHVybiB0JiZ0LmhhcygiRGVzdHMiKT9uZXcgYih0LmdldFJhdygiRGVzdHMiKSx0aGlzLnhyZWYpOnRoaXMuX2NhdERpY3QuaGFzKCJEZXN0cyIpP3RoaXMuX2NhdERpY3QuZ2V0KCJEZXN0cyIpOnZvaWQgMH19LHtrZXk6Il9yZWFkUGFnZUxhYmVscyIsdmFsdWU6ZnVuY3Rpb24gX3JlYWRQYWdlTGFiZWxzKCl7dmFyIHQ9dGhpcy5fY2F0RGljdC5nZXRSYXcoIlBhZ2VMYWJlbHMiKTtpZighdClyZXR1cm4gbnVsbDtmb3IodmFyIHI9bmV3IEFycmF5KHRoaXMubnVtUGFnZXMpLGE9bnVsbCxpPSIiLGw9bmV3IHYodCx0aGlzLnhyZWYpLmdldEFsbCgpLGg9IiIsZD0xLHA9MCxtPXRoaXMubnVtUGFnZXM7cDxtO3ArKyl7aWYocCBpbiBsKXt2YXIgZz1sW3BdO2lmKCEoMCxjLmlzRGljdCkoZykpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlBhZ2VMYWJlbCBpcyBub3QgYSBkaWN0aW9uYXJ5LiIpO2lmKGcuaGFzKCJUeXBlIikmJiEoMCxjLmlzTmFtZSkoZy5nZXQoIlR5cGUiKSwiUGFnZUxhYmVsIikpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkludmFsaWQgdHlwZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtpZihnLmhhcygiUyIpKXt2YXIgeT1nLmdldCgiUyIpO2lmKCEoMCxjLmlzTmFtZSkoeSkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkludmFsaWQgc3R5bGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7YT15Lm5hbWV9ZWxzZSBhPW51bGw7aWYoZy5oYXMoIlAiKSl7dmFyIGI9Zy5nZXQoIlAiKTtpZighKDAsby5pc1N0cmluZykoYikpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkludmFsaWQgcHJlZml4IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpO2k9KDAsby5zdHJpbmdUb1BERlN0cmluZykoYil9ZWxzZSBpPSIiO2lmKGcuaGFzKCJTdCIpKXt2YXIgUz1nLmdldCgiU3QiKTtpZighKE51bWJlci5pc0ludGVnZXIoUykmJlM+PTEpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJJbnZhbGlkIHN0YXJ0IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpO2Q9U31lbHNlIGQ9MX1zd2l0Y2goYSl7Y2FzZSJEIjpoPWQ7YnJlYWs7Y2FzZSJSIjpjYXNlInIiOmg9KDAsdS50b1JvbWFuTnVtZXJhbHMpKGQsInIiPT09YSk7YnJlYWs7Y2FzZSJBIjpjYXNlImEiOmZvcih2YXIgaz0iYSI9PT1hPzk3OjY1LHc9ZC0xLEM9U3RyaW5nLmZyb21DaGFyQ29kZShrK3clMjYpLF89W10seD0wLEE9dy8yNnwwO3g8PUE7eCsrKV8ucHVzaChDKTtoPV8uam9pbigiIik7YnJlYWs7ZGVmYXVsdDppZihhKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCdJbnZhbGlkIHN0eWxlICInLmNvbmNhdChhLCciIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LicpKTtoPSIifXJbcF09aStoO2QrK31yZXR1cm4gcn19LHtrZXk6ImZvbnRGYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24gZm9udEZhbGxiYWNrKHQscil7dmFyIGE9W107dGhpcy5mb250Q2FjaGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7YS5wdXNoKHQpfSkpO3JldHVybiBQcm9taXNlLmFsbChhKS50aGVuKChmdW5jdGlvbihhKXt2YXIgaSxvPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGEpO3RyeXtmb3Ioby5zKCk7IShpPW8ubigpKS5kb25lOyl7dmFyIGM9aS52YWx1ZTtpZihjLmxvYWRlZE5hbWU9PT10KXtjLmZhbGxiYWNrKHIpO3JldHVybn19fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX0pKX19LHtrZXk6ImNsZWFudXAiLHZhbHVlOmZ1bmN0aW9uIGNsZWFudXAoKXt2YXIgdD10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTsoMCxjLmNsZWFyUHJpbWl0aXZlQ2FjaGVzKSgpO3RoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5jbGVhcihyKTt0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZS5jbGVhcigpO3ZhciBhPVtdO3RoaXMuZm9udENhY2hlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2EucHVzaCh0KX0pKTtyZXR1cm4gUHJvbWlzZS5hbGwoYSkudGhlbigoZnVuY3Rpb24ocil7dmFyIGEsaT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyKTt0cnl7Zm9yKGkucygpOyEoYT1pLm4oKSkuZG9uZTspe2RlbGV0ZSBhLnZhbHVlLmRpY3QudHJhbnNsYXRlZH19Y2F0Y2godCl7aS5lKHQpfWZpbmFsbHl7aS5mKCl9dC5mb250Q2FjaGUuY2xlYXIoKTt0LmJ1aWx0SW5DTWFwQ2FjaGUuY2xlYXIoKX0pKX19LHtrZXk6ImdldFBhZ2VEaWN0Iix2YWx1ZTpmdW5jdGlvbiBnZXRQYWdlRGljdCh0KXt2YXIgcixhPSgwLG8uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCksaT1bdGhpcy5fY2F0RGljdC5nZXRSYXcoIlBhZ2VzIildLGw9bmV3IGMuUmVmU2V0LHU9dGhpcy54cmVmLGg9dGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUsZD0wOyFmdW5jdGlvbiBuZXh0KCl7Zm9yKHZhciBwPWZ1bmN0aW9uIF9sb29wKCl7dmFyIHA9aS5wb3AoKTtpZigoMCxjLmlzUmVmKShwKSl7aWYoKHI9aC5nZXQocCkpPjAmJmQrcjx0KXtkKz1yO3JldHVybiJjb250aW51ZSJ9aWYobC5oYXMocCkpe2EucmVqZWN0KG5ldyBvLkZvcm1hdEVycm9yKCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS4iKSk7cmV0dXJue3Y6dm9pZCAwfX1sLnB1dChwKTt1LmZldGNoQXN5bmMocCkudGhlbigoZnVuY3Rpb24ocil7aWYoKDAsYy5pc0RpY3QpKHIsIlBhZ2UiKXx8KDAsYy5pc0RpY3QpKHIpJiYhci5oYXMoIktpZHMiKSlpZih0PT09ZCl7cCYmIWguaGFzKHApJiZoLnB1dChwLDEpO2EucmVzb2x2ZShbcixwXSl9ZWxzZXtkKys7bmV4dCgpfWVsc2V7aS5wdXNoKHIpO25leHQoKX19KSxhLnJlamVjdCk7cmV0dXJue3Y6dm9pZCAwfX1pZighKDAsYy5pc0RpY3QpKHApKXthLnJlamVjdChuZXcgby5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpKTtyZXR1cm57djp2b2lkIDB9fXI9cC5nZXQoIkNvdW50Iik7aWYoTnVtYmVyLmlzSW50ZWdlcihyKSYmcj49MCl7dmFyIG09cC5vYmpJZDttJiYhaC5oYXMobSkmJmgucHV0KG0scik7aWYoZCtyPD10KXtkKz1yO3JldHVybiJjb250aW51ZSJ9fXZhciBnPXAuZ2V0KCJLaWRzIik7aWYoIUFycmF5LmlzQXJyYXkoZykpe2lmKCgwLGMuaXNOYW1lKShwLmdldCgiVHlwZSIpLCJQYWdlIil8fCFwLmhhcygiVHlwZSIpJiZwLmhhcygiQ29udGVudHMiKSl7aWYoZD09PXQpe2EucmVzb2x2ZShbcCxudWxsXSk7cmV0dXJue3Y6dm9pZCAwfX1kKys7cmV0dXJuImNvbnRpbnVlIn1hLnJlamVjdChuZXcgby5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS4iKSk7cmV0dXJue3Y6dm9pZCAwfX1mb3IodmFyIHk9Zy5sZW5ndGgtMTt5Pj0wO3ktLSlpLnB1c2goZ1t5XSl9O2kubGVuZ3RoOyl7dmFyIG09cCgpO2lmKCJjb250aW51ZSIhPT1tJiYib2JqZWN0Ij09PV90eXBlb2YobSkpcmV0dXJuIG0udn1hLnJlamVjdChuZXcgRXJyb3IoIlBhZ2UgaW5kZXggIi5jb25jYXQodCwiIG5vdCBmb3VuZC4iKSkpfSgpO3JldHVybiBhLnByb21pc2V9fSx7a2V5OiJnZXRQYWdlSW5kZXgiLHZhbHVlOmZ1bmN0aW9uIGdldFBhZ2VJbmRleCh0KXt2YXIgcj10aGlzLnhyZWY7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24gbmV4dChpKXtyZXR1cm4gZnVuY3Rpb24gcGFnZXNCZWZvcmVSZWYoYSl7dmFyIGksbD0wO3JldHVybiByLmZldGNoQXN5bmMoYSkudGhlbigoZnVuY3Rpb24ocil7aWYoKDAsYy5pc1JlZnNFcXVhbCkoYSx0KSYmISgwLGMuaXNEaWN0KShyLCJQYWdlIikmJighKDAsYy5pc0RpY3QpKHIpfHxyLmhhcygiVHlwZSIpfHwhci5oYXMoIkNvbnRlbnRzIikpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJUaGUgcmVmZXJlbmNlIGRvZXMgbm90IHBvaW50IHRvIGEgL1BhZ2UgZGljdGlvbmFyeS4iKTtpZighcilyZXR1cm4gbnVsbDtpZighKDAsYy5pc0RpY3QpKHIpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJOb2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpO2k9ci5nZXRSYXcoIlBhcmVudCIpO3JldHVybiByLmdldEFzeW5jKCJQYXJlbnQiKX0pKS50aGVuKChmdW5jdGlvbih0KXtpZighdClyZXR1cm4gbnVsbDtpZighKDAsYy5pc0RpY3QpKHQpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJQYXJlbnQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7cmV0dXJuIHQuZ2V0QXN5bmMoIktpZHMiKX0pKS50aGVuKChmdW5jdGlvbih0KXtpZighdClyZXR1cm4gbnVsbDtmb3IodmFyIHU9W10saD0hMSxkPTAscD10Lmxlbmd0aDtkPHA7ZCsrKXt2YXIgbT10W2RdO2lmKCEoMCxjLmlzUmVmKShtKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiS2lkIG11c3QgYmUgYSByZWZlcmVuY2UuIik7aWYoKDAsYy5pc1JlZnNFcXVhbCkobSxhKSl7aD0hMDticmVha311LnB1c2goci5mZXRjaEFzeW5jKG0pLnRoZW4oKGZ1bmN0aW9uKHQpe2lmKCEoMCxjLmlzRGljdCkodCkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIktpZCBub2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpO3QuaGFzKCJDb3VudCIpP2wrPXQuZ2V0KCJDb3VudCIpOmwrK30pKSl9aWYoIWgpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIktpZCByZWZlcmVuY2Ugbm90IGZvdW5kIGluIHBhcmVudCdzIGtpZHMuIik7cmV0dXJuIFByb21pc2UuYWxsKHUpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuW2wsaV19KSl9KSl9KGkpLnRoZW4oKGZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBhO3ZhciByPV9zbGljZWRUb0FycmF5KHQsMiksaT1yWzBdLG89clsxXTthKz1pO3JldHVybiBuZXh0KG8pfSkpfSh0KX19LHtrZXk6InZlcnNpb24iLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD10aGlzLl9jYXREaWN0LmdldCgiVmVyc2lvbiIpO3JldHVybigwLGMuaXNOYW1lKSh0KT8oMCxvLnNoYWRvdykodGhpcywidmVyc2lvbiIsdC5uYW1lKTooMCxvLnNoYWRvdykodGhpcywidmVyc2lvbiIsbnVsbCl9fSx7a2V5OiJjb2xsZWN0aW9uIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9bnVsbDt0cnl7dmFyIHI9dGhpcy5fY2F0RGljdC5nZXQoIkNvbGxlY3Rpb24iKTsoMCxjLmlzRGljdCkocikmJnIuc2l6ZT4wJiYodD1yKX1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgdS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyB0OygwLG8uaW5mbykoIkNhbm5vdCBmZXRjaCBDb2xsZWN0aW9uIGVudHJ5OyBhc3N1bWluZyBubyBjb2xsZWN0aW9uIGlzIHByZXNlbnQuIil9cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsImNvbGxlY3Rpb24iLHQpfX0se2tleToiYWNyb0Zvcm0iLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD1udWxsO3RyeXt2YXIgcj10aGlzLl9jYXREaWN0LmdldCgiQWNyb0Zvcm0iKTsoMCxjLmlzRGljdCkocikmJnIuc2l6ZT4wJiYodD1yKX1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgdS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyB0OygwLG8uaW5mbykoIkNhbm5vdCBmZXRjaCBBY3JvRm9ybSBlbnRyeTsgYXNzdW1pbmcgbm8gZm9ybXMgYXJlIHByZXNlbnQuIil9cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsImFjcm9Gb3JtIix0KX19LHtrZXk6Im1ldGFkYXRhIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9dGhpcy5fY2F0RGljdC5nZXRSYXcoIk1ldGFkYXRhIik7aWYoISgwLGMuaXNSZWYpKHQpKXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJtZXRhZGF0YSIsbnVsbCk7dmFyIHIsYT0hKHRoaXMueHJlZi5lbmNyeXB0JiZ0aGlzLnhyZWYuZW5jcnlwdC5lbmNyeXB0TWV0YWRhdGEpLGk9dGhpcy54cmVmLmZldGNoKHQsYSk7aWYoaSYmKDAsYy5pc0RpY3QpKGkuZGljdCkpe3ZhciBsPWkuZGljdC5nZXQoIlR5cGUiKSxoPWkuZGljdC5nZXQoIlN1YnR5cGUiKTtpZigoMCxjLmlzTmFtZSkobCwiTWV0YWRhdGEiKSYmKDAsYy5pc05hbWUpKGgsIlhNTCIpKXRyeXtyPSgwLG8uc3RyaW5nVG9VVEY4U3RyaW5nKSgoMCxvLmJ5dGVzVG9TdHJpbmcpKGkuZ2V0Qnl0ZXMoKSkpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiB1Lk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7KDAsby5pbmZvKSgiU2tpcHBpbmcgaW52YWxpZCBtZXRhZGF0YS4iKX19cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsIm1ldGFkYXRhIixyKX19LHtrZXk6InRvcGxldmVsUGFnZXNEaWN0IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9dGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VzIik7aWYoISgwLGMuaXNEaWN0KSh0KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeS4iKTtyZXR1cm4oMCxvLnNoYWRvdykodGhpcywidG9wbGV2ZWxQYWdlc0RpY3QiLHQpfX0se2tleToiZG9jdW1lbnRPdXRsaW5lIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9bnVsbDt0cnl7dD10aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCl9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIHUuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgdDsoMCxvLndhcm4pKCJVbmFibGUgdG8gcmVhZCBkb2N1bWVudCBvdXRsaW5lLiIpfXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJkb2N1bWVudE91dGxpbmUiLHQpfX0se2tleToicGVybWlzc2lvbnMiLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD1udWxsO3RyeXt0PXRoaXMuX3JlYWRQZXJtaXNzaW9ucygpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiB1Lk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7KDAsby53YXJuKSgiVW5hYmxlIHRvIHJlYWQgcGVybWlzc2lvbnMuIil9cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsInBlcm1pc3Npb25zIix0KX19LHtrZXk6Im9wdGlvbmFsQ29udGVudENvbmZpZyIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PW51bGw7dHJ5e3ZhciByPXRoaXMuX2NhdERpY3QuZ2V0KCJPQ1Byb3BlcnRpZXMiKTtpZighcilyZXR1cm4oMCxvLnNoYWRvdykodGhpcywib3B0aW9uYWxDb250ZW50Q29uZmlnIixudWxsKTt2YXIgYT1yLmdldCgiRCIpO2lmKCFhKXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJvcHRpb25hbENvbnRlbnRDb25maWciLG51bGwpO3ZhciBpPXIuZ2V0KCJPQ0dzIik7aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsIm9wdGlvbmFsQ29udGVudENvbmZpZyIsbnVsbCk7dmFyIGwsaD1bXSxkPVtdLHA9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaSk7dHJ5e2ZvcihwLnMoKTshKGw9cC5uKCkpLmRvbmU7KXt2YXIgbT1sLnZhbHVlO2lmKCgwLGMuaXNSZWYpKG0pKXtkLnB1c2gobSk7dmFyIGc9dGhpcy54cmVmLmZldGNoSWZSZWYobSk7aC5wdXNoKHtpZDptLnRvU3RyaW5nKCksbmFtZTooMCxvLmlzU3RyaW5nKShnLmdldCgiTmFtZSIpKT8oMCxvLnN0cmluZ1RvUERGU3RyaW5nKShnLmdldCgiTmFtZSIpKTpudWxsLGludGVudDooMCxvLmlzU3RyaW5nKShnLmdldCgiSW50ZW50IikpPygwLG8uc3RyaW5nVG9QREZTdHJpbmcpKGcuZ2V0KCJJbnRlbnQiKSk6bnVsbH0pfX19Y2F0Y2godCl7cC5lKHQpfWZpbmFsbHl7cC5mKCl9KHQ9dGhpcy5fcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhhLGQpKS5ncm91cHM9aH1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgdS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyB0OygwLG8ud2FybikoIlVuYWJsZSB0byByZWFkIG9wdGlvbmFsIGNvbnRlbnQgY29uZmlnOiAiLmNvbmNhdCh0KSl9cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsIm9wdGlvbmFsQ29udGVudENvbmZpZyIsdCl9fSx7a2V5OiJudW1QYWdlcyIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXRoaXMudG9wbGV2ZWxQYWdlc0RpY3QuZ2V0KCJDb3VudCIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJQYWdlIGNvdW50IGluIHRvcC1sZXZlbCBwYWdlcyBkaWN0aW9uYXJ5IGlzIG5vdCBhbiBpbnRlZ2VyLiIpO3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJudW1QYWdlcyIsdCl9fSx7a2V5OiJkZXN0aW5hdGlvbnMiLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD10aGlzLl9yZWFkRGVzdHMoKSxyPU9iamVjdC5jcmVhdGUobnVsbCk7aWYodCBpbnN0YW5jZW9mIGIpe3ZhciBhPXQuZ2V0QWxsKCk7Zm9yKHZhciBpIGluIGEpcltpXT1mZXRjaERlc3RpbmF0aW9uKGFbaV0pfWVsc2UgdCBpbnN0YW5jZW9mIGMuRGljdCYmdC5mb3JFYWNoKChmdW5jdGlvbih0LGEpe2EmJihyW3RdPWZldGNoRGVzdGluYXRpb24oYSkpfSkpO3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJkZXN0aW5hdGlvbnMiLHIpfX0se2tleToicGFnZUxhYmVscyIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PW51bGw7dHJ5e3Q9dGhpcy5fcmVhZFBhZ2VMYWJlbHMoKX1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgdS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyB0OygwLG8ud2FybikoIlVuYWJsZSB0byByZWFkIHBhZ2UgbGFiZWxzLiIpfXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJwYWdlTGFiZWxzIix0KX19LHtrZXk6InBhZ2VMYXlvdXQiLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD10aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpLHI9IiI7aWYoKDAsYy5pc05hbWUpKHQpKXN3aXRjaCh0Lm5hbWUpe2Nhc2UiU2luZ2xlUGFnZSI6Y2FzZSJPbmVDb2x1bW4iOmNhc2UiVHdvQ29sdW1uTGVmdCI6Y2FzZSJUd29Db2x1bW5SaWdodCI6Y2FzZSJUd29QYWdlTGVmdCI6Y2FzZSJUd29QYWdlUmlnaHQiOnI9dC5uYW1lfXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJwYWdlTGF5b3V0IixyKX19LHtrZXk6InBhZ2VNb2RlIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9dGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VNb2RlIikscj0iVXNlTm9uZSI7aWYoKDAsYy5pc05hbWUpKHQpKXN3aXRjaCh0Lm5hbWUpe2Nhc2UiVXNlTm9uZSI6Y2FzZSJVc2VPdXRsaW5lcyI6Y2FzZSJVc2VUaHVtYnMiOmNhc2UiRnVsbFNjcmVlbiI6Y2FzZSJVc2VPQyI6Y2FzZSJVc2VBdHRhY2htZW50cyI6cj10Lm5hbWV9cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsInBhZ2VNb2RlIixyKX19LHtrZXk6InZpZXdlclByZWZlcmVuY2VzIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9dGhpcyxyPXtIaWRlVG9vbGJhcjpvLmlzQm9vbCxIaWRlTWVudWJhcjpvLmlzQm9vbCxIaWRlV2luZG93VUk6by5pc0Jvb2wsRml0V2luZG93Om8uaXNCb29sLENlbnRlcldpbmRvdzpvLmlzQm9vbCxEaXNwbGF5RG9jVGl0bGU6by5pc0Jvb2wsTm9uRnVsbFNjcmVlblBhZ2VNb2RlOmMuaXNOYW1lLERpcmVjdGlvbjpjLmlzTmFtZSxWaWV3QXJlYTpjLmlzTmFtZSxWaWV3Q2xpcDpjLmlzTmFtZSxQcmludEFyZWE6Yy5pc05hbWUsUHJpbnRDbGlwOmMuaXNOYW1lLFByaW50U2NhbGluZzpjLmlzTmFtZSxEdXBsZXg6Yy5pc05hbWUsUGlja1RyYXlCeVBERlNpemU6by5pc0Jvb2wsUHJpbnRQYWdlUmFuZ2U6QXJyYXkuaXNBcnJheSxOdW1Db3BpZXM6TnVtYmVyLmlzSW50ZWdlcn0sYT10aGlzLl9jYXREaWN0LmdldCgiVmlld2VyUHJlZmVyZW5jZXMiKSxpPW51bGw7aWYoKDAsYy5pc0RpY3QpKGEpKWZvcih2YXIgbCBpbiByKWlmKGEuaGFzKGwpKXt2YXIgdT1hLmdldChsKTtpZihyW2xdKHUpKXt2YXIgaD12b2lkIDA7c3dpdGNoKGwpe2Nhc2UiTm9uRnVsbFNjcmVlblBhZ2VNb2RlIjpzd2l0Y2godS5uYW1lKXtjYXNlIlVzZU5vbmUiOmNhc2UiVXNlT3V0bGluZXMiOmNhc2UiVXNlVGh1bWJzIjpjYXNlIlVzZU9DIjpoPXUubmFtZTticmVhaztkZWZhdWx0Omg9IlVzZU5vbmUifWJyZWFrO2Nhc2UiRGlyZWN0aW9uIjpzd2l0Y2godS5uYW1lKXtjYXNlIkwyUiI6Y2FzZSJSMkwiOmg9dS5uYW1lO2JyZWFrO2RlZmF1bHQ6aD0iTDJSIn1icmVhaztjYXNlIlZpZXdBcmVhIjpjYXNlIlZpZXdDbGlwIjpjYXNlIlByaW50QXJlYSI6Y2FzZSJQcmludENsaXAiOnN3aXRjaCh1Lm5hbWUpe2Nhc2UiTWVkaWFCb3giOmNhc2UiQ3JvcEJveCI6Y2FzZSJCbGVlZEJveCI6Y2FzZSJUcmltQm94IjpjYXNlIkFydEJveCI6aD11Lm5hbWU7YnJlYWs7ZGVmYXVsdDpoPSJDcm9wQm94In1icmVhaztjYXNlIlByaW50U2NhbGluZyI6c3dpdGNoKHUubmFtZSl7Y2FzZSJOb25lIjpjYXNlIkFwcERlZmF1bHQiOmg9dS5uYW1lO2JyZWFrO2RlZmF1bHQ6aD0iQXBwRGVmYXVsdCJ9YnJlYWs7Y2FzZSJEdXBsZXgiOnN3aXRjaCh1Lm5hbWUpe2Nhc2UiU2ltcGxleCI6Y2FzZSJEdXBsZXhGbGlwU2hvcnRFZGdlIjpjYXNlIkR1cGxleEZsaXBMb25nRWRnZSI6aD11Lm5hbWU7YnJlYWs7ZGVmYXVsdDpoPSJOb25lIn1icmVhaztjYXNlIlByaW50UGFnZVJhbmdlIjppZih1Lmxlbmd0aCUyIT0wKWJyZWFrO3UuZXZlcnkoKGZ1bmN0aW9uKHIsYSxpKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihyKSYmcj4wJiYoMD09PWF8fHI+PWlbYS0xXSkmJnI8PXQubnVtUGFnZXN9KSkmJihoPXUpO2JyZWFrO2Nhc2UiTnVtQ29waWVzIjp1PjAmJihoPXUpO2JyZWFrO2RlZmF1bHQ6aWYoImJvb2xlYW4iIT10eXBlb2YgdSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigidmlld2VyUHJlZmVyZW5jZXMgLSBleHBlY3RlZCBhIGJvb2xlYW4gdmFsdWUgZm9yOiAiLmNvbmNhdChsKSk7aD11fWlmKHZvaWQgMCE9PWgpe2l8fChpPU9iamVjdC5jcmVhdGUobnVsbCkpO2lbbF09aH1lbHNlKDAsby5pbmZvKSgnQmFkIHZhbHVlIGluIFZpZXdlclByZWZlcmVuY2VzIGZvciAiJy5jb25jYXQobCwnIi4nKSl9ZWxzZSgwLG8uaW5mbykoJ0JhZCB2YWx1ZSBpbiBWaWV3ZXJQcmVmZXJlbmNlcyBmb3IgIicuY29uY2F0KGwsJyIuJykpfXJldHVybigwLG8uc2hhZG93KSh0aGlzLCJ2aWV3ZXJQcmVmZXJlbmNlcyIsaSl9fSx7a2V5OiJvcGVuQWN0aW9uIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIHQ9dGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKSxyPW51bGw7aWYoKDAsYy5pc0RpY3QpKHQpKXt2YXIgYT1uZXcgYy5EaWN0KHRoaXMueHJlZik7YS5zZXQoIkEiLHQpO3ZhciBpPXt1cmw6bnVsbCxkZXN0Om51bGwsYWN0aW9uOm51bGx9O0NhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7ZGVzdERpY3Q6YSxyZXN1bHRPYmo6aX0pO2lmKEFycmF5LmlzQXJyYXkoaS5kZXN0KSl7cnx8KHI9T2JqZWN0LmNyZWF0ZShudWxsKSk7ci5kZXN0PWkuZGVzdH1lbHNlIGlmKGkuYWN0aW9uKXtyfHwocj1PYmplY3QuY3JlYXRlKG51bGwpKTtyLmFjdGlvbj1pLmFjdGlvbn19ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXtyfHwocj1PYmplY3QuY3JlYXRlKG51bGwpKTtyLmRlc3Q9dH1yZXR1cm4oMCxvLnNoYWRvdykodGhpcywib3BlbkFjdGlvbiIscil9fSx7a2V5OiJhdHRhY2htZW50cyIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PXRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpLHI9bnVsbDtpZih0JiZ0LmhhcygiRW1iZWRkZWRGaWxlcyIpKXt2YXIgYT1uZXcgYih0LmdldFJhdygiRW1iZWRkZWRGaWxlcyIpLHRoaXMueHJlZikuZ2V0QWxsKCk7Zm9yKHZhciBpIGluIGEpe3ZhciBjPW5ldyBTKGFbaV0sdGhpcy54cmVmKTtyfHwocj1PYmplY3QuY3JlYXRlKG51bGwpKTtyWygwLG8uc3RyaW5nVG9QREZTdHJpbmcpKGkpXT1jLnNlcmlhbGl6YWJsZX19cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsImF0dGFjaG1lbnRzIixyKX19LHtrZXk6ImphdmFTY3JpcHQiLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD10aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKSxyPW51bGw7ZnVuY3Rpb24gYXBwZW5kSWZKYXZhU2NyaXB0RGljdCh0KXt2YXIgYT10LmdldCgiUyIpO2lmKCgwLGMuaXNOYW1lKShhLCJKYXZhU2NyaXB0Iikpe3ZhciBpPXQuZ2V0KCJKUyIpO2lmKCgwLGMuaXNTdHJlYW0pKGkpKWk9KDAsby5ieXRlc1RvU3RyaW5nKShpLmdldEJ5dGVzKCkpO2Vsc2UgaWYoISgwLG8uaXNTdHJpbmcpKGkpKXJldHVybjtyfHwocj1bXSk7ci5wdXNoKCgwLG8uc3RyaW5nVG9QREZTdHJpbmcpKGkpKX19aWYodCYmdC5oYXMoIkphdmFTY3JpcHQiKSl7dmFyIGE9bmV3IGIodC5nZXRSYXcoIkphdmFTY3JpcHQiKSx0aGlzLnhyZWYpLmdldEFsbCgpO2Zvcih2YXIgaSBpbiBhKXt2YXIgbD1hW2ldOygwLGMuaXNEaWN0KShsKSYmYXBwZW5kSWZKYXZhU2NyaXB0RGljdChsKX19dmFyIHU9dGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTsoMCxjLmlzRGljdCkodSkmJigwLGMuaXNOYW1lKSh1LmdldCgiUyIpLCJKYXZhU2NyaXB0IikmJmFwcGVuZElmSmF2YVNjcmlwdERpY3QodSk7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsImphdmFTY3JpcHQiLHIpfX1dLFt7a2V5OiJwYXJzZURlc3REaWN0aW9uYXJ5Iix2YWx1ZTpmdW5jdGlvbiBwYXJzZURlc3REaWN0aW9uYXJ5KHQpe3ZhciByPXQuZGVzdERpY3Q7aWYoKDAsYy5pc0RpY3QpKHIpKXt2YXIgYT10LnJlc3VsdE9iajtpZigib2JqZWN0Ij09PV90eXBlb2YoYSkpe3ZhciBpLGwsdT10LmRvY0Jhc2VVcmx8fG51bGwsaD1yLmdldCgiQSIpOyEoMCxjLmlzRGljdCkoaCkmJnIuaGFzKCJEZXN0IikmJihoPXIuZ2V0KCJEZXN0IikpO2lmKCgwLGMuaXNEaWN0KShoKSl7dmFyIGQ9aC5nZXQoIlMiKTtpZighKDAsYy5pc05hbWUpKGQpKXsoMCxvLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBJbnZhbGlkIHR5cGUgaW4gQWN0aW9uIGRpY3Rpb25hcnkuIik7cmV0dXJufXZhciBwPWQubmFtZTtzd2l0Y2gocCl7Y2FzZSJVUkkiOmk9aC5nZXQoIlVSSSIpOygwLGMuaXNOYW1lKShpKT9pPSIvIitpLm5hbWU6KDAsby5pc1N0cmluZykoaSkmJihpPWZ1bmN0aW9uIGFkZERlZmF1bHRQcm90b2NvbFRvVXJsKHQpe3JldHVybiB0LnN0YXJ0c1dpdGgoInd3dy4iKT8iaHR0cDovLyIuY29uY2F0KHQpOnR9KGkpKTticmVhaztjYXNlIkdvVG8iOmw9aC5nZXQoIkQiKTticmVhaztjYXNlIkxhdW5jaCI6Y2FzZSJHb1RvUiI6dmFyIG09aC5nZXQoIkYiKTsoMCxjLmlzRGljdCkobSk/aT1tLmdldCgiRiIpfHxudWxsOigwLG8uaXNTdHJpbmcpKG0pJiYoaT1tKTt2YXIgZz1oLmdldCgiRCIpO2lmKGcpeygwLGMuaXNOYW1lKShnKSYmKGc9Zy5uYW1lKTtpZigoMCxvLmlzU3RyaW5nKShpKSl7dmFyIHk9aS5zcGxpdCgiIyIpWzBdOygwLG8uaXNTdHJpbmcpKGcpP2k9eSsiIyIrZzpBcnJheS5pc0FycmF5KGcpJiYoaT15KyIjIitKU09OLnN0cmluZ2lmeShnKSl9fXZhciBiPWguZ2V0KCJOZXdXaW5kb3ciKTsoMCxvLmlzQm9vbCkoYikmJihhLm5ld1dpbmRvdz1iKTticmVhaztjYXNlIk5hbWVkIjp2YXIgdj1oLmdldCgiTiIpOygwLGMuaXNOYW1lKSh2KSYmKGEuYWN0aW9uPXYubmFtZSk7YnJlYWs7Y2FzZSJKYXZhU2NyaXB0Ijp2YXIgUyxrPWguZ2V0KCJKUyIpOygwLGMuaXNTdHJlYW0pKGspP1M9KDAsby5ieXRlc1RvU3RyaW5nKShrLmdldEJ5dGVzKCkpOigwLG8uaXNTdHJpbmcpKGspJiYoUz1rKTtpZihTKXt2YXIgdz1uZXcgUmVnRXhwKCJeXFxzKigiK1siYXBwLmxhdW5jaFVSTCIsIndpbmRvdy5vcGVuIl0uam9pbigifCIpLnNwbGl0KCIuIikuam9pbigiXFwuIikrIilcXCgoPzonfFwiKShbXidcIl0qKSg/Oid8XCIpKD86LFxccyooXFx3KylcXCl8XFwpKSIsImkiKS5leGVjKCgwLG8uc3RyaW5nVG9QREZTdHJpbmcpKFMpKTtpZih3JiZ3WzJdKXtpPXdbMl07InRydWUiPT09d1szXSYmImFwcC5sYXVuY2hVUkwiPT09d1sxXSYmKGEubmV3V2luZG93PSEwKTticmVha319ZGVmYXVsdDooMCxvLndhcm4pKCdwYXJzZURlc3REaWN0aW9uYXJ5OiB1bnN1cHBvcnRlZCBhY3Rpb24gdHlwZSAiJy5jb25jYXQocCwnIi4nKSl9fWVsc2Ugci5oYXMoIkRlc3QiKSYmKGw9ci5nZXQoIkRlc3QiKSk7aWYoKDAsby5pc1N0cmluZykoaSkpe2k9ZnVuY3Rpb24gdHJ5Q29udmVydFVybEVuY29kaW5nKHQpe3RyeXtyZXR1cm4oMCxvLnN0cmluZ1RvVVRGOFN0cmluZykodCl9Y2F0Y2gocil7cmV0dXJuIHR9fShpKTt2YXIgQz0oMCxvLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKGksdSk7QyYmKGEudXJsPUMuaHJlZik7YS51bnNhZmVVcmw9aX1pZihsKXsoMCxjLmlzTmFtZSkobCkmJihsPWwubmFtZSk7KCgwLG8uaXNTdHJpbmcpKGwpfHxBcnJheS5pc0FycmF5KGwpKSYmKGEuZGVzdD1sKX19ZWxzZSgwLG8ud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IGByZXN1bHRPYmpgIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2UoMCxvLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgZGVzdERpY3RgIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpfX1dKTtyZXR1cm4gQ2F0YWxvZ30oKTtyLkNhdGFsb2c9bTt2YXIgZz1mdW5jdGlvbiBYUmVmQ2xvc3VyZSgpe2Z1bmN0aW9uIFhSZWYodCxyKXt0aGlzLnN0cmVhbT10O3RoaXMucGRmTWFuYWdlcj1yO3RoaXMuZW50cmllcz1bXTt0aGlzLnhyZWZzdG1zPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5fY2FjaGVNYXA9bmV3IE1hcDt0aGlzLnN0YXRzPXtzdHJlYW1UeXBlczpPYmplY3QuY3JlYXRlKG51bGwpLGZvbnRUeXBlczpPYmplY3QuY3JlYXRlKG51bGwpfTt0aGlzLl9uZXdSZWZOdW09bnVsbH1YUmVmLnByb3RvdHlwZT17Z2V0TmV3UmVmOmZ1bmN0aW9uIFhSZWZfZ2V0TmV3UmVmKCl7bnVsbD09PXRoaXMuX25ld1JlZk51bSYmKHRoaXMuX25ld1JlZk51bT10aGlzLmVudHJpZXMubGVuZ3RoKTtyZXR1cm4gYy5SZWYuZ2V0KHRoaXMuX25ld1JlZk51bSsrLDApfSxyZXNldE5ld1JlZjpmdW5jdGlvbiBYUmVmX3Jlc2V0TmV3UmVmKCl7dGhpcy5fbmV3UmVmTnVtPW51bGx9LHNldFN0YXJ0WFJlZjpmdW5jdGlvbiBYUmVmX3NldFN0YXJ0WFJlZih0KXt0aGlzLnN0YXJ0WFJlZlF1ZXVlPVt0XX0scGFyc2U6ZnVuY3Rpb24gWFJlZl9wYXJzZSh0KXt2YXIgcixhLGk7aWYodCl7KDAsby53YXJuKSgiSW5kZXhpbmcgYWxsIFBERiBvYmplY3RzIik7cj10aGlzLmluZGV4T2JqZWN0cygpfWVsc2Ugcj10aGlzLnJlYWRYUmVmKCk7ci5hc3NpZ25YcmVmKHRoaXMpO3RoaXMudHJhaWxlcj1yO3RyeXthPXIuZ2V0KCJFbmNyeXB0Iil9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIHUuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgdDsoMCxvLndhcm4pKCdYUmVmLnBhcnNlIC0gSW52YWxpZCAiRW5jcnlwdCIgcmVmZXJlbmNlOiAiJy5jb25jYXQodCwnIi4nKSl9aWYoKDAsYy5pc0RpY3QpKGEpKXt2YXIgbD1yLmdldCgiSUQiKSxkPWwmJmwubGVuZ3RoP2xbMF06IiI7YS5zdXBwcmVzc0VuY3J5cHRpb249ITA7dGhpcy5lbmNyeXB0PW5ldyBoLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkoYSxkLHRoaXMucGRmTWFuYWdlci5wYXNzd29yZCl9dHJ5e2k9ci5nZXQoIlJvb3QiKX1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgdS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyB0OygwLG8ud2FybikoJ1hSZWYucGFyc2UgLSBJbnZhbGlkICJSb290IiByZWZlcmVuY2U6ICInLmNvbmNhdCh0LCciLicpKX1pZighKDAsYy5pc0RpY3QpKGkpfHwhaS5oYXMoIlBhZ2VzIikpe2lmKCF0KXRocm93IG5ldyB1LlhSZWZQYXJzZUV4Y2VwdGlvbjt0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCByb290IHJlZmVyZW5jZSIpfXRoaXMucm9vdD1pfSxwcm9jZXNzWFJlZlRhYmxlOmZ1bmN0aW9uIFhSZWZfcHJvY2Vzc1hSZWZUYWJsZSh0KXsidGFibGVTdGF0ZSJpbiB0aGlzfHwodGhpcy50YWJsZVN0YXRlPXtlbnRyeU51bTowLHN0cmVhbVBvczp0LmxleGVyLnN0cmVhbS5wb3MscGFyc2VyQnVmMTp0LmJ1ZjEscGFyc2VyQnVmMjp0LmJ1ZjJ9KTt2YXIgcj10aGlzLnJlYWRYUmVmVGFibGUodCk7aWYoISgwLGMuaXNDbWQpKHIsInRyYWlsZXIiKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgZmluZCB0cmFpbGVyIGRpY3Rpb25hcnkiKTt2YXIgYT10LmdldE9iaigpOyEoMCxjLmlzRGljdCkoYSkmJmEuZGljdCYmKGE9YS5kaWN0KTtpZighKDAsYy5pc0RpY3QpKGEpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBwYXJzZSB0cmFpbGVyIGRpY3Rpb25hcnkiKTtkZWxldGUgdGhpcy50YWJsZVN0YXRlO3JldHVybiBhfSxyZWFkWFJlZlRhYmxlOmZ1bmN0aW9uIFhSZWZfcmVhZFhSZWZUYWJsZSh0KXt2YXIgcixhPXQubGV4ZXIuc3RyZWFtLGk9dGhpcy50YWJsZVN0YXRlO2EucG9zPWkuc3RyZWFtUG9zO3QuYnVmMT1pLnBhcnNlckJ1ZjE7dC5idWYyPWkucGFyc2VyQnVmMjtmb3IoOzspe2lmKCEoImZpcnN0RW50cnlOdW0iaW4gaSl8fCEoImVudHJ5Q291bnQiaW4gaSkpe2lmKCgwLGMuaXNDbWQpKHI9dC5nZXRPYmooKSwidHJhaWxlciIpKWJyZWFrO2kuZmlyc3RFbnRyeU51bT1yO2kuZW50cnlDb3VudD10LmdldE9iaigpfXZhciBsPWkuZmlyc3RFbnRyeU51bSx1PWkuZW50cnlDb3VudDtpZighTnVtYmVyLmlzSW50ZWdlcihsKXx8IU51bWJlci5pc0ludGVnZXIodSkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogd3JvbmcgdHlwZXMgaW4gc3Vic2VjdGlvbiBoZWFkZXIiKTtmb3IodmFyIGg9aS5lbnRyeU51bTtoPHU7aCsrKXtpLnN0cmVhbVBvcz1hLnBvcztpLmVudHJ5TnVtPWg7aS5wYXJzZXJCdWYxPXQuYnVmMTtpLnBhcnNlckJ1ZjI9dC5idWYyO3ZhciBkPXt9O2Qub2Zmc2V0PXQuZ2V0T2JqKCk7ZC5nZW49dC5nZXRPYmooKTt2YXIgcD10LmdldE9iaigpO2lmKHAgaW5zdGFuY2VvZiBjLkNtZClzd2l0Y2gocC5jbWQpe2Nhc2UiZiI6ZC5mcmVlPSEwO2JyZWFrO2Nhc2UibiI6ZC51bmNvbXByZXNzZWQ9ITB9aWYoIU51bWJlci5pc0ludGVnZXIoZC5vZmZzZXQpfHwhTnVtYmVyLmlzSW50ZWdlcihkLmdlbil8fCFkLmZyZWUmJiFkLnVuY29tcHJlc3NlZCl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBlbnRyeSBpbiBYUmVmIHN1YnNlY3Rpb246ICIuY29uY2F0KGwsIiwgIikuY29uY2F0KHUpKTswPT09aCYmZC5mcmVlJiYxPT09bCYmKGw9MCk7dGhpcy5lbnRyaWVzW2grbF18fCh0aGlzLmVudHJpZXNbaCtsXT1kKX1pLmVudHJ5TnVtPTA7aS5zdHJlYW1Qb3M9YS5wb3M7aS5wYXJzZXJCdWYxPXQuYnVmMTtpLnBhcnNlckJ1ZjI9dC5idWYyO2RlbGV0ZSBpLmZpcnN0RW50cnlOdW07ZGVsZXRlIGkuZW50cnlDb3VudH1pZih0aGlzLmVudHJpZXNbMF0mJiF0aGlzLmVudHJpZXNbMF0uZnJlZSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiB1bmV4cGVjdGVkIGZpcnN0IG9iamVjdCIpO3JldHVybiByfSxwcm9jZXNzWFJlZlN0cmVhbTpmdW5jdGlvbiBYUmVmX3Byb2Nlc3NYUmVmU3RyZWFtKHQpe2lmKCEoInN0cmVhbVN0YXRlImluIHRoaXMpKXt2YXIgcj10LmRpY3QsYT1yLmdldCgiVyIpLGk9ci5nZXQoIkluZGV4Iik7aXx8KGk9WzAsci5nZXQoIlNpemUiKV0pO3RoaXMuc3RyZWFtU3RhdGU9e2VudHJ5UmFuZ2VzOmksYnl0ZVdpZHRoczphLGVudHJ5TnVtOjAsc3RyZWFtUG9zOnQucG9zfX10aGlzLnJlYWRYUmVmU3RyZWFtKHQpO2RlbGV0ZSB0aGlzLnN0cmVhbVN0YXRlO3JldHVybiB0LmRpY3R9LHJlYWRYUmVmU3RyZWFtOmZ1bmN0aW9uIFhSZWZfcmVhZFhSZWZTdHJlYW0odCl7dmFyIHIsYSxpPXRoaXMuc3RyZWFtU3RhdGU7dC5wb3M9aS5zdHJlYW1Qb3M7Zm9yKHZhciBjPWkuYnl0ZVdpZHRocyxsPWNbMF0sdT1jWzFdLGg9Y1syXSxkPWkuZW50cnlSYW5nZXM7ZC5sZW5ndGg+MDspe3ZhciBwPWRbMF0sbT1kWzFdO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHApfHwhTnVtYmVyLmlzSW50ZWdlcihtKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogIi5jb25jYXQocCwiLCAiKS5jb25jYXQobSkpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGwpfHwhTnVtYmVyLmlzSW50ZWdlcih1KXx8IU51bWJlci5pc0ludGVnZXIoaCkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAiLmNvbmNhdChwLCIsICIpLmNvbmNhdChtKSk7Zm9yKHI9aS5lbnRyeU51bTtyPG07KytyKXtpLmVudHJ5TnVtPXI7aS5zdHJlYW1Qb3M9dC5wb3M7dmFyIGc9MCx5PTAsYj0wO2ZvcihhPTA7YTxsOysrYSlnPWc8PDh8dC5nZXRCeXRlKCk7MD09PWwmJihnPTEpO2ZvcihhPTA7YTx1OysrYSl5PXk8PDh8dC5nZXRCeXRlKCk7Zm9yKGE9MDthPGg7KythKWI9Yjw8OHx0LmdldEJ5dGUoKTt2YXIgdj17fTt2Lm9mZnNldD15O3YuZ2VuPWI7c3dpdGNoKGcpe2Nhc2UgMDp2LmZyZWU9ITA7YnJlYWs7Y2FzZSAxOnYudW5jb21wcmVzc2VkPSEwO2JyZWFrO2Nhc2UgMjpicmVhaztkZWZhdWx0OnRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgZW50cnkgdHlwZTogIi5jb25jYXQoZykpfXRoaXMuZW50cmllc1twK3JdfHwodGhpcy5lbnRyaWVzW3Arcl09dil9aS5lbnRyeU51bT0wO2kuc3RyZWFtUG9zPXQucG9zO2Quc3BsaWNlKDAsMil9fSxpbmRleE9iamVjdHM6ZnVuY3Rpb24gWFJlZl9pbmRleE9iamVjdHMoKXtmdW5jdGlvbiByZWFkVG9rZW4odCxyKXtmb3IodmFyIGE9IiIsaT10W3JdOzEwIT09aSYmMTMhPT1pJiY2MCE9PWkmJiEoKytyPj10Lmxlbmd0aCk7KXthKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpO2k9dFtyXX1yZXR1cm4gYX1mdW5jdGlvbiBza2lwVW50aWwodCxyLGEpe2Zvcih2YXIgaT1hLmxlbmd0aCxvPXQubGVuZ3RoLGM9MDtyPG87KXtmb3IodmFyIGw9MDtsPGkmJnRbcitsXT09PWFbbF07KSsrbDtpZihsPj1pKWJyZWFrO3IrKztjKyt9cmV0dXJuIGN9dmFyIHQ9L14oXGQrKVxzKyhcZCspXHMrb2JqXGIvLHI9L1xiZW5kb2JqW1xiXHNdJC8sYT0vXHMrKFxkK1xzK1xkK1xzK29ialtcYlxzPF0pJC8saT1uZXcgVWludDhBcnJheShbMTE2LDExNCw5NywxMDUsMTA4LDEwMSwxMTRdKSxoPW5ldyBVaW50OEFycmF5KFsxMTUsMTE2LDk3LDExNCwxMTYsMTIwLDExNCwxMDEsMTAyXSksZD1uZXcgVWludDhBcnJheShbMTExLDk4LDEwNl0pLHA9bmV3IFVpbnQ4QXJyYXkoWzQ3LDg4LDgyLDEwMSwxMDJdKTt0aGlzLmVudHJpZXMubGVuZ3RoPTA7dmFyIG09dGhpcy5zdHJlYW07bS5wb3M9MDtmb3IodmFyIGcseSxiLHY9bS5nZXRCeXRlcygpLFM9bS5zdGFydCxrPXYubGVuZ3RoLHc9W10sQz1bXTtTPGs7KXt2YXIgXz12W1NdO2lmKDkhPT1fJiYxMCE9PV8mJjEzIT09XyYmMzIhPT1fKWlmKDM3IT09Xyl7dmFyIHgsQT1yZWFkVG9rZW4odixTKTtpZihBLnN0YXJ0c1dpdGgoInhyZWYiKSYmKDQ9PT1BLmxlbmd0aHx8L1xzLy50ZXN0KEFbNF0pKSl7Uys9c2tpcFVudGlsKHYsUyxpKTt3LnB1c2goUyk7Uys9c2tpcFVudGlsKHYsUyxoKX1lbHNlIGlmKHg9dC5leGVjKEEpKXt2YXIgVD0wfHhbMV0sUj0wfHhbMl07dGhpcy5lbnRyaWVzW1RdJiZ0aGlzLmVudHJpZXNbVF0uZ2VuIT09Unx8KHRoaXMuZW50cmllc1tUXT17b2Zmc2V0OlMtbS5zdGFydCxnZW46Uix1bmNvbXByZXNzZWQ6ITB9KTtmb3IodmFyIEk9dm9pZCAwLFA9UytBLmxlbmd0aDtQPHYubGVuZ3RoOyl7dmFyIE89UCtza2lwVW50aWwodixQLGQpKzQ7ST1PLVM7dmFyIEU9TWF0aC5tYXgoTy0yNSxQKSxCPSgwLG8uYnl0ZXNUb1N0cmluZykodi5zdWJhcnJheShFLE8pKTtpZihyLnRlc3QoQikpYnJlYWs7dmFyIEQ9YS5leGVjKEIpO2lmKEQmJkRbMV0peygwLG8ud2FybikoJ2luZGV4T2JqZWN0czogRm91bmQgbmV3ICJvYmoiIGluc2lkZSBvZiBhbm90aGVyICJvYmoiLCBjYXVzZWQgYnkgbWlzc2luZyAiZW5kb2JqIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTtJLT1EWzFdLmxlbmd0aDticmVha31QPU99dmFyIE09di5zdWJhcnJheShTLFMrSSksTD1za2lwVW50aWwoTSwwLHApO2lmKEw8SSYmTVtMKzVdPDY0KXtDLnB1c2goUy1tLnN0YXJ0KTt0aGlzLnhyZWZzdG1zW1MtbS5zdGFydF09MX1TKz1JfWVsc2UgaWYoQS5zdGFydHNXaXRoKCJ0cmFpbGVyIikmJig3PT09QS5sZW5ndGh8fC9ccy8udGVzdChBWzddKSkpe3cucHVzaChTKTtTKz1za2lwVW50aWwodixTLGgpfWVsc2UgUys9QS5sZW5ndGgrMX1lbHNlIGRve2lmKCsrUz49aylicmVhaztfPXZbU119d2hpbGUoMTAhPT1fJiYxMyE9PV8pO2Vsc2UrK1N9Zm9yKGc9MCx5PUMubGVuZ3RoO2c8eTsrK2cpe3RoaXMuc3RhcnRYUmVmUXVldWUucHVzaChDW2ddKTt0aGlzLnJlYWRYUmVmKCEwKX1mb3IoZz0wLHk9dy5sZW5ndGg7Zzx5OysrZyl7bS5wb3M9d1tnXTt2YXIgTj1uZXcgbC5QYXJzZXIoe2xleGVyOm5ldyBsLkxleGVyKG0pLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITAscmVjb3ZlcnlNb2RlOiEwfSksVT1OLmdldE9iaigpO2lmKCgwLGMuaXNDbWQpKFUsInRyYWlsZXIiKSl7dmFyIGo9Ti5nZXRPYmooKTtpZigoMCxjLmlzRGljdCkoaikpe3ZhciBxPXZvaWQgMDt0cnl7cT1qLmdldCgiUm9vdCIpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiB1Lk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7Y29udGludWV9aWYoKDAsYy5pc0RpY3QpKHEpJiZxLmhhcygiUGFnZXMiKSl7aWYoai5oYXMoIklEIikpcmV0dXJuIGo7Yj1qfX19fWlmKGIpcmV0dXJuIGI7dGhyb3cgbmV3IG8uSW52YWxpZFBERkV4Y2VwdGlvbigiSW52YWxpZCBQREYgc3RydWN0dXJlLiIpfSxyZWFkWFJlZjpmdW5jdGlvbiBYUmVmX3JlYWRYUmVmKHQpe3ZhciByPXRoaXMuc3RyZWFtLGE9T2JqZWN0LmNyZWF0ZShudWxsKTt0cnl7Zm9yKDt0aGlzLnN0YXJ0WFJlZlF1ZXVlLmxlbmd0aDspe3ZhciBpPXRoaXMuc3RhcnRYUmVmUXVldWVbMF07aWYoYVtpXSl7KDAsby53YXJuKSgicmVhZFhSZWYgLSBza2lwcGluZyBYUmVmIHRhYmxlIHNpbmNlIGl0IHdhcyBhbHJlYWR5IHBhcnNlZC4iKTt0aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCl9ZWxzZXthW2ldPSEwO3IucG9zPWkrci5zdGFydDt2YXIgaCxkPW5ldyBsLlBhcnNlcih7bGV4ZXI6bmV3IGwuTGV4ZXIocikseHJlZjp0aGlzLGFsbG93U3RyZWFtczohMH0pLHA9ZC5nZXRPYmooKTtpZigoMCxjLmlzQ21kKShwLCJ4cmVmIikpe2g9dGhpcy5wcm9jZXNzWFJlZlRhYmxlKGQpO3RoaXMudG9wRGljdHx8KHRoaXMudG9wRGljdD1oKTtwPWguZ2V0KCJYUmVmU3RtIik7aWYoTnVtYmVyLmlzSW50ZWdlcihwKSl7dmFyIG09cDtpZighKG0gaW4gdGhpcy54cmVmc3Rtcykpe3RoaXMueHJlZnN0bXNbbV09MTt0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gobSl9fX1lbHNle2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHApKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgc3RyZWFtIGhlYWRlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGQuZ2V0T2JqKCkpfHwhKDAsYy5pc0NtZCkoZC5nZXRPYmooKSwib2JqIil8fCEoMCxjLmlzU3RyZWFtKShwPWQuZ2V0T2JqKCkpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgc3RyZWFtIik7aD10aGlzLnByb2Nlc3NYUmVmU3RyZWFtKHApO3RoaXMudG9wRGljdHx8KHRoaXMudG9wRGljdD1oKTtpZighaCl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiRmFpbGVkIHRvIHJlYWQgWFJlZiBzdHJlYW0iKX1wPWguZ2V0KCJQcmV2Iik7TnVtYmVyLmlzSW50ZWdlcihwKT90aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gocCk6KDAsYy5pc1JlZikocCkmJnRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChwLm51bSk7dGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpfX1yZXR1cm4gdGhpcy50b3BEaWN0fWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiB1Lk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7KDAsby5pbmZvKSgiKHdoaWxlIHJlYWRpbmcgWFJlZik6ICIrdCl9aWYoIXQpdGhyb3cgbmV3IHUuWFJlZlBhcnNlRXhjZXB0aW9ufSxnZXRFbnRyeTpmdW5jdGlvbiBYUmVmX2dldEVudHJ5KHQpe3ZhciByPXRoaXMuZW50cmllc1t0XTtyZXR1cm4gciYmIXIuZnJlZSYmci5vZmZzZXQ/cjpudWxsfSxmZXRjaElmUmVmOmZ1bmN0aW9uIFhSZWZfZmV0Y2hJZlJlZih0LHIpe3JldHVybiB0IGluc3RhbmNlb2YgYy5SZWY/dGhpcy5mZXRjaCh0LHIpOnR9LGZldGNoOmZ1bmN0aW9uIFhSZWZfZmV0Y2godCxyKXtpZighKHQgaW5zdGFuY2VvZiBjLlJlZikpdGhyb3cgbmV3IEVycm9yKCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZSIpO3ZhciBhPXQubnVtLGk9dGhpcy5fY2FjaGVNYXAuZ2V0KGEpO2lmKHZvaWQgMCE9PWkpe2kgaW5zdGFuY2VvZiBjLkRpY3QmJiFpLm9iaklkJiYoaS5vYmpJZD10LnRvU3RyaW5nKCkpO3JldHVybiBpfXZhciBvPXRoaXMuZ2V0RW50cnkoYSk7aWYobnVsbD09PW8pe3RoaXMuX2NhY2hlTWFwLnNldChhLG8pO3JldHVybiBvfW89by51bmNvbXByZXNzZWQ/dGhpcy5mZXRjaFVuY29tcHJlc3NlZCh0LG8scik6dGhpcy5mZXRjaENvbXByZXNzZWQodCxvLHIpOygwLGMuaXNEaWN0KShvKT9vLm9iaklkPXQudG9TdHJpbmcoKTooMCxjLmlzU3RyZWFtKShvKSYmKG8uZGljdC5vYmpJZD10LnRvU3RyaW5nKCkpO3JldHVybiBvfSxmZXRjaFVuY29tcHJlc3NlZDpmdW5jdGlvbiBmZXRjaFVuY29tcHJlc3NlZCh0LHIpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0saT10LmdlbixvPXQubnVtO2lmKHIuZ2VuIT09aSl0aHJvdyBuZXcgdS5YUmVmRW50cnlFeGNlcHRpb24oIkluY29uc2lzdGVudCBnZW5lcmF0aW9uIGluIFhSZWY6ICIuY29uY2F0KHQpKTt2YXIgaD10aGlzLnN0cmVhbS5tYWtlU3ViU3RyZWFtKHIub2Zmc2V0K3RoaXMuc3RyZWFtLnN0YXJ0KSxkPW5ldyBsLlBhcnNlcih7bGV4ZXI6bmV3IGwuTGV4ZXIoaCkseHJlZjp0aGlzLGFsbG93U3RyZWFtczohMH0pLHA9ZC5nZXRPYmooKSxtPWQuZ2V0T2JqKCksZz1kLmdldE9iaigpO2lmKHAhPT1vfHxtIT09aXx8IShnIGluc3RhbmNlb2YgYy5DbWQpKXRocm93IG5ldyB1LlhSZWZFbnRyeUV4Y2VwdGlvbigiQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICIuY29uY2F0KHQpKTtpZigib2JqIiE9PWcuY21kKXtpZihnLmNtZC5zdGFydHNXaXRoKCJvYmoiKSl7bz1wYXJzZUludChnLmNtZC5zdWJzdHJpbmcoMyksMTApO2lmKCFOdW1iZXIuaXNOYU4obykpcmV0dXJuIG99dGhyb3cgbmV3IHUuWFJlZkVudHJ5RXhjZXB0aW9uKCJCYWQgKHVuY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogIi5jb25jYXQodCkpfXI9dGhpcy5lbmNyeXB0JiYhYT9kLmdldE9iaih0aGlzLmVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKG8saSkpOmQuZ2V0T2JqKCk7KDAsYy5pc1N0cmVhbSkocil8fHRoaXMuX2NhY2hlTWFwLnNldChvLHIpO3JldHVybiByfSxmZXRjaENvbXByZXNzZWQ6ZnVuY3Rpb24gZmV0Y2hDb21wcmVzc2VkKHQscil7dmFyIGE9ci5vZmZzZXQsaT10aGlzLmZldGNoKGMuUmVmLmdldChhLDApKTtpZighKDAsYy5pc1N0cmVhbSkoaSkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoImJhZCBPYmpTdG0gc3RyZWFtIik7dmFyIGg9aS5kaWN0LmdldCgiRmlyc3QiKSxkPWkuZGljdC5nZXQoIk4iKTtpZighTnVtYmVyLmlzSW50ZWdlcihoKXx8IU51bWJlci5pc0ludGVnZXIoZCkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoImludmFsaWQgZmlyc3QgYW5kIG4gcGFyYW1ldGVycyBmb3IgT2JqU3RtIHN0cmVhbSIpO2Zvcih2YXIgcD1uZXcgbC5QYXJzZXIoe2xleGVyOm5ldyBsLkxleGVyKGkpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KSxtPW5ldyBBcnJheShkKSxnPTA7ZzxkOysrZyl7dmFyIHk9cC5nZXRPYmooKTtpZighTnVtYmVyLmlzSW50ZWdlcih5KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiaW52YWxpZCBvYmplY3QgbnVtYmVyIGluIHRoZSBPYmpTdG0gc3RyZWFtOiAiLmNvbmNhdCh5KSk7dmFyIGI9cC5nZXRPYmooKTtpZighTnVtYmVyLmlzSW50ZWdlcihiKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiaW52YWxpZCBvYmplY3Qgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtOiAiLmNvbmNhdChiKSk7bVtnXT15fWZvcih2YXIgdj1uZXcgQXJyYXkoZCksUz0wO1M8ZDsrK1Mpe3ZhciBrPXAuZ2V0T2JqKCk7dltTXT1rO3AuYnVmMSBpbnN0YW5jZW9mIGMuQ21kJiYiZW5kb2JqIj09PXAuYnVmMS5jbWQmJnAuc2hpZnQoKTtpZighKDAsYy5pc1N0cmVhbSkoaykpe3ZhciB3PW1bU10sQz10aGlzLmVudHJpZXNbd107QyYmQy5vZmZzZXQ9PT1hJiZDLmdlbj09PVMmJnRoaXMuX2NhY2hlTWFwLnNldCh3LGspfX1pZih2b2lkIDA9PT0ocj12W3IuZ2VuXSkpdGhyb3cgbmV3IHUuWFJlZkVudHJ5RXhjZXB0aW9uKCJCYWQgKGNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICIuY29uY2F0KHQpKTtyZXR1cm4gcn0sZmV0Y2hJZlJlZkFzeW5jOmZ1bmN0aW9uIGZldGNoSWZSZWZBc3luYyh0LHIpe3ZhciBhPXRoaXM7cmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGkuZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlKCl7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlJChpKXtmb3IoOzspc3dpdGNoKGkucHJldj1pLm5leHQpe2Nhc2UgMDppZighKHQgaW5zdGFuY2VvZiBjLlJlZikpe2kubmV4dD0yO2JyZWFrfXJldHVybiBpLmFicnVwdCgicmV0dXJuIixhLmZldGNoQXN5bmModCxyKSk7Y2FzZSAyOnJldHVybiBpLmFicnVwdCgicmV0dXJuIix0KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19KSxfY2FsbGVlKX0pKSkoKX0sZmV0Y2hBc3luYzpmdW5jdGlvbiBmZXRjaEFzeW5jKHQscil7dmFyIGE9dGhpcztyZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUyKCl7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMiQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6aS5wcmV2PTA7cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLGEuZmV0Y2godCxyKSk7Y2FzZSA0OmkucHJldj00O2kudDA9aS5jYXRjaCgwKTtpZihpLnQwIGluc3RhbmNlb2YgdS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil7aS5uZXh0PTg7YnJlYWt9dGhyb3cgaS50MDtjYXNlIDg6aS5uZXh0PTEwO3JldHVybiBhLnBkZk1hbmFnZXIucmVxdWVzdFJhbmdlKGkudDAuYmVnaW4saS50MC5lbmQpO2Nhc2UgMTA6cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLGEuZmV0Y2hBc3luYyh0LHIpKTtjYXNlIDExOmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZTIsbnVsbCxbWzAsNF1dKX0pKSkoKX0sZ2V0Q2F0YWxvZ09iajpmdW5jdGlvbiBYUmVmX2dldENhdGFsb2dPYmooKXtyZXR1cm4gdGhpcy5yb290fX07cmV0dXJuIFhSZWZ9KCk7ci5YUmVmPWc7dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBOYW1lT3JOdW1iZXJUcmVlKHQscixhKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxOYW1lT3JOdW1iZXJUcmVlKTt0aGlzLmNvbnN0cnVjdG9yPT09TmFtZU9yTnVtYmVyVHJlZSYmKDAsby51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIE5hbWVPck51bWJlclRyZWUuIik7dGhpcy5yb290PXQ7dGhpcy54cmVmPXI7dGhpcy5fdHlwZT1hfV9jcmVhdGVDbGFzcyhOYW1lT3JOdW1iZXJUcmVlLFt7a2V5OiJnZXRBbGwiLHZhbHVlOmZ1bmN0aW9uIGdldEFsbCgpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIXRoaXMucm9vdClyZXR1cm4gdDt2YXIgcj10aGlzLnhyZWYsYT1uZXcgYy5SZWZTZXQ7YS5wdXQodGhpcy5yb290KTtmb3IodmFyIGk9W3RoaXMucm9vdF07aS5sZW5ndGg+MDspe3ZhciBsPXIuZmV0Y2hJZlJlZihpLnNoaWZ0KCkpO2lmKCgwLGMuaXNEaWN0KShsKSlpZihsLmhhcygiS2lkcyIpKWZvcih2YXIgdT1sLmdldCgiS2lkcyIpLGg9MCxkPXUubGVuZ3RoO2g8ZDtoKyspe3ZhciBwPXVbaF07aWYoYS5oYXMocCkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoJ0R1cGxpY2F0ZSBlbnRyeSBpbiAiJy5jb25jYXQodGhpcy5fdHlwZSwnIiB0cmVlLicpKTtpLnB1c2gocCk7YS5wdXQocCl9ZWxzZXt2YXIgbT1sLmdldCh0aGlzLl90eXBlKTtpZihBcnJheS5pc0FycmF5KG0pKWZvcih2YXIgZz0wLHk9bS5sZW5ndGg7Zzx5O2crPTIpdFtyLmZldGNoSWZSZWYobVtnXSldPXIuZmV0Y2hJZlJlZihtW2crMV0pfX1yZXR1cm4gdH19LHtrZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24gZ2V0KHQpe2lmKCF0aGlzLnJvb3QpcmV0dXJuIG51bGw7Zm9yKHZhciByPXRoaXMueHJlZixhPXIuZmV0Y2hJZlJlZih0aGlzLnJvb3QpLGk9MDthLmhhcygiS2lkcyIpOyl7aWYoKytpPjEwKXsoMCxvLndhcm4pKCdTZWFyY2ggZGVwdGggbGltaXQgcmVhY2hlZCBmb3IgIicuY29uY2F0KHRoaXMuX3R5cGUsJyIgdHJlZS4nKSk7cmV0dXJuIG51bGx9dmFyIGM9YS5nZXQoIktpZHMiKTtpZighQXJyYXkuaXNBcnJheShjKSlyZXR1cm4gbnVsbDtmb3IodmFyIGw9MCx1PWMubGVuZ3RoLTE7bDw9dTspe3ZhciBoPWwrdT4+MSxkPXIuZmV0Y2hJZlJlZihjW2hdKS5nZXQoIkxpbWl0cyIpO2lmKHQ8ci5mZXRjaElmUmVmKGRbMF0pKXU9aC0xO2Vsc2V7aWYoISh0PnIuZmV0Y2hJZlJlZihkWzFdKSkpe2E9ci5mZXRjaElmUmVmKGNbaF0pO2JyZWFrfWw9aCsxfX1pZihsPnUpcmV0dXJuIG51bGx9dmFyIHA9YS5nZXQodGhpcy5fdHlwZSk7aWYoQXJyYXkuaXNBcnJheShwKSl7Zm9yKHZhciBtPTAsZz1wLmxlbmd0aC0yO208PWc7KXt2YXIgeT1tK2c+PjEsYj15KygxJnkpLHY9ci5mZXRjaElmUmVmKHBbYl0pO2lmKHQ8dilnPWItMjtlbHNle2lmKCEodD52KSlyZXR1cm4gci5mZXRjaElmUmVmKHBbYisxXSk7bT1iKzJ9fSgwLG8uaW5mbykoJ0ZhbGxpbmcgYmFjayB0byBhbiBleGhhdXN0aXZlIHNlYXJjaCwgZm9yIGtleSAiJy5jb25jYXQodCwnIiwgJykrJ2luICInLmNvbmNhdCh0aGlzLl90eXBlLCciIHRyZWUuJykpO2Zvcih2YXIgUz0wLGs9cC5sZW5ndGg7UzxrO1MrPTIpe2lmKHIuZmV0Y2hJZlJlZihwW1NdKT09PXQpeygwLG8ud2FybikoJ1RoZSAiJy5jb25jYXQodCwnIiBrZXkgd2FzIGZvdW5kIGF0IGFuIGluY29ycmVjdCwgJykrJ2kuZS4gb3V0LW9mLW9yZGVyLCBwb3NpdGlvbiBpbiAiJy5jb25jYXQodGhpcy5fdHlwZSwnIiB0cmVlLicpKTtyZXR1cm4gci5mZXRjaElmUmVmKHBbUysxXSl9fX1yZXR1cm4gbnVsbH19XSk7cmV0dXJuIE5hbWVPck51bWJlclRyZWV9KCksYj1mdW5jdGlvbih0KXtfaW5oZXJpdHMoTmFtZVRyZWUsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKE5hbWVUcmVlKTtmdW5jdGlvbiBOYW1lVHJlZSh0LGEpe19jbGFzc0NhbGxDaGVjayh0aGlzLE5hbWVUcmVlKTtyZXR1cm4gci5jYWxsKHRoaXMsdCxhLCJOYW1lcyIpfXJldHVybiBOYW1lVHJlZX0oeSksdj1mdW5jdGlvbih0KXtfaW5oZXJpdHMoTnVtYmVyVHJlZSx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoTnVtYmVyVHJlZSk7ZnVuY3Rpb24gTnVtYmVyVHJlZSh0LGEpe19jbGFzc0NhbGxDaGVjayh0aGlzLE51bWJlclRyZWUpO3JldHVybiByLmNhbGwodGhpcyx0LGEsIk51bXMiKX1yZXR1cm4gTnVtYmVyVHJlZX0oeSksUz1mdW5jdGlvbiBGaWxlU3BlY0Nsb3N1cmUoKXtmdW5jdGlvbiBGaWxlU3BlYyh0LHIpe2lmKHQmJigwLGMuaXNEaWN0KSh0KSl7dGhpcy54cmVmPXI7dGhpcy5yb290PXQ7dC5oYXMoIkZTIikmJih0aGlzLmZzPXQuZ2V0KCJGUyIpKTt0aGlzLmRlc2NyaXB0aW9uPXQuaGFzKCJEZXNjIik/KDAsby5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIkRlc2MiKSk6IiI7dC5oYXMoIlJGIikmJigwLG8ud2FybikoIlJlbGF0ZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpO3RoaXMuY29udGVudEF2YWlsYWJsZT0hMDtpZighdC5oYXMoIkVGIikpe3RoaXMuY29udGVudEF2YWlsYWJsZT0hMTsoMCxvLndhcm4pKCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpfX19ZnVuY3Rpb24gcGlja1BsYXRmb3JtSXRlbSh0KXtyZXR1cm4gdC5oYXMoIlVGIik/dC5nZXQoIlVGIik6dC5oYXMoIkYiKT90LmdldCgiRiIpOnQuaGFzKCJVbml4Iik/dC5nZXQoIlVuaXgiKTp0LmhhcygiTWFjIik/dC5nZXQoIk1hYyIpOnQuaGFzKCJET1MiKT90LmdldCgiRE9TIik6bnVsbH1GaWxlU3BlYy5wcm90b3R5cGU9e2dldCBmaWxlbmFtZSgpe2lmKCF0aGlzLl9maWxlbmFtZSYmdGhpcy5yb290KXt2YXIgdD1waWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdCl8fCJ1bm5hbWVkIjt0aGlzLl9maWxlbmFtZT0oMCxvLnN0cmluZ1RvUERGU3RyaW5nKSh0KS5yZXBsYWNlKC9cXFxcL2csIlxcIikucmVwbGFjZSgvXFxcLy9nLCIvIikucmVwbGFjZSgvXFwvZywiLyIpfXJldHVybiB0aGlzLl9maWxlbmFtZX0sZ2V0IGNvbnRlbnQoKXtpZighdGhpcy5jb250ZW50QXZhaWxhYmxlKXJldHVybiBudWxsOyF0aGlzLmNvbnRlbnRSZWYmJnRoaXMucm9vdCYmKHRoaXMuY29udGVudFJlZj1waWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdC5nZXQoIkVGIikpKTt2YXIgdD1udWxsO2lmKHRoaXMuY29udGVudFJlZil7dmFyIHI9dGhpcy54cmVmLmZldGNoSWZSZWYodGhpcy5jb250ZW50UmVmKTtyJiYoMCxjLmlzU3RyZWFtKShyKT90PXIuZ2V0Qnl0ZXMoKTooMCxvLndhcm4pKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gcG9pbnRzIHRvIG5vbi1leGlzdGluZy9pbnZhbGlkIGNvbnRlbnQiKX1lbHNlKDAsby53YXJuKSgiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50Iik7cmV0dXJuIHR9LGdldCBzZXJpYWxpemFibGUoKXtyZXR1cm57ZmlsZW5hbWU6dGhpcy5maWxlbmFtZSxjb250ZW50OnRoaXMuY29udGVudH19fTtyZXR1cm4gRmlsZVNwZWN9KCk7ci5GaWxlU3BlYz1TO3ZhciBrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYWRkQ2hpbGRyZW4odCxyKXtpZih0IGluc3RhbmNlb2YgYy5EaWN0KXQ9dC5nZXRSYXdWYWx1ZXMoKTtlbHNlIGlmKCgwLGMuaXNTdHJlYW0pKHQpKXQ9dC5kaWN0LmdldFJhd1ZhbHVlcygpO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuO3ZhciBhLGksbz1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0KTt0cnl7Zm9yKG8ucygpOyEoYT1vLm4oKSkuZG9uZTspe3ZhciBsPWEudmFsdWU7KChpPWwpaW5zdGFuY2VvZiBjLlJlZnx8aSBpbnN0YW5jZW9mIGMuRGljdHx8QXJyYXkuaXNBcnJheShpKXx8KDAsYy5pc1N0cmVhbSkoaSkpJiZyLnB1c2gobCl9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX1mdW5jdGlvbiBPYmplY3RMb2FkZXIodCxyLGEpe3RoaXMuZGljdD10O3RoaXMua2V5cz1yO3RoaXMueHJlZj1hO3RoaXMucmVmU2V0PW51bGx9T2JqZWN0TG9hZGVyLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbiBsb2FkKCl7dmFyIHQ9dGhpcztyZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUzKCl7dmFyIHIsYSxvLGwsdSxoO3JldHVybiBpLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZTMkKGkpe2Zvcig7Oylzd2l0Y2goaS5wcmV2PWkubmV4dCl7Y2FzZSAwOmlmKHQueHJlZi5zdHJlYW0uYWxsQ2h1bmtzTG9hZGVkJiYhdC54cmVmLnN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSl7aS5uZXh0PTI7YnJlYWt9cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHZvaWQgMCk7Y2FzZSAyOnI9dC5rZXlzLGE9dC5kaWN0O3QucmVmU2V0PW5ldyBjLlJlZlNldDtvPVtdO2ZvcihsPTAsdT1yLmxlbmd0aDtsPHU7bCsrKXZvaWQgMCE9PShoPWEuZ2V0UmF3KHJbbF0pKSYmby5wdXNoKGgpO3JldHVybiBpLmFicnVwdCgicmV0dXJuIix0Ll93YWxrKG8pKTtjYXNlIDc6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19KSxfY2FsbGVlMyl9KSkpKCl9LF93YWxrOmZ1bmN0aW9uIF93YWxrKHQpe3ZhciByPXRoaXM7cmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGkuZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlNCgpe3ZhciBhLG8sbCxoLGQscCxtLGcseSxiLHY7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlNCQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6YT1bXTtvPVtdO2Nhc2UgMjppZighdC5sZW5ndGgpe2kubmV4dD0yMjticmVha31pZighKChsPXQucG9wKCkpaW5zdGFuY2VvZiBjLlJlZikpe2kubmV4dD0xODticmVha31pZighci5yZWZTZXQuaGFzKGwpKXtpLm5leHQ9NzticmVha31yZXR1cm4gaS5hYnJ1cHQoImNvbnRpbnVlIiwyKTtjYXNlIDc6aS5wcmV2PTc7ci5yZWZTZXQucHV0KGwpO2w9ci54cmVmLmZldGNoKGwpO2kubmV4dD0xODticmVhaztjYXNlIDEyOmkucHJldj0xMjtpLnQwPWkuY2F0Y2goNyk7aWYoaS50MCBpbnN0YW5jZW9mIHUuTWlzc2luZ0RhdGFFeGNlcHRpb24pe2kubmV4dD0xNjticmVha310aHJvdyBpLnQwO2Nhc2UgMTY6YS5wdXNoKGwpO28ucHVzaCh7YmVnaW46aS50MC5iZWdpbixlbmQ6aS50MC5lbmR9KTtjYXNlIDE4OmlmKGwmJmwuZ2V0QmFzZVN0cmVhbXMpe2g9bC5nZXRCYXNlU3RyZWFtcygpO2Q9ITE7Zm9yKHA9MCxtPWgubGVuZ3RoO3A8bTtwKyspaWYoKGc9aFtwXSkuYWxsQ2h1bmtzTG9hZGVkJiYhZy5hbGxDaHVua3NMb2FkZWQoKSl7ZD0hMDtvLnB1c2goe2JlZ2luOmcuc3RhcnQsZW5kOmcuZW5kfSl9ZCYmYS5wdXNoKGwpfWFkZENoaWxkcmVuKGwsdCk7aS5uZXh0PTI7YnJlYWs7Y2FzZSAyMjppZighby5sZW5ndGgpe2kubmV4dD0yNzticmVha31pLm5leHQ9MjU7cmV0dXJuIHIueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKG8pO2Nhc2UgMjU6Zm9yKHk9MCxiPWEubGVuZ3RoO3k8Yjt5KyspKHY9YVt5XSlpbnN0YW5jZW9mIGMuUmVmJiZyLnJlZlNldC5yZW1vdmUodik7cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHIuX3dhbGsoYSkpO2Nhc2UgMjc6ci5yZWZTZXQ9bnVsbDtyZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsdm9pZCAwKTtjYXNlIDI5OmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZTQsbnVsbCxbWzcsMTJdXSl9KSkpKCl9fTtyZXR1cm4gT2JqZWN0TG9hZGVyfSgpO3IuT2JqZWN0TG9hZGVyPWt9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuUGFyc2VyPXIuTGluZWFyaXphdGlvbj1yLkxleGVyPXZvaWQgMDt2YXIgaT1hKDIwOSksbz1hKDUpLGM9YSgyMDIpLGw9YSgyMDUpLHU9YSgyMTApLGg9YSgyMTIpLGQ9YSgyMTUpLHA9YSgyMTcpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBpPXJbYV07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITE7aS5jb25maWd1cmFibGU9ITA7InZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHQscixhKXtyJiZfZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSxyKTthJiZfZGVmaW5lUHJvcGVydGllcyh0LGEpO3JldHVybiB0fWZ1bmN0aW9uIGNvbXB1dGVBZGxlcjMyKHQpe2Zvcih2YXIgcj10Lmxlbmd0aCxhPTEsaT0wLG89MDtvPHI7KytvKWkrPWErPTI1NSZ0W29dO3JldHVybiBpJTY1NTIxPDwxNnxhJTY1NTIxfXZhciBtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUGFyc2VyKHQpe3ZhciByPXQubGV4ZXIsYT10LnhyZWYsaT10LmFsbG93U3RyZWFtcyxvPXZvaWQgMCE9PWkmJmksYz10LnJlY292ZXJ5TW9kZSxsPXZvaWQgMCE9PWMmJmM7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUGFyc2VyKTt0aGlzLmxleGVyPXI7dGhpcy54cmVmPWE7dGhpcy5hbGxvd1N0cmVhbXM9bzt0aGlzLnJlY292ZXJ5TW9kZT1sO3RoaXMuaW1hZ2VDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMucmVmaWxsKCl9X2NyZWF0ZUNsYXNzKFBhcnNlcixbe2tleToicmVmaWxsIix2YWx1ZTpmdW5jdGlvbiByZWZpbGwoKXt0aGlzLmJ1ZjE9dGhpcy5sZXhlci5nZXRPYmooKTt0aGlzLmJ1ZjI9dGhpcy5sZXhlci5nZXRPYmooKX19LHtrZXk6InNoaWZ0Iix2YWx1ZTpmdW5jdGlvbiBzaGlmdCgpe2lmKHRoaXMuYnVmMiBpbnN0YW5jZW9mIGMuQ21kJiYiSUQiPT09dGhpcy5idWYyLmNtZCl7dGhpcy5idWYxPXRoaXMuYnVmMjt0aGlzLmJ1ZjI9bnVsbH1lbHNle3RoaXMuYnVmMT10aGlzLmJ1ZjI7dGhpcy5idWYyPXRoaXMubGV4ZXIuZ2V0T2JqKCl9fX0se2tleToidHJ5U2hpZnQiLHZhbHVlOmZ1bmN0aW9uIHRyeVNoaWZ0KCl7dHJ5e3RoaXMuc2hpZnQoKTtyZXR1cm4hMH1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgbC5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyB0O3JldHVybiExfX19LHtrZXk6ImdldE9iaiIsdmFsdWU6ZnVuY3Rpb24gZ2V0T2JqKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGwscj10aGlzLmJ1ZjE7dGhpcy5zaGlmdCgpO2lmKHIgaW5zdGFuY2VvZiBjLkNtZClzd2l0Y2goci5jbWQpe2Nhc2UiQkkiOnJldHVybiB0aGlzLm1ha2VJbmxpbmVJbWFnZSh0KTtjYXNlIlsiOmZvcih2YXIgYT1bXTshKDAsYy5pc0NtZCkodGhpcy5idWYxLCJdIikmJiEoMCxjLmlzRU9GKSh0aGlzLmJ1ZjEpOylhLnB1c2godGhpcy5nZXRPYmoodCkpO2lmKCgwLGMuaXNFT0YpKHRoaXMuYnVmMSkpe2lmKCF0aGlzLnJlY292ZXJ5TW9kZSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiRW5kIG9mIGZpbGUgaW5zaWRlIGFycmF5Iik7cmV0dXJuIGF9dGhpcy5zaGlmdCgpO3JldHVybiBhO2Nhc2UiPDwiOmZvcih2YXIgaT1uZXcgYy5EaWN0KHRoaXMueHJlZik7ISgwLGMuaXNDbWQpKHRoaXMuYnVmMSwiPj4iKSYmISgwLGMuaXNFT0YpKHRoaXMuYnVmMSk7KWlmKCgwLGMuaXNOYW1lKSh0aGlzLmJ1ZjEpKXt2YXIgbD10aGlzLmJ1ZjEubmFtZTt0aGlzLnNoaWZ0KCk7aWYoKDAsYy5pc0VPRikodGhpcy5idWYxKSlicmVhaztpLnNldChsLHRoaXMuZ2V0T2JqKHQpKX1lbHNleygwLG8uaW5mbykoIk1hbGZvcm1lZCBkaWN0aW9uYXJ5OiBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7dGhpcy5zaGlmdCgpfWlmKCgwLGMuaXNFT0YpKHRoaXMuYnVmMSkpe2lmKCF0aGlzLnJlY292ZXJ5TW9kZSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiRW5kIG9mIGZpbGUgaW5zaWRlIGRpY3Rpb25hcnkiKTtyZXR1cm4gaX1pZigoMCxjLmlzQ21kKSh0aGlzLmJ1ZjIsInN0cmVhbSIpKXJldHVybiB0aGlzLmFsbG93U3RyZWFtcz90aGlzLm1ha2VTdHJlYW0oaSx0KTppO3RoaXMuc2hpZnQoKTtyZXR1cm4gaTtkZWZhdWx0OnJldHVybiByfWlmKE51bWJlci5pc0ludGVnZXIocikpe2lmKE51bWJlci5pc0ludGVnZXIodGhpcy5idWYxKSYmKDAsYy5pc0NtZCkodGhpcy5idWYyLCJSIikpe3ZhciB1PWMuUmVmLmdldChyLHRoaXMuYnVmMSk7dGhpcy5zaGlmdCgpO3RoaXMuc2hpZnQoKTtyZXR1cm4gdX1yZXR1cm4gcn1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHImJnQ/dC5kZWNyeXB0U3RyaW5nKHIpOnJ9fSx7a2V5OiJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCIsdmFsdWU6ZnVuY3Rpb24gZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQodCl7Zm9yKHZhciByLGEsaT10aGlzLmxleGVyLHU9dC5wb3MsaD0wOy0xIT09KHI9dC5nZXRCeXRlKCkpOylpZigwPT09aCloPTY5PT09cj8xOjA7ZWxzZSBpZigxPT09aCloPTczPT09cj8yOjA7ZWxzZXsoMCxvLmFzc2VydCkoMj09PWgsImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kIC0gaW52YWxpZCBzdGF0ZS4iKTtpZigzMj09PXJ8fDEwPT09cnx8MTM9PT1yKXthPXQucG9zO2Zvcih2YXIgZD10LnBlZWtCeXRlcygxMCkscD0wLG09ZC5sZW5ndGg7cDxtO3ArKylpZigoMCE9PShyPWRbcF0pfHwwPT09ZFtwKzFdKSYmMTAhPT1yJiYxMyE9PXImJihyPDMyfHxyPjEyNykpe2g9MDticmVha31pZigyIT09aCljb250aW51ZTtpZihpLmtub3duQ29tbWFuZHMpe3ZhciBnPWkucGVla09iaigpO2cgaW5zdGFuY2VvZiBjLkNtZCYmIWkua25vd25Db21tYW5kc1tnLmNtZF0mJihoPTApfWVsc2UoMCxvLndhcm4pKCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCAtIGBsZXhlci5rbm93bkNvbW1hbmRzYCBpcyB1bmRlZmluZWQuIik7aWYoMj09PWgpYnJlYWt9ZWxzZSBoPTB9aWYoLTE9PT1yKXsoMCxvLndhcm4pKCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZDogUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aG91dCBmaW5kaW5nIGEgdmFsaWQgRUkgbWFya2VyIik7aWYoYSl7KDAsby53YXJuKSgnLi4uIHRyeWluZyB0byByZWNvdmVyIGJ5IHVzaW5nIHRoZSBsYXN0ICJFSSIgb2NjdXJyZW5jZS4nKTt0LnNraXAoLSh0LnBvcy1hKSl9fXZhciB5PTQ7dC5za2lwKC15KTtyPXQucGVla0J5dGUoKTt0LnNraXAoeSk7KDAsbC5pc1doaXRlU3BhY2UpKHIpfHx5LS07cmV0dXJuIHQucG9zLXktdX19LHtrZXk6ImZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQiLHZhbHVlOmZ1bmN0aW9uIGZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQodCl7Zm9yKHZhciByLGEsaT10LnBvcyxjPSExOy0xIT09KHI9dC5nZXRCeXRlKCkpOylpZigyNTU9PT1yKXtzd2l0Y2godC5nZXRCeXRlKCkpe2Nhc2UgMDpicmVhaztjYXNlIDI1NTp0LnNraXAoLTEpO2JyZWFrO2Nhc2UgMjE3OmM9ITA7YnJlYWs7Y2FzZSAxOTI6Y2FzZSAxOTM6Y2FzZSAxOTQ6Y2FzZSAxOTU6Y2FzZSAxOTc6Y2FzZSAxOTg6Y2FzZSAxOTk6Y2FzZSAyMDE6Y2FzZSAyMDI6Y2FzZSAyMDM6Y2FzZSAyMDU6Y2FzZSAyMDY6Y2FzZSAyMDc6Y2FzZSAxOTY6Y2FzZSAyMDQ6Y2FzZSAyMTg6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAyMjI6Y2FzZSAyMjM6Y2FzZSAyMjQ6Y2FzZSAyMjU6Y2FzZSAyMjY6Y2FzZSAyMjc6Y2FzZSAyMjg6Y2FzZSAyMjk6Y2FzZSAyMzA6Y2FzZSAyMzE6Y2FzZSAyMzI6Y2FzZSAyMzM6Y2FzZSAyMzQ6Y2FzZSAyMzU6Y2FzZSAyMzY6Y2FzZSAyMzc6Y2FzZSAyMzg6Y2FzZSAyMzk6Y2FzZSAyNTQ6KGE9dC5nZXRVaW50MTYoKSk+Mj90LnNraXAoYS0yKTp0LnNraXAoLTIpfWlmKGMpYnJlYWt9dmFyIGw9dC5wb3MtaTtpZigtMT09PXIpeygwLG8ud2FybikoIklubGluZSBEQ1REZWNvZGUgaW1hZ2Ugc3RyZWFtOiBFT0kgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7dC5za2lwKC1sKTtyZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCh0KX10aGlzLmlubGluZVN0cmVhbVNraXBFSSh0KTtyZXR1cm4gbH19LHtrZXk6ImZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kIix2YWx1ZTpmdW5jdGlvbiBmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZCh0KXtmb3IodmFyIHIsYT10LnBvczstMSE9PShyPXQuZ2V0Qnl0ZSgpKTspaWYoMTI2PT09cil7dmFyIGk9dC5wb3M7cj10LnBlZWtCeXRlKCk7Zm9yKDsoMCxsLmlzV2hpdGVTcGFjZSkocik7KXt0LnNraXAoKTtyPXQucGVla0J5dGUoKX1pZig2Mj09PXIpe3Quc2tpcCgpO2JyZWFrfWlmKHQucG9zPmkpe3ZhciBjPXQucGVla0J5dGVzKDIpO2lmKDY5PT09Y1swXSYmNzM9PT1jWzFdKWJyZWFrfX12YXIgdT10LnBvcy1hO2lmKC0xPT09cil7KDAsby53YXJuKSgiSW5saW5lIEFTQ0lJODVEZWNvZGUgaW1hZ2Ugc3RyZWFtOiBFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7dC5za2lwKC11KTtyZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCh0KX10aGlzLmlubGluZVN0cmVhbVNraXBFSSh0KTtyZXR1cm4gdX19LHtrZXk6ImZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZCIsdmFsdWU6ZnVuY3Rpb24gZmluZEFTQ0lJSGV4RGVjb2RlSW5saW5lU3RyZWFtRW5kKHQpe2Zvcih2YXIgcixhPXQucG9zOy0xIT09KHI9dC5nZXRCeXRlKCkpJiY2MiE9PXI7KTt2YXIgaT10LnBvcy1hO2lmKC0xPT09cil7KDAsby53YXJuKSgiSW5saW5lIEFTQ0lJSGV4RGVjb2RlIGltYWdlIHN0cmVhbTogRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpO3Quc2tpcCgtaSk7cmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQodCl9dGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkodCk7cmV0dXJuIGl9fSx7a2V5OiJpbmxpbmVTdHJlYW1Ta2lwRUkiLHZhbHVlOmZ1bmN0aW9uIGlubGluZVN0cmVhbVNraXBFSSh0KXtmb3IodmFyIHIsYT0wOy0xIT09KHI9dC5nZXRCeXRlKCkpOylpZigwPT09YSlhPTY5PT09cj8xOjA7ZWxzZSBpZigxPT09YSlhPTczPT09cj8yOjA7ZWxzZSBpZigyPT09YSlicmVha319LHtrZXk6Im1ha2VJbmxpbmVJbWFnZSIsdmFsdWU6ZnVuY3Rpb24gbWFrZUlubGluZUltYWdlKHQpe2Zvcih2YXIgcixhPXRoaXMubGV4ZXIsaT1hLnN0cmVhbSxsPW5ldyBjLkRpY3QodGhpcy54cmVmKTshKDAsYy5pc0NtZCkodGhpcy5idWYxLCJJRCIpJiYhKDAsYy5pc0VPRikodGhpcy5idWYxKTspe2lmKCEoMCxjLmlzTmFtZSkodGhpcy5idWYxKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiRGljdGlvbmFyeSBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7dmFyIHU9dGhpcy5idWYxLm5hbWU7dGhpcy5zaGlmdCgpO2lmKCgwLGMuaXNFT0YpKHRoaXMuYnVmMSkpYnJlYWs7bC5zZXQodSx0aGlzLmdldE9iaih0KSl9LTEhPT1hLmJlZ2luSW5saW5lSW1hZ2VQb3MmJihyPWkucG9zLWEuYmVnaW5JbmxpbmVJbWFnZVBvcyk7dmFyIGgsZD1sLmdldCgiRmlsdGVyIiwiRiIpO2lmKCgwLGMuaXNOYW1lKShkKSloPWQubmFtZTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZCkpe3ZhciBwPXRoaXMueHJlZi5mZXRjaElmUmVmKGRbMF0pOygwLGMuaXNOYW1lKShwKSYmKGg9cC5uYW1lKX12YXIgbSxnPWkucG9zO209IkRDVERlY29kZSI9PT1ofHwiRENUIj09PWg/dGhpcy5maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKGkpOiJBU0NJSTg1RGVjb2RlIj09PWh8fCJBODUiPT09aD90aGlzLmZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKGkpOiJBU0NJSUhleERlY29kZSI9PT1ofHwiQUh4Ij09PWg/dGhpcy5maW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQoaSk6dGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChpKTt2YXIgeSxiPWkubWFrZVN1YlN0cmVhbShnLG0sbCk7aWYobTwxZTMmJnI8NTU1Mil7dmFyIHY9Yi5nZXRCeXRlcygpO2IucmVzZXQoKTt2YXIgUz1pLnBvcztpLnBvcz1hLmJlZ2luSW5saW5lSW1hZ2VQb3M7dmFyIGs9aS5nZXRCeXRlcyhyKTtpLnBvcz1TO3k9Y29tcHV0ZUFkbGVyMzIodikrIl8iK2NvbXB1dGVBZGxlcjMyKGspO3ZhciB3PXRoaXMuaW1hZ2VDYWNoZVt5XTtpZih2b2lkIDAhPT13KXt0aGlzLmJ1ZjI9Yy5DbWQuZ2V0KCJFSSIpO3RoaXMuc2hpZnQoKTt3LnJlc2V0KCk7cmV0dXJuIHd9fXQmJihiPXQuY3JlYXRlU3RyZWFtKGIsbSkpOyhiPXRoaXMuZmlsdGVyKGIsbCxtKSkuZGljdD1sO2lmKHZvaWQgMCE9PXkpe2IuY2FjaGVLZXk9ImlubGluZV8iLmNvbmNhdChtLCJfIikuY29uY2F0KHkpO3RoaXMuaW1hZ2VDYWNoZVt5XT1ifXRoaXMuYnVmMj1jLkNtZC5nZXQoIkVJIik7dGhpcy5zaGlmdCgpO3JldHVybiBifX0se2tleToiX2ZpbmRTdHJlYW1MZW5ndGgiLHZhbHVlOmZ1bmN0aW9uIF9maW5kU3RyZWFtTGVuZ3RoKHQscil7dmFyIGE9dGhpcy5sZXhlci5zdHJlYW07YS5wb3M9dDtmb3IodmFyIGk9ci5sZW5ndGg7YS5wb3M8YS5lbmQ7KXt2YXIgbz1hLnBlZWtCeXRlcygyMDQ4KSxjPW8ubGVuZ3RoLWk7aWYoYzw9MClicmVhaztmb3IodmFyIGw9MDtsPGM7KXtmb3IodmFyIHU9MDt1PGkmJm9bbCt1XT09PXJbdV07KXUrKztpZih1Pj1pKXthLnBvcys9bDtyZXR1cm4gYS5wb3MtdH1sKyt9YS5wb3MrPWN9cmV0dXJuLTF9fSx7a2V5OiJtYWtlU3RyZWFtIix2YWx1ZTpmdW5jdGlvbiBtYWtlU3RyZWFtKHQscil7dmFyIGE9dGhpcy5sZXhlcixpPWEuc3RyZWFtO2Euc2tpcFRvTmV4dExpbmUoKTt2YXIgdT1pLnBvcy0xLGg9dC5nZXQoIkxlbmd0aCIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGgpKXsoMCxvLmluZm8pKCdCYWQgbGVuZ3RoICInLmNvbmNhdChoLCciIGluIHN0cmVhbScpKTtoPTB9aS5wb3M9dStoO2EubmV4dENoYXIoKTtpZih0aGlzLnRyeVNoaWZ0KCkmJigwLGMuaXNDbWQpKHRoaXMuYnVmMiwiZW5kc3RyZWFtIikpdGhpcy5zaGlmdCgpO2Vsc2V7dmFyIGQ9bmV3IFVpbnQ4QXJyYXkoWzEwMSwxMTAsMTAwLDExNSwxMTYsMTE0LDEwMSw5NywxMDldKSxwPXRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgodSxkKTtpZihwPDApe2Zvcih2YXIgbT0xO208PTE7bSsrKXt2YXIgZz1kLmxlbmd0aC1tLHk9ZC5zbGljZSgwLGcpLGI9dGhpcy5fZmluZFN0cmVhbUxlbmd0aCh1LHkpO2lmKGI+PTApe3ZhciB2PWkucGVla0J5dGVzKGcrMSlbZ107aWYoISgwLGwuaXNXaGl0ZVNwYWNlKSh2KSlicmVhazsoMCxvLmluZm8pKCdGb3VuZCAiJy5jb25jYXQoKDAsby5ieXRlc1RvU3RyaW5nKSh5KSwnIiB3aGVuICcpKyJzZWFyY2hpbmcgZm9yIGVuZHN0cmVhbSBjb21tYW5kLiIpO3A9YjticmVha319aWYocDwwKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJNaXNzaW5nIGVuZHN0cmVhbSBjb21tYW5kLiIpfWg9cDthLm5leHRDaGFyKCk7dGhpcy5zaGlmdCgpO3RoaXMuc2hpZnQoKX10aGlzLnNoaWZ0KCk7aT1pLm1ha2VTdWJTdHJlYW0odSxoLHQpO3ImJihpPXIuY3JlYXRlU3RyZWFtKGksaCkpOyhpPXRoaXMuZmlsdGVyKGksdCxoKSkuZGljdD10O3JldHVybiBpfX0se2tleToiZmlsdGVyIix2YWx1ZTpmdW5jdGlvbiBmaWx0ZXIodCxyLGEpe3ZhciBmaWx0ZXI9ci5nZXQoIkZpbHRlciIsIkYiKSxpPXIuZ2V0KCJEZWNvZGVQYXJtcyIsIkRQIik7aWYoKDAsYy5pc05hbWUpKGZpbHRlcikpe0FycmF5LmlzQXJyYXkoaSkmJigwLG8ud2FybikoIi9EZWNvZGVQYXJtcyBzaG91bGQgbm90IGNvbnRhaW4gYW4gQXJyYXksIHdoZW4gL0ZpbHRlciBjb250YWlucyBhIE5hbWUuIik7cmV0dXJuIHRoaXMubWFrZUZpbHRlcih0LGZpbHRlci5uYW1lLGEsaSl9dmFyIGw9YTtpZihBcnJheS5pc0FycmF5KGZpbHRlcikpZm9yKHZhciB1PWZpbHRlcixoPWksZD0wLHA9dS5sZW5ndGg7ZDxwOysrZCl7ZmlsdGVyPXRoaXMueHJlZi5mZXRjaElmUmVmKHVbZF0pO2lmKCEoMCxjLmlzTmFtZSkoZmlsdGVyKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcignQmFkIGZpbHRlciBuYW1lICInLmNvbmNhdChmaWx0ZXIsJyInKSk7aT1udWxsO0FycmF5LmlzQXJyYXkoaCkmJmQgaW4gaCYmKGk9dGhpcy54cmVmLmZldGNoSWZSZWYoaFtkXSkpO3Q9dGhpcy5tYWtlRmlsdGVyKHQsZmlsdGVyLm5hbWUsbCxpKTtsPW51bGx9cmV0dXJuIHR9fSx7a2V5OiJtYWtlRmlsdGVyIix2YWx1ZTpmdW5jdGlvbiBtYWtlRmlsdGVyKHQscixhLGMpe2lmKDA9PT1hKXsoMCxvLndhcm4pKCdFbXB0eSAiJy5jb25jYXQociwnIiBzdHJlYW0uJykpO3JldHVybiBuZXcgaS5OdWxsU3RyZWFtfXRyeXt2YXIgbT10aGlzLnhyZWYuc3RhdHMuc3RyZWFtVHlwZXM7aWYoIkZsYXRlRGVjb2RlIj09PXJ8fCJGbCI9PT1yKXttW28uU3RyZWFtVHlwZS5GTEFURV09ITA7cmV0dXJuIGM/bmV3IGkuUHJlZGljdG9yU3RyZWFtKG5ldyBpLkZsYXRlU3RyZWFtKHQsYSksYSxjKTpuZXcgaS5GbGF0ZVN0cmVhbSh0LGEpfWlmKCJMWldEZWNvZGUiPT09cnx8IkxaVyI9PT1yKXttW28uU3RyZWFtVHlwZS5MWlddPSEwO3ZhciBnPTE7aWYoYyl7Yy5oYXMoIkVhcmx5Q2hhbmdlIikmJihnPWMuZ2V0KCJFYXJseUNoYW5nZSIpKTtyZXR1cm4gbmV3IGkuUHJlZGljdG9yU3RyZWFtKG5ldyBpLkxaV1N0cmVhbSh0LGEsZyksYSxjKX1yZXR1cm4gbmV3IGkuTFpXU3RyZWFtKHQsYSxnKX1pZigiRENURGVjb2RlIj09PXJ8fCJEQ1QiPT09cil7bVtvLlN0cmVhbVR5cGUuRENUXT0hMDtyZXR1cm4gbmV3IGQuSnBlZ1N0cmVhbSh0LGEsdC5kaWN0LGMpfWlmKCJKUFhEZWNvZGUiPT09cnx8IkpQWCI9PT1yKXttW28uU3RyZWFtVHlwZS5KUFhdPSEwO3JldHVybiBuZXcgcC5KcHhTdHJlYW0odCxhLHQuZGljdCxjKX1pZigiQVNDSUk4NURlY29kZSI9PT1yfHwiQTg1Ij09PXIpe21bby5TdHJlYW1UeXBlLkE4NV09ITA7cmV0dXJuIG5ldyBpLkFzY2lpODVTdHJlYW0odCxhKX1pZigiQVNDSUlIZXhEZWNvZGUiPT09cnx8IkFIeCI9PT1yKXttW28uU3RyZWFtVHlwZS5BSFhdPSEwO3JldHVybiBuZXcgaS5Bc2NpaUhleFN0cmVhbSh0LGEpfWlmKCJDQ0lUVEZheERlY29kZSI9PT1yfHwiQ0NGIj09PXIpe21bby5TdHJlYW1UeXBlLkNDRl09ITA7cmV0dXJuIG5ldyB1LkNDSVRURmF4U3RyZWFtKHQsYSxjKX1pZigiUnVuTGVuZ3RoRGVjb2RlIj09PXJ8fCJSTCI9PT1yKXttW28uU3RyZWFtVHlwZS5STFhdPSEwO3JldHVybiBuZXcgaS5SdW5MZW5ndGhTdHJlYW0odCxhKX1pZigiSkJJRzJEZWNvZGUiPT09cil7bVtvLlN0cmVhbVR5cGUuSkJJR109ITA7cmV0dXJuIG5ldyBoLkpiaWcyU3RyZWFtKHQsYSx0LmRpY3QsYyl9KDAsby53YXJuKSgnRmlsdGVyICInLmNvbmNhdChyLCciIGlzIG5vdCBzdXBwb3J0ZWQuJykpO3JldHVybiB0fWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBsLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7KDAsby53YXJuKSgnSW52YWxpZCBzdHJlYW06ICInLmNvbmNhdCh0LCciJykpO3JldHVybiBuZXcgaS5OdWxsU3RyZWFtfX19XSk7cmV0dXJuIFBhcnNlcn0oKTtyLlBhcnNlcj1tO3ZhciBnPVsxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDIsMCwwLDIsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTtmdW5jdGlvbiB0b0hleERpZ2l0KHQpe3JldHVybiB0Pj00OCYmdDw9NTc/MTUmdDp0Pj02NSYmdDw9NzB8fHQ+PTk3JiZ0PD0xMDI/OSsoMTUmdCk6LTF9dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBMZXhlcih0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxMZXhlcik7dGhpcy5zdHJlYW09dDt0aGlzLm5leHRDaGFyKCk7dGhpcy5zdHJCdWY9W107dGhpcy5rbm93bkNvbW1hbmRzPXI7dGhpcy5faGV4U3RyaW5nTnVtV2Fybj0wO3RoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcz0tMX1fY3JlYXRlQ2xhc3MoTGV4ZXIsW3trZXk6Im5leHRDaGFyIix2YWx1ZTpmdW5jdGlvbiBuZXh0Q2hhcigpe3JldHVybiB0aGlzLmN1cnJlbnRDaGFyPXRoaXMuc3RyZWFtLmdldEJ5dGUoKX19LHtrZXk6InBlZWtDaGFyIix2YWx1ZTpmdW5jdGlvbiBwZWVrQ2hhcigpe3JldHVybiB0aGlzLnN0cmVhbS5wZWVrQnl0ZSgpfX0se2tleToiZ2V0TnVtYmVyIix2YWx1ZTpmdW5jdGlvbiBnZXROdW1iZXIoKXt2YXIgdD10aGlzLmN1cnJlbnRDaGFyLHI9ITEsYT0wLGk9MDtpZig0NT09PXQpe2k9LTE7NDU9PT0odD10aGlzLm5leHRDaGFyKCkpJiYodD10aGlzLm5leHRDaGFyKCkpfWVsc2UgaWYoNDM9PT10KXtpPTE7dD10aGlzLm5leHRDaGFyKCl9aWYoMTA9PT10fHwxMz09PXQpZG97dD10aGlzLm5leHRDaGFyKCl9d2hpbGUoMTA9PT10fHwxMz09PXQpO2lmKDQ2PT09dCl7YT0xMDt0PXRoaXMubmV4dENoYXIoKX1pZih0PDQ4fHx0PjU3KXtpZigxMD09PWEmJjA9PT1pJiYoKDAsbC5pc1doaXRlU3BhY2UpKHQpfHwtMT09PXQpKXsoMCxvLndhcm4pKCJMZXhlci5nZXROdW1iZXIgLSB0cmVhdGluZyBhIHNpbmdsZSBkZWNpbWFsIHBvaW50IGFzIHplcm8uIik7cmV0dXJuIDB9dGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkludmFsaWQgbnVtYmVyOiAiLmNvbmNhdChTdHJpbmcuZnJvbUNoYXJDb2RlKHQpLCIgKGNoYXJDb2RlICIpLmNvbmNhdCh0LCIpIikpfWk9aXx8MTtmb3IodmFyIGM9dC00OCx1PTAsaD0xOyh0PXRoaXMubmV4dENoYXIoKSk+PTA7KWlmKHQ+PTQ4JiZ0PD01Nyl7dmFyIGQ9dC00ODtpZihyKXU9MTAqdStkO2Vsc2V7MCE9PWEmJihhKj0xMCk7Yz0xMCpjK2R9fWVsc2UgaWYoNDY9PT10KXtpZigwIT09YSlicmVhazthPTF9ZWxzZSBpZig0NT09PXQpKDAsby53YXJuKSgiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlIik7ZWxzZXtpZig2OSE9PXQmJjEwMSE9PXQpYnJlYWs7aWYoNDM9PT0odD10aGlzLnBlZWtDaGFyKCkpfHw0NT09PXQpe2g9NDU9PT10Py0xOjE7dGhpcy5uZXh0Q2hhcigpfWVsc2UgaWYodDw0OHx8dD41NylicmVhaztyPSEwfTAhPT1hJiYoYy89YSk7ciYmKGMqPU1hdGgucG93KDEwLGgqdSkpO3JldHVybiBpKmN9fSx7a2V5OiJnZXRTdHJpbmciLHZhbHVlOmZ1bmN0aW9uIGdldFN0cmluZygpe3ZhciB0PTEscj0hMSxhPXRoaXMuc3RyQnVmO2EubGVuZ3RoPTA7Zm9yKHZhciBpPXRoaXMubmV4dENoYXIoKTs7KXt2YXIgYz0hMTtzd2l0Y2goMHxpKXtjYXNlLTE6KDAsby53YXJuKSgiVW50ZXJtaW5hdGVkIHN0cmluZyIpO3I9ITA7YnJlYWs7Y2FzZSA0MDorK3Q7YS5wdXNoKCIoIik7YnJlYWs7Y2FzZSA0MTppZigwPT0tLXQpe3RoaXMubmV4dENoYXIoKTtyPSEwfWVsc2UgYS5wdXNoKCIpIik7YnJlYWs7Y2FzZSA5Mjpzd2l0Y2goaT10aGlzLm5leHRDaGFyKCkpe2Nhc2UtMTooMCxvLndhcm4pKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7cj0hMDticmVhaztjYXNlIDExMDphLnB1c2goIlxuIik7YnJlYWs7Y2FzZSAxMTQ6YS5wdXNoKCJcciIpO2JyZWFrO2Nhc2UgMTE2OmEucHVzaCgiXHQiKTticmVhaztjYXNlIDk4OmEucHVzaCgiXGIiKTticmVhaztjYXNlIDEwMjphLnB1c2goIlxmIik7YnJlYWs7Y2FzZSA5MjpjYXNlIDQwOmNhc2UgNDE6YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaSkpO2JyZWFrO2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTp2YXIgbD0xNSZpO2M9ITA7aWYoKGk9dGhpcy5uZXh0Q2hhcigpKT49NDgmJmk8PTU1KXtsPShsPDwzKSsoMTUmaSk7aWYoKGk9dGhpcy5uZXh0Q2hhcigpKT49NDgmJmk8PTU1KXtjPSExO2w9KGw8PDMpKygxNSZpKX19YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobCkpO2JyZWFrO2Nhc2UgMTM6MTA9PT10aGlzLnBlZWtDaGFyKCkmJnRoaXMubmV4dENoYXIoKTticmVhaztjYXNlIDEwOmJyZWFrO2RlZmF1bHQ6YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaSkpfWJyZWFrO2RlZmF1bHQ6YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaSkpfWlmKHIpYnJlYWs7Y3x8KGk9dGhpcy5uZXh0Q2hhcigpKX1yZXR1cm4gYS5qb2luKCIiKX19LHtrZXk6ImdldE5hbWUiLHZhbHVlOmZ1bmN0aW9uIGdldE5hbWUoKXt2YXIgdCxyLGE9dGhpcy5zdHJCdWY7YS5sZW5ndGg9MDtmb3IoOyh0PXRoaXMubmV4dENoYXIoKSk+PTAmJiFnW3RdOylpZigzNT09PXQpe3Q9dGhpcy5uZXh0Q2hhcigpO2lmKGdbdF0peygwLG8ud2FybikoIkxleGVyX2dldE5hbWU6IE5VTUJFUiBTSUdOICgjKSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBoZXhhZGVjaW1hbCBudW1iZXIuIik7YS5wdXNoKCIjIik7YnJlYWt9dmFyIGk9dG9IZXhEaWdpdCh0KTtpZigtMSE9PWkpe3I9dDt2YXIgbD10b0hleERpZ2l0KHQ9dGhpcy5uZXh0Q2hhcigpKTtpZigtMT09PWwpeygwLG8ud2FybikoIkxleGVyX2dldE5hbWU6IElsbGVnYWwgZGlnaXQgKCIuY29uY2F0KFN0cmluZy5mcm9tQ2hhckNvZGUodCksIikgIikrImluIGhleGFkZWNpbWFsIG51bWJlci4iKTthLnB1c2goIiMiLFN0cmluZy5mcm9tQ2hhckNvZGUocikpO2lmKGdbdF0pYnJlYWs7YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodCkpO2NvbnRpbnVlfWEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGk8PDR8bCkpfWVsc2UgYS5wdXNoKCIjIixTdHJpbmcuZnJvbUNoYXJDb2RlKHQpKX1lbHNlIGEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHQpKTthLmxlbmd0aD4xMjcmJigwLG8ud2FybikoIk5hbWUgdG9rZW4gaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZCBieSB0aGUgc3BlYzogIi5jb25jYXQoYS5sZW5ndGgpKTtyZXR1cm4gYy5OYW1lLmdldChhLmpvaW4oIiIpKX19LHtrZXk6Il9oZXhTdHJpbmdXYXJuIix2YWx1ZTpmdW5jdGlvbiBfaGV4U3RyaW5nV2Fybih0KXs1IT10aGlzLl9oZXhTdHJpbmdOdW1XYXJuKys/dGhpcy5faGV4U3RyaW5nTnVtV2Fybj41fHwoMCxvLndhcm4pKCJnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlcjogIi5jb25jYXQodCkpOigwLG8ud2FybikoImdldEhleFN0cmluZyAtIGlnbm9yaW5nIGFkZGl0aW9uYWwgaW52YWxpZCBjaGFyYWN0ZXJzLiIpfX0se2tleToiZ2V0SGV4U3RyaW5nIix2YWx1ZTpmdW5jdGlvbiBnZXRIZXhTdHJpbmcoKXt2YXIgdD10aGlzLnN0ckJ1Zjt0Lmxlbmd0aD0wO3ZhciByLGEsaT10aGlzLmN1cnJlbnRDaGFyLGM9ITA7dGhpcy5faGV4U3RyaW5nTnVtV2Fybj0wO2Zvcig7Oyl7aWYoaTwwKXsoMCxvLndhcm4pKCJVbnRlcm1pbmF0ZWQgaGV4IHN0cmluZyIpO2JyZWFrfWlmKDYyPT09aSl7dGhpcy5uZXh0Q2hhcigpO2JyZWFrfWlmKDEhPT1nW2ldKXtpZihjKXtpZigtMT09PShyPXRvSGV4RGlnaXQoaSkpKXt0aGlzLl9oZXhTdHJpbmdXYXJuKGkpO2k9dGhpcy5uZXh0Q2hhcigpO2NvbnRpbnVlfX1lbHNle2lmKC0xPT09KGE9dG9IZXhEaWdpdChpKSkpe3RoaXMuX2hleFN0cmluZ1dhcm4oaSk7aT10aGlzLm5leHRDaGFyKCk7Y29udGludWV9dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocjw8NHxhKSl9Yz0hYztpPXRoaXMubmV4dENoYXIoKX1lbHNlIGk9dGhpcy5uZXh0Q2hhcigpfXJldHVybiB0LmpvaW4oIiIpfX0se2tleToiZ2V0T2JqIix2YWx1ZTpmdW5jdGlvbiBnZXRPYmooKXtmb3IodmFyIHQ9ITEscj10aGlzLmN1cnJlbnRDaGFyOzspe2lmKHI8MClyZXR1cm4gYy5FT0Y7aWYodCkxMCE9PXImJjEzIT09cnx8KHQ9ITEpO2Vsc2UgaWYoMzc9PT1yKXQ9ITA7ZWxzZSBpZigxIT09Z1tyXSlicmVhaztyPXRoaXMubmV4dENoYXIoKX1zd2l0Y2goMHxyKXtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OmNhc2UgNDM6Y2FzZSA0NTpjYXNlIDQ2OnJldHVybiB0aGlzLmdldE51bWJlcigpO2Nhc2UgNDA6cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCk7Y2FzZSA0NzpyZXR1cm4gdGhpcy5nZXROYW1lKCk7Y2FzZSA5MTp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIGMuQ21kLmdldCgiWyIpO2Nhc2UgOTM6dGhpcy5uZXh0Q2hhcigpO3JldHVybiBjLkNtZC5nZXQoIl0iKTtjYXNlIDYwOmlmKDYwPT09KHI9dGhpcy5uZXh0Q2hhcigpKSl7dGhpcy5uZXh0Q2hhcigpO3JldHVybiBjLkNtZC5nZXQoIjw8Iil9cmV0dXJuIHRoaXMuZ2V0SGV4U3RyaW5nKCk7Y2FzZSA2MjppZig2Mj09PShyPXRoaXMubmV4dENoYXIoKSkpe3RoaXMubmV4dENoYXIoKTtyZXR1cm4gYy5DbWQuZ2V0KCI+PiIpfXJldHVybiBjLkNtZC5nZXQoIj4iKTtjYXNlIDEyMzp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIGMuQ21kLmdldCgieyIpO2Nhc2UgMTI1OnRoaXMubmV4dENoYXIoKTtyZXR1cm4gYy5DbWQuZ2V0KCJ9Iik7Y2FzZSA0MTp0aGlzLm5leHRDaGFyKCk7dGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIklsbGVnYWwgY2hhcmFjdGVyOiAiLmNvbmNhdChyKSl9Zm9yKHZhciBhPVN0cmluZy5mcm9tQ2hhckNvZGUociksaT10aGlzLmtub3duQ29tbWFuZHMsbD1pJiZ2b2lkIDAhPT1pW2FdOyhyPXRoaXMubmV4dENoYXIoKSk+PTAmJiFnW3JdOyl7dmFyIHU9YStTdHJpbmcuZnJvbUNoYXJDb2RlKHIpO2lmKGwmJnZvaWQgMD09PWlbdV0pYnJlYWs7aWYoMTI4PT09YS5sZW5ndGgpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkNvbW1hbmQgdG9rZW4gdG9vIGxvbmc6ICIuY29uY2F0KGEubGVuZ3RoKSk7YT11O2w9aSYmdm9pZCAwIT09aVthXX1pZigidHJ1ZSI9PT1hKXJldHVybiEwO2lmKCJmYWxzZSI9PT1hKXJldHVybiExO2lmKCJudWxsIj09PWEpcmV0dXJuIG51bGw7IkJJIj09PWEmJih0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3M9dGhpcy5zdHJlYW0ucG9zKTtyZXR1cm4gYy5DbWQuZ2V0KGEpfX0se2tleToicGVla09iaiIsdmFsdWU6ZnVuY3Rpb24gcGVla09iaigpe3ZhciB0LHI9dGhpcy5zdHJlYW0ucG9zLGE9dGhpcy5jdXJyZW50Q2hhcixpPXRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvczt0cnl7dD10aGlzLmdldE9iaigpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBsLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7KDAsby53YXJuKSgicGVla09iajogIi5jb25jYXQodCkpfXRoaXMuc3RyZWFtLnBvcz1yO3RoaXMuY3VycmVudENoYXI9YTt0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3M9aTtyZXR1cm4gdH19LHtrZXk6InNraXBUb05leHRMaW5lIix2YWx1ZTpmdW5jdGlvbiBza2lwVG9OZXh0TGluZSgpe2Zvcih2YXIgdD10aGlzLmN1cnJlbnRDaGFyO3Q+PTA7KXtpZigxMz09PXQpezEwPT09KHQ9dGhpcy5uZXh0Q2hhcigpKSYmdGhpcy5uZXh0Q2hhcigpO2JyZWFrfWlmKDEwPT09dCl7dGhpcy5uZXh0Q2hhcigpO2JyZWFrfXQ9dGhpcy5uZXh0Q2hhcigpfX19XSk7cmV0dXJuIExleGVyfSgpO3IuTGV4ZXI9eTt2YXIgYj1mdW5jdGlvbigpe2Z1bmN0aW9uIExpbmVhcml6YXRpb24oKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxMaW5lYXJpemF0aW9uKX1fY3JlYXRlQ2xhc3MoTGluZWFyaXphdGlvbixudWxsLFt7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZSh0KXtmdW5jdGlvbiBnZXRJbnQodCxyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLGk9dC5nZXQocik7aWYoTnVtYmVyLmlzSW50ZWdlcihpKSYmKGE/aT49MDppPjApKXJldHVybiBpO3Rocm93IG5ldyBFcnJvcignVGhlICInLmNvbmNhdChyLCciIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiAnKSsiZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpfXZhciByLGEsaT1uZXcgbSh7bGV4ZXI6bmV3IHkodCkseHJlZjpudWxsfSksbD1pLmdldE9iaigpLHU9aS5nZXRPYmooKSxoPWkuZ2V0T2JqKCksZD1pLmdldE9iaigpO2lmKCEoTnVtYmVyLmlzSW50ZWdlcihsKSYmTnVtYmVyLmlzSW50ZWdlcih1KSYmKDAsYy5pc0NtZCkoaCwib2JqIikmJigwLGMuaXNEaWN0KShkKSYmKDAsby5pc051bSkocj1kLmdldCgiTGluZWFyaXplZCIpKSYmcj4wKSlyZXR1cm4gbnVsbDtpZigoYT1nZXRJbnQoZCwiTCIpKSE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcignVGhlICJMIiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2VzIG5vdCBlcXVhbCB0aGUgc3RyZWFtIGxlbmd0aC4nKTtyZXR1cm57bGVuZ3RoOmEsaGludHM6ZnVuY3Rpb24gZ2V0SGludHModCl7dmFyIHIsYT10LmdldCgiSCIpO2lmKEFycmF5LmlzQXJyYXkoYSkmJigyPT09KHI9YS5sZW5ndGgpfHw0PT09cikpe2Zvcih2YXIgaT0wO2k8cjtpKyspe3ZhciBvPWFbaV07aWYoIShOdW1iZXIuaXNJbnRlZ2VyKG8pJiZvPjApKXRocm93IG5ldyBFcnJvcigiSGludCAoIi5jb25jYXQoaSwiKSBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIikpfXJldHVybiBhfXRocm93IG5ldyBFcnJvcigiSGludCBhcnJheSBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIil9KGQpLG9iamVjdE51bWJlckZpcnN0OmdldEludChkLCJPIiksZW5kRmlyc3Q6Z2V0SW50KGQsIkUiKSxudW1QYWdlczpnZXRJbnQoZCwiTiIpLG1haW5YUmVmRW50cmllc09mZnNldDpnZXRJbnQoZCwiVCIpLHBhZ2VGaXJzdDpkLmhhcygiUCIpP2dldEludChkLCJQIiwhMCk6MH19fV0pO3JldHVybiBMaW5lYXJpemF0aW9ufSgpO3IuTGluZWFyaXphdGlvbj1ifSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLkxaV1N0cmVhbT1yLlN0cmluZ1N0cmVhbT1yLlN0cmVhbXNTZXF1ZW5jZVN0cmVhbT1yLlN0cmVhbT1yLlJ1bkxlbmd0aFN0cmVhbT1yLlByZWRpY3RvclN0cmVhbT1yLk51bGxTdHJlYW09ci5GbGF0ZVN0cmVhbT1yLkRlY29kZVN0cmVhbT1yLkRlY3J5cHRTdHJlYW09ci5Bc2NpaUhleFN0cmVhbT1yLkFzY2lpODVTdHJlYW09dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIwMiksYz1hKDIwNSk7ZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHQpe3JldHVybiBmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXModCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCl9KHQpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYoIXQpcmV0dXJuO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKTt2YXIgYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7Ik9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09YXx8IlNldCI9PT1hKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKCJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSkpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscil9KHQpfHxmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX0oKX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLGk9bmV3IEFycmF5KHIpO2E8cjthKyspaVthXT10W2FdO3JldHVybiBpfXZhciBsPWZ1bmN0aW9uIFN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBTdHJlYW0odCxyLGEsaSl7dGhpcy5ieXRlcz10IGluc3RhbmNlb2YgVWludDhBcnJheT90Om5ldyBVaW50OEFycmF5KHQpO3RoaXMuc3RhcnQ9cnx8MDt0aGlzLnBvcz10aGlzLnN0YXJ0O3RoaXMuZW5kPXIrYXx8dGhpcy5ieXRlcy5sZW5ndGg7dGhpcy5kaWN0PWl9U3RyZWFtLnByb3RvdHlwZT17Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmVuZC10aGlzLnN0YXJ0fSxnZXQgaXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5sZW5ndGh9LGdldEJ5dGU6ZnVuY3Rpb24gU3RyZWFtX2dldEJ5dGUoKXtyZXR1cm4gdGhpcy5wb3M+PXRoaXMuZW5kPy0xOnRoaXMuYnl0ZXNbdGhpcy5wb3MrK119LGdldFVpbnQxNjpmdW5jdGlvbiBTdHJlYW1fZ2V0VWludDE2KCl7dmFyIHQ9dGhpcy5nZXRCeXRlKCkscj10aGlzLmdldEJ5dGUoKTtyZXR1cm4tMT09PXR8fC0xPT09cj8tMToodDw8OCkrcn0sZ2V0SW50MzI6ZnVuY3Rpb24gU3RyZWFtX2dldEludDMyKCl7cmV0dXJuKHRoaXMuZ2V0Qnl0ZSgpPDwyNCkrKHRoaXMuZ2V0Qnl0ZSgpPDwxNikrKHRoaXMuZ2V0Qnl0ZSgpPDw4KSt0aGlzLmdldEJ5dGUoKX0sZ2V0Qnl0ZXM6ZnVuY3Rpb24gZ2V0Qnl0ZXModCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxhPXRoaXMuYnl0ZXMsaT10aGlzLnBvcyxvPXRoaXMuZW5kO2lmKCF0KXt2YXIgYz1hLnN1YmFycmF5KGksbyk7cmV0dXJuIHI/bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGMpOmN9dmFyIGw9aSt0O2w+byYmKGw9byk7dGhpcy5wb3M9bDt2YXIgdT1hLnN1YmFycmF5KGksbCk7cmV0dXJuIHI/bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHUpOnV9LHBlZWtCeXRlOmZ1bmN0aW9uIFN0cmVhbV9wZWVrQnl0ZSgpe3ZhciB0PXRoaXMuZ2V0Qnl0ZSgpOy0xIT09dCYmdGhpcy5wb3MtLTtyZXR1cm4gdH0scGVla0J5dGVzOmZ1bmN0aW9uIHBlZWtCeXRlcyh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGE9dGhpcy5nZXRCeXRlcyh0LHIpO3RoaXMucG9zLT1hLmxlbmd0aDtyZXR1cm4gYX0sZ2V0Qnl0ZVJhbmdlOmZ1bmN0aW9uIGdldEJ5dGVSYW5nZSh0LHIpe3Q8MCYmKHQ9MCk7cj50aGlzLmVuZCYmKHI9dGhpcy5lbmQpO3JldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KHQscil9LHNraXA6ZnVuY3Rpb24gU3RyZWFtX3NraXAodCl7dHx8KHQ9MSk7dGhpcy5wb3MrPXR9LHJlc2V0OmZ1bmN0aW9uIFN0cmVhbV9yZXNldCgpe3RoaXMucG9zPXRoaXMuc3RhcnR9LG1vdmVTdGFydDpmdW5jdGlvbiBTdHJlYW1fbW92ZVN0YXJ0KCl7dGhpcy5zdGFydD10aGlzLnBvc30sbWFrZVN1YlN0cmVhbTpmdW5jdGlvbiBTdHJlYW1fbWFrZVN1YlN0cmVhbSh0LHIsYSl7cmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcy5idWZmZXIsdCxyLGEpfX07cmV0dXJuIFN0cmVhbX0oKTtyLlN0cmVhbT1sO3ZhciB1PWZ1bmN0aW9uIFN0cmluZ1N0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBTdHJpbmdTdHJlYW0odCl7dmFyIHI9KDAsaS5zdHJpbmdUb0J5dGVzKSh0KTtsLmNhbGwodGhpcyxyKX1TdHJpbmdTdHJlYW0ucHJvdG90eXBlPWwucHJvdG90eXBlO3JldHVybiBTdHJpbmdTdHJlYW19KCk7ci5TdHJpbmdTdHJlYW09dTt2YXIgaD1mdW5jdGlvbiBEZWNvZGVTdHJlYW1DbG9zdXJlKCl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoMCk7ZnVuY3Rpb24gRGVjb2RlU3RyZWFtKHIpe3RoaXMuX3Jhd01pbkJ1ZmZlckxlbmd0aD1yfHwwO3RoaXMucG9zPTA7dGhpcy5idWZmZXJMZW5ndGg9MDt0aGlzLmVvZj0hMTt0aGlzLmJ1ZmZlcj10O3RoaXMubWluQnVmZmVyTGVuZ3RoPTUxMjtpZihyKWZvcig7dGhpcy5taW5CdWZmZXJMZW5ndGg8cjspdGhpcy5taW5CdWZmZXJMZW5ndGgqPTJ9RGVjb2RlU3RyZWFtLnByb3RvdHlwZT17Z2V0IGlzRW1wdHkoKXtmb3IoOyF0aGlzLmVvZiYmMD09PXRoaXMuYnVmZmVyTGVuZ3RoOyl0aGlzLnJlYWRCbG9jaygpO3JldHVybiAwPT09dGhpcy5idWZmZXJMZW5ndGh9LGVuc3VyZUJ1ZmZlcjpmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZW5zdXJlQnVmZmVyKHQpe3ZhciByPXRoaXMuYnVmZmVyO2lmKHQ8PXIuYnl0ZUxlbmd0aClyZXR1cm4gcjtmb3IodmFyIGE9dGhpcy5taW5CdWZmZXJMZW5ndGg7YTx0OylhKj0yO3ZhciBpPW5ldyBVaW50OEFycmF5KGEpO2kuc2V0KHIpO3JldHVybiB0aGlzLmJ1ZmZlcj1pfSxnZXRCeXRlOmZ1bmN0aW9uIERlY29kZVN0cmVhbV9nZXRCeXRlKCl7Zm9yKHZhciB0PXRoaXMucG9zO3RoaXMuYnVmZmVyTGVuZ3RoPD10Oyl7aWYodGhpcy5lb2YpcmV0dXJuLTE7dGhpcy5yZWFkQmxvY2soKX1yZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK119LGdldFVpbnQxNjpmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0VWludDE2KCl7dmFyIHQ9dGhpcy5nZXRCeXRlKCkscj10aGlzLmdldEJ5dGUoKTtyZXR1cm4tMT09PXR8fC0xPT09cj8tMToodDw8OCkrcn0sZ2V0SW50MzI6ZnVuY3Rpb24gRGVjb2RlU3RyZWFtX2dldEludDMyKCl7cmV0dXJuKHRoaXMuZ2V0Qnl0ZSgpPDwyNCkrKHRoaXMuZ2V0Qnl0ZSgpPDwxNikrKHRoaXMuZ2V0Qnl0ZSgpPDw4KSt0aGlzLmdldEJ5dGUoKX0sZ2V0Qnl0ZXM6ZnVuY3Rpb24gZ2V0Qnl0ZXModCl7dmFyIHIsYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9dGhpcy5wb3M7aWYodCl7dGhpcy5lbnN1cmVCdWZmZXIoaSt0KTtyPWkrdDtmb3IoOyF0aGlzLmVvZiYmdGhpcy5idWZmZXJMZW5ndGg8cjspdGhpcy5yZWFkQmxvY2soKTt2YXIgbz10aGlzLmJ1ZmZlckxlbmd0aDtyPm8mJihyPW8pfWVsc2V7Zm9yKDshdGhpcy5lb2Y7KXRoaXMucmVhZEJsb2NrKCk7cj10aGlzLmJ1ZmZlckxlbmd0aH10aGlzLnBvcz1yO3ZhciBjPXRoaXMuYnVmZmVyLnN1YmFycmF5KGkscik7cmV0dXJuIWF8fGMgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheT9jOm5ldyBVaW50OENsYW1wZWRBcnJheShjKX0scGVla0J5dGU6ZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3BlZWtCeXRlKCl7dmFyIHQ9dGhpcy5nZXRCeXRlKCk7LTEhPT10JiZ0aGlzLnBvcy0tO3JldHVybiB0fSxwZWVrQnl0ZXM6ZnVuY3Rpb24gcGVla0J5dGVzKHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sYT10aGlzLmdldEJ5dGVzKHQscik7dGhpcy5wb3MtPWEubGVuZ3RoO3JldHVybiBhfSxtYWtlU3ViU3RyZWFtOmZ1bmN0aW9uIERlY29kZVN0cmVhbV9tYWtlU3ViU3RyZWFtKHQscixhKXtmb3IodmFyIGk9dCtyO3RoaXMuYnVmZmVyTGVuZ3RoPD1pJiYhdGhpcy5lb2Y7KXRoaXMucmVhZEJsb2NrKCk7cmV0dXJuIG5ldyBsKHRoaXMuYnVmZmVyLHQscixhKX0sZ2V0Qnl0ZVJhbmdlOmZ1bmN0aW9uIGdldEJ5dGVSYW5nZSh0LHIpeygwLGkudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgRGVjb2RlU3RyZWFtLmdldEJ5dGVSYW5nZSIpfSxza2lwOmZ1bmN0aW9uIERlY29kZVN0cmVhbV9za2lwKHQpe3R8fCh0PTEpO3RoaXMucG9zKz10fSxyZXNldDpmdW5jdGlvbiBEZWNvZGVTdHJlYW1fcmVzZXQoKXt0aGlzLnBvcz0wfSxnZXRCYXNlU3RyZWFtczpmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0QmFzZVN0cmVhbXMoKXtyZXR1cm4gdGhpcy5zdHImJnRoaXMuc3RyLmdldEJhc2VTdHJlYW1zP3RoaXMuc3RyLmdldEJhc2VTdHJlYW1zKCk6W119fTtyZXR1cm4gRGVjb2RlU3RyZWFtfSgpO3IuRGVjb2RlU3RyZWFtPWg7dmFyIGQ9ZnVuY3Rpb24gU3RyZWFtc1NlcXVlbmNlU3RyZWFtQ2xvc3VyZSgpe2Z1bmN0aW9uIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbSh0KXt0aGlzLnN0cmVhbXM9dDtmb3IodmFyIHI9MCxhPTAsaT10Lmxlbmd0aDthPGk7YSsrKXt2YXIgbz10W2FdO3IrPW8gaW5zdGFuY2VvZiBoP28uX3Jhd01pbkJ1ZmZlckxlbmd0aDpvLmxlbmd0aH1oLmNhbGwodGhpcyxyKX1TdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaC5wcm90b3R5cGUpO1N0cmVhbXNTZXF1ZW5jZVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uIHN0cmVhbVNlcXVlbmNlU3RyZWFtUmVhZEJsb2NrKCl7dmFyIHQ9dGhpcy5zdHJlYW1zO2lmKDAhPT10Lmxlbmd0aCl7dmFyIHI9dC5zaGlmdCgpLmdldEJ5dGVzKCksYT10aGlzLmJ1ZmZlckxlbmd0aCxpPWErci5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXIoaSkuc2V0KHIsYSk7dGhpcy5idWZmZXJMZW5ndGg9aX1lbHNlIHRoaXMuZW9mPSEwfTtTdHJlYW1zU2VxdWVuY2VTdHJlYW0ucHJvdG90eXBlLmdldEJhc2VTdHJlYW1zPWZ1bmN0aW9uIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbV9nZXRCYXNlU3RyZWFtcygpe2Zvcih2YXIgdD1bXSxyPTAsYT10aGlzLnN0cmVhbXMubGVuZ3RoO3I8YTtyKyspe3ZhciBpPXRoaXMuc3RyZWFtc1tyXTtpLmdldEJhc2VTdHJlYW1zJiZ0LnB1c2guYXBwbHkodCxfdG9Db25zdW1hYmxlQXJyYXkoaS5nZXRCYXNlU3RyZWFtcygpKSl9cmV0dXJuIHR9O3JldHVybiBTdHJlYW1zU2VxdWVuY2VTdHJlYW19KCk7ci5TdHJlYW1zU2VxdWVuY2VTdHJlYW09ZDt2YXIgcD1mdW5jdGlvbiBGbGF0ZVN0cmVhbUNsb3N1cmUoKXt2YXIgdD1uZXcgSW50MzJBcnJheShbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pLHI9bmV3IEludDMyQXJyYXkoWzMsNCw1LDYsNyw4LDksMTAsNjU1NDcsNjU1NDksNjU1NTEsNjU1NTMsMTMxMDkxLDEzMTA5NSwxMzEwOTksMTMxMTAzLDE5NjY0MywxOTY2NTEsMTk2NjU5LDE5NjY2NywyNjIyMTEsMjYyMjI3LDI2MjI0MywyNjIyNTksMzI3ODExLDMyNzg0MywzMjc4NzUsMzI3OTA3LDI1OCwyNTgsMjU4XSksYT1uZXcgSW50MzJBcnJheShbMSwyLDMsNCw2NTU0MSw2NTU0MywxMzEwODEsMTMxMDg1LDE5NjYyNSwxOTY2MzMsMjYyMTc3LDI2MjE5MywzMjc3NDUsMzI3Nzc3LDM5MzM0NSwzOTM0MDksNDU5MDA5LDQ1OTEzNyw1MjQ4MDEsNTI1MDU3LDU5MDg0OSw1OTEzNjEsNjU3NDA5LDY1ODQzMyw3MjQ5OTMsNzI3MDQxLDc5NDYyNSw3OTg3MjEsODY4MzUzLDg3NjU0NV0pLG89W25ldyBJbnQzMkFycmF5KFs0NTkwMDgsNTI0MzY4LDUyNDMwNCw1MjQ1NjgsNDU5MDI0LDUyNDQwMCw1MjQzMzYsNTkwMDE2LDQ1OTAxNiw1MjQzODQsNTI0MzIwLDU4OTk4NCw1MjQyODgsNTI0NDE2LDUyNDM1Miw1OTAwNDgsNDU5MDEyLDUyNDM3Niw1MjQzMTIsNTg5OTY4LDQ1OTAyOCw1MjQ0MDgsNTI0MzQ0LDU5MDAzMiw0NTkwMjAsNTI0MzkyLDUyNDMyOCw1OWU0LDUyNDI5Niw1MjQ0MjQsNTI0MzYwLDU5MDA2NCw0NTkwMTAsNTI0MzcyLDUyNDMwOCw1MjQ1NzIsNDU5MDI2LDUyNDQwNCw1MjQzNDAsNTkwMDI0LDQ1OTAxOCw1MjQzODgsNTI0MzI0LDU4OTk5Miw1MjQyOTIsNTI0NDIwLDUyNDM1Niw1OTAwNTYsNDU5MDE0LDUyNDM4MCw1MjQzMTYsNTg5OTc2LDQ1OTAzMCw1MjQ0MTIsNTI0MzQ4LDU5MDA0MCw0NTkwMjIsNTI0Mzk2LDUyNDMzMiw1OTAwMDgsNTI0MzAwLDUyNDQyOCw1MjQzNjQsNTkwMDcyLDQ1OTAwOSw1MjQzNzAsNTI0MzA2LDUyNDU3MCw0NTkwMjUsNTI0NDAyLDUyNDMzOCw1OTAwMjAsNDU5MDE3LDUyNDM4Niw1MjQzMjIsNTg5OTg4LDUyNDI5MCw1MjQ0MTgsNTI0MzU0LDU5MDA1Miw0NTkwMTMsNTI0Mzc4LDUyNDMxNCw1ODk5NzIsNDU5MDI5LDUyNDQxMCw1MjQzNDYsNTkwMDM2LDQ1OTAyMSw1MjQzOTQsNTI0MzMwLDU5MDAwNCw1MjQyOTgsNTI0NDI2LDUyNDM2Miw1OTAwNjgsNDU5MDExLDUyNDM3NCw1MjQzMTAsNTI0NTc0LDQ1OTAyNyw1MjQ0MDYsNTI0MzQyLDU5MDAyOCw0NTkwMTksNTI0MzkwLDUyNDMyNiw1ODk5OTYsNTI0Mjk0LDUyNDQyMiw1MjQzNTgsNTkwMDYwLDQ1OTAxNSw1MjQzODIsNTI0MzE4LDU4OTk4MCw0NTkwMzEsNTI0NDE0LDUyNDM1MCw1OTAwNDQsNDU5MDIzLDUyNDM5OCw1MjQzMzQsNTkwMDEyLDUyNDMwMiw1MjQ0MzAsNTI0MzY2LDU5MDA3Niw0NTkwMDgsNTI0MzY5LDUyNDMwNSw1MjQ1NjksNDU5MDI0LDUyNDQwMSw1MjQzMzcsNTkwMDE4LDQ1OTAxNiw1MjQzODUsNTI0MzIxLDU4OTk4Niw1MjQyODksNTI0NDE3LDUyNDM1Myw1OTAwNTAsNDU5MDEyLDUyNDM3Nyw1MjQzMTMsNTg5OTcwLDQ1OTAyOCw1MjQ0MDksNTI0MzQ1LDU5MDAzNCw0NTkwMjAsNTI0MzkzLDUyNDMyOSw1OTAwMDIsNTI0Mjk3LDUyNDQyNSw1MjQzNjEsNTkwMDY2LDQ1OTAxMCw1MjQzNzMsNTI0MzA5LDUyNDU3Myw0NTkwMjYsNTI0NDA1LDUyNDM0MSw1OTAwMjYsNDU5MDE4LDUyNDM4OSw1MjQzMjUsNTg5OTk0LDUyNDI5Myw1MjQ0MjEsNTI0MzU3LDU5MDA1OCw0NTkwMTQsNTI0MzgxLDUyNDMxNyw1ODk5NzgsNDU5MDMwLDUyNDQxMyw1MjQzNDksNTkwMDQyLDQ1OTAyMiw1MjQzOTcsNTI0MzMzLDU5MDAxMCw1MjQzMDEsNTI0NDI5LDUyNDM2NSw1OTAwNzQsNDU5MDA5LDUyNDM3MSw1MjQzMDcsNTI0NTcxLDQ1OTAyNSw1MjQ0MDMsNTI0MzM5LDU5MDAyMiw0NTkwMTcsNTI0Mzg3LDUyNDMyMyw1ODk5OTAsNTI0MjkxLDUyNDQxOSw1MjQzNTUsNTkwMDU0LDQ1OTAxMyw1MjQzNzksNTI0MzE1LDU4OTk3NCw0NTkwMjksNTI0NDExLDUyNDM0Nyw1OTAwMzgsNDU5MDIxLDUyNDM5NSw1MjQzMzEsNTkwMDA2LDUyNDI5OSw1MjQ0MjcsNTI0MzYzLDU5MDA3MCw0NTkwMTEsNTI0Mzc1LDUyNDMxMSw1MjQ1NzUsNDU5MDI3LDUyNDQwNyw1MjQzNDMsNTkwMDMwLDQ1OTAxOSw1MjQzOTEsNTI0MzI3LDU4OTk5OCw1MjQyOTUsNTI0NDIzLDUyNDM1OSw1OTAwNjIsNDU5MDE1LDUyNDM4Myw1MjQzMTksNTg5OTgyLDQ1OTAzMSw1MjQ0MTUsNTI0MzUxLDU5MDA0Niw0NTkwMjMsNTI0Mzk5LDUyNDMzNSw1OTAwMTQsNTI0MzAzLDUyNDQzMSw1MjQzNjcsNTkwMDc4LDQ1OTAwOCw1MjQzNjgsNTI0MzA0LDUyNDU2OCw0NTkwMjQsNTI0NDAwLDUyNDMzNiw1OTAwMTcsNDU5MDE2LDUyNDM4NCw1MjQzMjAsNTg5OTg1LDUyNDI4OCw1MjQ0MTYsNTI0MzUyLDU5MDA0OSw0NTkwMTIsNTI0Mzc2LDUyNDMxMiw1ODk5NjksNDU5MDI4LDUyNDQwOCw1MjQzNDQsNTkwMDMzLDQ1OTAyMCw1MjQzOTIsNTI0MzI4LDU5MDAwMSw1MjQyOTYsNTI0NDI0LDUyNDM2MCw1OTAwNjUsNDU5MDEwLDUyNDM3Miw1MjQzMDgsNTI0NTcyLDQ1OTAyNiw1MjQ0MDQsNTI0MzQwLDU5MDAyNSw0NTkwMTgsNTI0Mzg4LDUyNDMyNCw1ODk5OTMsNTI0MjkyLDUyNDQyMCw1MjQzNTYsNTkwMDU3LDQ1OTAxNCw1MjQzODAsNTI0MzE2LDU4OTk3Nyw0NTkwMzAsNTI0NDEyLDUyNDM0OCw1OTAwNDEsNDU5MDIyLDUyNDM5Niw1MjQzMzIsNTkwMDA5LDUyNDMwMCw1MjQ0MjgsNTI0MzY0LDU5MDA3Myw0NTkwMDksNTI0MzcwLDUyNDMwNiw1MjQ1NzAsNDU5MDI1LDUyNDQwMiw1MjQzMzgsNTkwMDIxLDQ1OTAxNyw1MjQzODYsNTI0MzIyLDU4OTk4OSw1MjQyOTAsNTI0NDE4LDUyNDM1NCw1OTAwNTMsNDU5MDEzLDUyNDM3OCw1MjQzMTQsNTg5OTczLDQ1OTAyOSw1MjQ0MTAsNTI0MzQ2LDU5MDAzNyw0NTkwMjEsNTI0Mzk0LDUyNDMzMCw1OTAwMDUsNTI0Mjk4LDUyNDQyNiw1MjQzNjIsNTkwMDY5LDQ1OTAxMSw1MjQzNzQsNTI0MzEwLDUyNDU3NCw0NTkwMjcsNTI0NDA2LDUyNDM0Miw1OTAwMjksNDU5MDE5LDUyNDM5MCw1MjQzMjYsNTg5OTk3LDUyNDI5NCw1MjQ0MjIsNTI0MzU4LDU5MDA2MSw0NTkwMTUsNTI0MzgyLDUyNDMxOCw1ODk5ODEsNDU5MDMxLDUyNDQxNCw1MjQzNTAsNTkwMDQ1LDQ1OTAyMyw1MjQzOTgsNTI0MzM0LDU5MDAxMyw1MjQzMDIsNTI0NDMwLDUyNDM2Niw1OTAwNzcsNDU5MDA4LDUyNDM2OSw1MjQzMDUsNTI0NTY5LDQ1OTAyNCw1MjQ0MDEsNTI0MzM3LDU5MDAxOSw0NTkwMTYsNTI0Mzg1LDUyNDMyMSw1ODk5ODcsNTI0Mjg5LDUyNDQxNyw1MjQzNTMsNTkwMDUxLDQ1OTAxMiw1MjQzNzcsNTI0MzEzLDU4OTk3MSw0NTkwMjgsNTI0NDA5LDUyNDM0NSw1OTAwMzUsNDU5MDIwLDUyNDM5Myw1MjQzMjksNTkwMDAzLDUyNDI5Nyw1MjQ0MjUsNTI0MzYxLDU5MDA2Nyw0NTkwMTAsNTI0MzczLDUyNDMwOSw1MjQ1NzMsNDU5MDI2LDUyNDQwNSw1MjQzNDEsNTkwMDI3LDQ1OTAxOCw1MjQzODksNTI0MzI1LDU4OTk5NSw1MjQyOTMsNTI0NDIxLDUyNDM1Nyw1OTAwNTksNDU5MDE0LDUyNDM4MSw1MjQzMTcsNTg5OTc5LDQ1OTAzMCw1MjQ0MTMsNTI0MzQ5LDU5MDA0Myw0NTkwMjIsNTI0Mzk3LDUyNDMzMyw1OTAwMTEsNTI0MzAxLDUyNDQyOSw1MjQzNjUsNTkwMDc1LDQ1OTAwOSw1MjQzNzEsNTI0MzA3LDUyNDU3MSw0NTkwMjUsNTI0NDAzLDUyNDMzOSw1OTAwMjMsNDU5MDE3LDUyNDM4Nyw1MjQzMjMsNTg5OTkxLDUyNDI5MSw1MjQ0MTksNTI0MzU1LDU5MDA1NSw0NTkwMTMsNTI0Mzc5LDUyNDMxNSw1ODk5NzUsNDU5MDI5LDUyNDQxMSw1MjQzNDcsNTkwMDM5LDQ1OTAyMSw1MjQzOTUsNTI0MzMxLDU5MDAwNyw1MjQyOTksNTI0NDI3LDUyNDM2Myw1OTAwNzEsNDU5MDExLDUyNDM3NSw1MjQzMTEsNTI0NTc1LDQ1OTAyNyw1MjQ0MDcsNTI0MzQzLDU5MDAzMSw0NTkwMTksNTI0MzkxLDUyNDMyNyw1ODk5OTksNTI0Mjk1LDUyNDQyMyw1MjQzNTksNTkwMDYzLDQ1OTAxNSw1MjQzODMsNTI0MzE5LDU4OTk4Myw0NTkwMzEsNTI0NDE1LDUyNDM1MSw1OTAwNDcsNDU5MDIzLDUyNDM5OSw1MjQzMzUsNTkwMDE1LDUyNDMwMyw1MjQ0MzEsNTI0MzY3LDU5MDA3OV0pLDldLGM9W25ldyBJbnQzMkFycmF5KFszMjc2ODAsMzI3Njk2LDMyNzY4OCwzMjc3MDQsMzI3Njg0LDMyNzcwMCwzMjc2OTIsMzI3NzA4LDMyNzY4MiwzMjc2OTgsMzI3NjkwLDMyNzcwNiwzMjc2ODYsMzI3NzAyLDMyNzY5NCwwLDMyNzY4MSwzMjc2OTcsMzI3Njg5LDMyNzcwNSwzMjc2ODUsMzI3NzAxLDMyNzY5MywzMjc3MDksMzI3NjgzLDMyNzY5OSwzMjc2OTEsMzI3NzA3LDMyNzY4NywzMjc3MDMsMzI3Njk1LDBdKSw1XTtmdW5jdGlvbiBGbGF0ZVN0cmVhbSh0LHIpe3RoaXMuc3RyPXQ7dGhpcy5kaWN0PXQuZGljdDt2YXIgYT10LmdldEJ5dGUoKSxvPXQuZ2V0Qnl0ZSgpO2lmKC0xPT09YXx8LTE9PT1vKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJJbnZhbGlkIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW06ICIuY29uY2F0KGEsIiwgIikuY29uY2F0KG8pKTtpZig4IT0oMTUmYSkpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIlVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIGZsYXRlIHN0cmVhbTogIi5jb25jYXQoYSwiLCAiKS5jb25jYXQobykpO2lmKCgoYTw8OCkrbyklMzEhPTApdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkJhZCBGQ0hFQ0sgaW4gZmxhdGUgc3RyZWFtOiAiLmNvbmNhdChhLCIsICIpLmNvbmNhdChvKSk7aWYoMzImbyl0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06ICIuY29uY2F0KGEsIiwgIikuY29uY2F0KG8pKTt0aGlzLmNvZGVTaXplPTA7dGhpcy5jb2RlQnVmPTA7aC5jYWxsKHRoaXMscil9RmxhdGVTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaC5wcm90b3R5cGUpO0ZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRCaXRzPWZ1bmN0aW9uIEZsYXRlU3RyZWFtX2dldEJpdHModCl7Zm9yKHZhciByLGE9dGhpcy5zdHIsbz10aGlzLmNvZGVTaXplLGM9dGhpcy5jb2RlQnVmO288dDspe2lmKC0xPT09KHI9YS5nZXRCeXRlKCkpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7Y3w9cjw8bztvKz04fXI9YyYoMTw8dCktMTt0aGlzLmNvZGVCdWY9Yz4+dDt0aGlzLmNvZGVTaXplPW8tPXQ7cmV0dXJuIHJ9O0ZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRDb2RlPWZ1bmN0aW9uIEZsYXRlU3RyZWFtX2dldENvZGUodCl7Zm9yKHZhciByLGE9dGhpcy5zdHIsbz10WzBdLGM9dFsxXSxsPXRoaXMuY29kZVNpemUsdT10aGlzLmNvZGVCdWY7bDxjJiYtMSE9PShyPWEuZ2V0Qnl0ZSgpKTspe3V8PXI8PGw7bCs9OH12YXIgaD1vW3UmKDE8PGMpLTFdLGQ9aD4+MTYscD02NTUzNSZoO2lmKGQ8MXx8bDxkKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7dGhpcy5jb2RlQnVmPXU+PmQ7dGhpcy5jb2RlU2l6ZT1sLWQ7cmV0dXJuIHB9O0ZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZW5lcmF0ZUh1ZmZtYW5UYWJsZT1mdW5jdGlvbiBmbGF0ZVN0cmVhbUdlbmVyYXRlSHVmZm1hblRhYmxlKHQpe3ZhciByLGE9dC5sZW5ndGgsaT0wO2ZvcihyPTA7cjxhOysrcil0W3JdPmkmJihpPXRbcl0pO2Zvcih2YXIgbz0xPDxpLGM9bmV3IEludDMyQXJyYXkobyksbD0xLHU9MCxoPTI7bDw9aTsrK2wsdTw8PTEsaDw8PTEpZm9yKHZhciBkPTA7ZDxhOysrZClpZih0W2RdPT09bCl7dmFyIHA9MCxtPXU7Zm9yKHI9MDtyPGw7KytyKXtwPXA8PDF8MSZtO20+Pj0xfWZvcihyPXA7cjxvO3IrPWgpY1tyXT1sPDwxNnxkOysrdX1yZXR1cm5bYyxpXX07RmxhdGVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbiBGbGF0ZVN0cmVhbV9yZWFkQmxvY2soKXt2YXIgbCx1LGg9dGhpcy5zdHIsZD10aGlzLmdldEJpdHMoMyk7MSZkJiYodGhpcy5lb2Y9ITApO2lmKDAhPT0oZD4+PTEpKXt2YXIgcCxtO2lmKDE9PT1kKXtwPW87bT1jfWVsc2V7aWYoMiE9PWQpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIlVua25vd24gYmxvY2sgdHlwZSBpbiBmbGF0ZSBzdHJlYW0iKTt2YXIgZyx5PXRoaXMuZ2V0Qml0cyg1KSsyNTcsYj10aGlzLmdldEJpdHMoNSkrMSx2PXRoaXMuZ2V0Qml0cyg0KSs0LFM9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpO2ZvcihnPTA7Zzx2OysrZylTW3RbZ11dPXRoaXMuZ2V0Qml0cygzKTt2YXIgaz10aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKFMpO3U9MDtnPTA7Zm9yKHZhciB3LEMsXyx4PXkrYixBPW5ldyBVaW50OEFycmF5KHgpO2c8eDspe3ZhciBUPXRoaXMuZ2V0Q29kZShrKTtpZigxNj09PVQpe3c9MjtDPTM7Xz11fWVsc2UgaWYoMTc9PT1UKXt3PTM7Qz0zO189dT0wfWVsc2V7aWYoMTghPT1UKXtBW2crK109dT1UO2NvbnRpbnVlfXc9NztDPTExO189dT0wfWZvcih2YXIgUj10aGlzLmdldEJpdHModykrQztSLS0gPjA7KUFbZysrXT1ffXA9dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShBLnN1YmFycmF5KDAseSkpO209dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShBLnN1YmFycmF5KHkseCkpfWZvcih2YXIgST0obD10aGlzLmJ1ZmZlcik/bC5sZW5ndGg6MCxQPXRoaXMuYnVmZmVyTGVuZ3RoOzspe3ZhciBPPXRoaXMuZ2V0Q29kZShwKTtpZihPPDI1Nil7UCsxPj1JJiYoST0obD10aGlzLmVuc3VyZUJ1ZmZlcihQKzEpKS5sZW5ndGgpO2xbUCsrXT1PfWVsc2V7aWYoMjU2PT09Tyl7dGhpcy5idWZmZXJMZW5ndGg9UDtyZXR1cm59dmFyIEU9KE89cltPLT0yNTddKT4+MTY7RT4wJiYoRT10aGlzLmdldEJpdHMoRSkpO3U9KDY1NTM1Jk8pK0U7Tz10aGlzLmdldENvZGUobSk7KEU9KE89YVtPXSk+PjE2KT4wJiYoRT10aGlzLmdldEJpdHMoRSkpO3ZhciBCPSg2NTUzNSZPKStFO1ArdT49SSYmKEk9KGw9dGhpcy5lbnN1cmVCdWZmZXIoUCt1KSkubGVuZ3RoKTtmb3IodmFyIEQ9MDtEPHU7KytELCsrUClsW1BdPWxbUC1CXX19fWVsc2V7dmFyIE07aWYoLTE9PT0oTT1oLmdldEJ5dGUoKSkpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7dmFyIEw9TTtpZigtMT09PShNPWguZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTtMfD1NPDw4O2lmKC0xPT09KE09aC5nZXRCeXRlKCkpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO3ZhciBOPU07aWYoLTE9PT0oTT1oLmdldEJ5dGUoKSkpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7aWYoKE58PU08PDgpIT09KDY1NTM1Jn5MKSYmKDAhPT1MfHwwIT09TikpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkJhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbSIpO3RoaXMuY29kZUJ1Zj0wO3RoaXMuY29kZVNpemU9MDt2YXIgVT10aGlzLmJ1ZmZlckxlbmd0aCxqPVUrTDtsPXRoaXMuZW5zdXJlQnVmZmVyKGopO3RoaXMuYnVmZmVyTGVuZ3RoPWo7aWYoMD09PUwpLTE9PT1oLnBlZWtCeXRlKCkmJih0aGlzLmVvZj0hMCk7ZWxzZXt2YXIgcT1oLmdldEJ5dGVzKEwpO2wuc2V0KHEsVSk7cS5sZW5ndGg8TCYmKHRoaXMuZW9mPSEwKX19fTtyZXR1cm4gRmxhdGVTdHJlYW19KCk7ci5GbGF0ZVN0cmVhbT1wO3ZhciBtPWZ1bmN0aW9uIFByZWRpY3RvclN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBQcmVkaWN0b3JTdHJlYW0odCxyLGEpe2lmKCEoMCxvLmlzRGljdCkoYSkpcmV0dXJuIHQ7dmFyIGM9dGhpcy5wcmVkaWN0b3I9YS5nZXQoIlByZWRpY3RvciIpfHwxO2lmKGM8PTEpcmV0dXJuIHQ7aWYoMiE9PWMmJihjPDEwfHxjPjE1KSl0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAiLmNvbmNhdChjKSk7dGhpcy5yZWFkQmxvY2s9Mj09PWM/dGhpcy5yZWFkQmxvY2tUaWZmOnRoaXMucmVhZEJsb2NrUG5nO3RoaXMuc3RyPXQ7dGhpcy5kaWN0PXQuZGljdDt2YXIgbD10aGlzLmNvbG9ycz1hLmdldCgiQ29sb3JzIil8fDEsdT10aGlzLmJpdHM9YS5nZXQoIkJpdHNQZXJDb21wb25lbnQiKXx8OCxkPXRoaXMuY29sdW1ucz1hLmdldCgiQ29sdW1ucyIpfHwxO3RoaXMucGl4Qnl0ZXM9bCp1Kzc+PjM7dGhpcy5yb3dCeXRlcz1kKmwqdSs3Pj4zO2guY2FsbCh0aGlzLHIpO3JldHVybiB0aGlzfVByZWRpY3RvclN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShoLnByb3RvdHlwZSk7UHJlZGljdG9yU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2tUaWZmPWZ1bmN0aW9uIHByZWRpY3RvclN0cmVhbVJlYWRCbG9ja1RpZmYoKXt2YXIgdD10aGlzLnJvd0J5dGVzLHI9dGhpcy5idWZmZXJMZW5ndGgsYT10aGlzLmVuc3VyZUJ1ZmZlcihyK3QpLGk9dGhpcy5iaXRzLG89dGhpcy5jb2xvcnMsYz10aGlzLnN0ci5nZXRCeXRlcyh0KTt0aGlzLmVvZj0hYy5sZW5ndGg7aWYoIXRoaXMuZW9mKXt2YXIgbCx1PTAsaD0wLGQ9MCxwPTAsbT1yO2lmKDE9PT1pJiYxPT09bylmb3IobD0wO2w8dDsrK2wpe3ZhciBnPWNbbF1edTtnXj1nPj4xO2dePWc+PjI7dT0oMSYoZ149Zz4+NCkpPDw3O2FbbSsrXT1nfWVsc2UgaWYoOD09PWkpe2ZvcihsPTA7bDxvOysrbClhW20rK109Y1tsXTtmb3IoO2w8dDsrK2wpe2FbbV09YVttLW9dK2NbbF07bSsrfX1lbHNlIGlmKDE2PT09aSl7dmFyIHk9MipvO2ZvcihsPTA7bDx5OysrbClhW20rK109Y1tsXTtmb3IoO2w8dDtsKz0yKXt2YXIgYj0oKDI1NSZjW2xdKTw8OCkrKDI1NSZjW2wrMV0pKygoMjU1JmFbbS15XSk8PDgpKygyNTUmYVttLXkrMV0pO2FbbSsrXT1iPj44JjI1NTthW20rK109MjU1JmJ9fWVsc2V7dmFyIHY9bmV3IFVpbnQ4QXJyYXkobysxKSxTPSgxPDxpKS0xLGs9MCx3PXIsQz10aGlzLmNvbHVtbnM7Zm9yKGw9MDtsPEM7KytsKWZvcih2YXIgXz0wO188bzsrK18pe2lmKGQ8aSl7dT11PDw4fDI1NSZjW2srK107ZCs9OH12W19dPXZbX10rKHU+PmQtaSkmUztkLT1pO2g9aDw8aXx2W19dO2lmKChwKz1pKT49OCl7YVt3KytdPWg+PnAtOCYyNTU7cC09OH19cD4wJiYoYVt3KytdPShoPDw4LXApKyh1JigxPDw4LXApLTEpKX10aGlzLmJ1ZmZlckxlbmd0aCs9dH19O1ByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrUG5nPWZ1bmN0aW9uIHByZWRpY3RvclN0cmVhbVJlYWRCbG9ja1BuZygpe3ZhciB0PXRoaXMucm93Qnl0ZXMscj10aGlzLnBpeEJ5dGVzLGE9dGhpcy5zdHIuZ2V0Qnl0ZSgpLG89dGhpcy5zdHIuZ2V0Qnl0ZXModCk7dGhpcy5lb2Y9IW8ubGVuZ3RoO2lmKCF0aGlzLmVvZil7dmFyIGM9dGhpcy5idWZmZXJMZW5ndGgsbD10aGlzLmVuc3VyZUJ1ZmZlcihjK3QpLHU9bC5zdWJhcnJheShjLXQsYyk7MD09PXUubGVuZ3RoJiYodT1uZXcgVWludDhBcnJheSh0KSk7dmFyIGgsZCxwLG09Yztzd2l0Y2goYSl7Y2FzZSAwOmZvcihoPTA7aDx0OysraClsW20rK109b1toXTticmVhaztjYXNlIDE6Zm9yKGg9MDtoPHI7KytoKWxbbSsrXT1vW2hdO2Zvcig7aDx0OysraCl7bFttXT1sW20tcl0rb1toXSYyNTU7bSsrfWJyZWFrO2Nhc2UgMjpmb3IoaD0wO2g8dDsrK2gpbFttKytdPXVbaF0rb1toXSYyNTU7YnJlYWs7Y2FzZSAzOmZvcihoPTA7aDxyOysraClsW20rK109KHVbaF0+PjEpK29baF07Zm9yKDtoPHQ7KytoKXtsW21dPSh1W2hdK2xbbS1yXT4+MSkrb1toXSYyNTU7bSsrfWJyZWFrO2Nhc2UgNDpmb3IoaD0wO2g8cjsrK2gpe2Q9dVtoXTtwPW9baF07bFttKytdPWQrcH1mb3IoO2g8dDsrK2gpe2Q9dVtoXTt2YXIgZz11W2gtcl0seT1sW20tcl0sYj15K2QtZyx2PWIteTt2PDAmJih2PS12KTt2YXIgUz1iLWQ7UzwwJiYoUz0tUyk7dmFyIGs9Yi1nO2s8MCYmKGs9LWspO3A9b1toXTtsW20rK109djw9UyYmdjw9az95K3A6Uzw9az9kK3A6ZytwfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIlVuc3VwcG9ydGVkIHByZWRpY3RvcjogIi5jb25jYXQoYSkpfXRoaXMuYnVmZmVyTGVuZ3RoKz10fX07cmV0dXJuIFByZWRpY3RvclN0cmVhbX0oKTtyLlByZWRpY3RvclN0cmVhbT1tO3ZhciBnPWZ1bmN0aW9uIERlY3J5cHRTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gRGVjcnlwdFN0cmVhbSh0LHIsYSl7dGhpcy5zdHI9dDt0aGlzLmRpY3Q9dC5kaWN0O3RoaXMuZGVjcnlwdD1hO3RoaXMubmV4dENodW5rPW51bGw7dGhpcy5pbml0aWFsaXplZD0hMTtoLmNhbGwodGhpcyxyKX1EZWNyeXB0U3RyZWFtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGgucHJvdG90eXBlKTtEZWNyeXB0U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2s9ZnVuY3Rpb24gRGVjcnlwdFN0cmVhbV9yZWFkQmxvY2soKXt2YXIgdDtpZih0aGlzLmluaXRpYWxpemVkKXQ9dGhpcy5uZXh0Q2h1bms7ZWxzZXt0PXRoaXMuc3RyLmdldEJ5dGVzKDUxMik7dGhpcy5pbml0aWFsaXplZD0hMH1pZih0JiYwIT09dC5sZW5ndGgpe3RoaXMubmV4dENodW5rPXRoaXMuc3RyLmdldEJ5dGVzKDUxMik7dmFyIHI9dGhpcy5uZXh0Q2h1bmsmJnRoaXMubmV4dENodW5rLmxlbmd0aD4wO3Q9KDAsdGhpcy5kZWNyeXB0KSh0LCFyKTt2YXIgYSxpPXRoaXMuYnVmZmVyTGVuZ3RoLG89dC5sZW5ndGgsYz10aGlzLmVuc3VyZUJ1ZmZlcihpK28pO2ZvcihhPTA7YTxvO2ErKyljW2krK109dFthXTt0aGlzLmJ1ZmZlckxlbmd0aD1pfWVsc2UgdGhpcy5lb2Y9ITB9O3JldHVybiBEZWNyeXB0U3RyZWFtfSgpO3IuRGVjcnlwdFN0cmVhbT1nO3ZhciB5PWZ1bmN0aW9uIEFzY2lpODVTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gQXNjaWk4NVN0cmVhbSh0LHIpe3RoaXMuc3RyPXQ7dGhpcy5kaWN0PXQuZGljdDt0aGlzLmlucHV0PW5ldyBVaW50OEFycmF5KDUpO3ImJihyKj0uOCk7aC5jYWxsKHRoaXMscil9QXNjaWk4NVN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShoLnByb3RvdHlwZSk7QXNjaWk4NVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uIEFzY2lpODVTdHJlYW1fcmVhZEJsb2NrKCl7Zm9yKHZhciB0PXRoaXMuc3RyLHI9dC5nZXRCeXRlKCk7KDAsYy5pc1doaXRlU3BhY2UpKHIpOylyPXQuZ2V0Qnl0ZSgpO2lmKC0xIT09ciYmMTI2IT09cil7dmFyIGEsaSxvPXRoaXMuYnVmZmVyTGVuZ3RoO2lmKDEyMj09PXIpe2E9dGhpcy5lbnN1cmVCdWZmZXIobys0KTtmb3IoaT0wO2k8NDsrK2kpYVtvK2ldPTA7dGhpcy5idWZmZXJMZW5ndGgrPTR9ZWxzZXt2YXIgbD10aGlzLmlucHV0O2xbMF09cjtmb3IoaT0xO2k8NTsrK2kpe3I9dC5nZXRCeXRlKCk7Zm9yKDsoMCxjLmlzV2hpdGVTcGFjZSkocik7KXI9dC5nZXRCeXRlKCk7bFtpXT1yO2lmKC0xPT09cnx8MTI2PT09cilicmVha31hPXRoaXMuZW5zdXJlQnVmZmVyKG8raS0xKTt0aGlzLmJ1ZmZlckxlbmd0aCs9aS0xO2lmKGk8NSl7Zm9yKDtpPDU7KytpKWxbaV09MTE3O3RoaXMuZW9mPSEwfXZhciB1PTA7Zm9yKGk9MDtpPDU7KytpKXU9ODUqdSsobFtpXS0zMyk7Zm9yKGk9MztpPj0wOy0taSl7YVtvK2ldPTI1NSZ1O3U+Pj04fX19ZWxzZSB0aGlzLmVvZj0hMH07cmV0dXJuIEFzY2lpODVTdHJlYW19KCk7ci5Bc2NpaTg1U3RyZWFtPXk7dmFyIGI9ZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW0odCxyKXt0aGlzLnN0cj10O3RoaXMuZGljdD10LmRpY3Q7dGhpcy5maXJzdERpZ2l0PS0xO3ImJihyKj0uNSk7aC5jYWxsKHRoaXMscil9QXNjaWlIZXhTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaC5wcm90b3R5cGUpO0FzY2lpSGV4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2s9ZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW1fcmVhZEJsb2NrKCl7dmFyIHQ9dGhpcy5zdHIuZ2V0Qnl0ZXMoOGUzKTtpZih0Lmxlbmd0aCl7Zm9yKHZhciByPXQubGVuZ3RoKzE+PjEsYT10aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCtyKSxpPXRoaXMuYnVmZmVyTGVuZ3RoLG89dGhpcy5maXJzdERpZ2l0LGM9MCxsPXQubGVuZ3RoO2M8bDtjKyspe3ZhciB1LGg9dFtjXTtpZihoPj00OCYmaDw9NTcpdT0xNSZoO2Vsc2V7aWYoIShoPj02NSYmaDw9NzB8fGg+PTk3JiZoPD0xMDIpKXtpZig2Mj09PWgpe3RoaXMuZW9mPSEwO2JyZWFrfWNvbnRpbnVlfXU9OSsoMTUmaCl9aWYobzwwKW89dTtlbHNle2FbaSsrXT1vPDw0fHU7bz0tMX19aWYobz49MCYmdGhpcy5lb2Ype2FbaSsrXT1vPDw0O289LTF9dGhpcy5maXJzdERpZ2l0PW87dGhpcy5idWZmZXJMZW5ndGg9aX1lbHNlIHRoaXMuZW9mPSEwfTtyZXR1cm4gQXNjaWlIZXhTdHJlYW19KCk7ci5Bc2NpaUhleFN0cmVhbT1iO3ZhciB2PWZ1bmN0aW9uIFJ1bkxlbmd0aFN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW0odCxyKXt0aGlzLnN0cj10O3RoaXMuZGljdD10LmRpY3Q7aC5jYWxsKHRoaXMscil9UnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGgucHJvdG90eXBlKTtSdW5MZW5ndGhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW1fcmVhZEJsb2NrKCl7dmFyIHQ9dGhpcy5zdHIuZ2V0Qnl0ZXMoMik7aWYoIXR8fHQubGVuZ3RoPDJ8fDEyOD09PXRbMF0pdGhpcy5lb2Y9ITA7ZWxzZXt2YXIgcixhPXRoaXMuYnVmZmVyTGVuZ3RoLGk9dFswXTtpZihpPDEyOCl7KHI9dGhpcy5lbnN1cmVCdWZmZXIoYStpKzEpKVthKytdPXRbMV07aWYoaT4wKXt2YXIgbz10aGlzLnN0ci5nZXRCeXRlcyhpKTtyLnNldChvLGEpO2ErPWl9fWVsc2V7aT0yNTctaTt2YXIgYz10WzFdO3I9dGhpcy5lbnN1cmVCdWZmZXIoYStpKzEpO2Zvcih2YXIgbD0wO2w8aTtsKyspclthKytdPWN9dGhpcy5idWZmZXJMZW5ndGg9YX19O3JldHVybiBSdW5MZW5ndGhTdHJlYW19KCk7ci5SdW5MZW5ndGhTdHJlYW09djt2YXIgUz1mdW5jdGlvbiBMWldTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gTFpXU3RyZWFtKHQscixhKXt0aGlzLnN0cj10O3RoaXMuZGljdD10LmRpY3Q7dGhpcy5jYWNoZWREYXRhPTA7dGhpcy5iaXRzQ2FjaGVkPTA7Zm9yKHZhciBpPXtlYXJseUNoYW5nZTphLGNvZGVMZW5ndGg6OSxuZXh0Q29kZToyNTgsZGljdGlvbmFyeVZhbHVlczpuZXcgVWludDhBcnJheSg0MDk2KSxkaWN0aW9uYXJ5TGVuZ3RoczpuZXcgVWludDE2QXJyYXkoNDA5NiksZGljdGlvbmFyeVByZXZDb2RlczpuZXcgVWludDE2QXJyYXkoNDA5NiksY3VycmVudFNlcXVlbmNlOm5ldyBVaW50OEFycmF5KDQwOTYpLGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDowfSxvPTA7bzwyNTY7KytvKXtpLmRpY3Rpb25hcnlWYWx1ZXNbb109bztpLmRpY3Rpb25hcnlMZW5ndGhzW29dPTF9dGhpcy5sendTdGF0ZT1pO2guY2FsbCh0aGlzLHIpfUxaV1N0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShoLnByb3RvdHlwZSk7TFpXU3RyZWFtLnByb3RvdHlwZS5yZWFkQml0cz1mdW5jdGlvbiBMWldTdHJlYW1fcmVhZEJpdHModCl7Zm9yKHZhciByPXRoaXMuYml0c0NhY2hlZCxhPXRoaXMuY2FjaGVkRGF0YTtyPHQ7KXt2YXIgaT10aGlzLnN0ci5nZXRCeXRlKCk7aWYoLTE9PT1pKXt0aGlzLmVvZj0hMDtyZXR1cm4gbnVsbH1hPWE8PDh8aTtyKz04fXRoaXMuYml0c0NhY2hlZD1yLT10O3RoaXMuY2FjaGVkRGF0YT1hO3RoaXMubGFzdENvZGU9bnVsbDtyZXR1cm4gYT4+PnImKDE8PHQpLTF9O0xaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uIExaV1N0cmVhbV9yZWFkQmxvY2soKXt2YXIgdCxyLGEsaT0xMDI0LG89dGhpcy5sendTdGF0ZTtpZihvKXt2YXIgYz1vLmVhcmx5Q2hhbmdlLGw9by5uZXh0Q29kZSx1PW8uZGljdGlvbmFyeVZhbHVlcyxoPW8uZGljdGlvbmFyeUxlbmd0aHMsZD1vLmRpY3Rpb25hcnlQcmV2Q29kZXMscD1vLmNvZGVMZW5ndGgsbT1vLnByZXZDb2RlLGc9by5jdXJyZW50U2VxdWVuY2UseT1vLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aCxiPTAsdj10aGlzLmJ1ZmZlckxlbmd0aCxTPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK2kpO2Zvcih0PTA7dDw1MTI7dCsrKXt2YXIgaz10aGlzLnJlYWRCaXRzKHApLHc9eT4wO2lmKGs8MjU2KXtnWzBdPWs7eT0xfWVsc2V7aWYoIShrPj0yNTgpKXtpZigyNTY9PT1rKXtwPTk7bD0yNTg7eT0wO2NvbnRpbnVlfXRoaXMuZW9mPSEwO2RlbGV0ZSB0aGlzLmx6d1N0YXRlO2JyZWFrfWlmKGs8bClmb3Iocj0oeT1oW2tdKS0xLGE9aztyPj0wO3ItLSl7Z1tyXT11W2FdO2E9ZFthXX1lbHNlIGdbeSsrXT1nWzBdfWlmKHcpe2RbbF09bTtoW2xdPWhbbV0rMTt1W2xdPWdbMF07cD0rK2wrYyZsK2MtMT9wOjB8TWF0aC5taW4oTWF0aC5sb2cobCtjKS8uNjkzMTQ3MTgwNTU5OTQ1MysxLDEyKX1tPWs7aWYoaTwoYis9eSkpe2Rve2krPTUxMn13aGlsZShpPGIpO1M9dGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGgraSl9Zm9yKHI9MDtyPHk7cisrKVNbdisrXT1nW3JdfW8ubmV4dENvZGU9bDtvLmNvZGVMZW5ndGg9cDtvLnByZXZDb2RlPW07by5jdXJyZW50U2VxdWVuY2VMZW5ndGg9eTt0aGlzLmJ1ZmZlckxlbmd0aD12fX07cmV0dXJuIExaV1N0cmVhbX0oKTtyLkxaV1N0cmVhbT1TO3ZhciBrPWZ1bmN0aW9uIE51bGxTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gTnVsbFN0cmVhbSgpe2wuY2FsbCh0aGlzLG5ldyBVaW50OEFycmF5KDApKX1OdWxsU3RyZWFtLnByb3RvdHlwZT1sLnByb3RvdHlwZTtyZXR1cm4gTnVsbFN0cmVhbX0oKTtyLk51bGxTdHJlYW09a30sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5DQ0lUVEZheFN0cmVhbT12b2lkIDA7dmFyIGk9YSgyMDIpLG89YSgyMTEpLGM9YSgyMDkpLGw9ZnVuY3Rpb24gQ0NJVFRGYXhTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gQ0NJVFRGYXhTdHJlYW0odCxyLGEpe3RoaXMuc3RyPXQ7dGhpcy5kaWN0PXQuZGljdDsoMCxpLmlzRGljdCkoYSl8fChhPWkuRGljdC5lbXB0eSk7dmFyIGw9e25leHQ6ZnVuY3Rpb24gbmV4dCgpe3JldHVybiB0LmdldEJ5dGUoKX19O3RoaXMuY2NpdHRGYXhEZWNvZGVyPW5ldyBvLkNDSVRURmF4RGVjb2RlcihsLHtLOmEuZ2V0KCJLIiksRW5kT2ZMaW5lOmEuZ2V0KCJFbmRPZkxpbmUiKSxFbmNvZGVkQnl0ZUFsaWduOmEuZ2V0KCJFbmNvZGVkQnl0ZUFsaWduIiksQ29sdW1uczphLmdldCgiQ29sdW1ucyIpLFJvd3M6YS5nZXQoIlJvd3MiKSxFbmRPZkJsb2NrOmEuZ2V0KCJFbmRPZkJsb2NrIiksQmxhY2tJczE6YS5nZXQoIkJsYWNrSXMxIil9KTtjLkRlY29kZVN0cmVhbS5jYWxsKHRoaXMscil9Q0NJVFRGYXhTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYy5EZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtDQ0lUVEZheFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uKCl7Zm9yKDshdGhpcy5lb2Y7KXt2YXIgdD10aGlzLmNjaXR0RmF4RGVjb2Rlci5yZWFkTmV4dENoYXIoKTtpZigtMT09PXQpe3RoaXMuZW9mPSEwO3JldHVybn10aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCsxKTt0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT10fX07cmV0dXJuIENDSVRURmF4U3RyZWFtfSgpO3IuQ0NJVFRGYXhTdHJlYW09bH0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5DQ0lUVEZheERlY29kZXI9dm9pZCAwO3ZhciBpPWEoNSksbz1mdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoKXt2YXIgdD1bWy0xLC0xXSxbLTEsLTFdLFs3LDhdLFs3LDddLFs2LDZdLFs2LDZdLFs2LDVdLFs2LDVdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdXSxyPVtbLTEsLTFdLFsxMiwtMl0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0OTZdLFsxMiwyNTYwXV0sYT1bWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbOCwyOV0sWzgsMjldLFs4LDMwXSxbOCwzMF0sWzgsNDVdLFs4LDQ1XSxbOCw0Nl0sWzgsNDZdLFs3LDIyXSxbNywyMl0sWzcsMjJdLFs3LDIyXSxbNywyM10sWzcsMjNdLFs3LDIzXSxbNywyM10sWzgsNDddLFs4LDQ3XSxbOCw0OF0sWzgsNDhdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzcsMjBdLFs3LDIwXSxbNywyMF0sWzcsMjBdLFs4LDMzXSxbOCwzM10sWzgsMzRdLFs4LDM0XSxbOCwzNV0sWzgsMzVdLFs4LDM2XSxbOCwzNl0sWzgsMzddLFs4LDM3XSxbOCwzOF0sWzgsMzhdLFs3LDE5XSxbNywxOV0sWzcsMTldLFs3LDE5XSxbOCwzMV0sWzgsMzFdLFs4LDMyXSxbOCwzMl0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbOCw1M10sWzgsNTNdLFs4LDU0XSxbOCw1NF0sWzcsMjZdLFs3LDI2XSxbNywyNl0sWzcsMjZdLFs4LDM5XSxbOCwzOV0sWzgsNDBdLFs4LDQwXSxbOCw0MV0sWzgsNDFdLFs4LDQyXSxbOCw0Ml0sWzgsNDNdLFs4LDQzXSxbOCw0NF0sWzgsNDRdLFs3LDIxXSxbNywyMV0sWzcsMjFdLFs3LDIxXSxbNywyOF0sWzcsMjhdLFs3LDI4XSxbNywyOF0sWzgsNjFdLFs4LDYxXSxbOCw2Ml0sWzgsNjJdLFs4LDYzXSxbOCw2M10sWzgsMF0sWzgsMF0sWzgsMzIwXSxbOCwzMjBdLFs4LDM4NF0sWzgsMzg0XSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs3LDI3XSxbNywyN10sWzcsMjddLFs3LDI3XSxbOCw1OV0sWzgsNTldLFs4LDYwXSxbOCw2MF0sWzksMTQ3Ml0sWzksMTUzNl0sWzksMTYwMF0sWzksMTcyOF0sWzcsMThdLFs3LDE4XSxbNywxOF0sWzcsMThdLFs3LDI0XSxbNywyNF0sWzcsMjRdLFs3LDI0XSxbOCw0OV0sWzgsNDldLFs4LDUwXSxbOCw1MF0sWzgsNTFdLFs4LDUxXSxbOCw1Ml0sWzgsNTJdLFs3LDI1XSxbNywyNV0sWzcsMjVdLFs3LDI1XSxbOCw1NV0sWzgsNTVdLFs4LDU2XSxbOCw1Nl0sWzgsNTddLFs4LDU3XSxbOCw1OF0sWzgsNThdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbOCw0NDhdLFs4LDQ0OF0sWzgsNTEyXSxbOCw1MTJdLFs5LDcwNF0sWzksNzY4XSxbOCw2NDBdLFs4LDY0MF0sWzgsNTc2XSxbOCw1NzZdLFs5LDgzMl0sWzksODk2XSxbOSw5NjBdLFs5LDEwMjRdLFs5LDEwODhdLFs5LDExNTJdLFs5LDEyMTZdLFs5LDEyODBdLFs5LDEzNDRdLFs5LDE0MDhdLFs3LDI1Nl0sWzcsMjU2XSxbNywyNTZdLFs3LDI1Nl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XV0sbz1bWy0xLC0xXSxbLTEsLTFdLFsxMiwtMl0sWzEyLC0yXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTIsMTk4NF0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjA0OF0sWzEyLDIxMTJdLFsxMiwyMTEyXSxbMTIsMjE3Nl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjI0MF0sWzEyLDIzMDRdLFsxMiwyMzA0XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTg1Nl0sWzExLDE5MjBdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjM2OF0sWzEyLDI0MzJdLFsxMiwyNDMyXSxbMTIsMjQ5Nl0sWzEyLDI0OTZdLFsxMiwyNTYwXSxbMTIsMjU2MF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMiw1Ml0sWzEyLDUyXSxbMTMsNjQwXSxbMTMsNzA0XSxbMTMsNzY4XSxbMTMsODMyXSxbMTIsNTVdLFsxMiw1NV0sWzEyLDU2XSxbMTIsNTZdLFsxMywxMjgwXSxbMTMsMTM0NF0sWzEzLDE0MDhdLFsxMywxNDcyXSxbMTIsNTldLFsxMiw1OV0sWzEyLDYwXSxbMTIsNjBdLFsxMywxNTM2XSxbMTMsMTYwMF0sWzExLDI0XSxbMTEsMjRdLFsxMSwyNF0sWzExLDI0XSxbMTEsMjVdLFsxMSwyNV0sWzExLDI1XSxbMTEsMjVdLFsxMywxNjY0XSxbMTMsMTcyOF0sWzEyLDMyMF0sWzEyLDMyMF0sWzEyLDM4NF0sWzEyLDM4NF0sWzEyLDQ0OF0sWzEyLDQ0OF0sWzEzLDUxMl0sWzEzLDU3Nl0sWzEyLDUzXSxbMTIsNTNdLFsxMiw1NF0sWzEyLDU0XSxbMTMsODk2XSxbMTMsOTYwXSxbMTMsMTAyNF0sWzEzLDEwODhdLFsxMywxMTUyXSxbMTMsMTIxNl0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdXSxjPVtbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzExLDIzXSxbMTEsMjNdLFsxMiw1MF0sWzEyLDUxXSxbMTIsNDRdLFsxMiw0NV0sWzEyLDQ2XSxbMTIsNDddLFsxMiw1N10sWzEyLDU4XSxbMTIsNjFdLFsxMiwyNTZdLFsxMCwxNl0sWzEwLDE2XSxbMTAsMTZdLFsxMCwxNl0sWzEwLDE3XSxbMTAsMTddLFsxMCwxN10sWzEwLDE3XSxbMTIsNDhdLFsxMiw0OV0sWzEyLDYyXSxbMTIsNjNdLFsxMiwzMF0sWzEyLDMxXSxbMTIsMzJdLFsxMiwzM10sWzEyLDQwXSxbMTIsNDFdLFsxMSwyMl0sWzExLDIyXSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzEyLDEyOF0sWzEyLDE5Ml0sWzEyLDI2XSxbMTIsMjddLFsxMiwyOF0sWzEyLDI5XSxbMTEsMTldLFsxMSwxOV0sWzExLDIwXSxbMTEsMjBdLFsxMiwzNF0sWzEyLDM1XSxbMTIsMzZdLFsxMiwzN10sWzEyLDM4XSxbMTIsMzldLFsxMSwyMV0sWzExLDIxXSxbMTIsNDJdLFsxMiw0M10sWzEwLDBdLFsxMCwwXSxbMTAsMF0sWzEwLDBdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl1dLGw9W1stMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzYsOV0sWzYsOF0sWzUsN10sWzUsN10sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl1dO2Z1bmN0aW9uIENDSVRURmF4RGVjb2Rlcih0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0Lm5leHQpdGhyb3cgbmV3IEVycm9yKCdDQ0lUVEZheERlY29kZXIgLSBpbnZhbGlkICJzb3VyY2UiIHBhcmFtZXRlci4nKTt0aGlzLnNvdXJjZT10O3RoaXMuZW9mPSExO3RoaXMuZW5jb2Rpbmc9ci5LfHwwO3RoaXMuZW9saW5lPXIuRW5kT2ZMaW5lfHwhMTt0aGlzLmJ5dGVBbGlnbj1yLkVuY29kZWRCeXRlQWxpZ258fCExO3RoaXMuY29sdW1ucz1yLkNvbHVtbnN8fDE3Mjg7dGhpcy5yb3dzPXIuUm93c3x8MDt2YXIgYSxpPXIuRW5kT2ZCbG9jaztudWxsPT1pJiYoaT0hMCk7dGhpcy5lb2Jsb2NrPWk7dGhpcy5ibGFjaz1yLkJsYWNrSXMxfHwhMTt0aGlzLmNvZGluZ0xpbmU9bmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucysxKTt0aGlzLnJlZkxpbmU9bmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucysyKTt0aGlzLmNvZGluZ0xpbmVbMF09dGhpcy5jb2x1bW5zO3RoaXMuY29kaW5nUG9zPTA7dGhpcy5yb3c9MDt0aGlzLm5leHRMaW5lMkQ9dGhpcy5lbmNvZGluZzwwO3RoaXMuaW5wdXRCaXRzPTA7dGhpcy5pbnB1dEJ1Zj0wO3RoaXMub3V0cHV0Qml0cz0wO3RoaXMucm93c0RvbmU9ITE7Zm9yKDswPT09KGE9dGhpcy5fbG9va0JpdHMoMTIpKTspdGhpcy5fZWF0Qml0cygxKTsxPT09YSYmdGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLm5leHRMaW5lMkQ9IXRoaXMuX2xvb2tCaXRzKDEpO3RoaXMuX2VhdEJpdHMoMSl9fUNDSVRURmF4RGVjb2Rlci5wcm90b3R5cGU9e3JlYWROZXh0Q2hhcjpmdW5jdGlvbiByZWFkTmV4dENoYXIoKXtpZih0aGlzLmVvZilyZXR1cm4tMTt2YXIgdCxyLGEsbyxjLGw9dGhpcy5yZWZMaW5lLHU9dGhpcy5jb2RpbmdMaW5lLGg9dGhpcy5jb2x1bW5zO2lmKDA9PT10aGlzLm91dHB1dEJpdHMpe3RoaXMucm93c0RvbmUmJih0aGlzLmVvZj0hMCk7aWYodGhpcy5lb2YpcmV0dXJuLTE7dGhpcy5lcnI9ITE7dmFyIGQscCxtO2lmKHRoaXMubmV4dExpbmUyRCl7Zm9yKG89MDt1W29dPGg7KytvKWxbb109dVtvXTtsW28rK109aDtsW29dPWg7dVswXT0wO3RoaXMuY29kaW5nUG9zPTA7dD0wO3I9MDtmb3IoO3VbdGhpcy5jb2RpbmdQb3NdPGg7KXN3aXRjaChkPXRoaXMuX2dldFR3b0RpbUNvZGUoKSl7Y2FzZSAwOnRoaXMuX2FkZFBpeGVscyhsW3QrMV0scik7bFt0KzFdPGgmJih0Kz0yKTticmVhaztjYXNlIDE6ZD1wPTA7aWYocil7ZG97ZCs9bT10aGlzLl9nZXRCbGFja0NvZGUoKX13aGlsZShtPj02NCk7ZG97cCs9bT10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShtPj02NCl9ZWxzZXtkb3tkKz1tPXRoaXMuX2dldFdoaXRlQ29kZSgpfXdoaWxlKG0+PTY0KTtkb3twKz1tPXRoaXMuX2dldEJsYWNrQ29kZSgpfXdoaWxlKG0+PTY0KX10aGlzLl9hZGRQaXhlbHModVt0aGlzLmNvZGluZ1Bvc10rZCxyKTt1W3RoaXMuY29kaW5nUG9zXTxoJiZ0aGlzLl9hZGRQaXhlbHModVt0aGlzLmNvZGluZ1Bvc10rcCwxXnIpO2Zvcig7bFt0XTw9dVt0aGlzLmNvZGluZ1Bvc10mJmxbdF08aDspdCs9MjticmVhaztjYXNlIDc6dGhpcy5fYWRkUGl4ZWxzKGxbdF0rMyxyKTtyXj0xO2lmKHVbdGhpcy5jb2RpbmdQb3NdPGgpeysrdDtmb3IoO2xbdF08PXVbdGhpcy5jb2RpbmdQb3NdJiZsW3RdPGg7KXQrPTJ9YnJlYWs7Y2FzZSA1OnRoaXMuX2FkZFBpeGVscyhsW3RdKzIscik7cl49MTtpZih1W3RoaXMuY29kaW5nUG9zXTxoKXsrK3Q7Zm9yKDtsW3RdPD11W3RoaXMuY29kaW5nUG9zXSYmbFt0XTxoOyl0Kz0yfWJyZWFrO2Nhc2UgMzp0aGlzLl9hZGRQaXhlbHMobFt0XSsxLHIpO3JePTE7aWYodVt0aGlzLmNvZGluZ1Bvc108aCl7Kyt0O2Zvcig7bFt0XTw9dVt0aGlzLmNvZGluZ1Bvc10mJmxbdF08aDspdCs9Mn1icmVhaztjYXNlIDI6dGhpcy5fYWRkUGl4ZWxzKGxbdF0scik7cl49MTtpZih1W3RoaXMuY29kaW5nUG9zXTxoKXsrK3Q7Zm9yKDtsW3RdPD11W3RoaXMuY29kaW5nUG9zXSYmbFt0XTxoOyl0Kz0yfWJyZWFrO2Nhc2UgODp0aGlzLl9hZGRQaXhlbHNOZWcobFt0XS0zLHIpO3JePTE7aWYodVt0aGlzLmNvZGluZ1Bvc108aCl7dD4wPy0tdDorK3Q7Zm9yKDtsW3RdPD11W3RoaXMuY29kaW5nUG9zXSYmbFt0XTxoOyl0Kz0yfWJyZWFrO2Nhc2UgNjp0aGlzLl9hZGRQaXhlbHNOZWcobFt0XS0yLHIpO3JePTE7aWYodVt0aGlzLmNvZGluZ1Bvc108aCl7dD4wPy0tdDorK3Q7Zm9yKDtsW3RdPD11W3RoaXMuY29kaW5nUG9zXSYmbFt0XTxoOyl0Kz0yfWJyZWFrO2Nhc2UgNDp0aGlzLl9hZGRQaXhlbHNOZWcobFt0XS0xLHIpO3JePTE7aWYodVt0aGlzLmNvZGluZ1Bvc108aCl7dD4wPy0tdDorK3Q7Zm9yKDtsW3RdPD11W3RoaXMuY29kaW5nUG9zXSYmbFt0XTxoOyl0Kz0yfWJyZWFrO2Nhc2UtMTp0aGlzLl9hZGRQaXhlbHMoaCwwKTt0aGlzLmVvZj0hMDticmVhaztkZWZhdWx0OigwLGkuaW5mbykoImJhZCAyZCBjb2RlIik7dGhpcy5fYWRkUGl4ZWxzKGgsMCk7dGhpcy5lcnI9ITB9fWVsc2V7dVswXT0wO3RoaXMuY29kaW5nUG9zPTA7cj0wO2Zvcig7dVt0aGlzLmNvZGluZ1Bvc108aDspe2Q9MDtpZihyKWRve2QrPW09dGhpcy5fZ2V0QmxhY2tDb2RlKCl9d2hpbGUobT49NjQpO2Vsc2UgZG97ZCs9bT10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShtPj02NCk7dGhpcy5fYWRkUGl4ZWxzKHVbdGhpcy5jb2RpbmdQb3NdK2Qscik7cl49MX19dmFyIGc9ITE7dGhpcy5ieXRlQWxpZ24mJih0aGlzLmlucHV0Qml0cyY9LTgpO2lmKHRoaXMuZW9ibG9ja3x8dGhpcy5yb3chPT10aGlzLnJvd3MtMSl7ZD10aGlzLl9sb29rQml0cygxMik7aWYodGhpcy5lb2xpbmUpZm9yKDstMSE9PWQmJjEhPT1kOyl7dGhpcy5fZWF0Qml0cygxKTtkPXRoaXMuX2xvb2tCaXRzKDEyKX1lbHNlIGZvcig7MD09PWQ7KXt0aGlzLl9lYXRCaXRzKDEpO2Q9dGhpcy5fbG9va0JpdHMoMTIpfWlmKDE9PT1kKXt0aGlzLl9lYXRCaXRzKDEyKTtnPSEwfWVsc2UtMT09PWQmJih0aGlzLmVvZj0hMCl9ZWxzZSB0aGlzLnJvd3NEb25lPSEwO2lmKCF0aGlzLmVvZiYmdGhpcy5lbmNvZGluZz4wJiYhdGhpcy5yb3dzRG9uZSl7dGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfWlmKHRoaXMuZW9ibG9jayYmZyYmdGhpcy5ieXRlQWxpZ24pe2lmKDE9PT0oZD10aGlzLl9sb29rQml0cygxMikpKXt0aGlzLl9lYXRCaXRzKDEyKTtpZih0aGlzLmVuY29kaW5nPjApe3RoaXMuX2xvb2tCaXRzKDEpO3RoaXMuX2VhdEJpdHMoMSl9aWYodGhpcy5lbmNvZGluZz49MClmb3Iobz0wO288NDsrK28pezEhPT0oZD10aGlzLl9sb29rQml0cygxMikpJiYoMCxpLmluZm8pKCJiYWQgcnRjIGNvZGU6ICIrZCk7dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfX10aGlzLmVvZj0hMH19ZWxzZSBpZih0aGlzLmVyciYmdGhpcy5lb2xpbmUpe2Zvcig7Oyl7aWYoLTE9PT0oZD10aGlzLl9sb29rQml0cygxMykpKXt0aGlzLmVvZj0hMDtyZXR1cm4tMX1pZihkPj4xPT0xKWJyZWFrO3RoaXMuX2VhdEJpdHMoMSl9dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9lYXRCaXRzKDEpO3RoaXMubmV4dExpbmUyRD0hKDEmZCl9fXVbMF0+MD90aGlzLm91dHB1dEJpdHM9dVt0aGlzLmNvZGluZ1Bvcz0wXTp0aGlzLm91dHB1dEJpdHM9dVt0aGlzLmNvZGluZ1Bvcz0xXTt0aGlzLnJvdysrfWlmKHRoaXMub3V0cHV0Qml0cz49OCl7Yz0xJnRoaXMuY29kaW5nUG9zPzA6MjU1O3RoaXMub3V0cHV0Qml0cy09ODtpZigwPT09dGhpcy5vdXRwdXRCaXRzJiZ1W3RoaXMuY29kaW5nUG9zXTxoKXt0aGlzLmNvZGluZ1BvcysrO3RoaXMub3V0cHV0Qml0cz11W3RoaXMuY29kaW5nUG9zXS11W3RoaXMuY29kaW5nUG9zLTFdfX1lbHNle2E9ODtjPTA7ZG97aWYodGhpcy5vdXRwdXRCaXRzPmEpe2M8PD1hOzEmdGhpcy5jb2RpbmdQb3N8fChjfD0yNTU+PjgtYSk7dGhpcy5vdXRwdXRCaXRzLT1hO2E9MH1lbHNle2M8PD10aGlzLm91dHB1dEJpdHM7MSZ0aGlzLmNvZGluZ1Bvc3x8KGN8PTI1NT4+OC10aGlzLm91dHB1dEJpdHMpO2EtPXRoaXMub3V0cHV0Qml0czt0aGlzLm91dHB1dEJpdHM9MDtpZih1W3RoaXMuY29kaW5nUG9zXTxoKXt0aGlzLmNvZGluZ1BvcysrO3RoaXMub3V0cHV0Qml0cz11W3RoaXMuY29kaW5nUG9zXS11W3RoaXMuY29kaW5nUG9zLTFdfWVsc2UgaWYoYT4wKXtjPDw9YTthPTB9fX13aGlsZShhKX10aGlzLmJsYWNrJiYoY149MjU1KTtyZXR1cm4gY30sX2FkZFBpeGVsczpmdW5jdGlvbiBfYWRkUGl4ZWxzKHQscil7dmFyIGE9dGhpcy5jb2RpbmdMaW5lLG89dGhpcy5jb2RpbmdQb3M7aWYodD5hW29dKXtpZih0PnRoaXMuY29sdW1ucyl7KDAsaS5pbmZvKSgicm93IGlzIHdyb25nIGxlbmd0aCIpO3RoaXMuZXJyPSEwO3Q9dGhpcy5jb2x1bW5zfTEmb15yJiYrK287YVtvXT10fXRoaXMuY29kaW5nUG9zPW99LF9hZGRQaXhlbHNOZWc6ZnVuY3Rpb24gX2FkZFBpeGVsc05lZyh0LHIpe3ZhciBhPXRoaXMuY29kaW5nTGluZSxvPXRoaXMuY29kaW5nUG9zO2lmKHQ+YVtvXSl7aWYodD50aGlzLmNvbHVtbnMpeygwLGkuaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKTt0aGlzLmVycj0hMDt0PXRoaXMuY29sdW1uc30xJm9eciYmKytvO2Fbb109dH1lbHNlIGlmKHQ8YVtvXSl7aWYodDwwKXsoMCxpLmluZm8pKCJpbnZhbGlkIGNvZGUiKTt0aGlzLmVycj0hMDt0PTB9Zm9yKDtvPjAmJnQ8YVtvLTFdOyktLW87YVtvXT10fXRoaXMuY29kaW5nUG9zPW99LF9maW5kVGFibGVDb2RlOmZ1bmN0aW9uIF9maW5kVGFibGVDb2RlKHQscixhLGkpe2Zvcih2YXIgbz1pfHwwLGM9dDtjPD1yOysrYyl7dmFyIGw9dGhpcy5fbG9va0JpdHMoYyk7aWYoLTE9PT1sKXJldHVyblshMCwxLCExXTtjPHImJihsPDw9ci1jKTtpZighb3x8bD49byl7dmFyIHU9YVtsLW9dO2lmKHVbMF09PT1jKXt0aGlzLl9lYXRCaXRzKGMpO3JldHVyblshMCx1WzFdLCEwXX19fXJldHVyblshMSwwLCExXX0sX2dldFR3b0RpbUNvZGU6ZnVuY3Rpb24gX2dldFR3b0RpbUNvZGUoKXt2YXIgcixhPTA7aWYodGhpcy5lb2Jsb2NrKXthPXRoaXMuX2xvb2tCaXRzKDcpO2lmKChyPXRbYV0pJiZyWzBdPjApe3RoaXMuX2VhdEJpdHMoclswXSk7cmV0dXJuIHJbMV19fWVsc2V7dmFyIG89dGhpcy5fZmluZFRhYmxlQ29kZSgxLDcsdCk7aWYob1swXSYmb1syXSlyZXR1cm4gb1sxXX0oMCxpLmluZm8pKCJCYWQgdHdvIGRpbSBjb2RlIik7cmV0dXJuLTF9LF9nZXRXaGl0ZUNvZGU6ZnVuY3Rpb24gX2dldFdoaXRlQ29kZSgpe3ZhciB0LG89MDtpZih0aGlzLmVvYmxvY2spe2lmKC0xPT09KG89dGhpcy5fbG9va0JpdHMoMTIpKSlyZXR1cm4gMTtpZigodD1vPj41PT0wP3Jbb106YVtvPj4zXSlbMF0+MCl7dGhpcy5fZWF0Qml0cyh0WzBdKTtyZXR1cm4gdFsxXX19ZWxzZXt2YXIgYz10aGlzLl9maW5kVGFibGVDb2RlKDEsOSxhKTtpZihjWzBdKXJldHVybiBjWzFdO2lmKChjPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsMTIscikpWzBdKXJldHVybiBjWzFdfSgwLGkuaW5mbykoImJhZCB3aGl0ZSBjb2RlIik7dGhpcy5fZWF0Qml0cygxKTtyZXR1cm4gMX0sX2dldEJsYWNrQ29kZTpmdW5jdGlvbiBfZ2V0QmxhY2tDb2RlKCl7dmFyIHQscjtpZih0aGlzLmVvYmxvY2spe2lmKC0xPT09KHQ9dGhpcy5fbG9va0JpdHMoMTMpKSlyZXR1cm4gMTtpZigocj10Pj43PT0wP29bdF06dD4+OT09MCYmdD4+NyE9MD9jWyh0Pj4xKS02NF06bFt0Pj43XSlbMF0+MCl7dGhpcy5fZWF0Qml0cyhyWzBdKTtyZXR1cm4gclsxXX19ZWxzZXt2YXIgYT10aGlzLl9maW5kVGFibGVDb2RlKDIsNixsKTtpZihhWzBdKXJldHVybiBhWzFdO2lmKChhPXRoaXMuX2ZpbmRUYWJsZUNvZGUoNywxMixjLDY0KSlbMF0pcmV0dXJuIGFbMV07aWYoKGE9dGhpcy5fZmluZFRhYmxlQ29kZSgxMCwxMyxvKSlbMF0pcmV0dXJuIGFbMV19KDAsaS5pbmZvKSgiYmFkIGJsYWNrIGNvZGUiKTt0aGlzLl9lYXRCaXRzKDEpO3JldHVybiAxfSxfbG9va0JpdHM6ZnVuY3Rpb24gX2xvb2tCaXRzKHQpe2Zvcih2YXIgcjt0aGlzLmlucHV0Qml0czx0Oyl7aWYoLTE9PT0ocj10aGlzLnNvdXJjZS5uZXh0KCkpKXJldHVybiAwPT09dGhpcy5pbnB1dEJpdHM/LTE6dGhpcy5pbnB1dEJ1Zjw8dC10aGlzLmlucHV0Qml0cyY2NTUzNT4+MTYtdDt0aGlzLmlucHV0QnVmPXRoaXMuaW5wdXRCdWY8PDh8cjt0aGlzLmlucHV0Qml0cys9OH1yZXR1cm4gdGhpcy5pbnB1dEJ1Zj4+dGhpcy5pbnB1dEJpdHMtdCY2NTUzNT4+MTYtdH0sX2VhdEJpdHM6ZnVuY3Rpb24gX2VhdEJpdHModCl7KHRoaXMuaW5wdXRCaXRzLT10KTwwJiYodGhpcy5pbnB1dEJpdHM9MCl9fTtyZXR1cm4gQ0NJVFRGYXhEZWNvZGVyfSgpO3IuQ0NJVFRGYXhEZWNvZGVyPW99LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuSmJpZzJTdHJlYW09dm9pZCAwO3ZhciBpPWEoMjAyKSxvPWEoMjA5KSxjPWEoMjEzKSxsPWEoNSksdT1mdW5jdGlvbiBKYmlnMlN0cmVhbUNsb3N1cmUoKXtmdW5jdGlvbiBKYmlnMlN0cmVhbSh0LHIsYSxpKXt0aGlzLnN0cmVhbT10O3RoaXMubWF5YmVMZW5ndGg9cjt0aGlzLmRpY3Q9YTt0aGlzLnBhcmFtcz1pO28uRGVjb2RlU3RyZWFtLmNhbGwodGhpcyxyKX1KYmlnMlN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLkRlY29kZVN0cmVhbS5wcm90b3R5cGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShKYmlnMlN0cmVhbS5wcm90b3R5cGUsImJ5dGVzIix7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybigwLGwuc2hhZG93KSh0aGlzLCJieXRlcyIsdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpfSxjb25maWd1cmFibGU6ITB9KTtKYmlnMlN0cmVhbS5wcm90b3R5cGUuZW5zdXJlQnVmZmVyPWZ1bmN0aW9uKHQpe307SmJpZzJTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbigpe2lmKCF0aGlzLmVvZil7dmFyIHQ9bmV3IGMuSmJpZzJJbWFnZSxyPVtdO2lmKCgwLGkuaXNEaWN0KSh0aGlzLnBhcmFtcykpe3ZhciBhPXRoaXMucGFyYW1zLmdldCgiSkJJRzJHbG9iYWxzIik7aWYoKDAsaS5pc1N0cmVhbSkoYSkpe3ZhciBvPWEuZ2V0Qnl0ZXMoKTtyLnB1c2goe2RhdGE6byxzdGFydDowLGVuZDpvLmxlbmd0aH0pfX1yLnB1c2goe2RhdGE6dGhpcy5ieXRlcyxzdGFydDowLGVuZDp0aGlzLmJ5dGVzLmxlbmd0aH0pO2Zvcih2YXIgbD10LnBhcnNlQ2h1bmtzKHIpLHU9bC5sZW5ndGgsaD0wO2g8dTtoKyspbFtoXV49MjU1O3RoaXMuYnVmZmVyPWw7dGhpcy5idWZmZXJMZW5ndGg9dTt0aGlzLmVvZj0hMH19O3JldHVybiBKYmlnMlN0cmVhbX0oKTtyLkpiaWcyU3RyZWFtPXV9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuSmJpZzJJbWFnZT12b2lkIDA7dmFyIGk9YSg1KSxvPWEoMjA1KSxjPWEoMjE0KSxsPWEoMjExKTtmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3JldHVybihfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXt0Ll9fcHJvdG9fXz1yO3JldHVybiB0fSkodCxyKX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIodCl7dmFyIHI9ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKTtyZXR1cm4hMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIGEsaT1fZ2V0UHJvdG90eXBlT2YodCk7aWYocil7dmFyIG89X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO2E9UmVmbGVjdC5jb25zdHJ1Y3QoaSxhcmd1bWVudHMsbyl9ZWxzZSBhPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLGEpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LHIpe3JldHVybiFyfHwib2JqZWN0IiE9PV90eXBlb2YocikmJiJmdW5jdGlvbiIhPXR5cGVvZiByP2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiB0fSh0KTpyfWZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KXtyZXR1cm4oX2dldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9dmFyIHU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uIF9pbmhlcml0cyh0LHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByJiZudWxsIT09cil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtyJiZfc2V0UHJvdG90eXBlT2YodCxyKX0oSmJpZzJFcnJvcix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoSmJpZzJFcnJvcik7ZnVuY3Rpb24gSmJpZzJFcnJvcih0KXshZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsSmJpZzJFcnJvcik7cmV0dXJuIHIuY2FsbCh0aGlzLCJKQklHMiBlcnJvcjogIi5jb25jYXQodCkpfXJldHVybiBKYmlnMkVycm9yfShpLkJhc2VFeGNlcHRpb24pLGg9ZnVuY3Rpb24gSmJpZzJJbWFnZUNsb3N1cmUoKXtmdW5jdGlvbiBDb250ZXh0Q2FjaGUoKXt9Q29udGV4dENhY2hlLnByb3RvdHlwZT17Z2V0Q29udGV4dHM6ZnVuY3Rpb24gZ2V0Q29udGV4dHModCl7cmV0dXJuIHQgaW4gdGhpcz90aGlzW3RdOnRoaXNbdF09bmV3IEludDhBcnJheSg2NTUzNil9fTtmdW5jdGlvbiBEZWNvZGluZ0NvbnRleHQodCxyLGEpe3RoaXMuZGF0YT10O3RoaXMuc3RhcnQ9cjt0aGlzLmVuZD1hfURlY29kaW5nQ29udGV4dC5wcm90b3R5cGU9e2dldCBkZWNvZGVyKCl7dmFyIHQ9bmV3IGMuQXJpdGhtZXRpY0RlY29kZXIodGhpcy5kYXRhLHRoaXMuc3RhcnQsdGhpcy5lbmQpO3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJkZWNvZGVyIix0KX0sZ2V0IGNvbnRleHRDYWNoZSgpe3ZhciB0PW5ldyBDb250ZXh0Q2FjaGU7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsImNvbnRleHRDYWNoZSIsdCl9fTtmdW5jdGlvbiBkZWNvZGVJbnRlZ2VyKHQscixhKXt2YXIgaT10LmdldENvbnRleHRzKHIpLG89MTtmdW5jdGlvbiByZWFkQml0cyh0KXtmb3IodmFyIHI9MCxjPTA7Yzx0O2MrKyl7dmFyIGw9YS5yZWFkQml0KGksbyk7bz1vPDI1Nj9vPDwxfGw6NTExJihvPDwxfGwpfDI1NjtyPXI8PDF8bH1yZXR1cm4gcj4+PjB9dmFyIGM9cmVhZEJpdHMoMSksbD1yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygzMikrNDQzNjpyZWFkQml0cygxMikrMzQwOnJlYWRCaXRzKDgpKzg0OnJlYWRCaXRzKDYpKzIwOnJlYWRCaXRzKDQpKzQ6cmVhZEJpdHMoMik7cmV0dXJuIDA9PT1jP2w6bD4wPy1sOm51bGx9ZnVuY3Rpb24gZGVjb2RlSUFJRCh0LHIsYSl7Zm9yKHZhciBpPXQuZ2V0Q29udGV4dHMoIklBSUQiKSxvPTEsYz0wO2M8YTtjKyspe289bzw8MXxyLnJlYWRCaXQoaSxvKX1yZXR1cm4gYTwzMT9vJigxPDxhKS0xOjIxNDc0ODM2NDcmb312YXIgdD1bIlN5bWJvbERpY3Rpb25hcnkiLG51bGwsbnVsbCxudWxsLCJJbnRlcm1lZGlhdGVUZXh0UmVnaW9uIixudWxsLCJJbW1lZGlhdGVUZXh0UmVnaW9uIiwiSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIlBhdHRlcm5EaWN0aW9uYXJ5IixudWxsLG51bGwsbnVsbCwiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb24iLG51bGwsIkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwiSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLG51bGwsIkltbWVkaWF0ZUdlbmVyaWNSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWZpbmVtZW50UmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLCJQYWdlSW5mb3JtYXRpb24iLCJFbmRPZlBhZ2UiLCJFbmRPZlN0cmlwZSIsIkVuZE9mRmlsZSIsIlByb2ZpbGVzIiwiVGFibGVzIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkV4dGVuc2lvbiJdLHI9W1t7eDotMSx5Oi0yfSx7eDowLHk6LTJ9LHt4OjEseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4OjIseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV0sW3t4Oi0xLHk6LTJ9LHt4OjAseTotMn0se3g6MSx5Oi0yfSx7eDoyLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDoyLHk6LTF9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XSxbe3g6LTEseTotMn0se3g6MCx5Oi0yfSx7eDoxLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMix5OjB9LHt4Oi0xLHk6MH1dLFt7eDotMyx5Oi0xfSx7eDotMix5Oi0xfSx7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV1dLGE9W3tjb2Rpbmc6W3t4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9XSxyZWZlcmVuY2U6W3t4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9LHt4OjAseTowfSx7eDoxLHk6MH0se3g6LTEseToxfSx7eDowLHk6MX0se3g6MSx5OjF9XX0se2NvZGluZzpbe3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH1dLHJlZmVyZW5jZTpbe3g6MCx5Oi0xfSx7eDotMSx5OjB9LHt4OjAseTowfSx7eDoxLHk6MH0se3g6MCx5OjF9LHt4OjEseToxfV19XSxoPVszOTcxNywxOTQxLDIyOSw0MDVdLGQ9WzMyLDhdO2Z1bmN0aW9uIGRlY29kZUJpdG1hcCh0LGEsaSxvLGMsbCx1LGQpe2lmKHQpe3JldHVybiBkZWNvZGVNTVJCaXRtYXAobmV3IFJlYWRlcihkLmRhdGEsZC5zdGFydCxkLmVuZCksYSxpLCExKX1pZigwPT09byYmIWwmJiFjJiY0PT09dS5sZW5ndGgmJjM9PT11WzBdLngmJi0xPT09dVswXS55JiYtMz09PXVbMV0ueCYmLTE9PT11WzFdLnkmJjI9PT11WzJdLngmJi0yPT09dVsyXS55JiYtMj09PXVbM10ueCYmLTI9PT11WzNdLnkpcmV0dXJuIGZ1bmN0aW9uIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh0LHIsYSl7dmFyIGksbyxjLGwsdSxoLGQscD1hLmRlY29kZXIsbT1hLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxnPVtdO2ZvcihvPTA7bzxyO28rKyl7dT1nW29dPW5ldyBVaW50OEFycmF5KHQpO2g9bzwxP3U6Z1tvLTFdO2k9KGQ9bzwyP3U6Z1tvLTJdKVswXTw8MTN8ZFsxXTw8MTJ8ZFsyXTw8MTF8aFswXTw8N3xoWzFdPDw2fGhbMl08PDV8aFszXTw8NDtmb3IoYz0wO2M8dDtjKyspe3VbY109bD1wLnJlYWRCaXQobSxpKTtpPSgzMTczNSZpKTw8MXwoYyszPHQ/ZFtjKzNdPDwxMTowKXwoYys0PHQ/aFtjKzRdPDw0OjApfGx9fXJldHVybiBnfShhLGksZCk7dmFyIHA9ISFsLG09cltvXS5jb25jYXQodSk7bS5zb3J0KChmdW5jdGlvbih0LHIpe3JldHVybiB0Lnktci55fHx0Lngtci54fSkpO3ZhciBnLHksYj1tLmxlbmd0aCx2PW5ldyBJbnQ4QXJyYXkoYiksUz1uZXcgSW50OEFycmF5KGIpLGs9W10sdz0wLEM9MCxfPTAseD0wO2Zvcih5PTA7eTxiO3krKyl7dlt5XT1tW3ldLng7U1t5XT1tW3ldLnk7Qz1NYXRoLm1pbihDLG1beV0ueCk7Xz1NYXRoLm1heChfLG1beV0ueCk7eD1NYXRoLm1pbih4LG1beV0ueSk7eTxiLTEmJm1beV0ueT09PW1beSsxXS55JiZtW3ldLng9PT1tW3krMV0ueC0xP3d8PTE8PGItMS15OmsucHVzaCh5KX12YXIgQT1rLmxlbmd0aCxUPW5ldyBJbnQ4QXJyYXkoQSksUj1uZXcgSW50OEFycmF5KEEpLEk9bmV3IFVpbnQxNkFycmF5KEEpO2ZvcihnPTA7ZzxBO2crKyl7eT1rW2ddO1RbZ109bVt5XS54O1JbZ109bVt5XS55O0lbZ109MTw8Yi0xLXl9Zm9yKHZhciBQLE8sRSxCLEQsTT0tQyxMPS14LE49YS1fLFU9aFtvXSxqPW5ldyBVaW50OEFycmF5KGEpLHE9W10sVz1kLmRlY29kZXIsej1kLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxHPTAsSD0wLFY9MDtWPGk7VisrKXtpZihjKXtpZihHXj1XLnJlYWRCaXQoeixVKSl7cS5wdXNoKGopO2NvbnRpbnVlfX1qPW5ldyBVaW50OEFycmF5KGopO3EucHVzaChqKTtmb3IoUD0wO1A8YTtQKyspaWYocCYmbFtWXVtQXSlqW1BdPTA7ZWxzZXtpZihQPj1NJiZQPE4mJlY+PUwpe0g9SDw8MSZ3O2Zvcih5PTA7eTxBO3krKyl7Tz1WK1JbeV07RT1QK1RbeV07KEI9cVtPXVtFXSkmJihIfD1CPUlbeV0pfX1lbHNle0g9MDtEPWItMTtmb3IoeT0wO3k8Yjt5KyssRC0tKShFPVArdlt5XSk+PTAmJkU8YSYmKE89VitTW3ldKT49MCYmKEI9cVtPXVtFXSkmJihIfD1CPDxEKX12YXIgWD1XLnJlYWRCaXQoeixIKTtqW1BdPVh9fXJldHVybiBxfWZ1bmN0aW9uIGRlY29kZVJlZmluZW1lbnQodCxyLGksbyxjLGwsaCxwLG0pe3ZhciBnPWFbaV0uY29kaW5nOzA9PT1pJiYoZz1nLmNvbmNhdChbcFswXV0pKTt2YXIgeSxiPWcubGVuZ3RoLHY9bmV3IEludDMyQXJyYXkoYiksUz1uZXcgSW50MzJBcnJheShiKTtmb3IoeT0wO3k8Yjt5Kyspe3ZbeV09Z1t5XS54O1NbeV09Z1t5XS55fXZhciBrPWFbaV0ucmVmZXJlbmNlOzA9PT1pJiYoaz1rLmNvbmNhdChbcFsxXV0pKTt2YXIgdz1rLmxlbmd0aCxDPW5ldyBJbnQzMkFycmF5KHcpLF89bmV3IEludDMyQXJyYXkodyk7Zm9yKHk9MDt5PHc7eSsrKXtDW3ldPWtbeV0ueDtfW3ldPWtbeV0ueX1mb3IodmFyIHg9b1swXS5sZW5ndGgsQT1vLmxlbmd0aCxUPWRbaV0sUj1bXSxJPW0uZGVjb2RlcixQPW0uY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpLE89MCxFPTA7RTxyO0UrKyl7aWYoaCl7aWYoT149SS5yZWFkQml0KFAsVCkpdGhyb3cgbmV3IHUoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpfXZhciBCPW5ldyBVaW50OEFycmF5KHQpO1IucHVzaChCKTtmb3IodmFyIEQ9MDtEPHQ7RCsrKXt2YXIgTSxMLE49MDtmb3IoeT0wO3k8Yjt5Kyspe009RStTW3ldO0w9RCt2W3ldO008MHx8TDwwfHxMPj10P048PD0xOk49Tjw8MXxSW01dW0xdfWZvcih5PTA7eTx3O3krKyl7TT1FK19beV0tbDtMPUQrQ1t5XS1jO008MHx8TT49QXx8TDwwfHxMPj14P048PD0xOk49Tjw8MXxvW01dW0xdfXZhciBVPUkucmVhZEJpdChQLE4pO0JbRF09VX19cmV0dXJuIFJ9ZnVuY3Rpb24gZGVjb2RlVGV4dFJlZ2lvbih0LHIsYSxpLG8sYyxsLGgsZCxwLG0sZyx5LGIsdixTLGssdyxDKXtpZih0JiZyKXRocm93IG5ldyB1KCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7dmFyIF8seCxBPVtdO2ZvcihfPTA7XzxpO18rKyl7eD1uZXcgVWludDhBcnJheShhKTtpZihvKWZvcih2YXIgVD0wO1Q8YTtUKyspeFtUXT1vO0EucHVzaCh4KX12YXIgUj1rLmRlY29kZXIsST1rLmNvbnRleHRDYWNoZSxQPXQ/LWIudGFibGVEZWx0YVQuZGVjb2RlKEMpOi1kZWNvZGVJbnRlZ2VyKEksIklBRFQiLFIpLE89MDtfPTA7Zm9yKDtfPGM7KXtQKz10P2IudGFibGVEZWx0YVQuZGVjb2RlKEMpOmRlY29kZUludGVnZXIoSSwiSUFEVCIsUik7Zm9yKHZhciBFPU8rPXQ/Yi50YWJsZUZpcnN0Uy5kZWNvZGUoQyk6ZGVjb2RlSW50ZWdlcihJLCJJQUZTIixSKTs7KXt2YXIgQj0wO2w+MSYmKEI9dD9DLnJlYWRCaXRzKHcpOmRlY29kZUludGVnZXIoSSwiSUFJVCIsUikpO3ZhciBEPWwqUCtCLE09dD9iLnN5bWJvbElEVGFibGUuZGVjb2RlKEMpOmRlY29kZUlBSUQoSSxSLGQpLEw9ciYmKHQ/Qy5yZWFkQml0KCk6ZGVjb2RlSW50ZWdlcihJLCJJQVJJIixSKSksTj1oW01dLFU9TlswXS5sZW5ndGgsaj1OLmxlbmd0aDtpZihMKXt2YXIgcT1kZWNvZGVJbnRlZ2VyKEksIklBUkRXIixSKSxXPWRlY29kZUludGVnZXIoSSwiSUFSREgiLFIpO049ZGVjb2RlUmVmaW5lbWVudChVKz1xLGorPVcsdixOLChxPj4xKStkZWNvZGVJbnRlZ2VyKEksIklBUkRYIixSKSwoVz4+MSkrZGVjb2RlSW50ZWdlcihJLCJJQVJEWSIsUiksITEsUyxrKX12YXIgeixHLEgsVj1ELSgxJmc/MDpqLTEpLFg9RS0oMiZnP1UtMTowKTtpZihwKXtmb3Ioej0wO3o8ajt6KyspaWYoeD1BW1grel0pe0g9Tlt6XTt2YXIgWT1NYXRoLm1pbihhLVYsVSk7c3dpdGNoKHkpe2Nhc2UgMDpmb3IoRz0wO0c8WTtHKyspeFtWK0ddfD1IW0ddO2JyZWFrO2Nhc2UgMjpmb3IoRz0wO0c8WTtHKyspeFtWK0ddXj1IW0ddO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHUoIm9wZXJhdG9yICIuY29uY2F0KHksIiBpcyBub3Qgc3VwcG9ydGVkIikpfX1FKz1qLTF9ZWxzZXtmb3IoRz0wO0c8ajtHKyspaWYoeD1BW1YrR10pe0g9TltHXTtzd2l0Y2goeSl7Y2FzZSAwOmZvcih6PTA7ejxVO3orKyl4W1grel18PUhbel07YnJlYWs7Y2FzZSAyOmZvcih6PTA7ejxVO3orKyl4W1grel1ePUhbel07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgdSgib3BlcmF0b3IgIi5jb25jYXQoeSwiIGlzIG5vdCBzdXBwb3J0ZWQiKSl9fUUrPVUtMX1fKys7dmFyIEs9dD9iLnRhYmxlRGVsdGFTLmRlY29kZShDKTpkZWNvZGVJbnRlZ2VyKEksIklBRFMiLFIpO2lmKG51bGw9PT1LKWJyZWFrO0UrPUsrbX19cmV0dXJuIEF9ZnVuY3Rpb24gcmVhZFNlZ21lbnRIZWFkZXIocixhKXt2YXIgaT17fTtpLm51bWJlcj0oMCxvLnJlYWRVaW50MzIpKHIsYSk7dmFyIGM9clthKzRdLGw9NjMmYztpZighdFtsXSl0aHJvdyBuZXcgdSgiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIrbCk7aS50eXBlPWw7aS50eXBlTmFtZT10W2xdO2kuZGVmZXJyZWROb25SZXRhaW49ISEoMTI4JmMpO3ZhciBoPSEhKDY0JmMpLGQ9clthKzVdLG09ZD4+NSY3LGc9WzMxJmRdLHk9YSs2O2lmKDc9PT1kKXttPTUzNjg3MDkxMSYoMCxvLnJlYWRVaW50MzIpKHIseS0xKTt5Kz0zO3ZhciBiPW0rNz4+MztnWzBdPXJbeSsrXTtmb3IoOy0tYj4wOylnLnB1c2goclt5KytdKX1lbHNlIGlmKDU9PT1kfHw2PT09ZCl0aHJvdyBuZXcgdSgiaW52YWxpZCByZWZlcnJlZC10byBmbGFncyIpO2kucmV0YWluQml0cz1nO3ZhciB2PTQ7aS5udW1iZXI8PTI1Nj92PTE6aS5udW1iZXI8PTY1NTM2JiYodj0yKTt2YXIgUyxrLHc9W107Zm9yKFM9MDtTPG07UysrKXt2YXIgQz12b2lkIDA7Qz0xPT09dj9yW3ldOjI9PT12PygwLG8ucmVhZFVpbnQxNikocix5KTooMCxvLnJlYWRVaW50MzIpKHIseSk7dy5wdXNoKEMpO3krPXZ9aS5yZWZlcnJlZFRvPXc7aWYoaCl7aS5wYWdlQXNzb2NpYXRpb249KDAsby5yZWFkVWludDMyKShyLHkpO3krPTR9ZWxzZSBpLnBhZ2VBc3NvY2lhdGlvbj1yW3krK107aS5sZW5ndGg9KDAsby5yZWFkVWludDMyKShyLHkpO3krPTQ7aWYoNDI5NDk2NzI5NT09PWkubGVuZ3RoKXtpZigzOCE9PWwpdGhyb3cgbmV3IHUoImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aCIpO3ZhciBfPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24ocix5KSx4PSEhKDEmclt5K3BdKSxBPW5ldyBVaW50OEFycmF5KDYpO2lmKCF4KXtBWzBdPTI1NTtBWzFdPTE3Mn1BWzJdPV8uaGVpZ2h0Pj4+MjQmMjU1O0FbM109Xy5oZWlnaHQ+PjE2JjI1NTtBWzRdPV8uaGVpZ2h0Pj44JjI1NTtBWzVdPTI1NSZfLmhlaWdodDtmb3IoUz15LGs9ci5sZW5ndGg7UzxrO1MrKyl7Zm9yKHZhciBUPTA7VDw2JiZBW1RdPT09cltTK1RdOylUKys7aWYoNj09PVQpe2kubGVuZ3RoPVMrNjticmVha319aWYoNDI5NDk2NzI5NT09PWkubGVuZ3RoKXRocm93IG5ldyB1KCJzZWdtZW50IGVuZCB3YXMgbm90IGZvdW5kIil9aS5oZWFkZXJFbmQ9eTtyZXR1cm4gaX1mdW5jdGlvbiByZWFkU2VnbWVudHModCxyLGEsaSl7Zm9yKHZhciBvPVtdLGM9YTtjPGk7KXt2YXIgbD1yZWFkU2VnbWVudEhlYWRlcihyLGMpO2M9bC5oZWFkZXJFbmQ7dmFyIHU9e2hlYWRlcjpsLGRhdGE6cn07aWYoIXQucmFuZG9tQWNjZXNzKXt1LnN0YXJ0PWM7Yys9bC5sZW5ndGg7dS5lbmQ9Y31vLnB1c2godSk7aWYoNTE9PT1sLnR5cGUpYnJlYWt9aWYodC5yYW5kb21BY2Nlc3MpZm9yKHZhciBoPTAsZD1vLmxlbmd0aDtoPGQ7aCsrKXtvW2hdLnN0YXJ0PWM7Yys9b1toXS5oZWFkZXIubGVuZ3RoO29baF0uZW5kPWN9cmV0dXJuIG99ZnVuY3Rpb24gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbih0LHIpe3JldHVybnt3aWR0aDooMCxvLnJlYWRVaW50MzIpKHQsciksaGVpZ2h0OigwLG8ucmVhZFVpbnQzMikodCxyKzQpLHg6KDAsby5yZWFkVWludDMyKSh0LHIrOCkseTooMCxvLnJlYWRVaW50MzIpKHQscisxMiksY29tYmluYXRpb25PcGVyYXRvcjo3JnRbcisxNl19fXZhciBwPTE3O2Z1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHQscil7dmFyIGEsaSxjLGwsaD10LmhlYWRlcixkPXQuZGF0YSxtPXQuc3RhcnQsZz10LmVuZDtzd2l0Y2goaC50eXBlKXtjYXNlIDA6dmFyIHk9e30sYj0oMCxvLnJlYWRVaW50MTYpKGQsbSk7eS5odWZmbWFuPSEhKDEmYik7eS5yZWZpbmVtZW50PSEhKDImYik7eS5odWZmbWFuREhTZWxlY3Rvcj1iPj4yJjM7eS5odWZmbWFuRFdTZWxlY3Rvcj1iPj40JjM7eS5iaXRtYXBTaXplU2VsZWN0b3I9Yj4+NiYxO3kuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3Rvcj1iPj43JjE7eS5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZD0hISgyNTYmYik7eS5iaXRtYXBDb2RpbmdDb250ZXh0UmV0YWluZWQ9ISEoNTEyJmIpO3kudGVtcGxhdGU9Yj4+MTAmMzt5LnJlZmluZW1lbnRUZW1wbGF0ZT1iPj4xMiYxO20rPTI7aWYoIXkuaHVmZm1hbil7bD0wPT09eS50ZW1wbGF0ZT80OjE7aT1bXTtmb3IoYz0wO2M8bDtjKyspe2kucHVzaCh7eDooMCxvLnJlYWRJbnQ4KShkLG0pLHk6KDAsby5yZWFkSW50OCkoZCxtKzEpfSk7bSs9Mn15LmF0PWl9aWYoeS5yZWZpbmVtZW50JiYheS5yZWZpbmVtZW50VGVtcGxhdGUpe2k9W107Zm9yKGM9MDtjPDI7YysrKXtpLnB1c2goe3g6KDAsby5yZWFkSW50OCkoZCxtKSx5OigwLG8ucmVhZEludDgpKGQsbSsxKX0pO20rPTJ9eS5yZWZpbmVtZW50QXQ9aX15Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzPSgwLG8ucmVhZFVpbnQzMikoZCxtKTttKz00O3kubnVtYmVyT2ZOZXdTeW1ib2xzPSgwLG8ucmVhZFVpbnQzMikoZCxtKTttKz00O2E9W3ksaC5udW1iZXIsaC5yZWZlcnJlZFRvLGQsbSxnXTticmVhaztjYXNlIDY6Y2FzZSA3OnZhciB2PXt9O3YuaW5mbz1yZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGQsbSk7bSs9cDt2YXIgUz0oMCxvLnJlYWRVaW50MTYpKGQsbSk7bSs9Mjt2Lmh1ZmZtYW49ISEoMSZTKTt2LnJlZmluZW1lbnQ9ISEoMiZTKTt2LmxvZ1N0cmlwU2l6ZT1TPj4yJjM7di5zdHJpcFNpemU9MTw8di5sb2dTdHJpcFNpemU7di5yZWZlcmVuY2VDb3JuZXI9Uz4+NCYzO3YudHJhbnNwb3NlZD0hISg2NCZTKTt2LmNvbWJpbmF0aW9uT3BlcmF0b3I9Uz4+NyYzO3YuZGVmYXVsdFBpeGVsVmFsdWU9Uz4+OSYxO3YuZHNPZmZzZXQ9Uzw8MTc+PjI3O3YucmVmaW5lbWVudFRlbXBsYXRlPVM+PjE1JjE7aWYodi5odWZmbWFuKXt2YXIgaz0oMCxvLnJlYWRVaW50MTYpKGQsbSk7bSs9Mjt2Lmh1ZmZtYW5GUz0zJms7di5odWZmbWFuRFM9az4+MiYzO3YuaHVmZm1hbkRUPWs+PjQmMzt2Lmh1ZmZtYW5SZWZpbmVtZW50RFc9az4+NiYzO3YuaHVmZm1hblJlZmluZW1lbnRESD1rPj44JjM7di5odWZmbWFuUmVmaW5lbWVudERYPWs+PjEwJjM7di5odWZmbWFuUmVmaW5lbWVudERZPWs+PjEyJjM7di5odWZmbWFuUmVmaW5lbWVudFNpemVTZWxlY3Rvcj0hISgxNjM4NCZrKX1pZih2LnJlZmluZW1lbnQmJiF2LnJlZmluZW1lbnRUZW1wbGF0ZSl7aT1bXTtmb3IoYz0wO2M8MjtjKyspe2kucHVzaCh7eDooMCxvLnJlYWRJbnQ4KShkLG0pLHk6KDAsby5yZWFkSW50OCkoZCxtKzEpfSk7bSs9Mn12LnJlZmluZW1lbnRBdD1pfXYubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXM9KDAsby5yZWFkVWludDMyKShkLG0pO20rPTQ7YT1bdixoLnJlZmVycmVkVG8sZCxtLGddO2JyZWFrO2Nhc2UgMTY6dmFyIHc9e30sQz1kW20rK107dy5tbXI9ISEoMSZDKTt3LnRlbXBsYXRlPUM+PjEmMzt3LnBhdHRlcm5XaWR0aD1kW20rK107dy5wYXR0ZXJuSGVpZ2h0PWRbbSsrXTt3Lm1heFBhdHRlcm5JbmRleD0oMCxvLnJlYWRVaW50MzIpKGQsbSk7bSs9NDthPVt3LGgubnVtYmVyLGQsbSxnXTticmVhaztjYXNlIDIyOmNhc2UgMjM6dmFyIF89e307Xy5pbmZvPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZCxtKTttKz1wO3ZhciB4PWRbbSsrXTtfLm1tcj0hISgxJngpO18udGVtcGxhdGU9eD4+MSYzO18uZW5hYmxlU2tpcD0hISg4JngpO18uY29tYmluYXRpb25PcGVyYXRvcj14Pj40Jjc7Xy5kZWZhdWx0UGl4ZWxWYWx1ZT14Pj43JjE7Xy5ncmlkV2lkdGg9KDAsby5yZWFkVWludDMyKShkLG0pO20rPTQ7Xy5ncmlkSGVpZ2h0PSgwLG8ucmVhZFVpbnQzMikoZCxtKTttKz00O18uZ3JpZE9mZnNldFg9NDI5NDk2NzI5NSYoMCxvLnJlYWRVaW50MzIpKGQsbSk7bSs9NDtfLmdyaWRPZmZzZXRZPTQyOTQ5NjcyOTUmKDAsby5yZWFkVWludDMyKShkLG0pO20rPTQ7Xy5ncmlkVmVjdG9yWD0oMCxvLnJlYWRVaW50MTYpKGQsbSk7bSs9MjtfLmdyaWRWZWN0b3JZPSgwLG8ucmVhZFVpbnQxNikoZCxtKTttKz0yO2E9W18saC5yZWZlcnJlZFRvLGQsbSxnXTticmVhaztjYXNlIDM4OmNhc2UgMzk6dmFyIEE9e307QS5pbmZvPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZCxtKTttKz1wO3ZhciBUPWRbbSsrXTtBLm1tcj0hISgxJlQpO0EudGVtcGxhdGU9VD4+MSYzO0EucHJlZGljdGlvbj0hISg4JlQpO2lmKCFBLm1tcil7bD0wPT09QS50ZW1wbGF0ZT80OjE7aT1bXTtmb3IoYz0wO2M8bDtjKyspe2kucHVzaCh7eDooMCxvLnJlYWRJbnQ4KShkLG0pLHk6KDAsby5yZWFkSW50OCkoZCxtKzEpfSk7bSs9Mn1BLmF0PWl9YT1bQSxkLG0sZ107YnJlYWs7Y2FzZSA0ODp2YXIgUj17d2lkdGg6KDAsby5yZWFkVWludDMyKShkLG0pLGhlaWdodDooMCxvLnJlYWRVaW50MzIpKGQsbSs0KSxyZXNvbHV0aW9uWDooMCxvLnJlYWRVaW50MzIpKGQsbSs4KSxyZXNvbHV0aW9uWTooMCxvLnJlYWRVaW50MzIpKGQsbSsxMil9OzQyOTQ5NjcyOTU9PT1SLmhlaWdodCYmZGVsZXRlIFIuaGVpZ2h0O3ZhciBJPWRbbSsxNl07KDAsby5yZWFkVWludDE2KShkLG0rMTcpO1IubG9zc2xlc3M9ISEoMSZJKTtSLnJlZmluZW1lbnQ9ISEoMiZJKTtSLmRlZmF1bHRQaXhlbFZhbHVlPUk+PjImMTtSLmNvbWJpbmF0aW9uT3BlcmF0b3I9ST4+MyYzO1IucmVxdWlyZXNCdWZmZXI9ISEoMzImSSk7Ui5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGU9ISEoNjQmSSk7YT1bUl07YnJlYWs7Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6YnJlYWs7Y2FzZSA1MzphPVtoLm51bWJlcixkLG0sZ107YnJlYWs7Y2FzZSA2MjpicmVhaztkZWZhdWx0OnRocm93IG5ldyB1KCJzZWdtZW50IHR5cGUgIi5jb25jYXQoaC50eXBlTmFtZSwiKCIpLmNvbmNhdChoLnR5cGUsIikiKSsiIGlzIG5vdCBpbXBsZW1lbnRlZCIpfXZhciBQPSJvbiIraC50eXBlTmFtZTtQIGluIHImJnJbUF0uYXBwbHkocixhKX1mdW5jdGlvbiBwcm9jZXNzU2VnbWVudHModCxyKXtmb3IodmFyIGE9MCxpPXQubGVuZ3RoO2E8aTthKyspcHJvY2Vzc1NlZ21lbnQodFthXSxyKX1mdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcigpe31TaW1wbGVTZWdtZW50VmlzaXRvci5wcm90b3R5cGU9e29uUGFnZUluZm9ybWF0aW9uOmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uUGFnZUluZm9ybWF0aW9uKHQpe3RoaXMuY3VycmVudFBhZ2VJbmZvPXQ7dmFyIHI9dC53aWR0aCs3Pj4zLGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHIqdC5oZWlnaHQpO2lmKHQuZGVmYXVsdFBpeGVsVmFsdWUpZm9yKHZhciBpPTAsbz1hLmxlbmd0aDtpPG87aSsrKWFbaV09MjU1O3RoaXMuYnVmZmVyPWF9LGRyYXdCaXRtYXA6ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3JfZHJhd0JpdG1hcCh0LHIpe3ZhciBhLGksbyxjLGw9dGhpcy5jdXJyZW50UGFnZUluZm8saD10LndpZHRoLGQ9dC5oZWlnaHQscD1sLndpZHRoKzc+PjMsbT1sLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZT90LmNvbWJpbmF0aW9uT3BlcmF0b3I6bC5jb21iaW5hdGlvbk9wZXJhdG9yLGc9dGhpcy5idWZmZXIseT0xMjg+Pig3JnQueCksYj10LnkqcCsodC54Pj4zKTtzd2l0Y2gobSl7Y2FzZSAwOmZvcihhPTA7YTxkO2ErKyl7bz15O2M9Yjtmb3IoaT0wO2k8aDtpKyspe3JbYV1baV0mJihnW2NdfD1vKTtpZighKG8+Pj0xKSl7bz0xMjg7YysrfX1iKz1wfWJyZWFrO2Nhc2UgMjpmb3IoYT0wO2E8ZDthKyspe289eTtjPWI7Zm9yKGk9MDtpPGg7aSsrKXtyW2FdW2ldJiYoZ1tjXV49byk7aWYoIShvPj49MSkpe289MTI4O2MrK319Yis9cH1icmVhaztkZWZhdWx0OnRocm93IG5ldyB1KCJvcGVyYXRvciAiLmNvbmNhdChtLCIgaXMgbm90IHN1cHBvcnRlZCIpKX19LG9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbjpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24odCxyLGEsaSl7dmFyIG89dC5pbmZvLGM9bmV3IERlY29kaW5nQ29udGV4dChyLGEsaSksbD1kZWNvZGVCaXRtYXAodC5tbXIsby53aWR0aCxvLmhlaWdodCx0LnRlbXBsYXRlLHQucHJlZGljdGlvbixudWxsLHQuYXQsYyk7dGhpcy5kcmF3Qml0bWFwKG8sbCl9LG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uOmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCl7dGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvblN5bWJvbERpY3Rpb25hcnk6ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25TeW1ib2xEaWN0aW9uYXJ5KHQscixhLGksYyxsKXt2YXIgaCxkO2lmKHQuaHVmZm1hbil7aD1mdW5jdGlvbiBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyh0LHIsYSl7dmFyIGksbyxjLGwsaD0wO3N3aXRjaCh0Lmh1ZmZtYW5ESFNlbGVjdG9yKXtjYXNlIDA6Y2FzZSAxOmk9Z2V0U3RhbmRhcmRUYWJsZSh0Lmh1ZmZtYW5ESFNlbGVjdG9yKzQpO2JyZWFrO2Nhc2UgMzppPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShoLHIsYSk7aCsrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHUoImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpfXN3aXRjaCh0Lmh1ZmZtYW5EV1NlbGVjdG9yKXtjYXNlIDA6Y2FzZSAxOm89Z2V0U3RhbmRhcmRUYWJsZSh0Lmh1ZmZtYW5EV1NlbGVjdG9yKzIpO2JyZWFrO2Nhc2UgMzpvPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShoLHIsYSk7aCsrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHUoImludmFsaWQgSHVmZm1hbiBEVyBzZWxlY3RvciIpfWlmKHQuYml0bWFwU2l6ZVNlbGVjdG9yKXtjPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShoLHIsYSk7aCsrfWVsc2UgYz1nZXRTdGFuZGFyZFRhYmxlKDEpO2w9dC5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yP2dldEN1c3RvbUh1ZmZtYW5UYWJsZShoLHIsYSk6Z2V0U3RhbmRhcmRUYWJsZSgxKTtyZXR1cm57dGFibGVEZWx0YUhlaWdodDppLHRhYmxlRGVsdGFXaWR0aDpvLHRhYmxlQml0bWFwU2l6ZTpjLHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzOmx9fSh0LGEsdGhpcy5jdXN0b21UYWJsZXMpO2Q9bmV3IFJlYWRlcihpLGMsbCl9dmFyIHA9dGhpcy5zeW1ib2xzO3B8fCh0aGlzLnN5bWJvbHM9cD17fSk7Zm9yKHZhciBtPVtdLGc9MCx5PWEubGVuZ3RoO2c8eTtnKyspe3ZhciBiPXBbYVtnXV07YiYmKG09bS5jb25jYXQoYikpfXZhciB2PW5ldyBEZWNvZGluZ0NvbnRleHQoaSxjLGwpO3Bbcl09ZnVuY3Rpb24gZGVjb2RlU3ltYm9sRGljdGlvbmFyeSh0LHIsYSxpLGMsbCxoLGQscCxtLGcseSl7aWYodCYmcil0aHJvdyBuZXcgdSgic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTt2YXIgYix2LFM9W10saz0wLHc9KDAsby5sb2cyKShhLmxlbmd0aCtpKSxDPWcuZGVjb2RlcixfPWcuY29udGV4dENhY2hlO2lmKHQpe2I9Z2V0U3RhbmRhcmRUYWJsZSgxKTt2PVtdO3c9TWF0aC5tYXgodywxKX1mb3IoO1MubGVuZ3RoPGk7KXtrKz10P2wudGFibGVEZWx0YUhlaWdodC5kZWNvZGUoeSk6ZGVjb2RlSW50ZWdlcihfLCJJQURIIixDKTtmb3IodmFyIHg9MCxBPTAsVD10P3YubGVuZ3RoOjA7Oyl7dmFyIFIsST10P2wudGFibGVEZWx0YVdpZHRoLmRlY29kZSh5KTpkZWNvZGVJbnRlZ2VyKF8sIklBRFciLEMpO2lmKG51bGw9PT1JKWJyZWFrO0ErPXgrPUk7aWYocil7dmFyIFA9ZGVjb2RlSW50ZWdlcihfLCJJQUFJIixDKTtpZihQPjEpUj1kZWNvZGVUZXh0UmVnaW9uKHQscix4LGssMCxQLDEsYS5jb25jYXQoUyksdywwLDAsMSwwLGwscCxtLGcsMCx5KTtlbHNle3ZhciBPPWRlY29kZUlBSUQoXyxDLHcpLEU9ZGVjb2RlSW50ZWdlcihfLCJJQVJEWCIsQyksQj1kZWNvZGVJbnRlZ2VyKF8sIklBUkRZIixDKTtSPWRlY29kZVJlZmluZW1lbnQoeCxrLHAsTzxhLmxlbmd0aD9hW09dOlNbTy1hLmxlbmd0aF0sRSxCLCExLG0sZyl9Uy5wdXNoKFIpfWVsc2UgaWYodCl2LnB1c2goeCk7ZWxzZXtSPWRlY29kZUJpdG1hcCghMSx4LGssaCwhMSxudWxsLGQsZyk7Uy5wdXNoKFIpfX1pZih0JiYhcil7dmFyIEQ9bC50YWJsZUJpdG1hcFNpemUuZGVjb2RlKHkpO3kuYnl0ZUFsaWduKCk7dmFyIE09dm9pZCAwO2lmKDA9PT1EKU09cmVhZFVuY29tcHJlc3NlZEJpdG1hcCh5LEEsayk7ZWxzZXt2YXIgTD15LmVuZCxOPXkucG9zaXRpb24rRDt5LmVuZD1OO009ZGVjb2RlTU1SQml0bWFwKHksQSxrLCExKTt5LmVuZD1MO3kucG9zaXRpb249Tn12YXIgVT12Lmxlbmd0aDtpZihUPT09VS0xKVMucHVzaChNKTtlbHNle3ZhciBqPXZvaWQgMCxxPXZvaWQgMCxXPTAsej12b2lkIDAsRz12b2lkIDA7Zm9yKGo9VDtqPFU7aisrKXt6PVcrdltqXTtHPVtdO2ZvcihxPTA7cTxrO3ErKylHLnB1c2goTVtxXS5zdWJhcnJheShXLHopKTtTLnB1c2goRyk7Vz16fX19fWZvcih2YXIgSD1bXSxWPVtdLFg9ITEsWT1hLmxlbmd0aCtpO1YubGVuZ3RoPFk7KXtmb3IodmFyIEs9dD9iLmRlY29kZSh5KTpkZWNvZGVJbnRlZ2VyKF8sIklBRVgiLEMpO0stLTspVi5wdXNoKFgpO1g9IVh9Zm9yKHZhciBKPTAsWj1hLmxlbmd0aDtKPFo7SisrKVZbSl0mJkgucHVzaChhW0pdKTtmb3IodmFyIFE9MDtRPGk7SisrLFErKylWW0pdJiZILnB1c2goU1tRXSk7cmV0dXJuIEh9KHQuaHVmZm1hbix0LnJlZmluZW1lbnQsbSx0Lm51bWJlck9mTmV3U3ltYm9scyx0Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLGgsdC50ZW1wbGF0ZSx0LmF0LHQucmVmaW5lbWVudFRlbXBsYXRlLHQucmVmaW5lbWVudEF0LHYsZCl9LG9uSW1tZWRpYXRlVGV4dFJlZ2lvbjpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZVRleHRSZWdpb24odCxyLGEsaSxjKXtmb3IodmFyIGwsaCxkPXQuaW5mbyxwPXRoaXMuc3ltYm9scyxtPVtdLGc9MCx5PXIubGVuZ3RoO2c8eTtnKyspe3ZhciBiPXBbcltnXV07YiYmKG09bS5jb25jYXQoYikpfXZhciB2PSgwLG8ubG9nMikobS5sZW5ndGgpO2lmKHQuaHVmZm1hbil7aD1uZXcgUmVhZGVyKGEsaSxjKTtsPWZ1bmN0aW9uIGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKHQscixhLGksbyl7Zm9yKHZhciBjPVtdLGw9MDtsPD0zNDtsKyspe3ZhciBoPW8ucmVhZEJpdHMoNCk7Yy5wdXNoKG5ldyBIdWZmbWFuTGluZShbbCxoLDAsMF0pKX12YXIgZD1uZXcgSHVmZm1hblRhYmxlKGMsITEpO2MubGVuZ3RoPTA7Zm9yKHZhciBwPTA7cDxpOyl7dmFyIG09ZC5kZWNvZGUobyk7aWYobT49MzIpe3ZhciBnPXZvaWQgMCx5PXZvaWQgMCxiPXZvaWQgMDtzd2l0Y2gobSl7Y2FzZSAzMjppZigwPT09cCl0aHJvdyBuZXcgdSgibm8gcHJldmlvdXMgdmFsdWUgaW4gc3ltYm9sIElEIHRhYmxlIik7eT1vLnJlYWRCaXRzKDIpKzM7Zz1jW3AtMV0ucHJlZml4TGVuZ3RoO2JyZWFrO2Nhc2UgMzM6eT1vLnJlYWRCaXRzKDMpKzM7Zz0wO2JyZWFrO2Nhc2UgMzQ6eT1vLnJlYWRCaXRzKDcpKzExO2c9MDticmVhaztkZWZhdWx0OnRocm93IG5ldyB1KCJpbnZhbGlkIGNvZGUgbGVuZ3RoIGluIHN5bWJvbCBJRCB0YWJsZSIpfWZvcihiPTA7Yjx5O2IrKyl7Yy5wdXNoKG5ldyBIdWZmbWFuTGluZShbcCxnLDAsMF0pKTtwKyt9fWVsc2V7Yy5wdXNoKG5ldyBIdWZmbWFuTGluZShbcCxtLDAsMF0pKTtwKyt9fW8uYnl0ZUFsaWduKCk7dmFyIHYsUyxrLHc9bmV3IEh1ZmZtYW5UYWJsZShjLCExKSxDPTA7c3dpdGNoKHQuaHVmZm1hbkZTKXtjYXNlIDA6Y2FzZSAxOnY9Z2V0U3RhbmRhcmRUYWJsZSh0Lmh1ZmZtYW5GUys2KTticmVhaztjYXNlIDM6dj1nZXRDdXN0b21IdWZmbWFuVGFibGUoQyxyLGEpO0MrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyB1KCJpbnZhbGlkIEh1ZmZtYW4gRlMgc2VsZWN0b3IiKX1zd2l0Y2godC5odWZmbWFuRFMpe2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOlM9Z2V0U3RhbmRhcmRUYWJsZSh0Lmh1ZmZtYW5EUys4KTticmVhaztjYXNlIDM6Uz1nZXRDdXN0b21IdWZmbWFuVGFibGUoQyxyLGEpO0MrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyB1KCJpbnZhbGlkIEh1ZmZtYW4gRFMgc2VsZWN0b3IiKX1zd2l0Y2godC5odWZmbWFuRFQpe2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOms9Z2V0U3RhbmRhcmRUYWJsZSh0Lmh1ZmZtYW5EVCsxMSk7YnJlYWs7Y2FzZSAzOms9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKEMscixhKTtDKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgdSgiaW52YWxpZCBIdWZmbWFuIERUIHNlbGVjdG9yIil9aWYodC5yZWZpbmVtZW50KXRocm93IG5ldyB1KCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJue3N5bWJvbElEVGFibGU6dyx0YWJsZUZpcnN0Uzp2LHRhYmxlRGVsdGFTOlMsdGFibGVEZWx0YVQ6a319KHQscix0aGlzLmN1c3RvbVRhYmxlcyxtLmxlbmd0aCxoKX12YXIgUz1uZXcgRGVjb2RpbmdDb250ZXh0KGEsaSxjKSxrPWRlY29kZVRleHRSZWdpb24odC5odWZmbWFuLHQucmVmaW5lbWVudCxkLndpZHRoLGQuaGVpZ2h0LHQuZGVmYXVsdFBpeGVsVmFsdWUsdC5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyx0LnN0cmlwU2l6ZSxtLHYsdC50cmFuc3Bvc2VkLHQuZHNPZmZzZXQsdC5yZWZlcmVuY2VDb3JuZXIsdC5jb21iaW5hdGlvbk9wZXJhdG9yLGwsdC5yZWZpbmVtZW50VGVtcGxhdGUsdC5yZWZpbmVtZW50QXQsUyx0LmxvZ1N0cmlwU2l6ZSxoKTt0aGlzLmRyYXdCaXRtYXAoZCxrKX0sb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb246ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG9uUGF0dGVybkRpY3Rpb25hcnk6ZnVuY3Rpb24gb25QYXR0ZXJuRGljdGlvbmFyeSh0LHIsYSxpLG8pe3ZhciBjPXRoaXMucGF0dGVybnM7Y3x8KHRoaXMucGF0dGVybnM9Yz17fSk7dmFyIGw9bmV3IERlY29kaW5nQ29udGV4dChhLGksbyk7Y1tyXT1mdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeSh0LHIsYSxpLG8sYyl7dmFyIGw9W107aWYoIXQpe2wucHVzaCh7eDotcix5OjB9KTtpZigwPT09byl7bC5wdXNoKHt4Oi0zLHk6LTF9KTtsLnB1c2goe3g6Mix5Oi0yfSk7bC5wdXNoKHt4Oi0yLHk6LTJ9KX19Zm9yKHZhciB1PWRlY29kZUJpdG1hcCh0LChpKzEpKnIsYSxvLCExLG51bGwsbCxjKSxoPVtdLGQ9MDtkPD1pO2QrKyl7Zm9yKHZhciBwPVtdLG09cipkLGc9bStyLHk9MDt5PGE7eSsrKXAucHVzaCh1W3ldLnN1YmFycmF5KG0sZykpO2gucHVzaChwKX1yZXR1cm4gaH0odC5tbXIsdC5wYXR0ZXJuV2lkdGgsdC5wYXR0ZXJuSGVpZ2h0LHQubWF4UGF0dGVybkluZGV4LHQudGVtcGxhdGUsbCl9LG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb246ZnVuY3Rpb24gb25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbih0LHIsYSxpLGMpe3ZhciBsPXRoaXMucGF0dGVybnNbclswXV0saD10LmluZm8sZD1uZXcgRGVjb2RpbmdDb250ZXh0KGEsaSxjKSxwPWZ1bmN0aW9uIGRlY29kZUhhbGZ0b25lUmVnaW9uKHQscixhLGksYyxsLGgsZCxwLG0sZyx5LGIsdixTKXtpZihoKXRocm93IG5ldyB1KCJza2lwIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZigwIT09ZCl0aHJvdyBuZXcgdSgib3BlcmF0b3IgIitkKyIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb24iKTt2YXIgayx3LEMsXz1bXTtmb3Ioaz0wO2s8YztrKyspe0M9bmV3IFVpbnQ4QXJyYXkoaSk7aWYobClmb3Iodz0wO3c8aTt3KyspQ1t3XT1sO18ucHVzaChDKX12YXIgeD1yLmxlbmd0aCxBPXJbMF0sVD1BWzBdLmxlbmd0aCxSPUEubGVuZ3RoLEk9KDAsby5sb2cyKSh4KSxQPVtdO2lmKCF0KXtQLnB1c2goe3g6YTw9MT8zOjIseTotMX0pO2lmKDA9PT1hKXtQLnB1c2goe3g6LTMseTotMX0pO1AucHVzaCh7eDoyLHk6LTJ9KTtQLnB1c2goe3g6LTIseTotMn0pfX12YXIgTyxFLEIsRCxNLEwsTixVLGoscSxXLHo9W107dCYmKE89bmV3IFJlYWRlcihTLmRhdGEsUy5zdGFydCxTLmVuZCkpO2ZvcihrPUktMTtrPj0wO2stLSl7RT10P2RlY29kZU1NUkJpdG1hcChPLHAsbSwhMCk6ZGVjb2RlQml0bWFwKCExLHAsbSxhLCExLG51bGwsUCxTKTt6W2tdPUV9Zm9yKEI9MDtCPG07QisrKWZvcihEPTA7RDxwO0QrKyl7TT0wO0w9MDtmb3Iodz1JLTE7dz49MDt3LS0pTHw9KE09elt3XVtCXVtEXV5NKTw8dztOPXJbTF07aj15K0IqYi1EKnY+Pjg7aWYoKFU9ZytCKnYrRCpiPj44KT49MCYmVStUPD1pJiZqPj0wJiZqK1I8PWMpZm9yKGs9MDtrPFI7aysrKXtXPV9baitrXTtxPU5ba107Zm9yKHc9MDt3PFQ7dysrKVdbVSt3XXw9cVt3XX1lbHNle3ZhciBHPXZvaWQgMCxIPXZvaWQgMDtmb3Ioaz0wO2s8UjtrKyspaWYoISgoSD1qK2spPDB8fEg+PWMpKXtXPV9bSF07cT1OW2tdO2Zvcih3PTA7dzxUO3crKykoRz1VK3cpPj0wJiZHPGkmJihXW0ddfD1xW3ddKX19fXJldHVybiBffSh0Lm1tcixsLHQudGVtcGxhdGUsaC53aWR0aCxoLmhlaWdodCx0LmRlZmF1bHRQaXhlbFZhbHVlLHQuZW5hYmxlU2tpcCx0LmNvbWJpbmF0aW9uT3BlcmF0b3IsdC5ncmlkV2lkdGgsdC5ncmlkSGVpZ2h0LHQuZ3JpZE9mZnNldFgsdC5ncmlkT2Zmc2V0WSx0LmdyaWRWZWN0b3JYLHQuZ3JpZFZlY3RvclksZCk7dGhpcy5kcmF3Qml0bWFwKGgscCl9LG9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbjpmdW5jdGlvbiBvbkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvblRhYmxlczpmdW5jdGlvbiBvblRhYmxlcyh0LHIsYSxpKXt2YXIgYz10aGlzLmN1c3RvbVRhYmxlcztjfHwodGhpcy5jdXN0b21UYWJsZXM9Yz17fSk7Y1t0XT1mdW5jdGlvbiBkZWNvZGVUYWJsZXNTZWdtZW50KHQscixhKXt2YXIgaSxjLGw9dFtyXSx1PTQyOTQ5NjcyOTUmKDAsby5yZWFkVWludDMyKSh0LHIrMSksaD00Mjk0OTY3Mjk1JigwLG8ucmVhZFVpbnQzMikodCxyKzUpLGQ9bmV3IFJlYWRlcih0LHIrOSxhKSxwPTErKGw+PjEmNyksbT0xKyhsPj40JjcpLGc9W10seT11O2Rve2k9ZC5yZWFkQml0cyhwKTtjPWQucmVhZEJpdHMobSk7Zy5wdXNoKG5ldyBIdWZmbWFuTGluZShbeSxpLGMsMF0pKTt5Kz0xPDxjfXdoaWxlKHk8aCk7aT1kLnJlYWRCaXRzKHApO2cucHVzaChuZXcgSHVmZm1hbkxpbmUoW3UtMSxpLDMyLDAsImxvd2VyIl0pKTtpPWQucmVhZEJpdHMocCk7Zy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaCxpLDMyLDBdKSk7aWYoMSZsKXtpPWQucmVhZEJpdHMocCk7Zy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwwXSkpfXJldHVybiBuZXcgSHVmZm1hblRhYmxlKGcsITEpfShyLGEsaSl9fTtmdW5jdGlvbiBIdWZmbWFuTGluZSh0KXtpZigyPT09dC5sZW5ndGgpe3RoaXMuaXNPT0I9ITA7dGhpcy5yYW5nZUxvdz0wO3RoaXMucHJlZml4TGVuZ3RoPXRbMF07dGhpcy5yYW5nZUxlbmd0aD0wO3RoaXMucHJlZml4Q29kZT10WzFdO3RoaXMuaXNMb3dlclJhbmdlPSExfWVsc2V7dGhpcy5pc09PQj0hMTt0aGlzLnJhbmdlTG93PXRbMF07dGhpcy5wcmVmaXhMZW5ndGg9dFsxXTt0aGlzLnJhbmdlTGVuZ3RoPXRbMl07dGhpcy5wcmVmaXhDb2RlPXRbM107dGhpcy5pc0xvd2VyUmFuZ2U9Imxvd2VyIj09PXRbNF19fWZ1bmN0aW9uIEh1ZmZtYW5UcmVlTm9kZSh0KXt0aGlzLmNoaWxkcmVuPVtdO2lmKHQpe3RoaXMuaXNMZWFmPSEwO3RoaXMucmFuZ2VMZW5ndGg9dC5yYW5nZUxlbmd0aDt0aGlzLnJhbmdlTG93PXQucmFuZ2VMb3c7dGhpcy5pc0xvd2VyUmFuZ2U9dC5pc0xvd2VyUmFuZ2U7dGhpcy5pc09PQj10LmlzT09CfWVsc2UgdGhpcy5pc0xlYWY9ITF9SHVmZm1hblRyZWVOb2RlLnByb3RvdHlwZT17YnVpbGRUcmVlOmZ1bmN0aW9uIGJ1aWxkVHJlZSh0LHIpe3ZhciBhPXQucHJlZml4Q29kZT4+ciYxO2lmKHI8PTApdGhpcy5jaGlsZHJlblthXT1uZXcgSHVmZm1hblRyZWVOb2RlKHQpO2Vsc2V7dmFyIGk9dGhpcy5jaGlsZHJlblthXTtpfHwodGhpcy5jaGlsZHJlblthXT1pPW5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCkpO2kuYnVpbGRUcmVlKHQsci0xKX19LGRlY29kZU5vZGU6ZnVuY3Rpb24gZGVjb2RlTm9kZSh0KXtpZih0aGlzLmlzTGVhZil7aWYodGhpcy5pc09PQilyZXR1cm4gbnVsbDt2YXIgcj10LnJlYWRCaXRzKHRoaXMucmFuZ2VMZW5ndGgpO3JldHVybiB0aGlzLnJhbmdlTG93Kyh0aGlzLmlzTG93ZXJSYW5nZT8tcjpyKX12YXIgYT10aGlzLmNoaWxkcmVuW3QucmVhZEJpdCgpXTtpZighYSl0aHJvdyBuZXcgdSgiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTtyZXR1cm4gYS5kZWNvZGVOb2RlKHQpfX07ZnVuY3Rpb24gSHVmZm1hblRhYmxlKHQscil7cnx8dGhpcy5hc3NpZ25QcmVmaXhDb2Rlcyh0KTt0aGlzLnJvb3ROb2RlPW5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7Zm9yKHZhciBhPTAsaT10Lmxlbmd0aDthPGk7YSsrKXt2YXIgbz10W2FdO28ucHJlZml4TGVuZ3RoPjAmJnRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKG8sby5wcmVmaXhMZW5ndGgtMSl9fUh1ZmZtYW5UYWJsZS5wcm90b3R5cGU9e2RlY29kZTpmdW5jdGlvbiBkZWNvZGUodCl7cmV0dXJuIHRoaXMucm9vdE5vZGUuZGVjb2RlTm9kZSh0KX0sYXNzaWduUHJlZml4Q29kZXM6ZnVuY3Rpb24gYXNzaWduUHJlZml4Q29kZXModCl7Zm9yKHZhciByPXQubGVuZ3RoLGE9MCxpPTA7aTxyO2krKylhPU1hdGgubWF4KGEsdFtpXS5wcmVmaXhMZW5ndGgpO2Zvcih2YXIgbz1uZXcgVWludDMyQXJyYXkoYSsxKSxjPTA7YzxyO2MrKylvW3RbY10ucHJlZml4TGVuZ3RoXSsrO3ZhciBsLHUsaCxkPTEscD0wO29bMF09MDtmb3IoO2Q8PWE7KXtsPXA9cCtvW2QtMV08PDE7dT0wO2Zvcig7dTxyOyl7aWYoKGg9dFt1XSkucHJlZml4TGVuZ3RoPT09ZCl7aC5wcmVmaXhDb2RlPWw7bCsrfXUrK31kKyt9fX07dmFyIG09e307ZnVuY3Rpb24gZ2V0U3RhbmRhcmRUYWJsZSh0KXt2YXIgcixhPW1bdF07aWYoYSlyZXR1cm4gYTtzd2l0Y2godCl7Y2FzZSAxOnI9W1swLDEsNCwwXSxbMTYsMiw4LDJdLFsyNzIsMywxNiw2XSxbNjU4MDgsMywzMiw3XV07YnJlYWs7Y2FzZSAyOnI9W1swLDEsMCwwXSxbMSwyLDAsMl0sWzIsMywwLDZdLFszLDQsMywxNF0sWzExLDUsNiwzMF0sWzc1LDYsMzIsNjJdLFs2LDYzXV07YnJlYWs7Y2FzZSAzOnI9W1stMjU2LDgsOCwyNTRdLFswLDEsMCwwXSxbMSwyLDAsMl0sWzIsMywwLDZdLFszLDQsMywxNF0sWzExLDUsNiwzMF0sWy0yNTcsOCwzMiwyNTUsImxvd2VyIl0sWzc1LDcsMzIsMTI2XSxbNiw2Ml1dO2JyZWFrO2Nhc2UgNDpyPVtbMSwxLDAsMF0sWzIsMiwwLDJdLFszLDMsMCw2XSxbNCw0LDMsMTRdLFsxMiw1LDYsMzBdLFs3Niw1LDMyLDMxXV07YnJlYWs7Y2FzZSA1OnI9W1stMjU1LDcsOCwxMjZdLFsxLDEsMCwwXSxbMiwyLDAsMl0sWzMsMywwLDZdLFs0LDQsMywxNF0sWzEyLDUsNiwzMF0sWy0yNTYsNywzMiwxMjcsImxvd2VyIl0sWzc2LDYsMzIsNjJdXTticmVhaztjYXNlIDY6cj1bWy0yMDQ4LDUsMTAsMjhdLFstMTAyNCw0LDksOF0sWy01MTIsNCw4LDldLFstMjU2LDQsNywxMF0sWy0xMjgsNSw2LDI5XSxbLTY0LDUsNSwzMF0sWy0zMiw0LDUsMTFdLFswLDIsNywwXSxbMTI4LDMsNywyXSxbMjU2LDMsOCwzXSxbNTEyLDQsOSwxMl0sWzEwMjQsNCwxMCwxM10sWy0yMDQ5LDYsMzIsNjIsImxvd2VyIl0sWzIwNDgsNiwzMiw2M11dO2JyZWFrO2Nhc2UgNzpyPVtbLTEwMjQsNCw5LDhdLFstNTEyLDMsOCwwXSxbLTI1Niw0LDcsOV0sWy0xMjgsNSw2LDI2XSxbLTY0LDUsNSwyN10sWy0zMiw0LDUsMTBdLFswLDQsNSwxMV0sWzMyLDUsNSwyOF0sWzY0LDUsNiwyOV0sWzEyOCw0LDcsMTJdLFsyNTYsMyw4LDFdLFs1MTIsMyw5LDJdLFsxMDI0LDMsMTAsM10sWy0xMDI1LDUsMzIsMzAsImxvd2VyIl0sWzIwNDgsNSwzMiwzMV1dO2JyZWFrO2Nhc2UgODpyPVtbLTE1LDgsMywyNTJdLFstNyw5LDEsNTA4XSxbLTUsOCwxLDI1M10sWy0zLDksMCw1MDldLFstMiw3LDAsMTI0XSxbLTEsNCwwLDEwXSxbMCwyLDEsMF0sWzIsNSwwLDI2XSxbMyw2LDAsNThdLFs0LDMsNCw0XSxbMjAsNiwxLDU5XSxbMjIsNCw0LDExXSxbMzgsNCw1LDEyXSxbNzAsNSw2LDI3XSxbMTM0LDUsNywyOF0sWzI2Miw2LDcsNjBdLFszOTAsNyw4LDEyNV0sWzY0Niw2LDEwLDYxXSxbLTE2LDksMzIsNTEwLCJsb3dlciJdLFsxNjcwLDksMzIsNTExXSxbMiwxXV07YnJlYWs7Y2FzZSA5OnI9W1stMzEsOCw0LDI1Ml0sWy0xNSw5LDIsNTA4XSxbLTExLDgsMiwyNTNdLFstNyw5LDEsNTA5XSxbLTUsNywxLDEyNF0sWy0zLDQsMSwxMF0sWy0xLDMsMSwyXSxbMSwzLDEsM10sWzMsNSwxLDI2XSxbNSw2LDEsNThdLFs3LDMsNSw0XSxbMzksNiwyLDU5XSxbNDMsNCw1LDExXSxbNzUsNCw2LDEyXSxbMTM5LDUsNywyN10sWzI2Nyw1LDgsMjhdLFs1MjMsNiw4LDYwXSxbNzc5LDcsOSwxMjVdLFsxMjkxLDYsMTEsNjFdLFstMzIsOSwzMiw1MTAsImxvd2VyIl0sWzMzMzksOSwzMiw1MTFdLFsyLDBdXTticmVhaztjYXNlIDEwOnI9W1stMjEsNyw0LDEyMl0sWy01LDgsMCwyNTJdLFstNCw3LDAsMTIzXSxbLTMsNSwwLDI0XSxbLTIsMiwyLDBdLFsyLDUsMCwyNV0sWzMsNiwwLDU0XSxbNCw3LDAsMTI0XSxbNSw4LDAsMjUzXSxbNiwyLDYsMV0sWzcwLDUsNSwyNl0sWzEwMiw2LDUsNTVdLFsxMzQsNiw2LDU2XSxbMTk4LDYsNyw1N10sWzMyNiw2LDgsNThdLFs1ODIsNiw5LDU5XSxbMTA5NCw2LDEwLDYwXSxbMjExOCw3LDExLDEyNV0sWy0yMiw4LDMyLDI1NCwibG93ZXIiXSxbNDE2Niw4LDMyLDI1NV0sWzIsMl1dO2JyZWFrO2Nhc2UgMTE6cj1bWzEsMSwwLDBdLFsyLDIsMSwyXSxbNCw0LDAsMTJdLFs1LDQsMSwxM10sWzcsNSwxLDI4XSxbOSw1LDIsMjldLFsxMyw2LDIsNjBdLFsxNyw3LDIsMTIyXSxbMjEsNywzLDEyM10sWzI5LDcsNCwxMjRdLFs0NSw3LDUsMTI1XSxbNzcsNyw2LDEyNl0sWzE0MSw3LDMyLDEyN11dO2JyZWFrO2Nhc2UgMTI6cj1bWzEsMSwwLDBdLFsyLDIsMCwyXSxbMywzLDEsNl0sWzUsNSwwLDI4XSxbNiw1LDEsMjldLFs4LDYsMSw2MF0sWzEwLDcsMCwxMjJdLFsxMSw3LDEsMTIzXSxbMTMsNywyLDEyNF0sWzE3LDcsMywxMjVdLFsyNSw3LDQsMTI2XSxbNDEsOCw1LDI1NF0sWzczLDgsMzIsMjU1XV07YnJlYWs7Y2FzZSAxMzpyPVtbMSwxLDAsMF0sWzIsMywwLDRdLFszLDQsMCwxMl0sWzQsNSwwLDI4XSxbNSw0LDEsMTNdLFs3LDMsMyw1XSxbMTUsNiwxLDU4XSxbMTcsNiwyLDU5XSxbMjEsNiwzLDYwXSxbMjksNiw0LDYxXSxbNDUsNiw1LDYyXSxbNzcsNyw2LDEyNl0sWzE0MSw3LDMyLDEyN11dO2JyZWFrO2Nhc2UgMTQ6cj1bWy0yLDMsMCw0XSxbLTEsMywwLDVdLFswLDEsMCwwXSxbMSwzLDAsNl0sWzIsMywwLDddXTticmVhaztjYXNlIDE1OnI9W1stMjQsNyw0LDEyNF0sWy04LDYsMiw2MF0sWy00LDUsMSwyOF0sWy0yLDQsMCwxMl0sWy0xLDMsMCw0XSxbMCwxLDAsMF0sWzEsMywwLDVdLFsyLDQsMCwxM10sWzMsNSwxLDI5XSxbNSw2LDIsNjFdLFs5LDcsNCwxMjVdLFstMjUsNywzMiwxMjYsImxvd2VyIl0sWzI1LDcsMzIsMTI3XV07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgdSgic3RhbmRhcmQgdGFibGUgQi4iLmNvbmNhdCh0LCIgZG9lcyBub3QgZXhpc3QiKSl9Zm9yKHZhciBpPTAsbz1yLmxlbmd0aDtpPG87aSsrKXJbaV09bmV3IEh1ZmZtYW5MaW5lKHJbaV0pO2E9bmV3IEh1ZmZtYW5UYWJsZShyLCEwKTttW3RdPWE7cmV0dXJuIGF9ZnVuY3Rpb24gUmVhZGVyKHQscixhKXt0aGlzLmRhdGE9dDt0aGlzLnN0YXJ0PXI7dGhpcy5lbmQ9YTt0aGlzLnBvc2l0aW9uPXI7dGhpcy5zaGlmdD0tMTt0aGlzLmN1cnJlbnRCeXRlPTB9UmVhZGVyLnByb3RvdHlwZT17cmVhZEJpdDpmdW5jdGlvbiByZWFkQml0KCl7aWYodGhpcy5zaGlmdDwwKXtpZih0aGlzLnBvc2l0aW9uPj10aGlzLmVuZCl0aHJvdyBuZXcgdSgiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTt0aGlzLmN1cnJlbnRCeXRlPXRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdO3RoaXMuc2hpZnQ9N312YXIgdD10aGlzLmN1cnJlbnRCeXRlPj50aGlzLnNoaWZ0JjE7dGhpcy5zaGlmdC0tO3JldHVybiB0fSxyZWFkQml0czpmdW5jdGlvbiByZWFkQml0cyh0KXt2YXIgcixhPTA7Zm9yKHI9dC0xO3I+PTA7ci0tKWF8PXRoaXMucmVhZEJpdCgpPDxyO3JldHVybiBhfSxieXRlQWxpZ246ZnVuY3Rpb24gYnl0ZUFsaWduKCl7dGhpcy5zaGlmdD0tMX0sbmV4dDpmdW5jdGlvbiBuZXh0KCl7cmV0dXJuIHRoaXMucG9zaXRpb24+PXRoaXMuZW5kPy0xOnRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdfX07ZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKHQscixhKXtmb3IodmFyIGk9MCxvPTAsYz1yLmxlbmd0aDtvPGM7bysrKXt2YXIgbD1hW3Jbb11dO2lmKGwpe2lmKHQ9PT1pKXJldHVybiBsO2krK319dGhyb3cgbmV3IHUoImNhbid0IGZpbmQgY3VzdG9tIEh1ZmZtYW4gdGFibGUiKX1mdW5jdGlvbiByZWFkVW5jb21wcmVzc2VkQml0bWFwKHQscixhKXtmb3IodmFyIGk9W10sbz0wO288YTtvKyspe3ZhciBjPW5ldyBVaW50OEFycmF5KHIpO2kucHVzaChjKTtmb3IodmFyIGw9MDtsPHI7bCsrKWNbbF09dC5yZWFkQml0KCk7dC5ieXRlQWxpZ24oKX1yZXR1cm4gaX1mdW5jdGlvbiBkZWNvZGVNTVJCaXRtYXAodCxyLGEsaSl7Zm9yKHZhciBvLGM9e0s6LTEsQ29sdW1uczpyLFJvd3M6YSxCbGFja0lzMTohMCxFbmRPZkJsb2NrOml9LHU9bmV3IGwuQ0NJVFRGYXhEZWNvZGVyKHQsYyksaD1bXSxkPSExLHA9MDtwPGE7cCsrKXt2YXIgbT1uZXcgVWludDhBcnJheShyKTtoLnB1c2gobSk7Zm9yKHZhciBnPS0xLHk9MDt5PHI7eSsrKXtpZihnPDApe2lmKC0xPT09KG89dS5yZWFkTmV4dENoYXIoKSkpe289MDtkPSEwfWc9N31tW3ldPW8+PmcmMTtnLS19fWlmKGkmJiFkKWZvcih2YXIgYj0wO2I8NSYmLTEhPT11LnJlYWROZXh0Q2hhcigpO2IrKyk7cmV0dXJuIGh9ZnVuY3Rpb24gSmJpZzJJbWFnZSgpe31KYmlnMkltYWdlLnByb3RvdHlwZT17cGFyc2VDaHVua3M6ZnVuY3Rpb24gcGFyc2VDaHVua3ModCl7cmV0dXJuIGZ1bmN0aW9uIHBhcnNlSmJpZzJDaHVua3ModCl7Zm9yKHZhciByPW5ldyBTaW1wbGVTZWdtZW50VmlzaXRvcixhPTAsaT10Lmxlbmd0aDthPGk7YSsrKXt2YXIgbz10W2FdO3Byb2Nlc3NTZWdtZW50cyhyZWFkU2VnbWVudHMoe30sby5kYXRhLG8uc3RhcnQsby5lbmQpLHIpfXJldHVybiByLmJ1ZmZlcn0odCl9LHBhcnNlOmZ1bmN0aW9uIHBhcnNlKHQpe3ZhciByPWZ1bmN0aW9uIHBhcnNlSmJpZzIodCl7dmFyIHI9dC5sZW5ndGgsYT0wO2lmKDE1MSE9PXRbYV18fDc0IT09dFthKzFdfHw2NiE9PXRbYSsyXXx8NTAhPT10W2ErM118fDEzIT09dFthKzRdfHwxMCE9PXRbYSs1XXx8MjYhPT10W2ErNl18fDEwIT09dFthKzddKXRocm93IG5ldyB1KCJwYXJzZUpiaWcyIC0gaW52YWxpZCBoZWFkZXIuIik7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTthKz04O3ZhciBjPXRbYSsrXTtpLnJhbmRvbUFjY2Vzcz0hKDEmYyk7aWYoISgyJmMpKXtpLm51bWJlck9mUGFnZXM9KDAsby5yZWFkVWludDMyKSh0LGEpO2ErPTR9dmFyIGw9cmVhZFNlZ21lbnRzKGksdCxhLHIpLGg9bmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yO3Byb2Nlc3NTZWdtZW50cyhsLGgpO2Zvcih2YXIgZD1oLmN1cnJlbnRQYWdlSW5mbyxwPWQud2lkdGgsbT1kLmhlaWdodCxnPWguYnVmZmVyLHk9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHAqbSksYj0wLHY9MCxTPTA7UzxtO1MrKylmb3IodmFyIGs9MCx3PXZvaWQgMCxDPTA7QzxwO0MrKyl7aWYoIWspe2s9MTI4O3c9Z1t2KytdfXlbYisrXT13Jms/MDoyNTU7az4+PTF9cmV0dXJue2ltZ0RhdGE6eSx3aWR0aDpwLGhlaWdodDptfX0odCksYT1yLmltZ0RhdGEsaT1yLndpZHRoLGM9ci5oZWlnaHQ7dGhpcy53aWR0aD1pO3RoaXMuaGVpZ2h0PWM7cmV0dXJuIGF9fTtyZXR1cm4gSmJpZzJJbWFnZX0oKTtyLkpiaWcySW1hZ2U9aH0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5Bcml0aG1ldGljRGVjb2Rlcj12b2lkIDA7ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGk9clthXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMTtpLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX12YXIgaT1be3FlOjIyMDE3LG5tcHM6MSxubHBzOjEsc3dpdGNoRmxhZzoxfSx7cWU6MTMzMTMsbm1wczoyLG5scHM6Nixzd2l0Y2hGbGFnOjB9LHtxZTo2MTQ1LG5tcHM6MyxubHBzOjksc3dpdGNoRmxhZzowfSx7cWU6Mjc1MyxubXBzOjQsbmxwczoxMixzd2l0Y2hGbGFnOjB9LHtxZToxMzEzLG5tcHM6NSxubHBzOjI5LHN3aXRjaEZsYWc6MH0se3FlOjU0NSxubXBzOjM4LG5scHM6MzMsc3dpdGNoRmxhZzowfSx7cWU6MjIwMTcsbm1wczo3LG5scHM6Nixzd2l0Y2hGbGFnOjF9LHtxZToyMTUwNSxubXBzOjgsbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxODQzMyxubXBzOjksbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxNDMzNyxubXBzOjEwLG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MTIyODksbm1wczoxMSxubHBzOjE3LHN3aXRjaEZsYWc6MH0se3FlOjkyMTcsbm1wczoxMixubHBzOjE4LHN3aXRjaEZsYWc6MH0se3FlOjcxNjksbm1wczoxMyxubHBzOjIwLHN3aXRjaEZsYWc6MH0se3FlOjU2MzMsbm1wczoyOSxubHBzOjIxLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6MTUsbmxwczoxNCxzd2l0Y2hGbGFnOjF9LHtxZToyMTUwNSxubXBzOjE2LG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MjA3Mzcsbm1wczoxNyxubHBzOjE1LHN3aXRjaEZsYWc6MH0se3FlOjE4NDMzLG5tcHM6MTgsbmxwczoxNixzd2l0Y2hGbGFnOjB9LHtxZToxNDMzNyxubXBzOjE5LG5scHM6MTcsc3dpdGNoRmxhZzowfSx7cWU6MTMzMTMsbm1wczoyMCxubHBzOjE4LHN3aXRjaEZsYWc6MH0se3FlOjEyMjg5LG5tcHM6MjEsbmxwczoxOSxzd2l0Y2hGbGFnOjB9LHtxZToxMDI0MSxubXBzOjIyLG5scHM6MTksc3dpdGNoRmxhZzowfSx7cWU6OTIxNyxubXBzOjIzLG5scHM6MjAsc3dpdGNoRmxhZzowfSx7cWU6ODcwNSxubXBzOjI0LG5scHM6MjEsc3dpdGNoRmxhZzowfSx7cWU6NzE2OSxubXBzOjI1LG5scHM6MjIsc3dpdGNoRmxhZzowfSx7cWU6NjE0NSxubXBzOjI2LG5scHM6MjMsc3dpdGNoRmxhZzowfSx7cWU6NTYzMyxubXBzOjI3LG5scHM6MjQsc3dpdGNoRmxhZzowfSx7cWU6NTEyMSxubXBzOjI4LG5scHM6MjUsc3dpdGNoRmxhZzowfSx7cWU6NDYwOSxubXBzOjI5LG5scHM6MjYsc3dpdGNoRmxhZzowfSx7cWU6NDM1MyxubXBzOjMwLG5scHM6Mjcsc3dpdGNoRmxhZzowfSx7cWU6Mjc1MyxubXBzOjMxLG5scHM6Mjgsc3dpdGNoRmxhZzowfSx7cWU6MjQ5NyxubXBzOjMyLG5scHM6Mjksc3dpdGNoRmxhZzowfSx7cWU6MjIwOSxubXBzOjMzLG5scHM6MzAsc3dpdGNoRmxhZzowfSx7cWU6MTMxMyxubXBzOjM0LG5scHM6MzEsc3dpdGNoRmxhZzowfSx7cWU6MTA4OSxubXBzOjM1LG5scHM6MzIsc3dpdGNoRmxhZzowfSx7cWU6NjczLG5tcHM6MzYsbmxwczozMyxzd2l0Y2hGbGFnOjB9LHtxZTo1NDUsbm1wczozNyxubHBzOjM0LHN3aXRjaEZsYWc6MH0se3FlOjMyMSxubXBzOjM4LG5scHM6MzUsc3dpdGNoRmxhZzowfSx7cWU6MjczLG5tcHM6MzksbmxwczozNixzd2l0Y2hGbGFnOjB9LHtxZToxMzMsbm1wczo0MCxubHBzOjM3LHN3aXRjaEZsYWc6MH0se3FlOjczLG5tcHM6NDEsbmxwczozOCxzd2l0Y2hGbGFnOjB9LHtxZTozNyxubXBzOjQyLG5scHM6Mzksc3dpdGNoRmxhZzowfSx7cWU6MjEsbm1wczo0MyxubHBzOjQwLHN3aXRjaEZsYWc6MH0se3FlOjksbm1wczo0NCxubHBzOjQxLHN3aXRjaEZsYWc6MH0se3FlOjUsbm1wczo0NSxubHBzOjQyLHN3aXRjaEZsYWc6MH0se3FlOjEsbm1wczo0NSxubHBzOjQzLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6NDYsbmxwczo0Nixzd2l0Y2hGbGFnOjB9XSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQXJpdGhtZXRpY0RlY29kZXIodCxyLGEpeyFmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxBcml0aG1ldGljRGVjb2Rlcik7dGhpcy5kYXRhPXQ7dGhpcy5icD1yO3RoaXMuZGF0YUVuZD1hO3RoaXMuY2hpZ2g9dFtyXTt0aGlzLmNsb3c9MDt0aGlzLmJ5dGVJbigpO3RoaXMuY2hpZ2g9dGhpcy5jaGlnaDw8NyY2NTUzNXx0aGlzLmNsb3c+PjkmMTI3O3RoaXMuY2xvdz10aGlzLmNsb3c8PDcmNjU1MzU7dGhpcy5jdC09Nzt0aGlzLmE9MzI3Njh9IWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH0oQXJpdGhtZXRpY0RlY29kZXIsW3trZXk6ImJ5dGVJbiIsdmFsdWU6ZnVuY3Rpb24gYnl0ZUluKCl7dmFyIHQ9dGhpcy5kYXRhLHI9dGhpcy5icDtpZigyNTU9PT10W3JdKWlmKHRbcisxXT4xNDMpe3RoaXMuY2xvdys9NjUyODA7dGhpcy5jdD04fWVsc2V7cisrO3RoaXMuY2xvdys9dFtyXTw8OTt0aGlzLmN0PTc7dGhpcy5icD1yfWVsc2V7cisrO3RoaXMuY2xvdys9cjx0aGlzLmRhdGFFbmQ/dFtyXTw8ODo2NTI4MDt0aGlzLmN0PTg7dGhpcy5icD1yfWlmKHRoaXMuY2xvdz42NTUzNSl7dGhpcy5jaGlnaCs9dGhpcy5jbG93Pj4xNjt0aGlzLmNsb3cmPTY1NTM1fX19LHtrZXk6InJlYWRCaXQiLHZhbHVlOmZ1bmN0aW9uIHJlYWRCaXQodCxyKXt2YXIgYSxvPXRbcl0+PjEsYz0xJnRbcl0sbD1pW29dLHU9bC5xZSxoPXRoaXMuYS11O2lmKHRoaXMuY2hpZ2g8dSlpZihoPHUpe2g9dTthPWM7bz1sLm5tcHN9ZWxzZXtoPXU7YT0xXmM7MT09PWwuc3dpdGNoRmxhZyYmKGM9YSk7bz1sLm5scHN9ZWxzZXt0aGlzLmNoaWdoLT11O2lmKDAhPSgzMjc2OCZoKSl7dGhpcy5hPWg7cmV0dXJuIGN9aWYoaDx1KXthPTFeYzsxPT09bC5zd2l0Y2hGbGFnJiYoYz1hKTtvPWwubmxwc31lbHNle2E9YztvPWwubm1wc319ZG97MD09PXRoaXMuY3QmJnRoaXMuYnl0ZUluKCk7aDw8PTE7dGhpcy5jaGlnaD10aGlzLmNoaWdoPDwxJjY1NTM1fHRoaXMuY2xvdz4+MTUmMTt0aGlzLmNsb3c9dGhpcy5jbG93PDwxJjY1NTM1O3RoaXMuY3QtLX13aGlsZSgwPT0oMzI3NjgmaCkpO3RoaXMuYT1oO3Rbcl09bzw8MXxjO3JldHVybiBhfX1dKTtyZXR1cm4gQXJpdGhtZXRpY0RlY29kZXJ9KCk7ci5Bcml0aG1ldGljRGVjb2Rlcj1vfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLkpwZWdTdHJlYW09dm9pZCAwO3ZhciBpPWEoMjA5KSxvPWEoMjAyKSxjPWEoMjE2KSxsPWEoNSksdT1mdW5jdGlvbiBKcGVnU3RyZWFtQ2xvc3VyZSgpe2Z1bmN0aW9uIEpwZWdTdHJlYW0odCxyLGEsbyl7Zm9yKHZhciBjOy0xIT09KGM9dC5nZXRCeXRlKCkpOylpZigyNTU9PT1jKXt0LnNraXAoLTEpO2JyZWFrfXRoaXMuc3RyZWFtPXQ7dGhpcy5tYXliZUxlbmd0aD1yO3RoaXMuZGljdD1hO3RoaXMucGFyYW1zPW87aS5EZWNvZGVTdHJlYW0uY2FsbCh0aGlzLHIpfUpwZWdTdHJlYW0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaS5EZWNvZGVTdHJlYW0ucHJvdG90eXBlKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSnBlZ1N0cmVhbS5wcm90b3R5cGUsImJ5dGVzIix7Z2V0OmZ1bmN0aW9uIEpwZWdTdHJlYW1fYnl0ZXMoKXtyZXR1cm4oMCxsLnNoYWRvdykodGhpcywiYnl0ZXMiLHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKX0sY29uZmlndXJhYmxlOiEwfSk7SnBlZ1N0cmVhbS5wcm90b3R5cGUuZW5zdXJlQnVmZmVyPWZ1bmN0aW9uKHQpe307SnBlZ1N0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZW9mKXt2YXIgdD17ZGVjb2RlVHJhbnNmb3JtOnZvaWQgMCxjb2xvclRyYW5zZm9ybTp2b2lkIDB9LHI9dGhpcy5kaWN0LmdldEFycmF5KCJEZWNvZGUiLCJEIik7aWYodGhpcy5mb3JjZVJHQiYmQXJyYXkuaXNBcnJheShyKSl7Zm9yKHZhciBhPXRoaXMuZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiKXx8OCxpPXIubGVuZ3RoLGw9bmV3IEludDMyQXJyYXkoaSksdT0hMSxoPSgxPDxhKS0xLGQ9MDtkPGk7ZCs9Mil7bFtkXT0yNTYqKHJbZCsxXS1yW2RdKXwwO2xbZCsxXT1yW2RdKmh8MDsyNTY9PT1sW2RdJiYwPT09bFtkKzFdfHwodT0hMCl9dSYmKHQuZGVjb2RlVHJhbnNmb3JtPWwpfWlmKCgwLG8uaXNEaWN0KSh0aGlzLnBhcmFtcykpe3ZhciBwPXRoaXMucGFyYW1zLmdldCgiQ29sb3JUcmFuc2Zvcm0iKTtOdW1iZXIuaXNJbnRlZ2VyKHApJiYodC5jb2xvclRyYW5zZm9ybT1wKX12YXIgbT1uZXcgYy5KcGVnSW1hZ2UodCk7bS5wYXJzZSh0aGlzLmJ5dGVzKTt2YXIgZz1tLmdldERhdGEoe3dpZHRoOnRoaXMuZHJhd1dpZHRoLGhlaWdodDp0aGlzLmRyYXdIZWlnaHQsZm9yY2VSR0I6dGhpcy5mb3JjZVJHQixpc1NvdXJjZVBERjohMH0pO3RoaXMuYnVmZmVyPWc7dGhpcy5idWZmZXJMZW5ndGg9Zy5sZW5ndGg7dGhpcy5lb2Y9ITB9fTtyZXR1cm4gSnBlZ1N0cmVhbX0oKTtyLkpwZWdTdHJlYW09dX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5KcGVnSW1hZ2U9dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIwNSk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX12YXIgYz1mdW5jdGlvbih0KXtfaW5oZXJpdHMoSnBlZ0Vycm9yLHQpO3ZhciByPV9jcmVhdGVTdXBlcihKcGVnRXJyb3IpO2Z1bmN0aW9uIEpwZWdFcnJvcih0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxKcGVnRXJyb3IpO3JldHVybiByLmNhbGwodGhpcywiSlBFRyBlcnJvcjogIi5jb25jYXQodCkpfXJldHVybiBKcGVnRXJyb3J9KGkuQmFzZUV4Y2VwdGlvbiksbD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoRE5MTWFya2VyRXJyb3IsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKEROTE1hcmtlckVycm9yKTtmdW5jdGlvbiBETkxNYXJrZXJFcnJvcih0LGEpe3ZhciBpO19jbGFzc0NhbGxDaGVjayh0aGlzLEROTE1hcmtlckVycm9yKTsoaT1yLmNhbGwodGhpcyx0KSkuc2NhbkxpbmVzPWE7cmV0dXJuIGl9cmV0dXJuIEROTE1hcmtlckVycm9yfShpLkJhc2VFeGNlcHRpb24pLHU9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEVPSU1hcmtlckVycm9yLHQpO3ZhciByPV9jcmVhdGVTdXBlcihFT0lNYXJrZXJFcnJvcik7ZnVuY3Rpb24gRU9JTWFya2VyRXJyb3IoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxFT0lNYXJrZXJFcnJvcik7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBFT0lNYXJrZXJFcnJvcn0oaS5CYXNlRXhjZXB0aW9uKSxoPWZ1bmN0aW9uIEpwZWdJbWFnZUNsb3N1cmUoKXt2YXIgdD1uZXcgVWludDhBcnJheShbMCwxLDgsMTYsOSwyLDMsMTAsMTcsMjQsMzIsMjUsMTgsMTEsNCw1LDEyLDE5LDI2LDMzLDQwLDQ4LDQxLDM0LDI3LDIwLDEzLDYsNywxNCwyMSwyOCwzNSw0Miw0OSw1Niw1Nyw1MCw0MywzNiwyOSwyMiwxNSwyMywzMCwzNyw0NCw1MSw1OCw1OSw1Miw0NSwzOCwzMSwzOSw0Niw1Myw2MCw2MSw1NCw0Nyw1NSw2Miw2M10pO2Z1bmN0aW9uIEpwZWdJbWFnZSgpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxyPXQuZGVjb2RlVHJhbnNmb3JtLGE9dm9pZCAwPT09cj9udWxsOnIsaT10LmNvbG9yVHJhbnNmb3JtLG89dm9pZCAwPT09aT8tMTppO3RoaXMuX2RlY29kZVRyYW5zZm9ybT1hO3RoaXMuX2NvbG9yVHJhbnNmb3JtPW99ZnVuY3Rpb24gYnVpbGRIdWZmbWFuVGFibGUodCxyKXtmb3IodmFyIGEsaSxvPTAsYz1bXSxsPTE2O2w+MCYmIXRbbC0xXTspbC0tO2MucHVzaCh7Y2hpbGRyZW46W10saW5kZXg6MH0pO3ZhciB1LGg9Y1swXTtmb3IoYT0wO2E8bDthKyspe2ZvcihpPTA7aTx0W2FdO2krKyl7KGg9Yy5wb3AoKSkuY2hpbGRyZW5baC5pbmRleF09cltvXTtmb3IoO2guaW5kZXg+MDspaD1jLnBvcCgpO2guaW5kZXgrKztjLnB1c2goaCk7Zm9yKDtjLmxlbmd0aDw9YTspe2MucHVzaCh1PXtjaGlsZHJlbjpbXSxpbmRleDowfSk7aC5jaGlsZHJlbltoLmluZGV4XT11LmNoaWxkcmVuO2g9dX1vKyt9aWYoYSsxPGwpe2MucHVzaCh1PXtjaGlsZHJlbjpbXSxpbmRleDowfSk7aC5jaGlsZHJlbltoLmluZGV4XT11LmNoaWxkcmVuO2g9dX19cmV0dXJuIGNbMF0uY2hpbGRyZW59ZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQodCxyLGEpe3JldHVybiA2NCooKHQuYmxvY2tzUGVyTGluZSsxKSpyK2EpfWZ1bmN0aW9uIGRlY29kZVNjYW4ocixhLGgsZCxwLG0sZyx5LGIpe3ZhciB2PWFyZ3VtZW50cy5sZW5ndGg+OSYmdm9pZCAwIT09YXJndW1lbnRzWzldJiZhcmd1bWVudHNbOV0sUz1oLm1jdXNQZXJMaW5lLGs9aC5wcm9ncmVzc2l2ZSx3PWEsQz0wLF89MDtmdW5jdGlvbiByZWFkQml0KCl7aWYoXz4wKXtfLS07cmV0dXJuIEM+Pl8mMX1pZigyNTU9PT0oQz1yW2ErK10pKXt2YXIgdD1yW2ErK107aWYodCl7aWYoMjIwPT09dCYmdil7YSs9Mjt2YXIgaT0oMCxvLnJlYWRVaW50MTYpKHIsYSk7YSs9MjtpZihpPjAmJmkhPT1oLnNjYW5MaW5lcyl0aHJvdyBuZXcgbCgiRm91bmQgRE5MIG1hcmtlciAoMHhGRkRDKSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIsaSl9ZWxzZSBpZigyMTc9PT10KXtpZih2KXt2YXIgZD1SKig4PT09aC5wcmVjaXNpb24/ODowKTtpZihkPjAmJk1hdGgucm91bmQoaC5zY2FuTGluZXMvZCk+PTEwKXRocm93IG5ldyBsKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhLCBwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsZCl9dGhyb3cgbmV3IHUoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiKX10aHJvdyBuZXcgYygidW5leHBlY3RlZCBtYXJrZXIgIi5jb25jYXQoKEM8PDh8dCkudG9TdHJpbmcoMTYpKSl9fV89NztyZXR1cm4gQz4+Pjd9ZnVuY3Rpb24gZGVjb2RlSHVmZm1hbih0KXtmb3IodmFyIHI9dDs7KXtzd2l0Y2goX3R5cGVvZihyPXJbcmVhZEJpdCgpXSkpe2Nhc2UibnVtYmVyIjpyZXR1cm4gcjtjYXNlIm9iamVjdCI6Y29udGludWV9dGhyb3cgbmV3IGMoImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZSIpfX1mdW5jdGlvbiByZWNlaXZlKHQpe2Zvcih2YXIgcj0wO3Q+MDspe3I9cjw8MXxyZWFkQml0KCk7dC0tfXJldHVybiByfWZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQodCl7aWYoMT09PXQpcmV0dXJuIDE9PT1yZWFkQml0KCk/MTotMTt2YXIgcj1yZWNlaXZlKHQpO3JldHVybiByPj0xPDx0LTE/cjpyKygtMTw8dCkrMX1mdW5jdGlvbiBkZWNvZGVCYXNlbGluZShyLGEpe3ZhciBpPWRlY29kZUh1ZmZtYW4oci5odWZmbWFuVGFibGVEQyksbz0wPT09aT8wOnJlY2VpdmVBbmRFeHRlbmQoaSk7ci5ibG9ja0RhdGFbYV09ci5wcmVkKz1vO2Zvcih2YXIgYz0xO2M8NjQ7KXt2YXIgbD1kZWNvZGVIdWZmbWFuKHIuaHVmZm1hblRhYmxlQUMpLHU9MTUmbCxoPWw+PjQ7aWYoMCE9PXUpe3ZhciBkPXRbYys9aF07ci5ibG9ja0RhdGFbYStkXT1yZWNlaXZlQW5kRXh0ZW5kKHUpO2MrK31lbHNle2lmKGg8MTUpYnJlYWs7Yys9MTZ9fX1mdW5jdGlvbiBkZWNvZGVEQ0ZpcnN0KHQscil7dmFyIGE9ZGVjb2RlSHVmZm1hbih0Lmh1ZmZtYW5UYWJsZURDKSxpPTA9PT1hPzA6cmVjZWl2ZUFuZEV4dGVuZChhKTw8Yjt0LmJsb2NrRGF0YVtyXT10LnByZWQrPWl9ZnVuY3Rpb24gZGVjb2RlRENTdWNjZXNzaXZlKHQscil7dC5ibG9ja0RhdGFbcl18PXJlYWRCaXQoKTw8Yn12YXIgeD0wO2Z1bmN0aW9uIGRlY29kZUFDRmlyc3QocixhKXtpZih4PjApeC0tO2Vsc2UgZm9yKHZhciBpPW0sbz1nO2k8PW87KXt2YXIgYz1kZWNvZGVIdWZmbWFuKHIuaHVmZm1hblRhYmxlQUMpLGw9MTUmYyx1PWM+PjQ7aWYoMCE9PWwpe3ZhciBoPXRbaSs9dV07ci5ibG9ja0RhdGFbYStoXT1yZWNlaXZlQW5kRXh0ZW5kKGwpKigxPDxiKTtpKyt9ZWxzZXtpZih1PDE1KXt4PXJlY2VpdmUodSkrKDE8PHUpLTE7YnJlYWt9aSs9MTZ9fX12YXIgQSxUPTA7ZnVuY3Rpb24gZGVjb2RlQUNTdWNjZXNzaXZlKHIsYSl7Zm9yKHZhciBpLG8sbD1tLHU9ZyxoPTA7bDw9dTspe3ZhciBkPWErdFtsXSxwPXIuYmxvY2tEYXRhW2RdPDA/LTE6MTtzd2l0Y2goVCl7Y2FzZSAwOmg9KG89ZGVjb2RlSHVmZm1hbihyLmh1ZmZtYW5UYWJsZUFDKSk+PjQ7aWYoMD09PShpPTE1Jm8pKWlmKGg8MTUpe3g9cmVjZWl2ZShoKSsoMTw8aCk7VD00fWVsc2V7aD0xNjtUPTF9ZWxzZXtpZigxIT09aSl0aHJvdyBuZXcgYygiaW52YWxpZCBBQ24gZW5jb2RpbmciKTtBPXJlY2VpdmVBbmRFeHRlbmQoaSk7VD1oPzI6M31jb250aW51ZTtjYXNlIDE6Y2FzZSAyOnIuYmxvY2tEYXRhW2RdP3IuYmxvY2tEYXRhW2RdKz1wKihyZWFkQml0KCk8PGIpOjA9PT0tLWgmJihUPTI9PT1UPzM6MCk7YnJlYWs7Y2FzZSAzOmlmKHIuYmxvY2tEYXRhW2RdKXIuYmxvY2tEYXRhW2RdKz1wKihyZWFkQml0KCk8PGIpO2Vsc2V7ci5ibG9ja0RhdGFbZF09QTw8YjtUPTB9YnJlYWs7Y2FzZSA0OnIuYmxvY2tEYXRhW2RdJiYoci5ibG9ja0RhdGFbZF0rPXAqKHJlYWRCaXQoKTw8YikpfWwrK300PT09VCYmMD09PS0teCYmKFQ9MCl9dmFyIFI9MDtmdW5jdGlvbiBkZWNvZGVNY3UodCxyLGEsaSxvKXt2YXIgYz1hJVM7Uj0oYS9TfDApKnQuditpO3ZhciBsPWMqdC5oK287cih0LGdldEJsb2NrQnVmZmVyT2Zmc2V0KHQsUixsKSl9ZnVuY3Rpb24gZGVjb2RlQmxvY2sodCxyLGEpe1I9YS90LmJsb2Nrc1BlckxpbmV8MDt2YXIgaT1hJXQuYmxvY2tzUGVyTGluZTtyKHQsZ2V0QmxvY2tCdWZmZXJPZmZzZXQodCxSLGkpKX12YXIgSSxQLE8sRSxCLEQsTT1kLmxlbmd0aDtEPWs/MD09PW0/MD09PXk/ZGVjb2RlRENGaXJzdDpkZWNvZGVEQ1N1Y2Nlc3NpdmU6MD09PXk/ZGVjb2RlQUNGaXJzdDpkZWNvZGVBQ1N1Y2Nlc3NpdmU6ZGVjb2RlQmFzZWxpbmU7dmFyIEwsTixVLGoscT0wO049MT09PU0/ZFswXS5ibG9ja3NQZXJMaW5lKmRbMF0uYmxvY2tzUGVyQ29sdW1uOlMqaC5tY3VzUGVyQ29sdW1uO2Zvcig7cTw9Tjspe3ZhciBXPXA/TWF0aC5taW4oTi1xLHApOk47aWYoVz4wKXtmb3IoUD0wO1A8TTtQKyspZFtQXS5wcmVkPTA7eD0wO2lmKDE9PT1NKXtJPWRbMF07Zm9yKEI9MDtCPFc7QisrKXtkZWNvZGVCbG9jayhJLEQscSk7cSsrfX1lbHNlIGZvcihCPTA7QjxXO0IrKyl7Zm9yKFA9MDtQPE07UCsrKXtVPShJPWRbUF0pLmg7aj1JLnY7Zm9yKE89MDtPPGo7TysrKWZvcihFPTA7RTxVO0UrKylkZWNvZGVNY3UoSSxELHEsTyxFKX1xKyt9fV89MDtpZighKEw9ZmluZE5leHRGaWxlTWFya2VyKHIsYSkpKWJyZWFrO2lmKEwuaW52YWxpZCl7dmFyIHo9Vz4wPyJ1bmV4cGVjdGVkIjoiZXhjZXNzaXZlIjsoMCxpLndhcm4pKCJkZWNvZGVTY2FuIC0gIi5jb25jYXQoeiwiIE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIikuY29uY2F0KEwuaW52YWxpZCkpO2E9TC5vZmZzZXR9aWYoIShMLm1hcmtlcj49NjU0ODgmJkwubWFya2VyPD02NTQ5NSkpYnJlYWs7YSs9Mn1yZXR1cm4gYS13fWZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZSh0LHIsYSl7dmFyIGksbyxsLHUsaCxkLHAsbSxnLHksYix2LFMsayx3LEMsXyx4PXQucXVhbnRpemF0aW9uVGFibGUsQT10LmJsb2NrRGF0YTtpZigheCl0aHJvdyBuZXcgYygibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuIik7Zm9yKHZhciBUPTA7VDw2NDtUKz04KXtnPUFbcitUXTt5PUFbcitUKzFdO2I9QVtyK1QrMl07dj1BW3IrVCszXTtTPUFbcitUKzRdO2s9QVtyK1QrNV07dz1BW3IrVCs2XTtDPUFbcitUKzddO2cqPXhbVF07aWYoMCE9KHl8Ynx2fFN8a3x3fEMpKXt5Kj14W1QrMV07Yio9eFtUKzJdO3YqPXhbVCszXTtTKj14W1QrNF07ayo9eFtUKzVdO289KGk9KGk9NTc5MypnKzEyOD4+OCkrKG89NTc5MypTKzEyOD4+OCkrMT4+MSktbztfPTM3ODQqKGw9YikrMTU2NyoodT13Kj14W1QrNl0pKzEyOD4+ODtsPTE1NjcqbC0zNzg0KnUrMTI4Pj44O3A9KGg9KGg9Mjg5NiooeS0oQyo9eFtUKzddKSkrMTI4Pj44KSsocD1rPDw0KSsxPj4xKS1wO2Q9KG09KG09Mjg5NiooeStDKSsxMjg+PjgpKyhkPXY8PDQpKzE+PjEpLWQ7dT0oaT1pKyh1PV8pKzE+PjEpLXU7bD0obz1vK2wrMT4+MSktbDtfPTIyNzYqaCszNDA2Km0rMjA0OD4+MTI7aD0zNDA2KmgtMjI3NiptKzIwNDg+PjEyO209XztfPTc5OSpkKzQwMTcqcCsyMDQ4Pj4xMjtkPTQwMTcqZC03OTkqcCsyMDQ4Pj4xMjtwPV87YVtUXT1pK207YVtUKzddPWktbTthW1QrMV09bytwO2FbVCs2XT1vLXA7YVtUKzJdPWwrZDthW1QrNV09bC1kO2FbVCszXT11K2g7YVtUKzRdPXUtaH1lbHNle189NTc5MypnKzUxMj4+MTA7YVtUXT1fO2FbVCsxXT1fO2FbVCsyXT1fO2FbVCszXT1fO2FbVCs0XT1fO2FbVCs1XT1fO2FbVCs2XT1fO2FbVCs3XT1ffX1mb3IodmFyIFI9MDtSPDg7KytSKXtnPWFbUl07aWYoMCE9KCh5PWFbUis4XSl8KGI9YVtSKzE2XSl8KHY9YVtSKzI0XSl8KFM9YVtSKzMyXSl8KGs9YVtSKzQwXSl8KHc9YVtSKzQ4XSl8KEM9YVtSKzU2XSkpKXtvPShpPTQxMTIrKChpPTU3OTMqZysyMDQ4Pj4xMikrKG89NTc5MypTKzIwNDg+PjEyKSsxPj4xKSktbztfPTM3ODQqKGw9YikrMTU2NyoodT13KSsyMDQ4Pj4xMjtsPTE1NjcqbC0zNzg0KnUrMjA0OD4+MTI7dT1fO3A9KGg9KGg9Mjg5NiooeS1DKSsyMDQ4Pj4xMikrKHA9aykrMT4+MSktcDtkPShtPShtPTI4OTYqKHkrQykrMjA0OD4+MTIpKyhkPXYpKzE+PjEpLWQ7Xz0yMjc2KmgrMzQwNiptKzIwNDg+PjEyO2g9MzQwNipoLTIyNzYqbSsyMDQ4Pj4xMjttPV87Xz03OTkqZCs0MDE3KnArMjA0OD4+MTI7ZD00MDE3KmQtNzk5KnArMjA0OD4+MTI7KGc9KGk9aSt1KzE+PjEpK20pPDE2P2c9MDpnPj00MDgwP2c9MjU1Omc+Pj00Oyh5PShvPW8rbCsxPj4xKSsocD1fKSk8MTY/eT0wOnk+PTQwODA/eT0yNTU6eT4+PTQ7KGI9KGw9by1sKStkKTwxNj9iPTA6Yj49NDA4MD9iPTI1NTpiPj49NDsodj0odT1pLXUpK2gpPDE2P3Y9MDp2Pj00MDgwP3Y9MjU1OnY+Pj00OyhTPXUtaCk8MTY/Uz0wOlM+PTQwODA/Uz0yNTU6Uz4+PTQ7KGs9bC1kKTwxNj9rPTA6az49NDA4MD9rPTI1NTprPj49NDsodz1vLXApPDE2P3c9MDp3Pj00MDgwP3c9MjU1Onc+Pj00OyhDPWktbSk8MTY/Qz0wOkM+PTQwODA/Qz0yNTU6Qz4+PTQ7QVtyK1JdPWc7QVtyK1IrOF09eTtBW3IrUisxNl09YjtBW3IrUisyNF09djtBW3IrUiszMl09UztBW3IrUis0MF09aztBW3IrUis0OF09dztBW3IrUis1Nl09Q31lbHNle189KF89NTc5MypnKzgxOTI+PjE0KTwtMjA0MD8wOl8+PTIwMjQ/MjU1Ol8rMjA1Nj4+NDtBW3IrUl09XztBW3IrUis4XT1fO0FbcitSKzE2XT1fO0FbcitSKzI0XT1fO0FbcitSKzMyXT1fO0FbcitSKzQwXT1fO0FbcitSKzQ4XT1fO0FbcitSKzU2XT1ffX19ZnVuY3Rpb24gYnVpbGRDb21wb25lbnREYXRhKHQscil7Zm9yKHZhciBhPXIuYmxvY2tzUGVyTGluZSxpPXIuYmxvY2tzUGVyQ29sdW1uLG89bmV3IEludDE2QXJyYXkoNjQpLGM9MDtjPGk7YysrKWZvcih2YXIgbD0wO2w8YTtsKyspe3F1YW50aXplQW5kSW52ZXJzZShyLGdldEJsb2NrQnVmZmVyT2Zmc2V0KHIsYyxsKSxvKX1yZXR1cm4gci5ibG9ja0RhdGF9ZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKHQscil7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnIsaT10Lmxlbmd0aC0xLGM9YTxyP2E6cjtpZihyPj1pKXJldHVybiBudWxsO3ZhciBsPSgwLG8ucmVhZFVpbnQxNikodCxyKTtpZihsPj02NTQ3MiYmbDw9NjU1MzQpcmV0dXJue2ludmFsaWQ6bnVsbCxtYXJrZXI6bCxvZmZzZXQ6cn07Zm9yKHZhciB1PSgwLG8ucmVhZFVpbnQxNikodCxjKTshKHU+PTY1NDcyJiZ1PD02NTUzNCk7KXtpZigrK2M+PWkpcmV0dXJuIG51bGw7dT0oMCxvLnJlYWRVaW50MTYpKHQsYyl9cmV0dXJue2ludmFsaWQ6bC50b1N0cmluZygxNiksbWFya2VyOnUsb2Zmc2V0OmN9fUpwZWdJbWFnZS5wcm90b3R5cGU9e3BhcnNlOmZ1bmN0aW9uIHBhcnNlKHIpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxoPWEuZG5sU2NhbkxpbmVzLGQ9dm9pZCAwPT09aD9udWxsOmg7ZnVuY3Rpb24gcmVhZERhdGFCbG9jaygpe3ZhciB0PSgwLG8ucmVhZFVpbnQxNikocixnKSxhPShnKz0yKSt0LTIsYz1maW5kTmV4dEZpbGVNYXJrZXIocixhLGcpO2lmKGMmJmMuaW52YWxpZCl7KDAsaS53YXJuKSgicmVhZERhdGFCbG9jayAtIGluY29ycmVjdCBsZW5ndGgsIGN1cnJlbnQgbWFya2VyIGlzOiAiK2MuaW52YWxpZCk7YT1jLm9mZnNldH12YXIgbD1yLnN1YmFycmF5KGcsYSk7Zys9bC5sZW5ndGg7cmV0dXJuIGx9ZnVuY3Rpb24gcHJlcGFyZUNvbXBvbmVudHModCl7Zm9yKHZhciByPU1hdGguY2VpbCh0LnNhbXBsZXNQZXJMaW5lLzgvdC5tYXhIKSxhPU1hdGguY2VpbCh0LnNjYW5MaW5lcy84L3QubWF4ViksaT0wO2k8dC5jb21wb25lbnRzLmxlbmd0aDtpKyspe1g9dC5jb21wb25lbnRzW2ldO3ZhciBvPU1hdGguY2VpbChNYXRoLmNlaWwodC5zYW1wbGVzUGVyTGluZS84KSpYLmgvdC5tYXhIKSxjPU1hdGguY2VpbChNYXRoLmNlaWwodC5zY2FuTGluZXMvOCkqWC52L3QubWF4ViksbD1yKlguaCx1PTY0KihhKlgudikqKGwrMSk7WC5ibG9ja0RhdGE9bmV3IEludDE2QXJyYXkodSk7WC5ibG9ja3NQZXJMaW5lPW87WC5ibG9ja3NQZXJDb2x1bW49Y310Lm1jdXNQZXJMaW5lPXI7dC5tY3VzUGVyQ29sdW1uPWF9dmFyIHAsbSxnPTAseT1udWxsLGI9bnVsbCx2PTAsUz1bXSxrPVtdLHc9W10sQz0oMCxvLnJlYWRVaW50MTYpKHIsZyk7Zys9MjtpZig2NTQ5NiE9PUMpdGhyb3cgbmV3IGMoIlNPSSBub3QgZm91bmQiKTtDPSgwLG8ucmVhZFVpbnQxNikocixnKTtnKz0yO2U6Zm9yKDs2NTQ5NyE9PUM7KXt2YXIgXyx4LEE7c3dpdGNoKEMpe2Nhc2UgNjU1MDQ6Y2FzZSA2NTUwNTpjYXNlIDY1NTA2OmNhc2UgNjU1MDc6Y2FzZSA2NTUwODpjYXNlIDY1NTA5OmNhc2UgNjU1MTA6Y2FzZSA2NTUxMTpjYXNlIDY1NTEyOmNhc2UgNjU1MTM6Y2FzZSA2NTUxNDpjYXNlIDY1NTE1OmNhc2UgNjU1MTY6Y2FzZSA2NTUxNzpjYXNlIDY1NTE4OmNhc2UgNjU1MTk6Y2FzZSA2NTUzNDp2YXIgVD1yZWFkRGF0YUJsb2NrKCk7NjU1MDQ9PT1DJiY3ND09PVRbMF0mJjcwPT09VFsxXSYmNzM9PT1UWzJdJiY3MD09PVRbM10mJjA9PT1UWzRdJiYoeT17dmVyc2lvbjp7bWFqb3I6VFs1XSxtaW5vcjpUWzZdfSxkZW5zaXR5VW5pdHM6VFs3XSx4RGVuc2l0eTpUWzhdPDw4fFRbOV0seURlbnNpdHk6VFsxMF08PDh8VFsxMV0sdGh1bWJXaWR0aDpUWzEyXSx0aHVtYkhlaWdodDpUWzEzXSx0aHVtYkRhdGE6VC5zdWJhcnJheSgxNCwxNCszKlRbMTJdKlRbMTNdKX0pOzY1NTE4PT09QyYmNjU9PT1UWzBdJiYxMDA9PT1UWzFdJiYxMTE9PT1UWzJdJiY5OD09PVRbM10mJjEwMT09PVRbNF0mJihiPXt2ZXJzaW9uOlRbNV08PDh8VFs2XSxmbGFnczA6VFs3XTw8OHxUWzhdLGZsYWdzMTpUWzldPDw4fFRbMTBdLHRyYW5zZm9ybUNvZGU6VFsxMV19KTticmVhaztjYXNlIDY1NDk5OmZvcih2YXIgUj0oMCxvLnJlYWRVaW50MTYpKHIsZyksST1SKyhnKz0yKS0yO2c8STspe3ZhciBQPXJbZysrXSxPPW5ldyBVaW50MTZBcnJheSg2NCk7aWYoUD4+ND09MClmb3IoeD0wO3g8NjQ7eCsrKU9bdFt4XV09cltnKytdO2Vsc2V7aWYoUD4+NCE9MSl0aHJvdyBuZXcgYygiRFFUIC0gaW52YWxpZCB0YWJsZSBzcGVjIik7Zm9yKHg9MDt4PDY0O3grKyl7T1t0W3hdXT0oMCxvLnJlYWRVaW50MTYpKHIsZyk7Zys9Mn19U1sxNSZQXT1PfWJyZWFrO2Nhc2UgNjU0NzI6Y2FzZSA2NTQ3MzpjYXNlIDY1NDc0OmlmKHApdGhyb3cgbmV3IGMoIk9ubHkgc2luZ2xlIGZyYW1lIEpQRUdzIHN1cHBvcnRlZCIpO2crPTI7KHA9e30pLmV4dGVuZGVkPTY1NDczPT09QztwLnByb2dyZXNzaXZlPTY1NDc0PT09QztwLnByZWNpc2lvbj1yW2crK107dmFyIEU9KDAsby5yZWFkVWludDE2KShyLGcpO2crPTI7cC5zY2FuTGluZXM9ZHx8RTtwLnNhbXBsZXNQZXJMaW5lPSgwLG8ucmVhZFVpbnQxNikocixnKTtnKz0yO3AuY29tcG9uZW50cz1bXTtwLmNvbXBvbmVudElkcz17fTt2YXIgQixEPXJbZysrXSxNPTAsTD0wO2ZvcihfPTA7XzxEO18rKyl7Qj1yW2ddO3ZhciBOPXJbZysxXT4+NCxVPTE1JnJbZysxXTtNPE4mJihNPU4pO0w8VSYmKEw9VSk7dmFyIGo9cltnKzJdO0E9cC5jb21wb25lbnRzLnB1c2goe2g6Tix2OlUscXVhbnRpemF0aW9uSWQ6aixxdWFudGl6YXRpb25UYWJsZTpudWxsfSk7cC5jb21wb25lbnRJZHNbQl09QS0xO2crPTN9cC5tYXhIPU07cC5tYXhWPUw7cHJlcGFyZUNvbXBvbmVudHMocCk7YnJlYWs7Y2FzZSA2NTQ3Njp2YXIgcT0oMCxvLnJlYWRVaW50MTYpKHIsZyk7Zys9Mjtmb3IoXz0yO188cTspe3ZhciBXPXJbZysrXSx6PW5ldyBVaW50OEFycmF5KDE2KSxHPTA7Zm9yKHg9MDt4PDE2O3grKyxnKyspRys9elt4XT1yW2ddO3ZhciBIPW5ldyBVaW50OEFycmF5KEcpO2Zvcih4PTA7eDxHO3grKyxnKyspSFt4XT1yW2ddO18rPTE3K0c7KFc+PjQ9PTA/dzprKVsxNSZXXT1idWlsZEh1ZmZtYW5UYWJsZSh6LEgpfWJyZWFrO2Nhc2UgNjU1MDE6Zys9MjttPSgwLG8ucmVhZFVpbnQxNikocixnKTtnKz0yO2JyZWFrO2Nhc2UgNjU0OTg6dmFyIFY9MT09Kyt2JiYhZDtnKz0yO3ZhciBYLFk9cltnKytdLEs9W107Zm9yKF89MDtfPFk7XysrKXt2YXIgSj1yW2crK10sWj1wLmNvbXBvbmVudElkc1tKXTsoWD1wLmNvbXBvbmVudHNbWl0pLmluZGV4PUo7dmFyIFE9cltnKytdO1guaHVmZm1hblRhYmxlREM9d1tRPj40XTtYLmh1ZmZtYW5UYWJsZUFDPWtbMTUmUV07Sy5wdXNoKFgpfXZhciAkPXJbZysrXSxlZT1yW2crK10sdGU9cltnKytdO3RyeXt2YXIgcmU9ZGVjb2RlU2NhbihyLGcscCxLLG0sJCxlZSx0ZT4+NCwxNSZ0ZSxWKTtnKz1yZX1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgbCl7KDAsaS53YXJuKSgiIi5jb25jYXQodC5tZXNzYWdlLCIgLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS4iKSk7cmV0dXJuIHRoaXMucGFyc2Uocix7ZG5sU2NhbkxpbmVzOnQuc2NhbkxpbmVzfSl9aWYodCBpbnN0YW5jZW9mIHUpeygwLGkud2FybikoIiIuY29uY2F0KHQubWVzc2FnZSwiIC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLiIpKTticmVhayBlfXRocm93IHR9YnJlYWs7Y2FzZSA2NTUwMDpnKz00O2JyZWFrO2Nhc2UgNjU1MzU6MjU1IT09cltnXSYmZy0tO2JyZWFrO2RlZmF1bHQ6dmFyIGFlPWZpbmROZXh0RmlsZU1hcmtlcihyLGctMixnLTMpO2lmKGFlJiZhZS5pbnZhbGlkKXsoMCxpLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAiK2FlLmludmFsaWQpO2c9YWUub2Zmc2V0O2JyZWFrfWlmKGc+PXIubGVuZ3RoLTEpeygwLGkud2FybikoIkpwZWdJbWFnZS5wYXJzZSAtIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UgZGF0YSB3aXRob3V0IGZpbmRpbmcgYW4gRU9JIG1hcmtlciAoMHhGRkQ5KS4iKTticmVhayBlfXRocm93IG5ldyBjKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmtub3duIG1hcmtlcjogIitDLnRvU3RyaW5nKDE2KSl9Qz0oMCxvLnJlYWRVaW50MTYpKHIsZyk7Zys9Mn10aGlzLndpZHRoPXAuc2FtcGxlc1BlckxpbmU7dGhpcy5oZWlnaHQ9cC5zY2FuTGluZXM7dGhpcy5qZmlmPXk7dGhpcy5hZG9iZT1iO3RoaXMuY29tcG9uZW50cz1bXTtmb3IoXz0wO188cC5jb21wb25lbnRzLmxlbmd0aDtfKyspe3ZhciBuZT1TWyhYPXAuY29tcG9uZW50c1tfXSkucXVhbnRpemF0aW9uSWRdO25lJiYoWC5xdWFudGl6YXRpb25UYWJsZT1uZSk7dGhpcy5jb21wb25lbnRzLnB1c2goe2luZGV4OlguaW5kZXgsb3V0cHV0OmJ1aWxkQ29tcG9uZW50RGF0YSgwLFgpLHNjYWxlWDpYLmgvcC5tYXhILHNjYWxlWTpYLnYvcC5tYXhWLGJsb2Nrc1BlckxpbmU6WC5ibG9ja3NQZXJMaW5lLGJsb2Nrc1BlckNvbHVtbjpYLmJsb2Nrc1BlckNvbHVtbn0pfXRoaXMubnVtQ29tcG9uZW50cz10aGlzLmNvbXBvbmVudHMubGVuZ3RofSxfZ2V0TGluZWFyaXplZEJsb2NrRGF0YTpmdW5jdGlvbiBfZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh0LHIpe3ZhciBhLGksbyxjLGwsdSxoLGQscCxtLGcseSxiPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0sdj10aGlzLndpZHRoL3QsUz10aGlzLmhlaWdodC9yLGs9MCx3PXRoaXMuY29tcG9uZW50cy5sZW5ndGgsQz10KnIqdyxfPW5ldyBVaW50OENsYW1wZWRBcnJheShDKSx4PW5ldyBVaW50MzJBcnJheSh0KSxBPTQyOTQ5NjcyODg7Zm9yKGg9MDtoPHc7aCsrKXtpPShhPXRoaXMuY29tcG9uZW50c1toXSkuc2NhbGVYKnY7bz1hLnNjYWxlWSpTO2s9aDtnPWEub3V0cHV0O2M9YS5ibG9ja3NQZXJMaW5lKzE8PDM7aWYoaSE9PXkpe2ZvcihsPTA7bDx0O2wrKyl7ZD0wfGwqaTt4W2xdPShkJkEpPDwzfDcmZH15PWl9Zm9yKHU9MDt1PHI7dSsrKXttPWMqKChkPTB8dSpvKSZBKXwoNyZkKTw8Mztmb3IobD0wO2w8dDtsKyspe19ba109Z1ttK3hbbF1dO2srPXd9fX12YXIgVD10aGlzLl9kZWNvZGVUcmFuc2Zvcm07Ynx8NCE9PXd8fFR8fChUPW5ldyBJbnQzMkFycmF5KFstMjU2LDI1NSwtMjU2LDI1NSwtMjU2LDI1NSwtMjU2LDI1NV0pKTtpZihUKWZvcihoPTA7aDxDOylmb3IoZD0wLHA9MDtkPHc7ZCsrLGgrKyxwKz0yKV9baF09KF9baF0qVFtwXT4+OCkrVFtwKzFdO3JldHVybiBffSxnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCl7cmV0dXJuIHRoaXMuYWRvYmU/ISF0aGlzLmFkb2JlLnRyYW5zZm9ybUNvZGU6Mz09PXRoaXMubnVtQ29tcG9uZW50cz8wIT09dGhpcy5fY29sb3JUcmFuc2Zvcm0mJig4MiE9PXRoaXMuY29tcG9uZW50c1swXS5pbmRleHx8NzEhPT10aGlzLmNvbXBvbmVudHNbMV0uaW5kZXh8fDY2IT09dGhpcy5jb21wb25lbnRzWzJdLmluZGV4KToxPT09dGhpcy5fY29sb3JUcmFuc2Zvcm19LF9jb252ZXJ0WWNjVG9SZ2I6ZnVuY3Rpb24gY29udmVydFljY1RvUmdiKHQpe2Zvcih2YXIgcixhLGksbz0wLGM9dC5sZW5ndGg7bzxjO28rPTMpe3I9dFtvXTthPXRbbysxXTtpPXRbbysyXTt0W29dPXItMTc5LjQ1NisxLjQwMippO3RbbysxXT1yKzEzNS40NTktLjM0NCphLS43MTQqaTt0W28rMl09ci0yMjYuODE2KzEuNzcyKmF9cmV0dXJuIHR9LF9jb252ZXJ0WWNja1RvUmdiOmZ1bmN0aW9uIGNvbnZlcnRZY2NrVG9SZ2IodCl7Zm9yKHZhciByLGEsaSxvLGM9MCxsPTAsdT10Lmxlbmd0aDtsPHU7bCs9NCl7cj10W2xdO2E9dFtsKzFdO2k9dFtsKzJdO289dFtsKzNdO3RbYysrXT1hKigtNjYwNjM1NjY5NDIwMzY0ZS0xOSphKy4wMDA0MzcxMzA0NzU5MjYyMzIqaS01NDA4MDYxMDA2NDU5OWUtMTgqcisuMDAwNDg0NDk3OTcxMjAyODEqby0uMTU0MzYyMTUxODcxMTI2KS0xMjIuNjcxOTU0MDY4OTQraSooLS4wMDA5NTc5NjQzNzg0NDU3NzMqaSsuMDAwODE3MDc2OTExMzQ2NjI1KnItLjAwNDc3MjcxNDA1NDA4NzQ3Km8rMS41MzM4MDI1MzIyMTczNCkrciooLjAwMDk2MTI1MDE4NDEzMDY4OCpyLS4wMDI2NjI1NzMzMjI4MzkzMypvKy40ODM1NzA4ODQ1MTI2NSkrbyooLS4wMDAzMzYxOTcxNzc2MTgzOTQqbysuNDg0NzkxNTYxNDkwNzc2KTt0W2MrK109MTA3LjI2ODAzOTM5NzcyNCthKigyMTk5MjcxMDQ1MjU3NDFlLTE5KmEtLjAwMDY0MDk5MjAxODI5Nzk0NSppKy4wMDA2NTkzOTcwMDEyNDU1NzcqcisuMDAwNDI2MTA1NjUyOTM4ODM3Km8tLjE3NjQ5MTc5MjQ2Mjg3NSkraSooLS4wMDA3NzgyNjk5NDE1MTM2ODMqaSsuMDAxMzA4NzIyNjE0MDgyNzUqcisuMDAwNzcwNDgyNjMxODAxMTMyKm8tLjE1MTA1MTQ5Mjc3NTU2MikrciooLjAwMTI2OTM1MzY4MTE0ODQzKnItLjAwMjY1MDkwMTg5MDEwODk4Km8rLjI1ODAyOTEwMjA2ODQ1KStvKigtLjAwMDMxODkxMzExNzU4ODMyOCpvLS4yMTM3NDI0MDAzMjM2NjUpO3RbYysrXT1hKigtLjAwMDU3MDExNTE5Njk3MzY3NyphLTI2MzQwOTA1MTAwNDU4OWUtMTkqaSsuMDAyMDc0MTA4ODExNTAxMipyLS4wMDI4ODI2MDIzNjg1MzQ0MipvKy44MTQyNzI5NjgzNTkyOTUpLTIwLjgxMDAxMjU0Njk0NytpKigtMTUzNDk2MDU3NDQwOTc1ZS0xOSppLS4wMDAxMzI2ODkwNDM5NjE0NDYqcisuMDAwNTYwODMzNjkxMjQyODEyKm8tLjE5NTE1MjAyNzUzNDA0OSkrciooLjAwMTc0NDE4MTMyOTI3NTgyKnItLjAwMjU1MjQzMzIxNDM5MzQ3Km8rLjExNjkzNTAyMDQ2NTE0NSkrbyooLS4wMDAzNDM1MzE5OTY1MTA1NTUqbysuMjQxNjUyNjAyMzI0MDcpfXJldHVybiB0LnN1YmFycmF5KDAsYyl9LF9jb252ZXJ0WWNja1RvQ215azpmdW5jdGlvbiBjb252ZXJ0WWNja1RvQ215ayh0KXtmb3IodmFyIHIsYSxpLG89MCxjPXQubGVuZ3RoO288YztvKz00KXtyPXRbb107YT10W28rMV07aT10W28rMl07dFtvXT00MzQuNDU2LXItMS40MDIqaTt0W28rMV09MTE5LjU0MS1yKy4zNDQqYSsuNzE0Kmk7dFtvKzJdPTQ4MS44MTYtci0xLjc3MiphfXJldHVybiB0fSxfY29udmVydENteWtUb1JnYjpmdW5jdGlvbiBjb252ZXJ0Q215a1RvUmdiKHQpe2Zvcih2YXIgcixhLGksbyxjPTAsbD0wLHU9dC5sZW5ndGg7bDx1O2wrPTQpe3I9dFtsXTthPXRbbCsxXTtpPXRbbCsyXTtvPXRbbCszXTt0W2MrK109MjU1K3IqKC02NzQ3MTQ3MDczNjAyNDQxZS0yMCpyKy4wMDA4Mzc5MjYyMTIxMDEzNzI3KmErLjAwMDI4OTQ3MTgxODg2NDMyOTQqaSsuMDAzMjY0MjMxMDU3NTM3ODA2Km8tMS4xMTg1NjExODY3MjAzOTM3KSthKigyNjM3NDEwNzYxNjA4OTQwNWUtMjEqYS04NjI2OTQ5MTU4NjM4NTcyZS0yMCppLS4wMDAyNzQ4NzY5MDY3NDk5NDkxKm8tLjAyMTU1Njg4Nzk0OTc4OTY3KStpKigtMzg3ODA5OTIxMjg2OTM2M2UtMjAqaS0uMDAwMzI2NzgwODI3OTQ4NTI4NipvKy4wNjg2NzQyMjM4NTk1MzQ1KS1vKiguMDAwMzM2MTk3MTc3NjE4MzkzNypvKy43NDMwNjU5MTUxMzQyMjU0KTt0W2MrK109MjU1K3IqKC4wMDAxMzU5NjM3MjgxMzU4ODg0OCpyKy4wMDA5MjQ1MzcxMzI1NzM1ODUqYSsuMDAwMTA1NjczNTk2MTg2ODM1OTMqaSsuMDAwNDc5MTg2NDY4NzQzNjUxMipvLS4zMTA5Njg5NTg3NTE1ODc1KSthKigtLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0KmErLjAwMDI3MDI4NDUyNTM1MzQ3MTQqaSsuMDAyMDIwMDMwODk3NzMwNzE1NipvLS43NDg4MDUyMTY3MDE1NDk0KStpKig2ODM0ODE1OTk4MjM1NjYyZS0yMCppKy4wMDAxNTE2ODQ1MjM2MzQ2MDk3MypvLS4wOTc1MTkyNzc3NDcyODkzMyktbyooLjAwMDMxODkxMzExNzU4ODMyODEqbysuNzM2NDg4MzgwNzczMzE2OCk7dFtjKytdPTI1NStyKigxMzU5ODY1MDQxMTM4NTMwN2UtMjEqcisuMDAwMTI0MjM5NTYxNzU0OTA4NTEqYSsuMDAwNDc1MTk4NTA5NzU4MzU4OSppLTM2NzI5MzE3NDc2NjMwNDIyZS0yMipvLS4wNTU2MjE4Njk4MDI2NDAzNCkrYSooLjAwMDE2MTQxMzgwNTk4NzI0Njc2KmErLjAwMDk2OTIyMzkxMzA3MjUxODYqaSsuMDAwNzc4MjY5MjQ1MDAzNjI1MypvLS40NDAxNTIzMjM2NzUyNjQ2MykraSooNS4wNjg4ODI5MTQwNjg3NjllLTcqaSsuMDAxNzc3ODM2OTAxMTM3NTA3MSpvLS43NTkxNDU0NjQ5NzQ5NjA5KS1vKiguMDAwMzQzNTMxOTk2NTEwNTU1MypvKy43MDYzNzcwMTg2MTYwMTQ0KX1yZXR1cm4gdC5zdWJhcnJheSgwLGMpfSxnZXREYXRhOmZ1bmN0aW9uIGdldERhdGEodCl7dmFyIHI9dC53aWR0aCxhPXQuaGVpZ2h0LGk9dC5mb3JjZVJHQixvPXZvaWQgMCE9PWkmJmksbD10LmlzU291cmNlUERGLHU9dm9pZCAwIT09bCYmbDtpZih0aGlzLm51bUNvbXBvbmVudHM+NCl0aHJvdyBuZXcgYygiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZSIpO3ZhciBoPXRoaXMuX2dldExpbmVhcml6ZWRCbG9ja0RhdGEocixhLHUpO2lmKDE9PT10aGlzLm51bUNvbXBvbmVudHMmJm8pe2Zvcih2YXIgZD1oLmxlbmd0aCxwPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKmQpLG09MCxnPTA7ZzxkO2crKyl7dmFyIHk9aFtnXTtwW20rK109eTtwW20rK109eTtwW20rK109eX1yZXR1cm4gcH1pZigzPT09dGhpcy5udW1Db21wb25lbnRzJiZ0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZClyZXR1cm4gdGhpcy5fY29udmVydFljY1RvUmdiKGgpO2lmKDQ9PT10aGlzLm51bUNvbXBvbmVudHMpe2lmKHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKXJldHVybiBvP3RoaXMuX2NvbnZlcnRZY2NrVG9SZ2IoaCk6dGhpcy5fY29udmVydFljY2tUb0NteWsoaCk7aWYobylyZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYihoKX1yZXR1cm4gaH19O3JldHVybiBKcGVnSW1hZ2V9KCk7ci5KcGVnSW1hZ2U9aH0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5KcHhTdHJlYW09dm9pZCAwO3ZhciBpPWEoMjA5KSxvPWEoMjE4KSxjPWEoNSksbD1mdW5jdGlvbiBKcHhTdHJlYW1DbG9zdXJlKCl7ZnVuY3Rpb24gSnB4U3RyZWFtKHQscixhLG8pe3RoaXMuc3RyZWFtPXQ7dGhpcy5tYXliZUxlbmd0aD1yO3RoaXMuZGljdD1hO3RoaXMucGFyYW1zPW87aS5EZWNvZGVTdHJlYW0uY2FsbCh0aGlzLHIpfUpweFN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShpLkRlY29kZVN0cmVhbS5wcm90b3R5cGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShKcHhTdHJlYW0ucHJvdG90eXBlLCJieXRlcyIse2dldDpmdW5jdGlvbiBKcHhTdHJlYW1fYnl0ZXMoKXtyZXR1cm4oMCxjLnNoYWRvdykodGhpcywiYnl0ZXMiLHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKX0sY29uZmlndXJhYmxlOiEwfSk7SnB4U3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXI9ZnVuY3Rpb24odCl7fTtKcHhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jaz1mdW5jdGlvbigpe2lmKCF0aGlzLmVvZil7dmFyIHQ9bmV3IG8uSnB4SW1hZ2U7dC5wYXJzZSh0aGlzLmJ5dGVzKTt2YXIgcj10LndpZHRoLGE9dC5oZWlnaHQsaT10LmNvbXBvbmVudHNDb3VudCxjPXQudGlsZXMubGVuZ3RoO2lmKDE9PT1jKXRoaXMuYnVmZmVyPXQudGlsZXNbMF0uaXRlbXM7ZWxzZXtmb3IodmFyIGw9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHIqYSppKSx1PTA7dTxjO3UrKylmb3IodmFyIGg9dC50aWxlc1t1XSxkPWgud2lkdGgscD1oLmhlaWdodCxtPWgubGVmdCxnPWgudG9wLHk9aC5pdGVtcyxiPTAsdj0ocipnK20pKmksUz1yKmksaz1kKmksdz0wO3c8cDt3Kyspe3ZhciBDPXkuc3ViYXJyYXkoYixiK2spO2wuc2V0KEMsdik7Yis9azt2Kz1TfXRoaXMuYnVmZmVyPWx9dGhpcy5idWZmZXJMZW5ndGg9dGhpcy5idWZmZXIubGVuZ3RoO3RoaXMuZW9mPSEwfX07cmV0dXJuIEpweFN0cmVhbX0oKTtyLkpweFN0cmVhbT1sfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLkpweEltYWdlPXZvaWQgMDt2YXIgaT1hKDUpLG89YSgyMDUpLGM9YSgyMTQpO2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX12YXIgbD1mdW5jdGlvbih0KXshZnVuY3Rpb24gX2luaGVyaXRzKHQscil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHImJm51bGwhPT1yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyJiZyLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pO3ImJl9zZXRQcm90b3R5cGVPZih0LHIpfShKcHhFcnJvcix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoSnB4RXJyb3IpO2Z1bmN0aW9uIEpweEVycm9yKHQpeyFmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxKcHhFcnJvcik7cmV0dXJuIHIuY2FsbCh0aGlzLCJKUFggZXJyb3I6ICIuY29uY2F0KHQpKX1yZXR1cm4gSnB4RXJyb3J9KGkuQmFzZUV4Y2VwdGlvbiksdT1mdW5jdGlvbiBKcHhJbWFnZUNsb3N1cmUoKXt2YXIgdD17TEw6MCxMSDoxLEhMOjEsSEg6Mn07ZnVuY3Rpb24gSnB4SW1hZ2UoKXt0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlPSExfUpweEltYWdlLnByb3RvdHlwZT17cGFyc2U6ZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2UodCl7aWYoNjUzNTkhPT0oMCxvLnJlYWRVaW50MTYpKHQsMCkpZm9yKHZhciByPTAsYT10Lmxlbmd0aDtyPGE7KXt2YXIgYz04LHU9KDAsby5yZWFkVWludDMyKSh0LHIpLGg9KDAsby5yZWFkVWludDMyKSh0LHIrNCk7cis9YztpZigxPT09dSl7dT00Mjk0OTY3Mjk2KigwLG8ucmVhZFVpbnQzMikodCxyKSsoMCxvLnJlYWRVaW50MzIpKHQscis0KTtyKz04O2MrPTh9MD09PXUmJih1PWEtcitjKTtpZih1PGMpdGhyb3cgbmV3IGwoIkludmFsaWQgYm94IGZpZWxkIHNpemUiKTt2YXIgZD11LWMscD0hMDtzd2l0Y2goaCl7Y2FzZSAxNzg1NzM3ODMyOnA9ITE7YnJlYWs7Y2FzZSAxNjY4MjQ2NjQyOnZhciBtPXRbcl07aWYoMT09PW0pe3ZhciBnPSgwLG8ucmVhZFVpbnQzMikodCxyKzMpO3N3aXRjaChnKXtjYXNlIDE2OmNhc2UgMTc6Y2FzZSAxODpicmVhaztkZWZhdWx0OigwLGkud2FybikoIlVua25vd24gY29sb3JzcGFjZSAiK2cpfX1lbHNlIDI9PT1tJiYoMCxpLmluZm8pKCJJQ0MgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIik7YnJlYWs7Y2FzZSAxNzg1NzM3ODI3OnRoaXMucGFyc2VDb2Rlc3RyZWFtKHQscixyK2QpO2JyZWFrO2Nhc2UgMTc4MzYzNmUzOjIxODc5MzczOCE9PSgwLG8ucmVhZFVpbnQzMikodCxyKSYmKDAsaS53YXJuKSgiSW52YWxpZCBKUDIgc2lnbmF0dXJlIik7YnJlYWs7Y2FzZSAxNzgzNjM0NDU4OmNhc2UgMTcxODkwOTI5NjpjYXNlIDE5MjAwOTk2OTc6Y2FzZSAxOTE5MjUxMjMyOmNhc2UgMTc2ODQ0OTEzODpicmVhaztkZWZhdWx0OnZhciB5PVN0cmluZy5mcm9tQ2hhckNvZGUoaD4+MjQmMjU1LGg+PjE2JjI1NSxoPj44JjI1NSwyNTUmaCk7KDAsaS53YXJuKSgiVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgIitoKyIgKCIreSsiKSIpfXAmJihyKz1kKX1lbHNlIHRoaXMucGFyc2VDb2Rlc3RyZWFtKHQsMCx0Lmxlbmd0aCl9LHBhcnNlSW1hZ2VQcm9wZXJ0aWVzOmZ1bmN0aW9uIEpweEltYWdlX3BhcnNlSW1hZ2VQcm9wZXJ0aWVzKHQpe2Zvcih2YXIgcj10LmdldEJ5dGUoKTtyPj0wOyl7aWYoNjUzNjE9PT0ocjw8OHwocj10LmdldEJ5dGUoKSkpKXt0LnNraXAoNCk7dmFyIGE9dC5nZXRJbnQzMigpPj4+MCxpPXQuZ2V0SW50MzIoKT4+PjAsbz10LmdldEludDMyKCk+Pj4wLGM9dC5nZXRJbnQzMigpPj4+MDt0LnNraXAoMTYpO3ZhciB1PXQuZ2V0VWludDE2KCk7dGhpcy53aWR0aD1hLW87dGhpcy5oZWlnaHQ9aS1jO3RoaXMuY29tcG9uZW50c0NvdW50PXU7dGhpcy5iaXRzUGVyQ29tcG9uZW50PTg7cmV0dXJufX10aHJvdyBuZXcgbCgiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbSIpfSxwYXJzZUNvZGVzdHJlYW06ZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2VDb2Rlc3RyZWFtKHQscixhKXt2YXIgYz17fSx1PSExO3RyeXtmb3IodmFyIGg9cjtoKzE8YTspe3ZhciBkPSgwLG8ucmVhZFVpbnQxNikodCxoKTtoKz0yO3ZhciBwLG0sZyx5LGIsdixTPTA7c3dpdGNoKGQpe2Nhc2UgNjUzNTk6Yy5tYWluSGVhZGVyPSEwO2JyZWFrO2Nhc2UgNjU0OTc6YnJlYWs7Y2FzZSA2NTM2MTpTPSgwLG8ucmVhZFVpbnQxNikodCxoKTt2YXIgaz17fTtrLlhzaXo9KDAsby5yZWFkVWludDMyKSh0LGgrNCk7ay5Zc2l6PSgwLG8ucmVhZFVpbnQzMikodCxoKzgpO2suWE9zaXo9KDAsby5yZWFkVWludDMyKSh0LGgrMTIpO2suWU9zaXo9KDAsby5yZWFkVWludDMyKSh0LGgrMTYpO2suWFRzaXo9KDAsby5yZWFkVWludDMyKSh0LGgrMjApO2suWVRzaXo9KDAsby5yZWFkVWludDMyKSh0LGgrMjQpO2suWFRPc2l6PSgwLG8ucmVhZFVpbnQzMikodCxoKzI4KTtrLllUT3Npej0oMCxvLnJlYWRVaW50MzIpKHQsaCszMik7dmFyIHc9KDAsby5yZWFkVWludDE2KSh0LGgrMzYpO2suQ3Npej13O3ZhciBDPVtdO3A9aCszODtmb3IodmFyIF89MDtfPHc7XysrKXt2YXIgeD17cHJlY2lzaW9uOjErKDEyNyZ0W3BdKSxpc1NpZ25lZDohISgxMjgmdFtwXSksWFJzaXo6dFtwKzFdLFlSc2l6OnRbcCsyXX07cCs9MztjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKHgsayk7Qy5wdXNoKHgpfWMuU0laPWs7Yy5jb21wb25lbnRzPUM7Y2FsY3VsYXRlVGlsZUdyaWRzKGMsQyk7Yy5RQ0M9W107Yy5DT0M9W107YnJlYWs7Y2FzZSA2NTM3MjpTPSgwLG8ucmVhZFVpbnQxNikodCxoKTt2YXIgQT17fTtwPWgrMjtzd2l0Y2goMzEmKG09dFtwKytdKSl7Y2FzZSAwOnk9ODtiPSEwO2JyZWFrO2Nhc2UgMTp5PTE2O2I9ITE7YnJlYWs7Y2FzZSAyOnk9MTY7Yj0hMDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIrbSl9QS5ub1F1YW50aXphdGlvbj04PT09eTtBLnNjYWxhckV4cG91bmRlZD1iO0EuZ3VhcmRCaXRzPW0+PjU7Zz1bXTtmb3IoO3A8UytoOyl7dmFyIFQ9e307aWYoOD09PXkpe1QuZXBzaWxvbj10W3ArK10+PjM7VC5tdT0wfWVsc2V7VC5lcHNpbG9uPXRbcF0+PjM7VC5tdT0oNyZ0W3BdKTw8OHx0W3ArMV07cCs9Mn1nLnB1c2goVCl9QS5TUHFjZHM9ZztpZihjLm1haW5IZWFkZXIpYy5RQ0Q9QTtlbHNle2MuY3VycmVudFRpbGUuUUNEPUE7Yy5jdXJyZW50VGlsZS5RQ0M9W119YnJlYWs7Y2FzZSA2NTM3MzpTPSgwLG8ucmVhZFVpbnQxNikodCxoKTt2YXIgUixJPXt9O3A9aCsyO2lmKGMuU0laLkNzaXo8MjU3KVI9dFtwKytdO2Vsc2V7Uj0oMCxvLnJlYWRVaW50MTYpKHQscCk7cCs9Mn1zd2l0Y2goMzEmKG09dFtwKytdKSl7Y2FzZSAwOnk9ODtiPSEwO2JyZWFrO2Nhc2UgMTp5PTE2O2I9ITE7YnJlYWs7Y2FzZSAyOnk9MTY7Yj0hMDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIrbSl9SS5ub1F1YW50aXphdGlvbj04PT09eTtJLnNjYWxhckV4cG91bmRlZD1iO0kuZ3VhcmRCaXRzPW0+PjU7Zz1bXTtmb3IoO3A8UytoOyl7VD17fTtpZig4PT09eSl7VC5lcHNpbG9uPXRbcCsrXT4+MztULm11PTB9ZWxzZXtULmVwc2lsb249dFtwXT4+MztULm11PSg3JnRbcF0pPDw4fHRbcCsxXTtwKz0yfWcucHVzaChUKX1JLlNQcWNkcz1nO2MubWFpbkhlYWRlcj9jLlFDQ1tSXT1JOmMuY3VycmVudFRpbGUuUUNDW1JdPUk7YnJlYWs7Y2FzZSA2NTM2MjpTPSgwLG8ucmVhZFVpbnQxNikodCxoKTt2YXIgUD17fTtwPWgrMjt2YXIgTz10W3ArK107UC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzPSEhKDEmTyk7UC5zb3BNYXJrZXJVc2VkPSEhKDImTyk7UC5lcGhNYXJrZXJVc2VkPSEhKDQmTyk7UC5wcm9ncmVzc2lvbk9yZGVyPXRbcCsrXTtQLmxheWVyc0NvdW50PSgwLG8ucmVhZFVpbnQxNikodCxwKTtwKz0yO1AubXVsdGlwbGVDb21wb25lbnRUcmFuc2Zvcm09dFtwKytdO1AuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50PXRbcCsrXTtQLnhjYj0yKygxNSZ0W3ArK10pO1AueWNiPTIrKDE1JnRbcCsrXSk7dmFyIEU9dFtwKytdO1Auc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcz0hISgxJkUpO1AucmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcz0hISgyJkUpO1AudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzPSEhKDQmRSk7UC52ZXJ0aWNhbGx5U3RyaXBlPSEhKDgmRSk7UC5wcmVkaWN0YWJsZVRlcm1pbmF0aW9uPSEhKDE2JkUpO1Auc2VnbWVudGF0aW9uU3ltYm9sVXNlZD0hISgzMiZFKTtQLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbj10W3ArK107aWYoUC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKXtmb3IodmFyIEI9W107cDxTK2g7KXt2YXIgRD10W3ArK107Qi5wdXNoKHtQUHg6MTUmRCxQUHk6RD4+NH0pfVAucHJlY2luY3RzU2l6ZXM9Qn12YXIgTT1bXTtQLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MmJk0ucHVzaCgic2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyIpO1AucmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcyYmTS5wdXNoKCJyZXNldENvbnRleHRQcm9iYWJpbGl0aWVzIik7UC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MmJk0ucHVzaCgidGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzIik7UC52ZXJ0aWNhbGx5U3RyaXBlJiZNLnB1c2goInZlcnRpY2FsbHlTdHJpcGUiKTtQLnByZWRpY3RhYmxlVGVybWluYXRpb24mJk0ucHVzaCgicHJlZGljdGFibGVUZXJtaW5hdGlvbiIpO2lmKE0ubGVuZ3RoPjApe3U9ITA7dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBDT0Qgb3B0aW9ucyAoIitNLmpvaW4oIiwgIikrIikiKX1pZihjLm1haW5IZWFkZXIpYy5DT0Q9UDtlbHNle2MuY3VycmVudFRpbGUuQ09EPVA7Yy5jdXJyZW50VGlsZS5DT0M9W119YnJlYWs7Y2FzZSA2NTQyNDpTPSgwLG8ucmVhZFVpbnQxNikodCxoKTsodj17fSkuaW5kZXg9KDAsby5yZWFkVWludDE2KSh0LGgrMik7di5sZW5ndGg9KDAsby5yZWFkVWludDMyKSh0LGgrNCk7di5kYXRhRW5kPXYubGVuZ3RoK2gtMjt2LnBhcnRJbmRleD10W2grOF07di5wYXJ0c0NvdW50PXRbaCs5XTtjLm1haW5IZWFkZXI9ITE7aWYoMD09PXYucGFydEluZGV4KXt2LkNPRD1jLkNPRDt2LkNPQz1jLkNPQy5zbGljZSgwKTt2LlFDRD1jLlFDRDt2LlFDQz1jLlFDQy5zbGljZSgwKX1jLmN1cnJlbnRUaWxlPXY7YnJlYWs7Y2FzZSA2NTQyNzppZigwPT09KHY9Yy5jdXJyZW50VGlsZSkucGFydEluZGV4KXtpbml0aWFsaXplVGlsZShjLHYuaW5kZXgpO2J1aWxkUGFja2V0cyhjKX1wYXJzZVRpbGVQYWNrZXRzKGMsdCxoLFM9di5kYXRhRW5kLWgpO2JyZWFrO2Nhc2UgNjUzNjU6Y2FzZSA2NTM2NzpjYXNlIDY1MzY4OmNhc2UgNjUzODA6Uz0oMCxvLnJlYWRVaW50MTYpKHQsaCk7YnJlYWs7Y2FzZSA2NTM2Mzp0aHJvdyBuZXcgRXJyb3IoIkNvZGVzdHJlYW0gY29kZSAweEZGNTMgKENPQykgaXMgbm90IGltcGxlbWVudGVkIik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29kZXN0cmVhbSBjb2RlOiAiK2QudG9TdHJpbmcoMTYpKX1oKz1TfX1jYXRjaCh0KXtpZih1fHx0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlKXRocm93IG5ldyBsKHQubWVzc2FnZSk7KDAsaS53YXJuKSgiSlBYOiBUcnlpbmcgdG8gcmVjb3ZlciBmcm9tOiAiK3QubWVzc2FnZSl9dGhpcy50aWxlcz1mdW5jdGlvbiB0cmFuc2Zvcm1Db21wb25lbnRzKHQpe2Zvcih2YXIgcj10LlNJWixhPXQuY29tcG9uZW50cyxpPXIuQ3NpeixvPVtdLGM9MCxsPXQudGlsZXMubGVuZ3RoO2M8bDtjKyspe3ZhciB1LGg9dC50aWxlc1tjXSxkPVtdO2Zvcih1PTA7dTxpO3UrKylkW3VdPXRyYW5zZm9ybVRpbGUodCxoLHUpO3ZhciBwLG0sZyx5LGIsdixTLGs9ZFswXSx3PW5ldyBVaW50OENsYW1wZWRBcnJheShrLml0ZW1zLmxlbmd0aCppKSxDPXtsZWZ0OmsubGVmdCx0b3A6ay50b3Asd2lkdGg6ay53aWR0aCxoZWlnaHQ6ay5oZWlnaHQsaXRlbXM6d30sXz0wO2lmKGguY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSl7dmFyIHg9ND09PWksQT1kWzBdLml0ZW1zLFQ9ZFsxXS5pdGVtcyxSPWRbMl0uaXRlbXMsST14P2RbM10uaXRlbXM6bnVsbDtwPWFbMF0ucHJlY2lzaW9uLTg7bT0uNSsoMTI4PDxwKTt2YXIgUD1oLmNvbXBvbmVudHNbMF0sTz1pLTM7eT1BLmxlbmd0aDtpZihQLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24pZm9yKGc9MDtnPHk7ZysrLF8rPU8pe2I9QVtnXSttO3Y9VFtnXTtTPVJbZ107dmFyIEU9Yi0oUyt2Pj4yKTt3W18rK109RStTPj5wO3dbXysrXT1FPj5wO3dbXysrXT1FK3Y+PnB9ZWxzZSBmb3IoZz0wO2c8eTtnKyssXys9Tyl7Yj1BW2ddK207dj1UW2ddO1M9UltnXTt3W18rK109YisxLjQwMipTPj5wO3dbXysrXT1iLS4zNDQxMyp2LS43MTQxNCpTPj5wO3dbXysrXT1iKzEuNzcyKnY+PnB9aWYoeClmb3IoZz0wLF89MztnPHk7ZysrLF8rPTQpd1tfXT1JW2ddK20+PnB9ZWxzZSBmb3IodT0wO3U8aTt1Kyspe3ZhciBCPWRbdV0uaXRlbXM7cD1hW3VdLnByZWNpc2lvbi04O209LjUrKDEyODw8cCk7Zm9yKF89dSxnPTAseT1CLmxlbmd0aDtnPHk7ZysrKXt3W19dPUJbZ10rbT4+cDtfKz1pfX1vLnB1c2goQyl9cmV0dXJuIG99KGMpO3RoaXMud2lkdGg9Yy5TSVouWHNpei1jLlNJWi5YT3Npejt0aGlzLmhlaWdodD1jLlNJWi5Zc2l6LWMuU0laLllPc2l6O3RoaXMuY29tcG9uZW50c0NvdW50PWMuU0laLkNzaXp9fTtmdW5jdGlvbiBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKHQscil7dC54MD1NYXRoLmNlaWwoci5YT3Npei90LlhSc2l6KTt0LngxPU1hdGguY2VpbChyLlhzaXovdC5YUnNpeik7dC55MD1NYXRoLmNlaWwoci5ZT3Npei90LllSc2l6KTt0LnkxPU1hdGguY2VpbChyLllzaXovdC5ZUnNpeik7dC53aWR0aD10LngxLXQueDA7dC5oZWlnaHQ9dC55MS10LnkwfWZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVHcmlkcyh0LHIpe2Zvcih2YXIgYSxpPXQuU0laLG89W10sYz1NYXRoLmNlaWwoKGkuWHNpei1pLlhUT3NpeikvaS5YVHNpeiksbD1NYXRoLmNlaWwoKGkuWXNpei1pLllUT3NpeikvaS5ZVHNpeiksdT0wO3U8bDt1KyspZm9yKHZhciBoPTA7aDxjO2grKyl7KGE9e30pLnR4MD1NYXRoLm1heChpLlhUT3NpeitoKmkuWFRzaXosaS5YT3Npeik7YS50eTA9TWF0aC5tYXgoaS5ZVE9zaXordSppLllUc2l6LGkuWU9zaXopO2EudHgxPU1hdGgubWluKGkuWFRPc2l6KyhoKzEpKmkuWFRzaXosaS5Yc2l6KTthLnR5MT1NYXRoLm1pbihpLllUT3NpeisodSsxKSppLllUc2l6LGkuWXNpeik7YS53aWR0aD1hLnR4MS1hLnR4MDthLmhlaWdodD1hLnR5MS1hLnR5MDthLmNvbXBvbmVudHM9W107by5wdXNoKGEpfXQudGlsZXM9bztmb3IodmFyIGQ9MCxwPWkuQ3NpejtkPHA7ZCsrKWZvcih2YXIgbT1yW2RdLGc9MCx5PW8ubGVuZ3RoO2c8eTtnKyspe3ZhciBiPXt9O2E9b1tnXTtiLnRjeDA9TWF0aC5jZWlsKGEudHgwL20uWFJzaXopO2IudGN5MD1NYXRoLmNlaWwoYS50eTAvbS5ZUnNpeik7Yi50Y3gxPU1hdGguY2VpbChhLnR4MS9tLlhSc2l6KTtiLnRjeTE9TWF0aC5jZWlsKGEudHkxL20uWVJzaXopO2Iud2lkdGg9Yi50Y3gxLWIudGN4MDtiLmhlaWdodD1iLnRjeTEtYi50Y3kwO2EuY29tcG9uZW50c1tkXT1ifX1mdW5jdGlvbiBnZXRCbG9ja3NEaW1lbnNpb25zKHQscixhKXt2YXIgaT1yLmNvZGluZ1N0eWxlUGFyYW1ldGVycyxvPXt9O2lmKGkuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cyl7by5QUHg9aS5wcmVjaW5jdHNTaXplc1thXS5QUHg7by5QUHk9aS5wcmVjaW5jdHNTaXplc1thXS5QUHl9ZWxzZXtvLlBQeD0xNTtvLlBQeT0xNX1vLnhjYl89YT4wP01hdGgubWluKGkueGNiLG8uUFB4LTEpOk1hdGgubWluKGkueGNiLG8uUFB4KTtvLnljYl89YT4wP01hdGgubWluKGkueWNiLG8uUFB5LTEpOk1hdGgubWluKGkueWNiLG8uUFB5KTtyZXR1cm4gb31mdW5jdGlvbiBidWlsZFByZWNpbmN0cyh0LHIsYSl7dmFyIGk9MTw8YS5QUHgsbz0xPDxhLlBQeSxjPTA9PT1yLnJlc0xldmVsLGw9MTw8YS5QUHgrKGM/MDotMSksdT0xPDxhLlBQeSsoYz8wOi0xKSxoPXIudHJ4MT5yLnRyeDA/TWF0aC5jZWlsKHIudHJ4MS9pKS1NYXRoLmZsb29yKHIudHJ4MC9pKTowLGQ9ci50cnkxPnIudHJ5MD9NYXRoLmNlaWwoci50cnkxL28pLU1hdGguZmxvb3Ioci50cnkwL28pOjAscD1oKmQ7ci5wcmVjaW5jdFBhcmFtZXRlcnM9e3ByZWNpbmN0V2lkdGg6aSxwcmVjaW5jdEhlaWdodDpvLG51bXByZWNpbmN0c3dpZGU6aCxudW1wcmVjaW5jdHNoaWdoOmQsbnVtcHJlY2luY3RzOnAscHJlY2luY3RXaWR0aEluU3ViYmFuZDpsLHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kOnV9fWZ1bmN0aW9uIGJ1aWxkQ29kZWJsb2Nrcyh0LHIsYSl7dmFyIGksbyxjLGwsdT1hLnhjYl8saD1hLnljYl8sZD0xPDx1LHA9MTw8aCxtPXIudGJ4MD4+dSxnPXIudGJ5MD4+aCx5PXIudGJ4MStkLTE+PnUsYj1yLnRieTErcC0xPj5oLHY9ci5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycyxTPVtdLGs9W107Zm9yKG89ZztvPGI7bysrKWZvcihpPW07aTx5O2krKyl7KGM9e2NieDppLGNieTpvLHRieDA6ZCppLHRieTA6cCpvLHRieDE6ZCooaSsxKSx0YnkxOnAqKG8rMSl9KS50YngwXz1NYXRoLm1heChyLnRieDAsYy50YngwKTtjLnRieTBfPU1hdGgubWF4KHIudGJ5MCxjLnRieTApO2MudGJ4MV89TWF0aC5taW4oci50YngxLGMudGJ4MSk7Yy50YnkxXz1NYXRoLm1pbihyLnRieTEsYy50YnkxKTtsPU1hdGguZmxvb3IoKGMudGJ4MF8tci50YngwKS92LnByZWNpbmN0V2lkdGhJblN1YmJhbmQpK01hdGguZmxvb3IoKGMudGJ5MF8tci50YnkwKS92LnByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kKSp2Lm51bXByZWNpbmN0c3dpZGU7Yy5wcmVjaW5jdE51bWJlcj1sO2Muc3ViYmFuZFR5cGU9ci50eXBlO2MuTGJsb2NrPTM7aWYoIShjLnRieDFfPD1jLnRieDBffHxjLnRieTFfPD1jLnRieTBfKSl7Uy5wdXNoKGMpO3ZhciB3PWtbbF07aWYodm9pZCAwIT09dyl7aTx3LmNieE1pbj93LmNieE1pbj1pOmk+dy5jYnhNYXgmJih3LmNieE1heD1pKTtvPHcuY2J5TWluP3cuY2J4TWluPW86bz53LmNieU1heCYmKHcuY2J5TWF4PW8pfWVsc2Uga1tsXT13PXtjYnhNaW46aSxjYnlNaW46byxjYnhNYXg6aSxjYnlNYXg6b307Yy5wcmVjaW5jdD13fX1yLmNvZGVibG9ja1BhcmFtZXRlcnM9e2NvZGVibG9ja1dpZHRoOnUsY29kZWJsb2NrSGVpZ2h0OmgsbnVtY29kZWJsb2Nrd2lkZTp5LW0rMSxudW1jb2RlYmxvY2toaWdoOmItZysxfTtyLmNvZGVibG9ja3M9UztyLnByZWNpbmN0cz1rfWZ1bmN0aW9uIGNyZWF0ZVBhY2tldCh0LHIsYSl7Zm9yKHZhciBpPVtdLG89dC5zdWJiYW5kcyxjPTAsbD1vLmxlbmd0aDtjPGw7YysrKWZvcih2YXIgdT1vW2NdLmNvZGVibG9ja3MsaD0wLGQ9dS5sZW5ndGg7aDxkO2grKyl7dmFyIHA9dVtoXTtwLnByZWNpbmN0TnVtYmVyPT09ciYmaS5wdXNoKHApfXJldHVybntsYXllck51bWJlcjphLGNvZGVibG9ja3M6aX19ZnVuY3Rpb24gTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcih0KXtmb3IodmFyIHI9dC5TSVosYT10LmN1cnJlbnRUaWxlLmluZGV4LGk9dC50aWxlc1thXSxvPWkuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxjPXIuQ3Npeix1PTAsaD0wO2g8YztoKyspdT1NYXRoLm1heCh1LGkuY29tcG9uZW50c1toXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KTt2YXIgZD0wLHA9MCxtPTAsZz0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCl7Zm9yKDtkPG87ZCsrKXtmb3IoO3A8PXU7cCsrKXtmb3IoO208YzttKyspe3ZhciB0PWkuY29tcG9uZW50c1ttXTtpZighKHA+dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSl7Zm9yKHZhciByPXQucmVzb2x1dGlvbnNbcF0sYT1yLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7ZzxhOyl7dmFyIGg9Y3JlYXRlUGFja2V0KHIsZyxkKTtnKys7cmV0dXJuIGh9Zz0wfX1tPTB9cD0wfXRocm93IG5ldyBsKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKHQpe2Zvcih2YXIgcj10LlNJWixhPXQuY3VycmVudFRpbGUuaW5kZXgsaT10LnRpbGVzW2FdLG89aS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LGM9ci5Dc2l6LHU9MCxoPTA7aDxjO2grKyl1PU1hdGgubWF4KHUsaS5jb21wb25lbnRzW2hdLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpO3ZhciBkPTAscD0wLG09MCxnPTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO2Q8PXU7ZCsrKXtmb3IoO3A8bztwKyspe2Zvcig7bTxjO20rKyl7dmFyIHQ9aS5jb21wb25lbnRzW21dO2lmKCEoZD50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpKXtmb3IodmFyIHI9dC5yZXNvbHV0aW9uc1tkXSxhPXIucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztnPGE7KXt2YXIgaD1jcmVhdGVQYWNrZXQocixnLHApO2crKztyZXR1cm4gaH1nPTB9fW09MH1wPTB9dGhyb3cgbmV3IGwoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIFJlc29sdXRpb25Qb3NpdGlvbkNvbXBvbmVudExheWVySXRlcmF0b3IodCl7dmFyIHIsYSxpLG8sYz10LlNJWix1PXQuY3VycmVudFRpbGUuaW5kZXgsaD10LnRpbGVzW3VdLGQ9aC5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LHA9Yy5Dc2l6LG09MDtmb3IoaT0wO2k8cDtpKyspe3ZhciBnPWguY29tcG9uZW50c1tpXTttPU1hdGgubWF4KG0sZy5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KX12YXIgeT1uZXcgSW50MzJBcnJheShtKzEpO2ZvcihhPTA7YTw9bTsrK2Epe3ZhciBiPTA7Zm9yKGk9MDtpPHA7KytpKXt2YXIgdj1oLmNvbXBvbmVudHNbaV0ucmVzb2x1dGlvbnM7YTx2Lmxlbmd0aCYmKGI9TWF0aC5tYXgoYix2W2FdLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHMpKX15W2FdPWJ9cj0wO2E9MDtpPTA7bz0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCl7Zm9yKDthPD1tO2ErKyl7Zm9yKDtvPHlbYV07bysrKXtmb3IoO2k8cDtpKyspe3ZhciB0PWguY29tcG9uZW50c1tpXTtpZighKGE+dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSl7dmFyIGM9dC5yZXNvbHV0aW9uc1thXSx1PWMucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztpZighKG8+PXUpKXtmb3IoO3I8ZDspe3ZhciBnPWNyZWF0ZVBhY2tldChjLG8scik7cisrO3JldHVybiBnfXI9MH19fWk9MH1vPTB9dGhyb3cgbmV3IGwoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IodCl7dmFyIHI9dC5TSVosYT10LmN1cnJlbnRUaWxlLmluZGV4LGk9dC50aWxlc1thXSxvPWkuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxjPXIuQ3Npeix1PWdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUoaSksaD11LGQ9MCxwPTAsbT0wLGc9MCx5PTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO3k8aC5tYXhOdW1IaWdoO3krKyl7Zm9yKDtnPGgubWF4TnVtV2lkZTtnKyspe2Zvcig7bTxjO20rKyl7Zm9yKHZhciB0PWkuY29tcG9uZW50c1ttXSxyPXQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDtwPD1yO3ArKyl7dmFyIGE9dC5yZXNvbHV0aW9uc1twXSxiPXUuY29tcG9uZW50c1ttXS5yZXNvbHV0aW9uc1twXSx2PWdldFByZWNpbmN0SW5kZXhJZkV4aXN0KGcseSxiLGgsYSk7aWYobnVsbCE9PXYpe2Zvcig7ZDxvOyl7dmFyIFM9Y3JlYXRlUGFja2V0KGEsdixkKTtkKys7cmV0dXJuIFN9ZD0wfX1wPTB9bT0wfWc9MH10aHJvdyBuZXcgbCgiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcih0KXt2YXIgcj10LlNJWixhPXQuY3VycmVudFRpbGUuaW5kZXgsaT10LnRpbGVzW2FdLG89aS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LGM9ci5Dc2l6LHU9Z2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZShpKSxoPTAsZD0wLHA9MCxtPTAsZz0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCl7Zm9yKDtwPGM7KytwKXtmb3IodmFyIHQ9aS5jb21wb25lbnRzW3BdLHI9dS5jb21wb25lbnRzW3BdLGE9dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O2c8ci5tYXhOdW1IaWdoO2crKyl7Zm9yKDttPHIubWF4TnVtV2lkZTttKyspe2Zvcig7ZDw9YTtkKyspe3ZhciB5PXQucmVzb2x1dGlvbnNbZF0sYj1yLnJlc29sdXRpb25zW2RdLHY9Z2V0UHJlY2luY3RJbmRleElmRXhpc3QobSxnLGIscix5KTtpZihudWxsIT09dil7Zm9yKDtoPG87KXt2YXIgUz1jcmVhdGVQYWNrZXQoeSx2LGgpO2grKztyZXR1cm4gU31oPTB9fWQ9MH1tPTB9Zz0wfXRocm93IG5ldyBsKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiBnZXRQcmVjaW5jdEluZGV4SWZFeGlzdCh0LHIsYSxpLG8pe3ZhciBjPXQqaS5taW5XaWR0aCxsPXIqaS5taW5IZWlnaHQ7aWYoYyVhLndpZHRoIT0wfHxsJWEuaGVpZ2h0IT0wKXJldHVybiBudWxsO3ZhciB1PWwvYS53aWR0aCpvLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlO3JldHVybiBjL2EuaGVpZ2h0K3V9ZnVuY3Rpb24gZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSh0KXtmb3IodmFyIHI9dC5jb21wb25lbnRzLmxlbmd0aCxhPU51bWJlci5NQVhfVkFMVUUsaT1OdW1iZXIuTUFYX1ZBTFVFLG89MCxjPTAsbD1uZXcgQXJyYXkociksdT0wO3U8cjt1Kyspe2Zvcih2YXIgaD10LmNvbXBvbmVudHNbdV0sZD1oLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQscD1uZXcgQXJyYXkoZCsxKSxtPU51bWJlci5NQVhfVkFMVUUsZz1OdW1iZXIuTUFYX1ZBTFVFLHk9MCxiPTAsdj0xLFM9ZDtTPj0wOy0tUyl7dmFyIGs9aC5yZXNvbHV0aW9uc1tTXSx3PXYqay5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aCxDPXYqay5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHQ7bT1NYXRoLm1pbihtLHcpO2c9TWF0aC5taW4oZyxDKTt5PU1hdGgubWF4KHksay5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZSk7Yj1NYXRoLm1heChiLGsucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c2hpZ2gpO3BbU109e3dpZHRoOncsaGVpZ2h0OkN9O3Y8PD0xfWE9TWF0aC5taW4oYSxtKTtpPU1hdGgubWluKGksZyk7bz1NYXRoLm1heChvLHkpO2M9TWF0aC5tYXgoYyxiKTtsW3VdPXtyZXNvbHV0aW9uczpwLG1pbldpZHRoOm0sbWluSGVpZ2h0OmcsbWF4TnVtV2lkZTp5LG1heE51bUhpZ2g6Yn19cmV0dXJue2NvbXBvbmVudHM6bCxtaW5XaWR0aDphLG1pbkhlaWdodDppLG1heE51bVdpZGU6byxtYXhOdW1IaWdoOmN9fWZ1bmN0aW9uIGJ1aWxkUGFja2V0cyh0KXtmb3IodmFyIHI9dC5TSVosYT10LmN1cnJlbnRUaWxlLmluZGV4LGk9dC50aWxlc1thXSxvPXIuQ3NpeixjPTA7YzxvO2MrKyl7Zm9yKHZhciB1PWkuY29tcG9uZW50c1tjXSxoPXUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCxkPVtdLHA9W10sbT0wO208PWg7bSsrKXt2YXIgZyx5PWdldEJsb2Nrc0RpbWVuc2lvbnMoMCx1LG0pLGI9e30sdj0xPDxoLW07Yi50cngwPU1hdGguY2VpbCh1LnRjeDAvdik7Yi50cnkwPU1hdGguY2VpbCh1LnRjeTAvdik7Yi50cngxPU1hdGguY2VpbCh1LnRjeDEvdik7Yi50cnkxPU1hdGguY2VpbCh1LnRjeTEvdik7Yi5yZXNMZXZlbD1tO2J1aWxkUHJlY2luY3RzKDAsYix5KTtkLnB1c2goYik7aWYoMD09PW0peyhnPXt9KS50eXBlPSJMTCI7Zy50YngwPU1hdGguY2VpbCh1LnRjeDAvdik7Zy50YnkwPU1hdGguY2VpbCh1LnRjeTAvdik7Zy50YngxPU1hdGguY2VpbCh1LnRjeDEvdik7Zy50YnkxPU1hdGguY2VpbCh1LnRjeTEvdik7Zy5yZXNvbHV0aW9uPWI7YnVpbGRDb2RlYmxvY2tzKDAsZyx5KTtwLnB1c2goZyk7Yi5zdWJiYW5kcz1bZ119ZWxzZXt2YXIgUz0xPDxoLW0rMSxrPVtdOyhnPXt9KS50eXBlPSJITCI7Zy50YngwPU1hdGguY2VpbCh1LnRjeDAvUy0uNSk7Zy50YnkwPU1hdGguY2VpbCh1LnRjeTAvUyk7Zy50YngxPU1hdGguY2VpbCh1LnRjeDEvUy0uNSk7Zy50YnkxPU1hdGguY2VpbCh1LnRjeTEvUyk7Zy5yZXNvbHV0aW9uPWI7YnVpbGRDb2RlYmxvY2tzKDAsZyx5KTtwLnB1c2goZyk7ay5wdXNoKGcpOyhnPXt9KS50eXBlPSJMSCI7Zy50YngwPU1hdGguY2VpbCh1LnRjeDAvUyk7Zy50YnkwPU1hdGguY2VpbCh1LnRjeTAvUy0uNSk7Zy50YngxPU1hdGguY2VpbCh1LnRjeDEvUyk7Zy50YnkxPU1hdGguY2VpbCh1LnRjeTEvUy0uNSk7Zy5yZXNvbHV0aW9uPWI7YnVpbGRDb2RlYmxvY2tzKDAsZyx5KTtwLnB1c2goZyk7ay5wdXNoKGcpOyhnPXt9KS50eXBlPSJISCI7Zy50YngwPU1hdGguY2VpbCh1LnRjeDAvUy0uNSk7Zy50YnkwPU1hdGguY2VpbCh1LnRjeTAvUy0uNSk7Zy50YngxPU1hdGguY2VpbCh1LnRjeDEvUy0uNSk7Zy50YnkxPU1hdGguY2VpbCh1LnRjeTEvUy0uNSk7Zy5yZXNvbHV0aW9uPWI7YnVpbGRDb2RlYmxvY2tzKDAsZyx5KTtwLnB1c2goZyk7ay5wdXNoKGcpO2Iuc3ViYmFuZHM9a319dS5yZXNvbHV0aW9ucz1kO3Uuc3ViYmFuZHM9cH12YXIgdz1pLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMucHJvZ3Jlc3Npb25PcmRlcjtzd2l0Y2godyl7Y2FzZSAwOmkucGFja2V0c0l0ZXJhdG9yPW5ldyBMYXllclJlc29sdXRpb25Db21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKHQpO2JyZWFrO2Nhc2UgMTppLnBhY2tldHNJdGVyYXRvcj1uZXcgUmVzb2x1dGlvbkxheWVyQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcih0KTticmVhaztjYXNlIDI6aS5wYWNrZXRzSXRlcmF0b3I9bmV3IFJlc29sdXRpb25Qb3NpdGlvbkNvbXBvbmVudExheWVySXRlcmF0b3IodCk7YnJlYWs7Y2FzZSAzOmkucGFja2V0c0l0ZXJhdG9yPW5ldyBQb3NpdGlvbkNvbXBvbmVudFJlc29sdXRpb25MYXllckl0ZXJhdG9yKHQpO2JyZWFrO2Nhc2UgNDppLnBhY2tldHNJdGVyYXRvcj1uZXcgQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcih0KTticmVhaztkZWZhdWx0OnRocm93IG5ldyBsKCJVbnN1cHBvcnRlZCBwcm9ncmVzc2lvbiBvcmRlciAiLmNvbmNhdCh3KSl9fWZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHModCxpLGMsbCl7dmFyIHUsaD0wLGQ9MCxwPSExO2Z1bmN0aW9uIHJlYWRCaXRzKHQpe2Zvcig7ZDx0Oyl7dmFyIHI9aVtjK2hdO2grKztpZihwKXt1PXU8PDd8cjtkKz03O3A9ITF9ZWxzZXt1PXU8PDh8cjtkKz04fTI1NT09PXImJihwPSEwKX1yZXR1cm4gdT4+PihkLT10KSYoMTw8dCktMX1mdW5jdGlvbiBza2lwTWFya2VySWZFcXVhbCh0KXtpZigyNTU9PT1pW2MraC0xXSYmaVtjK2hdPT09dCl7c2tpcEJ5dGVzKDEpO3JldHVybiEwfWlmKDI1NT09PWlbYytoXSYmaVtjK2grMV09PT10KXtza2lwQnl0ZXMoMik7cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gc2tpcEJ5dGVzKHQpe2grPXR9ZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKXtkPTA7aWYocCl7aCsrO3A9ITF9fWZ1bmN0aW9uIHJlYWRDb2RpbmdwYXNzZXMoKXtpZigwPT09cmVhZEJpdHMoMSkpcmV0dXJuIDE7aWYoMD09PXJlYWRCaXRzKDEpKXJldHVybiAyO3ZhciB0PXJlYWRCaXRzKDIpO3JldHVybiB0PDM/dCszOih0PXJlYWRCaXRzKDUpKTwzMT90KzY6KHQ9cmVhZEJpdHMoNykpKzM3fWZvcih2YXIgbT10LmN1cnJlbnRUaWxlLmluZGV4LGc9dC50aWxlc1ttXSx5PXQuQ09ELnNvcE1hcmtlclVzZWQsYj10LkNPRC5lcGhNYXJrZXJVc2VkLHY9Zy5wYWNrZXRzSXRlcmF0b3I7aDxsOyl7YWxpZ25Ub0J5dGUoKTt5JiZza2lwTWFya2VySWZFcXVhbCgxNDUpJiZza2lwQnl0ZXMoNCk7dmFyIFM9di5uZXh0UGFja2V0KCk7aWYocmVhZEJpdHMoMSkpe2Zvcih2YXIgayx3PVMubGF5ZXJOdW1iZXIsQz1bXSxfPTAseD1TLmNvZGVibG9ja3MubGVuZ3RoO188eDtfKyspe3ZhciBBPShrPVMuY29kZWJsb2Nrc1tfXSkucHJlY2luY3QsVD1rLmNieC1BLmNieE1pbixSPWsuY2J5LUEuY2J5TWluLEk9ITEsUD0hMTtpZih2b2lkIDAhPT1rLmluY2x1ZGVkKUk9ISFyZWFkQml0cygxKTtlbHNle3ZhciBPLEU7aWYodm9pZCAwIT09KEE9ay5wcmVjaW5jdCkuaW5jbHVzaW9uVHJlZSlPPUEuaW5jbHVzaW9uVHJlZTtlbHNle3ZhciBCPUEuY2J4TWF4LUEuY2J4TWluKzEsRD1BLmNieU1heC1BLmNieU1pbisxO089bmV3IGEoQixELHcpO0U9bmV3IHIoQixEKTtBLmluY2x1c2lvblRyZWU9TztBLnplcm9CaXRQbGFuZXNUcmVlPUV9aWYoTy5yZXNldChULFIsdykpZm9yKDs7KXtpZighcmVhZEJpdHMoMSkpe08uaW5jcmVtZW50VmFsdWUodyk7YnJlYWt9aWYoIU8ubmV4dExldmVsKCkpe2suaW5jbHVkZWQ9ITA7ST1QPSEwO2JyZWFrfX19aWYoSSl7aWYoUCl7KEU9QS56ZXJvQml0UGxhbmVzVHJlZSkucmVzZXQoVCxSKTtmb3IoOzspaWYocmVhZEJpdHMoMSkpe2lmKCFFLm5leHRMZXZlbCgpKWJyZWFrfWVsc2UgRS5pbmNyZW1lbnRWYWx1ZSgpO2suemVyb0JpdFBsYW5lcz1FLnZhbHVlfWZvcih2YXIgTT1yZWFkQ29kaW5ncGFzc2VzKCk7cmVhZEJpdHMoMSk7KWsuTGJsb2NrKys7dmFyIEw9KDAsby5sb2cyKShNKSxOPXJlYWRCaXRzKChNPDE8PEw/TC0xOkwpK2suTGJsb2NrKTtDLnB1c2goe2NvZGVibG9jazprLGNvZGluZ3Bhc3NlczpNLGRhdGFMZW5ndGg6Tn0pfX1hbGlnblRvQnl0ZSgpO2ImJnNraXBNYXJrZXJJZkVxdWFsKDE0Nik7Zm9yKDtDLmxlbmd0aD4wOyl7dmFyIFU9Qy5zaGlmdCgpO3ZvaWQgMD09PShrPVUuY29kZWJsb2NrKS5kYXRhJiYoay5kYXRhPVtdKTtrLmRhdGEucHVzaCh7ZGF0YTppLHN0YXJ0OmMraCxlbmQ6YytoK1UuZGF0YUxlbmd0aCxjb2RpbmdwYXNzZXM6VS5jb2RpbmdwYXNzZXN9KTtoKz1VLmRhdGFMZW5ndGh9fX1yZXR1cm4gaH1mdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKHQscixhLGksbyxsLGgsZCl7Zm9yKHZhciBwPWkudGJ4MCxtPWkudGJ5MCxnPWkudGJ4MS1pLnRieDAseT1pLmNvZGVibG9ja3MsYj0iSCI9PT1pLnR5cGUuY2hhckF0KDApPzE6MCx2PSJIIj09PWkudHlwZS5jaGFyQXQoMSk/cjowLFM9MCxrPXkubGVuZ3RoO1M8azsrK1Mpe3ZhciB3PXlbU10sQz13LnRieDFfLXcudGJ4MF8sXz13LnRieTFfLXcudGJ5MF87aWYoMCE9PUMmJjAhPT1fJiZ2b2lkIDAhPT13LmRhdGEpe3ZhciB4LEE7eD1uZXcgdShDLF8sdy5zdWJiYW5kVHlwZSx3Lnplcm9CaXRQbGFuZXMsbCk7QT0yO3ZhciBULFIsSSxQPXcuZGF0YSxPPTAsRT0wO2ZvcihUPTAsUj1QLmxlbmd0aDtUPFI7VCsrKXtPKz0oST1QW1RdKS5lbmQtSS5zdGFydDtFKz1JLmNvZGluZ3Bhc3Nlc312YXIgQj1uZXcgVWludDhBcnJheShPKSxEPTA7Zm9yKFQ9MCxSPVAubGVuZ3RoO1Q8UjtUKyspe3ZhciBNPShJPVBbVF0pLmRhdGEuc3ViYXJyYXkoSS5zdGFydCxJLmVuZCk7Qi5zZXQoTSxEKTtEKz1NLmxlbmd0aH12YXIgTD1uZXcgYy5Bcml0aG1ldGljRGVjb2RlcihCLDAsTyk7eC5zZXREZWNvZGVyKEwpO2ZvcihUPTA7VDxFO1QrKyl7c3dpdGNoKEEpe2Nhc2UgMDp4LnJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpO2JyZWFrO2Nhc2UgMTp4LnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7YnJlYWs7Y2FzZSAyOngucnVuQ2xlYW51cFBhc3MoKTtkJiZ4LmNoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCl9QT0oQSsxKSUzfXZhciBOLFUsaixxPXcudGJ4MF8tcCsody50YnkwXy1tKSpnLFc9eC5jb2VmZmljZW50c1NpZ24sej14LmNvZWZmaWNlbnRzTWFnbml0dWRlLEc9eC5iaXRzRGVjb2RlZCxIPWg/MDouNTtEPTA7dmFyIFY9IkxMIiE9PWkudHlwZTtmb3IoVD0wO1Q8XztUKyspe3ZhciBYPTIqKHEvZ3wwKSooci1nKStiK3Y7Zm9yKE49MDtOPEM7TisrKXtpZigwIT09KFU9eltEXSkpe1U9KFUrSCkqbzswIT09V1tEXSYmKFU9LVUpO2o9R1tEXTt2YXIgWT1WP1grKHE8PDEpOnE7dFtZXT1oJiZqPj1sP1U6VSooMTw8bC1qKX1xKys7RCsrfXErPWctQ319fX1mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHIsYSxpKXtmb3IodmFyIG89YS5jb21wb25lbnRzW2ldLGM9by5jb2RpbmdTdHlsZVBhcmFtZXRlcnMsbD1vLnF1YW50aXphdGlvblBhcmFtZXRlcnMsdT1jLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCxoPWwuU1BxY2RzLG09bC5zY2FsYXJFeHBvdW5kZWQsZz1sLmd1YXJkQml0cyx5PWMuc2VnbWVudGF0aW9uU3ltYm9sVXNlZCxiPXIuY29tcG9uZW50c1tpXS5wcmVjaXNpb24sdj1jLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbixTPXY/bmV3IHA6bmV3IGQsaz1bXSx3PTAsQz0wO0M8PXU7QysrKXtmb3IodmFyIF89by5yZXNvbHV0aW9uc1tDXSx4PV8udHJ4MS1fLnRyeDAsQT1fLnRyeTEtXy50cnkwLFQ9bmV3IEZsb2F0MzJBcnJheSh4KkEpLFI9MCxJPV8uc3ViYmFuZHMubGVuZ3RoO1I8STtSKyspe3ZhciBQLE87aWYobSl7UD1oW3ddLm11O089aFt3XS5lcHNpbG9uO3crK31lbHNle1A9aFswXS5tdTtPPWhbMF0uZXBzaWxvbisoQz4wPzEtQzowKX12YXIgRT1fLnN1YmJhbmRzW1JdLEI9dFtFLnR5cGVdO2NvcHlDb2VmZmljaWVudHMoVCx4LDAsRSx2PzE6TWF0aC5wb3coMixiK0ItTykqKDErUC8yMDQ4KSxnK08tMSx2LHkpfWsucHVzaCh7d2lkdGg6eCxoZWlnaHQ6QSxpdGVtczpUfSl9dmFyIEQ9Uy5jYWxjdWxhdGUoayxvLnRjeDAsby50Y3kwKTtyZXR1cm57bGVmdDpvLnRjeDAsdG9wOm8udGN5MCx3aWR0aDpELndpZHRoLGhlaWdodDpELmhlaWdodCxpdGVtczpELml0ZW1zfX1mdW5jdGlvbiBpbml0aWFsaXplVGlsZSh0LHIpe2Zvcih2YXIgYT10LlNJWi5Dc2l6LGk9dC50aWxlc1tyXSxvPTA7bzxhO28rKyl7dmFyIGM9aS5jb21wb25lbnRzW29dLGw9dm9pZCAwIT09dC5jdXJyZW50VGlsZS5RQ0Nbb10/dC5jdXJyZW50VGlsZS5RQ0Nbb106dC5jdXJyZW50VGlsZS5RQ0Q7Yy5xdWFudGl6YXRpb25QYXJhbWV0ZXJzPWw7dmFyIHU9dm9pZCAwIT09dC5jdXJyZW50VGlsZS5DT0Nbb10/dC5jdXJyZW50VGlsZS5DT0Nbb106dC5jdXJyZW50VGlsZS5DT0Q7Yy5jb2RpbmdTdHlsZVBhcmFtZXRlcnM9dX1pLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnM9dC5jdXJyZW50VGlsZS5DT0R9dmFyIHI9ZnVuY3Rpb24gVGFnVHJlZUNsb3N1cmUoKXtmdW5jdGlvbiBUYWdUcmVlKHQscil7dmFyIGE9KDAsby5sb2cyKShNYXRoLm1heCh0LHIpKSsxO3RoaXMubGV2ZWxzPVtdO2Zvcih2YXIgaT0wO2k8YTtpKyspe3ZhciBjPXt3aWR0aDp0LGhlaWdodDpyLGl0ZW1zOltdfTt0aGlzLmxldmVscy5wdXNoKGMpO3Q9TWF0aC5jZWlsKHQvMik7cj1NYXRoLmNlaWwoci8yKX19VGFnVHJlZS5wcm90b3R5cGU9e3Jlc2V0OmZ1bmN0aW9uIFRhZ1RyZWVfcmVzZXQodCxyKXtmb3IodmFyIGEsaT0wLG89MDtpPHRoaXMubGV2ZWxzLmxlbmd0aDspe3ZhciBjPXQrciooYT10aGlzLmxldmVsc1tpXSkud2lkdGg7aWYodm9pZCAwIT09YS5pdGVtc1tjXSl7bz1hLml0ZW1zW2NdO2JyZWFrfWEuaW5kZXg9Yzt0Pj49MTtyPj49MTtpKyt9aS0tOyhhPXRoaXMubGV2ZWxzW2ldKS5pdGVtc1thLmluZGV4XT1vO3RoaXMuY3VycmVudExldmVsPWk7ZGVsZXRlIHRoaXMudmFsdWV9LGluY3JlbWVudFZhbHVlOmZ1bmN0aW9uIFRhZ1RyZWVfaW5jcmVtZW50VmFsdWUoKXt2YXIgdD10aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07dC5pdGVtc1t0LmluZGV4XSsrfSxuZXh0TGV2ZWw6ZnVuY3Rpb24gVGFnVHJlZV9uZXh0TGV2ZWwoKXt2YXIgdD10aGlzLmN1cnJlbnRMZXZlbCxyPXRoaXMubGV2ZWxzW3RdLGE9ci5pdGVtc1tyLmluZGV4XTtpZigtLXQ8MCl7dGhpcy52YWx1ZT1hO3JldHVybiExfXRoaXMuY3VycmVudExldmVsPXQ7KHI9dGhpcy5sZXZlbHNbdF0pLml0ZW1zW3IuaW5kZXhdPWE7cmV0dXJuITB9fTtyZXR1cm4gVGFnVHJlZX0oKSxhPWZ1bmN0aW9uIEluY2x1c2lvblRyZWVDbG9zdXJlKCl7ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZSh0LHIsYSl7dmFyIGk9KDAsby5sb2cyKShNYXRoLm1heCh0LHIpKSsxO3RoaXMubGV2ZWxzPVtdO2Zvcih2YXIgYz0wO2M8aTtjKyspe2Zvcih2YXIgbD1uZXcgVWludDhBcnJheSh0KnIpLHU9MCxoPWwubGVuZ3RoO3U8aDt1KyspbFt1XT1hO3ZhciBkPXt3aWR0aDp0LGhlaWdodDpyLGl0ZW1zOmx9O3RoaXMubGV2ZWxzLnB1c2goZCk7dD1NYXRoLmNlaWwodC8yKTtyPU1hdGguY2VpbChyLzIpfX1JbmNsdXNpb25UcmVlLnByb3RvdHlwZT17cmVzZXQ6ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9yZXNldCh0LHIsYSl7Zm9yKHZhciBpPTA7aTx0aGlzLmxldmVscy5sZW5ndGg7KXt2YXIgbz10aGlzLmxldmVsc1tpXSxjPXQrcipvLndpZHRoO28uaW5kZXg9Yzt2YXIgbD1vLml0ZW1zW2NdO2lmKDI1NT09PWwpYnJlYWs7aWYobD5hKXt0aGlzLmN1cnJlbnRMZXZlbD1pO3RoaXMucHJvcGFnYXRlVmFsdWVzKCk7cmV0dXJuITF9dD4+PTE7cj4+PTE7aSsrfXRoaXMuY3VycmVudExldmVsPWktMTtyZXR1cm4hMH0saW5jcmVtZW50VmFsdWU6ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9pbmNyZW1lbnRWYWx1ZSh0KXt2YXIgcj10aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07ci5pdGVtc1tyLmluZGV4XT10KzE7dGhpcy5wcm9wYWdhdGVWYWx1ZXMoKX0scHJvcGFnYXRlVmFsdWVzOmZ1bmN0aW9uIEluY2x1c2lvblRyZWVfcHJvcGFnYXRlVmFsdWVzKCl7Zm9yKHZhciB0PXRoaXMuY3VycmVudExldmVsLHI9dGhpcy5sZXZlbHNbdF0sYT1yLml0ZW1zW3IuaW5kZXhdOy0tdD49MDspKHI9dGhpcy5sZXZlbHNbdF0pLml0ZW1zW3IuaW5kZXhdPWF9LG5leHRMZXZlbDpmdW5jdGlvbiBJbmNsdXNpb25UcmVlX25leHRMZXZlbCgpe3ZhciB0PXRoaXMuY3VycmVudExldmVsLHI9dGhpcy5sZXZlbHNbdF0sYT1yLml0ZW1zW3IuaW5kZXhdO3IuaXRlbXNbci5pbmRleF09MjU1O2lmKC0tdDwwKXJldHVybiExO3RoaXMuY3VycmVudExldmVsPXQ7KHI9dGhpcy5sZXZlbHNbdF0pLml0ZW1zW3IuaW5kZXhdPWE7cmV0dXJuITB9fTtyZXR1cm4gSW5jbHVzaW9uVHJlZX0oKSx1PWZ1bmN0aW9uIEJpdE1vZGVsQ2xvc3VyZSgpe3ZhciB0PW5ldyBVaW50OEFycmF5KFswLDUsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDEsNiw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMiw2LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwyLDYsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDIsNiw4LDAsMyw3LDgsMCw0LDcsOF0pLHI9bmV3IFVpbnQ4QXJyYXkoWzAsMyw0LDAsNSw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMSwzLDQsMCw2LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwyLDMsNCwwLDYsNyw3LDAsOCw4LDgsMCwwLDAsMCwwLDIsMyw0LDAsNiw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMiwzLDQsMCw2LDcsNywwLDgsOCw4XSksYT1uZXcgVWludDhBcnJheShbMCwxLDIsMCwxLDIsMiwwLDIsMiwyLDAsMCwwLDAsMCwzLDQsNSwwLDQsNSw1LDAsNSw1LDUsMCwwLDAsMCwwLDYsNyw3LDAsNyw3LDcsMCw3LDcsNywwLDAsMCwwLDAsOCw4LDgsMCw4LDgsOCwwLDgsOCw4LDAsMCwwLDAsMCw4LDgsOCwwLDgsOCw4LDAsOCw4LDhdKTtmdW5jdGlvbiBCaXRNb2RlbChpLG8sYyxsLHUpe3RoaXMud2lkdGg9aTt0aGlzLmhlaWdodD1vO3ZhciBoO2g9IkhIIj09PWM/YToiSEwiPT09Yz9yOnQ7dGhpcy5jb250ZXh0TGFiZWxUYWJsZT1oO3ZhciBkLHA9aSpvO3RoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlPW5ldyBVaW50OEFycmF5KHApO3RoaXMuY29lZmZpY2VudHNTaWduPW5ldyBVaW50OEFycmF5KHApO2Q9dT4xND9uZXcgVWludDMyQXJyYXkocCk6dT42P25ldyBVaW50MTZBcnJheShwKTpuZXcgVWludDhBcnJheShwKTt0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlPWQ7dGhpcy5wcm9jZXNzaW5nRmxhZ3M9bmV3IFVpbnQ4QXJyYXkocCk7dmFyIG09bmV3IFVpbnQ4QXJyYXkocCk7aWYoMCE9PWwpZm9yKHZhciBnPTA7ZzxwO2crKyltW2ddPWw7dGhpcy5iaXRzRGVjb2RlZD1tO3RoaXMucmVzZXQoKX1CaXRNb2RlbC5wcm90b3R5cGU9e3NldERlY29kZXI6ZnVuY3Rpb24gQml0TW9kZWxfc2V0RGVjb2Rlcih0KXt0aGlzLmRlY29kZXI9dH0scmVzZXQ6ZnVuY3Rpb24gQml0TW9kZWxfcmVzZXQoKXt0aGlzLmNvbnRleHRzPW5ldyBJbnQ4QXJyYXkoMTkpO3RoaXMuY29udGV4dHNbMF09ODt0aGlzLmNvbnRleHRzWzE3XT05Mjt0aGlzLmNvbnRleHRzWzE4XT02fSxzZXROZWlnaGJvcnNTaWduaWZpY2FuY2U6ZnVuY3Rpb24gQml0TW9kZWxfc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKHQscixhKXt2YXIgaSxvPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLGM9dGhpcy53aWR0aCxsPXRoaXMuaGVpZ2h0LHU9cj4wLGg9cisxPGM7aWYodD4wKXtpPWEtYzt1JiYob1tpLTFdKz0xNik7aCYmKG9baSsxXSs9MTYpO29baV0rPTR9aWYodCsxPGwpe2k9YStjO3UmJihvW2ktMV0rPTE2KTtoJiYob1tpKzFdKz0xNik7b1tpXSs9NH11JiYob1thLTFdKz0xKTtoJiYob1thKzFdKz0xKTtvW2FdfD0xMjh9LHJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzczpmdW5jdGlvbiBCaXRNb2RlbF9ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKXtmb3IodmFyIHQ9dGhpcy5kZWNvZGVyLHI9dGhpcy53aWR0aCxhPXRoaXMuaGVpZ2h0LGk9dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSxvPXRoaXMuY29lZmZpY2VudHNTaWduLGM9dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2UsbD10aGlzLnByb2Nlc3NpbmdGbGFncyx1PXRoaXMuY29udGV4dHMsaD10aGlzLmNvbnRleHRMYWJlbFRhYmxlLGQ9dGhpcy5iaXRzRGVjb2RlZCxwPTA7cDxhO3ArPTQpZm9yKHZhciBtPTA7bTxyO20rKylmb3IodmFyIGc9cCpyK20seT0wO3k8NDt5KyssZys9cil7dmFyIGI9cCt5O2lmKGI+PWEpYnJlYWs7bFtnXSY9LTI7aWYoIWlbZ10mJmNbZ10pe3ZhciB2PWhbY1tnXV07aWYodC5yZWFkQml0KHUsdikpe3ZhciBTPXRoaXMuZGVjb2RlU2lnbkJpdChiLG0sZyk7b1tnXT1TO2lbZ109MTt0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShiLG0sZyk7bFtnXXw9Mn1kW2ddKys7bFtnXXw9MX19fSxkZWNvZGVTaWduQml0OmZ1bmN0aW9uIEJpdE1vZGVsX2RlY29kZVNpZ25CaXQodCxyLGEpe3ZhciBpLG8sYyxsLHUsaCxkPXRoaXMud2lkdGgscD10aGlzLmhlaWdodCxtPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUsZz10aGlzLmNvZWZmaWNlbnRzU2lnbjtsPXI+MCYmMCE9PW1bYS0xXTtpZihyKzE8ZCYmMCE9PW1bYSsxXSl7Yz1nW2ErMV07aT1sPzEtYy0obz1nW2EtMV0pOjEtYy1jfWVsc2UgaT1sPzEtKG89Z1thLTFdKS1vOjA7dmFyIHk9MyppO2w9dD4wJiYwIT09bVthLWRdO2lmKHQrMTxwJiYwIT09bVthK2RdKXtjPWdbYStkXTtpPWw/MS1jLShvPWdbYS1kXSkreToxLWMtYyt5fWVsc2UgaT1sPzEtKG89Z1thLWRdKS1vK3k6eTtpZihpPj0wKXt1PTkraTtoPXRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsdSl9ZWxzZXt1PTktaTtoPTFedGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cyx1KX1yZXR1cm4gaH0scnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3M6ZnVuY3Rpb24gQml0TW9kZWxfcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKXtmb3IodmFyIHQscj10aGlzLmRlY29kZXIsYT10aGlzLndpZHRoLGk9dGhpcy5oZWlnaHQsbz10aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlLGM9dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2UsbD10aGlzLmNvbnRleHRzLHU9dGhpcy5iaXRzRGVjb2RlZCxoPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLGQ9YSppLHA9NCphLG09MDttPGQ7bT10KXt0PU1hdGgubWluKGQsbStwKTtmb3IodmFyIGc9MDtnPGE7ZysrKWZvcih2YXIgeT1tK2c7eTx0O3krPWEpaWYob1t5XSYmMD09KDEmaFt5XSkpe3ZhciBiPTE2O2lmKDAhPSgyJmhbeV0pKXtoW3ldXj0yO2I9MD09PSgxMjcmY1t5XSk/MTU6MTR9dmFyIHY9ci5yZWFkQml0KGwsYik7b1t5XT1vW3ldPDwxfHY7dVt5XSsrO2hbeV18PTF9fX0scnVuQ2xlYW51cFBhc3M6ZnVuY3Rpb24gQml0TW9kZWxfcnVuQ2xlYW51cFBhc3MoKXtmb3IodmFyIHQscj10aGlzLmRlY29kZXIsYT10aGlzLndpZHRoLGk9dGhpcy5oZWlnaHQsbz10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxjPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUsbD10aGlzLmNvZWZmaWNlbnRzU2lnbix1PXRoaXMuY29udGV4dHMsaD10aGlzLmNvbnRleHRMYWJlbFRhYmxlLGQ9dGhpcy5iaXRzRGVjb2RlZCxwPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLG09YSxnPTIqYSx5PTMqYSxiPTA7YjxpO2I9dCl7dD1NYXRoLm1pbihiKzQsaSk7Zm9yKHZhciB2PWIqYSxTPWIrMzxpLGs9MDtrPGE7aysrKXt2YXIgdyxDPXYrayxfPTAseD1DLEE9YjtpZihTJiYwPT09cFtDXSYmMD09PXBbQyttXSYmMD09PXBbQytnXSYmMD09PXBbQyt5XSYmMD09PW9bQ10mJjA9PT1vW0MrbV0mJjA9PT1vW0MrZ10mJjA9PT1vW0MreV0pe2lmKCFyLnJlYWRCaXQodSwxOCkpe2RbQ10rKztkW0MrbV0rKztkW0MrZ10rKztkW0MreV0rKztjb250aW51ZX1pZigwIT09KF89ci5yZWFkQml0KHUsMTcpPDwxfHIucmVhZEJpdCh1LDE3KSkpe0E9YitfO3grPV8qYX13PXRoaXMuZGVjb2RlU2lnbkJpdChBLGsseCk7bFt4XT13O2NbeF09MTt0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShBLGsseCk7cFt4XXw9Mjt4PUM7Zm9yKHZhciBUPWI7VDw9QTtUKysseCs9YSlkW3hdKys7XysrfWZvcihBPWIrXztBPHQ7QSsrLHgrPWEpaWYoIWNbeF0mJjA9PSgxJnBbeF0pKXt2YXIgUj1oW29beF1dO2lmKDE9PT1yLnJlYWRCaXQodSxSKSl7dz10aGlzLmRlY29kZVNpZ25CaXQoQSxrLHgpO2xbeF09dztjW3hdPTE7dGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoQSxrLHgpO3BbeF18PTJ9ZFt4XSsrfX19fSxjaGVja1NlZ21lbnRhdGlvblN5bWJvbDpmdW5jdGlvbiBCaXRNb2RlbF9jaGVja1NlZ21lbnRhdGlvblN5bWJvbCgpe3ZhciB0PXRoaXMuZGVjb2RlcixyPXRoaXMuY29udGV4dHM7aWYoMTAhPT0odC5yZWFkQml0KHIsMTcpPDwzfHQucmVhZEJpdChyLDE3KTw8Mnx0LnJlYWRCaXQociwxNyk8PDF8dC5yZWFkQml0KHIsMTcpKSl0aHJvdyBuZXcgbCgiSW52YWxpZCBzZWdtZW50YXRpb24gc3ltYm9sIil9fTtyZXR1cm4gQml0TW9kZWx9KCksaD1mdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlKCl7ZnVuY3Rpb24gVHJhbnNmb3JtKCl7fVRyYW5zZm9ybS5wcm90b3R5cGUuY2FsY3VsYXRlPWZ1bmN0aW9uIHRyYW5zZm9ybUNhbGN1bGF0ZSh0LHIsYSl7Zm9yKHZhciBpPXRbMF0sbz0xLGM9dC5sZW5ndGg7bzxjO28rKylpPXRoaXMuaXRlcmF0ZShpLHRbb10scixhKTtyZXR1cm4gaX07VHJhbnNmb3JtLnByb3RvdHlwZS5leHRlbmQ9ZnVuY3Rpb24gZXh0ZW5kKHQscixhKXt2YXIgaT1yLTEsbz1yKzEsYz1yK2EtMixsPXIrYTt0W2ktLV09dFtvKytdO3RbbCsrXT10W2MtLV07dFtpLS1dPXRbbysrXTt0W2wrK109dFtjLS1dO3RbaS0tXT10W28rK107dFtsKytdPXRbYy0tXTt0W2ldPXRbb107dFtsXT10W2NdfTtUcmFuc2Zvcm0ucHJvdG90eXBlLml0ZXJhdGU9ZnVuY3Rpb24gVHJhbnNmb3JtX2l0ZXJhdGUodCxyLGEsaSl7dmFyIG8sYyxsLHUsaCxkLHA9dC53aWR0aCxtPXQuaGVpZ2h0LGc9dC5pdGVtcyx5PXIud2lkdGgsYj1yLmhlaWdodCx2PXIuaXRlbXM7Zm9yKGw9MCxvPTA7bzxtO28rKyl7dT0yKm8qeTtmb3IoYz0wO2M8cDtjKyssbCsrLHUrPTIpdlt1XT1nW2xdfWc9dC5pdGVtcz1udWxsO3ZhciBTPW5ldyBGbG9hdDMyQXJyYXkoeSs4KTtpZigxPT09eSl7aWYoMCE9KDEmYSkpZm9yKGQ9MCxsPTA7ZDxiO2QrKyxsKz15KXZbbF0qPS41fWVsc2UgZm9yKGQ9MCxsPTA7ZDxiO2QrKyxsKz15KXtTLnNldCh2LnN1YmFycmF5KGwsbCt5KSw0KTt0aGlzLmV4dGVuZChTLDQseSk7dGhpcy5maWx0ZXIoUyw0LHkpO3Yuc2V0KFMuc3ViYXJyYXkoNCw0K3kpLGwpfXZhciBrPTE2LHc9W107Zm9yKG89MDtvPGs7bysrKXcucHVzaChuZXcgRmxvYXQzMkFycmF5KGIrOCkpO3ZhciBDLF89MDt0PTQrYjtpZigxPT09Yil7aWYoMCE9KDEmaSkpZm9yKGg9MDtoPHk7aCsrKXZbaF0qPS41fWVsc2UgZm9yKGg9MDtoPHk7aCsrKXtpZigwPT09Xyl7az1NYXRoLm1pbih5LWgsayk7Zm9yKGw9aCx1PTQ7dTx0O2wrPXksdSsrKWZvcihDPTA7QzxrO0MrKyl3W0NdW3VdPXZbbCtDXTtfPWt9dmFyIHg9d1stLV9dO3RoaXMuZXh0ZW5kKHgsNCxiKTt0aGlzLmZpbHRlcih4LDQsYik7aWYoMD09PV8pe2w9aC1rKzE7Zm9yKHU9NDt1PHQ7bCs9eSx1KyspZm9yKEM9MDtDPGs7QysrKXZbbCtDXT13W0NdW3VdfX1yZXR1cm57d2lkdGg6eSxoZWlnaHQ6YixpdGVtczp2fX07cmV0dXJuIFRyYW5zZm9ybX0oKSxkPWZ1bmN0aW9uIElycmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKXtmdW5jdGlvbiBJcnJldmVyc2libGVUcmFuc2Zvcm0oKXtoLmNhbGwodGhpcyl9SXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGgucHJvdG90eXBlKTtJcnJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbiBpcnJldmVyc2libGVUcmFuc2Zvcm1GaWx0ZXIodCxyLGEpe3ZhciBpLG8sYyxsLHU9YT4+MSxoPS0xLjU4NjEzNDM0MjA1OTkyNCxkPS0uMDUyOTgwMTE4NTcyOTYxLHA9Ljg4MjkxMTA3NTUzMDkzNCxtPS40NDM1MDY4NTIwNDM5NzEsZz0xLjIzMDE3NDEwNDkxNDAwMTtpPShyfD0wKS0zO2ZvcihvPXUrNDtvLS07aSs9Mil0W2ldKj0uODEyODkzMDY2MTE1OTYwOTtjPW0qdFsoaT1yLTIpLTFdO2ZvcihvPXUrMztvLS07aSs9Mil7bD1tKnRbaSsxXTt0W2ldPWcqdFtpXS1jLWw7aWYoIW8tLSlicmVhaztjPW0qdFsoaSs9MikrMV07dFtpXT1nKnRbaV0tYy1sfWM9cCp0WyhpPXItMSktMV07Zm9yKG89dSsyO28tLTtpKz0yKXtsPXAqdFtpKzFdO3RbaV0tPWMrbDtpZighby0tKWJyZWFrO2M9cCp0WyhpKz0yKSsxXTt0W2ldLT1jK2x9Yz1kKnRbKGk9ciktMV07Zm9yKG89dSsxO28tLTtpKz0yKXtsPWQqdFtpKzFdO3RbaV0tPWMrbDtpZighby0tKWJyZWFrO2M9ZCp0WyhpKz0yKSsxXTt0W2ldLT1jK2x9aWYoMCE9PXUpe2M9aCp0WyhpPXIrMSktMV07Zm9yKG89dTtvLS07aSs9Mil7bD1oKnRbaSsxXTt0W2ldLT1jK2w7aWYoIW8tLSlicmVhaztjPWgqdFsoaSs9MikrMV07dFtpXS09YytsfX19O3JldHVybiBJcnJldmVyc2libGVUcmFuc2Zvcm19KCkscD1mdW5jdGlvbiBSZXZlcnNpYmxlVHJhbnNmb3JtQ2xvc3VyZSgpe2Z1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm0oKXtoLmNhbGwodGhpcyl9UmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShoLnByb3RvdHlwZSk7UmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uIHJldmVyc2libGVUcmFuc2Zvcm1GaWx0ZXIodCxyLGEpe3ZhciBpLG8sYz1hPj4xO2ZvcihpPXJ8PTAsbz1jKzE7by0tO2krPTIpdFtpXS09dFtpLTFdK3RbaSsxXSsyPj4yO2ZvcihpPXIrMSxvPWM7by0tO2krPTIpdFtpXSs9dFtpLTFdK3RbaSsxXT4+MX07cmV0dXJuIFJldmVyc2libGVUcmFuc2Zvcm19KCk7cmV0dXJuIEpweEltYWdlfSgpO3IuSnB4SW1hZ2U9dX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5jYWxjdWxhdGVTSEE1MTI9ci5jYWxjdWxhdGVTSEEzODQ9ci5jYWxjdWxhdGVTSEEyNTY9ci5jYWxjdWxhdGVNRDU9ci5QREYyMD1yLlBERjE3PXIuQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeT1yLkFSQ0ZvdXJDaXBoZXI9ci5BRVMyNTZDaXBoZXI9ci5BRVMxMjhDaXBoZXI9dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIwMiksYz1hKDIwOSk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgbD1mdW5jdGlvbiBBUkNGb3VyQ2lwaGVyQ2xvc3VyZSgpe2Z1bmN0aW9uIEFSQ0ZvdXJDaXBoZXIodCl7dGhpcy5hPTA7dGhpcy5iPTA7dmFyIHIsYSxpPW5ldyBVaW50OEFycmF5KDI1Niksbz0wLGM9dC5sZW5ndGg7Zm9yKHI9MDtyPDI1NjsrK3IpaVtyXT1yO2ZvcihyPTA7cjwyNTY7KytyKXtvPW8rKGE9aVtyXSkrdFtyJWNdJjI1NTtpW3JdPWlbb107aVtvXT1hfXRoaXMucz1pfUFSQ0ZvdXJDaXBoZXIucHJvdG90eXBlPXtlbmNyeXB0QmxvY2s6ZnVuY3Rpb24gQVJDRm91ckNpcGhlcl9lbmNyeXB0QmxvY2sodCl7dmFyIHIsYSxpLG89dC5sZW5ndGgsYz10aGlzLmEsbD10aGlzLmIsdT10aGlzLnMsaD1uZXcgVWludDhBcnJheShvKTtmb3Iocj0wO3I8bzsrK3Ipe2k9dVtsPWwrKGE9dVtjPWMrMSYyNTVdKSYyNTVdO3VbY109aTt1W2xdPWE7aFtyXT10W3JdXnVbYStpJjI1NV19dGhpcy5hPWM7dGhpcy5iPWw7cmV0dXJuIGh9fTtBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5kZWNyeXB0QmxvY2s9QVJDRm91ckNpcGhlci5wcm90b3R5cGUuZW5jcnlwdEJsb2NrO0FSQ0ZvdXJDaXBoZXIucHJvdG90eXBlLmVuY3J5cHQ9QVJDRm91ckNpcGhlci5wcm90b3R5cGUuZW5jcnlwdEJsb2NrO3JldHVybiBBUkNGb3VyQ2lwaGVyfSgpO3IuQVJDRm91ckNpcGhlcj1sO3ZhciB1PWZ1bmN0aW9uIGNhbGN1bGF0ZU1ENUNsb3N1cmUoKXt2YXIgdD1uZXcgVWludDhBcnJheShbNywxMiwxNywyMiw3LDEyLDE3LDIyLDcsMTIsMTcsMjIsNywxMiwxNywyMiw1LDksMTQsMjAsNSw5LDE0LDIwLDUsOSwxNCwyMCw1LDksMTQsMjAsNCwxMSwxNiwyMyw0LDExLDE2LDIzLDQsMTEsMTYsMjMsNCwxMSwxNiwyMyw2LDEwLDE1LDIxLDYsMTAsMTUsMjEsNiwxMCwxNSwyMSw2LDEwLDE1LDIxXSkscj1uZXcgSW50MzJBcnJheShbLTY4MDg3NjkzNiwtMzg5NTY0NTg2LDYwNjEwNTgxOSwtMTA0NDUyNTMzMCwtMTc2NDE4ODk3LDEyMDAwODA0MjYsLTE0NzMyMzEzNDEsLTQ1NzA1OTgzLDE3NzAwMzU0MTYsLTE5NTg0MTQ0MTcsLTQyMDYzLC0xOTkwNDA0MTYyLDE4MDQ2MDM2ODIsLTQwMzQxMTAxLC0xNTAyMDAyMjkwLDEyMzY1MzUzMjksLTE2NTc5NjUxMCwtMTA2OTUwMTYzMiw2NDM3MTc3MTMsLTM3Mzg5NzMwMiwtNzAxNTU4NjkxLDM4MDE2MDgzLC02NjA0NzgzMzUsLTQwNTUzNzg0OCw1Njg0NDY0MzgsLTEwMTk4MDM2OTAsLTE4NzM2Mzk2MSwxMTYzNTMxNTAxLC0xNDQ0NjgxNDY3LC01MTQwMzc4NCwxNzM1MzI4NDczLC0xOTI2NjA3NzM0LC0zNzg1NTgsLTIwMjI1NzQ0NjMsMTgzOTAzMDU2MiwtMzUzMDk1NTYsLTE1MzA5OTIwNjAsMTI3Mjg5MzM1MywtMTU1NDk3NjMyLC0xMDk0NzMwNjQwLDY4MTI3OTE3NCwtMzU4NTM3MjIyLC03MjI1MjE5NzksNzYwMjkxODksLTY0MDM2NDQ4NywtNDIxODE1ODM1LDUzMDc0MjUyMCwtOTk1MzM4NjUxLC0xOTg2MzA4NDQsMTEyNjg5MTQxNSwtMTQxNjM1NDkwNSwtNTc0MzQwNTUsMTcwMDQ4NTU3MSwtMTg5NDk4NjYwNiwtMTA1MTUyMywtMjA1NDkyMjc5OSwxODczMzEzMzU5LC0zMDYxMTc0NCwtMTU2MDE5ODM4MCwxMzA5MTUxNjQ5LC0xNDU1MjMwNzAsLTExMjAyMTAzNzksNzE4Nzg3MjU5LC0zNDM0ODU1NTFdKTtyZXR1cm4gZnVuY3Rpb24gaGFzaChhLGksbyl7dmFyIGMsbCx1LGg9MTczMjU4NDE5MyxkPS0yNzE3MzM4NzkscD0tMTczMjU4NDE5NCxtPTI3MTczMzg3OCxnPW8rNzImLTY0LHk9bmV3IFVpbnQ4QXJyYXkoZyk7Zm9yKGM9MDtjPG87KytjKXlbY109YVtpKytdO3lbYysrXT0xMjg7dT1nLTg7Zm9yKDtjPHU7KXlbYysrXT0wO3lbYysrXT1vPDwzJjI1NTt5W2MrK109bz4+NSYyNTU7eVtjKytdPW8+PjEzJjI1NTt5W2MrK109bz4+MjEmMjU1O3lbYysrXT1vPj4+MjkmMjU1O3lbYysrXT0wO3lbYysrXT0wO3lbYysrXT0wO3ZhciBiPW5ldyBJbnQzMkFycmF5KDE2KTtmb3IoYz0wO2M8Zzspe2ZvcihsPTA7bDwxNjsrK2wsYys9NCliW2xdPXlbY118eVtjKzFdPDw4fHlbYysyXTw8MTZ8eVtjKzNdPDwyNDt2YXIgdixTLGs9aCx3PWQsQz1wLF89bTtmb3IobD0wO2w8NjQ7KytsKXtpZihsPDE2KXt2PXcmQ3x+dyZfO1M9bH1lbHNlIGlmKGw8MzIpe3Y9XyZ3fH5fJkM7Uz01KmwrMSYxNX1lbHNlIGlmKGw8NDgpe3Y9d15DXl87Uz0zKmwrNSYxNX1lbHNle3Y9Q14od3x+Xyk7Uz03KmwmMTV9dmFyIHg9XyxBPWsrdityW2xdK2JbU118MCxUPXRbbF07Xz1DO0M9dzt3PXcrKEE8PFR8QT4+PjMyLVQpfDA7az14fWg9aCtrfDA7ZD1kK3d8MDtwPXArQ3wwO209bStffDB9cmV0dXJuIG5ldyBVaW50OEFycmF5KFsyNTUmaCxoPj44JjI1NSxoPj4xNiYyNTUsaD4+PjI0JjI1NSwyNTUmZCxkPj44JjI1NSxkPj4xNiYyNTUsZD4+PjI0JjI1NSwyNTUmcCxwPj44JjI1NSxwPj4xNiYyNTUscD4+PjI0JjI1NSwyNTUmbSxtPj44JjI1NSxtPj4xNiYyNTUsbT4+PjI0JjI1NV0pfX0oKTtyLmNhbGN1bGF0ZU1ENT11O3ZhciBoPWZ1bmN0aW9uIFdvcmQ2NENsb3N1cmUoKXtmdW5jdGlvbiBXb3JkNjQodCxyKXt0aGlzLmhpZ2g9MHx0O3RoaXMubG93PTB8cn1Xb3JkNjQucHJvdG90eXBlPXthbmQ6ZnVuY3Rpb24gV29yZDY0X2FuZCh0KXt0aGlzLmhpZ2gmPXQuaGlnaDt0aGlzLmxvdyY9dC5sb3d9LHhvcjpmdW5jdGlvbiBXb3JkNjRfeG9yKHQpe3RoaXMuaGlnaF49dC5oaWdoO3RoaXMubG93Xj10Lmxvd30sb3I6ZnVuY3Rpb24gV29yZDY0X29yKHQpe3RoaXMuaGlnaHw9dC5oaWdoO3RoaXMubG93fD10Lmxvd30sc2hpZnRSaWdodDpmdW5jdGlvbiBXb3JkNjRfc2hpZnRSaWdodCh0KXtpZih0Pj0zMil7dGhpcy5sb3c9dGhpcy5oaWdoPj4+dC0zMnwwO3RoaXMuaGlnaD0wfWVsc2V7dGhpcy5sb3c9dGhpcy5sb3c+Pj50fHRoaXMuaGlnaDw8MzItdDt0aGlzLmhpZ2g9dGhpcy5oaWdoPj4+dHwwfX0sc2hpZnRMZWZ0OmZ1bmN0aW9uIFdvcmQ2NF9zaGlmdExlZnQodCl7aWYodD49MzIpe3RoaXMuaGlnaD10aGlzLmxvdzw8dC0zMjt0aGlzLmxvdz0wfWVsc2V7dGhpcy5oaWdoPXRoaXMuaGlnaDw8dHx0aGlzLmxvdz4+PjMyLXQ7dGhpcy5sb3c9dGhpcy5sb3c8PHR9fSxyb3RhdGVSaWdodDpmdW5jdGlvbiBXb3JkNjRfcm90YXRlUmlnaHQodCl7dmFyIHIsYTtpZigzMiZ0KXthPXRoaXMubG93O3I9dGhpcy5oaWdofWVsc2V7cj10aGlzLmxvdzthPXRoaXMuaGlnaH10Jj0zMTt0aGlzLmxvdz1yPj4+dHxhPDwzMi10O3RoaXMuaGlnaD1hPj4+dHxyPDwzMi10fSxub3Q6ZnVuY3Rpb24gV29yZDY0X25vdCgpe3RoaXMuaGlnaD1+dGhpcy5oaWdoO3RoaXMubG93PX50aGlzLmxvd30sYWRkOmZ1bmN0aW9uIFdvcmQ2NF9hZGQodCl7dmFyIHI9KHRoaXMubG93Pj4+MCkrKHQubG93Pj4+MCksYT0odGhpcy5oaWdoPj4+MCkrKHQuaGlnaD4+PjApO3I+NDI5NDk2NzI5NSYmKGErPTEpO3RoaXMubG93PTB8cjt0aGlzLmhpZ2g9MHxhfSxjb3B5VG86ZnVuY3Rpb24gV29yZDY0X2NvcHlUbyh0LHIpe3Rbcl09dGhpcy5oaWdoPj4+MjQmMjU1O3RbcisxXT10aGlzLmhpZ2g+PjE2JjI1NTt0W3IrMl09dGhpcy5oaWdoPj44JjI1NTt0W3IrM109MjU1JnRoaXMuaGlnaDt0W3IrNF09dGhpcy5sb3c+Pj4yNCYyNTU7dFtyKzVdPXRoaXMubG93Pj4xNiYyNTU7dFtyKzZdPXRoaXMubG93Pj44JjI1NTt0W3IrN109MjU1JnRoaXMubG93fSxhc3NpZ246ZnVuY3Rpb24gV29yZDY0X2Fzc2lnbih0KXt0aGlzLmhpZ2g9dC5oaWdoO3RoaXMubG93PXQubG93fX07cmV0dXJuIFdvcmQ2NH0oKSxkPWZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTI1NkNsb3N1cmUoKXtmdW5jdGlvbiByb3RyKHQscil7cmV0dXJuIHQ+Pj5yfHQ8PDMyLXJ9ZnVuY3Rpb24gY2godCxyLGEpe3JldHVybiB0JnJefnQmYX1mdW5jdGlvbiBtYWoodCxyLGEpe3JldHVybiB0JnJedCZhXnImYX1mdW5jdGlvbiBzaWdtYSh0KXtyZXR1cm4gcm90cih0LDIpXnJvdHIodCwxMylecm90cih0LDIyKX1mdW5jdGlvbiBzaWdtYVByaW1lKHQpe3JldHVybiByb3RyKHQsNilecm90cih0LDExKV5yb3RyKHQsMjUpfWZ1bmN0aW9uIGxpdHRsZVNpZ21hKHQpe3JldHVybiByb3RyKHQsNylecm90cih0LDE4KV50Pj4+M312YXIgdD1bMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XTtyZXR1cm4gZnVuY3Rpb24gaGFzaChyLGEsaSl7dmFyIG8sYyxsLHU9MTc3OTAzMzcwMyxoPTMxNDQxMzQyNzcsZD0xMDEzOTA0MjQyLHA9Mjc3MzQ4MDc2MixtPTEzNTk4OTMxMTksZz0yNjAwODIyOTI0LHk9NTI4NzM0NjM1LGI9MTU0MTQ1OTIyNSx2PTY0Kk1hdGguY2VpbCgoaSs5KS82NCksUz1uZXcgVWludDhBcnJheSh2KTtmb3Iobz0wO288aTsrK28pU1tvXT1yW2ErK107U1tvKytdPTEyODtsPXYtODtmb3IoO288bDspU1tvKytdPTA7U1tvKytdPTA7U1tvKytdPTA7U1tvKytdPTA7U1tvKytdPWk+Pj4yOSYyNTU7U1tvKytdPWk+PjIxJjI1NTtTW28rK109aT4+MTMmMjU1O1NbbysrXT1pPj41JjI1NTtTW28rK109aTw8MyYyNTU7dmFyIGssdz1uZXcgVWludDMyQXJyYXkoNjQpO2ZvcihvPTA7bzx2Oyl7Zm9yKGM9MDtjPDE2OysrYyl7d1tjXT1TW29dPDwyNHxTW28rMV08PDE2fFNbbysyXTw8OHxTW28rM107bys9NH1mb3IoYz0xNjtjPDY0OysrYyl3W2NdPShyb3RyKGs9d1tjLTJdLDE3KV5yb3RyKGssMTkpXms+Pj4xMCkrd1tjLTddK2xpdHRsZVNpZ21hKHdbYy0xNV0pK3dbYy0xNl18MDt2YXIgQyxfLHg9dSxBPWgsVD1kLFI9cCxJPW0sUD1nLE89eSxFPWI7Zm9yKGM9MDtjPDY0OysrYyl7Qz1FK3NpZ21hUHJpbWUoSSkrY2goSSxQLE8pK3RbY10rd1tjXTtfPXNpZ21hKHgpK21haih4LEEsVCk7RT1PO089UDtQPUk7ST1SK0N8MDtSPVQ7VD1BO0E9eDt4PUMrX3wwfXU9dSt4fDA7aD1oK0F8MDtkPWQrVHwwO3A9cCtSfDA7bT1tK0l8MDtnPWcrUHwwO3k9eStPfDA7Yj1iK0V8MH1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW3U+PjI0JjI1NSx1Pj4xNiYyNTUsdT4+OCYyNTUsMjU1JnUsaD4+MjQmMjU1LGg+PjE2JjI1NSxoPj44JjI1NSwyNTUmaCxkPj4yNCYyNTUsZD4+MTYmMjU1LGQ+PjgmMjU1LDI1NSZkLHA+PjI0JjI1NSxwPj4xNiYyNTUscD4+OCYyNTUsMjU1JnAsbT4+MjQmMjU1LG0+PjE2JjI1NSxtPj44JjI1NSwyNTUmbSxnPj4yNCYyNTUsZz4+MTYmMjU1LGc+PjgmMjU1LDI1NSZnLHk+PjI0JjI1NSx5Pj4xNiYyNTUseT4+OCYyNTUsMjU1JnksYj4+MjQmMjU1LGI+PjE2JjI1NSxiPj44JjI1NSwyNTUmYl0pfX0oKTtyLmNhbGN1bGF0ZVNIQTI1Nj1kO3ZhciBwPWZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTUxMkNsb3N1cmUoKXtmdW5jdGlvbiBjaCh0LHIsYSxpLG8pe3QuYXNzaWduKHIpO3QuYW5kKGEpO28uYXNzaWduKHIpO28ubm90KCk7by5hbmQoaSk7dC54b3Iobyl9ZnVuY3Rpb24gbWFqKHQscixhLGksbyl7dC5hc3NpZ24ocik7dC5hbmQoYSk7by5hc3NpZ24ocik7by5hbmQoaSk7dC54b3Iobyk7by5hc3NpZ24oYSk7by5hbmQoaSk7dC54b3Iobyl9ZnVuY3Rpb24gc2lnbWEodCxyLGEpe3QuYXNzaWduKHIpO3Qucm90YXRlUmlnaHQoMjgpO2EuYXNzaWduKHIpO2Eucm90YXRlUmlnaHQoMzQpO3QueG9yKGEpO2EuYXNzaWduKHIpO2Eucm90YXRlUmlnaHQoMzkpO3QueG9yKGEpfWZ1bmN0aW9uIHNpZ21hUHJpbWUodCxyLGEpe3QuYXNzaWduKHIpO3Qucm90YXRlUmlnaHQoMTQpO2EuYXNzaWduKHIpO2Eucm90YXRlUmlnaHQoMTgpO3QueG9yKGEpO2EuYXNzaWduKHIpO2Eucm90YXRlUmlnaHQoNDEpO3QueG9yKGEpfWZ1bmN0aW9uIGxpdHRsZVNpZ21hKHQscixhKXt0LmFzc2lnbihyKTt0LnJvdGF0ZVJpZ2h0KDEpO2EuYXNzaWduKHIpO2Eucm90YXRlUmlnaHQoOCk7dC54b3IoYSk7YS5hc3NpZ24ocik7YS5zaGlmdFJpZ2h0KDcpO3QueG9yKGEpfWZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUodCxyLGEpe3QuYXNzaWduKHIpO3Qucm90YXRlUmlnaHQoMTkpO2EuYXNzaWduKHIpO2Eucm90YXRlUmlnaHQoNjEpO3QueG9yKGEpO2EuYXNzaWduKHIpO2Euc2hpZnRSaWdodCg2KTt0LnhvcihhKX12YXIgdD1bbmV3IGgoMTExNjM1MjQwOCwzNjA5NzY3NDU4KSxuZXcgaCgxODk5NDQ3NDQxLDYwMjg5MTcyNSksbmV3IGgoMzA0OTMyMzQ3MSwzOTY0NDg0Mzk5KSxuZXcgaCgzOTIxMDA5NTczLDIxNzMyOTU1NDgpLG5ldyBoKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxuZXcgaCgxNTA4OTcwOTkzLDMwNTM4MzQyNjUpLG5ldyBoKDI0NTM2MzU3NDgsMjkzNzY3MTU3OSksbmV3IGgoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxuZXcgaCgzNjI0MzgxMDgwLDI3MzQ4ODMzOTQpLG5ldyBoKDMxMDU5ODQwMSwxMTY0OTk2NTQyKSxuZXcgaCg2MDcyMjUyNzgsMTMyMzYxMDc2NCksbmV3IGgoMTQyNjg4MTk4NywzNTkwMzA0OTk0KSxuZXcgaCgxOTI1MDc4Mzg4LDQwNjgxODIzODMpLG5ldyBoKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxuZXcgaCgyNjE0ODg4MTAzLDYzMzgwMzMxNyksbmV3IGgoMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSxuZXcgaCgzODM1MzkwNDAxLDI2NjY2MTM0NTgpLG5ldyBoKDQwMjIyMjQ3NzQsOTQ0NzExMTM5KSxuZXcgaCgyNjQzNDcwNzgsMjM0MTI2Mjc3MyksbmV3IGgoNjA0ODA3NjI4LDIwMDc4MDA5MzMpLG5ldyBoKDc3MDI1NTk4MywxNDk1OTkwOTAxKSxuZXcgaCgxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLG5ldyBoKDE1NTUwODE2OTIsMzE3NTIxODEzMiksbmV3IGgoMTk5NjA2NDk4NiwyMTk4OTUwODM3KSxuZXcgaCgyNTU0MjIwODgyLDM5OTk3MTkzMzkpLG5ldyBoKDI4MjE4MzQzNDksNzY2Nzg0MDE2KSxuZXcgaCgyOTUyOTk2ODA4LDI1NjY1OTQ4NzkpLG5ldyBoKDMyMTAzMTM2NzEsMzIwMzMzNzk1NiksbmV3IGgoMzMzNjU3MTg5MSwxMDM0NDU3MDI2KSxuZXcgaCgzNTg0NTI4NzExLDI0NjY5NDg5MDEpLG5ldyBoKDExMzkyNjk5MywzNzU4MzI2MzgzKSxuZXcgaCgzMzgyNDE4OTUsMTY4NzE3OTM2KSxuZXcgaCg2NjYzMDcyMDUsMTE4ODE3OTk2NCksbmV3IGgoNzczNTI5OTEyLDE1NDYwNDU3MzQpLG5ldyBoKDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSksbmV3IGgoMTM5NjE4MjI5MSwyNjQzODMzODIzKSxuZXcgaCgxNjk1MTgzNzAwLDIzNDM1MjczOTApLG5ldyBoKDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCksbmV3IGgoMjE3NzAyNjM1MCwxMjA2NzU5MTQyKSxuZXcgaCgyNDU2OTU2MDM3LDM0NDA3NzYyNyksbmV3IGgoMjczMDQ4NTkyMSwxMjkwODYzNDYwKSxuZXcgaCgyODIwMzAyNDExLDMxNTg0NTQyNzMpLG5ldyBoKDMyNTk3MzA4MDAsMzUwNTk1MjY1NyksbmV3IGgoMzM0NTc2NDc3MSwxMDYyMTcwMDgpLG5ldyBoKDM1MTYwNjU4MTcsMzYwNjAwODM0NCksbmV3IGgoMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSxuZXcgaCg0MDk0NTcxOTA5LDE0NjcwMzE1OTQpLG5ldyBoKDI3NTQyMzM0NCw4NTExNjk3MjApLG5ldyBoKDQzMDIyNzczNCwzMTAwODIzNzUyKSxuZXcgaCg1MDY5NDg2MTYsMTM2MzI1ODE5NSksbmV3IGgoNjU5MDYwNTU2LDM3NTA2ODU1OTMpLG5ldyBoKDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSxuZXcgaCg5NTgxMzk1NzEsMzMxODMwNzQyNyksbmV3IGgoMTMyMjgyMjIxOCwzODEyNzIzNDAzKSxuZXcgaCgxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLG5ldyBoKDE3NDc4NzM3NzksMzYwMjAzNjg5OSksbmV3IGgoMTk1NTU2MjIyMiwxNTc1OTkwMDEyKSxuZXcgaCgyMDI0MTA0ODE1LDExMjU1OTI5MjgpLG5ldyBoKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksbmV3IGgoMjM2MTg1MjQyNCw0NDI3NzYwNDQpLG5ldyBoKDI0Mjg0MzY0NzQsNTkzNjk4MzQ0KSxuZXcgaCgyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLG5ldyBoKDMyMDQwMzE0NzksMjk5OTM1MTU3MyksbmV3IGgoMzMyOTMyNTI5OCwzODE1OTIwNDI3KSxuZXcgaCgzMzkxNTY5NjE0LDM5MjgzODM5MDApLG5ldyBoKDM1MTUyNjcyNzEsNTY2MjgwNzExKSxuZXcgaCgzOTQwMTg3NjA2LDM0NTQwNjk1MzQpLG5ldyBoKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksbmV3IGgoMTE2NDE4NDc0LDE5MTQxMzg1NTQpLG5ldyBoKDE3NDI5MjQyMSwyNzMxMDU1MjcwKSxuZXcgaCgyODkzODAzNTYsMzIwMzk5MzAwNiksbmV3IGgoNDYwMzkzMjY5LDMyMDYyMDMxNSksbmV3IGgoNjg1NDcxNzMzLDU4NzQ5NjgzNiksbmV3IGgoODUyMTQyOTcxLDEwODY3OTI4NTEpLG5ldyBoKDEwMTcwMzYyOTgsMzY1NTQzMTAwKSxuZXcgaCgxMTI2MDAwNTgwLDI2MTgyOTc2NzYpLG5ldyBoKDEyODgwMzM0NzAsMzQwOTg1NTE1OCksbmV3IGgoMTUwMTUwNTk0OCw0MjM0NTA5ODY2KSxuZXcgaCgxNjA3MTY3OTE1LDk4NzE2NzQ2OCksbmV3IGgoMTgxNjQwMjMxNiwxMjQ2MTg5NTkxKV07cmV0dXJuIGZ1bmN0aW9uIGhhc2gocixhLGksbyl7dmFyIGMsbCx1LGQscCxtLGcseTtpZihvPSEhbyl7Yz1uZXcgaCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpO2w9bmV3IGgoMTY1NDI3MDI1MCw5MTQxNTA2NjMpO3U9bmV3IGgoMjQzODUyOTM3MCw4MTI3MDI5OTkpO2Q9bmV3IGgoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpO3A9bmV3IGgoMTczMTQwNTQxNSw0MjkwNzc1ODU3KTttPW5ldyBoKDIzOTQxODAyMzEsMTc1MDYwMzAyNSk7Zz1uZXcgaCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpO3k9bmV3IGgoMTIwMzA2MjgxMywzMjA0MDc1NDI4KX1lbHNle2M9bmV3IGgoMTc3OTAzMzcwMyw0MDg5MjM1NzIwKTtsPW5ldyBoKDMxNDQxMzQyNzcsMjIyNzg3MzU5NSk7dT1uZXcgaCgxMDEzOTA0MjQyLDQyNzExNzU3MjMpO2Q9bmV3IGgoMjc3MzQ4MDc2MiwxNTk1NzUwMTI5KTtwPW5ldyBoKDEzNTk4OTMxMTksMjkxNzU2NTEzNyk7bT1uZXcgaCgyNjAwODIyOTI0LDcyNTUxMTE5OSk7Zz1uZXcgaCg1Mjg3MzQ2MzUsNDIxNTM4OTU0Nyk7eT1uZXcgaCgxNTQxNDU5MjI1LDMyNzAzMzIwOSl9dmFyIGIsdixTLGs9MTI4Kk1hdGguY2VpbCgoaSsxNykvMTI4KSx3PW5ldyBVaW50OEFycmF5KGspO2ZvcihiPTA7YjxpOysrYil3W2JdPXJbYSsrXTt3W2IrK109MTI4O1M9ay0xNjtmb3IoO2I8Uzspd1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPTA7d1tiKytdPWk+Pj4yOSYyNTU7d1tiKytdPWk+PjIxJjI1NTt3W2IrK109aT4+MTMmMjU1O3dbYisrXT1pPj41JjI1NTt3W2IrK109aTw8MyYyNTU7dmFyIEM9bmV3IEFycmF5KDgwKTtmb3IoYj0wO2I8ODA7YisrKUNbYl09bmV3IGgoMCwwKTt2YXIgXyx4LEE9bmV3IGgoMCwwKSxUPW5ldyBoKDAsMCksUj1uZXcgaCgwLDApLEk9bmV3IGgoMCwwKSxQPW5ldyBoKDAsMCksTz1uZXcgaCgwLDApLEU9bmV3IGgoMCwwKSxCPW5ldyBoKDAsMCksRD1uZXcgaCgwLDApLE09bmV3IGgoMCwwKSxMPW5ldyBoKDAsMCksTj1uZXcgaCgwLDApO2ZvcihiPTA7YjxrOyl7Zm9yKHY9MDt2PDE2Oysrdil7Q1t2XS5oaWdoPXdbYl08PDI0fHdbYisxXTw8MTZ8d1tiKzJdPDw4fHdbYiszXTtDW3ZdLmxvdz13W2IrNF08PDI0fHdbYis1XTw8MTZ8d1tiKzZdPDw4fHdbYis3XTtiKz04fWZvcih2PTE2O3Y8ODA7Kyt2KXtsaXR0bGVTaWdtYVByaW1lKF89Q1t2XSxDW3YtMl0sTik7Xy5hZGQoQ1t2LTddKTtsaXR0bGVTaWdtYShMLENbdi0xNV0sTik7Xy5hZGQoTCk7Xy5hZGQoQ1t2LTE2XSl9QS5hc3NpZ24oYyk7VC5hc3NpZ24obCk7Ui5hc3NpZ24odSk7SS5hc3NpZ24oZCk7UC5hc3NpZ24ocCk7Ty5hc3NpZ24obSk7RS5hc3NpZ24oZyk7Qi5hc3NpZ24oeSk7Zm9yKHY9MDt2PDgwOysrdil7RC5hc3NpZ24oQik7c2lnbWFQcmltZShMLFAsTik7RC5hZGQoTCk7Y2goTCxQLE8sRSxOKTtELmFkZChMKTtELmFkZCh0W3ZdKTtELmFkZChDW3ZdKTtzaWdtYShNLEEsTik7bWFqKEwsQSxULFIsTik7TS5hZGQoTCk7Xz1CO0I9RTtFPU87Tz1QO0kuYWRkKEQpO1A9STtJPVI7Uj1UO1Q9QTtfLmFzc2lnbihEKTtfLmFkZChNKTtBPV99Yy5hZGQoQSk7bC5hZGQoVCk7dS5hZGQoUik7ZC5hZGQoSSk7cC5hZGQoUCk7bS5hZGQoTyk7Zy5hZGQoRSk7eS5hZGQoQil9aWYobyl7eD1uZXcgVWludDhBcnJheSg0OCk7Yy5jb3B5VG8oeCwwKTtsLmNvcHlUbyh4LDgpO3UuY29weVRvKHgsMTYpO2QuY29weVRvKHgsMjQpO3AuY29weVRvKHgsMzIpO20uY29weVRvKHgsNDApfWVsc2V7eD1uZXcgVWludDhBcnJheSg2NCk7Yy5jb3B5VG8oeCwwKTtsLmNvcHlUbyh4LDgpO3UuY29weVRvKHgsMTYpO2QuY29weVRvKHgsMjQpO3AuY29weVRvKHgsMzIpO20uY29weVRvKHgsNDApO2cuY29weVRvKHgsNDgpO3kuY29weVRvKHgsNTYpfXJldHVybiB4fX0oKTtyLmNhbGN1bGF0ZVNIQTUxMj1wO3ZhciBtPWZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTM4NENsb3N1cmUoKXtyZXR1cm4gZnVuY3Rpb24gaGFzaCh0LHIsYSl7cmV0dXJuIHAodCxyLGEsITApfX0oKTtyLmNhbGN1bGF0ZVNIQTM4ND1tO3ZhciBnPWZ1bmN0aW9uIE51bGxDaXBoZXJDbG9zdXJlKCl7ZnVuY3Rpb24gTnVsbENpcGhlcigpe31OdWxsQ2lwaGVyLnByb3RvdHlwZT17ZGVjcnlwdEJsb2NrOmZ1bmN0aW9uIE51bGxDaXBoZXJfZGVjcnlwdEJsb2NrKHQpe3JldHVybiB0fSxlbmNyeXB0OmZ1bmN0aW9uIE51bGxDaXBoZXJfZW5jcnlwdCh0KXtyZXR1cm4gdH19O3JldHVybiBOdWxsQ2lwaGVyfSgpLHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBRVNCYXNlQ2lwaGVyKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQUVTQmFzZUNpcGhlcik7dGhpcy5jb25zdHJ1Y3Rvcj09PUFFU0Jhc2VDaXBoZXImJigwLGkudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBBRVNCYXNlQ2lwaGVyLiIpO3RoaXMuX3M9bmV3IFVpbnQ4QXJyYXkoWzk5LDEyNCwxMTksMTIzLDI0MiwxMDcsMTExLDE5Nyw0OCwxLDEwMyw0MywyNTQsMjE1LDE3MSwxMTgsMjAyLDEzMCwyMDEsMTI1LDI1MCw4OSw3MSwyNDAsMTczLDIxMiwxNjIsMTc1LDE1NiwxNjQsMTE0LDE5MiwxODMsMjUzLDE0NywzOCw1NCw2MywyNDcsMjA0LDUyLDE2NSwyMjksMjQxLDExMywyMTYsNDksMjEsNCwxOTksMzUsMTk1LDI0LDE1MCw1LDE1NCw3LDE4LDEyOCwyMjYsMjM1LDM5LDE3OCwxMTcsOSwxMzEsNDQsMjYsMjcsMTEwLDkwLDE2MCw4Miw1OSwyMTQsMTc5LDQxLDIyNyw0NywxMzIsODMsMjA5LDAsMjM3LDMyLDI1MiwxNzcsOTEsMTA2LDIwMywxOTAsNTcsNzQsNzYsODgsMjA3LDIwOCwyMzksMTcwLDI1MSw2Nyw3Nyw1MSwxMzMsNjksMjQ5LDIsMTI3LDgwLDYwLDE1OSwxNjgsODEsMTYzLDY0LDE0MywxNDYsMTU3LDU2LDI0NSwxODgsMTgyLDIxOCwzMywxNiwyNTUsMjQzLDIxMCwyMDUsMTIsMTksMjM2LDk1LDE1MSw2OCwyMywxOTYsMTY3LDEyNiw2MSwxMDAsOTMsMjUsMTE1LDk2LDEyOSw3OSwyMjAsMzQsNDIsMTQ0LDEzNiw3MCwyMzgsMTg0LDIwLDIyMiw5NCwxMSwyMTksMjI0LDUwLDU4LDEwLDczLDYsMzYsOTIsMTk0LDIxMSwxNzIsOTgsMTQ1LDE0OSwyMjgsMTIxLDIzMSwyMDAsNTUsMTA5LDE0MSwyMTMsNzgsMTY5LDEwOCw4NiwyNDQsMjM0LDEwMSwxMjIsMTc0LDgsMTg2LDEyMCwzNyw0NiwyOCwxNjYsMTgwLDE5OCwyMzIsMjIxLDExNiwzMSw3NSwxODksMTM5LDEzOCwxMTIsNjIsMTgxLDEwMiw3MiwzLDI0NiwxNCw5Nyw1Myw4NywxODUsMTM0LDE5MywyOSwxNTgsMjI1LDI0OCwxNTIsMTcsMTA1LDIxNywxNDIsMTQ4LDE1NSwzMCwxMzUsMjMzLDIwNiw4NSw0MCwyMjMsMTQwLDE2MSwxMzcsMTMsMTkxLDIzMCw2NiwxMDQsNjUsMTUzLDQ1LDE1LDE3Niw4NCwxODcsMjJdKTt0aGlzLl9pbnZfcz1uZXcgVWludDhBcnJheShbODIsOSwxMDYsMjEzLDQ4LDU0LDE2NSw1NiwxOTEsNjQsMTYzLDE1OCwxMjksMjQzLDIxNSwyNTEsMTI0LDIyNyw1NywxMzAsMTU1LDQ3LDI1NSwxMzUsNTIsMTQyLDY3LDY4LDE5NiwyMjIsMjMzLDIwMyw4NCwxMjMsMTQ4LDUwLDE2NiwxOTQsMzUsNjEsMjM4LDc2LDE0OSwxMSw2NiwyNTAsMTk1LDc4LDgsNDYsMTYxLDEwMiw0MCwyMTcsMzYsMTc4LDExOCw5MSwxNjIsNzMsMTA5LDEzOSwyMDksMzcsMTE0LDI0OCwyNDYsMTAwLDEzNCwxMDQsMTUyLDIyLDIxMiwxNjQsOTIsMjA0LDkzLDEwMSwxODIsMTQ2LDEwOCwxMTIsNzIsODAsMjUzLDIzNywxODUsMjE4LDk0LDIxLDcwLDg3LDE2NywxNDEsMTU3LDEzMiwxNDQsMjE2LDE3MSwwLDE0MCwxODgsMjExLDEwLDI0NywyMjgsODgsNSwxODQsMTc5LDY5LDYsMjA4LDQ0LDMwLDE0MywyMDIsNjMsMTUsMiwxOTMsMTc1LDE4OSwzLDEsMTksMTM4LDEwNyw1OCwxNDUsMTcsNjUsNzksMTAzLDIyMCwyMzQsMTUxLDI0MiwyMDcsMjA2LDI0MCwxODAsMjMwLDExNSwxNTAsMTcyLDExNiwzNCwyMzEsMTczLDUzLDEzMywyMjYsMjQ5LDU1LDIzMiwyOCwxMTcsMjIzLDExMCw3MSwyNDEsMjYsMTEzLDI5LDQxLDE5NywxMzcsMTExLDE4Myw5OCwxNCwxNzAsMjQsMTkwLDI3LDI1Miw4Niw2Miw3NSwxOTgsMjEwLDEyMSwzMiwxNTQsMjE5LDE5MiwyNTQsMTIwLDIwNSw5MCwyNDQsMzEsMjIxLDE2OCw1MSwxMzYsNywxOTksNDksMTc3LDE4LDE2LDg5LDM5LDEyOCwyMzYsOTUsOTYsODEsMTI3LDE2OSwyNSwxODEsNzQsMTMsNDUsMjI5LDEyMiwxNTksMTQ3LDIwMSwxNTYsMjM5LDE2MCwyMjQsNTksNzcsMTc0LDQyLDI0NSwxNzYsMjAwLDIzNSwxODcsNjAsMTMxLDgzLDE1Myw5NywyMyw0Myw0LDEyNiwxODYsMTE5LDIxNCwzOCwyMjUsMTA1LDIwLDk5LDg1LDMzLDEyLDEyNV0pO3RoaXMuX21peD1uZXcgVWludDMyQXJyYXkoWzAsMjM1NDc0MTg3LDQ3MDk0ODM3NCwzMDM3NjUyNzcsOTQxODk2NzQ4LDkwODkzMzQxNSw2MDc1MzA1NTQsNzA4NzgwODQ5LDE4ODM3OTM0OTYsMjExODIxNDk5NSwxODE3ODY2ODMwLDE2NDk2MzkyMzcsMTIxNTA2MTEwOCwxMTgxMDQ1MTE5LDE0MTc1NjE2OTgsMTUxNzc2NzUyOSwzNzY3NTg2OTkyLDQwMDMwNjExNzksNDIzNjQyOTk5MCw0MDY5MjQ2ODkzLDM2MzU3MzM2NjAsMzYwMjc3MDMyNywzMjk5Mjc4NDc0LDM0MDA1Mjg3NjksMjQzMDEyMjIxNiwyNjY0NTQzNzE1LDIzNjIwOTAyMzgsMjE5Mzg2MjY0NSwyODM1MTIzMzk2LDI4MDExMDc0MDcsMzAzNTUzNTA1OCwzMTM1NzQwODg5LDM2NzgxMjQ5MjMsMzU3Njg3MDUxMiwzMzQxMzk0Mjg1LDMzNzQzNjE3MDIsMzgxMDQ5NjM0MywzOTc3Njc1MzU2LDQyNzkwODAyNTcsNDA0MzYxMDE4NiwyODc2NDk0NjI3LDI3NzYyOTI5MDQsMzA3NjYzOTAyOSwzMTEwNjUwOTQyLDI0NzIwMTE1MzUsMjY0MDI0MzIwNCwyNDAzNzI4NjY1LDIxNjkzMDMwNTgsMTAwMTA4OTk5NSw4OTk4MzU1ODQsNjY2NDY0NzMzLDY5OTQzMjE1MCw1OTcyNzg0NywyMjY5MDY4NjAsNTMwNDAwNzUzLDI5NDkzMDY4MiwxMjczMTY4Nzg3LDExNzI5NjcwNjQsMTQ3NTQxODUwMSwxNTA5NDMwNDE0LDE5NDI0MzU3NzUsMjExMDY2NzQ0NCwxODc2MjQxODMzLDE2NDE4MTYyMjYsMjkxMDIxOTc2NiwyNzQzMDM0MTA5LDI5NzYxNTE1MjAsMzIxMTYyMzE0NywyNTA1MjAyMTM4LDI2MDY0NTM5NjksMjMwMjY5MDI1MiwyMjY5NzI4NDU1LDM3MTE4Mjk0MjIsMzU0MzU5OTI2OSwzMjQwODk0MzkyLDM0NzUzMTMzMzEsMzg0MzY5OTA3NCwzOTQzOTA2NDQxLDQxNzgwNjIyMjgsNDE0NDA0Nzc3NSwxMzA2OTY3MzY2LDExMzk3ODE3MDksMTM3NDk4ODExMiwxNjEwNDU5NzM5LDE5NzU2ODM0MzQsMjA3NjkzNTI2NSwxNzc1Mjc2OTI0LDE3NDIzMTUxMjcsMTAzNDg2Nzk5OCw4NjY2Mzc4NDUsNTY2MDIxODk2LDgwMDQ0MDgzNSw5Mjk4NzY5OCwxOTMxOTUwNjUsNDI5NDU2MTY0LDM5NTQ0MTcxMSwxOTg0ODEyNjg1LDIwMTc3Nzg1NjYsMTc4NDY2MzE5NSwxNjgzNDA3MjQ4LDEzMTU1NjIxNDUsMTA4MDA5NDYzNCwxMzgzODU2MzExLDE1NTEwMzc4ODQsMTAxMDM5ODI5LDEzNTA1MDIwNiw0Mzc3NTcxMjMsMzM3NTUzODY0LDEwNDIzODU2NTcsODA3OTYyNjEwLDU3MzgwNDc4Myw3NDIwMzkwMTIsMjUzMTA2NzQ1MywyNTY0MDMzMzM0LDIzMjg4Mjg5NzEsMjIyNzU3MzAyNCwyOTM1NTY2ODY1LDI3MDAwOTkzNTQsMzAwMTc1NTY1NSwzMTY4OTM3MjI4LDM4Njg1NTI4MDUsMzkwMjU2MzE4Miw0MjAzMTgxMTcxLDQxMDI5Nzc5MTIsMzczNjE2NDkzNywzNTAxNzQxODkwLDMyNjU0Nzg3NTEsMzQzMzcxMjk4MCwxMTA2MDQxNTkxLDEzNDA0NjMxMDAsMTU3Njk3NjYwOSwxNDA4NzQ5MDM0LDIwNDMyMTE0ODMsMjAwOTE5NTQ3MiwxNzA4ODQ4MzMzLDE4MDkwNTQxNTAsODMyODc3MjMxLDEwNjgzNTEzOTYsNzY2OTQ1NDY1LDU5OTc2MjM1NCwxNTk0MTc5ODcsMTI2NDU0NjY0LDM2MTkyOTg3Nyw0NjMxODAxOTAsMjcwOTI2MDg3MSwyOTQzNjgyMzgwLDMxNzgxMDY5NjEsMzAwOTg3OTM4NiwyNTcyNjk3MTk1LDI1Mzg2ODExODQsMjIzNjIyODczMywyMzM2NDM0NTUwLDM1MDk4NzExMzUsMzc0NTM0NTMwMCwzNDQxODUwMzc3LDMyNzQ2NjcyNjYsMzkxMDE2MTk3MSwzODc3MTk4NjQ4LDQxMTA1Njg0ODUsNDIxMTgxODc5OCwyNTk3ODA2NDc2LDI0OTc2MDQ3NDMsMjI2MTA4OTE3OCwyMjk1MTAxMDczLDI3MzM4NTYxNjAsMjkwMjA4Nzg1MSwzMjAyNDM3MDQ2LDI5NjgwMTE0NTMsMzkzNjI5MTI4NCwzODM1MDM2ODk1LDQxMzY0NDA3NzAsNDE2OTQwODIwMSwzNTM1NDg2NDU2LDM3MDI2NjU0NTksMzQ2NzE5MjMwMiwzMjMxNzIyMjEzLDIwNTE1MTg3ODAsMTk1MTMxNzA0NywxNzE2ODkwNDEwLDE3NTA5MDIzMDUsMTExMzgxODM4NCwxMjgyMDUwMDc1LDE1ODQ1MDQ1ODIsMTM1MDA3ODk4OSwxNjg4MTA4NTIsNjc1NTY0NjMsMzcxMDQ5MzMwLDQwNDAxNjc2MSw4NDE3Mzk1OTIsMTAwODkxODU5NSw3NzU1NTA4MTQsNTQwMDgwNzI1LDM5Njk1NjIzNjksMzgwMTMzMjIzNCw0MDM1NDg5MDQ3LDQyNjk5MDc5OTYsMzU2OTI1NTIxMywzNjY5NDYyNTY2LDMzNjY3NTQ2MTksMzMzMjc0MDE0NCwyNjMxMDY1NDMzLDI0NjM4Nzk3NjIsMjE2MDExNzA3MSwyMzk1NTg4Njc2LDI3Njc2NDU1NTcsMjg2ODg5NzQwNiwzMTAyMDExNzQ3LDMwNjkwNDk5NjAsMjAyMDA4NDk3LDMzNzc4MzYyLDI3MDA0MDQ4Nyw1MDQ0NTk0MzYsODc1NDUxMjkzLDk3NTY1ODY0Niw2NzUwMzk2MjcsNjQxMDI1MTUyLDIwODQ3MDQyMzMsMTkxNzUxODU2MiwxNjE1ODYxMjQ3LDE4NTEzMzI4NTIsMTE0NzU1MDY2MSwxMjQ4ODAyNTEwLDE0ODQwMDU4NDMsMTQ1MTA0NDA1Niw5MzMzMDEzNzAsOTY3MzExNzI5LDczMzE1Njk3Miw2MzI5NTM3MDMsMjYwMzg4OTUwLDI1OTY1OTE3LDMyODY3MTgwOCw0OTY5MDYwNTksMTIwNjQ3Nzg1OCwxMjM5NDQzNzUzLDE1NDMyMDg1MDAsMTQ0MTk1MjU3NSwyMTQ0MTYxODA2LDE5MDg2OTQyNzcsMTY3NTU3Nzg4MCwxODQyNzU5NDQzLDM2MTAzNjkyMjYsMzY0NDM3OTU4NSwzNDA4MTE5NTE2LDMzMDc5MTYyNDcsNDAxMTE5MDUwMiwzNzc2NzY3NDY5LDQwNzczODQ0MzIsNDI0NTYxODY4MywyODA5NzcxMTU0LDI4NDI3MzcwNDksMzE0NDM5NjQyMCwzMDQzMTQwNDk1LDI2NzM3MDUxNTAsMjQzODIzNzYyMSwyMjAzMDMyMjMyLDIzNzAyMTM3OTVdKTt0aGlzLl9taXhDb2w9bmV3IFVpbnQ4QXJyYXkoMjU2KTtmb3IodmFyIHQ9MDt0PDI1Njt0KyspdGhpcy5fbWl4Q29sW3RdPXQ8MTI4P3Q8PDE6dDw8MV4yNzt0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNik7dGhpcy5idWZmZXJQb3NpdGlvbj0wfV9jcmVhdGVDbGFzcyhBRVNCYXNlQ2lwaGVyLFt7a2V5OiJfZXhwYW5kS2V5Iix2YWx1ZTpmdW5jdGlvbiBfZXhwYW5kS2V5KHQpeygwLGkudW5yZWFjaGFibGUpKCJDYW5ub3QgY2FsbCBgX2V4cGFuZEtleWAgb24gdGhlIGJhc2UgY2xhc3MiKX19LHtrZXk6Il9kZWNyeXB0Iix2YWx1ZTpmdW5jdGlvbiBfZGVjcnlwdCh0LHIpe3ZhciBhLGksbyxjPW5ldyBVaW50OEFycmF5KDE2KTtjLnNldCh0KTtmb3IodmFyIGw9MCx1PXRoaXMuX2tleVNpemU7bDwxNjsrK2wsKyt1KWNbbF1ePXJbdV07Zm9yKHZhciBoPXRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbi0xO2g+PTE7LS1oKXthPWNbMTNdO2NbMTNdPWNbOV07Y1s5XT1jWzVdO2NbNV09Y1sxXTtjWzFdPWE7YT1jWzE0XTtpPWNbMTBdO2NbMTRdPWNbNl07Y1sxMF09Y1syXTtjWzZdPWE7Y1syXT1pO2E9Y1sxNV07aT1jWzExXTtvPWNbN107Y1sxNV09Y1szXTtjWzExXT1hO2NbN109aTtjWzNdPW87Zm9yKHZhciBkPTA7ZDwxNjsrK2QpY1tkXT10aGlzLl9pbnZfc1tjW2RdXTtmb3IodmFyIHA9MCxtPTE2Kmg7cDwxNjsrK3AsKyttKWNbcF1ePXJbbV07Zm9yKHZhciBnPTA7ZzwxNjtnKz00KXt2YXIgeT10aGlzLl9taXhbY1tnXV0sYj10aGlzLl9taXhbY1tnKzFdXSx2PXRoaXMuX21peFtjW2crMl1dLFM9dGhpcy5fbWl4W2NbZyszXV07YT15XmI+Pj44XmI8PDI0XnY+Pj4xNl52PDwxNl5TPj4+MjReUzw8ODtjW2ddPWE+Pj4yNCYyNTU7Y1tnKzFdPWE+PjE2JjI1NTtjW2crMl09YT4+OCYyNTU7Y1tnKzNdPTI1NSZhfX1hPWNbMTNdO2NbMTNdPWNbOV07Y1s5XT1jWzVdO2NbNV09Y1sxXTtjWzFdPWE7YT1jWzE0XTtpPWNbMTBdO2NbMTRdPWNbNl07Y1sxMF09Y1syXTtjWzZdPWE7Y1syXT1pO2E9Y1sxNV07aT1jWzExXTtvPWNbN107Y1sxNV09Y1szXTtjWzExXT1hO2NbN109aTtjWzNdPW87Zm9yKHZhciBrPTA7azwxNjsrK2spe2Nba109dGhpcy5faW52X3NbY1trXV07Y1trXV49cltrXX1yZXR1cm4gY319LHtrZXk6Il9lbmNyeXB0Iix2YWx1ZTpmdW5jdGlvbiBfZW5jcnlwdCh0LHIpe3ZhciBhLGksbyxjPXRoaXMuX3MsbD1uZXcgVWludDhBcnJheSgxNik7bC5zZXQodCk7Zm9yKHZhciB1PTA7dTwxNjsrK3UpbFt1XV49clt1XTtmb3IodmFyIGg9MTtoPHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbjtoKyspe2Zvcih2YXIgZD0wO2Q8MTY7KytkKWxbZF09Y1tsW2RdXTtvPWxbMV07bFsxXT1sWzVdO2xbNV09bFs5XTtsWzldPWxbMTNdO2xbMTNdPW87bz1sWzJdO2k9bFs2XTtsWzJdPWxbMTBdO2xbNl09bFsxNF07bFsxMF09bztsWzE0XT1pO289bFszXTtpPWxbN107YT1sWzExXTtsWzNdPWxbMTVdO2xbN109bztsWzExXT1pO2xbMTVdPWE7Zm9yKHZhciBwPTA7cDwxNjtwKz00KXt2YXIgbT1sW3ArMF0sZz1sW3ArMV0seT1sW3ArMl0sYj1sW3ArM107YT1tXmdeeV5iO2xbcCswXV49YV50aGlzLl9taXhDb2xbbV5nXTtsW3ArMV1ePWFedGhpcy5fbWl4Q29sW2deeV07bFtwKzJdXj1hXnRoaXMuX21peENvbFt5XmJdO2xbcCszXV49YV50aGlzLl9taXhDb2xbYl5tXX1mb3IodmFyIHY9MCxTPTE2Kmg7djwxNjsrK3YsKytTKWxbdl1ePXJbU119Zm9yKHZhciBrPTA7azwxNjsrK2spbFtrXT1jW2xba11dO289bFsxXTtsWzFdPWxbNV07bFs1XT1sWzldO2xbOV09bFsxM107bFsxM109bztvPWxbMl07aT1sWzZdO2xbMl09bFsxMF07bFs2XT1sWzE0XTtsWzEwXT1vO2xbMTRdPWk7bz1sWzNdO2k9bFs3XTthPWxbMTFdO2xbM109bFsxNV07bFs3XT1vO2xbMTFdPWk7bFsxNV09YTtmb3IodmFyIHc9MCxDPXRoaXMuX2tleVNpemU7dzwxNjsrK3csKytDKWxbd11ePXJbQ107cmV0dXJuIGx9fSx7a2V5OiJfZGVjcnlwdEJsb2NrMiIsdmFsdWU6ZnVuY3Rpb24gX2RlY3J5cHRCbG9jazIodCxyKXtmb3IodmFyIGE9dC5sZW5ndGgsaT10aGlzLmJ1ZmZlcixvPXRoaXMuYnVmZmVyUG9zaXRpb24sYz1bXSxsPXRoaXMuaXYsdT0wO3U8YTsrK3Upe2lbb109dFt1XTtpZighKCsrbzwxNikpe2Zvcih2YXIgaD10aGlzLl9kZWNyeXB0KGksdGhpcy5fa2V5KSxkPTA7ZDwxNjsrK2QpaFtkXV49bFtkXTtsPWk7Yy5wdXNoKGgpO2k9bmV3IFVpbnQ4QXJyYXkoMTYpO289MH19dGhpcy5idWZmZXI9aTt0aGlzLmJ1ZmZlckxlbmd0aD1vO3RoaXMuaXY9bDtpZigwPT09Yy5sZW5ndGgpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO3ZhciBwPTE2KmMubGVuZ3RoO2lmKHIpe3ZhciBtPWNbYy5sZW5ndGgtMV0sZz1tWzE1XTtpZihnPD0xNil7Zm9yKHZhciB5PTE1LGI9MTYtZzt5Pj1iOy0teSlpZihtW3ldIT09Zyl7Zz0wO2JyZWFrfXAtPWc7Y1tjLmxlbmd0aC0xXT1tLnN1YmFycmF5KDAsMTYtZyl9fWZvcih2YXIgdj1uZXcgVWludDhBcnJheShwKSxTPTAsaz0wLHc9Yy5sZW5ndGg7Uzx3OysrUyxrKz0xNil2LnNldChjW1NdLGspO3JldHVybiB2fX0se2tleToiZGVjcnlwdEJsb2NrIix2YWx1ZTpmdW5jdGlvbiBkZWNyeXB0QmxvY2sodCxyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxpPXQubGVuZ3RoLG89dGhpcy5idWZmZXIsYz10aGlzLmJ1ZmZlclBvc2l0aW9uO2lmKGEpdGhpcy5pdj1hO2Vsc2V7Zm9yKHZhciBsPTA7YzwxNiYmbDxpOysrbCwrK2Mpb1tjXT10W2xdO2lmKGM8MTYpe3RoaXMuYnVmZmVyTGVuZ3RoPWM7cmV0dXJuIG5ldyBVaW50OEFycmF5KDApfXRoaXMuaXY9bzt0PXQuc3ViYXJyYXkoMTYpfXRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDE2KTt0aGlzLmJ1ZmZlckxlbmd0aD0wO3RoaXMuZGVjcnlwdEJsb2NrPXRoaXMuX2RlY3J5cHRCbG9jazI7cmV0dXJuIHRoaXMuZGVjcnlwdEJsb2NrKHQscil9fSx7a2V5OiJlbmNyeXB0Iix2YWx1ZTpmdW5jdGlvbiBlbmNyeXB0KHQscil7dmFyIGE9dC5sZW5ndGgsaT10aGlzLmJ1ZmZlcixvPXRoaXMuYnVmZmVyUG9zaXRpb24sYz1bXTtyfHwocj1uZXcgVWludDhBcnJheSgxNikpO2Zvcih2YXIgbD0wO2w8YTsrK2wpe2lbb109dFtsXTtpZighKCsrbzwxNikpe2Zvcih2YXIgdT0wO3U8MTY7Kyt1KWlbdV1ePXJbdV07dmFyIGg9dGhpcy5fZW5jcnlwdChpLHRoaXMuX2tleSk7cj1oO2MucHVzaChoKTtpPW5ldyBVaW50OEFycmF5KDE2KTtvPTB9fXRoaXMuYnVmZmVyPWk7dGhpcy5idWZmZXJMZW5ndGg9bzt0aGlzLml2PXI7aWYoMD09PWMubGVuZ3RoKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtmb3IodmFyIGQ9MTYqYy5sZW5ndGgscD1uZXcgVWludDhBcnJheShkKSxtPTAsZz0wLHk9Yy5sZW5ndGg7bTx5OysrbSxnKz0xNilwLnNldChjW21dLGcpO3JldHVybiBwfX1dKTtyZXR1cm4gQUVTQmFzZUNpcGhlcn0oKSxiPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhBRVMxMjhDaXBoZXIsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKEFFUzEyOENpcGhlcik7ZnVuY3Rpb24gQUVTMTI4Q2lwaGVyKHQpe3ZhciBhO19jbGFzc0NhbGxDaGVjayh0aGlzLEFFUzEyOENpcGhlcik7KGE9ci5jYWxsKHRoaXMpKS5fY3ljbGVzT2ZSZXBldGl0aW9uPTEwO2EuX2tleVNpemU9MTYwO2EuX3Jjb249bmV3IFVpbnQ4QXJyYXkoWzE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0LDEwOCwyMTYsMTcxLDc3LDE1NCw0Nyw5NCwxODgsOTksMTk4LDE1MSw1MywxMDYsMjEyLDE3OSwxMjUsMjUwLDIzOSwxOTcsMTQ1LDU3LDExNCwyMjgsMjExLDE4OSw5NywxOTQsMTU5LDM3LDc0LDE0OCw1MSwxMDIsMjA0LDEzMSwyOSw1OCwxMTYsMjMyLDIwMywxNDEsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTQsMTA4LDIxNiwxNzEsNzcsMTU0LDQ3LDk0LDE4OCw5OSwxOTgsMTUxLDUzLDEwNiwyMTIsMTc5LDEyNSwyNTAsMjM5LDE5NywxNDUsNTcsMTE0LDIyOCwyMTEsMTg5LDk3LDE5NCwxNTksMzcsNzQsMTQ4LDUxLDEwMiwyMDQsMTMxLDI5LDU4LDExNiwyMzIsMjAzLDE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0LDEwOCwyMTYsMTcxLDc3LDE1NCw0Nyw5NCwxODgsOTksMTk4LDE1MSw1MywxMDYsMjEyLDE3OSwxMjUsMjUwLDIzOSwxOTcsMTQ1LDU3LDExNCwyMjgsMjExLDE4OSw5NywxOTQsMTU5LDM3LDc0LDE0OCw1MSwxMDIsMjA0LDEzMSwyOSw1OCwxMTYsMjMyLDIwMywxNDFdKTthLl9rZXk9YS5fZXhwYW5kS2V5KHQpO3JldHVybiBhfV9jcmVhdGVDbGFzcyhBRVMxMjhDaXBoZXIsW3trZXk6Il9leHBhbmRLZXkiLHZhbHVlOmZ1bmN0aW9uIF9leHBhbmRLZXkodCl7dmFyIHI9dGhpcy5fcyxhPXRoaXMuX3Jjb24saT1uZXcgVWludDhBcnJheSgxNzYpO2kuc2V0KHQpO2Zvcih2YXIgbz0xNixjPTE7bzwxNzY7KytjKXt2YXIgbD1pW28tM10sdT1pW28tMl0saD1pW28tMV0sZD1pW28tNF07bD1yW2xdO3U9clt1XTtoPXJbaF07ZD1yW2RdO2xePWFbY107Zm9yKHZhciBwPTA7cDw0OysrcCl7aVtvXT1sXj1pW28tMTZdO2lbKytvXT11Xj1pW28tMTZdO2lbKytvXT1oXj1pW28tMTZdO2lbKytvXT1kXj1pW28tMTZdO28rK319cmV0dXJuIGl9fV0pO3JldHVybiBBRVMxMjhDaXBoZXJ9KHkpO3IuQUVTMTI4Q2lwaGVyPWI7dmFyIHY9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEFFUzI1NkNpcGhlcix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoQUVTMjU2Q2lwaGVyKTtmdW5jdGlvbiBBRVMyNTZDaXBoZXIodCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQUVTMjU2Q2lwaGVyKTsoYT1yLmNhbGwodGhpcykpLl9jeWNsZXNPZlJlcGV0aXRpb249MTQ7YS5fa2V5U2l6ZT0yMjQ7YS5fa2V5PWEuX2V4cGFuZEtleSh0KTtyZXR1cm4gYX1fY3JlYXRlQ2xhc3MoQUVTMjU2Q2lwaGVyLFt7a2V5OiJfZXhwYW5kS2V5Iix2YWx1ZTpmdW5jdGlvbiBfZXhwYW5kS2V5KHQpe3ZhciByPXRoaXMuX3MsYT1uZXcgVWludDhBcnJheSgyNDApO2Euc2V0KHQpO2Zvcih2YXIgaSxvLGMsbCx1PTEsaD0zMixkPTE7aDwyNDA7KytkKXtpZihoJTMyPT0xNil7aT1yW2ldO289cltvXTtjPXJbY107bD1yW2xdfWVsc2UgaWYoaCUzMj09MCl7aT1hW2gtM107bz1hW2gtMl07Yz1hW2gtMV07bD1hW2gtNF07aT1yW2ldO289cltvXTtjPXJbY107bD1yW2xdO2lePXU7KHU8PD0xKT49MjU2JiYodT0yNTUmKDI3XnUpKX1mb3IodmFyIHA9MDtwPDQ7KytwKXthW2hdPWlePWFbaC0zMl07YVsrK2hdPW9ePWFbaC0zMl07YVsrK2hdPWNePWFbaC0zMl07YVsrK2hdPWxePWFbaC0zMl07aCsrfX1yZXR1cm4gYX19XSk7cmV0dXJuIEFFUzI1NkNpcGhlcn0oeSk7ci5BRVMyNTZDaXBoZXI9djt2YXIgUz1mdW5jdGlvbiBQREYxN0Nsb3N1cmUoKXtmdW5jdGlvbiBjb21wYXJlQnl0ZUFycmF5cyh0LHIpe2lmKHQubGVuZ3RoIT09ci5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspaWYodFthXSE9PXJbYV0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gUERGMTcoKXt9UERGMTcucHJvdG90eXBlPXtjaGVja093bmVyUGFzc3dvcmQ6ZnVuY3Rpb24gUERGMTdfY2hlY2tPd25lclBhc3N3b3JkKHQscixhLGkpe3ZhciBvPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKzU2KTtvLnNldCh0LDApO28uc2V0KHIsdC5sZW5ndGgpO28uc2V0KGEsdC5sZW5ndGgrci5sZW5ndGgpO3JldHVybiBjb21wYXJlQnl0ZUFycmF5cyhkKG8sMCxvLmxlbmd0aCksaSl9LGNoZWNrVXNlclBhc3N3b3JkOmZ1bmN0aW9uIFBERjE3X2NoZWNrVXNlclBhc3N3b3JkKHQscixhKXt2YXIgaT1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCs4KTtpLnNldCh0LDApO2kuc2V0KHIsdC5sZW5ndGgpO3JldHVybiBjb21wYXJlQnl0ZUFycmF5cyhkKGksMCxpLmxlbmd0aCksYSl9LGdldE93bmVyS2V5OmZ1bmN0aW9uIFBERjE3X2dldE93bmVyS2V5KHQscixhLGkpe3ZhciBvPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKzU2KTtvLnNldCh0LDApO28uc2V0KHIsdC5sZW5ndGgpO28uc2V0KGEsdC5sZW5ndGgrci5sZW5ndGgpO3ZhciBjPWQobywwLG8ubGVuZ3RoKTtyZXR1cm4gbmV3IHYoYykuZGVjcnlwdEJsb2NrKGksITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX0sZ2V0VXNlcktleTpmdW5jdGlvbiBQREYxN19nZXRVc2VyS2V5KHQscixhKXt2YXIgaT1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCs4KTtpLnNldCh0LDApO2kuc2V0KHIsdC5sZW5ndGgpO3ZhciBvPWQoaSwwLGkubGVuZ3RoKTtyZXR1cm4gbmV3IHYobykuZGVjcnlwdEJsb2NrKGEsITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX19O3JldHVybiBQREYxN30oKTtyLlBERjE3PVM7dmFyIGs9ZnVuY3Rpb24gUERGMjBDbG9zdXJlKCl7ZnVuY3Rpb24gY29uY2F0QXJyYXlzKHQscil7dmFyIGE9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgrci5sZW5ndGgpO2Euc2V0KHQsMCk7YS5zZXQocix0Lmxlbmd0aCk7cmV0dXJuIGF9ZnVuY3Rpb24gY2FsY3VsYXRlUERGMjBIYXNoKHQscixhKXtmb3IodmFyIGk9ZChyLDAsci5sZW5ndGgpLnN1YmFycmF5KDAsMzIpLG89WzBdLGM9MDtjPDY0fHxvW28ubGVuZ3RoLTFdPmMtMzI7KXt2YXIgbD10Lmxlbmd0aCtpLmxlbmd0aCthLmxlbmd0aCx1PW5ldyBVaW50OEFycmF5KDY0KmwpLGg9Y29uY2F0QXJyYXlzKHQsaSk7aD1jb25jYXRBcnJheXMoaCxhKTtmb3IodmFyIGc9MCx5PTA7Zzw2NDtnKysseSs9bCl1LnNldChoLHkpO289bmV3IGIoaS5zdWJhcnJheSgwLDE2KSkuZW5jcnlwdCh1LGkuc3ViYXJyYXkoMTYsMzIpKTtmb3IodmFyIHY9MCxTPTA7UzwxNjtTKyspe3YqPTE7diU9Mzt2Kz0ob1tTXT4+PjApJTM7diU9M30wPT09dj9pPWQobywwLG8ubGVuZ3RoKToxPT09dj9pPW0obywwLG8ubGVuZ3RoKToyPT09diYmKGk9cChvLDAsby5sZW5ndGgpKTtjKyt9cmV0dXJuIGkuc3ViYXJyYXkoMCwzMil9ZnVuY3Rpb24gUERGMjAoKXt9ZnVuY3Rpb24gY29tcGFyZUJ5dGVBcnJheXModCxyKXtpZih0Lmxlbmd0aCE9PXIubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKWlmKHRbYV0hPT1yW2FdKXJldHVybiExO3JldHVybiEwfVBERjIwLnByb3RvdHlwZT17aGFzaDpmdW5jdGlvbiBQREYyMF9oYXNoKHQscixhKXtyZXR1cm4gY2FsY3VsYXRlUERGMjBIYXNoKHQscixhKX0sY2hlY2tPd25lclBhc3N3b3JkOmZ1bmN0aW9uIFBERjIwX2NoZWNrT3duZXJQYXNzd29yZCh0LHIsYSxpKXt2YXIgbz1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCs1Nik7by5zZXQodCwwKTtvLnNldChyLHQubGVuZ3RoKTtvLnNldChhLHQubGVuZ3RoK3IubGVuZ3RoKTtyZXR1cm4gY29tcGFyZUJ5dGVBcnJheXMoY2FsY3VsYXRlUERGMjBIYXNoKHQsbyxhKSxpKX0sY2hlY2tVc2VyUGFzc3dvcmQ6ZnVuY3Rpb24gUERGMjBfY2hlY2tVc2VyUGFzc3dvcmQodCxyLGEpe3ZhciBpPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKzgpO2kuc2V0KHQsMCk7aS5zZXQocix0Lmxlbmd0aCk7cmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKGNhbGN1bGF0ZVBERjIwSGFzaCh0LGksW10pLGEpfSxnZXRPd25lcktleTpmdW5jdGlvbiBQREYyMF9nZXRPd25lcktleSh0LHIsYSxpKXt2YXIgbz1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCs1Nik7by5zZXQodCwwKTtvLnNldChyLHQubGVuZ3RoKTtvLnNldChhLHQubGVuZ3RoK3IubGVuZ3RoKTt2YXIgYz1jYWxjdWxhdGVQREYyMEhhc2godCxvLGEpO3JldHVybiBuZXcgdihjKS5kZWNyeXB0QmxvY2soaSwhMSxuZXcgVWludDhBcnJheSgxNikpfSxnZXRVc2VyS2V5OmZ1bmN0aW9uIFBERjIwX2dldFVzZXJLZXkodCxyLGEpe3ZhciBpPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKzgpO2kuc2V0KHQsMCk7aS5zZXQocix0Lmxlbmd0aCk7dmFyIG89Y2FsY3VsYXRlUERGMjBIYXNoKHQsaSxbXSk7cmV0dXJuIG5ldyB2KG8pLmRlY3J5cHRCbG9jayhhLCExLG5ldyBVaW50OEFycmF5KDE2KSl9fTtyZXR1cm4gUERGMjB9KCk7ci5QREYyMD1rO3ZhciB3PWZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybUNsb3N1cmUoKXtmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm0odCxyKXt0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yPXQ7dGhpcy5TdHJlYW1DaXBoZXJDb25zdHJ1Y3Rvcj1yfUNpcGhlclRyYW5zZm9ybS5wcm90b3R5cGU9e2NyZWF0ZVN0cmVhbTpmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fY3JlYXRlU3RyZWFtKHQscil7dmFyIGE9bmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I7cmV0dXJuIG5ldyBjLkRlY3J5cHRTdHJlYW0odCxyLChmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1EZWNyeXB0U3RyZWFtKHQscil7cmV0dXJuIGEuZGVjcnlwdEJsb2NrKHQscil9KSl9LGRlY3J5cHRTdHJpbmc6ZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtX2RlY3J5cHRTdHJpbmcodCl7dmFyIHI9bmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IsYT0oMCxpLnN0cmluZ1RvQnl0ZXMpKHQpO2E9ci5kZWNyeXB0QmxvY2soYSwhMCk7cmV0dXJuKDAsaS5ieXRlc1RvU3RyaW5nKShhKX0sZW5jcnlwdFN0cmluZzpmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fZW5jcnlwdFN0cmluZyh0KXt2YXIgcj1uZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcjtpZihyIGluc3RhbmNlb2YgeSl7dmFyIGE9dC5sZW5ndGgsbz0xNi1hJTE2OzE2IT09byYmKHQ9dC5wYWRFbmQoMTYqTWF0aC5jZWlsKGEvMTYpLFN0cmluZy5mcm9tQ2hhckNvZGUobykpKTt2YXIgYz1uZXcgVWludDhBcnJheSgxNik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBjcnlwdG8pY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhjKTtlbHNlIGZvcih2YXIgbD0wO2w8MTY7bCsrKWNbbF09TWF0aC5mbG9vcigyNTYqTWF0aC5yYW5kb20oKSk7dmFyIHU9KDAsaS5zdHJpbmdUb0J5dGVzKSh0KTt1PXIuZW5jcnlwdCh1LGMpO3ZhciBoPW5ldyBVaW50OEFycmF5KDE2K3UubGVuZ3RoKTtoLnNldChjKTtoLnNldCh1LDE2KTtyZXR1cm4oMCxpLmJ5dGVzVG9TdHJpbmcpKGgpfXZhciBkPSgwLGkuc3RyaW5nVG9CeXRlcykodCk7ZD1yLmVuY3J5cHQoZCk7cmV0dXJuKDAsaS5ieXRlc1RvU3RyaW5nKShkKX19O3JldHVybiBDaXBoZXJUcmFuc2Zvcm19KCksQz1mdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5Q2xvc3VyZSgpe3ZhciB0PW5ldyBVaW50OEFycmF5KFs0MCwxOTEsNzgsOTQsNzgsMTE3LDEzOCw2NSwxMDAsMCw3OCw4NiwyNTUsMjUwLDEsOCw0Niw0NiwwLDE4MiwyMDgsMTA0LDYyLDEyOCw0NywxMiwxNjksMjU0LDEwMCw4MywxMDUsMTIyXSk7ZnVuY3Rpb24gcHJlcGFyZUtleURhdGEocixhLGksbyxjLGgsZCxwKXt2YXIgbSxnLHk9NDAraS5sZW5ndGgrci5sZW5ndGgsYj1uZXcgVWludDhBcnJheSh5KSx2PTA7aWYoYSl7Zz1NYXRoLm1pbigzMixhLmxlbmd0aCk7Zm9yKDt2PGc7Kyt2KWJbdl09YVt2XX1tPTA7Zm9yKDt2PDMyOyliW3YrK109dFttKytdO2ZvcihtPTAsZz1pLmxlbmd0aDttPGc7KyttKWJbdisrXT1pW21dO2JbdisrXT0yNTUmYztiW3YrK109Yz4+OCYyNTU7Ylt2KytdPWM+PjE2JjI1NTtiW3YrK109Yz4+PjI0JjI1NTtmb3IobT0wLGc9ci5sZW5ndGg7bTxnOysrbSliW3YrK109clttXTtpZihoPj00JiYhcCl7Ylt2KytdPTI1NTtiW3YrK109MjU1O2JbdisrXT0yNTU7Ylt2KytdPTI1NX12YXIgUz11KGIsMCx2KSxrPWQ+PjM7aWYoaD49Mylmb3IobT0wO208NTA7KyttKVM9dShTLDAsayk7dmFyIHcsQz1TLnN1YmFycmF5KDAsayk7aWYoaD49Myl7Zm9yKHY9MDt2PDMyOysrdiliW3ZdPXRbdl07Zm9yKG09MCxnPXIubGVuZ3RoO208ZzsrK20pYlt2KytdPXJbbV07dz1uZXcgbChDKS5lbmNyeXB0QmxvY2sodShiLDAsdikpO2c9Qy5sZW5ndGg7dmFyIF8seD1uZXcgVWludDhBcnJheShnKTtmb3IobT0xO208PTE5OysrbSl7Zm9yKF89MDtfPGc7KytfKXhbX109Q1tfXV5tO3c9bmV3IGwoeCkuZW5jcnlwdEJsb2NrKHcpfWZvcihtPTAsZz13Lmxlbmd0aDttPGc7KyttKWlmKG9bbV0hPT13W21dKXJldHVybiBudWxsfWVsc2UgZm9yKG09MCxnPSh3PW5ldyBsKEMpLmVuY3J5cHRCbG9jayh0KSkubGVuZ3RoO208ZzsrK20paWYob1ttXSE9PXdbbV0pcmV0dXJuIG51bGw7cmV0dXJuIEN9dmFyIHI9by5OYW1lLmdldCgiSWRlbnRpdHkiKTtmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KGEsYyxoKXt2YXIgZD1hLmdldCgiRmlsdGVyIik7aWYoISgwLG8uaXNOYW1lKShkLCJTdGFuZGFyZCIpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJ1bmtub3duIGVuY3J5cHRpb24gbWV0aG9kIik7dGhpcy5kaWN0PWE7dmFyIHA9YS5nZXQoIlYiKTtpZighTnVtYmVyLmlzSW50ZWdlcihwKXx8MSE9PXAmJjIhPT1wJiY0IT09cCYmNSE9PXApdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoInVuc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnb3JpdGhtIik7dGhpcy5hbGdvcml0aG09cDt2YXIgbT1hLmdldCgiTGVuZ3RoIik7aWYoIW0paWYocDw9MyltPTQwO2Vsc2V7dmFyIGc9YS5nZXQoIkNGIikseT1hLmdldCgiU3RtRiIpO2lmKCgwLG8uaXNEaWN0KShnKSYmKDAsby5pc05hbWUpKHkpKXtnLnN1cHByZXNzRW5jcnlwdGlvbj0hMDt2YXIgYj1nLmdldCh5Lm5hbWUpOyhtPWImJmIuZ2V0KCJMZW5ndGgiKXx8MTI4KTw0MCYmKG08PD0zKX19aWYoIU51bWJlci5pc0ludGVnZXIobSl8fG08NDB8fG0lOCE9MCl0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiaW52YWxpZCBrZXkgbGVuZ3RoIik7dmFyIHY9KDAsaS5zdHJpbmdUb0J5dGVzKShhLmdldCgiTyIpKS5zdWJhcnJheSgwLDMyKSx3PSgwLGkuc3RyaW5nVG9CeXRlcykoYS5nZXQoIlUiKSkuc3ViYXJyYXkoMCwzMiksQz1hLmdldCgiUCIpLF89YS5nZXQoIlIiKSx4PSg0PT09cHx8NT09PXApJiYhMSE9PWEuZ2V0KCJFbmNyeXB0TWV0YWRhdGEiKTt0aGlzLmVuY3J5cHRNZXRhZGF0YT14O3ZhciBBLFQsUj0oMCxpLnN0cmluZ1RvQnl0ZXMpKGMpO2lmKGgpe2lmKDY9PT1fKXRyeXtoPSgwLGkudXRmOFN0cmluZ1RvU3RyaW5nKShoKX1jYXRjaCh0KXsoMCxpLndhcm4pKCJDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5OiBVbmFibGUgdG8gY29udmVydCBVVEY4IGVuY29kZWQgcGFzc3dvcmQuIil9QT0oMCxpLnN0cmluZ1RvQnl0ZXMpKGgpfWlmKDUhPT1wKVQ9cHJlcGFyZUtleURhdGEoUixBLHYsdyxDLF8sbSx4KTtlbHNle3ZhciBJPSgwLGkuc3RyaW5nVG9CeXRlcykoYS5nZXQoIk8iKSkuc3ViYXJyYXkoMzIsNDApLFA9KDAsaS5zdHJpbmdUb0J5dGVzKShhLmdldCgiTyIpKS5zdWJhcnJheSg0MCw0OCksTz0oMCxpLnN0cmluZ1RvQnl0ZXMpKGEuZ2V0KCJVIikpLnN1YmFycmF5KDAsNDgpLEU9KDAsaS5zdHJpbmdUb0J5dGVzKShhLmdldCgiVSIpKS5zdWJhcnJheSgzMiw0MCksQj0oMCxpLnN0cmluZ1RvQnl0ZXMpKGEuZ2V0KCJVIikpLnN1YmFycmF5KDQwLDQ4KSxEPSgwLGkuc3RyaW5nVG9CeXRlcykoYS5nZXQoIk9FIikpLE09KDAsaS5zdHJpbmdUb0J5dGVzKShhLmdldCgiVUUiKSk7KDAsaS5zdHJpbmdUb0J5dGVzKShhLmdldCgiUGVybXMiKSk7VD1mdW5jdGlvbiBjcmVhdGVFbmNyeXB0aW9uS2V5MjAodCxyLGEsaSxvLGMsbCx1LGgsZCxwLG0pe2lmKHIpe3ZhciBnPU1hdGgubWluKDEyNyxyLmxlbmd0aCk7cj1yLnN1YmFycmF5KDAsZyl9ZWxzZSByPVtdO3ZhciB5O3JldHVybih5PTY9PT10P25ldyBrOm5ldyBTKS5jaGVja1VzZXJQYXNzd29yZChyLHUsbCk/eS5nZXRVc2VyS2V5KHIsaCxwKTpyLmxlbmd0aCYmeS5jaGVja093bmVyUGFzc3dvcmQocixpLGMsYSk/eS5nZXRPd25lcktleShyLG8sYyxkKTpudWxsfShfLEEsdixJLFAsTyx3LEUsQixELE0pfWlmKCFUJiYhaCl0aHJvdyBuZXcgaS5QYXNzd29yZEV4Y2VwdGlvbigiTm8gcGFzc3dvcmQgZ2l2ZW4iLGkuUGFzc3dvcmRSZXNwb25zZXMuTkVFRF9QQVNTV09SRCk7aWYoIVQmJmgpe1Q9cHJlcGFyZUtleURhdGEoUixmdW5jdGlvbiBkZWNvZGVVc2VyUGFzc3dvcmQocixhLGksbyl7dmFyIGMsaCxkPW5ldyBVaW50OEFycmF5KDMyKSxwPTA7aD1NYXRoLm1pbigzMixyLmxlbmd0aCk7Zm9yKDtwPGg7KytwKWRbcF09cltwXTtjPTA7Zm9yKDtwPDMyOylkW3ArK109dFtjKytdO3ZhciBtLGc9dShkLDAscCkseT1vPj4zO2lmKGk+PTMpZm9yKGM9MDtjPDUwOysrYylnPXUoZywwLGcubGVuZ3RoKTtpZihpPj0zKXttPWE7dmFyIGIsdj1uZXcgVWludDhBcnJheSh5KTtmb3IoYz0xOTtjPj0wO2MtLSl7Zm9yKGI9MDtiPHk7KytiKXZbYl09Z1tiXV5jO209bmV3IGwodikuZW5jcnlwdEJsb2NrKG0pfX1lbHNlIG09bmV3IGwoZy5zdWJhcnJheSgwLHkpKS5lbmNyeXB0QmxvY2soYSk7cmV0dXJuIG19KEEsdixfLG0pLHYsdyxDLF8sbSx4KX1pZighVCl0aHJvdyBuZXcgaS5QYXNzd29yZEV4Y2VwdGlvbigiSW5jb3JyZWN0IFBhc3N3b3JkIixpLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCk7dGhpcy5lbmNyeXB0aW9uS2V5PVQ7aWYocD49NCl7dmFyIEw9YS5nZXQoIkNGIik7KDAsby5pc0RpY3QpKEwpJiYoTC5zdXBwcmVzc0VuY3J5cHRpb249ITApO3RoaXMuY2Y9TDt0aGlzLnN0bWY9YS5nZXQoIlN0bUYiKXx8cjt0aGlzLnN0cmY9YS5nZXQoIlN0ckYiKXx8cjt0aGlzLmVmZj1hLmdldCgiRUZGIil8fHRoaXMuc3RtZn19ZnVuY3Rpb24gYnVpbGRPYmplY3RLZXkodCxyLGEsaSl7dmFyIG8sYyxsPW5ldyBVaW50OEFycmF5KGEubGVuZ3RoKzkpO2ZvcihvPTAsYz1hLmxlbmd0aDtvPGM7KytvKWxbb109YVtvXTtsW28rK109MjU1JnQ7bFtvKytdPXQ+PjgmMjU1O2xbbysrXT10Pj4xNiYyNTU7bFtvKytdPTI1NSZyO2xbbysrXT1yPj44JjI1NTtpZihpKXtsW28rK109MTE1O2xbbysrXT02NTtsW28rK109MTA4O2xbbysrXT04NH1yZXR1cm4gdShsLDAsbykuc3ViYXJyYXkoMCxNYXRoLm1pbihhLmxlbmd0aCs1LDE2KSl9ZnVuY3Rpb24gYnVpbGRDaXBoZXJDb25zdHJ1Y3Rvcih0LHIsYSxjLHUpe2lmKCEoMCxvLmlzTmFtZSkocikpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkludmFsaWQgY3J5cHQgZmlsdGVyIG5hbWUuIik7dmFyIGgsZD10LmdldChyLm5hbWUpO251bGwhPWQmJihoPWQuZ2V0KCJDRk0iKSk7aWYoIWh8fCJOb25lIj09PWgubmFtZSlyZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JOb25lKCl7cmV0dXJuIG5ldyBnfTtpZigiVjIiPT09aC5uYW1lKXJldHVybiBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1GYWN0b3J5QnVpbGRDaXBoZXJDb25zdHJ1Y3RvclYyKCl7cmV0dXJuIG5ldyBsKGJ1aWxkT2JqZWN0S2V5KGEsYyx1LCExKSl9O2lmKCJBRVNWMiI9PT1oLm5hbWUpcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yQUVTVjIoKXtyZXR1cm4gbmV3IGIoYnVpbGRPYmplY3RLZXkoYSxjLHUsITApKX07aWYoIkFFU1YzIj09PWgubmFtZSlyZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JBRVNWMygpe3JldHVybiBuZXcgdih1KX07dGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIlVua25vd24gY3J5cHRvIG1ldGhvZCIpfUNpcGhlclRyYW5zZm9ybUZhY3RvcnkucHJvdG90eXBlPXtjcmVhdGVDaXBoZXJUcmFuc2Zvcm06ZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeV9jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odCxyKXtpZig0PT09dGhpcy5hbGdvcml0aG18fDU9PT10aGlzLmFsZ29yaXRobSlyZXR1cm4gbmV3IHcoYnVpbGRDaXBoZXJDb25zdHJ1Y3Rvcih0aGlzLmNmLHRoaXMuc3RtZix0LHIsdGhpcy5lbmNyeXB0aW9uS2V5KSxidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsdGhpcy5zdHJmLHQscix0aGlzLmVuY3J5cHRpb25LZXkpKTt2YXIgYT1idWlsZE9iamVjdEtleSh0LHIsdGhpcy5lbmNyeXB0aW9uS2V5LCExKSxpPWZ1bmN0aW9uIGJ1aWxkQ2lwaGVyQ2lwaGVyQ29uc3RydWN0b3IoKXtyZXR1cm4gbmV3IGwoYSl9O3JldHVybiBuZXcgdyhpLGkpfX07cmV0dXJuIENpcGhlclRyYW5zZm9ybUZhY3Rvcnl9KCk7ci5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5PUN9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuQ29sb3JTcGFjZT12b2lkIDA7dmFyIGk9ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KGEoMikpLG89YSg1KSxjPWEoMjAyKSxsPWEoMjA1KTtmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIF9pbmhlcml0cyh0LHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByJiZudWxsIT09cil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtyJiZfc2V0UHJvdG90eXBlT2YodCxyKX1mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXtyZXR1cm4oX3NldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7dC5fX3Byb3RvX189cjtyZXR1cm4gdH0pKHQscil9ZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKHQpe3ZhciByPWZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7RGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSk7cmV0dXJuITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpe3ZhciBhLGk9X2dldFByb3RvdHlwZU9mKHQpO2lmKHIpe3ZhciBvPV9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjthPVJlZmxlY3QuY29uc3RydWN0KGksYXJndW1lbnRzLG8pfWVsc2UgYT1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcyxhKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCxyKXtyZXR1cm4hcnx8Im9iamVjdCIhPT1fdHlwZW9mKHIpJiYiZnVuY3Rpb24iIT10eXBlb2Ygcj9mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH0odCk6cn1mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuKF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcCh0LHIsYSxpLG8sYyxsKXt0cnl7dmFyIHU9dFtjXShsKSxoPXUudmFsdWV9Y2F0Y2godCl7YSh0KTtyZXR1cm59dS5kb25lP3IoaCk6UHJvbWlzZS5yZXNvbHZlKGgpLnRoZW4oaSxvKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIENvbG9yU3BhY2UodCxyKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDb2xvclNwYWNlKTt0aGlzLmNvbnN0cnVjdG9yPT09Q29sb3JTcGFjZSYmKDAsby51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIENvbG9yU3BhY2UuIik7dGhpcy5uYW1lPXQ7dGhpcy5udW1Db21wcz1yfV9jcmVhdGVDbGFzcyhDb2xvclNwYWNlLFt7a2V5OiJnZXRSZ2IiLHZhbHVlOmZ1bmN0aW9uIGdldFJnYih0LHIpe3ZhciBhPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKTt0aGlzLmdldFJnYkl0ZW0odCxyLGEsMCk7cmV0dXJuIGF9fSx7a2V5OiJnZXRSZ2JJdGVtIix2YWx1ZTpmdW5jdGlvbiBnZXRSZ2JJdGVtKHQscixhLGkpeygwLG8udW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIil9fSx7a2V5OiJnZXRSZ2JCdWZmZXIiLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkJ1ZmZlcih0LHIsYSxpLGMsbCx1KXsoMCxvLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0UmdiQnVmZmVyIil9fSx7a2V5OiJnZXRPdXRwdXRMZW5ndGgiLHZhbHVlOmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aCh0LHIpeygwLG8udW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGgiKX19LHtrZXk6ImlzUGFzc3Rocm91Z2giLHZhbHVlOmZ1bmN0aW9uIGlzUGFzc3Rocm91Z2godCl7cmV0dXJuITF9fSx7a2V5OiJpc0RlZmF1bHREZWNvZGUiLHZhbHVlOmZ1bmN0aW9uIGlzRGVmYXVsdERlY29kZSh0LHIpe3JldHVybiBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0LHRoaXMubnVtQ29tcHMpfX0se2tleToiZmlsbFJnYiIsdmFsdWU6ZnVuY3Rpb24gZmlsbFJnYih0LHIsYSxpLG8sYyxsLHUsaCl7dmFyIGQ9ciphLHA9bnVsbCxtPTE8PGwsZz1hIT09b3x8ciE9PWk7aWYodGhpcy5pc1Bhc3N0aHJvdWdoKGwpKXA9dTtlbHNlIGlmKDE9PT10aGlzLm51bUNvbXBzJiZkPm0mJiJEZXZpY2VHcmF5IiE9PXRoaXMubmFtZSYmIkRldmljZVJHQiIhPT10aGlzLm5hbWUpe2Zvcih2YXIgeT1sPD04P25ldyBVaW50OEFycmF5KG0pOm5ldyBVaW50MTZBcnJheShtKSxiPTA7YjxtO2IrKyl5W2JdPWI7dmFyIHY9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMqbSk7dGhpcy5nZXRSZ2JCdWZmZXIoeSwwLG0sdiwwLGwsMCk7aWYoZyl7cD1uZXcgVWludDhBcnJheSgzKmQpO2Zvcih2YXIgUz0wLGs9MDtrPGQ7KytrKXt2YXIgdz0zKnVba107cFtTKytdPXZbd107cFtTKytdPXZbdysxXTtwW1MrK109dlt3KzJdfX1lbHNlIGZvcih2YXIgQz0wLF89MDtfPGQ7KytfKXt2YXIgeD0zKnVbX107dFtDKytdPXZbeF07dFtDKytdPXZbeCsxXTt0W0MrK109dlt4KzJdO0MrPWh9fWVsc2UgaWYoZyl7cD1uZXcgVWludDhDbGFtcGVkQXJyYXkoMypkKTt0aGlzLmdldFJnYkJ1ZmZlcih1LDAsZCxwLDAsbCwwKX1lbHNlIHRoaXMuZ2V0UmdiQnVmZmVyKHUsMCxpKmMsdCwwLGwsaCk7aWYocClpZihnKSFmdW5jdGlvbiByZXNpemVSZ2JJbWFnZSh0LHIsYSxpLG8sYyxsKXtsPTEhPT1sPzA6bDtmb3IodmFyIHUsaD1hL28sZD1pL2MscD0wLG09bmV3IFVpbnQxNkFycmF5KG8pLGc9MyphLHk9MDt5PG87eSsrKW1beV09MypNYXRoLmZsb29yKHkqaCk7Zm9yKHZhciBiPTA7YjxjO2IrKylmb3IodmFyIHY9TWF0aC5mbG9vcihiKmQpKmcsUz0wO1M8bztTKyspe3U9dittW1NdO3JbcCsrXT10W3UrK107cltwKytdPXRbdSsrXTtyW3ArK109dFt1KytdO3ArPWx9fShwLHQscixhLGksbyxoKTtlbHNlIGZvcih2YXIgQT0wLFQ9MCxSPTAsST1pKmM7UjxJO1IrKyl7dFtBKytdPXBbVCsrXTt0W0ErK109cFtUKytdO3RbQSsrXT1wW1QrK107QSs9aH19fSx7a2V5OiJ1c2VzWmVyb1RvT25lUmFuZ2UiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4oMCxvLnNoYWRvdykodGhpcywidXNlc1plcm9Ub09uZVJhbmdlIiwhMCl9fV0sW3trZXk6Il9jYWNoZSIsdmFsdWU6ZnVuY3Rpb24gX2NhY2hlKHQscixhLGkpe2lmKCFhKXRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCAibG9jYWxDb2xvclNwYWNlQ2FjaGUiIGFyZ3VtZW50LicpO2lmKCFpKXRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkQ29sb3JTcGFjZSIgYXJndW1lbnQuJyk7dmFyIG8sbDtpZih0IGluc3RhbmNlb2YgYy5SZWYpe2w9dDt0PXIuZmV0Y2godCl9dCBpbnN0YW5jZW9mIGMuTmFtZSYmKG89dC5uYW1lKTsob3x8bCkmJmEuc2V0KG8sbCxpKX19LHtrZXk6ImdldENhY2hlZCIsdmFsdWU6ZnVuY3Rpb24gZ2V0Q2FjaGVkKHQscixhKXtpZighYSl0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuZ2V0Q2FjaGVkIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTtpZih0IGluc3RhbmNlb2YgYy5SZWYpe3ZhciBpPWEuZ2V0QnlSZWYodCk7aWYoaSlyZXR1cm4gaTt0cnl7dD1yLmZldGNoKHQpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBsLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHR9fWlmKHQgaW5zdGFuY2VvZiBjLk5hbWUpe3ZhciBvPWEuZ2V0QnlOYW1lKHQubmFtZSk7aWYobylyZXR1cm4gb31yZXR1cm4gbnVsbH19LHtrZXk6InBhcnNlQXN5bmMiLHZhbHVlOih0PWZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsYT1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLG8pe3ZhciBjPXQuYXBwbHkocixhKTtmdW5jdGlvbiBfbmV4dCh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJuZXh0Iix0KX1mdW5jdGlvbiBfdGhyb3codCl7YXN5bmNHZW5lcmF0b3JTdGVwKGMsaSxvLF9uZXh0LF90aHJvdywidGhyb3ciLHQpfV9uZXh0KHZvaWQgMCl9KSl9fShpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSh0KXt2YXIgcixhLG8sYyxsLHUsaDtyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUkKGkpe2Zvcig7Oylzd2l0Y2goaS5wcmV2PWkubmV4dCl7Y2FzZSAwOnI9dC5jcyxhPXQueHJlZixvPXQucmVzb3VyY2VzLGM9dm9pZCAwPT09bz9udWxsOm8sbD10LnBkZkZ1bmN0aW9uRmFjdG9yeSx1PXQubG9jYWxDb2xvclNwYWNlQ2FjaGU7aD10aGlzLl9wYXJzZShyLGEsYyxsKTt0aGlzLl9jYWNoZShyLGEsdSxoKTtyZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsaCk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZSx0aGlzKX0pKSksZnVuY3Rpb24gcGFyc2VBc3luYyhyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToicGFyc2UiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlKHQpe3ZhciByPXQuY3MsYT10LnhyZWYsaT10LnJlc291cmNlcyxvPXZvaWQgMD09PWk/bnVsbDppLGM9dC5wZGZGdW5jdGlvbkZhY3RvcnksbD10LmxvY2FsQ29sb3JTcGFjZUNhY2hlLHU9dGhpcy5nZXRDYWNoZWQocixhLGwpO2lmKHUpcmV0dXJuIHU7dmFyIGg9dGhpcy5fcGFyc2UocixhLG8sYyk7dGhpcy5fY2FjaGUocixhLGwsaCk7cmV0dXJuIGh9fSx7a2V5OiJfcGFyc2UiLHZhbHVlOmZ1bmN0aW9uIF9wYXJzZSh0LHIpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGk9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dD1yLmZldGNoSWZSZWYodCk7aWYoKDAsYy5pc05hbWUpKHQpKXN3aXRjaCh0Lm5hbWUpe2Nhc2UiRGV2aWNlR3JheSI6Y2FzZSJHIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7Y2FzZSJEZXZpY2VSR0IiOmNhc2UiUkdCIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtjYXNlIkRldmljZUNNWUsiOmNhc2UiQ01ZSyI6cmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO2Nhc2UiUGF0dGVybiI6cmV0dXJuIG5ldyBkKG51bGwpO2RlZmF1bHQ6aWYoKDAsYy5pc0RpY3QpKGEpKXt2YXIgbD1hLmdldCgiQ29sb3JTcGFjZSIpO2lmKCgwLGMuaXNEaWN0KShsKSl7dmFyIHU9bC5nZXQodC5uYW1lKTtpZih1KXtpZigoMCxjLmlzTmFtZSkodSkpcmV0dXJuIHRoaXMuX3BhcnNlKHUscixhLGkpO3Q9dTticmVha319fXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJVbnJlY29nbml6ZWQgQ29sb3JTcGFjZTogIi5jb25jYXQodC5uYW1lKSl9aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG0sZyx5LGssdyxDLF89ci5mZXRjaElmUmVmKHRbMF0pLm5hbWU7c3dpdGNoKF8pe2Nhc2UiRGV2aWNlR3JheSI6Y2FzZSJHIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7Y2FzZSJEZXZpY2VSR0IiOmNhc2UiUkdCIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtjYXNlIkRldmljZUNNWUsiOmNhc2UiQ01ZSyI6cmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO2Nhc2UiQ2FsR3JheSI6az0obT1yLmZldGNoSWZSZWYodFsxXSkpLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7dz1tLmdldEFycmF5KCJCbGFja1BvaW50Iik7Qz1tLmdldCgiR2FtbWEiKTtyZXR1cm4gbmV3IGIoayx3LEMpO2Nhc2UiQ2FsUkdCIjprPShtPXIuZmV0Y2hJZlJlZih0WzFdKSkuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTt3PW0uZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTtDPW0uZ2V0QXJyYXkoIkdhbW1hIik7dmFyIHg9bS5nZXRBcnJheSgiTWF0cml4Iik7cmV0dXJuIG5ldyB2KGssdyxDLHgpO2Nhc2UiSUNDQmFzZWQiOnZhciBBPXIuZmV0Y2hJZlJlZih0WzFdKSxUPUEuZGljdDtnPVQuZ2V0KCJOIik7dmFyIFI9VC5nZXQoIkFsdGVybmF0ZSIpO2lmKFIpe3ZhciBJPXRoaXMuX3BhcnNlKFIscixhLGkpO2lmKEkubnVtQ29tcHM9PT1nKXJldHVybiBJOygwLG8ud2FybikoIklDQ0Jhc2VkIGNvbG9yIHNwYWNlOiBJZ25vcmluZyBpbmNvcnJlY3QgL0FsdGVybmF0ZSBlbnRyeS4iKX1pZigxPT09ZylyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7aWYoMz09PWcpcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5yZ2I7aWYoND09PWcpcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO2JyZWFrO2Nhc2UiUGF0dGVybiI6KHk9dFsxXXx8bnVsbCkmJih5PXRoaXMuX3BhcnNlKHkscixhLGkpKTtyZXR1cm4gbmV3IGQoeSk7Y2FzZSJJbmRleGVkIjpjYXNlIkkiOnk9dGhpcy5fcGFyc2UodFsxXSxyLGEsaSk7dmFyIFA9ci5mZXRjaElmUmVmKHRbMl0pKzEsTz1yLmZldGNoSWZSZWYodFszXSk7cmV0dXJuIG5ldyBwKHksUCxPKTtjYXNlIlNlcGFyYXRpb24iOmNhc2UiRGV2aWNlTiI6dmFyIEU9ci5mZXRjaElmUmVmKHRbMV0pO2c9QXJyYXkuaXNBcnJheShFKT9FLmxlbmd0aDoxO3k9dGhpcy5fcGFyc2UodFsyXSxyLGEsaSk7dmFyIEI9aS5jcmVhdGUodFszXSk7cmV0dXJuIG5ldyBoKGcseSxCKTtjYXNlIkxhYiI6az0obT1yLmZldGNoSWZSZWYodFsxXSkpLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7dz1tLmdldEFycmF5KCJCbGFja1BvaW50Iik7dmFyIEQ9bS5nZXRBcnJheSgiUmFuZ2UiKTtyZXR1cm4gbmV3IFMoayx3LEQpO2RlZmF1bHQ6dGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlVuaW1wbGVtZW50ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICIuY29uY2F0KF8pKX19dGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogIi5jb25jYXQodCkpfX0se2tleToiaXNEZWZhdWx0RGVjb2RlIix2YWx1ZTpmdW5jdGlvbiBpc0RlZmF1bHREZWNvZGUodCxyKXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4hMDtpZigyKnIhPT10Lmxlbmd0aCl7KDAsby53YXJuKSgiVGhlIGRlY29kZSBtYXAgaXMgbm90IHRoZSBjb3JyZWN0IGxlbmd0aCIpO3JldHVybiEwfWZvcih2YXIgYT0wLGk9dC5sZW5ndGg7YTxpO2ErPTIpaWYoMCE9PXRbYV18fDEhPT10W2ErMV0pcmV0dXJuITE7cmV0dXJuITB9fSx7a2V5OiJzaW5nbGV0b25zIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsInNpbmdsZXRvbnMiLHtnZXQgZ3JheSgpe3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJncmF5IixuZXcgbSl9LGdldCByZ2IoKXtyZXR1cm4oMCxvLnNoYWRvdykodGhpcywicmdiIixuZXcgZyl9LGdldCBjbXlrKCl7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsImNteWsiLG5ldyB5KX19KX19XSk7dmFyIHQ7cmV0dXJuIENvbG9yU3BhY2V9KCk7ci5Db2xvclNwYWNlPXU7dmFyIGg9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEFsdGVybmF0ZUNTLHQpO3ZhciByPV9jcmVhdGVTdXBlcihBbHRlcm5hdGVDUyk7ZnVuY3Rpb24gQWx0ZXJuYXRlQ1ModCxhLGkpe3ZhciBvO19jbGFzc0NhbGxDaGVjayh0aGlzLEFsdGVybmF0ZUNTKTsobz1yLmNhbGwodGhpcywiQWx0ZXJuYXRlIix0KSkuYmFzZT1hO28udGludEZuPWk7by50bXBCdWY9bmV3IEZsb2F0MzJBcnJheShhLm51bUNvbXBzKTtyZXR1cm4gb31fY3JlYXRlQ2xhc3MoQWx0ZXJuYXRlQ1MsW3trZXk6ImdldFJnYkl0ZW0iLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkl0ZW0odCxyLGEsaSl7dmFyIG89dGhpcy50bXBCdWY7dGhpcy50aW50Rm4odCxyLG8sMCk7dGhpcy5iYXNlLmdldFJnYkl0ZW0obywwLGEsaSl9fSx7a2V5OiJnZXRSZ2JCdWZmZXIiLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkJ1ZmZlcih0LHIsYSxpLG8sYyxsKXt2YXIgdSxoLGQ9dGhpcy50aW50Rm4scD10aGlzLmJhc2UsbT0xLygoMTw8YyktMSksZz1wLm51bUNvbXBzLHk9cC51c2VzWmVyb1RvT25lUmFuZ2UsYj0ocC5pc1Bhc3N0aHJvdWdoKDgpfHwheSkmJjA9PT1sLHY9Yj9vOjAsUz1iP2k6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGcqYSksaz10aGlzLm51bUNvbXBzLHc9bmV3IEZsb2F0MzJBcnJheShrKSxDPW5ldyBGbG9hdDMyQXJyYXkoZyk7Zm9yKHU9MDt1PGE7dSsrKXtmb3IoaD0wO2g8aztoKyspd1toXT10W3IrK10qbTtkKHcsMCxDLDApO2lmKHkpZm9yKGg9MDtoPGc7aCsrKVNbdisrXT0yNTUqQ1toXTtlbHNle3AuZ2V0UmdiSXRlbShDLDAsUyx2KTt2Kz1nfX1ifHxwLmdldFJnYkJ1ZmZlcihTLDAsYSxpLG8sOCxsKX19LHtrZXk6ImdldE91dHB1dExlbmd0aCIsdmFsdWU6ZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKHQscil7cmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgodCp0aGlzLmJhc2UubnVtQ29tcHMvdGhpcy5udW1Db21wcyxyKX19XSk7cmV0dXJuIEFsdGVybmF0ZUNTfSh1KSxkPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhQYXR0ZXJuQ1MsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFBhdHRlcm5DUyk7ZnVuY3Rpb24gUGF0dGVybkNTKHQpe3ZhciBhO19jbGFzc0NhbGxDaGVjayh0aGlzLFBhdHRlcm5DUyk7KGE9ci5jYWxsKHRoaXMsIlBhdHRlcm4iLG51bGwpKS5iYXNlPXQ7cmV0dXJuIGF9X2NyZWF0ZUNsYXNzKFBhdHRlcm5DUyxbe2tleToiaXNEZWZhdWx0RGVjb2RlIix2YWx1ZTpmdW5jdGlvbiBpc0RlZmF1bHREZWNvZGUodCxyKXsoMCxvLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm5DUy5pc0RlZmF1bHREZWNvZGUiKX19XSk7cmV0dXJuIFBhdHRlcm5DU30odSkscD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoSW5kZXhlZENTLHQpO3ZhciByPV9jcmVhdGVTdXBlcihJbmRleGVkQ1MpO2Z1bmN0aW9uIEluZGV4ZWRDUyh0LGEsaSl7dmFyIGw7X2NsYXNzQ2FsbENoZWNrKHRoaXMsSW5kZXhlZENTKTsobD1yLmNhbGwodGhpcywiSW5kZXhlZCIsMSkpLmJhc2U9dDtsLmhpZ2hWYWw9YTt2YXIgdT10Lm51bUNvbXBzKmE7bC5sb29rdXA9bmV3IFVpbnQ4QXJyYXkodSk7aWYoKDAsYy5pc1N0cmVhbSkoaSkpe3ZhciBoPWkuZ2V0Qnl0ZXModSk7bC5sb29rdXAuc2V0KGgpfWVsc2V7aWYoInN0cmluZyIhPXR5cGVvZiBpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJJbmRleGVkQ1MgLSB1bnJlY29nbml6ZWQgbG9va3VwIHRhYmxlOiAiLmNvbmNhdChpKSk7Zm9yKHZhciBkPTA7ZDx1OysrZClsLmxvb2t1cFtkXT0yNTUmaS5jaGFyQ29kZUF0KGQpfXJldHVybiBsfV9jcmVhdGVDbGFzcyhJbmRleGVkQ1MsW3trZXk6ImdldFJnYkl0ZW0iLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkl0ZW0odCxyLGEsaSl7dmFyIG89dGhpcy5iYXNlLm51bUNvbXBzLGM9dFtyXSpvO3RoaXMuYmFzZS5nZXRSZ2JCdWZmZXIodGhpcy5sb29rdXAsYywxLGEsaSw4LDApfX0se2tleToiZ2V0UmdiQnVmZmVyIix2YWx1ZTpmdW5jdGlvbiBnZXRSZ2JCdWZmZXIodCxyLGEsaSxvLGMsbCl7Zm9yKHZhciB1PXRoaXMuYmFzZSxoPXUubnVtQ29tcHMsZD11LmdldE91dHB1dExlbmd0aChoLGwpLHA9dGhpcy5sb29rdXAsbT0wO208YTsrK20pe3ZhciBnPXRbcisrXSpoO3UuZ2V0UmdiQnVmZmVyKHAsZywxLGksbyw4LGwpO28rPWR9fX0se2tleToiZ2V0T3V0cHV0TGVuZ3RoIix2YWx1ZTpmdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgodCxyKXtyZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aCh0KnRoaXMuYmFzZS5udW1Db21wcyxyKX19LHtrZXk6ImlzRGVmYXVsdERlY29kZSIsdmFsdWU6ZnVuY3Rpb24gaXNEZWZhdWx0RGVjb2RlKHQscil7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuITA7aWYoMiE9PXQubGVuZ3RoKXsoMCxvLndhcm4pKCJEZWNvZGUgbWFwIGxlbmd0aCBpcyBub3QgY29ycmVjdCIpO3JldHVybiEwfWlmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHxyPDEpeygwLG8ud2FybikoIkJpdHMgcGVyIGNvbXBvbmVudCBpcyBub3QgY29ycmVjdCIpO3JldHVybiEwfXJldHVybiAwPT09dFswXSYmdFsxXT09PSgxPDxyKS0xfX1dKTtyZXR1cm4gSW5kZXhlZENTfSh1KSxtPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhEZXZpY2VHcmF5Q1MsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKERldmljZUdyYXlDUyk7ZnVuY3Rpb24gRGV2aWNlR3JheUNTKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRGV2aWNlR3JheUNTKTtyZXR1cm4gci5jYWxsKHRoaXMsIkRldmljZUdyYXkiLDEpfV9jcmVhdGVDbGFzcyhEZXZpY2VHcmF5Q1MsW3trZXk6ImdldFJnYkl0ZW0iLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkl0ZW0odCxyLGEsaSl7dmFyIG89MjU1KnRbcl07YVtpXT1hW2krMV09YVtpKzJdPW99fSx7a2V5OiJnZXRSZ2JCdWZmZXIiLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkJ1ZmZlcih0LHIsYSxpLG8sYyxsKXtmb3IodmFyIHU9MjU1LygoMTw8YyktMSksaD1yLGQ9byxwPTA7cDxhOysrcCl7dmFyIG09dSp0W2grK107aVtkKytdPW07aVtkKytdPW07aVtkKytdPW07ZCs9bH19fSx7a2V5OiJnZXRPdXRwdXRMZW5ndGgiLHZhbHVlOmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aCh0LHIpe3JldHVybiB0KigzK3IpfX1dKTtyZXR1cm4gRGV2aWNlR3JheUNTfSh1KSxnPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhEZXZpY2VSZ2JDUyx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoRGV2aWNlUmdiQ1MpO2Z1bmN0aW9uIERldmljZVJnYkNTKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRGV2aWNlUmdiQ1MpO3JldHVybiByLmNhbGwodGhpcywiRGV2aWNlUkdCIiwzKX1fY3JlYXRlQ2xhc3MoRGV2aWNlUmdiQ1MsW3trZXk6ImdldFJnYkl0ZW0iLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkl0ZW0odCxyLGEsaSl7YVtpXT0yNTUqdFtyXTthW2krMV09MjU1KnRbcisxXTthW2krMl09MjU1KnRbcisyXX19LHtrZXk6ImdldFJnYkJ1ZmZlciIsdmFsdWU6ZnVuY3Rpb24gZ2V0UmdiQnVmZmVyKHQscixhLGksbyxjLGwpe2lmKDghPT1jfHwwIT09bClmb3IodmFyIHU9MjU1LygoMTw8YyktMSksaD1yLGQ9byxwPTA7cDxhOysrcCl7aVtkKytdPXUqdFtoKytdO2lbZCsrXT11KnRbaCsrXTtpW2QrK109dSp0W2grK107ZCs9bH1lbHNlIGkuc2V0KHQuc3ViYXJyYXkocixyKzMqYSksbyl9fSx7a2V5OiJnZXRPdXRwdXRMZW5ndGgiLHZhbHVlOmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aCh0LHIpe3JldHVybiB0KigzK3IpLzN8MH19LHtrZXk6ImlzUGFzc3Rocm91Z2giLHZhbHVlOmZ1bmN0aW9uIGlzUGFzc3Rocm91Z2godCl7cmV0dXJuIDg9PT10fX1dKTtyZXR1cm4gRGV2aWNlUmdiQ1N9KHUpLHk9ZnVuY3Rpb24gRGV2aWNlQ215a0NTQ2xvc3VyZSgpe2Z1bmN0aW9uIGNvbnZlcnRUb1JnYih0LHIsYSxpLG8pe3ZhciBjPXRbcl0qYSxsPXRbcisxXSphLHU9dFtyKzJdKmEsaD10W3IrM10qYTtpW29dPTI1NStjKigtNC4zODczMzIzODQ2MDk5ODgqYys1NC40ODYxNTE5NDE4OTE3NipsKzE4LjgyMjkwNTAyMTY1MzAyKnUrMjEyLjI1NjYyNDUxNjM5NTg1KmgtMjg1LjIzMzEwMjYxMzcwMDQpK2wqKDEuNzE0OTc2MzQ3NzM2MjEzNCpsLTUuNjA5NjczNjkwNDA0NzMxNSp1Ky0xNy44NzM4NzA4NjE0MTU0NDQqaC01LjQ5NzAwNjQyNzE5NjM2NikrdSooLTIuNTIxNzM0MDEzMTY4MzAzMyp1LTIxLjI0ODkyMzMzNzM1MzA3MypoKzE3LjUxMTkyNzA4NDE4MTMpK2gqKC0yMS44NjEyMjE0NzQ2MzYwNSpoLTE4OS40ODE4MDgzNTkyMjc0Nyk7aVtvKzFdPTI1NStjKig4Ljg0MTA0MTQyMjAzNjE0OSpjKzYwLjExODAyNzA0NTU5NzM2NipsKzYuODcxNDI1NTkyMDQ5MDA3KnUrMzEuMTU5MTAwMTMwMDU1OTIyKmgtNzkuMjk3MDg0NDgxNjU0OCkrbCooLTE1LjMxMDM2MTMwNjk2NzgxNypsKzE3LjU3NTI1MTI2MTEwOTQ4Mip1KzEzMS4zNTI1MDkxMjQ5Mzk3NipoLTE5MC45NDUzMzAyNTg4OTUxKSt1Kig0LjQ0NDMzOTEwMjg1MjczOSp1KzkuODYzMjg2MTQ5MzQwNSpoLTI0Ljg2NzQxNTgyNTU1ODc4KStoKigtMjAuNzM3MzI1NDcxMTgxMDM0KmgtMTg3LjgwNDUzNzA5NzE5NTc4KTtpW28rMl09MjU1K2MqKC44ODQyNTIyNDMwMDAzMjk2KmMrOC4wNzg2Nzc1MDMxMTI5MjgqbCszMC44OTk3ODMwOTcwMzcyOSp1LS4yMzg4MzIzODY4OTE3ODkzNCpoLTE0LjE4MzU3Njc5OTY3MzI4NikrbCooMTAuNDk1OTMyNzM0MzIwNzIqbCs2My4wMjM3ODQ5NDc1NDA1Mip1KzUwLjYwNjk1NzY1NjM2MDczNCpoLTExMi4yMzg4NDI1MzcxOTI0OCkrdSooLjAzMjk2MDQxMTE0ODczMjE3KnUrMTE1LjYwMzg0NDQ5NjQ2NjQxKmgtMTkzLjU4MjA5MzU2ODYxNTA1KStoKigtMjIuMzM4MTY4MDczMDk4ODYqaC0xODAuMTI2MTM5NzQ3MDgzNjcpfXJldHVybiBmdW5jdGlvbih0KXtfaW5oZXJpdHMoRGV2aWNlQ215a0NTLHQpO3ZhciByPV9jcmVhdGVTdXBlcihEZXZpY2VDbXlrQ1MpO2Z1bmN0aW9uIERldmljZUNteWtDUygpe19jbGFzc0NhbGxDaGVjayh0aGlzLERldmljZUNteWtDUyk7cmV0dXJuIHIuY2FsbCh0aGlzLCJEZXZpY2VDTVlLIiw0KX1fY3JlYXRlQ2xhc3MoRGV2aWNlQ215a0NTLFt7a2V5OiJnZXRSZ2JJdGVtIix2YWx1ZTpmdW5jdGlvbiBnZXRSZ2JJdGVtKHQscixhLGkpe2NvbnZlcnRUb1JnYih0LHIsMSxhLGkpfX0se2tleToiZ2V0UmdiQnVmZmVyIix2YWx1ZTpmdW5jdGlvbiBnZXRSZ2JCdWZmZXIodCxyLGEsaSxvLGMsbCl7Zm9yKHZhciB1PTEvKCgxPDxjKS0xKSxoPTA7aDxhO2grKyl7Y29udmVydFRvUmdiKHQscix1LGksbyk7cis9NDtvKz0zK2x9fX0se2tleToiZ2V0T3V0cHV0TGVuZ3RoIix2YWx1ZTpmdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgodCxyKXtyZXR1cm4gdC80KigzK3IpfDB9fV0pO3JldHVybiBEZXZpY2VDbXlrQ1N9KHUpfSgpLGI9ZnVuY3Rpb24gQ2FsR3JheUNTQ2xvc3VyZSgpe2Z1bmN0aW9uIGNvbnZlcnRUb1JnYih0LHIsYSxpLG8sYyl7dmFyIGw9clthXSpjLHU9TWF0aC5wb3cobCx0LkcpLGg9dC5ZVyp1LGQ9TWF0aC5tYXgoMjk1LjgqTWF0aC5wb3coaCwuMzMzMzMzMzMzMzMzMzMzMyktNDAuOCwwKTtpW29dPWQ7aVtvKzFdPWQ7aVtvKzJdPWR9cmV0dXJuIGZ1bmN0aW9uKHQpe19pbmhlcml0cyhDYWxHcmF5Q1MsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKENhbEdyYXlDUyk7ZnVuY3Rpb24gQ2FsR3JheUNTKHQsYSxpKXt2YXIgYztfY2xhc3NDYWxsQ2hlY2sodGhpcyxDYWxHcmF5Q1MpO2M9ci5jYWxsKHRoaXMsIkNhbEdyYXkiLDEpO2lmKCF0KXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsR3JheSIpO2E9YXx8WzAsMCwwXTtpPWl8fDE7Yy5YVz10WzBdO2MuWVc9dFsxXTtjLlpXPXRbMl07Yy5YQj1hWzBdO2MuWUI9YVsxXTtjLlpCPWFbMl07Yy5HPWk7aWYoYy5YVzwwfHxjLlpXPDB8fDEhPT1jLllXKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgIi5jb25jYXQoYy5uYW1lKSsiLCBubyBmYWxsYmFjayBhdmFpbGFibGUiKTtpZihjLlhCPDB8fGMuWUI8MHx8Yy5aQjwwKXsoMCxvLmluZm8pKCJJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICIuY29uY2F0KGMubmFtZSwiLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC4iKSk7Yy5YQj1jLllCPWMuWkI9MH0wPT09Yy5YQiYmMD09PWMuWUImJjA9PT1jLlpCfHwoMCxvLndhcm4pKCIiLmNvbmNhdChjLm5hbWUsIiwgQmxhY2tQb2ludDogWEI6ICIpLmNvbmNhdChjLlhCLCIsIFlCOiAiKS5jb25jYXQoYy5ZQiwiLCAiKSsiWkI6ICIuY29uY2F0KGMuWkIsIiwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLiIpKTtpZihjLkc8MSl7KDAsby5pbmZvKSgiSW52YWxpZCBHYW1tYTogIi5jb25jYXQoYy5HLCIgZm9yICIpLmNvbmNhdChjLm5hbWUsIiwgIikrImZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpO2MuRz0xfXJldHVybiBjfV9jcmVhdGVDbGFzcyhDYWxHcmF5Q1MsW3trZXk6ImdldFJnYkl0ZW0iLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkl0ZW0odCxyLGEsaSl7Y29udmVydFRvUmdiKHRoaXMsdCxyLGEsaSwxKX19LHtrZXk6ImdldFJnYkJ1ZmZlciIsdmFsdWU6ZnVuY3Rpb24gZ2V0UmdiQnVmZmVyKHQscixhLGksbyxjLGwpe2Zvcih2YXIgdT0xLygoMTw8YyktMSksaD0wO2g8YTsrK2gpe2NvbnZlcnRUb1JnYih0aGlzLHQscixpLG8sdSk7cis9MTtvKz0zK2x9fX0se2tleToiZ2V0T3V0cHV0TGVuZ3RoIix2YWx1ZTpmdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgodCxyKXtyZXR1cm4gdCooMytyKX19XSk7cmV0dXJuIENhbEdyYXlDU30odSl9KCksdj1mdW5jdGlvbiBDYWxSR0JDU0Nsb3N1cmUoKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KFsuODk1MSwuMjY2NCwtLjE2MTQsLS43NTAyLDEuNzEzNSwuMDM2NywuMDM4OSwtLjA2ODUsMS4wMjk2XSkscj1uZXcgRmxvYXQzMkFycmF5KFsuOTg2OTkyOSwtLjE0NzA1NDMsLjE1OTk2MjcsLjQzMjMwNTMsLjUxODM2MDMsLjA0OTI5MTIsLS4wMDg1Mjg3LC4wNDAwNDI4LC45Njg0ODY3XSksYT1uZXcgRmxvYXQzMkFycmF5KFszLjI0MDQ1NDIsLTEuNTM3MTM4NSwtLjQ5ODUzMTQsLS45NjkyNjYsMS44NzYwMTA4LC4wNDE1NTYsLjA1NTY0MzQsLS4yMDQwMjU5LDEuMDU3MjI1Ml0pLGk9bmV3IEZsb2F0MzJBcnJheShbMSwxLDFdKSxjPW5ldyBGbG9hdDMyQXJyYXkoMyksbD1uZXcgRmxvYXQzMkFycmF5KDMpLGg9bmV3IEZsb2F0MzJBcnJheSgzKSxkPU1hdGgucG93KDI0LzExNiwzKS84O2Z1bmN0aW9uIG1hdHJpeFByb2R1Y3QodCxyLGEpe2FbMF09dFswXSpyWzBdK3RbMV0qclsxXSt0WzJdKnJbMl07YVsxXT10WzNdKnJbMF0rdFs0XSpyWzFdK3RbNV0qclsyXTthWzJdPXRbNl0qclswXSt0WzddKnJbMV0rdFs4XSpyWzJdfWZ1bmN0aW9uIHNSR0JUcmFuc2ZlckZ1bmN0aW9uKHQpe3JldHVybiB0PD0uMDAzMTMwOD9hZGp1c3RUb1JhbmdlKDAsMSwxMi45Mip0KTp0Pj0uOTk1NTQ1MjU/MTphZGp1c3RUb1JhbmdlKDAsMSwxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KX1mdW5jdGlvbiBhZGp1c3RUb1JhbmdlKHQscixhKXtyZXR1cm4gTWF0aC5tYXgodCxNYXRoLm1pbihyLGEpKX1mdW5jdGlvbiBkZWNvZGVMKHQpe3JldHVybiB0PDA/LWRlY29kZUwoLXQpOnQ+OD9NYXRoLnBvdygodCsxNikvMTE2LDMpOnQqZH1mdW5jdGlvbiBjb252ZXJ0VG9SZ2Iobyx1LGQscCxtLGcpe3ZhciB5PWFkanVzdFRvUmFuZ2UoMCwxLHVbZF0qZyksYj1hZGp1c3RUb1JhbmdlKDAsMSx1W2QrMV0qZyksdj1hZGp1c3RUb1JhbmdlKDAsMSx1W2QrMl0qZyksUz0xPT09eT8xOk1hdGgucG93KHksby5HUiksaz0xPT09Yj8xOk1hdGgucG93KGIsby5HRyksdz0xPT09dj8xOk1hdGgucG93KHYsby5HQiksQz1vLk1YQSpTK28uTVhCKmsrby5NWEMqdyxfPW8uTVlBKlMrby5NWUIqaytvLk1ZQyp3LHg9by5NWkEqUytvLk1aQiprK28uTVpDKncsQT1sO0FbMF09QztBWzFdPV87QVsyXT14O3ZhciBUPWg7IWZ1bmN0aW9uIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQoYSxpLG8pe2lmKDEhPT1hWzBdfHwxIT09YVsyXSl7dmFyIGw9bzttYXRyaXhQcm9kdWN0KHQsaSxsKTt2YXIgdT1jOyFmdW5jdGlvbiBjb252ZXJ0VG9GbGF0KHQscixhKXthWzBdPTEqclswXS90WzBdO2FbMV09MSpyWzFdL3RbMV07YVsyXT0xKnJbMl0vdFsyXX0oYSxsLHUpO21hdHJpeFByb2R1Y3Qocix1LG8pfWVsc2V7b1swXT1pWzBdO29bMV09aVsxXTtvWzJdPWlbMl19fShvLndoaXRlUG9pbnQsQSxUKTt2YXIgUj1sOyFmdW5jdGlvbiBjb21wZW5zYXRlQmxhY2tQb2ludCh0LHIsYSl7aWYoMCE9PXRbMF18fDAhPT10WzFdfHwwIT09dFsyXSl7dmFyIGk9ZGVjb2RlTCgwKSxvPSgxLWkpLygxLWRlY29kZUwodFswXSkpLGM9MS1vLGw9KDEtaSkvKDEtZGVjb2RlTCh0WzFdKSksdT0xLWwsaD0oMS1pKS8oMS1kZWNvZGVMKHRbMl0pKSxkPTEtaDthWzBdPXJbMF0qbytjO2FbMV09clsxXSpsK3U7YVsyXT1yWzJdKmgrZH1lbHNle2FbMF09clswXTthWzFdPXJbMV07YVsyXT1yWzJdfX0oby5ibGFja1BvaW50LFQsUik7dmFyIEk9aDshZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRDY1KGEsaSxvKXt2YXIgbD1vO21hdHJpeFByb2R1Y3QodCxpLGwpO3ZhciB1PWM7IWZ1bmN0aW9uIGNvbnZlcnRUb0Q2NSh0LHIsYSl7YVswXT0uOTUwNDcqclswXS90WzBdO2FbMV09MSpyWzFdL3RbMV07YVsyXT0xLjA4ODgzKnJbMl0vdFsyXX0oYSxsLHUpO21hdHJpeFByb2R1Y3Qocix1LG8pfShpLFIsSSk7dmFyIFA9bDttYXRyaXhQcm9kdWN0KGEsSSxQKTtwW21dPTI1NSpzUkdCVHJhbnNmZXJGdW5jdGlvbihQWzBdKTtwW20rMV09MjU1KnNSR0JUcmFuc2ZlckZ1bmN0aW9uKFBbMV0pO3BbbSsyXT0yNTUqc1JHQlRyYW5zZmVyRnVuY3Rpb24oUFsyXSl9cmV0dXJuIGZ1bmN0aW9uKHQpe19pbmhlcml0cyhDYWxSR0JDUyx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoQ2FsUkdCQ1MpO2Z1bmN0aW9uIENhbFJHQkNTKHQsYSxpLGMpe3ZhciBsO19jbGFzc0NhbGxDaGVjayh0aGlzLENhbFJHQkNTKTtsPXIuY2FsbCh0aGlzLCJDYWxSR0IiLDMpO2lmKCF0KXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsUkdCIik7YT1hfHxuZXcgRmxvYXQzMkFycmF5KDMpO2k9aXx8bmV3IEZsb2F0MzJBcnJheShbMSwxLDFdKTtjPWN8fG5ldyBGbG9hdDMyQXJyYXkoWzEsMCwwLDAsMSwwLDAsMCwxXSk7dmFyIHU9dFswXSxoPXRbMV0sZD10WzJdO2wud2hpdGVQb2ludD10O3ZhciBwPWFbMF0sbT1hWzFdLGc9YVsyXTtsLmJsYWNrUG9pbnQ9YTtsLkdSPWlbMF07bC5HRz1pWzFdO2wuR0I9aVsyXTtsLk1YQT1jWzBdO2wuTVlBPWNbMV07bC5NWkE9Y1syXTtsLk1YQj1jWzNdO2wuTVlCPWNbNF07bC5NWkI9Y1s1XTtsLk1YQz1jWzZdO2wuTVlDPWNbN107bC5NWkM9Y1s4XTtpZih1PDB8fGQ8MHx8MSE9PWgpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAiLmNvbmNhdChsLm5hbWUpKyIsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpO2lmKHA8MHx8bTwwfHxnPDApeygwLG8uaW5mbykoIkludmFsaWQgQmxhY2tQb2ludCBmb3IgIi5jb25jYXQobC5uYW1lLCIgWyIpLmNvbmNhdChwLCIsICIpLmNvbmNhdChtLCIsICIpLmNvbmNhdChnLCJdLCAiKSsiZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIik7bC5ibGFja1BvaW50PW5ldyBGbG9hdDMyQXJyYXkoMyl9aWYobC5HUjwwfHxsLkdHPDB8fGwuR0I8MCl7KDAsby5pbmZvKSgiSW52YWxpZCBHYW1tYSBbIi5jb25jYXQobC5HUiwiLCAiKS5jb25jYXQobC5HRywiLCAiKS5jb25jYXQobC5HQiwiXSBmb3IgIikrIiIuY29uY2F0KGwubmFtZSwiLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC4iKSk7bC5HUj1sLkdHPWwuR0I9MX1yZXR1cm4gbH1fY3JlYXRlQ2xhc3MoQ2FsUkdCQ1MsW3trZXk6ImdldFJnYkl0ZW0iLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkl0ZW0odCxyLGEsaSl7Y29udmVydFRvUmdiKHRoaXMsdCxyLGEsaSwxKX19LHtrZXk6ImdldFJnYkJ1ZmZlciIsdmFsdWU6ZnVuY3Rpb24gZ2V0UmdiQnVmZmVyKHQscixhLGksbyxjLGwpe2Zvcih2YXIgdT0xLygoMTw8YyktMSksaD0wO2g8YTsrK2gpe2NvbnZlcnRUb1JnYih0aGlzLHQscixpLG8sdSk7cis9MztvKz0zK2x9fX0se2tleToiZ2V0T3V0cHV0TGVuZ3RoIix2YWx1ZTpmdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgodCxyKXtyZXR1cm4gdCooMytyKS8zfDB9fV0pO3JldHVybiBDYWxSR0JDU30odSl9KCksUz1mdW5jdGlvbiBMYWJDU0Nsb3N1cmUoKXtmdW5jdGlvbiBmbl9nKHQpe3JldHVybiB0Pj02LzI5P3QqdCp0OjEwOC84NDEqKHQtNC8yOSl9ZnVuY3Rpb24gZGVjb2RlKHQscixhLGkpe3JldHVybiBhK3QqKGktYSkvcn1mdW5jdGlvbiBjb252ZXJ0VG9SZ2IodCxyLGEsaSxvLGMpe3ZhciBsPXJbYV0sdT1yW2ErMV0saD1yW2ErMl07aWYoITEhPT1pKXtsPWRlY29kZShsLGksMCwxMDApO3U9ZGVjb2RlKHUsaSx0LmFtaW4sdC5hbWF4KTtoPWRlY29kZShoLGksdC5ibWluLHQuYm1heCl9dT50LmFtYXg/dT10LmFtYXg6dTx0LmFtaW4mJih1PXQuYW1pbik7aD50LmJtYXg/aD10LmJtYXg6aDx0LmJtaW4mJihoPXQuYm1pbik7dmFyIGQscCxtLGc9KGwrMTYpLzExNix5PWcrdS81MDAsYj1nLWgvMjAwLHY9dC5YVypmbl9nKHkpLFM9dC5ZVypmbl9nKGcpLGs9dC5aVypmbl9nKGIpO2lmKHQuWlc8MSl7ZD0zLjEzMzkqdistMS42MTcqUystLjQ5MDYqaztwPS0uOTc4NSp2KzEuOTE2KlMrLjAzMzMqazttPS4wNzIqdistLjIyOSpTKzEuNDA1NyprfWVsc2V7ZD0zLjI0MDYqdistMS41MzcyKlMrLS40OTg2Kms7cD0tLjk2ODkqdisxLjg3NTgqUysuMDQxNSprO209LjA1NTcqdistLjIwNCpTKzEuMDU3Kmt9b1tjXT0yNTUqTWF0aC5zcXJ0KGQpO29bYysxXT0yNTUqTWF0aC5zcXJ0KHApO29bYysyXT0yNTUqTWF0aC5zcXJ0KG0pfXJldHVybiBmdW5jdGlvbih0KXtfaW5oZXJpdHMoTGFiQ1MsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKExhYkNTKTtmdW5jdGlvbiBMYWJDUyh0LGEsaSl7dmFyIGM7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTGFiQ1MpO2M9ci5jYWxsKHRoaXMsIkxhYiIsMyk7aWYoIXQpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBMYWIiKTthPWF8fFswLDAsMF07aT1pfHxbLTEwMCwxMDAsLTEwMCwxMDBdO2MuWFc9dFswXTtjLllXPXRbMV07Yy5aVz10WzJdO2MuYW1pbj1pWzBdO2MuYW1heD1pWzFdO2MuYm1pbj1pWzJdO2MuYm1heD1pWzNdO2MuWEI9YVswXTtjLllCPWFbMV07Yy5aQj1hWzJdO2lmKGMuWFc8MHx8Yy5aVzwwfHwxIT09Yy5ZVyl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpO2lmKGMuWEI8MHx8Yy5ZQjwwfHxjLlpCPDApeygwLG8uaW5mbykoIkludmFsaWQgQmxhY2tQb2ludCwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQiKTtjLlhCPWMuWUI9Yy5aQj0wfWlmKGMuYW1pbj5jLmFtYXh8fGMuYm1pbj5jLmJtYXgpeygwLG8uaW5mbykoIkludmFsaWQgUmFuZ2UsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cyIpO2MuYW1pbj0tMTAwO2MuYW1heD0xMDA7Yy5ibWluPS0xMDA7Yy5ibWF4PTEwMH1yZXR1cm4gY31fY3JlYXRlQ2xhc3MoTGFiQ1MsW3trZXk6ImdldFJnYkl0ZW0iLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkl0ZW0odCxyLGEsaSl7Y29udmVydFRvUmdiKHRoaXMsdCxyLCExLGEsaSl9fSx7a2V5OiJnZXRSZ2JCdWZmZXIiLHZhbHVlOmZ1bmN0aW9uIGdldFJnYkJ1ZmZlcih0LHIsYSxpLG8sYyxsKXtmb3IodmFyIHU9KDE8PGMpLTEsaD0wO2g8YTtoKyspe2NvbnZlcnRUb1JnYih0aGlzLHQscix1LGksbyk7cis9MztvKz0zK2x9fX0se2tleToiZ2V0T3V0cHV0TGVuZ3RoIix2YWx1ZTpmdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgodCxyKXtyZXR1cm4gdCooMytyKS8zfDB9fSx7a2V5OiJpc0RlZmF1bHREZWNvZGUiLHZhbHVlOmZ1bmN0aW9uIGlzRGVmYXVsdERlY29kZSh0LHIpe3JldHVybiEwfX0se2tleToidXNlc1plcm9Ub09uZVJhbmdlIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsInVzZXNaZXJvVG9PbmVSYW5nZSIsITEpfX1dKTtyZXR1cm4gTGFiQ1N9KHUpfSgpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLkdsb2JhbEltYWdlQ2FjaGU9ci5Mb2NhbEdTdGF0ZUNhY2hlPXIuTG9jYWxGdW5jdGlvbkNhY2hlPXIuTG9jYWxDb2xvclNwYWNlQ2FjaGU9ci5Mb2NhbEltYWdlQ2FjaGU9dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIwMik7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgYz1mdW5jdGlvbigpe2Z1bmN0aW9uIEJhc2VMb2NhbENhY2hlKHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLEJhc2VMb2NhbENhY2hlKTt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZUxvY2FsQ2FjaGUmJigwLGkudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlTG9jYWxDYWNoZS4iKTtpZighdHx8IXQub25seVJlZnMpe3RoaXMuX25hbWVSZWZNYXA9bmV3IE1hcDt0aGlzLl9pbWFnZU1hcD1uZXcgTWFwfXRoaXMuX2ltYWdlQ2FjaGU9bmV3IG8uUmVmU2V0Q2FjaGV9X2NyZWF0ZUNsYXNzKEJhc2VMb2NhbENhY2hlLFt7a2V5OiJnZXRCeU5hbWUiLHZhbHVlOmZ1bmN0aW9uIGdldEJ5TmFtZSh0KXt2YXIgcj10aGlzLl9uYW1lUmVmTWFwLmdldCh0KTtyZXR1cm4gcj90aGlzLmdldEJ5UmVmKHIpOnRoaXMuX2ltYWdlTWFwLmdldCh0KXx8bnVsbH19LHtrZXk6ImdldEJ5UmVmIix2YWx1ZTpmdW5jdGlvbiBnZXRCeVJlZih0KXtyZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQodCl8fG51bGx9fSx7a2V5OiJzZXQiLHZhbHVlOmZ1bmN0aW9uIHNldCh0LHIsYSl7KDAsaS51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgc2V0YCBjYWxsZWQuIil9fV0pO3JldHVybiBCYXNlTG9jYWxDYWNoZX0oKSxsPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhMb2NhbEltYWdlQ2FjaGUsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKExvY2FsSW1hZ2VDYWNoZSk7ZnVuY3Rpb24gTG9jYWxJbWFnZUNhY2hlKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTG9jYWxJbWFnZUNhY2hlKTtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9X2NyZWF0ZUNsYXNzKExvY2FsSW1hZ2VDYWNoZSxbe2tleToic2V0Iix2YWx1ZTpmdW5jdGlvbiBzZXQodCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwsYT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZighdCl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7aWYocil7aWYodGhpcy5faW1hZ2VDYWNoZS5oYXMocikpcmV0dXJuO3RoaXMuX25hbWVSZWZNYXAuc2V0KHQscik7dGhpcy5faW1hZ2VDYWNoZS5wdXQocixhKX1lbHNlIHRoaXMuX2ltYWdlTWFwLmhhcyh0KXx8dGhpcy5faW1hZ2VNYXAuc2V0KHQsYSl9fV0pO3JldHVybiBMb2NhbEltYWdlQ2FjaGV9KGMpO3IuTG9jYWxJbWFnZUNhY2hlPWw7dmFyIHU9ZnVuY3Rpb24odCl7X2luaGVyaXRzKExvY2FsQ29sb3JTcGFjZUNhY2hlLHQpO3ZhciByPV9jcmVhdGVTdXBlcihMb2NhbENvbG9yU3BhY2VDYWNoZSk7ZnVuY3Rpb24gTG9jYWxDb2xvclNwYWNlQ2FjaGUoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxMb2NhbENvbG9yU3BhY2VDYWNoZSk7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfV9jcmVhdGVDbGFzcyhMb2NhbENvbG9yU3BhY2VDYWNoZSxbe2tleToic2V0Iix2YWx1ZTpmdW5jdGlvbiBzZXQoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbCxyPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLGE9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoIXQmJiFyKXRocm93IG5ldyBFcnJvcignTG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFuZC9vciAicmVmIiBhcmd1bWVudC4nKTtpZihyKXtpZih0aGlzLl9pbWFnZUNhY2hlLmhhcyhyKSlyZXR1cm47dCYmdGhpcy5fbmFtZVJlZk1hcC5zZXQodCxyKTt0aGlzLl9pbWFnZUNhY2hlLnB1dChyLGEpfWVsc2UgdGhpcy5faW1hZ2VNYXAuaGFzKHQpfHx0aGlzLl9pbWFnZU1hcC5zZXQodCxhKX19XSk7cmV0dXJuIExvY2FsQ29sb3JTcGFjZUNhY2hlfShjKTtyLkxvY2FsQ29sb3JTcGFjZUNhY2hlPXU7dmFyIGg9ZnVuY3Rpb24odCl7X2luaGVyaXRzKExvY2FsRnVuY3Rpb25DYWNoZSx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoTG9jYWxGdW5jdGlvbkNhY2hlKTtmdW5jdGlvbiBMb2NhbEZ1bmN0aW9uQ2FjaGUodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTG9jYWxGdW5jdGlvbkNhY2hlKTtyZXR1cm4gci5jYWxsKHRoaXMse29ubHlSZWZzOiEwfSl9X2NyZWF0ZUNsYXNzKExvY2FsRnVuY3Rpb25DYWNoZSxbe2tleToiZ2V0QnlOYW1lIix2YWx1ZTpmdW5jdGlvbiBnZXRCeU5hbWUodCl7KDAsaS51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBgZ2V0QnlOYW1lYCBtZXRob2QuIil9fSx7a2V5OiJzZXQiLHZhbHVlOmZ1bmN0aW9uIHNldCgpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHI9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCdMb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXModCl8fHRoaXMuX2ltYWdlQ2FjaGUucHV0KHQscil9fV0pO3JldHVybiBMb2NhbEZ1bmN0aW9uQ2FjaGV9KGMpO3IuTG9jYWxGdW5jdGlvbkNhY2hlPWg7dmFyIGQ9ZnVuY3Rpb24odCl7X2luaGVyaXRzKExvY2FsR1N0YXRlQ2FjaGUsdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKExvY2FsR1N0YXRlQ2FjaGUpO2Z1bmN0aW9uIExvY2FsR1N0YXRlQ2FjaGUoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxMb2NhbEdTdGF0ZUNhY2hlKTtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9X2NyZWF0ZUNsYXNzKExvY2FsR1N0YXRlQ2FjaGUsW3trZXk6InNldCIsdmFsdWU6ZnVuY3Rpb24gc2V0KHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLGE9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCdMb2NhbEdTdGF0ZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhcmd1bWVudC4nKTtpZihyKXtpZih0aGlzLl9pbWFnZUNhY2hlLmhhcyhyKSlyZXR1cm47dGhpcy5fbmFtZVJlZk1hcC5zZXQodCxyKTt0aGlzLl9pbWFnZUNhY2hlLnB1dChyLGEpfWVsc2UgdGhpcy5faW1hZ2VNYXAuaGFzKHQpfHx0aGlzLl9pbWFnZU1hcC5zZXQodCxhKX19XSk7cmV0dXJuIExvY2FsR1N0YXRlQ2FjaGV9KGMpO3IuTG9jYWxHU3RhdGVDYWNoZT1kO3ZhciBwPWZ1bmN0aW9uKCl7X2NyZWF0ZUNsYXNzKEdsb2JhbEltYWdlQ2FjaGUsbnVsbCxbe2tleToiTlVNX1BBR0VTX1RIUkVTSE9MRCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJOVU1fUEFHRVNfVEhSRVNIT0xEIiwyKX19LHtrZXk6Ik1BWF9JTUFHRVNfVE9fQ0FDSEUiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywiTUFYX0lNQUdFU19UT19DQUNIRSIsMTApfX1dKTtmdW5jdGlvbiBHbG9iYWxJbWFnZUNhY2hlKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsR2xvYmFsSW1hZ2VDYWNoZSk7dGhpcy5fcmVmQ2FjaGU9bmV3IG8uUmVmU2V0Q2FjaGU7dGhpcy5faW1hZ2VDYWNoZT1uZXcgby5SZWZTZXRDYWNoZX1fY3JlYXRlQ2xhc3MoR2xvYmFsSW1hZ2VDYWNoZSxbe2tleToic2hvdWxkQ2FjaGUiLHZhbHVlOmZ1bmN0aW9uIHNob3VsZENhY2hlKHQscil7dmFyIGE9dGhpcy5fcmVmQ2FjaGUuZ2V0KHQpO3JldHVybiEoKGE/YS5zaXplKyhhLmhhcyhyKT8wOjEpOjEpPEdsb2JhbEltYWdlQ2FjaGUuTlVNX1BBR0VTX1RIUkVTSE9MRCkmJiEoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHQpJiZ0aGlzLl9pbWFnZUNhY2hlLnNpemU+PUdsb2JhbEltYWdlQ2FjaGUuTUFYX0lNQUdFU19UT19DQUNIRSl9fSx7a2V5OiJhZGRQYWdlSW5kZXgiLHZhbHVlOmZ1bmN0aW9uIGFkZFBhZ2VJbmRleCh0LHIpe3ZhciBhPXRoaXMuX3JlZkNhY2hlLmdldCh0KTtpZighYSl7YT1uZXcgU2V0O3RoaXMuX3JlZkNhY2hlLnB1dCh0LGEpfWEuYWRkKHIpfX0se2tleToiZ2V0RGF0YSIsdmFsdWU6ZnVuY3Rpb24gZ2V0RGF0YSh0LHIpe3ZhciBhPXRoaXMuX3JlZkNhY2hlLmdldCh0KTtpZighYSlyZXR1cm4gbnVsbDtpZihhLnNpemU8R2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKXJldHVybiBudWxsO2lmKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyh0KSlyZXR1cm4gbnVsbDthLmFkZChyKTtyZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQodCl9fSx7a2V5OiJzZXREYXRhIix2YWx1ZTpmdW5jdGlvbiBzZXREYXRhKHQscil7aWYoIXRoaXMuX3JlZkNhY2hlLmhhcyh0KSl0aHJvdyBuZXcgRXJyb3IoJ0dsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YSAtIGV4cGVjdGVkICJhZGRQYWdlSW5kZXgiIHRvIGhhdmUgYmVlbiBjYWxsZWQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXModCl8fCh0aGlzLl9pbWFnZUNhY2hlLnNpemU+PUdsb2JhbEltYWdlQ2FjaGUuTUFYX0lNQUdFU19UT19DQUNIRT8oMCxpLmluZm8pKCJHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBpZ25vcmluZyBpbWFnZSBhYm92ZSBNQVhfSU1BR0VTX1RPX0NBQ0hFLiIpOnRoaXMuX2ltYWdlQ2FjaGUucHV0KHQscikpfX0se2tleToiY2xlYXIiLHZhbHVlOmZ1bmN0aW9uIGNsZWFyKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTt0fHx0aGlzLl9yZWZDYWNoZS5jbGVhcigpO3RoaXMuX2ltYWdlQ2FjaGUuY2xlYXIoKX19XSk7cmV0dXJuIEdsb2JhbEltYWdlQ2FjaGV9KCk7ci5HbG9iYWxJbWFnZUNhY2hlPXB9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuZ2V0UXVhZFBvaW50cz1nZXRRdWFkUG9pbnRzO3IuTWFya3VwQW5ub3RhdGlvbj1yLkFubm90YXRpb25GYWN0b3J5PXIuQW5ub3RhdGlvbkJvcmRlclN0eWxlPXIuQW5ub3RhdGlvbj12b2lkIDA7dmFyIGk9ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KGEoMikpLG89YSg1KSxjPWEoMjA3KSxsPWEoMjAyKSx1PWEoMjIwKSxoPWEoMjA1KSxkPWEoMjIzKSxwPWEoMjA5KSxtPWEoMjI0KTtmdW5jdGlvbiBfZ2V0KHQscixhKXtyZXR1cm4oX2dldD0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuZ2V0P1JlZmxlY3QuZ2V0OmZ1bmN0aW9uIF9nZXQodCxyLGEpe3ZhciBpPWZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKHQscil7Zm9yKDshT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJm51bGwhPT0odD1fZ2V0UHJvdG90eXBlT2YodCkpOyk7cmV0dXJuIHR9KHQscik7aWYoaSl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLHIpO3JldHVybiBvLmdldD9vLmdldC5jYWxsKGEpOm8udmFsdWV9fSkodCxyLGF8fHQpfWZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gX2luaGVyaXRzKHQscil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHImJm51bGwhPT1yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyJiZyLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pO3ImJl9zZXRQcm90b3R5cGVPZih0LHIpfWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3JldHVybihfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXt0Ll9fcHJvdG9fXz1yO3JldHVybiB0fSkodCxyKX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIodCl7dmFyIHI9ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKTtyZXR1cm4hMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIGEsaT1fZ2V0UHJvdG90eXBlT2YodCk7aWYocil7dmFyIG89X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO2E9UmVmbGVjdC5jb25zdHJ1Y3QoaSxhcmd1bWVudHMsbyl9ZWxzZSBhPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLGEpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LHIpe3JldHVybiFyfHwib2JqZWN0IiE9PV90eXBlb2YocikmJiJmdW5jdGlvbiIhPXR5cGVvZiByP2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiB0fSh0KTpyfWZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KXtyZXR1cm4oX2dldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCxyKXt2YXIgYTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwoYT1fdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCkpfHxyJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXthJiYodD1hKTt2YXIgaT0wLG89ZnVuY3Rpb24gRigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uIG4oKXtyZXR1cm4gaT49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbaSsrXX19LGU6ZnVuY3Rpb24gZSh0KXt0aHJvdyB0fSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgYyxsPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24gcygpe2E9dFtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24gbigpe3ZhciB0PWEubmV4dCgpO2w9dC5kb25lO3JldHVybiB0fSxlOmZ1bmN0aW9uIGUodCl7dT0hMDtjPXR9LGY6ZnVuY3Rpb24gZigpe3RyeXtsfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgY319fX1mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxyLGEsaSxvLGMsbCl7dHJ5e3ZhciB1PXRbY10obCksaD11LnZhbHVlfWNhdGNoKHQpe2EodCk7cmV0dXJufXUuZG9uZT9yKGgpOlByb21pc2UucmVzb2x2ZShoKS50aGVuKGksbyl9ZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksbyl7dmFyIGM9dC5hcHBseShyLGEpO2Z1bmN0aW9uIF9uZXh0KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChjLGksbyxfbmV4dCxfdGhyb3csIm5leHQiLHQpfWZ1bmN0aW9uIF90aHJvdyh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJ0aHJvdyIsdCl9X25leHQodm9pZCAwKX0pKX19ZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkodCxyKXtyZXR1cm4gZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9KHQpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQodCxyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIGE9W10saT0hMCxvPSExLGM9dm9pZCAwO3RyeXtmb3IodmFyIGwsdT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KGw9dS5uZXh0KCkpLmRvbmUpO2k9ITApe2EucHVzaChsLnZhbHVlKTtpZihyJiZhLmxlbmd0aD09PXIpYnJlYWt9fWNhdGNoKHQpe289ITA7Yz10fWZpbmFsbHl7dHJ5e2l8fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYobyl0aHJvdyBjfX1yZXR1cm4gYX0odCxyKXx8X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil8fGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSh0LHIpe2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKTt2YXIgYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7Ik9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpO3JldHVybiJNYXAiPT09YXx8IlNldCI9PT1hP0FycmF5LmZyb20odCk6IkFyZ3VtZW50cyI9PT1hfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChhKT9fYXJyYXlMaWtlVG9BcnJheSh0LHIpOnZvaWQgMH19ZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkodCxyKXsobnVsbD09cnx8cj50Lmxlbmd0aCkmJihyPXQubGVuZ3RoKTtmb3IodmFyIGE9MCxpPW5ldyBBcnJheShyKTthPHI7YSsrKWlbYV09dFthXTtyZXR1cm4gaX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgZz1mdW5jdGlvbigpe2Z1bmN0aW9uIEFubm90YXRpb25GYWN0b3J5KCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQW5ub3RhdGlvbkZhY3RvcnkpfV9jcmVhdGVDbGFzcyhBbm5vdGF0aW9uRmFjdG9yeSxudWxsLFt7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZSh0LHIsYSxpKXt2YXIgbz10aGlzO3JldHVybiBhLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIikudGhlbigoZnVuY3Rpb24oYyl7cmV0dXJuIGEuZW5zdXJlKG8sIl9jcmVhdGUiLFt0LHIsYSxpLGNdKX0pKX19LHtrZXk6Il9jcmVhdGUiLHZhbHVlOmZ1bmN0aW9uIF9jcmVhdGUodCxyLGEsaSxjKXt2YXIgdT10LmZldGNoSWZSZWYocik7aWYoKDAsbC5pc0RpY3QpKHUpKXt2YXIgZD0oMCxsLmlzUmVmKShyKT9yLnRvU3RyaW5nKCk6ImFubm90XyIuY29uY2F0KGkuY3JlYXRlT2JqSWQoKSkscD11LmdldCgiU3VidHlwZSIpLG09e3hyZWY6dCxyZWY6cixkaWN0OnUsc3VidHlwZTpwPSgwLGwuaXNOYW1lKShwKT9wLm5hbWU6bnVsbCxpZDpkLHBkZk1hbmFnZXI6YSxhY3JvRm9ybTpjIGluc3RhbmNlb2YgbC5EaWN0P2M6bC5EaWN0LmVtcHR5fTtzd2l0Y2gocCl7Y2FzZSJMaW5rIjpyZXR1cm4gbmV3IHgobSk7Y2FzZSJUZXh0IjpyZXR1cm4gbmV3IF8obSk7Y2FzZSJXaWRnZXQiOnZhciBnPSgwLGguZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dSxrZXk6IkZUIn0pO3N3aXRjaChnPSgwLGwuaXNOYW1lKShnKT9nLm5hbWU6bnVsbCl7Y2FzZSJUeCI6cmV0dXJuIG5ldyBrKG0pO2Nhc2UiQnRuIjpyZXR1cm4gbmV3IHcobSk7Y2FzZSJDaCI6cmV0dXJuIG5ldyBDKG0pfSgwLG8ud2FybikoJ1VuaW1wbGVtZW50ZWQgd2lkZ2V0IGZpZWxkIHR5cGUgIicrZysnIiwgZmFsbGluZyBiYWNrIHRvIGJhc2UgZmllbGQgdHlwZS4nKTtyZXR1cm4gbmV3IFMobSk7Y2FzZSJQb3B1cCI6cmV0dXJuIG5ldyBBKG0pO2Nhc2UiRnJlZVRleHQiOnJldHVybiBuZXcgVChtKTtjYXNlIkxpbmUiOnJldHVybiBuZXcgUihtKTtjYXNlIlNxdWFyZSI6cmV0dXJuIG5ldyBJKG0pO2Nhc2UiQ2lyY2xlIjpyZXR1cm4gbmV3IFAobSk7Y2FzZSJQb2x5TGluZSI6cmV0dXJuIG5ldyBPKG0pO2Nhc2UiUG9seWdvbiI6cmV0dXJuIG5ldyBFKG0pO2Nhc2UiQ2FyZXQiOnJldHVybiBuZXcgQihtKTtjYXNlIkluayI6cmV0dXJuIG5ldyBEKG0pO2Nhc2UiSGlnaGxpZ2h0IjpyZXR1cm4gbmV3IE0obSk7Y2FzZSJVbmRlcmxpbmUiOnJldHVybiBuZXcgTChtKTtjYXNlIlNxdWlnZ2x5IjpyZXR1cm4gbmV3IE4obSk7Y2FzZSJTdHJpa2VPdXQiOnJldHVybiBuZXcgVShtKTtjYXNlIlN0YW1wIjpyZXR1cm4gbmV3IGoobSk7Y2FzZSJGaWxlQXR0YWNobWVudCI6cmV0dXJuIG5ldyBxKG0pO2RlZmF1bHQ6cD8oMCxvLndhcm4pKCdVbmltcGxlbWVudGVkIGFubm90YXRpb24gdHlwZSAiJytwKyciLCBmYWxsaW5nIGJhY2sgdG8gYmFzZSBhbm5vdGF0aW9uLicpOigwLG8ud2FybikoIkFubm90YXRpb24gaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgL1N1YnR5cGUuIik7cmV0dXJuIG5ldyB5KG0pfX19fV0pO3JldHVybiBBbm5vdGF0aW9uRmFjdG9yeX0oKTtyLkFubm90YXRpb25GYWN0b3J5PWc7ZnVuY3Rpb24gZ2V0UXVhZFBvaW50cyh0LHIpe2lmKCF0LmhhcygiUXVhZFBvaW50cyIpKXJldHVybiBudWxsO3ZhciBhPXQuZ2V0QXJyYXkoIlF1YWRQb2ludHMiKTtpZighQXJyYXkuaXNBcnJheShhKXx8YS5sZW5ndGglOD4wKXJldHVybiBudWxsO2Zvcih2YXIgaT1bXSxvPTAsYz1hLmxlbmd0aC84O288YztvKyspe2kucHVzaChbXSk7Zm9yKHZhciBsPTgqbyx1PTgqbys4O2w8dTtsKz0yKXt2YXIgaD1hW2xdLGQ9YVtsKzFdO2lmKGg8clswXXx8aD5yWzJdfHxkPHJbMV18fGQ+clszXSlyZXR1cm4gbnVsbDtpW29dLnB1c2goe3g6aCx5OmR9KX19cmV0dXJuIGl9ZnVuY3Rpb24gZ2V0VHJhbnNmb3JtTWF0cml4KHQscixhKXt2YXIgaT1fc2xpY2VkVG9BcnJheShvLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gocixhKSw0KSxjPWlbMF0sbD1pWzFdLHU9aVsyXSxoPWlbM107aWYoYz09PXV8fGw9PT1oKXJldHVyblsxLDAsMCwxLHRbMF0sdFsxXV07dmFyIGQ9KHRbMl0tdFswXSkvKHUtYykscD0odFszXS10WzFdKS8oaC1sKTtyZXR1cm5bZCwwLDAscCx0WzBdLWMqZCx0WzFdLWwqcF19dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBbm5vdGF0aW9uKHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLEFubm90YXRpb24pO3ZhciByPXQuZGljdDt0aGlzLnNldENvbnRlbnRzKHIuZ2V0KCJDb250ZW50cyIpKTt0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUoci5nZXQoIk0iKSk7dGhpcy5zZXRGbGFncyhyLmdldCgiRiIpKTt0aGlzLnNldFJlY3RhbmdsZShyLmdldEFycmF5KCJSZWN0IikpO3RoaXMuc2V0Q29sb3Ioci5nZXRBcnJheSgiQyIpKTt0aGlzLnNldEJvcmRlclN0eWxlKHIpO3RoaXMuc2V0QXBwZWFyYW5jZShyKTt0aGlzLmRhdGE9e2Fubm90YXRpb25GbGFnczp0aGlzLmZsYWdzLGJvcmRlclN0eWxlOnRoaXMuYm9yZGVyU3R5bGUsY29sb3I6dGhpcy5jb2xvcixjb250ZW50czp0aGlzLmNvbnRlbnRzLGhhc0FwcGVhcmFuY2U6ISF0aGlzLmFwcGVhcmFuY2UsaWQ6dC5pZCxtb2RpZmljYXRpb25EYXRlOnRoaXMubW9kaWZpY2F0aW9uRGF0ZSxyZWN0OnRoaXMucmVjdGFuZ2xlLHN1YnR5cGU6dC5zdWJ0eXBlfX1fY3JlYXRlQ2xhc3MoQW5ub3RhdGlvbixbe2tleToiX2hhc0ZsYWciLHZhbHVlOmZ1bmN0aW9uIF9oYXNGbGFnKHQscil7cmV0dXJuISEodCZyKX19LHtrZXk6Il9pc1ZpZXdhYmxlIix2YWx1ZTpmdW5jdGlvbiBfaXNWaWV3YWJsZSh0KXtyZXR1cm4hdGhpcy5faGFzRmxhZyh0LG8uQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKSYmIXRoaXMuX2hhc0ZsYWcodCxvLkFubm90YXRpb25GbGFnLkhJRERFTikmJiF0aGlzLl9oYXNGbGFnKHQsby5Bbm5vdGF0aW9uRmxhZy5OT1ZJRVcpfX0se2tleToiX2lzUHJpbnRhYmxlIix2YWx1ZTpmdW5jdGlvbiBfaXNQcmludGFibGUodCl7cmV0dXJuIHRoaXMuX2hhc0ZsYWcodCxvLkFubm90YXRpb25GbGFnLlBSSU5UKSYmIXRoaXMuX2hhc0ZsYWcodCxvLkFubm90YXRpb25GbGFnLklOVklTSUJMRSkmJiF0aGlzLl9oYXNGbGFnKHQsby5Bbm5vdGF0aW9uRmxhZy5ISURERU4pfX0se2tleToic2V0Q29udGVudHMiLHZhbHVlOmZ1bmN0aW9uIHNldENvbnRlbnRzKHQpe3RoaXMuY29udGVudHM9KDAsby5zdHJpbmdUb1BERlN0cmluZykodHx8IiIpfX0se2tleToic2V0TW9kaWZpY2F0aW9uRGF0ZSIsdmFsdWU6ZnVuY3Rpb24gc2V0TW9kaWZpY2F0aW9uRGF0ZSh0KXt0aGlzLm1vZGlmaWNhdGlvbkRhdGU9KDAsby5pc1N0cmluZykodCk/dDpudWxsfX0se2tleToic2V0RmxhZ3MiLHZhbHVlOmZ1bmN0aW9uIHNldEZsYWdzKHQpe3RoaXMuZmxhZ3M9TnVtYmVyLmlzSW50ZWdlcih0KSYmdD4wP3Q6MH19LHtrZXk6Imhhc0ZsYWciLHZhbHVlOmZ1bmN0aW9uIGhhc0ZsYWcodCl7cmV0dXJuIHRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncyx0KX19LHtrZXk6InNldFJlY3RhbmdsZSIsdmFsdWU6ZnVuY3Rpb24gc2V0UmVjdGFuZ2xlKHQpe0FycmF5LmlzQXJyYXkodCkmJjQ9PT10Lmxlbmd0aD90aGlzLnJlY3RhbmdsZT1vLlV0aWwubm9ybWFsaXplUmVjdCh0KTp0aGlzLnJlY3RhbmdsZT1bMCwwLDAsMF19fSx7a2V5OiJzZXRDb2xvciIsdmFsdWU6ZnVuY3Rpb24gc2V0Q29sb3IodCl7dmFyIHI9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpO2lmKEFycmF5LmlzQXJyYXkodCkpc3dpdGNoKHQubGVuZ3RoKXtjYXNlIDA6dGhpcy5jb2xvcj1udWxsO2JyZWFrO2Nhc2UgMTp1LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYkl0ZW0odCwwLHIsMCk7dGhpcy5jb2xvcj1yO2JyZWFrO2Nhc2UgMzp1LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiSXRlbSh0LDAsciwwKTt0aGlzLmNvbG9yPXI7YnJlYWs7Y2FzZSA0OnUuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiSXRlbSh0LDAsciwwKTt0aGlzLmNvbG9yPXI7YnJlYWs7ZGVmYXVsdDp0aGlzLmNvbG9yPXJ9ZWxzZSB0aGlzLmNvbG9yPXJ9fSx7a2V5OiJzZXRCb3JkZXJTdHlsZSIsdmFsdWU6ZnVuY3Rpb24gc2V0Qm9yZGVyU3R5bGUodCl7dGhpcy5ib3JkZXJTdHlsZT1uZXcgYjtpZigoMCxsLmlzRGljdCkodCkpaWYodC5oYXMoIkJTIikpe3ZhciByPXQuZ2V0KCJCUyIpLGE9ci5nZXQoIlR5cGUiKTtpZighYXx8KDAsbC5pc05hbWUpKGEsIkJvcmRlciIpKXt0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKHIuZ2V0KCJXIiksdGhpcy5yZWN0YW5nbGUpO3RoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUoci5nZXQoIlMiKSk7dGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoci5nZXRBcnJheSgiRCIpKX19ZWxzZSBpZih0LmhhcygiQm9yZGVyIikpe3ZhciBpPXQuZ2V0QXJyYXkoIkJvcmRlciIpO2lmKEFycmF5LmlzQXJyYXkoaSkmJmkubGVuZ3RoPj0zKXt0aGlzLmJvcmRlclN0eWxlLnNldEhvcml6b250YWxDb3JuZXJSYWRpdXMoaVswXSk7dGhpcy5ib3JkZXJTdHlsZS5zZXRWZXJ0aWNhbENvcm5lclJhZGl1cyhpWzFdKTt0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGlbMl0sdGhpcy5yZWN0YW5nbGUpOzQ9PT1pLmxlbmd0aCYmdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoaVszXSl9fWVsc2UgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aCgwKX19LHtrZXk6InNldEFwcGVhcmFuY2UiLHZhbHVlOmZ1bmN0aW9uIHNldEFwcGVhcmFuY2UodCl7dGhpcy5hcHBlYXJhbmNlPW51bGw7dmFyIHI9dC5nZXQoIkFQIik7aWYoKDAsbC5pc0RpY3QpKHIpKXt2YXIgYT1yLmdldCgiTiIpO2lmKCgwLGwuaXNTdHJlYW0pKGEpKXRoaXMuYXBwZWFyYW5jZT1hO2Vsc2UgaWYoKDAsbC5pc0RpY3QpKGEpKXt2YXIgaT10LmdldCgiQVMiKTsoMCxsLmlzTmFtZSkoaSkmJmEuaGFzKGkubmFtZSkmJih0aGlzLmFwcGVhcmFuY2U9YS5nZXQoaS5uYW1lKSl9fX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uIGxvYWRSZXNvdXJjZXModCl7cmV0dXJuIHRoaXMuYXBwZWFyYW5jZS5kaWN0LmdldEFzeW5jKCJSZXNvdXJjZXMiKS50aGVuKChmdW5jdGlvbihyKXtpZihyKXtyZXR1cm4gbmV3IGMuT2JqZWN0TG9hZGVyKHIsdCxyLnhyZWYpLmxvYWQoKS50aGVuKChmdW5jdGlvbigpe3JldHVybiByfSkpfX0pKX19LHtrZXk6ImdldE9wZXJhdG9yTGlzdCIsdmFsdWU6ZnVuY3Rpb24gZ2V0T3BlcmF0b3JMaXN0KHQscixhLGkpe2lmKCF0aGlzLmFwcGVhcmFuY2UpcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgZC5PcGVyYXRvckxpc3QpO3ZhciBjPXRoaXMuYXBwZWFyYW5jZSxsPXRoaXMuZGF0YSx1PWMuZGljdCxoPXRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsIkNvbG9yU3BhY2UiLCJQYXR0ZXJuIiwiU2hhZGluZyIsIlhPYmplY3QiLCJGb250Il0pLHA9dS5nZXRBcnJheSgiQkJveCIpfHxbMCwwLDEsMV0sbT11LmdldEFycmF5KCJNYXRyaXgiKXx8WzEsMCwwLDEsMCwwXSxnPWdldFRyYW5zZm9ybU1hdHJpeChsLnJlY3QscCxtKTtyZXR1cm4gaC50aGVuKChmdW5jdGlvbihhKXt2YXIgaT1uZXcgZC5PcGVyYXRvckxpc3Q7aS5hZGRPcChvLk9QUy5iZWdpbkFubm90YXRpb24sW2wucmVjdCxnLG1dKTtyZXR1cm4gdC5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpjLHRhc2s6cixyZXNvdXJjZXM6YSxvcGVyYXRvckxpc3Q6aX0pLnRoZW4oKGZ1bmN0aW9uKCl7aS5hZGRPcChvLk9QUy5lbmRBbm5vdGF0aW9uLFtdKTtjLnJlc2V0KCk7cmV0dXJuIGl9KSl9KSl9fSx7a2V5OiJzYXZlIix2YWx1ZToodD1fYXN5bmNUb0dlbmVyYXRvcihpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSh0LHIsYSl7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlJCh0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsbnVsbCk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksX2NhbGxlZSl9KSkpLGZ1bmN0aW9uIHNhdmUocixhLGkpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJ2aWV3YWJsZSIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwPT09dGhpcy5mbGFnc3x8dGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKX19LHtrZXk6InByaW50YWJsZSIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09dGhpcy5mbGFncyYmdGhpcy5faXNQcmludGFibGUodGhpcy5mbGFncyl9fV0pO3ZhciB0O3JldHVybiBBbm5vdGF0aW9ufSgpO3IuQW5ub3RhdGlvbj15O3ZhciBiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQW5ub3RhdGlvbkJvcmRlclN0eWxlKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQW5ub3RhdGlvbkJvcmRlclN0eWxlKTt0aGlzLndpZHRoPTE7dGhpcy5zdHlsZT1vLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ7dGhpcy5kYXNoQXJyYXk9WzNdO3RoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cz0wO3RoaXMudmVydGljYWxDb3JuZXJSYWRpdXM9MH1fY3JlYXRlQ2xhc3MoQW5ub3RhdGlvbkJvcmRlclN0eWxlLFt7a2V5OiJzZXRXaWR0aCIsdmFsdWU6ZnVuY3Rpb24gc2V0V2lkdGgodCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlswLDAsMCwwXTtpZigoMCxsLmlzTmFtZSkodCkpdGhpcy53aWR0aD0wO2Vsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcih0KSl7aWYodD4wKXt2YXIgYT0oclsyXS1yWzBdKS8yLGk9KHJbM10tclsxXSkvMjtpZihhPjAmJmk+MCYmKHQ+YXx8dD5pKSl7KDAsby53YXJuKSgiQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICIuY29uY2F0KHQpKTt0PTF9fXRoaXMud2lkdGg9dH19fSx7a2V5OiJzZXRTdHlsZSIsdmFsdWU6ZnVuY3Rpb24gc2V0U3R5bGUodCl7aWYoKDAsbC5pc05hbWUpKHQpKXN3aXRjaCh0Lm5hbWUpe2Nhc2UiUyI6dGhpcy5zdHlsZT1vLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ7YnJlYWs7Y2FzZSJEIjp0aGlzLnN0eWxlPW8uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ7YnJlYWs7Y2FzZSJCIjp0aGlzLnN0eWxlPW8uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEO2JyZWFrO2Nhc2UiSSI6dGhpcy5zdHlsZT1vLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ7YnJlYWs7Y2FzZSJVIjp0aGlzLnN0eWxlPW8uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkV9fX0se2tleToic2V0RGFzaEFycmF5Iix2YWx1ZTpmdW5jdGlvbiBzZXREYXNoQXJyYXkodCl7aWYoQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+MCl7dmFyIHIsYT0hMCxpPSEwLG89X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCk7dHJ5e2ZvcihvLnMoKTshKHI9by5uKCkpLmRvbmU7KXt2YXIgYz1yLnZhbHVlO2lmKCEoK2M+PTApKXthPSExO2JyZWFrfWM+MCYmKGk9ITEpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX1hJiYhaT90aGlzLmRhc2hBcnJheT10OnRoaXMud2lkdGg9MH1lbHNlIHQmJih0aGlzLndpZHRoPTApfX0se2tleToic2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyIsdmFsdWU6ZnVuY3Rpb24gc2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyh0KXtOdW1iZXIuaXNJbnRlZ2VyKHQpJiYodGhpcy5ob3Jpem9udGFsQ29ybmVyUmFkaXVzPXQpfX0se2tleToic2V0VmVydGljYWxDb3JuZXJSYWRpdXMiLHZhbHVlOmZ1bmN0aW9uIHNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKHQpe051bWJlci5pc0ludGVnZXIodCkmJih0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzPXQpfX1dKTtyZXR1cm4gQW5ub3RhdGlvbkJvcmRlclN0eWxlfSgpO3IuQW5ub3RhdGlvbkJvcmRlclN0eWxlPWI7dmFyIHY9ZnVuY3Rpb24odCl7X2luaGVyaXRzKE1hcmt1cEFubm90YXRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKE1hcmt1cEFubm90YXRpb24pO2Z1bmN0aW9uIE1hcmt1cEFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTWFya3VwQW5ub3RhdGlvbik7YT1yLmNhbGwodGhpcyx0KTt2YXIgaT10LmRpY3Q7aWYoaS5oYXMoIklSVCIpKXt2YXIgYz1pLmdldFJhdygiSVJUIik7YS5kYXRhLmluUmVwbHlUbz0oMCxsLmlzUmVmKShjKT9jLnRvU3RyaW5nKCk6bnVsbDt2YXIgdT1pLmdldCgiUlQiKTthLmRhdGEucmVwbHlUeXBlPSgwLGwuaXNOYW1lKSh1KT91Lm5hbWU6by5Bbm5vdGF0aW9uUmVwbHlUeXBlLlJFUExZfWlmKGEuZGF0YS5yZXBseVR5cGU9PT1vLkFubm90YXRpb25SZXBseVR5cGUuR1JPVVApe3ZhciBoPWkuZ2V0KCJJUlQiKTthLmRhdGEudGl0bGU9KDAsby5zdHJpbmdUb1BERlN0cmluZykoaC5nZXQoIlQiKXx8IiIpO2Euc2V0Q29udGVudHMoaC5nZXQoIkNvbnRlbnRzIikpO2EuZGF0YS5jb250ZW50cz1hLmNvbnRlbnRzO2lmKGguaGFzKCJDcmVhdGlvbkRhdGUiKSl7YS5zZXRDcmVhdGlvbkRhdGUoaC5nZXQoIkNyZWF0aW9uRGF0ZSIpKTthLmRhdGEuY3JlYXRpb25EYXRlPWEuY3JlYXRpb25EYXRlfWVsc2UgYS5kYXRhLmNyZWF0aW9uRGF0ZT1udWxsO2lmKGguaGFzKCJNIikpe2Euc2V0TW9kaWZpY2F0aW9uRGF0ZShoLmdldCgiTSIpKTthLmRhdGEubW9kaWZpY2F0aW9uRGF0ZT1hLm1vZGlmaWNhdGlvbkRhdGV9ZWxzZSBhLmRhdGEubW9kaWZpY2F0aW9uRGF0ZT1udWxsO2EuZGF0YS5oYXNQb3B1cD1oLmhhcygiUG9wdXAiKTtpZihoLmhhcygiQyIpKXthLnNldENvbG9yKGguZ2V0QXJyYXkoIkMiKSk7YS5kYXRhLmNvbG9yPWEuY29sb3J9ZWxzZSBhLmRhdGEuY29sb3I9bnVsbH1lbHNle2EuZGF0YS50aXRsZT0oMCxvLnN0cmluZ1RvUERGU3RyaW5nKShpLmdldCgiVCIpfHwiIik7YS5zZXRDcmVhdGlvbkRhdGUoaS5nZXQoIkNyZWF0aW9uRGF0ZSIpKTthLmRhdGEuY3JlYXRpb25EYXRlPWEuY3JlYXRpb25EYXRlO2EuZGF0YS5oYXNQb3B1cD1pLmhhcygiUG9wdXAiKTtpLmhhcygiQyIpfHwoYS5kYXRhLmNvbG9yPW51bGwpfXJldHVybiBhfV9jcmVhdGVDbGFzcyhNYXJrdXBBbm5vdGF0aW9uLFt7a2V5OiJzZXRDcmVhdGlvbkRhdGUiLHZhbHVlOmZ1bmN0aW9uIHNldENyZWF0aW9uRGF0ZSh0KXt0aGlzLmNyZWF0aW9uRGF0ZT0oMCxvLmlzU3RyaW5nKSh0KT90Om51bGx9fV0pO3JldHVybiBNYXJrdXBBbm5vdGF0aW9ufSh5KTtyLk1hcmt1cEFubm90YXRpb249djt2YXIgUz1mdW5jdGlvbih0KXtfaW5oZXJpdHMoV2lkZ2V0QW5ub3RhdGlvbix0KTt2YXIgcixhLGMsdT1fY3JlYXRlU3VwZXIoV2lkZ2V0QW5ub3RhdGlvbik7ZnVuY3Rpb24gV2lkZ2V0QW5ub3RhdGlvbih0KXt2YXIgcjtfY2xhc3NDYWxsQ2hlY2sodGhpcyxXaWRnZXRBbm5vdGF0aW9uKTtyPXUuY2FsbCh0aGlzLHQpO3ZhciBhPXQuZGljdCxpPXIuZGF0YTtyLnJlZj10LnJlZjtpLmFubm90YXRpb25UeXBlPW8uQW5ub3RhdGlvblR5cGUuV0lER0VUO2kuZmllbGROYW1lPXIuX2NvbnN0cnVjdEZpZWxkTmFtZShhKTt2YXIgYz0oMCxoLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OmEsa2V5OiJWIixnZXRBcnJheTohMH0pO2kuZmllbGRWYWx1ZT1yLl9kZWNvZGVGb3JtVmFsdWUoYyk7aS5hbHRlcm5hdGl2ZVRleHQ9KDAsby5zdHJpbmdUb1BERlN0cmluZykoYS5nZXQoIlRVIil8fCIiKTtpLmRlZmF1bHRBcHBlYXJhbmNlPSgwLGguZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6YSxrZXk6IkRBIn0pfHx0LmFjcm9Gb3JtLmdldCgiREEiKXx8IiI7dmFyIGQ9KDAsaC5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDphLGtleToiRlQifSk7aS5maWVsZFR5cGU9KDAsbC5pc05hbWUpKGQpP2QubmFtZTpudWxsO3IuZmllbGRSZXNvdXJjZXM9KDAsaC5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDphLGtleToiRFIifSl8fHQuYWNyb0Zvcm0uZ2V0KCJEUiIpfHxsLkRpY3QuZW1wdHk7aS5maWVsZEZsYWdzPSgwLGguZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6YSxrZXk6IkZmIn0pOyghTnVtYmVyLmlzSW50ZWdlcihpLmZpZWxkRmxhZ3MpfHxpLmZpZWxkRmxhZ3M8MCkmJihpLmZpZWxkRmxhZ3M9MCk7aS5yZWFkT25seT1yLmhhc0ZpZWxkRmxhZyhvLkFubm90YXRpb25GaWVsZEZsYWcuUkVBRE9OTFkpO2lmKCJTaWciPT09aS5maWVsZFR5cGUpe2kuZmllbGRWYWx1ZT1udWxsO3Iuc2V0RmxhZ3Moby5Bbm5vdGF0aW9uRmxhZy5ISURERU4pfXJldHVybiByfV9jcmVhdGVDbGFzcyhXaWRnZXRBbm5vdGF0aW9uLFt7a2V5OiJfY29uc3RydWN0RmllbGROYW1lIix2YWx1ZTpmdW5jdGlvbiBfY29uc3RydWN0RmllbGROYW1lKHQpe2lmKCF0LmhhcygiVCIpJiYhdC5oYXMoIlBhcmVudCIpKXsoMCxvLndhcm4pKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpO3JldHVybiIifWlmKCF0LmhhcygiUGFyZW50IikpcmV0dXJuKDAsby5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIlQiKSk7dmFyIHI9W107dC5oYXMoIlQiKSYmci51bnNoaWZ0KCgwLG8uc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJUIikpKTtmb3IodmFyIGE9dDthLmhhcygiUGFyZW50Iik7KXthPWEuZ2V0KCJQYXJlbnQiKTtpZighKDAsbC5pc0RpY3QpKGEpKWJyZWFrO2EuaGFzKCJUIikmJnIudW5zaGlmdCgoMCxvLnN0cmluZ1RvUERGU3RyaW5nKShhLmdldCgiVCIpKSl9cmV0dXJuIHIuam9pbigiLiIpfX0se2tleToiX2RlY29kZUZvcm1WYWx1ZSIsdmFsdWU6ZnVuY3Rpb24gX2RlY29kZUZvcm1WYWx1ZSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuKDAsby5pc1N0cmluZykodCl9KSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4oMCxvLnN0cmluZ1RvUERGU3RyaW5nKSh0KX0pKTooMCxsLmlzTmFtZSkodCk/KDAsby5zdHJpbmdUb1BERlN0cmluZykodC5uYW1lKTooMCxvLmlzU3RyaW5nKSh0KT8oMCxvLnN0cmluZ1RvUERGU3RyaW5nKSh0KTpudWxsfX0se2tleToiaGFzRmllbGRGbGFnIix2YWx1ZTpmdW5jdGlvbiBoYXNGaWVsZEZsYWcodCl7cmV0dXJuISEodGhpcy5kYXRhLmZpZWxkRmxhZ3MmdCl9fSx7a2V5OiJnZXRPcGVyYXRvckxpc3QiLHZhbHVlOmZ1bmN0aW9uIGdldE9wZXJhdG9yTGlzdCh0LHIsYSxpKXt2YXIgYz10aGlzO3JldHVybiBhP1Byb21pc2UucmVzb2x2ZShuZXcgZC5PcGVyYXRvckxpc3QpOnRoaXMuX2hhc1RleHQ/dGhpcy5fZ2V0QXBwZWFyYW5jZSh0LHIsaSkudGhlbigoZnVuY3Rpb24obCl7aWYoYy5hcHBlYXJhbmNlJiZudWxsPT09bClyZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUpLCJnZXRPcGVyYXRvckxpc3QiLGMpLmNhbGwoYyx0LHIsYSxpKTt2YXIgdT1uZXcgZC5PcGVyYXRvckxpc3Q7aWYoIWMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZXx8bnVsbD09PWwpcmV0dXJuIHU7dmFyIGg9WzEsMCwwLDEsMCwwXSxtPVswLDAsYy5kYXRhLnJlY3RbMl0tYy5kYXRhLnJlY3RbMF0sYy5kYXRhLnJlY3RbM10tYy5kYXRhLnJlY3RbMV1dLGc9Z2V0VHJhbnNmb3JtTWF0cml4KGMuZGF0YS5yZWN0LG0saCk7dS5hZGRPcChvLk9QUy5iZWdpbkFubm90YXRpb24sW2MuZGF0YS5yZWN0LGcsaF0pO3ZhciB5PW5ldyBwLlN0cmluZ1N0cmVhbShsKTtyZXR1cm4gdC5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTp5LHRhc2s6cixyZXNvdXJjZXM6Yy5maWVsZFJlc291cmNlcyxvcGVyYXRvckxpc3Q6dX0pLnRoZW4oKGZ1bmN0aW9uKCl7dS5hZGRPcChvLk9QUy5lbmRBbm5vdGF0aW9uLFtdKTtyZXR1cm4gdX0pKX0pKTpfZ2V0KF9nZXRQcm90b3R5cGVPZihXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZSksImdldE9wZXJhdG9yTGlzdCIsdGhpcykuY2FsbCh0aGlzLHQscixhLGkpfX0se2tleToic2F2ZSIsdmFsdWU6KGM9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUyKHQscixhKXt2YXIgYyx1LGgsZCxwLGcseSxiLHYsUyxrLHc7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMiQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6aWYodGhpcy5kYXRhLmZpZWxkVmFsdWUhPT1hW3RoaXMuZGF0YS5pZF0pe2kubmV4dD0yO2JyZWFrfXJldHVybiBpLmFicnVwdCgicmV0dXJuIixudWxsKTtjYXNlIDI6aS5uZXh0PTQ7cmV0dXJuIHRoaXMuX2dldEFwcGVhcmFuY2UodCxyLGEpO2Nhc2UgNDppZihudWxsIT09KGM9aS5zZW50KSl7aS5uZXh0PTc7YnJlYWt9cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLG51bGwpO2Nhc2UgNzp1PXQueHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTtpZigoMCxsLmlzRGljdCkodSkpe2kubmV4dD0xMDticmVha31yZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsbnVsbCk7Y2FzZSAxMDpoPVswLDAsdGhpcy5kYXRhLnJlY3RbMl0tdGhpcy5kYXRhLnJlY3RbMF0sdGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV1dO2Q9dC54cmVmLmdldE5ld1JlZigpOyhwPW5ldyBsLkRpY3QodC54cmVmKSkuc2V0KCJOIixkKTtnPWFbdGhpcy5kYXRhLmlkXTt5PXQueHJlZi5lbmNyeXB0O2I9bnVsbDt2PW51bGw7aWYoeSl7Yj15LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnJlZi5udW0sdGhpcy5yZWYuZ2VuKTt2PXkuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKGQubnVtLGQuZ2VuKTtjPXYuZW5jcnlwdFN0cmluZyhjKX11LnNldCgiViIsZyk7dS5zZXQoIkFQIixwKTt1LnNldCgiTSIsIkQ6Ii5jb25jYXQoKDAsby5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSk7KFM9bmV3IGwuRGljdCh0LnhyZWYpKS5zZXQoIkxlbmd0aCIsYy5sZW5ndGgpO1Muc2V0KCJTdWJ0eXBlIixsLk5hbWUuZ2V0KCJGb3JtIikpO1Muc2V0KCJSZXNvdXJjZXMiLHRoaXMuZmllbGRSZXNvdXJjZXMpO1Muc2V0KCJCQm94IixoKTtrPVsiIi5jb25jYXQodGhpcy5yZWYubnVtLCIgIikuY29uY2F0KHRoaXMucmVmLmdlbiwiIG9ialxuIildOygwLG0ud3JpdGVEaWN0KSh1LGssYik7ay5wdXNoKCJcbmVuZG9ialxuIik7dz1bIiIuY29uY2F0KGQubnVtLCIgIikuY29uY2F0KGQuZ2VuLCIgb2JqXG4iKV07KDAsbS53cml0ZURpY3QpKFMsdyx2KTt3LnB1c2goIiBzdHJlYW1cbiIpO3cucHVzaChjKTt3LnB1c2goIlxuZW5kc3RyZWFtXG5lbmRvYmpcbiIpO3JldHVybiBpLmFicnVwdCgicmV0dXJuIixbe3JlZjp0aGlzLnJlZixkYXRhOmsuam9pbigiIil9LHtyZWY6ZCxkYXRhOncuam9pbigiIil9XSk7Y2FzZSAzNjpjYXNlImVuZCI6cmV0dXJuIGkuc3RvcCgpfX0pLF9jYWxsZWUyLHRoaXMpfSkpKSxmdW5jdGlvbiBzYXZlKHQscixhKXtyZXR1cm4gYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiX2dldEFwcGVhcmFuY2UiLHZhbHVlOihhPV9hc3luY1RvR2VuZXJhdG9yKGkuZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlMyh0LHIsYSl7dmFyIGMsbCx1LGgsZCxwLG0sZyx5LGIsdixTLGssdyxDLF87cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMyQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6Yz10aGlzLmhhc0ZpZWxkRmxhZyhvLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpO2lmKGEmJiFjKXtpLm5leHQ9MzticmVha31yZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsbnVsbCk7Y2FzZSAzOmlmKCIiIT09KGw9YVt0aGlzLmRhdGEuaWRdKSl7aS5uZXh0PTY7YnJlYWt9cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLCIiKTtjYXNlIDY6aD11PTI7ZD10aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXTtwPXRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdO2kubmV4dD0xMjtyZXR1cm4gdGhpcy5fZ2V0Rm9udERhdGEodCxyKTtjYXNlIDEyOm09aS5zZW50O2c9X3NsaWNlZFRvQXJyYXkobSwyKSx5PWdbMF0sYj1nWzFdO3Y9bVsyXTt2PXRoaXMuX2NvbXB1dGVGb250U2l6ZSh5LGIsdixkKTtTPXkuZGVzY2VudDtpc05hTihTKSYmKFM9MCk7az11K01hdGguYWJzKFMpKnY7dz10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2U7Qz10aGlzLmRhdGEudGV4dEFsaWdubWVudDtpZighdGhpcy5kYXRhLmNvbWIpe2kubmV4dD0yMzticmVha31yZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsdGhpcy5fZ2V0Q29tYkFwcGVhcmFuY2UodyxsLHAsaCxrKSk7Y2FzZSAyMzppZighdGhpcy5kYXRhLm11bHRpTGluZSl7aS5uZXh0PTI1O2JyZWFrfXJldHVybiBpLmFicnVwdCgicmV0dXJuIix0aGlzLl9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKHcsbCx5LHYscCxkLEMsaCxrKSk7Y2FzZSAyNTppZighKDA9PT1DfHxDPjIpKXtpLm5leHQ9Mjc7YnJlYWt9cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLCIvVHggQk1DIHEgQlQgIit3KyIgMSAwIDAgMSAiLmNvbmNhdChoLCIgIikuY29uY2F0KGssIiBUbSAoIikuY29uY2F0KCgwLG8uZXNjYXBlU3RyaW5nKShsKSwiKSBUaiIpKyIgRVQgUSBFTUMiKTtjYXNlIDI3Ol89dGhpcy5fcmVuZGVyVGV4dChsLHksdixwLEMsaCxrKTtyZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsIi9UeCBCTUMgcSBCVCAiK3crIiAxIDAgMCAxIDAgMCBUbSAiLmNvbmNhdChfKSsiIEVUIFEgRU1DIik7Y2FzZSAyOTpjYXNlImVuZCI6cmV0dXJuIGkuc3RvcCgpfX0pLF9jYWxsZWUzLHRoaXMpfSkpKSxmdW5jdGlvbiBfZ2V0QXBwZWFyYW5jZSh0LHIsaSl7cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6Il9nZXRGb250RGF0YSIsdmFsdWU6KHI9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWU0KHQscil7dmFyIGEsbztyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWU0JChpKXtmb3IoOzspc3dpdGNoKGkucHJldj1pLm5leHQpe2Nhc2UgMDphPW5ldyBkLk9wZXJhdG9yTGlzdDtvPXtmb250U2l6ZTowLGZvbnQ6bnVsbCxmb250TmFtZTpudWxsLGNsb25lOmZ1bmN0aW9uIGNsb25lKCl7cmV0dXJuIHRoaXN9fTtpLm5leHQ9NDtyZXR1cm4gdC5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpuZXcgcC5TdHJpbmdTdHJlYW0odGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlKSx0YXNrOnIscmVzb3VyY2VzOnRoaXMuZmllbGRSZXNvdXJjZXMsb3BlcmF0b3JMaXN0OmEsaW5pdGlhbFN0YXRlOm99KTtjYXNlIDQ6cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLFtvLmZvbnQsby5mb250TmFtZSxvLmZvbnRTaXplXSk7Y2FzZSA1OmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZTQsdGhpcyl9KSkpLGZ1bmN0aW9uIF9nZXRGb250RGF0YSh0LGEpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJfY29tcHV0ZUZvbnRTaXplIix2YWx1ZTpmdW5jdGlvbiBfY29tcHV0ZUZvbnRTaXplKHQscixhLGkpe2lmKG51bGw9PT1hfHwwPT09YSl7dmFyIG89LjcqKHQuY2hhcnNUb0dseXBocygiTSIsITApWzBdLndpZHRoLzFlMyk7YT1NYXRoLm1heCgxLE1hdGguZmxvb3IoaS8oMS41Km8pKSk7dmFyIGM9bmV3IFJlZ0V4cCgiLyIuY29uY2F0KHIsIlxccytbMC05Ll0rXFxzK1RmIikpOy0xPT09dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlLnNlYXJjaChjKSYmKGM9bmV3IFJlZ0V4cCgiLyIuY29uY2F0KHIsIlxccytUZiIpKSk7dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlPXRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZS5yZXBsYWNlKGMsIi8iLmNvbmNhdChyLCIgIikuY29uY2F0KGEsIiBUZiIpKX1yZXR1cm4gYX19LHtrZXk6Il9yZW5kZXJUZXh0Iix2YWx1ZTpmdW5jdGlvbiBfcmVuZGVyVGV4dCh0LHIsYSxpLGMsbCx1KXt2YXIgaCxkLHA9YS8xZTMsbT0wLGc9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoci5jaGFyc1RvR2x5cGhzKHQpKTt0cnl7Zm9yKGcucygpOyEoaD1nLm4oKSkuZG9uZTspe20rPWgudmFsdWUud2lkdGgqcH19Y2F0Y2godCl7Zy5lKHQpfWZpbmFsbHl7Zy5mKCl9ZD0oZD0xPT09Yz8oaS1tKS8yOjI9PT1jP2ktbS1sOmwpLnRvRml4ZWQoMik7dT11LnRvRml4ZWQoMik7cmV0dXJuIiIuY29uY2F0KGQsIiAiKS5jb25jYXQodSwiIFRkICgiKS5jb25jYXQoKDAsby5lc2NhcGVTdHJpbmcpKHQpLCIpIFRqIil9fV0pO3JldHVybiBXaWRnZXRBbm5vdGF0aW9ufSh5KSxrPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhUZXh0V2lkZ2V0QW5ub3RhdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoVGV4dFdpZGdldEFubm90YXRpb24pO2Z1bmN0aW9uIFRleHRXaWRnZXRBbm5vdGF0aW9uKHQpe3ZhciBhO19jbGFzc0NhbGxDaGVjayh0aGlzLFRleHRXaWRnZXRBbm5vdGF0aW9uKTsoYT1yLmNhbGwodGhpcyx0KSkuX2hhc1RleHQ9ITA7dmFyIGk9dC5kaWN0OygwLG8uaXNTdHJpbmcpKGEuZGF0YS5maWVsZFZhbHVlKXx8KGEuZGF0YS5maWVsZFZhbHVlPSIiKTt2YXIgYz0oMCxoLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0Omksa2V5OiJRIn0pOyghTnVtYmVyLmlzSW50ZWdlcihjKXx8YzwwfHxjPjIpJiYoYz1udWxsKTthLmRhdGEudGV4dEFsaWdubWVudD1jO3ZhciBsPSgwLGguZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6aSxrZXk6Ik1heExlbiJ9KTsoIU51bWJlci5pc0ludGVnZXIobCl8fGw8MCkmJihsPW51bGwpO2EuZGF0YS5tYXhMZW49bDthLmRhdGEubXVsdGlMaW5lPWEuaGFzRmllbGRGbGFnKG8uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpO2EuZGF0YS5jb21iPWEuaGFzRmllbGRGbGFnKG8uQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSYmIWEuaGFzRmllbGRGbGFnKG8uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpJiYhYS5oYXNGaWVsZEZsYWcoby5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSYmIWEuaGFzRmllbGRGbGFnKG8uQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSYmbnVsbCE9PWEuZGF0YS5tYXhMZW47cmV0dXJuIGF9X2NyZWF0ZUNsYXNzKFRleHRXaWRnZXRBbm5vdGF0aW9uLFt7a2V5OiJfZ2V0Q29tYkFwcGVhcmFuY2UiLHZhbHVlOmZ1bmN0aW9uIF9nZXRDb21iQXBwZWFyYW5jZSh0LHIsYSxpLGMpe3ZhciBsLHU9KGEvdGhpcy5kYXRhLm1heExlbikudG9GaXhlZCgyKSxoPVtdLGQ9X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocik7dHJ5e2ZvcihkLnMoKTshKGw9ZC5uKCkpLmRvbmU7KXt2YXIgcD1sLnZhbHVlO2gucHVzaCgiKCIuY29uY2F0KCgwLG8uZXNjYXBlU3RyaW5nKShwKSwiKSBUaiIpKX19Y2F0Y2godCl7ZC5lKHQpfWZpbmFsbHl7ZC5mKCl9dmFyIG09aC5qb2luKCIgIi5jb25jYXQodSwiIDAgVGQgIikpO3JldHVybiIvVHggQk1DIHEgQlQgIit0KyIgMSAwIDAgMSAiLmNvbmNhdChpLCIgIikuY29uY2F0KGMsIiBUbSAiKS5jb25jYXQobSkrIiBFVCBRIEVNQyJ9fSx7a2V5OiJfZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZSIsdmFsdWU6ZnVuY3Rpb24gX2dldE11bHRpbGluZUFwcGVhcmFuY2UodCxyLGEsaSxvLGMsbCx1LGgpe3ZhciBkLHA9W10sbT1vLTIqdSxnPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHIuc3BsaXQoL1xyXG58XHJ8XG4vKSk7dHJ5e2ZvcihnLnMoKTshKGQ9Zy5uKCkpLmRvbmU7KXt2YXIgeSxiPWQudmFsdWUsdj1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLl9zcGxpdExpbmUoYixhLGksbSkpO3RyeXtmb3Iodi5zKCk7ISh5PXYubigpKS5kb25lOyl7dmFyIFM9eS52YWx1ZSxrPTA9PT1wLmxlbmd0aD91OjA7cC5wdXNoKHRoaXMuX3JlbmRlclRleHQoUyxhLGksbyxsLGssLWkpKX19Y2F0Y2godCl7di5lKHQpfWZpbmFsbHl7di5mKCl9fX1jYXRjaCh0KXtnLmUodCl9ZmluYWxseXtnLmYoKX12YXIgdz1wLmpvaW4oIlxuIik7cmV0dXJuIi9UeCBCTUMgcSBCVCAiK3QrIiAxIDAgMCAxIDAgIi5jb25jYXQoYywiIFRtICIpLmNvbmNhdCh3KSsiIEVUIFEgRU1DIn19LHtrZXk6Il9zcGxpdExpbmUiLHZhbHVlOmZ1bmN0aW9uIF9zcGxpdExpbmUodCxyLGEsaSl7aWYodC5sZW5ndGg8PTEpcmV0dXJuW3RdO2Zvcih2YXIgbz1hLzFlMyxjPXIuY2hhcnNUb0dseXBocygiICIsITApWzBdLndpZHRoKm8sbD1bXSx1PS0xLGg9MCxkPTAscD0wLG09dC5sZW5ndGg7cDxtO3ArKyl7dmFyIGc9dC5jaGFyQXQocCk7aWYoIiAiPT09ZylpZihkK2M+aSl7bC5wdXNoKHQuc3Vic3RyaW5nKGgscCkpO2g9cDtkPWM7dT0tMX1lbHNle2QrPWM7dT1wfWVsc2V7dmFyIHk9ci5jaGFyc1RvR2x5cGhzKGcsITEpWzBdLndpZHRoKm87aWYoZCt5PmkpaWYoLTEhPT11KXtsLnB1c2godC5zdWJzdHJpbmcoaCx1KzEpKTtoPXA9dSsxO3U9LTE7ZD0wfWVsc2V7bC5wdXNoKHQuc3Vic3RyaW5nKGgscCkpO2g9cDtkPXl9ZWxzZSBkKz15fX1oPHQubGVuZ3RoJiZsLnB1c2godC5zdWJzdHJpbmcoaCx0Lmxlbmd0aCkpO3JldHVybiBsfX1dKTtyZXR1cm4gVGV4dFdpZGdldEFubm90YXRpb259KFMpLHc9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEJ1dHRvbldpZGdldEFubm90YXRpb24sdCk7dmFyIHIsYSx1LGg9X2NyZWF0ZVN1cGVyKEJ1dHRvbldpZGdldEFubm90YXRpb24pO2Z1bmN0aW9uIEJ1dHRvbldpZGdldEFubm90YXRpb24odCl7dmFyIHI7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbik7KHI9aC5jYWxsKHRoaXMsdCkpLmNoZWNrZWRBcHBlYXJhbmNlPW51bGw7ci51bmNoZWNrZWRBcHBlYXJhbmNlPW51bGw7ci5kYXRhLmNoZWNrQm94PSFyLmhhc0ZpZWxkRmxhZyhvLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pJiYhci5oYXNGaWVsZEZsYWcoby5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO3IuZGF0YS5yYWRpb0J1dHRvbj1yLmhhc0ZpZWxkRmxhZyhvLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pJiYhci5oYXNGaWVsZEZsYWcoby5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO3IuZGF0YS5wdXNoQnV0dG9uPXIuaGFzRmllbGRGbGFnKG8uQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKTtyLmRhdGEuY2hlY2tCb3g/ci5fcHJvY2Vzc0NoZWNrQm94KHQpOnIuZGF0YS5yYWRpb0J1dHRvbj9yLl9wcm9jZXNzUmFkaW9CdXR0b24odCk6ci5kYXRhLnB1c2hCdXR0b24/ci5fcHJvY2Vzc1B1c2hCdXR0b24odCk6KDAsby53YXJuKSgiSW52YWxpZCBmaWVsZCBmbGFncyBmb3IgYnV0dG9uIHdpZGdldCBhbm5vdGF0aW9uIik7cmV0dXJuIHJ9X2NyZWF0ZUNsYXNzKEJ1dHRvbldpZGdldEFubm90YXRpb24sW3trZXk6ImdldE9wZXJhdG9yTGlzdCIsdmFsdWU6ZnVuY3Rpb24gZ2V0T3BlcmF0b3JMaXN0KHQscixhLGkpe2lmKHRoaXMuZGF0YS5wdXNoQnV0dG9uKXJldHVybiBfZ2V0KF9nZXRQcm90b3R5cGVPZihCdXR0b25XaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZSksImdldE9wZXJhdG9yTGlzdCIsdGhpcykuY2FsbCh0aGlzLHQsciwhMSxpKTtpZihpKXt2YXIgbztpZihvPWlbdGhpcy5kYXRhLmlkXXx8ITE/dGhpcy5jaGVja2VkQXBwZWFyYW5jZTp0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2Upe3ZhciBjPXRoaXMuYXBwZWFyYW5jZTt0aGlzLmFwcGVhcmFuY2U9bzt2YXIgbD1fZ2V0KF9nZXRQcm90b3R5cGVPZihCdXR0b25XaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZSksImdldE9wZXJhdG9yTGlzdCIsdGhpcykuY2FsbCh0aGlzLHQscixhLGkpO3RoaXMuYXBwZWFyYW5jZT1jO3JldHVybiBsfXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IGQuT3BlcmF0b3JMaXN0KX1yZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUpLCJnZXRPcGVyYXRvckxpc3QiLHRoaXMpLmNhbGwodGhpcyx0LHIsYSxpKX19LHtrZXk6InNhdmUiLHZhbHVlOih1PV9hc3luY1RvR2VuZXJhdG9yKGkuZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlNSh0LHIsYSl7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlNSQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6aWYoIXRoaXMuZGF0YS5jaGVja0JveCl7aS5uZXh0PTI7YnJlYWt9cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHRoaXMuX3NhdmVDaGVja2JveCh0LHIsYSkpO2Nhc2UgMjppZighdGhpcy5kYXRhLnJhZGlvQnV0dG9uKXtpLm5leHQ9NDticmVha31yZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsdGhpcy5fc2F2ZVJhZGlvQnV0dG9uKHQscixhKSk7Y2FzZSA0OnJldHVybiBpLmFicnVwdCgicmV0dXJuIixfZ2V0KF9nZXRQcm90b3R5cGVPZihCdXR0b25XaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZSksInNhdmUiLHRoaXMpLmNhbGwodGhpcyx0LHIsYSkpO2Nhc2UgNTpjYXNlImVuZCI6cmV0dXJuIGkuc3RvcCgpfX0pLF9jYWxsZWU1LHRoaXMpfSkpKSxmdW5jdGlvbiBzYXZlKHQscixhKXtyZXR1cm4gdS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiX3NhdmVDaGVja2JveCIsdmFsdWU6KGE9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWU2KHQscixhKXt2YXIgYyx1LGgsZCxwLGcseTtyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWU2JChyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpjPXRoaXMuZGF0YS5maWVsZFZhbHVlJiYiT2ZmIiE9PXRoaXMuZGF0YS5maWVsZFZhbHVlO3U9YVt0aGlzLmRhdGEuaWRdO2lmKGMhPT11KXtyLm5leHQ9NDticmVha31yZXR1cm4gci5hYnJ1cHQoInJldHVybiIsbnVsbCk7Y2FzZSA0Omg9dC54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpO2lmKCgwLGwuaXNEaWN0KShoKSl7ci5uZXh0PTc7YnJlYWt9cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLG51bGwpO2Nhc2UgNzpkPWwuTmFtZS5nZXQodT90aGlzLmRhdGEuZXhwb3J0VmFsdWU6Ik9mZiIpO2guc2V0KCJWIixkKTtoLnNldCgiQVMiLGQpO2guc2V0KCJNIiwiRDoiLmNvbmNhdCgoMCxvLmdldE1vZGlmaWNhdGlvbkRhdGUpKCkpKTtwPXQueHJlZi5lbmNyeXB0O2c9bnVsbDtwJiYoZz1wLmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnJlZi5udW0sdGhpcy5yZWYuZ2VuKSk7eT1bIiIuY29uY2F0KHRoaXMucmVmLm51bSwiICIpLmNvbmNhdCh0aGlzLnJlZi5nZW4sIiBvYmpcbiIpXTsoMCxtLndyaXRlRGljdCkoaCx5LGcpO3kucHVzaCgiXG5lbmRvYmpcbiIpO3JldHVybiByLmFicnVwdCgicmV0dXJuIixbe3JlZjp0aGlzLnJlZixkYXRhOnkuam9pbigiIil9XSk7Y2FzZSAxODpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLF9jYWxsZWU2LHRoaXMpfSkpKSxmdW5jdGlvbiBfc2F2ZUNoZWNrYm94KHQscixpKXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiX3NhdmVSYWRpb0J1dHRvbiIsdmFsdWU6KHI9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWU3KHQscixhKXt2YXIgYyx1LGgsZCxwLGcseSxiLHYsUyxrO3JldHVybiBpLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZTckKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOmM9dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuYnV0dG9uVmFsdWU7dT1hW3RoaXMuZGF0YS5pZF07aWYoYyE9PXUpe3IubmV4dD00O2JyZWFrfXJldHVybiByLmFicnVwdCgicmV0dXJuIixudWxsKTtjYXNlIDQ6aD10LnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7aWYoKDAsbC5pc0RpY3QpKGgpKXtyLm5leHQ9NzticmVha31yZXR1cm4gci5hYnJ1cHQoInJldHVybiIsbnVsbCk7Y2FzZSA3OmQ9bC5OYW1lLmdldCh1P3RoaXMuZGF0YS5idXR0b25WYWx1ZToiT2ZmIik7cD1udWxsO2c9dC54cmVmLmVuY3J5cHQ7aWYodSlpZigoMCxsLmlzUmVmKSh0aGlzLnBhcmVudCkpe3k9dC54cmVmLmZldGNoKHRoaXMucGFyZW50KTtiPW51bGw7ZyYmKGI9Zy5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5wYXJlbnQubnVtLHRoaXMucGFyZW50LmdlbikpO3kuc2V0KCJWIixkKTtwPVsiIi5jb25jYXQodGhpcy5wYXJlbnQubnVtLCIgIikuY29uY2F0KHRoaXMucGFyZW50LmdlbiwiIG9ialxuIildOygwLG0ud3JpdGVEaWN0KSh5LHAsYik7cC5wdXNoKCJcbmVuZG9ialxuIil9ZWxzZSgwLGwuaXNEaWN0KSh0aGlzLnBhcmVudCkmJnRoaXMucGFyZW50LnNldCgiViIsZCk7aC5zZXQoIkFTIixkKTtoLnNldCgiTSIsIkQ6Ii5jb25jYXQoKDAsby5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSk7dj1udWxsO2cmJih2PWcuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucmVmLm51bSx0aGlzLnJlZi5nZW4pKTtTPVsiIi5jb25jYXQodGhpcy5yZWYubnVtLCIgIikuY29uY2F0KHRoaXMucmVmLmdlbiwiIG9ialxuIildOygwLG0ud3JpdGVEaWN0KShoLFMsdik7Uy5wdXNoKCJcbmVuZG9ialxuIik7az1be3JlZjp0aGlzLnJlZixkYXRhOlMuam9pbigiIil9XTtudWxsIT09cCYmay5wdXNoKHtyZWY6dGhpcy5wYXJlbnQsZGF0YTpwLmpvaW4oIiIpfSk7cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLGspO2Nhc2UgMjE6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxfY2FsbGVlNyx0aGlzKX0pKSksZnVuY3Rpb24gX3NhdmVSYWRpb0J1dHRvbih0LGEsaSl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6Il9wcm9jZXNzQ2hlY2tCb3giLHZhbHVlOmZ1bmN0aW9uIF9wcm9jZXNzQ2hlY2tCb3godCl7dmFyIHI9dC5kaWN0LmdldCgiQVAiKTtpZigoMCxsLmlzRGljdCkocikpe3ZhciBhPXIuZ2V0KCJOIik7aWYoKDAsbC5pc0RpY3QpKGEpKXt2YXIgaT1hLmdldEtleXMoKTtpLmluY2x1ZGVzKCJPZmYiKXx8aS5wdXNoKCJPZmYiKTtpZigyPT09aS5sZW5ndGgpe3RoaXMuZGF0YS5leHBvcnRWYWx1ZT0iT2ZmIj09PWlbMF0/aVsxXTppWzBdO3RoaXMuY2hlY2tlZEFwcGVhcmFuY2U9YS5nZXQodGhpcy5kYXRhLmV4cG9ydFZhbHVlKTt0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2U9YS5nZXQoIk9mZiIpfHxudWxsfX19fX0se2tleToiX3Byb2Nlc3NSYWRpb0J1dHRvbiIsdmFsdWU6ZnVuY3Rpb24gX3Byb2Nlc3NSYWRpb0J1dHRvbih0KXt0aGlzLmRhdGEuZmllbGRWYWx1ZT10aGlzLmRhdGEuYnV0dG9uVmFsdWU9bnVsbDt2YXIgcj10LmRpY3QuZ2V0KCJQYXJlbnQiKTtpZigoMCxsLmlzRGljdCkocikmJnIuaGFzKCJWIikpe3ZhciBhPXIuZ2V0KCJWIik7aWYoKDAsbC5pc05hbWUpKGEpKXt0aGlzLnBhcmVudD10LmRpY3QuZ2V0UmF3KCJQYXJlbnQiKTt0aGlzLmRhdGEuZmllbGRWYWx1ZT10aGlzLl9kZWNvZGVGb3JtVmFsdWUoYSl9fXZhciBpPXQuZGljdC5nZXQoIkFQIik7aWYoKDAsbC5pc0RpY3QpKGkpKXt2YXIgbz1pLmdldCgiTiIpO2lmKCgwLGwuaXNEaWN0KShvKSl7dmFyIGMsdT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLmdldEtleXMoKSk7dHJ5e2Zvcih1LnMoKTshKGM9dS5uKCkpLmRvbmU7KXt2YXIgaD1jLnZhbHVlO2lmKCJPZmYiIT09aCl7dGhpcy5kYXRhLmJ1dHRvblZhbHVlPWg7YnJlYWt9fX1jYXRjaCh0KXt1LmUodCl9ZmluYWxseXt1LmYoKX10aGlzLmNoZWNrZWRBcHBlYXJhbmNlPW8uZ2V0KHRoaXMuZGF0YS5idXR0b25WYWx1ZSk7dGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlPW8uZ2V0KCJPZmYiKXx8bnVsbH19fX0se2tleToiX3Byb2Nlc3NQdXNoQnV0dG9uIix2YWx1ZTpmdW5jdGlvbiBfcHJvY2Vzc1B1c2hCdXR0b24odCl7dC5kaWN0LmhhcygiQSIpP2MuQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHtkZXN0RGljdDp0LmRpY3QscmVzdWx0T2JqOnRoaXMuZGF0YSxkb2NCYXNlVXJsOnQucGRmTWFuYWdlci5kb2NCYXNlVXJsfSk6KDAsby53YXJuKSgiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZCIpfX1dKTtyZXR1cm4gQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbn0oUyksQz1mdW5jdGlvbih0KXtfaW5oZXJpdHMoQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbik7ZnVuY3Rpb24gQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDaG9pY2VXaWRnZXRBbm5vdGF0aW9uKTsoYT1yLmNhbGwodGhpcyx0KSkuZGF0YS5vcHRpb25zPVtdO3ZhciBpPSgwLGguZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dC5kaWN0LGtleToiT3B0In0pO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKHZhciBjPXQueHJlZixsPTAsdT1pLmxlbmd0aDtsPHU7bCsrKXt2YXIgZD1jLmZldGNoSWZSZWYoaVtsXSkscD1BcnJheS5pc0FycmF5KGQpO2EuZGF0YS5vcHRpb25zW2xdPXtleHBvcnRWYWx1ZTphLl9kZWNvZGVGb3JtVmFsdWUocD9jLmZldGNoSWZSZWYoZFswXSk6ZCksZGlzcGxheVZhbHVlOmEuX2RlY29kZUZvcm1WYWx1ZShwP2MuZmV0Y2hJZlJlZihkWzFdKTpkKX19KDAsby5pc1N0cmluZykoYS5kYXRhLmZpZWxkVmFsdWUpP2EuZGF0YS5maWVsZFZhbHVlPVthLmRhdGEuZmllbGRWYWx1ZV06YS5kYXRhLmZpZWxkVmFsdWV8fChhLmRhdGEuZmllbGRWYWx1ZT1bXSk7YS5kYXRhLmNvbWJvPWEuaGFzRmllbGRGbGFnKG8uQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CTyk7YS5kYXRhLm11bHRpU2VsZWN0PWEuaGFzRmllbGRGbGFnKG8uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSVNFTEVDVCk7YS5faGFzVGV4dD0hMDtyZXR1cm4gYX1yZXR1cm4gQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbn0oUyksXz1mdW5jdGlvbih0KXtfaW5oZXJpdHMoVGV4dEFubm90YXRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFRleHRBbm5vdGF0aW9uKTtmdW5jdGlvbiBUZXh0QW5ub3RhdGlvbih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxUZXh0QW5ub3RhdGlvbik7YT1yLmNhbGwodGhpcyx0KTt2YXIgaT10LmRpY3Q7YS5kYXRhLmFubm90YXRpb25UeXBlPW8uQW5ub3RhdGlvblR5cGUuVEVYVDtpZihhLmRhdGEuaGFzQXBwZWFyYW5jZSlhLmRhdGEubmFtZT0iTm9JY29uIjtlbHNle2EuZGF0YS5yZWN0WzFdPWEuZGF0YS5yZWN0WzNdLTIyO2EuZGF0YS5yZWN0WzJdPWEuZGF0YS5yZWN0WzBdKzIyO2EuZGF0YS5uYW1lPWkuaGFzKCJOYW1lIik/aS5nZXQoIk5hbWUiKS5uYW1lOiJOb3RlIn1pZihpLmhhcygiU3RhdGUiKSl7YS5kYXRhLnN0YXRlPWkuZ2V0KCJTdGF0ZSIpfHxudWxsO2EuZGF0YS5zdGF0ZU1vZGVsPWkuZ2V0KCJTdGF0ZU1vZGVsIil8fG51bGx9ZWxzZXthLmRhdGEuc3RhdGU9bnVsbDthLmRhdGEuc3RhdGVNb2RlbD1udWxsfXJldHVybiBhfXJldHVybiBUZXh0QW5ub3RhdGlvbn0odikseD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoTGlua0Fubm90YXRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKExpbmtBbm5vdGF0aW9uKTtmdW5jdGlvbiBMaW5rQW5ub3RhdGlvbih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxMaW5rQW5ub3RhdGlvbik7KGE9ci5jYWxsKHRoaXMsdCkpLmRhdGEuYW5ub3RhdGlvblR5cGU9by5Bbm5vdGF0aW9uVHlwZS5MSU5LO3ZhciBpPWdldFF1YWRQb2ludHModC5kaWN0LGEucmVjdGFuZ2xlKTtpJiYoYS5kYXRhLnF1YWRQb2ludHM9aSk7Yy5DYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OnQuZGljdCxyZXN1bHRPYmo6YS5kYXRhLGRvY0Jhc2VVcmw6dC5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmx9KTtyZXR1cm4gYX1yZXR1cm4gTGlua0Fubm90YXRpb259KHkpLEE9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFBvcHVwQW5ub3RhdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoUG9wdXBBbm5vdGF0aW9uKTtmdW5jdGlvbiBQb3B1cEFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUG9wdXBBbm5vdGF0aW9uKTsoYT1yLmNhbGwodGhpcyx0KSkuZGF0YS5hbm5vdGF0aW9uVHlwZT1vLkFubm90YXRpb25UeXBlLlBPUFVQO3ZhciBpPXQuZGljdC5nZXQoIlBhcmVudCIpO2lmKCFpKXsoMCxvLndhcm4pKCJQb3B1cCBhbm5vdGF0aW9uIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBwYXJlbnQgYW5ub3RhdGlvbi4iKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oYSl9dmFyIGM9aS5nZXQoIlN1YnR5cGUiKTthLmRhdGEucGFyZW50VHlwZT0oMCxsLmlzTmFtZSkoYyk/Yy5uYW1lOm51bGw7dmFyIHU9dC5kaWN0LmdldFJhdygiUGFyZW50Iik7YS5kYXRhLnBhcmVudElkPSgwLGwuaXNSZWYpKHUpP3UudG9TdHJpbmcoKTpudWxsO3ZhciBoPWkuZ2V0KCJSVCIpOygwLGwuaXNOYW1lKShoLG8uQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkmJihpPWkuZ2V0KCJJUlQiKSk7aWYoaS5oYXMoIk0iKSl7YS5zZXRNb2RpZmljYXRpb25EYXRlKGkuZ2V0KCJNIikpO2EuZGF0YS5tb2RpZmljYXRpb25EYXRlPWEubW9kaWZpY2F0aW9uRGF0ZX1lbHNlIGEuZGF0YS5tb2RpZmljYXRpb25EYXRlPW51bGw7aWYoaS5oYXMoIkMiKSl7YS5zZXRDb2xvcihpLmdldEFycmF5KCJDIikpO2EuZGF0YS5jb2xvcj1hLmNvbG9yfWVsc2UgYS5kYXRhLmNvbG9yPW51bGw7aWYoIWEudmlld2FibGUpe3ZhciBkPWkuZ2V0KCJGIik7YS5faXNWaWV3YWJsZShkKSYmYS5zZXRGbGFncyhkKX1hLmRhdGEudGl0bGU9KDAsby5zdHJpbmdUb1BERlN0cmluZykoaS5nZXQoIlQiKXx8IiIpO2EuZGF0YS5jb250ZW50cz0oMCxvLnN0cmluZ1RvUERGU3RyaW5nKShpLmdldCgiQ29udGVudHMiKXx8IiIpO3JldHVybiBhfXJldHVybiBQb3B1cEFubm90YXRpb259KHkpLFQ9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEZyZWVUZXh0QW5ub3RhdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoRnJlZVRleHRBbm5vdGF0aW9uKTtmdW5jdGlvbiBGcmVlVGV4dEFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRnJlZVRleHRBbm5vdGF0aW9uKTsoYT1yLmNhbGwodGhpcyx0KSkuZGF0YS5hbm5vdGF0aW9uVHlwZT1vLkFubm90YXRpb25UeXBlLkZSRUVURVhUO3JldHVybiBhfXJldHVybiBGcmVlVGV4dEFubm90YXRpb259KHYpLFI9ZnVuY3Rpb24odCl7X2luaGVyaXRzKExpbmVBbm5vdGF0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihMaW5lQW5ub3RhdGlvbik7ZnVuY3Rpb24gTGluZUFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTGluZUFubm90YXRpb24pOyhhPXIuY2FsbCh0aGlzLHQpKS5kYXRhLmFubm90YXRpb25UeXBlPW8uQW5ub3RhdGlvblR5cGUuTElORTthLmRhdGEubGluZUNvb3JkaW5hdGVzPW8uVXRpbC5ub3JtYWxpemVSZWN0KHQuZGljdC5nZXRBcnJheSgiTCIpKTtyZXR1cm4gYX1yZXR1cm4gTGluZUFubm90YXRpb259KHYpLEk9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFNxdWFyZUFubm90YXRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFNxdWFyZUFubm90YXRpb24pO2Z1bmN0aW9uIFNxdWFyZUFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsU3F1YXJlQW5ub3RhdGlvbik7KGE9ci5jYWxsKHRoaXMsdCkpLmRhdGEuYW5ub3RhdGlvblR5cGU9by5Bbm5vdGF0aW9uVHlwZS5TUVVBUkU7cmV0dXJuIGF9cmV0dXJuIFNxdWFyZUFubm90YXRpb259KHYpLFA9ZnVuY3Rpb24odCl7X2luaGVyaXRzKENpcmNsZUFubm90YXRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKENpcmNsZUFubm90YXRpb24pO2Z1bmN0aW9uIENpcmNsZUFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ2lyY2xlQW5ub3RhdGlvbik7KGE9ci5jYWxsKHRoaXMsdCkpLmRhdGEuYW5ub3RhdGlvblR5cGU9by5Bbm5vdGF0aW9uVHlwZS5DSVJDTEU7cmV0dXJuIGF9cmV0dXJuIENpcmNsZUFubm90YXRpb259KHYpLE89ZnVuY3Rpb24odCl7X2luaGVyaXRzKFBvbHlsaW5lQW5ub3RhdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoUG9seWxpbmVBbm5vdGF0aW9uKTtmdW5jdGlvbiBQb2x5bGluZUFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUG9seWxpbmVBbm5vdGF0aW9uKTsoYT1yLmNhbGwodGhpcyx0KSkuZGF0YS5hbm5vdGF0aW9uVHlwZT1vLkFubm90YXRpb25UeXBlLlBPTFlMSU5FO3ZhciBpPXQuZGljdC5nZXRBcnJheSgiVmVydGljZXMiKTthLmRhdGEudmVydGljZXM9W107Zm9yKHZhciBjPTAsbD1pLmxlbmd0aDtjPGw7Yys9MilhLmRhdGEudmVydGljZXMucHVzaCh7eDppW2NdLHk6aVtjKzFdfSk7cmV0dXJuIGF9cmV0dXJuIFBvbHlsaW5lQW5ub3RhdGlvbn0odiksRT1mdW5jdGlvbih0KXtfaW5oZXJpdHMoUG9seWdvbkFubm90YXRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFBvbHlnb25Bbm5vdGF0aW9uKTtmdW5jdGlvbiBQb2x5Z29uQW5ub3RhdGlvbih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQb2x5Z29uQW5ub3RhdGlvbik7KGE9ci5jYWxsKHRoaXMsdCkpLmRhdGEuYW5ub3RhdGlvblR5cGU9by5Bbm5vdGF0aW9uVHlwZS5QT0xZR09OO3JldHVybiBhfXJldHVybiBQb2x5Z29uQW5ub3RhdGlvbn0oTyksQj1mdW5jdGlvbih0KXtfaW5oZXJpdHMoQ2FyZXRBbm5vdGF0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihDYXJldEFubm90YXRpb24pO2Z1bmN0aW9uIENhcmV0QW5ub3RhdGlvbih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDYXJldEFubm90YXRpb24pOyhhPXIuY2FsbCh0aGlzLHQpKS5kYXRhLmFubm90YXRpb25UeXBlPW8uQW5ub3RhdGlvblR5cGUuQ0FSRVQ7cmV0dXJuIGF9cmV0dXJuIENhcmV0QW5ub3RhdGlvbn0odiksRD1mdW5jdGlvbih0KXtfaW5oZXJpdHMoSW5rQW5ub3RhdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoSW5rQW5ub3RhdGlvbik7ZnVuY3Rpb24gSW5rQW5ub3RhdGlvbih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxJbmtBbm5vdGF0aW9uKTsoYT1yLmNhbGwodGhpcyx0KSkuZGF0YS5hbm5vdGF0aW9uVHlwZT1vLkFubm90YXRpb25UeXBlLklOSzt2YXIgaT10LnhyZWYsYz10LmRpY3QuZ2V0QXJyYXkoIklua0xpc3QiKTthLmRhdGEuaW5rTGlzdHM9W107Zm9yKHZhciBsPTAsdT1jLmxlbmd0aDtsPHU7KytsKXthLmRhdGEuaW5rTGlzdHMucHVzaChbXSk7Zm9yKHZhciBoPTAsZD1jW2xdLmxlbmd0aDtoPGQ7aCs9MilhLmRhdGEuaW5rTGlzdHNbbF0ucHVzaCh7eDppLmZldGNoSWZSZWYoY1tsXVtoXSkseTppLmZldGNoSWZSZWYoY1tsXVtoKzFdKX0pfXJldHVybiBhfXJldHVybiBJbmtBbm5vdGF0aW9ufSh2KSxNPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhIaWdobGlnaHRBbm5vdGF0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihIaWdobGlnaHRBbm5vdGF0aW9uKTtmdW5jdGlvbiBIaWdobGlnaHRBbm5vdGF0aW9uKHQpe3ZhciBhO19jbGFzc0NhbGxDaGVjayh0aGlzLEhpZ2hsaWdodEFubm90YXRpb24pOyhhPXIuY2FsbCh0aGlzLHQpKS5kYXRhLmFubm90YXRpb25UeXBlPW8uQW5ub3RhdGlvblR5cGUuSElHSExJR0hUO3ZhciBpPWdldFF1YWRQb2ludHModC5kaWN0LGEucmVjdGFuZ2xlKTtpJiYoYS5kYXRhLnF1YWRQb2ludHM9aSk7cmV0dXJuIGF9cmV0dXJuIEhpZ2hsaWdodEFubm90YXRpb259KHYpLEw9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFVuZGVybGluZUFubm90YXRpb24sdCk7dmFyIHI9X2NyZWF0ZVN1cGVyKFVuZGVybGluZUFubm90YXRpb24pO2Z1bmN0aW9uIFVuZGVybGluZUFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsVW5kZXJsaW5lQW5ub3RhdGlvbik7KGE9ci5jYWxsKHRoaXMsdCkpLmRhdGEuYW5ub3RhdGlvblR5cGU9by5Bbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU7dmFyIGk9Z2V0UXVhZFBvaW50cyh0LmRpY3QsYS5yZWN0YW5nbGUpO2kmJihhLmRhdGEucXVhZFBvaW50cz1pKTtyZXR1cm4gYX1yZXR1cm4gVW5kZXJsaW5lQW5ub3RhdGlvbn0odiksTj1mdW5jdGlvbih0KXtfaW5oZXJpdHMoU3F1aWdnbHlBbm5vdGF0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihTcXVpZ2dseUFubm90YXRpb24pO2Z1bmN0aW9uIFNxdWlnZ2x5QW5ub3RhdGlvbih0KXt2YXIgYTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTcXVpZ2dseUFubm90YXRpb24pOyhhPXIuY2FsbCh0aGlzLHQpKS5kYXRhLmFubm90YXRpb25UeXBlPW8uQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk7dmFyIGk9Z2V0UXVhZFBvaW50cyh0LmRpY3QsYS5yZWN0YW5nbGUpO2kmJihhLmRhdGEucXVhZFBvaW50cz1pKTtyZXR1cm4gYX1yZXR1cm4gU3F1aWdnbHlBbm5vdGF0aW9ufSh2KSxVPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhTdHJpa2VPdXRBbm5vdGF0aW9uLHQpO3ZhciByPV9jcmVhdGVTdXBlcihTdHJpa2VPdXRBbm5vdGF0aW9uKTtmdW5jdGlvbiBTdHJpa2VPdXRBbm5vdGF0aW9uKHQpe3ZhciBhO19jbGFzc0NhbGxDaGVjayh0aGlzLFN0cmlrZU91dEFubm90YXRpb24pOyhhPXIuY2FsbCh0aGlzLHQpKS5kYXRhLmFubm90YXRpb25UeXBlPW8uQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUO3ZhciBpPWdldFF1YWRQb2ludHModC5kaWN0LGEucmVjdGFuZ2xlKTtpJiYoYS5kYXRhLnF1YWRQb2ludHM9aSk7cmV0dXJuIGF9cmV0dXJuIFN0cmlrZU91dEFubm90YXRpb259KHYpLGo9ZnVuY3Rpb24odCl7X2luaGVyaXRzKFN0YW1wQW5ub3RhdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoU3RhbXBBbm5vdGF0aW9uKTtmdW5jdGlvbiBTdGFtcEFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsU3RhbXBBbm5vdGF0aW9uKTsoYT1yLmNhbGwodGhpcyx0KSkuZGF0YS5hbm5vdGF0aW9uVHlwZT1vLkFubm90YXRpb25UeXBlLlNUQU1QO3JldHVybiBhfXJldHVybiBTdGFtcEFubm90YXRpb259KHYpLHE9ZnVuY3Rpb24odCl7X2luaGVyaXRzKEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbix0KTt2YXIgcj1fY3JlYXRlU3VwZXIoRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uKTtmdW5jdGlvbiBGaWxlQXR0YWNobWVudEFubm90YXRpb24odCl7dmFyIGE7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uKTthPXIuY2FsbCh0aGlzLHQpO3ZhciBpPW5ldyBjLkZpbGVTcGVjKHQuZGljdC5nZXQoIkZTIiksdC54cmVmKTthLmRhdGEuYW5ub3RhdGlvblR5cGU9by5Bbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDthLmRhdGEuZmlsZT1pLnNlcmlhbGl6YWJsZTtyZXR1cm4gYX1yZXR1cm4gRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9ufSh2KX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5PcGVyYXRvckxpc3Q9dm9pZCAwO3ZhciBpPWEoNSk7ZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCxyKXt2YXIgYTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwoYT1mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1hfHwiU2V0Ij09PWEpcmV0dXJuIEFycmF5LmZyb20odCk7aWYoIkFyZ3VtZW50cyI9PT1hfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChhKSlyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKX0odCkpfHxyJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXthJiYodD1hKTt2YXIgaT0wLG89ZnVuY3Rpb24gRigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uIG4oKXtyZXR1cm4gaT49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbaSsrXX19LGU6ZnVuY3Rpb24gZSh0KXt0aHJvdyB0fSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgYyxsPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24gcygpe2E9dFtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24gbigpe3ZhciB0PWEubmV4dCgpO2w9dC5kb25lO3JldHVybiB0fSxlOmZ1bmN0aW9uIGUodCl7dT0hMDtjPXR9LGY6ZnVuY3Rpb24gZigpe3RyeXtsfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgY319fX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLGk9bmV3IEFycmF5KHIpO2E8cjthKyspaVthXT10W2FdO3JldHVybiBpfXZhciBvPWZ1bmN0aW9uIFF1ZXVlT3B0aW1pemVyQ2xvc3VyZSgpe2Z1bmN0aW9uIGFkZFN0YXRlKHQscixhLGksbyl7Zm9yKHZhciBjPXQsbD0wLHU9ci5sZW5ndGgtMTtsPHU7bCsrKXt2YXIgaD1yW2xdO2M9Y1toXXx8KGNbaF09W10pfWNbcltyLmxlbmd0aC0xXV09e2NoZWNrRm46YSxpdGVyYXRlRm46aSxwcm9jZXNzRm46b319dmFyIHQ9W107YWRkU3RhdGUodCxbaS5PUFMuc2F2ZSxpLk9QUy50cmFuc2Zvcm0saS5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsaS5PUFMucmVzdG9yZV0sbnVsbCwoZnVuY3Rpb24gaXRlcmF0ZUlubGluZUltYWdlR3JvdXAodCxyKXt2YXIgYT10LmZuQXJyYXksbz0oci0odC5pQ3Vyci0zKSklNDtzd2l0Y2gobyl7Y2FzZSAwOnJldHVybiBhW3JdPT09aS5PUFMuc2F2ZTtjYXNlIDE6cmV0dXJuIGFbcl09PT1pLk9QUy50cmFuc2Zvcm07Y2FzZSAyOnJldHVybiBhW3JdPT09aS5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q7Y2FzZSAzOnJldHVybiBhW3JdPT09aS5PUFMucmVzdG9yZX10aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KG8pKX0pLChmdW5jdGlvbiBmb3VuZElubGluZUltYWdlR3JvdXAodCxyKXt2YXIgYT10LmZuQXJyYXksbz10LmFyZ3NBcnJheSxjPXQuaUN1cnIsbD1jLTMsdT1jLTIsaD1jLTEsZD1NYXRoLm1pbihNYXRoLmZsb29yKChyLWwpLzQpLDIwMCk7aWYoZDwxMClyZXR1cm4gci0oci1sKSU0O3ZhciBwLG09MCxnPVtdLHk9MCxiPTEsdj0xO2ZvcihwPTA7cDxkO3ArKyl7dmFyIFM9b1t1KyhwPDwyKV0saz1vW2grKHA8PDIpXVswXTtpZihiK2sud2lkdGg+MWUzKXttPU1hdGgubWF4KG0sYik7dis9eSsyO2I9MDt5PTB9Zy5wdXNoKHt0cmFuc2Zvcm06Uyx4OmIseTp2LHc6ay53aWR0aCxoOmsuaGVpZ2h0fSk7Yis9ay53aWR0aCsyO3k9TWF0aC5tYXgoeSxrLmhlaWdodCl9dmFyIHc9TWF0aC5tYXgobSxiKSsxLEM9dit5KzEsXz1uZXcgVWludDhDbGFtcGVkQXJyYXkodypDKjQpLHg9dzw8Mjtmb3IocD0wO3A8ZDtwKyspe3ZhciBBPW9baCsocDw8MildWzBdLmRhdGEsVD1nW3BdLnc8PDIsUj0wLEk9Z1twXS54K2dbcF0ueSp3PDwyO18uc2V0KEEuc3ViYXJyYXkoMCxUKSxJLXgpO2Zvcih2YXIgUD0wLE89Z1twXS5oO1A8TztQKyspe18uc2V0KEEuc3ViYXJyYXkoUixSK1QpLEkpO1IrPVQ7SSs9eH1fLnNldChBLnN1YmFycmF5KFItVCxSKSxJKTtmb3IoO0k+PTA7KXtBW0ktNF09QVtJXTtBW0ktM109QVtJKzFdO0FbSS0yXT1BW0krMl07QVtJLTFdPUFbSSszXTtBW0krVF09QVtJK1QtNF07QVtJK1QrMV09QVtJK1QtM107QVtJK1QrMl09QVtJK1QtMl07QVtJK1QrM109QVtJK1QtMV07SS09eH19YS5zcGxpY2UobCw0KmQsaS5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cCk7by5zcGxpY2UobCw0KmQsW3t3aWR0aDp3LGhlaWdodDpDLGtpbmQ6aS5JbWFnZUtpbmQuUkdCQV8zMkJQUCxkYXRhOl99LGddKTtyZXR1cm4gbCsxfSkpO2FkZFN0YXRlKHQsW2kuT1BTLnNhdmUsaS5PUFMudHJhbnNmb3JtLGkuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCxpLk9QUy5yZXN0b3JlXSxudWxsLChmdW5jdGlvbiBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAodCxyKXt2YXIgYT10LmZuQXJyYXksbz0oci0odC5pQ3Vyci0zKSklNDtzd2l0Y2gobyl7Y2FzZSAwOnJldHVybiBhW3JdPT09aS5PUFMuc2F2ZTtjYXNlIDE6cmV0dXJuIGFbcl09PT1pLk9QUy50cmFuc2Zvcm07Y2FzZSAyOnJldHVybiBhW3JdPT09aS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0O2Nhc2UgMzpyZXR1cm4gYVtyXT09PWkuT1BTLnJlc3RvcmV9dGhyb3cgbmV3IEVycm9yKCJpdGVyYXRlSW1hZ2VNYXNrR3JvdXAgLSBpbnZhbGlkIHBvczogIi5jb25jYXQobykpfSksKGZ1bmN0aW9uIGZvdW5kSW1hZ2VNYXNrR3JvdXAodCxyKXt2YXIgYSxvPXQuZm5BcnJheSxjPXQuYXJnc0FycmF5LGw9dC5pQ3Vycix1PWwtMyxoPWwtMixkPWwtMSxwPU1hdGguZmxvb3IoKHItdSkvNCk7aWYoKHA9ZnVuY3Rpb24gaGFuZGxlUGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKHQscixhLG8pe2Zvcih2YXIgYz10KzIsbD0wO2w8cjtsKyspe3ZhciB1PW9bYys0KmxdLGg9MT09PXUubGVuZ3RoJiZ1WzBdO2lmKCFofHwxIT09aC53aWR0aHx8MSE9PWguaGVpZ2h0fHxoLmRhdGEubGVuZ3RoJiYoMSE9PWguZGF0YS5sZW5ndGh8fDAhPT1oLmRhdGFbMF0pKWJyZWFrO2FbYys0KmxdPWkuT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFza31yZXR1cm4gci1sfSh1LHAsbyxjKSk8MTApcmV0dXJuIHItKHItdSklNDt2YXIgbSxnLHk9ITEsYj1jW2RdWzBdLHY9Y1toXVswXSxTPWNbaF1bMV0saz1jW2hdWzJdLHc9Y1toXVszXTtpZihTPT09ayl7eT0hMDttPWgrNDt2YXIgQz1kKzQ7Zm9yKGE9MTthPHA7YSsrLG0rPTQsQys9NCl7Zz1jW21dO2lmKGNbQ11bMF0hPT1ifHxnWzBdIT09dnx8Z1sxXSE9PVN8fGdbMl0hPT1rfHxnWzNdIT09dyl7YTwxMD95PSExOnA9YTticmVha319fWlmKHkpe3A9TWF0aC5taW4ocCwxZTMpO3ZhciBfPW5ldyBGbG9hdDMyQXJyYXkoMipwKTttPWg7Zm9yKGE9MDthPHA7YSsrLG0rPTQpe2c9Y1ttXTtfW2E8PDFdPWdbNF07X1sxKyhhPDwxKV09Z1s1XX1vLnNwbGljZSh1LDQqcCxpLk9QUy5wYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQpO2Muc3BsaWNlKHUsNCpwLFtiLHYsUyxrLHcsX10pfWVsc2V7cD1NYXRoLm1pbihwLDEwMCk7dmFyIHg9W107Zm9yKGE9MDthPHA7YSsrKXtnPWNbaCsoYTw8MildO3ZhciBBPWNbZCsoYTw8MildWzBdO3gucHVzaCh7ZGF0YTpBLmRhdGEsd2lkdGg6QS53aWR0aCxoZWlnaHQ6QS5oZWlnaHQsdHJhbnNmb3JtOmd9KX1vLnNwbGljZSh1LDQqcCxpLk9QUy5wYWludEltYWdlTWFza1hPYmplY3RHcm91cCk7Yy5zcGxpY2UodSw0KnAsW3hdKX1yZXR1cm4gdSsxfSkpO2FkZFN0YXRlKHQsW2kuT1BTLnNhdmUsaS5PUFMudHJhbnNmb3JtLGkuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGkuT1BTLnJlc3RvcmVdLChmdW5jdGlvbih0KXt2YXIgcj10LmFyZ3NBcnJheSxhPXQuaUN1cnItMjtyZXR1cm4gMD09PXJbYV1bMV0mJjA9PT1yW2FdWzJdfSksKGZ1bmN0aW9uIGl0ZXJhdGVJbWFnZUdyb3VwKHQscil7dmFyIGE9dC5mbkFycmF5LG89dC5hcmdzQXJyYXksYz0oci0odC5pQ3Vyci0zKSklNDtzd2l0Y2goYyl7Y2FzZSAwOnJldHVybiBhW3JdPT09aS5PUFMuc2F2ZTtjYXNlIDE6aWYoYVtyXSE9PWkuT1BTLnRyYW5zZm9ybSlyZXR1cm4hMTt2YXIgbD10LmlDdXJyLTIsdT1vW2xdWzBdLGg9b1tsXVszXTtyZXR1cm4gb1tyXVswXT09PXUmJjA9PT1vW3JdWzFdJiYwPT09b1tyXVsyXSYmb1tyXVszXT09PWg7Y2FzZSAyOmlmKGFbcl0hPT1pLk9QUy5wYWludEltYWdlWE9iamVjdClyZXR1cm4hMTt2YXIgZD1vW3QuaUN1cnItMV1bMF07cmV0dXJuIG9bcl1bMF09PT1kO2Nhc2UgMzpyZXR1cm4gYVtyXT09PWkuT1BTLnJlc3RvcmV9dGhyb3cgbmV3IEVycm9yKCJpdGVyYXRlSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAiLmNvbmNhdChjKSl9KSwoZnVuY3Rpb24odCxyKXt2YXIgYT10LmZuQXJyYXksbz10LmFyZ3NBcnJheSxjPXQuaUN1cnIsbD1jLTMsdT1jLTIsaD1vW2MtMV1bMF0sZD1vW3VdWzBdLHA9b1t1XVszXSxtPU1hdGgubWluKE1hdGguZmxvb3IoKHItbCkvNCksMWUzKTtpZihtPDMpcmV0dXJuIHItKHItbCklNDtmb3IodmFyIGc9bmV3IEZsb2F0MzJBcnJheSgyKm0pLHk9dSxiPTA7YjxtO2IrKyx5Kz00KXt2YXIgdj1vW3ldO2dbYjw8MV09dls0XTtnWzErKGI8PDEpXT12WzVdfXZhciBTPVtoLGQscCxnXTthLnNwbGljZShsLDQqbSxpLk9QUy5wYWludEltYWdlWE9iamVjdFJlcGVhdCk7by5zcGxpY2UobCw0Km0sUyk7cmV0dXJuIGwrMX0pKTthZGRTdGF0ZSh0LFtpLk9QUy5iZWdpblRleHQsaS5PUFMuc2V0Rm9udCxpLk9QUy5zZXRUZXh0TWF0cml4LGkuT1BTLnNob3dUZXh0LGkuT1BTLmVuZFRleHRdLG51bGwsKGZ1bmN0aW9uIGl0ZXJhdGVTaG93VGV4dEdyb3VwKHQscil7dmFyIGE9dC5mbkFycmF5LG89dC5hcmdzQXJyYXksYz0oci0odC5pQ3Vyci00KSklNTtzd2l0Y2goYyl7Y2FzZSAwOnJldHVybiBhW3JdPT09aS5PUFMuYmVnaW5UZXh0O2Nhc2UgMTpyZXR1cm4gYVtyXT09PWkuT1BTLnNldEZvbnQ7Y2FzZSAyOnJldHVybiBhW3JdPT09aS5PUFMuc2V0VGV4dE1hdHJpeDtjYXNlIDM6aWYoYVtyXSE9PWkuT1BTLnNob3dUZXh0KXJldHVybiExO3ZhciBsPXQuaUN1cnItMyx1PW9bbF1bMF0saD1vW2xdWzFdO3JldHVybiBvW3JdWzBdPT09dSYmb1tyXVsxXT09PWg7Y2FzZSA0OnJldHVybiBhW3JdPT09aS5PUFMuZW5kVGV4dH10aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVTaG93VGV4dEdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KGMpKX0pLChmdW5jdGlvbih0LHIpe3ZhciBhPXQuZm5BcnJheSxpPXQuYXJnc0FycmF5LG89dC5pQ3VycixjPW8tNCxsPW8tMyx1PW8tMixoPW8tMSxkPW8scD1pW2xdWzBdLG09aVtsXVsxXSxnPU1hdGgubWluKE1hdGguZmxvb3IoKHItYykvNSksMWUzKTtpZihnPDMpcmV0dXJuIHItKHItYyklNTt2YXIgeT1jO2lmKGM+PTQmJmFbYy00XT09PWFbbF0mJmFbYy0zXT09PWFbdV0mJmFbYy0yXT09PWFbaF0mJmFbYy0xXT09PWFbZF0mJmlbYy00XVswXT09PXAmJmlbYy00XVsxXT09PW0pe2crKzt5LT01fWZvcih2YXIgYj15KzQsdj0xO3Y8Zzt2Kyspe2Euc3BsaWNlKGIsMyk7aS5zcGxpY2UoYiwzKTtiKz0yfXJldHVybiBiKzF9KSk7ZnVuY3Rpb24gUXVldWVPcHRpbWl6ZXIodCl7dGhpcy5xdWV1ZT10O3RoaXMuc3RhdGU9bnVsbDt0aGlzLmNvbnRleHQ9e2lDdXJyOjAsZm5BcnJheTp0LmZuQXJyYXksYXJnc0FycmF5OnQuYXJnc0FycmF5fTt0aGlzLm1hdGNoPW51bGw7dGhpcy5sYXN0UHJvY2Vzc2VkPTB9UXVldWVPcHRpbWl6ZXIucHJvdG90eXBlPXtfb3B0aW1pemU6ZnVuY3Rpb24gX29wdGltaXplKCl7dmFyIHI9dGhpcy5xdWV1ZS5mbkFycmF5LGE9dGhpcy5sYXN0UHJvY2Vzc2VkLGk9ci5sZW5ndGgsbz10aGlzLnN0YXRlLGM9dGhpcy5tYXRjaDtpZihvfHxjfHxhKzEhPT1pfHx0W3JbYV1dKXtmb3IodmFyIGw9dGhpcy5jb250ZXh0O2E8aTspe2lmKGMpe2lmKCgwLGMuaXRlcmF0ZUZuKShsLGEpKXthKys7Y29udGludWV9YT0oMCxjLnByb2Nlc3NGbikobCxhKzEpO2M9bnVsbDtvPW51bGw7aWYoYT49KGk9ci5sZW5ndGgpKWJyZWFrfWlmKChvPShvfHx0KVtyW2FdXSkmJiFBcnJheS5pc0FycmF5KG8pKXtsLmlDdXJyPWE7YSsrO2lmKCFvLmNoZWNrRm58fCgwLG8uY2hlY2tGbikobCkpe2M9bztvPW51bGx9ZWxzZSBvPW51bGx9ZWxzZSBhKyt9dGhpcy5zdGF0ZT1vO3RoaXMubWF0Y2g9Yzt0aGlzLmxhc3RQcm9jZXNzZWQ9YX1lbHNlIHRoaXMubGFzdFByb2Nlc3NlZD1pfSxwdXNoOmZ1bmN0aW9uIHB1c2godCxyKXt0aGlzLnF1ZXVlLmZuQXJyYXkucHVzaCh0KTt0aGlzLnF1ZXVlLmFyZ3NBcnJheS5wdXNoKHIpO3RoaXMuX29wdGltaXplKCl9LGZsdXNoOmZ1bmN0aW9uIGZsdXNoKCl7Zm9yKDt0aGlzLm1hdGNoOyl7dmFyIHQ9dGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDt0aGlzLmxhc3RQcm9jZXNzZWQ9KDAsdGhpcy5tYXRjaC5wcm9jZXNzRm4pKHRoaXMuY29udGV4dCx0KTt0aGlzLm1hdGNoPW51bGw7dGhpcy5zdGF0ZT1udWxsO3RoaXMuX29wdGltaXplKCl9fSxyZXNldDpmdW5jdGlvbiByZXNldCgpe3RoaXMuc3RhdGU9bnVsbDt0aGlzLm1hdGNoPW51bGw7dGhpcy5sYXN0UHJvY2Vzc2VkPTB9fTtyZXR1cm4gUXVldWVPcHRpbWl6ZXJ9KCksYz1mdW5jdGlvbiBOdWxsT3B0aW1pemVyQ2xvc3VyZSgpe2Z1bmN0aW9uIE51bGxPcHRpbWl6ZXIodCl7dGhpcy5xdWV1ZT10fU51bGxPcHRpbWl6ZXIucHJvdG90eXBlPXtwdXNoOmZ1bmN0aW9uIHB1c2godCxyKXt0aGlzLnF1ZXVlLmZuQXJyYXkucHVzaCh0KTt0aGlzLnF1ZXVlLmFyZ3NBcnJheS5wdXNoKHIpfSxmbHVzaDpmdW5jdGlvbiBmbHVzaCgpe30scmVzZXQ6ZnVuY3Rpb24gcmVzZXQoKXt9fTtyZXR1cm4gTnVsbE9wdGltaXplcn0oKSxsPWZ1bmN0aW9uIE9wZXJhdG9yTGlzdENsb3N1cmUoKXtmdW5jdGlvbiBPcGVyYXRvckxpc3QodCxyKXt0aGlzLl9zdHJlYW1TaW5rPXI7dGhpcy5mbkFycmF5PVtdO3RoaXMuYXJnc0FycmF5PVtdO3RoaXMub3B0aW1pemVyPXImJiJvcGxpc3QiIT09dD9uZXcgbyh0aGlzKTpuZXcgYyh0aGlzKTt0aGlzLmRlcGVuZGVuY2llcz1uZXcgU2V0O3RoaXMuX3RvdGFsTGVuZ3RoPTA7dGhpcy53ZWlnaHQ9MDt0aGlzLl9yZXNvbHZlZD1yP251bGw6UHJvbWlzZS5yZXNvbHZlKCl9T3BlcmF0b3JMaXN0LnByb3RvdHlwZT17Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmFyZ3NBcnJheS5sZW5ndGh9LGdldCByZWFkeSgpe3JldHVybiB0aGlzLl9yZXNvbHZlZHx8dGhpcy5fc3RyZWFtU2luay5yZWFkeX0sZ2V0IHRvdGFsTGVuZ3RoKCl7cmV0dXJuIHRoaXMuX3RvdGFsTGVuZ3RoK3RoaXMubGVuZ3RofSxhZGRPcDpmdW5jdGlvbiBhZGRPcCh0LHIpe3RoaXMub3B0aW1pemVyLnB1c2godCxyKTt0aGlzLndlaWdodCsrO3RoaXMuX3N0cmVhbVNpbmsmJih0aGlzLndlaWdodD49MWUzfHx0aGlzLndlaWdodD49OTk1JiYodD09PWkuT1BTLnJlc3RvcmV8fHQ9PT1pLk9QUy5lbmRUZXh0KSkmJnRoaXMuZmx1c2goKX0sYWRkRGVwZW5kZW5jeTpmdW5jdGlvbiBhZGREZXBlbmRlbmN5KHQpe2lmKCF0aGlzLmRlcGVuZGVuY2llcy5oYXModCkpe3RoaXMuZGVwZW5kZW5jaWVzLmFkZCh0KTt0aGlzLmFkZE9wKGkuT1BTLmRlcGVuZGVuY3ksW3RdKX19LGFkZERlcGVuZGVuY2llczpmdW5jdGlvbiBhZGREZXBlbmRlbmNpZXModCl7dmFyIHIsYT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0KTt0cnl7Zm9yKGEucygpOyEocj1hLm4oKSkuZG9uZTspe3ZhciBpPXIudmFsdWU7dGhpcy5hZGREZXBlbmRlbmN5KGkpfX1jYXRjaCh0KXthLmUodCl9ZmluYWxseXthLmYoKX19LGFkZE9wTGlzdDpmdW5jdGlvbiBhZGRPcExpc3QodCl7aWYodCBpbnN0YW5jZW9mIE9wZXJhdG9yTGlzdCl7dmFyIHIsYT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0LmRlcGVuZGVuY2llcyk7dHJ5e2ZvcihhLnMoKTshKHI9YS5uKCkpLmRvbmU7KXt2YXIgbz1yLnZhbHVlO3RoaXMuZGVwZW5kZW5jaWVzLmFkZChvKX19Y2F0Y2godCl7YS5lKHQpfWZpbmFsbHl7YS5mKCl9Zm9yKHZhciBjPTAsbD10Lmxlbmd0aDtjPGw7YysrKXRoaXMuYWRkT3AodC5mbkFycmF5W2NdLHQuYXJnc0FycmF5W2NdKX1lbHNlKDAsaS53YXJuKSgnYWRkT3BMaXN0IC0gaWdub3JpbmcgaW52YWxpZCAib3BMaXN0IiBwYXJhbWV0ZXIuJyl9LGdldElSOmZ1bmN0aW9uIGdldElSKCl7cmV0dXJue2ZuQXJyYXk6dGhpcy5mbkFycmF5LGFyZ3NBcnJheTp0aGlzLmFyZ3NBcnJheSxsZW5ndGg6dGhpcy5sZW5ndGh9fSxnZXQgX3RyYW5zZmVycygpe2Zvcih2YXIgdD1bXSxyPXRoaXMuZm5BcnJheSxhPXRoaXMuYXJnc0FycmF5LG89dGhpcy5sZW5ndGgsYz0wO2M8bztjKyspc3dpdGNoKHJbY10pe2Nhc2UgaS5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6Y2FzZSBpLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOmNhc2UgaS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OnZhciBsPWFbY11bMF07bC5jYWNoZWR8fHQucHVzaChsLmRhdGEuYnVmZmVyKX1yZXR1cm4gdH0sZmx1c2g6ZnVuY3Rpb24gZmx1c2goKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO3RoaXMub3B0aW1pemVyLmZsdXNoKCk7dmFyIHI9dGhpcy5sZW5ndGg7dGhpcy5fdG90YWxMZW5ndGgrPXI7dGhpcy5fc3RyZWFtU2luay5lbnF1ZXVlKHtmbkFycmF5OnRoaXMuZm5BcnJheSxhcmdzQXJyYXk6dGhpcy5hcmdzQXJyYXksbGFzdENodW5rOnQsbGVuZ3RoOnJ9LDEsdGhpcy5fdHJhbnNmZXJzKTt0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO3RoaXMuZm5BcnJheS5sZW5ndGg9MDt0aGlzLmFyZ3NBcnJheS5sZW5ndGg9MDt0aGlzLndlaWdodD0wO3RoaXMub3B0aW1pemVyLnJlc2V0KCl9fTtyZXR1cm4gT3BlcmF0b3JMaXN0fSgpO3IuT3BlcmF0b3JMaXN0PWx9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3Iud3JpdGVEaWN0PXdyaXRlRGljdDtyLmluY3JlbWVudGFsVXBkYXRlPWZ1bmN0aW9uIGluY3JlbWVudGFsVXBkYXRlKHQscixhKXt2YXIgbCx1LGg9bmV3IG8uRGljdChudWxsKSxkPXIubmV3UmVmLHA9dFt0Lmxlbmd0aC0xXTtpZigxMD09PXB8fDEzPT09cCl7bD1bXTt1PXQubGVuZ3RofWVsc2V7bD1bIlxuIl07dT10Lmxlbmd0aCsxfWguc2V0KCJTaXplIixkLm51bSsxKTtoLnNldCgiUHJldiIsci5zdGFydFhSZWYpO2guc2V0KCJUeXBlIixvLk5hbWUuZ2V0KCJYUmVmIikpO251bGwhPT1yLnJvb3RSZWYmJmguc2V0KCJSb290IixyLnJvb3RSZWYpO251bGwhPT1yLmluZm9SZWYmJmguc2V0KCJJbmZvIixyLmluZm9SZWYpO251bGwhPT1yLmVuY3J5cHQmJmguc2V0KCJFbmNyeXB0IixyLmVuY3J5cHQpO2EucHVzaCh7cmVmOmQsZGF0YToiIn0pO2E9YS5zb3J0KChmdW5jdGlvbih0LHIpe3JldHVybiB0LnJlZi5udW0tci5yZWYubnVtfSkpO3ZhciBtLGc9W1swLDEsNjU1MzVdXSx5PVswLDFdLGI9MCx2PV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGEpO3RyeXtmb3Iodi5zKCk7IShtPXYubigpKS5kb25lOyl7dmFyIFM9bS52YWx1ZSxrPVMucmVmLHc9Uy5kYXRhO2I9TWF0aC5tYXgoYix1KTtnLnB1c2goWzEsdSxNYXRoLm1pbihrLmdlbiw2NTUzNSldKTt1Kz13Lmxlbmd0aDt5LnB1c2goay5udW0pO3kucHVzaCgxKTtsLnB1c2godyl9fWNhdGNoKHQpe3YuZSh0KX1maW5hbGx5e3YuZigpfWguc2V0KCJJbmRleCIseSk7aWYoMCE9PXIuZmlsZUlkcy5sZW5ndGgpe3ZhciBDPWZ1bmN0aW9uIGNvbXB1dGVNRDUodCxyKXtmb3IodmFyIGE9TWF0aC5mbG9vcihEYXRlLm5vdygpLzFlMyksbz1yLmZpbGVuYW1lfHwiIixsPVthLnRvU3RyaW5nKCksbyx0LnRvU3RyaW5nKCldLHU9bC5yZWR1Y2UoKGZ1bmN0aW9uKHQscil7cmV0dXJuIHQrci5sZW5ndGh9KSwwKSxoPTAsZD1PYmplY3QudmFsdWVzKHIuaW5mbyk7aDxkLmxlbmd0aDtoKyspe3ZhciBwPWRbaF07bC5wdXNoKHApO3UrPXAubGVuZ3RofWZvcih2YXIgbT1uZXcgVWludDhBcnJheSh1KSxnPTAseT0wLGI9bDt5PGIubGVuZ3RoO3krKyl7dmFyIHY9Ylt5XTt3cml0ZVN0cmluZyh2LGcsbSk7Zys9di5sZW5ndGh9cmV0dXJuKDAsaS5ieXRlc1RvU3RyaW5nKSgoMCxjLmNhbGN1bGF0ZU1ENSkobSkpfSh1LHIpO2guc2V0KCJJRCIsW3IuZmlsZUlkc1swXSxDXSl9dmFyIF89WzEsTWF0aC5jZWlsKE1hdGgubG9nMihiKS84KSwyXSx4PShfWzBdK19bMV0rX1syXSkqZy5sZW5ndGg7aC5zZXQoIlciLF8pO2guc2V0KCJMZW5ndGgiLHgpO2wucHVzaCgiIi5jb25jYXQoZC5udW0sIiAiKS5jb25jYXQoZC5nZW4sIiBvYmpcbiIpKTt3cml0ZURpY3QoaCxsLG51bGwpO2wucHVzaCgiIHN0cmVhbVxuIik7dmFyIEE9bC5yZWR1Y2UoKGZ1bmN0aW9uKHQscil7cmV0dXJuIHQrci5sZW5ndGh9KSwwKSxUPSJcbmVuZHN0cmVhbVxuZW5kb2JqXG5zdGFydHhyZWZcbiIuY29uY2F0KHUsIlxuJSVFT0ZcbiIpLFI9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgrQSt4K1QubGVuZ3RoKTtSLnNldCh0KTt2YXIgSSxQPXQubGVuZ3RoLE89X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobCk7dHJ5e2ZvcihPLnMoKTshKEk9Ty5uKCkpLmRvbmU7KXt2YXIgRT1JLnZhbHVlO3dyaXRlU3RyaW5nKEUsUCxSKTtQKz1FLmxlbmd0aH19Y2F0Y2godCl7Ty5lKHQpfWZpbmFsbHl7Ty5mKCl9Zm9yKHZhciBCPTAsRD1nO0I8RC5sZW5ndGg7QisrKXt2YXIgTT0oaj1EW0JdLHE9MyxmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXModCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH0oail8fGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdCh0LHIpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpKXJldHVybjt2YXIgYT1bXSxpPSEwLG89ITEsYz12b2lkIDA7dHJ5e2Zvcih2YXIgbCx1PXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEoaT0obD11Lm5leHQoKSkuZG9uZSk7aT0hMCl7YS5wdXNoKGwudmFsdWUpO2lmKHImJmEubGVuZ3RoPT09cilicmVha319Y2F0Y2godCl7bz0hMDtjPXR9ZmluYWxseXt0cnl7aXx8bnVsbD09dS5yZXR1cm58fHUucmV0dXJuKCl9ZmluYWxseXtpZihvKXRocm93IGN9fXJldHVybiBhfShqLHEpfHxfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoaixxKXx8ZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCkpLEw9TVswXSxOPU1bMV0sVT1NWzJdO1A9d3JpdGVJbnQoTCxfWzBdLFAsUik7UD13cml0ZUludChOLF9bMV0sUCxSKTtQPXdyaXRlSW50KFUsX1syXSxQLFIpfXZhciBqLHE7d3JpdGVTdHJpbmcoVCxQLFIpO3JldHVybiBSfTt2YXIgaT1hKDUpLG89YSgyMDIpLGM9YSgyMTkpO2Z1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQscil7dmFyIGE7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KGE9X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQpKXx8ciYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7YSYmKHQ9YSk7dmFyIGk9MCxvPWZ1bmN0aW9uIEYoKXt9O3JldHVybntzOm8sbjpmdW5jdGlvbiBuKCl7cmV0dXJuIGk+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W2krK119fSxlOmZ1bmN0aW9uIGUodCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGMsbD0hMCx1PSExO3JldHVybntzOmZ1bmN0aW9uIHMoKXthPXRbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uIG4oKXt2YXIgdD1hLm5leHQoKTtsPXQuZG9uZTtyZXR1cm4gdH0sZTpmdW5jdGlvbiBlKHQpe3U9ITA7Yz10fSxmOmZ1bmN0aW9uIGYoKXt0cnl7bHx8bnVsbD09YS5yZXR1cm58fGEucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IGN9fX19ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7cmV0dXJuIk1hcCI9PT1hfHwiU2V0Ij09PWE/QXJyYXkuZnJvbSh0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP19hcnJheUxpa2VUb0FycmF5KHQscik6dm9pZCAwfX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLGk9bmV3IEFycmF5KHIpO2E8cjthKyspaVthXT10W2FdO3JldHVybiBpfWZ1bmN0aW9uIHdyaXRlRGljdCh0LHIsYSl7ci5wdXNoKCI8PCIpO3ZhciBpLG89X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodC5nZXRLZXlzKCkpO3RyeXtmb3Ioby5zKCk7IShpPW8ubigpKS5kb25lOyl7dmFyIGM9aS52YWx1ZTtyLnB1c2goIiAvIi5jb25jYXQoYywiICIpKTt3cml0ZVZhbHVlKHQuZ2V0UmF3KGMpLHIsYSl9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfXIucHVzaCgiPj4iKX1mdW5jdGlvbiB3cml0ZVZhbHVlKHQscixhKXtpZigoMCxvLmlzTmFtZSkodCkpci5wdXNoKCIvIi5jb25jYXQodC5uYW1lKSk7ZWxzZSBpZigoMCxvLmlzUmVmKSh0KSlyLnB1c2goIiIuY29uY2F0KHQubnVtLCIgIikuY29uY2F0KHQuZ2VuLCIgUiIpKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpIWZ1bmN0aW9uIHdyaXRlQXJyYXkodCxyLGEpe3IucHVzaCgiWyIpO3ZhciBpLG89ITAsYz1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0KTt0cnl7Zm9yKGMucygpOyEoaT1jLm4oKSkuZG9uZTspe3ZhciBsPWkudmFsdWU7bz9vPSExOnIucHVzaCgiICIpO3dyaXRlVmFsdWUobCxyLGEpfX1jYXRjaCh0KXtjLmUodCl9ZmluYWxseXtjLmYoKX1yLnB1c2goIl0iKX0odCxyLGEpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB0KXtudWxsIT09YSYmKHQ9YS5lbmNyeXB0U3RyaW5nKHQpKTtyLnB1c2goIigiLmNvbmNhdCgoMCxpLmVzY2FwZVN0cmluZykodCksIikiKSl9ZWxzZSJudW1iZXIiPT10eXBlb2YgdD9yLnB1c2goZnVuY3Rpb24gbnVtYmVyVG9TdHJpbmcodCl7aWYoTnVtYmVyLmlzSW50ZWdlcih0KSlyZXR1cm4gdC50b1N0cmluZygpO3ZhciByPU1hdGgucm91bmQoMTAwKnQpO3JldHVybiByJTEwMD09MD8oci8xMDApLnRvU3RyaW5nKCk6ciUxMD09MD90LnRvRml4ZWQoMSk6dC50b0ZpeGVkKDIpfSh0KSk6KDAsby5pc0RpY3QpKHQpP3dyaXRlRGljdCh0LHIsYSk6KDAsby5pc1N0cmVhbSkodCkmJmZ1bmN0aW9uIHdyaXRlU3RyZWFtKHQscixhKXt3cml0ZURpY3QodC5kaWN0LHIsYSk7ci5wdXNoKCIgc3RyZWFtXG4iKTt2YXIgbz0oMCxpLmJ5dGVzVG9TdHJpbmcpKHQuZ2V0Qnl0ZXMoKSk7bnVsbCE9PWEmJihvPWEuZW5jcnlwdFN0cmluZyhvKSk7ci5wdXNoKG8pO3IucHVzaCgiXG5lbmRzdHJlYW1cbiIpfSh0LHIsYSl9ZnVuY3Rpb24gd3JpdGVJbnQodCxyLGEsaSl7Zm9yKHZhciBvPXIrYS0xO28+YS0xO28tLSl7aVtvXT0yNTUmdDt0Pj49OH1yZXR1cm4gYStyfWZ1bmN0aW9uIHdyaXRlU3RyaW5nKHQscixhKXtmb3IodmFyIGk9MCxvPXQubGVuZ3RoO2k8bztpKyspYVtyK2ldPTI1NSZ0LmNoYXJDb2RlQXQoaSl9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBhcnRpYWxFdmFsdWF0b3I9dm9pZCAwO3ZhciBpPWZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShhKDIpKSxvPWEoNSksYz1hKDIyNiksbD1hKDIwMiksdT1hKDIyNyksaD1hKDIzMCksZD1hKDIwNSkscD1hKDIzMyksbT1hKDIzMiksZz1hKDIzNikseT1hKDIzNyksYj1hKDIwOCksdj1hKDIyMSksUz1hKDIzOSksaz1hKDIyMCksdz1hKDIwOSksQz1hKDIzMSksXz1hKDI0MCkseD1hKDI0MSksQT1hKDIyMyksVD1hKDI0Mik7ZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKHQscixhLGksbyxjLGwpe3RyeXt2YXIgdT10W2NdKGwpLGg9dS52YWx1ZX1jYXRjaCh0KXthKHQpO3JldHVybn11LmRvbmU/cihoKTpQcm9taXNlLnJlc29sdmUoaCkudGhlbihpLG8pfWZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsYT1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLG8pe3ZhciBjPXQuYXBwbHkocixhKTtmdW5jdGlvbiBfbmV4dCh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJuZXh0Iix0KX1mdW5jdGlvbiBfdGhyb3codCl7YXN5bmNHZW5lcmF0b3JTdGVwKGMsaSxvLF9uZXh0LF90aHJvdywidGhyb3ciLHQpfV9uZXh0KHZvaWQgMCl9KSl9fWZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQscil7dmFyIGE7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PXRbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheSh0KXx8KGE9ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYoIXQpcmV0dXJuO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxyKTt2YXIgYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7Ik9iamVjdCI9PT1hJiZ0LmNvbnN0cnVjdG9yJiYoYT10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09YXx8IlNldCI9PT1hKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKCJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSkpcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHQscil9KHQpKXx8ciYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7YSYmKHQ9YSk7dmFyIGk9MCxvPWZ1bmN0aW9uIEYoKXt9O3JldHVybntzOm8sbjpmdW5jdGlvbiBuKCl7cmV0dXJuIGk+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W2krK119fSxlOmZ1bmN0aW9uIGUodCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGMsbD0hMCx1PSExO3JldHVybntzOmZ1bmN0aW9uIHMoKXthPXRbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uIG4oKXt2YXIgdD1hLm5leHQoKTtsPXQuZG9uZTtyZXR1cm4gdH0sZTpmdW5jdGlvbiBlKHQpe3U9ITA7Yz10fSxmOmZ1bmN0aW9uIGYoKXt0cnl7bHx8bnVsbD09YS5yZXR1cm58fGEucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IGN9fX19ZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkodCxyKXsobnVsbD09cnx8cj50Lmxlbmd0aCkmJihyPXQubGVuZ3RoKTtmb3IodmFyIGE9MCxpPW5ldyBBcnJheShyKTthPHI7YSsrKWlbYV09dFthXTtyZXR1cm4gaX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgUj1PYmplY3QuZnJlZXplKHttYXhJbWFnZVNpemU6LTEsZGlzYWJsZUZvbnRGYWNlOiExLGlnbm9yZUVycm9yczohMSxpc0V2YWxTdXBwb3J0ZWQ6ITAsZm9udEV4dHJhUHJvcGVydGllczohMX0pLEk9MSxQPTIsTz1Qcm9taXNlLnJlc29sdmUoKTtmdW5jdGlvbiBub3JtYWxpemVCbGVuZE1vZGUodCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIGE9MCxpPXQubGVuZ3RoO2E8aTthKyspe3ZhciBjPW5vcm1hbGl6ZUJsZW5kTW9kZSh0W2FdLCEwKTtpZihjKXJldHVybiBjfSgwLG8ud2FybikoIlVuc3VwcG9ydGVkIGJsZW5kIG1vZGUgQXJyYXk6ICIuY29uY2F0KHQpKTtyZXR1cm4ic291cmNlLW92ZXIifWlmKCEoMCxsLmlzTmFtZSkodCkpcmV0dXJuIHI/bnVsbDoic291cmNlLW92ZXIiO3N3aXRjaCh0Lm5hbWUpe2Nhc2UiTm9ybWFsIjpjYXNlIkNvbXBhdGlibGUiOnJldHVybiJzb3VyY2Utb3ZlciI7Y2FzZSJNdWx0aXBseSI6cmV0dXJuIm11bHRpcGx5IjtjYXNlIlNjcmVlbiI6cmV0dXJuInNjcmVlbiI7Y2FzZSJPdmVybGF5IjpyZXR1cm4ib3ZlcmxheSI7Y2FzZSJEYXJrZW4iOnJldHVybiJkYXJrZW4iO2Nhc2UiTGlnaHRlbiI6cmV0dXJuImxpZ2h0ZW4iO2Nhc2UiQ29sb3JEb2RnZSI6cmV0dXJuImNvbG9yLWRvZGdlIjtjYXNlIkNvbG9yQnVybiI6cmV0dXJuImNvbG9yLWJ1cm4iO2Nhc2UiSGFyZExpZ2h0IjpyZXR1cm4iaGFyZC1saWdodCI7Y2FzZSJTb2Z0TGlnaHQiOnJldHVybiJzb2Z0LWxpZ2h0IjtjYXNlIkRpZmZlcmVuY2UiOnJldHVybiJkaWZmZXJlbmNlIjtjYXNlIkV4Y2x1c2lvbiI6cmV0dXJuImV4Y2x1c2lvbiI7Y2FzZSJIdWUiOnJldHVybiJodWUiO2Nhc2UiU2F0dXJhdGlvbiI6cmV0dXJuInNhdHVyYXRpb24iO2Nhc2UiQ29sb3IiOnJldHVybiJjb2xvciI7Y2FzZSJMdW1pbm9zaXR5IjpyZXR1cm4ibHVtaW5vc2l0eSJ9aWYocilyZXR1cm4gbnVsbDsoMCxvLndhcm4pKCJVbnN1cHBvcnRlZCBibGVuZCBtb2RlOiAiLmNvbmNhdCh0Lm5hbWUpKTtyZXR1cm4ic291cmNlLW92ZXIifXZhciBFPWZ1bmN0aW9uKCl7X2NyZWF0ZUNsYXNzKFRpbWVTbG90TWFuYWdlcixudWxsLFt7a2V5OiJUSU1FX1NMT1RfRFVSQVRJT05fTVMiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4oMCxvLnNoYWRvdykodGhpcywiVElNRV9TTE9UX0RVUkFUSU9OX01TIiwyMCl9fSx7a2V5OiJDSEVDS19USU1FX0VWRVJZIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsIkNIRUNLX1RJTUVfRVZFUlkiLDEwMCl9fV0pO2Z1bmN0aW9uIFRpbWVTbG90TWFuYWdlcigpe19jbGFzc0NhbGxDaGVjayh0aGlzLFRpbWVTbG90TWFuYWdlcik7dGhpcy5yZXNldCgpfV9jcmVhdGVDbGFzcyhUaW1lU2xvdE1hbmFnZXIsW3trZXk6ImNoZWNrIix2YWx1ZTpmdW5jdGlvbiBjaGVjaygpe2lmKCsrdGhpcy5jaGVja2VkPFRpbWVTbG90TWFuYWdlci5DSEVDS19USU1FX0VWRVJZKXJldHVybiExO3RoaXMuY2hlY2tlZD0wO3JldHVybiB0aGlzLmVuZFRpbWU8PURhdGUubm93KCl9fSx7a2V5OiJyZXNldCIsdmFsdWU6ZnVuY3Rpb24gcmVzZXQoKXt0aGlzLmVuZFRpbWU9RGF0ZS5ub3coKStUaW1lU2xvdE1hbmFnZXIuVElNRV9TTE9UX0RVUkFUSU9OX01TO3RoaXMuY2hlY2tlZD0wfX1dKTtyZXR1cm4gVGltZVNsb3RNYW5hZ2VyfSgpLEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQYXJ0aWFsRXZhbHVhdG9yKHQpe3ZhciByPXQueHJlZixhPXQuaGFuZGxlcixpPXQucGFnZUluZGV4LG89dC5pZEZhY3RvcnksYz10LmZvbnRDYWNoZSxsPXQuYnVpbHRJbkNNYXBDYWNoZSx1PXQuZ2xvYmFsSW1hZ2VDYWNoZSxoPXQub3B0aW9ucyxkPXZvaWQgMD09PWg/bnVsbDpoO19jbGFzc0NhbGxDaGVjayh0aGlzLFBhcnRpYWxFdmFsdWF0b3IpO3RoaXMueHJlZj1yO3RoaXMuaGFuZGxlcj1hO3RoaXMucGFnZUluZGV4PWk7dGhpcy5pZEZhY3Rvcnk9bzt0aGlzLmZvbnRDYWNoZT1jO3RoaXMuYnVpbHRJbkNNYXBDYWNoZT1sO3RoaXMuZ2xvYmFsSW1hZ2VDYWNoZT11O3RoaXMub3B0aW9ucz1kfHxSO3RoaXMucGFyc2luZ1R5cGUzRm9udD0hMTt0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQ9dGhpcy5mZXRjaEJ1aWx0SW5DTWFwLmJpbmQodGhpcyl9X2NyZWF0ZUNsYXNzKFBhcnRpYWxFdmFsdWF0b3IsW3trZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbiBjbG9uZSgpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpSLHI9T2JqZWN0LmNyZWF0ZSh0aGlzKTtyLm9wdGlvbnM9dDtyZXR1cm4gcn19LHtrZXk6Imhhc0JsZW5kTW9kZXMiLHZhbHVlOmZ1bmN0aW9uIGhhc0JsZW5kTW9kZXModCl7aWYoISh0IGluc3RhbmNlb2YgbC5EaWN0KSlyZXR1cm4hMTt2YXIgcj1uZXcgbC5SZWZTZXQ7dC5vYmpJZCYmci5wdXQodC5vYmpJZCk7Zm9yKHZhciBhPVt0XSxpPXRoaXMueHJlZjthLmxlbmd0aDspe3ZhciBjPWEuc2hpZnQoKSx1PWMuZ2V0KCJFeHRHU3RhdGUiKTtpZih1IGluc3RhbmNlb2YgbC5EaWN0KXt2YXIgaCxwPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHUuZ2V0UmF3VmFsdWVzKCkpO3RyeXtmb3IocC5zKCk7IShoPXAubigpKS5kb25lOyl7dmFyIG09aC52YWx1ZTtpZihtIGluc3RhbmNlb2YgbC5SZWYpe2lmKHIuaGFzKG0pKWNvbnRpbnVlO3RyeXttPWkuZmV0Y2gobSl9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIGQuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgdDtyLnB1dChtKTsoMCxvLmluZm8pKCdoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJy5jb25jYXQodCwnIi4nKSk7Y29udGludWV9fWlmKG0gaW5zdGFuY2VvZiBsLkRpY3Qpe20ub2JqSWQmJnIucHV0KG0ub2JqSWQpO3ZhciBnPW0uZ2V0KCJCTSIpO2lmKGcgaW5zdGFuY2VvZiBsLk5hbWUpe2lmKCJOb3JtYWwiIT09Zy5uYW1lKXJldHVybiEwfWVsc2UgaWYodm9pZCAwIT09ZyYmQXJyYXkuaXNBcnJheShnKSl7dmFyIHksYj1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihnKTt0cnl7Zm9yKGIucygpOyEoeT1iLm4oKSkuZG9uZTspe3ZhciB2PXkudmFsdWU7aWYodiBpbnN0YW5jZW9mIGwuTmFtZSYmIk5vcm1hbCIhPT12Lm5hbWUpcmV0dXJuITB9fWNhdGNoKHQpe2IuZSh0KX1maW5hbGx5e2IuZigpfX19fX1jYXRjaCh0KXtwLmUodCl9ZmluYWxseXtwLmYoKX19dmFyIFM9Yy5nZXQoIlhPYmplY3QiKTtpZihTIGluc3RhbmNlb2YgbC5EaWN0KXt2YXIgayx3PV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKFMuZ2V0UmF3VmFsdWVzKCkpO3RyeXtmb3Iody5zKCk7IShrPXcubigpKS5kb25lOyl7dmFyIEM9ay52YWx1ZTtpZihDIGluc3RhbmNlb2YgbC5SZWYpe2lmKHIuaGFzKEMpKWNvbnRpbnVlO3RyeXtDPWkuZmV0Y2goQyl9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIGQuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgdDtyLnB1dChDKTsoMCxvLmluZm8pKCdoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgWE9iamVjdDogIicuY29uY2F0KHQsJyIuJykpO2NvbnRpbnVlfX1pZigoMCxsLmlzU3RyZWFtKShDKSl7Qy5kaWN0Lm9iaklkJiZyLnB1dChDLmRpY3Qub2JqSWQpO3ZhciBfPUMuZGljdC5nZXQoIlJlc291cmNlcyIpO2lmKF8gaW5zdGFuY2VvZiBsLkRpY3QmJighXy5vYmpJZHx8IXIuaGFzKF8ub2JqSWQpKSl7YS5wdXNoKF8pO18ub2JqSWQmJnIucHV0KF8ub2JqSWQpfX19fWNhdGNoKHQpe3cuZSh0KX1maW5hbGx5e3cuZigpfX19cmV0dXJuITF9fSx7a2V5OiJmZXRjaEJ1aWx0SW5DTWFwIix2YWx1ZTooaj1fYXN5bmNUb0dlbmVyYXRvcihpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSh0KXt2YXIgcixhLGMsbDtyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUkKGkpe2Zvcig7Oylzd2l0Y2goaS5wcmV2PWkubmV4dCl7Y2FzZSAwOmlmKCEocj10aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuZ2V0KHQpKSl7aS5uZXh0PTM7YnJlYWt9cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHIpO2Nhc2UgMzphPXRoaXMuaGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiRmV0Y2hCdWlsdEluQ01hcCIse25hbWU6dH0pO2M9YS5nZXRSZWFkZXIoKTtpLm5leHQ9NztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQscil7IWZ1bmN0aW9uIHB1bXAoKXtjLnJlYWQoKS50aGVuKChmdW5jdGlvbihyKXt2YXIgYT1yLnZhbHVlO2lmKCFyLmRvbmUpe3QoYSk7cHVtcCgpfX0pLHIpfSgpfSkpO2Nhc2UgNzoobD1pLnNlbnQpLmNvbXByZXNzaW9uVHlwZSE9PW8uQ01hcENvbXByZXNzaW9uVHlwZS5OT05FJiZ0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuc2V0KHQsbCk7cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLGwpO2Nhc2UgMTA6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19KSxfY2FsbGVlLHRoaXMpfSkpKSxmdW5jdGlvbiBmZXRjaEJ1aWx0SW5DTWFwKHQpe3JldHVybiBqLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJidWlsZEZvcm1YT2JqZWN0Iix2YWx1ZTooQj1fYXN5bmNUb0dlbmVyYXRvcihpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZTIodCxyLGEsYyx1LGgsZCl7dmFyIHAsbSxnLHksYix2LFMsdyxDLF87cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMiQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6cD1yLmRpY3Q7bT1wLmdldEFycmF5KCJNYXRyaXgiKTtnPXAuZ2V0QXJyYXkoIkJCb3giKTtnPUFycmF5LmlzQXJyYXkoZykmJjQ9PT1nLmxlbmd0aD9vLlV0aWwubm9ybWFsaXplUmVjdChnKTpudWxsO3k9bnVsbDtpZighcC5oYXMoIk9DIikpe2kubmV4dD0xMDticmVha31pLm5leHQ9ODtyZXR1cm4gdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhwLmdldCgiT0MiKSx0KTtjYXNlIDg6eT1pLnNlbnQ7Yy5hZGRPcChvLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyxbIk9DIix5XSk7Y2FzZSAxMDppZighKGI9cC5nZXQoIkdyb3VwIikpKXtpLm5leHQ9MzA7YnJlYWt9dj17bWF0cml4Om0sYmJveDpnLHNtYXNrOmEsaXNvbGF0ZWQ6ITEsa25vY2tvdXQ6ITF9O1M9Yi5nZXQoIlMiKTt3PW51bGw7aWYoISgwLGwuaXNOYW1lKShTLCJUcmFuc3BhcmVuY3kiKSl7aS5uZXh0PTI4O2JyZWFrfXYuaXNvbGF0ZWQ9Yi5nZXQoIkkiKXx8ITE7di5rbm9ja291dD1iLmdldCgiSyIpfHwhMTtpZighYi5oYXMoIkNTIikpe2kubmV4dD0yODticmVha31DPWIuZ2V0UmF3KCJDUyIpO2lmKCEoXz1rLkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKEMsdGhpcy54cmVmLGQpKSl7aS5uZXh0PTI1O2JyZWFrfXc9XztpLm5leHQ9Mjg7YnJlYWs7Y2FzZSAyNTppLm5leHQ9Mjc7cmV0dXJuIHRoaXMucGFyc2VDb2xvclNwYWNlKHtjczpDLHJlc291cmNlczp0LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmR9KTtjYXNlIDI3Onc9aS5zZW50O2Nhc2UgMjg6aWYoYSYmYS5iYWNrZHJvcCl7dz13fHxrLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7YS5iYWNrZHJvcD13LmdldFJnYihhLmJhY2tkcm9wLDApfWMuYWRkT3Aoby5PUFMuYmVnaW5Hcm91cCxbdl0pO2Nhc2UgMzA6Yy5hZGRPcChvLk9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW4sW20sZ10pO3JldHVybiBpLmFicnVwdCgicmV0dXJuIix0aGlzLmdldE9wZXJhdG9yTGlzdCh7c3RyZWFtOnIsdGFzazp1LHJlc291cmNlczpwLmdldCgiUmVzb3VyY2VzIil8fHQsb3BlcmF0b3JMaXN0OmMsaW5pdGlhbFN0YXRlOmh9KS50aGVuKChmdW5jdGlvbigpe2MuYWRkT3Aoby5PUFMucGFpbnRGb3JtWE9iamVjdEVuZCxbXSk7YiYmYy5hZGRPcChvLk9QUy5lbmRHcm91cCxbdl0pO3kmJmMuYWRkT3Aoby5PUFMuZW5kTWFya2VkQ29udGVudCxbXSl9KSkpO2Nhc2UgMzI6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19KSxfY2FsbGVlMix0aGlzKX0pKSksZnVuY3Rpb24gYnVpbGRGb3JtWE9iamVjdCh0LHIsYSxpLG8sYyxsKXtyZXR1cm4gQi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiX3NlbmRJbWdEYXRhIix2YWx1ZTpmdW5jdGlvbiBfc2VuZEltZ0RhdGEodCxyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLGk9cj9bci5kYXRhLmJ1ZmZlcl06bnVsbDtyZXR1cm4gdGhpcy5wYXJzaW5nVHlwZTNGb250fHxhP3RoaXMuaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLFt0LCJJbWFnZSIscl0saSk6dGhpcy5oYW5kbGVyLnNlbmQoIm9iaiIsW3QsdGhpcy5wYWdlSW5kZXgsIkltYWdlIixyXSxpKX19LHtrZXk6ImJ1aWxkUGFpbnRJbWFnZVhPYmplY3QiLHZhbHVlOihiPV9hc3luY1RvR2VuZXJhdG9yKGkuZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlMyh0KXt2YXIgcixhLGMsbCx1LGgsZCxwLG0sZyx5LGIsdixTLGssQyxfLHgsQSxSLEksUCxPLEUsQixEPXRoaXM7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMyQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6cj10LnJlc291cmNlcyxhPXQuaW1hZ2UsYz10LmlzSW5saW5lLGw9dm9pZCAwIT09YyYmYyx1PXQub3BlcmF0b3JMaXN0LGg9dC5jYWNoZUtleSxkPXQubG9jYWxJbWFnZUNhY2hlLHA9dC5sb2NhbENvbG9yU3BhY2VDYWNoZTttPWEuZGljdDtnPW0ub2JqSWQ7eT1tLmdldCgiV2lkdGgiLCJXIik7Yj1tLmdldCgiSGVpZ2h0IiwiSCIpO2lmKHkmJigwLG8uaXNOdW0pKHkpJiZiJiYoMCxvLmlzTnVtKShiKSl7aS5uZXh0PTg7YnJlYWt9KDAsby53YXJuKSgiSW1hZ2UgZGltZW5zaW9ucyBhcmUgbWlzc2luZywgb3Igbm90IG51bWJlcnMuIik7cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHZvaWQgMCk7Y2FzZSA4OmlmKCEoLTEhPT0odj10aGlzLm9wdGlvbnMubWF4SW1hZ2VTaXplKSYmeSpiPnYpKXtpLm5leHQ9MTI7YnJlYWt9KDAsby53YXJuKSgiSW1hZ2UgZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIHNpemUgYW5kIHdhcyByZW1vdmVkLiIpO3JldHVybiBpLmFicnVwdCgicmV0dXJuIix2b2lkIDApO2Nhc2UgMTI6aWYoIW0uZ2V0KCJJbWFnZU1hc2siLCJJTSIpKXtpLm5leHQ9MjU7YnJlYWt9Qz1tLmdldCgiV2lkdGgiLCJXIik7Xz1tLmdldCgiSGVpZ2h0IiwiSCIpO3g9Qys3Pj4zO0E9YS5nZXRCeXRlcyh4Kl8sITApO1I9bS5nZXRBcnJheSgiRGVjb2RlIiwiRCIpOyhTPVQuUERGSW1hZ2UuY3JlYXRlTWFzayh7aW1nQXJyYXk6QSx3aWR0aDpDLGhlaWdodDpfLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOmEgaW5zdGFuY2VvZiB3LkRlY29kZVN0cmVhbSxpbnZlcnNlRGVjb2RlOiEhUiYmUlswXT4wfSkpLmNhY2hlZD0hIWg7az1bU107dS5hZGRPcChvLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Qsayk7aCYmZC5zZXQoaCxnLHtmbjpvLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsYXJnczprfSk7cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHZvaWQgMCk7Y2FzZSAyNTpJPW0uZ2V0KCJTTWFzayIsIlNNIil8fCExO1A9bS5nZXQoIk1hc2siKXx8ITE7aWYoIWx8fEl8fFB8fCEoeStiPDIwMCkpe2kubmV4dD0zMzticmVha31PPW5ldyBULlBERkltYWdlKHt4cmVmOnRoaXMueHJlZixyZXM6cixpbWFnZTphLGlzSW5saW5lOmwscGRmRnVuY3Rpb25GYWN0b3J5OnRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxsb2NhbENvbG9yU3BhY2VDYWNoZTpwfSk7Uz1PLmNyZWF0ZUltYWdlRGF0YSghMCk7dS5hZGRPcChvLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdCxbU10pO3JldHVybiBpLmFicnVwdCgicmV0dXJuIix2b2lkIDApO2Nhc2UgMzM6RT0iaW1nXyIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCkpLEI9ITE7dGhpcy5wYXJzaW5nVHlwZTNGb250P0U9IiIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmdldERvY0lkKCksIl90eXBlM18iKS5jb25jYXQoRSk6ZyYmKEI9dGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNob3VsZENhY2hlKGcsdGhpcy5wYWdlSW5kZXgpKSYmKEU9IiIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmdldERvY0lkKCksIl8iKS5jb25jYXQoRSkpO3UuYWRkRGVwZW5kZW5jeShFKTtrPVtFLHksYl07VC5QREZJbWFnZS5idWlsZEltYWdlKHt4cmVmOnRoaXMueHJlZixyZXM6cixpbWFnZTphLGlzSW5saW5lOmwscGRmRnVuY3Rpb25GYWN0b3J5OnRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxsb2NhbENvbG9yU3BhY2VDYWNoZTpwfSkudGhlbigoZnVuY3Rpb24odCl7Uz10LmNyZWF0ZUltYWdlRGF0YSghMSk7cmV0dXJuIEQuX3NlbmRJbWdEYXRhKEUsUyxCKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7KDAsby53YXJuKSgnVW5hYmxlIHRvIGRlY29kZSBpbWFnZSAiJy5jb25jYXQoRSwnIjogIicpLmNvbmNhdCh0LCciLicpKTtyZXR1cm4gRC5fc2VuZEltZ0RhdGEoRSxudWxsLEIpfSkpO3UuYWRkT3Aoby5PUFMucGFpbnRJbWFnZVhPYmplY3Qsayk7aWYoaCl7ZC5zZXQoaCxnLHtmbjpvLk9QUy5wYWludEltYWdlWE9iamVjdCxhcmdzOmt9KTtpZihnKXsoMCxvLmFzc2VydCkoIWwsIkNhbm5vdCBjYWNoZSBhbiBpbmxpbmUgaW1hZ2UgZ2xvYmFsbHkuIik7dGhpcy5nbG9iYWxJbWFnZUNhY2hlLmFkZFBhZ2VJbmRleChnLHRoaXMucGFnZUluZGV4KTtCJiZ0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShnLHtvYmpJZDpFLGZuOm8uT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGFyZ3M6a30pfX1yZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsdm9pZCAwKTtjYXNlIDQxOmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZTMsdGhpcyl9KSkpLGZ1bmN0aW9uIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3QodCl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6ImhhbmRsZVNNYXNrIix2YWx1ZTpmdW5jdGlvbiBoYW5kbGVTTWFzayh0LHIsYSxpLG8sYyl7dmFyIGw9dC5nZXQoIkciKSx1PXtzdWJ0eXBlOnQuZ2V0KCJTIikubmFtZSxiYWNrZHJvcDp0LmdldCgiQkMiKX0saD10LmdldCgiVFIiKTtpZigoMCx5LmlzUERGRnVuY3Rpb24pKGgpKXtmb3IodmFyIGQ9dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZShoKSxwPW5ldyBVaW50OEFycmF5KDI1NiksbT1uZXcgRmxvYXQzMkFycmF5KDEpLGc9MDtnPDI1NjtnKyspe21bMF09Zy8yNTU7ZChtLDAsbSwwKTtwW2ddPTI1NSptWzBdfDB9dS50cmFuc2Zlck1hcD1wfXJldHVybiB0aGlzLmJ1aWxkRm9ybVhPYmplY3QocixsLHUsYSxpLG8uc3RhdGUuY2xvbmUoKSxjKX19LHtrZXk6ImhhbmRsZVRyYW5zZmVyRnVuY3Rpb24iLHZhbHVlOmZ1bmN0aW9uIGhhbmRsZVRyYW5zZmVyRnVuY3Rpb24odCl7dmFyIHI7aWYoQXJyYXkuaXNBcnJheSh0KSlyPXQ7ZWxzZXtpZighKDAseS5pc1BERkZ1bmN0aW9uKSh0KSlyZXR1cm4gbnVsbDtyPVt0XX12YXIgYSxpPVtdLG89MCxjPTAsdT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyKTt0cnl7Zm9yKHUucygpOyEoYT11Lm4oKSkuZG9uZTspe3ZhciBoPWEudmFsdWUsZD10aGlzLnhyZWYuZmV0Y2hJZlJlZihoKTtvKys7aWYoKDAsbC5pc05hbWUpKGQsIklkZW50aXR5IikpaS5wdXNoKG51bGwpO2Vsc2V7aWYoISgwLHkuaXNQREZGdW5jdGlvbikoZCkpcmV0dXJuIG51bGw7Zm9yKHZhciBwPXRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUoZCksbT1uZXcgVWludDhBcnJheSgyNTYpLGc9bmV3IEZsb2F0MzJBcnJheSgxKSxiPTA7YjwyNTY7YisrKXtnWzBdPWIvMjU1O3AoZywwLGcsMCk7bVtiXT0yNTUqZ1swXXwwfWkucHVzaChtKTtjKyt9fX1jYXRjaCh0KXt1LmUodCl9ZmluYWxseXt1LmYoKX1yZXR1cm4gMSE9PW8mJjQhPT1vfHwwPT09Yz9udWxsOml9fSx7a2V5OiJoYW5kbGVUaWxpbmdUeXBlIix2YWx1ZTpmdW5jdGlvbiBoYW5kbGVUaWxpbmdUeXBlKHQscixhLGksYyx1LGgpe3ZhciBkPXRoaXMscD1uZXcgQS5PcGVyYXRvckxpc3QsbT1sLkRpY3QubWVyZ2Uoe3hyZWY6dGhpcy54cmVmLGRpY3RBcnJheTpbYy5nZXQoIlJlc291cmNlcyIpLGFdfSk7cmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06aSx0YXNrOmgscmVzb3VyY2VzOm0sb3BlcmF0b3JMaXN0OnB9KS50aGVuKChmdW5jdGlvbigpe3JldHVybigwLGcuZ2V0VGlsaW5nUGF0dGVybklSKSh7Zm5BcnJheTpwLmZuQXJyYXksYXJnc0FycmF5OnAuYXJnc0FycmF5fSxjLHIpfSkpLnRoZW4oKGZ1bmN0aW9uKHIpe3UuYWRkRGVwZW5kZW5jaWVzKHAuZGVwZW5kZW5jaWVzKTt1LmFkZE9wKHQscil9KSwoZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2Ygby5BYm9ydEV4Y2VwdGlvbikpe2lmKCFkLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IHQ7ZC5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIse2ZlYXR1cmVJZDpvLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yVGlsaW5nUGF0dGVybn0pOygwLG8ud2FybikoJ2hhbmRsZVRpbGluZ1R5cGUgLSBpZ25vcmluZyBwYXR0ZXJuOiAiJy5jb25jYXQodCwnIi4nKSl9fSkpfX0se2tleToiaGFuZGxlU2V0Rm9udCIsdmFsdWU6ZnVuY3Rpb24gaGFuZGxlU2V0Rm9udCh0LHIsYSxpLGMsbCl7dmFyIGgsZD10aGlzLHA9MDtpZihyKXtyPXIuc2xpY2UoKTtoPXJbMF0ubmFtZTtwPXJbMV19cmV0dXJuIHRoaXMubG9hZEZvbnQoaCxhLHQpLnRoZW4oKGZ1bmN0aW9uKHIpe3JldHVybiByLmZvbnQuaXNUeXBlM0ZvbnQ/ci5sb2FkVHlwZTNEYXRhKGQsdCxjKS50aGVuKChmdW5jdGlvbigpe2kuYWRkRGVwZW5kZW5jaWVzKHIudHlwZTNEZXBlbmRlbmNpZXMpO3JldHVybiByfSkpLmNhdGNoKChmdW5jdGlvbih0KXtkLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOm8uVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250TG9hZFR5cGUzfSk7cmV0dXJuIG5ldyBEKHtsb2FkZWROYW1lOiJnX2ZvbnRfZXJyb3IiLGZvbnQ6bmV3IHUuRXJyb3JGb250KCJUeXBlMyBmb250IGxvYWQgZXJyb3I6ICIuY29uY2F0KHQpKSxkaWN0OnIuZm9udCxleHRyYVByb3BlcnRpZXM6ZC5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXN9KX0pKTpyfSkpLnRoZW4oKGZ1bmN0aW9uKHQpe2wuZm9udD10LmZvbnQ7bC5mb250U2l6ZT1wO2wuZm9udE5hbWU9aDt0LnNlbmQoZC5oYW5kbGVyKTtyZXR1cm4gdC5sb2FkZWROYW1lfSkpfX0se2tleToiaGFuZGxlVGV4dCIsdmFsdWU6ZnVuY3Rpb24gaGFuZGxlVGV4dCh0LHIpe3ZhciBhPXIuZm9udCxpPWEuY2hhcnNUb0dseXBocyh0KTtpZihhLmRhdGEpeyghIShyLnRleHRSZW5kZXJpbmdNb2RlJm8uVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBRyl8fCJQYXR0ZXJuIj09PXIuZmlsbENvbG9yU3BhY2UubmFtZXx8YS5kaXNhYmxlRm9udEZhY2V8fHRoaXMub3B0aW9ucy5kaXNhYmxlRm9udEZhY2UpJiZQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKGEsaSx0aGlzLmhhbmRsZXIpfXJldHVybiBpfX0se2tleToiZW5zdXJlU3RhdGVGb250Iix2YWx1ZTpmdW5jdGlvbiBlbnN1cmVTdGF0ZUZvbnQodCl7aWYoIXQuZm9udCl7dmFyIHI9bmV3IG8uRm9ybWF0RXJyb3IoIk1pc3Npbmcgc2V0Rm9udCAoVGYpIG9wZXJhdG9yIGJlZm9yZSB0ZXh0IHJlbmRlcmluZyBvcGVyYXRvci4iKTtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyByO3RoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHtmZWF0dXJlSWQ6by5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRTdGF0ZX0pOygwLG8ud2FybikoJ2Vuc3VyZVN0YXRlRm9udDogIicuY29uY2F0KHIsJyIuJykpfX19LHtrZXk6InNldEdTdGF0ZSIsdmFsdWU6KGE9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWU0KHQpe3ZhciByLGEsYyx1LGgsZCxwLG0sZyx5LGIsdixTLGssdyxDLF89dGhpcztyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWU0JChpKXtmb3IoOzspc3dpdGNoKGkucHJldj1pLm5leHQpe2Nhc2UgMDpyPXQucmVzb3VyY2VzLGE9dC5nU3RhdGUsYz10Lm9wZXJhdG9yTGlzdCx1PXQuY2FjaGVLZXksaD10LnRhc2ssZD10LnN0YXRlTWFuYWdlcixwPXQubG9jYWxHU3RhdGVDYWNoZSxtPXQubG9jYWxDb2xvclNwYWNlQ2FjaGU7Zz1hLm9iaklkO3k9ITA7Yj1bXTt2PWEuZ2V0S2V5cygpO1M9UHJvbWlzZS5yZXNvbHZlKCk7az1mdW5jdGlvbiBfbG9vcCgpe3ZhciB0PXZbd10saT1hLmdldCh0KTtzd2l0Y2godCl7Y2FzZSJUeXBlIjpicmVhaztjYXNlIkxXIjpjYXNlIkxDIjpjYXNlIkxKIjpjYXNlIk1MIjpjYXNlIkQiOmNhc2UiUkkiOmNhc2UiRkwiOmNhc2UiQ0EiOmNhc2UiY2EiOmIucHVzaChbdCxpXSk7YnJlYWs7Y2FzZSJGb250Ijp5PSExO1M9Uy50aGVuKChmdW5jdGlvbigpe3JldHVybiBfLmhhbmRsZVNldEZvbnQocixudWxsLGlbMF0sYyxoLGQuc3RhdGUpLnRoZW4oKGZ1bmN0aW9uKHIpe2MuYWRkRGVwZW5kZW5jeShyKTtiLnB1c2goW3QsW3IsaVsxXV1dKX0pKX0pKTticmVhaztjYXNlIkJNIjpiLnB1c2goW3Qsbm9ybWFsaXplQmxlbmRNb2RlKGkpXSk7YnJlYWs7Y2FzZSJTTWFzayI6aWYoKDAsbC5pc05hbWUpKGksIk5vbmUiKSl7Yi5wdXNoKFt0LCExXSk7YnJlYWt9aWYoKDAsbC5pc0RpY3QpKGkpKXt5PSExO1M9Uy50aGVuKChmdW5jdGlvbigpe3JldHVybiBfLmhhbmRsZVNNYXNrKGkscixjLGgsZCxtKX0pKTtiLnB1c2goW3QsITBdKX1lbHNlKDAsby53YXJuKSgiVW5zdXBwb3J0ZWQgU01hc2sgdHlwZSIpO2JyZWFrO2Nhc2UiVFIiOnZhciB1PV8uaGFuZGxlVHJhbnNmZXJGdW5jdGlvbihpKTtiLnB1c2goW3QsdV0pO2JyZWFrO2Nhc2UiT1AiOmNhc2Uib3AiOmNhc2UiT1BNIjpjYXNlIkJHIjpjYXNlIkJHMiI6Y2FzZSJVQ1IiOmNhc2UiVUNSMiI6Y2FzZSJUUjIiOmNhc2UiSFQiOmNhc2UiU00iOmNhc2UiU0EiOmNhc2UiQUlTIjpjYXNlIlRLIjooMCxvLmluZm8pKCJncmFwaGljIHN0YXRlIG9wZXJhdG9yICIrdCk7YnJlYWs7ZGVmYXVsdDooMCxvLmluZm8pKCJVbmtub3duIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIit0KX19O2Zvcih3PTAsQz12Lmxlbmd0aDt3PEM7dysrKWsoKTtyZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsUy50aGVuKChmdW5jdGlvbigpe2IubGVuZ3RoPjAmJmMuYWRkT3Aoby5PUFMuc2V0R1N0YXRlLFtiXSk7eSYmcC5zZXQodSxnLGIpfSkpKTtjYXNlIDk6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19KSxfY2FsbGVlNCl9KSkpLGZ1bmN0aW9uIHNldEdTdGF0ZSh0KXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToibG9hZEZvbnQiLHZhbHVlOmZ1bmN0aW9uIGxvYWRGb250KHQscixhKXt2YXIgaSxjPXRoaXMsaD1mdW5jdGlvbiBlcnJvckZvbnQoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBEKHtsb2FkZWROYW1lOiJnX2ZvbnRfZXJyb3IiLGZvbnQ6bmV3IHUuRXJyb3JGb250KCdGb250ICInLmNvbmNhdCh0LCciIGlzIG5vdCBhdmFpbGFibGUuJykpLGRpY3Q6cixleHRyYVByb3BlcnRpZXM6Yy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXN9KSl9LGQ9dGhpcy54cmVmO2lmKHIpe2lmKCEoMCxsLmlzUmVmKShyKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcignVGhlICJmb250IiBvYmplY3Qgc2hvdWxkIGJlIGEgcmVmZXJlbmNlLicpO2k9cn1lbHNle3ZhciBwPWEuZ2V0KCJGb250Iik7cCYmKGk9cC5nZXRSYXcodCkpfWlmKCFpKXt2YXIgbT0nRm9udCAiJy5jb25jYXQodHx8ciYmci50b1N0cmluZygpLCciIGlzIG5vdCBhdmFpbGFibGUnKTtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyYmIXRoaXMucGFyc2luZ1R5cGUzRm9udCl7KDAsby53YXJuKSgiIi5jb25jYXQobSwiLiIpKTtyZXR1cm4gaCgpfXRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHtmZWF0dXJlSWQ6by5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRNaXNzaW5nfSk7KDAsby53YXJuKSgiIi5jb25jYXQobSwiIC0tIGF0dGVtcHRpbmcgdG8gZmFsbGJhY2sgdG8gYSBkZWZhdWx0IGZvbnQuIikpO2k9UGFydGlhbEV2YWx1YXRvci5mYWxsYmFja0ZvbnREaWN0fWlmKHRoaXMuZm9udENhY2hlLmhhcyhpKSlyZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGkpO3I9ZC5mZXRjaElmUmVmKGkpO2lmKCEoMCxsLmlzRGljdCkocikpcmV0dXJuIGgoKTtpZihyLnRyYW5zbGF0ZWQpcmV0dXJuIHIudHJhbnNsYXRlZDt2YXIgZyx5LGI9KDAsby5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSx2PXRoaXMucHJlRXZhbHVhdGVGb250KHIpLFM9di5kZXNjcmlwdG9yLGs9di5oYXNoLHc9KDAsbC5pc1JlZikoaSk7dyYmKGc9ImYiLmNvbmNhdChpLnRvU3RyaW5nKCkpKTtpZihrJiYoMCxsLmlzRGljdCkoUykpe1MuZm9udEFsaWFzZXN8fChTLmZvbnRBbGlhc2VzPU9iamVjdC5jcmVhdGUobnVsbCkpO3ZhciBDPVMuZm9udEFsaWFzZXM7aWYoQ1trXSl7dmFyIF89Q1trXS5hbGlhc1JlZjtpZih3JiZfJiZ0aGlzLmZvbnRDYWNoZS5oYXMoXykpe3RoaXMuZm9udENhY2hlLnB1dEFsaWFzKGksXyk7cmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChpKX19ZWxzZSBDW2tdPXtmb250SUQ6dGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCl9O3cmJihDW2tdLmFsaWFzUmVmPWkpO2c9Q1trXS5mb250SUR9aWYodyl0aGlzLmZvbnRDYWNoZS5wdXQoaSxiLnByb21pc2UpO2Vsc2V7Z3x8KGc9dGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCkpO3RoaXMuZm9udENhY2hlLnB1dCgiaWRfIi5jb25jYXQoZyksYi5wcm9taXNlKX0oMCxvLmFzc2VydCkoZyYmZy5zdGFydHNXaXRoKCJmIiksJ1RoZSAiZm9udElEIiBtdXN0IGJlIChjb3JyZWN0bHkpIGRlZmluZWQuJyk7ci5sb2FkZWROYW1lPSIiLmNvbmNhdCh0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpLCJfIikuY29uY2F0KGcpO3IudHJhbnNsYXRlZD1iLnByb21pc2U7dHJ5e3k9dGhpcy50cmFuc2xhdGVGb250KHYpfWNhdGNoKHQpe3k9UHJvbWlzZS5yZWplY3QodCl9eS50aGVuKChmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10LmZvbnRUeXBlKXtkLnN0YXRzLmZvbnRUeXBlc1t0LmZvbnRUeXBlXT0hMH1iLnJlc29sdmUobmV3IEQoe2xvYWRlZE5hbWU6ci5sb2FkZWROYW1lLGZvbnQ6dCxkaWN0OnIsZXh0cmFQcm9wZXJ0aWVzOmMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzfSkpfSkpLmNhdGNoKChmdW5jdGlvbih0KXtjLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOm8uVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250VHJhbnNsYXRlfSk7dHJ5e3ZhciBhPVMmJlMuZ2V0KCJGb250RmlsZTMiKSxpPWEmJmEuZ2V0KCJTdWJ0eXBlIiksbD0oMCx1LmdldEZvbnRUeXBlKSh2LnR5cGUsaSYmaS5uYW1lKTtkLnN0YXRzLmZvbnRUeXBlc1tsXT0hMH1jYXRjaCh0KXt9Yi5yZXNvbHZlKG5ldyBEKHtsb2FkZWROYW1lOnIubG9hZGVkTmFtZSxmb250Om5ldyB1LkVycm9yRm9udCh0IGluc3RhbmNlb2YgRXJyb3I/dC5tZXNzYWdlOnQpLGRpY3Q6cixleHRyYVByb3BlcnRpZXM6Yy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXN9KSl9KSk7cmV0dXJuIGIucHJvbWlzZX19LHtrZXk6ImJ1aWxkUGF0aCIsdmFsdWU6ZnVuY3Rpb24gYnVpbGRQYXRoKHQscixhKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdLGM9dC5sZW5ndGgtMTthfHwoYT1bXSk7aWYoYzwwfHx0LmZuQXJyYXlbY10hPT1vLk9QUy5jb25zdHJ1Y3RQYXRoKXtpZihpKXsoMCxvLndhcm4pKCdFbmNvdW50ZXJlZCBwYXRoIG9wZXJhdG9yICInLmNvbmNhdChyLCciIGluc2lkZSBvZiBhIHRleHQgb2JqZWN0LicpKTt0LmFkZE9wKG8uT1BTLnNhdmUsbnVsbCl9dC5hZGRPcChvLk9QUy5jb25zdHJ1Y3RQYXRoLFtbcl0sYV0pO2kmJnQuYWRkT3Aoby5PUFMucmVzdG9yZSxudWxsKX1lbHNle3ZhciBsPXQuYXJnc0FycmF5W2NdO2xbMF0ucHVzaChyKTtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShsWzFdLGEpfX19LHtrZXk6InBhcnNlQ29sb3JTcGFjZSIsdmFsdWU6ZnVuY3Rpb24gcGFyc2VDb2xvclNwYWNlKHQpe3ZhciByPXRoaXMsYT10LmNzLGk9dC5yZXNvdXJjZXMsYz10LmxvY2FsQ29sb3JTcGFjZUNhY2hlO3JldHVybiBrLkNvbG9yU3BhY2UucGFyc2VBc3luYyh7Y3M6YSx4cmVmOnRoaXMueHJlZixyZXNvdXJjZXM6aSxwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9KS5jYXRjaCgoZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIG8uQWJvcnRFeGNlcHRpb24pcmV0dXJuIG51bGw7aWYoci5vcHRpb25zLmlnbm9yZUVycm9ycyl7ci5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIse2ZlYXR1cmVJZDpvLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yQ29sb3JTcGFjZX0pOygwLG8ud2FybikoJ3BhcnNlQ29sb3JTcGFjZSAtIGlnbm9yaW5nIENvbG9yU3BhY2U6ICInLmNvbmNhdCh0LCciLicpKTtyZXR1cm4gbnVsbH10aHJvdyB0fSkpfX0se2tleToiaGFuZGxlQ29sb3JOIix2YWx1ZToocj1fYXN5bmNUb0dlbmVyYXRvcihpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZTUodCxyLGEsYyx1LGgsZCxwKXt2YXIgbSx5LGIsdixTLGssdztyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWU1JChpKXtmb3IoOzspc3dpdGNoKGkucHJldj1pLm5leHQpe2Nhc2UgMDptPWFbYS5sZW5ndGgtMV07aWYoISgwLGwuaXNOYW1lKShtKXx8ISh5PXUuZ2V0KG0ubmFtZSkpKXtpLm5leHQ9MTY7YnJlYWt9Yj0oMCxsLmlzU3RyZWFtKSh5KT95LmRpY3Q6eTtpZigodj1iLmdldCgiUGF0dGVyblR5cGUiKSkhPT1JKXtpLm5leHQ9OTticmVha31TPWMuYmFzZT9jLmJhc2UuZ2V0UmdiKGEsMCk6bnVsbDtyZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsdGhpcy5oYW5kbGVUaWxpbmdUeXBlKHIsUyxoLHksYix0LGQpKTtjYXNlIDk6aWYodiE9PVApe2kubmV4dD0xNTticmVha31rPWIuZ2V0KCJTaGFkaW5nIik7dz1iLmdldEFycmF5KCJNYXRyaXgiKTt5PWcuUGF0dGVybi5wYXJzZVNoYWRpbmcoayx3LHRoaXMueHJlZixoLHRoaXMuaGFuZGxlcix0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkscCk7dC5hZGRPcChyLHkuZ2V0SVIoKSk7cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHZvaWQgMCk7Y2FzZSAxNTp0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiVW5rbm93biBQYXR0ZXJuVHlwZTogIi5jb25jYXQodikpO2Nhc2UgMTY6dGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlVua25vd24gUGF0dGVybk5hbWU6ICIuY29uY2F0KG0pKTtjYXNlIDE3OmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZTUsdGhpcyl9KSkpLGZ1bmN0aW9uIGhhbmRsZUNvbG9yTih0LGEsaSxvLGMsbCx1LGgpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJwYXJzZU1hcmtlZENvbnRlbnRQcm9wcyIsdmFsdWU6KHQ9X2FzeW5jVG9HZW5lcmF0b3IoaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWU2KHQscil7dmFyIGEsYyx1LGgsZCxwO3JldHVybiBpLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZTYkKGkpe2Zvcig7Oylzd2l0Y2goaS5wcmV2PWkubmV4dCl7Y2FzZSAwOmlmKCEoMCxsLmlzTmFtZSkodCkpe2kubmV4dD01O2JyZWFrfWM9ci5nZXQoIlByb3BlcnRpZXMiKTthPWMuZ2V0KHQubmFtZSk7aS5uZXh0PTEwO2JyZWFrO2Nhc2UgNTppZighKDAsbC5pc0RpY3QpKHQpKXtpLm5leHQ9OTticmVha31hPXQ7aS5uZXh0PTEwO2JyZWFrO2Nhc2UgOTp0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiT3B0aW9uYWwgY29udGVudCBwcm9wZXJ0aWVzIG1hbGZvcm1lZC4iKTtjYXNlIDEwOmlmKCJPQ0ciIT09KHU9YS5nZXQoIlR5cGUiKS5uYW1lKSl7aS5uZXh0PTE1O2JyZWFrfXJldHVybiBpLmFicnVwdCgicmV0dXJuIix7dHlwZTp1LGlkOmEub2JqSWR9KTtjYXNlIDE1OmlmKCJPQ01EIiE9PXUpe2kubmV4dD0yNzticmVha31oPWEuZ2V0KCJPQ0dzIik7aWYoIUFycmF5LmlzQXJyYXkoaCkmJiEoMCxsLmlzRGljdCkoaCkpe2kubmV4dD0yNTticmVha31kPVtdO0FycmF5LmlzQXJyYXkoaCk/YS5nZXQoIk9DR3MiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtkLnB1c2godC50b1N0cmluZygpKX0pKTpkLnB1c2goaC5vYmpJZCk7cD1udWxsO2EuZ2V0KCJWRSIpJiYocD0hMCk7cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLHt0eXBlOnUsaWRzOmQscG9saWN5OigwLGwuaXNOYW1lKShhLmdldCgiUCIpKT9hLmdldCgiUCIpLm5hbWU6bnVsbCxleHByZXNzaW9uOnB9KTtjYXNlIDI1OmlmKCEoMCxsLmlzUmVmKShoKSl7aS5uZXh0PTI3O2JyZWFrfXJldHVybiBpLmFicnVwdCgicmV0dXJuIix7dHlwZTp1LGlkOmgudG9TdHJpbmcoKX0pO2Nhc2UgMjc6cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLG51bGwpO2Nhc2UgMjg6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19KSxfY2FsbGVlNil9KSkpLGZ1bmN0aW9uIHBhcnNlTWFya2VkQ29udGVudFByb3BzKHIsYSl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6ImdldE9wZXJhdG9yTGlzdCIsdmFsdWU6ZnVuY3Rpb24gZ2V0T3BlcmF0b3JMaXN0KHQpe3ZhciByPXRoaXMsYT10LnN0cmVhbSxpPXQudGFzayxjPXQucmVzb3VyY2VzLHU9dC5vcGVyYXRvckxpc3QsaD10LmluaXRpYWxTdGF0ZSxkPXZvaWQgMD09PWg/bnVsbDpoO2M9Y3x8bC5EaWN0LmVtcHR5O2Q9ZHx8bmV3IE47aWYoIXUpdGhyb3cgbmV3IEVycm9yKCdnZXRPcGVyYXRvckxpc3Q6IG1pc3NpbmcgIm9wZXJhdG9yTGlzdCIgcGFyYW1ldGVyJyk7dmFyIHA9dGhpcyxtPXRoaXMueHJlZix5PSExLGI9bmV3IHYuTG9jYWxJbWFnZUNhY2hlLFM9bmV3IHYuTG9jYWxDb2xvclNwYWNlQ2FjaGUsdz1uZXcgdi5Mb2NhbEdTdGF0ZUNhY2hlLEM9Yy5nZXQoIlhPYmplY3QiKXx8bC5EaWN0LmVtcHR5LF89Yy5nZXQoIlBhdHRlcm4iKXx8bC5EaWN0LmVtcHR5LHg9bmV3IE0oZCksQT1uZXcgVShhLG0seCksVD1uZXcgRTtmdW5jdGlvbiBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKHQpe2Zvcih2YXIgcj0wLGE9QS5zYXZlZFN0YXRlc0RlcHRoO3I8YTtyKyspdS5hZGRPcChvLk9QUy5yZXN0b3JlLFtdKX1yZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uIHByb21pc2VCb2R5KHQscil7dmFyIGE9ZnVuY3Rpb24gbmV4dChhKXtQcm9taXNlLmFsbChbYSx1LnJlYWR5XSkudGhlbigoZnVuY3Rpb24oKXt0cnl7cHJvbWlzZUJvZHkodCxyKX1jYXRjaCh0KXtyKHQpfX0pLHIpfTtpLmVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtULnJlc2V0KCk7Zm9yKHZhciBoLGQsdixSLEksUD17fTshKGg9VC5jaGVjaygpKTspe1AuYXJncz1udWxsO2lmKCFBLnJlYWQoUCkpYnJlYWs7dmFyIEU9UC5hcmdzLEI9UC5mbjtzd2l0Y2goMHxCKXtjYXNlIG8uT1BTLnBhaW50WE9iamVjdDppZihJPUVbMF0ubmFtZSl7dmFyIEQ9Yi5nZXRCeU5hbWUoSSk7aWYoRCl7dS5hZGRPcChELmZuLEQuYXJncyk7RT1udWxsO2NvbnRpbnVlfX1hKG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe2lmKCFJKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTt2YXIgYT1DLmdldFJhdyhJKTtpZihhIGluc3RhbmNlb2YgbC5SZWYpe3ZhciBoPWIuZ2V0QnlSZWYoYSk7aWYoaCl7dS5hZGRPcChoLmZuLGguYXJncyk7dCgpO3JldHVybn12YXIgZD1wLmdsb2JhbEltYWdlQ2FjaGUuZ2V0RGF0YShhLHAucGFnZUluZGV4KTtpZihkKXt1LmFkZERlcGVuZGVuY3koZC5vYmpJZCk7dS5hZGRPcChkLmZuLGQuYXJncyk7dCgpO3JldHVybn1hPW0uZmV0Y2goYSl9aWYoISgwLGwuaXNTdHJlYW0pKGEpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJYT2JqZWN0IHNob3VsZCBiZSBhIHN0cmVhbSIpO3ZhciBnPWEuZGljdC5nZXQoIlN1YnR5cGUiKTtpZighKDAsbC5pc05hbWUpKGcpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJYT2JqZWN0IHNob3VsZCBoYXZlIGEgTmFtZSBzdWJ0eXBlIik7aWYoIkZvcm0iIT09Zy5uYW1lKWlmKCJJbWFnZSIhPT1nLm5hbWUpe2lmKCJQUyIhPT1nLm5hbWUpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlVuaGFuZGxlZCBYT2JqZWN0IHN1YnR5cGUgIi5jb25jYXQoZy5uYW1lKSk7KDAsby5pbmZvKSgiSWdub3JlZCBYT2JqZWN0IHN1YnR5cGUgUFMiKTt0KCl9ZWxzZSBwLmJ1aWxkUGFpbnRJbWFnZVhPYmplY3Qoe3Jlc291cmNlczpjLGltYWdlOmEsb3BlcmF0b3JMaXN0OnUsY2FjaGVLZXk6SSxsb2NhbEltYWdlQ2FjaGU6Yixsb2NhbENvbG9yU3BhY2VDYWNoZTpTfSkudGhlbih0LHIpO2Vsc2V7eC5zYXZlKCk7cC5idWlsZEZvcm1YT2JqZWN0KGMsYSxudWxsLHUsaSx4LnN0YXRlLmNsb25lKCksUykudGhlbigoZnVuY3Rpb24oKXt4LnJlc3RvcmUoKTt0KCl9KSxyKX19KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIG8uQWJvcnRFeGNlcHRpb24pKXtpZighcC5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyB0O3AuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHtmZWF0dXJlSWQ6by5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvclhPYmplY3R9KTsoMCxvLndhcm4pKCdnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBYT2JqZWN0OiAiJy5jb25jYXQodCwnIi4nKSl9fSkpKTtyZXR1cm47Y2FzZSBvLk9QUy5zZXRGb250OnZhciBNPUVbMV07YShwLmhhbmRsZVNldEZvbnQoYyxFLG51bGwsdSxpLHguc3RhdGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3UuYWRkRGVwZW5kZW5jeSh0KTt1LmFkZE9wKG8uT1BTLnNldEZvbnQsW3QsTV0pfSkpKTtyZXR1cm47Y2FzZSBvLk9QUy5iZWdpblRleHQ6eT0hMDticmVhaztjYXNlIG8uT1BTLmVuZFRleHQ6eT0hMTticmVhaztjYXNlIG8uT1BTLmVuZElubGluZUltYWdlOnZhciBMPUVbMF0uY2FjaGVLZXk7aWYoTCl7dmFyIE49Yi5nZXRCeU5hbWUoTCk7aWYoTil7dS5hZGRPcChOLmZuLE4uYXJncyk7RT1udWxsO2NvbnRpbnVlfX1hKHAuYnVpbGRQYWludEltYWdlWE9iamVjdCh7cmVzb3VyY2VzOmMsaW1hZ2U6RVswXSxpc0lubGluZTohMCxvcGVyYXRvckxpc3Q6dSxjYWNoZUtleTpMLGxvY2FsSW1hZ2VDYWNoZTpiLGxvY2FsQ29sb3JTcGFjZUNhY2hlOlN9KSk7cmV0dXJuO2Nhc2Ugby5PUFMuc2hvd1RleHQ6aWYoIXguc3RhdGUuZm9udCl7cC5lbnN1cmVTdGF0ZUZvbnQoeC5zdGF0ZSk7Y29udGludWV9RVswXT1wLmhhbmRsZVRleHQoRVswXSx4LnN0YXRlKTticmVhaztjYXNlIG8uT1BTLnNob3dTcGFjZWRUZXh0OmlmKCF4LnN0YXRlLmZvbnQpe3AuZW5zdXJlU3RhdGVGb250KHguc3RhdGUpO2NvbnRpbnVlfXZhciBVPUVbMF0saj1bXSxxPVUubGVuZ3RoLFc9eC5zdGF0ZTtmb3IoZD0wO2Q8cTsrK2Qpe3ZhciB6PVVbZF07KDAsby5pc1N0cmluZykoeik/QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoaixwLmhhbmRsZVRleHQoeixXKSk6KDAsby5pc051bSkoeikmJmoucHVzaCh6KX1FWzBdPWo7Qj1vLk9QUy5zaG93VGV4dDticmVhaztjYXNlIG8uT1BTLm5leHRMaW5lU2hvd1RleHQ6aWYoIXguc3RhdGUuZm9udCl7cC5lbnN1cmVTdGF0ZUZvbnQoeC5zdGF0ZSk7Y29udGludWV9dS5hZGRPcChvLk9QUy5uZXh0TGluZSk7RVswXT1wLmhhbmRsZVRleHQoRVswXSx4LnN0YXRlKTtCPW8uT1BTLnNob3dUZXh0O2JyZWFrO2Nhc2Ugby5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6aWYoIXguc3RhdGUuZm9udCl7cC5lbnN1cmVTdGF0ZUZvbnQoeC5zdGF0ZSk7Y29udGludWV9dS5hZGRPcChvLk9QUy5uZXh0TGluZSk7dS5hZGRPcChvLk9QUy5zZXRXb3JkU3BhY2luZyxbRS5zaGlmdCgpXSk7dS5hZGRPcChvLk9QUy5zZXRDaGFyU3BhY2luZyxbRS5zaGlmdCgpXSk7RVswXT1wLmhhbmRsZVRleHQoRVswXSx4LnN0YXRlKTtCPW8uT1BTLnNob3dUZXh0O2JyZWFrO2Nhc2Ugby5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6eC5zdGF0ZS50ZXh0UmVuZGVyaW5nTW9kZT1FWzBdO2JyZWFrO2Nhc2Ugby5PUFMuc2V0RmlsbENvbG9yU3BhY2U6dmFyIEc9ay5Db2xvclNwYWNlLmdldENhY2hlZChFWzBdLG0sUyk7aWYoRyl7eC5zdGF0ZS5maWxsQ29sb3JTcGFjZT1HO2NvbnRpbnVlfWEocC5wYXJzZUNvbG9yU3BhY2Uoe2NzOkVbMF0scmVzb3VyY2VzOmMsbG9jYWxDb2xvclNwYWNlQ2FjaGU6U30pLnRoZW4oKGZ1bmN0aW9uKHQpe3QmJih4LnN0YXRlLmZpbGxDb2xvclNwYWNlPXQpfSkpKTtyZXR1cm47Y2FzZSBvLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlOnZhciBIPWsuQ29sb3JTcGFjZS5nZXRDYWNoZWQoRVswXSxtLFMpO2lmKEgpe3guc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT1IO2NvbnRpbnVlfWEocC5wYXJzZUNvbG9yU3BhY2Uoe2NzOkVbMF0scmVzb3VyY2VzOmMsbG9jYWxDb2xvclNwYWNlQ2FjaGU6U30pLnRoZW4oKGZ1bmN0aW9uKHQpe3QmJih4LnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9dCl9KSkpO3JldHVybjtjYXNlIG8uT1BTLnNldEZpbGxDb2xvcjpFPShSPXguc3RhdGUuZmlsbENvbG9yU3BhY2UpLmdldFJnYihFLDApO0I9by5PUFMuc2V0RmlsbFJHQkNvbG9yO2JyZWFrO2Nhc2Ugby5PUFMuc2V0U3Ryb2tlQ29sb3I6RT0oUj14LnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UpLmdldFJnYihFLDApO0I9by5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7YnJlYWs7Y2FzZSBvLk9QUy5zZXRGaWxsR3JheTp4LnN0YXRlLmZpbGxDb2xvclNwYWNlPWsuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7RT1rLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYihFLDApO0I9by5PUFMuc2V0RmlsbFJHQkNvbG9yO2JyZWFrO2Nhc2Ugby5PUFMuc2V0U3Ryb2tlR3JheTp4LnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9ay5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTtFPWsuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKEUsMCk7Qj1vLk9QUy5zZXRTdHJva2VSR0JDb2xvcjticmVhaztjYXNlIG8uT1BTLnNldEZpbGxDTVlLQ29sb3I6eC5zdGF0ZS5maWxsQ29sb3JTcGFjZT1rLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrO0U9ay5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoRSwwKTtCPW8uT1BTLnNldEZpbGxSR0JDb2xvcjticmVhaztjYXNlIG8uT1BTLnNldFN0cm9rZUNNWUtDb2xvcjp4LnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9ay5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215aztFPWsuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKEUsMCk7Qj1vLk9QUy5zZXRTdHJva2VSR0JDb2xvcjticmVhaztjYXNlIG8uT1BTLnNldEZpbGxSR0JDb2xvcjp4LnN0YXRlLmZpbGxDb2xvclNwYWNlPWsuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjtFPWsuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoRSwwKTticmVhaztjYXNlIG8uT1BTLnNldFN0cm9rZVJHQkNvbG9yOnguc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT1rLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7RT1rLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKEUsMCk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRGaWxsQ29sb3JOOmlmKCJQYXR0ZXJuIj09PShSPXguc3RhdGUuZmlsbENvbG9yU3BhY2UpLm5hbWUpe2EocC5oYW5kbGVDb2xvck4odSxvLk9QUy5zZXRGaWxsQ29sb3JOLEUsUixfLGMsaSxTKSk7cmV0dXJufUU9Ui5nZXRSZ2IoRSwwKTtCPW8uT1BTLnNldEZpbGxSR0JDb2xvcjticmVhaztjYXNlIG8uT1BTLnNldFN0cm9rZUNvbG9yTjppZigiUGF0dGVybiI9PT0oUj14LnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UpLm5hbWUpe2EocC5oYW5kbGVDb2xvck4odSxvLk9QUy5zZXRTdHJva2VDb2xvck4sRSxSLF8sYyxpLFMpKTtyZXR1cm59RT1SLmdldFJnYihFLDApO0I9by5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7YnJlYWs7Y2FzZSBvLk9QUy5zaGFkaW5nRmlsbDp2YXIgVj1jLmdldCgiU2hhZGluZyIpO2lmKCFWKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJObyBzaGFkaW5nIHJlc291cmNlIGZvdW5kIik7dmFyIFg9Vi5nZXQoRVswXS5uYW1lKTtpZighWCl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTtFPVtnLlBhdHRlcm4ucGFyc2VTaGFkaW5nKFgsbnVsbCxtLGMscC5oYW5kbGVyLHAuX3BkZkZ1bmN0aW9uRmFjdG9yeSxTKS5nZXRJUigpXTtCPW8uT1BTLnNoYWRpbmdGaWxsO2JyZWFrO2Nhc2Ugby5PUFMuc2V0R1N0YXRlOmlmKEk9RVswXS5uYW1lKXt2YXIgWT13LmdldEJ5TmFtZShJKTtpZihZKXtZLmxlbmd0aD4wJiZ1LmFkZE9wKG8uT1BTLnNldEdTdGF0ZSxbWV0pO0U9bnVsbDtjb250aW51ZX19YShuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxyKXtpZighSSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTt2YXIgYT1jLmdldCgiRXh0R1N0YXRlIik7aWYoIShhIGluc3RhbmNlb2YgbC5EaWN0KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7dmFyIGg9YS5nZXQoSSk7aWYoIShoIGluc3RhbmNlb2YgbC5EaWN0KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7cC5zZXRHU3RhdGUoe3Jlc291cmNlczpjLGdTdGF0ZTpoLG9wZXJhdG9yTGlzdDp1LGNhY2hlS2V5OkksdGFzazppLHN0YXRlTWFuYWdlcjp4LGxvY2FsR1N0YXRlQ2FjaGU6dyxsb2NhbENvbG9yU3BhY2VDYWNoZTpTfSkudGhlbih0LHIpfSkpLmNhdGNoKChmdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBvLkFib3J0RXhjZXB0aW9uKSl7aWYoIXAub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgdDtwLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOm8uVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JFeHRHU3RhdGV9KTsoMCxvLndhcm4pKCdnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICInLmNvbmNhdCh0LCciLicpKX19KSkpO3JldHVybjtjYXNlIG8uT1BTLm1vdmVUbzpjYXNlIG8uT1BTLmxpbmVUbzpjYXNlIG8uT1BTLmN1cnZlVG86Y2FzZSBvLk9QUy5jdXJ2ZVRvMjpjYXNlIG8uT1BTLmN1cnZlVG8zOmNhc2Ugby5PUFMuY2xvc2VQYXRoOmNhc2Ugby5PUFMucmVjdGFuZ2xlOnAuYnVpbGRQYXRoKHUsQixFLHkpO2NvbnRpbnVlO2Nhc2Ugby5PUFMubWFya1BvaW50OmNhc2Ugby5PUFMubWFya1BvaW50UHJvcHM6Y2FzZSBvLk9QUy5iZWdpbkNvbXBhdDpjYXNlIG8uT1BTLmVuZENvbXBhdDpjb250aW51ZTtjYXNlIG8uT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzOmlmKCEoMCxsLmlzTmFtZSkoRVswXSkpeygwLG8ud2FybikoIkV4cGVjdGVkIG5hbWUgZm9yIGJlZ2luTWFya2VkQ29udGVudFByb3BzIGFyZzA9Ii5jb25jYXQoRVswXSkpO2NvbnRpbnVlfWlmKCJPQyI9PT1FWzBdLm5hbWUpe2EocC5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhFWzFdLGMpLnRoZW4oKGZ1bmN0aW9uKHQpe3UuYWRkT3Aoby5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIsdF0pfSkpLmNhdGNoKChmdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBvLkFib3J0RXhjZXB0aW9uKSl7aWYoIXAub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgdDtwLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOm8uVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JNYXJrZWRDb250ZW50fSk7KDAsby53YXJuKSgnZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6ICInLmNvbmNhdCh0LCciLicpKX19KSkpO3JldHVybn1FPVtFWzBdLm5hbWVdO2JyZWFrO2Nhc2Ugby5PUFMuYmVnaW5NYXJrZWRDb250ZW50OmNhc2Ugby5PUFMuZW5kTWFya2VkQ29udGVudDpkZWZhdWx0OmlmKG51bGwhPT1FKXtmb3IoZD0wLHY9RS5sZW5ndGg7ZDx2JiYhKEVbZF1pbnN0YW5jZW9mIGwuRGljdCk7ZCsrKTtpZihkPHYpeygwLG8ud2FybikoImdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIG9wZXJhdG9yOiAiK0IpO2NvbnRpbnVlfX19dS5hZGRPcChCLEUpfWlmKGgpYShPKTtlbHNle2Nsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTt0KCl9fSkpLmNhdGNoKChmdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBvLkFib3J0RXhjZXB0aW9uKSl7aWYoIXIub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgdDtyLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIix7ZmVhdHVyZUlkOm8uVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JPcGVyYXRvckxpc3R9KTsoMCxvLndhcm4pKCdnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICInLmNvbmNhdChpLm5hbWUsJyIgJykrJ3Rhc2s6ICInLmNvbmNhdCh0LCciLicpKTtjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCl9fSkpfX0se2tleToiZ2V0VGV4dENvbnRlbnQiLHZhbHVlOmZ1bmN0aW9uIGdldFRleHRDb250ZW50KHQpe3ZhciByPXRoaXMsYT10LnN0cmVhbSxpPXQudGFzayxjPXQucmVzb3VyY2VzLHU9dC5zdGF0ZU1hbmFnZXIsaD12b2lkIDA9PT11P251bGw6dSxkPXQubm9ybWFsaXplV2hpdGVzcGFjZSxtPXZvaWQgMCE9PWQmJmQsZz10LmNvbWJpbmVUZXh0SXRlbXMseT12b2lkIDAhPT1nJiZnLGI9dC5zaW5rLGs9dC5zZWVuU3R5bGVzLHc9dm9pZCAwPT09az9PYmplY3QuY3JlYXRlKG51bGwpOms7Yz1jfHxsLkRpY3QuZW1wdHk7aD1ofHxuZXcgTShuZXcgTCk7dmFyIEMsXz0vXHMvZyx4PXtpdGVtczpbXSxzdHlsZXM6T2JqZWN0LmNyZWF0ZShudWxsKX0sQT17aW5pdGlhbGl6ZWQ6ITEsc3RyOltdLHdpZHRoOjAsaGVpZ2h0OjAsdmVydGljYWw6ITEsbGFzdEFkdmFuY2VXaWR0aDowLGxhc3RBZHZhbmNlSGVpZ2h0OjAsdGV4dEFkdmFuY2VTY2FsZTowLHNwYWNlV2lkdGg6MCxmYWtlU3BhY2VNaW46MS8wLGZha2VNdWx0aVNwYWNlTWluOjEvMCxmYWtlTXVsdGlTcGFjZU1heDotMCx0ZXh0UnVuQnJlYWtBbGxvd2VkOiExLHRyYW5zZm9ybTpudWxsLGZvbnROYW1lOm51bGx9LFQ9dGhpcyxSPXRoaXMueHJlZixJPW51bGwsUD1uZXcgdi5Mb2NhbEltYWdlQ2FjaGUsQj1uZXcgdi5Mb2NhbEdTdGF0ZUNhY2hlLEQ9bmV3IFUoYSxSLGgpO2Z1bmN0aW9uIGVuc3VyZVRleHRDb250ZW50SXRlbSgpe2lmKEEuaW5pdGlhbGl6ZWQpcmV0dXJuIEE7dmFyIHQ9Qy5mb250O2lmKCEodC5sb2FkZWROYW1lIGluIHcpKXt3W3QubG9hZGVkTmFtZV09ITA7eC5zdHlsZXNbdC5sb2FkZWROYW1lXT17Zm9udEZhbWlseTp0LmZhbGxiYWNrTmFtZSxhc2NlbnQ6dC5hc2NlbnQsZGVzY2VudDp0LmRlc2NlbnQsdmVydGljYWw6dC52ZXJ0aWNhbH19QS5mb250TmFtZT10LmxvYWRlZE5hbWU7dmFyIHI9W0MuZm9udFNpemUqQy50ZXh0SFNjYWxlLDAsMCxDLmZvbnRTaXplLDAsQy50ZXh0UmlzZV07aWYodC5pc1R5cGUzRm9udCYmQy5mb250U2l6ZTw9MSYmISgwLG8uaXNBcnJheUVxdWFsKShDLmZvbnRNYXRyaXgsby5GT05UX0lERU5USVRZX01BVFJJWCkpe3ZhciBhPXQuYmJveFszXS10LmJib3hbMV07YT4wJiYoclszXSo9YSpDLmZvbnRNYXRyaXhbM10pfXZhciBpPW8uVXRpbC50cmFuc2Zvcm0oQy5jdG0sby5VdGlsLnRyYW5zZm9ybShDLnRleHRNYXRyaXgscikpO0EudHJhbnNmb3JtPWk7aWYodC52ZXJ0aWNhbCl7QS53aWR0aD1NYXRoLnNxcnQoaVswXSppWzBdK2lbMV0qaVsxXSk7QS5oZWlnaHQ9MDtBLnZlcnRpY2FsPSEwfWVsc2V7QS53aWR0aD0wO0EuaGVpZ2h0PU1hdGguc3FydChpWzJdKmlbMl0raVszXSppWzNdKTtBLnZlcnRpY2FsPSExfXZhciBjPUMudGV4dExpbmVNYXRyaXhbMF0sbD1DLnRleHRMaW5lTWF0cml4WzFdLHU9TWF0aC5zcXJ0KGMqYytsKmwpO2M9Qy5jdG1bMF07bD1DLmN0bVsxXTt2YXIgaD1NYXRoLnNxcnQoYypjK2wqbCk7QS50ZXh0QWR2YW5jZVNjYWxlPWgqdTtBLmxhc3RBZHZhbmNlV2lkdGg9MDtBLmxhc3RBZHZhbmNlSGVpZ2h0PTA7dmFyIGQ9dC5zcGFjZVdpZHRoLzFlMypDLmZvbnRTaXplO2lmKGQpe0Euc3BhY2VXaWR0aD1kO0EuZmFrZVNwYWNlTWluPS4zKmQ7QS5mYWtlTXVsdGlTcGFjZU1pbj0xLjUqZDtBLmZha2VNdWx0aVNwYWNlTWF4PTQqZDtBLnRleHRSdW5CcmVha0FsbG93ZWQ9IXQuaXNNb25vc3BhY2V9ZWxzZXtBLnNwYWNlV2lkdGg9MDtBLmZha2VTcGFjZU1pbj0xLzA7QS5mYWtlTXVsdGlTcGFjZU1pbj0xLzA7QS5mYWtlTXVsdGlTcGFjZU1heD0wO0EudGV4dFJ1bkJyZWFrQWxsb3dlZD0hMX1BLmluaXRpYWxpemVkPSEwO3JldHVybiBBfWZ1bmN0aW9uIHJlcGxhY2VXaGl0ZXNwYWNlKHQpe2Zvcih2YXIgcixhPTAsaT10Lmxlbmd0aDthPGkmJihyPXQuY2hhckNvZGVBdChhKSk+PTMyJiZyPD0xMjc7KWErKztyZXR1cm4gYTxpP3QucmVwbGFjZShfLCIgIik6dH1mdW5jdGlvbiBoYW5kbGVTZXRGb250KHQscil7cmV0dXJuIFQubG9hZEZvbnQodCxyLGMpLnRoZW4oKGZ1bmN0aW9uKHQpe0MuZm9udD10LmZvbnQ7Qy5mb250TWF0cml4PXQuZm9udC5mb250TWF0cml4fHxvLkZPTlRfSURFTlRJVFlfTUFUUklYfSkpfWZ1bmN0aW9uIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHQpe2Zvcih2YXIgcj1DLmZvbnQsYT1lbnN1cmVUZXh0Q29udGVudEl0ZW0oKSxpPTAsbz0wLGM9ci5jaGFyc1RvR2x5cGhzKHQpLGw9MDtsPGMubGVuZ3RoO2wrKyl7dmFyIHU9Y1tsXSxoPW51bGw7aD1yLnZlcnRpY2FsJiZ1LnZtZXRyaWM/dS52bWV0cmljWzBdOnUud2lkdGg7dmFyIGQ9dS51bmljb2RlLG09KDAscC5nZXROb3JtYWxpemVkVW5pY29kZXMpKCk7dm9pZCAwIT09bVtkXSYmKGQ9bVtkXSk7ZD0oMCxwLnJldmVyc2VJZlJ0bCkoZCk7dmFyIGc9Qy5jaGFyU3BhY2luZztpZih1LmlzU3BhY2Upe3ZhciB5PUMud29yZFNwYWNpbmc7Zys9eTt5PjAmJmFkZEZha2VTcGFjZXMoeSxhLnN0cil9dmFyIGI9MCx2PTA7aWYoci52ZXJ0aWNhbCl7bys9dj1oKkMuZm9udE1hdHJpeFswXSpDLmZvbnRTaXplK2d9ZWxzZXtpKz1iPShoKkMuZm9udE1hdHJpeFswXSpDLmZvbnRTaXplK2cpKkMudGV4dEhTY2FsZX1DLnRyYW5zbGF0ZVRleHRNYXRyaXgoYix2KTthLnN0ci5wdXNoKGQpfWlmKHIudmVydGljYWwpe2EubGFzdEFkdmFuY2VIZWlnaHQ9bzthLmhlaWdodCs9TWF0aC5hYnMobyl9ZWxzZXthLmxhc3RBZHZhbmNlV2lkdGg9aTthLndpZHRoKz1pfXJldHVybiBhfWZ1bmN0aW9uIGFkZEZha2VTcGFjZXModCxyKXtpZighKHQ8QS5mYWtlU3BhY2VNaW4pKWlmKHQ8QS5mYWtlTXVsdGlTcGFjZU1pbilyLnB1c2goIiAiKTtlbHNlIGZvcih2YXIgYT1NYXRoLnJvdW5kKHQvQS5zcGFjZVdpZHRoKTthLS0gPjA7KXIucHVzaCgiICIpfWZ1bmN0aW9uIGZsdXNoVGV4dENvbnRlbnRJdGVtKCl7aWYoQS5pbml0aWFsaXplZCl7QS52ZXJ0aWNhbD9BLmhlaWdodCo9QS50ZXh0QWR2YW5jZVNjYWxlOkEud2lkdGgqPUEudGV4dEFkdmFuY2VTY2FsZTt4Lml0ZW1zLnB1c2goZnVuY3Rpb24gcnVuQmlkaVRyYW5zZm9ybSh0KXt2YXIgcj10LnN0ci5qb2luKCIiKSxhPSgwLFMuYmlkaSkociwtMSx0LnZlcnRpY2FsKTtyZXR1cm57c3RyOm0/cmVwbGFjZVdoaXRlc3BhY2UoYS5zdHIpOmEuc3RyLGRpcjphLmRpcix3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodCx0cmFuc2Zvcm06dC50cmFuc2Zvcm0sZm9udE5hbWU6dC5mb250TmFtZX19KEEpKTtBLmluaXRpYWxpemVkPSExO0Euc3RyLmxlbmd0aD0wfX1mdW5jdGlvbiBlbnF1ZXVlQ2h1bmsoKXt2YXIgdD14Lml0ZW1zLmxlbmd0aDtpZih0PjApe2IuZW5xdWV1ZSh4LHQpO3guaXRlbXM9W107eC5zdHlsZXM9T2JqZWN0LmNyZWF0ZShudWxsKX19dmFyIE49bmV3IEU7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbiBwcm9taXNlQm9keSh0LHIpe3ZhciBhPWZ1bmN0aW9uIG5leHQoYSl7ZW5xdWV1ZUNodW5rKCk7UHJvbWlzZS5hbGwoW2EsYi5yZWFkeV0pLnRoZW4oKGZ1bmN0aW9uKCl7dHJ5e3Byb21pc2VCb2R5KHQscil9Y2F0Y2godCl7cih0KX19KSxyKX07aS5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7Ti5yZXNldCgpO2Zvcih2YXIgdSxkPXt9LHA9W107ISh1PU4uY2hlY2soKSk7KXtwLmxlbmd0aD0wO2QuYXJncz1wO2lmKCFELnJlYWQoZCkpYnJlYWs7Qz1oLnN0YXRlO3ZhciBnLHY9ZC5mbjtwPWQuYXJncztzd2l0Y2goMHx2KXtjYXNlIG8uT1BTLnNldEZvbnQ6dmFyIFM9cFswXS5uYW1lLGs9cFsxXTtpZihDLmZvbnQmJlM9PT1DLmZvbnROYW1lJiZrPT09Qy5mb250U2l6ZSlicmVhaztmbHVzaFRleHRDb250ZW50SXRlbSgpO0MuZm9udE5hbWU9UztDLmZvbnRTaXplPWs7YShoYW5kbGVTZXRGb250KFMsbnVsbCkpO3JldHVybjtjYXNlIG8uT1BTLnNldFRleHRSaXNlOmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7Qy50ZXh0UmlzZT1wWzBdO2JyZWFrO2Nhc2Ugby5PUFMuc2V0SFNjYWxlOmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7Qy50ZXh0SFNjYWxlPXBbMF0vMTAwO2JyZWFrO2Nhc2Ugby5PUFMuc2V0TGVhZGluZzpmbHVzaFRleHRDb250ZW50SXRlbSgpO0MubGVhZGluZz1wWzBdO2JyZWFrO2Nhc2Ugby5PUFMubW92ZVRleHQ6dmFyIF89ISFDLmZvbnQmJjA9PT0oQy5mb250LnZlcnRpY2FsP3BbMF06cFsxXSk7Zz1wWzBdLXBbMV07aWYoeSYmXyYmQS5pbml0aWFsaXplZCYmZz4wJiZnPD1BLmZha2VNdWx0aVNwYWNlTWF4KXtDLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KHBbMF0scFsxXSk7QS53aWR0aCs9cFswXS1BLmxhc3RBZHZhbmNlV2lkdGg7QS5oZWlnaHQrPXBbMV0tQS5sYXN0QWR2YW5jZUhlaWdodDthZGRGYWtlU3BhY2VzKHBbMF0tQS5sYXN0QWR2YW5jZVdpZHRoLShwWzFdLUEubGFzdEFkdmFuY2VIZWlnaHQpLEEuc3RyKTticmVha31mbHVzaFRleHRDb250ZW50SXRlbSgpO0MudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgocFswXSxwWzFdKTtDLnRleHRNYXRyaXg9Qy50ZXh0TGluZU1hdHJpeC5zbGljZSgpO2JyZWFrO2Nhc2Ugby5PUFMuc2V0TGVhZGluZ01vdmVUZXh0OmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7Qy5sZWFkaW5nPS1wWzFdO0MudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgocFswXSxwWzFdKTtDLnRleHRNYXRyaXg9Qy50ZXh0TGluZU1hdHJpeC5zbGljZSgpO2JyZWFrO2Nhc2Ugby5PUFMubmV4dExpbmU6Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtDLmNhcnJpYWdlUmV0dXJuKCk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRUZXh0TWF0cml4Omc9Qy5jYWxjVGV4dExpbmVNYXRyaXhBZHZhbmNlKHBbMF0scFsxXSxwWzJdLHBbM10scFs0XSxwWzVdKTtpZih5JiZudWxsIT09ZyYmQS5pbml0aWFsaXplZCYmZy52YWx1ZT4wJiZnLnZhbHVlPD1BLmZha2VNdWx0aVNwYWNlTWF4KXtDLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGcud2lkdGgsZy5oZWlnaHQpO0Eud2lkdGgrPWcud2lkdGgtQS5sYXN0QWR2YW5jZVdpZHRoO0EuaGVpZ2h0Kz1nLmhlaWdodC1BLmxhc3RBZHZhbmNlSGVpZ2h0O2FkZEZha2VTcGFjZXMoZy53aWR0aC1BLmxhc3RBZHZhbmNlV2lkdGgtKGcuaGVpZ2h0LUEubGFzdEFkdmFuY2VIZWlnaHQpLEEuc3RyKTticmVha31mbHVzaFRleHRDb250ZW50SXRlbSgpO0Muc2V0VGV4dE1hdHJpeChwWzBdLHBbMV0scFsyXSxwWzNdLHBbNF0scFs1XSk7Qy5zZXRUZXh0TGluZU1hdHJpeChwWzBdLHBbMV0scFsyXSxwWzNdLHBbNF0scFs1XSk7YnJlYWs7Y2FzZSBvLk9QUy5zZXRDaGFyU3BhY2luZzpDLmNoYXJTcGFjaW5nPXBbMF07YnJlYWs7Y2FzZSBvLk9QUy5zZXRXb3JkU3BhY2luZzpDLndvcmRTcGFjaW5nPXBbMF07YnJlYWs7Y2FzZSBvLk9QUy5iZWdpblRleHQ6Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtDLnRleHRNYXRyaXg9by5JREVOVElUWV9NQVRSSVguc2xpY2UoKTtDLnRleHRMaW5lTWF0cml4PW8uSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7YnJlYWs7Y2FzZSBvLk9QUy5zaG93U3BhY2VkVGV4dDppZighaC5zdGF0ZS5mb250KXtULmVuc3VyZVN0YXRlRm9udChoLnN0YXRlKTtjb250aW51ZX1mb3IodmFyIEUsTD1wWzBdLFU9MCxqPUwubGVuZ3RoO1U8ajtVKyspaWYoInN0cmluZyI9PXR5cGVvZiBMW1VdKWJ1aWxkVGV4dENvbnRlbnRJdGVtKExbVV0pO2Vsc2UgaWYoKDAsby5pc051bSkoTFtVXSkpe2Vuc3VyZVRleHRDb250ZW50SXRlbSgpO2c9TFtVXSpDLmZvbnRTaXplLzFlMzt2YXIgcT0hMTtpZihDLmZvbnQudmVydGljYWwpe0U9ZztDLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCxFKTsocT1BLnRleHRSdW5CcmVha0FsbG93ZWQmJmc+QS5mYWtlTXVsdGlTcGFjZU1heCl8fChBLmhlaWdodCs9RSl9ZWxzZXtFPShnPS1nKSpDLnRleHRIU2NhbGU7Qy50cmFuc2xhdGVUZXh0TWF0cml4KEUsMCk7KHE9QS50ZXh0UnVuQnJlYWtBbGxvd2VkJiZnPkEuZmFrZU11bHRpU3BhY2VNYXgpfHwoQS53aWR0aCs9RSl9cT9mbHVzaFRleHRDb250ZW50SXRlbSgpOmc+MCYmYWRkRmFrZVNwYWNlcyhnLEEuc3RyKX1icmVhaztjYXNlIG8uT1BTLnNob3dUZXh0OmlmKCFoLnN0YXRlLmZvbnQpe1QuZW5zdXJlU3RhdGVGb250KGguc3RhdGUpO2NvbnRpbnVlfWJ1aWxkVGV4dENvbnRlbnRJdGVtKHBbMF0pO2JyZWFrO2Nhc2Ugby5PUFMubmV4dExpbmVTaG93VGV4dDppZighaC5zdGF0ZS5mb250KXtULmVuc3VyZVN0YXRlRm9udChoLnN0YXRlKTtjb250aW51ZX1mbHVzaFRleHRDb250ZW50SXRlbSgpO0MuY2FycmlhZ2VSZXR1cm4oKTtidWlsZFRleHRDb250ZW50SXRlbShwWzBdKTticmVhaztjYXNlIG8uT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OmlmKCFoLnN0YXRlLmZvbnQpe1QuZW5zdXJlU3RhdGVGb250KGguc3RhdGUpO2NvbnRpbnVlfWZsdXNoVGV4dENvbnRlbnRJdGVtKCk7Qy53b3JkU3BhY2luZz1wWzBdO0MuY2hhclNwYWNpbmc9cFsxXTtDLmNhcnJpYWdlUmV0dXJuKCk7YnVpbGRUZXh0Q29udGVudEl0ZW0ocFsyXSk7YnJlYWs7Y2FzZSBvLk9QUy5wYWludFhPYmplY3Q6Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtJfHwoST1jLmdldCgiWE9iamVjdCIpfHxsLkRpY3QuZW1wdHkpO3ZhciBXPXBbMF0ubmFtZTtpZihXJiZQLmdldEJ5TmFtZShXKSlicmVhazthKG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe2lmKCFXKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTt2YXIgYT1JLmdldFJhdyhXKTtpZihhIGluc3RhbmNlb2YgbC5SZWYpe2lmKFAuZ2V0QnlSZWYoYSkpe3QoKTtyZXR1cm59YT1SLmZldGNoKGEpfWlmKCEoMCxsLmlzU3RyZWFtKShhKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgYmUgYSBzdHJlYW0iKTt2YXIgdT1hLmRpY3QuZ2V0KCJTdWJ0eXBlIik7aWYoISgwLGwuaXNOYW1lKSh1KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpO2lmKCJGb3JtIj09PXUubmFtZSl7dmFyIGQ9aC5zdGF0ZS5jbG9uZSgpLHA9bmV3IE0oZCksZz1hLmRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpO0FycmF5LmlzQXJyYXkoZykmJjY9PT1nLmxlbmd0aCYmcC50cmFuc2Zvcm0oZyk7ZW5xdWV1ZUNodW5rKCk7dmFyIHY9e2VucXVldWVJbnZva2VkOiExLGVucXVldWU6ZnVuY3Rpb24gZW5xdWV1ZSh0LHIpe3RoaXMuZW5xdWV1ZUludm9rZWQ9ITA7Yi5lbnF1ZXVlKHQscil9LGdldCBkZXNpcmVkU2l6ZSgpe3JldHVybiBiLmRlc2lyZWRTaXplfSxnZXQgcmVhZHkoKXtyZXR1cm4gYi5yZWFkeX19O1QuZ2V0VGV4dENvbnRlbnQoe3N0cmVhbTphLHRhc2s6aSxyZXNvdXJjZXM6YS5kaWN0LmdldCgiUmVzb3VyY2VzIil8fGMsc3RhdGVNYW5hZ2VyOnAsbm9ybWFsaXplV2hpdGVzcGFjZTptLGNvbWJpbmVUZXh0SXRlbXM6eSxzaW5rOnYsc2VlblN0eWxlczp3fSkudGhlbigoZnVuY3Rpb24oKXt2LmVucXVldWVJbnZva2VkfHxQLnNldChXLGEuZGljdC5vYmpJZCwhMCk7dCgpfSkscil9ZWxzZXtQLnNldChXLGEuZGljdC5vYmpJZCwhMCk7dCgpfX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2Ygby5BYm9ydEV4Y2VwdGlvbikpe2lmKCFULm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IHQ7KDAsby53YXJuKSgnZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBYT2JqZWN0OiAiJy5jb25jYXQodCwnIi4nKSl9fSkpKTtyZXR1cm47Y2FzZSBvLk9QUy5zZXRHU3RhdGU6aWYoKFc9cFswXS5uYW1lKSYmQi5nZXRCeU5hbWUoVykpYnJlYWs7YShuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxyKXtpZighVyl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTt2YXIgYT1jLmdldCgiRXh0R1N0YXRlIik7aWYoIShhIGluc3RhbmNlb2YgbC5EaWN0KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7dmFyIGk9YS5nZXQoVyk7aWYoIShpIGluc3RhbmNlb2YgbC5EaWN0KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7dmFyIHU9aS5nZXQoIkZvbnQiKTtpZih1KXtmbHVzaFRleHRDb250ZW50SXRlbSgpO0MuZm9udE5hbWU9bnVsbDtDLmZvbnRTaXplPXVbMV07aGFuZGxlU2V0Rm9udChudWxsLHVbMF0pLnRoZW4odCxyKX1lbHNle0Iuc2V0KFcsaS5vYmpJZCwhMCk7dCgpfX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2Ygby5BYm9ydEV4Y2VwdGlvbikpe2lmKCFULm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IHQ7KDAsby53YXJuKSgnZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICInLmNvbmNhdCh0LCciLicpKX19KSkpO3JldHVybn1pZih4Lml0ZW1zLmxlbmd0aD49Yi5kZXNpcmVkU2l6ZSl7dT0hMDticmVha319aWYodSlhKE8pO2Vsc2V7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtlbnF1ZXVlQ2h1bmsoKTt0KCl9fSkpLmNhdGNoKChmdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBvLkFib3J0RXhjZXB0aW9uKSl7aWYoIXIub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgdDsoMCxvLndhcm4pKCdnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIGVycm9ycyBkdXJpbmcgIicuY29uY2F0KGkubmFtZSwnIiAnKSsndGFzazogIicuY29uY2F0KHQsJyIuJykpO2ZsdXNoVGV4dENvbnRlbnRJdGVtKCk7ZW5xdWV1ZUNodW5rKCl9fSkpfX0se2tleToiZXh0cmFjdERhdGFTdHJ1Y3R1cmVzIix2YWx1ZTpmdW5jdGlvbiBleHRyYWN0RGF0YVN0cnVjdHVyZXModCxyLGEpe3ZhciBpLGM9dGhpcyxkPXRoaXMueHJlZixwPXQuZ2V0KCJUb1VuaWNvZGUiKXx8ci5nZXQoIlRvVW5pY29kZSIpLG09cD90aGlzLnJlYWRUb1VuaWNvZGUocCk6UHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7aWYoYS5jb21wb3NpdGUpe3ZhciBnPXQuZ2V0KCJDSURTeXN0ZW1JbmZvIik7KDAsbC5pc0RpY3QpKGcpJiYoYS5jaWRTeXN0ZW1JbmZvPXtyZWdpc3RyeTooMCxvLnN0cmluZ1RvUERGU3RyaW5nKShnLmdldCgiUmVnaXN0cnkiKSksb3JkZXJpbmc6KDAsby5zdHJpbmdUb1BERlN0cmluZykoZy5nZXQoIk9yZGVyaW5nIikpLHN1cHBsZW1lbnQ6Zy5nZXQoIlN1cHBsZW1lbnQiKX0pO3ZhciB5PXQuZ2V0KCJDSURUb0dJRE1hcCIpOygwLGwuaXNTdHJlYW0pKHkpJiYoaT15LmdldEJ5dGVzKCkpfXZhciBiLHY9W10sUz1udWxsO2lmKHQuaGFzKCJFbmNvZGluZyIpKXtiPXQuZ2V0KCJFbmNvZGluZyIpO2lmKCgwLGwuaXNEaWN0KShiKSl7Uz1iLmdldCgiQmFzZUVuY29kaW5nIik7Uz0oMCxsLmlzTmFtZSkoUyk/Uy5uYW1lOm51bGw7aWYoYi5oYXMoIkRpZmZlcmVuY2VzIikpZm9yKHZhciBrPWIuZ2V0KCJEaWZmZXJlbmNlcyIpLHc9MCxDPTAsXz1rLmxlbmd0aDtDPF87QysrKXt2YXIgeD1kLmZldGNoSWZSZWYoa1tDXSk7aWYoKDAsby5pc051bSkoeCkpdz14O2Vsc2V7aWYoISgwLGwuaXNOYW1lKSh4KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBlbnRyeSBpbiAnRGlmZmVyZW5jZXMnIGFycmF5OiAiLmNvbmNhdCh4KSk7dlt3KytdPXgubmFtZX19fWVsc2V7aWYoISgwLGwuaXNOYW1lKShiKSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiRW5jb2RpbmcgaXMgbm90IGEgTmFtZSBub3IgYSBEaWN0Iik7Uz1iLm5hbWV9Ik1hY1JvbWFuRW5jb2RpbmciIT09UyYmIk1hY0V4cGVydEVuY29kaW5nIiE9PVMmJiJXaW5BbnNpRW5jb2RpbmciIT09UyYmKFM9bnVsbCl9aWYoUylhLmRlZmF1bHRFbmNvZGluZz0oMCxoLmdldEVuY29kaW5nKShTKS5zbGljZSgpO2Vsc2V7dmFyIEE9ISEoYS5mbGFncyZ1LkZvbnRGbGFncy5TeW1ib2xpYyksVD0hIShhLmZsYWdzJnUuRm9udEZsYWdzLk5vbnN5bWJvbGljKTtiPWguU3RhbmRhcmRFbmNvZGluZzsiVHJ1ZVR5cGUiIT09YS50eXBlfHxUfHwoYj1oLldpbkFuc2lFbmNvZGluZyk7aWYoQSl7Yj1oLk1hY1JvbWFuRW5jb2Rpbmc7YS5maWxlfHwoL1N5bWJvbC9pLnRlc3QoYS5uYW1lKT9iPWguU3ltYm9sU2V0RW5jb2Rpbmc6L0RpbmdiYXRzfFdpbmdkaW5ncy9pLnRlc3QoYS5uYW1lKSYmKGI9aC5aYXBmRGluZ2JhdHNFbmNvZGluZykpfWEuZGVmYXVsdEVuY29kaW5nPWJ9YS5kaWZmZXJlbmNlcz12O2EuYmFzZUVuY29kaW5nTmFtZT1TO2EuaGFzRW5jb2Rpbmc9ISFTfHx2Lmxlbmd0aD4wO2EuZGljdD10O3JldHVybiBtLnRoZW4oKGZ1bmN0aW9uKHQpe2EudG9Vbmljb2RlPXQ7cmV0dXJuIGMuYnVpbGRUb1VuaWNvZGUoYSl9KSkudGhlbigoZnVuY3Rpb24odCl7YS50b1VuaWNvZGU9dDtpJiYoYS5jaWRUb0dpZE1hcD1jLnJlYWRDaWRUb0dpZE1hcChpLHQpKTtyZXR1cm4gYX0pKX19LHtrZXk6Il9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUiLHZhbHVlOmZ1bmN0aW9uIF9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUodCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTsoMCxvLmFzc2VydCkoIXQuY29tcG9zaXRlLCJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7dmFyIGE9W10saT10LmRlZmF1bHRFbmNvZGluZy5zbGljZSgpLGM9dC5iYXNlRW5jb2RpbmdOYW1lLGw9dC5kaWZmZXJlbmNlcztmb3IodmFyIGQgaW4gbCl7dmFyIG09bFtkXTsiLm5vdGRlZiIhPT1tJiYoaVtkXT1tKX12YXIgZz0oMCxDLmdldEdseXBoc1VuaWNvZGUpKCk7Zm9yKHZhciB5IGluIGkpe3ZhciBiPWlbeV07aWYoIiIhPT1iKWlmKHZvaWQgMCE9PWdbYl0pYVt5XT1TdHJpbmcuZnJvbUNoYXJDb2RlKGdbYl0pO2Vsc2V7dmFyIHY9MDtzd2l0Y2goYlswXSl7Y2FzZSJHIjozPT09Yi5sZW5ndGgmJih2PXBhcnNlSW50KGIuc3Vic3RyaW5nKDEpLDE2KSk7YnJlYWs7Y2FzZSJnIjo1PT09Yi5sZW5ndGgmJih2PXBhcnNlSW50KGIuc3Vic3RyaW5nKDEpLDE2KSk7YnJlYWs7Y2FzZSJDIjpjYXNlImMiOmlmKGIubGVuZ3RoPj0zJiZiLmxlbmd0aDw9NCl7dmFyIFM9Yi5zdWJzdHJpbmcoMSk7aWYocil7dj1wYXJzZUludChTLDE2KTticmVha312PStTO2lmKE51bWJlci5pc05hTih2KSYmTnVtYmVyLmlzSW50ZWdlcihwYXJzZUludChTLDE2KSkpcmV0dXJuIHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZSh0LCEwKX1icmVhaztkZWZhdWx0OnZhciBrPSgwLHAuZ2V0VW5pY29kZUZvckdseXBoKShiLGcpOy0xIT09ayYmKHY9ayl9aWYodj4wJiZ2PD0xMTE0MTExJiZOdW1iZXIuaXNJbnRlZ2VyKHYpKXtpZihjJiZ2PT09K3kpe3ZhciB3PSgwLGguZ2V0RW5jb2RpbmcpKGMpO2lmKHcmJihiPXdbeV0pKXthW3ldPVN0cmluZy5mcm9tQ2hhckNvZGUoZ1tiXSk7Y29udGludWV9fWFbeV09U3RyaW5nLmZyb21Db2RlUG9pbnQodil9fX1yZXR1cm4gbmV3IHUuVG9Vbmljb2RlTWFwKGEpfX0se2tleToiYnVpbGRUb1VuaWNvZGUiLHZhbHVlOmZ1bmN0aW9uIGJ1aWxkVG9Vbmljb2RlKHQpe3QuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXA9ISF0LnRvVW5pY29kZSYmdC50b1VuaWNvZGUubGVuZ3RoPjA7aWYodC5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCl7IXQuY29tcG9zaXRlJiZ0Lmhhc0VuY29kaW5nJiYodC5mYWxsYmFja1RvVW5pY29kZT10aGlzLl9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUodCkpO3JldHVybiBQcm9taXNlLnJlc29sdmUodC50b1VuaWNvZGUpfWlmKCF0LmNvbXBvc2l0ZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZSh0KSk7aWYodC5jb21wb3NpdGUmJih0LmNNYXAuYnVpbHRJbkNNYXAmJiEodC5jTWFwIGluc3RhbmNlb2YgYy5JZGVudGl0eUNNYXApfHwiQWRvYmUiPT09dC5jaWRTeXN0ZW1JbmZvLnJlZ2lzdHJ5JiYoIkdCMSI9PT10LmNpZFN5c3RlbUluZm8ub3JkZXJpbmd8fCJDTlMxIj09PXQuY2lkU3lzdGVtSW5mby5vcmRlcmluZ3x8IkphcGFuMSI9PT10LmNpZFN5c3RlbUluZm8ub3JkZXJpbmd8fCJLb3JlYTEiPT09dC5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nKSkpe3ZhciByPXQuY2lkU3lzdGVtSW5mby5yZWdpc3RyeSxhPXQuY2lkU3lzdGVtSW5mby5vcmRlcmluZyxpPWwuTmFtZS5nZXQocisiLSIrYSsiLVVDUzIiKTtyZXR1cm4gYy5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOmksZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSkudGhlbigoZnVuY3Rpb24ocil7dmFyIGE9dC5jTWFwLGk9W107YS5mb3JFYWNoKChmdW5jdGlvbih0LGEpe2lmKGE+NjU1MzUpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzUiKTt2YXIgYz1yLmxvb2t1cChhKTtjJiYoaVt0XT1TdHJpbmcuZnJvbUNoYXJDb2RlKChjLmNoYXJDb2RlQXQoMCk8PDgpK2MuY2hhckNvZGVBdCgxKSkpfSkpO3JldHVybiBuZXcgdS5Ub1VuaWNvZGVNYXAoaSl9KSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgdS5JZGVudGl0eVRvVW5pY29kZU1hcCh0LmZpcnN0Q2hhcix0Lmxhc3RDaGFyKSl9fSx7a2V5OiJyZWFkVG9Vbmljb2RlIix2YWx1ZTpmdW5jdGlvbiByZWFkVG9Vbmljb2RlKHQpe3ZhciByPXRoaXMsYT10O3JldHVybigwLGwuaXNOYW1lKShhKT9jLkNNYXBGYWN0b3J5LmNyZWF0ZSh7ZW5jb2Rpbmc6YSxmZXRjaEJ1aWx0SW5DTWFwOnRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCx1c2VDTWFwOm51bGx9KS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGMuSWRlbnRpdHlDTWFwP25ldyB1LklkZW50aXR5VG9Vbmljb2RlTWFwKDAsNjU1MzUpOm5ldyB1LlRvVW5pY29kZU1hcCh0LmdldE1hcCgpKX0pKTooMCxsLmlzU3RyZWFtKShhKT9jLkNNYXBGYWN0b3J5LmNyZWF0ZSh7ZW5jb2Rpbmc6YSxmZXRjaEJ1aWx0SW5DTWFwOnRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCx1c2VDTWFwOm51bGx9KS50aGVuKChmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgYy5JZGVudGl0eUNNYXApcmV0dXJuIG5ldyB1LklkZW50aXR5VG9Vbmljb2RlTWFwKDAsNjU1MzUpO3ZhciByPW5ldyBBcnJheSh0Lmxlbmd0aCk7dC5mb3JFYWNoKChmdW5jdGlvbih0LGEpe2Zvcih2YXIgaT1bXSxvPTA7bzxhLmxlbmd0aDtvKz0yKXt2YXIgYz1hLmNoYXJDb2RlQXQobyk8PDh8YS5jaGFyQ29kZUF0KG8rMSk7aWYoNTUyOTY9PSg2MzQ4OCZjKSl7bys9Mjt2YXIgbD1hLmNoYXJDb2RlQXQobyk8PDh8YS5jaGFyQ29kZUF0KG8rMSk7aS5wdXNoKCgoMTAyMyZjKTw8MTApKygxMDIzJmwpKzY1NTM2KX1lbHNlIGkucHVzaChjKX1yW3RdPVN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZyxpKX0pKTtyZXR1cm4gbmV3IHUuVG9Vbmljb2RlTWFwKHIpfSksKGZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBvLkFib3J0RXhjZXB0aW9uKXJldHVybiBudWxsO2lmKHIub3B0aW9ucy5pZ25vcmVFcnJvcnMpe3IuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHtmZWF0dXJlSWQ6by5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRUb1VuaWNvZGV9KTsoMCxvLndhcm4pKCdyZWFkVG9Vbmljb2RlIC0gaWdub3JpbmcgVG9Vbmljb2RlIGRhdGE6ICInLmNvbmNhdCh0LCciLicpKTtyZXR1cm4gbnVsbH10aHJvdyB0fSkpOlByb21pc2UucmVzb2x2ZShudWxsKX19LHtrZXk6InJlYWRDaWRUb0dpZE1hcCIsdmFsdWU6ZnVuY3Rpb24gcmVhZENpZFRvR2lkTWFwKHQscil7Zm9yKHZhciBhPVtdLGk9MCxvPXQubGVuZ3RoO2k8bztpKyspe3ZhciBjPXRbaSsrXTw8OHx0W2ldLGw9aT4+MTsoMCE9PWN8fHIuaGFzKGwpKSYmKGFbbF09Yyl9cmV0dXJuIGF9fSx7a2V5OiJleHRyYWN0V2lkdGhzIix2YWx1ZTpmdW5jdGlvbiBleHRyYWN0V2lkdGhzKHQscixhKXt2YXIgaSxvLGMsaCxkLHAsbSxnLHk9dGhpcy54cmVmLGI9W10sdj0wLFM9W107aWYoYS5jb21wb3NpdGUpe3Y9dC5oYXMoIkRXIik/dC5nZXQoIkRXIik6MWUzO2lmKGc9dC5nZXQoIlciKSlmb3Iobz0wLGM9Zy5sZW5ndGg7bzxjO28rKyl7cD15LmZldGNoSWZSZWYoZ1tvKytdKTttPXkuZmV0Y2hJZlJlZihnW29dKTtpZihBcnJheS5pc0FycmF5KG0pKWZvcihoPTAsZD1tLmxlbmd0aDtoPGQ7aCsrKWJbcCsrXT15LmZldGNoSWZSZWYobVtoXSk7ZWxzZXt2YXIgaz15LmZldGNoSWZSZWYoZ1srK29dKTtmb3IoaD1wO2g8PW07aCsrKWJbaF09a319aWYoYS52ZXJ0aWNhbCl7dmFyIHc9dC5nZXRBcnJheSgiRFcyIil8fFs4ODAsLTFlM107aT1bd1sxXSwuNSp2LHdbMF1dO2lmKHc9dC5nZXQoIlcyIikpZm9yKG89MCxjPXcubGVuZ3RoO288YztvKyspe3A9eS5mZXRjaElmUmVmKHdbbysrXSk7bT15LmZldGNoSWZSZWYod1tvXSk7aWYoQXJyYXkuaXNBcnJheShtKSlmb3IoaD0wLGQ9bS5sZW5ndGg7aDxkO2grKylTW3ArK109W3kuZmV0Y2hJZlJlZihtW2grK10pLHkuZmV0Y2hJZlJlZihtW2grK10pLHkuZmV0Y2hJZlJlZihtW2hdKV07ZWxzZXt2YXIgQz1beS5mZXRjaElmUmVmKHdbKytvXSkseS5mZXRjaElmUmVmKHdbKytvXSkseS5mZXRjaElmUmVmKHdbKytvXSldO2ZvcihoPXA7aDw9bTtoKyspU1toXT1DfX19fWVsc2V7dmFyIF89YS5maXJzdENoYXI7aWYoZz10LmdldCgiV2lkdGhzIikpe2g9Xztmb3Iobz0wLGM9Zy5sZW5ndGg7bzxjO28rKyliW2grK109eS5mZXRjaElmUmVmKGdbb10pO3Y9cGFyc2VGbG9hdChyLmdldCgiTWlzc2luZ1dpZHRoIikpfHwwfWVsc2V7dmFyIHg9dC5nZXQoIkJhc2VGb250Iik7aWYoKDAsbC5pc05hbWUpKHgpKXt2YXIgQT10aGlzLmdldEJhc2VGb250TWV0cmljcyh4Lm5hbWUpO2I9dGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChBLndpZHRocyxhKTt2PUEuZGVmYXVsdFdpZHRofX19dmFyIFQ9ITAsUj12O2Zvcih2YXIgSSBpbiBiKXt2YXIgUD1iW0ldO2lmKFApaWYoUil7aWYoUiE9PVApe1Q9ITE7YnJlYWt9fWVsc2UgUj1QfVQmJihhLmZsYWdzfD11LkZvbnRGbGFncy5GaXhlZFBpdGNoKTthLmRlZmF1bHRXaWR0aD12O2Eud2lkdGhzPWI7YS5kZWZhdWx0Vk1ldHJpY3M9aTthLnZtZXRyaWNzPVN9fSx7a2V5OiJpc1NlcmlmRm9udCIsdmFsdWU6ZnVuY3Rpb24gaXNTZXJpZkZvbnQodCl7dmFyIHI9dC5zcGxpdCgiLSIpWzBdO3JldHVybiByIGluKDAsbS5nZXRTZXJpZkZvbnRzKSgpfHwtMSE9PXIuc2VhcmNoKC9zZXJpZi9naSl9fSx7a2V5OiJnZXRCYXNlRm9udE1ldHJpY3MiLHZhbHVlOmZ1bmN0aW9uIGdldEJhc2VGb250TWV0cmljcyh0KXt2YXIgcj0wLGE9W10saT0hMSxjPSgwLG0uZ2V0U3RkRm9udE1hcCkoKVt0XXx8dCxsPSgwLF8uZ2V0TWV0cmljcykoKTtjIGluIGx8fChjPXRoaXMuaXNTZXJpZkZvbnQodCk/IlRpbWVzLVJvbWFuIjoiSGVsdmV0aWNhIik7dmFyIHU9bFtjXTtpZigoMCxvLmlzTnVtKSh1KSl7cj11O2k9ITB9ZWxzZSBhPXUoKTtyZXR1cm57ZGVmYXVsdFdpZHRoOnIsbW9ub3NwYWNlOmksd2lkdGhzOmF9fX0se2tleToiYnVpbGRDaGFyQ29kZVRvV2lkdGgiLHZhbHVlOmZ1bmN0aW9uIGJ1aWxkQ2hhckNvZGVUb1dpZHRoKHQscil7Zm9yKHZhciBhPU9iamVjdC5jcmVhdGUobnVsbCksaT1yLmRpZmZlcmVuY2VzLG89ci5kZWZhdWx0RW5jb2RpbmcsYz0wO2M8MjU2O2MrKyljIGluIGkmJnRbaVtjXV0/YVtjXT10W2lbY11dOmMgaW4gbyYmdFtvW2NdXSYmKGFbY109dFtvW2NdXSk7cmV0dXJuIGF9fSx7a2V5OiJwcmVFdmFsdWF0ZUZvbnQiLHZhbHVlOmZ1bmN0aW9uIHByZUV2YWx1YXRlRm9udCh0KXt2YXIgcj10LGE9dC5nZXQoIlN1YnR5cGUiKTtpZighKDAsbC5pc05hbWUpKGEpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpO3ZhciBpLGM9ITE7aWYoIlR5cGUwIj09PWEubmFtZSl7dmFyIHU9dC5nZXQoIkRlc2NlbmRhbnRGb250cyIpO2lmKCF1KXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnRzIGFyZSBub3Qgc3BlY2lmaWVkIik7YT0odD1BcnJheS5pc0FycmF5KHUpP3RoaXMueHJlZi5mZXRjaElmUmVmKHVbMF0pOnUpLmdldCgiU3VidHlwZSIpO2lmKCEoMCxsLmlzTmFtZSkoYSkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7Yz0hMH12YXIgaD10LmdldCgiRm9udERlc2NyaXB0b3IiKTtpZihoKXt2YXIgZD1uZXcgeC5NdXJtdXJIYXNoM182NCxwPXIuZ2V0UmF3KCJFbmNvZGluZyIpO2lmKCgwLGwuaXNOYW1lKShwKSlkLnVwZGF0ZShwLm5hbWUpO2Vsc2UgaWYoKDAsbC5pc1JlZikocCkpZC51cGRhdGUocC50b1N0cmluZygpKTtlbHNlIGlmKCgwLGwuaXNEaWN0KShwKSl7dmFyIG0sZz1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihwLmdldFJhd1ZhbHVlcygpKTt0cnl7Zm9yKGcucygpOyEobT1nLm4oKSkuZG9uZTspe3ZhciB5PW0udmFsdWU7aWYoKDAsbC5pc05hbWUpKHkpKWQudXBkYXRlKHkubmFtZSk7ZWxzZSBpZigoMCxsLmlzUmVmKSh5KSlkLnVwZGF0ZSh5LnRvU3RyaW5nKCkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh5KSl7Zm9yKHZhciBiPXkubGVuZ3RoLHY9bmV3IEFycmF5KGIpLFM9MDtTPGI7UysrKXt2YXIgaz15W1NdOygwLGwuaXNOYW1lKShrKT92W1NdPWsubmFtZTooKDAsby5pc051bSkoayl8fCgwLGwuaXNSZWYpKGspKSYmKHZbU109ay50b1N0cmluZygpKX1kLnVwZGF0ZSh2LmpvaW4oKSl9fX1jYXRjaCh0KXtnLmUodCl9ZmluYWxseXtnLmYoKX19dmFyIHc9dC5nZXQoIkZpcnN0Q2hhciIpfHwwLEM9dC5nZXQoIkxhc3RDaGFyIil8fChjPzY1NTM1OjI1NSk7ZC51cGRhdGUoIiIuY29uY2F0KHcsIi0iKS5jb25jYXQoQykpO3ZhciBfPXQuZ2V0KCJUb1VuaWNvZGUiKXx8ci5nZXQoIlRvVW5pY29kZSIpO2lmKCgwLGwuaXNTdHJlYW0pKF8pKXt2YXIgQT1fLnN0cnx8XztpPUEuYnVmZmVyP25ldyBVaW50OEFycmF5KEEuYnVmZmVyLmJ1ZmZlciwwLEEuYnVmZmVyTGVuZ3RoKTpuZXcgVWludDhBcnJheShBLmJ5dGVzLmJ1ZmZlcixBLnN0YXJ0LEEuZW5kLUEuc3RhcnQpO2QudXBkYXRlKGkpfWVsc2UoMCxsLmlzTmFtZSkoXykmJmQudXBkYXRlKF8ubmFtZSk7dmFyIFQ9dC5nZXQoIldpZHRocyIpfHxyLmdldCgiV2lkdGhzIik7aWYoVCl7aT1uZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoVCkuYnVmZmVyKTtkLnVwZGF0ZShpKX19cmV0dXJue2Rlc2NyaXB0b3I6aCxkaWN0OnQsYmFzZURpY3Q6cixjb21wb3NpdGU6Yyx0eXBlOmEubmFtZSxoYXNoOmQ/ZC5oZXhkaWdlc3QoKToiIn19fSx7a2V5OiJ0cmFuc2xhdGVGb250Iix2YWx1ZTpmdW5jdGlvbiB0cmFuc2xhdGVGb250KHQpe3ZhciByLGE9dGhpcyxpPXQuYmFzZURpY3QsaD10LmRpY3QsZD10LmNvbXBvc2l0ZSxwPXQuZGVzY3JpcHRvcixnPXQudHlwZSx5PWQ/NjU1MzU6MjU1LGI9aC5nZXQoIkZpcnN0Q2hhciIpfHwwLHY9aC5nZXQoIkxhc3RDaGFyIil8fHk7aWYoIXApe2lmKCJUeXBlMyIhPT1nKXt2YXIgUz1oLmdldCgiQmFzZUZvbnQiKTtpZighKDAsbC5pc05hbWUpKFMpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJCYXNlIGZvbnQgaXMgbm90IHNwZWNpZmllZCIpO1M9Uy5uYW1lLnJlcGxhY2UoL1ssX10vZywiLSIpO3ZhciBrPXRoaXMuZ2V0QmFzZUZvbnRNZXRyaWNzKFMpLHc9Uy5zcGxpdCgiLSIpWzBdLEM9KHRoaXMuaXNTZXJpZkZvbnQodyk/dS5Gb250RmxhZ3MuU2VyaWY6MCl8KGsubW9ub3NwYWNlP3UuRm9udEZsYWdzLkZpeGVkUGl0Y2g6MCl8KCgwLG0uZ2V0U3ltYm9sc0ZvbnRzKSgpW3ddP3UuRm9udEZsYWdzLlN5bWJvbGljOnUuRm9udEZsYWdzLk5vbnN5bWJvbGljKTtyPXt0eXBlOmcsbmFtZTpTLHdpZHRoczprLndpZHRocyxkZWZhdWx0V2lkdGg6ay5kZWZhdWx0V2lkdGgsZmxhZ3M6QyxmaXJzdENoYXI6YixsYXN0Q2hhcjp2fTt2YXIgXz1oLmdldCgiV2lkdGhzIik7cmV0dXJuIHRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGgsaCxyKS50aGVuKChmdW5jdGlvbih0KXtpZihfKXtmb3IodmFyIHI9W10saT1iLG89MCxjPV8ubGVuZ3RoO288YztvKyspcltpKytdPWEueHJlZi5mZXRjaElmUmVmKF9bb10pO3Qud2lkdGhzPXJ9ZWxzZSB0LndpZHRocz1hLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKGsud2lkdGhzLHQpO3JldHVybiBuZXcgdS5Gb250KFMsbnVsbCx0KX0pKX0ocD1uZXcgbC5EaWN0KG51bGwpKS5zZXQoIkZvbnROYW1lIixsLk5hbWUuZ2V0KGcpKTtwLnNldCgiRm9udEJCb3giLGguZ2V0QXJyYXkoIkZvbnRCQm94Iil8fFswLDAsMCwwXSl9dmFyIHg9cC5nZXQoIkZvbnROYW1lIiksQT1oLmdldCgiQmFzZUZvbnQiKTsoMCxvLmlzU3RyaW5nKSh4KSYmKHg9bC5OYW1lLmdldCh4KSk7KDAsby5pc1N0cmluZykoQSkmJihBPWwuTmFtZS5nZXQoQSkpO2lmKCJUeXBlMyIhPT1nKXt2YXIgVD14JiZ4Lm5hbWUsUj1BJiZBLm5hbWU7aWYoVCE9PVIpeygwLG8uaW5mbykoIlRoZSBGb250RGVzY3JpcHRvcidzIEZvbnROYW1lIGlzIFwiIi5jb25jYXQoVCwnIiBidXQgJykrInNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRm9udCdzIEJhc2VGb250IFwiIi5jb25jYXQoUiwnIi4nKSk7VCYmUiYmUi5zdGFydHNXaXRoKFQpJiYoeD1BKX19eD14fHxBO2lmKCEoMCxsLmlzTmFtZSkoeCkpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBuYW1lIik7dmFyIEksUD1wLmdldCgiRm9udEZpbGUiLCJGb250RmlsZTIiLCJGb250RmlsZTMiKTtpZihQJiZQLmRpY3Qpe3ZhciBPPVAuZGljdC5nZXQoIlN1YnR5cGUiKTtPJiYoTz1PLm5hbWUpO3ZhciBFPVAuZGljdC5nZXQoIkxlbmd0aDEiKSxCPVAuZGljdC5nZXQoIkxlbmd0aDIiKSxEPVAuZGljdC5nZXQoIkxlbmd0aDMiKX1yPXt0eXBlOmcsbmFtZTp4Lm5hbWUsc3VidHlwZTpPLGZpbGU6UCxsZW5ndGgxOkUsbGVuZ3RoMjpCLGxlbmd0aDM6RCxsb2FkZWROYW1lOmkubG9hZGVkTmFtZSxjb21wb3NpdGU6ZCxmaXhlZFBpdGNoOiExLGZvbnRNYXRyaXg6aC5nZXRBcnJheSgiRm9udE1hdHJpeCIpfHxvLkZPTlRfSURFTlRJVFlfTUFUUklYLGZpcnN0Q2hhcjpifHwwLGxhc3RDaGFyOnZ8fHksYmJveDpwLmdldEFycmF5KCJGb250QkJveCIpLGFzY2VudDpwLmdldCgiQXNjZW50IiksZGVzY2VudDpwLmdldCgiRGVzY2VudCIpLHhIZWlnaHQ6cC5nZXQoIlhIZWlnaHQiKSxjYXBIZWlnaHQ6cC5nZXQoIkNhcEhlaWdodCIpLGZsYWdzOnAuZ2V0KCJGbGFncyIpLGl0YWxpY0FuZ2xlOnAuZ2V0KCJJdGFsaWNBbmdsZSIpLGlzVHlwZTNGb250OiExfTtpZihkKXt2YXIgTT1pLmdldCgiRW5jb2RpbmciKTsoMCxsLmlzTmFtZSkoTSkmJihyLmNpZEVuY29kaW5nPU0ubmFtZSk7ST1jLkNNYXBGYWN0b3J5LmNyZWF0ZSh7ZW5jb2Rpbmc6TSxmZXRjaEJ1aWx0SW5DTWFwOnRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCx1c2VDTWFwOm51bGx9KS50aGVuKChmdW5jdGlvbih0KXtyLmNNYXA9dDtyLnZlcnRpY2FsPXIuY01hcC52ZXJ0aWNhbH0pKX1lbHNlIEk9UHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7cmV0dXJuIEkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gYS5leHRyYWN0RGF0YVN0cnVjdHVyZXMoaCxpLHIpfSkpLnRoZW4oKGZ1bmN0aW9uKHQpe2EuZXh0cmFjdFdpZHRocyhoLHAsdCk7IlR5cGUzIj09PWcmJih0LmlzVHlwZTNGb250PSEwKTtyZXR1cm4gbmV3IHUuRm9udCh4Lm5hbWUsUCx0KX0pKX19LHtrZXk6Il9wZGZGdW5jdGlvbkZhY3RvcnkiLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD1uZXcgeS5QREZGdW5jdGlvbkZhY3Rvcnkoe3hyZWY6dGhpcy54cmVmLGlzRXZhbFN1cHBvcnRlZDp0aGlzLm9wdGlvbnMuaXNFdmFsU3VwcG9ydGVkfSk7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsIl9wZGZGdW5jdGlvbkZhY3RvcnkiLHQpfX1dLFt7a2V5OiJidWlsZEZvbnRQYXRocyIsdmFsdWU6ZnVuY3Rpb24gYnVpbGRGb250UGF0aHModCxyLGEpe2Z1bmN0aW9uIGJ1aWxkUGF0aChyKXt0LnJlbmRlcmVyLmhhc0J1aWx0UGF0aChyKXx8YS5zZW5kKCJjb21tb25vYmoiLFsiIi5jb25jYXQodC5sb2FkZWROYW1lLCJfcGF0aF8iKS5jb25jYXQociksIkZvbnRQYXRoIix0LnJlbmRlcmVyLmdldFBhdGhKcyhyKV0pfXZhciBpLG89X2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocik7dHJ5e2ZvcihvLnMoKTshKGk9by5uKCkpLmRvbmU7KXt2YXIgYz1pLnZhbHVlO2J1aWxkUGF0aChjLmZvbnRDaGFyKTt2YXIgbD1jLmFjY2VudDtsJiZsLmZvbnRDaGFyJiZidWlsZFBhdGgobC5mb250Q2hhcil9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX19LHtrZXk6ImZhbGxiYWNrRm9udERpY3QiLGdldDpmdW5jdGlvbiBnZXQoKXt2YXIgdD1uZXcgbC5EaWN0O3Quc2V0KCJCYXNlRm9udCIsbC5OYW1lLmdldCgiUERGSlMtRmFsbGJhY2tGb250IikpO3Quc2V0KCJUeXBlIixsLk5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7dC5zZXQoIlN1YnR5cGUiLGwuTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTt0LnNldCgiRW5jb2RpbmciLGwuTmFtZS5nZXQoIldpbkFuc2lFbmNvZGluZyIpKTtyZXR1cm4oMCxvLnNoYWRvdykodGhpcywiZmFsbGJhY2tGb250RGljdCIsdCl9fV0pO3ZhciB0LHIsYSxiLEIsajtyZXR1cm4gUGFydGlhbEV2YWx1YXRvcn0oKTtyLlBhcnRpYWxFdmFsdWF0b3I9Qjt2YXIgRD1mdW5jdGlvbigpe2Z1bmN0aW9uIFRyYW5zbGF0ZWRGb250KHQpe3ZhciByPXQubG9hZGVkTmFtZSxhPXQuZm9udCxpPXQuZGljdCxvPXQuZXh0cmFQcm9wZXJ0aWVzLGM9dm9pZCAwIT09byYmbztfY2xhc3NDYWxsQ2hlY2sodGhpcyxUcmFuc2xhdGVkRm9udCk7dGhpcy5sb2FkZWROYW1lPXI7dGhpcy5mb250PWE7dGhpcy5kaWN0PWk7dGhpcy5fZXh0cmFQcm9wZXJ0aWVzPWM7dGhpcy50eXBlM0xvYWRlZD1udWxsO3RoaXMudHlwZTNEZXBlbmRlbmNpZXM9YS5pc1R5cGUzRm9udD9uZXcgU2V0Om51bGw7dGhpcy5zZW50PSExfV9jcmVhdGVDbGFzcyhUcmFuc2xhdGVkRm9udCxbe2tleToic2VuZCIsdmFsdWU6ZnVuY3Rpb24gc2VuZCh0KXtpZighdGhpcy5zZW50KXt0aGlzLnNlbnQ9ITA7dC5zZW5kKCJjb21tb25vYmoiLFt0aGlzLmxvYWRlZE5hbWUsIkZvbnQiLHRoaXMuZm9udC5leHBvcnREYXRhKHRoaXMuX2V4dHJhUHJvcGVydGllcyldKX19fSx7a2V5OiJmYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24gZmFsbGJhY2sodCl7aWYodGhpcy5mb250LmRhdGEpe3RoaXMuZm9udC5kaXNhYmxlRm9udEZhY2U9ITA7dmFyIHI9dGhpcy5mb250LmdseXBoQ2FjaGVWYWx1ZXM7Qi5idWlsZEZvbnRQYXRocyh0aGlzLmZvbnQscix0KX19fSx7a2V5OiJsb2FkVHlwZTNEYXRhIix2YWx1ZTpmdW5jdGlvbiBsb2FkVHlwZTNEYXRhKHQscixhKXtpZih0aGlzLnR5cGUzTG9hZGVkKXJldHVybiB0aGlzLnR5cGUzTG9hZGVkO2lmKCF0aGlzLmZvbnQuaXNUeXBlM0ZvbnQpdGhyb3cgbmV3IEVycm9yKCJNdXN0IGJlIGEgVHlwZTMgZm9udC4iKTt2YXIgaT1PYmplY3QuY3JlYXRlKHQub3B0aW9ucyk7aS5pZ25vcmVFcnJvcnM9ITE7dmFyIGM9dC5jbG9uZShpKTtjLnBhcnNpbmdUeXBlM0ZvbnQ9ITA7dmFyIGwsdT10aGlzLmZvbnQsaD10aGlzLnR5cGUzRGVwZW5kZW5jaWVzLGQ9UHJvbWlzZS5yZXNvbHZlKCkscD10aGlzLmRpY3QuZ2V0KCJDaGFyUHJvY3MiKSxtPXRoaXMuZGljdC5nZXQoIlJlc291cmNlcyIpfHxyLGc9T2JqZWN0LmNyZWF0ZShudWxsKSx5PV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHAuZ2V0S2V5cygpKTt0cnl7dmFyIGI9ZnVuY3Rpb24gX2xvb3AyKCl7dmFyIHQ9bC52YWx1ZTtkPWQudGhlbigoZnVuY3Rpb24oKXt2YXIgcj1wLmdldCh0KSxpPW5ldyBBLk9wZXJhdG9yTGlzdDtyZXR1cm4gYy5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpyLHRhc2s6YSxyZXNvdXJjZXM6bSxvcGVyYXRvckxpc3Q6aX0pLnRoZW4oKGZ1bmN0aW9uKCl7Z1t0XT1pLmdldElSKCk7dmFyIHIsYT1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpLmRlcGVuZGVuY2llcyk7dHJ5e2ZvcihhLnMoKTshKHI9YS5uKCkpLmRvbmU7KXt2YXIgbz1yLnZhbHVlO2guYWRkKG8pfX1jYXRjaCh0KXthLmUodCl9ZmluYWxseXthLmYoKX19KSkuY2F0Y2goKGZ1bmN0aW9uKHIpeygwLG8ud2FybikoJ1R5cGUzIGZvbnQgcmVzb3VyY2UgIicuY29uY2F0KHQsJyIgaXMgbm90IGF2YWlsYWJsZS4nKSk7dmFyIGE9bmV3IEEuT3BlcmF0b3JMaXN0O2dbdF09YS5nZXRJUigpfSkpfSkpfTtmb3IoeS5zKCk7IShsPXkubigpKS5kb25lOyliKCl9Y2F0Y2godCl7eS5lKHQpfWZpbmFsbHl7eS5mKCl9dGhpcy50eXBlM0xvYWRlZD1kLnRoZW4oKGZ1bmN0aW9uKCl7dS5jaGFyUHJvY09wZXJhdG9yTGlzdD1nfSkpO3JldHVybiB0aGlzLnR5cGUzTG9hZGVkfX1dKTtyZXR1cm4gVHJhbnNsYXRlZEZvbnR9KCksTT1mdW5jdGlvbigpe2Z1bmN0aW9uIFN0YXRlTWFuYWdlcih0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTdGF0ZU1hbmFnZXIpO3RoaXMuc3RhdGU9dDt0aGlzLnN0YXRlU3RhY2s9W119X2NyZWF0ZUNsYXNzKFN0YXRlTWFuYWdlcixbe2tleToic2F2ZSIsdmFsdWU6ZnVuY3Rpb24gc2F2ZSgpe3ZhciB0PXRoaXMuc3RhdGU7dGhpcy5zdGF0ZVN0YWNrLnB1c2godGhpcy5zdGF0ZSk7dGhpcy5zdGF0ZT10LmNsb25lKCl9fSx7a2V5OiJyZXN0b3JlIix2YWx1ZTpmdW5jdGlvbiByZXN0b3JlKCl7dmFyIHQ9dGhpcy5zdGF0ZVN0YWNrLnBvcCgpO3QmJih0aGlzLnN0YXRlPXQpfX0se2tleToidHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiB0cmFuc2Zvcm0odCl7dGhpcy5zdGF0ZS5jdG09by5VdGlsLnRyYW5zZm9ybSh0aGlzLnN0YXRlLmN0bSx0KX19XSk7cmV0dXJuIFN0YXRlTWFuYWdlcn0oKSxMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gVGV4dFN0YXRlKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsVGV4dFN0YXRlKTt0aGlzLmN0bT1uZXcgRmxvYXQzMkFycmF5KG8uSURFTlRJVFlfTUFUUklYKTt0aGlzLmZvbnROYW1lPW51bGw7dGhpcy5mb250U2l6ZT0wO3RoaXMuZm9udD1udWxsO3RoaXMuZm9udE1hdHJpeD1vLkZPTlRfSURFTlRJVFlfTUFUUklYO3RoaXMudGV4dE1hdHJpeD1vLklERU5USVRZX01BVFJJWC5zbGljZSgpO3RoaXMudGV4dExpbmVNYXRyaXg9by5JREVOVElUWV9NQVRSSVguc2xpY2UoKTt0aGlzLmNoYXJTcGFjaW5nPTA7dGhpcy53b3JkU3BhY2luZz0wO3RoaXMubGVhZGluZz0wO3RoaXMudGV4dEhTY2FsZT0xO3RoaXMudGV4dFJpc2U9MH1fY3JlYXRlQ2xhc3MoVGV4dFN0YXRlLFt7a2V5OiJzZXRUZXh0TWF0cml4Iix2YWx1ZTpmdW5jdGlvbiBzZXRUZXh0TWF0cml4KHQscixhLGksbyxjKXt2YXIgbD10aGlzLnRleHRNYXRyaXg7bFswXT10O2xbMV09cjtsWzJdPWE7bFszXT1pO2xbNF09bztsWzVdPWN9fSx7a2V5OiJzZXRUZXh0TGluZU1hdHJpeCIsdmFsdWU6ZnVuY3Rpb24gc2V0VGV4dExpbmVNYXRyaXgodCxyLGEsaSxvLGMpe3ZhciBsPXRoaXMudGV4dExpbmVNYXRyaXg7bFswXT10O2xbMV09cjtsWzJdPWE7bFszXT1pO2xbNF09bztsWzVdPWN9fSx7a2V5OiJ0cmFuc2xhdGVUZXh0TWF0cml4Iix2YWx1ZTpmdW5jdGlvbiB0cmFuc2xhdGVUZXh0TWF0cml4KHQscil7dmFyIGE9dGhpcy50ZXh0TWF0cml4O2FbNF09YVswXSp0K2FbMl0qcithWzRdO2FbNV09YVsxXSp0K2FbM10qcithWzVdfX0se2tleToidHJhbnNsYXRlVGV4dExpbmVNYXRyaXgiLHZhbHVlOmZ1bmN0aW9uIHRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KHQscil7dmFyIGE9dGhpcy50ZXh0TGluZU1hdHJpeDthWzRdPWFbMF0qdCthWzJdKnIrYVs0XTthWzVdPWFbMV0qdCthWzNdKnIrYVs1XX19LHtrZXk6ImNhbGNUZXh0TGluZU1hdHJpeEFkdmFuY2UiLHZhbHVlOmZ1bmN0aW9uIGNhbGNUZXh0TGluZU1hdHJpeEFkdmFuY2UodCxyLGEsaSxvLGMpe3ZhciBsPXRoaXMuZm9udDtpZighbClyZXR1cm4gbnVsbDt2YXIgdT10aGlzLnRleHRMaW5lTWF0cml4O2lmKHQhPT11WzBdfHxyIT09dVsxXXx8YSE9PXVbMl18fGkhPT11WzNdKXJldHVybiBudWxsO3ZhciBoPW8tdVs0XSxkPWMtdVs1XTtpZihsLnZlcnRpY2FsJiYwIT09aHx8IWwudmVydGljYWwmJjAhPT1kKXJldHVybiBudWxsO3ZhciBwLG0sZz10KmktciphO2lmKGwudmVydGljYWwpe3A9LWQqYS9nO209ZCp0L2d9ZWxzZXtwPWgqaS9nO209LWgqci9nfXJldHVybnt3aWR0aDpwLGhlaWdodDptLHZhbHVlOmwudmVydGljYWw/bTpwfX19LHtrZXk6ImNhbGNSZW5kZXJNYXRyaXgiLHZhbHVlOmZ1bmN0aW9uIGNhbGNSZW5kZXJNYXRyaXgodCl7dmFyIHI9W3RoaXMuZm9udFNpemUqdGhpcy50ZXh0SFNjYWxlLDAsMCx0aGlzLmZvbnRTaXplLDAsdGhpcy50ZXh0UmlzZV07cmV0dXJuIG8uVXRpbC50cmFuc2Zvcm0odCxvLlV0aWwudHJhbnNmb3JtKHRoaXMudGV4dE1hdHJpeCxyKSl9fSx7a2V5OiJjYXJyaWFnZVJldHVybiIsdmFsdWU6ZnVuY3Rpb24gY2FycmlhZ2VSZXR1cm4oKXt0aGlzLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KDAsLXRoaXMubGVhZGluZyk7dGhpcy50ZXh0TWF0cml4PXRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKX19LHtrZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbiBjbG9uZSgpe3ZhciBjbG9uZT1PYmplY3QuY3JlYXRlKHRoaXMpO2Nsb25lLnRleHRNYXRyaXg9dGhpcy50ZXh0TWF0cml4LnNsaWNlKCk7Y2xvbmUudGV4dExpbmVNYXRyaXg9dGhpcy50ZXh0TGluZU1hdHJpeC5zbGljZSgpO2Nsb25lLmZvbnRNYXRyaXg9dGhpcy5mb250TWF0cml4LnNsaWNlKCk7cmV0dXJuIGNsb25lfX1dKTtyZXR1cm4gVGV4dFN0YXRlfSgpLE49ZnVuY3Rpb24oKXtmdW5jdGlvbiBFdmFsU3RhdGUoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxFdmFsU3RhdGUpO3RoaXMuY3RtPW5ldyBGbG9hdDMyQXJyYXkoby5JREVOVElUWV9NQVRSSVgpO3RoaXMuZm9udD1udWxsO3RoaXMudGV4dFJlbmRlcmluZ01vZGU9by5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMO3RoaXMuZmlsbENvbG9yU3BhY2U9ay5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTt0aGlzLnN0cm9rZUNvbG9yU3BhY2U9ay5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheX1fY3JlYXRlQ2xhc3MoRXZhbFN0YXRlLFt7a2V5OiJjbG9uZSIsdmFsdWU6ZnVuY3Rpb24gY2xvbmUoKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKX19XSk7cmV0dXJuIEV2YWxTdGF0ZX0oKSxVPWZ1bmN0aW9uKCl7X2NyZWF0ZUNsYXNzKEV2YWx1YXRvclByZXByb2Nlc3NvcixudWxsLFt7a2V5OiJvcE1hcCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3ZhciB0PSgwLGQuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24odCl7dC53PXtpZDpvLk9QUy5zZXRMaW5lV2lkdGgsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5KPXtpZDpvLk9QUy5zZXRMaW5lQ2FwLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3Quaj17aWQ6by5PUFMuc2V0TGluZUpvaW4sbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5NPXtpZDpvLk9QUy5zZXRNaXRlckxpbWl0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3QuZD17aWQ6by5PUFMuc2V0RGFzaCxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTt0LnJpPXtpZDpvLk9QUy5zZXRSZW5kZXJpbmdJbnRlbnQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5pPXtpZDpvLk9QUy5zZXRGbGF0bmVzcyxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTt0LmdzPXtpZDpvLk9QUy5zZXRHU3RhdGUsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5xPXtpZDpvLk9QUy5zYXZlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3QuUT17aWQ6by5PUFMucmVzdG9yZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTt0LmNtPXtpZDpvLk9QUy50cmFuc2Zvcm0sbnVtQXJnczo2LHZhcmlhYmxlQXJnczohMX07dC5tPXtpZDpvLk9QUy5tb3ZlVG8sbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07dC5sPXtpZDpvLk9QUy5saW5lVG8sbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07dC5jPXtpZDpvLk9QUy5jdXJ2ZVRvLG51bUFyZ3M6Nix2YXJpYWJsZUFyZ3M6ITF9O3Qudj17aWQ6by5PUFMuY3VydmVUbzIsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX07dC55PXtpZDpvLk9QUy5jdXJ2ZVRvMyxudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfTt0Lmg9e2lkOm8uT1BTLmNsb3NlUGF0aCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTt0LnJlPXtpZDpvLk9QUy5yZWN0YW5nbGUsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX07dC5TPXtpZDpvLk9QUy5zdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07dC5zPXtpZDpvLk9QUy5jbG9zZVN0cm9rZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTt0LmY9e2lkOm8uT1BTLmZpbGwsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07dC5GPXtpZDpvLk9QUy5maWxsLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3RbImYqIl09e2lkOm8uT1BTLmVvRmlsbCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTt0LkI9e2lkOm8uT1BTLmZpbGxTdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07dFsiQioiXT17aWQ6by5PUFMuZW9GaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3QuYj17aWQ6by5PUFMuY2xvc2VGaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3RbImIqIl09e2lkOm8uT1BTLmNsb3NlRU9GaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3Qubj17aWQ6by5PUFMuZW5kUGF0aCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTt0Llc9e2lkOm8uT1BTLmNsaXAsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07dFsiVyoiXT17aWQ6by5PUFMuZW9DbGlwLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3QuQlQ9e2lkOm8uT1BTLmJlZ2luVGV4dCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTt0LkVUPXtpZDpvLk9QUy5lbmRUZXh0LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3QuVGM9e2lkOm8uT1BTLnNldENoYXJTcGFjaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3QuVHc9e2lkOm8uT1BTLnNldFdvcmRTcGFjaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3QuVHo9e2lkOm8uT1BTLnNldEhTY2FsZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTt0LlRMPXtpZDpvLk9QUy5zZXRMZWFkaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3QuVGY9e2lkOm8uT1BTLnNldEZvbnQsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07dC5Ucj17aWQ6by5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGUsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5Ucz17aWQ6by5PUFMuc2V0VGV4dFJpc2UsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5UZD17aWQ6by5PUFMubW92ZVRleHQsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07dC5URD17aWQ6by5PUFMuc2V0TGVhZGluZ01vdmVUZXh0LG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O3QuVG09e2lkOm8uT1BTLnNldFRleHRNYXRyaXgsbnVtQXJnczo2LHZhcmlhYmxlQXJnczohMX07dFsiVCoiXT17aWQ6by5PUFMubmV4dExpbmUsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07dC5Uaj17aWQ6by5PUFMuc2hvd1RleHQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5USj17aWQ6by5PUFMuc2hvd1NwYWNlZFRleHQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dFsiJyJdPXtpZDpvLk9QUy5uZXh0TGluZVNob3dUZXh0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3RbJyInXT17aWQ6by5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsbnVtQXJnczozLHZhcmlhYmxlQXJnczohMX07dC5kMD17aWQ6by5PUFMuc2V0Q2hhcldpZHRoLG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O3QuZDE9e2lkOm8uT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcyxudW1BcmdzOjYsdmFyaWFibGVBcmdzOiExfTt0LkNTPXtpZDpvLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3QuY3M9e2lkOm8uT1BTLnNldEZpbGxDb2xvclNwYWNlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3QuU0M9e2lkOm8uT1BTLnNldFN0cm9rZUNvbG9yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITB9O3QuU0NOPXtpZDpvLk9QUy5zZXRTdHJva2VDb2xvck4sbnVtQXJnczozMyx2YXJpYWJsZUFyZ3M6ITB9O3Quc2M9e2lkOm8uT1BTLnNldEZpbGxDb2xvcixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiEwfTt0LnNjbj17aWQ6by5PUFMuc2V0RmlsbENvbG9yTixudW1BcmdzOjMzLHZhcmlhYmxlQXJnczohMH07dC5HPXtpZDpvLk9QUy5zZXRTdHJva2VHcmF5LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3QuZz17aWQ6by5PUFMuc2V0RmlsbEdyYXksbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5SRz17aWQ6by5PUFMuc2V0U3Ryb2tlUkdCQ29sb3IsbnVtQXJnczozLHZhcmlhYmxlQXJnczohMX07dC5yZz17aWQ6by5PUFMuc2V0RmlsbFJHQkNvbG9yLG51bUFyZ3M6Myx2YXJpYWJsZUFyZ3M6ITF9O3QuSz17aWQ6by5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITF9O3Quaz17aWQ6by5PUFMuc2V0RmlsbENNWUtDb2xvcixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfTt0LnNoPXtpZDpvLk9QUy5zaGFkaW5nRmlsbCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTt0LkJJPXtpZDpvLk9QUy5iZWdpbklubGluZUltYWdlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3QuSUQ9e2lkOm8uT1BTLmJlZ2luSW1hZ2VEYXRhLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3QuRUk9e2lkOm8uT1BTLmVuZElubGluZUltYWdlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O3QuRG89e2lkOm8uT1BTLnBhaW50WE9iamVjdCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTt0Lk1QPXtpZDpvLk9QUy5tYXJrUG9pbnQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07dC5EUD17aWQ6by5PUFMubWFya1BvaW50UHJvcHMsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07dC5CTUM9e2lkOm8uT1BTLmJlZ2luTWFya2VkQ29udGVudCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTt0LkJEQz17aWQ6by5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07dC5FTUM9e2lkOm8uT1BTLmVuZE1hcmtlZENvbnRlbnQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07dC5CWD17aWQ6by5PUFMuYmVnaW5Db21wYXQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07dC5FWD17aWQ6by5PUFMuZW5kQ29tcGF0LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O3QuQk09bnVsbDt0LkJEPW51bGw7dC50cnVlPW51bGw7dC5mYT1udWxsO3QuZmFsPW51bGw7dC5mYWxzPW51bGw7dC5mYWxzZT1udWxsO3QubnU9bnVsbDt0Lm51bD1udWxsO3QubnVsbD1udWxsfSkpO3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJvcE1hcCIsdCgpKX19LHtrZXk6Ik1BWF9JTlZBTElEX1BBVEhfT1BTIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsby5zaGFkb3cpKHRoaXMsIk1BWF9JTlZBTElEX1BBVEhfT1BTIiwyMCl9fV0pO2Z1bmN0aW9uIEV2YWx1YXRvclByZXByb2Nlc3Nvcih0LHIsYSl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRXZhbHVhdG9yUHJlcHJvY2Vzc29yKTt0aGlzLnBhcnNlcj1uZXcgYi5QYXJzZXIoe2xleGVyOm5ldyBiLkxleGVyKHQsRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSx4cmVmOnJ9KTt0aGlzLnN0YXRlTWFuYWdlcj1hO3RoaXMubm9uUHJvY2Vzc2VkQXJncz1bXTt0aGlzLl9udW1JbnZhbGlkUGF0aE9QUz0wfV9jcmVhdGVDbGFzcyhFdmFsdWF0b3JQcmVwcm9jZXNzb3IsW3trZXk6InJlYWQiLHZhbHVlOmZ1bmN0aW9uIHJlYWQodCl7Zm9yKHZhciByPXQuYXJnczs7KXt2YXIgYT10aGlzLnBhcnNlci5nZXRPYmooKTtpZihhIGluc3RhbmNlb2YgbC5DbWQpe3ZhciBpPWEuY21kLGM9RXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwW2ldO2lmKCFjKXsoMCxvLndhcm4pKCdVbmtub3duIGNvbW1hbmQgIicuY29uY2F0KGksJyIuJykpO2NvbnRpbnVlfXZhciB1PWMuaWQsaD1jLm51bUFyZ3MsZD1udWxsIT09cj9yLmxlbmd0aDowO2lmKGMudmFyaWFibGVBcmdzKWQ+aCYmKDAsby5pbmZvKSgiQ29tbWFuZCAiLmNvbmNhdChpLCI6IGV4cGVjdGVkIFswLCAiKS5jb25jYXQoaCwiXSBhcmdzLCAiKSsiYnV0IHJlY2VpdmVkICIuY29uY2F0KGQsIiBhcmdzLiIpKTtlbHNle2lmKGQhPT1oKXtmb3IodmFyIHA9dGhpcy5ub25Qcm9jZXNzZWRBcmdzO2Q+aDspe3AucHVzaChyLnNoaWZ0KCkpO2QtLX1mb3IoO2Q8aCYmMCE9PXAubGVuZ3RoOyl7bnVsbD09PXImJihyPVtdKTtyLnVuc2hpZnQocC5wb3AoKSk7ZCsrfX1pZihkPGgpe3ZhciBtPSJjb21tYW5kICIuY29uY2F0KGksIjogZXhwZWN0ZWQgIikuY29uY2F0KGgsIiBhcmdzLCAiKSsiYnV0IHJlY2VpdmVkICIuY29uY2F0KGQsIiBhcmdzLiIpO2lmKHU+PW8uT1BTLm1vdmVUbyYmdTw9by5PUFMuZW5kUGF0aCYmKyt0aGlzLl9udW1JbnZhbGlkUGF0aE9QUz5FdmFsdWF0b3JQcmVwcm9jZXNzb3IuTUFYX0lOVkFMSURfUEFUSF9PUFMpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIkludmFsaWQgIi5jb25jYXQobSkpOygwLG8ud2FybikoIlNraXBwaW5nICIuY29uY2F0KG0pKTtudWxsIT09ciYmKHIubGVuZ3RoPTApO2NvbnRpbnVlfX10aGlzLnByZXByb2Nlc3NDb21tYW5kKHUscik7dC5mbj11O3QuYXJncz1yO3JldHVybiEwfWlmKGE9PT1sLkVPRilyZXR1cm4hMTtpZihudWxsIT09YSl7bnVsbD09PXImJihyPVtdKTtyLnB1c2goYSk7aWYoci5sZW5ndGg+MzMpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyIpfX19fSx7a2V5OiJwcmVwcm9jZXNzQ29tbWFuZCIsdmFsdWU6ZnVuY3Rpb24gcHJlcHJvY2Vzc0NvbW1hbmQodCxyKXtzd2l0Y2goMHx0KXtjYXNlIG8uT1BTLnNhdmU6dGhpcy5zdGF0ZU1hbmFnZXIuc2F2ZSgpO2JyZWFrO2Nhc2Ugby5PUFMucmVzdG9yZTp0aGlzLnN0YXRlTWFuYWdlci5yZXN0b3JlKCk7YnJlYWs7Y2FzZSBvLk9QUy50cmFuc2Zvcm06dGhpcy5zdGF0ZU1hbmFnZXIudHJhbnNmb3JtKHIpfX19LHtrZXk6InNhdmVkU3RhdGVzRGVwdGgiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5zdGF0ZU1hbmFnZXIuc3RhdGVTdGFjay5sZW5ndGh9fV0pO3JldHVybiBFdmFsdWF0b3JQcmVwcm9jZXNzb3J9KCl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuQ01hcEZhY3Rvcnk9ci5JZGVudGl0eUNNYXA9ci5DTWFwPXZvaWQgMDt2YXIgaT1mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oYSgyKSksbz1hKDUpLGM9YSgyMDIpLGw9YSgyMDgpLHU9YSgyMDUpLGg9YSgyMDkpO2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcCh0LHIsYSxpLG8sYyxsKXt0cnl7dmFyIHU9dFtjXShsKSxoPXUudmFsdWV9Y2F0Y2godCl7YSh0KTtyZXR1cm59dS5kb25lP3IoaCk6UHJvbWlzZS5yZXNvbHZlKGgpLnRoZW4oaSxvKX1mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YodCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3JldHVybihfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCxyKXt0Ll9fcHJvdG9fXz1yO3JldHVybiB0fSkodCxyKX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIodCl7dmFyIHI9ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKTtyZXR1cm4hMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIGEsaT1fZ2V0UHJvdG90eXBlT2YodCk7aWYocil7dmFyIG89X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO2E9UmVmbGVjdC5jb25zdHJ1Y3QoaSxhcmd1bWVudHMsbyl9ZWxzZSBhPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLGEpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LHIpe3JldHVybiFyfHwib2JqZWN0IiE9PV90eXBlb2YocikmJiJmdW5jdGlvbiIhPXR5cGVvZiByP2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiB0fSh0KTpyfWZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KXtyZXR1cm4oX2dldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGk9clthXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMTtpLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9dmFyIGQ9WyJBZG9iZS1HQjEtVUNTMiIsIkFkb2JlLUNOUzEtVUNTMiIsIkFkb2JlLUphcGFuMS1VQ1MyIiwiQWRvYmUtS29yZWExLVVDUzIiLCI3OC1FVUMtSCIsIjc4LUVVQy1WIiwiNzgtSCIsIjc4LVJLU0otSCIsIjc4LVJLU0otViIsIjc4LVYiLCI3OG1zLVJLU0otSCIsIjc4bXMtUktTSi1WIiwiODNwdi1SS1NKLUgiLCI5MG1zLVJLU0otSCIsIjkwbXMtUktTSi1WIiwiOTBtc3AtUktTSi1IIiwiOTBtc3AtUktTSi1WIiwiOTBwdi1SS1NKLUgiLCI5MHB2LVJLU0otViIsIkFkZC1IIiwiQWRkLVJLU0otSCIsIkFkZC1SS1NKLVYiLCJBZGQtViIsIkFkb2JlLUNOUzEtMCIsIkFkb2JlLUNOUzEtMSIsIkFkb2JlLUNOUzEtMiIsIkFkb2JlLUNOUzEtMyIsIkFkb2JlLUNOUzEtNCIsIkFkb2JlLUNOUzEtNSIsIkFkb2JlLUNOUzEtNiIsIkFkb2JlLUdCMS0wIiwiQWRvYmUtR0IxLTEiLCJBZG9iZS1HQjEtMiIsIkFkb2JlLUdCMS0zIiwiQWRvYmUtR0IxLTQiLCJBZG9iZS1HQjEtNSIsIkFkb2JlLUphcGFuMS0wIiwiQWRvYmUtSmFwYW4xLTEiLCJBZG9iZS1KYXBhbjEtMiIsIkFkb2JlLUphcGFuMS0zIiwiQWRvYmUtSmFwYW4xLTQiLCJBZG9iZS1KYXBhbjEtNSIsIkFkb2JlLUphcGFuMS02IiwiQWRvYmUtS29yZWExLTAiLCJBZG9iZS1Lb3JlYTEtMSIsIkFkb2JlLUtvcmVhMS0yIiwiQjUtSCIsIkI1LVYiLCJCNXBjLUgiLCJCNXBjLVYiLCJDTlMtRVVDLUgiLCJDTlMtRVVDLVYiLCJDTlMxLUgiLCJDTlMxLVYiLCJDTlMyLUgiLCJDTlMyLVYiLCJFVEhLLUI1LUgiLCJFVEhLLUI1LVYiLCJFVGVuLUI1LUgiLCJFVGVuLUI1LVYiLCJFVGVubXMtQjUtSCIsIkVUZW5tcy1CNS1WIiwiRVVDLUgiLCJFVUMtViIsIkV4dC1IIiwiRXh0LVJLU0otSCIsIkV4dC1SS1NKLVYiLCJFeHQtViIsIkdCLUVVQy1IIiwiR0ItRVVDLVYiLCJHQi1IIiwiR0ItViIsIkdCSy1FVUMtSCIsIkdCSy1FVUMtViIsIkdCSzJLLUgiLCJHQksySy1WIiwiR0JLcC1FVUMtSCIsIkdCS3AtRVVDLVYiLCJHQlQtRVVDLUgiLCJHQlQtRVVDLVYiLCJHQlQtSCIsIkdCVC1WIiwiR0JUcGMtRVVDLUgiLCJHQlRwYy1FVUMtViIsIkdCcGMtRVVDLUgiLCJHQnBjLUVVQy1WIiwiSCIsIkhLZGxhLUI1LUgiLCJIS2RsYS1CNS1WIiwiSEtkbGItQjUtSCIsIkhLZGxiLUI1LVYiLCJIS2djY3MtQjUtSCIsIkhLZ2Njcy1CNS1WIiwiSEttMzE0LUI1LUgiLCJIS20zMTQtQjUtViIsIkhLbTQ3MS1CNS1IIiwiSEttNDcxLUI1LVYiLCJIS3Njcy1CNS1IIiwiSEtzY3MtQjUtViIsIkhhbmtha3UiLCJIaXJhZ2FuYSIsIktTQy1FVUMtSCIsIktTQy1FVUMtViIsIktTQy1IIiwiS1NDLUpvaGFiLUgiLCJLU0MtSm9oYWItViIsIktTQy1WIiwiS1NDbXMtVUhDLUgiLCJLU0Ntcy1VSEMtSFctSCIsIktTQ21zLVVIQy1IVy1WIiwiS1NDbXMtVUhDLVYiLCJLU0NwYy1FVUMtSCIsIktTQ3BjLUVVQy1WIiwiS2F0YWthbmEiLCJOV1AtSCIsIk5XUC1WIiwiUktTSi1IIiwiUktTSi1WIiwiUm9tYW4iLCJVbmlDTlMtVUNTMi1IIiwiVW5pQ05TLVVDUzItViIsIlVuaUNOUy1VVEYxNi1IIiwiVW5pQ05TLVVURjE2LVYiLCJVbmlDTlMtVVRGMzItSCIsIlVuaUNOUy1VVEYzMi1WIiwiVW5pQ05TLVVURjgtSCIsIlVuaUNOUy1VVEY4LVYiLCJVbmlHQi1VQ1MyLUgiLCJVbmlHQi1VQ1MyLVYiLCJVbmlHQi1VVEYxNi1IIiwiVW5pR0ItVVRGMTYtViIsIlVuaUdCLVVURjMyLUgiLCJVbmlHQi1VVEYzMi1WIiwiVW5pR0ItVVRGOC1IIiwiVW5pR0ItVVRGOC1WIiwiVW5pSklTLVVDUzItSCIsIlVuaUpJUy1VQ1MyLUhXLUgiLCJVbmlKSVMtVUNTMi1IVy1WIiwiVW5pSklTLVVDUzItViIsIlVuaUpJUy1VVEYxNi1IIiwiVW5pSklTLVVURjE2LVYiLCJVbmlKSVMtVVRGMzItSCIsIlVuaUpJUy1VVEYzMi1WIiwiVW5pSklTLVVURjgtSCIsIlVuaUpJUy1VVEY4LVYiLCJVbmlKSVMyMDA0LVVURjE2LUgiLCJVbmlKSVMyMDA0LVVURjE2LVYiLCJVbmlKSVMyMDA0LVVURjMyLUgiLCJVbmlKSVMyMDA0LVVURjMyLVYiLCJVbmlKSVMyMDA0LVVURjgtSCIsIlVuaUpJUzIwMDQtVVRGOC1WIiwiVW5pSklTUHJvLVVDUzItSFctViIsIlVuaUpJU1Byby1VQ1MyLVYiLCJVbmlKSVNQcm8tVVRGOC1WIiwiVW5pSklTWDAyMTMtVVRGMzItSCIsIlVuaUpJU1gwMjEzLVVURjMyLVYiLCJVbmlKSVNYMDIxMzIwMDQtVVRGMzItSCIsIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwiVW5pS1MtVUNTMi1IIiwiVW5pS1MtVUNTMi1WIiwiVW5pS1MtVVRGMTYtSCIsIlVuaUtTLVVURjE2LVYiLCJVbmlLUy1VVEYzMi1IIiwiVW5pS1MtVVRGMzItViIsIlVuaUtTLVVURjgtSCIsIlVuaUtTLVVURjgtViIsIlYiLCJXUC1TeW1ib2wiXSxwPU1hdGgucG93KDIsMjQpLTEsbT1mdW5jdGlvbigpe2Z1bmN0aW9uIENNYXAoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO19jbGFzc0NhbGxDaGVjayh0aGlzLENNYXApO3RoaXMuY29kZXNwYWNlUmFuZ2VzPVtbXSxbXSxbXSxbXV07dGhpcy5udW1Db2Rlc3BhY2VSYW5nZXM9MDt0aGlzLl9tYXA9W107dGhpcy5uYW1lPSIiO3RoaXMudmVydGljYWw9ITE7dGhpcy51c2VDTWFwPW51bGw7dGhpcy5idWlsdEluQ01hcD10fV9jcmVhdGVDbGFzcyhDTWFwLFt7a2V5OiJhZGRDb2Rlc3BhY2VSYW5nZSIsdmFsdWU6ZnVuY3Rpb24gYWRkQ29kZXNwYWNlUmFuZ2UodCxyLGEpe3RoaXMuY29kZXNwYWNlUmFuZ2VzW3QtMV0ucHVzaChyLGEpO3RoaXMubnVtQ29kZXNwYWNlUmFuZ2VzKyt9fSx7a2V5OiJtYXBDaWRSYW5nZSIsdmFsdWU6ZnVuY3Rpb24gbWFwQ2lkUmFuZ2UodCxyLGEpe2lmKHItdD5wKXRocm93IG5ldyBFcnJvcigibWFwQ2lkUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7Zm9yKDt0PD1yOyl0aGlzLl9tYXBbdCsrXT1hKyt9fSx7a2V5OiJtYXBCZlJhbmdlIix2YWx1ZTpmdW5jdGlvbiBtYXBCZlJhbmdlKHQscixhKXtpZihyLXQ+cCl0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7Zm9yKHZhciBpPWEubGVuZ3RoLTE7dDw9cjspe3RoaXMuX21hcFt0KytdPWE7YT1hLnN1YnN0cmluZygwLGkpK1N0cmluZy5mcm9tQ2hhckNvZGUoYS5jaGFyQ29kZUF0KGkpKzEpfX19LHtrZXk6Im1hcEJmUmFuZ2VUb0FycmF5Iix2YWx1ZTpmdW5jdGlvbiBtYXBCZlJhbmdlVG9BcnJheSh0LHIsYSl7aWYoci10PnApdGhyb3cgbmV3IEVycm9yKCJtYXBCZlJhbmdlVG9BcnJheSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTtmb3IodmFyIGk9YS5sZW5ndGgsbz0wO3Q8PXImJm88aTspe3RoaXMuX21hcFt0XT1hW28rK107Kyt0fX19LHtrZXk6Im1hcE9uZSIsdmFsdWU6ZnVuY3Rpb24gbWFwT25lKHQscil7dGhpcy5fbWFwW3RdPXJ9fSx7a2V5OiJsb29rdXAiLHZhbHVlOmZ1bmN0aW9uIGxvb2t1cCh0KXtyZXR1cm4gdGhpcy5fbWFwW3RdfX0se2tleToiY29udGFpbnMiLHZhbHVlOmZ1bmN0aW9uIGNvbnRhaW5zKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLl9tYXBbdF19fSx7a2V5OiJmb3JFYWNoIix2YWx1ZTpmdW5jdGlvbiBmb3JFYWNoKHQpe3ZhciByPXRoaXMuX21hcCxhPXIubGVuZ3RoO2lmKGE8PTY1NTM2KWZvcih2YXIgaT0wO2k8YTtpKyspdm9pZCAwIT09cltpXSYmdChpLHJbaV0pO2Vsc2UgZm9yKHZhciBvIGluIHIpdChvLHJbb10pfX0se2tleToiY2hhckNvZGVPZiIsdmFsdWU6ZnVuY3Rpb24gY2hhckNvZGVPZih0KXt2YXIgcj10aGlzLl9tYXA7aWYoci5sZW5ndGg8PTY1NTM2KXJldHVybiByLmluZGV4T2YodCk7Zm9yKHZhciBhIGluIHIpaWYoclthXT09PXQpcmV0dXJuIDB8YTtyZXR1cm4tMX19LHtrZXk6ImdldE1hcCIsdmFsdWU6ZnVuY3Rpb24gZ2V0TWFwKCl7cmV0dXJuIHRoaXMuX21hcH19LHtrZXk6InJlYWRDaGFyQ29kZSIsdmFsdWU6ZnVuY3Rpb24gcmVhZENoYXJDb2RlKHQscixhKXtmb3IodmFyIGk9MCxvPXRoaXMuY29kZXNwYWNlUmFuZ2VzLGM9MCxsPW8ubGVuZ3RoO2M8bDtjKyspe2k9KGk8PDh8dC5jaGFyQ29kZUF0KHIrYykpPj4+MDtmb3IodmFyIHU9b1tjXSxoPTAsZD11Lmxlbmd0aDtoPGQ7KXt2YXIgcD11W2grK10sbT11W2grK107aWYoaT49cCYmaTw9bSl7YS5jaGFyY29kZT1pO2EubGVuZ3RoPWMrMTtyZXR1cm59fX1hLmNoYXJjb2RlPTA7YS5sZW5ndGg9MX19LHtrZXk6Imxlbmd0aCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9tYXAubGVuZ3RofX0se2tleToiaXNJZGVudGl0eUNNYXAiLGdldDpmdW5jdGlvbiBnZXQoKXtpZigiSWRlbnRpdHktSCIhPT10aGlzLm5hbWUmJiJJZGVudGl0eS1WIiE9PXRoaXMubmFtZSlyZXR1cm4hMTtpZig2NTUzNiE9PXRoaXMuX21hcC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciB0PTA7dDw2NTUzNjt0KyspaWYodGhpcy5fbWFwW3RdIT09dClyZXR1cm4hMTtyZXR1cm4hMH19XSk7cmV0dXJuIENNYXB9KCk7ci5DTWFwPW07dmFyIGc9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uIF9pbmhlcml0cyh0LHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByJiZudWxsIT09cil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtyJiZfc2V0UHJvdG90eXBlT2YodCxyKX0oSWRlbnRpdHlDTWFwLHQpO3ZhciByPV9jcmVhdGVTdXBlcihJZGVudGl0eUNNYXApO2Z1bmN0aW9uIElkZW50aXR5Q01hcCh0LGEpe3ZhciBpO19jbGFzc0NhbGxDaGVjayh0aGlzLElkZW50aXR5Q01hcCk7KGk9ci5jYWxsKHRoaXMpKS52ZXJ0aWNhbD10O2kuYWRkQ29kZXNwYWNlUmFuZ2UoYSwwLDY1NTM1KTtyZXR1cm4gaX1fY3JlYXRlQ2xhc3MoSWRlbnRpdHlDTWFwLFt7a2V5OiJtYXBDaWRSYW5nZSIsdmFsdWU6ZnVuY3Rpb24gbWFwQ2lkUmFuZ2UodCxyLGEpeygwLG8udW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2UiKX19LHtrZXk6Im1hcEJmUmFuZ2UiLHZhbHVlOmZ1bmN0aW9uIG1hcEJmUmFuZ2UodCxyLGEpeygwLG8udW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZSIpfX0se2tleToibWFwQmZSYW5nZVRvQXJyYXkiLHZhbHVlOmZ1bmN0aW9uIG1hcEJmUmFuZ2VUb0FycmF5KHQscixhKXsoMCxvLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2VUb0FycmF5Iil9fSx7a2V5OiJtYXBPbmUiLHZhbHVlOmZ1bmN0aW9uIG1hcE9uZSh0LHIpeygwLG8udW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkT25lIil9fSx7a2V5OiJsb29rdXAiLHZhbHVlOmZ1bmN0aW9uIGxvb2t1cCh0KXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0KSYmdDw9NjU1MzU/dDp2b2lkIDB9fSx7a2V5OiJjb250YWlucyIsdmFsdWU6ZnVuY3Rpb24gY29udGFpbnModCl7cmV0dXJuIE51bWJlci5pc0ludGVnZXIodCkmJnQ8PTY1NTM1fX0se2tleToiZm9yRWFjaCIsdmFsdWU6ZnVuY3Rpb24gZm9yRWFjaCh0KXtmb3IodmFyIHI9MDtyPD02NTUzNTtyKyspdChyLHIpfX0se2tleToiY2hhckNvZGVPZiIsdmFsdWU6ZnVuY3Rpb24gY2hhckNvZGVPZih0KXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0KSYmdDw9NjU1MzU/dDotMX19LHtrZXk6ImdldE1hcCIsdmFsdWU6ZnVuY3Rpb24gZ2V0TWFwKCl7Zm9yKHZhciB0PW5ldyBBcnJheSg2NTUzNikscj0wO3I8PTY1NTM1O3IrKyl0W3JdPXI7cmV0dXJuIHR9fSx7a2V5OiJsZW5ndGgiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gNjU1MzZ9fSx7a2V5OiJpc0lkZW50aXR5Q01hcCIsZ2V0OmZ1bmN0aW9uIGdldCgpeygwLG8udW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGFjY2VzcyAuaXNJZGVudGl0eUNNYXAiKX19XSk7cmV0dXJuIElkZW50aXR5Q01hcH0obSk7ci5JZGVudGl0eUNNYXA9Zzt2YXIgeT1mdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyQ2xvc3VyZSgpe2Z1bmN0aW9uIGhleFRvSW50KHQscil7Zm9yKHZhciBhPTAsaT0wO2k8PXI7aSsrKWE9YTw8OHx0W2ldO3JldHVybiBhPj4+MH1mdW5jdGlvbiBoZXhUb1N0cih0LHIpe3JldHVybiAxPT09cj9TdHJpbmcuZnJvbUNoYXJDb2RlKHRbMF0sdFsxXSk6Mz09PXI/U3RyaW5nLmZyb21DaGFyQ29kZSh0WzBdLHRbMV0sdFsyXSx0WzNdKTpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdC5zdWJhcnJheSgwLHIrMSkpfWZ1bmN0aW9uIGFkZEhleCh0LHIsYSl7Zm9yKHZhciBpPTAsbz1hO28+PTA7by0tKXtpKz10W29dK3Jbb107dFtvXT0yNTUmaTtpPj49OH19ZnVuY3Rpb24gaW5jSGV4KHQscil7Zm9yKHZhciBhPTEsaT1yO2k+PTAmJmE+MDtpLS0pe2ErPXRbaV07dFtpXT0yNTUmYTthPj49OH19ZnVuY3Rpb24gQmluYXJ5Q01hcFN0cmVhbSh0KXt0aGlzLmJ1ZmZlcj10O3RoaXMucG9zPTA7dGhpcy5lbmQ9dC5sZW5ndGg7dGhpcy50bXBCdWY9bmV3IFVpbnQ4QXJyYXkoMTkpfUJpbmFyeUNNYXBTdHJlYW0ucHJvdG90eXBlPXtyZWFkQnl0ZTpmdW5jdGlvbiByZWFkQnl0ZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5lbmQ/LTE6dGhpcy5idWZmZXJbdGhpcy5wb3MrK119LHJlYWROdW1iZXI6ZnVuY3Rpb24gcmVhZE51bWJlcigpe3ZhciB0LHI9MDtkb3t2YXIgYT10aGlzLnJlYWRCeXRlKCk7aWYoYTwwKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJ1bmV4cGVjdGVkIEVPRiBpbiBiY21hcCIpO3Q9ISgxMjgmYSk7cj1yPDw3fDEyNyZhfXdoaWxlKCF0KTtyZXR1cm4gcn0scmVhZFNpZ25lZDpmdW5jdGlvbiByZWFkU2lnbmVkKCl7dmFyIHQ9dGhpcy5yZWFkTnVtYmVyKCk7cmV0dXJuIDEmdD9+KHQ+Pj4xKTp0Pj4+MX0scmVhZEhleDpmdW5jdGlvbiByZWFkSGV4KHQscil7dC5zZXQodGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3MsdGhpcy5wb3MrcisxKSk7dGhpcy5wb3MrPXIrMX0scmVhZEhleE51bWJlcjpmdW5jdGlvbiByZWFkSGV4TnVtYmVyKHQscil7dmFyIGEsaT10aGlzLnRtcEJ1ZixjPTA7ZG97dmFyIGw9dGhpcy5yZWFkQnl0ZSgpO2lmKGw8MCl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTthPSEoMTI4JmwpO2lbYysrXT0xMjcmbH13aGlsZSghYSk7Zm9yKHZhciB1PXIsaD0wLGQ9MDt1Pj0wOyl7Zm9yKDtkPDgmJmkubGVuZ3RoPjA7KXtoPWlbLS1jXTw8ZHxoO2QrPTd9dFt1XT0yNTUmaDt1LS07aD4+PTg7ZC09OH19LHJlYWRIZXhTaWduZWQ6ZnVuY3Rpb24gcmVhZEhleFNpZ25lZCh0LHIpe3RoaXMucmVhZEhleE51bWJlcih0LHIpO2Zvcih2YXIgYT0xJnRbcl0/MjU1OjAsaT0wLG89MDtvPD1yO28rKyl7aT0oMSZpKTw8OHx0W29dO3Rbb109aT4+MV5hfX0scmVhZFN0cmluZzpmdW5jdGlvbiByZWFkU3RyaW5nKCl7Zm9yKHZhciB0PXRoaXMucmVhZE51bWJlcigpLHI9IiIsYT0wO2E8dDthKyspcis9U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWROdW1iZXIoKSk7cmV0dXJuIHJ9fTtmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyKCl7fUJpbmFyeUNNYXBSZWFkZXIucHJvdG90eXBlPXtwcm9jZXNzOmZ1bmN0aW9uIHByb2Nlc3NCaW5hcnlDTWFwKHQscixhKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksbyl7dmFyIGM9bmV3IEJpbmFyeUNNYXBTdHJlYW0odCksbD1jLnJlYWRCeXRlKCk7ci52ZXJ0aWNhbD0hISgxJmwpO2Zvcih2YXIgdSxoLGQ9bnVsbCxwPW5ldyBVaW50OEFycmF5KDE2KSxtPW5ldyBVaW50OEFycmF5KDE2KSxnPW5ldyBVaW50OEFycmF5KDE2KSx5PW5ldyBVaW50OEFycmF5KDE2KSxiPW5ldyBVaW50OEFycmF5KDE2KTsoaD1jLnJlYWRCeXRlKCkpPj0wOyl7dmFyIHY9aD4+NTtpZig3IT09dil7dmFyIFM9ISEoMTYmaCksaz0xNSZoO2lmKGsrMT4xNil0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3NCaW5hcnlDTWFwOiBJbnZhbGlkIGRhdGFTaXplLiIpO3ZhciB3LEM9Yy5yZWFkTnVtYmVyKCk7c3dpdGNoKHYpe2Nhc2UgMDpjLnJlYWRIZXgocCxrKTtjLnJlYWRIZXhOdW1iZXIobSxrKTthZGRIZXgobSxwLGspO3IuYWRkQ29kZXNwYWNlUmFuZ2UoaysxLGhleFRvSW50KHAsayksaGV4VG9JbnQobSxrKSk7Zm9yKHc9MTt3PEM7dysrKXtpbmNIZXgobSxrKTtjLnJlYWRIZXhOdW1iZXIocCxrKTthZGRIZXgocCxtLGspO2MucmVhZEhleE51bWJlcihtLGspO2FkZEhleChtLHAsayk7ci5hZGRDb2Rlc3BhY2VSYW5nZShrKzEsaGV4VG9JbnQocCxrKSxoZXhUb0ludChtLGspKX1icmVhaztjYXNlIDE6Yy5yZWFkSGV4KHAsayk7Yy5yZWFkSGV4TnVtYmVyKG0sayk7YWRkSGV4KG0scCxrKTtjLnJlYWROdW1iZXIoKTtmb3Iodz0xO3c8Qzt3Kyspe2luY0hleChtLGspO2MucmVhZEhleE51bWJlcihwLGspO2FkZEhleChwLG0sayk7Yy5yZWFkSGV4TnVtYmVyKG0sayk7YWRkSGV4KG0scCxrKTtjLnJlYWROdW1iZXIoKX1icmVhaztjYXNlIDI6Yy5yZWFkSGV4KGcsayk7dT1jLnJlYWROdW1iZXIoKTtyLm1hcE9uZShoZXhUb0ludChnLGspLHUpO2Zvcih3PTE7dzxDO3crKyl7aW5jSGV4KGcsayk7aWYoIVMpe2MucmVhZEhleE51bWJlcihiLGspO2FkZEhleChnLGIsayl9dT1jLnJlYWRTaWduZWQoKSsodSsxKTtyLm1hcE9uZShoZXhUb0ludChnLGspLHUpfWJyZWFrO2Nhc2UgMzpjLnJlYWRIZXgocCxrKTtjLnJlYWRIZXhOdW1iZXIobSxrKTthZGRIZXgobSxwLGspO3U9Yy5yZWFkTnVtYmVyKCk7ci5tYXBDaWRSYW5nZShoZXhUb0ludChwLGspLGhleFRvSW50KG0sayksdSk7Zm9yKHc9MTt3PEM7dysrKXtpbmNIZXgobSxrKTtpZihTKXAuc2V0KG0pO2Vsc2V7Yy5yZWFkSGV4TnVtYmVyKHAsayk7YWRkSGV4KHAsbSxrKX1jLnJlYWRIZXhOdW1iZXIobSxrKTthZGRIZXgobSxwLGspO3U9Yy5yZWFkTnVtYmVyKCk7ci5tYXBDaWRSYW5nZShoZXhUb0ludChwLGspLGhleFRvSW50KG0sayksdSl9YnJlYWs7Y2FzZSA0OmMucmVhZEhleChnLDEpO2MucmVhZEhleCh5LGspO3IubWFwT25lKGhleFRvSW50KGcsMSksaGV4VG9TdHIoeSxrKSk7Zm9yKHc9MTt3PEM7dysrKXtpbmNIZXgoZywxKTtpZighUyl7Yy5yZWFkSGV4TnVtYmVyKGIsMSk7YWRkSGV4KGcsYiwxKX1pbmNIZXgoeSxrKTtjLnJlYWRIZXhTaWduZWQoYixrKTthZGRIZXgoeSxiLGspO3IubWFwT25lKGhleFRvSW50KGcsMSksaGV4VG9TdHIoeSxrKSl9YnJlYWs7Y2FzZSA1OmMucmVhZEhleChwLDEpO2MucmVhZEhleE51bWJlcihtLDEpO2FkZEhleChtLHAsMSk7Yy5yZWFkSGV4KHksayk7ci5tYXBCZlJhbmdlKGhleFRvSW50KHAsMSksaGV4VG9JbnQobSwxKSxoZXhUb1N0cih5LGspKTtmb3Iodz0xO3c8Qzt3Kyspe2luY0hleChtLDEpO2lmKFMpcC5zZXQobSk7ZWxzZXtjLnJlYWRIZXhOdW1iZXIocCwxKTthZGRIZXgocCxtLDEpfWMucmVhZEhleE51bWJlcihtLDEpO2FkZEhleChtLHAsMSk7Yy5yZWFkSGV4KHksayk7ci5tYXBCZlJhbmdlKGhleFRvSW50KHAsMSksaGV4VG9JbnQobSwxKSxoZXhUb1N0cih5LGspKX1icmVhaztkZWZhdWx0Om8obmV3IEVycm9yKCJwcm9jZXNzQmluYXJ5Q01hcDogVW5rbm93biB0eXBlOiAiK3YpKTtyZXR1cm59fWVsc2Ugc3dpdGNoKDMxJmgpe2Nhc2UgMDpjLnJlYWRTdHJpbmcoKTticmVhaztjYXNlIDE6ZD1jLnJlYWRTdHJpbmcoKX19aShkP2EoZCk6cil9KSl9fTtyZXR1cm4gQmluYXJ5Q01hcFJlYWRlcn0oKSxiPWZ1bmN0aW9uIENNYXBGYWN0b3J5Q2xvc3VyZSgpe2Z1bmN0aW9uIHN0clRvSW50KHQpe2Zvcih2YXIgcj0wLGE9MDthPHQubGVuZ3RoO2ErKylyPXI8PDh8dC5jaGFyQ29kZUF0KGEpO3JldHVybiByPj4+MH1mdW5jdGlvbiBleHBlY3RTdHJpbmcodCl7aWYoISgwLG8uaXNTdHJpbmcpKHQpKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgc3RyaW5nLiIpfWZ1bmN0aW9uIGV4cGVjdEludCh0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiTWFsZm9ybWVkIENNYXA6IGV4cGVjdGVkIGludC4iKX1mdW5jdGlvbiBwYXJzZUJmQ2hhcih0LHIpe2Zvcig7Oyl7dmFyIGE9ci5nZXRPYmooKTtpZigoMCxjLmlzRU9GKShhKSlicmVhaztpZigoMCxjLmlzQ21kKShhLCJlbmRiZmNoYXIiKSlyZXR1cm47ZXhwZWN0U3RyaW5nKGEpO3ZhciBpPXN0clRvSW50KGEpO2V4cGVjdFN0cmluZyhhPXIuZ2V0T2JqKCkpO3ZhciBvPWE7dC5tYXBPbmUoaSxvKX19ZnVuY3Rpb24gcGFyc2VCZlJhbmdlKHQscil7Zm9yKDs7KXt2YXIgYT1yLmdldE9iaigpO2lmKCgwLGMuaXNFT0YpKGEpKWJyZWFrO2lmKCgwLGMuaXNDbWQpKGEsImVuZGJmcmFuZ2UiKSlyZXR1cm47ZXhwZWN0U3RyaW5nKGEpO3ZhciBpPXN0clRvSW50KGEpO2V4cGVjdFN0cmluZyhhPXIuZ2V0T2JqKCkpO3ZhciBsPXN0clRvSW50KGEpO2E9ci5nZXRPYmooKTtpZihOdW1iZXIuaXNJbnRlZ2VyKGEpfHwoMCxvLmlzU3RyaW5nKShhKSl7dmFyIHU9TnVtYmVyLmlzSW50ZWdlcihhKT9TdHJpbmcuZnJvbUNoYXJDb2RlKGEpOmE7dC5tYXBCZlJhbmdlKGksbCx1KX1lbHNle2lmKCEoMCxjLmlzQ21kKShhLCJbIikpYnJlYWs7YT1yLmdldE9iaigpO2Zvcih2YXIgaD1bXTshKDAsYy5pc0NtZCkoYSwiXSIpJiYhKDAsYy5pc0VPRikoYSk7KXtoLnB1c2goYSk7YT1yLmdldE9iaigpfXQubWFwQmZSYW5nZVRvQXJyYXkoaSxsLGgpfX10aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBiZiByYW5nZS4iKX1mdW5jdGlvbiBwYXJzZUNpZENoYXIodCxyKXtmb3IoOzspe3ZhciBhPXIuZ2V0T2JqKCk7aWYoKDAsYy5pc0VPRikoYSkpYnJlYWs7aWYoKDAsYy5pc0NtZCkoYSwiZW5kY2lkY2hhciIpKXJldHVybjtleHBlY3RTdHJpbmcoYSk7dmFyIGk9c3RyVG9JbnQoYSk7ZXhwZWN0SW50KGE9ci5nZXRPYmooKSk7dmFyIG89YTt0Lm1hcE9uZShpLG8pfX1mdW5jdGlvbiBwYXJzZUNpZFJhbmdlKHQscil7Zm9yKDs7KXt2YXIgYT1yLmdldE9iaigpO2lmKCgwLGMuaXNFT0YpKGEpKWJyZWFrO2lmKCgwLGMuaXNDbWQpKGEsImVuZGNpZHJhbmdlIikpcmV0dXJuO2V4cGVjdFN0cmluZyhhKTt2YXIgaT1zdHJUb0ludChhKTtleHBlY3RTdHJpbmcoYT1yLmdldE9iaigpKTt2YXIgbz1zdHJUb0ludChhKTtleHBlY3RJbnQoYT1yLmdldE9iaigpKTt2YXIgbD1hO3QubWFwQ2lkUmFuZ2UoaSxvLGwpfX1mdW5jdGlvbiBwYXJzZUNvZGVzcGFjZVJhbmdlKHQscil7Zm9yKDs7KXt2YXIgYT1yLmdldE9iaigpO2lmKCgwLGMuaXNFT0YpKGEpKWJyZWFrO2lmKCgwLGMuaXNDbWQpKGEsImVuZGNvZGVzcGFjZXJhbmdlIikpcmV0dXJuO2lmKCEoMCxvLmlzU3RyaW5nKShhKSlicmVhazt2YXIgaT1zdHJUb0ludChhKTthPXIuZ2V0T2JqKCk7aWYoISgwLG8uaXNTdHJpbmcpKGEpKWJyZWFrO3ZhciBsPXN0clRvSW50KGEpO3QuYWRkQ29kZXNwYWNlUmFuZ2UoYS5sZW5ndGgsaSxsKX10aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiSW52YWxpZCBjb2Rlc3BhY2UgcmFuZ2UuIil9ZnVuY3Rpb24gcGFyc2VXTW9kZSh0LHIpe3ZhciBhPXIuZ2V0T2JqKCk7TnVtYmVyLmlzSW50ZWdlcihhKSYmKHQudmVydGljYWw9ISFhKX1mdW5jdGlvbiBwYXJzZUNNYXBOYW1lKHQscil7dmFyIGE9ci5nZXRPYmooKTsoMCxjLmlzTmFtZSkoYSkmJigwLG8uaXNTdHJpbmcpKGEubmFtZSkmJih0Lm5hbWU9YS5uYW1lKX1mdW5jdGlvbiBwYXJzZUNNYXAodCxyLGEsaSl7dmFyIGwsaDtlOmZvcig7Oyl0cnl7dmFyIGQ9ci5nZXRPYmooKTtpZigoMCxjLmlzRU9GKShkKSlicmVhaztpZigoMCxjLmlzTmFtZSkoZCkpeyJXTW9kZSI9PT1kLm5hbWU/cGFyc2VXTW9kZSh0LHIpOiJDTWFwTmFtZSI9PT1kLm5hbWUmJnBhcnNlQ01hcE5hbWUodCxyKTtsPWR9ZWxzZSBpZigoMCxjLmlzQ21kKShkKSlzd2l0Y2goZC5jbWQpe2Nhc2UiZW5kY21hcCI6YnJlYWsgZTtjYXNlInVzZWNtYXAiOigwLGMuaXNOYW1lKShsKSYmKGg9bC5uYW1lKTticmVhaztjYXNlImJlZ2luY29kZXNwYWNlcmFuZ2UiOnBhcnNlQ29kZXNwYWNlUmFuZ2UodCxyKTticmVhaztjYXNlImJlZ2luYmZjaGFyIjpwYXJzZUJmQ2hhcih0LHIpO2JyZWFrO2Nhc2UiYmVnaW5jaWRjaGFyIjpwYXJzZUNpZENoYXIodCxyKTticmVhaztjYXNlImJlZ2luYmZyYW5nZSI6cGFyc2VCZlJhbmdlKHQscik7YnJlYWs7Y2FzZSJiZWdpbmNpZHJhbmdlIjpwYXJzZUNpZFJhbmdlKHQscil9fWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiB1Lk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7KDAsby53YXJuKSgiSW52YWxpZCBjTWFwIGRhdGE6ICIrdCk7Y29udGludWV9IWkmJmgmJihpPWgpO3JldHVybiBpP2V4dGVuZENNYXAodCxhLGkpOlByb21pc2UucmVzb2x2ZSh0KX1mdW5jdGlvbiBleHRlbmRDTWFwKHQscixhKXtyZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAoYSxyKS50aGVuKChmdW5jdGlvbihyKXt0LnVzZUNNYXA9cjtpZigwPT09dC5udW1Db2Rlc3BhY2VSYW5nZXMpe2Zvcih2YXIgYT10LnVzZUNNYXAuY29kZXNwYWNlUmFuZ2VzLGk9MDtpPGEubGVuZ3RoO2krKyl0LmNvZGVzcGFjZVJhbmdlc1tpXT1hW2ldLnNsaWNlKCk7dC5udW1Db2Rlc3BhY2VSYW5nZXM9dC51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlc310LnVzZUNNYXAuZm9yRWFjaCgoZnVuY3Rpb24ocixhKXt0LmNvbnRhaW5zKHIpfHx0Lm1hcE9uZShyLHQudXNlQ01hcC5sb29rdXAocikpfSkpO3JldHVybiB0fSkpfWZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKHQscil7cmV0dXJuIklkZW50aXR5LUgiPT09dD9Qcm9taXNlLnJlc29sdmUobmV3IGcoITEsMikpOiJJZGVudGl0eS1WIj09PXQ/UHJvbWlzZS5yZXNvbHZlKG5ldyBnKCEwLDIpKTpkLmluY2x1ZGVzKHQpP3I/cih0KS50aGVuKChmdW5jdGlvbih0KXt2YXIgYT10LmNNYXBEYXRhLGk9dC5jb21wcmVzc2lvblR5cGUsYz1uZXcgbSghMCk7aWYoaT09PW8uQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkpcmV0dXJuKG5ldyB5KS5wcm9jZXNzKGEsYywoZnVuY3Rpb24odCl7cmV0dXJuIGV4dGVuZENNYXAoYyxyLHQpfSkpO2lmKGk9PT1vLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORSl7dmFyIHU9bmV3IGwuTGV4ZXIobmV3IGguU3RyZWFtKGEpKTtyZXR1cm4gcGFyc2VDTWFwKGMsdSxyLG51bGwpfXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIlRPRE86IE9ubHkgQklOQVJZL05PTkUgQ01hcCBjb21wcmVzc2lvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLiIpKX0pKTpQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkJ1aWx0LWluIENNYXAgcGFyYW1ldGVycyBhcmUgbm90IHByb3ZpZGVkLiIpKTpQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIlVua25vd24gQ01hcCBuYW1lOiAiK3QpKX1yZXR1cm57Y3JlYXRlOmZ1bmN0aW9uIGNyZWF0ZSh0KXtyZXR1cm4gZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksbyl7dmFyIGM9dC5hcHBseShyLGEpO2Z1bmN0aW9uIF9uZXh0KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChjLGksbyxfbmV4dCxfdGhyb3csIm5leHQiLHQpfWZ1bmN0aW9uIF90aHJvdyh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJ0aHJvdyIsdCl9X25leHQodm9pZCAwKX0pKX19KGkuZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlKCl7dmFyIHIsYSxvLHUsaDtyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUkKGkpe2Zvcig7Oylzd2l0Y2goaS5wcmV2PWkubmV4dCl7Y2FzZSAwOnI9dC5lbmNvZGluZzthPXQuZmV0Y2hCdWlsdEluQ01hcDtvPXQudXNlQ01hcDtpZighKDAsYy5pc05hbWUpKHIpKXtpLm5leHQ9NzticmVha31yZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsY3JlYXRlQnVpbHRJbkNNYXAoci5uYW1lLGEpKTtjYXNlIDc6aWYoISgwLGMuaXNTdHJlYW0pKHIpKXtpLm5leHQ9MTE7YnJlYWt9dT1uZXcgbTtoPW5ldyBsLkxleGVyKHIpO3JldHVybiBpLmFicnVwdCgicmV0dXJuIixwYXJzZUNNYXAodSxoLGEsbykudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNJZGVudGl0eUNNYXA/Y3JlYXRlQnVpbHRJbkNNYXAodC5uYW1lLGEpOnR9KSkpO2Nhc2UgMTE6dGhyb3cgbmV3IEVycm9yKCJFbmNvZGluZyByZXF1aXJlZC4iKTtjYXNlIDEyOmNhc2UiZW5kIjpyZXR1cm4gaS5zdG9wKCl9fSksX2NhbGxlZSl9KSkpKCl9fX0oKTtyLkNNYXBGYWN0b3J5PWJ9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuZ2V0Rm9udFR5cGU9Z2V0Rm9udFR5cGU7ci5JZGVudGl0eVRvVW5pY29kZU1hcD1yLlRvVW5pY29kZU1hcD1yLkZvbnRGbGFncz1yLkZvbnQ9ci5FcnJvckZvbnQ9ci5TRUFDX0FOQUxZU0lTX0VOQUJMRUQ9dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIyOCksYz1hKDIzMSksbD1hKDIzMCksdT1hKDIzMiksaD1hKDIzMyksZD1hKDIwNSkscD1hKDIzNCksbT1hKDIyNiksZz1hKDIwOSkseT1hKDIzNSk7ZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodCxyKXt2YXIgYTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09dFtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KHQpfHwoYT1fdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCkpfHxyJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXthJiYodD1hKTt2YXIgaT0wLG89ZnVuY3Rpb24gRigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uIG4oKXtyZXR1cm4gaT49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbaSsrXX19LGU6ZnVuY3Rpb24gZSh0KXt0aHJvdyB0fSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgYyxsPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24gcygpe2E9dFtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24gbigpe3ZhciB0PWEubmV4dCgpO2w9dC5kb25lO3JldHVybiB0fSxlOmZ1bmN0aW9uIGUodCl7dT0hMDtjPXR9LGY6ZnVuY3Rpb24gZigpe3RyeXtsfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgY319fX1mdW5jdGlvbiBfc2xpY2VkVG9BcnJheSh0LHIpe3JldHVybiBmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXModCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH0odCl8fGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdCh0LHIpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpKXJldHVybjt2YXIgYT1bXSxpPSEwLG89ITEsYz12b2lkIDA7dHJ5e2Zvcih2YXIgbCx1PXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEoaT0obD11Lm5leHQoKSkuZG9uZSk7aT0hMCl7YS5wdXNoKGwudmFsdWUpO2lmKHImJmEubGVuZ3RoPT09cilicmVha319Y2F0Y2godCl7bz0hMDtjPXR9ZmluYWxseXt0cnl7aXx8bnVsbD09dS5yZXR1cm58fHUucmV0dXJuKCl9ZmluYWxseXtpZihvKXRocm93IGN9fXJldHVybiBhfSh0LHIpfHxfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxyKXx8ZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQscil7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSk7cmV0dXJuIk1hcCI9PT1hfHwiU2V0Ij09PWE/QXJyYXkuZnJvbSh0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP19hcnJheUxpa2VUb0FycmF5KHQscik6dm9pZCAwfX1mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSh0LHIpeyhudWxsPT1yfHxyPnQubGVuZ3RoKSYmKHI9dC5sZW5ndGgpO2Zvcih2YXIgYT0wLGk9bmV3IEFycmF5KHIpO2E8cjthKyspaVthXT10W2FdO3JldHVybiBpfXZhciBiPVtbNTczNDQsNjM3NDNdLFsxMDQ4NTc2LDExMTQxMDldXTtyLlNFQUNfQU5BTFlTSVNfRU5BQkxFRD0hMDt2YXIgdj1bImFzY2VudCIsImJib3giLCJibGFjayIsImJvbGQiLCJjaGFyUHJvY09wZXJhdG9yTGlzdCIsImNvbXBvc2l0ZSIsImRhdGEiLCJkZWZhdWx0Vk1ldHJpY3MiLCJkZWZhdWx0V2lkdGgiLCJkZXNjZW50IiwiZmFsbGJhY2tOYW1lIiwiZm9udE1hdHJpeCIsImZvbnRUeXBlIiwiaXNNb25vc3BhY2UiLCJpc1NlcmlmRm9udCIsImlzVHlwZTNGb250IiwiaXRhbGljIiwibG9hZGVkTmFtZSIsIm1pbWV0eXBlIiwibWlzc2luZ0ZpbGUiLCJuYW1lIiwicmVtZWFzdXJlIiwic3VidHlwZSIsInR5cGUiLCJ2ZXJ0aWNhbCJdLFM9WyJjTWFwIiwiZGVmYXVsdEVuY29kaW5nIiwiZGlmZmVyZW5jZXMiLCJpc1N5bWJvbGljRm9udCIsInNlYWNNYXAiLCJ0b0ZvbnRDaGFyIiwidG9Vbmljb2RlIiwidm1ldHJpY3MiLCJ3aWR0aHMiXSxrPXtGaXhlZFBpdGNoOjEsU2VyaWY6MixTeW1ib2xpYzo0LFNjcmlwdDo4LE5vbnN5bWJvbGljOjMyLEl0YWxpYzo2NCxBbGxDYXA6NjU1MzYsU21hbGxDYXA6MTMxMDcyLEZvcmNlQm9sZDoyNjIxNDR9O3IuRm9udEZsYWdzPWs7dmFyIHc9WyIubm90ZGVmIiwiLm51bGwiLCJub25tYXJraW5ncmV0dXJuIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVzaW5nbGUiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsImdyYXZlIiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsIkFkaWVyZXNpcyIsIkFyaW5nIiwiQ2NlZGlsbGEiLCJFYWN1dGUiLCJOdGlsZGUiLCJPZGllcmVzaXMiLCJVZGllcmVzaXMiLCJhYWN1dGUiLCJhZ3JhdmUiLCJhY2lyY3VtZmxleCIsImFkaWVyZXNpcyIsImF0aWxkZSIsImFyaW5nIiwiY2NlZGlsbGEiLCJlYWN1dGUiLCJlZ3JhdmUiLCJlY2lyY3VtZmxleCIsImVkaWVyZXNpcyIsImlhY3V0ZSIsImlncmF2ZSIsImljaXJjdW1mbGV4IiwiaWRpZXJlc2lzIiwibnRpbGRlIiwib2FjdXRlIiwib2dyYXZlIiwib2NpcmN1bWZsZXgiLCJvZGllcmVzaXMiLCJvdGlsZGUiLCJ1YWN1dGUiLCJ1Z3JhdmUiLCJ1Y2lyY3VtZmxleCIsInVkaWVyZXNpcyIsImRhZ2dlciIsImRlZ3JlZSIsImNlbnQiLCJzdGVybGluZyIsInNlY3Rpb24iLCJidWxsZXQiLCJwYXJhZ3JhcGgiLCJnZXJtYW5kYmxzIiwicmVnaXN0ZXJlZCIsImNvcHlyaWdodCIsInRyYWRlbWFyayIsImFjdXRlIiwiZGllcmVzaXMiLCJub3RlcXVhbCIsIkFFIiwiT3NsYXNoIiwiaW5maW5pdHkiLCJwbHVzbWludXMiLCJsZXNzZXF1YWwiLCJncmVhdGVyZXF1YWwiLCJ5ZW4iLCJtdSIsInBhcnRpYWxkaWZmIiwic3VtbWF0aW9uIiwicHJvZHVjdCIsInBpIiwiaW50ZWdyYWwiLCJvcmRmZW1pbmluZSIsIm9yZG1hc2N1bGluZSIsIk9tZWdhIiwiYWUiLCJvc2xhc2giLCJxdWVzdGlvbmRvd24iLCJleGNsYW1kb3duIiwibG9naWNhbG5vdCIsInJhZGljYWwiLCJmbG9yaW4iLCJhcHByb3hlcXVhbCIsIkRlbHRhIiwiZ3VpbGxlbW90bGVmdCIsImd1aWxsZW1vdHJpZ2h0IiwiZWxsaXBzaXMiLCJub25icmVha2luZ3NwYWNlIiwiQWdyYXZlIiwiQXRpbGRlIiwiT3RpbGRlIiwiT0UiLCJvZSIsImVuZGFzaCIsImVtZGFzaCIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJscmlnaHQiLCJxdW90ZWxlZnQiLCJxdW90ZXJpZ2h0IiwiZGl2aWRlIiwibG96ZW5nZSIsInlkaWVyZXNpcyIsIllkaWVyZXNpcyIsImZyYWN0aW9uIiwiY3VycmVuY3kiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInBlcnRob3VzYW5kIiwiQWNpcmN1bWZsZXgiLCJFY2lyY3VtZmxleCIsIkFhY3V0ZSIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJhcHBsZSIsIk9ncmF2ZSIsIlVhY3V0ZSIsIlVjaXJjdW1mbGV4IiwiVWdyYXZlIiwiZG90bGVzc2kiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iLCJMc2xhc2giLCJsc2xhc2giLCJTY2Fyb24iLCJzY2Fyb24iLCJaY2Fyb24iLCJ6Y2Fyb24iLCJicm9rZW5iYXIiLCJFdGgiLCJldGgiLCJZYWN1dGUiLCJ5YWN1dGUiLCJUaG9ybiIsInRob3JuIiwibWludXMiLCJtdWx0aXBseSIsIm9uZXN1cGVyaW9yIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwib25laGFsZiIsIm9uZXF1YXJ0ZXIiLCJ0aHJlZXF1YXJ0ZXJzIiwiZnJhbmMiLCJHYnJldmUiLCJnYnJldmUiLCJJZG90YWNjZW50IiwiU2NlZGlsbGEiLCJzY2VkaWxsYSIsIkNhY3V0ZSIsImNhY3V0ZSIsIkNjYXJvbiIsImNjYXJvbiIsImRjcm9hdCJdO2Z1bmN0aW9uIGFkanVzdFdpZHRocyh0KXtpZih0LmZvbnRNYXRyaXgmJnQuZm9udE1hdHJpeFswXSE9PWkuRk9OVF9JREVOVElUWV9NQVRSSVhbMF0pe3ZhciByPS4wMDEvdC5mb250TWF0cml4WzBdLGE9dC53aWR0aHM7Zm9yKHZhciBvIGluIGEpYVtvXSo9cjt0LmRlZmF1bHRXaWR0aCo9cn19ZnVuY3Rpb24gZ2V0Rm9udFR5cGUodCxyKXtzd2l0Y2godCl7Y2FzZSJUeXBlMSI6cmV0dXJuIlR5cGUxQyI9PT1yP2kuRm9udFR5cGUuVFlQRTFDOmkuRm9udFR5cGUuVFlQRTE7Y2FzZSJDSURGb250VHlwZTAiOnJldHVybiJDSURGb250VHlwZTBDIj09PXI/aS5Gb250VHlwZS5DSURGT05UVFlQRTBDOmkuRm9udFR5cGUuQ0lERk9OVFRZUEUwO2Nhc2UiT3BlblR5cGUiOnJldHVybiBpLkZvbnRUeXBlLk9QRU5UWVBFO2Nhc2UiVHJ1ZVR5cGUiOnJldHVybiBpLkZvbnRUeXBlLlRSVUVUWVBFO2Nhc2UiQ0lERm9udFR5cGUyIjpyZXR1cm4gaS5Gb250VHlwZS5DSURGT05UVFlQRTI7Y2FzZSJNTVR5cGUxIjpyZXR1cm4gaS5Gb250VHlwZS5NTVRZUEUxO2Nhc2UiVHlwZTAiOnJldHVybiBpLkZvbnRUeXBlLlRZUEUwO2RlZmF1bHQ6cmV0dXJuIGkuRm9udFR5cGUuVU5LTk9XTn19ZnVuY3Rpb24gcmVjb3ZlckdseXBoTmFtZSh0LHIpe2lmKHZvaWQgMCE9PXJbdF0pcmV0dXJuIHQ7dmFyIGE9KDAsaC5nZXRVbmljb2RlRm9yR2x5cGgpKHQscik7aWYoLTEhPT1hKWZvcih2YXIgbyBpbiByKWlmKHJbb109PT1hKXJldHVybiBvOygwLGkuaW5mbykoIlVuYWJsZSB0byByZWNvdmVyIGEgc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3I6ICIrdCk7cmV0dXJuIHR9dmFyIEM9ZnVuY3Rpb24gR2x5cGhDbG9zdXJlKCl7ZnVuY3Rpb24gR2x5cGgodCxyLGEsaSxvLGMsbCx1KXt0aGlzLmZvbnRDaGFyPXQ7dGhpcy51bmljb2RlPXI7dGhpcy5hY2NlbnQ9YTt0aGlzLndpZHRoPWk7dGhpcy52bWV0cmljPW87dGhpcy5vcGVyYXRvckxpc3RJZD1jO3RoaXMuaXNTcGFjZT1sO3RoaXMuaXNJbkZvbnQ9dX1HbHlwaC5wcm90b3R5cGUubWF0Y2hlc0ZvckNhY2hlPWZ1bmN0aW9uKHQscixhLGksbyxjLGwsdSl7cmV0dXJuIHRoaXMuZm9udENoYXI9PT10JiZ0aGlzLnVuaWNvZGU9PT1yJiZ0aGlzLmFjY2VudD09PWEmJnRoaXMud2lkdGg9PT1pJiZ0aGlzLnZtZXRyaWM9PT1vJiZ0aGlzLm9wZXJhdG9yTGlzdElkPT09YyYmdGhpcy5pc1NwYWNlPT09bCYmdGhpcy5pc0luRm9udD09PXV9O3JldHVybiBHbHlwaH0oKSxfPWZ1bmN0aW9uIFRvVW5pY29kZU1hcENsb3N1cmUoKXtmdW5jdGlvbiBUb1VuaWNvZGVNYXAoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W107dGhpcy5fbWFwPXR9VG9Vbmljb2RlTWFwLnByb3RvdHlwZT17Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLl9tYXAubGVuZ3RofSxmb3JFYWNoOmZ1bmN0aW9uIGZvckVhY2godCl7Zm9yKHZhciByIGluIHRoaXMuX21hcCl0KHIsdGhpcy5fbWFwW3JdLmNoYXJDb2RlQXQoMCkpfSxoYXM6ZnVuY3Rpb24gaGFzKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLl9tYXBbdF19LGdldDpmdW5jdGlvbiBnZXQodCl7cmV0dXJuIHRoaXMuX21hcFt0XX0sY2hhckNvZGVPZjpmdW5jdGlvbiBjaGFyQ29kZU9mKHQpe3ZhciByPXRoaXMuX21hcDtpZihyLmxlbmd0aDw9NjU1MzYpcmV0dXJuIHIuaW5kZXhPZih0KTtmb3IodmFyIGEgaW4gcilpZihyW2FdPT09dClyZXR1cm4gMHxhO3JldHVybi0xfSxhbWVuZDpmdW5jdGlvbiBhbWVuZCh0KXtmb3IodmFyIHIgaW4gdCl0aGlzLl9tYXBbcl09dFtyXX19O3JldHVybiBUb1VuaWNvZGVNYXB9KCk7ci5Ub1VuaWNvZGVNYXA9Xzt2YXIgeD1mdW5jdGlvbiBJZGVudGl0eVRvVW5pY29kZU1hcENsb3N1cmUoKXtmdW5jdGlvbiBJZGVudGl0eVRvVW5pY29kZU1hcCh0LHIpe3RoaXMuZmlyc3RDaGFyPXQ7dGhpcy5sYXN0Q2hhcj1yfUlkZW50aXR5VG9Vbmljb2RlTWFwLnByb3RvdHlwZT17Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxhc3RDaGFyKzEtdGhpcy5maXJzdENoYXJ9LGZvckVhY2g6ZnVuY3Rpb24gZm9yRWFjaCh0KXtmb3IodmFyIHI9dGhpcy5maXJzdENoYXIsYT10aGlzLmxhc3RDaGFyO3I8PWE7cisrKXQocixyKX0saGFzOmZ1bmN0aW9uIGhhcyh0KXtyZXR1cm4gdGhpcy5maXJzdENoYXI8PXQmJnQ8PXRoaXMubGFzdENoYXJ9LGdldDpmdW5jdGlvbiBnZXQodCl7aWYodGhpcy5maXJzdENoYXI8PXQmJnQ8PXRoaXMubGFzdENoYXIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodCl9LGNoYXJDb2RlT2Y6ZnVuY3Rpb24gY2hhckNvZGVPZih0KXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0KSYmdD49dGhpcy5maXJzdENoYXImJnQ8PXRoaXMubGFzdENoYXI/dDotMX0sYW1lbmQ6ZnVuY3Rpb24gYW1lbmQodCl7KDAsaS51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpIil9fTtyZXR1cm4gSWRlbnRpdHlUb1VuaWNvZGVNYXB9KCk7ci5JZGVudGl0eVRvVW5pY29kZU1hcD14O3ZhciBBPWZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJDbG9zdXJlKCl7ZnVuY3Rpb24gd3JpdGVJbnQxNih0LHIsYSl7dFtyXT1hPj44JjI1NTt0W3IrMV09MjU1JmF9ZnVuY3Rpb24gd3JpdGVJbnQzMih0LHIsYSl7dFtyXT1hPj4yNCYyNTU7dFtyKzFdPWE+PjE2JjI1NTt0W3IrMl09YT4+OCYyNTU7dFtyKzNdPTI1NSZhfWZ1bmN0aW9uIHdyaXRlRGF0YSh0LHIsYSl7dmFyIGksbztpZihhIGluc3RhbmNlb2YgVWludDhBcnJheSl0LnNldChhLHIpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBhKWZvcihpPTAsbz1hLmxlbmd0aDtpPG87aSsrKXRbcisrXT0yNTUmYS5jaGFyQ29kZUF0KGkpO2Vsc2UgZm9yKGk9MCxvPWEubGVuZ3RoO2k8bztpKyspdFtyKytdPTI1NSZhW2ldfWZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXIodCl7dGhpcy5zZm50PXQ7dGhpcy50YWJsZXM9T2JqZWN0LmNyZWF0ZShudWxsKX1PcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcz1mdW5jdGlvbiBPcGVuVHlwZUZpbGVCdWlsZGVyX2dldFNlYXJjaFBhcmFtcyh0LHIpe2Zvcih2YXIgYT0xLGk9MDsoYV50KT5hOyl7YTw8PTE7aSsrfXZhciBvPWEqcjtyZXR1cm57cmFuZ2U6byxlbnRyeTppLHJhbmdlU2hpZnQ6cip0LW99fTtPcGVuVHlwZUZpbGVCdWlsZGVyLnByb3RvdHlwZT17dG9BcnJheTpmdW5jdGlvbiBPcGVuVHlwZUZpbGVCdWlsZGVyX3RvQXJyYXkoKXt2YXIgdD10aGlzLnNmbnQscj10aGlzLnRhYmxlcyxhPU9iamVjdC5rZXlzKHIpO2Euc29ydCgpO3ZhciBvLGMsbCx1LGgscD1hLmxlbmd0aCxtPTEyKzE2KnAsZz1bbV07Zm9yKG89MDtvPHA7bysrKXttKz0oKHU9clthW29dXSkubGVuZ3RoKzMmLTQpPj4+MDtnLnB1c2gobSl9dmFyIHk9bmV3IFVpbnQ4QXJyYXkobSk7Zm9yKG89MDtvPHA7bysrKXt1PXJbYVtvXV07d3JpdGVEYXRhKHksZ1tvXSx1KX0idHJ1ZSI9PT10JiYodD0oMCxpLnN0cmluZzMyKSg2NTUzNikpO3lbMF09MjU1JnQuY2hhckNvZGVBdCgwKTt5WzFdPTI1NSZ0LmNoYXJDb2RlQXQoMSk7eVsyXT0yNTUmdC5jaGFyQ29kZUF0KDIpO3lbM109MjU1JnQuY2hhckNvZGVBdCgzKTt3cml0ZUludDE2KHksNCxwKTt2YXIgYj1PcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcyhwLDE2KTt3cml0ZUludDE2KHksNixiLnJhbmdlKTt3cml0ZUludDE2KHksOCxiLmVudHJ5KTt3cml0ZUludDE2KHksMTAsYi5yYW5nZVNoaWZ0KTttPTEyO2ZvcihvPTA7bzxwO28rKyl7aD1hW29dO3lbbV09MjU1JmguY2hhckNvZGVBdCgwKTt5W20rMV09MjU1JmguY2hhckNvZGVBdCgxKTt5W20rMl09MjU1JmguY2hhckNvZGVBdCgyKTt5W20rM109MjU1JmguY2hhckNvZGVBdCgzKTt2YXIgdj0wO2ZvcihjPWdbb10sbD1nW28rMV07YzxsO2MrPTQpe3Y9disoMCxkLnJlYWRVaW50MzIpKHksYyk+Pj4wfXdyaXRlSW50MzIoeSxtKzQsdik7d3JpdGVJbnQzMih5LG0rOCxnW29dKTt3cml0ZUludDMyKHksbSsxMixyW2hdLmxlbmd0aCk7bSs9MTZ9cmV0dXJuIHl9LGFkZFRhYmxlOmZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJfYWRkVGFibGUodCxyKXtpZih0IGluIHRoaXMudGFibGVzKXRocm93IG5ldyBFcnJvcigiVGFibGUgIit0KyIgYWxyZWFkeSBleGlzdHMiKTt0aGlzLnRhYmxlc1t0XT1yfX07cmV0dXJuIE9wZW5UeXBlRmlsZUJ1aWxkZXJ9KCksVD1mdW5jdGlvbiBGb250Q2xvc3VyZSgpe2Z1bmN0aW9uIEZvbnQodCxyLGEpe3ZhciBvO3RoaXMubmFtZT10O3RoaXMubG9hZGVkTmFtZT1hLmxvYWRlZE5hbWU7dGhpcy5pc1R5cGUzRm9udD1hLmlzVHlwZTNGb250O3RoaXMubWlzc2luZ0ZpbGU9ITE7dGhpcy5nbHlwaENhY2hlPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5pc1NlcmlmRm9udD0hIShhLmZsYWdzJmsuU2VyaWYpO3RoaXMuaXNTeW1ib2xpY0ZvbnQ9ISEoYS5mbGFncyZrLlN5bWJvbGljKTt0aGlzLmlzTW9ub3NwYWNlPSEhKGEuZmxhZ3Mmay5GaXhlZFBpdGNoKTt2YXIgYz1hLnR5cGUsbD1hLnN1YnR5cGU7dGhpcy50eXBlPWM7dGhpcy5zdWJ0eXBlPWw7dmFyIHU9InNhbnMtc2VyaWYiO3RoaXMuaXNNb25vc3BhY2U/dT0ibW9ub3NwYWNlIjp0aGlzLmlzU2VyaWZGb250JiYodT0ic2VyaWYiKTt0aGlzLmZhbGxiYWNrTmFtZT11O3RoaXMuZGlmZmVyZW5jZXM9YS5kaWZmZXJlbmNlczt0aGlzLndpZHRocz1hLndpZHRoczt0aGlzLmRlZmF1bHRXaWR0aD1hLmRlZmF1bHRXaWR0aDt0aGlzLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZTt0aGlzLmNNYXA9YS5jTWFwO3RoaXMuYXNjZW50PWEuYXNjZW50LzFlMzt0aGlzLmRlc2NlbnQ9YS5kZXNjZW50LzFlMzt0aGlzLmZvbnRNYXRyaXg9YS5mb250TWF0cml4O3RoaXMuYmJveD1hLmJib3g7dGhpcy5kZWZhdWx0RW5jb2Rpbmc9YS5kZWZhdWx0RW5jb2Rpbmc7dGhpcy50b1VuaWNvZGU9YS50b1VuaWNvZGU7dGhpcy5mYWxsYmFja1RvVW5pY29kZT1hLmZhbGxiYWNrVG9Vbmljb2RlfHxuZXcgXzt0aGlzLnRvRm9udENoYXI9W107aWYoIlR5cGUzIiE9PWEudHlwZSl7dGhpcy5jaWRFbmNvZGluZz1hLmNpZEVuY29kaW5nO3RoaXMudmVydGljYWw9ISFhLnZlcnRpY2FsO2lmKHRoaXMudmVydGljYWwpe3RoaXMudm1ldHJpY3M9YS52bWV0cmljczt0aGlzLmRlZmF1bHRWTWV0cmljcz1hLmRlZmF1bHRWTWV0cmljc31pZihyJiYhci5pc0VtcHR5KXt2YXIgaD1fc2xpY2VkVG9BcnJheShmdW5jdGlvbiBnZXRGb250RmlsZVR5cGUodCxyKXt2YXIgYSxvLGM9ci50eXBlLGw9ci5zdWJ0eXBlLHU9ci5jb21wb3NpdGU7aWYoZnVuY3Rpb24gaXNUcnVlVHlwZUZpbGUodCl7dmFyIHI9dC5wZWVrQnl0ZXMoNCk7cmV0dXJuIDY1NTM2PT09KDAsZC5yZWFkVWludDMyKShyLDApfHwidHJ1ZSI9PT0oMCxpLmJ5dGVzVG9TdHJpbmcpKHIpfSh0KXx8aXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKHQpKWE9dT8iQ0lERm9udFR5cGUyIjoiVHJ1ZVR5cGUiO2Vsc2UgaWYoZnVuY3Rpb24gaXNPcGVuVHlwZUZpbGUodCl7dmFyIHI9dC5wZWVrQnl0ZXMoNCk7cmV0dXJuIk9UVE8iPT09KDAsaS5ieXRlc1RvU3RyaW5nKShyKX0odCkpYT11PyJDSURGb250VHlwZTIiOiJPcGVuVHlwZSI7ZWxzZSBpZihmdW5jdGlvbiBpc1R5cGUxRmlsZSh0KXt2YXIgcj10LnBlZWtCeXRlcygyKTtpZigzNz09PXJbMF0mJjMzPT09clsxXSlyZXR1cm4hMDtpZigxMjg9PT1yWzBdJiYxPT09clsxXSlyZXR1cm4hMDtyZXR1cm4hMX0odCkpYT11PyJDSURGb250VHlwZTAiOiJNTVR5cGUxIj09PWM/Ik1NVHlwZTEiOiJUeXBlMSI7ZWxzZSBpZihmdW5jdGlvbiBpc0NGRkZpbGUodCl7dmFyIHI9dC5wZWVrQnl0ZXMoNCk7aWYoclswXT49MSYmclszXT49MSYmclszXTw9NClyZXR1cm4hMDtyZXR1cm4hMX0odCkpaWYodSl7YT0iQ0lERm9udFR5cGUwIjtvPSJDSURGb250VHlwZTBDIn1lbHNle2E9Ik1NVHlwZTEiPT09Yz8iTU1UeXBlMSI6IlR5cGUxIjtvPSJUeXBlMUMifWVsc2V7KDAsaS53YXJuKSgiZ2V0Rm9udEZpbGVUeXBlOiBVbmFibGUgdG8gZGV0ZWN0IGNvcnJlY3QgZm9udCBmaWxlIFR5cGUvU3VidHlwZS4iKTthPWM7bz1sfXJldHVyblthLG9dfShyLGEpLDIpO2M9aFswXTtsPWhbMV07Yz09PXRoaXMudHlwZSYmbD09PXRoaXMuc3VidHlwZXx8KDAsaS5pbmZvKSgiSW5jb25zaXN0ZW50IGZvbnQgZmlsZSBUeXBlL1N1YlR5cGUsIGV4cGVjdGVkOiAiKyIiLmNvbmNhdCh0aGlzLnR5cGUsIi8iKS5jb25jYXQodGhpcy5zdWJ0eXBlLCIgYnV0IGZvdW5kOiAiKS5jb25jYXQoYywiLyIpLmNvbmNhdChsLCIuIikpO3RyeXt2YXIgcDtzd2l0Y2goYyl7Y2FzZSJNTVR5cGUxIjooMCxpLmluZm8pKCJNTVR5cGUxIGZvbnQgKCIrdCsiKSwgZmFsbGluZyBiYWNrIHRvIFR5cGUxLiIpO2Nhc2UiVHlwZTEiOmNhc2UiQ0lERm9udFR5cGUwIjp0aGlzLm1pbWV0eXBlPSJmb250L29wZW50eXBlIjt2YXIgbT0iVHlwZTFDIj09PWx8fCJDSURGb250VHlwZTBDIj09PWw/bmV3IFAocixhKTpuZXcgSSh0LHIsYSk7YWRqdXN0V2lkdGhzKGEpO3A9dGhpcy5jb252ZXJ0KHQsbSxhKTticmVhaztjYXNlIk9wZW5UeXBlIjpjYXNlIlRydWVUeXBlIjpjYXNlIkNJREZvbnRUeXBlMiI6dGhpcy5taW1ldHlwZT0iZm9udC9vcGVudHlwZSI7cD10aGlzLmNoZWNrQW5kUmVwYWlyKHQscixhKTtpZih0aGlzLmlzT3BlblR5cGUpe2FkanVzdFdpZHRocyhhKTtjPSJPcGVuVHlwZSJ9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiRm9udCAiLmNvbmNhdChjLCIgaXMgbm90IHN1cHBvcnRlZCIpKX19Y2F0Y2godCl7KDAsaS53YXJuKSh0KTt0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KCk7cmV0dXJufXRoaXMuZGF0YT1wO3RoaXMuZm9udFR5cGU9Z2V0Rm9udFR5cGUoYyxsKTt0aGlzLmZvbnRNYXRyaXg9YS5mb250TWF0cml4O3RoaXMud2lkdGhzPWEud2lkdGhzO3RoaXMuZGVmYXVsdFdpZHRoPWEuZGVmYXVsdFdpZHRoO3RoaXMudG9Vbmljb2RlPWEudG9Vbmljb2RlO3RoaXMuc2VhY01hcD1hLnNlYWNNYXB9ZWxzZXtyJiYoMCxpLndhcm4pKCdGb250IGZpbGUgaXMgZW1wdHkgaW4gIicrdCsnIiAoJyt0aGlzLmxvYWRlZE5hbWUrIikiKTt0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KCl9fWVsc2V7Zm9yKG89MDtvPDI1NjtvKyspdGhpcy50b0ZvbnRDaGFyW29dPXRoaXMuZGlmZmVyZW5jZXNbb118fGEuZGVmYXVsdEVuY29kaW5nW29dO3RoaXMuZm9udFR5cGU9aS5Gb250VHlwZS5UWVBFM319ZnVuY3Rpb24gaW50MTYodCxyKXtyZXR1cm4odDw8OCkrcn1mdW5jdGlvbiBzaWduZWRJbnQxNih0LHIpe3ZhciBhPSh0PDw4KStyO3JldHVybiAzMjc2OCZhP2EtNjU1MzY6YX1mdW5jdGlvbiBzdHJpbmcxNih0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0Pj44JjI1NSwyNTUmdCl9ZnVuY3Rpb24gc2FmZVN0cmluZzE2KHQpe3Q+MzI3Njc/dD0zMjc2Nzp0PC0zMjc2OCYmKHQ9LTMyNzY4KTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0Pj44JjI1NSwyNTUmdCl9ZnVuY3Rpb24gaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKHQpe3ZhciByPXQucGVla0J5dGVzKDQpO3JldHVybiJ0dGNmIj09PSgwLGkuYnl0ZXNUb1N0cmluZykocil9ZnVuY3Rpb24gYnVpbGRUb0ZvbnRDaGFyKHQscixhKXtmb3IodmFyIGksbz1bXSxjPTAsbD10Lmxlbmd0aDtjPGw7YysrKS0xIT09KGk9KDAsaC5nZXRVbmljb2RlRm9yR2x5cGgpKHRbY10scikpJiYob1tjXT1pKTtmb3IodmFyIHUgaW4gYSktMSE9PShpPSgwLGguZ2V0VW5pY29kZUZvckdseXBoKShhW3VdLHIpKSYmKG9bK3VdPWkpO3JldHVybiBvfWZ1bmN0aW9uIGFkanVzdE1hcHBpbmcodCxyLGEpe3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCksYz1bXSxsPTAsdT1iW2xdWzBdLGg9YltsXVsxXTtmb3IodmFyIGQgaW4gdCl7dmFyIHA9dFtkfD0wXTtpZihyKHApKXtpZih1Pmgpe2lmKCsrbD49Yi5sZW5ndGgpeygwLGkud2FybikoIlJhbiBvdXQgb2Ygc3BhY2UgaW4gZm9udCBwcml2YXRlIHVzZSBhcmVhLiIpO2JyZWFrfXU9YltsXVswXTtoPWJbbF1bMV19dmFyIG09dSsrOzA9PT1wJiYocD1hKTtvW21dPXA7Y1tkXT1tfX1yZXR1cm57dG9Gb250Q2hhcjpjLGNoYXJDb2RlVG9HbHlwaElkOm8sbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZTp1fX1mdW5jdGlvbiBjcmVhdGVDbWFwVGFibGUodCxyKXt2YXIgYSxvLGMsbCx1PWZ1bmN0aW9uIGdldFJhbmdlcyh0LHIpe3ZhciBhPVtdO2Zvcih2YXIgaSBpbiB0KXRbaV0+PXJ8fGEucHVzaCh7Zm9udENoYXJDb2RlOjB8aSxnbHlwaElkOnRbaV19KTswPT09YS5sZW5ndGgmJmEucHVzaCh7Zm9udENoYXJDb2RlOjAsZ2x5cGhJZDowfSk7YS5zb3J0KChmdW5jdGlvbiBmb250R2V0UmFuZ2VzU29ydCh0LHIpe3JldHVybiB0LmZvbnRDaGFyQ29kZS1yLmZvbnRDaGFyQ29kZX0pKTtmb3IodmFyIG89W10sYz1hLmxlbmd0aCxsPTA7bDxjOyl7dmFyIHU9YVtsXS5mb250Q2hhckNvZGUsaD1bYVtsXS5nbHlwaElkXTsrK2w7Zm9yKHZhciBkPXU7bDxjJiZkKzE9PT1hW2xdLmZvbnRDaGFyQ29kZTspe2gucHVzaChhW2xdLmdseXBoSWQpOysrbDtpZig2NTUzNT09PSsrZClicmVha31vLnB1c2goW3UsZCxoXSl9cmV0dXJuIG99KHQsciksaD11W3UubGVuZ3RoLTFdWzFdPjY1NTM1PzI6MSxkPSJcMFwwIitzdHJpbmcxNihoKSsiXDADXDABIisoMCxpLnN0cmluZzMyKSg0KzgqaCk7Zm9yKGE9dS5sZW5ndGgtMTthPj0wJiYhKHVbYV1bMF08PTY1NTM1KTstLWEpO3ZhciBwPWErMTt1W2FdWzBdPDY1NTM1JiY2NTUzNT09PXVbYV1bMV0mJih1W2FdWzFdPTY1NTM0KTt2YXIgbSxnLHksYix2PXVbYV1bMV08NjU1MzU/MTowLFM9cCt2LGs9QS5nZXRTZWFyY2hQYXJhbXMoUywyKSx3PSIiLEM9IiIsXz0iIix4PSIiLFQ9IiIsUj0wO2ZvcihhPTAsbz1wO2E8bzthKyspe2c9KG09dVthXSlbMF07eT1tWzFdO3crPXN0cmluZzE2KGcpO0MrPXN0cmluZzE2KHkpO3ZhciBJPSEwO2ZvcihjPTEsbD0oYj1tWzJdKS5sZW5ndGg7YzxsOysrYylpZihiW2NdIT09YltjLTFdKzEpe0k9ITE7YnJlYWt9aWYoSSl7Xys9c3RyaW5nMTYoYlswXS1nJjY1NTM1KTt4Kz1zdHJpbmcxNigwKX1lbHNle3ZhciBQPTIqKFMtYSkrMipSO1IrPXktZysxO18rPXN0cmluZzE2KDApO3grPXN0cmluZzE2KFApO2ZvcihjPTAsbD1iLmxlbmd0aDtjPGw7KytjKVQrPXN0cmluZzE2KGJbY10pfX1pZih2PjApe0MrPSLDv8O/Ijt3Kz0iw7/DvyI7Xys9IlwwASI7eCs9IlwwXDAifXZhciBPPSJcMFwwIitzdHJpbmcxNigyKlMpK3N0cmluZzE2KGsucmFuZ2UpK3N0cmluZzE2KGsuZW50cnkpK3N0cmluZzE2KGsucmFuZ2VTaGlmdCkrQysiXDBcMCIrdytfK3grVCxFPSIiLEI9IiI7aWYoaD4xKXtkKz0iXDADXDBcbiIrKDAsaS5zdHJpbmczMikoNCs4KmgrNCtPLmxlbmd0aCk7RT0iIjtmb3IoYT0wLG89dS5sZW5ndGg7YTxvO2ErKyl7Zz0obT11W2FdKVswXTt2YXIgRD0oYj1tWzJdKVswXTtmb3IoYz0xLGw9Yi5sZW5ndGg7YzxsOysrYylpZihiW2NdIT09YltjLTFdKzEpe3k9bVswXStjLTE7RSs9KDAsaS5zdHJpbmczMikoZykrKDAsaS5zdHJpbmczMikoeSkrKDAsaS5zdHJpbmczMikoRCk7Zz15KzE7RD1iW2NdfUUrPSgwLGkuc3RyaW5nMzIpKGcpKygwLGkuc3RyaW5nMzIpKG1bMV0pKygwLGkuc3RyaW5nMzIpKEQpfUI9IlwwXGZcMFwwIisoMCxpLnN0cmluZzMyKShFLmxlbmd0aCsxNikrIlwwXDBcMFwwIisoMCxpLnN0cmluZzMyKShFLmxlbmd0aC8xMil9cmV0dXJuIGQrIlwwBCIrc3RyaW5nMTYoTy5sZW5ndGgrNCkrTytCK0V9ZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUodCxyLGEpe2E9YXx8e3VuaXRzUGVyRW06MCx5TWF4OjAseU1pbjowLGFzY2VudDowLGRlc2NlbnQ6MH07dmFyIG89MCxjPTAsbD0wLHU9MCxkPW51bGwscD0wO2lmKHIpe2Zvcih2YXIgbSBpbiByKXsoZD4obXw9MCl8fCFkKSYmKGQ9bSk7cDxtJiYocD1tKTt2YXIgZz0oMCxoLmdldFVuaWNvZGVSYW5nZUZvcikobSk7aWYoZzwzMilvfD0xPDxnO2Vsc2UgaWYoZzw2NCljfD0xPDxnLTMyO2Vsc2UgaWYoZzw5NilsfD0xPDxnLTY0O2Vsc2V7aWYoIShnPDEyMykpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIlVuaWNvZGUgcmFuZ2VzIEJpdHMgPiAxMjMgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZSIpO3V8PTE8PGctOTZ9fXA+NjU1MzUmJihwPTY1NTM1KX1lbHNle2Q9MDtwPTI1NX12YXIgeT10LmJib3h8fFswLDAsMCwwXSxiPWEudW5pdHNQZXJFbXx8MS8odC5mb250TWF0cml4fHxpLkZPTlRfSURFTlRJVFlfTUFUUklYKVswXSx2PXQuYXNjZW50U2NhbGVkPzE6Yi8xZTMsUz1hLmFzY2VudHx8TWF0aC5yb3VuZCh2Kih0LmFzY2VudHx8eVszXSkpLGs9YS5kZXNjZW50fHxNYXRoLnJvdW5kKHYqKHQuZGVzY2VudHx8eVsxXSkpO2s+MCYmdC5kZXNjZW50PjAmJnlbMV08MCYmKGs9LWspO3ZhciB3PWEueU1heHx8UyxDPS1hLnlNaW58fC1rO3JldHVybiJcMAMCJAHDtFwwBVwwXDACwooCwrtcMFwwXDDCjALCigLCu1wwXDABw59ceDAwMQECXDBcMFwwXDAGIitTdHJpbmcuZnJvbUNoYXJDb2RlKHQuZml4ZWRQaXRjaD85OjApKyJcMFwwXDBcMFwwXDAiKygwLGkuc3RyaW5nMzIpKG8pKygwLGkuc3RyaW5nMzIpKGMpKygwLGkuc3RyaW5nMzIpKGwpKygwLGkuc3RyaW5nMzIpKHUpKyIqMjEqIitzdHJpbmcxNih0Lml0YWxpY0FuZ2xlPzE6MCkrc3RyaW5nMTYoZHx8dC5maXJzdENoYXIpK3N0cmluZzE2KHB8fHQubGFzdENoYXIpK3N0cmluZzE2KFMpK3N0cmluZzE2KGspKyJcMGQiK3N0cmluZzE2KHcpK3N0cmluZzE2KEMpKyJcMFwwXDBcMFwwXDBcMFwwIitzdHJpbmcxNih0LnhIZWlnaHQpK3N0cmluZzE2KHQuY2FwSGVpZ2h0KStzdHJpbmcxNigwKStzdHJpbmcxNihkfHx0LmZpcnN0Q2hhcikrIlwwAyJ9ZnVuY3Rpb24gY3JlYXRlUG9zdFRhYmxlKHQpe3ZhciByPU1hdGguZmxvb3IodC5pdGFsaWNBbmdsZSpNYXRoLnBvdygyLDE2KSk7cmV0dXJuIlwwA1wwXDAiKygwLGkuc3RyaW5nMzIpKHIpKyJcMFwwXDBcMCIrKDAsaS5zdHJpbmczMikodC5maXhlZFBpdGNoKSsiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAifWZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZSh0LHIpe3J8fChyPVtbXSxbXV0pO3ZhciBhLGksbyxjLGwsdT1bclswXVswXXx8Ik9yaWdpbmFsIGxpY2VuY2UiLHJbMF1bMV18fHQsclswXVsyXXx8IlVua25vd24iLHJbMF1bM118fCJ1bmlxdWVJRCIsclswXVs0XXx8dCxyWzBdWzVdfHwiVmVyc2lvbiAwLjExIixyWzBdWzZdfHwiIixyWzBdWzddfHwiVW5rbm93biIsclswXVs4XXx8IlVua25vd24iLHJbMF1bOV18fCJVbmtub3duIl0saD1bXTtmb3IoYT0wLGk9dS5sZW5ndGg7YTxpO2ErKyl7dmFyIGQ9W107Zm9yKG89MCxjPShsPXJbMV1bYV18fHVbYV0pLmxlbmd0aDtvPGM7bysrKWQucHVzaChzdHJpbmcxNihsLmNoYXJDb2RlQXQobykpKTtoLnB1c2goZC5qb2luKCIiKSl9dmFyIHA9W3UsaF0sbT1bIlwwASIsIlwwAyJdLGc9WyJcMFwwIiwiXDABIl0seT1bIlwwXDAiLCIEXHQiXSxiPXUubGVuZ3RoKm0ubGVuZ3RoLHY9IlwwXDAiK3N0cmluZzE2KGIpK3N0cmluZzE2KDEyKmIrNiksUz0wO2ZvcihhPTAsaT1tLmxlbmd0aDthPGk7YSsrKXt2YXIgaz1wW2FdO2ZvcihvPTAsYz1rLmxlbmd0aDtvPGM7bysrKXtsPWtbb107dis9bVthXStnW2FdK3lbYV0rc3RyaW5nMTYobykrc3RyaW5nMTYobC5sZW5ndGgpK3N0cmluZzE2KFMpO1MrPWwubGVuZ3RofX1yZXR1cm4gdis9dS5qb2luKCIiKStoLmpvaW4oIiIpfUZvbnQucHJvdG90eXBlPXtuYW1lOm51bGwsZm9udDpudWxsLG1pbWV0eXBlOm51bGwsZGlzYWJsZUZvbnRGYWNlOiExLGdldCByZW5kZXJlcigpe3ZhciB0PXAuRm9udFJlbmRlcmVyRmFjdG9yeS5jcmVhdGUodGhpcywhMCk7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsInJlbmRlcmVyIix0KX0sZXhwb3J0RGF0YTpmdW5jdGlvbiBleHBvcnREYXRhKCl7dmFyIHQscixhLGk9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXSxvPWk/W10uY29uY2F0KHYsUyk6dixjPU9iamVjdC5jcmVhdGUobnVsbCksbD1fY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvKTt0cnl7Zm9yKGwucygpOyEoYT1sLm4oKSkuZG9uZTspdm9pZCAwIT09KHI9dGhpc1t0PWEudmFsdWVdKSYmKGNbdF09cil9Y2F0Y2godCl7bC5lKHQpfWZpbmFsbHl7bC5mKCl9cmV0dXJuIGN9LGZhbGxiYWNrVG9TeXN0ZW1Gb250OmZ1bmN0aW9uIEZvbnRfZmFsbGJhY2tUb1N5c3RlbUZvbnQoKXt2YXIgdD10aGlzO3RoaXMubWlzc2luZ0ZpbGU9ITA7dmFyIHI9dGhpcy5uYW1lLGE9dGhpcy50eXBlLG89dGhpcy5zdWJ0eXBlLGQ9ci5yZXBsYWNlKC9bLF9dL2csIi0iKS5yZXBsYWNlKC9ccy9nLCIiKSxwPSgwLHUuZ2V0U3RkRm9udE1hcCkoKSxtPSgwLHUuZ2V0Tm9uU3RkRm9udE1hcCkoKSxnPSEhcFtkXXx8ISghbVtkXXx8IXBbbVtkXV0pO2Q9cFtkXXx8bVtkXXx8ZDt0aGlzLmJvbGQ9LTEhPT1kLnNlYXJjaCgvYm9sZC9naSk7dGhpcy5pdGFsaWM9LTEhPT1kLnNlYXJjaCgvb2JsaXF1ZS9naSl8fC0xIT09ZC5zZWFyY2goL2l0YWxpYy9naSk7dGhpcy5ibGFjaz0tMSE9PXIuc2VhcmNoKC9CbGFjay9nKTt0aGlzLnJlbWVhc3VyZT1PYmplY3Qua2V5cyh0aGlzLndpZHRocykubGVuZ3RoPjA7aWYoZyYmIkNJREZvbnRUeXBlMiI9PT1hJiZ0aGlzLmNpZEVuY29kaW5nLnN0YXJ0c1dpdGgoIklkZW50aXR5LSIpKXt2YXIgeT0oMCx1LmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSxiPVtdO2Zvcih2YXIgdiBpbiB5KWJbK3ZdPXlbdl07aWYoL0FyaWFsLT9CbGFjay9pLnRlc3Qocikpe3ZhciBTPSgwLHUuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrKSgpO2Zvcih2YXIgayBpbiBTKWJbK2tdPVNba119ZWxzZSBpZigvQ2FsaWJyaS9pLnRlc3Qocikpe3ZhciB3PSgwLHUuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpKSgpO2Zvcih2YXIgQyBpbiB3KWJbK0NdPXdbQ119dGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiB4fHx0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2JbK3RdPXJ9KSk7dGhpcy50b0ZvbnRDaGFyPWI7dGhpcy50b1VuaWNvZGU9bmV3IF8oYil9ZWxzZSBpZigvU3ltYm9sL2kudGVzdChkKSl0aGlzLnRvRm9udENoYXI9YnVpbGRUb0ZvbnRDaGFyKGwuU3ltYm9sU2V0RW5jb2RpbmcsKDAsYy5nZXRHbHlwaHNVbmljb2RlKSgpLHRoaXMuZGlmZmVyZW5jZXMpO2Vsc2UgaWYoL0RpbmdiYXRzL2kudGVzdChkKSl7L1dpbmdkaW5ncy9pLnRlc3QocikmJigwLGkud2FybikoIk5vbi1lbWJlZGRlZCBXaW5nZGluZ3MgZm9udCwgZmFsbGluZyBiYWNrIHRvIFphcGZEaW5nYmF0cy4iKTt0aGlzLnRvRm9udENoYXI9YnVpbGRUb0ZvbnRDaGFyKGwuWmFwZkRpbmdiYXRzRW5jb2RpbmcsKDAsYy5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGUpKCksdGhpcy5kaWZmZXJlbmNlcyl9ZWxzZSBpZihnKXRoaXMudG9Gb250Q2hhcj1idWlsZFRvRm9udENoYXIodGhpcy5kZWZhdWx0RW5jb2RpbmcsKDAsYy5nZXRHbHlwaHNVbmljb2RlKSgpLHRoaXMuZGlmZmVyZW5jZXMpO2Vsc2V7dmFyIEE9KDAsYy5nZXRHbHlwaHNVbmljb2RlKSgpLFQ9W107dGhpcy50b1VuaWNvZGUuZm9yRWFjaCgoZnVuY3Rpb24ocixhKXtpZighdC5jb21wb3NpdGUpe3ZhciBpPXQuZGlmZmVyZW5jZXNbcl18fHQuZGVmYXVsdEVuY29kaW5nW3JdLG89KDAsaC5nZXRVbmljb2RlRm9yR2x5cGgpKGksQSk7LTEhPT1vJiYoYT1vKX1UWytyXT1hfSkpO2lmKHRoaXMuY29tcG9zaXRlJiZ0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIHgmJi9WZXJkYW5hL2kudGVzdChyKSl7dmFyIFI9KDAsdS5nZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMpKCk7Zm9yKHZhciBJIGluIFIpVFsrSV09UltJXX10aGlzLnRvRm9udENoYXI9VH10aGlzLmxvYWRlZE5hbWU9ZC5zcGxpdCgiLSIpWzBdO3RoaXMuZm9udFR5cGU9Z2V0Rm9udFR5cGUoYSxvKX0sY2hlY2tBbmRSZXBhaXI6ZnVuY3Rpb24gRm9udF9jaGVja0FuZFJlcGFpcih0LHIsYSl7dmFyIHU9WyJPUy8yIiwiY21hcCIsImhlYWQiLCJoaGVhIiwiaG10eCIsIm1heHAiLCJuYW1lIiwicG9zdCIsImxvY2EiLCJnbHlmIiwiZnBnbSIsInByZXAiLCJjdnQgIiwiQ0ZGICJdO2Z1bmN0aW9uIHJlYWRUYWJsZXModCxyKXt2YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpO2FbIk9TLzIiXT1udWxsO2EuY21hcD1udWxsO2EuaGVhZD1udWxsO2EuaGhlYT1udWxsO2EuaG10eD1udWxsO2EubWF4cD1udWxsO2EubmFtZT1udWxsO2EucG9zdD1udWxsO2Zvcih2YXIgaT0wO2k8cjtpKyspe3ZhciBvPXJlYWRUYWJsZUVudHJ5KHQpO3UuaW5jbHVkZXMoby50YWcpJiYoMCE9PW8ubGVuZ3RoJiYoYVtvLnRhZ109bykpfXJldHVybiBhfWZ1bmN0aW9uIHJlYWRUYWJsZUVudHJ5KHQpe3ZhciByPSgwLGkuYnl0ZXNUb1N0cmluZykodC5nZXRCeXRlcyg0KSksYT10LmdldEludDMyKCk+Pj4wLG89dC5nZXRJbnQzMigpPj4+MCxjPXQuZ2V0SW50MzIoKT4+PjAsbD10LnBvczt0LnBvcz10LnN0YXJ0P3Quc3RhcnQ6MDt0LnNraXAobyk7dmFyIHU9dC5nZXRCeXRlcyhjKTt0LnBvcz1sO2lmKCJoZWFkIj09PXIpe3VbOF09dVs5XT11WzEwXT11WzExXT0wO3VbMTddfD0zMn1yZXR1cm57dGFnOnIsY2hlY2tzdW06YSxsZW5ndGg6YyxvZmZzZXQ6byxkYXRhOnV9fWZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0KXtyZXR1cm57dmVyc2lvbjooMCxpLmJ5dGVzVG9TdHJpbmcpKHQuZ2V0Qnl0ZXMoNCkpLG51bVRhYmxlczp0LmdldFVpbnQxNigpLHNlYXJjaFJhbmdlOnQuZ2V0VWludDE2KCksZW50cnlTZWxlY3Rvcjp0LmdldFVpbnQxNigpLHJhbmdlU2hpZnQ6dC5nZXRVaW50MTYoKX19ZnVuY3Rpb24gc2FuaXRpemVHbHlwaCh0LHIsYSxpLG8sYyl7dmFyIGw9e2xlbmd0aDowLHNpemVPZkluc3RydWN0aW9uczowfTtpZihhLXI8PTEyKXJldHVybiBsO3ZhciB1PXQuc3ViYXJyYXkocixhKSxoPXNpZ25lZEludDE2KHVbMF0sdVsxXSk7aWYoaDwwKXshZnVuY3Rpb24gd3JpdGVTaWduZWRJbnQxNih0LHIsYSl7dFtyKzFdPWE7dFtyXT1hPj4+OH0odSwwLGg9LTEpO2kuc2V0KHUsbyk7bC5sZW5ndGg9dS5sZW5ndGg7cmV0dXJuIGx9dmFyIGQscD0xMCxtPTA7Zm9yKGQ9MDtkPGg7ZCsrKXttPSh1W3BdPDw4fHVbcCsxXSkrMTtwKz0yfXZhciBnPXAseT11W3BdPDw4fHVbcCsxXTtsLnNpemVPZkluc3RydWN0aW9ucz15O3ZhciBiPXArPTIreSx2PTA7Zm9yKGQ9MDtkPG07ZCsrKXt2YXIgUz11W3ArK107MTkyJlMmJih1W3AtMV09NjMmUyk7dmFyIGs9MjsyJlM/az0xOjE2JlMmJihrPTApO3ZhciB3PTI7NCZTP3c9MTozMiZTJiYodz0wKTt2YXIgQz1rK3c7dis9QztpZig4JlMpe3ZhciBfPXVbcCsrXTtkKz1fO3YrPV8qQ319aWYoMD09PXYpcmV0dXJuIGw7dmFyIHg9cCt2O2lmKHg+dS5sZW5ndGgpcmV0dXJuIGw7aWYoIWMmJnk+MCl7aS5zZXQodS5zdWJhcnJheSgwLGcpLG8pO2kuc2V0KFswLDBdLG8rZyk7aS5zZXQodS5zdWJhcnJheShiLHgpLG8rZysyKTt4LT15O3UubGVuZ3RoLXg+MyYmKHg9eCszJi00KTtsLmxlbmd0aD14O3JldHVybiBsfWlmKHUubGVuZ3RoLXg+Myl7eD14KzMmLTQ7aS5zZXQodS5zdWJhcnJheSgwLHgpLG8pO2wubGVuZ3RoPXg7cmV0dXJuIGx9aS5zZXQodSxvKTtsLmxlbmd0aD11Lmxlbmd0aDtyZXR1cm4gbH1mdW5jdGlvbiByZWFkTmFtZVRhYmxlKHQpe3ZhciBhPShyLnN0YXJ0P3Iuc3RhcnQ6MCkrdC5vZmZzZXQ7ci5wb3M9YTt2YXIgbz1bW10sW11dLGM9dC5sZW5ndGgsbD1hK2M7aWYoMCE9PXIuZ2V0VWludDE2KCl8fGM8NilyZXR1cm4gbzt2YXIgdSxoLGQ9ci5nZXRVaW50MTYoKSxwPXIuZ2V0VWludDE2KCksbT1bXTtmb3IodT0wO3U8ZCYmci5wb3MrMTI8PWw7dSsrKXt2YXIgZz17cGxhdGZvcm06ci5nZXRVaW50MTYoKSxlbmNvZGluZzpyLmdldFVpbnQxNigpLGxhbmd1YWdlOnIuZ2V0VWludDE2KCksbmFtZTpyLmdldFVpbnQxNigpLGxlbmd0aDpyLmdldFVpbnQxNigpLG9mZnNldDpyLmdldFVpbnQxNigpfTsoMT09PWcucGxhdGZvcm0mJjA9PT1nLmVuY29kaW5nJiYwPT09Zy5sYW5ndWFnZXx8Mz09PWcucGxhdGZvcm0mJjE9PT1nLmVuY29kaW5nJiYxMDMzPT09Zy5sYW5ndWFnZSkmJm0ucHVzaChnKX1mb3IodT0wLGg9bS5sZW5ndGg7dTxoO3UrKyl7dmFyIHk9bVt1XTtpZighKHkubGVuZ3RoPD0wKSl7dmFyIGI9YStwK3kub2Zmc2V0O2lmKCEoYit5Lmxlbmd0aD5sKSl7ci5wb3M9Yjt2YXIgdj15Lm5hbWU7aWYoeS5lbmNvZGluZyl7Zm9yKHZhciBTPSIiLGs9MCx3PXkubGVuZ3RoO2s8dztrKz0yKVMrPVN0cmluZy5mcm9tQ2hhckNvZGUoci5nZXRVaW50MTYoKSk7b1sxXVt2XT1TfWVsc2Ugb1swXVt2XT0oMCxpLmJ5dGVzVG9TdHJpbmcpKHIuZ2V0Qnl0ZXMoeS5sZW5ndGgpKX19fXJldHVybiBvfXZhciBoLGQscCx5LGI9WzAsMCwwLDAsMCwwLDAsMCwtMiwtMiwtMiwtMiwwLDAsLTIsLTUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwwLC0xLDAsLTEsLTEsLTEsLTEsMSwtMSwtOTk5LDAsMSwwLC0xLC0yLDAsLTEsLTIsLTEsLTEsMCwtMSwtMSwwLDAsLTk5OSwtOTk5LC0xLC0xLC0xLC0xLC0yLC05OTksLTIsLTIsLTk5OSwwLC0yLC0yLDAsMCwtMiwwLC0yLDAsMCwwLC0yLC0xLC0xLDEsMSwwLDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwwLC0xLDAsLTEsLTEsMCwtOTk5LC0xLC0xLC0xLC0xLC0xLC0xLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLC0yLC05OTksLTk5OSwtOTk5LC05OTksLTk5OSwtMSwtMSwtMiwtMiwwLDAsMCwwLC0xLC0xLC05OTksLTIsLTIsMCwwLC0xLC0yLC0yLDAsMCwwLC0xLC0xLC0xLC0yXTtmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbSh0LHIpe2Zvcih2YXIgYSxvLGMsbCx1LGg9dC5kYXRhLGQ9MCxwPTAsbT0wLGc9W10seT1bXSx2PVtdLFM9ci50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMsaz0hMSx3PTAsQz0wLF89aC5sZW5ndGg7ZDxfOyl7dmFyIHg9aFtkKytdO2lmKDY0PT09eCl7bz1oW2QrK107aWYoa3x8QylkKz1vO2Vsc2UgZm9yKGE9MDthPG87YSsrKWcucHVzaChoW2QrK10pfWVsc2UgaWYoNjU9PT14KXtvPWhbZCsrXTtpZihrfHxDKWQrPTIqbztlbHNlIGZvcihhPTA7YTxvO2ErKyl7Yz1oW2QrK107Zy5wdXNoKGM8PDh8aFtkKytdKX19ZWxzZSBpZigxNzY9PSgyNDgmeCkpe289eC0xNzYrMTtpZihrfHxDKWQrPW87ZWxzZSBmb3IoYT0wO2E8bzthKyspZy5wdXNoKGhbZCsrXSl9ZWxzZSBpZigxODQ9PSgyNDgmeCkpe289eC0xODQrMTtpZihrfHxDKWQrPTIqbztlbHNlIGZvcihhPTA7YTxvO2ErKyl7Yz1oW2QrK107Zy5wdXNoKGM8PDh8aFtkKytdKX19ZWxzZSBpZig0MyE9PXh8fFMpaWYoNDQhPT14fHxTKXtpZig0NT09PXgpaWYoayl7az0hMTtwPWR9ZWxzZXtpZighKHU9eS5wb3AoKSkpeygwLGkud2FybikoIlRUOiBFTkRGIGJhZCBzdGFjayIpO3IuaGludHNWYWxpZD0hMTtyZXR1cm59bD12LnBvcCgpO2g9dS5kYXRhO2Q9dS5pO3IuZnVuY3Rpb25zU3RhY2tEZWx0YXNbbF09Zy5sZW5ndGgtdS5zdGFja1RvcH1lbHNlIGlmKDEzNz09PXgpe2lmKGt8fEMpeygwLGkud2FybikoIlRUOiBuZXN0ZWQgSURFRnMgbm90IGFsbG93ZWQiKTtTPSEwfWs9ITA7bT1kfWVsc2UgaWYoODg9PT14KSsrdztlbHNlIGlmKDI3PT09eClDPXc7ZWxzZSBpZig4OT09PXgpe0M9PT13JiYoQz0wKTstLXd9ZWxzZSBpZigyOD09PXgmJiFrJiYhQyl7dmFyIEE9Z1tnLmxlbmd0aC0xXTtBPjAmJihkKz1BLTEpfX1lbHNle2lmKGt8fEMpeygwLGkud2FybikoIlRUOiBuZXN0ZWQgRkRFRnMgbm90IGFsbG93ZWQiKTtTPSEwfWs9ITA7bT1kO2w9Zy5wb3AoKTtyLmZ1bmN0aW9uc0RlZmluZWRbbF09e2RhdGE6aCxpOmR9fWVsc2UgaWYoIWsmJiFDKXtsPWdbZy5sZW5ndGgtMV07aWYoaXNOYU4obCkpKDAsaS5pbmZvKSgiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpO2Vsc2V7ci5mdW5jdGlvbnNVc2VkW2xdPSEwO2lmKGwgaW4gci5mdW5jdGlvbnNTdGFja0RlbHRhcyl7dmFyIFQ9Zy5sZW5ndGgrci5mdW5jdGlvbnNTdGFja0RlbHRhc1tsXTtpZihUPDApeygwLGkud2FybikoIlRUOiBDQUxMIGludmFsaWQgZnVuY3Rpb25zIHN0YWNrIGRlbHRhLiIpO3IuaGludHNWYWxpZD0hMTtyZXR1cm59Zy5sZW5ndGg9VH1lbHNlIGlmKGwgaW4gci5mdW5jdGlvbnNEZWZpbmVkJiYhdi5pbmNsdWRlcyhsKSl7eS5wdXNoKHtkYXRhOmgsaTpkLHN0YWNrVG9wOmcubGVuZ3RoLTF9KTt2LnB1c2gobCk7aWYoISh1PXIuZnVuY3Rpb25zRGVmaW5lZFtsXSkpeygwLGkud2FybikoIlRUOiBDQUxMIG5vbi1leGlzdGVudCBmdW5jdGlvbiIpO3IuaGludHNWYWxpZD0hMTtyZXR1cm59aD11LmRhdGE7ZD11Lml9fX1pZighayYmIUMpe3ZhciBSPTA7eDw9MTQyP1I9Ylt4XTp4Pj0xOTImJng8PTIyMz9SPS0xOng+PTIyNCYmKFI9LTIpO2lmKHg+PTExMyYmeDw9MTE3KXtvPWcucG9wKCk7aXNOYU4obyl8fChSPTIqLW8pfWZvcig7UjwwJiZnLmxlbmd0aD4wOyl7Zy5wb3AoKTtSKyt9Zm9yKDtSPjA7KXtnLnB1c2goTmFOKTtSLS19fX1yLnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucz1TO3ZhciBJPVtoXTtkPmgubGVuZ3RoJiZJLnB1c2gobmV3IFVpbnQ4QXJyYXkoZC1oLmxlbmd0aCkpO2lmKG0+cCl7KDAsaS53YXJuKSgiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWwiKTtJLnB1c2gobmV3IFVpbnQ4QXJyYXkoWzM0LDQ1XSkpfSFmdW5jdGlvbiBmb2xkVFRUYWJsZSh0LHIpe2lmKHIubGVuZ3RoPjEpe3ZhciBhLGksbz0wO2ZvcihhPTAsaT1yLmxlbmd0aDthPGk7YSsrKW8rPXJbYV0ubGVuZ3RoO289byszJi00O3ZhciBjPW5ldyBVaW50OEFycmF5KG8pLGw9MDtmb3IoYT0wLGk9ci5sZW5ndGg7YTxpO2ErKyl7Yy5zZXQoclthXSxsKTtsKz1yW2FdLmxlbmd0aH10LmRhdGE9Yzt0Lmxlbmd0aD1vfX0odCxJKX1pZihpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUocj1uZXcgZy5TdHJlYW0obmV3IFVpbnQ4QXJyYXkoci5nZXRCeXRlcygpKSkpKXt2YXIgdj1mdW5jdGlvbiByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uRGF0YSh0LHIpe2Zvcih2YXIgYT1mdW5jdGlvbiByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHQpe3ZhciByPSgwLGkuYnl0ZXNUb1N0cmluZykodC5nZXRCeXRlcyg0KSk7KDAsaS5hc3NlcnQpKCJ0dGNmIj09PXIsIk11c3QgYmUgYSBUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQuIik7Zm9yKHZhciBhPXQuZ2V0VWludDE2KCksbz10LmdldFVpbnQxNigpLGM9dC5nZXRJbnQzMigpPj4+MCxsPVtdLHU9MDt1PGM7dSsrKWwucHVzaCh0LmdldEludDMyKCk+Pj4wKTt2YXIgaD17dHRjVGFnOnIsbWFqb3JWZXJzaW9uOmEsbWlub3JWZXJzaW9uOm8sbnVtRm9udHM6YyxvZmZzZXRUYWJsZTpsfTtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBoO2Nhc2UgMjpoLmRzaWdUYWc9dC5nZXRJbnQzMigpPj4+MDtoLmRzaWdMZW5ndGg9dC5nZXRJbnQzMigpPj4+MDtoLmRzaWdPZmZzZXQ9dC5nZXRJbnQzMigpPj4+MDtyZXR1cm4gaH10aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiSW52YWxpZCBUcnVlVHlwZSBDb2xsZWN0aW9uIG1ham9yVmVyc2lvbjogIi5jb25jYXQoYSwiLiIpKX0odCksbz1hLm51bUZvbnRzLGM9YS5vZmZzZXRUYWJsZSxsPTA7bDxvO2wrKyl7dC5wb3M9KHQuc3RhcnR8fDApK2NbbF07dmFyIHU9cmVhZE9wZW5UeXBlSGVhZGVyKHQpLGg9cmVhZFRhYmxlcyh0LHUubnVtVGFibGVzKTtpZighaC5uYW1lKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCdUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQgbXVzdCBjb250YWluIGEgIm5hbWUiIHRhYmxlLicpO2Zvcih2YXIgZD1yZWFkTmFtZVRhYmxlKGgubmFtZSkscD0wLG09ZC5sZW5ndGg7cDxtO3ArKylmb3IodmFyIGc9MCx5PWRbcF0ubGVuZ3RoO2c8eTtnKyspe3ZhciBiPWRbcF1bZ107aWYoYiYmYi5yZXBsYWNlKC9ccy9nLCIiKT09PXIpcmV0dXJue2hlYWRlcjp1LHRhYmxlczpofX19dGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiAiJy5jb25jYXQociwnIiBmb250LicpKX0ocix0aGlzLm5hbWUpO2g9di5oZWFkZXI7ZD12LnRhYmxlc31lbHNle2g9cmVhZE9wZW5UeXBlSGVhZGVyKHIpO2Q9cmVhZFRhYmxlcyhyLGgubnVtVGFibGVzKX12YXIgUz0hZFsiQ0ZGICJdO2lmKFMpe2lmKCFkLmxvY2EpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJsb2NhIiB0YWJsZSBpcyBub3QgZm91bmQnKTtpZighZC5nbHlmKXsoMCxpLndhcm4pKCdSZXF1aXJlZCAiZ2x5ZiIgdGFibGUgaXMgbm90IGZvdW5kIC0tIHRyeWluZyB0byByZWNvdmVyLicpO2QuZ2x5Zj17dGFnOiJnbHlmIixkYXRhOm5ldyBVaW50OEFycmF5KDApfX10aGlzLmlzT3BlblR5cGU9ITF9ZWxzZXt2YXIgaz1hLmNvbXBvc2l0ZSYmKChhLmNpZFRvR2lkTWFwfHxbXSkubGVuZ3RoPjB8fCEoYS5jTWFwIGluc3RhbmNlb2YgbS5JZGVudGl0eUNNYXApKTtpZigiT1RUTyI9PT1oLnZlcnNpb24mJiFrfHwhZC5oZWFkfHwhZC5oaGVhfHwhZC5tYXhwfHwhZC5wb3N0KXt5PW5ldyBnLlN0cmVhbShkWyJDRkYgIl0uZGF0YSk7cD1uZXcgUCh5LGEpO2FkanVzdFdpZHRocyhhKTtyZXR1cm4gdGhpcy5jb252ZXJ0KHQscCxhKX1kZWxldGUgZC5nbHlmO2RlbGV0ZSBkLmxvY2E7ZGVsZXRlIGQuZnBnbTtkZWxldGUgZC5wcmVwO2RlbGV0ZSBkWyJjdnQgIl07dGhpcy5pc09wZW5UeXBlPSEwfWlmKCFkLm1heHApdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJtYXhwIiB0YWJsZSBpcyBub3QgZm91bmQnKTtyLnBvcz0oci5zdGFydHx8MCkrZC5tYXhwLm9mZnNldDt2YXIgQz1yLmdldEludDMyKCksXz1yLmdldFVpbnQxNigpLHg9XysxLFQ9ITA7aWYoeD42NTUzNSl7VD0hMTt4PV87KDAsaS53YXJuKSgiTm90IGVub3VnaCBzcGFjZSBpbiBnbHlmcyB0byBkdXBsaWNhdGUgZmlyc3QgZ2x5cGguIil9dmFyIFI9MCxJPTA7aWYoQz49NjU1MzYmJmQubWF4cC5sZW5ndGg+PTIyKXtyLnBvcys9ODtpZihyLmdldFVpbnQxNigpPjIpe2QubWF4cC5kYXRhWzE0XT0wO2QubWF4cC5kYXRhWzE1XT0yfXIucG9zKz00O1I9ci5nZXRVaW50MTYoKTtyLnBvcys9NDtJPXIuZ2V0VWludDE2KCl9ZC5tYXhwLmRhdGFbNF09eD4+ODtkLm1heHAuZGF0YVs1XT0yNTUmeDt2YXIgTz1mdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbXModCxyLGEsbyl7dmFyIGM9e2Z1bmN0aW9uc0RlZmluZWQ6W10sZnVuY3Rpb25zVXNlZDpbXSxmdW5jdGlvbnNTdGFja0RlbHRhczpbXSx0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM6ITEsaGludHNWYWxpZDohMH07dCYmc2FuaXRpemVUVFByb2dyYW0odCxjKTtyJiZzYW5pdGl6ZVRUUHJvZ3JhbShyLGMpO3QmJmZ1bmN0aW9uIGNoZWNrSW52YWxpZEZ1bmN0aW9ucyh0LHIpe2lmKCF0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucylpZih0LmZ1bmN0aW9uc0RlZmluZWQubGVuZ3RoPnIpeygwLGkud2FybikoIlRUOiBtb3JlIGZ1bmN0aW9ucyBkZWZpbmVkIHRoYW4gZXhwZWN0ZWQiKTt0LmhpbnRzVmFsaWQ9ITF9ZWxzZSBmb3IodmFyIGE9MCxvPXQuZnVuY3Rpb25zVXNlZC5sZW5ndGg7YTxvO2ErKyl7aWYoYT5yKXsoMCxpLndhcm4pKCJUVDogaW52YWxpZCBmdW5jdGlvbiBpZDogIithKTt0LmhpbnRzVmFsaWQ9ITE7cmV0dXJufWlmKHQuZnVuY3Rpb25zVXNlZFthXSYmIXQuZnVuY3Rpb25zRGVmaW5lZFthXSl7KDAsaS53YXJuKSgiVFQ6IHVuZGVmaW5lZCBmdW5jdGlvbjogIithKTt0LmhpbnRzVmFsaWQ9ITE7cmV0dXJufX19KGMsbyk7aWYoYSYmMSZhLmxlbmd0aCl7dmFyIGw9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgrMSk7bC5zZXQoYS5kYXRhKTthLmRhdGE9bH1yZXR1cm4gYy5oaW50c1ZhbGlkfShkLmZwZ20sZC5wcmVwLGRbImN2dCAiXSxSKTtpZighTyl7ZGVsZXRlIGQuZnBnbTtkZWxldGUgZC5wcmVwO2RlbGV0ZSBkWyJjdnQgIl19IWZ1bmN0aW9uIHNhbml0aXplTWV0cmljcyh0LHIsYSxvLGMpe2lmKHIpe3QucG9zPSh0LnN0YXJ0P3Quc3RhcnQ6MCkrci5vZmZzZXQ7dC5wb3MrPTQ7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTI7dC5wb3MrPTg7dC5wb3MrPTI7dmFyIGw9dC5nZXRVaW50MTYoKTtpZihsPm8peygwLGkuaW5mbykoIlRoZSBudW1PZk1ldHJpY3MgKCIrbCsiKSBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtR2x5cGhzICgiK28rIikiKTtsPW87ci5kYXRhWzM0XT0oNjUyODAmbCk+Pjg7ci5kYXRhWzM1XT0yNTUmbH12YXIgdT1vLWwtKGEubGVuZ3RoLTQqbD4+MSk7aWYodT4wKXt2YXIgaD1uZXcgVWludDhBcnJheShhLmxlbmd0aCsyKnUpO2guc2V0KGEuZGF0YSk7aWYoYyl7aFthLmxlbmd0aF09YS5kYXRhWzJdO2hbYS5sZW5ndGgrMV09YS5kYXRhWzNdfWEuZGF0YT1ofX1lbHNlIGEmJihhLmRhdGE9bnVsbCl9KHIsZC5oaGVhLGQuaG10eCx4LFQpO2lmKCFkLmhlYWQpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoZWFkIiB0YWJsZSBpcyBub3QgZm91bmQnKTshZnVuY3Rpb24gc2FuaXRpemVIZWFkKHQscixhKXt2YXIgbz10LmRhdGEsYz1mdW5jdGlvbiBpbnQzMih0LHIsYSxpKXtyZXR1cm4odDw8MjQpKyhyPDwxNikrKGE8PDgpK2l9KG9bMF0sb1sxXSxvWzJdLG9bM10pO2lmKGM+PjE2IT0xKXsoMCxpLmluZm8pKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogIitjKTtvWzBdPTA7b1sxXT0xO29bMl09MDtvWzNdPTB9dmFyIGw9aW50MTYob1s1MF0sb1s1MV0pO2lmKGw8MHx8bD4xKXsoMCxpLmluZm8pKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIGluZGV4VG9Mb2NGb3JtYXQgaW4gaGVhZCB0YWJsZTogIitsKTt2YXIgdT1yKzE7aWYoYT09PXU8PDEpe29bNTBdPTA7b1s1MV09MH1lbHNle2lmKGEhPT11PDwyKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJDb3VsZCBub3QgZml4IGluZGV4VG9Mb2NGb3JtYXQ6ICIrbCk7b1s1MF09MDtvWzUxXT0xfX19KGQuaGVhZCxfLFM/ZC5sb2NhLmxlbmd0aDowKTt2YXIgRT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKFMpe3ZhciBCPWludDE2KGQuaGVhZC5kYXRhWzUwXSxkLmhlYWQuZGF0YVs1MV0pLEQ9ZnVuY3Rpb24gc2FuaXRpemVHbHlwaExvY2F0aW9ucyh0LHIsYSxpLG8sYyxsKXt2YXIgdSxoLGQ7aWYoaSl7dT00O2g9ZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGVMb25nKHQscil7cmV0dXJuIHRbcl08PDI0fHRbcisxXTw8MTZ8dFtyKzJdPDw4fHRbciszXX07ZD1mdW5jdGlvbiBmb250SXRlbUVuY29kZUxvbmcodCxyLGEpe3Rbcl09YT4+PjI0JjI1NTt0W3IrMV09YT4+MTYmMjU1O3RbcisyXT1hPj44JjI1NTt0W3IrM109MjU1JmF9fWVsc2V7dT0yO2g9ZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGUodCxyKXtyZXR1cm4gdFtyXTw8OXx0W3IrMV08PDF9O2Q9ZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGUodCxyLGEpe3Rbcl09YT4+OSYyNTU7dFtyKzFdPWE+PjEmMjU1fX12YXIgcD1jP2ErMTphLG09dSooMStwKSxnPW5ldyBVaW50OEFycmF5KG0pO2cuc2V0KHQuZGF0YS5zdWJhcnJheSgwLG0pKTt0LmRhdGE9Zzt2YXIgeSxiLHY9ci5kYXRhLFM9di5sZW5ndGgsaz1uZXcgVWludDhBcnJheShTKSx3PVtdO2Zvcih5PTAsYj0wO3k8YSsxO3krKyxiKz11KXt2YXIgQz1oKGcsYik7Qz5TJiYoQz1TKTt3LnB1c2goe2luZGV4Onksb2Zmc2V0OkMsZW5kT2Zmc2V0OjB9KX13LnNvcnQoKGZ1bmN0aW9uKHQscil7cmV0dXJuIHQub2Zmc2V0LXIub2Zmc2V0fSkpO2Zvcih5PTA7eTxhO3krKyl3W3ldLmVuZE9mZnNldD13W3krMV0ub2Zmc2V0O3cuc29ydCgoZnVuY3Rpb24odCxyKXtyZXR1cm4gdC5pbmRleC1yLmluZGV4fSkpO3ZhciBfPU9iamVjdC5jcmVhdGUobnVsbCkseD0wO2QoZywwLHgpO2Zvcih5PTAsYj11O3k8YTt5KyssYis9dSl7dmFyIEE9c2FuaXRpemVHbHlwaCh2LHdbeV0ub2Zmc2V0LHdbeV0uZW5kT2Zmc2V0LGsseCxvKSxUPUEubGVuZ3RoOzA9PT1UJiYoX1t5XT0hMCk7QS5zaXplT2ZJbnN0cnVjdGlvbnM+bCYmKGw9QS5zaXplT2ZJbnN0cnVjdGlvbnMpO2QoZyxiLHgrPVQpfWlmKDA9PT14KXt2YXIgUj1uZXcgVWludDhBcnJheShbMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQ5LDBdKTtmb3IoeT0wLGI9dTt5PHA7eSsrLGIrPXUpZChnLGIsUi5sZW5ndGgpO3IuZGF0YT1SfWVsc2UgaWYoYyl7dmFyIEk9aChnLHUpO2lmKGsubGVuZ3RoPkkreClyLmRhdGE9ay5zdWJhcnJheSgwLEkreCk7ZWxzZXtyLmRhdGE9bmV3IFVpbnQ4QXJyYXkoSSt4KTtyLmRhdGEuc2V0KGsuc3ViYXJyYXkoMCx4KSl9ci5kYXRhLnNldChrLnN1YmFycmF5KDAsSSkseCk7ZCh0LmRhdGEsZy5sZW5ndGgtdSx4K0kpfWVsc2Ugci5kYXRhPWsuc3ViYXJyYXkoMCx4KTtyZXR1cm57bWlzc2luZ0dseXBoczpfLG1heFNpemVPZkluc3RydWN0aW9uczpsfX0oZC5sb2NhLGQuZ2x5ZixfLEIsTyxULEkpO0U9RC5taXNzaW5nR2x5cGhzO2lmKEM+PTY1NTM2JiZkLm1heHAubGVuZ3RoPj0yMil7ZC5tYXhwLmRhdGFbMjZdPUQubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zPj44O2QubWF4cC5kYXRhWzI3XT0yNTUmRC5tYXhTaXplT2ZJbnN0cnVjdGlvbnN9fWlmKCFkLmhoZWEpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoaGVhIiB0YWJsZSBpcyBub3QgZm91bmQnKTtpZigwPT09ZC5oaGVhLmRhdGFbMTBdJiYwPT09ZC5oaGVhLmRhdGFbMTFdKXtkLmhoZWEuZGF0YVsxMF09MjU1O2QuaGhlYS5kYXRhWzExXT0yNTV9dmFyIE09e3VuaXRzUGVyRW06aW50MTYoZC5oZWFkLmRhdGFbMThdLGQuaGVhZC5kYXRhWzE5XSkseU1heDppbnQxNihkLmhlYWQuZGF0YVs0Ml0sZC5oZWFkLmRhdGFbNDNdKSx5TWluOnNpZ25lZEludDE2KGQuaGVhZC5kYXRhWzM4XSxkLmhlYWQuZGF0YVszOV0pLGFzY2VudDppbnQxNihkLmhoZWEuZGF0YVs0XSxkLmhoZWEuZGF0YVs1XSksZGVzY2VudDpzaWduZWRJbnQxNihkLmhoZWEuZGF0YVs2XSxkLmhoZWEuZGF0YVs3XSl9O3RoaXMuYXNjZW50PU0uYXNjZW50L00udW5pdHNQZXJFbTt0aGlzLmRlc2NlbnQ9TS5kZXNjZW50L00udW5pdHNQZXJFbTtkLnBvc3QmJmZ1bmN0aW9uIHJlYWRQb3N0U2NyaXB0VGFibGUodCxhLG8pe3ZhciBjPShyLnN0YXJ0P3Iuc3RhcnQ6MCkrdC5vZmZzZXQ7ci5wb3M9Yzt2YXIgbCx1PWMrdC5sZW5ndGgsaD1yLmdldEludDMyKCk7ci5za2lwKDI4KTt2YXIgZCxwPSEwO3N3aXRjaChoKXtjYXNlIDY1NTM2Omw9dzticmVhaztjYXNlIDEzMTA3Mjp2YXIgbT1yLmdldFVpbnQxNigpO2lmKG0hPT1vKXtwPSExO2JyZWFrfXZhciBnPVtdO2ZvcihkPTA7ZDxtOysrZCl7dmFyIHk9ci5nZXRVaW50MTYoKTtpZih5Pj0zMjc2OCl7cD0hMTticmVha31nLnB1c2goeSl9aWYoIXApYnJlYWs7Zm9yKHZhciBiPVtdLHY9W107ci5wb3M8dTspe3ZhciBTPXIuZ2V0Qnl0ZSgpO3YubGVuZ3RoPVM7Zm9yKGQ9MDtkPFM7KytkKXZbZF09U3RyaW5nLmZyb21DaGFyQ29kZShyLmdldEJ5dGUoKSk7Yi5wdXNoKHYuam9pbigiIikpfWw9W107Zm9yKGQ9MDtkPG07KytkKXt2YXIgaz1nW2RdO2s8MjU4P2wucHVzaCh3W2tdKTpsLnB1c2goYltrLTI1OF0pfWJyZWFrO2Nhc2UgMTk2NjA4OmJyZWFrO2RlZmF1bHQ6KDAsaS53YXJuKSgiVW5rbm93bi91bnN1cHBvcnRlZCBwb3N0IHRhYmxlIHZlcnNpb24gIitoKTtwPSExO2EuZGVmYXVsdEVuY29kaW5nJiYobD1hLmRlZmF1bHRFbmNvZGluZyl9YS5nbHlwaE5hbWVzPWw7cmV0dXJuIHB9KGQucG9zdCxhLF8pO2QucG9zdD17dGFnOiJwb3N0IixkYXRhOmNyZWF0ZVBvc3RUYWJsZShhKX07dmFyIEw9W107ZnVuY3Rpb24gaGFzR2x5cGgodCl7cmV0dXJuIUVbdF19aWYoYS5jb21wb3NpdGUpe3ZhciBOPWEuY2lkVG9HaWRNYXB8fFtdLFU9MD09PU4ubGVuZ3RoO2EuY01hcC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2lmKHI+NjU1MzUpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzUiKTt2YXIgYT0tMTtVP2E9cjp2b2lkIDAhPT1OW3JdJiYoYT1OW3JdKTthPj0wJiZhPF8mJmhhc0dseXBoKGEpJiYoTFt0XT1hKX0pKX1lbHNle3ZhciBqPWZ1bmN0aW9uIHJlYWRDbWFwVGFibGUodCxyLGEsbyl7aWYoIXQpeygwLGkud2FybikoIk5vIGNtYXAgdGFibGUgYXZhaWxhYmxlLiIpO3JldHVybntwbGF0Zm9ybUlkOi0xLGVuY29kaW5nSWQ6LTEsbWFwcGluZ3M6W10saGFzU2hvcnRDbWFwOiExfX12YXIgYyxsPShyLnN0YXJ0P3Iuc3RhcnQ6MCkrdC5vZmZzZXQ7ci5wb3M9bDtyLnNraXAoMik7Zm9yKHZhciB1LGg9ci5nZXRVaW50MTYoKSxkPSExLHA9MDtwPGg7cCsrKXt2YXIgbT1yLmdldFVpbnQxNigpLGc9ci5nZXRVaW50MTYoKSx5PXIuZ2V0SW50MzIoKT4+PjAsYj0hMTtpZighdXx8dS5wbGF0Zm9ybUlkIT09bXx8dS5lbmNvZGluZ0lkIT09Zyl7aWYoMCE9PW18fDAhPT1nJiYxIT09ZyYmMyE9PWcpaWYoMT09PW0mJjA9PT1nKWI9ITA7ZWxzZSBpZigzIT09bXx8MSE9PWd8fCFvJiZ1KXtpZihhJiYzPT09bSYmMD09PWcpe2I9ITA7ZD0hMH19ZWxzZXtiPSEwO2F8fChkPSEwKX1lbHNlIGI9ITA7YiYmKHU9e3BsYXRmb3JtSWQ6bSxlbmNvZGluZ0lkOmcsb2Zmc2V0Onl9KTtpZihkKWJyZWFrfX11JiYoci5wb3M9bCt1Lm9mZnNldCk7aWYoIXV8fC0xPT09ci5wZWVrQnl0ZSgpKXsoMCxpLndhcm4pKCJDb3VsZCBub3QgZmluZCBhIHByZWZlcnJlZCBjbWFwIHRhYmxlLiIpO3JldHVybntwbGF0Zm9ybUlkOi0xLGVuY29kaW5nSWQ6LTEsbWFwcGluZ3M6W10saGFzU2hvcnRDbWFwOiExfX12YXIgdj1yLmdldFVpbnQxNigpO3Iuc2tpcCg0KTt2YXIgUyxrLHc9ITEsQz1bXTtpZigwPT09dil7Zm9yKFM9MDtTPDI1NjtTKyspe3ZhciBfPXIuZ2V0Qnl0ZSgpO18mJkMucHVzaCh7Y2hhckNvZGU6UyxnbHlwaElkOl99KX13PSEwfWVsc2UgaWYoND09PXYpe3ZhciB4PXIuZ2V0VWludDE2KCk+PjE7ci5za2lwKDYpO3ZhciBBLFQ9W107Zm9yKEE9MDtBPHg7QSsrKVQucHVzaCh7ZW5kOnIuZ2V0VWludDE2KCl9KTtyLnNraXAoMik7Zm9yKEE9MDtBPHg7QSsrKVRbQV0uc3RhcnQ9ci5nZXRVaW50MTYoKTtmb3IoQT0wO0E8eDtBKyspVFtBXS5kZWx0YT1yLmdldFVpbnQxNigpO3ZhciBSPTA7Zm9yKEE9MDtBPHg7QSsrKXtjPVRbQV07dmFyIEk9ci5nZXRVaW50MTYoKTtpZihJKXt2YXIgUD0oST4+MSktKHgtQSk7Yy5vZmZzZXRJbmRleD1QO1I9TWF0aC5tYXgoUixQK2MuZW5kLWMuc3RhcnQrMSl9ZWxzZSBjLm9mZnNldEluZGV4PS0xfXZhciBPPVtdO2ZvcihTPTA7UzxSO1MrKylPLnB1c2goci5nZXRVaW50MTYoKSk7Zm9yKEE9MDtBPHg7QSsrKXtsPShjPVRbQV0pLnN0YXJ0O3ZhciBFPWMuZW5kLEI9Yy5kZWx0YTtQPWMub2Zmc2V0SW5kZXg7Zm9yKFM9bDtTPD1FO1MrKylpZig2NTUzNSE9PVMpe2s9KGs9UDwwP1M6T1tQK1MtbF0pK0ImNjU1MzU7Qy5wdXNoKHtjaGFyQ29kZTpTLGdseXBoSWQ6a30pfX19ZWxzZXtpZig2IT09dil7KDAsaS53YXJuKSgiY21hcCB0YWJsZSBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0OiAiK3YpO3JldHVybntwbGF0Zm9ybUlkOi0xLGVuY29kaW5nSWQ6LTEsbWFwcGluZ3M6W10saGFzU2hvcnRDbWFwOiExfX12YXIgRD1yLmdldFVpbnQxNigpLE09ci5nZXRVaW50MTYoKTtmb3IoUz0wO1M8TTtTKyspe2s9ci5nZXRVaW50MTYoKTt2YXIgTD1EK1M7Qy5wdXNoKHtjaGFyQ29kZTpMLGdseXBoSWQ6a30pfX1DLnNvcnQoKGZ1bmN0aW9uKHQscil7cmV0dXJuIHQuY2hhckNvZGUtci5jaGFyQ29kZX0pKTtmb3IocD0xO3A8Qy5sZW5ndGg7cCsrKWlmKENbcC0xXS5jaGFyQ29kZT09PUNbcF0uY2hhckNvZGUpe0Muc3BsaWNlKHAsMSk7cC0tfXJldHVybntwbGF0Zm9ybUlkOnUucGxhdGZvcm1JZCxlbmNvZGluZ0lkOnUuZW5jb2RpbmdJZCxtYXBwaW5nczpDLGhhc1Nob3J0Q21hcDp3fX0oZC5jbWFwLHIsdGhpcy5pc1N5bWJvbGljRm9udCxhLmhhc0VuY29kaW5nKSxxPWoucGxhdGZvcm1JZCxXPWouZW5jb2RpbmdJZCx6PWoubWFwcGluZ3MsRz16Lmxlbmd0aCxIPVtdOyFhLmhhc0VuY29kaW5nfHwiTWFjUm9tYW5FbmNvZGluZyIhPT1hLmJhc2VFbmNvZGluZ05hbWUmJiJXaW5BbnNpRW5jb2RpbmciIT09YS5iYXNlRW5jb2RpbmdOYW1lfHwoSD0oMCxsLmdldEVuY29kaW5nKShhLmJhc2VFbmNvZGluZ05hbWUpKTtpZihhLmhhc0VuY29kaW5nJiYhdGhpcy5pc1N5bWJvbGljRm9udCYmKDM9PT1xJiYxPT09V3x8MT09PXEmJjA9PT1XKSlmb3IodmFyIFY9KDAsYy5nZXRHbHlwaHNVbmljb2RlKSgpLFg9MDtYPDI1NjtYKyspe3ZhciBZLEs7aWYoWT10aGlzLmRpZmZlcmVuY2VzJiZYIGluIHRoaXMuZGlmZmVyZW5jZXM/dGhpcy5kaWZmZXJlbmNlc1tYXTpYIGluIEgmJiIiIT09SFtYXT9IW1hdOmwuU3RhbmRhcmRFbmNvZGluZ1tYXSl7Sz1yZWNvdmVyR2x5cGhOYW1lKFksVik7dmFyIEo7Mz09PXEmJjE9PT1XP0o9VltLXToxPT09cSYmMD09PVcmJihKPWwuTWFjUm9tYW5FbmNvZGluZy5pbmRleE9mKEspKTtmb3IodmFyIFo9MDtaPEc7KytaKWlmKHpbWl0uY2hhckNvZGU9PT1KKXtMW1hdPXpbWl0uZ2x5cGhJZDticmVha319fWVsc2UgaWYoMD09PXEpZm9yKHZhciBRPTA7UTxHOysrUSlMW3pbUV0uY2hhckNvZGVdPXpbUV0uZ2x5cGhJZDtlbHNlIGZvcih2YXIgJD0wOyQ8RzsrKyQpe3ZhciBlZT16WyRdLmNoYXJDb2RlOzM9PT1xJiZlZT49NjE0NDAmJmVlPD02MTY5NSYmKGVlJj0yNTUpO0xbZWVdPXpbJF0uZ2x5cGhJZH1pZihhLmdseXBoTmFtZXMmJkgubGVuZ3RoKWZvcih2YXIgdGU9MDt0ZTwyNTY7Kyt0ZSlpZih2b2lkIDA9PT1MW3RlXSYmSFt0ZV0pe1k9SFt0ZV07dmFyIHJlPWEuZ2x5cGhOYW1lcy5pbmRleE9mKFkpO3JlPjAmJmhhc0dseXBoKHJlKSYmKExbdGVdPXJlKX19MD09PUwubGVuZ3RoJiYoTFswXT0wKTt2YXIgYWU9eC0xO1R8fChhZT0wKTt2YXIgbmU9YWRqdXN0TWFwcGluZyhMLGhhc0dseXBoLGFlKTt0aGlzLnRvRm9udENoYXI9bmUudG9Gb250Q2hhcjtkLmNtYXA9e3RhZzoiY21hcCIsZGF0YTpjcmVhdGVDbWFwVGFibGUobmUuY2hhckNvZGVUb0dseXBoSWQseCl9O2RbIk9TLzIiXSYmZnVuY3Rpb24gdmFsaWRhdGVPUzJUYWJsZSh0LHIpe3IucG9zPShyLnN0YXJ0fHwwKSt0Lm9mZnNldDt2YXIgYT1yLmdldFVpbnQxNigpO3Iuc2tpcCg2MCk7dmFyIGk9ci5nZXRVaW50MTYoKTtpZihhPDQmJjc2OCZpKXJldHVybiExO2lmKHIuZ2V0VWludDE2KCk+ci5nZXRVaW50MTYoKSlyZXR1cm4hMTtyLnNraXAoNik7aWYoMD09PXIuZ2V0VWludDE2KCkpcmV0dXJuITE7dC5kYXRhWzhdPXQuZGF0YVs5XT0wO3JldHVybiEwfShkWyJPUy8yIl0scil8fChkWyJPUy8yIl09e3RhZzoiT1MvMiIsZGF0YTpjcmVhdGVPUzJUYWJsZShhLG5lLmNoYXJDb2RlVG9HbHlwaElkLE0pfSk7aWYoIVMpdHJ5e3k9bmV3IGcuU3RyZWFtKGRbIkNGRiAiXS5kYXRhKTsocD1uZXcgby5DRkZQYXJzZXIoeSxhLCEwKS5wYXJzZSgpKS5kdXBsaWNhdGVGaXJzdEdseXBoKCk7dmFyIGllPW5ldyBvLkNGRkNvbXBpbGVyKHApO2RbIkNGRiAiXS5kYXRhPWllLmNvbXBpbGUoKX1jYXRjaCh0KXsoMCxpLndhcm4pKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIrYS5sb2FkZWROYW1lKX1pZihkLm5hbWUpe3ZhciBvZT1yZWFkTmFtZVRhYmxlKGQubmFtZSk7ZC5uYW1lLmRhdGE9Y3JlYXRlTmFtZVRhYmxlKHQsb2UpfWVsc2UgZC5uYW1lPXt0YWc6Im5hbWUiLGRhdGE6Y3JlYXRlTmFtZVRhYmxlKHRoaXMubmFtZSl9O3ZhciBzZT1uZXcgQShoLnZlcnNpb24pO2Zvcih2YXIgY2UgaW4gZClzZS5hZGRUYWJsZShjZSxkW2NlXS5kYXRhKTtyZXR1cm4gc2UudG9BcnJheSgpfSxjb252ZXJ0OmZ1bmN0aW9uIEZvbnRfY29udmVydCh0LHIsYSl7YS5maXhlZFBpdGNoPSExO2EuYnVpbHRJbkVuY29kaW5nJiZmdW5jdGlvbiBhZGp1c3RUb1VuaWNvZGUodCxyKXtpZighdC5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCYmISh0Lmhhc0VuY29kaW5nfHxyPT09dC5kZWZhdWx0RW5jb2Rpbmd8fHQudG9Vbmljb2RlIGluc3RhbmNlb2YgeCkpe3ZhciBhPVtdLGk9KDAsYy5nZXRHbHlwaHNVbmljb2RlKSgpO2Zvcih2YXIgbyBpbiByKXt2YXIgbD1yW29dLHU9KDAsaC5nZXRVbmljb2RlRm9yR2x5cGgpKGwsaSk7LTEhPT11JiYoYVtvXT1TdHJpbmcuZnJvbUNoYXJDb2RlKHUpKX10LnRvVW5pY29kZS5hbWVuZChhKX19KGEsYS5idWlsdEluRW5jb2RpbmcpO3ZhciBvPTE7ciBpbnN0YW5jZW9mIFAmJihvPXIubnVtR2x5cGhzLTEpO3ZhciB1PXIuZ2V0R2x5cGhNYXBwaW5nKGEpLGQ9YWRqdXN0TWFwcGluZyh1LHIuaGFzR2x5cGhJZC5iaW5kKHIpLG8pO3RoaXMudG9Gb250Q2hhcj1kLnRvRm9udENoYXI7dmFyIHA9ci5udW1HbHlwaHM7ZnVuY3Rpb24gZ2V0Q2hhckNvZGVzKHQscil7dmFyIGE9bnVsbDtmb3IodmFyIGkgaW4gdClpZihyPT09dFtpXSl7YXx8KGE9W10pO2EucHVzaCgwfGkpfXJldHVybiBhfWZ1bmN0aW9uIGNyZWF0ZUNoYXJDb2RlKHQscil7Zm9yKHZhciBhIGluIHQpaWYocj09PXRbYV0pcmV0dXJuIDB8YTtkLmNoYXJDb2RlVG9HbHlwaElkW2QubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZV09cjtyZXR1cm4gZC5uZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlKyt9dmFyIG09ci5zZWFjcztpZihtJiZtLmxlbmd0aCl7dmFyIGc9YS5mb250TWF0cml4fHxpLkZPTlRfSURFTlRJVFlfTUFUUklYLHk9ci5nZXRDaGFyc2V0KCksYj1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcih2YXIgdiBpbiBtKXt2YXIgUz1tW3Z8PTBdLGs9bC5TdGFuZGFyZEVuY29kaW5nW1NbMl1dLHc9bC5TdGFuZGFyZEVuY29kaW5nW1NbM11dLEM9eS5pbmRleE9mKGspLF89eS5pbmRleE9mKHcpO2lmKCEoQzwwfHxfPDApKXt2YXIgVD17eDpTWzBdKmdbMF0rU1sxXSpnWzJdK2dbNF0seTpTWzBdKmdbMV0rU1sxXSpnWzNdK2dbNV19LFI9Z2V0Q2hhckNvZGVzKHUsdik7aWYoUilmb3IodmFyIEk9MCxPPVIubGVuZ3RoO0k8TztJKyspe3ZhciBFPVJbSV0sQj1kLmNoYXJDb2RlVG9HbHlwaElkLEQ9Y3JlYXRlQ2hhckNvZGUoQixDKSxNPWNyZWF0ZUNoYXJDb2RlKEIsXyk7YltFXT17YmFzZUZvbnRDaGFyQ29kZTpELGFjY2VudEZvbnRDaGFyQ29kZTpNLGFjY2VudE9mZnNldDpUfX19fWEuc2VhY01hcD1ifXZhciBMPTEvKGEuZm9udE1hdHJpeHx8aS5GT05UX0lERU5USVRZX01BVFJJWClbMF0sTj1uZXcgQSgiT1RUTyIpO04uYWRkVGFibGUoIkNGRiAiLHIuZGF0YSk7Ti5hZGRUYWJsZSgiT1MvMiIsY3JlYXRlT1MyVGFibGUoYSxkLmNoYXJDb2RlVG9HbHlwaElkKSk7Ti5hZGRUYWJsZSgiY21hcCIsY3JlYXRlQ21hcFRhYmxlKGQuY2hhckNvZGVUb0dseXBoSWQscCkpO04uYWRkVGFibGUoImhlYWQiLCJcMAFcMFwwXDBcMBBcMFwwXDBcMFwwXw88w7VcMFwwIitzYWZlU3RyaW5nMTYoTCkrIlwwXDBcMFwwwp5cdn4nXDBcMFwwXDDCnlx2fidcMFwwIitzYWZlU3RyaW5nMTYoYS5kZXNjZW50KSsiD8O/IitzYWZlU3RyaW5nMTYoYS5hc2NlbnQpK3N0cmluZzE2KGEuaXRhbGljQW5nbGU/MjowKSsiXDARXDBcMFwwXDBcMFwwIik7Ti5hZGRUYWJsZSgiaGhlYSIsIlwwAVwwXDAiK3NhZmVTdHJpbmcxNihhLmFzY2VudCkrc2FmZVN0cmluZzE2KGEuZGVzY2VudCkrIlwwXDDDv8O/XDBcMFwwXDBcMFwwIitzYWZlU3RyaW5nMTYoYS5jYXBIZWlnaHQpK3NhZmVTdHJpbmcxNihNYXRoLnRhbihhLml0YWxpY0FuZ2xlKSphLnhIZWlnaHQpKyJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiK3N0cmluZzE2KHApKTtOLmFkZFRhYmxlKCJobXR4IixmdW5jdGlvbiBmb250RmllbGRzSG10eCgpe2Zvcih2YXIgdD1yLmNoYXJzdHJpbmdzLGE9ci5jZmY/ci5jZmYud2lkdGhzOm51bGwsaT0iXDBcMFwwXDAiLG89MSxjPXA7bzxjO28rKyl7dmFyIGw9MDtpZih0KXt2YXIgdT10W28tMV07bD0id2lkdGgiaW4gdT91LndpZHRoOjB9ZWxzZSBhJiYobD1NYXRoLmNlaWwoYVtvXXx8MCkpO2krPXN0cmluZzE2KGwpK3N0cmluZzE2KDApfXJldHVybiBpfSgpKTtOLmFkZFRhYmxlKCJtYXhwIiwiXDBcMFBcMCIrc3RyaW5nMTYocCkpO04uYWRkVGFibGUoIm5hbWUiLGNyZWF0ZU5hbWVUYWJsZSh0KSk7Ti5hZGRUYWJsZSgicG9zdCIsY3JlYXRlUG9zdFRhYmxlKGEpKTtyZXR1cm4gTi50b0FycmF5KCl9LGdldCBzcGFjZVdpZHRoKCl7Zm9yKHZhciB0LHI9WyJzcGFjZSIsIm1pbnVzIiwib25lIiwiaSIsIkkiXSxhPTAsbz1yLmxlbmd0aDthPG87YSsrKXt2YXIgbD1yW2FdO2lmKGwgaW4gdGhpcy53aWR0aHMpe3Q9dGhpcy53aWR0aHNbbF07YnJlYWt9dmFyIHU9KDAsYy5nZXRHbHlwaHNVbmljb2RlKSgpW2xdLGg9MDt0aGlzLmNvbXBvc2l0ZSYmdGhpcy5jTWFwLmNvbnRhaW5zKHUpJiYoaD10aGlzLmNNYXAubG9va3VwKHUpKTshaCYmdGhpcy50b1VuaWNvZGUmJihoPXRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YodSkpO2g8PTAmJihoPXUpO2lmKHQ9dGhpcy53aWR0aHNbaF0pYnJlYWt9dD10fHx0aGlzLmRlZmF1bHRXaWR0aDtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywic3BhY2VXaWR0aCIsdCl9LGNoYXJUb0dseXBoOmZ1bmN0aW9uIEZvbnRfY2hhclRvR2x5cGgodCxyKXt2YXIgYSxvLGMsbD10O3RoaXMuY01hcCYmdGhpcy5jTWFwLmNvbnRhaW5zKHQpJiYobD10aGlzLmNNYXAubG9va3VwKHQpKTtvPXRoaXMud2lkdGhzW2xdO289KDAsaS5pc051bSkobyk/bzp0aGlzLmRlZmF1bHRXaWR0aDt2YXIgdT10aGlzLnZtZXRyaWNzJiZ0aGlzLnZtZXRyaWNzW2xdLGQ9dGhpcy50b1VuaWNvZGUuZ2V0KHQpfHx0aGlzLmZhbGxiYWNrVG9Vbmljb2RlLmdldCh0KXx8dDsibnVtYmVyIj09dHlwZW9mIGQmJihkPVN0cmluZy5mcm9tQ2hhckNvZGUoZCkpO3ZhciBwPXQgaW4gdGhpcy50b0ZvbnRDaGFyO2E9dGhpcy50b0ZvbnRDaGFyW3RdfHx0O2lmKHRoaXMubWlzc2luZ0ZpbGUpe3ZhciBtPXRoaXMuZGlmZmVyZW5jZXNbdF18fHRoaXMuZGVmYXVsdEVuY29kaW5nW3RdOyIubm90ZGVmIiE9PW0mJiIiIT09bXx8IlR5cGUxIiE9PXRoaXMudHlwZXx8KGE9MzIpO2E9KDAsaC5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcykoYSl9dGhpcy5pc1R5cGUzRm9udCYmKGM9YSk7dmFyIGc9bnVsbDtpZih0aGlzLnNlYWNNYXAmJnRoaXMuc2VhY01hcFt0XSl7cD0hMDt2YXIgeT10aGlzLnNlYWNNYXBbdF07YT15LmJhc2VGb250Q2hhckNvZGU7Zz17Zm9udENoYXI6U3RyaW5nLmZyb21Db2RlUG9pbnQoeS5hY2NlbnRGb250Q2hhckNvZGUpLG9mZnNldDp5LmFjY2VudE9mZnNldH19dmFyIGI9IiI7Im51bWJlciI9PXR5cGVvZiBhJiYoYTw9MTExNDExMT9iPVN0cmluZy5mcm9tQ29kZVBvaW50KGEpOigwLGkud2FybikoImNoYXJUb0dseXBoIC0gaW52YWxpZCBmb250Q2hhckNvZGU6ICIuY29uY2F0KGEpKSk7dmFyIHY9dGhpcy5nbHlwaENhY2hlW3RdO2lmKCF2fHwhdi5tYXRjaGVzRm9yQ2FjaGUoYixkLGcsbyx1LGMscixwKSl7dj1uZXcgQyhiLGQsZyxvLHUsYyxyLHApO3RoaXMuZ2x5cGhDYWNoZVt0XT12fXJldHVybiB2fSxjaGFyc1RvR2x5cGhzOmZ1bmN0aW9uIEZvbnRfY2hhcnNUb0dseXBocyh0KXt2YXIgcixhLGksbz10aGlzLmNoYXJzQ2FjaGU7aWYobyYmKHI9b1t0XSkpcmV0dXJuIHI7b3x8KG89dGhpcy5jaGFyc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCkpO3I9W107dmFyIGMsbD10LHU9MDtpZih0aGlzLmNNYXApZm9yKHZhciBoPU9iamVjdC5jcmVhdGUobnVsbCk7dTx0Lmxlbmd0aDspe3RoaXMuY01hcC5yZWFkQ2hhckNvZGUodCx1LGgpO2k9aC5jaGFyY29kZTt2YXIgZD1oLmxlbmd0aDt1Kz1kO3ZhciBwPTE9PT1kJiYzMj09PXQuY2hhckNvZGVBdCh1LTEpO2E9dGhpcy5jaGFyVG9HbHlwaChpLHApO3IucHVzaChhKX1lbHNlIGZvcih1PTAsYz10Lmxlbmd0aDt1PGM7Kyt1KXtpPXQuY2hhckNvZGVBdCh1KTthPXRoaXMuY2hhclRvR2x5cGgoaSwzMj09PWkpO3IucHVzaChhKX1yZXR1cm4gb1tsXT1yfSxnZXQgZ2x5cGhDYWNoZVZhbHVlcygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZ2x5cGhDYWNoZSl9fTtyZXR1cm4gRm9udH0oKTtyLkZvbnQ9VDt2YXIgUj1mdW5jdGlvbiBFcnJvckZvbnRDbG9zdXJlKCl7ZnVuY3Rpb24gRXJyb3JGb250KHQpe3RoaXMuZXJyb3I9dDt0aGlzLmxvYWRlZE5hbWU9ImdfZm9udF9lcnJvciI7dGhpcy5taXNzaW5nRmlsZT0hMH1FcnJvckZvbnQucHJvdG90eXBlPXtjaGFyc1RvR2x5cGhzOmZ1bmN0aW9uIEVycm9yRm9udF9jaGFyc1RvR2x5cGhzKCl7cmV0dXJuW119LGV4cG9ydERhdGE6ZnVuY3Rpb24gZXhwb3J0RGF0YSgpe3JldHVybntlcnJvcjp0aGlzLmVycm9yfX19O3JldHVybiBFcnJvckZvbnR9KCk7ci5FcnJvckZvbnQ9UjtmdW5jdGlvbiB0eXBlMUZvbnRHbHlwaE1hcHBpbmcodCxyLGEpe3ZhciBpLG8sdSxoPU9iamVjdC5jcmVhdGUobnVsbCksZD0hISh0LmZsYWdzJmsuU3ltYm9saWMpO2lmKHQuYmFzZUVuY29kaW5nTmFtZSl7dT0oMCxsLmdldEVuY29kaW5nKSh0LmJhc2VFbmNvZGluZ05hbWUpO2ZvcihvPTA7bzx1Lmxlbmd0aDtvKyspe2k9YS5pbmRleE9mKHVbb10pO2hbb109aT49MD9pOjB9fWVsc2UgaWYoZClmb3IobyBpbiByKWhbb109cltvXTtlbHNle3U9bC5TdGFuZGFyZEVuY29kaW5nO2ZvcihvPTA7bzx1Lmxlbmd0aDtvKyspe2k9YS5pbmRleE9mKHVbb10pO2hbb109aT49MD9pOjB9fXZhciBwLG09dC5kaWZmZXJlbmNlcztpZihtKWZvcihvIGluIG0pe3ZhciBnPW1bb107aWYoLTE9PT0oaT1hLmluZGV4T2YoZykpKXtwfHwocD0oMCxjLmdldEdseXBoc1VuaWNvZGUpKCkpO3ZhciB5PXJlY292ZXJHbHlwaE5hbWUoZyxwKTt5IT09ZyYmKGk9YS5pbmRleE9mKHkpKX1oW29dPWk+PTA/aTowfXJldHVybiBofXZhciBJPWZ1bmN0aW9uIFR5cGUxRm9udENsb3N1cmUoKXtmdW5jdGlvbiBmaW5kQmxvY2sodCxyLGEpe2Zvcih2YXIgaSxvPXQubGVuZ3RoLGM9ci5sZW5ndGgsbD1vLWMsdT1hLGg9ITE7dTxsOyl7aT0wO2Zvcig7aTxjJiZ0W3UraV09PT1yW2ldOylpKys7aWYoaT49Yyl7dSs9aTtmb3IoO3U8byYmKDAsZC5pc1doaXRlU3BhY2UpKHRbdV0pOyl1Kys7aD0hMDticmVha311Kyt9cmV0dXJue2ZvdW5kOmgsbGVuZ3RoOnV9fWZ1bmN0aW9uIFR5cGUxRm9udCh0LHIsYSl7dmFyIG89YS5sZW5ndGgxLGM9KGEubGVuZ3RoMixyLnBlZWtCeXRlcyg2KSksbD0xMjg9PT1jWzBdJiYxPT09Y1sxXTtpZihsKXtyLnNraXAoNik7bz1jWzVdPDwyNHxjWzRdPDwxNnxjWzNdPDw4fGNbMl19dmFyIHU9ZnVuY3Rpb24gZ2V0SGVhZGVyQmxvY2sodCxyKXt2YXIgYSxvLGMsbCx1PVsxMDEsMTAxLDEyMCwxMDEsOTldLGg9dC5wb3M7dHJ5e289KGE9dC5nZXRCeXRlcyhyKSkubGVuZ3RofWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBkLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHR9aWYobz09PXImJihjPWZpbmRCbG9jayhhLHUsci0yKnUubGVuZ3RoKSkuZm91bmQmJmMubGVuZ3RoPT09cilyZXR1cm57c3RyZWFtOm5ldyBnLlN0cmVhbShhKSxsZW5ndGg6cn07KDAsaS53YXJuKSgnSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTt0LnBvcz1oO2Zvcig7Oyl7aWYoMD09PShjPWZpbmRCbG9jayh0LnBlZWtCeXRlcygyMDQ4KSx1LDApKS5sZW5ndGgpYnJlYWs7dC5wb3MrPWMubGVuZ3RoO2lmKGMuZm91bmQpe2w9dC5wb3MtaDticmVha319dC5wb3M9aDtpZihsKXJldHVybntzdHJlYW06bmV3IGcuU3RyZWFtKHQuZ2V0Qnl0ZXMobCkpLGxlbmd0aDpsfTsoMCxpLndhcm4pKCdVbmFibGUgdG8gcmVjb3ZlciAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB1c2luZyBhcyBpcy4nKTtyZXR1cm57c3RyZWFtOm5ldyBnLlN0cmVhbSh0LmdldEJ5dGVzKHIpKSxsZW5ndGg6cn19KHIsbyk7bmV3IHkuVHlwZTFQYXJzZXIodS5zdHJlYW0sITEsITApLmV4dHJhY3RGb250SGVhZGVyKGEpO2wmJihjPXIuZ2V0Qnl0ZXMoNikpWzVdPDwyNHxjWzRdPDwxNnxjWzNdPDw4fGNbMl07dmFyIGg9ZnVuY3Rpb24gZ2V0RWV4ZWNCbG9jayh0LHIpe3ZhciBhPXQuZ2V0Qnl0ZXMoKTtyZXR1cm57c3RyZWFtOm5ldyBnLlN0cmVhbShhKSxsZW5ndGg6YS5sZW5ndGh9fShyKSxwPW5ldyB5LlR5cGUxUGFyc2VyKGguc3RyZWFtLCEwLCEwKS5leHRyYWN0Rm9udFByb2dyYW0oYSk7Zm9yKHZhciBtIGluIHAucHJvcGVydGllcylhW21dPXAucHJvcGVydGllc1ttXTt2YXIgYj1wLmNoYXJzdHJpbmdzLHY9dGhpcy5nZXRUeXBlMkNoYXJzdHJpbmdzKGIpLFM9dGhpcy5nZXRUeXBlMlN1YnJzKHAuc3VicnMpO3RoaXMuY2hhcnN0cmluZ3M9Yjt0aGlzLmRhdGE9dGhpcy53cmFwKHQsdix0aGlzLmNoYXJzdHJpbmdzLFMsYSk7dGhpcy5zZWFjcz10aGlzLmdldFNlYWNzKHAuY2hhcnN0cmluZ3MpfVR5cGUxRm9udC5wcm90b3R5cGU9e2dldCBudW1HbHlwaHMoKXtyZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGgrMX0sZ2V0Q2hhcnNldDpmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0Q2hhcnNldCgpe2Zvcih2YXIgdD1bIi5ub3RkZWYiXSxyPXRoaXMuY2hhcnN0cmluZ3MsYT0wO2E8ci5sZW5ndGg7YSsrKXQucHVzaChyW2FdLmdseXBoTmFtZSk7cmV0dXJuIHR9LGdldEdseXBoTWFwcGluZzpmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0R2x5cGhNYXBwaW5nKHQpe3ZhciByPXRoaXMuY2hhcnN0cmluZ3M7aWYodC5jb21wb3NpdGUpe2Zvcih2YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpLGk9MCxvPXIubGVuZ3RoO2k8bztpKyspe2FbdC5jTWFwLmNoYXJDb2RlT2YoaSldPWkrMX1yZXR1cm4gYX12YXIgYyxsPVsiLm5vdGRlZiJdO2ZvcihjPTA7YzxyLmxlbmd0aDtjKyspbC5wdXNoKHJbY10uZ2x5cGhOYW1lKTt2YXIgdT10LmJ1aWx0SW5FbmNvZGluZztpZih1KXt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcih2YXIgZCBpbiB1KShjPWwuaW5kZXhPZih1W2RdKSk+PTAmJihoW2RdPWMpfXJldHVybiB0eXBlMUZvbnRHbHlwaE1hcHBpbmcodCxoLGwpfSxoYXNHbHlwaElkOmZ1bmN0aW9uIFR5cGUxRm9udF9oYXNHbHlwaElEKHQpe3JldHVybiEodDwwfHx0Pj10aGlzLm51bUdseXBocykmJigwPT09dHx8dGhpcy5jaGFyc3RyaW5nc1t0LTFdLmNoYXJzdHJpbmcubGVuZ3RoPjApfSxnZXRTZWFjczpmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0U2VhY3ModCl7dmFyIHIsYSxpPVtdO2ZvcihyPTAsYT10Lmxlbmd0aDtyPGE7cisrKXt2YXIgbz10W3JdO28uc2VhYyYmKGlbcisxXT1vLnNlYWMpfXJldHVybiBpfSxnZXRUeXBlMkNoYXJzdHJpbmdzOmZ1bmN0aW9uIFR5cGUxRm9udF9nZXRUeXBlMkNoYXJzdHJpbmdzKHQpe2Zvcih2YXIgcj1bXSxhPTAsaT10Lmxlbmd0aDthPGk7YSsrKXIucHVzaCh0W2FdLmNoYXJzdHJpbmcpO3JldHVybiByfSxnZXRUeXBlMlN1YnJzOmZ1bmN0aW9uIFR5cGUxRm9udF9nZXRUeXBlMlN1YnJzKHQpe3ZhciByPTAsYT10Lmxlbmd0aDtyPWE8MTEzMz8xMDc6YTwzMzc2OT8xMTMxOjMyNzY4O3ZhciBpLG89W107Zm9yKGk9MDtpPHI7aSsrKW8ucHVzaChbMTFdKTtmb3IoaT0wO2k8YTtpKyspby5wdXNoKHRbaV0pO3JldHVybiBvfSx3cmFwOmZ1bmN0aW9uIFR5cGUxRm9udF93cmFwKHQscixhLGksYyl7dmFyIGw9bmV3IG8uQ0ZGO2wuaGVhZGVyPW5ldyBvLkNGRkhlYWRlcigxLDAsNCw0KTtsLm5hbWVzPVt0XTt2YXIgdT1uZXcgby5DRkZUb3BEaWN0O3Uuc2V0QnlOYW1lKCJ2ZXJzaW9uIiwzOTEpO3Uuc2V0QnlOYW1lKCJOb3RpY2UiLDM5Mik7dS5zZXRCeU5hbWUoIkZ1bGxOYW1lIiwzOTMpO3Uuc2V0QnlOYW1lKCJGYW1pbHlOYW1lIiwzOTQpO3Uuc2V0QnlOYW1lKCJXZWlnaHQiLDM5NSk7dS5zZXRCeU5hbWUoIkVuY29kaW5nIixudWxsKTt1LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsYy5mb250TWF0cml4KTt1LnNldEJ5TmFtZSgiRm9udEJCb3giLGMuYmJveCk7dS5zZXRCeU5hbWUoImNoYXJzZXQiLG51bGwpO3Uuc2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIsbnVsbCk7dS5zZXRCeU5hbWUoIlByaXZhdGUiLG51bGwpO2wudG9wRGljdD11O3ZhciBoPW5ldyBvLkNGRlN0cmluZ3M7aC5hZGQoIlZlcnNpb24gMC4xMSIpO2guYWRkKCJTZWUgb3JpZ2luYWwgbm90aWNlIik7aC5hZGQodCk7aC5hZGQodCk7aC5hZGQoIk1lZGl1bSIpO2wuc3RyaW5ncz1oO2wuZ2xvYmFsU3VickluZGV4PW5ldyBvLkNGRkluZGV4O3ZhciBkLHAsbT1yLmxlbmd0aCxnPVsiLm5vdGRlZiJdO2ZvcihkPTA7ZDxtO2QrKyl7dmFyIHk9YVtkXS5nbHlwaE5hbWU7LTE9PT1vLkNGRlN0YW5kYXJkU3RyaW5ncy5pbmRleE9mKHkpJiZoLmFkZCh5KTtnLnB1c2goeSl9bC5jaGFyc2V0PW5ldyBvLkNGRkNoYXJzZXQoITEsMCxnKTt2YXIgYj1uZXcgby5DRkZJbmRleDtiLmFkZChbMTM5LDE0XSk7Zm9yKGQ9MDtkPG07ZCsrKWIuYWRkKHJbZF0pO2wuY2hhclN0cmluZ3M9Yjt2YXIgdj1uZXcgby5DRkZQcml2YXRlRGljdDt2LnNldEJ5TmFtZSgiU3VicnMiLG51bGwpO3ZhciBTPVsiQmx1ZVZhbHVlcyIsIk90aGVyQmx1ZXMiLCJGYW1pbHlCbHVlcyIsIkZhbWlseU90aGVyQmx1ZXMiLCJTdGVtU25hcEgiLCJTdGVtU25hcFYiLCJCbHVlU2hpZnQiLCJCbHVlRnV6eiIsIkJsdWVTY2FsZSIsIkxhbmd1YWdlR3JvdXAiLCJFeHBhbnNpb25GYWN0b3IiLCJGb3JjZUJvbGQiLCJTdGRIVyIsIlN0ZFZXIl07Zm9yKGQ9MCxwPVMubGVuZ3RoO2Q8cDtkKyspe3ZhciBrPVNbZF07aWYoayBpbiBjLnByaXZhdGVEYXRhKXt2YXIgdz1jLnByaXZhdGVEYXRhW2tdO2lmKEFycmF5LmlzQXJyYXkodykpZm9yKHZhciBDPXcubGVuZ3RoLTE7Qz4wO0MtLSl3W0NdLT13W0MtMV07di5zZXRCeU5hbWUoayx3KX19bC50b3BEaWN0LnByaXZhdGVEaWN0PXY7dmFyIF89bmV3IG8uQ0ZGSW5kZXg7Zm9yKGQ9MCxwPWkubGVuZ3RoO2Q8cDtkKyspXy5hZGQoaVtkXSk7di5zdWJyc0luZGV4PV87cmV0dXJuIG5ldyBvLkNGRkNvbXBpbGVyKGwpLmNvbXBpbGUoKX19O3JldHVybiBUeXBlMUZvbnR9KCksUD1mdW5jdGlvbiBDRkZGb250Q2xvc3VyZSgpe2Z1bmN0aW9uIENGRkZvbnQodCxyKXt0aGlzLnByb3BlcnRpZXM9cjt2YXIgYT1uZXcgby5DRkZQYXJzZXIodCxyLCEwKTt0aGlzLmNmZj1hLnBhcnNlKCk7dGhpcy5jZmYuZHVwbGljYXRlRmlyc3RHbHlwaCgpO3ZhciBjPW5ldyBvLkNGRkNvbXBpbGVyKHRoaXMuY2ZmKTt0aGlzLnNlYWNzPXRoaXMuY2ZmLnNlYWNzO3RyeXt0aGlzLmRhdGE9Yy5jb21waWxlKCl9Y2F0Y2goYSl7KDAsaS53YXJuKSgiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiK3IubG9hZGVkTmFtZSk7dGhpcy5kYXRhPXR9fUNGRkZvbnQucHJvdG90eXBlPXtnZXQgbnVtR2x5cGhzKCl7cmV0dXJuIHRoaXMuY2ZmLmNoYXJTdHJpbmdzLmNvdW50fSxnZXRDaGFyc2V0OmZ1bmN0aW9uIENGRkZvbnRfZ2V0Q2hhcnNldCgpe3JldHVybiB0aGlzLmNmZi5jaGFyc2V0LmNoYXJzZXR9LGdldEdseXBoTWFwcGluZzpmdW5jdGlvbiBDRkZGb250X2dldEdseXBoTWFwcGluZygpe3ZhciB0LHIsYT10aGlzLmNmZixpPXRoaXMucHJvcGVydGllcyxvPWEuY2hhcnNldC5jaGFyc2V0O2lmKGkuY29tcG9zaXRlKXt0PU9iamVjdC5jcmVhdGUobnVsbCk7aWYoYS5pc0NJREZvbnQpZm9yKHI9MDtyPG8ubGVuZ3RoO3IrKyl7dmFyIGM9b1tyXTt0W2kuY01hcC5jaGFyQ29kZU9mKGMpXT1yfWVsc2UgZm9yKHI9MDtyPGEuY2hhclN0cmluZ3MuY291bnQ7cisrKXRbaS5jTWFwLmNoYXJDb2RlT2YocildPXI7cmV0dXJuIHR9cmV0dXJuIHQ9dHlwZTFGb250R2x5cGhNYXBwaW5nKGksYS5lbmNvZGluZz9hLmVuY29kaW5nLmVuY29kaW5nOm51bGwsbyl9LGhhc0dseXBoSWQ6ZnVuY3Rpb24gQ0ZGRm9udF9oYXNHbHlwaElEKHQpe3JldHVybiB0aGlzLmNmZi5oYXNHbHlwaElkKHQpfX07cmV0dXJuIENGRkZvbnR9KCl9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuQ0ZGRkRTZWxlY3Q9ci5DRkZDb21waWxlcj1yLkNGRlByaXZhdGVEaWN0PXIuQ0ZGVG9wRGljdD1yLkNGRkNoYXJzZXQ9ci5DRkZJbmRleD1yLkNGRlN0cmluZ3M9ci5DRkZIZWFkZXI9ci5DRkY9ci5DRkZQYXJzZXI9ci5DRkZTdGFuZGFyZFN0cmluZ3M9dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIyOSksYz1hKDIzMCk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgbD1bIi5ub3RkZWYiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXJpZ2h0IiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJxdW90ZWxlZnQiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiZXhjbGFtZG93biIsImNlbnQiLCJzdGVybGluZyIsImZyYWN0aW9uIiwieWVuIiwiZmxvcmluIiwic2VjdGlvbiIsImN1cnJlbmN5IiwicXVvdGVzaW5nbGUiLCJxdW90ZWRibGxlZnQiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsImVuZGFzaCIsImRhZ2dlciIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwicGFyYWdyYXBoIiwiYnVsbGV0IiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJxdW90ZWRibHJpZ2h0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsInBlcnRob3VzYW5kIiwicXVlc3Rpb25kb3duIiwiZ3JhdmUiLCJhY3V0ZSIsImNpcmN1bWZsZXgiLCJ0aWxkZSIsIm1hY3JvbiIsImJyZXZlIiwiZG90YWNjZW50IiwiZGllcmVzaXMiLCJyaW5nIiwiY2VkaWxsYSIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIiwiZW1kYXNoIiwiQUUiLCJvcmRmZW1pbmluZSIsIkxzbGFzaCIsIk9zbGFzaCIsIk9FIiwib3JkbWFzY3VsaW5lIiwiYWUiLCJkb3RsZXNzaSIsImxzbGFzaCIsIm9zbGFzaCIsIm9lIiwiZ2VybWFuZGJscyIsIm9uZXN1cGVyaW9yIiwibG9naWNhbG5vdCIsIm11IiwidHJhZGVtYXJrIiwiRXRoIiwib25laGFsZiIsInBsdXNtaW51cyIsIlRob3JuIiwib25lcXVhcnRlciIsImRpdmlkZSIsImJyb2tlbmJhciIsImRlZ3JlZSIsInRob3JuIiwidGhyZWVxdWFydGVycyIsInR3b3N1cGVyaW9yIiwicmVnaXN0ZXJlZCIsIm1pbnVzIiwiZXRoIiwibXVsdGlwbHkiLCJ0aHJlZXN1cGVyaW9yIiwiY29weXJpZ2h0IiwiQWFjdXRlIiwiQWNpcmN1bWZsZXgiLCJBZGllcmVzaXMiLCJBZ3JhdmUiLCJBcmluZyIsIkF0aWxkZSIsIkNjZWRpbGxhIiwiRWFjdXRlIiwiRWNpcmN1bWZsZXgiLCJFZGllcmVzaXMiLCJFZ3JhdmUiLCJJYWN1dGUiLCJJY2lyY3VtZmxleCIsIklkaWVyZXNpcyIsIklncmF2ZSIsIk50aWxkZSIsIk9hY3V0ZSIsIk9jaXJjdW1mbGV4IiwiT2RpZXJlc2lzIiwiT2dyYXZlIiwiT3RpbGRlIiwiU2Nhcm9uIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZGllcmVzaXMiLCJVZ3JhdmUiLCJZYWN1dGUiLCJZZGllcmVzaXMiLCJaY2Fyb24iLCJhYWN1dGUiLCJhY2lyY3VtZmxleCIsImFkaWVyZXNpcyIsImFncmF2ZSIsImFyaW5nIiwiYXRpbGRlIiwiY2NlZGlsbGEiLCJlYWN1dGUiLCJlY2lyY3VtZmxleCIsImVkaWVyZXNpcyIsImVncmF2ZSIsImlhY3V0ZSIsImljaXJjdW1mbGV4IiwiaWRpZXJlc2lzIiwiaWdyYXZlIiwibnRpbGRlIiwib2FjdXRlIiwib2NpcmN1bWZsZXgiLCJvZGllcmVzaXMiLCJvZ3JhdmUiLCJvdGlsZGUiLCJzY2Fyb24iLCJ1YWN1dGUiLCJ1Y2lyY3VtZmxleCIsInVkaWVyZXNpcyIsInVncmF2ZSIsInlhY3V0ZSIsInlkaWVyZXNpcyIsInpjYXJvbiIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsInF1ZXN0aW9uc21hbGwiLCJhc3VwZXJpb3IiLCJic3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCJkc3VwZXJpb3IiLCJlc3VwZXJpb3IiLCJpc3VwZXJpb3IiLCJsc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJvc3VwZXJpb3IiLCJyc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCJmZiIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwicGFyZW5yaWdodGluZmVyaW9yIiwiQ2lyY3VtZmxleHNtYWxsIiwiaHlwaGVuc3VwZXJpb3IiLCJHcmF2ZXNtYWxsIiwiQXNtYWxsIiwiQnNtYWxsIiwiQ3NtYWxsIiwiRHNtYWxsIiwiRXNtYWxsIiwiRnNtYWxsIiwiR3NtYWxsIiwiSHNtYWxsIiwiSXNtYWxsIiwiSnNtYWxsIiwiS3NtYWxsIiwiTHNtYWxsIiwiTXNtYWxsIiwiTnNtYWxsIiwiT3NtYWxsIiwiUHNtYWxsIiwiUXNtYWxsIiwiUnNtYWxsIiwiU3NtYWxsIiwiVHNtYWxsIiwiVXNtYWxsIiwiVnNtYWxsIiwiV3NtYWxsIiwiWHNtYWxsIiwiWXNtYWxsIiwiWnNtYWxsIiwiY29sb25tb25ldGFyeSIsIm9uZWZpdHRlZCIsInJ1cGlhaCIsIlRpbGRlc21hbGwiLCJleGNsYW1kb3duc21hbGwiLCJjZW50b2xkc3R5bGUiLCJMc2xhc2hzbWFsbCIsIlNjYXJvbnNtYWxsIiwiWmNhcm9uc21hbGwiLCJEaWVyZXNpc3NtYWxsIiwiQnJldmVzbWFsbCIsIkNhcm9uc21hbGwiLCJEb3RhY2NlbnRzbWFsbCIsIk1hY3JvbnNtYWxsIiwiZmlndXJlZGFzaCIsImh5cGhlbmluZmVyaW9yIiwiT2dvbmVrc21hbGwiLCJSaW5nc21hbGwiLCJDZWRpbGxhc21hbGwiLCJxdWVzdGlvbmRvd25zbWFsbCIsIm9uZWVpZ2h0aCIsInRocmVlZWlnaHRocyIsImZpdmVlaWdodGhzIiwic2V2ZW5laWdodGhzIiwib25ldGhpcmQiLCJ0d290aGlyZHMiLCJ6ZXJvc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiLCJBZ3JhdmVzbWFsbCIsIkFhY3V0ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBcmluZ3NtYWxsIiwiQUVzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWdyYXZlc21hbGwiLCJJYWN1dGVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIkV0aHNtYWxsIiwiTnRpbGRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk90aWxkZXNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiWWFjdXRlc21hbGwiLCJUaG9ybnNtYWxsIiwiWWRpZXJlc2lzc21hbGwiLCIwMDEuMDAwIiwiMDAxLjAwMSIsIjAwMS4wMDIiLCIwMDEuMDAzIiwiQmxhY2siLCJCb2xkIiwiQm9vayIsIkxpZ2h0IiwiTWVkaXVtIiwiUmVndWxhciIsIlJvbWFuIiwiU2VtaWJvbGQiXTtyLkNGRlN0YW5kYXJkU3RyaW5ncz1sO3ZhciB1PWZ1bmN0aW9uIENGRlBhcnNlckNsb3N1cmUoKXt2YXIgdD1bbnVsbCx7aWQ6ImhzdGVtIixtaW46MixzdGFja0NsZWFyaW5nOiEwLHN0ZW06ITB9LG51bGwse2lkOiJ2c3RlbSIsbWluOjIsc3RhY2tDbGVhcmluZzohMCxzdGVtOiEwfSx7aWQ6InZtb3ZldG8iLG1pbjoxLHN0YWNrQ2xlYXJpbmc6ITB9LHtpZDoicmxpbmV0byIsbWluOjIscmVzZXRTdGFjazohMH0se2lkOiJobGluZXRvIixtaW46MSxyZXNldFN0YWNrOiEwfSx7aWQ6InZsaW5ldG8iLG1pbjoxLHJlc2V0U3RhY2s6ITB9LHtpZDoicnJjdXJ2ZXRvIixtaW46NixyZXNldFN0YWNrOiEwfSxudWxsLHtpZDoiY2FsbHN1YnIiLG1pbjoxLHVuZGVmU3RhY2s6ITB9LHtpZDoicmV0dXJuIixtaW46MCx1bmRlZlN0YWNrOiEwfSxudWxsLG51bGwse2lkOiJlbmRjaGFyIixtaW46MCxzdGFja0NsZWFyaW5nOiEwfSxudWxsLG51bGwsbnVsbCx7aWQ6ImhzdGVtaG0iLG1pbjoyLHN0YWNrQ2xlYXJpbmc6ITAsc3RlbTohMH0se2lkOiJoaW50bWFzayIsbWluOjAsc3RhY2tDbGVhcmluZzohMH0se2lkOiJjbnRybWFzayIsbWluOjAsc3RhY2tDbGVhcmluZzohMH0se2lkOiJybW92ZXRvIixtaW46MixzdGFja0NsZWFyaW5nOiEwfSx7aWQ6Imhtb3ZldG8iLG1pbjoxLHN0YWNrQ2xlYXJpbmc6ITB9LHtpZDoidnN0ZW1obSIsbWluOjIsc3RhY2tDbGVhcmluZzohMCxzdGVtOiEwfSx7aWQ6InJjdXJ2ZWxpbmUiLG1pbjo4LHJlc2V0U3RhY2s6ITB9LHtpZDoicmxpbmVjdXJ2ZSIsbWluOjgscmVzZXRTdGFjazohMH0se2lkOiJ2dmN1cnZldG8iLG1pbjo0LHJlc2V0U3RhY2s6ITB9LHtpZDoiaGhjdXJ2ZXRvIixtaW46NCxyZXNldFN0YWNrOiEwfSxudWxsLHtpZDoiY2FsbGdzdWJyIixtaW46MSx1bmRlZlN0YWNrOiEwfSx7aWQ6InZoY3VydmV0byIsbWluOjQscmVzZXRTdGFjazohMH0se2lkOiJodmN1cnZldG8iLG1pbjo0LHJlc2V0U3RhY2s6ITB9XSxyPVtudWxsLG51bGwsbnVsbCx7aWQ6ImFuZCIsbWluOjIsc3RhY2tEZWx0YTotMX0se2lkOiJvciIsbWluOjIsc3RhY2tEZWx0YTotMX0se2lkOiJub3QiLG1pbjoxLHN0YWNrRGVsdGE6MH0sbnVsbCxudWxsLG51bGwse2lkOiJhYnMiLG1pbjoxLHN0YWNrRGVsdGE6MH0se2lkOiJhZGQiLG1pbjoyLHN0YWNrRGVsdGE6LTEsc3RhY2tGbjpmdW5jdGlvbiBzdGFja19kaXYodCxyKXt0W3ItMl09dFtyLTJdK3Rbci0xXX19LHtpZDoic3ViIixtaW46MixzdGFja0RlbHRhOi0xLHN0YWNrRm46ZnVuY3Rpb24gc3RhY2tfZGl2KHQscil7dFtyLTJdPXRbci0yXS10W3ItMV19fSx7aWQ6ImRpdiIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuOmZ1bmN0aW9uIHN0YWNrX2Rpdih0LHIpe3Rbci0yXT10W3ItMl0vdFtyLTFdfX0sbnVsbCx7aWQ6Im5lZyIsbWluOjEsc3RhY2tEZWx0YTowLHN0YWNrRm46ZnVuY3Rpb24gc3RhY2tfZGl2KHQscil7dFtyLTFdPS10W3ItMV19fSx7aWQ6ImVxIixtaW46MixzdGFja0RlbHRhOi0xfSxudWxsLG51bGwse2lkOiJkcm9wIixtaW46MSxzdGFja0RlbHRhOi0xfSxudWxsLHtpZDoicHV0IixtaW46MixzdGFja0RlbHRhOi0yfSx7aWQ6ImdldCIsbWluOjEsc3RhY2tEZWx0YTowfSx7aWQ6ImlmZWxzZSIsbWluOjQsc3RhY2tEZWx0YTotM30se2lkOiJyYW5kb20iLG1pbjowLHN0YWNrRGVsdGE6MX0se2lkOiJtdWwiLG1pbjoyLHN0YWNrRGVsdGE6LTEsc3RhY2tGbjpmdW5jdGlvbiBzdGFja19kaXYodCxyKXt0W3ItMl09dFtyLTJdKnRbci0xXX19LG51bGwse2lkOiJzcXJ0IixtaW46MSxzdGFja0RlbHRhOjB9LHtpZDoiZHVwIixtaW46MSxzdGFja0RlbHRhOjF9LHtpZDoiZXhjaCIsbWluOjIsc3RhY2tEZWx0YTowfSx7aWQ6ImluZGV4IixtaW46MixzdGFja0RlbHRhOjB9LHtpZDoicm9sbCIsbWluOjMsc3RhY2tEZWx0YTotMn0sbnVsbCxudWxsLG51bGwse2lkOiJoZmxleCIsbWluOjcscmVzZXRTdGFjazohMH0se2lkOiJmbGV4IixtaW46MTMscmVzZXRTdGFjazohMH0se2lkOiJoZmxleDEiLG1pbjo5LHJlc2V0U3RhY2s6ITB9LHtpZDoiZmxleDEiLG1pbjoxMSxyZXNldFN0YWNrOiEwfV07cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ0ZGUGFyc2VyKHQscixhKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDRkZQYXJzZXIpO3RoaXMuYnl0ZXM9dC5nZXRCeXRlcygpO3RoaXMucHJvcGVydGllcz1yO3RoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZD0hIWF9X2NyZWF0ZUNsYXNzKENGRlBhcnNlcixbe2tleToicGFyc2UiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlKCl7dmFyIHQ9dGhpcy5wcm9wZXJ0aWVzLHI9bmV3IGg7dGhpcy5jZmY9cjt2YXIgYT10aGlzLnBhcnNlSGVhZGVyKCksaT10aGlzLnBhcnNlSW5kZXgoYS5lbmRQb3MpLG89dGhpcy5wYXJzZUluZGV4KGkuZW5kUG9zKSxjPXRoaXMucGFyc2VJbmRleChvLmVuZFBvcyksbD10aGlzLnBhcnNlSW5kZXgoYy5lbmRQb3MpLHU9dGhpcy5wYXJzZURpY3Qoby5vYmouZ2V0KDApKSxkPXRoaXMuY3JlYXRlRGljdCh5LHUsci5zdHJpbmdzKTtyLmhlYWRlcj1hLm9iajtyLm5hbWVzPXRoaXMucGFyc2VOYW1lSW5kZXgoaS5vYmopO3Iuc3RyaW5ncz10aGlzLnBhcnNlU3RyaW5nSW5kZXgoYy5vYmopO3IudG9wRGljdD1kO3IuZ2xvYmFsU3VickluZGV4PWwub2JqO3RoaXMucGFyc2VQcml2YXRlRGljdChyLnRvcERpY3QpO3IuaXNDSURGb250PWQuaGFzTmFtZSgiUk9TIik7dmFyIHA9ZC5nZXRCeU5hbWUoIkNoYXJTdHJpbmdzIiksbT10aGlzLnBhcnNlSW5kZXgocCkub2JqLGc9ZC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTtnJiYodC5mb250TWF0cml4PWcpO3ZhciBiLHYsUz1kLmdldEJ5TmFtZSgiRm9udEJCb3giKTtpZihTKXt0LmFzY2VudD1NYXRoLm1heChTWzNdLFNbMV0pO3QuZGVzY2VudD1NYXRoLm1pbihTWzFdLFNbM10pO3QuYXNjZW50U2NhbGVkPSEwfWlmKHIuaXNDSURGb250KXtmb3IodmFyIGs9dGhpcy5wYXJzZUluZGV4KGQuZ2V0QnlOYW1lKCJGREFycmF5IikpLm9iaix3PTAsQz1rLmNvdW50O3c8QzsrK3cpe3ZhciBfPWsuZ2V0KHcpLHg9dGhpcy5jcmVhdGVEaWN0KHksdGhpcy5wYXJzZURpY3QoXyksci5zdHJpbmdzKTt0aGlzLnBhcnNlUHJpdmF0ZURpY3QoeCk7ci5mZEFycmF5LnB1c2goeCl9dj1udWxsO2I9dGhpcy5wYXJzZUNoYXJzZXRzKGQuZ2V0QnlOYW1lKCJjaGFyc2V0IiksbS5jb3VudCxyLnN0cmluZ3MsITApO3IuZmRTZWxlY3Q9dGhpcy5wYXJzZUZEU2VsZWN0KGQuZ2V0QnlOYW1lKCJGRFNlbGVjdCIpLG0uY291bnQpfWVsc2V7Yj10aGlzLnBhcnNlQ2hhcnNldHMoZC5nZXRCeU5hbWUoImNoYXJzZXQiKSxtLmNvdW50LHIuc3RyaW5ncywhMSk7dj10aGlzLnBhcnNlRW5jb2RpbmcoZC5nZXRCeU5hbWUoIkVuY29kaW5nIiksdCxyLnN0cmluZ3MsYi5jaGFyc2V0KX1yLmNoYXJzZXQ9YjtyLmVuY29kaW5nPXY7dmFyIEE9dGhpcy5wYXJzZUNoYXJTdHJpbmdzKHtjaGFyU3RyaW5nczptLGxvY2FsU3VickluZGV4OmQucHJpdmF0ZURpY3Quc3VicnNJbmRleCxnbG9iYWxTdWJySW5kZXg6bC5vYmosZmRTZWxlY3Q6ci5mZFNlbGVjdCxmZEFycmF5OnIuZmRBcnJheSxwcml2YXRlRGljdDpkLnByaXZhdGVEaWN0fSk7ci5jaGFyU3RyaW5ncz1BLmNoYXJTdHJpbmdzO3Iuc2VhY3M9QS5zZWFjcztyLndpZHRocz1BLndpZHRocztyZXR1cm4gcn19LHtrZXk6InBhcnNlSGVhZGVyIix2YWx1ZTpmdW5jdGlvbiBwYXJzZUhlYWRlcigpe2Zvcih2YXIgdD10aGlzLmJ5dGVzLHI9dC5sZW5ndGgsYT0wO2E8ciYmMSE9PXRbYV07KSsrYTtpZihhPj1yKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJJbnZhbGlkIENGRiBoZWFkZXIiKTtpZigwIT09YSl7KDAsaS5pbmZvKSgiY2ZmIGRhdGEgaXMgc2hpZnRlZCIpO3Q9dC5zdWJhcnJheShhKTt0aGlzLmJ5dGVzPXR9dmFyIG89dFswXSxjPXRbMV0sbD10WzJdLHU9dFszXTtyZXR1cm57b2JqOm5ldyBkKG8sYyxsLHUpLGVuZFBvczpsfX19LHtrZXk6InBhcnNlRGljdCIsdmFsdWU6ZnVuY3Rpb24gcGFyc2VEaWN0KHQpe3ZhciByPTA7ZnVuY3Rpb24gcGFyc2VPcGVyYW5kKCl7dmFyIGE9dFtyKytdO2lmKDMwPT09YSlyZXR1cm4gZnVuY3Rpb24gcGFyc2VGbG9hdE9wZXJhbmQoKXt2YXIgYT0iIixpPVsiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIi4iLCJFIiwiRS0iLG51bGwsIi0iXSxvPXQubGVuZ3RoO2Zvcig7cjxvOyl7dmFyIGM9dFtyKytdLGw9Yz4+NCx1PTE1JmM7aWYoMTU9PT1sKWJyZWFrO2ErPWlbbF07aWYoMTU9PT11KWJyZWFrO2ErPWlbdV19cmV0dXJuIHBhcnNlRmxvYXQoYSl9KCk7aWYoMjg9PT1hKXJldHVybiBhPSgoYT10W3IrK10pPDwyNHx0W3IrK108PDE2KT4+MTY7aWYoMjk9PT1hKXJldHVybiBhPShhPShhPShhPXRbcisrXSk8PDh8dFtyKytdKTw8OHx0W3IrK10pPDw4fHRbcisrXTtpZihhPj0zMiYmYTw9MjQ2KXJldHVybiBhLTEzOTtpZihhPj0yNDcmJmE8PTI1MClyZXR1cm4gMjU2KihhLTI0NykrdFtyKytdKzEwODtpZihhPj0yNTEmJmE8PTI1NClyZXR1cm4tMjU2KihhLTI1MSktdFtyKytdLTEwODsoMCxpLndhcm4pKCdDRkZQYXJzZXJfcGFyc2VEaWN0OiAiJythKyciIGlzIGEgcmVzZXJ2ZWQgY29tbWFuZC4nKTtyZXR1cm4gTmFOfXZhciBhPVtdLG89W107cj0wO2Zvcih2YXIgYz10Lmxlbmd0aDtyPGM7KXt2YXIgbD10W3JdO2lmKGw8PTIxKXsxMj09PWwmJihsPWw8PDh8dFsrK3JdKTtvLnB1c2goW2wsYV0pO2E9W107KytyfWVsc2UgYS5wdXNoKHBhcnNlT3BlcmFuZCgpKX1yZXR1cm4gb319LHtrZXk6InBhcnNlSW5kZXgiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlSW5kZXgodCl7dmFyIHIsYSxpPW5ldyBtLG89dGhpcy5ieXRlcyxjPW9bdCsrXTw8OHxvW3QrK10sbD1bXSx1PXQ7aWYoMCE9PWMpe3ZhciBoPW9bdCsrXSxkPXQrKGMrMSkqaC0xO2ZvcihyPTAsYT1jKzE7cjxhOysrcil7Zm9yKHZhciBwPTAsZz0wO2c8aDsrK2cpe3A8PD04O3ArPW9bdCsrXX1sLnB1c2goZCtwKX11PWxbY119Zm9yKHI9MCxhPWwubGVuZ3RoLTE7cjxhOysrcil7dmFyIHk9bFtyXSxiPWxbcisxXTtpLmFkZChvLnN1YmFycmF5KHksYikpfXJldHVybntvYmo6aSxlbmRQb3M6dX19fSx7a2V5OiJwYXJzZU5hbWVJbmRleCIsdmFsdWU6ZnVuY3Rpb24gcGFyc2VOYW1lSW5kZXgodCl7Zm9yKHZhciByPVtdLGE9MCxvPXQuY291bnQ7YTxvOysrYSl7dmFyIGM9dC5nZXQoYSk7ci5wdXNoKCgwLGkuYnl0ZXNUb1N0cmluZykoYykpfXJldHVybiByfX0se2tleToicGFyc2VTdHJpbmdJbmRleCIsdmFsdWU6ZnVuY3Rpb24gcGFyc2VTdHJpbmdJbmRleCh0KXtmb3IodmFyIHI9bmV3IHAsYT0wLG89dC5jb3VudDthPG87KythKXt2YXIgYz10LmdldChhKTtyLmFkZCgoMCxpLmJ5dGVzVG9TdHJpbmcpKGMpKX1yZXR1cm4gcn19LHtrZXk6ImNyZWF0ZURpY3QiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZURpY3QodCxyLGEpe2Zvcih2YXIgaT1uZXcgdChhKSxvPTAsYz1yLmxlbmd0aDtvPGM7KytvKXt2YXIgbD1yW29dLHU9bFswXSxoPWxbMV07aS5zZXRCeUtleSh1LGgpfXJldHVybiBpfX0se2tleToicGFyc2VDaGFyU3RyaW5nIix2YWx1ZTpmdW5jdGlvbiBwYXJzZUNoYXJTdHJpbmcoYSxvLGMsbCl7aWYoIW98fGEuY2FsbERlcHRoPjEwKXJldHVybiExO2Zvcih2YXIgdT1hLnN0YWNrU2l6ZSxoPWEuc3RhY2ssZD1vLmxlbmd0aCxwPTA7cDxkOyl7dmFyIG09b1twKytdLGc9bnVsbDtpZigxMj09PW0pe3ZhciB5PW9bcCsrXTtpZigwPT09eSl7b1twLTJdPTEzOTtvW3AtMV09MjI7dT0wfWVsc2UgZz1yW3ldfWVsc2UgaWYoMjg9PT1tKXtoW3VdPShvW3BdPDwyNHxvW3ArMV08PDE2KT4+MTY7cCs9Mjt1Kyt9ZWxzZSBpZigxND09PW0pe2lmKHU+PTQpe3UtPTQ7aWYodGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKXthLnNlYWM9aC5zbGljZSh1LHUrNCk7cmV0dXJuITF9fWc9dFttXX1lbHNlIGlmKG0+PTMyJiZtPD0yNDYpe2hbdV09bS0xMzk7dSsrfWVsc2UgaWYobT49MjQ3JiZtPD0yNTQpe2hbdV09bTwyNTE/KG0tMjQ3PDw4KStvW3BdKzEwODotKG0tMjUxPDw4KS1vW3BdLTEwODtwKys7dSsrfWVsc2UgaWYoMjU1PT09bSl7aFt1XT0ob1twXTw8MjR8b1twKzFdPDwxNnxvW3ArMl08PDh8b1twKzNdKS82NTUzNjtwKz00O3UrK31lbHNlIGlmKDE5PT09bXx8MjA9PT1tKXthLmhpbnRzKz11Pj4xO3ArPWEuaGludHMrNz4+Mzt1JT0yO2c9dFttXX1lbHNle2lmKDEwPT09bXx8Mjk9PT1tKXt2YXIgYjtpZighKGI9MTA9PT1tP2M6bCkpe2c9dFttXTsoMCxpLndhcm4pKCJNaXNzaW5nIHN1YnJzSW5kZXggZm9yICIrZy5pZCk7cmV0dXJuITF9dmFyIHY9MzI3Njg7Yi5jb3VudDwxMjQwP3Y9MTA3OmIuY291bnQ8MzM5MDAmJih2PTExMzEpO3ZhciBTPWhbLS11XSt2O2lmKFM8MHx8Uz49Yi5jb3VudHx8aXNOYU4oUykpe2c9dFttXTsoMCxpLndhcm4pKCJPdXQgb2YgYm91bmRzIHN1YnJJbmRleCBmb3IgIitnLmlkKTtyZXR1cm4hMX1hLnN0YWNrU2l6ZT11O2EuY2FsbERlcHRoKys7aWYoIXRoaXMucGFyc2VDaGFyU3RyaW5nKGEsYi5nZXQoUyksYyxsKSlyZXR1cm4hMTthLmNhbGxEZXB0aC0tO3U9YS5zdGFja1NpemU7Y29udGludWV9aWYoMTE9PT1tKXthLnN0YWNrU2l6ZT11O3JldHVybiEwfWc9dFttXX1pZihnKXtpZihnLnN0ZW0pe2EuaGludHMrPXU+PjE7aWYoMz09PW18fDIzPT09bSlhLmhhc1ZTdGVtcz0hMDtlbHNlIGlmKGEuaGFzVlN0ZW1zJiYoMT09PW18fDE4PT09bSkpeygwLGkud2FybikoIkNGRiBzdGVtIGhpbnRzIGFyZSBpbiB3cm9uZyBvcmRlciIpO29bcC0xXT0xPT09bT8zOjIzfX1pZigibWluImluIGcmJiFhLnVuZGVmU3RhY2smJnU8Zy5taW4peygwLGkud2FybikoIk5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgIitnLmlkKyI7IGFjdHVhbDogIit1KyIsIGV4cGVjdGVkOiAiK2cubWluKTtyZXR1cm4hMX1pZihhLmZpcnN0U3RhY2tDbGVhcmluZyYmZy5zdGFja0NsZWFyaW5nKXthLmZpcnN0U3RhY2tDbGVhcmluZz0hMTsodS09Zy5taW4pPj0yJiZnLnN0ZW0/dSU9Mjp1PjEmJigwLGkud2FybikoIkZvdW5kIHRvbyBtYW55IHBhcmFtZXRlcnMgZm9yIHN0YWNrLWNsZWFyaW5nIGNvbW1hbmQiKTt1PjAmJmhbdS0xXT49MCYmKGEud2lkdGg9aFt1LTFdKX1pZigic3RhY2tEZWx0YSJpbiBnKXsic3RhY2tGbiJpbiBnJiZnLnN0YWNrRm4oaCx1KTt1Kz1nLnN0YWNrRGVsdGF9ZWxzZSBpZihnLnN0YWNrQ2xlYXJpbmcpdT0wO2Vsc2UgaWYoZy5yZXNldFN0YWNrKXt1PTA7YS51bmRlZlN0YWNrPSExfWVsc2UgaWYoZy51bmRlZlN0YWNrKXt1PTA7YS51bmRlZlN0YWNrPSEwO2EuZmlyc3RTdGFja0NsZWFyaW5nPSExfX19YS5zdGFja1NpemU9dTtyZXR1cm4hMH19LHtrZXk6InBhcnNlQ2hhclN0cmluZ3MiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlQ2hhclN0cmluZ3ModCl7Zm9yKHZhciByPXQuY2hhclN0cmluZ3MsYT10LmxvY2FsU3VickluZGV4LG89dC5nbG9iYWxTdWJySW5kZXgsYz10LmZkU2VsZWN0LGw9dC5mZEFycmF5LHU9dC5wcml2YXRlRGljdCxoPVtdLGQ9W10scD1yLmNvdW50LG09MDttPHA7bSsrKXt2YXIgZz1yLmdldChtKSx5PXtjYWxsRGVwdGg6MCxzdGFja1NpemU6MCxzdGFjazpbXSx1bmRlZlN0YWNrOiEwLGhpbnRzOjAsZmlyc3RTdGFja0NsZWFyaW5nOiEwLHNlYWM6bnVsbCx3aWR0aDpudWxsLGhhc1ZTdGVtczohMX0sYj0hMCx2PW51bGwsUz11O2lmKGMmJmwubGVuZ3RoKXt2YXIgaz1jLmdldEZESW5kZXgobSk7aWYoLTE9PT1rKXsoMCxpLndhcm4pKCJHbHlwaCBpbmRleCBpcyBub3QgaW4gZmQgc2VsZWN0LiIpO2I9ITF9aWYoaz49bC5sZW5ndGgpeygwLGkud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpO2I9ITF9YiYmKHY9KFM9bFtrXS5wcml2YXRlRGljdCkuc3VicnNJbmRleCl9ZWxzZSBhJiYodj1hKTtiJiYoYj10aGlzLnBhcnNlQ2hhclN0cmluZyh5LGcsdixvKSk7aWYobnVsbCE9PXkud2lkdGgpe3ZhciB3PVMuZ2V0QnlOYW1lKCJub21pbmFsV2lkdGhYIik7ZFttXT13K3kud2lkdGh9ZWxzZXt2YXIgQz1TLmdldEJ5TmFtZSgiZGVmYXVsdFdpZHRoWCIpO2RbbV09Q31udWxsIT09eS5zZWFjJiYoaFttXT15LnNlYWMpO2J8fHIuc2V0KG0sbmV3IFVpbnQ4QXJyYXkoWzE0XSkpfXJldHVybntjaGFyU3RyaW5nczpyLHNlYWNzOmgsd2lkdGhzOmR9fX0se2tleToiZW1wdHlQcml2YXRlRGljdGlvbmFyeSIsdmFsdWU6ZnVuY3Rpb24gZW1wdHlQcml2YXRlRGljdGlvbmFyeSh0KXt2YXIgcj10aGlzLmNyZWF0ZURpY3QoYixbXSx0LnN0cmluZ3MpO3Quc2V0QnlLZXkoMTgsWzAsMF0pO3QucHJpdmF0ZURpY3Q9cn19LHtrZXk6InBhcnNlUHJpdmF0ZURpY3QiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlUHJpdmF0ZURpY3QodCl7aWYodC5oYXNOYW1lKCJQcml2YXRlIikpe3ZhciByPXQuZ2V0QnlOYW1lKCJQcml2YXRlIik7aWYoQXJyYXkuaXNBcnJheShyKSYmMj09PXIubGVuZ3RoKXt2YXIgYT1yWzBdLGk9clsxXTtpZigwPT09YXx8aT49dGhpcy5ieXRlcy5sZW5ndGgpdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHQpO2Vsc2V7dmFyIG89aSthLGM9dGhpcy5ieXRlcy5zdWJhcnJheShpLG8pLGw9dGhpcy5wYXJzZURpY3QoYyksdT10aGlzLmNyZWF0ZURpY3QoYixsLHQuc3RyaW5ncyk7dC5wcml2YXRlRGljdD11O2lmKHUuZ2V0QnlOYW1lKCJTdWJycyIpKXt2YXIgaD11LmdldEJ5TmFtZSgiU3VicnMiKSxkPWkraDtpZigwPT09aHx8ZD49dGhpcy5ieXRlcy5sZW5ndGgpdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHQpO2Vsc2V7dmFyIHA9dGhpcy5wYXJzZUluZGV4KGQpO3Uuc3VicnNJbmRleD1wLm9ian19fX1lbHNlIHQucmVtb3ZlQnlOYW1lKCJQcml2YXRlIil9ZWxzZSB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkodCl9fSx7a2V5OiJwYXJzZUNoYXJzZXRzIix2YWx1ZTpmdW5jdGlvbiBwYXJzZUNoYXJzZXRzKHQscixhLGMpe2lmKDA9PT10KXJldHVybiBuZXcgUyghMCx2LklTT19BRE9CRSxvLklTT0Fkb2JlQ2hhcnNldCk7aWYoMT09PXQpcmV0dXJuIG5ldyBTKCEwLHYuRVhQRVJULG8uRXhwZXJ0Q2hhcnNldCk7aWYoMj09PXQpcmV0dXJuIG5ldyBTKCEwLHYuRVhQRVJUX1NVQlNFVCxvLkV4cGVydFN1YnNldENoYXJzZXQpO3ZhciBsLHUsaCxkPXRoaXMuYnl0ZXMscD10LG09ZFt0KytdLGc9W2M/MDoiLm5vdGRlZiJdO3ItPTE7c3dpdGNoKG0pe2Nhc2UgMDpmb3IoaD0wO2g8cjtoKyspe2w9ZFt0KytdPDw4fGRbdCsrXTtnLnB1c2goYz9sOmEuZ2V0KGwpKX1icmVhaztjYXNlIDE6Zm9yKDtnLmxlbmd0aDw9cjspe2w9ZFt0KytdPDw4fGRbdCsrXTt1PWRbdCsrXTtmb3IoaD0wO2g8PXU7aCsrKWcucHVzaChjP2wrKzphLmdldChsKyspKX1icmVhaztjYXNlIDI6Zm9yKDtnLmxlbmd0aDw9cjspe2w9ZFt0KytdPDw4fGRbdCsrXTt1PWRbdCsrXTw8OHxkW3QrK107Zm9yKGg9MDtoPD11O2grKylnLnB1c2goYz9sKys6YS5nZXQobCsrKSl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiVW5rbm93biBjaGFyc2V0IGZvcm1hdCIpfXZhciB5PXQsYj1kLnN1YmFycmF5KHAseSk7cmV0dXJuIG5ldyBTKCExLG0sZyxiKX19LHtrZXk6InBhcnNlRW5jb2RpbmciLHZhbHVlOmZ1bmN0aW9uIHBhcnNlRW5jb2RpbmcodCxyLGEsbyl7dmFyIGwsdSxoLGQ9T2JqZWN0LmNyZWF0ZShudWxsKSxwPXRoaXMuYnl0ZXMsbT0hMSxnPW51bGw7aWYoMD09PXR8fDE9PT10KXttPSEwO2w9dDt2YXIgeT10P2MuRXhwZXJ0RW5jb2Rpbmc6Yy5TdGFuZGFyZEVuY29kaW5nO2Zvcih1PTAsaD1vLmxlbmd0aDt1PGg7dSsrKXt2YXIgYj15LmluZGV4T2Yob1t1XSk7LTEhPT1iJiYoZFtiXT11KX19ZWxzZXt2YXIgdj10O3N3aXRjaCgxMjcmKGw9cFt0KytdKSl7Y2FzZSAwOnZhciBTPXBbdCsrXTtmb3IodT0xO3U8PVM7dSsrKWRbcFt0KytdXT11O2JyZWFrO2Nhc2UgMTp2YXIgdz1wW3QrK10sQz0xO2Zvcih1PTA7dTx3O3UrKylmb3IodmFyIF89cFt0KytdLHg9cFt0KytdLEE9XztBPD1fK3g7QSsrKWRbQV09QysrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIlVua25vd24gZW5jb2RpbmcgZm9ybWF0OiAiLmNvbmNhdChsLCIgaW4gQ0ZGIikpfXZhciBUPXQ7aWYoMTI4Jmwpe3Bbdl0mPTEyNzshZnVuY3Rpb24gcmVhZFN1cHBsZW1lbnQoKXt2YXIgcj1wW3QrK107Zm9yKHU9MDt1PHI7dSsrKXt2YXIgaT1wW3QrK10sYz0ocFt0KytdPDw4KSsoMjU1JnBbdCsrXSk7ZFtpXT1vLmluZGV4T2YoYS5nZXQoYykpfX0oKX1nPXAuc3ViYXJyYXkodixUKX1yZXR1cm4gbmV3IGsobSxsJj0xMjcsZCxnKX19LHtrZXk6InBhcnNlRkRTZWxlY3QiLHZhbHVlOmZ1bmN0aW9uIHBhcnNlRkRTZWxlY3QodCxyKXt2YXIgYSxvPXRoaXMuYnl0ZXMsYz1vW3QrK10sbD1bXTtzd2l0Y2goYyl7Y2FzZSAwOmZvcihhPTA7YTxyOysrYSl7dmFyIHU9b1t0KytdO2wucHVzaCh1KX1icmVhaztjYXNlIDM6dmFyIGg9b1t0KytdPDw4fG9bdCsrXTtmb3IoYT0wO2E8aDsrK2Epe3ZhciBkPW9bdCsrXTw8OHxvW3QrK107aWYoMD09PWEmJjAhPT1kKXsoMCxpLndhcm4pKCJwYXJzZUZEU2VsZWN0OiBUaGUgZmlyc3QgcmFuZ2UgbXVzdCBoYXZlIGEgZmlyc3QgR0lEIG9mIDAgLS0gdHJ5aW5nIHRvIHJlY292ZXIuIik7ZD0wfWZvcih2YXIgcD1vW3QrK10sbT1vW3RdPDw4fG9bdCsxXSxnPWQ7ZzxtOysrZylsLnB1c2gocCl9dCs9MjticmVhaztkZWZhdWx0OnRocm93IG5ldyBpLkZvcm1hdEVycm9yKCdwYXJzZUZEU2VsZWN0OiBVbmtub3duIGZvcm1hdCAiJy5jb25jYXQoYywnIi4nKSl9aWYobC5sZW5ndGghPT1yKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTtyZXR1cm4gbmV3IHcoYyxsKX19XSk7cmV0dXJuIENGRlBhcnNlcn0oKX0oKTtyLkNGRlBhcnNlcj11O3ZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ0ZGKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ0ZGKTt0aGlzLmhlYWRlcj1udWxsO3RoaXMubmFtZXM9W107dGhpcy50b3BEaWN0PW51bGw7dGhpcy5zdHJpbmdzPW5ldyBwO3RoaXMuZ2xvYmFsU3VickluZGV4PW51bGw7dGhpcy5lbmNvZGluZz1udWxsO3RoaXMuY2hhcnNldD1udWxsO3RoaXMuY2hhclN0cmluZ3M9bnVsbDt0aGlzLmZkQXJyYXk9W107dGhpcy5mZFNlbGVjdD1udWxsO3RoaXMuaXNDSURGb250PSExfV9jcmVhdGVDbGFzcyhDRkYsW3trZXk6ImR1cGxpY2F0ZUZpcnN0R2x5cGgiLHZhbHVlOmZ1bmN0aW9uIGR1cGxpY2F0ZUZpcnN0R2x5cGgoKXtpZih0aGlzLmNoYXJTdHJpbmdzLmNvdW50Pj02NTUzNSkoMCxpLndhcm4pKCJOb3QgZW5vdWdoIHNwYWNlIGluIGNoYXJzdHJpbmdzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTtlbHNle3ZhciB0PXRoaXMuY2hhclN0cmluZ3MuZ2V0KDApO3RoaXMuY2hhclN0cmluZ3MuYWRkKHQpO3RoaXMuaXNDSURGb250JiZ0aGlzLmZkU2VsZWN0LmZkU2VsZWN0LnB1c2godGhpcy5mZFNlbGVjdC5mZFNlbGVjdFswXSl9fX0se2tleToiaGFzR2x5cGhJZCIsdmFsdWU6ZnVuY3Rpb24gaGFzR2x5cGhJZCh0KXtyZXR1cm4hKHQ8MHx8dD49dGhpcy5jaGFyU3RyaW5ncy5jb3VudCkmJnRoaXMuY2hhclN0cmluZ3MuZ2V0KHQpLmxlbmd0aD4wfX1dKTtyZXR1cm4gQ0ZGfSgpO3IuQ0ZGPWg7dmFyIGQ9ZnVuY3Rpb24gQ0ZGSGVhZGVyKHQscixhLGkpe19jbGFzc0NhbGxDaGVjayh0aGlzLENGRkhlYWRlcik7dGhpcy5tYWpvcj10O3RoaXMubWlub3I9cjt0aGlzLmhkclNpemU9YTt0aGlzLm9mZlNpemU9aX07ci5DRkZIZWFkZXI9ZDt2YXIgcD1mdW5jdGlvbigpe2Z1bmN0aW9uIENGRlN0cmluZ3MoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDRkZTdHJpbmdzKTt0aGlzLnN0cmluZ3M9W119X2NyZWF0ZUNsYXNzKENGRlN0cmluZ3MsW3trZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24gZ2V0KHQpe3JldHVybiB0Pj0wJiZ0PD0zOTA/bFt0XTp0LTM5MTw9dGhpcy5zdHJpbmdzLmxlbmd0aD90aGlzLnN0cmluZ3NbdC0zOTFdOmxbMF19fSx7a2V5OiJnZXRTSUQiLHZhbHVlOmZ1bmN0aW9uIGdldFNJRCh0KXt2YXIgcj1sLmluZGV4T2YodCk7cmV0dXJuLTEhPT1yP3I6LTEhPT0ocj10aGlzLnN0cmluZ3MuaW5kZXhPZih0KSk/ciszOTE6LTF9fSx7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uIGFkZCh0KXt0aGlzLnN0cmluZ3MucHVzaCh0KX19LHtrZXk6ImNvdW50IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuc3RyaW5ncy5sZW5ndGh9fV0pO3JldHVybiBDRkZTdHJpbmdzfSgpO3IuQ0ZGU3RyaW5ncz1wO3ZhciBtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ0ZGSW5kZXgoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDRkZJbmRleCk7dGhpcy5vYmplY3RzPVtdO3RoaXMubGVuZ3RoPTB9X2NyZWF0ZUNsYXNzKENGRkluZGV4LFt7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uIGFkZCh0KXt0aGlzLmxlbmd0aCs9dC5sZW5ndGg7dGhpcy5vYmplY3RzLnB1c2godCl9fSx7a2V5OiJzZXQiLHZhbHVlOmZ1bmN0aW9uIHNldCh0LHIpe3RoaXMubGVuZ3RoKz1yLmxlbmd0aC10aGlzLm9iamVjdHNbdF0ubGVuZ3RoO3RoaXMub2JqZWN0c1t0XT1yfX0se2tleToiZ2V0Iix2YWx1ZTpmdW5jdGlvbiBnZXQodCl7cmV0dXJuIHRoaXMub2JqZWN0c1t0XX19LHtrZXk6ImNvdW50IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMub2JqZWN0cy5sZW5ndGh9fV0pO3JldHVybiBDRkZJbmRleH0oKTtyLkNGRkluZGV4PW07dmFyIGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBDRkZEaWN0KHQscil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ0ZGRGljdCk7dGhpcy5rZXlUb05hbWVNYXA9dC5rZXlUb05hbWVNYXA7dGhpcy5uYW1lVG9LZXlNYXA9dC5uYW1lVG9LZXlNYXA7dGhpcy5kZWZhdWx0cz10LmRlZmF1bHRzO3RoaXMudHlwZXM9dC50eXBlczt0aGlzLm9wY29kZXM9dC5vcGNvZGVzO3RoaXMub3JkZXI9dC5vcmRlcjt0aGlzLnN0cmluZ3M9cjt0aGlzLnZhbHVlcz1PYmplY3QuY3JlYXRlKG51bGwpfV9jcmVhdGVDbGFzcyhDRkZEaWN0LFt7a2V5OiJzZXRCeUtleSIsdmFsdWU6ZnVuY3Rpb24gc2V0QnlLZXkodCxyKXtpZighKHQgaW4gdGhpcy5rZXlUb05hbWVNYXApKXJldHVybiExO3ZhciBhPXIubGVuZ3RoO2lmKDA9PT1hKXJldHVybiEwO2Zvcih2YXIgbz0wO288YTtvKyspaWYoaXNOYU4ocltvXSkpeygwLGkud2FybikoJ0ludmFsaWQgQ0ZGRGljdCB2YWx1ZTogIicrcisnIiBmb3Iga2V5ICInK3QrJyIuJyk7cmV0dXJuITB9dmFyIGM9dGhpcy50eXBlc1t0XTsibnVtIiE9PWMmJiJzaWQiIT09YyYmIm9mZnNldCIhPT1jfHwocj1yWzBdKTt0aGlzLnZhbHVlc1t0XT1yO3JldHVybiEwfX0se2tleToic2V0QnlOYW1lIix2YWx1ZTpmdW5jdGlvbiBzZXRCeU5hbWUodCxyKXtpZighKHQgaW4gdGhpcy5uYW1lVG9LZXlNYXApKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCdJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiJy5jb25jYXQodCwnIicpKTt0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFt0XV09cn19LHtrZXk6Imhhc05hbWUiLHZhbHVlOmZ1bmN0aW9uIGhhc05hbWUodCl7cmV0dXJuIHRoaXMubmFtZVRvS2V5TWFwW3RdaW4gdGhpcy52YWx1ZXN9fSx7a2V5OiJnZXRCeU5hbWUiLHZhbHVlOmZ1bmN0aW9uIGdldEJ5TmFtZSh0KXtpZighKHQgaW4gdGhpcy5uYW1lVG9LZXlNYXApKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiLmNvbmNhdCh0LCciJykpO3ZhciByPXRoaXMubmFtZVRvS2V5TWFwW3RdO3JldHVybiByIGluIHRoaXMudmFsdWVzP3RoaXMudmFsdWVzW3JdOnRoaXMuZGVmYXVsdHNbcl19fSx7a2V5OiJyZW1vdmVCeU5hbWUiLHZhbHVlOmZ1bmN0aW9uIHJlbW92ZUJ5TmFtZSh0KXtkZWxldGUgdGhpcy52YWx1ZXNbdGhpcy5uYW1lVG9LZXlNYXBbdF1dfX1dLFt7a2V5OiJjcmVhdGVUYWJsZXMiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZVRhYmxlcyh0KXtmb3IodmFyIHI9e2tleVRvTmFtZU1hcDp7fSxuYW1lVG9LZXlNYXA6e30sZGVmYXVsdHM6e30sdHlwZXM6e30sb3Bjb2Rlczp7fSxvcmRlcjpbXX0sYT0wLGk9dC5sZW5ndGg7YTxpOysrYSl7dmFyIG89dFthXSxjPUFycmF5LmlzQXJyYXkob1swXSk/KG9bMF1bMF08PDgpK29bMF1bMV06b1swXTtyLmtleVRvTmFtZU1hcFtjXT1vWzFdO3IubmFtZVRvS2V5TWFwW29bMV1dPWM7ci50eXBlc1tjXT1vWzJdO3IuZGVmYXVsdHNbY109b1szXTtyLm9wY29kZXNbY109QXJyYXkuaXNBcnJheShvWzBdKT9vWzBdOltvWzBdXTtyLm9yZGVyLnB1c2goYyl9cmV0dXJuIHJ9fV0pO3JldHVybiBDRkZEaWN0fSgpLHk9ZnVuY3Rpb24gQ0ZGVG9wRGljdENsb3N1cmUoKXt2YXIgdD1bW1sxMiwzMF0sIlJPUyIsWyJzaWQiLCJzaWQiLCJudW0iXSxudWxsXSxbWzEyLDIwXSwiU3ludGhldGljQmFzZSIsIm51bSIsbnVsbF0sWzAsInZlcnNpb24iLCJzaWQiLG51bGxdLFsxLCJOb3RpY2UiLCJzaWQiLG51bGxdLFtbMTIsMF0sIkNvcHlyaWdodCIsInNpZCIsbnVsbF0sWzIsIkZ1bGxOYW1lIiwic2lkIixudWxsXSxbMywiRmFtaWx5TmFtZSIsInNpZCIsbnVsbF0sWzQsIldlaWdodCIsInNpZCIsbnVsbF0sW1sxMiwxXSwiaXNGaXhlZFBpdGNoIiwibnVtIiwwXSxbWzEyLDJdLCJJdGFsaWNBbmdsZSIsIm51bSIsMF0sW1sxMiwzXSwiVW5kZXJsaW5lUG9zaXRpb24iLCJudW0iLC0xMDBdLFtbMTIsNF0sIlVuZGVybGluZVRoaWNrbmVzcyIsIm51bSIsNTBdLFtbMTIsNV0sIlBhaW50VHlwZSIsIm51bSIsMF0sW1sxMiw2XSwiQ2hhcnN0cmluZ1R5cGUiLCJudW0iLDJdLFtbMTIsN10sIkZvbnRNYXRyaXgiLFsibnVtIiwibnVtIiwibnVtIiwibnVtIiwibnVtIiwibnVtIl0sWy4wMDEsMCwwLC4wMDEsMCwwXV0sWzEzLCJVbmlxdWVJRCIsIm51bSIsbnVsbF0sWzUsIkZvbnRCQm94IixbIm51bSIsIm51bSIsIm51bSIsIm51bSJdLFswLDAsMCwwXV0sW1sxMiw4XSwiU3Ryb2tlV2lkdGgiLCJudW0iLDBdLFsxNCwiWFVJRCIsImFycmF5IixudWxsXSxbMTUsImNoYXJzZXQiLCJvZmZzZXQiLDBdLFsxNiwiRW5jb2RpbmciLCJvZmZzZXQiLDBdLFsxNywiQ2hhclN0cmluZ3MiLCJvZmZzZXQiLDBdLFsxOCwiUHJpdmF0ZSIsWyJvZmZzZXQiLCJvZmZzZXQiXSxudWxsXSxbWzEyLDIxXSwiUG9zdFNjcmlwdCIsInNpZCIsbnVsbF0sW1sxMiwyMl0sIkJhc2VGb250TmFtZSIsInNpZCIsbnVsbF0sW1sxMiwyM10sIkJhc2VGb250QmxlbmQiLCJkZWx0YSIsbnVsbF0sW1sxMiwzMV0sIkNJREZvbnRWZXJzaW9uIiwibnVtIiwwXSxbWzEyLDMyXSwiQ0lERm9udFJldmlzaW9uIiwibnVtIiwwXSxbWzEyLDMzXSwiQ0lERm9udFR5cGUiLCJudW0iLDBdLFtbMTIsMzRdLCJDSURDb3VudCIsIm51bSIsODcyMF0sW1sxMiwzNV0sIlVJREJhc2UiLCJudW0iLG51bGxdLFtbMTIsMzddLCJGRFNlbGVjdCIsIm9mZnNldCIsbnVsbF0sW1sxMiwzNl0sIkZEQXJyYXkiLCJvZmZzZXQiLG51bGxdLFtbMTIsMzhdLCJGb250TmFtZSIsInNpZCIsbnVsbF1dLHI9bnVsbDtyZXR1cm4gZnVuY3Rpb24oYSl7X2luaGVyaXRzKENGRlRvcERpY3QsYSk7dmFyIGk9X2NyZWF0ZVN1cGVyKENGRlRvcERpY3QpO2Z1bmN0aW9uIENGRlRvcERpY3QoYSl7dmFyIG87X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ0ZGVG9wRGljdCk7bnVsbD09PXImJihyPWcuY3JlYXRlVGFibGVzKHQpKTsobz1pLmNhbGwodGhpcyxyLGEpKS5wcml2YXRlRGljdD1udWxsO3JldHVybiBvfXJldHVybiBDRkZUb3BEaWN0fShnKX0oKTtyLkNGRlRvcERpY3Q9eTt2YXIgYj1mdW5jdGlvbiBDRkZQcml2YXRlRGljdENsb3N1cmUoKXt2YXIgdD1bWzYsIkJsdWVWYWx1ZXMiLCJkZWx0YSIsbnVsbF0sWzcsIk90aGVyQmx1ZXMiLCJkZWx0YSIsbnVsbF0sWzgsIkZhbWlseUJsdWVzIiwiZGVsdGEiLG51bGxdLFs5LCJGYW1pbHlPdGhlckJsdWVzIiwiZGVsdGEiLG51bGxdLFtbMTIsOV0sIkJsdWVTY2FsZSIsIm51bSIsLjAzOTYyNV0sW1sxMiwxMF0sIkJsdWVTaGlmdCIsIm51bSIsN10sW1sxMiwxMV0sIkJsdWVGdXp6IiwibnVtIiwxXSxbMTAsIlN0ZEhXIiwibnVtIixudWxsXSxbMTEsIlN0ZFZXIiwibnVtIixudWxsXSxbWzEyLDEyXSwiU3RlbVNuYXBIIiwiZGVsdGEiLG51bGxdLFtbMTIsMTNdLCJTdGVtU25hcFYiLCJkZWx0YSIsbnVsbF0sW1sxMiwxNF0sIkZvcmNlQm9sZCIsIm51bSIsMF0sW1sxMiwxN10sIkxhbmd1YWdlR3JvdXAiLCJudW0iLDBdLFtbMTIsMThdLCJFeHBhbnNpb25GYWN0b3IiLCJudW0iLC4wNl0sW1sxMiwxOV0sImluaXRpYWxSYW5kb21TZWVkIiwibnVtIiwwXSxbMjAsImRlZmF1bHRXaWR0aFgiLCJudW0iLDBdLFsyMSwibm9taW5hbFdpZHRoWCIsIm51bSIsMF0sWzE5LCJTdWJycyIsIm9mZnNldCIsbnVsbF1dLHI9bnVsbDtyZXR1cm4gZnVuY3Rpb24oYSl7X2luaGVyaXRzKENGRlByaXZhdGVEaWN0LGEpO3ZhciBpPV9jcmVhdGVTdXBlcihDRkZQcml2YXRlRGljdCk7ZnVuY3Rpb24gQ0ZGUHJpdmF0ZURpY3QoYSl7dmFyIG87X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ0ZGUHJpdmF0ZURpY3QpO251bGw9PT1yJiYocj1nLmNyZWF0ZVRhYmxlcyh0KSk7KG89aS5jYWxsKHRoaXMscixhKSkuc3VicnNJbmRleD1udWxsO3JldHVybiBvfXJldHVybiBDRkZQcml2YXRlRGljdH0oZyl9KCk7ci5DRkZQcml2YXRlRGljdD1iO3ZhciB2PXtJU09fQURPQkU6MCxFWFBFUlQ6MSxFWFBFUlRfU1VCU0VUOjJ9LFM9ZnVuY3Rpb24gQ0ZGQ2hhcnNldCh0LHIsYSxpKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDRkZDaGFyc2V0KTt0aGlzLnByZWRlZmluZWQ9dDt0aGlzLmZvcm1hdD1yO3RoaXMuY2hhcnNldD1hO3RoaXMucmF3PWl9O3IuQ0ZGQ2hhcnNldD1TO3ZhciBrPWZ1bmN0aW9uIENGRkVuY29kaW5nKHQscixhLGkpe19jbGFzc0NhbGxDaGVjayh0aGlzLENGRkVuY29kaW5nKTt0aGlzLnByZWRlZmluZWQ9dDt0aGlzLmZvcm1hdD1yO3RoaXMuZW5jb2Rpbmc9YTt0aGlzLnJhdz1pfSx3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ0ZGRkRTZWxlY3QodCxyKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDRkZGRFNlbGVjdCk7dGhpcy5mb3JtYXQ9dDt0aGlzLmZkU2VsZWN0PXJ9X2NyZWF0ZUNsYXNzKENGRkZEU2VsZWN0LFt7a2V5OiJnZXRGREluZGV4Iix2YWx1ZTpmdW5jdGlvbiBnZXRGREluZGV4KHQpe3JldHVybiB0PDB8fHQ+PXRoaXMuZmRTZWxlY3QubGVuZ3RoPy0xOnRoaXMuZmRTZWxlY3RbdF19fV0pO3JldHVybiBDRkZGRFNlbGVjdH0oKTtyLkNGRkZEU2VsZWN0PXc7dmFyIEM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBDRkZPZmZzZXRUcmFja2VyKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ0ZGT2Zmc2V0VHJhY2tlcik7dGhpcy5vZmZzZXRzPU9iamVjdC5jcmVhdGUobnVsbCl9X2NyZWF0ZUNsYXNzKENGRk9mZnNldFRyYWNrZXIsW3trZXk6ImlzVHJhY2tpbmciLHZhbHVlOmZ1bmN0aW9uIGlzVHJhY2tpbmcodCl7cmV0dXJuIHQgaW4gdGhpcy5vZmZzZXRzfX0se2tleToidHJhY2siLHZhbHVlOmZ1bmN0aW9uIHRyYWNrKHQscil7aWYodCBpbiB0aGlzLm9mZnNldHMpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkFscmVhZHkgdHJhY2tpbmcgbG9jYXRpb24gb2YgIi5jb25jYXQodCkpO3RoaXMub2Zmc2V0c1t0XT1yfX0se2tleToib2Zmc2V0Iix2YWx1ZTpmdW5jdGlvbiBvZmZzZXQodCl7Zm9yKHZhciByIGluIHRoaXMub2Zmc2V0cyl0aGlzLm9mZnNldHNbcl0rPXR9fSx7a2V5OiJzZXRFbnRyeUxvY2F0aW9uIix2YWx1ZTpmdW5jdGlvbiBzZXRFbnRyeUxvY2F0aW9uKHQscixhKXtpZighKHQgaW4gdGhpcy5vZmZzZXRzKSl0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiTm90IHRyYWNraW5nIGxvY2F0aW9uIG9mICIuY29uY2F0KHQpKTtmb3IodmFyIG89YS5kYXRhLGM9dGhpcy5vZmZzZXRzW3RdLGw9MCx1PXIubGVuZ3RoO2w8dTsrK2wpe3ZhciBoPTUqbCtjLGQ9aCsxLHA9aCsyLG09aCszLGc9aCs0O2lmKDI5IT09b1toXXx8MCE9PW9bZF18fDAhPT1vW3BdfHwwIT09b1ttXXx8MCE9PW9bZ10pdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIndyaXRpbmcgdG8gYW4gb2Zmc2V0IHRoYXQgaXMgbm90IGVtcHR5Iik7dmFyIHk9cltsXTtvW2hdPTI5O29bZF09eT4+MjQmMjU1O29bcF09eT4+MTYmMjU1O29bbV09eT4+OCYyNTU7b1tnXT0yNTUmeX19fV0pO3JldHVybiBDRkZPZmZzZXRUcmFja2VyfSgpLF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBDRkZDb21waWxlcih0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDRkZDb21waWxlcik7dGhpcy5jZmY9dH1fY3JlYXRlQ2xhc3MoQ0ZGQ29tcGlsZXIsW3trZXk6ImNvbXBpbGUiLHZhbHVlOmZ1bmN0aW9uIGNvbXBpbGUoKXt2YXIgdD10aGlzLmNmZixyPXtkYXRhOltdLGxlbmd0aDowLGFkZDpmdW5jdGlvbiBDRkZDb21waWxlcl9hZGQodCl7dGhpcy5kYXRhPXRoaXMuZGF0YS5jb25jYXQodCk7dGhpcy5sZW5ndGg9dGhpcy5kYXRhLmxlbmd0aH19LGE9dGhpcy5jb21waWxlSGVhZGVyKHQuaGVhZGVyKTtyLmFkZChhKTt2YXIgbz10aGlzLmNvbXBpbGVOYW1lSW5kZXgodC5uYW1lcyk7ci5hZGQobyk7aWYodC5pc0NJREZvbnQmJnQudG9wRGljdC5oYXNOYW1lKCJGb250TWF0cml4Iikpe3ZhciBjPXQudG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTt0LnRvcERpY3QucmVtb3ZlQnlOYW1lKCJGb250TWF0cml4Iik7Zm9yKHZhciBsPTAsdT10LmZkQXJyYXkubGVuZ3RoO2w8dTtsKyspe3ZhciBoPXQuZmRBcnJheVtsXSxkPWMuc2xpY2UoMCk7aC5oYXNOYW1lKCJGb250TWF0cml4IikmJihkPWkuVXRpbC50cmFuc2Zvcm0oZCxoLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpKSk7aC5zZXRCeU5hbWUoIkZvbnRNYXRyaXgiLGQpfX10LnRvcERpY3Quc2V0QnlOYW1lKCJjaGFyc2V0IiwwKTt2YXIgcD10aGlzLmNvbXBpbGVUb3BEaWN0cyhbdC50b3BEaWN0XSxyLmxlbmd0aCx0LmlzQ0lERm9udCk7ci5hZGQocC5vdXRwdXQpO3ZhciBtPXAudHJhY2tlcnNbMF0sZz10aGlzLmNvbXBpbGVTdHJpbmdJbmRleCh0LnN0cmluZ3Muc3RyaW5ncyk7ci5hZGQoZyk7dmFyIHk9dGhpcy5jb21waWxlSW5kZXgodC5nbG9iYWxTdWJySW5kZXgpO3IuYWRkKHkpO2lmKHQuZW5jb2RpbmcmJnQudG9wRGljdC5oYXNOYW1lKCJFbmNvZGluZyIpKWlmKHQuZW5jb2RpbmcucHJlZGVmaW5lZCltLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIixbdC5lbmNvZGluZy5mb3JtYXRdLHIpO2Vsc2V7dmFyIGI9dGhpcy5jb21waWxlRW5jb2RpbmcodC5lbmNvZGluZyk7bS5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsW3IubGVuZ3RoXSxyKTtyLmFkZChiKX12YXIgdj10aGlzLmNvbXBpbGVDaGFyc2V0KHQuY2hhcnNldCx0LmNoYXJTdHJpbmdzLmNvdW50LHQuc3RyaW5ncyx0LmlzQ0lERm9udCk7bS5zZXRFbnRyeUxvY2F0aW9uKCJjaGFyc2V0Iixbci5sZW5ndGhdLHIpO3IuYWRkKHYpO3ZhciBTPXRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKHQuY2hhclN0cmluZ3MpO20uc2V0RW50cnlMb2NhdGlvbigiQ2hhclN0cmluZ3MiLFtyLmxlbmd0aF0scik7ci5hZGQoUyk7aWYodC5pc0NJREZvbnQpe20uc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLFtyLmxlbmd0aF0scik7dmFyIGs9dGhpcy5jb21waWxlRkRTZWxlY3QodC5mZFNlbGVjdCk7ci5hZGQoayk7cD10aGlzLmNvbXBpbGVUb3BEaWN0cyh0LmZkQXJyYXksci5sZW5ndGgsITApO20uc2V0RW50cnlMb2NhdGlvbigiRkRBcnJheSIsW3IubGVuZ3RoXSxyKTtyLmFkZChwLm91dHB1dCk7dmFyIHc9cC50cmFja2Vyczt0aGlzLmNvbXBpbGVQcml2YXRlRGljdHModC5mZEFycmF5LHcscil9dGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKFt0LnRvcERpY3RdLFttXSxyKTtyLmFkZChbMF0pO3JldHVybiByLmRhdGF9fSx7a2V5OiJlbmNvZGVOdW1iZXIiLHZhbHVlOmZ1bmN0aW9uIGVuY29kZU51bWJlcih0KXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0KT90aGlzLmVuY29kZUludGVnZXIodCk6dGhpcy5lbmNvZGVGbG9hdCh0KX19LHtrZXk6ImVuY29kZUZsb2F0Iix2YWx1ZTpmdW5jdGlvbiBlbmNvZGVGbG9hdCh0KXt2YXIgcj10LnRvU3RyaW5nKCksYT1DRkZDb21waWxlci5FbmNvZGVGbG9hdFJlZ0V4cC5leGVjKHIpO2lmKGEpe3ZhciBpPXBhcnNlRmxvYXQoIjFlIisoKGFbMl0/K2FbMl06MCkrYVsxXS5sZW5ndGgpKTtyPShNYXRoLnJvdW5kKHQqaSkvaSkudG9TdHJpbmcoKX12YXIgbyxjLGw9IiI7Zm9yKG89MCxjPXIubGVuZ3RoO288YzsrK28pe3ZhciB1PXJbb107bCs9ImUiPT09dT8iLSI9PT1yWysrb10/ImMiOiJiIjoiLiI9PT11PyJhIjoiLSI9PT11PyJlIjp1fXZhciBoPVszMF07Zm9yKG89MCxjPShsKz0xJmwubGVuZ3RoPyJmIjoiZmYiKS5sZW5ndGg7bzxjO28rPTIpaC5wdXNoKHBhcnNlSW50KGwuc3Vic3RyaW5nKG8sbysyKSwxNikpO3JldHVybiBofX0se2tleToiZW5jb2RlSW50ZWdlciIsdmFsdWU6ZnVuY3Rpb24gZW5jb2RlSW50ZWdlcih0KXtyZXR1cm4gdD49LTEwNyYmdDw9MTA3P1t0KzEzOV06dD49MTA4JiZ0PD0xMTMxP1syNDcrKCh0LT0xMDgpPj44KSwyNTUmdF06dD49LTExMzEmJnQ8PS0xMDg/WzI1MSsoKHQ9LXQtMTA4KT4+OCksMjU1JnRdOnQ+PS0zMjc2OCYmdDw9MzI3Njc/WzI4LHQ+PjgmMjU1LDI1NSZ0XTpbMjksdD4+MjQmMjU1LHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdF19fSx7a2V5OiJjb21waWxlSGVhZGVyIix2YWx1ZTpmdW5jdGlvbiBjb21waWxlSGVhZGVyKHQpe3JldHVyblt0Lm1ham9yLHQubWlub3IsdC5oZHJTaXplLHQub2ZmU2l6ZV19fSx7a2V5OiJjb21waWxlTmFtZUluZGV4Iix2YWx1ZTpmdW5jdGlvbiBjb21waWxlTmFtZUluZGV4KHQpe2Zvcih2YXIgcj1uZXcgbSxhPTAsbz10Lmxlbmd0aDthPG87KythKXtmb3IodmFyIGM9dFthXSxsPU1hdGgubWluKGMubGVuZ3RoLDEyNyksdT1uZXcgQXJyYXkobCksaD0wO2g8bDtoKyspe3ZhciBkPWNbaF07KGQ8IiEifHxkPiJ+Inx8IlsiPT09ZHx8Il0iPT09ZHx8IigiPT09ZHx8IikiPT09ZHx8InsiPT09ZHx8In0iPT09ZHx8IjwiPT09ZHx8Ij4iPT09ZHx8Ii8iPT09ZHx8IiUiPT09ZCkmJihkPSJfIik7dVtoXT1kfSIiPT09KHU9dS5qb2luKCIiKSkmJih1PSJCYWRfRm9udF9OYW1lIik7ci5hZGQoKDAsaS5zdHJpbmdUb0J5dGVzKSh1KSl9cmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KHIpfX0se2tleToiY29tcGlsZVRvcERpY3RzIix2YWx1ZTpmdW5jdGlvbiBjb21waWxlVG9wRGljdHModCxyLGEpe2Zvcih2YXIgaT1bXSxvPW5ldyBtLGM9MCxsPXQubGVuZ3RoO2M8bDsrK2Mpe3ZhciB1PXRbY107aWYoYSl7dS5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIik7dS5yZW1vdmVCeU5hbWUoIkNJREZvbnRSZXZpc2lvbiIpO3UucmVtb3ZlQnlOYW1lKCJDSURGb250VHlwZSIpO3UucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpO3UucmVtb3ZlQnlOYW1lKCJVSURCYXNlIil9dmFyIGg9bmV3IEMsZD10aGlzLmNvbXBpbGVEaWN0KHUsaCk7aS5wdXNoKGgpO28uYWRkKGQpO2gub2Zmc2V0KHIpfXJldHVybnt0cmFja2VyczppLG91dHB1dDpvPXRoaXMuY29tcGlsZUluZGV4KG8saSl9fX0se2tleToiY29tcGlsZVByaXZhdGVEaWN0cyIsdmFsdWU6ZnVuY3Rpb24gY29tcGlsZVByaXZhdGVEaWN0cyh0LHIsYSl7Zm9yKHZhciBvPTAsYz10Lmxlbmd0aDtvPGM7KytvKXt2YXIgbD10W29dLHU9bC5wcml2YXRlRGljdDtpZighdXx8IWwuaGFzTmFtZSgiUHJpdmF0ZSIpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJUaGVyZSBtdXN0IGJlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5LiIpO3ZhciBoPW5ldyBDLGQ9dGhpcy5jb21waWxlRGljdCh1LGgpLHA9YS5sZW5ndGg7aC5vZmZzZXQocCk7ZC5sZW5ndGh8fChwPTApO3Jbb10uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsW2QubGVuZ3RoLHBdLGEpO2EuYWRkKGQpO2lmKHUuc3VicnNJbmRleCYmdS5oYXNOYW1lKCJTdWJycyIpKXt2YXIgbT10aGlzLmNvbXBpbGVJbmRleCh1LnN1YnJzSW5kZXgpO2guc2V0RW50cnlMb2NhdGlvbigiU3VicnMiLFtkLmxlbmd0aF0sYSk7YS5hZGQobSl9fX19LHtrZXk6ImNvbXBpbGVEaWN0Iix2YWx1ZTpmdW5jdGlvbiBjb21waWxlRGljdCh0LHIpe2Zvcih2YXIgYT1bXSxvPXQub3JkZXIsYz0wO2M8by5sZW5ndGg7KytjKXt2YXIgbD1vW2NdO2lmKGwgaW4gdC52YWx1ZXMpe3ZhciB1PXQudmFsdWVzW2xdLGg9dC50eXBlc1tsXTtBcnJheS5pc0FycmF5KGgpfHwoaD1baF0pO0FycmF5LmlzQXJyYXkodSl8fCh1PVt1XSk7aWYoMCE9PXUubGVuZ3RoKXtmb3IodmFyIGQ9MCxwPWgubGVuZ3RoO2Q8cDsrK2Qpe3ZhciBtPWhbZF0sZz11W2RdO3N3aXRjaChtKXtjYXNlIm51bSI6Y2FzZSJzaWQiOmE9YS5jb25jYXQodGhpcy5lbmNvZGVOdW1iZXIoZykpO2JyZWFrO2Nhc2Uib2Zmc2V0Ijp2YXIgeT10LmtleVRvTmFtZU1hcFtsXTtyLmlzVHJhY2tpbmcoeSl8fHIudHJhY2soeSxhLmxlbmd0aCk7YT1hLmNvbmNhdChbMjksMCwwLDAsMF0pO2JyZWFrO2Nhc2UiYXJyYXkiOmNhc2UiZGVsdGEiOmE9YS5jb25jYXQodGhpcy5lbmNvZGVOdW1iZXIoZykpO2Zvcih2YXIgYj0xLHY9dS5sZW5ndGg7Yjx2OysrYilhPWEuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHVbYl0pKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJVbmtub3duIGRhdGEgdHlwZSBvZiAiLmNvbmNhdChtKSl9fWE9YS5jb25jYXQodC5vcGNvZGVzW2xdKX19fXJldHVybiBhfX0se2tleToiY29tcGlsZVN0cmluZ0luZGV4Iix2YWx1ZTpmdW5jdGlvbiBjb21waWxlU3RyaW5nSW5kZXgodCl7Zm9yKHZhciByPW5ldyBtLGE9MCxvPXQubGVuZ3RoO2E8bzsrK2Epci5hZGQoKDAsaS5zdHJpbmdUb0J5dGVzKSh0W2FdKSk7cmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KHIpfX0se2tleToiY29tcGlsZUdsb2JhbFN1YnJJbmRleCIsdmFsdWU6ZnVuY3Rpb24gY29tcGlsZUdsb2JhbFN1YnJJbmRleCgpe3ZhciB0PXRoaXMuY2ZmLmdsb2JhbFN1YnJJbmRleDt0aGlzLm91dC53cml0ZUJ5dGVBcnJheSh0aGlzLmNvbXBpbGVJbmRleCh0KSl9fSx7a2V5OiJjb21waWxlQ2hhclN0cmluZ3MiLHZhbHVlOmZ1bmN0aW9uIGNvbXBpbGVDaGFyU3RyaW5ncyh0KXtmb3IodmFyIHI9bmV3IG0sYT0wO2E8dC5jb3VudDthKyspe3ZhciBpPXQuZ2V0KGEpOzAhPT1pLmxlbmd0aD9yLmFkZChpKTpyLmFkZChuZXcgVWludDhBcnJheShbMTM5LDE0XSkpfXJldHVybiB0aGlzLmNvbXBpbGVJbmRleChyKX19LHtrZXk6ImNvbXBpbGVDaGFyc2V0Iix2YWx1ZTpmdW5jdGlvbiBjb21waWxlQ2hhcnNldCh0LHIsYSxvKXt2YXIgYyxsPXItMTtpZihvKWM9bmV3IFVpbnQ4QXJyYXkoWzIsMCwwLGw+PjgmMjU1LDI1NSZsXSk7ZWxzZXsoYz1uZXcgVWludDhBcnJheSgxKzIqbCkpWzBdPTA7Zm9yKHZhciB1PTAsaD10LmNoYXJzZXQubGVuZ3RoLGQ9ITEscD0xO3A8Yy5sZW5ndGg7cCs9Mil7dmFyIG09MDtpZih1PGgpe3ZhciBnPXQuY2hhcnNldFt1KytdO2lmKC0xPT09KG09YS5nZXRTSUQoZykpKXttPTA7aWYoIWQpe2Q9ITA7KDAsaS53YXJuKSgiQ291bGRuJ3QgZmluZCAiLmNvbmNhdChnLCIgaW4gQ0ZGIHN0cmluZ3MiKSl9fX1jW3BdPW0+PjgmMjU1O2NbcCsxXT0yNTUmbX19cmV0dXJuIHRoaXMuY29tcGlsZVR5cGVkQXJyYXkoYyl9fSx7a2V5OiJjb21waWxlRW5jb2RpbmciLHZhbHVlOmZ1bmN0aW9uIGNvbXBpbGVFbmNvZGluZyh0KXtyZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheSh0LnJhdyl9fSx7a2V5OiJjb21waWxlRkRTZWxlY3QiLHZhbHVlOmZ1bmN0aW9uIGNvbXBpbGVGRFNlbGVjdCh0KXt2YXIgcixhLGk9dC5mb3JtYXQ7c3dpdGNoKGkpe2Nhc2UgMDoocj1uZXcgVWludDhBcnJheSgxK3QuZmRTZWxlY3QubGVuZ3RoKSlbMF09aTtmb3IoYT0wO2E8dC5mZFNlbGVjdC5sZW5ndGg7YSsrKXJbYSsxXT10LmZkU2VsZWN0W2FdO2JyZWFrO2Nhc2UgMzp2YXIgbz10LmZkU2VsZWN0WzBdLGM9W2ksMCwwLDAsMCxvXTtmb3IoYT0xO2E8dC5mZFNlbGVjdC5sZW5ndGg7YSsrKXt2YXIgbD10LmZkU2VsZWN0W2FdO2lmKGwhPT1vKXtjLnB1c2goYT4+OCYyNTUsMjU1JmEsbCk7bz1sfX12YXIgdT0oYy5sZW5ndGgtMykvMztjWzFdPXU+PjgmMjU1O2NbMl09MjU1JnU7Yy5wdXNoKGE+PjgmMjU1LDI1NSZhKTtyPW5ldyBVaW50OEFycmF5KGMpfXJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KHIpfX0se2tleToiY29tcGlsZVR5cGVkQXJyYXkiLHZhbHVlOmZ1bmN0aW9uIGNvbXBpbGVUeXBlZEFycmF5KHQpe2Zvcih2YXIgcj1bXSxhPTAsaT10Lmxlbmd0aDthPGk7KythKXJbYV09dFthXTtyZXR1cm4gcn19LHtrZXk6ImNvbXBpbGVJbmRleCIsdmFsdWU6ZnVuY3Rpb24gY29tcGlsZUluZGV4KHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbXSxhPXQub2JqZWN0cyxpPWEubGVuZ3RoO2lmKDA9PT1pKXJldHVyblswLDAsMF07dmFyIG8sYyxsPVtpPj44JjI1NSwyNTUmaV0sdT0xO2ZvcihvPTA7bzxpOysrbyl1Kz1hW29dLmxlbmd0aDtjPXU8MjU2PzE6dTw2NTUzNj8yOnU8MTY3NzcyMTY/Mzo0O2wucHVzaChjKTt2YXIgaD0xO2ZvcihvPTA7bzxpKzE7bysrKXsxPT09Yz9sLnB1c2goMjU1JmgpOjI9PT1jP2wucHVzaChoPj44JjI1NSwyNTUmaCk6Mz09PWM/bC5wdXNoKGg+PjE2JjI1NSxoPj44JjI1NSwyNTUmaCk6bC5wdXNoKGg+Pj4yNCYyNTUsaD4+MTYmMjU1LGg+PjgmMjU1LDI1NSZoKTthW29dJiYoaCs9YVtvXS5sZW5ndGgpfWZvcihvPTA7bzxpO28rKyl7cltvXSYmcltvXS5vZmZzZXQobC5sZW5ndGgpO2Zvcih2YXIgZD0wLHA9YVtvXS5sZW5ndGg7ZDxwO2QrKylsLnB1c2goYVtvXVtkXSl9cmV0dXJuIGx9fV0sW3trZXk6IkVuY29kZUZsb2F0UmVnRXhwIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsIkVuY29kZUZsb2F0UmVnRXhwIiwvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyl9fV0pO3JldHVybiBDRkZDb21waWxlcn0oKTtyLkNGRkNvbXBpbGVyPV99LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuRXhwZXJ0U3Vic2V0Q2hhcnNldD1yLkV4cGVydENoYXJzZXQ9ci5JU09BZG9iZUNoYXJzZXQ9dm9pZCAwO3IuSVNPQWRvYmVDaGFyc2V0PVsiLm5vdGRlZiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3RlcmlnaHQiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsInF1b3RlbGVmdCIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCJleGNsYW1kb3duIiwiY2VudCIsInN0ZXJsaW5nIiwiZnJhY3Rpb24iLCJ5ZW4iLCJmbG9yaW4iLCJzZWN0aW9uIiwiY3VycmVuY3kiLCJxdW90ZXNpbmdsZSIsInF1b3RlZGJsbGVmdCIsImd1aWxsZW1vdGxlZnQiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZW5kYXNoIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJwYXJhZ3JhcGgiLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInF1b3RlZGJscmlnaHQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwicGVydGhvdXNhbmQiLCJxdWVzdGlvbmRvd24iLCJncmF2ZSIsImFjdXRlIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJkaWVyZXNpcyIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iLCJlbWRhc2giLCJBRSIsIm9yZGZlbWluaW5lIiwiTHNsYXNoIiwiT3NsYXNoIiwiT0UiLCJvcmRtYXNjdWxpbmUiLCJhZSIsImRvdGxlc3NpIiwibHNsYXNoIiwib3NsYXNoIiwib2UiLCJnZXJtYW5kYmxzIiwib25lc3VwZXJpb3IiLCJsb2dpY2Fsbm90IiwibXUiLCJ0cmFkZW1hcmsiLCJFdGgiLCJvbmVoYWxmIiwicGx1c21pbnVzIiwiVGhvcm4iLCJvbmVxdWFydGVyIiwiZGl2aWRlIiwiYnJva2VuYmFyIiwiZGVncmVlIiwidGhvcm4iLCJ0aHJlZXF1YXJ0ZXJzIiwidHdvc3VwZXJpb3IiLCJyZWdpc3RlcmVkIiwibWludXMiLCJldGgiLCJtdWx0aXBseSIsInRocmVlc3VwZXJpb3IiLCJjb3B5cmlnaHQiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkFkaWVyZXNpcyIsIkFncmF2ZSIsIkFyaW5nIiwiQXRpbGRlIiwiQ2NlZGlsbGEiLCJFYWN1dGUiLCJFY2lyY3VtZmxleCIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiTnRpbGRlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJPZGllcmVzaXMiLCJPZ3JhdmUiLCJPdGlsZGUiLCJTY2Fyb24iLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVkaWVyZXNpcyIsIlVncmF2ZSIsIllhY3V0ZSIsIllkaWVyZXNpcyIsIlpjYXJvbiIsImFhY3V0ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYWdyYXZlIiwiYXJpbmciLCJhdGlsZGUiLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiZWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJpZ3JhdmUiLCJudGlsZGUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm9ncmF2ZSIsIm90aWxkZSIsInNjYXJvbiIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwidWdyYXZlIiwieWFjdXRlIiwieWRpZXJlc2lzIiwiemNhcm9uIl07ci5FeHBlcnRDaGFyc2V0PVsiLm5vdGRlZiIsInNwYWNlIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwicXVlc3Rpb25zbWFsbCIsImFzdXBlcmlvciIsImJzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsImRzdXBlcmlvciIsImVzdXBlcmlvciIsImlzdXBlcmlvciIsImxzdXBlcmlvciIsIm1zdXBlcmlvciIsIm5zdXBlcmlvciIsIm9zdXBlcmlvciIsInJzdXBlcmlvciIsInNzdXBlcmlvciIsInRzdXBlcmlvciIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwicGFyZW5yaWdodGluZmVyaW9yIiwiQ2lyY3VtZmxleHNtYWxsIiwiaHlwaGVuc3VwZXJpb3IiLCJHcmF2ZXNtYWxsIiwiQXNtYWxsIiwiQnNtYWxsIiwiQ3NtYWxsIiwiRHNtYWxsIiwiRXNtYWxsIiwiRnNtYWxsIiwiR3NtYWxsIiwiSHNtYWxsIiwiSXNtYWxsIiwiSnNtYWxsIiwiS3NtYWxsIiwiTHNtYWxsIiwiTXNtYWxsIiwiTnNtYWxsIiwiT3NtYWxsIiwiUHNtYWxsIiwiUXNtYWxsIiwiUnNtYWxsIiwiU3NtYWxsIiwiVHNtYWxsIiwiVXNtYWxsIiwiVnNtYWxsIiwiV3NtYWxsIiwiWHNtYWxsIiwiWXNtYWxsIiwiWnNtYWxsIiwiY29sb25tb25ldGFyeSIsIm9uZWZpdHRlZCIsInJ1cGlhaCIsIlRpbGRlc21hbGwiLCJleGNsYW1kb3duc21hbGwiLCJjZW50b2xkc3R5bGUiLCJMc2xhc2hzbWFsbCIsIlNjYXJvbnNtYWxsIiwiWmNhcm9uc21hbGwiLCJEaWVyZXNpc3NtYWxsIiwiQnJldmVzbWFsbCIsIkNhcm9uc21hbGwiLCJEb3RhY2NlbnRzbWFsbCIsIk1hY3JvbnNtYWxsIiwiZmlndXJlZGFzaCIsImh5cGhlbmluZmVyaW9yIiwiT2dvbmVrc21hbGwiLCJSaW5nc21hbGwiLCJDZWRpbGxhc21hbGwiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJxdWVzdGlvbmRvd25zbWFsbCIsIm9uZWVpZ2h0aCIsInRocmVlZWlnaHRocyIsImZpdmVlaWdodGhzIiwic2V2ZW5laWdodGhzIiwib25ldGhpcmQiLCJ0d290aGlyZHMiLCJ6ZXJvc3VwZXJpb3IiLCJvbmVzdXBlcmlvciIsInR3b3N1cGVyaW9yIiwidGhyZWVzdXBlcmlvciIsImZvdXJzdXBlcmlvciIsImZpdmVzdXBlcmlvciIsInNpeHN1cGVyaW9yIiwic2V2ZW5zdXBlcmlvciIsImVpZ2h0c3VwZXJpb3IiLCJuaW5lc3VwZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJvbmVpbmZlcmlvciIsInR3b2luZmVyaW9yIiwidGhyZWVpbmZlcmlvciIsImZvdXJpbmZlcmlvciIsImZpdmVpbmZlcmlvciIsInNpeGluZmVyaW9yIiwic2V2ZW5pbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJuaW5laW5mZXJpb3IiLCJjZW50aW5mZXJpb3IiLCJkb2xsYXJpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiY29tbWFpbmZlcmlvciIsIkFncmF2ZXNtYWxsIiwiQWFjdXRlc21hbGwiLCJBY2lyY3VtZmxleHNtYWxsIiwiQXRpbGRlc21hbGwiLCJBZGllcmVzaXNzbWFsbCIsIkFyaW5nc21hbGwiLCJBRXNtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVncmF2ZXNtYWxsIiwiRWFjdXRlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJZ3JhdmVzbWFsbCIsIklhY3V0ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiRXRoc21hbGwiLCJOdGlsZGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2FjdXRlc21hbGwiLCJPY2lyY3VtZmxleHNtYWxsIiwiT3RpbGRlc21hbGwiLCJPZGllcmVzaXNzbWFsbCIsIk9Fc21hbGwiLCJPc2xhc2hzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWFjdXRlc21hbGwiLCJVY2lyY3VtZmxleHNtYWxsIiwiVWRpZXJlc2lzc21hbGwiLCJZYWN1dGVzbWFsbCIsIlRob3Juc21hbGwiLCJZZGllcmVzaXNzbWFsbCJdO3IuRXhwZXJ0U3Vic2V0Q2hhcnNldD1bIi5ub3RkZWYiLCJzcGFjZSIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwiYXN1cGVyaW9yIiwiYnN1cGVyaW9yIiwiY2VudHN1cGVyaW9yIiwiZHN1cGVyaW9yIiwiZXN1cGVyaW9yIiwiaXN1cGVyaW9yIiwibHN1cGVyaW9yIiwibXN1cGVyaW9yIiwibnN1cGVyaW9yIiwib3N1cGVyaW9yIiwicnN1cGVyaW9yIiwic3N1cGVyaW9yIiwidHN1cGVyaW9yIiwiZmYiLCJmaSIsImZsIiwiZmZpIiwiZmZsIiwicGFyZW5sZWZ0aW5mZXJpb3IiLCJwYXJlbnJpZ2h0aW5mZXJpb3IiLCJoeXBoZW5zdXBlcmlvciIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJjZW50b2xkc3R5bGUiLCJmaWd1cmVkYXNoIiwiaHlwaGVuaW5mZXJpb3IiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiXX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5nZXRFbmNvZGluZz1mdW5jdGlvbiBnZXRFbmNvZGluZyh0KXtzd2l0Y2godCl7Y2FzZSJXaW5BbnNpRW5jb2RpbmciOnJldHVybiB1O2Nhc2UiU3RhbmRhcmRFbmNvZGluZyI6cmV0dXJuIGw7Y2FzZSJNYWNSb21hbkVuY29kaW5nIjpyZXR1cm4gYztjYXNlIlN5bWJvbFNldEVuY29kaW5nIjpyZXR1cm4gaDtjYXNlIlphcGZEaW5nYmF0c0VuY29kaW5nIjpyZXR1cm4gZDtjYXNlIkV4cGVydEVuY29kaW5nIjpyZXR1cm4gaTtjYXNlIk1hY0V4cGVydEVuY29kaW5nIjpyZXR1cm4gbztkZWZhdWx0OnJldHVybiBudWxsfX07ci5FeHBlcnRFbmNvZGluZz1yLlphcGZEaW5nYmF0c0VuY29kaW5nPXIuU3ltYm9sU2V0RW5jb2Rpbmc9ci5NYWNSb21hbkVuY29kaW5nPXIuU3RhbmRhcmRFbmNvZGluZz1yLldpbkFuc2lFbmNvZGluZz12b2lkIDA7dmFyIGk9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCIiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsInF1ZXN0aW9uc21hbGwiLCIiLCJhc3VwZXJpb3IiLCJic3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCJkc3VwZXJpb3IiLCJlc3VwZXJpb3IiLCIiLCIiLCIiLCJpc3VwZXJpb3IiLCIiLCIiLCJsc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJvc3VwZXJpb3IiLCIiLCIiLCJyc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCIiLCJmZiIsImZpIiwiZmwiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsIiIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCIiLCIiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiIiwiRG90YWNjZW50c21hbGwiLCIiLCIiLCJNYWNyb25zbWFsbCIsIiIsIiIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIiIsIiIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwiIiwiIiwiIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiIiwiIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiLCJBZ3JhdmVzbWFsbCIsIkFhY3V0ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBcmluZ3NtYWxsIiwiQUVzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWdyYXZlc21hbGwiLCJJYWN1dGVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIkV0aHNtYWxsIiwiTnRpbGRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk90aWxkZXNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiWWFjdXRlc21hbGwiLCJUaG9ybnNtYWxsIiwiWWRpZXJlc2lzc21hbGwiXTtyLkV4cGVydEVuY29kaW5nPWk7dmFyIG89WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCJjZW50b2xkc3R5bGUiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsIiIsInF1ZXN0aW9uc21hbGwiLCIiLCIiLCIiLCIiLCJFdGhzbWFsbCIsIiIsIiIsIm9uZXF1YXJ0ZXIiLCJvbmVoYWxmIiwidGhyZWVxdWFydGVycyIsIm9uZWVpZ2h0aCIsInRocmVlZWlnaHRocyIsImZpdmVlaWdodGhzIiwic2V2ZW5laWdodGhzIiwib25ldGhpcmQiLCJ0d290aGlyZHMiLCIiLCIiLCIiLCIiLCIiLCIiLCJmZiIsImZpIiwiZmwiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsIiIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbmluZmVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiIiwiIiwiYXN1cGVyaW9yIiwiY2VudHN1cGVyaW9yIiwiIiwiIiwiIiwiIiwiQWFjdXRlc21hbGwiLCJBZ3JhdmVzbWFsbCIsIkFjaXJjdW1mbGV4c21hbGwiLCJBZGllcmVzaXNzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQXJpbmdzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFYWN1dGVzbWFsbCIsIkVncmF2ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWFjdXRlc21hbGwiLCJJZ3JhdmVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIk50aWxkZXNtYWxsIiwiT2FjdXRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9jaXJjdW1mbGV4c21hbGwiLCJPZGllcmVzaXNzbWFsbCIsIk90aWxkZXNtYWxsIiwiVWFjdXRlc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVjaXJjdW1mbGV4c21hbGwiLCJVZGllcmVzaXNzbWFsbCIsIiIsImVpZ2h0c3VwZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJ0aHJlZWluZmVyaW9yIiwic2l4aW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwic2V2ZW5pbmZlcmlvciIsIlNjYXJvbnNtYWxsIiwiIiwiY2VudGluZmVyaW9yIiwidHdvaW5mZXJpb3IiLCIiLCJEaWVyZXNpc3NtYWxsIiwiIiwiQ2Fyb25zbWFsbCIsIm9zdXBlcmlvciIsImZpdmVpbmZlcmlvciIsIiIsImNvbW1haW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsIllhY3V0ZXNtYWxsIiwiIiwiZG9sbGFyaW5mZXJpb3IiLCIiLCIiLCJUaG9ybnNtYWxsIiwiIiwibmluZWluZmVyaW9yIiwiemVyb2luZmVyaW9yIiwiWmNhcm9uc21hbGwiLCJBRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJxdWVzdGlvbmRvd25zbWFsbCIsIm9uZWluZmVyaW9yIiwiTHNsYXNoc21hbGwiLCIiLCIiLCIiLCIiLCIiLCIiLCJDZWRpbGxhc21hbGwiLCIiLCIiLCIiLCIiLCIiLCJPRXNtYWxsIiwiZmlndXJlZGFzaCIsImh5cGhlbnN1cGVyaW9yIiwiIiwiIiwiIiwiIiwiZXhjbGFtZG93bnNtYWxsIiwiIiwiWWRpZXJlc2lzc21hbGwiLCIiLCJvbmVzdXBlcmlvciIsInR3b3N1cGVyaW9yIiwidGhyZWVzdXBlcmlvciIsImZvdXJzdXBlcmlvciIsImZpdmVzdXBlcmlvciIsInNpeHN1cGVyaW9yIiwic2V2ZW5zdXBlcmlvciIsIm5pbmVzdXBlcmlvciIsInplcm9zdXBlcmlvciIsIiIsImVzdXBlcmlvciIsInJzdXBlcmlvciIsInRzdXBlcmlvciIsIiIsIiIsImlzdXBlcmlvciIsInNzdXBlcmlvciIsImRzdXBlcmlvciIsIiIsIiIsIiIsIiIsIiIsImxzdXBlcmlvciIsIk9nb25la3NtYWxsIiwiQnJldmVzbWFsbCIsIk1hY3JvbnNtYWxsIiwiYnN1cGVyaW9yIiwibnN1cGVyaW9yIiwibXN1cGVyaW9yIiwiY29tbWFzdXBlcmlvciIsInBlcmlvZHN1cGVyaW9yIiwiRG90YWNjZW50c21hbGwiLCJSaW5nc21hbGwiLCIiLCIiLCIiLCIiXSxjPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVzaW5nbGUiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsImdyYXZlIiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsIiIsIkFkaWVyZXNpcyIsIkFyaW5nIiwiQ2NlZGlsbGEiLCJFYWN1dGUiLCJOdGlsZGUiLCJPZGllcmVzaXMiLCJVZGllcmVzaXMiLCJhYWN1dGUiLCJhZ3JhdmUiLCJhY2lyY3VtZmxleCIsImFkaWVyZXNpcyIsImF0aWxkZSIsImFyaW5nIiwiY2NlZGlsbGEiLCJlYWN1dGUiLCJlZ3JhdmUiLCJlY2lyY3VtZmxleCIsImVkaWVyZXNpcyIsImlhY3V0ZSIsImlncmF2ZSIsImljaXJjdW1mbGV4IiwiaWRpZXJlc2lzIiwibnRpbGRlIiwib2FjdXRlIiwib2dyYXZlIiwib2NpcmN1bWZsZXgiLCJvZGllcmVzaXMiLCJvdGlsZGUiLCJ1YWN1dGUiLCJ1Z3JhdmUiLCJ1Y2lyY3VtZmxleCIsInVkaWVyZXNpcyIsImRhZ2dlciIsImRlZ3JlZSIsImNlbnQiLCJzdGVybGluZyIsInNlY3Rpb24iLCJidWxsZXQiLCJwYXJhZ3JhcGgiLCJnZXJtYW5kYmxzIiwicmVnaXN0ZXJlZCIsImNvcHlyaWdodCIsInRyYWRlbWFyayIsImFjdXRlIiwiZGllcmVzaXMiLCJub3RlcXVhbCIsIkFFIiwiT3NsYXNoIiwiaW5maW5pdHkiLCJwbHVzbWludXMiLCJsZXNzZXF1YWwiLCJncmVhdGVyZXF1YWwiLCJ5ZW4iLCJtdSIsInBhcnRpYWxkaWZmIiwic3VtbWF0aW9uIiwicHJvZHVjdCIsInBpIiwiaW50ZWdyYWwiLCJvcmRmZW1pbmluZSIsIm9yZG1hc2N1bGluZSIsIk9tZWdhIiwiYWUiLCJvc2xhc2giLCJxdWVzdGlvbmRvd24iLCJleGNsYW1kb3duIiwibG9naWNhbG5vdCIsInJhZGljYWwiLCJmbG9yaW4iLCJhcHByb3hlcXVhbCIsIkRlbHRhIiwiZ3VpbGxlbW90bGVmdCIsImd1aWxsZW1vdHJpZ2h0IiwiZWxsaXBzaXMiLCJzcGFjZSIsIkFncmF2ZSIsIkF0aWxkZSIsIk90aWxkZSIsIk9FIiwib2UiLCJlbmRhc2giLCJlbWRhc2giLCJxdW90ZWRibGxlZnQiLCJxdW90ZWRibHJpZ2h0IiwicXVvdGVsZWZ0IiwicXVvdGVyaWdodCIsImRpdmlkZSIsImxvemVuZ2UiLCJ5ZGllcmVzaXMiLCJZZGllcmVzaXMiLCJmcmFjdGlvbiIsImN1cnJlbmN5IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJwZXJ0aG91c2FuZCIsIkFjaXJjdW1mbGV4IiwiRWNpcmN1bWZsZXgiLCJBYWN1dGUiLCJFZGllcmVzaXMiLCJFZ3JhdmUiLCJJYWN1dGUiLCJJY2lyY3VtZmxleCIsIklkaWVyZXNpcyIsIklncmF2ZSIsIk9hY3V0ZSIsIk9jaXJjdW1mbGV4IiwiYXBwbGUiLCJPZ3JhdmUiLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVncmF2ZSIsImRvdGxlc3NpIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJyaW5nIiwiY2VkaWxsYSIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIl07ci5NYWNSb21hbkVuY29kaW5nPWM7dmFyIGw9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXJpZ2h0IiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJxdW90ZWxlZnQiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiZXhjbGFtZG93biIsImNlbnQiLCJzdGVybGluZyIsImZyYWN0aW9uIiwieWVuIiwiZmxvcmluIiwic2VjdGlvbiIsImN1cnJlbmN5IiwicXVvdGVzaW5nbGUiLCJxdW90ZWRibGxlZnQiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsIiIsImVuZGFzaCIsImRhZ2dlciIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwiIiwicGFyYWdyYXBoIiwiYnVsbGV0IiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJxdW90ZWRibHJpZ2h0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsInBlcnRob3VzYW5kIiwiIiwicXVlc3Rpb25kb3duIiwiIiwiZ3JhdmUiLCJhY3V0ZSIsImNpcmN1bWZsZXgiLCJ0aWxkZSIsIm1hY3JvbiIsImJyZXZlIiwiZG90YWNjZW50IiwiZGllcmVzaXMiLCIiLCJyaW5nIiwiY2VkaWxsYSIsIiIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIiwiZW1kYXNoIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiQUUiLCIiLCJvcmRmZW1pbmluZSIsIiIsIiIsIiIsIiIsIkxzbGFzaCIsIk9zbGFzaCIsIk9FIiwib3JkbWFzY3VsaW5lIiwiIiwiIiwiIiwiIiwiIiwiYWUiLCIiLCIiLCIiLCJkb3RsZXNzaSIsIiIsIiIsImxzbGFzaCIsIm9zbGFzaCIsIm9lIiwiZ2VybWFuZGJscyIsIiIsIiIsIiIsIiJdO3IuU3RhbmRhcmRFbmNvZGluZz1sO3ZhciB1PVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVzaW5nbGUiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsImdyYXZlIiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsImJ1bGxldCIsIkV1cm8iLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsImZsb3JpbiIsInF1b3RlZGJsYmFzZSIsImVsbGlwc2lzIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwiY2lyY3VtZmxleCIsInBlcnRob3VzYW5kIiwiU2Nhcm9uIiwiZ3VpbHNpbmdsbGVmdCIsIk9FIiwiYnVsbGV0IiwiWmNhcm9uIiwiYnVsbGV0IiwiYnVsbGV0IiwicXVvdGVsZWZ0IiwicXVvdGVyaWdodCIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJscmlnaHQiLCJidWxsZXQiLCJlbmRhc2giLCJlbWRhc2giLCJ0aWxkZSIsInRyYWRlbWFyayIsInNjYXJvbiIsImd1aWxzaW5nbHJpZ2h0Iiwib2UiLCJidWxsZXQiLCJ6Y2Fyb24iLCJZZGllcmVzaXMiLCJzcGFjZSIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJjdXJyZW5jeSIsInllbiIsImJyb2tlbmJhciIsInNlY3Rpb24iLCJkaWVyZXNpcyIsImNvcHlyaWdodCIsIm9yZGZlbWluaW5lIiwiZ3VpbGxlbW90bGVmdCIsImxvZ2ljYWxub3QiLCJoeXBoZW4iLCJyZWdpc3RlcmVkIiwibWFjcm9uIiwiZGVncmVlIiwicGx1c21pbnVzIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiYWN1dGUiLCJtdSIsInBhcmFncmFwaCIsInBlcmlvZGNlbnRlcmVkIiwiY2VkaWxsYSIsIm9uZXN1cGVyaW9yIiwib3JkbWFzY3VsaW5lIiwiZ3VpbGxlbW90cmlnaHQiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJxdWVzdGlvbmRvd24iLCJBZ3JhdmUiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkF0aWxkZSIsIkFkaWVyZXNpcyIsIkFyaW5nIiwiQUUiLCJDY2VkaWxsYSIsIkVncmF2ZSIsIkVhY3V0ZSIsIkVjaXJjdW1mbGV4IiwiRWRpZXJlc2lzIiwiSWdyYXZlIiwiSWFjdXRlIiwiSWNpcmN1bWZsZXgiLCJJZGllcmVzaXMiLCJFdGgiLCJOdGlsZGUiLCJPZ3JhdmUiLCJPYWN1dGUiLCJPY2lyY3VtZmxleCIsIk90aWxkZSIsIk9kaWVyZXNpcyIsIm11bHRpcGx5IiwiT3NsYXNoIiwiVWdyYXZlIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZGllcmVzaXMiLCJZYWN1dGUiLCJUaG9ybiIsImdlcm1hbmRibHMiLCJhZ3JhdmUiLCJhYWN1dGUiLCJhY2lyY3VtZmxleCIsImF0aWxkZSIsImFkaWVyZXNpcyIsImFyaW5nIiwiYWUiLCJjY2VkaWxsYSIsImVncmF2ZSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiaWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJldGgiLCJudGlsZGUiLCJvZ3JhdmUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm90aWxkZSIsIm9kaWVyZXNpcyIsImRpdmlkZSIsIm9zbGFzaCIsInVncmF2ZSIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwieWFjdXRlIiwidGhvcm4iLCJ5ZGllcmVzaXMiXTtyLldpbkFuc2lFbmNvZGluZz11O3ZhciBoPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJ1bml2ZXJzYWwiLCJudW1iZXJzaWduIiwiZXhpc3RlbnRpYWwiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwic3VjaHRoYXQiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2ttYXRoIiwicGx1cyIsImNvbW1hIiwibWludXMiLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImNvbmdydWVudCIsIkFscGhhIiwiQmV0YSIsIkNoaSIsIkRlbHRhIiwiRXBzaWxvbiIsIlBoaSIsIkdhbW1hIiwiRXRhIiwiSW90YSIsInRoZXRhMSIsIkthcHBhIiwiTGFtYmRhIiwiTXUiLCJOdSIsIk9taWNyb24iLCJQaSIsIlRoZXRhIiwiUmhvIiwiU2lnbWEiLCJUYXUiLCJVcHNpbG9uIiwic2lnbWExIiwiT21lZ2EiLCJYaSIsIlBzaSIsIlpldGEiLCJicmFja2V0bGVmdCIsInRoZXJlZm9yZSIsImJyYWNrZXRyaWdodCIsInBlcnBlbmRpY3VsYXIiLCJ1bmRlcnNjb3JlIiwicmFkaWNhbGV4IiwiYWxwaGEiLCJiZXRhIiwiY2hpIiwiZGVsdGEiLCJlcHNpbG9uIiwicGhpIiwiZ2FtbWEiLCJldGEiLCJpb3RhIiwicGhpMSIsImthcHBhIiwibGFtYmRhIiwibXUiLCJudSIsIm9taWNyb24iLCJwaSIsInRoZXRhIiwicmhvIiwic2lnbWEiLCJ0YXUiLCJ1cHNpbG9uIiwib21lZ2ExIiwib21lZ2EiLCJ4aSIsInBzaSIsInpldGEiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0Iiwic2ltaWxhciIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIkV1cm8iLCJVcHNpbG9uMSIsIm1pbnV0ZSIsImxlc3NlcXVhbCIsImZyYWN0aW9uIiwiaW5maW5pdHkiLCJmbG9yaW4iLCJjbHViIiwiZGlhbW9uZCIsImhlYXJ0Iiwic3BhZGUiLCJhcnJvd2JvdGgiLCJhcnJvd2xlZnQiLCJhcnJvd3VwIiwiYXJyb3dyaWdodCIsImFycm93ZG93biIsImRlZ3JlZSIsInBsdXNtaW51cyIsInNlY29uZCIsImdyZWF0ZXJlcXVhbCIsIm11bHRpcGx5IiwicHJvcG9ydGlvbmFsIiwicGFydGlhbGRpZmYiLCJidWxsZXQiLCJkaXZpZGUiLCJub3RlcXVhbCIsImVxdWl2YWxlbmNlIiwiYXBwcm94ZXF1YWwiLCJlbGxpcHNpcyIsImFycm93dmVydGV4IiwiYXJyb3dob3JpemV4IiwiY2FycmlhZ2VyZXR1cm4iLCJhbGVwaCIsIklmcmFrdHVyIiwiUmZyYWt0dXIiLCJ3ZWllcnN0cmFzcyIsImNpcmNsZW11bHRpcGx5IiwiY2lyY2xlcGx1cyIsImVtcHR5c2V0IiwiaW50ZXJzZWN0aW9uIiwidW5pb24iLCJwcm9wZXJzdXBlcnNldCIsInJlZmxleHN1cGVyc2V0Iiwibm90c3Vic2V0IiwicHJvcGVyc3Vic2V0IiwicmVmbGV4c3Vic2V0IiwiZWxlbWVudCIsIm5vdGVsZW1lbnQiLCJhbmdsZSIsImdyYWRpZW50IiwicmVnaXN0ZXJzZXJpZiIsImNvcHlyaWdodHNlcmlmIiwidHJhZGVtYXJrc2VyaWYiLCJwcm9kdWN0IiwicmFkaWNhbCIsImRvdG1hdGgiLCJsb2dpY2Fsbm90IiwibG9naWNhbGFuZCIsImxvZ2ljYWxvciIsImFycm93ZGJsYm90aCIsImFycm93ZGJsbGVmdCIsImFycm93ZGJsdXAiLCJhcnJvd2RibHJpZ2h0IiwiYXJyb3dkYmxkb3duIiwibG96ZW5nZSIsImFuZ2xlbGVmdCIsInJlZ2lzdGVyc2FucyIsImNvcHlyaWdodHNhbnMiLCJ0cmFkZW1hcmtzYW5zIiwic3VtbWF0aW9uIiwicGFyZW5sZWZ0dHAiLCJwYXJlbmxlZnRleCIsInBhcmVubGVmdGJ0IiwiYnJhY2tldGxlZnR0cCIsImJyYWNrZXRsZWZ0ZXgiLCJicmFja2V0bGVmdGJ0IiwiYnJhY2VsZWZ0dHAiLCJicmFjZWxlZnRtaWQiLCJicmFjZWxlZnRidCIsImJyYWNlZXgiLCIiLCJhbmdsZXJpZ2h0IiwiaW50ZWdyYWwiLCJpbnRlZ3JhbHRwIiwiaW50ZWdyYWxleCIsImludGVncmFsYnQiLCJwYXJlbnJpZ2h0dHAiLCJwYXJlbnJpZ2h0ZXgiLCJwYXJlbnJpZ2h0YnQiLCJicmFja2V0cmlnaHR0cCIsImJyYWNrZXRyaWdodGV4IiwiYnJhY2tldHJpZ2h0YnQiLCJicmFjZXJpZ2h0dHAiLCJicmFjZXJpZ2h0bWlkIiwiYnJhY2VyaWdodGJ0IiwiIl07ci5TeW1ib2xTZXRFbmNvZGluZz1oO3ZhciBkPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJhMSIsImEyIiwiYTIwMiIsImEzIiwiYTQiLCJhNSIsImExMTkiLCJhMTE4IiwiYTExNyIsImExMSIsImExMiIsImExMyIsImExNCIsImExNSIsImExNiIsImExMDUiLCJhMTciLCJhMTgiLCJhMTkiLCJhMjAiLCJhMjEiLCJhMjIiLCJhMjMiLCJhMjQiLCJhMjUiLCJhMjYiLCJhMjciLCJhMjgiLCJhNiIsImE3IiwiYTgiLCJhOSIsImExMCIsImEyOSIsImEzMCIsImEzMSIsImEzMiIsImEzMyIsImEzNCIsImEzNSIsImEzNiIsImEzNyIsImEzOCIsImEzOSIsImE0MCIsImE0MSIsImE0MiIsImE0MyIsImE0NCIsImE0NSIsImE0NiIsImE0NyIsImE0OCIsImE0OSIsImE1MCIsImE1MSIsImE1MiIsImE1MyIsImE1NCIsImE1NSIsImE1NiIsImE1NyIsImE1OCIsImE1OSIsImE2MCIsImE2MSIsImE2MiIsImE2MyIsImE2NCIsImE2NSIsImE2NiIsImE2NyIsImE2OCIsImE2OSIsImE3MCIsImE3MSIsImE3MiIsImE3MyIsImE3NCIsImEyMDMiLCJhNzUiLCJhMjA0IiwiYTc2IiwiYTc3IiwiYTc4IiwiYTc5IiwiYTgxIiwiYTgyIiwiYTgzIiwiYTg0IiwiYTk3IiwiYTk4IiwiYTk5IiwiYTEwMCIsIiIsImE4OSIsImE5MCIsImE5MyIsImE5NCIsImE5MSIsImE5MiIsImEyMDUiLCJhODUiLCJhMjA2IiwiYTg2IiwiYTg3IiwiYTg4IiwiYTk1IiwiYTk2IiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiYTEwMSIsImExMDIiLCJhMTAzIiwiYTEwNCIsImExMDYiLCJhMTA3IiwiYTEwOCIsImExMTIiLCJhMTExIiwiYTExMCIsImExMDkiLCJhMTIwIiwiYTEyMSIsImExMjIiLCJhMTIzIiwiYTEyNCIsImExMjUiLCJhMTI2IiwiYTEyNyIsImExMjgiLCJhMTI5IiwiYTEzMCIsImExMzEiLCJhMTMyIiwiYTEzMyIsImExMzQiLCJhMTM1IiwiYTEzNiIsImExMzciLCJhMTM4IiwiYTEzOSIsImExNDAiLCJhMTQxIiwiYTE0MiIsImExNDMiLCJhMTQ0IiwiYTE0NSIsImExNDYiLCJhMTQ3IiwiYTE0OCIsImExNDkiLCJhMTUwIiwiYTE1MSIsImExNTIiLCJhMTUzIiwiYTE1NCIsImExNTUiLCJhMTU2IiwiYTE1NyIsImExNTgiLCJhMTU5IiwiYTE2MCIsImExNjEiLCJhMTYzIiwiYTE2NCIsImExOTYiLCJhMTY1IiwiYTE5MiIsImExNjYiLCJhMTY3IiwiYTE2OCIsImExNjkiLCJhMTcwIiwiYTE3MSIsImExNzIiLCJhMTczIiwiYTE2MiIsImExNzQiLCJhMTc1IiwiYTE3NiIsImExNzciLCJhMTc4IiwiYTE3OSIsImExOTMiLCJhMTgwIiwiYTE5OSIsImExODEiLCJhMjAwIiwiYTE4MiIsIiIsImEyMDEiLCJhMTgzIiwiYTE4NCIsImExOTciLCJhMTg1IiwiYTE5NCIsImExOTgiLCJhMTg2IiwiYTE5NSIsImExODciLCJhMTg4IiwiYTE4OSIsImExOTAiLCJhMTkxIiwiIl07ci5aYXBmRGluZ2JhdHNFbmNvZGluZz1kfSxmdW5jdGlvbih0LHIsYSl7dmFyIGk9YSgyMDUpLmdldExvb2t1cFRhYmxlRmFjdG9yeSxvPWkoKGZ1bmN0aW9uKHQpe3QuQT02NTt0LkFFPTE5ODt0LkFFYWN1dGU9NTA4O3QuQUVtYWNyb249NDgyO3QuQUVzbWFsbD02MzQ2Mjt0LkFhY3V0ZT0xOTM7dC5BYWN1dGVzbWFsbD02MzQ1Nzt0LkFicmV2ZT0yNTg7dC5BYnJldmVhY3V0ZT03ODU0O3QuQWJyZXZlY3lyaWxsaWM9MTIzMjt0LkFicmV2ZWRvdGJlbG93PTc4NjI7dC5BYnJldmVncmF2ZT03ODU2O3QuQWJyZXZlaG9va2Fib3ZlPTc4NTg7dC5BYnJldmV0aWxkZT03ODYwO3QuQWNhcm9uPTQ2MTt0LkFjaXJjbGU9OTM5ODt0LkFjaXJjdW1mbGV4PTE5NDt0LkFjaXJjdW1mbGV4YWN1dGU9Nzg0NDt0LkFjaXJjdW1mbGV4ZG90YmVsb3c9Nzg1Mjt0LkFjaXJjdW1mbGV4Z3JhdmU9Nzg0Njt0LkFjaXJjdW1mbGV4aG9va2Fib3ZlPTc4NDg7dC5BY2lyY3VtZmxleHNtYWxsPTYzNDU4O3QuQWNpcmN1bWZsZXh0aWxkZT03ODUwO3QuQWN1dGU9NjMxNzc7dC5BY3V0ZXNtYWxsPTYzNDEyO3QuQWN5cmlsbGljPTEwNDA7dC5BZGJsZ3JhdmU9NTEyO3QuQWRpZXJlc2lzPTE5Njt0LkFkaWVyZXNpc2N5cmlsbGljPTEyMzQ7dC5BZGllcmVzaXNtYWNyb249NDc4O3QuQWRpZXJlc2lzc21hbGw9NjM0NjA7dC5BZG90YmVsb3c9Nzg0MDt0LkFkb3RtYWNyb249NDgwO3QuQWdyYXZlPTE5Mjt0LkFncmF2ZXNtYWxsPTYzNDU2O3QuQWhvb2thYm92ZT03ODQyO3QuQWllY3lyaWxsaWM9MTIzNjt0LkFpbnZlcnRlZGJyZXZlPTUxNDt0LkFscGhhPTkxMzt0LkFscGhhdG9ub3M9OTAyO3QuQW1hY3Jvbj0yNTY7dC5BbW9ub3NwYWNlPTY1MzEzO3QuQW9nb25laz0yNjA7dC5BcmluZz0xOTc7dC5BcmluZ2FjdXRlPTUwNjt0LkFyaW5nYmVsb3c9NzY4MDt0LkFyaW5nc21hbGw9NjM0NjE7dC5Bc21hbGw9NjMzMjk7dC5BdGlsZGU9MTk1O3QuQXRpbGRlc21hbGw9NjM0NTk7dC5BeWJhcm1lbmlhbj0xMzI5O3QuQj02Njt0LkJjaXJjbGU9OTM5OTt0LkJkb3RhY2NlbnQ9NzY4Mjt0LkJkb3RiZWxvdz03Njg0O3QuQmVjeXJpbGxpYz0xMDQxO3QuQmVuYXJtZW5pYW49MTMzMDt0LkJldGE9OTE0O3QuQmhvb2s9Mzg1O3QuQmxpbmViZWxvdz03Njg2O3QuQm1vbm9zcGFjZT02NTMxNDt0LkJyZXZlc21hbGw9NjMyMjA7dC5Cc21hbGw9NjMzMzA7dC5CdG9wYmFyPTM4Njt0LkM9Njc7dC5DYWFybWVuaWFuPTEzNDI7dC5DYWN1dGU9MjYyO3QuQ2Fyb249NjMxNzg7dC5DYXJvbnNtYWxsPTYzMjIxO3QuQ2Nhcm9uPTI2ODt0LkNjZWRpbGxhPTE5OTt0LkNjZWRpbGxhYWN1dGU9NzY4ODt0LkNjZWRpbGxhc21hbGw9NjM0NjM7dC5DY2lyY2xlPTk0MDA7dC5DY2lyY3VtZmxleD0yNjQ7dC5DZG90PTI2Njt0LkNkb3RhY2NlbnQ9MjY2O3QuQ2VkaWxsYXNtYWxsPTYzNDE2O3QuQ2hhYXJtZW5pYW49MTM1Mzt0LkNoZWFia2hhc2lhbmN5cmlsbGljPTEyMTI7dC5DaGVjeXJpbGxpYz0xMDYzO3QuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWM9MTIxNDt0LkNoZWRlc2NlbmRlcmN5cmlsbGljPTEyMDY7dC5DaGVkaWVyZXNpc2N5cmlsbGljPTEyNjg7dC5DaGVoYXJtZW5pYW49MTM0Nzt0LkNoZWtoYWthc3NpYW5jeXJpbGxpYz0xMjI3O3QuQ2hldmVydGljYWxzdHJva2VjeXJpbGxpYz0xMjA4O3QuQ2hpPTkzNTt0LkNob29rPTM5MTt0LkNpcmN1bWZsZXhzbWFsbD02MzIyMjt0LkNtb25vc3BhY2U9NjUzMTU7dC5Db2FybWVuaWFuPTEzNjE7dC5Dc21hbGw9NjMzMzE7dC5EPTY4O3QuRFo9NDk3O3QuRFpjYXJvbj00NTI7dC5EYWFybWVuaWFuPTEzMzI7dC5EYWZyaWNhbj0zOTM7dC5EY2Fyb249MjcwO3QuRGNlZGlsbGE9NzY5Njt0LkRjaXJjbGU9OTQwMTt0LkRjaXJjdW1mbGV4YmVsb3c9NzY5ODt0LkRjcm9hdD0yNzI7dC5EZG90YWNjZW50PTc2OTA7dC5EZG90YmVsb3c9NzY5Mjt0LkRlY3lyaWxsaWM9MTA0NDt0LkRlaWNvcHRpYz0xMDA2O3QuRGVsdGE9ODcxMDt0LkRlbHRhZ3JlZWs9OTE2O3QuRGhvb2s9Mzk0O3QuRGllcmVzaXM9NjMxNzk7dC5EaWVyZXNpc0FjdXRlPTYzMTgwO3QuRGllcmVzaXNHcmF2ZT02MzE4MTt0LkRpZXJlc2lzc21hbGw9NjM0MDA7dC5EaWdhbW1hZ3JlZWs9OTg4O3QuRGplY3lyaWxsaWM9MTAyNjt0LkRsaW5lYmVsb3c9NzY5NDt0LkRtb25vc3BhY2U9NjUzMTY7dC5Eb3RhY2NlbnRzbWFsbD02MzIyMzt0LkRzbGFzaD0yNzI7dC5Ec21hbGw9NjMzMzI7dC5EdG9wYmFyPTM5NTt0LkR6PTQ5ODt0LkR6Y2Fyb249NDUzO3QuRHplYWJraGFzaWFuY3lyaWxsaWM9MTI0ODt0LkR6ZWN5cmlsbGljPTEwMjk7dC5EemhlY3lyaWxsaWM9MTAzOTt0LkU9Njk7dC5FYWN1dGU9MjAxO3QuRWFjdXRlc21hbGw9NjM0NjU7dC5FYnJldmU9Mjc2O3QuRWNhcm9uPTI4Mjt0LkVjZWRpbGxhYnJldmU9NzcwODt0LkVjaGFybWVuaWFuPTEzMzM7dC5FY2lyY2xlPTk0MDI7dC5FY2lyY3VtZmxleD0yMDI7dC5FY2lyY3VtZmxleGFjdXRlPTc4NzA7dC5FY2lyY3VtZmxleGJlbG93PTc3MDQ7dC5FY2lyY3VtZmxleGRvdGJlbG93PTc4Nzg7dC5FY2lyY3VtZmxleGdyYXZlPTc4NzI7dC5FY2lyY3VtZmxleGhvb2thYm92ZT03ODc0O3QuRWNpcmN1bWZsZXhzbWFsbD02MzQ2Njt0LkVjaXJjdW1mbGV4dGlsZGU9Nzg3Njt0LkVjeXJpbGxpYz0xMDI4O3QuRWRibGdyYXZlPTUxNjt0LkVkaWVyZXNpcz0yMDM7dC5FZGllcmVzaXNzbWFsbD02MzQ2Nzt0LkVkb3Q9Mjc4O3QuRWRvdGFjY2VudD0yNzg7dC5FZG90YmVsb3c9Nzg2NDt0LkVmY3lyaWxsaWM9MTA2MDt0LkVncmF2ZT0yMDA7dC5FZ3JhdmVzbWFsbD02MzQ2NDt0LkVoYXJtZW5pYW49MTMzNTt0LkVob29rYWJvdmU9Nzg2Njt0LkVpZ2h0cm9tYW49ODU1MTt0LkVpbnZlcnRlZGJyZXZlPTUxODt0LkVpb3RpZmllZGN5cmlsbGljPTExMjQ7dC5FbGN5cmlsbGljPTEwNTE7dC5FbGV2ZW5yb21hbj04NTU0O3QuRW1hY3Jvbj0yNzQ7dC5FbWFjcm9uYWN1dGU9NzcwMjt0LkVtYWNyb25ncmF2ZT03NzAwO3QuRW1jeXJpbGxpYz0xMDUyO3QuRW1vbm9zcGFjZT02NTMxNzt0LkVuY3lyaWxsaWM9MTA1Mzt0LkVuZGVzY2VuZGVyY3lyaWxsaWM9MTE4Njt0LkVuZz0zMzA7dC5FbmdoZWN5cmlsbGljPTExODg7dC5Fbmhvb2tjeXJpbGxpYz0xMjIzO3QuRW9nb25laz0yODA7dC5Fb3Blbj00MDA7dC5FcHNpbG9uPTkxNzt0LkVwc2lsb250b25vcz05MDQ7dC5FcmN5cmlsbGljPTEwNTY7dC5FcmV2ZXJzZWQ9Mzk4O3QuRXJldmVyc2VkY3lyaWxsaWM9MTA2OTt0LkVzY3lyaWxsaWM9MTA1Nzt0LkVzZGVzY2VuZGVyY3lyaWxsaWM9MTE5NDt0LkVzaD00MjU7dC5Fc21hbGw9NjMzMzM7dC5FdGE9OTE5O3QuRXRhcm1lbmlhbj0xMzM2O3QuRXRhdG9ub3M9OTA1O3QuRXRoPTIwODt0LkV0aHNtYWxsPTYzNDcyO3QuRXRpbGRlPTc4Njg7dC5FdGlsZGViZWxvdz03NzA2O3QuRXVybz04MzY0O3QuRXpoPTQzOTt0LkV6aGNhcm9uPTQ5NDt0LkV6aHJldmVyc2VkPTQ0MDt0LkY9NzA7dC5GY2lyY2xlPTk0MDM7dC5GZG90YWNjZW50PTc3MTA7dC5GZWhhcm1lbmlhbj0xMzY2O3QuRmVpY29wdGljPTk5Njt0LkZob29rPTQwMTt0LkZpdGFjeXJpbGxpYz0xMTM4O3QuRml2ZXJvbWFuPTg1NDg7dC5GbW9ub3NwYWNlPTY1MzE4O3QuRm91cnJvbWFuPTg1NDc7dC5Gc21hbGw9NjMzMzQ7dC5HPTcxO3QuR0JzcXVhcmU9MTMxOTE7dC5HYWN1dGU9NTAwO3QuR2FtbWE9OTE1O3QuR2FtbWFhZnJpY2FuPTQwNDt0LkdhbmdpYWNvcHRpYz0xMDAyO3QuR2JyZXZlPTI4Njt0LkdjYXJvbj00ODY7dC5HY2VkaWxsYT0yOTA7dC5HY2lyY2xlPTk0MDQ7dC5HY2lyY3VtZmxleD0yODQ7dC5HY29tbWFhY2NlbnQ9MjkwO3QuR2RvdD0yODg7dC5HZG90YWNjZW50PTI4ODt0LkdlY3lyaWxsaWM9MTA0Mzt0LkdoYWRhcm1lbmlhbj0xMzQ2O3QuR2hlbWlkZGxlaG9va2N5cmlsbGljPTExNzI7dC5HaGVzdHJva2VjeXJpbGxpYz0xMTcwO3QuR2hldXB0dXJuY3lyaWxsaWM9MTE2ODt0Lkdob29rPTQwMzt0LkdpbWFybWVuaWFuPTEzMzE7dC5HamVjeXJpbGxpYz0xMDI3O3QuR21hY3Jvbj03NzEyO3QuR21vbm9zcGFjZT02NTMxOTt0LkdyYXZlPTYzMTgyO3QuR3JhdmVzbWFsbD02MzMyODt0LkdzbWFsbD02MzMzNTt0LkdzbWFsbGhvb2s9NjY3O3QuR3N0cm9rZT00ODQ7dC5IPTcyO3QuSDE4NTMzPTk2Nzk7dC5IMTg1NDM9OTY0Mjt0LkgxODU1MT05NjQzO3QuSDIyMDczPTk2MzM7dC5IUHNxdWFyZT0xMzI1OTt0LkhhYWJraGFzaWFuY3lyaWxsaWM9MTE5Mjt0LkhhZGVzY2VuZGVyY3lyaWxsaWM9MTIwMjt0LkhhcmRzaWduY3lyaWxsaWM9MTA2Njt0LkhiYXI9Mjk0O3QuSGJyZXZlYmVsb3c9NzcyMjt0LkhjZWRpbGxhPTc3MjA7dC5IY2lyY2xlPTk0MDU7dC5IY2lyY3VtZmxleD0yOTI7dC5IZGllcmVzaXM9NzcxODt0Lkhkb3RhY2NlbnQ9NzcxNDt0Lkhkb3RiZWxvdz03NzE2O3QuSG1vbm9zcGFjZT02NTMyMDt0LkhvYXJtZW5pYW49MTM0NDt0Lkhvcmljb3B0aWM9MWUzO3QuSHNtYWxsPTYzMzM2O3QuSHVuZ2FydW1sYXV0PTYzMTgzO3QuSHVuZ2FydW1sYXV0c21hbGw9NjMyMjQ7dC5IenNxdWFyZT0xMzIwMDt0Lkk9NzM7dC5JQWN5cmlsbGljPTEwNzE7dC5JSj0zMDY7dC5JVWN5cmlsbGljPTEwNzA7dC5JYWN1dGU9MjA1O3QuSWFjdXRlc21hbGw9NjM0Njk7dC5JYnJldmU9MzAwO3QuSWNhcm9uPTQ2Mzt0LkljaXJjbGU9OTQwNjt0LkljaXJjdW1mbGV4PTIwNjt0LkljaXJjdW1mbGV4c21hbGw9NjM0NzA7dC5JY3lyaWxsaWM9MTAzMDt0LklkYmxncmF2ZT01MjA7dC5JZGllcmVzaXM9MjA3O3QuSWRpZXJlc2lzYWN1dGU9NzcyNjt0LklkaWVyZXNpc2N5cmlsbGljPTEyNTI7dC5JZGllcmVzaXNzbWFsbD02MzQ3MTt0Lklkb3Q9MzA0O3QuSWRvdGFjY2VudD0zMDQ7dC5JZG90YmVsb3c9Nzg4Mjt0LkllYnJldmVjeXJpbGxpYz0xMjM4O3QuSWVjeXJpbGxpYz0xMDQ1O3QuSWZyYWt0dXI9ODQ2NTt0LklncmF2ZT0yMDQ7dC5JZ3JhdmVzbWFsbD02MzQ2ODt0Lklob29rYWJvdmU9Nzg4MDt0LklpY3lyaWxsaWM9MTA0ODt0LklpbnZlcnRlZGJyZXZlPTUyMjt0Lklpc2hvcnRjeXJpbGxpYz0xMDQ5O3QuSW1hY3Jvbj0yOTg7dC5JbWFjcm9uY3lyaWxsaWM9MTI1MDt0Lkltb25vc3BhY2U9NjUzMjE7dC5Jbmlhcm1lbmlhbj0xMzM5O3QuSW9jeXJpbGxpYz0xMDI1O3QuSW9nb25laz0zMDI7dC5Jb3RhPTkyMTt0LklvdGFhZnJpY2FuPTQwNjt0LklvdGFkaWVyZXNpcz05Mzg7dC5Jb3RhdG9ub3M9OTA2O3QuSXNtYWxsPTYzMzM3O3QuSXN0cm9rZT00MDc7dC5JdGlsZGU9Mjk2O3QuSXRpbGRlYmVsb3c9NzcyNDt0Lkl6aGl0c2FjeXJpbGxpYz0xMTQwO3QuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWM9MTE0Mjt0Lko9NzQ7dC5KYWFybWVuaWFuPTEzNDU7dC5KY2lyY2xlPTk0MDc7dC5KY2lyY3VtZmxleD0zMDg7dC5KZWN5cmlsbGljPTEwMzI7dC5KaGVoYXJtZW5pYW49MTM1NTt0Lkptb25vc3BhY2U9NjUzMjI7dC5Kc21hbGw9NjMzMzg7dC5LPTc1O3QuS0JzcXVhcmU9MTMxODk7dC5LS3NxdWFyZT0xMzI2MTt0LkthYmFzaGtpcmN5cmlsbGljPTExODQ7dC5LYWN1dGU9NzcyODt0LkthY3lyaWxsaWM9MTA1MDt0LkthZGVzY2VuZGVyY3lyaWxsaWM9MTE3ODt0LkthaG9va2N5cmlsbGljPTEyMTk7dC5LYXBwYT05MjI7dC5LYXN0cm9rZWN5cmlsbGljPTExODI7dC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTE4MDt0LktjYXJvbj00ODg7dC5LY2VkaWxsYT0zMTA7dC5LY2lyY2xlPTk0MDg7dC5LY29tbWFhY2NlbnQ9MzEwO3QuS2RvdGJlbG93PTc3MzA7dC5LZWhhcm1lbmlhbj0xMzY0O3QuS2VuYXJtZW5pYW49MTM0Mzt0LktoYWN5cmlsbGljPTEwNjE7dC5LaGVpY29wdGljPTk5ODt0Lktob29rPTQwODt0LktqZWN5cmlsbGljPTEwMzY7dC5LbGluZWJlbG93PTc3MzI7dC5LbW9ub3NwYWNlPTY1MzIzO3QuS29wcGFjeXJpbGxpYz0xMTUyO3QuS29wcGFncmVlaz05OTA7dC5Lc2ljeXJpbGxpYz0xMTM0O3QuS3NtYWxsPTYzMzM5O3QuTD03Njt0LkxKPTQ1NTt0LkxMPTYzMTY3O3QuTGFjdXRlPTMxMzt0LkxhbWJkYT05MjM7dC5MY2Fyb249MzE3O3QuTGNlZGlsbGE9MzE1O3QuTGNpcmNsZT05NDA5O3QuTGNpcmN1bWZsZXhiZWxvdz03NzQwO3QuTGNvbW1hYWNjZW50PTMxNTt0Lkxkb3Q9MzE5O3QuTGRvdGFjY2VudD0zMTk7dC5MZG90YmVsb3c9NzczNDt0Lkxkb3RiZWxvd21hY3Jvbj03NzM2O3QuTGl3bmFybWVuaWFuPTEzNDA7dC5Maj00NTY7dC5MamVjeXJpbGxpYz0xMDMzO3QuTGxpbmViZWxvdz03NzM4O3QuTG1vbm9zcGFjZT02NTMyNDt0LkxzbGFzaD0zMjE7dC5Mc2xhc2hzbWFsbD02MzIyNTt0LkxzbWFsbD02MzM0MDt0Lk09Nzc7dC5NQnNxdWFyZT0xMzE5MDt0Lk1hY3Jvbj02MzE4NDt0Lk1hY3JvbnNtYWxsPTYzNDA3O3QuTWFjdXRlPTc3NDI7dC5NY2lyY2xlPTk0MTA7dC5NZG90YWNjZW50PTc3NDQ7dC5NZG90YmVsb3c9Nzc0Njt0Lk1lbmFybWVuaWFuPTEzNDg7dC5NbW9ub3NwYWNlPTY1MzI1O3QuTXNtYWxsPTYzMzQxO3QuTXR1cm5lZD00MTI7dC5NdT05MjQ7dC5OPTc4O3QuTko9NDU4O3QuTmFjdXRlPTMyMzt0Lk5jYXJvbj0zMjc7dC5OY2VkaWxsYT0zMjU7dC5OY2lyY2xlPTk0MTE7dC5OY2lyY3VtZmxleGJlbG93PTc3NTQ7dC5OY29tbWFhY2NlbnQ9MzI1O3QuTmRvdGFjY2VudD03NzQ4O3QuTmRvdGJlbG93PTc3NTA7dC5OaG9va2xlZnQ9NDEzO3QuTmluZXJvbWFuPTg1NTI7dC5Oaj00NTk7dC5OamVjeXJpbGxpYz0xMDM0O3QuTmxpbmViZWxvdz03NzUyO3QuTm1vbm9zcGFjZT02NTMyNjt0Lk5vd2FybWVuaWFuPTEzNTA7dC5Oc21hbGw9NjMzNDI7dC5OdGlsZGU9MjA5O3QuTnRpbGRlc21hbGw9NjM0NzM7dC5OdT05MjU7dC5PPTc5O3QuT0U9MzM4O3QuT0VzbWFsbD02MzIyNjt0Lk9hY3V0ZT0yMTE7dC5PYWN1dGVzbWFsbD02MzQ3NTt0Lk9iYXJyZWRjeXJpbGxpYz0xMjU2O3QuT2JhcnJlZGRpZXJlc2lzY3lyaWxsaWM9MTI1ODt0Lk9icmV2ZT0zMzQ7dC5PY2Fyb249NDY1O3QuT2NlbnRlcmVkdGlsZGU9NDE1O3QuT2NpcmNsZT05NDEyO3QuT2NpcmN1bWZsZXg9MjEyO3QuT2NpcmN1bWZsZXhhY3V0ZT03ODg4O3QuT2NpcmN1bWZsZXhkb3RiZWxvdz03ODk2O3QuT2NpcmN1bWZsZXhncmF2ZT03ODkwO3QuT2NpcmN1bWZsZXhob29rYWJvdmU9Nzg5Mjt0Lk9jaXJjdW1mbGV4c21hbGw9NjM0NzY7dC5PY2lyY3VtZmxleHRpbGRlPTc4OTQ7dC5PY3lyaWxsaWM9MTA1NDt0Lk9kYmxhY3V0ZT0zMzY7dC5PZGJsZ3JhdmU9NTI0O3QuT2RpZXJlc2lzPTIxNDt0Lk9kaWVyZXNpc2N5cmlsbGljPTEyNTQ7dC5PZGllcmVzaXNzbWFsbD02MzQ3ODt0Lk9kb3RiZWxvdz03ODg0O3QuT2dvbmVrc21hbGw9NjMyMjc7dC5PZ3JhdmU9MjEwO3QuT2dyYXZlc21hbGw9NjM0NzQ7dC5PaGFybWVuaWFuPTEzNjU7dC5PaG09ODQ4Njt0Lk9ob29rYWJvdmU9Nzg4Njt0Lk9ob3JuPTQxNjt0Lk9ob3JuYWN1dGU9Nzg5ODt0Lk9ob3JuZG90YmVsb3c9NzkwNjt0Lk9ob3JuZ3JhdmU9NzkwMDt0Lk9ob3JuaG9va2Fib3ZlPTc5MDI7dC5PaG9ybnRpbGRlPTc5MDQ7dC5PaHVuZ2FydW1sYXV0PTMzNjt0Lk9pPTQxODt0Lk9pbnZlcnRlZGJyZXZlPTUyNjt0Lk9tYWNyb249MzMyO3QuT21hY3JvbmFjdXRlPTc3NjI7dC5PbWFjcm9uZ3JhdmU9Nzc2MDt0Lk9tZWdhPTg0ODY7dC5PbWVnYWN5cmlsbGljPTExMjA7dC5PbWVnYWdyZWVrPTkzNzt0Lk9tZWdhcm91bmRjeXJpbGxpYz0xMTQ2O3QuT21lZ2F0aXRsb2N5cmlsbGljPTExNDg7dC5PbWVnYXRvbm9zPTkxMTt0Lk9taWNyb249OTI3O3QuT21pY3JvbnRvbm9zPTkwODt0Lk9tb25vc3BhY2U9NjUzMjc7dC5PbmVyb21hbj04NTQ0O3QuT29nb25laz00OTA7dC5Pb2dvbmVrbWFjcm9uPTQ5Mjt0Lk9vcGVuPTM5MDt0Lk9zbGFzaD0yMTY7dC5Pc2xhc2hhY3V0ZT01MTA7dC5Pc2xhc2hzbWFsbD02MzQ4MDt0Lk9zbWFsbD02MzM0Mzt0Lk9zdHJva2VhY3V0ZT01MTA7dC5PdGN5cmlsbGljPTExNTA7dC5PdGlsZGU9MjEzO3QuT3RpbGRlYWN1dGU9Nzc1Njt0Lk90aWxkZWRpZXJlc2lzPTc3NTg7dC5PdGlsZGVzbWFsbD02MzQ3Nzt0LlA9ODA7dC5QYWN1dGU9Nzc2NDt0LlBjaXJjbGU9OTQxMzt0LlBkb3RhY2NlbnQ9Nzc2Njt0LlBlY3lyaWxsaWM9MTA1NTt0LlBlaGFybWVuaWFuPTEzNTQ7dC5QZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTkwO3QuUGhpPTkzNDt0LlBob29rPTQyMDt0LlBpPTkyODt0LlBpd3Jhcm1lbmlhbj0xMzYzO3QuUG1vbm9zcGFjZT02NTMyODt0LlBzaT05MzY7dC5Qc2ljeXJpbGxpYz0xMTM2O3QuUHNtYWxsPTYzMzQ0O3QuUT04MTt0LlFjaXJjbGU9OTQxNDt0LlFtb25vc3BhY2U9NjUzMjk7dC5Rc21hbGw9NjMzNDU7dC5SPTgyO3QuUmFhcm1lbmlhbj0xMzU2O3QuUmFjdXRlPTM0MDt0LlJjYXJvbj0zNDQ7dC5SY2VkaWxsYT0zNDI7dC5SY2lyY2xlPTk0MTU7dC5SY29tbWFhY2NlbnQ9MzQyO3QuUmRibGdyYXZlPTUyODt0LlJkb3RhY2NlbnQ9Nzc2ODt0LlJkb3RiZWxvdz03NzcwO3QuUmRvdGJlbG93bWFjcm9uPTc3NzI7dC5SZWhhcm1lbmlhbj0xMzYwO3QuUmZyYWt0dXI9ODQ3Njt0LlJobz05Mjk7dC5SaW5nc21hbGw9NjMyMjg7dC5SaW52ZXJ0ZWRicmV2ZT01MzA7dC5SbGluZWJlbG93PTc3NzQ7dC5SbW9ub3NwYWNlPTY1MzMwO3QuUnNtYWxsPTYzMzQ2O3QuUnNtYWxsaW52ZXJ0ZWQ9NjQxO3QuUnNtYWxsaW52ZXJ0ZWRzdXBlcmlvcj02OTQ7dC5TPTgzO3QuU0YwMTAwMDA9OTQ4NDt0LlNGMDIwMDAwPTk0OTI7dC5TRjAzMDAwMD05NDg4O3QuU0YwNDAwMDA9OTQ5Njt0LlNGMDUwMDAwPTk1MzI7dC5TRjA2MDAwMD05NTE2O3QuU0YwNzAwMDA9OTUyNDt0LlNGMDgwMDAwPTk1MDA7dC5TRjA5MDAwMD05NTA4O3QuU0YxMDAwMDA9OTQ3Mjt0LlNGMTEwMDAwPTk0NzQ7dC5TRjE5MDAwMD05NTY5O3QuU0YyMDAwMDA9OTU3MDt0LlNGMjEwMDAwPTk1NTg7dC5TRjIyMDAwMD05NTU3O3QuU0YyMzAwMDA9OTU3MTt0LlNGMjQwMDAwPTk1NTM7dC5TRjI1MDAwMD05NTU5O3QuU0YyNjAwMDA9OTU2NTt0LlNGMjcwMDAwPTk1NjQ7dC5TRjI4MDAwMD05NTYzO3QuU0YzNjAwMDA9OTU2Njt0LlNGMzcwMDAwPTk1Njc7dC5TRjM4MDAwMD05NTYyO3QuU0YzOTAwMDA9OTU1Njt0LlNGNDAwMDAwPTk1Nzc7dC5TRjQxMDAwMD05NTc0O3QuU0Y0MjAwMDA9OTU2ODt0LlNGNDMwMDAwPTk1NTI7dC5TRjQ0MDAwMD05NTgwO3QuU0Y0NTAwMDA9OTU3NTt0LlNGNDYwMDAwPTk1NzY7dC5TRjQ3MDAwMD05NTcyO3QuU0Y0ODAwMDA9OTU3Mzt0LlNGNDkwMDAwPTk1NjE7dC5TRjUwMDAwMD05NTYwO3QuU0Y1MTAwMDA9OTU1NDt0LlNGNTIwMDAwPTk1NTU7dC5TRjUzMDAwMD05NTc5O3QuU0Y1NDAwMDA9OTU3ODt0LlNhY3V0ZT0zNDY7dC5TYWN1dGVkb3RhY2NlbnQ9Nzc4MDt0LlNhbXBpZ3JlZWs9OTkyO3QuU2Nhcm9uPTM1Mjt0LlNjYXJvbmRvdGFjY2VudD03NzgyO3QuU2Nhcm9uc21hbGw9NjMyMjk7dC5TY2VkaWxsYT0zNTA7dC5TY2h3YT0zOTk7dC5TY2h3YWN5cmlsbGljPTEyNDA7dC5TY2h3YWRpZXJlc2lzY3lyaWxsaWM9MTI0Mjt0LlNjaXJjbGU9OTQxNjt0LlNjaXJjdW1mbGV4PTM0ODt0LlNjb21tYWFjY2VudD01MzY7dC5TZG90YWNjZW50PTc3NzY7dC5TZG90YmVsb3c9Nzc3ODt0LlNkb3RiZWxvd2RvdGFjY2VudD03Nzg0O3QuU2VoYXJtZW5pYW49MTM1Nzt0LlNldmVucm9tYW49ODU1MDt0LlNoYWFybWVuaWFuPTEzNTE7dC5TaGFjeXJpbGxpYz0xMDY0O3QuU2hjaGFjeXJpbGxpYz0xMDY1O3QuU2hlaWNvcHRpYz05OTQ7dC5TaGhhY3lyaWxsaWM9MTIxMDt0LlNoaW1hY29wdGljPTEwMDQ7dC5TaWdtYT05MzE7dC5TaXhyb21hbj04NTQ5O3QuU21vbm9zcGFjZT02NTMzMTt0LlNvZnRzaWduY3lyaWxsaWM9MTA2ODt0LlNzbWFsbD02MzM0Nzt0LlN0aWdtYWdyZWVrPTk4Njt0LlQ9ODQ7dC5UYXU9OTMyO3QuVGJhcj0zNTg7dC5UY2Fyb249MzU2O3QuVGNlZGlsbGE9MzU0O3QuVGNpcmNsZT05NDE3O3QuVGNpcmN1bWZsZXhiZWxvdz03NzkyO3QuVGNvbW1hYWNjZW50PTM1NDt0LlRkb3RhY2NlbnQ9Nzc4Njt0LlRkb3RiZWxvdz03Nzg4O3QuVGVjeXJpbGxpYz0xMDU4O3QuVGVkZXNjZW5kZXJjeXJpbGxpYz0xMTk2O3QuVGVucm9tYW49ODU1Mzt0LlRldHNlY3lyaWxsaWM9MTIwNDt0LlRoZXRhPTkyMDt0LlRob29rPTQyODt0LlRob3JuPTIyMjt0LlRob3Juc21hbGw9NjM0ODY7dC5UaHJlZXJvbWFuPTg1NDY7dC5UaWxkZXNtYWxsPTYzMjMwO3QuVGl3bmFybWVuaWFuPTEzNTk7dC5UbGluZWJlbG93PTc3OTA7dC5UbW9ub3NwYWNlPTY1MzMyO3QuVG9hcm1lbmlhbj0xMzM3O3QuVG9uZWZpdmU9NDQ0O3QuVG9uZXNpeD0zODg7dC5Ub25ldHdvPTQyMzt0LlRyZXRyb2ZsZXhob29rPTQzMDt0LlRzZWN5cmlsbGljPTEwNjI7dC5Uc2hlY3lyaWxsaWM9MTAzNTt0LlRzbWFsbD02MzM0ODt0LlR3ZWx2ZXJvbWFuPTg1NTU7dC5Ud29yb21hbj04NTQ1O3QuVT04NTt0LlVhY3V0ZT0yMTg7dC5VYWN1dGVzbWFsbD02MzQ4Mjt0LlVicmV2ZT0zNjQ7dC5VY2Fyb249NDY3O3QuVWNpcmNsZT05NDE4O3QuVWNpcmN1bWZsZXg9MjE5O3QuVWNpcmN1bWZsZXhiZWxvdz03Nzk4O3QuVWNpcmN1bWZsZXhzbWFsbD02MzQ4Mzt0LlVjeXJpbGxpYz0xMDU5O3QuVWRibGFjdXRlPTM2ODt0LlVkYmxncmF2ZT01MzI7dC5VZGllcmVzaXM9MjIwO3QuVWRpZXJlc2lzYWN1dGU9NDcxO3QuVWRpZXJlc2lzYmVsb3c9Nzc5NDt0LlVkaWVyZXNpc2Nhcm9uPTQ3Mzt0LlVkaWVyZXNpc2N5cmlsbGljPTEyNjQ7dC5VZGllcmVzaXNncmF2ZT00NzU7dC5VZGllcmVzaXNtYWNyb249NDY5O3QuVWRpZXJlc2lzc21hbGw9NjM0ODQ7dC5VZG90YmVsb3c9NzkwODt0LlVncmF2ZT0yMTc7dC5VZ3JhdmVzbWFsbD02MzQ4MTt0LlVob29rYWJvdmU9NzkxMDt0LlVob3JuPTQzMTt0LlVob3JuYWN1dGU9NzkxMjt0LlVob3JuZG90YmVsb3c9NzkyMDt0LlVob3JuZ3JhdmU9NzkxNDt0LlVob3JuaG9va2Fib3ZlPTc5MTY7dC5VaG9ybnRpbGRlPTc5MTg7dC5VaHVuZ2FydW1sYXV0PTM2ODt0LlVodW5nYXJ1bWxhdXRjeXJpbGxpYz0xMjY2O3QuVWludmVydGVkYnJldmU9NTM0O3QuVWtjeXJpbGxpYz0xMTQ0O3QuVW1hY3Jvbj0zNjI7dC5VbWFjcm9uY3lyaWxsaWM9MTI2Mjt0LlVtYWNyb25kaWVyZXNpcz03ODAyO3QuVW1vbm9zcGFjZT02NTMzMzt0LlVvZ29uZWs9MzcwO3QuVXBzaWxvbj05MzM7dC5VcHNpbG9uMT05Nzg7dC5VcHNpbG9uYWN1dGVob29rc3ltYm9sZ3JlZWs9OTc5O3QuVXBzaWxvbmFmcmljYW49NDMzO3QuVXBzaWxvbmRpZXJlc2lzPTkzOTt0LlVwc2lsb25kaWVyZXNpc2hvb2tzeW1ib2xncmVlaz05ODA7dC5VcHNpbG9uaG9va3N5bWJvbD05Nzg7dC5VcHNpbG9udG9ub3M9OTEwO3QuVXJpbmc9MzY2O3QuVXNob3J0Y3lyaWxsaWM9MTAzODt0LlVzbWFsbD02MzM0OTt0LlVzdHJhaWdodGN5cmlsbGljPTExOTg7dC5Vc3RyYWlnaHRzdHJva2VjeXJpbGxpYz0xMjAwO3QuVXRpbGRlPTM2MDt0LlV0aWxkZWFjdXRlPTc4MDA7dC5VdGlsZGViZWxvdz03Nzk2O3QuVj04Njt0LlZjaXJjbGU9OTQxOTt0LlZkb3RiZWxvdz03ODA2O3QuVmVjeXJpbGxpYz0xMDQyO3QuVmV3YXJtZW5pYW49MTM1ODt0LlZob29rPTQzNDt0LlZtb25vc3BhY2U9NjUzMzQ7dC5Wb2FybWVuaWFuPTEzNTI7dC5Wc21hbGw9NjMzNTA7dC5WdGlsZGU9NzgwNDt0Llc9ODc7dC5XYWN1dGU9NzgxMDt0LldjaXJjbGU9OTQyMDt0LldjaXJjdW1mbGV4PTM3Mjt0LldkaWVyZXNpcz03ODEyO3QuV2RvdGFjY2VudD03ODE0O3QuV2RvdGJlbG93PTc4MTY7dC5XZ3JhdmU9NzgwODt0Lldtb25vc3BhY2U9NjUzMzU7dC5Xc21hbGw9NjMzNTE7dC5YPTg4O3QuWGNpcmNsZT05NDIxO3QuWGRpZXJlc2lzPTc4MjA7dC5YZG90YWNjZW50PTc4MTg7dC5YZWhhcm1lbmlhbj0xMzQxO3QuWGk9OTI2O3QuWG1vbm9zcGFjZT02NTMzNjt0LlhzbWFsbD02MzM1Mjt0Llk9ODk7dC5ZYWN1dGU9MjIxO3QuWWFjdXRlc21hbGw9NjM0ODU7dC5ZYXRjeXJpbGxpYz0xMTIyO3QuWWNpcmNsZT05NDIyO3QuWWNpcmN1bWZsZXg9Mzc0O3QuWWRpZXJlc2lzPTM3Njt0LllkaWVyZXNpc3NtYWxsPTYzNDg3O3QuWWRvdGFjY2VudD03ODIyO3QuWWRvdGJlbG93PTc5MjQ7dC5ZZXJpY3lyaWxsaWM9MTA2Nzt0LlllcnVkaWVyZXNpc2N5cmlsbGljPTEyNzI7dC5ZZ3JhdmU9NzkyMjt0Lllob29rPTQzNTt0Lllob29rYWJvdmU9NzkyNjt0LllpYXJtZW5pYW49MTM0OTt0LllpY3lyaWxsaWM9MTAzMTt0Lllpd25hcm1lbmlhbj0xMzYyO3QuWW1vbm9zcGFjZT02NTMzNzt0LllzbWFsbD02MzM1Mzt0Lll0aWxkZT03OTI4O3QuWXVzYmlnY3lyaWxsaWM9MTEzMDt0Lll1c2JpZ2lvdGlmaWVkY3lyaWxsaWM9MTEzMjt0Lll1c2xpdHRsZWN5cmlsbGljPTExMjY7dC5ZdXNsaXR0bGVpb3RpZmllZGN5cmlsbGljPTExMjg7dC5aPTkwO3QuWmFhcm1lbmlhbj0xMzM0O3QuWmFjdXRlPTM3Nzt0LlpjYXJvbj0zODE7dC5aY2Fyb25zbWFsbD02MzIzMTt0LlpjaXJjbGU9OTQyMzt0LlpjaXJjdW1mbGV4PTc4MjQ7dC5aZG90PTM3OTt0Llpkb3RhY2NlbnQ9Mzc5O3QuWmRvdGJlbG93PTc4MjY7dC5aZWN5cmlsbGljPTEwNDc7dC5aZWRlc2NlbmRlcmN5cmlsbGljPTExNzY7dC5aZWRpZXJlc2lzY3lyaWxsaWM9MTI0Njt0LlpldGE9OTE4O3QuWmhlYXJtZW5pYW49MTMzODt0LlpoZWJyZXZlY3lyaWxsaWM9MTIxNzt0LlpoZWN5cmlsbGljPTEwNDY7dC5aaGVkZXNjZW5kZXJjeXJpbGxpYz0xMTc0O3QuWmhlZGllcmVzaXNjeXJpbGxpYz0xMjQ0O3QuWmxpbmViZWxvdz03ODI4O3QuWm1vbm9zcGFjZT02NTMzODt0LlpzbWFsbD02MzM1NDt0LlpzdHJva2U9NDM3O3QuYT05Nzt0LmFhYmVuZ2FsaT0yNDM4O3QuYWFjdXRlPTIyNTt0LmFhZGV2YT0yMzEwO3QuYWFndWphcmF0aT0yNjk0O3QuYWFndXJtdWtoaT0yNTY2O3QuYWFtYXRyYWd1cm11a2hpPTI2MjI7dC5hYXJ1c3F1YXJlPTEzMDU5O3QuYWF2b3dlbHNpZ25iZW5nYWxpPTI0OTQ7dC5hYXZvd2Vsc2lnbmRldmE9MjM2Njt0LmFhdm93ZWxzaWduZ3VqYXJhdGk9Mjc1MDt0LmFiYnJldmlhdGlvbm1hcmthcm1lbmlhbj0xMzc1O3QuYWJicmV2aWF0aW9uc2lnbmRldmE9MjQxNjt0LmFiZW5nYWxpPTI0Mzc7dC5hYm9wb21vZm89MTI1NzA7dC5hYnJldmU9MjU5O3QuYWJyZXZlYWN1dGU9Nzg1NTt0LmFicmV2ZWN5cmlsbGljPTEyMzM7dC5hYnJldmVkb3RiZWxvdz03ODYzO3QuYWJyZXZlZ3JhdmU9Nzg1Nzt0LmFicmV2ZWhvb2thYm92ZT03ODU5O3QuYWJyZXZldGlsZGU9Nzg2MTt0LmFjYXJvbj00NjI7dC5hY2lyY2xlPTk0MjQ7dC5hY2lyY3VtZmxleD0yMjY7dC5hY2lyY3VtZmxleGFjdXRlPTc4NDU7dC5hY2lyY3VtZmxleGRvdGJlbG93PTc4NTM7dC5hY2lyY3VtZmxleGdyYXZlPTc4NDc7dC5hY2lyY3VtZmxleGhvb2thYm92ZT03ODQ5O3QuYWNpcmN1bWZsZXh0aWxkZT03ODUxO3QuYWN1dGU9MTgwO3QuYWN1dGViZWxvd2NtYj03OTE7dC5hY3V0ZWNtYj03Njk7dC5hY3V0ZWNvbWI9NzY5O3QuYWN1dGVkZXZhPTIzODg7dC5hY3V0ZWxvd21vZD03MTk7dC5hY3V0ZXRvbmVjbWI9ODMzO3QuYWN5cmlsbGljPTEwNzI7dC5hZGJsZ3JhdmU9NTEzO3QuYWRkYWtndXJtdWtoaT0yNjczO3QuYWRldmE9MjMwOTt0LmFkaWVyZXNpcz0yMjg7dC5hZGllcmVzaXNjeXJpbGxpYz0xMjM1O3QuYWRpZXJlc2lzbWFjcm9uPTQ3OTt0LmFkb3RiZWxvdz03ODQxO3QuYWRvdG1hY3Jvbj00ODE7dC5hZT0yMzA7dC5hZWFjdXRlPTUwOTt0LmFla29yZWFuPTEyNjI0O3QuYWVtYWNyb249NDgzO3QuYWZpaTAwMjA4PTgyMTM7dC5hZmlpMDg5NDE9ODM1Njt0LmFmaWkxMDAxNz0xMDQwO3QuYWZpaTEwMDE4PTEwNDE7dC5hZmlpMTAwMTk9MTA0Mjt0LmFmaWkxMDAyMD0xMDQzO3QuYWZpaTEwMDIxPTEwNDQ7dC5hZmlpMTAwMjI9MTA0NTt0LmFmaWkxMDAyMz0xMDI1O3QuYWZpaTEwMDI0PTEwNDY7dC5hZmlpMTAwMjU9MTA0Nzt0LmFmaWkxMDAyNj0xMDQ4O3QuYWZpaTEwMDI3PTEwNDk7dC5hZmlpMTAwMjg9MTA1MDt0LmFmaWkxMDAyOT0xMDUxO3QuYWZpaTEwMDMwPTEwNTI7dC5hZmlpMTAwMzE9MTA1Mzt0LmFmaWkxMDAzMj0xMDU0O3QuYWZpaTEwMDMzPTEwNTU7dC5hZmlpMTAwMzQ9MTA1Njt0LmFmaWkxMDAzNT0xMDU3O3QuYWZpaTEwMDM2PTEwNTg7dC5hZmlpMTAwMzc9MTA1OTt0LmFmaWkxMDAzOD0xMDYwO3QuYWZpaTEwMDM5PTEwNjE7dC5hZmlpMTAwNDA9MTA2Mjt0LmFmaWkxMDA0MT0xMDYzO3QuYWZpaTEwMDQyPTEwNjQ7dC5hZmlpMTAwNDM9MTA2NTt0LmFmaWkxMDA0ND0xMDY2O3QuYWZpaTEwMDQ1PTEwNjc7dC5hZmlpMTAwNDY9MTA2ODt0LmFmaWkxMDA0Nz0xMDY5O3QuYWZpaTEwMDQ4PTEwNzA7dC5hZmlpMTAwNDk9MTA3MTt0LmFmaWkxMDA1MD0xMTY4O3QuYWZpaTEwMDUxPTEwMjY7dC5hZmlpMTAwNTI9MTAyNzt0LmFmaWkxMDA1Mz0xMDI4O3QuYWZpaTEwMDU0PTEwMjk7dC5hZmlpMTAwNTU9MTAzMDt0LmFmaWkxMDA1Nj0xMDMxO3QuYWZpaTEwMDU3PTEwMzI7dC5hZmlpMTAwNTg9MTAzMzt0LmFmaWkxMDA1OT0xMDM0O3QuYWZpaTEwMDYwPTEwMzU7dC5hZmlpMTAwNjE9MTAzNjt0LmFmaWkxMDA2Mj0xMDM4O3QuYWZpaTEwMDYzPTYzMTcyO3QuYWZpaTEwMDY0PTYzMTczO3QuYWZpaTEwMDY1PTEwNzI7dC5hZmlpMTAwNjY9MTA3Mzt0LmFmaWkxMDA2Nz0xMDc0O3QuYWZpaTEwMDY4PTEwNzU7dC5hZmlpMTAwNjk9MTA3Njt0LmFmaWkxMDA3MD0xMDc3O3QuYWZpaTEwMDcxPTExMDU7dC5hZmlpMTAwNzI9MTA3ODt0LmFmaWkxMDA3Mz0xMDc5O3QuYWZpaTEwMDc0PTEwODA7dC5hZmlpMTAwNzU9MTA4MTt0LmFmaWkxMDA3Nj0xMDgyO3QuYWZpaTEwMDc3PTEwODM7dC5hZmlpMTAwNzg9MTA4NDt0LmFmaWkxMDA3OT0xMDg1O3QuYWZpaTEwMDgwPTEwODY7dC5hZmlpMTAwODE9MTA4Nzt0LmFmaWkxMDA4Mj0xMDg4O3QuYWZpaTEwMDgzPTEwODk7dC5hZmlpMTAwODQ9MTA5MDt0LmFmaWkxMDA4NT0xMDkxO3QuYWZpaTEwMDg2PTEwOTI7dC5hZmlpMTAwODc9MTA5Mzt0LmFmaWkxMDA4OD0xMDk0O3QuYWZpaTEwMDg5PTEwOTU7dC5hZmlpMTAwOTA9MTA5Njt0LmFmaWkxMDA5MT0xMDk3O3QuYWZpaTEwMDkyPTEwOTg7dC5hZmlpMTAwOTM9MTA5OTt0LmFmaWkxMDA5ND0xMTAwO3QuYWZpaTEwMDk1PTExMDE7dC5hZmlpMTAwOTY9MTEwMjt0LmFmaWkxMDA5Nz0xMTAzO3QuYWZpaTEwMDk4PTExNjk7dC5hZmlpMTAwOTk9MTEwNjt0LmFmaWkxMDEwMD0xMTA3O3QuYWZpaTEwMTAxPTExMDg7dC5hZmlpMTAxMDI9MTEwOTt0LmFmaWkxMDEwMz0xMTEwO3QuYWZpaTEwMTA0PTExMTE7dC5hZmlpMTAxMDU9MTExMjt0LmFmaWkxMDEwNj0xMTEzO3QuYWZpaTEwMTA3PTExMTQ7dC5hZmlpMTAxMDg9MTExNTt0LmFmaWkxMDEwOT0xMTE2O3QuYWZpaTEwMTEwPTExMTg7dC5hZmlpMTAxNDU9MTAzOTt0LmFmaWkxMDE0Nj0xMTIyO3QuYWZpaTEwMTQ3PTExMzg7dC5hZmlpMTAxNDg9MTE0MDt0LmFmaWkxMDE5Mj02MzE3NDt0LmFmaWkxMDE5Mz0xMTE5O3QuYWZpaTEwMTk0PTExMjM7dC5hZmlpMTAxOTU9MTEzOTt0LmFmaWkxMDE5Nj0xMTQxO3QuYWZpaTEwODMxPTYzMTc1O3QuYWZpaTEwODMyPTYzMTc2O3QuYWZpaTEwODQ2PTEyNDE7dC5hZmlpMjk5PTgyMDY7dC5hZmlpMzAwPTgyMDc7dC5hZmlpMzAxPTgyMDU7dC5hZmlpNTczODE9MTY0Mjt0LmFmaWk1NzM4OD0xNTQ4O3QuYWZpaTU3MzkyPTE2MzI7dC5hZmlpNTczOTM9MTYzMzt0LmFmaWk1NzM5ND0xNjM0O3QuYWZpaTU3Mzk1PTE2MzU7dC5hZmlpNTczOTY9MTYzNjt0LmFmaWk1NzM5Nz0xNjM3O3QuYWZpaTU3Mzk4PTE2Mzg7dC5hZmlpNTczOTk9MTYzOTt0LmFmaWk1NzQwMD0xNjQwO3QuYWZpaTU3NDAxPTE2NDE7dC5hZmlpNTc0MDM9MTU2Mzt0LmFmaWk1NzQwNz0xNTY3O3QuYWZpaTU3NDA5PTE1Njk7dC5hZmlpNTc0MTA9MTU3MDt0LmFmaWk1NzQxMT0xNTcxO3QuYWZpaTU3NDEyPTE1NzI7dC5hZmlpNTc0MTM9MTU3Mzt0LmFmaWk1NzQxND0xNTc0O3QuYWZpaTU3NDE1PTE1NzU7dC5hZmlpNTc0MTY9MTU3Njt0LmFmaWk1NzQxNz0xNTc3O3QuYWZpaTU3NDE4PTE1Nzg7dC5hZmlpNTc0MTk9MTU3OTt0LmFmaWk1NzQyMD0xNTgwO3QuYWZpaTU3NDIxPTE1ODE7dC5hZmlpNTc0MjI9MTU4Mjt0LmFmaWk1NzQyMz0xNTgzO3QuYWZpaTU3NDI0PTE1ODQ7dC5hZmlpNTc0MjU9MTU4NTt0LmFmaWk1NzQyNj0xNTg2O3QuYWZpaTU3NDI3PTE1ODc7dC5hZmlpNTc0Mjg9MTU4ODt0LmFmaWk1NzQyOT0xNTg5O3QuYWZpaTU3NDMwPTE1OTA7dC5hZmlpNTc0MzE9MTU5MTt0LmFmaWk1NzQzMj0xNTkyO3QuYWZpaTU3NDMzPTE1OTM7dC5hZmlpNTc0MzQ9MTU5NDt0LmFmaWk1NzQ0MD0xNjAwO3QuYWZpaTU3NDQxPTE2MDE7dC5hZmlpNTc0NDI9MTYwMjt0LmFmaWk1NzQ0Mz0xNjAzO3QuYWZpaTU3NDQ0PTE2MDQ7dC5hZmlpNTc0NDU9MTYwNTt0LmFmaWk1NzQ0Nj0xNjA2O3QuYWZpaTU3NDQ4PTE2MDg7dC5hZmlpNTc0NDk9MTYwOTt0LmFmaWk1NzQ1MD0xNjEwO3QuYWZpaTU3NDUxPTE2MTE7dC5hZmlpNTc0NTI9MTYxMjt0LmFmaWk1NzQ1Mz0xNjEzO3QuYWZpaTU3NDU0PTE2MTQ7dC5hZmlpNTc0NTU9MTYxNTt0LmFmaWk1NzQ1Nj0xNjE2O3QuYWZpaTU3NDU3PTE2MTc7dC5hZmlpNTc0NTg9MTYxODt0LmFmaWk1NzQ3MD0xNjA3O3QuYWZpaTU3NTA1PTE3MDA7dC5hZmlpNTc1MDY9MTY2Mjt0LmFmaWk1NzUwNz0xNjcwO3QuYWZpaTU3NTA4PTE2ODg7dC5hZmlpNTc1MDk9MTcxMTt0LmFmaWk1NzUxMT0xNjU3O3QuYWZpaTU3NTEyPTE2NzI7dC5hZmlpNTc1MTM9MTY4MTt0LmFmaWk1NzUxND0xNzIyO3QuYWZpaTU3NTE5PTE3NDY7dC5hZmlpNTc1MzQ9MTc0OTt0LmFmaWk1NzYzNj04MzYyO3QuYWZpaTU3NjQ1PTE0NzA7dC5hZmlpNTc2NTg9MTQ3NTt0LmFmaWk1NzY2ND0xNDg4O3QuYWZpaTU3NjY1PTE0ODk7dC5hZmlpNTc2NjY9MTQ5MDt0LmFmaWk1NzY2Nz0xNDkxO3QuYWZpaTU3NjY4PTE0OTI7dC5hZmlpNTc2Njk9MTQ5Mzt0LmFmaWk1NzY3MD0xNDk0O3QuYWZpaTU3NjcxPTE0OTU7dC5hZmlpNTc2NzI9MTQ5Njt0LmFmaWk1NzY3Mz0xNDk3O3QuYWZpaTU3Njc0PTE0OTg7dC5hZmlpNTc2NzU9MTQ5OTt0LmFmaWk1NzY3Nj0xNTAwO3QuYWZpaTU3Njc3PTE1MDE7dC5hZmlpNTc2Nzg9MTUwMjt0LmFmaWk1NzY3OT0xNTAzO3QuYWZpaTU3NjgwPTE1MDQ7dC5hZmlpNTc2ODE9MTUwNTt0LmFmaWk1NzY4Mj0xNTA2O3QuYWZpaTU3NjgzPTE1MDc7dC5hZmlpNTc2ODQ9MTUwODt0LmFmaWk1NzY4NT0xNTA5O3QuYWZpaTU3Njg2PTE1MTA7dC5hZmlpNTc2ODc9MTUxMTt0LmFmaWk1NzY4OD0xNTEyO3QuYWZpaTU3Njg5PTE1MTM7dC5hZmlpNTc2OTA9MTUxNDt0LmFmaWk1NzY5ND02NDI5ODt0LmFmaWk1NzY5NT02NDI5OTt0LmFmaWk1NzcwMD02NDMzMTt0LmFmaWk1NzcwNT02NDI4Nzt0LmFmaWk1NzcxNj0xNTIwO3QuYWZpaTU3NzE3PTE1MjE7dC5hZmlpNTc3MTg9MTUyMjt0LmFmaWk1NzcyMz02NDMwOTt0LmFmaWk1Nzc5Mz0xNDYwO3QuYWZpaTU3Nzk0PTE0NjE7dC5hZmlpNTc3OTU9MTQ2Mjt0LmFmaWk1Nzc5Nj0xNDY3O3QuYWZpaTU3Nzk3PTE0NjQ7dC5hZmlpNTc3OTg9MTQ2Mzt0LmFmaWk1Nzc5OT0xNDU2O3QuYWZpaTU3ODAwPTE0NTg7dC5hZmlpNTc4MDE9MTQ1Nzt0LmFmaWk1NzgwMj0xNDU5O3QuYWZpaTU3ODAzPTE0NzQ7dC5hZmlpNTc4MDQ9MTQ3Mzt0LmFmaWk1NzgwNj0xNDY1O3QuYWZpaTU3ODA3PTE0Njg7dC5hZmlpNTc4Mzk9MTQ2OTt0LmFmaWk1Nzg0MT0xNDcxO3QuYWZpaTU3ODQyPTE0NzI7dC5hZmlpNTc5Mjk9NzAwO3QuYWZpaTYxMjQ4PTg0NTM7dC5hZmlpNjEyODk9ODQ2Nzt0LmFmaWk2MTM1Mj04NDcwO3QuYWZpaTYxNTczPTgyMzY7dC5hZmlpNjE1NzQ9ODIzNzt0LmFmaWk2MTU3NT04MjM4O3QuYWZpaTYxNjY0PTgyMDQ7dC5hZmlpNjMxNjc9MTY0NTt0LmFmaWk2NDkzNz03MDE7dC5hZ3JhdmU9MjI0O3QuYWd1amFyYXRpPTI2OTM7dC5hZ3VybXVraGk9MjU2NTt0LmFoaXJhZ2FuYT0xMjM1NDt0LmFob29rYWJvdmU9Nzg0Mzt0LmFpYmVuZ2FsaT0yNDQ4O3QuYWlib3BvbW9mbz0xMjU3NDt0LmFpZGV2YT0yMzIwO3QuYWllY3lyaWxsaWM9MTIzNzt0LmFpZ3VqYXJhdGk9MjcwNDt0LmFpZ3VybXVraGk9MjU3Njt0LmFpbWF0cmFndXJtdWtoaT0yNjMyO3QuYWluYXJhYmljPTE1OTM7dC5haW5maW5hbGFyYWJpYz02NTIyNjt0LmFpbmluaXRpYWxhcmFiaWM9NjUyMjc7dC5haW5tZWRpYWxhcmFiaWM9NjUyMjg7dC5haW52ZXJ0ZWRicmV2ZT01MTU7dC5haXZvd2Vsc2lnbmJlbmdhbGk9MjUwNDt0LmFpdm93ZWxzaWduZGV2YT0yMzc2O3QuYWl2b3dlbHNpZ25ndWphcmF0aT0yNzYwO3QuYWthdGFrYW5hPTEyNDUwO3QuYWthdGFrYW5haGFsZndpZHRoPTY1MzkzO3QuYWtvcmVhbj0xMjYyMzt0LmFsZWY9MTQ4ODt0LmFsZWZhcmFiaWM9MTU3NTt0LmFsZWZkYWdlc2hoZWJyZXc9NjQzMDQ7dC5hbGVmZmluYWxhcmFiaWM9NjUxNjY7dC5hbGVmaGFtemFhYm92ZWFyYWJpYz0xNTcxO3QuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYz02NTE1Njt0LmFsZWZoYW16YWJlbG93YXJhYmljPTE1NzM7dC5hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljPTY1MTYwO3QuYWxlZmhlYnJldz0xNDg4O3QuYWxlZmxhbWVkaGVicmV3PTY0MzM1O3QuYWxlZm1hZGRhYWJvdmVhcmFiaWM9MTU3MDt0LmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWM9NjUxNTQ7dC5hbGVmbWFrc3VyYWFyYWJpYz0xNjA5O3QuYWxlZm1ha3N1cmFmaW5hbGFyYWJpYz02NTI2NDt0LmFsZWZtYWtzdXJhaW5pdGlhbGFyYWJpYz02NTI2Nzt0LmFsZWZtYWtzdXJhbWVkaWFsYXJhYmljPTY1MjY4O3QuYWxlZnBhdGFoaGVicmV3PTY0MzAyO3QuYWxlZnFhbWF0c2hlYnJldz02NDMwMzt0LmFsZXBoPTg1MDE7dC5hbGxlcXVhbD04NzgwO3QuYWxwaGE9OTQ1O3QuYWxwaGF0b25vcz05NDA7dC5hbWFjcm9uPTI1Nzt0LmFtb25vc3BhY2U9NjUzNDU7dC5hbXBlcnNhbmQ9Mzg7dC5hbXBlcnNhbmRtb25vc3BhY2U9NjUyODY7dC5hbXBlcnNhbmRzbWFsbD02MzI3MDt0LmFtc3F1YXJlPTEzMjUwO3QuYW5ib3BvbW9mbz0xMjU3ODt0LmFuZ2JvcG9tb2ZvPTEyNTgwO3QuYW5nYnJhY2tldGxlZnQ9MTIyOTY7dC5hbmdicmFja2V0cmlnaHQ9MTIyOTc7dC5hbmdraGFua2h1dGhhaT0zNjc0O3QuYW5nbGU9ODczNjt0LmFuZ2xlYnJhY2tldGxlZnQ9MTIyOTY7dC5hbmdsZWJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODc7dC5hbmdsZWJyYWNrZXRyaWdodD0xMjI5Nzt0LmFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODg7dC5hbmdsZWxlZnQ9OTAwMTt0LmFuZ2xlcmlnaHQ9OTAwMjt0LmFuZ3N0cm9tPTg0OTE7dC5hbm90ZWxlaWE9OTAzO3QuYW51ZGF0dGFkZXZhPTIzODY7dC5hbnVzdmFyYWJlbmdhbGk9MjQzNDt0LmFudXN2YXJhZGV2YT0yMzA2O3QuYW51c3ZhcmFndWphcmF0aT0yNjkwO3QuYW9nb25laz0yNjE7dC5hcGFhdG9zcXVhcmU9MTMwNTY7dC5hcGFyZW49OTM3Mjt0LmFwb3N0cm9waGVhcm1lbmlhbj0xMzcwO3QuYXBvc3Ryb3BoZW1vZD03MDA7dC5hcHBsZT02Mzc0Mzt0LmFwcHJvYWNoZXM9ODc4NDt0LmFwcHJveGVxdWFsPTg3NzY7dC5hcHByb3hlcXVhbG9yaW1hZ2U9ODc4Njt0LmFwcHJveGltYXRlbHllcXVhbD04NzczO3QuYXJhZWFla29yZWFuPTEyNjg2O3QuYXJhZWFrb3JlYW49MTI2ODU7dC5hcmM9ODk3ODt0LmFyaWdodGhhbGZyaW5nPTc4MzQ7dC5hcmluZz0yMjk7dC5hcmluZ2FjdXRlPTUwNzt0LmFyaW5nYmVsb3c9NzY4MTt0LmFycm93Ym90aD04NTk2O3QuYXJyb3dkYXNoZG93bj04Njc1O3QuYXJyb3dkYXNobGVmdD04NjcyO3QuYXJyb3dkYXNocmlnaHQ9ODY3NDt0LmFycm93ZGFzaHVwPTg2NzM7dC5hcnJvd2RibGJvdGg9ODY2MDt0LmFycm93ZGJsZG93bj04NjU5O3QuYXJyb3dkYmxsZWZ0PTg2NTY7dC5hcnJvd2RibHJpZ2h0PTg2NTg7dC5hcnJvd2RibHVwPTg2NTc7dC5hcnJvd2Rvd249ODU5NTt0LmFycm93ZG93bmxlZnQ9ODYwMTt0LmFycm93ZG93bnJpZ2h0PTg2MDA7dC5hcnJvd2Rvd253aGl0ZT04NjgxO3QuYXJyb3doZWFkZG93bm1vZD03MDk7dC5hcnJvd2hlYWRsZWZ0bW9kPTcwNjt0LmFycm93aGVhZHJpZ2h0bW9kPTcwNzt0LmFycm93aGVhZHVwbW9kPTcwODt0LmFycm93aG9yaXpleD02MzcxOTt0LmFycm93bGVmdD04NTkyO3QuYXJyb3dsZWZ0ZGJsPTg2NTY7dC5hcnJvd2xlZnRkYmxzdHJva2U9ODY1Mzt0LmFycm93bGVmdG92ZXJyaWdodD04NjQ2O3QuYXJyb3dsZWZ0d2hpdGU9ODY3ODt0LmFycm93cmlnaHQ9ODU5NDt0LmFycm93cmlnaHRkYmxzdHJva2U9ODY1NTt0LmFycm93cmlnaHRoZWF2eT0xMDE0Mjt0LmFycm93cmlnaHRvdmVybGVmdD04NjQ0O3QuYXJyb3dyaWdodHdoaXRlPTg2ODA7dC5hcnJvd3RhYmxlZnQ9ODY3Njt0LmFycm93dGFicmlnaHQ9ODY3Nzt0LmFycm93dXA9ODU5Mzt0LmFycm93dXBkbj04NTk3O3QuYXJyb3d1cGRuYnNlPTg2MTY7dC5hcnJvd3VwZG93bmJhc2U9ODYxNjt0LmFycm93dXBsZWZ0PTg1OTg7dC5hcnJvd3VwbGVmdG9mZG93bj04NjQ1O3QuYXJyb3d1cHJpZ2h0PTg1OTk7dC5hcnJvd3Vwd2hpdGU9ODY3OTt0LmFycm93dmVydGV4PTYzNzE4O3QuYXNjaWljaXJjdW09OTQ7dC5hc2NpaWNpcmN1bW1vbm9zcGFjZT02NTM0Mjt0LmFzY2lpdGlsZGU9MTI2O3QuYXNjaWl0aWxkZW1vbm9zcGFjZT02NTM3NDt0LmFzY3JpcHQ9NTkzO3QuYXNjcmlwdHR1cm5lZD01OTQ7dC5hc21hbGxoaXJhZ2FuYT0xMjM1Mzt0LmFzbWFsbGthdGFrYW5hPTEyNDQ5O3QuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODM7dC5hc3Rlcmlzaz00Mjt0LmFzdGVyaXNrYWx0b25lYXJhYmljPTE2NDU7dC5hc3Rlcmlza2FyYWJpYz0xNjQ1O3QuYXN0ZXJpc2ttYXRoPTg3Mjc7dC5hc3Rlcmlza21vbm9zcGFjZT02NTI5MDt0LmFzdGVyaXNrc21hbGw9NjUxMjE7dC5hc3RlcmlzbT04MjU4O3QuYXN1cGVyaW9yPTYzMjA5O3QuYXN5bXB0b3RpY2FsbHllcXVhbD04NzcxO3QuYXQ9NjQ7dC5hdGlsZGU9MjI3O3QuYXRtb25vc3BhY2U9NjUzMTI7dC5hdHNtYWxsPTY1MTMxO3QuYXR1cm5lZD01OTI7dC5hdWJlbmdhbGk9MjQ1Mjt0LmF1Ym9wb21vZm89MTI1NzY7dC5hdWRldmE9MjMyNDt0LmF1Z3VqYXJhdGk9MjcwODt0LmF1Z3VybXVraGk9MjU4MDt0LmF1bGVuZ3RobWFya2JlbmdhbGk9MjUxOTt0LmF1bWF0cmFndXJtdWtoaT0yNjM2O3QuYXV2b3dlbHNpZ25iZW5nYWxpPTI1MDg7dC5hdXZvd2Vsc2lnbmRldmE9MjM4MDt0LmF1dm93ZWxzaWduZ3VqYXJhdGk9Mjc2NDt0LmF2YWdyYWhhZGV2YT0yMzY1O3QuYXliYXJtZW5pYW49MTM3Nzt0LmF5aW49MTUwNjt0LmF5aW5hbHRvbmVoZWJyZXc9NjQyODg7dC5heWluaGVicmV3PTE1MDY7dC5iPTk4O3QuYmFiZW5nYWxpPTI0NzY7dC5iYWNrc2xhc2g9OTI7dC5iYWNrc2xhc2htb25vc3BhY2U9NjUzNDA7dC5iYWRldmE9MjM0ODt0LmJhZ3VqYXJhdGk9MjczMjt0LmJhZ3VybXVraGk9MjYwNDt0LmJhaGlyYWdhbmE9MTI0MDA7dC5iYWh0dGhhaT0zNjQ3O3QuYmFrYXRha2FuYT0xMjQ5Njt0LmJhcj0xMjQ7dC5iYXJtb25vc3BhY2U9NjUzNzI7dC5iYm9wb21vZm89MTI1NDk7dC5iY2lyY2xlPTk0MjU7dC5iZG90YWNjZW50PTc2ODM7dC5iZG90YmVsb3c9NzY4NTt0LmJlYW1lZHNpeHRlZW50aG5vdGVzPTk4MzY7dC5iZWNhdXNlPTg3NTc7dC5iZWN5cmlsbGljPTEwNzM7dC5iZWhhcmFiaWM9MTU3Njt0LmJlaGZpbmFsYXJhYmljPTY1MTY4O3QuYmVoaW5pdGlhbGFyYWJpYz02NTE2OTt0LmJlaGlyYWdhbmE9MTI0MDk7dC5iZWhtZWRpYWxhcmFiaWM9NjUxNzA7dC5iZWhtZWVtaW5pdGlhbGFyYWJpYz02NDY3MTt0LmJlaG1lZW1pc29sYXRlZGFyYWJpYz02NDUyMDt0LmJlaG5vb25maW5hbGFyYWJpYz02NDYyMTt0LmJla2F0YWthbmE9MTI1MDU7dC5iZW5hcm1lbmlhbj0xMzc4O3QuYmV0PTE0ODk7dC5iZXRhPTk0Njt0LmJldGFzeW1ib2xncmVlaz05NzY7dC5iZXRkYWdlc2g9NjQzMDU7dC5iZXRkYWdlc2hoZWJyZXc9NjQzMDU7dC5iZXRoZWJyZXc9MTQ4OTt0LmJldHJhZmVoZWJyZXc9NjQzMzI7dC5iaGFiZW5nYWxpPTI0Nzc7dC5iaGFkZXZhPTIzNDk7dC5iaGFndWphcmF0aT0yNzMzO3QuYmhhZ3VybXVraGk9MjYwNTt0LmJob29rPTU5NTt0LmJpaGlyYWdhbmE9MTI0MDM7dC5iaWthdGFrYW5hPTEyNDk5O3QuYmlsYWJpYWxjbGljaz02NjQ7dC5iaW5kaWd1cm11a2hpPTI1NjI7dC5iaXJ1c3F1YXJlPTEzMTA1O3QuYmxhY2tjaXJjbGU9OTY3OTt0LmJsYWNrZGlhbW9uZD05NjcwO3QuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZT05NjYwO3QuYmxhY2tsZWZ0cG9pbnRpbmdwb2ludGVyPTk2Njg7dC5ibGFja2xlZnRwb2ludGluZ3RyaWFuZ2xlPTk2NjQ7dC5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdD0xMjMwNDt0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODM7dC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQ9MTIzMDU7dC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA4NDt0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGU9OTY5OTt0LmJsYWNrbG93ZXJyaWdodHRyaWFuZ2xlPTk2OTg7dC5ibGFja3JlY3RhbmdsZT05NjQ0O3QuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlcj05NjU4O3QuYmxhY2tyaWdodHBvaW50aW5ndHJpYW5nbGU9OTY1NDt0LmJsYWNrc21hbGxzcXVhcmU9OTY0Mjt0LmJsYWNrc21pbGluZ2ZhY2U9OTc4Nzt0LmJsYWNrc3F1YXJlPTk2MzI7dC5ibGFja3N0YXI9OTczMzt0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGU9OTcwMDt0LmJsYWNrdXBwZXJyaWdodHRyaWFuZ2xlPTk3MDE7dC5ibGFja3VwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2NTI7dC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZT05NjUwO3QuYmxhbms9OTI1MTt0LmJsaW5lYmVsb3c9NzY4Nzt0LmJsb2NrPTk2MDg7dC5ibW9ub3NwYWNlPTY1MzQ2O3QuYm9iYWltYWl0aGFpPTM2MTA7dC5ib2hpcmFnYW5hPTEyNDEyO3QuYm9rYXRha2FuYT0xMjUwODt0LmJwYXJlbj05MzczO3QuYnFzcXVhcmU9MTMyNTE7dC5icmFjZWV4PTYzNzMyO3QuYnJhY2VsZWZ0PTEyMzt0LmJyYWNlbGVmdGJ0PTYzNzMxO3QuYnJhY2VsZWZ0bWlkPTYzNzMwO3QuYnJhY2VsZWZ0bW9ub3NwYWNlPTY1MzcxO3QuYnJhY2VsZWZ0c21hbGw9NjUxMTU7dC5icmFjZWxlZnR0cD02MzcyOTt0LmJyYWNlbGVmdHZlcnRpY2FsPTY1MDc5O3QuYnJhY2VyaWdodD0xMjU7dC5icmFjZXJpZ2h0YnQ9NjM3NDI7dC5icmFjZXJpZ2h0bWlkPTYzNzQxO3QuYnJhY2VyaWdodG1vbm9zcGFjZT02NTM3Mzt0LmJyYWNlcmlnaHRzbWFsbD02NTExNjt0LmJyYWNlcmlnaHR0cD02Mzc0MDt0LmJyYWNlcmlnaHR2ZXJ0aWNhbD02NTA4MDt0LmJyYWNrZXRsZWZ0PTkxO3QuYnJhY2tldGxlZnRidD02MzcyODt0LmJyYWNrZXRsZWZ0ZXg9NjM3Mjc7dC5icmFja2V0bGVmdG1vbm9zcGFjZT02NTMzOTt0LmJyYWNrZXRsZWZ0dHA9NjM3MjY7dC5icmFja2V0cmlnaHQ9OTM7dC5icmFja2V0cmlnaHRidD02MzczOTt0LmJyYWNrZXRyaWdodGV4PTYzNzM4O3QuYnJhY2tldHJpZ2h0bW9ub3NwYWNlPTY1MzQxO3QuYnJhY2tldHJpZ2h0dHA9NjM3Mzc7dC5icmV2ZT03Mjg7dC5icmV2ZWJlbG93Y21iPTgxNDt0LmJyZXZlY21iPTc3NDt0LmJyZXZlaW52ZXJ0ZWRiZWxvd2NtYj04MTU7dC5icmV2ZWludmVydGVkY21iPTc4NTt0LmJyZXZlaW52ZXJ0ZWRkb3VibGVjbWI9ODY1O3QuYnJpZGdlYmVsb3djbWI9ODEwO3QuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYj04MjY7dC5icm9rZW5iYXI9MTY2O3QuYnN0cm9rZT0zODQ7dC5ic3VwZXJpb3I9NjMyMTA7dC5idG9wYmFyPTM4Nzt0LmJ1aGlyYWdhbmE9MTI0MDY7dC5idWthdGFrYW5hPTEyNTAyO3QuYnVsbGV0PTgyMjY7dC5idWxsZXRpbnZlcnNlPTk2ODg7dC5idWxsZXRvcGVyYXRvcj04NzI5O3QuYnVsbHNleWU9OTY3ODt0LmM9OTk7dC5jYWFybWVuaWFuPTEzOTA7dC5jYWJlbmdhbGk9MjQ1ODt0LmNhY3V0ZT0yNjM7dC5jYWRldmE9MjMzMDt0LmNhZ3VqYXJhdGk9MjcxNDt0LmNhZ3VybXVraGk9MjU4Njt0LmNhbHNxdWFyZT0xMzE5Mjt0LmNhbmRyYWJpbmR1YmVuZ2FsaT0yNDMzO3QuY2FuZHJhYmluZHVjbWI9Nzg0O3QuY2FuZHJhYmluZHVkZXZhPTIzMDU7dC5jYW5kcmFiaW5kdWd1amFyYXRpPTI2ODk7dC5jYXBzbG9jaz04NjgyO3QuY2FyZW9mPTg0NTM7dC5jYXJvbj03MTE7dC5jYXJvbmJlbG93Y21iPTgxMjt0LmNhcm9uY21iPTc4MDt0LmNhcnJpYWdlcmV0dXJuPTg2Mjk7dC5jYm9wb21vZm89MTI1Njg7dC5jY2Fyb249MjY5O3QuY2NlZGlsbGE9MjMxO3QuY2NlZGlsbGFhY3V0ZT03Njg5O3QuY2NpcmNsZT05NDI2O3QuY2NpcmN1bWZsZXg9MjY1O3QuY2N1cmw9NTk3O3QuY2RvdD0yNjc7dC5jZG90YWNjZW50PTI2Nzt0LmNkc3F1YXJlPTEzMjUzO3QuY2VkaWxsYT0xODQ7dC5jZWRpbGxhY21iPTgwNzt0LmNlbnQ9MTYyO3QuY2VudGlncmFkZT04NDUxO3QuY2VudGluZmVyaW9yPTYzMTk5O3QuY2VudG1vbm9zcGFjZT02NTUwNDt0LmNlbnRvbGRzdHlsZT02MzM5NDt0LmNlbnRzdXBlcmlvcj02MzIwMDt0LmNoYWFybWVuaWFuPTE0MDE7dC5jaGFiZW5nYWxpPTI0NTk7dC5jaGFkZXZhPTIzMzE7dC5jaGFndWphcmF0aT0yNzE1O3QuY2hhZ3VybXVraGk9MjU4Nzt0LmNoYm9wb21vZm89MTI1NjQ7dC5jaGVhYmtoYXNpYW5jeXJpbGxpYz0xMjEzO3QuY2hlY2ttYXJrPTEwMDAzO3QuY2hlY3lyaWxsaWM9MTA5NTt0LmNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljPTEyMTU7dC5jaGVkZXNjZW5kZXJjeXJpbGxpYz0xMjA3O3QuY2hlZGllcmVzaXNjeXJpbGxpYz0xMjY5O3QuY2hlaGFybWVuaWFuPTEzOTU7dC5jaGVraGFrYXNzaWFuY3lyaWxsaWM9MTIyODt0LmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTIwOTt0LmNoaT05Njc7dC5jaGlldWNoYWNpcmNsZWtvcmVhbj0xMjkxOTt0LmNoaWV1Y2hhcGFyZW5rb3JlYW49MTI4MjM7dC5jaGlldWNoY2lyY2xla29yZWFuPTEyOTA1O3QuY2hpZXVjaGtvcmVhbj0xMjYxODt0LmNoaWV1Y2hwYXJlbmtvcmVhbj0xMjgwOTt0LmNob2NoYW5ndGhhaT0zNTk0O3QuY2hvY2hhbnRoYWk9MzU5Mjt0LmNob2NoaW5ndGhhaT0zNTkzO3QuY2hvY2hvZXRoYWk9MzU5Njt0LmNob29rPTM5Mjt0LmNpZXVjYWNpcmNsZWtvcmVhbj0xMjkxODt0LmNpZXVjYXBhcmVua29yZWFuPTEyODIyO3QuY2lldWNjaXJjbGVrb3JlYW49MTI5MDQ7dC5jaWV1Y2tvcmVhbj0xMjYxNjt0LmNpZXVjcGFyZW5rb3JlYW49MTI4MDg7dC5jaWV1Y3VwYXJlbmtvcmVhbj0xMjgyODt0LmNpcmNsZT05Njc1O3QuY2lyY2xlY29weXJ0PTE2OTt0LmNpcmNsZW11bHRpcGx5PTg4NTU7dC5jaXJjbGVvdD04ODU3O3QuY2lyY2xlcGx1cz04ODUzO3QuY2lyY2xlcG9zdGFsbWFyaz0xMjM0Mjt0LmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrPTk2ODA7dC5jaXJjbGV3aXRocmlnaHRoYWxmYmxhY2s9OTY4MTt0LmNpcmN1bWZsZXg9NzEwO3QuY2lyY3VtZmxleGJlbG93Y21iPTgxMzt0LmNpcmN1bWZsZXhjbWI9NzcwO3QuY2xlYXI9ODk5OTt0LmNsaWNrYWx2ZW9sYXI9NDUwO3QuY2xpY2tkZW50YWw9NDQ4O3QuY2xpY2tsYXRlcmFsPTQ0OTt0LmNsaWNrcmV0cm9mbGV4PTQ1MTt0LmNsdWI9OTgyNzt0LmNsdWJzdWl0YmxhY2s9OTgyNzt0LmNsdWJzdWl0d2hpdGU9OTgzMTt0LmNtY3ViZWRzcXVhcmU9MTMyMjA7dC5jbW9ub3NwYWNlPTY1MzQ3O3QuY21zcXVhcmVkc3F1YXJlPTEzMjE2O3QuY29hcm1lbmlhbj0xNDA5O3QuY29sb249NTg7dC5jb2xvbm1vbmV0YXJ5PTgzNTM7dC5jb2xvbm1vbm9zcGFjZT02NTMwNjt0LmNvbG9uc2lnbj04MzUzO3QuY29sb25zbWFsbD02NTEwOTt0LmNvbG9udHJpYW5ndWxhcmhhbGZtb2Q9NzIxO3QuY29sb250cmlhbmd1bGFybW9kPTcyMDt0LmNvbW1hPTQ0O3QuY29tbWFhYm92ZWNtYj03ODc7dC5jb21tYWFib3ZlcmlnaHRjbWI9Nzg5O3QuY29tbWFhY2NlbnQ9NjMxNzE7dC5jb21tYWFyYWJpYz0xNTQ4O3QuY29tbWFhcm1lbmlhbj0xMzczO3QuY29tbWFpbmZlcmlvcj02MzIwMTt0LmNvbW1hbW9ub3NwYWNlPTY1MjkyO3QuY29tbWFyZXZlcnNlZGFib3ZlY21iPTc4ODt0LmNvbW1hcmV2ZXJzZWRtb2Q9NzAxO3QuY29tbWFzbWFsbD02NTEwNDt0LmNvbW1hc3VwZXJpb3I9NjMyMDI7dC5jb21tYXR1cm5lZGFib3ZlY21iPTc4Njt0LmNvbW1hdHVybmVkbW9kPTY5OTt0LmNvbXBhc3M9OTc4ODt0LmNvbmdydWVudD04NzczO3QuY29udG91cmludGVncmFsPTg3NTA7dC5jb250cm9sPTg5NjM7dC5jb250cm9sQUNLPTY7dC5jb250cm9sQkVMPTc7dC5jb250cm9sQlM9ODt0LmNvbnRyb2xDQU49MjQ7dC5jb250cm9sQ1I9MTM7dC5jb250cm9sREMxPTE3O3QuY29udHJvbERDMj0xODt0LmNvbnRyb2xEQzM9MTk7dC5jb250cm9sREM0PTIwO3QuY29udHJvbERFTD0xMjc7dC5jb250cm9sRExFPTE2O3QuY29udHJvbEVNPTI1O3QuY29udHJvbEVOUT01O3QuY29udHJvbEVPVD00O3QuY29udHJvbEVTQz0yNzt0LmNvbnRyb2xFVEI9MjM7dC5jb250cm9sRVRYPTM7dC5jb250cm9sRkY9MTI7dC5jb250cm9sRlM9Mjg7dC5jb250cm9sR1M9Mjk7dC5jb250cm9sSFQ9OTt0LmNvbnRyb2xMRj0xMDt0LmNvbnRyb2xOQUs9MjE7dC5jb250cm9sTlVMTD0wO3QuY29udHJvbFJTPTMwO3QuY29udHJvbFNJPTE1O3QuY29udHJvbFNPPTE0O3QuY29udHJvbFNPVD0yO3QuY29udHJvbFNUWD0xO3QuY29udHJvbFNVQj0yNjt0LmNvbnRyb2xTWU49MjI7dC5jb250cm9sVVM9MzE7dC5jb250cm9sVlQ9MTE7dC5jb3B5cmlnaHQ9MTY5O3QuY29weXJpZ2h0c2Fucz02MzcyMTt0LmNvcHlyaWdodHNlcmlmPTYzMTkzO3QuY29ybmVyYnJhY2tldGxlZnQ9MTIzMDA7dC5jb3JuZXJicmFja2V0bGVmdGhhbGZ3aWR0aD02NTM3ODt0LmNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODk7dC5jb3JuZXJicmFja2V0cmlnaHQ9MTIzMDE7dC5jb3JuZXJicmFja2V0cmlnaHRoYWxmd2lkdGg9NjUzNzk7dC5jb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA5MDt0LmNvcnBvcmF0aW9uc3F1YXJlPTEzMTgzO3QuY29zcXVhcmU9MTMyNTU7dC5jb3Zlcmtnc3F1YXJlPTEzMjU0O3QuY3BhcmVuPTkzNzQ7dC5jcnV6ZWlybz04MzU0O3QuY3N0cmV0Y2hlZD02NjM7dC5jdXJseWFuZD04OTExO3QuY3VybHlvcj04OTEwO3QuY3VycmVuY3k9MTY0O3QuY3lyQnJldmU9NjMxODU7dC5jeXJGbGV4PTYzMTg2O3QuY3lyYnJldmU9NjMxODg7dC5jeXJmbGV4PTYzMTg5O3QuZD0xMDA7dC5kYWFybWVuaWFuPTEzODA7dC5kYWJlbmdhbGk9MjQ3MDt0LmRhZGFyYWJpYz0xNTkwO3QuZGFkZXZhPTIzNDI7dC5kYWRmaW5hbGFyYWJpYz02NTIxNDt0LmRhZGluaXRpYWxhcmFiaWM9NjUyMTU7dC5kYWRtZWRpYWxhcmFiaWM9NjUyMTY7dC5kYWdlc2g9MTQ2ODt0LmRhZ2VzaGhlYnJldz0xNDY4O3QuZGFnZ2VyPTgyMjQ7dC5kYWdnZXJkYmw9ODIyNTt0LmRhZ3VqYXJhdGk9MjcyNjt0LmRhZ3VybXVraGk9MjU5ODt0LmRhaGlyYWdhbmE9MTIzODQ7dC5kYWthdGFrYW5hPTEyNDgwO3QuZGFsYXJhYmljPTE1ODM7dC5kYWxldD0xNDkxO3QuZGFsZXRkYWdlc2g9NjQzMDc7dC5kYWxldGRhZ2VzaGhlYnJldz02NDMwNzt0LmRhbGV0aGVicmV3PTE0OTE7dC5kYWxmaW5hbGFyYWJpYz02NTE5NDt0LmRhbW1hYXJhYmljPTE2MTU7dC5kYW1tYWxvd2FyYWJpYz0xNjE1O3QuZGFtbWF0YW5hbHRvbmVhcmFiaWM9MTYxMjt0LmRhbW1hdGFuYXJhYmljPTE2MTI7dC5kYW5kYT0yNDA0O3QuZGFyZ2FoZWJyZXc9MTQ0Nzt0LmRhcmdhbGVmdGhlYnJldz0xNDQ3O3QuZGFzaWFwbmV1bWF0YWN5cmlsbGljY21iPTExNTc7dC5kYmxHcmF2ZT02MzE4Nzt0LmRibGFuZ2xlYnJhY2tldGxlZnQ9MTIyOTg7dC5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODU7dC5kYmxhbmdsZWJyYWNrZXRyaWdodD0xMjI5OTt0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODY7dC5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYj04MTE7dC5kYmxhcnJvd2xlZnQ9ODY2MDt0LmRibGFycm93cmlnaHQ9ODY1ODt0LmRibGRhbmRhPTI0MDU7dC5kYmxncmF2ZT02MzE5MDt0LmRibGdyYXZlY21iPTc4Mzt0LmRibGludGVncmFsPTg3NDg7dC5kYmxsb3dsaW5lPTgyMTU7dC5kYmxsb3dsaW5lY21iPTgxOTt0LmRibG92ZXJsaW5lY21iPTgzMTt0LmRibHByaW1lbW9kPTY5ODt0LmRibHZlcnRpY2FsYmFyPTgyMTQ7dC5kYmx2ZXJ0aWNhbGxpbmVhYm92ZWNtYj03ODI7dC5kYm9wb21vZm89MTI1NTM7dC5kYnNxdWFyZT0xMzI1Njt0LmRjYXJvbj0yNzE7dC5kY2VkaWxsYT03Njk3O3QuZGNpcmNsZT05NDI3O3QuZGNpcmN1bWZsZXhiZWxvdz03Njk5O3QuZGNyb2F0PTI3Mzt0LmRkYWJlbmdhbGk9MjQ2NTt0LmRkYWRldmE9MjMzNzt0LmRkYWd1amFyYXRpPTI3MjE7dC5kZGFndXJtdWtoaT0yNTkzO3QuZGRhbGFyYWJpYz0xNjcyO3QuZGRhbGZpbmFsYXJhYmljPTY0MzkzO3QuZGRkaGFkZXZhPTIzOTY7dC5kZGhhYmVuZ2FsaT0yNDY2O3QuZGRoYWRldmE9MjMzODt0LmRkaGFndWphcmF0aT0yNzIyO3QuZGRoYWd1cm11a2hpPTI1OTQ7dC5kZG90YWNjZW50PTc2OTE7dC5kZG90YmVsb3c9NzY5Mzt0LmRlY2ltYWxzZXBhcmF0b3JhcmFiaWM9MTY0Mzt0LmRlY2ltYWxzZXBhcmF0b3JwZXJzaWFuPTE2NDM7dC5kZWN5cmlsbGljPTEwNzY7dC5kZWdyZWU9MTc2O3QuZGVoaWhlYnJldz0xNDUzO3QuZGVoaXJhZ2FuYT0xMjM5MTt0LmRlaWNvcHRpYz0xMDA3O3QuZGVrYXRha2FuYT0xMjQ4Nzt0LmRlbGV0ZWxlZnQ9OTAwMzt0LmRlbGV0ZXJpZ2h0PTg5OTg7dC5kZWx0YT05NDg7dC5kZWx0YXR1cm5lZD0zOTc7dC5kZW5vbWluYXRvcm1pbnVzb25lbnVtZXJhdG9yYmVuZ2FsaT0yNTUyO3QuZGV6aD02NzY7dC5kaGFiZW5nYWxpPTI0NzE7dC5kaGFkZXZhPTIzNDM7dC5kaGFndWphcmF0aT0yNzI3O3QuZGhhZ3VybXVraGk9MjU5OTt0LmRob29rPTU5OTt0LmRpYWx5dGlrYXRvbm9zPTkwMTt0LmRpYWx5dGlrYXRvbm9zY21iPTgzNjt0LmRpYW1vbmQ9OTgzMDt0LmRpYW1vbmRzdWl0d2hpdGU9OTgyNjt0LmRpZXJlc2lzPTE2ODt0LmRpZXJlc2lzYWN1dGU9NjMxOTE7dC5kaWVyZXNpc2JlbG93Y21iPTgwNDt0LmRpZXJlc2lzY21iPTc3Njt0LmRpZXJlc2lzZ3JhdmU9NjMxOTI7dC5kaWVyZXNpc3Rvbm9zPTkwMTt0LmRpaGlyYWdhbmE9MTIzODY7dC5kaWthdGFrYW5hPTEyNDgyO3QuZGl0dG9tYXJrPTEyMjkxO3QuZGl2aWRlPTI0Nzt0LmRpdmlkZXM9ODczOTt0LmRpdmlzaW9uc2xhc2g9ODcyNTt0LmRqZWN5cmlsbGljPTExMDY7dC5ka3NoYWRlPTk2MTk7dC5kbGluZWJlbG93PTc2OTU7dC5kbHNxdWFyZT0xMzIwNzt0LmRtYWNyb249MjczO3QuZG1vbm9zcGFjZT02NTM0ODt0LmRuYmxvY2s9OTYwNDt0LmRvY2hhZGF0aGFpPTM1OTg7dC5kb2Rla3RoYWk9MzYwNDt0LmRvaGlyYWdhbmE9MTIzOTM7dC5kb2thdGFrYW5hPTEyNDg5O3QuZG9sbGFyPTM2O3QuZG9sbGFyaW5mZXJpb3I9NjMyMDM7dC5kb2xsYXJtb25vc3BhY2U9NjUyODQ7dC5kb2xsYXJvbGRzdHlsZT02MzI2ODt0LmRvbGxhcnNtYWxsPTY1MTI5O3QuZG9sbGFyc3VwZXJpb3I9NjMyMDQ7dC5kb25nPTgzNjM7dC5kb3J1c3F1YXJlPTEzMDk0O3QuZG90YWNjZW50PTcyOTt0LmRvdGFjY2VudGNtYj03NzU7dC5kb3RiZWxvd2NtYj04MDM7dC5kb3RiZWxvd2NvbWI9ODAzO3QuZG90a2F0YWthbmE9MTI1Mzk7dC5kb3RsZXNzaT0zMDU7dC5kb3RsZXNzaj02MzE2Njt0LmRvdGxlc3Nqc3Ryb2tlaG9vaz02NDQ7dC5kb3RtYXRoPTg5MDE7dC5kb3R0ZWRjaXJjbGU9OTY3Njt0LmRvdWJsZXlvZHBhdGFoPTY0Mjg3O3QuZG91YmxleW9kcGF0YWhoZWJyZXc9NjQyODc7dC5kb3dudGFja2JlbG93Y21iPTc5ODt0LmRvd250YWNrbW9kPTcyNTt0LmRwYXJlbj05Mzc1O3QuZHN1cGVyaW9yPTYzMjExO3QuZHRhaWw9NTk4O3QuZHRvcGJhcj0zOTY7dC5kdWhpcmFnYW5hPTEyMzg5O3QuZHVrYXRha2FuYT0xMjQ4NTt0LmR6PTQ5OTt0LmR6YWx0b25lPTY3NTt0LmR6Y2Fyb249NDU0O3QuZHpjdXJsPTY3Nzt0LmR6ZWFia2hhc2lhbmN5cmlsbGljPTEyNDk7dC5kemVjeXJpbGxpYz0xMTA5O3QuZHpoZWN5cmlsbGljPTExMTk7dC5lPTEwMTt0LmVhY3V0ZT0yMzM7dC5lYXJ0aD05NzkzO3QuZWJlbmdhbGk9MjQ0Nzt0LmVib3BvbW9mbz0xMjU3Mjt0LmVicmV2ZT0yNzc7dC5lY2FuZHJhZGV2YT0yMzE3O3QuZWNhbmRyYWd1amFyYXRpPTI3MDE7dC5lY2FuZHJhdm93ZWxzaWduZGV2YT0yMzczO3QuZWNhbmRyYXZvd2Vsc2lnbmd1amFyYXRpPTI3NTc7dC5lY2Fyb249MjgzO3QuZWNlZGlsbGFicmV2ZT03NzA5O3QuZWNoYXJtZW5pYW49MTM4MTt0LmVjaHlpd25hcm1lbmlhbj0xNDE1O3QuZWNpcmNsZT05NDI4O3QuZWNpcmN1bWZsZXg9MjM0O3QuZWNpcmN1bWZsZXhhY3V0ZT03ODcxO3QuZWNpcmN1bWZsZXhiZWxvdz03NzA1O3QuZWNpcmN1bWZsZXhkb3RiZWxvdz03ODc5O3QuZWNpcmN1bWZsZXhncmF2ZT03ODczO3QuZWNpcmN1bWZsZXhob29rYWJvdmU9Nzg3NTt0LmVjaXJjdW1mbGV4dGlsZGU9Nzg3Nzt0LmVjeXJpbGxpYz0xMTA4O3QuZWRibGdyYXZlPTUxNzt0LmVkZXZhPTIzMTk7dC5lZGllcmVzaXM9MjM1O3QuZWRvdD0yNzk7dC5lZG90YWNjZW50PTI3OTt0LmVkb3RiZWxvdz03ODY1O3QuZWVndXJtdWtoaT0yNTc1O3QuZWVtYXRyYWd1cm11a2hpPTI2MzE7dC5lZmN5cmlsbGljPTEwOTI7dC5lZ3JhdmU9MjMyO3QuZWd1amFyYXRpPTI3MDM7dC5laGFybWVuaWFuPTEzODM7dC5laGJvcG9tb2ZvPTEyNTczO3QuZWhpcmFnYW5hPTEyMzYwO3QuZWhvb2thYm92ZT03ODY3O3QuZWlib3BvbW9mbz0xMjU3NTt0LmVpZ2h0PTU2O3QuZWlnaHRhcmFiaWM9MTY0MDt0LmVpZ2h0YmVuZ2FsaT0yNTQyO3QuZWlnaHRjaXJjbGU9OTMxOTt0LmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyOTt0LmVpZ2h0ZGV2YT0yNDE0O3QuZWlnaHRlZW5jaXJjbGU9OTMyOTt0LmVpZ2h0ZWVucGFyZW49OTM0OTt0LmVpZ2h0ZWVucGVyaW9kPTkzNjk7dC5laWdodGd1amFyYXRpPTI3OTg7dC5laWdodGd1cm11a2hpPTI2NzA7dC5laWdodGhhY2thcmFiaWM9MTY0MDt0LmVpZ2h0aGFuZ3pob3U9MTIzMjg7dC5laWdodGhub3RlYmVhbWVkPTk4MzU7dC5laWdodGlkZW9ncmFwaGljcGFyZW49MTI4Mzk7dC5laWdodGluZmVyaW9yPTgzMjg7dC5laWdodG1vbm9zcGFjZT02NTMwNDt0LmVpZ2h0b2xkc3R5bGU9NjMyODg7dC5laWdodHBhcmVuPTkzMzk7dC5laWdodHBlcmlvZD05MzU5O3QuZWlnaHRwZXJzaWFuPTE3ODQ7dC5laWdodHJvbWFuPTg1Njc7dC5laWdodHN1cGVyaW9yPTgzMTI7dC5laWdodHRoYWk9MzY3Mjt0LmVpbnZlcnRlZGJyZXZlPTUxOTt0LmVpb3RpZmllZGN5cmlsbGljPTExMjU7dC5la2F0YWthbmE9MTI0NTY7dC5la2F0YWthbmFoYWxmd2lkdGg9NjUzOTY7dC5la29ua2FyZ3VybXVraGk9MjY3Njt0LmVrb3JlYW49MTI2Mjg7dC5lbGN5cmlsbGljPTEwODM7dC5lbGVtZW50PTg3MTI7dC5lbGV2ZW5jaXJjbGU9OTMyMjt0LmVsZXZlbnBhcmVuPTkzNDI7dC5lbGV2ZW5wZXJpb2Q9OTM2Mjt0LmVsZXZlbnJvbWFuPTg1NzA7dC5lbGxpcHNpcz04MjMwO3QuZWxsaXBzaXN2ZXJ0aWNhbD04OTQyO3QuZW1hY3Jvbj0yNzU7dC5lbWFjcm9uYWN1dGU9NzcwMzt0LmVtYWNyb25ncmF2ZT03NzAxO3QuZW1jeXJpbGxpYz0xMDg0O3QuZW1kYXNoPTgyMTI7dC5lbWRhc2h2ZXJ0aWNhbD02NTA3Mzt0LmVtb25vc3BhY2U9NjUzNDk7dC5lbXBoYXNpc21hcmthcm1lbmlhbj0xMzcxO3QuZW1wdHlzZXQ9ODcwOTt0LmVuYm9wb21vZm89MTI1Nzk7dC5lbmN5cmlsbGljPTEwODU7dC5lbmRhc2g9ODIxMTt0LmVuZGFzaHZlcnRpY2FsPTY1MDc0O3QuZW5kZXNjZW5kZXJjeXJpbGxpYz0xMTg3O3QuZW5nPTMzMTt0LmVuZ2JvcG9tb2ZvPTEyNTgxO3QuZW5naGVjeXJpbGxpYz0xMTg5O3QuZW5ob29rY3lyaWxsaWM9MTIyNDt0LmVuc3BhY2U9ODE5NDt0LmVvZ29uZWs9MjgxO3QuZW9rb3JlYW49MTI2Mjc7dC5lb3Blbj02MDM7dC5lb3BlbmNsb3NlZD02NjY7dC5lb3BlbnJldmVyc2VkPTYwNDt0LmVvcGVucmV2ZXJzZWRjbG9zZWQ9NjA2O3QuZW9wZW5yZXZlcnNlZGhvb2s9NjA1O3QuZXBhcmVuPTkzNzY7dC5lcHNpbG9uPTk0OTt0LmVwc2lsb250b25vcz05NDE7dC5lcXVhbD02MTt0LmVxdWFsbW9ub3NwYWNlPTY1MzA5O3QuZXF1YWxzbWFsbD02NTEyNjt0LmVxdWFsc3VwZXJpb3I9ODMxNjt0LmVxdWl2YWxlbmNlPTg4MDE7dC5lcmJvcG9tb2ZvPTEyNTgyO3QuZXJjeXJpbGxpYz0xMDg4O3QuZXJldmVyc2VkPTYwMDt0LmVyZXZlcnNlZGN5cmlsbGljPTExMDE7dC5lc2N5cmlsbGljPTEwODk7dC5lc2Rlc2NlbmRlcmN5cmlsbGljPTExOTU7dC5lc2g9NjQzO3QuZXNoY3VybD02NDY7dC5lc2hvcnRkZXZhPTIzMTg7dC5lc2hvcnR2b3dlbHNpZ25kZXZhPTIzNzQ7dC5lc2hyZXZlcnNlZGxvb3A9NDI2O3QuZXNoc3F1YXRyZXZlcnNlZD02NDU7dC5lc21hbGxoaXJhZ2FuYT0xMjM1OTt0LmVzbWFsbGthdGFrYW5hPTEyNDU1O3QuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODY7dC5lc3RpbWF0ZWQ9ODQ5NDt0LmVzdXBlcmlvcj02MzIxMjt0LmV0YT05NTE7dC5ldGFybWVuaWFuPTEzODQ7dC5ldGF0b25vcz05NDI7dC5ldGg9MjQwO3QuZXRpbGRlPTc4Njk7dC5ldGlsZGViZWxvdz03NzA3O3QuZXRuYWh0YWZvdWtoaGVicmV3PTE0MjU7dC5ldG5haHRhZm91a2hsZWZ0aGVicmV3PTE0MjU7dC5ldG5haHRhaGVicmV3PTE0MjU7dC5ldG5haHRhbGVmdGhlYnJldz0xNDI1O3QuZXR1cm5lZD00Nzc7dC5ldWtvcmVhbj0xMjY0MTt0LmV1cm89ODM2NDt0LmV2b3dlbHNpZ25iZW5nYWxpPTI1MDM7dC5ldm93ZWxzaWduZGV2YT0yMzc1O3QuZXZvd2Vsc2lnbmd1amFyYXRpPTI3NTk7dC5leGNsYW09MzM7dC5leGNsYW1hcm1lbmlhbj0xMzcyO3QuZXhjbGFtZGJsPTgyNTI7dC5leGNsYW1kb3duPTE2MTt0LmV4Y2xhbWRvd25zbWFsbD02MzM5Mzt0LmV4Y2xhbW1vbm9zcGFjZT02NTI4MTt0LmV4Y2xhbXNtYWxsPTYzMjY1O3QuZXhpc3RlbnRpYWw9ODcwNzt0LmV6aD02NTg7dC5lemhjYXJvbj00OTU7dC5lemhjdXJsPTY1OTt0LmV6aHJldmVyc2VkPTQ0MTt0LmV6aHRhaWw9NDQyO3QuZj0xMDI7dC5mYWRldmE9MjM5ODt0LmZhZ3VybXVraGk9MjY1NDt0LmZhaHJlbmhlaXQ9ODQ1Nzt0LmZhdGhhYXJhYmljPTE2MTQ7dC5mYXRoYWxvd2FyYWJpYz0xNjE0O3QuZmF0aGF0YW5hcmFiaWM9MTYxMTt0LmZib3BvbW9mbz0xMjU1Mjt0LmZjaXJjbGU9OTQyOTt0LmZkb3RhY2NlbnQ9NzcxMTt0LmZlaGFyYWJpYz0xNjAxO3QuZmVoYXJtZW5pYW49MTQxNDt0LmZlaGZpbmFsYXJhYmljPTY1MjM0O3QuZmVoaW5pdGlhbGFyYWJpYz02NTIzNTt0LmZlaG1lZGlhbGFyYWJpYz02NTIzNjt0LmZlaWNvcHRpYz05OTc7dC5mZW1hbGU9OTc5Mjt0LmZmPTY0MjU2O3QuZl9mPTY0MjU2O3QuZmZpPTY0MjU5O3QuZmZsPTY0MjYwO3QuZmk9NjQyNTc7dC5maWZ0ZWVuY2lyY2xlPTkzMjY7dC5maWZ0ZWVucGFyZW49OTM0Njt0LmZpZnRlZW5wZXJpb2Q9OTM2Njt0LmZpZ3VyZWRhc2g9ODIxMDt0LmZpbGxlZGJveD05NjMyO3QuZmlsbGVkcmVjdD05NjQ0O3QuZmluYWxrYWY9MTQ5ODt0LmZpbmFsa2FmZGFnZXNoPTY0MzE0O3QuZmluYWxrYWZkYWdlc2hoZWJyZXc9NjQzMTQ7dC5maW5hbGthZmhlYnJldz0xNDk4O3QuZmluYWxtZW09MTUwMTt0LmZpbmFsbWVtaGVicmV3PTE1MDE7dC5maW5hbG51bj0xNTAzO3QuZmluYWxudW5oZWJyZXc9MTUwMzt0LmZpbmFscGU9MTUwNzt0LmZpbmFscGVoZWJyZXc9MTUwNzt0LmZpbmFsdHNhZGk9MTUwOTt0LmZpbmFsdHNhZGloZWJyZXc9MTUwOTt0LmZpcnN0dG9uZWNoaW5lc2U9NzEzO3QuZmlzaGV5ZT05NjczO3QuZml0YWN5cmlsbGljPTExMzk7dC5maXZlPTUzO3QuZml2ZWFyYWJpYz0xNjM3O3QuZml2ZWJlbmdhbGk9MjUzOTt0LmZpdmVjaXJjbGU9OTMxNjt0LmZpdmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTI2O3QuZml2ZWRldmE9MjQxMTt0LmZpdmVlaWdodGhzPTg1NDE7dC5maXZlZ3VqYXJhdGk9Mjc5NTt0LmZpdmVndXJtdWtoaT0yNjY3O3QuZml2ZWhhY2thcmFiaWM9MTYzNzt0LmZpdmVoYW5nemhvdT0xMjMyNTt0LmZpdmVpZGVvZ3JhcGhpY3BhcmVuPTEyODM2O3QuZml2ZWluZmVyaW9yPTgzMjU7dC5maXZlbW9ub3NwYWNlPTY1MzAxO3QuZml2ZW9sZHN0eWxlPTYzMjg1O3QuZml2ZXBhcmVuPTkzMzY7dC5maXZlcGVyaW9kPTkzNTY7dC5maXZlcGVyc2lhbj0xNzgxO3QuZml2ZXJvbWFuPTg1NjQ7dC5maXZlc3VwZXJpb3I9ODMwOTt0LmZpdmV0aGFpPTM2Njk7dC5mbD02NDI1ODt0LmZsb3Jpbj00MDI7dC5mbW9ub3NwYWNlPTY1MzUwO3QuZm1zcXVhcmU9MTMyMDk7dC5mb2ZhbnRoYWk9MzYxNTt0LmZvZmF0aGFpPTM2MTM7dC5mb25nbWFudGhhaT0zNjYzO3QuZm9yYWxsPTg3MDQ7dC5mb3VyPTUyO3QuZm91cmFyYWJpYz0xNjM2O3QuZm91cmJlbmdhbGk9MjUzODt0LmZvdXJjaXJjbGU9OTMxNTt0LmZvdXJjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTI1O3QuZm91cmRldmE9MjQxMDt0LmZvdXJndWphcmF0aT0yNzk0O3QuZm91cmd1cm11a2hpPTI2NjY7dC5mb3VyaGFja2FyYWJpYz0xNjM2O3QuZm91cmhhbmd6aG91PTEyMzI0O3QuZm91cmlkZW9ncmFwaGljcGFyZW49MTI4MzU7dC5mb3VyaW5mZXJpb3I9ODMyNDt0LmZvdXJtb25vc3BhY2U9NjUzMDA7dC5mb3VybnVtZXJhdG9yYmVuZ2FsaT0yNTUxO3QuZm91cm9sZHN0eWxlPTYzMjg0O3QuZm91cnBhcmVuPTkzMzU7dC5mb3VycGVyaW9kPTkzNTU7dC5mb3VycGVyc2lhbj0xNzgwO3QuZm91cnJvbWFuPTg1NjM7dC5mb3Vyc3VwZXJpb3I9ODMwODt0LmZvdXJ0ZWVuY2lyY2xlPTkzMjU7dC5mb3VydGVlbnBhcmVuPTkzNDU7dC5mb3VydGVlbnBlcmlvZD05MzY1O3QuZm91cnRoYWk9MzY2ODt0LmZvdXJ0aHRvbmVjaGluZXNlPTcxNTt0LmZwYXJlbj05Mzc3O3QuZnJhY3Rpb249ODI2MDt0LmZyYW5jPTgzNTU7dC5nPTEwMzt0LmdhYmVuZ2FsaT0yNDU1O3QuZ2FjdXRlPTUwMTt0LmdhZGV2YT0yMzI3O3QuZ2FmYXJhYmljPTE3MTE7dC5nYWZmaW5hbGFyYWJpYz02NDQwMzt0LmdhZmluaXRpYWxhcmFiaWM9NjQ0MDQ7dC5nYWZtZWRpYWxhcmFiaWM9NjQ0MDU7dC5nYWd1amFyYXRpPTI3MTE7dC5nYWd1cm11a2hpPTI1ODM7dC5nYWhpcmFnYW5hPTEyMzY0O3QuZ2FrYXRha2FuYT0xMjQ2MDt0LmdhbW1hPTk0Nzt0LmdhbW1hbGF0aW5zbWFsbD02MTE7dC5nYW1tYXN1cGVyaW9yPTczNjt0LmdhbmdpYWNvcHRpYz0xMDAzO3QuZ2JvcG9tb2ZvPTEyNTU3O3QuZ2JyZXZlPTI4Nzt0LmdjYXJvbj00ODc7dC5nY2VkaWxsYT0yOTE7dC5nY2lyY2xlPTk0MzA7dC5nY2lyY3VtZmxleD0yODU7dC5nY29tbWFhY2NlbnQ9MjkxO3QuZ2RvdD0yODk7dC5nZG90YWNjZW50PTI4OTt0LmdlY3lyaWxsaWM9MTA3NTt0LmdlaGlyYWdhbmE9MTIzNzA7dC5nZWthdGFrYW5hPTEyNDY2O3QuZ2VvbWV0cmljYWxseWVxdWFsPTg3ODU7dC5nZXJlc2hhY2NlbnRoZWJyZXc9MTQzNjt0LmdlcmVzaGhlYnJldz0xNTIzO3QuZ2VyZXNobXVxZGFtaGVicmV3PTE0Mzc7dC5nZXJtYW5kYmxzPTIyMzt0LmdlcnNoYXlpbWFjY2VudGhlYnJldz0xNDM4O3QuZ2Vyc2hheWltaGVicmV3PTE1MjQ7dC5nZXRhbWFyaz0xMjMwNzt0LmdoYWJlbmdhbGk9MjQ1Njt0LmdoYWRhcm1lbmlhbj0xMzk0O3QuZ2hhZGV2YT0yMzI4O3QuZ2hhZ3VqYXJhdGk9MjcxMjt0LmdoYWd1cm11a2hpPTI1ODQ7dC5naGFpbmFyYWJpYz0xNTk0O3QuZ2hhaW5maW5hbGFyYWJpYz02NTIzMDt0LmdoYWluaW5pdGlhbGFyYWJpYz02NTIzMTt0LmdoYWlubWVkaWFsYXJhYmljPTY1MjMyO3QuZ2hlbWlkZGxlaG9va2N5cmlsbGljPTExNzM7dC5naGVzdHJva2VjeXJpbGxpYz0xMTcxO3QuZ2hldXB0dXJuY3lyaWxsaWM9MTE2OTt0LmdoaGFkZXZhPTIzOTQ7dC5naGhhZ3VybXVraGk9MjY1MDt0Lmdob29rPTYwODt0LmdoenNxdWFyZT0xMzIwMzt0LmdpaGlyYWdhbmE9MTIzNjY7dC5naWthdGFrYW5hPTEyNDYyO3QuZ2ltYXJtZW5pYW49MTM3OTt0LmdpbWVsPTE0OTA7dC5naW1lbGRhZ2VzaD02NDMwNjt0LmdpbWVsZGFnZXNoaGVicmV3PTY0MzA2O3QuZ2ltZWxoZWJyZXc9MTQ5MDt0LmdqZWN5cmlsbGljPTExMDc7dC5nbG90dGFsaW52ZXJ0ZWRzdHJva2U9NDQ2O3QuZ2xvdHRhbHN0b3A9NjYwO3QuZ2xvdHRhbHN0b3BpbnZlcnRlZD02NjI7dC5nbG90dGFsc3RvcG1vZD03MDQ7dC5nbG90dGFsc3RvcHJldmVyc2VkPTY2MTt0Lmdsb3R0YWxzdG9wcmV2ZXJzZWRtb2Q9NzA1O3QuZ2xvdHRhbHN0b3ByZXZlcnNlZHN1cGVyaW9yPTc0MDt0Lmdsb3R0YWxzdG9wc3Ryb2tlPTY3Mzt0Lmdsb3R0YWxzdG9wc3Ryb2tlcmV2ZXJzZWQ9Njc0O3QuZ21hY3Jvbj03NzEzO3QuZ21vbm9zcGFjZT02NTM1MTt0LmdvaGlyYWdhbmE9MTIzNzI7dC5nb2thdGFrYW5hPTEyNDY4O3QuZ3BhcmVuPTkzNzg7dC5ncGFzcXVhcmU9MTMyMjg7dC5ncmFkaWVudD04NzExO3QuZ3JhdmU9OTY7dC5ncmF2ZWJlbG93Y21iPTc5MDt0LmdyYXZlY21iPTc2ODt0LmdyYXZlY29tYj03Njg7dC5ncmF2ZWRldmE9MjM4Nzt0LmdyYXZlbG93bW9kPTcxODt0LmdyYXZlbW9ub3NwYWNlPTY1MzQ0O3QuZ3JhdmV0b25lY21iPTgzMjt0LmdyZWF0ZXI9NjI7dC5ncmVhdGVyZXF1YWw9ODgwNTt0LmdyZWF0ZXJlcXVhbG9ybGVzcz04OTIzO3QuZ3JlYXRlcm1vbm9zcGFjZT02NTMxMDt0LmdyZWF0ZXJvcmVxdWl2YWxlbnQ9ODgxOTt0LmdyZWF0ZXJvcmxlc3M9ODgyMzt0LmdyZWF0ZXJvdmVyZXF1YWw9ODgwNzt0LmdyZWF0ZXJzbWFsbD02NTEyNTt0LmdzY3JpcHQ9NjA5O3QuZ3N0cm9rZT00ODU7dC5ndWhpcmFnYW5hPTEyMzY4O3QuZ3VpbGxlbW90bGVmdD0xNzE7dC5ndWlsbGVtb3RyaWdodD0xODc7dC5ndWlsc2luZ2xsZWZ0PTgyNDk7dC5ndWlsc2luZ2xyaWdodD04MjUwO3QuZ3VrYXRha2FuYT0xMjQ2NDt0Lmd1cmFtdXNxdWFyZT0xMzA4MDt0Lmd5c3F1YXJlPTEzMjU3O3QuaD0xMDQ7dC5oYWFia2hhc2lhbmN5cmlsbGljPTExOTM7dC5oYWFsdG9uZWFyYWJpYz0xNzI5O3QuaGFiZW5nYWxpPTI0ODk7dC5oYWRlc2NlbmRlcmN5cmlsbGljPTEyMDM7dC5oYWRldmE9MjM2MTt0LmhhZ3VqYXJhdGk9Mjc0NTt0LmhhZ3VybXVraGk9MjYxNzt0LmhhaGFyYWJpYz0xNTgxO3QuaGFoZmluYWxhcmFiaWM9NjUxODY7dC5oYWhpbml0aWFsYXJhYmljPTY1MTg3O3QuaGFoaXJhZ2FuYT0xMjM5OTt0LmhhaG1lZGlhbGFyYWJpYz02NTE4ODt0LmhhaXR1c3F1YXJlPTEzMDk4O3QuaGFrYXRha2FuYT0xMjQ5NTt0Lmhha2F0YWthbmFoYWxmd2lkdGg9NjU0MTg7dC5oYWxhbnRndXJtdWtoaT0yNjM3O3QuaGFtemFhcmFiaWM9MTU2OTt0LmhhbXphbG93YXJhYmljPTE1Njk7dC5oYW5ndWxmaWxsZXI9MTI2NDQ7dC5oYXJkc2lnbmN5cmlsbGljPTEwOTg7dC5oYXJwb29ubGVmdGJhcmJ1cD04NjM2O3QuaGFycG9vbnJpZ2h0YmFyYnVwPTg2NDA7dC5oYXNxdWFyZT0xMzI1ODt0LmhhdGFmcGF0YWg9MTQ1ODt0LmhhdGFmcGF0YWgxNj0xNDU4O3QuaGF0YWZwYXRhaDIzPTE0NTg7dC5oYXRhZnBhdGFoMmY9MTQ1ODt0LmhhdGFmcGF0YWhoZWJyZXc9MTQ1ODt0LmhhdGFmcGF0YWhuYXJyb3doZWJyZXc9MTQ1ODt0LmhhdGFmcGF0YWhxdWFydGVyaGVicmV3PTE0NTg7dC5oYXRhZnBhdGFod2lkZWhlYnJldz0xNDU4O3QuaGF0YWZxYW1hdHM9MTQ1OTt0LmhhdGFmcWFtYXRzMWI9MTQ1OTt0LmhhdGFmcWFtYXRzMjg9MTQ1OTt0LmhhdGFmcWFtYXRzMzQ9MTQ1OTt0LmhhdGFmcWFtYXRzaGVicmV3PTE0NTk7dC5oYXRhZnFhbWF0c25hcnJvd2hlYnJldz0xNDU5O3QuaGF0YWZxYW1hdHNxdWFydGVyaGVicmV3PTE0NTk7dC5oYXRhZnFhbWF0c3dpZGVoZWJyZXc9MTQ1OTt0LmhhdGFmc2Vnb2w9MTQ1Nzt0LmhhdGFmc2Vnb2wxNz0xNDU3O3QuaGF0YWZzZWdvbDI0PTE0NTc7dC5oYXRhZnNlZ29sMzA9MTQ1Nzt0LmhhdGFmc2Vnb2xoZWJyZXc9MTQ1Nzt0LmhhdGFmc2Vnb2xuYXJyb3doZWJyZXc9MTQ1Nzt0LmhhdGFmc2Vnb2xxdWFydGVyaGVicmV3PTE0NTc7dC5oYXRhZnNlZ29sd2lkZWhlYnJldz0xNDU3O3QuaGJhcj0yOTU7dC5oYm9wb21vZm89MTI1NTk7dC5oYnJldmViZWxvdz03NzIzO3QuaGNlZGlsbGE9NzcyMTt0LmhjaXJjbGU9OTQzMTt0LmhjaXJjdW1mbGV4PTI5Mzt0LmhkaWVyZXNpcz03NzE5O3QuaGRvdGFjY2VudD03NzE1O3QuaGRvdGJlbG93PTc3MTc7dC5oZT0xNDkyO3QuaGVhcnQ9OTgyOTt0LmhlYXJ0c3VpdGJsYWNrPTk4Mjk7dC5oZWFydHN1aXR3aGl0ZT05ODI1O3QuaGVkYWdlc2g9NjQzMDg7dC5oZWRhZ2VzaGhlYnJldz02NDMwODt0LmhlaGFsdG9uZWFyYWJpYz0xNzI5O3QuaGVoYXJhYmljPTE2MDc7dC5oZWhlYnJldz0xNDkyO3QuaGVoZmluYWxhbHRvbmVhcmFiaWM9NjQ0MjM7dC5oZWhmaW5hbGFsdHR3b2FyYWJpYz02NTI1ODt0LmhlaGZpbmFsYXJhYmljPTY1MjU4O3QuaGVoaGFtemFhYm92ZWZpbmFsYXJhYmljPTY0NDIxO3QuaGVoaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljPTY0NDIwO3QuaGVoaW5pdGlhbGFsdG9uZWFyYWJpYz02NDQyNDt0LmhlaGluaXRpYWxhcmFiaWM9NjUyNTk7dC5oZWhpcmFnYW5hPTEyNDA4O3QuaGVobWVkaWFsYWx0b25lYXJhYmljPTY0NDI1O3QuaGVobWVkaWFsYXJhYmljPTY1MjYwO3QuaGVpc2VpZXJhc3F1YXJlPTEzMTc5O3QuaGVrYXRha2FuYT0xMjUwNDt0Lmhla2F0YWthbmFoYWxmd2lkdGg9NjU0MjE7dC5oZWt1dGFhcnVzcXVhcmU9MTMxMTA7dC5oZW5naG9vaz02MTU7dC5oZXJ1dHVzcXVhcmU9MTMxMTM7dC5oZXQ9MTQ5NTt0LmhldGhlYnJldz0xNDk1O3QuaGhvb2s9NjE0O3QuaGhvb2tzdXBlcmlvcj02ODk7dC5oaWV1aGFjaXJjbGVrb3JlYW49MTI5MjM7dC5oaWV1aGFwYXJlbmtvcmVhbj0xMjgyNzt0LmhpZXVoY2lyY2xla29yZWFuPTEyOTA5O3QuaGlldWhrb3JlYW49MTI2MjI7dC5oaWV1aHBhcmVua29yZWFuPTEyODEzO3QuaGloaXJhZ2FuYT0xMjQwMjt0Lmhpa2F0YWthbmE9MTI0OTg7dC5oaWthdGFrYW5haGFsZndpZHRoPTY1NDE5O3QuaGlyaXE9MTQ2MDt0LmhpcmlxMTQ9MTQ2MDt0LmhpcmlxMjE9MTQ2MDt0LmhpcmlxMmQ9MTQ2MDt0LmhpcmlxaGVicmV3PTE0NjA7dC5oaXJpcW5hcnJvd2hlYnJldz0xNDYwO3QuaGlyaXFxdWFydGVyaGVicmV3PTE0NjA7dC5oaXJpcXdpZGVoZWJyZXc9MTQ2MDt0LmhsaW5lYmVsb3c9NzgzMDt0Lmhtb25vc3BhY2U9NjUzNTI7dC5ob2FybWVuaWFuPTEzOTI7dC5ob2hpcHRoYWk9MzYyNzt0LmhvaGlyYWdhbmE9MTI0MTE7dC5ob2thdGFrYW5hPTEyNTA3O3QuaG9rYXRha2FuYWhhbGZ3aWR0aD02NTQyMjt0LmhvbGFtPTE0NjU7dC5ob2xhbTE5PTE0NjU7dC5ob2xhbTI2PTE0NjU7dC5ob2xhbTMyPTE0NjU7dC5ob2xhbWhlYnJldz0xNDY1O3QuaG9sYW1uYXJyb3doZWJyZXc9MTQ2NTt0LmhvbGFtcXVhcnRlcmhlYnJldz0xNDY1O3QuaG9sYW13aWRlaGVicmV3PTE0NjU7dC5ob25va2h1a3RoYWk9MzYzMDt0Lmhvb2thYm92ZWNvbWI9Nzc3O3QuaG9va2NtYj03Nzc7dC5ob29rcGFsYXRhbGl6ZWRiZWxvd2NtYj04MDE7dC5ob29rcmV0cm9mbGV4YmVsb3djbWI9ODAyO3QuaG9vbnNxdWFyZT0xMzEyMjt0Lmhvcmljb3B0aWM9MTAwMTt0Lmhvcml6b250YWxiYXI9ODIxMzt0Lmhvcm5jbWI9Nzk1O3QuaG90c3ByaW5ncz05ODMyO3QuaG91c2U9ODk2Mjt0LmhwYXJlbj05Mzc5O3QuaHN1cGVyaW9yPTY4ODt0Lmh0dXJuZWQ9NjEzO3QuaHVoaXJhZ2FuYT0xMjQwNTt0Lmh1aWl0b3NxdWFyZT0xMzEwNzt0Lmh1a2F0YWthbmE9MTI1MDE7dC5odWthdGFrYW5haGFsZndpZHRoPTY1NDIwO3QuaHVuZ2FydW1sYXV0PTczMzt0Lmh1bmdhcnVtbGF1dGNtYj03Nzk7dC5odj00MDU7dC5oeXBoZW49NDU7dC5oeXBoZW5pbmZlcmlvcj02MzIwNTt0Lmh5cGhlbm1vbm9zcGFjZT02NTI5Mzt0Lmh5cGhlbnNtYWxsPTY1MTIzO3QuaHlwaGVuc3VwZXJpb3I9NjMyMDY7dC5oeXBoZW50d289ODIwODt0Lmk9MTA1O3QuaWFjdXRlPTIzNzt0LmlhY3lyaWxsaWM9MTEwMzt0LmliZW5nYWxpPTI0Mzk7dC5pYm9wb21vZm89MTI1ODM7dC5pYnJldmU9MzAxO3QuaWNhcm9uPTQ2NDt0LmljaXJjbGU9OTQzMjt0LmljaXJjdW1mbGV4PTIzODt0LmljeXJpbGxpYz0xMTEwO3QuaWRibGdyYXZlPTUyMTt0LmlkZW9ncmFwaGVhcnRoY2lyY2xlPTEyOTQzO3QuaWRlb2dyYXBoZmlyZWNpcmNsZT0xMjkzOTt0LmlkZW9ncmFwaGljYWxsaWFuY2VwYXJlbj0xMjg2Mzt0LmlkZW9ncmFwaGljY2FsbHBhcmVuPTEyODU4O3QuaWRlb2dyYXBoaWNjZW50cmVjaXJjbGU9MTI5NjU7dC5pZGVvZ3JhcGhpY2Nsb3NlPTEyMjk0O3QuaWRlb2dyYXBoaWNjb21tYT0xMjI4OTt0LmlkZW9ncmFwaGljY29tbWFsZWZ0PTY1MzgwO3QuaWRlb2dyYXBoaWNjb25ncmF0dWxhdGlvbnBhcmVuPTEyODU1O3QuaWRlb2dyYXBoaWNjb3JyZWN0Y2lyY2xlPTEyOTYzO3QuaWRlb2dyYXBoaWNlYXJ0aHBhcmVuPTEyODQ3O3QuaWRlb2dyYXBoaWNlbnRlcnByaXNlcGFyZW49MTI4NjE7dC5pZGVvZ3JhcGhpY2V4Y2VsbGVudGNpcmNsZT0xMjk1Nzt0LmlkZW9ncmFwaGljZmVzdGl2YWxwYXJlbj0xMjg2NDt0LmlkZW9ncmFwaGljZmluYW5jaWFsY2lyY2xlPTEyOTUwO3QuaWRlb2dyYXBoaWNmaW5hbmNpYWxwYXJlbj0xMjg1NDt0LmlkZW9ncmFwaGljZmlyZXBhcmVuPTEyODQzO3QuaWRlb2dyYXBoaWNoYXZlcGFyZW49MTI4NTA7dC5pZGVvZ3JhcGhpY2hpZ2hjaXJjbGU9MTI5NjQ7dC5pZGVvZ3JhcGhpY2l0ZXJhdGlvbm1hcms9MTIyOTM7dC5pZGVvZ3JhcGhpY2xhYm9yY2lyY2xlPTEyOTUyO3QuaWRlb2dyYXBoaWNsYWJvcnBhcmVuPTEyODU2O3QuaWRlb2dyYXBoaWNsZWZ0Y2lyY2xlPTEyOTY3O3QuaWRlb2dyYXBoaWNsb3djaXJjbGU9MTI5NjY7dC5pZGVvZ3JhcGhpY21lZGljaW5lY2lyY2xlPTEyOTY5O3QuaWRlb2dyYXBoaWNtZXRhbHBhcmVuPTEyODQ2O3QuaWRlb2dyYXBoaWNtb29ucGFyZW49MTI4NDI7dC5pZGVvZ3JhcGhpY25hbWVwYXJlbj0xMjg1Mjt0LmlkZW9ncmFwaGljcGVyaW9kPTEyMjkwO3QuaWRlb2dyYXBoaWNwcmludGNpcmNsZT0xMjk1ODt0LmlkZW9ncmFwaGljcmVhY2hwYXJlbj0xMjg2Nzt0LmlkZW9ncmFwaGljcmVwcmVzZW50cGFyZW49MTI4NTc7dC5pZGVvZ3JhcGhpY3Jlc291cmNlcGFyZW49MTI4NjI7dC5pZGVvZ3JhcGhpY3JpZ2h0Y2lyY2xlPTEyOTY4O3QuaWRlb2dyYXBoaWNzZWNyZXRjaXJjbGU9MTI5NTM7dC5pZGVvZ3JhcGhpY3NlbGZwYXJlbj0xMjg2Njt0LmlkZW9ncmFwaGljc29jaWV0eXBhcmVuPTEyODUxO3QuaWRlb2dyYXBoaWNzcGFjZT0xMjI4ODt0LmlkZW9ncmFwaGljc3BlY2lhbHBhcmVuPTEyODUzO3QuaWRlb2dyYXBoaWNzdG9ja3BhcmVuPTEyODQ5O3QuaWRlb2dyYXBoaWNzdHVkeXBhcmVuPTEyODU5O3QuaWRlb2dyYXBoaWNzdW5wYXJlbj0xMjg0ODt0LmlkZW9ncmFwaGljc3VwZXJ2aXNlcGFyZW49MTI4NjA7dC5pZGVvZ3JhcGhpY3dhdGVycGFyZW49MTI4NDQ7dC5pZGVvZ3JhcGhpY3dvb2RwYXJlbj0xMjg0NTt0LmlkZW9ncmFwaGljemVybz0xMjI5NTt0LmlkZW9ncmFwaG1ldGFsY2lyY2xlPTEyOTQyO3QuaWRlb2dyYXBobW9vbmNpcmNsZT0xMjkzODt0LmlkZW9ncmFwaG5hbWVjaXJjbGU9MTI5NDg7dC5pZGVvZ3JhcGhzdW5jaXJjbGU9MTI5NDQ7dC5pZGVvZ3JhcGh3YXRlcmNpcmNsZT0xMjk0MDt0LmlkZW9ncmFwaHdvb2RjaXJjbGU9MTI5NDE7dC5pZGV2YT0yMzExO3QuaWRpZXJlc2lzPTIzOTt0LmlkaWVyZXNpc2FjdXRlPTc3Mjc7dC5pZGllcmVzaXNjeXJpbGxpYz0xMjUzO3QuaWRvdGJlbG93PTc4ODM7dC5pZWJyZXZlY3lyaWxsaWM9MTIzOTt0LmllY3lyaWxsaWM9MTA3Nzt0LmlldW5nYWNpcmNsZWtvcmVhbj0xMjkxNzt0LmlldW5nYXBhcmVua29yZWFuPTEyODIxO3QuaWV1bmdjaXJjbGVrb3JlYW49MTI5MDM7dC5pZXVuZ2tvcmVhbj0xMjYxNTt0LmlldW5ncGFyZW5rb3JlYW49MTI4MDc7dC5pZ3JhdmU9MjM2O3QuaWd1amFyYXRpPTI2OTU7dC5pZ3VybXVraGk9MjU2Nzt0LmloaXJhZ2FuYT0xMjM1Njt0Lmlob29rYWJvdmU9Nzg4MTt0LmlpYmVuZ2FsaT0yNDQwO3QuaWljeXJpbGxpYz0xMDgwO3QuaWlkZXZhPTIzMTI7dC5paWd1amFyYXRpPTI2OTY7dC5paWd1cm11a2hpPTI1Njg7dC5paW1hdHJhZ3VybXVraGk9MjYyNDt0LmlpbnZlcnRlZGJyZXZlPTUyMzt0Lmlpc2hvcnRjeXJpbGxpYz0xMDgxO3QuaWl2b3dlbHNpZ25iZW5nYWxpPTI0OTY7dC5paXZvd2Vsc2lnbmRldmE9MjM2ODt0Lmlpdm93ZWxzaWduZ3VqYXJhdGk9Mjc1Mjt0LmlqPTMwNzt0LmlrYXRha2FuYT0xMjQ1Mjt0LmlrYXRha2FuYWhhbGZ3aWR0aD02NTM5NDt0Lmlrb3JlYW49MTI2NDM7dC5pbGRlPTczMjt0LmlsdXloZWJyZXc9MTQ1Mjt0LmltYWNyb249Mjk5O3QuaW1hY3JvbmN5cmlsbGljPTEyNTE7dC5pbWFnZW9yYXBwcm94aW1hdGVseWVxdWFsPTg3ODc7dC5pbWF0cmFndXJtdWtoaT0yNjIzO3QuaW1vbm9zcGFjZT02NTM1Mzt0LmluY3JlbWVudD04NzEwO3QuaW5maW5pdHk9ODczNDt0LmluaWFybWVuaWFuPTEzODc7dC5pbnRlZ3JhbD04NzQ3O3QuaW50ZWdyYWxib3R0b209ODk5Mzt0LmludGVncmFsYnQ9ODk5Mzt0LmludGVncmFsZXg9NjM3MzM7dC5pbnRlZ3JhbHRvcD04OTkyO3QuaW50ZWdyYWx0cD04OTkyO3QuaW50ZXJzZWN0aW9uPTg3NDU7dC5pbnRpc3F1YXJlPTEzMDYxO3QuaW52YnVsbGV0PTk2ODg7dC5pbnZjaXJjbGU9OTY4OTt0LmludnNtaWxlZmFjZT05Nzg3O3QuaW9jeXJpbGxpYz0xMTA1O3QuaW9nb25laz0zMDM7dC5pb3RhPTk1Mzt0LmlvdGFkaWVyZXNpcz05NzA7dC5pb3RhZGllcmVzaXN0b25vcz05MTI7dC5pb3RhbGF0aW49NjE3O3QuaW90YXRvbm9zPTk0Mzt0LmlwYXJlbj05MzgwO3QuaXJpZ3VybXVraGk9MjY3NDt0LmlzbWFsbGhpcmFnYW5hPTEyMzU1O3QuaXNtYWxsa2F0YWthbmE9MTI0NTE7dC5pc21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM4NDt0Lmlzc2hhcmJlbmdhbGk9MjU1NDt0LmlzdHJva2U9NjE2O3QuaXN1cGVyaW9yPTYzMjEzO3QuaXRlcmF0aW9uaGlyYWdhbmE9MTI0NDU7dC5pdGVyYXRpb25rYXRha2FuYT0xMjU0MTt0Lml0aWxkZT0yOTc7dC5pdGlsZGViZWxvdz03NzI1O3QuaXVib3BvbW9mbz0xMjU4NTt0Lml1Y3lyaWxsaWM9MTEwMjt0Lml2b3dlbHNpZ25iZW5nYWxpPTI0OTU7dC5pdm93ZWxzaWduZGV2YT0yMzY3O3QuaXZvd2Vsc2lnbmd1amFyYXRpPTI3NTE7dC5pemhpdHNhY3lyaWxsaWM9MTE0MTt0Lml6aGl0c2FkYmxncmF2ZWN5cmlsbGljPTExNDM7dC5qPTEwNjt0LmphYXJtZW5pYW49MTM5Mzt0LmphYmVuZ2FsaT0yNDYwO3QuamFkZXZhPTIzMzI7dC5qYWd1amFyYXRpPTI3MTY7dC5qYWd1cm11a2hpPTI1ODg7dC5qYm9wb21vZm89MTI1NjA7dC5qY2Fyb249NDk2O3QuamNpcmNsZT05NDMzO3QuamNpcmN1bWZsZXg9MzA5O3QuamNyb3NzZWR0YWlsPTY2OTt0Lmpkb3RsZXNzc3Ryb2tlPTYwNzt0LmplY3lyaWxsaWM9MTExMjt0LmplZW1hcmFiaWM9MTU4MDt0LmplZW1maW5hbGFyYWJpYz02NTE4Mjt0LmplZW1pbml0aWFsYXJhYmljPTY1MTgzO3QuamVlbW1lZGlhbGFyYWJpYz02NTE4NDt0LmplaGFyYWJpYz0xNjg4O3QuamVoZmluYWxhcmFiaWM9NjQzOTU7dC5qaGFiZW5nYWxpPTI0NjE7dC5qaGFkZXZhPTIzMzM7dC5qaGFndWphcmF0aT0yNzE3O3QuamhhZ3VybXVraGk9MjU4OTt0LmpoZWhhcm1lbmlhbj0xNDAzO3QuamlzPTEyMjkyO3Quam1vbm9zcGFjZT02NTM1NDt0LmpwYXJlbj05MzgxO3QuanN1cGVyaW9yPTY5MDt0Lms9MTA3O3Qua2FiYXNoa2lyY3lyaWxsaWM9MTE4NTt0LmthYmVuZ2FsaT0yNDUzO3Qua2FjdXRlPTc3Mjk7dC5rYWN5cmlsbGljPTEwODI7dC5rYWRlc2NlbmRlcmN5cmlsbGljPTExNzk7dC5rYWRldmE9MjMyNTt0LmthZj0xNDk5O3Qua2FmYXJhYmljPTE2MDM7dC5rYWZkYWdlc2g9NjQzMTU7dC5rYWZkYWdlc2hoZWJyZXc9NjQzMTU7dC5rYWZmaW5hbGFyYWJpYz02NTI0Mjt0LmthZmhlYnJldz0xNDk5O3Qua2FmaW5pdGlhbGFyYWJpYz02NTI0Mzt0LmthZm1lZGlhbGFyYWJpYz02NTI0NDt0LmthZnJhZmVoZWJyZXc9NjQzMzM7dC5rYWd1amFyYXRpPTI3MDk7dC5rYWd1cm11a2hpPTI1ODE7dC5rYWhpcmFnYW5hPTEyMzYzO3Qua2Fob29rY3lyaWxsaWM9MTIyMDt0Lmtha2F0YWthbmE9MTI0NTk7dC5rYWthdGFrYW5haGFsZndpZHRoPTY1Mzk4O3Qua2FwcGE9OTU0O3Qua2FwcGFzeW1ib2xncmVlaz0xMDA4O3Qua2FweWVvdW5taWV1bWtvcmVhbj0xMjY1Nzt0LmthcHllb3VucGhpZXVwaGtvcmVhbj0xMjY3Njt0LmthcHllb3VucGlldXBrb3JlYW49MTI2NjQ7dC5rYXB5ZW91bnNzYW5ncGlldXBrb3JlYW49MTI2NjU7dC5rYXJvcmlpc3F1YXJlPTEzMDY5O3Qua2FzaGlkYWF1dG9hcmFiaWM9MTYwMDt0Lmthc2hpZGFhdXRvbm9zaWRlYmVhcmluZ2FyYWJpYz0xNjAwO3Qua2FzbWFsbGthdGFrYW5hPTEyNTMzO3Qua2FzcXVhcmU9MTMxODg7dC5rYXNyYWFyYWJpYz0xNjE2O3Qua2FzcmF0YW5hcmFiaWM9MTYxMzt0Lmthc3Ryb2tlY3lyaWxsaWM9MTE4Mzt0LmthdGFoaXJhcHJvbG9uZ21hcmtoYWxmd2lkdGg9NjUzOTI7dC5rYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTE4MTt0Lmtib3BvbW9mbz0xMjU1ODt0LmtjYWxzcXVhcmU9MTMxOTM7dC5rY2Fyb249NDg5O3Qua2NlZGlsbGE9MzExO3Qua2NpcmNsZT05NDM0O3Qua2NvbW1hYWNjZW50PTMxMTt0Lmtkb3RiZWxvdz03NzMxO3Qua2VoYXJtZW5pYW49MTQxMjt0LmtlaGlyYWdhbmE9MTIzNjk7dC5rZWthdGFrYW5hPTEyNDY1O3Qua2VrYXRha2FuYWhhbGZ3aWR0aD02NTQwMTt0LmtlbmFybWVuaWFuPTEzOTE7dC5rZXNtYWxsa2F0YWthbmE9MTI1MzQ7dC5rZ3JlZW5sYW5kaWM9MzEyO3Qua2hhYmVuZ2FsaT0yNDU0O3Qua2hhY3lyaWxsaWM9MTA5Mzt0LmtoYWRldmE9MjMyNjt0LmtoYWd1amFyYXRpPTI3MTA7dC5raGFndXJtdWtoaT0yNTgyO3Qua2hhaGFyYWJpYz0xNTgyO3Qua2hhaGZpbmFsYXJhYmljPTY1MTkwO3Qua2hhaGluaXRpYWxhcmFiaWM9NjUxOTE7dC5raGFobWVkaWFsYXJhYmljPTY1MTkyO3Qua2hlaWNvcHRpYz05OTk7dC5raGhhZGV2YT0yMzkzO3Qua2hoYWd1cm11a2hpPTI2NDk7dC5raGlldWtoYWNpcmNsZWtvcmVhbj0xMjkyMDt0LmtoaWV1a2hhcGFyZW5rb3JlYW49MTI4MjQ7dC5raGlldWtoY2lyY2xla29yZWFuPTEyOTA2O3Qua2hpZXVraGtvcmVhbj0xMjYxOTt0LmtoaWV1a2hwYXJlbmtvcmVhbj0xMjgxMDt0Lmtob2toYWl0aGFpPTM1ODY7dC5raG9raG9udGhhaT0zNTg5O3Qua2hva2h1YXR0aGFpPTM1ODc7dC5raG9raHdhaXRoYWk9MzU4ODt0Lmtob211dHRoYWk9MzY3NTt0Lmtob29rPTQwOTt0Lmtob3Jha2hhbmd0aGFpPTM1OTA7dC5raHpzcXVhcmU9MTMyMDE7dC5raWhpcmFnYW5hPTEyMzY1O3Qua2lrYXRha2FuYT0xMjQ2MTt0Lmtpa2F0YWthbmFoYWxmd2lkdGg9NjUzOTk7dC5raXJvZ3VyYW11c3F1YXJlPTEzMDc3O3Qua2lyb21lZXRvcnVzcXVhcmU9MTMwNzg7dC5raXJvc3F1YXJlPTEzMDc2O3Qua2l5ZW9rYWNpcmNsZWtvcmVhbj0xMjkxMDt0LmtpeWVva2FwYXJlbmtvcmVhbj0xMjgxNDt0LmtpeWVva2NpcmNsZWtvcmVhbj0xMjg5Njt0LmtpeWVva2tvcmVhbj0xMjU5Mzt0LmtpeWVva3BhcmVua29yZWFuPTEyODAwO3Qua2l5ZW9rc2lvc2tvcmVhbj0xMjU5NTt0LmtqZWN5cmlsbGljPTExMTY7dC5rbGluZWJlbG93PTc3MzM7dC5rbHNxdWFyZT0xMzIwODt0LmttY3ViZWRzcXVhcmU9MTMyMjI7dC5rbW9ub3NwYWNlPTY1MzU1O3Qua21zcXVhcmVkc3F1YXJlPTEzMjE4O3Qua29oaXJhZ2FuYT0xMjM3MTt0LmtvaG1zcXVhcmU9MTMyNDg7dC5rb2thaXRoYWk9MzU4NTt0Lmtva2F0YWthbmE9MTI0Njc7dC5rb2thdGFrYW5haGFsZndpZHRoPTY1NDAyO3Qua29vcG9zcXVhcmU9MTMwODY7dC5rb3BwYWN5cmlsbGljPTExNTM7dC5rb3JlYW5zdGFuZGFyZHN5bWJvbD0xMjkyNzt0Lmtvcm9uaXNjbWI9ODM1O3Qua3BhcmVuPTkzODI7dC5rcGFzcXVhcmU9MTMyMjY7dC5rc2ljeXJpbGxpYz0xMTM1O3Qua3RzcXVhcmU9MTMyNjM7dC5rdHVybmVkPTY3MDt0Lmt1aGlyYWdhbmE9MTIzNjc7dC5rdWthdGFrYW5hPTEyNDYzO3Qua3VrYXRha2FuYWhhbGZ3aWR0aD02NTQwMDt0Lmt2c3F1YXJlPTEzMjQwO3Qua3dzcXVhcmU9MTMyNDY7dC5sPTEwODt0LmxhYmVuZ2FsaT0yNDgyO3QubGFjdXRlPTMxNDt0LmxhZGV2YT0yMzU0O3QubGFndWphcmF0aT0yNzM4O3QubGFndXJtdWtoaT0yNjEwO3QubGFra2hhbmd5YW90aGFpPTM2NTM7dC5sYW1hbGVmZmluYWxhcmFiaWM9NjUyNzY7dC5sYW1hbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljPTY1MjcyO3QubGFtYWxlZmhhbXphYWJvdmVpc29sYXRlZGFyYWJpYz02NTI3MTt0LmxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWM9NjUyNzQ7dC5sYW1hbGVmaGFtemFiZWxvd2lzb2xhdGVkYXJhYmljPTY1MjczO3QubGFtYWxlZmlzb2xhdGVkYXJhYmljPTY1Mjc1O3QubGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYz02NTI3MDt0LmxhbWFsZWZtYWRkYWFib3ZlaXNvbGF0ZWRhcmFiaWM9NjUyNjk7dC5sYW1hcmFiaWM9MTYwNDt0LmxhbWJkYT05NTU7dC5sYW1iZGFzdHJva2U9NDExO3QubGFtZWQ9MTUwMDt0LmxhbWVkZGFnZXNoPTY0MzE2O3QubGFtZWRkYWdlc2hoZWJyZXc9NjQzMTY7dC5sYW1lZGhlYnJldz0xNTAwO3QubGFtZmluYWxhcmFiaWM9NjUyNDY7dC5sYW1oYWhpbml0aWFsYXJhYmljPTY0NzE0O3QubGFtaW5pdGlhbGFyYWJpYz02NTI0Nzt0LmxhbWplZW1pbml0aWFsYXJhYmljPTY0NzEzO3QubGFta2hhaGluaXRpYWxhcmFiaWM9NjQ3MTU7dC5sYW1sYW1oZWhpc29sYXRlZGFyYWJpYz02NTAxMDt0LmxhbW1lZGlhbGFyYWJpYz02NTI0ODt0LmxhbW1lZW1oYWhpbml0aWFsYXJhYmljPTY0OTA0O3QubGFtbWVlbWluaXRpYWxhcmFiaWM9NjQ3MTY7dC5sYXJnZWNpcmNsZT05NzExO3QubGJhcj00MTA7dC5sYmVsdD02MjA7dC5sYm9wb21vZm89MTI1NTY7dC5sY2Fyb249MzE4O3QubGNlZGlsbGE9MzE2O3QubGNpcmNsZT05NDM1O3QubGNpcmN1bWZsZXhiZWxvdz03NzQxO3QubGNvbW1hYWNjZW50PTMxNjt0Lmxkb3Q9MzIwO3QubGRvdGFjY2VudD0zMjA7dC5sZG90YmVsb3c9NzczNTt0Lmxkb3RiZWxvd21hY3Jvbj03NzM3O3QubGVmdGFuZ2xlYWJvdmVjbWI9Nzk0O3QubGVmdHRhY2tiZWxvd2NtYj03OTI7dC5sZXNzPTYwO3QubGVzc2VxdWFsPTg4MDQ7dC5sZXNzZXF1YWxvcmdyZWF0ZXI9ODkyMjt0Lmxlc3Ntb25vc3BhY2U9NjUzMDg7dC5sZXNzb3JlcXVpdmFsZW50PTg4MTg7dC5sZXNzb3JncmVhdGVyPTg4MjI7dC5sZXNzb3ZlcmVxdWFsPTg4MDY7dC5sZXNzc21hbGw9NjUxMjQ7dC5sZXpoPTYyMjt0LmxmYmxvY2s9OTYxMjt0Lmxob29rcmV0cm9mbGV4PTYyMTt0LmxpcmE9ODM1Njt0Lmxpd25hcm1lbmlhbj0xMzg4O3QubGo9NDU3O3QubGplY3lyaWxsaWM9MTExMzt0LmxsPTYzMTY4O3QubGxhZGV2YT0yMzU1O3QubGxhZ3VqYXJhdGk9MjczOTt0LmxsaW5lYmVsb3c9NzczOTt0LmxsbGFkZXZhPTIzNTY7dC5sbHZvY2FsaWNiZW5nYWxpPTI1Mjk7dC5sbHZvY2FsaWNkZXZhPTI0MDE7dC5sbHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpPTI1MzE7dC5sbHZvY2FsaWN2b3dlbHNpZ25kZXZhPTI0MDM7dC5sbWlkZGxldGlsZGU9NjE5O3QubG1vbm9zcGFjZT02NTM1Njt0Lmxtc3F1YXJlPTEzMjY0O3QubG9jaHVsYXRoYWk9MzYyODt0LmxvZ2ljYWxhbmQ9ODc0Mzt0LmxvZ2ljYWxub3Q9MTcyO3QubG9naWNhbG5vdHJldmVyc2VkPTg5NzY7dC5sb2dpY2Fsb3I9ODc0NDt0LmxvbGluZ3RoYWk9MzYyMTt0LmxvbmdzPTM4Mzt0Lmxvd2xpbmVjZW50ZXJsaW5lPTY1MTAyO3QubG93bGluZWNtYj04MTg7dC5sb3dsaW5lZGFzaGVkPTY1MTAxO3QubG96ZW5nZT05Njc0O3QubHBhcmVuPTkzODM7dC5sc2xhc2g9MzIyO3QubHNxdWFyZT04NDY3O3QubHN1cGVyaW9yPTYzMjE0O3QubHRzaGFkZT05NjE3O3QubHV0aGFpPTM2MjI7dC5sdm9jYWxpY2JlbmdhbGk9MjQ0NDt0Lmx2b2NhbGljZGV2YT0yMzE2O3QubHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpPTI1MzA7dC5sdm9jYWxpY3Zvd2Vsc2lnbmRldmE9MjQwMjt0Lmx4c3F1YXJlPTEzMjY3O3QubT0xMDk7dC5tYWJlbmdhbGk9MjQ3ODt0Lm1hY3Jvbj0xNzU7dC5tYWNyb25iZWxvd2NtYj04MTc7dC5tYWNyb25jbWI9NzcyO3QubWFjcm9ubG93bW9kPTcxNzt0Lm1hY3Jvbm1vbm9zcGFjZT02NTUwNzt0Lm1hY3V0ZT03NzQzO3QubWFkZXZhPTIzNTA7dC5tYWd1amFyYXRpPTI3MzQ7dC5tYWd1cm11a2hpPTI2MDY7dC5tYWhhcGFraGhlYnJldz0xNDQ0O3QubWFoYXBha2hsZWZ0aGVicmV3PTE0NDQ7dC5tYWhpcmFnYW5hPTEyNDE0O3QubWFpY2hhdHRhd2Fsb3dsZWZ0dGhhaT02MzYzNzt0Lm1haWNoYXR0YXdhbG93cmlnaHR0aGFpPTYzNjM2O3QubWFpY2hhdHRhd2F0aGFpPTM2NTk7dC5tYWljaGF0dGF3YXVwcGVybGVmdHRoYWk9NjM2MzU7dC5tYWlla2xvd2xlZnR0aGFpPTYzNjI4O3QubWFpZWtsb3dyaWdodHRoYWk9NjM2Mjc7dC5tYWlla3RoYWk9MzY1Njt0Lm1haWVrdXBwZXJsZWZ0dGhhaT02MzYyNjt0Lm1haWhhbmFrYXRsZWZ0dGhhaT02MzYyMDt0Lm1haWhhbmFrYXR0aGFpPTM2MzM7dC5tYWl0YWlraHVsZWZ0dGhhaT02MzYyNTt0Lm1haXRhaWtodXRoYWk9MzY1NTt0Lm1haXRob2xvd2xlZnR0aGFpPTYzNjMxO3QubWFpdGhvbG93cmlnaHR0aGFpPTYzNjMwO3QubWFpdGhvdGhhaT0zNjU3O3QubWFpdGhvdXBwZXJsZWZ0dGhhaT02MzYyOTt0Lm1haXRyaWxvd2xlZnR0aGFpPTYzNjM0O3QubWFpdHJpbG93cmlnaHR0aGFpPTYzNjMzO3QubWFpdHJpdGhhaT0zNjU4O3QubWFpdHJpdXBwZXJsZWZ0dGhhaT02MzYzMjt0Lm1haXlhbW9rdGhhaT0zNjU0O3QubWFrYXRha2FuYT0xMjUxMDt0Lm1ha2F0YWthbmFoYWxmd2lkdGg9NjU0MjM7dC5tYWxlPTk3OTQ7dC5tYW5zeW9uc3F1YXJlPTEzMTI3O3QubWFxYWZoZWJyZXc9MTQ3MDt0Lm1hcnM9OTc5NDt0Lm1hc29yYWNpcmNsZWhlYnJldz0xNDU1O3QubWFzcXVhcmU9MTMxODc7dC5tYm9wb21vZm89MTI1NTE7dC5tYnNxdWFyZT0xMzI2ODt0Lm1jaXJjbGU9OTQzNjt0Lm1jdWJlZHNxdWFyZT0xMzIyMTt0Lm1kb3RhY2NlbnQ9Nzc0NTt0Lm1kb3RiZWxvdz03NzQ3O3QubWVlbWFyYWJpYz0xNjA1O3QubWVlbWZpbmFsYXJhYmljPTY1MjUwO3QubWVlbWluaXRpYWxhcmFiaWM9NjUyNTE7dC5tZWVtbWVkaWFsYXJhYmljPTY1MjUyO3QubWVlbW1lZW1pbml0aWFsYXJhYmljPTY0NzIxO3QubWVlbW1lZW1pc29sYXRlZGFyYWJpYz02NDU4NDt0Lm1lZXRvcnVzcXVhcmU9MTMxMzM7dC5tZWhpcmFnYW5hPTEyNDE3O3QubWVpemllcmFzcXVhcmU9MTMxODI7dC5tZWthdGFrYW5hPTEyNTEzO3QubWVrYXRha2FuYWhhbGZ3aWR0aD02NTQyNjt0Lm1lbT0xNTAyO3QubWVtZGFnZXNoPTY0MzE4O3QubWVtZGFnZXNoaGVicmV3PTY0MzE4O3QubWVtaGVicmV3PTE1MDI7dC5tZW5hcm1lbmlhbj0xMzk2O3QubWVya2hhaGVicmV3PTE0NDU7dC5tZXJraGFrZWZ1bGFoZWJyZXc9MTQ0Njt0Lm1lcmtoYWtlZnVsYWxlZnRoZWJyZXc9MTQ0Njt0Lm1lcmtoYWxlZnRoZWJyZXc9MTQ0NTt0Lm1ob29rPTYyNTt0Lm1oenNxdWFyZT0xMzIwMjt0Lm1pZGRsZWRvdGthdGFrYW5haGFsZndpZHRoPTY1MzgxO3QubWlkZG90PTE4Mzt0Lm1pZXVtYWNpcmNsZWtvcmVhbj0xMjkxNDt0Lm1pZXVtYXBhcmVua29yZWFuPTEyODE4O3QubWlldW1jaXJjbGVrb3JlYW49MTI5MDA7dC5taWV1bWtvcmVhbj0xMjYwOTt0Lm1pZXVtcGFuc2lvc2tvcmVhbj0xMjY1Njt0Lm1pZXVtcGFyZW5rb3JlYW49MTI4MDQ7dC5taWV1bXBpZXVwa29yZWFuPTEyNjU0O3QubWlldW1zaW9za29yZWFuPTEyNjU1O3QubWloaXJhZ2FuYT0xMjQxNTt0Lm1pa2F0YWthbmE9MTI1MTE7dC5taWthdGFrYW5haGFsZndpZHRoPTY1NDI0O3QubWludXM9ODcyMjt0Lm1pbnVzYmVsb3djbWI9ODAwO3QubWludXNjaXJjbGU9ODg1NDt0Lm1pbnVzbW9kPTcyNzt0Lm1pbnVzcGx1cz04NzIzO3QubWludXRlPTgyNDI7dC5taXJpYmFhcnVzcXVhcmU9MTMxMzA7dC5taXJpc3F1YXJlPTEzMTI5O3QubWxvbmdsZWd0dXJuZWQ9NjI0O3QubWxzcXVhcmU9MTMyMDY7dC5tbWN1YmVkc3F1YXJlPTEzMjE5O3QubW1vbm9zcGFjZT02NTM1Nzt0Lm1tc3F1YXJlZHNxdWFyZT0xMzIxNTt0Lm1vaGlyYWdhbmE9MTI0MTg7dC5tb2htc3F1YXJlPTEzMjQ5O3QubW9rYXRha2FuYT0xMjUxNDt0Lm1va2F0YWthbmFoYWxmd2lkdGg9NjU0Mjc7dC5tb2xzcXVhcmU9MTMyNzA7dC5tb21hdGhhaT0zNjE3O3QubW92ZXJzc3F1YXJlPTEzMjIzO3QubW92ZXJzc3F1YXJlZHNxdWFyZT0xMzIyNDt0Lm1wYXJlbj05Mzg0O3QubXBhc3F1YXJlPTEzMjI3O3QubXNzcXVhcmU9MTMyMzU7dC5tc3VwZXJpb3I9NjMyMTU7dC5tdHVybmVkPTYyMzt0Lm11PTE4MTt0Lm11MT0xODE7dC5tdWFzcXVhcmU9MTMxODY7dC5tdWNoZ3JlYXRlcj04ODExO3QubXVjaGxlc3M9ODgxMDt0Lm11ZnNxdWFyZT0xMzE5Njt0Lm11Z3JlZWs9OTU2O3QubXVnc3F1YXJlPTEzMTk3O3QubXVoaXJhZ2FuYT0xMjQxNjt0Lm11a2F0YWthbmE9MTI1MTI7dC5tdWthdGFrYW5haGFsZndpZHRoPTY1NDI1O3QubXVsc3F1YXJlPTEzMjA1O3QubXVsdGlwbHk9MjE1O3QubXVtc3F1YXJlPTEzMjExO3QubXVuYWhoZWJyZXc9MTQ0Mzt0Lm11bmFobGVmdGhlYnJldz0xNDQzO3QubXVzaWNhbG5vdGU9OTgzNDt0Lm11c2ljYWxub3RlZGJsPTk4MzU7dC5tdXNpY2ZsYXRzaWduPTk4Mzc7dC5tdXNpY3NoYXJwc2lnbj05ODM5O3QubXVzc3F1YXJlPTEzMjM0O3QubXV2c3F1YXJlPTEzMjM4O3QubXV3c3F1YXJlPTEzMjQ0O3QubXZtZWdhc3F1YXJlPTEzMjQxO3QubXZzcXVhcmU9MTMyMzk7dC5td21lZ2FzcXVhcmU9MTMyNDc7dC5td3NxdWFyZT0xMzI0NTt0Lm49MTEwO3QubmFiZW5nYWxpPTI0NzI7dC5uYWJsYT04NzExO3QubmFjdXRlPTMyNDt0Lm5hZGV2YT0yMzQ0O3QubmFndWphcmF0aT0yNzI4O3QubmFndXJtdWtoaT0yNjAwO3QubmFoaXJhZ2FuYT0xMjM5NDt0Lm5ha2F0YWthbmE9MTI0OTA7dC5uYWthdGFrYW5haGFsZndpZHRoPTY1NDEzO3QubmFwb3N0cm9waGU9MzI5O3QubmFzcXVhcmU9MTMxODU7dC5uYm9wb21vZm89MTI1NTU7dC5uYnNwYWNlPTE2MDt0Lm5jYXJvbj0zMjg7dC5uY2VkaWxsYT0zMjY7dC5uY2lyY2xlPTk0Mzc7dC5uY2lyY3VtZmxleGJlbG93PTc3NTU7dC5uY29tbWFhY2NlbnQ9MzI2O3QubmRvdGFjY2VudD03NzQ5O3QubmRvdGJlbG93PTc3NTE7dC5uZWhpcmFnYW5hPTEyMzk3O3QubmVrYXRha2FuYT0xMjQ5Mzt0Lm5la2F0YWthbmFoYWxmd2lkdGg9NjU0MTY7dC5uZXdzaGVxZWxzaWduPTgzNjI7dC5uZnNxdWFyZT0xMzE5NTt0Lm5nYWJlbmdhbGk9MjQ1Nzt0Lm5nYWRldmE9MjMyOTt0Lm5nYWd1amFyYXRpPTI3MTM7dC5uZ2FndXJtdWtoaT0yNTg1O3Qubmdvbmd1dGhhaT0zNTkxO3QubmhpcmFnYW5hPTEyNDM1O3Qubmhvb2tsZWZ0PTYyNjt0Lm5ob29rcmV0cm9mbGV4PTYyNzt0Lm5pZXVuYWNpcmNsZWtvcmVhbj0xMjkxMTt0Lm5pZXVuYXBhcmVua29yZWFuPTEyODE1O3QubmlldW5jaWV1Y2tvcmVhbj0xMjU5Nzt0Lm5pZXVuY2lyY2xla29yZWFuPTEyODk3O3QubmlldW5oaWV1aGtvcmVhbj0xMjU5ODt0Lm5pZXVua29yZWFuPTEyNTk2O3QubmlldW5wYW5zaW9za29yZWFuPTEyNjQ4O3QubmlldW5wYXJlbmtvcmVhbj0xMjgwMTt0Lm5pZXVuc2lvc2tvcmVhbj0xMjY0Nzt0Lm5pZXVudGlrZXV0a29yZWFuPTEyNjQ2O3QubmloaXJhZ2FuYT0xMjM5NTt0Lm5pa2F0YWthbmE9MTI0OTE7dC5uaWthdGFrYW5haGFsZndpZHRoPTY1NDE0O3QubmlraGFoaXRsZWZ0dGhhaT02MzY0MTt0Lm5pa2hhaGl0dGhhaT0zNjYxO3QubmluZT01Nzt0Lm5pbmVhcmFiaWM9MTY0MTt0Lm5pbmViZW5nYWxpPTI1NDM7dC5uaW5lY2lyY2xlPTkzMjA7dC5uaW5lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEzMDt0Lm5pbmVkZXZhPTI0MTU7dC5uaW5lZ3VqYXJhdGk9Mjc5OTt0Lm5pbmVndXJtdWtoaT0yNjcxO3QubmluZWhhY2thcmFiaWM9MTY0MTt0Lm5pbmVoYW5nemhvdT0xMjMyOTt0Lm5pbmVpZGVvZ3JhcGhpY3BhcmVuPTEyODQwO3QubmluZWluZmVyaW9yPTgzMjk7dC5uaW5lbW9ub3NwYWNlPTY1MzA1O3QubmluZW9sZHN0eWxlPTYzMjg5O3QubmluZXBhcmVuPTkzNDA7dC5uaW5lcGVyaW9kPTkzNjA7dC5uaW5lcGVyc2lhbj0xNzg1O3QubmluZXJvbWFuPTg1Njg7dC5uaW5lc3VwZXJpb3I9ODMxMzt0Lm5pbmV0ZWVuY2lyY2xlPTkzMzA7dC5uaW5ldGVlbnBhcmVuPTkzNTA7dC5uaW5ldGVlbnBlcmlvZD05MzcwO3QubmluZXRoYWk9MzY3Mzt0Lm5qPTQ2MDt0Lm5qZWN5cmlsbGljPTExMTQ7dC5ua2F0YWthbmE9MTI1MzE7dC5ua2F0YWthbmFoYWxmd2lkdGg9NjU0Mzc7dC5ubGVncmlnaHRsb25nPTQxNDt0Lm5saW5lYmVsb3c9Nzc1Mzt0Lm5tb25vc3BhY2U9NjUzNTg7dC5ubXNxdWFyZT0xMzIxMDt0Lm5uYWJlbmdhbGk9MjQ2Nzt0Lm5uYWRldmE9MjMzOTt0Lm5uYWd1amFyYXRpPTI3MjM7dC5ubmFndXJtdWtoaT0yNTk1O3Qubm5uYWRldmE9MjM0NTt0Lm5vaGlyYWdhbmE9MTIzOTg7dC5ub2thdGFrYW5hPTEyNDk0O3Qubm9rYXRha2FuYWhhbGZ3aWR0aD02NTQxNzt0Lm5vbmJyZWFraW5nc3BhY2U9MTYwO3Qubm9uZW50aGFpPTM2MDM7dC5ub251dGhhaT0zNjA5O3Qubm9vbmFyYWJpYz0xNjA2O3Qubm9vbmZpbmFsYXJhYmljPTY1MjU0O3Qubm9vbmdodW5uYWFyYWJpYz0xNzIyO3Qubm9vbmdodW5uYWZpbmFsYXJhYmljPTY0NDE1O3Qubm9vbmluaXRpYWxhcmFiaWM9NjUyNTU7dC5ub29uamVlbWluaXRpYWxhcmFiaWM9NjQ3MjI7dC5ub29uamVlbWlzb2xhdGVkYXJhYmljPTY0NTg3O3Qubm9vbm1lZGlhbGFyYWJpYz02NTI1Njt0Lm5vb25tZWVtaW5pdGlhbGFyYWJpYz02NDcyNTt0Lm5vb25tZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1OTA7dC5ub29ubm9vbmZpbmFsYXJhYmljPTY0NjUzO3Qubm90Y29udGFpbnM9ODcxNjt0Lm5vdGVsZW1lbnQ9ODcxMzt0Lm5vdGVsZW1lbnRvZj04NzEzO3Qubm90ZXF1YWw9ODgwMDt0Lm5vdGdyZWF0ZXI9ODgxNTt0Lm5vdGdyZWF0ZXJub3JlcXVhbD04ODE3O3Qubm90Z3JlYXRlcm5vcmxlc3M9ODgyNTt0Lm5vdGlkZW50aWNhbD04ODAyO3Qubm90bGVzcz04ODE0O3Qubm90bGVzc25vcmVxdWFsPTg4MTY7dC5ub3RwYXJhbGxlbD04NzQyO3Qubm90cHJlY2VkZXM9ODgzMjt0Lm5vdHN1YnNldD04ODM2O3Qubm90c3VjY2VlZHM9ODgzMzt0Lm5vdHN1cGVyc2V0PTg4Mzc7dC5ub3dhcm1lbmlhbj0xMzk4O3QubnBhcmVuPTkzODU7dC5uc3NxdWFyZT0xMzIzMzt0Lm5zdXBlcmlvcj04MzE5O3QubnRpbGRlPTI0MTt0Lm51PTk1Nzt0Lm51aGlyYWdhbmE9MTIzOTY7dC5udWthdGFrYW5hPTEyNDkyO3QubnVrYXRha2FuYWhhbGZ3aWR0aD02NTQxNTt0Lm51a3RhYmVuZ2FsaT0yNDkyO3QubnVrdGFkZXZhPTIzNjQ7dC5udWt0YWd1amFyYXRpPTI3NDg7dC5udWt0YWd1cm11a2hpPTI2MjA7dC5udW1iZXJzaWduPTM1O3QubnVtYmVyc2lnbm1vbm9zcGFjZT02NTI4Mzt0Lm51bWJlcnNpZ25zbWFsbD02NTExOTt0Lm51bWVyYWxzaWduZ3JlZWs9ODg0O3QubnVtZXJhbHNpZ25sb3dlcmdyZWVrPTg4NTt0Lm51bWVybz04NDcwO3QubnVuPTE1MDQ7dC5udW5kYWdlc2g9NjQzMjA7dC5udW5kYWdlc2hoZWJyZXc9NjQzMjA7dC5udW5oZWJyZXc9MTUwNDt0Lm52c3F1YXJlPTEzMjM3O3QubndzcXVhcmU9MTMyNDM7dC5ueWFiZW5nYWxpPTI0NjI7dC5ueWFkZXZhPTIzMzQ7dC5ueWFndWphcmF0aT0yNzE4O3QubnlhZ3VybXVraGk9MjU5MDt0Lm89MTExO3Qub2FjdXRlPTI0Mzt0Lm9hbmd0aGFpPTM2Mjk7dC5vYmFycmVkPTYyOTt0Lm9iYXJyZWRjeXJpbGxpYz0xMjU3O3Qub2JhcnJlZGRpZXJlc2lzY3lyaWxsaWM9MTI1OTt0Lm9iZW5nYWxpPTI0NTE7dC5vYm9wb21vZm89MTI1NzE7dC5vYnJldmU9MzM1O3Qub2NhbmRyYWRldmE9MjMyMTt0Lm9jYW5kcmFndWphcmF0aT0yNzA1O3Qub2NhbmRyYXZvd2Vsc2lnbmRldmE9MjM3Nzt0Lm9jYW5kcmF2b3dlbHNpZ25ndWphcmF0aT0yNzYxO3Qub2Nhcm9uPTQ2Njt0Lm9jaXJjbGU9OTQzODt0Lm9jaXJjdW1mbGV4PTI0NDt0Lm9jaXJjdW1mbGV4YWN1dGU9Nzg4OTt0Lm9jaXJjdW1mbGV4ZG90YmVsb3c9Nzg5Nzt0Lm9jaXJjdW1mbGV4Z3JhdmU9Nzg5MTt0Lm9jaXJjdW1mbGV4aG9va2Fib3ZlPTc4OTM7dC5vY2lyY3VtZmxleHRpbGRlPTc4OTU7dC5vY3lyaWxsaWM9MTA4Njt0Lm9kYmxhY3V0ZT0zMzc7dC5vZGJsZ3JhdmU9NTI1O3Qub2RldmE9MjMyMzt0Lm9kaWVyZXNpcz0yNDY7dC5vZGllcmVzaXNjeXJpbGxpYz0xMjU1O3Qub2RvdGJlbG93PTc4ODU7dC5vZT0zMzk7dC5vZWtvcmVhbj0xMjYzNDt0Lm9nb25laz03MzE7dC5vZ29uZWtjbWI9ODA4O3Qub2dyYXZlPTI0Mjt0Lm9ndWphcmF0aT0yNzA3O3Qub2hhcm1lbmlhbj0xNDEzO3Qub2hpcmFnYW5hPTEyMzYyO3Qub2hvb2thYm92ZT03ODg3O3Qub2hvcm49NDE3O3Qub2hvcm5hY3V0ZT03ODk5O3Qub2hvcm5kb3RiZWxvdz03OTA3O3Qub2hvcm5ncmF2ZT03OTAxO3Qub2hvcm5ob29rYWJvdmU9NzkwMzt0Lm9ob3JudGlsZGU9NzkwNTt0Lm9odW5nYXJ1bWxhdXQ9MzM3O3Qub2k9NDE5O3Qub2ludmVydGVkYnJldmU9NTI3O3Qub2thdGFrYW5hPTEyNDU4O3Qub2thdGFrYW5haGFsZndpZHRoPTY1Mzk3O3Qub2tvcmVhbj0xMjYzMTt0Lm9sZWhlYnJldz0xNDUxO3Qub21hY3Jvbj0zMzM7dC5vbWFjcm9uYWN1dGU9Nzc2Mzt0Lm9tYWNyb25ncmF2ZT03NzYxO3Qub21kZXZhPTIzODQ7dC5vbWVnYT05Njk7dC5vbWVnYTE9OTgyO3Qub21lZ2FjeXJpbGxpYz0xMTIxO3Qub21lZ2FsYXRpbmNsb3NlZD02MzE7dC5vbWVnYXJvdW5kY3lyaWxsaWM9MTE0Nzt0Lm9tZWdhdGl0bG9jeXJpbGxpYz0xMTQ5O3Qub21lZ2F0b25vcz05NzQ7dC5vbWd1amFyYXRpPTI3Njg7dC5vbWljcm9uPTk1OTt0Lm9taWNyb250b25vcz05NzI7dC5vbW9ub3NwYWNlPTY1MzU5O3Qub25lPTQ5O3Qub25lYXJhYmljPTE2MzM7dC5vbmViZW5nYWxpPTI1MzU7dC5vbmVjaXJjbGU9OTMxMjt0Lm9uZWNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjI7dC5vbmVkZXZhPTI0MDc7dC5vbmVkb3RlbmxlYWRlcj04MjI4O3Qub25lZWlnaHRoPTg1Mzk7dC5vbmVmaXR0ZWQ9NjMxOTY7dC5vbmVndWphcmF0aT0yNzkxO3Qub25lZ3VybXVraGk9MjY2Mzt0Lm9uZWhhY2thcmFiaWM9MTYzMzt0Lm9uZWhhbGY9MTg5O3Qub25laGFuZ3pob3U9MTIzMjE7dC5vbmVpZGVvZ3JhcGhpY3BhcmVuPTEyODMyO3Qub25laW5mZXJpb3I9ODMyMTt0Lm9uZW1vbm9zcGFjZT02NTI5Nzt0Lm9uZW51bWVyYXRvcmJlbmdhbGk9MjU0ODt0Lm9uZW9sZHN0eWxlPTYzMjgxO3Qub25lcGFyZW49OTMzMjt0Lm9uZXBlcmlvZD05MzUyO3Qub25lcGVyc2lhbj0xNzc3O3Qub25lcXVhcnRlcj0xODg7dC5vbmVyb21hbj04NTYwO3Qub25lc3VwZXJpb3I9MTg1O3Qub25ldGhhaT0zNjY1O3Qub25ldGhpcmQ9ODUzMTt0Lm9vZ29uZWs9NDkxO3Qub29nb25la21hY3Jvbj00OTM7dC5vb2d1cm11a2hpPTI1Nzk7dC5vb21hdHJhZ3VybXVraGk9MjYzNTt0Lm9vcGVuPTU5Njt0Lm9wYXJlbj05Mzg2O3Qub3BlbmJ1bGxldD05NzAyO3Qub3B0aW9uPTg5OTc7dC5vcmRmZW1pbmluZT0xNzA7dC5vcmRtYXNjdWxpbmU9MTg2O3Qub3J0aG9nb25hbD04NzM1O3Qub3Nob3J0ZGV2YT0yMzIyO3Qub3Nob3J0dm93ZWxzaWduZGV2YT0yMzc4O3Qub3NsYXNoPTI0ODt0Lm9zbGFzaGFjdXRlPTUxMTt0Lm9zbWFsbGhpcmFnYW5hPTEyMzYxO3Qub3NtYWxsa2F0YWthbmE9MTI0NTc7dC5vc21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM4Nzt0Lm9zdHJva2VhY3V0ZT01MTE7dC5vc3VwZXJpb3I9NjMyMTY7dC5vdGN5cmlsbGljPTExNTE7dC5vdGlsZGU9MjQ1O3Qub3RpbGRlYWN1dGU9Nzc1Nzt0Lm90aWxkZWRpZXJlc2lzPTc3NTk7dC5vdWJvcG9tb2ZvPTEyNTc3O3Qub3ZlcmxpbmU9ODI1NDt0Lm92ZXJsaW5lY2VudGVybGluZT02NTA5ODt0Lm92ZXJsaW5lY21iPTc3Mzt0Lm92ZXJsaW5lZGFzaGVkPTY1MDk3O3Qub3ZlcmxpbmVkYmx3YXZ5PTY1MTAwO3Qub3ZlcmxpbmV3YXZ5PTY1MDk5O3Qub3ZlcnNjb3JlPTE3NTt0Lm92b3dlbHNpZ25iZW5nYWxpPTI1MDc7dC5vdm93ZWxzaWduZGV2YT0yMzc5O3Qub3Zvd2Vsc2lnbmd1amFyYXRpPTI3NjM7dC5wPTExMjt0LnBhYW1wc3NxdWFyZT0xMzE4NDt0LnBhYXNlbnRvc3F1YXJlPTEzMDk5O3QucGFiZW5nYWxpPTI0NzQ7dC5wYWN1dGU9Nzc2NTt0LnBhZGV2YT0yMzQ2O3QucGFnZWRvd249ODY3MTt0LnBhZ2V1cD04NjcwO3QucGFndWphcmF0aT0yNzMwO3QucGFndXJtdWtoaT0yNjAyO3QucGFoaXJhZ2FuYT0xMjQwMTt0LnBhaXlhbm5vaXRoYWk9MzYzMTt0LnBha2F0YWthbmE9MTI0OTc7dC5wYWxhdGFsaXphdGlvbmN5cmlsbGljY21iPTExNTY7dC5wYWxvY2hrYWN5cmlsbGljPTEyMTY7dC5wYW5zaW9za29yZWFuPTEyNjcxO3QucGFyYWdyYXBoPTE4Mjt0LnBhcmFsbGVsPTg3NDE7dC5wYXJlbmxlZnQ9NDA7dC5wYXJlbmxlZnRhbHRvbmVhcmFiaWM9NjQ4MzA7dC5wYXJlbmxlZnRidD02MzcyNTt0LnBhcmVubGVmdGV4PTYzNzI0O3QucGFyZW5sZWZ0aW5mZXJpb3I9ODMzMzt0LnBhcmVubGVmdG1vbm9zcGFjZT02NTI4ODt0LnBhcmVubGVmdHNtYWxsPTY1MTEzO3QucGFyZW5sZWZ0c3VwZXJpb3I9ODMxNzt0LnBhcmVubGVmdHRwPTYzNzIzO3QucGFyZW5sZWZ0dmVydGljYWw9NjUwNzc7dC5wYXJlbnJpZ2h0PTQxO3QucGFyZW5yaWdodGFsdG9uZWFyYWJpYz02NDgzMTt0LnBhcmVucmlnaHRidD02MzczNjt0LnBhcmVucmlnaHRleD02MzczNTt0LnBhcmVucmlnaHRpbmZlcmlvcj04MzM0O3QucGFyZW5yaWdodG1vbm9zcGFjZT02NTI4OTt0LnBhcmVucmlnaHRzbWFsbD02NTExNDt0LnBhcmVucmlnaHRzdXBlcmlvcj04MzE4O3QucGFyZW5yaWdodHRwPTYzNzM0O3QucGFyZW5yaWdodHZlcnRpY2FsPTY1MDc4O3QucGFydGlhbGRpZmY9ODcwNjt0LnBhc2VxaGVicmV3PTE0NzI7dC5wYXNodGFoZWJyZXc9MTQzMzt0LnBhc3F1YXJlPTEzMjI1O3QucGF0YWg9MTQ2Mzt0LnBhdGFoMTE9MTQ2Mzt0LnBhdGFoMWQ9MTQ2Mzt0LnBhdGFoMmE9MTQ2Mzt0LnBhdGFoaGVicmV3PTE0NjM7dC5wYXRhaG5hcnJvd2hlYnJldz0xNDYzO3QucGF0YWhxdWFydGVyaGVicmV3PTE0NjM7dC5wYXRhaHdpZGVoZWJyZXc9MTQ2Mzt0LnBhemVyaGVicmV3PTE0NDE7dC5wYm9wb21vZm89MTI1NTA7dC5wY2lyY2xlPTk0Mzk7dC5wZG90YWNjZW50PTc3Njc7dC5wZT0xNTA4O3QucGVjeXJpbGxpYz0xMDg3O3QucGVkYWdlc2g9NjQzMjQ7dC5wZWRhZ2VzaGhlYnJldz02NDMyNDt0LnBlZXppc3F1YXJlPTEzMTE1O3QucGVmaW5hbGRhZ2VzaGhlYnJldz02NDMyMzt0LnBlaGFyYWJpYz0xNjYyO3QucGVoYXJtZW5pYW49MTQwMjt0LnBlaGVicmV3PTE1MDg7dC5wZWhmaW5hbGFyYWJpYz02NDM0Mzt0LnBlaGluaXRpYWxhcmFiaWM9NjQzNDQ7dC5wZWhpcmFnYW5hPTEyNDEwO3QucGVobWVkaWFsYXJhYmljPTY0MzQ1O3QucGVrYXRha2FuYT0xMjUwNjt0LnBlbWlkZGxlaG9va2N5cmlsbGljPTExOTE7dC5wZXJhZmVoZWJyZXc9NjQzMzQ7dC5wZXJjZW50PTM3O3QucGVyY2VudGFyYWJpYz0xNjQyO3QucGVyY2VudG1vbm9zcGFjZT02NTI4NTt0LnBlcmNlbnRzbWFsbD02NTEzMDt0LnBlcmlvZD00Njt0LnBlcmlvZGFybWVuaWFuPTE0MTc7dC5wZXJpb2RjZW50ZXJlZD0xODM7dC5wZXJpb2RoYWxmd2lkdGg9NjUzNzc7dC5wZXJpb2RpbmZlcmlvcj02MzIwNzt0LnBlcmlvZG1vbm9zcGFjZT02NTI5NDt0LnBlcmlvZHNtYWxsPTY1MTA2O3QucGVyaW9kc3VwZXJpb3I9NjMyMDg7dC5wZXJpc3BvbWVuaWdyZWVrY21iPTgzNDt0LnBlcnBlbmRpY3VsYXI9ODg2OTt0LnBlcnRob3VzYW5kPTgyNDA7dC5wZXNldGE9ODM1OTt0LnBmc3F1YXJlPTEzMTk0O3QucGhhYmVuZ2FsaT0yNDc1O3QucGhhZGV2YT0yMzQ3O3QucGhhZ3VqYXJhdGk9MjczMTt0LnBoYWd1cm11a2hpPTI2MDM7dC5waGk9OTY2O3QucGhpMT05ODE7dC5waGlldXBoYWNpcmNsZWtvcmVhbj0xMjkyMjt0LnBoaWV1cGhhcGFyZW5rb3JlYW49MTI4MjY7dC5waGlldXBoY2lyY2xla29yZWFuPTEyOTA4O3QucGhpZXVwaGtvcmVhbj0xMjYyMTt0LnBoaWV1cGhwYXJlbmtvcmVhbj0xMjgxMjt0LnBoaWxhdGluPTYzMjt0LnBoaW50aHV0aGFpPTM2NDI7dC5waGlzeW1ib2xncmVlaz05ODE7dC5waG9vaz00MjE7dC5waG9waGFudGhhaT0zNjE0O3QucGhvcGh1bmd0aGFpPTM2MTI7dC5waG9zYW1waGFvdGhhaT0zNjE2O3QucGk9OTYwO3QucGlldXBhY2lyY2xla29yZWFuPTEyOTE1O3QucGlldXBhcGFyZW5rb3JlYW49MTI4MTk7dC5waWV1cGNpZXVja29yZWFuPTEyNjYyO3QucGlldXBjaXJjbGVrb3JlYW49MTI5MDE7dC5waWV1cGtpeWVva2tvcmVhbj0xMjY1ODt0LnBpZXVwa29yZWFuPTEyNjEwO3QucGlldXBwYXJlbmtvcmVhbj0xMjgwNTt0LnBpZXVwc2lvc2tpeWVva2tvcmVhbj0xMjY2MDt0LnBpZXVwc2lvc2tvcmVhbj0xMjYxMjt0LnBpZXVwc2lvc3Rpa2V1dGtvcmVhbj0xMjY2MTt0LnBpZXVwdGhpZXV0aGtvcmVhbj0xMjY2Mzt0LnBpZXVwdGlrZXV0a29yZWFuPTEyNjU5O3QucGloaXJhZ2FuYT0xMjQwNDt0LnBpa2F0YWthbmE9MTI1MDA7dC5waXN5bWJvbGdyZWVrPTk4Mjt0LnBpd3Jhcm1lbmlhbj0xNDExO3QucGx1cz00Mzt0LnBsdXNiZWxvd2NtYj03OTk7dC5wbHVzY2lyY2xlPTg4NTM7dC5wbHVzbWludXM9MTc3O3QucGx1c21vZD03MjY7dC5wbHVzbW9ub3NwYWNlPTY1MjkxO3QucGx1c3NtYWxsPTY1MTIyO3QucGx1c3N1cGVyaW9yPTgzMTQ7dC5wbW9ub3NwYWNlPTY1MzYwO3QucG1zcXVhcmU9MTMyNzI7dC5wb2hpcmFnYW5hPTEyNDEzO3QucG9pbnRpbmdpbmRleGRvd253aGl0ZT05NzU5O3QucG9pbnRpbmdpbmRleGxlZnR3aGl0ZT05NzU2O3QucG9pbnRpbmdpbmRleHJpZ2h0d2hpdGU9OTc1ODt0LnBvaW50aW5naW5kZXh1cHdoaXRlPTk3NTc7dC5wb2thdGFrYW5hPTEyNTA5O3QucG9wbGF0aGFpPTM2MTE7dC5wb3N0YWxtYXJrPTEyMzA2O3QucG9zdGFsbWFya2ZhY2U9MTIzMjA7dC5wcGFyZW49OTM4Nzt0LnByZWNlZGVzPTg4MjY7dC5wcmVzY3JpcHRpb249ODQ3ODt0LnByaW1lbW9kPTY5Nzt0LnByaW1lcmV2ZXJzZWQ9ODI0NTt0LnByb2R1Y3Q9ODcxOTt0LnByb2plY3RpdmU9ODk2NTt0LnByb2xvbmdlZGthbmE9MTI1NDA7dC5wcm9wZWxsb3I9ODk4NDt0LnByb3BlcnN1YnNldD04ODM0O3QucHJvcGVyc3VwZXJzZXQ9ODgzNTt0LnByb3BvcnRpb249ODc1OTt0LnByb3BvcnRpb25hbD04NzMzO3QucHNpPTk2ODt0LnBzaWN5cmlsbGljPTExMzc7dC5wc2lsaXBuZXVtYXRhY3lyaWxsaWNjbWI9MTE1ODt0LnBzc3F1YXJlPTEzMjMyO3QucHVoaXJhZ2FuYT0xMjQwNzt0LnB1a2F0YWthbmE9MTI1MDM7dC5wdnNxdWFyZT0xMzIzNjt0LnB3c3F1YXJlPTEzMjQyO3QucT0xMTM7dC5xYWRldmE9MjM5Mjt0LnFhZG1haGVicmV3PTE0NDg7dC5xYWZhcmFiaWM9MTYwMjt0LnFhZmZpbmFsYXJhYmljPTY1MjM4O3QucWFmaW5pdGlhbGFyYWJpYz02NTIzOTt0LnFhZm1lZGlhbGFyYWJpYz02NTI0MDt0LnFhbWF0cz0xNDY0O3QucWFtYXRzMTA9MTQ2NDt0LnFhbWF0czFhPTE0NjQ7dC5xYW1hdHMxYz0xNDY0O3QucWFtYXRzMjc9MTQ2NDt0LnFhbWF0czI5PTE0NjQ7dC5xYW1hdHMzMz0xNDY0O3QucWFtYXRzZGU9MTQ2NDt0LnFhbWF0c2hlYnJldz0xNDY0O3QucWFtYXRzbmFycm93aGVicmV3PTE0NjQ7dC5xYW1hdHNxYXRhbmhlYnJldz0xNDY0O3QucWFtYXRzcWF0YW5uYXJyb3doZWJyZXc9MTQ2NDt0LnFhbWF0c3FhdGFucXVhcnRlcmhlYnJldz0xNDY0O3QucWFtYXRzcWF0YW53aWRlaGVicmV3PTE0NjQ7dC5xYW1hdHNxdWFydGVyaGVicmV3PTE0NjQ7dC5xYW1hdHN3aWRlaGVicmV3PTE0NjQ7dC5xYXJuZXlwYXJhaGVicmV3PTE0Mzk7dC5xYm9wb21vZm89MTI1NjE7dC5xY2lyY2xlPTk0NDA7dC5xaG9vaz02NzI7dC5xbW9ub3NwYWNlPTY1MzYxO3QucW9mPTE1MTE7dC5xb2ZkYWdlc2g9NjQzMjc7dC5xb2ZkYWdlc2hoZWJyZXc9NjQzMjc7dC5xb2ZoZWJyZXc9MTUxMTt0LnFwYXJlbj05Mzg4O3QucXVhcnRlcm5vdGU9OTgzMzt0LnF1YnV0cz0xNDY3O3QucXVidXRzMTg9MTQ2Nzt0LnF1YnV0czI1PTE0Njc7dC5xdWJ1dHMzMT0xNDY3O3QucXVidXRzaGVicmV3PTE0Njc7dC5xdWJ1dHNuYXJyb3doZWJyZXc9MTQ2Nzt0LnF1YnV0c3F1YXJ0ZXJoZWJyZXc9MTQ2Nzt0LnF1YnV0c3dpZGVoZWJyZXc9MTQ2Nzt0LnF1ZXN0aW9uPTYzO3QucXVlc3Rpb25hcmFiaWM9MTU2Nzt0LnF1ZXN0aW9uYXJtZW5pYW49MTM3NDt0LnF1ZXN0aW9uZG93bj0xOTE7dC5xdWVzdGlvbmRvd25zbWFsbD02MzQyMzt0LnF1ZXN0aW9uZ3JlZWs9ODk0O3QucXVlc3Rpb25tb25vc3BhY2U9NjUzMTE7dC5xdWVzdGlvbnNtYWxsPTYzMjk1O3QucXVvdGVkYmw9MzQ7dC5xdW90ZWRibGJhc2U9ODIyMjt0LnF1b3RlZGJsbGVmdD04MjIwO3QucXVvdGVkYmxtb25vc3BhY2U9NjUyODI7dC5xdW90ZWRibHByaW1lPTEyMzE4O3QucXVvdGVkYmxwcmltZXJldmVyc2VkPTEyMzE3O3QucXVvdGVkYmxyaWdodD04MjIxO3QucXVvdGVsZWZ0PTgyMTY7dC5xdW90ZWxlZnRyZXZlcnNlZD04MjE5O3QucXVvdGVyZXZlcnNlZD04MjE5O3QucXVvdGVyaWdodD04MjE3O3QucXVvdGVyaWdodG49MzI5O3QucXVvdGVzaW5nbGJhc2U9ODIxODt0LnF1b3Rlc2luZ2xlPTM5O3QucXVvdGVzaW5nbGVtb25vc3BhY2U9NjUyODc7dC5yPTExNDt0LnJhYXJtZW5pYW49MTQwNDt0LnJhYmVuZ2FsaT0yNDgwO3QucmFjdXRlPTM0MTt0LnJhZGV2YT0yMzUyO3QucmFkaWNhbD04NzMwO3QucmFkaWNhbGV4PTYzNzE3O3QucmFkb3ZlcnNzcXVhcmU9MTMyMzA7dC5yYWRvdmVyc3NxdWFyZWRzcXVhcmU9MTMyMzE7dC5yYWRzcXVhcmU9MTMyMjk7dC5yYWZlPTE0NzE7dC5yYWZlaGVicmV3PTE0NzE7dC5yYWd1amFyYXRpPTI3MzY7dC5yYWd1cm11a2hpPTI2MDg7dC5yYWhpcmFnYW5hPTEyNDI1O3QucmFrYXRha2FuYT0xMjUyMTt0LnJha2F0YWthbmFoYWxmd2lkdGg9NjU0MzE7dC5yYWxvd2VyZGlhZ29uYWxiZW5nYWxpPTI1NDU7dC5yYW1pZGRsZWRpYWdvbmFsYmVuZ2FsaT0yNTQ0O3QucmFtc2hvcm49NjEyO3QucmF0aW89ODc1ODt0LnJib3BvbW9mbz0xMjU2Njt0LnJjYXJvbj0zNDU7dC5yY2VkaWxsYT0zNDM7dC5yY2lyY2xlPTk0NDE7dC5yY29tbWFhY2NlbnQ9MzQzO3QucmRibGdyYXZlPTUyOTt0LnJkb3RhY2NlbnQ9Nzc2OTt0LnJkb3RiZWxvdz03NzcxO3QucmRvdGJlbG93bWFjcm9uPTc3NzM7dC5yZWZlcmVuY2VtYXJrPTgyNTE7dC5yZWZsZXhzdWJzZXQ9ODgzODt0LnJlZmxleHN1cGVyc2V0PTg4Mzk7dC5yZWdpc3RlcmVkPTE3NDt0LnJlZ2lzdGVyc2Fucz02MzcyMDt0LnJlZ2lzdGVyc2VyaWY9NjMxOTQ7dC5yZWhhcmFiaWM9MTU4NTt0LnJlaGFybWVuaWFuPTE0MDg7dC5yZWhmaW5hbGFyYWJpYz02NTE5ODt0LnJlaGlyYWdhbmE9MTI0Mjg7dC5yZWthdGFrYW5hPTEyNTI0O3QucmVrYXRha2FuYWhhbGZ3aWR0aD02NTQzNDt0LnJlc2g9MTUxMjt0LnJlc2hkYWdlc2hoZWJyZXc9NjQzMjg7dC5yZXNoaGVicmV3PTE1MTI7dC5yZXZlcnNlZHRpbGRlPTg3NjU7dC5yZXZpYWhlYnJldz0xNDMxO3QucmV2aWFtdWdyYXNoaGVicmV3PTE0MzE7dC5yZXZsb2dpY2Fsbm90PTg5NzY7dC5yZmlzaGhvb2s9NjM4O3QucmZpc2hob29rcmV2ZXJzZWQ9NjM5O3QucmhhYmVuZ2FsaT0yNTI1O3QucmhhZGV2YT0yMzk3O3QucmhvPTk2MTt0LnJob29rPTYzNzt0LnJob29rdHVybmVkPTYzNTt0LnJob29rdHVybmVkc3VwZXJpb3I9NjkzO3Qucmhvc3ltYm9sZ3JlZWs9MTAwOTt0LnJob3RpY2hvb2ttb2Q9NzM0O3QucmlldWxhY2lyY2xla29yZWFuPTEyOTEzO3QucmlldWxhcGFyZW5rb3JlYW49MTI4MTc7dC5yaWV1bGNpcmNsZWtvcmVhbj0xMjg5OTt0LnJpZXVsaGlldWhrb3JlYW49MTI2MDg7dC5yaWV1bGtpeWVva2tvcmVhbj0xMjYwMjt0LnJpZXVsa2l5ZW9rc2lvc2tvcmVhbj0xMjY0OTt0LnJpZXVsa29yZWFuPTEyNjAxO3QucmlldWxtaWV1bWtvcmVhbj0xMjYwMzt0LnJpZXVscGFuc2lvc2tvcmVhbj0xMjY1Mjt0LnJpZXVscGFyZW5rb3JlYW49MTI4MDM7dC5yaWV1bHBoaWV1cGhrb3JlYW49MTI2MDc7dC5yaWV1bHBpZXVwa29yZWFuPTEyNjA0O3QucmlldWxwaWV1cHNpb3Nrb3JlYW49MTI2NTE7dC5yaWV1bHNpb3Nrb3JlYW49MTI2MDU7dC5yaWV1bHRoaWV1dGhrb3JlYW49MTI2MDY7dC5yaWV1bHRpa2V1dGtvcmVhbj0xMjY1MDt0LnJpZXVseWVvcmluaGlldWhrb3JlYW49MTI2NTM7dC5yaWdodGFuZ2xlPTg3MzU7dC5yaWdodHRhY2tiZWxvd2NtYj03OTM7dC5yaWdodHRyaWFuZ2xlPTg4OTU7dC5yaWhpcmFnYW5hPTEyNDI2O3QucmlrYXRha2FuYT0xMjUyMjt0LnJpa2F0YWthbmFoYWxmd2lkdGg9NjU0MzI7dC5yaW5nPTczMDt0LnJpbmdiZWxvd2NtYj04MDU7dC5yaW5nY21iPTc3ODt0LnJpbmdoYWxmbGVmdD03MDM7dC5yaW5naGFsZmxlZnRhcm1lbmlhbj0xMzY5O3QucmluZ2hhbGZsZWZ0YmVsb3djbWI9Nzk2O3QucmluZ2hhbGZsZWZ0Y2VudGVyZWQ9NzIzO3QucmluZ2hhbGZyaWdodD03MDI7dC5yaW5naGFsZnJpZ2h0YmVsb3djbWI9ODI1O3QucmluZ2hhbGZyaWdodGNlbnRlcmVkPTcyMjt0LnJpbnZlcnRlZGJyZXZlPTUzMTt0LnJpdHRvcnVzcXVhcmU9MTMxMzc7dC5ybGluZWJlbG93PTc3NzU7dC5ybG9uZ2xlZz02MzY7dC5ybG9uZ2xlZ3R1cm5lZD02MzQ7dC5ybW9ub3NwYWNlPTY1MzYyO3Qucm9oaXJhZ2FuYT0xMjQyOTt0LnJva2F0YWthbmE9MTI1MjU7dC5yb2thdGFrYW5haGFsZndpZHRoPTY1NDM1O3Qucm9ydWF0aGFpPTM2MTk7dC5ycGFyZW49OTM4OTt0LnJyYWJlbmdhbGk9MjUyNDt0LnJyYWRldmE9MjM1Mzt0LnJyYWd1cm11a2hpPTI2NTI7dC5ycmVoYXJhYmljPTE2ODE7dC5ycmVoZmluYWxhcmFiaWM9NjQzOTc7dC5ycnZvY2FsaWNiZW5nYWxpPTI1Mjg7dC5ycnZvY2FsaWNkZXZhPTI0MDA7dC5ycnZvY2FsaWNndWphcmF0aT0yNzg0O3QucnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNTAwO3QucnJ2b2NhbGljdm93ZWxzaWduZGV2YT0yMzcyO3QucnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGk9Mjc1Njt0LnJzdXBlcmlvcj02MzIxNzt0LnJ0YmxvY2s9OTYxNjt0LnJ0dXJuZWQ9NjMzO3QucnR1cm5lZHN1cGVyaW9yPTY5Mjt0LnJ1aGlyYWdhbmE9MTI0Mjc7dC5ydWthdGFrYW5hPTEyNTIzO3QucnVrYXRha2FuYWhhbGZ3aWR0aD02NTQzMzt0LnJ1cGVlbWFya2JlbmdhbGk9MjU0Njt0LnJ1cGVlc2lnbmJlbmdhbGk9MjU0Nzt0LnJ1cGlhaD02MzE5Nzt0LnJ1dGhhaT0zNjIwO3QucnZvY2FsaWNiZW5nYWxpPTI0NDM7dC5ydm9jYWxpY2RldmE9MjMxNTt0LnJ2b2NhbGljZ3VqYXJhdGk9MjY5OTt0LnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNDk5O3QucnZvY2FsaWN2b3dlbHNpZ25kZXZhPTIzNzE7dC5ydm9jYWxpY3Zvd2Vsc2lnbmd1amFyYXRpPTI3NTU7dC5zPTExNTt0LnNhYmVuZ2FsaT0yNDg4O3Quc2FjdXRlPTM0Nzt0LnNhY3V0ZWRvdGFjY2VudD03NzgxO3Quc2FkYXJhYmljPTE1ODk7dC5zYWRldmE9MjM2MDt0LnNhZGZpbmFsYXJhYmljPTY1MjEwO3Quc2FkaW5pdGlhbGFyYWJpYz02NTIxMTt0LnNhZG1lZGlhbGFyYWJpYz02NTIxMjt0LnNhZ3VqYXJhdGk9Mjc0NDt0LnNhZ3VybXVraGk9MjYxNjt0LnNhaGlyYWdhbmE9MTIzNzM7dC5zYWthdGFrYW5hPTEyNDY5O3Quc2FrYXRha2FuYWhhbGZ3aWR0aD02NTQwMzt0LnNhbGxhbGxhaG91YWxheWhld2FzYWxsYW1hcmFiaWM9NjUwMTg7dC5zYW1la2g9MTUwNTt0LnNhbWVraGRhZ2VzaD02NDMyMTt0LnNhbWVraGRhZ2VzaGhlYnJldz02NDMyMTt0LnNhbWVraGhlYnJldz0xNTA1O3Quc2FyYWFhdGhhaT0zNjM0O3Quc2FyYWFldGhhaT0zNjQ5O3Quc2FyYWFpbWFpbWFsYWl0aGFpPTM2NTI7dC5zYXJhYWltYWltdWFudGhhaT0zNjUxO3Quc2FyYWFtdGhhaT0zNjM1O3Quc2FyYWF0aGFpPTM2MzI7dC5zYXJhZXRoYWk9MzY0ODt0LnNhcmFpaWxlZnR0aGFpPTYzNjIyO3Quc2FyYWlpdGhhaT0zNjM3O3Quc2FyYWlsZWZ0dGhhaT02MzYyMTt0LnNhcmFpdGhhaT0zNjM2O3Quc2FyYW90aGFpPTM2NTA7dC5zYXJhdWVlbGVmdHRoYWk9NjM2MjQ7dC5zYXJhdWVldGhhaT0zNjM5O3Quc2FyYXVlbGVmdHRoYWk9NjM2MjM7dC5zYXJhdWV0aGFpPTM2Mzg7dC5zYXJhdXRoYWk9MzY0MDt0LnNhcmF1dXRoYWk9MzY0MTt0LnNib3BvbW9mbz0xMjU2OTt0LnNjYXJvbj0zNTM7dC5zY2Fyb25kb3RhY2NlbnQ9Nzc4Mzt0LnNjZWRpbGxhPTM1MTt0LnNjaHdhPTYwMTt0LnNjaHdhY3lyaWxsaWM9MTI0MTt0LnNjaHdhZGllcmVzaXNjeXJpbGxpYz0xMjQzO3Quc2Nod2Fob29rPTYwMjt0LnNjaXJjbGU9OTQ0Mjt0LnNjaXJjdW1mbGV4PTM0OTt0LnNjb21tYWFjY2VudD01Mzc7dC5zZG90YWNjZW50PTc3Nzc7dC5zZG90YmVsb3c9Nzc3OTt0LnNkb3RiZWxvd2RvdGFjY2VudD03Nzg1O3Quc2VhZ3VsbGJlbG93Y21iPTgyODt0LnNlY29uZD04MjQzO3Quc2Vjb25kdG9uZWNoaW5lc2U9NzE0O3Quc2VjdGlvbj0xNjc7dC5zZWVuYXJhYmljPTE1ODc7dC5zZWVuZmluYWxhcmFiaWM9NjUyMDI7dC5zZWVuaW5pdGlhbGFyYWJpYz02NTIwMzt0LnNlZW5tZWRpYWxhcmFiaWM9NjUyMDQ7dC5zZWdvbD0xNDYyO3Quc2Vnb2wxMz0xNDYyO3Quc2Vnb2wxZj0xNDYyO3Quc2Vnb2wyYz0xNDYyO3Quc2Vnb2xoZWJyZXc9MTQ2Mjt0LnNlZ29sbmFycm93aGVicmV3PTE0NjI7dC5zZWdvbHF1YXJ0ZXJoZWJyZXc9MTQ2Mjt0LnNlZ29sdGFoZWJyZXc9MTQyNjt0LnNlZ29sd2lkZWhlYnJldz0xNDYyO3Quc2VoYXJtZW5pYW49MTQwNTt0LnNlaGlyYWdhbmE9MTIzNzk7dC5zZWthdGFrYW5hPTEyNDc1O3Quc2VrYXRha2FuYWhhbGZ3aWR0aD02NTQwNjt0LnNlbWljb2xvbj01OTt0LnNlbWljb2xvbmFyYWJpYz0xNTYzO3Quc2VtaWNvbG9ubW9ub3NwYWNlPTY1MzA3O3Quc2VtaWNvbG9uc21hbGw9NjUxMDg7dC5zZW1pdm9pY2VkbWFya2thbmE9MTI0NDQ7dC5zZW1pdm9pY2VkbWFya2thbmFoYWxmd2lkdGg9NjU0Mzk7dC5zZW50aXNxdWFyZT0xMzA5MDt0LnNlbnRvc3F1YXJlPTEzMDkxO3Quc2V2ZW49NTU7dC5zZXZlbmFyYWJpYz0xNjM5O3Quc2V2ZW5iZW5nYWxpPTI1NDE7dC5zZXZlbmNpcmNsZT05MzE4O3Quc2V2ZW5jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTI4O3Quc2V2ZW5kZXZhPTI0MTM7dC5zZXZlbmVpZ2h0aHM9ODU0Mjt0LnNldmVuZ3VqYXJhdGk9Mjc5Nzt0LnNldmVuZ3VybXVraGk9MjY2OTt0LnNldmVuaGFja2FyYWJpYz0xNjM5O3Quc2V2ZW5oYW5nemhvdT0xMjMyNzt0LnNldmVuaWRlb2dyYXBoaWNwYXJlbj0xMjgzODt0LnNldmVuaW5mZXJpb3I9ODMyNzt0LnNldmVubW9ub3NwYWNlPTY1MzAzO3Quc2V2ZW5vbGRzdHlsZT02MzI4Nzt0LnNldmVucGFyZW49OTMzODt0LnNldmVucGVyaW9kPTkzNTg7dC5zZXZlbnBlcnNpYW49MTc4Mzt0LnNldmVucm9tYW49ODU2Njt0LnNldmVuc3VwZXJpb3I9ODMxMTt0LnNldmVudGVlbmNpcmNsZT05MzI4O3Quc2V2ZW50ZWVucGFyZW49OTM0ODt0LnNldmVudGVlbnBlcmlvZD05MzY4O3Quc2V2ZW50aGFpPTM2NzE7dC5zZnRoeXBoZW49MTczO3Quc2hhYXJtZW5pYW49MTM5OTt0LnNoYWJlbmdhbGk9MjQ4Njt0LnNoYWN5cmlsbGljPTEwOTY7dC5zaGFkZGFhcmFiaWM9MTYxNzt0LnNoYWRkYWRhbW1hYXJhYmljPTY0NjA5O3Quc2hhZGRhZGFtbWF0YW5hcmFiaWM9NjQ2MDY7dC5zaGFkZGFmYXRoYWFyYWJpYz02NDYwODt0LnNoYWRkYWthc3JhYXJhYmljPTY0NjEwO3Quc2hhZGRha2FzcmF0YW5hcmFiaWM9NjQ2MDc7dC5zaGFkZT05NjE4O3Quc2hhZGVkYXJrPTk2MTk7dC5zaGFkZWxpZ2h0PTk2MTc7dC5zaGFkZW1lZGl1bT05NjE4O3Quc2hhZGV2YT0yMzU4O3Quc2hhZ3VqYXJhdGk9Mjc0Mjt0LnNoYWd1cm11a2hpPTI2MTQ7dC5zaGFsc2hlbGV0aGVicmV3PTE0Mjc7dC5zaGJvcG9tb2ZvPTEyNTY1O3Quc2hjaGFjeXJpbGxpYz0xMDk3O3Quc2hlZW5hcmFiaWM9MTU4ODt0LnNoZWVuZmluYWxhcmFiaWM9NjUyMDY7dC5zaGVlbmluaXRpYWxhcmFiaWM9NjUyMDc7dC5zaGVlbm1lZGlhbGFyYWJpYz02NTIwODt0LnNoZWljb3B0aWM9OTk1O3Quc2hlcWVsPTgzNjI7dC5zaGVxZWxoZWJyZXc9ODM2Mjt0LnNoZXZhPTE0NTY7dC5zaGV2YTExNT0xNDU2O3Quc2hldmExNT0xNDU2O3Quc2hldmEyMj0xNDU2O3Quc2hldmEyZT0xNDU2O3Quc2hldmFoZWJyZXc9MTQ1Njt0LnNoZXZhbmFycm93aGVicmV3PTE0NTY7dC5zaGV2YXF1YXJ0ZXJoZWJyZXc9MTQ1Njt0LnNoZXZhd2lkZWhlYnJldz0xNDU2O3Quc2hoYWN5cmlsbGljPTEyMTE7dC5zaGltYWNvcHRpYz0xMDA1O3Quc2hpbj0xNTEzO3Quc2hpbmRhZ2VzaD02NDMyOTt0LnNoaW5kYWdlc2hoZWJyZXc9NjQzMjk7dC5zaGluZGFnZXNoc2hpbmRvdD02NDMwMDt0LnNoaW5kYWdlc2hzaGluZG90aGVicmV3PTY0MzAwO3Quc2hpbmRhZ2VzaHNpbmRvdD02NDMwMTt0LnNoaW5kYWdlc2hzaW5kb3RoZWJyZXc9NjQzMDE7dC5zaGluZG90aGVicmV3PTE0NzM7dC5zaGluaGVicmV3PTE1MTM7dC5zaGluc2hpbmRvdD02NDI5ODt0LnNoaW5zaGluZG90aGVicmV3PTY0Mjk4O3Quc2hpbnNpbmRvdD02NDI5OTt0LnNoaW5zaW5kb3RoZWJyZXc9NjQyOTk7dC5zaG9vaz02NDI7dC5zaWdtYT05NjM7dC5zaWdtYTE9OTYyO3Quc2lnbWFmaW5hbD05NjI7dC5zaWdtYWx1bmF0ZXN5bWJvbGdyZWVrPTEwMTA7dC5zaWhpcmFnYW5hPTEyMzc1O3Quc2lrYXRha2FuYT0xMjQ3MTt0LnNpa2F0YWthbmFoYWxmd2lkdGg9NjU0MDQ7dC5zaWx1cWhlYnJldz0xNDY5O3Quc2lsdXFsZWZ0aGVicmV3PTE0Njk7dC5zaW1pbGFyPTg3NjQ7dC5zaW5kb3RoZWJyZXc9MTQ3NDt0LnNpb3NhY2lyY2xla29yZWFuPTEyOTE2O3Quc2lvc2FwYXJlbmtvcmVhbj0xMjgyMDt0LnNpb3NjaWV1Y2tvcmVhbj0xMjY3MDt0LnNpb3NjaXJjbGVrb3JlYW49MTI5MDI7dC5zaW9za2l5ZW9ra29yZWFuPTEyNjY2O3Quc2lvc2tvcmVhbj0xMjYxMzt0LnNpb3NuaWV1bmtvcmVhbj0xMjY2Nzt0LnNpb3NwYXJlbmtvcmVhbj0xMjgwNjt0LnNpb3NwaWV1cGtvcmVhbj0xMjY2OTt0LnNpb3N0aWtldXRrb3JlYW49MTI2Njg7dC5zaXg9NTQ7dC5zaXhhcmFiaWM9MTYzODt0LnNpeGJlbmdhbGk9MjU0MDt0LnNpeGNpcmNsZT05MzE3O3Quc2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNzt0LnNpeGRldmE9MjQxMjt0LnNpeGd1amFyYXRpPTI3OTY7dC5zaXhndXJtdWtoaT0yNjY4O3Quc2l4aGFja2FyYWJpYz0xNjM4O3Quc2l4aGFuZ3pob3U9MTIzMjY7dC5zaXhpZGVvZ3JhcGhpY3BhcmVuPTEyODM3O3Quc2l4aW5mZXJpb3I9ODMyNjt0LnNpeG1vbm9zcGFjZT02NTMwMjt0LnNpeG9sZHN0eWxlPTYzMjg2O3Quc2l4cGFyZW49OTMzNzt0LnNpeHBlcmlvZD05MzU3O3Quc2l4cGVyc2lhbj0xNzgyO3Quc2l4cm9tYW49ODU2NTt0LnNpeHN1cGVyaW9yPTgzMTA7dC5zaXh0ZWVuY2lyY2xlPTkzMjc7dC5zaXh0ZWVuY3VycmVuY3lkZW5vbWluYXRvcmJlbmdhbGk9MjU1Mzt0LnNpeHRlZW5wYXJlbj05MzQ3O3Quc2l4dGVlbnBlcmlvZD05MzY3O3Quc2l4dGhhaT0zNjcwO3Quc2xhc2g9NDc7dC5zbGFzaG1vbm9zcGFjZT02NTI5NTt0LnNsb25nPTM4Mzt0LnNsb25nZG90YWNjZW50PTc4MzU7dC5zbWlsZWZhY2U9OTc4Njt0LnNtb25vc3BhY2U9NjUzNjM7dC5zb2ZwYXN1cWhlYnJldz0xNDc1O3Quc29mdGh5cGhlbj0xNzM7dC5zb2Z0c2lnbmN5cmlsbGljPTExMDA7dC5zb2hpcmFnYW5hPTEyMzgxO3Quc29rYXRha2FuYT0xMjQ3Nzt0LnNva2F0YWthbmFoYWxmd2lkdGg9NjU0MDc7dC5zb2xpZHVzbG9uZ292ZXJsYXljbWI9ODI0O3Quc29saWR1c3Nob3J0b3ZlcmxheWNtYj04MjM7dC5zb3J1c2l0aGFpPTM2MjU7dC5zb3NhbGF0aGFpPTM2MjQ7dC5zb3NvdGhhaT0zNTk1O3Quc29zdWF0aGFpPTM2MjY7dC5zcGFjZT0zMjt0LnNwYWNlaGFja2FyYWJpYz0zMjt0LnNwYWRlPTk4MjQ7dC5zcGFkZXN1aXRibGFjaz05ODI0O3Quc3BhZGVzdWl0d2hpdGU9OTgyODt0LnNwYXJlbj05MzkwO3Quc3F1YXJlYmVsb3djbWI9ODI3O3Quc3F1YXJlY2M9MTMyNTI7dC5zcXVhcmVjbT0xMzIxMzt0LnNxdWFyZWRpYWdvbmFsY3Jvc3NoYXRjaGZpbGw9OTY0MTt0LnNxdWFyZWhvcml6b250YWxmaWxsPTk2MzY7dC5zcXVhcmVrZz0xMzE5OTt0LnNxdWFyZWttPTEzMjE0O3Quc3F1YXJla21jYXBpdGFsPTEzMjYyO3Quc3F1YXJlbG49MTMyNjU7dC5zcXVhcmVsb2c9MTMyNjY7dC5zcXVhcmVtZz0xMzE5ODt0LnNxdWFyZW1pbD0xMzI2OTt0LnNxdWFyZW1tPTEzMjEyO3Quc3F1YXJlbXNxdWFyZWQ9MTMyMTc7dC5zcXVhcmVvcnRob2dvbmFsY3Jvc3NoYXRjaGZpbGw9OTYzODt0LnNxdWFyZXVwcGVybGVmdHRvbG93ZXJyaWdodGZpbGw9OTYzOTt0LnNxdWFyZXVwcGVycmlnaHR0b2xvd2VybGVmdGZpbGw9OTY0MDt0LnNxdWFyZXZlcnRpY2FsZmlsbD05NjM3O3Quc3F1YXJld2hpdGV3aXRoc21hbGxibGFjaz05NjM1O3Quc3JzcXVhcmU9MTMyNzU7dC5zc2FiZW5nYWxpPTI0ODc7dC5zc2FkZXZhPTIzNTk7dC5zc2FndWphcmF0aT0yNzQzO3Quc3NhbmdjaWV1Y2tvcmVhbj0xMjYxNzt0LnNzYW5naGlldWhrb3JlYW49MTI2Nzc7dC5zc2FuZ2lldW5na29yZWFuPTEyNjcyO3Quc3NhbmdraXllb2trb3JlYW49MTI1OTQ7dC5zc2FuZ25pZXVua29yZWFuPTEyNjQ1O3Quc3NhbmdwaWV1cGtvcmVhbj0xMjYxMTt0LnNzYW5nc2lvc2tvcmVhbj0xMjYxNDt0LnNzYW5ndGlrZXV0a29yZWFuPTEyNjAwO3Quc3N1cGVyaW9yPTYzMjE4O3Quc3Rlcmxpbmc9MTYzO3Quc3Rlcmxpbmdtb25vc3BhY2U9NjU1MDU7dC5zdHJva2Vsb25nb3ZlcmxheWNtYj04MjI7dC5zdHJva2VzaG9ydG92ZXJsYXljbWI9ODIxO3Quc3Vic2V0PTg4MzQ7dC5zdWJzZXRub3RlcXVhbD04ODQyO3Quc3Vic2V0b3JlcXVhbD04ODM4O3Quc3VjY2VlZHM9ODgyNzt0LnN1Y2h0aGF0PTg3MTU7dC5zdWhpcmFnYW5hPTEyMzc3O3Quc3VrYXRha2FuYT0xMjQ3Mzt0LnN1a2F0YWthbmFoYWxmd2lkdGg9NjU0MDU7dC5zdWt1bmFyYWJpYz0xNjE4O3Quc3VtbWF0aW9uPTg3MjE7dC5zdW49OTc4ODt0LnN1cGVyc2V0PTg4MzU7dC5zdXBlcnNldG5vdGVxdWFsPTg4NDM7dC5zdXBlcnNldG9yZXF1YWw9ODgzOTt0LnN2c3F1YXJlPTEzMjc2O3Quc3lvdXdhZXJhc3F1YXJlPTEzMTgwO3QudD0xMTY7dC50YWJlbmdhbGk9MjQ2ODt0LnRhY2tkb3duPTg4Njg7dC50YWNrbGVmdD04ODY3O3QudGFkZXZhPTIzNDA7dC50YWd1amFyYXRpPTI3MjQ7dC50YWd1cm11a2hpPTI1OTY7dC50YWhhcmFiaWM9MTU5MTt0LnRhaGZpbmFsYXJhYmljPTY1MjE4O3QudGFoaW5pdGlhbGFyYWJpYz02NTIxOTt0LnRhaGlyYWdhbmE9MTIzODM7dC50YWhtZWRpYWxhcmFiaWM9NjUyMjA7dC50YWlzeW91ZXJhc3F1YXJlPTEzMTgxO3QudGFrYXRha2FuYT0xMjQ3OTt0LnRha2F0YWthbmFoYWxmd2lkdGg9NjU0MDg7dC50YXR3ZWVsYXJhYmljPTE2MDA7dC50YXU9OTY0O3QudGF2PTE1MTQ7dC50YXZkYWdlcz02NDMzMDt0LnRhdmRhZ2VzaD02NDMzMDt0LnRhdmRhZ2VzaGhlYnJldz02NDMzMDt0LnRhdmhlYnJldz0xNTE0O3QudGJhcj0zNTk7dC50Ym9wb21vZm89MTI1NTQ7dC50Y2Fyb249MzU3O3QudGNjdXJsPTY4MDt0LnRjZWRpbGxhPTM1NTt0LnRjaGVoYXJhYmljPTE2NzA7dC50Y2hlaGZpbmFsYXJhYmljPTY0Mzc5O3QudGNoZWhpbml0aWFsYXJhYmljPTY0MzgwO3QudGNoZWhtZWRpYWxhcmFiaWM9NjQzODE7dC50Y2lyY2xlPTk0NDM7dC50Y2lyY3VtZmxleGJlbG93PTc3OTM7dC50Y29tbWFhY2NlbnQ9MzU1O3QudGRpZXJlc2lzPTc4MzE7dC50ZG90YWNjZW50PTc3ODc7dC50ZG90YmVsb3c9Nzc4OTt0LnRlY3lyaWxsaWM9MTA5MDt0LnRlZGVzY2VuZGVyY3lyaWxsaWM9MTE5Nzt0LnRlaGFyYWJpYz0xNTc4O3QudGVoZmluYWxhcmFiaWM9NjUxNzQ7dC50ZWhoYWhpbml0aWFsYXJhYmljPTY0Njc0O3QudGVoaGFoaXNvbGF0ZWRhcmFiaWM9NjQ1MjQ7dC50ZWhpbml0aWFsYXJhYmljPTY1MTc1O3QudGVoaXJhZ2FuYT0xMjM5MDt0LnRlaGplZW1pbml0aWFsYXJhYmljPTY0NjczO3QudGVoamVlbWlzb2xhdGVkYXJhYmljPTY0NTIzO3QudGVobWFyYnV0YWFyYWJpYz0xNTc3O3QudGVobWFyYnV0YWZpbmFsYXJhYmljPTY1MTcyO3QudGVobWVkaWFsYXJhYmljPTY1MTc2O3QudGVobWVlbWluaXRpYWxhcmFiaWM9NjQ2NzY7dC50ZWhtZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1MjY7dC50ZWhub29uZmluYWxhcmFiaWM9NjQ2Mjc7dC50ZWthdGFrYW5hPTEyNDg2O3QudGVrYXRha2FuYWhhbGZ3aWR0aD02NTQxMTt0LnRlbGVwaG9uZT04NDgxO3QudGVsZXBob25lYmxhY2s9OTc0Mjt0LnRlbGlzaGFnZWRvbGFoZWJyZXc9MTQ0MDt0LnRlbGlzaGFxZXRhbmFoZWJyZXc9MTQ0OTt0LnRlbmNpcmNsZT05MzIxO3QudGVuaWRlb2dyYXBoaWNwYXJlbj0xMjg0MTt0LnRlbnBhcmVuPTkzNDE7dC50ZW5wZXJpb2Q9OTM2MTt0LnRlbnJvbWFuPTg1Njk7dC50ZXNoPTY3OTt0LnRldD0xNDk2O3QudGV0ZGFnZXNoPTY0MzEyO3QudGV0ZGFnZXNoaGVicmV3PTY0MzEyO3QudGV0aGVicmV3PTE0OTY7dC50ZXRzZWN5cmlsbGljPTEyMDU7dC50ZXZpcmhlYnJldz0xNDM1O3QudGV2aXJsZWZ0aGVicmV3PTE0MzU7dC50aGFiZW5nYWxpPTI0Njk7dC50aGFkZXZhPTIzNDE7dC50aGFndWphcmF0aT0yNzI1O3QudGhhZ3VybXVraGk9MjU5Nzt0LnRoYWxhcmFiaWM9MTU4NDt0LnRoYWxmaW5hbGFyYWJpYz02NTE5Njt0LnRoYW50aGFraGF0bG93bGVmdHRoYWk9NjM2NDA7dC50aGFudGhha2hhdGxvd3JpZ2h0dGhhaT02MzYzOTt0LnRoYW50aGFraGF0dGhhaT0zNjYwO3QudGhhbnRoYWtoYXR1cHBlcmxlZnR0aGFpPTYzNjM4O3QudGhlaGFyYWJpYz0xNTc5O3QudGhlaGZpbmFsYXJhYmljPTY1MTc4O3QudGhlaGluaXRpYWxhcmFiaWM9NjUxNzk7dC50aGVobWVkaWFsYXJhYmljPTY1MTgwO3QudGhlcmVleGlzdHM9ODcwNzt0LnRoZXJlZm9yZT04NzU2O3QudGhldGE9OTUyO3QudGhldGExPTk3Nzt0LnRoZXRhc3ltYm9sZ3JlZWs9OTc3O3QudGhpZXV0aGFjaXJjbGVrb3JlYW49MTI5MjE7dC50aGlldXRoYXBhcmVua29yZWFuPTEyODI1O3QudGhpZXV0aGNpcmNsZWtvcmVhbj0xMjkwNzt0LnRoaWV1dGhrb3JlYW49MTI2MjA7dC50aGlldXRocGFyZW5rb3JlYW49MTI4MTE7dC50aGlydGVlbmNpcmNsZT05MzI0O3QudGhpcnRlZW5wYXJlbj05MzQ0O3QudGhpcnRlZW5wZXJpb2Q9OTM2NDt0LnRob25hbmdtb250aG90aGFpPTM2MDE7dC50aG9vaz00Mjk7dC50aG9waHV0aGFvdGhhaT0zNjAyO3QudGhvcm49MjU0O3QudGhvdGhhaGFudGhhaT0zNjA3O3QudGhvdGhhbnRoYWk9MzYwMDt0LnRob3Rob25ndGhhaT0zNjA4O3QudGhvdGh1bmd0aGFpPTM2MDY7dC50aG91c2FuZGN5cmlsbGljPTExNTQ7dC50aG91c2FuZHNzZXBhcmF0b3JhcmFiaWM9MTY0NDt0LnRob3VzYW5kc3NlcGFyYXRvcnBlcnNpYW49MTY0NDt0LnRocmVlPTUxO3QudGhyZWVhcmFiaWM9MTYzNTt0LnRocmVlYmVuZ2FsaT0yNTM3O3QudGhyZWVjaXJjbGU9OTMxNDt0LnRocmVlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNDt0LnRocmVlZGV2YT0yNDA5O3QudGhyZWVlaWdodGhzPTg1NDA7dC50aHJlZWd1amFyYXRpPTI3OTM7dC50aHJlZWd1cm11a2hpPTI2NjU7dC50aHJlZWhhY2thcmFiaWM9MTYzNTt0LnRocmVlaGFuZ3pob3U9MTIzMjM7dC50aHJlZWlkZW9ncmFwaGljcGFyZW49MTI4MzQ7dC50aHJlZWluZmVyaW9yPTgzMjM7dC50aHJlZW1vbm9zcGFjZT02NTI5OTt0LnRocmVlbnVtZXJhdG9yYmVuZ2FsaT0yNTUwO3QudGhyZWVvbGRzdHlsZT02MzI4Mzt0LnRocmVlcGFyZW49OTMzNDt0LnRocmVlcGVyaW9kPTkzNTQ7dC50aHJlZXBlcnNpYW49MTc3OTt0LnRocmVlcXVhcnRlcnM9MTkwO3QudGhyZWVxdWFydGVyc2VtZGFzaD02MzE5ODt0LnRocmVlcm9tYW49ODU2Mjt0LnRocmVlc3VwZXJpb3I9MTc5O3QudGhyZWV0aGFpPTM2Njc7dC50aHpzcXVhcmU9MTMyMDQ7dC50aWhpcmFnYW5hPTEyMzg1O3QudGlrYXRha2FuYT0xMjQ4MTt0LnRpa2F0YWthbmFoYWxmd2lkdGg9NjU0MDk7dC50aWtldXRhY2lyY2xla29yZWFuPTEyOTEyO3QudGlrZXV0YXBhcmVua29yZWFuPTEyODE2O3QudGlrZXV0Y2lyY2xla29yZWFuPTEyODk4O3QudGlrZXV0a29yZWFuPTEyNTk5O3QudGlrZXV0cGFyZW5rb3JlYW49MTI4MDI7dC50aWxkZT03MzI7dC50aWxkZWJlbG93Y21iPTgxNjt0LnRpbGRlY21iPTc3MTt0LnRpbGRlY29tYj03NzE7dC50aWxkZWRvdWJsZWNtYj04NjQ7dC50aWxkZW9wZXJhdG9yPTg3NjQ7dC50aWxkZW92ZXJsYXljbWI9ODIwO3QudGlsZGV2ZXJ0aWNhbGNtYj04MzA7dC50aW1lc2NpcmNsZT04ODU1O3QudGlwZWhhaGVicmV3PTE0MzA7dC50aXBlaGFsZWZ0aGVicmV3PTE0MzA7dC50aXBwaWd1cm11a2hpPTI2NzI7dC50aXRsb2N5cmlsbGljY21iPTExNTU7dC50aXduYXJtZW5pYW49MTQwNzt0LnRsaW5lYmVsb3c9Nzc5MTt0LnRtb25vc3BhY2U9NjUzNjQ7dC50b2FybWVuaWFuPTEzODU7dC50b2hpcmFnYW5hPTEyMzkyO3QudG9rYXRha2FuYT0xMjQ4ODt0LnRva2F0YWthbmFoYWxmd2lkdGg9NjU0MTI7dC50b25lYmFyZXh0cmFoaWdobW9kPTc0MTt0LnRvbmViYXJleHRyYWxvd21vZD03NDU7dC50b25lYmFyaGlnaG1vZD03NDI7dC50b25lYmFybG93bW9kPTc0NDt0LnRvbmViYXJtaWRtb2Q9NzQzO3QudG9uZWZpdmU9NDQ1O3QudG9uZXNpeD0zODk7dC50b25ldHdvPTQyNDt0LnRvbm9zPTkwMDt0LnRvbnNxdWFyZT0xMzA5NTt0LnRvcGF0YWt0aGFpPTM1OTk7dC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQ9MTIzMDg7dC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnRzbWFsbD02NTExNzt0LnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHZlcnRpY2FsPTY1MDgxO3QudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodD0xMjMwOTt0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHRzbWFsbD02NTExODt0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA4Mjt0LnRvdGFvdGhhaT0zNjA1O3QudHBhbGF0YWxob29rPTQyNzt0LnRwYXJlbj05MzkxO3QudHJhZGVtYXJrPTg0ODI7dC50cmFkZW1hcmtzYW5zPTYzNzIyO3QudHJhZGVtYXJrc2VyaWY9NjMxOTU7dC50cmV0cm9mbGV4aG9vaz02NDg7dC50cmlhZ2RuPTk2NjA7dC50cmlhZ2xmPTk2Njg7dC50cmlhZ3J0PTk2NTg7dC50cmlhZ3VwPTk2NTA7dC50cz02Nzg7dC50c2FkaT0xNTEwO3QudHNhZGlkYWdlc2g9NjQzMjY7dC50c2FkaWRhZ2VzaGhlYnJldz02NDMyNjt0LnRzYWRpaGVicmV3PTE1MTA7dC50c2VjeXJpbGxpYz0xMDk0O3QudHNlcmU9MTQ2MTt0LnRzZXJlMTI9MTQ2MTt0LnRzZXJlMWU9MTQ2MTt0LnRzZXJlMmI9MTQ2MTt0LnRzZXJlaGVicmV3PTE0NjE7dC50c2VyZW5hcnJvd2hlYnJldz0xNDYxO3QudHNlcmVxdWFydGVyaGVicmV3PTE0NjE7dC50c2VyZXdpZGVoZWJyZXc9MTQ2MTt0LnRzaGVjeXJpbGxpYz0xMTE1O3QudHN1cGVyaW9yPTYzMjE5O3QudHRhYmVuZ2FsaT0yNDYzO3QudHRhZGV2YT0yMzM1O3QudHRhZ3VqYXJhdGk9MjcxOTt0LnR0YWd1cm11a2hpPTI1OTE7dC50dGVoYXJhYmljPTE2NTc7dC50dGVoZmluYWxhcmFiaWM9NjQzNTk7dC50dGVoaW5pdGlhbGFyYWJpYz02NDM2MDt0LnR0ZWhtZWRpYWxhcmFiaWM9NjQzNjE7dC50dGhhYmVuZ2FsaT0yNDY0O3QudHRoYWRldmE9MjMzNjt0LnR0aGFndWphcmF0aT0yNzIwO3QudHRoYWd1cm11a2hpPTI1OTI7dC50dHVybmVkPTY0Nzt0LnR1aGlyYWdhbmE9MTIzODg7dC50dWthdGFrYW5hPTEyNDg0O3QudHVrYXRha2FuYWhhbGZ3aWR0aD02NTQxMDt0LnR1c21hbGxoaXJhZ2FuYT0xMjM4Nzt0LnR1c21hbGxrYXRha2FuYT0xMjQ4Mzt0LnR1c21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM5MTt0LnR3ZWx2ZWNpcmNsZT05MzIzO3QudHdlbHZlcGFyZW49OTM0Mzt0LnR3ZWx2ZXBlcmlvZD05MzYzO3QudHdlbHZlcm9tYW49ODU3MTt0LnR3ZW50eWNpcmNsZT05MzMxO3QudHdlbnR5aGFuZ3pob3U9MjEzMTY7dC50d2VudHlwYXJlbj05MzUxO3QudHdlbnR5cGVyaW9kPTkzNzE7dC50d289NTA7dC50d29hcmFiaWM9MTYzNDt0LnR3b2JlbmdhbGk9MjUzNjt0LnR3b2NpcmNsZT05MzEzO3QudHdvY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyMzt0LnR3b2RldmE9MjQwODt0LnR3b2RvdGVubGVhZGVyPTgyMjk7dC50d29kb3RsZWFkZXI9ODIyOTt0LnR3b2RvdGxlYWRlcnZlcnRpY2FsPTY1MDcyO3QudHdvZ3VqYXJhdGk9Mjc5Mjt0LnR3b2d1cm11a2hpPTI2NjQ7dC50d29oYWNrYXJhYmljPTE2MzQ7dC50d29oYW5nemhvdT0xMjMyMjt0LnR3b2lkZW9ncmFwaGljcGFyZW49MTI4MzM7dC50d29pbmZlcmlvcj04MzIyO3QudHdvbW9ub3NwYWNlPTY1Mjk4O3QudHdvbnVtZXJhdG9yYmVuZ2FsaT0yNTQ5O3QudHdvb2xkc3R5bGU9NjMyODI7dC50d29wYXJlbj05MzMzO3QudHdvcGVyaW9kPTkzNTM7dC50d29wZXJzaWFuPTE3Nzg7dC50d29yb21hbj04NTYxO3QudHdvc3Ryb2tlPTQ0Mzt0LnR3b3N1cGVyaW9yPTE3ODt0LnR3b3RoYWk9MzY2Njt0LnR3b3RoaXJkcz04NTMyO3QudT0xMTc7dC51YWN1dGU9MjUwO3QudWJhcj02NDk7dC51YmVuZ2FsaT0yNDQxO3QudWJvcG9tb2ZvPTEyNTg0O3QudWJyZXZlPTM2NTt0LnVjYXJvbj00Njg7dC51Y2lyY2xlPTk0NDQ7dC51Y2lyY3VtZmxleD0yNTE7dC51Y2lyY3VtZmxleGJlbG93PTc3OTk7dC51Y3lyaWxsaWM9MTA5MTt0LnVkYXR0YWRldmE9MjM4NTt0LnVkYmxhY3V0ZT0zNjk7dC51ZGJsZ3JhdmU9NTMzO3QudWRldmE9MjMxMzt0LnVkaWVyZXNpcz0yNTI7dC51ZGllcmVzaXNhY3V0ZT00NzI7dC51ZGllcmVzaXNiZWxvdz03Nzk1O3QudWRpZXJlc2lzY2Fyb249NDc0O3QudWRpZXJlc2lzY3lyaWxsaWM9MTI2NTt0LnVkaWVyZXNpc2dyYXZlPTQ3Njt0LnVkaWVyZXNpc21hY3Jvbj00NzA7dC51ZG90YmVsb3c9NzkwOTt0LnVncmF2ZT0yNDk7dC51Z3VqYXJhdGk9MjY5Nzt0LnVndXJtdWtoaT0yNTY5O3QudWhpcmFnYW5hPTEyMzU4O3QudWhvb2thYm92ZT03OTExO3QudWhvcm49NDMyO3QudWhvcm5hY3V0ZT03OTEzO3QudWhvcm5kb3RiZWxvdz03OTIxO3QudWhvcm5ncmF2ZT03OTE1O3QudWhvcm5ob29rYWJvdmU9NzkxNzt0LnVob3JudGlsZGU9NzkxOTt0LnVodW5nYXJ1bWxhdXQ9MzY5O3QudWh1bmdhcnVtbGF1dGN5cmlsbGljPTEyNjc7dC51aW52ZXJ0ZWRicmV2ZT01MzU7dC51a2F0YWthbmE9MTI0NTQ7dC51a2F0YWthbmFoYWxmd2lkdGg9NjUzOTU7dC51a2N5cmlsbGljPTExNDU7dC51a29yZWFuPTEyNjM2O3QudW1hY3Jvbj0zNjM7dC51bWFjcm9uY3lyaWxsaWM9MTI2Mzt0LnVtYWNyb25kaWVyZXNpcz03ODAzO3QudW1hdHJhZ3VybXVraGk9MjYyNTt0LnVtb25vc3BhY2U9NjUzNjU7dC51bmRlcnNjb3JlPTk1O3QudW5kZXJzY29yZWRibD04MjE1O3QudW5kZXJzY29yZW1vbm9zcGFjZT02NTM0Mzt0LnVuZGVyc2NvcmV2ZXJ0aWNhbD02NTA3NTt0LnVuZGVyc2NvcmV3YXZ5PTY1MTAzO3QudW5pb249ODc0Njt0LnVuaXZlcnNhbD04NzA0O3QudW9nb25laz0zNzE7dC51cGFyZW49OTM5Mjt0LnVwYmxvY2s9OTYwMDt0LnVwcGVyZG90aGVicmV3PTE0NzY7dC51cHNpbG9uPTk2NTt0LnVwc2lsb25kaWVyZXNpcz05NzE7dC51cHNpbG9uZGllcmVzaXN0b25vcz05NDQ7dC51cHNpbG9ubGF0aW49NjUwO3QudXBzaWxvbnRvbm9zPTk3Mzt0LnVwdGFja2JlbG93Y21iPTc5Nzt0LnVwdGFja21vZD03MjQ7dC51cmFndXJtdWtoaT0yNjc1O3QudXJpbmc9MzY3O3QudXNob3J0Y3lyaWxsaWM9MTExODt0LnVzbWFsbGhpcmFnYW5hPTEyMzU3O3QudXNtYWxsa2F0YWthbmE9MTI0NTM7dC51c21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM4NTt0LnVzdHJhaWdodGN5cmlsbGljPTExOTk7dC51c3RyYWlnaHRzdHJva2VjeXJpbGxpYz0xMjAxO3QudXRpbGRlPTM2MTt0LnV0aWxkZWFjdXRlPTc4MDE7dC51dGlsZGViZWxvdz03Nzk3O3QudXViZW5nYWxpPTI0NDI7dC51dWRldmE9MjMxNDt0LnV1Z3VqYXJhdGk9MjY5ODt0LnV1Z3VybXVraGk9MjU3MDt0LnV1bWF0cmFndXJtdWtoaT0yNjI2O3QudXV2b3dlbHNpZ25iZW5nYWxpPTI0OTg7dC51dXZvd2Vsc2lnbmRldmE9MjM3MDt0LnV1dm93ZWxzaWduZ3VqYXJhdGk9Mjc1NDt0LnV2b3dlbHNpZ25iZW5nYWxpPTI0OTc7dC51dm93ZWxzaWduZGV2YT0yMzY5O3QudXZvd2Vsc2lnbmd1amFyYXRpPTI3NTM7dC52PTExODt0LnZhZGV2YT0yMzU3O3QudmFndWphcmF0aT0yNzQxO3QudmFndXJtdWtoaT0yNjEzO3QudmFrYXRha2FuYT0xMjUzNTt0LnZhdj0xNDkzO3QudmF2ZGFnZXNoPTY0MzA5O3QudmF2ZGFnZXNoNjU9NjQzMDk7dC52YXZkYWdlc2hoZWJyZXc9NjQzMDk7dC52YXZoZWJyZXc9MTQ5Mzt0LnZhdmhvbGFtPTY0MzMxO3QudmF2aG9sYW1oZWJyZXc9NjQzMzE7dC52YXZ2YXZoZWJyZXc9MTUyMDt0LnZhdnlvZGhlYnJldz0xNTIxO3QudmNpcmNsZT05NDQ1O3QudmRvdGJlbG93PTc4MDc7dC52ZWN5cmlsbGljPTEwNzQ7dC52ZWhhcmFiaWM9MTcwMDt0LnZlaGZpbmFsYXJhYmljPTY0MzYzO3QudmVoaW5pdGlhbGFyYWJpYz02NDM2NDt0LnZlaG1lZGlhbGFyYWJpYz02NDM2NTt0LnZla2F0YWthbmE9MTI1Mzc7dC52ZW51cz05NzkyO3QudmVydGljYWxiYXI9MTI0O3QudmVydGljYWxsaW5lYWJvdmVjbWI9NzgxO3QudmVydGljYWxsaW5lYmVsb3djbWI9ODA5O3QudmVydGljYWxsaW5lbG93bW9kPTcxNjt0LnZlcnRpY2FsbGluZW1vZD03MTI7dC52ZXdhcm1lbmlhbj0xNDA2O3Qudmhvb2s9NjUxO3QudmlrYXRha2FuYT0xMjUzNjt0LnZpcmFtYWJlbmdhbGk9MjUwOTt0LnZpcmFtYWRldmE9MjM4MTt0LnZpcmFtYWd1amFyYXRpPTI3NjU7dC52aXNhcmdhYmVuZ2FsaT0yNDM1O3QudmlzYXJnYWRldmE9MjMwNzt0LnZpc2FyZ2FndWphcmF0aT0yNjkxO3Qudm1vbm9zcGFjZT02NTM2Njt0LnZvYXJtZW5pYW49MTQwMDt0LnZvaWNlZGl0ZXJhdGlvbmhpcmFnYW5hPTEyNDQ2O3Qudm9pY2VkaXRlcmF0aW9ua2F0YWthbmE9MTI1NDI7dC52b2ljZWRtYXJra2FuYT0xMjQ0Mzt0LnZvaWNlZG1hcmtrYW5haGFsZndpZHRoPTY1NDM4O3Qudm9rYXRha2FuYT0xMjUzODt0LnZwYXJlbj05MzkzO3QudnRpbGRlPTc4MDU7dC52dHVybmVkPTY1Mjt0LnZ1aGlyYWdhbmE9MTI0MzY7dC52dWthdGFrYW5hPTEyNTMyO3Qudz0xMTk7dC53YWN1dGU9NzgxMTt0LndhZWtvcmVhbj0xMjYzMzt0LndhaGlyYWdhbmE9MTI0MzE7dC53YWthdGFrYW5hPTEyNTI3O3Qud2FrYXRha2FuYWhhbGZ3aWR0aD02NTQzNjt0Lndha29yZWFuPTEyNjMyO3Qud2FzbWFsbGhpcmFnYW5hPTEyNDMwO3Qud2FzbWFsbGthdGFrYW5hPTEyNTI2O3Qud2F0dG9zcXVhcmU9MTMxNDM7dC53YXZlZGFzaD0xMjMxNjt0Lndhdnl1bmRlcnNjb3JldmVydGljYWw9NjUwNzY7dC53YXdhcmFiaWM9MTYwODt0Lndhd2ZpbmFsYXJhYmljPTY1MjYyO3Qud2F3aGFtemFhYm92ZWFyYWJpYz0xNTcyO3Qud2F3aGFtemFhYm92ZWZpbmFsYXJhYmljPTY1MTU4O3Qud2JzcXVhcmU9MTMyNzc7dC53Y2lyY2xlPTk0NDY7dC53Y2lyY3VtZmxleD0zNzM7dC53ZGllcmVzaXM9NzgxMzt0Lndkb3RhY2NlbnQ9NzgxNTt0Lndkb3RiZWxvdz03ODE3O3Qud2VoaXJhZ2FuYT0xMjQzMzt0LndlaWVyc3RyYXNzPTg0NzI7dC53ZWthdGFrYW5hPTEyNTI5O3Qud2Vrb3JlYW49MTI2Mzg7dC53ZW9rb3JlYW49MTI2Mzc7dC53Z3JhdmU9NzgwOTt0LndoaXRlYnVsbGV0PTk3MDI7dC53aGl0ZWNpcmNsZT05Njc1O3Qud2hpdGVjaXJjbGVpbnZlcnNlPTk2ODk7dC53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0PTEyMzAyO3Qud2hpdGVjb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsPTY1MDkxO3Qud2hpdGVjb3JuZXJicmFja2V0cmlnaHQ9MTIzMDM7dC53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsPTY1MDkyO3Qud2hpdGVkaWFtb25kPTk2NzE7dC53aGl0ZWRpYW1vbmRjb250YWluaW5nYmxhY2tzbWFsbGRpYW1vbmQ9OTY3Mjt0LndoaXRlZG93bnBvaW50aW5nc21hbGx0cmlhbmdsZT05NjYzO3Qud2hpdGVkb3ducG9pbnRpbmd0cmlhbmdsZT05NjYxO3Qud2hpdGVsZWZ0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2Njc7dC53aGl0ZWxlZnRwb2ludGluZ3RyaWFuZ2xlPTk2NjU7dC53aGl0ZWxlbnRpY3VsYXJicmFja2V0bGVmdD0xMjMxMDt0LndoaXRlbGVudGljdWxhcmJyYWNrZXRyaWdodD0xMjMxMTt0LndoaXRlcmlnaHRwb2ludGluZ3NtYWxsdHJpYW5nbGU9OTY1Nzt0LndoaXRlcmlnaHRwb2ludGluZ3RyaWFuZ2xlPTk2NTU7dC53aGl0ZXNtYWxsc3F1YXJlPTk2NDM7dC53aGl0ZXNtaWxpbmdmYWNlPTk3ODY7dC53aGl0ZXNxdWFyZT05NjMzO3Qud2hpdGVzdGFyPTk3MzQ7dC53aGl0ZXRlbGVwaG9uZT05NzQzO3Qud2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQ9MTIzMTI7dC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQ9MTIzMTM7dC53aGl0ZXVwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2NTM7dC53aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZT05NjUxO3Qud2loaXJhZ2FuYT0xMjQzMjt0Lndpa2F0YWthbmE9MTI1Mjg7dC53aWtvcmVhbj0xMjYzOTt0Lndtb25vc3BhY2U9NjUzNjc7dC53b2hpcmFnYW5hPTEyNDM0O3Qud29rYXRha2FuYT0xMjUzMDt0Lndva2F0YWthbmFoYWxmd2lkdGg9NjUzODI7dC53b249ODM2MTt0Lndvbm1vbm9zcGFjZT02NTUxMDt0Lndvd2FlbnRoYWk9MzYyMzt0LndwYXJlbj05Mzk0O3Qud3Jpbmc9NzgzMjt0LndzdXBlcmlvcj02OTU7dC53dHVybmVkPTY1Mzt0Lnd5bm49NDQ3O3QueD0xMjA7dC54YWJvdmVjbWI9ODI5O3QueGJvcG9tb2ZvPTEyNTYyO3QueGNpcmNsZT05NDQ3O3QueGRpZXJlc2lzPTc4MjE7dC54ZG90YWNjZW50PTc4MTk7dC54ZWhhcm1lbmlhbj0xMzg5O3QueGk9OTU4O3QueG1vbm9zcGFjZT02NTM2ODt0LnhwYXJlbj05Mzk1O3QueHN1cGVyaW9yPTczOTt0Lnk9MTIxO3QueWFhZG9zcXVhcmU9MTMxMzQ7dC55YWJlbmdhbGk9MjQ3OTt0LnlhY3V0ZT0yNTM7dC55YWRldmE9MjM1MTt0LnlhZWtvcmVhbj0xMjYyNjt0LnlhZ3VqYXJhdGk9MjczNTt0LnlhZ3VybXVraGk9MjYwNzt0LnlhaGlyYWdhbmE9MTI0MjA7dC55YWthdGFrYW5hPTEyNTE2O3QueWFrYXRha2FuYWhhbGZ3aWR0aD02NTQyODt0Lnlha29yZWFuPTEyNjI1O3QueWFtYWtrYW50aGFpPTM2NjI7dC55YXNtYWxsaGlyYWdhbmE9MTI0MTk7dC55YXNtYWxsa2F0YWthbmE9MTI1MTU7dC55YXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODg7dC55YXRjeXJpbGxpYz0xMTIzO3QueWNpcmNsZT05NDQ4O3QueWNpcmN1bWZsZXg9Mzc1O3QueWRpZXJlc2lzPTI1NTt0Lnlkb3RhY2NlbnQ9NzgyMzt0Lnlkb3RiZWxvdz03OTI1O3QueWVoYXJhYmljPTE2MTA7dC55ZWhiYXJyZWVhcmFiaWM9MTc0Njt0LnllaGJhcnJlZWZpbmFsYXJhYmljPTY0NDMxO3QueWVoZmluYWxhcmFiaWM9NjUyNjY7dC55ZWhoYW16YWFib3ZlYXJhYmljPTE1NzQ7dC55ZWhoYW16YWFib3ZlZmluYWxhcmFiaWM9NjUxNjI7dC55ZWhoYW16YWFib3ZlaW5pdGlhbGFyYWJpYz02NTE2Mzt0LnllaGhhbXphYWJvdmVtZWRpYWxhcmFiaWM9NjUxNjQ7dC55ZWhpbml0aWFsYXJhYmljPTY1MjY3O3QueWVobWVkaWFsYXJhYmljPTY1MjY4O3QueWVobWVlbWluaXRpYWxhcmFiaWM9NjQ3MzM7dC55ZWhtZWVtaXNvbGF0ZWRhcmFiaWM9NjQ2MDA7dC55ZWhub29uZmluYWxhcmFiaWM9NjQ2NjA7dC55ZWh0aHJlZWRvdHNiZWxvd2FyYWJpYz0xNzQ1O3QueWVrb3JlYW49MTI2MzA7dC55ZW49MTY1O3QueWVubW9ub3NwYWNlPTY1NTA5O3QueWVva29yZWFuPTEyNjI5O3QueWVvcmluaGlldWhrb3JlYW49MTI2Nzg7dC55ZXJhaGJlbnlvbW9oZWJyZXc9MTQ1MDt0LnllcmFoYmVueW9tb2xlZnRoZWJyZXc9MTQ1MDt0LnllcmljeXJpbGxpYz0xMDk5O3QueWVydWRpZXJlc2lzY3lyaWxsaWM9MTI3Mzt0Lnllc2lldW5na29yZWFuPTEyNjczO3QueWVzaWV1bmdwYW5zaW9za29yZWFuPTEyNjc1O3QueWVzaWV1bmdzaW9za29yZWFuPTEyNjc0O3QueWV0aXZoZWJyZXc9MTQzNDt0LnlncmF2ZT03OTIzO3QueWhvb2s9NDM2O3QueWhvb2thYm92ZT03OTI3O3QueWlhcm1lbmlhbj0xMzk3O3QueWljeXJpbGxpYz0xMTExO3QueWlrb3JlYW49MTI2NDI7dC55aW55YW5nPTk3NzU7dC55aXduYXJtZW5pYW49MTQxMDt0Lnltb25vc3BhY2U9NjUzNjk7dC55b2Q9MTQ5Nzt0LnlvZGRhZ2VzaD02NDMxMzt0LnlvZGRhZ2VzaGhlYnJldz02NDMxMzt0LnlvZGhlYnJldz0xNDk3O3QueW9keW9kaGVicmV3PTE1MjI7dC55b2R5b2RwYXRhaGhlYnJldz02NDI4Nzt0LnlvaGlyYWdhbmE9MTI0MjQ7dC55b2lrb3JlYW49MTI2ODE7dC55b2thdGFrYW5hPTEyNTIwO3QueW9rYXRha2FuYWhhbGZ3aWR0aD02NTQzMDt0Lnlva29yZWFuPTEyNjM1O3QueW9zbWFsbGhpcmFnYW5hPTEyNDIzO3QueW9zbWFsbGthdGFrYW5hPTEyNTE5O3QueW9zbWFsbGthdGFrYW5haGFsZndpZHRoPTY1MzkwO3QueW90Z3JlZWs9MTAxMTt0LnlveWFla29yZWFuPTEyNjgwO3QueW95YWtvcmVhbj0xMjY3OTt0LnlveWFrdGhhaT0zNjE4O3QueW95aW5ndGhhaT0zNTk3O3QueXBhcmVuPTkzOTY7dC55cG9nZWdyYW1tZW5pPTg5MDt0Lnlwb2dlZ3JhbW1lbmlncmVla2NtYj04Mzc7dC55cj00MjI7dC55cmluZz03ODMzO3QueXN1cGVyaW9yPTY5Njt0Lnl0aWxkZT03OTI5O3QueXR1cm5lZD02NTQ7dC55dWhpcmFnYW5hPTEyNDIyO3QueXVpa29yZWFuPTEyNjg0O3QueXVrYXRha2FuYT0xMjUxODt0Lnl1a2F0YWthbmFoYWxmd2lkdGg9NjU0Mjk7dC55dWtvcmVhbj0xMjY0MDt0Lnl1c2JpZ2N5cmlsbGljPTExMzE7dC55dXNiaWdpb3RpZmllZGN5cmlsbGljPTExMzM7dC55dXNsaXR0bGVjeXJpbGxpYz0xMTI3O3QueXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYz0xMTI5O3QueXVzbWFsbGhpcmFnYW5hPTEyNDIxO3QueXVzbWFsbGthdGFrYW5hPTEyNTE3O3QueXVzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg5O3QueXV5ZWtvcmVhbj0xMjY4Mzt0Lnl1eWVva29yZWFuPTEyNjgyO3QueXlhYmVuZ2FsaT0yNTI3O3QueXlhZGV2YT0yMzk5O3Quej0xMjI7dC56YWFybWVuaWFuPTEzODI7dC56YWN1dGU9Mzc4O3QuemFkZXZhPTIzOTU7dC56YWd1cm11a2hpPTI2NTE7dC56YWhhcmFiaWM9MTU5Mjt0LnphaGZpbmFsYXJhYmljPTY1MjIyO3QuemFoaW5pdGlhbGFyYWJpYz02NTIyMzt0LnphaGlyYWdhbmE9MTIzNzQ7dC56YWhtZWRpYWxhcmFiaWM9NjUyMjQ7dC56YWluYXJhYmljPTE1ODY7dC56YWluZmluYWxhcmFiaWM9NjUyMDA7dC56YWthdGFrYW5hPTEyNDcwO3QuemFxZWZnYWRvbGhlYnJldz0xNDI5O3QuemFxZWZxYXRhbmhlYnJldz0xNDI4O3QuemFycWFoZWJyZXc9MTQzMjt0LnpheWluPTE0OTQ7dC56YXlpbmRhZ2VzaD02NDMxMDt0LnpheWluZGFnZXNoaGVicmV3PTY0MzEwO3QuemF5aW5oZWJyZXc9MTQ5NDt0Lnpib3BvbW9mbz0xMjU2Nzt0LnpjYXJvbj0zODI7dC56Y2lyY2xlPTk0NDk7dC56Y2lyY3VtZmxleD03ODI1O3QuemN1cmw9NjU3O3QuemRvdD0zODA7dC56ZG90YWNjZW50PTM4MDt0Lnpkb3RiZWxvdz03ODI3O3QuemVjeXJpbGxpYz0xMDc5O3QuemVkZXNjZW5kZXJjeXJpbGxpYz0xMTc3O3QuemVkaWVyZXNpc2N5cmlsbGljPTEyNDc7dC56ZWhpcmFnYW5hPTEyMzgwO3QuemVrYXRha2FuYT0xMjQ3Njt0Lnplcm89NDg7dC56ZXJvYXJhYmljPTE2MzI7dC56ZXJvYmVuZ2FsaT0yNTM0O3QuemVyb2RldmE9MjQwNjt0Lnplcm9ndWphcmF0aT0yNzkwO3QuemVyb2d1cm11a2hpPTI2NjI7dC56ZXJvaGFja2FyYWJpYz0xNjMyO3QuemVyb2luZmVyaW9yPTgzMjA7dC56ZXJvbW9ub3NwYWNlPTY1Mjk2O3QuemVyb29sZHN0eWxlPTYzMjgwO3QuemVyb3BlcnNpYW49MTc3Njt0Lnplcm9zdXBlcmlvcj04MzA0O3QuemVyb3RoYWk9MzY2NDt0Lnplcm93aWR0aGpvaW5lcj02NTI3OTt0Lnplcm93aWR0aG5vbmpvaW5lcj04MjA0O3QuemVyb3dpZHRoc3BhY2U9ODIwMzt0LnpldGE9OTUwO3Quemhib3BvbW9mbz0xMjU2Mzt0LnpoZWFybWVuaWFuPTEzODY7dC56aGVicmV2ZWN5cmlsbGljPTEyMTg7dC56aGVjeXJpbGxpYz0xMDc4O3QuemhlZGVzY2VuZGVyY3lyaWxsaWM9MTE3NTt0LnpoZWRpZXJlc2lzY3lyaWxsaWM9MTI0NTt0LnppaGlyYWdhbmE9MTIzNzY7dC56aWthdGFrYW5hPTEyNDcyO3Quemlub3JoZWJyZXc9MTQ1NDt0LnpsaW5lYmVsb3c9NzgyOTt0Lnptb25vc3BhY2U9NjUzNzA7dC56b2hpcmFnYW5hPTEyMzgyO3Quem9rYXRha2FuYT0xMjQ3ODt0LnpwYXJlbj05Mzk3O3QuenJldHJvZmxleGhvb2s9NjU2O3QuenN0cm9rZT00Mzg7dC56dWhpcmFnYW5hPTEyMzc4O3QuenVrYXRha2FuYT0xMjQ3NDt0WyIubm90ZGVmIl09MDt0LmFuZ2JyYWNrZXRsZWZ0YmlnPTkwMDE7dC5hbmdicmFja2V0bGVmdEJpZz05MDAxO3QuYW5nYnJhY2tldGxlZnRiaWdnPTkwMDE7dC5hbmdicmFja2V0bGVmdEJpZ2c9OTAwMTt0LmFuZ2JyYWNrZXRyaWdodEJpZz05MDAyO3QuYW5nYnJhY2tldHJpZ2h0YmlnPTkwMDI7dC5hbmdicmFja2V0cmlnaHRCaWdnPTkwMDI7dC5hbmdicmFja2V0cmlnaHRiaWdnPTkwMDI7dC5hcnJvd2hvb2tsZWZ0PTg2MTg7dC5hcnJvd2hvb2tyaWdodD04NjE3O3QuYXJyb3dsZWZ0dG9waGFsZj04NjM2O3QuYXJyb3dsZWZ0Ym90aGFsZj04NjM3O3QuYXJyb3dub3J0aGVhc3Q9ODU5OTt0LmFycm93bm9ydGh3ZXN0PTg1OTg7dC5hcnJvd3JpZ2h0dG9waGFsZj04NjQwO3QuYXJyb3dyaWdodGJvdGhhbGY9ODY0MTt0LmFycm93c291dGhlYXN0PTg2MDA7dC5hcnJvd3NvdXRod2VzdD04NjAxO3QuYmFja3NsYXNoYmlnPTg3MjY7dC5iYWNrc2xhc2hCaWc9ODcyNjt0LmJhY2tzbGFzaEJpZ2c9ODcyNjt0LmJhY2tzbGFzaGJpZ2c9ODcyNjt0LmJhcmRibD04MjE0O3QuYnJhY2VodGlwZG93bmxlZnQ9NjUwNzk7dC5icmFjZWh0aXBkb3ducmlnaHQ9NjUwNzk7dC5icmFjZWh0aXB1cGxlZnQ9NjUwODA7dC5icmFjZWh0aXB1cHJpZ2h0PTY1MDgwO3QuYnJhY2VsZWZ0QmlnPTEyMzt0LmJyYWNlbGVmdGJpZz0xMjM7dC5icmFjZWxlZnRiaWdnPTEyMzt0LmJyYWNlbGVmdEJpZ2c9MTIzO3QuYnJhY2VyaWdodEJpZz0xMjU7dC5icmFjZXJpZ2h0YmlnPTEyNTt0LmJyYWNlcmlnaHRiaWdnPTEyNTt0LmJyYWNlcmlnaHRCaWdnPTEyNTt0LmJyYWNrZXRsZWZ0YmlnPTkxO3QuYnJhY2tldGxlZnRCaWc9OTE7dC5icmFja2V0bGVmdGJpZ2c9OTE7dC5icmFja2V0bGVmdEJpZ2c9OTE7dC5icmFja2V0cmlnaHRCaWc9OTM7dC5icmFja2V0cmlnaHRiaWc9OTM7dC5icmFja2V0cmlnaHRiaWdnPTkzO3QuYnJhY2tldHJpZ2h0QmlnZz05Mzt0LmNlaWxpbmdsZWZ0YmlnPTg5Njg7dC5jZWlsaW5nbGVmdEJpZz04OTY4O3QuY2VpbGluZ2xlZnRCaWdnPTg5Njg7dC5jZWlsaW5nbGVmdGJpZ2c9ODk2ODt0LmNlaWxpbmdyaWdodGJpZz04OTY5O3QuY2VpbGluZ3JpZ2h0QmlnPTg5Njk7dC5jZWlsaW5ncmlnaHRiaWdnPTg5Njk7dC5jZWlsaW5ncmlnaHRCaWdnPTg5Njk7dC5jaXJjbGVkb3RkaXNwbGF5PTg4NTc7dC5jaXJjbGVkb3R0ZXh0PTg4NTc7dC5jaXJjbGVtdWx0aXBseWRpc3BsYXk9ODg1NTt0LmNpcmNsZW11bHRpcGx5dGV4dD04ODU1O3QuY2lyY2xlcGx1c2Rpc3BsYXk9ODg1Mzt0LmNpcmNsZXBsdXN0ZXh0PTg4NTM7dC5jb250aW50ZWdyYWxkaXNwbGF5PTg3NTA7dC5jb250aW50ZWdyYWx0ZXh0PTg3NTA7dC5jb3Byb2R1Y3RkaXNwbGF5PTg3MjA7dC5jb3Byb2R1Y3R0ZXh0PTg3MjA7dC5mbG9vcmxlZnRCaWc9ODk3MDt0LmZsb29ybGVmdGJpZz04OTcwO3QuZmxvb3JsZWZ0YmlnZz04OTcwO3QuZmxvb3JsZWZ0QmlnZz04OTcwO3QuZmxvb3JyaWdodGJpZz04OTcxO3QuZmxvb3JyaWdodEJpZz04OTcxO3QuZmxvb3JyaWdodEJpZ2c9ODk3MTt0LmZsb29ycmlnaHRiaWdnPTg5NzE7dC5oYXR3aWRlPTc3MDt0LmhhdHdpZGVyPTc3MDt0LmhhdHdpZGVzdD03NzA7dC5pbnRlcmNhbD03NDg4O3QuaW50ZWdyYWxkaXNwbGF5PTg3NDc7dC5pbnRlZ3JhbHRleHQ9ODc0Nzt0LmludGVyc2VjdGlvbmRpc3BsYXk9ODg5ODt0LmludGVyc2VjdGlvbnRleHQ9ODg5ODt0LmxvZ2ljYWxhbmRkaXNwbGF5PTg3NDM7dC5sb2dpY2FsYW5kdGV4dD04NzQzO3QubG9naWNhbG9yZGlzcGxheT04NzQ0O3QubG9naWNhbG9ydGV4dD04NzQ0O3QucGFyZW5sZWZ0QmlnPTQwO3QucGFyZW5sZWZ0YmlnPTQwO3QucGFyZW5sZWZ0QmlnZz00MDt0LnBhcmVubGVmdGJpZ2c9NDA7dC5wYXJlbnJpZ2h0QmlnPTQxO3QucGFyZW5yaWdodGJpZz00MTt0LnBhcmVucmlnaHRCaWdnPTQxO3QucGFyZW5yaWdodGJpZ2c9NDE7dC5wcmltZT04MjQyO3QucHJvZHVjdGRpc3BsYXk9ODcxOTt0LnByb2R1Y3R0ZXh0PTg3MTk7dC5yYWRpY2FsYmlnPTg3MzA7dC5yYWRpY2FsQmlnPTg3MzA7dC5yYWRpY2FsQmlnZz04NzMwO3QucmFkaWNhbGJpZ2c9ODczMDt0LnJhZGljYWxidD04NzMwO3QucmFkaWNhbHRwPTg3MzA7dC5yYWRpY2FsdmVydGV4PTg3MzA7dC5zbGFzaGJpZz00Nzt0LnNsYXNoQmlnPTQ3O3Quc2xhc2hCaWdnPTQ3O3Quc2xhc2hiaWdnPTQ3O3Quc3VtbWF0aW9uZGlzcGxheT04NzIxO3Quc3VtbWF0aW9udGV4dD04NzIxO3QudGlsZGV3aWRlPTczMjt0LnRpbGRld2lkZXI9NzMyO3QudGlsZGV3aWRlc3Q9NzMyO3QudW5pb25kaXNwbGF5PTg4OTk7dC51bmlvbm11bHRpZGlzcGxheT04ODQ2O3QudW5pb25tdWx0aXRleHQ9ODg0Njt0LnVuaW9uc3FkaXNwbGF5PTg4NTI7dC51bmlvbnNxdGV4dD04ODUyO3QudW5pb250ZXh0PTg4OTk7dC52ZXh0ZW5kZG91YmxlPTg3NDE7dC52ZXh0ZW5kc2luZ2xlPTg3Mzl9KSksYz1pKChmdW5jdGlvbih0KXt0LnNwYWNlPTMyO3QuYTE9OTk4NTt0LmEyPTk5ODY7dC5hMjAyPTk5ODc7dC5hMz05OTg4O3QuYTQ9OTc0Mjt0LmE1PTk5OTA7dC5hMTE5PTk5OTE7dC5hMTE4PTk5OTI7dC5hMTE3PTk5OTM7dC5hMTE9OTc1NTt0LmExMj05NzU4O3QuYTEzPTk5OTY7dC5hMTQ9OTk5Nzt0LmExNT05OTk4O3QuYTE2PTk5OTk7dC5hMTA1PTFlNDt0LmExNz0xMDAwMTt0LmExOD0xMDAwMjt0LmExOT0xMDAwMzt0LmEyMD0xMDAwNDt0LmEyMT0xMDAwNTt0LmEyMj0xMDAwNjt0LmEyMz0xMDAwNzt0LmEyND0xMDAwODt0LmEyNT0xMDAwOTt0LmEyNj0xMDAxMDt0LmEyNz0xMDAxMTt0LmEyOD0xMDAxMjt0LmE2PTEwMDEzO3QuYTc9MTAwMTQ7dC5hOD0xMDAxNTt0LmE5PTEwMDE2O3QuYTEwPTEwMDE3O3QuYTI5PTEwMDE4O3QuYTMwPTEwMDE5O3QuYTMxPTEwMDIwO3QuYTMyPTEwMDIxO3QuYTMzPTEwMDIyO3QuYTM0PTEwMDIzO3QuYTM1PTk3MzM7dC5hMzY9MTAwMjU7dC5hMzc9MTAwMjY7dC5hMzg9MTAwMjc7dC5hMzk9MTAwMjg7dC5hNDA9MTAwMjk7dC5hNDE9MTAwMzA7dC5hNDI9MTAwMzE7dC5hNDM9MTAwMzI7dC5hNDQ9MTAwMzM7dC5hNDU9MTAwMzQ7dC5hNDY9MTAwMzU7dC5hNDc9MTAwMzY7dC5hNDg9MTAwMzc7dC5hNDk9MTAwMzg7dC5hNTA9MTAwMzk7dC5hNTE9MTAwNDA7dC5hNTI9MTAwNDE7dC5hNTM9MTAwNDI7dC5hNTQ9MTAwNDM7dC5hNTU9MTAwNDQ7dC5hNTY9MTAwNDU7dC5hNTc9MTAwNDY7dC5hNTg9MTAwNDc7dC5hNTk9MTAwNDg7dC5hNjA9MTAwNDk7dC5hNjE9MTAwNTA7dC5hNjI9MTAwNTE7dC5hNjM9MTAwNTI7dC5hNjQ9MTAwNTM7dC5hNjU9MTAwNTQ7dC5hNjY9MTAwNTU7dC5hNjc9MTAwNTY7dC5hNjg9MTAwNTc7dC5hNjk9MTAwNTg7dC5hNzA9MTAwNTk7dC5hNzE9OTY3OTt0LmE3Mj0xMDA2MTt0LmE3Mz05NjMyO3QuYTc0PTEwMDYzO3QuYTIwMz0xMDA2NDt0LmE3NT0xMDA2NTt0LmEyMDQ9MTAwNjY7dC5hNzY9OTY1MDt0LmE3Nz05NjYwO3QuYTc4PTk2NzA7dC5hNzk9MTAwNzA7dC5hODE9OTY4Nzt0LmE4Mj0xMDA3Mjt0LmE4Mz0xMDA3Mzt0LmE4ND0xMDA3NDt0LmE5Nz0xMDA3NTt0LmE5OD0xMDA3Njt0LmE5OT0xMDA3Nzt0LmExMDA9MTAwNzg7dC5hMTAxPTEwMDgxO3QuYTEwMj0xMDA4Mjt0LmExMDM9MTAwODM7dC5hMTA0PTEwMDg0O3QuYTEwNj0xMDA4NTt0LmExMDc9MTAwODY7dC5hMTA4PTEwMDg3O3QuYTExMj05ODI3O3QuYTExMT05ODMwO3QuYTExMD05ODI5O3QuYTEwOT05ODI0O3QuYTEyMD05MzEyO3QuYTEyMT05MzEzO3QuYTEyMj05MzE0O3QuYTEyMz05MzE1O3QuYTEyND05MzE2O3QuYTEyNT05MzE3O3QuYTEyNj05MzE4O3QuYTEyNz05MzE5O3QuYTEyOD05MzIwO3QuYTEyOT05MzIxO3QuYTEzMD0xMDEwMjt0LmExMzE9MTAxMDM7dC5hMTMyPTEwMTA0O3QuYTEzMz0xMDEwNTt0LmExMzQ9MTAxMDY7dC5hMTM1PTEwMTA3O3QuYTEzNj0xMDEwODt0LmExMzc9MTAxMDk7dC5hMTM4PTEwMTEwO3QuYTEzOT0xMDExMTt0LmExNDA9MTAxMTI7dC5hMTQxPTEwMTEzO3QuYTE0Mj0xMDExNDt0LmExNDM9MTAxMTU7dC5hMTQ0PTEwMTE2O3QuYTE0NT0xMDExNzt0LmExNDY9MTAxMTg7dC5hMTQ3PTEwMTE5O3QuYTE0OD0xMDEyMDt0LmExNDk9MTAxMjE7dC5hMTUwPTEwMTIyO3QuYTE1MT0xMDEyMzt0LmExNTI9MTAxMjQ7dC5hMTUzPTEwMTI1O3QuYTE1ND0xMDEyNjt0LmExNTU9MTAxMjc7dC5hMTU2PTEwMTI4O3QuYTE1Nz0xMDEyOTt0LmExNTg9MTAxMzA7dC5hMTU5PTEwMTMxO3QuYTE2MD0xMDEzMjt0LmExNjE9ODU5NDt0LmExNjM9ODU5Njt0LmExNjQ9ODU5Nzt0LmExOTY9MTAxMzY7dC5hMTY1PTEwMTM3O3QuYTE5Mj0xMDEzODt0LmExNjY9MTAxMzk7dC5hMTY3PTEwMTQwO3QuYTE2OD0xMDE0MTt0LmExNjk9MTAxNDI7dC5hMTcwPTEwMTQzO3QuYTE3MT0xMDE0NDt0LmExNzI9MTAxNDU7dC5hMTczPTEwMTQ2O3QuYTE2Mj0xMDE0Nzt0LmExNzQ9MTAxNDg7dC5hMTc1PTEwMTQ5O3QuYTE3Nj0xMDE1MDt0LmExNzc9MTAxNTE7dC5hMTc4PTEwMTUyO3QuYTE3OT0xMDE1Mzt0LmExOTM9MTAxNTQ7dC5hMTgwPTEwMTU1O3QuYTE5OT0xMDE1Njt0LmExODE9MTAxNTc7dC5hMjAwPTEwMTU4O3QuYTE4Mj0xMDE1OTt0LmEyMDE9MTAxNjE7dC5hMTgzPTEwMTYyO3QuYTE4ND0xMDE2Mzt0LmExOTc9MTAxNjQ7dC5hMTg1PTEwMTY1O3QuYTE5ND0xMDE2Njt0LmExOTg9MTAxNjc7dC5hMTg2PTEwMTY4O3QuYTE5NT0xMDE2OTt0LmExODc9MTAxNzA7dC5hMTg4PTEwMTcxO3QuYTE4OT0xMDE3Mjt0LmExOTA9MTAxNzM7dC5hMTkxPTEwMTc0O3QuYTg5PTEwMDg4O3QuYTkwPTEwMDg5O3QuYTkzPTEwMDkwO3QuYTk0PTEwMDkxO3QuYTkxPTEwMDkyO3QuYTkyPTEwMDkzO3QuYTIwNT0xMDA5NDt0LmE4NT0xMDA5NTt0LmEyMDY9MTAwOTY7dC5hODY9MTAwOTc7dC5hODc9MTAwOTg7dC5hODg9MTAwOTk7dC5hOTU9MTAxMDA7dC5hOTY9MTAxMDE7dFsiLm5vdGRlZiJdPTB9KSk7ci5nZXRHbHlwaHNVbmljb2RlPW87ci5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGU9Y30sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmk9ci5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2s9ci5nZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHM9ci5nZXRTeW1ib2xzRm9udHM9ci5nZXRTZXJpZkZvbnRzPXIuZ2V0Tm9uU3RkRm9udE1hcD1yLmdldFN0ZEZvbnRNYXA9dm9pZCAwO3ZhciBpPWEoMjA1KSxvPSgwLGkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24odCl7dC5BcmlhbE5hcnJvdz0iSGVsdmV0aWNhIjt0WyJBcmlhbE5hcnJvdy1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjt0WyJBcmlhbE5hcnJvdy1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7dFsiQXJpYWxOYXJyb3ctSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIjt0LkFyaWFsQmxhY2s9IkhlbHZldGljYSI7dFsiQXJpYWxCbGFjay1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjt0WyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjt0WyJBcmlhbEJsYWNrLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7dFsiQXJpYWwtQmxhY2siXT0iSGVsdmV0aWNhIjt0WyJBcmlhbC1CbGFjay1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjt0WyJBcmlhbC1CbGFjay1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7dFsiQXJpYWwtQmxhY2stSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIjt0LkFyaWFsPSJIZWx2ZXRpY2EiO3RbIkFyaWFsLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiO3RbIkFyaWFsLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjt0WyJBcmlhbC1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO3RbIkFyaWFsLUJvbGRJdGFsaWNNVCJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO3RbIkFyaWFsLUJvbGRNVCJdPSJIZWx2ZXRpY2EtQm9sZCI7dFsiQXJpYWwtSXRhbGljTVQiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO3QuQXJpYWxNVD0iSGVsdmV0aWNhIjt0WyJDb3VyaWVyLUJvbGQiXT0iQ291cmllci1Cb2xkIjt0WyJDb3VyaWVyLUJvbGRJdGFsaWMiXT0iQ291cmllci1Cb2xkT2JsaXF1ZSI7dFsiQ291cmllci1JdGFsaWMiXT0iQ291cmllci1PYmxpcXVlIjt0LkNvdXJpZXJOZXc9IkNvdXJpZXIiO3RbIkNvdXJpZXJOZXctQm9sZCJdPSJDb3VyaWVyLUJvbGQiO3RbIkNvdXJpZXJOZXctQm9sZEl0YWxpYyJdPSJDb3VyaWVyLUJvbGRPYmxpcXVlIjt0WyJDb3VyaWVyTmV3LUl0YWxpYyJdPSJDb3VyaWVyLU9ibGlxdWUiO3RbIkNvdXJpZXJOZXdQUy1Cb2xkSXRhbGljTVQiXT0iQ291cmllci1Cb2xkT2JsaXF1ZSI7dFsiQ291cmllck5ld1BTLUJvbGRNVCJdPSJDb3VyaWVyLUJvbGQiO3RbIkNvdXJpZXJOZXdQUy1JdGFsaWNNVCJdPSJDb3VyaWVyLU9ibGlxdWUiO3QuQ291cmllck5ld1BTTVQ9IkNvdXJpZXIiO3QuSGVsdmV0aWNhPSJIZWx2ZXRpY2EiO3RbIkhlbHZldGljYS1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjt0WyJIZWx2ZXRpY2EtQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO3RbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO3RbIkhlbHZldGljYS1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO3RbIkhlbHZldGljYS1PYmxpcXVlIl09IkhlbHZldGljYS1PYmxpcXVlIjt0WyJTeW1ib2wtQm9sZCJdPSJTeW1ib2wiO3RbIlN5bWJvbC1Cb2xkSXRhbGljIl09IlN5bWJvbCI7dFsiU3ltYm9sLUl0YWxpYyJdPSJTeW1ib2wiO3QuVGltZXNOZXdSb21hbj0iVGltZXMtUm9tYW4iO3RbIlRpbWVzTmV3Um9tYW4tQm9sZCJdPSJUaW1lcy1Cb2xkIjt0WyJUaW1lc05ld1JvbWFuLUJvbGRJdGFsaWMiXT0iVGltZXMtQm9sZEl0YWxpYyI7dFsiVGltZXNOZXdSb21hbi1JdGFsaWMiXT0iVGltZXMtSXRhbGljIjt0LlRpbWVzTmV3Um9tYW5QUz0iVGltZXMtUm9tYW4iO3RbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkIl09IlRpbWVzLUJvbGQiO3RbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljIl09IlRpbWVzLUJvbGRJdGFsaWMiO3RbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQiXT0iVGltZXMtQm9sZEl0YWxpYyI7dFsiVGltZXNOZXdSb21hblBTLUJvbGRNVCJdPSJUaW1lcy1Cb2xkIjt0WyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIl09IlRpbWVzLUl0YWxpYyI7dFsiVGltZXNOZXdSb21hblBTLUl0YWxpY01UIl09IlRpbWVzLUl0YWxpYyI7dC5UaW1lc05ld1JvbWFuUFNNVD0iVGltZXMtUm9tYW4iO3RbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGQiXT0iVGltZXMtQm9sZCI7dFsiVGltZXNOZXdSb21hblBTTVQtQm9sZEl0YWxpYyJdPSJUaW1lcy1Cb2xkSXRhbGljIjt0WyJUaW1lc05ld1JvbWFuUFNNVC1JdGFsaWMiXT0iVGltZXMtSXRhbGljIn0pKTtyLmdldFN0ZEZvbnRNYXA9bzt2YXIgYz0oMCxpLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKHQpe3QuQ2FsaWJyaT0iSGVsdmV0aWNhIjt0WyJDYWxpYnJpLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiO3RbIkNhbGlicmktQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO3RbIkNhbGlicmktSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIjt0LkNlbnR1cnlHb3RoaWM9IkhlbHZldGljYSI7dFsiQ2VudHVyeUdvdGhpYy1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjt0WyJDZW50dXJ5R290aGljLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjt0WyJDZW50dXJ5R290aGljLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7dC5Db21pY1NhbnNNUz0iQ29taWMgU2FucyBNUyI7dFsiQ29taWNTYW5zTVMtQm9sZCJdPSJDb21pYyBTYW5zIE1TLUJvbGQiO3RbIkNvbWljU2Fuc01TLUJvbGRJdGFsaWMiXT0iQ29taWMgU2FucyBNUy1Cb2xkSXRhbGljIjt0WyJDb21pY1NhbnNNUy1JdGFsaWMiXT0iQ29taWMgU2FucyBNUy1JdGFsaWMiO3QuTHVjaWRhQ29uc29sZT0iQ291cmllciI7dFsiTHVjaWRhQ29uc29sZS1Cb2xkIl09IkNvdXJpZXItQm9sZCI7dFsiTHVjaWRhQ29uc29sZS1Cb2xkSXRhbGljIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiO3RbIkx1Y2lkYUNvbnNvbGUtSXRhbGljIl09IkNvdXJpZXItT2JsaXF1ZSI7dFsiTHVjaWRhU2Fucy1EZW1pIl09IkhlbHZldGljYS1Cb2xkIjt0WyJNUy1Hb3RoaWMiXT0iTVMgR290aGljIjt0WyJNUy1Hb3RoaWMtQm9sZCJdPSJNUyBHb3RoaWMtQm9sZCI7dFsiTVMtR290aGljLUJvbGRJdGFsaWMiXT0iTVMgR290aGljLUJvbGRJdGFsaWMiO3RbIk1TLUdvdGhpYy1JdGFsaWMiXT0iTVMgR290aGljLUl0YWxpYyI7dFsiTVMtTWluY2hvIl09Ik1TIE1pbmNobyI7dFsiTVMtTWluY2hvLUJvbGQiXT0iTVMgTWluY2hvLUJvbGQiO3RbIk1TLU1pbmNoby1Cb2xkSXRhbGljIl09Ik1TIE1pbmNoby1Cb2xkSXRhbGljIjt0WyJNUy1NaW5jaG8tSXRhbGljIl09Ik1TIE1pbmNoby1JdGFsaWMiO3RbIk1TLVBHb3RoaWMiXT0iTVMgUEdvdGhpYyI7dFsiTVMtUEdvdGhpYy1Cb2xkIl09Ik1TIFBHb3RoaWMtQm9sZCI7dFsiTVMtUEdvdGhpYy1Cb2xkSXRhbGljIl09Ik1TIFBHb3RoaWMtQm9sZEl0YWxpYyI7dFsiTVMtUEdvdGhpYy1JdGFsaWMiXT0iTVMgUEdvdGhpYy1JdGFsaWMiO3RbIk1TLVBNaW5jaG8iXT0iTVMgUE1pbmNobyI7dFsiTVMtUE1pbmNoby1Cb2xkIl09Ik1TIFBNaW5jaG8tQm9sZCI7dFsiTVMtUE1pbmNoby1Cb2xkSXRhbGljIl09Ik1TIFBNaW5jaG8tQm9sZEl0YWxpYyI7dFsiTVMtUE1pbmNoby1JdGFsaWMiXT0iTVMgUE1pbmNoby1JdGFsaWMiO3QuTnVwdGlhbFNjcmlwdD0iVGltZXMtSXRhbGljIjt0LlNlZ29lVUlTeW1ib2w9IkhlbHZldGljYSI7dC5XaW5nZGluZ3M9IlphcGZEaW5nYmF0cyI7dFsiV2luZ2RpbmdzLVJlZ3VsYXIiXT0iWmFwZkRpbmdiYXRzIn0pKTtyLmdldE5vblN0ZEZvbnRNYXA9Yzt2YXIgbD0oMCxpLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKHQpe3RbIkFkb2JlIEplbnNvbiJdPSEwO3RbIkFkb2JlIFRleHQiXT0hMDt0LkFsYmVydHVzPSEwO3QuQWxkdXM9ITA7dC5BbGV4YW5kcmlhPSEwO3QuQWxnZXJpYW49ITA7dFsiQW1lcmljYW4gVHlwZXdyaXRlciJdPSEwO3QuQW50aXF1YT0hMDt0LkFwZXg9ITA7dC5Bcm5vPSEwO3QuQXN0ZXI9ITA7dC5BdXJvcmE9ITA7dC5CYXNrZXJ2aWxsZT0hMDt0LkJlbGw9ITA7dC5CZW1ibz0hMDt0WyJCZW1ibyBTY2hvb2xib29rIl09ITA7dC5CZW5ndWlhdD0hMDt0WyJCZXJrZWxleSBPbGQgU3R5bGUiXT0hMDt0WyJCZXJuaGFyZCBNb2Rlcm4iXT0hMDt0WyJCZXJ0aG9sZCBDaXR5Il09ITA7dC5Cb2Rvbmk9ITA7dFsiQmF1ZXIgQm9kb25pIl09ITA7dFsiQm9vayBBbnRpcXVhIl09ITA7dC5Cb29rbWFuPSEwO3RbIkJvcmRlYXV4IFJvbWFuIl09ITA7dFsiQ2FsaWZvcm5pYW4gRkIiXT0hMDt0LkNhbGlzdG89ITA7dC5DYWx2ZXJ0PSEwO3QuQ2FwaXRhbHM9ITA7dC5DYW1icmlhPSEwO3QuQ2FydGllcj0hMDt0LkNhc2xvbj0hMDt0LkNhdHVsbD0hMDt0LkNlbnRhdXI9ITA7dFsiQ2VudHVyeSBPbGQgU3R5bGUiXT0hMDt0WyJDZW50dXJ5IFNjaG9vbGJvb2siXT0hMDt0LkNoYXBhcnJhbD0hMDt0WyJDaGFyaXMgU0lMIl09ITA7dC5DaGVsdGVuaGFtPSEwO3RbIkNob2xsYSBTbGFiIl09ITA7dC5DbGFyZW5kb249ITA7dC5DbGVhcmZhY2U9ITA7dC5Db2NoaW49ITA7dC5Db2xvbm5hPSEwO3RbIkNvbXB1dGVyIE1vZGVybiJdPSEwO3RbIkNvbmNyZXRlIFJvbWFuIl09ITA7dC5Db25zdGFudGlhPSEwO3RbIkNvb3BlciBCbGFjayJdPSEwO3QuQ29yb25hPSEwO3QuRWNvdHlwZT0hMDt0LkVneXB0aWVubmU9ITA7dC5FbGVwaGFudD0hMDt0LkV4Y2Vsc2lvcj0hMDt0LkZhaXJmaWVsZD0hMDt0WyJGRiBTY2FsYSJdPSEwO3QuRm9sa2FyZD0hMDt0LkZvb3RsaWdodD0hMDt0LkZyZWVTZXJpZj0hMDt0WyJGcml6IFF1YWRyYXRhIl09ITA7dC5HYXJhbW9uZD0hMDt0LkdlbnRpdW09ITA7dC5HZW9yZ2lhPSEwO3QuR2xvdWNlc3Rlcj0hMDt0WyJHb3VkeSBPbGQgU3R5bGUiXT0hMDt0WyJHb3VkeSBTY2hvb2xib29rIl09ITA7dFsiR291ZHkgUHJvIEZvbnQiXT0hMDt0LkdyYW5qb249ITA7dFsiR3VhcmRpYW4gRWd5cHRpYW4iXT0hMDt0LkhlYXRoZXI9ITA7dC5IZXJjdWxlcz0hMDt0WyJIaWdoIFRvd2VyIFRleHQiXT0hMDt0Lkhpcm9zaGlnZT0hMDt0WyJIb2VmbGVyIFRleHQiXT0hMDt0WyJIdW1hbmEgU2VyaWYiXT0hMDt0LkltcHJpbnQ9ITA7dFsiSW9uaWMgTm8uIDUiXT0hMDt0LkphbnNvbj0hMDt0LkpvYW5uYT0hMDt0LktvcmlubmE9ITA7dC5MZXhpY29uPSEwO3RbIkxpYmVyYXRpb24gU2VyaWYiXT0hMDt0WyJMaW51eCBMaWJlcnRpbmUiXT0hMDt0LkxpdGVyYXR1cm5heWE9ITA7dC5MdWNpZGE9ITA7dFsiTHVjaWRhIEJyaWdodCJdPSEwO3QuTWVsaW9yPSEwO3QuTWVtcGhpcz0hMDt0Lk1pbGxlcj0hMDt0Lk1pbmlvbj0hMDt0Lk1vZGVybj0hMDt0WyJNb25hIExpc2EiXT0hMDt0WyJNcnMgRWF2ZXMiXT0hMDt0WyJNUyBTZXJpZiJdPSEwO3RbIk11c2VvIFNsYWIiXT0hMDt0WyJOZXcgWW9yayJdPSEwO3RbIk5pbWJ1cyBSb21hbiJdPSEwO3RbIk5QUyBSYXdsaW5zb24gUm9hZHdheSJdPSEwO3QuTnVwdGlhbFNjcmlwdD0hMDt0LlBhbGF0aW5vPSEwO3QuUGVycGV0dWE9ITA7dC5QbGFudGluPSEwO3RbIlBsYW50aW4gU2Nob29sYm9vayJdPSEwO3QuUGxheWJpbGw9ITA7dFsiUG9vciBSaWNoYXJkIl09ITA7dFsiUmF3bGluc29uIFJvYWR3YXkiXT0hMDt0LlJlbmF1bHQ9ITA7dC5SZXF1aWVtPSEwO3QuUm9ja3dlbGw9ITA7dC5Sb21hbj0hMDt0WyJSb3RpcyBTZXJpZiJdPSEwO3QuU2Fib249ITA7dC5TY2FsYT0hMDt0LlNlYWd1bGw9ITA7dC5TaXN0aW5hPSEwO3QuU291dmVuaXI9ITA7dC5TVElYPSEwO3RbIlN0b25lIEluZm9ybWFsIl09ITA7dFsiU3RvbmUgU2VyaWYiXT0hMDt0LlN5bGZhZW49ITA7dC5UaW1lcz0hMDt0LlRyYWphbj0hMDt0WyJUcmluaXTDqSJdPSEwO3RbIlRydW1wIE1lZGlhZXZhbCJdPSEwO3QuVXRvcGlhPSEwO3RbIlZhbGUgVHlwZSJdPSEwO3RbIkJpdHN0cmVhbSBWZXJhIl09ITA7dFsiVmVyYSBTZXJpZiJdPSEwO3QuVmVyc2FpbGxlcz0hMDt0LldhbnRlZD0hMDt0LldlaXNzPSEwO3RbIldpZGUgTGF0aW4iXT0hMDt0LldpbmRzb3I9ITA7dC5YSVRTPSEwfSkpO3IuZ2V0U2VyaWZGb250cz1sO3ZhciB1PSgwLGkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24odCl7dC5EaW5nYmF0cz0hMDt0LlN5bWJvbD0hMDt0LlphcGZEaW5nYmF0cz0hMH0pKTtyLmdldFN5bWJvbHNGb250cz11O3ZhciBoPSgwLGkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24odCl7dFsyXT0xMDt0WzNdPTMyO3RbNF09MzM7dFs1XT0zNDt0WzZdPTM1O3RbN109MzY7dFs4XT0zNzt0WzldPTM4O3RbMTBdPTM5O3RbMTFdPTQwO3RbMTJdPTQxO3RbMTNdPTQyO3RbMTRdPTQzO3RbMTVdPTQ0O3RbMTZdPTQ1O3RbMTddPTQ2O3RbMThdPTQ3O3RbMTldPTQ4O3RbMjBdPTQ5O3RbMjFdPTUwO3RbMjJdPTUxO3RbMjNdPTUyO3RbMjRdPTUzO3RbMjVdPTU0O3RbMjZdPTU1O3RbMjddPTU2O3RbMjhdPTU3O3RbMjldPTU4O3RbMzBdPTg5NDt0WzMxXT02MDt0WzMyXT02MTt0WzMzXT02Mjt0WzM0XT02Mzt0WzM1XT02NDt0WzM2XT02NTt0WzM3XT02Njt0WzM4XT02Nzt0WzM5XT02ODt0WzQwXT02OTt0WzQxXT03MDt0WzQyXT03MTt0WzQzXT03Mjt0WzQ0XT03Mzt0WzQ1XT03NDt0WzQ2XT03NTt0WzQ3XT03Njt0WzQ4XT03Nzt0WzQ5XT03ODt0WzUwXT03OTt0WzUxXT04MDt0WzUyXT04MTt0WzUzXT04Mjt0WzU0XT04Mzt0WzU1XT04NDt0WzU2XT04NTt0WzU3XT04Njt0WzU4XT04Nzt0WzU5XT04ODt0WzYwXT04OTt0WzYxXT05MDt0WzYyXT05MTt0WzYzXT05Mjt0WzY0XT05Mzt0WzY1XT05NDt0WzY2XT05NTt0WzY3XT05Njt0WzY4XT05Nzt0WzY5XT05ODt0WzcwXT05OTt0WzcxXT0xMDA7dFs3Ml09MTAxO3RbNzNdPTEwMjt0Wzc0XT0xMDM7dFs3NV09MTA0O3RbNzZdPTEwNTt0Wzc3XT0xMDY7dFs3OF09MTA3O3RbNzldPTEwODt0WzgwXT0xMDk7dFs4MV09MTEwO3RbODJdPTExMTt0WzgzXT0xMTI7dFs4NF09MTEzO3RbODVdPTExNDt0Wzg2XT0xMTU7dFs4N109MTE2O3RbODhdPTExNzt0Wzg5XT0xMTg7dFs5MF09MTE5O3RbOTFdPTEyMDt0WzkyXT0xMjE7dFs5M109MTIyO3RbOTRdPTEyMzt0Wzk1XT0xMjQ7dFs5Nl09MTI1O3RbOTddPTEyNjt0Wzk4XT0xOTY7dFs5OV09MTk3O3RbMTAwXT0xOTk7dFsxMDFdPTIwMTt0WzEwMl09MjA5O3RbMTAzXT0yMTQ7dFsxMDRdPTIyMDt0WzEwNV09MjI1O3RbMTA2XT0yMjQ7dFsxMDddPTIyNjt0WzEwOF09MjI4O3RbMTA5XT0yMjc7dFsxMTBdPTIyOTt0WzExMV09MjMxO3RbMTEyXT0yMzM7dFsxMTNdPTIzMjt0WzExNF09MjM0O3RbMTE1XT0yMzU7dFsxMTZdPTIzNzt0WzExN109MjM2O3RbMTE4XT0yMzg7dFsxMTldPTIzOTt0WzEyMF09MjQxO3RbMTIxXT0yNDM7dFsxMjJdPTI0Mjt0WzEyM109MjQ0O3RbMTI0XT0yNDY7dFsxMjVdPTI0NTt0WzEyNl09MjUwO3RbMTI3XT0yNDk7dFsxMjhdPTI1MTt0WzEyOV09MjUyO3RbMTMwXT04MjI0O3RbMTMxXT0xNzY7dFsxMzJdPTE2Mjt0WzEzM109MTYzO3RbMTM0XT0xNjc7dFsxMzVdPTgyMjY7dFsxMzZdPTE4Mjt0WzEzN109MjIzO3RbMTM4XT0xNzQ7dFsxMzldPTE2OTt0WzE0MF09ODQ4Mjt0WzE0MV09MTgwO3RbMTQyXT0xNjg7dFsxNDNdPTg4MDA7dFsxNDRdPTE5ODt0WzE0NV09MjE2O3RbMTQ2XT04NzM0O3RbMTQ3XT0xNzc7dFsxNDhdPTg4MDQ7dFsxNDldPTg4MDU7dFsxNTBdPTE2NTt0WzE1MV09MTgxO3RbMTUyXT04NzA2O3RbMTUzXT04NzIxO3RbMTU0XT04NzE5O3RbMTU2XT04NzQ3O3RbMTU3XT0xNzA7dFsxNThdPTE4Njt0WzE1OV09ODQ4Njt0WzE2MF09MjMwO3RbMTYxXT0yNDg7dFsxNjJdPTE5MTt0WzE2M109MTYxO3RbMTY0XT0xNzI7dFsxNjVdPTg3MzA7dFsxNjZdPTQwMjt0WzE2N109ODc3Njt0WzE2OF09ODcxMDt0WzE2OV09MTcxO3RbMTcwXT0xODc7dFsxNzFdPTgyMzA7dFsyMTBdPTIxODt0WzIyM109NzExO3RbMjI0XT0zMjE7dFsyMjVdPTMyMjt0WzIyN109MzUzO3RbMjI5XT0zODI7dFsyMzRdPTI1Mzt0WzI1Ml09MjYzO3RbMjUzXT0yNjg7dFsyNTRdPTI2OTt0WzI1OF09MjU4O3RbMjYwXT0yNjA7dFsyNjFdPTI2MTt0WzI2NV09MjgwO3RbMjY2XT0yODE7dFsyNjhdPTI4Mzt0WzI2OV09MzEzO3RbMjc1XT0zMjM7dFsyNzZdPTMyNDt0WzI3OF09MzI4O3RbMjg0XT0zNDU7dFsyODVdPTM0Njt0WzI4Nl09MzQ3O3RbMjkyXT0zNjc7dFsyOTVdPTM3Nzt0WzI5Nl09Mzc4O3RbMjk4XT0zODA7dFszMDVdPTk2Mzt0WzMwNl09OTY0O3RbMzA3XT05NjY7dFszMDhdPTgyMTU7dFszMDldPTgyNTI7dFszMTBdPTgzMTk7dFszMTFdPTgzNTk7dFszMTJdPTg1OTI7dFszMTNdPTg1OTM7dFszMzddPTk1NTI7dFs0OTNdPTEwMzk7dFs0OTRdPTEwNDA7dFs3MDVdPTE1MjQ7dFs3MDZdPTgzNjI7dFs3MTBdPTY0Mjg4O3RbNzExXT02NDI5ODt0Wzc1OV09MTYxNzt0Wzc2MV09MTc3Njt0Wzc2M109MTc3ODt0Wzc3NV09MTY1Mjt0Wzc3N109MTc2NDt0Wzc3OF09MTc4MDt0Wzc3OV09MTc4MTt0Wzc4MF09MTc4Mjt0Wzc4Ml09NzcxO3RbNzgzXT02NDcyNjt0Wzc4Nl09ODM2Mzt0Wzc4OF09ODUzMjt0Wzc5MF09NzY4O3RbNzkxXT03Njk7dFs3OTJdPTc2ODt0Wzc5NV09ODAzO3RbNzk3XT02NDMzNjt0Wzc5OF09NjQzMzc7dFs3OTldPTY0MzQyO3RbODAwXT02NDM0Mzt0WzgwMV09NjQzNDQ7dFs4MDJdPTY0MzQ1O3RbODAzXT02NDM2Mjt0WzgwNF09NjQzNjM7dFs4MDVdPTY0MzY0O3RbMjQyNF09NzgyMTt0WzI0MjVdPTc4MjI7dFsyNDI2XT03ODIzO3RbMjQyN109NzgyNDt0WzI0MjhdPTc4MjU7dFsyNDI5XT03ODI2O3RbMjQzMF09NzgyNzt0WzI0MzNdPTc2ODI7dFsyNjc4XT04MDQ1O3RbMjY3OV09ODA0Njt0WzI4MzBdPTE1NTI7dFsyODM4XT02ODY7dFsyODQwXT03NTE7dFsyODQyXT03NTM7dFsyODQzXT03NTQ7dFsyODQ0XT03NTU7dFsyODQ2XT03NTc7dFsyODU2XT03Njc7dFsyODU3XT04NDg7dFsyODU4XT04NDk7dFsyODYyXT04NTM7dFsyODYzXT04NTQ7dFsyODY0XT04NTU7dFsyODY1XT04NjE7dFsyODY2XT04NjI7dFsyOTA2XT03NDYwO3RbMjkwOF09NzQ2Mjt0WzI5MDldPTc0NjM7dFsyOTEwXT03NDY0O3RbMjkxMl09NzQ2Njt0WzI5MTNdPTc0Njc7dFsyOTE0XT03NDY4O3RbMjkxNl09NzQ3MDt0WzI5MTddPTc0NzE7dFsyOTE4XT03NDcyO3RbMjkyMF09NzQ3NDt0WzI5MjFdPTc0NzU7dFsyOTIyXT03NDc2O3RbMjkyNF09NzQ3ODt0WzI5MjVdPTc0Nzk7dFsyOTI2XT03NDgwO3RbMjkyOF09NzQ4Mjt0WzI5MjldPTc0ODM7dFsyOTMwXT03NDg0O3RbMjkzMl09NzQ4Njt0WzI5MzNdPTc0ODc7dFsyOTM0XT03NDg4O3RbMjkzNl09NzQ5MDt0WzI5MzddPTc0OTE7dFsyOTM4XT03NDkyO3RbMjk0MF09NzQ5NDt0WzI5NDFdPTc0OTU7dFsyOTQyXT03NDk2O3RbMjk0NF09NzQ5ODt0WzI5NDZdPTc1MDA7dFsyOTQ4XT03NTAyO3RbMjk1MF09NzUwNDt0WzI5NTFdPTc1MDU7dFsyOTUyXT03NTA2O3RbMjk1NF09NzUwODt0WzI5NTVdPTc1MDk7dFsyOTU2XT03NTEwO3RbMjk1OF09NzUxMjt0WzI5NTldPTc1MTM7dFsyOTYwXT03NTE0O3RbMjk2Ml09NzUxNjt0WzI5NjNdPTc1MTc7dFsyOTY0XT03NTE4O3RbMjk2Nl09NzUyMDt0WzI5NjddPTc1MjE7dFsyOTY4XT03NTIyO3RbMjk3MF09NzUyNDt0WzI5NzFdPTc1MjU7dFsyOTcyXT03NTI2O3RbMjk3NF09NzUyODt0WzI5NzVdPTc1Mjk7dFsyOTc2XT03NTMwO3RbMjk3OF09MTUzNzt0WzI5NzldPTE1Mzg7dFsyOTgwXT0xNTM5O3RbMjk4Ml09MTU0OTt0WzI5ODNdPTE1NTE7dFsyOTg0XT0xNTUyO3RbMjk4Nl09MTU1NDt0WzI5ODddPTE1NTU7dFsyOTg4XT0xNTU2O3RbMjk5MF09MTYyMzt0WzI5OTFdPTE2MjQ7dFsyOTk1XT0xNzc1O3RbMjk5OV09MTc5MTt0WzMwMDJdPTY0MjkwO3RbMzAwM109NjQyOTE7dFszMDA0XT02NDI5Mjt0WzMwMDZdPTY0Mjk0O3RbMzAwN109NjQyOTU7dFszMDA4XT02NDI5Njt0WzMwMTFdPTE5MDA7dFszMDE0XT04MjIzO3RbMzAxNV09ODI0NDt0WzMwMTddPTc1MzI7dFszMDE4XT03NTMzO3RbMzAxOV09NzUzNDt0WzMwNzVdPTc1OTA7dFszMDc2XT03NTkxO3RbMzA3OV09NzU5NDt0WzMwODBdPTc1OTU7dFszMDgzXT03NTk4O3RbMzA4NF09NzU5OTt0WzMwODddPTc2MDI7dFszMDg4XT03NjAzO3RbMzA5MV09NzYwNjt0WzMwOTJdPTc2MDc7dFszMDk1XT03NjEwO3RbMzA5Nl09NzYxMTt0WzMwOTldPTc2MTQ7dFszMTAwXT03NjE1O3RbMzEwM109NzYxODt0WzMxMDRdPTc2MTk7dFszMTA3XT04MzM3O3RbMzEwOF09ODMzODt0WzMxMTZdPTE4ODQ7dFszMTE5XT0xODg1O3RbMzEyMF09MTg4NTt0WzMxMjNdPTE4ODY7dFszMTI0XT0xODg2O3RbMzEyN109MTg4Nzt0WzMxMjhdPTE4ODc7dFszMTMxXT0xODg4O3RbMzEzMl09MTg4ODt0WzMxMzVdPTE4ODk7dFszMTM2XT0xODg5O3RbMzEzOV09MTg5MDt0WzMxNDBdPTE4OTA7dFszMTQzXT0xODkxO3RbMzE0NF09MTg5MTt0WzMxNDddPTE4OTI7dFszMTQ4XT0xODkyO3RbMzE1M109NTgwO3RbMzE1NF09NTgxO3RbMzE1N109NTg0O3RbMzE1OF09NTg1O3RbMzE2MV09NTg4O3RbMzE2Ml09NTg5O3RbMzE2NV09ODkxO3RbMzE2Nl09ODkyO3RbMzE2OV09MTI3NDt0WzMxNzBdPTEyNzU7dFszMTczXT0xMjc4O3RbMzE3NF09MTI3OTt0WzMxODFdPTc2MjI7dFszMTgyXT03NjIzO3RbMzI4Ml09MTE3OTk7dFszMzE2XT01Nzg7dFszMzc5XT00Mjc4NTt0WzMzOTNdPTExNTk7dFszNDE2XT04Mzc3fSkpO3IuZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzPWg7dmFyIGQ9KDAsaS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbih0KXt0WzIyN109MzIyO3RbMjY0XT0yNjE7dFsyOTFdPTM0Nn0pKTtyLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaz1kO3ZhciBwPSgwLGkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24odCl7dFsxXT0zMjt0WzRdPTY1O3RbMTddPTY2O3RbMThdPTY3O3RbMjRdPTY4O3RbMjhdPTY5O3RbMzhdPTcwO3RbMzldPTcxO3RbNDRdPTcyO3RbNDddPTczO3RbNThdPTc0O3RbNjBdPTc1O3RbNjJdPTc2O3RbNjhdPTc3O3RbNjldPTc4O3RbNzVdPTc5O3RbODddPTgwO3RbODldPTgxO3RbOTBdPTgyO3RbOTRdPTgzO3RbMTAwXT04NDt0WzEwNF09ODU7dFsxMTVdPTg2O3RbMTE2XT04Nzt0WzEyMV09ODg7dFsxMjJdPTg5O3RbMTI3XT05MDt0WzI1OF09OTc7dFsyNjhdPTI2MTt0WzI3MV09OTg7dFsyNzJdPTk5O3RbMjczXT0yNjM7dFsyODJdPTEwMDt0WzI4Nl09MTAxO3RbMjk1XT0yODE7dFsyOTZdPTEwMjt0WzMzNl09MTAzO3RbMzQ2XT0xMDQ7dFszNDldPTEwNTt0WzM2MV09MTA2O3RbMzY0XT0xMDc7dFszNjddPTEwODt0WzM3MV09MzIyO3RbMzczXT0xMDk7dFszNzRdPTExMDt0WzM4MV09MTExO3RbMzgzXT0yNDM7dFszOTNdPTExMjt0WzM5NV09MTEzO3RbMzk2XT0xMTQ7dFs0MDBdPTExNTt0WzQwMV09MzQ3O3RbNDEwXT0xMTY7dFs0MzddPTExNzt0WzQ0OF09MTE4O3RbNDQ5XT0xMTk7dFs0NTRdPTEyMDt0WzQ1NV09MTIxO3RbNDYwXT0xMjI7dFs0NjNdPTM4MDt0Wzg1M109NDQ7dFs4NTVdPTU4O3RbODU2XT00Njt0Wzg3Nl09NDc7dFs4NzhdPTQ1O3RbODgyXT00NTt0Wzg5NF09NDA7dFs4OTVdPTQxO3RbODk2XT05MTt0Wzg5N109OTM7dFs5MjNdPTY0O3RbMTAwNF09NDg7dFsxMDA1XT00OTt0WzEwMDZdPTUwO3RbMTAwN109NTE7dFsxMDA4XT01Mjt0WzEwMDldPTUzO3RbMTAxMF09NTQ7dFsxMDExXT01NTt0WzEwMTJdPTU2O3RbMTAxM109NTc7dFsxMDgxXT0zNzt0WzEwODVdPTQzO3RbMTA4Nl09NDV9KSk7ci5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmk9cH0sZnVuY3Rpb24odCxyLGEpe3ZhciBpPWEoMjA1KS5nZXRMb29rdXBUYWJsZUZhY3Rvcnksbz1pKChmdW5jdGlvbih0KXt0WzYzNzIxXT0xNjk7dFs2MzE5M109MTY5O3RbNjM3MjBdPTE3NDt0WzYzMTk0XT0xNzQ7dFs2MzcyMl09ODQ4Mjt0WzYzMTk1XT04NDgyO3RbNjM3MjldPTkxMjc7dFs2MzczMF09OTEyODt0WzYzNzMxXT05MTI5O3RbNjM3NDBdPTkxMzE7dFs2Mzc0MV09OTEzMjt0WzYzNzQyXT05MTMzO3RbNjM3MjZdPTkxMjE7dFs2MzcyN109OTEyMjt0WzYzNzI4XT05MTIzO3RbNjM3MzddPTkxMjQ7dFs2MzczOF09OTEyNTt0WzYzNzM5XT05MTI2O3RbNjM3MjNdPTkxMTU7dFs2MzcyNF09OTExNjt0WzYzNzI1XT05MTE3O3RbNjM3MzRdPTkxMTg7dFs2MzczNV09OTExOTt0WzYzNzM2XT05MTIwfSkpO3ZhciBjPVt7YmVnaW46MCxlbmQ6MTI3fSx7YmVnaW46MTI4LGVuZDoyNTV9LHtiZWdpbjoyNTYsZW5kOjM4M30se2JlZ2luOjM4NCxlbmQ6NTkxfSx7YmVnaW46NTkyLGVuZDo2ODd9LHtiZWdpbjo2ODgsZW5kOjc2N30se2JlZ2luOjc2OCxlbmQ6ODc5fSx7YmVnaW46ODgwLGVuZDoxMDIzfSx7YmVnaW46MTEzOTIsZW5kOjExNTE5fSx7YmVnaW46MTAyNCxlbmQ6MTI3OX0se2JlZ2luOjEzMjgsZW5kOjE0MjN9LHtiZWdpbjoxNDI0LGVuZDoxNTM1fSx7YmVnaW46NDIyNDAsZW5kOjQyNTU5fSx7YmVnaW46MTUzNixlbmQ6MTc5MX0se2JlZ2luOjE5ODQsZW5kOjIwNDd9LHtiZWdpbjoyMzA0LGVuZDoyNDMxfSx7YmVnaW46MjQzMixlbmQ6MjU1OX0se2JlZ2luOjI1NjAsZW5kOjI2ODd9LHtiZWdpbjoyNjg4LGVuZDoyODE1fSx7YmVnaW46MjgxNixlbmQ6Mjk0M30se2JlZ2luOjI5NDQsZW5kOjMwNzF9LHtiZWdpbjozMDcyLGVuZDozMTk5fSx7YmVnaW46MzIwMCxlbmQ6MzMyN30se2JlZ2luOjMzMjgsZW5kOjM0NTV9LHtiZWdpbjozNTg0LGVuZDozNzExfSx7YmVnaW46MzcxMixlbmQ6MzgzOX0se2JlZ2luOjQyNTYsZW5kOjQzNTF9LHtiZWdpbjo2OTEyLGVuZDo3MDM5fSx7YmVnaW46NDM1MixlbmQ6NDYwN30se2JlZ2luOjc2ODAsZW5kOjc5MzV9LHtiZWdpbjo3OTM2LGVuZDo4MTkxfSx7YmVnaW46ODE5MixlbmQ6ODMwM30se2JlZ2luOjgzMDQsZW5kOjgzNTF9LHtiZWdpbjo4MzUyLGVuZDo4Mzk5fSx7YmVnaW46ODQwMCxlbmQ6ODQ0N30se2JlZ2luOjg0NDgsZW5kOjg1Mjd9LHtiZWdpbjo4NTI4LGVuZDo4NTkxfSx7YmVnaW46ODU5MixlbmQ6ODcwM30se2JlZ2luOjg3MDQsZW5kOjg5NTl9LHtiZWdpbjo4OTYwLGVuZDo5MjE1fSx7YmVnaW46OTIxNixlbmQ6OTI3OX0se2JlZ2luOjkyODAsZW5kOjkzMTF9LHtiZWdpbjo5MzEyLGVuZDo5NDcxfSx7YmVnaW46OTQ3MixlbmQ6OTU5OX0se2JlZ2luOjk2MDAsZW5kOjk2MzF9LHtiZWdpbjo5NjMyLGVuZDo5NzI3fSx7YmVnaW46OTcyOCxlbmQ6OTk4M30se2JlZ2luOjk5ODQsZW5kOjEwMTc1fSx7YmVnaW46MTIyODgsZW5kOjEyMzUxfSx7YmVnaW46MTIzNTIsZW5kOjEyNDQ3fSx7YmVnaW46MTI0NDgsZW5kOjEyNTQzfSx7YmVnaW46MTI1NDQsZW5kOjEyNTkxfSx7YmVnaW46MTI1OTIsZW5kOjEyNjg3fSx7YmVnaW46NDMwNzIsZW5kOjQzMTM1fSx7YmVnaW46MTI4MDAsZW5kOjEzMDU1fSx7YmVnaW46MTMwNTYsZW5kOjEzMzExfSx7YmVnaW46NDQwMzIsZW5kOjU1MjE1fSx7YmVnaW46NTUyOTYsZW5kOjU3MzQzfSx7YmVnaW46Njc4NDAsZW5kOjY3ODcxfSx7YmVnaW46MTk5NjgsZW5kOjQwOTU5fSx7YmVnaW46NTczNDQsZW5kOjYzNzQzfSx7YmVnaW46MTI3MzYsZW5kOjEyNzgzfSx7YmVnaW46NjQyNTYsZW5kOjY0MzM1fSx7YmVnaW46NjQzMzYsZW5kOjY1MDIzfSx7YmVnaW46NjUwNTYsZW5kOjY1MDcxfSx7YmVnaW46NjUwNDAsZW5kOjY1MDU1fSx7YmVnaW46NjUxMDQsZW5kOjY1MTM1fSx7YmVnaW46NjUxMzYsZW5kOjY1Mjc5fSx7YmVnaW46NjUyODAsZW5kOjY1NTE5fSx7YmVnaW46NjU1MjAsZW5kOjY1NTM1fSx7YmVnaW46Mzg0MCxlbmQ6NDA5NX0se2JlZ2luOjE3OTIsZW5kOjE4NzF9LHtiZWdpbjoxOTIwLGVuZDoxOTgzfSx7YmVnaW46MzQ1NixlbmQ6MzU4M30se2JlZ2luOjQwOTYsZW5kOjQyNTV9LHtiZWdpbjo0NjA4LGVuZDo0OTkxfSx7YmVnaW46NTAyNCxlbmQ6NTExOX0se2JlZ2luOjUxMjAsZW5kOjU3NTl9LHtiZWdpbjo1NzYwLGVuZDo1NzkxfSx7YmVnaW46NTc5MixlbmQ6NTg4N30se2JlZ2luOjYwMTYsZW5kOjYxNDN9LHtiZWdpbjo2MTQ0LGVuZDo2MzE5fSx7YmVnaW46MTAyNDAsZW5kOjEwNDk1fSx7YmVnaW46NDA5NjAsZW5kOjQyMTI3fSx7YmVnaW46NTg4OCxlbmQ6NTkxOX0se2JlZ2luOjY2MzA0LGVuZDo2NjM1MX0se2JlZ2luOjY2MzUyLGVuZDo2NjM4M30se2JlZ2luOjY2NTYwLGVuZDo2NjYzOX0se2JlZ2luOjExODc4NCxlbmQ6MTE5MDM5fSx7YmVnaW46MTE5ODA4LGVuZDoxMjA4MzF9LHtiZWdpbjoxMDQ0NDgwLGVuZDoxMDQ4NTczfSx7YmVnaW46NjUwMjQsZW5kOjY1MDM5fSx7YmVnaW46OTE3NTA0LGVuZDo5MTc2MzF9LHtiZWdpbjo2NDAwLGVuZDo2NDc5fSx7YmVnaW46NjQ4MCxlbmQ6NjUyN30se2JlZ2luOjY1MjgsZW5kOjY2MjN9LHtiZWdpbjo2NjU2LGVuZDo2Njg3fSx7YmVnaW46MTEyNjQsZW5kOjExMzU5fSx7YmVnaW46MTE1NjgsZW5kOjExNjQ3fSx7YmVnaW46MTk5MDQsZW5kOjE5OTY3fSx7YmVnaW46NDMwMDgsZW5kOjQzMDU1fSx7YmVnaW46NjU1MzYsZW5kOjY1NjYzfSx7YmVnaW46NjU4NTYsZW5kOjY1OTM1fSx7YmVnaW46NjY0MzIsZW5kOjY2NDYzfSx7YmVnaW46NjY0NjQsZW5kOjY2NTI3fSx7YmVnaW46NjY2NDAsZW5kOjY2Njg3fSx7YmVnaW46NjY2ODgsZW5kOjY2NzM1fSx7YmVnaW46Njc1ODQsZW5kOjY3NjQ3fSx7YmVnaW46NjgwOTYsZW5kOjY4MTkxfSx7YmVnaW46MTE5NTUyLGVuZDoxMTk2NDd9LHtiZWdpbjo3MzcyOCxlbmQ6NzQ3NTF9LHtiZWdpbjoxMTk2NDgsZW5kOjExOTY3OX0se2JlZ2luOjcwNDAsZW5kOjcxMDN9LHtiZWdpbjo3MTY4LGVuZDo3MjQ3fSx7YmVnaW46NzI0OCxlbmQ6NzI5NX0se2JlZ2luOjQzMTM2LGVuZDo0MzIzMX0se2JlZ2luOjQzMjY0LGVuZDo0MzMxMX0se2JlZ2luOjQzMzEyLGVuZDo0MzM1OX0se2JlZ2luOjQzNTIwLGVuZDo0MzYxNX0se2JlZ2luOjY1OTM2LGVuZDo2NTk5OX0se2JlZ2luOjY2ZTMsZW5kOjY2MDQ3fSx7YmVnaW46NjYyMDgsZW5kOjY2MjcxfSx7YmVnaW46MTI3MDI0LGVuZDoxMjcxMzV9XTt2YXIgbD1pKChmdW5jdGlvbih0KXt0WyLCqCJdPSIgzIgiO3RbIsKvIl09IiDMhCI7dFsiwrQiXT0iIMyBIjt0WyLCtSJdPSLOvCI7dFsiwrgiXT0iIMynIjt0WyLEsiJdPSJJSiI7dFsixLMiXT0iaWoiO3RbIsS/Il09IkzCtyI7dFsixYAiXT0ibMK3Ijt0WyLFiSJdPSLKvG4iO3RbIsW/Il09InMiO3RbIseEIl09IkTFvSI7dFsix4UiXT0iRMW+Ijt0WyLHhiJdPSJkxb4iO3RbIseHIl09IkxKIjt0WyLHiCJdPSJMaiI7dFsix4kiXT0ibGoiO3RbIseKIl09Ik5KIjt0WyLHiyJdPSJOaiI7dFsix4wiXT0ibmoiO3RbIsexIl09IkRaIjt0WyLHsiJdPSJEeiI7dFsix7MiXT0iZHoiO3RbIsuYIl09IiDMhiI7dFsiy5kiXT0iIMyHIjt0WyLLmiJdPSIgzIoiO3RbIsubIl09IiDMqCI7dFsiy5wiXT0iIMyDIjt0WyLLnSJdPSIgzIsiO3RbIs26Il09IiDNhSI7dFsizoQiXT0iIMyBIjt0WyLPkCJdPSLOsiI7dFsiz5EiXT0izrgiO3RbIs+SIl09Is6lIjt0WyLPlSJdPSLPhiI7dFsiz5YiXT0iz4AiO3RbIs+wIl09Is66Ijt0WyLPsSJdPSLPgSI7dFsiz7IiXT0iz4IiO3RbIs+0Il09Is6YIjt0WyLPtSJdPSLOtSI7dFsiz7kiXT0izqMiO3RbItaHIl09ItWl1oIiO3RbItm1Il09Itin2bQiO3RbItm2Il09ItmI2bQiO3RbItm3Il09ItuH2bQiO3RbItm4Il09ItmK2bQiO3RbIuC4syJdPSLguY3guLIiO3RbIuC6syJdPSLgu43gurIiO3RbIuC7nCJdPSLguqvgupkiO3RbIuC7nSJdPSLguqvguqEiO3RbIuC9tyJdPSLgvrLgvoEiO3RbIuC9uSJdPSLgvrPgvoEiO3RbIuG6miJdPSJhyr4iO3RbIuG+vSJdPSIgzJMiO3RbIuG+vyJdPSIgzJMiO3RbIuG/gCJdPSIgzYIiO3RbIuG/viJdPSIgzJQiO3RbIuKAgiJdPSIgIjt0WyLigIMiXT0iICI7dFsi4oCEIl09IiAiO3RbIuKAhSJdPSIgIjt0WyLigIYiXT0iICI7dFsi4oCIIl09IiAiO3RbIuKAiSJdPSIgIjt0WyLigIoiXT0iICI7dFsi4oCXIl09IiDMsyI7dFsi4oCkIl09Ii4iO3RbIuKApSJdPSIuLiI7dFsi4oCmIl09Ii4uLiI7dFsi4oCzIl09IuKAsuKAsiI7dFsi4oC0Il09IuKAsuKAsuKAsiI7dFsi4oC2Il09IuKAteKAtSI7dFsi4oC3Il09IuKAteKAteKAtSI7dFsi4oC8Il09IiEhIjt0WyLigL4iXT0iIMyFIjt0WyLigYciXT0iPz8iO3RbIuKBiCJdPSI/ISI7dFsi4oGJIl09IiE/Ijt0WyLigZciXT0i4oCy4oCy4oCy4oCyIjt0WyLigZ8iXT0iICI7dFsi4oKoIl09IlJzIjt0WyLihIAiXT0iYS9jIjt0WyLihIEiXT0iYS9zIjt0WyLihIMiXT0iwrBDIjt0WyLihIUiXT0iYy9vIjt0WyLihIYiXT0iYy91Ijt0WyLihIciXT0ixpAiO3RbIuKEiSJdPSLCsEYiO3RbIuKEliJdPSJObyI7dFsi4oShIl09IlRFTCI7dFsi4oS1Il09IteQIjt0WyLihLYiXT0i15EiO3RbIuKEtyJdPSLXkiI7dFsi4oS4Il09IteTIjt0WyLihLsiXT0iRkFYIjt0WyLihaAiXT0iSSI7dFsi4oWhIl09IklJIjt0WyLihaIiXT0iSUlJIjt0WyLihaMiXT0iSVYiO3RbIuKFpCJdPSJWIjt0WyLihaUiXT0iVkkiO3RbIuKFpiJdPSJWSUkiO3RbIuKFpyJdPSJWSUlJIjt0WyLihagiXT0iSVgiO3RbIuKFqSJdPSJYIjt0WyLihaoiXT0iWEkiO3RbIuKFqyJdPSJYSUkiO3RbIuKFrCJdPSJMIjt0WyLiha0iXT0iQyI7dFsi4oWuIl09IkQiO3RbIuKFryJdPSJNIjt0WyLihbAiXT0iaSI7dFsi4oWxIl09ImlpIjt0WyLihbIiXT0iaWlpIjt0WyLihbMiXT0iaXYiO3RbIuKFtCJdPSJ2Ijt0WyLihbUiXT0idmkiO3RbIuKFtiJdPSJ2aWkiO3RbIuKFtyJdPSJ2aWlpIjt0WyLihbgiXT0iaXgiO3RbIuKFuSJdPSJ4Ijt0WyLihboiXT0ieGkiO3RbIuKFuyJdPSJ4aWkiO3RbIuKFvCJdPSJsIjt0WyLihb0iXT0iYyI7dFsi4oW+Il09ImQiO3RbIuKFvyJdPSJtIjt0WyLiiKwiXT0i4oir4oirIjt0WyLiiK0iXT0i4oir4oir4oirIjt0WyLiiK8iXT0i4oiu4oiuIjt0WyLiiLAiXT0i4oiu4oiu4oiuIjt0WyLikbQiXT0iKDEpIjt0WyLikbUiXT0iKDIpIjt0WyLikbYiXT0iKDMpIjt0WyLikbciXT0iKDQpIjt0WyLikbgiXT0iKDUpIjt0WyLikbkiXT0iKDYpIjt0WyLikboiXT0iKDcpIjt0WyLikbsiXT0iKDgpIjt0WyLikbwiXT0iKDkpIjt0WyLikb0iXT0iKDEwKSI7dFsi4pG+Il09IigxMSkiO3RbIuKRvyJdPSIoMTIpIjt0WyLikoAiXT0iKDEzKSI7dFsi4pKBIl09IigxNCkiO3RbIuKSgiJdPSIoMTUpIjt0WyLikoMiXT0iKDE2KSI7dFsi4pKEIl09IigxNykiO3RbIuKShSJdPSIoMTgpIjt0WyLikoYiXT0iKDE5KSI7dFsi4pKHIl09IigyMCkiO3RbIuKSiCJdPSIxLiI7dFsi4pKJIl09IjIuIjt0WyLikooiXT0iMy4iO3RbIuKSiyJdPSI0LiI7dFsi4pKMIl09IjUuIjt0WyLiko0iXT0iNi4iO3RbIuKSjiJdPSI3LiI7dFsi4pKPIl09IjguIjt0WyLikpAiXT0iOS4iO3RbIuKSkSJdPSIxMC4iO3RbIuKSkiJdPSIxMS4iO3RbIuKSkyJdPSIxMi4iO3RbIuKSlCJdPSIxMy4iO3RbIuKSlSJdPSIxNC4iO3RbIuKSliJdPSIxNS4iO3RbIuKSlyJdPSIxNi4iO3RbIuKSmCJdPSIxNy4iO3RbIuKSmSJdPSIxOC4iO3RbIuKSmiJdPSIxOS4iO3RbIuKSmyJdPSIyMC4iO3RbIuKSnCJdPSIoYSkiO3RbIuKSnSJdPSIoYikiO3RbIuKSniJdPSIoYykiO3RbIuKSnyJdPSIoZCkiO3RbIuKSoCJdPSIoZSkiO3RbIuKSoSJdPSIoZikiO3RbIuKSoiJdPSIoZykiO3RbIuKSoyJdPSIoaCkiO3RbIuKSpCJdPSIoaSkiO3RbIuKSpSJdPSIoaikiO3RbIuKSpiJdPSIoaykiO3RbIuKSpyJdPSIobCkiO3RbIuKSqCJdPSIobSkiO3RbIuKSqSJdPSIobikiO3RbIuKSqiJdPSIobykiO3RbIuKSqyJdPSIocCkiO3RbIuKSrCJdPSIocSkiO3RbIuKSrSJdPSIocikiO3RbIuKSriJdPSIocykiO3RbIuKSryJdPSIodCkiO3RbIuKSsCJdPSIodSkiO3RbIuKSsSJdPSIodikiO3RbIuKSsiJdPSIodykiO3RbIuKSsyJdPSIoeCkiO3RbIuKStCJdPSIoeSkiO3RbIuKStSJdPSIoeikiO3RbIuKojCJdPSLiiKviiKviiKviiKsiO3RbIuKptCJdPSI6Oj0iO3RbIuKptSJdPSI9PSI7dFsi4qm2Il09Ij09PSI7dFsi4rqfIl09IuavjSI7dFsi4ruzIl09Ium+nyI7dFsi4ryAIl09IuS4gCI7dFsi4ryBIl09IuS4qCI7dFsi4ryCIl09IuS4tiI7dFsi4ryDIl09IuS4vyI7dFsi4ryEIl09IuS5mSI7dFsi4ryFIl09IuS6hSI7dFsi4ryGIl09IuS6jCI7dFsi4ryHIl09IuS6oCI7dFsi4ryIIl09IuS6uiI7dFsi4ryJIl09IuWEvyI7dFsi4ryKIl09IuWFpSI7dFsi4ryLIl09IuWFqyI7dFsi4ryMIl09IuWGgiI7dFsi4ryNIl09IuWGliI7dFsi4ryOIl09IuWGqyI7dFsi4ryPIl09IuWHoCI7dFsi4ryQIl09IuWHtSI7dFsi4ryRIl09IuWIgCI7dFsi4rySIl09IuWKmyI7dFsi4ryTIl09IuWLuSI7dFsi4ryUIl09IuWMlSI7dFsi4ryVIl09IuWMmiI7dFsi4ryWIl09IuWMuCI7dFsi4ryXIl09IuWNgSI7dFsi4ryYIl09IuWNnCI7dFsi4ryZIl09IuWNqSI7dFsi4ryaIl09IuWOgiI7dFsi4rybIl09IuWOtiI7dFsi4rycIl09IuWPiCI7dFsi4rydIl09IuWPoyI7dFsi4ryeIl09IuWblyI7dFsi4ryfIl09IuWcnyI7dFsi4rygIl09IuWjqyI7dFsi4ryhIl09IuWkgiI7dFsi4ryiIl09IuWkiiI7dFsi4ryjIl09IuWklSI7dFsi4rykIl09IuWkpyI7dFsi4rylIl09IuWlsyI7dFsi4rymIl09IuWtkCI7dFsi4rynIl09IuWugCI7dFsi4ryoIl09IuWvuCI7dFsi4rypIl09IuWwjyI7dFsi4ryqIl09IuWwoiI7dFsi4ryrIl09IuWwuCI7dFsi4rysIl09IuWxriI7dFsi4rytIl09IuWxsSI7dFsi4ryuIl09IuW3myI7dFsi4ryvIl09IuW3pSI7dFsi4rywIl09IuW3sSI7dFsi4ryxIl09IuW3viI7dFsi4ryyIl09IuW5siI7dFsi4ryzIl09IuW5uiI7dFsi4ry0Il09IuW5vyI7dFsi4ry1Il09IuW7tCI7dFsi4ry2Il09IuW7viI7dFsi4ry3Il09IuW8iyI7dFsi4ry4Il09IuW8kyI7dFsi4ry5Il09IuW9kCI7dFsi4ry6Il09IuW9oSI7dFsi4ry7Il09IuW9syI7dFsi4ry8Il09IuW/gyI7dFsi4ry9Il09IuaIiCI7dFsi4ry+Il09IuaItiI7dFsi4ry/Il09IuaJiyI7dFsi4r2AIl09IuaUryI7dFsi4r2BIl09IuaUtCI7dFsi4r2CIl09IuaWhyI7dFsi4r2DIl09IuaWlyI7dFsi4r2EIl09IuaWpCI7dFsi4r2FIl09IuaWuSI7dFsi4r2GIl09IuaXoCI7dFsi4r2HIl09IuaXpSI7dFsi4r2IIl09IuabsCI7dFsi4r2JIl09IuaciCI7dFsi4r2KIl09IuacqCI7dFsi4r2LIl09IuasoCI7dFsi4r2MIl09IuatoiI7dFsi4r2NIl09IuatuSI7dFsi4r2OIl09IuausyI7dFsi4r2PIl09IuaviyI7dFsi4r2QIl09IuavlCI7dFsi4r2RIl09IuavmyI7dFsi4r2SIl09IuawjyI7dFsi4r2TIl09IuawlCI7dFsi4r2UIl09IuawtCI7dFsi4r2VIl09IueBqyI7dFsi4r2WIl09IueIqiI7dFsi4r2XIl09IueItiI7dFsi4r2YIl09IueIuyI7dFsi4r2ZIl09IueIvyI7dFsi4r2aIl09IueJhyI7dFsi4r2bIl09IueJmSI7dFsi4r2cIl09IueJmyI7dFsi4r2dIl09IueKrCI7dFsi4r2eIl09IueOhCI7dFsi4r2fIl09IueOiSI7dFsi4r2gIl09IueTnCI7dFsi4r2hIl09IueTpiI7dFsi4r2iIl09IueUmCI7dFsi4r2jIl09IueUnyI7dFsi4r2kIl09IueUqCI7dFsi4r2lIl09IueUsCI7dFsi4r2mIl09IueWiyI7dFsi4r2nIl09IueWkiI7dFsi4r2oIl09IueZtiI7dFsi4r2pIl09IueZvSI7dFsi4r2qIl09IueariI7dFsi4r2rIl09IueavyI7dFsi4r2sIl09IuebriI7dFsi4r2tIl09IuefmyI7dFsi4r2uIl09IuefoiI7dFsi4r2vIl09IuefsyI7dFsi4r2wIl09IuekuiI7dFsi4r2xIl09IuemuCI7dFsi4r2yIl09IuemviI7dFsi4r2zIl09IueptCI7dFsi4r20Il09IueriyI7dFsi4r21Il09IueruSI7dFsi4r22Il09IuexsyI7dFsi4r23Il09IuezuCI7dFsi4r24Il09Iue8tiI7dFsi4r25Il09Iue9kSI7dFsi4r26Il09Iue+iiI7dFsi4r27Il09Iue+vSI7dFsi4r28Il09IuiAgSI7dFsi4r29Il09IuiAjCI7dFsi4r2+Il09IuiAkiI7dFsi4r2/Il09IuiAsyI7dFsi4r6AIl09IuiBvyI7dFsi4r6BIl09IuiCiSI7dFsi4r6CIl09IuiHoyI7dFsi4r6DIl09IuiHqiI7dFsi4r6EIl09IuiHsyI7dFsi4r6FIl09IuiHvCI7dFsi4r6GIl09IuiIjCI7dFsi4r6HIl09IuiImyI7dFsi4r6IIl09IuiInyI7dFsi4r6JIl09IuiJriI7dFsi4r6KIl09IuiJsiI7dFsi4r6LIl09IuiJuCI7dFsi4r6MIl09IuiZjSI7dFsi4r6NIl09IuiZqyI7dFsi4r6OIl09IuihgCI7dFsi4r6PIl09IuihjCI7dFsi4r6QIl09IuihoyI7dFsi4r6RIl09IuilviI7dFsi4r6SIl09IuimiyI7dFsi4r6TIl09IuinkiI7dFsi4r6UIl09IuiogCI7dFsi4r6VIl09IuiwtyI7dFsi4r6WIl09IuixhiI7dFsi4r6XIl09IuixlSI7dFsi4r6YIl09IuixuCI7dFsi4r6ZIl09IuiynSI7dFsi4r6aIl09Iui1pCI7dFsi4r6bIl09Iui1sCI7dFsi4r6cIl09Iui2syI7dFsi4r6dIl09Iui6qyI7dFsi4r6eIl09Iui7iiI7dFsi4r6fIl09Iui+myI7dFsi4r6gIl09Iui+sCI7dFsi4r6hIl09Iui+tSI7dFsi4r6iIl09IumCkSI7dFsi4r6jIl09IumFiSI7dFsi4r6kIl09IumHhiI7dFsi4r6lIl09IumHjCI7dFsi4r6mIl09IumHkSI7dFsi4r6nIl09IumVtyI7dFsi4r6oIl09IumWgCI7dFsi4r6pIl09IumYnCI7dFsi4r6qIl09IumatiI7dFsi4r6rIl09IumauSI7dFsi4r6sIl09IumbqCI7dFsi4r6tIl09IumdkSI7dFsi4r6uIl09IumdniI7dFsi4r6vIl09IumdoiI7dFsi4r6wIl09IumdqSI7dFsi4r6xIl09IumfiyI7dFsi4r6yIl09IumfrSI7dFsi4r6zIl09IumfsyI7dFsi4r60Il09IumggSI7dFsi4r61Il09IumiqCI7dFsi4r62Il09IumjmyI7dFsi4r63Il09IumjnyI7dFsi4r64Il09IummliI7dFsi4r65Il09IummmSI7dFsi4r66Il09IummrCI7dFsi4r67Il09IumqqCI7dFsi4r68Il09IumrmCI7dFsi4r69Il09IumrnyI7dFsi4r6+Il09IumspSI7dFsi4r6/Il09IumsryI7dFsi4r+AIl09IumssiI7dFsi4r+BIl09IumsvCI7dFsi4r+CIl09IumtmiI7dFsi4r+DIl09IumzpSI7dFsi4r+EIl09Ium5tSI7dFsi4r+FIl09Ium5vyI7dFsi4r+GIl09Ium6pSI7dFsi4r+HIl09Ium6uyI7dFsi4r+IIl09Ium7gyI7dFsi4r+JIl09Ium7jSI7dFsi4r+KIl09Ium7kSI7dFsi4r+LIl09Ium7uSI7dFsi4r+MIl09Ium7vSI7dFsi4r+NIl09Ium8jiI7dFsi4r+OIl09Ium8kyI7dFsi4r+PIl09Ium8oCI7dFsi4r+QIl09Ium8uyI7dFsi4r+RIl09Ium9iiI7dFsi4r+SIl09Ium9kiI7dFsi4r+TIl09Ium+jSI7dFsi4r+UIl09Ium+nCI7dFsi4r+VIl09Ium+oCI7dFsi44C2Il09IuOAkiI7dFsi44C4Il09IuWNgSI7dFsi44C5Il09IuWNhCI7dFsi44C6Il09IuWNhSI7dFsi44KbIl09IiDjgpkiO3RbIuOCnCJdPSIg44KaIjt0WyLjhLEiXT0i4YSAIjt0WyLjhLIiXT0i4YSBIjt0WyLjhLMiXT0i4YaqIjt0WyLjhLQiXT0i4YSCIjt0WyLjhLUiXT0i4YasIjt0WyLjhLYiXT0i4YatIjt0WyLjhLciXT0i4YSDIjt0WyLjhLgiXT0i4YSEIjt0WyLjhLkiXT0i4YSFIjt0WyLjhLoiXT0i4YawIjt0WyLjhLsiXT0i4YaxIjt0WyLjhLwiXT0i4YayIjt0WyLjhL0iXT0i4YazIjt0WyLjhL4iXT0i4Ya0Ijt0WyLjhL8iXT0i4Ya1Ijt0WyLjhYAiXT0i4YSaIjt0WyLjhYEiXT0i4YSGIjt0WyLjhYIiXT0i4YSHIjt0WyLjhYMiXT0i4YSIIjt0WyLjhYQiXT0i4YShIjt0WyLjhYUiXT0i4YSJIjt0WyLjhYYiXT0i4YSKIjt0WyLjhYciXT0i4YSLIjt0WyLjhYgiXT0i4YSMIjt0WyLjhYkiXT0i4YSNIjt0WyLjhYoiXT0i4YSOIjt0WyLjhYsiXT0i4YSPIjt0WyLjhYwiXT0i4YSQIjt0WyLjhY0iXT0i4YSRIjt0WyLjhY4iXT0i4YSSIjt0WyLjhY8iXT0i4YWhIjt0WyLjhZAiXT0i4YWiIjt0WyLjhZEiXT0i4YWjIjt0WyLjhZIiXT0i4YWkIjt0WyLjhZMiXT0i4YWlIjt0WyLjhZQiXT0i4YWmIjt0WyLjhZUiXT0i4YWnIjt0WyLjhZYiXT0i4YWoIjt0WyLjhZciXT0i4YWpIjt0WyLjhZgiXT0i4YWqIjt0WyLjhZkiXT0i4YWrIjt0WyLjhZoiXT0i4YWsIjt0WyLjhZsiXT0i4YWtIjt0WyLjhZwiXT0i4YWuIjt0WyLjhZ0iXT0i4YWvIjt0WyLjhZ4iXT0i4YWwIjt0WyLjhZ8iXT0i4YWxIjt0WyLjhaAiXT0i4YWyIjt0WyLjhaEiXT0i4YWzIjt0WyLjhaIiXT0i4YW0Ijt0WyLjhaMiXT0i4YW1Ijt0WyLjhaQiXT0i4YWgIjt0WyLjhaUiXT0i4YSUIjt0WyLjhaYiXT0i4YSVIjt0WyLjhaciXT0i4YeHIjt0WyLjhagiXT0i4YeIIjt0WyLjhakiXT0i4YeMIjt0WyLjhaoiXT0i4YeOIjt0WyLjhasiXT0i4YeTIjt0WyLjhawiXT0i4YeXIjt0WyLjha0iXT0i4YeZIjt0WyLjha4iXT0i4YScIjt0WyLjha8iXT0i4YedIjt0WyLjhbAiXT0i4YefIjt0WyLjhbEiXT0i4YSdIjt0WyLjhbIiXT0i4YSeIjt0WyLjhbMiXT0i4YSgIjt0WyLjhbQiXT0i4YSiIjt0WyLjhbUiXT0i4YSjIjt0WyLjhbYiXT0i4YSnIjt0WyLjhbciXT0i4YSpIjt0WyLjhbgiXT0i4YSrIjt0WyLjhbkiXT0i4YSsIjt0WyLjhboiXT0i4YStIjt0WyLjhbsiXT0i4YSuIjt0WyLjhbwiXT0i4YSvIjt0WyLjhb0iXT0i4YSyIjt0WyLjhb4iXT0i4YS2Ijt0WyLjhb8iXT0i4YWAIjt0WyLjhoAiXT0i4YWHIjt0WyLjhoEiXT0i4YWMIjt0WyLjhoIiXT0i4YexIjt0WyLjhoMiXT0i4YeyIjt0WyLjhoQiXT0i4YWXIjt0WyLjhoUiXT0i4YWYIjt0WyLjhoYiXT0i4YWZIjt0WyLjhociXT0i4YaEIjt0WyLjhogiXT0i4YaFIjt0WyLjhokiXT0i4YaIIjt0WyLjhooiXT0i4YaRIjt0WyLjhosiXT0i4YaSIjt0WyLjhowiXT0i4YaUIjt0WyLjho0iXT0i4YaeIjt0WyLjho4iXT0i4YahIjt0WyLjiIAiXT0iKOGEgCkiO3RbIuOIgSJdPSIo4YSCKSI7dFsi44iCIl09IijhhIMpIjt0WyLjiIMiXT0iKOGEhSkiO3RbIuOIhCJdPSIo4YSGKSI7dFsi44iFIl09IijhhIcpIjt0WyLjiIYiXT0iKOGEiSkiO3RbIuOIhyJdPSIo4YSLKSI7dFsi44iIIl09IijhhIwpIjt0WyLjiIkiXT0iKOGEjikiO3RbIuOIiiJdPSIo4YSPKSI7dFsi44iLIl09IijhhJApIjt0WyLjiIwiXT0iKOGEkSkiO3RbIuOIjSJdPSIo4YSSKSI7dFsi44iOIl09IijhhIDhhaEpIjt0WyLjiI8iXT0iKOGEguGFoSkiO3RbIuOIkCJdPSIo4YSD4YWhKSI7dFsi44iRIl09IijhhIXhhaEpIjt0WyLjiJIiXT0iKOGEhuGFoSkiO3RbIuOIkyJdPSIo4YSH4YWhKSI7dFsi44iUIl09IijhhInhhaEpIjt0WyLjiJUiXT0iKOGEi+GFoSkiO3RbIuOIliJdPSIo4YSM4YWhKSI7dFsi44iXIl09IijhhI7hhaEpIjt0WyLjiJgiXT0iKOGEj+GFoSkiO3RbIuOImSJdPSIo4YSQ4YWhKSI7dFsi44iaIl09IijhhJHhhaEpIjt0WyLjiJsiXT0iKOGEkuGFoSkiO3RbIuOInCJdPSIo4YSM4YWuKSI7dFsi44idIl09IijhhIvhhanhhIzhhaXhhqspIjt0WyLjiJ4iXT0iKOGEi+GFqeGEkuGFrikiO3RbIuOIoCJdPSIo5LiAKSI7dFsi44ihIl09IijkuowpIjt0WyLjiKIiXT0iKOS4iSkiO3RbIuOIoyJdPSIo5ZubKSI7dFsi44ikIl09IijkupQpIjt0WyLjiKUiXT0iKOWFrSkiO3RbIuOIpiJdPSIo5LiDKSI7dFsi44inIl09IijlhaspIjt0WyLjiKgiXT0iKOS5nSkiO3RbIuOIqSJdPSIo5Y2BKSI7dFsi44iqIl09IijmnIgpIjt0WyLjiKsiXT0iKOeBqykiO3RbIuOIrCJdPSIo5rC0KSI7dFsi44itIl09IijmnKgpIjt0WyLjiK4iXT0iKOmHkSkiO3RbIuOIryJdPSIo5ZyfKSI7dFsi44iwIl09Iijml6UpIjt0WyLjiLEiXT0iKOagqikiO3RbIuOIsiJdPSIo5pyJKSI7dFsi44izIl09IijnpL4pIjt0WyLjiLQiXT0iKOWQjSkiO3RbIuOItSJdPSIo54m5KSI7dFsi44i2Il09IijosqEpIjt0WyLjiLciXT0iKOelnSkiO3RbIuOIuCJdPSIo5Yq0KSI7dFsi44i5Il09Iijku6MpIjt0WyLjiLoiXT0iKOWRvCkiO3RbIuOIuyJdPSIo5a2mKSI7dFsi44i8Il09Iijnm6MpIjt0WyLjiL0iXT0iKOS8gSkiO3RbIuOIviJdPSIo6LOHKSI7dFsi44i/Il09IijljZQpIjt0WyLjiYAiXT0iKOelrSkiO3RbIuOJgSJdPSIo5LyRKSI7dFsi44mCIl09Iijoh6opIjt0WyLjiYMiXT0iKOiHsykiO3RbIuOLgCJdPSIx5pyIIjt0WyLji4EiXT0iMuaciCI7dFsi44uCIl09IjPmnIgiO3RbIuOLgyJdPSI05pyIIjt0WyLji4QiXT0iNeaciCI7dFsi44uFIl09IjbmnIgiO3RbIuOLhiJdPSI35pyIIjt0WyLji4ciXT0iOOaciCI7dFsi44uIIl09IjnmnIgiO3RbIuOLiSJdPSIxMOaciCI7dFsi44uKIl09IjEx5pyIIjt0WyLji4siXT0iMTLmnIgiO3RbIuONmCJdPSIw54K5Ijt0WyLjjZkiXT0iMeeCuSI7dFsi442aIl09IjLngrkiO3RbIuONmyJdPSIz54K5Ijt0WyLjjZwiXT0iNOeCuSI7dFsi442dIl09IjXngrkiO3RbIuONniJdPSI254K5Ijt0WyLjjZ8iXT0iN+eCuSI7dFsi442gIl09IjjngrkiO3RbIuONoSJdPSI554K5Ijt0WyLjjaIiXT0iMTDngrkiO3RbIuONoyJdPSIxMeeCuSI7dFsi442kIl09IjEy54K5Ijt0WyLjjaUiXT0iMTPngrkiO3RbIuONpiJdPSIxNOeCuSI7dFsi442nIl09IjE154K5Ijt0WyLjjagiXT0iMTbngrkiO3RbIuONqSJdPSIxN+eCuSI7dFsi442qIl09IjE454K5Ijt0WyLjjasiXT0iMTnngrkiO3RbIuONrCJdPSIyMOeCuSI7dFsi442tIl09IjIx54K5Ijt0WyLjja4iXT0iMjLngrkiO3RbIuONryJdPSIyM+eCuSI7dFsi442wIl09IjI054K5Ijt0WyLjj6AiXT0iMeaXpSI7dFsi44+hIl09IjLml6UiO3RbIuOPoiJdPSIz5pelIjt0WyLjj6MiXT0iNOaXpSI7dFsi44+kIl09IjXml6UiO3RbIuOPpSJdPSI25pelIjt0WyLjj6YiXT0iN+aXpSI7dFsi44+nIl09Ijjml6UiO3RbIuOPqCJdPSI55pelIjt0WyLjj6kiXT0iMTDml6UiO3RbIuOPqiJdPSIxMeaXpSI7dFsi44+rIl09IjEy5pelIjt0WyLjj6wiXT0iMTPml6UiO3RbIuOPrSJdPSIxNOaXpSI7dFsi44+uIl09IjE15pelIjt0WyLjj68iXT0iMTbml6UiO3RbIuOPsCJdPSIxN+aXpSI7dFsi44+xIl09IjE45pelIjt0WyLjj7IiXT0iMTnml6UiO3RbIuOPsyJdPSIyMOaXpSI7dFsi44+0Il09IjIx5pelIjt0WyLjj7UiXT0iMjLml6UiO3RbIuOPtiJdPSIyM+aXpSI7dFsi44+3Il09IjI05pelIjt0WyLjj7giXT0iMjXml6UiO3RbIuOPuSJdPSIyNuaXpSI7dFsi44+6Il09IjI35pelIjt0WyLjj7siXT0iMjjml6UiO3RbIuOPvCJdPSIyOeaXpSI7dFsi44+9Il09IjMw5pelIjt0WyLjj74iXT0iMzHml6UiO3RbIu+sgCJdPSJmZiI7dFsi76yBIl09ImZpIjt0WyLvrIIiXT0iZmwiO3RbIu+sgyJdPSJmZmkiO3RbIu+shCJdPSJmZmwiO3RbIu+shSJdPSLFv3QiO3RbIu+shiJdPSJzdCI7dFsi76yTIl09ItW01bYiO3RbIu+slCJdPSLVtNWlIjt0WyLvrJUiXT0i1bTVqyI7dFsi76yWIl09ItW+1bYiO3RbIu+slyJdPSLVtNWtIjt0WyLvrY8iXT0i15DXnCI7dFsi762QIl09ItmxIjt0WyLvrZEiXT0i2bEiO3RbIu+tkiJdPSLZuyI7dFsi762TIl09Itm7Ijt0WyLvrZQiXT0i2bsiO3RbIu+tlSJdPSLZuyI7dFsi762WIl09Itm+Ijt0WyLvrZciXT0i2b4iO3RbIu+tmCJdPSLZviI7dFsi762ZIl09Itm+Ijt0WyLvrZoiXT0i2oAiO3RbIu+tmyJdPSLagCI7dFsi762cIl09ItqAIjt0WyLvrZ0iXT0i2oAiO3RbIu+tniJdPSLZuiI7dFsi762fIl09Itm6Ijt0WyLvraAiXT0i2boiO3RbIu+toSJdPSLZuiI7dFsi762iIl09Itm/Ijt0WyLvraMiXT0i2b8iO3RbIu+tpCJdPSLZvyI7dFsi762lIl09Itm/Ijt0WyLvraYiXT0i2bkiO3RbIu+tpyJdPSLZuSI7dFsi762oIl09Itm5Ijt0WyLvrakiXT0i2bkiO3RbIu+tqiJdPSLapCI7dFsi762rIl09ItqkIjt0WyLvrawiXT0i2qQiO3RbIu+trSJdPSLapCI7dFsi762uIl09ItqmIjt0WyLvra8iXT0i2qYiO3RbIu+tsCJdPSLapiI7dFsi762xIl09ItqmIjt0WyLvrbIiXT0i2oQiO3RbIu+tsyJdPSLahCI7dFsi7620Il09ItqEIjt0WyLvrbUiXT0i2oQiO3RbIu+ttiJdPSLagyI7dFsi7623Il09ItqDIjt0WyLvrbgiXT0i2oMiO3RbIu+tuSJdPSLagyI7dFsi7626Il09ItqGIjt0WyLvrbsiXT0i2oYiO3RbIu+tvCJdPSLahiI7dFsi7629Il09ItqGIjt0WyLvrb4iXT0i2ociO3RbIu+tvyJdPSLahyI7dFsi766AIl09ItqHIjt0WyLvroEiXT0i2ociO3RbIu+ugiJdPSLajSI7dFsi766DIl09ItqNIjt0WyLvroQiXT0i2owiO3RbIu+uhSJdPSLajCI7dFsi766GIl09ItqOIjt0WyLvrociXT0i2o4iO3RbIu+uiCJdPSLaiCI7dFsi766JIl09ItqIIjt0WyLvrooiXT0i2pgiO3RbIu+uiyJdPSLamCI7dFsi766MIl09ItqRIjt0WyLvro0iXT0i2pEiO3RbIu+ujiJdPSLaqSI7dFsi766PIl09ItqpIjt0WyLvrpAiXT0i2qkiO3RbIu+ukSJdPSLaqSI7dFsi766SIl09ItqvIjt0WyLvrpMiXT0i2q8iO3RbIu+ulCJdPSLaryI7dFsi766VIl09ItqvIjt0WyLvrpYiXT0i2rMiO3RbIu+ulyJdPSLasyI7dFsi766YIl09ItqzIjt0WyLvrpkiXT0i2rMiO3RbIu+umiJdPSLasSI7dFsi766bIl09ItqxIjt0WyLvrpwiXT0i2rEiO3RbIu+unSJdPSLasSI7dFsi766eIl09Itq6Ijt0WyLvrp8iXT0i2roiO3RbIu+uoCJdPSLauyI7dFsi766hIl09Itq7Ijt0WyLvrqIiXT0i2rsiO3RbIu+uoyJdPSLauyI7dFsi766kIl09ItuAIjt0WyLvrqUiXT0i24AiO3RbIu+upiJdPSLbgSI7dFsi766nIl09ItuBIjt0WyLvrqgiXT0i24EiO3RbIu+uqSJdPSLbgSI7dFsi766qIl09Itq+Ijt0WyLvrqsiXT0i2r4iO3RbIu+urCJdPSLaviI7dFsi766tIl09Itq+Ijt0WyLvrq4iXT0i25IiO3RbIu+uryJdPSLbkiI7dFsi766wIl09ItuTIjt0WyLvrrEiXT0i25MiO3RbIu+vkyJdPSLarSI7dFsi76+UIl09ItqtIjt0WyLvr5UiXT0i2q0iO3RbIu+vliJdPSLarSI7dFsi76+XIl09ItuHIjt0WyLvr5giXT0i24ciO3RbIu+vmSJdPSLbhiI7dFsi76+aIl09ItuGIjt0WyLvr5siXT0i24giO3RbIu+vnCJdPSLbiCI7dFsi76+dIl09Itm3Ijt0WyLvr54iXT0i24siO3RbIu+vnyJdPSLbiyI7dFsi76+gIl09ItuFIjt0WyLvr6EiXT0i24UiO3RbIu+voiJdPSLbiSI7dFsi76+jIl09ItuJIjt0WyLvr6QiXT0i25AiO3RbIu+vpSJdPSLbkCI7dFsi76+mIl09ItuQIjt0WyLvr6ciXT0i25AiO3RbIu+vqCJdPSLZiSI7dFsi76+pIl09ItmJIjt0WyLvr6oiXT0i2KbYpyI7dFsi76+rIl09Itim2KciO3RbIu+vrCJdPSLYptuVIjt0WyLvr60iXT0i2KbblSI7dFsi76+uIl09Itim2YgiO3RbIu+vryJdPSLYptmIIjt0WyLvr7AiXT0i2KbbhyI7dFsi76+xIl09Itim24ciO3RbIu+vsiJdPSLYptuGIjt0WyLvr7MiXT0i2KbbhiI7dFsi76+0Il09Itim24giO3RbIu+vtSJdPSLYptuIIjt0WyLvr7YiXT0i2KbbkCI7dFsi76+3Il09Itim25AiO3RbIu+vuCJdPSLYptuQIjt0WyLvr7kiXT0i2KbZiSI7dFsi76+6Il09Itim2YkiO3RbIu+vuyJdPSLYptmJIjt0WyLvr7wiXT0i24wiO3RbIu+vvSJdPSLbjCI7dFsi76++Il09ItuMIjt0WyLvr78iXT0i24wiO3RbIu+wgCJdPSLYptisIjt0WyLvsIEiXT0i2KbYrSI7dFsi77CCIl09Itim2YUiO3RbIu+wgyJdPSLYptmJIjt0WyLvsIQiXT0i2KbZiiI7dFsi77CFIl09Itio2KwiO3RbIu+whiJdPSLYqNitIjt0WyLvsIciXT0i2KjYriI7dFsi77CIIl09Itio2YUiO3RbIu+wiSJdPSLYqNmJIjt0WyLvsIoiXT0i2KjZiiI7dFsi77CLIl09Itiq2KwiO3RbIu+wjCJdPSLYqtitIjt0WyLvsI0iXT0i2KrYriI7dFsi77COIl09Itiq2YUiO3RbIu+wjyJdPSLYqtmJIjt0WyLvsJAiXT0i2KrZiiI7dFsi77CRIl09Itir2KwiO3RbIu+wkiJdPSLYq9mFIjt0WyLvsJMiXT0i2KvZiSI7dFsi77CUIl09Itir2YoiO3RbIu+wlSJdPSLYrNitIjt0WyLvsJYiXT0i2KzZhSI7dFsi77CXIl09Itit2KwiO3RbIu+wmCJdPSLYrdmFIjt0WyLvsJkiXT0i2K7YrCI7dFsi77CaIl09Itiu2K0iO3RbIu+wmyJdPSLYrtmFIjt0WyLvsJwiXT0i2LPYrCI7dFsi77CdIl09Itiz2K0iO3RbIu+wniJdPSLYs9iuIjt0WyLvsJ8iXT0i2LPZhSI7dFsi77CgIl09Iti12K0iO3RbIu+woSJdPSLYtdmFIjt0WyLvsKIiXT0i2LbYrCI7dFsi77CjIl09Iti22K0iO3RbIu+wpCJdPSLYttiuIjt0WyLvsKUiXT0i2LbZhSI7dFsi77CmIl09Iti32K0iO3RbIu+wpyJdPSLYt9mFIjt0WyLvsKgiXT0i2LjZhSI7dFsi77CpIl09Iti52KwiO3RbIu+wqiJdPSLYudmFIjt0WyLvsKsiXT0i2LrYrCI7dFsi77CsIl09Iti62YUiO3RbIu+wrSJdPSLZgdisIjt0WyLvsK4iXT0i2YHYrSI7dFsi77CvIl09ItmB2K4iO3RbIu+wsCJdPSLZgdmFIjt0WyLvsLEiXT0i2YHZiSI7dFsi77CyIl09ItmB2YoiO3RbIu+wsyJdPSLZgtitIjt0WyLvsLQiXT0i2YLZhSI7dFsi77C1Il09ItmC2YkiO3RbIu+wtiJdPSLZgtmKIjt0WyLvsLciXT0i2YPYpyI7dFsi77C4Il09ItmD2KwiO3RbIu+wuSJdPSLZg9itIjt0WyLvsLoiXT0i2YPYriI7dFsi77C7Il09ItmD2YQiO3RbIu+wvCJdPSLZg9mFIjt0WyLvsL0iXT0i2YPZiSI7dFsi77C+Il09ItmD2YoiO3RbIu+wvyJdPSLZhNisIjt0WyLvsYAiXT0i2YTYrSI7dFsi77GBIl09ItmE2K4iO3RbIu+xgiJdPSLZhNmFIjt0WyLvsYMiXT0i2YTZiSI7dFsi77GEIl09ItmE2YoiO3RbIu+xhSJdPSLZhdisIjt0WyLvsYYiXT0i2YXYrSI7dFsi77GHIl09ItmF2K4iO3RbIu+xiCJdPSLZhdmFIjt0WyLvsYkiXT0i2YXZiSI7dFsi77GKIl09ItmF2YoiO3RbIu+xiyJdPSLZhtisIjt0WyLvsYwiXT0i2YbYrSI7dFsi77GNIl09ItmG2K4iO3RbIu+xjiJdPSLZhtmFIjt0WyLvsY8iXT0i2YbZiSI7dFsi77GQIl09ItmG2YoiO3RbIu+xkSJdPSLZh9isIjt0WyLvsZIiXT0i2YfZhSI7dFsi77GTIl09ItmH2YkiO3RbIu+xlCJdPSLZh9mKIjt0WyLvsZUiXT0i2YrYrCI7dFsi77GWIl09ItmK2K0iO3RbIu+xlyJdPSLZitiuIjt0WyLvsZgiXT0i2YrZhSI7dFsi77GZIl09ItmK2YkiO3RbIu+xmiJdPSLZitmKIjt0WyLvsZsiXT0i2LDZsCI7dFsi77GcIl09Itix2bAiO3RbIu+xnSJdPSLZidmwIjt0WyLvsZ4iXT0iINmM2ZEiO3RbIu+xnyJdPSIg2Y3ZkSI7dFsi77GgIl09IiDZjtmRIjt0WyLvsaEiXT0iINmP2ZEiO3RbIu+xoiJdPSIg2ZDZkSI7dFsi77GjIl09IiDZkdmwIjt0WyLvsaQiXT0i2KbYsSI7dFsi77GlIl09Itim2LIiO3RbIu+xpiJdPSLYptmFIjt0WyLvsaciXT0i2KbZhiI7dFsi77GoIl09Itim2YkiO3RbIu+xqSJdPSLYptmKIjt0WyLvsaoiXT0i2KjYsSI7dFsi77GrIl09Itio2LIiO3RbIu+xrCJdPSLYqNmFIjt0WyLvsa0iXT0i2KjZhiI7dFsi77GuIl09Itio2YkiO3RbIu+xryJdPSLYqNmKIjt0WyLvsbAiXT0i2KrYsSI7dFsi77GxIl09Itiq2LIiO3RbIu+xsiJdPSLYqtmFIjt0WyLvsbMiXT0i2KrZhiI7dFsi77G0Il09Itiq2YkiO3RbIu+xtSJdPSLYqtmKIjt0WyLvsbYiXT0i2KvYsSI7dFsi77G3Il09Itir2LIiO3RbIu+xuCJdPSLYq9mFIjt0WyLvsbkiXT0i2KvZhiI7dFsi77G6Il09Itir2YkiO3RbIu+xuyJdPSLYq9mKIjt0WyLvsbwiXT0i2YHZiSI7dFsi77G9Il09ItmB2YoiO3RbIu+xviJdPSLZgtmJIjt0WyLvsb8iXT0i2YLZiiI7dFsi77KAIl09ItmD2KciO3RbIu+ygSJdPSLZg9mEIjt0WyLvsoIiXT0i2YPZhSI7dFsi77KDIl09ItmD2YkiO3RbIu+yhCJdPSLZg9mKIjt0WyLvsoUiXT0i2YTZhSI7dFsi77KGIl09ItmE2YkiO3RbIu+yhyJdPSLZhNmKIjt0WyLvsogiXT0i2YXYpyI7dFsi77KJIl09ItmF2YUiO3RbIu+yiiJdPSLZhtixIjt0WyLvsosiXT0i2YbYsiI7dFsi77KMIl09ItmG2YUiO3RbIu+yjSJdPSLZhtmGIjt0WyLvso4iXT0i2YbZiSI7dFsi77KPIl09ItmG2YoiO3RbIu+ykCJdPSLZidmwIjt0WyLvspEiXT0i2YrYsSI7dFsi77KSIl09ItmK2LIiO3RbIu+ykyJdPSLZitmFIjt0WyLvspQiXT0i2YrZhiI7dFsi77KVIl09ItmK2YkiO3RbIu+yliJdPSLZitmKIjt0WyLvspciXT0i2KbYrCI7dFsi77KYIl09Itim2K0iO3RbIu+ymSJdPSLYptiuIjt0WyLvspoiXT0i2KbZhSI7dFsi77KbIl09Itim2YciO3RbIu+ynCJdPSLYqNisIjt0WyLvsp0iXT0i2KjYrSI7dFsi77KeIl09Itio2K4iO3RbIu+ynyJdPSLYqNmFIjt0WyLvsqAiXT0i2KjZhyI7dFsi77KhIl09Itiq2KwiO3RbIu+yoiJdPSLYqtitIjt0WyLvsqMiXT0i2KrYriI7dFsi77KkIl09Itiq2YUiO3RbIu+ypSJdPSLYqtmHIjt0WyLvsqYiXT0i2KvZhSI7dFsi77KnIl09Itis2K0iO3RbIu+yqCJdPSLYrNmFIjt0WyLvsqkiXT0i2K3YrCI7dFsi77KqIl09Itit2YUiO3RbIu+yqyJdPSLYrtisIjt0WyLvsqwiXT0i2K7ZhSI7dFsi77KtIl09Itiz2KwiO3RbIu+yriJdPSLYs9itIjt0WyLvsq8iXT0i2LPYriI7dFsi77KwIl09Itiz2YUiO3RbIu+ysSJdPSLYtditIjt0WyLvsrIiXT0i2LXYriI7dFsi77KzIl09Iti12YUiO3RbIu+ytCJdPSLYttisIjt0WyLvsrUiXT0i2LbYrSI7dFsi77K2Il09Iti22K4iO3RbIu+ytyJdPSLYttmFIjt0WyLvsrgiXT0i2LfYrSI7dFsi77K5Il09Iti42YUiO3RbIu+yuiJdPSLYudisIjt0WyLvsrsiXT0i2LnZhSI7dFsi77K8Il09Iti62KwiO3RbIu+yvSJdPSLYutmFIjt0WyLvsr4iXT0i2YHYrCI7dFsi77K/Il09ItmB2K0iO3RbIu+zgCJdPSLZgdiuIjt0WyLvs4EiXT0i2YHZhSI7dFsi77OCIl09ItmC2K0iO3RbIu+zgyJdPSLZgtmFIjt0WyLvs4QiXT0i2YPYrCI7dFsi77OFIl09ItmD2K0iO3RbIu+zhiJdPSLZg9iuIjt0WyLvs4ciXT0i2YPZhCI7dFsi77OIIl09ItmD2YUiO3RbIu+ziSJdPSLZhNisIjt0WyLvs4oiXT0i2YTYrSI7dFsi77OLIl09ItmE2K4iO3RbIu+zjCJdPSLZhNmFIjt0WyLvs40iXT0i2YTZhyI7dFsi77OOIl09ItmF2KwiO3RbIu+zjyJdPSLZhditIjt0WyLvs5AiXT0i2YXYriI7dFsi77ORIl09ItmF2YUiO3RbIu+zkiJdPSLZhtisIjt0WyLvs5MiXT0i2YbYrSI7dFsi77OUIl09ItmG2K4iO3RbIu+zlSJdPSLZhtmFIjt0WyLvs5YiXT0i2YbZhyI7dFsi77OXIl09ItmH2KwiO3RbIu+zmCJdPSLZh9mFIjt0WyLvs5kiXT0i2YfZsCI7dFsi77OaIl09ItmK2KwiO3RbIu+zmyJdPSLZititIjt0WyLvs5wiXT0i2YrYriI7dFsi77OdIl09ItmK2YUiO3RbIu+zniJdPSLZitmHIjt0WyLvs58iXT0i2KbZhSI7dFsi77OgIl09Itim2YciO3RbIu+zoSJdPSLYqNmFIjt0WyLvs6IiXT0i2KjZhyI7dFsi77OjIl09Itiq2YUiO3RbIu+zpCJdPSLYqtmHIjt0WyLvs6UiXT0i2KvZhSI7dFsi77OmIl09Itir2YciO3RbIu+zpyJdPSLYs9mFIjt0WyLvs6giXT0i2LPZhyI7dFsi77OpIl09Iti02YUiO3RbIu+zqiJdPSLYtNmHIjt0WyLvs6siXT0i2YPZhCI7dFsi77OsIl09ItmD2YUiO3RbIu+zrSJdPSLZhNmFIjt0WyLvs64iXT0i2YbZhSI7dFsi77OvIl09ItmG2YciO3RbIu+zsCJdPSLZitmFIjt0WyLvs7EiXT0i2YrZhyI7dFsi77OyIl09ItmA2Y7ZkSI7dFsi77OzIl09ItmA2Y/ZkSI7dFsi77O0Il09ItmA2ZDZkSI7dFsi77O1Il09Iti32YkiO3RbIu+ztiJdPSLYt9mKIjt0WyLvs7ciXT0i2LnZiSI7dFsi77O4Il09Iti52YoiO3RbIu+zuSJdPSLYutmJIjt0WyLvs7oiXT0i2LrZiiI7dFsi77O7Il09Itiz2YkiO3RbIu+zvCJdPSLYs9mKIjt0WyLvs70iXT0i2LTZiSI7dFsi77O+Il09Iti02YoiO3RbIu+zvyJdPSLYrdmJIjt0WyLvtIAiXT0i2K3ZiiI7dFsi77SBIl09Itis2YkiO3RbIu+0giJdPSLYrNmKIjt0WyLvtIMiXT0i2K7ZiSI7dFsi77SEIl09Itiu2YoiO3RbIu+0hSJdPSLYtdmJIjt0WyLvtIYiXT0i2LXZiiI7dFsi77SHIl09Iti22YkiO3RbIu+0iCJdPSLYttmKIjt0WyLvtIkiXT0i2LTYrCI7dFsi77SKIl09Iti02K0iO3RbIu+0iyJdPSLYtNiuIjt0WyLvtIwiXT0i2LTZhSI7dFsi77SNIl09Iti02LEiO3RbIu+0jiJdPSLYs9ixIjt0WyLvtI8iXT0i2LXYsSI7dFsi77SQIl09Iti22LEiO3RbIu+0kSJdPSLYt9mJIjt0WyLvtJIiXT0i2LfZiiI7dFsi77STIl09Iti52YkiO3RbIu+0lCJdPSLYudmKIjt0WyLvtJUiXT0i2LrZiSI7dFsi77SWIl09Iti62YoiO3RbIu+0lyJdPSLYs9mJIjt0WyLvtJgiXT0i2LPZiiI7dFsi77SZIl09Iti02YkiO3RbIu+0miJdPSLYtNmKIjt0WyLvtJsiXT0i2K3ZiSI7dFsi77ScIl09Itit2YoiO3RbIu+0nSJdPSLYrNmJIjt0WyLvtJ4iXT0i2KzZiiI7dFsi77SfIl09Itiu2YkiO3RbIu+0oCJdPSLYrtmKIjt0WyLvtKEiXT0i2LXZiSI7dFsi77SiIl09Iti12YoiO3RbIu+0oyJdPSLYttmJIjt0WyLvtKQiXT0i2LbZiiI7dFsi77SlIl09Iti02KwiO3RbIu+0piJdPSLYtNitIjt0WyLvtKciXT0i2LTYriI7dFsi77SoIl09Iti02YUiO3RbIu+0qSJdPSLYtNixIjt0WyLvtKoiXT0i2LPYsSI7dFsi77SrIl09Iti12LEiO3RbIu+0rCJdPSLYttixIjt0WyLvtK0iXT0i2LTYrCI7dFsi77SuIl09Iti02K0iO3RbIu+0ryJdPSLYtNiuIjt0WyLvtLAiXT0i2LTZhSI7dFsi77SxIl09Itiz2YciO3RbIu+0siJdPSLYtNmHIjt0WyLvtLMiXT0i2LfZhSI7dFsi77S0Il09Itiz2KwiO3RbIu+0tSJdPSLYs9itIjt0WyLvtLYiXT0i2LPYriI7dFsi77S3Il09Iti02KwiO3RbIu+0uCJdPSLYtNitIjt0WyLvtLkiXT0i2LTYriI7dFsi77S6Il09Iti32YUiO3RbIu+0uyJdPSLYuNmFIjt0WyLvtLwiXT0i2KfZiyI7dFsi77S9Il09Itin2YsiO3RbIu+1kCJdPSLYqtis2YUiO3RbIu+1kSJdPSLYqtit2KwiO3RbIu+1kiJdPSLYqtit2KwiO3RbIu+1kyJdPSLYqtit2YUiO3RbIu+1lCJdPSLYqtiu2YUiO3RbIu+1lSJdPSLYqtmF2KwiO3RbIu+1liJdPSLYqtmF2K0iO3RbIu+1lyJdPSLYqtmF2K4iO3RbIu+1mCJdPSLYrNmF2K0iO3RbIu+1mSJdPSLYrNmF2K0iO3RbIu+1miJdPSLYrdmF2YoiO3RbIu+1myJdPSLYrdmF2YkiO3RbIu+1nCJdPSLYs9it2KwiO3RbIu+1nSJdPSLYs9is2K0iO3RbIu+1niJdPSLYs9is2YkiO3RbIu+1nyJdPSLYs9mF2K0iO3RbIu+1oCJdPSLYs9mF2K0iO3RbIu+1oSJdPSLYs9mF2KwiO3RbIu+1oiJdPSLYs9mF2YUiO3RbIu+1oyJdPSLYs9mF2YUiO3RbIu+1pCJdPSLYtdit2K0iO3RbIu+1pSJdPSLYtdit2K0iO3RbIu+1piJdPSLYtdmF2YUiO3RbIu+1pyJdPSLYtNit2YUiO3RbIu+1qCJdPSLYtNit2YUiO3RbIu+1qSJdPSLYtNis2YoiO3RbIu+1qiJdPSLYtNmF2K4iO3RbIu+1qyJdPSLYtNmF2K4iO3RbIu+1rCJdPSLYtNmF2YUiO3RbIu+1rSJdPSLYtNmF2YUiO3RbIu+1riJdPSLYttit2YkiO3RbIu+1ryJdPSLYttiu2YUiO3RbIu+1sCJdPSLYttiu2YUiO3RbIu+1sSJdPSLYt9mF2K0iO3RbIu+1siJdPSLYt9mF2K0iO3RbIu+1syJdPSLYt9mF2YUiO3RbIu+1tCJdPSLYt9mF2YoiO3RbIu+1tSJdPSLYudis2YUiO3RbIu+1tiJdPSLYudmF2YUiO3RbIu+1tyJdPSLYudmF2YUiO3RbIu+1uCJdPSLYudmF2YkiO3RbIu+1uSJdPSLYutmF2YUiO3RbIu+1uiJdPSLYutmF2YoiO3RbIu+1uyJdPSLYutmF2YkiO3RbIu+1vCJdPSLZgdiu2YUiO3RbIu+1vSJdPSLZgdiu2YUiO3RbIu+1viJdPSLZgtmF2K0iO3RbIu+1vyJdPSLZgtmF2YUiO3RbIu+2gCJdPSLZhNit2YUiO3RbIu+2gSJdPSLZhNit2YoiO3RbIu+2giJdPSLZhNit2YkiO3RbIu+2gyJdPSLZhNis2KwiO3RbIu+2hCJdPSLZhNis2KwiO3RbIu+2hSJdPSLZhNiu2YUiO3RbIu+2hiJdPSLZhNiu2YUiO3RbIu+2hyJdPSLZhNmF2K0iO3RbIu+2iCJdPSLZhNmF2K0iO3RbIu+2iSJdPSLZhdit2KwiO3RbIu+2iiJdPSLZhdit2YUiO3RbIu+2iyJdPSLZhdit2YoiO3RbIu+2jCJdPSLZhdis2K0iO3RbIu+2jSJdPSLZhdis2YUiO3RbIu+2jiJdPSLZhdiu2KwiO3RbIu+2jyJdPSLZhdiu2YUiO3RbIu+2kiJdPSLZhdis2K4iO3RbIu+2kyJdPSLZh9mF2KwiO3RbIu+2lCJdPSLZh9mF2YUiO3RbIu+2lSJdPSLZhtit2YUiO3RbIu+2liJdPSLZhtit2YkiO3RbIu+2lyJdPSLZhtis2YUiO3RbIu+2mCJdPSLZhtis2YUiO3RbIu+2mSJdPSLZhtis2YkiO3RbIu+2miJdPSLZhtmF2YoiO3RbIu+2myJdPSLZhtmF2YkiO3RbIu+2nCJdPSLZitmF2YUiO3RbIu+2nSJdPSLZitmF2YUiO3RbIu+2niJdPSLYqNiu2YoiO3RbIu+2nyJdPSLYqtis2YoiO3RbIu+2oCJdPSLYqtis2YkiO3RbIu+2oSJdPSLYqtiu2YoiO3RbIu+2oiJdPSLYqtiu2YkiO3RbIu+2oyJdPSLYqtmF2YoiO3RbIu+2pCJdPSLYqtmF2YkiO3RbIu+2pSJdPSLYrNmF2YoiO3RbIu+2piJdPSLYrNit2YkiO3RbIu+2pyJdPSLYrNmF2YkiO3RbIu+2qCJdPSLYs9iu2YkiO3RbIu+2qSJdPSLYtdit2YoiO3RbIu+2qiJdPSLYtNit2YoiO3RbIu+2qyJdPSLYttit2YoiO3RbIu+2rCJdPSLZhNis2YoiO3RbIu+2rSJdPSLZhNmF2YoiO3RbIu+2riJdPSLZitit2YoiO3RbIu+2ryJdPSLZitis2YoiO3RbIu+2sCJdPSLZitmF2YoiO3RbIu+2sSJdPSLZhdmF2YoiO3RbIu+2siJdPSLZgtmF2YoiO3RbIu+2syJdPSLZhtit2YoiO3RbIu+2tCJdPSLZgtmF2K0iO3RbIu+2tSJdPSLZhNit2YUiO3RbIu+2tiJdPSLYudmF2YoiO3RbIu+2tyJdPSLZg9mF2YoiO3RbIu+2uCJdPSLZhtis2K0iO3RbIu+2uSJdPSLZhdiu2YoiO3RbIu+2uiJdPSLZhNis2YUiO3RbIu+2uyJdPSLZg9mF2YUiO3RbIu+2vCJdPSLZhNis2YUiO3RbIu+2vSJdPSLZhtis2K0iO3RbIu+2viJdPSLYrNit2YoiO3RbIu+2vyJdPSLYrdis2YoiO3RbIu+3gCJdPSLZhdis2YoiO3RbIu+3gSJdPSLZgdmF2YoiO3RbIu+3giJdPSLYqNit2YoiO3RbIu+3gyJdPSLZg9mF2YUiO3RbIu+3hCJdPSLYudis2YUiO3RbIu+3hSJdPSLYtdmF2YUiO3RbIu+3hiJdPSLYs9iu2YoiO3RbIu+3hyJdPSLZhtis2YoiO3RbIu+5iSJdPSLigL4iO3RbIu+5iiJdPSLigL4iO3RbIu+5iyJdPSLigL4iO3RbIu+5jCJdPSLigL4iO3RbIu+5jSJdPSJfIjt0WyLvuY4iXT0iXyI7dFsi77mPIl09Il8iO3RbIu+6gCJdPSLYoSI7dFsi77qBIl09ItiiIjt0WyLvuoIiXT0i2KIiO3RbIu+6gyJdPSLYoyI7dFsi77qEIl09ItijIjt0WyLvuoUiXT0i2KQiO3RbIu+6hiJdPSLYpCI7dFsi77qHIl09ItilIjt0WyLvuogiXT0i2KUiO3RbIu+6iSJdPSLYpiI7dFsi77qKIl09ItimIjt0WyLvuosiXT0i2KYiO3RbIu+6jCJdPSLYpiI7dFsi77qNIl09ItinIjt0WyLvuo4iXT0i2KciO3RbIu+6jyJdPSLYqCI7dFsi77qQIl09ItioIjt0WyLvupEiXT0i2KgiO3RbIu+6kiJdPSLYqCI7dFsi77qTIl09ItipIjt0WyLvupQiXT0i2KkiO3RbIu+6lSJdPSLYqiI7dFsi77qWIl09ItiqIjt0WyLvupciXT0i2KoiO3RbIu+6mCJdPSLYqiI7dFsi77qZIl09ItirIjt0WyLvupoiXT0i2KsiO3RbIu+6myJdPSLYqyI7dFsi77qcIl09ItirIjt0WyLvup0iXT0i2KwiO3RbIu+6niJdPSLYrCI7dFsi77qfIl09ItisIjt0WyLvuqAiXT0i2KwiO3RbIu+6oSJdPSLYrSI7dFsi77qiIl09ItitIjt0WyLvuqMiXT0i2K0iO3RbIu+6pCJdPSLYrSI7dFsi77qlIl09ItiuIjt0WyLvuqYiXT0i2K4iO3RbIu+6pyJdPSLYriI7dFsi77qoIl09ItiuIjt0WyLvuqkiXT0i2K8iO3RbIu+6qiJdPSLYryI7dFsi77qrIl09ItiwIjt0WyLvuqwiXT0i2LAiO3RbIu+6rSJdPSLYsSI7dFsi77quIl09ItixIjt0WyLvuq8iXT0i2LIiO3RbIu+6sCJdPSLYsiI7dFsi77qxIl09ItizIjt0WyLvurIiXT0i2LMiO3RbIu+6syJdPSLYsyI7dFsi77q0Il09ItizIjt0WyLvurUiXT0i2LQiO3RbIu+6tiJdPSLYtCI7dFsi77q3Il09Iti0Ijt0WyLvurgiXT0i2LQiO3RbIu+6uSJdPSLYtSI7dFsi77q6Il09Iti1Ijt0WyLvursiXT0i2LUiO3RbIu+6vCJdPSLYtSI7dFsi77q9Il09Iti2Ijt0WyLvur4iXT0i2LYiO3RbIu+6vyJdPSLYtiI7dFsi77uAIl09Iti2Ijt0WyLvu4EiXT0i2LciO3RbIu+7giJdPSLYtyI7dFsi77uDIl09Iti3Ijt0WyLvu4QiXT0i2LciO3RbIu+7hSJdPSLYuCI7dFsi77uGIl09Iti4Ijt0WyLvu4ciXT0i2LgiO3RbIu+7iCJdPSLYuCI7dFsi77uJIl09Iti5Ijt0WyLvu4oiXT0i2LkiO3RbIu+7iyJdPSLYuSI7dFsi77uMIl09Iti5Ijt0WyLvu40iXT0i2LoiO3RbIu+7jiJdPSLYuiI7dFsi77uPIl09Iti6Ijt0WyLvu5AiXT0i2LoiO3RbIu+7kSJdPSLZgSI7dFsi77uSIl09ItmBIjt0WyLvu5MiXT0i2YEiO3RbIu+7lCJdPSLZgSI7dFsi77uVIl09ItmCIjt0WyLvu5YiXT0i2YIiO3RbIu+7lyJdPSLZgiI7dFsi77uYIl09ItmCIjt0WyLvu5kiXT0i2YMiO3RbIu+7miJdPSLZgyI7dFsi77ubIl09ItmDIjt0WyLvu5wiXT0i2YMiO3RbIu+7nSJdPSLZhCI7dFsi77ueIl09ItmEIjt0WyLvu58iXT0i2YQiO3RbIu+7oCJdPSLZhCI7dFsi77uhIl09ItmFIjt0WyLvu6IiXT0i2YUiO3RbIu+7oyJdPSLZhSI7dFsi77ukIl09ItmFIjt0WyLvu6UiXT0i2YYiO3RbIu+7piJdPSLZhiI7dFsi77unIl09ItmGIjt0WyLvu6giXT0i2YYiO3RbIu+7qSJdPSLZhyI7dFsi77uqIl09ItmHIjt0WyLvu6siXT0i2YciO3RbIu+7rCJdPSLZhyI7dFsi77utIl09ItmIIjt0WyLvu64iXT0i2YgiO3RbIu+7ryJdPSLZiSI7dFsi77uwIl09ItmJIjt0WyLvu7EiXT0i2YoiO3RbIu+7siJdPSLZiiI7dFsi77uzIl09ItmKIjt0WyLvu7QiXT0i2YoiO3RbIu+7tSJdPSLZhNiiIjt0WyLvu7YiXT0i2YTYoiI7dFsi77u3Il09ItmE2KMiO3RbIu+7uCJdPSLZhNijIjt0WyLvu7kiXT0i2YTYpSI7dFsi77u6Il09ItmE2KUiO3RbIu+7uyJdPSLZhNinIjt0WyLvu7wiXT0i2YTYpyJ9KSk7ci5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcz1mdW5jdGlvbiBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyh0KXtyZXR1cm4gdD49NjU1MjAmJnQ8PTY1NTM1PzA6dD49NjI5NzYmJnQ8PTYzNzQzP28oKVt0XXx8dDoxNzM9PT10PzQ1OnR9O3IucmV2ZXJzZUlmUnRsPWZ1bmN0aW9uIHJldmVyc2VJZlJ0bCh0KXt2YXIgcj10Lmxlbmd0aDtpZihyPD0xfHwhZnVuY3Rpb24gaXNSVExSYW5nZUZvcih0KXt2YXIgcj1jWzEzXTtyZXR1cm4gdD49ci5iZWdpbiYmdDxyLmVuZHx8dD49KHI9Y1sxMV0pLmJlZ2luJiZ0PHIuZW5kfSh0LmNoYXJDb2RlQXQoMCkpKXJldHVybiB0O2Zvcih2YXIgYT0iIixpPXItMTtpPj0wO2ktLSlhKz10W2ldO3JldHVybiBhfTtyLmdldFVuaWNvZGVSYW5nZUZvcj1mdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodCl7Zm9yKHZhciByPTAsYT1jLmxlbmd0aDtyPGE7cisrKXt2YXIgaT1jW3JdO2lmKHQ+PWkuYmVnaW4mJnQ8aS5lbmQpcmV0dXJuIHJ9cmV0dXJuLTF9O3IuZ2V0Tm9ybWFsaXplZFVuaWNvZGVzPWw7ci5nZXRVbmljb2RlRm9yR2x5cGg9ZnVuY3Rpb24gZ2V0VW5pY29kZUZvckdseXBoKHQscil7dmFyIGE9clt0XTtpZih2b2lkIDAhPT1hKXJldHVybiBhO2lmKCF0KXJldHVybi0xO2lmKCJ1Ij09PXRbMF0pe3ZhciBpLG89dC5sZW5ndGg7aWYoNz09PW8mJiJuIj09PXRbMV0mJiJpIj09PXRbMl0paT10LnN1YnN0cmluZygzKTtlbHNle2lmKCEobz49NSYmbzw9NykpcmV0dXJuLTE7aT10LnN1YnN0cmluZygxKX1pZihpPT09aS50b1VwcGVyQ2FzZSgpJiYoYT1wYXJzZUludChpLDE2KSk+PTApcmV0dXJuIGF9cmV0dXJuLTF9fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLkZvbnRSZW5kZXJlckZhY3Rvcnk9dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIyOCksYz1hKDIzMSksbD1hKDIzMCksdT1hKDIwOSk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfaW5oZXJpdHModCxyKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgciYmbnVsbCE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHImJnIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7ciYmX3NldFByb3RvdHlwZU9mKHQscil9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQscil7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LHIpe3QuX19wcm90b19fPXI7cmV0dXJuIHR9KSh0LHIpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcih0KXt2YXIgcj1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgYSxpPV9nZXRQcm90b3R5cGVPZih0KTtpZihyKXt2YXIgbz1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7YT1SZWZsZWN0LmNvbnN0cnVjdChpLGFyZ3VtZW50cyxvKX1lbHNlIGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsYSl9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQscil7cmV0dXJuIXJ8fCJvYmplY3QiIT09X3R5cGVvZihyKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHI/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOnJ9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxyKXtpZighKHQgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH12YXIgaD1mdW5jdGlvbiBGb250UmVuZGVyZXJGYWN0b3J5Q2xvc3VyZSgpe2Z1bmN0aW9uIGdldExvbmcodCxyKXtyZXR1cm4gdFtyXTw8MjR8dFtyKzFdPDwxNnx0W3IrMl08PDh8dFtyKzNdfWZ1bmN0aW9uIGdldFVzaG9ydCh0LHIpe3JldHVybiB0W3JdPDw4fHRbcisxXX1mdW5jdGlvbiBnZXRTdWJyb3V0aW5lQmlhcyh0KXt2YXIgcj10Lmxlbmd0aCxhPTMyNzY4O3I8MTI0MD9hPTEwNzpyPDMzOTAwJiYoYT0xMTMxKTtyZXR1cm4gYX1mdW5jdGlvbiBwYXJzZUNtYXAodCxyLGEpe3ZhciBvLGMsbCx1PTE9PT1nZXRVc2hvcnQodCxyKzIpP2dldExvbmcodCxyKzgpOmdldExvbmcodCxyKzE2KSxoPWdldFVzaG9ydCh0LHIrdSk7aWYoND09PWgpe2dldFVzaG9ydCh0LHIrdSsyKTt2YXIgZD1nZXRVc2hvcnQodCxyK3UrNik+PjE7Yz1yK3UrMTQ7bz1bXTtmb3IobD0wO2w8ZDtsKyssYys9MilvW2xdPXtlbmQ6Z2V0VXNob3J0KHQsYyl9O2MrPTI7Zm9yKGw9MDtsPGQ7bCsrLGMrPTIpb1tsXS5zdGFydD1nZXRVc2hvcnQodCxjKTtmb3IobD0wO2w8ZDtsKyssYys9MilvW2xdLmlkRGVsdGE9Z2V0VXNob3J0KHQsYyk7Zm9yKGw9MDtsPGQ7bCsrLGMrPTIpe3ZhciBwPWdldFVzaG9ydCh0LGMpO2lmKDAhPT1wKXtvW2xdLmlkcz1bXTtmb3IodmFyIG09MCxnPW9bbF0uZW5kLW9bbF0uc3RhcnQrMTttPGc7bSsrKXtvW2xdLmlkc1ttXT1nZXRVc2hvcnQodCxjK3ApO3ArPTJ9fX1yZXR1cm4gb31pZigxMj09PWgpe2dldExvbmcodCxyK3UrNCk7dmFyIHk9Z2V0TG9uZyh0LHIrdSsxMik7Yz1yK3UrMTY7bz1bXTtmb3IobD0wO2w8eTtsKyspe28ucHVzaCh7c3RhcnQ6Z2V0TG9uZyh0LGMpLGVuZDpnZXRMb25nKHQsYys0KSxpZERlbHRhOmdldExvbmcodCxjKzgpLWdldExvbmcodCxjKX0pO2MrPTEyfXJldHVybiBvfXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBjbWFwOiAiLmNvbmNhdChoKSl9ZnVuY3Rpb24gcGFyc2VDZmYodCxyLGEsaSl7dmFyIGM9bmV3IG8uQ0ZGUGFyc2VyKG5ldyB1LlN0cmVhbSh0LHIsYS1yKSx7fSxpKS5wYXJzZSgpO3JldHVybntnbHlwaHM6Yy5jaGFyU3RyaW5ncy5vYmplY3RzLHN1YnJzOmMudG9wRGljdC5wcml2YXRlRGljdCYmYy50b3BEaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgmJmMudG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHMsZ3N1YnJzOmMuZ2xvYmFsU3VickluZGV4JiZjLmdsb2JhbFN1YnJJbmRleC5vYmplY3RzLGlzQ0ZGQ0lERm9udDpjLmlzQ0lERm9udCxmZFNlbGVjdDpjLmZkU2VsZWN0LGZkQXJyYXk6Yy5mZEFycmF5fX1mdW5jdGlvbiBsb29rdXBDbWFwKHQscil7Zm9yKHZhciBhPXIuY29kZVBvaW50QXQoMCksaT0wLG89MCxjPXQubGVuZ3RoLTE7bzxjOyl7dmFyIGw9bytjKzE+PjE7YTx0W2xdLnN0YXJ0P2M9bC0xOm89bH10W29dLnN0YXJ0PD1hJiZhPD10W29dLmVuZCYmKGk9dFtvXS5pZERlbHRhKyh0W29dLmlkcz90W29dLmlkc1thLXRbb10uc3RhcnRdOmEpJjY1NTM1KTtyZXR1cm57Y2hhckNvZGU6YSxnbHlwaElkOml9fXZhciB0PVtdLHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBDb21waWxlZEZvbnQodCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ29tcGlsZWRGb250KTt0aGlzLmNvbnN0cnVjdG9yPT09Q29tcGlsZWRGb250JiYoMCxpLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29tcGlsZWRGb250LiIpO3RoaXMuZm9udE1hdHJpeD10O3RoaXMuY29tcGlsZWRHbHlwaHM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWQ9T2JqZWN0LmNyZWF0ZShudWxsKX1fY3JlYXRlQ2xhc3MoQ29tcGlsZWRGb250LFt7a2V5OiJnZXRQYXRoSnMiLHZhbHVlOmZ1bmN0aW9uIGdldFBhdGhKcyh0KXt2YXIgcj1sb29rdXBDbWFwKHRoaXMuY21hcCx0KSxhPXRoaXMuY29tcGlsZWRHbHlwaHNbci5nbHlwaElkXTtpZighYSl7YT10aGlzLmNvbXBpbGVHbHlwaCh0aGlzLmdseXBoc1tyLmdseXBoSWRdLHIuZ2x5cGhJZCk7dGhpcy5jb21waWxlZEdseXBoc1tyLmdseXBoSWRdPWF9dm9pZCAwPT09dGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW3IuY2hhckNvZGVdJiYodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW3IuY2hhckNvZGVdPXIuZ2x5cGhJZCk7cmV0dXJuIGF9fSx7a2V5OiJjb21waWxlR2x5cGgiLHZhbHVlOmZ1bmN0aW9uIGNvbXBpbGVHbHlwaChyLGEpe2lmKCFyfHwwPT09ci5sZW5ndGh8fDE0PT09clswXSlyZXR1cm4gdDt2YXIgbz10aGlzLmZvbnRNYXRyaXg7aWYodGhpcy5pc0NGRkNJREZvbnQpe3ZhciBjPXRoaXMuZmRTZWxlY3QuZ2V0RkRJbmRleChhKTtpZihjPj0wJiZjPHRoaXMuZmRBcnJheS5sZW5ndGgpe289dGhpcy5mZEFycmF5W2NdLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpfHxpLkZPTlRfSURFTlRJVFlfTUFUUklYfWVsc2UoMCxpLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKX12YXIgbD1bXTtsLnB1c2goe2NtZDoic2F2ZSJ9KTtsLnB1c2goe2NtZDoidHJhbnNmb3JtIixhcmdzOm8uc2xpY2UoKX0pO2wucHVzaCh7Y21kOiJzY2FsZSIsYXJnczpbInNpemUiLCItc2l6ZSJdfSk7dGhpcy5jb21waWxlR2x5cGhJbXBsKHIsbCxhKTtsLnB1c2goe2NtZDoicmVzdG9yZSJ9KTtyZXR1cm4gbH19LHtrZXk6ImNvbXBpbGVHbHlwaEltcGwiLHZhbHVlOmZ1bmN0aW9uIGNvbXBpbGVHbHlwaEltcGwoKXsoMCxpLnVucmVhY2hhYmxlKSgiQ2hpbGRyZW4gY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMuIil9fSx7a2V5OiJoYXNCdWlsdFBhdGgiLHZhbHVlOmZ1bmN0aW9uIGhhc0J1aWx0UGF0aCh0KXt2YXIgcj1sb29rdXBDbWFwKHRoaXMuY21hcCx0KTtyZXR1cm4gdm9pZCAwIT09dGhpcy5jb21waWxlZEdseXBoc1tyLmdseXBoSWRdJiZ2b2lkIDAhPT10aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbci5jaGFyQ29kZV19fV0pO3JldHVybiBDb21waWxlZEZvbnR9KCksYT1mdW5jdGlvbih0KXtfaW5oZXJpdHMoVHJ1ZVR5cGVDb21waWxlZCx0KTt2YXIgcj1fY3JlYXRlU3VwZXIoVHJ1ZVR5cGVDb21waWxlZCk7ZnVuY3Rpb24gVHJ1ZVR5cGVDb21waWxlZCh0LGEsaSl7dmFyIG87X2NsYXNzQ2FsbENoZWNrKHRoaXMsVHJ1ZVR5cGVDb21waWxlZCk7KG89ci5jYWxsKHRoaXMsaXx8WzQ4OGUtNiwwLDAsNDg4ZS02LDAsMF0pKS5nbHlwaHM9dDtvLmNtYXA9YTtyZXR1cm4gb31fY3JlYXRlQ2xhc3MoVHJ1ZVR5cGVDb21waWxlZCxbe2tleToiY29tcGlsZUdseXBoSW1wbCIsdmFsdWU6ZnVuY3Rpb24gY29tcGlsZUdseXBoSW1wbCh0LHIpeyFmdW5jdGlvbiBjb21waWxlR2x5Zih0LHIsYSl7ZnVuY3Rpb24gbW92ZVRvKHQsYSl7ci5wdXNoKHtjbWQ6Im1vdmVUbyIsYXJnczpbdCxhXX0pfWZ1bmN0aW9uIGxpbmVUbyh0LGEpe3IucHVzaCh7Y21kOiJsaW5lVG8iLGFyZ3M6W3QsYV19KX1mdW5jdGlvbiBxdWFkcmF0aWNDdXJ2ZVRvKHQsYSxpLG8pe3IucHVzaCh7Y21kOiJxdWFkcmF0aWNDdXJ2ZVRvIixhcmdzOlt0LGEsaSxvXX0pfXZhciBpLG89MCxjPSh0W29dPDwyNHx0W28rMV08PDE2KT4+MTYsbD0wLHU9MDtvKz0xMDtpZihjPDApZG97aT10W29dPDw4fHRbbysxXTt2YXIgaCxkLHA9dFtvKzJdPDw4fHRbbyszXTtvKz00O2lmKDEmaSl7aD0odFtvXTw8MjR8dFtvKzFdPDwxNik+PjE2O2Q9KHRbbysyXTw8MjR8dFtvKzNdPDwxNik+PjE2O28rPTR9ZWxzZXtoPXRbbysrXTtkPXRbbysrXX1pZigyJmkpe2w9aDt1PWR9ZWxzZXtsPTA7dT0wfXZhciBtPTEsZz0xLHk9MCxiPTA7aWYoOCZpKXttPWc9KHRbb108PDI0fHRbbysxXTw8MTYpLzEwNzM3NDE4MjQ7bys9Mn1lbHNlIGlmKDY0Jmkpe209KHRbb108PDI0fHRbbysxXTw8MTYpLzEwNzM3NDE4MjQ7Zz0odFtvKzJdPDwyNHx0W28rM108PDE2KS8xMDczNzQxODI0O28rPTR9ZWxzZSBpZigxMjgmaSl7bT0odFtvXTw8MjR8dFtvKzFdPDwxNikvMTA3Mzc0MTgyNDt5PSh0W28rMl08PDI0fHRbbyszXTw8MTYpLzEwNzM3NDE4MjQ7Yj0odFtvKzRdPDwyNHx0W28rNV08PDE2KS8xMDczNzQxODI0O2c9KHRbbys2XTw8MjR8dFtvKzddPDwxNikvMTA3Mzc0MTgyNDtvKz04fXZhciB2PWEuZ2x5cGhzW3BdO2lmKHYpe3IucHVzaCh7Y21kOiJzYXZlIn0pO3IucHVzaCh7Y21kOiJ0cmFuc2Zvcm0iLGFyZ3M6W20seSxiLGcsbCx1XX0pO2NvbXBpbGVHbHlmKHYscixhKTtyLnB1c2goe2NtZDoicmVzdG9yZSJ9KX19d2hpbGUoMzImaSk7ZWxzZXt2YXIgUyxrLHc9W107Zm9yKFM9MDtTPGM7UysrKXt3LnB1c2godFtvXTw8OHx0W28rMV0pO28rPTJ9bys9MisodFtvXTw8OHx0W28rMV0pO2Zvcih2YXIgQz13W3cubGVuZ3RoLTFdKzEsXz1bXTtfLmxlbmd0aDxDOyl7dmFyIHg9MTs4JihpPXRbbysrXSkmJih4Kz10W28rK10pO2Zvcig7eC0tID4wOylfLnB1c2goe2ZsYWdzOml9KX1mb3IoUz0wO1M8QztTKyspe3N3aXRjaCgxOCZfW1NdLmZsYWdzKXtjYXNlIDA6bCs9KHRbb108PDI0fHRbbysxXTw8MTYpPj4xNjtvKz0yO2JyZWFrO2Nhc2UgMjpsLT10W28rK107YnJlYWs7Y2FzZSAxODpsKz10W28rK119X1tTXS54PWx9Zm9yKFM9MDtTPEM7UysrKXtzd2l0Y2goMzYmX1tTXS5mbGFncyl7Y2FzZSAwOnUrPSh0W29dPDwyNHx0W28rMV08PDE2KT4+MTY7bys9MjticmVhaztjYXNlIDQ6dS09dFtvKytdO2JyZWFrO2Nhc2UgMzY6dSs9dFtvKytdfV9bU10ueT11fXZhciBBPTA7Zm9yKG89MDtvPGM7bysrKXt2YXIgVD13W29dLFI9Xy5zbGljZShBLFQrMSk7aWYoMSZSWzBdLmZsYWdzKVIucHVzaChSWzBdKTtlbHNlIGlmKDEmUltSLmxlbmd0aC0xXS5mbGFncylSLnVuc2hpZnQoUltSLmxlbmd0aC0xXSk7ZWxzZXt2YXIgST17ZmxhZ3M6MSx4OihSWzBdLngrUltSLmxlbmd0aC0xXS54KS8yLHk6KFJbMF0ueStSW1IubGVuZ3RoLTFdLnkpLzJ9O1IudW5zaGlmdChJKTtSLnB1c2goSSl9bW92ZVRvKFJbMF0ueCxSWzBdLnkpO2ZvcihTPTEsaz1SLmxlbmd0aDtTPGs7UysrKWlmKDEmUltTXS5mbGFncylsaW5lVG8oUltTXS54LFJbU10ueSk7ZWxzZSBpZigxJlJbUysxXS5mbGFncyl7cXVhZHJhdGljQ3VydmVUbyhSW1NdLngsUltTXS55LFJbUysxXS54LFJbUysxXS55KTtTKyt9ZWxzZSBxdWFkcmF0aWNDdXJ2ZVRvKFJbU10ueCxSW1NdLnksKFJbU10ueCtSW1MrMV0ueCkvMiwoUltTXS55K1JbUysxXS55KS8yKTtBPVQrMX19fSh0LHIsdGhpcyl9fV0pO3JldHVybiBUcnVlVHlwZUNvbXBpbGVkfShyKSxoPWZ1bmN0aW9uKHQpe19pbmhlcml0cyhUeXBlMkNvbXBpbGVkLHQpO3ZhciByPV9jcmVhdGVTdXBlcihUeXBlMkNvbXBpbGVkKTtmdW5jdGlvbiBUeXBlMkNvbXBpbGVkKHQsYSxpLG8pe3ZhciBsO19jbGFzc0NhbGxDaGVjayh0aGlzLFR5cGUyQ29tcGlsZWQpOyhsPXIuY2FsbCh0aGlzLGl8fFsuMDAxLDAsMCwuMDAxLDAsMF0pKS5nbHlwaHM9dC5nbHlwaHM7bC5nc3VicnM9dC5nc3VicnN8fFtdO2wuc3VicnM9dC5zdWJyc3x8W107bC5jbWFwPWE7bC5nbHlwaE5hbWVNYXA9b3x8KDAsYy5nZXRHbHlwaHNVbmljb2RlKSgpO2wuZ3N1YnJzQmlhcz1nZXRTdWJyb3V0aW5lQmlhcyhsLmdzdWJycyk7bC5zdWJyc0JpYXM9Z2V0U3Vicm91dGluZUJpYXMobC5zdWJycyk7bC5pc0NGRkNJREZvbnQ9dC5pc0NGRkNJREZvbnQ7bC5mZFNlbGVjdD10LmZkU2VsZWN0O2wuZmRBcnJheT10LmZkQXJyYXk7cmV0dXJuIGx9X2NyZWF0ZUNsYXNzKFR5cGUyQ29tcGlsZWQsW3trZXk6ImNvbXBpbGVHbHlwaEltcGwiLHZhbHVlOmZ1bmN0aW9uIGNvbXBpbGVHbHlwaEltcGwodCxyLGEpeyFmdW5jdGlvbiBjb21waWxlQ2hhclN0cmluZyh0LHIsYSxvKXtmdW5jdGlvbiBtb3ZlVG8odCxhKXtyLnB1c2goe2NtZDoibW92ZVRvIixhcmdzOlt0LGFdfSl9ZnVuY3Rpb24gbGluZVRvKHQsYSl7ci5wdXNoKHtjbWQ6ImxpbmVUbyIsYXJnczpbdCxhXX0pfWZ1bmN0aW9uIGJlemllckN1cnZlVG8odCxhLGksbyxjLGwpe3IucHVzaCh7Y21kOiJiZXppZXJDdXJ2ZVRvIixhcmdzOlt0LGEsaSxvLGMsbF19KX12YXIgYz1bXSx1PTAsaD0wLGQ9MDshZnVuY3Rpb24gcGFyc2UodCl7Zm9yKHZhciBwPTA7cDx0Lmxlbmd0aDspe3ZhciBtLGcseSxiLHYsUyxrLHcsQz0hMSxfPXRbcCsrXTtzd2l0Y2goXyl7Y2FzZSAxOmNhc2UgMzpkKz1jLmxlbmd0aD4+MTtDPSEwO2JyZWFrO2Nhc2UgNDpoKz1jLnBvcCgpO21vdmVUbyh1LGgpO0M9ITA7YnJlYWs7Y2FzZSA1OmZvcig7Yy5sZW5ndGg+MDspe3UrPWMuc2hpZnQoKTtoKz1jLnNoaWZ0KCk7bGluZVRvKHUsaCl9YnJlYWs7Y2FzZSA2OmZvcig7Yy5sZW5ndGg+MDspe2xpbmVUbyh1Kz1jLnNoaWZ0KCksaCk7aWYoMD09PWMubGVuZ3RoKWJyZWFrO2grPWMuc2hpZnQoKTtsaW5lVG8odSxoKX1icmVhaztjYXNlIDc6Zm9yKDtjLmxlbmd0aD4wOyl7aCs9Yy5zaGlmdCgpO2xpbmVUbyh1LGgpO2lmKDA9PT1jLmxlbmd0aClicmVhaztsaW5lVG8odSs9Yy5zaGlmdCgpLGgpfWJyZWFrO2Nhc2UgODpmb3IoO2MubGVuZ3RoPjA7KXttPXUrYy5zaGlmdCgpO3k9aCtjLnNoaWZ0KCk7Zz1tK2Muc2hpZnQoKTtiPXkrYy5zaGlmdCgpO3U9ZytjLnNoaWZ0KCk7aD1iK2Muc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKG0seSxnLGIsdSxoKX1icmVhaztjYXNlIDEwOms9Yy5wb3AoKTt3PW51bGw7aWYoYS5pc0NGRkNJREZvbnQpe3ZhciB4PWEuZmRTZWxlY3QuZ2V0RkRJbmRleChvKTtpZih4Pj0wJiZ4PGEuZmRBcnJheS5sZW5ndGgpe3ZhciBBPWEuZmRBcnJheVt4XSxUPXZvaWQgMDtBLnByaXZhdGVEaWN0JiZBLnByaXZhdGVEaWN0LnN1YnJzSW5kZXgmJihUPUEucHJpdmF0ZURpY3Quc3VicnNJbmRleC5vYmplY3RzKTtUJiYodz1UW2srPWdldFN1YnJvdXRpbmVCaWFzKFQpXSl9ZWxzZSgwLGkud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpfWVsc2Ugdz1hLnN1YnJzW2srYS5zdWJyc0JpYXNdO3cmJnBhcnNlKHcpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuO2Nhc2UgMTI6c3dpdGNoKF89dFtwKytdKXtjYXNlIDM0Omc9KG09dStjLnNoaWZ0KCkpK2Muc2hpZnQoKTt2PWgrYy5zaGlmdCgpO3U9ZytjLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyhtLGgsZyx2LHUsdik7Zz0obT11K2Muc2hpZnQoKSkrYy5zaGlmdCgpO3U9ZytjLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyhtLHYsZyxoLHUsaCk7YnJlYWs7Y2FzZSAzNTptPXUrYy5zaGlmdCgpO3k9aCtjLnNoaWZ0KCk7Zz1tK2Muc2hpZnQoKTtiPXkrYy5zaGlmdCgpO3U9ZytjLnNoaWZ0KCk7aD1iK2Muc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKG0seSxnLGIsdSxoKTttPXUrYy5zaGlmdCgpO3k9aCtjLnNoaWZ0KCk7Zz1tK2Muc2hpZnQoKTtiPXkrYy5zaGlmdCgpO3U9ZytjLnNoaWZ0KCk7aD1iK2Muc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKG0seSxnLGIsdSxoKTtjLnBvcCgpO2JyZWFrO2Nhc2UgMzY6YmV6aWVyQ3VydmVUbyhtPXUrYy5zaGlmdCgpLHY9aCtjLnNoaWZ0KCksZz1tK2Muc2hpZnQoKSxTPXYrYy5zaGlmdCgpLHU9ZytjLnNoaWZ0KCksUyk7YmV6aWVyQ3VydmVUbyhtPXUrYy5zaGlmdCgpLFMsZz1tK2Muc2hpZnQoKSxTK2Muc2hpZnQoKSx1PWcrYy5zaGlmdCgpLGgpO2JyZWFrO2Nhc2UgMzc6dmFyIFI9dSxJPWg7bT11K2Muc2hpZnQoKTt5PWgrYy5zaGlmdCgpO2c9bStjLnNoaWZ0KCk7Yj15K2Muc2hpZnQoKTt1PWcrYy5zaGlmdCgpO2g9YitjLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyhtLHksZyxiLHUsaCk7bT11K2Muc2hpZnQoKTt5PWgrYy5zaGlmdCgpO2c9bStjLnNoaWZ0KCk7Yj15K2Muc2hpZnQoKTt1PWc7aD1iO01hdGguYWJzKHUtUik+TWF0aC5hYnMoaC1JKT91Kz1jLnNoaWZ0KCk6aCs9Yy5zaGlmdCgpO2JlemllckN1cnZlVG8obSx5LGcsYix1LGgpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoInVua25vd24gb3BlcmF0b3I6IDEyICIuY29uY2F0KF8pKX1icmVhaztjYXNlIDE0OmlmKGMubGVuZ3RoPj00KXt2YXIgUD1jLnBvcCgpLE89Yy5wb3AoKTtoPWMucG9wKCk7dT1jLnBvcCgpO3IucHVzaCh7Y21kOiJzYXZlIn0pO3IucHVzaCh7Y21kOiJ0cmFuc2xhdGUiLGFyZ3M6W3UsaF19KTt2YXIgRT1sb29rdXBDbWFwKGEuY21hcCxTdHJpbmcuZnJvbUNoYXJDb2RlKGEuZ2x5cGhOYW1lTWFwW2wuU3RhbmRhcmRFbmNvZGluZ1tQXV0pKTtjb21waWxlQ2hhclN0cmluZyhhLmdseXBoc1tFLmdseXBoSWRdLHIsYSxFLmdseXBoSWQpO3IucHVzaCh7Y21kOiJyZXN0b3JlIn0pO0U9bG9va3VwQ21hcChhLmNtYXAsU3RyaW5nLmZyb21DaGFyQ29kZShhLmdseXBoTmFtZU1hcFtsLlN0YW5kYXJkRW5jb2RpbmdbT11dKSk7Y29tcGlsZUNoYXJTdHJpbmcoYS5nbHlwaHNbRS5nbHlwaElkXSxyLGEsRS5nbHlwaElkKX1yZXR1cm47Y2FzZSAxODpkKz1jLmxlbmd0aD4+MTtDPSEwO2JyZWFrO2Nhc2UgMTk6Y2FzZSAyMDpwKz0oZCs9Yy5sZW5ndGg+PjEpKzc+PjM7Qz0hMDticmVhaztjYXNlIDIxOmgrPWMucG9wKCk7bW92ZVRvKHUrPWMucG9wKCksaCk7Qz0hMDticmVhaztjYXNlIDIyOm1vdmVUbyh1Kz1jLnBvcCgpLGgpO0M9ITA7YnJlYWs7Y2FzZSAyMzpkKz1jLmxlbmd0aD4+MTtDPSEwO2JyZWFrO2Nhc2UgMjQ6Zm9yKDtjLmxlbmd0aD4yOyl7bT11K2Muc2hpZnQoKTt5PWgrYy5zaGlmdCgpO2c9bStjLnNoaWZ0KCk7Yj15K2Muc2hpZnQoKTt1PWcrYy5zaGlmdCgpO2g9YitjLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyhtLHksZyxiLHUsaCl9dSs9Yy5zaGlmdCgpO2grPWMuc2hpZnQoKTtsaW5lVG8odSxoKTticmVhaztjYXNlIDI1OmZvcig7Yy5sZW5ndGg+Njspe3UrPWMuc2hpZnQoKTtoKz1jLnNoaWZ0KCk7bGluZVRvKHUsaCl9bT11K2Muc2hpZnQoKTt5PWgrYy5zaGlmdCgpO2c9bStjLnNoaWZ0KCk7Yj15K2Muc2hpZnQoKTt1PWcrYy5zaGlmdCgpO2g9YitjLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyhtLHksZyxiLHUsaCk7YnJlYWs7Y2FzZSAyNjpjLmxlbmd0aCUyJiYodSs9Yy5zaGlmdCgpKTtmb3IoO2MubGVuZ3RoPjA7KXttPXU7eT1oK2Muc2hpZnQoKTtnPW0rYy5zaGlmdCgpO2I9eStjLnNoaWZ0KCk7dT1nO2g9YitjLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyhtLHksZyxiLHUsaCl9YnJlYWs7Y2FzZSAyNzpjLmxlbmd0aCUyJiYoaCs9Yy5zaGlmdCgpKTtmb3IoO2MubGVuZ3RoPjA7KWJlemllckN1cnZlVG8obT11K2Muc2hpZnQoKSx5PWgsZz1tK2Muc2hpZnQoKSxiPXkrYy5zaGlmdCgpLHU9ZytjLnNoaWZ0KCksaD1iKTticmVhaztjYXNlIDI4OmMucHVzaCgodFtwXTw8MjR8dFtwKzFdPDwxNik+PjE2KTtwKz0yO2JyZWFrO2Nhc2UgMjk6az1jLnBvcCgpK2EuZ3N1YnJzQmlhczsodz1hLmdzdWJyc1trXSkmJnBhcnNlKHcpO2JyZWFrO2Nhc2UgMzA6Zm9yKDtjLmxlbmd0aD4wOyl7bT11O3k9aCtjLnNoaWZ0KCk7Zz1tK2Muc2hpZnQoKTtiPXkrYy5zaGlmdCgpO3U9ZytjLnNoaWZ0KCk7aD1iKygxPT09Yy5sZW5ndGg/Yy5zaGlmdCgpOjApO2JlemllckN1cnZlVG8obSx5LGcsYix1LGgpO2lmKDA9PT1jLmxlbmd0aClicmVhazttPXUrYy5zaGlmdCgpO3k9aDtnPW0rYy5zaGlmdCgpO2I9eStjLnNoaWZ0KCk7aD1iK2Muc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKG0seSxnLGIsdT1nKygxPT09Yy5sZW5ndGg/Yy5zaGlmdCgpOjApLGgpfWJyZWFrO2Nhc2UgMzE6Zm9yKDtjLmxlbmd0aD4wOyl7bT11K2Muc2hpZnQoKTt5PWg7Zz1tK2Muc2hpZnQoKTtiPXkrYy5zaGlmdCgpO2g9YitjLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyhtLHksZyxiLHU9ZysoMT09PWMubGVuZ3RoP2Muc2hpZnQoKTowKSxoKTtpZigwPT09Yy5sZW5ndGgpYnJlYWs7bT11O3k9aCtjLnNoaWZ0KCk7Zz1tK2Muc2hpZnQoKTtiPXkrYy5zaGlmdCgpO3U9ZytjLnNoaWZ0KCk7aD1iKygxPT09Yy5sZW5ndGg/Yy5zaGlmdCgpOjApO2JlemllckN1cnZlVG8obSx5LGcsYix1LGgpfWJyZWFrO2RlZmF1bHQ6aWYoXzwzMil0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigidW5rbm93biBvcGVyYXRvcjogIi5jb25jYXQoXykpO2lmKF88MjQ3KWMucHVzaChfLTEzOSk7ZWxzZSBpZihfPDI1MSljLnB1c2goMjU2KihfLTI0NykrdFtwKytdKzEwOCk7ZWxzZSBpZihfPDI1NSljLnB1c2goMjU2Ki0oXy0yNTEpLXRbcCsrXS0xMDgpO2Vsc2V7Yy5wdXNoKCh0W3BdPDwyNHx0W3ArMV08PDE2fHRbcCsyXTw8OHx0W3ArM10pLzY1NTM2KTtwKz00fX1DJiYoYy5sZW5ndGg9MCl9fSh0KX0odCxyLHRoaXMsYSl9fV0pO3JldHVybiBUeXBlMkNvbXBpbGVkfShyKTtyZXR1cm57Y3JlYXRlOmZ1bmN0aW9uIEZvbnRSZW5kZXJlckZhY3RvcnlfY3JlYXRlKHQscil7Zm9yKHZhciBvLGMsbCx1LGQscCxtPW5ldyBVaW50OEFycmF5KHQuZGF0YSksZz1nZXRVc2hvcnQobSw0KSx5PTAsYj0xMjt5PGc7eSsrLGIrPTE2KXt2YXIgdj0oMCxpLmJ5dGVzVG9TdHJpbmcpKG0uc3ViYXJyYXkoYixiKzQpKSxTPWdldExvbmcobSxiKzgpLGs9Z2V0TG9uZyhtLGIrMTIpO3N3aXRjaCh2KXtjYXNlImNtYXAiOm89cGFyc2VDbWFwKG0sUyk7YnJlYWs7Y2FzZSJnbHlmIjpjPW0uc3ViYXJyYXkoUyxTK2spO2JyZWFrO2Nhc2UibG9jYSI6bD1tLnN1YmFycmF5KFMsUytrKTticmVhaztjYXNlImhlYWQiOnA9Z2V0VXNob3J0KG0sUysxOCk7ZD1nZXRVc2hvcnQobSxTKzUwKTticmVhaztjYXNlIkNGRiAiOnU9cGFyc2VDZmYobSxTLFMrayxyKX19aWYoYyl7dmFyIHc9cD9bMS9wLDAsMCwxL3AsMCwwXTp0LmZvbnRNYXRyaXg7cmV0dXJuIG5ldyBhKGZ1bmN0aW9uIHBhcnNlR2x5ZlRhYmxlKHQscixhKXt2YXIgaSxvO2lmKGEpe2k9NDtvPWZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlTG9uZyh0LHIpe3JldHVybiB0W3JdPDwyNHx0W3IrMV08PDE2fHRbcisyXTw8OHx0W3IrM119fWVsc2V7aT0yO289ZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGUodCxyKXtyZXR1cm4gdFtyXTw8OXx0W3IrMV08PDF9fWZvcih2YXIgYz1bXSxsPW8ociwwKSx1PWk7dTxyLmxlbmd0aDt1Kz1pKXt2YXIgaD1vKHIsdSk7Yy5wdXNoKHQuc3ViYXJyYXkobCxoKSk7bD1ofXJldHVybiBjfShjLGwsZCksbyx3KX1yZXR1cm4gbmV3IGgodSxvLHQuZm9udE1hdHJpeCx0LmdseXBoTmFtZU1hcCl9fX0oKTtyLkZvbnRSZW5kZXJlckZhY3Rvcnk9aH0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5UeXBlMVBhcnNlcj12b2lkIDA7dmFyIGk9YSgyMzApLG89YSgyMDUpLGM9YSgyMDkpLGw9YSg1KSx1PWZ1bmN0aW9uIFR5cGUxQ2hhclN0cmluZ0Nsb3N1cmUoKXt2YXIgdD1bNF0scj1bNV0sYT1bNl0saT1bN10sbz1bOF0sYz1bMTIsMzVdLHU9WzE0XSxoPVsyMV0sZD1bMjJdLHA9WzMwXSxtPVszMV07ZnVuY3Rpb24gVHlwZTFDaGFyU3RyaW5nKCl7dGhpcy53aWR0aD0wO3RoaXMubHNiPTA7dGhpcy5mbGV4aW5nPSExO3RoaXMub3V0cHV0PVtdO3RoaXMuc3RhY2s9W119VHlwZTFDaGFyU3RyaW5nLnByb3RvdHlwZT17Y29udmVydDpmdW5jdGlvbiBUeXBlMUNoYXJTdHJpbmdfY29udmVydChnLHksYil7Zm9yKHZhciB2LFMsayx3PWcubGVuZ3RoLEM9ITEsXz0wO188dztfKyspe3ZhciB4PWdbX107aWYoeDwzMil7MTI9PT14JiYoeD0oeDw8OCkrZ1srK19dKTtzd2l0Y2goeCl7Y2FzZSAxOmNhc2UgMzp0aGlzLnN0YWNrPVtdO2JyZWFrO2Nhc2UgNDppZih0aGlzLmZsZXhpbmcpe2lmKHRoaXMuc3RhY2subGVuZ3RoPDEpe0M9ITA7YnJlYWt9dmFyIEE9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnN0YWNrLnB1c2goMCxBKTticmVha31DPXRoaXMuZXhlY3V0ZUNvbW1hbmQoMSx0KTticmVhaztjYXNlIDU6Qz10aGlzLmV4ZWN1dGVDb21tYW5kKDIscik7YnJlYWs7Y2FzZSA2OkM9dGhpcy5leGVjdXRlQ29tbWFuZCgxLGEpO2JyZWFrO2Nhc2UgNzpDPXRoaXMuZXhlY3V0ZUNvbW1hbmQoMSxpKTticmVhaztjYXNlIDg6Qz10aGlzLmV4ZWN1dGVDb21tYW5kKDYsbyk7YnJlYWs7Y2FzZSA5OnRoaXMuc3RhY2s9W107YnJlYWs7Y2FzZSAxMDppZih0aGlzLnN0YWNrLmxlbmd0aDwxKXtDPSEwO2JyZWFrfWlmKCF5W2s9dGhpcy5zdGFjay5wb3AoKV0pe0M9ITA7YnJlYWt9Qz10aGlzLmNvbnZlcnQoeVtrXSx5LGIpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuIEM7Y2FzZSAxMzppZih0aGlzLnN0YWNrLmxlbmd0aDwyKXtDPSEwO2JyZWFrfXY9dGhpcy5zdGFjay5wb3AoKTtTPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5sc2I9Uzt0aGlzLndpZHRoPXY7dGhpcy5zdGFjay5wdXNoKHYsUyk7Qz10aGlzLmV4ZWN1dGVDb21tYW5kKDIsZCk7YnJlYWs7Y2FzZSAxNDp0aGlzLm91dHB1dC5wdXNoKHVbMF0pO2JyZWFrO2Nhc2UgMjE6aWYodGhpcy5mbGV4aW5nKWJyZWFrO0M9dGhpcy5leGVjdXRlQ29tbWFuZCgyLGgpO2JyZWFrO2Nhc2UgMjI6aWYodGhpcy5mbGV4aW5nKXt0aGlzLnN0YWNrLnB1c2goMCk7YnJlYWt9Qz10aGlzLmV4ZWN1dGVDb21tYW5kKDEsZCk7YnJlYWs7Y2FzZSAzMDpDPXRoaXMuZXhlY3V0ZUNvbW1hbmQoNCxwKTticmVhaztjYXNlIDMxOkM9dGhpcy5leGVjdXRlQ29tbWFuZCg0LG0pO2JyZWFrO2Nhc2UgMzA3MjpjYXNlIDMwNzM6Y2FzZSAzMDc0OnRoaXMuc3RhY2s9W107YnJlYWs7Y2FzZSAzMDc4OmlmKGIpe3ZhciBUPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtNV07dGhpcy5zZWFjPXRoaXMuc3RhY2suc3BsaWNlKC00LDQpO3RoaXMuc2VhY1swXSs9dGhpcy5sc2ItVDtDPXRoaXMuZXhlY3V0ZUNvbW1hbmQoMCx1KX1lbHNlIEM9dGhpcy5leGVjdXRlQ29tbWFuZCg0LHUpO2JyZWFrO2Nhc2UgMzA3OTppZih0aGlzLnN0YWNrLmxlbmd0aDw0KXtDPSEwO2JyZWFrfXRoaXMuc3RhY2sucG9wKCk7dj10aGlzLnN0YWNrLnBvcCgpO3ZhciBSPXRoaXMuc3RhY2sucG9wKCk7Uz10aGlzLnN0YWNrLnBvcCgpO3RoaXMubHNiPVM7dGhpcy53aWR0aD12O3RoaXMuc3RhY2sucHVzaCh2LFMsUik7Qz10aGlzLmV4ZWN1dGVDb21tYW5kKDMsaCk7YnJlYWs7Y2FzZSAzMDg0OmlmKHRoaXMuc3RhY2subGVuZ3RoPDIpe0M9ITA7YnJlYWt9dmFyIEk9dGhpcy5zdGFjay5wb3AoKSxQPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5zdGFjay5wdXNoKFAvSSk7YnJlYWs7Y2FzZSAzMDg4OmlmKHRoaXMuc3RhY2subGVuZ3RoPDIpe0M9ITA7YnJlYWt9az10aGlzLnN0YWNrLnBvcCgpO3ZhciBPPXRoaXMuc3RhY2sucG9wKCk7aWYoMD09PWsmJjM9PT1PKXt2YXIgRT10aGlzLnN0YWNrLnNwbGljZSh0aGlzLnN0YWNrLmxlbmd0aC0xNywxNyk7dGhpcy5zdGFjay5wdXNoKEVbMl0rRVswXSxFWzNdK0VbMV0sRVs0XSxFWzVdLEVbNl0sRVs3XSxFWzhdLEVbOV0sRVsxMF0sRVsxMV0sRVsxMl0sRVsxM10sRVsxNF0pO0M9dGhpcy5leGVjdXRlQ29tbWFuZCgxMyxjLCEwKTt0aGlzLmZsZXhpbmc9ITE7dGhpcy5zdGFjay5wdXNoKEVbMTVdLEVbMTZdKX1lbHNlIDE9PT1rJiYwPT09TyYmKHRoaXMuZmxleGluZz0hMCk7YnJlYWs7Y2FzZSAzMDg5OmJyZWFrO2Nhc2UgMzEwNTp0aGlzLnN0YWNrPVtdO2JyZWFrO2RlZmF1bHQ6KDAsbC53YXJuKSgnVW5rbm93biB0eXBlIDEgY2hhcnN0cmluZyBjb21tYW5kIG9mICInK3grJyInKX1pZihDKWJyZWFrfWVsc2V7eDw9MjQ2P3gtPTEzOTp4PXg8PTI1MD8yNTYqKHgtMjQ3KStnWysrX10rMTA4Ong8PTI1ND8tMjU2Kih4LTI1MSktZ1srK19dLTEwODooMjU1JmdbKytfXSk8PDI0fCgyNTUmZ1srK19dKTw8MTZ8KDI1NSZnWysrX10pPDw4fCgyNTUmZ1srK19dKTw8MDt0aGlzLnN0YWNrLnB1c2goeCl9fXJldHVybiBDfSxleGVjdXRlQ29tbWFuZDpmdW5jdGlvbiBleGVjdXRlQ29tbWFuZCh0LHIsYSl7dmFyIGk9dGhpcy5zdGFjay5sZW5ndGg7aWYodD5pKXJldHVybiEwO2Zvcih2YXIgbz1pLXQsYz1vO2M8aTtjKyspe3ZhciBsPXRoaXMuc3RhY2tbY107aWYoTnVtYmVyLmlzSW50ZWdlcihsKSl0aGlzLm91dHB1dC5wdXNoKDI4LGw+PjgmMjU1LDI1NSZsKTtlbHNle2w9NjU1MzYqbHwwO3RoaXMub3V0cHV0LnB1c2goMjU1LGw+PjI0JjI1NSxsPj4xNiYyNTUsbD4+OCYyNTUsMjU1JmwpfX10aGlzLm91dHB1dC5wdXNoLmFwcGx5KHRoaXMub3V0cHV0LHIpO2E/dGhpcy5zdGFjay5zcGxpY2Uobyx0KTp0aGlzLnN0YWNrLmxlbmd0aD0wO3JldHVybiExfX07cmV0dXJuIFR5cGUxQ2hhclN0cmluZ30oKSxoPWZ1bmN0aW9uIFR5cGUxUGFyc2VyQ2xvc3VyZSgpe2Z1bmN0aW9uIGlzSGV4RGlnaXQodCl7cmV0dXJuIHQ+PTQ4JiZ0PD01N3x8dD49NjUmJnQ8PTcwfHx0Pj05NyYmdDw9MTAyfWZ1bmN0aW9uIGRlY3J5cHQodCxyLGEpe2lmKGE+PXQubGVuZ3RoKXJldHVybiBuZXcgVWludDhBcnJheSgwKTt2YXIgaSxvLGM9MHxyO2ZvcihpPTA7aTxhO2krKyljPTUyODQ1Kih0W2ldK2MpKzIyNzE5JjY1NTM1O3ZhciBsPXQubGVuZ3RoLWEsdT1uZXcgVWludDhBcnJheShsKTtmb3IoaT1hLG89MDtvPGw7aSsrLG8rKyl7dmFyIGg9dFtpXTt1W29dPWheYz4+ODtjPTUyODQ1KihoK2MpKzIyNzE5JjY1NTM1fXJldHVybiB1fWZ1bmN0aW9uIGlzU3BlY2lhbCh0KXtyZXR1cm4gNDc9PT10fHw5MT09PXR8fDkzPT09dHx8MTIzPT09dHx8MTI1PT09dHx8NDA9PT10fHw0MT09PXR9ZnVuY3Rpb24gVHlwZTFQYXJzZXIodCxyLGEpe2lmKHIpe3ZhciBpPXQuZ2V0Qnl0ZXMoKSxsPSEoKGlzSGV4RGlnaXQoaVswXSl8fCgwLG8uaXNXaGl0ZVNwYWNlKShpWzBdKSkmJmlzSGV4RGlnaXQoaVsxXSkmJmlzSGV4RGlnaXQoaVsyXSkmJmlzSGV4RGlnaXQoaVszXSkmJmlzSGV4RGlnaXQoaVs0XSkmJmlzSGV4RGlnaXQoaVs1XSkmJmlzSGV4RGlnaXQoaVs2XSkmJmlzSGV4RGlnaXQoaVs3XSkpO3Q9bmV3IGMuU3RyZWFtKGw/ZGVjcnlwdChpLDU1NjY1LDQpOmZ1bmN0aW9uIGRlY3J5cHRBc2NpaSh0LHIsYSl7dmFyIGksbyxjPTB8cixsPXQubGVuZ3RoLHU9bmV3IFVpbnQ4QXJyYXkobD4+PjEpO2ZvcihpPTAsbz0wO2k8bDtpKyspe3ZhciBoPXRbaV07aWYoaXNIZXhEaWdpdChoKSl7aSsrO2Zvcih2YXIgZDtpPGwmJiFpc0hleERpZ2l0KGQ9dFtpXSk7KWkrKztpZihpPGwpe3ZhciBwPXBhcnNlSW50KFN0cmluZy5mcm9tQ2hhckNvZGUoaCxkKSwxNik7dVtvKytdPXBeYz4+ODtjPTUyODQ1KihwK2MpKzIyNzE5JjY1NTM1fX19cmV0dXJuIHUuc2xpY2UoYSxvKX0oaSw1NTY2NSw0KSl9dGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkPSEhYTt0aGlzLnN0cmVhbT10O3RoaXMubmV4dENoYXIoKX1UeXBlMVBhcnNlci5wcm90b3R5cGU9e3JlYWROdW1iZXJBcnJheTpmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkTnVtYmVyQXJyYXkoKXt0aGlzLmdldFRva2VuKCk7Zm9yKHZhciB0PVtdOzspe3ZhciByPXRoaXMuZ2V0VG9rZW4oKTtpZihudWxsPT09cnx8Il0iPT09cnx8In0iPT09cilicmVhazt0LnB1c2gocGFyc2VGbG9hdChyfHwwKSl9cmV0dXJuIHR9LHJlYWROdW1iZXI6ZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZE51bWJlcigpe3ZhciB0PXRoaXMuZ2V0VG9rZW4oKTtyZXR1cm4gcGFyc2VGbG9hdCh0fHwwKX0scmVhZEludDpmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkSW50KCl7dmFyIHQ9dGhpcy5nZXRUb2tlbigpO3JldHVybiAwfHBhcnNlSW50KHR8fDAsMTApfSxyZWFkQm9vbGVhbjpmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkQm9vbGVhbigpe3JldHVybiJ0cnVlIj09PXRoaXMuZ2V0VG9rZW4oKT8xOjB9LG5leHRDaGFyOmZ1bmN0aW9uIFR5cGUxX25leHRDaGFyKCl7cmV0dXJuIHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfSxnZXRUb2tlbjpmdW5jdGlvbiBUeXBlMVBhcnNlcl9nZXRUb2tlbigpe2Zvcih2YXIgdD0hMSxyPXRoaXMuY3VycmVudENoYXI7Oyl7aWYoLTE9PT1yKXJldHVybiBudWxsO2lmKHQpMTAhPT1yJiYxMyE9PXJ8fCh0PSExKTtlbHNlIGlmKDM3PT09cil0PSEwO2Vsc2UgaWYoISgwLG8uaXNXaGl0ZVNwYWNlKShyKSlicmVhaztyPXRoaXMubmV4dENoYXIoKX1pZihpc1NwZWNpYWwocikpe3RoaXMubmV4dENoYXIoKTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShyKX12YXIgYT0iIjtkb3thKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpO3I9dGhpcy5uZXh0Q2hhcigpfXdoaWxlKHI+PTAmJiEoMCxvLmlzV2hpdGVTcGFjZSkocikmJiFpc1NwZWNpYWwocikpO3JldHVybiBhfSxyZWFkQ2hhclN0cmluZ3M6ZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZENoYXJTdHJpbmdzKHQscil7cmV0dXJuLTE9PT1yP3Q6ZGVjcnlwdCh0LDQzMzAscil9LGV4dHJhY3RGb250UHJvZ3JhbTpmdW5jdGlvbiBUeXBlMVBhcnNlcl9leHRyYWN0Rm9udFByb2dyYW0odCl7dmFyIHI9dGhpcy5zdHJlYW0sYT1bXSxpPVtdLG89T2JqZWN0LmNyZWF0ZShudWxsKTtvLmxlbklWPTQ7Zm9yKHZhciBjLGwsaCxkLHAsbT17c3VicnM6W10sY2hhcnN0cmluZ3M6W10scHJvcGVydGllczp7cHJpdmF0ZURhdGE6b319O251bGwhPT0oYz10aGlzLmdldFRva2VuKCkpOylpZigiLyI9PT1jKXN3aXRjaChjPXRoaXMuZ2V0VG9rZW4oKSl7Y2FzZSJDaGFyU3RyaW5ncyI6dGhpcy5nZXRUb2tlbigpO3RoaXMuZ2V0VG9rZW4oKTt0aGlzLmdldFRva2VuKCk7dGhpcy5nZXRUb2tlbigpO2Zvcig7bnVsbCE9PShjPXRoaXMuZ2V0VG9rZW4oKSkmJiJlbmQiIT09YzspaWYoIi8iPT09Yyl7dmFyIGc9dGhpcy5nZXRUb2tlbigpO2w9dGhpcy5yZWFkSW50KCk7dGhpcy5nZXRUb2tlbigpO2g9bD4wP3IuZ2V0Qnl0ZXMobCk6bmV3IFVpbnQ4QXJyYXkoMCk7ZD1tLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7cD10aGlzLnJlYWRDaGFyU3RyaW5ncyhoLGQpO3RoaXMubmV4dENoYXIoKTsibm9hY2Nlc3MiPT09KGM9dGhpcy5nZXRUb2tlbigpKSYmdGhpcy5nZXRUb2tlbigpO2kucHVzaCh7Z2x5cGg6ZyxlbmNvZGVkOnB9KX1icmVhaztjYXNlIlN1YnJzIjp0aGlzLnJlYWRJbnQoKTt0aGlzLmdldFRva2VuKCk7Zm9yKDsiZHVwIj09PXRoaXMuZ2V0VG9rZW4oKTspe3ZhciB5PXRoaXMucmVhZEludCgpO2w9dGhpcy5yZWFkSW50KCk7dGhpcy5nZXRUb2tlbigpO2g9bD4wP3IuZ2V0Qnl0ZXMobCk6bmV3IFVpbnQ4QXJyYXkoMCk7ZD1tLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7cD10aGlzLnJlYWRDaGFyU3RyaW5ncyhoLGQpO3RoaXMubmV4dENoYXIoKTsibm9hY2Nlc3MiPT09KGM9dGhpcy5nZXRUb2tlbigpKSYmdGhpcy5nZXRUb2tlbigpO2FbeV09cH1icmVhaztjYXNlIkJsdWVWYWx1ZXMiOmNhc2UiT3RoZXJCbHVlcyI6Y2FzZSJGYW1pbHlCbHVlcyI6Y2FzZSJGYW1pbHlPdGhlckJsdWVzIjp2YXIgYj10aGlzLnJlYWROdW1iZXJBcnJheSgpO2IubGVuZ3RoPjAmJmIubGVuZ3RoLDA7YnJlYWs7Y2FzZSJTdGVtU25hcEgiOmNhc2UiU3RlbVNuYXBWIjptLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbY109dGhpcy5yZWFkTnVtYmVyQXJyYXkoKTticmVhaztjYXNlIlN0ZEhXIjpjYXNlIlN0ZFZXIjptLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbY109dGhpcy5yZWFkTnVtYmVyQXJyYXkoKVswXTticmVhaztjYXNlIkJsdWVTaGlmdCI6Y2FzZSJsZW5JViI6Y2FzZSJCbHVlRnV6eiI6Y2FzZSJCbHVlU2NhbGUiOmNhc2UiTGFuZ3VhZ2VHcm91cCI6Y2FzZSJFeHBhbnNpb25GYWN0b3IiOm0ucHJvcGVydGllcy5wcml2YXRlRGF0YVtjXT10aGlzLnJlYWROdW1iZXIoKTticmVhaztjYXNlIkZvcmNlQm9sZCI6bS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2NdPXRoaXMucmVhZEJvb2xlYW4oKX1mb3IodmFyIHY9MDt2PGkubGVuZ3RoO3YrKyl7Zz1pW3ZdLmdseXBoO3A9aVt2XS5lbmNvZGVkO3ZhciBTPW5ldyB1LGs9Uy5jb252ZXJ0KHAsYSx0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQpLHc9Uy5vdXRwdXQ7ayYmKHc9WzE0XSk7dmFyIEM9e2dseXBoTmFtZTpnLGNoYXJzdHJpbmc6dyx3aWR0aDpTLndpZHRoLGxzYjpTLmxzYixzZWFjOlMuc2VhY307Ii5ub3RkZWYiPT09Zz9tLmNoYXJzdHJpbmdzLnVuc2hpZnQoQyk6bS5jaGFyc3RyaW5ncy5wdXNoKEMpO2lmKHQuYnVpbHRJbkVuY29kaW5nKXt2YXIgXz10LmJ1aWx0SW5FbmNvZGluZy5pbmRleE9mKGcpO18+LTEmJnZvaWQgMD09PXQud2lkdGhzW19dJiZfPj10LmZpcnN0Q2hhciYmXzw9dC5sYXN0Q2hhciYmKHQud2lkdGhzW19dPVMud2lkdGgpfX1yZXR1cm4gbX0sZXh0cmFjdEZvbnRIZWFkZXI6ZnVuY3Rpb24gVHlwZTFQYXJzZXJfZXh0cmFjdEZvbnRIZWFkZXIodCl7Zm9yKHZhciByO251bGwhPT0ocj10aGlzLmdldFRva2VuKCkpOylpZigiLyI9PT1yKXN3aXRjaChyPXRoaXMuZ2V0VG9rZW4oKSl7Y2FzZSJGb250TWF0cml4Ijp2YXIgYT10aGlzLnJlYWROdW1iZXJBcnJheSgpO3QuZm9udE1hdHJpeD1hO2JyZWFrO2Nhc2UiRW5jb2RpbmciOnZhciBvLGM9dGhpcy5nZXRUb2tlbigpO2lmKC9eXGQrJC8udGVzdChjKSl7bz1bXTt2YXIgbD0wfHBhcnNlSW50KGMsMTApO3RoaXMuZ2V0VG9rZW4oKTtmb3IodmFyIHU9MDt1PGw7dSsrKXtyPXRoaXMuZ2V0VG9rZW4oKTtmb3IoOyJkdXAiIT09ciYmImRlZiIhPT1yOylpZihudWxsPT09KHI9dGhpcy5nZXRUb2tlbigpKSlyZXR1cm47aWYoImRlZiI9PT1yKWJyZWFrO3ZhciBoPXRoaXMucmVhZEludCgpO3RoaXMuZ2V0VG9rZW4oKTt2YXIgZD10aGlzLmdldFRva2VuKCk7b1toXT1kO3RoaXMuZ2V0VG9rZW4oKX19ZWxzZSBvPSgwLGkuZ2V0RW5jb2RpbmcpKGMpO3QuYnVpbHRJbkVuY29kaW5nPW87YnJlYWs7Y2FzZSJGb250QkJveCI6dmFyIHA9dGhpcy5yZWFkTnVtYmVyQXJyYXkoKTt0LmFzY2VudD1NYXRoLm1heChwWzNdLHBbMV0pO3QuZGVzY2VudD1NYXRoLm1pbihwWzFdLHBbM10pO3QuYXNjZW50U2NhbGVkPSEwfX19O3JldHVybiBUeXBlMVBhcnNlcn0oKTtyLlR5cGUxUGFyc2VyPWh9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuZ2V0VGlsaW5nUGF0dGVybklSPWZ1bmN0aW9uIGdldFRpbGluZ1BhdHRlcm5JUih0LHIsYSl7dmFyIG89ci5nZXRBcnJheSgiTWF0cml4IiksYz1pLlV0aWwubm9ybWFsaXplUmVjdChyLmdldEFycmF5KCJCQm94IikpLGw9ci5nZXQoIlhTdGVwIiksdT1yLmdldCgiWVN0ZXAiKSxoPXIuZ2V0KCJQYWludFR5cGUiKSxkPXIuZ2V0KCJUaWxpbmdUeXBlIik7aWYoY1syXS1jWzBdPT0wfHxjWzNdLWNbMV09PTApdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9CQm94IGFycmF5OiBbIi5jb25jYXQoYywiXS4iKSk7cmV0dXJuWyJUaWxpbmdQYXR0ZXJuIixhLHQsbyxjLGwsdSxoLGRdfTtyLlBhdHRlcm49dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIyMCksYz1hKDIwMiksbD1hKDIwNSksdT0yLGg9MyxkPTQscD01LG09NixnPTcseT1mdW5jdGlvbiBQYXR0ZXJuQ2xvc3VyZSgpe2Z1bmN0aW9uIFBhdHRlcm4oKXsoMCxpLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIFBhdHRlcm4gY29uc3RydWN0b3IiKX1QYXR0ZXJuLnByb3RvdHlwZT17Z2V0UGF0dGVybjpmdW5jdGlvbiBQYXR0ZXJuX2dldFBhdHRlcm4odCl7KDAsaS51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBQYXR0ZXJuLmdldFN0eWxlOiAiLmNvbmNhdCh0KSl9fTtQYXR0ZXJuLnBhcnNlU2hhZGluZz1mdW5jdGlvbih0LHIsYSxvLHksdixTKXt2YXIgaz0oMCxjLmlzU3RyZWFtKSh0KT90LmRpY3Q6dCx3PWsuZ2V0KCJTaGFkaW5nVHlwZSIpO3RyeXtzd2l0Y2godyl7Y2FzZSB1OmNhc2UgaDpyZXR1cm4gbmV3IGIuUmFkaWFsQXhpYWwoayxyLGEsbyx2LFMpO2Nhc2UgZDpjYXNlIHA6Y2FzZSBtOmNhc2UgZzpyZXR1cm4gbmV3IGIuTWVzaCh0LHIsYSxvLHYsUyk7ZGVmYXVsdDp0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgU2hhZGluZ1R5cGU6ICIrdyl9fWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBsLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IHQ7eS5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLHtmZWF0dXJlSWQ6aS5VTlNVUFBPUlRFRF9GRUFUVVJFUy5zaGFkaW5nUGF0dGVybn0pOygwLGkud2FybikodCk7cmV0dXJuIG5ldyBiLkR1bW15fX07cmV0dXJuIFBhdHRlcm59KCk7ci5QYXR0ZXJuPXk7dmFyIGI9e1NNQUxMX05VTUJFUjoxZS02fTtiLlJhZGlhbEF4aWFsPWZ1bmN0aW9uIFJhZGlhbEF4aWFsQ2xvc3VyZSgpe2Z1bmN0aW9uIFJhZGlhbEF4aWFsKHQscixhLGMsbCx1KXt0aGlzLm1hdHJpeD1yO3RoaXMuY29vcmRzQXJyPXQuZ2V0QXJyYXkoIkNvb3JkcyIpO3RoaXMuc2hhZGluZ1R5cGU9dC5nZXQoIlNoYWRpbmdUeXBlIik7dGhpcy50eXBlPSJQYXR0ZXJuIjt2YXIgZD1vLkNvbG9yU3BhY2UucGFyc2Uoe2NzOnQuZ2V0UmF3KCJDb2xvclNwYWNlIil8fHQuZ2V0UmF3KCJDUyIpLHhyZWY6YSxyZXNvdXJjZXM6YyxwZGZGdW5jdGlvbkZhY3Rvcnk6bCxsb2NhbENvbG9yU3BhY2VDYWNoZTp1fSk7dGhpcy5jcz1kO3ZhciBwPXQuZ2V0QXJyYXkoIkJCb3giKTtBcnJheS5pc0FycmF5KHApJiY0PT09cC5sZW5ndGg/dGhpcy5iYm94PWkuVXRpbC5ub3JtYWxpemVSZWN0KHApOnRoaXMuYmJveD1udWxsO3ZhciBtPTAsZz0xO2lmKHQuaGFzKCJEb21haW4iKSl7dmFyIHk9dC5nZXRBcnJheSgiRG9tYWluIik7bT15WzBdO2c9eVsxXX12YXIgdj0hMSxTPSExO2lmKHQuaGFzKCJFeHRlbmQiKSl7dmFyIGs9dC5nZXRBcnJheSgiRXh0ZW5kIik7dj1rWzBdO1M9a1sxXX1pZighKHRoaXMuc2hhZGluZ1R5cGUhPT1ofHx2JiZTKSl7dmFyIHc9dGhpcy5jb29yZHNBcnJbMF0sQz10aGlzLmNvb3Jkc0FyclsxXSxfPXRoaXMuY29vcmRzQXJyWzJdLHg9dGhpcy5jb29yZHNBcnJbM10sQT10aGlzLmNvb3Jkc0Fycls0XSxUPXRoaXMuY29vcmRzQXJyWzVdLFI9TWF0aC5zcXJ0KCh3LXgpKih3LXgpKyhDLUEpKihDLUEpKTtfPD1UK1ImJlQ8PV8rUiYmKDAsaS53YXJuKSgiVW5zdXBwb3J0ZWQgcmFkaWFsIGdyYWRpZW50LiIpfXRoaXMuZXh0ZW5kU3RhcnQ9djt0aGlzLmV4dGVuZEVuZD1TO3ZhciBJPXQuZ2V0UmF3KCJGdW5jdGlvbiIpLFA9bC5jcmVhdGVGcm9tQXJyYXkoSSksTz0oZy1tKS8xMCxFPXRoaXMuY29sb3JTdG9wcz1bXTtpZihtPj1nfHxPPD0wKSgwLGkuaW5mbykoIkJhZCBzaGFkaW5nIGRvbWFpbi4iKTtlbHNle2Zvcih2YXIgQixEPW5ldyBGbG9hdDMyQXJyYXkoZC5udW1Db21wcyksTT1uZXcgRmxvYXQzMkFycmF5KDEpLEw9MDtMPD0xMDtMKyspe01bMF09bStMKk87UChNLDAsRCwwKTtCPWQuZ2V0UmdiKEQsMCk7dmFyIE49aS5VdGlsLm1ha2VDc3NSZ2IoQlswXSxCWzFdLEJbMl0pO0UucHVzaChbTC8xMCxOXSl9dmFyIFU9InRyYW5zcGFyZW50IjtpZih0LmhhcygiQmFja2dyb3VuZCIpKXtCPWQuZ2V0UmdiKHQuZ2V0KCJCYWNrZ3JvdW5kIiksMCk7VT1pLlV0aWwubWFrZUNzc1JnYihCWzBdLEJbMV0sQlsyXSl9aWYoIXYpe0UudW5zaGlmdChbMCxVXSk7RVsxXVswXSs9Yi5TTUFMTF9OVU1CRVJ9aWYoIVMpe0VbRS5sZW5ndGgtMV1bMF0tPWIuU01BTExfTlVNQkVSO0UucHVzaChbMSxVXSl9dGhpcy5jb2xvclN0b3BzPUV9fVJhZGlhbEF4aWFsLnByb3RvdHlwZT17Z2V0SVI6ZnVuY3Rpb24gUmFkaWFsQXhpYWxfZ2V0SVIoKXt2YXIgdCxyLGEsbyxjLGw9dGhpcy5jb29yZHNBcnIsZD10aGlzLnNoYWRpbmdUeXBlO2lmKGQ9PT11KXtyPVtsWzBdLGxbMV1dO2E9W2xbMl0sbFszXV07bz1udWxsO2M9bnVsbDt0PSJheGlhbCJ9ZWxzZSBpZihkPT09aCl7cj1bbFswXSxsWzFdXTthPVtsWzNdLGxbNF1dO289bFsyXTtjPWxbNV07dD0icmFkaWFsIn1lbHNlKDAsaS51bnJlYWNoYWJsZSkoImdldFBhdHRlcm4gdHlwZSB1bmtub3duOiAiLmNvbmNhdChkKSk7dmFyIHA9dGhpcy5tYXRyaXg7aWYocCl7cj1pLlV0aWwuYXBwbHlUcmFuc2Zvcm0ocixwKTthPWkuVXRpbC5hcHBseVRyYW5zZm9ybShhLHApO2lmKGQ9PT1oKXt2YXIgbT1pLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUocCk7byo9bVswXTtjKj1tWzFdfX1yZXR1cm5bIlJhZGlhbEF4aWFsIix0LHRoaXMuYmJveCx0aGlzLmNvbG9yU3RvcHMscixhLG8sY119fTtyZXR1cm4gUmFkaWFsQXhpYWx9KCk7Yi5NZXNoPWZ1bmN0aW9uIE1lc2hDbG9zdXJlKCl7ZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcih0LHIpe3RoaXMuc3RyZWFtPXQ7dGhpcy5jb250ZXh0PXI7dGhpcy5idWZmZXI9MDt0aGlzLmJ1ZmZlckxlbmd0aD0wO3ZhciBhPXIubnVtQ29tcHM7dGhpcy50bXBDb21wc0J1Zj1uZXcgRmxvYXQzMkFycmF5KGEpO3ZhciBpPXIuY29sb3JTcGFjZS5udW1Db21wczt0aGlzLnRtcENzQ29tcHNCdWY9ci5jb2xvckZuP25ldyBGbG9hdDMyQXJyYXkoaSk6dGhpcy50bXBDb21wc0J1Zn1NZXNoU3RyZWFtUmVhZGVyLnByb3RvdHlwZT17Z2V0IGhhc0RhdGEoKXtpZih0aGlzLnN0cmVhbS5lbmQpcmV0dXJuIHRoaXMuc3RyZWFtLnBvczx0aGlzLnN0cmVhbS5lbmQ7aWYodGhpcy5idWZmZXJMZW5ndGg+MClyZXR1cm4hMDt2YXIgdD10aGlzLnN0cmVhbS5nZXRCeXRlKCk7aWYodDwwKXJldHVybiExO3RoaXMuYnVmZmVyPXQ7dGhpcy5idWZmZXJMZW5ndGg9ODtyZXR1cm4hMH0scmVhZEJpdHM6ZnVuY3Rpb24gTWVzaFN0cmVhbVJlYWRlcl9yZWFkQml0cyh0KXt2YXIgcj10aGlzLmJ1ZmZlcixhPXRoaXMuYnVmZmVyTGVuZ3RoO2lmKDMyPT09dCl7aWYoMD09PWEpcmV0dXJuKHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8MjR8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpPDwxNnx0aGlzLnN0cmVhbS5nZXRCeXRlKCk8PDh8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKT4+PjA7cj1yPDwyNHx0aGlzLnN0cmVhbS5nZXRCeXRlKCk8PDE2fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8OHx0aGlzLnN0cmVhbS5nZXRCeXRlKCk7dmFyIGk9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO3RoaXMuYnVmZmVyPWkmKDE8PGEpLTE7cmV0dXJuKHI8PDgtYXwoMjU1JmkpPj5hKT4+PjB9aWYoOD09PXQmJjA9PT1hKXJldHVybiB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7Zm9yKDthPHQ7KXtyPXI8PDh8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO2ErPTh9YS09dDt0aGlzLmJ1ZmZlckxlbmd0aD1hO3RoaXMuYnVmZmVyPXImKDE8PGEpLTE7cmV0dXJuIHI+PmF9LGFsaWduOmZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfYWxpZ24oKXt0aGlzLmJ1ZmZlcj0wO3RoaXMuYnVmZmVyTGVuZ3RoPTB9LHJlYWRGbGFnOmZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZEZsYWcoKXtyZXR1cm4gdGhpcy5yZWFkQml0cyh0aGlzLmNvbnRleHQuYml0c1BlckZsYWcpfSxyZWFkQ29vcmRpbmF0ZTpmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRDb29yZGluYXRlKCl7dmFyIHQ9dGhpcy5jb250ZXh0LmJpdHNQZXJDb29yZGluYXRlLHI9dGhpcy5yZWFkQml0cyh0KSxhPXRoaXMucmVhZEJpdHModCksaT10aGlzLmNvbnRleHQuZGVjb2RlLG89dDwzMj8xLygoMTw8dCktMSk6Mi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDtyZXR1cm5bcipvKihpWzFdLWlbMF0pK2lbMF0sYSpvKihpWzNdLWlbMl0pK2lbMl1dfSxyZWFkQ29tcG9uZW50czpmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRDb21wb25lbnRzKCl7Zm9yKHZhciB0PXRoaXMuY29udGV4dC5udW1Db21wcyxyPXRoaXMuY29udGV4dC5iaXRzUGVyQ29tcG9uZW50LGE9cjwzMj8xLygoMTw8ciktMSk6Mi4zMjgzMDY0MzY1Mzg2OTYzZS0xMCxpPXRoaXMuY29udGV4dC5kZWNvZGUsbz10aGlzLnRtcENvbXBzQnVmLGM9MCxsPTQ7Yzx0O2MrKyxsKz0yKXt2YXIgdT10aGlzLnJlYWRCaXRzKHIpO29bY109dSphKihpW2wrMV0taVtsXSkraVtsXX12YXIgaD10aGlzLnRtcENzQ29tcHNCdWY7dGhpcy5jb250ZXh0LmNvbG9yRm4mJnRoaXMuY29udGV4dC5jb2xvckZuKG8sMCxoLDApO3JldHVybiB0aGlzLmNvbnRleHQuY29sb3JTcGFjZS5nZXRSZ2IoaCwwKX19O3ZhciB0PWZ1bmN0aW9uIGdldEJDbG9zdXJlKCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uIGdldEIocil7dFtyXXx8KHRbcl09ZnVuY3Rpb24gYnVpbGRCKHQpe2Zvcih2YXIgcj1bXSxhPTA7YTw9dDthKyspe3ZhciBpPWEvdCxvPTEtaTtyLnB1c2gobmV3IEZsb2F0MzJBcnJheShbbypvKm8sMyppKm8qbywzKmkqaSpvLGkqaSppXSkpfXJldHVybiByfShyKSk7cmV0dXJuIHRbcl19fSgpO2Z1bmN0aW9uIGJ1aWxkRmlndXJlRnJvbVBhdGNoKHIsYSl7dmFyIG89ci5maWd1cmVzW2FdOygwLGkuYXNzZXJ0KSgicGF0Y2giPT09by50eXBlLCJVbmV4cGVjdGVkIHBhdGNoIG1lc2ggZmlndXJlIik7dmFyIGM9ci5jb29yZHMsbD1yLmNvbG9ycyx1PW8uY29vcmRzLGg9by5jb2xvcnMsZD1NYXRoLm1pbihjW3VbMF1dWzBdLGNbdVszXV1bMF0sY1t1WzEyXV1bMF0sY1t1WzE1XV1bMF0pLHA9TWF0aC5taW4oY1t1WzBdXVsxXSxjW3VbM11dWzFdLGNbdVsxMl1dWzFdLGNbdVsxNV1dWzFdKSxtPU1hdGgubWF4KGNbdVswXV1bMF0sY1t1WzNdXVswXSxjW3VbMTJdXVswXSxjW3VbMTVdXVswXSksZz1NYXRoLm1heChjW3VbMF1dWzFdLGNbdVszXV1bMV0sY1t1WzEyXV1bMV0sY1t1WzE1XV1bMV0pLHk9TWF0aC5jZWlsKDIwKihtLWQpLyhyLmJvdW5kc1syXS1yLmJvdW5kc1swXSkpO3k9TWF0aC5tYXgoMyxNYXRoLm1pbigyMCx5KSk7dmFyIGI9TWF0aC5jZWlsKDIwKihnLXApLyhyLmJvdW5kc1szXS1yLmJvdW5kc1sxXSkpO2I9TWF0aC5tYXgoMyxNYXRoLm1pbigyMCxiKSk7Zm9yKHZhciB2PXkrMSxTPW5ldyBJbnQzMkFycmF5KChiKzEpKnYpLGs9bmV3IEludDMyQXJyYXkoKGIrMSkqdiksdz0wLEM9bmV3IFVpbnQ4QXJyYXkoMyksXz1uZXcgVWludDhBcnJheSgzKSx4PWxbaFswXV0sQT1sW2hbMV1dLFQ9bFtoWzJdXSxSPWxbaFszXV0sST10KGIpLFA9dCh5KSxPPTA7Tzw9YjtPKyspe0NbMF09KHhbMF0qKGItTykrVFswXSpPKS9ifDA7Q1sxXT0oeFsxXSooYi1PKStUWzFdKk8pL2J8MDtDWzJdPSh4WzJdKihiLU8pK1RbMl0qTykvYnwwO19bMF09KEFbMF0qKGItTykrUlswXSpPKS9ifDA7X1sxXT0oQVsxXSooYi1PKStSWzFdKk8pL2J8MDtfWzJdPShBWzJdKihiLU8pK1JbMl0qTykvYnwwO2Zvcih2YXIgRT0wO0U8PXk7RSsrLHcrKylpZigwIT09TyYmTyE9PWJ8fDAhPT1FJiZFIT09eSl7Zm9yKHZhciBCPTAsRD0wLE09MCxMPTA7TDw9MztMKyspZm9yKHZhciBOPTA7Tjw9MztOKyssTSsrKXt2YXIgVT1JW09dW0xdKlBbRV1bTl07Qis9Y1t1W01dXVswXSpVO0QrPWNbdVtNXV1bMV0qVX1TW3ddPWMubGVuZ3RoO2MucHVzaChbQixEXSk7a1t3XT1sLmxlbmd0aDt2YXIgaj1uZXcgVWludDhBcnJheSgzKTtqWzBdPShDWzBdKih5LUUpK19bMF0qRSkveXwwO2pbMV09KENbMV0qKHktRSkrX1sxXSpFKS95fDA7alsyXT0oQ1syXSooeS1FKStfWzJdKkUpL3l8MDtsLnB1c2goail9fVNbMF09dVswXTtrWzBdPWhbMF07U1t5XT11WzNdO2tbeV09aFsxXTtTW3YqYl09dVsxMl07a1t2KmJdPWhbMl07U1t2KmIreV09dVsxNV07a1t2KmIreV09aFszXTtyLmZpZ3VyZXNbYV09e3R5cGU6ImxhdHRpY2UiLGNvb3JkczpTLGNvbG9yczprLHZlcnRpY2VzUGVyUm93OnZ9fWZ1bmN0aW9uIHVwZGF0ZUJvdW5kcyh0KXtmb3IodmFyIHI9dC5jb29yZHNbMF1bMF0sYT10LmNvb3Jkc1swXVsxXSxpPXIsbz1hLGM9MSxsPXQuY29vcmRzLmxlbmd0aDtjPGw7YysrKXt2YXIgdT10LmNvb3Jkc1tjXVswXSxoPXQuY29vcmRzW2NdWzFdO3I9cj51P3U6cjthPWE+aD9oOmE7aT1pPHU/dTppO289bzxoP2g6b310LmJvdW5kcz1bcixhLGksb119ZnVuY3Rpb24gTWVzaCh0LHIsYSxsLHUsaCl7aWYoISgwLGMuaXNTdHJlYW0pKHQpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJNZXNoIGRhdGEgaXMgbm90IGEgc3RyZWFtIik7dmFyIHk9dC5kaWN0O3RoaXMubWF0cml4PXI7dGhpcy5zaGFkaW5nVHlwZT15LmdldCgiU2hhZGluZ1R5cGUiKTt0aGlzLnR5cGU9IlBhdHRlcm4iO3ZhciBiPXkuZ2V0QXJyYXkoIkJCb3giKTtBcnJheS5pc0FycmF5KGIpJiY0PT09Yi5sZW5ndGg/dGhpcy5iYm94PWkuVXRpbC5ub3JtYWxpemVSZWN0KGIpOnRoaXMuYmJveD1udWxsO3ZhciB2PW8uQ29sb3JTcGFjZS5wYXJzZSh7Y3M6eS5nZXRSYXcoIkNvbG9yU3BhY2UiKXx8eS5nZXRSYXcoIkNTIikseHJlZjphLHJlc291cmNlczpsLHBkZkZ1bmN0aW9uRmFjdG9yeTp1LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmh9KTt0aGlzLmNzPXY7dGhpcy5iYWNrZ3JvdW5kPXkuaGFzKCJCYWNrZ3JvdW5kIik/di5nZXRSZ2IoeS5nZXQoIkJhY2tncm91bmQiKSwwKTpudWxsO3ZhciBTPXkuZ2V0UmF3KCJGdW5jdGlvbiIpLGs9Uz91LmNyZWF0ZUZyb21BcnJheShTKTpudWxsO3RoaXMuY29vcmRzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMuZmlndXJlcz1bXTt2YXIgdz1uZXcgTWVzaFN0cmVhbVJlYWRlcih0LHtiaXRzUGVyQ29vcmRpbmF0ZTp5LmdldCgiQml0c1BlckNvb3JkaW5hdGUiKSxiaXRzUGVyQ29tcG9uZW50OnkuZ2V0KCJCaXRzUGVyQ29tcG9uZW50IiksYml0c1BlckZsYWc6eS5nZXQoIkJpdHNQZXJGbGFnIiksZGVjb2RlOnkuZ2V0QXJyYXkoIkRlY29kZSIpLGNvbG9yRm46ayxjb2xvclNwYWNlOnYsbnVtQ29tcHM6az8xOnYubnVtQ29tcHN9KSxDPSExO3N3aXRjaCh0aGlzLnNoYWRpbmdUeXBlKXtjYXNlIGQ6IWZ1bmN0aW9uIGRlY29kZVR5cGU0U2hhZGluZyh0LHIpe2Zvcih2YXIgYT10LmNvb3JkcyxvPXQuY29sb3JzLGM9W10sbD1bXSx1PTA7ci5oYXNEYXRhOyl7dmFyIGg9ci5yZWFkRmxhZygpLGQ9ci5yZWFkQ29vcmRpbmF0ZSgpLHA9ci5yZWFkQ29tcG9uZW50cygpO2lmKDA9PT11KXtpZighKDA8PWgmJmg8PTIpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU0IGZsYWciKTtzd2l0Y2goaCl7Y2FzZSAwOnU9MzticmVhaztjYXNlIDE6bC5wdXNoKGxbbC5sZW5ndGgtMl0sbFtsLmxlbmd0aC0xXSk7dT0xO2JyZWFrO2Nhc2UgMjpsLnB1c2gobFtsLmxlbmd0aC0zXSxsW2wubGVuZ3RoLTFdKTt1PTF9Yy5wdXNoKGgpfWwucHVzaChhLmxlbmd0aCk7YS5wdXNoKGQpO28ucHVzaChwKTt1LS07ci5hbGlnbigpfXQuZmlndXJlcy5wdXNoKHt0eXBlOiJ0cmlhbmdsZXMiLGNvb3JkczpuZXcgSW50MzJBcnJheShsKSxjb2xvcnM6bmV3IEludDMyQXJyYXkobCl9KX0odGhpcyx3KTticmVhaztjYXNlIHA6dmFyIF89MHx5LmdldCgiVmVydGljZXNQZXJSb3ciKTtpZihfPDIpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkludmFsaWQgVmVydGljZXNQZXJSb3ciKTshZnVuY3Rpb24gZGVjb2RlVHlwZTVTaGFkaW5nKHQscixhKXtmb3IodmFyIGk9dC5jb29yZHMsbz10LmNvbG9ycyxjPVtdO3IuaGFzRGF0YTspe3ZhciBsPXIucmVhZENvb3JkaW5hdGUoKSx1PXIucmVhZENvbXBvbmVudHMoKTtjLnB1c2goaS5sZW5ndGgpO2kucHVzaChsKTtvLnB1c2godSl9dC5maWd1cmVzLnB1c2goe3R5cGU6ImxhdHRpY2UiLGNvb3JkczpuZXcgSW50MzJBcnJheShjKSxjb2xvcnM6bmV3IEludDMyQXJyYXkoYyksdmVydGljZXNQZXJSb3c6YX0pfSh0aGlzLHcsXyk7YnJlYWs7Y2FzZSBtOiFmdW5jdGlvbiBkZWNvZGVUeXBlNlNoYWRpbmcodCxyKXtmb3IodmFyIGE9dC5jb29yZHMsbz10LmNvbG9ycyxjPW5ldyBJbnQzMkFycmF5KDE2KSxsPW5ldyBJbnQzMkFycmF5KDQpO3IuaGFzRGF0YTspe3ZhciB1LGgsZD1yLnJlYWRGbGFnKCk7aWYoISgwPD1kJiZkPD0zKSl0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNiBmbGFnIik7dmFyIHA9YS5sZW5ndGg7Zm9yKHU9MCxoPTAhPT1kPzg6MTI7dTxoO3UrKylhLnB1c2goci5yZWFkQ29vcmRpbmF0ZSgpKTt2YXIgbSxnLHksYix2PW8ubGVuZ3RoO2Zvcih1PTAsaD0wIT09ZD8yOjQ7dTxoO3UrKylvLnB1c2goci5yZWFkQ29tcG9uZW50cygpKTtzd2l0Y2goZCl7Y2FzZSAwOmNbMTJdPXArMztjWzEzXT1wKzQ7Y1sxNF09cCs1O2NbMTVdPXArNjtjWzhdPXArMjtjWzExXT1wKzc7Y1s0XT1wKzE7Y1s3XT1wKzg7Y1swXT1wO2NbMV09cCsxMTtjWzJdPXArMTA7Y1szXT1wKzk7bFsyXT12KzE7bFszXT12KzI7bFswXT12O2xbMV09diszO2JyZWFrO2Nhc2UgMTptPWNbMTJdO2c9Y1sxM107eT1jWzE0XTtiPWNbMTVdO2NbMTJdPWI7Y1sxM109cCswO2NbMTRdPXArMTtjWzE1XT1wKzI7Y1s4XT15O2NbMTFdPXArMztjWzRdPWc7Y1s3XT1wKzQ7Y1swXT1tO2NbMV09cCs3O2NbMl09cCs2O2NbM109cCs1O209bFsyXTtnPWxbM107bFsyXT1nO2xbM109djtsWzBdPW07bFsxXT12KzE7YnJlYWs7Y2FzZSAyOm09Y1sxNV07Zz1jWzExXTtjWzEyXT1jWzNdO2NbMTNdPXArMDtjWzE0XT1wKzE7Y1sxNV09cCsyO2NbOF09Y1s3XTtjWzExXT1wKzM7Y1s0XT1nO2NbN109cCs0O2NbMF09bTtjWzFdPXArNztjWzJdPXArNjtjWzNdPXArNTttPWxbM107bFsyXT1sWzFdO2xbM109djtsWzBdPW07bFsxXT12KzE7YnJlYWs7Y2FzZSAzOmNbMTJdPWNbMF07Y1sxM109cCswO2NbMTRdPXArMTtjWzE1XT1wKzI7Y1s4XT1jWzFdO2NbMTFdPXArMztjWzRdPWNbMl07Y1s3XT1wKzQ7Y1swXT1jWzNdO2NbMV09cCs3O2NbMl09cCs2O2NbM109cCs1O2xbMl09bFswXTtsWzNdPXY7bFswXT1sWzFdO2xbMV09disxfWNbNV09YS5sZW5ndGg7YS5wdXNoKFsoLTQqYVtjWzBdXVswXS1hW2NbMTVdXVswXSs2KihhW2NbNF1dWzBdK2FbY1sxXV1bMF0pLTIqKGFbY1sxMl1dWzBdK2FbY1szXV1bMF0pKzMqKGFbY1sxM11dWzBdK2FbY1s3XV1bMF0pKS85LCgtNCphW2NbMF1dWzFdLWFbY1sxNV1dWzFdKzYqKGFbY1s0XV1bMV0rYVtjWzFdXVsxXSktMiooYVtjWzEyXV1bMV0rYVtjWzNdXVsxXSkrMyooYVtjWzEzXV1bMV0rYVtjWzddXVsxXSkpLzldKTtjWzZdPWEubGVuZ3RoO2EucHVzaChbKC00KmFbY1szXV1bMF0tYVtjWzEyXV1bMF0rNiooYVtjWzJdXVswXSthW2NbN11dWzBdKS0yKihhW2NbMF1dWzBdK2FbY1sxNV1dWzBdKSszKihhW2NbNF1dWzBdK2FbY1sxNF1dWzBdKSkvOSwoLTQqYVtjWzNdXVsxXS1hW2NbMTJdXVsxXSs2KihhW2NbMl1dWzFdK2FbY1s3XV1bMV0pLTIqKGFbY1swXV1bMV0rYVtjWzE1XV1bMV0pKzMqKGFbY1s0XV1bMV0rYVtjWzE0XV1bMV0pKS85XSk7Y1s5XT1hLmxlbmd0aDthLnB1c2goWygtNCphW2NbMTJdXVswXS1hW2NbM11dWzBdKzYqKGFbY1s4XV1bMF0rYVtjWzEzXV1bMF0pLTIqKGFbY1swXV1bMF0rYVtjWzE1XV1bMF0pKzMqKGFbY1sxMV1dWzBdK2FbY1sxXV1bMF0pKS85LCgtNCphW2NbMTJdXVsxXS1hW2NbM11dWzFdKzYqKGFbY1s4XV1bMV0rYVtjWzEzXV1bMV0pLTIqKGFbY1swXV1bMV0rYVtjWzE1XV1bMV0pKzMqKGFbY1sxMV1dWzFdK2FbY1sxXV1bMV0pKS85XSk7Y1sxMF09YS5sZW5ndGg7YS5wdXNoKFsoLTQqYVtjWzE1XV1bMF0tYVtjWzBdXVswXSs2KihhW2NbMTFdXVswXSthW2NbMTRdXVswXSktMiooYVtjWzEyXV1bMF0rYVtjWzNdXVswXSkrMyooYVtjWzJdXVswXSthW2NbOF1dWzBdKSkvOSwoLTQqYVtjWzE1XV1bMV0tYVtjWzBdXVsxXSs2KihhW2NbMTFdXVsxXSthW2NbMTRdXVsxXSktMiooYVtjWzEyXV1bMV0rYVtjWzNdXVsxXSkrMyooYVtjWzJdXVsxXSthW2NbOF1dWzFdKSkvOV0pO3QuZmlndXJlcy5wdXNoKHt0eXBlOiJwYXRjaCIsY29vcmRzOm5ldyBJbnQzMkFycmF5KGMpLGNvbG9yczpuZXcgSW50MzJBcnJheShsKX0pfX0odGhpcyx3KTtDPSEwO2JyZWFrO2Nhc2UgZzohZnVuY3Rpb24gZGVjb2RlVHlwZTdTaGFkaW5nKHQscil7Zm9yKHZhciBhPXQuY29vcmRzLG89dC5jb2xvcnMsYz1uZXcgSW50MzJBcnJheSgxNiksbD1uZXcgSW50MzJBcnJheSg0KTtyLmhhc0RhdGE7KXt2YXIgdSxoLGQ9ci5yZWFkRmxhZygpO2lmKCEoMDw9ZCYmZDw9MykpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZTcgZmxhZyIpO3ZhciBwPWEubGVuZ3RoO2Zvcih1PTAsaD0wIT09ZD8xMjoxNjt1PGg7dSsrKWEucHVzaChyLnJlYWRDb29yZGluYXRlKCkpO3ZhciBtLGcseSxiLHY9by5sZW5ndGg7Zm9yKHU9MCxoPTAhPT1kPzI6NDt1PGg7dSsrKW8ucHVzaChyLnJlYWRDb21wb25lbnRzKCkpO3N3aXRjaChkKXtjYXNlIDA6Y1sxMl09cCszO2NbMTNdPXArNDtjWzE0XT1wKzU7Y1sxNV09cCs2O2NbOF09cCsyO2NbOV09cCsxMztjWzEwXT1wKzE0O2NbMTFdPXArNztjWzRdPXArMTtjWzVdPXArMTI7Y1s2XT1wKzE1O2NbN109cCs4O2NbMF09cDtjWzFdPXArMTE7Y1syXT1wKzEwO2NbM109cCs5O2xbMl09disxO2xbM109disyO2xbMF09djtsWzFdPXYrMzticmVhaztjYXNlIDE6bT1jWzEyXTtnPWNbMTNdO3k9Y1sxNF07Yj1jWzE1XTtjWzEyXT1iO2NbMTNdPXArMDtjWzE0XT1wKzE7Y1sxNV09cCsyO2NbOF09eTtjWzldPXArOTtjWzEwXT1wKzEwO2NbMTFdPXArMztjWzRdPWc7Y1s1XT1wKzg7Y1s2XT1wKzExO2NbN109cCs0O2NbMF09bTtjWzFdPXArNztjWzJdPXArNjtjWzNdPXArNTttPWxbMl07Zz1sWzNdO2xbMl09ZztsWzNdPXY7bFswXT1tO2xbMV09disxO2JyZWFrO2Nhc2UgMjptPWNbMTVdO2c9Y1sxMV07Y1sxMl09Y1szXTtjWzEzXT1wKzA7Y1sxNF09cCsxO2NbMTVdPXArMjtjWzhdPWNbN107Y1s5XT1wKzk7Y1sxMF09cCsxMDtjWzExXT1wKzM7Y1s0XT1nO2NbNV09cCs4O2NbNl09cCsxMTtjWzddPXArNDtjWzBdPW07Y1sxXT1wKzc7Y1syXT1wKzY7Y1szXT1wKzU7bT1sWzNdO2xbMl09bFsxXTtsWzNdPXY7bFswXT1tO2xbMV09disxO2JyZWFrO2Nhc2UgMzpjWzEyXT1jWzBdO2NbMTNdPXArMDtjWzE0XT1wKzE7Y1sxNV09cCsyO2NbOF09Y1sxXTtjWzldPXArOTtjWzEwXT1wKzEwO2NbMTFdPXArMztjWzRdPWNbMl07Y1s1XT1wKzg7Y1s2XT1wKzExO2NbN109cCs0O2NbMF09Y1szXTtjWzFdPXArNztjWzJdPXArNjtjWzNdPXArNTtsWzJdPWxbMF07bFszXT12O2xbMF09bFsxXTtsWzFdPXYrMX10LmZpZ3VyZXMucHVzaCh7dHlwZToicGF0Y2giLGNvb3JkczpuZXcgSW50MzJBcnJheShjKSxjb2xvcnM6bmV3IEludDMyQXJyYXkobCl9KX19KHRoaXMsdyk7Qz0hMDticmVhaztkZWZhdWx0OigwLGkudW5yZWFjaGFibGUpKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIil9aWYoQyl7dXBkYXRlQm91bmRzKHRoaXMpO2Zvcih2YXIgeD0wLEE9dGhpcy5maWd1cmVzLmxlbmd0aDt4PEE7eCsrKWJ1aWxkRmlndXJlRnJvbVBhdGNoKHRoaXMseCl9dXBkYXRlQm91bmRzKHRoaXMpOyFmdW5jdGlvbiBwYWNrRGF0YSh0KXt2YXIgcixhLGksbyxjPXQuY29vcmRzLGw9bmV3IEZsb2F0MzJBcnJheSgyKmMubGVuZ3RoKTtmb3Iocj0wLGk9MCxhPWMubGVuZ3RoO3I8YTtyKyspe3ZhciB1PWNbcl07bFtpKytdPXVbMF07bFtpKytdPXVbMV19dC5jb29yZHM9bDt2YXIgaD10LmNvbG9ycyxkPW5ldyBVaW50OEFycmF5KDMqaC5sZW5ndGgpO2ZvcihyPTAsaT0wLGE9aC5sZW5ndGg7cjxhO3IrKyl7dmFyIHA9aFtyXTtkW2krK109cFswXTtkW2krK109cFsxXTtkW2krK109cFsyXX10LmNvbG9ycz1kO3ZhciBtPXQuZmlndXJlcztmb3Iocj0wLGE9bS5sZW5ndGg7cjxhO3IrKyl7dmFyIGc9bVtyXSx5PWcuY29vcmRzLGI9Zy5jb2xvcnM7Zm9yKGk9MCxvPXkubGVuZ3RoO2k8bztpKyspe3lbaV0qPTI7YltpXSo9M319fSh0aGlzKX1NZXNoLnByb3RvdHlwZT17Z2V0SVI6ZnVuY3Rpb24gTWVzaF9nZXRJUigpe3JldHVyblsiTWVzaCIsdGhpcy5zaGFkaW5nVHlwZSx0aGlzLmNvb3Jkcyx0aGlzLmNvbG9ycyx0aGlzLmZpZ3VyZXMsdGhpcy5ib3VuZHMsdGhpcy5tYXRyaXgsdGhpcy5iYm94LHRoaXMuYmFja2dyb3VuZF19fTtyZXR1cm4gTWVzaH0oKTtiLkR1bW15PWZ1bmN0aW9uIER1bW15Q2xvc3VyZSgpe2Z1bmN0aW9uIER1bW15KCl7dGhpcy50eXBlPSJQYXR0ZXJuIn1EdW1teS5wcm90b3R5cGU9e2dldElSOmZ1bmN0aW9uIER1bW15X2dldElSKCl7cmV0dXJuWyJEdW1teSJdfX07cmV0dXJuIER1bW15fSgpfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLmlzUERGRnVuY3Rpb249ZnVuY3Rpb24gaXNQREZGdW5jdGlvbih0KXt2YXIgcjtpZigib2JqZWN0IiE9PV90eXBlb2YodCkpcmV0dXJuITE7aWYoKDAsaS5pc0RpY3QpKHQpKXI9dDtlbHNle2lmKCEoMCxpLmlzU3RyZWFtKSh0KSlyZXR1cm4hMTtyPXQuZGljdH1yZXR1cm4gci5oYXMoIkZ1bmN0aW9uVHlwZSIpfTtyLlBvc3RTY3JpcHRDb21waWxlcj1yLlBvc3RTY3JpcHRFdmFsdWF0b3I9ci5QREZGdW5jdGlvbkZhY3Rvcnk9dm9pZCAwO3ZhciBpPWEoMjAyKSxvPWEoNSksYz1hKDIzOCksbD1hKDIyMSk7ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fXZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGRnVuY3Rpb25GYWN0b3J5KHQpe3ZhciByPXQueHJlZixhPXQuaXNFdmFsU3VwcG9ydGVkLGk9dm9pZCAwPT09YXx8YTshZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsUERGRnVuY3Rpb25GYWN0b3J5KTt0aGlzLnhyZWY9cjt0aGlzLmlzRXZhbFN1cHBvcnRlZD0hMSE9PWk7dGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlPW51bGx9IWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LHIsYSl7ciYmX2RlZmluZVByb3BlcnRpZXModC5wcm90b3R5cGUscik7YSYmX2RlZmluZVByb3BlcnRpZXModCxhKTtyZXR1cm4gdH0oUERGRnVuY3Rpb25GYWN0b3J5LFt7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZSh0KXt2YXIgcj10aGlzLmdldENhY2hlZCh0KTtpZihyKXJldHVybiByO3ZhciBhPWgucGFyc2Uoe3hyZWY6dGhpcy54cmVmLGlzRXZhbFN1cHBvcnRlZDp0aGlzLmlzRXZhbFN1cHBvcnRlZCxmbjp0IGluc3RhbmNlb2YgaS5SZWY/dGhpcy54cmVmLmZldGNoKHQpOnR9KTt0aGlzLl9jYWNoZSh0LGEpO3JldHVybiBhfX0se2tleToiY3JlYXRlRnJvbUFycmF5Iix2YWx1ZTpmdW5jdGlvbiBjcmVhdGVGcm9tQXJyYXkodCl7dmFyIHI9dGhpcy5nZXRDYWNoZWQodCk7aWYocilyZXR1cm4gcjt2YXIgYT1oLnBhcnNlQXJyYXkoe3hyZWY6dGhpcy54cmVmLGlzRXZhbFN1cHBvcnRlZDp0aGlzLmlzRXZhbFN1cHBvcnRlZCxmbk9iajp0IGluc3RhbmNlb2YgaS5SZWY/dGhpcy54cmVmLmZldGNoKHQpOnR9KTt0aGlzLl9jYWNoZSh0LGEpO3JldHVybiBhfX0se2tleToiZ2V0Q2FjaGVkIix2YWx1ZTpmdW5jdGlvbiBnZXRDYWNoZWQodCl7dmFyIHI7dCBpbnN0YW5jZW9mIGkuUmVmP3I9dDp0IGluc3RhbmNlb2YgaS5EaWN0P3I9dC5vYmpJZDooMCxpLmlzU3RyZWFtKSh0KSYmKHI9dC5kaWN0JiZ0LmRpY3Qub2JqSWQpO2lmKHIpe3RoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZXx8KHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZT1uZXcgbC5Mb2NhbEZ1bmN0aW9uQ2FjaGUpO3ZhciBhPXRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5nZXRCeVJlZihyKTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfX0se2tleToiX2NhY2hlIix2YWx1ZTpmdW5jdGlvbiBfY2FjaGUodCxyKXtpZighcil0aHJvdyBuZXcgRXJyb3IoJ1BERkZ1bmN0aW9uRmFjdG9yeS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkRnVuY3Rpb24iIGFyZ3VtZW50LicpO3ZhciBhO3QgaW5zdGFuY2VvZiBpLlJlZj9hPXQ6dCBpbnN0YW5jZW9mIGkuRGljdD9hPXQub2JqSWQ6KDAsaS5pc1N0cmVhbSkodCkmJihhPXQuZGljdCYmdC5kaWN0Lm9iaklkKTtpZihhKXt0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGV8fCh0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGU9bmV3IGwuTG9jYWxGdW5jdGlvbkNhY2hlKTt0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0KG51bGwsYSxyKX19fV0pO3JldHVybiBQREZGdW5jdGlvbkZhY3Rvcnl9KCk7ci5QREZGdW5jdGlvbkZhY3Rvcnk9dTtmdW5jdGlvbiB0b051bWJlckFycmF5KHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBudWxsO2Zvcih2YXIgcj10Lmxlbmd0aCxhPTA7YTxyO2ErKylpZigibnVtYmVyIiE9dHlwZW9mIHRbYV0pe2Zvcih2YXIgaT1uZXcgQXJyYXkociksbz0wO288cjtvKyspaVtvXT0rdFtvXTtyZXR1cm4gaX1yZXR1cm4gdH12YXIgaD1mdW5jdGlvbiBQREZGdW5jdGlvbkNsb3N1cmUoKXtyZXR1cm57Z2V0U2FtcGxlQXJyYXk6ZnVuY3Rpb24gZ2V0U2FtcGxlQXJyYXkodCxyLGEsaSl7dmFyIG8sYyxsPTE7Zm9yKG89MCxjPXQubGVuZ3RoO288YztvKyspbCo9dFtvXTtsKj1yO3ZhciB1PW5ldyBBcnJheShsKSxoPTAsZD0wLHA9MS8oTWF0aC5wb3coMixhKS0xKSxtPWkuZ2V0Qnl0ZXMoKGwqYSs3KS84KSxnPTA7Zm9yKG89MDtvPGw7bysrKXtmb3IoO2g8YTspe2Q8PD04O2R8PW1bZysrXTtoKz04fWgtPWE7dVtvXT0oZD4+aCkqcDtkJj0oMTw8aCktMX1yZXR1cm4gdX0sZ2V0SVI6ZnVuY3Rpb24gZ2V0SVIodCl7dmFyIHI9dC54cmVmLGE9dC5pc0V2YWxTdXBwb3J0ZWQsaT10LmZuLGM9aS5kaWN0O2N8fChjPWkpO3ZhciBsPVt0aGlzLmNvbnN0cnVjdFNhbXBsZWQsbnVsbCx0aGlzLmNvbnN0cnVjdEludGVycG9sYXRlZCx0aGlzLmNvbnN0cnVjdFN0aWNoZWQsdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0XVtjLmdldCgiRnVuY3Rpb25UeXBlIildO2lmKCFsKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGUgb2YgZnVuY3Rpb24iKTtyZXR1cm4gbC5jYWxsKHRoaXMse3hyZWY6cixpc0V2YWxTdXBwb3J0ZWQ6YSxmbjppLGRpY3Q6Y30pfSxmcm9tSVI6ZnVuY3Rpb24gZnJvbUlSKHQpe3ZhciByPXQueHJlZixhPXQuaXNFdmFsU3VwcG9ydGVkLGk9dC5JUjtzd2l0Y2goaVswXSl7Y2FzZSAwOnJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWRGcm9tSVIoe3hyZWY6cixpc0V2YWxTdXBwb3J0ZWQ6YSxJUjppfSk7Y2FzZSAyOnJldHVybiB0aGlzLmNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUih7eHJlZjpyLGlzRXZhbFN1cHBvcnRlZDphLElSOml9KTtjYXNlIDM6cmV0dXJuIHRoaXMuY29uc3RydWN0U3RpY2hlZEZyb21JUih7eHJlZjpyLGlzRXZhbFN1cHBvcnRlZDphLElSOml9KTtkZWZhdWx0OnJldHVybiB0aGlzLmNvbnN0cnVjdFBvc3RTY3JpcHRGcm9tSVIoe3hyZWY6cixpc0V2YWxTdXBwb3J0ZWQ6YSxJUjppfSl9fSxwYXJzZTpmdW5jdGlvbiBwYXJzZSh0KXt2YXIgcj10LnhyZWYsYT10LmlzRXZhbFN1cHBvcnRlZCxpPXQuZm4sbz10aGlzLmdldElSKHt4cmVmOnIsaXNFdmFsU3VwcG9ydGVkOmEsZm46aX0pO3JldHVybiB0aGlzLmZyb21JUih7eHJlZjpyLGlzRXZhbFN1cHBvcnRlZDphLElSOm99KX0scGFyc2VBcnJheTpmdW5jdGlvbiBwYXJzZUFycmF5KHQpe3ZhciByPXQueHJlZixhPXQuaXNFdmFsU3VwcG9ydGVkLGk9dC5mbk9iajtpZighQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gdGhpcy5wYXJzZSh7eHJlZjpyLGlzRXZhbFN1cHBvcnRlZDphLGZuOml9KTtmb3IodmFyIG89W10sYz0wLGw9aS5sZW5ndGg7YzxsO2MrKylvLnB1c2godGhpcy5wYXJzZSh7eHJlZjpyLGlzRXZhbFN1cHBvcnRlZDphLGZuOnIuZmV0Y2hJZlJlZihpW2NdKX0pKTtyZXR1cm4gZnVuY3Rpb24odCxyLGEsaSl7Zm9yKHZhciBjPTAsbD1vLmxlbmd0aDtjPGw7YysrKW9bY10odCxyLGEsaStjKX19LGNvbnN0cnVjdFNhbXBsZWQ6ZnVuY3Rpb24gY29uc3RydWN0U2FtcGxlZCh0KXt0LnhyZWYsdC5pc0V2YWxTdXBwb3J0ZWQ7dmFyIHI9dC5mbixhPXQuZGljdDtmdW5jdGlvbiB0b011bHRpQXJyYXkodCl7Zm9yKHZhciByPXQubGVuZ3RoLGE9W10saT0wLG89MDtvPHI7bys9Mil7YVtpXT1bdFtvXSx0W28rMV1dOysraX1yZXR1cm4gYX12YXIgaT10b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIkRvbWFpbiIpKSxjPXRvTnVtYmVyQXJyYXkoYS5nZXRBcnJheSgiUmFuZ2UiKSk7aWYoIWl8fCFjKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJObyBkb21haW4gb3IgcmFuZ2UiKTt2YXIgbD1pLmxlbmd0aC8yLHU9Yy5sZW5ndGgvMjtpPXRvTXVsdGlBcnJheShpKTtjPXRvTXVsdGlBcnJheShjKTt2YXIgaD10b051bWJlckFycmF5KGEuZ2V0QXJyYXkoIlNpemUiKSksZD1hLmdldCgiQml0c1BlclNhbXBsZSIpLHA9YS5nZXQoIk9yZGVyIil8fDE7MSE9PXAmJigwLG8uaW5mbykoIk5vIHN1cHBvcnQgZm9yIGN1YmljIHNwbGluZSBpbnRlcnBvbGF0aW9uOiAiK3ApO3ZhciBtPXRvTnVtYmVyQXJyYXkoYS5nZXRBcnJheSgiRW5jb2RlIikpO2lmKG0pbT10b011bHRpQXJyYXkobSk7ZWxzZXttPVtdO2Zvcih2YXIgZz0wO2c8bDsrK2cpbS5wdXNoKFswLGhbZ10tMV0pfXZhciB5PXRvTnVtYmVyQXJyYXkoYS5nZXRBcnJheSgiRGVjb2RlIikpO3JldHVyblswLGwsaSxtLHk9eT90b011bHRpQXJyYXkoeSk6Yyx0aGlzLmdldFNhbXBsZUFycmF5KGgsdSxkLHIpLGgsdSxNYXRoLnBvdygyLGQpLTEsY119LGNvbnN0cnVjdFNhbXBsZWRGcm9tSVI6ZnVuY3Rpb24gY29uc3RydWN0U2FtcGxlZEZyb21JUih0KXt0LnhyZWYsdC5pc0V2YWxTdXBwb3J0ZWQ7dmFyIHI9dC5JUjtmdW5jdGlvbiBpbnRlcnBvbGF0ZSh0LHIsYSxpLG8pe3JldHVybiBpKyhvLWkpLyhhLXIpKih0LXIpfXJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTYW1wbGVkRnJvbUlSUmVzdWx0KHQsYSxpLG8pe3ZhciBjLGwsdT1yWzFdLGg9clsyXSxkPXJbM10scD1yWzRdLG09cls1XSxnPXJbNl0seT1yWzddLGI9cls5XSx2PTE8PHUsUz1uZXcgRmxvYXQ2NEFycmF5KHYpLGs9bmV3IFVpbnQzMkFycmF5KHYpO2ZvcihsPTA7bDx2O2wrKylTW2xdPTE7dmFyIHc9eSxDPTE7Zm9yKGM9MDtjPHU7KytjKXt2YXIgXz1oW2NdWzBdLHg9aFtjXVsxXSxBPWludGVycG9sYXRlKE1hdGgubWluKE1hdGgubWF4KHRbYStjXSxfKSx4KSxfLHgsZFtjXVswXSxkW2NdWzFdKSxUPWdbY10sUj0oQT1NYXRoLm1pbihNYXRoLm1heChBLDApLFQtMSkpPFQtMT9NYXRoLmZsb29yKEEpOkEtMSxJPVIrMS1BLFA9QS1SLE89Uip3LEU9Tyt3O2ZvcihsPTA7bDx2O2wrKylpZihsJkMpe1NbbF0qPVA7a1tsXSs9RX1lbHNle1NbbF0qPUk7a1tsXSs9T313Kj1UO0M8PD0xfWZvcihsPTA7bDx5OysrbCl7dmFyIEI9MDtmb3IoYz0wO2M8djtjKyspQis9bVtrW2NdK2xdKlNbY107Qj1pbnRlcnBvbGF0ZShCLDAsMSxwW2xdWzBdLHBbbF1bMV0pO2lbbytsXT1NYXRoLm1pbihNYXRoLm1heChCLGJbbF1bMF0pLGJbbF1bMV0pfX19LGNvbnN0cnVjdEludGVycG9sYXRlZDpmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWQodCl7dC54cmVmLHQuaXNFdmFsU3VwcG9ydGVkLHQuZm47Zm9yKHZhciByPXQuZGljdCxhPXRvTnVtYmVyQXJyYXkoci5nZXRBcnJheSgiQzAiKSl8fFswXSxpPXRvTnVtYmVyQXJyYXkoci5nZXRBcnJheSgiQzEiKSl8fFsxXSxvPXIuZ2V0KCJOIiksYz1hLmxlbmd0aCxsPVtdLHU9MDt1PGM7Kyt1KWwucHVzaChpW3VdLWFbdV0pO3JldHVyblsyLGEsbCxvXX0sY29uc3RydWN0SW50ZXJwb2xhdGVkRnJvbUlSOmZ1bmN0aW9uIGNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUih0KXt0LnhyZWYsdC5pc0V2YWxTdXBwb3J0ZWQ7dmFyIHI9dC5JUixhPXJbMV0saT1yWzJdLG89clszXSxjPWkubGVuZ3RoO3JldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVJSZXN1bHQodCxyLGwsdSl7Zm9yKHZhciBoPTE9PT1vP3Rbcl06TWF0aC5wb3codFtyXSxvKSxkPTA7ZDxjOysrZClsW3UrZF09YVtkXStoKmlbZF19fSxjb25zdHJ1Y3RTdGljaGVkOmZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWQodCl7dmFyIHI9dC54cmVmLGE9dC5pc0V2YWxTdXBwb3J0ZWQsaT0odC5mbix0LmRpY3QpLGM9dG9OdW1iZXJBcnJheShpLmdldEFycmF5KCJEb21haW4iKSk7aWYoIWMpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiIpO2lmKDEhPT1jLmxlbmd0aC8yKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJCYWQgZG9tYWluIGZvciBzdGljaGVkIGZ1bmN0aW9uIik7Zm9yKHZhciBsPWkuZ2V0KCJGdW5jdGlvbnMiKSx1PVtdLGg9MCxkPWwubGVuZ3RoO2g8ZDsrK2gpdS5wdXNoKHRoaXMucGFyc2Uoe3hyZWY6cixpc0V2YWxTdXBwb3J0ZWQ6YSxmbjpyLmZldGNoSWZSZWYobFtoXSl9KSk7cmV0dXJuWzMsYyx0b051bWJlckFycmF5KGkuZ2V0QXJyYXkoIkJvdW5kcyIpKSx0b051bWJlckFycmF5KGkuZ2V0QXJyYXkoIkVuY29kZSIpKSx1XX0sY29uc3RydWN0U3RpY2hlZEZyb21JUjpmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSKHQpe3QueHJlZix0LmlzRXZhbFN1cHBvcnRlZDt2YXIgcj10LklSLGE9clsxXSxpPXJbMl0sbz1yWzNdLGM9cls0XSxsPW5ldyBGbG9hdDMyQXJyYXkoMSk7cmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGcm9tSVJSZXN1bHQodCxyLHUsaCl7Zm9yKHZhciBkPWZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGcm9tSVJDbGlwKHQscixhKXt0PmE/dD1hOnQ8ciYmKHQ9cik7cmV0dXJuIHR9KHRbcl0sYVswXSxhWzFdKSxwPTAsbT1pLmxlbmd0aDtwPG0mJiEoZDxpW3BdKTsrK3ApO3ZhciBnPWFbMF07cD4wJiYoZz1pW3AtMV0pO3ZhciB5PWFbMV07cDxpLmxlbmd0aCYmKHk9aVtwXSk7dmFyIGI9b1syKnBdLHY9b1syKnArMV07bFswXT1nPT09eT9iOmIrKGQtZykqKHYtYikvKHktZyk7Y1twXShsLDAsdSxoKX19LGNvbnN0cnVjdFBvc3RTY3JpcHQ6ZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdCh0KXt0LnhyZWYsdC5pc0V2YWxTdXBwb3J0ZWQ7dmFyIHI9dC5mbixhPXQuZGljdCxpPXRvTnVtYmVyQXJyYXkoYS5nZXRBcnJheSgiRG9tYWluIikpLGw9dG9OdW1iZXJBcnJheShhLmdldEFycmF5KCJSYW5nZSIpKTtpZighaSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiTm8gZG9tYWluLiIpO2lmKCFsKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJObyByYW5nZS4iKTt2YXIgdT1uZXcgYy5Qb3N0U2NyaXB0TGV4ZXIocik7cmV0dXJuWzQsaSxsLG5ldyBjLlBvc3RTY3JpcHRQYXJzZXIodSkucGFyc2UoKV19LGNvbnN0cnVjdFBvc3RTY3JpcHRGcm9tSVI6ZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUih0KXt0LnhyZWY7dmFyIHI9dC5pc0V2YWxTdXBwb3J0ZWQsYT10LklSLGk9YVsxXSxjPWFbMl0sbD1hWzNdO2lmKHImJm8uSXNFdmFsU3VwcG9ydGVkQ2FjaGVkLnZhbHVlKXt2YXIgdT0obmV3IG0pLmNvbXBpbGUobCxpLGMpO2lmKHUpcmV0dXJuIG5ldyBGdW5jdGlvbigic3JjIiwic3JjT2Zmc2V0IiwiZGVzdCIsImRlc3RPZmZzZXQiLHUpfSgwLG8uaW5mbykoIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7dmFyIGg9Yy5sZW5ndGg+PjEsZD1pLmxlbmd0aD4+MSxnPW5ldyBwKGwpLHk9T2JqZWN0LmNyZWF0ZShudWxsKSxiPTgxOTIsdj1uZXcgRmxvYXQzMkFycmF5KGQpO3JldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSUmVzdWx0KHQscixhLGkpe3ZhciBvLGwsdT0iIixwPXY7Zm9yKG89MDtvPGQ7bysrKXtsPXRbcitvXTtwW29dPWw7dSs9bCsiXyJ9dmFyIG09eVt1XTtpZih2b2lkIDA9PT1tKXt2YXIgUz1uZXcgRmxvYXQzMkFycmF5KGgpLGs9Zy5leGVjdXRlKHApLHc9ay5sZW5ndGgtaDtmb3Iobz0wO288aDtvKyspe2w9a1t3K29dO3ZhciBDPWNbMipvXTsobDxDfHxsPihDPWNbMipvKzFdKSkmJihsPUMpO1Nbb109bH1pZihiPjApe2ItLTt5W3VdPVN9YS5zZXQoUyxpKX1lbHNlIGEuc2V0KG0saSl9fX19KCk7dmFyIGQ9ZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrQ2xvc3VyZSgpe2Z1bmN0aW9uIFBvc3RTY3JpcHRTdGFjayh0KXt0aGlzLnN0YWNrPXQ/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwwKTpbXX1Qb3N0U2NyaXB0U3RhY2sucHJvdG90eXBlPXtwdXNoOmZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19wdXNoKHQpe2lmKHRoaXMuc3RhY2subGVuZ3RoPj0xMDApdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpO3RoaXMuc3RhY2sucHVzaCh0KX0scG9wOmZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19wb3AoKXtpZih0aGlzLnN0YWNrLmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgdW5kZXJmbG93LiIpO3JldHVybiB0aGlzLnN0YWNrLnBvcCgpfSxjb3B5OmZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19jb3B5KHQpe2lmKHRoaXMuc3RhY2subGVuZ3RoK3Q+PTEwMCl0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7Zm9yKHZhciByPXRoaXMuc3RhY2ssYT1yLmxlbmd0aC10LGk9dC0xO2k+PTA7aS0tLGErKylyLnB1c2goclthXSl9LGluZGV4OmZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19pbmRleCh0KXt0aGlzLnB1c2godGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC10LTFdKX0scm9sbDpmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcm9sbCh0LHIpe3ZhciBhLGksbyxjPXRoaXMuc3RhY2ssbD1jLmxlbmd0aC10LHU9Yy5sZW5ndGgtMSxoPWwrKHItTWF0aC5mbG9vcihyL3QpKnQpO2ZvcihhPWwsaT11O2E8aTthKyssaS0tKXtvPWNbYV07Y1thXT1jW2ldO2NbaV09b31mb3IoYT1sLGk9aC0xO2E8aTthKyssaS0tKXtvPWNbYV07Y1thXT1jW2ldO2NbaV09b31mb3IoYT1oLGk9dTthPGk7YSsrLGktLSl7bz1jW2FdO2NbYV09Y1tpXTtjW2ldPW99fX07cmV0dXJuIFBvc3RTY3JpcHRTdGFja30oKSxwPWZ1bmN0aW9uIFBvc3RTY3JpcHRFdmFsdWF0b3JDbG9zdXJlKCl7ZnVuY3Rpb24gUG9zdFNjcmlwdEV2YWx1YXRvcih0KXt0aGlzLm9wZXJhdG9ycz10fVBvc3RTY3JpcHRFdmFsdWF0b3IucHJvdG90eXBlPXtleGVjdXRlOmZ1bmN0aW9uIFBvc3RTY3JpcHRFdmFsdWF0b3JfZXhlY3V0ZSh0KXtmb3IodmFyIHIsYSxpLGM9bmV3IGQodCksbD0wLHU9dGhpcy5vcGVyYXRvcnMsaD11Lmxlbmd0aDtsPGg7KWlmKCJudW1iZXIiIT10eXBlb2Yocj11W2wrK10pKXN3aXRjaChyKXtjYXNlImp6IjppPWMucG9wKCk7KGE9Yy5wb3AoKSl8fChsPWkpO2JyZWFrO2Nhc2UiaiI6bD1hPWMucG9wKCk7YnJlYWs7Y2FzZSJhYnMiOmE9Yy5wb3AoKTtjLnB1c2goTWF0aC5hYnMoYSkpO2JyZWFrO2Nhc2UiYWRkIjppPWMucG9wKCk7YT1jLnBvcCgpO2MucHVzaChhK2kpO2JyZWFrO2Nhc2UiYW5kIjppPWMucG9wKCk7YT1jLnBvcCgpOygwLG8uaXNCb29sKShhKSYmKDAsby5pc0Jvb2wpKGkpP2MucHVzaChhJiZpKTpjLnB1c2goYSZpKTticmVhaztjYXNlImF0YW4iOmE9Yy5wb3AoKTtjLnB1c2goTWF0aC5hdGFuKGEpKTticmVhaztjYXNlImJpdHNoaWZ0IjppPWMucG9wKCk7KGE9Yy5wb3AoKSk+MD9jLnB1c2goYTw8aSk6Yy5wdXNoKGE+PmkpO2JyZWFrO2Nhc2UiY2VpbGluZyI6YT1jLnBvcCgpO2MucHVzaChNYXRoLmNlaWwoYSkpO2JyZWFrO2Nhc2UiY29weSI6YT1jLnBvcCgpO2MuY29weShhKTticmVhaztjYXNlImNvcyI6YT1jLnBvcCgpO2MucHVzaChNYXRoLmNvcyhhKSk7YnJlYWs7Y2FzZSJjdmkiOmE9MHxjLnBvcCgpO2MucHVzaChhKTticmVhaztjYXNlImN2ciI6YnJlYWs7Y2FzZSJkaXYiOmk9Yy5wb3AoKTthPWMucG9wKCk7Yy5wdXNoKGEvaSk7YnJlYWs7Y2FzZSJkdXAiOmMuY29weSgxKTticmVhaztjYXNlImVxIjppPWMucG9wKCk7YT1jLnBvcCgpO2MucHVzaChhPT09aSk7YnJlYWs7Y2FzZSJleGNoIjpjLnJvbGwoMiwxKTticmVhaztjYXNlImV4cCI6aT1jLnBvcCgpO2E9Yy5wb3AoKTtjLnB1c2goTWF0aC5wb3coYSxpKSk7YnJlYWs7Y2FzZSJmYWxzZSI6Yy5wdXNoKCExKTticmVhaztjYXNlImZsb29yIjphPWMucG9wKCk7Yy5wdXNoKE1hdGguZmxvb3IoYSkpO2JyZWFrO2Nhc2UiZ2UiOmk9Yy5wb3AoKTthPWMucG9wKCk7Yy5wdXNoKGE+PWkpO2JyZWFrO2Nhc2UiZ3QiOmk9Yy5wb3AoKTthPWMucG9wKCk7Yy5wdXNoKGE+aSk7YnJlYWs7Y2FzZSJpZGl2IjppPWMucG9wKCk7YT1jLnBvcCgpO2MucHVzaChhL2l8MCk7YnJlYWs7Y2FzZSJpbmRleCI6YT1jLnBvcCgpO2MuaW5kZXgoYSk7YnJlYWs7Y2FzZSJsZSI6aT1jLnBvcCgpO2E9Yy5wb3AoKTtjLnB1c2goYTw9aSk7YnJlYWs7Y2FzZSJsbiI6YT1jLnBvcCgpO2MucHVzaChNYXRoLmxvZyhhKSk7YnJlYWs7Y2FzZSJsb2ciOmE9Yy5wb3AoKTtjLnB1c2goTWF0aC5sb2coYSkvTWF0aC5MTjEwKTticmVhaztjYXNlImx0IjppPWMucG9wKCk7YT1jLnBvcCgpO2MucHVzaChhPGkpO2JyZWFrO2Nhc2UibW9kIjppPWMucG9wKCk7YT1jLnBvcCgpO2MucHVzaChhJWkpO2JyZWFrO2Nhc2UibXVsIjppPWMucG9wKCk7YT1jLnBvcCgpO2MucHVzaChhKmkpO2JyZWFrO2Nhc2UibmUiOmk9Yy5wb3AoKTthPWMucG9wKCk7Yy5wdXNoKGEhPT1pKTticmVhaztjYXNlIm5lZyI6YT1jLnBvcCgpO2MucHVzaCgtYSk7YnJlYWs7Y2FzZSJub3QiOmE9Yy5wb3AoKTsoMCxvLmlzQm9vbCkoYSk/Yy5wdXNoKCFhKTpjLnB1c2gofmEpO2JyZWFrO2Nhc2Uib3IiOmk9Yy5wb3AoKTthPWMucG9wKCk7KDAsby5pc0Jvb2wpKGEpJiYoMCxvLmlzQm9vbCkoaSk/Yy5wdXNoKGF8fGkpOmMucHVzaChhfGkpO2JyZWFrO2Nhc2UicG9wIjpjLnBvcCgpO2JyZWFrO2Nhc2Uicm9sbCI6aT1jLnBvcCgpO2E9Yy5wb3AoKTtjLnJvbGwoYSxpKTticmVhaztjYXNlInJvdW5kIjphPWMucG9wKCk7Yy5wdXNoKE1hdGgucm91bmQoYSkpO2JyZWFrO2Nhc2Uic2luIjphPWMucG9wKCk7Yy5wdXNoKE1hdGguc2luKGEpKTticmVhaztjYXNlInNxcnQiOmE9Yy5wb3AoKTtjLnB1c2goTWF0aC5zcXJ0KGEpKTticmVhaztjYXNlInN1YiI6aT1jLnBvcCgpO2E9Yy5wb3AoKTtjLnB1c2goYS1pKTticmVhaztjYXNlInRydWUiOmMucHVzaCghMCk7YnJlYWs7Y2FzZSJ0cnVuY2F0ZSI6YT0oYT1jLnBvcCgpKTwwP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpO2MucHVzaChhKTticmVhaztjYXNlInhvciI6aT1jLnBvcCgpO2E9Yy5wb3AoKTsoMCxvLmlzQm9vbCkoYSkmJigwLG8uaXNCb29sKShpKT9jLnB1c2goYSE9PWkpOmMucHVzaChhXmkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlVua25vd24gb3BlcmF0b3IgIi5jb25jYXQocikpfWVsc2UgYy5wdXNoKHIpO3JldHVybiBjLnN0YWNrfX07cmV0dXJuIFBvc3RTY3JpcHRFdmFsdWF0b3J9KCk7ci5Qb3N0U2NyaXB0RXZhbHVhdG9yPXA7dmFyIG09ZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyQ2xvc3VyZSgpe2Z1bmN0aW9uIEFzdE5vZGUodCl7dGhpcy50eXBlPXR9QXN0Tm9kZS5wcm90b3R5cGUudmlzaXQ9ZnVuY3Rpb24odCl7KDAsby51bnJlYWNoYWJsZSkoImFic3RyYWN0IG1ldGhvZCIpfTtmdW5jdGlvbiBBc3RBcmd1bWVudCh0LHIsYSl7QXN0Tm9kZS5jYWxsKHRoaXMsImFyZ3MiKTt0aGlzLmluZGV4PXQ7dGhpcy5taW49cjt0aGlzLm1heD1hfUFzdEFyZ3VtZW50LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtBc3RBcmd1bWVudC5wcm90b3R5cGUudmlzaXQ9ZnVuY3Rpb24odCl7dC52aXNpdEFyZ3VtZW50KHRoaXMpfTtmdW5jdGlvbiBBc3RMaXRlcmFsKHQpe0FzdE5vZGUuY2FsbCh0aGlzLCJsaXRlcmFsIik7dGhpcy5udW1iZXI9dDt0aGlzLm1pbj10O3RoaXMubWF4PXR9QXN0TGl0ZXJhbC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBc3ROb2RlLnByb3RvdHlwZSk7QXN0TGl0ZXJhbC5wcm90b3R5cGUudmlzaXQ9ZnVuY3Rpb24odCl7dC52aXNpdExpdGVyYWwodGhpcyl9O2Z1bmN0aW9uIEFzdEJpbmFyeU9wZXJhdGlvbih0LHIsYSxpLG8pe0FzdE5vZGUuY2FsbCh0aGlzLCJiaW5hcnkiKTt0aGlzLm9wPXQ7dGhpcy5hcmcxPXI7dGhpcy5hcmcyPWE7dGhpcy5taW49aTt0aGlzLm1heD1vfUFzdEJpbmFyeU9wZXJhdGlvbi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBc3ROb2RlLnByb3RvdHlwZSk7QXN0QmluYXJ5T3BlcmF0aW9uLnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbih0KXt0LnZpc2l0QmluYXJ5T3BlcmF0aW9uKHRoaXMpfTtmdW5jdGlvbiBBc3RNaW4odCxyKXtBc3ROb2RlLmNhbGwodGhpcywibWF4Iik7dGhpcy5hcmc9dDt0aGlzLm1pbj10Lm1pbjt0aGlzLm1heD1yfUFzdE1pbi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBc3ROb2RlLnByb3RvdHlwZSk7QXN0TWluLnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbih0KXt0LnZpc2l0TWluKHRoaXMpfTtmdW5jdGlvbiBBc3RWYXJpYWJsZSh0LHIsYSl7QXN0Tm9kZS5jYWxsKHRoaXMsInZhciIpO3RoaXMuaW5kZXg9dDt0aGlzLm1pbj1yO3RoaXMubWF4PWF9QXN0VmFyaWFibGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpO0FzdFZhcmlhYmxlLnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbih0KXt0LnZpc2l0VmFyaWFibGUodGhpcyl9O2Z1bmN0aW9uIEFzdFZhcmlhYmxlRGVmaW5pdGlvbih0LHIpe0FzdE5vZGUuY2FsbCh0aGlzLCJkZWZpbml0aW9uIik7dGhpcy52YXJpYWJsZT10O3RoaXMuYXJnPXJ9QXN0VmFyaWFibGVEZWZpbml0aW9uLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTtBc3RWYXJpYWJsZURlZmluaXRpb24ucHJvdG90eXBlLnZpc2l0PWZ1bmN0aW9uKHQpe3QudmlzaXRWYXJpYWJsZURlZmluaXRpb24odGhpcyl9O2Z1bmN0aW9uIEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpe3RoaXMucGFydHM9W119RXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yLnByb3RvdHlwZT17dmlzaXRBcmd1bWVudDpmdW5jdGlvbiB2aXNpdEFyZ3VtZW50KHQpe3RoaXMucGFydHMucHVzaCgiTWF0aC5tYXgoIix0Lm1pbiwiLCBNYXRoLm1pbigiLHQubWF4LCIsIHNyY1tzcmNPZmZzZXQgKyAiLHQuaW5kZXgsIl0pKSIpfSx2aXNpdFZhcmlhYmxlOmZ1bmN0aW9uIHZpc2l0VmFyaWFibGUodCl7dGhpcy5wYXJ0cy5wdXNoKCJ2Iix0LmluZGV4KX0sdmlzaXRMaXRlcmFsOmZ1bmN0aW9uIHZpc2l0TGl0ZXJhbCh0KXt0aGlzLnBhcnRzLnB1c2godC5udW1iZXIpfSx2aXNpdEJpbmFyeU9wZXJhdGlvbjpmdW5jdGlvbiB2aXNpdEJpbmFyeU9wZXJhdGlvbih0KXt0aGlzLnBhcnRzLnB1c2goIigiKTt0LmFyZzEudmlzaXQodGhpcyk7dGhpcy5wYXJ0cy5wdXNoKCIgIix0Lm9wLCIgIik7dC5hcmcyLnZpc2l0KHRoaXMpO3RoaXMucGFydHMucHVzaCgiKSIpfSx2aXNpdFZhcmlhYmxlRGVmaW5pdGlvbjpmdW5jdGlvbiB2aXNpdFZhcmlhYmxlRGVmaW5pdGlvbih0KXt0aGlzLnBhcnRzLnB1c2goInZhciAiKTt0LnZhcmlhYmxlLnZpc2l0KHRoaXMpO3RoaXMucGFydHMucHVzaCgiID0gIik7dC5hcmcudmlzaXQodGhpcyk7dGhpcy5wYXJ0cy5wdXNoKCI7Iil9LHZpc2l0TWluOmZ1bmN0aW9uIHZpc2l0TWluKHQpe3RoaXMucGFydHMucHVzaCgiTWF0aC5taW4oIik7dC5hcmcudmlzaXQodGhpcyk7dGhpcy5wYXJ0cy5wdXNoKCIsICIsdC5tYXgsIikiKX0sdG9TdHJpbmc6ZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5wYXJ0cy5qb2luKCIiKX19O2Z1bmN0aW9uIGJ1aWxkQWRkT3BlcmF0aW9uKHQscil7cmV0dXJuImxpdGVyYWwiPT09ci50eXBlJiYwPT09ci5udW1iZXI/dDoibGl0ZXJhbCI9PT10LnR5cGUmJjA9PT10Lm51bWJlcj9yOiJsaXRlcmFsIj09PXIudHlwZSYmImxpdGVyYWwiPT09dC50eXBlP25ldyBBc3RMaXRlcmFsKHQubnVtYmVyK3IubnVtYmVyKTpuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIrIix0LHIsdC5taW4rci5taW4sdC5tYXgrci5tYXgpfWZ1bmN0aW9uIGJ1aWxkTXVsT3BlcmF0aW9uKHQscil7aWYoImxpdGVyYWwiPT09ci50eXBlKXtpZigwPT09ci5udW1iZXIpcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApO2lmKDE9PT1yLm51bWJlcilyZXR1cm4gdDtpZigibGl0ZXJhbCI9PT10LnR5cGUpcmV0dXJuIG5ldyBBc3RMaXRlcmFsKHQubnVtYmVyKnIubnVtYmVyKX1pZigibGl0ZXJhbCI9PT10LnR5cGUpe2lmKDA9PT10Lm51bWJlcilyZXR1cm4gbmV3IEFzdExpdGVyYWwoMCk7aWYoMT09PXQubnVtYmVyKXJldHVybiByfXJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIqIix0LHIsTWF0aC5taW4odC5taW4qci5taW4sdC5taW4qci5tYXgsdC5tYXgqci5taW4sdC5tYXgqci5tYXgpLE1hdGgubWF4KHQubWluKnIubWluLHQubWluKnIubWF4LHQubWF4KnIubWluLHQubWF4KnIubWF4KSl9ZnVuY3Rpb24gYnVpbGRTdWJPcGVyYXRpb24odCxyKXtpZigibGl0ZXJhbCI9PT1yLnR5cGUpe2lmKDA9PT1yLm51bWJlcilyZXR1cm4gdDtpZigibGl0ZXJhbCI9PT10LnR5cGUpcmV0dXJuIG5ldyBBc3RMaXRlcmFsKHQubnVtYmVyLXIubnVtYmVyKX1yZXR1cm4iYmluYXJ5Ij09PXIudHlwZSYmIi0iPT09ci5vcCYmImxpdGVyYWwiPT09dC50eXBlJiYxPT09dC5udW1iZXImJiJsaXRlcmFsIj09PXIuYXJnMS50eXBlJiYxPT09ci5hcmcxLm51bWJlcj9yLmFyZzI6bmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiLSIsdCxyLHQubWluLXIubWF4LHQubWF4LXIubWluKX1mdW5jdGlvbiBidWlsZE1pbk9wZXJhdGlvbih0LHIpe3JldHVybiB0Lm1pbj49cj9uZXcgQXN0TGl0ZXJhbChyKTp0Lm1heDw9cj90Om5ldyBBc3RNaW4odCxyKX1mdW5jdGlvbiBQb3N0U2NyaXB0Q29tcGlsZXIoKXt9UG9zdFNjcmlwdENvbXBpbGVyLnByb3RvdHlwZT17Y29tcGlsZTpmdW5jdGlvbiBQb3N0U2NyaXB0Q29tcGlsZXJfY29tcGlsZSh0LHIsYSl7Zm9yKHZhciBpLG8sYyxsLHUsaCxkLHAsbT1bXSxnPVtdLHk9ci5sZW5ndGg+PjEsYj1hLmxlbmd0aD4+MSx2PTAsUz0wO1M8eTtTKyspbS5wdXNoKG5ldyBBc3RBcmd1bWVudChTLHJbMipTXSxyWzIqUysxXSkpO2Zvcih2YXIgaz0wLHc9dC5sZW5ndGg7azx3O2srKylpZigibnVtYmVyIiE9dHlwZW9mKHA9dFtrXSkpc3dpdGNoKHApe2Nhc2UiYWRkIjppZihtLmxlbmd0aDwyKXJldHVybiBudWxsO2w9bS5wb3AoKTtjPW0ucG9wKCk7bS5wdXNoKGJ1aWxkQWRkT3BlcmF0aW9uKGMsbCkpO2JyZWFrO2Nhc2UiY3ZyIjppZihtLmxlbmd0aDwxKXJldHVybiBudWxsO2JyZWFrO2Nhc2UibXVsIjppZihtLmxlbmd0aDwyKXJldHVybiBudWxsO2w9bS5wb3AoKTtjPW0ucG9wKCk7bS5wdXNoKGJ1aWxkTXVsT3BlcmF0aW9uKGMsbCkpO2JyZWFrO2Nhc2Uic3ViIjppZihtLmxlbmd0aDwyKXJldHVybiBudWxsO2w9bS5wb3AoKTtjPW0ucG9wKCk7bS5wdXNoKGJ1aWxkU3ViT3BlcmF0aW9uKGMsbCkpO2JyZWFrO2Nhc2UiZXhjaCI6aWYobS5sZW5ndGg8MilyZXR1cm4gbnVsbDt1PW0ucG9wKCk7aD1tLnBvcCgpO20ucHVzaCh1LGgpO2JyZWFrO2Nhc2UicG9wIjppZihtLmxlbmd0aDwxKXJldHVybiBudWxsO20ucG9wKCk7YnJlYWs7Y2FzZSJpbmRleCI6aWYobS5sZW5ndGg8MSlyZXR1cm4gbnVsbDtpZigibGl0ZXJhbCIhPT0oYz1tLnBvcCgpKS50eXBlKXJldHVybiBudWxsO2lmKChpPWMubnVtYmVyKTwwfHwhTnVtYmVyLmlzSW50ZWdlcihpKXx8bS5sZW5ndGg8aSlyZXR1cm4gbnVsbDtpZigibGl0ZXJhbCI9PT0odT1tW20ubGVuZ3RoLWktMV0pLnR5cGV8fCJ2YXIiPT09dS50eXBlKXttLnB1c2godSk7YnJlYWt9ZD1uZXcgQXN0VmFyaWFibGUodisrLHUubWluLHUubWF4KTttW20ubGVuZ3RoLWktMV09ZDttLnB1c2goZCk7Zy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24oZCx1KSk7YnJlYWs7Y2FzZSJkdXAiOmlmKG0ubGVuZ3RoPDEpcmV0dXJuIG51bGw7aWYoIm51bWJlciI9PXR5cGVvZiB0W2srMV0mJiJndCI9PT10W2srMl0mJnRbayszXT09PWsrNyYmImp6Ij09PXRbays0XSYmInBvcCI9PT10W2srNV0mJnRbays2XT09PXRbaysxXSl7Yz1tLnBvcCgpO20ucHVzaChidWlsZE1pbk9wZXJhdGlvbihjLHRbaysxXSkpO2srPTY7YnJlYWt9aWYoImxpdGVyYWwiPT09KHU9bVttLmxlbmd0aC0xXSkudHlwZXx8InZhciI9PT11LnR5cGUpe20ucHVzaCh1KTticmVha31kPW5ldyBBc3RWYXJpYWJsZSh2KyssdS5taW4sdS5tYXgpO21bbS5sZW5ndGgtMV09ZDttLnB1c2goZCk7Zy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24oZCx1KSk7YnJlYWs7Y2FzZSJyb2xsIjppZihtLmxlbmd0aDwyKXJldHVybiBudWxsO2w9bS5wb3AoKTtjPW0ucG9wKCk7aWYoImxpdGVyYWwiIT09bC50eXBlfHwibGl0ZXJhbCIhPT1jLnR5cGUpcmV0dXJuIG51bGw7bz1sLm51bWJlcjtpZigoaT1jLm51bWJlcik8PTB8fCFOdW1iZXIuaXNJbnRlZ2VyKGkpfHwhTnVtYmVyLmlzSW50ZWdlcihvKXx8bS5sZW5ndGg8aSlyZXR1cm4gbnVsbDtpZigwPT09KG89KG8laStpKSVpKSlicmVhaztBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShtLG0uc3BsaWNlKG0ubGVuZ3RoLWksaS1vKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbH1lbHNlIG0ucHVzaChuZXcgQXN0TGl0ZXJhbChwKSk7aWYobS5sZW5ndGghPT1iKXJldHVybiBudWxsO3ZhciBDPVtdO2cuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9bmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcjt0LnZpc2l0KHIpO0MucHVzaChyLnRvU3RyaW5nKCkpfSkpO20uZm9yRWFjaCgoZnVuY3Rpb24odCxyKXt2YXIgaT1uZXcgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yO3QudmlzaXQoaSk7dmFyIG89YVsyKnJdLGM9YVsyKnIrMV0sbD1baS50b1N0cmluZygpXTtpZihvPnQubWluKXtsLnVuc2hpZnQoIk1hdGgubWF4KCIsbywiLCAiKTtsLnB1c2goIikiKX1pZihjPHQubWF4KXtsLnVuc2hpZnQoIk1hdGgubWluKCIsYywiLCAiKTtsLnB1c2goIikiKX1sLnVuc2hpZnQoImRlc3RbZGVzdE9mZnNldCArICIsciwiXSA9ICIpO2wucHVzaCgiOyIpO0MucHVzaChsLmpvaW4oIiIpKX0pKTtyZXR1cm4gQy5qb2luKCJcbiIpfX07cmV0dXJuIFBvc3RTY3JpcHRDb21waWxlcn0oKTtyLlBvc3RTY3JpcHRDb21waWxlcj1tfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBvc3RTY3JpcHRQYXJzZXI9ci5Qb3N0U2NyaXB0TGV4ZXI9dm9pZCAwO3ZhciBpPWEoNSksbz1hKDIwMiksYz1hKDIwNSk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGk9clthXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMTtpLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQb3N0U2NyaXB0UGFyc2VyKHQpe19jbGFzc0NhbGxDaGVjayh0aGlzLFBvc3RTY3JpcHRQYXJzZXIpO3RoaXMubGV4ZXI9dDt0aGlzLm9wZXJhdG9ycz1bXTt0aGlzLnRva2VuPW51bGw7dGhpcy5wcmV2PW51bGx9X2NyZWF0ZUNsYXNzKFBvc3RTY3JpcHRQYXJzZXIsW3trZXk6Im5leHRUb2tlbiIsdmFsdWU6ZnVuY3Rpb24gbmV4dFRva2VuKCl7dGhpcy5wcmV2PXRoaXMudG9rZW47dGhpcy50b2tlbj10aGlzLmxleGVyLmdldFRva2VuKCl9fSx7a2V5OiJhY2NlcHQiLHZhbHVlOmZ1bmN0aW9uIGFjY2VwdCh0KXtpZih0aGlzLnRva2VuLnR5cGU9PT10KXt0aGlzLm5leHRUb2tlbigpO3JldHVybiEwfXJldHVybiExfX0se2tleToiZXhwZWN0Iix2YWx1ZTpmdW5jdGlvbiBleHBlY3QodCl7aWYodGhpcy5hY2NlcHQodCkpcmV0dXJuITA7dGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIlVuZXhwZWN0ZWQgc3ltYm9sOiBmb3VuZCAiLmNvbmNhdCh0aGlzLnRva2VuLnR5cGUsIiBleHBlY3RlZCAiKS5jb25jYXQodCwiLiIpKX19LHtrZXk6InBhcnNlIix2YWx1ZTpmdW5jdGlvbiBwYXJzZSgpe3RoaXMubmV4dFRva2VuKCk7dGhpcy5leHBlY3QodS5MQlJBQ0UpO3RoaXMucGFyc2VCbG9jaygpO3RoaXMuZXhwZWN0KHUuUkJSQUNFKTtyZXR1cm4gdGhpcy5vcGVyYXRvcnN9fSx7a2V5OiJwYXJzZUJsb2NrIix2YWx1ZTpmdW5jdGlvbiBwYXJzZUJsb2NrKCl7Zm9yKDs7KWlmKHRoaXMuYWNjZXB0KHUuTlVNQkVSKSl0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7ZWxzZSBpZih0aGlzLmFjY2VwdCh1Lk9QRVJBVE9SKSl0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7ZWxzZXtpZighdGhpcy5hY2NlcHQodS5MQlJBQ0UpKXJldHVybjt0aGlzLnBhcnNlQ29uZGl0aW9uKCl9fX0se2tleToicGFyc2VDb25kaXRpb24iLHZhbHVlOmZ1bmN0aW9uIHBhcnNlQ29uZGl0aW9uKCl7dmFyIHQ9dGhpcy5vcGVyYXRvcnMubGVuZ3RoO3RoaXMub3BlcmF0b3JzLnB1c2gobnVsbCxudWxsKTt0aGlzLnBhcnNlQmxvY2soKTt0aGlzLmV4cGVjdCh1LlJCUkFDRSk7aWYodGhpcy5hY2NlcHQodS5JRikpe3RoaXMub3BlcmF0b3JzW3RdPXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLm9wZXJhdG9yc1t0KzFdPSJqeiJ9ZWxzZXtpZighdGhpcy5hY2NlcHQodS5MQlJBQ0UpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJQUyBGdW5jdGlvbjogZXJyb3IgcGFyc2luZyBjb25kaXRpb25hbC4iKTt2YXIgcj10aGlzLm9wZXJhdG9ycy5sZW5ndGg7dGhpcy5vcGVyYXRvcnMucHVzaChudWxsLG51bGwpO3ZhciBhPXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLnBhcnNlQmxvY2soKTt0aGlzLmV4cGVjdCh1LlJCUkFDRSk7dGhpcy5leHBlY3QodS5JRkVMU0UpO3RoaXMub3BlcmF0b3JzW3JdPXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLm9wZXJhdG9yc1tyKzFdPSJqIjt0aGlzLm9wZXJhdG9yc1t0XT1hO3RoaXMub3BlcmF0b3JzW3QrMV09Imp6In19fV0pO3JldHVybiBQb3N0U2NyaXB0UGFyc2VyfSgpO3IuUG9zdFNjcmlwdFBhcnNlcj1sO3ZhciB1PXtMQlJBQ0U6MCxSQlJBQ0U6MSxOVU1CRVI6MixPUEVSQVRPUjozLElGOjQsSUZFTFNFOjV9LGg9ZnVuY3Rpb24gUG9zdFNjcmlwdFRva2VuQ2xvc3VyZSgpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gUG9zdFNjcmlwdFRva2VuKHQscil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUG9zdFNjcmlwdFRva2VuKTt0aGlzLnR5cGU9dDt0aGlzLnZhbHVlPXJ9X2NyZWF0ZUNsYXNzKFBvc3RTY3JpcHRUb2tlbixudWxsLFt7a2V5OiJnZXRPcGVyYXRvciIsdmFsdWU6ZnVuY3Rpb24gZ2V0T3BlcmF0b3Iocil7dmFyIGE9dFtyXTtyZXR1cm4gYXx8KHRbcl09bmV3IFBvc3RTY3JpcHRUb2tlbih1Lk9QRVJBVE9SLHIpKX19LHtrZXk6IkxCUkFDRSIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJMQlJBQ0UiLG5ldyBQb3N0U2NyaXB0VG9rZW4odS5MQlJBQ0UsInsiKSl9fSx7a2V5OiJSQlJBQ0UiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywiUkJSQUNFIixuZXcgUG9zdFNjcmlwdFRva2VuKHUuUkJSQUNFLCJ9IikpfX0se2tleToiSUYiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywiSUYiLG5ldyBQb3N0U2NyaXB0VG9rZW4odS5JRiwiSUYiKSl9fSx7a2V5OiJJRkVMU0UiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywiSUZFTFNFIixuZXcgUG9zdFNjcmlwdFRva2VuKHUuSUZFTFNFLCJJRkVMU0UiKSl9fV0pO3JldHVybiBQb3N0U2NyaXB0VG9rZW59KCl9KCksZD1mdW5jdGlvbigpe2Z1bmN0aW9uIFBvc3RTY3JpcHRMZXhlcih0KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQb3N0U2NyaXB0TGV4ZXIpO3RoaXMuc3RyZWFtPXQ7dGhpcy5uZXh0Q2hhcigpO3RoaXMuc3RyQnVmPVtdfV9jcmVhdGVDbGFzcyhQb3N0U2NyaXB0TGV4ZXIsW3trZXk6Im5leHRDaGFyIix2YWx1ZTpmdW5jdGlvbiBuZXh0Q2hhcigpe3JldHVybiB0aGlzLmN1cnJlbnRDaGFyPXRoaXMuc3RyZWFtLmdldEJ5dGUoKX19LHtrZXk6ImdldFRva2VuIix2YWx1ZTpmdW5jdGlvbiBnZXRUb2tlbigpe2Zvcih2YXIgdD0hMSxyPXRoaXMuY3VycmVudENoYXI7Oyl7aWYocjwwKXJldHVybiBvLkVPRjtpZih0KTEwIT09ciYmMTMhPT1yfHwodD0hMSk7ZWxzZSBpZigzNz09PXIpdD0hMDtlbHNlIGlmKCEoMCxjLmlzV2hpdGVTcGFjZSkocikpYnJlYWs7cj10aGlzLm5leHRDaGFyKCl9c3dpdGNoKDB8cil7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQzOmNhc2UgNDU6Y2FzZSA0NjpyZXR1cm4gbmV3IGgodS5OVU1CRVIsdGhpcy5nZXROdW1iZXIoKSk7Y2FzZSAxMjM6dGhpcy5uZXh0Q2hhcigpO3JldHVybiBoLkxCUkFDRTtjYXNlIDEyNTp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIGguUkJSQUNFfXZhciBhPXRoaXMuc3RyQnVmO2EubGVuZ3RoPTA7YVswXT1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpO2Zvcig7KHI9dGhpcy5uZXh0Q2hhcigpKT49MCYmKHI+PTY1JiZyPD05MHx8cj49OTcmJnI8PTEyMik7KWEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHIpKTt2YXIgaT1hLmpvaW4oIiIpO3N3aXRjaChpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaWYiOnJldHVybiBoLklGO2Nhc2UiaWZlbHNlIjpyZXR1cm4gaC5JRkVMU0U7ZGVmYXVsdDpyZXR1cm4gaC5nZXRPcGVyYXRvcihpKX19fSx7a2V5OiJnZXROdW1iZXIiLHZhbHVlOmZ1bmN0aW9uIGdldE51bWJlcigpe3ZhciB0PXRoaXMuY3VycmVudENoYXIscj10aGlzLnN0ckJ1ZjtyLmxlbmd0aD0wO3JbMF09U3RyaW5nLmZyb21DaGFyQ29kZSh0KTtmb3IoOyh0PXRoaXMubmV4dENoYXIoKSk+PTAmJih0Pj00OCYmdDw9NTd8fDQ1PT09dHx8NDY9PT10KTspci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodCkpO3ZhciBhPXBhcnNlRmxvYXQoci5qb2luKCIiKSk7aWYoaXNOYU4oYSkpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOiAiLmNvbmNhdChhKSk7cmV0dXJuIGF9fV0pO3JldHVybiBQb3N0U2NyaXB0TGV4ZXJ9KCk7ci5Qb3N0U2NyaXB0TGV4ZXI9ZH0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5iaWRpPWZ1bmN0aW9uIGJpZGkodCxyLGEpe3ZhciBoPSEwLGQ9dC5sZW5ndGg7aWYoMD09PWR8fGEpcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KHQsaCxhKTtsLmxlbmd0aD1kO3UubGVuZ3RoPWQ7dmFyIHAsbSxnPTA7Zm9yKHA9MDtwPGQ7KytwKXtsW3BdPXQuY2hhckF0KHApO3ZhciB5PXQuY2hhckNvZGVBdChwKSxiPSJMIjt5PD0yNTU/Yj1vW3ldOjE0MjQ8PXkmJnk8PTE1MjQ/Yj0iUiI6MTUzNjw9eSYmeTw9MTc5MT8oYj1jWzI1NSZ5XSl8fCgwLGkud2FybikoIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIit5LnRvU3RyaW5nKDE2KSk6MTc5Mjw9eSYmeTw9MjIyMCYmKGI9IkFMIik7IlIiIT09YiYmIkFMIiE9PWImJiJBTiIhPT1ifHxnKys7dVtwXT1ifWlmKDA9PT1nKXJldHVybiBjcmVhdGVCaWRpVGV4dCh0LGg9ITApO2lmKC0xPT09cilpZihnL2Q8LjMpe2g9ITA7cj0wfWVsc2V7aD0hMTtyPTF9dmFyIHY9W107Zm9yKHA9MDtwPGQ7KytwKXZbcF09cjt2YXIgUyxrPWlzT2RkKHIpPyJSIjoiTCIsdz1rLEM9dyxfPXc7Zm9yKHA9MDtwPGQ7KytwKSJOU00iPT09dVtwXT91W3BdPV86Xz11W3BdO189dztmb3IocD0wO3A8ZDsrK3ApIkVOIj09PShTPXVbcF0pP3VbcF09IkFMIj09PV8/IkFOIjoiRU4iOiJSIiE9PVMmJiJMIiE9PVMmJiJBTCIhPT1TfHwoXz1TKTtmb3IocD0wO3A8ZDsrK3ApIkFMIj09PShTPXVbcF0pJiYodVtwXT0iUiIpO2ZvcihwPTE7cDxkLTE7KytwKXsiRVMiPT09dVtwXSYmIkVOIj09PXVbcC0xXSYmIkVOIj09PXVbcCsxXSYmKHVbcF09IkVOIik7IkNTIiE9PXVbcF18fCJFTiIhPT11W3AtMV0mJiJBTiIhPT11W3AtMV18fHVbcCsxXSE9PXVbcC0xXXx8KHVbcF09dVtwLTFdKX1mb3IocD0wO3A8ZDsrK3ApaWYoIkVOIj09PXVbcF0pe3ZhciB4O2Zvcih4PXAtMTt4Pj0wJiYiRVQiPT09dVt4XTstLXgpdVt4XT0iRU4iO2Zvcih4PXArMTt4PGQmJiJFVCI9PT11W3hdOysreCl1W3hdPSJFTiJ9Zm9yKHA9MDtwPGQ7KytwKSJXUyIhPT0oUz11W3BdKSYmIkVTIiE9PVMmJiJFVCIhPT1TJiYiQ1MiIT09U3x8KHVbcF09Ik9OIik7Xz13O2ZvcihwPTA7cDxkOysrcCkiRU4iPT09KFM9dVtwXSk/dVtwXT0iTCI9PT1fPyJMIjoiRU4iOiJSIiE9PVMmJiJMIiE9PVN8fChfPVMpO2ZvcihwPTA7cDxkOysrcClpZigiT04iPT09dVtwXSl7dmFyIEE9ZmluZFVuZXF1YWwodSxwKzEsIk9OIiksVD13O3A+MCYmKFQ9dVtwLTFdKTt2YXIgUj1DO0ErMTxkJiYoUj11W0ErMV0pOyJMIiE9PVQmJihUPSJSIik7IkwiIT09UiYmKFI9IlIiKTtUPT09UiYmc2V0VmFsdWVzKHUscCxBLFQpO3A9QS0xfWZvcihwPTA7cDxkOysrcCkiT04iPT09dVtwXSYmKHVbcF09ayk7Zm9yKHA9MDtwPGQ7KytwKXtTPXVbcF07aXNFdmVuKHZbcF0pPyJSIj09PVM/dltwXSs9MToiQU4iIT09UyYmIkVOIiE9PVN8fCh2W3BdKz0yKToiTCIhPT1TJiYiQU4iIT09UyYmIkVOIiE9PVN8fCh2W3BdKz0xKX12YXIgSSxQPS0xLE89OTk7Zm9yKHA9MCxtPXYubGVuZ3RoO3A8bTsrK3Ape0k9dltwXTtQPEkmJihQPUkpO08+SSYmaXNPZGQoSSkmJihPPUkpfWZvcihJPVA7ST49TzstLUkpe3ZhciBFPS0xO2ZvcihwPTAsbT12Lmxlbmd0aDtwPG07KytwKWlmKHZbcF08SSl7aWYoRT49MCl7cmV2ZXJzZVZhbHVlcyhsLEUscCk7RT0tMX19ZWxzZSBFPDAmJihFPXApO0U+PTAmJnJldmVyc2VWYWx1ZXMobCxFLHYubGVuZ3RoKX1mb3IocD0wLG09bC5sZW5ndGg7cDxtOysrcCl7dmFyIEI9bFtwXTsiPCIhPT1CJiYiPiIhPT1CfHwobFtwXT0iIil9cmV0dXJuIGNyZWF0ZUJpZGlUZXh0KGwuam9pbigiIiksaCl9O3ZhciBpPWEoNSksbz1bIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIlMiLCJCIiwiUyIsIldTIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCIiwiQiIsIkIiLCJTIiwiV1MiLCJPTiIsIk9OIiwiRVQiLCJFVCIsIkVUIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIkVTIiwiQ1MiLCJFUyIsIkNTIiwiQ1MiLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkNTIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiT04iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk9OIiwiT04iLCJPTiIsIk9OIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJDUyIsIk9OIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJPTiIsIk9OIiwiT04iLCJPTiIsIkwiLCJPTiIsIk9OIiwiQk4iLCJPTiIsIk9OIiwiRVQiLCJFVCIsIkVOIiwiRU4iLCJPTiIsIkwiLCJPTiIsIk9OIiwiT04iLCJFTiIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIl0sYz1bIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIk9OIiwiT04iLCJBTCIsIkVUIiwiRVQiLCJBTCIsIkNTIiwiQUwiLCJPTiIsIk9OIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQUwiLCJBTCIsIiIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiRVQiLCJBTiIsIkFOIiwiQUwiLCJBTCIsIkFMIiwiTlNNIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFOIiwiT04iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiTlNNIiwiTlNNIiwiT04iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiXTtmdW5jdGlvbiBpc09kZCh0KXtyZXR1cm4gMCE9KDEmdCl9ZnVuY3Rpb24gaXNFdmVuKHQpe3JldHVybiAwPT0oMSZ0KX1mdW5jdGlvbiBmaW5kVW5lcXVhbCh0LHIsYSl7Zm9yKHZhciBpPXIsbz10Lmxlbmd0aDtpPG87KytpKWlmKHRbaV0hPT1hKXJldHVybiBpO3JldHVybiBpfWZ1bmN0aW9uIHNldFZhbHVlcyh0LHIsYSxpKXtmb3IodmFyIG89cjtvPGE7KytvKXRbb109aX1mdW5jdGlvbiByZXZlcnNlVmFsdWVzKHQscixhKXtmb3IodmFyIGk9cixvPWEtMTtpPG87KytpLC0tbyl7dmFyIGM9dFtpXTt0W2ldPXRbb107dFtvXT1jfX1mdW5jdGlvbiBjcmVhdGVCaWRpVGV4dCh0LHIpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0saT0ibHRyIjthP2k9InR0YiI6cnx8KGk9InJ0bCIpO3JldHVybntzdHI6dCxkaXI6aX19dmFyIGw9W10sdT1bXX0sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5nZXRNZXRyaWNzPXZvaWQgMDt2YXIgaT1hKDIwNSksbz0oMCxpLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKHQpe3QuQ291cmllcj02MDA7dFsiQ291cmllci1Cb2xkIl09NjAwO3RbIkNvdXJpZXItQm9sZE9ibGlxdWUiXT02MDA7dFsiQ291cmllci1PYmxpcXVlIl09NjAwO3QuSGVsdmV0aWNhPSgwLGkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24odCl7dC5zcGFjZT0yNzg7dC5leGNsYW09Mjc4O3QucXVvdGVkYmw9MzU1O3QubnVtYmVyc2lnbj01NTY7dC5kb2xsYXI9NTU2O3QucGVyY2VudD04ODk7dC5hbXBlcnNhbmQ9NjY3O3QucXVvdGVyaWdodD0yMjI7dC5wYXJlbmxlZnQ9MzMzO3QucGFyZW5yaWdodD0zMzM7dC5hc3Rlcmlzaz0zODk7dC5wbHVzPTU4NDt0LmNvbW1hPTI3ODt0Lmh5cGhlbj0zMzM7dC5wZXJpb2Q9Mjc4O3Quc2xhc2g9Mjc4O3QuemVybz01NTY7dC5vbmU9NTU2O3QudHdvPTU1Njt0LnRocmVlPTU1Njt0LmZvdXI9NTU2O3QuZml2ZT01NTY7dC5zaXg9NTU2O3Quc2V2ZW49NTU2O3QuZWlnaHQ9NTU2O3QubmluZT01NTY7dC5jb2xvbj0yNzg7dC5zZW1pY29sb249Mjc4O3QubGVzcz01ODQ7dC5lcXVhbD01ODQ7dC5ncmVhdGVyPTU4NDt0LnF1ZXN0aW9uPTU1Njt0LmF0PTEwMTU7dC5BPTY2Nzt0LkI9NjY3O3QuQz03MjI7dC5EPTcyMjt0LkU9NjY3O3QuRj02MTE7dC5HPTc3ODt0Lkg9NzIyO3QuST0yNzg7dC5KPTUwMDt0Lks9NjY3O3QuTD01NTY7dC5NPTgzMzt0Lk49NzIyO3QuTz03Nzg7dC5QPTY2Nzt0LlE9Nzc4O3QuUj03MjI7dC5TPTY2Nzt0LlQ9NjExO3QuVT03MjI7dC5WPTY2Nzt0Llc9OTQ0O3QuWD02Njc7dC5ZPTY2Nzt0Llo9NjExO3QuYnJhY2tldGxlZnQ9Mjc4O3QuYmFja3NsYXNoPTI3ODt0LmJyYWNrZXRyaWdodD0yNzg7dC5hc2NpaWNpcmN1bT00Njk7dC51bmRlcnNjb3JlPTU1Njt0LnF1b3RlbGVmdD0yMjI7dC5hPTU1Njt0LmI9NTU2O3QuYz01MDA7dC5kPTU1Njt0LmU9NTU2O3QuZj0yNzg7dC5nPTU1Njt0Lmg9NTU2O3QuaT0yMjI7dC5qPTIyMjt0Lms9NTAwO3QubD0yMjI7dC5tPTgzMzt0Lm49NTU2O3Qubz01NTY7dC5wPTU1Njt0LnE9NTU2O3Qucj0zMzM7dC5zPTUwMDt0LnQ9Mjc4O3QudT01NTY7dC52PTUwMDt0Lnc9NzIyO3QueD01MDA7dC55PTUwMDt0Lno9NTAwO3QuYnJhY2VsZWZ0PTMzNDt0LmJhcj0yNjA7dC5icmFjZXJpZ2h0PTMzNDt0LmFzY2lpdGlsZGU9NTg0O3QuZXhjbGFtZG93bj0zMzM7dC5jZW50PTU1Njt0LnN0ZXJsaW5nPTU1Njt0LmZyYWN0aW9uPTE2Nzt0Lnllbj01NTY7dC5mbG9yaW49NTU2O3Quc2VjdGlvbj01NTY7dC5jdXJyZW5jeT01NTY7dC5xdW90ZXNpbmdsZT0xOTE7dC5xdW90ZWRibGxlZnQ9MzMzO3QuZ3VpbGxlbW90bGVmdD01NTY7dC5ndWlsc2luZ2xsZWZ0PTMzMzt0Lmd1aWxzaW5nbHJpZ2h0PTMzMzt0LmZpPTUwMDt0LmZsPTUwMDt0LmVuZGFzaD01NTY7dC5kYWdnZXI9NTU2O3QuZGFnZ2VyZGJsPTU1Njt0LnBlcmlvZGNlbnRlcmVkPTI3ODt0LnBhcmFncmFwaD01Mzc7dC5idWxsZXQ9MzUwO3QucXVvdGVzaW5nbGJhc2U9MjIyO3QucXVvdGVkYmxiYXNlPTMzMzt0LnF1b3RlZGJscmlnaHQ9MzMzO3QuZ3VpbGxlbW90cmlnaHQ9NTU2O3QuZWxsaXBzaXM9MWUzO3QucGVydGhvdXNhbmQ9MWUzO3QucXVlc3Rpb25kb3duPTYxMTt0LmdyYXZlPTMzMzt0LmFjdXRlPTMzMzt0LmNpcmN1bWZsZXg9MzMzO3QudGlsZGU9MzMzO3QubWFjcm9uPTMzMzt0LmJyZXZlPTMzMzt0LmRvdGFjY2VudD0zMzM7dC5kaWVyZXNpcz0zMzM7dC5yaW5nPTMzMzt0LmNlZGlsbGE9MzMzO3QuaHVuZ2FydW1sYXV0PTMzMzt0Lm9nb25laz0zMzM7dC5jYXJvbj0zMzM7dC5lbWRhc2g9MWUzO3QuQUU9MWUzO3Qub3JkZmVtaW5pbmU9MzcwO3QuTHNsYXNoPTU1Njt0Lk9zbGFzaD03Nzg7dC5PRT0xZTM7dC5vcmRtYXNjdWxpbmU9MzY1O3QuYWU9ODg5O3QuZG90bGVzc2k9Mjc4O3QubHNsYXNoPTIyMjt0Lm9zbGFzaD02MTE7dC5vZT05NDQ7dC5nZXJtYW5kYmxzPTYxMTt0LklkaWVyZXNpcz0yNzg7dC5lYWN1dGU9NTU2O3QuYWJyZXZlPTU1Njt0LnVodW5nYXJ1bWxhdXQ9NTU2O3QuZWNhcm9uPTU1Njt0LllkaWVyZXNpcz02Njc7dC5kaXZpZGU9NTg0O3QuWWFjdXRlPTY2Nzt0LkFjaXJjdW1mbGV4PTY2Nzt0LmFhY3V0ZT01NTY7dC5VY2lyY3VtZmxleD03MjI7dC55YWN1dGU9NTAwO3Quc2NvbW1hYWNjZW50PTUwMDt0LmVjaXJjdW1mbGV4PTU1Njt0LlVyaW5nPTcyMjt0LlVkaWVyZXNpcz03MjI7dC5hb2dvbmVrPTU1Njt0LlVhY3V0ZT03MjI7dC51b2dvbmVrPTU1Njt0LkVkaWVyZXNpcz02Njc7dC5EY3JvYXQ9NzIyO3QuY29tbWFhY2NlbnQ9MjUwO3QuY29weXJpZ2h0PTczNzt0LkVtYWNyb249NjY3O3QuY2Nhcm9uPTUwMDt0LmFyaW5nPTU1Njt0Lk5jb21tYWFjY2VudD03MjI7dC5sYWN1dGU9MjIyO3QuYWdyYXZlPTU1Njt0LlRjb21tYWFjY2VudD02MTE7dC5DYWN1dGU9NzIyO3QuYXRpbGRlPTU1Njt0LkVkb3RhY2NlbnQ9NjY3O3Quc2Nhcm9uPTUwMDt0LnNjZWRpbGxhPTUwMDt0LmlhY3V0ZT0yNzg7dC5sb3plbmdlPTQ3MTt0LlJjYXJvbj03MjI7dC5HY29tbWFhY2NlbnQ9Nzc4O3QudWNpcmN1bWZsZXg9NTU2O3QuYWNpcmN1bWZsZXg9NTU2O3QuQW1hY3Jvbj02Njc7dC5yY2Fyb249MzMzO3QuY2NlZGlsbGE9NTAwO3QuWmRvdGFjY2VudD02MTE7dC5UaG9ybj02Njc7dC5PbWFjcm9uPTc3ODt0LlJhY3V0ZT03MjI7dC5TYWN1dGU9NjY3O3QuZGNhcm9uPTY0Mzt0LlVtYWNyb249NzIyO3QudXJpbmc9NTU2O3QudGhyZWVzdXBlcmlvcj0zMzM7dC5PZ3JhdmU9Nzc4O3QuQWdyYXZlPTY2Nzt0LkFicmV2ZT02Njc7dC5tdWx0aXBseT01ODQ7dC51YWN1dGU9NTU2O3QuVGNhcm9uPTYxMTt0LnBhcnRpYWxkaWZmPTQ3Njt0LnlkaWVyZXNpcz01MDA7dC5OYWN1dGU9NzIyO3QuaWNpcmN1bWZsZXg9Mjc4O3QuRWNpcmN1bWZsZXg9NjY3O3QuYWRpZXJlc2lzPTU1Njt0LmVkaWVyZXNpcz01NTY7dC5jYWN1dGU9NTAwO3QubmFjdXRlPTU1Njt0LnVtYWNyb249NTU2O3QuTmNhcm9uPTcyMjt0LklhY3V0ZT0yNzg7dC5wbHVzbWludXM9NTg0O3QuYnJva2VuYmFyPTI2MDt0LnJlZ2lzdGVyZWQ9NzM3O3QuR2JyZXZlPTc3ODt0Lklkb3RhY2NlbnQ9Mjc4O3Quc3VtbWF0aW9uPTYwMDt0LkVncmF2ZT02Njc7dC5yYWN1dGU9MzMzO3Qub21hY3Jvbj01NTY7dC5aYWN1dGU9NjExO3QuWmNhcm9uPTYxMTt0LmdyZWF0ZXJlcXVhbD01NDk7dC5FdGg9NzIyO3QuQ2NlZGlsbGE9NzIyO3QubGNvbW1hYWNjZW50PTIyMjt0LnRjYXJvbj0zMTc7dC5lb2dvbmVrPTU1Njt0LlVvZ29uZWs9NzIyO3QuQWFjdXRlPTY2Nzt0LkFkaWVyZXNpcz02Njc7dC5lZ3JhdmU9NTU2O3QuemFjdXRlPTUwMDt0LmlvZ29uZWs9MjIyO3QuT2FjdXRlPTc3ODt0Lm9hY3V0ZT01NTY7dC5hbWFjcm9uPTU1Njt0LnNhY3V0ZT01MDA7dC5pZGllcmVzaXM9Mjc4O3QuT2NpcmN1bWZsZXg9Nzc4O3QuVWdyYXZlPTcyMjt0LkRlbHRhPTYxMjt0LnRob3JuPTU1Njt0LnR3b3N1cGVyaW9yPTMzMzt0Lk9kaWVyZXNpcz03Nzg7dC5tdT01NTY7dC5pZ3JhdmU9Mjc4O3Qub2h1bmdhcnVtbGF1dD01NTY7dC5Fb2dvbmVrPTY2Nzt0LmRjcm9hdD01NTY7dC50aHJlZXF1YXJ0ZXJzPTgzNDt0LlNjZWRpbGxhPTY2Nzt0LmxjYXJvbj0yOTk7dC5LY29tbWFhY2NlbnQ9NjY3O3QuTGFjdXRlPTU1Njt0LnRyYWRlbWFyaz0xZTM7dC5lZG90YWNjZW50PTU1Njt0LklncmF2ZT0yNzg7dC5JbWFjcm9uPTI3ODt0LkxjYXJvbj01NTY7dC5vbmVoYWxmPTgzNDt0Lmxlc3NlcXVhbD01NDk7dC5vY2lyY3VtZmxleD01NTY7dC5udGlsZGU9NTU2O3QuVWh1bmdhcnVtbGF1dD03MjI7dC5FYWN1dGU9NjY3O3QuZW1hY3Jvbj01NTY7dC5nYnJldmU9NTU2O3Qub25lcXVhcnRlcj04MzQ7dC5TY2Fyb249NjY3O3QuU2NvbW1hYWNjZW50PTY2Nzt0Lk9odW5nYXJ1bWxhdXQ9Nzc4O3QuZGVncmVlPTQwMDt0Lm9ncmF2ZT01NTY7dC5DY2Fyb249NzIyO3QudWdyYXZlPTU1Njt0LnJhZGljYWw9NDUzO3QuRGNhcm9uPTcyMjt0LnJjb21tYWFjY2VudD0zMzM7dC5OdGlsZGU9NzIyO3Qub3RpbGRlPTU1Njt0LlJjb21tYWFjY2VudD03MjI7dC5MY29tbWFhY2NlbnQ9NTU2O3QuQXRpbGRlPTY2Nzt0LkFvZ29uZWs9NjY3O3QuQXJpbmc9NjY3O3QuT3RpbGRlPTc3ODt0Lnpkb3RhY2NlbnQ9NTAwO3QuRWNhcm9uPTY2Nzt0LklvZ29uZWs9Mjc4O3Qua2NvbW1hYWNjZW50PTUwMDt0Lm1pbnVzPTU4NDt0LkljaXJjdW1mbGV4PTI3ODt0Lm5jYXJvbj01NTY7dC50Y29tbWFhY2NlbnQ9Mjc4O3QubG9naWNhbG5vdD01ODQ7dC5vZGllcmVzaXM9NTU2O3QudWRpZXJlc2lzPTU1Njt0Lm5vdGVxdWFsPTU0OTt0Lmdjb21tYWFjY2VudD01NTY7dC5ldGg9NTU2O3QuemNhcm9uPTUwMDt0Lm5jb21tYWFjY2VudD01NTY7dC5vbmVzdXBlcmlvcj0zMzM7dC5pbWFjcm9uPTI3ODt0LkV1cm89NTU2fSkpO3RbIkhlbHZldGljYS1Cb2xkIl09KDAsaS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbih0KXt0LnNwYWNlPTI3ODt0LmV4Y2xhbT0zMzM7dC5xdW90ZWRibD00NzQ7dC5udW1iZXJzaWduPTU1Njt0LmRvbGxhcj01NTY7dC5wZXJjZW50PTg4OTt0LmFtcGVyc2FuZD03MjI7dC5xdW90ZXJpZ2h0PTI3ODt0LnBhcmVubGVmdD0zMzM7dC5wYXJlbnJpZ2h0PTMzMzt0LmFzdGVyaXNrPTM4OTt0LnBsdXM9NTg0O3QuY29tbWE9Mjc4O3QuaHlwaGVuPTMzMzt0LnBlcmlvZD0yNzg7dC5zbGFzaD0yNzg7dC56ZXJvPTU1Njt0Lm9uZT01NTY7dC50d289NTU2O3QudGhyZWU9NTU2O3QuZm91cj01NTY7dC5maXZlPTU1Njt0LnNpeD01NTY7dC5zZXZlbj01NTY7dC5laWdodD01NTY7dC5uaW5lPTU1Njt0LmNvbG9uPTMzMzt0LnNlbWljb2xvbj0zMzM7dC5sZXNzPTU4NDt0LmVxdWFsPTU4NDt0LmdyZWF0ZXI9NTg0O3QucXVlc3Rpb249NjExO3QuYXQ9OTc1O3QuQT03MjI7dC5CPTcyMjt0LkM9NzIyO3QuRD03MjI7dC5FPTY2Nzt0LkY9NjExO3QuRz03Nzg7dC5IPTcyMjt0Lkk9Mjc4O3QuSj01NTY7dC5LPTcyMjt0Lkw9NjExO3QuTT04MzM7dC5OPTcyMjt0Lk89Nzc4O3QuUD02Njc7dC5RPTc3ODt0LlI9NzIyO3QuUz02Njc7dC5UPTYxMTt0LlU9NzIyO3QuVj02Njc7dC5XPTk0NDt0Llg9NjY3O3QuWT02Njc7dC5aPTYxMTt0LmJyYWNrZXRsZWZ0PTMzMzt0LmJhY2tzbGFzaD0yNzg7dC5icmFja2V0cmlnaHQ9MzMzO3QuYXNjaWljaXJjdW09NTg0O3QudW5kZXJzY29yZT01NTY7dC5xdW90ZWxlZnQ9Mjc4O3QuYT01NTY7dC5iPTYxMTt0LmM9NTU2O3QuZD02MTE7dC5lPTU1Njt0LmY9MzMzO3QuZz02MTE7dC5oPTYxMTt0Lmk9Mjc4O3Quaj0yNzg7dC5rPTU1Njt0Lmw9Mjc4O3QubT04ODk7dC5uPTYxMTt0Lm89NjExO3QucD02MTE7dC5xPTYxMTt0LnI9Mzg5O3Qucz01NTY7dC50PTMzMzt0LnU9NjExO3Qudj01NTY7dC53PTc3ODt0Lng9NTU2O3QueT01NTY7dC56PTUwMDt0LmJyYWNlbGVmdD0zODk7dC5iYXI9MjgwO3QuYnJhY2VyaWdodD0zODk7dC5hc2NpaXRpbGRlPTU4NDt0LmV4Y2xhbWRvd249MzMzO3QuY2VudD01NTY7dC5zdGVybGluZz01NTY7dC5mcmFjdGlvbj0xNjc7dC55ZW49NTU2O3QuZmxvcmluPTU1Njt0LnNlY3Rpb249NTU2O3QuY3VycmVuY3k9NTU2O3QucXVvdGVzaW5nbGU9MjM4O3QucXVvdGVkYmxsZWZ0PTUwMDt0Lmd1aWxsZW1vdGxlZnQ9NTU2O3QuZ3VpbHNpbmdsbGVmdD0zMzM7dC5ndWlsc2luZ2xyaWdodD0zMzM7dC5maT02MTE7dC5mbD02MTE7dC5lbmRhc2g9NTU2O3QuZGFnZ2VyPTU1Njt0LmRhZ2dlcmRibD01NTY7dC5wZXJpb2RjZW50ZXJlZD0yNzg7dC5wYXJhZ3JhcGg9NTU2O3QuYnVsbGV0PTM1MDt0LnF1b3Rlc2luZ2xiYXNlPTI3ODt0LnF1b3RlZGJsYmFzZT01MDA7dC5xdW90ZWRibHJpZ2h0PTUwMDt0Lmd1aWxsZW1vdHJpZ2h0PTU1Njt0LmVsbGlwc2lzPTFlMzt0LnBlcnRob3VzYW5kPTFlMzt0LnF1ZXN0aW9uZG93bj02MTE7dC5ncmF2ZT0zMzM7dC5hY3V0ZT0zMzM7dC5jaXJjdW1mbGV4PTMzMzt0LnRpbGRlPTMzMzt0Lm1hY3Jvbj0zMzM7dC5icmV2ZT0zMzM7dC5kb3RhY2NlbnQ9MzMzO3QuZGllcmVzaXM9MzMzO3QucmluZz0zMzM7dC5jZWRpbGxhPTMzMzt0Lmh1bmdhcnVtbGF1dD0zMzM7dC5vZ29uZWs9MzMzO3QuY2Fyb249MzMzO3QuZW1kYXNoPTFlMzt0LkFFPTFlMzt0Lm9yZGZlbWluaW5lPTM3MDt0LkxzbGFzaD02MTE7dC5Pc2xhc2g9Nzc4O3QuT0U9MWUzO3Qub3JkbWFzY3VsaW5lPTM2NTt0LmFlPTg4OTt0LmRvdGxlc3NpPTI3ODt0LmxzbGFzaD0yNzg7dC5vc2xhc2g9NjExO3Qub2U9OTQ0O3QuZ2VybWFuZGJscz02MTE7dC5JZGllcmVzaXM9Mjc4O3QuZWFjdXRlPTU1Njt0LmFicmV2ZT01NTY7dC51aHVuZ2FydW1sYXV0PTYxMTt0LmVjYXJvbj01NTY7dC5ZZGllcmVzaXM9NjY3O3QuZGl2aWRlPTU4NDt0LllhY3V0ZT02Njc7dC5BY2lyY3VtZmxleD03MjI7dC5hYWN1dGU9NTU2O3QuVWNpcmN1bWZsZXg9NzIyO3QueWFjdXRlPTU1Njt0LnNjb21tYWFjY2VudD01NTY7dC5lY2lyY3VtZmxleD01NTY7dC5VcmluZz03MjI7dC5VZGllcmVzaXM9NzIyO3QuYW9nb25laz01NTY7dC5VYWN1dGU9NzIyO3QudW9nb25laz02MTE7dC5FZGllcmVzaXM9NjY3O3QuRGNyb2F0PTcyMjt0LmNvbW1hYWNjZW50PTI1MDt0LmNvcHlyaWdodD03Mzc7dC5FbWFjcm9uPTY2Nzt0LmNjYXJvbj01NTY7dC5hcmluZz01NTY7dC5OY29tbWFhY2NlbnQ9NzIyO3QubGFjdXRlPTI3ODt0LmFncmF2ZT01NTY7dC5UY29tbWFhY2NlbnQ9NjExO3QuQ2FjdXRlPTcyMjt0LmF0aWxkZT01NTY7dC5FZG90YWNjZW50PTY2Nzt0LnNjYXJvbj01NTY7dC5zY2VkaWxsYT01NTY7dC5pYWN1dGU9Mjc4O3QubG96ZW5nZT00OTQ7dC5SY2Fyb249NzIyO3QuR2NvbW1hYWNjZW50PTc3ODt0LnVjaXJjdW1mbGV4PTYxMTt0LmFjaXJjdW1mbGV4PTU1Njt0LkFtYWNyb249NzIyO3QucmNhcm9uPTM4OTt0LmNjZWRpbGxhPTU1Njt0Llpkb3RhY2NlbnQ9NjExO3QuVGhvcm49NjY3O3QuT21hY3Jvbj03Nzg7dC5SYWN1dGU9NzIyO3QuU2FjdXRlPTY2Nzt0LmRjYXJvbj03NDM7dC5VbWFjcm9uPTcyMjt0LnVyaW5nPTYxMTt0LnRocmVlc3VwZXJpb3I9MzMzO3QuT2dyYXZlPTc3ODt0LkFncmF2ZT03MjI7dC5BYnJldmU9NzIyO3QubXVsdGlwbHk9NTg0O3QudWFjdXRlPTYxMTt0LlRjYXJvbj02MTE7dC5wYXJ0aWFsZGlmZj00OTQ7dC55ZGllcmVzaXM9NTU2O3QuTmFjdXRlPTcyMjt0LmljaXJjdW1mbGV4PTI3ODt0LkVjaXJjdW1mbGV4PTY2Nzt0LmFkaWVyZXNpcz01NTY7dC5lZGllcmVzaXM9NTU2O3QuY2FjdXRlPTU1Njt0Lm5hY3V0ZT02MTE7dC51bWFjcm9uPTYxMTt0Lk5jYXJvbj03MjI7dC5JYWN1dGU9Mjc4O3QucGx1c21pbnVzPTU4NDt0LmJyb2tlbmJhcj0yODA7dC5yZWdpc3RlcmVkPTczNzt0LkdicmV2ZT03Nzg7dC5JZG90YWNjZW50PTI3ODt0LnN1bW1hdGlvbj02MDA7dC5FZ3JhdmU9NjY3O3QucmFjdXRlPTM4OTt0Lm9tYWNyb249NjExO3QuWmFjdXRlPTYxMTt0LlpjYXJvbj02MTE7dC5ncmVhdGVyZXF1YWw9NTQ5O3QuRXRoPTcyMjt0LkNjZWRpbGxhPTcyMjt0Lmxjb21tYWFjY2VudD0yNzg7dC50Y2Fyb249Mzg5O3QuZW9nb25laz01NTY7dC5Vb2dvbmVrPTcyMjt0LkFhY3V0ZT03MjI7dC5BZGllcmVzaXM9NzIyO3QuZWdyYXZlPTU1Njt0LnphY3V0ZT01MDA7dC5pb2dvbmVrPTI3ODt0Lk9hY3V0ZT03Nzg7dC5vYWN1dGU9NjExO3QuYW1hY3Jvbj01NTY7dC5zYWN1dGU9NTU2O3QuaWRpZXJlc2lzPTI3ODt0Lk9jaXJjdW1mbGV4PTc3ODt0LlVncmF2ZT03MjI7dC5EZWx0YT02MTI7dC50aG9ybj02MTE7dC50d29zdXBlcmlvcj0zMzM7dC5PZGllcmVzaXM9Nzc4O3QubXU9NjExO3QuaWdyYXZlPTI3ODt0Lm9odW5nYXJ1bWxhdXQ9NjExO3QuRW9nb25laz02Njc7dC5kY3JvYXQ9NjExO3QudGhyZWVxdWFydGVycz04MzQ7dC5TY2VkaWxsYT02Njc7dC5sY2Fyb249NDAwO3QuS2NvbW1hYWNjZW50PTcyMjt0LkxhY3V0ZT02MTE7dC50cmFkZW1hcms9MWUzO3QuZWRvdGFjY2VudD01NTY7dC5JZ3JhdmU9Mjc4O3QuSW1hY3Jvbj0yNzg7dC5MY2Fyb249NjExO3Qub25laGFsZj04MzQ7dC5sZXNzZXF1YWw9NTQ5O3Qub2NpcmN1bWZsZXg9NjExO3QubnRpbGRlPTYxMTt0LlVodW5nYXJ1bWxhdXQ9NzIyO3QuRWFjdXRlPTY2Nzt0LmVtYWNyb249NTU2O3QuZ2JyZXZlPTYxMTt0Lm9uZXF1YXJ0ZXI9ODM0O3QuU2Nhcm9uPTY2Nzt0LlNjb21tYWFjY2VudD02Njc7dC5PaHVuZ2FydW1sYXV0PTc3ODt0LmRlZ3JlZT00MDA7dC5vZ3JhdmU9NjExO3QuQ2Nhcm9uPTcyMjt0LnVncmF2ZT02MTE7dC5yYWRpY2FsPTU0OTt0LkRjYXJvbj03MjI7dC5yY29tbWFhY2NlbnQ9Mzg5O3QuTnRpbGRlPTcyMjt0Lm90aWxkZT02MTE7dC5SY29tbWFhY2NlbnQ9NzIyO3QuTGNvbW1hYWNjZW50PTYxMTt0LkF0aWxkZT03MjI7dC5Bb2dvbmVrPTcyMjt0LkFyaW5nPTcyMjt0Lk90aWxkZT03Nzg7dC56ZG90YWNjZW50PTUwMDt0LkVjYXJvbj02Njc7dC5Jb2dvbmVrPTI3ODt0Lmtjb21tYWFjY2VudD01NTY7dC5taW51cz01ODQ7dC5JY2lyY3VtZmxleD0yNzg7dC5uY2Fyb249NjExO3QudGNvbW1hYWNjZW50PTMzMzt0LmxvZ2ljYWxub3Q9NTg0O3Qub2RpZXJlc2lzPTYxMTt0LnVkaWVyZXNpcz02MTE7dC5ub3RlcXVhbD01NDk7dC5nY29tbWFhY2NlbnQ9NjExO3QuZXRoPTYxMTt0LnpjYXJvbj01MDA7dC5uY29tbWFhY2NlbnQ9NjExO3Qub25lc3VwZXJpb3I9MzMzO3QuaW1hY3Jvbj0yNzg7dC5FdXJvPTU1Nn0pKTt0WyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXT0oMCxpLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKHQpe3Quc3BhY2U9Mjc4O3QuZXhjbGFtPTMzMzt0LnF1b3RlZGJsPTQ3NDt0Lm51bWJlcnNpZ249NTU2O3QuZG9sbGFyPTU1Njt0LnBlcmNlbnQ9ODg5O3QuYW1wZXJzYW5kPTcyMjt0LnF1b3RlcmlnaHQ9Mjc4O3QucGFyZW5sZWZ0PTMzMzt0LnBhcmVucmlnaHQ9MzMzO3QuYXN0ZXJpc2s9Mzg5O3QucGx1cz01ODQ7dC5jb21tYT0yNzg7dC5oeXBoZW49MzMzO3QucGVyaW9kPTI3ODt0LnNsYXNoPTI3ODt0Lnplcm89NTU2O3Qub25lPTU1Njt0LnR3bz01NTY7dC50aHJlZT01NTY7dC5mb3VyPTU1Njt0LmZpdmU9NTU2O3Quc2l4PTU1Njt0LnNldmVuPTU1Njt0LmVpZ2h0PTU1Njt0Lm5pbmU9NTU2O3QuY29sb249MzMzO3Quc2VtaWNvbG9uPTMzMzt0Lmxlc3M9NTg0O3QuZXF1YWw9NTg0O3QuZ3JlYXRlcj01ODQ7dC5xdWVzdGlvbj02MTE7dC5hdD05NzU7dC5BPTcyMjt0LkI9NzIyO3QuQz03MjI7dC5EPTcyMjt0LkU9NjY3O3QuRj02MTE7dC5HPTc3ODt0Lkg9NzIyO3QuST0yNzg7dC5KPTU1Njt0Lks9NzIyO3QuTD02MTE7dC5NPTgzMzt0Lk49NzIyO3QuTz03Nzg7dC5QPTY2Nzt0LlE9Nzc4O3QuUj03MjI7dC5TPTY2Nzt0LlQ9NjExO3QuVT03MjI7dC5WPTY2Nzt0Llc9OTQ0O3QuWD02Njc7dC5ZPTY2Nzt0Llo9NjExO3QuYnJhY2tldGxlZnQ9MzMzO3QuYmFja3NsYXNoPTI3ODt0LmJyYWNrZXRyaWdodD0zMzM7dC5hc2NpaWNpcmN1bT01ODQ7dC51bmRlcnNjb3JlPTU1Njt0LnF1b3RlbGVmdD0yNzg7dC5hPTU1Njt0LmI9NjExO3QuYz01NTY7dC5kPTYxMTt0LmU9NTU2O3QuZj0zMzM7dC5nPTYxMTt0Lmg9NjExO3QuaT0yNzg7dC5qPTI3ODt0Lms9NTU2O3QubD0yNzg7dC5tPTg4OTt0Lm49NjExO3Qubz02MTE7dC5wPTYxMTt0LnE9NjExO3Qucj0zODk7dC5zPTU1Njt0LnQ9MzMzO3QudT02MTE7dC52PTU1Njt0Lnc9Nzc4O3QueD01NTY7dC55PTU1Njt0Lno9NTAwO3QuYnJhY2VsZWZ0PTM4OTt0LmJhcj0yODA7dC5icmFjZXJpZ2h0PTM4OTt0LmFzY2lpdGlsZGU9NTg0O3QuZXhjbGFtZG93bj0zMzM7dC5jZW50PTU1Njt0LnN0ZXJsaW5nPTU1Njt0LmZyYWN0aW9uPTE2Nzt0Lnllbj01NTY7dC5mbG9yaW49NTU2O3Quc2VjdGlvbj01NTY7dC5jdXJyZW5jeT01NTY7dC5xdW90ZXNpbmdsZT0yMzg7dC5xdW90ZWRibGxlZnQ9NTAwO3QuZ3VpbGxlbW90bGVmdD01NTY7dC5ndWlsc2luZ2xsZWZ0PTMzMzt0Lmd1aWxzaW5nbHJpZ2h0PTMzMzt0LmZpPTYxMTt0LmZsPTYxMTt0LmVuZGFzaD01NTY7dC5kYWdnZXI9NTU2O3QuZGFnZ2VyZGJsPTU1Njt0LnBlcmlvZGNlbnRlcmVkPTI3ODt0LnBhcmFncmFwaD01NTY7dC5idWxsZXQ9MzUwO3QucXVvdGVzaW5nbGJhc2U9Mjc4O3QucXVvdGVkYmxiYXNlPTUwMDt0LnF1b3RlZGJscmlnaHQ9NTAwO3QuZ3VpbGxlbW90cmlnaHQ9NTU2O3QuZWxsaXBzaXM9MWUzO3QucGVydGhvdXNhbmQ9MWUzO3QucXVlc3Rpb25kb3duPTYxMTt0LmdyYXZlPTMzMzt0LmFjdXRlPTMzMzt0LmNpcmN1bWZsZXg9MzMzO3QudGlsZGU9MzMzO3QubWFjcm9uPTMzMzt0LmJyZXZlPTMzMzt0LmRvdGFjY2VudD0zMzM7dC5kaWVyZXNpcz0zMzM7dC5yaW5nPTMzMzt0LmNlZGlsbGE9MzMzO3QuaHVuZ2FydW1sYXV0PTMzMzt0Lm9nb25laz0zMzM7dC5jYXJvbj0zMzM7dC5lbWRhc2g9MWUzO3QuQUU9MWUzO3Qub3JkZmVtaW5pbmU9MzcwO3QuTHNsYXNoPTYxMTt0Lk9zbGFzaD03Nzg7dC5PRT0xZTM7dC5vcmRtYXNjdWxpbmU9MzY1O3QuYWU9ODg5O3QuZG90bGVzc2k9Mjc4O3QubHNsYXNoPTI3ODt0Lm9zbGFzaD02MTE7dC5vZT05NDQ7dC5nZXJtYW5kYmxzPTYxMTt0LklkaWVyZXNpcz0yNzg7dC5lYWN1dGU9NTU2O3QuYWJyZXZlPTU1Njt0LnVodW5nYXJ1bWxhdXQ9NjExO3QuZWNhcm9uPTU1Njt0LllkaWVyZXNpcz02Njc7dC5kaXZpZGU9NTg0O3QuWWFjdXRlPTY2Nzt0LkFjaXJjdW1mbGV4PTcyMjt0LmFhY3V0ZT01NTY7dC5VY2lyY3VtZmxleD03MjI7dC55YWN1dGU9NTU2O3Quc2NvbW1hYWNjZW50PTU1Njt0LmVjaXJjdW1mbGV4PTU1Njt0LlVyaW5nPTcyMjt0LlVkaWVyZXNpcz03MjI7dC5hb2dvbmVrPTU1Njt0LlVhY3V0ZT03MjI7dC51b2dvbmVrPTYxMTt0LkVkaWVyZXNpcz02Njc7dC5EY3JvYXQ9NzIyO3QuY29tbWFhY2NlbnQ9MjUwO3QuY29weXJpZ2h0PTczNzt0LkVtYWNyb249NjY3O3QuY2Nhcm9uPTU1Njt0LmFyaW5nPTU1Njt0Lk5jb21tYWFjY2VudD03MjI7dC5sYWN1dGU9Mjc4O3QuYWdyYXZlPTU1Njt0LlRjb21tYWFjY2VudD02MTE7dC5DYWN1dGU9NzIyO3QuYXRpbGRlPTU1Njt0LkVkb3RhY2NlbnQ9NjY3O3Quc2Nhcm9uPTU1Njt0LnNjZWRpbGxhPTU1Njt0LmlhY3V0ZT0yNzg7dC5sb3plbmdlPTQ5NDt0LlJjYXJvbj03MjI7dC5HY29tbWFhY2NlbnQ9Nzc4O3QudWNpcmN1bWZsZXg9NjExO3QuYWNpcmN1bWZsZXg9NTU2O3QuQW1hY3Jvbj03MjI7dC5yY2Fyb249Mzg5O3QuY2NlZGlsbGE9NTU2O3QuWmRvdGFjY2VudD02MTE7dC5UaG9ybj02Njc7dC5PbWFjcm9uPTc3ODt0LlJhY3V0ZT03MjI7dC5TYWN1dGU9NjY3O3QuZGNhcm9uPTc0Mzt0LlVtYWNyb249NzIyO3QudXJpbmc9NjExO3QudGhyZWVzdXBlcmlvcj0zMzM7dC5PZ3JhdmU9Nzc4O3QuQWdyYXZlPTcyMjt0LkFicmV2ZT03MjI7dC5tdWx0aXBseT01ODQ7dC51YWN1dGU9NjExO3QuVGNhcm9uPTYxMTt0LnBhcnRpYWxkaWZmPTQ5NDt0LnlkaWVyZXNpcz01NTY7dC5OYWN1dGU9NzIyO3QuaWNpcmN1bWZsZXg9Mjc4O3QuRWNpcmN1bWZsZXg9NjY3O3QuYWRpZXJlc2lzPTU1Njt0LmVkaWVyZXNpcz01NTY7dC5jYWN1dGU9NTU2O3QubmFjdXRlPTYxMTt0LnVtYWNyb249NjExO3QuTmNhcm9uPTcyMjt0LklhY3V0ZT0yNzg7dC5wbHVzbWludXM9NTg0O3QuYnJva2VuYmFyPTI4MDt0LnJlZ2lzdGVyZWQ9NzM3O3QuR2JyZXZlPTc3ODt0Lklkb3RhY2NlbnQ9Mjc4O3Quc3VtbWF0aW9uPTYwMDt0LkVncmF2ZT02Njc7dC5yYWN1dGU9Mzg5O3Qub21hY3Jvbj02MTE7dC5aYWN1dGU9NjExO3QuWmNhcm9uPTYxMTt0LmdyZWF0ZXJlcXVhbD01NDk7dC5FdGg9NzIyO3QuQ2NlZGlsbGE9NzIyO3QubGNvbW1hYWNjZW50PTI3ODt0LnRjYXJvbj0zODk7dC5lb2dvbmVrPTU1Njt0LlVvZ29uZWs9NzIyO3QuQWFjdXRlPTcyMjt0LkFkaWVyZXNpcz03MjI7dC5lZ3JhdmU9NTU2O3QuemFjdXRlPTUwMDt0LmlvZ29uZWs9Mjc4O3QuT2FjdXRlPTc3ODt0Lm9hY3V0ZT02MTE7dC5hbWFjcm9uPTU1Njt0LnNhY3V0ZT01NTY7dC5pZGllcmVzaXM9Mjc4O3QuT2NpcmN1bWZsZXg9Nzc4O3QuVWdyYXZlPTcyMjt0LkRlbHRhPTYxMjt0LnRob3JuPTYxMTt0LnR3b3N1cGVyaW9yPTMzMzt0Lk9kaWVyZXNpcz03Nzg7dC5tdT02MTE7dC5pZ3JhdmU9Mjc4O3Qub2h1bmdhcnVtbGF1dD02MTE7dC5Fb2dvbmVrPTY2Nzt0LmRjcm9hdD02MTE7dC50aHJlZXF1YXJ0ZXJzPTgzNDt0LlNjZWRpbGxhPTY2Nzt0LmxjYXJvbj00MDA7dC5LY29tbWFhY2NlbnQ9NzIyO3QuTGFjdXRlPTYxMTt0LnRyYWRlbWFyaz0xZTM7dC5lZG90YWNjZW50PTU1Njt0LklncmF2ZT0yNzg7dC5JbWFjcm9uPTI3ODt0LkxjYXJvbj02MTE7dC5vbmVoYWxmPTgzNDt0Lmxlc3NlcXVhbD01NDk7dC5vY2lyY3VtZmxleD02MTE7dC5udGlsZGU9NjExO3QuVWh1bmdhcnVtbGF1dD03MjI7dC5FYWN1dGU9NjY3O3QuZW1hY3Jvbj01NTY7dC5nYnJldmU9NjExO3Qub25lcXVhcnRlcj04MzQ7dC5TY2Fyb249NjY3O3QuU2NvbW1hYWNjZW50PTY2Nzt0Lk9odW5nYXJ1bWxhdXQ9Nzc4O3QuZGVncmVlPTQwMDt0Lm9ncmF2ZT02MTE7dC5DY2Fyb249NzIyO3QudWdyYXZlPTYxMTt0LnJhZGljYWw9NTQ5O3QuRGNhcm9uPTcyMjt0LnJjb21tYWFjY2VudD0zODk7dC5OdGlsZGU9NzIyO3Qub3RpbGRlPTYxMTt0LlJjb21tYWFjY2VudD03MjI7dC5MY29tbWFhY2NlbnQ9NjExO3QuQXRpbGRlPTcyMjt0LkFvZ29uZWs9NzIyO3QuQXJpbmc9NzIyO3QuT3RpbGRlPTc3ODt0Lnpkb3RhY2NlbnQ9NTAwO3QuRWNhcm9uPTY2Nzt0LklvZ29uZWs9Mjc4O3Qua2NvbW1hYWNjZW50PTU1Njt0Lm1pbnVzPTU4NDt0LkljaXJjdW1mbGV4PTI3ODt0Lm5jYXJvbj02MTE7dC50Y29tbWFhY2NlbnQ9MzMzO3QubG9naWNhbG5vdD01ODQ7dC5vZGllcmVzaXM9NjExO3QudWRpZXJlc2lzPTYxMTt0Lm5vdGVxdWFsPTU0OTt0Lmdjb21tYWFjY2VudD02MTE7dC5ldGg9NjExO3QuemNhcm9uPTUwMDt0Lm5jb21tYWFjY2VudD02MTE7dC5vbmVzdXBlcmlvcj0zMzM7dC5pbWFjcm9uPTI3ODt0LkV1cm89NTU2fSkpO3RbIkhlbHZldGljYS1PYmxpcXVlIl09KDAsaS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbih0KXt0LnNwYWNlPTI3ODt0LmV4Y2xhbT0yNzg7dC5xdW90ZWRibD0zNTU7dC5udW1iZXJzaWduPTU1Njt0LmRvbGxhcj01NTY7dC5wZXJjZW50PTg4OTt0LmFtcGVyc2FuZD02Njc7dC5xdW90ZXJpZ2h0PTIyMjt0LnBhcmVubGVmdD0zMzM7dC5wYXJlbnJpZ2h0PTMzMzt0LmFzdGVyaXNrPTM4OTt0LnBsdXM9NTg0O3QuY29tbWE9Mjc4O3QuaHlwaGVuPTMzMzt0LnBlcmlvZD0yNzg7dC5zbGFzaD0yNzg7dC56ZXJvPTU1Njt0Lm9uZT01NTY7dC50d289NTU2O3QudGhyZWU9NTU2O3QuZm91cj01NTY7dC5maXZlPTU1Njt0LnNpeD01NTY7dC5zZXZlbj01NTY7dC5laWdodD01NTY7dC5uaW5lPTU1Njt0LmNvbG9uPTI3ODt0LnNlbWljb2xvbj0yNzg7dC5sZXNzPTU4NDt0LmVxdWFsPTU4NDt0LmdyZWF0ZXI9NTg0O3QucXVlc3Rpb249NTU2O3QuYXQ9MTAxNTt0LkE9NjY3O3QuQj02Njc7dC5DPTcyMjt0LkQ9NzIyO3QuRT02Njc7dC5GPTYxMTt0Lkc9Nzc4O3QuSD03MjI7dC5JPTI3ODt0Lko9NTAwO3QuSz02Njc7dC5MPTU1Njt0Lk09ODMzO3QuTj03MjI7dC5PPTc3ODt0LlA9NjY3O3QuUT03Nzg7dC5SPTcyMjt0LlM9NjY3O3QuVD02MTE7dC5VPTcyMjt0LlY9NjY3O3QuVz05NDQ7dC5YPTY2Nzt0Llk9NjY3O3QuWj02MTE7dC5icmFja2V0bGVmdD0yNzg7dC5iYWNrc2xhc2g9Mjc4O3QuYnJhY2tldHJpZ2h0PTI3ODt0LmFzY2lpY2lyY3VtPTQ2OTt0LnVuZGVyc2NvcmU9NTU2O3QucXVvdGVsZWZ0PTIyMjt0LmE9NTU2O3QuYj01NTY7dC5jPTUwMDt0LmQ9NTU2O3QuZT01NTY7dC5mPTI3ODt0Lmc9NTU2O3QuaD01NTY7dC5pPTIyMjt0Lmo9MjIyO3Quaz01MDA7dC5sPTIyMjt0Lm09ODMzO3Qubj01NTY7dC5vPTU1Njt0LnA9NTU2O3QucT01NTY7dC5yPTMzMzt0LnM9NTAwO3QudD0yNzg7dC51PTU1Njt0LnY9NTAwO3Qudz03MjI7dC54PTUwMDt0Lnk9NTAwO3Quej01MDA7dC5icmFjZWxlZnQ9MzM0O3QuYmFyPTI2MDt0LmJyYWNlcmlnaHQ9MzM0O3QuYXNjaWl0aWxkZT01ODQ7dC5leGNsYW1kb3duPTMzMzt0LmNlbnQ9NTU2O3Quc3Rlcmxpbmc9NTU2O3QuZnJhY3Rpb249MTY3O3QueWVuPTU1Njt0LmZsb3Jpbj01NTY7dC5zZWN0aW9uPTU1Njt0LmN1cnJlbmN5PTU1Njt0LnF1b3Rlc2luZ2xlPTE5MTt0LnF1b3RlZGJsbGVmdD0zMzM7dC5ndWlsbGVtb3RsZWZ0PTU1Njt0Lmd1aWxzaW5nbGxlZnQ9MzMzO3QuZ3VpbHNpbmdscmlnaHQ9MzMzO3QuZmk9NTAwO3QuZmw9NTAwO3QuZW5kYXNoPTU1Njt0LmRhZ2dlcj01NTY7dC5kYWdnZXJkYmw9NTU2O3QucGVyaW9kY2VudGVyZWQ9Mjc4O3QucGFyYWdyYXBoPTUzNzt0LmJ1bGxldD0zNTA7dC5xdW90ZXNpbmdsYmFzZT0yMjI7dC5xdW90ZWRibGJhc2U9MzMzO3QucXVvdGVkYmxyaWdodD0zMzM7dC5ndWlsbGVtb3RyaWdodD01NTY7dC5lbGxpcHNpcz0xZTM7dC5wZXJ0aG91c2FuZD0xZTM7dC5xdWVzdGlvbmRvd249NjExO3QuZ3JhdmU9MzMzO3QuYWN1dGU9MzMzO3QuY2lyY3VtZmxleD0zMzM7dC50aWxkZT0zMzM7dC5tYWNyb249MzMzO3QuYnJldmU9MzMzO3QuZG90YWNjZW50PTMzMzt0LmRpZXJlc2lzPTMzMzt0LnJpbmc9MzMzO3QuY2VkaWxsYT0zMzM7dC5odW5nYXJ1bWxhdXQ9MzMzO3Qub2dvbmVrPTMzMzt0LmNhcm9uPTMzMzt0LmVtZGFzaD0xZTM7dC5BRT0xZTM7dC5vcmRmZW1pbmluZT0zNzA7dC5Mc2xhc2g9NTU2O3QuT3NsYXNoPTc3ODt0Lk9FPTFlMzt0Lm9yZG1hc2N1bGluZT0zNjU7dC5hZT04ODk7dC5kb3RsZXNzaT0yNzg7dC5sc2xhc2g9MjIyO3Qub3NsYXNoPTYxMTt0Lm9lPTk0NDt0Lmdlcm1hbmRibHM9NjExO3QuSWRpZXJlc2lzPTI3ODt0LmVhY3V0ZT01NTY7dC5hYnJldmU9NTU2O3QudWh1bmdhcnVtbGF1dD01NTY7dC5lY2Fyb249NTU2O3QuWWRpZXJlc2lzPTY2Nzt0LmRpdmlkZT01ODQ7dC5ZYWN1dGU9NjY3O3QuQWNpcmN1bWZsZXg9NjY3O3QuYWFjdXRlPTU1Njt0LlVjaXJjdW1mbGV4PTcyMjt0LnlhY3V0ZT01MDA7dC5zY29tbWFhY2NlbnQ9NTAwO3QuZWNpcmN1bWZsZXg9NTU2O3QuVXJpbmc9NzIyO3QuVWRpZXJlc2lzPTcyMjt0LmFvZ29uZWs9NTU2O3QuVWFjdXRlPTcyMjt0LnVvZ29uZWs9NTU2O3QuRWRpZXJlc2lzPTY2Nzt0LkRjcm9hdD03MjI7dC5jb21tYWFjY2VudD0yNTA7dC5jb3B5cmlnaHQ9NzM3O3QuRW1hY3Jvbj02Njc7dC5jY2Fyb249NTAwO3QuYXJpbmc9NTU2O3QuTmNvbW1hYWNjZW50PTcyMjt0LmxhY3V0ZT0yMjI7dC5hZ3JhdmU9NTU2O3QuVGNvbW1hYWNjZW50PTYxMTt0LkNhY3V0ZT03MjI7dC5hdGlsZGU9NTU2O3QuRWRvdGFjY2VudD02Njc7dC5zY2Fyb249NTAwO3Quc2NlZGlsbGE9NTAwO3QuaWFjdXRlPTI3ODt0LmxvemVuZ2U9NDcxO3QuUmNhcm9uPTcyMjt0Lkdjb21tYWFjY2VudD03Nzg7dC51Y2lyY3VtZmxleD01NTY7dC5hY2lyY3VtZmxleD01NTY7dC5BbWFjcm9uPTY2Nzt0LnJjYXJvbj0zMzM7dC5jY2VkaWxsYT01MDA7dC5aZG90YWNjZW50PTYxMTt0LlRob3JuPTY2Nzt0Lk9tYWNyb249Nzc4O3QuUmFjdXRlPTcyMjt0LlNhY3V0ZT02Njc7dC5kY2Fyb249NjQzO3QuVW1hY3Jvbj03MjI7dC51cmluZz01NTY7dC50aHJlZXN1cGVyaW9yPTMzMzt0Lk9ncmF2ZT03Nzg7dC5BZ3JhdmU9NjY3O3QuQWJyZXZlPTY2Nzt0Lm11bHRpcGx5PTU4NDt0LnVhY3V0ZT01NTY7dC5UY2Fyb249NjExO3QucGFydGlhbGRpZmY9NDc2O3QueWRpZXJlc2lzPTUwMDt0Lk5hY3V0ZT03MjI7dC5pY2lyY3VtZmxleD0yNzg7dC5FY2lyY3VtZmxleD02Njc7dC5hZGllcmVzaXM9NTU2O3QuZWRpZXJlc2lzPTU1Njt0LmNhY3V0ZT01MDA7dC5uYWN1dGU9NTU2O3QudW1hY3Jvbj01NTY7dC5OY2Fyb249NzIyO3QuSWFjdXRlPTI3ODt0LnBsdXNtaW51cz01ODQ7dC5icm9rZW5iYXI9MjYwO3QucmVnaXN0ZXJlZD03Mzc7dC5HYnJldmU9Nzc4O3QuSWRvdGFjY2VudD0yNzg7dC5zdW1tYXRpb249NjAwO3QuRWdyYXZlPTY2Nzt0LnJhY3V0ZT0zMzM7dC5vbWFjcm9uPTU1Njt0LlphY3V0ZT02MTE7dC5aY2Fyb249NjExO3QuZ3JlYXRlcmVxdWFsPTU0OTt0LkV0aD03MjI7dC5DY2VkaWxsYT03MjI7dC5sY29tbWFhY2NlbnQ9MjIyO3QudGNhcm9uPTMxNzt0LmVvZ29uZWs9NTU2O3QuVW9nb25laz03MjI7dC5BYWN1dGU9NjY3O3QuQWRpZXJlc2lzPTY2Nzt0LmVncmF2ZT01NTY7dC56YWN1dGU9NTAwO3QuaW9nb25laz0yMjI7dC5PYWN1dGU9Nzc4O3Qub2FjdXRlPTU1Njt0LmFtYWNyb249NTU2O3Quc2FjdXRlPTUwMDt0LmlkaWVyZXNpcz0yNzg7dC5PY2lyY3VtZmxleD03Nzg7dC5VZ3JhdmU9NzIyO3QuRGVsdGE9NjEyO3QudGhvcm49NTU2O3QudHdvc3VwZXJpb3I9MzMzO3QuT2RpZXJlc2lzPTc3ODt0Lm11PTU1Njt0LmlncmF2ZT0yNzg7dC5vaHVuZ2FydW1sYXV0PTU1Njt0LkVvZ29uZWs9NjY3O3QuZGNyb2F0PTU1Njt0LnRocmVlcXVhcnRlcnM9ODM0O3QuU2NlZGlsbGE9NjY3O3QubGNhcm9uPTI5OTt0Lktjb21tYWFjY2VudD02Njc7dC5MYWN1dGU9NTU2O3QudHJhZGVtYXJrPTFlMzt0LmVkb3RhY2NlbnQ9NTU2O3QuSWdyYXZlPTI3ODt0LkltYWNyb249Mjc4O3QuTGNhcm9uPTU1Njt0Lm9uZWhhbGY9ODM0O3QubGVzc2VxdWFsPTU0OTt0Lm9jaXJjdW1mbGV4PTU1Njt0Lm50aWxkZT01NTY7dC5VaHVuZ2FydW1sYXV0PTcyMjt0LkVhY3V0ZT02Njc7dC5lbWFjcm9uPTU1Njt0LmdicmV2ZT01NTY7dC5vbmVxdWFydGVyPTgzNDt0LlNjYXJvbj02Njc7dC5TY29tbWFhY2NlbnQ9NjY3O3QuT2h1bmdhcnVtbGF1dD03Nzg7dC5kZWdyZWU9NDAwO3Qub2dyYXZlPTU1Njt0LkNjYXJvbj03MjI7dC51Z3JhdmU9NTU2O3QucmFkaWNhbD00NTM7dC5EY2Fyb249NzIyO3QucmNvbW1hYWNjZW50PTMzMzt0Lk50aWxkZT03MjI7dC5vdGlsZGU9NTU2O3QuUmNvbW1hYWNjZW50PTcyMjt0Lkxjb21tYWFjY2VudD01NTY7dC5BdGlsZGU9NjY3O3QuQW9nb25laz02Njc7dC5BcmluZz02Njc7dC5PdGlsZGU9Nzc4O3QuemRvdGFjY2VudD01MDA7dC5FY2Fyb249NjY3O3QuSW9nb25laz0yNzg7dC5rY29tbWFhY2NlbnQ9NTAwO3QubWludXM9NTg0O3QuSWNpcmN1bWZsZXg9Mjc4O3QubmNhcm9uPTU1Njt0LnRjb21tYWFjY2VudD0yNzg7dC5sb2dpY2Fsbm90PTU4NDt0Lm9kaWVyZXNpcz01NTY7dC51ZGllcmVzaXM9NTU2O3Qubm90ZXF1YWw9NTQ5O3QuZ2NvbW1hYWNjZW50PTU1Njt0LmV0aD01NTY7dC56Y2Fyb249NTAwO3QubmNvbW1hYWNjZW50PTU1Njt0Lm9uZXN1cGVyaW9yPTMzMzt0LmltYWNyb249Mjc4O3QuRXVybz01NTZ9KSk7dC5TeW1ib2w9KDAsaS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbih0KXt0LnNwYWNlPTI1MDt0LmV4Y2xhbT0zMzM7dC51bml2ZXJzYWw9NzEzO3QubnVtYmVyc2lnbj01MDA7dC5leGlzdGVudGlhbD01NDk7dC5wZXJjZW50PTgzMzt0LmFtcGVyc2FuZD03Nzg7dC5zdWNodGhhdD00Mzk7dC5wYXJlbmxlZnQ9MzMzO3QucGFyZW5yaWdodD0zMzM7dC5hc3Rlcmlza21hdGg9NTAwO3QucGx1cz01NDk7dC5jb21tYT0yNTA7dC5taW51cz01NDk7dC5wZXJpb2Q9MjUwO3Quc2xhc2g9Mjc4O3QuemVybz01MDA7dC5vbmU9NTAwO3QudHdvPTUwMDt0LnRocmVlPTUwMDt0LmZvdXI9NTAwO3QuZml2ZT01MDA7dC5zaXg9NTAwO3Quc2V2ZW49NTAwO3QuZWlnaHQ9NTAwO3QubmluZT01MDA7dC5jb2xvbj0yNzg7dC5zZW1pY29sb249Mjc4O3QubGVzcz01NDk7dC5lcXVhbD01NDk7dC5ncmVhdGVyPTU0OTt0LnF1ZXN0aW9uPTQ0NDt0LmNvbmdydWVudD01NDk7dC5BbHBoYT03MjI7dC5CZXRhPTY2Nzt0LkNoaT03MjI7dC5EZWx0YT02MTI7dC5FcHNpbG9uPTYxMTt0LlBoaT03NjM7dC5HYW1tYT02MDM7dC5FdGE9NzIyO3QuSW90YT0zMzM7dC50aGV0YTE9NjMxO3QuS2FwcGE9NzIyO3QuTGFtYmRhPTY4Njt0Lk11PTg4OTt0Lk51PTcyMjt0Lk9taWNyb249NzIyO3QuUGk9NzY4O3QuVGhldGE9NzQxO3QuUmhvPTU1Njt0LlNpZ21hPTU5Mjt0LlRhdT02MTE7dC5VcHNpbG9uPTY5MDt0LnNpZ21hMT00Mzk7dC5PbWVnYT03Njg7dC5YaT02NDU7dC5Qc2k9Nzk1O3QuWmV0YT02MTE7dC5icmFja2V0bGVmdD0zMzM7dC50aGVyZWZvcmU9ODYzO3QuYnJhY2tldHJpZ2h0PTMzMzt0LnBlcnBlbmRpY3VsYXI9NjU4O3QudW5kZXJzY29yZT01MDA7dC5yYWRpY2FsZXg9NTAwO3QuYWxwaGE9NjMxO3QuYmV0YT01NDk7dC5jaGk9NTQ5O3QuZGVsdGE9NDk0O3QuZXBzaWxvbj00Mzk7dC5waGk9NTIxO3QuZ2FtbWE9NDExO3QuZXRhPTYwMzt0LmlvdGE9MzI5O3QucGhpMT02MDM7dC5rYXBwYT01NDk7dC5sYW1iZGE9NTQ5O3QubXU9NTc2O3QubnU9NTIxO3Qub21pY3Jvbj01NDk7dC5waT01NDk7dC50aGV0YT01MjE7dC5yaG89NTQ5O3Quc2lnbWE9NjAzO3QudGF1PTQzOTt0LnVwc2lsb249NTc2O3Qub21lZ2ExPTcxMzt0Lm9tZWdhPTY4Njt0LnhpPTQ5Mzt0LnBzaT02ODY7dC56ZXRhPTQ5NDt0LmJyYWNlbGVmdD00ODA7dC5iYXI9MjAwO3QuYnJhY2VyaWdodD00ODA7dC5zaW1pbGFyPTU0OTt0LkV1cm89NzUwO3QuVXBzaWxvbjE9NjIwO3QubWludXRlPTI0Nzt0Lmxlc3NlcXVhbD01NDk7dC5mcmFjdGlvbj0xNjc7dC5pbmZpbml0eT03MTM7dC5mbG9yaW49NTAwO3QuY2x1Yj03NTM7dC5kaWFtb25kPTc1Mzt0LmhlYXJ0PTc1Mzt0LnNwYWRlPTc1Mzt0LmFycm93Ym90aD0xMDQyO3QuYXJyb3dsZWZ0PTk4Nzt0LmFycm93dXA9NjAzO3QuYXJyb3dyaWdodD05ODc7dC5hcnJvd2Rvd249NjAzO3QuZGVncmVlPTQwMDt0LnBsdXNtaW51cz01NDk7dC5zZWNvbmQ9NDExO3QuZ3JlYXRlcmVxdWFsPTU0OTt0Lm11bHRpcGx5PTU0OTt0LnByb3BvcnRpb25hbD03MTM7dC5wYXJ0aWFsZGlmZj00OTQ7dC5idWxsZXQ9NDYwO3QuZGl2aWRlPTU0OTt0Lm5vdGVxdWFsPTU0OTt0LmVxdWl2YWxlbmNlPTU0OTt0LmFwcHJveGVxdWFsPTU0OTt0LmVsbGlwc2lzPTFlMzt0LmFycm93dmVydGV4PTYwMzt0LmFycm93aG9yaXpleD0xZTM7dC5jYXJyaWFnZXJldHVybj02NTg7dC5hbGVwaD04MjM7dC5JZnJha3R1cj02ODY7dC5SZnJha3R1cj03OTU7dC53ZWllcnN0cmFzcz05ODc7dC5jaXJjbGVtdWx0aXBseT03Njg7dC5jaXJjbGVwbHVzPTc2ODt0LmVtcHR5c2V0PTgyMzt0LmludGVyc2VjdGlvbj03Njg7dC51bmlvbj03Njg7dC5wcm9wZXJzdXBlcnNldD03MTM7dC5yZWZsZXhzdXBlcnNldD03MTM7dC5ub3RzdWJzZXQ9NzEzO3QucHJvcGVyc3Vic2V0PTcxMzt0LnJlZmxleHN1YnNldD03MTM7dC5lbGVtZW50PTcxMzt0Lm5vdGVsZW1lbnQ9NzEzO3QuYW5nbGU9NzY4O3QuZ3JhZGllbnQ9NzEzO3QucmVnaXN0ZXJzZXJpZj03OTA7dC5jb3B5cmlnaHRzZXJpZj03OTA7dC50cmFkZW1hcmtzZXJpZj04OTA7dC5wcm9kdWN0PTgyMzt0LnJhZGljYWw9NTQ5O3QuZG90bWF0aD0yNTA7dC5sb2dpY2Fsbm90PTcxMzt0LmxvZ2ljYWxhbmQ9NjAzO3QubG9naWNhbG9yPTYwMzt0LmFycm93ZGJsYm90aD0xMDQyO3QuYXJyb3dkYmxsZWZ0PTk4Nzt0LmFycm93ZGJsdXA9NjAzO3QuYXJyb3dkYmxyaWdodD05ODc7dC5hcnJvd2RibGRvd249NjAzO3QubG96ZW5nZT00OTQ7dC5hbmdsZWxlZnQ9MzI5O3QucmVnaXN0ZXJzYW5zPTc5MDt0LmNvcHlyaWdodHNhbnM9NzkwO3QudHJhZGVtYXJrc2Fucz03ODY7dC5zdW1tYXRpb249NzEzO3QucGFyZW5sZWZ0dHA9Mzg0O3QucGFyZW5sZWZ0ZXg9Mzg0O3QucGFyZW5sZWZ0YnQ9Mzg0O3QuYnJhY2tldGxlZnR0cD0zODQ7dC5icmFja2V0bGVmdGV4PTM4NDt0LmJyYWNrZXRsZWZ0YnQ9Mzg0O3QuYnJhY2VsZWZ0dHA9NDk0O3QuYnJhY2VsZWZ0bWlkPTQ5NDt0LmJyYWNlbGVmdGJ0PTQ5NDt0LmJyYWNlZXg9NDk0O3QuYW5nbGVyaWdodD0zMjk7dC5pbnRlZ3JhbD0yNzQ7dC5pbnRlZ3JhbHRwPTY4Njt0LmludGVncmFsZXg9Njg2O3QuaW50ZWdyYWxidD02ODY7dC5wYXJlbnJpZ2h0dHA9Mzg0O3QucGFyZW5yaWdodGV4PTM4NDt0LnBhcmVucmlnaHRidD0zODQ7dC5icmFja2V0cmlnaHR0cD0zODQ7dC5icmFja2V0cmlnaHRleD0zODQ7dC5icmFja2V0cmlnaHRidD0zODQ7dC5icmFjZXJpZ2h0dHA9NDk0O3QuYnJhY2VyaWdodG1pZD00OTQ7dC5icmFjZXJpZ2h0YnQ9NDk0O3QuYXBwbGU9NzkwfSkpO3RbIlRpbWVzLVJvbWFuIl09KDAsaS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbih0KXt0LnNwYWNlPTI1MDt0LmV4Y2xhbT0zMzM7dC5xdW90ZWRibD00MDg7dC5udW1iZXJzaWduPTUwMDt0LmRvbGxhcj01MDA7dC5wZXJjZW50PTgzMzt0LmFtcGVyc2FuZD03Nzg7dC5xdW90ZXJpZ2h0PTMzMzt0LnBhcmVubGVmdD0zMzM7dC5wYXJlbnJpZ2h0PTMzMzt0LmFzdGVyaXNrPTUwMDt0LnBsdXM9NTY0O3QuY29tbWE9MjUwO3QuaHlwaGVuPTMzMzt0LnBlcmlvZD0yNTA7dC5zbGFzaD0yNzg7dC56ZXJvPTUwMDt0Lm9uZT01MDA7dC50d289NTAwO3QudGhyZWU9NTAwO3QuZm91cj01MDA7dC5maXZlPTUwMDt0LnNpeD01MDA7dC5zZXZlbj01MDA7dC5laWdodD01MDA7dC5uaW5lPTUwMDt0LmNvbG9uPTI3ODt0LnNlbWljb2xvbj0yNzg7dC5sZXNzPTU2NDt0LmVxdWFsPTU2NDt0LmdyZWF0ZXI9NTY0O3QucXVlc3Rpb249NDQ0O3QuYXQ9OTIxO3QuQT03MjI7dC5CPTY2Nzt0LkM9NjY3O3QuRD03MjI7dC5FPTYxMTt0LkY9NTU2O3QuRz03MjI7dC5IPTcyMjt0Lkk9MzMzO3QuSj0zODk7dC5LPTcyMjt0Lkw9NjExO3QuTT04ODk7dC5OPTcyMjt0Lk89NzIyO3QuUD01NTY7dC5RPTcyMjt0LlI9NjY3O3QuUz01NTY7dC5UPTYxMTt0LlU9NzIyO3QuVj03MjI7dC5XPTk0NDt0Llg9NzIyO3QuWT03MjI7dC5aPTYxMTt0LmJyYWNrZXRsZWZ0PTMzMzt0LmJhY2tzbGFzaD0yNzg7dC5icmFja2V0cmlnaHQ9MzMzO3QuYXNjaWljaXJjdW09NDY5O3QudW5kZXJzY29yZT01MDA7dC5xdW90ZWxlZnQ9MzMzO3QuYT00NDQ7dC5iPTUwMDt0LmM9NDQ0O3QuZD01MDA7dC5lPTQ0NDt0LmY9MzMzO3QuZz01MDA7dC5oPTUwMDt0Lmk9Mjc4O3Quaj0yNzg7dC5rPTUwMDt0Lmw9Mjc4O3QubT03Nzg7dC5uPTUwMDt0Lm89NTAwO3QucD01MDA7dC5xPTUwMDt0LnI9MzMzO3Qucz0zODk7dC50PTI3ODt0LnU9NTAwO3Qudj01MDA7dC53PTcyMjt0Lng9NTAwO3QueT01MDA7dC56PTQ0NDt0LmJyYWNlbGVmdD00ODA7dC5iYXI9MjAwO3QuYnJhY2VyaWdodD00ODA7dC5hc2NpaXRpbGRlPTU0MTt0LmV4Y2xhbWRvd249MzMzO3QuY2VudD01MDA7dC5zdGVybGluZz01MDA7dC5mcmFjdGlvbj0xNjc7dC55ZW49NTAwO3QuZmxvcmluPTUwMDt0LnNlY3Rpb249NTAwO3QuY3VycmVuY3k9NTAwO3QucXVvdGVzaW5nbGU9MTgwO3QucXVvdGVkYmxsZWZ0PTQ0NDt0Lmd1aWxsZW1vdGxlZnQ9NTAwO3QuZ3VpbHNpbmdsbGVmdD0zMzM7dC5ndWlsc2luZ2xyaWdodD0zMzM7dC5maT01NTY7dC5mbD01NTY7dC5lbmRhc2g9NTAwO3QuZGFnZ2VyPTUwMDt0LmRhZ2dlcmRibD01MDA7dC5wZXJpb2RjZW50ZXJlZD0yNTA7dC5wYXJhZ3JhcGg9NDUzO3QuYnVsbGV0PTM1MDt0LnF1b3Rlc2luZ2xiYXNlPTMzMzt0LnF1b3RlZGJsYmFzZT00NDQ7dC5xdW90ZWRibHJpZ2h0PTQ0NDt0Lmd1aWxsZW1vdHJpZ2h0PTUwMDt0LmVsbGlwc2lzPTFlMzt0LnBlcnRob3VzYW5kPTFlMzt0LnF1ZXN0aW9uZG93bj00NDQ7dC5ncmF2ZT0zMzM7dC5hY3V0ZT0zMzM7dC5jaXJjdW1mbGV4PTMzMzt0LnRpbGRlPTMzMzt0Lm1hY3Jvbj0zMzM7dC5icmV2ZT0zMzM7dC5kb3RhY2NlbnQ9MzMzO3QuZGllcmVzaXM9MzMzO3QucmluZz0zMzM7dC5jZWRpbGxhPTMzMzt0Lmh1bmdhcnVtbGF1dD0zMzM7dC5vZ29uZWs9MzMzO3QuY2Fyb249MzMzO3QuZW1kYXNoPTFlMzt0LkFFPTg4OTt0Lm9yZGZlbWluaW5lPTI3Njt0LkxzbGFzaD02MTE7dC5Pc2xhc2g9NzIyO3QuT0U9ODg5O3Qub3JkbWFzY3VsaW5lPTMxMDt0LmFlPTY2Nzt0LmRvdGxlc3NpPTI3ODt0LmxzbGFzaD0yNzg7dC5vc2xhc2g9NTAwO3Qub2U9NzIyO3QuZ2VybWFuZGJscz01MDA7dC5JZGllcmVzaXM9MzMzO3QuZWFjdXRlPTQ0NDt0LmFicmV2ZT00NDQ7dC51aHVuZ2FydW1sYXV0PTUwMDt0LmVjYXJvbj00NDQ7dC5ZZGllcmVzaXM9NzIyO3QuZGl2aWRlPTU2NDt0LllhY3V0ZT03MjI7dC5BY2lyY3VtZmxleD03MjI7dC5hYWN1dGU9NDQ0O3QuVWNpcmN1bWZsZXg9NzIyO3QueWFjdXRlPTUwMDt0LnNjb21tYWFjY2VudD0zODk7dC5lY2lyY3VtZmxleD00NDQ7dC5VcmluZz03MjI7dC5VZGllcmVzaXM9NzIyO3QuYW9nb25laz00NDQ7dC5VYWN1dGU9NzIyO3QudW9nb25laz01MDA7dC5FZGllcmVzaXM9NjExO3QuRGNyb2F0PTcyMjt0LmNvbW1hYWNjZW50PTI1MDt0LmNvcHlyaWdodD03NjA7dC5FbWFjcm9uPTYxMTt0LmNjYXJvbj00NDQ7dC5hcmluZz00NDQ7dC5OY29tbWFhY2NlbnQ9NzIyO3QubGFjdXRlPTI3ODt0LmFncmF2ZT00NDQ7dC5UY29tbWFhY2NlbnQ9NjExO3QuQ2FjdXRlPTY2Nzt0LmF0aWxkZT00NDQ7dC5FZG90YWNjZW50PTYxMTt0LnNjYXJvbj0zODk7dC5zY2VkaWxsYT0zODk7dC5pYWN1dGU9Mjc4O3QubG96ZW5nZT00NzE7dC5SY2Fyb249NjY3O3QuR2NvbW1hYWNjZW50PTcyMjt0LnVjaXJjdW1mbGV4PTUwMDt0LmFjaXJjdW1mbGV4PTQ0NDt0LkFtYWNyb249NzIyO3QucmNhcm9uPTMzMzt0LmNjZWRpbGxhPTQ0NDt0Llpkb3RhY2NlbnQ9NjExO3QuVGhvcm49NTU2O3QuT21hY3Jvbj03MjI7dC5SYWN1dGU9NjY3O3QuU2FjdXRlPTU1Njt0LmRjYXJvbj01ODg7dC5VbWFjcm9uPTcyMjt0LnVyaW5nPTUwMDt0LnRocmVlc3VwZXJpb3I9MzAwO3QuT2dyYXZlPTcyMjt0LkFncmF2ZT03MjI7dC5BYnJldmU9NzIyO3QubXVsdGlwbHk9NTY0O3QudWFjdXRlPTUwMDt0LlRjYXJvbj02MTE7dC5wYXJ0aWFsZGlmZj00NzY7dC55ZGllcmVzaXM9NTAwO3QuTmFjdXRlPTcyMjt0LmljaXJjdW1mbGV4PTI3ODt0LkVjaXJjdW1mbGV4PTYxMTt0LmFkaWVyZXNpcz00NDQ7dC5lZGllcmVzaXM9NDQ0O3QuY2FjdXRlPTQ0NDt0Lm5hY3V0ZT01MDA7dC51bWFjcm9uPTUwMDt0Lk5jYXJvbj03MjI7dC5JYWN1dGU9MzMzO3QucGx1c21pbnVzPTU2NDt0LmJyb2tlbmJhcj0yMDA7dC5yZWdpc3RlcmVkPTc2MDt0LkdicmV2ZT03MjI7dC5JZG90YWNjZW50PTMzMzt0LnN1bW1hdGlvbj02MDA7dC5FZ3JhdmU9NjExO3QucmFjdXRlPTMzMzt0Lm9tYWNyb249NTAwO3QuWmFjdXRlPTYxMTt0LlpjYXJvbj02MTE7dC5ncmVhdGVyZXF1YWw9NTQ5O3QuRXRoPTcyMjt0LkNjZWRpbGxhPTY2Nzt0Lmxjb21tYWFjY2VudD0yNzg7dC50Y2Fyb249MzI2O3QuZW9nb25laz00NDQ7dC5Vb2dvbmVrPTcyMjt0LkFhY3V0ZT03MjI7dC5BZGllcmVzaXM9NzIyO3QuZWdyYXZlPTQ0NDt0LnphY3V0ZT00NDQ7dC5pb2dvbmVrPTI3ODt0Lk9hY3V0ZT03MjI7dC5vYWN1dGU9NTAwO3QuYW1hY3Jvbj00NDQ7dC5zYWN1dGU9Mzg5O3QuaWRpZXJlc2lzPTI3ODt0Lk9jaXJjdW1mbGV4PTcyMjt0LlVncmF2ZT03MjI7dC5EZWx0YT02MTI7dC50aG9ybj01MDA7dC50d29zdXBlcmlvcj0zMDA7dC5PZGllcmVzaXM9NzIyO3QubXU9NTAwO3QuaWdyYXZlPTI3ODt0Lm9odW5nYXJ1bWxhdXQ9NTAwO3QuRW9nb25laz02MTE7dC5kY3JvYXQ9NTAwO3QudGhyZWVxdWFydGVycz03NTA7dC5TY2VkaWxsYT01NTY7dC5sY2Fyb249MzQ0O3QuS2NvbW1hYWNjZW50PTcyMjt0LkxhY3V0ZT02MTE7dC50cmFkZW1hcms9OTgwO3QuZWRvdGFjY2VudD00NDQ7dC5JZ3JhdmU9MzMzO3QuSW1hY3Jvbj0zMzM7dC5MY2Fyb249NjExO3Qub25laGFsZj03NTA7dC5sZXNzZXF1YWw9NTQ5O3Qub2NpcmN1bWZsZXg9NTAwO3QubnRpbGRlPTUwMDt0LlVodW5nYXJ1bWxhdXQ9NzIyO3QuRWFjdXRlPTYxMTt0LmVtYWNyb249NDQ0O3QuZ2JyZXZlPTUwMDt0Lm9uZXF1YXJ0ZXI9NzUwO3QuU2Nhcm9uPTU1Njt0LlNjb21tYWFjY2VudD01NTY7dC5PaHVuZ2FydW1sYXV0PTcyMjt0LmRlZ3JlZT00MDA7dC5vZ3JhdmU9NTAwO3QuQ2Nhcm9uPTY2Nzt0LnVncmF2ZT01MDA7dC5yYWRpY2FsPTQ1Mzt0LkRjYXJvbj03MjI7dC5yY29tbWFhY2NlbnQ9MzMzO3QuTnRpbGRlPTcyMjt0Lm90aWxkZT01MDA7dC5SY29tbWFhY2NlbnQ9NjY3O3QuTGNvbW1hYWNjZW50PTYxMTt0LkF0aWxkZT03MjI7dC5Bb2dvbmVrPTcyMjt0LkFyaW5nPTcyMjt0Lk90aWxkZT03MjI7dC56ZG90YWNjZW50PTQ0NDt0LkVjYXJvbj02MTE7dC5Jb2dvbmVrPTMzMzt0Lmtjb21tYWFjY2VudD01MDA7dC5taW51cz01NjQ7dC5JY2lyY3VtZmxleD0zMzM7dC5uY2Fyb249NTAwO3QudGNvbW1hYWNjZW50PTI3ODt0LmxvZ2ljYWxub3Q9NTY0O3Qub2RpZXJlc2lzPTUwMDt0LnVkaWVyZXNpcz01MDA7dC5ub3RlcXVhbD01NDk7dC5nY29tbWFhY2NlbnQ9NTAwO3QuZXRoPTUwMDt0LnpjYXJvbj00NDQ7dC5uY29tbWFhY2NlbnQ9NTAwO3Qub25lc3VwZXJpb3I9MzAwO3QuaW1hY3Jvbj0yNzg7dC5FdXJvPTUwMH0pKTt0WyJUaW1lcy1Cb2xkIl09KDAsaS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbih0KXt0LnNwYWNlPTI1MDt0LmV4Y2xhbT0zMzM7dC5xdW90ZWRibD01NTU7dC5udW1iZXJzaWduPTUwMDt0LmRvbGxhcj01MDA7dC5wZXJjZW50PTFlMzt0LmFtcGVyc2FuZD04MzM7dC5xdW90ZXJpZ2h0PTMzMzt0LnBhcmVubGVmdD0zMzM7dC5wYXJlbnJpZ2h0PTMzMzt0LmFzdGVyaXNrPTUwMDt0LnBsdXM9NTcwO3QuY29tbWE9MjUwO3QuaHlwaGVuPTMzMzt0LnBlcmlvZD0yNTA7dC5zbGFzaD0yNzg7dC56ZXJvPTUwMDt0Lm9uZT01MDA7dC50d289NTAwO3QudGhyZWU9NTAwO3QuZm91cj01MDA7dC5maXZlPTUwMDt0LnNpeD01MDA7dC5zZXZlbj01MDA7dC5laWdodD01MDA7dC5uaW5lPTUwMDt0LmNvbG9uPTMzMzt0LnNlbWljb2xvbj0zMzM7dC5sZXNzPTU3MDt0LmVxdWFsPTU3MDt0LmdyZWF0ZXI9NTcwO3QucXVlc3Rpb249NTAwO3QuYXQ9OTMwO3QuQT03MjI7dC5CPTY2Nzt0LkM9NzIyO3QuRD03MjI7dC5FPTY2Nzt0LkY9NjExO3QuRz03Nzg7dC5IPTc3ODt0Lkk9Mzg5O3QuSj01MDA7dC5LPTc3ODt0Lkw9NjY3O3QuTT05NDQ7dC5OPTcyMjt0Lk89Nzc4O3QuUD02MTE7dC5RPTc3ODt0LlI9NzIyO3QuUz01NTY7dC5UPTY2Nzt0LlU9NzIyO3QuVj03MjI7dC5XPTFlMzt0Llg9NzIyO3QuWT03MjI7dC5aPTY2Nzt0LmJyYWNrZXRsZWZ0PTMzMzt0LmJhY2tzbGFzaD0yNzg7dC5icmFja2V0cmlnaHQ9MzMzO3QuYXNjaWljaXJjdW09NTgxO3QudW5kZXJzY29yZT01MDA7dC5xdW90ZWxlZnQ9MzMzO3QuYT01MDA7dC5iPTU1Njt0LmM9NDQ0O3QuZD01NTY7dC5lPTQ0NDt0LmY9MzMzO3QuZz01MDA7dC5oPTU1Njt0Lmk9Mjc4O3Quaj0zMzM7dC5rPTU1Njt0Lmw9Mjc4O3QubT04MzM7dC5uPTU1Njt0Lm89NTAwO3QucD01NTY7dC5xPTU1Njt0LnI9NDQ0O3Qucz0zODk7dC50PTMzMzt0LnU9NTU2O3Qudj01MDA7dC53PTcyMjt0Lng9NTAwO3QueT01MDA7dC56PTQ0NDt0LmJyYWNlbGVmdD0zOTQ7dC5iYXI9MjIwO3QuYnJhY2VyaWdodD0zOTQ7dC5hc2NpaXRpbGRlPTUyMDt0LmV4Y2xhbWRvd249MzMzO3QuY2VudD01MDA7dC5zdGVybGluZz01MDA7dC5mcmFjdGlvbj0xNjc7dC55ZW49NTAwO3QuZmxvcmluPTUwMDt0LnNlY3Rpb249NTAwO3QuY3VycmVuY3k9NTAwO3QucXVvdGVzaW5nbGU9Mjc4O3QucXVvdGVkYmxsZWZ0PTUwMDt0Lmd1aWxsZW1vdGxlZnQ9NTAwO3QuZ3VpbHNpbmdsbGVmdD0zMzM7dC5ndWlsc2luZ2xyaWdodD0zMzM7dC5maT01NTY7dC5mbD01NTY7dC5lbmRhc2g9NTAwO3QuZGFnZ2VyPTUwMDt0LmRhZ2dlcmRibD01MDA7dC5wZXJpb2RjZW50ZXJlZD0yNTA7dC5wYXJhZ3JhcGg9NTQwO3QuYnVsbGV0PTM1MDt0LnF1b3Rlc2luZ2xiYXNlPTMzMzt0LnF1b3RlZGJsYmFzZT01MDA7dC5xdW90ZWRibHJpZ2h0PTUwMDt0Lmd1aWxsZW1vdHJpZ2h0PTUwMDt0LmVsbGlwc2lzPTFlMzt0LnBlcnRob3VzYW5kPTFlMzt0LnF1ZXN0aW9uZG93bj01MDA7dC5ncmF2ZT0zMzM7dC5hY3V0ZT0zMzM7dC5jaXJjdW1mbGV4PTMzMzt0LnRpbGRlPTMzMzt0Lm1hY3Jvbj0zMzM7dC5icmV2ZT0zMzM7dC5kb3RhY2NlbnQ9MzMzO3QuZGllcmVzaXM9MzMzO3QucmluZz0zMzM7dC5jZWRpbGxhPTMzMzt0Lmh1bmdhcnVtbGF1dD0zMzM7dC5vZ29uZWs9MzMzO3QuY2Fyb249MzMzO3QuZW1kYXNoPTFlMzt0LkFFPTFlMzt0Lm9yZGZlbWluaW5lPTMwMDt0LkxzbGFzaD02Njc7dC5Pc2xhc2g9Nzc4O3QuT0U9MWUzO3Qub3JkbWFzY3VsaW5lPTMzMDt0LmFlPTcyMjt0LmRvdGxlc3NpPTI3ODt0LmxzbGFzaD0yNzg7dC5vc2xhc2g9NTAwO3Qub2U9NzIyO3QuZ2VybWFuZGJscz01NTY7dC5JZGllcmVzaXM9Mzg5O3QuZWFjdXRlPTQ0NDt0LmFicmV2ZT01MDA7dC51aHVuZ2FydW1sYXV0PTU1Njt0LmVjYXJvbj00NDQ7dC5ZZGllcmVzaXM9NzIyO3QuZGl2aWRlPTU3MDt0LllhY3V0ZT03MjI7dC5BY2lyY3VtZmxleD03MjI7dC5hYWN1dGU9NTAwO3QuVWNpcmN1bWZsZXg9NzIyO3QueWFjdXRlPTUwMDt0LnNjb21tYWFjY2VudD0zODk7dC5lY2lyY3VtZmxleD00NDQ7dC5VcmluZz03MjI7dC5VZGllcmVzaXM9NzIyO3QuYW9nb25laz01MDA7dC5VYWN1dGU9NzIyO3QudW9nb25laz01NTY7dC5FZGllcmVzaXM9NjY3O3QuRGNyb2F0PTcyMjt0LmNvbW1hYWNjZW50PTI1MDt0LmNvcHlyaWdodD03NDc7dC5FbWFjcm9uPTY2Nzt0LmNjYXJvbj00NDQ7dC5hcmluZz01MDA7dC5OY29tbWFhY2NlbnQ9NzIyO3QubGFjdXRlPTI3ODt0LmFncmF2ZT01MDA7dC5UY29tbWFhY2NlbnQ9NjY3O3QuQ2FjdXRlPTcyMjt0LmF0aWxkZT01MDA7dC5FZG90YWNjZW50PTY2Nzt0LnNjYXJvbj0zODk7dC5zY2VkaWxsYT0zODk7dC5pYWN1dGU9Mjc4O3QubG96ZW5nZT00OTQ7dC5SY2Fyb249NzIyO3QuR2NvbW1hYWNjZW50PTc3ODt0LnVjaXJjdW1mbGV4PTU1Njt0LmFjaXJjdW1mbGV4PTUwMDt0LkFtYWNyb249NzIyO3QucmNhcm9uPTQ0NDt0LmNjZWRpbGxhPTQ0NDt0Llpkb3RhY2NlbnQ9NjY3O3QuVGhvcm49NjExO3QuT21hY3Jvbj03Nzg7dC5SYWN1dGU9NzIyO3QuU2FjdXRlPTU1Njt0LmRjYXJvbj02NzI7dC5VbWFjcm9uPTcyMjt0LnVyaW5nPTU1Njt0LnRocmVlc3VwZXJpb3I9MzAwO3QuT2dyYXZlPTc3ODt0LkFncmF2ZT03MjI7dC5BYnJldmU9NzIyO3QubXVsdGlwbHk9NTcwO3QudWFjdXRlPTU1Njt0LlRjYXJvbj02Njc7dC5wYXJ0aWFsZGlmZj00OTQ7dC55ZGllcmVzaXM9NTAwO3QuTmFjdXRlPTcyMjt0LmljaXJjdW1mbGV4PTI3ODt0LkVjaXJjdW1mbGV4PTY2Nzt0LmFkaWVyZXNpcz01MDA7dC5lZGllcmVzaXM9NDQ0O3QuY2FjdXRlPTQ0NDt0Lm5hY3V0ZT01NTY7dC51bWFjcm9uPTU1Njt0Lk5jYXJvbj03MjI7dC5JYWN1dGU9Mzg5O3QucGx1c21pbnVzPTU3MDt0LmJyb2tlbmJhcj0yMjA7dC5yZWdpc3RlcmVkPTc0Nzt0LkdicmV2ZT03Nzg7dC5JZG90YWNjZW50PTM4OTt0LnN1bW1hdGlvbj02MDA7dC5FZ3JhdmU9NjY3O3QucmFjdXRlPTQ0NDt0Lm9tYWNyb249NTAwO3QuWmFjdXRlPTY2Nzt0LlpjYXJvbj02Njc7dC5ncmVhdGVyZXF1YWw9NTQ5O3QuRXRoPTcyMjt0LkNjZWRpbGxhPTcyMjt0Lmxjb21tYWFjY2VudD0yNzg7dC50Y2Fyb249NDE2O3QuZW9nb25laz00NDQ7dC5Vb2dvbmVrPTcyMjt0LkFhY3V0ZT03MjI7dC5BZGllcmVzaXM9NzIyO3QuZWdyYXZlPTQ0NDt0LnphY3V0ZT00NDQ7dC5pb2dvbmVrPTI3ODt0Lk9hY3V0ZT03Nzg7dC5vYWN1dGU9NTAwO3QuYW1hY3Jvbj01MDA7dC5zYWN1dGU9Mzg5O3QuaWRpZXJlc2lzPTI3ODt0Lk9jaXJjdW1mbGV4PTc3ODt0LlVncmF2ZT03MjI7dC5EZWx0YT02MTI7dC50aG9ybj01NTY7dC50d29zdXBlcmlvcj0zMDA7dC5PZGllcmVzaXM9Nzc4O3QubXU9NTU2O3QuaWdyYXZlPTI3ODt0Lm9odW5nYXJ1bWxhdXQ9NTAwO3QuRW9nb25laz02Njc7dC5kY3JvYXQ9NTU2O3QudGhyZWVxdWFydGVycz03NTA7dC5TY2VkaWxsYT01NTY7dC5sY2Fyb249Mzk0O3QuS2NvbW1hYWNjZW50PTc3ODt0LkxhY3V0ZT02Njc7dC50cmFkZW1hcms9MWUzO3QuZWRvdGFjY2VudD00NDQ7dC5JZ3JhdmU9Mzg5O3QuSW1hY3Jvbj0zODk7dC5MY2Fyb249NjY3O3Qub25laGFsZj03NTA7dC5sZXNzZXF1YWw9NTQ5O3Qub2NpcmN1bWZsZXg9NTAwO3QubnRpbGRlPTU1Njt0LlVodW5nYXJ1bWxhdXQ9NzIyO3QuRWFjdXRlPTY2Nzt0LmVtYWNyb249NDQ0O3QuZ2JyZXZlPTUwMDt0Lm9uZXF1YXJ0ZXI9NzUwO3QuU2Nhcm9uPTU1Njt0LlNjb21tYWFjY2VudD01NTY7dC5PaHVuZ2FydW1sYXV0PTc3ODt0LmRlZ3JlZT00MDA7dC5vZ3JhdmU9NTAwO3QuQ2Nhcm9uPTcyMjt0LnVncmF2ZT01NTY7dC5yYWRpY2FsPTU0OTt0LkRjYXJvbj03MjI7dC5yY29tbWFhY2NlbnQ9NDQ0O3QuTnRpbGRlPTcyMjt0Lm90aWxkZT01MDA7dC5SY29tbWFhY2NlbnQ9NzIyO3QuTGNvbW1hYWNjZW50PTY2Nzt0LkF0aWxkZT03MjI7dC5Bb2dvbmVrPTcyMjt0LkFyaW5nPTcyMjt0Lk90aWxkZT03Nzg7dC56ZG90YWNjZW50PTQ0NDt0LkVjYXJvbj02Njc7dC5Jb2dvbmVrPTM4OTt0Lmtjb21tYWFjY2VudD01NTY7dC5taW51cz01NzA7dC5JY2lyY3VtZmxleD0zODk7dC5uY2Fyb249NTU2O3QudGNvbW1hYWNjZW50PTMzMzt0LmxvZ2ljYWxub3Q9NTcwO3Qub2RpZXJlc2lzPTUwMDt0LnVkaWVyZXNpcz01NTY7dC5ub3RlcXVhbD01NDk7dC5nY29tbWFhY2NlbnQ9NTAwO3QuZXRoPTUwMDt0LnpjYXJvbj00NDQ7dC5uY29tbWFhY2NlbnQ9NTU2O3Qub25lc3VwZXJpb3I9MzAwO3QuaW1hY3Jvbj0yNzg7dC5FdXJvPTUwMH0pKTt0WyJUaW1lcy1Cb2xkSXRhbGljIl09KDAsaS5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbih0KXt0LnNwYWNlPTI1MDt0LmV4Y2xhbT0zODk7dC5xdW90ZWRibD01NTU7dC5udW1iZXJzaWduPTUwMDt0LmRvbGxhcj01MDA7dC5wZXJjZW50PTgzMzt0LmFtcGVyc2FuZD03Nzg7dC5xdW90ZXJpZ2h0PTMzMzt0LnBhcmVubGVmdD0zMzM7dC5wYXJlbnJpZ2h0PTMzMzt0LmFzdGVyaXNrPTUwMDt0LnBsdXM9NTcwO3QuY29tbWE9MjUwO3QuaHlwaGVuPTMzMzt0LnBlcmlvZD0yNTA7dC5zbGFzaD0yNzg7dC56ZXJvPTUwMDt0Lm9uZT01MDA7dC50d289NTAwO3QudGhyZWU9NTAwO3QuZm91cj01MDA7dC5maXZlPTUwMDt0LnNpeD01MDA7dC5zZXZlbj01MDA7dC5laWdodD01MDA7dC5uaW5lPTUwMDt0LmNvbG9uPTMzMzt0LnNlbWljb2xvbj0zMzM7dC5sZXNzPTU3MDt0LmVxdWFsPTU3MDt0LmdyZWF0ZXI9NTcwO3QucXVlc3Rpb249NTAwO3QuYXQ9ODMyO3QuQT02Njc7dC5CPTY2Nzt0LkM9NjY3O3QuRD03MjI7dC5FPTY2Nzt0LkY9NjY3O3QuRz03MjI7dC5IPTc3ODt0Lkk9Mzg5O3QuSj01MDA7dC5LPTY2Nzt0Lkw9NjExO3QuTT04ODk7dC5OPTcyMjt0Lk89NzIyO3QuUD02MTE7dC5RPTcyMjt0LlI9NjY3O3QuUz01NTY7dC5UPTYxMTt0LlU9NzIyO3QuVj02Njc7dC5XPTg4OTt0Llg9NjY3O3QuWT02MTE7dC5aPTYxMTt0LmJyYWNrZXRsZWZ0PTMzMzt0LmJhY2tzbGFzaD0yNzg7dC5icmFja2V0cmlnaHQ9MzMzO3QuYXNjaWljaXJjdW09NTcwO3QudW5kZXJzY29yZT01MDA7dC5xdW90ZWxlZnQ9MzMzO3QuYT01MDA7dC5iPTUwMDt0LmM9NDQ0O3QuZD01MDA7dC5lPTQ0NDt0LmY9MzMzO3QuZz01MDA7dC5oPTU1Njt0Lmk9Mjc4O3Quaj0yNzg7dC5rPTUwMDt0Lmw9Mjc4O3QubT03Nzg7dC5uPTU1Njt0Lm89NTAwO3QucD01MDA7dC5xPTUwMDt0LnI9Mzg5O3Qucz0zODk7dC50PTI3ODt0LnU9NTU2O3Qudj00NDQ7dC53PTY2Nzt0Lng9NTAwO3QueT00NDQ7dC56PTM4OTt0LmJyYWNlbGVmdD0zNDg7dC5iYXI9MjIwO3QuYnJhY2VyaWdodD0zNDg7dC5hc2NpaXRpbGRlPTU3MDt0LmV4Y2xhbWRvd249Mzg5O3QuY2VudD01MDA7dC5zdGVybGluZz01MDA7dC5mcmFjdGlvbj0xNjc7dC55ZW49NTAwO3QuZmxvcmluPTUwMDt0LnNlY3Rpb249NTAwO3QuY3VycmVuY3k9NTAwO3QucXVvdGVzaW5nbGU9Mjc4O3QucXVvdGVkYmxsZWZ0PTUwMDt0Lmd1aWxsZW1vdGxlZnQ9NTAwO3QuZ3VpbHNpbmdsbGVmdD0zMzM7dC5ndWlsc2luZ2xyaWdodD0zMzM7dC5maT01NTY7dC5mbD01NTY7dC5lbmRhc2g9NTAwO3QuZGFnZ2VyPTUwMDt0LmRhZ2dlcmRibD01MDA7dC5wZXJpb2RjZW50ZXJlZD0yNTA7dC5wYXJhZ3JhcGg9NTAwO3QuYnVsbGV0PTM1MDt0LnF1b3Rlc2luZ2xiYXNlPTMzMzt0LnF1b3RlZGJsYmFzZT01MDA7dC5xdW90ZWRibHJpZ2h0PTUwMDt0Lmd1aWxsZW1vdHJpZ2h0PTUwMDt0LmVsbGlwc2lzPTFlMzt0LnBlcnRob3VzYW5kPTFlMzt0LnF1ZXN0aW9uZG93bj01MDA7dC5ncmF2ZT0zMzM7dC5hY3V0ZT0zMzM7dC5jaXJjdW1mbGV4PTMzMzt0LnRpbGRlPTMzMzt0Lm1hY3Jvbj0zMzM7dC5icmV2ZT0zMzM7dC5kb3RhY2NlbnQ9MzMzO3QuZGllcmVzaXM9MzMzO3QucmluZz0zMzM7dC5jZWRpbGxhPTMzMzt0Lmh1bmdhcnVtbGF1dD0zMzM7dC5vZ29uZWs9MzMzO3QuY2Fyb249MzMzO3QuZW1kYXNoPTFlMzt0LkFFPTk0NDt0Lm9yZGZlbWluaW5lPTI2Njt0LkxzbGFzaD02MTE7dC5Pc2xhc2g9NzIyO3QuT0U9OTQ0O3Qub3JkbWFzY3VsaW5lPTMwMDt0LmFlPTcyMjt0LmRvdGxlc3NpPTI3ODt0LmxzbGFzaD0yNzg7dC5vc2xhc2g9NTAwO3Qub2U9NzIyO3QuZ2VybWFuZGJscz01MDA7dC5JZGllcmVzaXM9Mzg5O3QuZWFjdXRlPTQ0NDt0LmFicmV2ZT01MDA7dC51aHVuZ2FydW1sYXV0PTU1Njt0LmVjYXJvbj00NDQ7dC5ZZGllcmVzaXM9NjExO3QuZGl2aWRlPTU3MDt0LllhY3V0ZT02MTE7dC5BY2lyY3VtZmxleD02Njc7dC5hYWN1dGU9NTAwO3QuVWNpcmN1bWZsZXg9NzIyO3QueWFjdXRlPTQ0NDt0LnNjb21tYWFjY2VudD0zODk7dC5lY2lyY3VtZmxleD00NDQ7dC5VcmluZz03MjI7dC5VZGllcmVzaXM9NzIyO3QuYW9nb25laz01MDA7dC5VYWN1dGU9NzIyO3QudW9nb25laz01NTY7dC5FZGllcmVzaXM9NjY3O3QuRGNyb2F0PTcyMjt0LmNvbW1hYWNjZW50PTI1MDt0LmNvcHlyaWdodD03NDc7dC5FbWFjcm9uPTY2Nzt0LmNjYXJvbj00NDQ7dC5hcmluZz01MDA7dC5OY29tbWFhY2NlbnQ9NzIyO3QubGFjdXRlPTI3ODt0LmFncmF2ZT01MDA7dC5UY29tbWFhY2NlbnQ9NjExO3QuQ2FjdXRlPTY2Nzt0LmF0aWxkZT01MDA7dC5FZG90YWNjZW50PTY2Nzt0LnNjYXJvbj0zODk7dC5zY2VkaWxsYT0zODk7dC5pYWN1dGU9Mjc4O3QubG96ZW5nZT00OTQ7dC5SY2Fyb249NjY3O3QuR2NvbW1hYWNjZW50PTcyMjt0LnVjaXJjdW1mbGV4PTU1Njt0LmFjaXJjdW1mbGV4PTUwMDt0LkFtYWNyb249NjY3O3QucmNhcm9uPTM4OTt0LmNjZWRpbGxhPTQ0NDt0Llpkb3RhY2NlbnQ9NjExO3QuVGhvcm49NjExO3QuT21hY3Jvbj03MjI7dC5SYWN1dGU9NjY3O3QuU2FjdXRlPTU1Njt0LmRjYXJvbj02MDg7dC5VbWFjcm9uPTcyMjt0LnVyaW5nPTU1Njt0LnRocmVlc3VwZXJpb3I9MzAwO3QuT2dyYXZlPTcyMjt0LkFncmF2ZT02Njc7dC5BYnJldmU9NjY3O3QubXVsdGlwbHk9NTcwO3QudWFjdXRlPTU1Njt0LlRjYXJvbj02MTE7dC5wYXJ0aWFsZGlmZj00OTQ7dC55ZGllcmVzaXM9NDQ0O3QuTmFjdXRlPTcyMjt0LmljaXJjdW1mbGV4PTI3ODt0LkVjaXJjdW1mbGV4PTY2Nzt0LmFkaWVyZXNpcz01MDA7dC5lZGllcmVzaXM9NDQ0O3QuY2FjdXRlPTQ0NDt0Lm5hY3V0ZT01NTY7dC51bWFjcm9uPTU1Njt0Lk5jYXJvbj03MjI7dC5JYWN1dGU9Mzg5O3QucGx1c21pbnVzPTU3MDt0LmJyb2tlbmJhcj0yMjA7dC5yZWdpc3RlcmVkPTc0Nzt0LkdicmV2ZT03MjI7dC5JZG90YWNjZW50PTM4OTt0LnN1bW1hdGlvbj02MDA7dC5FZ3JhdmU9NjY3O3QucmFjdXRlPTM4OTt0Lm9tYWNyb249NTAwO3QuWmFjdXRlPTYxMTt0LlpjYXJvbj02MTE7dC5ncmVhdGVyZXF1YWw9NTQ5O3QuRXRoPTcyMjt0LkNjZWRpbGxhPTY2Nzt0Lmxjb21tYWFjY2VudD0yNzg7dC50Y2Fyb249MzY2O3QuZW9nb25laz00NDQ7dC5Vb2dvbmVrPTcyMjt0LkFhY3V0ZT02Njc7dC5BZGllcmVzaXM9NjY3O3QuZWdyYXZlPTQ0NDt0LnphY3V0ZT0zODk7dC5pb2dvbmVrPTI3ODt0Lk9hY3V0ZT03MjI7dC5vYWN1dGU9NTAwO3QuYW1hY3Jvbj01MDA7dC5zYWN1dGU9Mzg5O3QuaWRpZXJlc2lzPTI3ODt0Lk9jaXJjdW1mbGV4PTcyMjt0LlVncmF2ZT03MjI7dC5EZWx0YT02MTI7dC50aG9ybj01MDA7dC50d29zdXBlcmlvcj0zMDA7dC5PZGllcmVzaXM9NzIyO3QubXU9NTc2O3QuaWdyYXZlPTI3ODt0Lm9odW5nYXJ1bWxhdXQ9NTAwO3QuRW9nb25laz02Njc7dC5kY3JvYXQ9NTAwO3QudGhyZWVxdWFydGVycz03NTA7dC5TY2VkaWxsYT01NTY7dC5sY2Fyb249MzgyO3QuS2NvbW1hYWNjZW50PTY2Nzt0LkxhY3V0ZT02MTE7dC50cmFkZW1hcms9MWUzO3QuZWRvdGFjY2VudD00NDQ7dC5JZ3JhdmU9Mzg5O3QuSW1hY3Jvbj0zODk7dC5MY2Fyb249NjExO3Qub25laGFsZj03NTA7dC5sZXNzZXF1YWw9NTQ5O3Qub2NpcmN1bWZsZXg9NTAwO3QubnRpbGRlPTU1Njt0LlVodW5nYXJ1bWxhdXQ9NzIyO3QuRWFjdXRlPTY2Nzt0LmVtYWNyb249NDQ0O3QuZ2JyZXZlPTUwMDt0Lm9uZXF1YXJ0ZXI9NzUwO3QuU2Nhcm9uPTU1Njt0LlNjb21tYWFjY2VudD01NTY7dC5PaHVuZ2FydW1sYXV0PTcyMjt0LmRlZ3JlZT00MDA7dC5vZ3JhdmU9NTAwO3QuQ2Nhcm9uPTY2Nzt0LnVncmF2ZT01NTY7dC5yYWRpY2FsPTU0OTt0LkRjYXJvbj03MjI7dC5yY29tbWFhY2NlbnQ9Mzg5O3QuTnRpbGRlPTcyMjt0Lm90aWxkZT01MDA7dC5SY29tbWFhY2NlbnQ9NjY3O3QuTGNvbW1hYWNjZW50PTYxMTt0LkF0aWxkZT02Njc7dC5Bb2dvbmVrPTY2Nzt0LkFyaW5nPTY2Nzt0Lk90aWxkZT03MjI7dC56ZG90YWNjZW50PTM4OTt0LkVjYXJvbj02Njc7dC5Jb2dvbmVrPTM4OTt0Lmtjb21tYWFjY2VudD01MDA7dC5taW51cz02MDY7dC5JY2lyY3VtZmxleD0zODk7dC5uY2Fyb249NTU2O3QudGNvbW1hYWNjZW50PTI3ODt0LmxvZ2ljYWxub3Q9NjA2O3Qub2RpZXJlc2lzPTUwMDt0LnVkaWVyZXNpcz01NTY7dC5ub3RlcXVhbD01NDk7dC5nY29tbWFhY2NlbnQ9NTAwO3QuZXRoPTUwMDt0LnpjYXJvbj0zODk7dC5uY29tbWFhY2NlbnQ9NTU2O3Qub25lc3VwZXJpb3I9MzAwO3QuaW1hY3Jvbj0yNzg7dC5FdXJvPTUwMH0pKTt0WyJUaW1lcy1JdGFsaWMiXT0oMCxpLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKHQpe3Quc3BhY2U9MjUwO3QuZXhjbGFtPTMzMzt0LnF1b3RlZGJsPTQyMDt0Lm51bWJlcnNpZ249NTAwO3QuZG9sbGFyPTUwMDt0LnBlcmNlbnQ9ODMzO3QuYW1wZXJzYW5kPTc3ODt0LnF1b3RlcmlnaHQ9MzMzO3QucGFyZW5sZWZ0PTMzMzt0LnBhcmVucmlnaHQ9MzMzO3QuYXN0ZXJpc2s9NTAwO3QucGx1cz02NzU7dC5jb21tYT0yNTA7dC5oeXBoZW49MzMzO3QucGVyaW9kPTI1MDt0LnNsYXNoPTI3ODt0Lnplcm89NTAwO3Qub25lPTUwMDt0LnR3bz01MDA7dC50aHJlZT01MDA7dC5mb3VyPTUwMDt0LmZpdmU9NTAwO3Quc2l4PTUwMDt0LnNldmVuPTUwMDt0LmVpZ2h0PTUwMDt0Lm5pbmU9NTAwO3QuY29sb249MzMzO3Quc2VtaWNvbG9uPTMzMzt0Lmxlc3M9Njc1O3QuZXF1YWw9Njc1O3QuZ3JlYXRlcj02NzU7dC5xdWVzdGlvbj01MDA7dC5hdD05MjA7dC5BPTYxMTt0LkI9NjExO3QuQz02Njc7dC5EPTcyMjt0LkU9NjExO3QuRj02MTE7dC5HPTcyMjt0Lkg9NzIyO3QuST0zMzM7dC5KPTQ0NDt0Lks9NjY3O3QuTD01NTY7dC5NPTgzMzt0Lk49NjY3O3QuTz03MjI7dC5QPTYxMTt0LlE9NzIyO3QuUj02MTE7dC5TPTUwMDt0LlQ9NTU2O3QuVT03MjI7dC5WPTYxMTt0Llc9ODMzO3QuWD02MTE7dC5ZPTU1Njt0Llo9NTU2O3QuYnJhY2tldGxlZnQ9Mzg5O3QuYmFja3NsYXNoPTI3ODt0LmJyYWNrZXRyaWdodD0zODk7dC5hc2NpaWNpcmN1bT00MjI7dC51bmRlcnNjb3JlPTUwMDt0LnF1b3RlbGVmdD0zMzM7dC5hPTUwMDt0LmI9NTAwO3QuYz00NDQ7dC5kPTUwMDt0LmU9NDQ0O3QuZj0yNzg7dC5nPTUwMDt0Lmg9NTAwO3QuaT0yNzg7dC5qPTI3ODt0Lms9NDQ0O3QubD0yNzg7dC5tPTcyMjt0Lm49NTAwO3Qubz01MDA7dC5wPTUwMDt0LnE9NTAwO3Qucj0zODk7dC5zPTM4OTt0LnQ9Mjc4O3QudT01MDA7dC52PTQ0NDt0Lnc9NjY3O3QueD00NDQ7dC55PTQ0NDt0Lno9Mzg5O3QuYnJhY2VsZWZ0PTQwMDt0LmJhcj0yNzU7dC5icmFjZXJpZ2h0PTQwMDt0LmFzY2lpdGlsZGU9NTQxO3QuZXhjbGFtZG93bj0zODk7dC5jZW50PTUwMDt0LnN0ZXJsaW5nPTUwMDt0LmZyYWN0aW9uPTE2Nzt0Lnllbj01MDA7dC5mbG9yaW49NTAwO3Quc2VjdGlvbj01MDA7dC5jdXJyZW5jeT01MDA7dC5xdW90ZXNpbmdsZT0yMTQ7dC5xdW90ZWRibGxlZnQ9NTU2O3QuZ3VpbGxlbW90bGVmdD01MDA7dC5ndWlsc2luZ2xsZWZ0PTMzMzt0Lmd1aWxzaW5nbHJpZ2h0PTMzMzt0LmZpPTUwMDt0LmZsPTUwMDt0LmVuZGFzaD01MDA7dC5kYWdnZXI9NTAwO3QuZGFnZ2VyZGJsPTUwMDt0LnBlcmlvZGNlbnRlcmVkPTI1MDt0LnBhcmFncmFwaD01MjM7dC5idWxsZXQ9MzUwO3QucXVvdGVzaW5nbGJhc2U9MzMzO3QucXVvdGVkYmxiYXNlPTU1Njt0LnF1b3RlZGJscmlnaHQ9NTU2O3QuZ3VpbGxlbW90cmlnaHQ9NTAwO3QuZWxsaXBzaXM9ODg5O3QucGVydGhvdXNhbmQ9MWUzO3QucXVlc3Rpb25kb3duPTUwMDt0LmdyYXZlPTMzMzt0LmFjdXRlPTMzMzt0LmNpcmN1bWZsZXg9MzMzO3QudGlsZGU9MzMzO3QubWFjcm9uPTMzMzt0LmJyZXZlPTMzMzt0LmRvdGFjY2VudD0zMzM7dC5kaWVyZXNpcz0zMzM7dC5yaW5nPTMzMzt0LmNlZGlsbGE9MzMzO3QuaHVuZ2FydW1sYXV0PTMzMzt0Lm9nb25laz0zMzM7dC5jYXJvbj0zMzM7dC5lbWRhc2g9ODg5O3QuQUU9ODg5O3Qub3JkZmVtaW5pbmU9Mjc2O3QuTHNsYXNoPTU1Njt0Lk9zbGFzaD03MjI7dC5PRT05NDQ7dC5vcmRtYXNjdWxpbmU9MzEwO3QuYWU9NjY3O3QuZG90bGVzc2k9Mjc4O3QubHNsYXNoPTI3ODt0Lm9zbGFzaD01MDA7dC5vZT02Njc7dC5nZXJtYW5kYmxzPTUwMDt0LklkaWVyZXNpcz0zMzM7dC5lYWN1dGU9NDQ0O3QuYWJyZXZlPTUwMDt0LnVodW5nYXJ1bWxhdXQ9NTAwO3QuZWNhcm9uPTQ0NDt0LllkaWVyZXNpcz01NTY7dC5kaXZpZGU9Njc1O3QuWWFjdXRlPTU1Njt0LkFjaXJjdW1mbGV4PTYxMTt0LmFhY3V0ZT01MDA7dC5VY2lyY3VtZmxleD03MjI7dC55YWN1dGU9NDQ0O3Quc2NvbW1hYWNjZW50PTM4OTt0LmVjaXJjdW1mbGV4PTQ0NDt0LlVyaW5nPTcyMjt0LlVkaWVyZXNpcz03MjI7dC5hb2dvbmVrPTUwMDt0LlVhY3V0ZT03MjI7dC51b2dvbmVrPTUwMDt0LkVkaWVyZXNpcz02MTE7dC5EY3JvYXQ9NzIyO3QuY29tbWFhY2NlbnQ9MjUwO3QuY29weXJpZ2h0PTc2MDt0LkVtYWNyb249NjExO3QuY2Nhcm9uPTQ0NDt0LmFyaW5nPTUwMDt0Lk5jb21tYWFjY2VudD02Njc7dC5sYWN1dGU9Mjc4O3QuYWdyYXZlPTUwMDt0LlRjb21tYWFjY2VudD01NTY7dC5DYWN1dGU9NjY3O3QuYXRpbGRlPTUwMDt0LkVkb3RhY2NlbnQ9NjExO3Quc2Nhcm9uPTM4OTt0LnNjZWRpbGxhPTM4OTt0LmlhY3V0ZT0yNzg7dC5sb3plbmdlPTQ3MTt0LlJjYXJvbj02MTE7dC5HY29tbWFhY2NlbnQ9NzIyO3QudWNpcmN1bWZsZXg9NTAwO3QuYWNpcmN1bWZsZXg9NTAwO3QuQW1hY3Jvbj02MTE7dC5yY2Fyb249Mzg5O3QuY2NlZGlsbGE9NDQ0O3QuWmRvdGFjY2VudD01NTY7dC5UaG9ybj02MTE7dC5PbWFjcm9uPTcyMjt0LlJhY3V0ZT02MTE7dC5TYWN1dGU9NTAwO3QuZGNhcm9uPTU0NDt0LlVtYWNyb249NzIyO3QudXJpbmc9NTAwO3QudGhyZWVzdXBlcmlvcj0zMDA7dC5PZ3JhdmU9NzIyO3QuQWdyYXZlPTYxMTt0LkFicmV2ZT02MTE7dC5tdWx0aXBseT02NzU7dC51YWN1dGU9NTAwO3QuVGNhcm9uPTU1Njt0LnBhcnRpYWxkaWZmPTQ3Njt0LnlkaWVyZXNpcz00NDQ7dC5OYWN1dGU9NjY3O3QuaWNpcmN1bWZsZXg9Mjc4O3QuRWNpcmN1bWZsZXg9NjExO3QuYWRpZXJlc2lzPTUwMDt0LmVkaWVyZXNpcz00NDQ7dC5jYWN1dGU9NDQ0O3QubmFjdXRlPTUwMDt0LnVtYWNyb249NTAwO3QuTmNhcm9uPTY2Nzt0LklhY3V0ZT0zMzM7dC5wbHVzbWludXM9Njc1O3QuYnJva2VuYmFyPTI3NTt0LnJlZ2lzdGVyZWQ9NzYwO3QuR2JyZXZlPTcyMjt0Lklkb3RhY2NlbnQ9MzMzO3Quc3VtbWF0aW9uPTYwMDt0LkVncmF2ZT02MTE7dC5yYWN1dGU9Mzg5O3Qub21hY3Jvbj01MDA7dC5aYWN1dGU9NTU2O3QuWmNhcm9uPTU1Njt0LmdyZWF0ZXJlcXVhbD01NDk7dC5FdGg9NzIyO3QuQ2NlZGlsbGE9NjY3O3QubGNvbW1hYWNjZW50PTI3ODt0LnRjYXJvbj0zMDA7dC5lb2dvbmVrPTQ0NDt0LlVvZ29uZWs9NzIyO3QuQWFjdXRlPTYxMTt0LkFkaWVyZXNpcz02MTE7dC5lZ3JhdmU9NDQ0O3QuemFjdXRlPTM4OTt0LmlvZ29uZWs9Mjc4O3QuT2FjdXRlPTcyMjt0Lm9hY3V0ZT01MDA7dC5hbWFjcm9uPTUwMDt0LnNhY3V0ZT0zODk7dC5pZGllcmVzaXM9Mjc4O3QuT2NpcmN1bWZsZXg9NzIyO3QuVWdyYXZlPTcyMjt0LkRlbHRhPTYxMjt0LnRob3JuPTUwMDt0LnR3b3N1cGVyaW9yPTMwMDt0Lk9kaWVyZXNpcz03MjI7dC5tdT01MDA7dC5pZ3JhdmU9Mjc4O3Qub2h1bmdhcnVtbGF1dD01MDA7dC5Fb2dvbmVrPTYxMTt0LmRjcm9hdD01MDA7dC50aHJlZXF1YXJ0ZXJzPTc1MDt0LlNjZWRpbGxhPTUwMDt0LmxjYXJvbj0zMDA7dC5LY29tbWFhY2NlbnQ9NjY3O3QuTGFjdXRlPTU1Njt0LnRyYWRlbWFyaz05ODA7dC5lZG90YWNjZW50PTQ0NDt0LklncmF2ZT0zMzM7dC5JbWFjcm9uPTMzMzt0LkxjYXJvbj02MTE7dC5vbmVoYWxmPTc1MDt0Lmxlc3NlcXVhbD01NDk7dC5vY2lyY3VtZmxleD01MDA7dC5udGlsZGU9NTAwO3QuVWh1bmdhcnVtbGF1dD03MjI7dC5FYWN1dGU9NjExO3QuZW1hY3Jvbj00NDQ7dC5nYnJldmU9NTAwO3Qub25lcXVhcnRlcj03NTA7dC5TY2Fyb249NTAwO3QuU2NvbW1hYWNjZW50PTUwMDt0Lk9odW5nYXJ1bWxhdXQ9NzIyO3QuZGVncmVlPTQwMDt0Lm9ncmF2ZT01MDA7dC5DY2Fyb249NjY3O3QudWdyYXZlPTUwMDt0LnJhZGljYWw9NDUzO3QuRGNhcm9uPTcyMjt0LnJjb21tYWFjY2VudD0zODk7dC5OdGlsZGU9NjY3O3Qub3RpbGRlPTUwMDt0LlJjb21tYWFjY2VudD02MTE7dC5MY29tbWFhY2NlbnQ9NTU2O3QuQXRpbGRlPTYxMTt0LkFvZ29uZWs9NjExO3QuQXJpbmc9NjExO3QuT3RpbGRlPTcyMjt0Lnpkb3RhY2NlbnQ9Mzg5O3QuRWNhcm9uPTYxMTt0LklvZ29uZWs9MzMzO3Qua2NvbW1hYWNjZW50PTQ0NDt0Lm1pbnVzPTY3NTt0LkljaXJjdW1mbGV4PTMzMzt0Lm5jYXJvbj01MDA7dC50Y29tbWFhY2NlbnQ9Mjc4O3QubG9naWNhbG5vdD02NzU7dC5vZGllcmVzaXM9NTAwO3QudWRpZXJlc2lzPTUwMDt0Lm5vdGVxdWFsPTU0OTt0Lmdjb21tYWFjY2VudD01MDA7dC5ldGg9NTAwO3QuemNhcm9uPTM4OTt0Lm5jb21tYWFjY2VudD01MDA7dC5vbmVzdXBlcmlvcj0zMDA7dC5pbWFjcm9uPTI3ODt0LkV1cm89NTAwfSkpO3QuWmFwZkRpbmdiYXRzPSgwLGkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24odCl7dC5zcGFjZT0yNzg7dC5hMT05NzQ7dC5hMj05NjE7dC5hMjAyPTk3NDt0LmEzPTk4MDt0LmE0PTcxOTt0LmE1PTc4OTt0LmExMTk9NzkwO3QuYTExOD03OTE7dC5hMTE3PTY5MDt0LmExMT05NjA7dC5hMTI9OTM5O3QuYTEzPTU0OTt0LmExND04NTU7dC5hMTU9OTExO3QuYTE2PTkzMzt0LmExMDU9OTExO3QuYTE3PTk0NTt0LmExOD05NzQ7dC5hMTk9NzU1O3QuYTIwPTg0Njt0LmEyMT03NjI7dC5hMjI9NzYxO3QuYTIzPTU3MTt0LmEyND02Nzc7dC5hMjU9NzYzO3QuYTI2PTc2MDt0LmEyNz03NTk7dC5hMjg9NzU0O3QuYTY9NDk0O3QuYTc9NTUyO3QuYTg9NTM3O3QuYTk9NTc3O3QuYTEwPTY5Mjt0LmEyOT03ODY7dC5hMzA9Nzg4O3QuYTMxPTc4ODt0LmEzMj03OTA7dC5hMzM9NzkzO3QuYTM0PTc5NDt0LmEzNT04MTY7dC5hMzY9ODIzO3QuYTM3PTc4OTt0LmEzOD04NDE7dC5hMzk9ODIzO3QuYTQwPTgzMzt0LmE0MT04MTY7dC5hNDI9ODMxO3QuYTQzPTkyMzt0LmE0ND03NDQ7dC5hNDU9NzIzO3QuYTQ2PTc0OTt0LmE0Nz03OTA7dC5hNDg9NzkyO3QuYTQ5PTY5NTt0LmE1MD03NzY7dC5hNTE9NzY4O3QuYTUyPTc5Mjt0LmE1Mz03NTk7dC5hNTQ9NzA3O3QuYTU1PTcwODt0LmE1Nj02ODI7dC5hNTc9NzAxO3QuYTU4PTgyNjt0LmE1OT04MTU7dC5hNjA9Nzg5O3QuYTYxPTc4OTt0LmE2Mj03MDc7dC5hNjM9Njg3O3QuYTY0PTY5Njt0LmE2NT02ODk7dC5hNjY9Nzg2O3QuYTY3PTc4Nzt0LmE2OD03MTM7dC5hNjk9NzkxO3QuYTcwPTc4NTt0LmE3MT03OTE7dC5hNzI9ODczO3QuYTczPTc2MTt0LmE3ND03NjI7dC5hMjAzPTc2Mjt0LmE3NT03NTk7dC5hMjA0PTc1OTt0LmE3Nj04OTI7dC5hNzc9ODkyO3QuYTc4PTc4ODt0LmE3OT03ODQ7dC5hODE9NDM4O3QuYTgyPTEzODt0LmE4Mz0yNzc7dC5hODQ9NDE1O3QuYTk3PTM5Mjt0LmE5OD0zOTI7dC5hOTk9NjY4O3QuYTEwMD02Njg7dC5hODk9MzkwO3QuYTkwPTM5MDt0LmE5Mz0zMTc7dC5hOTQ9MzE3O3QuYTkxPTI3Njt0LmE5Mj0yNzY7dC5hMjA1PTUwOTt0LmE4NT01MDk7dC5hMjA2PTQxMDt0LmE4Nj00MTA7dC5hODc9MjM0O3QuYTg4PTIzNDt0LmE5NT0zMzQ7dC5hOTY9MzM0O3QuYTEwMT03MzI7dC5hMTAyPTU0NDt0LmExMDM9NTQ0O3QuYTEwND05MTA7dC5hMTA2PTY2Nzt0LmExMDc9NzYwO3QuYTEwOD03NjA7dC5hMTEyPTc3Njt0LmExMTE9NTk1O3QuYTExMD02OTQ7dC5hMTA5PTYyNjt0LmExMjA9Nzg4O3QuYTEyMT03ODg7dC5hMTIyPTc4ODt0LmExMjM9Nzg4O3QuYTEyND03ODg7dC5hMTI1PTc4ODt0LmExMjY9Nzg4O3QuYTEyNz03ODg7dC5hMTI4PTc4ODt0LmExMjk9Nzg4O3QuYTEzMD03ODg7dC5hMTMxPTc4ODt0LmExMzI9Nzg4O3QuYTEzMz03ODg7dC5hMTM0PTc4ODt0LmExMzU9Nzg4O3QuYTEzNj03ODg7dC5hMTM3PTc4ODt0LmExMzg9Nzg4O3QuYTEzOT03ODg7dC5hMTQwPTc4ODt0LmExNDE9Nzg4O3QuYTE0Mj03ODg7dC5hMTQzPTc4ODt0LmExNDQ9Nzg4O3QuYTE0NT03ODg7dC5hMTQ2PTc4ODt0LmExNDc9Nzg4O3QuYTE0OD03ODg7dC5hMTQ5PTc4ODt0LmExNTA9Nzg4O3QuYTE1MT03ODg7dC5hMTUyPTc4ODt0LmExNTM9Nzg4O3QuYTE1ND03ODg7dC5hMTU1PTc4ODt0LmExNTY9Nzg4O3QuYTE1Nz03ODg7dC5hMTU4PTc4ODt0LmExNTk9Nzg4O3QuYTE2MD04OTQ7dC5hMTYxPTgzODt0LmExNjM9MTAxNjt0LmExNjQ9NDU4O3QuYTE5Nj03NDg7dC5hMTY1PTkyNDt0LmExOTI9NzQ4O3QuYTE2Nj05MTg7dC5hMTY3PTkyNzt0LmExNjg9OTI4O3QuYTE2OT05Mjg7dC5hMTcwPTgzNDt0LmExNzE9ODczO3QuYTE3Mj04Mjg7dC5hMTczPTkyNDt0LmExNjI9OTI0O3QuYTE3ND05MTc7dC5hMTc1PTkzMDt0LmExNzY9OTMxO3QuYTE3Nz00NjM7dC5hMTc4PTg4Mzt0LmExNzk9ODM2O3QuYTE5Mz04MzY7dC5hMTgwPTg2Nzt0LmExOTk9ODY3O3QuYTE4MT02OTY7dC5hMjAwPTY5Njt0LmExODI9ODc0O3QuYTIwMT04NzQ7dC5hMTgzPTc2MDt0LmExODQ9OTQ2O3QuYTE5Nz03NzE7dC5hMTg1PTg2NTt0LmExOTQ9NzcxO3QuYTE5OD04ODg7dC5hMTg2PTk2Nzt0LmExOTU9ODg4O3QuYTE4Nz04MzE7dC5hMTg4PTg3Mzt0LmExODk9OTI3O3QuYTE5MD05NzA7dC5hMTkxPTkxOH0pKX0pKTtyLmdldE1ldHJpY3M9b30sZnVuY3Rpb24odCxyLGEpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ci5NdXJtdXJIYXNoM182ND12b2lkIDA7dmFyIGk9YSg1KTtmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fXZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTXVybXVySGFzaDNfNjQodCl7IWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLE11cm11ckhhc2gzXzY0KTt0aGlzLmgxPXQ/NDI5NDk2NzI5NSZ0OjMyODUzNzc1MjA7dGhpcy5oMj10PzQyOTQ5NjcyOTUmdDozMjg1Mzc3NTIwfSFmdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9KE11cm11ckhhc2gzXzY0LFt7a2V5OiJ1cGRhdGUiLHZhbHVlOmZ1bmN0aW9uIHVwZGF0ZSh0KXt2YXIgcixhO2lmKCgwLGkuaXNTdHJpbmcpKHQpKXtyPW5ldyBVaW50OEFycmF5KDIqdC5sZW5ndGgpO2E9MDtmb3IodmFyIG89MCxjPXQubGVuZ3RoO288YztvKyspe3ZhciBsPXQuY2hhckNvZGVBdChvKTtpZihsPD0yNTUpclthKytdPWw7ZWxzZXtyW2ErK109bD4+Pjg7clthKytdPTI1NSZsfX19ZWxzZXtpZighKDAsaS5pc0FycmF5QnVmZmVyKSh0KSl0aHJvdyBuZXcgRXJyb3IoIldyb25nIGRhdGEgZm9ybWF0IGluIE11cm11ckhhc2gzXzY0X3VwZGF0ZS4gSW5wdXQgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheS4iKTthPShyPXQpLmJ5dGVMZW5ndGh9Zm9yKHZhciB1PWE+PjIsaD1hLTQqdSxkPW5ldyBVaW50MzJBcnJheShyLmJ1ZmZlciwwLHUpLHA9MCxtPTAsZz10aGlzLmgxLHk9dGhpcy5oMixiPTM0MzI5MTgzNTMsdj00NjE4NDU5MDcsUz0wO1M8dTtTKyspMSZTP2c9NSooZz0oZ149cD0ocD0ocD0ocD1kW1NdKSpiJjQyOTQ5MDE3NjB8MTE2MDEqcCY2NTUzNSk8PDE1fHA+Pj4xNykqdiY0Mjk0OTAxNzYwfDEzNzE1KnAmNjU1MzUpPDwxM3xnPj4+MTkpKzM4NjQyOTIxOTY6eT01Kih5PSh5Xj1tPShtPShtPShtPWRbU10pKmImNDI5NDkwMTc2MHwxMTYwMSptJjY1NTM1KTw8MTV8bT4+PjE3KSp2JjQyOTQ5MDE3NjB8MTM3MTUqbSY2NTUzNSk8PDEzfHk+Pj4xOSkrMzg2NDI5MjE5NjtwPTA7c3dpdGNoKGgpe2Nhc2UgMzpwXj1yWzQqdSsyXTw8MTY7Y2FzZSAyOnBePXJbNCp1KzFdPDw4O2Nhc2UgMTpwPShwPShwPShwXj1yWzQqdV0pKmImNDI5NDkwMTc2MHwxMTYwMSpwJjY1NTM1KTw8MTV8cD4+PjE3KSp2JjQyOTQ5MDE3NjB8MTM3MTUqcCY2NTUzNTsxJnU/Z149cDp5Xj1wfXRoaXMuaDE9Zzt0aGlzLmgyPXl9fSx7a2V5OiJoZXhkaWdlc3QiLHZhbHVlOmZ1bmN0aW9uIGhleGRpZ2VzdCgpe3ZhciB0PXRoaXMuaDEscj10aGlzLmgyO3Q9Mzk4MTgwNjc5NyoodF49cj4+PjEpJjQyOTQ5MDE3NjB8MzYwNDUqdCY2NTUzNTt0PTQ0NDk4NDQwMyoodF49KHI9NDI4MzU0MzUxMSpyJjQyOTQ5MDE3NjB8KDI5NTAxNjM3OTcqKHI8PDE2fHQ+Pj4xNikmNDI5NDkwMTc2MCk+Pj4xNik+Pj4xKSY0Mjk0OTAxNzYwfDYwNDk5KnQmNjU1MzU7dmFyIGE9KCh0Xj0ocj0zMzAxODgyMzY2KnImNDI5NDkwMTc2MHwoMzEyMDQzNzg5Myoocjw8MTZ8dD4+PjE2KSY0Mjk0OTAxNzYwKT4+PjE2KT4+PjEpPj4+MCkudG9TdHJpbmcoMTYpLGk9KHI+Pj4wKS50b1N0cmluZygxNik7cmV0dXJuIGEucGFkU3RhcnQoOCwiMCIpK2kucGFkU3RhcnQoOCwiMCIpfX1dKTtyZXR1cm4gTXVybXVySGFzaDNfNjR9KCk7ci5NdXJtdXJIYXNoM182ND1vfSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBERkltYWdlPXZvaWQgMDt2YXIgaT1mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oYSgyKSksbz1hKDUpLGM9YSgyMDIpLGw9YSgyMjApLHU9YSgyMDkpLGg9YSgyMTUpLGQ9YSgyMTgpO2Z1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcCh0LHIsYSxpLG8sYyxsKXt0cnl7dmFyIHU9dFtjXShsKSxoPXUudmFsdWV9Y2F0Y2godCl7YSh0KTtyZXR1cm59dS5kb25lP3IoaCk6UHJvbWlzZS5yZXNvbHZlKGgpLnRoZW4oaSxvKX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0LHIpe2Zvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExO2kuY29uZmlndXJhYmxlPSEwOyJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fWZ1bmN0aW9uIGRlY29kZUFuZENsYW1wKHQscixhLGkpeyh0PXIrdCphKTwwP3Q9MDp0PmkmJih0PWkpO3JldHVybiB0fWZ1bmN0aW9uIHJlc2l6ZUltYWdlTWFzayh0LHIsYSxpLG8sYyl7dmFyIGwsdT1vKmM7bD1yPD04P25ldyBVaW50OEFycmF5KHUpOnI8PTE2P25ldyBVaW50MTZBcnJheSh1KTpuZXcgVWludDMyQXJyYXkodSk7dmFyIGgsZCxwLG0sZz1hL28seT1pL2MsYj0wLHY9bmV3IFVpbnQxNkFycmF5KG8pLFM9YTtmb3IoaD0wO2g8bztoKyspdltoXT1NYXRoLmZsb29yKGgqZyk7Zm9yKGg9MDtoPGM7aCsrKXtwPU1hdGguZmxvb3IoaCp5KSpTO2ZvcihkPTA7ZDxvO2QrKyl7bT1wK3ZbZF07bFtiKytdPXRbbV19fXJldHVybiBsfXZhciBwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUERGSW1hZ2UodCl7dmFyIHI9dC54cmVmLGE9dC5yZXMsaT10LmltYWdlLHU9dC5pc0lubGluZSxoPXZvaWQgMCE9PXUmJnUscD10LnNtYXNrLG09dm9pZCAwPT09cD9udWxsOnAsZz10Lm1hc2sseT12b2lkIDA9PT1nP251bGw6ZyxiPXQuaXNNYXNrLHY9dm9pZCAwIT09YiYmYixTPXQucGRmRnVuY3Rpb25GYWN0b3J5LGs9dC5sb2NhbENvbG9yU3BhY2VDYWNoZTshZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsUERGSW1hZ2UpO3RoaXMuaW1hZ2U9aTt2YXIgdz1pLmRpY3QsQz13LmdldCgiRmlsdGVyIik7aWYoKDAsYy5pc05hbWUpKEMpKXN3aXRjaChDLm5hbWUpe2Nhc2UiSlBYRGVjb2RlIjp2YXIgXz1uZXcgZC5KcHhJbWFnZTtfLnBhcnNlSW1hZ2VQcm9wZXJ0aWVzKGkuc3RyZWFtKTtpLnN0cmVhbS5yZXNldCgpO2kud2lkdGg9Xy53aWR0aDtpLmhlaWdodD1fLmhlaWdodDtpLmJpdHNQZXJDb21wb25lbnQ9Xy5iaXRzUGVyQ29tcG9uZW50O2kubnVtQ29tcHM9Xy5jb21wb25lbnRzQ291bnQ7YnJlYWs7Y2FzZSJKQklHMkRlY29kZSI6aS5iaXRzUGVyQ29tcG9uZW50PTE7aS5udW1Db21wcz0xfXZhciB4PXcuZ2V0KCJXaWR0aCIsIlciKSxBPXcuZ2V0KCJIZWlnaHQiLCJIIik7aWYoTnVtYmVyLmlzSW50ZWdlcihpLndpZHRoKSYmaS53aWR0aD4wJiZOdW1iZXIuaXNJbnRlZ2VyKGkuaGVpZ2h0KSYmaS5oZWlnaHQ+MCYmKGkud2lkdGghPT14fHxpLmhlaWdodCE9PUEpKXsoMCxvLndhcm4pKCJQREZJbWFnZSAtIHVzaW5nIHRoZSBXaWR0aC9IZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEsIHJhdGhlciB0aGFuIHRoZSBpbWFnZSBkaWN0aW9uYXJ5LiIpO3g9aS53aWR0aDtBPWkuaGVpZ2h0fWlmKHg8MXx8QTwxKXRocm93IG5ldyBvLkZvcm1hdEVycm9yKCJJbnZhbGlkIGltYWdlIHdpZHRoOiAiLmNvbmNhdCh4LCIgb3IgaGVpZ2h0OiAiKS5jb25jYXQoQSkpO3RoaXMud2lkdGg9eDt0aGlzLmhlaWdodD1BO3RoaXMuaW50ZXJwb2xhdGU9dy5nZXQoIkludGVycG9sYXRlIiwiSSIpfHwhMTt0aGlzLmltYWdlTWFzaz13LmdldCgiSW1hZ2VNYXNrIiwiSU0iKXx8ITE7dGhpcy5tYXR0ZT13LmdldCgiTWF0dGUiKXx8ITE7dmFyIFQ9aS5iaXRzUGVyQ29tcG9uZW50O2lmKCFUJiYhKFQ9dy5nZXQoIkJpdHNQZXJDb21wb25lbnQiLCJCUEMiKSkpe2lmKCF0aGlzLmltYWdlTWFzayl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiQml0cyBwZXIgY29tcG9uZW50IG1pc3NpbmcgaW4gaW1hZ2U6ICIuY29uY2F0KHRoaXMuaW1hZ2VNYXNrKSk7VD0xfXRoaXMuYnBjPVQ7aWYoIXRoaXMuaW1hZ2VNYXNrKXt2YXIgUj13LmdldFJhdygiQ29sb3JTcGFjZSIpfHx3LmdldFJhdygiQ1MiKTtpZighUil7KDAsby5pbmZvKSgiSlBYIGltYWdlcyAod2hpY2ggZG8gbm90IHJlcXVpcmUgY29sb3Igc3BhY2VzKSIpO3N3aXRjaChpLm51bUNvbXBzKXtjYXNlIDE6Uj1jLk5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7YnJlYWs7Y2FzZSAzOlI9Yy5OYW1lLmdldCgiRGV2aWNlUkdCIik7YnJlYWs7Y2FzZSA0OlI9Yy5OYW1lLmdldCgiRGV2aWNlQ01ZSyIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJKUFggaW1hZ2VzIHdpdGggIi5jb25jYXQoaS5udW1Db21wcywiICIpKyJjb2xvciBjb21wb25lbnRzIG5vdCBzdXBwb3J0ZWQuIil9fXRoaXMuY29sb3JTcGFjZT1sLkNvbG9yU3BhY2UucGFyc2Uoe2NzOlIseHJlZjpyLHJlc291cmNlczpoP2E6bnVsbCxwZGZGdW5jdGlvbkZhY3Rvcnk6Uyxsb2NhbENvbG9yU3BhY2VDYWNoZTprfSk7dGhpcy5udW1Db21wcz10aGlzLmNvbG9yU3BhY2UubnVtQ29tcHN9dGhpcy5kZWNvZGU9dy5nZXRBcnJheSgiRGVjb2RlIiwiRCIpO3RoaXMubmVlZHNEZWNvZGU9ITE7aWYodGhpcy5kZWNvZGUmJih0aGlzLmNvbG9yU3BhY2UmJiF0aGlzLmNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLFQpfHx2JiYhbC5Db2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwxKSkpe3RoaXMubmVlZHNEZWNvZGU9ITA7dmFyIEk9KDE8PFQpLTE7dGhpcy5kZWNvZGVDb2VmZmljaWVudHM9W107dGhpcy5kZWNvZGVBZGRlbmRzPVtdO2Zvcih2YXIgUD10aGlzLmNvbG9yU3BhY2UmJiJJbmRleGVkIj09PXRoaXMuY29sb3JTcGFjZS5uYW1lLE89MCxFPTA7Tzx0aGlzLmRlY29kZS5sZW5ndGg7Tys9MiwrK0Upe3ZhciBCPXRoaXMuZGVjb2RlW09dLEQ9dGhpcy5kZWNvZGVbTysxXTt0aGlzLmRlY29kZUNvZWZmaWNpZW50c1tFXT1QPyhELUIpL0k6RC1CO3RoaXMuZGVjb2RlQWRkZW5kc1tFXT1QP0I6SSpCfX1pZihtKXRoaXMuc21hc2s9bmV3IFBERkltYWdlKHt4cmVmOnIscmVzOmEsaW1hZ2U6bSxpc0lubGluZTpoLHBkZkZ1bmN0aW9uRmFjdG9yeTpTLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmt9KTtlbHNlIGlmKHkpaWYoKDAsYy5pc1N0cmVhbSkoeSkpe3kuZGljdC5nZXQoIkltYWdlTWFzayIsIklNIik/dGhpcy5tYXNrPW5ldyBQREZJbWFnZSh7eHJlZjpyLHJlczphLGltYWdlOnksaXNJbmxpbmU6aCxpc01hc2s6ITAscGRmRnVuY3Rpb25GYWN0b3J5OlMsbG9jYWxDb2xvclNwYWNlQ2FjaGU6a30pOigwLG8ud2FybikoIklnbm9yaW5nIC9NYXNrIGluIGltYWdlIHdpdGhvdXQgL0ltYWdlTWFzay4iKX1lbHNlIHRoaXMubWFzaz15fSFmdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9KFBERkltYWdlLFt7a2V5OiJkZWNvZGVCdWZmZXIiLHZhbHVlOmZ1bmN0aW9uIGRlY29kZUJ1ZmZlcih0KXt2YXIgcixhLGk9dGhpcy5icGMsbz10aGlzLm51bUNvbXBzLGM9dGhpcy5kZWNvZGVBZGRlbmRzLGw9dGhpcy5kZWNvZGVDb2VmZmljaWVudHMsdT0oMTw8aSktMTtpZigxIT09aSl7dmFyIGg9MDtmb3Iocj0wLGE9dGhpcy53aWR0aCp0aGlzLmhlaWdodDtyPGE7cisrKWZvcih2YXIgZD0wO2Q8bztkKyspe3RbaF09ZGVjb2RlQW5kQ2xhbXAodFtoXSxjW2RdLGxbZF0sdSk7aCsrfX1lbHNlIGZvcihyPTAsYT10Lmxlbmd0aDtyPGE7cisrKXRbcl09KyF0W3JdfX0se2tleToiZ2V0Q29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24gZ2V0Q29tcG9uZW50cyh0KXt2YXIgcj10aGlzLmJwYztpZig4PT09cilyZXR1cm4gdDt2YXIgYSxpPXRoaXMud2lkdGgsbz10aGlzLmhlaWdodCxjPXRoaXMubnVtQ29tcHMsbD1pKm8qYyx1PTA7YT1yPD04P25ldyBVaW50OEFycmF5KGwpOnI8PTE2P25ldyBVaW50MTZBcnJheShsKTpuZXcgVWludDMyQXJyYXkobCk7dmFyIGgsZCxwPWkqYyxtPSgxPDxyKS0xLGc9MDtpZigxPT09cilmb3IodmFyIHksYix2LFM9MDtTPG87UysrKXtiPWcrKC04JnApO3Y9ZytwO2Zvcig7ZzxiOyl7ZD10W3UrK107YVtnXT1kPj43JjE7YVtnKzFdPWQ+PjYmMTthW2crMl09ZD4+NSYxO2FbZyszXT1kPj40JjE7YVtnKzRdPWQ+PjMmMTthW2crNV09ZD4+MiYxO2FbZys2XT1kPj4xJjE7YVtnKzddPTEmZDtnKz04fWlmKGc8dil7ZD10W3UrK107eT0xMjg7Zm9yKDtnPHY7KXthW2crK109KyEhKGQmeSk7eT4+PTF9fX1lbHNle3ZhciBrPTA7ZD0wO2ZvcihnPTAsaD1sO2c8aDsrK2cpe2lmKGclcD09MCl7ZD0wO2s9MH1mb3IoO2s8cjspe2Q9ZDw8OHx0W3UrK107ays9OH12YXIgdz1rLXIsQz1kPj53O0M8MD9DPTA6Qz5tJiYoQz1tKTthW2ddPUM7ZCY9KDE8PHcpLTE7az13fX1yZXR1cm4gYX19LHtrZXk6ImZpbGxPcGFjaXR5Iix2YWx1ZTpmdW5jdGlvbiBmaWxsT3BhY2l0eSh0LHIsYSxpLGMpe3ZhciBsLHUsaCxkLHAsbSxnPXRoaXMuc21hc2sseT10aGlzLm1hc2s7aWYoZyl7dT1nLndpZHRoO2g9Zy5oZWlnaHQ7bD1uZXcgVWludDhDbGFtcGVkQXJyYXkodSpoKTtnLmZpbGxHcmF5QnVmZmVyKGwpO3U9PT1yJiZoPT09YXx8KGw9cmVzaXplSW1hZ2VNYXNrKGwsZy5icGMsdSxoLHIsYSkpfWVsc2UgaWYoeSlpZih5IGluc3RhbmNlb2YgUERGSW1hZ2Upe3U9eS53aWR0aDtoPXkuaGVpZ2h0O2w9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHUqaCk7eS5udW1Db21wcz0xO3kuZmlsbEdyYXlCdWZmZXIobCk7Zm9yKGQ9MCxwPXUqaDtkPHA7KytkKWxbZF09MjU1LWxbZF07dT09PXImJmg9PT1hfHwobD1yZXNpemVJbWFnZU1hc2sobCx5LmJwYyx1LGgscixhKSl9ZWxzZXtpZighQXJyYXkuaXNBcnJheSh5KSl0aHJvdyBuZXcgby5Gb3JtYXRFcnJvcigiVW5rbm93biBtYXNrIGZvcm1hdC4iKTtsPW5ldyBVaW50OENsYW1wZWRBcnJheShyKmEpO3ZhciBiPXRoaXMubnVtQ29tcHM7Zm9yKGQ9MCxwPXIqYTtkPHA7KytkKXt2YXIgdj0wLFM9ZCpiO2ZvcihtPTA7bTxiOysrbSl7dmFyIGs9Y1tTK21dLHc9MiptO2lmKGs8eVt3XXx8az55W3crMV0pe3Y9MjU1O2JyZWFrfX1sW2RdPXZ9fWlmKGwpZm9yKGQ9MCxtPTMscD1yKmk7ZDxwOysrZCxtKz00KXRbbV09bFtkXTtlbHNlIGZvcihkPTAsbT0zLHA9cippO2Q8cDsrK2QsbSs9NCl0W21dPTI1NX19LHtrZXk6InVuZG9QcmVibGVuZCIsdmFsdWU6ZnVuY3Rpb24gdW5kb1ByZWJsZW5kKHQscixhKXt2YXIgaT10aGlzLnNtYXNrJiZ0aGlzLnNtYXNrLm1hdHRlO2lmKGkpZm9yKHZhciBvPXRoaXMuY29sb3JTcGFjZS5nZXRSZ2IoaSwwKSxjPW9bMF0sbD1vWzFdLHU9b1syXSxoPXIqYSo0LGQ9MDtkPGg7ZCs9NCl7dmFyIHA9dFtkKzNdO2lmKDAhPT1wKXt2YXIgbT0yNTUvcDt0W2RdPSh0W2RdLWMpKm0rYzt0W2QrMV09KHRbZCsxXS1sKSptK2w7dFtkKzJdPSh0W2QrMl0tdSkqbSt1fWVsc2V7dFtkXT0yNTU7dFtkKzFdPTI1NTt0W2QrMl09MjU1fX19fSx7a2V5OiJjcmVhdGVJbWFnZURhdGEiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZUltYWdlRGF0YSgpe3ZhciB0LHI9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXSxhPXRoaXMuZHJhd1dpZHRoLGk9dGhpcy5kcmF3SGVpZ2h0LGM9e3dpZHRoOmEsaGVpZ2h0Omksa2luZDowLGRhdGE6bnVsbH0sbD10aGlzLm51bUNvbXBzLGQ9dGhpcy53aWR0aCxwPXRoaXMuaGVpZ2h0LG09dGhpcy5icGMsZz1kKmwqbSs3Pj4zO2lmKCFyKXt2YXIgeTsiRGV2aWNlR3JheSI9PT10aGlzLmNvbG9yU3BhY2UubmFtZSYmMT09PW0/eT1vLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoiRGV2aWNlUkdCIiE9PXRoaXMuY29sb3JTcGFjZS5uYW1lfHw4IT09bXx8dGhpcy5uZWVkc0RlY29kZXx8KHk9by5JbWFnZUtpbmQuUkdCXzI0QlBQKTtpZih5JiYhdGhpcy5zbWFzayYmIXRoaXMubWFzayYmYT09PWQmJmk9PT1wKXtjLmtpbmQ9eTt0PXRoaXMuZ2V0SW1hZ2VCeXRlcyhwKmcpO2lmKHRoaXMuaW1hZ2UgaW5zdGFuY2VvZiB1LkRlY29kZVN0cmVhbSljLmRhdGE9dDtlbHNle3ZhciBiPW5ldyBVaW50OENsYW1wZWRBcnJheSh0Lmxlbmd0aCk7Yi5zZXQodCk7Yy5kYXRhPWJ9aWYodGhpcy5uZWVkc0RlY29kZSl7KDAsby5hc3NlcnQpKHk9PT1vLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCwiUERGSW1hZ2UuY3JlYXRlSW1hZ2VEYXRhOiBUaGUgaW1hZ2UgbXVzdCBiZSBncmF5c2NhbGUuIik7Zm9yKHZhciB2PWMuZGF0YSxTPTAsaz12Lmxlbmd0aDtTPGs7UysrKXZbU11ePTI1NX1yZXR1cm4gY31pZih0aGlzLmltYWdlIGluc3RhbmNlb2YgaC5KcGVnU3RyZWFtJiYhdGhpcy5zbWFzayYmIXRoaXMubWFzayl7dmFyIHc9cCpnO3N3aXRjaCh0aGlzLmNvbG9yU3BhY2UubmFtZSl7Y2FzZSJEZXZpY2VHcmF5Ijp3Kj0zO2Nhc2UiRGV2aWNlUkdCIjpjYXNlIkRldmljZUNNWUsiOmMua2luZD1vLkltYWdlS2luZC5SR0JfMjRCUFA7Yy5kYXRhPXRoaXMuZ2V0SW1hZ2VCeXRlcyh3LGEsaSwhMCk7cmV0dXJuIGN9fX12YXIgQyxfLHg9MHwodD10aGlzLmdldEltYWdlQnl0ZXMocCpnKSkubGVuZ3RoL2cqaS9wLEE9dGhpcy5nZXRDb21wb25lbnRzKHQpO2lmKHJ8fHRoaXMuc21hc2t8fHRoaXMubWFzayl7Yy5raW5kPW8uSW1hZ2VLaW5kLlJHQkFfMzJCUFA7Yy5kYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheShhKmkqNCk7Qz0xO189ITA7dGhpcy5maWxsT3BhY2l0eShjLmRhdGEsYSxpLHgsQSl9ZWxzZXtjLmtpbmQ9by5JbWFnZUtpbmQuUkdCXzI0QlBQO2MuZGF0YT1uZXcgVWludDhDbGFtcGVkQXJyYXkoYSppKjMpO0M9MDtfPSExfXRoaXMubmVlZHNEZWNvZGUmJnRoaXMuZGVjb2RlQnVmZmVyKEEpO3RoaXMuY29sb3JTcGFjZS5maWxsUmdiKGMuZGF0YSxkLHAsYSxpLHgsbSxBLEMpO18mJnRoaXMudW5kb1ByZWJsZW5kKGMuZGF0YSxhLHgpO3JldHVybiBjfX0se2tleToiZmlsbEdyYXlCdWZmZXIiLHZhbHVlOmZ1bmN0aW9uIGZpbGxHcmF5QnVmZmVyKHQpe3ZhciByPXRoaXMubnVtQ29tcHM7aWYoMSE9PXIpdGhyb3cgbmV3IG8uRm9ybWF0RXJyb3IoIlJlYWRpbmcgZ3JheSBzY2FsZSBmcm9tIGEgY29sb3IgaW1hZ2U6ICIuY29uY2F0KHIpKTt2YXIgYSxpLGM9dGhpcy53aWR0aCxsPXRoaXMuaGVpZ2h0LHU9dGhpcy5icGMsaD1jKnIqdSs3Pj4zLGQ9dGhpcy5nZXRJbWFnZUJ5dGVzKGwqaCkscD10aGlzLmdldENvbXBvbmVudHMoZCk7aWYoMSE9PXUpe3RoaXMubmVlZHNEZWNvZGUmJnRoaXMuZGVjb2RlQnVmZmVyKHApO2k9YypsO3ZhciBtPTI1NS8oKDE8PHUpLTEpO2ZvcihhPTA7YTxpOysrYSl0W2FdPW0qcFthXX1lbHNle2k9YypsO2lmKHRoaXMubmVlZHNEZWNvZGUpZm9yKGE9MDthPGk7KythKXRbYV09cFthXS0xJjI1NTtlbHNlIGZvcihhPTA7YTxpOysrYSl0W2FdPTI1NSYtcFthXX19fSx7a2V5OiJnZXRJbWFnZUJ5dGVzIix2YWx1ZTpmdW5jdGlvbiBnZXRJbWFnZUJ5dGVzKHQscixhKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO3RoaXMuaW1hZ2UucmVzZXQoKTt0aGlzLmltYWdlLmRyYXdXaWR0aD1yfHx0aGlzLndpZHRoO3RoaXMuaW1hZ2UuZHJhd0hlaWdodD1hfHx0aGlzLmhlaWdodDt0aGlzLmltYWdlLmZvcmNlUkdCPSEhaTtyZXR1cm4gdGhpcy5pbWFnZS5nZXRCeXRlcyh0LCEwKX19LHtrZXk6ImRyYXdXaWR0aCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBNYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuc21hc2smJnRoaXMuc21hc2sud2lkdGh8fDAsdGhpcy5tYXNrJiZ0aGlzLm1hc2sud2lkdGh8fDApfX0se2tleToiZHJhd0hlaWdodCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBNYXRoLm1heCh0aGlzLmhlaWdodCx0aGlzLnNtYXNrJiZ0aGlzLnNtYXNrLmhlaWdodHx8MCx0aGlzLm1hc2smJnRoaXMubWFzay5oZWlnaHR8fDApfX1dLFt7a2V5OiJidWlsZEltYWdlIix2YWx1ZToodD1mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLGE9YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxvKXt2YXIgYz10LmFwcGx5KHIsYSk7ZnVuY3Rpb24gX25leHQodCl7YXN5bmNHZW5lcmF0b3JTdGVwKGMsaSxvLF9uZXh0LF90aHJvdywibmV4dCIsdCl9ZnVuY3Rpb24gX3Rocm93KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChjLGksbyxfbmV4dCxfdGhyb3csInRocm93Iix0KX1fbmV4dCh2b2lkIDApfSkpfX0oaS5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIF9jYWxsZWUodCl7dmFyIHIsYSxsLHUsaCxkLHAsbSxnLHksYix2O3JldHVybiBpLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24gX2NhbGxlZSQoaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6cj10LnhyZWYsYT10LnJlcyxsPXQuaW1hZ2UsdT10LmlzSW5saW5lLGg9dm9pZCAwIT09dSYmdSxkPXQucGRmRnVuY3Rpb25GYWN0b3J5LHA9dC5sb2NhbENvbG9yU3BhY2VDYWNoZTttPWw7Zz1udWxsO3k9bnVsbDtiPWwuZGljdC5nZXQoIlNNYXNrIik7dj1sLmRpY3QuZ2V0KCJNYXNrIik7Yj9nPWI6diYmKCgwLGMuaXNTdHJlYW0pKHYpfHxBcnJheS5pc0FycmF5KHYpP3k9djooMCxvLndhcm4pKCJVbnN1cHBvcnRlZCBtYXNrIGZvcm1hdC4iKSk7cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLG5ldyBQREZJbWFnZSh7eHJlZjpyLHJlczphLGltYWdlOm0saXNJbmxpbmU6aCxzbWFzazpnLG1hc2s6eSxwZGZGdW5jdGlvbkZhY3Rvcnk6ZCxsb2NhbENvbG9yU3BhY2VDYWNoZTpwfSkpO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIGkuc3RvcCgpfX0pLF9jYWxsZWUpfSkpKSxmdW5jdGlvbiBidWlsZEltYWdlKHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJjcmVhdGVNYXNrIix2YWx1ZTpmdW5jdGlvbiBjcmVhdGVNYXNrKHQpe3ZhciByLGEsaT10LmltZ0FycmF5LG89dC53aWR0aCxjPXQuaGVpZ2h0LGw9dC5pbWFnZUlzRnJvbURlY29kZVN0cmVhbSx1PXQuaW52ZXJzZURlY29kZSxoPShvKzc+PjMpKmMsZD1pLmJ5dGVMZW5ndGg7aWYoIWx8fHUmJiEoaD09PWQpKWlmKHUpeyhyPW5ldyBVaW50OENsYW1wZWRBcnJheShoKSkuc2V0KGkpO2ZvcihhPWQ7YTxoO2ErKylyW2FdPTI1NX1lbHNlKHI9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGQpKS5zZXQoaSk7ZWxzZSByPWk7aWYodSlmb3IoYT0wO2E8ZDthKyspclthXV49MjU1O3JldHVybntkYXRhOnIsd2lkdGg6byxoZWlnaHQ6Y319fV0pO3ZhciB0O3JldHVybiBQREZJbWFnZX0oKTtyLlBERkltYWdlPXB9LGZ1bmN0aW9uKHQscixhKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3IuTWVzc2FnZUhhbmRsZXI9dm9pZCAwO3ZhciBpPWZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShhKDIpKSxvPWEoNSk7ZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKHQscixhLGksbyxjLGwpe3RyeXt2YXIgdT10W2NdKGwpLGg9dS52YWx1ZX1jYXRjaCh0KXthKHQpO3JldHVybn11LmRvbmU/cihoKTpQcm9taXNlLnJlc29sdmUoaCkudGhlbihpLG8pfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQscil7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBpPXJbYV07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITE7aS5jb25maWd1cmFibGU9ITA7InZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24gX3R5cGVvZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX12YXIgYz0xLGw9Mix1PTEsaD0yLGQ9MyxwPTQsbT01LGc9Nix5PTcsYj04O2Z1bmN0aW9uIHdyYXBSZWFzb24odCl7aWYoIm9iamVjdCIhPT1fdHlwZW9mKHQpfHxudWxsPT09dClyZXR1cm4gdDtzd2l0Y2godC5uYW1lKXtjYXNlIkFib3J0RXhjZXB0aW9uIjpyZXR1cm4gbmV3IG8uQWJvcnRFeGNlcHRpb24odC5tZXNzYWdlKTtjYXNlIk1pc3NpbmdQREZFeGNlcHRpb24iOnJldHVybiBuZXcgby5NaXNzaW5nUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7Y2FzZSJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iOnJldHVybiBuZXcgby5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24odC5tZXNzYWdlLHQuc3RhdHVzKTtjYXNlIlVua25vd25FcnJvckV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBvLlVua25vd25FcnJvckV4Y2VwdGlvbih0Lm1lc3NhZ2UsdC5kZXRhaWxzKTtkZWZhdWx0OnJldHVybiBuZXcgby5Vbmtub3duRXJyb3JFeGNlcHRpb24odC5tZXNzYWdlLHQudG9TdHJpbmcoKSl9fXZhciB2PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTWVzc2FnZUhhbmRsZXIodCxyLGEpe3ZhciBpPXRoaXM7IWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LHIpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLE1lc3NhZ2VIYW5kbGVyKTt0aGlzLnNvdXJjZU5hbWU9dDt0aGlzLnRhcmdldE5hbWU9cjt0aGlzLmNvbU9iaj1hO3RoaXMuY2FsbGJhY2tJZD0xO3RoaXMuc3RyZWFtSWQ9MTt0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzPSEwO3RoaXMuc3RyZWFtU2lua3M9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuYWN0aW9uSGFuZGxlcj1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuX29uQ29tT2JqT25NZXNzYWdlPWZ1bmN0aW9uKHQpe3ZhciByPXQuZGF0YTtpZihyLnRhcmdldE5hbWU9PT1pLnNvdXJjZU5hbWUpaWYoci5zdHJlYW0paS5fcHJvY2Vzc1N0cmVhbU1lc3NhZ2Uocik7ZWxzZSBpZihyLmNhbGxiYWNrKXt2YXIgbz1yLmNhbGxiYWNrSWQsdT1pLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW29dO2lmKCF1KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgIi5jb25jYXQobykpO2RlbGV0ZSBpLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW29dO2lmKHIuY2FsbGJhY2s9PT1jKXUucmVzb2x2ZShyLmRhdGEpO2Vsc2V7aWYoci5jYWxsYmFjayE9PWwpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTt1LnJlamVjdCh3cmFwUmVhc29uKHIucmVhc29uKSl9fWVsc2V7dmFyIGg9aS5hY3Rpb25IYW5kbGVyW3IuYWN0aW9uXTtpZighaCl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAiLmNvbmNhdChyLmFjdGlvbikpO2lmKHIuY2FsbGJhY2tJZCl7dmFyIGQ9aS5zb3VyY2VOYW1lLHA9ci5zb3VyY2VOYW1lO25ldyBQcm9taXNlKChmdW5jdGlvbih0KXt0KGgoci5kYXRhKSl9KSkudGhlbigoZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpkLHRhcmdldE5hbWU6cCxjYWxsYmFjazpjLGNhbGxiYWNrSWQ6ci5jYWxsYmFja0lkLGRhdGE6dH0pfSksKGZ1bmN0aW9uKHQpe2EucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6ZCx0YXJnZXROYW1lOnAsY2FsbGJhY2s6bCxjYWxsYmFja0lkOnIuY2FsbGJhY2tJZCxyZWFzb246d3JhcFJlYXNvbih0KX0pfSkpfWVsc2Ugci5zdHJlYW1JZD9pLl9jcmVhdGVTdHJlYW1TaW5rKHIpOmgoci5kYXRhKX19O2EuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpfSFmdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9KE1lc3NhZ2VIYW5kbGVyLFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24gb24odCxyKXt2YXIgYT10aGlzLmFjdGlvbkhhbmRsZXI7aWYoYVt0XSl0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIicuY29uY2F0KHQsJyInKSk7YVt0XT1yfX0se2tleToic2VuZCIsdmFsdWU6ZnVuY3Rpb24gc2VuZCh0LHIsYSl7dGhpcy5fcG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6dGhpcy5zb3VyY2VOYW1lLHRhcmdldE5hbWU6dGhpcy50YXJnZXROYW1lLGFjdGlvbjp0LGRhdGE6cn0sYSl9fSx7a2V5OiJzZW5kV2l0aFByb21pc2UiLHZhbHVlOmZ1bmN0aW9uIHNlbmRXaXRoUHJvbWlzZSh0LHIsYSl7dmFyIGk9dGhpcy5jYWxsYmFja0lkKyssYz0oMCxvLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO3RoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbaV09Yzt0cnl7dGhpcy5fcG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6dGhpcy5zb3VyY2VOYW1lLHRhcmdldE5hbWU6dGhpcy50YXJnZXROYW1lLGFjdGlvbjp0LGNhbGxiYWNrSWQ6aSxkYXRhOnJ9LGEpfWNhdGNoKHQpe2MucmVqZWN0KHQpfXJldHVybiBjLnByb21pc2V9fSx7a2V5OiJzZW5kV2l0aFN0cmVhbSIsdmFsdWU6ZnVuY3Rpb24gc2VuZFdpdGhTdHJlYW0odCxyLGEsaSl7dmFyIGM9dGhpcyxsPXRoaXMuc3RyZWFtSWQrKyxoPXRoaXMuc291cmNlTmFtZSxkPXRoaXMudGFyZ2V0TmFtZSxwPXRoaXMuY29tT2JqO3JldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0OmZ1bmN0aW9uIHN0YXJ0KGEpe3ZhciB1PSgwLG8uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7Yy5zdHJlYW1Db250cm9sbGVyc1tsXT17Y29udHJvbGxlcjphLHN0YXJ0Q2FsbDp1LHB1bGxDYWxsOm51bGwsY2FuY2VsQ2FsbDpudWxsLGlzQ2xvc2VkOiExfTtjLl9wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpoLHRhcmdldE5hbWU6ZCxhY3Rpb246dCxzdHJlYW1JZDpsLGRhdGE6cixkZXNpcmVkU2l6ZTphLmRlc2lyZWRTaXplfSxpKTtyZXR1cm4gdS5wcm9taXNlfSxwdWxsOmZ1bmN0aW9uIHB1bGwodCl7dmFyIHI9KDAsby5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtjLnN0cmVhbUNvbnRyb2xsZXJzW2xdLnB1bGxDYWxsPXI7cC5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpoLHRhcmdldE5hbWU6ZCxzdHJlYW06ZyxzdHJlYW1JZDpsLGRlc2lyZWRTaXplOnQuZGVzaXJlZFNpemV9KTtyZXR1cm4gci5wcm9taXNlfSxjYW5jZWw6ZnVuY3Rpb24gY2FuY2VsKHQpeygwLG8uYXNzZXJ0KSh0IGluc3RhbmNlb2YgRXJyb3IsImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTt2YXIgcj0oMCxvLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO2Muc3RyZWFtQ29udHJvbGxlcnNbbF0uY2FuY2VsQ2FsbD1yO2Muc3RyZWFtQ29udHJvbGxlcnNbbF0uaXNDbG9zZWQ9ITA7cC5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpoLHRhcmdldE5hbWU6ZCxzdHJlYW06dSxzdHJlYW1JZDpsLHJlYXNvbjp3cmFwUmVhc29uKHQpfSk7cmV0dXJuIHIucHJvbWlzZX19LGEpfX0se2tleToiX2NyZWF0ZVN0cmVhbVNpbmsiLHZhbHVlOmZ1bmN0aW9uIF9jcmVhdGVTdHJlYW1TaW5rKHQpe3ZhciByPXRoaXMsYT10aGlzLmFjdGlvbkhhbmRsZXJbdC5hY3Rpb25dLGk9dC5zdHJlYW1JZCxjPXRoaXMuc291cmNlTmFtZSxsPXQuc291cmNlTmFtZSx1PXRoaXMuY29tT2JqLGg9e2VucXVldWU6ZnVuY3Rpb24gZW5xdWV1ZSh0KXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MSx1PWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCF0aGlzLmlzQ2FuY2VsbGVkKXt2YXIgaD10aGlzLmRlc2lyZWRTaXplO3RoaXMuZGVzaXJlZFNpemUtPWE7aWYoaD4wJiZ0aGlzLmRlc2lyZWRTaXplPD0wKXt0aGlzLnNpbmtDYXBhYmlsaXR5PSgwLG8uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7dGhpcy5yZWFkeT10aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2V9ci5fcG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6Yyx0YXJnZXROYW1lOmwsc3RyZWFtOnAsc3RyZWFtSWQ6aSxjaHVuazp0fSx1KX19LGNsb3NlOmZ1bmN0aW9uIGNsb3NlKCl7aWYoIXRoaXMuaXNDYW5jZWxsZWQpe3RoaXMuaXNDYW5jZWxsZWQ9ITA7dS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpjLHRhcmdldE5hbWU6bCxzdHJlYW06ZCxzdHJlYW1JZDppfSk7ZGVsZXRlIHIuc3RyZWFtU2lua3NbaV19fSxlcnJvcjpmdW5jdGlvbiBlcnJvcih0KXsoMCxvLmFzc2VydCkodCBpbnN0YW5jZW9mIEVycm9yLCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTtpZighdGhpcy5pc0NhbmNlbGxlZCl7dGhpcy5pc0NhbmNlbGxlZD0hMDt1LnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmMsdGFyZ2V0TmFtZTpsLHN0cmVhbTptLHN0cmVhbUlkOmkscmVhc29uOndyYXBSZWFzb24odCl9KX19LHNpbmtDYXBhYmlsaXR5OigwLG8uY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCksb25QdWxsOm51bGwsb25DYW5jZWw6bnVsbCxpc0NhbmNlbGxlZDohMSxkZXNpcmVkU2l6ZTp0LmRlc2lyZWRTaXplLHJlYWR5Om51bGx9O2guc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO2gucmVhZHk9aC5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO3RoaXMuc3RyZWFtU2lua3NbaV09aDtuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocil7cihhKHQuZGF0YSxoKSl9KSkudGhlbigoZnVuY3Rpb24oKXt1LnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmMsdGFyZ2V0TmFtZTpsLHN0cmVhbTpiLHN0cmVhbUlkOmksc3VjY2VzczohMH0pfSksKGZ1bmN0aW9uKHQpe3UucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6Yyx0YXJnZXROYW1lOmwsc3RyZWFtOmIsc3RyZWFtSWQ6aSxyZWFzb246d3JhcFJlYXNvbih0KX0pfSkpfX0se2tleToiX3Byb2Nlc3NTdHJlYW1NZXNzYWdlIix2YWx1ZTpmdW5jdGlvbiBfcHJvY2Vzc1N0cmVhbU1lc3NhZ2UodCl7dmFyIHI9dC5zdHJlYW1JZCxhPXRoaXMuc291cmNlTmFtZSxpPXQuc291cmNlTmFtZSxjPXRoaXMuY29tT2JqO3N3aXRjaCh0LnN0cmVhbSl7Y2FzZSBiOnQuc3VjY2Vzcz90aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLnN0YXJ0Q2FsbC5yZXNvbHZlKCk6dGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5zdGFydENhbGwucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTticmVhaztjYXNlIHk6dC5zdWNjZXNzP3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0ucHVsbENhbGwucmVzb2x2ZSgpOnRoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0ucHVsbENhbGwucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTticmVhaztjYXNlIGc6aWYoIXRoaXMuc3RyZWFtU2lua3Nbcl0pe2MucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6YSx0YXJnZXROYW1lOmksc3RyZWFtOnksc3RyZWFtSWQ6cixzdWNjZXNzOiEwfSk7YnJlYWt9dGhpcy5zdHJlYW1TaW5rc1tyXS5kZXNpcmVkU2l6ZTw9MCYmdC5kZXNpcmVkU2l6ZT4wJiZ0aGlzLnN0cmVhbVNpbmtzW3JdLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTt0aGlzLnN0cmVhbVNpbmtzW3JdLmRlc2lyZWRTaXplPXQuZGVzaXJlZFNpemU7dmFyIGw9dGhpcy5zdHJlYW1TaW5rc1t0LnN0cmVhbUlkXS5vblB1bGw7bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3QobCYmbCgpKX0pKS50aGVuKChmdW5jdGlvbigpe2MucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6YSx0YXJnZXROYW1lOmksc3RyZWFtOnksc3RyZWFtSWQ6cixzdWNjZXNzOiEwfSl9KSwoZnVuY3Rpb24odCl7Yy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6aSxzdHJlYW06eSxzdHJlYW1JZDpyLHJlYXNvbjp3cmFwUmVhc29uKHQpfSl9KSk7YnJlYWs7Y2FzZSBwOigwLG8uYXNzZXJ0KSh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLCJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7aWYodGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5pc0Nsb3NlZClicmVhazt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLmNvbnRyb2xsZXIuZW5xdWV1ZSh0LmNodW5rKTticmVhaztjYXNlIGQ6KDAsby5hc3NlcnQpKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0sImNsb3NlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7aWYodGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5pc0Nsb3NlZClicmVhazt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLmlzQ2xvc2VkPSEwO3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0uY29udHJvbGxlci5jbG9zZSgpO3RoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIocik7YnJlYWs7Y2FzZSBtOigwLG8uYXNzZXJ0KSh0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3JdLCJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpO3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0uY29udHJvbGxlci5lcnJvcih3cmFwUmVhc29uKHQucmVhc29uKSk7dGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihyKTticmVhaztjYXNlIGg6dC5zdWNjZXNzP3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbcl0uY2FuY2VsQ2FsbC5yZXNvbHZlKCk6dGhpcy5zdHJlYW1Db250cm9sbGVyc1tyXS5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSk7dGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihyKTticmVhaztjYXNlIHU6aWYoIXRoaXMuc3RyZWFtU2lua3Nbcl0pYnJlYWs7dmFyIHY9dGhpcy5zdHJlYW1TaW5rc1t0LnN0cmVhbUlkXS5vbkNhbmNlbDtuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocil7cih2JiZ2KHdyYXBSZWFzb24odC5yZWFzb24pKSl9KSkudGhlbigoZnVuY3Rpb24oKXtjLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmEsdGFyZ2V0TmFtZTppLHN0cmVhbTpoLHN0cmVhbUlkOnIsc3VjY2VzczohMH0pfSksKGZ1bmN0aW9uKHQpe2MucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6YSx0YXJnZXROYW1lOmksc3RyZWFtOmgsc3RyZWFtSWQ6cixyZWFzb246d3JhcFJlYXNvbih0KX0pfSkpO3RoaXMuc3RyZWFtU2lua3Nbcl0uc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTt0aGlzLnN0cmVhbVNpbmtzW3JdLmlzQ2FuY2VsbGVkPSEwO2RlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3JdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHN0cmVhbSBjYXNlIil9fX0se2tleToiX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIiLHZhbHVlOih0PWZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsYT1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLG8pe3ZhciBjPXQuYXBwbHkocixhKTtmdW5jdGlvbiBfbmV4dCh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJuZXh0Iix0KX1mdW5jdGlvbiBfdGhyb3codCl7YXN5bmNHZW5lcmF0b3JTdGVwKGMsaSxvLF9uZXh0LF90aHJvdywidGhyb3ciLHQpfV9uZXh0KHZvaWQgMCl9KSl9fShpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSh0KXtyZXR1cm4gaS5kZWZhdWx0LndyYXAoKGZ1bmN0aW9uIF9jYWxsZWUkKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnIubmV4dD0yO3JldHVybiBQcm9taXNlLmFsbFNldHRsZWQoW3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0uc3RhcnRDYWxsLHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbdF0ucHVsbENhbGwsdGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XS5jYW5jZWxDYWxsXS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0LnByb21pc2V9KSkpO2Nhc2UgMjpkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxfY2FsbGVlLHRoaXMpfSkpKSxmdW5jdGlvbiBfZGVsZXRlU3RyZWFtQ29udHJvbGxlcihyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0se2tleToiX3Bvc3RNZXNzYWdlIix2YWx1ZTpmdW5jdGlvbiBfcG9zdE1lc3NhZ2UodCxyKXtyJiZ0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzP3RoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHQscik6dGhpcy5jb21PYmoucG9zdE1lc3NhZ2UodCl9fSx7a2V5OiJkZXN0cm95Iix2YWx1ZTpmdW5jdGlvbiBkZXN0cm95KCl7dGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpfX1dKTt2YXIgdDtyZXR1cm4gTWVzc2FnZUhhbmRsZXJ9KCk7ci5NZXNzYWdlSGFuZGxlcj12fSxmdW5jdGlvbih0LHIsYSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyLlBERldvcmtlclN0cmVhbT12b2lkIDA7dmFyIGk9ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KGEoMikpLG89YSg1KTtmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxyLGEsaSxvLGMsbCl7dHJ5e3ZhciB1PXRbY10obCksaD11LnZhbHVlfWNhdGNoKHQpe2EodCk7cmV0dXJufXUuZG9uZT9yKGgpOlByb21pc2UucmVzb2x2ZShoKS50aGVuKGksbyl9ZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcyxhPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksbyl7dmFyIGM9dC5hcHBseShyLGEpO2Z1bmN0aW9uIF9uZXh0KHQpe2FzeW5jR2VuZXJhdG9yU3RlcChjLGksbyxfbmV4dCxfdGhyb3csIm5leHQiLHQpfWZ1bmN0aW9uIF90aHJvdyh0KXthc3luY0dlbmVyYXRvclN0ZXAoYyxpLG8sX25leHQsX3Rocm93LCJ0aHJvdyIsdCl9X25leHQodm9pZCAwKX0pKX19ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQscil7aWYoISh0IGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModCxyKXtmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGk9clthXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMTtpLmNvbmZpZ3VyYWJsZT0hMDsidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1mdW5jdGlvbiBfY3JlYXRlQ2xhc3ModCxyLGEpe3ImJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLHIpO2EmJl9kZWZpbmVQcm9wZXJ0aWVzKHQsYSk7cmV0dXJuIHR9dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZXb3JrZXJTdHJlYW0odCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUERGV29ya2VyU3RyZWFtKTt0aGlzLl9tc2dIYW5kbGVyPXQ7dGhpcy5fY29udGVudExlbmd0aD1udWxsO3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPW51bGw7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycz1bXX1fY3JlYXRlQ2xhc3MoUERGV29ya2VyU3RyZWFtLFt7a2V5OiJnZXRGdWxsUmVhZGVyIix2YWx1ZTpmdW5jdGlvbiBnZXRGdWxsUmVhZGVyKCl7KDAsby5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwiUERGV29ya2VyU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bmV3IGwodGhpcy5fbXNnSGFuZGxlcik7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyfX0se2tleToiZ2V0UmFuZ2VSZWFkZXIiLHZhbHVlOmZ1bmN0aW9uIGdldFJhbmdlUmVhZGVyKHQscil7dmFyIGE9bmV3IHUodCxyLHRoaXMuX21zZ0hhbmRsZXIpO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChhKTtyZXR1cm4gYX19LHtrZXk6ImNhbmNlbEFsbFJlcXVlc3RzIix2YWx1ZTpmdW5jdGlvbiBjYW5jZWxBbGxSZXF1ZXN0cyh0KXt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciYmdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHQpO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7ci5jYW5jZWwodCl9KSl9fV0pO3JldHVybiBQREZXb3JrZXJTdHJlYW19KCk7ci5QREZXb3JrZXJTdHJlYW09Yzt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIFBERldvcmtlclN0cmVhbVJlYWRlcih0KXt2YXIgcj10aGlzO19jbGFzc0NhbGxDaGVjayh0aGlzLFBERldvcmtlclN0cmVhbVJlYWRlcik7dGhpcy5fbXNnSGFuZGxlcj10O3RoaXMub25Qcm9ncmVzcz1udWxsO3RoaXMuX2NvbnRlbnRMZW5ndGg9bnVsbDt0aGlzLl9pc1JhbmdlU3VwcG9ydGVkPSExO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSExO3ZhciBhPXRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJlYWRlciIpO3RoaXMuX3JlYWRlcj1hLmdldFJlYWRlcigpO3RoaXMuX2hlYWRlcnNSZWFkeT10aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiUmVhZGVySGVhZGVyc1JlYWR5IikudGhlbigoZnVuY3Rpb24odCl7ci5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9dC5pc1N0cmVhbWluZ1N1cHBvcnRlZDtyLl9pc1JhbmdlU3VwcG9ydGVkPXQuaXNSYW5nZVN1cHBvcnRlZDtyLl9jb250ZW50TGVuZ3RoPXQuY29udGVudExlbmd0aH0pKX1fY3JlYXRlQ2xhc3MoUERGV29ya2VyU3RyZWFtUmVhZGVyLFt7a2V5OiJyZWFkIix2YWx1ZToodD1fYXN5bmNUb0dlbmVyYXRvcihpLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gX2NhbGxlZSgpe3ZhciB0LHI7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlJChhKXtmb3IoOzspc3dpdGNoKGEucHJldj1hLm5leHQpe2Nhc2UgMDphLm5leHQ9MjtyZXR1cm4gdGhpcy5fcmVhZGVyLnJlYWQoKTtjYXNlIDI6dD1hLnNlbnQ7cj10LnZhbHVlO2lmKCF0LmRvbmUpe2EubmV4dD03O2JyZWFrfXJldHVybiBhLmFicnVwdCgicmV0dXJuIix7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KTtjYXNlIDc6cmV0dXJuIGEuYWJydXB0KCJyZXR1cm4iLHt2YWx1ZTpyLmJ1ZmZlcixkb25lOiExfSk7Y2FzZSA4OmNhc2UiZW5kIjpyZXR1cm4gYS5zdG9wKCl9fSksX2NhbGxlZSx0aGlzKX0pKSksZnVuY3Rpb24gcmVhZCgpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfSx7a2V5OiJjYW5jZWwiLHZhbHVlOmZ1bmN0aW9uIGNhbmNlbCh0KXt0aGlzLl9yZWFkZXIuY2FuY2VsKHQpfX0se2tleToiaGVhZGVyc1JlYWR5IixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeX19LHtrZXk6ImNvbnRlbnRMZW5ndGgiLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fY29udGVudExlbmd0aH19LHtrZXk6ImlzU3RyZWFtaW5nU3VwcG9ydGVkIixnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkfX0se2tleToiaXNSYW5nZVN1cHBvcnRlZCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkfX1dKTt2YXIgdDtyZXR1cm4gUERGV29ya2VyU3RyZWFtUmVhZGVyfSgpLHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBQREZXb3JrZXJTdHJlYW1SYW5nZVJlYWRlcih0LHIsYSl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIpO3RoaXMuX21zZ0hhbmRsZXI9YTt0aGlzLm9uUHJvZ3Jlc3M9bnVsbDt2YXIgaT10aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRSYW5nZVJlYWRlciIse2JlZ2luOnQsZW5kOnJ9KTt0aGlzLl9yZWFkZXI9aS5nZXRSZWFkZXIoKX1fY3JlYXRlQ2xhc3MoUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIsW3trZXk6InJlYWQiLHZhbHVlOih0PV9hc3luY1RvR2VuZXJhdG9yKGkuZGVmYXVsdC5tYXJrKChmdW5jdGlvbiBfY2FsbGVlMigpe3ZhciB0LHI7cmV0dXJuIGkuZGVmYXVsdC53cmFwKChmdW5jdGlvbiBfY2FsbGVlMiQoYSl7Zm9yKDs7KXN3aXRjaChhLnByZXY9YS5uZXh0KXtjYXNlIDA6YS5uZXh0PTI7cmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkKCk7Y2FzZSAyOnQ9YS5zZW50O3I9dC52YWx1ZTtpZighdC5kb25lKXthLm5leHQ9NzticmVha31yZXR1cm4gYS5hYnJ1cHQoInJldHVybiIse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk7Y2FzZSA3OnJldHVybiBhLmFicnVwdCgicmV0dXJuIix7dmFsdWU6ci5idWZmZXIsZG9uZTohMX0pO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIGEuc3RvcCgpfX0pLF9jYWxsZWUyLHRoaXMpfSkpKSxmdW5jdGlvbiByZWFkKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9LHtrZXk6ImNhbmNlbCIsdmFsdWU6ZnVuY3Rpb24gY2FuY2VsKHQpe3RoaXMuX3JlYWRlci5jYW5jZWwodCl9fSx7a2V5OiJpc1N0cmVhbWluZ1N1cHBvcnRlZCIsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiExfX1dKTt2YXIgdDtyZXR1cm4gUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXJ9KCl9XSl9KSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXM1L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy5qcyBiL2VzNS9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzMzk2NAotLS0gL2Rldi9udWxsCisrKyBiL2VzNS9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMuanMKQEAgLTAsMCArMSwxMjUyOSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworCisoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgeworCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKKwkJbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CisJZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCisJCWRlZmluZSgicGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMiLCBbXSwgZmFjdG9yeSk7CisJZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpCisJCWV4cG9ydHNbInBkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzIl0gPSBmYWN0b3J5KCk7CisJZWxzZQorCQlyb290WyJwZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycyJdID0gcm9vdC5wZGZqc0ltYWdlRGVjb2RlcnMgPSBmYWN0b3J5KCk7Cit9KSh0aGlzLCBmdW5jdGlvbigpIHsKK3JldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwCisvKioqKioqLyAJLy8gVGhlIG1vZHVsZSBjYWNoZQorLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CisvKioqKioqLworLyoqKioqKi8gCS8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uCisvKioqKioqLyAJZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhtb2R1bGVJZCkgeworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCisvKioqKioqLyAJCWlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7CisvKioqKioqLyAJCQlyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0czsKKy8qKioqKiovIAkJfQorLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQorLyoqKioqKi8gCQl2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7CisvKioqKioqLyAJCQlpOiBtb2R1bGVJZCwKKy8qKioqKiovIAkJCWw6IGZhbHNlLAorLyoqKioqKi8gCQkJZXhwb3J0czoge30KKy8qKioqKiovIAkJfTsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgorLyoqKioqKi8gCQltb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKTsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWQKKy8qKioqKiovIAkJbW9kdWxlLmwgPSB0cnVlOworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKKy8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOworLyoqKioqKi8gCX0KKy8qKioqKiovCisvKioqKioqLworLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGUKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzOworLyoqKioqKi8KKy8qKioqKiovIAkvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHsKKy8qKioqKiovIAkJaWYoIV9fd19wZGZqc19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkgeworLyoqKioqKi8gCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7CisvKioqKioqLyAJCX0KKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykgeworLyoqKioqKi8gCQlpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHsKKy8qKioqKiovIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pOworLyoqKioqKi8gCQl9CisvKioqKioqLyAJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0CisvKioqKioqLyAJLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0CisvKioqKioqLyAJLy8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zCisvKioqKioqLyAJLy8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0CisvKioqKioqLyAJLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZQorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7CisvKioqKioqLyAJCWlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18odmFsdWUpOworLyoqKioqKi8gCQlpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlOworLyoqKioqKi8gCQlpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlOworLyoqKioqKi8gCQl2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworLyoqKioqKi8gCQlfX3dfcGRmanNfcmVxdWlyZV9fLnIobnMpOworLyoqKioqKi8gCQlPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7CisvKioqKioqLyAJCWlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd19wZGZqc19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTsKKy8qKioqKiovIAkJcmV0dXJuIG5zOworLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7CisvKioqKioqLyAJCXZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgPworLyoqKioqKi8gCQkJZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDoKKy8qKioqKiovIAkJCWZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07CisvKioqKioqLyAJCV9fd19wZGZqc19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTsKKy8qKioqKiovIAkJcmV0dXJuIGdldHRlcjsKKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07CisvKioqKioqLworLyoqKioqKi8gCS8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5wID0gIiI7CisvKioqKioqLworLyoqKioqKi8KKy8qKioqKiovIAkvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHMKKy8qKioqKiovIAlyZXR1cm4gX193X3BkZmpzX3JlcXVpcmVfXyhfX3dfcGRmanNfcmVxdWlyZV9fLnMgPSAwKTsKKy8qKioqKiovIH0pCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKi8gKFsKKy8qIDAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJnZXRWZXJib3NpdHlMZXZlbCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF91dGlsLmdldFZlcmJvc2l0eUxldmVsOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAic2V0VmVyYm9zaXR5TGV2ZWwiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdXRpbC5zZXRWZXJib3NpdHlMZXZlbDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkpiaWcybWFnZSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9qYmlnLkpiaWcybWFnZTsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkpwZWdJbWFnZSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9qcGcuSnBlZ0ltYWdlOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiSnB4SW1hZ2UiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfanB4LkpweEltYWdlOworICB9Cit9KTsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTsKKwordmFyIF9qYmlnID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzgpOworCit2YXIgX2pwZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgyKTsKKwordmFyIF9qcHggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4Myk7CisKK3ZhciBwZGZqc1ZlcnNpb24gPSAnMi42LjM0Nyc7Cit2YXIgcGRmanNCdWlsZCA9ICczYmU5YzY1Zic7CisKKy8qKiovIH0pLAorLyogMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmFycmF5Qnl0ZUxlbmd0aCA9IGFycmF5Qnl0ZUxlbmd0aDsKK2V4cG9ydHMuYXJyYXlzVG9CeXRlcyA9IGFycmF5c1RvQnl0ZXM7CitleHBvcnRzLmFzc2VydCA9IGFzc2VydDsKK2V4cG9ydHMuYnl0ZXNUb1N0cmluZyA9IGJ5dGVzVG9TdHJpbmc7CitleHBvcnRzLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHk7CitleHBvcnRzLmVzY2FwZVN0cmluZyA9IGVzY2FwZVN0cmluZzsKK2V4cG9ydHMuZ2V0TW9kaWZpY2F0aW9uRGF0ZSA9IGdldE1vZGlmaWNhdGlvbkRhdGU7CitleHBvcnRzLmdldFZlcmJvc2l0eUxldmVsID0gZ2V0VmVyYm9zaXR5TGV2ZWw7CitleHBvcnRzLmluZm8gPSBpbmZvOworZXhwb3J0cy5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjsKK2V4cG9ydHMuaXNBcnJheUVxdWFsID0gaXNBcnJheUVxdWFsOworZXhwb3J0cy5pc0Jvb2wgPSBpc0Jvb2w7CitleHBvcnRzLmlzTnVtID0gaXNOdW07CitleHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7CitleHBvcnRzLmlzU2FtZU9yaWdpbiA9IGlzU2FtZU9yaWdpbjsKK2V4cG9ydHMuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCA9IGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw7CitleHBvcnRzLnJlbW92ZU51bGxDaGFyYWN0ZXJzID0gcmVtb3ZlTnVsbENoYXJhY3RlcnM7CitleHBvcnRzLnNldFZlcmJvc2l0eUxldmVsID0gc2V0VmVyYm9zaXR5TGV2ZWw7CitleHBvcnRzLnNoYWRvdyA9IHNoYWRvdzsKK2V4cG9ydHMuc3RyaW5nMzIgPSBzdHJpbmczMjsKK2V4cG9ydHMuc3RyaW5nVG9CeXRlcyA9IHN0cmluZ1RvQnl0ZXM7CitleHBvcnRzLnN0cmluZ1RvUERGU3RyaW5nID0gc3RyaW5nVG9QREZTdHJpbmc7CitleHBvcnRzLnN0cmluZ1RvVVRGOFN0cmluZyA9IHN0cmluZ1RvVVRGOFN0cmluZzsKK2V4cG9ydHMudXRmOFN0cmluZ1RvU3RyaW5nID0gdXRmOFN0cmluZ1RvU3RyaW5nOworZXhwb3J0cy53YXJuID0gd2FybjsKK2V4cG9ydHMudW5yZWFjaGFibGUgPSB1bnJlYWNoYWJsZTsKK2V4cG9ydHMuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkID0gZXhwb3J0cy5Jc0xpdHRsZUVuZGlhbkNhY2hlZCA9IGV4cG9ydHMuY3JlYXRlT2JqZWN0VVJMID0gZXhwb3J0cy5Gb3JtYXRFcnJvciA9IGV4cG9ydHMuVXRpbCA9IGV4cG9ydHMuVW5rbm93bkVycm9yRXhjZXB0aW9uID0gZXhwb3J0cy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gZXhwb3J0cy5TdHJlYW1UeXBlID0gZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IGV4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBleHBvcnRzLlBhc3N3b3JkRXhjZXB0aW9uID0gZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gZXhwb3J0cy5JbnZhbGlkUERGRXhjZXB0aW9uID0gZXhwb3J0cy5BYm9ydEV4Y2VwdGlvbiA9IGV4cG9ydHMuQ01hcENvbXByZXNzaW9uVHlwZSA9IGV4cG9ydHMuSW1hZ2VLaW5kID0gZXhwb3J0cy5Gb250VHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblR5cGUgPSBleHBvcnRzLkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblJldmlld1N0YXRlID0gZXhwb3J0cy5Bbm5vdGF0aW9uUmVwbHlUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBleHBvcnRzLkFubm90YXRpb25GbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmllbGRGbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gZXhwb3J0cy5VTlNVUFBPUlRFRF9GRUFUVVJFUyA9IGV4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBleHBvcnRzLk9QUyA9IGV4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gZXhwb3J0cy5GT05UX0lERU5USVRZX01BVFJJWCA9IGV4cG9ydHMuQmFzZUV4Y2VwdGlvbiA9IHZvaWQgMDsKKworX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK3ZhciBJREVOVElUWV9NQVRSSVggPSBbMSwgMCwgMCwgMSwgMCwgMF07CitleHBvcnRzLklERU5USVRZX01BVFJJWCA9IElERU5USVRZX01BVFJJWDsKK3ZhciBGT05UX0lERU5USVRZX01BVFJJWCA9IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdOworZXhwb3J0cy5GT05UX0lERU5USVRZX01BVFJJWCA9IEZPTlRfSURFTlRJVFlfTUFUUklYOwordmFyIFBlcm1pc3Npb25GbGFnID0geworICBQUklOVDogMHgwNCwKKyAgTU9ESUZZX0NPTlRFTlRTOiAweDA4LAorICBDT1BZOiAweDEwLAorICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsCisgIEZJTExfSU5URVJBQ1RJVkVfRk9STVM6IDB4MTAwLAorICBDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOiAweDIwMCwKKyAgQVNTRU1CTEU6IDB4NDAwLAorICBQUklOVF9ISUdIX1FVQUxJVFk6IDB4ODAwCit9OworZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IFBlcm1pc3Npb25GbGFnOwordmFyIFRleHRSZW5kZXJpbmdNb2RlID0geworICBGSUxMOiAwLAorICBTVFJPS0U6IDEsCisgIEZJTExfU1RST0tFOiAyLAorICBJTlZJU0lCTEU6IDMsCisgIEZJTExfQUREX1RPX1BBVEg6IDQsCisgIFNUUk9LRV9BRERfVE9fUEFUSDogNSwKKyAgRklMTF9TVFJPS0VfQUREX1RPX1BBVEg6IDYsCisgIEFERF9UT19QQVRIOiA3LAorICBGSUxMX1NUUk9LRV9NQVNLOiAzLAorICBBRERfVE9fUEFUSF9GTEFHOiA0Cit9OworZXhwb3J0cy5UZXh0UmVuZGVyaW5nTW9kZSA9IFRleHRSZW5kZXJpbmdNb2RlOwordmFyIEltYWdlS2luZCA9IHsKKyAgR1JBWVNDQUxFXzFCUFA6IDEsCisgIFJHQl8yNEJQUDogMiwKKyAgUkdCQV8zMkJQUDogMworfTsKK2V4cG9ydHMuSW1hZ2VLaW5kID0gSW1hZ2VLaW5kOwordmFyIEFubm90YXRpb25UeXBlID0geworICBURVhUOiAxLAorICBMSU5LOiAyLAorICBGUkVFVEVYVDogMywKKyAgTElORTogNCwKKyAgU1FVQVJFOiA1LAorICBDSVJDTEU6IDYsCisgIFBPTFlHT046IDcsCisgIFBPTFlMSU5FOiA4LAorICBISUdITElHSFQ6IDksCisgIFVOREVSTElORTogMTAsCisgIFNRVUlHR0xZOiAxMSwKKyAgU1RSSUtFT1VUOiAxMiwKKyAgU1RBTVA6IDEzLAorICBDQVJFVDogMTQsCisgIElOSzogMTUsCisgIFBPUFVQOiAxNiwKKyAgRklMRUFUVEFDSE1FTlQ6IDE3LAorICBTT1VORDogMTgsCisgIE1PVklFOiAxOSwKKyAgV0lER0VUOiAyMCwKKyAgU0NSRUVOOiAyMSwKKyAgUFJJTlRFUk1BUks6IDIyLAorICBUUkFQTkVUOiAyMywKKyAgV0FURVJNQVJLOiAyNCwKKyAgVEhSRUVEOiAyNSwKKyAgUkVEQUNUOiAyNgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZTsKK3ZhciBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSB7CisgIE1BUktFRDogIk1hcmtlZCIsCisgIFJFVklFVzogIlJldmlldyIKK307CitleHBvcnRzLkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZTsKK3ZhciBBbm5vdGF0aW9uTWFya2VkU3RhdGUgPSB7CisgIE1BUktFRDogIk1hcmtlZCIsCisgIFVOTUFSS0VEOiAiVW5tYXJrZWQiCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBBbm5vdGF0aW9uTWFya2VkU3RhdGU7Cit2YXIgQW5ub3RhdGlvblJldmlld1N0YXRlID0geworICBBQ0NFUFRFRDogIkFjY2VwdGVkIiwKKyAgUkVKRUNURUQ6ICJSZWplY3RlZCIsCisgIENBTkNFTExFRDogIkNhbmNlbGxlZCIsCisgIENPTVBMRVRFRDogIkNvbXBsZXRlZCIsCisgIE5PTkU6ICJOb25lIgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblJldmlld1N0YXRlID0gQW5ub3RhdGlvblJldmlld1N0YXRlOwordmFyIEFubm90YXRpb25SZXBseVR5cGUgPSB7CisgIEdST1VQOiAiR3JvdXAiLAorICBSRVBMWTogIlIiCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uUmVwbHlUeXBlID0gQW5ub3RhdGlvblJlcGx5VHlwZTsKK3ZhciBBbm5vdGF0aW9uRmxhZyA9IHsKKyAgSU5WSVNJQkxFOiAweDAxLAorICBISURERU46IDB4MDIsCisgIFBSSU5UOiAweDA0LAorICBOT1pPT006IDB4MDgsCisgIE5PUk9UQVRFOiAweDEwLAorICBOT1ZJRVc6IDB4MjAsCisgIFJFQURPTkxZOiAweDQwLAorICBMT0NLRUQ6IDB4ODAsCisgIFRPR0dMRU5PVklFVzogMHgxMDAsCisgIExPQ0tFRENPTlRFTlRTOiAweDIwMAorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkZsYWcgPSBBbm5vdGF0aW9uRmxhZzsKK3ZhciBBbm5vdGF0aW9uRmllbGRGbGFnID0geworICBSRUFET05MWTogMHgwMDAwMDAxLAorICBSRVFVSVJFRDogMHgwMDAwMDAyLAorICBOT0VYUE9SVDogMHgwMDAwMDA0LAorICBNVUxUSUxJTkU6IDB4MDAwMTAwMCwKKyAgUEFTU1dPUkQ6IDB4MDAwMjAwMCwKKyAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLAorICBSQURJTzogMHgwMDA4MDAwLAorICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsCisgIENPTUJPOiAweDAwMjAwMDAsCisgIEVESVQ6IDB4MDA0MDAwMCwKKyAgU09SVDogMHgwMDgwMDAwLAorICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsCisgIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsCisgIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLAorICBET05PVFNDUk9MTDogMHgwODAwMDAwLAorICBDT01COiAweDEwMDAwMDAsCisgIFJJQ0hURVhUOiAweDIwMDAwMDAsCisgIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsCisgIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDAKK307CitleHBvcnRzLkFubm90YXRpb25GaWVsZEZsYWcgPSBBbm5vdGF0aW9uRmllbGRGbGFnOwordmFyIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSB7CisgIFNPTElEOiAxLAorICBEQVNIRUQ6IDIsCisgIEJFVkVMRUQ6IDMsCisgIElOU0VUOiA0LAorICBVTkRFUkxJTkU6IDUKK307CitleHBvcnRzLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlOwordmFyIFN0cmVhbVR5cGUgPSB7CisgIFVOS05PV046ICJVTktOT1dOIiwKKyAgRkxBVEU6ICJGTEFURSIsCisgIExaVzogIkxaVyIsCisgIERDVDogIkRDVCIsCisgIEpQWDogIkpQWCIsCisgIEpCSUc6ICJKQklHIiwKKyAgQTg1OiAiQTg1IiwKKyAgQUhYOiAiQUhYIiwKKyAgQ0NGOiAiQ0NGIiwKKyAgUkxYOiAiUkxYIgorfTsKK2V4cG9ydHMuU3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU7Cit2YXIgRm9udFR5cGUgPSB7CisgIFVOS05PV046ICJVTktOT1dOIiwKKyAgVFlQRTE6ICJUWVBFMSIsCisgIFRZUEUxQzogIlRZUEUxQyIsCisgIENJREZPTlRUWVBFMDogIkNJREZPTlRUWVBFMCIsCisgIENJREZPTlRUWVBFMEM6ICJDSURGT05UVFlQRTBDIiwKKyAgVFJVRVRZUEU6ICJUUlVFVFlQRSIsCisgIENJREZPTlRUWVBFMjogIkNJREZPTlRUWVBFMiIsCisgIFRZUEUzOiAiVFlQRTMiLAorICBPUEVOVFlQRTogIk9QRU5UWVBFIiwKKyAgVFlQRTA6ICJUWVBFMCIsCisgIE1NVFlQRTE6ICJNTVRZUEUxIgorfTsKK2V4cG9ydHMuRm9udFR5cGUgPSBGb250VHlwZTsKK3ZhciBWZXJib3NpdHlMZXZlbCA9IHsKKyAgRVJST1JTOiAwLAorICBXQVJOSU5HUzogMSwKKyAgSU5GT1M6IDUKK307CitleHBvcnRzLlZlcmJvc2l0eUxldmVsID0gVmVyYm9zaXR5TGV2ZWw7Cit2YXIgQ01hcENvbXByZXNzaW9uVHlwZSA9IHsKKyAgTk9ORTogMCwKKyAgQklOQVJZOiAxLAorICBTVFJFQU06IDIKK307CitleHBvcnRzLkNNYXBDb21wcmVzc2lvblR5cGUgPSBDTWFwQ29tcHJlc3Npb25UeXBlOwordmFyIE9QUyA9IHsKKyAgZGVwZW5kZW5jeTogMSwKKyAgc2V0TGluZVdpZHRoOiAyLAorICBzZXRMaW5lQ2FwOiAzLAorICBzZXRMaW5lSm9pbjogNCwKKyAgc2V0TWl0ZXJMaW1pdDogNSwKKyAgc2V0RGFzaDogNiwKKyAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LAorICBzZXRGbGF0bmVzczogOCwKKyAgc2V0R1N0YXRlOiA5LAorICBzYXZlOiAxMCwKKyAgcmVzdG9yZTogMTEsCisgIHRyYW5zZm9ybTogMTIsCisgIG1vdmVUbzogMTMsCisgIGxpbmVUbzogMTQsCisgIGN1cnZlVG86IDE1LAorICBjdXJ2ZVRvMjogMTYsCisgIGN1cnZlVG8zOiAxNywKKyAgY2xvc2VQYXRoOiAxOCwKKyAgcmVjdGFuZ2xlOiAxOSwKKyAgc3Ryb2tlOiAyMCwKKyAgY2xvc2VTdHJva2U6IDIxLAorICBmaWxsOiAyMiwKKyAgZW9GaWxsOiAyMywKKyAgZmlsbFN0cm9rZTogMjQsCisgIGVvRmlsbFN0cm9rZTogMjUsCisgIGNsb3NlRmlsbFN0cm9rZTogMjYsCisgIGNsb3NlRU9GaWxsU3Ryb2tlOiAyNywKKyAgZW5kUGF0aDogMjgsCisgIGNsaXA6IDI5LAorICBlb0NsaXA6IDMwLAorICBiZWdpblRleHQ6IDMxLAorICBlbmRUZXh0OiAzMiwKKyAgc2V0Q2hhclNwYWNpbmc6IDMzLAorICBzZXRXb3JkU3BhY2luZzogMzQsCisgIHNldEhTY2FsZTogMzUsCisgIHNldExlYWRpbmc6IDM2LAorICBzZXRGb250OiAzNywKKyAgc2V0VGV4dFJlbmRlcmluZ01vZGU6IDM4LAorICBzZXRUZXh0UmlzZTogMzksCisgIG1vdmVUZXh0OiA0MCwKKyAgc2V0TGVhZGluZ01vdmVUZXh0OiA0MSwKKyAgc2V0VGV4dE1hdHJpeDogNDIsCisgIG5leHRMaW5lOiA0MywKKyAgc2hvd1RleHQ6IDQ0LAorICBzaG93U3BhY2VkVGV4dDogNDUsCisgIG5leHRMaW5lU2hvd1RleHQ6IDQ2LAorICBuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDogNDcsCisgIHNldENoYXJXaWR0aDogNDgsCisgIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksCisgIHNldFN0cm9rZUNvbG9yU3BhY2U6IDUwLAorICBzZXRGaWxsQ29sb3JTcGFjZTogNTEsCisgIHNldFN0cm9rZUNvbG9yOiA1MiwKKyAgc2V0U3Ryb2tlQ29sb3JOOiA1MywKKyAgc2V0RmlsbENvbG9yOiA1NCwKKyAgc2V0RmlsbENvbG9yTjogNTUsCisgIHNldFN0cm9rZUdyYXk6IDU2LAorICBzZXRGaWxsR3JheTogNTcsCisgIHNldFN0cm9rZVJHQkNvbG9yOiA1OCwKKyAgc2V0RmlsbFJHQkNvbG9yOiA1OSwKKyAgc2V0U3Ryb2tlQ01ZS0NvbG9yOiA2MCwKKyAgc2V0RmlsbENNWUtDb2xvcjogNjEsCisgIHNoYWRpbmdGaWxsOiA2MiwKKyAgYmVnaW5JbmxpbmVJbWFnZTogNjMsCisgIGJlZ2luSW1hZ2VEYXRhOiA2NCwKKyAgZW5kSW5saW5lSW1hZ2U6IDY1LAorICBwYWludFhPYmplY3Q6IDY2LAorICBtYXJrUG9pbnQ6IDY3LAorICBtYXJrUG9pbnRQcm9wczogNjgsCisgIGJlZ2luTWFya2VkQ29udGVudDogNjksCisgIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCwKKyAgZW5kTWFya2VkQ29udGVudDogNzEsCisgIGJlZ2luQ29tcGF0OiA3MiwKKyAgZW5kQ29tcGF0OiA3MywKKyAgcGFpbnRGb3JtWE9iamVjdEJlZ2luOiA3NCwKKyAgcGFpbnRGb3JtWE9iamVjdEVuZDogNzUsCisgIGJlZ2luR3JvdXA6IDc2LAorICBlbmRHcm91cDogNzcsCisgIGJlZ2luQW5ub3RhdGlvbnM6IDc4LAorICBlbmRBbm5vdGF0aW9uczogNzksCisgIGJlZ2luQW5ub3RhdGlvbjogODAsCisgIGVuZEFubm90YXRpb246IDgxLAorICBwYWludEpwZWdYT2JqZWN0OiA4MiwKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiA4MywKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LAorICBwYWludEltYWdlWE9iamVjdDogODUsCisgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiA4NiwKKyAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsCisgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiA4OCwKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0OiA4OSwKKyAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCwKKyAgY29uc3RydWN0UGF0aDogOTEKK307CitleHBvcnRzLk9QUyA9IE9QUzsKK3ZhciBVTlNVUFBPUlRFRF9GRUFUVVJFUyA9IHsKKyAgdW5rbm93bjogInVua25vd24iLAorICBmb3JtczogImZvcm1zIiwKKyAgamF2YVNjcmlwdDogImphdmFTY3JpcHQiLAorICBzbWFzazogInNtYXNrIiwKKyAgc2hhZGluZ1BhdHRlcm46ICJzaGFkaW5nUGF0dGVybiIsCisgIGZvbnQ6ICJmb250IiwKKyAgZXJyb3JUaWxpbmdQYXR0ZXJuOiAiZXJyb3JUaWxpbmdQYXR0ZXJuIiwKKyAgZXJyb3JFeHRHU3RhdGU6ICJlcnJvckV4dEdTdGF0ZSIsCisgIGVycm9yWE9iamVjdDogImVycm9yWE9iamVjdCIsCisgIGVycm9yRm9udExvYWRUeXBlMzogImVycm9yRm9udExvYWRUeXBlMyIsCisgIGVycm9yRm9udFN0YXRlOiAiZXJyb3JGb250U3RhdGUiLAorICBlcnJvckZvbnRNaXNzaW5nOiAiZXJyb3JGb250TWlzc2luZyIsCisgIGVycm9yRm9udFRyYW5zbGF0ZTogImVycm9yRm9udFRyYW5zbGF0ZSIsCisgIGVycm9yQ29sb3JTcGFjZTogImVycm9yQ29sb3JTcGFjZSIsCisgIGVycm9yT3BlcmF0b3JMaXN0OiAiZXJyb3JPcGVyYXRvckxpc3QiLAorICBlcnJvckZvbnRUb1VuaWNvZGU6ICJlcnJvckZvbnRUb1VuaWNvZGUiLAorICBlcnJvckZvbnRMb2FkTmF0aXZlOiAiZXJyb3JGb250TG9hZE5hdGl2ZSIsCisgIGVycm9yRm9udEdldFBhdGg6ICJlcnJvckZvbnRHZXRQYXRoIiwKKyAgZXJyb3JNYXJrZWRDb250ZW50OiAiZXJyb3JNYXJrZWRDb250ZW50IgorfTsKK2V4cG9ydHMuVU5TVVBQT1JURURfRkVBVFVSRVMgPSBVTlNVUFBPUlRFRF9GRUFUVVJFUzsKK3ZhciBQYXNzd29yZFJlc3BvbnNlcyA9IHsKKyAgTkVFRF9QQVNTV09SRDogMSwKKyAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyCit9OworZXhwb3J0cy5QYXNzd29yZFJlc3BvbnNlcyA9IFBhc3N3b3JkUmVzcG9uc2VzOwordmFyIHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTOworCitmdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkgeworICBpZiAoTnVtYmVyLmlzSW50ZWdlcihsZXZlbCkpIHsKKyAgICB2ZXJib3NpdHkgPSBsZXZlbDsKKyAgfQorfQorCitmdW5jdGlvbiBnZXRWZXJib3NpdHlMZXZlbCgpIHsKKyAgcmV0dXJuIHZlcmJvc2l0eTsKK30KKworZnVuY3Rpb24gaW5mbyhtc2cpIHsKKyAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykgeworICAgIGNvbnNvbGUubG9nKCJJbmZvOiAiLmNvbmNhdChtc2cpKTsKKyAgfQorfQorCitmdW5jdGlvbiB3YXJuKG1zZykgeworICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7CisgICAgY29uc29sZS5sb2coIldhcm5pbmc6ICIuY29uY2F0KG1zZykpOworICB9Cit9CisKK2Z1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykgeworICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKK30KKworZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykgeworICBpZiAoIWNvbmQpIHsKKyAgICB1bnJlYWNoYWJsZShtc2cpOworICB9Cit9CisKK2Z1bmN0aW9uIGlzU2FtZU9yaWdpbihiYXNlVXJsLCBvdGhlclVybCkgeworICB2YXIgYmFzZTsKKworICB0cnkgeworICAgIGJhc2UgPSBuZXcgVVJMKGJhc2VVcmwpOworCisgICAgaWYgKCFiYXNlLm9yaWdpbiB8fCBiYXNlLm9yaWdpbiA9PT0gIm51bGwiKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmFyIG90aGVyID0gbmV3IFVSTChvdGhlclVybCwgYmFzZSk7CisgIHJldHVybiBiYXNlLm9yaWdpbiA9PT0gb3RoZXIub3JpZ2luOworfQorCitmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkgeworICBpZiAoIXVybCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN3aXRjaCAodXJsLnByb3RvY29sKSB7CisgICAgY2FzZSAiaHR0cDoiOgorICAgIGNhc2UgImh0dHBzOiI6CisgICAgY2FzZSAiZnRwOiI6CisgICAgY2FzZSAibWFpbHRvOiI6CisgICAgY2FzZSAidGVsOiI6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwpIHsKKyAgaWYgKCF1cmwpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHRyeSB7CisgICAgdmFyIGFic29sdXRlVXJsID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTsKKworICAgIGlmIChfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSkgeworICAgICAgcmV0dXJuIGFic29sdXRlVXJsOworICAgIH0KKyAgfSBjYXRjaCAoZXgpIHt9CisKKyAgcmV0dXJuIG51bGw7Cit9CisKK2Z1bmN0aW9uIHNoYWRvdyhvYmosIHByb3AsIHZhbHVlKSB7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHsKKyAgICB2YWx1ZTogdmFsdWUsCisgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgd3JpdGFibGU6IGZhbHNlCisgIH0pOworICByZXR1cm4gdmFsdWU7Cit9CisKK3ZhciBCYXNlRXhjZXB0aW9uID0gZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSkgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7CisgICAgICB1bnJlYWNoYWJsZSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi4iKTsKKyAgICB9CisKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgfQorCisgIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7CisgIEJhc2VFeGNlcHRpb24uY29uc3RydWN0b3IgPSBCYXNlRXhjZXB0aW9uOworICByZXR1cm4gQmFzZUV4Y2VwdGlvbjsKK30oKTsKKworZXhwb3J0cy5CYXNlRXhjZXB0aW9uID0gQmFzZUV4Y2VwdGlvbjsKKwordmFyIFBhc3N3b3JkRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbikgeworICBfaW5oZXJpdHMoUGFzc3dvcmRFeGNlcHRpb24sIF9CYXNlRXhjZXB0aW9uKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFBhc3N3b3JkRXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBQYXNzd29yZEV4Y2VwdGlvbihtc2csIGNvZGUpIHsKKyAgICB2YXIgX3RoaXM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFzc3dvcmRFeGNlcHRpb24pOworCisgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpOworICAgIF90aGlzLmNvZGUgPSBjb2RlOworICAgIHJldHVybiBfdGhpczsKKyAgfQorCisgIHJldHVybiBQYXNzd29yZEV4Y2VwdGlvbjsKK30oQmFzZUV4Y2VwdGlvbik7CisKK2V4cG9ydHMuUGFzc3dvcmRFeGNlcHRpb24gPSBQYXNzd29yZEV4Y2VwdGlvbjsKKwordmFyIFVua25vd25FcnJvckV4Y2VwdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24yKSB7CisgIF9pbmhlcml0cyhVbmtub3duRXJyb3JFeGNlcHRpb24sIF9CYXNlRXhjZXB0aW9uMik7CisKKyAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoVW5rbm93bkVycm9yRXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBVbmtub3duRXJyb3JFeGNlcHRpb24obXNnLCBkZXRhaWxzKSB7CisgICAgdmFyIF90aGlzMjsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBVbmtub3duRXJyb3JFeGNlcHRpb24pOworCisgICAgX3RoaXMyID0gX3N1cGVyMi5jYWxsKHRoaXMsIG1zZyk7CisgICAgX3RoaXMyLmRldGFpbHMgPSBkZXRhaWxzOworICAgIHJldHVybiBfdGhpczI7CisgIH0KKworICByZXR1cm4gVW5rbm93bkVycm9yRXhjZXB0aW9uOworfShCYXNlRXhjZXB0aW9uKTsKKworZXhwb3J0cy5Vbmtub3duRXJyb3JFeGNlcHRpb24gPSBVbmtub3duRXJyb3JFeGNlcHRpb247CisKK3ZhciBJbnZhbGlkUERGRXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjMpIHsKKyAgX2luaGVyaXRzKEludmFsaWRQREZFeGNlcHRpb24sIF9CYXNlRXhjZXB0aW9uMyk7CisKKyAgdmFyIF9zdXBlcjMgPSBfY3JlYXRlU3VwZXIoSW52YWxpZFBERkV4Y2VwdGlvbik7CisKKyAgZnVuY3Rpb24gSW52YWxpZFBERkV4Y2VwdGlvbigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZFBERkV4Y2VwdGlvbik7CisKKyAgICByZXR1cm4gX3N1cGVyMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9CisKKyAgcmV0dXJuIEludmFsaWRQREZFeGNlcHRpb247Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLkludmFsaWRQREZFeGNlcHRpb24gPSBJbnZhbGlkUERGRXhjZXB0aW9uOworCit2YXIgTWlzc2luZ1BERkV4Y2VwdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb240KSB7CisgIF9pbmhlcml0cyhNaXNzaW5nUERGRXhjZXB0aW9uLCBfQmFzZUV4Y2VwdGlvbjQpOworCisgIHZhciBfc3VwZXI0ID0gX2NyZWF0ZVN1cGVyKE1pc3NpbmdQREZFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIE1pc3NpbmdQREZFeGNlcHRpb24oKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1pc3NpbmdQREZFeGNlcHRpb24pOworCisgICAgcmV0dXJuIF9zdXBlcjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfQorCisgIHJldHVybiBNaXNzaW5nUERGRXhjZXB0aW9uOworfShCYXNlRXhjZXB0aW9uKTsKKworZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gTWlzc2luZ1BERkV4Y2VwdGlvbjsKKwordmFyIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb241KSB7CisgIF9pbmhlcml0cyhVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sIF9CYXNlRXhjZXB0aW9uNSk7CisKKyAgdmFyIF9zdXBlcjUgPSBfY3JlYXRlU3VwZXIoVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKTsKKworICBmdW5jdGlvbiBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24obXNnLCBzdGF0dXMpIHsKKyAgICB2YXIgX3RoaXMzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbik7CisKKyAgICBfdGhpczMgPSBfc3VwZXI1LmNhbGwodGhpcywgbXNnKTsKKyAgICBfdGhpczMuc3RhdHVzID0gc3RhdHVzOworICAgIHJldHVybiBfdGhpczM7CisgIH0KKworICByZXR1cm4gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uOworfShCYXNlRXhjZXB0aW9uKTsKKworZXhwb3J0cy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb247CisKK3ZhciBGb3JtYXRFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb242KSB7CisgIF9pbmhlcml0cyhGb3JtYXRFcnJvciwgX0Jhc2VFeGNlcHRpb242KTsKKworICB2YXIgX3N1cGVyNiA9IF9jcmVhdGVTdXBlcihGb3JtYXRFcnJvcik7CisKKyAgZnVuY3Rpb24gRm9ybWF0RXJyb3IoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdEVycm9yKTsKKworICAgIHJldHVybiBfc3VwZXI2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICByZXR1cm4gRm9ybWF0RXJyb3I7Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLkZvcm1hdEVycm9yID0gRm9ybWF0RXJyb3I7CisKK3ZhciBBYm9ydEV4Y2VwdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb243KSB7CisgIF9pbmhlcml0cyhBYm9ydEV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb243KTsKKworICB2YXIgX3N1cGVyNyA9IF9jcmVhdGVTdXBlcihBYm9ydEV4Y2VwdGlvbik7CisKKyAgZnVuY3Rpb24gQWJvcnRFeGNlcHRpb24oKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFib3J0RXhjZXB0aW9uKTsKKworICAgIHJldHVybiBfc3VwZXI3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICByZXR1cm4gQWJvcnRFeGNlcHRpb247Cit9KEJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLkFib3J0RXhjZXB0aW9uID0gQWJvcnRFeGNlcHRpb247Cit2YXIgTnVsbENoYXJhY3RlcnNSZWdFeHAgPSAvXHgwMC9nOworCitmdW5jdGlvbiByZW1vdmVOdWxsQ2hhcmFjdGVycyhzdHIpIHsKKyAgaWYgKHR5cGVvZiBzdHIgIT09ICJzdHJpbmciKSB7CisgICAgd2FybigiVGhlIGFyZ3VtZW50IGZvciByZW1vdmVOdWxsQ2hhcmFjdGVycyBtdXN0IGJlIGEgc3RyaW5nLiIpOworICAgIHJldHVybiBzdHI7CisgIH0KKworICByZXR1cm4gc3RyLnJlcGxhY2UoTnVsbENoYXJhY3RlcnNSZWdFeHAsICIiKTsKK30KKworZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyhieXRlcykgeworICBhc3NlcnQoYnl0ZXMgIT09IG51bGwgJiYgX3R5cGVvZihieXRlcykgPT09ICJvYmplY3QiICYmIGJ5dGVzLmxlbmd0aCAhPT0gdW5kZWZpbmVkLCAiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZyIpOworICB2YXIgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICB2YXIgTUFYX0FSR1VNRU5UX0NPVU5UID0gODE5MjsKKworICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7CisgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpOworICB9CisKKyAgdmFyIHN0ckJ1ZiA9IFtdOworCisgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IE1BWF9BUkdVTUVOVF9DT1VOVCkgeworICAgIHZhciBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7CisgICAgdmFyIGNodW5rID0gYnl0ZXMuc3ViYXJyYXkoaSwgY2h1bmtFbmQpOworICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKKyAgfQorCisgIHJldHVybiBzdHJCdWYuam9pbigiIik7Cit9CisKK2Z1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7CisgIGFzc2VydCh0eXBlb2Ygc3RyID09PSAic3RyaW5nIiwgIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTsKKyAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGg7CisgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmOworICB9CisKKyAgcmV0dXJuIGJ5dGVzOworfQorCitmdW5jdGlvbiBhcnJheUJ5dGVMZW5ndGgoYXJyKSB7CisgIGlmIChhcnIubGVuZ3RoICE9PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gYXJyLmxlbmd0aDsKKyAgfQorCisgIGFzc2VydChhcnIuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkLCAiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC4iKTsKKyAgcmV0dXJuIGFyci5ieXRlTGVuZ3RoOworfQorCitmdW5jdGlvbiBhcnJheXNUb0J5dGVzKGFycikgeworICB2YXIgbGVuZ3RoID0gYXJyLmxlbmd0aDsKKworICBpZiAobGVuZ3RoID09PSAxICYmIGFyclswXSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKKyAgICByZXR1cm4gYXJyWzBdOworICB9CisKKyAgdmFyIHJlc3VsdExlbmd0aCA9IDA7CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgIHJlc3VsdExlbmd0aCArPSBhcnJheUJ5dGVMZW5ndGgoYXJyW2ldKTsKKyAgfQorCisgIHZhciBwb3MgPSAwOworICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KHJlc3VsdExlbmd0aCk7CisKKyAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbmd0aDsgX2krKykgeworICAgIHZhciBpdGVtID0gYXJyW19pXTsKKworICAgIGlmICghKGl0ZW0gaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgeworICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAic3RyaW5nIikgeworICAgICAgICBpdGVtID0gc3RyaW5nVG9CeXRlcyhpdGVtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGl0ZW0gPSBuZXcgVWludDhBcnJheShpdGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgaXRlbUxlbmd0aCA9IGl0ZW0uYnl0ZUxlbmd0aDsKKyAgICBkYXRhLnNldChpdGVtLCBwb3MpOworICAgIHBvcyArPSBpdGVtTGVuZ3RoOworICB9CisKKyAgcmV0dXJuIGRhdGE7Cit9CisKK2Z1bmN0aW9uIHN0cmluZzMyKHZhbHVlKSB7CisgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKK30KKworZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7CisgIHZhciBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7CisgIGJ1ZmZlcjhbMF0gPSAxOworICB2YXIgdmlldzMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcjguYnVmZmVyLCAwLCAxKTsKKyAgcmV0dXJuIHZpZXczMlswXSA9PT0gMTsKK30KKwordmFyIElzTGl0dGxlRW5kaWFuQ2FjaGVkID0geworICBnZXQgdmFsdWUoKSB7CisgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmFsdWUiLCBpc0xpdHRsZUVuZGlhbigpKTsKKyAgfQorCit9OworZXhwb3J0cy5Jc0xpdHRsZUVuZGlhbkNhY2hlZCA9IElzTGl0dGxlRW5kaWFuQ2FjaGVkOworCitmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7CisgIHRyeSB7CisgICAgbmV3IEZ1bmN0aW9uKCIiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2YXIgSXNFdmFsU3VwcG9ydGVkQ2FjaGVkID0geworICBnZXQgdmFsdWUoKSB7CisgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmFsdWUiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7CisgIH0KKworfTsKK2V4cG9ydHMuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkID0gSXNFdmFsU3VwcG9ydGVkQ2FjaGVkOwordmFyIHJnYkJ1ZiA9IFsicmdiKCIsIDAsICIsIiwgMCwgIiwiLCAwLCAiKSJdOworCit2YXIgVXRpbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFV0aWwoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFV0aWwpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFV0aWwsIG51bGwsIFt7CisgICAga2V5OiAibWFrZUNzc1JnYiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG1ha2VDc3NSZ2IociwgZywgYikgeworICAgICAgcmdiQnVmWzFdID0gcjsKKyAgICAgIHJnYkJ1ZlszXSA9IGc7CisgICAgICByZ2JCdWZbNV0gPSBiOworICAgICAgcmV0dXJuIHJnYkJ1Zi5qb2luKCIiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJ0cmFuc2Zvcm0iLAorICAgIHZhbHVlOiBmdW5jdGlvbiB0cmFuc2Zvcm0obTEsIG0yKSB7CisgICAgICByZXR1cm4gW20xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLCBtMVsxXSAqIG0yWzBdICsgbTFbM10gKiBtMlsxXSwgbTFbMF0gKiBtMlsyXSArIG0xWzJdICogbTJbM10sIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLCBtMVswXSAqIG0yWzRdICsgbTFbMl0gKiBtMls1XSArIG0xWzRdLCBtMVsxXSAqIG0yWzRdICsgbTFbM10gKiBtMls1XSArIG0xWzVdXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJhcHBseVRyYW5zZm9ybSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5VHJhbnNmb3JtKHAsIG0pIHsKKyAgICAgIHZhciB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdOworICAgICAgdmFyIHl0ID0gcFswXSAqIG1bMV0gKyBwWzFdICogbVszXSArIG1bNV07CisgICAgICByZXR1cm4gW3h0LCB5dF07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiYXBwbHlJbnZlcnNlVHJhbnNmb3JtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHAsIG0pIHsKKyAgICAgIHZhciBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTsKKyAgICAgIHZhciB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkOworICAgICAgdmFyIHl0ID0gKC1wWzBdICogbVsxXSArIHBbMV0gKiBtWzBdICsgbVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkOworICAgICAgcmV0dXJuIFt4dCwgeXRdOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkgeworICAgICAgdmFyIHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLCBtKTsKKyAgICAgIHZhciBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7CisgICAgICB2YXIgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7CisgICAgICB2YXIgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7CisgICAgICByZXR1cm4gW01hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5taW4ocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pLCBNYXRoLm1heChwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKV07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaW52ZXJzZVRyYW5zZm9ybSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGludmVyc2VUcmFuc2Zvcm0obSkgeworICAgICAgdmFyIGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOworICAgICAgcmV0dXJuIFttWzNdIC8gZCwgLW1bMV0gLyBkLCAtbVsyXSAvIGQsIG1bMF0gLyBkLCAobVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkLCAobVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkXTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJhcHBseTNkVHJhbnNmb3JtIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkzZFRyYW5zZm9ybShtLCB2KSB7CisgICAgICByZXR1cm4gW21bMF0gKiB2WzBdICsgbVsxXSAqIHZbMV0gKyBtWzJdICogdlsyXSwgbVszXSAqIHZbMF0gKyBtWzRdICogdlsxXSArIG1bNV0gKiB2WzJdLCBtWzZdICogdlswXSArIG1bN10gKiB2WzFdICsgbVs4XSAqIHZbMl1dOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkgeworICAgICAgdmFyIHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTsKKyAgICAgIHZhciBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07CisgICAgICB2YXIgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdOworICAgICAgdmFyIGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTsKKyAgICAgIHZhciBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107CisgICAgICB2YXIgZmlyc3QgPSAoYSArIGQpIC8gMjsKKyAgICAgIHZhciBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqIChhICsgZCkgLSA0ICogKGEgKiBkIC0gYyAqIGIpKSAvIDI7CisgICAgICB2YXIgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxOworICAgICAgdmFyIHN5ID0gZmlyc3QgLSBzZWNvbmQgfHwgMTsKKyAgICAgIHJldHVybiBbTWF0aC5zcXJ0KHN4KSwgTWF0aC5zcXJ0KHN5KV07CisgICAgfQorICB9LCB7CisgICAga2V5OiAibm9ybWFsaXplUmVjdCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlY3QocmVjdCkgeworICAgICAgdmFyIHIgPSByZWN0LnNsaWNlKDApOworCisgICAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHsKKyAgICAgICAgclswXSA9IHJlY3RbMl07CisgICAgICAgIHJbMl0gPSByZWN0WzBdOworICAgICAgfQorCisgICAgICBpZiAocmVjdFsxXSA+IHJlY3RbM10pIHsKKyAgICAgICAgclsxXSA9IHJlY3RbM107CisgICAgICAgIHJbM10gPSByZWN0WzFdOworICAgICAgfQorCisgICAgICByZXR1cm4gcjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpbnRlcnNlY3QiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnNlY3QocmVjdDEsIHJlY3QyKSB7CisgICAgICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHsKKyAgICAgICAgcmV0dXJuIGEgLSBiOworICAgICAgfQorCisgICAgICB2YXIgb3JkZXJlZFggPSBbcmVjdDFbMF0sIHJlY3QxWzJdLCByZWN0MlswXSwgcmVjdDJbMl1dLnNvcnQoY29tcGFyZSk7CisgICAgICB2YXIgb3JkZXJlZFkgPSBbcmVjdDFbMV0sIHJlY3QxWzNdLCByZWN0MlsxXSwgcmVjdDJbM11dLnNvcnQoY29tcGFyZSk7CisgICAgICB2YXIgcmVzdWx0ID0gW107CisgICAgICByZWN0MSA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0MSk7CisgICAgICByZWN0MiA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0Mik7CisKKyAgICAgIGlmIChvcmRlcmVkWFswXSA9PT0gcmVjdDFbMF0gJiYgb3JkZXJlZFhbMV0gPT09IHJlY3QyWzBdIHx8IG9yZGVyZWRYWzBdID09PSByZWN0MlswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDFbMF0pIHsKKyAgICAgICAgcmVzdWx0WzBdID0gb3JkZXJlZFhbMV07CisgICAgICAgIHJlc3VsdFsyXSA9IG9yZGVyZWRYWzJdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChvcmRlcmVkWVswXSA9PT0gcmVjdDFbMV0gJiYgb3JkZXJlZFlbMV0gPT09IHJlY3QyWzFdIHx8IG9yZGVyZWRZWzBdID09PSByZWN0MlsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDFbMV0pIHsKKyAgICAgICAgcmVzdWx0WzFdID0gb3JkZXJlZFlbMV07CisgICAgICAgIHJlc3VsdFszXSA9IG9yZGVyZWRZWzJdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFV0aWw7Cit9KCk7CisKK2V4cG9ydHMuVXRpbCA9IFV0aWw7Cit2YXIgUERGU3RyaW5nVHJhbnNsYXRlVGFibGUgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyRDgsIDB4MkM3LCAweDJDNiwgMHgyRDksIDB4MkRELCAweDJEQiwgMHgyREEsIDB4MkRDLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDIwMjIsIDB4MjAyMCwgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDE5MiwgMHgyMDQ0LCAweDIwMzksIDB4MjAzQSwgMHgyMjEyLCAweDIwMzAsIDB4MjAxRSwgMHgyMDFDLCAweDIwMUQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUEsIDB4MjEyMiwgMHhGQjAxLCAweEZCMDIsIDB4MTQxLCAweDE1MiwgMHgxNjAsIDB4MTc4LCAweDE3RCwgMHgxMzEsIDB4MTQyLCAweDE1MywgMHgxNjEsIDB4MTdFLCAwLCAweDIwQUNdOworCitmdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhzdHIpIHsKKyAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGgsCisgICAgICBzdHJCdWYgPSBbXTsKKworICBpZiAoc3RyWzBdID09PSAiXHhGRSIgJiYgc3RyWzFdID09PSAiXHhGRiIpIHsKKyAgICBmb3IgKHZhciBpID0gMjsgaSA8IGxlbmd0aDsgaSArPSAyKSB7CisgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ci5jaGFyQ29kZUF0KGkpIDw8IDggfCBzdHIuY2hhckNvZGVBdChpICsgMSkpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyWzBdID09PSAiXHhGRiIgJiYgc3RyWzFdID09PSAiXHhGRSIpIHsKKyAgICBmb3IgKHZhciBfaTIgPSAyOyBfaTIgPCBsZW5ndGg7IF9pMiArPSAyKSB7CisgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ci5jaGFyQ29kZUF0KF9pMiArIDEpIDw8IDggfCBzdHIuY2hhckNvZGVBdChfaTIpKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGxlbmd0aDsgKytfaTMpIHsKKyAgICAgIHZhciBjb2RlID0gUERGU3RyaW5nVHJhbnNsYXRlVGFibGVbc3RyLmNoYXJDb2RlQXQoX2kzKV07CisgICAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoX2kzKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cikgeworICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXChcKVxcXSkvZywgIlxcJDEiKTsKK30KKworZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cikgeworICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTsKK30KKworZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikgeworICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOworfQorCitmdW5jdGlvbiBpc0Jvb2wodikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJib29sZWFuIjsKK30KKworZnVuY3Rpb24gaXNOdW0odikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJudW1iZXIiOworfQorCitmdW5jdGlvbiBpc1N0cmluZyh2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gInN0cmluZyI7Cit9CisKK2Z1bmN0aW9uIGlzQXJyYXlCdWZmZXIodikgeworICByZXR1cm4gX3R5cGVvZih2KSA9PT0gIm9iamVjdCIgJiYgdiAhPT0gbnVsbCAmJiB2LmJ5dGVMZW5ndGggIT09IHVuZGVmaW5lZDsKK30KKworZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycjEsIGFycjIpIHsKKyAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBhcnIxLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkgeworICAgIHJldHVybiBlbGVtZW50ID09PSBhcnIyW2luZGV4XTsKKyAgfSk7Cit9CisKK2Z1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoKSB7CisgIHZhciBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgRGF0ZShEYXRlLm5vdygpKTsKKyAgdmFyIGJ1ZmZlciA9IFtkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgKGRhdGUuZ2V0VVRDRGF0ZSgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKV07CisgIHJldHVybiBidWZmZXIuam9pbigiIik7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCkgeworICB2YXIgY2FwYWJpbGl0eSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIHZhciBpc1NldHRsZWQgPSBmYWxzZTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhcGFiaWxpdHksICJzZXR0bGVkIiwgeworICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIGlzU2V0dGxlZDsKKyAgICB9CisgIH0pOworICBjYXBhYmlsaXR5LnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgY2FwYWJpbGl0eS5yZXNvbHZlID0gZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgIGlzU2V0dGxlZCA9IHRydWU7CisgICAgICByZXNvbHZlKGRhdGEpOworICAgIH07CisKKyAgICBjYXBhYmlsaXR5LnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGlzU2V0dGxlZCA9IHRydWU7CisgICAgICByZWplY3QocmVhc29uKTsKKyAgICB9OworICB9KTsKKyAgcmV0dXJuIGNhcGFiaWxpdHk7Cit9CisKK3ZhciBjcmVhdGVPYmplY3RVUkwgPSBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkxDbG9zdXJlKCkgeworICB2YXIgZGlnaXRzID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjsKKyAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChkYXRhLCBjb250ZW50VHlwZSkgeworICAgIHZhciBmb3JjZURhdGFTY2hlbWEgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlOworCisgICAgaWYgKCFmb3JjZURhdGFTY2hlbWEgJiYgVVJMLmNyZWF0ZU9iamVjdFVSTCkgeworICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsKKyAgICAgICAgdHlwZTogY29udGVudFR5cGUKKyAgICAgIH0pOworICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CisgICAgfQorCisgICAgdmFyIGJ1ZmZlciA9ICJkYXRhOiIuY29uY2F0KGNvbnRlbnRUeXBlLCAiO2Jhc2U2NCwiKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMykgeworICAgICAgdmFyIGIxID0gZGF0YVtpXSAmIDB4ZmY7CisgICAgICB2YXIgYjIgPSBkYXRhW2kgKyAxXSAmIDB4ZmY7CisgICAgICB2YXIgYjMgPSBkYXRhW2kgKyAyXSAmIDB4ZmY7CisgICAgICB2YXIgZDEgPSBiMSA+PiAyLAorICAgICAgICAgIGQyID0gKGIxICYgMykgPDwgNCB8IGIyID4+IDQ7CisgICAgICB2YXIgZDMgPSBpICsgMSA8IGlpID8gKGIyICYgMHhmKSA8PCAyIHwgYjMgPj4gNiA6IDY0OworICAgICAgdmFyIGQ0ID0gaSArIDIgPCBpaSA/IGIzICYgMHgzZiA6IDY0OworICAgICAgYnVmZmVyICs9IGRpZ2l0c1tkMV0gKyBkaWdpdHNbZDJdICsgZGlnaXRzW2QzXSArIGRpZ2l0c1tkNF07CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfTsKK30oKTsKKworZXhwb3J0cy5jcmVhdGVPYmplY3RVUkwgPSBjcmVhdGVPYmplY3RVUkw7CisKKy8qKiovIH0pLAorLyogMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKwordmFyIF9pc19ub2RlID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2lmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gInVuZGVmaW5lZCIgfHwgIWdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQpIHsKKyAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAidW5kZWZpbmVkIiB8fCBnbG9iYWxUaGlzLk1hdGggIT09IE1hdGgpIHsKKyAgICBnbG9iYWxUaGlzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKKyAgfQorCisgIGdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQgPSB0cnVlOworICB2YXIgaGFzRE9NID0gKHR5cGVvZiB3aW5kb3cgPT09ICJ1bmRlZmluZWQiID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKHdpbmRvdykpID09PSAib2JqZWN0IiAmJiAodHlwZW9mIGRvY3VtZW50ID09PSAidW5kZWZpbmVkIiA/ICJ1bmRlZmluZWQiIDogX3R5cGVvZihkb2N1bWVudCkpID09PSAib2JqZWN0IjsKKyAgdmFyIHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICJ1bmRlZmluZWQiICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgIiI7CisgIHZhciBpc0lFID0gL1RyaWRlbnQvLnRlc3QodXNlckFnZW50KTsKKworICAoZnVuY3Rpb24gY2hlY2tOb2RlQnRvYSgpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5idG9hIHx8ICFfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsb2JhbFRoaXMuYnRvYSA9IGZ1bmN0aW9uIChjaGFycykgeworICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNoYXJzLCAiYmluYXJ5IikudG9TdHJpbmcoImJhc2U2NCIpOworICAgIH07CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrTm9kZUF0b2IoKSB7CisgICAgaWYgKGdsb2JhbFRoaXMuYXRvYiB8fCAhX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbG9iYWxUaGlzLmF0b2IgPSBmdW5jdGlvbiAoaW5wdXQpIHsKKyAgICAgIHJldHVybiBCdWZmZXIuZnJvbShpbnB1dCwgImJhc2U2NCIpLnRvU3RyaW5nKCJiaW5hcnkiKTsKKyAgICB9OworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja0NoaWxkTm9kZVJlbW92ZSgpIHsKKyAgICBpZiAoIWhhc0RPTSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0eXBlb2YgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlICE9PSAidW5kZWZpbmVkIikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHsKKyAgICAgICAgdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpOworICAgICAgfQorICAgIH07CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrRE9NVG9rZW5MaXN0QWRkUmVtb3ZlKCkgeworICAgIGlmICghaGFzRE9NIHx8IF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJ0ZXN0T25lIiwgInRlc3RUd28iKTsKKworICAgIGlmIChkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0ZXN0T25lIikgPT09IHRydWUgJiYgZGl2LmNsYXNzTGlzdC5jb250YWlucygidGVzdFR3byIpID09PSB0cnVlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIE9yaWdpbmFsRE9NVG9rZW5MaXN0QWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7CisgICAgdmFyIE9yaWdpbmFsRE9NVG9rZW5MaXN0UmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7CisKKyAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB0b2tlbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIHRva2Vuc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgX2kgPSAwLCBfdG9rZW5zID0gdG9rZW5zOyBfaSA8IF90b2tlbnMubGVuZ3RoOyBfaSsrKSB7CisgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbnNbX2ldOworICAgICAgICBPcmlnaW5hbERPTVRva2VuTGlzdEFkZC5jYWxsKHRoaXMsIHRva2VuKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIHRva2VucyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykgeworICAgICAgICB0b2tlbnNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgX2kyID0gMCwgX3Rva2VuczIgPSB0b2tlbnM7IF9pMiA8IF90b2tlbnMyLmxlbmd0aDsgX2kyKyspIHsKKyAgICAgICAgdmFyIHRva2VuID0gX3Rva2VuczJbX2kyXTsKKyAgICAgICAgT3JpZ2luYWxET01Ub2tlbkxpc3RSZW1vdmUuY2FsbCh0aGlzLCB0b2tlbik7CisgICAgICB9CisgICAgfTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tET01Ub2tlbkxpc3RUb2dnbGUoKSB7CisgICAgaWYgKCFoYXNET00gfHwgX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisKKyAgICBpZiAoZGl2LmNsYXNzTGlzdC50b2dnbGUoInRlc3QiLCAwKSA9PT0gZmFsc2UpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uICh0b2tlbikgeworICAgICAgdmFyIGZvcmNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAhIWFyZ3VtZW50c1sxXSA6ICF0aGlzLmNvbnRhaW5zKHRva2VuKTsKKyAgICAgIHJldHVybiB0aGlzW2ZvcmNlID8gImFkZCIgOiAicmVtb3ZlIl0odG9rZW4pLCBmb3JjZTsKKyAgICB9OworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1dpbmRvd0hpc3RvcnlQdXNoU3RhdGVSZXBsYWNlU3RhdGUoKSB7CisgICAgaWYgKCFoYXNET00gfHwgIWlzSUUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgT3JpZ2luYWxQdXNoU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7CisgICAgdmFyIE9yaWdpbmFsUmVwbGFjZVN0YXRlID0gd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlOworCisgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7CisgICAgICB2YXIgYXJncyA9IHVybCA9PT0gdW5kZWZpbmVkID8gW3N0YXRlLCB0aXRsZV0gOiBbc3RhdGUsIHRpdGxlLCB1cmxdOworICAgICAgT3JpZ2luYWxQdXNoU3RhdGUuYXBwbHkodGhpcywgYXJncyk7CisgICAgfTsKKworICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCkgeworICAgICAgdmFyIGFyZ3MgPSB1cmwgPT09IHVuZGVmaW5lZCA/IFtzdGF0ZSwgdGl0bGVdIDogW3N0YXRlLCB0aXRsZSwgdXJsXTsKKyAgICAgIE9yaWdpbmFsUmVwbGFjZVN0YXRlLmFwcGx5KHRoaXMsIGFyZ3MpOworICAgIH07CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nU3RhcnRzV2l0aCgpIHsKKyAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXyg0OSk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nRW5kc1dpdGgoKSB7CisgICAgaWYgKFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDYwKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdJbmNsdWRlcygpIHsKKyAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oNjIpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja0FycmF5SW5jbHVkZXMoKSB7CisgICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oNjQpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja0FycmF5RnJvbSgpIHsKKyAgICBpZiAoQXJyYXkuZnJvbSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oNzIpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja09iamVjdEFzc2lnbigpIHsKKyAgICBpZiAoT2JqZWN0LmFzc2lnbikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oOTQpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja09iamVjdEZyb21FbnRyaWVzKCkgeworICAgIGlmIChPYmplY3QuZnJvbUVudHJpZXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDk3KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tNYXRoTG9nMigpIHsKKyAgICBpZiAoTWF0aC5sb2cyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTWF0aC5sb2cyID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDEpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja051bWJlcklzTmFOKCkgeworICAgIGlmIChOdW1iZXIuaXNOYU4pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBOdW1iZXIuaXNOYU4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMyk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrTnVtYmVySXNJbnRlZ2VyKCkgeworICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTnVtYmVyLmlzSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA1KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tUeXBlZEFycmF5U2xpY2UoKSB7CisgICAgaWYgKFVpbnQ4QXJyYXkucHJvdG90eXBlLnNsaWNlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXygxMDgpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1Byb21pc2UoKSB7fSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tVUkwoKSB7fSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tSZWFkYWJsZVN0cmVhbSgpIHt9KSgpOworCisgIChmdW5jdGlvbiBjaGVja01hcEVudHJpZXMoKSB7CisgICAgaWYgKGdsb2JhbFRoaXMuTWFwICYmIGdsb2JhbFRoaXMuTWFwLnByb3RvdHlwZS5lbnRyaWVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5NYXAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExMyk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrU2V0RW50cmllcygpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5TZXQgJiYgZ2xvYmFsVGhpcy5TZXQucHJvdG90eXBlLmVudHJpZXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbG9iYWxUaGlzLlNldCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI3KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tXZWFrTWFwKCkgeworICAgIGlmIChnbG9iYWxUaGlzLldlYWtNYXApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbG9iYWxUaGlzLldlYWtNYXAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyOSk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrV2Vha1NldCgpIHsKKyAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrU2V0KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xvYmFsVGhpcy5XZWFrU2V0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxMzUpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1N0cmluZ0NvZGVQb2ludEF0KCkgeworICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXygxMzcpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja1N0cmluZ0Zyb21Db2RlUG9pbnQoKSB7CisgICAgaWYgKFN0cmluZy5mcm9tQ29kZVBvaW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nLmZyb21Db2RlUG9pbnQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzOSk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrU3ltYm9sKCkgeworICAgIGlmIChnbG9iYWxUaGlzLlN5bWJvbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQxKTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdQYWRTdGFydCgpIHsKKyAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTY2KTsKKyAgfSkoKTsKKworICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdQYWRFbmQoKSB7CisgICAgaWYgKFN0cmluZy5wcm90b3R5cGUucGFkRW5kKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX193X3BkZmpzX3JlcXVpcmVfXygxNzEpOworICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja09iamVjdFZhbHVlcygpIHsKKyAgICBpZiAoT2JqZWN0LnZhbHVlcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE9iamVjdC52YWx1ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3Myk7CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0RW50cmllcygpIHsKKyAgICBpZiAoT2JqZWN0LmVudHJpZXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPYmplY3QuZW50cmllcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTc2KTsKKyAgfSkoKTsKK30KKworLyoqKi8gfSksCisvKiAzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuaXNOb2RlSlMgPSB2b2lkIDA7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCit2YXIgaXNOb2RlSlMgPSAodHlwZW9mIHByb2Nlc3MgPT09ICJ1bmRlZmluZWQiID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKHByb2Nlc3MpKSA9PT0gIm9iamVjdCIgJiYgcHJvY2VzcyArICIiID09PSAiW29iamVjdCBwcm9jZXNzXSIgJiYgIXByb2Nlc3MudmVyc2lvbnMubncgJiYgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09ICJicm93c2VyIik7CitleHBvcnRzLmlzTm9kZUpTID0gaXNOb2RlSlM7CisKKy8qKiovIH0pLAorLyogNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworbW9kdWxlLmV4cG9ydHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOworCisvKioqLyB9KSwKKy8qIDUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7CiskKHsgZ2xvYmFsOiB0cnVlIH0sIHsgZ2xvYmFsVGhpczogZ2xvYmFsIH0pOworCisvKioqLyB9KSwKKy8qIDYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KS5mOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIHJlZGVmaW5lID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7Cit2YXIgc2V0R2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygyNik7Cit2YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzYpOwordmFyIGlzRm9yY2VkID0gX193X3BkZmpzX3JlcXVpcmVfXyg0OCk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHsKKyB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7CisgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsOworIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7CisgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjsKKyBpZiAoR0xPQkFMKSB7CisgIHRhcmdldCA9IGdsb2JhbDsKKyB9IGVsc2UgaWYgKFNUQVRJQykgeworICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7CisgfSBlbHNlIHsKKyAgdGFyZ2V0ID0gKGdsb2JhbFtUQVJHRVRdIHx8IHt9KS5wcm90b3R5cGU7CisgfQorIGlmICh0YXJnZXQpCisgIGZvciAoa2V5IGluIHNvdXJjZSkgeworICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTsKKyAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7CisgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7CisgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7CisgICB9IGVsc2UKKyAgICB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldOworICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTsKKyAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHsKKyAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpCisgICAgIGNvbnRpbnVlOworICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTsKKyAgIH0KKyAgIGlmIChvcHRpb25zLnNoYW0gfHwgdGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkgeworICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTsKKyAgIH0KKyAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7CisgIH0KK307CisKKy8qKiovIH0pLAorLyogNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCit2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0OworfTsKK21vZHVsZS5leHBvcnRzID0gY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHwgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8IGNoZWNrKHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYpIHx8IGNoZWNrKHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOworCisvKioqLyB9KSwKKy8qIDggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXyg5KTsKK3ZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOwordmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIHRvUHJpbWl0aXZlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNyk7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgSUU4X0RPTV9ERUZJTkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwKTsKK3ZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOworZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkgeworIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7CisgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpOworIGlmIChJRThfRE9NX0RFRklORSkKKyAgdHJ5IHsKKyAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgIH0KKyBpZiAoaGFzKE8sIFApKQorICByZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLmNhbGwoTywgUCksIE9bUF0pOworfTsKKworLyoqKi8gfSksCisvKiA5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOworbW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeworIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHsKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gNzsKKyAgfQorIH0pWzFdICE9IDc7Cit9KTsKKworLyoqKi8gfSksCisvKiAxMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7CisgdHJ5IHsKKyAgcmV0dXJuICEhZXhlYygpOworIH0gY2F0Y2ggKGVycm9yKSB7CisgIHJldHVybiB0cnVlOworIH0KK307CisKKy8qKiovIH0pLAorLyogMTEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTsKK3ZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwordmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTsKK2V4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgeworIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpOworIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlOworfSA6IG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlOworCisvKioqLyB9KSwKKy8qIDEyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHsKKyByZXR1cm4geworICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLAorICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksCisgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLAorICB2YWx1ZTogdmFsdWUKKyB9OworfTsKKworLyoqKi8gfSksCisvKiAxMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOwordmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpOworfTsKKworLyoqKi8gfSksCisvKiAxNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBjbGFzc29mID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7Cit2YXIgc3BsaXQgPSAnJy5zcGxpdDsKK21vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkgeworIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7Cit9KSA/IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7Cit9IDogT2JqZWN0OworCisvKioqLyB9KSwKKy8qIDE1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK3ZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpOworfTsKKworLyoqKi8gfSksCisvKiAxNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIGlmIChpdCA9PSB1bmRlZmluZWQpCisgIHRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIiArIGl0KTsKKyByZXR1cm4gaXQ7Cit9OworCisvKioqLyB9KSwKKy8qIDE3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIFBSRUZFUlJFRF9TVFJJTkcpIHsKKyBpZiAoIWlzT2JqZWN0KGlucHV0KSkKKyAgcmV0dXJuIGlucHV0OworIHZhciBmbiwgdmFsOworIGlmIChQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKQorICByZXR1cm4gdmFsOworIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKQorICByZXR1cm4gdmFsOworIGlmICghUFJFRkVSUkVEX1NUUklORyAmJiB0eXBlb2YgKGZuID0gaW5wdXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkKKyAgcmV0dXJuIHZhbDsKKyB0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpOworfTsKKworLyoqKi8gfSksCisvKiAxOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7Cit9OworCisvKioqLyB9KSwKKy8qIDE5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK3ZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5OworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkgeworIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpOworfTsKKworLyoqKi8gfSksCisvKiAyMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgY3JlYXRlRWxlbWVudCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjEpOworbW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHsKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gNzsKKyAgfQorIH0pLmEgIT0gNzsKK30pOworCisvKioqLyB9KSwKKy8qIDIxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7Cit2YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTsKK307CisKKy8qKiovIH0pLAorLyogMjIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXyg5KTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOworbW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHsKKyByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7Cit9IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkgeworIG9iamVjdFtrZXldID0gdmFsdWU7CisgcmV0dXJuIG9iamVjdDsKK307CisKKy8qKiovIH0pLAorLyogMjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXyg5KTsKK3ZhciBJRThfRE9NX0RFRklORSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjApOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cit2YXIgdG9QcmltaXRpdmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKK3ZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK2V4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7CisgYW5PYmplY3QoTyk7CisgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpOworIGFuT2JqZWN0KEF0dHJpYnV0ZXMpOworIGlmIChJRThfRE9NX0RFRklORSkKKyAgdHJ5IHsKKyAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgfQorIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpCisgIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTsKKyBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKQorICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTsKKyByZXR1cm4gTzsKK307CisKKy8qKiovIH0pLAorLyogMjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIGlmICghaXNPYmplY3QoaXQpKSB7CisgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7CisgfQorIHJldHVybiBpdDsKK307CisKKy8qKiovIH0pLAorLyogMjUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7Cit2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgc2V0R2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygyNik7Cit2YXIgaW5zcGVjdFNvdXJjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjcpOwordmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK3ZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7Cit2YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7Cit2YXIgVEVNUExBVEUgPSBTdHJpbmcoU3RyaW5nKS5zcGxpdCgnU3RyaW5nJyk7CisobW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykgeworIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlOworIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTsKKyB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7CisgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7CisgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpCisgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodmFsdWUsICduYW1lJywga2V5KTsKKyAgZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpLnNvdXJjZSA9IFRFTVBMQVRFLmpvaW4odHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/IGtleSA6ICcnKTsKKyB9CisgaWYgKE8gPT09IGdsb2JhbCkgeworICBpZiAoc2ltcGxlKQorICAgT1trZXldID0gdmFsdWU7CisgIGVsc2UKKyAgIHNldEdsb2JhbChrZXksIHZhbHVlKTsKKyAgcmV0dXJuOworIH0gZWxzZSBpZiAoIXVuc2FmZSkgeworICBkZWxldGUgT1trZXldOworIH0gZWxzZSBpZiAoIW5vVGFyZ2V0R2V0ICYmIE9ba2V5XSkgeworICBzaW1wbGUgPSB0cnVlOworIH0KKyBpZiAoc2ltcGxlKQorICBPW2tleV0gPSB2YWx1ZTsKKyBlbHNlCisgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCBrZXksIHZhbHVlKTsKK30pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7CisgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTsKK30pOworCisvKioqLyB9KSwKKy8qIDI2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworIHRyeSB7CisgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWwsIGtleSwgdmFsdWUpOworIH0gY2F0Y2ggKGVycm9yKSB7CisgIGdsb2JhbFtrZXldID0gdmFsdWU7CisgfQorIHJldHVybiB2YWx1ZTsKK307CisKKy8qKiovIH0pLAorLyogMjcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHN0b3JlID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7Cit2YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnRvU3RyaW5nOworaWYgKHR5cGVvZiBzdG9yZS5pbnNwZWN0U291cmNlICE9ICdmdW5jdGlvbicpIHsKKyBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiBmdW5jdGlvblRvU3RyaW5nLmNhbGwoaXQpOworIH07Cit9Cittb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7CisKKy8qKiovIH0pLAorLyogMjggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7Cit2YXIgc2V0R2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygyNik7Cit2YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7Cit2YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7Cittb2R1bGUuZXhwb3J0cyA9IHN0b3JlOworCisvKioqLyB9KSwKKy8qIDI5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBOQVRJVkVfV0VBS19NQVAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMwKTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgb2JqZWN0SGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgc2hhcmVkS2V5ID0gX193X3BkZmpzX3JlcXVpcmVfXygzMSk7Cit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzUpOwordmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDsKK3ZhciBzZXQsIGdldCwgaGFzOwordmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTsKK307Cit2YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHsKKyByZXR1cm4gZnVuY3Rpb24gKGl0KSB7CisgIHZhciBzdGF0ZTsKKyAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkgeworICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpOworICB9CisgIHJldHVybiBzdGF0ZTsKKyB9OworfTsKK2lmIChOQVRJVkVfV0VBS19NQVApIHsKKyB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpOworIHZhciB3bWdldCA9IHN0b3JlLmdldDsKKyB2YXIgd21oYXMgPSBzdG9yZS5oYXM7CisgdmFyIHdtc2V0ID0gc3RvcmUuc2V0OworIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHsKKyAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTsKKyAgcmV0dXJuIG1ldGFkYXRhOworIH07CisgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7CisgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307CisgfTsKKyBoYXMgPSBmdW5jdGlvbiAoaXQpIHsKKyAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsIGl0KTsKKyB9OworfSBlbHNlIHsKKyB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7CisgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlOworIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHsKKyAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpOworICByZXR1cm4gbWV0YWRhdGE7CisgfTsKKyBnZXQgPSBmdW5jdGlvbiAoaXQpIHsKKyAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307CisgfTsKKyBoYXMgPSBmdW5jdGlvbiAoaXQpIHsKKyAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpOworIH07Cit9Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBzZXQ6IHNldCwKKyBnZXQ6IGdldCwKKyBoYXM6IGhhcywKKyBlbmZvcmNlOiBlbmZvcmNlLAorIGdldHRlckZvcjogZ2V0dGVyRm9yCit9OworCisvKioqLyB9KSwKKy8qIDMwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOwordmFyIGluc3BlY3RTb3VyY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KTsKK3ZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7Cittb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChpbnNwZWN0U291cmNlKFdlYWtNYXApKTsKKworLyoqKi8gfSksCisvKiAzMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgc2hhcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygzMik7Cit2YXIgdWlkID0gX193X3BkZmpzX3JlcXVpcmVfXygzNCk7Cit2YXIga2V5cyA9IHNoYXJlZCgna2V5cycpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7CisgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpOworfTsKKworLyoqKi8gfSksCisvKiAzMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgSVNfUFVSRSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpOwordmFyIHN0b3JlID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7CisobW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pOworfSkoJ3ZlcnNpb25zJywgW10pLnB1c2goeworIHZlcnNpb246ICczLjYuNScsCisgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLAorIGNvcHlyaWdodDogJ8KpIDIwMjAgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknCit9KTsKKworLyoqKi8gfSksCisvKiAzMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IGZhbHNlOworCisvKioqLyB9KSwKKy8qIDM0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK3ZhciBpZCA9IDA7Cit2YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHsKKyByZXR1cm4gJ1N5bWJvbCgnICsgU3RyaW5nKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArICgrK2lkICsgcG9zdGZpeCkudG9TdHJpbmcoMzYpOworfTsKKworLyoqKi8gfSksCisvKiAzNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IHt9OworCisvKioqLyB9KSwKKy8qIDM2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciBvd25LZXlzID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHsKKyB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTsKKyB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOworIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjsKKyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgdmFyIGtleSA9IGtleXNbaV07CisgIGlmICghaGFzKHRhcmdldCwga2V5KSkKKyAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsKKyB9Cit9OworCisvKioqLyB9KSwKKy8qIDM3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXygzOCk7Cit2YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNDApOwordmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cittb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHsKKyB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpOworIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjsKKyByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzOworfTsKKworLyoqKi8gfSksCisvKiAzOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7Cit2YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7CisgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PSAnZnVuY3Rpb24nID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7Cit9OworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHsKKyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07Cit9OworCisvKioqLyB9KSwKKy8qIDM5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOworbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7CisKKy8qKiovIH0pLAorLyogNDAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGludGVybmFsT2JqZWN0S2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNDEpOwordmFyIGVudW1CdWdLZXlzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nik7Cit2YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpOworZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7CisgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTsKK307CisKKy8qKiovIH0pLAorLyogNDEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwordmFyIGluZGV4T2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKS5pbmRleE9mOwordmFyIGhpZGRlbktleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM1KTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHsKKyB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpOworIHZhciBpID0gMDsKKyB2YXIgcmVzdWx0ID0gW107CisgdmFyIGtleTsKKyBmb3IgKGtleSBpbiBPKQorICAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTsKKyB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkKKyAgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkgeworICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7CisgIH0KKyByZXR1cm4gcmVzdWx0OworfTsKKworLyoqKi8gfSksCisvKiA0MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgdG9MZW5ndGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQzKTsKK3ZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ1KTsKK3ZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHsKKyByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7CisgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTsKKyAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKKyAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTsKKyAgdmFyIHZhbHVlOworICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpCisgICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHsKKyAgICB2YWx1ZSA9IE9baW5kZXgrK107CisgICAgaWYgKHZhbHVlICE9IHZhbHVlKQorICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKyAgZWxzZQorICAgZm9yICg7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7CisgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpCisgICAgIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwOworICAgfQorICByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xOworIH07Cit9OworbW9kdWxlLmV4cG9ydHMgPSB7CisgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSwKKyBpbmRleE9mOiBjcmVhdGVNZXRob2QoZmFsc2UpCit9OworCisvKioqLyB9KSwKKy8qIDQzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0ludGVnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ0KTsKK3ZhciBtaW4gPSBNYXRoLm1pbjsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CisgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7Cit9OworCisvKioqLyB9KSwKKy8qIDQ0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK3ZhciBjZWlsID0gTWF0aC5jZWlsOwordmFyIGZsb29yID0gTWF0aC5mbG9vcjsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CisgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7Cit9OworCisvKioqLyB9KSwKKy8qIDQ1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0ludGVnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ0KTsKK3ZhciBtYXggPSBNYXRoLm1heDsKK3ZhciBtaW4gPSBNYXRoLm1pbjsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHsKKyB2YXIgaW50ZWdlciA9IHRvSW50ZWdlcihpbmRleCk7CisgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7Cit9OworCisvKioqLyB9KSwKKy8qIDQ2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gWworICdjb25zdHJ1Y3RvcicsCisgJ2hhc093blByb3BlcnR5JywKKyAnaXNQcm90b3R5cGVPZicsCisgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywKKyAndG9Mb2NhbGVTdHJpbmcnLAorICd0b1N0cmluZycsCisgJ3ZhbHVlT2YnCitdOworCisvKioqLyB9KSwKKy8qIDQ3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK2V4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7CisKKy8qKiovIH0pLAorLyogNDggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgcmVwbGFjZW1lbnQgPSAvI3xcLnByb3RvdHlwZVwuLzsKK3ZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHsKKyB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07CisgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZSA6IHZhbHVlID09IE5BVElWRSA/IGZhbHNlIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKSA6ICEhZGV0ZWN0aW9uOworfTsKK3ZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CisgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTsKK307Cit2YXIgZGF0YSA9IGlzRm9yY2VkLmRhdGEgPSB7fTsKK3ZhciBOQVRJVkUgPSBpc0ZvcmNlZC5OQVRJVkUgPSAnTic7Cit2YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJzsKK21vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7CisKKy8qKiovIH0pLAorLyogNDkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXyg1MCk7Cit2YXIgZW50cnlVbmJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK21vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdzdGFydHNXaXRoJyk7CisKKy8qKiovIH0pLAorLyogNTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7Cit2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KS5mOwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cit2YXIgbm90QVJlZ0V4cCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTEpOwordmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTsKK3ZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTYpOwordmFyIElTX1BVUkUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMzKTsKK3ZhciBuYXRpdmVTdGFydHNXaXRoID0gJycuc3RhcnRzV2l0aDsKK3ZhciBtaW4gPSBNYXRoLm1pbjsKK3ZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdzdGFydHNXaXRoJyk7Cit2YXIgTUROX1BPTFlGSUxMX0JVRyA9ICFJU19QVVJFICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyAmJiAhIWZ1bmN0aW9uICgpIHsKKyB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpOworIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlOworfSgpOworJCh7CisgdGFyZ2V0OiAnU3RyaW5nJywKKyBwcm90bzogdHJ1ZSwKKyBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQworfSwgeworIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nKSB7CisgIHZhciB0aGF0ID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpOworICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7CisgIHZhciBpbmRleCA9IHRvTGVuZ3RoKG1pbihhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdGhhdC5sZW5ndGgpKTsKKyAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpOworICByZXR1cm4gbmF0aXZlU3RhcnRzV2l0aCA/IG5hdGl2ZVN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KSA6IHRoYXQuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiA1MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaXNSZWdFeHAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUyKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgaWYgKGlzUmVnRXhwKGl0KSkgeworICB0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpOworIH0KKyByZXR1cm4gaXQ7Cit9OworCisvKioqLyB9KSwKKy8qIDUyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwordmFyIGNsYXNzb2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1KTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKK3ZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgdmFyIGlzUmVnRXhwOworIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PSAnUmVnRXhwJyk7Cit9OworCisvKioqLyB9KSwKKy8qIDUzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOwordmFyIHNoYXJlZCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzIpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIHVpZCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzQpOwordmFyIE5BVElWRV9TWU1CT0wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU0KTsKK3ZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTUpOwordmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7Cit2YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKK3ZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7CisgaWYgKCFoYXMoV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkgeworICBpZiAoTkFUSVZFX1NZTUJPTCAmJiBoYXMoU3ltYm9sLCBuYW1lKSkKKyAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IFN5bWJvbFtuYW1lXTsKKyAgZWxzZQorICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gY3JlYXRlV2VsbEtub3duU3ltYm9sKCdTeW1ib2wuJyArIG5hbWUpOworIH0KKyByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdOworfTsKKworLyoqKi8gfSksCisvKiA1NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK21vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7CisgcmV0dXJuICFTdHJpbmcoU3ltYm9sKCkpOworfSk7CisKKy8qKiovIH0pLAorLyogNTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIE5BVElWRV9TWU1CT0wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU0KTsKK21vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTCAmJiAhU3ltYm9sLnNoYW0gJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJzsKKworLyoqKi8gfSksCisvKiA1NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Myk7Cit2YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgeworIHZhciByZWdleHAgPSAvLi87CisgdHJ5IHsKKyAgJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7CisgfSBjYXRjaCAoZSkgeworICB0cnkgeworICAgcmVnZXhwW01BVENIXSA9IGZhbHNlOworICAgcmV0dXJuICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApOworICB9IGNhdGNoIChmKSB7CisgIH0KKyB9CisgcmV0dXJuIGZhbHNlOworfTsKKworLyoqKi8gfSksCisvKiA1NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKK3ZhciBiaW5kID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OCk7Cit2YXIgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9ELCBsZW5ndGgpIHsKKyByZXR1cm4gYmluZChjYWxsLCBnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdLCBsZW5ndGgpOworfTsKKworLyoqKi8gfSksCisvKiA1OCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYUZ1bmN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OSk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7CisgYUZ1bmN0aW9uKGZuKTsKKyBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKQorICByZXR1cm4gZm47Cisgc3dpdGNoIChsZW5ndGgpIHsKKyBjYXNlIDA6CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gZm4uY2FsbCh0aGF0KTsKKyAgfTsKKyBjYXNlIDE6CisgIHJldHVybiBmdW5jdGlvbiAoYSkgeworICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7CisgIH07CisgY2FzZSAyOgorICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHsKKyAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpOworICB9OworIGNhc2UgMzoKKyAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7CisgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTsKKyAgfTsKKyB9CisgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7CisgfTsKK307CisKKy8qKiovIH0pLAorLyogNTkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHsKKyAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7CisgfQorIHJldHVybiBpdDsKK307CisKKy8qKiovIH0pLAorLyogNjAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXyg2MSk7Cit2YXIgZW50cnlVbmJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK21vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdlbmRzV2l0aCcpOworCisvKioqLyB9KSwKKy8qIDYxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oOCkuZjsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOwordmFyIG5vdEFSZWdFeHAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUxKTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cit2YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU2KTsKK3ZhciBJU19QVVJFID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgbmF0aXZlRW5kc1dpdGggPSAnJy5lbmRzV2l0aDsKK3ZhciBtaW4gPSBNYXRoLm1pbjsKK3ZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdlbmRzV2l0aCcpOwordmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7CisgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSwgJ2VuZHNXaXRoJyk7CisgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7Cit9KCk7CiskKHsKKyB0YXJnZXQ6ICdTdHJpbmcnLAorIHByb3RvOiB0cnVlLAorIGZvcmNlZDogIU1ETl9QT0xZRklMTF9CVUcgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDCit9LCB7CisgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZykgeworICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTsKKyAgbm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpOworICB2YXIgZW5kUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKKyAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTsKKyAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBtaW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pOworICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7CisgIHJldHVybiBuYXRpdmVFbmRzV2l0aCA/IG5hdGl2ZUVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogNjIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXyg2Myk7Cit2YXIgZW50cnlVbmJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKK21vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdpbmNsdWRlcycpOworCisvKioqLyB9KSwKKy8qIDYzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyIG5vdEFSZWdFeHAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUxKTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cit2YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU2KTsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUsCisgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykKK30sIHsKKyBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nKSB7CisgIHJldHVybiAhIX5TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSkuaW5kZXhPZihub3RBUmVnRXhwKHNlYXJjaFN0cmluZyksIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiA2NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDY1KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnaW5jbHVkZXMnKTsKKworLyoqKi8gfSksCisvKiA2NSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKK3ZhciAkaW5jbHVkZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQyKS5pbmNsdWRlczsKK3ZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Nik7Cit2YXIgYXJyYXlNZXRob2RVc2VzVG9MZW5ndGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcxKTsKK3ZhciBVU0VTX1RPX0xFTkdUSCA9IGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoKCdpbmRleE9mJywgeworIEFDQ0VTU09SUzogdHJ1ZSwKKyAxOiAwCit9KTsKKyQoeworIHRhcmdldDogJ0FycmF5JywKKyBwcm90bzogdHJ1ZSwKKyBmb3JjZWQ6ICFVU0VTX1RPX0xFTkdUSAorfSwgeworIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCkgeworICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CisgfQorfSk7CithZGRUb1Vuc2NvcGFibGVzKCdpbmNsdWRlcycpOworCisvKioqLyB9KSwKKy8qIDY2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKK3ZhciBjcmVhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY3KTsKK3ZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpOwordmFyIFVOU0NPUEFCTEVTID0gd2VsbEtub3duU3ltYm9sKCd1bnNjb3BhYmxlcycpOwordmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlOworaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHsKKyBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywgeworICBjb25maWd1cmFibGU6IHRydWUsCisgIHZhbHVlOiBjcmVhdGUobnVsbCkKKyB9KTsKK30KK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkgeworIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTsKK307CisKKy8qKiovIH0pLAorLyogNjcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cit2YXIgZGVmaW5lUHJvcGVydGllcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNjgpOwordmFyIGVudW1CdWdLZXlzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nik7Cit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzUpOwordmFyIGh0bWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcwKTsKK3ZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxKTsKK3ZhciBzaGFyZWRLZXkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMxKTsKK3ZhciBHVCA9ICc+JzsKK3ZhciBMVCA9ICc8JzsKK3ZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJzsKK3ZhciBTQ1JJUFQgPSAnc2NyaXB0JzsKK3ZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTsKK3ZhciBFbXB0eUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgeworfTsKK3ZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkgeworIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7Cit9OwordmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7CisgYWN0aXZlWERvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnJykpOworIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpOworIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7CisgYWN0aXZlWERvY3VtZW50ID0gbnVsbDsKKyByZXR1cm4gdGVtcDsKK307Cit2YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkgeworIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOworIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JzsKKyB2YXIgaWZyYW1lRG9jdW1lbnQ7CisgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpOworIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpOworIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7CisgaWZyYW1lRG9jdW1lbnQub3BlbigpOworIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7CisgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTsKKyByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjsKK307Cit2YXIgYWN0aXZlWERvY3VtZW50OwordmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHsKKyB0cnkgeworICBhY3RpdmVYRG9jdW1lbnQgPSBkb2N1bWVudC5kb21haW4gJiYgbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyB9CisgTnVsbFByb3RvT2JqZWN0ID0gYWN0aXZlWERvY3VtZW50ID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIDogTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lKCk7CisgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDsKKyB3aGlsZSAobGVuZ3RoLS0pCisgIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTsKKyByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7Cit9OworaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlOworbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7CisgdmFyIHJlc3VsdDsKKyBpZiAoTyAhPT0gbnVsbCkgeworICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTsKKyAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTsKKyAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDsKKyAgcmVzdWx0W0lFX1BST1RPXSA9IE87CisgfSBlbHNlCisgIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpOworIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7Cit9OworCisvKioqLyB9KSwKKy8qIDY4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oOSk7Cit2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBhbk9iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMjQpOwordmFyIG9iamVjdEtleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY5KTsKK21vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykgeworIGFuT2JqZWN0KE8pOworIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTsKKyB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7CisgdmFyIGluZGV4ID0gMDsKKyB2YXIga2V5OworIHdoaWxlIChsZW5ndGggPiBpbmRleCkKKyAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBQcm9wZXJ0aWVzW2tleV0pOworIHJldHVybiBPOworfTsKKworLyoqKi8gfSksCisvKiA2OSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MSk7Cit2YXIgZW51bUJ1Z0tleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ2KTsKK21vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7CisgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7Cit9OworCisvKioqLyB9KSwKKy8qIDcwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXygzOCk7Cittb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpOworCisvKioqLyB9KSwKKy8qIDcxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oOSk7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK3ZhciBjYWNoZSA9IHt9OwordmFyIHRocm93ZXIgPSBmdW5jdGlvbiAoaXQpIHsKKyB0aHJvdyBpdDsKK307Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgb3B0aW9ucykgeworIGlmIChoYXMoY2FjaGUsIE1FVEhPRF9OQU1FKSkKKyAgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXTsKKyBpZiAoIW9wdGlvbnMpCisgIG9wdGlvbnMgPSB7fTsKKyB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdOworIHZhciBBQ0NFU1NPUlMgPSBoYXMob3B0aW9ucywgJ0FDQ0VTU09SUycpID8gb3B0aW9ucy5BQ0NFU1NPUlMgOiBmYWxzZTsKKyB2YXIgYXJndW1lbnQwID0gaGFzKG9wdGlvbnMsIDApID8gb3B0aW9uc1swXSA6IHRocm93ZXI7CisgdmFyIGFyZ3VtZW50MSA9IGhhcyhvcHRpb25zLCAxKSA/IG9wdGlvbnNbMV0gOiB1bmRlZmluZWQ7CisgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXSA9ICEhbWV0aG9kICYmICFmYWlscyhmdW5jdGlvbiAoKSB7CisgIGlmIChBQ0NFU1NPUlMgJiYgIURFU0NSSVBUT1JTKQorICAgcmV0dXJuIHRydWU7CisgIHZhciBPID0geyBsZW5ndGg6IC0xIH07CisgIGlmIChBQ0NFU1NPUlMpCisgICBkZWZpbmVQcm9wZXJ0eShPLCAxLCB7CisgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICBnZXQ6IHRocm93ZXIKKyAgIH0pOworICBlbHNlCisgICBPWzFdID0gMTsKKyAgbWV0aG9kLmNhbGwoTywgYXJndW1lbnQwLCBhcmd1bWVudDEpOworIH0pOworfTsKKworLyoqKi8gfSksCisvKiA3MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDczKTsKK19fd19wZGZqc19yZXF1aXJlX18oODUpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tOworCisvKioqLyB9KSwKKy8qIDczICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGNoYXJBdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzQpLmNoYXJBdDsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyOSk7Cit2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc1KTsKK3ZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJzsKK3ZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7Cit2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7CitkZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHsKKyBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKKyAgdHlwZTogU1RSSU5HX0lURVJBVE9SLAorICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksCisgIGluZGV4OiAwCisgfSk7Cit9LCBmdW5jdGlvbiBuZXh0KCkgeworIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CisgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZzsKKyB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDsKKyB2YXIgcG9pbnQ7CisgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpCisgIHJldHVybiB7CisgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgZG9uZTogdHJ1ZQorICB9OworIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpOworIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDsKKyByZXR1cm4geworICB2YWx1ZTogcG9pbnQsCisgIGRvbmU6IGZhbHNlCisgfTsKK30pOworCisvKioqLyB9KSwKKy8qIDc0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0ludGVnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ0KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cit2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7CisgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7CisgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTsKKyAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7CisgIHZhciBzaXplID0gUy5sZW5ndGg7CisgIHZhciBmaXJzdCwgc2Vjb25kOworICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpCisgICByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDsKKyAgZmlyc3QgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24pOworICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGID8gQ09OVkVSVF9UT19TVFJJTkcgPyBTLmNoYXJBdChwb3NpdGlvbikgOiBmaXJzdCA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7CisgfTsKK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksCisgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSkKK307CisKKy8qKiovIH0pLAorLyogNzUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7Cit2YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IF9fd19wZGZqc19yZXF1aXJlX18oNzYpOwordmFyIGdldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7Cit2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgzKTsKK3ZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd19wZGZqc19yZXF1aXJlX18oODEpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIHJlZGVmaW5lID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Myk7Cit2YXIgSVNfUFVSRSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpOwordmFyIEl0ZXJhdG9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oODIpOwordmFyIEl0ZXJhdG9yc0NvcmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc3KTsKK3ZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7Cit2YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUzsKK3ZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKK3ZhciBLRVlTID0gJ2tleXMnOwordmFyIFZBTFVFUyA9ICd2YWx1ZXMnOwordmFyIEVOVFJJRVMgPSAnZW50cmllcyc7Cit2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsKKyByZXR1cm4gdGhpczsKK307Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHsKKyBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpOworIHZhciBnZXRJdGVyYXRpb25NZXRob2QgPSBmdW5jdGlvbiAoS0lORCkgeworICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpCisgICByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yOworICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkKKyAgIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTsKKyAgc3dpdGNoIChLSU5EKSB7CisgIGNhc2UgS0VZUzoKKyAgIHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsKKyAgIH07CisgIGNhc2UgVkFMVUVTOgorICAgcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7CisgICB9OworICBjYXNlIEVOVFJJRVM6CisgICByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7CisgICB9OworICB9CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7CisgIH07CisgfTsKKyB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJzsKKyB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7CisgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlOworIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07CisgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTsKKyB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7CisgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZOworIGlmIChhbnlOYXRpdmVJdGVyYXRvcikgeworICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7CisgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkgeworICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7CisgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7CisgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpOworICAgIH0gZWxzZSBpZiAodHlwZW9mIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykgeworICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7CisgICAgfQorICAgfQorICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTsKKyAgIGlmIChJU19QVVJFKQorICAgIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7CisgIH0KKyB9CisgaWYgKERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykgeworICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlOworICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7CisgICByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsKKyAgfTsKKyB9CisgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7CisgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvcik7CisgfQorIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjsKKyBpZiAoREVGQVVMVCkgeworICBtZXRob2RzID0geworICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSwKKyAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSwKKyAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKQorICB9OworICBpZiAoRk9SQ0VEKQorICAgZm9yIChLRVkgaW4gbWV0aG9kcykgeworICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHsKKyAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTsKKyAgICB9CisgICB9CisgIGVsc2UKKyAgICQoeworICAgIHRhcmdldDogTkFNRSwKKyAgICBwcm90bzogdHJ1ZSwKKyAgICBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FCisgICB9LCBtZXRob2RzKTsKKyB9CisgcmV0dXJuIG1ldGhvZHM7Cit9OworCisvKioqLyB9KSwKKy8qIDc2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gX193X3BkZmpzX3JlcXVpcmVfXyg3NykuSXRlcmF0b3JQcm90b3R5cGU7Cit2YXIgY3JlYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Nyk7Cit2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7Cit2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgxKTsKK3ZhciBJdGVyYXRvcnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgyKTsKK3ZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeworIHJldHVybiB0aGlzOworfTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHsKKyB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJzsKKyBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7Cisgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpOworIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7CisgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7Cit9OworCisvKioqLyB9KSwKKy8qIDc3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGdldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7Cit2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Myk7Cit2YXIgSVNfUFVSRSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTsKK3ZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeworIHJldHVybiB0aGlzOworfTsKK3ZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yOworaWYgKFtdLmtleXMpIHsKKyBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpOworIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkKKyAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7CisgZWxzZSB7CisgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTsKKyAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkKKyAgIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlOworIH0KK30KK2lmIChJdGVyYXRvclByb3RvdHlwZSA9PSB1bmRlZmluZWQpCisgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsKK2lmICghSVNfUFVSRSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIHsKKyBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTsKK30KK21vZHVsZS5leHBvcnRzID0geworIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSwKKyBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTCit9OworCisvKioqLyB9KSwKKy8qIDc4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciB0b09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzkpOwordmFyIHNoYXJlZEtleSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzEpOwordmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwordmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpOwordmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7Cittb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7CisgTyA9IHRvT2JqZWN0KE8pOworIGlmIChoYXMoTywgSUVfUFJPVE8pKQorICByZXR1cm4gT1tJRV9QUk9UT107CisgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHsKKyAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlOworIH0KKyByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7Cit9OworCisvKioqLyB9KSwKKy8qIDc5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkgeworIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpOworfTsKKworLyoqKi8gfSksCisvKiA4MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK21vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKKyBmdW5jdGlvbiBGKCkgeworIH0KKyBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7CisgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7Cit9KTsKKworLyoqKi8gfSksCisvKiA4MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKS5mOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTMpOwordmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHsKKyBpZiAoaXQgJiYgIWhhcyhpdCA9IFNUQVRJQyA/IGl0IDogaXQucHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkgeworICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeworICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgdmFsdWU6IFRBRworICB9KTsKKyB9Cit9OworCisvKioqLyB9KSwKKy8qIDgyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0ge307CisKKy8qKiovIH0pLAorLyogODMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cit2YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gX193X3BkZmpzX3JlcXVpcmVfXyg4NCk7Cittb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7CisgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7CisgdmFyIHRlc3QgPSB7fTsKKyB2YXIgc2V0dGVyOworIHRyeSB7CisgIHNldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldDsKKyAgc2V0dGVyLmNhbGwodGVzdCwgW10pOworICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTsKKyB9IGNhdGNoIChlcnJvcikgeworIH0KKyByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHsKKyAgYW5PYmplY3QoTyk7CisgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7CisgIGlmIChDT1JSRUNUX1NFVFRFUikKKyAgIHNldHRlci5jYWxsKE8sIHByb3RvKTsKKyAgZWxzZQorICAgTy5fX3Byb3RvX18gPSBwcm90bzsKKyAgcmV0dXJuIE87CisgfTsKK30oKSA6IHVuZGVmaW5lZCk7CisKKy8qKiovIH0pLAorLyogODQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgeworIGlmICghaXNPYmplY3QoaXQpICYmIGl0ICE9PSBudWxsKSB7CisgIHRocm93IFR5cGVFcnJvcigiQ2FuJ3Qgc2V0ICIgKyBTdHJpbmcoaXQpICsgJyBhcyBhIHByb3RvdHlwZScpOworIH0KKyByZXR1cm4gaXQ7Cit9OworCisvKioqLyB9KSwKKy8qIDg1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKK3ZhciBmcm9tID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nik7Cit2YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXyg5Myk7Cit2YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7CisgQXJyYXkuZnJvbShpdGVyYWJsZSk7Cit9KTsKKyQoeworIHRhcmdldDogJ0FycmF5JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTgorfSwgeyBmcm9tOiBmcm9tIH0pOworCisvKioqLyB9KSwKKy8qIDg2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU4KTsKK3ZhciB0b09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzkpOwordmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg3KTsKK3ZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg4KTsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOwordmFyIGNyZWF0ZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXyg4OSk7Cit2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkwKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UpIHsKKyB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7CisgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5OworIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7CisgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkOworIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pOworIHZhciBpbmRleCA9IDA7CisgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7CisgaWYgKG1hcHBpbmcpCisgIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7CisgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHsKKyAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKE8pOworICBuZXh0ID0gaXRlcmF0b3IubmV4dDsKKyAgcmVzdWx0ID0gbmV3IEMoKTsKKyAgZm9yICg7ICEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmU7IGluZGV4KyspIHsKKyAgIHZhbHVlID0gbWFwcGluZyA/IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIG1hcGZuLCBbCisgICAgc3RlcC52YWx1ZSwKKyAgICBpbmRleAorICAgXSwgdHJ1ZSkgOiBzdGVwLnZhbHVlOworICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpOworICB9CisgfSBlbHNlIHsKKyAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpOworICByZXN1bHQgPSBuZXcgQyhsZW5ndGgpOworICBmb3IgKDsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHsKKyAgIHZhbHVlID0gbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XTsKKyAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTsKKyAgfQorIH0KKyByZXN1bHQubGVuZ3RoID0gaW5kZXg7CisgcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKiovIH0pLAorLyogODcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7CisgdHJ5IHsKKyAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTsKKyB9IGNhdGNoIChlcnJvcikgeworICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddOworICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpCisgICBhbk9iamVjdChyZXR1cm5NZXRob2QuY2FsbChpdGVyYXRvcikpOworICB0aHJvdyBlcnJvcjsKKyB9Cit9OworCisvKioqLyB9KSwKKy8qIDg4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKK3ZhciBJdGVyYXRvcnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgyKTsKK3ZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKK3ZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7Cit9OworCisvKioqLyB9KSwKKy8qIDg5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIHRvUHJpbWl0aXZlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNyk7Cit2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkgeworIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKGtleSk7CisgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkKKyAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTsKKyBlbHNlCisgIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTsKK307CisKKy8qKiovIH0pLAorLyogOTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGNsYXNzb2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkxKTsKK3ZhciBJdGVyYXRvcnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgyKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKK3ZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CisgaWYgKGl0ICE9IHVuZGVmaW5lZCkKKyAgcmV0dXJuIGl0W0lURVJBVE9SXSB8fCBpdFsnQEBpdGVyYXRvciddIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07Cit9OworCisvKioqLyB9KSwKKy8qIDkxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkyKTsKK3ZhciBjbGFzc29mUmF3ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Myk7Cit2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKK3ZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeworIHJldHVybiBhcmd1bWVudHM7Cit9KCkpID09ICdBcmd1bWVudHMnOwordmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CisgdHJ5IHsKKyAgcmV0dXJuIGl0W2tleV07CisgfSBjYXRjaCAoZXJyb3IpIHsKKyB9Cit9OworbW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyBjbGFzc29mUmF3IDogZnVuY3Rpb24gKGl0KSB7CisgdmFyIE8sIHRhZywgcmVzdWx0OworIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJyA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWcgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTykgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDsKK307CisKKy8qKiovIH0pLAorLyogOTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTMpOwordmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Cit2YXIgdGVzdCA9IHt9OwordGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JzsKK21vZHVsZS5leHBvcnRzID0gU3RyaW5nKHRlc3QpID09PSAnW29iamVjdCB6XSc7CisKKy8qKiovIH0pLAorLyogOTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTMpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlOwordHJ5IHsKKyB2YXIgY2FsbGVkID0gMDsKKyB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0geworICBuZXh0OiBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07CisgIH0sCisgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7CisgICBTQUZFX0NMT1NJTkcgPSB0cnVlOworICB9CisgfTsKKyBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdGhpczsKKyB9OworIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7CisgIHRocm93IDI7CisgfSk7Cit9IGNhdGNoIChlcnJvcikgeworfQorbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7CisgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykKKyAgcmV0dXJuIGZhbHNlOworIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlOworIHRyeSB7CisgIHZhciBvYmplY3QgPSB7fTsKKyAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiB7CisgICAgbmV4dDogZnVuY3Rpb24gKCkgeworICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTsKKyAgICB9CisgICB9OworICB9OworICBleGVjKG9iamVjdCk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyB9CisgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUOworfTsKKworLyoqKi8gfSksCisvKiA5NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDk1KTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXygzOSk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmFzc2lnbjsKKworLyoqKi8gfSksCisvKiA5NSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgJCA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7Cit2YXIgYXNzaWduID0gX193X3BkZmpzX3JlcXVpcmVfXyg5Nik7CiskKHsKKyB0YXJnZXQ6ICdPYmplY3QnLAorIHN0YXQ6IHRydWUsCisgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24KK30sIHsgYXNzaWduOiBhc3NpZ24gfSk7CisKKy8qKiovIH0pLAorLyogOTYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgb2JqZWN0S2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNjkpOwordmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7Cit2YXIgdG9PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc5KTsKK3ZhciBJbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7Cit2YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjsKK3ZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKK21vZHVsZS5leHBvcnRzID0gIW5hdGl2ZUFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CisgaWYgKERFU0NSSVBUT1JTICYmIG5hdGl2ZUFzc2lnbih7IGI6IDEgfSwgbmF0aXZlQXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsKKyAgIGVudW1lcmFibGU6IHRydWUsCisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHsKKyAgICAgdmFsdWU6IDMsCisgICAgIGVudW1lcmFibGU6IGZhbHNlCisgICAgfSk7CisgICB9CisgIH0pLCB7IGI6IDIgfSkpLmIgIT09IDEpCisgIHJldHVybiB0cnVlOworIHZhciBBID0ge307CisgdmFyIEIgPSB7fTsKKyB2YXIgc3ltYm9sID0gU3ltYm9sKCk7CisgdmFyIGFscGhhYmV0ID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JzsKKyBBW3N5bWJvbF0gPSA3OworIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsKKyAgQltjaHJdID0gY2hyOworIH0pOworIHJldHVybiBuYXRpdmVBc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKG5hdGl2ZUFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IGFscGhhYmV0OworfSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsKKyB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7CisgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgdmFyIGluZGV4ID0gMTsKKyB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7CisgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjsKKyB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHsKKyAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7CisgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gb2JqZWN0S2V5cyhTKS5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKFMpKSA6IG9iamVjdEtleXMoUyk7CisgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKKyAgdmFyIGogPSAwOworICB2YXIga2V5OworICB3aGlsZSAobGVuZ3RoID4gaikgeworICAga2V5ID0ga2V5c1tqKytdOworICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpCisgICAgVFtrZXldID0gU1trZXldOworICB9CisgfQorIHJldHVybiBUOworfSA6IG5hdGl2ZUFzc2lnbjsKKworLyoqKi8gfSksCisvKiA5NyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCitfX3dfcGRmanNfcmVxdWlyZV9fKDk4KTsKK19fd19wZGZqc19yZXF1aXJlX18oOTkpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZnJvbUVudHJpZXM7CisKKy8qKiovIH0pLAorLyogOTggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNjYpOwordmFyIEl0ZXJhdG9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oODIpOwordmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK3ZhciBkZWZpbmVJdGVyYXRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oNzUpOwordmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJzsKK3ZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7Cit2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTsKK21vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkgeworIHNldEludGVybmFsU3RhdGUodGhpcywgeworICB0eXBlOiBBUlJBWV9JVEVSQVRPUiwKKyAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLAorICBpbmRleDogMCwKKyAga2luZDoga2luZAorIH0pOworfSwgZnVuY3Rpb24gKCkgeworIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CisgdmFyIHRhcmdldCA9IHN0YXRlLnRhcmdldDsKKyB2YXIga2luZCA9IHN0YXRlLmtpbmQ7CisgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKzsKKyBpZiAoIXRhcmdldCB8fCBpbmRleCA+PSB0YXJnZXQubGVuZ3RoKSB7CisgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDsKKyAgcmV0dXJuIHsKKyAgIHZhbHVlOiB1bmRlZmluZWQsCisgICBkb25lOiB0cnVlCisgIH07CisgfQorIGlmIChraW5kID09ICdrZXlzJykKKyAgcmV0dXJuIHsKKyAgIHZhbHVlOiBpbmRleCwKKyAgIGRvbmU6IGZhbHNlCisgIH07CisgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpCisgIHJldHVybiB7CisgICB2YWx1ZTogdGFyZ2V0W2luZGV4XSwKKyAgIGRvbmU6IGZhbHNlCisgIH07CisgcmV0dXJuIHsKKyAgdmFsdWU6IFsKKyAgIGluZGV4LAorICAgdGFyZ2V0W2luZGV4XQorICBdLAorICBkb25lOiBmYWxzZQorIH07Cit9LCAndmFsdWVzJyk7CitJdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5OworYWRkVG9VbnNjb3BhYmxlcygna2V5cycpOworYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7CithZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7CisKKy8qKiovIH0pLAorLyogOTkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyIGl0ZXJhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMCk7Cit2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg5KTsKKyQoeworIHRhcmdldDogJ09iamVjdCcsCisgc3RhdDogdHJ1ZQorfSwgeworIGZyb21FbnRyaWVzOiBmdW5jdGlvbiBmcm9tRW50cmllcyhpdGVyYWJsZSkgeworICB2YXIgb2JqID0ge307CisgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChrLCB2KSB7CisgICBjcmVhdGVQcm9wZXJ0eShvYmosIGssIHYpOworICB9LCB1bmRlZmluZWQsIHRydWUpOworICByZXR1cm4gb2JqOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDEwMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYW5PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI0KTsKK3ZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg4KTsKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOwordmFyIGJpbmQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU4KTsKK3ZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTApOwordmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg3KTsKK3ZhciBSZXN1bHQgPSBmdW5jdGlvbiAoc3RvcHBlZCwgcmVzdWx0KSB7CisgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDsKKyB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKK307Cit2YXIgaXRlcmF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgQVNfRU5UUklFUywgSVNfSVRFUkFUT1IpIHsKKyB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoZm4sIHRoYXQsIEFTX0VOVFJJRVMgPyAyIDogMSk7CisgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDsKKyBpZiAoSVNfSVRFUkFUT1IpIHsKKyAgaXRlcmF0b3IgPSBpdGVyYWJsZTsKKyB9IGVsc2UgeworICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7CisgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpCisgICB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTsKKyAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7CisgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHsKKyAgICByZXN1bHQgPSBBU19FTlRSSUVTID8gYm91bmRGdW5jdGlvbihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBib3VuZEZ1bmN0aW9uKGl0ZXJhYmxlW2luZGV4XSk7CisgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpCisgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisgICByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7CisgIH0KKyAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7CisgfQorIG5leHQgPSBpdGVyYXRvci5uZXh0OworIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7CisgIHJlc3VsdCA9IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIGJvdW5kRnVuY3Rpb24sIHN0ZXAudmFsdWUsIEFTX0VOVFJJRVMpOworICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KQorICAgcmV0dXJuIHJlc3VsdDsKKyB9CisgcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOworfTsKK2l0ZXJhdGUuc3RvcCA9IGZ1bmN0aW9uIChyZXN1bHQpIHsKKyByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCByZXN1bHQpOworfTsKKworLyoqKi8gfSksCisvKiAxMDEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMDIpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5NYXRoLmxvZzI7CisKKy8qKiovIH0pLAorLyogMTAyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKK3ZhciBsb2cgPSBNYXRoLmxvZzsKK3ZhciBMTjIgPSBNYXRoLkxOMjsKKyQoeworIHRhcmdldDogJ01hdGgnLAorIHN0YXQ6IHRydWUKK30sIHsKKyBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpIHsKKyAgcmV0dXJuIGxvZyh4KSAvIExOMjsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxMDMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMDQpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNOYU47CisKKy8qKiovIH0pLAorLyogMTA0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKKyQoeworIHRhcmdldDogJ051bWJlcicsCisgc3RhdDogdHJ1ZQorfSwgeworIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHsKKyAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTA1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTA2KTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXygzOSk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzSW50ZWdlcjsKKworLyoqKi8gfSksCisvKiAxMDYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyIGlzSW50ZWdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA3KTsKKyQoeworIHRhcmdldDogJ051bWJlcicsCisgc3RhdDogdHJ1ZQorfSwgeyBpc0ludGVnZXI6IGlzSW50ZWdlciB9KTsKKworLyoqKi8gfSksCisvKiAxMDcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgZmxvb3IgPSBNYXRoLmZsb29yOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHsKKyByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDsKK307CisKKy8qKiovIH0pLAorLyogMTA4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTA5KTsKKworLyoqKi8gfSksCisvKiAxMDkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEwKTsKK3ZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExMik7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7Cit2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKK3ZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwordmFyICRzbGljZSA9IFtdLnNsaWNlOwordmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKKyBuZXcgSW50OEFycmF5KDEpLnNsaWNlKCk7Cit9KTsKK2V4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkgeworIHZhciBsaXN0ID0gJHNsaWNlLmNhbGwoYVR5cGVkQXJyYXkodGhpcyksIHN0YXJ0LCBlbmQpOworIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworIHZhciBpbmRleCA9IDA7CisgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoOworIHZhciByZXN1bHQgPSBuZXcgKGFUeXBlZEFycmF5Q29uc3RydWN0b3IoQykpKGxlbmd0aCk7Cisgd2hpbGUgKGxlbmd0aCA+IGluZGV4KQorICByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTsKKyByZXR1cm4gcmVzdWx0OworfSwgRk9SQ0VEKTsKKworLyoqKi8gfSksCisvKiAxMTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTExKTsKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oOSk7Cit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwordmFyIGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIGNsYXNzb2YgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkxKTsKK3ZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyKTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpOwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMykuZjsKK3ZhciBnZXRQcm90b3R5cGVPZiA9IF9fd19wZGZqc19yZXF1aXJlX18oNzgpOwordmFyIHNldFByb3RvdHlwZU9mID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Myk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Myk7Cit2YXIgdWlkID0gX193X3BkZmpzX3JlcXVpcmVfXygzNCk7Cit2YXIgSW50OEFycmF5ID0gZ2xvYmFsLkludDhBcnJheTsKK3ZhciBJbnQ4QXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXkgJiYgSW50OEFycmF5LnByb3RvdHlwZTsKK3ZhciBVaW50OENsYW1wZWRBcnJheSA9IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheTsKK3ZhciBVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSA9IFVpbnQ4Q2xhbXBlZEFycmF5ICYmIFVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZTsKK3ZhciBUeXBlZEFycmF5ID0gSW50OEFycmF5ICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheSk7Cit2YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IEludDhBcnJheVByb3RvdHlwZSAmJiBnZXRQcm90b3R5cGVPZihJbnQ4QXJyYXlQcm90b3R5cGUpOwordmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7Cit2YXIgaXNQcm90b3R5cGVPZiA9IE9iamVjdFByb3RvdHlwZS5pc1Byb3RvdHlwZU9mOwordmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Cit2YXIgVFlQRURfQVJSQVlfVEFHID0gdWlkKCdUWVBFRF9BUlJBWV9UQUcnKTsKK3ZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJzsKK3ZhciBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCA9IGZhbHNlOwordmFyIE5BTUU7Cit2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7CisgSW50OEFycmF5OiAxLAorIFVpbnQ4QXJyYXk6IDEsCisgVWludDhDbGFtcGVkQXJyYXk6IDEsCisgSW50MTZBcnJheTogMiwKKyBVaW50MTZBcnJheTogMiwKKyBJbnQzMkFycmF5OiA0LAorIFVpbnQzMkFycmF5OiA0LAorIEZsb2F0MzJBcnJheTogNCwKKyBGbG9hdDY0QXJyYXk6IDgKK307Cit2YXIgaXNWaWV3ID0gZnVuY3Rpb24gaXNWaWV3KGl0KSB7CisgdmFyIGtsYXNzID0gY2xhc3NvZihpdCk7CisgcmV0dXJuIGtsYXNzID09PSAnRGF0YVZpZXcnIHx8IGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpOworfTsKK3ZhciBpc1R5cGVkQXJyYXkgPSBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gaXNPYmplY3QoaXQpICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwgY2xhc3NvZihpdCkpOworfTsKK3ZhciBhVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkgeworIGlmIChpc1R5cGVkQXJyYXkoaXQpKQorICByZXR1cm4gaXQ7CisgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXknKTsKK307Cit2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7CisgaWYgKHNldFByb3RvdHlwZU9mKSB7CisgIGlmIChpc1Byb3RvdHlwZU9mLmNhbGwoVHlwZWRBcnJheSwgQykpCisgICByZXR1cm4gQzsKKyB9IGVsc2UKKyAgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpCisgICBpZiAoaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBOQU1FKSkgeworICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldOworICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgKEMgPT09IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciB8fCBpc1Byb3RvdHlwZU9mLmNhbGwoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBDKSkpIHsKKyAgICAgcmV0dXJuIEM7CisgICAgfQorICAgfQorIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yJyk7Cit9OwordmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7CisgaWYgKCFERVNDUklQVE9SUykKKyAgcmV0dXJuOworIGlmIChmb3JjZWQpCisgIGZvciAodmFyIEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CisgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTsKKyAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHsKKyAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldOworICAgfQorICB9CisgaWYgKCFUeXBlZEFycmF5UHJvdG90eXBlW0tFWV0gfHwgZm9yY2VkKSB7CisgIHJlZGVmaW5lKFR5cGVkQXJyYXlQcm90b3R5cGUsIEtFWSwgZm9yY2VkID8gcHJvcGVydHkgOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIEludDhBcnJheVByb3RvdHlwZVtLRVldIHx8IHByb3BlcnR5KTsKKyB9Cit9OwordmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7CisgdmFyIEFSUkFZLCBUeXBlZEFycmF5Q29uc3RydWN0b3I7CisgaWYgKCFERVNDUklQVE9SUykKKyAgcmV0dXJuOworIGlmIChzZXRQcm90b3R5cGVPZikgeworICBpZiAoZm9yY2VkKQorICAgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgeworICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07CisgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVkpKSB7CisgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXTsKKyAgICB9CisgICB9CisgIGlmICghVHlwZWRBcnJheVtLRVldIHx8IGZvcmNlZCkgeworICAgdHJ5IHsKKyAgICByZXR1cm4gcmVkZWZpbmUoVHlwZWRBcnJheSwgS0VZLCBmb3JjZWQgPyBwcm9wZXJ0eSA6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgSW50OEFycmF5W0tFWV0gfHwgcHJvcGVydHkpOworICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgIH0KKyAgfSBlbHNlCisgICByZXR1cm47CisgfQorIGZvciAoQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKKyAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTsKKyAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiAoIVR5cGVkQXJyYXlDb25zdHJ1Y3RvcltLRVldIHx8IGZvcmNlZCkpIHsKKyAgIHJlZGVmaW5lKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgS0VZLCBwcm9wZXJ0eSk7CisgIH0KKyB9Cit9OworZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CisgaWYgKCFnbG9iYWxbTkFNRV0pCisgIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBmYWxzZTsKK30KK2lmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCB0eXBlb2YgVHlwZWRBcnJheSAhPSAnZnVuY3Rpb24nIHx8IFR5cGVkQXJyYXkgPT09IEZ1bmN0aW9uLnByb3RvdHlwZSkgeworIFR5cGVkQXJyYXkgPSBmdW5jdGlvbiBUeXBlZEFycmF5KCkgeworICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7CisgfTsKKyBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykKKyAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CisgICBpZiAoZ2xvYmFsW05BTUVdKQorICAgIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXSwgVHlwZWRBcnJheSk7CisgIH0KK30KK2lmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhVHlwZWRBcnJheVByb3RvdHlwZSB8fCBUeXBlZEFycmF5UHJvdG90eXBlID09PSBPYmplY3RQcm90b3R5cGUpIHsKKyBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheS5wcm90b3R5cGU7CisgaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpCisgIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgeworICAgaWYgKGdsb2JhbFtOQU1FXSkKKyAgICBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0ucHJvdG90eXBlLCBUeXBlZEFycmF5UHJvdG90eXBlKTsKKyAgfQorfQoraWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUpICE9PSBUeXBlZEFycmF5UHJvdG90eXBlKSB7Cisgc2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOworfQoraWYgKERFU0NSSVBUT1JTICYmICFoYXMoVHlwZWRBcnJheVByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHsKKyBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCA9IHRydWU7CisgZGVmaW5lUHJvcGVydHkoVHlwZWRBcnJheVByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgeworICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiBpc09iamVjdCh0aGlzKSA/IHRoaXNbVFlQRURfQVJSQVlfVEFHXSA6IHVuZGVmaW5lZDsKKyAgfQorIH0pOworIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkKKyAgaWYgKGdsb2JhbFtOQU1FXSkgeworICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbFtOQU1FXSwgVFlQRURfQVJSQVlfVEFHLCBOQU1FKTsKKyAgfQorfQorbW9kdWxlLmV4cG9ydHMgPSB7CisgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUywKKyBUWVBFRF9BUlJBWV9UQUc6IFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEICYmIFRZUEVEX0FSUkFZX1RBRywKKyBhVHlwZWRBcnJheTogYVR5cGVkQXJyYXksCisgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciwKKyBleHBvcnRUeXBlZEFycmF5TWV0aG9kOiBleHBvcnRUeXBlZEFycmF5TWV0aG9kLAorIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QsCisgaXNWaWV3OiBpc1ZpZXcsCisgaXNUeXBlZEFycmF5OiBpc1R5cGVkQXJyYXksCisgVHlwZWRBcnJheTogVHlwZWRBcnJheSwKKyBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlCit9OworCisvKioqLyB9KSwKKy8qIDExMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIERhdGFWaWV3ICE9PSAndW5kZWZpbmVkJzsKKworLyoqKi8gfSksCisvKiAxMTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cit2YXIgYUZ1bmN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OSk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Myk7Cit2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7CisgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjsKKyB2YXIgUzsKKyByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFGdW5jdGlvbihTKTsKK307CisKKy8qKiovIH0pLAorLyogMTEzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTE0KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTIzKTsKK19fd19wZGZqc19yZXF1aXJlX18oNzMpOworX193X3BkZmpzX3JlcXVpcmVfXygxMjUpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5NYXA7CisKKy8qKiovIH0pLAorLyogMTE0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGNvbGxlY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExNSk7Cit2YXIgY29sbGVjdGlvblN0cm9uZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIwKTsKK21vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignTWFwJywgZnVuY3Rpb24gKGluaXQpIHsKKyByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeworICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsKKyB9OworfSwgY29sbGVjdGlvblN0cm9uZyk7CisKKy8qKiovIH0pLAorLyogMTE1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyIGdsb2JhbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7Cit2YXIgaXNGb3JjZWQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ4KTsKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpOwordmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7Cit2YXIgaXRlcmF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTAwKTsKK3ZhciBhbkluc3RhbmNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMTgpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgZmFpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKK3ZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkzKTsKK3ZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd19wZGZqc19yZXF1aXJlX18oODEpOwordmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygxMTkpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7CisgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xOworIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xOworIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7CisgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdOworIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7CisgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7CisgdmFyIGV4cG9ydGVkID0ge307CisgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHsKKyAgdmFyIG5hdGl2ZU1ldGhvZCA9IE5hdGl2ZVByb3RvdHlwZVtLRVldOworICByZWRlZmluZShOYXRpdmVQcm90b3R5cGUsIEtFWSwgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7CisgICBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSk7CisgICByZXR1cm4gdGhpczsKKyAgfSA6IEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChrZXkpIHsKKyAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTsKKyAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gdW5kZWZpbmVkIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7CisgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7CisgIH0gOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkgeworICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpOworICAgcmV0dXJuIHRoaXM7CisgIH0pOworIH07CisgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHR5cGVvZiBOYXRpdmVDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeworICAgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTsKKyAgfSkpKSkgeworICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTsKKyAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7CisgfSBlbHNlIGlmIChpc0ZvcmNlZChDT05TVFJVQ1RPUl9OQU1FLCB0cnVlKSkgeworICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTsKKyAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTsKKyAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeworICAgaW5zdGFuY2UuaGFzKDEpOworICB9KTsKKyAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7CisgICBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOworICB9KTsKKyAgdmFyIEJVR0dZX1pFUk8gPSAhSVNfV0VBSyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7CisgICB2YXIgJGluc3RhbmNlID0gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7CisgICB2YXIgaW5kZXggPSA1OworICAgd2hpbGUgKGluZGV4LS0pCisgICAgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpOworICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTsKKyAgfSk7CisgIGlmICghQUNDRVBUX0lURVJBQkxFUykgeworICAgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uIChkdW1teSwgaXRlcmFibGUpIHsKKyAgICBhbkluc3RhbmNlKGR1bW15LCBDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7CisgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlQ29uc3RydWN0b3IoKSwgZHVtbXksIENvbnN0cnVjdG9yKTsKKyAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKQorICAgICBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKKyAgICByZXR1cm4gdGhhdDsKKyAgIH0pOworICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlOworICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7CisgIH0KKyAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHsKKyAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7CisgICBmaXhNZXRob2QoJ2hhcycpOworICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7CisgIH0KKyAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpCisgICBmaXhNZXRob2QoQURERVIpOworICBpZiAoSVNfV0VBSyAmJiBOYXRpdmVQcm90b3R5cGUuY2xlYXIpCisgICBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyOworIH0KKyBleHBvcnRlZFtDT05TVFJVQ1RPUl9OQU1FXSA9IENvbnN0cnVjdG9yOworICQoeworICBnbG9iYWw6IHRydWUsCisgIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IKKyB9LCBleHBvcnRlZCk7Cisgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOworIGlmICghSVNfV0VBSykKKyAgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTsKKyByZXR1cm4gQ29uc3RydWN0b3I7Cit9OworCisvKioqLyB9KSwKKy8qIDExNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzUpOwordmFyIGlzT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKS5mOwordmFyIHVpZCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzQpOwordmFyIEZSRUVaSU5HID0gX193X3BkZmpzX3JlcXVpcmVfXygxMTcpOwordmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7Cit2YXIgaWQgPSAwOwordmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkgeworIHJldHVybiB0cnVlOworfTsKK3ZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkgeworIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeworICB2YWx1ZTogeworICAgb2JqZWN0SUQ6ICdPJyArICsraWQsCisgICB3ZWFrRGF0YToge30KKyAgfQorIH0pOworfTsKK3ZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHsKKyBpZiAoIWlzT2JqZWN0KGl0KSkKKyAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDsKKyBpZiAoIWhhcyhpdCwgTUVUQURBVEEpKSB7CisgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkKKyAgIHJldHVybiAnRic7CisgIGlmICghY3JlYXRlKQorICAgcmV0dXJuICdFJzsKKyAgc2V0TWV0YWRhdGEoaXQpOworIH0KKyByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEOworfTsKK3ZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7CisgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkgeworICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpCisgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFjcmVhdGUpCisgICByZXR1cm4gZmFsc2U7CisgIHNldE1ldGFkYXRhKGl0KTsKKyB9CisgcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTsKK307Cit2YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHsKKyBpZiAoRlJFRVpJTkcgJiYgbWV0YS5SRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEFEQVRBKSkKKyAgc2V0TWV0YWRhdGEoaXQpOworIHJldHVybiBpdDsKK307Cit2YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0geworIFJFUVVJUkVEOiBmYWxzZSwKKyBmYXN0S2V5OiBmYXN0S2V5LAorIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSwKKyBvbkZyZWV6ZTogb25GcmVlemUKK307CitoaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7CisKKy8qKiovIH0pLAorLyogMTE3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOworbW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeworIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpOworfSk7CisKKy8qKiovIH0pLAorLyogMTE4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkgeworIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CisgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpOworIH0KKyByZXR1cm4gaXQ7Cit9OworCisvKioqLyB9KSwKKy8qIDExOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgaXNPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKK3ZhciBzZXRQcm90b3R5cGVPZiA9IF9fd19wZGZqc19yZXF1aXJlX18oODMpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJHRoaXMsIGR1bW15LCBXcmFwcGVyKSB7CisgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlOworIGlmIChzZXRQcm90b3R5cGVPZiAmJiB0eXBlb2YgKE5ld1RhcmdldCA9IGR1bW15LmNvbnN0cnVjdG9yKSA9PSAnZnVuY3Rpb24nICYmIE5ld1RhcmdldCAhPT0gV3JhcHBlciAmJiBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJiBOZXdUYXJnZXRQcm90b3R5cGUgIT09IFdyYXBwZXIucHJvdG90eXBlKQorICBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTsKKyByZXR1cm4gJHRoaXM7Cit9OworCisvKioqLyB9KSwKKy8qIDEyMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpLmY7Cit2YXIgY3JlYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Nyk7Cit2YXIgcmVkZWZpbmVBbGwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyMSk7Cit2YXIgYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTgpOwordmFyIGFuSW5zdGFuY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExOCk7Cit2YXIgaXRlcmF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTAwKTsKK3ZhciBkZWZpbmVJdGVyYXRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oNzUpOwordmFyIHNldFNwZWNpZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyMik7Cit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkpOwordmFyIGZhc3RLZXkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExNikuZmFzdEtleTsKK3ZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygyOSk7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjsKK21vZHVsZS5leHBvcnRzID0geworIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikgeworICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7CisgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpOworICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CisgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSwKKyAgICBpbmRleDogY3JlYXRlKG51bGwpLAorICAgIGZpcnN0OiB1bmRlZmluZWQsCisgICAgbGFzdDogdW5kZWZpbmVkLAorICAgIHNpemU6IDAKKyAgIH0pOworICAgaWYgKCFERVNDUklQVE9SUykKKyAgICB0aGF0LnNpemUgPSAwOworICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkKKyAgICBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKKyAgfSk7CisgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKKyAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTsKKyAgIHZhciBwcmV2aW91cywgaW5kZXg7CisgICBpZiAoZW50cnkpIHsKKyAgICBlbnRyeS52YWx1ZSA9IHZhbHVlOworICAgfSBlbHNlIHsKKyAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7CisgICAgIGluZGV4OiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwKKyAgICAga2V5OiBrZXksCisgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgcHJldmlvdXM6IHByZXZpb3VzID0gc3RhdGUubGFzdCwKKyAgICAgbmV4dDogdW5kZWZpbmVkLAorICAgICByZW1vdmVkOiBmYWxzZQorICAgIH07CisgICAgaWYgKCFzdGF0ZS5maXJzdCkKKyAgICAgc3RhdGUuZmlyc3QgPSBlbnRyeTsKKyAgICBpZiAocHJldmlvdXMpCisgICAgIHByZXZpb3VzLm5leHQgPSBlbnRyeTsKKyAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgIHN0YXRlLnNpemUrKzsKKyAgICBlbHNlCisgICAgIHRoYXQuc2l6ZSsrOworICAgIGlmIChpbmRleCAhPT0gJ0YnKQorICAgICBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTsKKyAgIH0KKyAgIHJldHVybiB0aGF0OworICB9OworICB2YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpOworICAgdmFyIGVudHJ5OworICAgaWYgKGluZGV4ICE9PSAnRicpCisgICAgcmV0dXJuIHN0YXRlLmluZGV4W2luZGV4XTsKKyAgIGZvciAoZW50cnkgPSBzdGF0ZS5maXJzdDsgZW50cnk7IGVudHJ5ID0gZW50cnkubmV4dCkgeworICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KQorICAgICByZXR1cm4gZW50cnk7CisgICB9CisgIH07CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7CisgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7CisgICAgdmFyIHRoYXQgPSB0aGlzOworICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7CisgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDsKKyAgICB2YXIgZW50cnkgPSBzdGF0ZS5maXJzdDsKKyAgICB3aGlsZSAoZW50cnkpIHsKKyAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7CisgICAgIGlmIChlbnRyeS5wcmV2aW91cykKKyAgICAgIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDsKKyAgICAgZGVsZXRlIGRhdGFbZW50cnkuaW5kZXhdOworICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CisgICAgfQorICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDsKKyAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgIHN0YXRlLnNpemUgPSAwOworICAgIGVsc2UKKyAgICAgdGhhdC5zaXplID0gMDsKKyAgIH0sCisgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgeworICAgIHZhciB0aGF0ID0gdGhpczsKKyAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7CisgICAgaWYgKGVudHJ5KSB7CisgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDsKKyAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91czsKKyAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTsKKyAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7CisgICAgIGlmIChwcmV2KQorICAgICAgcHJldi5uZXh0ID0gbmV4dDsKKyAgICAgaWYgKG5leHQpCisgICAgICBuZXh0LnByZXZpb3VzID0gcHJldjsKKyAgICAgaWYgKHN0YXRlLmZpcnN0ID09IGVudHJ5KQorICAgICAgc3RhdGUuZmlyc3QgPSBuZXh0OworICAgICBpZiAoc3RhdGUubGFzdCA9PSBlbnRyeSkKKyAgICAgIHN0YXRlLmxhc3QgPSBwcmV2OworICAgICBpZiAoREVTQ1JJUFRPUlMpCisgICAgICBzdGF0ZS5zaXplLS07CisgICAgIGVsc2UKKyAgICAgIHRoYXQuc2l6ZS0tOworICAgIH0KKyAgICByZXR1cm4gISFlbnRyeTsKKyAgIH0sCisgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4pIHsKKyAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOworICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CisgICAgdmFyIGVudHJ5OworICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7CisgICAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7CisgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKQorICAgICAgZW50cnkgPSBlbnRyeS5wcmV2aW91czsKKyAgICB9CisgICB9LAorICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7CisgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTsKKyAgIH0KKyAgfSk7CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CisgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGlzLCBrZXkpOworICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTsKKyAgIH0sCisgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CisgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7CisgICB9CisgIH0gOiB7CisgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkgeworICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpOworICAgfQorICB9KTsKKyAgaWYgKERFU0NSSVBUT1JTKQorICAgZGVmaW5lUHJvcGVydHkoQy5wcm90b3R5cGUsICdzaXplJywgeworICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplOworICAgIH0KKyAgIH0pOworICByZXR1cm4gQzsKKyB9LAorIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkgeworICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJzsKKyAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKKyAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7CisgIGRlZmluZUl0ZXJhdG9yKEMsIENPTlNUUlVDVE9SX05BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkgeworICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CisgICAgdHlwZTogSVRFUkFUT1JfTkFNRSwKKyAgICB0YXJnZXQ6IGl0ZXJhdGVkLAorICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksCisgICAga2luZDoga2luZCwKKyAgICBsYXN0OiB1bmRlZmluZWQKKyAgIH0pOworICB9LCBmdW5jdGlvbiAoKSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7CisgICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7CisgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0OworICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpCisgICAgZW50cnkgPSBlbnRyeS5wcmV2aW91czsKKyAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7CisgICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkOworICAgIHJldHVybiB7CisgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgIGRvbmU6IHRydWUKKyAgICB9OworICAgfQorICAgaWYgKGtpbmQgPT0gJ2tleXMnKQorICAgIHJldHVybiB7CisgICAgIHZhbHVlOiBlbnRyeS5rZXksCisgICAgIGRvbmU6IGZhbHNlCisgICAgfTsKKyAgIGlmIChraW5kID09ICd2YWx1ZXMnKQorICAgIHJldHVybiB7CisgICAgIHZhbHVlOiBlbnRyeS52YWx1ZSwKKyAgICAgZG9uZTogZmFsc2UKKyAgICB9OworICAgcmV0dXJuIHsKKyAgICB2YWx1ZTogWworICAgICBlbnRyeS5rZXksCisgICAgIGVudHJ5LnZhbHVlCisgICAgXSwKKyAgICBkb25lOiBmYWxzZQorICAgfTsKKyAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpOworICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpOworIH0KK307CisKKy8qKiovIH0pLAorLyogMTIxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciByZWRlZmluZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHsKKyBmb3IgKHZhciBrZXkgaW4gc3JjKQorICByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpOworIHJldHVybiB0YXJnZXQ7Cit9OworCisvKioqLyB9KSwKKy8qIDEyMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBnZXRCdWlsdEluID0gX193X3BkZmpzX3JlcXVpcmVfXygzOCk7Cit2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oOSk7Cit2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkgeworIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7CisgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjsKKyBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7CisgIGRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7CisgICBjb25maWd1cmFibGU6IHRydWUsCisgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gdGhpczsKKyAgIH0KKyAgfSk7CisgfQorfTsKKworLyoqKi8gfSksCisvKiAxMjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTIpOwordmFyIHJlZGVmaW5lID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7Cit2YXIgdG9TdHJpbmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNCk7CitpZiAoIVRPX1NUUklOR19UQUdfU1VQUE9SVCkgeworIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTsKK30KKworLyoqKi8gfSksCisvKiAxMjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gX193X3BkZmpzX3JlcXVpcmVfXyg5Mik7Cit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oOTEpOworbW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyB7fS50b1N0cmluZyA6IGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJzsKK307CisKKy8qKiovIH0pLAorLyogMTI1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOwordmFyIERPTUl0ZXJhYmxlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTI2KTsKK3ZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IF9fd19wZGZqc19yZXF1aXJlX18oOTgpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTMpOwordmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwordmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Cit2YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7Citmb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7CisgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTsKKyB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7CisgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGUpIHsKKyAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykKKyAgIHRyeSB7CisgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7CisgICB9IGNhdGNoIChlcnJvcikgeworICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7CisgICB9CisgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkgeworICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIENPTExFQ1RJT05fTkFNRSk7CisgIH0KKyAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKQorICAgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHsKKyAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkKKyAgICAgdHJ5IHsKKyAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBNRVRIT0RfTkFNRSwgQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKTsKKyAgICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdOworICAgICB9CisgICB9CisgfQorfQorCisvKioqLyB9KSwKKy8qIDEyNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgeworCittb2R1bGUuZXhwb3J0cyA9IHsKKyBDU1NSdWxlTGlzdDogMCwKKyBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLAorIENTU1ZhbHVlTGlzdDogMCwKKyBDbGllbnRSZWN0TGlzdDogMCwKKyBET01SZWN0TGlzdDogMCwKKyBET01TdHJpbmdMaXN0OiAwLAorIERPTVRva2VuTGlzdDogMSwKKyBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCwKKyBGaWxlTGlzdDogMCwKKyBIVE1MQWxsQ29sbGVjdGlvbjogMCwKKyBIVE1MQ29sbGVjdGlvbjogMCwKKyBIVE1MRm9ybUVsZW1lbnQ6IDAsCisgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsCisgTWVkaWFMaXN0OiAwLAorIE1pbWVUeXBlQXJyYXk6IDAsCisgTmFtZWROb2RlTWFwOiAwLAorIE5vZGVMaXN0OiAxLAorIFBhaW50UmVxdWVzdExpc3Q6IDAsCisgUGx1Z2luOiAwLAorIFBsdWdpbkFycmF5OiAwLAorIFNWR0xlbmd0aExpc3Q6IDAsCisgU1ZHTnVtYmVyTGlzdDogMCwKKyBTVkdQYXRoU2VnTGlzdDogMCwKKyBTVkdQb2ludExpc3Q6IDAsCisgU1ZHU3RyaW5nTGlzdDogMCwKKyBTVkdUcmFuc2Zvcm1MaXN0OiAwLAorIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsCisgU3R5bGVTaGVldExpc3Q6IDAsCisgVGV4dFRyYWNrQ3VlTGlzdDogMCwKKyBUZXh0VHJhY2tMaXN0OiAwLAorIFRvdWNoTGlzdDogMAorfTsKKworLyoqKi8gfSksCisvKiAxMjcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMjgpOworX193X3BkZmpzX3JlcXVpcmVfXygxMjMpOworX193X3BkZmpzX3JlcXVpcmVfXyg3Myk7CitfX3dfcGRmanNfcmVxdWlyZV9fKDEyNSk7Cit2YXIgcGF0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzkpOworbW9kdWxlLmV4cG9ydHMgPSBwYXRoLlNldDsKKworLyoqKi8gfSksCisvKiAxMjggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgY29sbGVjdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE1KTsKK3ZhciBjb2xsZWN0aW9uU3Ryb25nID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjApOworbW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdTZXQnLCBmdW5jdGlvbiAoaW5pdCkgeworIHJldHVybiBmdW5jdGlvbiBTZXQoKSB7CisgIHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOworIH07Cit9LCBjb2xsZWN0aW9uU3Ryb25nKTsKKworLyoqKi8gfSksCisvKiAxMjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMjMpOworX193X3BkZmpzX3JlcXVpcmVfXygxMzApOworX193X3BkZmpzX3JlcXVpcmVfXygxMjUpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5XZWFrTWFwOworCisvKioqLyB9KSwKKy8qIDEzMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOwordmFyIHJlZGVmaW5lQWxsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjEpOwordmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7Cit2YXIgY29sbGVjdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTE1KTsKK3ZhciBjb2xsZWN0aW9uV2VhayA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMxKTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwordmFyIGVuZm9yY2VJdGVybmFsU3RhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KS5lbmZvcmNlOwordmFyIE5BVElWRV9XRUFLX01BUCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzApOwordmFyIElTX0lFMTEgPSAhZ2xvYmFsLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbDsKK3ZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlOwordmFyIEludGVybmFsV2Vha01hcDsKK3ZhciB3cmFwcGVyID0gZnVuY3Rpb24gKGluaXQpIHsKKyByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHsKKyAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7CisgfTsKK307Cit2YXIgJFdlYWtNYXAgPSBtb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ1dlYWtNYXAnLCB3cmFwcGVyLCBjb2xsZWN0aW9uV2Vhayk7CitpZiAoTkFUSVZFX1dFQUtfTUFQICYmIElTX0lFMTEpIHsKKyBJbnRlcm5hbFdlYWtNYXAgPSBjb2xsZWN0aW9uV2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCAnV2Vha01hcCcsIHRydWUpOworIEludGVybmFsTWV0YWRhdGFNb2R1bGUuUkVRVUlSRUQgPSB0cnVlOworIHZhciBXZWFrTWFwUHJvdG90eXBlID0gJFdlYWtNYXAucHJvdG90eXBlOworIHZhciBuYXRpdmVEZWxldGUgPSBXZWFrTWFwUHJvdG90eXBlWydkZWxldGUnXTsKKyB2YXIgbmF0aXZlSGFzID0gV2Vha01hcFByb3RvdHlwZS5oYXM7CisgdmFyIG5hdGl2ZUdldCA9IFdlYWtNYXBQcm90b3R5cGUuZ2V0OworIHZhciBuYXRpdmVTZXQgPSBXZWFrTWFwUHJvdG90eXBlLnNldDsKKyByZWRlZmluZUFsbChXZWFrTWFwUHJvdG90eXBlLCB7CisgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7CisgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHsKKyAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpOworICAgIGlmICghc3RhdGUuZnJvemVuKQorICAgICBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7CisgICAgcmV0dXJuIG5hdGl2ZURlbGV0ZS5jYWxsKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuWydkZWxldGUnXShrZXkpOworICAgfQorICAgcmV0dXJuIG5hdGl2ZURlbGV0ZS5jYWxsKHRoaXMsIGtleSk7CisgIH0sCisgIGhhczogZnVuY3Rpb24gaGFzKGtleSkgeworICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CisgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoIXN0YXRlLmZyb3plbikKKyAgICAgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOworICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plbi5oYXMoa2V5KTsKKyAgIH0KKyAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpOworICB9LAorICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKKyAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkgeworICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7CisgICAgaWYgKCFzdGF0ZS5mcm96ZW4pCisgICAgIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTsKKyAgICByZXR1cm4gbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KSA/IG5hdGl2ZUdldC5jYWxsKHRoaXMsIGtleSkgOiBzdGF0ZS5mcm96ZW4uZ2V0KGtleSk7CisgICB9CisgICByZXR1cm4gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KTsKKyAgfSwKKyAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkgeworICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CisgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoIXN0YXRlLmZyb3plbikKKyAgICAgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOworICAgIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSkgPyBuYXRpdmVTZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlKSA6IHN0YXRlLmZyb3plbi5zZXQoa2V5LCB2YWx1ZSk7CisgICB9IGVsc2UKKyAgICBuYXRpdmVTZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTsKKyAgIHJldHVybiB0aGlzOworICB9CisgfSk7Cit9CisKKy8qKiovIH0pLAorLyogMTMxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIHJlZGVmaW5lQWxsID0gX193X3BkZmpzX3JlcXVpcmVfXygxMjEpOwordmFyIGdldFdlYWtEYXRhID0gX193X3BkZmpzX3JlcXVpcmVfXygxMTYpLmdldFdlYWtEYXRhOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cit2YXIgaXNPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKK3ZhciBhbkluc3RhbmNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMTgpOwordmFyIGl0ZXJhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMCk7Cit2YXIgQXJyYXlJdGVyYXRpb25Nb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMik7Cit2YXIgJGhhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOwordmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKK3ZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7Cit2YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yOwordmFyIGZpbmQgPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kOwordmFyIGZpbmRJbmRleCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmRJbmRleDsKK3ZhciBpZCA9IDA7Cit2YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uIChzdG9yZSkgeworIHJldHVybiBzdG9yZS5mcm96ZW4gfHwgKHN0b3JlLmZyb3plbiA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKCkpOworfTsKK3ZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkgeworIHRoaXMuZW50cmllcyA9IFtdOworfTsKK3ZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkgeworIHJldHVybiBmaW5kKHN0b3JlLmVudHJpZXMsIGZ1bmN0aW9uIChpdCkgeworICByZXR1cm4gaXRbMF0gPT09IGtleTsKKyB9KTsKK307CitVbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHsKKyBnZXQ6IGZ1bmN0aW9uIChrZXkpIHsKKyAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7CisgIGlmIChlbnRyeSkKKyAgIHJldHVybiBlbnRyeVsxXTsKKyB9LAorIGhhczogZnVuY3Rpb24gKGtleSkgeworICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTsKKyB9LAorIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7CisgIGlmIChlbnRyeSkKKyAgIGVudHJ5WzFdID0gdmFsdWU7CisgIGVsc2UKKyAgIHRoaXMuZW50cmllcy5wdXNoKFsKKyAgICBrZXksCisgICAgdmFsdWUKKyAgIF0pOworIH0sCisgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHsKKyAgdmFyIGluZGV4ID0gZmluZEluZGV4KHRoaXMuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7CisgICByZXR1cm4gaXRbMF0gPT09IGtleTsKKyAgfSk7CisgIGlmICh+aW5kZXgpCisgICB0aGlzLmVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTsKKyAgcmV0dXJuICEhfmluZGV4OworIH0KK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHsKKyAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkgeworICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBDT05TVFJVQ1RPUl9OQU1FKTsKKyAgIHNldEludGVybmFsU3RhdGUodGhhdCwgeworICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsCisgICAgaWQ6IGlkKyssCisgICAgZnJvemVuOiB1bmRlZmluZWQKKyAgIH0pOworICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkKKyAgICBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKKyAgfSk7CisgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKKyAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7CisgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOworICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShhbk9iamVjdChrZXkpLCB0cnVlKTsKKyAgIGlmIChkYXRhID09PSB0cnVlKQorICAgIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTsKKyAgIGVsc2UKKyAgICBkYXRhW3N0YXRlLmlkXSA9IHZhbHVlOworICAgcmV0dXJuIHRoYXQ7CisgIH07CisgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7CisgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgeworICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CisgICAgaWYgKCFpc09iamVjdChrZXkpKQorICAgICByZXR1cm4gZmFsc2U7CisgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpOworICAgIGlmIChkYXRhID09PSB0cnVlKQorICAgICByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSlbJ2RlbGV0ZSddKGtleSk7CisgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCBzdGF0ZS5pZCkgJiYgZGVsZXRlIGRhdGFbc3RhdGUuaWRdOworICAgfSwKKyAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkgeworICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CisgICAgaWYgKCFpc09iamVjdChrZXkpKQorICAgICByZXR1cm4gZmFsc2U7CisgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpOworICAgIGlmIChkYXRhID09PSB0cnVlKQorICAgICByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuaGFzKGtleSk7CisgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCBzdGF0ZS5pZCk7CisgICB9CisgIH0pOworICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgSVNfTUFQID8geworICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7CisgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKKyAgICBpZiAoaXNPYmplY3Qoa2V5KSkgeworICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7CisgICAgIGlmIChkYXRhID09PSB0cnVlKQorICAgICAgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLmdldChrZXkpOworICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkOworICAgIH0KKyAgIH0sCisgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CisgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXksIHZhbHVlKTsKKyAgIH0KKyAgfSA6IHsKKyAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7CisgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSwgdHJ1ZSk7CisgICB9CisgIH0pOworICByZXR1cm4gQzsKKyB9Cit9OworCisvKioqLyB9KSwKKy8qIDEzMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTgpOwordmFyIEluZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKK3ZhciB0b09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzkpOwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cit2YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMzMpOwordmFyIHB1c2ggPSBbXS5wdXNoOwordmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7CisgdmFyIElTX01BUCA9IFRZUEUgPT0gMTsKKyB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyOworIHZhciBJU19TT01FID0gVFlQRSA9PSAzOworIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDsKKyB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjsKKyB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDsKKyByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0LCBzcGVjaWZpY0NyZWF0ZSkgeworICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTsKKyAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pOworICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCwgMyk7CisgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7CisgIHZhciBpbmRleCA9IDA7CisgIHZhciBjcmVhdGUgPSBzcGVjaWZpY0NyZWF0ZSB8fCBhcnJheVNwZWNpZXNDcmVhdGU7CisgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkOworICB2YXIgdmFsdWUsIHJlc3VsdDsKKyAgZm9yICg7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKQorICAgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHsKKyAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdOworICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTsKKyAgICBpZiAoVFlQRSkgeworICAgICBpZiAoSVNfTUFQKQorICAgICAgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsKKyAgICAgZWxzZSBpZiAocmVzdWx0KQorICAgICAgc3dpdGNoIChUWVBFKSB7CisgICAgICBjYXNlIDM6CisgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIDU6CisgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgY2FzZSA2OgorICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgIGNhc2UgMjoKKyAgICAgICBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7CisgICAgICB9CisgICAgIGVsc2UgaWYgKElTX0VWRVJZKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgIH0KKyAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDsKKyB9OworfTsKK21vZHVsZS5leHBvcnRzID0geworIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgwKSwKKyBtYXA6IGNyZWF0ZU1ldGhvZCgxKSwKKyBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSwKKyBzb21lOiBjcmVhdGVNZXRob2QoMyksCisgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSwKKyBmaW5kOiBjcmVhdGVNZXRob2QoNSksCisgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNikKK307CisKKy8qKiovIH0pLAorLyogMTMzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwordmFyIGlzQXJyYXkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzNCk7Cit2YXIgd2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Myk7Cit2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7CisgdmFyIEM7CisgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHsKKyAgQyA9IG9yaWdpbmFsQXJyYXkuY29uc3RydWN0b3I7CisgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpCisgICBDID0gdW5kZWZpbmVkOworICBlbHNlIGlmIChpc09iamVjdChDKSkgeworICAgQyA9IENbU1BFQ0lFU107CisgICBpZiAoQyA9PT0gbnVsbCkKKyAgICBDID0gdW5kZWZpbmVkOworICB9CisgfQorIHJldHVybiBuZXcgKEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQykobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7Cit9OworCisvKioqLyB9KSwKKy8qIDEzNCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgY2xhc3NvZiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTUpOworbW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7CisgcmV0dXJuIGNsYXNzb2YoYXJnKSA9PSAnQXJyYXknOworfTsKKworLyoqKi8gfSksCisvKiAxMzUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxMjMpOworX193X3BkZmpzX3JlcXVpcmVfXygxMzYpOworX193X3BkZmpzX3JlcXVpcmVfXygxMjUpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5XZWFrU2V0OworCisvKioqLyB9KSwKKy8qIDEzNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciBjb2xsZWN0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXygxMTUpOwordmFyIGNvbGxlY3Rpb25XZWFrID0gX193X3BkZmpzX3JlcXVpcmVfXygxMzEpOworY29sbGVjdGlvbignV2Vha1NldCcsIGZ1bmN0aW9uIChpbml0KSB7CisgcmV0dXJuIGZ1bmN0aW9uIFdlYWtTZXQoKSB7CisgIHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOworIH07Cit9LCBjb2xsZWN0aW9uV2Vhayk7CisKKy8qKiovIH0pLAorLyogMTM3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTM4KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ2NvZGVQb2ludEF0Jyk7CisKKy8qKiovIH0pLAorLyogMTM4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyIGNvZGVBdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzQpLmNvZGVBdDsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgcHJvdG86IHRydWUKK30sIHsKKyBjb2RlUG9pbnRBdDogZnVuY3Rpb24gY29kZVBvaW50QXQocG9zKSB7CisgIHJldHVybiBjb2RlQXQodGhpcywgcG9zKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxMzkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxNDApOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5TdHJpbmcuZnJvbUNvZGVQb2ludDsKKworLyoqKi8gfSksCisvKiAxNDAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDUpOwordmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7Cit2YXIgbmF0aXZlRnJvbUNvZGVQb2ludCA9IFN0cmluZy5mcm9tQ29kZVBvaW50OwordmFyIElOQ09SUkVDVF9MRU5HVEggPSAhIW5hdGl2ZUZyb21Db2RlUG9pbnQgJiYgbmF0aXZlRnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMTsKKyQoeworIHRhcmdldDogJ1N0cmluZycsCisgc3RhdDogdHJ1ZSwKKyBmb3JjZWQ6IElOQ09SUkVDVF9MRU5HVEgKK30sIHsKKyBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHgpIHsKKyAgdmFyIGVsZW1lbnRzID0gW107CisgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworICB2YXIgaSA9IDA7CisgIHZhciBjb2RlOworICB3aGlsZSAobGVuZ3RoID4gaSkgeworICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTsKKyAgIGlmICh0b0Fic29sdXRlSW5kZXgoY29kZSwgMHgxMEZGRkYpICE9PSBjb2RlKQorICAgIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpOworICAgZWxlbWVudHMucHVzaChjb2RlIDwgMHgxMDAwMCA/IGZyb21DaGFyQ29kZShjb2RlKSA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLCBjb2RlICUgMHg0MDAgKyAweERDMDApKTsKKyAgfQorICByZXR1cm4gZWxlbWVudHMuam9pbignJyk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTQxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTQyKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTIzKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTQ2KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTUwKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTUxKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTUyKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTUzKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTU0KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTU1KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTU2KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTU3KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTU4KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTU5KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTYwKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTYxKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTYyKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTYzKTsKK19fd19wZGZqc19yZXF1aXJlX18oMTY0KTsKK19fd19wZGZqc19yZXF1aXJlX18oMTY1KTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXygzOSk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguU3ltYm9sOworCisvKioqLyB9KSwKKy8qIDE0MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIGlzQXJyYXkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzNCk7Cit2YXIgaXNPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKK3ZhciB0b09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzkpOwordmFyIHRvTGVuZ3RoID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7Cit2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg5KTsKK3ZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzMyk7Cit2YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQzKTsKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKK3ZhciBWOF9WRVJTSU9OID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDQpOwordmFyIElTX0NPTkNBVF9TUFJFQURBQkxFID0gd2VsbEtub3duU3ltYm9sKCdpc0NvbmNhdFNwcmVhZGFibGUnKTsKK3ZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjsKK3ZhciBNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQgPSAnTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJzsKK3ZhciBJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUID0gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgeworIHZhciBhcnJheSA9IFtdOworIGFycmF5W0lTX0NPTkNBVF9TUFJFQURBQkxFXSA9IGZhbHNlOworIHJldHVybiBhcnJheS5jb25jYXQoKVswXSAhPT0gYXJyYXk7Cit9KTsKK3ZhciBTUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdjb25jYXQnKTsKK3ZhciBpc0NvbmNhdFNwcmVhZGFibGUgPSBmdW5jdGlvbiAoTykgeworIGlmICghaXNPYmplY3QoTykpCisgIHJldHVybiBmYWxzZTsKKyB2YXIgc3ByZWFkYWJsZSA9IE9bSVNfQ09OQ0FUX1NQUkVBREFCTEVdOworIHJldHVybiBzcHJlYWRhYmxlICE9PSB1bmRlZmluZWQgPyAhIXNwcmVhZGFibGUgOiBpc0FycmF5KE8pOworfTsKK3ZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhU1BFQ0lFU19TVVBQT1JUOworJCh7CisgdGFyZ2V0OiAnQXJyYXknLAorIHByb3RvOiB0cnVlLAorIGZvcmNlZDogRk9SQ0VECit9LCB7CisgY29uY2F0OiBmdW5jdGlvbiBjb25jYXQoYXJnKSB7CisgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CisgIHZhciBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApOworICB2YXIgbiA9IDA7CisgIHZhciBpLCBrLCBsZW5ndGgsIGxlbiwgRTsKKyAgZm9yIChpID0gLTEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgRSA9IGkgPT09IC0xID8gTyA6IGFyZ3VtZW50c1tpXTsKKyAgIGlmIChpc0NvbmNhdFNwcmVhZGFibGUoRSkpIHsKKyAgICBsZW4gPSB0b0xlbmd0aChFLmxlbmd0aCk7CisgICAgaWYgKG4gKyBsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKQorICAgICB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyssIG4rKykKKyAgICAgaWYgKGsgaW4gRSkKKyAgICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4sIEVba10pOworICAgfSBlbHNlIHsKKyAgICBpZiAobiA+PSBNQVhfU0FGRV9JTlRFR0VSKQorICAgICB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTsKKyAgICBjcmVhdGVQcm9wZXJ0eShBLCBuKyssIEUpOworICAgfQorICB9CisgIEEubGVuZ3RoID0gbjsKKyAgcmV0dXJuIEE7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTQzICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBmYWlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTMpOwordmFyIFY4X1ZFUlNJT04gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0NCk7Cit2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHsKKyByZXR1cm4gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgeworICB2YXIgYXJyYXkgPSBbXTsKKyAgdmFyIGNvbnN0cnVjdG9yID0gYXJyYXkuY29uc3RydWN0b3IgPSB7fTsKKyAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7CisgICByZXR1cm4geyBmb286IDEgfTsKKyAgfTsKKyAgcmV0dXJuIGFycmF5W01FVEhPRF9OQU1FXShCb29sZWFuKS5mb28gIT09IDE7CisgfSk7Cit9OworCisvKioqLyB9KSwKKy8qIDE0NCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKK3ZhciB1c2VyQWdlbnQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0NSk7Cit2YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzOwordmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zOwordmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7Cit2YXIgbWF0Y2gsIHZlcnNpb247CitpZiAodjgpIHsKKyBtYXRjaCA9IHY4LnNwbGl0KCcuJyk7CisgdmVyc2lvbiA9IG1hdGNoWzBdICsgbWF0Y2hbMV07Cit9IGVsc2UgaWYgKHVzZXJBZ2VudCkgeworIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXC8oXGQrKS8pOworIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHsKKyAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVwvKFxkKykvKTsKKyAgaWYgKG1hdGNoKQorICAgdmVyc2lvbiA9IG1hdGNoWzFdOworIH0KK30KK21vZHVsZS5leHBvcnRzID0gdmVyc2lvbiAmJiArdmVyc2lvbjsKKworLyoqKi8gfSksCisvKiAxNDUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKK21vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnOworCisvKioqLyB9KSwKKy8qIDE0NiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKK3ZhciBnbG9iYWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOwordmFyIGdldEJ1aWx0SW4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKK3ZhciBJU19QVVJFID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7Cit2YXIgREVTQ1JJUFRPUlMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkpOwordmFyIE5BVElWRV9TWU1CT0wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU0KTsKK3ZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTUpOwordmFyIGZhaWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7Cit2YXIgaGFzID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7Cit2YXIgaXNBcnJheSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTM0KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwordmFyIGFuT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7Cit2YXIgdG9PYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc5KTsKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciB0b1ByaW1pdGl2ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcpOwordmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOwordmFyIG5hdGl2ZU9iamVjdENyZWF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNjcpOwordmFyIG9iamVjdEtleXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY5KTsKK3ZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MCk7Cit2YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDcpOwordmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwordmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7Cit2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKK3ZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwordmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpOwordmFyIHJlZGVmaW5lID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7Cit2YXIgc2hhcmVkID0gX193X3BkZmpzX3JlcXVpcmVfXygzMik7Cit2YXIgc2hhcmVkS2V5ID0gX193X3BkZmpzX3JlcXVpcmVfXygzMSk7Cit2YXIgaGlkZGVuS2V5cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzUpOwordmFyIHVpZCA9IF9fd19wZGZqc19yZXF1aXJlX18oMzQpOwordmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTMpOwordmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OCk7Cit2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDkpOwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4MSk7Cit2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjkpOwordmFyICRmb3JFYWNoID0gX193X3BkZmpzX3JlcXVpcmVfXygxMzIpLmZvckVhY2g7Cit2YXIgSElEREVOID0gc2hhcmVkS2V5KCdoaWRkZW4nKTsKK3ZhciBTWU1CT0wgPSAnU3ltYm9sJzsKK3ZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJzsKK3ZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7Cit2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0OwordmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpOwordmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdFtQUk9UT1RZUEVdOwordmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sOwordmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpOwordmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mOwordmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjsKK3ZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7Cit2YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mOwordmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTsKK3ZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7Cit2YXIgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeScpOwordmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTsKK3ZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwordmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDsKK3ZhciBVU0VfU0VUVEVSID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDsKK3ZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkgeworIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywgeworICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsKKyAgfQorIH0pKS5hICE9IDc7Cit9KSA/IGZ1bmN0aW9uIChPLCBQLCBBdHRyaWJ1dGVzKSB7CisgdmFyIE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCBQKTsKKyBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvcikKKyAgZGVsZXRlIE9iamVjdFByb3RvdHlwZVtQXTsKKyBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTsKKyBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciAmJiBPICE9PSBPYmplY3RQcm90b3R5cGUpIHsKKyAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTsKKyB9Cit9IDogbmF0aXZlRGVmaW5lUHJvcGVydHk7Cit2YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcsIGRlc2NyaXB0aW9uKSB7CisgdmFyIHN5bWJvbCA9IEFsbFN5bWJvbHNbdGFnXSA9IG5hdGl2ZU9iamVjdENyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pOworIHNldEludGVybmFsU3RhdGUoc3ltYm9sLCB7CisgIHR5cGU6IFNZTUJPTCwKKyAgdGFnOiB0YWcsCisgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbgorIH0pOworIGlmICghREVTQ1JJUFRPUlMpCisgIHN5bWJvbC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworIHJldHVybiBzeW1ib2w7Cit9OwordmFyIGlzU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHsKKyByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnOworfSA6IGZ1bmN0aW9uIChpdCkgeworIHJldHVybiBPYmplY3QoaXQpIGluc3RhbmNlb2YgJFN5bWJvbDsKK307Cit2YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykgeworIGlmIChPID09PSBPYmplY3RQcm90b3R5cGUpCisgICRkZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQLCBBdHRyaWJ1dGVzKTsKKyBhbk9iamVjdChPKTsKKyB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CisgYW5PYmplY3QoQXR0cmlidXRlcyk7CisgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7CisgIGlmICghQXR0cmlidXRlcy5lbnVtZXJhYmxlKSB7CisgICBpZiAoIWhhcyhPLCBISURERU4pKQorICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIEhJRERFTiwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHt9KSk7CisgICBPW0hJRERFTl1ba2V5XSA9IHRydWU7CisgIH0gZWxzZSB7CisgICBpZiAoaGFzKE8sIEhJRERFTikgJiYgT1tISURERU5dW2tleV0pCisgICAgT1tISURERU5dW2tleV0gPSBmYWxzZTsKKyAgIEF0dHJpYnV0ZXMgPSBuYXRpdmVPYmplY3RDcmVhdGUoQXR0cmlidXRlcywgeyBlbnVtZXJhYmxlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgZmFsc2UpIH0pOworICB9CisgIHJldHVybiBzZXRTeW1ib2xEZXNjcmlwdG9yKE8sIGtleSwgQXR0cmlidXRlcyk7CisgfQorIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBrZXksIEF0dHJpYnV0ZXMpOworfTsKK3ZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykgeworIGFuT2JqZWN0KE8pOworIHZhciBwcm9wZXJ0aWVzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpOworIHZhciBrZXlzID0gb2JqZWN0S2V5cyhwcm9wZXJ0aWVzKS5jb25jYXQoJGdldE93blByb3BlcnR5U3ltYm9scyhwcm9wZXJ0aWVzKSk7CisgJGZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkgeworICBpZiAoIURFU0NSSVBUT1JTIHx8ICRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHByb3BlcnRpZXMsIGtleSkpCisgICAkZGVmaW5lUHJvcGVydHkoTywga2V5LCBwcm9wZXJ0aWVzW2tleV0pOworIH0pOworIHJldHVybiBPOworfTsKK3ZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHsKKyByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gbmF0aXZlT2JqZWN0Q3JlYXRlKE8pIDogJGRlZmluZVByb3BlcnRpZXMobmF0aXZlT2JqZWN0Q3JlYXRlKE8pLCBQcm9wZXJ0aWVzKTsKK307Cit2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgeworIHZhciBQID0gdG9QcmltaXRpdmUoViwgdHJ1ZSk7CisgdmFyIGVudW1lcmFibGUgPSBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRoaXMsIFApOworIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIFApICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCkpCisgIHJldHVybiBmYWxzZTsKKyByZXR1cm4gZW51bWVyYWJsZSB8fCAhaGFzKHRoaXMsIFApIHx8ICFoYXMoQWxsU3ltYm9scywgUCkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW1BdID8gZW51bWVyYWJsZSA6IHRydWU7Cit9OwordmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkgeworIHZhciBpdCA9IHRvSW5kZXhlZE9iamVjdChPKTsKKyB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CisgaWYgKGl0ID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBrZXkpKQorICByZXR1cm47CisgdmFyIGRlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7CisgaWYgKGRlc2NyaXB0b3IgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgeworICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlOworIH0KKyByZXR1cm4gZGVzY3JpcHRvcjsKK307Cit2YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHsKKyB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChPKSk7CisgdmFyIHJlc3VsdCA9IFtdOworICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7CisgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhoaWRkZW5LZXlzLCBrZXkpKQorICAgcmVzdWx0LnB1c2goa2V5KTsKKyB9KTsKKyByZXR1cm4gcmVzdWx0OworfTsKK3ZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pIHsKKyB2YXIgSVNfT0JKRUNUX1BST1RPVFlQRSA9IE8gPT09IE9iamVjdFByb3RvdHlwZTsKKyB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKElTX09CSkVDVF9QUk9UT1RZUEUgPyBPYmplY3RQcm90b3R5cGVTeW1ib2xzIDogdG9JbmRleGVkT2JqZWN0KE8pKTsKKyB2YXIgcmVzdWx0ID0gW107CisgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHsKKyAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICghSVNfT0JKRUNUX1BST1RPVFlQRSB8fCBoYXMoT2JqZWN0UHJvdG90eXBlLCBrZXkpKSkgeworICAgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTsKKyAgfQorIH0pOworIHJldHVybiByZXN1bHQ7Cit9OworaWYgKCFOQVRJVkVfU1lNQk9MKSB7CisgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHsKKyAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKQorICAgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTsKKyAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTsKKyAgdmFyIHRhZyA9IHVpZChkZXNjcmlwdGlvbik7CisgIHZhciBzZXR0ZXIgPSBmdW5jdGlvbiAodmFsdWUpIHsKKyAgIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUpCisgICAgc2V0dGVyLmNhbGwoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgdmFsdWUpOworICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpCisgICAgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTsKKyAgIHNldFN5bWJvbERlc2NyaXB0b3IodGhpcywgdGFnLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTsKKyAgfTsKKyAgaWYgKERFU0NSSVBUT1JTICYmIFVTRV9TRVRURVIpCisgICBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7CisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIHNldDogc2V0dGVyCisgICB9KTsKKyAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7CisgfTsKKyByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7CisgfSk7CisgcmVkZWZpbmUoJFN5bWJvbCwgJ3dpdGhvdXRTZXR0ZXInLCBmdW5jdGlvbiAoZGVzY3JpcHRpb24pIHsKKyAgcmV0dXJuIHdyYXAodWlkKGRlc2NyaXB0aW9uKSwgZGVzY3JpcHRpb24pOworIH0pOworIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7CisgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0eTsKKyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CisgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lczsKKyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7Cisgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAgcmV0dXJuIHdyYXAod2VsbEtub3duU3ltYm9sKG5hbWUpLCBuYW1lKTsKKyB9OworIGlmIChERVNDUklQVE9SUykgeworICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sICdkZXNjcmlwdGlvbicsIHsKKyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuZGVzY3JpcHRpb247CisgICB9CisgIH0pOworICBpZiAoIUlTX1BVUkUpIHsKKyAgIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB7IHVuc2FmZTogdHJ1ZSB9KTsKKyAgfQorIH0KK30KKyQoeworIGdsb2JhbDogdHJ1ZSwKKyB3cmFwOiB0cnVlLAorIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsCisgc2hhbTogIU5BVElWRV9TWU1CT0wKK30sIHsgU3ltYm9sOiAkU3ltYm9sIH0pOworJGZvckVhY2gob2JqZWN0S2V5cyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBmdW5jdGlvbiAobmFtZSkgeworIGRlZmluZVdlbGxLbm93blN5bWJvbChuYW1lKTsKK30pOworJCh7CisgdGFyZ2V0OiBTWU1CT0wsCisgc3RhdDogdHJ1ZSwKKyBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MCit9LCB7CisgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHsKKyAgdmFyIHN0cmluZyA9IFN0cmluZyhrZXkpOworICBpZiAoaGFzKFN0cmluZ1RvU3ltYm9sUmVnaXN0cnksIHN0cmluZykpCisgICByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddOworICB2YXIgc3ltYm9sID0gJFN5bWJvbChzdHJpbmcpOworICBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5W3N0cmluZ10gPSBzeW1ib2w7CisgIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltYm9sXSA9IHN0cmluZzsKKyAgcmV0dXJuIHN5bWJvbDsKKyB9LAorIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkgeworICBpZiAoIWlzU3ltYm9sKHN5bSkpCisgICB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2wnKTsKKyAgaWYgKGhhcyhTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5LCBzeW0pKQorICAgcmV0dXJuIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltXTsKKyB9LAorIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeworICBVU0VfU0VUVEVSID0gdHJ1ZTsKKyB9LAorIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeworICBVU0VfU0VUVEVSID0gZmFsc2U7CisgfQorfSk7CiskKHsKKyB0YXJnZXQ6ICdPYmplY3QnLAorIHN0YXQ6IHRydWUsCisgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwKKyBzaGFtOiAhREVTQ1JJUFRPUlMKK30sIHsKKyBjcmVhdGU6ICRjcmVhdGUsCisgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSwKKyBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcywKKyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKK30pOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogIU5BVElWRV9TWU1CT0wKK30sIHsKKyBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcywKKyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMKK30pOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlLAorIGZvcmNlZDogZmFpbHMoZnVuY3Rpb24gKCkgeworICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZigxKTsKKyB9KQorfSwgeworIGdldE93blByb3BlcnR5U3ltYm9sczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7CisgIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZih0b09iamVjdChpdCkpOworIH0KK30pOworaWYgKCRzdHJpbmdpZnkpIHsKKyB2YXIgRk9SQ0VEX0pTT05fU1RSSU5HSUZZID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkgeworICB2YXIgc3ltYm9sID0gJFN5bWJvbCgpOworICByZXR1cm4gJHN0cmluZ2lmeShbc3ltYm9sXSkgIT0gJ1tudWxsXScgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPSAne30nIHx8ICRzdHJpbmdpZnkoT2JqZWN0KHN5bWJvbCkpICE9ICd7fSc7CisgfSk7CisgJCh7CisgIHRhcmdldDogJ0pTT04nLAorICBzdGF0OiB0cnVlLAorICBmb3JjZWQ6IEZPUkNFRF9KU09OX1NUUklOR0lGWQorIH0sIHsKKyAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkgeworICAgdmFyIGFyZ3MgPSBbaXRdOworICAgdmFyIGluZGV4ID0gMTsKKyAgIHZhciAkcmVwbGFjZXI7CisgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGluZGV4KQorICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaW5kZXgrK10pOworICAgJHJlcGxhY2VyID0gcmVwbGFjZXI7CisgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkKKyAgICByZXR1cm47CisgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKQorICAgIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykKKyAgICAgIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7CisgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKQorICAgICAgcmV0dXJuIHZhbHVlOworICAgIH07CisgICBhcmdzWzFdID0gcmVwbGFjZXI7CisgICByZXR1cm4gJHN0cmluZ2lmeS5hcHBseShudWxsLCBhcmdzKTsKKyAgfQorIH0pOworfQoraWYgKCEkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSkgeworIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpOworfQorc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgU1lNQk9MKTsKK2hpZGRlbktleXNbSElEREVOXSA9IHRydWU7CisKKy8qKiovIH0pLAorLyogMTQ3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKK3ZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MCkuZjsKK3ZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nOwordmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107Cit2YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHsKKyB0cnkgeworICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhpdCk7CisgfSBjYXRjaCAoZXJyb3IpIHsKKyAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7CisgfQorfTsKK21vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7CisgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTsKK307CisKKy8qKiovIH0pLAorLyogMTQ4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKK2V4cG9ydHMuZiA9IHdlbGxLbm93blN5bWJvbDsKKworLyoqKi8gfSksCisvKiAxNDkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDgpOwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMykuZjsKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHsKKyB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pOworIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpCisgIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwgeyB2YWx1ZTogd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKE5BTUUpIH0pOworfTsKKworLyoqKi8gfSksCisvKiAxNTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpOworCisvKioqLyB9KSwKKy8qIDE1MSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKK3ZhciBERVNDUklQVE9SUyA9IF9fd19wZGZqc19yZXF1aXJlX18oOSk7Cit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKK3ZhciBoYXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKK3ZhciBpc09iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwordmFyIGRlZmluZVByb3BlcnR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMykuZjsKK3ZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gX193X3BkZmpzX3JlcXVpcmVfXygzNik7Cit2YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKK2lmIChERVNDUklQVE9SUyAmJiB0eXBlb2YgTmF0aXZlU3ltYm9sID09ICdmdW5jdGlvbicgJiYgKCEoJ2Rlc2NyaXB0aW9uJyBpbiBOYXRpdmVTeW1ib2wucHJvdG90eXBlKSB8fCBOYXRpdmVTeW1ib2woKS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSkgeworIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTsKKyB2YXIgU3ltYm9sV3JhcHBlciA9IGZ1bmN0aW9uIFN5bWJvbCgpIHsKKyAgdmFyIGRlc2NyaXB0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTsKKyAgdmFyIHJlc3VsdCA9IHRoaXMgaW5zdGFuY2VvZiBTeW1ib2xXcmFwcGVyID8gbmV3IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbikgOiBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gTmF0aXZlU3ltYm9sKCkgOiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pOworICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKQorICAgRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlW3Jlc3VsdF0gPSB0cnVlOworICByZXR1cm4gcmVzdWx0OworIH07CisgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhTeW1ib2xXcmFwcGVyLCBOYXRpdmVTeW1ib2wpOworIHZhciBzeW1ib2xQcm90b3R5cGUgPSBTeW1ib2xXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZVN5bWJvbC5wcm90b3R5cGU7Cisgc3ltYm9sUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ltYm9sV3JhcHBlcjsKKyB2YXIgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90b3R5cGUudG9TdHJpbmc7CisgdmFyIG5hdGl2ZSA9IFN0cmluZyhOYXRpdmVTeW1ib2woJ3Rlc3QnKSkgPT0gJ1N5bWJvbCh0ZXN0KSc7CisgdmFyIHJlZ2V4cCA9IC9eU3ltYm9sXCgoLiopXClbXildKyQvOworIGRlZmluZVByb3BlcnR5KHN5bWJvbFByb3RvdHlwZSwgJ2Rlc2NyaXB0aW9uJywgeworICBjb25maWd1cmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7CisgICB2YXIgc3ltYm9sID0gaXNPYmplY3QodGhpcykgPyB0aGlzLnZhbHVlT2YoKSA6IHRoaXM7CisgICB2YXIgc3RyaW5nID0gc3ltYm9sVG9TdHJpbmcuY2FsbChzeW1ib2wpOworICAgaWYgKGhhcyhFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUsIHN5bWJvbCkpCisgICAgcmV0dXJuICcnOworICAgdmFyIGRlc2MgPSBuYXRpdmUgPyBzdHJpbmcuc2xpY2UoNywgLTEpIDogc3RyaW5nLnJlcGxhY2UocmVnZXhwLCAnJDEnKTsKKyAgIHJldHVybiBkZXNjID09PSAnJyA/IHVuZGVmaW5lZCA6IGRlc2M7CisgIH0KKyB9KTsKKyAkKHsKKyAgZ2xvYmFsOiB0cnVlLAorICBmb3JjZWQ6IHRydWUKKyB9LCB7IFN5bWJvbDogU3ltYm9sV3JhcHBlciB9KTsKK30KKworLyoqKi8gfSksCisvKiAxNTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTsKKworLyoqKi8gfSksCisvKiAxNTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7CisKKy8qKiovIH0pLAorLyogMTU0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CisKKy8qKiovIH0pLAorLyogMTU1ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoJyk7CisKKy8qKiovIH0pLAorLyogMTU2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoQWxsJyk7CisKKy8qKiovIH0pLAorLyogMTU3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTsKKworLyoqKi8gfSksCisvKiAxNTggKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnc2VhcmNoJyk7CisKKy8qKiovIH0pLAorLyogMTU5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0OSk7CitkZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKKworLyoqKi8gfSksCisvKiAxNjAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgnc3BsaXQnKTsKKworLyoqKi8gfSksCisvKiAxNjEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTsKKworLyoqKi8gfSksCisvKiAxNjIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKKworLyoqKi8gfSksCisvKiAxNjMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQ5KTsKK2RlZmluZVdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTsKKworLyoqKi8gfSksCisvKiAxNjQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIHNldFRvU3RyaW5nVGFnID0gX193X3BkZmpzX3JlcXVpcmVfXyg4MSk7CitzZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpOworCisvKioqLyB9KSwKKy8qIDE2NSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgZ2xvYmFsID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTsKK3ZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd19wZGZqc19yZXF1aXJlX18oODEpOworc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7CisKKy8qKiovIH0pLAorLyogMTY2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTY3KTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3BhZFN0YXJ0Jyk7CisKKy8qKiovIH0pLAorLyogMTY3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyICRwYWRTdGFydCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTY4KS5zdGFydDsKK3ZhciBXRUJLSVRfQlVHID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzApOworJCh7CisgdGFyZ2V0OiAnU3RyaW5nJywKKyBwcm90bzogdHJ1ZSwKKyBmb3JjZWQ6IFdFQktJVF9CVUcKK30sIHsKKyBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoKSB7CisgIHJldHVybiAkcGFkU3RhcnQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTY4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK3ZhciB0b0xlbmd0aCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDMpOwordmFyIHJlcGVhdCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTY5KTsKK3ZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7Cit2YXIgY2VpbCA9IE1hdGguY2VpbDsKK3ZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfRU5EKSB7CisgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nKSB7CisgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTsKKyAgdmFyIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoOworICB2YXIgZmlsbFN0ciA9IGZpbGxTdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcgJyA6IFN0cmluZyhmaWxsU3RyaW5nKTsKKyAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7CisgIHZhciBmaWxsTGVuLCBzdHJpbmdGaWxsZXI7CisgIGlmIChpbnRNYXhMZW5ndGggPD0gc3RyaW5nTGVuZ3RoIHx8IGZpbGxTdHIgPT0gJycpCisgICByZXR1cm4gUzsKKyAgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aDsKKyAgc3RyaW5nRmlsbGVyID0gcmVwZWF0LmNhbGwoZmlsbFN0ciwgY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTsKKyAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKQorICAgc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pOworICByZXR1cm4gSVNfRU5EID8gUyArIHN0cmluZ0ZpbGxlciA6IHN0cmluZ0ZpbGxlciArIFM7CisgfTsKK307Cittb2R1bGUuZXhwb3J0cyA9IHsKKyBzdGFydDogY3JlYXRlTWV0aG9kKGZhbHNlKSwKKyBlbmQ6IGNyZWF0ZU1ldGhvZCh0cnVlKQorfTsKKworLyoqKi8gfSksCisvKiAxNjkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCit2YXIgdG9JbnRlZ2VyID0gX193X3BkZmpzX3JlcXVpcmVfXyg0NCk7Cit2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOworbW9kdWxlLmV4cG9ydHMgPSAnJy5yZXBlYXQgfHwgZnVuY3Rpb24gcmVwZWF0KGNvdW50KSB7CisgdmFyIHN0ciA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTsKKyB2YXIgcmVzdWx0ID0gJyc7CisgdmFyIG4gPSB0b0ludGVnZXIoY291bnQpOworIGlmIChuIDwgMCB8fCBuID09IEluZmluaXR5KQorICB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBudW1iZXIgb2YgcmVwZXRpdGlvbnMnKTsKKyBmb3IgKDsgbiA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKQorICBpZiAobiAmIDEpCisgICByZXN1bHQgKz0gc3RyOworIHJldHVybiByZXN1bHQ7Cit9OworCisvKioqLyB9KSwKKy8qIDE3MCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCit2YXIgdXNlckFnZW50ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNDUpOworbW9kdWxlLmV4cG9ydHMgPSAvVmVyc2lvblwvMTBcLlxkKyhcLlxkKyk/KCBNb2JpbGVcL1x3Kyk/IFNhZmFyaVwvLy50ZXN0KHVzZXJBZ2VudCk7CisKKy8qKiovIH0pLAorLyogMTcxICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTcyKTsKK3ZhciBlbnRyeVVuYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oNTcpOworbW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ3BhZEVuZCcpOworCisvKioqLyB9KSwKKy8qIDE3MiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKK3ZhciAkID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKK3ZhciAkcGFkRW5kID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjgpLmVuZDsKK3ZhciBXRUJLSVRfQlVHID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzApOworJCh7CisgdGFyZ2V0OiAnU3RyaW5nJywKKyBwcm90bzogdHJ1ZSwKKyBmb3JjZWQ6IFdFQktJVF9CVUcKK30sIHsKKyBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGgpIHsKKyAgcmV0dXJuICRwYWRFbmQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CisgfQorfSk7CisKKy8qKiovIH0pLAorLyogMTczICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKK19fd19wZGZqc19yZXF1aXJlX18oMTc0KTsKK3ZhciBwYXRoID0gX193X3BkZmpzX3JlcXVpcmVfXygzOSk7Cittb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LnZhbHVlczsKKworLyoqKi8gfSksCisvKiAxNzQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyICR2YWx1ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3NSkudmFsdWVzOworJCh7CisgdGFyZ2V0OiAnT2JqZWN0JywKKyBzdGF0OiB0cnVlCit9LCB7CisgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoTykgeworICByZXR1cm4gJHZhbHVlcyhPKTsKKyB9Cit9KTsKKworLyoqKi8gfSksCisvKiAxNzUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyIERFU0NSSVBUT1JTID0gX193X3BkZmpzX3JlcXVpcmVfXyg5KTsKK3ZhciBvYmplY3RLZXlzID0gX193X3BkZmpzX3JlcXVpcmVfXyg2OSk7Cit2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxMyk7Cit2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKS5mOwordmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUT19FTlRSSUVTKSB7CisgcmV0dXJuIGZ1bmN0aW9uIChpdCkgeworICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChpdCk7CisgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTsKKyAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoOworICB2YXIgaSA9IDA7CisgIHZhciByZXN1bHQgPSBbXTsKKyAgdmFyIGtleTsKKyAgd2hpbGUgKGxlbmd0aCA+IGkpIHsKKyAgIGtleSA9IGtleXNbaSsrXTsKKyAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChPLCBrZXkpKSB7CisgICAgcmVzdWx0LnB1c2goVE9fRU5UUklFUyA/IFsKKyAgICAga2V5LAorICAgICBPW2tleV0KKyAgICBdIDogT1trZXldKTsKKyAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworIH07Cit9OworbW9kdWxlLmV4cG9ydHMgPSB7CisgZW50cmllczogY3JlYXRlTWV0aG9kKHRydWUpLAorIHZhbHVlczogY3JlYXRlTWV0aG9kKGZhbHNlKQorfTsKKworLyoqKi8gfSksCisvKiAxNzYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworX193X3BkZmpzX3JlcXVpcmVfXygxNzcpOwordmFyIHBhdGggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKK21vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZW50cmllczsKKworLyoqKi8gfSksCisvKiAxNzcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKwordmFyICQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwordmFyICRlbnRyaWVzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzUpLmVudHJpZXM7CiskKHsKKyB0YXJnZXQ6ICdPYmplY3QnLAorIHN0YXQ6IHRydWUKK30sIHsKKyBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHsKKyAgcmV0dXJuICRlbnRyaWVzKE8pOworIH0KK30pOworCisvKioqLyB9KSwKKy8qIDE3OCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkpiaWcySW1hZ2UgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTc5KTsKKwordmFyIF9hcml0aG1ldGljX2RlY29kZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4MCk7CisKK3ZhciBfY2NpdHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4MSk7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCit2YXIgSmJpZzJFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24pIHsKKyAgX2luaGVyaXRzKEpiaWcyRXJyb3IsIF9CYXNlRXhjZXB0aW9uKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEpiaWcyRXJyb3IpOworCisgIGZ1bmN0aW9uIEpiaWcyRXJyb3IobXNnKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpiaWcyRXJyb3IpOworCisgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsICJKQklHMiBlcnJvcjogIi5jb25jYXQobXNnKSk7CisgIH0KKworICByZXR1cm4gSmJpZzJFcnJvcjsKK30oX3V0aWwuQmFzZUV4Y2VwdGlvbik7CisKK3ZhciBKYmlnMkltYWdlID0gZnVuY3Rpb24gSmJpZzJJbWFnZUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENvbnRleHRDYWNoZSgpIHt9CisKKyAgQ29udGV4dENhY2hlLnByb3RvdHlwZSA9IHsKKyAgICBnZXRDb250ZXh0czogZnVuY3Rpb24gZ2V0Q29udGV4dHMoaWQpIHsKKyAgICAgIGlmIChpZCBpbiB0aGlzKSB7CisgICAgICAgIHJldHVybiB0aGlzW2lkXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXNbaWRdID0gbmV3IEludDhBcnJheSgxIDw8IDE2KTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICB0aGlzLmVuZCA9IGVuZDsKKyAgfQorCisgIERlY29kaW5nQ29udGV4dC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGRlY29kZXIoKSB7CisgICAgICB2YXIgZGVjb2RlciA9IG5ldyBfYXJpdGhtZXRpY19kZWNvZGVyLkFyaXRobWV0aWNEZWNvZGVyKHRoaXMuZGF0YSwgdGhpcy5zdGFydCwgdGhpcy5lbmQpOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJkZWNvZGVyIiwgZGVjb2Rlcik7CisgICAgfSwKKworICAgIGdldCBjb250ZXh0Q2FjaGUoKSB7CisgICAgICB2YXIgY2FjaGUgPSBuZXcgQ29udGV4dENhY2hlKCk7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImNvbnRleHRDYWNoZSIsIGNhY2hlKTsKKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgcHJvY2VkdXJlLCBkZWNvZGVyKSB7CisgICAgdmFyIGNvbnRleHRzID0gY29udGV4dENhY2hlLmdldENvbnRleHRzKHByb2NlZHVyZSk7CisgICAgdmFyIHByZXYgPSAxOworCisgICAgZnVuY3Rpb24gcmVhZEJpdHMobGVuZ3RoKSB7CisgICAgICB2YXIgdiA9IDA7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGJpdCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHJldik7CisgICAgICAgIHByZXYgPSBwcmV2IDwgMjU2ID8gcHJldiA8PCAxIHwgYml0IDogKHByZXYgPDwgMSB8IGJpdCkgJiA1MTEgfCAyNTY7CisgICAgICAgIHYgPSB2IDw8IDEgfCBiaXQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2ID4+PiAwOworICAgIH0KKworICAgIHZhciBzaWduID0gcmVhZEJpdHMoMSk7CisgICAgdmFyIHZhbHVlID0gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDMyKSArIDQ0MzYgOiByZWFkQml0cygxMikgKyAzNDAgOiByZWFkQml0cyg4KSArIDg0IDogcmVhZEJpdHMoNikgKyAyMCA6IHJlYWRCaXRzKDQpICsgNCA6IHJlYWRCaXRzKDIpOworCisgICAgaWYgKHNpZ24gPT09IDApIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlID4gMCkgeworICAgICAgcmV0dXJuIC12YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBjb2RlTGVuZ3RoKSB7CisgICAgdmFyIGNvbnRleHRzID0gY29udGV4dENhY2hlLmdldENvbnRleHRzKCJJQUlEIik7CisgICAgdmFyIHByZXYgPSAxOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlTGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpOworICAgICAgcHJldiA9IHByZXYgPDwgMSB8IGJpdDsKKyAgICB9CisKKyAgICBpZiAoY29kZUxlbmd0aCA8IDMxKSB7CisgICAgICByZXR1cm4gcHJldiAmICgxIDw8IGNvZGVMZW5ndGgpIC0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gcHJldiAmIDB4N2ZmZmZmZmY7CisgIH0KKworICB2YXIgU2VnbWVudFR5cGVzID0gWyJTeW1ib2xEaWN0aW9uYXJ5IiwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZVRleHRSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlVGV4dFJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiUGF0dGVybkRpY3Rpb25hcnkiLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVHZW5lcmljUmVnaW9uIiwgbnVsbCwgIkltbWVkaWF0ZUdlbmVyaWNSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uIiwgIkludGVybWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uIiwgbnVsbCwgIkltbWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiUGFnZUluZm9ybWF0aW9uIiwgIkVuZE9mUGFnZSIsICJFbmRPZlN0cmlwZSIsICJFbmRPZkZpbGUiLCAiUHJvZmlsZXMiLCAiVGFibGVzIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIkV4dGVuc2lvbiJdOworICB2YXIgQ29kaW5nVGVtcGxhdGVzID0gW1t7CisgICAgeDogLTEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTQsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTMsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogMAorICB9XSwgW3sKKyAgICB4OiAtMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMiwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAyLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMywKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAwCisgIH1dLCBbeworICAgIHg6IC0xLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IDAKKyAgfV0sIFt7CisgICAgeDogLTMsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTQsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTMsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogMAorICB9XV07CisgIHZhciBSZWZpbmVtZW50VGVtcGxhdGVzID0gW3sKKyAgICBjb2Rpbmc6IFt7CisgICAgICB4OiAwLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IDAKKyAgICB9XSwKKyAgICByZWZlcmVuY2U6IFt7CisgICAgICB4OiAwLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogLTEsCisgICAgICB5OiAxCisgICAgfSwgeworICAgICAgeDogMCwKKyAgICAgIHk6IDEKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogMQorICAgIH1dCisgIH0sIHsKKyAgICBjb2Rpbmc6IFt7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogMCwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogLTEsCisgICAgICB5OiAwCisgICAgfV0sCisgICAgcmVmZXJlbmNlOiBbeworICAgICAgeDogMCwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogLTEsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMCwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAxCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IDEKKyAgICB9XQorICB9XTsKKyAgdmFyIFJldXNlZENvbnRleHRzID0gWzB4OWIyNSwgMHgwNzk1LCAweDAwZTUsIDB4MDE5NV07CisgIHZhciBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHMgPSBbMHgwMDIwLCAweDAwMDhdOworCisgIGZ1bmN0aW9uIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOworICAgIHZhciBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdCIik7CisgICAgdmFyIGNvbnRleHRMYWJlbCwKKyAgICAgICAgaSwKKyAgICAgICAgaiwKKyAgICAgICAgcGl4ZWwsCisgICAgICAgIHJvdywKKyAgICAgICAgcm93MSwKKyAgICAgICAgcm93MiwKKyAgICAgICAgYml0bWFwID0gW107CisgICAgdmFyIE9MRF9QSVhFTF9NQVNLID0gMHg3YmY3OworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICByb3cgPSBiaXRtYXBbaV0gPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgICByb3cxID0gaSA8IDEgPyByb3cgOiBiaXRtYXBbaSAtIDFdOworICAgICAgcm93MiA9IGkgPCAyID8gcm93IDogYml0bWFwW2kgLSAyXTsKKyAgICAgIGNvbnRleHRMYWJlbCA9IHJvdzJbMF0gPDwgMTMgfCByb3cyWzFdIDw8IDEyIHwgcm93MlsyXSA8PCAxMSB8IHJvdzFbMF0gPDwgNyB8IHJvdzFbMV0gPDwgNiB8IHJvdzFbMl0gPDwgNSB8IHJvdzFbM10gPDwgNDsKKworICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgcm93W2pdID0gcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgIGNvbnRleHRMYWJlbCA9IChjb250ZXh0TGFiZWwgJiBPTERfUElYRUxfTUFTSykgPDwgMSB8IChqICsgMyA8IHdpZHRoID8gcm93MltqICsgM10gPDwgMTEgOiAwKSB8IChqICsgNCA8IHdpZHRoID8gcm93MVtqICsgNF0gPDwgNCA6IDApIHwgcGl4ZWw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZUJpdG1hcChtbXIsIHdpZHRoLCBoZWlnaHQsIHRlbXBsYXRlSW5kZXgsIHByZWRpY3Rpb24sIHNraXAsIGF0LCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICBpZiAobW1yKSB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgUmVhZGVyKGRlY29kaW5nQ29udGV4dC5kYXRhLCBkZWNvZGluZ0NvbnRleHQuc3RhcnQsIGRlY29kaW5nQ29udGV4dC5lbmQpOworICAgICAgcmV0dXJuIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOworICAgIH0KKworICAgIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwICYmICFza2lwICYmICFwcmVkaWN0aW9uICYmIGF0Lmxlbmd0aCA9PT0gNCAmJiBhdFswXS54ID09PSAzICYmIGF0WzBdLnkgPT09IC0xICYmIGF0WzFdLnggPT09IC0zICYmIGF0WzFdLnkgPT09IC0xICYmIGF0WzJdLnggPT09IDIgJiYgYXRbMl0ueSA9PT0gLTIgJiYgYXRbM10ueCA9PT0gLTIgJiYgYXRbM10ueSA9PT0gLTIpIHsKKyAgICAgIHJldHVybiBkZWNvZGVCaXRtYXBUZW1wbGF0ZTAod2lkdGgsIGhlaWdodCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICB9CisKKyAgICB2YXIgdXNlc2tpcCA9ICEhc2tpcDsKKyAgICB2YXIgdGVtcGxhdGUgPSBDb2RpbmdUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29uY2F0KGF0KTsKKyAgICB0ZW1wbGF0ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICByZXR1cm4gYS55IC0gYi55IHx8IGEueCAtIGIueDsKKyAgICB9KTsKKyAgICB2YXIgdGVtcGxhdGVMZW5ndGggPSB0ZW1wbGF0ZS5sZW5ndGg7CisgICAgdmFyIHRlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkodGVtcGxhdGVMZW5ndGgpOworICAgIHZhciB0ZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KHRlbXBsYXRlTGVuZ3RoKTsKKyAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMgPSBbXTsKKyAgICB2YXIgcmV1c2VNYXNrID0gMCwKKyAgICAgICAgbWluWCA9IDAsCisgICAgICAgIG1heFggPSAwLAorICAgICAgICBtaW5ZID0gMDsKKyAgICB2YXIgYywgazsKKworICAgIGZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZUxlbmd0aDsgaysrKSB7CisgICAgICB0ZW1wbGF0ZVhba10gPSB0ZW1wbGF0ZVtrXS54OworICAgICAgdGVtcGxhdGVZW2tdID0gdGVtcGxhdGVba10ueTsKKyAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB0ZW1wbGF0ZVtrXS54KTsKKyAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB0ZW1wbGF0ZVtrXS54KTsKKyAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB0ZW1wbGF0ZVtrXS55KTsKKworICAgICAgaWYgKGsgPCB0ZW1wbGF0ZUxlbmd0aCAtIDEgJiYgdGVtcGxhdGVba10ueSA9PT0gdGVtcGxhdGVbayArIDFdLnkgJiYgdGVtcGxhdGVba10ueCA9PT0gdGVtcGxhdGVbayArIDFdLnggLSAxKSB7CisgICAgICAgIHJldXNlTWFzayB8PSAxIDw8IHRlbXBsYXRlTGVuZ3RoIC0gMSAtIGs7CisgICAgICB9IGVsc2UgeworICAgICAgICBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcy5wdXNoKGspOworICAgICAgfQorICAgIH0KKworICAgIHZhciBjaGFuZ2luZ0VudHJpZXNMZW5ndGggPSBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcy5sZW5ndGg7CisgICAgdmFyIGNoYW5naW5nVGVtcGxhdGVYID0gbmV3IEludDhBcnJheShjaGFuZ2luZ0VudHJpZXNMZW5ndGgpOworICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKKyAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZUJpdCA9IG5ldyBVaW50MTZBcnJheShjaGFuZ2luZ0VudHJpZXNMZW5ndGgpOworCisgICAgZm9yIChjID0gMDsgYyA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgYysrKSB7CisgICAgICBrID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXNbY107CisgICAgICBjaGFuZ2luZ1RlbXBsYXRlWFtjXSA9IHRlbXBsYXRlW2tdLng7CisgICAgICBjaGFuZ2luZ1RlbXBsYXRlWVtjXSA9IHRlbXBsYXRlW2tdLnk7CisgICAgICBjaGFuZ2luZ1RlbXBsYXRlQml0W2NdID0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOworICAgIH0KKworICAgIHZhciBzYmJfbGVmdCA9IC1taW5YOworICAgIHZhciBzYmJfdG9wID0gLW1pblk7CisgICAgdmFyIHNiYl9yaWdodCA9IHdpZHRoIC0gbWF4WDsKKyAgICB2YXIgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CisgICAgdmFyIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKyAgICB2YXIgYml0bWFwID0gW107CisgICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKKyAgICB2YXIgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOworICAgIHZhciBsdHAgPSAwLAorICAgICAgICBqLAorICAgICAgICBpMCwKKyAgICAgICAgajAsCisgICAgICAgIGNvbnRleHRMYWJlbCA9IDAsCisgICAgICAgIGJpdCwKKyAgICAgICAgc2hpZnQ7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBpZiAocHJlZGljdGlvbikgeworICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKKyAgICAgICAgbHRwIF49IHNsdHA7CisKKyAgICAgICAgaWYgKGx0cCkgeworICAgICAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocm93KTsKKyAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHsKKyAgICAgICAgICByb3dbal0gPSAwOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGogPj0gc2JiX2xlZnQgJiYgaiA8IHNiYl9yaWdodCAmJiBpID49IHNiYl90b3ApIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSBjb250ZXh0TGFiZWwgPDwgMSAmIHJldXNlTWFzazsKKworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjaGFuZ2luZ0VudHJpZXNMZW5ndGg7IGsrKykgeworICAgICAgICAgICAgaTAgPSBpICsgY2hhbmdpbmdUZW1wbGF0ZVlba107CisgICAgICAgICAgICBqMCA9IGogKyBjaGFuZ2luZ1RlbXBsYXRlWFtrXTsKKyAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOworCisgICAgICAgICAgICBpZiAoYml0KSB7CisgICAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107CisgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRleHRMYWJlbCA9IDA7CisgICAgICAgICAgc2hpZnQgPSB0ZW1wbGF0ZUxlbmd0aCAtIDE7CisKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKywgc2hpZnQtLSkgeworICAgICAgICAgICAgajAgPSBqICsgdGVtcGxhdGVYW2tdOworCisgICAgICAgICAgICBpZiAoajAgPj0gMCAmJiBqMCA8IHdpZHRoKSB7CisgICAgICAgICAgICAgIGkwID0gaSArIHRlbXBsYXRlWVtrXTsKKworICAgICAgICAgICAgICBpZiAoaTAgPj0gMCkgeworICAgICAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOworCisgICAgICAgICAgICAgICAgaWYgKGJpdCkgeworICAgICAgICAgICAgICAgICAgY29udGV4dExhYmVsIHw9IGJpdCA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgIHJvd1tqXSA9IHBpeGVsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVSZWZpbmVtZW50KHdpZHRoLCBoZWlnaHQsIHRlbXBsYXRlSW5kZXgsIHJlZmVyZW5jZUJpdG1hcCwgb2Zmc2V0WCwgb2Zmc2V0WSwgcHJlZGljdGlvbiwgYXQsIGRlY29kaW5nQ29udGV4dCkgeworICAgIHZhciBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nOworCisgICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHsKKyAgICAgIGNvZGluZ1RlbXBsYXRlID0gY29kaW5nVGVtcGxhdGUuY29uY2F0KFthdFswXV0pOworICAgIH0KKworICAgIHZhciBjb2RpbmdUZW1wbGF0ZUxlbmd0aCA9IGNvZGluZ1RlbXBsYXRlLmxlbmd0aDsKKyAgICB2YXIgY29kaW5nVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOworICAgIHZhciBjb2RpbmdUZW1wbGF0ZVkgPSBuZXcgSW50MzJBcnJheShjb2RpbmdUZW1wbGF0ZUxlbmd0aCk7CisgICAgdmFyIGs7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDsKKyAgICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7CisgICAgfQorCisgICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlID0gUmVmaW5lbWVudFRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5yZWZlcmVuY2U7CisKKyAgICBpZiAodGVtcGxhdGVJbmRleCA9PT0gMCkgeworICAgICAgcmVmZXJlbmNlVGVtcGxhdGUgPSByZWZlcmVuY2VUZW1wbGF0ZS5jb25jYXQoW2F0WzFdXSk7CisgICAgfQorCisgICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoID0gcmVmZXJlbmNlVGVtcGxhdGUubGVuZ3RoOworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZVggPSBuZXcgSW50MzJBcnJheShyZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCk7CisgICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTsKKworICAgIGZvciAoayA9IDA7IGsgPCByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aDsgaysrKSB7CisgICAgICByZWZlcmVuY2VUZW1wbGF0ZVhba10gPSByZWZlcmVuY2VUZW1wbGF0ZVtrXS54OworICAgICAgcmVmZXJlbmNlVGVtcGxhdGVZW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueTsKKyAgICB9CisKKyAgICB2YXIgcmVmZXJlbmNlV2lkdGggPSByZWZlcmVuY2VCaXRtYXBbMF0ubGVuZ3RoOworICAgIHZhciByZWZlcmVuY2VIZWlnaHQgPSByZWZlcmVuY2VCaXRtYXAubGVuZ3RoOworICAgIHZhciBwc2V1ZG9QaXhlbENvbnRleHQgPSBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR1IiKTsKKyAgICB2YXIgbHRwID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIGlmIChwcmVkaWN0aW9uKSB7CisgICAgICAgIHZhciBzbHRwID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwc2V1ZG9QaXhlbENvbnRleHQpOworICAgICAgICBsdHAgXj0gc2x0cDsKKworICAgICAgICBpZiAobHRwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgICBiaXRtYXAucHVzaChyb3cpOworCisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgdmFyIGkwLCBqMDsKKyAgICAgICAgdmFyIGNvbnRleHRMYWJlbCA9IDA7CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGNvZGluZ1RlbXBsYXRlTGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICBpMCA9IGkgKyBjb2RpbmdUZW1wbGF0ZVlba107CisgICAgICAgICAgajAgPSBqICsgY29kaW5nVGVtcGxhdGVYW2tdOworCisgICAgICAgICAgaWYgKGkwIDwgMCB8fCBqMCA8IDAgfHwgajAgPj0gd2lkdGgpIHsKKyAgICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCBiaXRtYXBbaTBdW2owXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgICAgIGkwID0gaSArIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSAtIG9mZnNldFk7CisgICAgICAgICAgajAgPSBqICsgcmVmZXJlbmNlVGVtcGxhdGVYW2tdIC0gb2Zmc2V0WDsKKworICAgICAgICAgIGlmIChpMCA8IDAgfHwgaTAgPj0gcmVmZXJlbmNlSGVpZ2h0IHx8IGowIDwgMCB8fCBqMCA+PSByZWZlcmVuY2VXaWR0aCkgeworICAgICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0TGFiZWwgPSBjb250ZXh0TGFiZWwgPDwgMSB8IHJlZmVyZW5jZUJpdG1hcFtpMF1bajBdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciBwaXhlbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTsKKyAgICAgICAgcm93W2pdID0gcGl4ZWw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVN5bWJvbERpY3Rpb25hcnkoaHVmZm1hbiwgcmVmaW5lbWVudCwgc3ltYm9scywgbnVtYmVyT2ZOZXdTeW1ib2xzLCBudW1iZXJPZkV4cG9ydGVkU3ltYm9scywgaHVmZm1hblRhYmxlcywgdGVtcGxhdGVJbmRleCwgYXQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgaHVmZm1hbklucHV0KSB7CisgICAgaWYgKGh1ZmZtYW4gJiYgcmVmaW5lbWVudCkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInN5bWJvbCByZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgdmFyIG5ld1N5bWJvbHMgPSBbXTsKKyAgICB2YXIgY3VycmVudEhlaWdodCA9IDA7CisgICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoc3ltYm9scy5sZW5ndGggKyBudW1iZXJPZk5ld1N5bWJvbHMpOworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7CisgICAgdmFyIHRhYmxlQjEsIHN5bWJvbFdpZHRoczsKKworICAgIGlmIChodWZmbWFuKSB7CisgICAgICB0YWJsZUIxID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKKyAgICAgIHN5bWJvbFdpZHRocyA9IFtdOworICAgICAgc3ltYm9sQ29kZUxlbmd0aCA9IE1hdGgubWF4KHN5bWJvbENvZGVMZW5ndGgsIDEpOworICAgIH0KKworICAgIHdoaWxlIChuZXdTeW1ib2xzLmxlbmd0aCA8IG51bWJlck9mTmV3U3ltYm9scykgeworICAgICAgdmFyIGRlbHRhSGVpZ2h0ID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YUhlaWdodC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFESCIsIGRlY29kZXIpOworICAgICAgY3VycmVudEhlaWdodCArPSBkZWx0YUhlaWdodDsKKyAgICAgIHZhciBjdXJyZW50V2lkdGggPSAwLAorICAgICAgICAgIHRvdGFsV2lkdGggPSAwOworICAgICAgdmFyIGZpcnN0U3ltYm9sID0gaHVmZm1hbiA/IHN5bWJvbFdpZHRocy5sZW5ndGggOiAwOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgZGVsdGFXaWR0aCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFXaWR0aC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVyIsIGRlY29kZXIpOworCisgICAgICAgIGlmIChkZWx0YVdpZHRoID09PSBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDsKKyAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7CisgICAgICAgIHZhciBiaXRtYXA7CisKKyAgICAgICAgaWYgKHJlZmluZW1lbnQpIHsKKyAgICAgICAgICB2YXIgbnVtYmVyT2ZJbnN0YW5jZXMgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBQUkiLCBkZWNvZGVyKTsKKworICAgICAgICAgIGlmIChudW1iZXJPZkluc3RhbmNlcyA+IDEpIHsKKyAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24oaHVmZm1hbiwgcmVmaW5lbWVudCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCAwLCBudW1iZXJPZkluc3RhbmNlcywgMSwgc3ltYm9scy5jb25jYXQobmV3U3ltYm9scyksIHN5bWJvbENvZGVMZW5ndGgsIDAsIDAsIDEsIDAsIGh1ZmZtYW5UYWJsZXMsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgMCwgaHVmZm1hbklucHV0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFyIHN5bWJvbElkID0gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpOworICAgICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFgiLCBkZWNvZGVyKTsKKyAgICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRZIiwgZGVjb2Rlcik7CisgICAgICAgICAgICB2YXIgc3ltYm9sID0gc3ltYm9sSWQgPCBzeW1ib2xzLmxlbmd0aCA/IHN5bWJvbHNbc3ltYm9sSWRdIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTsKKyAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgc3ltYm9sLCByZHgsIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTsKKyAgICAgICAgfSBlbHNlIGlmIChodWZmbWFuKSB7CisgICAgICAgICAgc3ltYm9sV2lkdGhzLnB1c2goY3VycmVudFdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgdGVtcGxhdGVJbmRleCwgZmFsc2UsIG51bGwsIGF0LCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChiaXRtYXApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChodWZmbWFuICYmICFyZWZpbmVtZW50KSB7CisgICAgICAgIHZhciBiaXRtYXBTaXplID0gaHVmZm1hblRhYmxlcy50YWJsZUJpdG1hcFNpemUuZGVjb2RlKGh1ZmZtYW5JbnB1dCk7CisgICAgICAgIGh1ZmZtYW5JbnB1dC5ieXRlQWxpZ24oKTsKKyAgICAgICAgdmFyIGNvbGxlY3RpdmVCaXRtYXAgPSB2b2lkIDA7CisKKyAgICAgICAgaWYgKGJpdG1hcFNpemUgPT09IDApIHsKKyAgICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChodWZmbWFuSW5wdXQsIHRvdGFsV2lkdGgsIGN1cnJlbnRIZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhciBvcmlnaW5hbEVuZCA9IGh1ZmZtYW5JbnB1dC5lbmQ7CisgICAgICAgICAgdmFyIGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7CisgICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDsKKyAgICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCwgZmFsc2UpOworICAgICAgICAgIGh1ZmZtYW5JbnB1dC5lbmQgPSBvcmlnaW5hbEVuZDsKKyAgICAgICAgICBodWZmbWFuSW5wdXQucG9zaXRpb24gPSBiaXRtYXBFbmQ7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCA9IHN5bWJvbFdpZHRocy5sZW5ndGg7CisKKyAgICAgICAgaWYgKGZpcnN0U3ltYm9sID09PSBudW1iZXJPZlN5bWJvbHNEZWNvZGVkIC0gMSkgeworICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChjb2xsZWN0aXZlQml0bWFwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgX2kgPSB2b2lkIDAsCisgICAgICAgICAgICAgIHkgPSB2b2lkIDAsCisgICAgICAgICAgICAgIHhNaW4gPSAwLAorICAgICAgICAgICAgICB4TWF4ID0gdm9pZCAwLAorICAgICAgICAgICAgICBiaXRtYXBXaWR0aCA9IHZvaWQgMCwKKyAgICAgICAgICAgICAgc3ltYm9sQml0bWFwID0gdm9pZCAwOworCisgICAgICAgICAgZm9yIChfaSA9IGZpcnN0U3ltYm9sOyBfaSA8IG51bWJlck9mU3ltYm9sc0RlY29kZWQ7IF9pKyspIHsKKyAgICAgICAgICAgIGJpdG1hcFdpZHRoID0gc3ltYm9sV2lkdGhzW19pXTsKKyAgICAgICAgICAgIHhNYXggPSB4TWluICsgYml0bWFwV2lkdGg7CisgICAgICAgICAgICBzeW1ib2xCaXRtYXAgPSBbXTsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV3U3ltYm9scy5wdXNoKHN5bWJvbEJpdG1hcCk7CisgICAgICAgICAgICB4TWluID0geE1heDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZXhwb3J0ZWRTeW1ib2xzID0gW107CisgICAgdmFyIGZsYWdzID0gW10sCisgICAgICAgIGN1cnJlbnRGbGFnID0gZmFsc2U7CisgICAgdmFyIHRvdGFsU3ltYm9sc0xlbmd0aCA9IHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzOworCisgICAgd2hpbGUgKGZsYWdzLmxlbmd0aCA8IHRvdGFsU3ltYm9sc0xlbmd0aCkgeworICAgICAgdmFyIHJ1bkxlbmd0aCA9IGh1ZmZtYW4gPyB0YWJsZUIxLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUVYIiwgZGVjb2Rlcik7CisKKyAgICAgIHdoaWxlIChydW5MZW5ndGgtLSkgeworICAgICAgICBmbGFncy5wdXNoKGN1cnJlbnRGbGFnKTsKKyAgICAgIH0KKworICAgICAgY3VycmVudEZsYWcgPSAhY3VycmVudEZsYWc7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3ltYm9scy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBpZiAoZmxhZ3NbaV0pIHsKKyAgICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2goc3ltYm9sc1tpXSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1iZXJPZk5ld1N5bWJvbHM7IGkrKywgaisrKSB7CisgICAgICBpZiAoZmxhZ3NbaV0pIHsKKyAgICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2gobmV3U3ltYm9sc1tqXSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGV4cG9ydGVkU3ltYm9sczsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVRleHRSZWdpb24oaHVmZm1hbiwgcmVmaW5lbWVudCwgd2lkdGgsIGhlaWdodCwgZGVmYXVsdFBpeGVsVmFsdWUsIG51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCBzdHJpcFNpemUsIGlucHV0U3ltYm9scywgc3ltYm9sQ29kZUxlbmd0aCwgdHJhbnNwb3NlZCwgZHNPZmZzZXQsIHJlZmVyZW5jZUNvcm5lciwgY29tYmluYXRpb25PcGVyYXRvciwgaHVmZm1hblRhYmxlcywgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBsb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCkgeworICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBpLCByb3c7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKworICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgIHJvd1tqXSA9IGRlZmF1bHRQaXhlbFZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisgICAgfQorCisgICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKKyAgICB2YXIgY29udGV4dENhY2hlID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZTsKKyAgICB2YXIgc3RyaXBUID0gaHVmZm1hbiA/IC1odWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpIDogLWRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVCIsIGRlY29kZXIpOworICAgIHZhciBmaXJzdFMgPSAwOworICAgIGkgPSAwOworCisgICAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykgeworICAgICAgdmFyIGRlbHRhVCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURUIiwgZGVjb2Rlcik7CisgICAgICBzdHJpcFQgKz0gZGVsdGFUOworICAgICAgdmFyIGRlbHRhRmlyc3RTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVGaXJzdFMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRlMiLCBkZWNvZGVyKTsKKyAgICAgIGZpcnN0UyArPSBkZWx0YUZpcnN0UzsKKyAgICAgIHZhciBjdXJyZW50UyA9IGZpcnN0UzsKKworICAgICAgZG8geworICAgICAgICB2YXIgY3VycmVudFQgPSAwOworCisgICAgICAgIGlmIChzdHJpcFNpemUgPiAxKSB7CisgICAgICAgICAgY3VycmVudFQgPSBodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBSVQiLCBkZWNvZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0ID0gc3RyaXBTaXplICogc3RyaXBUICsgY3VycmVudFQ7CisgICAgICAgIHZhciBzeW1ib2xJZCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnN5bWJvbElEVGFibGUuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2Rlciwgc3ltYm9sQ29kZUxlbmd0aCk7CisgICAgICAgIHZhciBhcHBseVJlZmluZW1lbnQgPSByZWZpbmVtZW50ICYmIChodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXQoKSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSSSIsIGRlY29kZXIpKTsKKyAgICAgICAgdmFyIHN5bWJvbEJpdG1hcCA9IGlucHV0U3ltYm9sc1tzeW1ib2xJZF07CisgICAgICAgIHZhciBzeW1ib2xXaWR0aCA9IHN5bWJvbEJpdG1hcFswXS5sZW5ndGg7CisgICAgICAgIHZhciBzeW1ib2xIZWlnaHQgPSBzeW1ib2xCaXRtYXAubGVuZ3RoOworCisgICAgICAgIGlmIChhcHBseVJlZmluZW1lbnQpIHsKKyAgICAgICAgICB2YXIgcmR3ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEVyIsIGRlY29kZXIpOworICAgICAgICAgIHZhciByZGggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRIIiwgZGVjb2Rlcik7CisgICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFgiLCBkZWNvZGVyKTsKKyAgICAgICAgICB2YXIgcmR5ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWSIsIGRlY29kZXIpOworICAgICAgICAgIHN5bWJvbFdpZHRoICs9IHJkdzsKKyAgICAgICAgICBzeW1ib2xIZWlnaHQgKz0gcmRoOworICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoc3ltYm9sV2lkdGgsIHN5bWJvbEhlaWdodCwgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHN5bWJvbEJpdG1hcCwgKHJkdyA+PiAxKSArIHJkeCwgKHJkaCA+PiAxKSArIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpOworICAgICAgICB2YXIgb2Zmc2V0UyA9IGN1cnJlbnRTIC0gKHJlZmVyZW5jZUNvcm5lciAmIDIgPyBzeW1ib2xXaWR0aCAtIDEgOiAwKTsKKyAgICAgICAgdmFyIHMyLCB0Miwgc3ltYm9sUm93OworCisgICAgICAgIGlmICh0cmFuc3Bvc2VkKSB7CisgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sSGVpZ2h0OyBzMisrKSB7CisgICAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0UyArIHMyXTsKKworICAgICAgICAgICAgaWYgKCFyb3cpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFtzMl07CisgICAgICAgICAgICB2YXIgbWF4V2lkdGggPSBNYXRoLm1pbih3aWR0aCAtIG9mZnNldFQsIHN5bWJvbFdpZHRoKTsKKworICAgICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykgeworICAgICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gfD0gc3ltYm9sUm93W3QyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHsKKyAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIF49IHN5bWJvbFJvd1t0Ml07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigib3BlcmF0b3IgIi5jb25jYXQoY29tYmluYXRpb25PcGVyYXRvciwgIiBpcyBub3Qgc3VwcG9ydGVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbEhlaWdodCAtIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgc3ltYm9sSGVpZ2h0OyB0MisrKSB7CisgICAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0VCArIHQyXTsKKworICAgICAgICAgICAgaWYgKCFyb3cpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFt0Ml07CisKKyAgICAgICAgICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sV2lkdGg7IHMyKyspIHsKKyAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRTICsgczJdIHw9IHN5bWJvbFJvd1tzMl07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CisgICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSBePSBzeW1ib2xSb3dbczJdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm9wZXJhdG9yICIuY29uY2F0KGNvbWJpbmF0aW9uT3BlcmF0b3IsICIgaXMgbm90IHN1cHBvcnRlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xXaWR0aCAtIDE7CisgICAgICAgIH0KKworICAgICAgICBpKys7CisgICAgICAgIHZhciBkZWx0YVMgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhUy5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEUyIsIGRlY29kZXIpOworCisgICAgICAgIGlmIChkZWx0YVMgPT09IG51bGwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRTICs9IGRlbHRhUyArIGRzT2Zmc2V0OworICAgICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIGJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KG1tciwgcGF0dGVybldpZHRoLCBwYXR0ZXJuSGVpZ2h0LCBtYXhQYXR0ZXJuSW5kZXgsIHRlbXBsYXRlLCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICB2YXIgYXQgPSBbXTsKKworICAgIGlmICghbW1yKSB7CisgICAgICBhdC5wdXNoKHsKKyAgICAgICAgeDogLXBhdHRlcm5XaWR0aCwKKyAgICAgICAgeTogMAorICAgICAgfSk7CisKKyAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gMCkgeworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAtMywKKyAgICAgICAgICB5OiAtMQorICAgICAgICB9KTsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogMiwKKyAgICAgICAgICB5OiAtMgorICAgICAgICB9KTsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogLTIsCisgICAgICAgICAgeTogLTIKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGNvbGxlY3RpdmVXaWR0aCA9IChtYXhQYXR0ZXJuSW5kZXggKyAxKSAqIHBhdHRlcm5XaWR0aDsKKyAgICB2YXIgY29sbGVjdGl2ZUJpdG1hcCA9IGRlY29kZUJpdG1hcChtbXIsIGNvbGxlY3RpdmVXaWR0aCwgcGF0dGVybkhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBudWxsLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICB2YXIgcGF0dGVybnMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IG1heFBhdHRlcm5JbmRleDsgaSsrKSB7CisgICAgICB2YXIgcGF0dGVybkJpdG1hcCA9IFtdOworICAgICAgdmFyIHhNaW4gPSBwYXR0ZXJuV2lkdGggKiBpOworICAgICAgdmFyIHhNYXggPSB4TWluICsgcGF0dGVybldpZHRoOworCisgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHBhdHRlcm5IZWlnaHQ7IHkrKykgeworICAgICAgICBwYXR0ZXJuQml0bWFwLnB1c2goY29sbGVjdGl2ZUJpdG1hcFt5XS5zdWJhcnJheSh4TWluLCB4TWF4KSk7CisgICAgICB9CisKKyAgICAgIHBhdHRlcm5zLnB1c2gocGF0dGVybkJpdG1hcCk7CisgICAgfQorCisgICAgcmV0dXJuIHBhdHRlcm5zOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24obW1yLCBwYXR0ZXJucywgdGVtcGxhdGUsIHJlZ2lvbldpZHRoLCByZWdpb25IZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBlbmFibGVTa2lwLCBjb21iaW5hdGlvbk9wZXJhdG9yLCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIGdyaWRPZmZzZXRYLCBncmlkT2Zmc2V0WSwgZ3JpZFZlY3RvclgsIGdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICB2YXIgc2tpcCA9IG51bGw7CisKKyAgICBpZiAoZW5hYmxlU2tpcCkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNraXAgaXMgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIGlmIChjb21iaW5hdGlvbk9wZXJhdG9yICE9PSAwKSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigib3BlcmF0b3IgIiArIGNvbWJpbmF0aW9uT3BlcmF0b3IgKyAiIGlzIG5vdCBzdXBwb3J0ZWQgaW4gaGFsZnRvbmUgcmVnaW9uIik7CisgICAgfQorCisgICAgdmFyIHJlZ2lvbkJpdG1hcCA9IFtdOworICAgIHZhciBpLCBqLCByb3c7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVnaW9uSGVpZ2h0OyBpKyspIHsKKyAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHJlZ2lvbldpZHRoKTsKKworICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCByZWdpb25XaWR0aDsgaisrKSB7CisgICAgICAgICAgcm93W2pdID0gZGVmYXVsdFBpeGVsVmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVnaW9uQml0bWFwLnB1c2gocm93KTsKKyAgICB9CisKKyAgICB2YXIgbnVtYmVyT2ZQYXR0ZXJucyA9IHBhdHRlcm5zLmxlbmd0aDsKKyAgICB2YXIgcGF0dGVybjAgPSBwYXR0ZXJuc1swXTsKKyAgICB2YXIgcGF0dGVybldpZHRoID0gcGF0dGVybjBbMF0ubGVuZ3RoLAorICAgICAgICBwYXR0ZXJuSGVpZ2h0ID0gcGF0dGVybjAubGVuZ3RoOworICAgIHZhciBiaXRzUGVyVmFsdWUgPSAoMCwgX2NvcmVfdXRpbHMubG9nMikobnVtYmVyT2ZQYXR0ZXJucyk7CisgICAgdmFyIGF0ID0gW107CisKKyAgICBpZiAoIW1tcikgeworICAgICAgYXQucHVzaCh7CisgICAgICAgIHg6IHRlbXBsYXRlIDw9IDEgPyAzIDogMiwKKyAgICAgICAgeTogLTEKKyAgICAgIH0pOworCisgICAgICBpZiAodGVtcGxhdGUgPT09IDApIHsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogLTMsCisgICAgICAgICAgeTogLTEKKyAgICAgICAgfSk7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IDIsCisgICAgICAgICAgeTogLTIKKyAgICAgICAgfSk7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IC0yLAorICAgICAgICAgIHk6IC0yCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIHZhciBncmF5U2NhbGVCaXRQbGFuZXMgPSBbXTsKKyAgICB2YXIgbW1ySW5wdXQsIGJpdG1hcDsKKworICAgIGlmIChtbXIpIHsKKyAgICAgIG1tcklucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBiaXRzUGVyVmFsdWUgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgaWYgKG1tcikgeworICAgICAgICBiaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAobW1ySW5wdXQsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgZ3JheVNjYWxlQml0UGxhbmVzW2ldID0gYml0bWFwOworICAgIH0KKworICAgIHZhciBtZywgbmcsIGJpdCwgcGF0dGVybkluZGV4LCBwYXR0ZXJuQml0bWFwLCB4LCB5LCBwYXR0ZXJuUm93LCByZWdpb25Sb3c7CisKKyAgICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7CisgICAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHsKKyAgICAgICAgYml0ID0gMDsKKyAgICAgICAgcGF0dGVybkluZGV4ID0gMDsKKworICAgICAgICBmb3IgKGogPSBiaXRzUGVyVmFsdWUgLSAxOyBqID49IDA7IGotLSkgeworICAgICAgICAgIGJpdCA9IGdyYXlTY2FsZUJpdFBsYW5lc1tqXVttZ11bbmddIF4gYml0OworICAgICAgICAgIHBhdHRlcm5JbmRleCB8PSBiaXQgPDwgajsKKyAgICAgICAgfQorCisgICAgICAgIHBhdHRlcm5CaXRtYXAgPSBwYXR0ZXJuc1twYXR0ZXJuSW5kZXhdOworICAgICAgICB4ID0gZ3JpZE9mZnNldFggKyBtZyAqIGdyaWRWZWN0b3JZICsgbmcgKiBncmlkVmVjdG9yWCA+PiA4OworICAgICAgICB5ID0gZ3JpZE9mZnNldFkgKyBtZyAqIGdyaWRWZWN0b3JYIC0gbmcgKiBncmlkVmVjdG9yWSA+PiA4OworCisgICAgICAgIGlmICh4ID49IDAgJiYgeCArIHBhdHRlcm5XaWR0aCA8PSByZWdpb25XaWR0aCAmJiB5ID49IDAgJiYgeSArIHBhdHRlcm5IZWlnaHQgPD0gcmVnaW9uSGVpZ2h0KSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdHRlcm5IZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgcmVnaW9uUm93ID0gcmVnaW9uQml0bWFwW3kgKyBpXTsKKyAgICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0dGVybldpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgcmVnaW9uUm93W3ggKyBqXSB8PSBwYXR0ZXJuUm93W2pdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgcmVnaW9uWCA9IHZvaWQgMCwKKyAgICAgICAgICAgICAgcmVnaW9uWSA9IHZvaWQgMDsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTsKKworICAgICAgICAgICAgaWYgKHJlZ2lvblkgPCAwIHx8IHJlZ2lvblkgPj0gcmVnaW9uSGVpZ2h0KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWdpb25Sb3cgPSByZWdpb25CaXRtYXBbcmVnaW9uWV07CisgICAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CisgICAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajsKKworICAgICAgICAgICAgICBpZiAocmVnaW9uWCA+PSAwICYmIHJlZ2lvblggPCByZWdpb25XaWR0aCkgeworICAgICAgICAgICAgICAgIHJlZ2lvblJvd1tyZWdpb25YXSB8PSBwYXR0ZXJuUm93W2pdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlZ2lvbkJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHN0YXJ0KSB7CisgICAgdmFyIHNlZ21lbnRIZWFkZXIgPSB7fTsKKyAgICBzZWdtZW50SGVhZGVyLm51bWJlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCk7CisgICAgdmFyIGZsYWdzID0gZGF0YVtzdGFydCArIDRdOworICAgIHZhciBzZWdtZW50VHlwZSA9IGZsYWdzICYgMHgzZjsKKworICAgIGlmICghU2VnbWVudFR5cGVzW3NlZ21lbnRUeXBlXSkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgc2VnbWVudCB0eXBlOiAiICsgc2VnbWVudFR5cGUpOworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIudHlwZSA9IHNlZ21lbnRUeXBlOworICAgIHNlZ21lbnRIZWFkZXIudHlwZU5hbWUgPSBTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdOworICAgIHNlZ21lbnRIZWFkZXIuZGVmZXJyZWROb25SZXRhaW4gPSAhIShmbGFncyAmIDB4ODApOworICAgIHZhciBwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUgPSAhIShmbGFncyAmIDB4NDApOworICAgIHZhciByZWZlcnJlZEZsYWdzID0gZGF0YVtzdGFydCArIDVdOworICAgIHZhciByZWZlcnJlZFRvQ291bnQgPSByZWZlcnJlZEZsYWdzID4+IDUgJiA3OworICAgIHZhciByZXRhaW5CaXRzID0gW3JlZmVycmVkRmxhZ3MgJiAzMV07CisgICAgdmFyIHBvc2l0aW9uID0gc3RhcnQgKyA2OworCisgICAgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDcpIHsKKyAgICAgIHJlZmVycmVkVG9Db3VudCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiAtIDEpICYgMHgxZmZmZmZmZjsKKyAgICAgIHBvc2l0aW9uICs9IDM7CisgICAgICB2YXIgYnl0ZXMgPSByZWZlcnJlZFRvQ291bnQgKyA3ID4+IDM7CisgICAgICByZXRhaW5CaXRzWzBdID0gZGF0YVtwb3NpdGlvbisrXTsKKworICAgICAgd2hpbGUgKC0tYnl0ZXMgPiAwKSB7CisgICAgICAgIHJldGFpbkJpdHMucHVzaChkYXRhW3Bvc2l0aW9uKytdKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDUgfHwgcmVmZXJyZWRGbGFncyA9PT0gNikgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgcmVmZXJyZWQtdG8gZmxhZ3MiKTsKKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLnJldGFpbkJpdHMgPSByZXRhaW5CaXRzOworICAgIHZhciByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSA0OworCisgICAgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDI1NikgeworICAgICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMTsKKyAgICB9IGVsc2UgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDY1NTM2KSB7CisgICAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAyOworICAgIH0KKworICAgIHZhciByZWZlcnJlZFRvID0gW107CisgICAgdmFyIGksIGlpOworCisgICAgZm9yIChpID0gMDsgaSA8IHJlZmVycmVkVG9Db3VudDsgaSsrKSB7CisgICAgICB2YXIgbnVtYmVyID0gdm9pZCAwOworCisgICAgICBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAxKSB7CisgICAgICAgIG51bWJlciA9IGRhdGFbcG9zaXRpb25dOworICAgICAgfSBlbHNlIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDIpIHsKKyAgICAgICAgbnVtYmVyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG51bWJlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICB9CisKKyAgICAgIHJlZmVycmVkVG8ucHVzaChudW1iZXIpOworICAgICAgcG9zaXRpb24gKz0gcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplOworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIucmVmZXJyZWRUbyA9IHJlZmVycmVkVG87CisKKyAgICBpZiAoIXBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSkgeworICAgICAgc2VnbWVudEhlYWRlci5wYWdlQXNzb2NpYXRpb24gPSBkYXRhW3Bvc2l0aW9uKytdOworICAgIH0gZWxzZSB7CisgICAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICBwb3NpdGlvbiArPSA0OworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICBwb3NpdGlvbiArPSA0OworCisgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CisgICAgICBpZiAoc2VnbWVudFR5cGUgPT09IDM4KSB7CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uSW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aF07CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uTW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpOworICAgICAgICB2YXIgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7CisgICAgICAgIHZhciBzZWFyY2hQYXR0ZXJuID0gbmV3IFVpbnQ4QXJyYXkoc2VhcmNoUGF0dGVybkxlbmd0aCk7CisKKyAgICAgICAgaWYgKCFnZW5lcmljUmVnaW9uTW1yKSB7CisgICAgICAgICAgc2VhcmNoUGF0dGVyblswXSA9IDB4ZmY7CisgICAgICAgICAgc2VhcmNoUGF0dGVyblsxXSA9IDB4YWM7CisgICAgICAgIH0KKworICAgICAgICBzZWFyY2hQYXR0ZXJuWzJdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+PiAyNCAmIDB4ZmY7CisgICAgICAgIHNlYXJjaFBhdHRlcm5bM10gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgPj4gMTYgJiAweGZmOworICAgICAgICBzZWFyY2hQYXR0ZXJuWzRdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDggJiAweGZmOworICAgICAgICBzZWFyY2hQYXR0ZXJuWzVdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ICYgMHhmZjsKKworICAgICAgICBmb3IgKGkgPSBwb3NpdGlvbiwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICB2YXIgaiA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoaiA8IHNlYXJjaFBhdHRlcm5MZW5ndGggJiYgc2VhcmNoUGF0dGVybltqXSA9PT0gZGF0YVtpICsgal0pIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaiA9PT0gc2VhcmNoUGF0dGVybkxlbmd0aCkgeworICAgICAgICAgICAgc2VnbWVudEhlYWRlci5sZW5ndGggPSBpICsgc2VhcmNoUGF0dGVybkxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikgeworICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzZWdtZW50IGVuZCB3YXMgbm90IGZvdW5kIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGgiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLmhlYWRlckVuZCA9IHBvc2l0aW9uOworICAgIHJldHVybiBzZWdtZW50SGVhZGVyOworICB9CisKKyAgZnVuY3Rpb24gcmVhZFNlZ21lbnRzKGhlYWRlciwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHZhciBzZWdtZW50cyA9IFtdOworICAgIHZhciBwb3NpdGlvbiA9IHN0YXJ0OworCisgICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7CisgICAgICB2YXIgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7CisgICAgICB2YXIgc2VnbWVudCA9IHsKKyAgICAgICAgaGVhZGVyOiBzZWdtZW50SGVhZGVyLAorICAgICAgICBkYXRhOiBkYXRhCisgICAgICB9OworCisgICAgICBpZiAoIWhlYWRlci5yYW5kb21BY2Nlc3MpIHsKKyAgICAgICAgc2VnbWVudC5zdGFydCA9IHBvc2l0aW9uOworICAgICAgICBwb3NpdGlvbiArPSBzZWdtZW50SGVhZGVyLmxlbmd0aDsKKyAgICAgICAgc2VnbWVudC5lbmQgPSBwb3NpdGlvbjsKKyAgICAgIH0KKworICAgICAgc2VnbWVudHMucHVzaChzZWdtZW50KTsKKworICAgICAgaWYgKHNlZ21lbnRIZWFkZXIudHlwZSA9PT0gNTEpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhlYWRlci5yYW5kb21BY2Nlc3MpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgc2VnbWVudHNbaV0uc3RhcnQgPSBwb3NpdGlvbjsKKyAgICAgICAgcG9zaXRpb24gKz0gc2VnbWVudHNbaV0uaGVhZGVyLmxlbmd0aDsKKyAgICAgICAgc2VnbWVudHNbaV0uZW5kID0gcG9zaXRpb247CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNlZ21lbnRzOworICB9CisKKyAgZnVuY3Rpb24gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBzdGFydCkgeworICAgIHJldHVybiB7CisgICAgICB3aWR0aDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0KSwKKyAgICAgIGhlaWdodDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgNCksCisgICAgICB4OiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyA4KSwKKyAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDEyKSwKKyAgICAgIGNvbWJpbmF0aW9uT3BlcmF0b3I6IGRhdGFbc3RhcnQgKyAxNl0gJiA3CisgICAgfTsKKyAgfQorCisgIHZhciBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3OworCisgIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHNlZ21lbnQsIHZpc2l0b3IpIHsKKyAgICB2YXIgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7CisgICAgdmFyIGRhdGEgPSBzZWdtZW50LmRhdGEsCisgICAgICAgIHBvc2l0aW9uID0gc2VnbWVudC5zdGFydCwKKyAgICAgICAgZW5kID0gc2VnbWVudC5lbmQ7CisgICAgdmFyIGFyZ3MsIGF0LCBpLCBhdExlbmd0aDsKKworICAgIHN3aXRjaCAoaGVhZGVyLnR5cGUpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdmFyIGRpY3Rpb25hcnkgPSB7fTsKKyAgICAgICAgdmFyIGRpY3Rpb25hcnlGbGFncyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpOworICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTsKKyAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiAyICYgMzsKKyAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA0ICYgMzsKKyAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNiAmIDE7CisgICAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA3ICYgMTsKKyAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDI1Nik7CisgICAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkID0gISEoZGljdGlvbmFyeUZsYWdzICYgNTEyKTsKKyAgICAgICAgZGljdGlvbmFyeS50ZW1wbGF0ZSA9IGRpY3Rpb25hcnlGbGFncyA+PiAxMCAmIDM7CisgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlID0gZGljdGlvbmFyeUZsYWdzID4+IDEyICYgMTsKKyAgICAgICAgcG9zaXRpb24gKz0gMjsKKworICAgICAgICBpZiAoIWRpY3Rpb25hcnkuaHVmZm1hbikgeworICAgICAgICAgIGF0TGVuZ3RoID0gZGljdGlvbmFyeS50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBkaWN0aW9uYXJ5LmF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGljdGlvbmFyeS5yZWZpbmVtZW50ICYmICFkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSkgeworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudEF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBhcmdzID0gW2RpY3Rpb25hcnksIGhlYWRlci5udW1iZXIsIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNjoKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgdmFyIHRleHRSZWdpb24gPSB7fTsKKyAgICAgICAgdGV4dFJlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoOworICAgICAgICB2YXIgdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbiA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKKyAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50ID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDIpOworICAgICAgICB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMiAmIDM7CisgICAgICAgIHRleHRSZWdpb24uc3RyaXBTaXplID0gMSA8PCB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZTsKKyAgICAgICAgdGV4dFJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDQgJiAzOworICAgICAgICB0ZXh0UmVnaW9uLnRyYW5zcG9zZWQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgNjQpOworICAgICAgICB0ZXh0UmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDcgJiAzOworICAgICAgICB0ZXh0UmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA5ICYgMTsKKyAgICAgICAgdGV4dFJlZ2lvbi5kc09mZnNldCA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPDwgMTcgPj4gMjc7CisgICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiAxNSAmIDE7CisKKyAgICAgICAgaWYgKHRleHRSZWdpb24uaHVmZm1hbikgeworICAgICAgICAgIHZhciB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkZTID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFMgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDIgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRUID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA0ICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFcgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDYgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRESCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gOCAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERYID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMCAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERZID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMiAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudFNpemVTZWxlY3RvciA9ICEhKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAweDQwMDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCAmJiAhdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUpIHsKKyAgICAgICAgICBhdCA9IFtdOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRBdCA9IGF0OworICAgICAgICB9CisKKyAgICAgICAgdGV4dFJlZ2lvbi5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGFyZ3MgPSBbdGV4dFJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxNjoKKyAgICAgICAgdmFyIHBhdHRlcm5EaWN0aW9uYXJ5ID0ge307CisgICAgICAgIHZhciBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubW1yID0gISEocGF0dGVybkRpY3Rpb25hcnlGbGFncyAmIDEpOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS50ZW1wbGF0ZSA9IHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgPj4gMSAmIDM7CisgICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5LnBhdHRlcm5XaWR0aCA9IGRhdGFbcG9zaXRpb24rK107CisgICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5LnBhdHRlcm5IZWlnaHQgPSBkYXRhW3Bvc2l0aW9uKytdOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBhcmdzID0gW3BhdHRlcm5EaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjI6CisgICAgICBjYXNlIDIzOgorICAgICAgICB2YXIgaGFsZnRvbmVSZWdpb24gPSB7fTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKKyAgICAgICAgdmFyIGhhbGZ0b25lUmVnaW9uRmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5tbXIgPSAhIShoYWxmdG9uZVJlZ2lvbkZsYWdzICYgMSk7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLnRlbXBsYXRlID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiAxICYgMzsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZW5hYmxlU2tpcCA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiA4KTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uY29tYmluYXRpb25PcGVyYXRvciA9IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gNCAmIDc7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiA3ICYgMTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFdpZHRoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZEhlaWdodCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRPZmZzZXRYID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRPZmZzZXRZID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JYID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFZlY3RvclkgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICBhcmdzID0gW2hhbGZ0b25lUmVnaW9uLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM4OgorICAgICAgY2FzZSAzOToKKyAgICAgICAgdmFyIGdlbmVyaWNSZWdpb24gPSB7fTsKKyAgICAgICAgZ2VuZXJpY1JlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoOworICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgICAgIGdlbmVyaWNSZWdpb24ubW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpOworICAgICAgICBnZW5lcmljUmVnaW9uLnRlbXBsYXRlID0gZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA+PiAxICYgMzsKKyAgICAgICAgZ2VuZXJpY1JlZ2lvbi5wcmVkaWN0aW9uID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDgpOworCisgICAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbi5tbXIpIHsKKyAgICAgICAgICBhdExlbmd0aCA9IGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPT09IDAgPyA0IDogMTsKKyAgICAgICAgICBhdCA9IFtdOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0TGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGF0LnB1c2goeworICAgICAgICAgICAgICB4OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uKSwKKyAgICAgICAgICAgICAgeTogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiArIDEpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ2VuZXJpY1JlZ2lvbi5hdCA9IGF0OworICAgICAgICB9CisKKyAgICAgICAgYXJncyA9IFtnZW5lcmljUmVnaW9uLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDg6CisgICAgICAgIHZhciBwYWdlSW5mbyA9IHsKKyAgICAgICAgICB3aWR0aDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSwKKyAgICAgICAgICBoZWlnaHQ6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpLAorICAgICAgICAgIHJlc29sdXRpb25YOiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA4KSwKKyAgICAgICAgICByZXNvbHV0aW9uWTogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMTIpCisgICAgICAgIH07CisKKyAgICAgICAgaWYgKHBhZ2VJbmZvLmhlaWdodCA9PT0gMHhmZmZmZmZmZikgeworICAgICAgICAgIGRlbGV0ZSBwYWdlSW5mby5oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGFnZVNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyAxNl07CisgICAgICAgICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbiArIDE3KTsKKyAgICAgICAgcGFnZUluZm8ubG9zc2xlc3MgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMSk7CisgICAgICAgIHBhZ2VJbmZvLnJlZmluZW1lbnQgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMik7CisgICAgICAgIHBhZ2VJbmZvLmRlZmF1bHRQaXhlbFZhbHVlID0gcGFnZVNlZ21lbnRGbGFncyA+PiAyICYgMTsKKyAgICAgICAgcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvciA9IHBhZ2VTZWdtZW50RmxhZ3MgPj4gMyAmIDM7CisgICAgICAgIHBhZ2VJbmZvLnJlcXVpcmVzQnVmZmVyID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDMyKTsKKyAgICAgICAgcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDY0KTsKKyAgICAgICAgYXJncyA9IFtwYWdlSW5mb107CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQ5OgorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA1MDoKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNTE6CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDUzOgorICAgICAgICBhcmdzID0gW2hlYWRlci5udW1iZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA2MjoKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzZWdtZW50IHR5cGUgIi5jb25jYXQoaGVhZGVyLnR5cGVOYW1lLCAiKCIpLmNvbmNhdChoZWFkZXIudHlwZSwgIikiKSArICIgaXMgbm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgdmFyIGNhbGxiYWNrTmFtZSA9ICJvbiIgKyBoZWFkZXIudHlwZU5hbWU7CisKKyAgICBpZiAoY2FsbGJhY2tOYW1lIGluIHZpc2l0b3IpIHsKKyAgICAgIHZpc2l0b3JbY2FsbGJhY2tOYW1lXS5hcHBseSh2aXNpdG9yLCBhcmdzKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBwcm9jZXNzU2VnbWVudChzZWdtZW50c1tpXSwgdmlzaXRvcik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpIHsKKyAgICB2YXIgdmlzaXRvciA9IG5ldyBTaW1wbGVTZWdtZW50VmlzaXRvcigpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjaHVuayA9IGNodW5rc1tpXTsKKyAgICAgIHZhciBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyh7fSwgY2h1bmsuZGF0YSwgY2h1bmsuc3RhcnQsIGNodW5rLmVuZCk7CisgICAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpOworICAgIH0KKworICAgIHJldHVybiB2aXNpdG9yLmJ1ZmZlcjsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlSmJpZzIoZGF0YSkgeworICAgIHZhciBlbmQgPSBkYXRhLmxlbmd0aDsKKyAgICB2YXIgcG9zaXRpb24gPSAwOworCisgICAgaWYgKGRhdGFbcG9zaXRpb25dICE9PSAweDk3IHx8IGRhdGFbcG9zaXRpb24gKyAxXSAhPT0gMHg0YSB8fCBkYXRhW3Bvc2l0aW9uICsgMl0gIT09IDB4NDIgfHwgZGF0YVtwb3NpdGlvbiArIDNdICE9PSAweDMyIHx8IGRhdGFbcG9zaXRpb24gKyA0XSAhPT0gMHgwZCB8fCBkYXRhW3Bvc2l0aW9uICsgNV0gIT09IDB4MGEgfHwgZGF0YVtwb3NpdGlvbiArIDZdICE9PSAweDFhIHx8IGRhdGFbcG9zaXRpb24gKyA3XSAhPT0gMHgwYSkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInBhcnNlSmJpZzIgLSBpbnZhbGlkIGhlYWRlci4iKTsKKyAgICB9CisKKyAgICB2YXIgaGVhZGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICBwb3NpdGlvbiArPSA4OworICAgIHZhciBmbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgaGVhZGVyLnJhbmRvbUFjY2VzcyA9ICEoZmxhZ3MgJiAxKTsKKworICAgIGlmICghKGZsYWdzICYgMikpIHsKKyAgICAgIGhlYWRlci5udW1iZXJPZlBhZ2VzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgfQorCisgICAgdmFyIHNlZ21lbnRzID0gcmVhZFNlZ21lbnRzKGhlYWRlciwgZGF0YSwgcG9zaXRpb24sIGVuZCk7CisgICAgdmFyIHZpc2l0b3IgPSBuZXcgU2ltcGxlU2VnbWVudFZpc2l0b3IoKTsKKyAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpOworICAgIHZhciBfdmlzaXRvciRjdXJyZW50UGFnZUkgPSB2aXNpdG9yLmN1cnJlbnRQYWdlSW5mbywKKyAgICAgICAgd2lkdGggPSBfdmlzaXRvciRjdXJyZW50UGFnZUkud2lkdGgsCisgICAgICAgIGhlaWdodCA9IF92aXNpdG9yJGN1cnJlbnRQYWdlSS5oZWlnaHQ7CisgICAgdmFyIGJpdFBhY2tlZCA9IHZpc2l0b3IuYnVmZmVyOworICAgIHZhciBpbWdEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTsKKyAgICB2YXIgcSA9IDAsCisgICAgICAgIGsgPSAwOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgdmFyIG1hc2sgPSAwLAorICAgICAgICAgIGJ1ZmZlciA9IHZvaWQgMDsKKworICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGlmICghbWFzaykgeworICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgYnVmZmVyID0gYml0UGFja2VkW2srK107CisgICAgICAgIH0KKworICAgICAgICBpbWdEYXRhW3ErK10gPSBidWZmZXIgJiBtYXNrID8gMCA6IDI1NTsKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgaW1nRGF0YTogaW1nRGF0YSwKKyAgICAgIHdpZHRoOiB3aWR0aCwKKyAgICAgIGhlaWdodDogaGVpZ2h0CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yKCkge30KKworICBTaW1wbGVTZWdtZW50VmlzaXRvci5wcm90b3R5cGUgPSB7CisgICAgb25QYWdlSW5mb3JtYXRpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uUGFnZUluZm9ybWF0aW9uKGluZm8pIHsKKyAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbzsKKyAgICAgIHZhciByb3dTaXplID0gaW5mby53aWR0aCArIDcgPj4gMzsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSAqIGluZm8uaGVpZ2h0KTsKKworICAgICAgaWYgKGluZm8uZGVmYXVsdFBpeGVsVmFsdWUpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBidWZmZXJbaV0gPSAweGZmOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOworICAgIH0sCisgICAgZHJhd0JpdG1hcDogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3JfZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApIHsKKyAgICAgIHZhciBwYWdlSW5mbyA9IHRoaXMuY3VycmVudFBhZ2VJbmZvOworICAgICAgdmFyIHdpZHRoID0gcmVnaW9uSW5mby53aWR0aCwKKyAgICAgICAgICBoZWlnaHQgPSByZWdpb25JbmZvLmhlaWdodDsKKyAgICAgIHZhciByb3dTaXplID0gcGFnZUluZm8ud2lkdGggKyA3ID4+IDM7CisgICAgICB2YXIgY29tYmluYXRpb25PcGVyYXRvciA9IHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA/IHJlZ2lvbkluZm8uY29tYmluYXRpb25PcGVyYXRvciA6IHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3I7CisgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CisgICAgICB2YXIgbWFzazAgPSAxMjggPj4gKHJlZ2lvbkluZm8ueCAmIDcpOworICAgICAgdmFyIG9mZnNldDAgPSByZWdpb25JbmZvLnkgKiByb3dTaXplICsgKHJlZ2lvbkluZm8ueCA+PiAzKTsKKyAgICAgIHZhciBpLCBqLCBtYXNrLCBvZmZzZXQ7CisKKyAgICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBtYXNrID0gbWFzazA7CisgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQwOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gfD0gbWFzazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG1hc2sgPj49IDE7CisKKyAgICAgICAgICAgICAgaWYgKCFtYXNrKSB7CisgICAgICAgICAgICAgICAgbWFzayA9IDEyODsKKyAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgbWFzayA9IG1hc2swOworICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJpdG1hcFtpXVtqXSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXRdIF49IG1hc2s7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBtYXNrID4+PSAxOworCisgICAgICAgICAgICAgIGlmICghbWFzaykgeworICAgICAgICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0MCArPSByb3dTaXplOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm9wZXJhdG9yICIuY29uY2F0KGNvbWJpbmF0aW9uT3BlcmF0b3IsICIgaXMgbm90IHN1cHBvcnRlZCIpKTsKKyAgICAgIH0KKyAgICB9LAorICAgIG9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uKHJlZ2lvbiwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKKyAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgdmFyIGJpdG1hcCA9IGRlY29kZUJpdG1hcChyZWdpb24ubW1yLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLnRlbXBsYXRlLCByZWdpb24ucHJlZGljdGlvbiwgbnVsbCwgcmVnaW9uLmF0LCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CisgICAgfSwKKyAgICBvbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24oKSB7CisgICAgICB0aGlzLm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisgICAgb25TeW1ib2xEaWN0aW9uYXJ5OiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vblN5bWJvbERpY3Rpb25hcnkoZGljdGlvbmFyeSwgY3VycmVudFNlZ21lbnQsIHJlZmVycmVkU2VnbWVudHMsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIHZhciBodWZmbWFuVGFibGVzLCBodWZmbWFuSW5wdXQ7CisKKyAgICAgIGlmIChkaWN0aW9uYXJ5Lmh1ZmZtYW4pIHsKKyAgICAgICAgaHVmZm1hblRhYmxlcyA9IGdldFN5bWJvbERpY3Rpb25hcnlIdWZmbWFuVGFibGVzKGRpY3Rpb25hcnksIHJlZmVycmVkU2VnbWVudHMsIHRoaXMuY3VzdG9tVGFibGVzKTsKKyAgICAgICAgaHVmZm1hbklucHV0ID0gbmV3IFJlYWRlcihkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIH0KKworICAgICAgdmFyIHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7CisKKyAgICAgIGlmICghc3ltYm9scykgeworICAgICAgICB0aGlzLnN5bWJvbHMgPSBzeW1ib2xzID0ge307CisgICAgICB9CisKKyAgICAgIHZhciBpbnB1dFN5bWJvbHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVmZXJyZWRTZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHZhciByZWZlcnJlZFN5bWJvbHMgPSBzeW1ib2xzW3JlZmVycmVkU2VnbWVudHNbaV1dOworCisgICAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHsKKyAgICAgICAgICBpbnB1dFN5bWJvbHMgPSBpbnB1dFN5bWJvbHMuY29uY2F0KHJlZmVycmVkU3ltYm9scyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoZGljdGlvbmFyeS5odWZmbWFuLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnQsIGlucHV0U3ltYm9scywgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRpY3Rpb25hcnkuYXQsIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBodWZmbWFuSW5wdXQpOworICAgIH0sCisgICAgb25JbW1lZGlhdGVUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZVRleHRSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvOworICAgICAgdmFyIGh1ZmZtYW5UYWJsZXMsIGh1ZmZtYW5JbnB1dDsKKyAgICAgIHZhciBzeW1ib2xzID0gdGhpcy5zeW1ib2xzOworICAgICAgdmFyIGlucHV0U3ltYm9scyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50c1tpXV07CisKKyAgICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykgeworICAgICAgICAgIGlucHV0U3ltYm9scyA9IGlucHV0U3ltYm9scy5jb25jYXQocmVmZXJyZWRTeW1ib2xzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgc3ltYm9sQ29kZUxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5sb2cyKShpbnB1dFN5bWJvbHMubGVuZ3RoKTsKKworICAgICAgaWYgKHJlZ2lvbi5odWZmbWFuKSB7CisgICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIHRoaXMuY3VzdG9tVGFibGVzLCBpbnB1dFN5bWJvbHMubGVuZ3RoLCBodWZmbWFuSW5wdXQpOworICAgICAgfQorCisgICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKHJlZ2lvbi5odWZmbWFuLCByZWdpb24ucmVmaW5lbWVudCwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCByZWdpb24uc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHJlZ2lvbi50cmFuc3Bvc2VkLCByZWdpb24uZHNPZmZzZXQsIHJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCBodWZmbWFuVGFibGVzLCByZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlLCByZWdpb24ucmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIHJlZ2lvbi5sb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCk7CisgICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpIHsKKyAgICAgIHRoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKyAgICBvblBhdHRlcm5EaWN0aW9uYXJ5OiBmdW5jdGlvbiBvblBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zOworCisgICAgICBpZiAoIXBhdHRlcm5zKSB7CisgICAgICAgIHRoaXMucGF0dGVybnMgPSBwYXR0ZXJucyA9IHt9OworICAgICAgfQorCisgICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIHBhdHRlcm5zW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnkubW1yLCBkaWN0aW9uYXJ5LnBhdHRlcm5XaWR0aCwgZGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0LCBkaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCwgZGljdGlvbmFyeS50ZW1wbGF0ZSwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb246IGZ1bmN0aW9uIG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zW3JlZmVycmVkU2VnbWVudHNbMF1dOworICAgICAgdmFyIHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKKyAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgdmFyIGJpdG1hcCA9IGRlY29kZUhhbGZ0b25lUmVnaW9uKHJlZ2lvbi5tbXIsIHBhdHRlcm5zLCByZWdpb24udGVtcGxhdGUsIHJlZ2lvbkluZm8ud2lkdGgsIHJlZ2lvbkluZm8uaGVpZ2h0LCByZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUsIHJlZ2lvbi5lbmFibGVTa2lwLCByZWdpb24uY29tYmluYXRpb25PcGVyYXRvciwgcmVnaW9uLmdyaWRXaWR0aCwgcmVnaW9uLmdyaWRIZWlnaHQsIHJlZ2lvbi5ncmlkT2Zmc2V0WCwgcmVnaW9uLmdyaWRPZmZzZXRZLCByZWdpb24uZ3JpZFZlY3RvclgsIHJlZ2lvbi5ncmlkVmVjdG9yWSwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApOworICAgIH0sCisgICAgb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uOiBmdW5jdGlvbiBvbkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24oKSB7CisgICAgICB0aGlzLm9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9LAorICAgIG9uVGFibGVzOiBmdW5jdGlvbiBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzOworCisgICAgICBpZiAoIWN1c3RvbVRhYmxlcykgeworICAgICAgICB0aGlzLmN1c3RvbVRhYmxlcyA9IGN1c3RvbVRhYmxlcyA9IHt9OworICAgICAgfQorCisgICAgICBjdXN0b21UYWJsZXNbY3VycmVudFNlZ21lbnRdID0gZGVjb2RlVGFibGVzU2VnbWVudChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gSHVmZm1hbkxpbmUobGluZURhdGEpIHsKKyAgICBpZiAobGluZURhdGEubGVuZ3RoID09PSAyKSB7CisgICAgICB0aGlzLmlzT09CID0gdHJ1ZTsKKyAgICAgIHRoaXMucmFuZ2VMb3cgPSAwOworICAgICAgdGhpcy5wcmVmaXhMZW5ndGggPSBsaW5lRGF0YVswXTsKKyAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSAwOworICAgICAgdGhpcy5wcmVmaXhDb2RlID0gbGluZURhdGFbMV07CisgICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmlzT09CID0gZmFsc2U7CisgICAgICB0aGlzLnJhbmdlTG93ID0gbGluZURhdGFbMF07CisgICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzFdOworICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmVEYXRhWzJdOworICAgICAgdGhpcy5wcmVmaXhDb2RlID0gbGluZURhdGFbM107CisgICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmVEYXRhWzRdID09PSAibG93ZXIiOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIEh1ZmZtYW5UcmVlTm9kZShsaW5lKSB7CisgICAgdGhpcy5jaGlsZHJlbiA9IFtdOworCisgICAgaWYgKGxpbmUpIHsKKyAgICAgIHRoaXMuaXNMZWFmID0gdHJ1ZTsKKyAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSBsaW5lLnJhbmdlTGVuZ3RoOworICAgICAgdGhpcy5yYW5nZUxvdyA9IGxpbmUucmFuZ2VMb3c7CisgICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmUuaXNMb3dlclJhbmdlOworICAgICAgdGhpcy5pc09PQiA9IGxpbmUuaXNPT0I7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuaXNMZWFmID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgSHVmZm1hblRyZWVOb2RlLnByb3RvdHlwZSA9IHsKKyAgICBidWlsZFRyZWU6IGZ1bmN0aW9uIGJ1aWxkVHJlZShsaW5lLCBzaGlmdCkgeworICAgICAgdmFyIGJpdCA9IGxpbmUucHJlZml4Q29kZSA+PiBzaGlmdCAmIDE7CisKKyAgICAgIGlmIChzaGlmdCA8PSAwKSB7CisgICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobGluZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY2hpbGRyZW5bYml0XTsKKworICAgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBub2RlID0gbmV3IEh1ZmZtYW5UcmVlTm9kZShudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUuYnVpbGRUcmVlKGxpbmUsIHNoaWZ0IC0gMSk7CisgICAgICB9CisgICAgfSwKKyAgICBkZWNvZGVOb2RlOiBmdW5jdGlvbiBkZWNvZGVOb2RlKHJlYWRlcikgeworICAgICAgaWYgKHRoaXMuaXNMZWFmKSB7CisgICAgICAgIGlmICh0aGlzLmlzT09CKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YXIgaHRPZmZzZXQgPSByZWFkZXIucmVhZEJpdHModGhpcy5yYW5nZUxlbmd0aCk7CisgICAgICAgIHJldHVybiB0aGlzLnJhbmdlTG93ICsgKHRoaXMuaXNMb3dlclJhbmdlID8gLWh0T2Zmc2V0IDogaHRPZmZzZXQpOworICAgICAgfQorCisgICAgICB2YXIgbm9kZSA9IHRoaXMuY2hpbGRyZW5bcmVhZGVyLnJlYWRCaXQoKV07CisKKyAgICAgIGlmICghbm9kZSkgeworICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5vZGUuZGVjb2RlTm9kZShyZWFkZXIpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBIdWZmbWFuVGFibGUobGluZXMsIHByZWZpeENvZGVzRG9uZSkgeworICAgIGlmICghcHJlZml4Q29kZXNEb25lKSB7CisgICAgICB0aGlzLmFzc2lnblByZWZpeENvZGVzKGxpbmVzKTsKKyAgICB9CisKKyAgICB0aGlzLnJvb3ROb2RlID0gbmV3IEh1ZmZtYW5UcmVlTm9kZShudWxsKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGxpbmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBsaW5lID0gbGluZXNbaV07CisKKyAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5yb290Tm9kZS5idWlsZFRyZWUobGluZSwgbGluZS5wcmVmaXhMZW5ndGggLSAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBIdWZmbWFuVGFibGUucHJvdG90eXBlID0geworICAgIGRlY29kZTogZnVuY3Rpb24gZGVjb2RlKHJlYWRlcikgeworICAgICAgcmV0dXJuIHRoaXMucm9vdE5vZGUuZGVjb2RlTm9kZShyZWFkZXIpOworICAgIH0sCisgICAgYXNzaWduUHJlZml4Q29kZXM6IGZ1bmN0aW9uIGFzc2lnblByZWZpeENvZGVzKGxpbmVzKSB7CisgICAgICB2YXIgbGluZXNMZW5ndGggPSBsaW5lcy5sZW5ndGg7CisgICAgICB2YXIgcHJlZml4TGVuZ3RoTWF4ID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7CisgICAgICAgIHByZWZpeExlbmd0aE1heCA9IE1hdGgubWF4KHByZWZpeExlbmd0aE1heCwgbGluZXNbaV0ucHJlZml4TGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgdmFyIGhpc3RvZ3JhbSA9IG5ldyBVaW50MzJBcnJheShwcmVmaXhMZW5ndGhNYXggKyAxKTsKKworICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbGluZXNMZW5ndGg7IF9pMisrKSB7CisgICAgICAgIGhpc3RvZ3JhbVtsaW5lc1tfaTJdLnByZWZpeExlbmd0aF0rKzsKKyAgICAgIH0KKworICAgICAgdmFyIGN1cnJlbnRMZW5ndGggPSAxLAorICAgICAgICAgIGZpcnN0Q29kZSA9IDAsCisgICAgICAgICAgY3VycmVudENvZGUsCisgICAgICAgICAgY3VycmVudFRlbXAsCisgICAgICAgICAgbGluZTsKKyAgICAgIGhpc3RvZ3JhbVswXSA9IDA7CisKKyAgICAgIHdoaWxlIChjdXJyZW50TGVuZ3RoIDw9IHByZWZpeExlbmd0aE1heCkgeworICAgICAgICBmaXJzdENvZGUgPSBmaXJzdENvZGUgKyBoaXN0b2dyYW1bY3VycmVudExlbmd0aCAtIDFdIDw8IDE7CisgICAgICAgIGN1cnJlbnRDb2RlID0gZmlyc3RDb2RlOworICAgICAgICBjdXJyZW50VGVtcCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRUZW1wIDwgbGluZXNMZW5ndGgpIHsKKyAgICAgICAgICBsaW5lID0gbGluZXNbY3VycmVudFRlbXBdOworCisgICAgICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKSB7CisgICAgICAgICAgICBsaW5lLnByZWZpeENvZGUgPSBjdXJyZW50Q29kZTsKKyAgICAgICAgICAgIGN1cnJlbnRDb2RlKys7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudFRlbXArKzsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRMZW5ndGgrKzsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZGVjb2RlVGFibGVzU2VnbWVudChkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgdmFyIGZsYWdzID0gZGF0YVtzdGFydF07CisgICAgdmFyIGxvd2VzdFZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgMSkgJiAweGZmZmZmZmZmOworICAgIHZhciBoaWdoZXN0VmFsdWUgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyA1KSAmIDB4ZmZmZmZmZmY7CisgICAgdmFyIHJlYWRlciA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQgKyA5LCBlbmQpOworICAgIHZhciBwcmVmaXhTaXplQml0cyA9IChmbGFncyA+PiAxICYgNykgKyAxOworICAgIHZhciByYW5nZVNpemVCaXRzID0gKGZsYWdzID4+IDQgJiA3KSArIDE7CisgICAgdmFyIGxpbmVzID0gW107CisgICAgdmFyIHByZWZpeExlbmd0aCwKKyAgICAgICAgcmFuZ2VMZW5ndGgsCisgICAgICAgIGN1cnJlbnRSYW5nZUxvdyA9IGxvd2VzdFZhbHVlOworCisgICAgZG8geworICAgICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKKyAgICAgIHJhbmdlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHJhbmdlU2l6ZUJpdHMpOworICAgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2N1cnJlbnRSYW5nZUxvdywgcHJlZml4TGVuZ3RoLCByYW5nZUxlbmd0aCwgMF0pKTsKKyAgICAgIGN1cnJlbnRSYW5nZUxvdyArPSAxIDw8IHJhbmdlTGVuZ3RoOworICAgIH0gd2hpbGUgKGN1cnJlbnRSYW5nZUxvdyA8IGhpZ2hlc3RWYWx1ZSk7CisKKyAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOworICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtsb3dlc3RWYWx1ZSAtIDEsIHByZWZpeExlbmd0aCwgMzIsIDAsICJsb3dlciJdKSk7CisgICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKKyAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaGlnaGVzdFZhbHVlLCBwcmVmaXhMZW5ndGgsIDMyLCAwXSkpOworCisgICAgaWYgKGZsYWdzICYgMSkgeworICAgICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKKyAgICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtwcmVmaXhMZW5ndGgsIDBdKSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBIdWZmbWFuVGFibGUobGluZXMsIGZhbHNlKTsKKyAgfQorCisgIHZhciBzdGFuZGFyZFRhYmxlc0NhY2hlID0ge307CisKKyAgZnVuY3Rpb24gZ2V0U3RhbmRhcmRUYWJsZShudW1iZXIpIHsKKyAgICB2YXIgdGFibGUgPSBzdGFuZGFyZFRhYmxlc0NhY2hlW251bWJlcl07CisKKyAgICBpZiAodGFibGUpIHsKKyAgICAgIHJldHVybiB0YWJsZTsKKyAgICB9CisKKyAgICB2YXIgbGluZXM7CisKKyAgICBzd2l0Y2ggKG51bWJlcikgeworICAgICAgY2FzZSAxOgorICAgICAgICBsaW5lcyA9IFtbMCwgMSwgNCwgMHgwXSwgWzE2LCAyLCA4LCAweDJdLCBbMjcyLCAzLCAxNiwgMHg2XSwgWzY1ODA4LCAzLCAzMiwgMHg3XV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI6CisgICAgICAgIGxpbmVzID0gW1swLCAxLCAwLCAweDBdLCBbMSwgMiwgMCwgMHgyXSwgWzIsIDMsIDAsIDB4Nl0sIFszLCA0LCAzLCAweGVdLCBbMTEsIDUsIDYsIDB4MWVdLCBbNzUsIDYsIDMyLCAweDNlXSwgWzYsIDB4M2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgbGluZXMgPSBbWy0yNTYsIDgsIDgsIDB4ZmVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWy0yNTcsIDgsIDMyLCAweGZmLCAibG93ZXIiXSwgWzc1LCA3LCAzMiwgMHg3ZV0sIFs2LCAweDNlXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQ6CisgICAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDAsIDB4Nl0sIFs0LCA0LCAzLCAweGVdLCBbMTIsIDUsIDYsIDB4MWVdLCBbNzYsIDUsIDMyLCAweDFmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDU6CisgICAgICAgIGxpbmVzID0gW1stMjU1LCA3LCA4LCAweDdlXSwgWzEsIDEsIDAsIDB4MF0sIFsyLCAyLCAwLCAweDJdLCBbMywgMywgMCwgMHg2XSwgWzQsIDQsIDMsIDB4ZV0sIFsxMiwgNSwgNiwgMHgxZV0sIFstMjU2LCA3LCAzMiwgMHg3ZiwgImxvd2VyIl0sIFs3NiwgNiwgMzIsIDB4M2VdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgbGluZXMgPSBbWy0yMDQ4LCA1LCAxMCwgMHgxY10sIFstMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDQsIDgsIDB4OV0sIFstMjU2LCA0LCA3LCAweGFdLCBbLTEyOCwgNSwgNiwgMHgxZF0sIFstNjQsIDUsIDUsIDB4MWVdLCBbLTMyLCA0LCA1LCAweGJdLCBbMCwgMiwgNywgMHgwXSwgWzEyOCwgMywgNywgMHgyXSwgWzI1NiwgMywgOCwgMHgzXSwgWzUxMiwgNCwgOSwgMHhjXSwgWzEwMjQsIDQsIDEwLCAweGRdLCBbLTIwNDksIDYsIDMyLCAweDNlLCAibG93ZXIiXSwgWzIwNDgsIDYsIDMyLCAweDNmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDc6CisgICAgICAgIGxpbmVzID0gW1stMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDMsIDgsIDB4MF0sIFstMjU2LCA0LCA3LCAweDldLCBbLTEyOCwgNSwgNiwgMHgxYV0sIFstNjQsIDUsIDUsIDB4MWJdLCBbLTMyLCA0LCA1LCAweGFdLCBbMCwgNCwgNSwgMHhiXSwgWzMyLCA1LCA1LCAweDFjXSwgWzY0LCA1LCA2LCAweDFkXSwgWzEyOCwgNCwgNywgMHhjXSwgWzI1NiwgMywgOCwgMHgxXSwgWzUxMiwgMywgOSwgMHgyXSwgWzEwMjQsIDMsIDEwLCAweDNdLCBbLTEwMjUsIDUsIDMyLCAweDFlLCAibG93ZXIiXSwgWzIwNDgsIDUsIDMyLCAweDFmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDg6CisgICAgICAgIGxpbmVzID0gW1stMTUsIDgsIDMsIDB4ZmNdLCBbLTcsIDksIDEsIDB4MWZjXSwgWy01LCA4LCAxLCAweGZkXSwgWy0zLCA5LCAwLCAweDFmZF0sIFstMiwgNywgMCwgMHg3Y10sIFstMSwgNCwgMCwgMHhhXSwgWzAsIDIsIDEsIDB4MF0sIFsyLCA1LCAwLCAweDFhXSwgWzMsIDYsIDAsIDB4M2FdLCBbNCwgMywgNCwgMHg0XSwgWzIwLCA2LCAxLCAweDNiXSwgWzIyLCA0LCA0LCAweGJdLCBbMzgsIDQsIDUsIDB4Y10sIFs3MCwgNSwgNiwgMHgxYl0sIFsxMzQsIDUsIDcsIDB4MWNdLCBbMjYyLCA2LCA3LCAweDNjXSwgWzM5MCwgNywgOCwgMHg3ZF0sIFs2NDYsIDYsIDEwLCAweDNkXSwgWy0xNiwgOSwgMzIsIDB4MWZlLCAibG93ZXIiXSwgWzE2NzAsIDksIDMyLCAweDFmZl0sIFsyLCAweDFdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgOToKKyAgICAgICAgbGluZXMgPSBbWy0zMSwgOCwgNCwgMHhmY10sIFstMTUsIDksIDIsIDB4MWZjXSwgWy0xMSwgOCwgMiwgMHhmZF0sIFstNywgOSwgMSwgMHgxZmRdLCBbLTUsIDcsIDEsIDB4N2NdLCBbLTMsIDQsIDEsIDB4YV0sIFstMSwgMywgMSwgMHgyXSwgWzEsIDMsIDEsIDB4M10sIFszLCA1LCAxLCAweDFhXSwgWzUsIDYsIDEsIDB4M2FdLCBbNywgMywgNSwgMHg0XSwgWzM5LCA2LCAyLCAweDNiXSwgWzQzLCA0LCA1LCAweGJdLCBbNzUsIDQsIDYsIDB4Y10sIFsxMzksIDUsIDcsIDB4MWJdLCBbMjY3LCA1LCA4LCAweDFjXSwgWzUyMywgNiwgOCwgMHgzY10sIFs3NzksIDcsIDksIDB4N2RdLCBbMTI5MSwgNiwgMTEsIDB4M2RdLCBbLTMyLCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMzMzOSwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MF1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxMDoKKyAgICAgICAgbGluZXMgPSBbWy0yMSwgNywgNCwgMHg3YV0sIFstNSwgOCwgMCwgMHhmY10sIFstNCwgNywgMCwgMHg3Yl0sIFstMywgNSwgMCwgMHgxOF0sIFstMiwgMiwgMiwgMHgwXSwgWzIsIDUsIDAsIDB4MTldLCBbMywgNiwgMCwgMHgzNl0sIFs0LCA3LCAwLCAweDdjXSwgWzUsIDgsIDAsIDB4ZmRdLCBbNiwgMiwgNiwgMHgxXSwgWzcwLCA1LCA1LCAweDFhXSwgWzEwMiwgNiwgNSwgMHgzN10sIFsxMzQsIDYsIDYsIDB4MzhdLCBbMTk4LCA2LCA3LCAweDM5XSwgWzMyNiwgNiwgOCwgMHgzYV0sIFs1ODIsIDYsIDksIDB4M2JdLCBbMTA5NCwgNiwgMTAsIDB4M2NdLCBbMjExOCwgNywgMTEsIDB4N2RdLCBbLTIyLCA4LCAzMiwgMHhmZSwgImxvd2VyIl0sIFs0MTY2LCA4LCAzMiwgMHhmZl0sIFsyLCAweDJdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTE6CisgICAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMSwgMHgyXSwgWzQsIDQsIDAsIDB4Y10sIFs1LCA0LCAxLCAweGRdLCBbNywgNSwgMSwgMHgxY10sIFs5LCA1LCAyLCAweDFkXSwgWzEzLCA2LCAyLCAweDNjXSwgWzE3LCA3LCAyLCAweDdhXSwgWzIxLCA3LCAzLCAweDdiXSwgWzI5LCA3LCA0LCAweDdjXSwgWzQ1LCA3LCA1LCAweDdkXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTI6CisgICAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDEsIDB4Nl0sIFs1LCA1LCAwLCAweDFjXSwgWzYsIDUsIDEsIDB4MWRdLCBbOCwgNiwgMSwgMHgzY10sIFsxMCwgNywgMCwgMHg3YV0sIFsxMSwgNywgMSwgMHg3Yl0sIFsxMywgNywgMiwgMHg3Y10sIFsxNywgNywgMywgMHg3ZF0sIFsyNSwgNywgNCwgMHg3ZV0sIFs0MSwgOCwgNSwgMHhmZV0sIFs3MywgOCwgMzIsIDB4ZmZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTM6CisgICAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMywgMCwgMHg0XSwgWzMsIDQsIDAsIDB4Y10sIFs0LCA1LCAwLCAweDFjXSwgWzUsIDQsIDEsIDB4ZF0sIFs3LCAzLCAzLCAweDVdLCBbMTUsIDYsIDEsIDB4M2FdLCBbMTcsIDYsIDIsIDB4M2JdLCBbMjEsIDYsIDMsIDB4M2NdLCBbMjksIDYsIDQsIDB4M2RdLCBbNDUsIDYsIDUsIDB4M2VdLCBbNzcsIDcsIDYsIDB4N2VdLCBbMTQxLCA3LCAzMiwgMHg3Zl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxNDoKKyAgICAgICAgbGluZXMgPSBbWy0yLCAzLCAwLCAweDRdLCBbLTEsIDMsIDAsIDB4NV0sIFswLCAxLCAwLCAweDBdLCBbMSwgMywgMCwgMHg2XSwgWzIsIDMsIDAsIDB4N11dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxNToKKyAgICAgICAgbGluZXMgPSBbWy0yNCwgNywgNCwgMHg3Y10sIFstOCwgNiwgMiwgMHgzY10sIFstNCwgNSwgMSwgMHgxY10sIFstMiwgNCwgMCwgMHhjXSwgWy0xLCAzLCAwLCAweDRdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4NV0sIFsyLCA0LCAwLCAweGRdLCBbMywgNSwgMSwgMHgxZF0sIFs1LCA2LCAyLCAweDNkXSwgWzksIDcsIDQsIDB4N2RdLCBbLTI1LCA3LCAzMiwgMHg3ZSwgImxvd2VyIl0sIFsyNSwgNywgMzIsIDB4N2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzdGFuZGFyZCB0YWJsZSBCLiIuY29uY2F0KG51bWJlciwgIiBkb2VzIG5vdCBleGlzdCIpKTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBsaW5lc1tpXSA9IG5ldyBIdWZmbWFuTGluZShsaW5lc1tpXSk7CisgICAgfQorCisgICAgdGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGxpbmVzLCB0cnVlKTsKKyAgICBzdGFuZGFyZFRhYmxlc0NhY2hlW251bWJlcl0gPSB0YWJsZTsKKyAgICByZXR1cm4gdGFibGU7CisgIH0KKworICBmdW5jdGlvbiBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgIHRoaXMuZW5kID0gZW5kOworICAgIHRoaXMucG9zaXRpb24gPSBzdGFydDsKKyAgICB0aGlzLnNoaWZ0ID0gLTE7CisgICAgdGhpcy5jdXJyZW50Qnl0ZSA9IDA7CisgIH0KKworICBSZWFkZXIucHJvdG90eXBlID0geworICAgIHJlYWRCaXQ6IGZ1bmN0aW9uIHJlYWRCaXQoKSB7CisgICAgICBpZiAodGhpcy5zaGlmdCA8IDApIHsKKyAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5lbmQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY3VycmVudEJ5dGUgPSB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTsKKyAgICAgICAgdGhpcy5zaGlmdCA9IDc7CisgICAgICB9CisKKyAgICAgIHZhciBiaXQgPSB0aGlzLmN1cnJlbnRCeXRlID4+IHRoaXMuc2hpZnQgJiAxOworICAgICAgdGhpcy5zaGlmdC0tOworICAgICAgcmV0dXJuIGJpdDsKKyAgICB9LAorICAgIHJlYWRCaXRzOiBmdW5jdGlvbiByZWFkQml0cyhudW1CaXRzKSB7CisgICAgICB2YXIgcmVzdWx0ID0gMCwKKyAgICAgICAgICBpOworCisgICAgICBmb3IgKGkgPSBudW1CaXRzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgcmVzdWx0IHw9IHRoaXMucmVhZEJpdCgpIDw8IGk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSwKKyAgICBieXRlQWxpZ246IGZ1bmN0aW9uIGJ5dGVBbGlnbigpIHsKKyAgICAgIHRoaXMuc2hpZnQgPSAtMTsKKyAgICB9LAorICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7CisgICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSB0aGlzLmVuZCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpIHsKKyAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHJlZmVycmVkVG8ubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIHRhYmxlID0gY3VzdG9tVGFibGVzW3JlZmVycmVkVG9baV1dOworCisgICAgICBpZiAodGFibGUpIHsKKyAgICAgICAgaWYgKGluZGV4ID09PSBjdXJyZW50SW5kZXgpIHsKKyAgICAgICAgICByZXR1cm4gdGFibGU7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50SW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpOworICB9CisKKyAgZnVuY3Rpb24gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXModGV4dFJlZ2lvbiwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzLCBudW1iZXJPZlN5bWJvbHMsIHJlYWRlcikgeworICAgIHZhciBjb2RlcyA9IFtdOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gMzQ7IGkrKykgeworICAgICAgdmFyIGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7CisgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKKyAgICB9CisKKyAgICB2YXIgcnVuQ29kZXNUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKKyAgICBjb2Rlcy5sZW5ndGggPSAwOworCisgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbnVtYmVyT2ZTeW1ib2xzOykgeworICAgICAgdmFyIF9jb2RlTGVuZ3RoID0gcnVuQ29kZXNUYWJsZS5kZWNvZGUocmVhZGVyKTsKKworICAgICAgaWYgKF9jb2RlTGVuZ3RoID49IDMyKSB7CisgICAgICAgIHZhciByZXBlYXRlZExlbmd0aCA9IHZvaWQgMCwKKyAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHZvaWQgMCwKKyAgICAgICAgICAgIGogPSB2b2lkIDA7CisKKyAgICAgICAgc3dpdGNoIChfY29kZUxlbmd0aCkgeworICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICBpZiAoX2kzID09PSAwKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJubyBwcmV2aW91cyB2YWx1ZSBpbiBzeW1ib2wgSUQgdGFibGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDIpICsgMzsKKyAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gY29kZXNbX2kzIC0gMV0ucHJlZml4TGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMzsKKyAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cyg3KSArIDExOworICAgICAgICAgICAgcmVwZWF0ZWRMZW5ndGggPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgY29kZSBsZW5ndGggaW4gc3ltYm9sIElEIHRhYmxlIik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZSZXBlYXRzOyBqKyspIHsKKyAgICAgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbX2kzLCByZXBlYXRlZExlbmd0aCwgMCwgMF0pKTsKKyAgICAgICAgICBfaTMrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW19pMywgX2NvZGVMZW5ndGgsIDAsIDBdKSk7CisgICAgICAgIF9pMysrOworICAgICAgfQorICAgIH0KKworICAgIHJlYWRlci5ieXRlQWxpZ24oKTsKKyAgICB2YXIgc3ltYm9sSURUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKKyAgICB2YXIgY3VzdG9tSW5kZXggPSAwLAorICAgICAgICB0YWJsZUZpcnN0UywKKyAgICAgICAgdGFibGVEZWx0YVMsCisgICAgICAgIHRhYmxlRGVsdGFUOworCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5GUykgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgICB0YWJsZUZpcnN0UyA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRlMgKyA2KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVGaXJzdFMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5EUykgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgY2FzZSAyOgorICAgICAgICB0YWJsZURlbHRhUyA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRFMgKyA4KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVEZWx0YVMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5EVCkgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgY2FzZSAyOgorICAgICAgICB0YWJsZURlbHRhVCA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRFQgKyAxMSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgICBjdXN0b21JbmRleCsrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpOworICAgIH0KKworICAgIGlmICh0ZXh0UmVnaW9uLnJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIHN5bWJvbElEVGFibGU6IHN5bWJvbElEVGFibGUsCisgICAgICB0YWJsZUZpcnN0UzogdGFibGVGaXJzdFMsCisgICAgICB0YWJsZURlbHRhUzogdGFibGVEZWx0YVMsCisgICAgICB0YWJsZURlbHRhVDogdGFibGVEZWx0YVQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CisgICAgdmFyIGN1c3RvbUluZGV4ID0gMCwKKyAgICAgICAgdGFibGVEZWx0YUhlaWdodCwKKyAgICAgICAgdGFibGVEZWx0YVdpZHRoOworCisgICAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgKyA0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gREggc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yICsgMik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFcgc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICB2YXIgdGFibGVCaXRtYXBTaXplLCB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczsKKworICAgIGlmIChkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3RvcikgeworICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKKyAgICB9CisKKyAgICBpZiAoZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yKSB7CisgICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMgPSBnZXRTdGFuZGFyZFRhYmxlKDEpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICB0YWJsZURlbHRhSGVpZ2h0OiB0YWJsZURlbHRhSGVpZ2h0LAorICAgICAgdGFibGVEZWx0YVdpZHRoOiB0YWJsZURlbHRhV2lkdGgsCisgICAgICB0YWJsZUJpdG1hcFNpemU6IHRhYmxlQml0bWFwU2l6ZSwKKyAgICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzOiB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcworICAgIH07CisgIH0KKworICBmdW5jdGlvbiByZWFkVW5jb21wcmVzc2VkQml0bWFwKHJlYWRlciwgd2lkdGgsIGhlaWdodCkgeworICAgIHZhciBiaXRtYXAgPSBbXTsKKworICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgIHZhciByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgICBiaXRtYXAucHVzaChyb3cpOworCisgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgcm93W3hdID0gcmVhZGVyLnJlYWRCaXQoKTsKKyAgICAgIH0KKworICAgICAgcmVhZGVyLmJ5dGVBbGlnbigpOworICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGVuZE9mQmxvY2spIHsKKyAgICB2YXIgcGFyYW1zID0geworICAgICAgSzogLTEsCisgICAgICBDb2x1bW5zOiB3aWR0aCwKKyAgICAgIFJvd3M6IGhlaWdodCwKKyAgICAgIEJsYWNrSXMxOiB0cnVlLAorICAgICAgRW5kT2ZCbG9jazogZW5kT2ZCbG9jaworICAgIH07CisgICAgdmFyIGRlY29kZXIgPSBuZXcgX2NjaXR0LkNDSVRURmF4RGVjb2RlcihpbnB1dCwgcGFyYW1zKTsKKyAgICB2YXIgYml0bWFwID0gW107CisgICAgdmFyIGN1cnJlbnRCeXRlLAorICAgICAgICBlb2YgPSBmYWxzZTsKKworICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgIHZhciByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgICBiaXRtYXAucHVzaChyb3cpOworICAgICAgdmFyIHNoaWZ0ID0gLTE7CisKKyAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICBpZiAoc2hpZnQgPCAwKSB7CisgICAgICAgICAgY3VycmVudEJ5dGUgPSBkZWNvZGVyLnJlYWROZXh0Q2hhcigpOworCisgICAgICAgICAgaWYgKGN1cnJlbnRCeXRlID09PSAtMSkgeworICAgICAgICAgICAgY3VycmVudEJ5dGUgPSAwOworICAgICAgICAgICAgZW9mID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzaGlmdCA9IDc7CisgICAgICAgIH0KKworICAgICAgICByb3dbeF0gPSBjdXJyZW50Qnl0ZSA+PiBzaGlmdCAmIDE7CisgICAgICAgIHNoaWZ0LS07CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGVuZE9mQmxvY2sgJiYgIWVvZikgeworICAgICAgdmFyIGxvb2tGb3JFT0ZMaW1pdCA9IDU7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9va0ZvckVPRkxpbWl0OyBpKyspIHsKKyAgICAgICAgaWYgKGRlY29kZXIucmVhZE5leHRDaGFyKCkgPT09IC0xKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gSmJpZzJJbWFnZSgpIHt9CisKKyAgSmJpZzJJbWFnZS5wcm90b3R5cGUgPSB7CisgICAgcGFyc2VDaHVua3M6IGZ1bmN0aW9uIHBhcnNlQ2h1bmtzKGNodW5rcykgeworICAgICAgcmV0dXJuIHBhcnNlSmJpZzJDaHVua3MoY2h1bmtzKTsKKyAgICB9LAorICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkYXRhKSB7CisgICAgICB2YXIgX3BhcnNlSmJpZyA9IHBhcnNlSmJpZzIoZGF0YSksCisgICAgICAgICAgaW1nRGF0YSA9IF9wYXJzZUpiaWcuaW1nRGF0YSwKKyAgICAgICAgICB3aWR0aCA9IF9wYXJzZUpiaWcud2lkdGgsCisgICAgICAgICAgaGVpZ2h0ID0gX3BhcnNlSmJpZy5oZWlnaHQ7CisKKyAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKyAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgcmV0dXJuIGltZ0RhdGE7CisgICAgfQorICB9OworICByZXR1cm4gSmJpZzJJbWFnZTsKK30oKTsKKworZXhwb3J0cy5KYmlnMkltYWdlID0gSmJpZzJJbWFnZTsKKworLyoqKi8gfSksCisvKiAxNzkgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRMb29rdXBUYWJsZUZhY3RvcnkgPSBnZXRMb29rdXBUYWJsZUZhY3Rvcnk7CitleHBvcnRzLmdldEluaGVyaXRhYmxlUHJvcGVydHkgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5OworZXhwb3J0cy50b1JvbWFuTnVtZXJhbHMgPSB0b1JvbWFuTnVtZXJhbHM7CitleHBvcnRzLmxvZzIgPSBsb2cyOworZXhwb3J0cy5yZWFkSW50OCA9IHJlYWRJbnQ4OworZXhwb3J0cy5yZWFkVWludDE2ID0gcmVhZFVpbnQxNjsKK2V4cG9ydHMucmVhZFVpbnQzMiA9IHJlYWRVaW50MzI7CitleHBvcnRzLmlzV2hpdGVTcGFjZSA9IGlzV2hpdGVTcGFjZTsKK2V4cG9ydHMuWFJlZlBhcnNlRXhjZXB0aW9uID0gZXhwb3J0cy5YUmVmRW50cnlFeGNlcHRpb24gPSBleHBvcnRzLk1pc3NpbmdEYXRhRXhjZXB0aW9uID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH0KKworZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH0KKworZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KKworZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9CisKK2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7IH0gcmV0dXJuIHNlbGY7IH0KKworZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CisKK2Z1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH0KKworZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGluaXRpYWxpemVyKSB7CisgIHZhciBsb29rdXA7CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKGluaXRpYWxpemVyKSB7CisgICAgICBsb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgaW5pdGlhbGl6ZXIobG9va3VwKTsKKyAgICAgIGluaXRpYWxpemVyID0gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4gbG9va3VwOworICB9OworfQorCit2YXIgTWlzc2luZ0RhdGFFeGNlcHRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlRXhjZXB0aW9uKSB7CisgIF9pbmhlcml0cyhNaXNzaW5nRGF0YUV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24pOworCisgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWlzc2luZ0RhdGFFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIE1pc3NpbmdEYXRhRXhjZXB0aW9uKGJlZ2luLCBlbmQpIHsKKyAgICB2YXIgX3RoaXM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWlzc2luZ0RhdGFFeGNlcHRpb24pOworCisgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCAiTWlzc2luZyBkYXRhIFsiLmNvbmNhdChiZWdpbiwgIiwgIikuY29uY2F0KGVuZCwgIikiKSk7CisgICAgX3RoaXMuYmVnaW4gPSBiZWdpbjsKKyAgICBfdGhpcy5lbmQgPSBlbmQ7CisgICAgcmV0dXJuIF90aGlzOworICB9CisKKyAgcmV0dXJuIE1pc3NpbmdEYXRhRXhjZXB0aW9uOworfShfdXRpbC5CYXNlRXhjZXB0aW9uKTsKKworZXhwb3J0cy5NaXNzaW5nRGF0YUV4Y2VwdGlvbiA9IE1pc3NpbmdEYXRhRXhjZXB0aW9uOworCit2YXIgWFJlZkVudHJ5RXhjZXB0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjIpIHsKKyAgX2luaGVyaXRzKFhSZWZFbnRyeUV4Y2VwdGlvbiwgX0Jhc2VFeGNlcHRpb24yKTsKKworICB2YXIgX3N1cGVyMiA9IF9jcmVhdGVTdXBlcihYUmVmRW50cnlFeGNlcHRpb24pOworCisgIGZ1bmN0aW9uIFhSZWZFbnRyeUV4Y2VwdGlvbigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWFJlZkVudHJ5RXhjZXB0aW9uKTsKKworICAgIHJldHVybiBfc3VwZXIyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICByZXR1cm4gWFJlZkVudHJ5RXhjZXB0aW9uOworfShfdXRpbC5CYXNlRXhjZXB0aW9uKTsKKworZXhwb3J0cy5YUmVmRW50cnlFeGNlcHRpb24gPSBYUmVmRW50cnlFeGNlcHRpb247CisKK3ZhciBYUmVmUGFyc2VFeGNlcHRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlRXhjZXB0aW9uMykgeworICBfaW5oZXJpdHMoWFJlZlBhcnNlRXhjZXB0aW9uLCBfQmFzZUV4Y2VwdGlvbjMpOworCisgIHZhciBfc3VwZXIzID0gX2NyZWF0ZVN1cGVyKFhSZWZQYXJzZUV4Y2VwdGlvbik7CisKKyAgZnVuY3Rpb24gWFJlZlBhcnNlRXhjZXB0aW9uKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBYUmVmUGFyc2VFeGNlcHRpb24pOworCisgICAgcmV0dXJuIF9zdXBlcjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfQorCisgIHJldHVybiBYUmVmUGFyc2VFeGNlcHRpb247Cit9KF91dGlsLkJhc2VFeGNlcHRpb24pOworCitleHBvcnRzLlhSZWZQYXJzZUV4Y2VwdGlvbiA9IFhSZWZQYXJzZUV4Y2VwdGlvbjsKKworZnVuY3Rpb24gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShfcmVmKSB7CisgIHZhciBkaWN0ID0gX3JlZi5kaWN0LAorICAgICAga2V5ID0gX3JlZi5rZXksCisgICAgICBfcmVmJGdldEFycmF5ID0gX3JlZi5nZXRBcnJheSwKKyAgICAgIGdldEFycmF5ID0gX3JlZiRnZXRBcnJheSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGdldEFycmF5LAorICAgICAgX3JlZiRzdG9wV2hlbkZvdW5kID0gX3JlZi5zdG9wV2hlbkZvdW5kLAorICAgICAgc3RvcFdoZW5Gb3VuZCA9IF9yZWYkc3RvcFdoZW5Gb3VuZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkc3RvcFdoZW5Gb3VuZDsKKyAgdmFyIExPT1BfTElNSVQgPSAxMDA7CisgIHZhciBsb29wQ291bnQgPSAwOworICB2YXIgdmFsdWVzOworCisgIHdoaWxlIChkaWN0KSB7CisgICAgdmFyIHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpOworCisgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGlmIChzdG9wV2hlbkZvdW5kKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCF2YWx1ZXMpIHsKKyAgICAgICAgdmFsdWVzID0gW107CisgICAgICB9CisKKyAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAoKytsb29wQ291bnQgPiBMT09QX0xJTUlUKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoImdldEluaGVyaXRhYmxlUHJvcGVydHk6IG1heGltdW0gbG9vcCBjb3VudCBleGNlZWRlZCBmb3IgXCIiLmNvbmNhdChrZXksICJcIiIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRpY3QgPSBkaWN0LmdldCgiUGFyZW50Iik7CisgIH0KKworICByZXR1cm4gdmFsdWVzOworfQorCit2YXIgUk9NQU5fTlVNQkVSX01BUCA9IFsiIiwgIkMiLCAiQ0MiLCAiQ0NDIiwgIkNEIiwgIkQiLCAiREMiLCAiRENDIiwgIkRDQ0MiLCAiQ00iLCAiIiwgIlgiLCAiWFgiLCAiWFhYIiwgIlhMIiwgIkwiLCAiTFgiLCAiTFhYIiwgIkxYWFgiLCAiWEMiLCAiIiwgIkkiLCAiSUkiLCAiSUlJIiwgIklWIiwgIlYiLCAiVkkiLCAiVklJIiwgIlZJSUkiLCAiSVgiXTsKKworZnVuY3Rpb24gdG9Sb21hbk51bWVyYWxzKG51bWJlcikgeworICB2YXIgbG93ZXJDYXNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKKyAgKDAsIF91dGlsLmFzc2VydCkoTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpICYmIG51bWJlciA+IDAsICJUaGUgbnVtYmVyIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIuIik7CisgIHZhciByb21hbkJ1ZiA9IFtdOworICB2YXIgcG9zOworCisgIHdoaWxlIChudW1iZXIgPj0gMTAwMCkgeworICAgIG51bWJlciAtPSAxMDAwOworICAgIHJvbWFuQnVmLnB1c2goIk0iKTsKKyAgfQorCisgIHBvcyA9IG51bWJlciAvIDEwMCB8IDA7CisgIG51bWJlciAlPSAxMDA7CisgIHJvbWFuQnVmLnB1c2goUk9NQU5fTlVNQkVSX01BUFtwb3NdKTsKKyAgcG9zID0gbnVtYmVyIC8gMTAgfCAwOworICBudW1iZXIgJT0gMTA7CisgIHJvbWFuQnVmLnB1c2goUk9NQU5fTlVNQkVSX01BUFsxMCArIHBvc10pOworICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbMjAgKyBudW1iZXJdKTsKKyAgdmFyIHJvbWFuU3RyID0gcm9tYW5CdWYuam9pbigiIik7CisgIHJldHVybiBsb3dlckNhc2UgPyByb21hblN0ci50b0xvd2VyQ2FzZSgpIDogcm9tYW5TdHI7Cit9CisKK2Z1bmN0aW9uIGxvZzIoeCkgeworICBpZiAoeCA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nMih4KSk7Cit9CisKK2Z1bmN0aW9uIHJlYWRJbnQ4KGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDI0ID4+IDI0OworfQorCitmdW5jdGlvbiByZWFkVWludDE2KGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDggfCBkYXRhW29mZnNldCArIDFdOworfQorCitmdW5jdGlvbiByZWFkVWludDMyKGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gKGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdKSA+Pj4gMDsKK30KKworZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CisgIHJldHVybiBjaCA9PT0gMHgyMCB8fCBjaCA9PT0gMHgwOSB8fCBjaCA9PT0gMHgwZCB8fCBjaCA9PT0gMHgwYTsKK30KKworLyoqKi8gfSksCisvKiAxODAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Bcml0aG1ldGljRGVjb2RlciA9IHZvaWQgMDsKKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBRZVRhYmxlID0gW3sKKyAgcWU6IDB4NTYwMSwKKyAgbm1wczogMSwKKyAgbmxwczogMSwKKyAgc3dpdGNoRmxhZzogMQorfSwgeworICBxZTogMHgzNDAxLAorICBubXBzOiAyLAorICBubHBzOiA2LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE4MDEsCisgIG5tcHM6IDMsCisgIG5scHM6IDksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MGFjMSwKKyAgbm1wczogNCwKKyAgbmxwczogMTIsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDUyMSwKKyAgbm1wczogNSwKKyAgbmxwczogMjksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDIyMSwKKyAgbm1wczogMzgsCisgIG5scHM6IDMzLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDU2MDEsCisgIG5tcHM6IDcsCisgIG5scHM6IDYsCisgIHN3aXRjaEZsYWc6IDEKK30sIHsKKyAgcWU6IDB4NTQwMSwKKyAgbm1wczogOCwKKyAgbmxwczogMTQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NDgwMSwKKyAgbm1wczogOSwKKyAgbmxwczogMTQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MzgwMSwKKyAgbm1wczogMTAsCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDMwMDEsCisgIG5tcHM6IDExLAorICBubHBzOiAxNywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgyNDAxLAorICBubXBzOiAxMiwKKyAgbmxwczogMTgsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MWMwMSwKKyAgbm1wczogMTMsCisgIG5scHM6IDIwLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE2MDEsCisgIG5tcHM6IDI5LAorICBubHBzOiAyMSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg1NjAxLAorICBubXBzOiAxNSwKKyAgbmxwczogMTQsCisgIHN3aXRjaEZsYWc6IDEKK30sIHsKKyAgcWU6IDB4NTQwMSwKKyAgbm1wczogMTYsCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDUxMDEsCisgIG5tcHM6IDE3LAorICBubHBzOiAxNSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg0ODAxLAorICBubXBzOiAxOCwKKyAgbmxwczogMTYsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MzgwMSwKKyAgbm1wczogMTksCisgIG5scHM6IDE3LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDM0MDEsCisgIG5tcHM6IDIwLAorICBubHBzOiAxOCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgzMDAxLAorICBubXBzOiAyMSwKKyAgbmxwczogMTksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MjgwMSwKKyAgbm1wczogMjIsCisgIG5scHM6IDE5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDI0MDEsCisgIG5tcHM6IDIzLAorICBubHBzOiAyMCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgyMjAxLAorICBubXBzOiAyNCwKKyAgbmxwczogMjEsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MWMwMSwKKyAgbm1wczogMjUsCisgIG5scHM6IDIyLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE4MDEsCisgIG5tcHM6IDI2LAorICBubHBzOiAyMywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxNjAxLAorICBubXBzOiAyNywKKyAgbmxwczogMjQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTQwMSwKKyAgbm1wczogMjgsCisgIG5scHM6IDI1LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDEyMDEsCisgIG5tcHM6IDI5LAorICBubHBzOiAyNiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxMTAxLAorICBubXBzOiAzMCwKKyAgbmxwczogMjcsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MGFjMSwKKyAgbm1wczogMzEsCisgIG5scHM6IDI4LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA5YzEsCisgIG5tcHM6IDMyLAorICBubHBzOiAyOSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwOGExLAorICBubXBzOiAzMywKKyAgbmxwczogMzAsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDUyMSwKKyAgbm1wczogMzQsCisgIG5scHM6IDMxLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA0NDEsCisgIG5tcHM6IDM1LAorICBubHBzOiAzMiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMmExLAorICBubXBzOiAzNiwKKyAgbmxwczogMzMsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDIyMSwKKyAgbm1wczogMzcsCisgIG5scHM6IDM0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAxNDEsCisgIG5tcHM6IDM4LAorICBubHBzOiAzNSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMTExLAorICBubXBzOiAzOSwKKyAgbmxwczogMzYsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDA4NSwKKyAgbm1wczogNDAsCisgIG5scHM6IDM3LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwNDksCisgIG5tcHM6IDQxLAorICBubHBzOiAzOCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDI1LAorICBubXBzOiA0MiwKKyAgbmxwczogMzksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAxNSwKKyAgbm1wczogNDMsCisgIG5scHM6IDQwLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwMDksCisgIG5tcHM6IDQ0LAorICBubHBzOiA0MSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDA1LAorICBubXBzOiA0NSwKKyAgbmxwczogNDIsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAwMSwKKyAgbm1wczogNDUsCisgIG5scHM6IDQzLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDU2MDEsCisgIG5tcHM6IDQ2LAorICBubHBzOiA0NiwKKyAgc3dpdGNoRmxhZzogMAorfV07CisKK3ZhciBBcml0aG1ldGljRGVjb2RlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEFyaXRobWV0aWNEZWNvZGVyKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXJpdGhtZXRpY0RlY29kZXIpOworCisgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB0aGlzLmJwID0gc3RhcnQ7CisgICAgdGhpcy5kYXRhRW5kID0gZW5kOworICAgIHRoaXMuY2hpZ2ggPSBkYXRhW3N0YXJ0XTsKKyAgICB0aGlzLmNsb3cgPSAwOworICAgIHRoaXMuYnl0ZUluKCk7CisgICAgdGhpcy5jaGlnaCA9IHRoaXMuY2hpZ2ggPDwgNyAmIDB4ZmZmZiB8IHRoaXMuY2xvdyA+PiA5ICYgMHg3ZjsKKyAgICB0aGlzLmNsb3cgPSB0aGlzLmNsb3cgPDwgNyAmIDB4ZmZmZjsKKyAgICB0aGlzLmN0IC09IDc7CisgICAgdGhpcy5hID0gMHg4MDAwOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEFyaXRobWV0aWNEZWNvZGVyLCBbeworICAgIGtleTogImJ5dGVJbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGJ5dGVJbigpIHsKKyAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhOworICAgICAgdmFyIGJwID0gdGhpcy5icDsKKworICAgICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7CisgICAgICAgIGlmIChkYXRhW2JwICsgMV0gPiAweDhmKSB7CisgICAgICAgICAgdGhpcy5jbG93ICs9IDB4ZmYwMDsKKyAgICAgICAgICB0aGlzLmN0ID0gODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicCsrOworICAgICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5OworICAgICAgICAgIHRoaXMuY3QgPSA3OworICAgICAgICAgIHRoaXMuYnAgPSBicDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnArKzsKKyAgICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDsKKyAgICAgICAgdGhpcy5jdCA9IDg7CisgICAgICAgIHRoaXMuYnAgPSBicDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuY2xvdyA+IDB4ZmZmZikgeworICAgICAgICB0aGlzLmNoaWdoICs9IHRoaXMuY2xvdyA+PiAxNjsKKyAgICAgICAgdGhpcy5jbG93ICY9IDB4ZmZmZjsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZWFkQml0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZEJpdChjb250ZXh0cywgcG9zKSB7CisgICAgICB2YXIgY3hfaW5kZXggPSBjb250ZXh0c1twb3NdID4+IDEsCisgICAgICAgICAgY3hfbXBzID0gY29udGV4dHNbcG9zXSAmIDE7CisgICAgICB2YXIgcWVUYWJsZUljeCA9IFFlVGFibGVbY3hfaW5kZXhdOworICAgICAgdmFyIHFlSWN4ID0gcWVUYWJsZUljeC5xZTsKKyAgICAgIHZhciBkOworICAgICAgdmFyIGEgPSB0aGlzLmEgLSBxZUljeDsKKworICAgICAgaWYgKHRoaXMuY2hpZ2ggPCBxZUljeCkgeworICAgICAgICBpZiAoYSA8IHFlSWN4KSB7CisgICAgICAgICAgYSA9IHFlSWN4OworICAgICAgICAgIGQgPSBjeF9tcHM7CisgICAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5tcHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYSA9IHFlSWN4OworICAgICAgICAgIGQgPSAxIF4gY3hfbXBzOworCisgICAgICAgICAgaWYgKHFlVGFibGVJY3guc3dpdGNoRmxhZyA9PT0gMSkgeworICAgICAgICAgICAgY3hfbXBzID0gZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5jaGlnaCAtPSBxZUljeDsKKworICAgICAgICBpZiAoKGEgJiAweDgwMDApICE9PSAwKSB7CisgICAgICAgICAgdGhpcy5hID0gYTsKKyAgICAgICAgICByZXR1cm4gY3hfbXBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGEgPCBxZUljeCkgeworICAgICAgICAgIGQgPSAxIF4gY3hfbXBzOworCisgICAgICAgICAgaWYgKHFlVGFibGVJY3guc3dpdGNoRmxhZyA9PT0gMSkgeworICAgICAgICAgICAgY3hfbXBzID0gZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkID0gY3hfbXBzOworICAgICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKHRoaXMuY3QgPT09IDApIHsKKyAgICAgICAgICB0aGlzLmJ5dGVJbigpOworICAgICAgICB9CisKKyAgICAgICAgYSA8PD0gMTsKKyAgICAgICAgdGhpcy5jaGlnaCA9IHRoaXMuY2hpZ2ggPDwgMSAmIDB4ZmZmZiB8IHRoaXMuY2xvdyA+PiAxNSAmIDE7CisgICAgICAgIHRoaXMuY2xvdyA9IHRoaXMuY2xvdyA8PCAxICYgMHhmZmZmOworICAgICAgICB0aGlzLmN0LS07CisgICAgICB9IHdoaWxlICgoYSAmIDB4ODAwMCkgPT09IDApOworCisgICAgICB0aGlzLmEgPSBhOworICAgICAgY29udGV4dHNbcG9zXSA9IGN4X2luZGV4IDw8IDEgfCBjeF9tcHM7CisgICAgICByZXR1cm4gZDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQXJpdGhtZXRpY0RlY29kZXI7Cit9KCk7CisKK2V4cG9ydHMuQXJpdGhtZXRpY0RlY29kZXIgPSBBcml0aG1ldGljRGVjb2RlcjsKKworLyoqKi8gfSksCisvKiAxODEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DQ0lUVEZheERlY29kZXIgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBDQ0lUVEZheERlY29kZXIgPSBmdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoKSB7CisgIHZhciBjY2l0dEVPTCA9IC0yOworICB2YXIgY2NpdHRFT0YgPSAtMTsKKyAgdmFyIHR3b0RpbVBhc3MgPSAwOworICB2YXIgdHdvRGltSG9yaXogPSAxOworICB2YXIgdHdvRGltVmVydDAgPSAyOworICB2YXIgdHdvRGltVmVydFIxID0gMzsKKyAgdmFyIHR3b0RpbVZlcnRMMSA9IDQ7CisgIHZhciB0d29EaW1WZXJ0UjIgPSA1OworICB2YXIgdHdvRGltVmVydEwyID0gNjsKKyAgdmFyIHR3b0RpbVZlcnRSMyA9IDc7CisgIHZhciB0d29EaW1WZXJ0TDMgPSA4OworICB2YXIgdHdvRGltVGFibGUgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbNywgdHdvRGltVmVydEwzXSwgWzcsIHR3b0RpbVZlcnRSM10sIFs2LCB0d29EaW1WZXJ0TDJdLCBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRSMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdXTsKKyAgdmFyIHdoaXRlVGFibGUxID0gW1stMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdXTsKKyAgdmFyIHdoaXRlVGFibGUyID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbOCwgMjldLCBbOCwgMjldLCBbOCwgMzBdLCBbOCwgMzBdLCBbOCwgNDVdLCBbOCwgNDVdLCBbOCwgNDZdLCBbOCwgNDZdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjNdLCBbNywgMjNdLCBbNywgMjNdLCBbNywgMjNdLCBbOCwgNDddLCBbOCwgNDddLCBbOCwgNDhdLCBbOCwgNDhdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbOCwgMzNdLCBbOCwgMzNdLCBbOCwgMzRdLCBbOCwgMzRdLCBbOCwgMzVdLCBbOCwgMzVdLCBbOCwgMzZdLCBbOCwgMzZdLCBbOCwgMzddLCBbOCwgMzddLCBbOCwgMzhdLCBbOCwgMzhdLCBbNywgMTldLCBbNywgMTldLCBbNywgMTldLCBbNywgMTldLCBbOCwgMzFdLCBbOCwgMzFdLCBbOCwgMzJdLCBbOCwgMzJdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzgsIDUzXSwgWzgsIDUzXSwgWzgsIDU0XSwgWzgsIDU0XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzgsIDM5XSwgWzgsIDM5XSwgWzgsIDQwXSwgWzgsIDQwXSwgWzgsIDQxXSwgWzgsIDQxXSwgWzgsIDQyXSwgWzgsIDQyXSwgWzgsIDQzXSwgWzgsIDQzXSwgWzgsIDQ0XSwgWzgsIDQ0XSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzgsIDYxXSwgWzgsIDYxXSwgWzgsIDYyXSwgWzgsIDYyXSwgWzgsIDYzXSwgWzgsIDYzXSwgWzgsIDBdLCBbOCwgMF0sIFs4LCAzMjBdLCBbOCwgMzIwXSwgWzgsIDM4NF0sIFs4LCAzODRdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNywgMjddLCBbNywgMjddLCBbNywgMjddLCBbNywgMjddLCBbOCwgNTldLCBbOCwgNTldLCBbOCwgNjBdLCBbOCwgNjBdLCBbOSwgMTQ3Ml0sIFs5LCAxNTM2XSwgWzksIDE2MDBdLCBbOSwgMTcyOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs4LCA0OV0sIFs4LCA0OV0sIFs4LCA1MF0sIFs4LCA1MF0sIFs4LCA1MV0sIFs4LCA1MV0sIFs4LCA1Ml0sIFs4LCA1Ml0sIFs3LCAyNV0sIFs3LCAyNV0sIFs3LCAyNV0sIFs3LCAyNV0sIFs4LCA1NV0sIFs4LCA1NV0sIFs4LCA1Nl0sIFs4LCA1Nl0sIFs4LCA1N10sIFs4LCA1N10sIFs4LCA1OF0sIFs4LCA1OF0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs4LCA0NDhdLCBbOCwgNDQ4XSwgWzgsIDUxMl0sIFs4LCA1MTJdLCBbOSwgNzA0XSwgWzksIDc2OF0sIFs4LCA2NDBdLCBbOCwgNjQwXSwgWzgsIDU3Nl0sIFs4LCA1NzZdLCBbOSwgODMyXSwgWzksIDg5Nl0sIFs5LCA5NjBdLCBbOSwgMTAyNF0sIFs5LCAxMDg4XSwgWzksIDExNTJdLCBbOSwgMTIxNl0sIFs5LCAxMjgwXSwgWzksIDEzNDRdLCBbOSwgMTQwOF0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN11dOworICB2YXIgYmxhY2tUYWJsZTEgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWzEyLCBjY2l0dEVPTF0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdLCBbMTIsIDI1NjBdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMiwgNTJdLCBbMTIsIDUyXSwgWzEzLCA2NDBdLCBbMTMsIDcwNF0sIFsxMywgNzY4XSwgWzEzLCA4MzJdLCBbMTIsIDU1XSwgWzEyLCA1NV0sIFsxMiwgNTZdLCBbMTIsIDU2XSwgWzEzLCAxMjgwXSwgWzEzLCAxMzQ0XSwgWzEzLCAxNDA4XSwgWzEzLCAxNDcyXSwgWzEyLCA1OV0sIFsxMiwgNTldLCBbMTIsIDYwXSwgWzEyLCA2MF0sIFsxMywgMTUzNl0sIFsxMywgMTYwMF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzEzLCAxNjY0XSwgWzEzLCAxNzI4XSwgWzEyLCAzMjBdLCBbMTIsIDMyMF0sIFsxMiwgMzg0XSwgWzEyLCAzODRdLCBbMTIsIDQ0OF0sIFsxMiwgNDQ4XSwgWzEzLCA1MTJdLCBbMTMsIDU3Nl0sIFsxMiwgNTNdLCBbMTIsIDUzXSwgWzEyLCA1NF0sIFsxMiwgNTRdLCBbMTMsIDg5Nl0sIFsxMywgOTYwXSwgWzEzLCAxMDI0XSwgWzEzLCAxMDg4XSwgWzEzLCAxMTUyXSwgWzEzLCAxMjE2XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdXTsKKyAgdmFyIGJsYWNrVGFibGUyID0gW1s4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFsxMSwgMjNdLCBbMTEsIDIzXSwgWzEyLCA1MF0sIFsxMiwgNTFdLCBbMTIsIDQ0XSwgWzEyLCA0NV0sIFsxMiwgNDZdLCBbMTIsIDQ3XSwgWzEyLCA1N10sIFsxMiwgNThdLCBbMTIsIDYxXSwgWzEyLCAyNTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMiwgNDhdLCBbMTIsIDQ5XSwgWzEyLCA2Ml0sIFsxMiwgNjNdLCBbMTIsIDMwXSwgWzEyLCAzMV0sIFsxMiwgMzJdLCBbMTIsIDMzXSwgWzEyLCA0MF0sIFsxMiwgNDFdLCBbMTEsIDIyXSwgWzExLCAyMl0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFsxMiwgMTI4XSwgWzEyLCAxOTJdLCBbMTIsIDI2XSwgWzEyLCAyN10sIFsxMiwgMjhdLCBbMTIsIDI5XSwgWzExLCAxOV0sIFsxMSwgMTldLCBbMTEsIDIwXSwgWzExLCAyMF0sIFsxMiwgMzRdLCBbMTIsIDM1XSwgWzEyLCAzNl0sIFsxMiwgMzddLCBbMTIsIDM4XSwgWzEyLCAzOV0sIFsxMSwgMjFdLCBbMTEsIDIxXSwgWzEyLCA0Ml0sIFsxMiwgNDNdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXTsKKyAgdmFyIGJsYWNrVGFibGUzID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbNiwgOV0sIFs2LCA4XSwgWzUsIDddLCBbNSwgN10sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdXTsKKworICBmdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoc291cmNlKSB7CisgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9OworCisgICAgaWYgKCFzb3VyY2UgfHwgdHlwZW9mIHNvdXJjZS5uZXh0ICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgInNvdXJjZSIgcGFyYW1ldGVyLicpOworICAgIH0KKworICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgIHRoaXMuZW9mID0gZmFsc2U7CisgICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuSyB8fCAwOworICAgIHRoaXMuZW9saW5lID0gb3B0aW9ucy5FbmRPZkxpbmUgfHwgZmFsc2U7CisgICAgdGhpcy5ieXRlQWxpZ24gPSBvcHRpb25zLkVuY29kZWRCeXRlQWxpZ24gfHwgZmFsc2U7CisgICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5Db2x1bW5zIHx8IDE3Mjg7CisgICAgdGhpcy5yb3dzID0gb3B0aW9ucy5Sb3dzIHx8IDA7CisgICAgdmFyIGVvYmxvY2sgPSBvcHRpb25zLkVuZE9mQmxvY2s7CisKKyAgICBpZiAoZW9ibG9jayA9PT0gbnVsbCB8fCBlb2Jsb2NrID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGVvYmxvY2sgPSB0cnVlOworICAgIH0KKworICAgIHRoaXMuZW9ibG9jayA9IGVvYmxvY2s7CisgICAgdGhpcy5ibGFjayA9IG9wdGlvbnMuQmxhY2tJczEgfHwgZmFsc2U7CisgICAgdGhpcy5jb2RpbmdMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDEpOworICAgIHRoaXMucmVmTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAyKTsKKyAgICB0aGlzLmNvZGluZ0xpbmVbMF0gPSB0aGlzLmNvbHVtbnM7CisgICAgdGhpcy5jb2RpbmdQb3MgPSAwOworICAgIHRoaXMucm93ID0gMDsKKyAgICB0aGlzLm5leHRMaW5lMkQgPSB0aGlzLmVuY29kaW5nIDwgMDsKKyAgICB0aGlzLmlucHV0Qml0cyA9IDA7CisgICAgdGhpcy5pbnB1dEJ1ZiA9IDA7CisgICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKKyAgICB0aGlzLnJvd3NEb25lID0gZmFsc2U7CisgICAgdmFyIGNvZGUxOworCisgICAgd2hpbGUgKChjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKSkgPT09IDApIHsKKyAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisgICAgfQorCisgICAgaWYgKGNvZGUxID09PSAxKSB7CisgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgIHRoaXMubmV4dExpbmUyRCA9ICF0aGlzLl9sb29rQml0cygxKTsKKworICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICB9CisgIH0KKworICBDQ0lUVEZheERlY29kZXIucHJvdG90eXBlID0geworICAgIHJlYWROZXh0Q2hhcjogZnVuY3Rpb24gcmVhZE5leHRDaGFyKCkgeworICAgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlZkxpbmUgPSB0aGlzLnJlZkxpbmU7CisgICAgICB2YXIgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKKyAgICAgIHZhciBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOworICAgICAgdmFyIHJlZlBvcywgYmxhY2tQaXhlbHMsIGJpdHMsIGk7CisKKyAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDApIHsKKyAgICAgICAgaWYgKHRoaXMucm93c0RvbmUpIHsKKyAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmVyciA9IGZhbHNlOworICAgICAgICB2YXIgY29kZTEsIGNvZGUyLCBjb2RlMzsKKworICAgICAgICBpZiAodGhpcy5uZXh0TGluZTJEKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgY29kaW5nTGluZVtpXSA8IGNvbHVtbnM7ICsraSkgeworICAgICAgICAgICAgcmVmTGluZVtpXSA9IGNvZGluZ0xpbmVbaV07CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVmTGluZVtpKytdID0gY29sdW1uczsKKyAgICAgICAgICByZWZMaW5lW2ldID0gY29sdW1uczsKKyAgICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKKyAgICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CisgICAgICAgICAgcmVmUG9zID0gMDsKKyAgICAgICAgICBibGFja1BpeGVscyA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2dldFR3b0RpbUNvZGUoKTsKKworICAgICAgICAgICAgc3dpdGNoIChjb2RlMSkgeworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVBhc3M6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zICsgMV0sIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWZMaW5lW3JlZlBvcyArIDFdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1Ib3JpejoKKyAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUyID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgeworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworCisgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CisgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKKyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMiwgYmxhY2tQaXhlbHMgXiAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIzOgorICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAzLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOworCisgICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRSMjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdICsgMiwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjE6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICArK3JlZlBvczsKKworICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydDA6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDM6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDMsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDI6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDIsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDE6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBjY2l0dEVPRjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoImJhZCAyZCBjb2RlIik7CisKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVyciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOworICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKKyAgICAgICAgICBibGFja1BpeGVscyA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICBjb2RlMSA9IDA7CisKKyAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgeworICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CisgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ290RU9MID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHRoaXMuYnl0ZUFsaWduKSB7CisgICAgICAgICAgdGhpcy5pbnB1dEJpdHMgJj0gfjc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuZW9ibG9jayAmJiB0aGlzLnJvdyA9PT0gdGhpcy5yb3dzIC0gMSkgeworICAgICAgICAgIHRoaXMucm93c0RvbmUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOworCisgICAgICAgICAgaWYgKHRoaXMuZW9saW5lKSB7CisgICAgICAgICAgICB3aGlsZSAoY29kZTEgIT09IGNjaXR0RU9GICYmIGNvZGUxICE9PSAxKSB7CisgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdoaWxlIChjb2RlMSA9PT0gMCkgeworICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjb2RlMSA9PT0gMSkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICAgIGdvdEVPTCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuZW9mICYmIHRoaXMuZW5jb2RpbmcgPiAwICYmICF0aGlzLnJvd3NEb25lKSB7CisgICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOworCisgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmVvYmxvY2sgJiYgZ290RU9MICYmIHRoaXMuYnl0ZUFsaWduKSB7CisgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICBpZiAoY29kZTEgPT09IDEpIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworCisgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7CisKKyAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPj0gMCkgeworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHsKKyAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIHJ0YyBjb2RlOiAiICsgY29kZTEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKKworICAgICAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVyciAmJiB0aGlzLmVvbGluZSkgeworICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKKworICAgICAgICAgICAgaWYgKGNvZGUxID09PSBjY2l0dEVPRikgeworICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGUxID4+IDEgPT09IDEpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgIHRoaXMubmV4dExpbmUyRCA9ICEoY29kZTEgJiAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kaW5nTGluZVswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zID0gMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyA9IDFdOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5yb3crKzsKKyAgICAgIH0KKworICAgICAgdmFyIGM7CisKKyAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPj0gOCkgeworICAgICAgICBjID0gdGhpcy5jb2RpbmdQb3MgJiAxID8gMCA6IDB4ZmY7CisgICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSA4OworCisgICAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDAgJiYgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYml0cyA9IDg7CisgICAgICAgIGMgPSAwOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykgeworICAgICAgICAgICAgYyA8PD0gYml0czsKKworICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgeworICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIGJpdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSBiaXRzOworICAgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMgPDw9IHRoaXMub3V0cHV0Qml0czsKKworICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgeworICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIHRoaXMub3V0cHV0Qml0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0cyAtPSB0aGlzLm91dHB1dEJpdHM7CisgICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSAwOworCisgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7CisgICAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdOworICAgICAgICAgICAgfSBlbHNlIGlmIChiaXRzID4gMCkgeworICAgICAgICAgICAgICBjIDw8PSBiaXRzOworICAgICAgICAgICAgICBiaXRzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGJpdHMpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5ibGFjaykgeworICAgICAgICBjIF49IDB4ZmY7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjOworICAgIH0sCisgICAgX2FkZFBpeGVsczogZnVuY3Rpb24gX2FkZFBpeGVscyhhMSwgYmxhY2tQaXhlbHMpIHsKKyAgICAgIHZhciBjb2RpbmdMaW5lID0gdGhpcy5jb2RpbmdMaW5lOworICAgICAgdmFyIGNvZGluZ1BvcyA9IHRoaXMuY29kaW5nUG9zOworCisgICAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKKyAgICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7CisgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOworICAgICAgICAgIGExID0gdGhpcy5jb2x1bW5zOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGluZ1BvcyAmIDEgXiBibGFja1BpeGVscykgeworICAgICAgICAgICsrY29kaW5nUG9zOworICAgICAgICB9CisKKyAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zOworICAgIH0sCisgICAgX2FkZFBpeGVsc05lZzogZnVuY3Rpb24gX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHsKKyAgICAgIHZhciBjb2RpbmdMaW5lID0gdGhpcy5jb2RpbmdMaW5lOworICAgICAgdmFyIGNvZGluZ1BvcyA9IHRoaXMuY29kaW5nUG9zOworCisgICAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKKyAgICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7CisgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOworICAgICAgICAgIGExID0gdGhpcy5jb2x1bW5zOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGluZ1BvcyAmIDEgXiBibGFja1BpeGVscykgeworICAgICAgICAgICsrY29kaW5nUG9zOworICAgICAgICB9CisKKyAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CisgICAgICB9IGVsc2UgaWYgKGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7CisgICAgICAgIGlmIChhMSA8IDApIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoImludmFsaWQgY29kZSIpOworICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKKyAgICAgICAgICBhMSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoY29kaW5nUG9zID4gMCAmJiBhMSA8IGNvZGluZ0xpbmVbY29kaW5nUG9zIC0gMV0pIHsKKyAgICAgICAgICAtLWNvZGluZ1BvczsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOworICAgICAgfQorCisgICAgICB0aGlzLmNvZGluZ1BvcyA9IGNvZGluZ1BvczsKKyAgICB9LAorICAgIF9maW5kVGFibGVDb2RlOiBmdW5jdGlvbiBfZmluZFRhYmxlQ29kZShzdGFydCwgZW5kLCB0YWJsZSwgbGltaXQpIHsKKyAgICAgIHZhciBsaW1pdFZhbHVlID0gbGltaXQgfHwgMDsKKworICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgKytpKSB7CisgICAgICAgIHZhciBjb2RlID0gdGhpcy5fbG9va0JpdHMoaSk7CisKKyAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CisgICAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IGVuZCkgeworICAgICAgICAgIGNvZGUgPDw9IGVuZCAtIGk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpbWl0VmFsdWUgfHwgY29kZSA+PSBsaW1pdFZhbHVlKSB7CisgICAgICAgICAgdmFyIHAgPSB0YWJsZVtjb2RlIC0gbGltaXRWYWx1ZV07CisKKyAgICAgICAgICBpZiAocFswXSA9PT0gaSkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cyhpKTsKKworICAgICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIFtmYWxzZSwgMCwgZmFsc2VdOworICAgIH0sCisgICAgX2dldFR3b0RpbUNvZGU6IGZ1bmN0aW9uIF9nZXRUd29EaW1Db2RlKCkgeworICAgICAgdmFyIGNvZGUgPSAwOworICAgICAgdmFyIHA7CisKKyAgICAgIGlmICh0aGlzLmVvYmxvY2spIHsKKyAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDcpOworICAgICAgICBwID0gdHdvRGltVGFibGVbY29kZV07CisKKyAgICAgICAgaWYgKHAgJiYgcFswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOworCisgICAgICAgICAgcmV0dXJuIHBbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDcsIHR3b0RpbVRhYmxlKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdICYmIHJlc3VsdFsyXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJCYWQgdHdvIGRpbSBjb2RlIik7CisgICAgICByZXR1cm4gY2NpdHRFT0Y7CisgICAgfSwKKyAgICBfZ2V0V2hpdGVDb2RlOiBmdW5jdGlvbiBfZ2V0V2hpdGVDb2RlKCkgeworICAgICAgdmFyIGNvZGUgPSAwOworICAgICAgdmFyIHA7CisKKyAgICAgIGlmICh0aGlzLmVvYmxvY2spIHsKKyAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKKworICAgICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RlID4+IDUgPT09IDApIHsKKyAgICAgICAgICBwID0gd2hpdGVUYWJsZTFbY29kZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcCA9IHdoaXRlVGFibGUyW2NvZGUgPj4gM107CisgICAgICAgIH0KKworICAgICAgICBpZiAocFswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOworCisgICAgICAgICAgcmV0dXJuIHBbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsIDEyLCB3aGl0ZVRhYmxlMSk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJiYWQgd2hpdGUgY29kZSIpOworCisgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICByZXR1cm4gMTsKKyAgICB9LAorICAgIF9nZXRCbGFja0NvZGU6IGZ1bmN0aW9uIF9nZXRCbGFja0NvZGUoKSB7CisgICAgICB2YXIgY29kZSwgcDsKKworICAgICAgaWYgKHRoaXMuZW9ibG9jaykgeworICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoMTMpOworCisgICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkgeworICAgICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7CisgICAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBbMF0gPiAwKSB7CisgICAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKKworICAgICAgICAgIHJldHVybiBwWzFdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgyLCA2LCBibGFja1RhYmxlMyk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDcsIDEyLCBibGFja1RhYmxlMiwgNjQpOworCisgICAgICAgIGlmIChyZXN1bHRbMF0pIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoImJhZCBibGFjayBjb2RlIik7CisKKyAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgIHJldHVybiAxOworICAgIH0sCisgICAgX2xvb2tCaXRzOiBmdW5jdGlvbiBfbG9va0JpdHMobikgeworICAgICAgdmFyIGM7CisKKyAgICAgIHdoaWxlICh0aGlzLmlucHV0Qml0cyA8IG4pIHsKKyAgICAgICAgaWYgKChjID0gdGhpcy5zb3VyY2UubmV4dCgpKSA9PT0gLTEpIHsKKyAgICAgICAgICBpZiAodGhpcy5pbnB1dEJpdHMgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjY2l0dEVPRjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dEJ1ZiA8PCBuIC0gdGhpcy5pbnB1dEJpdHMgJiAweGZmZmYgPj4gMTYgLSBuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pbnB1dEJ1ZiA9IHRoaXMuaW5wdXRCdWYgPDwgOCB8IGM7CisgICAgICAgIHRoaXMuaW5wdXRCaXRzICs9IDg7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmlucHV0QnVmID4+IHRoaXMuaW5wdXRCaXRzIC0gbiAmIDB4ZmZmZiA+PiAxNiAtIG47CisgICAgfSwKKyAgICBfZWF0Qml0czogZnVuY3Rpb24gX2VhdEJpdHMobikgeworICAgICAgaWYgKCh0aGlzLmlucHV0Qml0cyAtPSBuKSA8IDApIHsKKyAgICAgICAgdGhpcy5pbnB1dEJpdHMgPSAwOworICAgICAgfQorICAgIH0KKyAgfTsKKyAgcmV0dXJuIENDSVRURmF4RGVjb2RlcjsKK30oKTsKKworZXhwb3J0cy5DQ0lUVEZheERlY29kZXIgPSBDQ0lUVEZheERlY29kZXI7CisKKy8qKiovIH0pLAorLyogMTgyICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSnBlZ0ltYWdlID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3OSk7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCit2YXIgSnBlZ0Vycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbikgeworICBfaW5oZXJpdHMoSnBlZ0Vycm9yLCBfQmFzZUV4Y2VwdGlvbik7CisKKyAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKcGVnRXJyb3IpOworCisgIGZ1bmN0aW9uIEpwZWdFcnJvcihtc2cpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSnBlZ0Vycm9yKTsKKworICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAiSlBFRyBlcnJvcjogIi5jb25jYXQobXNnKSk7CisgIH0KKworICByZXR1cm4gSnBlZ0Vycm9yOworfShfdXRpbC5CYXNlRXhjZXB0aW9uKTsKKwordmFyIEROTE1hcmtlckVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZUV4Y2VwdGlvbjIpIHsKKyAgX2luaGVyaXRzKEROTE1hcmtlckVycm9yLCBfQmFzZUV4Y2VwdGlvbjIpOworCisgIHZhciBfc3VwZXIyID0gX2NyZWF0ZVN1cGVyKEROTE1hcmtlckVycm9yKTsKKworICBmdW5jdGlvbiBETkxNYXJrZXJFcnJvcihtZXNzYWdlLCBzY2FuTGluZXMpIHsKKyAgICB2YXIgX3RoaXM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRE5MTWFya2VyRXJyb3IpOworCisgICAgX3RoaXMgPSBfc3VwZXIyLmNhbGwodGhpcywgbWVzc2FnZSk7CisgICAgX3RoaXMuc2NhbkxpbmVzID0gc2NhbkxpbmVzOworICAgIHJldHVybiBfdGhpczsKKyAgfQorCisgIHJldHVybiBETkxNYXJrZXJFcnJvcjsKK30oX3V0aWwuQmFzZUV4Y2VwdGlvbik7CisKK3ZhciBFT0lNYXJrZXJFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24zKSB7CisgIF9pbmhlcml0cyhFT0lNYXJrZXJFcnJvciwgX0Jhc2VFeGNlcHRpb24zKTsKKworICB2YXIgX3N1cGVyMyA9IF9jcmVhdGVTdXBlcihFT0lNYXJrZXJFcnJvcik7CisKKyAgZnVuY3Rpb24gRU9JTWFya2VyRXJyb3IoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVPSU1hcmtlckVycm9yKTsKKworICAgIHJldHVybiBfc3VwZXIzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICByZXR1cm4gRU9JTWFya2VyRXJyb3I7Cit9KF91dGlsLkJhc2VFeGNlcHRpb24pOworCit2YXIgSnBlZ0ltYWdlID0gZnVuY3Rpb24gSnBlZ0ltYWdlQ2xvc3VyZSgpIHsKKyAgdmFyIGRjdFppZ1phZyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCA4LCAxNiwgOSwgMiwgMywgMTAsIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsIDQsIDUsIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwgMjcsIDIwLCAxMywgNiwgNywgMTQsIDIxLCAyOCwgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LCAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzXSk7CisgIHZhciBkY3RDb3MxID0gNDAxNzsKKyAgdmFyIGRjdFNpbjEgPSA3OTk7CisgIHZhciBkY3RDb3MzID0gMzQwNjsKKyAgdmFyIGRjdFNpbjMgPSAyMjc2OworICB2YXIgZGN0Q29zNiA9IDE1Njc7CisgIHZhciBkY3RTaW42ID0gMzc4NDsKKyAgdmFyIGRjdFNxcnQyID0gNTc5MzsKKyAgdmFyIGRjdFNxcnQxZDIgPSAyODk2OworCisgIGZ1bmN0aW9uIEpwZWdJbWFnZSgpIHsKKyAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sCisgICAgICAgIF9yZWYkZGVjb2RlVHJhbnNmb3JtID0gX3JlZi5kZWNvZGVUcmFuc2Zvcm0sCisgICAgICAgIGRlY29kZVRyYW5zZm9ybSA9IF9yZWYkZGVjb2RlVHJhbnNmb3JtID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRkZWNvZGVUcmFuc2Zvcm0sCisgICAgICAgIF9yZWYkY29sb3JUcmFuc2Zvcm0gPSBfcmVmLmNvbG9yVHJhbnNmb3JtLAorICAgICAgICBjb2xvclRyYW5zZm9ybSA9IF9yZWYkY29sb3JUcmFuc2Zvcm0gPT09IHZvaWQgMCA/IC0xIDogX3JlZiRjb2xvclRyYW5zZm9ybTsKKworICAgIHRoaXMuX2RlY29kZVRyYW5zZm9ybSA9IGRlY29kZVRyYW5zZm9ybTsKKyAgICB0aGlzLl9jb2xvclRyYW5zZm9ybSA9IGNvbG9yVHJhbnNmb3JtOworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsIHZhbHVlcykgeworICAgIHZhciBrID0gMCwKKyAgICAgICAgY29kZSA9IFtdLAorICAgICAgICBpLAorICAgICAgICBqLAorICAgICAgICBsZW5ndGggPSAxNjsKKworICAgIHdoaWxlIChsZW5ndGggPiAwICYmICFjb2RlTGVuZ3Roc1tsZW5ndGggLSAxXSkgeworICAgICAgbGVuZ3RoLS07CisgICAgfQorCisgICAgY29kZS5wdXNoKHsKKyAgICAgIGNoaWxkcmVuOiBbXSwKKyAgICAgIGluZGV4OiAwCisgICAgfSk7CisgICAgdmFyIHAgPSBjb2RlWzBdLAorICAgICAgICBxOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aHNbaV07IGorKykgeworICAgICAgICBwID0gY29kZS5wb3AoKTsKKyAgICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHZhbHVlc1trXTsKKworICAgICAgICB3aGlsZSAocC5pbmRleCA+IDApIHsKKyAgICAgICAgICBwID0gY29kZS5wb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHAuaW5kZXgrKzsKKyAgICAgICAgY29kZS5wdXNoKHApOworCisgICAgICAgIHdoaWxlIChjb2RlLmxlbmd0aCA8PSBpKSB7CisgICAgICAgICAgY29kZS5wdXNoKHEgPSB7CisgICAgICAgICAgICBjaGlsZHJlbjogW10sCisgICAgICAgICAgICBpbmRleDogMAorICAgICAgICAgIH0pOworICAgICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuOworICAgICAgICAgIHAgPSBxOworICAgICAgICB9CisKKyAgICAgICAgaysrOworICAgICAgfQorCisgICAgICBpZiAoaSArIDEgPCBsZW5ndGgpIHsKKyAgICAgICAgY29kZS5wdXNoKHEgPSB7CisgICAgICAgICAgY2hpbGRyZW46IFtdLAorICAgICAgICAgIGluZGV4OiAwCisgICAgICAgIH0pOworICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKKyAgICAgICAgcCA9IHE7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvZGVbMF0uY2hpbGRyZW47CisgIH0KKworICBmdW5jdGlvbiBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIHJvdywgY29sKSB7CisgICAgcmV0dXJuIDY0ICogKChjb21wb25lbnQuYmxvY2tzUGVyTGluZSArIDEpICogcm93ICsgY29sKTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVNjYW4oZGF0YSwgb2Zmc2V0LCBmcmFtZSwgY29tcG9uZW50cywgcmVzZXRJbnRlcnZhbCwgc3BlY3RyYWxTdGFydCwgc3BlY3RyYWxFbmQsIHN1Y2Nlc3NpdmVQcmV2LCBzdWNjZXNzaXZlKSB7CisgICAgdmFyIHBhcnNlRE5MTWFya2VyID0gYXJndW1lbnRzLmxlbmd0aCA+IDkgJiYgYXJndW1lbnRzWzldICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbOV0gOiBmYWxzZTsKKyAgICB2YXIgbWN1c1BlckxpbmUgPSBmcmFtZS5tY3VzUGVyTGluZTsKKyAgICB2YXIgcHJvZ3Jlc3NpdmUgPSBmcmFtZS5wcm9ncmVzc2l2ZTsKKyAgICB2YXIgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CisgICAgdmFyIGJpdHNEYXRhID0gMCwKKyAgICAgICAgYml0c0NvdW50ID0gMDsKKworICAgIGZ1bmN0aW9uIHJlYWRCaXQoKSB7CisgICAgICBpZiAoYml0c0NvdW50ID4gMCkgeworICAgICAgICBiaXRzQ291bnQtLTsKKyAgICAgICAgcmV0dXJuIGJpdHNEYXRhID4+IGJpdHNDb3VudCAmIDE7CisgICAgICB9CisKKyAgICAgIGJpdHNEYXRhID0gZGF0YVtvZmZzZXQrK107CisKKyAgICAgIGlmIChiaXRzRGF0YSA9PT0gMHhmZikgeworICAgICAgICB2YXIgbmV4dEJ5dGUgPSBkYXRhW29mZnNldCsrXTsKKworICAgICAgICBpZiAobmV4dEJ5dGUpIHsKKyAgICAgICAgICBpZiAobmV4dEJ5dGUgPT09IDB4ZGMgJiYgcGFyc2VETkxNYXJrZXIpIHsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgdmFyIHNjYW5MaW5lcyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgICAgICAgIGlmIChzY2FuTGluZXMgPiAwICYmIHNjYW5MaW5lcyAhPT0gZnJhbWUuc2NhbkxpbmVzKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRE5MIG1hcmtlciAoMHhGRkRDKSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIsIHNjYW5MaW5lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Qnl0ZSA9PT0gMHhkOSkgeworICAgICAgICAgICAgaWYgKHBhcnNlRE5MTWFya2VyKSB7CisgICAgICAgICAgICAgIHZhciBtYXliZVNjYW5MaW5lcyA9IGJsb2NrUm93ICogKGZyYW1lLnByZWNpc2lvbiA9PT0gOCA/IDggOiAwKTsKKworICAgICAgICAgICAgICBpZiAobWF5YmVTY2FuTGluZXMgPiAwICYmIE1hdGgucm91bmQoZnJhbWUuc2NhbkxpbmVzIC8gbWF5YmVTY2FuTGluZXMpID49IDEwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEROTE1hcmtlckVycm9yKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhLCAiICsgInBvc3NpYmx5IGNhdXNlZCBieSBpbmNvcnJlY3QgYHNjYW5MaW5lc2AgcGFyYW1ldGVyIiwgbWF5YmVTY2FuTGluZXMpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBFT0lNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIpOworICAgICAgICAgIH0KKworICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoInVuZXhwZWN0ZWQgbWFya2VyICIuY29uY2F0KChiaXRzRGF0YSA8PCA4IHwgbmV4dEJ5dGUpLnRvU3RyaW5nKDE2KSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJpdHNDb3VudCA9IDc7CisgICAgICByZXR1cm4gYml0c0RhdGEgPj4+IDc7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlSHVmZm1hbih0cmVlKSB7CisgICAgICB2YXIgbm9kZSA9IHRyZWU7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIG5vZGUgPSBub2RlW3JlYWRCaXQoKV07CisKKyAgICAgICAgc3dpdGNoIChfdHlwZW9mKG5vZGUpKSB7CisgICAgICAgICAgY2FzZSAibnVtYmVyIjoKKyAgICAgICAgICAgIHJldHVybiBub2RlOworCisgICAgICAgICAgY2FzZSAib2JqZWN0IjoKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiaW52YWxpZCBodWZmbWFuIHNlcXVlbmNlIik7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVjZWl2ZShsZW5ndGgpIHsKKyAgICAgIHZhciBuID0gMDsKKworICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgbiA9IG4gPDwgMSB8IHJlYWRCaXQoKTsKKyAgICAgICAgbGVuZ3RoLS07CisgICAgICB9CisKKyAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIGZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQobGVuZ3RoKSB7CisgICAgICBpZiAobGVuZ3RoID09PSAxKSB7CisgICAgICAgIHJldHVybiByZWFkQml0KCkgPT09IDEgPyAxIDogLTE7CisgICAgICB9CisKKyAgICAgIHZhciBuID0gcmVjZWl2ZShsZW5ndGgpOworCisgICAgICBpZiAobiA+PSAxIDw8IGxlbmd0aCAtIDEpIHsKKyAgICAgICAgcmV0dXJuIG47CisgICAgICB9CisKKyAgICAgIHJldHVybiBuICsgKC0xIDw8IGxlbmd0aCkgKyAxOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZUJhc2VsaW5lKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIHZhciB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpOworICAgICAgdmFyIGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCk7CisgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CisgICAgICB2YXIgayA9IDE7CisKKyAgICAgIHdoaWxlIChrIDwgNjQpIHsKKyAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOworICAgICAgICB2YXIgcyA9IHJzICYgMTUsCisgICAgICAgICAgICByID0gcnMgPj4gNDsKKworICAgICAgICBpZiAocyA9PT0gMCkgeworICAgICAgICAgIGlmIChyIDwgMTUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGsgKz0gMTY7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBrICs9IHI7CisgICAgICAgIHZhciB6ID0gZGN0WmlnWmFnW2tdOworICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0ICsgel0gPSByZWNlaXZlQW5kRXh0ZW5kKHMpOworICAgICAgICBrKys7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlRENGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICB2YXIgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKKyAgICAgIHZhciBkaWZmID0gdCA9PT0gMCA/IDAgOiByZWNlaXZlQW5kRXh0ZW5kKHQpIDw8IHN1Y2Nlc3NpdmU7CisgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlRENTdWNjZXNzaXZlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdIHw9IHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlOworICAgIH0KKworICAgIHZhciBlb2JydW4gPSAwOworCisgICAgZnVuY3Rpb24gZGVjb2RlQUNGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICBpZiAoZW9icnVuID4gMCkgeworICAgICAgICBlb2JydW4tLTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQsCisgICAgICAgICAgZSA9IHNwZWN0cmFsRW5kOworCisgICAgICB3aGlsZSAoayA8PSBlKSB7CisgICAgICAgIHZhciBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKKyAgICAgICAgdmFyIHMgPSBycyAmIDE1LAorICAgICAgICAgICAgciA9IHJzID4+IDQ7CisKKyAgICAgICAgaWYgKHMgPT09IDApIHsKKyAgICAgICAgICBpZiAociA8IDE1KSB7CisgICAgICAgICAgICBlb2JydW4gPSByZWNlaXZlKHIpICsgKDEgPDwgcikgLSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgayArPSAxNjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGsgKz0gcjsKKyAgICAgICAgdmFyIHogPSBkY3RaaWdaYWdba107CisgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocykgKiAoMSA8PCBzdWNjZXNzaXZlKTsKKyAgICAgICAgaysrOworICAgICAgfQorICAgIH0KKworICAgIHZhciBzdWNjZXNzaXZlQUNTdGF0ZSA9IDAsCisgICAgICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZTsKKworICAgIGZ1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQ7CisgICAgICB2YXIgZSA9IHNwZWN0cmFsRW5kOworICAgICAgdmFyIHIgPSAwOworICAgICAgdmFyIHM7CisgICAgICB2YXIgcnM7CisKKyAgICAgIHdoaWxlIChrIDw9IGUpIHsKKyAgICAgICAgdmFyIG9mZnNldFogPSBibG9ja09mZnNldCArIGRjdFppZ1phZ1trXTsKKyAgICAgICAgdmFyIHNpZ24gPSBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdIDwgMCA/IC0xIDogMTsKKworICAgICAgICBzd2l0Y2ggKHN1Y2Nlc3NpdmVBQ1N0YXRlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CisgICAgICAgICAgICBzID0gcnMgJiAxNTsKKyAgICAgICAgICAgIHIgPSBycyA+PiA0OworCisgICAgICAgICAgICBpZiAocyA9PT0gMCkgeworICAgICAgICAgICAgICBpZiAociA8IDE1KSB7CisgICAgICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpOworICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gNDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByID0gMTY7CisgICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAxOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAocyAhPT0gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgQUNuIGVuY29kaW5nIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNOZXh0VmFsdWUgPSByZWNlaXZlQW5kRXh0ZW5kKHMpOworICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHIgPyAyIDogMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHItLTsKKworICAgICAgICAgICAgICBpZiAociA9PT0gMCkgeworICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDIgPyAzIDogMDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CisgICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID0gc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIDw8IHN1Y2Nlc3NpdmU7CisgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkgeworICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGsrKzsKKyAgICAgIH0KKworICAgICAgaWYgKHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSA0KSB7CisgICAgICAgIGVvYnJ1bi0tOworCisgICAgICAgIGlmIChlb2JydW4gPT09IDApIHsKKyAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgYmxvY2tSb3cgPSAwOworCisgICAgZnVuY3Rpb24gZGVjb2RlTWN1KGNvbXBvbmVudCwgZGVjb2RlLCBtY3UsIHJvdywgY29sKSB7CisgICAgICB2YXIgbWN1Um93ID0gbWN1IC8gbWN1c1BlckxpbmUgfCAwOworICAgICAgdmFyIG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lOworICAgICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdzsKKyAgICAgIHZhciBibG9ja0NvbCA9IG1jdUNvbCAqIGNvbXBvbmVudC5oICsgY29sOworICAgICAgdmFyIGJsb2NrT2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpOworICAgICAgZGVjb2RlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlLCBtY3UpIHsKKyAgICAgIGJsb2NrUm93ID0gbWN1IC8gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgfCAwOworICAgICAgdmFyIGJsb2NrQ29sID0gbWN1ICUgY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7CisgICAgICB2YXIgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CisgICAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7CisgICAgfQorCisgICAgdmFyIGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDsKKyAgICB2YXIgY29tcG9uZW50LCBpLCBqLCBrLCBuOworICAgIHZhciBkZWNvZGVGbjsKKworICAgIGlmIChwcm9ncmVzc2l2ZSkgeworICAgICAgaWYgKHNwZWN0cmFsU3RhcnQgPT09IDApIHsKKyAgICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZURDRmlyc3QgOiBkZWNvZGVEQ1N1Y2Nlc3NpdmU7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWNvZGVGbiA9IHN1Y2Nlc3NpdmVQcmV2ID09PSAwID8gZGVjb2RlQUNGaXJzdCA6IGRlY29kZUFDU3VjY2Vzc2l2ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZGVjb2RlRm4gPSBkZWNvZGVCYXNlbGluZTsKKyAgICB9CisKKyAgICB2YXIgbWN1ID0gMCwKKyAgICAgICAgZmlsZU1hcmtlcjsKKyAgICB2YXIgbWN1RXhwZWN0ZWQ7CisKKyAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkgeworICAgICAgbWN1RXhwZWN0ZWQgPSBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckxpbmUgKiBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckNvbHVtbjsKKyAgICB9IGVsc2UgeworICAgICAgbWN1RXhwZWN0ZWQgPSBtY3VzUGVyTGluZSAqIGZyYW1lLm1jdXNQZXJDb2x1bW47CisgICAgfQorCisgICAgdmFyIGgsIHY7CisKKyAgICB3aGlsZSAobWN1IDw9IG1jdUV4cGVjdGVkKSB7CisgICAgICB2YXIgbWN1VG9SZWFkID0gcmVzZXRJbnRlcnZhbCA/IE1hdGgubWluKG1jdUV4cGVjdGVkIC0gbWN1LCByZXNldEludGVydmFsKSA6IG1jdUV4cGVjdGVkOworCisgICAgICBpZiAobWN1VG9SZWFkID4gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgY29tcG9uZW50c1tpXS5wcmVkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGVvYnJ1biA9IDA7CisKKyAgICAgICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHsKKyAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzWzBdOworCisgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG1jdVRvUmVhZDsgbisrKSB7CisgICAgICAgICAgICBkZWNvZGVCbG9jayhjb21wb25lbnQsIGRlY29kZUZuLCBtY3UpOworICAgICAgICAgICAgbWN1Kys7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOworICAgICAgICAgICAgICBoID0gY29tcG9uZW50Lmg7CisgICAgICAgICAgICAgIHYgPSBjb21wb25lbnQudjsKKworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdjsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgZGVjb2RlTWN1KGNvbXBvbmVudCwgZGVjb2RlRm4sIG1jdSwgaiwgayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1jdSsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBiaXRzQ291bnQgPSAwOworICAgICAgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBvZmZzZXQpOworCisgICAgICBpZiAoIWZpbGVNYXJrZXIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChmaWxlTWFya2VyLmludmFsaWQpIHsKKyAgICAgICAgdmFyIHBhcnRpYWxNc2cgPSBtY3VUb1JlYWQgPiAwID8gInVuZXhwZWN0ZWQiIDogImV4Y2Vzc2l2ZSI7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZGVjb2RlU2NhbiAtICIuY29uY2F0KHBhcnRpYWxNc2csICIgTUNVIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAiKS5jb25jYXQoZmlsZU1hcmtlci5pbnZhbGlkKSk7CisgICAgICAgIG9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0OworICAgICAgfQorCisgICAgICBpZiAoZmlsZU1hcmtlci5tYXJrZXIgPj0gMHhmZmQwICYmIGZpbGVNYXJrZXIubWFya2VyIDw9IDB4ZmZkNykgeworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDsKKyAgfQorCisgIGZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIGJsb2NrQnVmZmVyT2Zmc2V0LCBwKSB7CisgICAgdmFyIHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLAorICAgICAgICBibG9ja0RhdGEgPSBjb21wb25lbnQuYmxvY2tEYXRhOworICAgIHZhciB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2Niwgdjc7CisgICAgdmFyIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNzsKKyAgICB2YXIgdDsKKworICAgIGlmICghcXQpIHsKKyAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpOworICAgIH0KKworICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IDY0OyByb3cgKz0gOCkgeworICAgICAgcDAgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3ddOworICAgICAgcDEgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAxXTsKKyAgICAgIHAyID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMl07CisgICAgICBwMyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDNdOworICAgICAgcDQgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA0XTsKKyAgICAgIHA1ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNV07CisgICAgICBwNiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDZdOworICAgICAgcDcgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA3XTsKKyAgICAgIHAwICo9IHF0W3Jvd107CisKKyAgICAgIGlmICgocDEgfCBwMiB8IHAzIHwgcDQgfCBwNSB8IHA2IHwgcDcpID09PSAwKSB7CisgICAgICAgIHQgPSBkY3RTcXJ0MiAqIHAwICsgNTEyID4+IDEwOworICAgICAgICBwW3Jvd10gPSB0OworICAgICAgICBwW3JvdyArIDFdID0gdDsKKyAgICAgICAgcFtyb3cgKyAyXSA9IHQ7CisgICAgICAgIHBbcm93ICsgM10gPSB0OworICAgICAgICBwW3JvdyArIDRdID0gdDsKKyAgICAgICAgcFtyb3cgKyA1XSA9IHQ7CisgICAgICAgIHBbcm93ICsgNl0gPSB0OworICAgICAgICBwW3JvdyArIDddID0gdDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHAxICo9IHF0W3JvdyArIDFdOworICAgICAgcDIgKj0gcXRbcm93ICsgMl07CisgICAgICBwMyAqPSBxdFtyb3cgKyAzXTsKKyAgICAgIHA0ICo9IHF0W3JvdyArIDRdOworICAgICAgcDUgKj0gcXRbcm93ICsgNV07CisgICAgICBwNiAqPSBxdFtyb3cgKyA2XTsKKyAgICAgIHA3ICo9IHF0W3JvdyArIDddOworICAgICAgdjAgPSBkY3RTcXJ0MiAqIHAwICsgMTI4ID4+IDg7CisgICAgICB2MSA9IGRjdFNxcnQyICogcDQgKyAxMjggPj4gODsKKyAgICAgIHYyID0gcDI7CisgICAgICB2MyA9IHA2OworICAgICAgdjQgPSBkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMTI4ID4+IDg7CisgICAgICB2NyA9IGRjdFNxcnQxZDIgKiAocDEgKyBwNykgKyAxMjggPj4gODsKKyAgICAgIHY1ID0gcDMgPDwgNDsKKyAgICAgIHY2ID0gcDUgPDwgNDsKKyAgICAgIHYwID0gdjAgKyB2MSArIDEgPj4gMTsKKyAgICAgIHYxID0gdjAgLSB2MTsKKyAgICAgIHQgPSB2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAxMjggPj4gODsKKyAgICAgIHYyID0gdjIgKiBkY3RDb3M2IC0gdjMgKiBkY3RTaW42ICsgMTI4ID4+IDg7CisgICAgICB2MyA9IHQ7CisgICAgICB2NCA9IHY0ICsgdjYgKyAxID4+IDE7CisgICAgICB2NiA9IHY0IC0gdjY7CisgICAgICB2NyA9IHY3ICsgdjUgKyAxID4+IDE7CisgICAgICB2NSA9IHY3IC0gdjU7CisgICAgICB2MCA9IHYwICsgdjMgKyAxID4+IDE7CisgICAgICB2MyA9IHYwIC0gdjM7CisgICAgICB2MSA9IHYxICsgdjIgKyAxID4+IDE7CisgICAgICB2MiA9IHYxIC0gdjI7CisgICAgICB0ID0gdjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCA+PiAxMjsKKyAgICAgIHY0ID0gdjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCA+PiAxMjsKKyAgICAgIHY3ID0gdDsKKyAgICAgIHQgPSB2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4ID4+IDEyOworICAgICAgdjUgPSB2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4ID4+IDEyOworICAgICAgdjYgPSB0OworICAgICAgcFtyb3ddID0gdjAgKyB2NzsKKyAgICAgIHBbcm93ICsgN10gPSB2MCAtIHY3OworICAgICAgcFtyb3cgKyAxXSA9IHYxICsgdjY7CisgICAgICBwW3JvdyArIDZdID0gdjEgLSB2NjsKKyAgICAgIHBbcm93ICsgMl0gPSB2MiArIHY1OworICAgICAgcFtyb3cgKyA1XSA9IHYyIC0gdjU7CisgICAgICBwW3JvdyArIDNdID0gdjMgKyB2NDsKKyAgICAgIHBbcm93ICsgNF0gPSB2MyAtIHY0OworICAgIH0KKworICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IDg7ICsrY29sKSB7CisgICAgICBwMCA9IHBbY29sXTsKKyAgICAgIHAxID0gcFtjb2wgKyA4XTsKKyAgICAgIHAyID0gcFtjb2wgKyAxNl07CisgICAgICBwMyA9IHBbY29sICsgMjRdOworICAgICAgcDQgPSBwW2NvbCArIDMyXTsKKyAgICAgIHA1ID0gcFtjb2wgKyA0MF07CisgICAgICBwNiA9IHBbY29sICsgNDhdOworICAgICAgcDcgPSBwW2NvbCArIDU2XTsKKworICAgICAgaWYgKChwMSB8IHAyIHwgcDMgfCBwNCB8IHA1IHwgcDYgfCBwNykgPT09IDApIHsKKyAgICAgICAgdCA9IGRjdFNxcnQyICogcDAgKyA4MTkyID4+IDE0OworCisgICAgICAgIGlmICh0IDwgLTIwNDApIHsKKyAgICAgICAgICB0ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh0ID49IDIwMjQpIHsKKyAgICAgICAgICB0ID0gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHQgPSB0ICsgMjA1NiA+PiA0OworICAgICAgICB9CisKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gdDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHYwID0gZGN0U3FydDIgKiBwMCArIDIwNDggPj4gMTI7CisgICAgICB2MSA9IGRjdFNxcnQyICogcDQgKyAyMDQ4ID4+IDEyOworICAgICAgdjIgPSBwMjsKKyAgICAgIHYzID0gcDY7CisgICAgICB2NCA9IGRjdFNxcnQxZDIgKiAocDEgLSBwNykgKyAyMDQ4ID4+IDEyOworICAgICAgdjcgPSBkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMjA0OCA+PiAxMjsKKyAgICAgIHY1ID0gcDM7CisgICAgICB2NiA9IHA1OworICAgICAgdjAgPSAodjAgKyB2MSArIDEgPj4gMSkgKyA0MTEyOworICAgICAgdjEgPSB2MCAtIHYxOworICAgICAgdCA9IHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDIwNDggPj4gMTI7CisgICAgICB2MiA9IHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDIwNDggPj4gMTI7CisgICAgICB2MyA9IHQ7CisgICAgICB2NCA9IHY0ICsgdjYgKyAxID4+IDE7CisgICAgICB2NiA9IHY0IC0gdjY7CisgICAgICB2NyA9IHY3ICsgdjUgKyAxID4+IDE7CisgICAgICB2NSA9IHY3IC0gdjU7CisgICAgICB2MCA9IHYwICsgdjMgKyAxID4+IDE7CisgICAgICB2MyA9IHYwIC0gdjM7CisgICAgICB2MSA9IHYxICsgdjIgKyAxID4+IDE7CisgICAgICB2MiA9IHYxIC0gdjI7CisgICAgICB0ID0gdjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCA+PiAxMjsKKyAgICAgIHY0ID0gdjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCA+PiAxMjsKKyAgICAgIHY3ID0gdDsKKyAgICAgIHQgPSB2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4ID4+IDEyOworICAgICAgdjUgPSB2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4ID4+IDEyOworICAgICAgdjYgPSB0OworICAgICAgcDAgPSB2MCArIHY3OworICAgICAgcDcgPSB2MCAtIHY3OworICAgICAgcDEgPSB2MSArIHY2OworICAgICAgcDYgPSB2MSAtIHY2OworICAgICAgcDIgPSB2MiArIHY1OworICAgICAgcDUgPSB2MiAtIHY1OworICAgICAgcDMgPSB2MyArIHY0OworICAgICAgcDQgPSB2MyAtIHY0OworCisgICAgICBpZiAocDAgPCAxNikgeworICAgICAgICBwMCA9IDA7CisgICAgICB9IGVsc2UgaWYgKHAwID49IDQwODApIHsKKyAgICAgICAgcDAgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwMCA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHAxIDwgMTYpIHsKKyAgICAgICAgcDEgPSAwOworICAgICAgfSBlbHNlIGlmIChwMSA+PSA0MDgwKSB7CisgICAgICAgIHAxID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDEgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwMiA8IDE2KSB7CisgICAgICAgIHAyID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDIgPj0gNDA4MCkgeworICAgICAgICBwMiA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHAyID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDMgPCAxNikgeworICAgICAgICBwMyA9IDA7CisgICAgICB9IGVsc2UgaWYgKHAzID49IDQwODApIHsKKyAgICAgICAgcDMgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwMyA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHA0IDwgMTYpIHsKKyAgICAgICAgcDQgPSAwOworICAgICAgfSBlbHNlIGlmIChwNCA+PSA0MDgwKSB7CisgICAgICAgIHA0ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDQgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwNSA8IDE2KSB7CisgICAgICAgIHA1ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDUgPj0gNDA4MCkgeworICAgICAgICBwNSA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHA1ID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDYgPCAxNikgeworICAgICAgICBwNiA9IDA7CisgICAgICB9IGVsc2UgaWYgKHA2ID49IDQwODApIHsKKyAgICAgICAgcDYgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwNiA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHA3IDwgMTYpIHsKKyAgICAgICAgcDcgPSAwOworICAgICAgfSBlbHNlIGlmIChwNyA+PSA0MDgwKSB7CisgICAgICAgIHA3ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDcgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbF0gPSBwMDsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gcDE7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSBwMjsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDI0XSA9IHAzOworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gcDQ7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSBwNTsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQ4XSA9IHA2OworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gcDc7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpIHsKKyAgICB2YXIgYmxvY2tzUGVyTGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOworICAgIHZhciBibG9ja3NQZXJDb2x1bW4gPSBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uOworICAgIHZhciBjb21wdXRhdGlvbkJ1ZmZlciA9IG5ldyBJbnQxNkFycmF5KDY0KTsKKworICAgIGZvciAodmFyIGJsb2NrUm93ID0gMDsgYmxvY2tSb3cgPCBibG9ja3NQZXJDb2x1bW47IGJsb2NrUm93KyspIHsKKyAgICAgIGZvciAodmFyIGJsb2NrQ29sID0gMDsgYmxvY2tDb2wgPCBibG9ja3NQZXJMaW5lOyBibG9ja0NvbCsrKSB7CisgICAgICAgIHZhciBvZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CisgICAgICAgIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIG9mZnNldCwgY29tcHV0YXRpb25CdWZmZXIpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhOworICB9CisKKyAgZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGN1cnJlbnRQb3MpIHsKKyAgICB2YXIgc3RhcnRQb3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGN1cnJlbnRQb3M7CisgICAgdmFyIG1heFBvcyA9IGRhdGEubGVuZ3RoIC0gMTsKKyAgICB2YXIgbmV3UG9zID0gc3RhcnRQb3MgPCBjdXJyZW50UG9zID8gc3RhcnRQb3MgOiBjdXJyZW50UG9zOworCisgICAgaWYgKGN1cnJlbnRQb3MgPj0gbWF4UG9zKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgY3VycmVudE1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBjdXJyZW50UG9zKTsKKworICAgIGlmIChjdXJyZW50TWFya2VyID49IDB4ZmZjMCAmJiBjdXJyZW50TWFya2VyIDw9IDB4ZmZmZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgaW52YWxpZDogbnVsbCwKKyAgICAgICAgbWFya2VyOiBjdXJyZW50TWFya2VyLAorICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQb3MKKyAgICAgIH07CisgICAgfQorCisgICAgdmFyIG5ld01hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBuZXdQb3MpOworCisgICAgd2hpbGUgKCEobmV3TWFya2VyID49IDB4ZmZjMCAmJiBuZXdNYXJrZXIgPD0gMHhmZmZlKSkgeworICAgICAgaWYgKCsrbmV3UG9zID49IG1heFBvcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgbmV3TWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG5ld1Bvcyk7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGludmFsaWQ6IGN1cnJlbnRNYXJrZXIudG9TdHJpbmcoMTYpLAorICAgICAgbWFya2VyOiBuZXdNYXJrZXIsCisgICAgICBvZmZzZXQ6IG5ld1BvcworICAgIH07CisgIH0KKworICBKcGVnSW1hZ2UucHJvdG90eXBlID0geworICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkYXRhKSB7CisgICAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LAorICAgICAgICAgIF9yZWYyJGRubFNjYW5MaW5lcyA9IF9yZWYyLmRubFNjYW5MaW5lcywKKyAgICAgICAgICBkbmxTY2FuTGluZXMgPSBfcmVmMiRkbmxTY2FuTGluZXMgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRkbmxTY2FuTGluZXM7CisKKyAgICAgIGZ1bmN0aW9uIHJlYWREYXRhQmxvY2soKSB7CisgICAgICAgIHZhciBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgIHZhciBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGggLSAyOworICAgICAgICB2YXIgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBlbmRPZmZzZXQsIG9mZnNldCk7CisKKyAgICAgICAgaWYgKGZpbGVNYXJrZXIgJiYgZmlsZU1hcmtlci5pbnZhbGlkKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJyZWFkRGF0YUJsb2NrIC0gaW5jb3JyZWN0IGxlbmd0aCwgY3VycmVudCBtYXJrZXIgaXM6ICIgKyBmaWxlTWFya2VyLmludmFsaWQpOworICAgICAgICAgIGVuZE9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgdmFyIGFycmF5ID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIGVuZE9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSBhcnJheS5sZW5ndGg7CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpIHsKKyAgICAgICAgdmFyIG1jdXNQZXJMaW5lID0gTWF0aC5jZWlsKGZyYW1lLnNhbXBsZXNQZXJMaW5lIC8gOCAvIGZyYW1lLm1heEgpOworICAgICAgICB2YXIgbWN1c1BlckNvbHVtbiA9IE1hdGguY2VpbChmcmFtZS5zY2FuTGluZXMgLyA4IC8gZnJhbWUubWF4Vik7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFtZS5jb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tpXTsKKyAgICAgICAgICB2YXIgYmxvY2tzUGVyTGluZSA9IE1hdGguY2VpbChNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4KSAqIGNvbXBvbmVudC5oIC8gZnJhbWUubWF4SCk7CisgICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbiA9IE1hdGguY2VpbChNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCkgKiBjb21wb25lbnQudiAvIGZyYW1lLm1heFYpOworICAgICAgICAgIHZhciBibG9ja3NQZXJMaW5lRm9yTWN1ID0gbWN1c1BlckxpbmUgKiBjb21wb25lbnQuaDsKKyAgICAgICAgICB2YXIgYmxvY2tzUGVyQ29sdW1uRm9yTWN1ID0gbWN1c1BlckNvbHVtbiAqIGNvbXBvbmVudC52OworICAgICAgICAgIHZhciBibG9ja3NCdWZmZXJTaXplID0gNjQgKiBibG9ja3NQZXJDb2x1bW5Gb3JNY3UgKiAoYmxvY2tzUGVyTGluZUZvck1jdSArIDEpOworICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGEgPSBuZXcgSW50MTZBcnJheShibG9ja3NCdWZmZXJTaXplKTsKKyAgICAgICAgICBjb21wb25lbnQuYmxvY2tzUGVyTGluZSA9IGJsb2Nrc1BlckxpbmU7CisgICAgICAgICAgY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbiA9IGJsb2Nrc1BlckNvbHVtbjsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lLm1jdXNQZXJMaW5lID0gbWN1c1BlckxpbmU7CisgICAgICAgIGZyYW1lLm1jdXNQZXJDb2x1bW4gPSBtY3VzUGVyQ29sdW1uOworICAgICAgfQorCisgICAgICB2YXIgb2Zmc2V0ID0gMDsKKyAgICAgIHZhciBqZmlmID0gbnVsbDsKKyAgICAgIHZhciBhZG9iZSA9IG51bGw7CisgICAgICB2YXIgZnJhbWUsIHJlc2V0SW50ZXJ2YWw7CisgICAgICB2YXIgbnVtU09TTWFya2VycyA9IDA7CisgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVzID0gW107CisgICAgICB2YXIgaHVmZm1hblRhYmxlc0FDID0gW10sCisgICAgICAgICAgaHVmZm1hblRhYmxlc0RDID0gW107CisgICAgICB2YXIgZmlsZU1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgIGlmIChmaWxlTWFya2VyICE9PSAweGZmZDgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiU09JIG5vdCBmb3VuZCIpOworICAgICAgfQorCisgICAgICBmaWxlTWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgbWFya2VyTG9vcDogd2hpbGUgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOSkgeworICAgICAgICB2YXIgaSwgaiwgbDsKKworICAgICAgICBzd2l0Y2ggKGZpbGVNYXJrZXIpIHsKKyAgICAgICAgICBjYXNlIDB4ZmZlMDoKKyAgICAgICAgICBjYXNlIDB4ZmZlMToKKyAgICAgICAgICBjYXNlIDB4ZmZlMjoKKyAgICAgICAgICBjYXNlIDB4ZmZlMzoKKyAgICAgICAgICBjYXNlIDB4ZmZlNDoKKyAgICAgICAgICBjYXNlIDB4ZmZlNToKKyAgICAgICAgICBjYXNlIDB4ZmZlNjoKKyAgICAgICAgICBjYXNlIDB4ZmZlNzoKKyAgICAgICAgICBjYXNlIDB4ZmZlODoKKyAgICAgICAgICBjYXNlIDB4ZmZlOToKKyAgICAgICAgICBjYXNlIDB4ZmZlYToKKyAgICAgICAgICBjYXNlIDB4ZmZlYjoKKyAgICAgICAgICBjYXNlIDB4ZmZlYzoKKyAgICAgICAgICBjYXNlIDB4ZmZlZDoKKyAgICAgICAgICBjYXNlIDB4ZmZlZToKKyAgICAgICAgICBjYXNlIDB4ZmZlZjoKKyAgICAgICAgICBjYXNlIDB4ZmZmZToKKyAgICAgICAgICAgIHZhciBhcHBEYXRhID0gcmVhZERhdGFCbG9jaygpOworCisgICAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmUwKSB7CisgICAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDRhICYmIGFwcERhdGFbMV0gPT09IDB4NDYgJiYgYXBwRGF0YVsyXSA9PT0gMHg0OSAmJiBhcHBEYXRhWzNdID09PSAweDQ2ICYmIGFwcERhdGFbNF0gPT09IDApIHsKKyAgICAgICAgICAgICAgICBqZmlmID0geworICAgICAgICAgICAgICAgICAgdmVyc2lvbjogeworICAgICAgICAgICAgICAgICAgICBtYWpvcjogYXBwRGF0YVs1XSwKKyAgICAgICAgICAgICAgICAgICAgbWlub3I6IGFwcERhdGFbNl0KKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBkZW5zaXR5VW5pdHM6IGFwcERhdGFbN10sCisgICAgICAgICAgICAgICAgICB4RGVuc2l0eTogYXBwRGF0YVs4XSA8PCA4IHwgYXBwRGF0YVs5XSwKKyAgICAgICAgICAgICAgICAgIHlEZW5zaXR5OiBhcHBEYXRhWzEwXSA8PCA4IHwgYXBwRGF0YVsxMV0sCisgICAgICAgICAgICAgICAgICB0aHVtYldpZHRoOiBhcHBEYXRhWzEyXSwKKyAgICAgICAgICAgICAgICAgIHRodW1iSGVpZ2h0OiBhcHBEYXRhWzEzXSwKKyAgICAgICAgICAgICAgICAgIHRodW1iRGF0YTogYXBwRGF0YS5zdWJhcnJheSgxNCwgMTQgKyAzICogYXBwRGF0YVsxMl0gKiBhcHBEYXRhWzEzXSkKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZWUpIHsKKyAgICAgICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NDEgJiYgYXBwRGF0YVsxXSA9PT0gMHg2NCAmJiBhcHBEYXRhWzJdID09PSAweDZmICYmIGFwcERhdGFbM10gPT09IDB4NjIgJiYgYXBwRGF0YVs0XSA9PT0gMHg2NSkgeworICAgICAgICAgICAgICAgIGFkb2JlID0geworICAgICAgICAgICAgICAgICAgdmVyc2lvbjogYXBwRGF0YVs1XSA8PCA4IHwgYXBwRGF0YVs2XSwKKyAgICAgICAgICAgICAgICAgIGZsYWdzMDogYXBwRGF0YVs3XSA8PCA4IHwgYXBwRGF0YVs4XSwKKyAgICAgICAgICAgICAgICAgIGZsYWdzMTogYXBwRGF0YVs5XSA8PCA4IHwgYXBwRGF0YVsxMF0sCisgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1Db2RlOiBhcHBEYXRhWzExXQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZkYjoKKyAgICAgICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXNMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlc0VuZCA9IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCArIG9mZnNldCAtIDI7CisgICAgICAgICAgICB2YXIgejsKKworICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHF1YW50aXphdGlvblRhYmxlc0VuZCkgeworICAgICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgIHZhciB0YWJsZURhdGEgPSBuZXcgVWludDE2QXJyYXkoNjQpOworCisgICAgICAgICAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisgICAgICAgICAgICAgICAgICB6ID0gZGN0WmlnWmFnW2pdOworICAgICAgICAgICAgICAgICAgdGFibGVEYXRhW3pdID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1YW50aXphdGlvblRhYmxlU3BlYyA+PiA0ID09PSAxKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgIHogPSBkY3RaaWdaYWdbal07CisgICAgICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlc1txdWFudGl6YXRpb25UYWJsZVNwZWMgJiAxNV0gPSB0YWJsZURhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmYzA6CisgICAgICAgICAgY2FzZSAweGZmYzE6CisgICAgICAgICAgY2FzZSAweGZmYzI6CisgICAgICAgICAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgZnJhbWUgPSB7fTsKKyAgICAgICAgICAgIGZyYW1lLmV4dGVuZGVkID0gZmlsZU1hcmtlciA9PT0gMHhmZmMxOworICAgICAgICAgICAgZnJhbWUucHJvZ3Jlc3NpdmUgPSBmaWxlTWFya2VyID09PSAweGZmYzI7CisgICAgICAgICAgICBmcmFtZS5wcmVjaXNpb24gPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgIHZhciBzb2ZTY2FuTGluZXMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgZnJhbWUuc2NhbkxpbmVzID0gZG5sU2NhbkxpbmVzIHx8IHNvZlNjYW5MaW5lczsKKyAgICAgICAgICAgIGZyYW1lLnNhbXBsZXNQZXJMaW5lID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudHMgPSBbXTsKKyAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkcyA9IHt9OworICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IGRhdGFbb2Zmc2V0KytdLAorICAgICAgICAgICAgICAgIGNvbXBvbmVudElkOworICAgICAgICAgICAgdmFyIG1heEggPSAwLAorICAgICAgICAgICAgICAgIG1heFYgPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07CisgICAgICAgICAgICAgIHZhciBoID0gZGF0YVtvZmZzZXQgKyAxXSA+PiA0OworICAgICAgICAgICAgICB2YXIgdiA9IGRhdGFbb2Zmc2V0ICsgMV0gJiAxNTsKKworICAgICAgICAgICAgICBpZiAobWF4SCA8IGgpIHsKKyAgICAgICAgICAgICAgICBtYXhIID0gaDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChtYXhWIDwgdikgeworICAgICAgICAgICAgICAgIG1heFYgPSB2OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07CisgICAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goeworICAgICAgICAgICAgICAgIGg6IGgsCisgICAgICAgICAgICAgICAgdjogdiwKKyAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLAorICAgICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHNbY29tcG9uZW50SWRdID0gbCAtIDE7CisgICAgICAgICAgICAgIG9mZnNldCArPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZS5tYXhIID0gbWF4SDsKKyAgICAgICAgICAgIGZyYW1lLm1heFYgPSBtYXhWOworICAgICAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZjNDoKKyAgICAgICAgICAgIHZhciBodWZmbWFuTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgICAgICAgZm9yIChpID0gMjsgaSA8IGh1ZmZtYW5MZW5ndGg7KSB7CisgICAgICAgICAgICAgIHZhciBodWZmbWFuVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgIHZhciBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KDE2KTsKKyAgICAgICAgICAgICAgdmFyIGNvZGVMZW5ndGhTdW0gPSAwOworCisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrLCBvZmZzZXQrKykgeworICAgICAgICAgICAgICAgIGNvZGVMZW5ndGhTdW0gKz0gY29kZUxlbmd0aHNbal0gPSBkYXRhW29mZnNldF07CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgaHVmZm1hblZhbHVlcyA9IG5ldyBVaW50OEFycmF5KGNvZGVMZW5ndGhTdW0pOworCisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3RoU3VtOyBqKyssIG9mZnNldCsrKSB7CisgICAgICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGkgKz0gMTcgKyBjb2RlTGVuZ3RoU3VtOworICAgICAgICAgICAgICAoaHVmZm1hblRhYmxlU3BlYyA+PiA0ID09PSAwID8gaHVmZm1hblRhYmxlc0RDIDogaHVmZm1hblRhYmxlc0FDKVtodWZmbWFuVGFibGVTcGVjICYgMTVdID0gYnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsIGh1ZmZtYW5WYWx1ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmRkOgorICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICByZXNldEludGVydmFsID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZGE6CisgICAgICAgICAgICB2YXIgcGFyc2VETkxNYXJrZXIgPSArK251bVNPU01hcmtlcnMgPT09IDEgJiYgIWRubFNjYW5MaW5lczsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgdmFyIHNlbGVjdG9yc0NvdW50ID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdLAorICAgICAgICAgICAgICAgIGNvbXBvbmVudDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGVjdG9yc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgIHZhciBjb21wb25lbnRJbmRleCA9IGZyYW1lLmNvbXBvbmVudElkc1tpbmRleF07CisgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbY29tcG9uZW50SW5kZXhdOworICAgICAgICAgICAgICBjb21wb25lbnQuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgdmFyIHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlREMgPSBodWZmbWFuVGFibGVzRENbdGFibGVTcGVjID4+IDRdOworICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlQUMgPSBodWZmbWFuVGFibGVzQUNbdGFibGVTcGVjICYgMTVdOworICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNwZWN0cmFsU3RhcnQgPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgIHZhciBzcGVjdHJhbEVuZCA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgdmFyIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID0gZGF0YVtvZmZzZXQrK107CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHZhciBwcm9jZXNzZWQgPSBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA+PiA0LCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LCBwYXJzZUROTE1hcmtlcik7CisgICAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7CisgICAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiIi5jb25jYXQoZXgubWVzc2FnZSwgIiAtLSBhdHRlbXB0aW5nIHRvIHJlLXBhcnNlIHRoZSBKUEVHIGltYWdlLiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShkYXRhLCB7CisgICAgICAgICAgICAgICAgICBkbmxTY2FuTGluZXM6IGV4LnNjYW5MaW5lcworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRU9JTWFya2VyRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIiIuY29uY2F0KGV4Lm1lc3NhZ2UsICIgLS0gaWdub3JpbmcgdGhlIHJlc3Qgb2YgdGhlIGltYWdlIGRhdGEuIikpOworICAgICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZkYzoKKyAgICAgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZmZjoKKyAgICAgICAgICAgIGlmIChkYXRhW29mZnNldF0gIT09IDB4ZmYpIHsKKyAgICAgICAgICAgICAgb2Zmc2V0LS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhciBuZXh0RmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBvZmZzZXQgLSAyLCBvZmZzZXQgLSAzKTsKKworICAgICAgICAgICAgaWYgKG5leHRGaWxlTWFya2VyICYmIG5leHRGaWxlTWFya2VyLmludmFsaWQpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAiICsgbmV4dEZpbGVNYXJrZXIuaW52YWxpZCk7CisgICAgICAgICAgICAgIG9mZnNldCA9IG5leHRGaWxlTWFya2VyLm9mZnNldDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gZGF0YS5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhICIgKyAid2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuIik7CisgICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiAiICsgZmlsZU1hcmtlci50b1N0cmluZygxNikpOworICAgICAgICB9CisKKyAgICAgICAgZmlsZU1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIH0KKworICAgICAgdGhpcy53aWR0aCA9IGZyYW1lLnNhbXBsZXNQZXJMaW5lOworICAgICAgdGhpcy5oZWlnaHQgPSBmcmFtZS5zY2FuTGluZXM7CisgICAgICB0aGlzLmpmaWYgPSBqZmlmOworICAgICAgdGhpcy5hZG9iZSA9IGFkb2JlOworICAgICAgdGhpcy5jb21wb25lbnRzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS5jb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbaV07CisgICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlc1tjb21wb25lbnQucXVhbnRpemF0aW9uSWRdOworCisgICAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZSkgeworICAgICAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goeworICAgICAgICAgIGluZGV4OiBjb21wb25lbnQuaW5kZXgsCisgICAgICAgICAgb3V0cHV0OiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCksCisgICAgICAgICAgc2NhbGVYOiBjb21wb25lbnQuaCAvIGZyYW1lLm1heEgsCisgICAgICAgICAgc2NhbGVZOiBjb21wb25lbnQudiAvIGZyYW1lLm1heFYsCisgICAgICAgICAgYmxvY2tzUGVyTGluZTogY29tcG9uZW50LmJsb2Nrc1BlckxpbmUsCisgICAgICAgICAgYmxvY2tzUGVyQ29sdW1uOiBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLm51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9LAorICAgIF9nZXRMaW5lYXJpemVkQmxvY2tEYXRhOiBmdW5jdGlvbiBfZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh3aWR0aCwgaGVpZ2h0KSB7CisgICAgICB2YXIgaXNTb3VyY2VQREYgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlOworICAgICAgdmFyIHNjYWxlWCA9IHRoaXMud2lkdGggLyB3aWR0aCwKKyAgICAgICAgICBzY2FsZVkgPSB0aGlzLmhlaWdodCAvIGhlaWdodDsKKyAgICAgIHZhciBjb21wb25lbnQsIGNvbXBvbmVudFNjYWxlWCwgY29tcG9uZW50U2NhbGVZLCBibG9ja3NQZXJTY2FubGluZTsKKyAgICAgIHZhciB4LCB5LCBpLCBqLCBrOworICAgICAgdmFyIGluZGV4OworICAgICAgdmFyIG9mZnNldCA9IDA7CisgICAgICB2YXIgb3V0cHV0OworICAgICAgdmFyIG51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOworICAgICAgdmFyIGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7CisgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoKTsKKyAgICAgIHZhciB4U2NhbGVCbG9ja09mZnNldCA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCk7CisgICAgICB2YXIgbWFzazNMU0IgPSAweGZmZmZmZmY4OworICAgICAgdmFyIGxhc3RDb21wb25lbnRTY2FsZVg7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2ldOworICAgICAgICBjb21wb25lbnRTY2FsZVggPSBjb21wb25lbnQuc2NhbGVYICogc2NhbGVYOworICAgICAgICBjb21wb25lbnRTY2FsZVkgPSBjb21wb25lbnQuc2NhbGVZICogc2NhbGVZOworICAgICAgICBvZmZzZXQgPSBpOworICAgICAgICBvdXRwdXQgPSBjb21wb25lbnQub3V0cHV0OworICAgICAgICBibG9ja3NQZXJTY2FubGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lICsgMSA8PCAzOworCisgICAgICAgIGlmIChjb21wb25lbnRTY2FsZVggIT09IGxhc3RDb21wb25lbnRTY2FsZVgpIHsKKyAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaiA9IDAgfCB4ICogY29tcG9uZW50U2NhbGVYOworICAgICAgICAgICAgeFNjYWxlQmxvY2tPZmZzZXRbeF0gPSAoaiAmIG1hc2szTFNCKSA8PCAzIHwgaiAmIDc7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgIGogPSAwIHwgeSAqIGNvbXBvbmVudFNjYWxlWTsKKyAgICAgICAgICBpbmRleCA9IGJsb2Nrc1BlclNjYW5saW5lICogKGogJiBtYXNrM0xTQikgfCAoaiAmIDcpIDw8IDM7CisKKyAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgZGF0YVtvZmZzZXRdID0gb3V0cHV0W2luZGV4ICsgeFNjYWxlQmxvY2tPZmZzZXRbeF1dOworICAgICAgICAgICAgb2Zmc2V0ICs9IG51bUNvbXBvbmVudHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07CisKKyAgICAgIGlmICghaXNTb3VyY2VQREYgJiYgbnVtQ29tcG9uZW50cyA9PT0gNCAmJiAhdHJhbnNmb3JtKSB7CisgICAgICAgIHRyYW5zZm9ybSA9IG5ldyBJbnQzMkFycmF5KFstMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1LCAtMjU2LCAyNTVdKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRyYW5zZm9ybSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDspIHsKKyAgICAgICAgICBmb3IgKGogPSAwLCBrID0gMDsgaiA8IG51bUNvbXBvbmVudHM7IGorKywgaSsrLCBrICs9IDIpIHsKKyAgICAgICAgICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAqIHRyYW5zZm9ybVtrXSA+PiA4KSArIHRyYW5zZm9ybVtrICsgMV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisKKyAgICBnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCkgeworICAgICAgaWYgKHRoaXMuYWRvYmUpIHsKKyAgICAgICAgcmV0dXJuICEhdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzKSB7CisgICAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudHNbMF0uaW5kZXggPT09IDB4NTIgJiYgdGhpcy5jb21wb25lbnRzWzFdLmluZGV4ID09PSAweDQ3ICYmIHRoaXMuY29tcG9uZW50c1syXS5pbmRleCA9PT0gMHg0MikgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgX2NvbnZlcnRZY2NUb1JnYjogZnVuY3Rpb24gY29udmVydFljY1RvUmdiKGRhdGEpIHsKKyAgICAgIHZhciBZLCBDYiwgQ3I7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CisgICAgICAgIFkgPSBkYXRhW2ldOworICAgICAgICBDYiA9IGRhdGFbaSArIDFdOworICAgICAgICBDciA9IGRhdGFbaSArIDJdOworICAgICAgICBkYXRhW2ldID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyOworICAgICAgICBkYXRhW2kgKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CisgICAgICAgIGRhdGFbaSArIDJdID0gWSAtIDIyNi44MTYgKyAxLjc3MiAqIENiOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YTsKKyAgICB9LAorICAgIF9jb252ZXJ0WWNja1RvUmdiOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvUmdiKGRhdGEpIHsKKyAgICAgIHZhciBZLCBDYiwgQ3IsIGs7CisgICAgICB2YXIgb2Zmc2V0ID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgICAgWSA9IGRhdGFbaV07CisgICAgICAgIENiID0gZGF0YVtpICsgMV07CisgICAgICAgIENyID0gZGF0YVtpICsgMl07CisgICAgICAgIGsgPSBkYXRhW2kgKyAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAtMTIyLjY3MTk1NDA2ODk0ICsgQ2IgKiAoLTYuNjA2MzU2Njk0MjAzNjRlLTUgKiBDYiArIDAuMDAwNDM3MTMwNDc1OTI2MjMyICogQ3IgLSA1LjQwODA2MTAwNjQ1OTllLTUgKiBZICsgMC4wMDA0ODQ0OTc5NzEyMDI4MSAqIGsgLSAwLjE1NDM2MjE1MTg3MTEyNikgKyBDciAqICgtMC4wMDA5NTc5NjQzNzg0NDU3NzMgKiBDciArIDAuMDAwODE3MDc2OTExMzQ2NjI1ICogWSAtIDAuMDA0NzcyNzE0MDU0MDg3NDcgKiBrICsgMS41MzM4MDI1MzIyMTczNCkgKyBZICogKDAuMDAwOTYxMjUwMTg0MTMwNjg4ICogWSAtIDAuMDAyNjYyNTczMzIyODM5MzMgKiBrICsgMC40ODM1NzA4ODQ1MTI2NSkgKyBrICogKC0wLjAwMDMzNjE5NzE3NzYxODM5NCAqIGsgKyAwLjQ4NDc5MTU2MTQ5MDc3Nik7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMTA3LjI2ODAzOTM5NzcyNCArIENiICogKDIuMTk5MjcxMDQ1MjU3NDFlLTUgKiBDYiAtIDAuMDAwNjQwOTkyMDE4Mjk3OTQ1ICogQ3IgKyAwLjAwMDY1OTM5NzAwMTI0NTU3NyAqIFkgKyAwLjAwMDQyNjEwNTY1MjkzODgzNyAqIGsgLSAwLjE3NjQ5MTc5MjQ2Mjg3NSkgKyBDciAqICgtMC4wMDA3NzgyNjk5NDE1MTM2ODMgKiBDciArIDAuMDAxMzA4NzIyNjE0MDgyNzUgKiBZICsgMC4wMDA3NzA0ODI2MzE4MDExMzIgKiBrIC0gMC4xNTEwNTE0OTI3NzU1NjIpICsgWSAqICgwLjAwMTI2OTM1MzY4MTE0ODQzICogWSAtIDAuMDAyNjUwOTAxODkwMTA4OTggKiBrICsgMC4yNTgwMjkxMDIwNjg0NSkgKyBrICogKC0wLjAwMDMxODkxMzExNzU4ODMyOCAqIGsgLSAwLjIxMzc0MjQwMDMyMzY2NSk7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gLTIwLjgxMDAxMjU0Njk0NyArIENiICogKC0wLjAwMDU3MDExNTE5Njk3MzY3NyAqIENiIC0gMi42MzQwOTA1MTAwNDU4OWUtNSAqIENyICsgMC4wMDIwNzQxMDg4MTE1MDEyICogWSAtIDAuMDAyODgyNjAyMzY4NTM0NDIgKiBrICsgMC44MTQyNzI5NjgzNTkyOTUpICsgQ3IgKiAoLTEuNTM0OTYwNTc0NDA5NzVlLTUgKiBDciAtIDAuMDAwMTMyNjg5MDQzOTYxNDQ2ICogWSArIDAuMDAwNTYwODMzNjkxMjQyODEyICogayAtIDAuMTk1MTUyMDI3NTM0MDQ5KSArIFkgKiAoMC4wMDE3NDQxODEzMjkyNzU4MiAqIFkgLSAwLjAwMjU1MjQzMzIxNDM5MzQ3ICogayArIDAuMTE2OTM1MDIwNDY1MTQ1KSArIGsgKiAoLTAuMDAwMzQzNTMxOTk2NTEwNTU1ICogayArIDAuMjQxNjUyNjAyMzI0MDcpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YS5zdWJhcnJheSgwLCBvZmZzZXQpOworICAgIH0sCisgICAgX2NvbnZlcnRZY2NrVG9DbXlrOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7CisgICAgICB2YXIgWSwgQ2IsIENyOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgeworICAgICAgICBZID0gZGF0YVtpXTsKKyAgICAgICAgQ2IgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgQ3IgPSBkYXRhW2kgKyAyXTsKKyAgICAgICAgZGF0YVtpXSA9IDQzNC40NTYgLSBZIC0gMS40MDIgKiBDcjsKKyAgICAgICAgZGF0YVtpICsgMV0gPSAxMTkuNTQxIC0gWSArIDAuMzQ0ICogQ2IgKyAwLjcxNCAqIENyOworICAgICAgICBkYXRhW2kgKyAyXSA9IDQ4MS44MTYgLSBZIC0gMS43NzIgKiBDYjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfSwKKyAgICBfY29udmVydENteWtUb1JnYjogZnVuY3Rpb24gY29udmVydENteWtUb1JnYihkYXRhKSB7CisgICAgICB2YXIgYywgbSwgeSwgazsKKyAgICAgIHZhciBvZmZzZXQgPSAwOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgeworICAgICAgICBjID0gZGF0YVtpXTsKKyAgICAgICAgbSA9IGRhdGFbaSArIDFdOworICAgICAgICB5ID0gZGF0YVtpICsgMl07CisgICAgICAgIGsgPSBkYXRhW2kgKyAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKC0wLjAwMDA2NzQ3MTQ3MDczNjAyNDQxICogYyArIDAuMDAwODM3OTI2MjEyMTAxMzcyNyAqIG0gKyAwLjAwMDI4OTQ3MTgxODg2NDMyOTQgKiB5ICsgMC4wMDMyNjQyMzEwNTc1Mzc4MDYgKiBrIC0gMS4xMTg1NjExODY3MjAzOTM3KSArIG0gKiAoMC4wMDAwMjYzNzQxMDc2MTYwODk0MDUgKiBtIC0gMC4wMDAwODYyNjk0OTE1ODYzODU3MiAqIHkgLSAwLjAwMDI3NDg3NjkwNjc0OTk0OTEgKiBrIC0gMC4wMjE1NTY4ODc5NDk3ODk2NykgKyB5ICogKC0wLjAwMDAzODc4MDk5MjEyODY5MzYzICogeSAtIDAuMDAwMzI2NzgwODI3OTQ4NTI4NiAqIGsgKyAwLjA2ODY3NDIyMzg1OTUzNDUpIC0gayAqICgwLjAwMDMzNjE5NzE3NzYxODM5MzcgKiBrICsgMC43NDMwNjU5MTUxMzQyMjU0KTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKDAuMDAwMTM1OTYzNzI4MTM1ODg4NDggKiBjICsgMC4wMDA5MjQ1MzcxMzI1NzM1ODUgKiBtICsgMC4wMDAxMDU2NzM1OTYxODY4MzU5MyAqIHkgKyAwLjAwMDQ3OTE4NjQ2ODc0MzY1MTIgKiBrIC0gMC4zMTA5Njg5NTg3NTE1ODc1KSArIG0gKiAoLTAuMDAwMjM1NDUzNDYxMDgzNzAzNDQgKiBtICsgMC4wMDAyNzAyODQ1MjUzNTM0NzE0ICogeSArIDAuMDAyMDIwMDMwODk3NzMwNzE1NiAqIGsgLSAwLjc0ODgwNTIxNjcwMTU0OTQpICsgeSAqICgwLjAwMDA2ODM0ODE1OTk4MjM1NjYyICogeSArIDAuMDAwMTUxNjg0NTIzNjM0NjA5NzMgKiBrIC0gMC4wOTc1MTkyNzc3NDcyODkzMykgLSBrICogKDAuMDAwMzE4OTEzMTE3NTg4MzI4MTQgKiBrICsgMC43MzY0ODgzODA3NzMzMTY4KTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKDAuMDAwMDEzNTk4NjUwNDExMzg1MzA3ICogYyArIDAuMDAwMTI0MjM5NTYxNzU0OTA4NTEgKiBtICsgMC4wMDA0NzUxOTg1MDk3NTgzNTg5ICogeSAtIDAuMDAwMDAzNjcyOTMxNzQ3NjYzMDQyMiAqIGsgLSAwLjA1NTYyMTg2OTgwMjY0MDM0KSArIG0gKiAoMC4wMDAxNjE0MTM4MDU5ODcyNDY3NiAqIG0gKyAwLjAwMDk2OTIyMzkxMzA3MjUxODYgKiB5ICsgMC4wMDA3NzgyNjkyNDUwMDM2MjUzICogayAtIDAuNDQwMTUyMzIzNjc1MjY0NjMpICsgeSAqICg1LjA2ODg4MjkxNDA2ODc2OWUtNyAqIHkgKyAwLjAwMTc3NzgzNjkwMTEzNzUwNzEgKiBrIC0gMC43NTkxNDU0NjQ5NzQ5NjA5KSAtIGsgKiAoMC4wMDAzNDM1MzE5OTY1MTA1NTUzICogayArIDAuNzA2Mzc3MDE4NjE2MDE0NCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7CisgICAgfSwKKyAgICBnZXREYXRhOiBmdW5jdGlvbiBnZXREYXRhKF9yZWYzKSB7CisgICAgICB2YXIgd2lkdGggPSBfcmVmMy53aWR0aCwKKyAgICAgICAgICBoZWlnaHQgPSBfcmVmMy5oZWlnaHQsCisgICAgICAgICAgX3JlZjMkZm9yY2VSR0IgPSBfcmVmMy5mb3JjZVJHQiwKKyAgICAgICAgICBmb3JjZVJHQiA9IF9yZWYzJGZvcmNlUkdCID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYzJGZvcmNlUkdCLAorICAgICAgICAgIF9yZWYzJGlzU291cmNlUERGID0gX3JlZjMuaXNTb3VyY2VQREYsCisgICAgICAgICAgaXNTb3VyY2VQREYgPSBfcmVmMyRpc1NvdXJjZVBERiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRpc1NvdXJjZVBERjsKKworICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA+IDQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZSIpOworICAgICAgfQorCisgICAgICB2YXIgZGF0YSA9IHRoaXMuX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCwgaXNTb3VyY2VQREYpOworCisgICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAxICYmIGZvcmNlUkdCKSB7CisgICAgICAgIHZhciBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgICAgIHZhciByZ2JEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGFMZW5ndGggKiAzKTsKKyAgICAgICAgdmFyIG9mZnNldCA9IDA7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIgZ3JheUNvbG9yID0gZGF0YVtpXTsKKyAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKKyAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKKyAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZ2JEYXRhOworICAgICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMgJiYgdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihkYXRhKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSA0KSB7CisgICAgICAgIGlmICh0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCkgeworICAgICAgICAgIGlmIChmb3JjZVJHQikgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2IoZGF0YSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9DbXlrKGRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKGZvcmNlUkdCKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorICB9OworICByZXR1cm4gSnBlZ0ltYWdlOworfSgpOworCitleHBvcnRzLkpwZWdJbWFnZSA9IEpwZWdJbWFnZTsKKworLyoqKi8gfSksCisvKiAxODMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5KcHhJbWFnZSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTsKKwordmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzkpOworCit2YXIgX2FyaXRobWV0aWNfZGVjb2RlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgwKTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9CisKK2Z1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CisKK2Z1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfQorCitmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOyB9IHJldHVybiBzZWxmOyB9CisKK2Z1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQorCitmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9CisKK3ZhciBKcHhFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VFeGNlcHRpb24pIHsKKyAgX2luaGVyaXRzKEpweEVycm9yLCBfQmFzZUV4Y2VwdGlvbik7CisKKyAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKcHhFcnJvcik7CisKKyAgZnVuY3Rpb24gSnB4RXJyb3IobXNnKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpweEVycm9yKTsKKworICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAiSlBYIGVycm9yOiAiLmNvbmNhdChtc2cpKTsKKyAgfQorCisgIHJldHVybiBKcHhFcnJvcjsKK30oX3V0aWwuQmFzZUV4Y2VwdGlvbik7CisKK3ZhciBKcHhJbWFnZSA9IGZ1bmN0aW9uIEpweEltYWdlQ2xvc3VyZSgpIHsKKyAgdmFyIFN1YmJhbmRzR2FpbkxvZzIgPSB7CisgICAgTEw6IDAsCisgICAgTEg6IDEsCisgICAgSEw6IDEsCisgICAgSEg6IDIKKyAgfTsKKworICBmdW5jdGlvbiBKcHhJbWFnZSgpIHsKKyAgICB0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlID0gZmFsc2U7CisgIH0KKworICBKcHhJbWFnZS5wcm90b3R5cGUgPSB7CisgICAgcGFyc2U6IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlKGRhdGEpIHsKKyAgICAgIHZhciBoZWFkID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIDApOworCisgICAgICBpZiAoaGVhZCA9PT0gMHhmZjRmKSB7CisgICAgICAgIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcG9zaXRpb24gPSAwLAorICAgICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoOworCisgICAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGhlYWRlclNpemUgPSA4OworICAgICAgICB2YXIgbGJveCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHZhciB0Ym94ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CisgICAgICAgIHBvc2l0aW9uICs9IGhlYWRlclNpemU7CisKKyAgICAgICAgaWYgKGxib3ggPT09IDEpIHsKKyAgICAgICAgICBsYm94ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSAqIDQyOTQ5NjcyOTYgKyAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KTsKKyAgICAgICAgICBwb3NpdGlvbiArPSA4OworICAgICAgICAgIGhlYWRlclNpemUgKz0gODsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYm94ID09PSAwKSB7CisgICAgICAgICAgbGJveCA9IGxlbmd0aCAtIHBvc2l0aW9uICsgaGVhZGVyU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYm94IDwgaGVhZGVyU2l6ZSkgeworICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiSW52YWxpZCBib3ggZmllbGQgc2l6ZSIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRhdGFMZW5ndGggPSBsYm94IC0gaGVhZGVyU2l6ZTsKKyAgICAgICAgdmFyIGp1bXBEYXRhTGVuZ3RoID0gdHJ1ZTsKKworICAgICAgICBzd2l0Y2ggKHRib3gpIHsKKyAgICAgICAgICBjYXNlIDB4NmE3MDMyNjg6CisgICAgICAgICAgICBqdW1wRGF0YUxlbmd0aCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4NjM2ZjZjNzI6CisgICAgICAgICAgICB2YXIgbWV0aG9kID0gZGF0YVtwb3NpdGlvbl07CisKKyAgICAgICAgICAgIGlmIChtZXRob2QgPT09IDEpIHsKKyAgICAgICAgICAgICAgdmFyIGNvbG9yc3BhY2UgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAzKTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKGNvbG9yc3BhY2UpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5rbm93biBjb2xvcnNwYWNlICIgKyBjb2xvcnNwYWNlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gMikgeworICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIklDQyBwcm9maWxlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4NmE3MDMyNjM6CisgICAgICAgICAgICB0aGlzLnBhcnNlQ29kZXN0cmVhbShkYXRhLCBwb3NpdGlvbiwgcG9zaXRpb24gKyBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDZhNTAyMDIwOgorICAgICAgICAgICAgaWYgKCgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgIT09IDB4MGQwYTg3MGEpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIEpQMiBzaWduYXR1cmUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4NmE1MDFhMWE6CisgICAgICAgICAgY2FzZSAweDY2NzQ3OTcwOgorICAgICAgICAgIGNhc2UgMHg3MjcyNjU3MToKKyAgICAgICAgICBjYXNlIDB4NzI2NTczMjA6CisgICAgICAgICAgY2FzZSAweDY5Njg2NDcyOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdmFyIGhlYWRlclR5cGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRib3ggPj4gMjQgJiAweGZmLCB0Ym94ID4+IDE2ICYgMHhmZiwgdGJveCA+PiA4ICYgMHhmZiwgdGJveCAmIDB4ZmYpOworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnN1cHBvcnRlZCBoZWFkZXIgdHlwZSAiICsgdGJveCArICIgKCIgKyBoZWFkZXJUeXBlICsgIikiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGp1bXBEYXRhTGVuZ3RoKSB7CisgICAgICAgICAgcG9zaXRpb24gKz0gZGF0YUxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgcGFyc2VJbWFnZVByb3BlcnRpZXM6IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlSW1hZ2VQcm9wZXJ0aWVzKHN0cmVhbSkgeworICAgICAgdmFyIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOworCisgICAgICB3aGlsZSAobmV3Qnl0ZSA+PSAwKSB7CisgICAgICAgIHZhciBvbGRCeXRlID0gbmV3Qnl0ZTsKKyAgICAgICAgbmV3Qnl0ZSA9IHN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgIHZhciBjb2RlID0gb2xkQnl0ZSA8PCA4IHwgbmV3Qnl0ZTsKKworICAgICAgICBpZiAoY29kZSA9PT0gMHhmZjUxKSB7CisgICAgICAgICAgc3RyZWFtLnNraXAoNCk7CisgICAgICAgICAgdmFyIFhzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICB2YXIgWXNpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgIHZhciBYT3NpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgIHZhciBZT3NpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgIHN0cmVhbS5za2lwKDE2KTsKKyAgICAgICAgICB2YXIgQ3NpeiA9IHN0cmVhbS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB0aGlzLndpZHRoID0gWHNpeiAtIFhPc2l6OworICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gWXNpeiAtIFlPc2l6OworICAgICAgICAgIHRoaXMuY29tcG9uZW50c0NvdW50ID0gQ3NpejsKKyAgICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSA4OworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk5vIHNpemUgbWFya2VyIGZvdW5kIGluIEpQWCBzdHJlYW0iKTsKKyAgICB9LAorICAgIHBhcnNlQ29kZXN0cmVhbTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIHZhciBjb250ZXh0ID0ge307CisgICAgICB2YXIgZG9Ob3RSZWNvdmVyID0gZmFsc2U7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBwb3NpdGlvbiA9IHN0YXJ0OworCisgICAgICAgIHdoaWxlIChwb3NpdGlvbiArIDEgPCBlbmQpIHsKKyAgICAgICAgICB2YXIgY29kZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB2YXIgbGVuZ3RoID0gMCwKKyAgICAgICAgICAgICAgaiwKKyAgICAgICAgICAgICAgc3FjZCwKKyAgICAgICAgICAgICAgc3BxY2RzLAorICAgICAgICAgICAgICBzcHFjZFNpemUsCisgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCwKKyAgICAgICAgICAgICAgdGlsZTsKKworICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgY2FzZSAweGZmNGY6CisgICAgICAgICAgICAgIGNvbnRleHQubWFpbkhlYWRlciA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmZkOToKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjUxOgorICAgICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgICAgICB2YXIgc2l6ID0ge307CisgICAgICAgICAgICAgIHNpei5Yc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CisgICAgICAgICAgICAgIHNpei5Zc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgOCk7CisgICAgICAgICAgICAgIHNpei5YT3NpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDEyKTsKKyAgICAgICAgICAgICAgc2l6LllPc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMTYpOworICAgICAgICAgICAgICBzaXouWFRzaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAyMCk7CisgICAgICAgICAgICAgIHNpei5ZVHNpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDI0KTsKKyAgICAgICAgICAgICAgc2l6LlhUT3NpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDI4KTsKKyAgICAgICAgICAgICAgc2l6LllUT3NpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDMyKTsKKyAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbiArIDM2KTsKKyAgICAgICAgICAgICAgc2l6LkNzaXogPSBjb21wb25lbnRzQ291bnQ7CisgICAgICAgICAgICAgIHZhciBjb21wb25lbnRzID0gW107CisgICAgICAgICAgICAgIGogPSBwb3NpdGlvbiArIDM4OworCisgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0geworICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAoZGF0YVtqXSAmIDB4N2YpICsgMSwKKyAgICAgICAgICAgICAgICAgIGlzU2lnbmVkOiAhIShkYXRhW2pdICYgMHg4MCksCisgICAgICAgICAgICAgICAgICBYUnNpejogZGF0YVtqICsgMV0sCisgICAgICAgICAgICAgICAgICBZUnNpejogZGF0YVtqICsgMl0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGogKz0gMzsKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGNvbXBvbmVudCwgc2l6KTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnRleHQuU0laID0gc2l6OworICAgICAgICAgICAgICBjb250ZXh0LmNvbXBvbmVudHMgPSBjb21wb25lbnRzOworICAgICAgICAgICAgICBjYWxjdWxhdGVUaWxlR3JpZHMoY29udGV4dCwgY29tcG9uZW50cyk7CisgICAgICAgICAgICAgIGNvbnRleHQuUUNDID0gW107CisgICAgICAgICAgICAgIGNvbnRleHQuQ09DID0gW107CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1YzoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdmFyIHFjZCA9IHt9OworICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyOworICAgICAgICAgICAgICBzcWNkID0gZGF0YVtqKytdOworCisgICAgICAgICAgICAgIHN3aXRjaCAoc3FjZCAmIDB4MWYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSA4OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNRY2QgdmFsdWUgIiArIHNxY2QpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNkLm5vUXVhbnRpemF0aW9uID0gc3BxY2RTaXplID09PSA4OworICAgICAgICAgICAgICBxY2Quc2NhbGFyRXhwb3VuZGVkID0gc2NhbGFyRXhwb3VuZGVkOworICAgICAgICAgICAgICBxY2QuZ3VhcmRCaXRzID0gc3FjZCA+PiA1OworICAgICAgICAgICAgICBzcHFjZHMgPSBbXTsKKworICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgdmFyIHNwcWNkID0ge307CisKKyAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7CisgICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7CisgICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7CisgICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IChkYXRhW2pdICYgMHg3KSA8PCA4IHwgZGF0YVtqICsgMV07CisgICAgICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNkLlNQcWNkcyA9IHNwcWNkczsKKworICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5RQ0QgPSBxY2Q7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0QgPSBxY2Q7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0MgPSBbXTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1ZDoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdmFyIHFjYyA9IHt9OworICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyOworICAgICAgICAgICAgICB2YXIgY3FjYzsKKworICAgICAgICAgICAgICBpZiAoY29udGV4dC5TSVouQ3NpeiA8IDI1NykgeworICAgICAgICAgICAgICAgIGNxY2MgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3FjYyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBqKTsKKyAgICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzcWNkID0gZGF0YVtqKytdOworCisgICAgICAgICAgICAgIHN3aXRjaCAoc3FjZCAmIDB4MWYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSA4OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNRY2QgdmFsdWUgIiArIHNxY2QpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNjLm5vUXVhbnRpemF0aW9uID0gc3BxY2RTaXplID09PSA4OworICAgICAgICAgICAgICBxY2Muc2NhbGFyRXhwb3VuZGVkID0gc2NhbGFyRXhwb3VuZGVkOworICAgICAgICAgICAgICBxY2MuZ3VhcmRCaXRzID0gc3FjZCA+PiA1OworICAgICAgICAgICAgICBzcHFjZHMgPSBbXTsKKworICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgc3BxY2QgPSB7fTsKKworICAgICAgICAgICAgICAgIGlmIChzcHFjZFNpemUgPT09IDgpIHsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2orK10gPj4gMzsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLm11ID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbal0gPj4gMzsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLm11ID0gKGRhdGFbal0gJiAweDcpIDw8IDggfCBkYXRhW2ogKyAxXTsKKyAgICAgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcHFjZHMucHVzaChzcHFjZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBxY2MuU1BxY2RzID0gc3BxY2RzOworCisgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LlFDQ1tjcWNjXSA9IHFjYzsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjcWNjXSA9IHFjYzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1MjoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdmFyIGNvZCA9IHt9OworICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyOworICAgICAgICAgICAgICB2YXIgc2NvZCA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgY29kLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMgPSAhIShzY29kICYgMSk7CisgICAgICAgICAgICAgIGNvZC5zb3BNYXJrZXJVc2VkID0gISEoc2NvZCAmIDIpOworICAgICAgICAgICAgICBjb2QuZXBoTWFya2VyVXNlZCA9ICEhKHNjb2QgJiA0KTsKKyAgICAgICAgICAgICAgY29kLnByb2dyZXNzaW9uT3JkZXIgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC5sYXllcnNDb3VudCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBqKTsKKyAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICBjb2QubXVsdGlwbGVDb21wb25lbnRUcmFuc2Zvcm0gPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC54Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7CisgICAgICAgICAgICAgIGNvZC55Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7CisgICAgICAgICAgICAgIHZhciBibG9ja1N0eWxlID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2Quc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyA9ICEhKGJsb2NrU3R5bGUgJiAxKTsKKyAgICAgICAgICAgICAgY29kLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMgPSAhIShibG9ja1N0eWxlICYgMik7CisgICAgICAgICAgICAgIGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MgPSAhIShibG9ja1N0eWxlICYgNCk7CisgICAgICAgICAgICAgIGNvZC52ZXJ0aWNhbGx5U3RyaXBlID0gISEoYmxvY2tTdHlsZSAmIDgpOworICAgICAgICAgICAgICBjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbiA9ICEhKGJsb2NrU3R5bGUgJiAxNik7CisgICAgICAgICAgICAgIGNvZC5zZWdtZW50YXRpb25TeW1ib2xVc2VkID0gISEoYmxvY2tTdHlsZSAmIDMyKTsKKyAgICAgICAgICAgICAgY29kLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbiA9IGRhdGFbaisrXTsKKworICAgICAgICAgICAgICBpZiAoY29kLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpIHsKKyAgICAgICAgICAgICAgICB2YXIgcHJlY2luY3RzU2l6ZXMgPSBbXTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICsgcG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgIHZhciBwcmVjaW5jdHNTaXplID0gZGF0YVtqKytdOworICAgICAgICAgICAgICAgICAgcHJlY2luY3RzU2l6ZXMucHVzaCh7CisgICAgICAgICAgICAgICAgICAgIFBQeDogcHJlY2luY3RzU2l6ZSAmIDB4ZiwKKyAgICAgICAgICAgICAgICAgICAgUFB5OiBwcmVjaW5jdHNTaXplID4+IDQKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvZC5wcmVjaW5jdHNTaXplcyA9IHByZWNpbmN0c1NpemVzOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIHVuc3VwcG9ydGVkID0gW107CisKKyAgICAgICAgICAgICAgaWYgKGNvZC5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgic2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgicmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcyIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MpIHsKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKCJ0ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb2QudmVydGljYWxseVN0cmlwZSkgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInZlcnRpY2FsbHlTdHJpcGUiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbikgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInByZWRpY3RhYmxlVGVybWluYXRpb24iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZG9Ob3RSZWNvdmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIENPRCBvcHRpb25zICgiICsgdW5zdXBwb3J0ZWQuam9pbigiLCAiKSArICIpIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5DT0QgPSBjb2Q7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0QgPSBjb2Q7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0MgPSBbXTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY5MDoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdGlsZSA9IHt9OworICAgICAgICAgICAgICB0aWxlLmluZGV4ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uICsgMik7CisgICAgICAgICAgICAgIHRpbGUubGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CisgICAgICAgICAgICAgIHRpbGUuZGF0YUVuZCA9IHRpbGUubGVuZ3RoICsgcG9zaXRpb24gLSAyOworICAgICAgICAgICAgICB0aWxlLnBhcnRJbmRleCA9IGRhdGFbcG9zaXRpb24gKyA4XTsKKyAgICAgICAgICAgICAgdGlsZS5wYXJ0c0NvdW50ID0gZGF0YVtwb3NpdGlvbiArIDldOworICAgICAgICAgICAgICBjb250ZXh0Lm1haW5IZWFkZXIgPSBmYWxzZTsKKworICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHsKKyAgICAgICAgICAgICAgICB0aWxlLkNPRCA9IGNvbnRleHQuQ09EOworICAgICAgICAgICAgICAgIHRpbGUuQ09DID0gY29udGV4dC5DT0Muc2xpY2UoMCk7CisgICAgICAgICAgICAgICAgdGlsZS5RQ0QgPSBjb250ZXh0LlFDRDsKKyAgICAgICAgICAgICAgICB0aWxlLlFDQyA9IGNvbnRleHQuUUNDLnNsaWNlKDApOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZSA9IHRpbGU7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY5MzoKKyAgICAgICAgICAgICAgdGlsZSA9IGNvbnRleHQuY3VycmVudFRpbGU7CisKKyAgICAgICAgICAgICAgaWYgKHRpbGUucGFydEluZGV4ID09PSAwKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVRpbGUoY29udGV4dCwgdGlsZS5pbmRleCk7CisgICAgICAgICAgICAgICAgYnVpbGRQYWNrZXRzKGNvbnRleHQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGVuZ3RoID0gdGlsZS5kYXRhRW5kIC0gcG9zaXRpb247CisgICAgICAgICAgICAgIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgcG9zaXRpb24sIGxlbmd0aCk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1NToKKyAgICAgICAgICAgIGNhc2UgMHhmZjU3OgorICAgICAgICAgICAgY2FzZSAweGZmNTg6CisgICAgICAgICAgICBjYXNlIDB4ZmY2NDoKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjUzOgorICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvZGVzdHJlYW0gY29kZSAweEZGNTMgKENPQykgaXMgbm90IGltcGxlbWVudGVkIik7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb2Rlc3RyZWFtIGNvZGU6ICIgKyBjb2RlLnRvU3RyaW5nKDE2KSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGlmIChkb05vdFJlY292ZXIgfHwgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSkgeworICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihlLm1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSlBYOiBUcnlpbmcgdG8gcmVjb3ZlciBmcm9tOiAiICsgZS5tZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLnRpbGVzID0gdHJhbnNmb3JtQ29tcG9uZW50cyhjb250ZXh0KTsKKyAgICAgIHRoaXMud2lkdGggPSBjb250ZXh0LlNJWi5Yc2l6IC0gY29udGV4dC5TSVouWE9zaXo7CisgICAgICB0aGlzLmhlaWdodCA9IGNvbnRleHQuU0laLllzaXogLSBjb250ZXh0LlNJWi5ZT3NpejsKKyAgICAgIHRoaXMuY29tcG9uZW50c0NvdW50ID0gY29udGV4dC5TSVouQ3NpejsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhjb21wb25lbnQsIHNpeikgeworICAgIGNvbXBvbmVudC54MCA9IE1hdGguY2VpbChzaXouWE9zaXogLyBjb21wb25lbnQuWFJzaXopOworICAgIGNvbXBvbmVudC54MSA9IE1hdGguY2VpbChzaXouWHNpeiAvIGNvbXBvbmVudC5YUnNpeik7CisgICAgY29tcG9uZW50LnkwID0gTWF0aC5jZWlsKHNpei5ZT3NpeiAvIGNvbXBvbmVudC5ZUnNpeik7CisgICAgY29tcG9uZW50LnkxID0gTWF0aC5jZWlsKHNpei5Zc2l6IC8gY29tcG9uZW50LllSc2l6KTsKKyAgICBjb21wb25lbnQud2lkdGggPSBjb21wb25lbnQueDEgLSBjb21wb25lbnQueDA7CisgICAgY29tcG9uZW50LmhlaWdodCA9IGNvbXBvbmVudC55MSAtIGNvbXBvbmVudC55MDsKKyAgfQorCisgIGZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVHcmlkcyhjb250ZXh0LCBjb21wb25lbnRzKSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciB0aWxlLAorICAgICAgICB0aWxlcyA9IFtdOworICAgIHZhciBudW1YdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Yc2l6IC0gc2l6LlhUT3NpeikgLyBzaXouWFRzaXopOworICAgIHZhciBudW1ZdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Zc2l6IC0gc2l6LllUT3NpeikgLyBzaXouWVRzaXopOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBudW1ZdGlsZXM7IHErKykgeworICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBudW1YdGlsZXM7IHArKykgeworICAgICAgICB0aWxlID0ge307CisgICAgICAgIHRpbGUudHgwID0gTWF0aC5tYXgoc2l6LlhUT3NpeiArIHAgKiBzaXouWFRzaXosIHNpei5YT3Npeik7CisgICAgICAgIHRpbGUudHkwID0gTWF0aC5tYXgoc2l6LllUT3NpeiArIHEgKiBzaXouWVRzaXosIHNpei5ZT3Npeik7CisgICAgICAgIHRpbGUudHgxID0gTWF0aC5taW4oc2l6LlhUT3NpeiArIChwICsgMSkgKiBzaXouWFRzaXosIHNpei5Yc2l6KTsKKyAgICAgICAgdGlsZS50eTEgPSBNYXRoLm1pbihzaXouWVRPc2l6ICsgKHEgKyAxKSAqIHNpei5ZVHNpeiwgc2l6LllzaXopOworICAgICAgICB0aWxlLndpZHRoID0gdGlsZS50eDEgLSB0aWxlLnR4MDsKKyAgICAgICAgdGlsZS5oZWlnaHQgPSB0aWxlLnR5MSAtIHRpbGUudHkwOworICAgICAgICB0aWxlLmNvbXBvbmVudHMgPSBbXTsKKyAgICAgICAgdGlsZXMucHVzaCh0aWxlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb250ZXh0LnRpbGVzID0gdGlsZXM7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29tcG9uZW50c0NvdW50OyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHRpbGVzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgdmFyIHRpbGVDb21wb25lbnQgPSB7fTsKKyAgICAgICAgdGlsZSA9IHRpbGVzW2pdOworICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDAgPSBNYXRoLmNlaWwodGlsZS50eDAgLyBjb21wb25lbnQuWFJzaXopOworICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTAgPSBNYXRoLmNlaWwodGlsZS50eTAgLyBjb21wb25lbnQuWVJzaXopOworICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDEgPSBNYXRoLmNlaWwodGlsZS50eDEgLyBjb21wb25lbnQuWFJzaXopOworICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTEgPSBNYXRoLmNlaWwodGlsZS50eTEgLyBjb21wb25lbnQuWVJzaXopOworICAgICAgICB0aWxlQ29tcG9uZW50LndpZHRoID0gdGlsZUNvbXBvbmVudC50Y3gxIC0gdGlsZUNvbXBvbmVudC50Y3gwOworICAgICAgICB0aWxlQ29tcG9uZW50LmhlaWdodCA9IHRpbGVDb21wb25lbnQudGN5MSAtIHRpbGVDb21wb25lbnQudGN5MDsKKyAgICAgICAgdGlsZS5jb21wb25lbnRzW2ldID0gdGlsZUNvbXBvbmVudDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZXRCbG9ja3NEaW1lbnNpb25zKGNvbnRleHQsIGNvbXBvbmVudCwgcikgeworICAgIHZhciBjb2RPckNvYyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7CisgICAgdmFyIHJlc3VsdCA9IHt9OworCisgICAgaWYgKCFjb2RPckNvYy5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7CisgICAgICByZXN1bHQuUFB4ID0gMTU7CisgICAgICByZXN1bHQuUFB5ID0gMTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5QUHggPSBjb2RPckNvYy5wcmVjaW5jdHNTaXplc1tyXS5QUHg7CisgICAgICByZXN1bHQuUFB5ID0gY29kT3JDb2MucHJlY2luY3RzU2l6ZXNbcl0uUFB5OworICAgIH0KKworICAgIHJlc3VsdC54Y2JfID0gciA+IDAgPyBNYXRoLm1pbihjb2RPckNvYy54Y2IsIHJlc3VsdC5QUHggLSAxKSA6IE1hdGgubWluKGNvZE9yQ29jLnhjYiwgcmVzdWx0LlBQeCk7CisgICAgcmVzdWx0LnljYl8gPSByID4gMCA/IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSAtIDEpIDogTWF0aC5taW4oY29kT3JDb2MueWNiLCByZXN1bHQuUFB5KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgZGltZW5zaW9ucykgeworICAgIHZhciBwcmVjaW5jdFdpZHRoID0gMSA8PCBkaW1lbnNpb25zLlBQeDsKKyAgICB2YXIgcHJlY2luY3RIZWlnaHQgPSAxIDw8IGRpbWVuc2lvbnMuUFB5OworICAgIHZhciBpc1plcm9SZXMgPSByZXNvbHV0aW9uLnJlc0xldmVsID09PSAwOworICAgIHZhciBwcmVjaW5jdFdpZHRoSW5TdWJiYW5kID0gMSA8PCBkaW1lbnNpb25zLlBQeCArIChpc1plcm9SZXMgPyAwIDogLTEpOworICAgIHZhciBwcmVjaW5jdEhlaWdodEluU3ViYmFuZCA9IDEgPDwgZGltZW5zaW9ucy5QUHkgKyAoaXNaZXJvUmVzID8gMCA6IC0xKTsKKyAgICB2YXIgbnVtcHJlY2luY3Rzd2lkZSA9IHJlc29sdXRpb24udHJ4MSA+IHJlc29sdXRpb24udHJ4MCA/IE1hdGguY2VpbChyZXNvbHV0aW9uLnRyeDEgLyBwcmVjaW5jdFdpZHRoKSAtIE1hdGguZmxvb3IocmVzb2x1dGlvbi50cngwIC8gcHJlY2luY3RXaWR0aCkgOiAwOworICAgIHZhciBudW1wcmVjaW5jdHNoaWdoID0gcmVzb2x1dGlvbi50cnkxID4gcmVzb2x1dGlvbi50cnkwID8gTWF0aC5jZWlsKHJlc29sdXRpb24udHJ5MSAvIHByZWNpbmN0SGVpZ2h0KSAtIE1hdGguZmxvb3IocmVzb2x1dGlvbi50cnkwIC8gcHJlY2luY3RIZWlnaHQpIDogMDsKKyAgICB2YXIgbnVtcHJlY2luY3RzID0gbnVtcHJlY2luY3Rzd2lkZSAqIG51bXByZWNpbmN0c2hpZ2g7CisgICAgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMgPSB7CisgICAgICBwcmVjaW5jdFdpZHRoOiBwcmVjaW5jdFdpZHRoLAorICAgICAgcHJlY2luY3RIZWlnaHQ6IHByZWNpbmN0SGVpZ2h0LAorICAgICAgbnVtcHJlY2luY3Rzd2lkZTogbnVtcHJlY2luY3Rzd2lkZSwKKyAgICAgIG51bXByZWNpbmN0c2hpZ2g6IG51bXByZWNpbmN0c2hpZ2gsCisgICAgICBudW1wcmVjaW5jdHM6IG51bXByZWNpbmN0cywKKyAgICAgIHByZWNpbmN0V2lkdGhJblN1YmJhbmQ6IHByZWNpbmN0V2lkdGhJblN1YmJhbmQsCisgICAgICBwcmVjaW5jdEhlaWdodEluU3ViYmFuZDogcHJlY2luY3RIZWlnaHRJblN1YmJhbmQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGRpbWVuc2lvbnMpIHsKKyAgICB2YXIgeGNiXyA9IGRpbWVuc2lvbnMueGNiXzsKKyAgICB2YXIgeWNiXyA9IGRpbWVuc2lvbnMueWNiXzsKKyAgICB2YXIgY29kZWJsb2NrV2lkdGggPSAxIDw8IHhjYl87CisgICAgdmFyIGNvZGVibG9ja0hlaWdodCA9IDEgPDwgeWNiXzsKKyAgICB2YXIgY2J4MCA9IHN1YmJhbmQudGJ4MCA+PiB4Y2JfOworICAgIHZhciBjYnkwID0gc3ViYmFuZC50YnkwID4+IHljYl87CisgICAgdmFyIGNieDEgPSBzdWJiYW5kLnRieDEgKyBjb2RlYmxvY2tXaWR0aCAtIDEgPj4geGNiXzsKKyAgICB2YXIgY2J5MSA9IHN1YmJhbmQudGJ5MSArIGNvZGVibG9ja0hlaWdodCAtIDEgPj4geWNiXzsKKyAgICB2YXIgcHJlY2luY3RQYXJhbWV0ZXJzID0gc3ViYmFuZC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVyczsKKyAgICB2YXIgY29kZWJsb2NrcyA9IFtdOworICAgIHZhciBwcmVjaW5jdHMgPSBbXTsKKyAgICB2YXIgaSwgaiwgY29kZWJsb2NrLCBwcmVjaW5jdE51bWJlcjsKKworICAgIGZvciAoaiA9IGNieTA7IGogPCBjYnkxOyBqKyspIHsKKyAgICAgIGZvciAoaSA9IGNieDA7IGkgPCBjYngxOyBpKyspIHsKKyAgICAgICAgY29kZWJsb2NrID0geworICAgICAgICAgIGNieDogaSwKKyAgICAgICAgICBjYnk6IGosCisgICAgICAgICAgdGJ4MDogY29kZWJsb2NrV2lkdGggKiBpLAorICAgICAgICAgIHRieTA6IGNvZGVibG9ja0hlaWdodCAqIGosCisgICAgICAgICAgdGJ4MTogY29kZWJsb2NrV2lkdGggKiAoaSArIDEpLAorICAgICAgICAgIHRieTE6IGNvZGVibG9ja0hlaWdodCAqIChqICsgMSkKKyAgICAgICAgfTsKKyAgICAgICAgY29kZWJsb2NrLnRieDBfID0gTWF0aC5tYXgoc3ViYmFuZC50YngwLCBjb2RlYmxvY2sudGJ4MCk7CisgICAgICAgIGNvZGVibG9jay50YnkwXyA9IE1hdGgubWF4KHN1YmJhbmQudGJ5MCwgY29kZWJsb2NrLnRieTApOworICAgICAgICBjb2RlYmxvY2sudGJ4MV8gPSBNYXRoLm1pbihzdWJiYW5kLnRieDEsIGNvZGVibG9jay50YngxKTsKKyAgICAgICAgY29kZWJsb2NrLnRieTFfID0gTWF0aC5taW4oc3ViYmFuZC50YnkxLCBjb2RlYmxvY2sudGJ5MSk7CisgICAgICAgIHZhciBwaSA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YngwXyAtIHN1YmJhbmQudGJ4MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aEluU3ViYmFuZCk7CisgICAgICAgIHZhciBwaiA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YnkwXyAtIHN1YmJhbmQudGJ5MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHRJblN1YmJhbmQpOworICAgICAgICBwcmVjaW5jdE51bWJlciA9IHBpICsgcGogKiBwcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTsKKyAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyID0gcHJlY2luY3ROdW1iZXI7CisgICAgICAgIGNvZGVibG9jay5zdWJiYW5kVHlwZSA9IHN1YmJhbmQudHlwZTsKKyAgICAgICAgY29kZWJsb2NrLkxibG9jayA9IDM7CisKKyAgICAgICAgaWYgKGNvZGVibG9jay50YngxXyA8PSBjb2RlYmxvY2sudGJ4MF8gfHwgY29kZWJsb2NrLnRieTFfIDw9IGNvZGVibG9jay50YnkwXykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7CisgICAgICAgIHZhciBwcmVjaW5jdCA9IHByZWNpbmN0c1twcmVjaW5jdE51bWJlcl07CisKKyAgICAgICAgaWYgKHByZWNpbmN0ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBpZiAoaSA8IHByZWNpbmN0LmNieE1pbikgeworICAgICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gaTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBwcmVjaW5jdC5jYnhNYXgpIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1heCA9IGk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGogPCBwcmVjaW5jdC5jYnlNaW4pIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1pbiA9IGo7CisgICAgICAgICAgfSBlbHNlIGlmIChqID4gcHJlY2luY3QuY2J5TWF4KSB7CisgICAgICAgICAgICBwcmVjaW5jdC5jYnlNYXggPSBqOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmVjaW5jdHNbcHJlY2luY3ROdW1iZXJdID0gcHJlY2luY3QgPSB7CisgICAgICAgICAgICBjYnhNaW46IGksCisgICAgICAgICAgICBjYnlNaW46IGosCisgICAgICAgICAgICBjYnhNYXg6IGksCisgICAgICAgICAgICBjYnlNYXg6IGoKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0ID0gcHJlY2luY3Q7CisgICAgICB9CisgICAgfQorCisgICAgc3ViYmFuZC5jb2RlYmxvY2tQYXJhbWV0ZXJzID0geworICAgICAgY29kZWJsb2NrV2lkdGg6IHhjYl8sCisgICAgICBjb2RlYmxvY2tIZWlnaHQ6IHljYl8sCisgICAgICBudW1jb2RlYmxvY2t3aWRlOiBjYngxIC0gY2J4MCArIDEsCisgICAgICBudW1jb2RlYmxvY2toaWdoOiBjYnkxIC0gY2J5MCArIDEKKyAgICB9OworICAgIHN1YmJhbmQuY29kZWJsb2NrcyA9IGNvZGVibG9ja3M7CisgICAgc3ViYmFuZC5wcmVjaW5jdHMgPSBwcmVjaW5jdHM7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcHJlY2luY3ROdW1iZXIsIGxheWVyTnVtYmVyKSB7CisgICAgdmFyIHByZWNpbmN0Q29kZWJsb2NrcyA9IFtdOworICAgIHZhciBzdWJiYW5kcyA9IHJlc29sdXRpb24uc3ViYmFuZHM7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdWJiYW5kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgc3ViYmFuZCA9IHN1YmJhbmRzW2ldOworICAgICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGNvZGVibG9ja3MubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICB2YXIgY29kZWJsb2NrID0gY29kZWJsb2Nrc1tqXTsKKworICAgICAgICBpZiAoY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyICE9PSBwcmVjaW5jdE51bWJlcikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJlY2luY3RDb2RlYmxvY2tzLnB1c2goY29kZWJsb2NrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgbGF5ZXJOdW1iZXI6IGxheWVyTnVtYmVyLAorICAgICAgY29kZWJsb2NrczogcHJlY2luY3RDb2RlYmxvY2tzCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBjb21wb25lbnRzQ291bnQ7IHErKykgeworICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CisgICAgfQorCisgICAgdmFyIGwgPSAwLAorICAgICAgICByID0gMCwKKyAgICAgICAgaSA9IDAsCisgICAgICAgIGsgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7IGwrKykgeworICAgICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgeworICAgICAgICAgIGZvciAoOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbaV07CisKKyAgICAgICAgICAgIGlmIChyID4gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgdmFyIG51bXByZWNpbmN0cyA9IHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0czsKKworICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7KSB7CisgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7CisgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICByID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gMDsKKworICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHsKKyAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCwgdGlsZS5jb21wb25lbnRzW3FdLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpOworICAgIH0KKworICAgIHZhciByID0gMCwKKyAgICAgICAgbCA9IDAsCisgICAgICAgIGkgPSAwLAorICAgICAgICBrID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgeworICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHsKKyAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldOworCisgICAgICAgICAgICBpZiAociA+IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKKyAgICAgICAgICAgIHZhciBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CisKKyAgICAgICAgICAgIGZvciAoOyBrIDwgbnVtcHJlY2luY3RzOykgeworICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpOworICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGsgPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbCA9IDA7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihjb250ZXh0KSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIGwsIHIsIGMsIHA7CisgICAgdmFyIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IDA7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBNYXRoLm1heChtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KTsKKyAgICB9CisKKyAgICB2YXIgbWF4TnVtUHJlY2luY3RzSW5MZXZlbCA9IG5ldyBJbnQzMkFycmF5KG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCArIDEpOworCisgICAgZm9yIChyID0gMDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7ICsrcikgeworICAgICAgdmFyIG1heE51bVByZWNpbmN0cyA9IDA7CisKKyAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7ICsrYykgeworICAgICAgICB2YXIgcmVzb2x1dGlvbnMgPSB0aWxlLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnM7CisKKyAgICAgICAgaWYgKHIgPCByZXNvbHV0aW9ucy5sZW5ndGgpIHsKKyAgICAgICAgICBtYXhOdW1QcmVjaW5jdHMgPSBNYXRoLm1heChtYXhOdW1QcmVjaW5jdHMsIHJlc29sdXRpb25zW3JdLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1heE51bVByZWNpbmN0c0luTGV2ZWxbcl0gPSBtYXhOdW1QcmVjaW5jdHM7CisgICAgfQorCisgICAgbCA9IDA7CisgICAgciA9IDA7CisgICAgYyA9IDA7CisgICAgcCA9IDA7CisKKyAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgeworICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgZm9yICg7IHAgPCBtYXhOdW1QcmVjaW5jdHNJbkxldmVsW3JdOyBwKyspIHsKKyAgICAgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICAgICAgICB2YXIgX2NvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKworICAgICAgICAgICAgaWYgKHIgPiBfY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gX2NvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKKyAgICAgICAgICAgIHZhciBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CisKKyAgICAgICAgICAgIGlmIChwID49IG51bXByZWNpbmN0cykgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDspIHsKKyAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBwLCBsKTsKKyAgICAgICAgICAgICAgbCsrOworICAgICAgICAgICAgICByZXR1cm4gcGFja2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7CisgICAgdmFyIHByZWNpbmN0c0l0ZXJhdGlvblNpemVzID0gcHJlY2luY3RzU2l6ZXM7CisgICAgdmFyIGwgPSAwLAorICAgICAgICByID0gMCwKKyAgICAgICAgYyA9IDAsCisgICAgICAgIHB4ID0gMCwKKyAgICAgICAgcHkgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyBweSA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bUhpZ2g7IHB5KyspIHsKKyAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykgeworICAgICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisKKyAgICAgICAgICAgIGZvciAoOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgICB2YXIgc2l6ZUluSW1hZ2VTY2FsZSA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHgsIHB5LCBzaXplSW5JbWFnZVNjYWxlLCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB4ID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgcHJlY2luY3RzU2l6ZXMgPSBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpOworICAgIHZhciBsID0gMCwKKyAgICAgICAgciA9IDAsCisgICAgICAgIGMgPSAwLAorICAgICAgICBweCA9IDAsCisgICAgICAgIHB5ID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7CisgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICAgIHZhciBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY107CisgICAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKKworICAgICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7CisgICAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykgeworICAgICAgICAgICAgZm9yICg7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHgsIHB5LCBzaXplSW5JbWFnZVNjYWxlLCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBweCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBweSA9IDA7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHhJbmRleCwgcHlJbmRleCwgc2l6ZUluSW1hZ2VTY2FsZSwgcHJlY2luY3RJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbikgeworICAgIHZhciBwb3NYID0gcHhJbmRleCAqIHByZWNpbmN0SXRlcmF0aW9uU2l6ZXMubWluV2lkdGg7CisgICAgdmFyIHBvc1kgPSBweUluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5IZWlnaHQ7CisKKyAgICBpZiAocG9zWCAlIHNpemVJbkltYWdlU2NhbGUud2lkdGggIT09IDAgfHwgcG9zWSAlIHNpemVJbkltYWdlU2NhbGUuaGVpZ2h0ICE9PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgc3RhcnRQcmVjaW5jdFJvd0luZGV4ID0gcG9zWSAvIHNpemVJbkltYWdlU2NhbGUud2lkdGggKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlOworICAgIHJldHVybiBwb3NYIC8gc2l6ZUluSW1hZ2VTY2FsZS5oZWlnaHQgKyBzdGFydFByZWNpbmN0Um93SW5kZXg7CisgIH0KKworICBmdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpIHsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gdGlsZS5jb21wb25lbnRzLmxlbmd0aDsKKyAgICB2YXIgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFOworICAgIHZhciBtaW5IZWlnaHQgPSBOdW1iZXIuTUFYX1ZBTFVFOworICAgIHZhciBtYXhOdW1XaWRlID0gMDsKKyAgICB2YXIgbWF4TnVtSGlnaCA9IDA7CisgICAgdmFyIHNpemVQZXJDb21wb25lbnQgPSBuZXcgQXJyYXkoY29tcG9uZW50c0NvdW50KTsKKworICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisgICAgICB2YXIgc2l6ZVBlclJlc29sdXRpb24gPSBuZXcgQXJyYXkoZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ICsgMSk7CisgICAgICB2YXIgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgIHZhciBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgIHZhciBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IDA7CisgICAgICB2YXIgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSAwOworICAgICAgdmFyIHNjYWxlID0gMTsKKworICAgICAgZm9yICh2YXIgciA9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgciA+PSAwOyAtLXIpIHsKKyAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgIHZhciB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uID0gc2NhbGUgKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdFdpZHRoOworICAgICAgICB2YXIgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24gPSBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0OworICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1pbihtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsIHdpZHRoQ3VycmVudFJlc29sdXRpb24pOworICAgICAgICBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4obWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24pOworICAgICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IE1hdGgubWF4KG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LCByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlKTsKKyAgICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCwgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzaGlnaCk7CisgICAgICAgIHNpemVQZXJSZXNvbHV0aW9uW3JdID0geworICAgICAgICAgIHdpZHRoOiB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uLAorICAgICAgICAgIGhlaWdodDogaGVpZ2h0Q3VycmVudFJlc29sdXRpb24KKyAgICAgICAgfTsKKyAgICAgICAgc2NhbGUgPDw9IDE7CisgICAgICB9CisKKyAgICAgIG1pbldpZHRoID0gTWF0aC5taW4obWluV2lkdGgsIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCk7CisgICAgICBtaW5IZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQpOworICAgICAgbWF4TnVtV2lkZSA9IE1hdGgubWF4KG1heE51bVdpZGUsIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50KTsKKyAgICAgIG1heE51bUhpZ2ggPSBNYXRoLm1heChtYXhOdW1IaWdoLCBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCk7CisgICAgICBzaXplUGVyQ29tcG9uZW50W2NdID0geworICAgICAgICByZXNvbHV0aW9uczogc2l6ZVBlclJlc29sdXRpb24sCisgICAgICAgIG1pbldpZHRoOiBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1pbkhlaWdodDogbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwKKyAgICAgICAgbWF4TnVtV2lkZTogbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1heE51bUhpZ2g6IG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50CisgICAgICB9OworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBjb21wb25lbnRzOiBzaXplUGVyQ29tcG9uZW50LAorICAgICAgbWluV2lkdGg6IG1pbldpZHRoLAorICAgICAgbWluSGVpZ2h0OiBtaW5IZWlnaHQsCisgICAgICBtYXhOdW1XaWRlOiBtYXhOdW1XaWRlLAorICAgICAgbWF4TnVtSGlnaDogbWF4TnVtSGlnaAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBidWlsZFBhY2tldHMoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisKKyAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OworICAgICAgdmFyIHJlc29sdXRpb25zID0gW107CisgICAgICB2YXIgc3ViYmFuZHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgciA9IDA7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgdmFyIGJsb2Nrc0RpbWVuc2lvbnMgPSBnZXRCbG9ja3NEaW1lbnNpb25zKGNvbnRleHQsIGNvbXBvbmVudCwgcik7CisgICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CisgICAgICAgIHZhciBzY2FsZSA9IDEgPDwgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50IC0gcjsKKyAgICAgICAgcmVzb2x1dGlvbi50cngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnRyeTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7CisgICAgICAgIHJlc29sdXRpb24udHJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTsKKyAgICAgICAgcmVzb2x1dGlvbi50cnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnJlc0xldmVsID0gcjsKKyAgICAgICAgYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgIHJlc29sdXRpb25zLnB1c2gocmVzb2x1dGlvbik7CisgICAgICAgIHZhciBzdWJiYW5kOworCisgICAgICAgIGlmIChyID09PSAwKSB7CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJMTCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIHNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IFtzdWJiYW5kXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgYnNjYWxlID0gMSA8PCBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByICsgMTsKKyAgICAgICAgICB2YXIgcmVzb2x1dGlvblN1YmJhbmRzID0gW107CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJITCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOworICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTsKKyAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHN1YmJhbmQgPSB7fTsKKyAgICAgICAgICBzdWJiYW5kLnR5cGUgPSAiTEgiOworICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKyAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICBzdWJiYW5kID0ge307CisgICAgICAgICAgc3ViYmFuZC50eXBlID0gIkhIIjsKKyAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IHJlc29sdXRpb25TdWJiYW5kczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb21wb25lbnQucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uczsKKyAgICAgIGNvbXBvbmVudC5zdWJiYW5kcyA9IHN1YmJhbmRzOworICAgIH0KKworICAgIHZhciBwcm9ncmVzc2lvbk9yZGVyID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7CisKKyAgICBzd2l0Y2ggKHByb2dyZXNzaW9uT3JkZXIpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvbkxheWVyQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiVW5zdXBwb3J0ZWQgcHJvZ3Jlc3Npb24gb3JkZXIgIi5jb25jYXQocHJvZ3Jlc3Npb25PcmRlcikpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgb2Zmc2V0LCBkYXRhTGVuZ3RoKSB7CisgICAgdmFyIHBvc2l0aW9uID0gMDsKKyAgICB2YXIgYnVmZmVyLAorICAgICAgICBidWZmZXJTaXplID0gMCwKKyAgICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTsKKworICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGNvdW50KSB7CisgICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IGNvdW50KSB7CisgICAgICAgIHZhciBiID0gZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl07CisgICAgICAgIHBvc2l0aW9uKys7CisKKyAgICAgICAgaWYgKHNraXBOZXh0Qml0KSB7CisgICAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDcgfCBiOworICAgICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKKyAgICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCA4IHwgYjsKKyAgICAgICAgICBidWZmZXJTaXplICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYiA9PT0gMHhmZikgeworICAgICAgICAgIHNraXBOZXh0Qml0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBidWZmZXJTaXplIC09IGNvdW50OworICAgICAgcmV0dXJuIGJ1ZmZlciA+Pj4gYnVmZmVyU2l6ZSAmICgxIDw8IGNvdW50KSAtIDE7CisgICAgfQorCisgICAgZnVuY3Rpb24gc2tpcE1hcmtlcklmRXF1YWwodmFsdWUpIHsKKyAgICAgIGlmIChkYXRhW29mZnNldCArIHBvc2l0aW9uIC0gMV0gPT09IDB4ZmYgJiYgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl0gPT09IHZhbHVlKSB7CisgICAgICAgIHNraXBCeXRlcygxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSAweGZmICYmIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb24gKyAxXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgc2tpcEJ5dGVzKDIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIHNraXBCeXRlcyhjb3VudCkgeworICAgICAgcG9zaXRpb24gKz0gY291bnQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKSB7CisgICAgICBidWZmZXJTaXplID0gMDsKKworICAgICAgaWYgKHNraXBOZXh0Qml0KSB7CisgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgIHNraXBOZXh0Qml0ID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVhZENvZGluZ3Bhc3NlcygpIHsKKyAgICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7CisgICAgICAgIHJldHVybiAyOworICAgICAgfQorCisgICAgICB2YXIgdmFsdWUgPSByZWFkQml0cygyKTsKKworICAgICAgaWYgKHZhbHVlIDwgMykgeworICAgICAgICByZXR1cm4gdmFsdWUgKyAzOworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHJlYWRCaXRzKDUpOworCisgICAgICBpZiAodmFsdWUgPCAzMSkgeworICAgICAgICByZXR1cm4gdmFsdWUgKyA2OworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHJlYWRCaXRzKDcpOworICAgICAgcmV0dXJuIHZhbHVlICsgMzc7CisgICAgfQorCisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIHNvcE1hcmtlclVzZWQgPSBjb250ZXh0LkNPRC5zb3BNYXJrZXJVc2VkOworICAgIHZhciBlcGhNYXJrZXJVc2VkID0gY29udGV4dC5DT0QuZXBoTWFya2VyVXNlZDsKKyAgICB2YXIgcGFja2V0c0l0ZXJhdG9yID0gdGlsZS5wYWNrZXRzSXRlcmF0b3I7CisKKyAgICB3aGlsZSAocG9zaXRpb24gPCBkYXRhTGVuZ3RoKSB7CisgICAgICBhbGlnblRvQnl0ZSgpOworCisgICAgICBpZiAoc29wTWFya2VyVXNlZCAmJiBza2lwTWFya2VySWZFcXVhbCgweDkxKSkgeworICAgICAgICBza2lwQnl0ZXMoNCk7CisgICAgICB9CisKKyAgICAgIHZhciBwYWNrZXQgPSBwYWNrZXRzSXRlcmF0b3IubmV4dFBhY2tldCgpOworCisgICAgICBpZiAoIXJlYWRCaXRzKDEpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgbGF5ZXJOdW1iZXIgPSBwYWNrZXQubGF5ZXJOdW1iZXI7CisgICAgICB2YXIgcXVldWUgPSBbXSwKKyAgICAgICAgICBjb2RlYmxvY2s7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhY2tldC5jb2RlYmxvY2tzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29kZWJsb2NrID0gcGFja2V0LmNvZGVibG9ja3NbaV07CisgICAgICAgIHZhciBwcmVjaW5jdCA9IGNvZGVibG9jay5wcmVjaW5jdDsKKyAgICAgICAgdmFyIGNvZGVibG9ja0NvbHVtbiA9IGNvZGVibG9jay5jYnggLSBwcmVjaW5jdC5jYnhNaW47CisgICAgICAgIHZhciBjb2RlYmxvY2tSb3cgPSBjb2RlYmxvY2suY2J5IC0gcHJlY2luY3QuY2J5TWluOworICAgICAgICB2YXIgY29kZWJsb2NrSW5jbHVkZWQgPSBmYWxzZTsKKyAgICAgICAgdmFyIGZpcnN0VGltZUluY2x1c2lvbiA9IGZhbHNlOworICAgICAgICB2YXIgdmFsdWVSZWFkeTsKKworICAgICAgICBpZiAoY29kZWJsb2NrLmluY2x1ZGVkICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBjb2RlYmxvY2tJbmNsdWRlZCA9ICEhcmVhZEJpdHMoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJlY2luY3QgPSBjb2RlYmxvY2sucHJlY2luY3Q7CisgICAgICAgICAgdmFyIGluY2x1c2lvblRyZWUsIHplcm9CaXRQbGFuZXNUcmVlOworCisgICAgICAgICAgaWYgKHByZWNpbmN0LmluY2x1c2lvblRyZWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgaW5jbHVzaW9uVHJlZSA9IHByZWNpbmN0LmluY2x1c2lvblRyZWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciB3aWR0aCA9IHByZWNpbmN0LmNieE1heCAtIHByZWNpbmN0LmNieE1pbiArIDE7CisgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcHJlY2luY3QuY2J5TWF4IC0gcHJlY2luY3QuY2J5TWluICsgMTsKKyAgICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBuZXcgSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBsYXllck51bWJlcik7CisgICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IG5ldyBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgcHJlY2luY3QuaW5jbHVzaW9uVHJlZSA9IGluY2x1c2lvblRyZWU7CisgICAgICAgICAgICBwcmVjaW5jdC56ZXJvQml0UGxhbmVzVHJlZSA9IHplcm9CaXRQbGFuZXNUcmVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpbmNsdXNpb25UcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93LCBsYXllck51bWJlcikpIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgeworICAgICAgICAgICAgICAgIHZhbHVlUmVhZHkgPSAhaW5jbHVzaW9uVHJlZS5uZXh0TGV2ZWwoKTsKKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CisgICAgICAgICAgICAgICAgICBjb2RlYmxvY2suaW5jbHVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgY29kZWJsb2NrSW5jbHVkZWQgPSBmaXJzdFRpbWVJbmNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluY2x1c2lvblRyZWUuaW5jcmVtZW50VmFsdWUobGF5ZXJOdW1iZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb2RlYmxvY2tJbmNsdWRlZCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0VGltZUluY2x1c2lvbikgeworICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlID0gcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWU7CisgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUucmVzZXQoY29kZWJsb2NrQ29sdW1uLCBjb2RlYmxvY2tSb3cpOworCisgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgeworICAgICAgICAgICAgICB2YWx1ZVJlYWR5ID0gIXplcm9CaXRQbGFuZXNUcmVlLm5leHRMZXZlbCgpOworCisgICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlLmluY3JlbWVudFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMgPSB6ZXJvQml0UGxhbmVzVHJlZS52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBjb2RpbmdwYXNzZXMgPSByZWFkQ29kaW5ncGFzc2VzKCk7CisKKyAgICAgICAgd2hpbGUgKHJlYWRCaXRzKDEpKSB7CisgICAgICAgICAgY29kZWJsb2NrLkxibG9jaysrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNvZGluZ3Bhc3Nlc0xvZzIgPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoY29kaW5ncGFzc2VzKTsKKyAgICAgICAgdmFyIGJpdHMgPSAoY29kaW5ncGFzc2VzIDwgMSA8PCBjb2RpbmdwYXNzZXNMb2cyID8gY29kaW5ncGFzc2VzTG9nMiAtIDEgOiBjb2RpbmdwYXNzZXNMb2cyKSArIGNvZGVibG9jay5MYmxvY2s7CisgICAgICAgIHZhciBjb2RlZERhdGFMZW5ndGggPSByZWFkQml0cyhiaXRzKTsKKyAgICAgICAgcXVldWUucHVzaCh7CisgICAgICAgICAgY29kZWJsb2NrOiBjb2RlYmxvY2ssCisgICAgICAgICAgY29kaW5ncGFzc2VzOiBjb2RpbmdwYXNzZXMsCisgICAgICAgICAgZGF0YUxlbmd0aDogY29kZWREYXRhTGVuZ3RoCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBhbGlnblRvQnl0ZSgpOworCisgICAgICBpZiAoZXBoTWFya2VyVXNlZCkgeworICAgICAgICBza2lwTWFya2VySWZFcXVhbCgweDkyKTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdmFyIHBhY2tldEl0ZW0gPSBxdWV1ZS5zaGlmdCgpOworICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXRJdGVtLmNvZGVibG9jazsKKworICAgICAgICBpZiAoY29kZWJsb2NrLmRhdGEgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGNvZGVibG9jay5kYXRhID0gW107CisgICAgICAgIH0KKworICAgICAgICBjb2RlYmxvY2suZGF0YS5wdXNoKHsKKyAgICAgICAgICBkYXRhOiBkYXRhLAorICAgICAgICAgIHN0YXJ0OiBvZmZzZXQgKyBwb3NpdGlvbiwKKyAgICAgICAgICBlbmQ6IG9mZnNldCArIHBvc2l0aW9uICsgcGFja2V0SXRlbS5kYXRhTGVuZ3RoLAorICAgICAgICAgIGNvZGluZ3Bhc3NlczogcGFja2V0SXRlbS5jb2RpbmdwYXNzZXMKKyAgICAgICAgfSk7CisgICAgICAgIHBvc2l0aW9uICs9IHBhY2tldEl0ZW0uZGF0YUxlbmd0aDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcG9zaXRpb247CisgIH0KKworICBmdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKGNvZWZmaWNpZW50cywgbGV2ZWxXaWR0aCwgbGV2ZWxIZWlnaHQsIHN1YmJhbmQsIGRlbHRhLCBtYiwgcmV2ZXJzaWJsZSwgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCkgeworICAgIHZhciB4MCA9IHN1YmJhbmQudGJ4MDsKKyAgICB2YXIgeTAgPSBzdWJiYW5kLnRieTA7CisgICAgdmFyIHdpZHRoID0gc3ViYmFuZC50YngxIC0gc3ViYmFuZC50YngwOworICAgIHZhciBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzOworICAgIHZhciByaWdodCA9IHN1YmJhbmQudHlwZS5jaGFyQXQoMCkgPT09ICJIIiA/IDEgOiAwOworICAgIHZhciBib3R0b20gPSBzdWJiYW5kLnR5cGUuY2hhckF0KDEpID09PSAiSCIgPyBsZXZlbFdpZHRoIDogMDsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgdmFyIGNvZGVibG9jayA9IGNvZGVibG9ja3NbaV07CisgICAgICB2YXIgYmxvY2tXaWR0aCA9IGNvZGVibG9jay50YngxXyAtIGNvZGVibG9jay50YngwXzsKKyAgICAgIHZhciBibG9ja0hlaWdodCA9IGNvZGVibG9jay50YnkxXyAtIGNvZGVibG9jay50YnkwXzsKKworICAgICAgaWYgKGJsb2NrV2lkdGggPT09IDAgfHwgYmxvY2tIZWlnaHQgPT09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjb2RlYmxvY2suZGF0YSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgYml0TW9kZWwsIGN1cnJlbnRDb2RpbmdwYXNzVHlwZTsKKyAgICAgIGJpdE1vZGVsID0gbmV3IEJpdE1vZGVsKGJsb2NrV2lkdGgsIGJsb2NrSGVpZ2h0LCBjb2RlYmxvY2suc3ViYmFuZFR5cGUsIGNvZGVibG9jay56ZXJvQml0UGxhbmVzLCBtYik7CisgICAgICBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAyOworICAgICAgdmFyIGRhdGEgPSBjb2RlYmxvY2suZGF0YSwKKyAgICAgICAgICB0b3RhbExlbmd0aCA9IDAsCisgICAgICAgICAgY29kaW5ncGFzc2VzID0gMDsKKyAgICAgIHZhciBqLCBqaiwgZGF0YUl0ZW07CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTsKKyAgICAgICAgdG90YWxMZW5ndGggKz0gZGF0YUl0ZW0uZW5kIC0gZGF0YUl0ZW0uc3RhcnQ7CisgICAgICAgIGNvZGluZ3Bhc3NlcyArPSBkYXRhSXRlbS5jb2RpbmdwYXNzZXM7CisgICAgICB9CisKKyAgICAgIHZhciBlbmNvZGVkRGF0YSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKKyAgICAgIHZhciBwb3NpdGlvbiA9IDA7CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTsKKyAgICAgICAgdmFyIGNodW5rID0gZGF0YUl0ZW0uZGF0YS5zdWJhcnJheShkYXRhSXRlbS5zdGFydCwgZGF0YUl0ZW0uZW5kKTsKKyAgICAgICAgZW5jb2RlZERhdGEuc2V0KGNodW5rLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IGNodW5rLmxlbmd0aDsKKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kZXIgPSBuZXcgX2FyaXRobWV0aWNfZGVjb2Rlci5Bcml0aG1ldGljRGVjb2RlcihlbmNvZGVkRGF0YSwgMCwgdG90YWxMZW5ndGgpOworICAgICAgYml0TW9kZWwuc2V0RGVjb2RlcihkZWNvZGVyKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGluZ3Bhc3NlczsgaisrKSB7CisgICAgICAgIHN3aXRjaCAoY3VycmVudENvZGluZ3Bhc3NUeXBlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgYml0TW9kZWwucnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGJpdE1vZGVsLnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGJpdE1vZGVsLnJ1bkNsZWFudXBQYXNzKCk7CisKKyAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25TeW1ib2xVc2VkKSB7CisgICAgICAgICAgICAgIGJpdE1vZGVsLmNoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudENvZGluZ3Bhc3NUeXBlID0gKGN1cnJlbnRDb2RpbmdwYXNzVHlwZSArIDEpICUgMzsKKyAgICAgIH0KKworICAgICAgdmFyIG9mZnNldCA9IGNvZGVibG9jay50YngwXyAtIHgwICsgKGNvZGVibG9jay50YnkwXyAtIHkwKSAqIHdpZHRoOworICAgICAgdmFyIHNpZ24gPSBiaXRNb2RlbC5jb2VmZmljZW50c1NpZ247CisgICAgICB2YXIgbWFnbml0dWRlID0gYml0TW9kZWwuY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICB2YXIgYml0c0RlY29kZWQgPSBiaXRNb2RlbC5iaXRzRGVjb2RlZDsKKyAgICAgIHZhciBtYWduaXR1ZGVDb3JyZWN0aW9uID0gcmV2ZXJzaWJsZSA/IDAgOiAwLjU7CisgICAgICB2YXIgaywgbiwgbmI7CisgICAgICBwb3NpdGlvbiA9IDA7CisgICAgICB2YXIgaW50ZXJsZWF2ZSA9IHN1YmJhbmQudHlwZSAhPT0gIkxMIjsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2NrSGVpZ2h0OyBqKyspIHsKKyAgICAgICAgdmFyIHJvdyA9IG9mZnNldCAvIHdpZHRoIHwgMDsKKyAgICAgICAgdmFyIGxldmVsT2Zmc2V0ID0gMiAqIHJvdyAqIChsZXZlbFdpZHRoIC0gd2lkdGgpICsgcmlnaHQgKyBib3R0b207CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGJsb2NrV2lkdGg7IGsrKykgeworICAgICAgICAgIG4gPSBtYWduaXR1ZGVbcG9zaXRpb25dOworCisgICAgICAgICAgaWYgKG4gIT09IDApIHsKKyAgICAgICAgICAgIG4gPSAobiArIG1hZ25pdHVkZUNvcnJlY3Rpb24pICogZGVsdGE7CisKKyAgICAgICAgICAgIGlmIChzaWduW3Bvc2l0aW9uXSAhPT0gMCkgeworICAgICAgICAgICAgICBuID0gLW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5iID0gYml0c0RlY29kZWRbcG9zaXRpb25dOworICAgICAgICAgICAgdmFyIHBvcyA9IGludGVybGVhdmUgPyBsZXZlbE9mZnNldCArIChvZmZzZXQgPDwgMSkgOiBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChyZXZlcnNpYmxlICYmIG5iID49IG1iKSB7CisgICAgICAgICAgICAgIGNvZWZmaWNpZW50c1twb3NdID0gbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNvZWZmaWNpZW50c1twb3NdID0gbiAqICgxIDw8IG1iIC0gbmIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gd2lkdGggLSBibG9ja1dpZHRoOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYykgeworICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgdmFyIGNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7CisgICAgdmFyIHF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVyczsKKyAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKKyAgICB2YXIgc3BxY2RzID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5TUHFjZHM7CisgICAgdmFyIHNjYWxhckV4cG91bmRlZCA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuc2NhbGFyRXhwb3VuZGVkOworICAgIHZhciBndWFyZEJpdHMgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLmd1YXJkQml0czsKKyAgICB2YXIgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCA9IGNvZGluZ1N0eWxlUGFyYW1ldGVycy5zZWdtZW50YXRpb25TeW1ib2xVc2VkOworICAgIHZhciBwcmVjaXNpb24gPSBjb250ZXh0LmNvbXBvbmVudHNbY10ucHJlY2lzaW9uOworICAgIHZhciByZXZlcnNpYmxlID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbjsKKyAgICB2YXIgdHJhbnNmb3JtID0gcmV2ZXJzaWJsZSA/IG5ldyBSZXZlcnNpYmxlVHJhbnNmb3JtKCkgOiBuZXcgSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCk7CisgICAgdmFyIHN1YmJhbmRDb2VmZmljaWVudHMgPSBbXTsKKyAgICB2YXIgYiA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IGkrKykgeworICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbaV07CisgICAgICB2YXIgd2lkdGggPSByZXNvbHV0aW9uLnRyeDEgLSByZXNvbHV0aW9uLnRyeDA7CisgICAgICB2YXIgaGVpZ2h0ID0gcmVzb2x1dGlvbi50cnkxIC0gcmVzb2x1dGlvbi50cnkwOworICAgICAgdmFyIGNvZWZmaWNpZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiBoZWlnaHQpOworCisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSByZXNvbHV0aW9uLnN1YmJhbmRzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgdmFyIG11LCBlcHNpbG9uOworCisgICAgICAgIGlmICghc2NhbGFyRXhwb3VuZGVkKSB7CisgICAgICAgICAgbXUgPSBzcHFjZHNbMF0ubXU7CisgICAgICAgICAgZXBzaWxvbiA9IHNwcWNkc1swXS5lcHNpbG9uICsgKGkgPiAwID8gMSAtIGkgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtdSA9IHNwcWNkc1tiXS5tdTsKKyAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzW2JdLmVwc2lsb247CisgICAgICAgICAgYisrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN1YmJhbmQgPSByZXNvbHV0aW9uLnN1YmJhbmRzW2pdOworICAgICAgICB2YXIgZ2FpbkxvZzIgPSBTdWJiYW5kc0dhaW5Mb2cyW3N1YmJhbmQudHlwZV07CisgICAgICAgIHZhciBkZWx0YSA9IHJldmVyc2libGUgPyAxIDogTWF0aC5wb3coMiwgcHJlY2lzaW9uICsgZ2FpbkxvZzIgLSBlcHNpbG9uKSAqICgxICsgbXUgLyAyMDQ4KTsKKyAgICAgICAgdmFyIG1iID0gZ3VhcmRCaXRzICsgZXBzaWxvbiAtIDE7CisgICAgICAgIGNvcHlDb2VmZmljaWVudHMoY29lZmZpY2llbnRzLCB3aWR0aCwgaGVpZ2h0LCBzdWJiYW5kLCBkZWx0YSwgbWIsIHJldmVyc2libGUsIHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpOworICAgICAgfQorCisgICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLnB1c2goeworICAgICAgICB3aWR0aDogd2lkdGgsCisgICAgICAgIGhlaWdodDogaGVpZ2h0LAorICAgICAgICBpdGVtczogY29lZmZpY2llbnRzCisgICAgICB9KTsKKyAgICB9CisKKyAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtLmNhbGN1bGF0ZShzdWJiYW5kQ29lZmZpY2llbnRzLCBjb21wb25lbnQudGN4MCwgY29tcG9uZW50LnRjeTApOworICAgIHJldHVybiB7CisgICAgICBsZWZ0OiBjb21wb25lbnQudGN4MCwKKyAgICAgIHRvcDogY29tcG9uZW50LnRjeTAsCisgICAgICB3aWR0aDogcmVzdWx0LndpZHRoLAorICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LAorICAgICAgaXRlbXM6IHJlc3VsdC5pdGVtcworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB0cmFuc2Zvcm1Db21wb25lbnRzKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIGNvbXBvbmVudHMgPSBjb250ZXh0LmNvbXBvbmVudHM7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciByZXN1bHRJbWFnZXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbnRleHQudGlsZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW2ldOworICAgICAgdmFyIHRyYW5zZm9ybWVkVGlsZXMgPSBbXTsKKyAgICAgIHZhciBjOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgdHJhbnNmb3JtZWRUaWxlc1tjXSA9IHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYyk7CisgICAgICB9CisKKyAgICAgIHZhciB0aWxlMCA9IHRyYW5zZm9ybWVkVGlsZXNbMF07CisgICAgICB2YXIgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRpbGUwLml0ZW1zLmxlbmd0aCAqIGNvbXBvbmVudHNDb3VudCk7CisgICAgICB2YXIgcmVzdWx0ID0geworICAgICAgICBsZWZ0OiB0aWxlMC5sZWZ0LAorICAgICAgICB0b3A6IHRpbGUwLnRvcCwKKyAgICAgICAgd2lkdGg6IHRpbGUwLndpZHRoLAorICAgICAgICBoZWlnaHQ6IHRpbGUwLmhlaWdodCwKKyAgICAgICAgaXRlbXM6IG91dAorICAgICAgfTsKKyAgICAgIHZhciBzaGlmdCwgb2Zmc2V0OworICAgICAgdmFyIHBvcyA9IDAsCisgICAgICAgICAgaiwKKyAgICAgICAgICBqaiwKKyAgICAgICAgICB5MCwKKyAgICAgICAgICB5MSwKKyAgICAgICAgICB5MjsKKworICAgICAgaWYgKHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSkgeworICAgICAgICB2YXIgZm91ckNvbXBvbmVudHMgPSBjb21wb25lbnRzQ291bnQgPT09IDQ7CisgICAgICAgIHZhciB5MGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1swXS5pdGVtczsKKyAgICAgICAgdmFyIHkxaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzFdLml0ZW1zOworICAgICAgICB2YXIgeTJpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMl0uaXRlbXM7CisgICAgICAgIHZhciB5M2l0ZW1zID0gZm91ckNvbXBvbmVudHMgPyB0cmFuc2Zvcm1lZFRpbGVzWzNdLml0ZW1zIDogbnVsbDsKKyAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzWzBdLnByZWNpc2lvbiAtIDg7CisgICAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41OworICAgICAgICB2YXIgY29tcG9uZW50MCA9IHRpbGUuY29tcG9uZW50c1swXTsKKyAgICAgICAgdmFyIGFscGhhMDEgPSBjb21wb25lbnRzQ291bnQgLSAzOworICAgICAgICBqaiA9IHkwaXRlbXMubGVuZ3RoOworCisgICAgICAgIGlmICghY29tcG9uZW50MC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7CisgICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7CisgICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07CisgICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07CisgICAgICAgICAgICBvdXRbcG9zKytdID0geTAgKyAxLjQwMiAqIHkyID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IHkwIC0gMC4zNDQxMyAqIHkxIC0gMC43MTQxNCAqIHkyID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IHkwICsgMS43NzIgKiB5MSA+PiBzaGlmdDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7CisgICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7CisgICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07CisgICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07CisgICAgICAgICAgICB2YXIgZyA9IHkwIC0gKHkyICsgeTEgPj4gMik7CisgICAgICAgICAgICBvdXRbcG9zKytdID0gZyArIHkyID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IGcgPj4gc2hpZnQ7CisgICAgICAgICAgICBvdXRbcG9zKytdID0gZyArIHkxID4+IHNoaWZ0OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3VyQ29tcG9uZW50cykgeworICAgICAgICAgIGZvciAoaiA9IDAsIHBvcyA9IDM7IGogPCBqajsgaisrLCBwb3MgKz0gNCkgeworICAgICAgICAgICAgb3V0W3Bvc10gPSB5M2l0ZW1zW2pdICsgb2Zmc2V0ID4+IHNoaWZ0OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICAgICAgdmFyIGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1tjXS5pdGVtczsKKyAgICAgICAgICBzaGlmdCA9IGNvbXBvbmVudHNbY10ucHJlY2lzaW9uIC0gODsKKyAgICAgICAgICBvZmZzZXQgPSAoMTI4IDw8IHNoaWZ0KSArIDAuNTsKKworICAgICAgICAgIGZvciAocG9zID0gYywgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgb3V0W3Bvc10gPSBpdGVtc1tqXSArIG9mZnNldCA+PiBzaGlmdDsKKyAgICAgICAgICAgIHBvcyArPSBjb21wb25lbnRzQ291bnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlc3VsdEltYWdlcy5wdXNoKHJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdEltYWdlczsKKyAgfQorCisgIGZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGNvbnRleHQsIHRpbGVJbmRleCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisKKyAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgdmFyIHFjZE9yUWNjID0gY29udGV4dC5jdXJyZW50VGlsZS5RQ0NbY10gIT09IHVuZGVmaW5lZCA/IGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdIDogY29udGV4dC5jdXJyZW50VGlsZS5RQ0Q7CisgICAgICBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVycyA9IHFjZE9yUWNjOworICAgICAgdmFyIGNvZE9yQ29jID0gY29udGV4dC5jdXJyZW50VGlsZS5DT0NbY10gIT09IHVuZGVmaW5lZCA/IGNvbnRleHQuY3VycmVudFRpbGUuQ09DW2NdIDogY29udGV4dC5jdXJyZW50VGlsZS5DT0Q7CisgICAgICBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzID0gY29kT3JDb2M7CisgICAgfQorCisgICAgdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzID0gY29udGV4dC5jdXJyZW50VGlsZS5DT0Q7CisgIH0KKworICB2YXIgVGFnVHJlZSA9IGZ1bmN0aW9uIFRhZ1RyZWVDbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFRhZ1RyZWUod2lkdGgsIGhlaWdodCkgeworICAgICAgdmFyIGxldmVsc0xlbmd0aCA9ICgwLCBfY29yZV91dGlscy5sb2cyKShNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSkgKyAxOworICAgICAgdGhpcy5sZXZlbHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgbGV2ZWwgPSB7CisgICAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAorICAgICAgICAgIGl0ZW1zOiBbXQorICAgICAgICB9OworICAgICAgICB0aGlzLmxldmVscy5wdXNoKGxldmVsKTsKKyAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwod2lkdGggLyAyKTsKKyAgICAgICAgaGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCAvIDIpOworICAgICAgfQorICAgIH0KKworICAgIFRhZ1RyZWUucHJvdG90eXBlID0geworICAgICAgcmVzZXQ6IGZ1bmN0aW9uIFRhZ1RyZWVfcmVzZXQoaSwgaikgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gMCwKKyAgICAgICAgICAgIHZhbHVlID0gMCwKKyAgICAgICAgICAgIGxldmVsOworCisgICAgICAgIHdoaWxlIChjdXJyZW50TGV2ZWwgPCB0aGlzLmxldmVscy5sZW5ndGgpIHsKKyAgICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgICAgdmFyIGluZGV4ID0gaSArIGogKiBsZXZlbC53aWR0aDsKKworICAgICAgICAgIGlmIChsZXZlbC5pdGVtc1tpbmRleF0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsZXZlbC5pbmRleCA9IGluZGV4OworICAgICAgICAgIGkgPj49IDE7CisgICAgICAgICAgaiA+Pj0gMTsKKyAgICAgICAgICBjdXJyZW50TGV2ZWwrKzsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRMZXZlbC0tOworICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlOworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgZGVsZXRlIHRoaXMudmFsdWU7CisgICAgICB9LAorICAgICAgaW5jcmVtZW50VmFsdWU6IGZ1bmN0aW9uIFRhZ1RyZWVfaW5jcmVtZW50VmFsdWUoKSB7CisgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdKys7CisgICAgICB9LAorICAgICAgbmV4dExldmVsOiBmdW5jdGlvbiBUYWdUcmVlX25leHRMZXZlbCgpIHsKKyAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IHRoaXMuY3VycmVudExldmVsOworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07CisgICAgICAgIGN1cnJlbnRMZXZlbC0tOworCisgICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPCAwKSB7CisgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsOworICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9OworICAgIHJldHVybiBUYWdUcmVlOworICB9KCk7CisKKyAgdmFyIEluY2x1c2lvblRyZWUgPSBmdW5jdGlvbiBJbmNsdXNpb25UcmVlQ2xvc3VyZSgpIHsKKyAgICBmdW5jdGlvbiBJbmNsdXNpb25UcmVlKHdpZHRoLCBoZWlnaHQsIGRlZmF1bHRWYWx1ZSkgeworICAgICAgdmFyIGxldmVsc0xlbmd0aCA9ICgwLCBfY29yZV91dGlscy5sb2cyKShNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSkgKyAxOworICAgICAgdGhpcy5sZXZlbHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgaXRlbXMgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7CisKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgIGl0ZW1zW2pdID0gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxldmVsID0geworICAgICAgICAgIHdpZHRoOiB3aWR0aCwKKyAgICAgICAgICBoZWlnaHQ6IGhlaWdodCwKKyAgICAgICAgICBpdGVtczogaXRlbXMKKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7CisgICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7CisgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBJbmNsdXNpb25UcmVlLnByb3RvdHlwZSA9IHsKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Jlc2V0KGksIGosIHN0b3BWYWx1ZSkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gMDsKKworICAgICAgICB3aGlsZSAoY3VycmVudExldmVsIDwgdGhpcy5sZXZlbHMubGVuZ3RoKSB7CisgICAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoOworICAgICAgICAgIGxldmVsLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgdmFyIHZhbHVlID0gbGV2ZWwuaXRlbXNbaW5kZXhdOworCisgICAgICAgICAgaWYgKHZhbHVlID09PSAweGZmKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodmFsdWUgPiBzdG9wVmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsOworICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpID4+PSAxOworICAgICAgICAgIGogPj49IDE7CisgICAgICAgICAgY3VycmVudExldmVsKys7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbCAtIDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSwKKyAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKHN0b3BWYWx1ZSkgeworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHN0b3BWYWx1ZSArIDE7CisgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7CisgICAgICB9LAorICAgICAgcHJvcGFnYXRlVmFsdWVzOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Byb3BhZ2F0ZVZhbHVlcygpIHsKKyAgICAgICAgdmFyIGxldmVsSW5kZXggPSB0aGlzLmN1cnJlbnRMZXZlbDsKKyAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07CisgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07CisKKyAgICAgICAgd2hpbGUgKC0tbGV2ZWxJbmRleCA+PSAwKSB7CisgICAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tsZXZlbEluZGV4XTsKKyAgICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSBjdXJyZW50VmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBuZXh0TGV2ZWw6IGZ1bmN0aW9uIEluY2x1c2lvblRyZWVfbmV4dExldmVsKCkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gdGhpcy5jdXJyZW50TGV2ZWw7CisgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gMHhmZjsKKyAgICAgICAgY3VycmVudExldmVsLS07CisKKyAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA8IDApIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gSW5jbHVzaW9uVHJlZTsKKyAgfSgpOworCisgIHZhciBCaXRNb2RlbCA9IGZ1bmN0aW9uIEJpdE1vZGVsQ2xvc3VyZSgpIHsKKyAgICB2YXIgVU5JRk9STV9DT05URVhUID0gMTc7CisgICAgdmFyIFJVTkxFTkdUSF9DT05URVhUID0gMTg7CisgICAgdmFyIExMQW5kTEhDb250ZXh0c0xhYmVsID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDUsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDEsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDhdKTsKKyAgICB2YXIgSExDb250ZXh0TGFiZWwgPSBuZXcgVWludDhBcnJheShbMCwgMywgNCwgMCwgNSwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMSwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOF0pOworICAgIHZhciBISENvbnRleHRMYWJlbCA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAyLCAwLCAxLCAyLCAyLCAwLCAyLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAzLCA0LCA1LCAwLCA0LCA1LCA1LCAwLCA1LCA1LCA1LCAwLCAwLCAwLCAwLCAwLCA2LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4XSk7CisKKyAgICBmdW5jdGlvbiBCaXRNb2RlbCh3aWR0aCwgaGVpZ2h0LCBzdWJiYW5kLCB6ZXJvQml0UGxhbmVzLCBtYikgeworICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICB2YXIgY29udGV4dExhYmVsVGFibGU7CisKKyAgICAgIGlmIChzdWJiYW5kID09PSAiSEgiKSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gSEhDb250ZXh0TGFiZWw7CisgICAgICB9IGVsc2UgaWYgKHN1YmJhbmQgPT09ICJITCIpIHsKKyAgICAgICAgY29udGV4dExhYmVsVGFibGUgPSBITENvbnRleHRMYWJlbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gTExBbmRMSENvbnRleHRzTGFiZWw7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29udGV4dExhYmVsVGFibGUgPSBjb250ZXh0TGFiZWxUYWJsZTsKKyAgICAgIHZhciBjb2VmZmljaWVudENvdW50ID0gd2lkdGggKiBoZWlnaHQ7CisgICAgICB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpOworICAgICAgdGhpcy5jb2VmZmljZW50c1NpZ24gPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZTsKKworICAgICAgaWYgKG1iID4gMTQpIHsKKyAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDMyQXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9IGVsc2UgaWYgKG1iID4gNikgeworICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50MTZBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUgPSBjb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgIHRoaXMucHJvY2Vzc2luZ0ZsYWdzID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB2YXIgYml0c0RlY29kZWQgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKworICAgICAgaWYgKHplcm9CaXRQbGFuZXMgIT09IDApIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2VmZmljaWVudENvdW50OyBpKyspIHsKKyAgICAgICAgICBiaXRzRGVjb2RlZFtpXSA9IHplcm9CaXRQbGFuZXM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5iaXRzRGVjb2RlZCA9IGJpdHNEZWNvZGVkOworICAgICAgdGhpcy5yZXNldCgpOworICAgIH0KKworICAgIEJpdE1vZGVsLnByb3RvdHlwZSA9IHsKKyAgICAgIHNldERlY29kZXI6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldERlY29kZXIoZGVjb2RlcikgeworICAgICAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyOworICAgICAgfSwKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBCaXRNb2RlbF9yZXNldCgpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0cyA9IG5ldyBJbnQ4QXJyYXkoMTkpOworICAgICAgICB0aGlzLmNvbnRleHRzWzBdID0gNCA8PCAxIHwgMDsKKyAgICAgICAgdGhpcy5jb250ZXh0c1tVTklGT1JNX0NPTlRFWFRdID0gNDYgPDwgMSB8IDA7CisgICAgICAgIHRoaXMuY29udGV4dHNbUlVOTEVOR1RIX0NPTlRFWFRdID0gMyA8PCAxIHwgMDsKKyAgICAgIH0sCisgICAgICBzZXROZWlnaGJvcnNTaWduaWZpY2FuY2U6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldE5laWdoYm9yc1NpZ25pZmljYW5jZShyb3csIGNvbHVtbiwgaW5kZXgpIHsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBsZWZ0ID0gY29sdW1uID4gMDsKKyAgICAgICAgdmFyIHJpZ2h0ID0gY29sdW1uICsgMSA8IHdpZHRoOworICAgICAgICB2YXIgaTsKKworICAgICAgICBpZiAocm93ID4gMCkgeworICAgICAgICAgIGkgPSBpbmRleCAtIHdpZHRoOworCisgICAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmlnaHQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaV0gKz0gMHgwNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0KSB7CisgICAgICAgICAgaSA9IGluZGV4ICsgd2lkdGg7CisKKyAgICAgICAgICBpZiAobGVmdCkgeworICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgLSAxXSArPSAweDEwOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyaWdodCkgeworICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgKyAxXSArPSAweDEwOworICAgICAgICAgIH0KKworICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpXSArPSAweDA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXggLSAxXSArPSAweDAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJpZ2h0KSB7CisgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4ICsgMV0gKz0gMHgwMTsKKyAgICAgICAgfQorCisgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gfD0gMHg4MDsKKyAgICAgIH0sCisgICAgICBydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduOworICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CisgICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKKyAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0czsKKyAgICAgICAgdmFyIGxhYmVscyA9IHRoaXMuY29udGV4dExhYmVsVGFibGU7CisgICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CisgICAgICAgIHZhciBwcm9jZXNzZWRJbnZlcnNlTWFzayA9IH4xOworICAgICAgICB2YXIgcHJvY2Vzc2VkTWFzayA9IDE7CisgICAgICAgIHZhciBmaXJzdE1hZ25pdHVkZUJpdE1hc2sgPSAyOworCisgICAgICAgIGZvciAodmFyIGkwID0gMDsgaTAgPCBoZWlnaHQ7IGkwICs9IDQpIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBpbmRleCA9IGkwICogd2lkdGggKyBqOworCisgICAgICAgICAgICBmb3IgKHZhciBpMSA9IDA7IGkxIDwgNDsgaTErKywgaW5kZXggKz0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgdmFyIGkgPSBpMCArIGkxOworCisgICAgICAgICAgICAgIGlmIChpID49IGhlaWdodCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmPSBwcm9jZXNzZWRJbnZlcnNlTWFzazsKKworICAgICAgICAgICAgICBpZiAoY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8ICFuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dOworICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisKKyAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uKSB7CisgICAgICAgICAgICAgICAgdmFyIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gcHJvY2Vzc2VkTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBkZWNvZGVTaWduQml0OiBmdW5jdGlvbiBCaXRNb2RlbF9kZWNvZGVTaWduQml0KHJvdywgY29sdW1uLCBpbmRleCkgeworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjsKKyAgICAgICAgdmFyIGNvbnRyaWJ1dGlvbiwgc2lnbjAsIHNpZ24xLCBzaWduaWZpY2FuY2UxOworICAgICAgICB2YXIgY29udGV4dExhYmVsLCBkZWNvZGVkOworICAgICAgICBzaWduaWZpY2FuY2UxID0gY29sdW1uID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIDFdICE9PSAwOworCisgICAgICAgIGlmIChjb2x1bW4gKyAxIDwgd2lkdGggJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyAxXSAhPT0gMCkgeworICAgICAgICAgIHNpZ24xID0gY29lZmZpY2VudHNTaWduW2luZGV4ICsgMV07CisKKyAgICAgICAgICBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSAxXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gMV07CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBob3Jpem9udGFsQ29udHJpYnV0aW9uID0gMyAqIGNvbnRyaWJ1dGlvbjsKKyAgICAgICAgc2lnbmlmaWNhbmNlMSA9IHJvdyA+IDAgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggLSB3aWR0aF0gIT09IDA7CisKKyAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyB3aWR0aF0gIT09IDApIHsKKyAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIHdpZHRoXTsKKworICAgICAgICAgIGlmIChzaWduaWZpY2FuY2UxKSB7CisgICAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIHdpZHRoXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjEgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzaWduaWZpY2FuY2UxKSB7CisgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSB3aWR0aF07CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjAgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IGhvcml6b250YWxDb250cmlidXRpb247CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udHJpYnV0aW9uID49IDApIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSA5ICsgY29udHJpYnV0aW9uOworICAgICAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRleHRMYWJlbCA9IDkgLSBjb250cmlidXRpb247CisgICAgICAgICAgZGVjb2RlZCA9IHRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsIGNvbnRleHRMYWJlbCkgXiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlY29kZWQ7CisgICAgICB9LAorICAgICAgcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCkgeworICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjsKKyAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CisgICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKKyAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxOworICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjsKKyAgICAgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB2YXIgd2lkdGg0ID0gd2lkdGggKiA0OworCisgICAgICAgIGZvciAodmFyIGluZGV4MCA9IDAsIGluZGV4TmV4dDsgaW5kZXgwIDwgbGVuZ3RoOyBpbmRleDAgPSBpbmRleE5leHQpIHsKKyAgICAgICAgICBpbmRleE5leHQgPSBNYXRoLm1pbihsZW5ndGgsIGluZGV4MCArIHdpZHRoNCk7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gaW5kZXgwICsgajsgaW5kZXggPCBpbmRleE5leHQ7IGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgIGlmICghY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8IChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSAxNjsKKworICAgICAgICAgICAgICBpZiAoKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBmaXJzdE1hZ25pdHVkZUJpdE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSBePSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gJiAxMjc7CisgICAgICAgICAgICAgICAgY29udGV4dExhYmVsID0gc2lnbmlmaWNhbmNlID09PSAwID8gMTUgOiAxNDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA8PCAxIHwgYml0OworICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBwcm9jZXNzZWRNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHJ1bkNsZWFudXBQYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5DbGVhbnVwUGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBsYWJlbHMgPSB0aGlzLmNvbnRleHRMYWJlbFRhYmxlOworICAgICAgICB2YXIgYml0c0RlY29kZWQgPSB0aGlzLmJpdHNEZWNvZGVkOworICAgICAgICB2YXIgcHJvY2Vzc2luZ0ZsYWdzID0gdGhpcy5wcm9jZXNzaW5nRmxhZ3M7CisgICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTsKKyAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7CisgICAgICAgIHZhciBvbmVSb3dEb3duID0gd2lkdGg7CisgICAgICAgIHZhciB0d29Sb3dzRG93biA9IHdpZHRoICogMjsKKyAgICAgICAgdmFyIHRocmVlUm93c0Rvd24gPSB3aWR0aCAqIDM7CisgICAgICAgIHZhciBpTmV4dDsKKworICAgICAgICBmb3IgKHZhciBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCA9IGlOZXh0KSB7CisgICAgICAgICAgaU5leHQgPSBNYXRoLm1pbihpMCArIDQsIGhlaWdodCk7CisgICAgICAgICAgdmFyIGluZGV4QmFzZSA9IGkwICogd2lkdGg7CisgICAgICAgICAgdmFyIGNoZWNrQWxsRW1wdHkgPSBpMCArIDMgPCBoZWlnaHQ7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBpbmRleDAgPSBpbmRleEJhc2UgKyBqOworICAgICAgICAgICAgdmFyIGFsbEVtcHR5ID0gY2hlY2tBbGxFbXB0eSAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwXSA9PT0gMCAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgb25lUm93RG93bl0gPT09IDAgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHR3b1Jvd3NEb3duXSA9PT0gMCAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgdGhyZWVSb3dzRG93bl0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MF0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwOworICAgICAgICAgICAgdmFyIGkxID0gMCwKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4MDsKKyAgICAgICAgICAgIHZhciBpID0gaTAsCisgICAgICAgICAgICAgICAgc2lnbjsKKworICAgICAgICAgICAgaWYgKGFsbEVtcHR5KSB7CisgICAgICAgICAgICAgIHZhciBoYXNTaWduaWZpY2FudENvZWZmaWNlbnQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFJVTkxFTkdUSF9DT05URVhUKTsKKworICAgICAgICAgICAgICBpZiAoIWhhc1NpZ25pZmljYW50Q29lZmZpY2VudCkgeworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MF0rKzsKKyAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleDAgKyBvbmVSb3dEb3duXSsrOworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHR3b1Jvd3NEb3duXSsrOworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHRocmVlUm93c0Rvd25dKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpMSA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpOworCisgICAgICAgICAgICAgIGlmIChpMSAhPT0gMCkgeworICAgICAgICAgICAgICAgIGkgPSBpMCArIGkxOworICAgICAgICAgICAgICAgIGluZGV4ICs9IGkxICogd2lkdGg7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzaWduID0gdGhpcy5kZWNvZGVTaWduQml0KGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgIHRoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwOworCisgICAgICAgICAgICAgIGZvciAodmFyIGkyID0gaTA7IGkyIDw9IGk7IGkyKyssIGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpMSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSBpMCArIGkxOyBpIDwgaU5leHQ7IGkrKywgaW5kZXggKz0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fCAocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIHByb2Nlc3NlZE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dOworICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisKKyAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uID09PSAxKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CisgICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBjaGVja1NlZ21lbnRhdGlvblN5bWJvbDogZnVuY3Rpb24gQml0TW9kZWxfY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKSB7CisgICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyOworICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOworICAgICAgICB2YXIgc3ltYm9sID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpIDw8IDMgfCBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMiB8IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpOworCisgICAgICAgIGlmIChzeW1ib2wgIT09IDB4YSkgeworICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiSW52YWxpZCBzZWdtZW50YXRpb24gc3ltYm9sIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIHJldHVybiBCaXRNb2RlbDsKKyAgfSgpOworCisgIHZhciBUcmFuc2Zvcm0gPSBmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFRyYW5zZm9ybSgpIHt9CisKKyAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLmNhbGN1bGF0ZSA9IGZ1bmN0aW9uIHRyYW5zZm9ybUNhbGN1bGF0ZShzdWJiYW5kcywgdTAsIHYwKSB7CisgICAgICB2YXIgbGwgPSBzdWJiYW5kc1swXTsKKworICAgICAgZm9yICh2YXIgaSA9IDEsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBsbCA9IHRoaXMuaXRlcmF0ZShsbCwgc3ViYmFuZHNbaV0sIHUwLCB2MCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBsbDsKKyAgICB9OworCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbiBleHRlbmQoYnVmZmVyLCBvZmZzZXQsIHNpemUpIHsKKyAgICAgIHZhciBpMSA9IG9mZnNldCAtIDEsCisgICAgICAgICAgajEgPSBvZmZzZXQgKyAxOworICAgICAgdmFyIGkyID0gb2Zmc2V0ICsgc2l6ZSAtIDIsCisgICAgICAgICAgajIgPSBvZmZzZXQgKyBzaXplOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxXSA9IGJ1ZmZlcltqMV07CisgICAgICBidWZmZXJbajJdID0gYnVmZmVyW2kyXTsKKyAgICB9OworCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24gVHJhbnNmb3JtX2l0ZXJhdGUobGwsIGhsX2xoX2hoLCB1MCwgdjApIHsKKyAgICAgIHZhciBsbFdpZHRoID0gbGwud2lkdGgsCisgICAgICAgICAgbGxIZWlnaHQgPSBsbC5oZWlnaHQsCisgICAgICAgICAgbGxJdGVtcyA9IGxsLml0ZW1zOworICAgICAgdmFyIHdpZHRoID0gaGxfbGhfaGgud2lkdGg7CisgICAgICB2YXIgaGVpZ2h0ID0gaGxfbGhfaGguaGVpZ2h0OworICAgICAgdmFyIGl0ZW1zID0gaGxfbGhfaGguaXRlbXM7CisgICAgICB2YXIgaSwgaiwgaywgbCwgdSwgdjsKKworICAgICAgZm9yIChrID0gMCwgaSA9IDA7IGkgPCBsbEhlaWdodDsgaSsrKSB7CisgICAgICAgIGwgPSBpICogMiAqIHdpZHRoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsbFdpZHRoOyBqKyssIGsrKywgbCArPSAyKSB7CisgICAgICAgICAgaXRlbXNbbF0gPSBsbEl0ZW1zW2tdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxsSXRlbXMgPSBsbC5pdGVtcyA9IG51bGw7CisgICAgICB2YXIgYnVmZmVyUGFkZGluZyA9IDQ7CisgICAgICB2YXIgcm93QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCArIDIgKiBidWZmZXJQYWRkaW5nKTsKKworICAgICAgaWYgKHdpZHRoID09PSAxKSB7CisgICAgICAgIGlmICgodTAgJiAxKSAhPT0gMCkgeworICAgICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKKyAgICAgICAgICAgIGl0ZW1zW2tdICo9IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKKyAgICAgICAgICByb3dCdWZmZXIuc2V0KGl0ZW1zLnN1YmFycmF5KGssIGsgKyB3aWR0aCksIGJ1ZmZlclBhZGRpbmcpOworICAgICAgICAgIHRoaXMuZXh0ZW5kKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOworICAgICAgICAgIHRoaXMuZmlsdGVyKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOworICAgICAgICAgIGl0ZW1zLnNldChyb3dCdWZmZXIuc3ViYXJyYXkoYnVmZmVyUGFkZGluZywgYnVmZmVyUGFkZGluZyArIHdpZHRoKSwgayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIG51bUJ1ZmZlcnMgPSAxNjsKKyAgICAgIHZhciBjb2xCdWZmZXJzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspIHsKKyAgICAgICAgY29sQnVmZmVycy5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoaGVpZ2h0ICsgMiAqIGJ1ZmZlclBhZGRpbmcpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGIsCisgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IDA7CisgICAgICBsbCA9IGJ1ZmZlclBhZGRpbmcgKyBoZWlnaHQ7CisKKyAgICAgIGlmIChoZWlnaHQgPT09IDEpIHsKKyAgICAgICAgaWYgKCh2MCAmIDEpICE9PSAwKSB7CisgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHsKKyAgICAgICAgICAgIGl0ZW1zW3VdICo9IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodSA9IDA7IHUgPCB3aWR0aDsgdSsrKSB7CisgICAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXIgPT09IDApIHsKKyAgICAgICAgICAgIG51bUJ1ZmZlcnMgPSBNYXRoLm1pbih3aWR0aCAtIHUsIG51bUJ1ZmZlcnMpOworCisgICAgICAgICAgICBmb3IgKGsgPSB1LCBsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGNvbEJ1ZmZlcnNbYl1bbF0gPSBpdGVtc1trICsgYl07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IG51bUJ1ZmZlcnM7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudEJ1ZmZlci0tOworICAgICAgICAgIHZhciBidWZmZXIgPSBjb2xCdWZmZXJzW2N1cnJlbnRCdWZmZXJdOworICAgICAgICAgIHRoaXMuZXh0ZW5kKGJ1ZmZlciwgYnVmZmVyUGFkZGluZywgaGVpZ2h0KTsKKyAgICAgICAgICB0aGlzLmZpbHRlcihidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7CisKKyAgICAgICAgICBpZiAoY3VycmVudEJ1ZmZlciA9PT0gMCkgeworICAgICAgICAgICAgayA9IHUgLSBudW1CdWZmZXJzICsgMTsKKworICAgICAgICAgICAgZm9yIChsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGl0ZW1zW2sgKyBiXSA9IGNvbEJ1ZmZlcnNbYl1bbF07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICBoZWlnaHQ6IGhlaWdodCwKKyAgICAgICAgaXRlbXM6IGl0ZW1zCisgICAgICB9OworICAgIH07CisKKyAgICByZXR1cm4gVHJhbnNmb3JtOworICB9KCk7CisKKyAgdmFyIElycmV2ZXJzaWJsZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIElycmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCkgeworICAgICAgVHJhbnNmb3JtLmNhbGwodGhpcyk7CisgICAgfQorCisgICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7CisKKyAgICBJcnJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGlycmV2ZXJzaWJsZVRyYW5zZm9ybUZpbHRlcih4LCBvZmZzZXQsIGxlbmd0aCkgeworICAgICAgdmFyIGxlbiA9IGxlbmd0aCA+PiAxOworICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDsKKyAgICAgIHZhciBqLCBuLCBjdXJyZW50LCBuZXh0OworICAgICAgdmFyIGFscGhhID0gLTEuNTg2MTM0MzQyMDU5OTI0OworICAgICAgdmFyIGJldGEgPSAtMC4wNTI5ODAxMTg1NzI5NjE7CisgICAgICB2YXIgZ2FtbWEgPSAwLjg4MjkxMTA3NTUzMDkzNDsKKyAgICAgIHZhciBkZWx0YSA9IDAuNDQzNTA2ODUyMDQzOTcxOworICAgICAgdmFyIEsgPSAxLjIzMDE3NDEwNDkxNDAwMTsKKyAgICAgIHZhciBLXyA9IDEgLyBLOworICAgICAgaiA9IG9mZnNldCAtIDM7CisKKyAgICAgIGZvciAobiA9IGxlbiArIDQ7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIHhbal0gKj0gS187CisgICAgICB9CisKKyAgICAgIGogPSBvZmZzZXQgLSAyOworICAgICAgY3VycmVudCA9IGRlbHRhICogeFtqIC0gMV07CisKKyAgICAgIGZvciAobiA9IGxlbiArIDM7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIG5leHQgPSBkZWx0YSAqIHhbaiArIDFdOworICAgICAgICB4W2pdID0gSyAqIHhbal0gLSBjdXJyZW50IC0gbmV4dDsKKworICAgICAgICBpZiAobi0tKSB7CisgICAgICAgICAgaiArPSAyOworICAgICAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiArIDFdOworICAgICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGogPSBvZmZzZXQgLSAxOworICAgICAgY3VycmVudCA9IGdhbW1hICogeFtqIC0gMV07CisKKyAgICAgIGZvciAobiA9IGxlbiArIDI7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIG5leHQgPSBnYW1tYSAqIHhbaiArIDFdOworICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworCisgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgY3VycmVudCA9IGdhbW1hICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBqID0gb2Zmc2V0OworICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogLSAxXTsKKworICAgICAgZm9yIChuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgbmV4dCA9IGJldGEgKiB4W2ogKyAxXTsKKyAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKworICAgICAgICBpZiAobi0tKSB7CisgICAgICAgICAgaiArPSAyOworICAgICAgICAgIGN1cnJlbnQgPSBiZXRhICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobGVuICE9PSAwKSB7CisgICAgICAgIGogPSBvZmZzZXQgKyAxOworICAgICAgICBjdXJyZW50ID0gYWxwaGEgKiB4W2ogLSAxXTsKKworICAgICAgICBmb3IgKG4gPSBsZW47IG4tLTsgaiArPSAyKSB7CisgICAgICAgICAgbmV4dCA9IGFscGhhICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKworICAgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiArIDFdOworICAgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIHJldHVybiBJcnJldmVyc2libGVUcmFuc2Zvcm07CisgIH0oKTsKKworICB2YXIgUmV2ZXJzaWJsZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm1DbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm0oKSB7CisgICAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTsKKyAgICB9CisKKyAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7CisKKyAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiByZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKHgsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7CisgICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwOworICAgICAgdmFyIGosIG47CisKKyAgICAgIGZvciAoaiA9IG9mZnNldCwgbiA9IGxlbiArIDE7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIHhbal0gLT0geFtqIC0gMV0gKyB4W2ogKyAxXSArIDIgPj4gMjsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gb2Zmc2V0ICsgMSwgbiA9IGxlbjsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgeFtqXSArPSB4W2ogLSAxXSArIHhbaiArIDFdID4+IDE7CisgICAgICB9CisgICAgfTsKKworICAgIHJldHVybiBSZXZlcnNpYmxlVHJhbnNmb3JtOworICB9KCk7CisKKyAgcmV0dXJuIEpweEltYWdlOworfSgpOworCitleHBvcnRzLkpweEltYWdlID0gSnB4SW1hZ2U7CisKKy8qKiovIH0pCisvKioqKioqLyBdKTsKK30pOworLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGRmLmltYWdlX2RlY29kZXJzLmpzLm1hcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2VzNS9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMuanMubWFwIGIvZXM1L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy5qcy5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0YTliNAotLS0gL2Rldi9udWxsCisrKyBiL2VzNS9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMuanMubWFwCkBAIC0wLDAgKzEgQEAKK3sidmVyc2lvbiI6Mywic291cmNlcyI6WyJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL3NyYy9wZGYuaW1hZ2VfZGVjb2RlcnMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvc3JjL3NoYXJlZC91dGlsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL3NyYy9zaGFyZWQvY29tcGF0aWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9zcmMvc2hhcmVkL2lzX25vZGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvZ2xvYmFsLXRoaXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5nbG9iYWwtdGhpcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudHJ5LXVuYmluZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9mcm9tLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvZnJvbS1lbnRyaWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZnJvbS1lbnRyaWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL21hdGgvbG9nMi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgubG9nMi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3R5cGVkLWFycmF5L3NsaWNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc2xpY2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbWFwL2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3NldC9pbmRleC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnNldC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy93ZWFrLW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3dlYWstc2V0L2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1zZXQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL2NvZGUtcG9pbnQtYXQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuY29kZS1wb2ludC1hdC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zdHJpbmcvZnJvbS1jb2RlLXBvaW50LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zcGVjaWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9wYWQtc3RhcnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucGFkLXN0YXJ0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcGFkLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcmVwZWF0LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcGFkLXdlYmtpdC1idWcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL3BhZC1lbmQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucGFkLWVuZC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvdmFsdWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnZhbHVlcy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvc3JjL2NvcmUvamJpZzIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvc3JjL2NvcmUvY29yZV91dGlscy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9zcmMvY29yZS9hcml0aG1ldGljX2RlY29kZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvc3JjL2NvcmUvY2NpdHQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvc3JjL2NvcmUvanBnLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL3NyYy9jb3JlL2pweC5qcyJdLCJuYW1lcyI6WyJwZGZqc1ZlcnNpb24iLCJwZGZqc0J1aWxkIiwiSURFTlRJVFlfTUFUUklYIiwiRk9OVF9JREVOVElUWV9NQVRSSVgiLCJQZXJtaXNzaW9uRmxhZyIsIlBSSU5UIiwiTU9ESUZZX0NPTlRFTlRTIiwiQ09QWSIsIk1PRElGWV9BTk5PVEFUSU9OUyIsIkZJTExfSU5URVJBQ1RJVkVfRk9STVMiLCJDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZIiwiQVNTRU1CTEUiLCJQUklOVF9ISUdIX1FVQUxJVFkiLCJUZXh0UmVuZGVyaW5nTW9kZSIsIkZJTEwiLCJTVFJPS0UiLCJGSUxMX1NUUk9LRSIsIklOVklTSUJMRSIsIkZJTExfQUREX1RPX1BBVEgiLCJTVFJPS0VfQUREX1RPX1BBVEgiLCJGSUxMX1NUUk9LRV9BRERfVE9fUEFUSCIsIkFERF9UT19QQVRIIiwiRklMTF9TVFJPS0VfTUFTSyIsIkFERF9UT19QQVRIX0ZMQUciLCJJbWFnZUtpbmQiLCJHUkFZU0NBTEVfMUJQUCIsIlJHQl8yNEJQUCIsIlJHQkFfMzJCUFAiLCJBbm5vdGF0aW9uVHlwZSIsIlRFWFQiLCJMSU5LIiwiRlJFRVRFWFQiLCJMSU5FIiwiU1FVQVJFIiwiQ0lSQ0xFIiwiUE9MWUdPTiIsIlBPTFlMSU5FIiwiSElHSExJR0hUIiwiVU5ERVJMSU5FIiwiU1FVSUdHTFkiLCJTVFJJS0VPVVQiLCJTVEFNUCIsIkNBUkVUIiwiSU5LIiwiUE9QVVAiLCJGSUxFQVRUQUNITUVOVCIsIlNPVU5EIiwiTU9WSUUiLCJXSURHRVQiLCJTQ1JFRU4iLCJQUklOVEVSTUFSSyIsIlRSQVBORVQiLCJXQVRFUk1BUksiLCJUSFJFRUQiLCJSRURBQ1QiLCJBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUiLCJNQVJLRUQiLCJSRVZJRVciLCJBbm5vdGF0aW9uTWFya2VkU3RhdGUiLCJVTk1BUktFRCIsIkFubm90YXRpb25SZXZpZXdTdGF0ZSIsIkFDQ0VQVEVEIiwiUkVKRUNURUQiLCJDQU5DRUxMRUQiLCJDT01QTEVURUQiLCJOT05FIiwiQW5ub3RhdGlvblJlcGx5VHlwZSIsIkdST1VQIiwiUkVQTFkiLCJBbm5vdGF0aW9uRmxhZyIsIkhJRERFTiIsIk5PWk9PTSIsIk5PUk9UQVRFIiwiTk9WSUVXIiwiUkVBRE9OTFkiLCJMT0NLRUQiLCJUT0dHTEVOT1ZJRVciLCJMT0NLRURDT05URU5UUyIsIkFubm90YXRpb25GaWVsZEZsYWciLCJSRVFVSVJFRCIsIk5PRVhQT1JUIiwiTVVMVElMSU5FIiwiUEFTU1dPUkQiLCJOT1RPR0dMRVRPT0ZGIiwiUkFESU8iLCJQVVNIQlVUVE9OIiwiQ09NQk8iLCJFRElUIiwiU09SVCIsIkZJTEVTRUxFQ1QiLCJNVUxUSVNFTEVDVCIsIkRPTk9UU1BFTExDSEVDSyIsIkRPTk9UU0NST0xMIiwiQ09NQiIsIlJJQ0hURVhUIiwiUkFESU9TSU5VTklTT04iLCJDT01NSVRPTlNFTENIQU5HRSIsIkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUiLCJTT0xJRCIsIkRBU0hFRCIsIkJFVkVMRUQiLCJJTlNFVCIsIlN0cmVhbVR5cGUiLCJVTktOT1dOIiwiRkxBVEUiLCJMWlciLCJEQ1QiLCJKUFgiLCJKQklHIiwiQTg1IiwiQUhYIiwiQ0NGIiwiUkxYIiwiRm9udFR5cGUiLCJUWVBFMSIsIlRZUEUxQyIsIkNJREZPTlRUWVBFMCIsIkNJREZPTlRUWVBFMEMiLCJUUlVFVFlQRSIsIkNJREZPTlRUWVBFMiIsIlRZUEUzIiwiT1BFTlRZUEUiLCJUWVBFMCIsIk1NVFlQRTEiLCJWZXJib3NpdHlMZXZlbCIsIkVSUk9SUyIsIldBUk5JTkdTIiwiSU5GT1MiLCJDTWFwQ29tcHJlc3Npb25UeXBlIiwiQklOQVJZIiwiU1RSRUFNIiwiT1BTIiwiZGVwZW5kZW5jeSIsInNldExpbmVXaWR0aCIsInNldExpbmVDYXAiLCJzZXRMaW5lSm9pbiIsInNldE1pdGVyTGltaXQiLCJzZXREYXNoIiwic2V0UmVuZGVyaW5nSW50ZW50Iiwic2V0RmxhdG5lc3MiLCJzZXRHU3RhdGUiLCJzYXZlIiwicmVzdG9yZSIsInRyYW5zZm9ybSIsIm1vdmVUbyIsImxpbmVUbyIsImN1cnZlVG8iLCJjdXJ2ZVRvMiIsImN1cnZlVG8zIiwiY2xvc2VQYXRoIiwicmVjdGFuZ2xlIiwic3Ryb2tlIiwiY2xvc2VTdHJva2UiLCJmaWxsIiwiZW9GaWxsIiwiZmlsbFN0cm9rZSIsImVvRmlsbFN0cm9rZSIsImNsb3NlRmlsbFN0cm9rZSIsImNsb3NlRU9GaWxsU3Ryb2tlIiwiZW5kUGF0aCIsImNsaXAiLCJlb0NsaXAiLCJiZWdpblRleHQiLCJlbmRUZXh0Iiwic2V0Q2hhclNwYWNpbmciLCJzZXRXb3JkU3BhY2luZyIsInNldEhTY2FsZSIsInNldExlYWRpbmciLCJzZXRGb250Iiwic2V0VGV4dFJlbmRlcmluZ01vZGUiLCJzZXRUZXh0UmlzZSIsIm1vdmVUZXh0Iiwic2V0TGVhZGluZ01vdmVUZXh0Iiwic2V0VGV4dE1hdHJpeCIsIm5leHRMaW5lIiwic2hvd1RleHQiLCJzaG93U3BhY2VkVGV4dCIsIm5leHRMaW5lU2hvd1RleHQiLCJuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dCIsInNldENoYXJXaWR0aCIsInNldENoYXJXaWR0aEFuZEJvdW5kcyIsInNldFN0cm9rZUNvbG9yU3BhY2UiLCJzZXRGaWxsQ29sb3JTcGFjZSIsInNldFN0cm9rZUNvbG9yIiwic2V0U3Ryb2tlQ29sb3JOIiwic2V0RmlsbENvbG9yIiwic2V0RmlsbENvbG9yTiIsInNldFN0cm9rZUdyYXkiLCJzZXRGaWxsR3JheSIsInNldFN0cm9rZVJHQkNvbG9yIiwic2V0RmlsbFJHQkNvbG9yIiwic2V0U3Ryb2tlQ01ZS0NvbG9yIiwic2V0RmlsbENNWUtDb2xvciIsInNoYWRpbmdGaWxsIiwiYmVnaW5JbmxpbmVJbWFnZSIsImJlZ2luSW1hZ2VEYXRhIiwiZW5kSW5saW5lSW1hZ2UiLCJwYWludFhPYmplY3QiLCJtYXJrUG9pbnQiLCJtYXJrUG9pbnRQcm9wcyIsImJlZ2luTWFya2VkQ29udGVudCIsImJlZ2luTWFya2VkQ29udGVudFByb3BzIiwiZW5kTWFya2VkQ29udGVudCIsImJlZ2luQ29tcGF0IiwiZW5kQ29tcGF0IiwicGFpbnRGb3JtWE9iamVjdEJlZ2luIiwicGFpbnRGb3JtWE9iamVjdEVuZCIsImJlZ2luR3JvdXAiLCJlbmRHcm91cCIsImJlZ2luQW5ub3RhdGlvbnMiLCJlbmRBbm5vdGF0aW9ucyIsImJlZ2luQW5ub3RhdGlvbiIsImVuZEFubm90YXRpb24iLCJwYWludEpwZWdYT2JqZWN0IiwicGFpbnRJbWFnZU1hc2tYT2JqZWN0IiwicGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXAiLCJwYWludEltYWdlWE9iamVjdCIsInBhaW50SW5saW5lSW1hZ2VYT2JqZWN0IiwicGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cCIsInBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0IiwicGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0IiwicGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrIiwiY29uc3RydWN0UGF0aCIsIlVOU1VQUE9SVEVEX0ZFQVRVUkVTIiwidW5rbm93biIsImZvcm1zIiwiamF2YVNjcmlwdCIsInNtYXNrIiwic2hhZGluZ1BhdHRlcm4iLCJmb250IiwiZXJyb3JUaWxpbmdQYXR0ZXJuIiwiZXJyb3JFeHRHU3RhdGUiLCJlcnJvclhPYmplY3QiLCJlcnJvckZvbnRMb2FkVHlwZTMiLCJlcnJvckZvbnRTdGF0ZSIsImVycm9yRm9udE1pc3NpbmciLCJlcnJvckZvbnRUcmFuc2xhdGUiLCJlcnJvckNvbG9yU3BhY2UiLCJlcnJvck9wZXJhdG9yTGlzdCIsImVycm9yRm9udFRvVW5pY29kZSIsImVycm9yRm9udExvYWROYXRpdmUiLCJlcnJvckZvbnRHZXRQYXRoIiwiZXJyb3JNYXJrZWRDb250ZW50IiwiUGFzc3dvcmRSZXNwb25zZXMiLCJORUVEX1BBU1NXT1JEIiwiSU5DT1JSRUNUX1BBU1NXT1JEIiwidmVyYm9zaXR5IiwiTnVtYmVyIiwiY29uc29sZSIsInVucmVhY2hhYmxlIiwiYmFzZSIsIm90aGVyIiwidXJsIiwiYWJzb2x1dGVVcmwiLCJiYXNlVXJsIiwiX2lzVmFsaWRQcm90b2NvbCIsIk9iamVjdCIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiQmFzZUV4Y2VwdGlvbiIsImNvbnN0cnVjdG9yIiwiTnVsbENoYXJhY3RlcnNSZWdFeHAiLCJ3YXJuIiwic3RyIiwiYXNzZXJ0IiwiYnl0ZXMiLCJsZW5ndGgiLCJNQVhfQVJHVU1FTlRfQ09VTlQiLCJTdHJpbmciLCJzdHJCdWYiLCJpIiwiY2h1bmtFbmQiLCJNYXRoIiwiY2h1bmsiLCJhcnIiLCJyZXN1bHRMZW5ndGgiLCJhcnJheUJ5dGVMZW5ndGgiLCJwb3MiLCJkYXRhIiwiaXRlbSIsInN0cmluZ1RvQnl0ZXMiLCJpdGVtTGVuZ3RoIiwiYnVmZmVyOCIsInZpZXczMiIsIklzTGl0dGxlRW5kaWFuQ2FjaGVkIiwic2hhZG93IiwiaXNMaXR0bGVFbmRpYW4iLCJJc0V2YWxTdXBwb3J0ZWRDYWNoZWQiLCJpc0V2YWxTdXBwb3J0ZWQiLCJyZ2JCdWYiLCJtMSIsIm0yIiwieHQiLCJwIiwibSIsInl0IiwiZCIsInAxIiwiVXRpbCIsInAyIiwiciIsInAzIiwicDQiLCJ2IiwidHJhbnNwb3NlIiwiYSIsImIiLCJjIiwiZmlyc3QiLCJzZWNvbmQiLCJzeCIsInN5IiwicmVjdCIsIm9yZGVyZWRYIiwicmVjdDEiLCJyZWN0MiIsIm9yZGVyZWRZIiwicmVzdWx0IiwiUERGU3RyaW5nVHJhbnNsYXRlVGFibGUiLCJjb2RlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhcnIxIiwiYXJyMiIsImVsZW1lbnQiLCJkYXRlIiwiRGF0ZSIsImJ1ZmZlciIsImNhcGFiaWxpdHkiLCJpc1NldHRsZWQiLCJnZXQiLCJyZXNvbHZlIiwicmVqZWN0IiwiY3JlYXRlT2JqZWN0VVJMIiwiZGlnaXRzIiwiZm9yY2VEYXRhU2NoZW1hIiwiVVJMIiwiYmxvYiIsInR5cGUiLCJpaSIsImIxIiwiYjIiLCJiMyIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZ2xvYmFsVGhpcyIsInJlcXVpcmUiLCJoYXNET00iLCJ1c2VyQWdlbnQiLCJuYXZpZ2F0b3IiLCJpc0lFIiwiQnVmZmVyIiwiRWxlbWVudCIsImRpdiIsImRvY3VtZW50IiwiT3JpZ2luYWxET01Ub2tlbkxpc3RBZGQiLCJET01Ub2tlbkxpc3QiLCJPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZSIsInRva2VuIiwiZm9yY2UiLCJhcmd1bWVudHMiLCJPcmlnaW5hbFB1c2hTdGF0ZSIsIndpbmRvdyIsIk9yaWdpbmFsUmVwbGFjZVN0YXRlIiwiYXJncyIsIkFycmF5IiwiVWludDhBcnJheSIsImlzTm9kZUpTIiwicHJvY2VzcyIsIm1vZHVsZSIsImV4cG9ydHMiLCIkIiwiZ2xvYmFsIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZiIsImNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSIsInJlZGVmaW5lIiwic2V0R2xvYmFsIiwiY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyIsImlzRm9yY2VkIiwib3B0aW9ucyIsInNvdXJjZSIsIlRBUkdFVCIsInRhcmdldCIsIkdMT0JBTCIsIlNUQVRJQyIsInN0YXQiLCJGT1JDRUQiLCJrZXkiLCJ0YXJnZXRQcm9wZXJ0eSIsInNvdXJjZVByb3BlcnR5IiwiZGVzY3JpcHRvciIsInByb3RvdHlwZSIsIm5vVGFyZ2V0R2V0IiwiZm9yY2VkIiwidW5kZWZpbmVkIiwic2hhbSIsImNoZWNrIiwiaXQiLCJzZWxmIiwiRnVuY3Rpb24iLCJERVNDUklQVE9SUyIsInByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlIiwiY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yIiwidG9JbmRleGVkT2JqZWN0IiwidG9QcmltaXRpdmUiLCJoYXMiLCJJRThfRE9NX0RFRklORSIsIm5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIk8iLCJQIiwiZXJyb3IiLCJjYWxsIiwiZmFpbHMiLCJkZWZpbmVQcm9wZXJ0eSIsImV4ZWMiLCJuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiTkFTSE9STl9CVUciLCJWIiwiYml0bWFwIiwiSW5kZXhlZE9iamVjdCIsInJlcXVpcmVPYmplY3RDb2VyY2libGUiLCJjbGFzc29mIiwic3BsaXQiLCJ0b1N0cmluZyIsInNsaWNlIiwiVHlwZUVycm9yIiwiaXNPYmplY3QiLCJpbnB1dCIsIlBSRUZFUlJFRF9TVFJJTkciLCJmbiIsInZhbCIsInZhbHVlT2YiLCJoYXNPd25Qcm9wZXJ0eSIsImNyZWF0ZUVsZW1lbnQiLCJFWElTVFMiLCJkZWZpbmVQcm9wZXJ0eU1vZHVsZSIsIm9iamVjdCIsImFuT2JqZWN0IiwibmF0aXZlRGVmaW5lUHJvcGVydHkiLCJBdHRyaWJ1dGVzIiwiaW5zcGVjdFNvdXJjZSIsIkludGVybmFsU3RhdGVNb2R1bGUiLCJnZXRJbnRlcm5hbFN0YXRlIiwiZW5mb3JjZUludGVybmFsU3RhdGUiLCJlbmZvcmNlIiwiVEVNUExBVEUiLCJ1bnNhZmUiLCJzaW1wbGUiLCJqb2luIiwic3RvcmUiLCJmdW5jdGlvblRvU3RyaW5nIiwiU0hBUkVEIiwiTkFUSVZFX1dFQUtfTUFQIiwib2JqZWN0SGFzIiwic2hhcmVkS2V5IiwiaGlkZGVuS2V5cyIsIldlYWtNYXAiLCJzZXQiLCJnZXR0ZXJGb3IiLCJUWVBFIiwic3RhdGUiLCJ3bWdldCIsIndtaGFzIiwid21zZXQiLCJtZXRhZGF0YSIsIlNUQVRFIiwidGVzdCIsInNoYXJlZCIsInVpZCIsImtleXMiLCJJU19QVVJFIiwicHVzaCIsInZlcnNpb24iLCJtb2RlIiwiY29weXJpZ2h0IiwiaWQiLCJwb3N0Zml4IiwicmFuZG9tIiwib3duS2V5cyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSIsImdldEJ1aWx0SW4iLCJnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiY29uY2F0IiwicGF0aCIsImFGdW5jdGlvbiIsInZhcmlhYmxlIiwibmFtZXNwYWNlIiwibWV0aG9kIiwiaW50ZXJuYWxPYmplY3RLZXlzIiwiZW51bUJ1Z0tleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiaW5kZXhPZiIsIm5hbWVzIiwidG9MZW5ndGgiLCJ0b0Fic29sdXRlSW5kZXgiLCJjcmVhdGVNZXRob2QiLCJJU19JTkNMVURFUyIsIiR0aGlzIiwiZWwiLCJmcm9tSW5kZXgiLCJpbmRleCIsImluY2x1ZGVzIiwidG9JbnRlZ2VyIiwibWluIiwiYXJndW1lbnQiLCJjZWlsIiwiZmxvb3IiLCJpc05hTiIsIm1heCIsImludGVnZXIiLCJyZXBsYWNlbWVudCIsImZlYXR1cmUiLCJkZXRlY3Rpb24iLCJub3JtYWxpemUiLCJQT0xZRklMTCIsIk5BVElWRSIsInN0cmluZyIsInJlcGxhY2UiLCJ0b0xvd2VyQ2FzZSIsImVudHJ5VW5iaW5kIiwibm90QVJlZ0V4cCIsImNvcnJlY3RJc1JlZ0V4cExvZ2ljIiwibmF0aXZlU3RhcnRzV2l0aCIsInN0YXJ0c1dpdGgiLCJDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyIsIk1ETl9QT0xZRklMTF9CVUciLCJwcm90byIsInNlYXJjaFN0cmluZyIsInRoYXQiLCJzZWFyY2giLCJpc1JlZ0V4cCIsIndlbGxLbm93blN5bWJvbCIsIk1BVENIIiwiTkFUSVZFX1NZTUJPTCIsIlVTRV9TWU1CT0xfQVNfVUlEIiwiV2VsbEtub3duU3ltYm9sc1N0b3JlIiwiU3ltYm9sIiwiY3JlYXRlV2VsbEtub3duU3ltYm9sIiwid2l0aG91dFNldHRlciIsIm5hbWUiLCJpdGVyYXRvciIsIk1FVEhPRF9OQU1FIiwicmVnZXhwIiwiZSIsImJpbmQiLCJDT05TVFJVQ1RPUiIsIk1FVEhPRCIsImFwcGx5IiwibmF0aXZlRW5kc1dpdGgiLCJlbmRzV2l0aCIsImVuZFBvc2l0aW9uIiwibGVuIiwiZW5kIiwiJGluY2x1ZGVzIiwiYWRkVG9VbnNjb3BhYmxlcyIsImFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoIiwiVVNFU19UT19MRU5HVEgiLCJBQ0NFU1NPUlMiLCJjcmVhdGUiLCJVTlNDT1BBQkxFUyIsIkFycmF5UHJvdG90eXBlIiwiZGVmaW5lUHJvcGVydGllcyIsImh0bWwiLCJkb2N1bWVudENyZWF0ZUVsZW1lbnQiLCJHVCIsIkxUIiwiUFJPVE9UWVBFIiwiU0NSSVBUIiwiSUVfUFJPVE8iLCJFbXB0eUNvbnN0cnVjdG9yIiwic2NyaXB0VGFnIiwiY29udGVudCIsIk51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgiLCJhY3RpdmVYRG9jdW1lbnQiLCJ3cml0ZSIsImNsb3NlIiwidGVtcCIsInBhcmVudFdpbmRvdyIsIk51bGxQcm90b09iamVjdFZpYUlGcmFtZSIsImlmcmFtZSIsIkpTIiwiaWZyYW1lRG9jdW1lbnQiLCJzdHlsZSIsImRpc3BsYXkiLCJhcHBlbmRDaGlsZCIsInNyYyIsImNvbnRlbnRXaW5kb3ciLCJvcGVuIiwiRiIsIk51bGxQcm90b09iamVjdCIsImRvbWFpbiIsIkFjdGl2ZVhPYmplY3QiLCJQcm9wZXJ0aWVzIiwib2JqZWN0S2V5cyIsImNhY2hlIiwidGhyb3dlciIsImFyZ3VtZW50MCIsImFyZ3VtZW50MSIsImZyb20iLCJjaGFyQXQiLCJkZWZpbmVJdGVyYXRvciIsIlNUUklOR19JVEVSQVRPUiIsInNldEludGVybmFsU3RhdGUiLCJpdGVyYXRlZCIsIm5leHQiLCJwb2ludCIsImRvbmUiLCJDT05WRVJUX1RPX1NUUklORyIsIlMiLCJwb3NpdGlvbiIsInNpemUiLCJjaGFyQ29kZUF0IiwiY29kZUF0IiwiY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJzZXRUb1N0cmluZ1RhZyIsIkl0ZXJhdG9ycyIsIkl0ZXJhdG9yc0NvcmUiLCJJdGVyYXRvclByb3RvdHlwZSIsIkJVR0dZX1NBRkFSSV9JVEVSQVRPUlMiLCJJVEVSQVRPUiIsIktFWVMiLCJWQUxVRVMiLCJFTlRSSUVTIiwicmV0dXJuVGhpcyIsIkl0ZXJhYmxlIiwiTkFNRSIsIkl0ZXJhdG9yQ29uc3RydWN0b3IiLCJERUZBVUxUIiwiSVNfU0VUIiwiZ2V0SXRlcmF0aW9uTWV0aG9kIiwiS0lORCIsImRlZmF1bHRJdGVyYXRvciIsIkl0ZXJhYmxlUHJvdG90eXBlIiwidmFsdWVzIiwiZW50cmllcyIsIlRPX1NUUklOR19UQUciLCJJTkNPUlJFQ1RfVkFMVUVTX05BTUUiLCJuYXRpdmVJdGVyYXRvciIsImFueU5hdGl2ZUl0ZXJhdG9yIiwiQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlIiwibWV0aG9kcyIsIktFWSIsIlByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSIsImFycmF5SXRlcmF0b3IiLCJ0b09iamVjdCIsIkNPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiIsIk9iamVjdFByb3RvdHlwZSIsIlRBRyIsImFQb3NzaWJsZVByb3RvdHlwZSIsIkNPUlJFQ1RfU0VUVEVSIiwic2V0dGVyIiwiX19wcm90b19fIiwiY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uIiwiSU5DT1JSRUNUX0lURVJBVElPTiIsIml0ZXJhYmxlIiwiY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyIsImlzQXJyYXlJdGVyYXRvck1ldGhvZCIsImNyZWF0ZVByb3BlcnR5IiwiZ2V0SXRlcmF0b3JNZXRob2QiLCJhcnJheUxpa2UiLCJDIiwiYXJndW1lbnRzTGVuZ3RoIiwibWFwZm4iLCJtYXBwaW5nIiwiaXRlcmF0b3JNZXRob2QiLCJzdGVwIiwicmV0dXJuTWV0aG9kIiwicHJvcGVydHlLZXkiLCJUT19TVFJJTkdfVEFHX1NVUFBPUlQiLCJjbGFzc29mUmF3IiwiQ09SUkVDVF9BUkdVTUVOVFMiLCJ0cnlHZXQiLCJ0YWciLCJjYWxsZWUiLCJTQUZFX0NMT1NJTkciLCJjYWxsZWQiLCJpdGVyYXRvcldpdGhSZXR1cm4iLCJTS0lQX0NMT1NJTkciLCJJVEVSQVRJT05fU1VQUE9SVCIsImFzc2lnbiIsIm5hdGl2ZUFzc2lnbiIsIkEiLCJCIiwic3ltYm9sIiwiYWxwaGFiZXQiLCJmb3JFYWNoIiwiY2hyIiwiVCIsImoiLCJmcm9tRW50cmllcyIsIkFSUkFZX0lURVJBVE9SIiwia2luZCIsIkFyZ3VtZW50cyIsIml0ZXJhdGUiLCJvYmoiLCJrIiwiUmVzdWx0Iiwic3RvcHBlZCIsIkFTX0VOVFJJRVMiLCJJU19JVEVSQVRPUiIsImJvdW5kRnVuY3Rpb24iLCJpdGVyRm4iLCJzdG9wIiwibG9nMiIsImxvZyIsIkxOMiIsIngiLCJudW1iZXIiLCJpc0ludGVnZXIiLCJpc0Zpbml0ZSIsIkFycmF5QnVmZmVyVmlld0NvcmUiLCJzcGVjaWVzQ29uc3RydWN0b3IiLCJhVHlwZWRBcnJheSIsImFUeXBlZEFycmF5Q29uc3RydWN0b3IiLCJleHBvcnRUeXBlZEFycmF5TWV0aG9kIiwiJHNsaWNlIiwiSW50OEFycmF5Iiwic3RhcnQiLCJsaXN0IiwiTkFUSVZFX0FSUkFZX0JVRkZFUiIsIkludDhBcnJheVByb3RvdHlwZSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUiLCJUeXBlZEFycmF5IiwiVHlwZWRBcnJheVByb3RvdHlwZSIsImlzUHJvdG90eXBlT2YiLCJUWVBFRF9BUlJBWV9UQUciLCJOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIiwib3BlcmEiLCJUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCIsIlR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0IiwiSW50MTZBcnJheSIsIlVpbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIlVpbnQzMkFycmF5IiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiaXNWaWV3Iiwia2xhc3MiLCJpc1R5cGVkQXJyYXkiLCJBUlJBWSIsIlR5cGVkQXJyYXlDb25zdHJ1Y3RvciIsInByb3BlcnR5IiwiZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCIsIkFycmF5QnVmZmVyIiwiRGF0YVZpZXciLCJTUEVDSUVTIiwiZGVmYXVsdENvbnN0cnVjdG9yIiwiTWFwIiwiY29sbGVjdGlvbiIsImNvbGxlY3Rpb25TdHJvbmciLCJpbml0IiwiSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSIsImFuSW5zdGFuY2UiLCJpbmhlcml0SWZSZXF1aXJlZCIsIkNPTlNUUlVDVE9SX05BTUUiLCJ3cmFwcGVyIiwiY29tbW9uIiwiSVNfTUFQIiwiSVNfV0VBSyIsIkFEREVSIiwiTmF0aXZlQ29uc3RydWN0b3IiLCJOYXRpdmVQcm90b3R5cGUiLCJDb25zdHJ1Y3RvciIsImV4cG9ydGVkIiwiZml4TWV0aG9kIiwibmF0aXZlTWV0aG9kIiwiYWRkIiwiZ2V0Q29uc3RydWN0b3IiLCJpbnN0YW5jZSIsIkhBU05UX0NIQUlOSU5HIiwiVEhST1dTX09OX1BSSU1JVElWRVMiLCJBQ0NFUFRfSVRFUkFCTEVTIiwiQlVHR1lfWkVSTyIsIiRpbnN0YW5jZSIsImR1bW15IiwiY2xlYXIiLCJzZXRTdHJvbmciLCJGUkVFWklORyIsIk1FVEFEQVRBIiwiaXNFeHRlbnNpYmxlIiwic2V0TWV0YWRhdGEiLCJvYmplY3RJRCIsIndlYWtEYXRhIiwiZmFzdEtleSIsImdldFdlYWtEYXRhIiwib25GcmVlemUiLCJtZXRhIiwicHJldmVudEV4dGVuc2lvbnMiLCJXcmFwcGVyIiwiTmV3VGFyZ2V0IiwiTmV3VGFyZ2V0UHJvdG90eXBlIiwicmVkZWZpbmVBbGwiLCJzZXRTcGVjaWVzIiwiaW50ZXJuYWxTdGF0ZUdldHRlckZvciIsImxhc3QiLCJkZWZpbmUiLCJlbnRyeSIsImdldEVudHJ5IiwicHJldmlvdXMiLCJyZW1vdmVkIiwicHJldiIsImNhbGxiYWNrZm4iLCJJVEVSQVRPUl9OQU1FIiwiZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUiLCJnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUiLCJET01JdGVyYWJsZXMiLCJBcnJheUl0ZXJhdG9yTWV0aG9kcyIsIkFycmF5VmFsdWVzIiwiQ09MTEVDVElPTl9OQU1FIiwiQ29sbGVjdGlvbiIsIkNvbGxlY3Rpb25Qcm90b3R5cGUiLCJDU1NSdWxlTGlzdCIsIkNTU1N0eWxlRGVjbGFyYXRpb24iLCJDU1NWYWx1ZUxpc3QiLCJDbGllbnRSZWN0TGlzdCIsIkRPTVJlY3RMaXN0IiwiRE9NU3RyaW5nTGlzdCIsIkRhdGFUcmFuc2Zlckl0ZW1MaXN0IiwiRmlsZUxpc3QiLCJIVE1MQWxsQ29sbGVjdGlvbiIsIkhUTUxDb2xsZWN0aW9uIiwiSFRNTEZvcm1FbGVtZW50IiwiSFRNTFNlbGVjdEVsZW1lbnQiLCJNZWRpYUxpc3QiLCJNaW1lVHlwZUFycmF5IiwiTmFtZWROb2RlTWFwIiwiTm9kZUxpc3QiLCJQYWludFJlcXVlc3RMaXN0IiwiUGx1Z2luIiwiUGx1Z2luQXJyYXkiLCJTVkdMZW5ndGhMaXN0IiwiU1ZHTnVtYmVyTGlzdCIsIlNWR1BhdGhTZWdMaXN0IiwiU1ZHUG9pbnRMaXN0IiwiU1ZHU3RyaW5nTGlzdCIsIlNWR1RyYW5zZm9ybUxpc3QiLCJTb3VyY2VCdWZmZXJMaXN0IiwiU3R5bGVTaGVldExpc3QiLCJUZXh0VHJhY2tDdWVMaXN0IiwiVGV4dFRyYWNrTGlzdCIsIlRvdWNoTGlzdCIsIlNldCIsImNvbGxlY3Rpb25XZWFrIiwiZW5mb3JjZUl0ZXJuYWxTdGF0ZSIsIklTX0lFMTEiLCJJbnRlcm5hbFdlYWtNYXAiLCIkV2Vha01hcCIsIldlYWtNYXBQcm90b3R5cGUiLCJuYXRpdmVEZWxldGUiLCJuYXRpdmVIYXMiLCJuYXRpdmVHZXQiLCJuYXRpdmVTZXQiLCJmcm96ZW4iLCJBcnJheUl0ZXJhdGlvbk1vZHVsZSIsIiRoYXMiLCJmaW5kIiwiZmluZEluZGV4IiwidW5jYXVnaHRGcm96ZW5TdG9yZSIsIlVuY2F1Z2h0RnJvemVuU3RvcmUiLCJmaW5kVW5jYXVnaHRGcm96ZW4iLCJzcGxpY2UiLCJhcnJheVNwZWNpZXNDcmVhdGUiLCJJU19GSUxURVIiLCJJU19TT01FIiwiSVNfRVZFUlkiLCJJU19GSU5EX0lOREVYIiwiTk9fSE9MRVMiLCJzcGVjaWZpY0NyZWF0ZSIsIm1hcCIsImZpbHRlciIsInNvbWUiLCJldmVyeSIsImlzQXJyYXkiLCJvcmlnaW5hbEFycmF5IiwiYXJnIiwiV2Vha1NldCIsImNvZGVQb2ludEF0IiwiZnJvbUNvZGVQb2ludCIsImZyb21DaGFyQ29kZSIsIm5hdGl2ZUZyb21Db2RlUG9pbnQiLCJJTkNPUlJFQ1RfTEVOR1RIIiwiZWxlbWVudHMiLCJSYW5nZUVycm9yIiwiYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCIsIlY4X1ZFUlNJT04iLCJJU19DT05DQVRfU1BSRUFEQUJMRSIsIk1BWF9TQUZFX0lOVEVHRVIiLCJNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQiLCJJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUIiwiYXJyYXkiLCJTUEVDSUVTX1NVUFBPUlQiLCJpc0NvbmNhdFNwcmVhZGFibGUiLCJzcHJlYWRhYmxlIiwibiIsIkUiLCJmb28iLCJCb29sZWFuIiwidmVyc2lvbnMiLCJ2OCIsIm1hdGNoIiwibmF0aXZlT2JqZWN0Q3JlYXRlIiwiZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsIiwid3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSIsImRlZmluZVdlbGxLbm93blN5bWJvbCIsIiRmb3JFYWNoIiwiU1lNQk9MIiwiVE9fUFJJTUlUSVZFIiwiJFN5bWJvbCIsIiRzdHJpbmdpZnkiLCJuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzIiwiQWxsU3ltYm9scyIsIk9iamVjdFByb3RvdHlwZVN5bWJvbHMiLCJTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5IiwiU3ltYm9sVG9TdHJpbmdSZWdpc3RyeSIsIlFPYmplY3QiLCJVU0VfU0VUVEVSIiwiZmluZENoaWxkIiwic2V0U3ltYm9sRGVzY3JpcHRvciIsIk9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IiLCJ3cmFwIiwiZGVzY3JpcHRpb24iLCJpc1N5bWJvbCIsIiRkZWZpbmVQcm9wZXJ0eSIsIiRkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIiRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCIkcHJvcGVydHlJc0VudW1lcmFibGUiLCIkY3JlYXRlIiwiJGdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIiRnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiSVNfT0JKRUNUX1BST1RPVFlQRSIsImtleUZvciIsInN5bSIsInVzZVNldHRlciIsInVzZVNpbXBsZSIsIkZPUkNFRF9KU09OX1NUUklOR0lGWSIsInN0cmluZ2lmeSIsInJlcGxhY2VyIiwic3BhY2UiLCIkcmVwbGFjZXIiLCJ3aW5kb3dOYW1lcyIsImdldFdpbmRvd05hbWVzIiwiTmF0aXZlU3ltYm9sIiwiRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlIiwiU3ltYm9sV3JhcHBlciIsInN5bWJvbFByb3RvdHlwZSIsInN5bWJvbFRvU3RyaW5nIiwibmF0aXZlIiwiZGVzYyIsIkpTT04iLCIkcGFkU3RhcnQiLCJXRUJLSVRfQlVHIiwicGFkU3RhcnQiLCJtYXhMZW5ndGgiLCJyZXBlYXQiLCJJU19FTkQiLCJmaWxsU3RyaW5nIiwic3RyaW5nTGVuZ3RoIiwiZmlsbFN0ciIsImludE1heExlbmd0aCIsImZpbGxMZW4iLCJzdHJpbmdGaWxsZXIiLCJjb3VudCIsIkluZmluaXR5IiwiJHBhZEVuZCIsInBhZEVuZCIsIiR2YWx1ZXMiLCJUT19FTlRSSUVTIiwiJGVudHJpZXMiLCJKYmlnMkltYWdlIiwiQ29udGV4dENhY2hlIiwiZ2V0Q29udGV4dHMiLCJEZWNvZGluZ0NvbnRleHQiLCJkZWNvZGVyIiwiY29udGV4dHMiLCJjb250ZXh0Q2FjaGUiLCJiaXQiLCJzaWduIiwicmVhZEJpdHMiLCJjb2RlTGVuZ3RoIiwiU2VnbWVudFR5cGVzIiwiQ29kaW5nVGVtcGxhdGVzIiwieSIsIlJlZmluZW1lbnRUZW1wbGF0ZXMiLCJjb2RpbmciLCJyZWZlcmVuY2UiLCJSZXVzZWRDb250ZXh0cyIsIlJlZmluZW1lbnRSZXVzZWRDb250ZXh0cyIsImRlY29kaW5nQ29udGV4dCIsIk9MRF9QSVhFTF9NQVNLIiwicm93Iiwicm93MSIsInJvdzIiLCJjb250ZXh0TGFiZWwiLCJwaXhlbCIsImRlY29kZU1NUkJpdG1hcCIsInRlbXBsYXRlSW5kZXgiLCJhdCIsImRlY29kZUJpdG1hcFRlbXBsYXRlMCIsInVzZXNraXAiLCJ0ZW1wbGF0ZSIsInRlbXBsYXRlTGVuZ3RoIiwidGVtcGxhdGVYIiwidGVtcGxhdGVZIiwiY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMiLCJyZXVzZU1hc2siLCJtaW5YIiwibWF4WCIsIm1pblkiLCJjaGFuZ2luZ0VudHJpZXNMZW5ndGgiLCJjaGFuZ2luZ1RlbXBsYXRlWCIsImNoYW5naW5nVGVtcGxhdGVZIiwiY2hhbmdpbmdUZW1wbGF0ZUJpdCIsInNiYl9sZWZ0Iiwic2JiX3RvcCIsInNiYl9yaWdodCIsIndpZHRoIiwicHNldWRvUGl4ZWxDb250ZXh0IiwibHRwIiwic2x0cCIsInNraXAiLCJpMCIsImowIiwic2hpZnQiLCJjb2RpbmdUZW1wbGF0ZSIsImNvZGluZ1RlbXBsYXRlTGVuZ3RoIiwiY29kaW5nVGVtcGxhdGVYIiwiY29kaW5nVGVtcGxhdGVZIiwicmVmZXJlbmNlVGVtcGxhdGUiLCJyZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCIsInJlZmVyZW5jZVRlbXBsYXRlWCIsInJlZmVyZW5jZVRlbXBsYXRlWSIsInJlZmVyZW5jZVdpZHRoIiwicmVmZXJlbmNlQml0bWFwIiwicmVmZXJlbmNlSGVpZ2h0IiwiaHVmZm1hbiIsIm5ld1N5bWJvbHMiLCJjdXJyZW50SGVpZ2h0Iiwic3ltYm9sQ29kZUxlbmd0aCIsInN5bWJvbHMiLCJ0YWJsZUIxIiwiZ2V0U3RhbmRhcmRUYWJsZSIsInN5bWJvbFdpZHRocyIsImRlbHRhSGVpZ2h0IiwiaHVmZm1hblRhYmxlcyIsImRlY29kZUludGVnZXIiLCJjdXJyZW50V2lkdGgiLCJ0b3RhbFdpZHRoIiwiZmlyc3RTeW1ib2wiLCJkZWx0YVdpZHRoIiwibnVtYmVyT2ZJbnN0YW5jZXMiLCJkZWNvZGVUZXh0UmVnaW9uIiwic3ltYm9sSWQiLCJkZWNvZGVJQUlEIiwicmR4IiwicmR5IiwiZGVjb2RlUmVmaW5lbWVudCIsImRlY29kZUJpdG1hcCIsImJpdG1hcFNpemUiLCJodWZmbWFuSW5wdXQiLCJjb2xsZWN0aXZlQml0bWFwIiwicmVhZFVuY29tcHJlc3NlZEJpdG1hcCIsIm9yaWdpbmFsRW5kIiwiYml0bWFwRW5kIiwibnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCIsInhNaW4iLCJ4TWF4IiwiYml0bWFwV2lkdGgiLCJzeW1ib2xCaXRtYXAiLCJleHBvcnRlZFN5bWJvbHMiLCJmbGFncyIsImN1cnJlbnRGbGFnIiwidG90YWxTeW1ib2xzTGVuZ3RoIiwicnVuTGVuZ3RoIiwic3RyaXBUIiwiZmlyc3RTIiwiZGVsdGFUIiwiZGVsdGFGaXJzdFMiLCJjdXJyZW50UyIsImN1cnJlbnRUIiwic3RyaXBTaXplIiwidCIsImFwcGx5UmVmaW5lbWVudCIsInJlZmluZW1lbnQiLCJpbnB1dFN5bWJvbHMiLCJzeW1ib2xXaWR0aCIsInN5bWJvbEhlaWdodCIsInJkdyIsInJkaCIsIm9mZnNldFQiLCJvZmZzZXRTIiwiczIiLCJzeW1ib2xSb3ciLCJtYXhXaWR0aCIsInQyIiwiZGVsdGFTIiwiY29sbGVjdGl2ZVdpZHRoIiwicGF0dGVybnMiLCJwYXR0ZXJuQml0bWFwIiwicGF0dGVybldpZHRoIiwiY29tYmluYXRpb25PcGVyYXRvciIsInJlZ2lvbkJpdG1hcCIsIm51bWJlck9mUGF0dGVybnMiLCJwYXR0ZXJuMCIsInBhdHRlcm5IZWlnaHQiLCJiaXRzUGVyVmFsdWUiLCJncmF5U2NhbGVCaXRQbGFuZXMiLCJtbXJJbnB1dCIsIm1nIiwibmciLCJwYXR0ZXJuSW5kZXgiLCJncmlkT2Zmc2V0WCIsImdyaWRPZmZzZXRZIiwicmVnaW9uUm93IiwicGF0dGVyblJvdyIsInJlZ2lvblgiLCJyZWdpb25ZIiwic2VnbWVudEhlYWRlciIsInJlYWRVaW50MzIiLCJzZWdtZW50VHlwZSIsInBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSIsInJlZmVycmVkRmxhZ3MiLCJyZWZlcnJlZFRvQ291bnQiLCJyZXRhaW5CaXRzIiwicmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplIiwicmVmZXJyZWRUbyIsInJlYWRVaW50MTYiLCJnZW5lcmljUmVnaW9uSW5mbyIsInJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24iLCJnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzIiwiZ2VuZXJpY1JlZ2lvbk1tciIsInNlYXJjaFBhdHRlcm5MZW5ndGgiLCJzZWFyY2hQYXR0ZXJuIiwic2VnbWVudHMiLCJyZWFkU2VnbWVudEhlYWRlciIsInNlZ21lbnQiLCJoZWFkZXIiLCJoZWlnaHQiLCJSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCIsImRpY3Rpb25hcnkiLCJkaWN0aW9uYXJ5RmxhZ3MiLCJhdExlbmd0aCIsInJlYWRJbnQ4IiwidGV4dFJlZ2lvbiIsInRleHRSZWdpb25TZWdtZW50RmxhZ3MiLCJ0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzIiwicGF0dGVybkRpY3Rpb25hcnkiLCJwYXR0ZXJuRGljdGlvbmFyeUZsYWdzIiwiaGFsZnRvbmVSZWdpb24iLCJoYWxmdG9uZVJlZ2lvbkZsYWdzIiwiZ2VuZXJpY1JlZ2lvbiIsInBhZ2VJbmZvIiwicmVzb2x1dGlvblgiLCJyZXNvbHV0aW9uWSIsInBhZ2VTZWdtZW50RmxhZ3MiLCJjYWxsYmFja05hbWUiLCJ2aXNpdG9yIiwicHJvY2Vzc1NlZ21lbnQiLCJjaHVua3MiLCJyZWFkU2VnbWVudHMiLCJwcm9jZXNzU2VnbWVudHMiLCJiaXRQYWNrZWQiLCJpbWdEYXRhIiwicSIsIm1hc2siLCJTaW1wbGVTZWdtZW50VmlzaXRvciIsIm9uUGFnZUluZm9ybWF0aW9uIiwicm93U2l6ZSIsImluZm8iLCJkcmF3Qml0bWFwIiwicmVnaW9uSW5mbyIsIm1hc2swIiwib2Zmc2V0MCIsIm9mZnNldCIsIm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsInJlZ2lvbiIsIm9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uIiwib25TeW1ib2xEaWN0aW9uYXJ5IiwiZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMiLCJyZWZlcnJlZFNlZ21lbnRzIiwicmVmZXJyZWRTeW1ib2xzIiwiZGVjb2RlU3ltYm9sRGljdGlvbmFyeSIsIm9uSW1tZWRpYXRlVGV4dFJlZ2lvbiIsImdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzIiwib25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24iLCJvblBhdHRlcm5EaWN0aW9uYXJ5IiwiZGVjb2RlUGF0dGVybkRpY3Rpb25hcnkiLCJvbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwiZGVjb2RlSGFsZnRvbmVSZWdpb24iLCJvbkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24iLCJvblRhYmxlcyIsImN1c3RvbVRhYmxlcyIsImRlY29kZVRhYmxlc1NlZ21lbnQiLCJsaW5lRGF0YSIsImxpbmUiLCJIdWZmbWFuVHJlZU5vZGUiLCJidWlsZFRyZWUiLCJub2RlIiwiZGVjb2RlTm9kZSIsImh0T2Zmc2V0IiwicmVhZGVyIiwibGluZXMiLCJIdWZmbWFuVGFibGUiLCJkZWNvZGUiLCJhc3NpZ25QcmVmaXhDb2RlcyIsImxpbmVzTGVuZ3RoIiwicHJlZml4TGVuZ3RoTWF4IiwiaGlzdG9ncmFtIiwiY3VycmVudExlbmd0aCIsImZpcnN0Q29kZSIsImN1cnJlbnRDb2RlIiwiY3VycmVudFRlbXAiLCJsb3dlc3RWYWx1ZSIsImhpZ2hlc3RWYWx1ZSIsInByZWZpeFNpemVCaXRzIiwicmFuZ2VTaXplQml0cyIsImN1cnJlbnRSYW5nZUxvdyIsInByZWZpeExlbmd0aCIsInJhbmdlTGVuZ3RoIiwic3RhbmRhcmRUYWJsZXNDYWNoZSIsInRhYmxlIiwiUmVhZGVyIiwicmVhZEJpdCIsIm51bUJpdHMiLCJieXRlQWxpZ24iLCJjdXJyZW50SW5kZXgiLCJjb2RlcyIsInJ1bkNvZGVzVGFibGUiLCJyZXBlYXRlZExlbmd0aCIsIm51bWJlck9mUmVwZWF0cyIsInN5bWJvbElEVGFibGUiLCJjdXN0b21JbmRleCIsInRhYmxlRmlyc3RTIiwiZ2V0Q3VzdG9tSHVmZm1hblRhYmxlIiwidGFibGVEZWx0YVMiLCJ0YWJsZURlbHRhVCIsInRhYmxlRGVsdGFIZWlnaHQiLCJ0YWJsZURlbHRhV2lkdGgiLCJ0YWJsZUJpdG1hcFNpemUiLCJ0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyIsInBhcmFtcyIsIksiLCJDb2x1bW5zIiwiUm93cyIsIkJsYWNrSXMxIiwiRW5kT2ZCbG9jayIsImVvZiIsImN1cnJlbnRCeXRlIiwiZW5kT2ZCbG9jayIsImxvb2tGb3JFT0ZMaW1pdCIsInBhcnNlQ2h1bmtzIiwicGFyc2VKYmlnMkNodW5rcyIsInBhcnNlIiwicGFyc2VKYmlnMiIsImxvb2t1cCIsImluaXRpYWxpemVyIiwiZ2V0QXJyYXkiLCJzdG9wV2hlbkZvdW5kIiwiTE9PUF9MSU1JVCIsImxvb3BDb3VudCIsImRpY3QiLCJST01BTl9OVU1CRVJfTUFQIiwibG93ZXJDYXNlIiwicm9tYW5CdWYiLCJyb21hblN0ciIsImNoIiwiUWVUYWJsZSIsInFlIiwibm1wcyIsIm5scHMiLCJzd2l0Y2hGbGFnIiwiYnAiLCJjeF9pbmRleCIsImN4X21wcyIsInFlVGFibGVJY3giLCJxZUljeCIsIkNDSVRURmF4RGVjb2RlciIsImNjaXR0RU9MIiwiY2NpdHRFT0YiLCJ0d29EaW1QYXNzIiwidHdvRGltSG9yaXoiLCJ0d29EaW1WZXJ0MCIsInR3b0RpbVZlcnRSMSIsInR3b0RpbVZlcnRMMSIsInR3b0RpbVZlcnRSMiIsInR3b0RpbVZlcnRMMiIsInR3b0RpbVZlcnRSMyIsInR3b0RpbVZlcnRMMyIsInR3b0RpbVRhYmxlIiwid2hpdGVUYWJsZTEiLCJ3aGl0ZVRhYmxlMiIsImJsYWNrVGFibGUxIiwiYmxhY2tUYWJsZTIiLCJibGFja1RhYmxlMyIsImVvYmxvY2siLCJjb2RlMSIsInJlYWROZXh0Q2hhciIsInJlZkxpbmUiLCJjb2RpbmdMaW5lIiwiY29sdW1ucyIsInJlZlBvcyIsImJsYWNrUGl4ZWxzIiwiY29kZTIiLCJjb2RlMyIsImdvdEVPTCIsImJpdHMiLCJfYWRkUGl4ZWxzIiwiY29kaW5nUG9zIiwiYTEiLCJfYWRkUGl4ZWxzTmVnIiwiX2ZpbmRUYWJsZUNvZGUiLCJsaW1pdFZhbHVlIiwibGltaXQiLCJfZ2V0VHdvRGltQ29kZSIsIl9nZXRXaGl0ZUNvZGUiLCJfZ2V0QmxhY2tDb2RlIiwiX2xvb2tCaXRzIiwiX2VhdEJpdHMiLCJKcGVnSW1hZ2UiLCJkY3RaaWdaYWciLCJkY3RDb3MxIiwiZGN0U2luMSIsImRjdENvczMiLCJkY3RTaW4zIiwiZGN0Q29zNiIsImRjdFNpbjYiLCJkY3RTcXJ0MiIsImRjdFNxcnQxZDIiLCJkZWNvZGVUcmFuc2Zvcm0iLCJjb2xvclRyYW5zZm9ybSIsImNvZGVMZW5ndGhzIiwiY2hpbGRyZW4iLCJwYXJzZUROTE1hcmtlciIsIm1jdXNQZXJMaW5lIiwiZnJhbWUiLCJwcm9ncmVzc2l2ZSIsInN0YXJ0T2Zmc2V0IiwiYml0c0RhdGEiLCJiaXRzQ291bnQiLCJuZXh0Qnl0ZSIsInNjYW5MaW5lcyIsIm1heWJlU2NhbkxpbmVzIiwiYmxvY2tSb3ciLCJyZWNlaXZlIiwiZGVjb2RlSHVmZm1hbiIsImNvbXBvbmVudCIsImRpZmYiLCJyZWNlaXZlQW5kRXh0ZW5kIiwicnMiLCJzIiwieiIsImJsb2NrT2Zmc2V0IiwiZW9icnVuIiwic3VjY2Vzc2l2ZUFDU3RhdGUiLCJvZmZzZXRaIiwic3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIiwibWN1Um93IiwibWN1IiwibWN1Q29sIiwiYmxvY2tDb2wiLCJnZXRCbG9ja0J1ZmZlck9mZnNldCIsImNvbXBvbmVudHNMZW5ndGgiLCJjb21wb25lbnRzIiwic3BlY3RyYWxTdGFydCIsImRlY29kZUZuIiwic3VjY2Vzc2l2ZVByZXYiLCJtY3VFeHBlY3RlZCIsIm1jdVRvUmVhZCIsInJlc2V0SW50ZXJ2YWwiLCJkZWNvZGVCbG9jayIsImgiLCJkZWNvZGVNY3UiLCJmaWxlTWFya2VyIiwiZmluZE5leHRGaWxlTWFya2VyIiwicGFydGlhbE1zZyIsInF0IiwiYmxvY2tEYXRhIiwicDAiLCJibG9ja0J1ZmZlck9mZnNldCIsInA1IiwicDYiLCJwNyIsInYwIiwidjEiLCJ2MiIsInYzIiwidjQiLCJ2NyIsInY1IiwidjYiLCJjb2wiLCJibG9ja3NQZXJMaW5lIiwiYmxvY2tzUGVyQ29sdW1uIiwiY29tcHV0YXRpb25CdWZmZXIiLCJxdWFudGl6ZUFuZEludmVyc2UiLCJzdGFydFBvcyIsIm1heFBvcyIsIm5ld1BvcyIsImN1cnJlbnRQb3MiLCJjdXJyZW50TWFya2VyIiwiaW52YWxpZCIsIm1hcmtlciIsIm5ld01hcmtlciIsImRubFNjYW5MaW5lcyIsImVuZE9mZnNldCIsIm1jdXNQZXJDb2x1bW4iLCJibG9ja3NQZXJMaW5lRm9yTWN1IiwiYmxvY2tzUGVyQ29sdW1uRm9yTWN1IiwiYmxvY2tzQnVmZmVyU2l6ZSIsImpmaWYiLCJhZG9iZSIsIm51bVNPU01hcmtlcnMiLCJxdWFudGl6YXRpb25UYWJsZXMiLCJodWZmbWFuVGFibGVzQUMiLCJodWZmbWFuVGFibGVzREMiLCJhcHBEYXRhIiwicmVhZERhdGFCbG9jayIsIm1ham9yIiwibWlub3IiLCJkZW5zaXR5VW5pdHMiLCJ4RGVuc2l0eSIsInlEZW5zaXR5IiwidGh1bWJXaWR0aCIsInRodW1iSGVpZ2h0IiwidGh1bWJEYXRhIiwiZmxhZ3MwIiwiZmxhZ3MxIiwidHJhbnNmb3JtQ29kZSIsInF1YW50aXphdGlvblRhYmxlc0xlbmd0aCIsInF1YW50aXphdGlvblRhYmxlc0VuZCIsInF1YW50aXphdGlvblRhYmxlU3BlYyIsInRhYmxlRGF0YSIsInNvZlNjYW5MaW5lcyIsImNvbXBvbmVudHNDb3VudCIsIm1heEgiLCJtYXhWIiwiY29tcG9uZW50SWQiLCJxSWQiLCJsIiwicXVhbnRpemF0aW9uSWQiLCJxdWFudGl6YXRpb25UYWJsZSIsInByZXBhcmVDb21wb25lbnRzIiwiaHVmZm1hbkxlbmd0aCIsImh1ZmZtYW5UYWJsZVNwZWMiLCJjb2RlTGVuZ3RoU3VtIiwiaHVmZm1hblZhbHVlcyIsImJ1aWxkSHVmZm1hblRhYmxlIiwic2VsZWN0b3JzQ291bnQiLCJjb21wb25lbnRJbmRleCIsInRhYmxlU3BlYyIsInNwZWN0cmFsRW5kIiwic3VjY2Vzc2l2ZUFwcHJveGltYXRpb24iLCJwcm9jZXNzZWQiLCJkZWNvZGVTY2FuIiwiZXgiLCJuZXh0RmlsZU1hcmtlciIsIm91dHB1dCIsImJ1aWxkQ29tcG9uZW50RGF0YSIsInNjYWxlWCIsInNjYWxlWSIsIl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhIiwiaXNTb3VyY2VQREYiLCJudW1Db21wb25lbnRzIiwiZGF0YUxlbmd0aCIsInhTY2FsZUJsb2NrT2Zmc2V0IiwibWFzazNMU0IiLCJjb21wb25lbnRTY2FsZVgiLCJjb21wb25lbnRTY2FsZVkiLCJibG9ja3NQZXJTY2FubGluZSIsImxhc3RDb21wb25lbnRTY2FsZVgiLCJfY29udmVydFljY1RvUmdiIiwiWSIsIkNiIiwiQ3IiLCJfY29udmVydFljY2tUb1JnYiIsIl9jb252ZXJ0WWNja1RvQ215ayIsIl9jb252ZXJ0Q215a1RvUmdiIiwiZ2V0RGF0YSIsImZvcmNlUkdCIiwicmdiRGF0YSIsImdyYXlDb2xvciIsIkpweEltYWdlIiwiU3ViYmFuZHNHYWluTG9nMiIsIkxMIiwiTEgiLCJITCIsIkhIIiwiaGVhZCIsImhlYWRlclNpemUiLCJsYm94IiwidGJveCIsImp1bXBEYXRhTGVuZ3RoIiwiY29sb3JzcGFjZSIsImhlYWRlclR5cGUiLCJwYXJzZUltYWdlUHJvcGVydGllcyIsIm5ld0J5dGUiLCJzdHJlYW0iLCJvbGRCeXRlIiwiWHNpeiIsIllzaXoiLCJYT3NpeiIsIllPc2l6IiwiQ3NpeiIsInBhcnNlQ29kZXN0cmVhbSIsImNvbnRleHQiLCJkb05vdFJlY292ZXIiLCJzaXoiLCJwcmVjaXNpb24iLCJpc1NpZ25lZCIsIlhSc2l6IiwiWVJzaXoiLCJjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zIiwiY2FsY3VsYXRlVGlsZUdyaWRzIiwicWNkIiwic3FjZCIsInNwcWNkU2l6ZSIsInNjYWxhckV4cG91bmRlZCIsInNwcWNkcyIsInNwcWNkIiwicWNjIiwiY3FjYyIsImNvZCIsInNjb2QiLCJibG9ja1N0eWxlIiwicHJlY2luY3RzU2l6ZXMiLCJwcmVjaW5jdHNTaXplIiwiUFB4IiwiUFB5IiwidW5zdXBwb3J0ZWQiLCJ0aWxlIiwiaW5pdGlhbGl6ZVRpbGUiLCJidWlsZFBhY2tldHMiLCJwYXJzZVRpbGVQYWNrZXRzIiwidHJhbnNmb3JtQ29tcG9uZW50cyIsInRpbGVzIiwibnVtWHRpbGVzIiwibnVtWXRpbGVzIiwiamoiLCJ0aWxlQ29tcG9uZW50IiwiY29kT3JDb2MiLCJwcmVjaW5jdFdpZHRoIiwiZGltZW5zaW9ucyIsInByZWNpbmN0SGVpZ2h0IiwiaXNaZXJvUmVzIiwicmVzb2x1dGlvbiIsInByZWNpbmN0V2lkdGhJblN1YmJhbmQiLCJwcmVjaW5jdEhlaWdodEluU3ViYmFuZCIsIm51bXByZWNpbmN0c3dpZGUiLCJudW1wcmVjaW5jdHNoaWdoIiwibnVtcHJlY2luY3RzIiwieGNiXyIsInljYl8iLCJjb2RlYmxvY2tXaWR0aCIsImNvZGVibG9ja0hlaWdodCIsImNieDAiLCJzdWJiYW5kIiwiY2J5MCIsImNieDEiLCJjYnkxIiwicHJlY2luY3RQYXJhbWV0ZXJzIiwiY29kZWJsb2NrcyIsInByZWNpbmN0cyIsImNvZGVibG9jayIsImNieCIsImNieSIsInRieDAiLCJ0YnkwIiwidGJ4MSIsInRieTEiLCJwaSIsInBqIiwicHJlY2luY3ROdW1iZXIiLCJwcmVjaW5jdCIsImNieE1pbiIsImNieU1pbiIsImNieE1heCIsImNieU1heCIsIm51bWNvZGVibG9ja3dpZGUiLCJudW1jb2RlYmxvY2toaWdoIiwicHJlY2luY3RDb2RlYmxvY2tzIiwic3ViYmFuZHMiLCJsYXllck51bWJlciIsInRpbGVJbmRleCIsImxheWVyc0NvdW50IiwibWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50IiwicGFja2V0IiwiY3JlYXRlUGFja2V0IiwibWF4TnVtUHJlY2luY3RzSW5MZXZlbCIsIm1heE51bVByZWNpbmN0cyIsInJlc29sdXRpb25zIiwiZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSIsInByZWNpbmN0c0l0ZXJhdGlvblNpemVzIiwicHgiLCJweSIsImRlY29tcG9zaXRpb25MZXZlbHNDb3VudCIsInNpemVJbkltYWdlU2NhbGUiLCJnZXRQcmVjaW5jdEluZGV4SWZFeGlzdCIsInBvc1giLCJweEluZGV4IiwicHJlY2luY3RJdGVyYXRpb25TaXplcyIsInBvc1kiLCJweUluZGV4Iiwic3RhcnRQcmVjaW5jdFJvd0luZGV4IiwibWluV2lkdGgiLCJtaW5IZWlnaHQiLCJtYXhOdW1XaWRlIiwibWF4TnVtSGlnaCIsInNpemVQZXJDb21wb25lbnQiLCJzaXplUGVyUmVzb2x1dGlvbiIsIm1pbldpZHRoQ3VycmVudENvbXBvbmVudCIsIm1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQiLCJtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCIsIm1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50Iiwic2NhbGUiLCJ3aWR0aEN1cnJlbnRSZXNvbHV0aW9uIiwiaGVpZ2h0Q3VycmVudFJlc29sdXRpb24iLCJibG9ja3NEaW1lbnNpb25zIiwiZ2V0QmxvY2tzRGltZW5zaW9ucyIsImJ1aWxkUHJlY2luY3RzIiwiYnVpbGRDb2RlYmxvY2tzIiwiYnNjYWxlIiwicmVzb2x1dGlvblN1YmJhbmRzIiwicHJvZ3Jlc3Npb25PcmRlciIsImJ1ZmZlclNpemUiLCJza2lwTmV4dEJpdCIsInNraXBCeXRlcyIsInNvcE1hcmtlclVzZWQiLCJlcGhNYXJrZXJVc2VkIiwicGFja2V0c0l0ZXJhdG9yIiwiYWxpZ25Ub0J5dGUiLCJza2lwTWFya2VySWZFcXVhbCIsInF1ZXVlIiwiY29kZWJsb2NrQ29sdW1uIiwiY29kZWJsb2NrUm93IiwiY29kZWJsb2NrSW5jbHVkZWQiLCJmaXJzdFRpbWVJbmNsdXNpb24iLCJpbmNsdXNpb25UcmVlIiwiemVyb0JpdFBsYW5lc1RyZWUiLCJ2YWx1ZVJlYWR5IiwiY29kaW5ncGFzc2VzIiwicmVhZENvZGluZ3Bhc3NlcyIsImNvZGluZ3Bhc3Nlc0xvZzIiLCJjb2RlZERhdGFMZW5ndGgiLCJwYWNrZXRJdGVtIiwieDAiLCJ5MCIsInJpZ2h0IiwiYm90dG9tIiwiYmxvY2tXaWR0aCIsImJsb2NrSGVpZ2h0IiwiYml0TW9kZWwiLCJjdXJyZW50Q29kaW5ncGFzc1R5cGUiLCJ0b3RhbExlbmd0aCIsImRhdGFJdGVtIiwiZW5jb2RlZERhdGEiLCJtYWduaXR1ZGUiLCJiaXRzRGVjb2RlZCIsIm1hZ25pdHVkZUNvcnJlY3Rpb24iLCJyZXZlcnNpYmxlIiwiaW50ZXJsZWF2ZSIsImxldmVsT2Zmc2V0IiwibmIiLCJjb2VmZmljaWVudHMiLCJtYiIsImNvZGluZ1N0eWxlUGFyYW1ldGVycyIsInF1YW50aXphdGlvblBhcmFtZXRlcnMiLCJndWFyZEJpdHMiLCJzZWdtZW50YXRpb25TeW1ib2xVc2VkIiwic3ViYmFuZENvZWZmaWNpZW50cyIsIm11IiwiZXBzaWxvbiIsImdhaW5Mb2cyIiwiZGVsdGEiLCJjb3B5Q29lZmZpY2llbnRzIiwiaXRlbXMiLCJsZWZ0IiwidG9wIiwicmVzdWx0SW1hZ2VzIiwidHJhbnNmb3JtZWRUaWxlcyIsInRyYW5zZm9ybVRpbGUiLCJ0aWxlMCIsIm91dCIsImZvdXJDb21wb25lbnRzIiwieTBpdGVtcyIsInkxaXRlbXMiLCJ5Mml0ZW1zIiwieTNpdGVtcyIsImNvbXBvbmVudDAiLCJhbHBoYTAxIiwieTEiLCJ5MiIsImciLCJxY2RPclFjYyIsIlRhZ1RyZWUiLCJsZXZlbHNMZW5ndGgiLCJsZXZlbCIsInJlc2V0IiwiY3VycmVudExldmVsIiwiaW5jcmVtZW50VmFsdWUiLCJuZXh0TGV2ZWwiLCJJbmNsdXNpb25UcmVlIiwic3RvcFZhbHVlIiwicHJvcGFnYXRlVmFsdWVzIiwibGV2ZWxJbmRleCIsImN1cnJlbnRWYWx1ZSIsIkJpdE1vZGVsIiwiVU5JRk9STV9DT05URVhUIiwiUlVOTEVOR1RIX0NPTlRFWFQiLCJMTEFuZExIQ29udGV4dHNMYWJlbCIsIkhMQ29udGV4dExhYmVsIiwiSEhDb250ZXh0TGFiZWwiLCJjb250ZXh0TGFiZWxUYWJsZSIsImNvZWZmaWNpZW50Q291bnQiLCJjb2VmZmljZW50c01hZ25pdHVkZSIsInplcm9CaXRQbGFuZXMiLCJzZXREZWNvZGVyIiwic2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlIiwibmVpZ2hib3JzU2lnbmlmaWNhbmNlIiwiY29sdW1uIiwicnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzIiwiY29lZmZpY2VudHNTaWduIiwicHJvY2Vzc2luZ0ZsYWdzIiwibGFiZWxzIiwicHJvY2Vzc2VkSW52ZXJzZU1hc2siLCJwcm9jZXNzZWRNYXNrIiwiZmlyc3RNYWduaXR1ZGVCaXRNYXNrIiwiaTEiLCJkZWNpc2lvbiIsImRlY29kZVNpZ25CaXQiLCJzaWduaWZpY2FuY2UxIiwic2lnbjEiLCJzaWduMCIsImNvbnRyaWJ1dGlvbiIsImhvcml6b250YWxDb250cmlidXRpb24iLCJkZWNvZGVkIiwicnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MiLCJ3aWR0aDQiLCJpbmRleDAiLCJpbmRleE5leHQiLCJzaWduaWZpY2FuY2UiLCJydW5DbGVhbnVwUGFzcyIsIm9uZVJvd0Rvd24iLCJ0d29Sb3dzRG93biIsInRocmVlUm93c0Rvd24iLCJpTmV4dCIsImluZGV4QmFzZSIsImNoZWNrQWxsRW1wdHkiLCJhbGxFbXB0eSIsImhhc1NpZ25pZmljYW50Q29lZmZpY2VudCIsImkyIiwiY2hlY2tTZWdtZW50YXRpb25TeW1ib2wiLCJUcmFuc2Zvcm0iLCJsbCIsImoxIiwiajIiLCJsbFdpZHRoIiwibGxIZWlnaHQiLCJsbEl0ZW1zIiwiaGxfbGhfaGgiLCJidWZmZXJQYWRkaW5nIiwicm93QnVmZmVyIiwibnVtQnVmZmVycyIsImNvbEJ1ZmZlcnMiLCJjdXJyZW50QnVmZmVyIiwidSIsIklycmV2ZXJzaWJsZVRyYW5zZm9ybSIsImFscGhhIiwiYmV0YSIsImdhbW1hIiwiS18iLCJjdXJyZW50IiwiUmV2ZXJzaWJsZVRyYW5zZm9ybSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7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SUFBUztBQUNQOU0saUJBRE8sQ0FDUEE7QUFDQTJqQyxzQkFBVUosUUFBUXJpQyxFQUFFbEIsSUFGYixDQUVXa0IsQ0FBbEJ5aUM7QUFDQXppQyxvQkFBUXlpQyxVQUhELElBR1B6aUM7QUFIRixpQkFJTztBQUFBO0FBUGtCO0FBSGQ7QUFsRWY7QUFYaUUsS0FPbkVvaUM7O0FBdUZBLFdBOUZtRSxxQkE4Rm5FO0FBcHhFdUMsR0FzckVaLEVBQTdCOztBQWtHQSxNQUFJTSxzQkFBdUIsc0NBQXNDO0FBRS9ELG1DQUErQjtBQUM3QnBCLHFCQUQ2QixJQUM3QkE7QUFINkQ7O0FBTS9Eb0Isb0NBQWdDeC9DLGNBQWNvK0MsVUFOaUIsU0FNL0JwK0MsQ0FBaEN3L0M7O0FBQ0FBLDJDQUF1QyxzREFJckM7QUFDQSxVQUFJdnNDLE1BQU1yUyxVQURWLENBQ0E7QUFDQXM1QixlQUFTQSxTQUZULENBRUFBO0FBQ0EsYUFIQSxDQUdBOztBQUVBLFdBQUt0ZSxZQUFZOE0sSUFBSXpWLE1BQXJCLEdBQThCeVYsQ0FBOUIsSUFBbUM5TSxLQUFuQyxHQUEyQztBQUN6Q2tCLGdCQUFTQSxFQUFFbEIsSUFBRmtCLEtBQVdBLEVBQUVsQixJQUFia0IsQ0FBV0EsQ0FBWEEsR0FBRCxDQUFDQSxJQURnQyxDQUN6Q0E7QUFORjs7QUFTQSxXQUFLbEIsSUFBSXNlLFNBQUp0ZSxHQUFnQjhNLElBQXJCLEtBQThCQSxDQUE5QixJQUFtQzlNLEtBQW5DLEdBQTJDO0FBQ3pDa0IsZ0JBQVNBLEVBQUVsQixJQUFGa0IsS0FBV0EsRUFBRWxCLElBQWQsQ0FBWWtCLENBQVhBLElBRGdDLENBQ3pDQTtBQVZGO0FBWDZELEtBTy9EMGlDOztBQWtCQSxXQXpCK0QsbUJBeUIvRDtBQWp6RXVDLEdBd3hFZCxFQUEzQjs7QUE0QkEsU0FwekV5QyxRQW96RXpDO0FBNzBFRixDQXlCZ0IsRUFBaEIiLCJmaWxlIjoicGRmLmltYWdlX2RlY29kZXJzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJwZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVyc1wiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJwZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVyc1wiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJwZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVyc1wiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd19wZGZqc19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dfcGRmanNfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193X3BkZmpzX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dfcGRmanNfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dfcGRmanNfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd19wZGZqc19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd19wZGZqc19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193X3BkZmpzX3JlcXVpcmVfXyhfX3dfcGRmanNfcmVxdWlyZV9fLnMgPSAwKTtcbiIsIi8qIENvcHlyaWdodCAyMDE4IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRWZXJib3NpdHlMZXZlbCwgc2V0VmVyYm9zaXR5TGV2ZWwgfSBmcm9tIFwiLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgSmJpZzJtYWdlIH0gZnJvbSBcIi4vY29yZS9qYmlnMi5qc1wiO1xuaW1wb3J0IHsgSnBlZ0ltYWdlIH0gZnJvbSBcIi4vY29yZS9qcGcuanNcIjtcbmltcG9ydCB7IEpweEltYWdlIH0gZnJvbSBcIi4vY29yZS9qcHguanNcIjtcblxuLy8gVG8gZW5zdXJlIHRoYXQgdGhlIHN0YW5kYWxvbmUgUERGLmpzIGltYWdlIGRlY29kZXJzIGhhdmUgdGhlIHNhbWVcbi8vIGJyb3dzZXIvZW52aXJvbm1lbnQgY29tcGF0aWJpbGl0eSBhcyB0aGUgcmVndWxhciBQREYuanMgbGlicmFyeSxcbi8vIHRoZSBzdGFuZGFyZCBzZXQgb2YgcG9seWZpbGxzIGFyZSB0aHVzIGluY2x1ZGVkIGluIHRoaXMgYnVpbGQgYXMgd2VsbC5cbi8vXG4vLyBHaXZlbiB0aGF0IHRoZSAoY3VycmVudCkgaW1hZ2UgZGVjb2RlcnMgZG9uJ3QgdXNlIGFsbCBvZiB0aGUgZmVhdHVyZXNcbi8vIG9mIHRoZSBjb21wbGV0ZSBQREYuanMgbGlicmFyeSwgZS5nLiB0aGV5IGFyZSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzLFxuLy8gc29tZSBvZiB0aGUgbGFyZ2VyIHBvbHlmaWxscyBhcmUgdGh1cyB1bm5lY2Vzc2FyeS5cbi8vXG4vLyBJbiBhbiBhdHRlbXB0IHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgc3RhbmRhbG9uZSBQREYuanMgaW1hZ2UgZGVjb2RlcnMsXG4vLyB0aGUgZm9sbG93aW5nIHBvbHlmaWxscyBhcmUgY3VycmVudGx5IGJlaW5nIGV4Y2x1ZGVkOlxuLy8gIC0gUmVhZGFibGVTdHJlYW1cbi8vICAtIFByb21pc2Vcbi8vICAtIFVSTFxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmNvbnN0IHBkZmpzVmVyc2lvbiA9IFBERkpTRGV2LmV2YWwoXCJCVU5ETEVfVkVSU0lPTlwiKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuY29uc3QgcGRmanNCdWlsZCA9IFBERkpTRGV2LmV2YWwoXCJCVU5ETEVfQlVJTERcIik7XG5cbmV4cG9ydCB7IEpiaWcybWFnZSwgSnBlZ0ltYWdlLCBKcHhJbWFnZSwgZ2V0VmVyYm9zaXR5TGV2ZWwsIHNldFZlcmJvc2l0eUxldmVsIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbmltcG9ydCBcIi4vY29tcGF0aWJpbGl0eS5qc1wiO1xuXG5jb25zdCBJREVOVElUWV9NQVRSSVggPSBbMSwgMCwgMCwgMSwgMCwgMF07XG5jb25zdCBGT05UX0lERU5USVRZX01BVFJJWCA9IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdO1xuXG4vLyBQZXJtaXNzaW9uIGZsYWdzIGZyb20gVGFibGUgMjIsIFNlY3Rpb24gNy42LjMuMiBvZiB0aGUgUERGIHNwZWNpZmljYXRpb24uXG5jb25zdCBQZXJtaXNzaW9uRmxhZyA9IHtcbiAgUFJJTlQ6IDB4MDQsXG4gIE1PRElGWV9DT05URU5UUzogMHgwOCxcbiAgQ09QWTogMHgxMCxcbiAgTU9ESUZZX0FOTk9UQVRJT05TOiAweDIwLFxuICBGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOiAweDEwMCxcbiAgQ09QWV9GT1JfQUNDRVNTSUJJTElUWTogMHgyMDAsXG4gIEFTU0VNQkxFOiAweDQwMCxcbiAgUFJJTlRfSElHSF9RVUFMSVRZOiAweDgwMCxcbn07XG5cbmNvbnN0IFRleHRSZW5kZXJpbmdNb2RlID0ge1xuICBGSUxMOiAwLFxuICBTVFJPS0U6IDEsXG4gIEZJTExfU1RST0tFOiAyLFxuICBJTlZJU0lCTEU6IDMsXG4gIEZJTExfQUREX1RPX1BBVEg6IDQsXG4gIFNUUk9LRV9BRERfVE9fUEFUSDogNSxcbiAgRklMTF9TVFJPS0VfQUREX1RPX1BBVEg6IDYsXG4gIEFERF9UT19QQVRIOiA3LFxuICBGSUxMX1NUUk9LRV9NQVNLOiAzLFxuICBBRERfVE9fUEFUSF9GTEFHOiA0LFxufTtcblxuY29uc3QgSW1hZ2VLaW5kID0ge1xuICBHUkFZU0NBTEVfMUJQUDogMSxcbiAgUkdCXzI0QlBQOiAyLFxuICBSR0JBXzMyQlBQOiAzLFxufTtcblxuY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7XG4gIFRFWFQ6IDEsXG4gIExJTks6IDIsXG4gIEZSRUVURVhUOiAzLFxuICBMSU5FOiA0LFxuICBTUVVBUkU6IDUsXG4gIENJUkNMRTogNixcbiAgUE9MWUdPTjogNyxcbiAgUE9MWUxJTkU6IDgsXG4gIEhJR0hMSUdIVDogOSxcbiAgVU5ERVJMSU5FOiAxMCxcbiAgU1FVSUdHTFk6IDExLFxuICBTVFJJS0VPVVQ6IDEyLFxuICBTVEFNUDogMTMsXG4gIENBUkVUOiAxNCxcbiAgSU5LOiAxNSxcbiAgUE9QVVA6IDE2LFxuICBGSUxFQVRUQUNITUVOVDogMTcsXG4gIFNPVU5EOiAxOCxcbiAgTU9WSUU6IDE5LFxuICBXSURHRVQ6IDIwLFxuICBTQ1JFRU46IDIxLFxuICBQUklOVEVSTUFSSzogMjIsXG4gIFRSQVBORVQ6IDIzLFxuICBXQVRFUk1BUks6IDI0LFxuICBUSFJFRUQ6IDI1LFxuICBSRURBQ1Q6IDI2LFxufTtcblxuY29uc3QgQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0ge1xuICBNQVJLRUQ6IFwiTWFya2VkXCIsXG4gIFJFVklFVzogXCJSZXZpZXdcIixcbn07XG5cbmNvbnN0IEFubm90YXRpb25NYXJrZWRTdGF0ZSA9IHtcbiAgTUFSS0VEOiBcIk1hcmtlZFwiLFxuICBVTk1BUktFRDogXCJVbm1hcmtlZFwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvblJldmlld1N0YXRlID0ge1xuICBBQ0NFUFRFRDogXCJBY2NlcHRlZFwiLFxuICBSRUpFQ1RFRDogXCJSZWplY3RlZFwiLFxuICBDQU5DRUxMRUQ6IFwiQ2FuY2VsbGVkXCIsXG4gIENPTVBMRVRFRDogXCJDb21wbGV0ZWRcIixcbiAgTk9ORTogXCJOb25lXCIsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uUmVwbHlUeXBlID0ge1xuICBHUk9VUDogXCJHcm91cFwiLFxuICBSRVBMWTogXCJSXCIsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uRmxhZyA9IHtcbiAgSU5WSVNJQkxFOiAweDAxLFxuICBISURERU46IDB4MDIsXG4gIFBSSU5UOiAweDA0LFxuICBOT1pPT006IDB4MDgsXG4gIE5PUk9UQVRFOiAweDEwLFxuICBOT1ZJRVc6IDB4MjAsXG4gIFJFQURPTkxZOiAweDQwLFxuICBMT0NLRUQ6IDB4ODAsXG4gIFRPR0dMRU5PVklFVzogMHgxMDAsXG4gIExPQ0tFRENPTlRFTlRTOiAweDIwMCxcbn07XG5cbmNvbnN0IEFubm90YXRpb25GaWVsZEZsYWcgPSB7XG4gIFJFQURPTkxZOiAweDAwMDAwMDEsXG4gIFJFUVVJUkVEOiAweDAwMDAwMDIsXG4gIE5PRVhQT1JUOiAweDAwMDAwMDQsXG4gIE1VTFRJTElORTogMHgwMDAxMDAwLFxuICBQQVNTV09SRDogMHgwMDAyMDAwLFxuICBOT1RPR0dMRVRPT0ZGOiAweDAwMDQwMDAsXG4gIFJBRElPOiAweDAwMDgwMDAsXG4gIFBVU0hCVVRUT046IDB4MDAxMDAwMCxcbiAgQ09NQk86IDB4MDAyMDAwMCxcbiAgRURJVDogMHgwMDQwMDAwLFxuICBTT1JUOiAweDAwODAwMDAsXG4gIEZJTEVTRUxFQ1Q6IDB4MDEwMDAwMCxcbiAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCxcbiAgRE9OT1RTUEVMTENIRUNLOiAweDA0MDAwMDAsXG4gIERPTk9UU0NST0xMOiAweDA4MDAwMDAsXG4gIENPTUI6IDB4MTAwMDAwMCxcbiAgUklDSFRFWFQ6IDB4MjAwMDAwMCxcbiAgUkFESU9TSU5VTklTT046IDB4MjAwMDAwMCxcbiAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMCxcbn07XG5cbmNvbnN0IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSB7XG4gIFNPTElEOiAxLFxuICBEQVNIRUQ6IDIsXG4gIEJFVkVMRUQ6IDMsXG4gIElOU0VUOiA0LFxuICBVTkRFUkxJTkU6IDUsXG59O1xuXG5jb25zdCBTdHJlYW1UeXBlID0ge1xuICBVTktOT1dOOiBcIlVOS05PV05cIixcbiAgRkxBVEU6IFwiRkxBVEVcIixcbiAgTFpXOiBcIkxaV1wiLFxuICBEQ1Q6IFwiRENUXCIsXG4gIEpQWDogXCJKUFhcIixcbiAgSkJJRzogXCJKQklHXCIsXG4gIEE4NTogXCJBODVcIixcbiAgQUhYOiBcIkFIWFwiLFxuICBDQ0Y6IFwiQ0NGXCIsXG4gIFJMWDogXCJSTFhcIiwgLy8gUERGIHNob3J0IG5hbWUgaXMgJ1JMJywgYnV0IHRlbGVtZXRyeSByZXF1aXJlcyB0aHJlZSBjaGFycy5cbn07XG5cbmNvbnN0IEZvbnRUeXBlID0ge1xuICBVTktOT1dOOiBcIlVOS05PV05cIixcbiAgVFlQRTE6IFwiVFlQRTFcIixcbiAgVFlQRTFDOiBcIlRZUEUxQ1wiLFxuICBDSURGT05UVFlQRTA6IFwiQ0lERk9OVFRZUEUwXCIsXG4gIENJREZPTlRUWVBFMEM6IFwiQ0lERk9OVFRZUEUwQ1wiLFxuICBUUlVFVFlQRTogXCJUUlVFVFlQRVwiLFxuICBDSURGT05UVFlQRTI6IFwiQ0lERk9OVFRZUEUyXCIsXG4gIFRZUEUzOiBcIlRZUEUzXCIsXG4gIE9QRU5UWVBFOiBcIk9QRU5UWVBFXCIsXG4gIFRZUEUwOiBcIlRZUEUwXCIsXG4gIE1NVFlQRTE6IFwiTU1UWVBFMVwiLFxufTtcblxuY29uc3QgVmVyYm9zaXR5TGV2ZWwgPSB7XG4gIEVSUk9SUzogMCxcbiAgV0FSTklOR1M6IDEsXG4gIElORk9TOiA1LFxufTtcblxuY29uc3QgQ01hcENvbXByZXNzaW9uVHlwZSA9IHtcbiAgTk9ORTogMCxcbiAgQklOQVJZOiAxLFxuICBTVFJFQU06IDIsXG59O1xuXG4vLyBBbGwgdGhlIHBvc3NpYmxlIG9wZXJhdGlvbnMgZm9yIGFuIG9wZXJhdG9yIGxpc3QuXG5jb25zdCBPUFMgPSB7XG4gIC8vIEludGVudGlvbmFsbHkgc3RhcnQgZnJvbSAxIHNvIGl0IGlzIGVhc3kgdG8gc3BvdCBiYWQgb3BlcmF0b3JzIHRoYXQgd2lsbCBiZVxuICAvLyAwJ3MuXG4gIGRlcGVuZGVuY3k6IDEsXG4gIHNldExpbmVXaWR0aDogMixcbiAgc2V0TGluZUNhcDogMyxcbiAgc2V0TGluZUpvaW46IDQsXG4gIHNldE1pdGVyTGltaXQ6IDUsXG4gIHNldERhc2g6IDYsXG4gIHNldFJlbmRlcmluZ0ludGVudDogNyxcbiAgc2V0RmxhdG5lc3M6IDgsXG4gIHNldEdTdGF0ZTogOSxcbiAgc2F2ZTogMTAsXG4gIHJlc3RvcmU6IDExLFxuICB0cmFuc2Zvcm06IDEyLFxuICBtb3ZlVG86IDEzLFxuICBsaW5lVG86IDE0LFxuICBjdXJ2ZVRvOiAxNSxcbiAgY3VydmVUbzI6IDE2LFxuICBjdXJ2ZVRvMzogMTcsXG4gIGNsb3NlUGF0aDogMTgsXG4gIHJlY3RhbmdsZTogMTksXG4gIHN0cm9rZTogMjAsXG4gIGNsb3NlU3Ryb2tlOiAyMSxcbiAgZmlsbDogMjIsXG4gIGVvRmlsbDogMjMsXG4gIGZpbGxTdHJva2U6IDI0LFxuICBlb0ZpbGxTdHJva2U6IDI1LFxuICBjbG9zZUZpbGxTdHJva2U6IDI2LFxuICBjbG9zZUVPRmlsbFN0cm9rZTogMjcsXG4gIGVuZFBhdGg6IDI4LFxuICBjbGlwOiAyOSxcbiAgZW9DbGlwOiAzMCxcbiAgYmVnaW5UZXh0OiAzMSxcbiAgZW5kVGV4dDogMzIsXG4gIHNldENoYXJTcGFjaW5nOiAzMyxcbiAgc2V0V29yZFNwYWNpbmc6IDM0LFxuICBzZXRIU2NhbGU6IDM1LFxuICBzZXRMZWFkaW5nOiAzNixcbiAgc2V0Rm9udDogMzcsXG4gIHNldFRleHRSZW5kZXJpbmdNb2RlOiAzOCxcbiAgc2V0VGV4dFJpc2U6IDM5LFxuICBtb3ZlVGV4dDogNDAsXG4gIHNldExlYWRpbmdNb3ZlVGV4dDogNDEsXG4gIHNldFRleHRNYXRyaXg6IDQyLFxuICBuZXh0TGluZTogNDMsXG4gIHNob3dUZXh0OiA0NCxcbiAgc2hvd1NwYWNlZFRleHQ6IDQ1LFxuICBuZXh0TGluZVNob3dUZXh0OiA0NixcbiAgbmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6IDQ3LFxuICBzZXRDaGFyV2lkdGg6IDQ4LFxuICBzZXRDaGFyV2lkdGhBbmRCb3VuZHM6IDQ5LFxuICBzZXRTdHJva2VDb2xvclNwYWNlOiA1MCxcbiAgc2V0RmlsbENvbG9yU3BhY2U6IDUxLFxuICBzZXRTdHJva2VDb2xvcjogNTIsXG4gIHNldFN0cm9rZUNvbG9yTjogNTMsXG4gIHNldEZpbGxDb2xvcjogNTQsXG4gIHNldEZpbGxDb2xvck46IDU1LFxuICBzZXRTdHJva2VHcmF5OiA1NixcbiAgc2V0RmlsbEdyYXk6IDU3LFxuICBzZXRTdHJva2VSR0JDb2xvcjogNTgsXG4gIHNldEZpbGxSR0JDb2xvcjogNTksXG4gIHNldFN0cm9rZUNNWUtDb2xvcjogNjAsXG4gIHNldEZpbGxDTVlLQ29sb3I6IDYxLFxuICBzaGFkaW5nRmlsbDogNjIsXG4gIGJlZ2luSW5saW5lSW1hZ2U6IDYzLFxuICBiZWdpbkltYWdlRGF0YTogNjQsXG4gIGVuZElubGluZUltYWdlOiA2NSxcbiAgcGFpbnRYT2JqZWN0OiA2NixcbiAgbWFya1BvaW50OiA2NyxcbiAgbWFya1BvaW50UHJvcHM6IDY4LFxuICBiZWdpbk1hcmtlZENvbnRlbnQ6IDY5LFxuICBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogNzAsXG4gIGVuZE1hcmtlZENvbnRlbnQ6IDcxLFxuICBiZWdpbkNvbXBhdDogNzIsXG4gIGVuZENvbXBhdDogNzMsXG4gIHBhaW50Rm9ybVhPYmplY3RCZWdpbjogNzQsXG4gIHBhaW50Rm9ybVhPYmplY3RFbmQ6IDc1LFxuICBiZWdpbkdyb3VwOiA3NixcbiAgZW5kR3JvdXA6IDc3LFxuICBiZWdpbkFubm90YXRpb25zOiA3OCxcbiAgZW5kQW5ub3RhdGlvbnM6IDc5LFxuICBiZWdpbkFubm90YXRpb246IDgwLFxuICBlbmRBbm5vdGF0aW9uOiA4MSxcbiAgcGFpbnRKcGVnWE9iamVjdDogODIsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOiA4NCxcbiAgcGFpbnRJbWFnZVhPYmplY3Q6IDg1LFxuICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsXG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IDg3LFxuICBwYWludEltYWdlWE9iamVjdFJlcGVhdDogODgsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksXG4gIHBhaW50U29saWRDb2xvckltYWdlTWFzazogOTAsXG4gIGNvbnN0cnVjdFBhdGg6IDkxLFxufTtcblxuY29uc3QgVU5TVVBQT1JURURfRkVBVFVSRVMgPSB7XG4gIC8qKiBAZGVwcmVjYXRlZCB1bnVzZWQgKi9cbiAgdW5rbm93bjogXCJ1bmtub3duXCIsXG4gIGZvcm1zOiBcImZvcm1zXCIsXG4gIGphdmFTY3JpcHQ6IFwiamF2YVNjcmlwdFwiLFxuICBzbWFzazogXCJzbWFza1wiLFxuICBzaGFkaW5nUGF0dGVybjogXCJzaGFkaW5nUGF0dGVyblwiLFxuICAvKiogQGRlcHJlY2F0ZWQgdW51c2VkICovXG4gIGZvbnQ6IFwiZm9udFwiLFxuICBlcnJvclRpbGluZ1BhdHRlcm46IFwiZXJyb3JUaWxpbmdQYXR0ZXJuXCIsXG4gIGVycm9yRXh0R1N0YXRlOiBcImVycm9yRXh0R1N0YXRlXCIsXG4gIGVycm9yWE9iamVjdDogXCJlcnJvclhPYmplY3RcIixcbiAgZXJyb3JGb250TG9hZFR5cGUzOiBcImVycm9yRm9udExvYWRUeXBlM1wiLFxuICBlcnJvckZvbnRTdGF0ZTogXCJlcnJvckZvbnRTdGF0ZVwiLFxuICBlcnJvckZvbnRNaXNzaW5nOiBcImVycm9yRm9udE1pc3NpbmdcIixcbiAgZXJyb3JGb250VHJhbnNsYXRlOiBcImVycm9yRm9udFRyYW5zbGF0ZVwiLFxuICBlcnJvckNvbG9yU3BhY2U6IFwiZXJyb3JDb2xvclNwYWNlXCIsXG4gIGVycm9yT3BlcmF0b3JMaXN0OiBcImVycm9yT3BlcmF0b3JMaXN0XCIsXG4gIGVycm9yRm9udFRvVW5pY29kZTogXCJlcnJvckZvbnRUb1VuaWNvZGVcIixcbiAgZXJyb3JGb250TG9hZE5hdGl2ZTogXCJlcnJvckZvbnRMb2FkTmF0aXZlXCIsXG4gIGVycm9yRm9udEdldFBhdGg6IFwiZXJyb3JGb250R2V0UGF0aFwiLFxuICBlcnJvck1hcmtlZENvbnRlbnQ6IFwiZXJyb3JNYXJrZWRDb250ZW50XCIsXG59O1xuXG5jb25zdCBQYXNzd29yZFJlc3BvbnNlcyA9IHtcbiAgTkVFRF9QQVNTV09SRDogMSxcbiAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyLFxufTtcblxubGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTO1xuXG5mdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkge1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihsZXZlbCkpIHtcbiAgICB2ZXJib3NpdHkgPSBsZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJib3NpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIHZlcmJvc2l0eTtcbn1cblxuLy8gQSBub3RpY2UgZm9yIGRldnMuIFRoZXNlIGFyZSBnb29kIGZvciB0aGluZ3MgdGhhdCBhcmUgaGVscGZ1bCB0byBkZXZzLCBzdWNoXG4vLyBhcyB3YXJuaW5nIHRoYXQgV29ya2VycyB3ZXJlIGRpc2FibGVkLCB3aGljaCBpcyBpbXBvcnRhbnQgdG8gZGV2cyBidXQgbm90XG4vLyBlbmQgdXNlcnMuXG5mdW5jdGlvbiBpbmZvKG1zZykge1xuICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLklORk9TKSB7XG4gICAgY29uc29sZS5sb2coYEluZm86ICR7bXNnfWApO1xuICB9XG59XG5cbi8vIE5vbi1mYXRhbCB3YXJuaW5ncy5cbmZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1MpIHtcbiAgICBjb25zb2xlLmxvZyhgV2FybmluZzogJHttc2d9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5yZWFjaGFibGUobXNnKSB7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG5mdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7XG4gIGlmICghY29uZCkge1xuICAgIHVucmVhY2hhYmxlKG1zZyk7XG4gIH1cbn1cblxuLy8gQ2hlY2tzIGlmIFVSTHMgaGF2ZSB0aGUgc2FtZSBvcmlnaW4uIEZvciBub24tSFRUUCBiYXNlZCBVUkxzLCByZXR1cm5zIGZhbHNlLlxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luKGJhc2VVcmwsIG90aGVyVXJsKSB7XG4gIGxldCBiYXNlO1xuICB0cnkge1xuICAgIGJhc2UgPSBuZXcgVVJMKGJhc2VVcmwpO1xuICAgIGlmICghYmFzZS5vcmlnaW4gfHwgYmFzZS5vcmlnaW4gPT09IFwibnVsbFwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIG5vbi1IVFRQIHVybFxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG90aGVyID0gbmV3IFVSTChvdGhlclVybCwgYmFzZSk7XG4gIHJldHVybiBiYXNlLm9yaWdpbiA9PT0gb3RoZXIub3JpZ2luO1xufVxuXG4vLyBDaGVja3MgaWYgVVJMcyB1c2Ugb25lIG9mIHRoZSBhbGxvd2VkIHByb3RvY29scywgZS5nLiB0byBhdm9pZCBYU1MuXG5mdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkge1xuICBpZiAoIXVybCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzd2l0Y2ggKHVybC5wcm90b2NvbCkge1xuICAgIGNhc2UgXCJodHRwOlwiOlxuICAgIGNhc2UgXCJodHRwczpcIjpcbiAgICBjYXNlIFwiZnRwOlwiOlxuICAgIGNhc2UgXCJtYWlsdG86XCI6XG4gICAgY2FzZSBcInRlbDpcIjpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBjcmVhdGUgYSB2YWxpZCBhYnNvbHV0ZSBVUkwuXG4gKlxuICogQHBhcmFtIHtVUkx8c3RyaW5nfSB1cmwgLSBBbiBhYnNvbHV0ZSwgb3IgcmVsYXRpdmUsIFVSTC5cbiAqIEBwYXJhbSB7VVJMfHN0cmluZ30gYmFzZVVybCAtIEFuIGFic29sdXRlIFVSTC5cbiAqIEByZXR1cm5zIEVpdGhlciBhIHZhbGlkIHtVUkx9LCBvciBgbnVsbGAgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgYmFzZVVybCkge1xuICBpZiAoIXVybCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgYWJzb2x1dGVVcmwgPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpO1xuICAgIGlmIChfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSkge1xuICAgICAgcmV0dXJuIGFic29sdXRlVXJsO1xuICAgIH1cbiAgfSBjYXRjaCAoZXgpIHtcbiAgICAvKiBgbmV3IFVSTCgpYCB3aWxsIHRocm93IG9uIGluY29ycmVjdCBkYXRhLiAqL1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBzaGFkb3cob2JqLCBwcm9wLCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7XG4gICAgdmFsdWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEB0eXBlIHthbnl9XG4gKi9cbmNvbnN0IEJhc2VFeGNlcHRpb24gPSAoZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VFeGNlcHRpb24pIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi5cIik7XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG4gIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG4gIEJhc2VFeGNlcHRpb24uY29uc3RydWN0b3IgPSBCYXNlRXhjZXB0aW9uO1xuXG4gIHJldHVybiBCYXNlRXhjZXB0aW9uO1xufSkoKTtcblxuY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBjb2RlKSB7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG5cbmNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHtcbiAgICBzdXBlcihtc2cpO1xuICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gIH1cbn1cblxuY2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuY2xhc3MgTWlzc2luZ1BERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgc3RhdHVzKSB7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIGNhdXNlZCBkdXJpbmcgcGFyc2luZyBQREYgZGF0YS5cbiAqL1xuY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbi8qKlxuICogRXJyb3IgdXNlZCB0byBpbmRpY2F0ZSB0YXNrIGNhbmNlbGxhdGlvbi5cbiAqL1xuY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNvbnN0IE51bGxDaGFyYWN0ZXJzUmVnRXhwID0gL1xceDAwL2c7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiByZW1vdmVOdWxsQ2hhcmFjdGVycyhzdHIpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICB3YXJuKFwiVGhlIGFyZ3VtZW50IGZvciByZW1vdmVOdWxsQ2hhcmFjdGVycyBtdXN0IGJlIGEgc3RyaW5nLlwiKTtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIucmVwbGFjZShOdWxsQ2hhcmFjdGVyc1JlZ0V4cCwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHtcbiAgYXNzZXJ0KFxuICAgIGJ5dGVzICE9PSBudWxsICYmIHR5cGVvZiBieXRlcyA9PT0gXCJvYmplY3RcIiAmJiBieXRlcy5sZW5ndGggIT09IHVuZGVmaW5lZCxcbiAgICBcIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmdcIlxuICApO1xuICBjb25zdCBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG4gIGNvbnN0IE1BWF9BUkdVTUVOVF9DT1VOVCA9IDgxOTI7XG4gIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7XG4gIH1cbiAgY29uc3Qgc3RyQnVmID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IE1BWF9BUkdVTUVOVF9DT1VOVCkge1xuICAgIGNvbnN0IGNodW5rRW5kID0gTWF0aC5taW4oaSArIE1BWF9BUkdVTUVOVF9DT1VOVCwgbGVuZ3RoKTtcbiAgICBjb25zdCBjaHVuayA9IGJ5dGVzLnN1YmFycmF5KGksIGNodW5rRW5kKTtcbiAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7XG4gIH1cbiAgcmV0dXJuIHN0ckJ1Zi5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBhc3NlcnQodHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiwgXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzXCIpO1xuICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoO1xuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBieXRlc1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZjtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qKlxuICogR2V0cyBsZW5ndGggb2YgdGhlIGFycmF5IChBcnJheSwgVWludDhBcnJheSwgb3Igc3RyaW5nKSBpbiBieXRlcy5cbiAqIEBwYXJhbSB7QXJyYXk8YW55PnxVaW50OEFycmF5fHN0cmluZ30gYXJyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBhcnJheUJ5dGVMZW5ndGgoYXJyKSB7XG4gIGlmIChhcnIubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYXJyLmxlbmd0aDtcbiAgfVxuICBhc3NlcnQoYXJyLmJ5dGVMZW5ndGggIT09IHVuZGVmaW5lZCwgXCJhcnJheUJ5dGVMZW5ndGggLSBpbnZhbGlkIGFyZ3VtZW50LlwiKTtcbiAgcmV0dXJuIGFyci5ieXRlTGVuZ3RoO1xufVxuXG4vKipcbiAqIENvbWJpbmVzIGFycmF5IGl0ZW1zIChhcnJheXMpIGludG8gc2luZ2xlIFVpbnQ4QXJyYXkgb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxhbnk+fFVpbnQ4QXJyYXl8c3RyaW5nPn0gYXJyIC0gdGhlIGFycmF5IG9mIHRoZSBhcnJheXNcbiAqICAgKEFycmF5LCBVaW50OEFycmF5LCBvciBzdHJpbmcpLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGFycmF5c1RvQnl0ZXMoYXJyKSB7XG4gIGNvbnN0IGxlbmd0aCA9IGFyci5sZW5ndGg7XG4gIC8vIFNob3J0Y3V0OiBpZiBmaXJzdCBhbmQgb25seSBpdGVtIGlzIFVpbnQ4QXJyYXksIHJldHVybiBpdC5cbiAgaWYgKGxlbmd0aCA9PT0gMSAmJiBhcnJbMF0gaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIGFyclswXTtcbiAgfVxuICBsZXQgcmVzdWx0TGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdExlbmd0aCArPSBhcnJheUJ5dGVMZW5ndGgoYXJyW2ldKTtcbiAgfVxuICBsZXQgcG9zID0gMDtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHJlc3VsdExlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaXRlbSA9IGFycltpXTtcbiAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpdGVtID0gc3RyaW5nVG9CeXRlcyhpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0gPSBuZXcgVWludDhBcnJheShpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXRlbUxlbmd0aCA9IGl0ZW0uYnl0ZUxlbmd0aDtcbiAgICBkYXRhLnNldChpdGVtLCBwb3MpO1xuICAgIHBvcyArPSBpdGVtTGVuZ3RoO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBzdHJpbmczMih2YWx1ZSkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAodmFsdWUgPj4gMjQpICYgMHhmZixcbiAgICAodmFsdWUgPj4gMTYpICYgMHhmZixcbiAgICAodmFsdWUgPj4gOCkgJiAweGZmLFxuICAgIHZhbHVlICYgMHhmZlxuICApO1xufVxuXG4vLyBDaGVja3MgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHBsYXRmb3JtLlxuZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7XG4gIGNvbnN0IGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTtcbiAgYnVmZmVyOFswXSA9IDE7XG4gIGNvbnN0IHZpZXczMiA9IG5ldyBVaW50MzJBcnJheShidWZmZXI4LmJ1ZmZlciwgMCwgMSk7XG4gIHJldHVybiB2aWV3MzJbMF0gPT09IDE7XG59XG5jb25zdCBJc0xpdHRsZUVuZGlhbkNhY2hlZCA9IHtcbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2YWx1ZVwiLCBpc0xpdHRsZUVuZGlhbigpKTtcbiAgfSxcbn07XG5cbi8vIENoZWNrcyBpZiBpdCdzIHBvc3NpYmxlIHRvIGV2YWwgSlMgZXhwcmVzc2lvbnMuXG5mdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gIHRyeSB7XG4gICAgbmV3IEZ1bmN0aW9uKFwiXCIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldywgbm8tbmV3LWZ1bmNcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuY29uc3QgSXNFdmFsU3VwcG9ydGVkQ2FjaGVkID0ge1xuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInZhbHVlXCIsIGlzRXZhbFN1cHBvcnRlZCgpKTtcbiAgfSxcbn07XG5cbmNvbnN0IHJnYkJ1ZiA9IFtcInJnYihcIiwgMCwgXCIsXCIsIDAsIFwiLFwiLCAwLCBcIilcIl07XG5cbmNsYXNzIFV0aWwge1xuICAvLyBtYWtlQ3NzUmdiKCkgY2FuIGJlIGNhbGxlZCB0aG91c2FuZHMgb2YgdGltZXMuIFVzaW5nIMK0cmdiQnVmYCBhdm9pZHNcbiAgLy8gY3JlYXRpbmcgbWFueSBpbnRlcm1lZGlhdGUgc3RyaW5ncy5cbiAgc3RhdGljIG1ha2VDc3NSZ2IociwgZywgYikge1xuICAgIHJnYkJ1ZlsxXSA9IHI7XG4gICAgcmdiQnVmWzNdID0gZztcbiAgICByZ2JCdWZbNV0gPSBiO1xuICAgIHJldHVybiByZ2JCdWYuam9pbihcIlwiKTtcbiAgfVxuXG4gIC8vIENvbmNhdGVuYXRlcyB0d28gdHJhbnNmb3JtYXRpb24gbWF0cmljZXMgdG9nZXRoZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgc3RhdGljIHRyYW5zZm9ybShtMSwgbTIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sXG4gICAgICBtMVsxXSAqIG0yWzBdICsgbTFbM10gKiBtMlsxXSxcbiAgICAgIG0xWzBdICogbTJbMl0gKyBtMVsyXSAqIG0yWzNdLFxuICAgICAgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sXG4gICAgICBtMVswXSAqIG0yWzRdICsgbTFbMl0gKiBtMls1XSArIG0xWzRdLFxuICAgICAgbTFbMV0gKiBtMls0XSArIG0xWzNdICogbTJbNV0gKyBtMVs1XSxcbiAgICBdO1xuICB9XG5cbiAgLy8gRm9yIDJkIGFmZmluZSB0cmFuc2Zvcm1zXG4gIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7XG4gICAgY29uc3QgeHQgPSBwWzBdICogbVswXSArIHBbMV0gKiBtWzJdICsgbVs0XTtcbiAgICBjb25zdCB5dCA9IHBbMF0gKiBtWzFdICsgcFsxXSAqIG1bM10gKyBtWzVdO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuXG4gIHN0YXRpYyBhcHBseUludmVyc2VUcmFuc2Zvcm0ocCwgbSkge1xuICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuICAgIGNvbnN0IHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7XG4gICAgY29uc3QgeXQgPSAoLXBbMF0gKiBtWzFdICsgcFsxXSAqIG1bMF0gKyBtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQ7XG4gICAgcmV0dXJuIFt4dCwgeXRdO1xuICB9XG5cbiAgLy8gQXBwbGllcyB0aGUgdHJhbnNmb3JtIHRvIHRoZSByZWN0YW5nbGUgYW5kIGZpbmRzIHRoZSBtaW5pbXVtIGF4aWFsbHlcbiAgLy8gYWxpZ25lZCBib3VuZGluZyBib3guXG4gIHN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChyLCBtKSB7XG4gICAgY29uc3QgcDEgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHIsIG0pO1xuICAgIGNvbnN0IHAyID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLnNsaWNlKDIsIDQpLCBtKTtcbiAgICBjb25zdCBwMyA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JbMF0sIHJbM11dLCBtKTtcbiAgICBjb25zdCBwNCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JbMl0sIHJbMV1dLCBtKTtcbiAgICByZXR1cm4gW1xuICAgICAgTWF0aC5taW4ocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLFxuICAgICAgTWF0aC5taW4ocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pLFxuICAgICAgTWF0aC5tYXgocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLFxuICAgICAgTWF0aC5tYXgocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pLFxuICAgIF07XG4gIH1cblxuICBzdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShtKSB7XG4gICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07XG4gICAgcmV0dXJuIFtcbiAgICAgIG1bM10gLyBkLFxuICAgICAgLW1bMV0gLyBkLFxuICAgICAgLW1bMl0gLyBkLFxuICAgICAgbVswXSAvIGQsXG4gICAgICAobVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkLFxuICAgICAgKG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZCxcbiAgICBdO1xuICB9XG5cbiAgLy8gQXBwbHkgYSBnZW5lcmljIDNkIG1hdHJpeCBNIG9uIGEgMy12ZWN0b3IgdjpcbiAgLy8gICB8IGEgYiBjIHwgICB8IFggfFxuICAvLyAgIHwgZCBlIGYgfCB4IHwgWSB8XG4gIC8vICAgfCBnIGggaSB8ICAgfCBaIHxcbiAgLy8gTSBpcyBhc3N1bWVkIHRvIGJlIHNlcmlhbGl6ZWQgYXMgW2EsYixjLGQsZSxmLGcsaCxpXSxcbiAgLy8gd2l0aCB2IGFzIFtYLFksWl1cbiAgc3RhdGljIGFwcGx5M2RUcmFuc2Zvcm0obSwgdikge1xuICAgIHJldHVybiBbXG4gICAgICBtWzBdICogdlswXSArIG1bMV0gKiB2WzFdICsgbVsyXSAqIHZbMl0sXG4gICAgICBtWzNdICogdlswXSArIG1bNF0gKiB2WzFdICsgbVs1XSAqIHZbMl0sXG4gICAgICBtWzZdICogdlswXSArIG1bN10gKiB2WzFdICsgbVs4XSAqIHZbMl0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoaXMgY2FsY3VsYXRpb24gdXNlcyBTaW5ndWxhciBWYWx1ZSBEZWNvbXBvc2l0aW9uLlxuICAvLyBUaGUgU1ZEIGNhbiBiZSByZXByZXNlbnRlZCB3aXRoIGZvcm11bGEgQSA9IFVTVi4gV2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlXG4gIC8vIG1hdHJpeCBTIGhlcmUgYmVjYXVzZSBpdCByZXByZXNlbnRzIHRoZSBzY2FsZSB2YWx1ZXMuXG4gIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7XG4gICAgY29uc3QgdHJhbnNwb3NlID0gW21bMF0sIG1bMl0sIG1bMV0sIG1bM11dO1xuXG4gICAgLy8gTXVsdGlwbHkgbWF0cml4IG0gd2l0aCBpdHMgdHJhbnNwb3NlLlxuICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107XG4gICAgY29uc3QgYyA9IG1bMl0gKiB0cmFuc3Bvc2VbMF0gKyBtWzNdICogdHJhbnNwb3NlWzJdO1xuICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTtcblxuICAgIC8vIFNvbHZlIHRoZSBzZWNvbmQgZGVncmVlIHBvbHlub21pYWwgdG8gZ2V0IHJvb3RzLlxuICAgIGNvbnN0IGZpcnN0ID0gKGEgKyBkKSAvIDI7XG4gICAgY29uc3Qgc2Vjb25kID0gTWF0aC5zcXJ0KChhICsgZCkgKiAoYSArIGQpIC0gNCAqIChhICogZCAtIGMgKiBiKSkgLyAyO1xuICAgIGNvbnN0IHN4ID0gZmlyc3QgKyBzZWNvbmQgfHwgMTtcbiAgICBjb25zdCBzeSA9IGZpcnN0IC0gc2Vjb25kIHx8IDE7XG5cbiAgICAvLyBTY2FsZSB2YWx1ZXMgYXJlIHRoZSBzcXVhcmUgcm9vdHMgb2YgdGhlIGVpZ2VudmFsdWVzLlxuICAgIHJldHVybiBbTWF0aC5zcXJ0KHN4KSwgTWF0aC5zcXJ0KHN5KV07XG4gIH1cblxuICAvLyBOb3JtYWxpemUgcmVjdGFuZ2xlIHJlY3Q9W3gxLCB5MSwgeDIsIHkyXSBzbyB0aGF0ICh4MSx5MSkgPCAoeDIseTIpXG4gIC8vIEZvciBjb29yZGluYXRlIHN5c3RlbXMgd2hvc2Ugb3JpZ2luIGxpZXMgaW4gdGhlIGJvdHRvbS1sZWZ0LCB0aGlzXG4gIC8vIG1lYW5zIG5vcm1hbGl6YXRpb24gdG8gKEJMLFRSKSBvcmRlcmluZy4gRm9yIHN5c3RlbXMgd2l0aCBvcmlnaW4gaW4gdGhlXG4gIC8vIHRvcC1sZWZ0LCB0aGlzIG1lYW5zIChUTCxCUikgb3JkZXJpbmcuXG4gIHN0YXRpYyBub3JtYWxpemVSZWN0KHJlY3QpIHtcbiAgICBjb25zdCByID0gcmVjdC5zbGljZSgwKTsgLy8gY2xvbmUgcmVjdFxuICAgIGlmIChyZWN0WzBdID4gcmVjdFsyXSkge1xuICAgICAgclswXSA9IHJlY3RbMl07XG4gICAgICByWzJdID0gcmVjdFswXTtcbiAgICB9XG4gICAgaWYgKHJlY3RbMV0gPiByZWN0WzNdKSB7XG4gICAgICByWzFdID0gcmVjdFszXTtcbiAgICAgIHJbM10gPSByZWN0WzFdO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSByZWN0YW5nbGUgW3gxLCB5MSwgeDIsIHkyXSBjb3JyZXNwb25kaW5nIHRvIHRoZVxuICAvLyBpbnRlcnNlY3Rpb24gb2YgcmVjdDEgYW5kIHJlY3QyLiBJZiBubyBpbnRlcnNlY3Rpb24sIHJldHVybnMgJ2ZhbHNlJ1xuICAvLyBUaGUgcmVjdGFuZ2xlIGNvb3JkaW5hdGVzIG9mIHJlY3QxLCByZWN0MiBzaG91bGQgYmUgW3gxLCB5MSwgeDIsIHkyXVxuICBzdGF0aWMgaW50ZXJzZWN0KHJlY3QxLCByZWN0Mikge1xuICAgIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH1cblxuICAgIC8vIE9yZGVyIHBvaW50cyBhbG9uZyB0aGUgYXhlc1xuICAgIGNvbnN0IG9yZGVyZWRYID0gW3JlY3QxWzBdLCByZWN0MVsyXSwgcmVjdDJbMF0sIHJlY3QyWzJdXS5zb3J0KGNvbXBhcmUpO1xuICAgIGNvbnN0IG9yZGVyZWRZID0gW3JlY3QxWzFdLCByZWN0MVszXSwgcmVjdDJbMV0sIHJlY3QyWzNdXS5zb3J0KGNvbXBhcmUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgcmVjdDEgPSBVdGlsLm5vcm1hbGl6ZVJlY3QocmVjdDEpO1xuICAgIHJlY3QyID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QyKTtcblxuICAgIC8vIFg6IGZpcnN0IGFuZCBzZWNvbmQgcG9pbnRzIGJlbG9uZyB0byBkaWZmZXJlbnQgcmVjdGFuZ2xlcz9cbiAgICBpZiAoXG4gICAgICAob3JkZXJlZFhbMF0gPT09IHJlY3QxWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MlswXSkgfHxcbiAgICAgIChvcmRlcmVkWFswXSA9PT0gcmVjdDJbMF0gJiYgb3JkZXJlZFhbMV0gPT09IHJlY3QxWzBdKVxuICAgICkge1xuICAgICAgLy8gSW50ZXJzZWN0aW9uIG11c3QgYmUgYmV0d2VlbiBzZWNvbmQgYW5kIHRoaXJkIHBvaW50c1xuICAgICAgcmVzdWx0WzBdID0gb3JkZXJlZFhbMV07XG4gICAgICByZXN1bHRbMl0gPSBvcmRlcmVkWFsyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gWTogZmlyc3QgYW5kIHNlY29uZCBwb2ludHMgYmVsb25nIHRvIGRpZmZlcmVudCByZWN0YW5nbGVzP1xuICAgIGlmIChcbiAgICAgIChvcmRlcmVkWVswXSA9PT0gcmVjdDFbMV0gJiYgb3JkZXJlZFlbMV0gPT09IHJlY3QyWzFdKSB8fFxuICAgICAgKG9yZGVyZWRZWzBdID09PSByZWN0MlsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDFbMV0pXG4gICAgKSB7XG4gICAgICAvLyBJbnRlcnNlY3Rpb24gbXVzdCBiZSBiZXR3ZWVuIHNlY29uZCBhbmQgdGhpcmQgcG9pbnRzXG4gICAgICByZXN1bHRbMV0gPSBvcmRlcmVkWVsxXTtcbiAgICAgIHJlc3VsdFszXSA9IG9yZGVyZWRZWzJdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgUERGU3RyaW5nVHJhbnNsYXRlVGFibGUgPSBbXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDB4MkQ4LCAweDJDNywgMHgyQzYsIDB4MkQ5LCAweDJERCwgMHgyREIsIDB4MkRBLCAweDJEQywgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyMDIyLCAweDIwMjAsIDB4MjAyMSwgMHgyMDI2LCAweDIwMTQsXG4gIDB4MjAxMywgMHgxOTIsIDB4MjA0NCwgMHgyMDM5LCAweDIwM0EsIDB4MjIxMiwgMHgyMDMwLCAweDIwMUUsIDB4MjAxQyxcbiAgMHgyMDFELCAweDIwMTgsIDB4MjAxOSwgMHgyMDFBLCAweDIxMjIsIDB4RkIwMSwgMHhGQjAyLCAweDE0MSwgMHgxNTIsIDB4MTYwLFxuICAweDE3OCwgMHgxN0QsIDB4MTMxLCAweDE0MiwgMHgxNTMsIDB4MTYxLCAweDE3RSwgMCwgMHgyMEFDXG5dO1xuXG5mdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhzdHIpIHtcbiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aCxcbiAgICBzdHJCdWYgPSBbXTtcbiAgaWYgKHN0clswXSA9PT0gXCJcXHhGRVwiICYmIHN0clsxXSA9PT0gXCJcXHhGRlwiKSB7XG4gICAgLy8gVVRGMTZCRSBCT01cbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IGxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBzdHJCdWYucHVzaChcbiAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgoc3RyLmNoYXJDb2RlQXQoaSkgPDwgOCkgfCBzdHIuY2hhckNvZGVBdChpICsgMSkpXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzdHJbMF0gPT09IFwiXFx4RkZcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkVcIikge1xuICAgIC8vIFVURjE2TEUgQk9NXG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikge1xuICAgICAgc3RyQnVmLnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSA8PCA4KSB8IHN0ci5jaGFyQ29kZUF0KGkpKVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgY29kZSA9IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlW3N0ci5jaGFyQ29kZUF0KGkpXTtcbiAgICAgIHN0ckJ1Zi5wdXNoKGNvZGUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpIDogc3RyLmNoYXJBdChpKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cikge1xuICAvLyByZXBsYWNlIFwiKFwiLCBcIilcIiBhbmQgXCJcXFwiIGJ5IFwiXFwoXCIsIFwiXFwpXCIgYW5kIFwiXFxcXFwiXG4gIC8vIGluIG9yZGVyIHRvIHdyaXRlIGl0IGluIGEgUERGIGZpbGUuXG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFtcXChcXClcXFxcXSkvZywgXCJcXFxcJDFcIik7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhzdHIpIHtcbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbn1cblxuZnVuY3Rpb24gaXNCb29sKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcImJvb2xlYW5cIjtcbn1cblxuZnVuY3Rpb24gaXNOdW0odikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09IFwibnVtYmVyXCI7XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgdi5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlFcXVhbChhcnIxLCBhcnIyKSB7XG4gIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGFycjEuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQgPT09IGFycjJbaW5kZXhdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZShkYXRlID0gbmV3IERhdGUoRGF0ZS5ub3coKSkpIHtcbiAgY29uc3QgYnVmZmVyID0gW1xuICAgIGRhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLFxuICAgIChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSxcbiAgICAoZGF0ZS5nZXRVVENEYXRlKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSxcbiAgICBkYXRlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgZGF0ZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gIF07XG5cbiAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiXCIpO1xufVxuXG4vKipcbiAqIFByb21pc2UgQ2FwYWJpbGl0eSBvYmplY3QuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUHJvbWlzZUNhcGFiaWxpdHlcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxhbnk+fSBwcm9taXNlIC0gQSBQcm9taXNlIG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2V0dGxlZCAtIElmIHRoZSBQcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC9yZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHJlc29sdmUgLSBGdWxmaWxscyB0aGUgUHJvbWlzZS5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHJlamVjdCAtIFJlamVjdHMgdGhlIFByb21pc2UuXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJvbWlzZSBjYXBhYmlsaXR5IG9iamVjdC5cbiAqIEBhbGlhcyBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlQ2FwYWJpbGl0eX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKSB7XG4gIGNvbnN0IGNhcGFiaWxpdHkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgaXNTZXR0bGVkID0gZmFsc2U7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhcGFiaWxpdHksIFwic2V0dGxlZFwiLCB7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGlzU2V0dGxlZDtcbiAgICB9LFxuICB9KTtcbiAgY2FwYWJpbGl0eS5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNhcGFiaWxpdHkucmVzb2x2ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBpc1NldHRsZWQgPSB0cnVlO1xuICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICB9O1xuICAgIGNhcGFiaWxpdHkucmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaXNTZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChyZWFzb24pO1xuICAgIH07XG4gIH0pO1xuICByZXR1cm4gY2FwYWJpbGl0eTtcbn1cblxuY29uc3QgY3JlYXRlT2JqZWN0VVJMID0gKGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTENsb3N1cmUoKSB7XG4gIC8vIEJsb2IvY3JlYXRlT2JqZWN0VVJMIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxpbmcgYmFjayB0byBkYXRhIHNjaGVtYS5cbiAgY29uc3QgZGlnaXRzID1cbiAgICBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGRhdGEsIGNvbnRlbnRUeXBlLCBmb3JjZURhdGFTY2hlbWEgPSBmYWxzZSkge1xuICAgIGlmICghZm9yY2VEYXRhU2NoZW1hICYmIFVSTC5jcmVhdGVPYmplY3RVUkwpIHtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZTogY29udGVudFR5cGUgfSk7XG4gICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB9XG5cbiAgICBsZXQgYnVmZmVyID0gYGRhdGE6JHtjb250ZW50VHlwZX07YmFzZTY0LGA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7XG4gICAgICBjb25zdCBiMSA9IGRhdGFbaV0gJiAweGZmO1xuICAgICAgY29uc3QgYjIgPSBkYXRhW2kgKyAxXSAmIDB4ZmY7XG4gICAgICBjb25zdCBiMyA9IGRhdGFbaSArIDJdICYgMHhmZjtcbiAgICAgIGNvbnN0IGQxID0gYjEgPj4gMixcbiAgICAgICAgZDIgPSAoKGIxICYgMykgPDwgNCkgfCAoYjIgPj4gNCk7XG4gICAgICBjb25zdCBkMyA9IGkgKyAxIDwgaWkgPyAoKGIyICYgMHhmKSA8PCAyKSB8IChiMyA+PiA2KSA6IDY0O1xuICAgICAgY29uc3QgZDQgPSBpICsgMiA8IGlpID8gYjMgJiAweDNmIDogNjQ7XG4gICAgICBidWZmZXIgKz0gZGlnaXRzW2QxXSArIGRpZ2l0c1tkMl0gKyBkaWdpdHNbZDNdICsgZGlnaXRzW2Q0XTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfTtcbn0pKCk7XG5cbmV4cG9ydCB7XG4gIEJhc2VFeGNlcHRpb24sXG4gIEZPTlRfSURFTlRJVFlfTUFUUklYLFxuICBJREVOVElUWV9NQVRSSVgsXG4gIE9QUyxcbiAgVmVyYm9zaXR5TGV2ZWwsXG4gIFVOU1VQUE9SVEVEX0ZFQVRVUkVTLFxuICBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLFxuICBBbm5vdGF0aW9uRmllbGRGbGFnLFxuICBBbm5vdGF0aW9uRmxhZyxcbiAgQW5ub3RhdGlvbk1hcmtlZFN0YXRlLFxuICBBbm5vdGF0aW9uUmVwbHlUeXBlLFxuICBBbm5vdGF0aW9uUmV2aWV3U3RhdGUsXG4gIEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIEZvbnRUeXBlLFxuICBJbWFnZUtpbmQsXG4gIENNYXBDb21wcmVzc2lvblR5cGUsXG4gIEFib3J0RXhjZXB0aW9uLFxuICBJbnZhbGlkUERGRXhjZXB0aW9uLFxuICBNaXNzaW5nUERGRXhjZXB0aW9uLFxuICBQYXNzd29yZEV4Y2VwdGlvbixcbiAgUGFzc3dvcmRSZXNwb25zZXMsXG4gIFBlcm1pc3Npb25GbGFnLFxuICBTdHJlYW1UeXBlLFxuICBUZXh0UmVuZGVyaW5nTW9kZSxcbiAgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uLFxuICBVbmtub3duRXJyb3JFeGNlcHRpb24sXG4gIFV0aWwsXG4gIEZvcm1hdEVycm9yLFxuICBhcnJheUJ5dGVMZW5ndGgsXG4gIGFycmF5c1RvQnl0ZXMsXG4gIGFzc2VydCxcbiAgYnl0ZXNUb1N0cmluZyxcbiAgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHksXG4gIGNyZWF0ZU9iamVjdFVSTCxcbiAgZXNjYXBlU3RyaW5nLFxuICBnZXRNb2RpZmljYXRpb25EYXRlLFxuICBnZXRWZXJib3NpdHlMZXZlbCxcbiAgaW5mbyxcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNBcnJheUVxdWFsLFxuICBpc0Jvb2wsXG4gIGlzTnVtLFxuICBpc1N0cmluZyxcbiAgaXNTYW1lT3JpZ2luLFxuICBjcmVhdGVWYWxpZEFic29sdXRlVXJsLFxuICBJc0xpdHRsZUVuZGlhbkNhY2hlZCxcbiAgSXNFdmFsU3VwcG9ydGVkQ2FjaGVkLFxuICByZW1vdmVOdWxsQ2hhcmFjdGVycyxcbiAgc2V0VmVyYm9zaXR5TGV2ZWwsXG4gIHNoYWRvdyxcbiAgc3RyaW5nMzIsXG4gIHN0cmluZ1RvQnl0ZXMsXG4gIHN0cmluZ1RvUERGU3RyaW5nLFxuICBzdHJpbmdUb1VURjhTdHJpbmcsXG4gIHV0ZjhTdHJpbmdUb1N0cmluZyxcbiAgd2FybixcbiAgdW5yZWFjaGFibGUsXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTcgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgeyBpc05vZGVKUyB9IGZyb20gXCIuL2lzX25vZGUuanNcIjtcblxuLy8gU2tpcCBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgbW9kZXJuIGJ1aWxkcyBhbmQgaWYgd2UgYWxyZWFkeSByYW4gdGhlIG1vZHVsZS5cbmlmIChcbiAgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIlNLSVBfQkFCRUxcIikpICYmXG4gICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhZ2xvYmFsVGhpcy5fcGRmanNDb21wYXRpYmlsaXR5Q2hlY2tlZClcbikge1xuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBnbG9iYWxUaGlzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUxMS9FZGdlLCBPcGVyYVxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwidW5kZWZpbmVkXCIgfHwgZ2xvYmFsVGhpcy5NYXRoICE9PSBNYXRoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWdsb2JhbC1hc3NpZ25cbiAgICBnbG9iYWxUaGlzID0gcmVxdWlyZShcImNvcmUtanMvZXMvZ2xvYmFsLXRoaXNcIik7XG4gIH1cbiAgZ2xvYmFsVGhpcy5fcGRmanNDb21wYXRpYmlsaXR5Q2hlY2tlZCA9IHRydWU7XG5cbiAgY29uc3QgaGFzRE9NID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZG9jdW1lbnQgPT09IFwib2JqZWN0XCI7XG4gIGNvbnN0IHVzZXJBZ2VudCA9XG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgXCJcIjtcbiAgY29uc3QgaXNJRSA9IC9UcmlkZW50Ly50ZXN0KHVzZXJBZ2VudCk7XG5cbiAgLy8gU3VwcG9ydDogTm9kZS5qc1xuICAoZnVuY3Rpb24gY2hlY2tOb2RlQnRvYSgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5idG9hIHx8ICFpc05vZGVKUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLmJ0b2EgPSBmdW5jdGlvbiAoY2hhcnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNoYXJzLCBcImJpbmFyeVwiKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrTm9kZUF0b2IoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuYXRvYiB8fCAhaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5hdG9iID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShpbnB1dCwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBDaGlsZE5vZGUucmVtb3ZlIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUuXG4gIChmdW5jdGlvbiBjaGVja0NoaWxkTm9kZVJlbW92ZSgpIHtcbiAgICBpZiAoIWhhc0RPTSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtb3ppbGxhL2F2b2lkLXJlbW92ZUNoaWxkXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIERPTVRva2VuTGlzdC5wcm90b3R5cGUue2FkZCwgcmVtb3ZlfSwgd2l0aCBtb3JlIHRoYW5cbiAgLy8gb25lIHBhcmFtZXRlciwgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tET01Ub2tlbkxpc3RBZGRSZW1vdmUoKSB7XG4gICAgaWYgKCFoYXNET00gfHwgaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYuY2xhc3NMaXN0LmFkZChcInRlc3RPbmVcIiwgXCJ0ZXN0VHdvXCIpO1xuXG4gICAgaWYgKFxuICAgICAgZGl2LmNsYXNzTGlzdC5jb250YWlucyhcInRlc3RPbmVcIikgPT09IHRydWUgJiZcbiAgICAgIGRpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJ0ZXN0VHdvXCIpID09PSB0cnVlXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IE9yaWdpbmFsRE9NVG9rZW5MaXN0QWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7XG4gICAgY29uc3QgT3JpZ2luYWxET01Ub2tlbkxpc3RSZW1vdmUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZTtcblxuICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKC4uLnRva2Vucykge1xuICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgT3JpZ2luYWxET01Ub2tlbkxpc3RBZGQuY2FsbCh0aGlzLCB0b2tlbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICguLi50b2tlbnMpIHtcbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIE9yaWdpbmFsRE9NVG9rZW5MaXN0UmVtb3ZlLmNhbGwodGhpcywgdG9rZW4pO1xuICAgICAgfVxuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUsIHdpdGggdGhlIG9wdGlvbmFsXG4gIC8vIFwiZm9yY2VcIiBwYXJhbWV0ZXIsIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrRE9NVG9rZW5MaXN0VG9nZ2xlKCkge1xuICAgIGlmICghaGFzRE9NIHx8IGlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaWYgKGRpdi5jbGFzc0xpc3QudG9nZ2xlKFwidGVzdFwiLCAwKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgY29uc3QgZm9yY2UgPVxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoID4gMSA/ICEhYXJndW1lbnRzWzFdIDogIXRoaXMuY29udGFpbnModG9rZW4pO1xuICAgICAgcmV0dXJuIHRoaXNbZm9yY2UgPyBcImFkZFwiIDogXCJyZW1vdmVcIl0odG9rZW4pLCBmb3JjZTtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHdpbmRvdy5oaXN0b3J5LntwdXNoU3RhdGUsIHJlcGxhY2VTdGF0ZX0sIHdpdGggdGhlXG4gIC8vIGB1cmxgIHBhcmFtZXRlciBzZXQgdG8gYHVuZGVmaW5lZGAsIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGRvY3VtZW50IFVSTC5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrV2luZG93SGlzdG9yeVB1c2hTdGF0ZVJlcGxhY2VTdGF0ZSgpIHtcbiAgICBpZiAoIWhhc0RPTSB8fCAhaXNJRSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBPcmlnaW5hbFB1c2hTdGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZTtcbiAgICBjb25zdCBPcmlnaW5hbFJlcGxhY2VTdGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZTtcblxuICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCkge1xuICAgICAgY29uc3QgYXJncyA9IHVybCA9PT0gdW5kZWZpbmVkID8gW3N0YXRlLCB0aXRsZV0gOiBbc3RhdGUsIHRpdGxlLCB1cmxdO1xuICAgICAgT3JpZ2luYWxQdXNoU3RhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSB1cmwgPT09IHVuZGVmaW5lZCA/IFtzdGF0ZSwgdGl0bGVdIDogW3N0YXRlLCB0aXRsZSwgdXJsXTtcbiAgICAgIE9yaWdpbmFsUmVwbGFjZVN0YXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw0MVxuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdTdGFydHNXaXRoKCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL3N0YXJ0cy13aXRoLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGggaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQxXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0VuZHNXaXRoKCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9lbmRzLXdpdGguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NDFcbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nSW5jbHVkZXMoKSB7XG4gICAgaWYgKFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL2luY2x1ZGVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NDdcbiAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlJbmNsdWRlcygpIHtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL2FycmF5L2luY2x1ZGVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIEFycmF5LmZyb20gaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tBcnJheUZyb20oKSB7XG4gICAgaWYgKEFycmF5LmZyb20pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvYXJyYXkvZnJvbS5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBPYmplY3QuYXNzaWduIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0QXNzaWduKCkge1xuICAgIGlmIChPYmplY3QuYXNzaWduKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL29iamVjdC9hc3NpZ24uanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LmZyb21FbnRyaWVzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw3M1xuICAoZnVuY3Rpb24gY2hlY2tPYmplY3RGcm9tRW50cmllcygpIHtcbiAgICBpZiAoT2JqZWN0LmZyb21FbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL29iamVjdC9mcm9tLWVudHJpZXMuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgTWF0aC5sb2cyIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTwzOFxuICAoZnVuY3Rpb24gY2hlY2tNYXRoTG9nMigpIHtcbiAgICBpZiAoTWF0aC5sb2cyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE1hdGgubG9nMiA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL21hdGgvbG9nMi5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBOdW1iZXIuaXNOYU4gaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRS5cbiAgKGZ1bmN0aW9uIGNoZWNrTnVtYmVySXNOYU4oKSB7XG4gICAgaWYgKE51bWJlci5pc05hTikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBOdW1iZXIuaXNOYU4gPSByZXF1aXJlKFwiY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE51bWJlci5pc0ludGVnZXIgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDM0XG4gIChmdW5jdGlvbiBjaGVja051bWJlcklzSW50ZWdlcigpIHtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBOdW1iZXIuaXNJbnRlZ2VyID0gcmVxdWlyZShcImNvcmUtanMvZXMvbnVtYmVyL2lzLWludGVnZXIuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgVHlwZWRBcnJheS5wcm90b3R5cGUuc2xpY2UgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tUeXBlZEFycmF5U2xpY2UoKSB7XG4gICAgaWYgKFVpbnQ4QXJyYXkucHJvdG90eXBlLnNsaWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3R5cGVkLWFycmF5L3NsaWNlXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFLCBTYWZhcmk8MTEsIENocm9tZTw2M1xuICAoZnVuY3Rpb24gY2hlY2tQcm9taXNlKCkge1xuICAgIGlmICh0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiYgUERGSlNEZXYudGVzdChcIklNQUdFX0RFQ09ERVJTXCIpKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCBpbWFnZSBkZWNvZGVycyBhcmUgc3luY2hyb25vdXMsIGhlbmNlIGBQcm9taXNlYCBzaG91bGRuJ3RcbiAgICAgIC8vIG5lZWQgdG8gYmUgcG9seWZpbGxlZCBmb3IgdGhlIElNQUdFX0RFQ09ERVJTIGJ1aWxkIHRhcmdldC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGdsb2JhbFRoaXMuUHJvbWlzZSAmJiBnbG9iYWxUaGlzLlByb21pc2UuYWxsU2V0dGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLlByb21pc2UgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1VSTCgpIHtcbiAgICBpZiAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8ICFQREZKU0Rldi50ZXN0KFwiUFJPRFVDVElPTlwiKSkge1xuICAgICAgLy8gUHJldmVudCBcInJlcXVpcmUgaXMgbm90IGEgZnVuY3Rpb25cIiBlcnJvcnMgaW4gZGV2ZWxvcG1lbnQgbW9kZSxcbiAgICAgIC8vIHNpbmNlIHRoZSBgVVJMYCBjb25zdHJ1Y3RvciBzaG91bGQgYmUgYXZhaWxhYmxlIGluIG1vZGVybiBicm93ZXJzLlxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoIVBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpKSB7XG4gICAgICAvLyBUaGUgYFVSTGAgY29uc3RydWN0b3IgaXMgYXNzdW1lZCB0byBiZSBhdmFpbGFibGUgaW4gdGhlIGV4dGVuc2lvblxuICAgICAgLy8gYnVpbGRzLlxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoUERGSlNEZXYudGVzdChcIklNQUdFX0RFQ09ERVJTXCIpKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCBpbWFnZSBkZWNvZGVycyBkb24ndCB1c2UgdGhlIGBVUkxgIGNvbnN0cnVjdG9yLCBzbyBpdFxuICAgICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHBvbHlmaWxsZWQgZm9yIHRoZSBJTUFHRV9ERUNPREVSUyBidWlsZCB0YXJnZXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuVVJMID0gcmVxdWlyZShcImNvcmUtanMvd2ViL3VybC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRSwgTm9kZS5qc1xuICAoZnVuY3Rpb24gY2hlY2tSZWFkYWJsZVN0cmVhbSgpIHtcbiAgICBpZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgYXJlIHN5bmNocm9ub3VzLCBoZW5jZSBgUmVhZGFibGVTdHJlYW1gXG4gICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBiZSBwb2x5ZmlsbGVkIGZvciB0aGUgSU1BR0VfREVDT0RFUlMgYnVpbGQgdGFyZ2V0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgLy8gTVMgRWRnZSBtYXkgc2F5IGl0IGhhcyBSZWFkYWJsZVN0cmVhbSBidXQgdGhleSBhcmUgbm90IHVwIHRvIHNwZWMgeWV0LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFRoZSBSZWFkYWJsZVN0cmVhbSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgdXNlZC5cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoXCJ3ZWItc3RyZWFtcy1wb2x5ZmlsbC9kaXN0L3BvbnlmaWxsLmpzXCIpLlJlYWRhYmxlU3RyZWFtO1xuICB9KSgpO1xuXG4gIC8vIFdlIHdhbnQgdG8gc3VwcG9ydCBNYXAgaXRlcmF0aW9uLCBidXQgaXQgZG9lc24ndCBzZWVtIHBvc3NpYmxlIHRvIGVhc2lseVxuICAvLyB0ZXN0IGZvciB0aGF0IHNwZWNpZmljYWxseTsgaGVuY2UgdXNpbmcgYSBzaW1pbGFybHkgdW5zdXBwb3J0ZWQgcHJvcGVydHkuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrTWFwRW50cmllcygpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5NYXAgJiYgZ2xvYmFsVGhpcy5NYXAucHJvdG90eXBlLmVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5NYXAgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9tYXAvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gV2Ugd2FudCB0byBzdXBwb3J0IFNldCBpdGVyYXRpb24sIGJ1dCBpdCBkb2Vzbid0IHNlZW0gcG9zc2libGUgdG8gZWFzaWx5XG4gIC8vIHRlc3QgZm9yIHRoYXQgc3BlY2lmaWNhbGx5OyBoZW5jZSB1c2luZyBhIHNpbWlsYXJseSB1bnN1cHBvcnRlZCBwcm9wZXJ0eS5cbiAgLy8gU3VwcG9ydDogSUUxMVxuICAoZnVuY3Rpb24gY2hlY2tTZXRFbnRyaWVzKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLlNldCAmJiBnbG9iYWxUaGlzLlNldC5wcm90b3R5cGUuZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLlNldCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3NldC9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRTwxMSwgU2FmYXJpPDgsIENocm9tZTwzNlxuICAoZnVuY3Rpb24gY2hlY2tXZWFrTWFwKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLldlYWtNYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5XZWFrTWFwID0gcmVxdWlyZShcImNvcmUtanMvZXMvd2Vhay1tYXAvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUUxMVxuICAoZnVuY3Rpb24gY2hlY2tXZWFrU2V0KCkge1xuICAgIGlmIChnbG9iYWxUaGlzLldlYWtTZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5XZWFrU2V0ID0gcmVxdWlyZShcImNvcmUtanMvZXMvd2Vhay1zZXQvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLmNvZGVQb2ludEF0IGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUxMS5cbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nQ29kZVBvaW50QXQoKSB7XG4gICAgaWYgKFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL2NvZGUtcG9pbnQtYXQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLmZyb21Db2RlUG9pbnQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRTExLlxuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdGcm9tQ29kZVBvaW50KCkge1xuICAgIGlmIChTdHJpbmcuZnJvbUNvZGVQb2ludCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBTdHJpbmcuZnJvbUNvZGVQb2ludCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9mcm9tLWNvZGUtcG9pbnQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrU3ltYm9sKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLlN5bWJvbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zeW1ib2wvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NTdcbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nUGFkU3RhcnQoKSB7XG4gICAgaWYgKFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL3BhZC1zdGFydC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcucHJvdG90eXBlLnBhZEVuZCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NTdcbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nUGFkRW5kKCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnBhZEVuZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvcGFkLWVuZC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBPYmplY3QudmFsdWVzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw1NFxuICAoZnVuY3Rpb24gY2hlY2tPYmplY3RWYWx1ZXMoKSB7XG4gICAgaWYgKE9iamVjdC52YWx1ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL29iamVjdC92YWx1ZXMuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LmVudHJpZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU0XG4gIChmdW5jdGlvbiBjaGVja09iamVjdEVudHJpZXMoKSB7XG4gICAgaWYgKE9iamVjdC5lbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzID0gcmVxdWlyZShcImNvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMuanNcIik7XG4gIH0pKCk7XG59XG4iLCIvKiBDb3B5cmlnaHQgMjAxOCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbHMgcHJvY2VzcyAqL1xuXG4vLyBOVy5qcyAvIEVsZWN0cm9uIGlzIGEgYnJvd3NlciBjb250ZXh0LCBidXQgY29waWVzIHNvbWUgTm9kZS5qcyBvYmplY3RzOyBzZWVcbi8vIGh0dHA6Ly9kb2NzLm53anMuaW8vZW4vbGF0ZXN0L0ZvciUyMFVzZXJzL0FkdmFuY2VkL0phdmFTY3JpcHQlMjBDb250ZXh0cyUyMGluJTIwTlcuanMvI2FjY2Vzcy1ub2RlanMtYW5kLW53anMtYXBpLWluLWJyb3dzZXItY29udGV4dFxuLy8gaHR0cHM6Ly93d3cuZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvcHJvY2VzcyNwcm9jZXNzdmVyc2lvbnNlbGVjdHJvbi1yZWFkb25seVxuLy8gaHR0cHM6Ly93d3cuZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvcHJvY2VzcyNwcm9jZXNzdHlwZS1yZWFkb25seVxuY29uc3QgaXNOb2RlSlMgPVxuICB0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJlxuICBwcm9jZXNzICsgXCJcIiA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIgJiZcbiAgIXByb2Nlc3MudmVyc2lvbnMubncgJiZcbiAgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09IFwiYnJvd3NlclwiKTtcblxuZXhwb3J0IHsgaXNOb2RlSlMgfTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXMuZ2xvYmFsLXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbi8vIGBnbG9iYWxUaGlzYCBvYmplY3Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxuJCh7IGdsb2JhbDogdHJ1ZSB9LCB7XG4gIGdsb2JhbFRoaXM6IGdsb2JhbFxufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHNvdXJjZVByb3BlcnR5LCAnc2hhbScsIHRydWUpO1xuICAgIH1cbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcbiIsInZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT0gNztcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCIvLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3Ncbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwiLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZURlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiAhaGFzKHZhbHVlLCAnbmFtZScpKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodmFsdWUsICduYW1lJywga2V5KTtcbiAgICBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSkuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpO1xuICB9XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIHNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXVuc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gIH0gZWxzZSBpZiAoIW5vVGFyZ2V0R2V0ICYmIE9ba2V5XSkge1xuICAgIHNpbXBsZSA9IHRydWU7XG4gIH1cbiAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gIGVsc2UgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpO1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWwsIGtleSwgdmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZztcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGAzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG4iLCJ2YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCkge1xuICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChpbnNwZWN0U291cmNlKFdlYWtNYXApKTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjYuNScsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAyMCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsInZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgU3RyaW5nKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArICgrK2lkICsgcG9zdGZpeCkudG9TdHJpbmcoMzYpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIG93bktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIGtleXMgPSBvd25LZXlzKHNvdXJjZSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFoYXModGFyZ2V0LCBrZXkpKSBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gIH1cbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKVxuICAgIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG4iLCJ2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG52YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9pbnRlZ2VyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aCcpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAnc3RhcnRzV2l0aCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIG5vdEFSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgbmF0aXZlU3RhcnRzV2l0aCA9ICcnLnN0YXJ0c1dpdGg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdzdGFydHNXaXRoJyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9wdWxsLzcwMlxudmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZy5wcm90b3R5cGUsICdzdGFydHNXaXRoJyk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlO1xufSgpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RhcnRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgbm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpO1xuICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKG1pbihhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdGhhdC5sZW5ndGgpKTtcbiAgICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuIG5hdGl2ZVN0YXJ0c1dpdGhcbiAgICAgID8gbmF0aXZlU3RhcnRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgaW5kZXgpXG4gICAgICA6IHRoYXQuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iLCJ2YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcmVnZXhwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1JlZ0V4cChpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnNcIik7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxuLy8gYElzUmVnRXhwYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcmVnZXhwXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICBpZiAoIWhhcyhXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpKSB7XG4gICAgaWYgKE5BVElWRV9TWU1CT0wgJiYgaGFzKFN5bWJvbCwgbmFtZSkpIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IFN5bWJvbFtuYW1lXTtcbiAgICBlbHNlIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTtcbiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuICFTdHJpbmcoU3ltYm9sKCkpO1xufSk7XG4iLCJ2YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgJiYgIVN5bWJvbC5zaGFtXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHZhciByZWdleHAgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVnZXhwW01BVENIXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICAgIH0gY2F0Y2ggKGYpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiBmYWxzZTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24uY2FsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1IsIE1FVEhPRCwgbGVuZ3RoKSB7XG4gIHJldHVybiBiaW5kKGNhbGwsIGdsb2JhbFtDT05TVFJVQ1RPUl0ucHJvdG90eXBlW01FVEhPRF0sIGxlbmd0aCk7XG59O1xuIiwidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCk7XG4gICAgfTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoJyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdlbmRzV2l0aCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIG5vdEFSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgbmF0aXZlRW5kc1dpdGggPSAnJy5lbmRzV2l0aDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxudmFyIENPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDID0gY29ycmVjdElzUmVnRXhwTG9naWMoJ2VuZHNXaXRoJyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9wdWxsLzcwMlxudmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZy5wcm90b3R5cGUsICdlbmRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5lbmRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTtcbiAgICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IG1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVFbmRzV2l0aFxuICAgICAgPyBuYXRpdmVFbmRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgZW5kKVxuICAgICAgOiB0aGF0LnNsaWNlKGVuZCAtIHNlYXJjaC5sZW5ndGgsIGVuZCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcycpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAnaW5jbHVkZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIG5vdEFSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdpbmNsdWRlcycpIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSlcbiAgICAgIC5pbmRleE9mKG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnaW5jbHVkZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluY2x1ZGVzO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgYXJyYXlNZXRob2RVc2VzVG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoJyk7XG5cbnZhciBVU0VTX1RPX0xFTkdUSCA9IGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoKCdpbmRleE9mJywgeyBBQ0NFU1NPUlM6IHRydWUsIDE6IDAgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhVVNFU19UT19MRU5HVEggfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2luY2x1ZGVzJyk7XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG5cbnZhciBHVCA9ICc+JztcbnZhciBMVCA9ICc8JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBTQ1JJUFQgPSAnc2NyaXB0JztcbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIEFjdGl2ZVggT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkge1xuICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpO1xuICB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0O1xuICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsOyAvLyBhdm9pZCBtZW1vcnkgbGVha1xuICByZXR1cm4gdGVtcDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NVxuICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjtcbn07XG5cbi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbi8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXRcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbi8vIGF2b2lkIElFIEdDIGJ1Z1xudmFyIGFjdGl2ZVhEb2N1bWVudDtcbnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3QgKi9cbiAgICBhY3RpdmVYRG9jdW1lbnQgPSBkb2N1bWVudC5kb21haW4gJiYgbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IGFjdGl2ZVhEb2N1bWVudCA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gTnVsbFByb3RvT2JqZWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5ID0ga2V5c1tpbmRleCsrXSwgUHJvcGVydGllc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgY2FjaGUgPSB7fTtcblxudmFyIHRocm93ZXIgPSBmdW5jdGlvbiAoaXQpIHsgdGhyb3cgaXQ7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FLCBvcHRpb25zKSB7XG4gIGlmIChoYXMoY2FjaGUsIE1FVEhPRF9OQU1FKSkgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXTtcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gIHZhciBtZXRob2QgPSBbXVtNRVRIT0RfTkFNRV07XG4gIHZhciBBQ0NFU1NPUlMgPSBoYXMob3B0aW9ucywgJ0FDQ0VTU09SUycpID8gb3B0aW9ucy5BQ0NFU1NPUlMgOiBmYWxzZTtcbiAgdmFyIGFyZ3VtZW50MCA9IGhhcyhvcHRpb25zLCAwKSA/IG9wdGlvbnNbMF0gOiB0aHJvd2VyO1xuICB2YXIgYXJndW1lbnQxID0gaGFzKG9wdGlvbnMsIDEpID8gb3B0aW9uc1sxXSA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gY2FjaGVbTUVUSE9EX05BTUVdID0gISFtZXRob2QgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoQUNDRVNTT1JTICYmICFERVNDUklQVE9SUykgcmV0dXJuIHRydWU7XG4gICAgdmFyIE8gPSB7IGxlbmd0aDogLTEgfTtcblxuICAgIGlmIChBQ0NFU1NPUlMpIGRlZmluZVByb3BlcnR5KE8sIDEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiB0aHJvd2VyIH0pO1xuICAgIGVsc2UgT1sxXSA9IDE7XG5cbiAgICBtZXRob2QuY2FsbChPLCBhcmd1bWVudDAsIGFyZ3VtZW50MSk7XG4gIH0pO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2hhckF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jaGFyQXQ7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiBTdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICBzdGF0ZS5pbmRleCArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyBjb2RlUG9pbnRBdCwgYXQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChDT05WRVJUX1RPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBwb3MpIHtcbiAgICB2YXIgUyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgICB2YXIgZmlyc3QsIHNlY29uZDtcbiAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpIHJldHVybiBDT05WRVJUX1RPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklORyA/IFMuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgMikgOiAoZmlyc3QgLSAweEQ4MDAgPDwgMTApICsgKHNlY29uZCAtIDB4REMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuICBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxuICBjaGFyQXQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEl0ZXJhdG9yc0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKTtcblxudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICBpZiAoIUlTX1BVUkUgJiYgZ2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlKSAhPT0gSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG5pZiAoSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxuaWYgKCFJU19QVVJFICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCJ2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG59KTtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkge1xuICB2YXIgQ09SUkVDVF9TRVRURVIgPSBmYWxzZTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdmFyIHNldHRlcjtcbiAgdHJ5IHtcbiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7XG4gICAgc2V0dGVyLmNhbGwodGVzdCwgW10pO1xuICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgJiYgaXQgIT09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBzZXQgXCIgKyBTdHJpbmcoaXQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZyb20nKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgQXJyYXkuZnJvbShpdGVyYWJsZSk7XG59KTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogZnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAvLyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSBvciBpdCdzIGFuIGFycmF5IHdpdGggdGhlIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2UgYSBzaW1wbGUgY2FzZVxuICBpZiAoaXRlcmF0b3JNZXRob2QgIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChPKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICByZXN1bHQgPSBuZXcgQygpO1xuICAgIGZvciAoOyEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWU7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICByZXN1bHQgPSBuZXcgQyhsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHZhciByZXR1cm5NZXRob2QgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldHVybk1ldGhvZCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXR1cm5NZXRob2QuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUoa2V5KTtcbiAgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciB0ZXN0ID0ge307XG5cbnRlc3RbVE9fU1RSSU5HX1RBR10gPSAneic7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nKHRlc3QpID09PSAnW29iamVjdCB6XSc7XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIGNhbGxlZCA9IDA7XG4gIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogISFjYWxsZWQrKyB9O1xuICAgIH0sXG4gICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFNBRkVfQ0xPU0lORyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmFzc2lnbjtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG5cbnZhciBuYXRpdmVBc3NpZ24gPSBPYmplY3QuYXNzaWduO1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG5tb2R1bGUuZXhwb3J0cyA9ICFuYXRpdmVBc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgbmF0aXZlQXNzaWduKHsgYjogMSB9LCBuYXRpdmVBc3NpZ24oZGVmaW5lUHJvcGVydHkoe30sICdhJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHtcbiAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCB7IGI6IDIgfSkpLmIgIT09IDEpIHJldHVybiB0cnVlO1xuICAvLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1ZylcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBzeW1ib2wgPSBTeW1ib2woKTtcbiAgdmFyIGFscGhhYmV0ID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtzeW1ib2xdID0gNztcbiAgYWxwaGFiZXQuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGNocikgeyBCW2Nocl0gPSBjaHI7IH0pO1xuICByZXR1cm4gbmF0aXZlQXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cyhuYXRpdmVBc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBhbHBoYWJldDtcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IG9iamVjdEtleXMoUykuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogbmF0aXZlQXNzaWduO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZnJvbS1lbnRyaWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZnJvbUVudHJpZXM7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgQVJSQVlfSVRFUkFUT1IgPSAnQXJyYXkgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfSVRFUkFUT1IpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUua2V5c1xuLy8gYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnZhbHVlc1xuLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY3JlYXRlYXJyYXlpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVJdGVyYXRvcihBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IEFSUkFZX0lURVJBVE9SLFxuICAgIHRhcmdldDogdG9JbmRleGVkT2JqZWN0KGl0ZXJhdGVkKSwgLy8gdGFyZ2V0XG4gICAgaW5kZXg6IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gICAga2luZDoga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gIH0pO1xuLy8gYCVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7XG4gIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKztcbiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkge1xuICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogaW5kZXgsIGRvbmU6IGZhbHNlIH07XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogdGFyZ2V0W2luZGV4XSwgZG9uZTogZmFsc2UgfTtcbiAgcmV0dXJuIHsgdmFsdWU6IFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGRvbmU6IGZhbHNlIH07XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZW1hcHBlZGFyZ3VtZW50c29iamVjdFxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG5cbi8vIGBPYmplY3QuZnJvbUVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LWZyb20tZW50cmllc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBmcm9tRW50cmllczogZnVuY3Rpb24gZnJvbUVudHJpZXMoaXRlcmFibGUpIHtcbiAgICB2YXIgb2JqID0ge307XG4gICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KG9iaiwgaywgdik7XG4gICAgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG59KTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbnZhciBpdGVyYXRlID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGZuLCB0aGF0LCBBU19FTlRSSUVTLCBJU19JVEVSQVRPUikge1xuICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoZm4sIHRoYXQsIEFTX0VOVFJJRVMgPyAyIDogMSk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgaWYgKElTX0lURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBhcnJheSBpdGVyYXRvcnNcbiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBBU19FTlRSSUVTXG4gICAgICAgICAgPyBib3VuZEZ1bmN0aW9uKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKVxuICAgICAgICAgIDogYm91bmRGdW5jdGlvbihpdGVyYWJsZVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTtcbiAgfVxuXG4gIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHJlc3VsdCA9IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIGJvdW5kRnVuY3Rpb24sIHN0ZXAudmFsdWUsIEFTX0VOVFJJRVMpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xufTtcblxuaXRlcmF0ZS5zdG9wID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCByZXN1bHQpO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWF0aC5sb2cyJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5NYXRoLmxvZzI7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG4vLyBgTWF0aC5sb2cyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgubG9nMlxuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHtcbiAgbG9nMjogZnVuY3Rpb24gbG9nMih4KSB7XG4gICAgcmV0dXJuIGxvZyh4KSAvIExOMjtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5pc05hTjtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTnVtYmVyLmlzTmFOYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc25hblxuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXInKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5pc0ludGVnZXI7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtaW50ZWdlcicpO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNpbnRlZ2VyXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzSW50ZWdlcjogaXNJbnRlZ2VyXG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zbGljZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgJHNsaWNlID0gW10uc2xpY2U7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBuZXcgSW50OEFycmF5KDEpLnNsaWNlKCk7XG59KTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc2xpY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5zbGljZVxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc2xpY2UnLCBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gIHZhciBsaXN0ID0gJHNsaWNlLmNhbGwoYVR5cGVkQXJyYXkodGhpcyksIHN0YXJ0LCBlbmQpO1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gbmV3IChhVHlwZWRBcnJheUNvbnN0cnVjdG9yKEMpKShsZW5ndGgpO1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdO1xuICByZXR1cm4gcmVzdWx0O1xufSwgRk9SQ0VEKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1uYXRpdmUnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIEludDhBcnJheSA9IGdsb2JhbC5JbnQ4QXJyYXk7XG52YXIgSW50OEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5ICYmIEludDhBcnJheS5wcm90b3R5cGU7XG52YXIgVWludDhDbGFtcGVkQXJyYXkgPSBnbG9iYWwuVWludDhDbGFtcGVkQXJyYXk7XG52YXIgVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUgPSBVaW50OENsYW1wZWRBcnJheSAmJiBVaW50OENsYW1wZWRBcnJheS5wcm90b3R5cGU7XG52YXIgVHlwZWRBcnJheSA9IEludDhBcnJheSAmJiBnZXRQcm90b3R5cGVPZihJbnQ4QXJyYXkpO1xudmFyIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXlQcm90b3R5cGUgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5UHJvdG90eXBlKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xudmFyIGlzUHJvdG90eXBlT2YgPSBPYmplY3RQcm90b3R5cGUuaXNQcm90b3R5cGVPZjtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgVFlQRURfQVJSQVlfVEFHID0gdWlkKCdUWVBFRF9BUlJBWV9UQUcnKTtcbi8vIEZpeGluZyBuYXRpdmUgdHlwZWQgYXJyYXlzIGluIE9wZXJhIFByZXN0byBjcmFzaGVzIHRoZSBicm93c2VyLCBzZWUgIzU5NVxudmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBOQVRJVkVfQVJSQVlfQlVGRkVSICYmICEhc2V0UHJvdG90eXBlT2YgJiYgY2xhc3NvZihnbG9iYWwub3BlcmEpICE9PSAnT3BlcmEnO1xudmFyIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gZmFsc2U7XG52YXIgTkFNRTtcblxudmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0ID0ge1xuICBJbnQ4QXJyYXk6IDEsXG4gIFVpbnQ4QXJyYXk6IDEsXG4gIFVpbnQ4Q2xhbXBlZEFycmF5OiAxLFxuICBJbnQxNkFycmF5OiAyLFxuICBVaW50MTZBcnJheTogMixcbiAgSW50MzJBcnJheTogNCxcbiAgVWludDMyQXJyYXk6IDQsXG4gIEZsb2F0MzJBcnJheTogNCxcbiAgRmxvYXQ2NEFycmF5OiA4XG59O1xuXG52YXIgaXNWaWV3ID0gZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpO1xuICByZXR1cm4ga2xhc3MgPT09ICdEYXRhVmlldycgfHwgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBrbGFzcyk7XG59O1xuXG52YXIgaXNUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBjbGFzc29mKGl0KSk7XG59O1xuXG52YXIgYVR5cGVkQXJyYXkgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzVHlwZWRBcnJheShpdCkpIHJldHVybiBpdDtcbiAgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXknKTtcbn07XG5cbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKEMpIHtcbiAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgaWYgKGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5LCBDKSkgcmV0dXJuIEM7XG4gIH0gZWxzZSBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgaWYgKGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwgTkFNRSkpIHtcbiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTtcbiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmIChDID09PSBUeXBlZEFycmF5Q29uc3RydWN0b3IgfHwgaXNQcm90b3R5cGVPZi5jYWxsKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgQykpKSB7XG4gICAgICByZXR1cm4gQztcbiAgICB9XG4gIH0gdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3InKTtcbn07XG5cbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCkge1xuICBpZiAoIURFU0NSSVBUT1JTKSByZXR1cm47XG4gIGlmIChmb3JjZWQpIGZvciAodmFyIEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07XG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZSwgS0VZKSkge1xuICAgICAgZGVsZXRlIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGVbS0VZXTtcbiAgICB9XG4gIH1cbiAgaWYgKCFUeXBlZEFycmF5UHJvdG90eXBlW0tFWV0gfHwgZm9yY2VkKSB7XG4gICAgcmVkZWZpbmUoVHlwZWRBcnJheVByb3RvdHlwZSwgS0VZLCBmb3JjZWQgPyBwcm9wZXJ0eVxuICAgICAgOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIEludDhBcnJheVByb3RvdHlwZVtLRVldIHx8IHByb3BlcnR5KTtcbiAgfVxufTtcblxudmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7XG4gIHZhciBBUlJBWSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICBpZiAoIURFU0NSSVBUT1JTKSByZXR1cm47XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIGlmIChmb3JjZWQpIGZvciAoQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07XG4gICAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSkpIHtcbiAgICAgICAgZGVsZXRlIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcltLRVldO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIVR5cGVkQXJyYXlbS0VZXSB8fCBmb3JjZWQpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21lIDQ5LTUwIGAlVHlwZWRBcnJheSVgIG1ldGhvZHMgYXJlIG5vbi13cml0YWJsZSBub24tY29uZmlndXJhYmxlXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVkZWZpbmUoVHlwZWRBcnJheSwgS0VZLCBmb3JjZWQgPyBwcm9wZXJ0eSA6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgSW50OEFycmF5W0tFWV0gfHwgcHJvcGVydHkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgIH0gZWxzZSByZXR1cm47XG4gIH1cbiAgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07XG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiAoIVR5cGVkQXJyYXlDb25zdHJ1Y3RvcltLRVldIHx8IGZvcmNlZCkpIHtcbiAgICAgIHJlZGVmaW5lKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgS0VZLCBwcm9wZXJ0eSk7XG4gICAgfVxuICB9XG59O1xuXG5mb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgaWYgKCFnbG9iYWxbTkFNRV0pIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBmYWxzZTtcbn1cblxuLy8gV2ViS2l0IGJ1ZyAtIHR5cGVkIGFycmF5cyBjb25zdHJ1Y3RvcnMgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGVcbmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCB0eXBlb2YgVHlwZWRBcnJheSAhPSAnZnVuY3Rpb24nIHx8IFR5cGVkQXJyYXkgPT09IEZ1bmN0aW9uLnByb3RvdHlwZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIFR5cGVkQXJyYXkgPSBmdW5jdGlvbiBUeXBlZEFycmF5KCkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTtcbiAgfTtcbiAgaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIGlmIChnbG9iYWxbTkFNRV0pIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXSwgVHlwZWRBcnJheSk7XG4gIH1cbn1cblxuaWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8ICFUeXBlZEFycmF5UHJvdG90eXBlIHx8IFR5cGVkQXJyYXlQcm90b3R5cGUgPT09IE9iamVjdFByb3RvdHlwZSkge1xuICBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheS5wcm90b3R5cGU7XG4gIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBpZiAoZ2xvYmFsW05BTUVdKSBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0ucHJvdG90eXBlLCBUeXBlZEFycmF5UHJvdG90eXBlKTtcbiAgfVxufVxuXG4vLyBXZWJLaXQgYnVnIC0gb25lIG1vcmUgb2JqZWN0IGluIFVpbnQ4Q2xhbXBlZEFycmF5IHByb3RvdHlwZSBjaGFpblxuaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUpICE9PSBUeXBlZEFycmF5UHJvdG90eXBlKSB7XG4gIHNldFByb3RvdHlwZU9mKFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlLCBUeXBlZEFycmF5UHJvdG90eXBlKTtcbn1cblxuaWYgKERFU0NSSVBUT1JTICYmICFoYXMoVHlwZWRBcnJheVByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQgPSB0cnVlO1xuICBkZWZpbmVQcm9wZXJ0eShUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7IGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpc09iamVjdCh0aGlzKSA/IHRoaXNbVFlQRURfQVJSQVlfVEFHXSA6IHVuZGVmaW5lZDtcbiAgfSB9KTtcbiAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSBpZiAoZ2xvYmFsW05BTUVdKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbFtOQU1FXSwgVFlQRURfQVJSQVlfVEFHLCBOQU1FKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyxcbiAgVFlQRURfQVJSQVlfVEFHOiBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCAmJiBUWVBFRF9BUlJBWV9UQUcsXG4gIGFUeXBlZEFycmF5OiBhVHlwZWRBcnJheSxcbiAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgZXhwb3J0VHlwZWRBcnJheU1ldGhvZDogZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDogZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCxcbiAgaXNWaWV3OiBpc1ZpZXcsXG4gIGlzVHlwZWRBcnJheTogaXNUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5OiBUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBEYXRhVmlldyAhPT0gJ3VuZGVmaW5lZCc7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29uc3RydWN0b3IgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5tYXAnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTWFwO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYE1hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hcC1vYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FLCB3cmFwcGVyLCBjb21tb24pIHtcbiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xO1xuICB2YXIgSVNfV0VBSyA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignV2VhaycpICE9PSAtMTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgQ29uc3RydWN0b3IgPSBOYXRpdmVDb25zdHJ1Y3RvcjtcbiAgdmFyIGV4cG9ydGVkID0ge307XG5cbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgbmF0aXZlTWV0aG9kID0gTmF0aXZlUHJvdG90eXBlW0tFWV07XG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvdG90eXBlLCBLRVksXG4gICAgICBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywgdmFsdWUgPT09IDAgPyAwIDogdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gOiBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gdW5kZWZpbmVkIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gIGlmIChpc0ZvcmNlZChDT05TVFJVQ1RPUl9OQU1FLCB0eXBlb2YgTmF0aXZlQ29uc3RydWN0b3IgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0ZvcmNlZChDT05TVFJVQ1RPUl9OQU1FLCB0cnVlKSkge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgIC8vIGVhcmx5IGltcGxlbWVudGF0aW9ucyBub3Qgc3VwcG9ydHMgY2hhaW5pbmdcbiAgICB2YXIgSEFTTlRfQ0hBSU5JTkcgPSBpbnN0YW5jZVtBRERFUl0oSVNfV0VBSyA/IHt9IDogLTAsIDEpICE9IGluc3RhbmNlO1xuICAgIC8vIFY4IH4gQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihpdGVyYWJsZSk7IH0pO1xuICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgIHZhciBCVUdHWV9aRVJPID0gIUlTX1dFQUsgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzXG4gICAgICB2YXIgJGluc3RhbmNlID0gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIUFDQ0VQVF9JVEVSQUJMRVMpIHtcbiAgICAgIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAoZHVtbXksIGl0ZXJhYmxlKSB7XG4gICAgICAgIGFuSW5zdGFuY2UoZHVtbXksIENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlQ29uc3RydWN0b3IoKSwgZHVtbXksIENvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHRoYXQsIElTX01BUCk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBOYXRpdmVQcm90b3R5cGU7XG4gICAgICBOYXRpdmVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORykgZml4TWV0aG9kKEFEREVSKTtcblxuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgTmF0aXZlUHJvdG90eXBlLmNsZWFyKSBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyO1xuICB9XG5cbiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjtcbiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBDb25zdHJ1Y3RvciAhPSBOYXRpdmVDb25zdHJ1Y3RvciB9LCBleHBvcnRlZCk7XG5cbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBNRVRBREFUQSA9IHVpZCgnbWV0YScpO1xudmFyIGlkID0gMDtcblxudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIG1ldGEuUkVRVUlSRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBREFUQSkpIHNldE1ldGFkYXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgUkVRVUlSRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrRGF0YTogZ2V0V2Vha0RhdGEsXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuaGlkZGVuS2V5c1tNRVRBREFUQV0gPSB0cnVlO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gbWFrZXMgc3ViY2xhc3Npbmcgd29yayBjb3JyZWN0IGZvciB3cmFwcGVkIGJ1aWx0LWluc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJHRoaXMsIGR1bW15LCBXcmFwcGVyKSB7XG4gIHZhciBOZXdUYXJnZXQsIE5ld1RhcmdldFByb3RvdHlwZTtcbiAgaWYgKFxuICAgIC8vIGl0IGNhbiB3b3JrIG9ubHkgd2l0aCBuYXRpdmUgYHNldFByb3RvdHlwZU9mYFxuICAgIHNldFByb3RvdHlwZU9mICYmXG4gICAgLy8gd2UgaGF2ZW4ndCBjb21wbGV0ZWx5IGNvcnJlY3QgcHJlLUVTNiB3YXkgZm9yIGdldHRpbmcgYG5ldy50YXJnZXRgLCBzbyB1c2UgdGhpc1xuICAgIHR5cGVvZiAoTmV3VGFyZ2V0ID0gZHVtbXkuY29uc3RydWN0b3IpID09ICdmdW5jdGlvbicgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5mYXN0S2V5O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGluZGV4OiBjcmVhdGUobnVsbCksXG4gICAgICAgIGZpcnN0OiB1bmRlZmluZWQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgc2l6ZTogMFxuICAgICAgfSk7XG4gICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHRoYXQsIElTX01BUCk7XG4gICAgfSk7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgdmFyIHByZXZpb3VzLCBpbmRleDtcbiAgICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XG4gICAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7XG4gICAgICAgICAgaW5kZXg6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91czogcHJldmlvdXMgPSBzdGF0ZS5sYXN0LFxuICAgICAgICAgIG5leHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZW1vdmVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXN0YXRlLmZpcnN0KSBzdGF0ZS5maXJzdCA9IGVudHJ5O1xuICAgICAgICBpZiAocHJldmlvdXMpIHByZXZpb3VzLm5leHQgPSBlbnRyeTtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplKys7XG4gICAgICAgIGVsc2UgdGhhdC5zaXplKys7XG4gICAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09ICdGJykgc3RhdGUuaW5kZXhbaW5kZXhdID0gZW50cnk7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICB2YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgLy8gZmFzdCBjYXNlXG4gICAgICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gICAgICB2YXIgZW50cnk7XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHN0YXRlLmluZGV4W2luZGV4XTtcbiAgICAgIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICAgICAgZm9yIChlbnRyeSA9IHN0YXRlLmZpcnN0OyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uZXh0KSB7XG4gICAgICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBkYXRhID0gc3RhdGUuaW5kZXg7XG4gICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0O1xuICAgICAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplID0gMDtcbiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgICBkZWxldGUgc3RhdGUuaW5kZXhbZW50cnkuaW5kZXhdO1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm5leHQgPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnByZXZpb3VzID0gcHJldjtcbiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT0gZW50cnkpIHN0YXRlLmZpcnN0ID0gbmV4dDtcbiAgICAgICAgICBpZiAoc3RhdGUubGFzdCA9PSBlbnRyeSkgc3RhdGUubGFzdCA9IHByZXY7XG4gICAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplLS07XG4gICAgICAgICAgZWxzZSB0aGF0LnNpemUtLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7XG4gICAgICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHtcbiAgICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJztcbiAgICB2YXIgZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpO1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICBkZWZpbmVJdGVyYXRvcihDLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9O1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS52YWx1ZSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xuaWYgKCFUT19TVFJJTkdfVEFHX1NVUFBPUlQpIHtcbiAgcmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgdG9TdHJpbmcsIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyB7fS50b1N0cmluZyA6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTtcbiAgdmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gPSBBcnJheVZhbHVlcztcbiAgICB9XG4gICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgQ09MTEVDVElPTl9OQU1FKTtcbiAgICB9XG4gICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykge1xuICAgICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkgdHJ5IHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIE1FVEhPRF9OQU1FLCBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gPSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlNldDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBTZXRgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zZXQtb2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdTZXQnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLndlYWstbWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLldlYWtNYXA7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKTtcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uV2VhayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBlbmZvcmNlSXRlcm5hbFN0YXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJykuZW5mb3JjZTtcbnZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG5cbnZhciBJU19JRTExID0gIWdsb2JhbC5BY3RpdmVYT2JqZWN0ICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnbG9iYWw7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcbnZhciBJbnRlcm5hbFdlYWtNYXA7XG5cbnZhciB3cmFwcGVyID0gZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gIH07XG59O1xuXG4vLyBgV2Vha01hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdlYWttYXAtY29uc3RydWN0b3JcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignV2Vha01hcCcsIHdyYXBwZXIsIGNvbGxlY3Rpb25XZWFrKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuLy8gV2UgY2FuJ3QgdXNlIGZlYXR1cmUgZGV0ZWN0aW9uIGJlY2F1c2UgaXQgY3Jhc2ggc29tZSBvbGQgSUUgYnVpbGRzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDg1XG5pZiAoTkFUSVZFX1dFQUtfTUFQICYmIElTX0lFMTEpIHtcbiAgSW50ZXJuYWxXZWFrTWFwID0gY29sbGVjdGlvbldlYWsuZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgJ1dlYWtNYXAnLCB0cnVlKTtcbiAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7XG4gIHZhciBXZWFrTWFwUHJvdG90eXBlID0gJFdlYWtNYXAucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlRGVsZXRlID0gV2Vha01hcFByb3RvdHlwZVsnZGVsZXRlJ107XG4gIHZhciBuYXRpdmVIYXMgPSBXZWFrTWFwUHJvdG90eXBlLmhhcztcbiAgdmFyIG5hdGl2ZUdldCA9IFdlYWtNYXBQcm90b3R5cGUuZ2V0O1xuICB2YXIgbmF0aXZlU2V0ID0gV2Vha01hcFByb3RvdHlwZS5zZXQ7XG4gIHJlZGVmaW5lQWxsKFdlYWtNYXBQcm90b3R5cGUsIHtcbiAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVEZWxldGUuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plblsnZGVsZXRlJ10oa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZURlbGV0ZS5jYWxsKHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW4uaGFzKGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSkgPyBuYXRpdmVHZXQuY2FsbCh0aGlzLCBrZXkpIDogc3RhdGUuZnJvemVuLmdldChrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpID8gbmF0aXZlU2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSkgOiBzdGF0ZS5mcm96ZW4uc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIG5hdGl2ZVNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBnZXRXZWFrRGF0YSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmdldFdlYWtEYXRhO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBBcnJheUl0ZXJhdGlvbk1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKTtcbnZhciAkaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG52YXIgZmluZCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmQ7XG52YXIgZmluZEluZGV4ID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZEluZGV4O1xudmFyIGlkID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uIChzdG9yZSkge1xuICByZXR1cm4gc3RvcmUuZnJvemVuIHx8IChzdG9yZS5mcm96ZW4gPSBuZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSgpKTtcbn07XG5cbnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVudHJpZXMgPSBbXTtcbn07XG5cbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkge1xuICByZXR1cm4gZmluZChzdG9yZS5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuXG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5lbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXgodGhpcy5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICAgIH0pO1xuICAgIGlmICh+aW5kZXgpIHRoaXMuZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiAhIX5pbmRleDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaWQ6IGlkKyssXG4gICAgICAgIGZyb3plbjogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB0aGF0LCBJU19NQVApO1xuICAgIH0pO1xuXG4gICAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gICAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShhbk9iamVjdChrZXkpLCB0cnVlKTtcbiAgICAgIGlmIChkYXRhID09PSB0cnVlKSB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBlbHNlIGRhdGFbc3RhdGUuaWRdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhhdDtcbiAgICB9O1xuXG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy40LjMuMyBXZWFrU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpO1xuICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpWydkZWxldGUnXShrZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiAkaGFzKGRhdGEsIHN0YXRlLmlkKSAmJiBkZWxldGUgZGF0YVtzdGF0ZS5pZF07XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjQuMy40IFdlYWtTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpO1xuICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLmhhcyhrZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiAkaGFzKGRhdGEsIHN0YXRlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyAyMy4zLjMuMyBXZWFrTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpO1xuICAgICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuZ2V0KGtleSk7XG4gICAgICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3N0YXRlLmlkXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjMuMy41IFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyAyMy40LjMuMSBXZWFrU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBDO1xuICB9XG59O1xuIiwidmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0LCBzcGVjaWZpY0NyZWF0ZSkge1xuICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjcmVhdGUgPSBzcGVjaWZpY0NyZWF0ZSB8fCBhcnJheVNwZWNpZXNDcmVhdGU7XG4gICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHB1c2guY2FsbCh0YXJnZXQsIHZhbHVlKTsgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgIC8vIGV2ZXJ5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbiAgZm9yRWFjaDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbiAgbWFwOiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuICBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbiAgc29tZTogY3JlYXRlTWV0aG9kKDMpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoNCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gIGZpbmRJbmRleDogY3JlYXRlTWV0aG9kKDYpXG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgZWxzZSBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBuZXcgKEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQykobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjbGFzc29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMud2Vhay1zZXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguV2Vha1NldDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uV2VhayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsnKTtcblxuLy8gYFdlYWtTZXRgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13ZWFrc2V0LWNvbnN0cnVjdG9yXG5jb2xsZWN0aW9uKCdXZWFrU2V0JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtTZXQoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvbldlYWspO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuY29kZS1wb2ludC1hdCcpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdTdHJpbmcnLCAnY29kZVBvaW50QXQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNvZGVBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlJykuY29kZUF0O1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmNvZGVwb2ludGF0XG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUgfSwge1xuICBjb2RlUG9pbnRBdDogZnVuY3Rpb24gY29kZVBvaW50QXQocG9zKSB7XG4gICAgcmV0dXJuIGNvZGVBdCh0aGlzLCBwb3MpO1xuICB9XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgbmF0aXZlRnJvbUNvZGVQb2ludCA9IFN0cmluZy5mcm9tQ29kZVBvaW50O1xuXG4vLyBsZW5ndGggc2hvdWxkIGJlIDEsIG9sZCBGRiBwcm9ibGVtXG52YXIgSU5DT1JSRUNUX0xFTkdUSCA9ICEhbmF0aXZlRnJvbUNvZGVQb2ludCAmJiBuYXRpdmVGcm9tQ29kZVBvaW50Lmxlbmd0aCAhPSAxO1xuXG4vLyBgU3RyaW5nLmZyb21Db2RlUG9pbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLmZyb21jb2RlcG9pbnRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9MRU5HVEggfSwge1xuICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgY29kZTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmICh0b0Fic29sdXRlSW5kZXgoY29kZSwgMHgxMEZGRkYpICE9PSBjb2RlKSB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIGVsZW1lbnRzLnB1c2goY29kZSA8IDB4MTAwMDBcbiAgICAgICAgPyBmcm9tQ2hhckNvZGUoY29kZSlcbiAgICAgICAgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4RDgwMCwgY29kZSAlIDB4NDAwICsgMHhEQzAwKVxuICAgICAgKTtcbiAgICB9IHJldHVybiBlbGVtZW50cy5qb2luKCcnKTtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLWFsbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wucmVwbGFjZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuc2VhcmNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5zcGVjaWVzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5zcGxpdCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC51bnNjb3BhYmxlcycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5TeW1ib2w7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEUgPSB3ZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSAweDFGRkZGRkZGRkZGRkZGO1xudmFyIE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCA9ICdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnO1xuXG4vLyBXZSBjYW4ndCB1c2UgdGhpcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbi8vIGRlb3B0aW1pemF0aW9uIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5XG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCA9IFY4X1ZFUlNJT04gPj0gNTEgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycmF5ID0gW107XG4gIGFycmF5W0lTX0NPTkNBVF9TUFJFQURBQkxFXSA9IGZhbHNlO1xuICByZXR1cm4gYXJyYXkuY29uY2F0KClbMF0gIT09IGFycmF5O1xufSk7XG5cbnZhciBTUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdjb25jYXQnKTtcblxudmFyIGlzQ29uY2F0U3ByZWFkYWJsZSA9IGZ1bmN0aW9uIChPKSB7XG4gIGlmICghaXNPYmplY3QoTykpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNwcmVhZGFibGUgPSBPW0lTX0NPTkNBVF9TUFJFQURBQkxFXTtcbiAgcmV0dXJuIHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/ICEhc3ByZWFkYWJsZSA6IGlzQXJyYXkoTyk7XG59O1xuXG52YXIgRk9SQ0VEID0gIUlTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgfHwgIVNQRUNJRVNfU1VQUE9SVDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5jb25jYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmNvbmNhdFxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQGlzQ29uY2F0U3ByZWFkYWJsZSBhbmQgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBjb25jYXQ6IGZ1bmN0aW9uIGNvbmNhdChhcmcpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgdmFyIG4gPSAwO1xuICAgIHZhciBpLCBrLCBsZW5ndGgsIGxlbiwgRTtcbiAgICBmb3IgKGkgPSAtMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBFID0gaSA9PT0gLTEgPyBPIDogYXJndW1lbnRzW2ldO1xuICAgICAgaWYgKGlzQ29uY2F0U3ByZWFkYWJsZShFKSkge1xuICAgICAgICBsZW4gPSB0b0xlbmd0aChFLmxlbmd0aCk7XG4gICAgICAgIGlmIChuICsgbGVuID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsrKywgbisrKSBpZiAoayBpbiBFKSBjcmVhdGVQcm9wZXJ0eShBLCBuLCBFW2tdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuID49IE1BWF9TQUZFX0lOVEVHRVIpIHRocm93IFR5cGVFcnJvcihNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQpO1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShBLCBuKyssIEUpO1xuICAgICAgfVxuICAgIH1cbiAgICBBLmxlbmd0aCA9IG47XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICAvLyBXZSBjYW4ndCB1c2UgdGhpcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3N1xuICByZXR1cm4gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IGFycmF5LmNvbnN0cnVjdG9yID0ge307XG4gICAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBmb286IDEgfTtcbiAgICB9O1xuICAgIHJldHVybiBhcnJheVtNRVRIT0RfTkFNRV0oQm9vbGVhbikuZm9vICE9PSAxO1xuICB9KTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7XG52YXIgbWF0Y2gsIHZlcnNpb247XG5cbmlmICh2OCkge1xuICBtYXRjaCA9IHY4LnNwbGl0KCcuJyk7XG4gIHZlcnNpb24gPSBtYXRjaFswXSArIG1hdGNoWzFdO1xufSBlbHNlIGlmICh1c2VyQWdlbnQpIHtcbiAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkge1xuICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSBtYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb24gJiYgK3ZlcnNpb247XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCduYXZpZ2F0b3InLCAndXNlckFnZW50JykgfHwgJyc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIG5hdGl2ZU9iamVjdENyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQnKTtcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcblxudmFyIEhJRERFTiA9IHNoYXJlZEtleSgnaGlkZGVuJyk7XG52YXIgU1lNQk9MID0gJ1N5bWJvbCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1lNQk9MKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciAkc3RyaW5naWZ5ID0gZ2V0QnVpbHRJbignSlNPTicsICdzdHJpbmdpZnknKTtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyA9IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbC5mO1xudmFyIG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlU3ltYm9scyA9IHNoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIFN0cmluZ1RvU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N0cmluZy10by1zeW1ib2wtcmVnaXN0cnknKTtcbnZhciBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5Jyk7XG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcbnZhciBRT2JqZWN0ID0gZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBVU0VfU0VUVEVSID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdENyZWF0ZShuYXRpdmVEZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoTywgUCwgQXR0cmlidXRlcykge1xuICB2YXIgT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3RQcm90b3R5cGUsIFApO1xuICBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvcikgZGVsZXRlIE9iamVjdFByb3RvdHlwZVtQXTtcbiAgbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yICYmIE8gIT09IE9iamVjdFByb3RvdHlwZSkge1xuICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KE9iamVjdFByb3RvdHlwZSwgUCwgT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvcik7XG4gIH1cbn0gOiBuYXRpdmVEZWZpbmVQcm9wZXJ0eTtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnLCBkZXNjcmlwdGlvbikge1xuICB2YXIgc3ltYm9sID0gQWxsU3ltYm9sc1t0YWddID0gbmF0aXZlT2JqZWN0Q3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHNldEludGVybmFsU3RhdGUoc3ltYm9sLCB7XG4gICAgdHlwZTogU1lNQk9MLFxuICAgIHRhZzogdGFnLFxuICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvblxuICB9KTtcbiAgaWYgKCFERVNDUklQVE9SUykgc3ltYm9sLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gIHJldHVybiBzeW1ib2w7XG59O1xuXG52YXIgaXNTeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGl0KSBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBpZiAoTyA9PT0gT2JqZWN0UHJvdG90eXBlKSAkZGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCwgQXR0cmlidXRlcyk7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkpIHtcbiAgICBpZiAoIUF0dHJpYnV0ZXMuZW51bWVyYWJsZSkge1xuICAgICAgaWYgKCFoYXMoTywgSElEREVOKSkgbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgSElEREVOLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwge30pKTtcbiAgICAgIE9bSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhPLCBISURERU4pICYmIE9bSElEREVOXVtrZXldKSBPW0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgQXR0cmlidXRlcyA9IG5hdGl2ZU9iamVjdENyZWF0ZShBdHRyaWJ1dGVzLCB7IGVudW1lcmFibGU6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzY3JpcHRvcihPLCBrZXksIEF0dHJpYnV0ZXMpO1xuICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBrZXksIEF0dHJpYnV0ZXMpO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIgcHJvcGVydGllcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKHByb3BlcnRpZXMpLmNvbmNhdCgkZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByb3BlcnRpZXMpKTtcbiAgJGZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghREVTQ1JJUFRPUlMgfHwgJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocHJvcGVydGllcywga2V5KSkgJGRlZmluZVByb3BlcnR5KE8sIGtleSwgcHJvcGVydGllc1trZXldKTtcbiAgfSk7XG4gIHJldHVybiBPO1xufTtcblxudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gbmF0aXZlT2JqZWN0Q3JlYXRlKE8pIDogJGRlZmluZVByb3BlcnRpZXMobmF0aXZlT2JqZWN0Q3JlYXRlKE8pLCBQcm9wZXJ0aWVzKTtcbn07XG5cbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBQID0gdG9QcmltaXRpdmUoViwgdHJ1ZSk7XG4gIHZhciBlbnVtZXJhYmxlID0gbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0aGlzLCBQKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvdHlwZSAmJiBoYXMoQWxsU3ltYm9scywgUCkgJiYgIWhhcyhPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZW51bWVyYWJsZSB8fCAhaGFzKHRoaXMsIFApIHx8ICFoYXMoQWxsU3ltYm9scywgUCkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW1BdID8gZW51bWVyYWJsZSA6IHRydWU7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIHZhciBpdCA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvdHlwZSAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIGtleSkpIHJldHVybjtcbiAgdmFyIGRlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7XG4gIGlmIChkZXNjcmlwdG9yICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIHtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuICB9XG4gIHJldHVybiBkZXNjcmlwdG9yO1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHZhciBuYW1lcyA9IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KE8pKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICAkZm9yRWFjaChuYW1lcywgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhoaWRkZW5LZXlzLCBrZXkpKSByZXN1bHQucHVzaChrZXkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pIHtcbiAgdmFyIElTX09CSkVDVF9QUk9UT1RZUEUgPSBPID09PSBPYmplY3RQcm90b3R5cGU7XG4gIHZhciBuYW1lcyA9IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMoSVNfT0JKRUNUX1BST1RPVFlQRSA/IE9iamVjdFByb3RvdHlwZVN5bWJvbHMgOiB0b0luZGV4ZWRPYmplY3QoTykpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICghSVNfT0JKRUNUX1BST1RPVFlQRSB8fCBoYXMoT2JqZWN0UHJvdG90eXBlLCBrZXkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gYFN5bWJvbGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC1jb25zdHJ1Y3RvclxuaWYgKCFOQVRJVkVfU1lNQk9MKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuICAgIHZhciBkZXNjcmlwdGlvbiA9ICFhcmd1bWVudHMubGVuZ3RoIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RyaW5nKGFyZ3VtZW50c1swXSk7XG4gICAgdmFyIHRhZyA9IHVpZChkZXNjcmlwdGlvbik7XG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvdHlwZSkgc2V0dGVyLmNhbGwoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjcmlwdG9yKHRoaXMsIHRhZywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgVVNFX1NFVFRFUikgc2V0U3ltYm9sRGVzY3JpcHRvcihPYmplY3RQcm90b3R5cGUsIHRhZywgeyBjb25maWd1cmFibGU6IHRydWUsIHNldDogc2V0dGVyIH0pO1xuICAgIHJldHVybiB3cmFwKHRhZywgZGVzY3JpcHRpb24pO1xuICB9O1xuXG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykudGFnO1xuICB9KTtcblxuICByZWRlZmluZSgkU3ltYm9sLCAnd2l0aG91dFNldHRlcicsIGZ1bmN0aW9uIChkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiB3cmFwKHVpZChkZXNjcmlwdGlvbiksIGRlc2NyaXB0aW9uKTtcbiAgfSk7XG5cbiAgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcCh3ZWxsS25vd25TeW1ib2wobmFtZSksIG5hbWUpO1xuICB9O1xuXG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLVN5bWJvbC1kZXNjcmlwdGlvblxuICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KCRTeW1ib2xbUFJPVE9UWVBFXSwgJ2Rlc2NyaXB0aW9uJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFJU19QVVJFKSB7XG4gICAgICByZWRlZmluZShPYmplY3RQcm90b3R5cGUsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgeyB1bnNhZmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsIHNoYW06ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgU3ltYm9sOiAkU3ltYm9sXG59KTtcblxuJGZvckVhY2gob2JqZWN0S2V5cyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBmdW5jdGlvbiAobmFtZSkge1xuICBkZWZpbmVXZWxsS25vd25TeW1ib2wobmFtZSk7XG59KTtcblxuJCh7IHRhcmdldDogU1lNQk9MLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgLy8gYFN5bWJvbC5mb3JgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuZm9yXG4gICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHN0cmluZyA9IFN0cmluZyhrZXkpO1xuICAgIGlmIChoYXMoU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSwgc3RyaW5nKSkgcmV0dXJuIFN0cmluZ1RvU3ltYm9sUmVnaXN0cnlbc3RyaW5nXTtcbiAgICB2YXIgc3ltYm9sID0gJFN5bWJvbChzdHJpbmcpO1xuICAgIFN0cmluZ1RvU3ltYm9sUmVnaXN0cnlbc3RyaW5nXSA9IHN5bWJvbDtcbiAgICBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5W3N5bWJvbF0gPSBzdHJpbmc7XG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfSxcbiAgLy8gYFN5bWJvbC5rZXlGb3JgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wua2V5Zm9yXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgVHlwZUVycm9yKHN5bSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG4gICAgaWYgKGhhcyhTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5LCBzeW0pKSByZXR1cm4gU3ltYm9sVG9TdHJpbmdSZWdpc3RyeVtzeW1dO1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgVVNFX1NFVFRFUiA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gZmFsc2U7IH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Jcbn0pO1xuXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB9LCB7XG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eXN5bWJvbHNcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gQ2hyb21lIDM4IGFuZCAzOSBgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc2AgZmFpbHMgb24gcHJpbWl0aXZlc1xuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzQ0M1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogZmFpbHMoZnVuY3Rpb24gKCkgeyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZigxKTsgfSkgfSwge1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkge1xuICAgIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZih0b09iamVjdChpdCkpO1xuICB9XG59KTtcblxuLy8gYEpTT04uc3RyaW5naWZ5YCBtZXRob2QgYmVoYXZpb3Igd2l0aCBzeW1ib2xzXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeVxuaWYgKCRzdHJpbmdpZnkpIHtcbiAgdmFyIEZPUkNFRF9KU09OX1NUUklOR0lGWSA9ICFOQVRJVkVfU1lNQk9MIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3ltYm9sID0gJFN5bWJvbCgpO1xuICAgIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gICAgcmV0dXJuICRzdHJpbmdpZnkoW3N5bWJvbF0pICE9ICdbbnVsbF0nXG4gICAgICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgICAgIHx8ICRzdHJpbmdpZnkoeyBhOiBzeW1ib2wgfSkgIT0gJ3t9J1xuICAgICAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgICAgIHx8ICRzdHJpbmdpZnkoT2JqZWN0KHN5bWJvbCkpICE9ICd7fSc7XG4gIH0pO1xuXG4gICQoeyB0YXJnZXQ6ICdKU09OJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfSlNPTl9TVFJJTkdJRlkgfSwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0LCByZXBsYWNlciwgc3BhY2UpIHtcbiAgICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICAgIHZhciBpbmRleCA9IDE7XG4gICAgICB2YXIgJHJlcGxhY2VyO1xuICAgICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpbmRleCkgYXJncy5wdXNoKGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgICAkcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgIGlmICghaXNPYmplY3QocmVwbGFjZXIpICYmIGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgICByZXR1cm4gJHN0cmluZ2lmeS5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9wcmltaXRpdmVcbmlmICghJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0pIHtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG59XG4vLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgU1lNQk9MKTtcblxuaGlkZGVuS2V5c1tISURERU5dID0gdHJ1ZTtcbiIsInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJykuZjtcblxudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJ1xuICAgID8gZ2V0V2luZG93TmFtZXMoaXQpXG4gICAgOiBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuZXhwb3J0cy5mID0gd2VsbEtub3duU3ltYm9sO1xuIiwidmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pO1xuICBpZiAoIWhhcyhTeW1ib2wsIE5BTUUpKSBkZWZpbmVQcm9wZXJ0eShTeW1ib2wsIE5BTUUsIHtcbiAgICB2YWx1ZTogd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKE5BTUUpXG4gIH0pO1xufTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuYXN5bmNJdGVyYXRvcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5hc3luY2l0ZXJhdG9yXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2FzeW5jSXRlcmF0b3InKTtcbiIsIi8vIGBTeW1ib2wucHJvdG90eXBlLmRlc2NyaXB0aW9uYCBnZXR0ZXJcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25cbid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xuXG52YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcblxuaWYgKERFU0NSSVBUT1JTICYmIHR5cGVvZiBOYXRpdmVTeW1ib2wgPT0gJ2Z1bmN0aW9uJyAmJiAoISgnZGVzY3JpcHRpb24nIGluIE5hdGl2ZVN5bWJvbC5wcm90b3R5cGUpIHx8XG4gIC8vIFNhZmFyaSAxMiBidWdcbiAgTmF0aXZlU3ltYm9sKCkuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZFxuKSkge1xuICB2YXIgRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlID0ge307XG4gIC8vIHdyYXAgU3ltYm9sIGNvbnN0cnVjdG9yIGZvciBjb3JyZWN0IHdvcmsgd2l0aCB1bmRlZmluZWQgZGVzY3JpcHRpb25cbiAgdmFyIFN5bWJvbFdyYXBwZXIgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcyBpbnN0YW5jZW9mIFN5bWJvbFdyYXBwZXJcbiAgICAgID8gbmV3IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbilcbiAgICAgIC8vIGluIEVkZ2UgMTMsIFN0cmluZyhTeW1ib2wodW5kZWZpbmVkKSkgPT09ICdTeW1ib2wodW5kZWZpbmVkKSdcbiAgICAgIDogZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/IE5hdGl2ZVN5bWJvbCgpIDogTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKTtcbiAgICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKSBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmVbcmVzdWx0XSA9IHRydWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhTeW1ib2xXcmFwcGVyLCBOYXRpdmVTeW1ib2wpO1xuICB2YXIgc3ltYm9sUHJvdG90eXBlID0gU3ltYm9sV3JhcHBlci5wcm90b3R5cGUgPSBOYXRpdmVTeW1ib2wucHJvdG90eXBlO1xuICBzeW1ib2xQcm90b3R5cGUuY29uc3RydWN0b3IgPSBTeW1ib2xXcmFwcGVyO1xuXG4gIHZhciBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvdHlwZS50b1N0cmluZztcbiAgdmFyIG5hdGl2ZSA9IFN0cmluZyhOYXRpdmVTeW1ib2woJ3Rlc3QnKSkgPT0gJ1N5bWJvbCh0ZXN0KSc7XG4gIHZhciByZWdleHAgPSAvXlN5bWJvbFxcKCguKilcXClbXildKyQvO1xuICBkZWZpbmVQcm9wZXJ0eShzeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgIHZhciBzeW1ib2wgPSBpc09iamVjdCh0aGlzKSA/IHRoaXMudmFsdWVPZigpIDogdGhpcztcbiAgICAgIHZhciBzdHJpbmcgPSBzeW1ib2xUb1N0cmluZy5jYWxsKHN5bWJvbCk7XG4gICAgICBpZiAoaGFzKEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZSwgc3ltYm9sKSkgcmV0dXJuICcnO1xuICAgICAgdmFyIGRlc2MgPSBuYXRpdmUgPyBzdHJpbmcuc2xpY2UoNywgLTEpIDogc3RyaW5nLnJlcGxhY2UocmVnZXhwLCAnJDEnKTtcbiAgICAgIHJldHVybiBkZXNjID09PSAnJyA/IHVuZGVmaW5lZCA6IGRlc2M7XG4gICAgfVxuICB9KTtcblxuICAkKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIFN5bWJvbDogU3ltYm9sV3JhcHBlclxuICB9KTtcbn1cbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuaGFzSW5zdGFuY2VgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaGFzaW5zdGFuY2VcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmlzY29uY2F0c3ByZWFkYWJsZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuaXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXRlcmF0b3JcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wubWF0Y2hgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wubWF0Y2hcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wubWF0Y2hBbGxgIHdlbGwta25vd24gc3ltYm9sXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoQWxsJyk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLnJlcGxhY2VgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wucmVwbGFjZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdyZXBsYWNlJyk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLnNlYXJjaGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5zZWFyY2hcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnc2VhcmNoJyk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLnNwZWNpZXNgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuc3BlY2llc1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLnNwbGl0YCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNwbGl0XG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwbGl0Jyk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLnRvUHJpbWl0aXZlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnRvcHJpbWl0aXZlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnRvc3RyaW5ndGFnXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLnVuc2NvcGFibGVzYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnVuc2NvcGFibGVzXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG4iLCJ2YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcblxuLy8gTWF0aFtAQHRvU3RyaW5nVGFnXSBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xuXG4vLyBKU09OW0BAdG9TdHJpbmdUYWddIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1qc29uLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcucGFkLXN0YXJ0Jyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdwYWRTdGFydCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHBhZFN0YXJ0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQnKS5zdGFydDtcbnZhciBXRUJLSVRfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQtd2Via2l0LWJ1ZycpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0XG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogV0VCS0lUX0JVRyB9LCB7XG4gIHBhZFN0YXJ0OiBmdW5jdGlvbiBwYWRTdGFydChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuICRwYWRTdGFydCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgcGFkU3RhcnQsIHBhZEVuZCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0VORCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHtcbiAgICB2YXIgUyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoO1xuICAgIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpO1xuICAgIHZhciBpbnRNYXhMZW5ndGggPSB0b0xlbmd0aChtYXhMZW5ndGgpO1xuICAgIHZhciBmaWxsTGVuLCBzdHJpbmdGaWxsZXI7XG4gICAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7XG4gICAgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aDtcbiAgICBzdHJpbmdGaWxsZXIgPSByZXBlYXQuY2FsbChmaWxsU3RyLCBjZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICAgIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pO1xuICAgIHJldHVybiBJU19FTkQgPyBTICsgc3RyaW5nRmlsbGVyIDogc3RyaW5nRmlsbGVyICsgUztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUucmVwZWF0YCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwZWF0XG5tb2R1bGUuZXhwb3J0cyA9ICcnLnJlcGVhdCB8fCBmdW5jdGlvbiByZXBlYXQoY291bnQpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7XG4gIGlmIChuIDwgMCB8fCBuID09IEluZmluaXR5KSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBudW1iZXIgb2YgcmVwZXRpdGlvbnMnKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlc3VsdCArPSBzdHI7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11bnNhZmUtcmVnZXhcbm1vZHVsZS5leHBvcnRzID0gL1ZlcnNpb25cXC8xMFxcLlxcZCsoXFwuXFxkKyk/KCBNb2JpbGVcXC9cXHcrKT8gU2FmYXJpXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kJyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdwYWRFbmQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRwYWRFbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCcpLmVuZDtcbnZhciBXRUJLSVRfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQtd2Via2l0LWJ1ZycpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRlbmRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXRUJLSVRfQlVHIH0sIHtcbiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkRW5kKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnZhbHVlcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LnZhbHVlcztcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICR2YWx1ZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5JykudmFsdWVzO1xuXG4vLyBgT2JqZWN0LnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QudmFsdWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKE8pIHtcbiAgICByZXR1cm4gJHZhbHVlcyhPKTtcbiAgfVxufSk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKS5mO1xuXG4vLyBgT2JqZWN0LnsgZW50cmllcywgdmFsdWVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVE9fRU5UUklFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBrZXkgPSBrZXlzW2krK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoTywga2V5KSkge1xuICAgICAgICByZXN1bHQucHVzaChUT19FTlRSSUVTID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYE9iamVjdC5lbnRyaWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmVudHJpZXNcbiAgZW50cmllczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgT2JqZWN0LnZhbHVlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmVudHJpZXM7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXknKS5lbnRyaWVzO1xuXG4vLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmVudHJpZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhPKSB7XG4gICAgcmV0dXJuICRlbnRyaWVzKE8pO1xuICB9XG59KTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uLCBzaGFkb3cgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IGxvZzIsIHJlYWRJbnQ4LCByZWFkVWludDE2LCByZWFkVWludDMyIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgQXJpdGhtZXRpY0RlY29kZXIgfSBmcm9tIFwiLi9hcml0aG1ldGljX2RlY29kZXIuanNcIjtcbmltcG9ydCB7IENDSVRURmF4RGVjb2RlciB9IGZyb20gXCIuL2NjaXR0LmpzXCI7XG5cbmNsYXNzIEpiaWcyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIoYEpCSUcyIGVycm9yOiAke21zZ31gKTtcbiAgfVxufVxuXG52YXIgSmJpZzJJbWFnZSA9IChmdW5jdGlvbiBKYmlnMkltYWdlQ2xvc3VyZSgpIHtcbiAgLy8gVXRpbGl0eSBkYXRhIHN0cnVjdHVyZXNcbiAgZnVuY3Rpb24gQ29udGV4dENhY2hlKCkge31cblxuICBDb250ZXh0Q2FjaGUucHJvdG90eXBlID0ge1xuICAgIGdldENvbnRleHRzKGlkKSB7XG4gICAgICBpZiAoaWQgaW4gdGhpcykge1xuICAgICAgICByZXR1cm4gdGhpc1tpZF07XG4gICAgICB9XG4gICAgICByZXR1cm4gKHRoaXNbaWRdID0gbmV3IEludDhBcnJheSgxIDw8IDE2KSk7XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuZW5kID0gZW5kO1xuICB9XG5cbiAgRGVjb2RpbmdDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBnZXQgZGVjb2RlcigpIHtcbiAgICAgIHZhciBkZWNvZGVyID0gbmV3IEFyaXRobWV0aWNEZWNvZGVyKHRoaXMuZGF0YSwgdGhpcy5zdGFydCwgdGhpcy5lbmQpO1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImRlY29kZXJcIiwgZGVjb2Rlcik7XG4gICAgfSxcbiAgICBnZXQgY29udGV4dENhY2hlKCkge1xuICAgICAgdmFyIGNhY2hlID0gbmV3IENvbnRleHRDYWNoZSgpO1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImNvbnRleHRDYWNoZVwiLCBjYWNoZSk7XG4gICAgfSxcbiAgfTtcblxuICAvLyBBbm5leCBBLiBBcml0aG1ldGljIEludGVnZXIgRGVjb2RpbmcgUHJvY2VkdXJlXG4gIC8vIEEuMiBQcm9jZWR1cmUgZm9yIGRlY29kaW5nIHZhbHVlc1xuICBmdW5jdGlvbiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgcHJvY2VkdXJlLCBkZWNvZGVyKSB7XG4gICAgdmFyIGNvbnRleHRzID0gY29udGV4dENhY2hlLmdldENvbnRleHRzKHByb2NlZHVyZSk7XG4gICAgdmFyIHByZXYgPSAxO1xuXG4gICAgZnVuY3Rpb24gcmVhZEJpdHMobGVuZ3RoKSB7XG4gICAgICB2YXIgdiA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpO1xuICAgICAgICBwcmV2ID1cbiAgICAgICAgICBwcmV2IDwgMjU2ID8gKHByZXYgPDwgMSkgfCBiaXQgOiAoKChwcmV2IDw8IDEpIHwgYml0KSAmIDUxMSkgfCAyNTY7XG4gICAgICAgIHYgPSAodiA8PCAxKSB8IGJpdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ID4+PiAwO1xuICAgIH1cblxuICAgIHZhciBzaWduID0gcmVhZEJpdHMoMSk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbiAgICB2YXIgdmFsdWUgPSByZWFkQml0cygxKSA/XG4gICAgICAgICAgICAgICAgICAocmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgICAocmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgICAgIChyZWFkQml0cygxKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAocmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZEJpdHMoMzIpICsgNDQzNikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpdHMoMTIpICsgMzQwKSA6XG4gICAgICAgICAgICAgICAgICAgICAgcmVhZEJpdHMoOCkgKyA4NCkgOlxuICAgICAgICAgICAgICAgICAgICByZWFkQml0cyg2KSArIDIwKSA6XG4gICAgICAgICAgICAgICAgICByZWFkQml0cyg0KSArIDQpIDpcbiAgICAgICAgICAgICAgICByZWFkQml0cygyKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4gICAgaWYgKHNpZ24gPT09IDApIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID4gMCkge1xuICAgICAgcmV0dXJuIC12YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBLjMgVGhlIElBSUQgZGVjb2RpbmcgcHJvY2VkdXJlXG4gIGZ1bmN0aW9uIGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBjb2RlTGVuZ3RoKSB7XG4gICAgdmFyIGNvbnRleHRzID0gY29udGV4dENhY2hlLmdldENvbnRleHRzKFwiSUFJRFwiKTtcblxuICAgIHZhciBwcmV2ID0gMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGJpdCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHJldik7XG4gICAgICBwcmV2ID0gKHByZXYgPDwgMSkgfCBiaXQ7XG4gICAgfVxuICAgIGlmIChjb2RlTGVuZ3RoIDwgMzEpIHtcbiAgICAgIHJldHVybiBwcmV2ICYgKCgxIDw8IGNvZGVMZW5ndGgpIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBwcmV2ICYgMHg3ZmZmZmZmZjtcbiAgfVxuXG4gIC8vIDcuMyBTZWdtZW50IHR5cGVzXG4gIHZhciBTZWdtZW50VHlwZXMgPSBbXG4gICAgXCJTeW1ib2xEaWN0aW9uYXJ5XCIsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgXCJJbnRlcm1lZGlhdGVUZXh0UmVnaW9uXCIsXG4gICAgbnVsbCxcbiAgICBcIkltbWVkaWF0ZVRleHRSZWdpb25cIixcbiAgICBcIkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBcIlBhdHRlcm5EaWN0aW9uYXJ5XCIsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgXCJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgXCJJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvblwiLFxuICAgIFwiSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIFwiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgXCJJbW1lZGlhdGVHZW5lcmljUmVnaW9uXCIsXG4gICAgXCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb25cIixcbiAgICBcIkludGVybWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uXCIsXG4gICAgbnVsbCxcbiAgICBcIkltbWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uXCIsXG4gICAgXCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWZpbmVtZW50UmVnaW9uXCIsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBcIlBhZ2VJbmZvcm1hdGlvblwiLFxuICAgIFwiRW5kT2ZQYWdlXCIsXG4gICAgXCJFbmRPZlN0cmlwZVwiLFxuICAgIFwiRW5kT2ZGaWxlXCIsXG4gICAgXCJQcm9maWxlc1wiLFxuICAgIFwiVGFibGVzXCIsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIFwiRXh0ZW5zaW9uXCIsXG4gIF07XG5cbiAgdmFyIENvZGluZ1RlbXBsYXRlcyA9IFtcbiAgICBbXG4gICAgICB7IHg6IC0xLCB5OiAtMiB9LFxuICAgICAgeyB4OiAwLCB5OiAtMiB9LFxuICAgICAgeyB4OiAxLCB5OiAtMiB9LFxuICAgICAgeyB4OiAtMiwgeTogLTEgfSxcbiAgICAgIHsgeDogLTEsIHk6IC0xIH0sXG4gICAgICB7IHg6IDAsIHk6IC0xIH0sXG4gICAgICB7IHg6IDEsIHk6IC0xIH0sXG4gICAgICB7IHg6IDIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC00LCB5OiAwIH0sXG4gICAgICB7IHg6IC0zLCB5OiAwIH0sXG4gICAgICB7IHg6IC0yLCB5OiAwIH0sXG4gICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgXSxcbiAgICBbXG4gICAgICB7IHg6IC0xLCB5OiAtMiB9LFxuICAgICAgeyB4OiAwLCB5OiAtMiB9LFxuICAgICAgeyB4OiAxLCB5OiAtMiB9LFxuICAgICAgeyB4OiAyLCB5OiAtMiB9LFxuICAgICAgeyB4OiAtMiwgeTogLTEgfSxcbiAgICAgIHsgeDogLTEsIHk6IC0xIH0sXG4gICAgICB7IHg6IDAsIHk6IC0xIH0sXG4gICAgICB7IHg6IDEsIHk6IC0xIH0sXG4gICAgICB7IHg6IDIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0zLCB5OiAwIH0sXG4gICAgICB7IHg6IC0yLCB5OiAwIH0sXG4gICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgXSxcbiAgICBbXG4gICAgICB7IHg6IC0xLCB5OiAtMiB9LFxuICAgICAgeyB4OiAwLCB5OiAtMiB9LFxuICAgICAgeyB4OiAxLCB5OiAtMiB9LFxuICAgICAgeyB4OiAtMiwgeTogLTEgfSxcbiAgICAgIHsgeDogLTEsIHk6IC0xIH0sXG4gICAgICB7IHg6IDAsIHk6IC0xIH0sXG4gICAgICB7IHg6IDEsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0yLCB5OiAwIH0sXG4gICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgXSxcbiAgICBbXG4gICAgICB7IHg6IC0zLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtMiwgeTogLTEgfSxcbiAgICAgIHsgeDogLTEsIHk6IC0xIH0sXG4gICAgICB7IHg6IDAsIHk6IC0xIH0sXG4gICAgICB7IHg6IDEsIHk6IC0xIH0sXG4gICAgICB7IHg6IC00LCB5OiAwIH0sXG4gICAgICB7IHg6IC0zLCB5OiAwIH0sXG4gICAgICB7IHg6IC0yLCB5OiAwIH0sXG4gICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgXSxcbiAgXTtcblxuICB2YXIgUmVmaW5lbWVudFRlbXBsYXRlcyA9IFtcbiAgICB7XG4gICAgICBjb2Rpbmc6IFtcbiAgICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IDEsIHk6IC0xIH0sXG4gICAgICAgIHsgeDogLTEsIHk6IDAgfSxcbiAgICAgIF0sXG4gICAgICByZWZlcmVuY2U6IFtcbiAgICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IDEsIHk6IC0xIH0sXG4gICAgICAgIHsgeDogLTEsIHk6IDAgfSxcbiAgICAgICAgeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMSwgeTogMCB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAxIH0sXG4gICAgICAgIHsgeDogMCwgeTogMSB9LFxuICAgICAgICB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBjb2Rpbmc6IFtcbiAgICAgICAgeyB4OiAtMSwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IDEsIHk6IC0xIH0sXG4gICAgICAgIHsgeDogLTEsIHk6IDAgfSxcbiAgICAgIF0sXG4gICAgICByZWZlcmVuY2U6IFtcbiAgICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMCwgeTogMCB9LFxuICAgICAgICB7IHg6IDEsIHk6IDAgfSxcbiAgICAgICAgeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgIHsgeDogMSwgeTogMSB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdO1xuXG4gIC8vIFNlZSA2LjIuNS43IERlY29kaW5nIHRoZSBiaXRtYXAuXG4gIHZhciBSZXVzZWRDb250ZXh0cyA9IFtcbiAgICAweDliMjUsIC8vIDEwMDExIDAxMTAwMTAgMDEwMVxuICAgIDB4MDc5NSwgLy8gMDAxMSAxMTAwMTAgMTAxXG4gICAgMHgwMGU1LCAvLyAwMDEgMTEwMDEgMDFcbiAgICAweDAxOTUsIC8vIDAxMTAwMSAwMTAxXG4gIF07XG5cbiAgdmFyIFJlZmluZW1lbnRSZXVzZWRDb250ZXh0cyA9IFtcbiAgICAweDAwMjAsIC8vICcwMDAnICsgJzAnIChjb2RpbmcpICsgJzAwMDEwMDAwJyArICcwJyAocmVmZXJlbmNlKVxuICAgIDB4MDAwOCwgLy8gJzAwMDAnICsgJzAwMTAwMCdcbiAgXTtcblxuICBmdW5jdGlvbiBkZWNvZGVCaXRtYXBUZW1wbGF0ZTAod2lkdGgsIGhlaWdodCwgZGVjb2RpbmdDb250ZXh0KSB7XG4gICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjtcbiAgICB2YXIgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKFwiR0JcIik7XG4gICAgdmFyIGNvbnRleHRMYWJlbCxcbiAgICAgIGksXG4gICAgICBqLFxuICAgICAgcGl4ZWwsXG4gICAgICByb3csXG4gICAgICByb3cxLFxuICAgICAgcm93MixcbiAgICAgIGJpdG1hcCA9IFtdO1xuXG4gICAgLy8gLi4ub29vb28uLi4uXG4gICAgLy8gLi5vb29vb29vLi4uIENvbnRleHQgdGVtcGxhdGUgZm9yIGN1cnJlbnQgcGl4ZWwgKFgpXG4gICAgLy8gLm9vb29YLi4uLi4uIChjb25jYXRlbmF0ZSB2YWx1ZXMgb2YgJ28nLXBpeGVscyB0byBnZXQgY29udGV4dExhYmVsKVxuICAgIHZhciBPTERfUElYRUxfTUFTSyA9IDB4N2JmNzsgLy8gMDExMTEgMDExMTExMSAwMTExXG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgIHJvdyA9IGJpdG1hcFtpXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICAgIHJvdzEgPSBpIDwgMSA/IHJvdyA6IGJpdG1hcFtpIC0gMV07XG4gICAgICByb3cyID0gaSA8IDIgPyByb3cgOiBiaXRtYXBbaSAtIDJdO1xuXG4gICAgICAvLyBBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcm93OlxuICAgICAgLy8gRmlsbCBjb250ZXh0TGFiZWwgd2l0aCBwaXhlbHMgdGhhdCBhcmUgYWJvdmUvcmlnaHQgb2YgKFgpXG4gICAgICBjb250ZXh0TGFiZWwgPVxuICAgICAgICAocm93MlswXSA8PCAxMykgfFxuICAgICAgICAocm93MlsxXSA8PCAxMikgfFxuICAgICAgICAocm93MlsyXSA8PCAxMSkgfFxuICAgICAgICAocm93MVswXSA8PCA3KSB8XG4gICAgICAgIChyb3cxWzFdIDw8IDYpIHxcbiAgICAgICAgKHJvdzFbMl0gPDwgNSkgfFxuICAgICAgICAocm93MVszXSA8PCA0KTtcblxuICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgcm93W2pdID0gcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG5cbiAgICAgICAgLy8gQXQgZWFjaCBwaXhlbDogQ2xlYXIgY29udGV4dExhYmVsIHBpeGVscyB0aGF0IGFyZSBzaGlmdGVkXG4gICAgICAgIC8vIG91dCBvZiB0aGUgY29udGV4dCwgdGhlbiBhZGQgbmV3IG9uZXMuXG4gICAgICAgIGNvbnRleHRMYWJlbCA9XG4gICAgICAgICAgKChjb250ZXh0TGFiZWwgJiBPTERfUElYRUxfTUFTSykgPDwgMSkgfFxuICAgICAgICAgIChqICsgMyA8IHdpZHRoID8gcm93MltqICsgM10gPDwgMTEgOiAwKSB8XG4gICAgICAgICAgKGogKyA0IDwgd2lkdGggPyByb3cxW2ogKyA0XSA8PCA0IDogMCkgfFxuICAgICAgICAgIHBpeGVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICAvLyA2LjIgR2VuZXJpYyBSZWdpb24gRGVjb2RpbmcgUHJvY2VkdXJlXG4gIGZ1bmN0aW9uIGRlY29kZUJpdG1hcChcbiAgICBtbXIsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHRlbXBsYXRlSW5kZXgsXG4gICAgcHJlZGljdGlvbixcbiAgICBza2lwLFxuICAgIGF0LFxuICAgIGRlY29kaW5nQ29udGV4dFxuICApIHtcbiAgICBpZiAobW1yKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IG5ldyBSZWFkZXIoXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5kYXRhLFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuc3RhcnQsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5lbmRcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVjb2RlTU1SQml0bWFwKGlucHV0LCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gVXNlIG9wdGltaXplZCB2ZXJzaW9uIGZvciB0aGUgbW9zdCBjb21tb24gY2FzZVxuICAgIGlmIChcbiAgICAgIHRlbXBsYXRlSW5kZXggPT09IDAgJiZcbiAgICAgICFza2lwICYmXG4gICAgICAhcHJlZGljdGlvbiAmJlxuICAgICAgYXQubGVuZ3RoID09PSA0ICYmXG4gICAgICBhdFswXS54ID09PSAzICYmXG4gICAgICBhdFswXS55ID09PSAtMSAmJlxuICAgICAgYXRbMV0ueCA9PT0gLTMgJiZcbiAgICAgIGF0WzFdLnkgPT09IC0xICYmXG4gICAgICBhdFsyXS54ID09PSAyICYmXG4gICAgICBhdFsyXS55ID09PSAtMiAmJlxuICAgICAgYXRbM10ueCA9PT0gLTIgJiZcbiAgICAgIGF0WzNdLnkgPT09IC0yXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIHVzZXNraXAgPSAhIXNraXA7XG4gICAgdmFyIHRlbXBsYXRlID0gQ29kaW5nVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvbmNhdChhdCk7XG5cbiAgICAvLyBTb3J0aW5nIGlzIG5vbi1zdGFuZGFyZCwgYW5kIGl0IGlzIG5vdCByZXF1aXJlZC4gQnV0IHNvcnRpbmcgaW5jcmVhc2VzXG4gICAgLy8gdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBiaXRzIHRoYXQgY2FuIGJlIHJldXNlZCBmcm9tIHRoZSBwcmV2aW91c1xuICAgIC8vIGNvbnRleHRMYWJlbCBpbiB0aGUgbWFpbiBsb29wLlxuICAgIHRlbXBsYXRlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnkgLSBiLnkgfHwgYS54IC0gYi54O1xuICAgIH0pO1xuXG4gICAgdmFyIHRlbXBsYXRlTGVuZ3RoID0gdGVtcGxhdGUubGVuZ3RoO1xuICAgIHZhciB0ZW1wbGF0ZVggPSBuZXcgSW50OEFycmF5KHRlbXBsYXRlTGVuZ3RoKTtcbiAgICB2YXIgdGVtcGxhdGVZID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7XG4gICAgdmFyIGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzID0gW107XG4gICAgdmFyIHJldXNlTWFzayA9IDAsXG4gICAgICBtaW5YID0gMCxcbiAgICAgIG1heFggPSAwLFxuICAgICAgbWluWSA9IDA7XG4gICAgdmFyIGMsIGs7XG5cbiAgICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKykge1xuICAgICAgdGVtcGxhdGVYW2tdID0gdGVtcGxhdGVba10ueDtcbiAgICAgIHRlbXBsYXRlWVtrXSA9IHRlbXBsYXRlW2tdLnk7XG4gICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgdGVtcGxhdGVba10ueCk7XG4gICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgdGVtcGxhdGVba10ueCk7XG4gICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgdGVtcGxhdGVba10ueSk7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGVtcGxhdGUgcGl4ZWwgYXBwZWFycyBpbiB0d28gY29uc2VjdXRpdmUgY29udGV4dCBsYWJlbHMsXG4gICAgICAvLyBzbyBpdCBjYW4gYmUgcmV1c2VkLiBPdGhlcndpc2UsIHdlIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBjaGFuZ2luZ1xuICAgICAgLy8gdGVtcGxhdGUgZW50cmllcy5cbiAgICAgIGlmIChcbiAgICAgICAgayA8IHRlbXBsYXRlTGVuZ3RoIC0gMSAmJlxuICAgICAgICB0ZW1wbGF0ZVtrXS55ID09PSB0ZW1wbGF0ZVtrICsgMV0ueSAmJlxuICAgICAgICB0ZW1wbGF0ZVtrXS54ID09PSB0ZW1wbGF0ZVtrICsgMV0ueCAtIDFcbiAgICAgICkge1xuICAgICAgICByZXVzZU1hc2sgfD0gMSA8PCAodGVtcGxhdGVMZW5ndGggLSAxIC0gayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcy5wdXNoKGspO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMubGVuZ3RoO1xuXG4gICAgdmFyIGNoYW5naW5nVGVtcGxhdGVYID0gbmV3IEludDhBcnJheShjaGFuZ2luZ0VudHJpZXNMZW5ndGgpO1xuICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTtcbiAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZUJpdCA9IG5ldyBVaW50MTZBcnJheShjaGFuZ2luZ0VudHJpZXNMZW5ndGgpO1xuICAgIGZvciAoYyA9IDA7IGMgPCBjaGFuZ2luZ0VudHJpZXNMZW5ndGg7IGMrKykge1xuICAgICAgayA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzW2NdO1xuICAgICAgY2hhbmdpbmdUZW1wbGF0ZVhbY10gPSB0ZW1wbGF0ZVtrXS54O1xuICAgICAgY2hhbmdpbmdUZW1wbGF0ZVlbY10gPSB0ZW1wbGF0ZVtrXS55O1xuICAgICAgY2hhbmdpbmdUZW1wbGF0ZUJpdFtjXSA9IDEgPDwgKHRlbXBsYXRlTGVuZ3RoIC0gMSAtIGspO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgc2FmZSBib3VuZGluZyBib3ggZWRnZXMgZnJvbSB0aGUgd2lkdGgsIGhlaWdodCwgbWluWCwgbWF4WCwgbWluWVxuICAgIHZhciBzYmJfbGVmdCA9IC1taW5YO1xuICAgIHZhciBzYmJfdG9wID0gLW1pblk7XG4gICAgdmFyIHNiYl9yaWdodCA9IHdpZHRoIC0gbWF4WDtcblxuICAgIHZhciBwc2V1ZG9QaXhlbENvbnRleHQgPSBSZXVzZWRDb250ZXh0c1t0ZW1wbGF0ZUluZGV4XTtcbiAgICB2YXIgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgIHZhciBiaXRtYXAgPSBbXTtcblxuICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7XG4gICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhcIkdCXCIpO1xuXG4gICAgdmFyIGx0cCA9IDAsXG4gICAgICBqLFxuICAgICAgaTAsXG4gICAgICBqMCxcbiAgICAgIGNvbnRleHRMYWJlbCA9IDAsXG4gICAgICBiaXQsXG4gICAgICBzaGlmdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICBpZiAocHJlZGljdGlvbikge1xuICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTtcbiAgICAgICAgbHRwIF49IHNsdHA7XG4gICAgICAgIGlmIChsdHApIHtcbiAgICAgICAgICBiaXRtYXAucHVzaChyb3cpOyAvLyBkdXBsaWNhdGUgcHJldmlvdXMgcm93XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHJvdyk7XG4gICAgICBiaXRtYXAucHVzaChyb3cpO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgaWYgKHVzZXNraXAgJiYgc2tpcFtpXVtqXSkge1xuICAgICAgICAgIHJvd1tqXSA9IDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJlIHdlIGluIHRoZSBtaWRkbGUgb2YgYSBzY2FubGluZSwgc28gd2UgY2FuIHJldXNlIGNvbnRleHRMYWJlbFxuICAgICAgICAvLyBiaXRzP1xuICAgICAgICBpZiAoaiA+PSBzYmJfbGVmdCAmJiBqIDwgc2JiX3JpZ2h0ICYmIGkgPj0gc2JiX3RvcCkge1xuICAgICAgICAgIC8vIElmIHllcywgd2UgY2FuIGp1c3Qgc2hpZnQgdGhlIGJpdHMgdGhhdCBhcmUgcmV1c2FibGUgYW5kIG9ubHlcbiAgICAgICAgICAvLyBmZXRjaCB0aGUgcmVtYWluaW5nIG9uZXMuXG4gICAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCA8PCAxKSAmIHJldXNlTWFzaztcbiAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGkwID0gaSArIGNoYW5naW5nVGVtcGxhdGVZW2tdO1xuICAgICAgICAgICAgajAgPSBqICsgY2hhbmdpbmdUZW1wbGF0ZVhba107XG4gICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgYml0ID0gY2hhbmdpbmdUZW1wbGF0ZUJpdFtrXTtcbiAgICAgICAgICAgICAgY29udGV4dExhYmVsIHw9IGJpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29tcHV0ZSB0aGUgY29udGV4dExhYmVsIGZyb20gc2NyYXRjaFxuICAgICAgICAgIGNvbnRleHRMYWJlbCA9IDA7XG4gICAgICAgICAgc2hpZnQgPSB0ZW1wbGF0ZUxlbmd0aCAtIDE7XG4gICAgICAgICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyssIHNoaWZ0LS0pIHtcbiAgICAgICAgICAgIGowID0gaiArIHRlbXBsYXRlWFtrXTtcbiAgICAgICAgICAgIGlmIChqMCA+PSAwICYmIGowIDwgd2lkdGgpIHtcbiAgICAgICAgICAgICAgaTAgPSBpICsgdGVtcGxhdGVZW2tdO1xuICAgICAgICAgICAgICBpZiAoaTAgPj0gMCkge1xuICAgICAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdO1xuICAgICAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQgPDwgc2hpZnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBwaXhlbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgcm93W2pdID0gcGl4ZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICAvLyA2LjMuMiBHZW5lcmljIFJlZmluZW1lbnQgUmVnaW9uIERlY29kaW5nIFByb2NlZHVyZVxuICBmdW5jdGlvbiBkZWNvZGVSZWZpbmVtZW50KFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB0ZW1wbGF0ZUluZGV4LFxuICAgIHJlZmVyZW5jZUJpdG1hcCxcbiAgICBvZmZzZXRYLFxuICAgIG9mZnNldFksXG4gICAgcHJlZGljdGlvbixcbiAgICBhdCxcbiAgICBkZWNvZGluZ0NvbnRleHRcbiAgKSB7XG4gICAgdmFyIGNvZGluZ1RlbXBsYXRlID0gUmVmaW5lbWVudFRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5jb2Rpbmc7XG4gICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHtcbiAgICAgIGNvZGluZ1RlbXBsYXRlID0gY29kaW5nVGVtcGxhdGUuY29uY2F0KFthdFswXV0pO1xuICAgIH1cbiAgICB2YXIgY29kaW5nVGVtcGxhdGVMZW5ndGggPSBjb2RpbmdUZW1wbGF0ZS5sZW5ndGg7XG4gICAgdmFyIGNvZGluZ1RlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTtcbiAgICB2YXIgY29kaW5nVGVtcGxhdGVZID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpO1xuICAgIHZhciBrO1xuICAgIGZvciAoayA9IDA7IGsgPCBjb2RpbmdUZW1wbGF0ZUxlbmd0aDsgaysrKSB7XG4gICAgICBjb2RpbmdUZW1wbGF0ZVhba10gPSBjb2RpbmdUZW1wbGF0ZVtrXS54O1xuICAgICAgY29kaW5nVGVtcGxhdGVZW2tdID0gY29kaW5nVGVtcGxhdGVba10ueTtcbiAgICB9XG5cbiAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGUgPSBSZWZpbmVtZW50VGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLnJlZmVyZW5jZTtcbiAgICBpZiAodGVtcGxhdGVJbmRleCA9PT0gMCkge1xuICAgICAgcmVmZXJlbmNlVGVtcGxhdGUgPSByZWZlcmVuY2VUZW1wbGF0ZS5jb25jYXQoW2F0WzFdXSk7XG4gICAgfVxuICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCA9IHJlZmVyZW5jZVRlbXBsYXRlLmxlbmd0aDtcbiAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpO1xuICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZVkgPSBuZXcgSW50MzJBcnJheShyZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCk7XG4gICAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHtcbiAgICAgIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLng7XG4gICAgICByZWZlcmVuY2VUZW1wbGF0ZVlba10gPSByZWZlcmVuY2VUZW1wbGF0ZVtrXS55O1xuICAgIH1cbiAgICB2YXIgcmVmZXJlbmNlV2lkdGggPSByZWZlcmVuY2VCaXRtYXBbMF0ubGVuZ3RoO1xuICAgIHZhciByZWZlcmVuY2VIZWlnaHQgPSByZWZlcmVuY2VCaXRtYXAubGVuZ3RoO1xuXG4gICAgdmFyIHBzZXVkb1BpeGVsQ29udGV4dCA9IFJlZmluZW1lbnRSZXVzZWRDb250ZXh0c1t0ZW1wbGF0ZUluZGV4XTtcbiAgICB2YXIgYml0bWFwID0gW107XG5cbiAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyO1xuICAgIHZhciBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoXCJHUlwiKTtcblxuICAgIHZhciBsdHAgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgIGlmIChwcmVkaWN0aW9uKSB7XG4gICAgICAgIHZhciBzbHRwID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwc2V1ZG9QaXhlbENvbnRleHQpO1xuICAgICAgICBsdHAgXj0gc2x0cDtcbiAgICAgICAgaWYgKGx0cCkge1xuICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwicHJlZGljdGlvbiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICB2YXIgaTAsIGowO1xuICAgICAgICB2YXIgY29udGV4dExhYmVsID0gMDtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGNvZGluZ1RlbXBsYXRlTGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICBpMCA9IGkgKyBjb2RpbmdUZW1wbGF0ZVlba107XG4gICAgICAgICAgajAgPSBqICsgY29kaW5nVGVtcGxhdGVYW2tdO1xuICAgICAgICAgIGlmIChpMCA8IDAgfHwgajAgPCAwIHx8IGowID49IHdpZHRoKSB7XG4gICAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7IC8vIG91dCBvZiBib3VuZCBwaXhlbFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZXh0TGFiZWwgPSAoY29udGV4dExhYmVsIDw8IDEpIHwgYml0bWFwW2kwXVtqMF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgaTAgPSBpICsgcmVmZXJlbmNlVGVtcGxhdGVZW2tdIC0gb2Zmc2V0WTtcbiAgICAgICAgICBqMCA9IGogKyByZWZlcmVuY2VUZW1wbGF0ZVhba10gLSBvZmZzZXRYO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGkwIDwgMCB8fFxuICAgICAgICAgICAgaTAgPj0gcmVmZXJlbmNlSGVpZ2h0IHx8XG4gICAgICAgICAgICBqMCA8IDAgfHxcbiAgICAgICAgICAgIGowID49IHJlZmVyZW5jZVdpZHRoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7IC8vIG91dCBvZiBib3VuZCBwaXhlbFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZXh0TGFiZWwgPSAoY29udGV4dExhYmVsIDw8IDEpIHwgcmVmZXJlbmNlQml0bWFwW2kwXVtqMF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBwaXhlbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgcm93W2pdID0gcGl4ZWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJpdG1hcDtcbiAgfVxuXG4gIC8vIDYuNS41IERlY29kaW5nIHRoZSBzeW1ib2wgZGljdGlvbmFyeVxuICBmdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KFxuICAgIGh1ZmZtYW4sXG4gICAgcmVmaW5lbWVudCxcbiAgICBzeW1ib2xzLFxuICAgIG51bWJlck9mTmV3U3ltYm9scyxcbiAgICBudW1iZXJPZkV4cG9ydGVkU3ltYm9scyxcbiAgICBodWZmbWFuVGFibGVzLFxuICAgIHRlbXBsYXRlSW5kZXgsXG4gICAgYXQsXG4gICAgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsXG4gICAgcmVmaW5lbWVudEF0LFxuICAgIGRlY29kaW5nQ29udGV4dCxcbiAgICBodWZmbWFuSW5wdXRcbiAgKSB7XG4gICAgaWYgKGh1ZmZtYW4gJiYgcmVmaW5lbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgbmV3U3ltYm9scyA9IFtdO1xuICAgIHZhciBjdXJyZW50SGVpZ2h0ID0gMDtcbiAgICB2YXIgc3ltYm9sQ29kZUxlbmd0aCA9IGxvZzIoc3ltYm9scy5sZW5ndGggKyBudW1iZXJPZk5ld1N5bWJvbHMpO1xuXG4gICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjtcbiAgICB2YXIgY29udGV4dENhY2hlID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZTtcbiAgICBsZXQgdGFibGVCMSwgc3ltYm9sV2lkdGhzO1xuICAgIGlmIChodWZmbWFuKSB7XG4gICAgICB0YWJsZUIxID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsgLy8gc3RhbmRhcmQgdGFibGUgQi4xXG4gICAgICBzeW1ib2xXaWR0aHMgPSBbXTtcbiAgICAgIHN5bWJvbENvZGVMZW5ndGggPSBNYXRoLm1heChzeW1ib2xDb2RlTGVuZ3RoLCAxKTsgLy8gNi41LjguMi4zXG4gICAgfVxuXG4gICAgd2hpbGUgKG5ld1N5bWJvbHMubGVuZ3RoIDwgbnVtYmVyT2ZOZXdTeW1ib2xzKSB7XG4gICAgICB2YXIgZGVsdGFIZWlnaHQgPSBodWZmbWFuXG4gICAgICAgID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhSGVpZ2h0LmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFESFwiLCBkZWNvZGVyKTsgLy8gNi41LjZcbiAgICAgIGN1cnJlbnRIZWlnaHQgKz0gZGVsdGFIZWlnaHQ7XG4gICAgICBsZXQgY3VycmVudFdpZHRoID0gMCxcbiAgICAgICAgdG90YWxXaWR0aCA9IDA7XG4gICAgICBjb25zdCBmaXJzdFN5bWJvbCA9IGh1ZmZtYW4gPyBzeW1ib2xXaWR0aHMubGVuZ3RoIDogMDtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWx0YVdpZHRoID0gaHVmZm1hblxuICAgICAgICAgID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhV2lkdGguZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgICA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBRFdcIiwgZGVjb2Rlcik7IC8vIDYuNS43XG4gICAgICAgIGlmIChkZWx0YVdpZHRoID09PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7IC8vIE9PQlxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRXaWR0aCArPSBkZWx0YVdpZHRoO1xuICAgICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRXaWR0aDtcbiAgICAgICAgdmFyIGJpdG1hcDtcbiAgICAgICAgaWYgKHJlZmluZW1lbnQpIHtcbiAgICAgICAgICAvLyA2LjUuOC4yIFJlZmluZW1lbnQvYWdncmVnYXRlLWNvZGVkIHN5bWJvbCBiaXRtYXBcbiAgICAgICAgICB2YXIgbnVtYmVyT2ZJbnN0YW5jZXMgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQUFJXCIsIGRlY29kZXIpO1xuICAgICAgICAgIGlmIChudW1iZXJPZkluc3RhbmNlcyA+IDEpIHtcbiAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24oXG4gICAgICAgICAgICAgIGh1ZmZtYW4sXG4gICAgICAgICAgICAgIHJlZmluZW1lbnQsXG4gICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCxcbiAgICAgICAgICAgICAgY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgbnVtYmVyT2ZJbnN0YW5jZXMsXG4gICAgICAgICAgICAgIDEsIC8vIHN0cmlwIHNpemVcbiAgICAgICAgICAgICAgc3ltYm9scy5jb25jYXQobmV3U3ltYm9scyksXG4gICAgICAgICAgICAgIHN5bWJvbENvZGVMZW5ndGgsXG4gICAgICAgICAgICAgIDAsIC8vIHRyYW5zcG9zZWRcbiAgICAgICAgICAgICAgMCwgLy8gZHMgb2Zmc2V0XG4gICAgICAgICAgICAgIDEsIC8vIHRvcCBsZWZ0IDcuNC4zLjEuMVxuICAgICAgICAgICAgICAwLCAvLyBPUiBvcGVyYXRvclxuICAgICAgICAgICAgICBodWZmbWFuVGFibGVzLFxuICAgICAgICAgICAgICByZWZpbmVtZW50VGVtcGxhdGVJbmRleCxcbiAgICAgICAgICAgICAgcmVmaW5lbWVudEF0LFxuICAgICAgICAgICAgICBkZWNvZGluZ0NvbnRleHQsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIGh1ZmZtYW5JbnB1dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN5bWJvbElkID0gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBUkRYXCIsIGRlY29kZXIpOyAvLyA2LjQuMTEuM1xuICAgICAgICAgICAgdmFyIHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBUkRZXCIsIGRlY29kZXIpOyAvLyA2LjQuMTEuNFxuICAgICAgICAgICAgdmFyIHN5bWJvbCA9XG4gICAgICAgICAgICAgIHN5bWJvbElkIDwgc3ltYm9scy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHN5bWJvbHNbc3ltYm9sSWRdXG4gICAgICAgICAgICAgICAgOiBuZXdTeW1ib2xzW3N5bWJvbElkIC0gc3ltYm9scy5sZW5ndGhdO1xuICAgICAgICAgICAgYml0bWFwID0gZGVjb2RlUmVmaW5lbWVudChcbiAgICAgICAgICAgICAgY3VycmVudFdpZHRoLFxuICAgICAgICAgICAgICBjdXJyZW50SGVpZ2h0LFxuICAgICAgICAgICAgICByZWZpbmVtZW50VGVtcGxhdGVJbmRleCxcbiAgICAgICAgICAgICAgc3ltYm9sLFxuICAgICAgICAgICAgICByZHgsXG4gICAgICAgICAgICAgIHJkeSxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIHJlZmluZW1lbnRBdCxcbiAgICAgICAgICAgICAgZGVjb2RpbmdDb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTtcbiAgICAgICAgfSBlbHNlIGlmIChodWZmbWFuKSB7XG4gICAgICAgICAgLy8gU3RvcmUgb25seSBzeW1ib2wgd2lkdGggYW5kIGRlY29kZSBhIGNvbGxlY3RpdmUgYml0bWFwIHdoZW4gdGhlXG4gICAgICAgICAgLy8gaGVpZ2h0IGNsYXNzIGlzIGRvbmUuXG4gICAgICAgICAgc3ltYm9sV2lkdGhzLnB1c2goY3VycmVudFdpZHRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyA2LjUuOC4xIERpcmVjdC1jb2RlZCBzeW1ib2wgYml0bWFwXG4gICAgICAgICAgYml0bWFwID0gZGVjb2RlQml0bWFwKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBjdXJyZW50V2lkdGgsXG4gICAgICAgICAgICBjdXJyZW50SGVpZ2h0LFxuICAgICAgICAgICAgdGVtcGxhdGVJbmRleCxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGF0LFxuICAgICAgICAgICAgZGVjb2RpbmdDb250ZXh0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGh1ZmZtYW4gJiYgIXJlZmluZW1lbnQpIHtcbiAgICAgICAgLy8gNi41LjkgSGVpZ2h0IGNsYXNzIGNvbGxlY3RpdmUgYml0bWFwXG4gICAgICAgIGNvbnN0IGJpdG1hcFNpemUgPSBodWZmbWFuVGFibGVzLnRhYmxlQml0bWFwU2l6ZS5kZWNvZGUoaHVmZm1hbklucHV0KTtcbiAgICAgICAgaHVmZm1hbklucHV0LmJ5dGVBbGlnbigpO1xuICAgICAgICBsZXQgY29sbGVjdGl2ZUJpdG1hcDtcbiAgICAgICAgaWYgKGJpdG1hcFNpemUgPT09IDApIHtcbiAgICAgICAgICAvLyBVbmNvbXByZXNzZWQgY29sbGVjdGl2ZSBiaXRtYXBcbiAgICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChcbiAgICAgICAgICAgIGh1ZmZtYW5JbnB1dCxcbiAgICAgICAgICAgIHRvdGFsV2lkdGgsXG4gICAgICAgICAgICBjdXJyZW50SGVpZ2h0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNTVIgY29sbGVjdGl2ZSBiaXRtYXBcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IGh1ZmZtYW5JbnB1dC5lbmQ7XG4gICAgICAgICAgY29uc3QgYml0bWFwRW5kID0gaHVmZm1hbklucHV0LnBvc2l0aW9uICsgYml0bWFwU2l6ZTtcbiAgICAgICAgICBodWZmbWFuSW5wdXQuZW5kID0gYml0bWFwRW5kO1xuICAgICAgICAgIGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAoXG4gICAgICAgICAgICBodWZmbWFuSW5wdXQsXG4gICAgICAgICAgICB0b3RhbFdpZHRoLFxuICAgICAgICAgICAgY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBodWZmbWFuSW5wdXQuZW5kID0gb3JpZ2luYWxFbmQ7XG4gICAgICAgICAgaHVmZm1hbklucHV0LnBvc2l0aW9uID0gYml0bWFwRW5kO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bWJlck9mU3ltYm9sc0RlY29kZWQgPSBzeW1ib2xXaWR0aHMubGVuZ3RoO1xuICAgICAgICBpZiAoZmlyc3RTeW1ib2wgPT09IG51bWJlck9mU3ltYm9sc0RlY29kZWQgLSAxKSB7XG4gICAgICAgICAgLy8gY29sbGVjdGl2ZUJpdG1hcCBpcyBhIHNpbmdsZSBzeW1ib2wuXG4gICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGNvbGxlY3RpdmVCaXRtYXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERpdmlkZSBjb2xsZWN0aXZlQml0bWFwIGludG8gc3ltYm9scy5cbiAgICAgICAgICBsZXQgaSxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICB4TWluID0gMCxcbiAgICAgICAgICAgIHhNYXgsXG4gICAgICAgICAgICBiaXRtYXBXaWR0aCxcbiAgICAgICAgICAgIHN5bWJvbEJpdG1hcDtcbiAgICAgICAgICBmb3IgKGkgPSBmaXJzdFN5bWJvbDsgaSA8IG51bWJlck9mU3ltYm9sc0RlY29kZWQ7IGkrKykge1xuICAgICAgICAgICAgYml0bWFwV2lkdGggPSBzeW1ib2xXaWR0aHNbaV07XG4gICAgICAgICAgICB4TWF4ID0geE1pbiArIGJpdG1hcFdpZHRoO1xuICAgICAgICAgICAgc3ltYm9sQml0bWFwID0gW107XG4gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgY3VycmVudEhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICAgIHN5bWJvbEJpdG1hcC5wdXNoKGNvbGxlY3RpdmVCaXRtYXBbeV0uc3ViYXJyYXkoeE1pbiwgeE1heCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3U3ltYm9scy5wdXNoKHN5bWJvbEJpdG1hcCk7XG4gICAgICAgICAgICB4TWluID0geE1heDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA2LjUuMTAgRXhwb3J0ZWQgc3ltYm9sc1xuICAgIHZhciBleHBvcnRlZFN5bWJvbHMgPSBbXTtcbiAgICB2YXIgZmxhZ3MgPSBbXSxcbiAgICAgIGN1cnJlbnRGbGFnID0gZmFsc2U7XG4gICAgdmFyIHRvdGFsU3ltYm9sc0xlbmd0aCA9IHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzO1xuICAgIHdoaWxlIChmbGFncy5sZW5ndGggPCB0b3RhbFN5bWJvbHNMZW5ndGgpIHtcbiAgICAgIHZhciBydW5MZW5ndGggPSBodWZmbWFuXG4gICAgICAgID8gdGFibGVCMS5kZWNvZGUoaHVmZm1hbklucHV0KVxuICAgICAgICA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBRVhcIiwgZGVjb2Rlcik7XG4gICAgICB3aGlsZSAocnVuTGVuZ3RoLS0pIHtcbiAgICAgICAgZmxhZ3MucHVzaChjdXJyZW50RmxhZyk7XG4gICAgICB9XG4gICAgICBjdXJyZW50RmxhZyA9ICFjdXJyZW50RmxhZztcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3ltYm9scy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAoZmxhZ3NbaV0pIHtcbiAgICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2goc3ltYm9sc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtYmVyT2ZOZXdTeW1ib2xzOyBpKyssIGorKykge1xuICAgICAgaWYgKGZsYWdzW2ldKSB7XG4gICAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKG5ld1N5bWJvbHNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXhwb3J0ZWRTeW1ib2xzO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlVGV4dFJlZ2lvbihcbiAgICBodWZmbWFuLFxuICAgIHJlZmluZW1lbnQsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGRlZmF1bHRQaXhlbFZhbHVlLFxuICAgIG51bWJlck9mU3ltYm9sSW5zdGFuY2VzLFxuICAgIHN0cmlwU2l6ZSxcbiAgICBpbnB1dFN5bWJvbHMsXG4gICAgc3ltYm9sQ29kZUxlbmd0aCxcbiAgICB0cmFuc3Bvc2VkLFxuICAgIGRzT2Zmc2V0LFxuICAgIHJlZmVyZW5jZUNvcm5lcixcbiAgICBjb21iaW5hdGlvbk9wZXJhdG9yLFxuICAgIGh1ZmZtYW5UYWJsZXMsXG4gICAgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsXG4gICAgcmVmaW5lbWVudEF0LFxuICAgIGRlY29kaW5nQ29udGV4dCxcbiAgICBsb2dTdHJpcFNpemUsXG4gICAgaHVmZm1hbklucHV0XG4gICkge1xuICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIGJpdG1hcFxuICAgIHZhciBiaXRtYXAgPSBbXTtcbiAgICB2YXIgaSwgcm93O1xuICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgIHJvd1tqXSA9IGRlZmF1bHRQaXhlbFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiaXRtYXAucHVzaChyb3cpO1xuICAgIH1cblxuICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7XG4gICAgdmFyIGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7XG5cbiAgICB2YXIgc3RyaXBUID0gaHVmZm1hblxuICAgICAgPyAtaHVmZm1hblRhYmxlcy50YWJsZURlbHRhVC5kZWNvZGUoaHVmZm1hbklucHV0KVxuICAgICAgOiAtZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFEVFwiLCBkZWNvZGVyKTsgLy8gNi40LjZcbiAgICB2YXIgZmlyc3RTID0gMDtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IG51bWJlck9mU3ltYm9sSW5zdGFuY2VzKSB7XG4gICAgICB2YXIgZGVsdGFUID0gaHVmZm1hblxuICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQURUXCIsIGRlY29kZXIpOyAvLyA2LjQuNlxuICAgICAgc3RyaXBUICs9IGRlbHRhVDtcblxuICAgICAgdmFyIGRlbHRhRmlyc3RTID0gaHVmZm1hblxuICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVGaXJzdFMuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQUZTXCIsIGRlY29kZXIpOyAvLyA2LjQuN1xuICAgICAgZmlyc3RTICs9IGRlbHRhRmlyc3RTO1xuICAgICAgdmFyIGN1cnJlbnRTID0gZmlyc3RTO1xuICAgICAgZG8ge1xuICAgICAgICBsZXQgY3VycmVudFQgPSAwOyAvLyA2LjQuOVxuICAgICAgICBpZiAoc3RyaXBTaXplID4gMSkge1xuICAgICAgICAgIGN1cnJlbnRUID0gaHVmZm1hblxuICAgICAgICAgICAgPyBodWZmbWFuSW5wdXQucmVhZEJpdHMobG9nU3RyaXBTaXplKVxuICAgICAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQUlUXCIsIGRlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0ID0gc3RyaXBTaXplICogc3RyaXBUICsgY3VycmVudFQ7XG4gICAgICAgIHZhciBzeW1ib2xJZCA9IGh1ZmZtYW5cbiAgICAgICAgICA/IGh1ZmZtYW5UYWJsZXMuc3ltYm9sSURUYWJsZS5kZWNvZGUoaHVmZm1hbklucHV0KVxuICAgICAgICAgIDogZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpO1xuICAgICAgICB2YXIgYXBwbHlSZWZpbmVtZW50ID1cbiAgICAgICAgICByZWZpbmVtZW50ICYmXG4gICAgICAgICAgKGh1ZmZtYW5cbiAgICAgICAgICAgID8gaHVmZm1hbklucHV0LnJlYWRCaXQoKVxuICAgICAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJJXCIsIGRlY29kZXIpKTtcbiAgICAgICAgdmFyIHN5bWJvbEJpdG1hcCA9IGlucHV0U3ltYm9sc1tzeW1ib2xJZF07XG4gICAgICAgIHZhciBzeW1ib2xXaWR0aCA9IHN5bWJvbEJpdG1hcFswXS5sZW5ndGg7XG4gICAgICAgIHZhciBzeW1ib2xIZWlnaHQgPSBzeW1ib2xCaXRtYXAubGVuZ3RoO1xuICAgICAgICBpZiAoYXBwbHlSZWZpbmVtZW50KSB7XG4gICAgICAgICAgdmFyIHJkdyA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBUkRXXCIsIGRlY29kZXIpOyAvLyA2LjQuMTEuMVxuICAgICAgICAgIHZhciByZGggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJESFwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjJcbiAgICAgICAgICB2YXIgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFSRFhcIiwgZGVjb2Rlcik7IC8vIDYuNC4xMS4zXG4gICAgICAgICAgdmFyIHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBUkRZXCIsIGRlY29kZXIpOyAvLyA2LjQuMTEuNFxuICAgICAgICAgIHN5bWJvbFdpZHRoICs9IHJkdztcbiAgICAgICAgICBzeW1ib2xIZWlnaHQgKz0gcmRoO1xuICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoXG4gICAgICAgICAgICBzeW1ib2xXaWR0aCxcbiAgICAgICAgICAgIHN5bWJvbEhlaWdodCxcbiAgICAgICAgICAgIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LFxuICAgICAgICAgICAgc3ltYm9sQml0bWFwLFxuICAgICAgICAgICAgKHJkdyA+PiAxKSArIHJkeCxcbiAgICAgICAgICAgIChyZGggPj4gMSkgKyByZHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIHJlZmluZW1lbnRBdCxcbiAgICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9mZnNldFQgPSB0IC0gKHJlZmVyZW5jZUNvcm5lciAmIDEgPyAwIDogc3ltYm9sSGVpZ2h0IC0gMSk7XG4gICAgICAgIHZhciBvZmZzZXRTID0gY3VycmVudFMgLSAocmVmZXJlbmNlQ29ybmVyICYgMiA/IHN5bWJvbFdpZHRoIC0gMSA6IDApO1xuICAgICAgICB2YXIgczIsIHQyLCBzeW1ib2xSb3c7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkKSB7XG4gICAgICAgICAgLy8gUGxhY2UgU3ltYm9sIEJpdG1hcCBmcm9tIFQxLFMxXG4gICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sSGVpZ2h0OyBzMisrKSB7XG4gICAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0UyArIHMyXTtcbiAgICAgICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3MyXTtcbiAgICAgICAgICAgIC8vIFRvIGlnbm9yZSBQYXJ0cyBvZiBTeW1ib2wgYml0bWFwIHdoaWNoIGdvZXNcbiAgICAgICAgICAgIC8vIG91dHNpZGUgYml0bWFwIHJlZ2lvblxuICAgICAgICAgICAgdmFyIG1heFdpZHRoID0gTWF0aC5taW4od2lkdGggLSBvZmZzZXRULCBzeW1ib2xXaWR0aCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiAvLyBPUlxuICAgICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7XG4gICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSB8PSBzeW1ib2xSb3dbdDJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAyOiAvLyBYT1JcbiAgICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykge1xuICAgICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gXj0gc3ltYm9sUm93W3QyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbEhlaWdodCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgc3ltYm9sSGVpZ2h0OyB0MisrKSB7XG4gICAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0VCArIHQyXTtcbiAgICAgICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3QyXTtcbiAgICAgICAgICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikge1xuICAgICAgICAgICAgICBjYXNlIDA6IC8vIE9SXG4gICAgICAgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sV2lkdGg7IHMyKyspIHtcbiAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRTICsgczJdIHw9IHN5bWJvbFJvd1tzMl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDI6IC8vIFhPUlxuICAgICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7XG4gICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSBePSBzeW1ib2xSb3dbczJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFMgKz0gc3ltYm9sV2lkdGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICAgICAgdmFyIGRlbHRhUyA9IGh1ZmZtYW5cbiAgICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVMuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgICA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBRFNcIiwgZGVjb2Rlcik7IC8vIDYuNC44XG4gICAgICAgIGlmIChkZWx0YVMgPT09IG51bGwpIHtcbiAgICAgICAgICBicmVhazsgLy8gT09CXG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFMgKz0gZGVsdGFTICsgZHNPZmZzZXQ7XG4gICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpdG1hcDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KFxuICAgIG1tcixcbiAgICBwYXR0ZXJuV2lkdGgsXG4gICAgcGF0dGVybkhlaWdodCxcbiAgICBtYXhQYXR0ZXJuSW5kZXgsXG4gICAgdGVtcGxhdGUsXG4gICAgZGVjb2RpbmdDb250ZXh0XG4gICkge1xuICAgIGNvbnN0IGF0ID0gW107XG4gICAgaWYgKCFtbXIpIHtcbiAgICAgIGF0LnB1c2goe1xuICAgICAgICB4OiAtcGF0dGVybldpZHRoLFxuICAgICAgICB5OiAwLFxuICAgICAgfSk7XG4gICAgICBpZiAodGVtcGxhdGUgPT09IDApIHtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogLTMsXG4gICAgICAgICAgeTogLTEsXG4gICAgICAgIH0pO1xuICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICB4OiAyLFxuICAgICAgICAgIHk6IC0yLFxuICAgICAgICB9KTtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogLTIsXG4gICAgICAgICAgeTogLTIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb2xsZWN0aXZlV2lkdGggPSAobWF4UGF0dGVybkluZGV4ICsgMSkgKiBwYXR0ZXJuV2lkdGg7XG4gICAgY29uc3QgY29sbGVjdGl2ZUJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgIG1tcixcbiAgICAgIGNvbGxlY3RpdmVXaWR0aCxcbiAgICAgIHBhdHRlcm5IZWlnaHQsXG4gICAgICB0ZW1wbGF0ZSxcbiAgICAgIGZhbHNlLFxuICAgICAgbnVsbCxcbiAgICAgIGF0LFxuICAgICAgZGVjb2RpbmdDb250ZXh0XG4gICAgKTtcbiAgICAvLyBEaXZpZGUgY29sbGVjdGl2ZSBiaXRtYXAgaW50byBwYXR0ZXJucy5cbiAgICBjb25zdCBwYXR0ZXJucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1heFBhdHRlcm5JbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuQml0bWFwID0gW107XG4gICAgICBjb25zdCB4TWluID0gcGF0dGVybldpZHRoICogaTtcbiAgICAgIGNvbnN0IHhNYXggPSB4TWluICsgcGF0dGVybldpZHRoO1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBwYXR0ZXJuSGVpZ2h0OyB5KyspIHtcbiAgICAgICAgcGF0dGVybkJpdG1hcC5wdXNoKGNvbGxlY3RpdmVCaXRtYXBbeV0uc3ViYXJyYXkoeE1pbiwgeE1heCkpO1xuICAgICAgfVxuICAgICAgcGF0dGVybnMucHVzaChwYXR0ZXJuQml0bWFwKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm5zO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24oXG4gICAgbW1yLFxuICAgIHBhdHRlcm5zLFxuICAgIHRlbXBsYXRlLFxuICAgIHJlZ2lvbldpZHRoLFxuICAgIHJlZ2lvbkhlaWdodCxcbiAgICBkZWZhdWx0UGl4ZWxWYWx1ZSxcbiAgICBlbmFibGVTa2lwLFxuICAgIGNvbWJpbmF0aW9uT3BlcmF0b3IsXG4gICAgZ3JpZFdpZHRoLFxuICAgIGdyaWRIZWlnaHQsXG4gICAgZ3JpZE9mZnNldFgsXG4gICAgZ3JpZE9mZnNldFksXG4gICAgZ3JpZFZlY3RvclgsXG4gICAgZ3JpZFZlY3RvclksXG4gICAgZGVjb2RpbmdDb250ZXh0XG4gICkge1xuICAgIGNvbnN0IHNraXAgPSBudWxsO1xuICAgIGlmIChlbmFibGVTa2lwKSB7XG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInNraXAgaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmF0aW9uT3BlcmF0b3IgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFxuICAgICAgICBcIm9wZXJhdG9yIFwiICtcbiAgICAgICAgICBjb21iaW5hdGlvbk9wZXJhdG9yICtcbiAgICAgICAgICBcIiBpcyBub3Qgc3VwcG9ydGVkIGluIGhhbGZ0b25lIHJlZ2lvblwiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYml0bWFwLlxuICAgIGNvbnN0IHJlZ2lvbkJpdG1hcCA9IFtdO1xuICAgIGxldCBpLCBqLCByb3c7XG4gICAgZm9yIChpID0gMDsgaSA8IHJlZ2lvbkhlaWdodDsgaSsrKSB7XG4gICAgICByb3cgPSBuZXcgVWludDhBcnJheShyZWdpb25XaWR0aCk7XG4gICAgICBpZiAoZGVmYXVsdFBpeGVsVmFsdWUpIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IHJlZ2lvbldpZHRoOyBqKyspIHtcbiAgICAgICAgICByb3dbal0gPSBkZWZhdWx0UGl4ZWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVnaW9uQml0bWFwLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICBjb25zdCBudW1iZXJPZlBhdHRlcm5zID0gcGF0dGVybnMubGVuZ3RoO1xuICAgIGNvbnN0IHBhdHRlcm4wID0gcGF0dGVybnNbMF07XG4gICAgY29uc3QgcGF0dGVybldpZHRoID0gcGF0dGVybjBbMF0ubGVuZ3RoLFxuICAgICAgcGF0dGVybkhlaWdodCA9IHBhdHRlcm4wLmxlbmd0aDtcbiAgICBjb25zdCBiaXRzUGVyVmFsdWUgPSBsb2cyKG51bWJlck9mUGF0dGVybnMpO1xuICAgIGNvbnN0IGF0ID0gW107XG4gICAgaWYgKCFtbXIpIHtcbiAgICAgIGF0LnB1c2goe1xuICAgICAgICB4OiB0ZW1wbGF0ZSA8PSAxID8gMyA6IDIsXG4gICAgICAgIHk6IC0xLFxuICAgICAgfSk7XG4gICAgICBpZiAodGVtcGxhdGUgPT09IDApIHtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogLTMsXG4gICAgICAgICAgeTogLTEsXG4gICAgICAgIH0pO1xuICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICB4OiAyLFxuICAgICAgICAgIHk6IC0yLFxuICAgICAgICB9KTtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogLTIsXG4gICAgICAgICAgeTogLTIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBbm5leCBDLiBHcmF5LXNjYWxlIEltYWdlIERlY29kaW5nIFByb2NlZHVyZS5cbiAgICBjb25zdCBncmF5U2NhbGVCaXRQbGFuZXMgPSBbXTtcbiAgICBsZXQgbW1ySW5wdXQsIGJpdG1hcDtcbiAgICBpZiAobW1yKSB7XG4gICAgICAvLyBNTVIgYml0IHBsYW5lcyBhcmUgaW4gb25lIGNvbnRpbnVvdXMgc3RyZWFtLiBPbmx5IEVPRkIgY29kZXMgaW5kaWNhdGVcbiAgICAgIC8vIHRoZSBlbmQgb2YgZWFjaCBiaXRtYXAsIHNvIEVPRkJzIG11c3QgYmUgZGVjb2RlZC5cbiAgICAgIG1tcklucHV0ID0gbmV3IFJlYWRlcihcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LmRhdGEsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5zdGFydCxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LmVuZFxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChpID0gYml0c1BlclZhbHVlIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChtbXIpIHtcbiAgICAgICAgYml0bWFwID0gZGVjb2RlTU1SQml0bWFwKG1tcklucHV0LCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYml0bWFwID0gZGVjb2RlQml0bWFwKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGdyaWRXaWR0aCxcbiAgICAgICAgICBncmlkSGVpZ2h0LFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHNraXAsXG4gICAgICAgICAgYXQsXG4gICAgICAgICAgZGVjb2RpbmdDb250ZXh0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBncmF5U2NhbGVCaXRQbGFuZXNbaV0gPSBiaXRtYXA7XG4gICAgfVxuICAgIC8vIDYuNi41LjIgUmVuZGVyaW5nIHRoZSBwYXR0ZXJucy5cbiAgICBsZXQgbWcsIG5nLCBiaXQsIHBhdHRlcm5JbmRleCwgcGF0dGVybkJpdG1hcCwgeCwgeSwgcGF0dGVyblJvdywgcmVnaW9uUm93O1xuICAgIGZvciAobWcgPSAwOyBtZyA8IGdyaWRIZWlnaHQ7IG1nKyspIHtcbiAgICAgIGZvciAobmcgPSAwOyBuZyA8IGdyaWRXaWR0aDsgbmcrKykge1xuICAgICAgICBiaXQgPSAwO1xuICAgICAgICBwYXR0ZXJuSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGogPSBiaXRzUGVyVmFsdWUgLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIGJpdCA9IGdyYXlTY2FsZUJpdFBsYW5lc1tqXVttZ11bbmddIF4gYml0OyAvLyBHcmF5IGRlY29kaW5nXG4gICAgICAgICAgcGF0dGVybkluZGV4IHw9IGJpdCA8PCBqO1xuICAgICAgICB9XG4gICAgICAgIHBhdHRlcm5CaXRtYXAgPSBwYXR0ZXJuc1twYXR0ZXJuSW5kZXhdO1xuICAgICAgICB4ID0gKGdyaWRPZmZzZXRYICsgbWcgKiBncmlkVmVjdG9yWSArIG5nICogZ3JpZFZlY3RvclgpID4+IDg7XG4gICAgICAgIHkgPSAoZ3JpZE9mZnNldFkgKyBtZyAqIGdyaWRWZWN0b3JYIC0gbmcgKiBncmlkVmVjdG9yWSkgPj4gODtcbiAgICAgICAgLy8gRHJhdyBwYXR0ZXJuQml0bWFwIGF0ICh4LCB5KS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHggPj0gMCAmJlxuICAgICAgICAgIHggKyBwYXR0ZXJuV2lkdGggPD0gcmVnaW9uV2lkdGggJiZcbiAgICAgICAgICB5ID49IDAgJiZcbiAgICAgICAgICB5ICsgcGF0dGVybkhlaWdodCA8PSByZWdpb25IZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdHRlcm5IZWlnaHQ7IGkrKykge1xuICAgICAgICAgICAgcmVnaW9uUm93ID0gcmVnaW9uQml0bWFwW3kgKyBpXTtcbiAgICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHJlZ2lvblJvd1t4ICsgal0gfD0gcGF0dGVyblJvd1tqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJlZ2lvblgsIHJlZ2lvblk7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdHRlcm5IZWlnaHQ7IGkrKykge1xuICAgICAgICAgICAgcmVnaW9uWSA9IHkgKyBpO1xuICAgICAgICAgICAgaWYgKHJlZ2lvblkgPCAwIHx8IHJlZ2lvblkgPj0gcmVnaW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVnaW9uUm93ID0gcmVnaW9uQml0bWFwW3JlZ2lvblldO1xuICAgICAgICAgICAgcGF0dGVyblJvdyA9IHBhdHRlcm5CaXRtYXBbaV07XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0dGVybldpZHRoOyBqKyspIHtcbiAgICAgICAgICAgICAgcmVnaW9uWCA9IHggKyBqO1xuICAgICAgICAgICAgICBpZiAocmVnaW9uWCA+PSAwICYmIHJlZ2lvblggPCByZWdpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgIHJlZ2lvblJvd1tyZWdpb25YXSB8PSBwYXR0ZXJuUm93W2pdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWdpb25CaXRtYXA7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkU2VnbWVudEhlYWRlcihkYXRhLCBzdGFydCkge1xuICAgIHZhciBzZWdtZW50SGVhZGVyID0ge307XG4gICAgc2VnbWVudEhlYWRlci5udW1iZXIgPSByZWFkVWludDMyKGRhdGEsIHN0YXJ0KTtcbiAgICB2YXIgZmxhZ3MgPSBkYXRhW3N0YXJ0ICsgNF07XG4gICAgdmFyIHNlZ21lbnRUeXBlID0gZmxhZ3MgJiAweDNmO1xuICAgIGlmICghU2VnbWVudFR5cGVzW3NlZ21lbnRUeXBlXSkge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIHNlZ21lbnQgdHlwZTogXCIgKyBzZWdtZW50VHlwZSk7XG4gICAgfVxuICAgIHNlZ21lbnRIZWFkZXIudHlwZSA9IHNlZ21lbnRUeXBlO1xuICAgIHNlZ21lbnRIZWFkZXIudHlwZU5hbWUgPSBTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdO1xuICAgIHNlZ21lbnRIZWFkZXIuZGVmZXJyZWROb25SZXRhaW4gPSAhIShmbGFncyAmIDB4ODApO1xuXG4gICAgdmFyIHBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSA9ICEhKGZsYWdzICYgMHg0MCk7XG4gICAgdmFyIHJlZmVycmVkRmxhZ3MgPSBkYXRhW3N0YXJ0ICsgNV07XG4gICAgdmFyIHJlZmVycmVkVG9Db3VudCA9IChyZWZlcnJlZEZsYWdzID4+IDUpICYgNztcbiAgICB2YXIgcmV0YWluQml0cyA9IFtyZWZlcnJlZEZsYWdzICYgMzFdO1xuICAgIHZhciBwb3NpdGlvbiA9IHN0YXJ0ICsgNjtcbiAgICBpZiAocmVmZXJyZWRGbGFncyA9PT0gNykge1xuICAgICAgcmVmZXJyZWRUb0NvdW50ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiAtIDEpICYgMHgxZmZmZmZmZjtcbiAgICAgIHBvc2l0aW9uICs9IDM7XG4gICAgICB2YXIgYnl0ZXMgPSAocmVmZXJyZWRUb0NvdW50ICsgNykgPj4gMztcbiAgICAgIHJldGFpbkJpdHNbMF0gPSBkYXRhW3Bvc2l0aW9uKytdO1xuICAgICAgd2hpbGUgKC0tYnl0ZXMgPiAwKSB7XG4gICAgICAgIHJldGFpbkJpdHMucHVzaChkYXRhW3Bvc2l0aW9uKytdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDUgfHwgcmVmZXJyZWRGbGFncyA9PT0gNikge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIHJlZmVycmVkLXRvIGZsYWdzXCIpO1xuICAgIH1cblxuICAgIHNlZ21lbnRIZWFkZXIucmV0YWluQml0cyA9IHJldGFpbkJpdHM7XG5cbiAgICBsZXQgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gNDtcbiAgICBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gMjU2KSB7XG4gICAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAxO1xuICAgIH0gZWxzZSBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gNjU1MzYpIHtcbiAgICAgIHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDI7XG4gICAgfVxuICAgIHZhciByZWZlcnJlZFRvID0gW107XG4gICAgdmFyIGksIGlpO1xuICAgIGZvciAoaSA9IDA7IGkgPCByZWZlcnJlZFRvQ291bnQ7IGkrKykge1xuICAgICAgbGV0IG51bWJlcjtcbiAgICAgIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDEpIHtcbiAgICAgICAgbnVtYmVyID0gZGF0YVtwb3NpdGlvbl07XG4gICAgICB9IGVsc2UgaWYgKHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9PT0gMikge1xuICAgICAgICBudW1iZXIgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bWJlciA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgfVxuICAgICAgcmVmZXJyZWRUby5wdXNoKG51bWJlcik7XG4gICAgICBwb3NpdGlvbiArPSByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemU7XG4gICAgfVxuICAgIHNlZ21lbnRIZWFkZXIucmVmZXJyZWRUbyA9IHJlZmVycmVkVG87XG4gICAgaWYgKCFwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUpIHtcbiAgICAgIHNlZ21lbnRIZWFkZXIucGFnZUFzc29jaWF0aW9uID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VnbWVudEhlYWRlci5wYWdlQXNzb2NpYXRpb24gPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgIHBvc2l0aW9uICs9IDQ7XG4gICAgfVxuICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgcG9zaXRpb24gKz0gNDtcblxuICAgIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikge1xuICAgICAgLy8gNy4yLjcgU2VnbWVudCBkYXRhIGxlbmd0aCwgdW5rbm93biBzZWdtZW50IGxlbmd0aFxuICAgICAgaWYgKHNlZ21lbnRUeXBlID09PSAzOCkge1xuICAgICAgICAvLyBJbW1lZGlhdGVHZW5lcmljUmVnaW9uXG4gICAgICAgIHZhciBnZW5lcmljUmVnaW9uSW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9XG4gICAgICAgICAgZGF0YVtwb3NpdGlvbiArIFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoXTtcbiAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25NbXIgPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgMSk7XG4gICAgICAgIC8vIHNlYXJjaGluZyBmb3IgdGhlIHNlZ21lbnQgZW5kXG4gICAgICAgIHZhciBzZWFyY2hQYXR0ZXJuTGVuZ3RoID0gNjtcbiAgICAgICAgdmFyIHNlYXJjaFBhdHRlcm4gPSBuZXcgVWludDhBcnJheShzZWFyY2hQYXR0ZXJuTGVuZ3RoKTtcbiAgICAgICAgaWYgKCFnZW5lcmljUmVnaW9uTW1yKSB7XG4gICAgICAgICAgc2VhcmNoUGF0dGVyblswXSA9IDB4ZmY7XG4gICAgICAgICAgc2VhcmNoUGF0dGVyblsxXSA9IDB4YWM7XG4gICAgICAgIH1cbiAgICAgICAgc2VhcmNoUGF0dGVyblsyXSA9IChnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgPj4+IDI0KSAmIDB4ZmY7XG4gICAgICAgIHNlYXJjaFBhdHRlcm5bM10gPSAoZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIHNlYXJjaFBhdHRlcm5bNF0gPSAoZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDgpICYgMHhmZjtcbiAgICAgICAgc2VhcmNoUGF0dGVybls1XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCAmIDB4ZmY7XG4gICAgICAgIGZvciAoaSA9IHBvc2l0aW9uLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIHZhciBqID0gMDtcbiAgICAgICAgICB3aGlsZSAoaiA8IHNlYXJjaFBhdHRlcm5MZW5ndGggJiYgc2VhcmNoUGF0dGVybltqXSA9PT0gZGF0YVtpICsgal0pIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGogPT09IHNlYXJjaFBhdHRlcm5MZW5ndGgpIHtcbiAgICAgICAgICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gaSArIHNlYXJjaFBhdHRlcm5MZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJzZWdtZW50IGVuZCB3YXMgbm90IGZvdW5kXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VnbWVudEhlYWRlci5oZWFkZXJFbmQgPSBwb3NpdGlvbjtcbiAgICByZXR1cm4gc2VnbWVudEhlYWRlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgc2VnbWVudHMgPSBbXTtcbiAgICB2YXIgcG9zaXRpb24gPSBzdGFydDtcbiAgICB3aGlsZSAocG9zaXRpb24gPCBlbmQpIHtcbiAgICAgIHZhciBzZWdtZW50SGVhZGVyID0gcmVhZFNlZ21lbnRIZWFkZXIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgcG9zaXRpb24gPSBzZWdtZW50SGVhZGVyLmhlYWRlckVuZDtcbiAgICAgIHZhciBzZWdtZW50ID0ge1xuICAgICAgICBoZWFkZXI6IHNlZ21lbnRIZWFkZXIsXG4gICAgICAgIGRhdGEsXG4gICAgICB9O1xuICAgICAgaWYgKCFoZWFkZXIucmFuZG9tQWNjZXNzKSB7XG4gICAgICAgIHNlZ21lbnQuc3RhcnQgPSBwb3NpdGlvbjtcbiAgICAgICAgcG9zaXRpb24gKz0gc2VnbWVudEhlYWRlci5sZW5ndGg7XG4gICAgICAgIHNlZ21lbnQuZW5kID0gcG9zaXRpb247XG4gICAgICB9XG4gICAgICBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgICAgaWYgKHNlZ21lbnRIZWFkZXIudHlwZSA9PT0gNTEpIHtcbiAgICAgICAgYnJlYWs7IC8vIGVuZCBvZiBmaWxlIGlzIGZvdW5kXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoZWFkZXIucmFuZG9tQWNjZXNzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHNlZ21lbnRzW2ldLnN0YXJ0ID0gcG9zaXRpb247XG4gICAgICAgIHBvc2l0aW9uICs9IHNlZ21lbnRzW2ldLmhlYWRlci5sZW5ndGg7XG4gICAgICAgIHNlZ21lbnRzW2ldLmVuZCA9IHBvc2l0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH1cblxuICAvLyA3LjQuMSBSZWdpb24gc2VnbWVudCBpbmZvcm1hdGlvbiBmaWVsZFxuICBmdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHN0YXJ0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiByZWFkVWludDMyKGRhdGEsIHN0YXJ0KSxcbiAgICAgIGhlaWdodDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDQpLFxuICAgICAgeDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDgpLFxuICAgICAgeTogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDEyKSxcbiAgICAgIGNvbWJpbmF0aW9uT3BlcmF0b3I6IGRhdGFbc3RhcnQgKyAxNl0gJiA3LFxuICAgIH07XG4gIH1cbiAgdmFyIFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoID0gMTc7XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnQoc2VnbWVudCwgdmlzaXRvcikge1xuICAgIHZhciBoZWFkZXIgPSBzZWdtZW50LmhlYWRlcjtcblxuICAgIHZhciBkYXRhID0gc2VnbWVudC5kYXRhLFxuICAgICAgcG9zaXRpb24gPSBzZWdtZW50LnN0YXJ0LFxuICAgICAgZW5kID0gc2VnbWVudC5lbmQ7XG4gICAgdmFyIGFyZ3MsIGF0LCBpLCBhdExlbmd0aDtcbiAgICBzd2l0Y2ggKGhlYWRlci50eXBlKSB7XG4gICAgICBjYXNlIDA6IC8vIFN5bWJvbERpY3Rpb25hcnlcbiAgICAgICAgLy8gNy40LjIgU3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCBzeW50YXhcbiAgICAgICAgdmFyIGRpY3Rpb25hcnkgPSB7fTtcbiAgICAgICAgdmFyIGRpY3Rpb25hcnlGbGFncyA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOyAvLyA3LjQuMi4xLjFcbiAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuID0gISEoZGljdGlvbmFyeUZsYWdzICYgMSk7XG4gICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDIpO1xuICAgICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yID0gKGRpY3Rpb25hcnlGbGFncyA+PiAyKSAmIDM7XG4gICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IgPSAoZGljdGlvbmFyeUZsYWdzID4+IDQpICYgMztcbiAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IgPSAoZGljdGlvbmFyeUZsYWdzID4+IDYpICYgMTtcbiAgICAgICAgZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yID0gKGRpY3Rpb25hcnlGbGFncyA+PiA3KSAmIDE7XG4gICAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFVzZWQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyNTYpO1xuICAgICAgICBkaWN0aW9uYXJ5LmJpdG1hcENvZGluZ0NvbnRleHRSZXRhaW5lZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDUxMik7XG4gICAgICAgIGRpY3Rpb25hcnkudGVtcGxhdGUgPSAoZGljdGlvbmFyeUZsYWdzID4+IDEwKSAmIDM7XG4gICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlID0gKGRpY3Rpb25hcnlGbGFncyA+PiAxMikgJiAxO1xuICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICBpZiAoIWRpY3Rpb25hcnkuaHVmZm1hbikge1xuICAgICAgICAgIGF0TGVuZ3RoID0gZGljdGlvbmFyeS50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxO1xuICAgICAgICAgIGF0ID0gW107XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksXG4gICAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRpY3Rpb25hcnkuYXQgPSBhdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGljdGlvbmFyeS5yZWZpbmVtZW50ICYmICFkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSkge1xuICAgICAgICAgIGF0ID0gW107XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgICAgIHg6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgeTogcmVhZEludDgoZGF0YSwgcG9zaXRpb24gKyAxKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50QXQgPSBhdDtcbiAgICAgICAgfVxuICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDQ7XG4gICAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZOZXdTeW1ib2xzID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDQ7XG4gICAgICAgIGFyZ3MgPSBbXG4gICAgICAgICAgZGljdGlvbmFyeSxcbiAgICAgICAgICBoZWFkZXIubnVtYmVyLFxuICAgICAgICAgIGhlYWRlci5yZWZlcnJlZFRvLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgZW5kLFxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjogLy8gSW1tZWRpYXRlVGV4dFJlZ2lvblxuICAgICAgY2FzZSA3OiAvLyBJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb25cbiAgICAgICAgdmFyIHRleHRSZWdpb24gPSB7fTtcbiAgICAgICAgdGV4dFJlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoO1xuICAgICAgICB2YXIgdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW4gPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMSk7XG4gICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudCA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAyKTtcbiAgICAgICAgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemUgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiAyKSAmIDM7XG4gICAgICAgIHRleHRSZWdpb24uc3RyaXBTaXplID0gMSA8PCB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZTtcbiAgICAgICAgdGV4dFJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA0KSAmIDM7XG4gICAgICAgIHRleHRSZWdpb24udHJhbnNwb3NlZCA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiA2NCk7XG4gICAgICAgIHRleHRSZWdpb24uY29tYmluYXRpb25PcGVyYXRvciA9ICh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDcpICYgMztcbiAgICAgICAgdGV4dFJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9ICh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDkpICYgMTtcbiAgICAgICAgdGV4dFJlZ2lvbi5kc09mZnNldCA9ICh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzIDw8IDE3KSA+PiAyNztcbiAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiAxNSkgJiAxO1xuICAgICAgICBpZiAodGV4dFJlZ2lvbi5odWZmbWFuKSB7XG4gICAgICAgICAgdmFyIHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkZTID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDM7XG4gICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFMgPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAyKSAmIDM7XG4gICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFQgPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA0KSAmIDM7XG4gICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERXID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNikgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRESCA9ICh0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDgpICYgMztcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFggPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMCkgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREWSA9ICh0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEyKSAmIDM7XG4gICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudFNpemVTZWxlY3RvciA9ICEhKFxuICAgICAgICAgICAgdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDB4NDAwMFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCAmJiAhdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUpIHtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksXG4gICAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudEF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dFJlZ2lvbi5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBhcmdzID0gW3RleHRSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE2OiAvLyBQYXR0ZXJuRGljdGlvbmFyeVxuICAgICAgICAvLyA3LjQuNC4gUGF0dGVybiBkaWN0aW9uYXJ5IHNlZ21lbnQgc3ludGF4XG4gICAgICAgIGNvbnN0IHBhdHRlcm5EaWN0aW9uYXJ5ID0ge307XG4gICAgICAgIGNvbnN0IHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdO1xuICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5tbXIgPSAhIShwYXR0ZXJuRGljdGlvbmFyeUZsYWdzICYgMSk7XG4gICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5LnRlbXBsYXRlID0gKHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgPj4gMSkgJiAzO1xuICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuV2lkdGggPSBkYXRhW3Bvc2l0aW9uKytdO1xuICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0ID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDQ7XG4gICAgICAgIGFyZ3MgPSBbcGF0dGVybkRpY3Rpb25hcnksIGhlYWRlci5udW1iZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmRdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjI6IC8vIEltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uXG4gICAgICBjYXNlIDIzOiAvLyBJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uXG4gICAgICAgIC8vIDcuNC41IEhhbGZ0b25lIHJlZ2lvbiBzZWdtZW50IHN5bnRheFxuICAgICAgICBjb25zdCBoYWxmdG9uZVJlZ2lvbiA9IHt9O1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoO1xuICAgICAgICBjb25zdCBoYWxmdG9uZVJlZ2lvbkZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24ubW1yID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDEpO1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi50ZW1wbGF0ZSA9IChoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDEpICYgMztcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZW5hYmxlU2tpcCA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiA4KTtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uY29tYmluYXRpb25PcGVyYXRvciA9IChoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDQpICYgNztcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSAoaGFsZnRvbmVSZWdpb25GbGFncyA+PiA3KSAmIDE7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRXaWR0aCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkSGVpZ2h0ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDQ7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRPZmZzZXRYID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbikgJiAweGZmZmZmZmZmO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WSA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFZlY3RvclggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFZlY3RvclkgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgYXJncyA9IFtoYWxmdG9uZVJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzg6IC8vIEltbWVkaWF0ZUdlbmVyaWNSZWdpb25cbiAgICAgIGNhc2UgMzk6IC8vIEltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvblxuICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvbiA9IHt9O1xuICAgICAgICBnZW5lcmljUmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7XG4gICAgICAgIHZhciBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgZ2VuZXJpY1JlZ2lvbi5tbXIgPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgMSk7XG4gICAgICAgIGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPSAoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA+PiAxKSAmIDM7XG4gICAgICAgIGdlbmVyaWNSZWdpb24ucHJlZGljdGlvbiA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiA4KTtcbiAgICAgICAgaWYgKCFnZW5lcmljUmVnaW9uLm1tcikge1xuICAgICAgICAgIGF0TGVuZ3RoID0gZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxO1xuICAgICAgICAgIGF0ID0gW107XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksXG4gICAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdlbmVyaWNSZWdpb24uYXQgPSBhdDtcbiAgICAgICAgfVxuICAgICAgICBhcmdzID0gW2dlbmVyaWNSZWdpb24sIGRhdGEsIHBvc2l0aW9uLCBlbmRdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDg6IC8vIFBhZ2VJbmZvcm1hdGlvblxuICAgICAgICB2YXIgcGFnZUluZm8gPSB7XG4gICAgICAgICAgd2lkdGg6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgIGhlaWdodDogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDQpLFxuICAgICAgICAgIHJlc29sdXRpb25YOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgOCksXG4gICAgICAgICAgcmVzb2x1dGlvblk6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxMiksXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYWdlSW5mby5oZWlnaHQgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBkZWxldGUgcGFnZUluZm8uaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYWdlU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIDE2XTtcbiAgICAgICAgcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbiArIDE3KTsgLy8gcGFnZVN0cmlwaW5nSW5mb3JtYXRpb25cbiAgICAgICAgcGFnZUluZm8ubG9zc2xlc3MgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMSk7XG4gICAgICAgIHBhZ2VJbmZvLnJlZmluZW1lbnQgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMik7XG4gICAgICAgIHBhZ2VJbmZvLmRlZmF1bHRQaXhlbFZhbHVlID0gKHBhZ2VTZWdtZW50RmxhZ3MgPj4gMikgJiAxO1xuICAgICAgICBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yID0gKHBhZ2VTZWdtZW50RmxhZ3MgPj4gMykgJiAzO1xuICAgICAgICBwYWdlSW5mby5yZXF1aXJlc0J1ZmZlciA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAzMik7XG4gICAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiA2NCk7XG4gICAgICAgIGFyZ3MgPSBbcGFnZUluZm9dO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDk6IC8vIEVuZE9mUGFnZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTA6IC8vIEVuZE9mU3RyaXBlXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1MTogLy8gRW5kT2ZGaWxlXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1MzogLy8gVGFibGVzXG4gICAgICAgIGFyZ3MgPSBbaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2MjogLy8gNy40LjE1IGRlZmluZXMgMiBleHRlbnNpb24gdHlwZXMgd2hpY2hcbiAgICAgICAgLy8gYXJlIGNvbW1lbnRzIGFuZCBjYW4gYmUgaWdub3JlZC5cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcbiAgICAgICAgICBgc2VnbWVudCB0eXBlICR7aGVhZGVyLnR5cGVOYW1lfSgke2hlYWRlci50eXBlfSlgICtcbiAgICAgICAgICAgIFwiIGlzIG5vdCBpbXBsZW1lbnRlZFwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIHZhciBjYWxsYmFja05hbWUgPSBcIm9uXCIgKyBoZWFkZXIudHlwZU5hbWU7XG4gICAgaWYgKGNhbGxiYWNrTmFtZSBpbiB2aXNpdG9yKSB7XG4gICAgICB2aXNpdG9yW2NhbGxiYWNrTmFtZV0uYXBwbHkodmlzaXRvciwgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgcHJvY2Vzc1NlZ21lbnQoc2VnbWVudHNbaV0sIHZpc2l0b3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSmJpZzJDaHVua3MoY2h1bmtzKSB7XG4gICAgdmFyIHZpc2l0b3IgPSBuZXcgU2ltcGxlU2VnbWVudFZpc2l0b3IoKTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgdmFyIHNlZ21lbnRzID0gcmVhZFNlZ21lbnRzKHt9LCBjaHVuay5kYXRhLCBjaHVuay5zdGFydCwgY2h1bmsuZW5kKTtcbiAgICAgIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcik7XG4gICAgfVxuICAgIHJldHVybiB2aXNpdG9yLmJ1ZmZlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSmJpZzIoZGF0YSkge1xuICAgIGNvbnN0IGVuZCA9IGRhdGEubGVuZ3RoO1xuICAgIGxldCBwb3NpdGlvbiA9IDA7XG5cbiAgICBpZiAoXG4gICAgICBkYXRhW3Bvc2l0aW9uXSAhPT0gMHg5NyB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDFdICE9PSAweDRhIHx8XG4gICAgICBkYXRhW3Bvc2l0aW9uICsgMl0gIT09IDB4NDIgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyAzXSAhPT0gMHgzMiB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDRdICE9PSAweDBkIHx8XG4gICAgICBkYXRhW3Bvc2l0aW9uICsgNV0gIT09IDB4MGEgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyA2XSAhPT0gMHgxYSB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDddICE9PSAweDBhXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInBhcnNlSmJpZzIgLSBpbnZhbGlkIGhlYWRlci5cIik7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBwb3NpdGlvbiArPSA4O1xuICAgIGNvbnN0IGZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICBoZWFkZXIucmFuZG9tQWNjZXNzID0gIShmbGFncyAmIDEpO1xuICAgIGlmICghKGZsYWdzICYgMikpIHtcbiAgICAgIGhlYWRlci5udW1iZXJPZlBhZ2VzID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICBwb3NpdGlvbiArPSA0O1xuICAgIH1cblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcmVhZFNlZ21lbnRzKGhlYWRlciwgZGF0YSwgcG9zaXRpb24sIGVuZCk7XG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBTaW1wbGVTZWdtZW50VmlzaXRvcigpO1xuICAgIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcik7XG5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHZpc2l0b3IuY3VycmVudFBhZ2VJbmZvO1xuICAgIGNvbnN0IGJpdFBhY2tlZCA9IHZpc2l0b3IuYnVmZmVyO1xuICAgIGNvbnN0IGltZ0RhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICAgIGxldCBxID0gMCxcbiAgICAgIGsgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgIGxldCBtYXNrID0gMCxcbiAgICAgICAgYnVmZmVyO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgIGlmICghbWFzaykge1xuICAgICAgICAgIG1hc2sgPSAxMjg7XG4gICAgICAgICAgYnVmZmVyID0gYml0UGFja2VkW2srK107XG4gICAgICAgIH1cbiAgICAgICAgaW1nRGF0YVtxKytdID0gYnVmZmVyICYgbWFzayA/IDAgOiAyNTU7XG4gICAgICAgIG1hc2sgPj49IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaW1nRGF0YSwgd2lkdGgsIGhlaWdodCB9O1xuICB9XG5cbiAgZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3IoKSB7fVxuXG4gIFNpbXBsZVNlZ21lbnRWaXNpdG9yLnByb3RvdHlwZSA9IHtcbiAgICBvblBhZ2VJbmZvcm1hdGlvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25QYWdlSW5mb3JtYXRpb24oaW5mbykge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZUluZm8gPSBpbmZvO1xuICAgICAgdmFyIHJvd1NpemUgPSAoaW5mby53aWR0aCArIDcpID4+IDM7XG4gICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHJvd1NpemUgKiBpbmZvLmhlaWdodCk7XG4gICAgICAvLyBUaGUgY29udGVudHMgb2YgQXJyYXlCdWZmZXJzIGFyZSBpbml0aWFsaXplZCB0byAwLlxuICAgICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggMHhGRiBvbmx5IGlmIGluZm8uZGVmYXVsdFBpeGVsVmFsdWUgaXMgc2V0XG4gICAgICBpZiAoaW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBidWZmZXIubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIGJ1ZmZlcltpXSA9IDB4ZmY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgIH0sXG4gICAgZHJhd0JpdG1hcDogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3JfZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApIHtcbiAgICAgIHZhciBwYWdlSW5mbyA9IHRoaXMuY3VycmVudFBhZ2VJbmZvO1xuICAgICAgdmFyIHdpZHRoID0gcmVnaW9uSW5mby53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gcmVnaW9uSW5mby5oZWlnaHQ7XG4gICAgICB2YXIgcm93U2l6ZSA9IChwYWdlSW5mby53aWR0aCArIDcpID4+IDM7XG4gICAgICB2YXIgY29tYmluYXRpb25PcGVyYXRvciA9IHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZVxuICAgICAgICA/IHJlZ2lvbkluZm8uY29tYmluYXRpb25PcGVyYXRvclxuICAgICAgICA6IHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3I7XG4gICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgICB2YXIgbWFzazAgPSAxMjggPj4gKHJlZ2lvbkluZm8ueCAmIDcpO1xuICAgICAgdmFyIG9mZnNldDAgPSByZWdpb25JbmZvLnkgKiByb3dTaXplICsgKHJlZ2lvbkluZm8ueCA+PiAzKTtcbiAgICAgIHZhciBpLCBqLCBtYXNrLCBvZmZzZXQ7XG4gICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAwOiAvLyBPUlxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgICAgICAgICAgbWFzayA9IG1hc2swO1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSB8PSBtYXNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgICAgICAgIGlmICghbWFzaykge1xuICAgICAgICAgICAgICAgIG1hc2sgPSAxMjg7XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogLy8gWE9SXG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgICBtYXNrID0gbWFzazA7XG4gICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQwO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKGJpdG1hcFtpXVtqXSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXRdIF49IG1hc2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWFzayA+Pj0gMTtcbiAgICAgICAgICAgICAgaWYgKCFtYXNrKSB7XG4gICAgICAgICAgICAgICAgbWFzayA9IDEyODtcbiAgICAgICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0MCArPSByb3dTaXplO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcbiAgICAgICAgICAgIGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uKFxuICAgICAgcmVnaW9uLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgKSB7XG4gICAgICB2YXIgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvO1xuICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICB2YXIgYml0bWFwID0gZGVjb2RlQml0bWFwKFxuICAgICAgICByZWdpb24ubW1yLFxuICAgICAgICByZWdpb25JbmZvLndpZHRoLFxuICAgICAgICByZWdpb25JbmZvLmhlaWdodCxcbiAgICAgICAgcmVnaW9uLnRlbXBsYXRlLFxuICAgICAgICByZWdpb24ucHJlZGljdGlvbixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcmVnaW9uLmF0LFxuICAgICAgICBkZWNvZGluZ0NvbnRleHRcbiAgICAgICk7XG4gICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTtcbiAgICB9LFxuICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbigpIHtcbiAgICAgIHRoaXMub25JbW1lZGlhdGVHZW5lcmljUmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBvblN5bWJvbERpY3Rpb25hcnk6IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uU3ltYm9sRGljdGlvbmFyeShcbiAgICAgIGRpY3Rpb25hcnksXG4gICAgICBjdXJyZW50U2VnbWVudCxcbiAgICAgIHJlZmVycmVkU2VnbWVudHMsXG4gICAgICBkYXRhLFxuICAgICAgc3RhcnQsXG4gICAgICBlbmRcbiAgICApIHtcbiAgICAgIGxldCBodWZmbWFuVGFibGVzLCBodWZmbWFuSW5wdXQ7XG4gICAgICBpZiAoZGljdGlvbmFyeS5odWZmbWFuKSB7XG4gICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhcbiAgICAgICAgICBkaWN0aW9uYXJ5LFxuICAgICAgICAgIHJlZmVycmVkU2VnbWVudHMsXG4gICAgICAgICAgdGhpcy5jdXN0b21UYWJsZXNcbiAgICAgICAgKTtcbiAgICAgICAgaHVmZm1hbklucHV0ID0gbmV3IFJlYWRlcihkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tYmluZXMgZXhwb3J0ZWQgc3ltYm9scyBmcm9tIGFsbCByZWZlcnJlZCBzZWdtZW50c1xuICAgICAgdmFyIHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7XG4gICAgICBpZiAoIXN5bWJvbHMpIHtcbiAgICAgICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scyA9IHt9O1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5wdXRTeW1ib2xzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRzW2ldXTtcbiAgICAgICAgLy8gcmVmZXJyZWRTeW1ib2xzIGlzIHVuZGVmaW5lZCB3aGVuIHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYSBUYWJsZXNcbiAgICAgICAgLy8gc2VnbWVudCBpbnN0ZWFkIG9mIGEgU3ltYm9sRGljdGlvbmFyeS5cbiAgICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykge1xuICAgICAgICAgIGlucHV0U3ltYm9scyA9IGlucHV0U3ltYm9scy5jb25jYXQocmVmZXJyZWRTeW1ib2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIHN5bWJvbHNbY3VycmVudFNlZ21lbnRdID0gZGVjb2RlU3ltYm9sRGljdGlvbmFyeShcbiAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuLFxuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQsXG4gICAgICAgIGlucHV0U3ltYm9scyxcbiAgICAgICAgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMsXG4gICAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsXG4gICAgICAgIGh1ZmZtYW5UYWJsZXMsXG4gICAgICAgIGRpY3Rpb25hcnkudGVtcGxhdGUsXG4gICAgICAgIGRpY3Rpb25hcnkuYXQsXG4gICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlLFxuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LFxuICAgICAgICBodWZmbWFuSW5wdXRcbiAgICAgICk7XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZVRleHRSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlVGV4dFJlZ2lvbihcbiAgICAgIHJlZ2lvbixcbiAgICAgIHJlZmVycmVkU2VnbWVudHMsXG4gICAgICBkYXRhLFxuICAgICAgc3RhcnQsXG4gICAgICBlbmRcbiAgICApIHtcbiAgICAgIHZhciByZWdpb25JbmZvID0gcmVnaW9uLmluZm87XG4gICAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0O1xuXG4gICAgICAvLyBDb21iaW5lcyBleHBvcnRlZCBzeW1ib2xzIGZyb20gYWxsIHJlZmVycmVkIHNlZ21lbnRzXG4gICAgICB2YXIgc3ltYm9scyA9IHRoaXMuc3ltYm9scztcbiAgICAgIHZhciBpbnB1dFN5bWJvbHMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHJlZmVycmVkU2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb25zdCByZWZlcnJlZFN5bWJvbHMgPSBzeW1ib2xzW3JlZmVycmVkU2VnbWVudHNbaV1dO1xuICAgICAgICAvLyByZWZlcnJlZFN5bWJvbHMgaXMgdW5kZWZpbmVkIHdoZW4gd2UgaGF2ZSBhIHJlZmVyZW5jZSB0byBhIFRhYmxlc1xuICAgICAgICAvLyBzZWdtZW50IGluc3RlYWQgb2YgYSBTeW1ib2xEaWN0aW9uYXJ5LlxuICAgICAgICBpZiAocmVmZXJyZWRTeW1ib2xzKSB7XG4gICAgICAgICAgaW5wdXRTeW1ib2xzID0gaW5wdXRTeW1ib2xzLmNvbmNhdChyZWZlcnJlZFN5bWJvbHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgc3ltYm9sQ29kZUxlbmd0aCA9IGxvZzIoaW5wdXRTeW1ib2xzLmxlbmd0aCk7XG4gICAgICBpZiAocmVnaW9uLmh1ZmZtYW4pIHtcbiAgICAgICAgaHVmZm1hbklucHV0ID0gbmV3IFJlYWRlcihkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgICAgaHVmZm1hblRhYmxlcyA9IGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKFxuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgICAgIHRoaXMuY3VzdG9tVGFibGVzLFxuICAgICAgICAgIGlucHV0U3ltYm9scy5sZW5ndGgsXG4gICAgICAgICAgaHVmZm1hbklucHV0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgICAgdmFyIGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24oXG4gICAgICAgIHJlZ2lvbi5odWZmbWFuLFxuICAgICAgICByZWdpb24ucmVmaW5lbWVudCxcbiAgICAgICAgcmVnaW9uSW5mby53aWR0aCxcbiAgICAgICAgcmVnaW9uSW5mby5oZWlnaHQsXG4gICAgICAgIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSxcbiAgICAgICAgcmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzLFxuICAgICAgICByZWdpb24uc3RyaXBTaXplLFxuICAgICAgICBpbnB1dFN5bWJvbHMsXG4gICAgICAgIHN5bWJvbENvZGVMZW5ndGgsXG4gICAgICAgIHJlZ2lvbi50cmFuc3Bvc2VkLFxuICAgICAgICByZWdpb24uZHNPZmZzZXQsXG4gICAgICAgIHJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIsXG4gICAgICAgIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLFxuICAgICAgICBodWZmbWFuVGFibGVzLFxuICAgICAgICByZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlLFxuICAgICAgICByZWdpb24ucmVmaW5lbWVudEF0LFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQsXG4gICAgICAgIHJlZ2lvbi5sb2dTdHJpcFNpemUsXG4gICAgICAgIGh1ZmZtYW5JbnB1dFxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApO1xuICAgIH0sXG4gICAgb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uKCkge1xuICAgICAgdGhpcy5vbkltbWVkaWF0ZVRleHRSZWdpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG9uUGF0dGVybkRpY3Rpb25hcnkoZGljdGlvbmFyeSwgY3VycmVudFNlZ21lbnQsIGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIGxldCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnM7XG4gICAgICBpZiAoIXBhdHRlcm5zKSB7XG4gICAgICAgIHRoaXMucGF0dGVybnMgPSBwYXR0ZXJucyA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIHBhdHRlcm5zW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KFxuICAgICAgICBkaWN0aW9uYXJ5Lm1tcixcbiAgICAgICAgZGljdGlvbmFyeS5wYXR0ZXJuV2lkdGgsXG4gICAgICAgIGRpY3Rpb25hcnkucGF0dGVybkhlaWdodCxcbiAgICAgICAgZGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXgsXG4gICAgICAgIGRpY3Rpb25hcnkudGVtcGxhdGUsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgKTtcbiAgICB9LFxuICAgIG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgICAvLyBIYWxmdG9uZVJlZ2lvbiByZWZlcnMgdG8gZXhhY3RseSBvbmUgUGF0dGVybkRpY3Rpb25hcnkuXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnNbcmVmZXJyZWRTZWdtZW50c1swXV07XG4gICAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87XG4gICAgICBjb25zdCBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgICAgY29uc3QgYml0bWFwID0gZGVjb2RlSGFsZnRvbmVSZWdpb24oXG4gICAgICAgIHJlZ2lvbi5tbXIsXG4gICAgICAgIHBhdHRlcm5zLFxuICAgICAgICByZWdpb24udGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbkluZm8ud2lkdGgsXG4gICAgICAgIHJlZ2lvbkluZm8uaGVpZ2h0LFxuICAgICAgICByZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUsXG4gICAgICAgIHJlZ2lvbi5lbmFibGVTa2lwLFxuICAgICAgICByZWdpb24uY29tYmluYXRpb25PcGVyYXRvcixcbiAgICAgICAgcmVnaW9uLmdyaWRXaWR0aCxcbiAgICAgICAgcmVnaW9uLmdyaWRIZWlnaHQsXG4gICAgICAgIHJlZ2lvbi5ncmlkT2Zmc2V0WCxcbiAgICAgICAgcmVnaW9uLmdyaWRPZmZzZXRZLFxuICAgICAgICByZWdpb24uZ3JpZFZlY3RvclgsXG4gICAgICAgIHJlZ2lvbi5ncmlkVmVjdG9yWSxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0XG4gICAgICApO1xuICAgICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24oKSB7XG4gICAgICB0aGlzLm9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG9uVGFibGVzKGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgICBsZXQgY3VzdG9tVGFibGVzID0gdGhpcy5jdXN0b21UYWJsZXM7XG4gICAgICBpZiAoIWN1c3RvbVRhYmxlcykge1xuICAgICAgICB0aGlzLmN1c3RvbVRhYmxlcyA9IGN1c3RvbVRhYmxlcyA9IHt9O1xuICAgICAgfVxuICAgICAgY3VzdG9tVGFibGVzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBIdWZmbWFuTGluZShsaW5lRGF0YSkge1xuICAgIGlmIChsaW5lRGF0YS5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIE9PQiBsaW5lLlxuICAgICAgdGhpcy5pc09PQiA9IHRydWU7XG4gICAgICB0aGlzLnJhbmdlTG93ID0gMDtcbiAgICAgIHRoaXMucHJlZml4TGVuZ3RoID0gbGluZURhdGFbMF07XG4gICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gMDtcbiAgICAgIHRoaXMucHJlZml4Q29kZSA9IGxpbmVEYXRhWzFdO1xuICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm9ybWFsLCB1cHBlciByYW5nZSBvciBsb3dlciByYW5nZSBsaW5lLlxuICAgICAgLy8gVXBwZXIgcmFuZ2UgbGluZXMgYXJlIHByb2Nlc3NlZCBsaWtlIG5vcm1hbCBsaW5lcy5cbiAgICAgIHRoaXMuaXNPT0IgPSBmYWxzZTtcbiAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lRGF0YVswXTtcbiAgICAgIHRoaXMucHJlZml4TGVuZ3RoID0gbGluZURhdGFbMV07XG4gICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gbGluZURhdGFbMl07XG4gICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVszXTtcbiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gbGluZURhdGFbNF0gPT09IFwibG93ZXJcIjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBIdWZmbWFuVHJlZU5vZGUobGluZSkge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICBpZiAobGluZSkge1xuICAgICAgLy8gTGVhZiBub2RlXG4gICAgICB0aGlzLmlzTGVhZiA9IHRydWU7XG4gICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gbGluZS5yYW5nZUxlbmd0aDtcbiAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lLnJhbmdlTG93O1xuICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lLmlzTG93ZXJSYW5nZTtcbiAgICAgIHRoaXMuaXNPT0IgPSBsaW5lLmlzT09CO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbnRlcm1lZGlhdGUgb3Igcm9vdCBub2RlXG4gICAgICB0aGlzLmlzTGVhZiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEh1ZmZtYW5UcmVlTm9kZS5wcm90b3R5cGUgPSB7XG4gICAgYnVpbGRUcmVlKGxpbmUsIHNoaWZ0KSB7XG4gICAgICBjb25zdCBiaXQgPSAobGluZS5wcmVmaXhDb2RlID4+IHNoaWZ0KSAmIDE7XG4gICAgICBpZiAoc2hpZnQgPD0gMCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBsZWFmIG5vZGUuXG4gICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobGluZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDcmVhdGUgYW4gaW50ZXJtZWRpYXRlIG5vZGUgYW5kIGNvbnRpbnVlIHJlY3Vyc2l2ZWx5LlxuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuY2hpbGRyZW5bYml0XTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbltiaXRdID0gbm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5idWlsZFRyZWUobGluZSwgc2hpZnQgLSAxKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlY29kZU5vZGUocmVhZGVyKSB7XG4gICAgICBpZiAodGhpcy5pc0xlYWYpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPT0IpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBodE9mZnNldCA9IHJlYWRlci5yZWFkQml0cyh0aGlzLnJhbmdlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VMb3cgKyAodGhpcy5pc0xvd2VyUmFuZ2UgPyAtaHRPZmZzZXQgOiBodE9mZnNldCk7XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5jaGlsZHJlbltyZWFkZXIucmVhZEJpdCgpXTtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgSHVmZm1hbiBkYXRhXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGUuZGVjb2RlTm9kZShyZWFkZXIpO1xuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gSHVmZm1hblRhYmxlKGxpbmVzLCBwcmVmaXhDb2Rlc0RvbmUpIHtcbiAgICBpZiAoIXByZWZpeENvZGVzRG9uZSkge1xuICAgICAgdGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhsaW5lcyk7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBIdWZmbWFuIHRyZWUuXG4gICAgdGhpcy5yb290Tm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJvb3ROb2RlLmJ1aWxkVHJlZShsaW5lLCBsaW5lLnByZWZpeExlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEh1ZmZtYW5UYWJsZS5wcm90b3R5cGUgPSB7XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdE5vZGUuZGVjb2RlTm9kZShyZWFkZXIpO1xuICAgIH0sXG4gICAgYXNzaWduUHJlZml4Q29kZXMobGluZXMpIHtcbiAgICAgIC8vIEFubmV4IEIuMyBBc3NpZ25pbmcgdGhlIHByZWZpeCBjb2Rlcy5cbiAgICAgIGNvbnN0IGxpbmVzTGVuZ3RoID0gbGluZXMubGVuZ3RoO1xuICAgICAgbGV0IHByZWZpeExlbmd0aE1heCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcHJlZml4TGVuZ3RoTWF4ID0gTWF0aC5tYXgocHJlZml4TGVuZ3RoTWF4LCBsaW5lc1tpXS5wcmVmaXhMZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b2dyYW0gPSBuZXcgVWludDMyQXJyYXkocHJlZml4TGVuZ3RoTWF4ICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaGlzdG9ncmFtW2xpbmVzW2ldLnByZWZpeExlbmd0aF0rKztcbiAgICAgIH1cbiAgICAgIGxldCBjdXJyZW50TGVuZ3RoID0gMSxcbiAgICAgICAgZmlyc3RDb2RlID0gMCxcbiAgICAgICAgY3VycmVudENvZGUsXG4gICAgICAgIGN1cnJlbnRUZW1wLFxuICAgICAgICBsaW5lO1xuICAgICAgaGlzdG9ncmFtWzBdID0gMDtcblxuICAgICAgd2hpbGUgKGN1cnJlbnRMZW5ndGggPD0gcHJlZml4TGVuZ3RoTWF4KSB7XG4gICAgICAgIGZpcnN0Q29kZSA9IChmaXJzdENvZGUgKyBoaXN0b2dyYW1bY3VycmVudExlbmd0aCAtIDFdKSA8PCAxO1xuICAgICAgICBjdXJyZW50Q29kZSA9IGZpcnN0Q29kZTtcbiAgICAgICAgY3VycmVudFRlbXAgPSAwO1xuICAgICAgICB3aGlsZSAoY3VycmVudFRlbXAgPCBsaW5lc0xlbmd0aCkge1xuICAgICAgICAgIGxpbmUgPSBsaW5lc1tjdXJyZW50VGVtcF07XG4gICAgICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICBsaW5lLnByZWZpeENvZGUgPSBjdXJyZW50Q29kZTtcbiAgICAgICAgICAgIGN1cnJlbnRDb2RlKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRUZW1wKys7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudExlbmd0aCsrO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gZGVjb2RlVGFibGVzU2VnbWVudChkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgLy8gRGVjb2RlcyBhIFRhYmxlcyBzZWdtZW50LCBpLmUuLCBhIGN1c3RvbSBIdWZmbWFuIHRhYmxlLlxuICAgIC8vIEFubmV4IEIuMiBDb2RlIHRhYmxlIHN0cnVjdHVyZS5cbiAgICBjb25zdCBmbGFncyA9IGRhdGFbc3RhcnRdO1xuICAgIGNvbnN0IGxvd2VzdFZhbHVlID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDEpICYgMHhmZmZmZmZmZjtcbiAgICBjb25zdCBoaWdoZXN0VmFsdWUgPSByZWFkVWludDMyKGRhdGEsIHN0YXJ0ICsgNSkgJiAweGZmZmZmZmZmO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQgKyA5LCBlbmQpO1xuXG4gICAgY29uc3QgcHJlZml4U2l6ZUJpdHMgPSAoKGZsYWdzID4+IDEpICYgNykgKyAxO1xuICAgIGNvbnN0IHJhbmdlU2l6ZUJpdHMgPSAoKGZsYWdzID4+IDQpICYgNykgKyAxO1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgbGV0IHByZWZpeExlbmd0aCxcbiAgICAgIHJhbmdlTGVuZ3RoLFxuICAgICAgY3VycmVudFJhbmdlTG93ID0gbG93ZXN0VmFsdWU7XG5cbiAgICAvLyBOb3JtYWwgdGFibGUgbGluZXNcbiAgICBkbyB7XG4gICAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpO1xuICAgICAgcmFuZ2VMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocmFuZ2VTaXplQml0cyk7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBuZXcgSHVmZm1hbkxpbmUoW2N1cnJlbnRSYW5nZUxvdywgcHJlZml4TGVuZ3RoLCByYW5nZUxlbmd0aCwgMF0pXG4gICAgICApO1xuICAgICAgY3VycmVudFJhbmdlTG93ICs9IDEgPDwgcmFuZ2VMZW5ndGg7XG4gICAgfSB3aGlsZSAoY3VycmVudFJhbmdlTG93IDwgaGlnaGVzdFZhbHVlKTtcblxuICAgIC8vIExvd2VyIHJhbmdlIHRhYmxlIGxpbmVcbiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpO1xuICAgIGxpbmVzLnB1c2goXG4gICAgICBuZXcgSHVmZm1hbkxpbmUoW2xvd2VzdFZhbHVlIC0gMSwgcHJlZml4TGVuZ3RoLCAzMiwgMCwgXCJsb3dlclwiXSlcbiAgICApO1xuXG4gICAgLy8gVXBwZXIgcmFuZ2UgdGFibGUgbGluZVxuICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7XG4gICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2hpZ2hlc3RWYWx1ZSwgcHJlZml4TGVuZ3RoLCAzMiwgMF0pKTtcblxuICAgIGlmIChmbGFncyAmIDEpIHtcbiAgICAgIC8vIE91dC1vZi1iYW5kIHRhYmxlIGxpbmVcbiAgICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7XG4gICAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbcHJlZml4TGVuZ3RoLCAwXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSHVmZm1hblRhYmxlKGxpbmVzLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBzdGFuZGFyZFRhYmxlc0NhY2hlID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0U3RhbmRhcmRUYWJsZShudW1iZXIpIHtcbiAgICAvLyBBbm5leCBCLjUgU3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMuXG4gICAgbGV0IHRhYmxlID0gc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiAgICBsZXQgbGluZXM7XG4gICAgc3dpdGNoIChudW1iZXIpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWzAsIDEsIDQsIDB4MF0sXG4gICAgICAgICAgWzE2LCAyLCA4LCAweDJdLFxuICAgICAgICAgIFsyNzIsIDMsIDE2LCAweDZdLFxuICAgICAgICAgIFs2NTgwOCwgMywgMzIsIDB4N10sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbMCwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMSwgMiwgMCwgMHgyXSxcbiAgICAgICAgICBbMiwgMywgMCwgMHg2XSxcbiAgICAgICAgICBbMywgNCwgMywgMHhlXSxcbiAgICAgICAgICBbMTEsIDUsIDYsIDB4MWVdLFxuICAgICAgICAgIFs3NSwgNiwgMzIsIDB4M2VdLCAvLyB1cHBlclxuICAgICAgICAgIFs2LCAweDNmXSwgLy8gT09CXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTI1NiwgOCwgOCwgMHhmZV0sXG4gICAgICAgICAgWzAsIDEsIDAsIDB4MF0sXG4gICAgICAgICAgWzEsIDIsIDAsIDB4Ml0sXG4gICAgICAgICAgWzIsIDMsIDAsIDB4Nl0sXG4gICAgICAgICAgWzMsIDQsIDMsIDB4ZV0sXG4gICAgICAgICAgWzExLCA1LCA2LCAweDFlXSxcbiAgICAgICAgICBbLTI1NywgOCwgMzIsIDB4ZmYsIFwibG93ZXJcIl0sXG4gICAgICAgICAgWzc1LCA3LCAzMiwgMHg3ZV0sIC8vIHVwcGVyXG4gICAgICAgICAgWzYsIDB4M2VdLCAvLyBPT0JcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFszLCAzLCAwLCAweDZdLFxuICAgICAgICAgIFs0LCA0LCAzLCAweGVdLFxuICAgICAgICAgIFsxMiwgNSwgNiwgMHgxZV0sXG4gICAgICAgICAgWzc2LCA1LCAzMiwgMHgxZl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTI1NSwgNywgOCwgMHg3ZV0sXG4gICAgICAgICAgWzEsIDEsIDAsIDB4MF0sXG4gICAgICAgICAgWzIsIDIsIDAsIDB4Ml0sXG4gICAgICAgICAgWzMsIDMsIDAsIDB4Nl0sXG4gICAgICAgICAgWzQsIDQsIDMsIDB4ZV0sXG4gICAgICAgICAgWzEyLCA1LCA2LCAweDFlXSxcbiAgICAgICAgICBbLTI1NiwgNywgMzIsIDB4N2YsIFwibG93ZXJcIl0sXG4gICAgICAgICAgWzc2LCA2LCAzMiwgMHgzZV0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTIwNDgsIDUsIDEwLCAweDFjXSxcbiAgICAgICAgICBbLTEwMjQsIDQsIDksIDB4OF0sXG4gICAgICAgICAgWy01MTIsIDQsIDgsIDB4OV0sXG4gICAgICAgICAgWy0yNTYsIDQsIDcsIDB4YV0sXG4gICAgICAgICAgWy0xMjgsIDUsIDYsIDB4MWRdLFxuICAgICAgICAgIFstNjQsIDUsIDUsIDB4MWVdLFxuICAgICAgICAgIFstMzIsIDQsIDUsIDB4Yl0sXG4gICAgICAgICAgWzAsIDIsIDcsIDB4MF0sXG4gICAgICAgICAgWzEyOCwgMywgNywgMHgyXSxcbiAgICAgICAgICBbMjU2LCAzLCA4LCAweDNdLFxuICAgICAgICAgIFs1MTIsIDQsIDksIDB4Y10sXG4gICAgICAgICAgWzEwMjQsIDQsIDEwLCAweGRdLFxuICAgICAgICAgIFstMjA0OSwgNiwgMzIsIDB4M2UsIFwibG93ZXJcIl0sXG4gICAgICAgICAgWzIwNDgsIDYsIDMyLCAweDNmXSwgLy8gdXBwZXJcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFstMTAyNCwgNCwgOSwgMHg4XSxcbiAgICAgICAgICBbLTUxMiwgMywgOCwgMHgwXSxcbiAgICAgICAgICBbLTI1NiwgNCwgNywgMHg5XSxcbiAgICAgICAgICBbLTEyOCwgNSwgNiwgMHgxYV0sXG4gICAgICAgICAgWy02NCwgNSwgNSwgMHgxYl0sXG4gICAgICAgICAgWy0zMiwgNCwgNSwgMHhhXSxcbiAgICAgICAgICBbMCwgNCwgNSwgMHhiXSxcbiAgICAgICAgICBbMzIsIDUsIDUsIDB4MWNdLFxuICAgICAgICAgIFs2NCwgNSwgNiwgMHgxZF0sXG4gICAgICAgICAgWzEyOCwgNCwgNywgMHhjXSxcbiAgICAgICAgICBbMjU2LCAzLCA4LCAweDFdLFxuICAgICAgICAgIFs1MTIsIDMsIDksIDB4Ml0sXG4gICAgICAgICAgWzEwMjQsIDMsIDEwLCAweDNdLFxuICAgICAgICAgIFstMTAyNSwgNSwgMzIsIDB4MWUsIFwibG93ZXJcIl0sXG4gICAgICAgICAgWzIwNDgsIDUsIDMyLCAweDFmXSwgLy8gdXBwZXJcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFstMTUsIDgsIDMsIDB4ZmNdLFxuICAgICAgICAgIFstNywgOSwgMSwgMHgxZmNdLFxuICAgICAgICAgIFstNSwgOCwgMSwgMHhmZF0sXG4gICAgICAgICAgWy0zLCA5LCAwLCAweDFmZF0sXG4gICAgICAgICAgWy0yLCA3LCAwLCAweDdjXSxcbiAgICAgICAgICBbLTEsIDQsIDAsIDB4YV0sXG4gICAgICAgICAgWzAsIDIsIDEsIDB4MF0sXG4gICAgICAgICAgWzIsIDUsIDAsIDB4MWFdLFxuICAgICAgICAgIFszLCA2LCAwLCAweDNhXSxcbiAgICAgICAgICBbNCwgMywgNCwgMHg0XSxcbiAgICAgICAgICBbMjAsIDYsIDEsIDB4M2JdLFxuICAgICAgICAgIFsyMiwgNCwgNCwgMHhiXSxcbiAgICAgICAgICBbMzgsIDQsIDUsIDB4Y10sXG4gICAgICAgICAgWzcwLCA1LCA2LCAweDFiXSxcbiAgICAgICAgICBbMTM0LCA1LCA3LCAweDFjXSxcbiAgICAgICAgICBbMjYyLCA2LCA3LCAweDNjXSxcbiAgICAgICAgICBbMzkwLCA3LCA4LCAweDdkXSxcbiAgICAgICAgICBbNjQ2LCA2LCAxMCwgMHgzZF0sXG4gICAgICAgICAgWy0xNiwgOSwgMzIsIDB4MWZlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFsxNjcwLCA5LCAzMiwgMHgxZmZdLCAvLyB1cHBlclxuICAgICAgICAgIFsyLCAweDFdLCAvLyBPT0JcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFstMzEsIDgsIDQsIDB4ZmNdLFxuICAgICAgICAgIFstMTUsIDksIDIsIDB4MWZjXSxcbiAgICAgICAgICBbLTExLCA4LCAyLCAweGZkXSxcbiAgICAgICAgICBbLTcsIDksIDEsIDB4MWZkXSxcbiAgICAgICAgICBbLTUsIDcsIDEsIDB4N2NdLFxuICAgICAgICAgIFstMywgNCwgMSwgMHhhXSxcbiAgICAgICAgICBbLTEsIDMsIDEsIDB4Ml0sXG4gICAgICAgICAgWzEsIDMsIDEsIDB4M10sXG4gICAgICAgICAgWzMsIDUsIDEsIDB4MWFdLFxuICAgICAgICAgIFs1LCA2LCAxLCAweDNhXSxcbiAgICAgICAgICBbNywgMywgNSwgMHg0XSxcbiAgICAgICAgICBbMzksIDYsIDIsIDB4M2JdLFxuICAgICAgICAgIFs0MywgNCwgNSwgMHhiXSxcbiAgICAgICAgICBbNzUsIDQsIDYsIDB4Y10sXG4gICAgICAgICAgWzEzOSwgNSwgNywgMHgxYl0sXG4gICAgICAgICAgWzI2NywgNSwgOCwgMHgxY10sXG4gICAgICAgICAgWzUyMywgNiwgOCwgMHgzY10sXG4gICAgICAgICAgWzc3OSwgNywgOSwgMHg3ZF0sXG4gICAgICAgICAgWzEyOTEsIDYsIDExLCAweDNkXSxcbiAgICAgICAgICBbLTMyLCA5LCAzMiwgMHgxZmUsIFwibG93ZXJcIl0sXG4gICAgICAgICAgWzMzMzksIDksIDMyLCAweDFmZl0sIC8vIHVwcGVyXG4gICAgICAgICAgWzIsIDB4MF0sIC8vIE9PQlxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTA6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFstMjEsIDcsIDQsIDB4N2FdLFxuICAgICAgICAgIFstNSwgOCwgMCwgMHhmY10sXG4gICAgICAgICAgWy00LCA3LCAwLCAweDdiXSxcbiAgICAgICAgICBbLTMsIDUsIDAsIDB4MThdLFxuICAgICAgICAgIFstMiwgMiwgMiwgMHgwXSxcbiAgICAgICAgICBbMiwgNSwgMCwgMHgxOV0sXG4gICAgICAgICAgWzMsIDYsIDAsIDB4MzZdLFxuICAgICAgICAgIFs0LCA3LCAwLCAweDdjXSxcbiAgICAgICAgICBbNSwgOCwgMCwgMHhmZF0sXG4gICAgICAgICAgWzYsIDIsIDYsIDB4MV0sXG4gICAgICAgICAgWzcwLCA1LCA1LCAweDFhXSxcbiAgICAgICAgICBbMTAyLCA2LCA1LCAweDM3XSxcbiAgICAgICAgICBbMTM0LCA2LCA2LCAweDM4XSxcbiAgICAgICAgICBbMTk4LCA2LCA3LCAweDM5XSxcbiAgICAgICAgICBbMzI2LCA2LCA4LCAweDNhXSxcbiAgICAgICAgICBbNTgyLCA2LCA5LCAweDNiXSxcbiAgICAgICAgICBbMTA5NCwgNiwgMTAsIDB4M2NdLFxuICAgICAgICAgIFsyMTE4LCA3LCAxMSwgMHg3ZF0sXG4gICAgICAgICAgWy0yMiwgOCwgMzIsIDB4ZmUsIFwibG93ZXJcIl0sXG4gICAgICAgICAgWzQxNjYsIDgsIDMyLCAweGZmXSwgLy8gdXBwZXJcbiAgICAgICAgICBbMiwgMHgyXSwgLy8gT09CXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMTpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWzEsIDEsIDAsIDB4MF0sXG4gICAgICAgICAgWzIsIDIsIDEsIDB4Ml0sXG4gICAgICAgICAgWzQsIDQsIDAsIDB4Y10sXG4gICAgICAgICAgWzUsIDQsIDEsIDB4ZF0sXG4gICAgICAgICAgWzcsIDUsIDEsIDB4MWNdLFxuICAgICAgICAgIFs5LCA1LCAyLCAweDFkXSxcbiAgICAgICAgICBbMTMsIDYsIDIsIDB4M2NdLFxuICAgICAgICAgIFsxNywgNywgMiwgMHg3YV0sXG4gICAgICAgICAgWzIxLCA3LCAzLCAweDdiXSxcbiAgICAgICAgICBbMjksIDcsIDQsIDB4N2NdLFxuICAgICAgICAgIFs0NSwgNywgNSwgMHg3ZF0sXG4gICAgICAgICAgWzc3LCA3LCA2LCAweDdlXSxcbiAgICAgICAgICBbMTQxLCA3LCAzMiwgMHg3Zl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWzEsIDEsIDAsIDB4MF0sXG4gICAgICAgICAgWzIsIDIsIDAsIDB4Ml0sXG4gICAgICAgICAgWzMsIDMsIDEsIDB4Nl0sXG4gICAgICAgICAgWzUsIDUsIDAsIDB4MWNdLFxuICAgICAgICAgIFs2LCA1LCAxLCAweDFkXSxcbiAgICAgICAgICBbOCwgNiwgMSwgMHgzY10sXG4gICAgICAgICAgWzEwLCA3LCAwLCAweDdhXSxcbiAgICAgICAgICBbMTEsIDcsIDEsIDB4N2JdLFxuICAgICAgICAgIFsxMywgNywgMiwgMHg3Y10sXG4gICAgICAgICAgWzE3LCA3LCAzLCAweDdkXSxcbiAgICAgICAgICBbMjUsIDcsIDQsIDB4N2VdLFxuICAgICAgICAgIFs0MSwgOCwgNSwgMHhmZV0sXG4gICAgICAgICAgWzczLCA4LCAzMiwgMHhmZl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMzpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWzEsIDEsIDAsIDB4MF0sXG4gICAgICAgICAgWzIsIDMsIDAsIDB4NF0sXG4gICAgICAgICAgWzMsIDQsIDAsIDB4Y10sXG4gICAgICAgICAgWzQsIDUsIDAsIDB4MWNdLFxuICAgICAgICAgIFs1LCA0LCAxLCAweGRdLFxuICAgICAgICAgIFs3LCAzLCAzLCAweDVdLFxuICAgICAgICAgIFsxNSwgNiwgMSwgMHgzYV0sXG4gICAgICAgICAgWzE3LCA2LCAyLCAweDNiXSxcbiAgICAgICAgICBbMjEsIDYsIDMsIDB4M2NdLFxuICAgICAgICAgIFsyOSwgNiwgNCwgMHgzZF0sXG4gICAgICAgICAgWzQ1LCA2LCA1LCAweDNlXSxcbiAgICAgICAgICBbNzcsIDcsIDYsIDB4N2VdLFxuICAgICAgICAgIFsxNDEsIDcsIDMyLCAweDdmXSwgLy8gdXBwZXJcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE0OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTIsIDMsIDAsIDB4NF0sXG4gICAgICAgICAgWy0xLCAzLCAwLCAweDVdLFxuICAgICAgICAgIFswLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsxLCAzLCAwLCAweDZdLFxuICAgICAgICAgIFsyLCAzLCAwLCAweDddLFxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFstMjQsIDcsIDQsIDB4N2NdLFxuICAgICAgICAgIFstOCwgNiwgMiwgMHgzY10sXG4gICAgICAgICAgWy00LCA1LCAxLCAweDFjXSxcbiAgICAgICAgICBbLTIsIDQsIDAsIDB4Y10sXG4gICAgICAgICAgWy0xLCAzLCAwLCAweDRdLFxuICAgICAgICAgIFswLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsxLCAzLCAwLCAweDVdLFxuICAgICAgICAgIFsyLCA0LCAwLCAweGRdLFxuICAgICAgICAgIFszLCA1LCAxLCAweDFkXSxcbiAgICAgICAgICBbNSwgNiwgMiwgMHgzZF0sXG4gICAgICAgICAgWzksIDcsIDQsIDB4N2RdLFxuICAgICAgICAgIFstMjUsIDcsIDMyLCAweDdlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFsyNSwgNywgMzIsIDB4N2ZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBzdGFuZGFyZCB0YWJsZSBCLiR7bnVtYmVyfSBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGxpbmVzW2ldID0gbmV3IEh1ZmZtYW5MaW5lKGxpbmVzW2ldKTtcbiAgICB9XG4gICAgdGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGxpbmVzLCB0cnVlKTtcbiAgICBzdGFuZGFyZFRhYmxlc0NhY2hlW251bWJlcl0gPSB0YWJsZTtcbiAgICByZXR1cm4gdGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuZW5kID0gZW5kO1xuICAgIHRoaXMucG9zaXRpb24gPSBzdGFydDtcbiAgICB0aGlzLnNoaWZ0ID0gLTE7XG4gICAgdGhpcy5jdXJyZW50Qnl0ZSA9IDA7XG4gIH1cblxuICBSZWFkZXIucHJvdG90eXBlID0ge1xuICAgIHJlYWRCaXQoKSB7XG4gICAgICBpZiAodGhpcy5zaGlmdCA8IDApIHtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5lbmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImVuZCBvZiBkYXRhIHdoaWxlIHJlYWRpbmcgYml0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudEJ5dGUgPSB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTtcbiAgICAgICAgdGhpcy5zaGlmdCA9IDc7XG4gICAgICB9XG4gICAgICBjb25zdCBiaXQgPSAodGhpcy5jdXJyZW50Qnl0ZSA+PiB0aGlzLnNoaWZ0KSAmIDE7XG4gICAgICB0aGlzLnNoaWZ0LS07XG4gICAgICByZXR1cm4gYml0O1xuICAgIH0sXG5cbiAgICByZWFkQml0cyhudW1CaXRzKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gMCxcbiAgICAgICAgaTtcbiAgICAgIGZvciAoaSA9IG51bUJpdHMgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICByZXN1bHQgfD0gdGhpcy5yZWFkQml0KCkgPDwgaTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGJ5dGVBbGlnbigpIHtcbiAgICAgIHRoaXMuc2hpZnQgPSAtMTtcbiAgICB9LFxuXG4gICAgbmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTtcbiAgICB9LFxuICB9O1xuXG4gIGZ1bmN0aW9uIGdldEN1c3RvbUh1ZmZtYW5UYWJsZShpbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7XG4gICAgLy8gUmV0dXJucyBhIFRhYmxlcyBzZWdtZW50IHRoYXQgaGFzIGJlZW4gZWFybGllciBkZWNvZGVkLlxuICAgIC8vIFNlZSA3LjQuMi4xLjYgKHN5bWJvbCBkaWN0aW9uYXJ5KSBvciA3LjQuMy4xLjYgKHRleHQgcmVnaW9uKS5cbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSByZWZlcnJlZFRvLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gY3VzdG9tVGFibGVzW3JlZmVycmVkVG9baV1dO1xuICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHRhYmxlO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRJbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImNhbid0IGZpbmQgY3VzdG9tIEh1ZmZtYW4gdGFibGVcIik7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhcbiAgICB0ZXh0UmVnaW9uLFxuICAgIHJlZmVycmVkVG8sXG4gICAgY3VzdG9tVGFibGVzLFxuICAgIG51bWJlck9mU3ltYm9scyxcbiAgICByZWFkZXJcbiAgKSB7XG4gICAgLy8gNy40LjMuMS43IFN5bWJvbCBJRCBIdWZmbWFuIHRhYmxlIGRlY29kaW5nXG5cbiAgICAvLyBSZWFkIGNvZGUgbGVuZ3RocyBmb3IgUlVOQ09ERXMgMC4uLjM0LlxuICAgIGNvbnN0IGNvZGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMzQ7IGkrKykge1xuICAgICAgY29uc3QgY29kZUxlbmd0aCA9IHJlYWRlci5yZWFkQml0cyg0KTtcbiAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCBjb2RlTGVuZ3RoLCAwLCAwXSkpO1xuICAgIH1cbiAgICAvLyBBc3NpZ24gSHVmZm1hbiBjb2RlcyBmb3IgUlVOQ09ERXMuXG4gICAgY29uc3QgcnVuQ29kZXNUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTtcblxuICAgIC8vIFJlYWQgYSBIdWZmbWFuIGNvZGUgdXNpbmcgdGhlIGFzc2lnbm1lbnQgYWJvdmUuXG4gICAgLy8gSW50ZXJwcmV0IHRoZSBSVU5DT0RFIGNvZGVzIGFuZCB0aGUgYWRkaXRpb25hbCBiaXRzIChpZiBhbnkpLlxuICAgIGNvZGVzLmxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlN5bWJvbHM7ICkge1xuICAgICAgY29uc3QgY29kZUxlbmd0aCA9IHJ1bkNvZGVzVGFibGUuZGVjb2RlKHJlYWRlcik7XG4gICAgICBpZiAoY29kZUxlbmd0aCA+PSAzMikge1xuICAgICAgICBsZXQgcmVwZWF0ZWRMZW5ndGgsIG51bWJlck9mUmVwZWF0cywgajtcbiAgICAgICAgc3dpdGNoIChjb2RlTGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwibm8gcHJldmlvdXMgdmFsdWUgaW4gc3ltYm9sIElEIHRhYmxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDIpICsgMztcbiAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gY29kZXNbaSAtIDFdLnByZWZpeExlbmd0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoMykgKyAzO1xuICAgICAgICAgICAgcmVwZWF0ZWRMZW5ndGggPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cyg3KSArIDExO1xuICAgICAgICAgICAgcmVwZWF0ZWRMZW5ndGggPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUmVwZWF0czsgaisrKSB7XG4gICAgICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIHJlcGVhdGVkTGVuZ3RoLCAwLCAwXSkpO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIGNvZGVMZW5ndGgsIDAsIDBdKSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmVhZGVyLmJ5dGVBbGlnbigpO1xuICAgIGNvbnN0IHN5bWJvbElEVGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGNvZGVzLCBmYWxzZSk7XG5cbiAgICAvLyA3LjQuMy4xLjYgVGV4dCByZWdpb24gc2VnbWVudCBIdWZmbWFuIHRhYmxlIHNlbGVjdGlvblxuXG4gICAgbGV0IGN1c3RvbUluZGV4ID0gMCxcbiAgICAgIHRhYmxlRmlyc3RTLFxuICAgICAgdGFibGVEZWx0YVMsXG4gICAgICB0YWJsZURlbHRhVDtcblxuICAgIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRlMpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGFibGVGaXJzdFMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkZTICsgNik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICB0YWJsZUZpcnN0UyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgICApO1xuICAgICAgICBjdXN0b21JbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yXCIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFMpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMTpcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGFibGVEZWx0YVMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRTICsgOCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICB0YWJsZURlbHRhUyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgICApO1xuICAgICAgICBjdXN0b21JbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yXCIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFQpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMTpcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGFibGVEZWx0YVQgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRUICsgMTEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVEZWx0YVQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoXG4gICAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgICBjdXN0b21UYWJsZXNcbiAgICAgICAgKTtcbiAgICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvclwiKTtcbiAgICB9XG5cbiAgICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50KSB7XG4gICAgICAvLyBMb2FkIHRhYmxlcyBSRFcsIFJESCwgUkRYIGFuZCBSRFkuXG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN5bWJvbElEVGFibGUsXG4gICAgICB0YWJsZUZpcnN0UyxcbiAgICAgIHRhYmxlRGVsdGFTLFxuICAgICAgdGFibGVEZWx0YVQsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFN5bWJvbERpY3Rpb25hcnlIdWZmbWFuVGFibGVzKFxuICAgIGRpY3Rpb25hcnksXG4gICAgcmVmZXJyZWRUbyxcbiAgICBjdXN0b21UYWJsZXNcbiAgKSB7XG4gICAgLy8gNy40LjIuMS42IFN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgSHVmZm1hbiB0YWJsZSBzZWxlY3Rpb25cblxuICAgIGxldCBjdXN0b21JbmRleCA9IDAsXG4gICAgICB0YWJsZURlbHRhSGVpZ2h0LFxuICAgICAgdGFibGVEZWx0YVdpZHRoO1xuICAgIHN3aXRjaCAoZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3Rvcikge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgICB0YWJsZURlbHRhSGVpZ2h0ID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yICsgNCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICB0YWJsZURlbHRhSGVpZ2h0ID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICAgIGN1c3RvbUluZGV4LFxuICAgICAgICAgIHJlZmVycmVkVG8sXG4gICAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICAgICk7XG4gICAgICAgIGN1c3RvbUluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIEh1ZmZtYW4gREggc2VsZWN0b3JcIik7XG4gICAgfVxuXG4gICAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldFN0YW5kYXJkVGFibGUoZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvciArIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICAgIGN1c3RvbUluZGV4LFxuICAgICAgICAgIHJlZmVycmVkVG8sXG4gICAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICAgICk7XG4gICAgICAgIGN1c3RvbUluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIEh1ZmZtYW4gRFcgc2VsZWN0b3JcIik7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlQml0bWFwU2l6ZSwgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXM7XG4gICAgaWYgKGRpY3Rpb25hcnkuYml0bWFwU2l6ZVNlbGVjdG9yKSB7XG4gICAgICB0YWJsZUJpdG1hcFNpemUgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoXG4gICAgICAgIGN1c3RvbUluZGV4LFxuICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICBjdXN0b21UYWJsZXNcbiAgICAgICk7XG4gICAgICBjdXN0b21JbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUJpdG1hcFNpemUgPSBnZXRTdGFuZGFyZFRhYmxlKDEpO1xuICAgIH1cblxuICAgIGlmIChkaWN0aW9uYXJ5LmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3IpIHtcbiAgICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldFN0YW5kYXJkVGFibGUoMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlRGVsdGFIZWlnaHQsXG4gICAgICB0YWJsZURlbHRhV2lkdGgsXG4gICAgICB0YWJsZUJpdG1hcFNpemUsXG4gICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChyZWFkZXIsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBiaXRtYXAgPSBbXTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICBiaXRtYXAucHVzaChyb3cpO1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIHJvd1t4XSA9IHJlYWRlci5yZWFkQml0KCk7XG4gICAgICB9XG4gICAgICByZWFkZXIuYnl0ZUFsaWduKCk7XG4gICAgfVxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGVuZE9mQmxvY2spIHtcbiAgICAvLyBNTVIgaXMgdGhlIHNhbWUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGFzIHRoZSBQREYgZmlsdGVyXG4gICAgLy8gQ0NJVFRGYXhEZWNvZGUgd2l0aCAvSyAtMS5cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBLOiAtMSxcbiAgICAgIENvbHVtbnM6IHdpZHRoLFxuICAgICAgUm93czogaGVpZ2h0LFxuICAgICAgQmxhY2tJczE6IHRydWUsXG4gICAgICBFbmRPZkJsb2NrOiBlbmRPZkJsb2NrLFxuICAgIH07XG4gICAgY29uc3QgZGVjb2RlciA9IG5ldyBDQ0lUVEZheERlY29kZXIoaW5wdXQsIHBhcmFtcyk7XG4gICAgY29uc3QgYml0bWFwID0gW107XG4gICAgbGV0IGN1cnJlbnRCeXRlLFxuICAgICAgZW9mID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICBiaXRtYXAucHVzaChyb3cpO1xuICAgICAgbGV0IHNoaWZ0ID0gLTE7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgaWYgKHNoaWZ0IDwgMCkge1xuICAgICAgICAgIGN1cnJlbnRCeXRlID0gZGVjb2Rlci5yZWFkTmV4dENoYXIoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEJ5dGUgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgdG8gemVyby5cbiAgICAgICAgICAgIGN1cnJlbnRCeXRlID0gMDtcbiAgICAgICAgICAgIGVvZiA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNoaWZ0ID0gNztcbiAgICAgICAgfVxuICAgICAgICByb3dbeF0gPSAoY3VycmVudEJ5dGUgPj4gc2hpZnQpICYgMTtcbiAgICAgICAgc2hpZnQtLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW5kT2ZCbG9jayAmJiAhZW9mKSB7XG4gICAgICAvLyBSZWFkIHVudGlsIEVPRkIgaGFzIGJlZW4gY29uc3VtZWQuXG4gICAgICBjb25zdCBsb29rRm9yRU9GTGltaXQgPSA1O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rRm9yRU9GTGltaXQ7IGkrKykge1xuICAgICAgICBpZiAoZGVjb2Rlci5yZWFkTmV4dENoYXIoKSA9PT0gLTEpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEpiaWcySW1hZ2UoKSB7fVxuXG4gIEpiaWcySW1hZ2UucHJvdG90eXBlID0ge1xuICAgIHBhcnNlQ2h1bmtzKGNodW5rcykge1xuICAgICAgcmV0dXJuIHBhcnNlSmJpZzJDaHVua3MoY2h1bmtzKTtcbiAgICB9LFxuXG4gICAgcGFyc2UoZGF0YSkge1xuICAgICAgY29uc3QgeyBpbWdEYXRhLCB3aWR0aCwgaGVpZ2h0IH0gPSBwYXJzZUpiaWcyKGRhdGEpO1xuICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICByZXR1cm4gaW1nRGF0YTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBKYmlnMkltYWdlO1xufSkoKTtcblxuZXhwb3J0IHsgSmJpZzJJbWFnZSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTkgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIEJhc2VFeGNlcHRpb24sIHdhcm4gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGluaXRpYWxpemVyKSB7XG4gIGxldCBsb29rdXA7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICBsb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgaW5pdGlhbGl6ZXIobG9va3VwKTtcbiAgICAgIGluaXRpYWxpemVyID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGxvb2t1cDtcbiAgfTtcbn1cblxuY2xhc3MgTWlzc2luZ0RhdGFFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCkge1xuICAgIHN1cGVyKGBNaXNzaW5nIGRhdGEgWyR7YmVnaW59LCAke2VuZH0pYCk7XG4gICAgdGhpcy5iZWdpbiA9IGJlZ2luO1xuICAgIHRoaXMuZW5kID0gZW5kO1xuICB9XG59XG5cbmNsYXNzIFhSZWZFbnRyeUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuY2xhc3MgWFJlZlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYW4gaW5oZXJpdGFibGUgcHJvcGVydHkuXG4gKlxuICogSWYgdGhlIFBERiBzcGVjaWZpY2F0aW9uIGV4cGxpY2l0bHkgbGlzdHMgYSBwcm9wZXJ0eSBpbiBhIGRpY3Rpb25hcnkgYXNcbiAqIGluaGVyaXRhYmxlLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRpY3Rpb25hcnlcbiAqIGl0c2VsZiBvciBpbiBvbmUgb3IgbW9yZSBwYXJlbnRzIG9mIHRoZSBkaWN0aW9uYXJ5LlxuICpcbiAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSB0cmVlLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLFxuICogdGhlIHZhbHVlIGZvciB0aGUga2V5IGlzIHJldHVybmVkIG9yLCBpZiBgc3RvcFdoZW5Gb3VuZGAgaXMgYGZhbHNlYCwgYSBsaXN0XG4gKiBvZiB2YWx1ZXMgaXMgcmV0dXJuZWQuIFRvIGF2b2lkIGluZmluaXRlIGxvb3BzLCB0aGUgdHJhdmVyc2FsIGlzIHN0b3BwZWQgd2hlblxuICogdGhlIGxvb3AgbGltaXQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAcGFyYW0ge0RpY3R9IGRpY3QgLSBEaWN0aW9uYXJ5IGZyb20gd2hlcmUgdG8gc3RhcnQgdGhlIHRyYXZlcnNhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBmaW5kIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGdldEFycmF5IC0gV2hldGhlciBvciBub3QgdGhlIHZhbHVlIHNob3VsZCBiZSBmZXRjaGVkIGFzIGFuXG4gKiAgIGFycmF5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHBhcmFtIHtib29sZWFufSBzdG9wV2hlbkZvdW5kIC0gV2hldGhlciBvciBub3QgdG8gc3RvcCB0aGUgdHJhdmVyc2FsIHdoZW5cbiAqICAgdGhlIGtleSBpcyBmb3VuZC4gSWYgc2V0IHRvIGBmYWxzZWAsIHdlIGFsd2F5cyB3YWxrIHVwIHRoZSBlbnRpcmUgcGFyZW50XG4gKiAgIGNoYWluLCBmb3IgZXhhbXBsZSB0byBiZSBhYmxlIHRvIGZpbmQgYFxcUmVzb3VyY2VzYCBwbGFjZWQgb24gbXVsdGlwbGVcbiAqICAgbGV2ZWxzIG9mIHRoZSB0cmVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gKi9cbmZ1bmN0aW9uIGdldEluaGVyaXRhYmxlUHJvcGVydHkoe1xuICBkaWN0LFxuICBrZXksXG4gIGdldEFycmF5ID0gZmFsc2UsXG4gIHN0b3BXaGVuRm91bmQgPSB0cnVlLFxufSkge1xuICBjb25zdCBMT09QX0xJTUlUID0gMTAwO1xuICBsZXQgbG9vcENvdW50ID0gMDtcbiAgbGV0IHZhbHVlcztcblxuICB3aGlsZSAoZGljdCkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoc3RvcFdoZW5Gb3VuZCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKCsrbG9vcENvdW50ID4gTE9PUF9MSU1JVCkge1xuICAgICAgd2FybihgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTogbWF4aW11bSBsb29wIGNvdW50IGV4Y2VlZGVkIGZvciBcIiR7a2V5fVwiYCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGljdCA9IGRpY3QuZ2V0KFwiUGFyZW50XCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgUk9NQU5fTlVNQkVSX01BUCA9IFtcbiAgXCJcIiwgXCJDXCIsIFwiQ0NcIiwgXCJDQ0NcIiwgXCJDRFwiLCBcIkRcIiwgXCJEQ1wiLCBcIkRDQ1wiLCBcIkRDQ0NcIiwgXCJDTVwiLFxuICBcIlwiLCBcIlhcIiwgXCJYWFwiLCBcIlhYWFwiLCBcIlhMXCIsIFwiTFwiLCBcIkxYXCIsIFwiTFhYXCIsIFwiTFhYWFwiLCBcIlhDXCIsXG4gIFwiXCIsIFwiSVwiLCBcIklJXCIsIFwiSUlJXCIsIFwiSVZcIiwgXCJWXCIsIFwiVklcIiwgXCJWSUlcIiwgXCJWSUlJXCIsIFwiSVhcIlxuXTtcblxuLyoqXG4gKiBDb252ZXJ0cyBwb3NpdGl2ZSBpbnRlZ2VycyB0byAodXBwZXIgY2FzZSkgUm9tYW4gbnVtZXJhbHMuXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIC0gVGhlIG51bWJlciB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxvd2VyQ2FzZSAtIEluZGljYXRlcyBpZiB0aGUgcmVzdWx0IHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAqICAgdG8gbG93ZXIgY2FzZSBsZXR0ZXJzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHJlc3VsdGluZyBSb21hbiBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhudW1iZXIsIGxvd2VyQ2FzZSA9IGZhbHNlKSB7XG4gIGFzc2VydChcbiAgICBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcikgJiYgbnVtYmVyID4gMCxcbiAgICBcIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cIlxuICApO1xuICBjb25zdCByb21hbkJ1ZiA9IFtdO1xuICBsZXQgcG9zO1xuICAvLyBUaG91c2FuZHNcbiAgd2hpbGUgKG51bWJlciA+PSAxMDAwKSB7XG4gICAgbnVtYmVyIC09IDEwMDA7XG4gICAgcm9tYW5CdWYucHVzaChcIk1cIik7XG4gIH1cbiAgLy8gSHVuZHJlZHNcbiAgcG9zID0gKG51bWJlciAvIDEwMCkgfCAwO1xuICBudW1iZXIgJT0gMTAwO1xuICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbcG9zXSk7XG4gIC8vIFRlbnNcbiAgcG9zID0gKG51bWJlciAvIDEwKSB8IDA7XG4gIG51bWJlciAlPSAxMDtcbiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzEwICsgcG9zXSk7XG4gIC8vIE9uZXNcbiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyXSk7XG5cbiAgY29uc3Qgcm9tYW5TdHIgPSByb21hbkJ1Zi5qb2luKFwiXCIpO1xuICByZXR1cm4gbG93ZXJDYXNlID8gcm9tYW5TdHIudG9Mb3dlckNhc2UoKSA6IHJvbWFuU3RyO1xufVxuXG4vLyBDYWxjdWxhdGUgdGhlIGJhc2UgMiBsb2dhcml0aG0gb2YgdGhlIG51bWJlciBgeGAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZVxuLy8gbmF0aXZlIGZ1bmN0aW9uIGluIHRoZSBzZW5zZSB0aGF0IGl0IHJldHVybnMgdGhlIGNlaWxpbmcgdmFsdWUgYW5kIHRoYXQgaXRcbi8vIHJldHVybnMgMCBpbnN0ZWFkIG9mIGBJbmZpbml0eWAvYE5hTmAgZm9yIGB4YCB2YWx1ZXMgc21hbGxlciB0aGFuL2VxdWFsIHRvIDAuXG5mdW5jdGlvbiBsb2cyKHgpIHtcbiAgaWYgKHggPD0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwoTWF0aC5sb2cyKHgpKTtcbn1cblxuZnVuY3Rpb24gcmVhZEludDgoZGF0YSwgb2Zmc2V0KSB7XG4gIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDI0KSA+PiAyNDtcbn1cblxuZnVuY3Rpb24gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpIHtcbiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgOCkgfCBkYXRhW29mZnNldCArIDFdO1xufVxuXG5mdW5jdGlvbiByZWFkVWludDMyKGRhdGEsIG9mZnNldCkge1xuICByZXR1cm4gKFxuICAgICgoZGF0YVtvZmZzZXRdIDw8IDI0KSB8XG4gICAgICAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICAgKGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICAgZGF0YVtvZmZzZXQgKyAzXSkgPj4+XG4gICAgMFxuICApO1xufVxuXG4vLyBDaGVja3MgaWYgY2ggaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogU1BBQ0UsIFRBQiwgQ1Igb3IgTEYuXG5mdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHtcbiAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhO1xufVxuXG5leHBvcnQge1xuICBnZXRMb29rdXBUYWJsZUZhY3RvcnksXG4gIE1pc3NpbmdEYXRhRXhjZXB0aW9uLFxuICBYUmVmRW50cnlFeGNlcHRpb24sXG4gIFhSZWZQYXJzZUV4Y2VwdGlvbixcbiAgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSxcbiAgdG9Sb21hbk51bWVyYWxzLFxuICBsb2cyLFxuICByZWFkSW50OCxcbiAgcmVhZFVpbnQxNixcbiAgcmVhZFVpbnQzMixcbiAgaXNXaGl0ZVNwYWNlLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuLy8gVGFibGUgQy0yXG5jb25zdCBRZVRhYmxlID0gW1xuICB7IHFlOiAweDU2MDEsIG5tcHM6IDEsIG5scHM6IDEsIHN3aXRjaEZsYWc6IDEgfSxcbiAgeyBxZTogMHgzNDAxLCBubXBzOiAyLCBubHBzOiA2LCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4MTgwMSwgbm1wczogMywgbmxwczogOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDBhYzEsIG5tcHM6IDQsIG5scHM6IDEyLCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4MDUyMSwgbm1wczogNSwgbmxwczogMjksIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMjIxLCBubXBzOiAzOCwgbmxwczogMzMsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg1NjAxLCBubXBzOiA3LCBubHBzOiA2LCBzd2l0Y2hGbGFnOiAxIH0sXG4gIHsgcWU6IDB4NTQwMSwgbm1wczogOCwgbmxwczogMTQsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg0ODAxLCBubXBzOiA5LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM4MDEsIG5tcHM6IDEwLCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDMwMDEsIG5tcHM6IDExLCBubHBzOiAxNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI0MDEsIG5tcHM6IDEyLCBubHBzOiAxOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDFjMDEsIG5tcHM6IDEzLCBubHBzOiAyMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE2MDEsIG5tcHM6IDI5LCBubHBzOiAyMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDU2MDEsIG5tcHM6IDE1LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMSB9LFxuICB7IHFlOiAweDU0MDEsIG5tcHM6IDE2LCBubHBzOiAxNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDUxMDEsIG5tcHM6IDE3LCBubHBzOiAxNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDQ4MDEsIG5tcHM6IDE4LCBubHBzOiAxNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM4MDEsIG5tcHM6IDE5LCBubHBzOiAxNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDM0MDEsIG5tcHM6IDIwLCBubHBzOiAxOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDMwMDEsIG5tcHM6IDIxLCBubHBzOiAxOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI4MDEsIG5tcHM6IDIyLCBubHBzOiAxOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDI0MDEsIG5tcHM6IDIzLCBubHBzOiAyMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDIyMDEsIG5tcHM6IDI0LCBubHBzOiAyMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDFjMDEsIG5tcHM6IDI1LCBubHBzOiAyMiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE4MDEsIG5tcHM6IDI2LCBubHBzOiAyMywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE2MDEsIG5tcHM6IDI3LCBubHBzOiAyNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE0MDEsIG5tcHM6IDI4LCBubHBzOiAyNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDEyMDEsIG5tcHM6IDI5LCBubHBzOiAyNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDExMDEsIG5tcHM6IDMwLCBubHBzOiAyNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDBhYzEsIG5tcHM6IDMxLCBubHBzOiAyOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA5YzEsIG5tcHM6IDMyLCBubHBzOiAyOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA4YTEsIG5tcHM6IDMzLCBubHBzOiAzMCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA1MjEsIG5tcHM6IDM0LCBubHBzOiAzMSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA0NDEsIG5tcHM6IDM1LCBubHBzOiAzMiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAyYTEsIG5tcHM6IDM2LCBubHBzOiAzMywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAyMjEsIG5tcHM6IDM3LCBubHBzOiAzNCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAxNDEsIG5tcHM6IDM4LCBubHBzOiAzNSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAxMTEsIG5tcHM6IDM5LCBubHBzOiAzNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwODUsIG5tcHM6IDQwLCBubHBzOiAzNywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwNDksIG5tcHM6IDQxLCBubHBzOiAzOCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMjUsIG5tcHM6IDQyLCBubHBzOiAzOSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMTUsIG5tcHM6IDQzLCBubHBzOiA0MCwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDksIG5tcHM6IDQ0LCBubHBzOiA0MSwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDUsIG5tcHM6IDQ1LCBubHBzOiA0Miwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDAwMDEsIG5tcHM6IDQ1LCBubHBzOiA0Mywgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDU2MDEsIG5tcHM6IDQ2LCBubHBzOiA0Niwgc3dpdGNoRmxhZzogMCB9LFxuXTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFFNIENvZGVyIGRlY29kaW5nIGFzIGRlZmluZWQgaW5cbiAqICAgSlBFRyAyMDAwIFBhcnQgSSBGaW5hbCBDb21taXR0ZWUgRHJhZnQgVmVyc2lvbiAxLjBcbiAqICAgQW5uZXggQy4zIEFyaXRobWV0aWMgZGVjb2RpbmcgcHJvY2VkdXJlXG4gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qcGVnLm9yZy9wdWJsaWMvZmNkMTU0NDQtMS5wZGZcbiAqXG4gKiBUaGUgYXJpdGhtZXRpYyBkZWNvZGVyIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBjb250ZXh0IG1vZGVscyB0byBkZWNvZGVcbiAqIEpQRUcyMDAwIGFuZCBKQklHMiBzdHJlYW1zLlxuICovXG5jbGFzcyBBcml0aG1ldGljRGVjb2RlciB7XG4gIC8vIEMuMy41IEluaXRpYWxpc2F0aW9uIG9mIHRoZSBkZWNvZGVyIChJTklUREVDKVxuICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLmJwID0gc3RhcnQ7XG4gICAgdGhpcy5kYXRhRW5kID0gZW5kO1xuXG4gICAgdGhpcy5jaGlnaCA9IGRhdGFbc3RhcnRdO1xuICAgIHRoaXMuY2xvdyA9IDA7XG5cbiAgICB0aGlzLmJ5dGVJbigpO1xuXG4gICAgdGhpcy5jaGlnaCA9ICgodGhpcy5jaGlnaCA8PCA3KSAmIDB4ZmZmZikgfCAoKHRoaXMuY2xvdyA+PiA5KSAmIDB4N2YpO1xuICAgIHRoaXMuY2xvdyA9ICh0aGlzLmNsb3cgPDwgNykgJiAweGZmZmY7XG4gICAgdGhpcy5jdCAtPSA3O1xuICAgIHRoaXMuYSA9IDB4ODAwMDtcbiAgfVxuXG4gIC8vIEMuMy40IENvbXByZXNzZWQgZGF0YSBpbnB1dCAoQllURUlOKVxuICBieXRlSW4oKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBsZXQgYnAgPSB0aGlzLmJwO1xuXG4gICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7XG4gICAgICBpZiAoZGF0YVticCArIDFdID4gMHg4Zikge1xuICAgICAgICB0aGlzLmNsb3cgKz0gMHhmZjAwO1xuICAgICAgICB0aGlzLmN0ID0gODtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJwKys7XG4gICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5O1xuICAgICAgICB0aGlzLmN0ID0gNztcbiAgICAgICAgdGhpcy5icCA9IGJwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBicCsrO1xuICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDtcbiAgICAgIHRoaXMuY3QgPSA4O1xuICAgICAgdGhpcy5icCA9IGJwO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbG93ID4gMHhmZmZmKSB7XG4gICAgICB0aGlzLmNoaWdoICs9IHRoaXMuY2xvdyA+PiAxNjtcbiAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7XG4gICAgfVxuICB9XG5cbiAgLy8gQy4zLjIgRGVjb2RpbmcgYSBkZWNpc2lvbiAoREVDT0RFKVxuICByZWFkQml0KGNvbnRleHRzLCBwb3MpIHtcbiAgICAvLyBDb250ZXh0cyBhcmUgcGFja2VkIGludG8gMSBieXRlOlxuICAgIC8vIGhpZ2hlc3QgNyBiaXRzIGNhcnJ5IGN4LmluZGV4LCBsb3dlc3QgYml0IGNhcnJpZXMgY3gubXBzXG4gICAgbGV0IGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLFxuICAgICAgY3hfbXBzID0gY29udGV4dHNbcG9zXSAmIDE7XG4gICAgY29uc3QgcWVUYWJsZUljeCA9IFFlVGFibGVbY3hfaW5kZXhdO1xuICAgIGNvbnN0IHFlSWN4ID0gcWVUYWJsZUljeC5xZTtcbiAgICBsZXQgZDtcbiAgICBsZXQgYSA9IHRoaXMuYSAtIHFlSWN4O1xuXG4gICAgaWYgKHRoaXMuY2hpZ2ggPCBxZUljeCkge1xuICAgICAgLy8gZXhjaGFuZ2VMcHNcbiAgICAgIGlmIChhIDwgcWVJY3gpIHtcbiAgICAgICAgYSA9IHFlSWN4O1xuICAgICAgICBkID0gY3hfbXBzO1xuICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGEgPSBxZUljeDtcbiAgICAgICAgZCA9IDEgXiBjeF9tcHM7XG4gICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHtcbiAgICAgICAgICBjeF9tcHMgPSBkO1xuICAgICAgICB9XG4gICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoaWdoIC09IHFlSWN4O1xuICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkge1xuICAgICAgICB0aGlzLmEgPSBhO1xuICAgICAgICByZXR1cm4gY3hfbXBzO1xuICAgICAgfVxuICAgICAgLy8gZXhjaGFuZ2VNcHNcbiAgICAgIGlmIChhIDwgcWVJY3gpIHtcbiAgICAgICAgZCA9IDEgXiBjeF9tcHM7XG4gICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHtcbiAgICAgICAgICBjeF9tcHMgPSBkO1xuICAgICAgICB9XG4gICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZCA9IGN4X21wcztcbiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5tcHM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEMuMy4zIHJlbm9ybUQ7XG4gICAgZG8ge1xuICAgICAgaWYgKHRoaXMuY3QgPT09IDApIHtcbiAgICAgICAgdGhpcy5ieXRlSW4oKTtcbiAgICAgIH1cblxuICAgICAgYSA8PD0gMTtcbiAgICAgIHRoaXMuY2hpZ2ggPSAoKHRoaXMuY2hpZ2ggPDwgMSkgJiAweGZmZmYpIHwgKCh0aGlzLmNsb3cgPj4gMTUpICYgMSk7XG4gICAgICB0aGlzLmNsb3cgPSAodGhpcy5jbG93IDw8IDEpICYgMHhmZmZmO1xuICAgICAgdGhpcy5jdC0tO1xuICAgIH0gd2hpbGUgKChhICYgMHg4MDAwKSA9PT0gMCk7XG4gICAgdGhpcy5hID0gYTtcblxuICAgIGNvbnRleHRzW3Bvc10gPSAoY3hfaW5kZXggPDwgMSkgfCBjeF9tcHM7XG4gICAgcmV0dXJuIGQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgQXJpdGhtZXRpY0RlY29kZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogQ29weXJpZ2h0IDE5OTYtMjAwMyBHbHlwaCAmIENvZywgTExDXG4gKlxuICogVGhlIENDSVRUIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgSmF2YVNjcmlwdCBwb3J0XG4gKiBvZiBYUERGJ3MgaW1wbGVtZW50YXRpb24sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlXG4gKiBsaWNlbnNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ0NJVFRGYXhEZWNvZGVyU291cmNlXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBuZXh0IC0gTWV0aG9kIHRoYXQgcmV0dXJuIG9uZSBieXRlIG9mIGRhdGEgZm9yIGRlY29kaW5nLFxuICogICBvciAtMSB3aGVuIEVPRiBpcyByZWFjaGVkLlxuICovXG5cbmltcG9ydCB7IGluZm8gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcblxuY29uc3QgQ0NJVFRGYXhEZWNvZGVyID0gKGZ1bmN0aW9uIENDSVRURmF4RGVjb2RlcigpIHtcbiAgY29uc3QgY2NpdHRFT0wgPSAtMjtcbiAgY29uc3QgY2NpdHRFT0YgPSAtMTtcbiAgY29uc3QgdHdvRGltUGFzcyA9IDA7XG4gIGNvbnN0IHR3b0RpbUhvcml6ID0gMTtcbiAgY29uc3QgdHdvRGltVmVydDAgPSAyO1xuICBjb25zdCB0d29EaW1WZXJ0UjEgPSAzO1xuICBjb25zdCB0d29EaW1WZXJ0TDEgPSA0O1xuICBjb25zdCB0d29EaW1WZXJ0UjIgPSA1O1xuICBjb25zdCB0d29EaW1WZXJ0TDIgPSA2O1xuICBjb25zdCB0d29EaW1WZXJ0UjMgPSA3O1xuICBjb25zdCB0d29EaW1WZXJ0TDMgPSA4O1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCB0d29EaW1UYWJsZSA9IFtcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMHhcbiAgICBbNywgdHdvRGltVmVydEwzXSwgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTBcbiAgICBbNywgdHdvRGltVmVydFIzXSwgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTFcbiAgICBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRMMl0sIC8vIDAwMDAxMHhcbiAgICBbNiwgdHdvRGltVmVydFIyXSwgWzYsIHR3b0RpbVZlcnRSMl0sIC8vIDAwMDAxMXhcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgICAgIC8vIDAwMDF4eHhcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCAgIC8vIDAwMXh4eHhcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgLy8gMDEweHh4eFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIC8vIDAxMXh4eHhcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgICAvLyAxeHh4eHh4XG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXVxuICBdO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCB3aGl0ZVRhYmxlMSA9IFtcbiAgICBbLTEsIC0xXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDBcbiAgICBbMTIsIGNjaXR0RU9MXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDFcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMXhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDAxeHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDEweHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDExeHhcbiAgICBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCAgICAgICAgICAgICAgICAgLy8gMTAwMHhcbiAgICBbMTIsIDE5ODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAwMTBcbiAgICBbMTIsIDIwNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAwMTFcbiAgICBbMTIsIDIxMTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMDBcbiAgICBbMTIsIDIxNzZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMDFcbiAgICBbMTIsIDIyNDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMTBcbiAgICBbMTIsIDIzMDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAxMTFcbiAgICBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCAgICAgICAgICAgICAgICAgLy8gMTEwMHhcbiAgICBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCAgICAgICAgICAgICAgICAgLy8gMTEwMXhcbiAgICBbMTIsIDIzNjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMDBcbiAgICBbMTIsIDI0MzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMDFcbiAgICBbMTIsIDI0OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMTBcbiAgICBbMTIsIDI1NjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTExMTFcbiAgXTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3Qgd2hpdGVUYWJsZTIgPSBbXG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAvLyAwMDAwMDAweHhcbiAgICBbOCwgMjldLCBbOCwgMjldLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEweFxuICAgIFs4LCAzMF0sIFs4LCAzMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTF4XG4gICAgWzgsIDQ1XSwgWzgsIDQ1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMHhcbiAgICBbOCwgNDZdLCBbOCwgNDZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxeFxuICAgIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sICAgICAgICAgLy8gMDAwMDAxMXh4XG4gICAgWzcsIDIzXSwgWzcsIDIzXSwgWzcsIDIzXSwgWzcsIDIzXSwgICAgICAgICAvLyAwMDAwMTAweHhcbiAgICBbOCwgNDddLCBbOCwgNDddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMDEweFxuICAgIFs4LCA0OF0sIFs4LCA0OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDEwMTF4XG4gICAgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgICAgICAgICAvLyAwMDAwMTF4eHhcbiAgICBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLFxuICAgIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sICAgICAgICAgLy8gMDAwMTAwMHh4XG4gICAgWzgsIDMzXSwgWzgsIDMzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDAxMHhcbiAgICBbOCwgMzRdLCBbOCwgMzRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMDExeFxuICAgIFs4LCAzNV0sIFs4LCAzNV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAxMDB4XG4gICAgWzgsIDM2XSwgWzgsIDM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDEwMXhcbiAgICBbOCwgMzddLCBbOCwgMzddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMTEweFxuICAgIFs4LCAzOF0sIFs4LCAzOF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAxMTF4XG4gICAgWzcsIDE5XSwgWzcsIDE5XSwgWzcsIDE5XSwgWzcsIDE5XSwgICAgICAgICAvLyAwMDAxMTAweHhcbiAgICBbOCwgMzFdLCBbOCwgMzFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDExMDEweFxuICAgIFs4LCAzMl0sIFs4LCAzMl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTEwMTF4XG4gICAgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCAgICAgICAgICAgICAvLyAwMDAxMTF4eHhcbiAgICBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sXG4gICAgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgICAgICAgICAvLyAwMDEwMDB4eHhcbiAgICBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLFxuICAgIFs4LCA1M10sIFs4LCA1M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDAxMDB4XG4gICAgWzgsIDU0XSwgWzgsIDU0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMDEwMXhcbiAgICBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCAgICAgICAgIC8vIDAwMTAwMTF4eFxuICAgIFs4LCAzOV0sIFs4LCAzOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDEwMDB4XG4gICAgWzgsIDQwXSwgWzgsIDQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMTAwMXhcbiAgICBbOCwgNDFdLCBbOCwgNDFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAxMDEweFxuICAgIFs4LCA0Ml0sIFs4LCA0Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDEwMTF4XG4gICAgWzgsIDQzXSwgWzgsIDQzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMTEwMHhcbiAgICBbOCwgNDRdLCBbOCwgNDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAxMTAxeFxuICAgIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyMV0sICAgICAgICAgLy8gMDAxMDExMXh4XG4gICAgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgICAgICAgICAvLyAwMDExMDAweHhcbiAgICBbOCwgNjFdLCBbOCwgNjFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTEwMDEweFxuICAgIFs4LCA2Ml0sIFs4LCA2Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMTAwMTF4XG4gICAgWzgsIDYzXSwgWzgsIDYzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDExMDEwMHhcbiAgICBbOCwgMF0sIFs4LCAwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTEwMTAxeFxuICAgIFs4LCAzMjBdLCBbOCwgMzIwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMTAxMTB4XG4gICAgWzgsIDM4NF0sIFs4LCAzODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDExMDExMXhcbiAgICBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCAgICAgICAgIC8vIDAwMTExeHh4eFxuICAgIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sXG4gICAgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSxcbiAgICBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLFxuICAgIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sICAgICAgICAgLy8gMDEwMDB4eHh4XG4gICAgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSxcbiAgICBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLFxuICAgIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sXG4gICAgWzcsIDI3XSwgWzcsIDI3XSwgWzcsIDI3XSwgWzcsIDI3XSwgICAgICAgICAvLyAwMTAwMTAweHhcbiAgICBbOCwgNTldLCBbOCwgNTldLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDAxMDEweFxuICAgIFs4LCA2MF0sIFs4LCA2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMDEwMTF4XG4gICAgWzksIDE0NzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAwMTEwMDBcbiAgICBbOSwgMTUzNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDAxMTAwMVxuICAgIFs5LCAxNjAwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMDExMDEwXG4gICAgWzksIDE3MjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAwMTEwMTFcbiAgICBbNywgMThdLCBbNywgMThdLCBbNywgMThdLCBbNywgMThdLCAgICAgICAgIC8vIDAxMDAxMTF4eFxuICAgIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sICAgICAgICAgLy8gMDEwMTAwMHh4XG4gICAgWzgsIDQ5XSwgWzgsIDQ5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMDAxMHhcbiAgICBbOCwgNTBdLCBbOCwgNTBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDEwMDExeFxuICAgIFs4LCA1MV0sIFs4LCA1MV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTAxMDB4XG4gICAgWzgsIDUyXSwgWzgsIDUyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMDEwMXhcbiAgICBbNywgMjVdLCBbNywgMjVdLCBbNywgMjVdLCBbNywgMjVdLCAgICAgICAgIC8vIDAxMDEwMTF4eFxuICAgIFs4LCA1NV0sIFs4LCA1NV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTEwMDB4XG4gICAgWzgsIDU2XSwgWzgsIDU2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMTAwMXhcbiAgICBbOCwgNTddLCBbOCwgNTddLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDExMDEweFxuICAgIFs4LCA1OF0sIFs4LCA1OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTEwMTF4XG4gICAgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sICAgICAvLyAwMTAxMTF4eHhcbiAgICBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSxcbiAgICBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIC8vIDAxMTAwMHh4eFxuICAgIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSxcbiAgICBbOCwgNDQ4XSwgWzgsIDQ0OF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAwMTAweFxuICAgIFs4LCA1MTJdLCBbOCwgNTEyXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDAxMDF4XG4gICAgWzksIDcwNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMDExMDBcbiAgICBbOSwgNzY4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAwMTEwMVxuICAgIFs4LCA2NDBdLCBbOCwgNjQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDAxMTF4XG4gICAgWzgsIDU3Nl0sIFs4LCA1NzZdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAwMHhcbiAgICBbOSwgODMyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMDAxMFxuICAgIFs5LCA4OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMDExXG4gICAgWzksIDk2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAxMDBcbiAgICBbOSwgMTAyNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMDEwMVxuICAgIFs5LCAxMDg4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMTEwXG4gICAgWzksIDExNTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAxMTFcbiAgICBbOSwgMTIxNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMTAwMFxuICAgIFs5LCAxMjgwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDExMDAxXG4gICAgWzksIDEzNDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTEwMTBcbiAgICBbOSwgMTQwOF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMTAxMVxuICAgIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCAgICAgLy8gMDExMDExMXh4XG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCAgICAgICAgICAgICAvLyAwMTExeHh4eHhcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSxcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSxcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCAgICAgICAgICAgICAvLyAxMDAweHh4eHhcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSxcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSxcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sICAgICAvLyAxMDAxMHh4eHhcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSxcbiAgICBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sICAgICAgICAgICAgIC8vIDEwMDExeHh4eFxuICAgIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSxcbiAgICBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sXG4gICAgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLFxuICAgIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgICAgICAgICAgICAgLy8gMTAxMDB4eHh4XG4gICAgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLFxuICAgIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSxcbiAgICBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sXG4gICAgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgICAgICAgICAvLyAxMDEwMTB4eHhcbiAgICBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLFxuICAgIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sICAgICAgICAgLy8gMTAxMDExeHh4XG4gICAgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sICAgICAgICAgICAgIC8vIDEwMTF4eHh4eFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sICAgICAgICAgICAgIC8vIDExMDB4eHh4eFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCAgICAgICAgIC8vIDExMDEwMHh4eFxuICAgIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sXG4gICAgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgICAgICAgICAvLyAxMTAxMDF4eHhcbiAgICBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLFxuICAgIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sICAgICAgICAgLy8gMTEwMTF4eHh4XG4gICAgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSxcbiAgICBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLFxuICAgIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCAgICAgICAgICAgICAvLyAxMTEweHh4eHhcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSxcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSxcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCAgICAgICAgICAgICAvLyAxMTExeHh4eHhcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSxcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSxcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN11cbiAgXTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3QgYmxhY2tUYWJsZTEgPSBbXG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDAwMDAweFxuICAgIFsxMiwgY2NpdHRFT0xdLCBbMTIsIGNjaXR0RU9MXSwgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAwMDAwMXhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDAwMXh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAwMTB4eFxuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgIC8vIDAwMDAwMDAwMDExeHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDEwMHh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAxMDF4eFxuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgIC8vIDAwMDAwMDAwMTEweHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDExMXh4XG4gICAgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgLy8gMDAwMDAwMDEwMDB4eFxuICAgIFsxMiwgMTk4NF0sIFsxMiwgMTk4NF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMDAxMHhcbiAgICBbMTIsIDIwNDhdLCBbMTIsIDIwNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTAwMTF4XG4gICAgWzEyLCAyMTEyXSwgWzEyLCAyMTEyXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDEwMTAweFxuICAgIFsxMiwgMjE3Nl0sIFsxMiwgMjE3Nl0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMDEwMXhcbiAgICBbMTIsIDIyNDBdLCBbMTIsIDIyNDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTAxMTB4XG4gICAgWzEyLCAyMzA0XSwgWzEyLCAyMzA0XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDEwMTExeFxuICAgIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIC8vIDAwMDAwMDAxMTAweHhcbiAgICBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCAvLyAwMDAwMDAwMTEwMXh4XG4gICAgWzEyLCAyMzY4XSwgWzEyLCAyMzY4XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDExMTAweFxuICAgIFsxMiwgMjQzMl0sIFsxMiwgMjQzMl0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMTEwMXhcbiAgICBbMTIsIDI0OTZdLCBbMTIsIDI0OTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTExMTB4XG4gICAgWzEyLCAyNTYwXSwgWzEyLCAyNTYwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDExMTExeFxuICAgIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCAgICAgICAgIC8vIDAwMDAwMDEwMDB4eHhcbiAgICBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSxcbiAgICBbMTIsIDUyXSwgWzEyLCA1Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDAxMDB4XG4gICAgWzEzLCA2NDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAwMTAxMFxuICAgIFsxMywgNzA0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMDEwMTFcbiAgICBbMTMsIDc2OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDAxMTAwXG4gICAgWzEzLCA4MzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAwMTEwMVxuICAgIFsxMiwgNTVdLCBbMTIsIDU1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMDExMXhcbiAgICBbMTIsIDU2XSwgWzEyLCA1Nl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDEwMDB4XG4gICAgWzEzLCAxMjgwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMDAxMFxuICAgIFsxMywgMTM0NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTAwMTFcbiAgICBbMTMsIDE0MDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDEwMTAwXG4gICAgWzEzLCAxNDcyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMDEwMVxuICAgIFsxMiwgNTldLCBbMTIsIDU5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTAxMXhcbiAgICBbMTIsIDYwXSwgWzEyLCA2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDExMDB4XG4gICAgWzEzLCAxNTM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMTAxMFxuICAgIFsxMywgMTYwMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTEwMTFcbiAgICBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgICAgICAgICAvLyAwMDAwMDAxMDExMXh4XG4gICAgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sICAgICAgICAgLy8gMDAwMDAwMTEwMDB4eFxuICAgIFsxMywgMTY2NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDAxMDBcbiAgICBbMTMsIDE3MjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAwMTAxXG4gICAgWzEyLCAzMjBdLCBbMTIsIDMyMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMDExeFxuICAgIFsxMiwgMzg0XSwgWzEyLCAzODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDEwMHhcbiAgICBbMTIsIDQ0OF0sIFsxMiwgNDQ4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAxMDF4XG4gICAgWzEzLCA1MTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMTEwMFxuICAgIFsxMywgNTc2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDExMDFcbiAgICBbMTIsIDUzXSwgWzEyLCA1M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAxMTF4XG4gICAgWzEyLCA1NF0sIFsxMiwgNTRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDAweFxuICAgIFsxMywgODk2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAwMTBcbiAgICBbMTMsIDk2MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTEwMDExXG4gICAgWzEzLCAxMDI0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDEwMFxuICAgIFsxMywgMTA4OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAxMDFcbiAgICBbMTMsIDExNTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTEwMTEwXG4gICAgWzEzLCAxMjE2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDExMVxuICAgIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCAgICAgICAgIC8vIDAwMDAwMDExMTF4eHhcbiAgICBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XVxuICBdO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBibGFja1RhYmxlMiA9IFtcbiAgICBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCAgICAgLy8gMDAwMDAxMDB4eHh4XG4gICAgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSxcbiAgICBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLFxuICAgIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sXG4gICAgWzExLCAyM10sIFsxMSwgMjNdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDAweFxuICAgIFsxMiwgNTBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAwMTBcbiAgICBbMTIsIDUxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDEwMDExXG4gICAgWzEyLCA0NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDEwMFxuICAgIFsxMiwgNDVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAxMDFcbiAgICBbMTIsIDQ2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDEwMTEwXG4gICAgWzEyLCA0N10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDExMVxuICAgIFsxMiwgNTddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTEwMDBcbiAgICBbMTIsIDU4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDExMDAxXG4gICAgWzEyLCA2MV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMTAxMFxuICAgIFsxMiwgMjU2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTEwMTFcbiAgICBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgLy8gMDAwMDAxMDExMXh4XG4gICAgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIC8vIDAwMDAwMTEwMDB4eFxuICAgIFsxMiwgNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDAxMDBcbiAgICBbMTIsIDQ5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAwMTAxXG4gICAgWzEyLCA2Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMDExMFxuICAgIFsxMiwgNjNdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDAxMTFcbiAgICBbMTIsIDMwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMDAwXG4gICAgWzEyLCAzMV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTAwMVxuICAgIFsxMiwgMzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDEwMTBcbiAgICBbMTIsIDMzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMDExXG4gICAgWzEyLCA0MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTEwMFxuICAgIFsxMiwgNDFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDExMDFcbiAgICBbMTEsIDIyXSwgWzExLCAyMl0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMTF4XG4gICAgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgICAgIC8vIDAwMDAwMTExeHh4eFxuICAgIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sXG4gICAgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSxcbiAgICBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sICAgICAvLyAwMDAwMTAweHh4eHhcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sXG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sXG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sICAgICAvLyAwMDAwMTAxeHh4eHhcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sXG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sXG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sICAgICAvLyAwMDAwMTEwMDB4eHhcbiAgICBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLFxuICAgIFsxMiwgMTI4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDEwMDBcbiAgICBbMTIsIDE5Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMDAxXG4gICAgWzEyLCAyNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAwMTAxMFxuICAgIFsxMiwgMjddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDEwMTFcbiAgICBbMTIsIDI4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMTAwXG4gICAgWzEyLCAyOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAwMTEwMVxuICAgIFsxMSwgMTldLCBbMTEsIDE5XSwgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDExMXhcbiAgICBbMTEsIDIwXSwgWzExLCAyMF0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMDB4XG4gICAgWzEyLCAzNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDAxMFxuICAgIFsxMiwgMzVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTAwMTFcbiAgICBbMTIsIDM2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMTAwXG4gICAgWzEyLCAzN10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDEwMVxuICAgIFsxMiwgMzhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTAxMTBcbiAgICBbMTIsIDM5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMTExXG4gICAgWzExLCAyMV0sIFsxMSwgMjFdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMTAweFxuICAgIFsxMiwgNDJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTEwMTBcbiAgICBbMTIsIDQzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDExMDExXG4gICAgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgICAgIC8vIDAwMDAxMTAxMTF4eFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sICAgICAvLyAwMDAwMTExeHh4eHhcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sXG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSxcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sXG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSxcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXG4gIF07XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IGJsYWNrVGFibGUzID0gW1xuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAvLyAwMDAweHhcbiAgICBbNiwgOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAwXG4gICAgWzYsIDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMVxuICAgIFs1LCA3XSwgWzUsIDddLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMXhcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sICAgICAgICAgLy8gMDAxMHh4XG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCAgICAgICAgIC8vIDAwMTF4eFxuICAgIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgICAgICAgICAvLyAwMTB4eHhcbiAgICBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sXG4gICAgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCAgICAgICAgIC8vIDAxMXh4eFxuICAgIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSxcbiAgICBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sICAgICAgICAgLy8gMTB4eHh4XG4gICAgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLFxuICAgIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSxcbiAgICBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sXG4gICAgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCAgICAgICAgIC8vIDExeHh4eFxuICAgIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSxcbiAgICBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sXG4gICAgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdXG4gIF07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Q0NJVFRGYXhEZWNvZGVyU291cmNlfSBzb3VyY2UgLSBUaGUgZGF0YSB3aGljaCBzaG91bGQgYmUgZGVjb2RlZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIERlY29kaW5nIG9wdGlvbnMuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIENDSVRURmF4RGVjb2Rlcihzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UubmV4dCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgXCJzb3VyY2VcIiBwYXJhbWV0ZXIuJyk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMuZW9mID0gZmFsc2U7XG5cbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5LIHx8IDA7XG4gICAgdGhpcy5lb2xpbmUgPSBvcHRpb25zLkVuZE9mTGluZSB8fCBmYWxzZTtcbiAgICB0aGlzLmJ5dGVBbGlnbiA9IG9wdGlvbnMuRW5jb2RlZEJ5dGVBbGlnbiB8fCBmYWxzZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBvcHRpb25zLkNvbHVtbnMgfHwgMTcyODtcbiAgICB0aGlzLnJvd3MgPSBvcHRpb25zLlJvd3MgfHwgMDtcbiAgICBsZXQgZW9ibG9jayA9IG9wdGlvbnMuRW5kT2ZCbG9jaztcbiAgICBpZiAoZW9ibG9jayA9PT0gbnVsbCB8fCBlb2Jsb2NrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVvYmxvY2sgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmVvYmxvY2sgPSBlb2Jsb2NrO1xuICAgIHRoaXMuYmxhY2sgPSBvcHRpb25zLkJsYWNrSXMxIHx8IGZhbHNlO1xuXG4gICAgdGhpcy5jb2RpbmdMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDEpO1xuICAgIHRoaXMucmVmTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAyKTtcblxuICAgIHRoaXMuY29kaW5nTGluZVswXSA9IHRoaXMuY29sdW1ucztcbiAgICB0aGlzLmNvZGluZ1BvcyA9IDA7XG5cbiAgICB0aGlzLnJvdyA9IDA7XG4gICAgdGhpcy5uZXh0TGluZTJEID0gdGhpcy5lbmNvZGluZyA8IDA7XG4gICAgdGhpcy5pbnB1dEJpdHMgPSAwO1xuICAgIHRoaXMuaW5wdXRCdWYgPSAwO1xuICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7XG4gICAgdGhpcy5yb3dzRG9uZSA9IGZhbHNlO1xuXG4gICAgbGV0IGNvZGUxO1xuICAgIHdoaWxlICgoY29kZTEgPSB0aGlzLl9sb29rQml0cygxMikpID09PSAwKSB7XG4gICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgIH1cbiAgICBpZiAoY29kZTEgPT09IDEpIHtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHtcbiAgICAgIHRoaXMubmV4dExpbmUyRCA9ICF0aGlzLl9sb29rQml0cygxKTtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgfVxuICB9XG5cbiAgQ0NJVFRGYXhEZWNvZGVyLnByb3RvdHlwZSA9IHtcbiAgICByZWFkTmV4dENoYXIoKSB7XG4gICAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVmTGluZSA9IHRoaXMucmVmTGluZTtcbiAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuXG4gICAgICBsZXQgcmVmUG9zLCBibGFja1BpeGVscywgYml0cywgaTtcblxuICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA9PT0gMCkge1xuICAgICAgICBpZiAodGhpcy5yb3dzRG9uZSkge1xuICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcnIgPSBmYWxzZTtcblxuICAgICAgICBsZXQgY29kZTEsIGNvZGUyLCBjb2RlMztcbiAgICAgICAgaWYgKHRoaXMubmV4dExpbmUyRCkge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGNvZGluZ0xpbmVbaV0gPCBjb2x1bW5zOyArK2kpIHtcbiAgICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2RpbmdMaW5lW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWZMaW5lW2krK10gPSBjb2x1bW5zO1xuICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2x1bW5zO1xuICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwO1xuICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDtcbiAgICAgICAgICByZWZQb3MgPSAwO1xuICAgICAgICAgIGJsYWNrUGl4ZWxzID0gMDtcblxuICAgICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fZ2V0VHdvRGltQ29kZSgpO1xuICAgICAgICAgICAgc3dpdGNoIChjb2RlMSkge1xuICAgICAgICAgICAgICBjYXNlIHR3b0RpbVBhc3M6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zICsgMV0sIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmTGluZVtyZWZQb3MgKyAxXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1Ib3JpejpcbiAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUyID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLFxuICAgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhcbiAgICAgICAgICAgICAgICAgICAgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMixcbiAgICAgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXiAxXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjM6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDMsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjI6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDIsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjE6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDEsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0MDpcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwzOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAzLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAtLXJlZlBvcztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDI6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDIsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC0tcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgKytyZWZQb3M7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJlxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMTpcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMSwgYmxhY2tQaXhlbHMpO1xuICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgY2NpdHRFT0Y6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvbHVtbnMsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpbmZvKFwiYmFkIDJkIGNvZGVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvbHVtbnMsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29kaW5nTGluZVswXSA9IDA7XG4gICAgICAgICAgdGhpcy5jb2RpbmdQb3MgPSAwO1xuICAgICAgICAgIGJsYWNrUGl4ZWxzID0gMDtcbiAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICBjb2RlMSA9IDA7XG4gICAgICAgICAgICBpZiAoYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpO1xuICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMSwgYmxhY2tQaXhlbHMpO1xuICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZ290RU9MID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZUFsaWduKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dEJpdHMgJj0gfjc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZW9ibG9jayAmJiB0aGlzLnJvdyA9PT0gdGhpcy5yb3dzIC0gMSkge1xuICAgICAgICAgIHRoaXMucm93c0RvbmUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgIGlmICh0aGlzLmVvbGluZSkge1xuICAgICAgICAgICAgd2hpbGUgKGNvZGUxICE9PSBjY2l0dEVPRiAmJiBjb2RlMSAhPT0gMSkge1xuICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGNvZGUxID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29kZTEgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgICAgZ290RU9MID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUxID09PSBjY2l0dEVPRikge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5lb2YgJiYgdGhpcy5lbmNvZGluZyA+IDAgJiYgIXRoaXMucm93c0RvbmUpIHtcbiAgICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7XG4gICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVvYmxvY2sgJiYgZ290RU9MICYmIHRoaXMuYnl0ZUFsaWduKSB7XG4gICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7XG4gICAgICAgICAgaWYgKGNvZGUxID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTtcbiAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID49IDApIHtcbiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlMSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgaW5mbyhcImJhZCBydGMgY29kZTogXCIgKyBjb2RlMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVyciAmJiB0aGlzLmVvbGluZSkge1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEzKTtcbiAgICAgICAgICAgIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHtcbiAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZTEgPj4gMSA9PT0gMSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpO1xuICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgICAgIHRoaXMubmV4dExpbmUyRCA9ICEoY29kZTEgJiAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kaW5nTGluZVswXSA+IDApIHtcbiAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWyh0aGlzLmNvZGluZ1BvcyA9IDApXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWyh0aGlzLmNvZGluZ1BvcyA9IDEpXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvdysrO1xuICAgICAgfVxuXG4gICAgICBsZXQgYztcbiAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPj0gOCkge1xuICAgICAgICBjID0gdGhpcy5jb2RpbmdQb3MgJiAxID8gMCA6IDB4ZmY7XG4gICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSA4O1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID09PSAwICYmIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7XG4gICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID1cbiAgICAgICAgICAgIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaXRzID0gODtcbiAgICAgICAgYyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykge1xuICAgICAgICAgICAgYyA8PD0gYml0cztcbiAgICAgICAgICAgIGlmICghKHRoaXMuY29kaW5nUG9zICYgMSkpIHtcbiAgICAgICAgICAgICAgYyB8PSAweGZmID4+ICg4IC0gYml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgLT0gYml0cztcbiAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjIDw8PSB0aGlzLm91dHB1dEJpdHM7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmNvZGluZ1BvcyAmIDEpKSB7XG4gICAgICAgICAgICAgIGMgfD0gMHhmZiA+PiAoOCAtIHRoaXMub3V0cHV0Qml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRzIC09IHRoaXMub3V0cHV0Qml0cztcbiAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7XG4gICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7XG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9XG4gICAgICAgICAgICAgICAgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gLSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zIC0gMV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJpdHMgPiAwKSB7XG4gICAgICAgICAgICAgIGMgPDw9IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYml0cyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ibGFjaykge1xuICAgICAgICBjIF49IDB4ZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYWRkUGl4ZWxzKGExLCBibGFja1BpeGVscykge1xuICAgICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTtcbiAgICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvcztcblxuICAgICAgaWYgKGExID4gY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7XG4gICAgICAgIGlmIChhMSA+IHRoaXMuY29sdW1ucykge1xuICAgICAgICAgIGluZm8oXCJyb3cgaXMgd3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTtcbiAgICAgICAgICBhMSA9IHRoaXMuY29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNvZGluZ1BvcyAmIDEpIF4gYmxhY2tQaXhlbHMpIHtcbiAgICAgICAgICArK2NvZGluZ1BvcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHtcbiAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7XG4gICAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7XG5cbiAgICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkge1xuICAgICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICBpbmZvKFwicm93IGlzIHdyb25nIGxlbmd0aFwiKTtcbiAgICAgICAgICB0aGlzLmVyciA9IHRydWU7XG4gICAgICAgICAgYTEgPSB0aGlzLmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjb2RpbmdQb3MgJiAxKSBeIGJsYWNrUGl4ZWxzKSB7XG4gICAgICAgICAgKytjb2RpbmdQb3M7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTtcbiAgICAgIH0gZWxzZSBpZiAoYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHtcbiAgICAgICAgaWYgKGExIDwgMCkge1xuICAgICAgICAgIGluZm8oXCJpbnZhbGlkIGNvZGVcIik7XG4gICAgICAgICAgdGhpcy5lcnIgPSB0cnVlO1xuICAgICAgICAgIGExID0gMDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY29kaW5nUG9zID4gMCAmJiBhMSA8IGNvZGluZ0xpbmVbY29kaW5nUG9zIC0gMV0pIHtcbiAgICAgICAgICAtLWNvZGluZ1BvcztcbiAgICAgICAgfVxuICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29kZSBmb3VuZCBmcm9tIHRoZSB0YWJsZS5cbiAgICAgKiBUaGUgc3RhcnQgYW5kIGVuZCBwYXJhbWV0ZXJzIHNldCB0aGUgYm91bmRhcmllcyBmb3Igc2VhcmNoaW5nIHRoZSB0YWJsZS5cbiAgICAgKiBUaGUgbGltaXQgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBGdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IHdpdGggdGhyZWVcbiAgICAgKiB2YWx1ZXMuIFRoZSBmaXJzdCBhcnJheSBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIGEgdmFsaWQgY29kZSBpcyBiZWluZ1xuICAgICAqIHJldHVybmVkLiBUaGUgc2Vjb25kIGFycmF5IGVsZW1lbnQgaXMgdGhlIGFjdHVhbCBjb2RlLiBUaGUgdGhpcmQgYXJyYXlcbiAgICAgKiBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIEVPRiB3YXMgcmVhY2hlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9maW5kVGFibGVDb2RlKHN0YXJ0LCBlbmQsIHRhYmxlLCBsaW1pdCkge1xuICAgICAgY29uc3QgbGltaXRWYWx1ZSA9IGxpbWl0IHx8IDA7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHtcbiAgICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7XG4gICAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCBlbmQpIHtcbiAgICAgICAgICBjb2RlIDw8PSBlbmQgLSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdO1xuICAgICAgICAgIGlmIChwWzBdID09PSBpKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXRCaXRzKGkpO1xuICAgICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0VHdvRGltQ29kZSgpIHtcbiAgICAgIGxldCBjb2RlID0gMDtcbiAgICAgIGxldCBwO1xuICAgICAgaWYgKHRoaXMuZW9ibG9jaykge1xuICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoNyk7XG4gICAgICAgIHAgPSB0d29EaW1UYWJsZVtjb2RlXTtcbiAgICAgICAgaWYgKHAgJiYgcFswXSA+IDApIHtcbiAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pO1xuICAgICAgICAgIHJldHVybiBwWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDcsIHR3b0RpbVRhYmxlKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSAmJiByZXN1bHRbMl0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmZvKFwiQmFkIHR3byBkaW0gY29kZVwiKTtcbiAgICAgIHJldHVybiBjY2l0dEVPRjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0V2hpdGVDb2RlKCkge1xuICAgICAgbGV0IGNvZGUgPSAwO1xuICAgICAgbGV0IHA7XG4gICAgICBpZiAodGhpcy5lb2Jsb2NrKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMik7XG4gICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPj4gNSA9PT0gMCkge1xuICAgICAgICAgIHAgPSB3aGl0ZVRhYmxlMVtjb2RlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwID0gd2hpdGVUYWJsZTJbY29kZSA+PiAzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwWzBdID4gMCkge1xuICAgICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7XG4gICAgICAgICAgcmV0dXJuIHBbMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDExLCAxMiwgd2hpdGVUYWJsZTEpO1xuICAgICAgICBpZiAocmVzdWx0WzBdKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5mbyhcImJhZCB3aGl0ZSBjb2RlXCIpO1xuICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRCbGFja0NvZGUoKSB7XG4gICAgICBsZXQgY29kZSwgcDtcbiAgICAgIGlmICh0aGlzLmVvYmxvY2spIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEzKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkge1xuICAgICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7XG4gICAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBbMF0gPiAwKSB7XG4gICAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTtcbiAgICAgICAgICByZXR1cm4gcFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMiwgNiwgYmxhY2tUYWJsZTMpO1xuICAgICAgICBpZiAocmVzdWx0WzBdKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoNywgMTIsIGJsYWNrVGFibGUyLCA2NCk7XG4gICAgICAgIGlmIChyZXN1bHRbMF0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluZm8oXCJiYWQgYmxhY2sgY29kZVwiKTtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfbG9va0JpdHMobikge1xuICAgICAgbGV0IGM7XG4gICAgICB3aGlsZSAodGhpcy5pbnB1dEJpdHMgPCBuKSB7XG4gICAgICAgIGlmICgoYyA9IHRoaXMuc291cmNlLm5leHQoKSkgPT09IC0xKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXRCaXRzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY2NpdHRFT0Y7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodGhpcy5pbnB1dEJ1ZiA8PCAobiAtIHRoaXMuaW5wdXRCaXRzKSkgJiAoMHhmZmZmID4+ICgxNiAtIG4pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0QnVmID0gKHRoaXMuaW5wdXRCdWYgPDwgOCkgfCBjO1xuICAgICAgICB0aGlzLmlucHV0Qml0cyArPSA4O1xuICAgICAgfVxuICAgICAgcmV0dXJuICh0aGlzLmlucHV0QnVmID4+ICh0aGlzLmlucHV0Qml0cyAtIG4pKSAmICgweGZmZmYgPj4gKDE2IC0gbikpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9lYXRCaXRzKG4pIHtcbiAgICAgIGlmICgodGhpcy5pbnB1dEJpdHMgLT0gbikgPCAwKSB7XG4gICAgICAgIHRoaXMuaW5wdXRCaXRzID0gMDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBDQ0lUVEZheERlY29kZXI7XG59KSgpO1xuXG5leHBvcnQgeyBDQ0lUVEZheERlY29kZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGFzc2VydCwgQmFzZUV4Y2VwdGlvbiwgd2FybiB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgcmVhZFVpbnQxNiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcblxuY2xhc3MgSnBlZ0Vycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKGBKUEVHIGVycm9yOiAke21zZ31gKTtcbiAgfVxufVxuXG5jbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzY2FuTGluZXMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnNjYW5MaW5lcyA9IHNjYW5MaW5lcztcbiAgfVxufVxuXG5jbGFzcyBFT0lNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuLyoqXG4gKiBUaGlzIGNvZGUgd2FzIGZvcmtlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3RtYXN0ZXJ5ZXQvanBnanMuXG4gKiBUaGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgY3JlYXRlZCBieSBHaXRIdWIgdXNlciBub3RtYXN0ZXJ5ZXQuXG4gKlxuICogLSBUaGUgSlBFRyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgSVRVIENDSVRUIFJlY29tbWVuZGF0aW9uIFQuODFcbiAqICAgKHd3dy53My5vcmcvR3JhcGhpY3MvSlBFRy9pdHUtdDgxLnBkZilcbiAqIC0gVGhlIEpGSUYgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIEpQRUcgRmlsZSBJbnRlcmNoYW5nZSBGb3JtYXRcbiAqICAgKHd3dy53My5vcmcvR3JhcGhpY3MvSlBFRy9qZmlmMy5wZGYpXG4gKiAtIFRoZSBBZG9iZSBBcHBsaWNhdGlvbi1TcGVjaWZpYyBKUEVHIG1hcmtlcnMgaW4gdGhlXG4gKiAgIFN1cHBvcnRpbmcgdGhlIERDVCBGaWx0ZXJzIGluIFBvc3RTY3JpcHQgTGV2ZWwgMiwgVGVjaG5pY2FsIE5vdGUgIzUxMTZcbiAqICAgKHBhcnRuZXJzLmFkb2JlLmNvbS9wdWJsaWMvZGV2ZWxvcGVyL2VuL3BzL3Nkay81MTE2LkRDVF9GaWx0ZXIucGRmKVxuICovXG5cbnZhciBKcGVnSW1hZ2UgPSAoZnVuY3Rpb24gSnBlZ0ltYWdlQ2xvc3VyZSgpIHtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHZhciBkY3RaaWdaYWcgPSBuZXcgVWludDhBcnJheShbXG4gICAgIDAsXG4gICAgIDEsICA4LFxuICAgIDE2LCAgOSwgIDIsXG4gICAgIDMsIDEwLCAxNywgMjQsXG4gICAgMzIsIDI1LCAxOCwgMTEsIDQsXG4gICAgIDUsIDEyLCAxOSwgMjYsIDMzLCA0MCxcbiAgICA0OCwgNDEsIDM0LCAyNywgMjAsIDEzLCAgNixcbiAgICAgNywgMTQsIDIxLCAyOCwgMzUsIDQyLCA0OSwgNTYsXG4gICAgNTcsIDUwLCA0MywgMzYsIDI5LCAyMiwgMTUsXG4gICAgMjMsIDMwLCAzNywgNDQsIDUxLCA1OCxcbiAgICA1OSwgNTIsIDQ1LCAzOCwgMzEsXG4gICAgMzksIDQ2LCA1MywgNjAsXG4gICAgNjEsIDU0LCA0NyxcbiAgICA1NSwgNjIsXG4gICAgNjNcbiAgXSk7XG5cbiAgdmFyIGRjdENvczEgPSA0MDE3OyAvLyBjb3MocGkvMTYpXG4gIHZhciBkY3RTaW4xID0gNzk5OyAvLyBzaW4ocGkvMTYpXG4gIHZhciBkY3RDb3MzID0gMzQwNjsgLy8gY29zKDMqcGkvMTYpXG4gIHZhciBkY3RTaW4zID0gMjI3NjsgLy8gc2luKDMqcGkvMTYpXG4gIHZhciBkY3RDb3M2ID0gMTU2NzsgLy8gY29zKDYqcGkvMTYpXG4gIHZhciBkY3RTaW42ID0gMzc4NDsgLy8gc2luKDYqcGkvMTYpXG4gIHZhciBkY3RTcXJ0MiA9IDU3OTM7IC8vIHNxcnQoMilcbiAgdmFyIGRjdFNxcnQxZDIgPSAyODk2OyAvLyBzcXJ0KDIpIC8gMlxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gSnBlZ0ltYWdlKHsgZGVjb2RlVHJhbnNmb3JtID0gbnVsbCwgY29sb3JUcmFuc2Zvcm0gPSAtMSB9ID0ge30pIHtcbiAgICB0aGlzLl9kZWNvZGVUcmFuc2Zvcm0gPSBkZWNvZGVUcmFuc2Zvcm07XG4gICAgdGhpcy5fY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCB2YWx1ZXMpIHtcbiAgICB2YXIgayA9IDAsXG4gICAgICBjb2RlID0gW10sXG4gICAgICBpLFxuICAgICAgaixcbiAgICAgIGxlbmd0aCA9IDE2O1xuICAgIHdoaWxlIChsZW5ndGggPiAwICYmICFjb2RlTGVuZ3Roc1tsZW5ndGggLSAxXSkge1xuICAgICAgbGVuZ3RoLS07XG4gICAgfVxuICAgIGNvZGUucHVzaCh7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSk7XG4gICAgdmFyIHAgPSBjb2RlWzBdLFxuICAgICAgcTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3Roc1tpXTsgaisrKSB7XG4gICAgICAgIHAgPSBjb2RlLnBvcCgpO1xuICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gdmFsdWVzW2tdO1xuICAgICAgICB3aGlsZSAocC5pbmRleCA+IDApIHtcbiAgICAgICAgICBwID0gY29kZS5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBwLmluZGV4Kys7XG4gICAgICAgIGNvZGUucHVzaChwKTtcbiAgICAgICAgd2hpbGUgKGNvZGUubGVuZ3RoIDw9IGkpIHtcbiAgICAgICAgICBjb2RlLnB1c2goKHEgPSB7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSkpO1xuICAgICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuO1xuICAgICAgICAgIHAgPSBxO1xuICAgICAgICB9XG4gICAgICAgIGsrKztcbiAgICAgIH1cbiAgICAgIGlmIChpICsgMSA8IGxlbmd0aCkge1xuICAgICAgICAvLyBwIGhlcmUgcG9pbnRzIHRvIGxhc3QgY29kZVxuICAgICAgICBjb2RlLnB1c2goKHEgPSB7IGNoaWxkcmVuOiBbXSwgaW5kZXg6IDAgfSkpO1xuICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjtcbiAgICAgICAgcCA9IHE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2RlWzBdLmNoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkge1xuICAgIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVTY2FuKFxuICAgIGRhdGEsXG4gICAgb2Zmc2V0LFxuICAgIGZyYW1lLFxuICAgIGNvbXBvbmVudHMsXG4gICAgcmVzZXRJbnRlcnZhbCxcbiAgICBzcGVjdHJhbFN0YXJ0LFxuICAgIHNwZWN0cmFsRW5kLFxuICAgIHN1Y2Nlc3NpdmVQcmV2LFxuICAgIHN1Y2Nlc3NpdmUsXG4gICAgcGFyc2VETkxNYXJrZXIgPSBmYWxzZVxuICApIHtcbiAgICB2YXIgbWN1c1BlckxpbmUgPSBmcmFtZS5tY3VzUGVyTGluZTtcbiAgICB2YXIgcHJvZ3Jlc3NpdmUgPSBmcmFtZS5wcm9ncmVzc2l2ZTtcblxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0O1xuICAgIGxldCBiaXRzRGF0YSA9IDAsXG4gICAgICBiaXRzQ291bnQgPSAwO1xuXG4gICAgZnVuY3Rpb24gcmVhZEJpdCgpIHtcbiAgICAgIGlmIChiaXRzQ291bnQgPiAwKSB7XG4gICAgICAgIGJpdHNDb3VudC0tO1xuICAgICAgICByZXR1cm4gKGJpdHNEYXRhID4+IGJpdHNDb3VudCkgJiAxO1xuICAgICAgfVxuICAgICAgYml0c0RhdGEgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgIGlmIChiaXRzRGF0YSA9PT0gMHhmZikge1xuICAgICAgICB2YXIgbmV4dEJ5dGUgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgaWYgKG5leHRCeXRlKSB7XG4gICAgICAgICAgaWYgKG5leHRCeXRlID09PSAvKiBETkwgPSAqLyAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICBjb25zdCBzY2FuTGluZXMgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIGlmIChzY2FuTGluZXMgPiAwICYmIHNjYW5MaW5lcyAhPT0gZnJhbWUuc2NhbkxpbmVzKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgICBcIkZvdW5kIEROTCBtYXJrZXIgKDB4RkZEQykgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGFcIixcbiAgICAgICAgICAgICAgICBzY2FuTGluZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRCeXRlID09PSAvKiBFT0kgPSAqLyAweGQ5KSB7XG4gICAgICAgICAgICBpZiAocGFyc2VETkxNYXJrZXIpIHtcbiAgICAgICAgICAgICAgLy8gTk9URTogb25seSA4LWJpdCBKUEVHIGltYWdlcyBhcmUgc3VwcG9ydGVkIGluIHRoaXMgZGVjb2Rlci5cbiAgICAgICAgICAgICAgY29uc3QgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7XG4gICAgICAgICAgICAgIC8vIEhldXJpc3RpYyB0byBhdHRlbXB0IHRvIGhhbmRsZSBjb3JydXB0IEpQRUcgaW1hZ2VzIHdpdGggdG9vXG4gICAgICAgICAgICAgIC8vIGxhcmdlIGBzY2FuTGluZXNgIHBhcmFtZXRlciwgYnkgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50bHlcbiAgICAgICAgICAgICAgLy8gcGFyc2VkIG51bWJlciBvZiBzY2FuTGluZXMgd2hlbiBpdCdzIGF0IGxlYXN0IChhcHByb3hpbWF0ZWx5KVxuICAgICAgICAgICAgICAvLyBvbmUgb3JkZXIgb2YgbWFnbml0dWRlIHNtYWxsZXIgdGhhbiBleHBlY3RlZCAoZml4ZXNcbiAgICAgICAgICAgICAgLy8gaXNzdWUxMDg4MC5wZGYgYW5kIGlzc3VlMTA5ODkucGRmKS5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1heWJlU2NhbkxpbmVzID4gMCAmJlxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZnJhbWUuc2NhbkxpbmVzIC8gbWF5YmVTY2FuTGluZXMpID49IDEwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInBvc3NpYmx5IGNhdXNlZCBieSBpbmNvcnJlY3QgYHNjYW5MaW5lc2AgcGFyYW1ldGVyXCIsXG4gICAgICAgICAgICAgICAgICBtYXliZVNjYW5MaW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFT0lNYXJrZXJFcnJvcihcbiAgICAgICAgICAgICAgXCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXG4gICAgICAgICAgICBgdW5leHBlY3RlZCBtYXJrZXIgJHsoKGJpdHNEYXRhIDw8IDgpIHwgbmV4dEJ5dGUpLnRvU3RyaW5nKDE2KX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1bnN0dWZmIDBcbiAgICAgIH1cbiAgICAgIGJpdHNDb3VudCA9IDc7XG4gICAgICByZXR1cm4gYml0c0RhdGEgPj4+IDc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlSHVmZm1hbih0cmVlKSB7XG4gICAgICB2YXIgbm9kZSA9IHRyZWU7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBub2RlID0gbm9kZVtyZWFkQml0KCldO1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBub2RlKSB7XG4gICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCkge1xuICAgICAgdmFyIG4gPSAwO1xuICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgbiA9IChuIDw8IDEpIHwgcmVhZEJpdCgpO1xuICAgICAgICBsZW5ndGgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQobGVuZ3RoKSB7XG4gICAgICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiByZWFkQml0KCkgPT09IDEgPyAxIDogLTE7XG4gICAgICB9XG4gICAgICB2YXIgbiA9IHJlY2VpdmUobGVuZ3RoKTtcbiAgICAgIGlmIChuID49IDEgPDwgKGxlbmd0aCAtIDEpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gKyAoLTEgPDwgbGVuZ3RoKSArIDE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7XG4gICAgICB2YXIgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KTtcbiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdID0gY29tcG9uZW50LnByZWQgKz0gZGlmZjtcbiAgICAgIHZhciBrID0gMTtcbiAgICAgIHdoaWxlIChrIDwgNjQpIHtcbiAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpO1xuICAgICAgICB2YXIgcyA9IHJzICYgMTUsXG4gICAgICAgICAgciA9IHJzID4+IDQ7XG4gICAgICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGsgKz0gMTY7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgayArPSByO1xuICAgICAgICB2YXIgeiA9IGRjdFppZ1phZ1trXTtcbiAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldCArIHpdID0gcmVjZWl2ZUFuZEV4dGVuZChzKTtcbiAgICAgICAgaysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZURDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7XG4gICAgICB2YXIgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlO1xuICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZURDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7XG4gICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSB8PSByZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZTtcbiAgICB9XG5cbiAgICB2YXIgZW9icnVuID0gMDtcbiAgICBmdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHtcbiAgICAgIGlmIChlb2JydW4gPiAwKSB7XG4gICAgICAgIGVvYnJ1bi0tO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQsXG4gICAgICAgIGUgPSBzcGVjdHJhbEVuZDtcbiAgICAgIHdoaWxlIChrIDw9IGUpIHtcbiAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpO1xuICAgICAgICB2YXIgcyA9IHJzICYgMTUsXG4gICAgICAgICAgciA9IHJzID4+IDQ7XG4gICAgICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpIC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrICs9IDE2O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGsgKz0gcjtcbiAgICAgICAgdmFyIHogPSBkY3RaaWdaYWdba107XG4gICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9XG4gICAgICAgICAgcmVjZWl2ZUFuZEV4dGVuZChzKSAqICgxIDw8IHN1Y2Nlc3NpdmUpO1xuICAgICAgICBrKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMCxcbiAgICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZTtcbiAgICBmdW5jdGlvbiBkZWNvZGVBQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgdmFyIGsgPSBzcGVjdHJhbFN0YXJ0O1xuICAgICAgdmFyIGUgPSBzcGVjdHJhbEVuZDtcbiAgICAgIHZhciByID0gMDtcbiAgICAgIHZhciBzO1xuICAgICAgdmFyIHJzO1xuICAgICAgd2hpbGUgKGsgPD0gZSkge1xuICAgICAgICBjb25zdCBvZmZzZXRaID0gYmxvY2tPZmZzZXQgKyBkY3RaaWdaYWdba107XG4gICAgICAgIGNvbnN0IHNpZ24gPSBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdIDwgMCA/IC0xIDogMTtcbiAgICAgICAgc3dpdGNoIChzdWNjZXNzaXZlQUNTdGF0ZSkge1xuICAgICAgICAgIGNhc2UgMDogLy8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7XG4gICAgICAgICAgICBzID0gcnMgJiAxNTtcbiAgICAgICAgICAgIHIgPSBycyA+PiA0O1xuICAgICAgICAgICAgaWYgKHMgPT09IDApIHtcbiAgICAgICAgICAgICAgaWYgKHIgPCAxNSkge1xuICAgICAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKTtcbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgciA9IDE2O1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHMgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiaW52YWxpZCBBQ24gZW5jb2RpbmdcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTtcbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIDE6IC8vIHNraXBwaW5nIHIgemVybyBpdGVtc1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLS07XG4gICAgICAgICAgICAgIGlmIChyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSBzdWNjZXNzaXZlQUNTdGF0ZSA9PT0gMiA/IDMgOiAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6IC8vIHNldCB2YWx1ZSBmb3IgYSB6ZXJvIGl0ZW1cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID1cbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNOZXh0VmFsdWUgPDwgc3VjY2Vzc2l2ZTtcbiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OiAvLyBlb2JcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBrKys7XG4gICAgICB9XG4gICAgICBpZiAoc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDQpIHtcbiAgICAgICAgZW9icnVuLS07XG4gICAgICAgIGlmIChlb2JydW4gPT09IDApIHtcbiAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgYmxvY2tSb3cgPSAwO1xuICAgIGZ1bmN0aW9uIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZSwgbWN1LCByb3csIGNvbCkge1xuICAgICAgdmFyIG1jdVJvdyA9IChtY3UgLyBtY3VzUGVyTGluZSkgfCAwO1xuICAgICAgdmFyIG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lO1xuICAgICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdztcbiAgICAgIHZhciBibG9ja0NvbCA9IG1jdUNvbCAqIGNvbXBvbmVudC5oICsgY29sO1xuICAgICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7XG4gICAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGUsIG1jdSkge1xuICAgICAgYmxvY2tSb3cgPSAobWN1IC8gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUpIHwgMDtcbiAgICAgIHZhciBibG9ja0NvbCA9IG1jdSAlIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lO1xuICAgICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7XG4gICAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDtcbiAgICB2YXIgY29tcG9uZW50LCBpLCBqLCBrLCBuO1xuICAgIHZhciBkZWNvZGVGbjtcbiAgICBpZiAocHJvZ3Jlc3NpdmUpIHtcbiAgICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7XG4gICAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7XG4gICAgfVxuXG4gICAgdmFyIG1jdSA9IDAsXG4gICAgICBmaWxlTWFya2VyO1xuICAgIHZhciBtY3VFeHBlY3RlZDtcbiAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkge1xuICAgICAgbWN1RXhwZWN0ZWQgPSBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckxpbmUgKiBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckNvbHVtbjtcbiAgICB9IGVsc2Uge1xuICAgICAgbWN1RXhwZWN0ZWQgPSBtY3VzUGVyTGluZSAqIGZyYW1lLm1jdXNQZXJDb2x1bW47XG4gICAgfVxuXG4gICAgdmFyIGgsIHY7XG4gICAgd2hpbGUgKG1jdSA8PSBtY3VFeHBlY3RlZCkge1xuICAgICAgLy8gcmVzZXQgaW50ZXJ2YWwgc3R1ZmZcbiAgICAgIHZhciBtY3VUb1JlYWQgPSByZXNldEludGVydmFsXG4gICAgICAgID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpXG4gICAgICAgIDogbWN1RXhwZWN0ZWQ7XG5cbiAgICAgIC8vIFRoZSBgbWN1VG9SZWFkID09PSAwYCBjYXNlIHNob3VsZCBvbmx5IG9jY3VyIHdoZW4gYWxsIG9mIHRoZSBleHBlY3RlZFxuICAgICAgLy8gTUNVIGRhdGEgaGFzIGJlZW4gYWxyZWFkeSBwYXJzZWQsIGkuZS4gd2hlbiBgbWN1ID09PSBtY3VFeHBlY3RlZGAsIGJ1dFxuICAgICAgLy8gc29tZSBjb3JydXB0IEpQRUcgaW1hZ2VzIGNvbnRhaW4gbW9yZSBkYXRhIHRoYW4gaW50ZW5kZWQgYW5kIHdlIHRodXNcbiAgICAgIC8vIHdhbnQgdG8gc2tpcCBvdmVyIGFueSBleHRyYSBSU1R4IG1hcmtlcnMgYmVsb3cgKGZpeGVzIGlzc3VlMTE3OTQucGRmKS5cbiAgICAgIGlmIChtY3VUb1JlYWQgPiAwKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb21wb25lbnRzW2ldLnByZWQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVvYnJ1biA9IDA7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzWzBdO1xuICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykge1xuICAgICAgICAgICAgZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1KTtcbiAgICAgICAgICAgIG1jdSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgICAgaCA9IGNvbXBvbmVudC5oO1xuICAgICAgICAgICAgICB2ID0gY29tcG9uZW50LnY7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2OyBqKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1LCBqLCBrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1jdSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaW5kIG1hcmtlclxuICAgICAgYml0c0NvdW50ID0gMDtcbiAgICAgIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgb2Zmc2V0KTtcbiAgICAgIGlmICghZmlsZU1hcmtlcikge1xuICAgICAgICBicmVhazsgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhIHdpdGhvdXQgZmluZGluZyBhbnkgbWFya2VyLlxuICAgICAgfVxuICAgICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkge1xuICAgICAgICAvLyBTb21lIGJhZCBpbWFnZXMgc2VlbSB0byBwYWQgU2NhbiBibG9ja3Mgd2l0aCBlLmcuIHplcm8gYnl0ZXMsIHNraXBcbiAgICAgICAgLy8gcGFzdCB0aG9zZSB0byBhdHRlbXB0IHRvIGZpbmQgYSB2YWxpZCBtYXJrZXIgKGZpeGVzIGlzc3VlNDA5MC5wZGYpLlxuICAgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/IFwidW5leHBlY3RlZFwiIDogXCJleGNlc3NpdmVcIjtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgZGVjb2RlU2NhbiAtICR7cGFydGlhbE1zZ30gTUNVIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAke2ZpbGVNYXJrZXIuaW52YWxpZH1gXG4gICAgICAgICk7XG4gICAgICAgIG9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0O1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNYXJrZXIubWFya2VyID49IDB4ZmZkMCAmJiBmaWxlTWFya2VyLm1hcmtlciA8PSAweGZmZDcpIHtcbiAgICAgICAgLy8gUlNUeFxuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDtcbiAgfVxuXG4gIC8vIEEgcG9ydCBvZiBwb3BwbGVyJ3MgSURDVCBtZXRob2Qgd2hpY2ggaW4gdHVybiBpcyB0YWtlbiBmcm9tOlxuICAvLyAgIENocmlzdG9waCBMb2VmZmxlciwgQWRyaWFhbiBMaWd0ZW5iZXJnLCBHZW9yZ2UgUy4gTW9zY2h5dHosXG4gIC8vICAgJ1ByYWN0aWNhbCBGYXN0IDEtRCBEQ1QgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucycsXG4gIC8vICAgSUVFRSBJbnRsLiBDb25mLiBvbiBBY291c3RpY3MsIFNwZWVjaCAmIFNpZ25hbCBQcm9jZXNzaW5nLCAxOTg5LFxuICAvLyAgIDk4OC05OTEuXG4gIGZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIGJsb2NrQnVmZmVyT2Zmc2V0LCBwKSB7XG4gICAgdmFyIHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLFxuICAgICAgYmxvY2tEYXRhID0gY29tcG9uZW50LmJsb2NrRGF0YTtcbiAgICB2YXIgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3O1xuICAgIHZhciBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDc7XG4gICAgdmFyIHQ7XG5cbiAgICBpZiAoIXF0KSB7XG4gICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuXCIpO1xuICAgIH1cblxuICAgIC8vIGludmVyc2UgRENUIG9uIHJvd3NcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCA2NDsgcm93ICs9IDgpIHtcbiAgICAgIC8vIGdhdGhlciBibG9jayBkYXRhXG4gICAgICBwMCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvd107XG4gICAgICBwMSA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDFdO1xuICAgICAgcDIgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAyXTtcbiAgICAgIHAzID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgM107XG4gICAgICBwNCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDRdO1xuICAgICAgcDUgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA1XTtcbiAgICAgIHA2ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNl07XG4gICAgICBwNyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDddO1xuXG4gICAgICAvLyBkZXF1YW50IHAwXG4gICAgICBwMCAqPSBxdFtyb3ddO1xuXG4gICAgICAvLyBjaGVjayBmb3IgYWxsLXplcm8gQUMgY29lZmZpY2llbnRzXG4gICAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkge1xuICAgICAgICB0ID0gKGRjdFNxcnQyICogcDAgKyA1MTIpID4+IDEwO1xuICAgICAgICBwW3Jvd10gPSB0O1xuICAgICAgICBwW3JvdyArIDFdID0gdDtcbiAgICAgICAgcFtyb3cgKyAyXSA9IHQ7XG4gICAgICAgIHBbcm93ICsgM10gPSB0O1xuICAgICAgICBwW3JvdyArIDRdID0gdDtcbiAgICAgICAgcFtyb3cgKyA1XSA9IHQ7XG4gICAgICAgIHBbcm93ICsgNl0gPSB0O1xuICAgICAgICBwW3JvdyArIDddID0gdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBkZXF1YW50IHAxIC4uLiBwN1xuICAgICAgcDEgKj0gcXRbcm93ICsgMV07XG4gICAgICBwMiAqPSBxdFtyb3cgKyAyXTtcbiAgICAgIHAzICo9IHF0W3JvdyArIDNdO1xuICAgICAgcDQgKj0gcXRbcm93ICsgNF07XG4gICAgICBwNSAqPSBxdFtyb3cgKyA1XTtcbiAgICAgIHA2ICo9IHF0W3JvdyArIDZdO1xuICAgICAgcDcgKj0gcXRbcm93ICsgN107XG5cbiAgICAgIC8vIHN0YWdlIDRcbiAgICAgIHYwID0gKGRjdFNxcnQyICogcDAgKyAxMjgpID4+IDg7XG4gICAgICB2MSA9IChkY3RTcXJ0MiAqIHA0ICsgMTI4KSA+PiA4O1xuICAgICAgdjIgPSBwMjtcbiAgICAgIHYzID0gcDY7XG4gICAgICB2NCA9IChkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMTI4KSA+PiA4O1xuICAgICAgdjcgPSAoZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDEyOCkgPj4gODtcbiAgICAgIHY1ID0gcDMgPDwgNDtcbiAgICAgIHY2ID0gcDUgPDwgNDtcblxuICAgICAgLy8gc3RhZ2UgM1xuICAgICAgdjAgPSAodjAgKyB2MSArIDEpID4+IDE7XG4gICAgICB2MSA9IHYwIC0gdjE7XG4gICAgICB0ID0gKHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDEyOCkgPj4gODtcbiAgICAgIHYyID0gKHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDEyOCkgPj4gODtcbiAgICAgIHYzID0gdDtcbiAgICAgIHY0ID0gKHY0ICsgdjYgKyAxKSA+PiAxO1xuICAgICAgdjYgPSB2NCAtIHY2O1xuICAgICAgdjcgPSAodjcgKyB2NSArIDEpID4+IDE7XG4gICAgICB2NSA9IHY3IC0gdjU7XG5cbiAgICAgIC8vIHN0YWdlIDJcbiAgICAgIHYwID0gKHYwICsgdjMgKyAxKSA+PiAxO1xuICAgICAgdjMgPSB2MCAtIHYzO1xuICAgICAgdjEgPSAodjEgKyB2MiArIDEpID4+IDE7XG4gICAgICB2MiA9IHYxIC0gdjI7XG4gICAgICB0ID0gKHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDgpID4+IDEyO1xuICAgICAgdjQgPSAodjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NyA9IHQ7XG4gICAgICB0ID0gKHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDgpID4+IDEyO1xuICAgICAgdjUgPSAodjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NiA9IHQ7XG5cbiAgICAgIC8vIHN0YWdlIDFcbiAgICAgIHBbcm93XSA9IHYwICsgdjc7XG4gICAgICBwW3JvdyArIDddID0gdjAgLSB2NztcbiAgICAgIHBbcm93ICsgMV0gPSB2MSArIHY2O1xuICAgICAgcFtyb3cgKyA2XSA9IHYxIC0gdjY7XG4gICAgICBwW3JvdyArIDJdID0gdjIgKyB2NTtcbiAgICAgIHBbcm93ICsgNV0gPSB2MiAtIHY1O1xuICAgICAgcFtyb3cgKyAzXSA9IHYzICsgdjQ7XG4gICAgICBwW3JvdyArIDRdID0gdjMgLSB2NDtcbiAgICB9XG5cbiAgICAvLyBpbnZlcnNlIERDVCBvbiBjb2x1bW5zXG4gICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgODsgKytjb2wpIHtcbiAgICAgIHAwID0gcFtjb2xdO1xuICAgICAgcDEgPSBwW2NvbCArIDhdO1xuICAgICAgcDIgPSBwW2NvbCArIDE2XTtcbiAgICAgIHAzID0gcFtjb2wgKyAyNF07XG4gICAgICBwNCA9IHBbY29sICsgMzJdO1xuICAgICAgcDUgPSBwW2NvbCArIDQwXTtcbiAgICAgIHA2ID0gcFtjb2wgKyA0OF07XG4gICAgICBwNyA9IHBbY29sICsgNTZdO1xuXG4gICAgICAvLyBjaGVjayBmb3IgYWxsLXplcm8gQUMgY29lZmZpY2llbnRzXG4gICAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkge1xuICAgICAgICB0ID0gKGRjdFNxcnQyICogcDAgKyA4MTkyKSA+PiAxNDtcbiAgICAgICAgLy8gQ29udmVydCB0byA4LWJpdC5cbiAgICAgICAgaWYgKHQgPCAtMjA0MCkge1xuICAgICAgICAgIHQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPj0gMjAyNCkge1xuICAgICAgICAgIHQgPSAyNTU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdCA9ICh0ICsgMjA1NikgPj4gNDtcbiAgICAgICAgfVxuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSB0O1xuICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSB0O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RhZ2UgNFxuICAgICAgdjAgPSAoZGN0U3FydDIgKiBwMCArIDIwNDgpID4+IDEyO1xuICAgICAgdjEgPSAoZGN0U3FydDIgKiBwNCArIDIwNDgpID4+IDEyO1xuICAgICAgdjIgPSBwMjtcbiAgICAgIHYzID0gcDY7XG4gICAgICB2NCA9IChkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NyA9IChkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NSA9IHAzO1xuICAgICAgdjYgPSBwNTtcblxuICAgICAgLy8gc3RhZ2UgM1xuICAgICAgLy8gU2hpZnQgdjAgYnkgMTI4LjUgPDwgNSBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHNoaWZ0IHAwLi4ucDcgd2hlblxuICAgICAgLy8gY29udmVydGluZyB0byBVSW50OCByYW5nZSBsYXRlci5cbiAgICAgIHYwID0gKCh2MCArIHYxICsgMSkgPj4gMSkgKyA0MTEyO1xuICAgICAgdjEgPSB2MCAtIHYxO1xuICAgICAgdCA9ICh2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHYyID0gKHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDIwNDgpID4+IDEyO1xuICAgICAgdjMgPSB0O1xuICAgICAgdjQgPSAodjQgKyB2NiArIDEpID4+IDE7XG4gICAgICB2NiA9IHY0IC0gdjY7XG4gICAgICB2NyA9ICh2NyArIHY1ICsgMSkgPj4gMTtcbiAgICAgIHY1ID0gdjcgLSB2NTtcblxuICAgICAgLy8gc3RhZ2UgMlxuICAgICAgdjAgPSAodjAgKyB2MyArIDEpID4+IDE7XG4gICAgICB2MyA9IHYwIC0gdjM7XG4gICAgICB2MSA9ICh2MSArIHYyICsgMSkgPj4gMTtcbiAgICAgIHYyID0gdjEgLSB2MjtcbiAgICAgIHQgPSAodjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NCA9ICh2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHY3ID0gdDtcbiAgICAgIHQgPSAodjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NSA9ICh2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHY2ID0gdDtcblxuICAgICAgLy8gc3RhZ2UgMVxuICAgICAgcDAgPSB2MCArIHY3O1xuICAgICAgcDcgPSB2MCAtIHY3O1xuICAgICAgcDEgPSB2MSArIHY2O1xuICAgICAgcDYgPSB2MSAtIHY2O1xuICAgICAgcDIgPSB2MiArIHY1O1xuICAgICAgcDUgPSB2MiAtIHY1O1xuICAgICAgcDMgPSB2MyArIHY0O1xuICAgICAgcDQgPSB2MyAtIHY0O1xuXG4gICAgICAvLyBDb252ZXJ0IHRvIDgtYml0IGludGVnZXJzLlxuICAgICAgaWYgKHAwIDwgMTYpIHtcbiAgICAgICAgcDAgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwMCA+PSA0MDgwKSB7XG4gICAgICAgIHAwID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDAgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDEgPCAxNikge1xuICAgICAgICBwMSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHAxID49IDQwODApIHtcbiAgICAgICAgcDEgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwMSA+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmIChwMiA8IDE2KSB7XG4gICAgICAgIHAyID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDIgPj0gNDA4MCkge1xuICAgICAgICBwMiA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAyID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHAzIDwgMTYpIHtcbiAgICAgICAgcDMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwMyA+PSA0MDgwKSB7XG4gICAgICAgIHAzID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDMgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDQgPCAxNikge1xuICAgICAgICBwNCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHA0ID49IDQwODApIHtcbiAgICAgICAgcDQgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwNCA+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmIChwNSA8IDE2KSB7XG4gICAgICAgIHA1ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDUgPj0gNDA4MCkge1xuICAgICAgICBwNSA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHA1ID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHA2IDwgMTYpIHtcbiAgICAgICAgcDYgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwNiA+PSA0MDgwKSB7XG4gICAgICAgIHA2ID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDYgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDcgPCAxNikge1xuICAgICAgICBwNyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHA3ID49IDQwODApIHtcbiAgICAgICAgcDcgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwNyA+Pj0gNDtcbiAgICAgIH1cblxuICAgICAgLy8gc3RvcmUgYmxvY2sgZGF0YVxuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHAwO1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSBwMTtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDE2XSA9IHAyO1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gcDM7XG4gICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSBwNDtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQwXSA9IHA1O1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gcDY7XG4gICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSBwNztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCkge1xuICAgIHZhciBibG9ja3NQZXJMaW5lID0gY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7XG4gICAgdmFyIGJsb2Nrc1BlckNvbHVtbiA9IGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW47XG4gICAgdmFyIGNvbXB1dGF0aW9uQnVmZmVyID0gbmV3IEludDE2QXJyYXkoNjQpO1xuXG4gICAgZm9yICh2YXIgYmxvY2tSb3cgPSAwOyBibG9ja1JvdyA8IGJsb2Nrc1BlckNvbHVtbjsgYmxvY2tSb3crKykge1xuICAgICAgZm9yICh2YXIgYmxvY2tDb2wgPSAwOyBibG9ja0NvbCA8IGJsb2Nrc1BlckxpbmU7IGJsb2NrQ29sKyspIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTtcbiAgICAgICAgcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgb2Zmc2V0LCBjb21wdXRhdGlvbkJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGN1cnJlbnRQb3MsIHN0YXJ0UG9zID0gY3VycmVudFBvcykge1xuICAgIGNvbnN0IG1heFBvcyA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICB2YXIgbmV3UG9zID0gc3RhcnRQb3MgPCBjdXJyZW50UG9zID8gc3RhcnRQb3MgOiBjdXJyZW50UG9zO1xuXG4gICAgaWYgKGN1cnJlbnRQb3MgPj0gbWF4UG9zKSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gRG9uJ3QgYXR0ZW1wdCB0byByZWFkIG5vbi1leGlzdGVudCBkYXRhIGFuZCBqdXN0IHJldHVybi5cbiAgICB9XG4gICAgdmFyIGN1cnJlbnRNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIGN1cnJlbnRQb3MpO1xuICAgIGlmIChjdXJyZW50TWFya2VyID49IDB4ZmZjMCAmJiBjdXJyZW50TWFya2VyIDw9IDB4ZmZmZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW52YWxpZDogbnVsbCxcbiAgICAgICAgbWFya2VyOiBjdXJyZW50TWFya2VyLFxuICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQb3MsXG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgbmV3TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBuZXdQb3MpO1xuICAgIHdoaWxlICghKG5ld01hcmtlciA+PSAweGZmYzAgJiYgbmV3TWFya2VyIDw9IDB4ZmZmZSkpIHtcbiAgICAgIGlmICgrK25ld1BvcyA+PSBtYXhQb3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIERvbid0IGF0dGVtcHQgdG8gcmVhZCBub24tZXhpc3RlbnQgZGF0YSBhbmQganVzdCByZXR1cm4uXG4gICAgICB9XG4gICAgICBuZXdNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG5ld1Bvcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpbnZhbGlkOiBjdXJyZW50TWFya2VyLnRvU3RyaW5nKDE2KSxcbiAgICAgIG1hcmtlcjogbmV3TWFya2VyLFxuICAgICAgb2Zmc2V0OiBuZXdQb3MsXG4gICAgfTtcbiAgfVxuXG4gIEpwZWdJbWFnZS5wcm90b3R5cGUgPSB7XG4gICAgcGFyc2UoZGF0YSwgeyBkbmxTY2FuTGluZXMgPSBudWxsIH0gPSB7fSkge1xuICAgICAgZnVuY3Rpb24gcmVhZERhdGFCbG9jaygpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgbGV0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7XG5cbiAgICAgICAgdmFyIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgZW5kT2Zmc2V0LCBvZmZzZXQpO1xuICAgICAgICBpZiAoZmlsZU1hcmtlciAmJiBmaWxlTWFya2VyLmludmFsaWQpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJyZWFkRGF0YUJsb2NrIC0gaW5jb3JyZWN0IGxlbmd0aCwgY3VycmVudCBtYXJrZXIgaXM6IFwiICtcbiAgICAgICAgICAgICAgZmlsZU1hcmtlci5pbnZhbGlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbmRPZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhcnJheSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBlbmRPZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7XG4gICAgICAgIHZhciBtY3VzUGVyTGluZSA9IE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDggLyBmcmFtZS5tYXhIKTtcbiAgICAgICAgdmFyIG1jdXNQZXJDb2x1bW4gPSBNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCAvIGZyYW1lLm1heFYpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgIHZhciBibG9ja3NQZXJMaW5lID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDgpICogY29tcG9uZW50LmgpIC8gZnJhbWUubWF4SFxuICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbiA9IE1hdGguY2VpbChcbiAgICAgICAgICAgIChNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCkgKiBjb21wb25lbnQudikgLyBmcmFtZS5tYXhWXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgYmxvY2tzUGVyTGluZUZvck1jdSA9IG1jdXNQZXJMaW5lICogY29tcG9uZW50Lmg7XG4gICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbkZvck1jdSA9IG1jdXNQZXJDb2x1bW4gKiBjb21wb25lbnQudjtcblxuICAgICAgICAgIHZhciBibG9ja3NCdWZmZXJTaXplID1cbiAgICAgICAgICAgIDY0ICogYmxvY2tzUGVyQ29sdW1uRm9yTWN1ICogKGJsb2Nrc1BlckxpbmVGb3JNY3UgKyAxKTtcbiAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhID0gbmV3IEludDE2QXJyYXkoYmxvY2tzQnVmZmVyU2l6ZSk7XG4gICAgICAgICAgY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgPSBibG9ja3NQZXJMaW5lO1xuICAgICAgICAgIGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4gPSBibG9ja3NQZXJDb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUubWN1c1BlckxpbmUgPSBtY3VzUGVyTGluZTtcbiAgICAgICAgZnJhbWUubWN1c1BlckNvbHVtbiA9IG1jdXNQZXJDb2x1bW47XG4gICAgICB9XG5cbiAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgdmFyIGpmaWYgPSBudWxsO1xuICAgICAgdmFyIGFkb2JlID0gbnVsbDtcbiAgICAgIHZhciBmcmFtZSwgcmVzZXRJbnRlcnZhbDtcbiAgICAgIGxldCBudW1TT1NNYXJrZXJzID0gMDtcbiAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTtcbiAgICAgIHZhciBodWZmbWFuVGFibGVzQUMgPSBbXSxcbiAgICAgICAgaHVmZm1hblRhYmxlc0RDID0gW107XG5cbiAgICAgIGxldCBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICBpZiAoZmlsZU1hcmtlciAhPT0gLyogU09JIChTdGFydCBvZiBJbWFnZSkgPSAqLyAweGZmZDgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcIlNPSSBub3QgZm91bmRcIik7XG4gICAgICB9XG4gICAgICBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG5cbiAgICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAvKiBFT0kgKEVuZCBvZiBJbWFnZSkgPSAqLyAweGZmZDkpIHtcbiAgICAgICAgdmFyIGksIGosIGw7XG4gICAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikge1xuICAgICAgICAgIGNhc2UgMHhmZmUwOiAvLyBBUFAwIChBcHBsaWNhdGlvbiBTcGVjaWZpYylcbiAgICAgICAgICBjYXNlIDB4ZmZlMTogLy8gQVBQMVxuICAgICAgICAgIGNhc2UgMHhmZmUyOiAvLyBBUFAyXG4gICAgICAgICAgY2FzZSAweGZmZTM6IC8vIEFQUDNcbiAgICAgICAgICBjYXNlIDB4ZmZlNDogLy8gQVBQNFxuICAgICAgICAgIGNhc2UgMHhmZmU1OiAvLyBBUFA1XG4gICAgICAgICAgY2FzZSAweGZmZTY6IC8vIEFQUDZcbiAgICAgICAgICBjYXNlIDB4ZmZlNzogLy8gQVBQN1xuICAgICAgICAgIGNhc2UgMHhmZmU4OiAvLyBBUFA4XG4gICAgICAgICAgY2FzZSAweGZmZTk6IC8vIEFQUDlcbiAgICAgICAgICBjYXNlIDB4ZmZlYTogLy8gQVBQMTBcbiAgICAgICAgICBjYXNlIDB4ZmZlYjogLy8gQVBQMTFcbiAgICAgICAgICBjYXNlIDB4ZmZlYzogLy8gQVBQMTJcbiAgICAgICAgICBjYXNlIDB4ZmZlZDogLy8gQVBQMTNcbiAgICAgICAgICBjYXNlIDB4ZmZlZTogLy8gQVBQMTRcbiAgICAgICAgICBjYXNlIDB4ZmZlZjogLy8gQVBQMTVcbiAgICAgICAgICBjYXNlIDB4ZmZmZTogLy8gQ09NIChDb21tZW50KVxuICAgICAgICAgICAgdmFyIGFwcERhdGEgPSByZWFkRGF0YUJsb2NrKCk7XG5cbiAgICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZTApIHtcbiAgICAgICAgICAgICAgLy8gJ0pGSUZcXHgwMCdcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFwcERhdGFbMF0gPT09IDB4NGEgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzFdID09PSAweDQ2ICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVsyXSA9PT0gMHg0OSAmJlxuICAgICAgICAgICAgICAgIGFwcERhdGFbM10gPT09IDB4NDYgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzRdID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGpmaWYgPSB7XG4gICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB7IG1ham9yOiBhcHBEYXRhWzVdLCBtaW5vcjogYXBwRGF0YVs2XSB9LFxuICAgICAgICAgICAgICAgICAgZGVuc2l0eVVuaXRzOiBhcHBEYXRhWzddLFxuICAgICAgICAgICAgICAgICAgeERlbnNpdHk6IChhcHBEYXRhWzhdIDw8IDgpIHwgYXBwRGF0YVs5XSxcbiAgICAgICAgICAgICAgICAgIHlEZW5zaXR5OiAoYXBwRGF0YVsxMF0gPDwgOCkgfCBhcHBEYXRhWzExXSxcbiAgICAgICAgICAgICAgICAgIHRodW1iV2lkdGg6IGFwcERhdGFbMTJdLFxuICAgICAgICAgICAgICAgICAgdGh1bWJIZWlnaHQ6IGFwcERhdGFbMTNdLFxuICAgICAgICAgICAgICAgICAgdGh1bWJEYXRhOiBhcHBEYXRhLnN1YmFycmF5KFxuICAgICAgICAgICAgICAgICAgICAxNCxcbiAgICAgICAgICAgICAgICAgICAgMTQgKyAzICogYXBwRGF0YVsxMl0gKiBhcHBEYXRhWzEzXVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPIEFQUDEgLSBFeGlmXG4gICAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmVlKSB7XG4gICAgICAgICAgICAgIC8vICdBZG9iZSdcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFwcERhdGFbMF0gPT09IDB4NDEgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzFdID09PSAweDY0ICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVsyXSA9PT0gMHg2ZiAmJlxuICAgICAgICAgICAgICAgIGFwcERhdGFbM10gPT09IDB4NjIgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzRdID09PSAweDY1XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFkb2JlID0ge1xuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogKGFwcERhdGFbNV0gPDwgOCkgfCBhcHBEYXRhWzZdLFxuICAgICAgICAgICAgICAgICAgZmxhZ3MwOiAoYXBwRGF0YVs3XSA8PCA4KSB8IGFwcERhdGFbOF0sXG4gICAgICAgICAgICAgICAgICBmbGFnczE6IChhcHBEYXRhWzldIDw8IDgpIHwgYXBwRGF0YVsxMF0sXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1Db2RlOiBhcHBEYXRhWzExXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRiOiAvLyBEUVQgKERlZmluZSBRdWFudGl6YXRpb24gVGFibGVzKVxuICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVzRW5kID0gcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoICsgb2Zmc2V0IC0gMjtcbiAgICAgICAgICAgIHZhciB6O1xuICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHF1YW50aXphdGlvblRhYmxlc0VuZCkge1xuICAgICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciB0YWJsZURhdGEgPSBuZXcgVWludDE2QXJyYXkoNjQpO1xuICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyA4IGJpdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTtcbiAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIDE2IGJpdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTtcbiAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiRFFUIC0gaW52YWxpZCB0YWJsZSBzcGVjXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlc1txdWFudGl6YXRpb25UYWJsZVNwZWMgJiAxNV0gPSB0YWJsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmMwOiAvLyBTT0YwIChTdGFydCBvZiBGcmFtZSwgQmFzZWxpbmUgRENUKVxuICAgICAgICAgIGNhc2UgMHhmZmMxOiAvLyBTT0YxIChTdGFydCBvZiBGcmFtZSwgRXh0ZW5kZWQgRENUKVxuICAgICAgICAgIGNhc2UgMHhmZmMyOiAvLyBTT0YyIChTdGFydCBvZiBGcmFtZSwgUHJvZ3Jlc3NpdmUgRENUKVxuICAgICAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXCJPbmx5IHNpbmdsZSBmcmFtZSBKUEVHcyBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICBmcmFtZSA9IHt9O1xuICAgICAgICAgICAgZnJhbWUuZXh0ZW5kZWQgPSBmaWxlTWFya2VyID09PSAweGZmYzE7XG4gICAgICAgICAgICBmcmFtZS5wcm9ncmVzc2l2ZSA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMjtcbiAgICAgICAgICAgIGZyYW1lLnByZWNpc2lvbiA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgY29uc3Qgc29mU2NhbkxpbmVzID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBmcmFtZS5zY2FuTGluZXMgPSBkbmxTY2FuTGluZXMgfHwgc29mU2NhbkxpbmVzO1xuICAgICAgICAgICAgZnJhbWUuc2FtcGxlc1BlckxpbmUgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkcyA9IHt9O1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IGRhdGFbb2Zmc2V0KytdLFxuICAgICAgICAgICAgICBjb21wb25lbnRJZDtcbiAgICAgICAgICAgIHZhciBtYXhIID0gMCxcbiAgICAgICAgICAgICAgbWF4ViA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgIHZhciBoID0gZGF0YVtvZmZzZXQgKyAxXSA+PiA0O1xuICAgICAgICAgICAgICB2YXIgdiA9IGRhdGFbb2Zmc2V0ICsgMV0gJiAxNTtcbiAgICAgICAgICAgICAgaWYgKG1heEggPCBoKSB7XG4gICAgICAgICAgICAgICAgbWF4SCA9IGg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG1heFYgPCB2KSB7XG4gICAgICAgICAgICAgICAgbWF4ViA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07XG4gICAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGgsXG4gICAgICAgICAgICAgICAgdixcbiAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLFxuICAgICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsLCAvLyBTZWUgY29tbWVudCBiZWxvdy5cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkc1tjb21wb25lbnRJZF0gPSBsIC0gMTtcbiAgICAgICAgICAgICAgb2Zmc2V0ICs9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcmFtZS5tYXhIID0gbWF4SDtcbiAgICAgICAgICAgIGZyYW1lLm1heFYgPSBtYXhWO1xuICAgICAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZjNDogLy8gREhUIChEZWZpbmUgSHVmZm1hbiBUYWJsZXMpXG4gICAgICAgICAgICBjb25zdCBodWZmbWFuTGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgaHVmZm1hbkxlbmd0aDsgKSB7XG4gICAgICAgICAgICAgIHZhciBodWZmbWFuVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgICAgICAgdmFyIGNvZGVMZW5ndGhTdW0gPSAwO1xuICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKywgb2Zmc2V0KyspIHtcbiAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoU3VtICs9IGNvZGVMZW5ndGhzW2pdID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7XG4gICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3RoU3VtOyBqKyssIG9mZnNldCsrKSB7XG4gICAgICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTtcblxuICAgICAgICAgICAgICAoaHVmZm1hblRhYmxlU3BlYyA+PiA0ID09PSAwID8gaHVmZm1hblRhYmxlc0RDIDogaHVmZm1hblRhYmxlc0FDKVtcbiAgICAgICAgICAgICAgICBodWZmbWFuVGFibGVTcGVjICYgMTVcbiAgICAgICAgICAgICAgXSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAweGZmZGQ6IC8vIERSSSAoRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwpXG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICByZXNldEludGVydmFsID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRhOiAvLyBTT1MgKFN0YXJ0IG9mIFNjYW4pXG4gICAgICAgICAgICAvLyBBIEROTCBtYXJrZXIgKDB4RkZEQyksIGlmIGl0IGV4aXN0cywgaXMgb25seSBhbGxvd2VkIGF0IHRoZSBlbmRcbiAgICAgICAgICAgIC8vIG9mIHRoZSBmaXJzdCBzY2FuIHNlZ21lbnQgYW5kIG1heSBvbmx5IG9jY3VyIG9uY2UgaW4gYW4gaW1hZ2UuXG4gICAgICAgICAgICAvLyBGdXJ0aGVybW9yZSwgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLCBkbyAqbm90KiBhdHRlbXB0IHRvXG4gICAgICAgICAgICAvLyBwYXJzZSBETkwgbWFya2VycyBkdXJpbmcgcmUtcGFyc2luZyBvZiB0aGUgSlBFRyBzY2FuIGRhdGEuXG4gICAgICAgICAgICBjb25zdCBwYXJzZUROTE1hcmtlciA9ICsrbnVtU09TTWFya2VycyA9PT0gMSAmJiAhZG5sU2NhbkxpbmVzO1xuXG4gICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gU2tpcCBtYXJrZXIgbGVuZ3RoLlxuXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JzQ291bnQgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnRzID0gW10sXG4gICAgICAgICAgICAgIGNvbXBvbmVudDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICAgIHZhciBjb21wb25lbnRJbmRleCA9IGZyYW1lLmNvbXBvbmVudElkc1tpbmRleF07XG4gICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbY29tcG9uZW50SW5kZXhdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgdmFyIHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlREMgPSBodWZmbWFuVGFibGVzRENbdGFibGVTcGVjID4+IDRdO1xuICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlQUMgPSBodWZmbWFuVGFibGVzQUNbdGFibGVTcGVjICYgMTVdO1xuICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzcGVjdHJhbFN0YXJ0ID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICB2YXIgc3BlY3RyYWxFbmQgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgIHZhciBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmFyIHByb2Nlc3NlZCA9IGRlY29kZVNjYW4oXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICAgICAgZnJhbWUsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgICAgICAgICByZXNldEludGVydmFsLFxuICAgICAgICAgICAgICAgIHNwZWN0cmFsU3RhcnQsXG4gICAgICAgICAgICAgICAgc3BlY3RyYWxFbmQsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPj4gNCxcbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LFxuICAgICAgICAgICAgICAgIHBhcnNlRE5MTWFya2VyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikge1xuICAgICAgICAgICAgICAgIHdhcm4oYCR7ZXgubWVzc2FnZX0gLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShkYXRhLCB7IGRubFNjYW5MaW5lczogZXguc2NhbkxpbmVzIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRU9JTWFya2VyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB3YXJuKGAke2V4Lm1lc3NhZ2V9IC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLmApO1xuICAgICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRjOiAvLyBETkwgKERlZmluZSBOdW1iZXIgb2YgTGluZXMpXG4gICAgICAgICAgICAvLyBJZ25vcmUgdGhlIG1hcmtlciwgc2luY2UgaXQncyBiZWluZyBoYW5kbGVkIGluIGBkZWNvZGVTY2FuYC5cbiAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZmZjogLy8gRmlsbCBieXRlc1xuICAgICAgICAgICAgaWYgKGRhdGFbb2Zmc2V0XSAhPT0gMHhmZikge1xuICAgICAgICAgICAgICAvLyBBdm9pZCBza2lwcGluZyBhIHZhbGlkIG1hcmtlci5cbiAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBDb3VsZCBiZSBpbmNvcnJlY3QgZW5jb2RpbmcgLS0gdGhlIGxhc3QgMHhGRiBieXRlIG9mIHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgLy8gYmxvY2sgY291bGQgaGF2ZSBiZWVuIGVhdGVuIGJ5IHRoZSBlbmNvZGVyLCBoZW5jZSB3ZSBmYWxsYmFjayB0b1xuICAgICAgICAgICAgLy8gYHN0YXJ0UG9zID0gb2Zmc2V0IC0gM2Agd2hlbiBsb29raW5nIGZvciB0aGUgbmV4dCB2YWxpZCBtYXJrZXIuXG4gICAgICAgICAgICBjb25zdCBuZXh0RmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgLyogY3VycmVudFBvcyA9ICovIG9mZnNldCAtIDIsXG4gICAgICAgICAgICAgIC8qIHN0YXJ0UG9zID0gKi8gb2Zmc2V0IC0gM1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChuZXh0RmlsZU1hcmtlciAmJiBuZXh0RmlsZU1hcmtlci5pbnZhbGlkKSB7XG4gICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgXCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiBcIiArXG4gICAgICAgICAgICAgICAgICBuZXh0RmlsZU1hcmtlci5pbnZhbGlkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG9mZnNldCA9IG5leHRGaWxlTWFya2VyLm9mZnNldDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID49IGRhdGEubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhIFwiICtcbiAgICAgICAgICAgICAgICAgIFwid2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWsgbWFya2VyTG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXG4gICAgICAgICAgICAgIFwiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6IFwiICsgZmlsZU1hcmtlci50b1N0cmluZygxNilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2lkdGggPSBmcmFtZS5zYW1wbGVzUGVyTGluZTtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gZnJhbWUuc2NhbkxpbmVzO1xuICAgICAgdGhpcy5qZmlmID0gamZpZjtcbiAgICAgIHRoaXMuYWRvYmUgPSBhZG9iZTtcbiAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tpXTtcblxuICAgICAgICAvLyBQcmV2ZW50IGVycm9ycyB3aGVuIERRVCBtYXJrZXJzIGFyZSBwbGFjZWQgYWZ0ZXIgU09Ge259IG1hcmtlcnMsXG4gICAgICAgIC8vIGJ5IGFzc2lnbmluZyB0aGUgYHF1YW50aXphdGlvblRhYmxlYCBlbnRyeSBhZnRlciB0aGUgZW50aXJlIGltYWdlXG4gICAgICAgIC8vIGhhcyBiZWVuIHBhcnNlZCAoZml4ZXMgaXNzdWU3NDA2LnBkZikuXG4gICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlc1tjb21wb25lbnQucXVhbnRpemF0aW9uSWRdO1xuICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGUpIHtcbiAgICAgICAgICBjb21wb25lbnQucXVhbnRpemF0aW9uVGFibGUgPSBxdWFudGl6YXRpb25UYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogY29tcG9uZW50LmluZGV4LFxuICAgICAgICAgIG91dHB1dDogYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpLFxuICAgICAgICAgIHNjYWxlWDogY29tcG9uZW50LmggLyBmcmFtZS5tYXhILFxuICAgICAgICAgIHNjYWxlWTogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWLFxuICAgICAgICAgIGJsb2Nrc1BlckxpbmU6IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lLFxuICAgICAgICAgIGJsb2Nrc1BlckNvbHVtbjogY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLm51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCwgaXNTb3VyY2VQREYgPSBmYWxzZSkge1xuICAgICAgdmFyIHNjYWxlWCA9IHRoaXMud2lkdGggLyB3aWR0aCxcbiAgICAgICAgc2NhbGVZID0gdGhpcy5oZWlnaHQgLyBoZWlnaHQ7XG5cbiAgICAgIHZhciBjb21wb25lbnQsIGNvbXBvbmVudFNjYWxlWCwgY29tcG9uZW50U2NhbGVZLCBibG9ja3NQZXJTY2FubGluZTtcbiAgICAgIHZhciB4LCB5LCBpLCBqLCBrO1xuICAgICAgdmFyIGluZGV4O1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICB2YXIgb3V0cHV0O1xuICAgICAgdmFyIG51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgdmFyIGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7XG4gICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoKTtcbiAgICAgIHZhciB4U2NhbGVCbG9ja09mZnNldCA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCk7XG4gICAgICB2YXIgbWFzazNMU0IgPSAweGZmZmZmZmY4OyAvLyB1c2VkIHRvIGNsZWFyIHRoZSAzIExTQnNcbiAgICAgIGxldCBsYXN0Q29tcG9uZW50U2NhbGVYO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7XG4gICAgICAgIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpXTtcbiAgICAgICAgY29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50LnNjYWxlWCAqIHNjYWxlWDtcbiAgICAgICAgY29tcG9uZW50U2NhbGVZID0gY29tcG9uZW50LnNjYWxlWSAqIHNjYWxlWTtcbiAgICAgICAgb2Zmc2V0ID0gaTtcbiAgICAgICAgb3V0cHV0ID0gY29tcG9uZW50Lm91dHB1dDtcbiAgICAgICAgYmxvY2tzUGVyU2NhbmxpbmUgPSAoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSA8PCAzO1xuICAgICAgICAvLyBQcmVjYWxjdWxhdGUgdGhlIGB4U2NhbGVCbG9ja09mZnNldGAuIFNpbmNlIGl0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgZGF0YSwgdGhhdCdzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYGNvbXBvbmVudFNjYWxlWGAgY2hhbmdlcy5cbiAgICAgICAgaWYgKGNvbXBvbmVudFNjYWxlWCAhPT0gbGFzdENvbXBvbmVudFNjYWxlWCkge1xuICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBqID0gMCB8ICh4ICogY29tcG9uZW50U2NhbGVYKTtcbiAgICAgICAgICAgIHhTY2FsZUJsb2NrT2Zmc2V0W3hdID0gKChqICYgbWFzazNMU0IpIDw8IDMpIHwgKGogJiA3KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDtcbiAgICAgICAgfVxuICAgICAgICAvLyBsaW5lYXJpemUgdGhlIGJsb2NrcyBvZiB0aGUgY29tcG9uZW50XG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICAgIGogPSAwIHwgKHkgKiBjb21wb25lbnRTY2FsZVkpO1xuICAgICAgICAgIGluZGV4ID0gKGJsb2Nrc1BlclNjYW5saW5lICogKGogJiBtYXNrM0xTQikpIHwgKChqICYgNykgPDwgMyk7XG4gICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9IG91dHB1dFtpbmRleCArIHhTY2FsZUJsb2NrT2Zmc2V0W3hdXTtcbiAgICAgICAgICAgIG9mZnNldCArPSBudW1Db21wb25lbnRzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkZWNvZGVUcmFuc2Zvcm0gY29udGFpbnMgcGFpcnMgb2YgbXVsdGlwbGllciAoLTI1Ni4uMjU2KSBhbmQgYWRkaXRpdmVcbiAgICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07XG5cbiAgICAgIC8vIEluIFBERiBmaWxlcywgSlBFRyBpbWFnZXMgd2l0aCBDTVlLIGNvbG91ciBzcGFjZXMgYXJlIHVzdWFsbHkgaW52ZXJ0ZWRcbiAgICAgIC8vICh0aGlzIGNhbiBiZSBvYnNlcnZlZCBieSBleHRyYWN0aW5nIHRoZSByYXcgaW1hZ2UgZGF0YSkuXG4gICAgICAvLyBTaW5jZSB0aGUgY29udmVyc2lvbiBhbGdvcml0aG1zIChzZWUgYmVsb3cpIHdlcmUgd3JpdHRlbiBwcmltYXJpbHkgZm9yXG4gICAgICAvLyB0aGUgUERGIHVzZS1jYXNlcywgYXR0ZW1wdGluZyB0byB1c2UgYEpwZWdJbWFnZWAgdG8gcGFyc2Ugc3RhbmRhbG9uZVxuICAgICAgLy8gSlBFRyAoQ01ZSykgaW1hZ2VzIG1heSB0aHVzIHJlc3VsdCBpbiBpbnZlcnRlZCBpbWFnZXMgKHNlZSBpc3N1ZSA5NTEzKS5cbiAgICAgIC8vXG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0J3Mgbm90IChhbHdheXMpIHBvc3NpYmxlIHRvIHRlbGwsIGZyb20gdGhlIGltYWdlIGRhdGFcbiAgICAgIC8vIGFsb25lLCBpZiBpdCBuZWVkcyB0byBiZSBpbnZlcnRlZC4gVGh1cyBpbiBhbiBhdHRlbXB0IHRvIHByb3ZpZGUgYmV0dGVyXG4gICAgICAvLyBvdXQtb2YtYm94IGJlaGF2aW91ciB3aGVuIGBKcGVnSW1hZ2VgIGlzIHVzZWQgc3RhbmRhbG9uZSwgZGVmYXVsdCB0b1xuICAgICAgLy8gaW52ZXJ0aW5nIEpQRUcgKENNWUspIGltYWdlcyBpZiBhbmQgb25seSBpZiB0aGUgaW1hZ2UgZGF0YSBkb2VzICpub3QqXG4gICAgICAvLyBjb21lIGZyb20gYSBQREYgZmlsZSBhbmQgbm8gYGRlY29kZVRyYW5zZm9ybWAgd2FzIHBhc3NlZCBieSB0aGUgdXNlci5cbiAgICAgIGlmICghaXNTb3VyY2VQREYgJiYgbnVtQ29tcG9uZW50cyA9PT0gNCAmJiAhdHJhbnNmb3JtKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShbXG4gICAgICAgICAgLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1XSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICkge1xuICAgICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgbnVtQ29tcG9uZW50czsgaisrLCBpKyssIGsgKz0gMikge1xuICAgICAgICAgICAgZGF0YVtpXSA9ICgoZGF0YVtpXSAqIHRyYW5zZm9ybVtrXSkgPj4gOCkgKyB0cmFuc2Zvcm1bayArIDFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIGdldCBfaXNDb2xvckNvbnZlcnNpb25OZWVkZWQoKSB7XG4gICAgICBpZiAodGhpcy5hZG9iZSkge1xuICAgICAgICAvLyBUaGUgYWRvYmUgdHJhbnNmb3JtIG1hcmtlciBvdmVycmlkZXMgYW55IHByZXZpb3VzIHNldHRpbmcuXG4gICAgICAgIHJldHVybiAhIXRoaXMuYWRvYmUudHJhbnNmb3JtQ29kZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbG9yVHJhbnNmb3JtID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIEFkb2JlIHRyYW5zZm9ybSBtYXJrZXIgaXMgbm90IHByZXNlbnQgYW5kIHRoZSBpbWFnZVxuICAgICAgICAgIC8vIGRpY3Rpb25hcnkgaGFzIGEgJ0NvbG9yVHJhbnNmb3JtJyBlbnRyeSwgZXhwbGljaXRseSBzZXQgdG8gYDBgLFxuICAgICAgICAgIC8vIHRoZW4gdGhlIGNvbG91cnMgc2hvdWxkICpub3QqIGJlIHRyYW5zZm9ybWVkLlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbMF0uaW5kZXggPT09IC8qIFwiUlwiID0gKi8gMHg1MiAmJlxuICAgICAgICAgIHRoaXMuY29tcG9uZW50c1sxXS5pbmRleCA9PT0gLyogXCJHXCIgPSAqLyAweDQ3ICYmXG4gICAgICAgICAgdGhpcy5jb21wb25lbnRzWzJdLmluZGV4ID09PSAvKiBcIkJcIiA9ICovIDB4NDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHRocmVlIGNvbXBvbmVudHMgYXJlIGluZGV4ZWQgYXMgUkdCIGluIEFTQ0lJXG4gICAgICAgICAgLy8gdGhlbiB0aGUgY29sb3VycyBzaG91bGQgKm5vdCogYmUgdHJhbnNmb3JtZWQuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gYHRoaXMubnVtQ29tcG9uZW50cyAhPT0gM2BcbiAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMSkge1xuICAgICAgICAvLyBJZiB0aGUgQWRvYmUgdHJhbnNmb3JtIG1hcmtlciBpcyBub3QgcHJlc2VudCBhbmQgdGhlIGltYWdlXG4gICAgICAgIC8vIGRpY3Rpb25hcnkgaGFzIGEgJ0NvbG9yVHJhbnNmb3JtJyBlbnRyeSwgZXhwbGljaXRseSBzZXQgdG8gYDFgLFxuICAgICAgICAvLyB0aGVuIHRoZSBjb2xvdXJzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIF9jb252ZXJ0WWNjVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRZY2NUb1JnYihkYXRhKSB7XG4gICAgICB2YXIgWSwgQ2IsIENyO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGRhdGFbaV0gPSBZIC0gMTc5LjQ1NiArIDEuNDAyICogQ3I7XG4gICAgICAgIGRhdGFbaSArIDFdID0gWSArIDEzNS40NTkgLSAwLjM0NCAqIENiIC0gMC43MTQgKiBDcjtcbiAgICAgICAgZGF0YVtpICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRZY2NrVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRZY2NrVG9SZ2IoZGF0YSkge1xuICAgICAgdmFyIFksIENiLCBDciwgaztcbiAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGsgPSBkYXRhW2kgKyAzXTtcblxuICAgICAgICBkYXRhW29mZnNldCsrXSA9XG4gICAgICAgICAgLTEyMi42NzE5NTQwNjg5NCArXG4gICAgICAgICAgQ2IgKlxuICAgICAgICAgICAgKC02LjYwNjM1NjY5NDIwMzY0ZS01ICogQ2IgK1xuICAgICAgICAgICAgICAwLjAwMDQzNzEzMDQ3NTkyNjIzMiAqIENyIC1cbiAgICAgICAgICAgICAgNS40MDgwNjEwMDY0NTk5ZS01ICogWSArXG4gICAgICAgICAgICAgIDAuMDAwNDg0NDk3OTcxMjAyODEgKiBrIC1cbiAgICAgICAgICAgICAgMC4xNTQzNjIxNTE4NzExMjYpICtcbiAgICAgICAgICBDciAqXG4gICAgICAgICAgICAoLTAuMDAwOTU3OTY0Mzc4NDQ1NzczICogQ3IgK1xuICAgICAgICAgICAgICAwLjAwMDgxNzA3NjkxMTM0NjYyNSAqIFkgLVxuICAgICAgICAgICAgICAwLjAwNDc3MjcxNDA1NDA4NzQ3ICogayArXG4gICAgICAgICAgICAgIDEuNTMzODAyNTMyMjE3MzQpICtcbiAgICAgICAgICBZICpcbiAgICAgICAgICAgICgwLjAwMDk2MTI1MDE4NDEzMDY4OCAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjY2MjU3MzMyMjgzOTMzICogayArXG4gICAgICAgICAgICAgIDAuNDgzNTcwODg0NTEyNjUpICtcbiAgICAgICAgICBrICogKC0wLjAwMDMzNjE5NzE3NzYxODM5NCAqIGsgKyAwLjQ4NDc5MTU2MTQ5MDc3Nik7XG5cbiAgICAgICAgZGF0YVtvZmZzZXQrK10gPVxuICAgICAgICAgIDEwNy4yNjgwMzkzOTc3MjQgK1xuICAgICAgICAgIENiICpcbiAgICAgICAgICAgICgyLjE5OTI3MTA0NTI1NzQxZS01ICogQ2IgLVxuICAgICAgICAgICAgICAwLjAwMDY0MDk5MjAxODI5Nzk0NSAqIENyICtcbiAgICAgICAgICAgICAgMC4wMDA2NTkzOTcwMDEyNDU1NzcgKiBZICtcbiAgICAgICAgICAgICAgMC4wMDA0MjYxMDU2NTI5Mzg4MzcgKiBrIC1cbiAgICAgICAgICAgICAgMC4xNzY0OTE3OTI0NjI4NzUpICtcbiAgICAgICAgICBDciAqXG4gICAgICAgICAgICAoLTAuMDAwNzc4MjY5OTQxNTEzNjgzICogQ3IgK1xuICAgICAgICAgICAgICAwLjAwMTMwODcyMjYxNDA4Mjc1ICogWSArXG4gICAgICAgICAgICAgIDAuMDAwNzcwNDgyNjMxODAxMTMyICogayAtXG4gICAgICAgICAgICAgIDAuMTUxMDUxNDkyNzc1NTYyKSArXG4gICAgICAgICAgWSAqXG4gICAgICAgICAgICAoMC4wMDEyNjkzNTM2ODExNDg0MyAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjY1MDkwMTg5MDEwODk4ICogayArXG4gICAgICAgICAgICAgIDAuMjU4MDI5MTAyMDY4NDUpICtcbiAgICAgICAgICBrICogKC0wLjAwMDMxODkxMzExNzU4ODMyOCAqIGsgLSAwLjIxMzc0MjQwMDMyMzY2NSk7XG5cbiAgICAgICAgZGF0YVtvZmZzZXQrK10gPVxuICAgICAgICAgIC0yMC44MTAwMTI1NDY5NDcgK1xuICAgICAgICAgIENiICpcbiAgICAgICAgICAgICgtMC4wMDA1NzAxMTUxOTY5NzM2NzcgKiBDYiAtXG4gICAgICAgICAgICAgIDIuNjM0MDkwNTEwMDQ1ODllLTUgKiBDciArXG4gICAgICAgICAgICAgIDAuMDAyMDc0MTA4ODExNTAxMiAqIFkgLVxuICAgICAgICAgICAgICAwLjAwMjg4MjYwMjM2ODUzNDQyICogayArXG4gICAgICAgICAgICAgIDAuODE0MjcyOTY4MzU5Mjk1KSArXG4gICAgICAgICAgQ3IgKlxuICAgICAgICAgICAgKC0xLjUzNDk2MDU3NDQwOTc1ZS01ICogQ3IgLVxuICAgICAgICAgICAgICAwLjAwMDEzMjY4OTA0Mzk2MTQ0NiAqIFkgK1xuICAgICAgICAgICAgICAwLjAwMDU2MDgzMzY5MTI0MjgxMiAqIGsgLVxuICAgICAgICAgICAgICAwLjE5NTE1MjAyNzUzNDA0OSkgK1xuICAgICAgICAgIFkgKlxuICAgICAgICAgICAgKDAuMDAxNzQ0MTgxMzI5Mjc1ODIgKiBZIC1cbiAgICAgICAgICAgICAgMC4wMDI1NTI0MzMyMTQzOTM0NyAqIGsgK1xuICAgICAgICAgICAgICAwLjExNjkzNTAyMDQ2NTE0NSkgK1xuICAgICAgICAgIGsgKiAoLTAuMDAwMzQzNTMxOTk2NTEwNTU1ICogayArIDAuMjQxNjUyNjAyMzI0MDcpO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHRoYXQgb25seSB0aGUgY29udmVydGVkIFJHQiBkYXRhIGlzIHJldHVybmVkLlxuICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgb2Zmc2V0KTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRZY2NrVG9DbXlrOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7XG4gICAgICB2YXIgWSwgQ2IsIENyO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgWSA9IGRhdGFbaV07XG4gICAgICAgIENiID0gZGF0YVtpICsgMV07XG4gICAgICAgIENyID0gZGF0YVtpICsgMl07XG4gICAgICAgIGRhdGFbaV0gPSA0MzQuNDU2IC0gWSAtIDEuNDAyICogQ3I7XG4gICAgICAgIGRhdGFbaSArIDFdID0gMTE5LjU0MSAtIFkgKyAwLjM0NCAqIENiICsgMC43MTQgKiBDcjtcbiAgICAgICAgZGF0YVtpICsgMl0gPSA0ODEuODE2IC0gWSAtIDEuNzcyICogQ2I7XG4gICAgICAgIC8vIEsgaW4gZGF0YVtpICsgM10gaXMgdW5jaGFuZ2VkXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG4gICAgX2NvbnZlcnRDbXlrVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRDbXlrVG9SZ2IoZGF0YSkge1xuICAgICAgdmFyIGMsIG0sIHksIGs7XG4gICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGMgPSBkYXRhW2ldO1xuICAgICAgICBtID0gZGF0YVtpICsgMV07XG4gICAgICAgIHkgPSBkYXRhW2kgKyAyXTtcbiAgICAgICAgayA9IGRhdGFbaSArIDNdO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKC0wLjAwMDA2NzQ3MTQ3MDczNjAyNDQxICogYyArXG4gICAgICAgICAgICAgIDAuMDAwODM3OTI2MjEyMTAxMzcyNyAqIG0gK1xuICAgICAgICAgICAgICAwLjAwMDI4OTQ3MTgxODg2NDMyOTQgKiB5ICtcbiAgICAgICAgICAgICAgMC4wMDMyNjQyMzEwNTc1Mzc4MDYgKiBrIC1cbiAgICAgICAgICAgICAgMS4xMTg1NjExODY3MjAzOTM3KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoMC4wMDAwMjYzNzQxMDc2MTYwODk0MDUgKiBtIC1cbiAgICAgICAgICAgICAgMC4wMDAwODYyNjk0OTE1ODYzODU3MiAqIHkgLVxuICAgICAgICAgICAgICAwLjAwMDI3NDg3NjkwNjc0OTk0OTEgKiBrIC1cbiAgICAgICAgICAgICAgMC4wMjE1NTY4ODc5NDk3ODk2NykgK1xuICAgICAgICAgIHkgKlxuICAgICAgICAgICAgKC0wLjAwMDAzODc4MDk5MjEyODY5MzYzICogeSAtXG4gICAgICAgICAgICAgIDAuMDAwMzI2NzgwODI3OTQ4NTI4NiAqIGsgK1xuICAgICAgICAgICAgICAwLjA2ODY3NDIyMzg1OTUzNDUpIC1cbiAgICAgICAgICBrICogKDAuMDAwMzM2MTk3MTc3NjE4MzkzNyAqIGsgKyAwLjc0MzA2NTkxNTEzNDIyNTQpO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKDAuMDAwMTM1OTYzNzI4MTM1ODg4NDggKiBjICtcbiAgICAgICAgICAgICAgMC4wMDA5MjQ1MzcxMzI1NzM1ODUgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDAxMDU2NzM1OTYxODY4MzU5MyAqIHkgK1xuICAgICAgICAgICAgICAwLjAwMDQ3OTE4NjQ2ODc0MzY1MTIgKiBrIC1cbiAgICAgICAgICAgICAgMC4zMTA5Njg5NTg3NTE1ODc1KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoLTAuMDAwMjM1NDUzNDYxMDgzNzAzNDQgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDAyNzAyODQ1MjUzNTM0NzE0ICogeSArXG4gICAgICAgICAgICAgIDAuMDAyMDIwMDMwODk3NzMwNzE1NiAqIGsgLVxuICAgICAgICAgICAgICAwLjc0ODgwNTIxNjcwMTU0OTQpICtcbiAgICAgICAgICB5ICpcbiAgICAgICAgICAgICgwLjAwMDA2ODM0ODE1OTk4MjM1NjYyICogeSArXG4gICAgICAgICAgICAgIDAuMDAwMTUxNjg0NTIzNjM0NjA5NzMgKiBrIC1cbiAgICAgICAgICAgICAgMC4wOTc1MTkyNzc3NDcyODkzMykgLVxuICAgICAgICAgIGsgKiAoMC4wMDAzMTg5MTMxMTc1ODgzMjgxNCAqIGsgKyAwLjczNjQ4ODM4MDc3MzMxNjgpO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAyNTUgK1xuICAgICAgICAgIGMgKlxuICAgICAgICAgICAgKDAuMDAwMDEzNTk4NjUwNDExMzg1MzA3ICogYyArXG4gICAgICAgICAgICAgIDAuMDAwMTI0MjM5NTYxNzU0OTA4NTEgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDA0NzUxOTg1MDk3NTgzNTg5ICogeSAtXG4gICAgICAgICAgICAgIDAuMDAwMDAzNjcyOTMxNzQ3NjYzMDQyMiAqIGsgLVxuICAgICAgICAgICAgICAwLjA1NTYyMTg2OTgwMjY0MDM0KSArXG4gICAgICAgICAgbSAqXG4gICAgICAgICAgICAoMC4wMDAxNjE0MTM4MDU5ODcyNDY3NiAqIG0gK1xuICAgICAgICAgICAgICAwLjAwMDk2OTIyMzkxMzA3MjUxODYgKiB5ICtcbiAgICAgICAgICAgICAgMC4wMDA3NzgyNjkyNDUwMDM2MjUzICogayAtXG4gICAgICAgICAgICAgIDAuNDQwMTUyMzIzNjc1MjY0NjMpICtcbiAgICAgICAgICB5ICpcbiAgICAgICAgICAgICg1LjA2ODg4MjkxNDA2ODc2OWUtNyAqIHkgK1xuICAgICAgICAgICAgICAwLjAwMTc3NzgzNjkwMTEzNzUwNzEgKiBrIC1cbiAgICAgICAgICAgICAgMC43NTkxNDU0NjQ5NzQ5NjA5KSAtXG4gICAgICAgICAgayAqICgwLjAwMDM0MzUzMTk5NjUxMDU1NTMgKiBrICsgMC43MDYzNzcwMTg2MTYwMTQ0KTtcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGF0IG9ubHkgdGhlIGNvbnZlcnRlZCBSR0IgZGF0YSBpcyByZXR1cm5lZC5cbiAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7XG4gICAgfSxcblxuICAgIGdldERhdGEoeyB3aWR0aCwgaGVpZ2h0LCBmb3JjZVJHQiA9IGZhbHNlLCBpc1NvdXJjZVBERiA9IGZhbHNlIH0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBURVNUSU5HXCIpXG4gICAgICApIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGlzU291cmNlUERGID09PSB0cnVlLFxuICAgICAgICAgICdKcGVnSW1hZ2UuZ2V0RGF0YTogVW5leHBlY3RlZCBcImlzU291cmNlUERGXCIgdmFsdWUgZm9yIFBERiBmaWxlcy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID4gNCkge1xuICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZVwiKTtcbiAgICAgIH1cbiAgICAgIC8vIFR5cGUgb2YgZGF0YTogVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiBudW1Db21wb25lbnRzKVxuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTtcblxuICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMSAmJiBmb3JjZVJHQikge1xuICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICB2YXIgcmdiRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoICogMyk7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBncmF5Q29sb3IgPSBkYXRhW2ldO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICAgIHJnYkRhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZ2JEYXRhO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMgJiYgdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSA0KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCkge1xuICAgICAgICAgIGlmIChmb3JjZVJHQikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2IoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JjZVJHQikge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBKcGVnSW1hZ2U7XG59KSgpO1xuXG5leHBvcnQgeyBKcGVnSW1hZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uLCBpbmZvLCB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBsb2cyLCByZWFkVWludDE2LCByZWFkVWludDMyIH0gZnJvbSBcIi4vY29yZV91dGlscy5qc1wiO1xuaW1wb3J0IHsgQXJpdGhtZXRpY0RlY29kZXIgfSBmcm9tIFwiLi9hcml0aG1ldGljX2RlY29kZXIuanNcIjtcblxuY2xhc3MgSnB4RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIoYEpQWCBlcnJvcjogJHttc2d9YCk7XG4gIH1cbn1cblxudmFyIEpweEltYWdlID0gKGZ1bmN0aW9uIEpweEltYWdlQ2xvc3VyZSgpIHtcbiAgLy8gVGFibGUgRS4xXG4gIHZhciBTdWJiYW5kc0dhaW5Mb2cyID0ge1xuICAgIExMOiAwLFxuICAgIExIOiAxLFxuICAgIEhMOiAxLFxuICAgIEhIOiAyLFxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZnVuY3Rpb24gSnB4SW1hZ2UoKSB7XG4gICAgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSA9IGZhbHNlO1xuICB9XG4gIEpweEltYWdlLnByb3RvdHlwZSA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2UoZGF0YSkge1xuICAgICAgdmFyIGhlYWQgPSByZWFkVWludDE2KGRhdGEsIDApO1xuICAgICAgLy8gTm8gYm94IGhlYWRlciwgaW1tZWRpYXRlIHN0YXJ0IG9mIGNvZGVzdHJlYW0gKFNPQylcbiAgICAgIGlmIChoZWFkID09PSAweGZmNGYpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwb3NpdGlvbiA9IDAsXG4gICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBoZWFkZXJTaXplID0gODtcbiAgICAgICAgdmFyIGxib3ggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIHRib3ggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCk7XG4gICAgICAgIHBvc2l0aW9uICs9IGhlYWRlclNpemU7XG4gICAgICAgIGlmIChsYm94ID09PSAxKSB7XG4gICAgICAgICAgLy8gWExCb3g6IHJlYWQgVUludDY0IGFjY29yZGluZyB0byBzcGVjLlxuICAgICAgICAgIC8vIEphdmFTY3JpcHQncyBpbnQgcHJlY2lzaW9uIG9mIDUzIGJpdCBzaG91bGQgYmUgc3VmZmljaWVudCBoZXJlLlxuICAgICAgICAgIGxib3ggPVxuICAgICAgICAgICAgcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbikgKiA0Mjk0OTY3Mjk2ICtcbiAgICAgICAgICAgIHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KTtcbiAgICAgICAgICBwb3NpdGlvbiArPSA4O1xuICAgICAgICAgIGhlYWRlclNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGJveCA9PT0gMCkge1xuICAgICAgICAgIGxib3ggPSBsZW5ndGggLSBwb3NpdGlvbiArIGhlYWRlclNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxib3ggPCBoZWFkZXJTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiSW52YWxpZCBib3ggZmllbGQgc2l6ZVwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGxib3ggLSBoZWFkZXJTaXplO1xuICAgICAgICB2YXIganVtcERhdGFMZW5ndGggPSB0cnVlO1xuICAgICAgICBzd2l0Y2ggKHRib3gpIHtcbiAgICAgICAgICBjYXNlIDB4NmE3MDMyNjg6IC8vICdqcDJoJ1xuICAgICAgICAgICAganVtcERhdGFMZW5ndGggPSBmYWxzZTsgLy8gcGFyc2luZyBjaGlsZCBib3hlc1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDYzNmY2YzcyOiAvLyAnY29scidcbiAgICAgICAgICAgIC8vIENvbG9yc3BhY2VzIGFyZSBub3QgdXNlZCwgdGhlIENTIGZyb20gdGhlIFBERiBpcyB1c2VkLlxuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IGRhdGFbcG9zaXRpb25dO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gMSkge1xuICAgICAgICAgICAgICAvLyBlbnVtZXJhdGVkIGNvbG9yc3BhY2VcbiAgICAgICAgICAgICAgdmFyIGNvbG9yc3BhY2UgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMyk7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY29sb3JzcGFjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6IC8vIHRoaXMgaW5kaWNhdGVzIGEgc1JHQiBjb2xvcnNwYWNlXG4gICAgICAgICAgICAgICAgY2FzZSAxNzogLy8gdGhpcyBpbmRpY2F0ZXMgYSBncmF5c2NhbGUgY29sb3JzcGFjZVxuICAgICAgICAgICAgICAgIGNhc2UgMTg6IC8vIHRoaXMgaW5kaWNhdGVzIGEgWVVWIGNvbG9yc3BhY2VcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB3YXJuKFwiVW5rbm93biBjb2xvcnNwYWNlIFwiICsgY29sb3JzcGFjZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IDIpIHtcbiAgICAgICAgICAgICAgaW5mbyhcIklDQyBwcm9maWxlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4NmE3MDMyNjM6IC8vICdqcDJjJ1xuICAgICAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgcG9zaXRpb24sIHBvc2l0aW9uICsgZGF0YUxlbmd0aCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4NmE1MDIwMjA6IC8vICdqUFxcMDI0XFwwMjQnXG4gICAgICAgICAgICBpZiAocmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbikgIT09IDB4MGQwYTg3MGEpIHtcbiAgICAgICAgICAgICAgd2FybihcIkludmFsaWQgSlAyIHNpZ25hdHVyZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGVhZGVyIHR5cGVzIGFyZSB2YWxpZCBidXQgY3VycmVudGx5IG5vdCB1c2VkOlxuICAgICAgICAgIGNhc2UgMHg2YTUwMWExYTogLy8gJ2pQXFwwMzJcXDAzMidcbiAgICAgICAgICBjYXNlIDB4NjY3NDc5NzA6IC8vICdmdHlwJ1xuICAgICAgICAgIGNhc2UgMHg3MjcyNjU3MTogLy8gJ3JyZXEnXG4gICAgICAgICAgY2FzZSAweDcyNjU3MzIwOiAvLyAncmVzICdcbiAgICAgICAgICBjYXNlIDB4Njk2ODY0NzI6IC8vICdpaGRyJ1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciBoZWFkZXJUeXBlID0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICAgKHRib3ggPj4gMjQpICYgMHhmZixcbiAgICAgICAgICAgICAgKHRib3ggPj4gMTYpICYgMHhmZixcbiAgICAgICAgICAgICAgKHRib3ggPj4gOCkgJiAweGZmLFxuICAgICAgICAgICAgICB0Ym94ICYgMHhmZlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHdhcm4oXCJVbnN1cHBvcnRlZCBoZWFkZXIgdHlwZSBcIiArIHRib3ggKyBcIiAoXCIgKyBoZWFkZXJUeXBlICsgXCIpXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGp1bXBEYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgcG9zaXRpb24gKz0gZGF0YUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgcGFyc2VJbWFnZVByb3BlcnRpZXM6IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlSW1hZ2VQcm9wZXJ0aWVzKHN0cmVhbSkge1xuICAgICAgdmFyIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgd2hpbGUgKG5ld0J5dGUgPj0gMCkge1xuICAgICAgICB2YXIgb2xkQnl0ZSA9IG5ld0J5dGU7XG4gICAgICAgIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgY29kZSA9IChvbGRCeXRlIDw8IDgpIHwgbmV3Qnl0ZTtcbiAgICAgICAgLy8gSW1hZ2UgYW5kIHRpbGUgc2l6ZSAoU0laKVxuICAgICAgICBpZiAoY29kZSA9PT0gMHhmZjUxKSB7XG4gICAgICAgICAgc3RyZWFtLnNraXAoNCk7XG4gICAgICAgICAgdmFyIFhzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSA0XG4gICAgICAgICAgdmFyIFlzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSA4XG4gICAgICAgICAgdmFyIFhPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7IC8vIEJ5dGUgMTJcbiAgICAgICAgICB2YXIgWU9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsgLy8gQnl0ZSAxNlxuICAgICAgICAgIHN0cmVhbS5za2lwKDE2KTtcbiAgICAgICAgICB2YXIgQ3NpeiA9IHN0cmVhbS5nZXRVaW50MTYoKTsgLy8gQnl0ZSAzNlxuICAgICAgICAgIHRoaXMud2lkdGggPSBYc2l6IC0gWE9zaXo7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBZc2l6IC0gWU9zaXo7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRzQ291bnQgPSBDc2l6O1xuICAgICAgICAgIC8vIFJlc3VsdHMgYXJlIGFsd2F5cyByZXR1cm5lZCBhcyBgVWludDhDbGFtcGVkQXJyYXlgcy5cbiAgICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSA4O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbVwiKTtcbiAgICB9LFxuICAgIHBhcnNlQ29kZXN0cmVhbTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICB2YXIgZG9Ob3RSZWNvdmVyID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBzdGFydDtcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uICsgMSA8IGVuZCkge1xuICAgICAgICAgIHZhciBjb2RlID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24gKz0gMjtcblxuICAgICAgICAgIHZhciBsZW5ndGggPSAwLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIHNxY2QsXG4gICAgICAgICAgICBzcHFjZHMsXG4gICAgICAgICAgICBzcHFjZFNpemUsXG4gICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQsXG4gICAgICAgICAgICB0aWxlO1xuICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgY2FzZSAweGZmNGY6IC8vIFN0YXJ0IG9mIGNvZGVzdHJlYW0gKFNPQylcbiAgICAgICAgICAgICAgY29udGV4dC5tYWluSGVhZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmZkOTogLy8gRW5kIG9mIGNvZGVzdHJlYW0gKEVPQylcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1MTogLy8gSW1hZ2UgYW5kIHRpbGUgc2l6ZSAoU0laKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIHNpeiA9IHt9O1xuICAgICAgICAgICAgICBzaXouWHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KTtcbiAgICAgICAgICAgICAgc2l6LllzaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgOCk7XG4gICAgICAgICAgICAgIHNpei5YT3NpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxMik7XG4gICAgICAgICAgICAgIHNpei5ZT3NpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxNik7XG4gICAgICAgICAgICAgIHNpei5YVHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAyMCk7XG4gICAgICAgICAgICAgIHNpei5ZVHNpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAyNCk7XG4gICAgICAgICAgICAgIHNpei5YVE9zaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMjgpO1xuICAgICAgICAgICAgICBzaXouWVRPc2l6ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDMyKTtcbiAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAzNik7XG4gICAgICAgICAgICAgIHNpei5Dc2l6ID0gY29tcG9uZW50c0NvdW50O1xuICAgICAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAzODtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB7XG4gICAgICAgICAgICAgICAgICBwcmVjaXNpb246IChkYXRhW2pdICYgMHg3ZikgKyAxLFxuICAgICAgICAgICAgICAgICAgaXNTaWduZWQ6ICEhKGRhdGFbal0gJiAweDgwKSxcbiAgICAgICAgICAgICAgICAgIFhSc2l6OiBkYXRhW2ogKyAxXSxcbiAgICAgICAgICAgICAgICAgIFlSc2l6OiBkYXRhW2ogKyAyXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGogKz0gMztcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGNvbXBvbmVudCwgc2l6KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250ZXh0LlNJWiA9IHNpejtcbiAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgICAgICAgICAgICAgY2FsY3VsYXRlVGlsZUdyaWRzKGNvbnRleHQsIGNvbXBvbmVudHMpO1xuICAgICAgICAgICAgICBjb250ZXh0LlFDQyA9IFtdO1xuICAgICAgICAgICAgICBjb250ZXh0LkNPQyA9IFtdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjVjOiAvLyBRdWFudGl6YXRpb24gZGVmYXVsdCAoUUNEKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIHFjZCA9IHt9O1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyO1xuICAgICAgICAgICAgICBzcWNkID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHNxY2QgJiAweDFmKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gODtcbiAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSAxNjtcbiAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU1FjZCB2YWx1ZSBcIiArIHNxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjZC5ub1F1YW50aXphdGlvbiA9IHNwcWNkU2l6ZSA9PT0gODtcbiAgICAgICAgICAgICAgcWNkLnNjYWxhckV4cG91bmRlZCA9IHNjYWxhckV4cG91bmRlZDtcbiAgICAgICAgICAgICAgcWNkLmd1YXJkQml0cyA9IHNxY2QgPj4gNTtcbiAgICAgICAgICAgICAgc3BxY2RzID0gW107XG4gICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICsgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BxY2QgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9ICgoZGF0YVtqXSAmIDB4NykgPDwgOCkgfCBkYXRhW2ogKyAxXTtcbiAgICAgICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjZC5TUHFjZHMgPSBzcHFjZHM7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LlFDRCA9IHFjZDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRCA9IHFjZDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQyA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweGZmNWQ6IC8vIFF1YW50aXphdGlvbiBjb21wb25lbnQgKFFDQylcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHZhciBxY2MgPSB7fTtcbiAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjtcbiAgICAgICAgICAgICAgdmFyIGNxY2M7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0LlNJWi5Dc2l6IDwgMjU3KSB7XG4gICAgICAgICAgICAgICAgY3FjYyA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcWNjID0gcmVhZFVpbnQxNihkYXRhLCBqKTtcbiAgICAgICAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgc3dpdGNoIChzcWNkICYgMHgxZikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDg7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2O1xuICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNRY2QgdmFsdWUgXCIgKyBzcWNkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBxY2Mubm9RdWFudGl6YXRpb24gPSBzcHFjZFNpemUgPT09IDg7XG4gICAgICAgICAgICAgIHFjYy5zY2FsYXJFeHBvdW5kZWQgPSBzY2FsYXJFeHBvdW5kZWQ7XG4gICAgICAgICAgICAgIHFjYy5ndWFyZEJpdHMgPSBzcWNkID4+IDU7XG4gICAgICAgICAgICAgIHNwcWNkcyA9IFtdO1xuICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3BxY2QgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9ICgoZGF0YVtqXSAmIDB4NykgPDwgOCkgfCBkYXRhW2ogKyAxXTtcbiAgICAgICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHFjYy5TUHFjZHMgPSBzcHFjZHM7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LlFDQ1tjcWNjXSA9IHFjYztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjcWNjXSA9IHFjYztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjUyOiAvLyBDb2Rpbmcgc3R5bGUgZGVmYXVsdCAoQ09EKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgdmFyIGNvZCA9IHt9O1xuICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyO1xuICAgICAgICAgICAgICB2YXIgc2NvZCA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgY29kLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMgPSAhIShzY29kICYgMSk7XG4gICAgICAgICAgICAgIGNvZC5zb3BNYXJrZXJVc2VkID0gISEoc2NvZCAmIDIpO1xuICAgICAgICAgICAgICBjb2QuZXBoTWFya2VyVXNlZCA9ICEhKHNjb2QgJiA0KTtcbiAgICAgICAgICAgICAgY29kLnByb2dyZXNzaW9uT3JkZXIgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIGNvZC5sYXllcnNDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgaik7XG4gICAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgICAgY29kLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtID0gZGF0YVtqKytdO1xuXG4gICAgICAgICAgICAgIGNvZC5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIGNvZC54Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7XG4gICAgICAgICAgICAgIGNvZC55Y2IgPSAoZGF0YVtqKytdICYgMHhmKSArIDI7XG4gICAgICAgICAgICAgIHZhciBibG9ja1N0eWxlID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICBjb2Quc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyA9ICEhKGJsb2NrU3R5bGUgJiAxKTtcbiAgICAgICAgICAgICAgY29kLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMgPSAhIShibG9ja1N0eWxlICYgMik7XG4gICAgICAgICAgICAgIGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MgPSAhIShibG9ja1N0eWxlICYgNCk7XG4gICAgICAgICAgICAgIGNvZC52ZXJ0aWNhbGx5U3RyaXBlID0gISEoYmxvY2tTdHlsZSAmIDgpO1xuICAgICAgICAgICAgICBjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbiA9ICEhKGJsb2NrU3R5bGUgJiAxNik7XG4gICAgICAgICAgICAgIGNvZC5zZWdtZW50YXRpb25TeW1ib2xVc2VkID0gISEoYmxvY2tTdHlsZSAmIDMyKTtcbiAgICAgICAgICAgICAgY29kLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbiA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgaWYgKGNvZC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemVzID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemUgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgICAgICBwcmVjaW5jdHNTaXplcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgUFB4OiBwcmVjaW5jdHNTaXplICYgMHhmLFxuICAgICAgICAgICAgICAgICAgICBQUHk6IHByZWNpbmN0c1NpemUgPj4gNCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2QucHJlY2luY3RzU2l6ZXMgPSBwcmVjaW5jdHNTaXplcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgdW5zdXBwb3J0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgaWYgKGNvZC5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzKSB7XG4gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaChcInNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3NcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzKSB7XG4gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaChcInJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXNcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvZC50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MpIHtcbiAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKFwidGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2QudmVydGljYWxseVN0cmlwZSkge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goXCJ2ZXJ0aWNhbGx5U3RyaXBlXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbikge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goXCJwcmVkaWN0YWJsZVRlcm1pbmF0aW9uXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZG9Ob3RSZWNvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIlVuc3VwcG9ydGVkIENPRCBvcHRpb25zIChcIiArIHVuc3VwcG9ydGVkLmpvaW4oXCIsIFwiKSArIFwiKVwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5DT0QgPSBjb2Q7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0QgPSBjb2Q7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0MgPSBbXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjkwOiAvLyBTdGFydCBvZiB0aWxlLXBhcnQgKFNPVClcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHRpbGUgPSB7fTtcbiAgICAgICAgICAgICAgdGlsZS5pbmRleCA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAyKTtcbiAgICAgICAgICAgICAgdGlsZS5sZW5ndGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCk7XG4gICAgICAgICAgICAgIHRpbGUuZGF0YUVuZCA9IHRpbGUubGVuZ3RoICsgcG9zaXRpb24gLSAyO1xuICAgICAgICAgICAgICB0aWxlLnBhcnRJbmRleCA9IGRhdGFbcG9zaXRpb24gKyA4XTtcbiAgICAgICAgICAgICAgdGlsZS5wYXJ0c0NvdW50ID0gZGF0YVtwb3NpdGlvbiArIDldO1xuXG4gICAgICAgICAgICAgIGNvbnRleHQubWFpbkhlYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZXNldCBjb21wb25lbnQgc3BlY2lmaWMgc2V0dGluZ3NcbiAgICAgICAgICAgICAgICB0aWxlLkNPRCA9IGNvbnRleHQuQ09EO1xuICAgICAgICAgICAgICAgIHRpbGUuQ09DID0gY29udGV4dC5DT0Muc2xpY2UoMCk7IC8vIGNsb25lIG9mIHRoZSBnbG9iYWwgQ09DXG4gICAgICAgICAgICAgICAgdGlsZS5RQ0QgPSBjb250ZXh0LlFDRDtcbiAgICAgICAgICAgICAgICB0aWxlLlFDQyA9IGNvbnRleHQuUUNDLnNsaWNlKDApOyAvLyBjbG9uZSBvZiB0aGUgZ2xvYmFsIENPQ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUgPSB0aWxlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjkzOiAvLyBTdGFydCBvZiBkYXRhIChTT0QpXG4gICAgICAgICAgICAgIHRpbGUgPSBjb250ZXh0LmN1cnJlbnRUaWxlO1xuICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsaXplVGlsZShjb250ZXh0LCB0aWxlLmluZGV4KTtcbiAgICAgICAgICAgICAgICBidWlsZFBhY2tldHMoY29udGV4dCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBtb3ZpbmcgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YVxuICAgICAgICAgICAgICBsZW5ndGggPSB0aWxlLmRhdGFFbmQgLSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgcGFyc2VUaWxlUGFja2V0cyhjb250ZXh0LCBkYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1NTogLy8gVGlsZS1wYXJ0IGxlbmd0aHMsIG1haW4gaGVhZGVyIChUTE0pXG4gICAgICAgICAgICBjYXNlIDB4ZmY1NzogLy8gUGFja2V0IGxlbmd0aCwgbWFpbiBoZWFkZXIgKFBMTSlcbiAgICAgICAgICAgIGNhc2UgMHhmZjU4OiAvLyBQYWNrZXQgbGVuZ3RoLCB0aWxlLXBhcnQgaGVhZGVyIChQTFQpXG4gICAgICAgICAgICBjYXNlIDB4ZmY2NDogLy8gQ29tbWVudCAoQ09NKVxuICAgICAgICAgICAgICBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgLy8gc2tpcHBpbmcgY29udGVudFxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjUzOiAvLyBDb2Rpbmcgc3R5bGUgY29tcG9uZW50IChDT0MpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNvZGVzdHJlYW0gY29kZSAweEZGNTMgKENPQykgaXMgbm90IGltcGxlbWVudGVkXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29kZXN0cmVhbSBjb2RlOiBcIiArIGNvZGUudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb05vdFJlY292ZXIgfHwgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJKUFg6IFRyeWluZyB0byByZWNvdmVyIGZyb206IFwiICsgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy50aWxlcyA9IHRyYW5zZm9ybUNvbXBvbmVudHMoY29udGV4dCk7XG4gICAgICB0aGlzLndpZHRoID0gY29udGV4dC5TSVouWHNpeiAtIGNvbnRleHQuU0laLlhPc2l6O1xuICAgICAgdGhpcy5oZWlnaHQgPSBjb250ZXh0LlNJWi5Zc2l6IC0gY29udGV4dC5TSVouWU9zaXo7XG4gICAgICB0aGlzLmNvbXBvbmVudHNDb3VudCA9IGNvbnRleHQuU0laLkNzaXo7XG4gICAgfSxcbiAgfTtcbiAgZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhjb21wb25lbnQsIHNpeikge1xuICAgIC8vIFNlY3Rpb24gQi4yIENvbXBvbmVudCBtYXBwaW5nXG4gICAgY29tcG9uZW50LngwID0gTWF0aC5jZWlsKHNpei5YT3NpeiAvIGNvbXBvbmVudC5YUnNpeik7XG4gICAgY29tcG9uZW50LngxID0gTWF0aC5jZWlsKHNpei5Yc2l6IC8gY29tcG9uZW50LlhSc2l6KTtcbiAgICBjb21wb25lbnQueTAgPSBNYXRoLmNlaWwoc2l6LllPc2l6IC8gY29tcG9uZW50LllSc2l6KTtcbiAgICBjb21wb25lbnQueTEgPSBNYXRoLmNlaWwoc2l6LllzaXogLyBjb21wb25lbnQuWVJzaXopO1xuICAgIGNvbXBvbmVudC53aWR0aCA9IGNvbXBvbmVudC54MSAtIGNvbXBvbmVudC54MDtcbiAgICBjb21wb25lbnQuaGVpZ2h0ID0gY29tcG9uZW50LnkxIC0gY29tcG9uZW50LnkwO1xuICB9XG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVHcmlkcyhjb250ZXh0LCBjb21wb25lbnRzKSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIC8vIFNlY3Rpb24gQi4zIERpdmlzaW9uIGludG8gdGlsZSBhbmQgdGlsZS1jb21wb25lbnRzXG4gICAgdmFyIHRpbGUsXG4gICAgICB0aWxlcyA9IFtdO1xuICAgIHZhciBudW1YdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Yc2l6IC0gc2l6LlhUT3NpeikgLyBzaXouWFRzaXopO1xuICAgIHZhciBudW1ZdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Zc2l6IC0gc2l6LllUT3NpeikgLyBzaXouWVRzaXopO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgbnVtWXRpbGVzOyBxKyspIHtcbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgbnVtWHRpbGVzOyBwKyspIHtcbiAgICAgICAgdGlsZSA9IHt9O1xuICAgICAgICB0aWxlLnR4MCA9IE1hdGgubWF4KHNpei5YVE9zaXogKyBwICogc2l6LlhUc2l6LCBzaXouWE9zaXopO1xuICAgICAgICB0aWxlLnR5MCA9IE1hdGgubWF4KHNpei5ZVE9zaXogKyBxICogc2l6LllUc2l6LCBzaXouWU9zaXopO1xuICAgICAgICB0aWxlLnR4MSA9IE1hdGgubWluKHNpei5YVE9zaXogKyAocCArIDEpICogc2l6LlhUc2l6LCBzaXouWHNpeik7XG4gICAgICAgIHRpbGUudHkxID0gTWF0aC5taW4oc2l6LllUT3NpeiArIChxICsgMSkgKiBzaXouWVRzaXosIHNpei5Zc2l6KTtcbiAgICAgICAgdGlsZS53aWR0aCA9IHRpbGUudHgxIC0gdGlsZS50eDA7XG4gICAgICAgIHRpbGUuaGVpZ2h0ID0gdGlsZS50eTEgLSB0aWxlLnR5MDtcbiAgICAgICAgdGlsZS5jb21wb25lbnRzID0gW107XG4gICAgICAgIHRpbGVzLnB1c2godGlsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQudGlsZXMgPSB0aWxlcztcblxuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjb21wb25lbnRzQ291bnQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHRpbGVzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgdmFyIHRpbGVDb21wb25lbnQgPSB7fTtcbiAgICAgICAgdGlsZSA9IHRpbGVzW2pdO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDAgPSBNYXRoLmNlaWwodGlsZS50eDAgLyBjb21wb25lbnQuWFJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTAgPSBNYXRoLmNlaWwodGlsZS50eTAgLyBjb21wb25lbnQuWVJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeDEgPSBNYXRoLmNlaWwodGlsZS50eDEgLyBjb21wb25lbnQuWFJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LnRjeTEgPSBNYXRoLmNlaWwodGlsZS50eTEgLyBjb21wb25lbnQuWVJzaXopO1xuICAgICAgICB0aWxlQ29tcG9uZW50LndpZHRoID0gdGlsZUNvbXBvbmVudC50Y3gxIC0gdGlsZUNvbXBvbmVudC50Y3gwO1xuICAgICAgICB0aWxlQ29tcG9uZW50LmhlaWdodCA9IHRpbGVDb21wb25lbnQudGN5MSAtIHRpbGVDb21wb25lbnQudGN5MDtcbiAgICAgICAgdGlsZS5jb21wb25lbnRzW2ldID0gdGlsZUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpIHtcbiAgICB2YXIgY29kT3JDb2MgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAoIWNvZE9yQ29jLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpIHtcbiAgICAgIHJlc3VsdC5QUHggPSAxNTtcbiAgICAgIHJlc3VsdC5QUHkgPSAxNTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LlBQeCA9IGNvZE9yQ29jLnByZWNpbmN0c1NpemVzW3JdLlBQeDtcbiAgICAgIHJlc3VsdC5QUHkgPSBjb2RPckNvYy5wcmVjaW5jdHNTaXplc1tyXS5QUHk7XG4gICAgfVxuICAgIC8vIGNhbGN1bGF0ZSBjb2RlYmxvY2sgc2l6ZSBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiBCLjdcbiAgICByZXN1bHQueGNiXyA9XG4gICAgICByID4gMFxuICAgICAgICA/IE1hdGgubWluKGNvZE9yQ29jLnhjYiwgcmVzdWx0LlBQeCAtIDEpXG4gICAgICAgIDogTWF0aC5taW4oY29kT3JDb2MueGNiLCByZXN1bHQuUFB4KTtcbiAgICByZXN1bHQueWNiXyA9XG4gICAgICByID4gMFxuICAgICAgICA/IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSAtIDEpXG4gICAgICAgIDogTWF0aC5taW4oY29kT3JDb2MueWNiLCByZXN1bHQuUFB5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkUHJlY2luY3RzKGNvbnRleHQsIHJlc29sdXRpb24sIGRpbWVuc2lvbnMpIHtcbiAgICAvLyBTZWN0aW9uIEIuNiBEaXZpc2lvbiByZXNvbHV0aW9uIHRvIHByZWNpbmN0c1xuICAgIHZhciBwcmVjaW5jdFdpZHRoID0gMSA8PCBkaW1lbnNpb25zLlBQeDtcbiAgICB2YXIgcHJlY2luY3RIZWlnaHQgPSAxIDw8IGRpbWVuc2lvbnMuUFB5O1xuICAgIC8vIEphc3BlciBpbnRyb2R1Y2VzIGNvZGVibG9jayBncm91cHMgZm9yIG1hcHBpbmcgZWFjaCBzdWJiYW5kIGNvZGVibG9ja3NcbiAgICAvLyB0byBwcmVjaW5jdHMuIFByZWNpbmN0IHBhcnRpdGlvbiBkaXZpZGVzIGEgcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gd2lkdGhcbiAgICAvLyBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMuIFRoZSBzdWJiYW5kIHRoYXQgYmVsb25ncyB0byB0aGUgcmVzb2x1dGlvbiBsZXZlbFxuICAgIC8vIGhhcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gdGhlIGxldmVsLCB1bmxlc3MgaXQgaXMgdGhlIHplcm8gcmVzb2x1dGlvbi5cblxuICAgIC8vIEZyb20gSmFzcGVyIGRvY3VtZW50YXRpb246IGpwZWcyMDAwLnBkZiwgc2VjdGlvbiBLOiBUaWVyLTIgY29kaW5nOlxuICAgIC8vIFRoZSBwcmVjaW5jdCBwYXJ0aXRpb25pbmcgZm9yIGEgcGFydGljdWxhciBzdWJiYW5kIGlzIGRlcml2ZWQgZnJvbSBhXG4gICAgLy8gcGFydGl0aW9uaW5nIG9mIGl0cyBwYXJlbnQgTEwgYmFuZCAoaS5lLiwgdGhlIExMIGJhbmQgYXQgdGhlIG5leHQgaGlnaGVyXG4gICAgLy8gcmVzb2x1dGlvbiBsZXZlbCkuLi4gVGhlIExMIGJhbmQgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCBpc1xuICAgIC8vIGRpdmlkZWQgaW50byBwcmVjaW5jdHMuLi4gRWFjaCBvZiB0aGUgcmVzdWx0aW5nIHByZWNpbmN0IHJlZ2lvbnMgaXMgdGhlblxuICAgIC8vIG1hcHBlZCBpbnRvIGl0cyBjaGlsZCBzdWJiYW5kcyAoaWYgYW55KSBhdCB0aGUgbmV4dCBsb3dlciByZXNvbHV0aW9uXG4gICAgLy8gbGV2ZWwuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uXG4gICAgLy8gKHUsIHYpID0gKGNlaWwoeC8yKSwgY2VpbCh5LzIpKSB3aGVyZSAoeCwgeSkgYW5kICh1LCB2KSBhcmUgdGhlXG4gICAgLy8gY29vcmRpbmF0ZXMgb2YgYSBwb2ludCBpbiB0aGUgTEwgYmFuZCBhbmQgY2hpbGQgc3ViYmFuZCwgcmVzcGVjdGl2ZWx5LlxuICAgIHZhciBpc1plcm9SZXMgPSByZXNvbHV0aW9uLnJlc0xldmVsID09PSAwO1xuICAgIHZhciBwcmVjaW5jdFdpZHRoSW5TdWJiYW5kID0gMSA8PCAoZGltZW5zaW9ucy5QUHggKyAoaXNaZXJvUmVzID8gMCA6IC0xKSk7XG4gICAgdmFyIHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kID0gMSA8PCAoZGltZW5zaW9ucy5QUHkgKyAoaXNaZXJvUmVzID8gMCA6IC0xKSk7XG4gICAgdmFyIG51bXByZWNpbmN0c3dpZGUgPVxuICAgICAgcmVzb2x1dGlvbi50cngxID4gcmVzb2x1dGlvbi50cngwXG4gICAgICAgID8gTWF0aC5jZWlsKHJlc29sdXRpb24udHJ4MSAvIHByZWNpbmN0V2lkdGgpIC1cbiAgICAgICAgICBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ4MCAvIHByZWNpbmN0V2lkdGgpXG4gICAgICAgIDogMDtcbiAgICB2YXIgbnVtcHJlY2luY3RzaGlnaCA9XG4gICAgICByZXNvbHV0aW9uLnRyeTEgPiByZXNvbHV0aW9uLnRyeTBcbiAgICAgICAgPyBNYXRoLmNlaWwocmVzb2x1dGlvbi50cnkxIC8gcHJlY2luY3RIZWlnaHQpIC1cbiAgICAgICAgICBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ5MCAvIHByZWNpbmN0SGVpZ2h0KVxuICAgICAgICA6IDA7XG4gICAgdmFyIG51bXByZWNpbmN0cyA9IG51bXByZWNpbmN0c3dpZGUgKiBudW1wcmVjaW5jdHNoaWdoO1xuXG4gICAgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMgPSB7XG4gICAgICBwcmVjaW5jdFdpZHRoLFxuICAgICAgcHJlY2luY3RIZWlnaHQsXG4gICAgICBudW1wcmVjaW5jdHN3aWRlLFxuICAgICAgbnVtcHJlY2luY3RzaGlnaCxcbiAgICAgIG51bXByZWNpbmN0cyxcbiAgICAgIHByZWNpbmN0V2lkdGhJblN1YmJhbmQsXG4gICAgICBwcmVjaW5jdEhlaWdodEluU3ViYmFuZCxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBkaW1lbnNpb25zKSB7XG4gICAgLy8gU2VjdGlvbiBCLjcgRGl2aXNpb24gc3ViLWJhbmQgaW50byBjb2RlLWJsb2Nrc1xuICAgIHZhciB4Y2JfID0gZGltZW5zaW9ucy54Y2JfO1xuICAgIHZhciB5Y2JfID0gZGltZW5zaW9ucy55Y2JfO1xuICAgIHZhciBjb2RlYmxvY2tXaWR0aCA9IDEgPDwgeGNiXztcbiAgICB2YXIgY29kZWJsb2NrSGVpZ2h0ID0gMSA8PCB5Y2JfO1xuICAgIHZhciBjYngwID0gc3ViYmFuZC50YngwID4+IHhjYl87XG4gICAgdmFyIGNieTAgPSBzdWJiYW5kLnRieTAgPj4geWNiXztcbiAgICB2YXIgY2J4MSA9IChzdWJiYW5kLnRieDEgKyBjb2RlYmxvY2tXaWR0aCAtIDEpID4+IHhjYl87XG4gICAgdmFyIGNieTEgPSAoc3ViYmFuZC50YnkxICsgY29kZWJsb2NrSGVpZ2h0IC0gMSkgPj4geWNiXztcbiAgICB2YXIgcHJlY2luY3RQYXJhbWV0ZXJzID0gc3ViYmFuZC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycztcbiAgICB2YXIgY29kZWJsb2NrcyA9IFtdO1xuICAgIHZhciBwcmVjaW5jdHMgPSBbXTtcbiAgICB2YXIgaSwgaiwgY29kZWJsb2NrLCBwcmVjaW5jdE51bWJlcjtcbiAgICBmb3IgKGogPSBjYnkwOyBqIDwgY2J5MTsgaisrKSB7XG4gICAgICBmb3IgKGkgPSBjYngwOyBpIDwgY2J4MTsgaSsrKSB7XG4gICAgICAgIGNvZGVibG9jayA9IHtcbiAgICAgICAgICBjYng6IGksXG4gICAgICAgICAgY2J5OiBqLFxuICAgICAgICAgIHRieDA6IGNvZGVibG9ja1dpZHRoICogaSxcbiAgICAgICAgICB0YnkwOiBjb2RlYmxvY2tIZWlnaHQgKiBqLFxuICAgICAgICAgIHRieDE6IGNvZGVibG9ja1dpZHRoICogKGkgKyAxKSxcbiAgICAgICAgICB0YnkxOiBjb2RlYmxvY2tIZWlnaHQgKiAoaiArIDEpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvZGVibG9jay50YngwXyA9IE1hdGgubWF4KHN1YmJhbmQudGJ4MCwgY29kZWJsb2NrLnRieDApO1xuICAgICAgICBjb2RlYmxvY2sudGJ5MF8gPSBNYXRoLm1heChzdWJiYW5kLnRieTAsIGNvZGVibG9jay50YnkwKTtcbiAgICAgICAgY29kZWJsb2NrLnRieDFfID0gTWF0aC5taW4oc3ViYmFuZC50YngxLCBjb2RlYmxvY2sudGJ4MSk7XG4gICAgICAgIGNvZGVibG9jay50YnkxXyA9IE1hdGgubWluKHN1YmJhbmQudGJ5MSwgY29kZWJsb2NrLnRieTEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBwcmVjaW5jdCBudW1iZXIgZm9yIHRoaXMgY29kZWJsb2NrLCBjb2RlYmxvY2sgcG9zaXRpb25cbiAgICAgICAgLy8gc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGl0cyBzdWJiYW5kLCB1c2UgYWN0dWFsIGRpbWVuc2lvbiBhbmQgcG9zaXRpb25cbiAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdXQgY29kZWJsb2NrIGdyb3VwIHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgdmFyIHBpID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAoY29kZWJsb2NrLnRieDBfIC0gc3ViYmFuZC50YngwKSAvXG4gICAgICAgICAgICBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aEluU3ViYmFuZFxuICAgICAgICApO1xuICAgICAgICB2YXIgcGogPSBNYXRoLmZsb29yKFxuICAgICAgICAgIChjb2RlYmxvY2sudGJ5MF8gLSBzdWJiYW5kLnRieTApIC9cbiAgICAgICAgICAgIHByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdEhlaWdodEluU3ViYmFuZFxuICAgICAgICApO1xuICAgICAgICBwcmVjaW5jdE51bWJlciA9IHBpICsgcGogKiBwcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTtcblxuICAgICAgICBjb2RlYmxvY2sucHJlY2luY3ROdW1iZXIgPSBwcmVjaW5jdE51bWJlcjtcbiAgICAgICAgY29kZWJsb2NrLnN1YmJhbmRUeXBlID0gc3ViYmFuZC50eXBlO1xuICAgICAgICBjb2RlYmxvY2suTGJsb2NrID0gMztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29kZWJsb2NrLnRieDFfIDw9IGNvZGVibG9jay50YngwXyB8fFxuICAgICAgICAgIGNvZGVibG9jay50YnkxXyA8PSBjb2RlYmxvY2sudGJ5MF9cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7XG4gICAgICAgIC8vIGJ1aWxkaW5nIHByZWNpbmN0IGZvciB0aGUgc3ViLWJhbmRcbiAgICAgICAgdmFyIHByZWNpbmN0ID0gcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXTtcbiAgICAgICAgaWYgKHByZWNpbmN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoaSA8IHByZWNpbmN0LmNieE1pbikge1xuICAgICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gaTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBwcmVjaW5jdC5jYnhNYXgpIHtcbiAgICAgICAgICAgIHByZWNpbmN0LmNieE1heCA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqIDwgcHJlY2luY3QuY2J5TWluKSB7XG4gICAgICAgICAgICBwcmVjaW5jdC5jYnhNaW4gPSBqO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaiA+IHByZWNpbmN0LmNieU1heCkge1xuICAgICAgICAgICAgcHJlY2luY3QuY2J5TWF4ID0gajtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXSA9IHByZWNpbmN0ID0ge1xuICAgICAgICAgICAgY2J4TWluOiBpLFxuICAgICAgICAgICAgY2J5TWluOiBqLFxuICAgICAgICAgICAgY2J4TWF4OiBpLFxuICAgICAgICAgICAgY2J5TWF4OiBqLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0ID0gcHJlY2luY3Q7XG4gICAgICB9XG4gICAgfVxuICAgIHN1YmJhbmQuY29kZWJsb2NrUGFyYW1ldGVycyA9IHtcbiAgICAgIGNvZGVibG9ja1dpZHRoOiB4Y2JfLFxuICAgICAgY29kZWJsb2NrSGVpZ2h0OiB5Y2JfLFxuICAgICAgbnVtY29kZWJsb2Nrd2lkZTogY2J4MSAtIGNieDAgKyAxLFxuICAgICAgbnVtY29kZWJsb2NraGlnaDogY2J5MSAtIGNieTAgKyAxLFxuICAgIH07XG4gICAgc3ViYmFuZC5jb2RlYmxvY2tzID0gY29kZWJsb2NrcztcbiAgICBzdWJiYW5kLnByZWNpbmN0cyA9IHByZWNpbmN0cztcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcHJlY2luY3ROdW1iZXIsIGxheWVyTnVtYmVyKSB7XG4gICAgdmFyIHByZWNpbmN0Q29kZWJsb2NrcyA9IFtdO1xuICAgIC8vIFNlY3Rpb24gQi4xMC44IE9yZGVyIG9mIGluZm8gaW4gcGFja2V0XG4gICAgdmFyIHN1YmJhbmRzID0gcmVzb2x1dGlvbi5zdWJiYW5kcztcbiAgICAvLyBzdWItYmFuZHMgYWxyZWFkeSBvcmRlcmVkIGluICdMTCcsICdITCcsICdMSCcsIGFuZCAnSEgnIHNlcXVlbmNlXG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHN1YmJhbmQgPSBzdWJiYW5kc1tpXTtcbiAgICAgIHZhciBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gY29kZWJsb2Nrcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHZhciBjb2RlYmxvY2sgPSBjb2RlYmxvY2tzW2pdO1xuICAgICAgICBpZiAoY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyICE9PSBwcmVjaW5jdE51bWJlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHByZWNpbmN0Q29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsYXllck51bWJlcixcbiAgICAgIGNvZGVibG9ja3M6IHByZWNpbmN0Q29kZWJsb2NrcyxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHtcbiAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsXG4gICAgICAgIHRpbGUuY29tcG9uZW50c1txXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBsID0gMCxcbiAgICAgIHIgPSAwLFxuICAgICAgaSA9IDAsXG4gICAgICBrID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS4xIExheWVyLXJlc29sdXRpb24tY29tcG9uZW50LXBvc2l0aW9uXG4gICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHtcbiAgICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7ICkge1xuICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpO1xuICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgciA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHtcbiAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsXG4gICAgICAgIHRpbGUuY29tcG9uZW50c1txXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciByID0gMCxcbiAgICAgIGwgPSAwLFxuICAgICAgaSA9IDAsXG4gICAgICBrID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS4yIFJlc29sdXRpb24tbGF5ZXItY29tcG9uZW50LXBvc2l0aW9uXG4gICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykge1xuICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHtcbiAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7ICkge1xuICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpO1xuICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbCA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFJlc29sdXRpb25Qb3NpdGlvbkNvbXBvbmVudExheWVySXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBsLCByLCBjLCBwO1xuICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwO1xuICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgoXG4gICAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCxcbiAgICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnRcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciBtYXhOdW1QcmVjaW5jdHNJbkxldmVsID0gbmV3IEludDMyQXJyYXkoXG4gICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgKyAxXG4gICAgKTtcbiAgICBmb3IgKHIgPSAwOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgKytyKSB7XG4gICAgICB2YXIgbWF4TnVtUHJlY2luY3RzID0gMDtcbiAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7ICsrYykge1xuICAgICAgICB2YXIgcmVzb2x1dGlvbnMgPSB0aWxlLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnM7XG4gICAgICAgIGlmIChyIDwgcmVzb2x1dGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgbWF4TnVtUHJlY2luY3RzID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBtYXhOdW1QcmVjaW5jdHMsXG4gICAgICAgICAgICByZXNvbHV0aW9uc1tyXS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF4TnVtUHJlY2luY3RzSW5MZXZlbFtyXSA9IG1heE51bVByZWNpbmN0cztcbiAgICB9XG4gICAgbCA9IDA7XG4gICAgciA9IDA7XG4gICAgYyA9IDA7XG4gICAgcCA9IDA7XG5cbiAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkge1xuICAgICAgLy8gU2VjdGlvbiBCLjEyLjEuMyBSZXNvbHV0aW9uLXBvc2l0aW9uLWNvbXBvbmVudC1sYXllclxuICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgZm9yICg7IHAgPCBtYXhOdW1QcmVjaW5jdHNJbkxldmVsW3JdOyBwKyspIHtcbiAgICAgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBpZiAociA+IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO1xuICAgICAgICAgICAgaWYgKHAgPj0gbnVtcHJlY2luY3RzKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcCwgbCk7XG4gICAgICAgICAgICAgIGwrKztcbiAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwID0gMDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBKcHhFcnJvcihcIk91dCBvZiBwYWNrZXRzXCIpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4O1xuICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdO1xuICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgdmFyIHByZWNpbmN0c1NpemVzID0gZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSh0aWxlKTtcbiAgICB2YXIgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMgPSBwcmVjaW5jdHNTaXplcztcbiAgICB2YXIgbCA9IDAsXG4gICAgICByID0gMCxcbiAgICAgIGMgPSAwLFxuICAgICAgcHggPSAwLFxuICAgICAgcHkgPSAwO1xuXG4gICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHtcbiAgICAgIC8vIFNlY3Rpb24gQi4xMi4xLjQgUG9zaXRpb24tY29tcG9uZW50LXJlc29sdXRpb24tbGF5ZXJcbiAgICAgIGZvciAoOyBweSA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bUhpZ2g7IHB5KyspIHtcbiAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykge1xuICAgICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID1cbiAgICAgICAgICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7XG4gICAgICAgICAgICBmb3IgKDsgciA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykge1xuICAgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTtcbiAgICAgICAgICAgICAgdmFyIHNpemVJbkltYWdlU2NhbGUgPVxuICAgICAgICAgICAgICAgIHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoXG4gICAgICAgICAgICAgICAgcHgsXG4gICAgICAgICAgICAgICAgcHksXG4gICAgICAgICAgICAgICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyxcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChrID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTtcbiAgICAgICAgICAgICAgICBsKys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjID0gMDtcbiAgICAgICAgfVxuICAgICAgICBweCA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7XG4gICAgdmFyIGwgPSAwLFxuICAgICAgciA9IDAsXG4gICAgICBjID0gMCxcbiAgICAgIHB4ID0gMCxcbiAgICAgIHB5ID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS41IENvbXBvbmVudC1wb3NpdGlvbi1yZXNvbHV0aW9uLWxheWVyXG4gICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICAgIHZhciBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY107XG4gICAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPVxuICAgICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7XG4gICAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykge1xuICAgICAgICAgICAgZm9yICg7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoXG4gICAgICAgICAgICAgICAgcHgsXG4gICAgICAgICAgICAgICAgcHksXG4gICAgICAgICAgICAgICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyxcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChrID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTtcbiAgICAgICAgICAgICAgICBsKys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBweCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHkgPSAwO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiT3V0IG9mIHBhY2tldHNcIik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcmVjaW5jdEluZGV4SWZFeGlzdChcbiAgICBweEluZGV4LFxuICAgIHB5SW5kZXgsXG4gICAgc2l6ZUluSW1hZ2VTY2FsZSxcbiAgICBwcmVjaW5jdEl0ZXJhdGlvblNpemVzLFxuICAgIHJlc29sdXRpb25cbiAgKSB7XG4gICAgdmFyIHBvc1ggPSBweEluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5XaWR0aDtcbiAgICB2YXIgcG9zWSA9IHB5SW5kZXggKiBwcmVjaW5jdEl0ZXJhdGlvblNpemVzLm1pbkhlaWdodDtcbiAgICBpZiAoXG4gICAgICBwb3NYICUgc2l6ZUluSW1hZ2VTY2FsZS53aWR0aCAhPT0gMCB8fFxuICAgICAgcG9zWSAlIHNpemVJbkltYWdlU2NhbGUuaGVpZ2h0ICE9PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHN0YXJ0UHJlY2luY3RSb3dJbmRleCA9XG4gICAgICAocG9zWSAvIHNpemVJbkltYWdlU2NhbGUud2lkdGgpICpcbiAgICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7XG4gICAgcmV0dXJuIHBvc1ggLyBzaXplSW5JbWFnZVNjYWxlLmhlaWdodCArIHN0YXJ0UHJlY2luY3RSb3dJbmRleDtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpIHtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gdGlsZS5jb21wb25lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIHZhciBtaW5IZWlnaHQgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIHZhciBtYXhOdW1XaWRlID0gMDtcbiAgICB2YXIgbWF4TnVtSGlnaCA9IDA7XG4gICAgdmFyIHNpemVQZXJDb21wb25lbnQgPSBuZXcgQXJyYXkoY29tcG9uZW50c0NvdW50KTtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9XG4gICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgdmFyIHNpemVQZXJSZXNvbHV0aW9uID0gbmV3IEFycmF5KGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCArIDEpO1xuICAgICAgdmFyIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB2YXIgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB2YXIgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQgPSAwO1xuICAgICAgdmFyIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50ID0gMDtcbiAgICAgIHZhciBzY2FsZSA9IDE7XG4gICAgICBmb3IgKHZhciByID0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByID49IDA7IC0tcikge1xuICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTtcbiAgICAgICAgdmFyIHdpZHRoQ3VycmVudFJlc29sdXRpb24gPVxuICAgICAgICAgIHNjYWxlICogcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aDtcbiAgICAgICAgdmFyIGhlaWdodEN1cnJlbnRSZXNvbHV0aW9uID1cbiAgICAgICAgICBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0O1xuICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1pbihcbiAgICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsXG4gICAgICAgICAgd2lkdGhDdXJyZW50UmVzb2x1dGlvblxuICAgICAgICApO1xuICAgICAgICBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4oXG4gICAgICAgICAgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCxcbiAgICAgICAgICBoZWlnaHRDdXJyZW50UmVzb2x1dGlvblxuICAgICAgICApO1xuICAgICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IE1hdGgubWF4KFxuICAgICAgICAgIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGVcbiAgICAgICAgKTtcbiAgICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChcbiAgICAgICAgICBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgICByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHNoaWdoXG4gICAgICAgICk7XG4gICAgICAgIHNpemVQZXJSZXNvbHV0aW9uW3JdID0ge1xuICAgICAgICAgIHdpZHRoOiB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0Q3VycmVudFJlc29sdXRpb24sXG4gICAgICAgIH07XG4gICAgICAgIHNjYWxlIDw8PSAxO1xuICAgICAgfVxuICAgICAgbWluV2lkdGggPSBNYXRoLm1pbihtaW5XaWR0aCwgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50KTtcbiAgICAgIG1pbkhlaWdodCA9IE1hdGgubWluKG1pbkhlaWdodCwgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCk7XG4gICAgICBtYXhOdW1XaWRlID0gTWF0aC5tYXgobWF4TnVtV2lkZSwgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQpO1xuICAgICAgbWF4TnVtSGlnaCA9IE1hdGgubWF4KG1heE51bUhpZ2gsIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50KTtcbiAgICAgIHNpemVQZXJDb21wb25lbnRbY10gPSB7XG4gICAgICAgIHJlc29sdXRpb25zOiBzaXplUGVyUmVzb2x1dGlvbixcbiAgICAgICAgbWluV2lkdGg6IG1pbldpZHRoQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgbWluSGVpZ2h0OiBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50LFxuICAgICAgICBtYXhOdW1XaWRlOiBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgbWF4TnVtSGlnaDogbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29tcG9uZW50czogc2l6ZVBlckNvbXBvbmVudCxcbiAgICAgIG1pbldpZHRoLFxuICAgICAgbWluSGVpZ2h0LFxuICAgICAgbWF4TnVtV2lkZSxcbiAgICAgIG1heE51bUhpZ2gsXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBidWlsZFBhY2tldHMoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgLy8gQ3JlYXRpbmcgcmVzb2x1dGlvbnMgYW5kIHN1Yi1iYW5kcyBmb3IgZWFjaCBjb21wb25lbnRcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9XG4gICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgLy8gU2VjdGlvbiBCLjUgUmVzb2x1dGlvbiBsZXZlbHMgYW5kIHN1Yi1iYW5kc1xuICAgICAgdmFyIHJlc29sdXRpb25zID0gW107XG4gICAgICB2YXIgc3ViYmFuZHMgPSBbXTtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7XG4gICAgICAgIHZhciBibG9ja3NEaW1lbnNpb25zID0gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpO1xuICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IHt9O1xuICAgICAgICB2YXIgc2NhbGUgPSAxIDw8IChkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByKTtcbiAgICAgICAgcmVzb2x1dGlvbi50cngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpO1xuICAgICAgICByZXNvbHV0aW9uLnRyeTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7XG4gICAgICAgIHJlc29sdXRpb24udHJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTtcbiAgICAgICAgcmVzb2x1dGlvbi50cnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpO1xuICAgICAgICByZXNvbHV0aW9uLnJlc0xldmVsID0gcjtcbiAgICAgICAgYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgYmxvY2tzRGltZW5zaW9ucyk7XG4gICAgICAgIHJlc29sdXRpb25zLnB1c2gocmVzb2x1dGlvbik7XG5cbiAgICAgICAgdmFyIHN1YmJhbmQ7XG4gICAgICAgIGlmIChyID09PSAwKSB7XG4gICAgICAgICAgLy8gb25lIHN1Yi1iYW5kIChMTCkgd2l0aCBsYXN0IGRlY29tcG9zaXRpb25cbiAgICAgICAgICBzdWJiYW5kID0ge307XG4gICAgICAgICAgc3ViYmFuZC50eXBlID0gXCJMTFwiO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIHNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gc2NhbGUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIHNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTtcbiAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuICAgICAgICAgIHJlc29sdXRpb24uc3ViYmFuZHMgPSBbc3ViYmFuZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJzY2FsZSA9IDEgPDwgKGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCAtIHIgKyAxKTtcbiAgICAgICAgICB2YXIgcmVzb2x1dGlvblN1YmJhbmRzID0gW107XG4gICAgICAgICAgLy8gdGhyZWUgc3ViLWJhbmRzIChITCwgTEggYW5kIEhIKSB3aXRoIHJlc3Qgb2YgZGVjb21wb3NpdGlvbnNcbiAgICAgICAgICBzdWJiYW5kID0ge307XG4gICAgICAgICAgc3ViYmFuZC50eXBlID0gXCJITFwiO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSAtIDAuNSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7XG4gICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTtcbiAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTtcblxuICAgICAgICAgIHN1YmJhbmQgPSB7fTtcbiAgICAgICAgICBzdWJiYW5kLnR5cGUgPSBcIkxIXCI7XG4gICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTtcbiAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuXG4gICAgICAgICAgc3ViYmFuZCA9IHt9O1xuICAgICAgICAgIHN1YmJhbmQudHlwZSA9IFwiSEhcIjtcbiAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSAtIDAuNSk7XG4gICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpO1xuICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7XG4gICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7XG5cbiAgICAgICAgICByZXNvbHV0aW9uLnN1YmJhbmRzID0gcmVzb2x1dGlvblN1YmJhbmRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wb25lbnQucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9ucztcbiAgICAgIGNvbXBvbmVudC5zdWJiYW5kcyA9IHN1YmJhbmRzO1xuICAgIH1cbiAgICAvLyBHZW5lcmF0ZSB0aGUgcGFja2V0cyBzZXF1ZW5jZVxuICAgIHZhciBwcm9ncmVzc2lvbk9yZGVyID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7XG4gICAgc3dpdGNoIChwcm9ncmVzc2lvbk9yZGVyKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvbkxheWVyQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0aWxlLnBhY2tldHNJdGVyYXRvciA9IG5ldyBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKGBVbnN1cHBvcnRlZCBwcm9ncmVzc2lvbiBvcmRlciAke3Byb2dyZXNzaW9uT3JkZXJ9YCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgb2Zmc2V0LCBkYXRhTGVuZ3RoKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICB2YXIgYnVmZmVyLFxuICAgICAgYnVmZmVyU2l6ZSA9IDAsXG4gICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGNvdW50KSB7XG4gICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IGNvdW50KSB7XG4gICAgICAgIHZhciBiID0gZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl07XG4gICAgICAgIHBvc2l0aW9uKys7XG4gICAgICAgIGlmIChza2lwTmV4dEJpdCkge1xuICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgNykgfCBiO1xuICAgICAgICAgIGJ1ZmZlclNpemUgKz0gNztcbiAgICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgOCkgfCBiO1xuICAgICAgICAgIGJ1ZmZlclNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiA9PT0gMHhmZikge1xuICAgICAgICAgIHNraXBOZXh0Qml0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVmZmVyU2l6ZSAtPSBjb3VudDtcbiAgICAgIHJldHVybiAoYnVmZmVyID4+PiBidWZmZXJTaXplKSAmICgoMSA8PCBjb3VudCkgLSAxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2tpcE1hcmtlcklmRXF1YWwodmFsdWUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbiAtIDFdID09PSAweGZmICYmXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSB2YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIHNraXBCeXRlcygxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBkYXRhW29mZnNldCArIHBvc2l0aW9uXSA9PT0gMHhmZiAmJlxuICAgICAgICBkYXRhW29mZnNldCArIHBvc2l0aW9uICsgMV0gPT09IHZhbHVlXG4gICAgICApIHtcbiAgICAgICAgc2tpcEJ5dGVzKDIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2tpcEJ5dGVzKGNvdW50KSB7XG4gICAgICBwb3NpdGlvbiArPSBjb3VudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKSB7XG4gICAgICBidWZmZXJTaXplID0gMDtcbiAgICAgIGlmIChza2lwTmV4dEJpdCkge1xuICAgICAgICBwb3NpdGlvbisrO1xuICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWFkQ29kaW5ncGFzc2VzKCkge1xuICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gcmVhZEJpdHMoMik7XG4gICAgICBpZiAodmFsdWUgPCAzKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSArIDM7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHJlYWRCaXRzKDUpO1xuICAgICAgaWYgKHZhbHVlIDwgMzEpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICsgNjtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gcmVhZEJpdHMoNyk7XG4gICAgICByZXR1cm4gdmFsdWUgKyAzNztcbiAgICB9XG4gICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgdmFyIHNvcE1hcmtlclVzZWQgPSBjb250ZXh0LkNPRC5zb3BNYXJrZXJVc2VkO1xuICAgIHZhciBlcGhNYXJrZXJVc2VkID0gY29udGV4dC5DT0QuZXBoTWFya2VyVXNlZDtcbiAgICB2YXIgcGFja2V0c0l0ZXJhdG9yID0gdGlsZS5wYWNrZXRzSXRlcmF0b3I7XG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgZGF0YUxlbmd0aCkge1xuICAgICAgYWxpZ25Ub0J5dGUoKTtcbiAgICAgIGlmIChzb3BNYXJrZXJVc2VkICYmIHNraXBNYXJrZXJJZkVxdWFsKDB4OTEpKSB7XG4gICAgICAgIC8vIFNraXAgYWxzbyBtYXJrZXIgc2VnbWVudCBsZW5ndGggYW5kIHBhY2tldCBzZXF1ZW5jZSBJRFxuICAgICAgICBza2lwQnl0ZXMoNCk7XG4gICAgICB9XG4gICAgICB2YXIgcGFja2V0ID0gcGFja2V0c0l0ZXJhdG9yLm5leHRQYWNrZXQoKTtcbiAgICAgIGlmICghcmVhZEJpdHMoMSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbGF5ZXJOdW1iZXIgPSBwYWNrZXQubGF5ZXJOdW1iZXI7XG4gICAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgY29kZWJsb2NrO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcGFja2V0LmNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXQuY29kZWJsb2Nrc1tpXTtcbiAgICAgICAgdmFyIHByZWNpbmN0ID0gY29kZWJsb2NrLnByZWNpbmN0O1xuICAgICAgICB2YXIgY29kZWJsb2NrQ29sdW1uID0gY29kZWJsb2NrLmNieCAtIHByZWNpbmN0LmNieE1pbjtcbiAgICAgICAgdmFyIGNvZGVibG9ja1JvdyA9IGNvZGVibG9jay5jYnkgLSBwcmVjaW5jdC5jYnlNaW47XG4gICAgICAgIHZhciBjb2RlYmxvY2tJbmNsdWRlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZmlyc3RUaW1lSW5jbHVzaW9uID0gZmFsc2U7XG4gICAgICAgIHZhciB2YWx1ZVJlYWR5O1xuICAgICAgICBpZiAoY29kZWJsb2NrLmluY2x1ZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb2RlYmxvY2tJbmNsdWRlZCA9ICEhcmVhZEJpdHMoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVhZGluZyBpbmNsdXNpb24gdHJlZVxuICAgICAgICAgIHByZWNpbmN0ID0gY29kZWJsb2NrLnByZWNpbmN0O1xuICAgICAgICAgIHZhciBpbmNsdXNpb25UcmVlLCB6ZXJvQml0UGxhbmVzVHJlZTtcbiAgICAgICAgICBpZiAocHJlY2luY3QuaW5jbHVzaW9uVHJlZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbmNsdXNpb25UcmVlID0gcHJlY2luY3QuaW5jbHVzaW9uVHJlZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYnVpbGRpbmcgaW5jbHVzaW9uIGFuZCB6ZXJvIGJpdC1wbGFuZXMgdHJlZXNcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHByZWNpbmN0LmNieE1heCAtIHByZWNpbmN0LmNieE1pbiArIDE7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcHJlY2luY3QuY2J5TWF4IC0gcHJlY2luY3QuY2J5TWluICsgMTtcbiAgICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBuZXcgSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBsYXllck51bWJlcik7XG4gICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IG5ldyBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgcHJlY2luY3QuaW5jbHVzaW9uVHJlZSA9IGluY2x1c2lvblRyZWU7XG4gICAgICAgICAgICBwcmVjaW5jdC56ZXJvQml0UGxhbmVzVHJlZSA9IHplcm9CaXRQbGFuZXNUcmVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbmNsdXNpb25UcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93LCBsYXllck51bWJlcikpIHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlUmVhZHkgPSAhaW5jbHVzaW9uVHJlZS5uZXh0TGV2ZWwoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgY29kZWJsb2NrLmluY2x1ZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGNvZGVibG9ja0luY2x1ZGVkID0gZmlyc3RUaW1lSW5jbHVzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmNsdXNpb25UcmVlLmluY3JlbWVudFZhbHVlKGxheWVyTnVtYmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvZGVibG9ja0luY2x1ZGVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0VGltZUluY2x1c2lvbikge1xuICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlID0gcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWU7XG4gICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUucmVzZXQoY29kZWJsb2NrQ29sdW1uLCBjb2RlYmxvY2tSb3cpO1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAocmVhZEJpdHMoMSkpIHtcbiAgICAgICAgICAgICAgdmFsdWVSZWFkeSA9ICF6ZXJvQml0UGxhbmVzVHJlZS5uZXh0TGV2ZWwoKTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlUmVhZHkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUuaW5jcmVtZW50VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMgPSB6ZXJvQml0UGxhbmVzVHJlZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kaW5ncGFzc2VzID0gcmVhZENvZGluZ3Bhc3NlcygpO1xuICAgICAgICB3aGlsZSAocmVhZEJpdHMoMSkpIHtcbiAgICAgICAgICBjb2RlYmxvY2suTGJsb2NrKys7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGluZ3Bhc3Nlc0xvZzIgPSBsb2cyKGNvZGluZ3Bhc3Nlcyk7XG4gICAgICAgIC8vIHJvdW5kaW5nIGRvd24gbG9nMlxuICAgICAgICB2YXIgYml0cyA9XG4gICAgICAgICAgKGNvZGluZ3Bhc3NlcyA8IDEgPDwgY29kaW5ncGFzc2VzTG9nMlxuICAgICAgICAgICAgPyBjb2RpbmdwYXNzZXNMb2cyIC0gMVxuICAgICAgICAgICAgOiBjb2RpbmdwYXNzZXNMb2cyKSArIGNvZGVibG9jay5MYmxvY2s7XG4gICAgICAgIHZhciBjb2RlZERhdGFMZW5ndGggPSByZWFkQml0cyhiaXRzKTtcbiAgICAgICAgcXVldWUucHVzaCh7XG4gICAgICAgICAgY29kZWJsb2NrLFxuICAgICAgICAgIGNvZGluZ3Bhc3NlcyxcbiAgICAgICAgICBkYXRhTGVuZ3RoOiBjb2RlZERhdGFMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYWxpZ25Ub0J5dGUoKTtcbiAgICAgIGlmIChlcGhNYXJrZXJVc2VkKSB7XG4gICAgICAgIHNraXBNYXJrZXJJZkVxdWFsKDB4OTIpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHBhY2tldEl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXRJdGVtLmNvZGVibG9jaztcbiAgICAgICAgaWYgKGNvZGVibG9jay5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb2RlYmxvY2suZGF0YSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVibG9jay5kYXRhLnB1c2goe1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgc3RhcnQ6IG9mZnNldCArIHBvc2l0aW9uLFxuICAgICAgICAgIGVuZDogb2Zmc2V0ICsgcG9zaXRpb24gKyBwYWNrZXRJdGVtLmRhdGFMZW5ndGgsXG4gICAgICAgICAgY29kaW5ncGFzc2VzOiBwYWNrZXRJdGVtLmNvZGluZ3Bhc3NlcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHBvc2l0aW9uICs9IHBhY2tldEl0ZW0uZGF0YUxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGNvcHlDb2VmZmljaWVudHMoXG4gICAgY29lZmZpY2llbnRzLFxuICAgIGxldmVsV2lkdGgsXG4gICAgbGV2ZWxIZWlnaHQsXG4gICAgc3ViYmFuZCxcbiAgICBkZWx0YSxcbiAgICBtYixcbiAgICByZXZlcnNpYmxlLFxuICAgIHNlZ21lbnRhdGlvblN5bWJvbFVzZWRcbiAgKSB7XG4gICAgdmFyIHgwID0gc3ViYmFuZC50YngwO1xuICAgIHZhciB5MCA9IHN1YmJhbmQudGJ5MDtcbiAgICB2YXIgd2lkdGggPSBzdWJiYW5kLnRieDEgLSBzdWJiYW5kLnRieDA7XG4gICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7XG4gICAgdmFyIHJpZ2h0ID0gc3ViYmFuZC50eXBlLmNoYXJBdCgwKSA9PT0gXCJIXCIgPyAxIDogMDtcbiAgICB2YXIgYm90dG9tID0gc3ViYmFuZC50eXBlLmNoYXJBdCgxKSA9PT0gXCJIXCIgPyBsZXZlbFdpZHRoIDogMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgdmFyIGNvZGVibG9jayA9IGNvZGVibG9ja3NbaV07XG4gICAgICB2YXIgYmxvY2tXaWR0aCA9IGNvZGVibG9jay50YngxXyAtIGNvZGVibG9jay50YngwXztcbiAgICAgIHZhciBibG9ja0hlaWdodCA9IGNvZGVibG9jay50YnkxXyAtIGNvZGVibG9jay50YnkwXztcbiAgICAgIGlmIChibG9ja1dpZHRoID09PSAwIHx8IGJsb2NrSGVpZ2h0ID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGVibG9jay5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBiaXRNb2RlbCwgY3VycmVudENvZGluZ3Bhc3NUeXBlO1xuICAgICAgYml0TW9kZWwgPSBuZXcgQml0TW9kZWwoXG4gICAgICAgIGJsb2NrV2lkdGgsXG4gICAgICAgIGJsb2NrSGVpZ2h0LFxuICAgICAgICBjb2RlYmxvY2suc3ViYmFuZFR5cGUsXG4gICAgICAgIGNvZGVibG9jay56ZXJvQml0UGxhbmVzLFxuICAgICAgICBtYlxuICAgICAgKTtcbiAgICAgIGN1cnJlbnRDb2RpbmdwYXNzVHlwZSA9IDI7IC8vIGZpcnN0IGJpdCBwbGFuZSBzdGFydHMgZnJvbSBjbGVhbnVwXG5cbiAgICAgIC8vIGNvbGxlY3QgZGF0YVxuICAgICAgdmFyIGRhdGEgPSBjb2RlYmxvY2suZGF0YSxcbiAgICAgICAgdG90YWxMZW5ndGggPSAwLFxuICAgICAgICBjb2RpbmdwYXNzZXMgPSAwO1xuICAgICAgdmFyIGosIGpqLCBkYXRhSXRlbTtcbiAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTtcbiAgICAgICAgdG90YWxMZW5ndGggKz0gZGF0YUl0ZW0uZW5kIC0gZGF0YUl0ZW0uc3RhcnQ7XG4gICAgICAgIGNvZGluZ3Bhc3NlcyArPSBkYXRhSXRlbS5jb2RpbmdwYXNzZXM7XG4gICAgICB9XG4gICAgICB2YXIgZW5jb2RlZERhdGEgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgICAgZm9yIChqID0gMCwgamogPSBkYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgZGF0YUl0ZW0gPSBkYXRhW2pdO1xuICAgICAgICB2YXIgY2h1bmsgPSBkYXRhSXRlbS5kYXRhLnN1YmFycmF5KGRhdGFJdGVtLnN0YXJ0LCBkYXRhSXRlbS5lbmQpO1xuICAgICAgICBlbmNvZGVkRGF0YS5zZXQoY2h1bmssIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gZGVjb2RpbmcgdGhlIGl0ZW1cbiAgICAgIHZhciBkZWNvZGVyID0gbmV3IEFyaXRobWV0aWNEZWNvZGVyKGVuY29kZWREYXRhLCAwLCB0b3RhbExlbmd0aCk7XG4gICAgICBiaXRNb2RlbC5zZXREZWNvZGVyKGRlY29kZXIpO1xuXG4gICAgICBmb3IgKGogPSAwOyBqIDwgY29kaW5ncGFzc2VzOyBqKyspIHtcbiAgICAgICAgc3dpdGNoIChjdXJyZW50Q29kaW5ncGFzc1R5cGUpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBiaXRNb2RlbC5ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGJpdE1vZGVsLnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBiaXRNb2RlbC5ydW5DbGVhbnVwUGFzcygpO1xuICAgICAgICAgICAgaWYgKHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpIHtcbiAgICAgICAgICAgICAgYml0TW9kZWwuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDb2RpbmdwYXNzVHlwZSA9IChjdXJyZW50Q29kaW5ncGFzc1R5cGUgKyAxKSAlIDM7XG4gICAgICB9XG5cbiAgICAgIHZhciBvZmZzZXQgPSBjb2RlYmxvY2sudGJ4MF8gLSB4MCArIChjb2RlYmxvY2sudGJ5MF8gLSB5MCkgKiB3aWR0aDtcbiAgICAgIHZhciBzaWduID0gYml0TW9kZWwuY29lZmZpY2VudHNTaWduO1xuICAgICAgdmFyIG1hZ25pdHVkZSA9IGJpdE1vZGVsLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgdmFyIGJpdHNEZWNvZGVkID0gYml0TW9kZWwuYml0c0RlY29kZWQ7XG4gICAgICB2YXIgbWFnbml0dWRlQ29ycmVjdGlvbiA9IHJldmVyc2libGUgPyAwIDogMC41O1xuICAgICAgdmFyIGssIG4sIG5iO1xuICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgLy8gRG8gdGhlIGludGVybGVhdmluZyBvZiBTZWN0aW9uIEYuMy4zIGhlcmUsIHNvIHdlIGRvIG5vdCBuZWVkXG4gICAgICAvLyB0byBjb3B5IGxhdGVyLiBMTCBsZXZlbCBpcyBub3QgaW50ZXJsZWF2ZWQsIGp1c3QgY29waWVkLlxuICAgICAgdmFyIGludGVybGVhdmUgPSBzdWJiYW5kLnR5cGUgIT09IFwiTExcIjtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBibG9ja0hlaWdodDsgaisrKSB7XG4gICAgICAgIHZhciByb3cgPSAob2Zmc2V0IC8gd2lkdGgpIHwgMDsgLy8gcm93IGluIHRoZSBub24taW50ZXJsZWF2ZWQgc3ViYmFuZFxuICAgICAgICB2YXIgbGV2ZWxPZmZzZXQgPSAyICogcm93ICogKGxldmVsV2lkdGggLSB3aWR0aCkgKyByaWdodCArIGJvdHRvbTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGJsb2NrV2lkdGg7IGsrKykge1xuICAgICAgICAgIG4gPSBtYWduaXR1ZGVbcG9zaXRpb25dO1xuICAgICAgICAgIGlmIChuICE9PSAwKSB7XG4gICAgICAgICAgICBuID0gKG4gKyBtYWduaXR1ZGVDb3JyZWN0aW9uKSAqIGRlbHRhO1xuICAgICAgICAgICAgaWYgKHNpZ25bcG9zaXRpb25dICE9PSAwKSB7XG4gICAgICAgICAgICAgIG4gPSAtbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5iID0gYml0c0RlY29kZWRbcG9zaXRpb25dO1xuICAgICAgICAgICAgdmFyIHBvcyA9IGludGVybGVhdmUgPyBsZXZlbE9mZnNldCArIChvZmZzZXQgPDwgMSkgOiBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAocmV2ZXJzaWJsZSAmJiBuYiA+PSBtYikge1xuICAgICAgICAgICAgICBjb2VmZmljaWVudHNbcG9zXSA9IG47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb2VmZmljaWVudHNbcG9zXSA9IG4gKiAoMSA8PCAobWIgLSBuYikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICBwb3NpdGlvbisrO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSB3aWR0aCAtIGJsb2NrV2lkdGg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYykge1xuICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgdmFyIGNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7XG4gICAgdmFyIHF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVycztcbiAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID1cbiAgICAgIGNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7XG4gICAgdmFyIHNwcWNkcyA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuU1BxY2RzO1xuICAgIHZhciBzY2FsYXJFeHBvdW5kZWQgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLnNjYWxhckV4cG91bmRlZDtcbiAgICB2YXIgZ3VhcmRCaXRzID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5ndWFyZEJpdHM7XG4gICAgdmFyIHNlZ21lbnRhdGlvblN5bWJvbFVzZWQgPSBjb2RpbmdTdHlsZVBhcmFtZXRlcnMuc2VnbWVudGF0aW9uU3ltYm9sVXNlZDtcbiAgICB2YXIgcHJlY2lzaW9uID0gY29udGV4dC5jb21wb25lbnRzW2NdLnByZWNpc2lvbjtcblxuICAgIHZhciByZXZlcnNpYmxlID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbjtcbiAgICB2YXIgdHJhbnNmb3JtID0gcmV2ZXJzaWJsZVxuICAgICAgPyBuZXcgUmV2ZXJzaWJsZVRyYW5zZm9ybSgpXG4gICAgICA6IG5ldyBJcnJldmVyc2libGVUcmFuc2Zvcm0oKTtcblxuICAgIHZhciBzdWJiYW5kQ29lZmZpY2llbnRzID0gW107XG4gICAgdmFyIGIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgaSsrKSB7XG4gICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tpXTtcblxuICAgICAgdmFyIHdpZHRoID0gcmVzb2x1dGlvbi50cngxIC0gcmVzb2x1dGlvbi50cngwO1xuICAgICAgdmFyIGhlaWdodCA9IHJlc29sdXRpb24udHJ5MSAtIHJlc29sdXRpb24udHJ5MDtcbiAgICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2hvbGUgc3VibGV2ZWwuXG4gICAgICB2YXIgY29lZmZpY2llbnRzID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCk7XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHJlc29sdXRpb24uc3ViYmFuZHMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICB2YXIgbXUsIGVwc2lsb247XG4gICAgICAgIGlmICghc2NhbGFyRXhwb3VuZGVkKSB7XG4gICAgICAgICAgLy8gZm9ybXVsYSBFLTVcbiAgICAgICAgICBtdSA9IHNwcWNkc1swXS5tdTtcbiAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzWzBdLmVwc2lsb24gKyAoaSA+IDAgPyAxIC0gaSA6IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11ID0gc3BxY2RzW2JdLm11O1xuICAgICAgICAgIGVwc2lsb24gPSBzcHFjZHNbYl0uZXBzaWxvbjtcbiAgICAgICAgICBiKys7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3ViYmFuZCA9IHJlc29sdXRpb24uc3ViYmFuZHNbal07XG4gICAgICAgIHZhciBnYWluTG9nMiA9IFN1YmJhbmRzR2FpbkxvZzJbc3ViYmFuZC50eXBlXTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgcXVhbnRpemF0aW9uIGNvZWZmaWNpZW50IChTZWN0aW9uIEUuMS4xLjEpXG4gICAgICAgIHZhciBkZWx0YSA9IHJldmVyc2libGVcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IDIgKiogKHByZWNpc2lvbiArIGdhaW5Mb2cyIC0gZXBzaWxvbikgKiAoMSArIG11IC8gMjA0OCk7XG4gICAgICAgIHZhciBtYiA9IGd1YXJkQml0cyArIGVwc2lsb24gLSAxO1xuXG4gICAgICAgIC8vIEluIHRoZSBmaXJzdCByZXNvbHV0aW9uIGxldmVsLCBjb3B5Q29lZmZpY2llbnRzIHdpbGwgZmlsbCB0aGVcbiAgICAgICAgLy8gd2hvbGUgYXJyYXkgd2l0aCBjb2VmZmljaWVudHMuIEluIHRoZSBzdWNjZWVkaW5nIHBhc3NlcyxcbiAgICAgICAgLy8gY29weUNvZWZmaWNpZW50cyB3aWxsIGNvbnNlY3V0aXZlbHkgZmlsbCBpbiB0aGUgdmFsdWVzIHRoYXQgYmVsb25nXG4gICAgICAgIC8vIHRvIHRoZSBpbnRlcmxlYXZlZCBwb3NpdGlvbnMgb2YgdGhlIEhMLCBMSCwgYW5kIEhIIGNvZWZmaWNpZW50cy5cbiAgICAgICAgLy8gVGhlIExMIGNvZWZmaWNpZW50cyB3aWxsIHRoZW4gYmUgaW50ZXJsZWF2ZWQgaW4gVHJhbnNmb3JtLml0ZXJhdGUoKS5cbiAgICAgICAgY29weUNvZWZmaWNpZW50cyhcbiAgICAgICAgICBjb2VmZmljaWVudHMsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHN1YmJhbmQsXG4gICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgbWIsXG4gICAgICAgICAgcmV2ZXJzaWJsZSxcbiAgICAgICAgICBzZWdtZW50YXRpb25TeW1ib2xVc2VkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLnB1c2goe1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBpdGVtczogY29lZmZpY2llbnRzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybS5jYWxjdWxhdGUoXG4gICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLFxuICAgICAgY29tcG9uZW50LnRjeDAsXG4gICAgICBjb21wb25lbnQudGN5MFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGNvbXBvbmVudC50Y3gwLFxuICAgICAgdG9wOiBjb21wb25lbnQudGN5MCxcbiAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlc3VsdC5oZWlnaHQsXG4gICAgICBpdGVtczogcmVzdWx0Lml0ZW1zLFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gdHJhbnNmb3JtQ29tcG9uZW50cyhjb250ZXh0KSB7XG4gICAgdmFyIHNpeiA9IGNvbnRleHQuU0laO1xuICAgIHZhciBjb21wb25lbnRzID0gY29udGV4dC5jb21wb25lbnRzO1xuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICB2YXIgcmVzdWx0SW1hZ2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29udGV4dC50aWxlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbaV07XG4gICAgICB2YXIgdHJhbnNmb3JtZWRUaWxlcyA9IFtdO1xuICAgICAgdmFyIGM7XG4gICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHtcbiAgICAgICAgdHJhbnNmb3JtZWRUaWxlc1tjXSA9IHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYyk7XG4gICAgICB9XG4gICAgICB2YXIgdGlsZTAgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdO1xuICAgICAgdmFyIG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aWxlMC5pdGVtcy5sZW5ndGggKiBjb21wb25lbnRzQ291bnQpO1xuICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgbGVmdDogdGlsZTAubGVmdCxcbiAgICAgICAgdG9wOiB0aWxlMC50b3AsXG4gICAgICAgIHdpZHRoOiB0aWxlMC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0aWxlMC5oZWlnaHQsXG4gICAgICAgIGl0ZW1zOiBvdXQsXG4gICAgICB9O1xuXG4gICAgICAvLyBTZWN0aW9uIEcuMi4yIEludmVyc2UgbXVsdGkgY29tcG9uZW50IHRyYW5zZm9ybVxuICAgICAgdmFyIHNoaWZ0LCBvZmZzZXQ7XG4gICAgICB2YXIgcG9zID0gMCxcbiAgICAgICAgaixcbiAgICAgICAgamosXG4gICAgICAgIHkwLFxuICAgICAgICB5MSxcbiAgICAgICAgeTI7XG4gICAgICBpZiAodGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKSB7XG4gICAgICAgIHZhciBmb3VyQ29tcG9uZW50cyA9IGNvbXBvbmVudHNDb3VudCA9PT0gNDtcbiAgICAgICAgdmFyIHkwaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdLml0ZW1zO1xuICAgICAgICB2YXIgeTFpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMV0uaXRlbXM7XG4gICAgICAgIHZhciB5Mml0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1syXS5pdGVtcztcbiAgICAgICAgdmFyIHkzaXRlbXMgPSBmb3VyQ29tcG9uZW50cyA/IHRyYW5zZm9ybWVkVGlsZXNbM10uaXRlbXMgOiBudWxsO1xuXG4gICAgICAgIC8vIEhBQ0s6IFRoZSBtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtIGZvcm11bGFzIGJlbG93IGFzc3VtZSB0aGF0XG4gICAgICAgIC8vIGFsbCBjb21wb25lbnRzIGhhdmUgdGhlIHNhbWUgcHJlY2lzaW9uLiBXaXRoIHRoaXMgaW4gbWluZCwgd2VcbiAgICAgICAgLy8gY29tcHV0ZSBzaGlmdCBhbmQgb2Zmc2V0IG9ubHkgb25jZS5cbiAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzWzBdLnByZWNpc2lvbiAtIDg7XG4gICAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41O1xuXG4gICAgICAgIHZhciBjb21wb25lbnQwID0gdGlsZS5jb21wb25lbnRzWzBdO1xuICAgICAgICB2YXIgYWxwaGEwMSA9IGNvbXBvbmVudHNDb3VudCAtIDM7XG4gICAgICAgIGpqID0geTBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGlmICghY29tcG9uZW50MC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAgICAgLy8gaW52ZXJzZSBpcnJldmVyc2libGUgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybVxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqajsgaisrLCBwb3MgKz0gYWxwaGEwMSkge1xuICAgICAgICAgICAgeTAgPSB5MGl0ZW1zW2pdICsgb2Zmc2V0O1xuICAgICAgICAgICAgeTEgPSB5MWl0ZW1zW2pdO1xuICAgICAgICAgICAgeTIgPSB5Mml0ZW1zW2pdO1xuICAgICAgICAgICAgb3V0W3BvcysrXSA9ICh5MCArIDEuNDAyICogeTIpID4+IHNoaWZ0O1xuICAgICAgICAgICAgb3V0W3BvcysrXSA9ICh5MCAtIDAuMzQ0MTMgKiB5MSAtIDAuNzE0MTQgKiB5MikgPj4gc2hpZnQ7XG4gICAgICAgICAgICBvdXRbcG9zKytdID0gKHkwICsgMS43NzIgKiB5MSkgPj4gc2hpZnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGludmVyc2UgcmV2ZXJzaWJsZSBtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtXG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7XG4gICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7XG4gICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07XG4gICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07XG4gICAgICAgICAgICBjb25zdCBnID0geTAgLSAoKHkyICsgeTEpID4+IDIpO1xuXG4gICAgICAgICAgICBvdXRbcG9zKytdID0gKGcgKyB5MikgPj4gc2hpZnQ7XG4gICAgICAgICAgICBvdXRbcG9zKytdID0gZyA+PiBzaGlmdDtcbiAgICAgICAgICAgIG91dFtwb3MrK10gPSAoZyArIHkxKSA+PiBzaGlmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdXJDb21wb25lbnRzKSB7XG4gICAgICAgICAgZm9yIChqID0gMCwgcG9zID0gMzsgaiA8IGpqOyBqKyssIHBvcyArPSA0KSB7XG4gICAgICAgICAgICBvdXRbcG9zXSA9ICh5M2l0ZW1zW2pdICsgb2Zmc2V0KSA+PiBzaGlmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vIG11bHRpLWNvbXBvbmVudCB0cmFuc2Zvcm1cbiAgICAgICAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICAgICAgdmFyIGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1tjXS5pdGVtcztcbiAgICAgICAgICBzaGlmdCA9IGNvbXBvbmVudHNbY10ucHJlY2lzaW9uIC0gODtcbiAgICAgICAgICBvZmZzZXQgPSAoMTI4IDw8IHNoaWZ0KSArIDAuNTtcbiAgICAgICAgICBmb3IgKHBvcyA9IGMsIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgIG91dFtwb3NdID0gKGl0ZW1zW2pdICsgb2Zmc2V0KSA+PiBzaGlmdDtcbiAgICAgICAgICAgIHBvcyArPSBjb21wb25lbnRzQ291bnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHRJbWFnZXMucHVzaChyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0SW1hZ2VzO1xuICB9XG4gIGZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGNvbnRleHQsIHRpbGVJbmRleCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTtcbiAgICAgIHZhciBxY2RPclFjYyA9XG4gICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdXG4gICAgICAgICAgOiBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRDtcbiAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25QYXJhbWV0ZXJzID0gcWNkT3JRY2M7XG4gICAgICB2YXIgY29kT3JDb2MgPVxuICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXVxuICAgICAgICAgIDogY29udGV4dC5jdXJyZW50VGlsZS5DT0Q7XG4gICAgICBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzID0gY29kT3JDb2M7XG4gICAgfVxuICAgIHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycyA9IGNvbnRleHQuY3VycmVudFRpbGUuQ09EO1xuICB9XG5cbiAgLy8gU2VjdGlvbiBCLjEwLjIgVGFnIHRyZWVzXG4gIHZhciBUYWdUcmVlID0gKGZ1bmN0aW9uIFRhZ1RyZWVDbG9zdXJlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBmdW5jdGlvbiBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBsZXZlbHNMZW5ndGggPSBsb2cyKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7XG4gICAgICB0aGlzLmxldmVscyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGV2ZWwgPSB7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7XG4gICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7XG4gICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgVGFnVHJlZS5wcm90b3R5cGUgPSB7XG4gICAgICByZXNldDogZnVuY3Rpb24gVGFnVHJlZV9yZXNldChpLCBqKSB7XG4gICAgICAgIHZhciBjdXJyZW50TGV2ZWwgPSAwLFxuICAgICAgICAgIHZhbHVlID0gMCxcbiAgICAgICAgICBsZXZlbDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRMZXZlbCA8IHRoaXMubGV2ZWxzLmxlbmd0aCkge1xuICAgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoO1xuICAgICAgICAgIGlmIChsZXZlbC5pdGVtc1tpbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICBpID4+PSAxO1xuICAgICAgICAgIGogPj49IDE7XG4gICAgICAgICAgY3VycmVudExldmVsKys7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudExldmVsLS07XG4gICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTtcbiAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTtcbiAgICAgIH0sXG4gICAgICBpbmNyZW1lbnRWYWx1ZTogZnVuY3Rpb24gVGFnVHJlZV9pbmNyZW1lbnRWYWx1ZSgpIHtcbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxdO1xuICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0rKztcbiAgICAgIH0sXG4gICAgICBuZXh0TGV2ZWw6IGZ1bmN0aW9uIFRhZ1RyZWVfbmV4dExldmVsKCkge1xuICAgICAgICB2YXIgY3VycmVudExldmVsID0gdGhpcy5jdXJyZW50TGV2ZWw7XG4gICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTtcbiAgICAgICAgY3VycmVudExldmVsLS07XG4gICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPCAwKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gVGFnVHJlZTtcbiAgfSkoKTtcblxuICB2YXIgSW5jbHVzaW9uVHJlZSA9IChmdW5jdGlvbiBJbmNsdXNpb25UcmVlQ2xvc3VyZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciBsZXZlbHNMZW5ndGggPSBsb2cyKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7XG4gICAgICB0aGlzLmxldmVscyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbXMgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICBpdGVtc1tqXSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsZXZlbCA9IHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubGV2ZWxzLnB1c2gobGV2ZWwpO1xuXG4gICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7XG4gICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgSW5jbHVzaW9uVHJlZS5wcm90b3R5cGUgPSB7XG4gICAgICByZXNldDogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9yZXNldChpLCBqLCBzdG9wVmFsdWUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IDA7XG4gICAgICAgIHdoaWxlIChjdXJyZW50TGV2ZWwgPCB0aGlzLmxldmVscy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICAgIHZhciBpbmRleCA9IGkgKyBqICogbGV2ZWwud2lkdGg7XG4gICAgICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IDB4ZmYpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA+IHN0b3BWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7XG4gICAgICAgICAgICAvLyBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyBvbmUsIHByb3BhZ2F0aW5nIHRoZSB2YWx1ZSB0byB0b3AgbGV2ZWxzXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlcygpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgPj49IDE7XG4gICAgICAgICAgaiA+Pj0gMTtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbCAtIDE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKHN0b3BWYWx1ZSkge1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHN0b3BWYWx1ZSArIDE7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7XG4gICAgICB9LFxuICAgICAgcHJvcGFnYXRlVmFsdWVzOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Byb3BhZ2F0ZVZhbHVlcygpIHtcbiAgICAgICAgdmFyIGxldmVsSW5kZXggPSB0aGlzLmN1cnJlbnRMZXZlbDtcbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07XG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07XG4gICAgICAgIHdoaWxlICgtLWxldmVsSW5kZXggPj0gMCkge1xuICAgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07XG4gICAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbmV4dExldmVsOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX25leHRMZXZlbCgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IHRoaXMuY3VycmVudExldmVsO1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IDB4ZmY7XG4gICAgICAgIGN1cnJlbnRMZXZlbC0tO1xuICAgICAgICBpZiAoY3VycmVudExldmVsIDwgMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gSW5jbHVzaW9uVHJlZTtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIEQuIENvZWZmaWNpZW50IGJpdCBtb2RlbGluZ1xuICB2YXIgQml0TW9kZWwgPSAoZnVuY3Rpb24gQml0TW9kZWxDbG9zdXJlKCkge1xuICAgIHZhciBVTklGT1JNX0NPTlRFWFQgPSAxNztcbiAgICB2YXIgUlVOTEVOR1RIX0NPTlRFWFQgPSAxODtcbiAgICAvLyBUYWJsZSBELTFcbiAgICAvLyBUaGUgaW5kZXggaXMgYmluYXJ5IHByZXNlbnRhdGlvbjogMGRkZHZ2aGgsIGRkZCAtIHN1bSBvZiBEaSAoMC4uNCksXG4gICAgLy8gdnYgLSBzdW0gb2YgVmkgKDAuLjIpLCBhbmQgaGggLSBzdW0gb2YgSGkgKDAuLjIpXG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIExMQW5kTEhDb250ZXh0c0xhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgNSwgOCwgMCwgMywgNywgOCwgMCwgNCwgNywgOCwgMCwgMCwgMCwgMCwgMCwgMSwgNiwgOCwgMCwgMywgNywgOCwgMCwgNCxcbiAgICAgIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsXG4gICAgICA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4XG4gICAgXSk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIEhMQ29udGV4dExhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgMywgNCwgMCwgNSwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMSwgMywgNCwgMCwgNiwgNywgNywgMCwgOCxcbiAgICAgIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsXG4gICAgICA0LCAwLCA2LCA3LCA3LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAzLCA0LCAwLCA2LCA3LCA3LCAwLCA4LCA4LCA4XG4gICAgXSk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIEhIQ29udGV4dExhYmVsID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCwgMSwgMiwgMCwgMSwgMiwgMiwgMCwgMiwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMywgNCwgNSwgMCwgNCwgNSwgNSwgMCwgNSxcbiAgICAgIDUsIDUsIDAsIDAsIDAsIDAsIDAsIDYsIDcsIDcsIDAsIDcsIDcsIDcsIDAsIDcsIDcsIDcsIDAsIDAsIDAsIDAsIDAsIDgsIDgsXG4gICAgICA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4XG4gICAgXSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gQml0TW9kZWwod2lkdGgsIGhlaWdodCwgc3ViYmFuZCwgemVyb0JpdFBsYW5lcywgbWIpIHtcbiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICBsZXQgY29udGV4dExhYmVsVGFibGU7XG4gICAgICBpZiAoc3ViYmFuZCA9PT0gXCJISFwiKSB7XG4gICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gSEhDb250ZXh0TGFiZWw7XG4gICAgICB9IGVsc2UgaWYgKHN1YmJhbmQgPT09IFwiSExcIikge1xuICAgICAgICBjb250ZXh0TGFiZWxUYWJsZSA9IEhMQ29udGV4dExhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dExhYmVsVGFibGUgPSBMTEFuZExIQ29udGV4dHNMYWJlbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGV4dExhYmVsVGFibGUgPSBjb250ZXh0TGFiZWxUYWJsZTtcblxuICAgICAgdmFyIGNvZWZmaWNpZW50Q291bnQgPSB3aWR0aCAqIGhlaWdodDtcblxuICAgICAgLy8gY29lZmZpY2llbnRzIG91dHNpZGUgdGhlIGVuY29kaW5nIHJlZ2lvbiB0cmVhdGVkIGFzIGluc2lnbmlmaWNhbnRcbiAgICAgIC8vIGFkZCBib3JkZXIgc3RhdGUgY2VsbHMgZm9yIHNpZ25pZmljYW5jZVN0YXRlXG4gICAgICB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgdGhpcy5jb2VmZmljZW50c1NpZ24gPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTtcbiAgICAgIGxldCBjb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgIGlmIChtYiA+IDE0KSB7XG4gICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQzMkFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgfSBlbHNlIGlmIChtYiA+IDYpIHtcbiAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDE2QXJyYXkoY29lZmZpY2llbnRDb3VudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgdGhpcy5wcm9jZXNzaW5nRmxhZ3MgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTtcblxuICAgICAgdmFyIGJpdHNEZWNvZGVkID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7XG4gICAgICBpZiAoemVyb0JpdFBsYW5lcyAhPT0gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZWZmaWNpZW50Q291bnQ7IGkrKykge1xuICAgICAgICAgIGJpdHNEZWNvZGVkW2ldID0gemVyb0JpdFBsYW5lcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5iaXRzRGVjb2RlZCA9IGJpdHNEZWNvZGVkO1xuXG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgQml0TW9kZWwucHJvdG90eXBlID0ge1xuICAgICAgc2V0RGVjb2RlcjogZnVuY3Rpb24gQml0TW9kZWxfc2V0RGVjb2RlcihkZWNvZGVyKSB7XG4gICAgICAgIHRoaXMuZGVjb2RlciA9IGRlY29kZXI7XG4gICAgICB9LFxuICAgICAgcmVzZXQ6IGZ1bmN0aW9uIEJpdE1vZGVsX3Jlc2V0KCkge1xuICAgICAgICAvLyBXZSBoYXZlIDE3IGNvbnRleHRzIHRoYXQgYXJlIGFjY2Vzc2VkIHZpYSBjb250ZXh0IGxhYmVscyxcbiAgICAgICAgLy8gcGx1cyB0aGUgdW5pZm9ybSBhbmQgcnVubGVuZ3RoIGNvbnRleHQuXG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXcgSW50OEFycmF5KDE5KTtcblxuICAgICAgICAvLyBDb250ZXh0cyBhcmUgcGFja2VkIGludG8gMSBieXRlOlxuICAgICAgICAvLyBoaWdoZXN0IDcgYml0cyBjYXJyeSB0aGUgaW5kZXgsIGxvd2VzdCBiaXQgY2FycmllcyBtcHNcbiAgICAgICAgdGhpcy5jb250ZXh0c1swXSA9ICg0IDw8IDEpIHwgMDtcbiAgICAgICAgdGhpcy5jb250ZXh0c1tVTklGT1JNX0NPTlRFWFRdID0gKDQ2IDw8IDEpIHwgMDtcbiAgICAgICAgdGhpcy5jb250ZXh0c1tSVU5MRU5HVEhfQ09OVEVYVF0gPSAoMyA8PCAxKSB8IDA7XG4gICAgICB9LFxuICAgICAgc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlOiBmdW5jdGlvbiBCaXRNb2RlbF9zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoXG4gICAgICAgIHJvdyxcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBpbmRleFxuICAgICAgKSB7XG4gICAgICAgIHZhciBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGxlZnQgPSBjb2x1bW4gPiAwO1xuICAgICAgICB2YXIgcmlnaHQgPSBjb2x1bW4gKyAxIDwgd2lkdGg7XG4gICAgICAgIHZhciBpO1xuXG4gICAgICAgIGlmIChyb3cgPiAwKSB7XG4gICAgICAgICAgaSA9IGluZGV4IC0gd2lkdGg7XG4gICAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaSArIDFdICs9IDB4MTA7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpXSArPSAweDA0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQpIHtcbiAgICAgICAgICBpID0gaW5kZXggKyB3aWR0aDtcbiAgICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgLSAxXSArPSAweDEwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2ldICs9IDB4MDQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleCAtIDFdICs9IDB4MDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4ICsgMV0gKz0gMHgwMTtcbiAgICAgICAgfVxuICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdIHw9IDB4ODA7XG4gICAgICB9LFxuICAgICAgcnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247XG4gICAgICAgIHZhciBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTtcbiAgICAgICAgdmFyIHByb2Nlc3NpbmdGbGFncyA9IHRoaXMucHJvY2Vzc2luZ0ZsYWdzO1xuICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzO1xuICAgICAgICB2YXIgbGFiZWxzID0gdGhpcy5jb250ZXh0TGFiZWxUYWJsZTtcbiAgICAgICAgdmFyIGJpdHNEZWNvZGVkID0gdGhpcy5iaXRzRGVjb2RlZDtcbiAgICAgICAgdmFyIHByb2Nlc3NlZEludmVyc2VNYXNrID0gfjE7XG4gICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTtcbiAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7XG5cbiAgICAgICAgZm9yICh2YXIgaTAgPSAwOyBpMCA8IGhlaWdodDsgaTAgKz0gNCkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gaTAgKiB3aWR0aCArIGo7XG4gICAgICAgICAgICBmb3IgKHZhciBpMSA9IDA7IGkxIDwgNDsgaTErKywgaW5kZXggKz0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSBpMCArIGkxO1xuICAgICAgICAgICAgICBpZiAoaSA+PSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBjbGVhciBwcm9jZXNzZWQgZmxhZyBmaXJzdFxuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICY9IHByb2Nlc3NlZEludmVyc2VNYXNrO1xuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gfHxcbiAgICAgICAgICAgICAgICAhbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSBsYWJlbHNbbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XV07XG4gICAgICAgICAgICAgIHZhciBkZWNpc2lvbiA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduO1xuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrO1xuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IHByb2Nlc3NlZE1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVjb2RlU2lnbkJpdDogZnVuY3Rpb24gQml0TW9kZWxfZGVjb2RlU2lnbkJpdChyb3csIGNvbHVtbiwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduO1xuICAgICAgICB2YXIgY29udHJpYnV0aW9uLCBzaWduMCwgc2lnbjEsIHNpZ25pZmljYW5jZTE7XG4gICAgICAgIHZhciBjb250ZXh0TGFiZWwsIGRlY29kZWQ7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGhvcml6b250YWwgY29udHJpYnV0aW9uXG4gICAgICAgIHNpZ25pZmljYW5jZTEgPSBjb2x1bW4gPiAwICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4IC0gMV0gIT09IDA7XG4gICAgICAgIGlmIChjb2x1bW4gKyAxIDwgd2lkdGggJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyAxXSAhPT0gMCkge1xuICAgICAgICAgIHNpZ24xID0gY29lZmZpY2VudHNTaWduW2luZGV4ICsgMV07XG4gICAgICAgICAgaWYgKHNpZ25pZmljYW5jZTEpIHtcbiAgICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gMV07XG4gICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNpZ25pZmljYW5jZTEpIHtcbiAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIDFdO1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMCAtIHNpZ24wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvcml6b250YWxDb250cmlidXRpb24gPSAzICogY29udHJpYnV0aW9uO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB2ZXJ0aWNhbCBjb250cmlidXRpb24gYW5kIGNvbWJpbmUgd2l0aCB0aGUgaG9yaXpvbnRhbFxuICAgICAgICBzaWduaWZpY2FuY2UxID0gcm93ID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIHdpZHRoXSAhPT0gMDtcbiAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyB3aWR0aF0gIT09IDApIHtcbiAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIHdpZHRoXTtcbiAgICAgICAgICBpZiAoc2lnbmlmaWNhbmNlMSkge1xuICAgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSB3aWR0aF07XG4gICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMCArIGhvcml6b250YWxDb250cmlidXRpb247XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24xICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkge1xuICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gd2lkdGhdO1xuICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMCAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cmlidXRpb24gPSBob3Jpem9udGFsQ29udHJpYnV0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbiA+PSAwKSB7XG4gICAgICAgICAgY29udGV4dExhYmVsID0gOSArIGNvbnRyaWJ1dGlvbjtcbiAgICAgICAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0TGFiZWwgPSA5IC0gY29udHJpYnV0aW9uO1xuICAgICAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpIF4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgIH0sXG4gICAgICBydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzczogZnVuY3Rpb24gQml0TW9kZWxfcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7XG4gICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7XG4gICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7XG4gICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFncztcbiAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxO1xuICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgICB2YXIgd2lkdGg0ID0gd2lkdGggKiA0O1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4MCA9IDAsIGluZGV4TmV4dDsgaW5kZXgwIDwgbGVuZ3RoOyBpbmRleDAgPSBpbmRleE5leHQpIHtcbiAgICAgICAgICBpbmRleE5leHQgPSBNYXRoLm1pbihsZW5ndGgsIGluZGV4MCArIHdpZHRoNCk7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IGluZGV4MCArIGo7IGluZGV4IDwgaW5kZXhOZXh0OyBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICAvLyBzaWduaWZpY2FudCBidXQgbm90IHRob3NlIHRoYXQgaGF2ZSBqdXN0IGJlY29tZVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fFxuICAgICAgICAgICAgICAgIChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDBcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gMTY7XG4gICAgICAgICAgICAgIGlmICgocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIGZpcnN0TWFnbml0dWRlQml0TWFzaykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIF49IGZpcnN0TWFnbml0dWRlQml0TWFzaztcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZWZpbmVtZW50XG4gICAgICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gJiAxMjc7XG4gICAgICAgICAgICAgICAgY29udGV4dExhYmVsID0gc2lnbmlmaWNhbmNlID09PSAwID8gMTUgOiAxNDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA8PCAxKSB8IGJpdDtcbiAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7XG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gcHJvY2Vzc2VkTWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBydW5DbGVhbnVwUGFzczogZnVuY3Rpb24gQml0TW9kZWxfcnVuQ2xlYW51cFBhc3MoKSB7XG4gICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7XG4gICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7XG4gICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdmFyIGxhYmVscyA9IHRoaXMuY29udGV4dExhYmVsVGFibGU7XG4gICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7XG4gICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFncztcbiAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxO1xuICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjtcbiAgICAgICAgdmFyIG9uZVJvd0Rvd24gPSB3aWR0aDtcbiAgICAgICAgdmFyIHR3b1Jvd3NEb3duID0gd2lkdGggKiAyO1xuICAgICAgICB2YXIgdGhyZWVSb3dzRG93biA9IHdpZHRoICogMztcbiAgICAgICAgdmFyIGlOZXh0O1xuICAgICAgICBmb3IgKHZhciBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCA9IGlOZXh0KSB7XG4gICAgICAgICAgaU5leHQgPSBNYXRoLm1pbihpMCArIDQsIGhlaWdodCk7XG4gICAgICAgICAgdmFyIGluZGV4QmFzZSA9IGkwICogd2lkdGg7XG4gICAgICAgICAgdmFyIGNoZWNrQWxsRW1wdHkgPSBpMCArIDMgPCBoZWlnaHQ7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXgwID0gaW5kZXhCYXNlICsgajtcbiAgICAgICAgICAgIC8vIHVzaW5nIHRoZSBwcm9wZXJ0eTogbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dID09PSAwXG4gICAgICAgICAgICAvLyB3aGVuIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gPT09IDBcbiAgICAgICAgICAgIHZhciBhbGxFbXB0eSA9XG4gICAgICAgICAgICAgIGNoZWNrQWxsRW1wdHkgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MF0gPT09IDAgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiZcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDBdID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyBvbmVSb3dEb3duXSA9PT0gMCAmJlxuICAgICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXgwICsgdHdvUm93c0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0aHJlZVJvd3NEb3duXSA9PT0gMDtcbiAgICAgICAgICAgIHZhciBpMSA9IDAsXG4gICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwO1xuICAgICAgICAgICAgdmFyIGkgPSBpMCxcbiAgICAgICAgICAgICAgc2lnbjtcbiAgICAgICAgICAgIGlmIChhbGxFbXB0eSkge1xuICAgICAgICAgICAgICB2YXIgaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50ID0gZGVjb2Rlci5yZWFkQml0KFxuICAgICAgICAgICAgICAgIGNvbnRleHRzLFxuICAgICAgICAgICAgICAgIFJVTkxFTkdUSF9DT05URVhUXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICghaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50KSB7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwXSsrO1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIG9uZVJvd0Rvd25dKys7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgdHdvUm93c0Rvd25dKys7XG4gICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgdGhyZWVSb3dzRG93bl0rKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbmV4dCBjb2x1bW5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpMSA9XG4gICAgICAgICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxKSB8XG4gICAgICAgICAgICAgICAgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpO1xuICAgICAgICAgICAgICBpZiAoaTEgIT09IDApIHtcbiAgICAgICAgICAgICAgICBpID0gaTAgKyBpMTtcbiAgICAgICAgICAgICAgICBpbmRleCArPSBpMSAqIHdpZHRoO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduO1xuICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPSAxO1xuICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrO1xuXG4gICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwO1xuICAgICAgICAgICAgICBmb3IgKHZhciBpMiA9IGkwOyBpMiA8PSBpOyBpMisrLCBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaTErKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IGkwICsgaTE7IGkgPCBpTmV4dDsgaSsrLCBpbmRleCArPSB3aWR0aCkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8XG4gICAgICAgICAgICAgICAgKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBwcm9jZXNzZWRNYXNrKSAhPT0gMFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSBsYWJlbHNbbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XV07XG4gICAgICAgICAgICAgIHZhciBkZWNpc2lvbiA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTtcbiAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uID09PSAxKSB7XG4gICAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247XG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2hlY2tTZWdtZW50YXRpb25TeW1ib2w6IGZ1bmN0aW9uIEJpdE1vZGVsX2NoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCkge1xuICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdmFyIHN5bWJvbCA9XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAzKSB8XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAyKSB8XG4gICAgICAgICAgKGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxKSB8XG4gICAgICAgICAgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpO1xuICAgICAgICBpZiAoc3ltYm9sICE9PSAweGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJJbnZhbGlkIHNlZ21lbnRhdGlvbiBzeW1ib2xcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBCaXRNb2RlbDtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIEYsIERpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtYXRpb25cbiAgdmFyIFRyYW5zZm9ybSA9IChmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm0oKSB7fVxuXG4gICAgVHJhbnNmb3JtLnByb3RvdHlwZS5jYWxjdWxhdGUgPSBmdW5jdGlvbiB0cmFuc2Zvcm1DYWxjdWxhdGUoXG4gICAgICBzdWJiYW5kcyxcbiAgICAgIHUwLFxuICAgICAgdjBcbiAgICApIHtcbiAgICAgIHZhciBsbCA9IHN1YmJhbmRzWzBdO1xuICAgICAgZm9yICh2YXIgaSA9IDEsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBsbCA9IHRoaXMuaXRlcmF0ZShsbCwgc3ViYmFuZHNbaV0sIHUwLCB2MCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGw7XG4gICAgfTtcbiAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uIGV4dGVuZChidWZmZXIsIG9mZnNldCwgc2l6ZSkge1xuICAgICAgLy8gU2VjdGlvbiBGLjMuNyBleHRlbmRpbmcuLi4gdXNpbmcgbWF4IGV4dGVuc2lvbiBvZiA0XG4gICAgICB2YXIgaTEgPSBvZmZzZXQgLSAxLFxuICAgICAgICBqMSA9IG9mZnNldCArIDE7XG4gICAgICB2YXIgaTIgPSBvZmZzZXQgKyBzaXplIC0gMixcbiAgICAgICAgajIgPSBvZmZzZXQgKyBzaXplO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdO1xuICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dO1xuICAgICAgYnVmZmVyW2kxXSA9IGJ1ZmZlcltqMV07XG4gICAgICBidWZmZXJbajJdID0gYnVmZmVyW2kyXTtcbiAgICB9O1xuICAgIFRyYW5zZm9ybS5wcm90b3R5cGUuaXRlcmF0ZSA9IGZ1bmN0aW9uIFRyYW5zZm9ybV9pdGVyYXRlKFxuICAgICAgbGwsXG4gICAgICBobF9saF9oaCxcbiAgICAgIHUwLFxuICAgICAgdjBcbiAgICApIHtcbiAgICAgIHZhciBsbFdpZHRoID0gbGwud2lkdGgsXG4gICAgICAgIGxsSGVpZ2h0ID0gbGwuaGVpZ2h0LFxuICAgICAgICBsbEl0ZW1zID0gbGwuaXRlbXM7XG4gICAgICB2YXIgd2lkdGggPSBobF9saF9oaC53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBobF9saF9oaC5oZWlnaHQ7XG4gICAgICB2YXIgaXRlbXMgPSBobF9saF9oaC5pdGVtcztcbiAgICAgIHZhciBpLCBqLCBrLCBsLCB1LCB2O1xuXG4gICAgICAvLyBJbnRlcmxlYXZlIExMIGFjY29yZGluZyB0byBTZWN0aW9uIEYuMy4zXG4gICAgICBmb3IgKGsgPSAwLCBpID0gMDsgaSA8IGxsSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgbCA9IGkgKiAyICogd2lkdGg7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsbFdpZHRoOyBqKyssIGsrKywgbCArPSAyKSB7XG4gICAgICAgICAgaXRlbXNbbF0gPSBsbEl0ZW1zW2tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgTEwgYmFuZCBpcyBub3QgbmVlZGVkIGFueW1vcmUuXG4gICAgICBsbEl0ZW1zID0gbGwuaXRlbXMgPSBudWxsO1xuXG4gICAgICB2YXIgYnVmZmVyUGFkZGluZyA9IDQ7XG4gICAgICB2YXIgcm93QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCArIDIgKiBidWZmZXJQYWRkaW5nKTtcblxuICAgICAgLy8gU2VjdGlvbiBGLjMuNCBIT1JfU1JcbiAgICAgIGlmICh3aWR0aCA9PT0gMSkge1xuICAgICAgICAvLyBpZiB3aWR0aCA9IDEsIHdoZW4gdTAgZXZlbiBrZWVwIGl0ZW1zIGFzIGlzLCB3aGVuIG9kZCBkaXZpZGUgYnkgMlxuICAgICAgICBpZiAoKHUwICYgMSkgIT09IDApIHtcbiAgICAgICAgICBmb3IgKHYgPSAwLCBrID0gMDsgdiA8IGhlaWdodDsgdisrLCBrICs9IHdpZHRoKSB7XG4gICAgICAgICAgICBpdGVtc1trXSAqPSAwLjU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHYgPSAwLCBrID0gMDsgdiA8IGhlaWdodDsgdisrLCBrICs9IHdpZHRoKSB7XG4gICAgICAgICAgcm93QnVmZmVyLnNldChpdGVtcy5zdWJhcnJheShrLCBrICsgd2lkdGgpLCBidWZmZXJQYWRkaW5nKTtcblxuICAgICAgICAgIHRoaXMuZXh0ZW5kKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpO1xuICAgICAgICAgIHRoaXMuZmlsdGVyKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpO1xuXG4gICAgICAgICAgaXRlbXMuc2V0KFxuICAgICAgICAgICAgcm93QnVmZmVyLnN1YmFycmF5KGJ1ZmZlclBhZGRpbmcsIGJ1ZmZlclBhZGRpbmcgKyB3aWR0aCksXG4gICAgICAgICAgICBrXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBY2Nlc3NlcyB0byB0aGUgaXRlbXMgYXJyYXkgY2FuIHRha2UgbG9uZywgYmVjYXVzZSBpdCBtYXkgbm90IGZpdCBpbnRvXG4gICAgICAvLyBDUFUgY2FjaGUgYW5kIGhhcyB0byBiZSBmZXRjaGVkIGZyb20gbWFpbiBtZW1vcnkuIFNpbmNlIHN1YnNlcXVlbnRcbiAgICAgIC8vIGFjY2Vzc2VzIHRvIHRoZSBpdGVtcyBhcnJheSBhcmUgbm90IGxvY2FsIHdoZW4gcmVhZGluZyBjb2x1bW5zLCB3ZVxuICAgICAgLy8gaGF2ZSBhIGNhY2hlIG1pc3MgZXZlcnkgdGltZS4gVG8gcmVkdWNlIGNhY2hlIG1pc3NlcywgZ2V0IHVwIHRvXG4gICAgICAvLyAnbnVtQnVmZmVycycgaXRlbXMgYXQgYSB0aW1lIGFuZCBzdG9yZSB0aGVtIGludG8gdGhlIGluZGl2aWR1YWxcbiAgICAgIC8vIGJ1ZmZlcnMuIFRoZSBjb2xCdWZmZXJzIHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggdG8gZml0IGludG8gQ1BVIGNhY2hlLlxuICAgICAgdmFyIG51bUJ1ZmZlcnMgPSAxNjtcbiAgICAgIHZhciBjb2xCdWZmZXJzID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKSB7XG4gICAgICAgIGNvbEJ1ZmZlcnMucHVzaChuZXcgRmxvYXQzMkFycmF5KGhlaWdodCArIDIgKiBidWZmZXJQYWRkaW5nKSk7XG4gICAgICB9XG4gICAgICB2YXIgYixcbiAgICAgICAgY3VycmVudEJ1ZmZlciA9IDA7XG4gICAgICBsbCA9IGJ1ZmZlclBhZGRpbmcgKyBoZWlnaHQ7XG5cbiAgICAgIC8vIFNlY3Rpb24gRi4zLjUgVkVSX1NSXG4gICAgICBpZiAoaGVpZ2h0ID09PSAxKSB7XG4gICAgICAgIC8vIGlmIGhlaWdodCA9IDEsIHdoZW4gdjAgZXZlbiBrZWVwIGl0ZW1zIGFzIGlzLCB3aGVuIG9kZCBkaXZpZGUgYnkgMlxuICAgICAgICBpZiAoKHYwICYgMSkgIT09IDApIHtcbiAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgd2lkdGg7IHUrKykge1xuICAgICAgICAgICAgaXRlbXNbdV0gKj0gMC41O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHtcbiAgICAgICAgICAvLyBpZiB3ZSByYW4gb3V0IG9mIGJ1ZmZlcnMsIGNvcHkgc2V2ZXJhbCBpbWFnZSBjb2x1bW5zIGF0IG9uY2VcbiAgICAgICAgICBpZiAoY3VycmVudEJ1ZmZlciA9PT0gMCkge1xuICAgICAgICAgICAgbnVtQnVmZmVycyA9IE1hdGgubWluKHdpZHRoIC0gdSwgbnVtQnVmZmVycyk7XG4gICAgICAgICAgICBmb3IgKGsgPSB1LCBsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHtcbiAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykge1xuICAgICAgICAgICAgICAgIGNvbEJ1ZmZlcnNbYl1bbF0gPSBpdGVtc1trICsgYl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBudW1CdWZmZXJzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1cnJlbnRCdWZmZXItLTtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gY29sQnVmZmVyc1tjdXJyZW50QnVmZmVyXTtcbiAgICAgICAgICB0aGlzLmV4dGVuZChidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7XG4gICAgICAgICAgdGhpcy5maWx0ZXIoYnVmZmVyLCBidWZmZXJQYWRkaW5nLCBoZWlnaHQpO1xuXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBsYXN0IGJ1ZmZlciBpbiB0aGlzIGdyb3VwIG9mIGJ1ZmZlcnMsIGZsdXNoIGFsbCBidWZmZXJzLlxuICAgICAgICAgIGlmIChjdXJyZW50QnVmZmVyID09PSAwKSB7XG4gICAgICAgICAgICBrID0gdSAtIG51bUJ1ZmZlcnMgKyAxO1xuICAgICAgICAgICAgZm9yIChsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHtcbiAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykge1xuICAgICAgICAgICAgICAgIGl0ZW1zW2sgKyBiXSA9IGNvbEJ1ZmZlcnNbYl1bbF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgaXRlbXMsXG4gICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIFRyYW5zZm9ybTtcbiAgfSkoKTtcblxuICAvLyBTZWN0aW9uIDMuOC4yIElycmV2ZXJzaWJsZSA5LTcgZmlsdGVyXG4gIHZhciBJcnJldmVyc2libGVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtQ2xvc3VyZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCkge1xuICAgICAgVHJhbnNmb3JtLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7XG4gICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiBpcnJldmVyc2libGVUcmFuc2Zvcm1GaWx0ZXIoXG4gICAgICB4LFxuICAgICAgb2Zmc2V0LFxuICAgICAgbGVuZ3RoXG4gICAgKSB7XG4gICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgICAgdmFyIGosIG4sIGN1cnJlbnQsIG5leHQ7XG5cbiAgICAgIHZhciBhbHBoYSA9IC0xLjU4NjEzNDM0MjA1OTkyNDtcbiAgICAgIHZhciBiZXRhID0gLTAuMDUyOTgwMTE4NTcyOTYxO1xuICAgICAgdmFyIGdhbW1hID0gMC44ODI5MTEwNzU1MzA5MzQ7XG4gICAgICB2YXIgZGVsdGEgPSAwLjQ0MzUwNjg1MjA0Mzk3MTtcbiAgICAgIHZhciBLID0gMS4yMzAxNzQxMDQ5MTQwMDE7XG4gICAgICB2YXIgS18gPSAxIC8gSztcblxuICAgICAgLy8gc3RlcCAxIGlzIGNvbWJpbmVkIHdpdGggc3RlcCAzXG5cbiAgICAgIC8vIHN0ZXAgMlxuICAgICAgaiA9IG9mZnNldCAtIDM7XG4gICAgICBmb3IgKG4gPSBsZW4gKyA0OyBuLS07IGogKz0gMikge1xuICAgICAgICB4W2pdICo9IEtfO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGVwIDEgJiAzXG4gICAgICBqID0gb2Zmc2V0IC0gMjtcbiAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiAtIDFdO1xuICAgICAgZm9yIChuID0gbGVuICsgMzsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgbmV4dCA9IGRlbHRhICogeFtqICsgMV07XG4gICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0O1xuICAgICAgICBpZiAobi0tKSB7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiArIDFdO1xuICAgICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0ZXAgNFxuICAgICAgaiA9IG9mZnNldCAtIDE7XG4gICAgICBjdXJyZW50ID0gZ2FtbWEgKiB4W2ogLSAxXTtcbiAgICAgIGZvciAobiA9IGxlbiArIDI7IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIG5leHQgPSBnYW1tYSAqIHhbaiArIDFdO1xuICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICBpZiAobi0tKSB7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIGN1cnJlbnQgPSBnYW1tYSAqIHhbaiArIDFdO1xuICAgICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc3RlcCA1XG4gICAgICBqID0gb2Zmc2V0O1xuICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogLSAxXTtcbiAgICAgIGZvciAobiA9IGxlbiArIDE7IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIG5leHQgPSBiZXRhICogeFtqICsgMV07XG4gICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7XG4gICAgICAgIGlmIChuLS0pIHtcbiAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogKyAxXTtcbiAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0ZXAgNlxuICAgICAgaWYgKGxlbiAhPT0gMCkge1xuICAgICAgICBqID0gb2Zmc2V0ICsgMTtcbiAgICAgICAgY3VycmVudCA9IGFscGhhICogeFtqIC0gMV07XG4gICAgICAgIGZvciAobiA9IGxlbjsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgICBuZXh0ID0gYWxwaGEgKiB4W2ogKyAxXTtcbiAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICAgIGlmIChuLS0pIHtcbiAgICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiArIDFdO1xuICAgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBJcnJldmVyc2libGVUcmFuc2Zvcm07XG4gIH0pKCk7XG5cbiAgLy8gU2VjdGlvbiAzLjguMSBSZXZlcnNpYmxlIDUtMyBmaWx0ZXJcbiAgdmFyIFJldmVyc2libGVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm0oKSB7XG4gICAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7XG4gICAgUmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gcmV2ZXJzaWJsZVRyYW5zZm9ybUZpbHRlcihcbiAgICAgIHgsXG4gICAgICBvZmZzZXQsXG4gICAgICBsZW5ndGhcbiAgICApIHtcbiAgICAgIHZhciBsZW4gPSBsZW5ndGggPj4gMTtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgICB2YXIgaiwgbjtcblxuICAgICAgZm9yIChqID0gb2Zmc2V0LCBuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgeFtqXSAtPSAoeFtqIC0gMV0gKyB4W2ogKyAxXSArIDIpID4+IDI7XG4gICAgICB9XG5cbiAgICAgIGZvciAoaiA9IG9mZnNldCArIDEsIG4gPSBsZW47IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIHhbal0gKz0gKHhbaiAtIDFdICsgeFtqICsgMV0pID4+IDE7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBSZXZlcnNpYmxlVHJhbnNmb3JtO1xuICB9KSgpO1xuXG4gIHJldHVybiBKcHhJbWFnZTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpweEltYWdlIH07XG4iXSwic291cmNlUm9vdCI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXM1L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy5taW4uanMgYi9lczUvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGRhZjEyCi0tLSAvZGV2L251bGwKKysrIGIvZXM1L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy5taW4uanMKQEAgLTAsMCArMSwyMiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworIWZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoInBkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzIixbXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1sicGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMiXT10KCk6ZVsicGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMiXT1lLnBkZmpzSW1hZ2VEZWNvZGVycz10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIF9fd19wZGZqc19yZXF1aXJlX18ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBuPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O2Vbcl0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsX193X3BkZmpzX3JlcXVpcmVfXyk7bi5sPSEwO3JldHVybiBuLmV4cG9ydHN9X193X3BkZmpzX3JlcXVpcmVfXy5tPWU7X193X3BkZmpzX3JlcXVpcmVfXy5jPXQ7X193X3BkZmpzX3JlcXVpcmVfXy5kPWZ1bmN0aW9uKGUsdCxyKXtfX3dfcGRmanNfcmVxdWlyZV9fLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfTtfX3dfcGRmanNfcmVxdWlyZV9fLnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX07X193X3BkZmpzX3JlcXVpcmVfXy50PWZ1bmN0aW9uKGUsdCl7MSZ0JiYoZT1fX3dfcGRmanNfcmVxdWlyZV9fKGUpKTtpZig4JnQpcmV0dXJuIGU7aWYoNCZ0JiYib2JqZWN0Ij09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO19fd19wZGZqc19yZXF1aXJlX18ucihyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pO2lmKDImdCYmInN0cmluZyIhPXR5cGVvZiBlKWZvcih2YXIgbiBpbiBlKV9fd19wZGZqc19yZXF1aXJlX18uZChyLG4sZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxuKSk7cmV0dXJuIHJ9O19fd19wZGZqc19yZXF1aXJlX18ubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKXtyZXR1cm4gZX07X193X3BkZmpzX3JlcXVpcmVfXy5kKHQsImEiLHQpO3JldHVybiB0fTtfX3dfcGRmanNfcmVxdWlyZV9fLm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9O19fd19wZGZqc19yZXF1aXJlX18ucD0iIjtyZXR1cm4gX193X3BkZmpzX3JlcXVpcmVfXyhfX3dfcGRmanNfcmVxdWlyZV9fLnM9MCl9KFtmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiZ2V0VmVyYm9zaXR5TGV2ZWwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbi5nZXRWZXJib3NpdHlMZXZlbH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwic2V0VmVyYm9zaXR5TGV2ZWwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbi5zZXRWZXJib3NpdHlMZXZlbH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiSmJpZzJtYWdlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGkuSmJpZzJtYWdlfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJKcGVnSW1hZ2UiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gby5KcGVnSW1hZ2V9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIkpweEltYWdlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIGEuSnB4SW1hZ2V9fSk7dmFyIG49cigxKSxpPXIoMTc4KSxvPXIoMTgyKSxhPXIoMTgzKX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5hcnJheUJ5dGVMZW5ndGg9YXJyYXlCeXRlTGVuZ3RoO3QuYXJyYXlzVG9CeXRlcz1mdW5jdGlvbiBhcnJheXNUb0J5dGVzKGUpe3ZhciB0PWUubGVuZ3RoO2lmKDE9PT10JiZlWzBdaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlWzBdO2Zvcih2YXIgcj0wLG49MDtuPHQ7bisrKXIrPWFycmF5Qnl0ZUxlbmd0aChlW25dKTtmb3IodmFyIGk9MCxvPW5ldyBVaW50OEFycmF5KHIpLGE9MDthPHQ7YSsrKXt2YXIgcz1lW2FdO3MgaW5zdGFuY2VvZiBVaW50OEFycmF5fHwocz0ic3RyaW5nIj09dHlwZW9mIHM/c3RyaW5nVG9CeXRlcyhzKTpuZXcgVWludDhBcnJheShzKSk7dmFyIGM9cy5ieXRlTGVuZ3RoO28uc2V0KHMsaSk7aSs9Y31yZXR1cm4gb307dC5hc3NlcnQ9YXNzZXJ0O3QuYnl0ZXNUb1N0cmluZz1mdW5jdGlvbiBieXRlc1RvU3RyaW5nKGUpe2Fzc2VydChudWxsIT09ZSYmIm9iamVjdCI9PT1fdHlwZW9mKGUpJiZ2b2lkIDAhPT1lLmxlbmd0aCwiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZyIpO3ZhciB0PWUubGVuZ3RoO2lmKHQ8ODE5MilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGUpO2Zvcih2YXIgcj1bXSxuPTA7bjx0O24rPTgxOTIpe3ZhciBpPU1hdGgubWluKG4rODE5Mix0KSxvPWUuc3ViYXJyYXkobixpKTtyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG8pKX1yZXR1cm4gci5qb2luKCIiKX07dC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpe3ZhciBlPU9iamVjdC5jcmVhdGUobnVsbCksdD0hMTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwic2V0dGxlZCIse2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdH19KTtlLnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbil7ZS5yZXNvbHZlPWZ1bmN0aW9uKGUpe3Q9ITA7cihlKX07ZS5yZWplY3Q9ZnVuY3Rpb24oZSl7dD0hMDtuKGUpfX0pKTtyZXR1cm4gZX07dC5lc2NhcGVTdHJpbmc9ZnVuY3Rpb24gZXNjYXBlU3RyaW5nKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbXChcKVxcXSkvZywiXFwkMSIpfTt0LmdldE1vZGlmaWNhdGlvbkRhdGU9ZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpuZXcgRGF0ZShEYXRlLm5vdygpKSx0PVtlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwoZS5nZXRVVENNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLChlLmdldFVUQ0RhdGUoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIildO3JldHVybiB0LmpvaW4oIiIpfTt0LmdldFZlcmJvc2l0eUxldmVsPWZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCl7cmV0dXJuIGl9O3QuaW5mbz1mdW5jdGlvbiBpbmZvKGUpe2k+PW4uSU5GT1MmJmNvbnNvbGUubG9nKCJJbmZvOiAiLmNvbmNhdChlKSl9O3QuaXNBcnJheUJ1ZmZlcj1mdW5jdGlvbiBpc0FycmF5QnVmZmVyKGUpe3JldHVybiJvYmplY3QiPT09X3R5cGVvZihlKSYmbnVsbCE9PWUmJnZvaWQgMCE9PWUuYnl0ZUxlbmd0aH07dC5pc0FycmF5RXF1YWw9ZnVuY3Rpb24gaXNBcnJheUVxdWFsKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtyZXR1cm4gZS5ldmVyeSgoZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT09PXRbcl19KSl9O3QuaXNCb29sPWZ1bmN0aW9uIGlzQm9vbChlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlfTt0LmlzTnVtPWZ1bmN0aW9uIGlzTnVtKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX07dC5pc1N0cmluZz1mdW5jdGlvbiBpc1N0cmluZyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9O3QuaXNTYW1lT3JpZ2luPWZ1bmN0aW9uIGlzU2FtZU9yaWdpbihlLHQpe3ZhciByO3RyeXtpZighKHI9bmV3IFVSTChlKSkub3JpZ2lufHwibnVsbCI9PT1yLm9yaWdpbilyZXR1cm4hMX1jYXRjaChlKXtyZXR1cm4hMX12YXIgbj1uZXcgVVJMKHQscik7cmV0dXJuIHIub3JpZ2luPT09bi5vcmlnaW59O3QuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybD1mdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKGUsdCl7aWYoIWUpcmV0dXJuIG51bGw7dHJ5e3ZhciByPXQ/bmV3IFVSTChlLHQpOm5ldyBVUkwoZSk7aWYoZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbChlKXtpZighZSlyZXR1cm4hMTtzd2l0Y2goZS5wcm90b2NvbCl7Y2FzZSJodHRwOiI6Y2FzZSJodHRwczoiOmNhc2UiZnRwOiI6Y2FzZSJtYWlsdG86IjpjYXNlInRlbDoiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fShyKSlyZXR1cm4gcn1jYXRjaChlKXt9cmV0dXJuIG51bGx9O3QucmVtb3ZlTnVsbENoYXJhY3RlcnM9ZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnMoZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXt3YXJuKCJUaGUgYXJndW1lbnQgZm9yIHJlbW92ZU51bGxDaGFyYWN0ZXJzIG11c3QgYmUgYSBzdHJpbmcuIik7cmV0dXJuIGV9cmV0dXJuIGUucmVwbGFjZShkLCIiKX07dC5zZXRWZXJib3NpdHlMZXZlbD1mdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChlKXtOdW1iZXIuaXNJbnRlZ2VyKGUpJiYoaT1lKX07dC5zaGFkb3c9c2hhZG93O3Quc3RyaW5nMzI9ZnVuY3Rpb24gc3RyaW5nMzIoZSl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwyNTUmZSl9O3Quc3RyaW5nVG9CeXRlcz1zdHJpbmdUb0J5dGVzO3Quc3RyaW5nVG9QREZTdHJpbmc9ZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoZSl7dmFyIHQ9ZS5sZW5ndGgscj1bXTtpZigiw74iPT09ZVswXSYmIsO/Ij09PWVbMV0pZm9yKHZhciBuPTI7bjx0O24rPTIpci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZUF0KG4pPDw4fGUuY2hhckNvZGVBdChuKzEpKSk7ZWxzZSBpZigiw78iPT09ZVswXSYmIsO+Ij09PWVbMV0pZm9yKHZhciBpPTI7aTx0O2krPTIpci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZUF0KGkrMSk8PDh8ZS5jaGFyQ29kZUF0KGkpKSk7ZWxzZSBmb3IodmFyIG89MDtvPHQ7KytvKXt2YXIgYT15W2UuY2hhckNvZGVBdChvKV07ci5wdXNoKGE/U3RyaW5nLmZyb21DaGFyQ29kZShhKTplLmNoYXJBdChvKSl9cmV0dXJuIHIuam9pbigiIil9O3Quc3RyaW5nVG9VVEY4U3RyaW5nPWZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhlKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShlKSl9O3QudXRmOFN0cmluZ1RvU3RyaW5nPWZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhlKXtyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKX07dC53YXJuPXdhcm47dC51bnJlYWNoYWJsZT11bnJlYWNoYWJsZTt0LklzRXZhbFN1cHBvcnRlZENhY2hlZD10LklzTGl0dGxlRW5kaWFuQ2FjaGVkPXQuY3JlYXRlT2JqZWN0VVJMPXQuRm9ybWF0RXJyb3I9dC5VdGlsPXQuVW5rbm93bkVycm9yRXhjZXB0aW9uPXQuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uPXQuVGV4dFJlbmRlcmluZ01vZGU9dC5TdHJlYW1UeXBlPXQuUGVybWlzc2lvbkZsYWc9dC5QYXNzd29yZFJlc3BvbnNlcz10LlBhc3N3b3JkRXhjZXB0aW9uPXQuTWlzc2luZ1BERkV4Y2VwdGlvbj10LkludmFsaWRQREZFeGNlcHRpb249dC5BYm9ydEV4Y2VwdGlvbj10LkNNYXBDb21wcmVzc2lvblR5cGU9dC5JbWFnZUtpbmQ9dC5Gb250VHlwZT10LkFubm90YXRpb25UeXBlPXQuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlPXQuQW5ub3RhdGlvblJldmlld1N0YXRlPXQuQW5ub3RhdGlvblJlcGx5VHlwZT10LkFubm90YXRpb25NYXJrZWRTdGF0ZT10LkFubm90YXRpb25GbGFnPXQuQW5ub3RhdGlvbkZpZWxkRmxhZz10LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9dC5VTlNVUFBPUlRFRF9GRUFUVVJFUz10LlZlcmJvc2l0eUxldmVsPXQuT1BTPXQuSURFTlRJVFlfTUFUUklYPXQuRk9OVF9JREVOVElUWV9NQVRSSVg9dC5CYXNlRXhjZXB0aW9uPXZvaWQgMDtyKDIpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKGUsdCl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPXRbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITE7bi5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG4mJihuLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLmtleSxuKX19ZnVuY3Rpb24gX3R5cGVvZihlKXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24gX3R5cGVvZihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfaW5oZXJpdHMoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7dCYmX3NldFByb3RvdHlwZU9mKGUsdCl9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKGUsdCl7cmV0dXJuKF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihlLHQpe2UuX19wcm90b19fPXQ7cmV0dXJuIGV9KShlLHQpfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcihlKXt2YXIgdD1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpO3JldHVybiEwfWNhdGNoKGUpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKXt2YXIgcixuPV9nZXRQcm90b3R5cGVPZihlKTtpZih0KXt2YXIgaT1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7cj1SZWZsZWN0LmNvbnN0cnVjdChuLGFyZ3VtZW50cyxpKX1lbHNlIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMscil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKGUsdCl7cmV0dXJuIXR8fCJvYmplY3QiIT09X3R5cGVvZih0KSYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChlKXtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIGV9KGUpOnR9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKGUpe3JldHVybihfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YoZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9KShlKX10LklERU5USVRZX01BVFJJWD1bMSwwLDAsMSwwLDBdO3QuRk9OVF9JREVOVElUWV9NQVRSSVg9Wy4wMDEsMCwwLC4wMDEsMCwwXTt0LlBlcm1pc3Npb25GbGFnPXtQUklOVDo0LE1PRElGWV9DT05URU5UUzo4LENPUFk6MTYsTU9ESUZZX0FOTk9UQVRJT05TOjMyLEZJTExfSU5URVJBQ1RJVkVfRk9STVM6MjU2LENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6NTEyLEFTU0VNQkxFOjEwMjQsUFJJTlRfSElHSF9RVUFMSVRZOjIwNDh9O3QuVGV4dFJlbmRlcmluZ01vZGU9e0ZJTEw6MCxTVFJPS0U6MSxGSUxMX1NUUk9LRToyLElOVklTSUJMRTozLEZJTExfQUREX1RPX1BBVEg6NCxTVFJPS0VfQUREX1RPX1BBVEg6NSxGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDo2LEFERF9UT19QQVRIOjcsRklMTF9TVFJPS0VfTUFTSzozLEFERF9UT19QQVRIX0ZMQUc6NH07dC5JbWFnZUtpbmQ9e0dSQVlTQ0FMRV8xQlBQOjEsUkdCXzI0QlBQOjIsUkdCQV8zMkJQUDozfTt0LkFubm90YXRpb25UeXBlPXtURVhUOjEsTElOSzoyLEZSRUVURVhUOjMsTElORTo0LFNRVUFSRTo1LENJUkNMRTo2LFBPTFlHT046NyxQT0xZTElORTo4LEhJR0hMSUdIVDo5LFVOREVSTElORToxMCxTUVVJR0dMWToxMSxTVFJJS0VPVVQ6MTIsU1RBTVA6MTMsQ0FSRVQ6MTQsSU5LOjE1LFBPUFVQOjE2LEZJTEVBVFRBQ0hNRU5UOjE3LFNPVU5EOjE4LE1PVklFOjE5LFdJREdFVDoyMCxTQ1JFRU46MjEsUFJJTlRFUk1BUks6MjIsVFJBUE5FVDoyMyxXQVRFUk1BUks6MjQsVEhSRUVEOjI1LFJFREFDVDoyNn07dC5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGU9e01BUktFRDoiTWFya2VkIixSRVZJRVc6IlJldmlldyJ9O3QuQW5ub3RhdGlvbk1hcmtlZFN0YXRlPXtNQVJLRUQ6Ik1hcmtlZCIsVU5NQVJLRUQ6IlVubWFya2VkIn07dC5Bbm5vdGF0aW9uUmV2aWV3U3RhdGU9e0FDQ0VQVEVEOiJBY2NlcHRlZCIsUkVKRUNURUQ6IlJlamVjdGVkIixDQU5DRUxMRUQ6IkNhbmNlbGxlZCIsQ09NUExFVEVEOiJDb21wbGV0ZWQiLE5PTkU6Ik5vbmUifTt0LkFubm90YXRpb25SZXBseVR5cGU9e0dST1VQOiJHcm91cCIsUkVQTFk6IlIifTt0LkFubm90YXRpb25GbGFnPXtJTlZJU0lCTEU6MSxISURERU46MixQUklOVDo0LE5PWk9PTTo4LE5PUk9UQVRFOjE2LE5PVklFVzozMixSRUFET05MWTo2NCxMT0NLRUQ6MTI4LFRPR0dMRU5PVklFVzoyNTYsTE9DS0VEQ09OVEVOVFM6NTEyfTt0LkFubm90YXRpb25GaWVsZEZsYWc9e1JFQURPTkxZOjEsUkVRVUlSRUQ6MixOT0VYUE9SVDo0LE1VTFRJTElORTo0MDk2LFBBU1NXT1JEOjgxOTIsTk9UT0dHTEVUT09GRjoxNjM4NCxSQURJTzozMjc2OCxQVVNIQlVUVE9OOjY1NTM2LENPTUJPOjEzMTA3MixFRElUOjI2MjE0NCxTT1JUOjUyNDI4OCxGSUxFU0VMRUNUOjEwNDg1NzYsTVVMVElTRUxFQ1Q6MjA5NzE1MixET05PVFNQRUxMQ0hFQ0s6NDE5NDMwNCxET05PVFNDUk9MTDo4Mzg4NjA4LENPTUI6MTY3NzcyMTYsUklDSFRFWFQ6MzM1NTQ0MzIsUkFESU9TSU5VTklTT046MzM1NTQ0MzIsQ09NTUlUT05TRUxDSEFOR0U6NjcxMDg4NjR9O3QuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZT17U09MSUQ6MSxEQVNIRUQ6MixCRVZFTEVEOjMsSU5TRVQ6NCxVTkRFUkxJTkU6NX07dC5TdHJlYW1UeXBlPXtVTktOT1dOOiJVTktOT1dOIixGTEFURToiRkxBVEUiLExaVzoiTFpXIixEQ1Q6IkRDVCIsSlBYOiJKUFgiLEpCSUc6IkpCSUciLEE4NToiQTg1IixBSFg6IkFIWCIsQ0NGOiJDQ0YiLFJMWDoiUkxYIn07dC5Gb250VHlwZT17VU5LTk9XTjoiVU5LTk9XTiIsVFlQRTE6IlRZUEUxIixUWVBFMUM6IlRZUEUxQyIsQ0lERk9OVFRZUEUwOiJDSURGT05UVFlQRTAiLENJREZPTlRUWVBFMEM6IkNJREZPTlRUWVBFMEMiLFRSVUVUWVBFOiJUUlVFVFlQRSIsQ0lERk9OVFRZUEUyOiJDSURGT05UVFlQRTIiLFRZUEUzOiJUWVBFMyIsT1BFTlRZUEU6Ik9QRU5UWVBFIixUWVBFMDoiVFlQRTAiLE1NVFlQRTE6Ik1NVFlQRTEifTt2YXIgbj17RVJST1JTOjAsV0FSTklOR1M6MSxJTkZPUzo1fTt0LlZlcmJvc2l0eUxldmVsPW47dC5DTWFwQ29tcHJlc3Npb25UeXBlPXtOT05FOjAsQklOQVJZOjEsU1RSRUFNOjJ9O3QuT1BTPXtkZXBlbmRlbmN5OjEsc2V0TGluZVdpZHRoOjIsc2V0TGluZUNhcDozLHNldExpbmVKb2luOjQsc2V0TWl0ZXJMaW1pdDo1LHNldERhc2g6NixzZXRSZW5kZXJpbmdJbnRlbnQ6NyxzZXRGbGF0bmVzczo4LHNldEdTdGF0ZTo5LHNhdmU6MTAscmVzdG9yZToxMSx0cmFuc2Zvcm06MTIsbW92ZVRvOjEzLGxpbmVUbzoxNCxjdXJ2ZVRvOjE1LGN1cnZlVG8yOjE2LGN1cnZlVG8zOjE3LGNsb3NlUGF0aDoxOCxyZWN0YW5nbGU6MTksc3Ryb2tlOjIwLGNsb3NlU3Ryb2tlOjIxLGZpbGw6MjIsZW9GaWxsOjIzLGZpbGxTdHJva2U6MjQsZW9GaWxsU3Ryb2tlOjI1LGNsb3NlRmlsbFN0cm9rZToyNixjbG9zZUVPRmlsbFN0cm9rZToyNyxlbmRQYXRoOjI4LGNsaXA6MjksZW9DbGlwOjMwLGJlZ2luVGV4dDozMSxlbmRUZXh0OjMyLHNldENoYXJTcGFjaW5nOjMzLHNldFdvcmRTcGFjaW5nOjM0LHNldEhTY2FsZTozNSxzZXRMZWFkaW5nOjM2LHNldEZvbnQ6Mzcsc2V0VGV4dFJlbmRlcmluZ01vZGU6Mzgsc2V0VGV4dFJpc2U6MzksbW92ZVRleHQ6NDAsc2V0TGVhZGluZ01vdmVUZXh0OjQxLHNldFRleHRNYXRyaXg6NDIsbmV4dExpbmU6NDMsc2hvd1RleHQ6NDQsc2hvd1NwYWNlZFRleHQ6NDUsbmV4dExpbmVTaG93VGV4dDo0NixuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDo0NyxzZXRDaGFyV2lkdGg6NDgsc2V0Q2hhcldpZHRoQW5kQm91bmRzOjQ5LHNldFN0cm9rZUNvbG9yU3BhY2U6NTAsc2V0RmlsbENvbG9yU3BhY2U6NTEsc2V0U3Ryb2tlQ29sb3I6NTIsc2V0U3Ryb2tlQ29sb3JOOjUzLHNldEZpbGxDb2xvcjo1NCxzZXRGaWxsQ29sb3JOOjU1LHNldFN0cm9rZUdyYXk6NTYsc2V0RmlsbEdyYXk6NTcsc2V0U3Ryb2tlUkdCQ29sb3I6NTgsc2V0RmlsbFJHQkNvbG9yOjU5LHNldFN0cm9rZUNNWUtDb2xvcjo2MCxzZXRGaWxsQ01ZS0NvbG9yOjYxLHNoYWRpbmdGaWxsOjYyLGJlZ2luSW5saW5lSW1hZ2U6NjMsYmVnaW5JbWFnZURhdGE6NjQsZW5kSW5saW5lSW1hZ2U6NjUscGFpbnRYT2JqZWN0OjY2LG1hcmtQb2ludDo2NyxtYXJrUG9pbnRQcm9wczo2OCxiZWdpbk1hcmtlZENvbnRlbnQ6NjksYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6NzAsZW5kTWFya2VkQ29udGVudDo3MSxiZWdpbkNvbXBhdDo3MixlbmRDb21wYXQ6NzMscGFpbnRGb3JtWE9iamVjdEJlZ2luOjc0LHBhaW50Rm9ybVhPYmplY3RFbmQ6NzUsYmVnaW5Hcm91cDo3NixlbmRHcm91cDo3NyxiZWdpbkFubm90YXRpb25zOjc4LGVuZEFubm90YXRpb25zOjc5LGJlZ2luQW5ub3RhdGlvbjo4MCxlbmRBbm5vdGF0aW9uOjgxLHBhaW50SnBlZ1hPYmplY3Q6ODIscGFpbnRJbWFnZU1hc2tYT2JqZWN0OjgzLHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOjg0LHBhaW50SW1hZ2VYT2JqZWN0Ojg1LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0Ojg2LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6ODcscGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6ODgscGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0Ojg5LHBhaW50U29saWRDb2xvckltYWdlTWFzazo5MCxjb25zdHJ1Y3RQYXRoOjkxfTt0LlVOU1VQUE9SVEVEX0ZFQVRVUkVTPXt1bmtub3duOiJ1bmtub3duIixmb3JtczoiZm9ybXMiLGphdmFTY3JpcHQ6ImphdmFTY3JpcHQiLHNtYXNrOiJzbWFzayIsc2hhZGluZ1BhdHRlcm46InNoYWRpbmdQYXR0ZXJuIixmb250OiJmb250IixlcnJvclRpbGluZ1BhdHRlcm46ImVycm9yVGlsaW5nUGF0dGVybiIsZXJyb3JFeHRHU3RhdGU6ImVycm9yRXh0R1N0YXRlIixlcnJvclhPYmplY3Q6ImVycm9yWE9iamVjdCIsZXJyb3JGb250TG9hZFR5cGUzOiJlcnJvckZvbnRMb2FkVHlwZTMiLGVycm9yRm9udFN0YXRlOiJlcnJvckZvbnRTdGF0ZSIsZXJyb3JGb250TWlzc2luZzoiZXJyb3JGb250TWlzc2luZyIsZXJyb3JGb250VHJhbnNsYXRlOiJlcnJvckZvbnRUcmFuc2xhdGUiLGVycm9yQ29sb3JTcGFjZToiZXJyb3JDb2xvclNwYWNlIixlcnJvck9wZXJhdG9yTGlzdDoiZXJyb3JPcGVyYXRvckxpc3QiLGVycm9yRm9udFRvVW5pY29kZToiZXJyb3JGb250VG9Vbmljb2RlIixlcnJvckZvbnRMb2FkTmF0aXZlOiJlcnJvckZvbnRMb2FkTmF0aXZlIixlcnJvckZvbnRHZXRQYXRoOiJlcnJvckZvbnRHZXRQYXRoIixlcnJvck1hcmtlZENvbnRlbnQ6ImVycm9yTWFya2VkQ29udGVudCJ9O3QuUGFzc3dvcmRSZXNwb25zZXM9e05FRURfUEFTU1dPUkQ6MSxJTkNPUlJFQ1RfUEFTU1dPUkQ6Mn07dmFyIGk9bi5XQVJOSU5HUztmdW5jdGlvbiB3YXJuKGUpe2k+PW4uV0FSTklOR1MmJmNvbnNvbGUubG9nKCJXYXJuaW5nOiAiLmNvbmNhdChlKSl9ZnVuY3Rpb24gdW5yZWFjaGFibGUoZSl7dGhyb3cgbmV3IEVycm9yKGUpfWZ1bmN0aW9uIGFzc2VydChlLHQpe2V8fHVucmVhY2hhYmxlKHQpfWZ1bmN0aW9uIHNoYWRvdyhlLHQscil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMX0pO3JldHVybiByfXZhciBvPWZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCl7ZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihlKXt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZUV4Y2VwdGlvbiYmdW5yZWFjaGFibGUoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uIik7dGhpcy5tZXNzYWdlPWU7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZX1CYXNlRXhjZXB0aW9uLnByb3RvdHlwZT1uZXcgRXJyb3I7QmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3Rvcj1CYXNlRXhjZXB0aW9uO3JldHVybiBCYXNlRXhjZXB0aW9ufSgpO3QuQmFzZUV4Y2VwdGlvbj1vO3ZhciBhPWZ1bmN0aW9uKGUpe19pbmhlcml0cyhQYXNzd29yZEV4Y2VwdGlvbixlKTt2YXIgdD1fY3JlYXRlU3VwZXIoUGFzc3dvcmRFeGNlcHRpb24pO2Z1bmN0aW9uIFBhc3N3b3JkRXhjZXB0aW9uKGUscil7dmFyIG47X2NsYXNzQ2FsbENoZWNrKHRoaXMsUGFzc3dvcmRFeGNlcHRpb24pOyhuPXQuY2FsbCh0aGlzLGUpKS5jb2RlPXI7cmV0dXJuIG59cmV0dXJuIFBhc3N3b3JkRXhjZXB0aW9ufShvKTt0LlBhc3N3b3JkRXhjZXB0aW9uPWE7dmFyIHM9ZnVuY3Rpb24oZSl7X2luaGVyaXRzKFVua25vd25FcnJvckV4Y2VwdGlvbixlKTt2YXIgdD1fY3JlYXRlU3VwZXIoVW5rbm93bkVycm9yRXhjZXB0aW9uKTtmdW5jdGlvbiBVbmtub3duRXJyb3JFeGNlcHRpb24oZSxyKXt2YXIgbjtfY2xhc3NDYWxsQ2hlY2sodGhpcyxVbmtub3duRXJyb3JFeGNlcHRpb24pOyhuPXQuY2FsbCh0aGlzLGUpKS5kZXRhaWxzPXI7cmV0dXJuIG59cmV0dXJuIFVua25vd25FcnJvckV4Y2VwdGlvbn0obyk7dC5Vbmtub3duRXJyb3JFeGNlcHRpb249czt2YXIgYz1mdW5jdGlvbihlKXtfaW5oZXJpdHMoSW52YWxpZFBERkV4Y2VwdGlvbixlKTt2YXIgdD1fY3JlYXRlU3VwZXIoSW52YWxpZFBERkV4Y2VwdGlvbik7ZnVuY3Rpb24gSW52YWxpZFBERkV4Y2VwdGlvbigpe19jbGFzc0NhbGxDaGVjayh0aGlzLEludmFsaWRQREZFeGNlcHRpb24pO3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gSW52YWxpZFBERkV4Y2VwdGlvbn0obyk7dC5JbnZhbGlkUERGRXhjZXB0aW9uPWM7dmFyIHU9ZnVuY3Rpb24oZSl7X2luaGVyaXRzKE1pc3NpbmdQREZFeGNlcHRpb24sZSk7dmFyIHQ9X2NyZWF0ZVN1cGVyKE1pc3NpbmdQREZFeGNlcHRpb24pO2Z1bmN0aW9uIE1pc3NpbmdQREZFeGNlcHRpb24oKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxNaXNzaW5nUERGRXhjZXB0aW9uKTtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE1pc3NpbmdQREZFeGNlcHRpb259KG8pO3QuTWlzc2luZ1BERkV4Y2VwdGlvbj11O3ZhciBmPWZ1bmN0aW9uKGUpe19pbmhlcml0cyhVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sZSk7dmFyIHQ9X2NyZWF0ZVN1cGVyKFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbik7ZnVuY3Rpb24gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGUscil7dmFyIG47X2NsYXNzQ2FsbENoZWNrKHRoaXMsVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKTsobj10LmNhbGwodGhpcyxlKSkuc3RhdHVzPXI7cmV0dXJuIG59cmV0dXJuIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbn0obyk7dC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249Zjt2YXIgbD1mdW5jdGlvbihlKXtfaW5oZXJpdHMoRm9ybWF0RXJyb3IsZSk7dmFyIHQ9X2NyZWF0ZVN1cGVyKEZvcm1hdEVycm9yKTtmdW5jdGlvbiBGb3JtYXRFcnJvcigpe19jbGFzc0NhbGxDaGVjayh0aGlzLEZvcm1hdEVycm9yKTtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIEZvcm1hdEVycm9yfShvKTt0LkZvcm1hdEVycm9yPWw7dmFyIHA9ZnVuY3Rpb24oZSl7X2luaGVyaXRzKEFib3J0RXhjZXB0aW9uLGUpO3ZhciB0PV9jcmVhdGVTdXBlcihBYm9ydEV4Y2VwdGlvbik7ZnVuY3Rpb24gQWJvcnRFeGNlcHRpb24oKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxBYm9ydEV4Y2VwdGlvbik7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBBYm9ydEV4Y2VwdGlvbn0obyk7dC5BYm9ydEV4Y2VwdGlvbj1wO3ZhciBkPS9ceDAwL2c7ZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhlKXthc3NlcnQoInN0cmluZyI9PXR5cGVvZiBlLCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzIik7Zm9yKHZhciB0PWUubGVuZ3RoLHI9bmV3IFVpbnQ4QXJyYXkodCksbj0wO248dDsrK24pcltuXT0yNTUmZS5jaGFyQ29kZUF0KG4pO3JldHVybiByfWZ1bmN0aW9uIGFycmF5Qnl0ZUxlbmd0aChlKXtpZih2b2lkIDAhPT1lLmxlbmd0aClyZXR1cm4gZS5sZW5ndGg7YXNzZXJ0KHZvaWQgMCE9PWUuYnl0ZUxlbmd0aCwiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC4iKTtyZXR1cm4gZS5ieXRlTGVuZ3RofXZhciBoPXtnZXQgdmFsdWUoKXtyZXR1cm4gc2hhZG93KHRoaXMsInZhbHVlIixmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KDQpO2VbMF09MTtyZXR1cm4gMT09PW5ldyBVaW50MzJBcnJheShlLmJ1ZmZlciwwLDEpWzBdfSgpKX19O3QuSXNMaXR0bGVFbmRpYW5DYWNoZWQ9aDt2YXIgZz17Z2V0IHZhbHVlKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJ2YWx1ZSIsZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCl7dHJ5e25ldyBGdW5jdGlvbigiIik7cmV0dXJuITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpKX19O3QuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkPWc7dmFyIHY9WyJyZ2IoIiwwLCIsIiwwLCIsIiwwLCIpIl0sbT1mdW5jdGlvbigpe2Z1bmN0aW9uIFV0aWwoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxVdGlsKX0hZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUsdCxyKXt0JiZfZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSx0KTtyJiZfZGVmaW5lUHJvcGVydGllcyhlLHIpO3JldHVybiBlfShVdGlsLG51bGwsW3trZXk6Im1ha2VDc3NSZ2IiLHZhbHVlOmZ1bmN0aW9uIG1ha2VDc3NSZ2IoZSx0LHIpe3ZbMV09ZTt2WzNdPXQ7dls1XT1yO3JldHVybiB2LmpvaW4oIiIpfX0se2tleToidHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiB0cmFuc2Zvcm0oZSx0KXtyZXR1cm5bZVswXSp0WzBdK2VbMl0qdFsxXSxlWzFdKnRbMF0rZVszXSp0WzFdLGVbMF0qdFsyXStlWzJdKnRbM10sZVsxXSp0WzJdK2VbM10qdFszXSxlWzBdKnRbNF0rZVsyXSp0WzVdK2VbNF0sZVsxXSp0WzRdK2VbM10qdFs1XStlWzVdXX19LHtrZXk6ImFwcGx5VHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiBhcHBseVRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsxXSp0WzJdK3RbNF0sZVswXSp0WzFdK2VbMV0qdFszXSt0WzVdXX19LHtrZXk6ImFwcGx5SW52ZXJzZVRyYW5zZm9ybSIsdmFsdWU6ZnVuY3Rpb24gYXBwbHlJbnZlcnNlVHJhbnNmb3JtKGUsdCl7dmFyIHI9dFswXSp0WzNdLXRbMV0qdFsyXTtyZXR1cm5bKGVbMF0qdFszXS1lWzFdKnRbMl0rdFsyXSp0WzVdLXRbNF0qdFszXSkvciwoLWVbMF0qdFsxXStlWzFdKnRbMF0rdFs0XSp0WzFdLXRbNV0qdFswXSkvcl19fSx7a2V5OiJnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24gZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZSx0KXt2YXIgcj1VdGlsLmFwcGx5VHJhbnNmb3JtKGUsdCksbj1VdGlsLmFwcGx5VHJhbnNmb3JtKGUuc2xpY2UoMiw0KSx0KSxpPVV0aWwuYXBwbHlUcmFuc2Zvcm0oW2VbMF0sZVszXV0sdCksbz1VdGlsLmFwcGx5VHJhbnNmb3JtKFtlWzJdLGVbMV1dLHQpO3JldHVybltNYXRoLm1pbihyWzBdLG5bMF0saVswXSxvWzBdKSxNYXRoLm1pbihyWzFdLG5bMV0saVsxXSxvWzFdKSxNYXRoLm1heChyWzBdLG5bMF0saVswXSxvWzBdKSxNYXRoLm1heChyWzFdLG5bMV0saVsxXSxvWzFdKV19fSx7a2V5OiJpbnZlcnNlVHJhbnNmb3JtIix2YWx1ZTpmdW5jdGlvbiBpbnZlcnNlVHJhbnNmb3JtKGUpe3ZhciB0PWVbMF0qZVszXS1lWzFdKmVbMl07cmV0dXJuW2VbM10vdCwtZVsxXS90LC1lWzJdL3QsZVswXS90LChlWzJdKmVbNV0tZVs0XSplWzNdKS90LChlWzRdKmVbMV0tZVs1XSplWzBdKS90XX19LHtrZXk6ImFwcGx5M2RUcmFuc2Zvcm0iLHZhbHVlOmZ1bmN0aW9uIGFwcGx5M2RUcmFuc2Zvcm0oZSx0KXtyZXR1cm5bZVswXSp0WzBdK2VbMV0qdFsxXStlWzJdKnRbMl0sZVszXSp0WzBdK2VbNF0qdFsxXStlWzVdKnRbMl0sZVs2XSp0WzBdK2VbN10qdFsxXStlWzhdKnRbMl1dfX0se2tleToic2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUiLHZhbHVlOmZ1bmN0aW9uIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUpe3ZhciB0PVtlWzBdLGVbMl0sZVsxXSxlWzNdXSxyPWVbMF0qdFswXStlWzFdKnRbMl0sbj1lWzBdKnRbMV0rZVsxXSp0WzNdLGk9ZVsyXSp0WzBdK2VbM10qdFsyXSxvPWVbMl0qdFsxXStlWzNdKnRbM10sYT0ocitvKS8yLHM9TWF0aC5zcXJ0KChyK28pKihyK28pLTQqKHIqby1pKm4pKS8yLGM9YStzfHwxLHU9YS1zfHwxO3JldHVybltNYXRoLnNxcnQoYyksTWF0aC5zcXJ0KHUpXX19LHtrZXk6Im5vcm1hbGl6ZVJlY3QiLHZhbHVlOmZ1bmN0aW9uIG5vcm1hbGl6ZVJlY3QoZSl7dmFyIHQ9ZS5zbGljZSgwKTtpZihlWzBdPmVbMl0pe3RbMF09ZVsyXTt0WzJdPWVbMF19aWYoZVsxXT5lWzNdKXt0WzFdPWVbM107dFszXT1lWzFdfXJldHVybiB0fX0se2tleToiaW50ZXJzZWN0Iix2YWx1ZTpmdW5jdGlvbiBpbnRlcnNlY3QoZSx0KXtmdW5jdGlvbiBjb21wYXJlKGUsdCl7cmV0dXJuIGUtdH12YXIgcj1bZVswXSxlWzJdLHRbMF0sdFsyXV0uc29ydChjb21wYXJlKSxuPVtlWzFdLGVbM10sdFsxXSx0WzNdXS5zb3J0KGNvbXBhcmUpLGk9W107ZT1VdGlsLm5vcm1hbGl6ZVJlY3QoZSk7dD1VdGlsLm5vcm1hbGl6ZVJlY3QodCk7aWYoIShyWzBdPT09ZVswXSYmclsxXT09PXRbMF18fHJbMF09PT10WzBdJiZyWzFdPT09ZVswXSkpcmV0dXJuIG51bGw7aVswXT1yWzFdO2lbMl09clsyXTtpZighKG5bMF09PT1lWzFdJiZuWzFdPT09dFsxXXx8blswXT09PXRbMV0mJm5bMV09PT1lWzFdKSlyZXR1cm4gbnVsbDtpWzFdPW5bMV07aVszXT1uWzJdO3JldHVybiBpfX1dKTtyZXR1cm4gVXRpbH0oKTt0LlV0aWw9bTt2YXIgeT1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzI4LDcxMSw3MTAsNzI5LDczMyw3MzEsNzMwLDczMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MjI2LDgyMjQsODIyNSw4MjMwLDgyMTIsODIxMSw0MDIsODI2MCw4MjQ5LDgyNTAsODcyMiw4MjQwLDgyMjIsODIyMCw4MjIxLDgyMTYsODIxNyw4MjE4LDg0ODIsNjQyNTcsNjQyNTgsMzIxLDMzOCwzNTIsMzc2LDM4MSwzMDUsMzIyLDMzOSwzNTMsMzgyLDAsODM2NF07dmFyIGI9ZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMQ2xvc3VyZSgpe3ZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7cmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTCh0LHIpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07aWYoIW4mJlVSTC5jcmVhdGVPYmplY3RVUkwpe3ZhciBpPW5ldyBCbG9iKFt0XSx7dHlwZTpyfSk7cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoaSl9Zm9yKHZhciBvPSJkYXRhOiIuY29uY2F0KHIsIjtiYXNlNjQsIiksYT0wLHM9dC5sZW5ndGg7YTxzO2ErPTMpe3ZhciBjPTI1NSZ0W2FdLHU9MjU1JnRbYSsxXSxmPTI1NSZ0W2ErMl0sbD1jPj4yLHA9KDMmYyk8PDR8dT4+NCxkPWErMTxzPygxNSZ1KTw8MnxmPj42OjY0LGg9YSsyPHM/NjMmZjo2NDtvKz1lW2xdK2VbcF0rZVtkXStlW2hdfXJldHVybiBvfX0oKTt0LmNyZWF0ZU9iamVjdFVSTD1ifSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMyk7ZnVuY3Rpb24gX3R5cGVvZihlKXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24gX3R5cGVvZihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1pZigidW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbFRoaXN8fCFnbG9iYWxUaGlzLl9wZGZqc0NvbXBhdGliaWxpdHlDaGVja2VkKXsidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMuTWF0aD09PU1hdGh8fChnbG9iYWxUaGlzPXIoNCkpO2dsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQ9ITA7dmFyIGk9Im9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3c/InVuZGVmaW5lZCI6X3R5cGVvZih3aW5kb3cpKSYmIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudD8idW5kZWZpbmVkIjpfdHlwZW9mKGRvY3VtZW50KSksbz0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yLnVzZXJBZ2VudHx8IiIsYT0vVHJpZGVudC8udGVzdChvKTshZnVuY3Rpb24gY2hlY2tOb2RlQnRvYSgpeyFnbG9iYWxUaGlzLmJ0b2EmJm4uaXNOb2RlSlMmJihnbG9iYWxUaGlzLmJ0b2E9ZnVuY3Rpb24oZSl7cmV0dXJuIEJ1ZmZlci5mcm9tKGUsImJpbmFyeSIpLnRvU3RyaW5nKCJiYXNlNjQiKX0pfSgpOyFmdW5jdGlvbiBjaGVja05vZGVBdG9iKCl7IWdsb2JhbFRoaXMuYXRvYiYmbi5pc05vZGVKUyYmKGdsb2JhbFRoaXMuYXRvYj1mdW5jdGlvbihlKXtyZXR1cm4gQnVmZmVyLmZyb20oZSwiYmFzZTY0IikudG9TdHJpbmcoImJpbmFyeSIpfSl9KCk7IWZ1bmN0aW9uIGNoZWNrQ2hpbGROb2RlUmVtb3ZlKCl7aSYmdm9pZCAwPT09RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlJiYoRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyl9KX0oKTshZnVuY3Rpb24gY2hlY2tET01Ub2tlbkxpc3RBZGRSZW1vdmUoKXtpZihpJiYhbi5pc05vZGVKUyl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc0xpc3QuYWRkKCJ0ZXN0T25lIiwidGVzdFR3byIpO2lmKCEwIT09ZS5jbGFzc0xpc3QuY29udGFpbnMoInRlc3RPbmUiKXx8ITAhPT1lLmNsYXNzTGlzdC5jb250YWlucygidGVzdFR3byIpKXt2YXIgdD1ET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCxyPURPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO0RPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspcltuXT1hcmd1bWVudHNbbl07Zm9yKHZhciBpPTAsbz1yO2k8by5sZW5ndGg7aSsrKXt2YXIgYT1vW2ldO3QuY2FsbCh0aGlzLGEpfX07RE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtmb3IodmFyIGk9MCxvPXQ7aTxvLmxlbmd0aDtpKyspe3ZhciBhPW9baV07ci5jYWxsKHRoaXMsYSl9fX19fSgpOyFmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpe2lmKGkmJiFuLmlzTm9kZUpTKXshMSE9PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmNsYXNzTGlzdC50b2dnbGUoInRlc3QiLDApJiYoRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xPyEhYXJndW1lbnRzWzFdOiF0aGlzLmNvbnRhaW5zKGUpO3JldHVybiB0aGlzW3Q/ImFkZCI6InJlbW92ZSJdKGUpLHR9KX19KCk7IWZ1bmN0aW9uIGNoZWNrV2luZG93SGlzdG9yeVB1c2hTdGF0ZVJlcGxhY2VTdGF0ZSgpe2lmKGkmJmEpe3ZhciBlPXdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSx0PXdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZTt3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU9ZnVuY3Rpb24odCxyLG4pe3ZhciBpPXZvaWQgMD09PW4/W3Qscl06W3QscixuXTtlLmFwcGx5KHRoaXMsaSl9O3dpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZT1mdW5jdGlvbihlLHIsbil7dmFyIGk9dm9pZCAwPT09bj9bZSxyXTpbZSxyLG5dO3QuYXBwbHkodGhpcyxpKX19fSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ1N0YXJ0c1dpdGgoKXtTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGh8fHIoNDkpfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ0VuZHNXaXRoKCl7U3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aHx8cig2MCl9KCk7IWZ1bmN0aW9uIGNoZWNrU3RyaW5nSW5jbHVkZXMoKXtTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzfHxyKDYyKX0oKTshZnVuY3Rpb24gY2hlY2tBcnJheUluY2x1ZGVzKCl7QXJyYXkucHJvdG90eXBlLmluY2x1ZGVzfHxyKDY0KX0oKTshZnVuY3Rpb24gY2hlY2tBcnJheUZyb20oKXtBcnJheS5mcm9tfHxyKDcyKX0oKTshZnVuY3Rpb24gY2hlY2tPYmplY3RBc3NpZ24oKXtPYmplY3QuYXNzaWdufHxyKDk0KX0oKTshZnVuY3Rpb24gY2hlY2tPYmplY3RGcm9tRW50cmllcygpe09iamVjdC5mcm9tRW50cmllc3x8cig5Nyl9KCk7IWZ1bmN0aW9uIGNoZWNrTWF0aExvZzIoKXtNYXRoLmxvZzJ8fChNYXRoLmxvZzI9cigxMDEpKX0oKTshZnVuY3Rpb24gY2hlY2tOdW1iZXJJc05hTigpe051bWJlci5pc05hTnx8KE51bWJlci5pc05hTj1yKDEwMykpfSgpOyFmdW5jdGlvbiBjaGVja051bWJlcklzSW50ZWdlcigpe051bWJlci5pc0ludGVnZXJ8fChOdW1iZXIuaXNJbnRlZ2VyPXIoMTA1KSl9KCk7IWZ1bmN0aW9uIGNoZWNrVHlwZWRBcnJheVNsaWNlKCl7VWludDhBcnJheS5wcm90b3R5cGUuc2xpY2V8fHIoMTA4KX0oKTshZnVuY3Rpb24gY2hlY2tNYXBFbnRyaWVzKCl7Z2xvYmFsVGhpcy5NYXAmJmdsb2JhbFRoaXMuTWFwLnByb3RvdHlwZS5lbnRyaWVzfHwoZ2xvYmFsVGhpcy5NYXA9cigxMTMpKX0oKTshZnVuY3Rpb24gY2hlY2tTZXRFbnRyaWVzKCl7Z2xvYmFsVGhpcy5TZXQmJmdsb2JhbFRoaXMuU2V0LnByb3RvdHlwZS5lbnRyaWVzfHwoZ2xvYmFsVGhpcy5TZXQ9cigxMjcpKX0oKTshZnVuY3Rpb24gY2hlY2tXZWFrTWFwKCl7Z2xvYmFsVGhpcy5XZWFrTWFwfHwoZ2xvYmFsVGhpcy5XZWFrTWFwPXIoMTI5KSl9KCk7IWZ1bmN0aW9uIGNoZWNrV2Vha1NldCgpe2dsb2JhbFRoaXMuV2Vha1NldHx8KGdsb2JhbFRoaXMuV2Vha1NldD1yKDEzNSkpfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ0NvZGVQb2ludEF0KCl7U3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdHx8cigxMzcpfSgpOyFmdW5jdGlvbiBjaGVja1N0cmluZ0Zyb21Db2RlUG9pbnQoKXtTdHJpbmcuZnJvbUNvZGVQb2ludHx8KFN0cmluZy5mcm9tQ29kZVBvaW50PXIoMTM5KSl9KCk7IWZ1bmN0aW9uIGNoZWNrU3ltYm9sKCl7Z2xvYmFsVGhpcy5TeW1ib2x8fHIoMTQxKX0oKTshZnVuY3Rpb24gY2hlY2tTdHJpbmdQYWRTdGFydCgpe1N0cmluZy5wcm90b3R5cGUucGFkU3RhcnR8fHIoMTY2KX0oKTshZnVuY3Rpb24gY2hlY2tTdHJpbmdQYWRFbmQoKXtTdHJpbmcucHJvdG90eXBlLnBhZEVuZHx8cigxNzEpfSgpOyFmdW5jdGlvbiBjaGVja09iamVjdFZhbHVlcygpe09iamVjdC52YWx1ZXN8fChPYmplY3QudmFsdWVzPXIoMTczKSl9KCk7IWZ1bmN0aW9uIGNoZWNrT2JqZWN0RW50cmllcygpe09iamVjdC5lbnRyaWVzfHwoT2JqZWN0LmVudHJpZXM9cigxNzYpKX0oKX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuaXNOb2RlSlM9dm9pZCAwO2Z1bmN0aW9uIF90eXBlb2YoZSl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uIF90eXBlb2YoZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSkoZSl9dmFyIG49ISgib2JqZWN0IiE9PSgidW5kZWZpbmVkIj09dHlwZW9mIHByb2Nlc3M/InVuZGVmaW5lZCI6X3R5cGVvZihwcm9jZXNzKSl8fHByb2Nlc3MrIiIhPSJbb2JqZWN0IHByb2Nlc3NdInx8cHJvY2Vzcy52ZXJzaW9ucy5ud3x8cHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiYmcHJvY2Vzcy50eXBlJiYiYnJvd3NlciIhPT1wcm9jZXNzLnR5cGUpO3QuaXNOb2RlSlM9bn0sZnVuY3Rpb24oZSx0LHIpe3IoNSk7ZS5leHBvcnRzPXIoNyl9LGZ1bmN0aW9uKGUsdCxyKXtyKDYpKHtnbG9iYWw6ITB9LHtnbG9iYWxUaGlzOnIoNyl9KX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNyksaT1yKDgpLmYsbz1yKDIyKSxhPXIoMjUpLHM9cigyNiksYz1yKDM2KSx1PXIoNDgpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByLGYsbCxwLGQsaD1lLnRhcmdldCxnPWUuZ2xvYmFsLHY9ZS5zdGF0O2lmKHI9Zz9uOnY/bltoXXx8cyhoLHt9KToobltoXXx8e30pLnByb3RvdHlwZSlmb3IoZiBpbiB0KXtwPXRbZl07bD1lLm5vVGFyZ2V0R2V0PyhkPWkocixmKSkmJmQudmFsdWU6cltmXTtpZighdShnP2Y6aCsodj8iLiI6IiMiKStmLGUuZm9yY2VkKSYmdm9pZCAwIT09bCl7aWYodHlwZW9mIHA9PXR5cGVvZiBsKWNvbnRpbnVlO2MocCxsKX0oZS5zaGFtfHxsJiZsLnNoYW0pJiZvKHAsInNoYW0iLCEwKTthKHIsZixwLGUpfX19LGZ1bmN0aW9uKGUsdCl7dmFyIGNoZWNrPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLk1hdGg9PU1hdGgmJmV9O2UuZXhwb3J0cz1jaGVjaygib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMpfHxjaGVjaygib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93KXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmKXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbCl8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDkpLGk9cigxMSksbz1yKDEyKSxhPXIoMTMpLHM9cigxNyksYz1yKDE5KSx1PXIoMjApLGY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt0LmY9bj9mOmZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpe2U9YShlKTt0PXModCwhMCk7aWYodSl0cnl7cmV0dXJuIGYoZSx0KX1jYXRjaChlKXt9aWYoYyhlLHQpKXJldHVybiBvKCFpLmYuY2FsbChlLHQpLGVbdF0pfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMTApO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LDEse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pWzFdfSkpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXt0cnl7cmV0dXJuISFlKCl9Y2F0Y2goZSl7cmV0dXJuITB9fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isbz1pJiYhbi5jYWxsKHsxOjJ9LDEpO3QuZj1vP2Z1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGUpe3ZhciB0PWkodGhpcyxlKTtyZXR1cm4hIXQmJnQuZW51bWVyYWJsZX06bn0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6dH19fSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxNCksaT1yKDE2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG4oaShlKSl9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxMCksaT1yKDE1KSxvPSIiLnNwbGl0O2UuZXhwb3J0cz1uKChmdW5jdGlvbigpe3JldHVybiFPYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKX0pKT9mdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09aShlKT9vLmNhbGwoZSwiIik6T2JqZWN0KGUpfTpPYmplY3R9LGZ1bmN0aW9uKGUsdCl7dmFyIHI9e30udG9TdHJpbmc7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByLmNhbGwoZSkuc2xpY2UoOCwtMSl9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihudWxsPT1lKXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIitlKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDE4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighbihlKSlyZXR1cm4gZTt2YXIgcixpO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZihyPWUudG9TdHJpbmcpJiYhbihpPXIuY2FsbChlKSkpcmV0dXJuIGk7aWYoImZ1bmN0aW9uIj09dHlwZW9mKHI9ZS52YWx1ZU9mKSYmIW4oaT1yLmNhbGwoZSkpKXJldHVybiBpO2lmKCF0JiYiZnVuY3Rpb24iPT10eXBlb2Yocj1lLnRvU3RyaW5nKSYmIW4oaT1yLmNhbGwoZSkpKXJldHVybiBpO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/bnVsbCE9PWU6ImZ1bmN0aW9uIj09dHlwZW9mIGV9fSxmdW5jdGlvbihlLHQpe3ZhciByPXt9Lmhhc093blByb3BlcnR5O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiByLmNhbGwoZSx0KX19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDkpLGk9cigxMCksbz1yKDIxKTtlLmV4cG9ydHM9IW4mJiFpKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkobygiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSxmdW5jdGlvbihlLHQscil7dmFyIG49cig3KSxpPXIoMTgpLG89bi5kb2N1bWVudCxhPWkobykmJmkoby5jcmVhdGVFbGVtZW50KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGE/by5jcmVhdGVFbGVtZW50KGUpOnt9fX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoOSksaT1yKDIzKSxvPXIoMTIpO2UuZXhwb3J0cz1uP2Z1bmN0aW9uKGUsdCxyKXtyZXR1cm4gaS5mKGUsdCxvKDEscikpfTpmdW5jdGlvbihlLHQscil7ZVt0XT1yO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoOSksaT1yKDIwKSxvPXIoMjQpLGE9cigxNykscz1PYmplY3QuZGVmaW5lUHJvcGVydHk7dC5mPW4/czpmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShlLHQscil7byhlKTt0PWEodCwhMCk7byhyKTtpZihpKXRyeXtyZXR1cm4gcyhlLHQscil9Y2F0Y2goZSl7fWlmKCJnZXQiaW4gcnx8InNldCJpbiByKXRocm93IFR5cGVFcnJvcigiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQiKTsidmFsdWUiaW4gciYmKGVbdF09ci52YWx1ZSk7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCFuKGUpKXRocm93IFR5cGVFcnJvcihTdHJpbmcoZSkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig3KSxpPXIoMjIpLG89cigxOSksYT1yKDI2KSxzPXIoMjcpLGM9cigyOSksdT1jLmdldCxmPWMuZW5mb3JjZSxsPVN0cmluZyhTdHJpbmcpLnNwbGl0KCJTdHJpbmciKTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLHMpe3ZhciBjPSEhcyYmISFzLnVuc2FmZSx1PSEhcyYmISFzLmVudW1lcmFibGUscD0hIXMmJiEhcy5ub1RhcmdldEdldDtpZigiZnVuY3Rpb24iPT10eXBlb2Ygcil7InN0cmluZyIhPXR5cGVvZiB0fHxvKHIsIm5hbWUiKXx8aShyLCJuYW1lIix0KTtmKHIpLnNvdXJjZT1sLmpvaW4oInN0cmluZyI9PXR5cGVvZiB0P3Q6IiIpfWlmKGUhPT1uKXtjPyFwJiZlW3RdJiYodT0hMCk6ZGVsZXRlIGVbdF07dT9lW3RdPXI6aShlLHQscil9ZWxzZSB1P2VbdF09cjphKHQscil9KShGdW5jdGlvbi5wcm90b3R5cGUsInRvU3RyaW5nIiwoZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdSh0aGlzKS5zb3VyY2V8fHModGhpcyl9KSl9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDcpLGk9cigyMik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dHJ5e2kobixlLHQpfWNhdGNoKHIpe25bZV09dH1yZXR1cm4gdH19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDI4KSxpPUZ1bmN0aW9uLnRvU3RyaW5nOyJmdW5jdGlvbiIhPXR5cGVvZiBuLmluc3BlY3RTb3VyY2UmJihuLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY2FsbChlKX0pO2UuZXhwb3J0cz1uLmluc3BlY3RTb3VyY2V9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDcpLGk9cigyNiksbz1uWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8aSgiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7ZS5leHBvcnRzPW99LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbixpLG8sYT1yKDMwKSxzPXIoNyksYz1yKDE4KSx1PXIoMjIpLGY9cigxOSksbD1yKDMxKSxwPXIoMzUpLGQ9cy5XZWFrTWFwO2lmKGEpe3ZhciBoPW5ldyBkLGc9aC5nZXQsdj1oLmhhcyxtPWguc2V0O249ZnVuY3Rpb24oZSx0KXttLmNhbGwoaCxlLHQpO3JldHVybiB0fTtpPWZ1bmN0aW9uKGUpe3JldHVybiBnLmNhbGwoaCxlKXx8e319O289ZnVuY3Rpb24oZSl7cmV0dXJuIHYuY2FsbChoLGUpfX1lbHNle3ZhciB5PWwoInN0YXRlIik7cFt5XT0hMDtuPWZ1bmN0aW9uKGUsdCl7dShlLHksdCk7cmV0dXJuIHR9O2k9ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSx5KT9lW3ldOnt9fTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmKGUseSl9fWUuZXhwb3J0cz17c2V0Om4sZ2V0OmksaGFzOm8sZW5mb3JjZTpmdW5jdGlvbihlKXtyZXR1cm4gbyhlKT9pKGUpOm4oZSx7fSl9LGdldHRlckZvcjpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI7aWYoIWModCl8fChyPWkodCkpLnR5cGUhPT1lKXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK2UrIiByZXF1aXJlZCIpO3JldHVybiByfX19fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig3KSxpPXIoMjcpLG89bi5XZWFrTWFwO2UuZXhwb3J0cz0iZnVuY3Rpb24iPT10eXBlb2YgbyYmL25hdGl2ZSBjb2RlLy50ZXN0KGkobykpfSxmdW5jdGlvbihlLHQscil7dmFyIG49cigzMiksaT1yKDM0KSxvPW4oImtleXMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG9bZV18fChvW2VdPWkoZSkpfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMzMpLGk9cigyOCk7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBpW2VdfHwoaVtlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy42LjUiLG1vZGU6bj8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDIwIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz0hMX0sZnVuY3Rpb24oZSx0KXt2YXIgcj0wLG49TWF0aC5yYW5kb20oKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIlN5bWJvbCgiK1N0cmluZyh2b2lkIDA9PT1lPyIiOmUpKyIpXyIrKCsrcituKS50b1N0cmluZygzNil9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17fX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMTkpLGk9cigzNyksbz1yKDgpLGE9cigyMyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPWkodCkscz1hLmYsYz1vLmYsdT0wO3U8ci5sZW5ndGg7dSsrKXt2YXIgZj1yW3VdO24oZSxmKXx8cyhlLGYsYyh0LGYpKX19fSxmdW5jdGlvbihlLHQscil7dmFyIG49cigzOCksaT1yKDQwKSxvPXIoNDcpLGE9cigyNCk7ZS5leHBvcnRzPW4oIlJlZmxlY3QiLCJvd25LZXlzIil8fGZ1bmN0aW9uIG93bktleXMoZSl7dmFyIHQ9aS5mKGEoZSkpLHI9by5mO3JldHVybiByP3QuY29uY2F0KHIoZSkpOnR9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cigzOSksaT1yKDcpLGFGdW5jdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnZvaWQgMH07ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9hRnVuY3Rpb24obltlXSl8fGFGdW5jdGlvbihpW2VdKTpuW2VdJiZuW2VdW3RdfHxpW2VdJiZpW2VdW3RdfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNyk7ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDQxKSxpPXIoNDYpLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7dC5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGUpe3JldHVybiBuKGUsaSl9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxOSksaT1yKDEzKSxvPXIoNDIpLmluZGV4T2YsYT1yKDM1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcixzPWkoZSksYz0wLHU9W107Zm9yKHIgaW4gcykhbihhLHIpJiZuKHMscikmJnUucHVzaChyKTtmb3IoO3QubGVuZ3RoPmM7KW4ocyxyPXRbYysrXSkmJih+byh1LHIpfHx1LnB1c2gocikpO3JldHVybiB1fX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMTMpLGk9cig0Myksbz1yKDQ1KSxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixhKXt2YXIgcyxjPW4odCksdT1pKGMubGVuZ3RoKSxmPW8oYSx1KTtpZihlJiZyIT1yKXtmb3IoO3U+ZjspaWYoKHM9Y1tmKytdKSE9cylyZXR1cm4hMH1lbHNlIGZvcig7dT5mO2YrKylpZigoZXx8ZiBpbiBjKSYmY1tmXT09PXIpcmV0dXJuIGV8fGZ8fDA7cmV0dXJuIWUmJi0xfX07ZS5leHBvcnRzPXtpbmNsdWRlczpjcmVhdGVNZXRob2QoITApLGluZGV4T2Y6Y3JlYXRlTWV0aG9kKCExKX19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDQ0KSxpPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT4wP2kobihlKSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24oZSx0KXt2YXIgcj1NYXRoLmNlaWwsbj1NYXRoLmZsb29yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZT0rZSk/MDooZT4wP246cikoZSl9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig0NCksaT1NYXRoLm1heCxvPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPW4oZSk7cmV0dXJuIHI8MD9pKHIrdCwwKTpvKHIsdCl9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1bImNvbnN0cnVjdG9yIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b0xvY2FsZVN0cmluZyIsInRvU3RyaW5nIiwidmFsdWVPZiJdfSxmdW5jdGlvbihlLHQpe3QuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxMCksaT0vI3xcLnByb3RvdHlwZVwuLyxpc0ZvcmNlZD1mdW5jdGlvbihlLHQpe3ZhciByPWFbbyhlKV07cmV0dXJuIHI9PWN8fHIhPXMmJigiZnVuY3Rpb24iPT10eXBlb2YgdD9uKHQpOiEhdCl9LG89aXNGb3JjZWQubm9ybWFsaXplPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZShpLCIuIikudG9Mb3dlckNhc2UoKX0sYT1pc0ZvcmNlZC5kYXRhPXt9LHM9aXNGb3JjZWQuTkFUSVZFPSJOIixjPWlzRm9yY2VkLlBPTFlGSUxMPSJQIjtlLmV4cG9ydHM9aXNGb3JjZWR9LGZ1bmN0aW9uKGUsdCxyKXtyKDUwKTt2YXIgbj1yKDU3KTtlLmV4cG9ydHM9bigiU3RyaW5nIiwic3RhcnRzV2l0aCIpfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuLGk9cig2KSxvPXIoOCkuZixhPXIoNDMpLHM9cig1MSksYz1yKDE2KSx1PXIoNTYpLGY9cigzMyksbD0iIi5zdGFydHNXaXRoLHA9TWF0aC5taW4sZD11KCJzdGFydHNXaXRoIik7aSh7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohKCFmJiYhZCYmISEobj1vKFN0cmluZy5wcm90b3R5cGUsInN0YXJ0c1dpdGgiKSxuJiYhbi53cml0YWJsZSkpJiYhZH0se3N0YXJ0c1dpdGg6ZnVuY3Rpb24gc3RhcnRzV2l0aChlKXt2YXIgdD1TdHJpbmcoYyh0aGlzKSk7cyhlKTt2YXIgcj1hKHAoYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsdC5sZW5ndGgpKSxuPVN0cmluZyhlKTtyZXR1cm4gbD9sLmNhbGwodCxuLHIpOnQuc2xpY2UocixyK24ubGVuZ3RoKT09PW59fSl9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDUyKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSl0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMTgpLGk9cigxNSksbz1yKDUzKSgibWF0Y2giKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIG4oZSkmJih2b2lkIDAhPT0odD1lW29dKT8hIXQ6IlJlZ0V4cCI9PWkoZSkpfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNyksaT1yKDMyKSxvPXIoMTkpLGE9cigzNCkscz1yKDU0KSxjPXIoNTUpLHU9aSgid2tzIiksZj1uLlN5bWJvbCxsPWM/ZjpmJiZmLndpdGhvdXRTZXR0ZXJ8fGE7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe28odSxlKXx8KHMmJm8oZixlKT91W2VdPWZbZV06dVtlXT1sKCJTeW1ib2wuIitlKSk7cmV0dXJuIHVbZV19fSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxMCk7ZS5leHBvcnRzPSEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmIW4oKGZ1bmN0aW9uKCl7cmV0dXJuIVN0cmluZyhTeW1ib2woKSl9KSl9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDU0KTtlLmV4cG9ydHM9biYmIVN5bWJvbC5zaGFtJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcn0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNTMpKCJtYXRjaCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD0vLi87dHJ5eyIvLi8iW2VdKHQpfWNhdGNoKHIpe3RyeXt0W25dPSExO3JldHVybiIvLi8iW2VdKHQpfWNhdGNoKGUpe319cmV0dXJuITF9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig3KSxpPXIoNTgpLG89RnVuY3Rpb24uY2FsbDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBpKG8sbltlXS5wcm90b3R5cGVbdF0scil9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig1OSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtuKGUpO2lmKHZvaWQgMD09PXQpcmV0dXJuIGU7c3dpdGNoKHIpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHQpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBlLmNhbGwodCxyKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiBlLmNhbGwodCxyLG4pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsbixpKXtyZXR1cm4gZS5jYWxsKHQscixuLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0LGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyhlKSsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQscil7cig2MSk7dmFyIG49cig1Nyk7ZS5leHBvcnRzPW4oIlN0cmluZyIsImVuZHNXaXRoIil9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG4saT1yKDYpLG89cig4KS5mLGE9cig0Mykscz1yKDUxKSxjPXIoMTYpLHU9cig1NiksZj1yKDMzKSxsPSIiLmVuZHNXaXRoLHA9TWF0aC5taW4sZD11KCJlbmRzV2l0aCIpO2koe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6ISghZiYmIWQmJiEhKG49byhTdHJpbmcucHJvdG90eXBlLCJlbmRzV2l0aCIpLG4mJiFuLndyaXRhYmxlKSkmJiFkfSx7ZW5kc1dpdGg6ZnVuY3Rpb24gZW5kc1dpdGgoZSl7dmFyIHQ9U3RyaW5nKGModGhpcykpO3MoZSk7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsbj1hKHQubGVuZ3RoKSxpPXZvaWQgMD09PXI/bjpwKGEociksbiksbz1TdHJpbmcoZSk7cmV0dXJuIGw/bC5jYWxsKHQsbyxpKTp0LnNsaWNlKGktby5sZW5ndGgsaSk9PT1vfX0pfSxmdW5jdGlvbihlLHQscil7cig2Myk7dmFyIG49cig1Nyk7ZS5leHBvcnRzPW4oIlN0cmluZyIsImluY2x1ZGVzIil9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2KSxpPXIoNTEpLG89cigxNik7bih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohcig1NikoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyhlKXtyZXR1cm4hIX5TdHJpbmcobyh0aGlzKSkuaW5kZXhPZihpKGUpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24oZSx0LHIpe3IoNjUpO3ZhciBuPXIoNTcpO2UuZXhwb3J0cz1uKCJBcnJheSIsImluY2x1ZGVzIil9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2KSxpPXIoNDIpLmluY2x1ZGVzLG89cig2Nik7bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFyKDcxKSgiaW5kZXhPZiIse0FDQ0VTU09SUzohMCwxOjB9KX0se2luY2x1ZGVzOmZ1bmN0aW9uIGluY2x1ZGVzKGUpe3JldHVybiBpKHRoaXMsZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSk7bygiaW5jbHVkZXMiKX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNTMpLGk9cig2Nyksbz1yKDIzKSxhPW4oInVuc2NvcGFibGVzIikscz1BcnJheS5wcm90b3R5cGU7bnVsbD09c1thXSYmby5mKHMsYSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmkobnVsbCl9KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7c1thXVtlXT0hMH19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbixpPXIoMjQpLG89cig2OCksYT1yKDQ2KSxzPXIoMzUpLGM9cig3MCksdT1yKDIxKSxmPXIoMzEpLGw9ZigiSUVfUFJPVE8iKSxFbXB0eUNvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7fSxzY3JpcHRUYWc9ZnVuY3Rpb24oZSl7cmV0dXJuIjxzY3JpcHQ+IitlKyI8XC9zY3JpcHQ+In0sTnVsbFByb3RvT2JqZWN0PWZ1bmN0aW9uKCl7dHJ5e249ZG9jdW1lbnQuZG9tYWluJiZuZXcgQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKX1jYXRjaChlKXt9TnVsbFByb3RvT2JqZWN0PW4/ZnVuY3Rpb24oZSl7ZS53cml0ZShzY3JpcHRUYWcoIiIpKTtlLmNsb3NlKCk7dmFyIHQ9ZS5wYXJlbnRXaW5kb3cuT2JqZWN0O2U9bnVsbDtyZXR1cm4gdH0obik6ZnVuY3Rpb24oKXt2YXIgZSx0PXUoImlmcmFtZSIpO3Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Yy5hcHBlbmRDaGlsZCh0KTt0LnNyYz1TdHJpbmcoImphdmFzY3JpcHQ6Iik7KGU9dC5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCk7ZS53cml0ZShzY3JpcHRUYWcoImRvY3VtZW50LkY9T2JqZWN0IikpO2UuY2xvc2UoKTtyZXR1cm4gZS5GfSgpO2Zvcih2YXIgZT1hLmxlbmd0aDtlLS07KWRlbGV0ZSBOdWxsUHJvdG9PYmplY3QucHJvdG90eXBlW2FbZV1dO3JldHVybiBOdWxsUHJvdG9PYmplY3QoKX07c1tsXT0hMDtlLmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24gY3JlYXRlKGUsdCl7dmFyIHI7aWYobnVsbCE9PWUpe0VtcHR5Q29uc3RydWN0b3IucHJvdG90eXBlPWkoZSk7cj1uZXcgRW1wdHlDb25zdHJ1Y3RvcjtFbXB0eUNvbnN0cnVjdG9yLnByb3RvdHlwZT1udWxsO3JbbF09ZX1lbHNlIHI9TnVsbFByb3RvT2JqZWN0KCk7cmV0dXJuIHZvaWQgMD09PXQ/cjpvKHIsdCl9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig5KSxpPXIoMjMpLG89cigyNCksYT1yKDY5KTtlLmV4cG9ydHM9bj9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGUsdCl7byhlKTtmb3IodmFyIHIsbj1hKHQpLHM9bi5sZW5ndGgsYz0wO3M+YzspaS5mKGUscj1uW2MrK10sdFtyXSk7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig0MSksaT1yKDQ2KTtlLmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uIGtleXMoZSl7cmV0dXJuIG4oZSxpKX19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDM4KTtlLmV4cG9ydHM9bigiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiKX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoOSksaT1yKDEwKSxvPXIoMTkpLGE9T2JqZWN0LmRlZmluZVByb3BlcnR5LHM9e30sdGhyb3dlcj1mdW5jdGlvbihlKXt0aHJvdyBlfTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihvKHMsZSkpcmV0dXJuIHNbZV07dHx8KHQ9e30pO3ZhciByPVtdW2VdLGM9ISFvKHQsIkFDQ0VTU09SUyIpJiZ0LkFDQ0VTU09SUyx1PW8odCwwKT90WzBdOnRocm93ZXIsZj1vKHQsMSk/dFsxXTp2b2lkIDA7cmV0dXJuIHNbZV09ISFyJiYhaSgoZnVuY3Rpb24oKXtpZihjJiYhbilyZXR1cm4hMDt2YXIgZT17bGVuZ3RoOi0xfTtjP2EoZSwxLHtlbnVtZXJhYmxlOiEwLGdldDp0aHJvd2VyfSk6ZVsxXT0xO3IuY2FsbChlLHUsZil9KSl9fSxmdW5jdGlvbihlLHQscil7cig3Myk7cig4NSk7dmFyIG49cigzOSk7ZS5leHBvcnRzPW4uQXJyYXkuZnJvbX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDc0KS5jaGFyQXQsaT1yKDI5KSxvPXIoNzUpLGE9aS5zZXQscz1pLmdldHRlckZvcigiU3RyaW5nIEl0ZXJhdG9yIik7byhTdHJpbmcsIlN0cmluZyIsKGZ1bmN0aW9uKGUpe2EodGhpcyx7dHlwZToiU3RyaW5nIEl0ZXJhdG9yIixzdHJpbmc6U3RyaW5nKGUpLGluZGV4OjB9KX0pLChmdW5jdGlvbiBuZXh0KCl7dmFyIGUsdD1zKHRoaXMpLHI9dC5zdHJpbmcsaT10LmluZGV4O2lmKGk+PXIubGVuZ3RoKXJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH07ZT1uKHIsaSk7dC5pbmRleCs9ZS5sZW5ndGg7cmV0dXJue3ZhbHVlOmUsZG9uZTohMX19KSl9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDQ0KSxpPXIoMTYpLGNyZWF0ZU1ldGhvZD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyKXt2YXIgbyxhLHM9U3RyaW5nKGkodCkpLGM9bihyKSx1PXMubGVuZ3RoO3JldHVybiBjPDB8fGM+PXU/ZT8iIjp2b2lkIDA6KG89cy5jaGFyQ29kZUF0KGMpKTw1NTI5Nnx8bz41NjMxOXx8YysxPT09dXx8KGE9cy5jaGFyQ29kZUF0KGMrMSkpPDU2MzIwfHxhPjU3MzQzP2U/cy5jaGFyQXQoYyk6bzplP3Muc2xpY2UoYyxjKzIpOmEtNTYzMjArKG8tNTUyOTY8PDEwKSs2NTUzNn19O2UuZXhwb3J0cz17Y29kZUF0OmNyZWF0ZU1ldGhvZCghMSksY2hhckF0OmNyZWF0ZU1ldGhvZCghMCl9fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNiksaT1yKDc2KSxvPXIoNzgpLGE9cig4Mykscz1yKDgxKSxjPXIoMjIpLHU9cigyNSksZj1yKDUzKSxsPXIoMzMpLHA9cig4MiksZD1yKDc3KSxoPWQuSXRlcmF0b3JQcm90b3R5cGUsZz1kLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlMsdj1mKCJpdGVyYXRvciIpLHJldHVyblRoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLGYsZCxtLHkpe2kocix0LGYpO3ZhciBiLHgsdyxnZXRJdGVyYXRpb25NZXRob2Q9ZnVuY3Rpb24oZSl7aWYoZT09PWQmJkMpcmV0dXJuIEM7aWYoIWcmJmUgaW4gVClyZXR1cm4gVFtlXTtzd2l0Y2goZSl7Y2FzZSJrZXlzIjpyZXR1cm4gZnVuY3Rpb24ga2V5cygpe3JldHVybiBuZXcgcih0aGlzLGUpfTtjYXNlInZhbHVlcyI6cmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpe3JldHVybiBuZXcgcih0aGlzLGUpfTtjYXNlImVudHJpZXMiOnJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7cmV0dXJuIG5ldyByKHRoaXMsZSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcih0aGlzKX19LFM9dCsiIEl0ZXJhdG9yIixfPSExLFQ9ZS5wcm90b3R5cGUsUD1UW3ZdfHxUWyJAQGl0ZXJhdG9yIl18fGQmJlRbZF0sQz0hZyYmUHx8Z2V0SXRlcmF0aW9uTWV0aG9kKGQpLGs9IkFycmF5Ij09dCYmVC5lbnRyaWVzfHxQO2lmKGspe2I9byhrLmNhbGwobmV3IGUpKTtpZihoIT09T2JqZWN0LnByb3RvdHlwZSYmYi5uZXh0KXtsfHxvKGIpPT09aHx8KGE/YShiLGgpOiJmdW5jdGlvbiIhPXR5cGVvZiBiW3ZdJiZjKGIsdixyZXR1cm5UaGlzKSk7cyhiLFMsITAsITApO2wmJihwW1NdPXJldHVyblRoaXMpfX1pZigidmFsdWVzIj09ZCYmUCYmInZhbHVlcyIhPT1QLm5hbWUpe189ITA7Qz1mdW5jdGlvbiB2YWx1ZXMoKXtyZXR1cm4gUC5jYWxsKHRoaXMpfX1sJiYheXx8VFt2XT09PUN8fGMoVCx2LEMpO3BbdF09QztpZihkKXt4PXt2YWx1ZXM6Z2V0SXRlcmF0aW9uTWV0aG9kKCJ2YWx1ZXMiKSxrZXlzOm0/QzpnZXRJdGVyYXRpb25NZXRob2QoImtleXMiKSxlbnRyaWVzOmdldEl0ZXJhdGlvbk1ldGhvZCgiZW50cmllcyIpfTtpZih5KWZvcih3IGluIHgpKGd8fF98fCEodyBpbiBUKSkmJnUoVCx3LHhbd10pO2Vsc2Ugbih7dGFyZ2V0OnQscHJvdG86ITAsZm9yY2VkOmd8fF99LHgpfXJldHVybiB4fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDc3KS5JdGVyYXRvclByb3RvdHlwZSxpPXIoNjcpLG89cigxMiksYT1yKDgxKSxzPXIoODIpLHJldHVyblRoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXt2YXIgYz10KyIgSXRlcmF0b3IiO2UucHJvdG90eXBlPWkobix7bmV4dDpvKDEscil9KTthKGUsYywhMSwhMCk7c1tjXT1yZXR1cm5UaGlzO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbixpLG8sYT1yKDc4KSxzPXIoMjIpLGM9cigxOSksdT1yKDUzKSxmPXIoMzMpLGw9dSgiaXRlcmF0b3IiKSxwPSExO1tdLmtleXMmJigibmV4dCJpbihvPVtdLmtleXMoKSk/KGk9YShhKG8pKSkhPT1PYmplY3QucHJvdG90eXBlJiYobj1pKTpwPSEwKTtudWxsPT1uJiYobj17fSk7Znx8YyhuLGwpfHxzKG4sbCwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKTtlLmV4cG9ydHM9e0l0ZXJhdG9yUHJvdG90eXBlOm4sQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpwfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMTkpLGk9cig3OSksbz1yKDMxKSxhPXIoODApLHM9bygiSUVfUFJPVE8iKSxjPU9iamVjdC5wcm90b3R5cGU7ZS5leHBvcnRzPWE/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKGUpe2U9aShlKTtyZXR1cm4gbihlLHMpP2Vbc106ImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3ImJmUgaW5zdGFuY2VvZiBlLmNvbnN0cnVjdG9yP2UuY29uc3RydWN0b3IucHJvdG90eXBlOmUgaW5zdGFuY2VvZiBPYmplY3Q/YzpudWxsfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMTYpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KG4oZSkpfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMTApO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXtmdW5jdGlvbiBGKCl7fUYucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGw7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRikhPT1GLnByb3RvdHlwZX0pKX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMjMpLmYsaT1yKDE5KSxvPXIoNTMpKCJ0b1N0cmluZ1RhZyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7ZSYmIWkoZT1yP2U6ZS5wcm90b3R5cGUsbykmJm4oZSxvLHtjb25maWd1cmFibGU6ITAsdmFsdWU6dH0pfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e319LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDI0KSxpPXIoODQpO2UuZXhwb3J0cz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fCgiX19wcm90b19fImlue30/ZnVuY3Rpb24oKXt2YXIgZSx0PSExLHI9e307dHJ5eyhlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwiX19wcm90b19fIikuc2V0KS5jYWxsKHIsW10pO3Q9ciBpbnN0YW5jZW9mIEFycmF5fWNhdGNoKGUpe31yZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YocixvKXtuKHIpO2kobyk7dD9lLmNhbGwocixvKTpyLl9fcHJvdG9fXz1vO3JldHVybiByfX0oKTp2b2lkIDApfSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCFuKGUpJiZudWxsIT09ZSl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IHNldCAiK1N0cmluZyhlKSsiIGFzIGEgcHJvdG90eXBlIik7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig2KSxpPXIoODYpO24oe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITAsZm9yY2VkOiFyKDkzKSgoZnVuY3Rpb24oZSl7QXJyYXkuZnJvbShlKX0pKX0se2Zyb206aX0pfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTgpLGk9cig3OSksbz1yKDg3KSxhPXIoODgpLHM9cig0MyksYz1yKDg5KSx1PXIoOTApO2UuZXhwb3J0cz1mdW5jdGlvbiBmcm9tKGUpe3ZhciB0LHIsZixsLHAsZCxoPWkoZSksZz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LHY9YXJndW1lbnRzLmxlbmd0aCxtPXY+MT9hcmd1bWVudHNbMV06dm9pZCAwLHk9dm9pZCAwIT09bSxiPXUoaCkseD0wO3kmJihtPW4obSx2PjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSk7aWYobnVsbD09Ynx8Zz09QXJyYXkmJmEoYikpe3I9bmV3IGcodD1zKGgubGVuZ3RoKSk7Zm9yKDt0Png7eCsrKXtkPXk/bShoW3hdLHgpOmhbeF07YyhyLHgsZCl9fWVsc2V7cD0obD1iLmNhbGwoaCkpLm5leHQ7cj1uZXcgZztmb3IoOyEoZj1wLmNhbGwobCkpLmRvbmU7eCsrKXtkPXk/byhsLG0sW2YudmFsdWUseF0sITApOmYudmFsdWU7YyhyLHgsZCl9fXIubGVuZ3RoPXg7cmV0dXJuIHJ9fSxmdW5jdGlvbihlLHQscil7dmFyIG49cigyNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLGkpe3RyeXtyZXR1cm4gaT90KG4ocilbMF0sclsxXSk6dChyKX1jYXRjaCh0KXt2YXIgbz1lLnJldHVybjt2b2lkIDAhPT1vJiZuKG8uY2FsbChlKSk7dGhyb3cgdH19fSxmdW5jdGlvbihlLHQscil7dmFyIG49cig1MyksaT1yKDgyKSxvPW4oIml0ZXJhdG9yIiksYT1BcnJheS5wcm90b3R5cGU7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lJiYoaS5BcnJheT09PWV8fGFbb109PT1lKX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cigxNyksaT1yKDIzKSxvPXIoMTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dmFyIGE9bih0KTthIGluIGU/aS5mKGUsYSxvKDAscikpOmVbYV09cn19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDkxKSxpPXIoODIpLG89cig1MykoIml0ZXJhdG9yIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUpcmV0dXJuIGVbb118fGVbIkBAaXRlcmF0b3IiXXx8aVtuKGUpXX19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDkyKSxpPXIoMTUpLG89cig1MykoInRvU3RyaW5nVGFnIiksYT0iQXJndW1lbnRzIj09aShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpO2UuZXhwb3J0cz1uP2k6ZnVuY3Rpb24oZSl7dmFyIHQscixuO3JldHVybiB2b2lkIDA9PT1lPyJVbmRlZmluZWQiOm51bGw9PT1lPyJOdWxsIjoic3RyaW5nIj09dHlwZW9mKHI9ZnVuY3Rpb24oZSx0KXt0cnl7cmV0dXJuIGVbdF19Y2F0Y2goZSl7fX0odD1PYmplY3QoZSksbykpP3I6YT9pKHQpOiJPYmplY3QiPT0obj1pKHQpKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY2FsbGVlPyJBcmd1bWVudHMiOm59fSxmdW5jdGlvbihlLHQscil7dmFyIG49e307bltyKDUzKSgidG9TdHJpbmdUYWciKV09InoiO2UuZXhwb3J0cz0iW29iamVjdCB6XSI9PT1TdHJpbmcobil9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDUzKSgiaXRlcmF0b3IiKSxpPSExO3RyeXt2YXIgbz0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIW8rK319LHJldHVybjpmdW5jdGlvbigpe2k9ITB9fTthW25dPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O0FycmF5LmZyb20oYSwoZnVuY3Rpb24oKXt0aHJvdyAyfSkpfWNhdGNoKGUpe31lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighdCYmIWkpcmV0dXJuITE7dmFyIHI9ITE7dHJ5e3ZhciBvPXt9O29bbl09ZnVuY3Rpb24oKXtyZXR1cm57bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOnI9ITB9fX19O2Uobyl9Y2F0Y2goZSl7fXJldHVybiByfX0sZnVuY3Rpb24oZSx0LHIpe3IoOTUpO3ZhciBuPXIoMzkpO2UuZXhwb3J0cz1uLk9iamVjdC5hc3NpZ259LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDYpLGk9cig5Nik7bih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOk9iamVjdC5hc3NpZ24hPT1pfSx7YXNzaWduOml9KX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDkpLGk9cigxMCksbz1yKDY5KSxhPXIoNDcpLHM9cigxMSksYz1yKDc5KSx1PXIoMTQpLGY9T2JqZWN0LmFzc2lnbixsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmV4cG9ydHM9IWZ8fGkoKGZ1bmN0aW9uKCl7aWYobiYmMSE9PWYoe2I6MX0sZihsKHt9LCJhIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtsKHRoaXMsImIiLHt2YWx1ZTozLGVudW1lcmFibGU6ITF9KX19KSx7YjoyfSkpLmIpcmV0dXJuITA7dmFyIGU9e30sdD17fSxyPVN5bWJvbCgpO2Vbcl09NzsiYWJjZGVmZ2hpamtsbW5vcHFyc3QiLnNwbGl0KCIiKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0W2VdPWV9KSk7cmV0dXJuIDchPWYoe30sZSlbcl18fCJhYmNkZWZnaGlqa2xtbm9wcXJzdCIhPW8oZih7fSx0KSkuam9pbigiIil9KSk/ZnVuY3Rpb24gYXNzaWduKGUsdCl7Zm9yKHZhciByPWMoZSksaT1hcmd1bWVudHMubGVuZ3RoLGY9MSxsPWEuZixwPXMuZjtpPmY7KWZvcih2YXIgZCxoPXUoYXJndW1lbnRzW2YrK10pLGc9bD9vKGgpLmNvbmNhdChsKGgpKTpvKGgpLHY9Zy5sZW5ndGgsbT0wO3Y+bTspe2Q9Z1ttKytdO24mJiFwLmNhbGwoaCxkKXx8KHJbZF09aFtkXSl9cmV0dXJuIHJ9OmZ9LGZ1bmN0aW9uKGUsdCxyKXtyKDk4KTtyKDk5KTt2YXIgbj1yKDM5KTtlLmV4cG9ydHM9bi5PYmplY3QuZnJvbUVudHJpZXN9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cigxMyksaT1yKDY2KSxvPXIoODIpLGE9cigyOSkscz1yKDc1KSxjPWEuc2V0LHU9YS5nZXR0ZXJGb3IoIkFycmF5IEl0ZXJhdG9yIik7ZS5leHBvcnRzPXMoQXJyYXksIkFycmF5IiwoZnVuY3Rpb24oZSx0KXtjKHRoaXMse3R5cGU6IkFycmF5IEl0ZXJhdG9yIix0YXJnZXQ6bihlKSxpbmRleDowLGtpbmQ6dH0pfSksKGZ1bmN0aW9uKCl7dmFyIGU9dSh0aGlzKSx0PWUudGFyZ2V0LHI9ZS5raW5kLG49ZS5pbmRleCsrO2lmKCF0fHxuPj10Lmxlbmd0aCl7ZS50YXJnZXQ9dm9pZCAwO3JldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19cmV0dXJuImtleXMiPT1yP3t2YWx1ZTpuLGRvbmU6ITF9OiJ2YWx1ZXMiPT1yP3t2YWx1ZTp0W25dLGRvbmU6ITF9Ont2YWx1ZTpbbix0W25dXSxkb25lOiExfX0pLCJ2YWx1ZXMiKTtvLkFyZ3VtZW50cz1vLkFycmF5O2koImtleXMiKTtpKCJ2YWx1ZXMiKTtpKCJlbnRyaWVzIil9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDYpLGk9cigxMDApLG89cig4OSk7bih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtmcm9tRW50cmllczpmdW5jdGlvbiBmcm9tRW50cmllcyhlKXt2YXIgdD17fTtpKGUsKGZ1bmN0aW9uKGUscil7byh0LGUscil9KSx2b2lkIDAsITApO3JldHVybiB0fX0pfSxmdW5jdGlvbihlLHQscil7dmFyIG49cigyNCksaT1yKDg4KSxvPXIoNDMpLGE9cig1OCkscz1yKDkwKSxjPXIoODcpLFJlc3VsdD1mdW5jdGlvbihlLHQpe3RoaXMuc3RvcHBlZD1lO3RoaXMucmVzdWx0PXR9OyhlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIsdSxmKXt2YXIgbCxwLGQsaCxnLHYsbSx5PWEodCxyLHU/MjoxKTtpZihmKWw9ZTtlbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZihwPXMoZSkpKXRocm93IFR5cGVFcnJvcigiVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSIpO2lmKGkocCkpe2ZvcihkPTAsaD1vKGUubGVuZ3RoKTtoPmQ7ZCsrKWlmKChnPXU/eShuKG09ZVtkXSlbMF0sbVsxXSk6eShlW2RdKSkmJmcgaW5zdGFuY2VvZiBSZXN1bHQpcmV0dXJuIGc7cmV0dXJuIG5ldyBSZXN1bHQoITEpfWw9cC5jYWxsKGUpfXY9bC5uZXh0O2Zvcig7IShtPXYuY2FsbChsKSkuZG9uZTspaWYoIm9iamVjdCI9PXR5cGVvZihnPWMobCx5LG0udmFsdWUsdSkpJiZnJiZnIGluc3RhbmNlb2YgUmVzdWx0KXJldHVybiBnO3JldHVybiBuZXcgUmVzdWx0KCExKX0pLnN0b3A9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBSZXN1bHQoITAsZSl9fSxmdW5jdGlvbihlLHQscil7cigxMDIpO3ZhciBuPXIoMzkpO2UuZXhwb3J0cz1uLk1hdGgubG9nMn0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNiksaT1NYXRoLmxvZyxvPU1hdGguTE4yO24oe3RhcmdldDoiTWF0aCIsc3RhdDohMH0se2xvZzI6ZnVuY3Rpb24gbG9nMihlKXtyZXR1cm4gaShlKS9vfX0pfSxmdW5jdGlvbihlLHQscil7cigxMDQpO3ZhciBuPXIoMzkpO2UuZXhwb3J0cz1uLk51bWJlci5pc05hTn0sZnVuY3Rpb24oZSx0LHIpe3IoNikoe3RhcmdldDoiTnVtYmVyIixzdGF0OiEwfSx7aXNOYU46ZnVuY3Rpb24gaXNOYU4oZSl7cmV0dXJuIGUhPWV9fSl9LGZ1bmN0aW9uKGUsdCxyKXtyKDEwNik7dmFyIG49cigzOSk7ZS5leHBvcnRzPW4uTnVtYmVyLmlzSW50ZWdlcn0sZnVuY3Rpb24oZSx0LHIpe3IoNikoe3RhcmdldDoiTnVtYmVyIixzdGF0OiEwfSx7aXNJbnRlZ2VyOnIoMTA3KX0pfSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxOCksaT1NYXRoLmZsb29yO2UuZXhwb3J0cz1mdW5jdGlvbiBpc0ludGVnZXIoZSl7cmV0dXJuIW4oZSkmJmlzRmluaXRlKGUpJiZpKGUpPT09ZX19LGZ1bmN0aW9uKGUsdCxyKXtyKDEwOSl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cigxMTApLGk9cigxMTIpLG89cigxMCksYT1uLmFUeXBlZEFycmF5LHM9bi5hVHlwZWRBcnJheUNvbnN0cnVjdG9yLGM9bi5leHBvcnRUeXBlZEFycmF5TWV0aG9kLHU9W10uc2xpY2U7Yygic2xpY2UiLChmdW5jdGlvbiBzbGljZShlLHQpe2Zvcih2YXIgcj11LmNhbGwoYSh0aGlzKSxlLHQpLG49aSh0aGlzLHRoaXMuY29uc3RydWN0b3IpLG89MCxjPXIubGVuZ3RoLGY9bmV3KHMobikpKGMpO2M+bzspZltvXT1yW28rK107cmV0dXJuIGZ9KSxvKChmdW5jdGlvbigpe25ldyBJbnQ4QXJyYXkoMSkuc2xpY2UoKX0pKSl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG4saT1yKDExMSksbz1yKDkpLGE9cig3KSxzPXIoMTgpLGM9cigxOSksdT1yKDkxKSxmPXIoMjIpLGw9cigyNSkscD1yKDIzKS5mLGQ9cig3OCksaD1yKDgzKSxnPXIoNTMpLHY9cigzNCksbT1hLkludDhBcnJheSx5PW0mJm0ucHJvdG90eXBlLGI9YS5VaW50OENsYW1wZWRBcnJheSx4PWImJmIucHJvdG90eXBlLHc9bSYmZChtKSxTPXkmJmQoeSksXz1PYmplY3QucHJvdG90eXBlLFQ9Xy5pc1Byb3RvdHlwZU9mLFA9ZygidG9TdHJpbmdUYWciKSxDPXYoIlRZUEVEX0FSUkFZX1RBRyIpLGs9aSYmISFoJiYiT3BlcmEiIT09dShhLm9wZXJhKSxJPSExLE89e0ludDhBcnJheToxLFVpbnQ4QXJyYXk6MSxVaW50OENsYW1wZWRBcnJheToxLEludDE2QXJyYXk6MixVaW50MTZBcnJheToyLEludDMyQXJyYXk6NCxVaW50MzJBcnJheTo0LEZsb2F0MzJBcnJheTo0LEZsb2F0NjRBcnJheTo4fSxpc1R5cGVkQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZSkmJmMoTyx1KGUpKX07Zm9yKG4gaW4gTylhW25dfHwoaz0hMSk7aWYoIWt8fCJmdW5jdGlvbiIhPXR5cGVvZiB3fHx3PT09RnVuY3Rpb24ucHJvdG90eXBlKXt3PWZ1bmN0aW9uIFR5cGVkQXJyYXkoKXt0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCBpbnZvY2F0aW9uIil9O2lmKGspZm9yKG4gaW4gTylhW25dJiZoKGFbbl0sdyl9aWYoIWt8fCFTfHxTPT09Xyl7Uz13LnByb3RvdHlwZTtpZihrKWZvcihuIGluIE8pYVtuXSYmaChhW25dLnByb3RvdHlwZSxTKX1rJiZkKHgpIT09UyYmaCh4LFMpO2lmKG8mJiFjKFMsUCkpe0k9ITA7cChTLFAse2dldDpmdW5jdGlvbigpe3JldHVybiBzKHRoaXMpP3RoaXNbQ106dm9pZCAwfX0pO2ZvcihuIGluIE8pYVtuXSYmZihhW25dLEMsbil9ZS5leHBvcnRzPXtOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOmssVFlQRURfQVJSQVlfVEFHOkkmJkMsYVR5cGVkQXJyYXk6ZnVuY3Rpb24oZSl7aWYoaXNUeXBlZEFycmF5KGUpKXJldHVybiBlO3Rocm93IFR5cGVFcnJvcigiVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Iil9LGFUeXBlZEFycmF5Q29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7aWYoaCl7aWYoVC5jYWxsKHcsZSkpcmV0dXJuIGV9ZWxzZSBmb3IodmFyIHQgaW4gTylpZihjKE8sbikpe3ZhciByPWFbdF07aWYociYmKGU9PT1yfHxULmNhbGwocixlKSkpcmV0dXJuIGV9dGhyb3cgVHlwZUVycm9yKCJUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IiKX0sZXhwb3J0VHlwZWRBcnJheU1ldGhvZDpmdW5jdGlvbihlLHQscil7aWYobyl7aWYocilmb3IodmFyIG4gaW4gTyl7dmFyIGk9YVtuXTtpJiZjKGkucHJvdG90eXBlLGUpJiZkZWxldGUgaS5wcm90b3R5cGVbZV19U1tlXSYmIXJ8fGwoUyxlLHI/dDprJiZ5W2VdfHx0KX19LGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGk7aWYobyl7aWYoaCl7aWYocilmb3IobiBpbiBPKShpPWFbbl0pJiZjKGksZSkmJmRlbGV0ZSBpW2VdO2lmKHdbZV0mJiFyKXJldHVybjt0cnl7cmV0dXJuIGwodyxlLHI/dDprJiZtW2VdfHx0KX1jYXRjaChlKXt9fWZvcihuIGluIE8pIShpPWFbbl0pfHxpW2VdJiYhcnx8bChpLGUsdCl9fSxpc1ZpZXc6ZnVuY3Rpb24gaXNWaWV3KGUpe3ZhciB0PXUoZSk7cmV0dXJuIkRhdGFWaWV3Ij09PXR8fGMoTyx0KX0saXNUeXBlZEFycmF5OmlzVHlwZWRBcnJheSxUeXBlZEFycmF5OncsVHlwZWRBcnJheVByb3RvdHlwZTpTfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBEYXRhVmlld30sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMjQpLGk9cig1OSksbz1yKDUzKSgic3BlY2llcyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByLGE9bihlKS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09KHI9bihhKVtvXSk/dDppKHIpfX0sZnVuY3Rpb24oZSx0LHIpe3IoMTE0KTtyKDEyMyk7cig3Myk7cigxMjUpO3ZhciBuPXIoMzkpO2UuZXhwb3J0cz1uLk1hcH0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDExNSksaT1yKDEyMCk7ZS5leHBvcnRzPW4oIk1hcCIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBNYXAoKXtyZXR1cm4gZSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSksaSl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2KSxpPXIoNyksbz1yKDQ4KSxhPXIoMjUpLHM9cigxMTYpLGM9cigxMDApLHU9cigxMTgpLGY9cigxOCksbD1yKDEwKSxwPXIoOTMpLGQ9cig4MSksaD1yKDExOSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXt2YXIgZz0tMSE9PWUuaW5kZXhPZigiTWFwIiksdj0tMSE9PWUuaW5kZXhPZigiV2VhayIpLG09Zz8ic2V0IjoiYWRkIix5PWlbZV0sYj15JiZ5LnByb3RvdHlwZSx4PXksdz17fSxmaXhNZXRob2Q9ZnVuY3Rpb24oZSl7dmFyIHQ9YltlXTthKGIsZSwiYWRkIj09ZT9mdW5jdGlvbiBhZGQoZSl7dC5jYWxsKHRoaXMsMD09PWU/MDplKTtyZXR1cm4gdGhpc306ImRlbGV0ZSI9PWU/ZnVuY3Rpb24oZSl7cmV0dXJuISh2JiYhZihlKSkmJnQuY2FsbCh0aGlzLDA9PT1lPzA6ZSl9OiJnZXQiPT1lP2Z1bmN0aW9uIGdldChlKXtyZXR1cm4gdiYmIWYoZSk/dm9pZCAwOnQuY2FsbCh0aGlzLDA9PT1lPzA6ZSl9OiJoYXMiPT1lP2Z1bmN0aW9uIGhhcyhlKXtyZXR1cm4hKHYmJiFmKGUpKSYmdC5jYWxsKHRoaXMsMD09PWU/MDplKX06ZnVuY3Rpb24gc2V0KGUscil7dC5jYWxsKHRoaXMsMD09PWU/MDplLHIpO3JldHVybiB0aGlzfSl9O2lmKG8oZSwiZnVuY3Rpb24iIT10eXBlb2YgeXx8ISh2fHxiLmZvckVhY2gmJiFsKChmdW5jdGlvbigpeyhuZXcgeSkuZW50cmllcygpLm5leHQoKX0pKSkpKXt4PXIuZ2V0Q29uc3RydWN0b3IodCxlLGcsbSk7cy5SRVFVSVJFRD0hMH1lbHNlIGlmKG8oZSwhMCkpe3ZhciBTPW5ldyB4LF89U1ttXSh2P3t9Oi0wLDEpIT1TLFQ9bCgoZnVuY3Rpb24oKXtTLmhhcygxKX0pKSxQPXAoKGZ1bmN0aW9uKGUpe25ldyB5KGUpfSkpLEM9IXYmJmwoKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW5ldyB5LHQ9NTt0LS07KWVbbV0odCx0KTtyZXR1cm4hZS5oYXMoLTApfSkpO2lmKCFQKXsoeD10KChmdW5jdGlvbih0LHIpe3UodCx4LGUpO3ZhciBuPWgobmV3IHksdCx4KTtudWxsIT1yJiZjKHIsblttXSxuLGcpO3JldHVybiBufSkpKS5wcm90b3R5cGU9YjtiLmNvbnN0cnVjdG9yPXh9aWYoVHx8Qyl7Zml4TWV0aG9kKCJkZWxldGUiKTtmaXhNZXRob2QoImhhcyIpO2cmJmZpeE1ldGhvZCgiZ2V0Iil9KEN8fF8pJiZmaXhNZXRob2QobSk7diYmYi5jbGVhciYmZGVsZXRlIGIuY2xlYXJ9d1tlXT14O24oe2dsb2JhbDohMCxmb3JjZWQ6eCE9eX0sdyk7ZCh4LGUpO3Z8fHIuc2V0U3Ryb25nKHgsZSxnKTtyZXR1cm4geH19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDM1KSxpPXIoMTgpLG89cigxOSksYT1yKDIzKS5mLHM9cigzNCksYz1yKDExNyksdT1zKCJtZXRhIiksZj0wLGw9T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2V0TWV0YWRhdGE9ZnVuY3Rpb24oZSl7YShlLHUse3ZhbHVlOntvYmplY3RJRDoiTyIrICsrZix3ZWFrRGF0YTp7fX19KX0scD1lLmV4cG9ydHM9e1JFUVVJUkVEOiExLGZhc3RLZXk6ZnVuY3Rpb24oZSx0KXtpZighaShlKSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGU/ZTooInN0cmluZyI9PXR5cGVvZiBlPyJTIjoiUCIpK2U7aWYoIW8oZSx1KSl7aWYoIWwoZSkpcmV0dXJuIkYiO2lmKCF0KXJldHVybiJFIjtzZXRNZXRhZGF0YShlKX1yZXR1cm4gZVt1XS5vYmplY3RJRH0sZ2V0V2Vha0RhdGE6ZnVuY3Rpb24oZSx0KXtpZighbyhlLHUpKXtpZighbChlKSlyZXR1cm4hMDtpZighdClyZXR1cm4hMTtzZXRNZXRhZGF0YShlKX1yZXR1cm4gZVt1XS53ZWFrRGF0YX0sb25GcmVlemU6ZnVuY3Rpb24oZSl7YyYmcC5SRVFVSVJFRCYmbChlKSYmIW8oZSx1KSYmc2V0TWV0YWRhdGEoZSk7cmV0dXJuIGV9fTtuW3VdPSEwfSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxMCk7ZS5leHBvcnRzPSFuKChmdW5jdGlvbigpe3JldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpfSkpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgVHlwZUVycm9yKCJJbmNvcnJlY3QgIisocj9yKyIgIjoiIikrImludm9jYXRpb24iKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDE4KSxpPXIoODMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dmFyIG8sYTtpJiYiZnVuY3Rpb24iPT10eXBlb2Yobz10LmNvbnN0cnVjdG9yKSYmbyE9PXImJm4oYT1vLnByb3RvdHlwZSkmJmEhPT1yLnByb3RvdHlwZSYmaShlLGEpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDIzKS5mLGk9cig2Nyksbz1yKDEyMSksYT1yKDU4KSxzPXIoMTE4KSxjPXIoMTAwKSx1PXIoNzUpLGY9cigxMjIpLGw9cig5KSxwPXIoMTE2KS5mYXN0S2V5LGQ9cigyOSksaD1kLnNldCxnPWQuZ2V0dGVyRm9yO2UuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LHIsdSl7dmFyIGY9ZSgoZnVuY3Rpb24oZSxuKXtzKGUsZix0KTtoKGUse3R5cGU6dCxpbmRleDppKG51bGwpLGZpcnN0OnZvaWQgMCxsYXN0OnZvaWQgMCxzaXplOjB9KTtsfHwoZS5zaXplPTApO251bGwhPW4mJmMobixlW3VdLGUscil9KSksZD1nKHQpLGRlZmluZT1mdW5jdGlvbihlLHQscil7dmFyIG4saSxvPWQoZSksYT1nZXRFbnRyeShlLHQpO2lmKGEpYS52YWx1ZT1yO2Vsc2V7by5sYXN0PWE9e2luZGV4Omk9cCh0LCEwKSxrZXk6dCx2YWx1ZTpyLHByZXZpb3VzOm49by5sYXN0LG5leHQ6dm9pZCAwLHJlbW92ZWQ6ITF9O28uZmlyc3R8fChvLmZpcnN0PWEpO24mJihuLm5leHQ9YSk7bD9vLnNpemUrKzplLnNpemUrKzsiRiIhPT1pJiYoby5pbmRleFtpXT1hKX1yZXR1cm4gZX0sZ2V0RW50cnk9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPWQoZSksaT1wKHQpO2lmKCJGIiE9PWkpcmV0dXJuIG4uaW5kZXhbaV07Zm9yKHI9bi5maXJzdDtyO3I9ci5uZXh0KWlmKHIua2V5PT10KXJldHVybiByfTtvKGYucHJvdG90eXBlLHtjbGVhcjpmdW5jdGlvbiBjbGVhcigpe2Zvcih2YXIgZT1kKHRoaXMpLHQ9ZS5pbmRleCxyPWUuZmlyc3Q7cjspe3IucmVtb3ZlZD0hMDtyLnByZXZpb3VzJiYoci5wcmV2aW91cz1yLnByZXZpb3VzLm5leHQ9dm9pZCAwKTtkZWxldGUgdFtyLmluZGV4XTtyPXIubmV4dH1lLmZpcnN0PWUubGFzdD12b2lkIDA7bD9lLnNpemU9MDp0aGlzLnNpemU9MH0sZGVsZXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWQodGhpcykscj1nZXRFbnRyeSh0aGlzLGUpO2lmKHIpe3ZhciBuPXIubmV4dCxpPXIucHJldmlvdXM7ZGVsZXRlIHQuaW5kZXhbci5pbmRleF07ci5yZW1vdmVkPSEwO2kmJihpLm5leHQ9bik7biYmKG4ucHJldmlvdXM9aSk7dC5maXJzdD09ciYmKHQuZmlyc3Q9bik7dC5sYXN0PT1yJiYodC5sYXN0PWkpO2w/dC5zaXplLS06dGhpcy5zaXplLS19cmV0dXJuISFyfSxmb3JFYWNoOmZ1bmN0aW9uIGZvckVhY2goZSl7Zm9yKHZhciB0LHI9ZCh0aGlzKSxuPWEoZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTt0PXQ/dC5uZXh0OnIuZmlyc3Q7KXtuKHQudmFsdWUsdC5rZXksdGhpcyk7Zm9yKDt0JiZ0LnJlbW92ZWQ7KXQ9dC5wcmV2aW91c319LGhhczpmdW5jdGlvbiBoYXMoZSl7cmV0dXJuISFnZXRFbnRyeSh0aGlzLGUpfX0pO28oZi5wcm90b3R5cGUscj97Z2V0OmZ1bmN0aW9uIGdldChlKXt2YXIgdD1nZXRFbnRyeSh0aGlzLGUpO3JldHVybiB0JiZ0LnZhbHVlfSxzZXQ6ZnVuY3Rpb24gc2V0KGUsdCl7cmV0dXJuIGRlZmluZSh0aGlzLDA9PT1lPzA6ZSx0KX19OnthZGQ6ZnVuY3Rpb24gYWRkKGUpe3JldHVybiBkZWZpbmUodGhpcyxlPTA9PT1lPzA6ZSxlKX19KTtsJiZuKGYucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGQodGhpcykuc2l6ZX19KTtyZXR1cm4gZn0sc2V0U3Ryb25nOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10KyIgSXRlcmF0b3IiLGk9Zyh0KSxvPWcobik7dShlLHQsKGZ1bmN0aW9uKGUsdCl7aCh0aGlzLHt0eXBlOm4sdGFyZ2V0OmUsc3RhdGU6aShlKSxraW5kOnQsbGFzdDp2b2lkIDB9KX0pLChmdW5jdGlvbigpe2Zvcih2YXIgZT1vKHRoaXMpLHQ9ZS5raW5kLHI9ZS5sYXN0O3ImJnIucmVtb3ZlZDspcj1yLnByZXZpb3VzO2lmKCFlLnRhcmdldHx8IShlLmxhc3Q9cj1yP3IubmV4dDplLnN0YXRlLmZpcnN0KSl7ZS50YXJnZXQ9dm9pZCAwO3JldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19cmV0dXJuImtleXMiPT10P3t2YWx1ZTpyLmtleSxkb25lOiExfToidmFsdWVzIj09dD97dmFsdWU6ci52YWx1ZSxkb25lOiExfTp7dmFsdWU6W3Iua2V5LHIudmFsdWVdLGRvbmU6ITF9fSkscj8iZW50cmllcyI6InZhbHVlcyIsIXIsITApO2YodCl9fX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMjUpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBpIGluIHQpbihlLGksdFtpXSxyKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cigzOCksaT1yKDIzKSxvPXIoNTMpLGE9cig5KSxzPW8oInNwZWNpZXMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKSxyPWkuZjthJiZ0JiYhdFtzXSYmcih0LHMse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDkyKSxpPXIoMjUpLG89cigxMjQpO258fGkoT2JqZWN0LnByb3RvdHlwZSwidG9TdHJpbmciLG8se3Vuc2FmZTohMH0pfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoOTIpLGk9cig5MSk7ZS5leHBvcnRzPW4/e30udG9TdHJpbmc6ZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4iW29iamVjdCAiK2kodGhpcykrIl0ifX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNyksaT1yKDEyNiksbz1yKDk4KSxhPXIoMjIpLHM9cig1MyksYz1zKCJpdGVyYXRvciIpLHU9cygidG9TdHJpbmdUYWciKSxmPW8udmFsdWVzO2Zvcih2YXIgbCBpbiBpKXt2YXIgcD1uW2xdLGQ9cCYmcC5wcm90b3R5cGU7aWYoZCl7aWYoZFtjXSE9PWYpdHJ5e2EoZCxjLGYpfWNhdGNoKGUpe2RbY109Zn1kW3VdfHxhKGQsdSxsKTtpZihpW2xdKWZvcih2YXIgaCBpbiBvKWlmKGRbaF0hPT1vW2hdKXRyeXthKGQsaCxvW2hdKX1jYXRjaChlKXtkW2hdPW9baF19fX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfX0sZnVuY3Rpb24oZSx0LHIpe3IoMTI4KTtyKDEyMyk7cig3Myk7cigxMjUpO3ZhciBuPXIoMzkpO2UuZXhwb3J0cz1uLlNldH0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDExNSksaT1yKDEyMCk7ZS5leHBvcnRzPW4oIlNldCIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBTZXQoKXtyZXR1cm4gZSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSksaSl9LGZ1bmN0aW9uKGUsdCxyKXtyKDEyMyk7cigxMzApO3IoMTI1KTt2YXIgbj1yKDM5KTtlLmV4cG9ydHM9bi5XZWFrTWFwfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuLGk9cig3KSxvPXIoMTIxKSxhPXIoMTE2KSxzPXIoMTE1KSxjPXIoMTMxKSx1PXIoMTgpLGY9cigyOSkuZW5mb3JjZSxsPXIoMzApLHA9IWkuQWN0aXZlWE9iamVjdCYmIkFjdGl2ZVhPYmplY3QiaW4gaSxkPU9iamVjdC5pc0V4dGVuc2libGUsd3JhcHBlcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpe3JldHVybiBlKHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19LGg9ZS5leHBvcnRzPXMoIldlYWtNYXAiLHdyYXBwZXIsYyk7aWYobCYmcCl7bj1jLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIldlYWtNYXAiLCEwKTthLlJFUVVJUkVEPSEwO3ZhciBnPWgucHJvdG90eXBlLHY9Zy5kZWxldGUsbT1nLmhhcyx5PWcuZ2V0LGI9Zy5zZXQ7byhnLHtkZWxldGU6ZnVuY3Rpb24oZSl7aWYodShlKSYmIWQoZSkpe3ZhciB0PWYodGhpcyk7dC5mcm96ZW58fCh0LmZyb3plbj1uZXcgbik7cmV0dXJuIHYuY2FsbCh0aGlzLGUpfHx0LmZyb3plbi5kZWxldGUoZSl9cmV0dXJuIHYuY2FsbCh0aGlzLGUpfSxoYXM6ZnVuY3Rpb24gaGFzKGUpe2lmKHUoZSkmJiFkKGUpKXt2YXIgdD1mKHRoaXMpO3QuZnJvemVufHwodC5mcm96ZW49bmV3IG4pO3JldHVybiBtLmNhbGwodGhpcyxlKXx8dC5mcm96ZW4uaGFzKGUpfXJldHVybiBtLmNhbGwodGhpcyxlKX0sZ2V0OmZ1bmN0aW9uIGdldChlKXtpZih1KGUpJiYhZChlKSl7dmFyIHQ9Zih0aGlzKTt0LmZyb3plbnx8KHQuZnJvemVuPW5ldyBuKTtyZXR1cm4gbS5jYWxsKHRoaXMsZSk/eS5jYWxsKHRoaXMsZSk6dC5mcm96ZW4uZ2V0KGUpfXJldHVybiB5LmNhbGwodGhpcyxlKX0sc2V0OmZ1bmN0aW9uIHNldChlLHQpe2lmKHUoZSkmJiFkKGUpKXt2YXIgcj1mKHRoaXMpO3IuZnJvemVufHwoci5mcm96ZW49bmV3IG4pO20uY2FsbCh0aGlzLGUpP2IuY2FsbCh0aGlzLGUsdCk6ci5mcm96ZW4uc2V0KGUsdCl9ZWxzZSBiLmNhbGwodGhpcyxlLHQpO3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDEyMSksaT1yKDExNikuZ2V0V2Vha0RhdGEsbz1yKDI0KSxhPXIoMTgpLHM9cigxMTgpLGM9cigxMDApLHU9cigxMzIpLGY9cigxOSksbD1yKDI5KSxwPWwuc2V0LGQ9bC5nZXR0ZXJGb3IsaD11LmZpbmQsZz11LmZpbmRJbmRleCx2PTAsdW5jYXVnaHRGcm96ZW5TdG9yZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5mcm96ZW58fChlLmZyb3plbj1uZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSl9LFVuY2F1Z2h0RnJvemVuU3RvcmU9ZnVuY3Rpb24oKXt0aGlzLmVudHJpZXM9W119LGZpbmRVbmNhdWdodEZyb3plbj1mdW5jdGlvbihlLHQpe3JldHVybiBoKGUuZW50cmllcywoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09PT10fSkpfTtVbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWZpbmRVbmNhdWdodEZyb3plbih0aGlzLGUpO2lmKHQpcmV0dXJuIHRbMV19LGhhczpmdW5jdGlvbihlKXtyZXR1cm4hIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLGUpfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgcj1maW5kVW5jYXVnaHRGcm96ZW4odGhpcyxlKTtyP3JbMV09dDp0aGlzLmVudHJpZXMucHVzaChbZSx0XSl9LGRlbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD1nKHRoaXMuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT1lfSkpO350JiZ0aGlzLmVudHJpZXMuc3BsaWNlKHQsMSk7cmV0dXJuISF+dH19O2UuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LHIsdSl7dmFyIGw9ZSgoZnVuY3Rpb24oZSxuKXtzKGUsbCx0KTtwKGUse3R5cGU6dCxpZDp2KyssZnJvemVuOnZvaWQgMH0pO251bGwhPW4mJmMobixlW3VdLGUscil9KSksaD1kKHQpLGRlZmluZT1mdW5jdGlvbihlLHQscil7dmFyIG49aChlKSxhPWkobyh0KSwhMCk7ITA9PT1hP3VuY2F1Z2h0RnJvemVuU3RvcmUobikuc2V0KHQscik6YVtuLmlkXT1yO3JldHVybiBlfTtuKGwucHJvdG90eXBlLHtkZWxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9aCh0aGlzKTtpZighYShlKSlyZXR1cm4hMTt2YXIgcj1pKGUpO3JldHVybiEwPT09cj91bmNhdWdodEZyb3plblN0b3JlKHQpLmRlbGV0ZShlKTpyJiZmKHIsdC5pZCkmJmRlbGV0ZSByW3QuaWRdfSxoYXM6ZnVuY3Rpb24gaGFzKGUpe3ZhciB0PWgodGhpcyk7aWYoIWEoZSkpcmV0dXJuITE7dmFyIHI9aShlKTtyZXR1cm4hMD09PXI/dW5jYXVnaHRGcm96ZW5TdG9yZSh0KS5oYXMoZSk6ciYmZihyLHQuaWQpfX0pO24obC5wcm90b3R5cGUscj97Z2V0OmZ1bmN0aW9uIGdldChlKXt2YXIgdD1oKHRoaXMpO2lmKGEoZSkpe3ZhciByPWkoZSk7cmV0dXJuITA9PT1yP3VuY2F1Z2h0RnJvemVuU3RvcmUodCkuZ2V0KGUpOnI/clt0LmlkXTp2b2lkIDB9fSxzZXQ6ZnVuY3Rpb24gc2V0KGUsdCl7cmV0dXJuIGRlZmluZSh0aGlzLGUsdCl9fTp7YWRkOmZ1bmN0aW9uIGFkZChlKXtyZXR1cm4gZGVmaW5lKHRoaXMsZSwhMCl9fSk7cmV0dXJuIGx9fX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNTgpLGk9cigxNCksbz1yKDc5KSxhPXIoNDMpLHM9cigxMzMpLGM9W10ucHVzaCxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24oZSl7dmFyIHQ9MT09ZSxyPTI9PWUsdT0zPT1lLGY9ND09ZSxsPTY9PWUscD01PT1lfHxsO3JldHVybiBmdW5jdGlvbihkLGgsZyx2KXtmb3IodmFyIG0seSxiPW8oZCkseD1pKGIpLHc9bihoLGcsMyksUz1hKHgubGVuZ3RoKSxfPTAsVD12fHxzLFA9dD9UKGQsUyk6cj9UKGQsMCk6dm9pZCAwO1M+XztfKyspaWYocHx8XyBpbiB4KXt5PXcobT14W19dLF8sYik7aWYoZSlpZih0KVBbX109eTtlbHNlIGlmKHkpc3dpdGNoKGUpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIG07Y2FzZSA2OnJldHVybiBfO2Nhc2UgMjpjLmNhbGwoUCxtKX1lbHNlIGlmKGYpcmV0dXJuITF9cmV0dXJuIGw/LTE6dXx8Zj9mOlB9fTtlLmV4cG9ydHM9e2ZvckVhY2g6Y3JlYXRlTWV0aG9kKDApLG1hcDpjcmVhdGVNZXRob2QoMSksZmlsdGVyOmNyZWF0ZU1ldGhvZCgyKSxzb21lOmNyZWF0ZU1ldGhvZCgzKSxldmVyeTpjcmVhdGVNZXRob2QoNCksZmluZDpjcmVhdGVNZXRob2QoNSksZmluZEluZGV4OmNyZWF0ZU1ldGhvZCg2KX19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDE4KSxpPXIoMTM0KSxvPXIoNTMpKCJzcGVjaWVzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI7aShlKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihyPWUuY29uc3RydWN0b3IpfHxyIT09QXJyYXkmJiFpKHIucHJvdG90eXBlKT9uKHIpJiZudWxsPT09KHI9cltvXSkmJihyPXZvaWQgMCk6cj12b2lkIDApO3JldHVybiBuZXcodm9pZCAwPT09cj9BcnJheTpyKSgwPT09dD8wOnQpfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMTUpO2UuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbiBpc0FycmF5KGUpe3JldHVybiJBcnJheSI9PW4oZSl9fSxmdW5jdGlvbihlLHQscil7cigxMjMpO3IoMTM2KTtyKDEyNSk7dmFyIG49cigzOSk7ZS5leHBvcnRzPW4uV2Vha1NldH0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtyKDExNSkoIldlYWtTZXQiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpe3JldHVybiBlKHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19KSxyKDEzMSkpfSxmdW5jdGlvbihlLHQscil7cigxMzgpO3ZhciBuPXIoNTcpO2UuZXhwb3J0cz1uKCJTdHJpbmciLCJjb2RlUG9pbnRBdCIpfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNiksaT1yKDc0KS5jb2RlQXQ7bih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwfSx7Y29kZVBvaW50QXQ6ZnVuY3Rpb24gY29kZVBvaW50QXQoZSl7cmV0dXJuIGkodGhpcyxlKX19KX0sZnVuY3Rpb24oZSx0LHIpe3IoMTQwKTt2YXIgbj1yKDM5KTtlLmV4cG9ydHM9bi5TdHJpbmcuZnJvbUNvZGVQb2ludH0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNiksaT1yKDQ1KSxvPVN0cmluZy5mcm9tQ2hhckNvZGUsYT1TdHJpbmcuZnJvbUNvZGVQb2ludDtuKHt0YXJnZXQ6IlN0cmluZyIsc3RhdDohMCxmb3JjZWQ6ISFhJiYxIT1hLmxlbmd0aH0se2Zyb21Db2RlUG9pbnQ6ZnVuY3Rpb24gZnJvbUNvZGVQb2ludChlKXtmb3IodmFyIHQscj1bXSxuPWFyZ3VtZW50cy5sZW5ndGgsYT0wO24+YTspe3Q9K2FyZ3VtZW50c1thKytdO2lmKGkodCwxMTE0MTExKSE9PXQpdGhyb3cgUmFuZ2VFcnJvcih0KyIgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCIpO3IucHVzaCh0PDY1NTM2P28odCk6byg1NTI5NisoKHQtPTY1NTM2KT4+MTApLHQlMTAyNCs1NjMyMCkpfXJldHVybiByLmpvaW4oIiIpfX0pfSxmdW5jdGlvbihlLHQscil7cigxNDIpO3IoMTIzKTtyKDE0Nik7cigxNTApO3IoMTUxKTtyKDE1Mik7cigxNTMpO3IoMTU0KTtyKDE1NSk7cigxNTYpO3IoMTU3KTtyKDE1OCk7cigxNTkpO3IoMTYwKTtyKDE2MSk7cigxNjIpO3IoMTYzKTtyKDE2NCk7cigxNjUpO3ZhciBuPXIoMzkpO2UuZXhwb3J0cz1uLlN5bWJvbH0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDYpLGk9cigxMCksbz1yKDEzNCksYT1yKDE4KSxzPXIoNzkpLGM9cig0MyksdT1yKDg5KSxmPXIoMTMzKSxsPXIoMTQzKSxwPXIoNTMpLGQ9cigxNDQpLGg9cCgiaXNDb25jYXRTcHJlYWRhYmxlIiksZz1kPj01MXx8IWkoKGZ1bmN0aW9uKCl7dmFyIGU9W107ZVtoXT0hMTtyZXR1cm4gZS5jb25jYXQoKVswXSE9PWV9KSksdj1sKCJjb25jYXQiKSxpc0NvbmNhdFNwcmVhZGFibGU9ZnVuY3Rpb24oZSl7aWYoIWEoZSkpcmV0dXJuITE7dmFyIHQ9ZVtoXTtyZXR1cm4gdm9pZCAwIT09dD8hIXQ6byhlKX07bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFnfHwhdn0se2NvbmNhdDpmdW5jdGlvbiBjb25jYXQoZSl7dmFyIHQscixuLGksbyxhPXModGhpcyksbD1mKGEsMCkscD0wO2Zvcih0PS0xLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKWlmKGlzQ29uY2F0U3ByZWFkYWJsZShvPS0xPT09dD9hOmFyZ3VtZW50c1t0XSkpe2lmKHArKGk9YyhvLmxlbmd0aCkpPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgVHlwZUVycm9yKCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQiKTtmb3Iocj0wO3I8aTtyKysscCsrKXIgaW4gbyYmdShsLHAsb1tyXSl9ZWxzZXtpZihwPj05MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7dShsLHArKyxvKX1sLmxlbmd0aD1wO3JldHVybiBsfX0pfSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxMCksaT1yKDUzKSxvPXIoMTQ0KSxhPWkoInNwZWNpZXMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG8+PTUxfHwhbigoZnVuY3Rpb24oKXt2YXIgdD1bXTsodC5jb25zdHJ1Y3Rvcj17fSlbYV09ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fTtyZXR1cm4gMSE9PXRbZV0oQm9vbGVhbikuZm9vfSkpfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGksbz1yKDcpLGE9cigxNDUpLHM9by5wcm9jZXNzLGM9cyYmcy52ZXJzaW9ucyx1PWMmJmMudjg7dT9pPShuPXUuc3BsaXQoIi4iKSlbMF0rblsxXTphJiYoIShuPWEubWF0Y2goL0VkZ2VcLyhcZCspLykpfHxuWzFdPj03NCkmJihuPWEubWF0Y2goL0Nocm9tZVwvKFxkKykvKSkmJihpPW5bMV0pO2UuZXhwb3J0cz1pJiYraX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoMzgpO2UuZXhwb3J0cz1uKCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiKXx8IiJ9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2KSxpPXIoNyksbz1yKDM4KSxhPXIoMzMpLHM9cig5KSxjPXIoNTQpLHU9cig1NSksZj1yKDEwKSxsPXIoMTkpLHA9cigxMzQpLGQ9cigxOCksaD1yKDI0KSxnPXIoNzkpLHY9cigxMyksbT1yKDE3KSx5PXIoMTIpLGI9cig2NykseD1yKDY5KSx3PXIoNDApLFM9cigxNDcpLF89cig0NyksVD1yKDgpLFA9cigyMyksQz1yKDExKSxrPXIoMjIpLEk9cigyNSksTz1yKDMyKSxFPXIoMzEpLEE9cigzNSksUj1yKDM0KSxNPXIoNTMpLEQ9cigxNDgpLEw9cigxNDkpLEI9cig4MSksVT1yKDI5KSxOPXIoMTMyKS5mb3JFYWNoLGo9RSgiaGlkZGVuIiksej1NKCJ0b1ByaW1pdGl2ZSIpLEg9VS5zZXQsVz1VLmdldHRlckZvcigiU3ltYm9sIiksWD1PYmplY3QucHJvdG90eXBlLHE9aS5TeW1ib2wsWT1vKCJKU09OIiwic3RyaW5naWZ5IiksVj1ULmYsSj1QLmYsRz1TLmYsSz1DLmYsUT1PKCJzeW1ib2xzIiksWj1PKCJvcC1zeW1ib2xzIiksJD1PKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksZWU9Tygic3ltYm9sLXRvLXN0cmluZy1yZWdpc3RyeSIpLHRlPU8oIndrcyIpLHJlPWkuUU9iamVjdCxuZT0hcmV8fCFyZS5wcm90b3R5cGV8fCFyZS5wcm90b3R5cGUuZmluZENoaWxkLGllPXMmJmYoKGZ1bmN0aW9uKCl7cmV0dXJuIDchPWIoSih7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBKKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pKT9mdW5jdGlvbihlLHQscil7dmFyIG49VihYLHQpO24mJmRlbGV0ZSBYW3RdO0ooZSx0LHIpO24mJmUhPT1YJiZKKFgsdCxuKX06Six3cmFwPWZ1bmN0aW9uKGUsdCl7dmFyIHI9UVtlXT1iKHEucHJvdG90eXBlKTtIKHIse3R5cGU6IlN5bWJvbCIsdGFnOmUsZGVzY3JpcHRpb246dH0pO3N8fChyLmRlc2NyaXB0aW9uPXQpO3JldHVybiByfSxvZT11P2Z1bmN0aW9uKGUpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdChlKWluc3RhbmNlb2YgcX0sYWU9ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoZSx0LHIpe2U9PT1YJiZhZShaLHQscik7aChlKTt2YXIgbj1tKHQsITApO2gocik7aWYobChRLG4pKXtpZihyLmVudW1lcmFibGUpe2woZSxqKSYmZVtqXVtuXSYmKGVbal1bbl09ITEpO3I9YihyLHtlbnVtZXJhYmxlOnkoMCwhMSl9KX1lbHNle2woZSxqKXx8SihlLGoseSgxLHt9KSk7ZVtqXVtuXT0hMH1yZXR1cm4gaWUoZSxuLHIpfXJldHVybiBKKGUsbixyKX0sc2U9ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhlLHQpe2goZSk7dmFyIHI9dih0KSxuPXgocikuY29uY2F0KGxlKHIpKTtOKG4sKGZ1bmN0aW9uKHQpe3MmJiFjZS5jYWxsKHIsdCl8fGFlKGUsdCxyW3RdKX0pKTtyZXR1cm4gZX0sY2U9ZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoZSl7dmFyIHQ9bShlLCEwKSxyPUsuY2FsbCh0aGlzLHQpO3JldHVybiEodGhpcz09PVgmJmwoUSx0KSYmIWwoWix0KSkmJighKHJ8fCFsKHRoaXMsdCl8fCFsKFEsdCl8fGwodGhpcyxqKSYmdGhpc1tqXVt0XSl8fHIpfSx1ZT1mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KXt2YXIgcj12KGUpLG49bSh0LCEwKTtpZihyIT09WHx8IWwoUSxuKXx8bChaLG4pKXt2YXIgaT1WKHIsbik7IWl8fCFsKFEsbil8fGwocixqKSYmcltqXVtuXXx8KGkuZW51bWVyYWJsZT0hMCk7cmV0dXJuIGl9fSxmZT1mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGUpe3ZhciB0PUcodihlKSkscj1bXTtOKHQsKGZ1bmN0aW9uKGUpe2woUSxlKXx8bChBLGUpfHxyLnB1c2goZSl9KSk7cmV0dXJuIHJ9LGxlPWZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhlKXt2YXIgdD1lPT09WCxyPUcodD9aOnYoZSkpLG49W107TihyLChmdW5jdGlvbihlKXshbChRLGUpfHx0JiYhbChYLGUpfHxuLnB1c2goUVtlXSl9KSk7cmV0dXJuIG59O2lmKCFjKXtJKChxPWZ1bmN0aW9uIFN5bWJvbCgpe2lmKHRoaXMgaW5zdGFuY2VvZiBxKXRocm93IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7dmFyIGU9YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP1N0cmluZyhhcmd1bWVudHNbMF0pOnZvaWQgMCx0PVIoZSksc2V0dGVyPWZ1bmN0aW9uKGUpe3RoaXM9PT1YJiZzZXR0ZXIuY2FsbChaLGUpO2wodGhpcyxqKSYmbCh0aGlzW2pdLHQpJiYodGhpc1tqXVt0XT0hMSk7aWUodGhpcyx0LHkoMSxlKSl9O3MmJm5lJiZpZShYLHQse2NvbmZpZ3VyYWJsZTohMCxzZXQ6c2V0dGVyfSk7cmV0dXJuIHdyYXAodCxlKX0pLnByb3RvdHlwZSwidG9TdHJpbmciLChmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiBXKHRoaXMpLnRhZ30pKTtJKHEsIndpdGhvdXRTZXR0ZXIiLChmdW5jdGlvbihlKXtyZXR1cm4gd3JhcChSKGUpLGUpfSkpO0MuZj1jZTtQLmY9YWU7VC5mPXVlO3cuZj1TLmY9ZmU7Xy5mPWxlO0QuZj1mdW5jdGlvbihlKXtyZXR1cm4gd3JhcChNKGUpLGUpfTtpZihzKXtKKHEucHJvdG90eXBlLCJkZXNjcmlwdGlvbiIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24gZGVzY3JpcHRpb24oKXtyZXR1cm4gVyh0aGlzKS5kZXNjcmlwdGlvbn19KTthfHxJKFgsInByb3BlcnR5SXNFbnVtZXJhYmxlIixjZSx7dW5zYWZlOiEwfSl9fW4oe2dsb2JhbDohMCx3cmFwOiEwLGZvcmNlZDohYyxzaGFtOiFjfSx7U3ltYm9sOnF9KTtOKHgodGUpLChmdW5jdGlvbihlKXtMKGUpfSkpO24oe3RhcmdldDoiU3ltYm9sIixzdGF0OiEwLGZvcmNlZDohY30se2ZvcjpmdW5jdGlvbihlKXt2YXIgdD1TdHJpbmcoZSk7aWYobCgkLHQpKXJldHVybiAkW3RdO3ZhciByPXEodCk7JFt0XT1yO2VlW3JdPXQ7cmV0dXJuIHJ9LGtleUZvcjpmdW5jdGlvbiBrZXlGb3IoZSl7aWYoIW9lKGUpKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGEgc3ltYm9sIik7aWYobChlZSxlKSlyZXR1cm4gZWVbZV19LHVzZVNldHRlcjpmdW5jdGlvbigpe25lPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtuZT0hMX19KTtuKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IWMsc2hhbTohc30se2NyZWF0ZTpmdW5jdGlvbiBjcmVhdGUoZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9iKGUpOnNlKGIoZSksdCl9LGRlZmluZVByb3BlcnR5OmFlLGRlZmluZVByb3BlcnRpZXM6c2UsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOnVlfSk7bih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFjfSx7Z2V0T3duUHJvcGVydHlOYW1lczpmZSxnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6bGV9KTtuKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6ZigoZnVuY3Rpb24oKXtfLmYoMSl9KSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpe3JldHVybiBfLmYoZyhlKSl9fSk7aWYoWSl7bih7dGFyZ2V0OiJKU09OIixzdGF0OiEwLGZvcmNlZDohY3x8ZigoZnVuY3Rpb24oKXt2YXIgZT1xKCk7cmV0dXJuIltudWxsXSIhPVkoW2VdKXx8Int9IiE9WSh7YTplfSl8fCJ7fSIhPVkoT2JqZWN0KGUpKX0pKX0se3N0cmluZ2lmeTpmdW5jdGlvbiBzdHJpbmdpZnkoZSx0LHIpe2Zvcih2YXIgbixpPVtlXSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylpLnB1c2goYXJndW1lbnRzW28rK10pO249dDtpZigoZCh0KXx8dm9pZCAwIT09ZSkmJiFvZShlKSl7cCh0KXx8KHQ9ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKHQ9bi5jYWxsKHRoaXMsZSx0KSk7aWYoIW9lKHQpKXJldHVybiB0fSk7aVsxXT10O3JldHVybiBZLmFwcGx5KG51bGwsaSl9fX0pfXEucHJvdG90eXBlW3pdfHxrKHEucHJvdG90eXBlLHoscS5wcm90b3R5cGUudmFsdWVPZik7QihxLCJTeW1ib2wiKTtBW2pdPSEwfSxmdW5jdGlvbihlLHQscil7dmFyIG49cigxMyksaT1yKDQwKS5mLG89e30udG9TdHJpbmcsYT0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdO2UuZXhwb3J0cy5mPWZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoZSl7cmV0dXJuIGEmJiJbb2JqZWN0IFdpbmRvd10iPT1vLmNhbGwoZSk/ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBpKGUpfWNhdGNoKGUpe3JldHVybiBhLnNsaWNlKCl9fShlKTppKG4oZSkpfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIoNTMpO3QuZj1ufSxmdW5jdGlvbihlLHQscil7dmFyIG49cigzOSksaT1yKDE5KSxvPXIoMTQ4KSxhPXIoMjMpLmY7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4uU3ltYm9sfHwobi5TeW1ib2w9e30pO2kodCxlKXx8YSh0LGUse3ZhbHVlOm8uZihlKX0pfX0sZnVuY3Rpb24oZSx0LHIpe3IoMTQ5KSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNiksaT1yKDkpLG89cig3KSxhPXIoMTkpLHM9cigxOCksYz1yKDIzKS5mLHU9cigzNiksZj1vLlN5bWJvbDtpZihpJiYiZnVuY3Rpb24iPT10eXBlb2YgZiYmKCEoImRlc2NyaXB0aW9uImluIGYucHJvdG90eXBlKXx8dm9pZCAwIT09ZigpLmRlc2NyaXB0aW9uKSl7dmFyIGw9e30scD1mdW5jdGlvbiBTeW1ib2woKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPDF8fHZvaWQgMD09PWFyZ3VtZW50c1swXT92b2lkIDA6U3RyaW5nKGFyZ3VtZW50c1swXSksdD10aGlzIGluc3RhbmNlb2YgcD9uZXcgZihlKTp2b2lkIDA9PT1lP2YoKTpmKGUpOyIiPT09ZSYmKGxbdF09ITApO3JldHVybiB0fTt1KHAsZik7dmFyIGQ9cC5wcm90b3R5cGU9Zi5wcm90b3R5cGU7ZC5jb25zdHJ1Y3Rvcj1wO3ZhciBoPWQudG9TdHJpbmcsZz0iU3ltYm9sKHRlc3QpIj09U3RyaW5nKGYoInRlc3QiKSksdj0vXlN5bWJvbFwoKC4qKVwpW14pXSskLztjKGQsImRlc2NyaXB0aW9uIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbiBkZXNjcmlwdGlvbigpe3ZhciBlPXModGhpcyk/dGhpcy52YWx1ZU9mKCk6dGhpcyx0PWguY2FsbChlKTtpZihhKGwsZSkpcmV0dXJuIiI7dmFyIHI9Zz90LnNsaWNlKDcsLTEpOnQucmVwbGFjZSh2LCIkMSIpO3JldHVybiIiPT09cj92b2lkIDA6cn19KTtuKHtnbG9iYWw6ITAsZm9yY2VkOiEwfSx7U3ltYm9sOnB9KX19LGZ1bmN0aW9uKGUsdCxyKXtyKDE0OSkoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKGUsdCxyKXtyKDE0OSkoImlzQ29uY2F0U3ByZWFkYWJsZSIpfSxmdW5jdGlvbihlLHQscil7cigxNDkpKCJpdGVyYXRvciIpfSxmdW5jdGlvbihlLHQscil7cigxNDkpKCJtYXRjaCIpfSxmdW5jdGlvbihlLHQscil7cigxNDkpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbihlLHQscil7cigxNDkpKCJyZXBsYWNlIil9LGZ1bmN0aW9uKGUsdCxyKXtyKDE0OSkoInNlYXJjaCIpfSxmdW5jdGlvbihlLHQscil7cigxNDkpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKGUsdCxyKXtyKDE0OSkoInNwbGl0Iil9LGZ1bmN0aW9uKGUsdCxyKXtyKDE0OSkoInRvUHJpbWl0aXZlIil9LGZ1bmN0aW9uKGUsdCxyKXtyKDE0OSkoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKGUsdCxyKXtyKDE0OSkoInVuc2NvcGFibGVzIil9LGZ1bmN0aW9uKGUsdCxyKXtyKDgxKShNYXRoLCJNYXRoIiwhMCl9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDcpO3IoODEpKG4uSlNPTiwiSlNPTiIsITApfSxmdW5jdGlvbihlLHQscil7cigxNjcpO3ZhciBuPXIoNTcpO2UuZXhwb3J0cz1uKCJTdHJpbmciLCJwYWRTdGFydCIpfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNiksaT1yKDE2OCkuc3RhcnQ7bih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpyKDE3MCl9LHtwYWRTdGFydDpmdW5jdGlvbiBwYWRTdGFydChlKXtyZXR1cm4gaSh0aGlzLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbihlLHQscil7dmFyIG49cig0MyksaT1yKDE2OSksbz1yKDE2KSxhPU1hdGguY2VpbCxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixzKXt2YXIgYyx1LGY9U3RyaW5nKG8odCkpLGw9Zi5sZW5ndGgscD12b2lkIDA9PT1zPyIgIjpTdHJpbmcocyksZD1uKHIpO2lmKGQ8PWx8fCIiPT1wKXJldHVybiBmO2M9ZC1sOyh1PWkuY2FsbChwLGEoYy9wLmxlbmd0aCkpKS5sZW5ndGg+YyYmKHU9dS5zbGljZSgwLGMpKTtyZXR1cm4gZT9mK3U6dStmfX07ZS5leHBvcnRzPXtzdGFydDpjcmVhdGVNZXRob2QoITEpLGVuZDpjcmVhdGVNZXRob2QoITApfX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDQ0KSxpPXIoMTYpO2UuZXhwb3J0cz0iIi5yZXBlYXR8fGZ1bmN0aW9uIHJlcGVhdChlKXt2YXIgdD1TdHJpbmcoaSh0aGlzKSkscj0iIixvPW4oZSk7aWYobzwwfHxvPT0xLzApdGhyb3cgUmFuZ2VFcnJvcigiV3JvbmcgbnVtYmVyIG9mIHJlcGV0aXRpb25zIik7Zm9yKDtvPjA7KG8+Pj49MSkmJih0Kz10KSkxJm8mJihyKz10KTtyZXR1cm4gcn19LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDE0NSk7ZS5leHBvcnRzPS9WZXJzaW9uXC8xMFwuXGQrKFwuXGQrKT8oIE1vYmlsZVwvXHcrKT8gU2FmYXJpXC8vLnRlc3Qobil9LGZ1bmN0aW9uKGUsdCxyKXtyKDE3Mik7dmFyIG49cig1Nyk7ZS5leHBvcnRzPW4oIlN0cmluZyIsInBhZEVuZCIpfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNiksaT1yKDE2OCkuZW5kO24oe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6cigxNzApfSx7cGFkRW5kOmZ1bmN0aW9uIHBhZEVuZChlKXtyZXR1cm4gaSh0aGlzLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbihlLHQscil7cigxNzQpO3ZhciBuPXIoMzkpO2UuZXhwb3J0cz1uLk9iamVjdC52YWx1ZXN9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDYpLGk9cigxNzUpLnZhbHVlcztuKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMH0se3ZhbHVlczpmdW5jdGlvbiB2YWx1ZXMoZSl7cmV0dXJuIGkoZSl9fSl9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDkpLGk9cig2OSksbz1yKDEzKSxhPXIoMTEpLmYsY3JlYXRlTWV0aG9kPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIHIscz1vKHQpLGM9aShzKSx1PWMubGVuZ3RoLGY9MCxsPVtdO3U+Zjspe3I9Y1tmKytdO24mJiFhLmNhbGwocyxyKXx8bC5wdXNoKGU/W3Isc1tyXV06c1tyXSl9cmV0dXJuIGx9fTtlLmV4cG9ydHM9e2VudHJpZXM6Y3JlYXRlTWV0aG9kKCEwKSx2YWx1ZXM6Y3JlYXRlTWV0aG9kKCExKX19LGZ1bmN0aW9uKGUsdCxyKXtyKDE3Nyk7dmFyIG49cigzOSk7ZS5leHBvcnRzPW4uT2JqZWN0LmVudHJpZXN9LGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yKDYpLGk9cigxNzUpLmVudHJpZXM7bih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtlbnRyaWVzOmZ1bmN0aW9uIGVudHJpZXMoZSl7cmV0dXJuIGkoZSl9fSl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSmJpZzJJbWFnZT12b2lkIDA7dmFyIG49cigxKSxpPXIoMTc5KSxvPXIoMTgwKSxhPXIoMTgxKTtmdW5jdGlvbiBfdHlwZW9mKGUpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YoZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbiBfdHlwZW9mKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihlLHQpe3JldHVybihfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YoZSx0KXtlLl9fcHJvdG9fXz10O3JldHVybiBlfSkoZSx0KX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIoZSl7dmFyIHQ9ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKTtyZXR1cm4hMH1jYXRjaChlKXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIHIsbj1fZ2V0UHJvdG90eXBlT2YoZSk7aWYodCl7dmFyIGk9X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO3I9UmVmbGVjdC5jb25zdHJ1Y3Qobixhcmd1bWVudHMsaSl9ZWxzZSByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLHIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihlLHQpe3JldHVybiF0fHwib2JqZWN0IiE9PV90eXBlb2YodCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoZSl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfShlKTp0fWZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihlKXtyZXR1cm4oX2dldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKGUpe3JldHVybiBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpfSkoZSl9dmFyIHM9ZnVuY3Rpb24oZSl7IWZ1bmN0aW9uIF9pbmhlcml0cyhlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTt0JiZfc2V0UHJvdG90eXBlT2YoZSx0KX0oSmJpZzJFcnJvcixlKTt2YXIgdD1fY3JlYXRlU3VwZXIoSmJpZzJFcnJvcik7ZnVuY3Rpb24gSmJpZzJFcnJvcihlKXshZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsSmJpZzJFcnJvcik7cmV0dXJuIHQuY2FsbCh0aGlzLCJKQklHMiBlcnJvcjogIi5jb25jYXQoZSkpfXJldHVybiBKYmlnMkVycm9yfShuLkJhc2VFeGNlcHRpb24pLGM9ZnVuY3Rpb24gSmJpZzJJbWFnZUNsb3N1cmUoKXtmdW5jdGlvbiBDb250ZXh0Q2FjaGUoKXt9Q29udGV4dENhY2hlLnByb3RvdHlwZT17Z2V0Q29udGV4dHM6ZnVuY3Rpb24gZ2V0Q29udGV4dHMoZSl7cmV0dXJuIGUgaW4gdGhpcz90aGlzW2VdOnRoaXNbZV09bmV3IEludDhBcnJheSg2NTUzNil9fTtmdW5jdGlvbiBEZWNvZGluZ0NvbnRleHQoZSx0LHIpe3RoaXMuZGF0YT1lO3RoaXMuc3RhcnQ9dDt0aGlzLmVuZD1yfURlY29kaW5nQ29udGV4dC5wcm90b3R5cGU9e2dldCBkZWNvZGVyKCl7dmFyIGU9bmV3IG8uQXJpdGhtZXRpY0RlY29kZXIodGhpcy5kYXRhLHRoaXMuc3RhcnQsdGhpcy5lbmQpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJkZWNvZGVyIixlKX0sZ2V0IGNvbnRleHRDYWNoZSgpe3ZhciBlPW5ldyBDb250ZXh0Q2FjaGU7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImNvbnRleHRDYWNoZSIsZSl9fTtmdW5jdGlvbiBkZWNvZGVJbnRlZ2VyKGUsdCxyKXt2YXIgbj1lLmdldENvbnRleHRzKHQpLGk9MTtmdW5jdGlvbiByZWFkQml0cyhlKXtmb3IodmFyIHQ9MCxvPTA7bzxlO28rKyl7dmFyIGE9ci5yZWFkQml0KG4saSk7aT1pPDI1Nj9pPDwxfGE6NTExJihpPDwxfGEpfDI1Njt0PXQ8PDF8YX1yZXR1cm4gdD4+PjB9dmFyIG89cmVhZEJpdHMoMSksYT1yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygzMikrNDQzNjpyZWFkQml0cygxMikrMzQwOnJlYWRCaXRzKDgpKzg0OnJlYWRCaXRzKDYpKzIwOnJlYWRCaXRzKDQpKzQ6cmVhZEJpdHMoMik7cmV0dXJuIDA9PT1vP2E6YT4wPy1hOm51bGx9ZnVuY3Rpb24gZGVjb2RlSUFJRChlLHQscil7Zm9yKHZhciBuPWUuZ2V0Q29udGV4dHMoIklBSUQiKSxpPTEsbz0wO288cjtvKyspe2k9aTw8MXx0LnJlYWRCaXQobixpKX1yZXR1cm4gcjwzMT9pJigxPDxyKS0xOjIxNDc0ODM2NDcmaX12YXIgZT1bIlN5bWJvbERpY3Rpb25hcnkiLG51bGwsbnVsbCxudWxsLCJJbnRlcm1lZGlhdGVUZXh0UmVnaW9uIixudWxsLCJJbW1lZGlhdGVUZXh0UmVnaW9uIiwiSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIlBhdHRlcm5EaWN0aW9uYXJ5IixudWxsLG51bGwsbnVsbCwiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb24iLG51bGwsIkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwiSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLG51bGwsIkltbWVkaWF0ZUdlbmVyaWNSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWZpbmVtZW50UmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLCJQYWdlSW5mb3JtYXRpb24iLCJFbmRPZlBhZ2UiLCJFbmRPZlN0cmlwZSIsIkVuZE9mRmlsZSIsIlByb2ZpbGVzIiwiVGFibGVzIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkV4dGVuc2lvbiJdLHQ9W1t7eDotMSx5Oi0yfSx7eDowLHk6LTJ9LHt4OjEseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4OjIseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV0sW3t4Oi0xLHk6LTJ9LHt4OjAseTotMn0se3g6MSx5Oi0yfSx7eDoyLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDoyLHk6LTF9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XSxbe3g6LTEseTotMn0se3g6MCx5Oi0yfSx7eDoxLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMix5OjB9LHt4Oi0xLHk6MH1dLFt7eDotMyx5Oi0xfSx7eDotMix5Oi0xfSx7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV1dLHI9W3tjb2Rpbmc6W3t4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9XSxyZWZlcmVuY2U6W3t4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9LHt4OjAseTowfSx7eDoxLHk6MH0se3g6LTEseToxfSx7eDowLHk6MX0se3g6MSx5OjF9XX0se2NvZGluZzpbe3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH1dLHJlZmVyZW5jZTpbe3g6MCx5Oi0xfSx7eDotMSx5OjB9LHt4OjAseTowfSx7eDoxLHk6MH0se3g6MCx5OjF9LHt4OjEseToxfV19XSxjPVszOTcxNywxOTQxLDIyOSw0MDVdLHU9WzMyLDhdO2Z1bmN0aW9uIGRlY29kZUJpdG1hcChlLHIsbixpLG8sYSxzLHUpe2lmKGUpe3JldHVybiBkZWNvZGVNTVJCaXRtYXAobmV3IFJlYWRlcih1LmRhdGEsdS5zdGFydCx1LmVuZCkscixuLCExKX1pZigwPT09aSYmIWEmJiFvJiY0PT09cy5sZW5ndGgmJjM9PT1zWzBdLngmJi0xPT09c1swXS55JiYtMz09PXNbMV0ueCYmLTE9PT1zWzFdLnkmJjI9PT1zWzJdLngmJi0yPT09c1syXS55JiYtMj09PXNbM10ueCYmLTI9PT1zWzNdLnkpcmV0dXJuIGZ1bmN0aW9uIGRlY29kZUJpdG1hcFRlbXBsYXRlMChlLHQscil7dmFyIG4saSxvLGEscyxjLHUsZj1yLmRlY29kZXIsbD1yLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxwPVtdO2ZvcihpPTA7aTx0O2krKyl7cz1wW2ldPW5ldyBVaW50OEFycmF5KGUpO2M9aTwxP3M6cFtpLTFdO249KHU9aTwyP3M6cFtpLTJdKVswXTw8MTN8dVsxXTw8MTJ8dVsyXTw8MTF8Y1swXTw8N3xjWzFdPDw2fGNbMl08PDV8Y1szXTw8NDtmb3Iobz0wO288ZTtvKyspe3Nbb109YT1mLnJlYWRCaXQobCxuKTtuPSgzMTczNSZuKTw8MXwobyszPGU/dVtvKzNdPDwxMTowKXwobys0PGU/Y1tvKzRdPDw0OjApfGF9fXJldHVybiBwfShyLG4sdSk7dmFyIGY9ISFhLGw9dFtpXS5jb25jYXQocyk7bC5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLnktdC55fHxlLngtdC54fSkpO3ZhciBwLGQsaD1sLmxlbmd0aCxnPW5ldyBJbnQ4QXJyYXkoaCksdj1uZXcgSW50OEFycmF5KGgpLG09W10seT0wLGI9MCx4PTAsdz0wO2ZvcihkPTA7ZDxoO2QrKyl7Z1tkXT1sW2RdLng7dltkXT1sW2RdLnk7Yj1NYXRoLm1pbihiLGxbZF0ueCk7eD1NYXRoLm1heCh4LGxbZF0ueCk7dz1NYXRoLm1pbih3LGxbZF0ueSk7ZDxoLTEmJmxbZF0ueT09PWxbZCsxXS55JiZsW2RdLng9PT1sW2QrMV0ueC0xP3l8PTE8PGgtMS1kOm0ucHVzaChkKX12YXIgUz1tLmxlbmd0aCxfPW5ldyBJbnQ4QXJyYXkoUyksVD1uZXcgSW50OEFycmF5KFMpLFA9bmV3IFVpbnQxNkFycmF5KFMpO2ZvcihwPTA7cDxTO3ArKyl7ZD1tW3BdO19bcF09bFtkXS54O1RbcF09bFtkXS55O1BbcF09MTw8aC0xLWR9Zm9yKHZhciBDLGssSSxPLEUsQT0tYixSPS13LE09ci14LEQ9Y1tpXSxMPW5ldyBVaW50OEFycmF5KHIpLEI9W10sVT11LmRlY29kZXIsTj11LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxqPTAsej0wLEg9MDtIPG47SCsrKXtpZihvKXtpZihqXj1VLnJlYWRCaXQoTixEKSl7Qi5wdXNoKEwpO2NvbnRpbnVlfX1MPW5ldyBVaW50OEFycmF5KEwpO0IucHVzaChMKTtmb3IoQz0wO0M8cjtDKyspaWYoZiYmYVtIXVtDXSlMW0NdPTA7ZWxzZXtpZihDPj1BJiZDPE0mJkg+PVIpe3o9ejw8MSZ5O2ZvcihkPTA7ZDxTO2QrKyl7az1IK1RbZF07ST1DK19bZF07KE89QltrXVtJXSkmJih6fD1PPVBbZF0pfX1lbHNle3o9MDtFPWgtMTtmb3IoZD0wO2Q8aDtkKyssRS0tKShJPUMrZ1tkXSk+PTAmJkk8ciYmKGs9SCt2W2RdKT49MCYmKE89QltrXVtJXSkmJih6fD1PPDxFKX12YXIgVz1VLnJlYWRCaXQoTix6KTtMW0NdPVd9fXJldHVybiBCfWZ1bmN0aW9uIGRlY29kZVJlZmluZW1lbnQoZSx0LG4saSxvLGEsYyxmLGwpe3ZhciBwPXJbbl0uY29kaW5nOzA9PT1uJiYocD1wLmNvbmNhdChbZlswXV0pKTt2YXIgZCxoPXAubGVuZ3RoLGc9bmV3IEludDMyQXJyYXkoaCksdj1uZXcgSW50MzJBcnJheShoKTtmb3IoZD0wO2Q8aDtkKyspe2dbZF09cFtkXS54O3ZbZF09cFtkXS55fXZhciBtPXJbbl0ucmVmZXJlbmNlOzA9PT1uJiYobT1tLmNvbmNhdChbZlsxXV0pKTt2YXIgeT1tLmxlbmd0aCxiPW5ldyBJbnQzMkFycmF5KHkpLHg9bmV3IEludDMyQXJyYXkoeSk7Zm9yKGQ9MDtkPHk7ZCsrKXtiW2RdPW1bZF0ueDt4W2RdPW1bZF0ueX1mb3IodmFyIHc9aVswXS5sZW5ndGgsUz1pLmxlbmd0aCxfPXVbbl0sVD1bXSxQPWwuZGVjb2RlcixDPWwuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpLGs9MCxJPTA7STx0O0krKyl7aWYoYyl7aWYoa149UC5yZWFkQml0KEMsXykpdGhyb3cgbmV3IHMoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpfXZhciBPPW5ldyBVaW50OEFycmF5KGUpO1QucHVzaChPKTtmb3IodmFyIEU9MDtFPGU7RSsrKXt2YXIgQSxSLE09MDtmb3IoZD0wO2Q8aDtkKyspe0E9SSt2W2RdO1I9RStnW2RdO0E8MHx8UjwwfHxSPj1lP008PD0xOk09TTw8MXxUW0FdW1JdfWZvcihkPTA7ZDx5O2QrKyl7QT1JK3hbZF0tYTtSPUUrYltkXS1vO0E8MHx8QT49U3x8UjwwfHxSPj13P008PD0xOk09TTw8MXxpW0FdW1JdfXZhciBEPVAucmVhZEJpdChDLE0pO09bRV09RH19cmV0dXJuIFR9ZnVuY3Rpb24gZGVjb2RlVGV4dFJlZ2lvbihlLHQscixuLGksbyxhLGMsdSxmLGwscCxkLGgsZyx2LG0seSxiKXtpZihlJiZ0KXRocm93IG5ldyBzKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7dmFyIHgsdyxTPVtdO2Zvcih4PTA7eDxuO3grKyl7dz1uZXcgVWludDhBcnJheShyKTtpZihpKWZvcih2YXIgXz0wO188cjtfKyspd1tfXT1pO1MucHVzaCh3KX12YXIgVD1tLmRlY29kZXIsUD1tLmNvbnRleHRDYWNoZSxDPWU/LWgudGFibGVEZWx0YVQuZGVjb2RlKGIpOi1kZWNvZGVJbnRlZ2VyKFAsIklBRFQiLFQpLGs9MDt4PTA7Zm9yKDt4PG87KXtDKz1lP2gudGFibGVEZWx0YVQuZGVjb2RlKGIpOmRlY29kZUludGVnZXIoUCwiSUFEVCIsVCk7Zm9yKHZhciBJPWsrPWU/aC50YWJsZUZpcnN0Uy5kZWNvZGUoYik6ZGVjb2RlSW50ZWdlcihQLCJJQUZTIixUKTs7KXt2YXIgTz0wO2E+MSYmKE89ZT9iLnJlYWRCaXRzKHkpOmRlY29kZUludGVnZXIoUCwiSUFJVCIsVCkpO3ZhciBFPWEqQytPLEE9ZT9oLnN5bWJvbElEVGFibGUuZGVjb2RlKGIpOmRlY29kZUlBSUQoUCxULHUpLFI9dCYmKGU/Yi5yZWFkQml0KCk6ZGVjb2RlSW50ZWdlcihQLCJJQVJJIixUKSksTT1jW0FdLEQ9TVswXS5sZW5ndGgsTD1NLmxlbmd0aDtpZihSKXt2YXIgQj1kZWNvZGVJbnRlZ2VyKFAsIklBUkRXIixUKSxVPWRlY29kZUludGVnZXIoUCwiSUFSREgiLFQpO009ZGVjb2RlUmVmaW5lbWVudChEKz1CLEwrPVUsZyxNLChCPj4xKStkZWNvZGVJbnRlZ2VyKFAsIklBUkRYIixUKSwoVT4+MSkrZGVjb2RlSW50ZWdlcihQLCJJQVJEWSIsVCksITEsdixtKX12YXIgTixqLHosSD1FLSgxJnA/MDpMLTEpLFc9SS0oMiZwP0QtMTowKTtpZihmKXtmb3IoTj0wO048TDtOKyspaWYodz1TW1crTl0pe3o9TVtOXTt2YXIgWD1NYXRoLm1pbihyLUgsRCk7c3dpdGNoKGQpe2Nhc2UgMDpmb3Ioaj0wO2o8WDtqKyspd1tIK2pdfD16W2pdO2JyZWFrO2Nhc2UgMjpmb3Ioaj0wO2o8WDtqKyspd1tIK2pdXj16W2pdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHMoIm9wZXJhdG9yICIuY29uY2F0KGQsIiBpcyBub3Qgc3VwcG9ydGVkIikpfX1JKz1MLTF9ZWxzZXtmb3Ioaj0wO2o8TDtqKyspaWYodz1TW0gral0pe3o9TVtqXTtzd2l0Y2goZCl7Y2FzZSAwOmZvcihOPTA7TjxEO04rKyl3W1crTl18PXpbTl07YnJlYWs7Y2FzZSAyOmZvcihOPTA7TjxEO04rKyl3W1crTl1ePXpbTl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgcygib3BlcmF0b3IgIi5jb25jYXQoZCwiIGlzIG5vdCBzdXBwb3J0ZWQiKSl9fUkrPUQtMX14Kys7dmFyIHE9ZT9oLnRhYmxlRGVsdGFTLmRlY29kZShiKTpkZWNvZGVJbnRlZ2VyKFAsIklBRFMiLFQpO2lmKG51bGw9PT1xKWJyZWFrO0krPXErbH19cmV0dXJuIFN9ZnVuY3Rpb24gcmVhZFNlZ21lbnRIZWFkZXIodCxyKXt2YXIgbj17fTtuLm51bWJlcj0oMCxpLnJlYWRVaW50MzIpKHQscik7dmFyIG89dFtyKzRdLGE9NjMmbztpZighZVthXSl0aHJvdyBuZXcgcygiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIrYSk7bi50eXBlPWE7bi50eXBlTmFtZT1lW2FdO24uZGVmZXJyZWROb25SZXRhaW49ISEoMTI4Jm8pO3ZhciBjPSEhKDY0Jm8pLHU9dFtyKzVdLGw9dT4+NSY3LHA9WzMxJnVdLGQ9cis2O2lmKDc9PT11KXtsPTUzNjg3MDkxMSYoMCxpLnJlYWRVaW50MzIpKHQsZC0xKTtkKz0zO3ZhciBoPWwrNz4+MztwWzBdPXRbZCsrXTtmb3IoOy0taD4wOylwLnB1c2godFtkKytdKX1lbHNlIGlmKDU9PT11fHw2PT09dSl0aHJvdyBuZXcgcygiaW52YWxpZCByZWZlcnJlZC10byBmbGFncyIpO24ucmV0YWluQml0cz1wO3ZhciBnPTQ7bi5udW1iZXI8PTI1Nj9nPTE6bi5udW1iZXI8PTY1NTM2JiYoZz0yKTt2YXIgdixtLHk9W107Zm9yKHY9MDt2PGw7disrKXt2YXIgYj12b2lkIDA7Yj0xPT09Zz90W2RdOjI9PT1nPygwLGkucmVhZFVpbnQxNikodCxkKTooMCxpLnJlYWRVaW50MzIpKHQsZCk7eS5wdXNoKGIpO2QrPWd9bi5yZWZlcnJlZFRvPXk7aWYoYyl7bi5wYWdlQXNzb2NpYXRpb249KDAsaS5yZWFkVWludDMyKSh0LGQpO2QrPTR9ZWxzZSBuLnBhZ2VBc3NvY2lhdGlvbj10W2QrK107bi5sZW5ndGg9KDAsaS5yZWFkVWludDMyKSh0LGQpO2QrPTQ7aWYoNDI5NDk2NzI5NT09PW4ubGVuZ3RoKXtpZigzOCE9PWEpdGhyb3cgbmV3IHMoImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aCIpO3ZhciB4PXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24odCxkKSx3PSEhKDEmdFtkK2ZdKSxTPW5ldyBVaW50OEFycmF5KDYpO2lmKCF3KXtTWzBdPTI1NTtTWzFdPTE3Mn1TWzJdPXguaGVpZ2h0Pj4+MjQmMjU1O1NbM109eC5oZWlnaHQ+PjE2JjI1NTtTWzRdPXguaGVpZ2h0Pj44JjI1NTtTWzVdPTI1NSZ4LmhlaWdodDtmb3Iodj1kLG09dC5sZW5ndGg7djxtO3YrKyl7Zm9yKHZhciBfPTA7Xzw2JiZTW19dPT09dFt2K19dOylfKys7aWYoNj09PV8pe24ubGVuZ3RoPXYrNjticmVha319aWYoNDI5NDk2NzI5NT09PW4ubGVuZ3RoKXRocm93IG5ldyBzKCJzZWdtZW50IGVuZCB3YXMgbm90IGZvdW5kIil9bi5oZWFkZXJFbmQ9ZDtyZXR1cm4gbn1mdW5jdGlvbiByZWFkU2VnbWVudHMoZSx0LHIsbil7Zm9yKHZhciBpPVtdLG89cjtvPG47KXt2YXIgYT1yZWFkU2VnbWVudEhlYWRlcih0LG8pO289YS5oZWFkZXJFbmQ7dmFyIHM9e2hlYWRlcjphLGRhdGE6dH07aWYoIWUucmFuZG9tQWNjZXNzKXtzLnN0YXJ0PW87bys9YS5sZW5ndGg7cy5lbmQ9b31pLnB1c2gocyk7aWYoNTE9PT1hLnR5cGUpYnJlYWt9aWYoZS5yYW5kb21BY2Nlc3MpZm9yKHZhciBjPTAsdT1pLmxlbmd0aDtjPHU7YysrKXtpW2NdLnN0YXJ0PW87bys9aVtjXS5oZWFkZXIubGVuZ3RoO2lbY10uZW5kPW99cmV0dXJuIGl9ZnVuY3Rpb24gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihlLHQpe3JldHVybnt3aWR0aDooMCxpLnJlYWRVaW50MzIpKGUsdCksaGVpZ2h0OigwLGkucmVhZFVpbnQzMikoZSx0KzQpLHg6KDAsaS5yZWFkVWludDMyKShlLHQrOCkseTooMCxpLnJlYWRVaW50MzIpKGUsdCsxMiksY29tYmluYXRpb25PcGVyYXRvcjo3JmVbdCsxNl19fXZhciBmPTE3O2Z1bmN0aW9uIHByb2Nlc3NTZWdtZW50KGUsdCl7dmFyIHIsbixvLGEsYz1lLmhlYWRlcix1PWUuZGF0YSxsPWUuc3RhcnQscD1lLmVuZDtzd2l0Y2goYy50eXBlKXtjYXNlIDA6dmFyIGQ9e30saD0oMCxpLnJlYWRVaW50MTYpKHUsbCk7ZC5odWZmbWFuPSEhKDEmaCk7ZC5yZWZpbmVtZW50PSEhKDImaCk7ZC5odWZmbWFuREhTZWxlY3Rvcj1oPj4yJjM7ZC5odWZmbWFuRFdTZWxlY3Rvcj1oPj40JjM7ZC5iaXRtYXBTaXplU2VsZWN0b3I9aD4+NiYxO2QuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3Rvcj1oPj43JjE7ZC5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZD0hISgyNTYmaCk7ZC5iaXRtYXBDb2RpbmdDb250ZXh0UmV0YWluZWQ9ISEoNTEyJmgpO2QudGVtcGxhdGU9aD4+MTAmMztkLnJlZmluZW1lbnRUZW1wbGF0ZT1oPj4xMiYxO2wrPTI7aWYoIWQuaHVmZm1hbil7YT0wPT09ZC50ZW1wbGF0ZT80OjE7bj1bXTtmb3Iobz0wO288YTtvKyspe24ucHVzaCh7eDooMCxpLnJlYWRJbnQ4KSh1LGwpLHk6KDAsaS5yZWFkSW50OCkodSxsKzEpfSk7bCs9Mn1kLmF0PW59aWYoZC5yZWZpbmVtZW50JiYhZC5yZWZpbmVtZW50VGVtcGxhdGUpe249W107Zm9yKG89MDtvPDI7bysrKXtuLnB1c2goe3g6KDAsaS5yZWFkSW50OCkodSxsKSx5OigwLGkucmVhZEludDgpKHUsbCsxKX0pO2wrPTJ9ZC5yZWZpbmVtZW50QXQ9bn1kLm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzPSgwLGkucmVhZFVpbnQzMikodSxsKTtsKz00O2QubnVtYmVyT2ZOZXdTeW1ib2xzPSgwLGkucmVhZFVpbnQzMikodSxsKTtsKz00O3I9W2QsYy5udW1iZXIsYy5yZWZlcnJlZFRvLHUsbCxwXTticmVhaztjYXNlIDY6Y2FzZSA3OnZhciBnPXt9O2cuaW5mbz1yZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKHUsbCk7bCs9Zjt2YXIgdj0oMCxpLnJlYWRVaW50MTYpKHUsbCk7bCs9MjtnLmh1ZmZtYW49ISEoMSZ2KTtnLnJlZmluZW1lbnQ9ISEoMiZ2KTtnLmxvZ1N0cmlwU2l6ZT12Pj4yJjM7Zy5zdHJpcFNpemU9MTw8Zy5sb2dTdHJpcFNpemU7Zy5yZWZlcmVuY2VDb3JuZXI9dj4+NCYzO2cudHJhbnNwb3NlZD0hISg2NCZ2KTtnLmNvbWJpbmF0aW9uT3BlcmF0b3I9dj4+NyYzO2cuZGVmYXVsdFBpeGVsVmFsdWU9dj4+OSYxO2cuZHNPZmZzZXQ9djw8MTc+PjI3O2cucmVmaW5lbWVudFRlbXBsYXRlPXY+PjE1JjE7aWYoZy5odWZmbWFuKXt2YXIgbT0oMCxpLnJlYWRVaW50MTYpKHUsbCk7bCs9MjtnLmh1ZmZtYW5GUz0zJm07Zy5odWZmbWFuRFM9bT4+MiYzO2cuaHVmZm1hbkRUPW0+PjQmMztnLmh1ZmZtYW5SZWZpbmVtZW50RFc9bT4+NiYzO2cuaHVmZm1hblJlZmluZW1lbnRESD1tPj44JjM7Zy5odWZmbWFuUmVmaW5lbWVudERYPW0+PjEwJjM7Zy5odWZmbWFuUmVmaW5lbWVudERZPW0+PjEyJjM7Zy5odWZmbWFuUmVmaW5lbWVudFNpemVTZWxlY3Rvcj0hISgxNjM4NCZtKX1pZihnLnJlZmluZW1lbnQmJiFnLnJlZmluZW1lbnRUZW1wbGF0ZSl7bj1bXTtmb3Iobz0wO288MjtvKyspe24ucHVzaCh7eDooMCxpLnJlYWRJbnQ4KSh1LGwpLHk6KDAsaS5yZWFkSW50OCkodSxsKzEpfSk7bCs9Mn1nLnJlZmluZW1lbnRBdD1ufWcubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXM9KDAsaS5yZWFkVWludDMyKSh1LGwpO2wrPTQ7cj1bZyxjLnJlZmVycmVkVG8sdSxsLHBdO2JyZWFrO2Nhc2UgMTY6dmFyIHk9e30sYj11W2wrK107eS5tbXI9ISEoMSZiKTt5LnRlbXBsYXRlPWI+PjEmMzt5LnBhdHRlcm5XaWR0aD11W2wrK107eS5wYXR0ZXJuSGVpZ2h0PXVbbCsrXTt5Lm1heFBhdHRlcm5JbmRleD0oMCxpLnJlYWRVaW50MzIpKHUsbCk7bCs9NDtyPVt5LGMubnVtYmVyLHUsbCxwXTticmVhaztjYXNlIDIyOmNhc2UgMjM6dmFyIHg9e307eC5pbmZvPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24odSxsKTtsKz1mO3ZhciB3PXVbbCsrXTt4Lm1tcj0hISgxJncpO3gudGVtcGxhdGU9dz4+MSYzO3guZW5hYmxlU2tpcD0hISg4JncpO3guY29tYmluYXRpb25PcGVyYXRvcj13Pj40Jjc7eC5kZWZhdWx0UGl4ZWxWYWx1ZT13Pj43JjE7eC5ncmlkV2lkdGg9KDAsaS5yZWFkVWludDMyKSh1LGwpO2wrPTQ7eC5ncmlkSGVpZ2h0PSgwLGkucmVhZFVpbnQzMikodSxsKTtsKz00O3guZ3JpZE9mZnNldFg9NDI5NDk2NzI5NSYoMCxpLnJlYWRVaW50MzIpKHUsbCk7bCs9NDt4LmdyaWRPZmZzZXRZPTQyOTQ5NjcyOTUmKDAsaS5yZWFkVWludDMyKSh1LGwpO2wrPTQ7eC5ncmlkVmVjdG9yWD0oMCxpLnJlYWRVaW50MTYpKHUsbCk7bCs9Mjt4LmdyaWRWZWN0b3JZPSgwLGkucmVhZFVpbnQxNikodSxsKTtsKz0yO3I9W3gsYy5yZWZlcnJlZFRvLHUsbCxwXTticmVhaztjYXNlIDM4OmNhc2UgMzk6dmFyIFM9e307Uy5pbmZvPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24odSxsKTtsKz1mO3ZhciBfPXVbbCsrXTtTLm1tcj0hISgxJl8pO1MudGVtcGxhdGU9Xz4+MSYzO1MucHJlZGljdGlvbj0hISg4Jl8pO2lmKCFTLm1tcil7YT0wPT09Uy50ZW1wbGF0ZT80OjE7bj1bXTtmb3Iobz0wO288YTtvKyspe24ucHVzaCh7eDooMCxpLnJlYWRJbnQ4KSh1LGwpLHk6KDAsaS5yZWFkSW50OCkodSxsKzEpfSk7bCs9Mn1TLmF0PW59cj1bUyx1LGwscF07YnJlYWs7Y2FzZSA0ODp2YXIgVD17d2lkdGg6KDAsaS5yZWFkVWludDMyKSh1LGwpLGhlaWdodDooMCxpLnJlYWRVaW50MzIpKHUsbCs0KSxyZXNvbHV0aW9uWDooMCxpLnJlYWRVaW50MzIpKHUsbCs4KSxyZXNvbHV0aW9uWTooMCxpLnJlYWRVaW50MzIpKHUsbCsxMil9OzQyOTQ5NjcyOTU9PT1ULmhlaWdodCYmZGVsZXRlIFQuaGVpZ2h0O3ZhciBQPXVbbCsxNl07KDAsaS5yZWFkVWludDE2KSh1LGwrMTcpO1QubG9zc2xlc3M9ISEoMSZQKTtULnJlZmluZW1lbnQ9ISEoMiZQKTtULmRlZmF1bHRQaXhlbFZhbHVlPVA+PjImMTtULmNvbWJpbmF0aW9uT3BlcmF0b3I9UD4+MyYzO1QucmVxdWlyZXNCdWZmZXI9ISEoMzImUCk7VC5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGU9ISEoNjQmUCk7cj1bVF07YnJlYWs7Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6YnJlYWs7Y2FzZSA1MzpyPVtjLm51bWJlcix1LGwscF07YnJlYWs7Y2FzZSA2MjpicmVhaztkZWZhdWx0OnRocm93IG5ldyBzKCJzZWdtZW50IHR5cGUgIi5jb25jYXQoYy50eXBlTmFtZSwiKCIpLmNvbmNhdChjLnR5cGUsIikiKSsiIGlzIG5vdCBpbXBsZW1lbnRlZCIpfXZhciBDPSJvbiIrYy50eXBlTmFtZTtDIGluIHQmJnRbQ10uYXBwbHkodCxyKX1mdW5jdGlvbiBwcm9jZXNzU2VnbWVudHMoZSx0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspcHJvY2Vzc1NlZ21lbnQoZVtyXSx0KX1mdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcigpe31TaW1wbGVTZWdtZW50VmlzaXRvci5wcm90b3R5cGU9e29uUGFnZUluZm9ybWF0aW9uOmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uUGFnZUluZm9ybWF0aW9uKGUpe3RoaXMuY3VycmVudFBhZ2VJbmZvPWU7dmFyIHQ9ZS53aWR0aCs3Pj4zLHI9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQqZS5oZWlnaHQpO2lmKGUuZGVmYXVsdFBpeGVsVmFsdWUpZm9yKHZhciBuPTAsaT1yLmxlbmd0aDtuPGk7bisrKXJbbl09MjU1O3RoaXMuYnVmZmVyPXJ9LGRyYXdCaXRtYXA6ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3JfZHJhd0JpdG1hcChlLHQpe3ZhciByLG4saSxvLGE9dGhpcy5jdXJyZW50UGFnZUluZm8sYz1lLndpZHRoLHU9ZS5oZWlnaHQsZj1hLndpZHRoKzc+PjMsbD1hLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZT9lLmNvbWJpbmF0aW9uT3BlcmF0b3I6YS5jb21iaW5hdGlvbk9wZXJhdG9yLHA9dGhpcy5idWZmZXIsZD0xMjg+Pig3JmUueCksaD1lLnkqZisoZS54Pj4zKTtzd2l0Y2gobCl7Y2FzZSAwOmZvcihyPTA7cjx1O3IrKyl7aT1kO289aDtmb3Iobj0wO248YztuKyspe3Rbcl1bbl0mJihwW29dfD1pKTtpZighKGk+Pj0xKSl7aT0xMjg7bysrfX1oKz1mfWJyZWFrO2Nhc2UgMjpmb3Iocj0wO3I8dTtyKyspe2k9ZDtvPWg7Zm9yKG49MDtuPGM7bisrKXt0W3JdW25dJiYocFtvXV49aSk7aWYoIShpPj49MSkpe2k9MTI4O28rK319aCs9Zn1icmVhaztkZWZhdWx0OnRocm93IG5ldyBzKCJvcGVyYXRvciAiLmNvbmNhdChsLCIgaXMgbm90IHN1cHBvcnRlZCIpKX19LG9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbjpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24oZSx0LHIsbil7dmFyIGk9ZS5pbmZvLG89bmV3IERlY29kaW5nQ29udGV4dCh0LHIsbiksYT1kZWNvZGVCaXRtYXAoZS5tbXIsaS53aWR0aCxpLmhlaWdodCxlLnRlbXBsYXRlLGUucHJlZGljdGlvbixudWxsLGUuYXQsbyk7dGhpcy5kcmF3Qml0bWFwKGksYSl9LG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uOmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCl7dGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvblN5bWJvbERpY3Rpb25hcnk6ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25TeW1ib2xEaWN0aW9uYXJ5KGUsdCxyLG4sbyxhKXt2YXIgYyx1O2lmKGUuaHVmZm1hbil7Yz1mdW5jdGlvbiBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhlLHQscil7dmFyIG4saSxvLGEsYz0wO3N3aXRjaChlLmh1ZmZtYW5ESFNlbGVjdG9yKXtjYXNlIDA6Y2FzZSAxOm49Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5ESFNlbGVjdG9yKzQpO2JyZWFrO2Nhc2UgMzpuPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShjLHQscik7YysrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHMoImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpfXN3aXRjaChlLmh1ZmZtYW5EV1NlbGVjdG9yKXtjYXNlIDA6Y2FzZSAxOmk9Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5EV1NlbGVjdG9yKzIpO2JyZWFrO2Nhc2UgMzppPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShjLHQscik7YysrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHMoImludmFsaWQgSHVmZm1hbiBEVyBzZWxlY3RvciIpfWlmKGUuYml0bWFwU2l6ZVNlbGVjdG9yKXtvPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShjLHQscik7YysrfWVsc2Ugbz1nZXRTdGFuZGFyZFRhYmxlKDEpO2E9ZS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yP2dldEN1c3RvbUh1ZmZtYW5UYWJsZShjLHQscik6Z2V0U3RhbmRhcmRUYWJsZSgxKTtyZXR1cm57dGFibGVEZWx0YUhlaWdodDpuLHRhYmxlRGVsdGFXaWR0aDppLHRhYmxlQml0bWFwU2l6ZTpvLHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzOmF9fShlLHIsdGhpcy5jdXN0b21UYWJsZXMpO3U9bmV3IFJlYWRlcihuLG8sYSl9dmFyIGY9dGhpcy5zeW1ib2xzO2Z8fCh0aGlzLnN5bWJvbHM9Zj17fSk7Zm9yKHZhciBsPVtdLHA9MCxkPXIubGVuZ3RoO3A8ZDtwKyspe3ZhciBoPWZbcltwXV07aCYmKGw9bC5jb25jYXQoaCkpfXZhciBnPW5ldyBEZWNvZGluZ0NvbnRleHQobixvLGEpO2ZbdF09ZnVuY3Rpb24gZGVjb2RlU3ltYm9sRGljdGlvbmFyeShlLHQscixuLG8sYSxjLHUsZixsLHAsZCl7aWYoZSYmdCl0aHJvdyBuZXcgcygic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTt2YXIgaCxnLHY9W10sbT0wLHk9KDAsaS5sb2cyKShyLmxlbmd0aCtuKSxiPXAuZGVjb2Rlcix4PXAuY29udGV4dENhY2hlO2lmKGUpe2g9Z2V0U3RhbmRhcmRUYWJsZSgxKTtnPVtdO3k9TWF0aC5tYXgoeSwxKX1mb3IoO3YubGVuZ3RoPG47KXttKz1lP2EudGFibGVEZWx0YUhlaWdodC5kZWNvZGUoZCk6ZGVjb2RlSW50ZWdlcih4LCJJQURIIixiKTtmb3IodmFyIHc9MCxTPTAsXz1lP2cubGVuZ3RoOjA7Oyl7dmFyIFQsUD1lP2EudGFibGVEZWx0YVdpZHRoLmRlY29kZShkKTpkZWNvZGVJbnRlZ2VyKHgsIklBRFciLGIpO2lmKG51bGw9PT1QKWJyZWFrO1MrPXcrPVA7aWYodCl7dmFyIEM9ZGVjb2RlSW50ZWdlcih4LCJJQUFJIixiKTtpZihDPjEpVD1kZWNvZGVUZXh0UmVnaW9uKGUsdCx3LG0sMCxDLDEsci5jb25jYXQodikseSwwLDAsMSwwLGEsZixsLHAsMCxkKTtlbHNle3ZhciBrPWRlY29kZUlBSUQoeCxiLHkpLEk9ZGVjb2RlSW50ZWdlcih4LCJJQVJEWCIsYiksTz1kZWNvZGVJbnRlZ2VyKHgsIklBUkRZIixiKTtUPWRlY29kZVJlZmluZW1lbnQodyxtLGYsazxyLmxlbmd0aD9yW2tdOnZbay1yLmxlbmd0aF0sSSxPLCExLGwscCl9di5wdXNoKFQpfWVsc2UgaWYoZSlnLnB1c2godyk7ZWxzZXtUPWRlY29kZUJpdG1hcCghMSx3LG0sYywhMSxudWxsLHUscCk7di5wdXNoKFQpfX1pZihlJiYhdCl7dmFyIEU9YS50YWJsZUJpdG1hcFNpemUuZGVjb2RlKGQpO2QuYnl0ZUFsaWduKCk7dmFyIEE9dm9pZCAwO2lmKDA9PT1FKUE9cmVhZFVuY29tcHJlc3NlZEJpdG1hcChkLFMsbSk7ZWxzZXt2YXIgUj1kLmVuZCxNPWQucG9zaXRpb24rRTtkLmVuZD1NO0E9ZGVjb2RlTU1SQml0bWFwKGQsUyxtLCExKTtkLmVuZD1SO2QucG9zaXRpb249TX12YXIgRD1nLmxlbmd0aDtpZihfPT09RC0xKXYucHVzaChBKTtlbHNle3ZhciBMPXZvaWQgMCxCPXZvaWQgMCxVPTAsTj12b2lkIDAsaj12b2lkIDA7Zm9yKEw9XztMPEQ7TCsrKXtOPVUrZ1tMXTtqPVtdO2ZvcihCPTA7QjxtO0IrKylqLnB1c2goQVtCXS5zdWJhcnJheShVLE4pKTt2LnB1c2goaik7VT1OfX19fWZvcih2YXIgej1bXSxIPVtdLFc9ITEsWD1yLmxlbmd0aCtuO0gubGVuZ3RoPFg7KXtmb3IodmFyIHE9ZT9oLmRlY29kZShkKTpkZWNvZGVJbnRlZ2VyKHgsIklBRVgiLGIpO3EtLTspSC5wdXNoKFcpO1c9IVd9Zm9yKHZhciBZPTAsVj1yLmxlbmd0aDtZPFY7WSsrKUhbWV0mJnoucHVzaChyW1ldKTtmb3IodmFyIEo9MDtKPG47WSsrLEorKylIW1ldJiZ6LnB1c2godltKXSk7cmV0dXJuIHp9KGUuaHVmZm1hbixlLnJlZmluZW1lbnQsbCxlLm51bWJlck9mTmV3U3ltYm9scyxlLm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLGMsZS50ZW1wbGF0ZSxlLmF0LGUucmVmaW5lbWVudFRlbXBsYXRlLGUucmVmaW5lbWVudEF0LGcsdSl9LG9uSW1tZWRpYXRlVGV4dFJlZ2lvbjpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZVRleHRSZWdpb24oZSx0LHIsbixvKXtmb3IodmFyIGEsYyx1PWUuaW5mbyxmPXRoaXMuc3ltYm9scyxsPVtdLHA9MCxkPXQubGVuZ3RoO3A8ZDtwKyspe3ZhciBoPWZbdFtwXV07aCYmKGw9bC5jb25jYXQoaCkpfXZhciBnPSgwLGkubG9nMikobC5sZW5ndGgpO2lmKGUuaHVmZm1hbil7Yz1uZXcgUmVhZGVyKHIsbixvKTthPWZ1bmN0aW9uIGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKGUsdCxyLG4saSl7Zm9yKHZhciBvPVtdLGE9MDthPD0zNDthKyspe3ZhciBjPWkucmVhZEJpdHMoNCk7by5wdXNoKG5ldyBIdWZmbWFuTGluZShbYSxjLDAsMF0pKX12YXIgdT1uZXcgSHVmZm1hblRhYmxlKG8sITEpO28ubGVuZ3RoPTA7Zm9yKHZhciBmPTA7ZjxuOyl7dmFyIGw9dS5kZWNvZGUoaSk7aWYobD49MzIpe3ZhciBwPXZvaWQgMCxkPXZvaWQgMCxoPXZvaWQgMDtzd2l0Y2gobCl7Y2FzZSAzMjppZigwPT09Zil0aHJvdyBuZXcgcygibm8gcHJldmlvdXMgdmFsdWUgaW4gc3ltYm9sIElEIHRhYmxlIik7ZD1pLnJlYWRCaXRzKDIpKzM7cD1vW2YtMV0ucHJlZml4TGVuZ3RoO2JyZWFrO2Nhc2UgMzM6ZD1pLnJlYWRCaXRzKDMpKzM7cD0wO2JyZWFrO2Nhc2UgMzQ6ZD1pLnJlYWRCaXRzKDcpKzExO3A9MDticmVhaztkZWZhdWx0OnRocm93IG5ldyBzKCJpbnZhbGlkIGNvZGUgbGVuZ3RoIGluIHN5bWJvbCBJRCB0YWJsZSIpfWZvcihoPTA7aDxkO2grKyl7by5wdXNoKG5ldyBIdWZmbWFuTGluZShbZixwLDAsMF0pKTtmKyt9fWVsc2V7by5wdXNoKG5ldyBIdWZmbWFuTGluZShbZixsLDAsMF0pKTtmKyt9fWkuYnl0ZUFsaWduKCk7dmFyIGcsdixtLHk9bmV3IEh1ZmZtYW5UYWJsZShvLCExKSxiPTA7c3dpdGNoKGUuaHVmZm1hbkZTKXtjYXNlIDA6Y2FzZSAxOmc9Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5GUys2KTticmVhaztjYXNlIDM6Zz1nZXRDdXN0b21IdWZmbWFuVGFibGUoYix0LHIpO2IrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBzKCJpbnZhbGlkIEh1ZmZtYW4gRlMgc2VsZWN0b3IiKX1zd2l0Y2goZS5odWZmbWFuRFMpe2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOnY9Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5EUys4KTticmVhaztjYXNlIDM6dj1nZXRDdXN0b21IdWZmbWFuVGFibGUoYix0LHIpO2IrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBzKCJpbnZhbGlkIEh1ZmZtYW4gRFMgc2VsZWN0b3IiKX1zd2l0Y2goZS5odWZmbWFuRFQpe2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOm09Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5EVCsxMSk7YnJlYWs7Y2FzZSAzOm09Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKGIsdCxyKTtiKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgcygiaW52YWxpZCBIdWZmbWFuIERUIHNlbGVjdG9yIil9aWYoZS5yZWZpbmVtZW50KXRocm93IG5ldyBzKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJue3N5bWJvbElEVGFibGU6eSx0YWJsZUZpcnN0UzpnLHRhYmxlRGVsdGFTOnYsdGFibGVEZWx0YVQ6bX19KGUsdCx0aGlzLmN1c3RvbVRhYmxlcyxsLmxlbmd0aCxjKX12YXIgdj1uZXcgRGVjb2RpbmdDb250ZXh0KHIsbixvKSxtPWRlY29kZVRleHRSZWdpb24oZS5odWZmbWFuLGUucmVmaW5lbWVudCx1LndpZHRoLHUuaGVpZ2h0LGUuZGVmYXVsdFBpeGVsVmFsdWUsZS5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyxlLnN0cmlwU2l6ZSxsLGcsZS50cmFuc3Bvc2VkLGUuZHNPZmZzZXQsZS5yZWZlcmVuY2VDb3JuZXIsZS5jb21iaW5hdGlvbk9wZXJhdG9yLGEsZS5yZWZpbmVtZW50VGVtcGxhdGUsZS5yZWZpbmVtZW50QXQsdixlLmxvZ1N0cmlwU2l6ZSxjKTt0aGlzLmRyYXdCaXRtYXAodSxtKX0sb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb246ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG9uUGF0dGVybkRpY3Rpb25hcnk6ZnVuY3Rpb24gb25QYXR0ZXJuRGljdGlvbmFyeShlLHQscixuLGkpe3ZhciBvPXRoaXMucGF0dGVybnM7b3x8KHRoaXMucGF0dGVybnM9bz17fSk7dmFyIGE9bmV3IERlY29kaW5nQ29udGV4dChyLG4saSk7b1t0XT1mdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShlLHQscixuLGksbyl7dmFyIGE9W107aWYoIWUpe2EucHVzaCh7eDotdCx5OjB9KTtpZigwPT09aSl7YS5wdXNoKHt4Oi0zLHk6LTF9KTthLnB1c2goe3g6Mix5Oi0yfSk7YS5wdXNoKHt4Oi0yLHk6LTJ9KX19Zm9yKHZhciBzPWRlY29kZUJpdG1hcChlLChuKzEpKnQscixpLCExLG51bGwsYSxvKSxjPVtdLHU9MDt1PD1uO3UrKyl7Zm9yKHZhciBmPVtdLGw9dCp1LHA9bCt0LGQ9MDtkPHI7ZCsrKWYucHVzaChzW2RdLnN1YmFycmF5KGwscCkpO2MucHVzaChmKX1yZXR1cm4gY30oZS5tbXIsZS5wYXR0ZXJuV2lkdGgsZS5wYXR0ZXJuSGVpZ2h0LGUubWF4UGF0dGVybkluZGV4LGUudGVtcGxhdGUsYSl9LG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb246ZnVuY3Rpb24gb25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbihlLHQscixuLG8pe3ZhciBhPXRoaXMucGF0dGVybnNbdFswXV0sYz1lLmluZm8sdT1uZXcgRGVjb2RpbmdDb250ZXh0KHIsbixvKSxmPWZ1bmN0aW9uIGRlY29kZUhhbGZ0b25lUmVnaW9uKGUsdCxyLG4sbyxhLGMsdSxmLGwscCxkLGgsZyx2KXtpZihjKXRocm93IG5ldyBzKCJza2lwIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZigwIT09dSl0aHJvdyBuZXcgcygib3BlcmF0b3IgIit1KyIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb24iKTt2YXIgbSx5LGIseD1bXTtmb3IobT0wO208bzttKyspe2I9bmV3IFVpbnQ4QXJyYXkobik7aWYoYSlmb3IoeT0wO3k8bjt5KyspYlt5XT1hO3gucHVzaChiKX12YXIgdz10Lmxlbmd0aCxTPXRbMF0sXz1TWzBdLmxlbmd0aCxUPVMubGVuZ3RoLFA9KDAsaS5sb2cyKSh3KSxDPVtdO2lmKCFlKXtDLnB1c2goe3g6cjw9MT8zOjIseTotMX0pO2lmKDA9PT1yKXtDLnB1c2goe3g6LTMseTotMX0pO0MucHVzaCh7eDoyLHk6LTJ9KTtDLnB1c2goe3g6LTIseTotMn0pfX12YXIgayxJLE8sRSxBLFIsTSxELEwsQixVLE49W107ZSYmKGs9bmV3IFJlYWRlcih2LmRhdGEsdi5zdGFydCx2LmVuZCkpO2ZvcihtPVAtMTttPj0wO20tLSl7ST1lP2RlY29kZU1NUkJpdG1hcChrLGYsbCwhMCk6ZGVjb2RlQml0bWFwKCExLGYsbCxyLCExLG51bGwsQyx2KTtOW21dPUl9Zm9yKE89MDtPPGw7TysrKWZvcihFPTA7RTxmO0UrKyl7QT0wO1I9MDtmb3IoeT1QLTE7eT49MDt5LS0pUnw9KEE9Tlt5XVtPXVtFXV5BKTw8eTtNPXRbUl07TD1kK08qaC1FKmc+Pjg7aWYoKEQ9cCtPKmcrRSpoPj44KT49MCYmRCtfPD1uJiZMPj0wJiZMK1Q8PW8pZm9yKG09MDttPFQ7bSsrKXtVPXhbTCttXTtCPU1bbV07Zm9yKHk9MDt5PF87eSsrKVVbRCt5XXw9Qlt5XX1lbHNle3ZhciBqPXZvaWQgMCx6PXZvaWQgMDtmb3IobT0wO208VDttKyspaWYoISgoej1MK20pPDB8fHo+PW8pKXtVPXhbel07Qj1NW21dO2Zvcih5PTA7eTxfO3krKykoaj1EK3kpPj0wJiZqPG4mJihVW2pdfD1CW3ldKX19fXJldHVybiB4fShlLm1tcixhLGUudGVtcGxhdGUsYy53aWR0aCxjLmhlaWdodCxlLmRlZmF1bHRQaXhlbFZhbHVlLGUuZW5hYmxlU2tpcCxlLmNvbWJpbmF0aW9uT3BlcmF0b3IsZS5ncmlkV2lkdGgsZS5ncmlkSGVpZ2h0LGUuZ3JpZE9mZnNldFgsZS5ncmlkT2Zmc2V0WSxlLmdyaWRWZWN0b3JYLGUuZ3JpZFZlY3RvclksdSk7dGhpcy5kcmF3Qml0bWFwKGMsZil9LG9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbjpmdW5jdGlvbiBvbkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvblRhYmxlczpmdW5jdGlvbiBvblRhYmxlcyhlLHQscixuKXt2YXIgbz10aGlzLmN1c3RvbVRhYmxlcztvfHwodGhpcy5jdXN0b21UYWJsZXM9bz17fSk7b1tlXT1mdW5jdGlvbiBkZWNvZGVUYWJsZXNTZWdtZW50KGUsdCxyKXt2YXIgbixvLGE9ZVt0XSxzPTQyOTQ5NjcyOTUmKDAsaS5yZWFkVWludDMyKShlLHQrMSksYz00Mjk0OTY3Mjk1JigwLGkucmVhZFVpbnQzMikoZSx0KzUpLHU9bmV3IFJlYWRlcihlLHQrOSxyKSxmPTErKGE+PjEmNyksbD0xKyhhPj40JjcpLHA9W10sZD1zO2Rve249dS5yZWFkQml0cyhmKTtvPXUucmVhZEJpdHMobCk7cC5wdXNoKG5ldyBIdWZmbWFuTGluZShbZCxuLG8sMF0pKTtkKz0xPDxvfXdoaWxlKGQ8Yyk7bj11LnJlYWRCaXRzKGYpO3AucHVzaChuZXcgSHVmZm1hbkxpbmUoW3MtMSxuLDMyLDAsImxvd2VyIl0pKTtuPXUucmVhZEJpdHMoZik7cC5wdXNoKG5ldyBIdWZmbWFuTGluZShbYyxuLDMyLDBdKSk7aWYoMSZhKXtuPXUucmVhZEJpdHMoZik7cC5wdXNoKG5ldyBIdWZmbWFuTGluZShbbiwwXSkpfXJldHVybiBuZXcgSHVmZm1hblRhYmxlKHAsITEpfSh0LHIsbil9fTtmdW5jdGlvbiBIdWZmbWFuTGluZShlKXtpZigyPT09ZS5sZW5ndGgpe3RoaXMuaXNPT0I9ITA7dGhpcy5yYW5nZUxvdz0wO3RoaXMucHJlZml4TGVuZ3RoPWVbMF07dGhpcy5yYW5nZUxlbmd0aD0wO3RoaXMucHJlZml4Q29kZT1lWzFdO3RoaXMuaXNMb3dlclJhbmdlPSExfWVsc2V7dGhpcy5pc09PQj0hMTt0aGlzLnJhbmdlTG93PWVbMF07dGhpcy5wcmVmaXhMZW5ndGg9ZVsxXTt0aGlzLnJhbmdlTGVuZ3RoPWVbMl07dGhpcy5wcmVmaXhDb2RlPWVbM107dGhpcy5pc0xvd2VyUmFuZ2U9Imxvd2VyIj09PWVbNF19fWZ1bmN0aW9uIEh1ZmZtYW5UcmVlTm9kZShlKXt0aGlzLmNoaWxkcmVuPVtdO2lmKGUpe3RoaXMuaXNMZWFmPSEwO3RoaXMucmFuZ2VMZW5ndGg9ZS5yYW5nZUxlbmd0aDt0aGlzLnJhbmdlTG93PWUucmFuZ2VMb3c7dGhpcy5pc0xvd2VyUmFuZ2U9ZS5pc0xvd2VyUmFuZ2U7dGhpcy5pc09PQj1lLmlzT09CfWVsc2UgdGhpcy5pc0xlYWY9ITF9SHVmZm1hblRyZWVOb2RlLnByb3RvdHlwZT17YnVpbGRUcmVlOmZ1bmN0aW9uIGJ1aWxkVHJlZShlLHQpe3ZhciByPWUucHJlZml4Q29kZT4+dCYxO2lmKHQ8PTApdGhpcy5jaGlsZHJlbltyXT1uZXcgSHVmZm1hblRyZWVOb2RlKGUpO2Vsc2V7dmFyIG49dGhpcy5jaGlsZHJlbltyXTtufHwodGhpcy5jaGlsZHJlbltyXT1uPW5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCkpO24uYnVpbGRUcmVlKGUsdC0xKX19LGRlY29kZU5vZGU6ZnVuY3Rpb24gZGVjb2RlTm9kZShlKXtpZih0aGlzLmlzTGVhZil7aWYodGhpcy5pc09PQilyZXR1cm4gbnVsbDt2YXIgdD1lLnJlYWRCaXRzKHRoaXMucmFuZ2VMZW5ndGgpO3JldHVybiB0aGlzLnJhbmdlTG93Kyh0aGlzLmlzTG93ZXJSYW5nZT8tdDp0KX12YXIgcj10aGlzLmNoaWxkcmVuW2UucmVhZEJpdCgpXTtpZighcil0aHJvdyBuZXcgcygiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTtyZXR1cm4gci5kZWNvZGVOb2RlKGUpfX07ZnVuY3Rpb24gSHVmZm1hblRhYmxlKGUsdCl7dHx8dGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhlKTt0aGlzLnJvb3ROb2RlPW5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO2kucHJlZml4TGVuZ3RoPjAmJnRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKGksaS5wcmVmaXhMZW5ndGgtMSl9fUh1ZmZtYW5UYWJsZS5wcm90b3R5cGU9e2RlY29kZTpmdW5jdGlvbiBkZWNvZGUoZSl7cmV0dXJuIHRoaXMucm9vdE5vZGUuZGVjb2RlTm9kZShlKX0sYXNzaWduUHJlZml4Q29kZXM6ZnVuY3Rpb24gYXNzaWduUHJlZml4Q29kZXMoZSl7Zm9yKHZhciB0PWUubGVuZ3RoLHI9MCxuPTA7bjx0O24rKylyPU1hdGgubWF4KHIsZVtuXS5wcmVmaXhMZW5ndGgpO2Zvcih2YXIgaT1uZXcgVWludDMyQXJyYXkocisxKSxvPTA7bzx0O28rKylpW2Vbb10ucHJlZml4TGVuZ3RoXSsrO3ZhciBhLHMsYyx1PTEsZj0wO2lbMF09MDtmb3IoO3U8PXI7KXthPWY9ZitpW3UtMV08PDE7cz0wO2Zvcig7czx0Oyl7aWYoKGM9ZVtzXSkucHJlZml4TGVuZ3RoPT09dSl7Yy5wcmVmaXhDb2RlPWE7YSsrfXMrK311Kyt9fX07dmFyIGw9e307ZnVuY3Rpb24gZ2V0U3RhbmRhcmRUYWJsZShlKXt2YXIgdCxyPWxbZV07aWYocilyZXR1cm4gcjtzd2l0Y2goZSl7Y2FzZSAxOnQ9W1swLDEsNCwwXSxbMTYsMiw4LDJdLFsyNzIsMywxNiw2XSxbNjU4MDgsMywzMiw3XV07YnJlYWs7Y2FzZSAyOnQ9W1swLDEsMCwwXSxbMSwyLDAsMl0sWzIsMywwLDZdLFszLDQsMywxNF0sWzExLDUsNiwzMF0sWzc1LDYsMzIsNjJdLFs2LDYzXV07YnJlYWs7Y2FzZSAzOnQ9W1stMjU2LDgsOCwyNTRdLFswLDEsMCwwXSxbMSwyLDAsMl0sWzIsMywwLDZdLFszLDQsMywxNF0sWzExLDUsNiwzMF0sWy0yNTcsOCwzMiwyNTUsImxvd2VyIl0sWzc1LDcsMzIsMTI2XSxbNiw2Ml1dO2JyZWFrO2Nhc2UgNDp0PVtbMSwxLDAsMF0sWzIsMiwwLDJdLFszLDMsMCw2XSxbNCw0LDMsMTRdLFsxMiw1LDYsMzBdLFs3Niw1LDMyLDMxXV07YnJlYWs7Y2FzZSA1OnQ9W1stMjU1LDcsOCwxMjZdLFsxLDEsMCwwXSxbMiwyLDAsMl0sWzMsMywwLDZdLFs0LDQsMywxNF0sWzEyLDUsNiwzMF0sWy0yNTYsNywzMiwxMjcsImxvd2VyIl0sWzc2LDYsMzIsNjJdXTticmVhaztjYXNlIDY6dD1bWy0yMDQ4LDUsMTAsMjhdLFstMTAyNCw0LDksOF0sWy01MTIsNCw4LDldLFstMjU2LDQsNywxMF0sWy0xMjgsNSw2LDI5XSxbLTY0LDUsNSwzMF0sWy0zMiw0LDUsMTFdLFswLDIsNywwXSxbMTI4LDMsNywyXSxbMjU2LDMsOCwzXSxbNTEyLDQsOSwxMl0sWzEwMjQsNCwxMCwxM10sWy0yMDQ5LDYsMzIsNjIsImxvd2VyIl0sWzIwNDgsNiwzMiw2M11dO2JyZWFrO2Nhc2UgNzp0PVtbLTEwMjQsNCw5LDhdLFstNTEyLDMsOCwwXSxbLTI1Niw0LDcsOV0sWy0xMjgsNSw2LDI2XSxbLTY0LDUsNSwyN10sWy0zMiw0LDUsMTBdLFswLDQsNSwxMV0sWzMyLDUsNSwyOF0sWzY0LDUsNiwyOV0sWzEyOCw0LDcsMTJdLFsyNTYsMyw4LDFdLFs1MTIsMyw5LDJdLFsxMDI0LDMsMTAsM10sWy0xMDI1LDUsMzIsMzAsImxvd2VyIl0sWzIwNDgsNSwzMiwzMV1dO2JyZWFrO2Nhc2UgODp0PVtbLTE1LDgsMywyNTJdLFstNyw5LDEsNTA4XSxbLTUsOCwxLDI1M10sWy0zLDksMCw1MDldLFstMiw3LDAsMTI0XSxbLTEsNCwwLDEwXSxbMCwyLDEsMF0sWzIsNSwwLDI2XSxbMyw2LDAsNThdLFs0LDMsNCw0XSxbMjAsNiwxLDU5XSxbMjIsNCw0LDExXSxbMzgsNCw1LDEyXSxbNzAsNSw2LDI3XSxbMTM0LDUsNywyOF0sWzI2Miw2LDcsNjBdLFszOTAsNyw4LDEyNV0sWzY0Niw2LDEwLDYxXSxbLTE2LDksMzIsNTEwLCJsb3dlciJdLFsxNjcwLDksMzIsNTExXSxbMiwxXV07YnJlYWs7Y2FzZSA5OnQ9W1stMzEsOCw0LDI1Ml0sWy0xNSw5LDIsNTA4XSxbLTExLDgsMiwyNTNdLFstNyw5LDEsNTA5XSxbLTUsNywxLDEyNF0sWy0zLDQsMSwxMF0sWy0xLDMsMSwyXSxbMSwzLDEsM10sWzMsNSwxLDI2XSxbNSw2LDEsNThdLFs3LDMsNSw0XSxbMzksNiwyLDU5XSxbNDMsNCw1LDExXSxbNzUsNCw2LDEyXSxbMTM5LDUsNywyN10sWzI2Nyw1LDgsMjhdLFs1MjMsNiw4LDYwXSxbNzc5LDcsOSwxMjVdLFsxMjkxLDYsMTEsNjFdLFstMzIsOSwzMiw1MTAsImxvd2VyIl0sWzMzMzksOSwzMiw1MTFdLFsyLDBdXTticmVhaztjYXNlIDEwOnQ9W1stMjEsNyw0LDEyMl0sWy01LDgsMCwyNTJdLFstNCw3LDAsMTIzXSxbLTMsNSwwLDI0XSxbLTIsMiwyLDBdLFsyLDUsMCwyNV0sWzMsNiwwLDU0XSxbNCw3LDAsMTI0XSxbNSw4LDAsMjUzXSxbNiwyLDYsMV0sWzcwLDUsNSwyNl0sWzEwMiw2LDUsNTVdLFsxMzQsNiw2LDU2XSxbMTk4LDYsNyw1N10sWzMyNiw2LDgsNThdLFs1ODIsNiw5LDU5XSxbMTA5NCw2LDEwLDYwXSxbMjExOCw3LDExLDEyNV0sWy0yMiw4LDMyLDI1NCwibG93ZXIiXSxbNDE2Niw4LDMyLDI1NV0sWzIsMl1dO2JyZWFrO2Nhc2UgMTE6dD1bWzEsMSwwLDBdLFsyLDIsMSwyXSxbNCw0LDAsMTJdLFs1LDQsMSwxM10sWzcsNSwxLDI4XSxbOSw1LDIsMjldLFsxMyw2LDIsNjBdLFsxNyw3LDIsMTIyXSxbMjEsNywzLDEyM10sWzI5LDcsNCwxMjRdLFs0NSw3LDUsMTI1XSxbNzcsNyw2LDEyNl0sWzE0MSw3LDMyLDEyN11dO2JyZWFrO2Nhc2UgMTI6dD1bWzEsMSwwLDBdLFsyLDIsMCwyXSxbMywzLDEsNl0sWzUsNSwwLDI4XSxbNiw1LDEsMjldLFs4LDYsMSw2MF0sWzEwLDcsMCwxMjJdLFsxMSw3LDEsMTIzXSxbMTMsNywyLDEyNF0sWzE3LDcsMywxMjVdLFsyNSw3LDQsMTI2XSxbNDEsOCw1LDI1NF0sWzczLDgsMzIsMjU1XV07YnJlYWs7Y2FzZSAxMzp0PVtbMSwxLDAsMF0sWzIsMywwLDRdLFszLDQsMCwxMl0sWzQsNSwwLDI4XSxbNSw0LDEsMTNdLFs3LDMsMyw1XSxbMTUsNiwxLDU4XSxbMTcsNiwyLDU5XSxbMjEsNiwzLDYwXSxbMjksNiw0LDYxXSxbNDUsNiw1LDYyXSxbNzcsNyw2LDEyNl0sWzE0MSw3LDMyLDEyN11dO2JyZWFrO2Nhc2UgMTQ6dD1bWy0yLDMsMCw0XSxbLTEsMywwLDVdLFswLDEsMCwwXSxbMSwzLDAsNl0sWzIsMywwLDddXTticmVhaztjYXNlIDE1OnQ9W1stMjQsNyw0LDEyNF0sWy04LDYsMiw2MF0sWy00LDUsMSwyOF0sWy0yLDQsMCwxMl0sWy0xLDMsMCw0XSxbMCwxLDAsMF0sWzEsMywwLDVdLFsyLDQsMCwxM10sWzMsNSwxLDI5XSxbNSw2LDIsNjFdLFs5LDcsNCwxMjVdLFstMjUsNywzMiwxMjYsImxvd2VyIl0sWzI1LDcsMzIsMTI3XV07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgcygic3RhbmRhcmQgdGFibGUgQi4iLmNvbmNhdChlLCIgZG9lcyBub3QgZXhpc3QiKSl9Zm9yKHZhciBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXRbbl09bmV3IEh1ZmZtYW5MaW5lKHRbbl0pO3I9bmV3IEh1ZmZtYW5UYWJsZSh0LCEwKTtsW2VdPXI7cmV0dXJuIHJ9ZnVuY3Rpb24gUmVhZGVyKGUsdCxyKXt0aGlzLmRhdGE9ZTt0aGlzLnN0YXJ0PXQ7dGhpcy5lbmQ9cjt0aGlzLnBvc2l0aW9uPXQ7dGhpcy5zaGlmdD0tMTt0aGlzLmN1cnJlbnRCeXRlPTB9UmVhZGVyLnByb3RvdHlwZT17cmVhZEJpdDpmdW5jdGlvbiByZWFkQml0KCl7aWYodGhpcy5zaGlmdDwwKXtpZih0aGlzLnBvc2l0aW9uPj10aGlzLmVuZCl0aHJvdyBuZXcgcygiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTt0aGlzLmN1cnJlbnRCeXRlPXRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdO3RoaXMuc2hpZnQ9N312YXIgZT10aGlzLmN1cnJlbnRCeXRlPj50aGlzLnNoaWZ0JjE7dGhpcy5zaGlmdC0tO3JldHVybiBlfSxyZWFkQml0czpmdW5jdGlvbiByZWFkQml0cyhlKXt2YXIgdCxyPTA7Zm9yKHQ9ZS0xO3Q+PTA7dC0tKXJ8PXRoaXMucmVhZEJpdCgpPDx0O3JldHVybiByfSxieXRlQWxpZ246ZnVuY3Rpb24gYnl0ZUFsaWduKCl7dGhpcy5zaGlmdD0tMX0sbmV4dDpmdW5jdGlvbiBuZXh0KCl7cmV0dXJuIHRoaXMucG9zaXRpb24+PXRoaXMuZW5kPy0xOnRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdfX07ZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGUsdCxyKXtmb3IodmFyIG49MCxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKXt2YXIgYT1yW3RbaV1dO2lmKGEpe2lmKGU9PT1uKXJldHVybiBhO24rK319dGhyb3cgbmV3IHMoImNhbid0IGZpbmQgY3VzdG9tIEh1ZmZtYW4gdGFibGUiKX1mdW5jdGlvbiByZWFkVW5jb21wcmVzc2VkQml0bWFwKGUsdCxyKXtmb3IodmFyIG49W10saT0wO2k8cjtpKyspe3ZhciBvPW5ldyBVaW50OEFycmF5KHQpO24ucHVzaChvKTtmb3IodmFyIGE9MDthPHQ7YSsrKW9bYV09ZS5yZWFkQml0KCk7ZS5ieXRlQWxpZ24oKX1yZXR1cm4gbn1mdW5jdGlvbiBkZWNvZGVNTVJCaXRtYXAoZSx0LHIsbil7Zm9yKHZhciBpLG89e0s6LTEsQ29sdW1uczp0LFJvd3M6cixCbGFja0lzMTohMCxFbmRPZkJsb2NrOm59LHM9bmV3IGEuQ0NJVFRGYXhEZWNvZGVyKGUsbyksYz1bXSx1PSExLGY9MDtmPHI7ZisrKXt2YXIgbD1uZXcgVWludDhBcnJheSh0KTtjLnB1c2gobCk7Zm9yKHZhciBwPS0xLGQ9MDtkPHQ7ZCsrKXtpZihwPDApe2lmKC0xPT09KGk9cy5yZWFkTmV4dENoYXIoKSkpe2k9MDt1PSEwfXA9N31sW2RdPWk+PnAmMTtwLS19fWlmKG4mJiF1KWZvcih2YXIgaD0wO2g8NSYmLTEhPT1zLnJlYWROZXh0Q2hhcigpO2grKyk7cmV0dXJuIGN9ZnVuY3Rpb24gSmJpZzJJbWFnZSgpe31KYmlnMkltYWdlLnByb3RvdHlwZT17cGFyc2VDaHVua3M6ZnVuY3Rpb24gcGFyc2VDaHVua3MoZSl7cmV0dXJuIGZ1bmN0aW9uIHBhcnNlSmJpZzJDaHVua3MoZSl7Zm9yKHZhciB0PW5ldyBTaW1wbGVTZWdtZW50VmlzaXRvcixyPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO3Byb2Nlc3NTZWdtZW50cyhyZWFkU2VnbWVudHMoe30saS5kYXRhLGkuc3RhcnQsaS5lbmQpLHQpfXJldHVybiB0LmJ1ZmZlcn0oZSl9LHBhcnNlOmZ1bmN0aW9uIHBhcnNlKGUpe3ZhciB0PWZ1bmN0aW9uIHBhcnNlSmJpZzIoZSl7dmFyIHQ9ZS5sZW5ndGgscj0wO2lmKDE1MSE9PWVbcl18fDc0IT09ZVtyKzFdfHw2NiE9PWVbcisyXXx8NTAhPT1lW3IrM118fDEzIT09ZVtyKzRdfHwxMCE9PWVbcis1XXx8MjYhPT1lW3IrNl18fDEwIT09ZVtyKzddKXRocm93IG5ldyBzKCJwYXJzZUpiaWcyIC0gaW52YWxpZCBoZWFkZXIuIik7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyKz04O3ZhciBvPWVbcisrXTtuLnJhbmRvbUFjY2Vzcz0hKDEmbyk7aWYoISgyJm8pKXtuLm51bWJlck9mUGFnZXM9KDAsaS5yZWFkVWludDMyKShlLHIpO3IrPTR9dmFyIGE9cmVhZFNlZ21lbnRzKG4sZSxyLHQpLGM9bmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yO3Byb2Nlc3NTZWdtZW50cyhhLGMpO2Zvcih2YXIgdT1jLmN1cnJlbnRQYWdlSW5mbyxmPXUud2lkdGgsbD11LmhlaWdodCxwPWMuYnVmZmVyLGQ9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGYqbCksaD0wLGc9MCx2PTA7djxsO3YrKylmb3IodmFyIG09MCx5PXZvaWQgMCxiPTA7YjxmO2IrKyl7aWYoIW0pe209MTI4O3k9cFtnKytdfWRbaCsrXT15Jm0/MDoyNTU7bT4+PTF9cmV0dXJue2ltZ0RhdGE6ZCx3aWR0aDpmLGhlaWdodDpsfX0oZSkscj10LmltZ0RhdGEsbj10LndpZHRoLG89dC5oZWlnaHQ7dGhpcy53aWR0aD1uO3RoaXMuaGVpZ2h0PW87cmV0dXJuIHJ9fTtyZXR1cm4gSmJpZzJJbWFnZX0oKTt0LkpiaWcySW1hZ2U9Y30sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5nZXRMb29rdXBUYWJsZUZhY3Rvcnk9ZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGUpe3ZhciB0O3JldHVybiBmdW5jdGlvbigpe2lmKGUpe3Q9T2JqZWN0LmNyZWF0ZShudWxsKTtlKHQpO2U9bnVsbH1yZXR1cm4gdH19O3QuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eT1mdW5jdGlvbiBnZXRJbmhlcml0YWJsZVByb3BlcnR5KGUpe3ZhciB0LHI9ZS5kaWN0LGk9ZS5rZXksbz1lLmdldEFycmF5LGE9dm9pZCAwIT09byYmbyxzPWUuc3RvcFdoZW5Gb3VuZCxjPXZvaWQgMD09PXN8fHMsdT0wO2Zvcig7cjspe3ZhciBmPWE/ci5nZXRBcnJheShpKTpyLmdldChpKTtpZih2b2lkIDAhPT1mKXtpZihjKXJldHVybiBmO3R8fCh0PVtdKTt0LnB1c2goZil9aWYoKyt1PjEwMCl7KDAsbi53YXJuKSgnZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTogbWF4aW11bSBsb29wIGNvdW50IGV4Y2VlZGVkIGZvciAiJy5jb25jYXQoaSwnIicpKTticmVha31yPXIuZ2V0KCJQYXJlbnQiKX1yZXR1cm4gdH07dC50b1JvbWFuTnVtZXJhbHM9ZnVuY3Rpb24gdG9Sb21hbk51bWVyYWxzKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07KDAsbi5hc3NlcnQpKE51bWJlci5pc0ludGVnZXIoZSkmJmU+MCwiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpO3ZhciByLGk9W107Zm9yKDtlPj0xZTM7KXtlLT0xZTM7aS5wdXNoKCJNIil9cj1lLzEwMHwwO2UlPTEwMDtpLnB1c2goc1tyXSk7cj1lLzEwfDA7ZSU9MTA7aS5wdXNoKHNbMTArcl0pO2kucHVzaChzWzIwK2VdKTt2YXIgbz1pLmpvaW4oIiIpO3JldHVybiB0P28udG9Mb3dlckNhc2UoKTpvfTt0LmxvZzI9ZnVuY3Rpb24gbG9nMihlKXtpZihlPD0wKXJldHVybiAwO3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2cyKGUpKX07dC5yZWFkSW50OD1mdW5jdGlvbiByZWFkSW50OChlLHQpe3JldHVybiBlW3RdPDwyND4+MjR9O3QucmVhZFVpbnQxNj1mdW5jdGlvbiByZWFkVWludDE2KGUsdCl7cmV0dXJuIGVbdF08PDh8ZVt0KzFdfTt0LnJlYWRVaW50MzI9ZnVuY3Rpb24gcmVhZFVpbnQzMihlLHQpe3JldHVybihlW3RdPDwyNHxlW3QrMV08PDE2fGVbdCsyXTw8OHxlW3QrM10pPj4+MH07dC5pc1doaXRlU3BhY2U9ZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGUpe3JldHVybiAzMj09PWV8fDk9PT1lfHwxMz09PWV8fDEwPT09ZX07dC5YUmVmUGFyc2VFeGNlcHRpb249dC5YUmVmRW50cnlFeGNlcHRpb249dC5NaXNzaW5nRGF0YUV4Y2VwdGlvbj12b2lkIDA7dmFyIG49cigxKTtmdW5jdGlvbiBfdHlwZW9mKGUpe3JldHVybihfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uIF90eXBlb2YoZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbiBfdHlwZW9mKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF9pbmhlcml0cyhlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTt0JiZfc2V0UHJvdG90eXBlT2YoZSx0KX1mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YoZSx0KXtyZXR1cm4oX3NldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKGUsdCl7ZS5fX3Byb3RvX189dDtyZXR1cm4gZX0pKGUsdCl9ZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKGUpe3ZhciB0PWZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7RGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSk7cmV0dXJuITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpe3ZhciByLG49X2dldFByb3RvdHlwZU9mKGUpO2lmKHQpe3ZhciBpPV9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtyPVJlZmxlY3QuY29uc3RydWN0KG4sYXJndW1lbnRzLGkpfWVsc2Ugcj1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcyxyKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oZSx0KXtyZXR1cm4hdHx8Im9iamVjdCIhPT1fdHlwZW9mKHQpJiYiZnVuY3Rpb24iIT10eXBlb2YgdD9mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX0oZSk6dH1mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YoZSl7cmV0dXJuKF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihlKXtyZXR1cm4gZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKX0pKGUpfXZhciBpPWZ1bmN0aW9uKGUpe19pbmhlcml0cyhNaXNzaW5nRGF0YUV4Y2VwdGlvbixlKTt2YXIgdD1fY3JlYXRlU3VwZXIoTWlzc2luZ0RhdGFFeGNlcHRpb24pO2Z1bmN0aW9uIE1pc3NpbmdEYXRhRXhjZXB0aW9uKGUscil7dmFyIG47X2NsYXNzQ2FsbENoZWNrKHRoaXMsTWlzc2luZ0RhdGFFeGNlcHRpb24pOyhuPXQuY2FsbCh0aGlzLCJNaXNzaW5nIGRhdGEgWyIuY29uY2F0KGUsIiwgIikuY29uY2F0KHIsIikiKSkpLmJlZ2luPWU7bi5lbmQ9cjtyZXR1cm4gbn1yZXR1cm4gTWlzc2luZ0RhdGFFeGNlcHRpb259KG4uQmFzZUV4Y2VwdGlvbik7dC5NaXNzaW5nRGF0YUV4Y2VwdGlvbj1pO3ZhciBvPWZ1bmN0aW9uKGUpe19pbmhlcml0cyhYUmVmRW50cnlFeGNlcHRpb24sZSk7dmFyIHQ9X2NyZWF0ZVN1cGVyKFhSZWZFbnRyeUV4Y2VwdGlvbik7ZnVuY3Rpb24gWFJlZkVudHJ5RXhjZXB0aW9uKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsWFJlZkVudHJ5RXhjZXB0aW9uKTtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIFhSZWZFbnRyeUV4Y2VwdGlvbn0obi5CYXNlRXhjZXB0aW9uKTt0LlhSZWZFbnRyeUV4Y2VwdGlvbj1vO3ZhciBhPWZ1bmN0aW9uKGUpe19pbmhlcml0cyhYUmVmUGFyc2VFeGNlcHRpb24sZSk7dmFyIHQ9X2NyZWF0ZVN1cGVyKFhSZWZQYXJzZUV4Y2VwdGlvbik7ZnVuY3Rpb24gWFJlZlBhcnNlRXhjZXB0aW9uKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsWFJlZlBhcnNlRXhjZXB0aW9uKTtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIFhSZWZQYXJzZUV4Y2VwdGlvbn0obi5CYXNlRXhjZXB0aW9uKTt0LlhSZWZQYXJzZUV4Y2VwdGlvbj1hO3ZhciBzPVsiIiwiQyIsIkNDIiwiQ0NDIiwiQ0QiLCJEIiwiREMiLCJEQ0MiLCJEQ0NDIiwiQ00iLCIiLCJYIiwiWFgiLCJYWFgiLCJYTCIsIkwiLCJMWCIsIkxYWCIsIkxYWFgiLCJYQyIsIiIsIkkiLCJJSSIsIklJSSIsIklWIiwiViIsIlZJIiwiVklJIiwiVklJSSIsIklYIl19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQXJpdGhtZXRpY0RlY29kZXI9dm9pZCAwO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKGUsdCl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPXRbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITE7bi5jb25maWd1cmFibGU9ITA7InZhbHVlImluIG4mJihuLndyaXRhYmxlPSEwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLmtleSxuKX19dmFyIG49W3txZToyMjAxNyxubXBzOjEsbmxwczoxLHN3aXRjaEZsYWc6MX0se3FlOjEzMzEzLG5tcHM6MixubHBzOjYsc3dpdGNoRmxhZzowfSx7cWU6NjE0NSxubXBzOjMsbmxwczo5LHN3aXRjaEZsYWc6MH0se3FlOjI3NTMsbm1wczo0LG5scHM6MTIsc3dpdGNoRmxhZzowfSx7cWU6MTMxMyxubXBzOjUsbmxwczoyOSxzd2l0Y2hGbGFnOjB9LHtxZTo1NDUsbm1wczozOCxubHBzOjMzLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6NyxubHBzOjYsc3dpdGNoRmxhZzoxfSx7cWU6MjE1MDUsbm1wczo4LG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MTg0MzMsbm1wczo5LG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MTQzMzcsbm1wczoxMCxubHBzOjE0LHN3aXRjaEZsYWc6MH0se3FlOjEyMjg5LG5tcHM6MTEsbmxwczoxNyxzd2l0Y2hGbGFnOjB9LHtxZTo5MjE3LG5tcHM6MTIsbmxwczoxOCxzd2l0Y2hGbGFnOjB9LHtxZTo3MTY5LG5tcHM6MTMsbmxwczoyMCxzd2l0Y2hGbGFnOjB9LHtxZTo1NjMzLG5tcHM6MjksbmxwczoyMSxzd2l0Y2hGbGFnOjB9LHtxZToyMjAxNyxubXBzOjE1LG5scHM6MTQsc3dpdGNoRmxhZzoxfSx7cWU6MjE1MDUsbm1wczoxNixubHBzOjE0LHN3aXRjaEZsYWc6MH0se3FlOjIwNzM3LG5tcHM6MTcsbmxwczoxNSxzd2l0Y2hGbGFnOjB9LHtxZToxODQzMyxubXBzOjE4LG5scHM6MTYsc3dpdGNoRmxhZzowfSx7cWU6MTQzMzcsbm1wczoxOSxubHBzOjE3LHN3aXRjaEZsYWc6MH0se3FlOjEzMzEzLG5tcHM6MjAsbmxwczoxOCxzd2l0Y2hGbGFnOjB9LHtxZToxMjI4OSxubXBzOjIxLG5scHM6MTksc3dpdGNoRmxhZzowfSx7cWU6MTAyNDEsbm1wczoyMixubHBzOjE5LHN3aXRjaEZsYWc6MH0se3FlOjkyMTcsbm1wczoyMyxubHBzOjIwLHN3aXRjaEZsYWc6MH0se3FlOjg3MDUsbm1wczoyNCxubHBzOjIxLHN3aXRjaEZsYWc6MH0se3FlOjcxNjksbm1wczoyNSxubHBzOjIyLHN3aXRjaEZsYWc6MH0se3FlOjYxNDUsbm1wczoyNixubHBzOjIzLHN3aXRjaEZsYWc6MH0se3FlOjU2MzMsbm1wczoyNyxubHBzOjI0LHN3aXRjaEZsYWc6MH0se3FlOjUxMjEsbm1wczoyOCxubHBzOjI1LHN3aXRjaEZsYWc6MH0se3FlOjQ2MDksbm1wczoyOSxubHBzOjI2LHN3aXRjaEZsYWc6MH0se3FlOjQzNTMsbm1wczozMCxubHBzOjI3LHN3aXRjaEZsYWc6MH0se3FlOjI3NTMsbm1wczozMSxubHBzOjI4LHN3aXRjaEZsYWc6MH0se3FlOjI0OTcsbm1wczozMixubHBzOjI5LHN3aXRjaEZsYWc6MH0se3FlOjIyMDksbm1wczozMyxubHBzOjMwLHN3aXRjaEZsYWc6MH0se3FlOjEzMTMsbm1wczozNCxubHBzOjMxLHN3aXRjaEZsYWc6MH0se3FlOjEwODksbm1wczozNSxubHBzOjMyLHN3aXRjaEZsYWc6MH0se3FlOjY3MyxubXBzOjM2LG5scHM6MzMsc3dpdGNoRmxhZzowfSx7cWU6NTQ1LG5tcHM6MzcsbmxwczozNCxzd2l0Y2hGbGFnOjB9LHtxZTozMjEsbm1wczozOCxubHBzOjM1LHN3aXRjaEZsYWc6MH0se3FlOjI3MyxubXBzOjM5LG5scHM6MzYsc3dpdGNoRmxhZzowfSx7cWU6MTMzLG5tcHM6NDAsbmxwczozNyxzd2l0Y2hGbGFnOjB9LHtxZTo3MyxubXBzOjQxLG5scHM6Mzgsc3dpdGNoRmxhZzowfSx7cWU6Mzcsbm1wczo0MixubHBzOjM5LHN3aXRjaEZsYWc6MH0se3FlOjIxLG5tcHM6NDMsbmxwczo0MCxzd2l0Y2hGbGFnOjB9LHtxZTo5LG5tcHM6NDQsbmxwczo0MSxzd2l0Y2hGbGFnOjB9LHtxZTo1LG5tcHM6NDUsbmxwczo0Mixzd2l0Y2hGbGFnOjB9LHtxZToxLG5tcHM6NDUsbmxwczo0Myxzd2l0Y2hGbGFnOjB9LHtxZToyMjAxNyxubXBzOjQ2LG5scHM6NDYsc3dpdGNoRmxhZzowfV0saT1mdW5jdGlvbigpe2Z1bmN0aW9uIEFyaXRobWV0aWNEZWNvZGVyKGUsdCxyKXshZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsQXJpdGhtZXRpY0RlY29kZXIpO3RoaXMuZGF0YT1lO3RoaXMuYnA9dDt0aGlzLmRhdGFFbmQ9cjt0aGlzLmNoaWdoPWVbdF07dGhpcy5jbG93PTA7dGhpcy5ieXRlSW4oKTt0aGlzLmNoaWdoPXRoaXMuY2hpZ2g8PDcmNjU1MzV8dGhpcy5jbG93Pj45JjEyNzt0aGlzLmNsb3c9dGhpcy5jbG93PDw3JjY1NTM1O3RoaXMuY3QtPTc7dGhpcy5hPTMyNzY4fSFmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoZSx0LHIpe3QmJl9kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLHQpO3ImJl9kZWZpbmVQcm9wZXJ0aWVzKGUscik7cmV0dXJuIGV9KEFyaXRobWV0aWNEZWNvZGVyLFt7a2V5OiJieXRlSW4iLHZhbHVlOmZ1bmN0aW9uIGJ5dGVJbigpe3ZhciBlPXRoaXMuZGF0YSx0PXRoaXMuYnA7aWYoMjU1PT09ZVt0XSlpZihlW3QrMV0+MTQzKXt0aGlzLmNsb3crPTY1MjgwO3RoaXMuY3Q9OH1lbHNle3QrKzt0aGlzLmNsb3crPWVbdF08PDk7dGhpcy5jdD03O3RoaXMuYnA9dH1lbHNle3QrKzt0aGlzLmNsb3crPXQ8dGhpcy5kYXRhRW5kP2VbdF08PDg6NjUyODA7dGhpcy5jdD04O3RoaXMuYnA9dH1pZih0aGlzLmNsb3c+NjU1MzUpe3RoaXMuY2hpZ2grPXRoaXMuY2xvdz4+MTY7dGhpcy5jbG93Jj02NTUzNX19fSx7a2V5OiJyZWFkQml0Iix2YWx1ZTpmdW5jdGlvbiByZWFkQml0KGUsdCl7dmFyIHIsaT1lW3RdPj4xLG89MSZlW3RdLGE9bltpXSxzPWEucWUsYz10aGlzLmEtcztpZih0aGlzLmNoaWdoPHMpaWYoYzxzKXtjPXM7cj1vO2k9YS5ubXBzfWVsc2V7Yz1zO3I9MV5vOzE9PT1hLnN3aXRjaEZsYWcmJihvPXIpO2k9YS5ubHBzfWVsc2V7dGhpcy5jaGlnaC09cztpZigwIT0oMzI3NjgmYykpe3RoaXMuYT1jO3JldHVybiBvfWlmKGM8cyl7cj0xXm87MT09PWEuc3dpdGNoRmxhZyYmKG89cik7aT1hLm5scHN9ZWxzZXtyPW87aT1hLm5tcHN9fWRvezA9PT10aGlzLmN0JiZ0aGlzLmJ5dGVJbigpO2M8PD0xO3RoaXMuY2hpZ2g9dGhpcy5jaGlnaDw8MSY2NTUzNXx0aGlzLmNsb3c+PjE1JjE7dGhpcy5jbG93PXRoaXMuY2xvdzw8MSY2NTUzNTt0aGlzLmN0LS19d2hpbGUoMD09KDMyNzY4JmMpKTt0aGlzLmE9YztlW3RdPWk8PDF8bztyZXR1cm4gcn19XSk7cmV0dXJuIEFyaXRobWV0aWNEZWNvZGVyfSgpO3QuQXJpdGhtZXRpY0RlY29kZXI9aX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5DQ0lUVEZheERlY29kZXI9dm9pZCAwO3ZhciBuPXIoMSksaT1mdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoKXt2YXIgZT1bWy0xLC0xXSxbLTEsLTFdLFs3LDhdLFs3LDddLFs2LDZdLFs2LDZdLFs2LDVdLFs2LDVdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdXSx0PVtbLTEsLTFdLFsxMiwtMl0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0OTZdLFsxMiwyNTYwXV0scj1bWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbOCwyOV0sWzgsMjldLFs4LDMwXSxbOCwzMF0sWzgsNDVdLFs4LDQ1XSxbOCw0Nl0sWzgsNDZdLFs3LDIyXSxbNywyMl0sWzcsMjJdLFs3LDIyXSxbNywyM10sWzcsMjNdLFs3LDIzXSxbNywyM10sWzgsNDddLFs4LDQ3XSxbOCw0OF0sWzgsNDhdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzcsMjBdLFs3LDIwXSxbNywyMF0sWzcsMjBdLFs4LDMzXSxbOCwzM10sWzgsMzRdLFs4LDM0XSxbOCwzNV0sWzgsMzVdLFs4LDM2XSxbOCwzNl0sWzgsMzddLFs4LDM3XSxbOCwzOF0sWzgsMzhdLFs3LDE5XSxbNywxOV0sWzcsMTldLFs3LDE5XSxbOCwzMV0sWzgsMzFdLFs4LDMyXSxbOCwzMl0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbOCw1M10sWzgsNTNdLFs4LDU0XSxbOCw1NF0sWzcsMjZdLFs3LDI2XSxbNywyNl0sWzcsMjZdLFs4LDM5XSxbOCwzOV0sWzgsNDBdLFs4LDQwXSxbOCw0MV0sWzgsNDFdLFs4LDQyXSxbOCw0Ml0sWzgsNDNdLFs4LDQzXSxbOCw0NF0sWzgsNDRdLFs3LDIxXSxbNywyMV0sWzcsMjFdLFs3LDIxXSxbNywyOF0sWzcsMjhdLFs3LDI4XSxbNywyOF0sWzgsNjFdLFs4LDYxXSxbOCw2Ml0sWzgsNjJdLFs4LDYzXSxbOCw2M10sWzgsMF0sWzgsMF0sWzgsMzIwXSxbOCwzMjBdLFs4LDM4NF0sWzgsMzg0XSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs3LDI3XSxbNywyN10sWzcsMjddLFs3LDI3XSxbOCw1OV0sWzgsNTldLFs4LDYwXSxbOCw2MF0sWzksMTQ3Ml0sWzksMTUzNl0sWzksMTYwMF0sWzksMTcyOF0sWzcsMThdLFs3LDE4XSxbNywxOF0sWzcsMThdLFs3LDI0XSxbNywyNF0sWzcsMjRdLFs3LDI0XSxbOCw0OV0sWzgsNDldLFs4LDUwXSxbOCw1MF0sWzgsNTFdLFs4LDUxXSxbOCw1Ml0sWzgsNTJdLFs3LDI1XSxbNywyNV0sWzcsMjVdLFs3LDI1XSxbOCw1NV0sWzgsNTVdLFs4LDU2XSxbOCw1Nl0sWzgsNTddLFs4LDU3XSxbOCw1OF0sWzgsNThdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbOCw0NDhdLFs4LDQ0OF0sWzgsNTEyXSxbOCw1MTJdLFs5LDcwNF0sWzksNzY4XSxbOCw2NDBdLFs4LDY0MF0sWzgsNTc2XSxbOCw1NzZdLFs5LDgzMl0sWzksODk2XSxbOSw5NjBdLFs5LDEwMjRdLFs5LDEwODhdLFs5LDExNTJdLFs5LDEyMTZdLFs5LDEyODBdLFs5LDEzNDRdLFs5LDE0MDhdLFs3LDI1Nl0sWzcsMjU2XSxbNywyNTZdLFs3LDI1Nl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XV0saT1bWy0xLC0xXSxbLTEsLTFdLFsxMiwtMl0sWzEyLC0yXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTIsMTk4NF0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjA0OF0sWzEyLDIxMTJdLFsxMiwyMTEyXSxbMTIsMjE3Nl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjI0MF0sWzEyLDIzMDRdLFsxMiwyMzA0XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTg1Nl0sWzExLDE5MjBdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjM2OF0sWzEyLDI0MzJdLFsxMiwyNDMyXSxbMTIsMjQ5Nl0sWzEyLDI0OTZdLFsxMiwyNTYwXSxbMTIsMjU2MF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMiw1Ml0sWzEyLDUyXSxbMTMsNjQwXSxbMTMsNzA0XSxbMTMsNzY4XSxbMTMsODMyXSxbMTIsNTVdLFsxMiw1NV0sWzEyLDU2XSxbMTIsNTZdLFsxMywxMjgwXSxbMTMsMTM0NF0sWzEzLDE0MDhdLFsxMywxNDcyXSxbMTIsNTldLFsxMiw1OV0sWzEyLDYwXSxbMTIsNjBdLFsxMywxNTM2XSxbMTMsMTYwMF0sWzExLDI0XSxbMTEsMjRdLFsxMSwyNF0sWzExLDI0XSxbMTEsMjVdLFsxMSwyNV0sWzExLDI1XSxbMTEsMjVdLFsxMywxNjY0XSxbMTMsMTcyOF0sWzEyLDMyMF0sWzEyLDMyMF0sWzEyLDM4NF0sWzEyLDM4NF0sWzEyLDQ0OF0sWzEyLDQ0OF0sWzEzLDUxMl0sWzEzLDU3Nl0sWzEyLDUzXSxbMTIsNTNdLFsxMiw1NF0sWzEyLDU0XSxbMTMsODk2XSxbMTMsOTYwXSxbMTMsMTAyNF0sWzEzLDEwODhdLFsxMywxMTUyXSxbMTMsMTIxNl0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdXSxvPVtbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzExLDIzXSxbMTEsMjNdLFsxMiw1MF0sWzEyLDUxXSxbMTIsNDRdLFsxMiw0NV0sWzEyLDQ2XSxbMTIsNDddLFsxMiw1N10sWzEyLDU4XSxbMTIsNjFdLFsxMiwyNTZdLFsxMCwxNl0sWzEwLDE2XSxbMTAsMTZdLFsxMCwxNl0sWzEwLDE3XSxbMTAsMTddLFsxMCwxN10sWzEwLDE3XSxbMTIsNDhdLFsxMiw0OV0sWzEyLDYyXSxbMTIsNjNdLFsxMiwzMF0sWzEyLDMxXSxbMTIsMzJdLFsxMiwzM10sWzEyLDQwXSxbMTIsNDFdLFsxMSwyMl0sWzExLDIyXSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzEyLDEyOF0sWzEyLDE5Ml0sWzEyLDI2XSxbMTIsMjddLFsxMiwyOF0sWzEyLDI5XSxbMTEsMTldLFsxMSwxOV0sWzExLDIwXSxbMTEsMjBdLFsxMiwzNF0sWzEyLDM1XSxbMTIsMzZdLFsxMiwzN10sWzEyLDM4XSxbMTIsMzldLFsxMSwyMV0sWzExLDIxXSxbMTIsNDJdLFsxMiw0M10sWzEwLDBdLFsxMCwwXSxbMTAsMF0sWzEwLDBdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl1dLGE9W1stMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzYsOV0sWzYsOF0sWzUsN10sWzUsN10sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl1dO2Z1bmN0aW9uIENDSVRURmF4RGVjb2RlcihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIWV8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLm5leHQpdGhyb3cgbmV3IEVycm9yKCdDQ0lUVEZheERlY29kZXIgLSBpbnZhbGlkICJzb3VyY2UiIHBhcmFtZXRlci4nKTt0aGlzLnNvdXJjZT1lO3RoaXMuZW9mPSExO3RoaXMuZW5jb2Rpbmc9dC5LfHwwO3RoaXMuZW9saW5lPXQuRW5kT2ZMaW5lfHwhMTt0aGlzLmJ5dGVBbGlnbj10LkVuY29kZWRCeXRlQWxpZ258fCExO3RoaXMuY29sdW1ucz10LkNvbHVtbnN8fDE3Mjg7dGhpcy5yb3dzPXQuUm93c3x8MDt2YXIgcixuPXQuRW5kT2ZCbG9jaztudWxsPT1uJiYobj0hMCk7dGhpcy5lb2Jsb2NrPW47dGhpcy5ibGFjaz10LkJsYWNrSXMxfHwhMTt0aGlzLmNvZGluZ0xpbmU9bmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucysxKTt0aGlzLnJlZkxpbmU9bmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucysyKTt0aGlzLmNvZGluZ0xpbmVbMF09dGhpcy5jb2x1bW5zO3RoaXMuY29kaW5nUG9zPTA7dGhpcy5yb3c9MDt0aGlzLm5leHRMaW5lMkQ9dGhpcy5lbmNvZGluZzwwO3RoaXMuaW5wdXRCaXRzPTA7dGhpcy5pbnB1dEJ1Zj0wO3RoaXMub3V0cHV0Qml0cz0wO3RoaXMucm93c0RvbmU9ITE7Zm9yKDswPT09KHI9dGhpcy5fbG9va0JpdHMoMTIpKTspdGhpcy5fZWF0Qml0cygxKTsxPT09ciYmdGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLm5leHRMaW5lMkQ9IXRoaXMuX2xvb2tCaXRzKDEpO3RoaXMuX2VhdEJpdHMoMSl9fUNDSVRURmF4RGVjb2Rlci5wcm90b3R5cGU9e3JlYWROZXh0Q2hhcjpmdW5jdGlvbiByZWFkTmV4dENoYXIoKXtpZih0aGlzLmVvZilyZXR1cm4tMTt2YXIgZSx0LHIsaSxvLGE9dGhpcy5yZWZMaW5lLHM9dGhpcy5jb2RpbmdMaW5lLGM9dGhpcy5jb2x1bW5zO2lmKDA9PT10aGlzLm91dHB1dEJpdHMpe3RoaXMucm93c0RvbmUmJih0aGlzLmVvZj0hMCk7aWYodGhpcy5lb2YpcmV0dXJuLTE7dGhpcy5lcnI9ITE7dmFyIHUsZixsO2lmKHRoaXMubmV4dExpbmUyRCl7Zm9yKGk9MDtzW2ldPGM7KytpKWFbaV09c1tpXTthW2krK109YzthW2ldPWM7c1swXT0wO3RoaXMuY29kaW5nUG9zPTA7ZT0wO3Q9MDtmb3IoO3NbdGhpcy5jb2RpbmdQb3NdPGM7KXN3aXRjaCh1PXRoaXMuX2dldFR3b0RpbUNvZGUoKSl7Y2FzZSAwOnRoaXMuX2FkZFBpeGVscyhhW2UrMV0sdCk7YVtlKzFdPGMmJihlKz0yKTticmVhaztjYXNlIDE6dT1mPTA7aWYodCl7ZG97dSs9bD10aGlzLl9nZXRCbGFja0NvZGUoKX13aGlsZShsPj02NCk7ZG97Zis9bD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShsPj02NCl9ZWxzZXtkb3t1Kz1sPXRoaXMuX2dldFdoaXRlQ29kZSgpfXdoaWxlKGw+PTY0KTtkb3tmKz1sPXRoaXMuX2dldEJsYWNrQ29kZSgpfXdoaWxlKGw+PTY0KX10aGlzLl9hZGRQaXhlbHMoc1t0aGlzLmNvZGluZ1Bvc10rdSx0KTtzW3RoaXMuY29kaW5nUG9zXTxjJiZ0aGlzLl9hZGRQaXhlbHMoc1t0aGlzLmNvZGluZ1Bvc10rZiwxXnQpO2Zvcig7YVtlXTw9c1t0aGlzLmNvZGluZ1Bvc10mJmFbZV08YzspZSs9MjticmVhaztjYXNlIDc6dGhpcy5fYWRkUGl4ZWxzKGFbZV0rMyx0KTt0Xj0xO2lmKHNbdGhpcy5jb2RpbmdQb3NdPGMpeysrZTtmb3IoO2FbZV08PXNbdGhpcy5jb2RpbmdQb3NdJiZhW2VdPGM7KWUrPTJ9YnJlYWs7Y2FzZSA1OnRoaXMuX2FkZFBpeGVscyhhW2VdKzIsdCk7dF49MTtpZihzW3RoaXMuY29kaW5nUG9zXTxjKXsrK2U7Zm9yKDthW2VdPD1zW3RoaXMuY29kaW5nUG9zXSYmYVtlXTxjOyllKz0yfWJyZWFrO2Nhc2UgMzp0aGlzLl9hZGRQaXhlbHMoYVtlXSsxLHQpO3RePTE7aWYoc1t0aGlzLmNvZGluZ1Bvc108Yyl7KytlO2Zvcig7YVtlXTw9c1t0aGlzLmNvZGluZ1Bvc10mJmFbZV08YzspZSs9Mn1icmVhaztjYXNlIDI6dGhpcy5fYWRkUGl4ZWxzKGFbZV0sdCk7dF49MTtpZihzW3RoaXMuY29kaW5nUG9zXTxjKXsrK2U7Zm9yKDthW2VdPD1zW3RoaXMuY29kaW5nUG9zXSYmYVtlXTxjOyllKz0yfWJyZWFrO2Nhc2UgODp0aGlzLl9hZGRQaXhlbHNOZWcoYVtlXS0zLHQpO3RePTE7aWYoc1t0aGlzLmNvZGluZ1Bvc108Yyl7ZT4wPy0tZTorK2U7Zm9yKDthW2VdPD1zW3RoaXMuY29kaW5nUG9zXSYmYVtlXTxjOyllKz0yfWJyZWFrO2Nhc2UgNjp0aGlzLl9hZGRQaXhlbHNOZWcoYVtlXS0yLHQpO3RePTE7aWYoc1t0aGlzLmNvZGluZ1Bvc108Yyl7ZT4wPy0tZTorK2U7Zm9yKDthW2VdPD1zW3RoaXMuY29kaW5nUG9zXSYmYVtlXTxjOyllKz0yfWJyZWFrO2Nhc2UgNDp0aGlzLl9hZGRQaXhlbHNOZWcoYVtlXS0xLHQpO3RePTE7aWYoc1t0aGlzLmNvZGluZ1Bvc108Yyl7ZT4wPy0tZTorK2U7Zm9yKDthW2VdPD1zW3RoaXMuY29kaW5nUG9zXSYmYVtlXTxjOyllKz0yfWJyZWFrO2Nhc2UtMTp0aGlzLl9hZGRQaXhlbHMoYywwKTt0aGlzLmVvZj0hMDticmVhaztkZWZhdWx0OigwLG4uaW5mbykoImJhZCAyZCBjb2RlIik7dGhpcy5fYWRkUGl4ZWxzKGMsMCk7dGhpcy5lcnI9ITB9fWVsc2V7c1swXT0wO3RoaXMuY29kaW5nUG9zPTA7dD0wO2Zvcig7c1t0aGlzLmNvZGluZ1Bvc108Yzspe3U9MDtpZih0KWRve3UrPWw9dGhpcy5fZ2V0QmxhY2tDb2RlKCl9d2hpbGUobD49NjQpO2Vsc2UgZG97dSs9bD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShsPj02NCk7dGhpcy5fYWRkUGl4ZWxzKHNbdGhpcy5jb2RpbmdQb3NdK3UsdCk7dF49MX19dmFyIHA9ITE7dGhpcy5ieXRlQWxpZ24mJih0aGlzLmlucHV0Qml0cyY9LTgpO2lmKHRoaXMuZW9ibG9ja3x8dGhpcy5yb3chPT10aGlzLnJvd3MtMSl7dT10aGlzLl9sb29rQml0cygxMik7aWYodGhpcy5lb2xpbmUpZm9yKDstMSE9PXUmJjEhPT11Oyl7dGhpcy5fZWF0Qml0cygxKTt1PXRoaXMuX2xvb2tCaXRzKDEyKX1lbHNlIGZvcig7MD09PXU7KXt0aGlzLl9lYXRCaXRzKDEpO3U9dGhpcy5fbG9va0JpdHMoMTIpfWlmKDE9PT11KXt0aGlzLl9lYXRCaXRzKDEyKTtwPSEwfWVsc2UtMT09PXUmJih0aGlzLmVvZj0hMCl9ZWxzZSB0aGlzLnJvd3NEb25lPSEwO2lmKCF0aGlzLmVvZiYmdGhpcy5lbmNvZGluZz4wJiYhdGhpcy5yb3dzRG9uZSl7dGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfWlmKHRoaXMuZW9ibG9jayYmcCYmdGhpcy5ieXRlQWxpZ24pe2lmKDE9PT0odT10aGlzLl9sb29rQml0cygxMikpKXt0aGlzLl9lYXRCaXRzKDEyKTtpZih0aGlzLmVuY29kaW5nPjApe3RoaXMuX2xvb2tCaXRzKDEpO3RoaXMuX2VhdEJpdHMoMSl9aWYodGhpcy5lbmNvZGluZz49MClmb3IoaT0wO2k8NDsrK2kpezEhPT0odT10aGlzLl9sb29rQml0cygxMikpJiYoMCxuLmluZm8pKCJiYWQgcnRjIGNvZGU6ICIrdSk7dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfX10aGlzLmVvZj0hMH19ZWxzZSBpZih0aGlzLmVyciYmdGhpcy5lb2xpbmUpe2Zvcig7Oyl7aWYoLTE9PT0odT10aGlzLl9sb29rQml0cygxMykpKXt0aGlzLmVvZj0hMDtyZXR1cm4tMX1pZih1Pj4xPT0xKWJyZWFrO3RoaXMuX2VhdEJpdHMoMSl9dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9lYXRCaXRzKDEpO3RoaXMubmV4dExpbmUyRD0hKDEmdSl9fXNbMF0+MD90aGlzLm91dHB1dEJpdHM9c1t0aGlzLmNvZGluZ1Bvcz0wXTp0aGlzLm91dHB1dEJpdHM9c1t0aGlzLmNvZGluZ1Bvcz0xXTt0aGlzLnJvdysrfWlmKHRoaXMub3V0cHV0Qml0cz49OCl7bz0xJnRoaXMuY29kaW5nUG9zPzA6MjU1O3RoaXMub3V0cHV0Qml0cy09ODtpZigwPT09dGhpcy5vdXRwdXRCaXRzJiZzW3RoaXMuY29kaW5nUG9zXTxjKXt0aGlzLmNvZGluZ1BvcysrO3RoaXMub3V0cHV0Qml0cz1zW3RoaXMuY29kaW5nUG9zXS1zW3RoaXMuY29kaW5nUG9zLTFdfX1lbHNle3I9ODtvPTA7ZG97aWYodGhpcy5vdXRwdXRCaXRzPnIpe288PD1yOzEmdGhpcy5jb2RpbmdQb3N8fChvfD0yNTU+Pjgtcik7dGhpcy5vdXRwdXRCaXRzLT1yO3I9MH1lbHNle288PD10aGlzLm91dHB1dEJpdHM7MSZ0aGlzLmNvZGluZ1Bvc3x8KG98PTI1NT4+OC10aGlzLm91dHB1dEJpdHMpO3ItPXRoaXMub3V0cHV0Qml0czt0aGlzLm91dHB1dEJpdHM9MDtpZihzW3RoaXMuY29kaW5nUG9zXTxjKXt0aGlzLmNvZGluZ1BvcysrO3RoaXMub3V0cHV0Qml0cz1zW3RoaXMuY29kaW5nUG9zXS1zW3RoaXMuY29kaW5nUG9zLTFdfWVsc2UgaWYocj4wKXtvPDw9cjtyPTB9fX13aGlsZShyKX10aGlzLmJsYWNrJiYob149MjU1KTtyZXR1cm4gb30sX2FkZFBpeGVsczpmdW5jdGlvbiBfYWRkUGl4ZWxzKGUsdCl7dmFyIHI9dGhpcy5jb2RpbmdMaW5lLGk9dGhpcy5jb2RpbmdQb3M7aWYoZT5yW2ldKXtpZihlPnRoaXMuY29sdW1ucyl7KDAsbi5pbmZvKSgicm93IGlzIHdyb25nIGxlbmd0aCIpO3RoaXMuZXJyPSEwO2U9dGhpcy5jb2x1bW5zfTEmaV50JiYrK2k7cltpXT1lfXRoaXMuY29kaW5nUG9zPWl9LF9hZGRQaXhlbHNOZWc6ZnVuY3Rpb24gX2FkZFBpeGVsc05lZyhlLHQpe3ZhciByPXRoaXMuY29kaW5nTGluZSxpPXRoaXMuY29kaW5nUG9zO2lmKGU+cltpXSl7aWYoZT50aGlzLmNvbHVtbnMpeygwLG4uaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKTt0aGlzLmVycj0hMDtlPXRoaXMuY29sdW1uc30xJmledCYmKytpO3JbaV09ZX1lbHNlIGlmKGU8cltpXSl7aWYoZTwwKXsoMCxuLmluZm8pKCJpbnZhbGlkIGNvZGUiKTt0aGlzLmVycj0hMDtlPTB9Zm9yKDtpPjAmJmU8cltpLTFdOyktLWk7cltpXT1lfXRoaXMuY29kaW5nUG9zPWl9LF9maW5kVGFibGVDb2RlOmZ1bmN0aW9uIF9maW5kVGFibGVDb2RlKGUsdCxyLG4pe2Zvcih2YXIgaT1ufHwwLG89ZTtvPD10Oysrbyl7dmFyIGE9dGhpcy5fbG9va0JpdHMobyk7aWYoLTE9PT1hKXJldHVyblshMCwxLCExXTtvPHQmJihhPDw9dC1vKTtpZighaXx8YT49aSl7dmFyIHM9clthLWldO2lmKHNbMF09PT1vKXt0aGlzLl9lYXRCaXRzKG8pO3JldHVyblshMCxzWzFdLCEwXX19fXJldHVyblshMSwwLCExXX0sX2dldFR3b0RpbUNvZGU6ZnVuY3Rpb24gX2dldFR3b0RpbUNvZGUoKXt2YXIgdCxyPTA7aWYodGhpcy5lb2Jsb2NrKXtyPXRoaXMuX2xvb2tCaXRzKDcpO2lmKCh0PWVbcl0pJiZ0WzBdPjApe3RoaXMuX2VhdEJpdHModFswXSk7cmV0dXJuIHRbMV19fWVsc2V7dmFyIGk9dGhpcy5fZmluZFRhYmxlQ29kZSgxLDcsZSk7aWYoaVswXSYmaVsyXSlyZXR1cm4gaVsxXX0oMCxuLmluZm8pKCJCYWQgdHdvIGRpbSBjb2RlIik7cmV0dXJuLTF9LF9nZXRXaGl0ZUNvZGU6ZnVuY3Rpb24gX2dldFdoaXRlQ29kZSgpe3ZhciBlLGk9MDtpZih0aGlzLmVvYmxvY2spe2lmKC0xPT09KGk9dGhpcy5fbG9va0JpdHMoMTIpKSlyZXR1cm4gMTtpZigoZT1pPj41PT0wP3RbaV06cltpPj4zXSlbMF0+MCl7dGhpcy5fZWF0Qml0cyhlWzBdKTtyZXR1cm4gZVsxXX19ZWxzZXt2YXIgbz10aGlzLl9maW5kVGFibGVDb2RlKDEsOSxyKTtpZihvWzBdKXJldHVybiBvWzFdO2lmKChvPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsMTIsdCkpWzBdKXJldHVybiBvWzFdfSgwLG4uaW5mbykoImJhZCB3aGl0ZSBjb2RlIik7dGhpcy5fZWF0Qml0cygxKTtyZXR1cm4gMX0sX2dldEJsYWNrQ29kZTpmdW5jdGlvbiBfZ2V0QmxhY2tDb2RlKCl7dmFyIGUsdDtpZih0aGlzLmVvYmxvY2spe2lmKC0xPT09KGU9dGhpcy5fbG9va0JpdHMoMTMpKSlyZXR1cm4gMTtpZigodD1lPj43PT0wP2lbZV06ZT4+OT09MCYmZT4+NyE9MD9vWyhlPj4xKS02NF06YVtlPj43XSlbMF0+MCl7dGhpcy5fZWF0Qml0cyh0WzBdKTtyZXR1cm4gdFsxXX19ZWxzZXt2YXIgcj10aGlzLl9maW5kVGFibGVDb2RlKDIsNixhKTtpZihyWzBdKXJldHVybiByWzFdO2lmKChyPXRoaXMuX2ZpbmRUYWJsZUNvZGUoNywxMixvLDY0KSlbMF0pcmV0dXJuIHJbMV07aWYoKHI9dGhpcy5fZmluZFRhYmxlQ29kZSgxMCwxMyxpKSlbMF0pcmV0dXJuIHJbMV19KDAsbi5pbmZvKSgiYmFkIGJsYWNrIGNvZGUiKTt0aGlzLl9lYXRCaXRzKDEpO3JldHVybiAxfSxfbG9va0JpdHM6ZnVuY3Rpb24gX2xvb2tCaXRzKGUpe2Zvcih2YXIgdDt0aGlzLmlucHV0Qml0czxlOyl7aWYoLTE9PT0odD10aGlzLnNvdXJjZS5uZXh0KCkpKXJldHVybiAwPT09dGhpcy5pbnB1dEJpdHM/LTE6dGhpcy5pbnB1dEJ1Zjw8ZS10aGlzLmlucHV0Qml0cyY2NTUzNT4+MTYtZTt0aGlzLmlucHV0QnVmPXRoaXMuaW5wdXRCdWY8PDh8dDt0aGlzLmlucHV0Qml0cys9OH1yZXR1cm4gdGhpcy5pbnB1dEJ1Zj4+dGhpcy5pbnB1dEJpdHMtZSY2NTUzNT4+MTYtZX0sX2VhdEJpdHM6ZnVuY3Rpb24gX2VhdEJpdHMoZSl7KHRoaXMuaW5wdXRCaXRzLT1lKTwwJiYodGhpcy5pbnB1dEJpdHM9MCl9fTtyZXR1cm4gQ0NJVFRGYXhEZWNvZGVyfSgpO3QuQ0NJVFRGYXhEZWNvZGVyPWl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSnBlZ0ltYWdlPXZvaWQgMDt2YXIgbj1yKDEpLGk9cigxNzkpO2Z1bmN0aW9uIF90eXBlb2YoZSl7cmV0dXJuKF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24gX3R5cGVvZihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uIF90eXBlb2YoZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSkoZSl9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2luaGVyaXRzKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pO3QmJl9zZXRQcm90b3R5cGVPZihlLHQpfWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihlLHQpe3JldHVybihfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YoZSx0KXtlLl9fcHJvdG9fXz10O3JldHVybiBlfSkoZSx0KX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIoZSl7dmFyIHQ9ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKTtyZXR1cm4hMH1jYXRjaChlKXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIHIsbj1fZ2V0UHJvdG90eXBlT2YoZSk7aWYodCl7dmFyIGk9X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO3I9UmVmbGVjdC5jb25zdHJ1Y3Qobixhcmd1bWVudHMsaSl9ZWxzZSByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLHIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihlLHQpe3JldHVybiF0fHwib2JqZWN0IiE9PV90eXBlb2YodCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoZSl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfShlKTp0fWZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihlKXtyZXR1cm4oX2dldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKGUpe3JldHVybiBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpfSkoZSl9dmFyIG89ZnVuY3Rpb24oZSl7X2luaGVyaXRzKEpwZWdFcnJvcixlKTt2YXIgdD1fY3JlYXRlU3VwZXIoSnBlZ0Vycm9yKTtmdW5jdGlvbiBKcGVnRXJyb3IoZSl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsSnBlZ0Vycm9yKTtyZXR1cm4gdC5jYWxsKHRoaXMsIkpQRUcgZXJyb3I6ICIuY29uY2F0KGUpKX1yZXR1cm4gSnBlZ0Vycm9yfShuLkJhc2VFeGNlcHRpb24pLGE9ZnVuY3Rpb24oZSl7X2luaGVyaXRzKEROTE1hcmtlckVycm9yLGUpO3ZhciB0PV9jcmVhdGVTdXBlcihETkxNYXJrZXJFcnJvcik7ZnVuY3Rpb24gRE5MTWFya2VyRXJyb3IoZSxyKXt2YXIgbjtfY2xhc3NDYWxsQ2hlY2sodGhpcyxETkxNYXJrZXJFcnJvcik7KG49dC5jYWxsKHRoaXMsZSkpLnNjYW5MaW5lcz1yO3JldHVybiBufXJldHVybiBETkxNYXJrZXJFcnJvcn0obi5CYXNlRXhjZXB0aW9uKSxzPWZ1bmN0aW9uKGUpe19pbmhlcml0cyhFT0lNYXJrZXJFcnJvcixlKTt2YXIgdD1fY3JlYXRlU3VwZXIoRU9JTWFya2VyRXJyb3IpO2Z1bmN0aW9uIEVPSU1hcmtlckVycm9yKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRU9JTWFya2VyRXJyb3IpO3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gRU9JTWFya2VyRXJyb3J9KG4uQmFzZUV4Y2VwdGlvbiksYz1mdW5jdGlvbiBKcGVnSW1hZ2VDbG9zdXJlKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoWzAsMSw4LDE2LDksMiwzLDEwLDE3LDI0LDMyLDI1LDE4LDExLDQsNSwxMiwxOSwyNiwzMyw0MCw0OCw0MSwzNCwyNywyMCwxMyw2LDcsMTQsMjEsMjgsMzUsNDIsNDksNTYsNTcsNTAsNDMsMzYsMjksMjIsMTUsMjMsMzAsMzcsNDQsNTEsNTgsNTksNTIsNDUsMzgsMzEsMzksNDYsNTMsNjAsNjEsNTQsNDcsNTUsNjIsNjNdKTtmdW5jdGlvbiBKcGVnSW1hZ2UoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sdD1lLmRlY29kZVRyYW5zZm9ybSxyPXZvaWQgMD09PXQ/bnVsbDp0LG49ZS5jb2xvclRyYW5zZm9ybSxpPXZvaWQgMD09PW4/LTE6bjt0aGlzLl9kZWNvZGVUcmFuc2Zvcm09cjt0aGlzLl9jb2xvclRyYW5zZm9ybT1pfWZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGUsdCl7Zm9yKHZhciByLG4saT0wLG89W10sYT0xNjthPjAmJiFlW2EtMV07KWEtLTtvLnB1c2goe2NoaWxkcmVuOltdLGluZGV4OjB9KTt2YXIgcyxjPW9bMF07Zm9yKHI9MDtyPGE7cisrKXtmb3Iobj0wO248ZVtyXTtuKyspeyhjPW8ucG9wKCkpLmNoaWxkcmVuW2MuaW5kZXhdPXRbaV07Zm9yKDtjLmluZGV4PjA7KWM9by5wb3AoKTtjLmluZGV4Kys7by5wdXNoKGMpO2Zvcig7by5sZW5ndGg8PXI7KXtvLnB1c2gocz17Y2hpbGRyZW46W10saW5kZXg6MH0pO2MuY2hpbGRyZW5bYy5pbmRleF09cy5jaGlsZHJlbjtjPXN9aSsrfWlmKHIrMTxhKXtvLnB1c2gocz17Y2hpbGRyZW46W10saW5kZXg6MH0pO2MuY2hpbGRyZW5bYy5pbmRleF09cy5jaGlsZHJlbjtjPXN9fXJldHVybiBvWzBdLmNoaWxkcmVufWZ1bmN0aW9uIGdldEJsb2NrQnVmZmVyT2Zmc2V0KGUsdCxyKXtyZXR1cm4gNjQqKChlLmJsb2Nrc1BlckxpbmUrMSkqdCtyKX1mdW5jdGlvbiBkZWNvZGVTY2FuKHQscixjLHUsZixsLHAsZCxoKXt2YXIgZz1hcmd1bWVudHMubGVuZ3RoPjkmJnZvaWQgMCE9PWFyZ3VtZW50c1s5XSYmYXJndW1lbnRzWzldLHY9Yy5tY3VzUGVyTGluZSxtPWMucHJvZ3Jlc3NpdmUseT1yLGI9MCx4PTA7ZnVuY3Rpb24gcmVhZEJpdCgpe2lmKHg+MCl7eC0tO3JldHVybiBiPj54JjF9aWYoMjU1PT09KGI9dFtyKytdKSl7dmFyIGU9dFtyKytdO2lmKGUpe2lmKDIyMD09PWUmJmcpe3IrPTI7dmFyIG49KDAsaS5yZWFkVWludDE2KSh0LHIpO3IrPTI7aWYobj4wJiZuIT09Yy5zY2FuTGluZXMpdGhyb3cgbmV3IGEoIkZvdW5kIEROTCBtYXJrZXIgKDB4RkZEQykgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiLG4pfWVsc2UgaWYoMjE3PT09ZSl7aWYoZyl7dmFyIHU9VCooOD09PWMucHJlY2lzaW9uPzg6MCk7aWYodT4wJiZNYXRoLnJvdW5kKGMuc2NhbkxpbmVzL3UpPj0xMCl0aHJvdyBuZXcgYSgiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgcG9zc2libHkgY2F1c2VkIGJ5IGluY29ycmVjdCBgc2NhbkxpbmVzYCBwYXJhbWV0ZXIiLHUpfXRocm93IG5ldyBzKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIil9dGhyb3cgbmV3IG8oInVuZXhwZWN0ZWQgbWFya2VyICIuY29uY2F0KChiPDw4fGUpLnRvU3RyaW5nKDE2KSkpfX14PTc7cmV0dXJuIGI+Pj43fWZ1bmN0aW9uIGRlY29kZUh1ZmZtYW4oZSl7Zm9yKHZhciB0PWU7Oyl7c3dpdGNoKF90eXBlb2YodD10W3JlYWRCaXQoKV0pKXtjYXNlIm51bWJlciI6cmV0dXJuIHQ7Y2FzZSJvYmplY3QiOmNvbnRpbnVlfXRocm93IG5ldyBvKCJpbnZhbGlkIGh1ZmZtYW4gc2VxdWVuY2UiKX19ZnVuY3Rpb24gcmVjZWl2ZShlKXtmb3IodmFyIHQ9MDtlPjA7KXt0PXQ8PDF8cmVhZEJpdCgpO2UtLX1yZXR1cm4gdH1mdW5jdGlvbiByZWNlaXZlQW5kRXh0ZW5kKGUpe2lmKDE9PT1lKXJldHVybiAxPT09cmVhZEJpdCgpPzE6LTE7dmFyIHQ9cmVjZWl2ZShlKTtyZXR1cm4gdD49MTw8ZS0xP3Q6dCsoLTE8PGUpKzF9ZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUodCxyKXt2YXIgbj1kZWNvZGVIdWZmbWFuKHQuaHVmZm1hblRhYmxlREMpLGk9MD09PW4/MDpyZWNlaXZlQW5kRXh0ZW5kKG4pO3QuYmxvY2tEYXRhW3JdPXQucHJlZCs9aTtmb3IodmFyIG89MTtvPDY0Oyl7dmFyIGE9ZGVjb2RlSHVmZm1hbih0Lmh1ZmZtYW5UYWJsZUFDKSxzPTE1JmEsYz1hPj40O2lmKDAhPT1zKXt2YXIgdT1lW28rPWNdO3QuYmxvY2tEYXRhW3IrdV09cmVjZWl2ZUFuZEV4dGVuZChzKTtvKyt9ZWxzZXtpZihjPDE1KWJyZWFrO28rPTE2fX19ZnVuY3Rpb24gZGVjb2RlRENGaXJzdChlLHQpe3ZhciByPWRlY29kZUh1ZmZtYW4oZS5odWZmbWFuVGFibGVEQyksbj0wPT09cj8wOnJlY2VpdmVBbmRFeHRlbmQocik8PGg7ZS5ibG9ja0RhdGFbdF09ZS5wcmVkKz1ufWZ1bmN0aW9uIGRlY29kZURDU3VjY2Vzc2l2ZShlLHQpe2UuYmxvY2tEYXRhW3RdfD1yZWFkQml0KCk8PGh9dmFyIHc9MDtmdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KHQscil7aWYodz4wKXctLTtlbHNlIGZvcih2YXIgbj1sLGk9cDtuPD1pOyl7dmFyIG89ZGVjb2RlSHVmZm1hbih0Lmh1ZmZtYW5UYWJsZUFDKSxhPTE1Jm8scz1vPj40O2lmKDAhPT1hKXt2YXIgYz1lW24rPXNdO3QuYmxvY2tEYXRhW3IrY109cmVjZWl2ZUFuZEV4dGVuZChhKSooMTw8aCk7bisrfWVsc2V7aWYoczwxNSl7dz1yZWNlaXZlKHMpKygxPDxzKS0xO2JyZWFrfW4rPTE2fX19dmFyIFMsXz0wO2Z1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZSh0LHIpe2Zvcih2YXIgbixpLGE9bCxzPXAsYz0wO2E8PXM7KXt2YXIgdT1yK2VbYV0sZj10LmJsb2NrRGF0YVt1XTwwPy0xOjE7c3dpdGNoKF8pe2Nhc2UgMDpjPShpPWRlY29kZUh1ZmZtYW4odC5odWZmbWFuVGFibGVBQykpPj40O2lmKDA9PT0obj0xNSZpKSlpZihjPDE1KXt3PXJlY2VpdmUoYykrKDE8PGMpO189NH1lbHNle2M9MTY7Xz0xfWVsc2V7aWYoMSE9PW4pdGhyb3cgbmV3IG8oImludmFsaWQgQUNuIGVuY29kaW5nIik7Uz1yZWNlaXZlQW5kRXh0ZW5kKG4pO189Yz8yOjN9Y29udGludWU7Y2FzZSAxOmNhc2UgMjp0LmJsb2NrRGF0YVt1XT90LmJsb2NrRGF0YVt1XSs9ZioocmVhZEJpdCgpPDxoKTowPT09LS1jJiYoXz0yPT09Xz8zOjApO2JyZWFrO2Nhc2UgMzppZih0LmJsb2NrRGF0YVt1XSl0LmJsb2NrRGF0YVt1XSs9ZioocmVhZEJpdCgpPDxoKTtlbHNle3QuYmxvY2tEYXRhW3VdPVM8PGg7Xz0wfWJyZWFrO2Nhc2UgNDp0LmJsb2NrRGF0YVt1XSYmKHQuYmxvY2tEYXRhW3VdKz1mKihyZWFkQml0KCk8PGgpKX1hKyt9ND09PV8mJjA9PT0tLXcmJihfPTApfXZhciBUPTA7ZnVuY3Rpb24gZGVjb2RlTWN1KGUsdCxyLG4saSl7dmFyIG89ciV2O1Q9KHIvdnwwKSplLnYrbjt2YXIgYT1vKmUuaCtpO3QoZSxnZXRCbG9ja0J1ZmZlck9mZnNldChlLFQsYSkpfWZ1bmN0aW9uIGRlY29kZUJsb2NrKGUsdCxyKXtUPXIvZS5ibG9ja3NQZXJMaW5lfDA7dmFyIG49ciVlLmJsb2Nrc1BlckxpbmU7dChlLGdldEJsb2NrQnVmZmVyT2Zmc2V0KGUsVCxuKSl9dmFyIFAsQyxrLEksTyxFLEE9dS5sZW5ndGg7RT1tPzA9PT1sPzA9PT1kP2RlY29kZURDRmlyc3Q6ZGVjb2RlRENTdWNjZXNzaXZlOjA9PT1kP2RlY29kZUFDRmlyc3Q6ZGVjb2RlQUNTdWNjZXNzaXZlOmRlY29kZUJhc2VsaW5lO3ZhciBSLE0sRCxMLEI9MDtNPTE9PT1BP3VbMF0uYmxvY2tzUGVyTGluZSp1WzBdLmJsb2Nrc1BlckNvbHVtbjp2KmMubWN1c1BlckNvbHVtbjtmb3IoO0I8PU07KXt2YXIgVT1mP01hdGgubWluKE0tQixmKTpNO2lmKFU+MCl7Zm9yKEM9MDtDPEE7QysrKXVbQ10ucHJlZD0wO3c9MDtpZigxPT09QSl7UD11WzBdO2ZvcihPPTA7TzxVO08rKyl7ZGVjb2RlQmxvY2soUCxFLEIpO0IrK319ZWxzZSBmb3IoTz0wO088VTtPKyspe2ZvcihDPTA7QzxBO0MrKyl7RD0oUD11W0NdKS5oO0w9UC52O2ZvcihrPTA7azxMO2srKylmb3IoST0wO0k8RDtJKyspZGVjb2RlTWN1KFAsRSxCLGssSSl9QisrfX14PTA7aWYoIShSPWZpbmROZXh0RmlsZU1hcmtlcih0LHIpKSlicmVhaztpZihSLmludmFsaWQpe3ZhciBOPVU+MD8idW5leHBlY3RlZCI6ImV4Y2Vzc2l2ZSI7KDAsbi53YXJuKSgiZGVjb2RlU2NhbiAtICIuY29uY2F0KE4sIiBNQ1UgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICIpLmNvbmNhdChSLmludmFsaWQpKTtyPVIub2Zmc2V0fWlmKCEoUi5tYXJrZXI+PTY1NDg4JiZSLm1hcmtlcjw9NjU0OTUpKWJyZWFrO3IrPTJ9cmV0dXJuIHIteX1mdW5jdGlvbiBxdWFudGl6ZUFuZEludmVyc2UoZSx0LHIpe3ZhciBuLGksYSxzLGMsdSxmLGwscCxkLGgsZyx2LG0seSxiLHgsdz1lLnF1YW50aXphdGlvblRhYmxlLFM9ZS5ibG9ja0RhdGE7aWYoIXcpdGhyb3cgbmV3IG8oIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpO2Zvcih2YXIgXz0wO188NjQ7Xys9OCl7cD1TW3QrX107ZD1TW3QrXysxXTtoPVNbdCtfKzJdO2c9U1t0K18rM107dj1TW3QrXys0XTttPVNbdCtfKzVdO3k9U1t0K18rNl07Yj1TW3QrXys3XTtwKj13W19dO2lmKDAhPShkfGh8Z3x2fG18eXxiKSl7ZCo9d1tfKzFdO2gqPXdbXysyXTtnKj13W18rM107dio9d1tfKzRdO20qPXdbXys1XTtpPShuPShuPTU3OTMqcCsxMjg+PjgpKyhpPTU3OTMqdisxMjg+PjgpKzE+PjEpLWk7eD0zNzg0KihhPWgpKzE1NjcqKHM9eSo9d1tfKzZdKSsxMjg+Pjg7YT0xNTY3KmEtMzc4NCpzKzEyOD4+ODtmPShjPShjPTI4OTYqKGQtKGIqPXdbXys3XSkpKzEyOD4+OCkrKGY9bTw8NCkrMT4+MSktZjt1PShsPShsPTI4OTYqKGQrYikrMTI4Pj44KSsodT1nPDw0KSsxPj4xKS11O3M9KG49bisocz14KSsxPj4xKS1zO2E9KGk9aSthKzE+PjEpLWE7eD0yMjc2KmMrMzQwNipsKzIwNDg+PjEyO2M9MzQwNipjLTIyNzYqbCsyMDQ4Pj4xMjtsPXg7eD03OTkqdSs0MDE3KmYrMjA0OD4+MTI7dT00MDE3KnUtNzk5KmYrMjA0OD4+MTI7Zj14O3JbX109bitsO3JbXys3XT1uLWw7cltfKzFdPWkrZjtyW18rNl09aS1mO3JbXysyXT1hK3U7cltfKzVdPWEtdTtyW18rM109cytjO3JbXys0XT1zLWN9ZWxzZXt4PTU3OTMqcCs1MTI+PjEwO3JbX109eDtyW18rMV09eDtyW18rMl09eDtyW18rM109eDtyW18rNF09eDtyW18rNV09eDtyW18rNl09eDtyW18rN109eH19Zm9yKHZhciBUPTA7VDw4OysrVCl7cD1yW1RdO2lmKDAhPSgoZD1yW1QrOF0pfChoPXJbVCsxNl0pfChnPXJbVCsyNF0pfCh2PXJbVCszMl0pfChtPXJbVCs0MF0pfCh5PXJbVCs0OF0pfChiPXJbVCs1Nl0pKSl7aT0obj00MTEyKygobj01NzkzKnArMjA0OD4+MTIpKyhpPTU3OTMqdisyMDQ4Pj4xMikrMT4+MSkpLWk7eD0zNzg0KihhPWgpKzE1NjcqKHM9eSkrMjA0OD4+MTI7YT0xNTY3KmEtMzc4NCpzKzIwNDg+PjEyO3M9eDtmPShjPShjPTI4OTYqKGQtYikrMjA0OD4+MTIpKyhmPW0pKzE+PjEpLWY7dT0obD0obD0yODk2KihkK2IpKzIwNDg+PjEyKSsodT1nKSsxPj4xKS11O3g9MjI3NipjKzM0MDYqbCsyMDQ4Pj4xMjtjPTM0MDYqYy0yMjc2KmwrMjA0OD4+MTI7bD14O3g9Nzk5KnUrNDAxNypmKzIwNDg+PjEyO3U9NDAxNyp1LTc5OSpmKzIwNDg+PjEyOyhwPShuPW4rcysxPj4xKStsKTwxNj9wPTA6cD49NDA4MD9wPTI1NTpwPj49NDsoZD0oaT1pK2ErMT4+MSkrKGY9eCkpPDE2P2Q9MDpkPj00MDgwP2Q9MjU1OmQ+Pj00OyhoPShhPWktYSkrdSk8MTY/aD0wOmg+PTQwODA/aD0yNTU6aD4+PTQ7KGc9KHM9bi1zKStjKTwxNj9nPTA6Zz49NDA4MD9nPTI1NTpnPj49NDsodj1zLWMpPDE2P3Y9MDp2Pj00MDgwP3Y9MjU1OnY+Pj00OyhtPWEtdSk8MTY/bT0wOm0+PTQwODA/bT0yNTU6bT4+PTQ7KHk9aS1mKTwxNj95PTA6eT49NDA4MD95PTI1NTp5Pj49NDsoYj1uLWwpPDE2P2I9MDpiPj00MDgwP2I9MjU1OmI+Pj00O1NbdCtUXT1wO1NbdCtUKzhdPWQ7U1t0K1QrMTZdPWg7U1t0K1QrMjRdPWc7U1t0K1QrMzJdPXY7U1t0K1QrNDBdPW07U1t0K1QrNDhdPXk7U1t0K1QrNTZdPWJ9ZWxzZXt4PSh4PTU3OTMqcCs4MTkyPj4xNCk8LTIwNDA/MDp4Pj0yMDI0PzI1NTp4KzIwNTY+PjQ7U1t0K1RdPXg7U1t0K1QrOF09eDtTW3QrVCsxNl09eDtTW3QrVCsyNF09eDtTW3QrVCszMl09eDtTW3QrVCs0MF09eDtTW3QrVCs0OF09eDtTW3QrVCs1Nl09eH19fWZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50RGF0YShlLHQpe2Zvcih2YXIgcj10LmJsb2Nrc1BlckxpbmUsbj10LmJsb2Nrc1BlckNvbHVtbixpPW5ldyBJbnQxNkFycmF5KDY0KSxvPTA7bzxuO28rKylmb3IodmFyIGE9MDthPHI7YSsrKXtxdWFudGl6ZUFuZEludmVyc2UodCxnZXRCbG9ja0J1ZmZlck9mZnNldCh0LG8sYSksaSl9cmV0dXJuIHQuYmxvY2tEYXRhfWZ1bmN0aW9uIGZpbmROZXh0RmlsZU1hcmtlcihlLHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0LG49ZS5sZW5ndGgtMSxvPXI8dD9yOnQ7aWYodD49bilyZXR1cm4gbnVsbDt2YXIgYT0oMCxpLnJlYWRVaW50MTYpKGUsdCk7aWYoYT49NjU0NzImJmE8PTY1NTM0KXJldHVybntpbnZhbGlkOm51bGwsbWFya2VyOmEsb2Zmc2V0OnR9O2Zvcih2YXIgcz0oMCxpLnJlYWRVaW50MTYpKGUsbyk7IShzPj02NTQ3MiYmczw9NjU1MzQpOyl7aWYoKytvPj1uKXJldHVybiBudWxsO3M9KDAsaS5yZWFkVWludDE2KShlLG8pfXJldHVybntpbnZhbGlkOmEudG9TdHJpbmcoMTYpLG1hcmtlcjpzLG9mZnNldDpvfX1KcGVnSW1hZ2UucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbiBwYXJzZSh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sYz1yLmRubFNjYW5MaW5lcyx1PXZvaWQgMD09PWM/bnVsbDpjO2Z1bmN0aW9uIHJlYWREYXRhQmxvY2soKXt2YXIgZT0oMCxpLnJlYWRVaW50MTYpKHQscCkscj0ocCs9MikrZS0yLG89ZmluZE5leHRGaWxlTWFya2VyKHQscixwKTtpZihvJiZvLmludmFsaWQpeygwLG4ud2FybikoInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIitvLmludmFsaWQpO3I9by5vZmZzZXR9dmFyIGE9dC5zdWJhcnJheShwLHIpO3ArPWEubGVuZ3RoO3JldHVybiBhfWZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGUpe2Zvcih2YXIgdD1NYXRoLmNlaWwoZS5zYW1wbGVzUGVyTGluZS84L2UubWF4SCkscj1NYXRoLmNlaWwoZS5zY2FuTGluZXMvOC9lLm1heFYpLG49MDtuPGUuY29tcG9uZW50cy5sZW5ndGg7bisrKXtXPWUuY29tcG9uZW50c1tuXTt2YXIgaT1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2FtcGxlc1BlckxpbmUvOCkqVy5oL2UubWF4SCksbz1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2NhbkxpbmVzLzgpKlcudi9lLm1heFYpLGE9dCpXLmgscz02NCoocipXLnYpKihhKzEpO1cuYmxvY2tEYXRhPW5ldyBJbnQxNkFycmF5KHMpO1cuYmxvY2tzUGVyTGluZT1pO1cuYmxvY2tzUGVyQ29sdW1uPW99ZS5tY3VzUGVyTGluZT10O2UubWN1c1BlckNvbHVtbj1yfXZhciBmLGwscD0wLGQ9bnVsbCxoPW51bGwsZz0wLHY9W10sbT1bXSx5PVtdLGI9KDAsaS5yZWFkVWludDE2KSh0LHApO3ArPTI7aWYoNjU0OTYhPT1iKXRocm93IG5ldyBvKCJTT0kgbm90IGZvdW5kIik7Yj0oMCxpLnJlYWRVaW50MTYpKHQscCk7cCs9MjtlOmZvcig7NjU0OTchPT1iOyl7dmFyIHgsdyxTO3N3aXRjaChiKXtjYXNlIDY1NTA0OmNhc2UgNjU1MDU6Y2FzZSA2NTUwNjpjYXNlIDY1NTA3OmNhc2UgNjU1MDg6Y2FzZSA2NTUwOTpjYXNlIDY1NTEwOmNhc2UgNjU1MTE6Y2FzZSA2NTUxMjpjYXNlIDY1NTEzOmNhc2UgNjU1MTQ6Y2FzZSA2NTUxNTpjYXNlIDY1NTE2OmNhc2UgNjU1MTc6Y2FzZSA2NTUxODpjYXNlIDY1NTE5OmNhc2UgNjU1MzQ6dmFyIF89cmVhZERhdGFCbG9jaygpOzY1NTA0PT09YiYmNzQ9PT1fWzBdJiY3MD09PV9bMV0mJjczPT09X1syXSYmNzA9PT1fWzNdJiYwPT09X1s0XSYmKGQ9e3ZlcnNpb246e21ham9yOl9bNV0sbWlub3I6X1s2XX0sZGVuc2l0eVVuaXRzOl9bN10seERlbnNpdHk6X1s4XTw8OHxfWzldLHlEZW5zaXR5Ol9bMTBdPDw4fF9bMTFdLHRodW1iV2lkdGg6X1sxMl0sdGh1bWJIZWlnaHQ6X1sxM10sdGh1bWJEYXRhOl8uc3ViYXJyYXkoMTQsMTQrMypfWzEyXSpfWzEzXSl9KTs2NTUxOD09PWImJjY1PT09X1swXSYmMTAwPT09X1sxXSYmMTExPT09X1syXSYmOTg9PT1fWzNdJiYxMDE9PT1fWzRdJiYoaD17dmVyc2lvbjpfWzVdPDw4fF9bNl0sZmxhZ3MwOl9bN108PDh8X1s4XSxmbGFnczE6X1s5XTw8OHxfWzEwXSx0cmFuc2Zvcm1Db2RlOl9bMTFdfSk7YnJlYWs7Y2FzZSA2NTQ5OTpmb3IodmFyIFQ9KDAsaS5yZWFkVWludDE2KSh0LHApLFA9VCsocCs9MiktMjtwPFA7KXt2YXIgQz10W3ArK10saz1uZXcgVWludDE2QXJyYXkoNjQpO2lmKEM+PjQ9PTApZm9yKHc9MDt3PDY0O3crKylrW2Vbd11dPXRbcCsrXTtlbHNle2lmKEM+PjQhPTEpdGhyb3cgbmV3IG8oIkRRVCAtIGludmFsaWQgdGFibGUgc3BlYyIpO2Zvcih3PTA7dzw2NDt3Kyspe2tbZVt3XV09KDAsaS5yZWFkVWludDE2KSh0LHApO3ArPTJ9fXZbMTUmQ109a31icmVhaztjYXNlIDY1NDcyOmNhc2UgNjU0NzM6Y2FzZSA2NTQ3NDppZihmKXRocm93IG5ldyBvKCJPbmx5IHNpbmdsZSBmcmFtZSBKUEVHcyBzdXBwb3J0ZWQiKTtwKz0yOyhmPXt9KS5leHRlbmRlZD02NTQ3Mz09PWI7Zi5wcm9ncmVzc2l2ZT02NTQ3ND09PWI7Zi5wcmVjaXNpb249dFtwKytdO3ZhciBJPSgwLGkucmVhZFVpbnQxNikodCxwKTtwKz0yO2Yuc2NhbkxpbmVzPXV8fEk7Zi5zYW1wbGVzUGVyTGluZT0oMCxpLnJlYWRVaW50MTYpKHQscCk7cCs9MjtmLmNvbXBvbmVudHM9W107Zi5jb21wb25lbnRJZHM9e307dmFyIE8sRT10W3ArK10sQT0wLFI9MDtmb3IoeD0wO3g8RTt4Kyspe089dFtwXTt2YXIgTT10W3ArMV0+PjQsRD0xNSZ0W3ArMV07QTxNJiYoQT1NKTtSPEQmJihSPUQpO3ZhciBMPXRbcCsyXTtTPWYuY29tcG9uZW50cy5wdXNoKHtoOk0sdjpELHF1YW50aXphdGlvbklkOkwscXVhbnRpemF0aW9uVGFibGU6bnVsbH0pO2YuY29tcG9uZW50SWRzW09dPVMtMTtwKz0zfWYubWF4SD1BO2YubWF4Vj1SO3ByZXBhcmVDb21wb25lbnRzKGYpO2JyZWFrO2Nhc2UgNjU0NzY6dmFyIEI9KDAsaS5yZWFkVWludDE2KSh0LHApO3ArPTI7Zm9yKHg9Mjt4PEI7KXt2YXIgVT10W3ArK10sTj1uZXcgVWludDhBcnJheSgxNiksaj0wO2Zvcih3PTA7dzwxNjt3KysscCsrKWorPU5bd109dFtwXTt2YXIgej1uZXcgVWludDhBcnJheShqKTtmb3Iodz0wO3c8ajt3KysscCsrKXpbd109dFtwXTt4Kz0xNytqOyhVPj40PT0wP3k6bSlbMTUmVV09YnVpbGRIdWZmbWFuVGFibGUoTix6KX1icmVhaztjYXNlIDY1NTAxOnArPTI7bD0oMCxpLnJlYWRVaW50MTYpKHQscCk7cCs9MjticmVhaztjYXNlIDY1NDk4OnZhciBIPTE9PSsrZyYmIXU7cCs9Mjt2YXIgVyxYPXRbcCsrXSxxPVtdO2Zvcih4PTA7eDxYO3grKyl7dmFyIFk9dFtwKytdLFY9Zi5jb21wb25lbnRJZHNbWV07KFc9Zi5jb21wb25lbnRzW1ZdKS5pbmRleD1ZO3ZhciBKPXRbcCsrXTtXLmh1ZmZtYW5UYWJsZURDPXlbSj4+NF07Vy5odWZmbWFuVGFibGVBQz1tWzE1JkpdO3EucHVzaChXKX12YXIgRz10W3ArK10sSz10W3ArK10sUT10W3ArK107dHJ5e3ZhciBaPWRlY29kZVNjYW4odCxwLGYscSxsLEcsSyxRPj40LDE1JlEsSCk7cCs9Wn1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgYSl7KDAsbi53YXJuKSgiIi5jb25jYXQoZS5tZXNzYWdlLCIgLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS4iKSk7cmV0dXJuIHRoaXMucGFyc2UodCx7ZG5sU2NhbkxpbmVzOmUuc2NhbkxpbmVzfSl9aWYoZSBpbnN0YW5jZW9mIHMpeygwLG4ud2FybikoIiIuY29uY2F0KGUubWVzc2FnZSwiIC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLiIpKTticmVhayBlfXRocm93IGV9YnJlYWs7Y2FzZSA2NTUwMDpwKz00O2JyZWFrO2Nhc2UgNjU1MzU6MjU1IT09dFtwXSYmcC0tO2JyZWFrO2RlZmF1bHQ6dmFyICQ9ZmluZE5leHRGaWxlTWFya2VyKHQscC0yLHAtMyk7aWYoJCYmJC5pbnZhbGlkKXsoMCxuLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAiKyQuaW52YWxpZCk7cD0kLm9mZnNldDticmVha31pZihwPj10Lmxlbmd0aC0xKXsoMCxuLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGltYWdlIGRhdGEgd2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuIik7YnJlYWsgZX10aHJvdyBuZXcgbygiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6ICIrYi50b1N0cmluZygxNikpfWI9KDAsaS5yZWFkVWludDE2KSh0LHApO3ArPTJ9dGhpcy53aWR0aD1mLnNhbXBsZXNQZXJMaW5lO3RoaXMuaGVpZ2h0PWYuc2NhbkxpbmVzO3RoaXMuamZpZj1kO3RoaXMuYWRvYmU9aDt0aGlzLmNvbXBvbmVudHM9W107Zm9yKHg9MDt4PGYuY29tcG9uZW50cy5sZW5ndGg7eCsrKXt2YXIgZWU9dlsoVz1mLmNvbXBvbmVudHNbeF0pLnF1YW50aXphdGlvbklkXTtlZSYmKFcucXVhbnRpemF0aW9uVGFibGU9ZWUpO3RoaXMuY29tcG9uZW50cy5wdXNoKHtpbmRleDpXLmluZGV4LG91dHB1dDpidWlsZENvbXBvbmVudERhdGEoMCxXKSxzY2FsZVg6Vy5oL2YubWF4SCxzY2FsZVk6Vy52L2YubWF4VixibG9ja3NQZXJMaW5lOlcuYmxvY2tzUGVyTGluZSxibG9ja3NQZXJDb2x1bW46Vy5ibG9ja3NQZXJDb2x1bW59KX10aGlzLm51bUNvbXBvbmVudHM9dGhpcy5jb21wb25lbnRzLmxlbmd0aH0sX2dldExpbmVhcml6ZWRCbG9ja0RhdGE6ZnVuY3Rpb24gX2dldExpbmVhcml6ZWRCbG9ja0RhdGEoZSx0KXt2YXIgcixuLGksbyxhLHMsYyx1LGYsbCxwLGQsaD1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLGc9dGhpcy53aWR0aC9lLHY9dGhpcy5oZWlnaHQvdCxtPTAseT10aGlzLmNvbXBvbmVudHMubGVuZ3RoLGI9ZSp0KnkseD1uZXcgVWludDhDbGFtcGVkQXJyYXkoYiksdz1uZXcgVWludDMyQXJyYXkoZSksUz00Mjk0OTY3Mjg4O2ZvcihjPTA7Yzx5O2MrKyl7bj0ocj10aGlzLmNvbXBvbmVudHNbY10pLnNjYWxlWCpnO2k9ci5zY2FsZVkqdjttPWM7cD1yLm91dHB1dDtvPXIuYmxvY2tzUGVyTGluZSsxPDwzO2lmKG4hPT1kKXtmb3IoYT0wO2E8ZTthKyspe3U9MHxhKm47d1thXT0odSZTKTw8M3w3JnV9ZD1ufWZvcihzPTA7czx0O3MrKyl7bD1vKigodT0wfHMqaSkmUyl8KDcmdSk8PDM7Zm9yKGE9MDthPGU7YSsrKXt4W21dPXBbbCt3W2FdXTttKz15fX19dmFyIF89dGhpcy5fZGVjb2RlVHJhbnNmb3JtO2h8fDQhPT15fHxffHwoXz1uZXcgSW50MzJBcnJheShbLTI1NiwyNTUsLTI1NiwyNTUsLTI1NiwyNTUsLTI1NiwyNTVdKSk7aWYoXylmb3IoYz0wO2M8YjspZm9yKHU9MCxmPTA7dTx5O3UrKyxjKyssZis9Mil4W2NdPSh4W2NdKl9bZl0+PjgpK19bZisxXTtyZXR1cm4geH0sZ2V0IF9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCgpe3JldHVybiB0aGlzLmFkb2JlPyEhdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlOjM9PT10aGlzLm51bUNvbXBvbmVudHM/MCE9PXRoaXMuX2NvbG9yVHJhbnNmb3JtJiYoODIhPT10aGlzLmNvbXBvbmVudHNbMF0uaW5kZXh8fDcxIT09dGhpcy5jb21wb25lbnRzWzFdLmluZGV4fHw2NiE9PXRoaXMuY29tcG9uZW50c1syXS5pbmRleCk6MT09PXRoaXMuX2NvbG9yVHJhbnNmb3JtfSxfY29udmVydFljY1RvUmdiOmZ1bmN0aW9uIGNvbnZlcnRZY2NUb1JnYihlKXtmb3IodmFyIHQscixuLGk9MCxvPWUubGVuZ3RoO2k8bztpKz0zKXt0PWVbaV07cj1lW2krMV07bj1lW2krMl07ZVtpXT10LTE3OS40NTYrMS40MDIqbjtlW2krMV09dCsxMzUuNDU5LS4zNDQqci0uNzE0Km47ZVtpKzJdPXQtMjI2LjgxNisxLjc3MipyfXJldHVybiBlfSxfY29udmVydFljY2tUb1JnYjpmdW5jdGlvbiBjb252ZXJ0WWNja1RvUmdiKGUpe2Zvcih2YXIgdCxyLG4saSxvPTAsYT0wLHM9ZS5sZW5ndGg7YTxzO2ErPTQpe3Q9ZVthXTtyPWVbYSsxXTtuPWVbYSsyXTtpPWVbYSszXTtlW28rK109ciooLTY2MDYzNTY2OTQyMDM2NGUtMTkqcisuMDAwNDM3MTMwNDc1OTI2MjMyKm4tNTQwODA2MTAwNjQ1OTllLTE4KnQrLjAwMDQ4NDQ5Nzk3MTIwMjgxKmktLjE1NDM2MjE1MTg3MTEyNiktMTIyLjY3MTk1NDA2ODk0K24qKC0uMDAwOTU3OTY0Mzc4NDQ1NzczKm4rLjAwMDgxNzA3NjkxMTM0NjYyNSp0LS4wMDQ3NzI3MTQwNTQwODc0NyppKzEuNTMzODAyNTMyMjE3MzQpK3QqKC4wMDA5NjEyNTAxODQxMzA2ODgqdC0uMDAyNjYyNTczMzIyODM5MzMqaSsuNDgzNTcwODg0NTEyNjUpK2kqKC0uMDAwMzM2MTk3MTc3NjE4Mzk0KmkrLjQ4NDc5MTU2MTQ5MDc3Nik7ZVtvKytdPTEwNy4yNjgwMzkzOTc3MjQrciooMjE5OTI3MTA0NTI1NzQxZS0xOSpyLS4wMDA2NDA5OTIwMTgyOTc5NDUqbisuMDAwNjU5Mzk3MDAxMjQ1NTc3KnQrLjAwMDQyNjEwNTY1MjkzODgzNyppLS4xNzY0OTE3OTI0NjI4NzUpK24qKC0uMDAwNzc4MjY5OTQxNTEzNjgzKm4rLjAwMTMwODcyMjYxNDA4Mjc1KnQrLjAwMDc3MDQ4MjYzMTgwMTEzMippLS4xNTEwNTE0OTI3NzU1NjIpK3QqKC4wMDEyNjkzNTM2ODExNDg0Myp0LS4wMDI2NTA5MDE4OTAxMDg5OCppKy4yNTgwMjkxMDIwNjg0NSkraSooLS4wMDAzMTg5MTMxMTc1ODgzMjgqaS0uMjEzNzQyNDAwMzIzNjY1KTtlW28rK109ciooLS4wMDA1NzAxMTUxOTY5NzM2Nzcqci0yNjM0MDkwNTEwMDQ1ODllLTE5Km4rLjAwMjA3NDEwODgxMTUwMTIqdC0uMDAyODgyNjAyMzY4NTM0NDIqaSsuODE0MjcyOTY4MzU5Mjk1KS0yMC44MTAwMTI1NDY5NDcrbiooLTE1MzQ5NjA1NzQ0MDk3NWUtMTkqbi0uMDAwMTMyNjg5MDQzOTYxNDQ2KnQrLjAwMDU2MDgzMzY5MTI0MjgxMippLS4xOTUxNTIwMjc1MzQwNDkpK3QqKC4wMDE3NDQxODEzMjkyNzU4Mip0LS4wMDI1NTI0MzMyMTQzOTM0NyppKy4xMTY5MzUwMjA0NjUxNDUpK2kqKC0uMDAwMzQzNTMxOTk2NTEwNTU1KmkrLjI0MTY1MjYwMjMyNDA3KX1yZXR1cm4gZS5zdWJhcnJheSgwLG8pfSxfY29udmVydFljY2tUb0NteWs6ZnVuY3Rpb24gY29udmVydFljY2tUb0NteWsoZSl7Zm9yKHZhciB0LHIsbixpPTAsbz1lLmxlbmd0aDtpPG87aSs9NCl7dD1lW2ldO3I9ZVtpKzFdO249ZVtpKzJdO2VbaV09NDM0LjQ1Ni10LTEuNDAyKm47ZVtpKzFdPTExOS41NDEtdCsuMzQ0KnIrLjcxNCpuO2VbaSsyXT00ODEuODE2LXQtMS43NzIqcn1yZXR1cm4gZX0sX2NvbnZlcnRDbXlrVG9SZ2I6ZnVuY3Rpb24gY29udmVydENteWtUb1JnYihlKXtmb3IodmFyIHQscixuLGksbz0wLGE9MCxzPWUubGVuZ3RoO2E8czthKz00KXt0PWVbYV07cj1lW2ErMV07bj1lW2ErMl07aT1lW2ErM107ZVtvKytdPTI1NSt0KigtNjc0NzE0NzA3MzYwMjQ0MWUtMjAqdCsuMDAwODM3OTI2MjEyMTAxMzcyNypyKy4wMDAyODk0NzE4MTg4NjQzMjk0Km4rLjAwMzI2NDIzMTA1NzUzNzgwNippLTEuMTE4NTYxMTg2NzIwMzkzNykrciooMjYzNzQxMDc2MTYwODk0MDVlLTIxKnItODYyNjk0OTE1ODYzODU3MmUtMjAqbi0uMDAwMjc0ODc2OTA2NzQ5OTQ5MSppLS4wMjE1NTY4ODc5NDk3ODk2NykrbiooLTM4NzgwOTkyMTI4NjkzNjNlLTIwKm4tLjAwMDMyNjc4MDgyNzk0ODUyODYqaSsuMDY4Njc0MjIzODU5NTM0NSktaSooLjAwMDMzNjE5NzE3NzYxODM5MzcqaSsuNzQzMDY1OTE1MTM0MjI1NCk7ZVtvKytdPTI1NSt0KiguMDAwMTM1OTYzNzI4MTM1ODg4NDgqdCsuMDAwOTI0NTM3MTMyNTczNTg1KnIrLjAwMDEwNTY3MzU5NjE4NjgzNTkzKm4rLjAwMDQ3OTE4NjQ2ODc0MzY1MTIqaS0uMzEwOTY4OTU4NzUxNTg3NSkrciooLS4wMDAyMzU0NTM0NjEwODM3MDM0NCpyKy4wMDAyNzAyODQ1MjUzNTM0NzE0Km4rLjAwMjAyMDAzMDg5NzczMDcxNTYqaS0uNzQ4ODA1MjE2NzAxNTQ5NCkrbiooNjgzNDgxNTk5ODIzNTY2MmUtMjAqbisuMDAwMTUxNjg0NTIzNjM0NjA5NzMqaS0uMDk3NTE5Mjc3NzQ3Mjg5MzMpLWkqKC4wMDAzMTg5MTMxMTc1ODgzMjgxKmkrLjczNjQ4ODM4MDc3MzMxNjgpO2VbbysrXT0yNTUrdCooMTM1OTg2NTA0MTEzODUzMDdlLTIxKnQrLjAwMDEyNDIzOTU2MTc1NDkwODUxKnIrLjAwMDQ3NTE5ODUwOTc1ODM1ODkqbi0zNjcyOTMxNzQ3NjYzMDQyMmUtMjIqaS0uMDU1NjIxODY5ODAyNjQwMzQpK3IqKC4wMDAxNjE0MTM4MDU5ODcyNDY3NipyKy4wMDA5NjkyMjM5MTMwNzI1MTg2Km4rLjAwMDc3ODI2OTI0NTAwMzYyNTMqaS0uNDQwMTUyMzIzNjc1MjY0NjMpK24qKDUuMDY4ODgyOTE0MDY4NzY5ZS03Km4rLjAwMTc3NzgzNjkwMTEzNzUwNzEqaS0uNzU5MTQ1NDY0OTc0OTYwOSktaSooLjAwMDM0MzUzMTk5NjUxMDU1NTMqaSsuNzA2Mzc3MDE4NjE2MDE0NCl9cmV0dXJuIGUuc3ViYXJyYXkoMCxvKX0sZ2V0RGF0YTpmdW5jdGlvbiBnZXREYXRhKGUpe3ZhciB0PWUud2lkdGgscj1lLmhlaWdodCxuPWUuZm9yY2VSR0IsaT12b2lkIDAhPT1uJiZuLGE9ZS5pc1NvdXJjZVBERixzPXZvaWQgMCE9PWEmJmE7aWYodGhpcy5udW1Db21wb25lbnRzPjQpdGhyb3cgbmV3IG8oIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiKTt2YXIgYz10aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHQscixzKTtpZigxPT09dGhpcy5udW1Db21wb25lbnRzJiZpKXtmb3IodmFyIHU9Yy5sZW5ndGgsZj1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyp1KSxsPTAscD0wO3A8dTtwKyspe3ZhciBkPWNbcF07ZltsKytdPWQ7ZltsKytdPWQ7ZltsKytdPWR9cmV0dXJuIGZ9aWYoMz09PXRoaXMubnVtQ29tcG9uZW50cyYmdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihjKTtpZig0PT09dGhpcy5udW1Db21wb25lbnRzKXtpZih0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZClyZXR1cm4gaT90aGlzLl9jb252ZXJ0WWNja1RvUmdiKGMpOnRoaXMuX2NvbnZlcnRZY2NrVG9DbXlrKGMpO2lmKGkpcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoYyl9cmV0dXJuIGN9fTtyZXR1cm4gSnBlZ0ltYWdlfSgpO3QuSnBlZ0ltYWdlPWN9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSnB4SW1hZ2U9dm9pZCAwO3ZhciBuPXIoMSksaT1yKDE3OSksbz1yKDE4MCk7ZnVuY3Rpb24gX3R5cGVvZihlKXtyZXR1cm4oX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbiBfdHlwZW9mKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24gX3R5cGVvZihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YoZSx0KXtyZXR1cm4oX3NldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKGUsdCl7ZS5fX3Byb3RvX189dDtyZXR1cm4gZX0pKGUsdCl9ZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKGUpe3ZhciB0PWZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7RGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSk7cmV0dXJuITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpe3ZhciByLG49X2dldFByb3RvdHlwZU9mKGUpO2lmKHQpe3ZhciBpPV9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtyPVJlZmxlY3QuY29uc3RydWN0KG4sYXJndW1lbnRzLGkpfWVsc2Ugcj1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcyxyKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oZSx0KXtyZXR1cm4hdHx8Im9iamVjdCIhPT1fdHlwZW9mKHQpJiYiZnVuY3Rpb24iIT10eXBlb2YgdD9mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX0oZSk6dH1mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YoZSl7cmV0dXJuKF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihlKXtyZXR1cm4gZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKX0pKGUpfXZhciBhPWZ1bmN0aW9uKGUpeyFmdW5jdGlvbiBfaW5oZXJpdHMoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7dCYmX3NldFByb3RvdHlwZU9mKGUsdCl9KEpweEVycm9yLGUpO3ZhciB0PV9jcmVhdGVTdXBlcihKcHhFcnJvcik7ZnVuY3Rpb24gSnB4RXJyb3IoZSl7IWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLEpweEVycm9yKTtyZXR1cm4gdC5jYWxsKHRoaXMsIkpQWCBlcnJvcjogIi5jb25jYXQoZSkpfXJldHVybiBKcHhFcnJvcn0obi5CYXNlRXhjZXB0aW9uKSxzPWZ1bmN0aW9uIEpweEltYWdlQ2xvc3VyZSgpe3ZhciBlPXtMTDowLExIOjEsSEw6MSxISDoyfTtmdW5jdGlvbiBKcHhJbWFnZSgpe3RoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2U9ITF9SnB4SW1hZ2UucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZShlKXtpZig2NTM1OSE9PSgwLGkucmVhZFVpbnQxNikoZSwwKSlmb3IodmFyIHQ9MCxyPWUubGVuZ3RoO3Q8cjspe3ZhciBvPTgscz0oMCxpLnJlYWRVaW50MzIpKGUsdCksYz0oMCxpLnJlYWRVaW50MzIpKGUsdCs0KTt0Kz1vO2lmKDE9PT1zKXtzPTQyOTQ5NjcyOTYqKDAsaS5yZWFkVWludDMyKShlLHQpKygwLGkucmVhZFVpbnQzMikoZSx0KzQpO3QrPTg7bys9OH0wPT09cyYmKHM9ci10K28pO2lmKHM8byl0aHJvdyBuZXcgYSgiSW52YWxpZCBib3ggZmllbGQgc2l6ZSIpO3ZhciB1PXMtbyxmPSEwO3N3aXRjaChjKXtjYXNlIDE3ODU3Mzc4MzI6Zj0hMTticmVhaztjYXNlIDE2NjgyNDY2NDI6dmFyIGw9ZVt0XTtpZigxPT09bCl7dmFyIHA9KDAsaS5yZWFkVWludDMyKShlLHQrMyk7c3dpdGNoKHApe2Nhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmJyZWFrO2RlZmF1bHQ6KDAsbi53YXJuKSgiVW5rbm93biBjb2xvcnNwYWNlICIrcCl9fWVsc2UgMj09PWwmJigwLG4uaW5mbykoIklDQyBwcm9maWxlIG5vdCBzdXBwb3J0ZWQiKTticmVhaztjYXNlIDE3ODU3Mzc4Mjc6dGhpcy5wYXJzZUNvZGVzdHJlYW0oZSx0LHQrdSk7YnJlYWs7Y2FzZSAxNzgzNjM2ZTM6MjE4NzkzNzM4IT09KDAsaS5yZWFkVWludDMyKShlLHQpJiYoMCxuLndhcm4pKCJJbnZhbGlkIEpQMiBzaWduYXR1cmUiKTticmVhaztjYXNlIDE3ODM2MzQ0NTg6Y2FzZSAxNzE4OTA5Mjk2OmNhc2UgMTkyMDA5OTY5NzpjYXNlIDE5MTkyNTEyMzI6Y2FzZSAxNzY4NDQ5MTM4OmJyZWFrO2RlZmF1bHQ6dmFyIGQ9U3RyaW5nLmZyb21DaGFyQ29kZShjPj4yNCYyNTUsYz4+MTYmMjU1LGM+PjgmMjU1LDI1NSZjKTsoMCxuLndhcm4pKCJVbnN1cHBvcnRlZCBoZWFkZXIgdHlwZSAiK2MrIiAoIitkKyIpIil9ZiYmKHQrPXUpfWVsc2UgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZSwwLGUubGVuZ3RoKX0scGFyc2VJbWFnZVByb3BlcnRpZXM6ZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2VJbWFnZVByb3BlcnRpZXMoZSl7Zm9yKHZhciB0PWUuZ2V0Qnl0ZSgpO3Q+PTA7KXtpZig2NTM2MT09PSh0PDw4fCh0PWUuZ2V0Qnl0ZSgpKSkpe2Uuc2tpcCg0KTt2YXIgcj1lLmdldEludDMyKCk+Pj4wLG49ZS5nZXRJbnQzMigpPj4+MCxpPWUuZ2V0SW50MzIoKT4+PjAsbz1lLmdldEludDMyKCk+Pj4wO2Uuc2tpcCgxNik7dmFyIHM9ZS5nZXRVaW50MTYoKTt0aGlzLndpZHRoPXItaTt0aGlzLmhlaWdodD1uLW87dGhpcy5jb21wb25lbnRzQ291bnQ9czt0aGlzLmJpdHNQZXJDb21wb25lbnQ9ODtyZXR1cm59fXRocm93IG5ldyBhKCJObyBzaXplIG1hcmtlciBmb3VuZCBpbiBKUFggc3RyZWFtIil9LHBhcnNlQ29kZXN0cmVhbTpmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZUNvZGVzdHJlYW0oZSx0LHIpe3ZhciBvPXt9LHM9ITE7dHJ5e2Zvcih2YXIgYz10O2MrMTxyOyl7dmFyIHU9KDAsaS5yZWFkVWludDE2KShlLGMpO2MrPTI7dmFyIGYsbCxwLGQsaCxnLHY9MDtzd2l0Y2godSl7Y2FzZSA2NTM1OTpvLm1haW5IZWFkZXI9ITA7YnJlYWs7Y2FzZSA2NTQ5NzpicmVhaztjYXNlIDY1MzYxOnY9KDAsaS5yZWFkVWludDE2KShlLGMpO3ZhciBtPXt9O20uWHNpej0oMCxpLnJlYWRVaW50MzIpKGUsYys0KTttLllzaXo9KDAsaS5yZWFkVWludDMyKShlLGMrOCk7bS5YT3Npej0oMCxpLnJlYWRVaW50MzIpKGUsYysxMik7bS5ZT3Npej0oMCxpLnJlYWRVaW50MzIpKGUsYysxNik7bS5YVHNpej0oMCxpLnJlYWRVaW50MzIpKGUsYysyMCk7bS5ZVHNpej0oMCxpLnJlYWRVaW50MzIpKGUsYysyNCk7bS5YVE9zaXo9KDAsaS5yZWFkVWludDMyKShlLGMrMjgpO20uWVRPc2l6PSgwLGkucmVhZFVpbnQzMikoZSxjKzMyKTt2YXIgeT0oMCxpLnJlYWRVaW50MTYpKGUsYyszNik7bS5Dc2l6PXk7dmFyIGI9W107Zj1jKzM4O2Zvcih2YXIgeD0wO3g8eTt4Kyspe3ZhciB3PXtwcmVjaXNpb246MSsoMTI3JmVbZl0pLGlzU2lnbmVkOiEhKDEyOCZlW2ZdKSxYUnNpejplW2YrMV0sWVJzaXo6ZVtmKzJdfTtmKz0zO2NhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnModyxtKTtiLnB1c2godyl9by5TSVo9bTtvLmNvbXBvbmVudHM9YjtjYWxjdWxhdGVUaWxlR3JpZHMobyxiKTtvLlFDQz1bXTtvLkNPQz1bXTticmVhaztjYXNlIDY1MzcyOnY9KDAsaS5yZWFkVWludDE2KShlLGMpO3ZhciBTPXt9O2Y9YysyO3N3aXRjaCgzMSYobD1lW2YrK10pKXtjYXNlIDA6ZD04O2g9ITA7YnJlYWs7Y2FzZSAxOmQ9MTY7aD0hMTticmVhaztjYXNlIDI6ZD0xNjtoPSEwO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNRY2QgdmFsdWUgIitsKX1TLm5vUXVhbnRpemF0aW9uPTg9PT1kO1Muc2NhbGFyRXhwb3VuZGVkPWg7Uy5ndWFyZEJpdHM9bD4+NTtwPVtdO2Zvcig7Zjx2K2M7KXt2YXIgXz17fTtpZig4PT09ZCl7Xy5lcHNpbG9uPWVbZisrXT4+MztfLm11PTB9ZWxzZXtfLmVwc2lsb249ZVtmXT4+MztfLm11PSg3JmVbZl0pPDw4fGVbZisxXTtmKz0yfXAucHVzaChfKX1TLlNQcWNkcz1wO2lmKG8ubWFpbkhlYWRlcilvLlFDRD1TO2Vsc2V7by5jdXJyZW50VGlsZS5RQ0Q9UztvLmN1cnJlbnRUaWxlLlFDQz1bXX1icmVhaztjYXNlIDY1MzczOnY9KDAsaS5yZWFkVWludDE2KShlLGMpO3ZhciBULFA9e307Zj1jKzI7aWYoby5TSVouQ3NpejwyNTcpVD1lW2YrK107ZWxzZXtUPSgwLGkucmVhZFVpbnQxNikoZSxmKTtmKz0yfXN3aXRjaCgzMSYobD1lW2YrK10pKXtjYXNlIDA6ZD04O2g9ITA7YnJlYWs7Y2FzZSAxOmQ9MTY7aD0hMTticmVhaztjYXNlIDI6ZD0xNjtoPSEwO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNRY2QgdmFsdWUgIitsKX1QLm5vUXVhbnRpemF0aW9uPTg9PT1kO1Auc2NhbGFyRXhwb3VuZGVkPWg7UC5ndWFyZEJpdHM9bD4+NTtwPVtdO2Zvcig7Zjx2K2M7KXtfPXt9O2lmKDg9PT1kKXtfLmVwc2lsb249ZVtmKytdPj4zO18ubXU9MH1lbHNle18uZXBzaWxvbj1lW2ZdPj4zO18ubXU9KDcmZVtmXSk8PDh8ZVtmKzFdO2YrPTJ9cC5wdXNoKF8pfVAuU1BxY2RzPXA7by5tYWluSGVhZGVyP28uUUNDW1RdPVA6by5jdXJyZW50VGlsZS5RQ0NbVF09UDticmVhaztjYXNlIDY1MzYyOnY9KDAsaS5yZWFkVWludDE2KShlLGMpO3ZhciBDPXt9O2Y9YysyO3ZhciBrPWVbZisrXTtDLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHM9ISEoMSZrKTtDLnNvcE1hcmtlclVzZWQ9ISEoMiZrKTtDLmVwaE1hcmtlclVzZWQ9ISEoNCZrKTtDLnByb2dyZXNzaW9uT3JkZXI9ZVtmKytdO0MubGF5ZXJzQ291bnQ9KDAsaS5yZWFkVWludDE2KShlLGYpO2YrPTI7Qy5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybT1lW2YrK107Qy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ9ZVtmKytdO0MueGNiPTIrKDE1JmVbZisrXSk7Qy55Y2I9MisoMTUmZVtmKytdKTt2YXIgST1lW2YrK107Qy5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzPSEhKDEmSSk7Qy5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzPSEhKDImSSk7Qy50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3M9ISEoNCZJKTtDLnZlcnRpY2FsbHlTdHJpcGU9ISEoOCZJKTtDLnByZWRpY3RhYmxlVGVybWluYXRpb249ISEoMTYmSSk7Qy5zZWdtZW50YXRpb25TeW1ib2xVc2VkPSEhKDMyJkkpO0MucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uPWVbZisrXTtpZihDLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpe2Zvcih2YXIgTz1bXTtmPHYrYzspe3ZhciBFPWVbZisrXTtPLnB1c2goe1BQeDoxNSZFLFBQeTpFPj40fSl9Qy5wcmVjaW5jdHNTaXplcz1PfXZhciBBPVtdO0Muc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyYmQS5wdXNoKCJzZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzIik7Qy5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzJiZBLnB1c2goInJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMiKTtDLnRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcyYmQS5wdXNoKCJ0ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MiKTtDLnZlcnRpY2FsbHlTdHJpcGUmJkEucHVzaCgidmVydGljYWxseVN0cmlwZSIpO0MucHJlZGljdGFibGVUZXJtaW5hdGlvbiYmQS5wdXNoKCJwcmVkaWN0YWJsZVRlcm1pbmF0aW9uIik7aWYoQS5sZW5ndGg+MCl7cz0hMDt0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIENPRCBvcHRpb25zICgiK0Euam9pbigiLCAiKSsiKSIpfWlmKG8ubWFpbkhlYWRlcilvLkNPRD1DO2Vsc2V7by5jdXJyZW50VGlsZS5DT0Q9QztvLmN1cnJlbnRUaWxlLkNPQz1bXX1icmVhaztjYXNlIDY1NDI0OnY9KDAsaS5yZWFkVWludDE2KShlLGMpOyhnPXt9KS5pbmRleD0oMCxpLnJlYWRVaW50MTYpKGUsYysyKTtnLmxlbmd0aD0oMCxpLnJlYWRVaW50MzIpKGUsYys0KTtnLmRhdGFFbmQ9Zy5sZW5ndGgrYy0yO2cucGFydEluZGV4PWVbYys4XTtnLnBhcnRzQ291bnQ9ZVtjKzldO28ubWFpbkhlYWRlcj0hMTtpZigwPT09Zy5wYXJ0SW5kZXgpe2cuQ09EPW8uQ09EO2cuQ09DPW8uQ09DLnNsaWNlKDApO2cuUUNEPW8uUUNEO2cuUUNDPW8uUUNDLnNsaWNlKDApfW8uY3VycmVudFRpbGU9ZzticmVhaztjYXNlIDY1NDI3OmlmKDA9PT0oZz1vLmN1cnJlbnRUaWxlKS5wYXJ0SW5kZXgpe2luaXRpYWxpemVUaWxlKG8sZy5pbmRleCk7YnVpbGRQYWNrZXRzKG8pfXBhcnNlVGlsZVBhY2tldHMobyxlLGMsdj1nLmRhdGFFbmQtYyk7YnJlYWs7Y2FzZSA2NTM2NTpjYXNlIDY1MzY3OmNhc2UgNjUzNjg6Y2FzZSA2NTM4MDp2PSgwLGkucmVhZFVpbnQxNikoZSxjKTticmVhaztjYXNlIDY1MzYzOnRocm93IG5ldyBFcnJvcigiQ29kZXN0cmVhbSBjb2RlIDB4RkY1MyAoQ09DKSBpcyBub3QgaW1wbGVtZW50ZWQiKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb2Rlc3RyZWFtIGNvZGU6ICIrdS50b1N0cmluZygxNikpfWMrPXZ9fWNhdGNoKGUpe2lmKHN8fHRoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2UpdGhyb3cgbmV3IGEoZS5tZXNzYWdlKTsoMCxuLndhcm4pKCJKUFg6IFRyeWluZyB0byByZWNvdmVyIGZyb206ICIrZS5tZXNzYWdlKX10aGlzLnRpbGVzPWZ1bmN0aW9uIHRyYW5zZm9ybUNvbXBvbmVudHMoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jb21wb25lbnRzLG49dC5Dc2l6LGk9W10sbz0wLGE9ZS50aWxlcy5sZW5ndGg7bzxhO28rKyl7dmFyIHMsYz1lLnRpbGVzW29dLHU9W107Zm9yKHM9MDtzPG47cysrKXVbc109dHJhbnNmb3JtVGlsZShlLGMscyk7dmFyIGYsbCxwLGQsaCxnLHYsbT11WzBdLHk9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG0uaXRlbXMubGVuZ3RoKm4pLGI9e2xlZnQ6bS5sZWZ0LHRvcDptLnRvcCx3aWR0aDptLndpZHRoLGhlaWdodDptLmhlaWdodCxpdGVtczp5fSx4PTA7aWYoYy5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKXt2YXIgdz00PT09bixTPXVbMF0uaXRlbXMsXz11WzFdLml0ZW1zLFQ9dVsyXS5pdGVtcyxQPXc/dVszXS5pdGVtczpudWxsO2Y9clswXS5wcmVjaXNpb24tODtsPS41KygxMjg8PGYpO3ZhciBDPWMuY29tcG9uZW50c1swXSxrPW4tMztkPVMubGVuZ3RoO2lmKEMuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbilmb3IocD0wO3A8ZDtwKysseCs9ayl7aD1TW3BdK2w7Zz1fW3BdO3Y9VFtwXTt2YXIgST1oLSh2K2c+PjIpO3lbeCsrXT1JK3Y+PmY7eVt4KytdPUk+PmY7eVt4KytdPUkrZz4+Zn1lbHNlIGZvcihwPTA7cDxkO3ArKyx4Kz1rKXtoPVNbcF0rbDtnPV9bcF07dj1UW3BdO3lbeCsrXT1oKzEuNDAyKnY+PmY7eVt4KytdPWgtLjM0NDEzKmctLjcxNDE0KnY+PmY7eVt4KytdPWgrMS43NzIqZz4+Zn1pZih3KWZvcihwPTAseD0zO3A8ZDtwKysseCs9NCl5W3hdPVBbcF0rbD4+Zn1lbHNlIGZvcihzPTA7czxuO3MrKyl7dmFyIE89dVtzXS5pdGVtcztmPXJbc10ucHJlY2lzaW9uLTg7bD0uNSsoMTI4PDxmKTtmb3IoeD1zLHA9MCxkPU8ubGVuZ3RoO3A8ZDtwKyspe3lbeF09T1twXStsPj5mO3grPW59fWkucHVzaChiKX1yZXR1cm4gaX0obyk7dGhpcy53aWR0aD1vLlNJWi5Yc2l6LW8uU0laLlhPc2l6O3RoaXMuaGVpZ2h0PW8uU0laLllzaXotby5TSVouWU9zaXo7dGhpcy5jb21wb25lbnRzQ291bnQ9by5TSVouQ3Npen19O2Z1bmN0aW9uIGNhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnMoZSx0KXtlLngwPU1hdGguY2VpbCh0LlhPc2l6L2UuWFJzaXopO2UueDE9TWF0aC5jZWlsKHQuWHNpei9lLlhSc2l6KTtlLnkwPU1hdGguY2VpbCh0LllPc2l6L2UuWVJzaXopO2UueTE9TWF0aC5jZWlsKHQuWXNpei9lLllSc2l6KTtlLndpZHRoPWUueDEtZS54MDtlLmhlaWdodD1lLnkxLWUueTB9ZnVuY3Rpb24gY2FsY3VsYXRlVGlsZUdyaWRzKGUsdCl7Zm9yKHZhciByLG49ZS5TSVosaT1bXSxvPU1hdGguY2VpbCgobi5Yc2l6LW4uWFRPc2l6KS9uLlhUc2l6KSxhPU1hdGguY2VpbCgobi5Zc2l6LW4uWVRPc2l6KS9uLllUc2l6KSxzPTA7czxhO3MrKylmb3IodmFyIGM9MDtjPG87YysrKXsocj17fSkudHgwPU1hdGgubWF4KG4uWFRPc2l6K2Mqbi5YVHNpeixuLlhPc2l6KTtyLnR5MD1NYXRoLm1heChuLllUT3NpeitzKm4uWVRzaXosbi5ZT3Npeik7ci50eDE9TWF0aC5taW4obi5YVE9zaXorKGMrMSkqbi5YVHNpeixuLlhzaXopO3IudHkxPU1hdGgubWluKG4uWVRPc2l6KyhzKzEpKm4uWVRzaXosbi5Zc2l6KTtyLndpZHRoPXIudHgxLXIudHgwO3IuaGVpZ2h0PXIudHkxLXIudHkwO3IuY29tcG9uZW50cz1bXTtpLnB1c2gocil9ZS50aWxlcz1pO2Zvcih2YXIgdT0wLGY9bi5Dc2l6O3U8Zjt1KyspZm9yKHZhciBsPXRbdV0scD0wLGQ9aS5sZW5ndGg7cDxkO3ArKyl7dmFyIGg9e307cj1pW3BdO2gudGN4MD1NYXRoLmNlaWwoci50eDAvbC5YUnNpeik7aC50Y3kwPU1hdGguY2VpbChyLnR5MC9sLllSc2l6KTtoLnRjeDE9TWF0aC5jZWlsKHIudHgxL2wuWFJzaXopO2gudGN5MT1NYXRoLmNlaWwoci50eTEvbC5ZUnNpeik7aC53aWR0aD1oLnRjeDEtaC50Y3gwO2guaGVpZ2h0PWgudGN5MS1oLnRjeTA7ci5jb21wb25lbnRzW3VdPWh9fWZ1bmN0aW9uIGdldEJsb2Nrc0RpbWVuc2lvbnMoZSx0LHIpe3ZhciBuPXQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLGk9e307aWYobi5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKXtpLlBQeD1uLnByZWNpbmN0c1NpemVzW3JdLlBQeDtpLlBQeT1uLnByZWNpbmN0c1NpemVzW3JdLlBQeX1lbHNle2kuUFB4PTE1O2kuUFB5PTE1fWkueGNiXz1yPjA/TWF0aC5taW4obi54Y2IsaS5QUHgtMSk6TWF0aC5taW4obi54Y2IsaS5QUHgpO2kueWNiXz1yPjA/TWF0aC5taW4obi55Y2IsaS5QUHktMSk6TWF0aC5taW4obi55Y2IsaS5QUHkpO3JldHVybiBpfWZ1bmN0aW9uIGJ1aWxkUHJlY2luY3RzKGUsdCxyKXt2YXIgbj0xPDxyLlBQeCxpPTE8PHIuUFB5LG89MD09PXQucmVzTGV2ZWwsYT0xPDxyLlBQeCsobz8wOi0xKSxzPTE8PHIuUFB5KyhvPzA6LTEpLGM9dC50cngxPnQudHJ4MD9NYXRoLmNlaWwodC50cngxL24pLU1hdGguZmxvb3IodC50cngwL24pOjAsdT10LnRyeTE+dC50cnkwP01hdGguY2VpbCh0LnRyeTEvaSktTWF0aC5mbG9vcih0LnRyeTAvaSk6MCxmPWMqdTt0LnByZWNpbmN0UGFyYW1ldGVycz17cHJlY2luY3RXaWR0aDpuLHByZWNpbmN0SGVpZ2h0OmksbnVtcHJlY2luY3Rzd2lkZTpjLG51bXByZWNpbmN0c2hpZ2g6dSxudW1wcmVjaW5jdHM6ZixwcmVjaW5jdFdpZHRoSW5TdWJiYW5kOmEscHJlY2luY3RIZWlnaHRJblN1YmJhbmQ6c319ZnVuY3Rpb24gYnVpbGRDb2RlYmxvY2tzKGUsdCxyKXt2YXIgbixpLG8sYSxzPXIueGNiXyxjPXIueWNiXyx1PTE8PHMsZj0xPDxjLGw9dC50YngwPj5zLHA9dC50YnkwPj5jLGQ9dC50YngxK3UtMT4+cyxoPXQudGJ5MStmLTE+PmMsZz10LnJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLHY9W10sbT1bXTtmb3IoaT1wO2k8aDtpKyspZm9yKG49bDtuPGQ7bisrKXsobz17Y2J4Om4sY2J5OmksdGJ4MDp1Km4sdGJ5MDpmKmksdGJ4MTp1KihuKzEpLHRieTE6ZiooaSsxKX0pLnRieDBfPU1hdGgubWF4KHQudGJ4MCxvLnRieDApO28udGJ5MF89TWF0aC5tYXgodC50YnkwLG8udGJ5MCk7by50YngxXz1NYXRoLm1pbih0LnRieDEsby50YngxKTtvLnRieTFfPU1hdGgubWluKHQudGJ5MSxvLnRieTEpO2E9TWF0aC5mbG9vcigoby50YngwXy10LnRieDApL2cucHJlY2luY3RXaWR0aEluU3ViYmFuZCkrTWF0aC5mbG9vcigoby50YnkwXy10LnRieTApL2cucHJlY2luY3RIZWlnaHRJblN1YmJhbmQpKmcubnVtcHJlY2luY3Rzd2lkZTtvLnByZWNpbmN0TnVtYmVyPWE7by5zdWJiYW5kVHlwZT10LnR5cGU7by5MYmxvY2s9MztpZighKG8udGJ4MV88PW8udGJ4MF98fG8udGJ5MV88PW8udGJ5MF8pKXt2LnB1c2gobyk7dmFyIHk9bVthXTtpZih2b2lkIDAhPT15KXtuPHkuY2J4TWluP3kuY2J4TWluPW46bj55LmNieE1heCYmKHkuY2J4TWF4PW4pO2k8eS5jYnlNaW4/eS5jYnhNaW49aTppPnkuY2J5TWF4JiYoeS5jYnlNYXg9aSl9ZWxzZSBtW2FdPXk9e2NieE1pbjpuLGNieU1pbjppLGNieE1heDpuLGNieU1heDppfTtvLnByZWNpbmN0PXl9fXQuY29kZWJsb2NrUGFyYW1ldGVycz17Y29kZWJsb2NrV2lkdGg6cyxjb2RlYmxvY2tIZWlnaHQ6YyxudW1jb2RlYmxvY2t3aWRlOmQtbCsxLG51bWNvZGVibG9ja2hpZ2g6aC1wKzF9O3QuY29kZWJsb2Nrcz12O3QucHJlY2luY3RzPW19ZnVuY3Rpb24gY3JlYXRlUGFja2V0KGUsdCxyKXtmb3IodmFyIG49W10saT1lLnN1YmJhbmRzLG89MCxhPWkubGVuZ3RoO288YTtvKyspZm9yKHZhciBzPWlbb10uY29kZWJsb2NrcyxjPTAsdT1zLmxlbmd0aDtjPHU7YysrKXt2YXIgZj1zW2NdO2YucHJlY2luY3ROdW1iZXI9PT10JiZuLnB1c2goZil9cmV0dXJue2xheWVyTnVtYmVyOnIsY29kZWJsb2NrczpufX1mdW5jdGlvbiBMYXllclJlc29sdXRpb25Db21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGUpe2Zvcih2YXIgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGk9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LG89dC5Dc2l6LHM9MCxjPTA7YzxvO2MrKylzPU1hdGgubWF4KHMsbi5jb21wb25lbnRzW2NdLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpO3ZhciB1PTAsZj0wLGw9MCxwPTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO3U8aTt1Kyspe2Zvcig7Zjw9cztmKyspe2Zvcig7bDxvO2wrKyl7dmFyIGU9bi5jb21wb25lbnRzW2xdO2lmKCEoZj5lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpKXtmb3IodmFyIHQ9ZS5yZXNvbHV0aW9uc1tmXSxyPXQucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztwPHI7KXt2YXIgYz1jcmVhdGVQYWNrZXQodCxwLHUpO3ArKztyZXR1cm4gY31wPTB9fWw9MH1mPTB9dGhyb3cgbmV3IGEoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0saT1uLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsbz10LkNzaXoscz0wLGM9MDtjPG87YysrKXM9TWF0aC5tYXgocyxuLmNvbXBvbmVudHNbY10uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7dmFyIHU9MCxmPTAsbD0wLHA9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7dTw9czt1Kyspe2Zvcig7ZjxpO2YrKyl7Zm9yKDtsPG87bCsrKXt2YXIgZT1uLmNvbXBvbmVudHNbbF07aWYoISh1PmUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkpe2Zvcih2YXIgdD1lLnJlc29sdXRpb25zW3VdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO3A8cjspe3ZhciBjPWNyZWF0ZVBhY2tldCh0LHAsZik7cCsrO3JldHVybiBjfXA9MH19bD0wfWY9MH10aHJvdyBuZXcgYSgiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihlKXt2YXIgdCxyLG4saSxvPWUuU0laLHM9ZS5jdXJyZW50VGlsZS5pbmRleCxjPWUudGlsZXNbc10sdT1jLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsZj1vLkNzaXosbD0wO2ZvcihuPTA7bjxmO24rKyl7dmFyIHA9Yy5jb21wb25lbnRzW25dO2w9TWF0aC5tYXgobCxwLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpfXZhciBkPW5ldyBJbnQzMkFycmF5KGwrMSk7Zm9yKHI9MDtyPD1sOysrcil7dmFyIGg9MDtmb3Iobj0wO248ZjsrK24pe3ZhciBnPWMuY29tcG9uZW50c1tuXS5yZXNvbHV0aW9ucztyPGcubGVuZ3RoJiYoaD1NYXRoLm1heChoLGdbcl0ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cykpfWRbcl09aH10PTA7cj0wO249MDtpPTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO3I8PWw7cisrKXtmb3IoO2k8ZFtyXTtpKyspe2Zvcig7bjxmO24rKyl7dmFyIGU9Yy5jb21wb25lbnRzW25dO2lmKCEocj5lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpKXt2YXIgbz1lLnJlc29sdXRpb25zW3JdLHM9by5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO2lmKCEoaT49cykpe2Zvcig7dDx1Oyl7dmFyIHA9Y3JlYXRlUGFja2V0KG8saSx0KTt0Kys7cmV0dXJuIHB9dD0wfX19bj0wfWk9MH10aHJvdyBuZXcgYSgiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihlKXt2YXIgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGk9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LG89dC5Dc2l6LHM9Z2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZShuKSxjPXMsdT0wLGY9MCxsPTAscD0wLGQ9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7ZDxjLm1heE51bUhpZ2g7ZCsrKXtmb3IoO3A8Yy5tYXhOdW1XaWRlO3ArKyl7Zm9yKDtsPG87bCsrKXtmb3IodmFyIGU9bi5jb21wb25lbnRzW2xdLHQ9ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O2Y8PXQ7ZisrKXt2YXIgcj1lLnJlc29sdXRpb25zW2ZdLGg9cy5jb21wb25lbnRzW2xdLnJlc29sdXRpb25zW2ZdLGc9Z2V0UHJlY2luY3RJbmRleElmRXhpc3QocCxkLGgsYyxyKTtpZihudWxsIT09Zyl7Zm9yKDt1PGk7KXt2YXIgdj1jcmVhdGVQYWNrZXQocixnLHUpO3UrKztyZXR1cm4gdn11PTB9fWY9MH1sPTB9cD0wfXRocm93IG5ldyBhKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGUpe3ZhciB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0saT1uLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsbz10LkNzaXoscz1nZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKG4pLGM9MCx1PTAsZj0wLGw9MCxwPTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO2Y8bzsrK2Ype2Zvcih2YXIgZT1uLmNvbXBvbmVudHNbZl0sdD1zLmNvbXBvbmVudHNbZl0scj1lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7cDx0Lm1heE51bUhpZ2g7cCsrKXtmb3IoO2w8dC5tYXhOdW1XaWRlO2wrKyl7Zm9yKDt1PD1yO3UrKyl7dmFyIGQ9ZS5yZXNvbHV0aW9uc1t1XSxoPXQucmVzb2x1dGlvbnNbdV0sZz1nZXRQcmVjaW5jdEluZGV4SWZFeGlzdChsLHAsaCx0LGQpO2lmKG51bGwhPT1nKXtmb3IoO2M8aTspe3ZhciB2PWNyZWF0ZVBhY2tldChkLGcsYyk7YysrO3JldHVybiB2fWM9MH19dT0wfWw9MH1wPTB9dGhyb3cgbmV3IGEoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIGdldFByZWNpbmN0SW5kZXhJZkV4aXN0KGUsdCxyLG4saSl7dmFyIG89ZSpuLm1pbldpZHRoLGE9dCpuLm1pbkhlaWdodDtpZihvJXIud2lkdGghPTB8fGElci5oZWlnaHQhPTApcmV0dXJuIG51bGw7dmFyIHM9YS9yLndpZHRoKmkucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7cmV0dXJuIG8vci5oZWlnaHQrc31mdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKGUpe2Zvcih2YXIgdD1lLmNvbXBvbmVudHMubGVuZ3RoLHI9TnVtYmVyLk1BWF9WQUxVRSxuPU51bWJlci5NQVhfVkFMVUUsaT0wLG89MCxhPW5ldyBBcnJheSh0KSxzPTA7czx0O3MrKyl7Zm9yKHZhciBjPWUuY29tcG9uZW50c1tzXSx1PWMuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCxmPW5ldyBBcnJheSh1KzEpLGw9TnVtYmVyLk1BWF9WQUxVRSxwPU51bWJlci5NQVhfVkFMVUUsZD0wLGg9MCxnPTEsdj11O3Y+PTA7LS12KXt2YXIgbT1jLnJlc29sdXRpb25zW3ZdLHk9ZyptLnByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdFdpZHRoLGI9ZyptLnByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdEhlaWdodDtsPU1hdGgubWluKGwseSk7cD1NYXRoLm1pbihwLGIpO2Q9TWF0aC5tYXgoZCxtLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlKTtoPU1hdGgubWF4KGgsbS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzaGlnaCk7Zlt2XT17d2lkdGg6eSxoZWlnaHQ6Yn07Zzw8PTF9cj1NYXRoLm1pbihyLGwpO249TWF0aC5taW4obixwKTtpPU1hdGgubWF4KGksZCk7bz1NYXRoLm1heChvLGgpO2Fbc109e3Jlc29sdXRpb25zOmYsbWluV2lkdGg6bCxtaW5IZWlnaHQ6cCxtYXhOdW1XaWRlOmQsbWF4TnVtSGlnaDpofX1yZXR1cm57Y29tcG9uZW50czphLG1pbldpZHRoOnIsbWluSGVpZ2h0Om4sbWF4TnVtV2lkZTppLG1heE51bUhpZ2g6b319ZnVuY3Rpb24gYnVpbGRQYWNrZXRzKGUpe2Zvcih2YXIgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGk9dC5Dc2l6LG89MDtvPGk7bysrKXtmb3IodmFyIHM9bi5jb21wb25lbnRzW29dLGM9cy5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LHU9W10sZj1bXSxsPTA7bDw9YztsKyspe3ZhciBwLGQ9Z2V0QmxvY2tzRGltZW5zaW9ucygwLHMsbCksaD17fSxnPTE8PGMtbDtoLnRyeDA9TWF0aC5jZWlsKHMudGN4MC9nKTtoLnRyeTA9TWF0aC5jZWlsKHMudGN5MC9nKTtoLnRyeDE9TWF0aC5jZWlsKHMudGN4MS9nKTtoLnRyeTE9TWF0aC5jZWlsKHMudGN5MS9nKTtoLnJlc0xldmVsPWw7YnVpbGRQcmVjaW5jdHMoMCxoLGQpO3UucHVzaChoKTtpZigwPT09bCl7KHA9e30pLnR5cGU9IkxMIjtwLnRieDA9TWF0aC5jZWlsKHMudGN4MC9nKTtwLnRieTA9TWF0aC5jZWlsKHMudGN5MC9nKTtwLnRieDE9TWF0aC5jZWlsKHMudGN4MS9nKTtwLnRieTE9TWF0aC5jZWlsKHMudGN5MS9nKTtwLnJlc29sdXRpb249aDtidWlsZENvZGVibG9ja3MoMCxwLGQpO2YucHVzaChwKTtoLnN1YmJhbmRzPVtwXX1lbHNle3ZhciB2PTE8PGMtbCsxLG09W107KHA9e30pLnR5cGU9IkhMIjtwLnRieDA9TWF0aC5jZWlsKHMudGN4MC92LS41KTtwLnRieTA9TWF0aC5jZWlsKHMudGN5MC92KTtwLnRieDE9TWF0aC5jZWlsKHMudGN4MS92LS41KTtwLnRieTE9TWF0aC5jZWlsKHMudGN5MS92KTtwLnJlc29sdXRpb249aDtidWlsZENvZGVibG9ja3MoMCxwLGQpO2YucHVzaChwKTttLnB1c2gocCk7KHA9e30pLnR5cGU9IkxIIjtwLnRieDA9TWF0aC5jZWlsKHMudGN4MC92KTtwLnRieTA9TWF0aC5jZWlsKHMudGN5MC92LS41KTtwLnRieDE9TWF0aC5jZWlsKHMudGN4MS92KTtwLnRieTE9TWF0aC5jZWlsKHMudGN5MS92LS41KTtwLnJlc29sdXRpb249aDtidWlsZENvZGVibG9ja3MoMCxwLGQpO2YucHVzaChwKTttLnB1c2gocCk7KHA9e30pLnR5cGU9IkhIIjtwLnRieDA9TWF0aC5jZWlsKHMudGN4MC92LS41KTtwLnRieTA9TWF0aC5jZWlsKHMudGN5MC92LS41KTtwLnRieDE9TWF0aC5jZWlsKHMudGN4MS92LS41KTtwLnRieTE9TWF0aC5jZWlsKHMudGN5MS92LS41KTtwLnJlc29sdXRpb249aDtidWlsZENvZGVibG9ja3MoMCxwLGQpO2YucHVzaChwKTttLnB1c2gocCk7aC5zdWJiYW5kcz1tfX1zLnJlc29sdXRpb25zPXU7cy5zdWJiYW5kcz1mfXZhciB5PW4uY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5wcm9ncmVzc2lvbk9yZGVyO3N3aXRjaCh5KXtjYXNlIDA6bi5wYWNrZXRzSXRlcmF0b3I9bmV3IExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSk7YnJlYWs7Y2FzZSAxOm4ucGFja2V0c0l0ZXJhdG9yPW5ldyBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGUpO2JyZWFrO2Nhc2UgMjpuLnBhY2tldHNJdGVyYXRvcj1uZXcgUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihlKTticmVhaztjYXNlIDM6bi5wYWNrZXRzSXRlcmF0b3I9bmV3IFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoZSk7YnJlYWs7Y2FzZSA0Om4ucGFja2V0c0l0ZXJhdG9yPW5ldyBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGEoIlVuc3VwcG9ydGVkIHByb2dyZXNzaW9uIG9yZGVyICIuY29uY2F0KHkpKX19ZnVuY3Rpb24gcGFyc2VUaWxlUGFja2V0cyhlLG4sbyxhKXt2YXIgcyxjPTAsdT0wLGY9ITE7ZnVuY3Rpb24gcmVhZEJpdHMoZSl7Zm9yKDt1PGU7KXt2YXIgdD1uW28rY107YysrO2lmKGYpe3M9czw8N3x0O3UrPTc7Zj0hMX1lbHNle3M9czw8OHx0O3UrPTh9MjU1PT09dCYmKGY9ITApfXJldHVybiBzPj4+KHUtPWUpJigxPDxlKS0xfWZ1bmN0aW9uIHNraXBNYXJrZXJJZkVxdWFsKGUpe2lmKDI1NT09PW5bbytjLTFdJiZuW28rY109PT1lKXtza2lwQnl0ZXMoMSk7cmV0dXJuITB9aWYoMjU1PT09bltvK2NdJiZuW28rYysxXT09PWUpe3NraXBCeXRlcygyKTtyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBza2lwQnl0ZXMoZSl7Yys9ZX1mdW5jdGlvbiBhbGlnblRvQnl0ZSgpe3U9MDtpZihmKXtjKys7Zj0hMX19ZnVuY3Rpb24gcmVhZENvZGluZ3Bhc3Nlcygpe2lmKDA9PT1yZWFkQml0cygxKSlyZXR1cm4gMTtpZigwPT09cmVhZEJpdHMoMSkpcmV0dXJuIDI7dmFyIGU9cmVhZEJpdHMoMik7cmV0dXJuIGU8Mz9lKzM6KGU9cmVhZEJpdHMoNSkpPDMxP2UrNjooZT1yZWFkQml0cyg3KSkrMzd9Zm9yKHZhciBsPWUuY3VycmVudFRpbGUuaW5kZXgscD1lLnRpbGVzW2xdLGQ9ZS5DT0Quc29wTWFya2VyVXNlZCxoPWUuQ09ELmVwaE1hcmtlclVzZWQsZz1wLnBhY2tldHNJdGVyYXRvcjtjPGE7KXthbGlnblRvQnl0ZSgpO2QmJnNraXBNYXJrZXJJZkVxdWFsKDE0NSkmJnNraXBCeXRlcyg0KTt2YXIgdj1nLm5leHRQYWNrZXQoKTtpZihyZWFkQml0cygxKSl7Zm9yKHZhciBtLHk9di5sYXllck51bWJlcixiPVtdLHg9MCx3PXYuY29kZWJsb2Nrcy5sZW5ndGg7eDx3O3grKyl7dmFyIFM9KG09di5jb2RlYmxvY2tzW3hdKS5wcmVjaW5jdCxfPW0uY2J4LVMuY2J4TWluLFQ9bS5jYnktUy5jYnlNaW4sUD0hMSxDPSExO2lmKHZvaWQgMCE9PW0uaW5jbHVkZWQpUD0hIXJlYWRCaXRzKDEpO2Vsc2V7dmFyIGssSTtpZih2b2lkIDAhPT0oUz1tLnByZWNpbmN0KS5pbmNsdXNpb25UcmVlKWs9Uy5pbmNsdXNpb25UcmVlO2Vsc2V7dmFyIE89Uy5jYnhNYXgtUy5jYnhNaW4rMSxFPVMuY2J5TWF4LVMuY2J5TWluKzE7az1uZXcgcihPLEUseSk7ST1uZXcgdChPLEUpO1MuaW5jbHVzaW9uVHJlZT1rO1MuemVyb0JpdFBsYW5lc1RyZWU9SX1pZihrLnJlc2V0KF8sVCx5KSlmb3IoOzspe2lmKCFyZWFkQml0cygxKSl7ay5pbmNyZW1lbnRWYWx1ZSh5KTticmVha31pZighay5uZXh0TGV2ZWwoKSl7bS5pbmNsdWRlZD0hMDtQPUM9ITA7YnJlYWt9fX1pZihQKXtpZihDKXsoST1TLnplcm9CaXRQbGFuZXNUcmVlKS5yZXNldChfLFQpO2Zvcig7OylpZihyZWFkQml0cygxKSl7aWYoIUkubmV4dExldmVsKCkpYnJlYWt9ZWxzZSBJLmluY3JlbWVudFZhbHVlKCk7bS56ZXJvQml0UGxhbmVzPUkudmFsdWV9Zm9yKHZhciBBPXJlYWRDb2RpbmdwYXNzZXMoKTtyZWFkQml0cygxKTspbS5MYmxvY2srKzt2YXIgUj0oMCxpLmxvZzIpKEEpLE09cmVhZEJpdHMoKEE8MTw8Uj9SLTE6UikrbS5MYmxvY2spO2IucHVzaCh7Y29kZWJsb2NrOm0sY29kaW5ncGFzc2VzOkEsZGF0YUxlbmd0aDpNfSl9fWFsaWduVG9CeXRlKCk7aCYmc2tpcE1hcmtlcklmRXF1YWwoMTQ2KTtmb3IoO2IubGVuZ3RoPjA7KXt2YXIgRD1iLnNoaWZ0KCk7dm9pZCAwPT09KG09RC5jb2RlYmxvY2spLmRhdGEmJihtLmRhdGE9W10pO20uZGF0YS5wdXNoKHtkYXRhOm4sc3RhcnQ6bytjLGVuZDpvK2MrRC5kYXRhTGVuZ3RoLGNvZGluZ3Bhc3NlczpELmNvZGluZ3Bhc3Nlc30pO2MrPUQuZGF0YUxlbmd0aH19fXJldHVybiBjfWZ1bmN0aW9uIGNvcHlDb2VmZmljaWVudHMoZSx0LHIsbixpLGEsYyx1KXtmb3IodmFyIGY9bi50YngwLGw9bi50YnkwLHA9bi50YngxLW4udGJ4MCxkPW4uY29kZWJsb2NrcyxoPSJIIj09PW4udHlwZS5jaGFyQXQoMCk/MTowLGc9IkgiPT09bi50eXBlLmNoYXJBdCgxKT90OjAsdj0wLG09ZC5sZW5ndGg7djxtOysrdil7dmFyIHk9ZFt2XSxiPXkudGJ4MV8teS50YngwXyx4PXkudGJ5MV8teS50YnkwXztpZigwIT09YiYmMCE9PXgmJnZvaWQgMCE9PXkuZGF0YSl7dmFyIHcsUzt3PW5ldyBzKGIseCx5LnN1YmJhbmRUeXBlLHkuemVyb0JpdFBsYW5lcyxhKTtTPTI7dmFyIF8sVCxQLEM9eS5kYXRhLGs9MCxJPTA7Zm9yKF89MCxUPUMubGVuZ3RoO188VDtfKyspe2srPShQPUNbX10pLmVuZC1QLnN0YXJ0O0krPVAuY29kaW5ncGFzc2VzfXZhciBPPW5ldyBVaW50OEFycmF5KGspLEU9MDtmb3IoXz0wLFQ9Qy5sZW5ndGg7XzxUO18rKyl7dmFyIEE9KFA9Q1tfXSkuZGF0YS5zdWJhcnJheShQLnN0YXJ0LFAuZW5kKTtPLnNldChBLEUpO0UrPUEubGVuZ3RofXZhciBSPW5ldyBvLkFyaXRobWV0aWNEZWNvZGVyKE8sMCxrKTt3LnNldERlY29kZXIoUik7Zm9yKF89MDtfPEk7XysrKXtzd2l0Y2goUyl7Y2FzZSAwOncucnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCk7YnJlYWs7Y2FzZSAxOncucnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKTticmVhaztjYXNlIDI6dy5ydW5DbGVhbnVwUGFzcygpO3UmJncuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKX1TPShTKzEpJTN9dmFyIE0sRCxMLEI9eS50YngwXy1mKyh5LnRieTBfLWwpKnAsVT13LmNvZWZmaWNlbnRzU2lnbixOPXcuY29lZmZpY2VudHNNYWduaXR1ZGUsaj13LmJpdHNEZWNvZGVkLHo9Yz8wOi41O0U9MDt2YXIgSD0iTEwiIT09bi50eXBlO2ZvcihfPTA7Xzx4O18rKyl7dmFyIFc9MiooQi9wfDApKih0LXApK2grZztmb3IoTT0wO008YjtNKyspe2lmKDAhPT0oRD1OW0VdKSl7RD0oRCt6KSppOzAhPT1VW0VdJiYoRD0tRCk7TD1qW0VdO3ZhciBYPUg/VysoQjw8MSk6QjtlW1hdPWMmJkw+PWE/RDpEKigxPDxhLUwpfUIrKztFKyt9Qis9cC1ifX19fWZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUodCxyLG4pe2Zvcih2YXIgaT1yLmNvbXBvbmVudHNbbl0sbz1pLmNvZGluZ1N0eWxlUGFyYW1ldGVycyxhPWkucXVhbnRpemF0aW9uUGFyYW1ldGVycyxzPW8uZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LGM9YS5TUHFjZHMsbD1hLnNjYWxhckV4cG91bmRlZCxwPWEuZ3VhcmRCaXRzLGQ9by5zZWdtZW50YXRpb25TeW1ib2xVc2VkLGg9dC5jb21wb25lbnRzW25dLnByZWNpc2lvbixnPW8ucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uLHY9Zz9uZXcgZjpuZXcgdSxtPVtdLHk9MCxiPTA7Yjw9cztiKyspe2Zvcih2YXIgeD1pLnJlc29sdXRpb25zW2JdLHc9eC50cngxLXgudHJ4MCxTPXgudHJ5MS14LnRyeTAsXz1uZXcgRmxvYXQzMkFycmF5KHcqUyksVD0wLFA9eC5zdWJiYW5kcy5sZW5ndGg7VDxQO1QrKyl7dmFyIEMsaztpZihsKXtDPWNbeV0ubXU7az1jW3ldLmVwc2lsb247eSsrfWVsc2V7Qz1jWzBdLm11O2s9Y1swXS5lcHNpbG9uKyhiPjA/MS1iOjApfXZhciBJPXguc3ViYmFuZHNbVF0sTz1lW0kudHlwZV07Y29weUNvZWZmaWNpZW50cyhfLHcsMCxJLGc/MTpNYXRoLnBvdygyLGgrTy1rKSooMStDLzIwNDgpLHAray0xLGcsZCl9bS5wdXNoKHt3aWR0aDp3LGhlaWdodDpTLGl0ZW1zOl99KX12YXIgRT12LmNhbGN1bGF0ZShtLGkudGN4MCxpLnRjeTApO3JldHVybntsZWZ0OmkudGN4MCx0b3A6aS50Y3kwLHdpZHRoOkUud2lkdGgsaGVpZ2h0OkUuaGVpZ2h0LGl0ZW1zOkUuaXRlbXN9fWZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGUsdCl7Zm9yKHZhciByPWUuU0laLkNzaXosbj1lLnRpbGVzW3RdLGk9MDtpPHI7aSsrKXt2YXIgbz1uLmNvbXBvbmVudHNbaV0sYT12b2lkIDAhPT1lLmN1cnJlbnRUaWxlLlFDQ1tpXT9lLmN1cnJlbnRUaWxlLlFDQ1tpXTplLmN1cnJlbnRUaWxlLlFDRDtvLnF1YW50aXphdGlvblBhcmFtZXRlcnM9YTt2YXIgcz12b2lkIDAhPT1lLmN1cnJlbnRUaWxlLkNPQ1tpXT9lLmN1cnJlbnRUaWxlLkNPQ1tpXTplLmN1cnJlbnRUaWxlLkNPRDtvLmNvZGluZ1N0eWxlUGFyYW1ldGVycz1zfW4uY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycz1lLmN1cnJlbnRUaWxlLkNPRH12YXIgdD1mdW5jdGlvbiBUYWdUcmVlQ2xvc3VyZSgpe2Z1bmN0aW9uIFRhZ1RyZWUoZSx0KXt2YXIgcj0oMCxpLmxvZzIpKE1hdGgubWF4KGUsdCkpKzE7dGhpcy5sZXZlbHM9W107Zm9yKHZhciBuPTA7bjxyO24rKyl7dmFyIG89e3dpZHRoOmUsaGVpZ2h0OnQsaXRlbXM6W119O3RoaXMubGV2ZWxzLnB1c2gobyk7ZT1NYXRoLmNlaWwoZS8yKTt0PU1hdGguY2VpbCh0LzIpfX1UYWdUcmVlLnByb3RvdHlwZT17cmVzZXQ6ZnVuY3Rpb24gVGFnVHJlZV9yZXNldChlLHQpe2Zvcih2YXIgcixuPTAsaT0wO248dGhpcy5sZXZlbHMubGVuZ3RoOyl7dmFyIG89ZSt0KihyPXRoaXMubGV2ZWxzW25dKS53aWR0aDtpZih2b2lkIDAhPT1yLml0ZW1zW29dKXtpPXIuaXRlbXNbb107YnJlYWt9ci5pbmRleD1vO2U+Pj0xO3Q+Pj0xO24rK31uLS07KHI9dGhpcy5sZXZlbHNbbl0pLml0ZW1zW3IuaW5kZXhdPWk7dGhpcy5jdXJyZW50TGV2ZWw9bjtkZWxldGUgdGhpcy52YWx1ZX0saW5jcmVtZW50VmFsdWU6ZnVuY3Rpb24gVGFnVHJlZV9pbmNyZW1lbnRWYWx1ZSgpe3ZhciBlPXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTtlLml0ZW1zW2UuaW5kZXhdKyt9LG5leHRMZXZlbDpmdW5jdGlvbiBUYWdUcmVlX25leHRMZXZlbCgpe3ZhciBlPXRoaXMuY3VycmVudExldmVsLHQ9dGhpcy5sZXZlbHNbZV0scj10Lml0ZW1zW3QuaW5kZXhdO2lmKC0tZTwwKXt0aGlzLnZhbHVlPXI7cmV0dXJuITF9dGhpcy5jdXJyZW50TGV2ZWw9ZTsodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cjtyZXR1cm4hMH19O3JldHVybiBUYWdUcmVlfSgpLHI9ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZUNsb3N1cmUoKXtmdW5jdGlvbiBJbmNsdXNpb25UcmVlKGUsdCxyKXt2YXIgbj0oMCxpLmxvZzIpKE1hdGgubWF4KGUsdCkpKzE7dGhpcy5sZXZlbHM9W107Zm9yKHZhciBvPTA7bzxuO28rKyl7Zm9yKHZhciBhPW5ldyBVaW50OEFycmF5KGUqdCkscz0wLGM9YS5sZW5ndGg7czxjO3MrKylhW3NdPXI7dmFyIHU9e3dpZHRoOmUsaGVpZ2h0OnQsaXRlbXM6YX07dGhpcy5sZXZlbHMucHVzaCh1KTtlPU1hdGguY2VpbChlLzIpO3Q9TWF0aC5jZWlsKHQvMil9fUluY2x1c2lvblRyZWUucHJvdG90eXBlPXtyZXNldDpmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Jlc2V0KGUsdCxyKXtmb3IodmFyIG49MDtuPHRoaXMubGV2ZWxzLmxlbmd0aDspe3ZhciBpPXRoaXMubGV2ZWxzW25dLG89ZSt0Kmkud2lkdGg7aS5pbmRleD1vO3ZhciBhPWkuaXRlbXNbb107aWYoMjU1PT09YSlicmVhaztpZihhPnIpe3RoaXMuY3VycmVudExldmVsPW47dGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTtyZXR1cm4hMX1lPj49MTt0Pj49MTtuKyt9dGhpcy5jdXJyZW50TGV2ZWw9bi0xO3JldHVybiEwfSxpbmNyZW1lbnRWYWx1ZTpmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKGUpe3ZhciB0PXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTt0Lml0ZW1zW3QuaW5kZXhdPWUrMTt0aGlzLnByb3BhZ2F0ZVZhbHVlcygpfSxwcm9wYWdhdGVWYWx1ZXM6ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9wcm9wYWdhdGVWYWx1ZXMoKXtmb3IodmFyIGU9dGhpcy5jdXJyZW50TGV2ZWwsdD10aGlzLmxldmVsc1tlXSxyPXQuaXRlbXNbdC5pbmRleF07LS1lPj0wOykodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cn0sbmV4dExldmVsOmZ1bmN0aW9uIEluY2x1c2lvblRyZWVfbmV4dExldmVsKCl7dmFyIGU9dGhpcy5jdXJyZW50TGV2ZWwsdD10aGlzLmxldmVsc1tlXSxyPXQuaXRlbXNbdC5pbmRleF07dC5pdGVtc1t0LmluZGV4XT0yNTU7aWYoLS1lPDApcmV0dXJuITE7dGhpcy5jdXJyZW50TGV2ZWw9ZTsodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cjtyZXR1cm4hMH19O3JldHVybiBJbmNsdXNpb25UcmVlfSgpLHM9ZnVuY3Rpb24gQml0TW9kZWxDbG9zdXJlKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoWzAsNSw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMSw2LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwyLDYsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDIsNiw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMiw2LDgsMCwzLDcsOCwwLDQsNyw4XSksdD1uZXcgVWludDhBcnJheShbMCwzLDQsMCw1LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwxLDMsNCwwLDYsNyw3LDAsOCw4LDgsMCwwLDAsMCwwLDIsMyw0LDAsNiw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMiwzLDQsMCw2LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwyLDMsNCwwLDYsNyw3LDAsOCw4LDhdKSxyPW5ldyBVaW50OEFycmF5KFswLDEsMiwwLDEsMiwyLDAsMiwyLDIsMCwwLDAsMCwwLDMsNCw1LDAsNCw1LDUsMCw1LDUsNSwwLDAsMCwwLDAsNiw3LDcsMCw3LDcsNywwLDcsNyw3LDAsMCwwLDAsMCw4LDgsOCwwLDgsOCw4LDAsOCw4LDgsMCwwLDAsMCwwLDgsOCw4LDAsOCw4LDgsMCw4LDgsOF0pO2Z1bmN0aW9uIEJpdE1vZGVsKG4saSxvLGEscyl7dGhpcy53aWR0aD1uO3RoaXMuaGVpZ2h0PWk7dmFyIGM7Yz0iSEgiPT09bz9yOiJITCI9PT1vP3Q6ZTt0aGlzLmNvbnRleHRMYWJlbFRhYmxlPWM7dmFyIHUsZj1uKmk7dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U9bmV3IFVpbnQ4QXJyYXkoZik7dGhpcy5jb2VmZmljZW50c1NpZ249bmV3IFVpbnQ4QXJyYXkoZik7dT1zPjE0P25ldyBVaW50MzJBcnJheShmKTpzPjY/bmV3IFVpbnQxNkFycmF5KGYpOm5ldyBVaW50OEFycmF5KGYpO3RoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU9dTt0aGlzLnByb2Nlc3NpbmdGbGFncz1uZXcgVWludDhBcnJheShmKTt2YXIgbD1uZXcgVWludDhBcnJheShmKTtpZigwIT09YSlmb3IodmFyIHA9MDtwPGY7cCsrKWxbcF09YTt0aGlzLmJpdHNEZWNvZGVkPWw7dGhpcy5yZXNldCgpfUJpdE1vZGVsLnByb3RvdHlwZT17c2V0RGVjb2RlcjpmdW5jdGlvbiBCaXRNb2RlbF9zZXREZWNvZGVyKGUpe3RoaXMuZGVjb2Rlcj1lfSxyZXNldDpmdW5jdGlvbiBCaXRNb2RlbF9yZXNldCgpe3RoaXMuY29udGV4dHM9bmV3IEludDhBcnJheSgxOSk7dGhpcy5jb250ZXh0c1swXT04O3RoaXMuY29udGV4dHNbMTddPTkyO3RoaXMuY29udGV4dHNbMThdPTZ9LHNldE5laWdoYm9yc1NpZ25pZmljYW5jZTpmdW5jdGlvbiBCaXRNb2RlbF9zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoZSx0LHIpe3ZhciBuLGk9dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2Usbz10aGlzLndpZHRoLGE9dGhpcy5oZWlnaHQscz10PjAsYz10KzE8bztpZihlPjApe249ci1vO3MmJihpW24tMV0rPTE2KTtjJiYoaVtuKzFdKz0xNik7aVtuXSs9NH1pZihlKzE8YSl7bj1yK287cyYmKGlbbi0xXSs9MTYpO2MmJihpW24rMV0rPTE2KTtpW25dKz00fXMmJihpW3ItMV0rPTEpO2MmJihpW3IrMV0rPTEpO2lbcl18PTEyOH0scnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzOmZ1bmN0aW9uIEJpdE1vZGVsX3J1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpe2Zvcih2YXIgZT10aGlzLmRlY29kZXIsdD10aGlzLndpZHRoLHI9dGhpcy5oZWlnaHQsbj10aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlLGk9dGhpcy5jb2VmZmljZW50c1NpZ24sbz10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxhPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLHM9dGhpcy5jb250ZXh0cyxjPXRoaXMuY29udGV4dExhYmVsVGFibGUsdT10aGlzLmJpdHNEZWNvZGVkLGY9MDtmPHI7Zis9NClmb3IodmFyIGw9MDtsPHQ7bCsrKWZvcih2YXIgcD1mKnQrbCxkPTA7ZDw0O2QrKyxwKz10KXt2YXIgaD1mK2Q7aWYoaD49cilicmVhazthW3BdJj0tMjtpZighbltwXSYmb1twXSl7dmFyIGc9Y1tvW3BdXTtpZihlLnJlYWRCaXQocyxnKSl7dmFyIHY9dGhpcy5kZWNvZGVTaWduQml0KGgsbCxwKTtpW3BdPXY7bltwXT0xO3RoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGgsbCxwKTthW3BdfD0yfXVbcF0rKzthW3BdfD0xfX19LGRlY29kZVNpZ25CaXQ6ZnVuY3Rpb24gQml0TW9kZWxfZGVjb2RlU2lnbkJpdChlLHQscil7dmFyIG4saSxvLGEscyxjLHU9dGhpcy53aWR0aCxmPXRoaXMuaGVpZ2h0LGw9dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSxwPXRoaXMuY29lZmZpY2VudHNTaWduO2E9dD4wJiYwIT09bFtyLTFdO2lmKHQrMTx1JiYwIT09bFtyKzFdKXtvPXBbcisxXTtuPWE/MS1vLShpPXBbci0xXSk6MS1vLW99ZWxzZSBuPWE/MS0oaT1wW3ItMV0pLWk6MDt2YXIgZD0zKm47YT1lPjAmJjAhPT1sW3ItdV07aWYoZSsxPGYmJjAhPT1sW3IrdV0pe289cFtyK3VdO249YT8xLW8tKGk9cFtyLXVdKStkOjEtby1vK2R9ZWxzZSBuPWE/MS0oaT1wW3ItdV0pLWkrZDpkO2lmKG4+PTApe3M9OStuO2M9dGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cyxzKX1lbHNle3M9OS1uO2M9MV50aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLHMpfXJldHVybiBjfSxydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzczpmdW5jdGlvbiBCaXRNb2RlbF9ydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzcygpe2Zvcih2YXIgZSx0PXRoaXMuZGVjb2RlcixyPXRoaXMud2lkdGgsbj10aGlzLmhlaWdodCxpPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUsbz10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxhPXRoaXMuY29udGV4dHMscz10aGlzLmJpdHNEZWNvZGVkLGM9dGhpcy5wcm9jZXNzaW5nRmxhZ3MsdT1yKm4sZj00KnIsbD0wO2w8dTtsPWUpe2U9TWF0aC5taW4odSxsK2YpO2Zvcih2YXIgcD0wO3A8cjtwKyspZm9yKHZhciBkPWwrcDtkPGU7ZCs9cilpZihpW2RdJiYwPT0oMSZjW2RdKSl7dmFyIGg9MTY7aWYoMCE9KDImY1tkXSkpe2NbZF1ePTI7aD0wPT09KDEyNyZvW2RdKT8xNToxNH12YXIgZz10LnJlYWRCaXQoYSxoKTtpW2RdPWlbZF08PDF8ZztzW2RdKys7Y1tkXXw9MX19fSxydW5DbGVhbnVwUGFzczpmdW5jdGlvbiBCaXRNb2RlbF9ydW5DbGVhbnVwUGFzcygpe2Zvcih2YXIgZSx0PXRoaXMuZGVjb2RlcixyPXRoaXMud2lkdGgsbj10aGlzLmhlaWdodCxpPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLG89dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSxhPXRoaXMuY29lZmZpY2VudHNTaWduLHM9dGhpcy5jb250ZXh0cyxjPXRoaXMuY29udGV4dExhYmVsVGFibGUsdT10aGlzLmJpdHNEZWNvZGVkLGY9dGhpcy5wcm9jZXNzaW5nRmxhZ3MsbD1yLHA9MipyLGQ9MypyLGg9MDtoPG47aD1lKXtlPU1hdGgubWluKGgrNCxuKTtmb3IodmFyIGc9aCpyLHY9aCszPG4sbT0wO208cjttKyspe3ZhciB5LGI9ZyttLHg9MCx3PWIsUz1oO2lmKHYmJjA9PT1mW2JdJiYwPT09ZltiK2xdJiYwPT09ZltiK3BdJiYwPT09ZltiK2RdJiYwPT09aVtiXSYmMD09PWlbYitsXSYmMD09PWlbYitwXSYmMD09PWlbYitkXSl7aWYoIXQucmVhZEJpdChzLDE4KSl7dVtiXSsrO3VbYitsXSsrO3VbYitwXSsrO3VbYitkXSsrO2NvbnRpbnVlfWlmKDAhPT0oeD10LnJlYWRCaXQocywxNyk8PDF8dC5yZWFkQml0KHMsMTcpKSl7Uz1oK3g7dys9eCpyfXk9dGhpcy5kZWNvZGVTaWduQml0KFMsbSx3KTthW3ddPXk7b1t3XT0xO3RoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKFMsbSx3KTtmW3ddfD0yO3c9Yjtmb3IodmFyIF89aDtfPD1TO18rKyx3Kz1yKXVbd10rKzt4Kyt9Zm9yKFM9aCt4O1M8ZTtTKyssdys9cilpZighb1t3XSYmMD09KDEmZlt3XSkpe3ZhciBUPWNbaVt3XV07aWYoMT09PXQucmVhZEJpdChzLFQpKXt5PXRoaXMuZGVjb2RlU2lnbkJpdChTLG0sdyk7YVt3XT15O29bd109MTt0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShTLG0sdyk7Zlt3XXw9Mn11W3ddKyt9fX19LGNoZWNrU2VnbWVudGF0aW9uU3ltYm9sOmZ1bmN0aW9uIEJpdE1vZGVsX2NoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCl7dmFyIGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy5jb250ZXh0cztpZigxMCE9PShlLnJlYWRCaXQodCwxNyk8PDN8ZS5yZWFkQml0KHQsMTcpPDwyfGUucmVhZEJpdCh0LDE3KTw8MXxlLnJlYWRCaXQodCwxNykpKXRocm93IG5ldyBhKCJJbnZhbGlkIHNlZ21lbnRhdGlvbiBzeW1ib2wiKX19O3JldHVybiBCaXRNb2RlbH0oKSxjPWZ1bmN0aW9uIFRyYW5zZm9ybUNsb3N1cmUoKXtmdW5jdGlvbiBUcmFuc2Zvcm0oKXt9VHJhbnNmb3JtLnByb3RvdHlwZS5jYWxjdWxhdGU9ZnVuY3Rpb24gdHJhbnNmb3JtQ2FsY3VsYXRlKGUsdCxyKXtmb3IodmFyIG49ZVswXSxpPTEsbz1lLmxlbmd0aDtpPG87aSsrKW49dGhpcy5pdGVyYXRlKG4sZVtpXSx0LHIpO3JldHVybiBufTtUcmFuc2Zvcm0ucHJvdG90eXBlLmV4dGVuZD1mdW5jdGlvbiBleHRlbmQoZSx0LHIpe3ZhciBuPXQtMSxpPXQrMSxvPXQrci0yLGE9dCtyO2Vbbi0tXT1lW2krK107ZVthKytdPWVbby0tXTtlW24tLV09ZVtpKytdO2VbYSsrXT1lW28tLV07ZVtuLS1dPWVbaSsrXTtlW2ErK109ZVtvLS1dO2Vbbl09ZVtpXTtlW2FdPWVbb119O1RyYW5zZm9ybS5wcm90b3R5cGUuaXRlcmF0ZT1mdW5jdGlvbiBUcmFuc2Zvcm1faXRlcmF0ZShlLHQscixuKXt2YXIgaSxvLGEscyxjLHUsZj1lLndpZHRoLGw9ZS5oZWlnaHQscD1lLml0ZW1zLGQ9dC53aWR0aCxoPXQuaGVpZ2h0LGc9dC5pdGVtcztmb3IoYT0wLGk9MDtpPGw7aSsrKXtzPTIqaSpkO2ZvcihvPTA7bzxmO28rKyxhKysscys9MilnW3NdPXBbYV19cD1lLml0ZW1zPW51bGw7dmFyIHY9bmV3IEZsb2F0MzJBcnJheShkKzgpO2lmKDE9PT1kKXtpZigwIT0oMSZyKSlmb3IodT0wLGE9MDt1PGg7dSsrLGErPWQpZ1thXSo9LjV9ZWxzZSBmb3IodT0wLGE9MDt1PGg7dSsrLGErPWQpe3Yuc2V0KGcuc3ViYXJyYXkoYSxhK2QpLDQpO3RoaXMuZXh0ZW5kKHYsNCxkKTt0aGlzLmZpbHRlcih2LDQsZCk7Zy5zZXQodi5zdWJhcnJheSg0LDQrZCksYSl9dmFyIG09MTYseT1bXTtmb3IoaT0wO2k8bTtpKyspeS5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoaCs4KSk7dmFyIGIseD0wO2U9NCtoO2lmKDE9PT1oKXtpZigwIT0oMSZuKSlmb3IoYz0wO2M8ZDtjKyspZ1tjXSo9LjV9ZWxzZSBmb3IoYz0wO2M8ZDtjKyspe2lmKDA9PT14KXttPU1hdGgubWluKGQtYyxtKTtmb3IoYT1jLHM9NDtzPGU7YSs9ZCxzKyspZm9yKGI9MDtiPG07YisrKXlbYl1bc109Z1thK2JdO3g9bX12YXIgdz15Wy0teF07dGhpcy5leHRlbmQodyw0LGgpO3RoaXMuZmlsdGVyKHcsNCxoKTtpZigwPT09eCl7YT1jLW0rMTtmb3Iocz00O3M8ZTthKz1kLHMrKylmb3IoYj0wO2I8bTtiKyspZ1thK2JdPXlbYl1bc119fXJldHVybnt3aWR0aDpkLGhlaWdodDpoLGl0ZW1zOmd9fTtyZXR1cm4gVHJhbnNmb3JtfSgpLHU9ZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtQ2xvc3VyZSgpe2Z1bmN0aW9uIElycmV2ZXJzaWJsZVRyYW5zZm9ybSgpe2MuY2FsbCh0aGlzKX1JcnJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpO0lycmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uIGlycmV2ZXJzaWJsZVRyYW5zZm9ybUZpbHRlcihlLHQscil7dmFyIG4saSxvLGEscz1yPj4xLGM9LTEuNTg2MTM0MzQyMDU5OTI0LHU9LS4wNTI5ODAxMTg1NzI5NjEsZj0uODgyOTExMDc1NTMwOTM0LGw9LjQ0MzUwNjg1MjA0Mzk3MSxwPTEuMjMwMTc0MTA0OTE0MDAxO249KHR8PTApLTM7Zm9yKGk9cys0O2ktLTtuKz0yKWVbbl0qPS44MTI4OTMwNjYxMTU5NjA5O289bCplWyhuPXQtMiktMV07Zm9yKGk9cyszO2ktLTtuKz0yKXthPWwqZVtuKzFdO2Vbbl09cCplW25dLW8tYTtpZighaS0tKWJyZWFrO289bCplWyhuKz0yKSsxXTtlW25dPXAqZVtuXS1vLWF9bz1mKmVbKG49dC0xKS0xXTtmb3IoaT1zKzI7aS0tO24rPTIpe2E9ZiplW24rMV07ZVtuXS09bythO2lmKCFpLS0pYnJlYWs7bz1mKmVbKG4rPTIpKzFdO2Vbbl0tPW8rYX1vPXUqZVsobj10KS0xXTtmb3IoaT1zKzE7aS0tO24rPTIpe2E9dSplW24rMV07ZVtuXS09bythO2lmKCFpLS0pYnJlYWs7bz11KmVbKG4rPTIpKzFdO2Vbbl0tPW8rYX1pZigwIT09cyl7bz1jKmVbKG49dCsxKS0xXTtmb3IoaT1zO2ktLTtuKz0yKXthPWMqZVtuKzFdO2Vbbl0tPW8rYTtpZighaS0tKWJyZWFrO289YyplWyhuKz0yKSsxXTtlW25dLT1vK2F9fX07cmV0dXJuIElycmV2ZXJzaWJsZVRyYW5zZm9ybX0oKSxmPWZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm1DbG9zdXJlKCl7ZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybSgpe2MuY2FsbCh0aGlzKX1SZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKTtSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24gcmV2ZXJzaWJsZVRyYW5zZm9ybUZpbHRlcihlLHQscil7dmFyIG4saSxvPXI+PjE7Zm9yKG49dHw9MCxpPW8rMTtpLS07bis9MillW25dLT1lW24tMV0rZVtuKzFdKzI+PjI7Zm9yKG49dCsxLGk9bztpLS07bis9MillW25dKz1lW24tMV0rZVtuKzFdPj4xfTtyZXR1cm4gUmV2ZXJzaWJsZVRyYW5zZm9ybX0oKTtyZXR1cm4gSnB4SW1hZ2V9KCk7dC5KcHhJbWFnZT1zfV0pfSkpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tY2hlY2suc3ZnIGIvZXM1L3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1jaGVjay5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjZDE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tY2hlY2suc3ZnCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZworICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgd2lkdGg9IjQwIgorICAgaGVpZ2h0PSI0MCIKKyAgIHZpZXdCb3g9IjAgMCA0MCA0MCI+CisgIDxwYXRoCisgICAgIGQ9Ik0gMS41MDA2NzE0LDIzLjUzNjIyNSA2Ljg5MjU4NzksMTguOTk0MjQ0IDE0LjU4NTcyMSwyNi4wMzc5MzcgMzQuMDE5NjgzLDQuNTQxMDQ3OSAzOC40OTkzMjksOS4yMjM1MDMyIDE0LjU4NTcyMSwzNS40NTg5NTIgeiIKKyAgICAgaWQ9InBhdGg0IgorICAgICBzdHlsZT0iZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjI1NDAyODU2O3N0cm9rZS1vcGFjaXR5OjEiIC8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tY29tbWVudC5zdmcgYi9lczUvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWNvbW1lbnQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZjFmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9lczUvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWNvbW1lbnQuc3ZnCkBAIC0wLDAgKzEsMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZworICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgaGVpZ2h0PSI0MCIKKyAgIHdpZHRoPSI0MCIKKyAgIHZpZXdCb3g9IjAgMCA0MCA0MCI+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOiNmZmZmMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKKyAgICAgd2lkdGg9IjMzLjc2MDE3IgorICAgICBoZWlnaHQ9IjMzLjc2MDE3IgorICAgICB4PSIzLjExOTkxNSIKKyAgICAgeT0iMy4xMTk5MTUiIC8+CisgIDxwYXRoCisgICAgIGQ9Im0gMjAuNjc3OTY3LDguNTQ0OTkgYyAtNy4zNDI4MDEsMCAtMTMuMjk1MjkzLDQuOTU0MjkzIC0xMy4yOTUyOTMsMTEuMDY1NzUxIDAsMi4wODg3OTMgMC4zNjQ3MTczLDMuNDg0Mzc2IDEuNTc1NTM5LDUuMTUwNTYzIEwgNi4wMjY3NDE4LDMxLjQ1NTAxIDEzLjU2MDU5NSwyOS4wMTExMTcgYyAyLjIyMTI2MiwxLjM4Nzk2MiA0LjEyNTkzMiwxLjY2NTM3NyA3LjExNzM3MiwxLjY2NTM3NyA3LjM0MjgsMCAxMy4yOTUyOTEsLTQuOTU0Mjk1IDEzLjI5NTI5MSwtMTEuMDY1NzUzIDAsLTYuMTExNDU4IC01Ljk1MjQ5MSwtMTEuMDY1NzUxIC0xMy4yOTUyOTEsLTExLjA2NTc1MSB6IgorICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjkzMDMxODM2O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvZXM1L3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1oZWxwLnN2ZyBiL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24taGVscC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MzhmZQotLS0gL2Rldi9udWxsCisrKyBiL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24taGVscC5zdmcKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB3aWR0aD0iNDAiCisgICBoZWlnaHQ9IjQwIgorICAgdmlld0JveD0iMCAwIDQwIDQwIj4KKyAgPGcKKyAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNjApIgorICAgICBpZD0ibGF5ZXIxIj4KKyAgICA8cmVjdAorICAgICAgIHdpZHRoPSIzNi40NjA5NTMiCisgICAgICAgaGVpZ2h0PSIzNC44MDU2MDMiCisgICAgICAgeD0iMS43Njk1MjM2IgorICAgICAgIHk9IjYyLjU5NzE5OCIKKyAgICAgICBzdHlsZT0iZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjMwODI2NzcxO3N0cm9rZS1vcGFjaXR5OjEiIC8+CisgICAgPGcKKyAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjg4NzYzNjc3LDAsMCwwLjg4NzYzNjc3LDIuMjQ3MjY0Niw4Ljk4OTA1ODQpIj4KKyAgICAgIDxwYXRoCisgICAgICAgICBkPSJNIDIwLDY0LjUyNjM0MiBDIDExLjQ1NDEzNSw2NC41MjYzNDIgNC41MjYzNDIxLDcxLjQ1NDEzNSA0LjUyNjM0MjEsODAgNC41MjYzNDIxLDg4LjU0NTg2NSAxMS40NTQxMzUsOTUuNDczNjU4IDIwLDk1LjQ3MzY1OCAyOC41NDU4NjUsOTUuNDczNjU4IDM1LjQ3MzY1OCw4OC41NDU4NjUgMzUuNDczNjU4LDgwIDM1LjQ3MzY1OCw3MS40NTQxMzUgMjguNTQ1ODY1LDY0LjUyNjM0MiAyMCw2NC41MjYzNDIgeiBtIC0wLjQwODczOCw5LjQ4ODU2NCBjIDMuNTI3MDc5LDAgNi4zOTM4MzIsMi44NDA2MSA2LjM5MzgzMiw2LjMzNTQ0MSAwLDMuNDk0ODMxIC0yLjg2Njc1Myw2LjMzNTQ0MSAtNi4zOTM4MzIsNi4zMzU0NDEgLTMuNTI3MDc5LDAgLTYuMzkzODMyLC0yLjg0MDYxIC02LjM5MzgzMiwtNi4zMzU0NDEgMCwtMy40OTQ4MzEgMi44NjY3NTMsLTYuMzM1NDQxIDYuMzkzODMyLC02LjMzNTQ0MSB6IgorICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMjc2ODQ0NTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgorICAgICAgPHBhdGgKKyAgICAgICAgIGQ9Im0gNy4yMzM1MjA5LDcxLjgxOTkzOCA0Ljk3MDI1OTEsNC4xNjE4MjMgYyAtMS42Nzk5NTYsMi41ODE2MDYgLTEuNDQzOTM5LDYuMDY5NTkyIDAuMTU5MzI1LDguNjc3NzI1IGwgLTUuMTI2MzA3MSwzLjQyNDQ2MyBjIDAuNjc1MTYsMS4yMzE0NTIgMy4wMTY2NDAxLDMuNTQ3Njg2IDQuMjMzMTk3MSw0LjE5NDc1NyBsIDMuOTA3NzI4LC00LjU2NzI3NyBjIDIuNTQxOTUyLDEuNDU5NzUgNS43MzA2OTQsMS4zOTIxNjEgOC40Mzg2ODMsLTAuMTI2MTQgbCAzLjQ2OTUxNyw2LjEwODMzNiBjIDEuMTI5Nzc5LC0wLjQ0MzY3IDQuNzQyMjM0LC0zLjQ0OTYzMyA1LjQxNjM1OCwtNS4wMDM4NTkgbCAtNS40NjIwNCwtNC40MTU1NDEgYyAxLjQ0MzE5LC0yLjQyNDA5OCAxLjY1MTE3NSwtNS4yNjc1MTUgMC41NTczMDMsLTcuNzQ4NjIzIGwgNS45MDMxOTUsLTMuODMzOTUxIEMgMzMuMTQyNTcsNzEuNzA0OTk2IDMwLjYxNjIxNyw2OS4wMTg2MDYgMjkuMDI5NTIsNjcuOTkyOTYgbCAtNC4xMTg4MTMsNC45ODE2NzggQyAyMi40MTE5MzQsNzEuMjA1MDk5IDE4LjkwMDg1Myw3MC45Mzc1MzQgMTYuMDQxMzE5LDcyLjMyOTE2IGwgLTMuNTk1NDA4LC01LjMyMjA5MSBjIC0xLjM0NTk2MiwwLjU3OTQ4OCAtNC4xMjkzODgxLDIuOTIxMjMzIC01LjIxMjM5MDEsNC44MTI4NjkgeiBtIDguMTAxMDMxMSwzLjQyNjY3MiBjIDIuNzUyODQsLTIuNDQ2MjY2IDYuNzY5MTQ5LC0yLjE0NDY5NCA5LjA0ODk5OCwwLjQyMDg3NCAyLjI3OTg0OCwyLjU2NTU3IDIuMTEzOTE5LDYuNTk2OTE5IC0wLjYzODkyNCw5LjA0MzE4NSAtMi43NTI4NDEsMi40NDYyNjcgLTYuNzc1NzU0LDIuMTM3MjYgLTkuMDU1NjA0LC0wLjQyODMwOCAtMi4yNzk4NTEsLTIuNTY1NTY4IC0yLjEwNzMxMywtNi41ODk0ODUgMC42NDU1MywtOS4wMzU3NTEgeiIKKyAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CisgICAgPC9nPgorICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24taW5zZXJ0LnN2ZyBiL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24taW5zZXJ0LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTllZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZXM1L3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1pbnNlcnQuc3ZnCkBAIC0wLDAgKzEsMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZworICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgd2lkdGg9IjY0IgorICAgaGVpZ2h0PSI2NCIKKyAgIHZpZXdCb3g9IjAgMCA2NCA2NCI+CisgIDxwYXRoCisgICAgIGQ9Ik0gMzIuMDAzMTQzLDEuNDA0NDYwMiA1Ny40MzI3MDEsNjIuNjMyNTc3IDYuNTY3Mjk5MSw2Mi42Mjc5MjQgeiIKKyAgICAgc3R5bGU9ImZpbGw6I2ZmZmYwMDtmaWxsLW9wYWNpdHk6MC45NDExNzY0NztmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDQ5MzAzODtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9lczUvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWtleS5zdmcgYi9lczUvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWtleS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwOWQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24ta2V5LnN2ZwpAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHdpZHRoPSI2NCIKKyAgIGhlaWdodD0iNjQiCisgICB2aWV3Qm94PSIwIDAgNjQgNjQiPgorICA8cGF0aAorICAgICBkPSJNIDI1LjQ3MDg0Myw5LjQ5MzM3NjYgQyAyNS4zMDIxOSwxMi4xNDE4MTggMzAuMTM5MTAxLDE0LjQ0NTk2OSAzNC43MDQ4MzEsMTMuNTI5MTQ0IDQwLjYyNjM1LDEyLjU0MTk5NSA0MS4zOTg4MzMsNy4zODU2NDk4IDM1Ljk3NTA1LDUuNzc3ODYzIDMxLjQwMDkyMSw0LjE1NDkxNTUgMjUuMTU3Njc0LDYuNTQ0NTg5MiAyNS40NzA4NDMsOS40OTMzNzY2IHogTSA0LjUyNDYyODIsMTcuNjUyMDUxIEMgNC4wNjgyNDksMTEuODMyODczIDkuMjc0Mjk4Myw1LjkyNzA0MDcgMTguNDM3Mzc5LDMuMDk3NzA4OCAyOS43NTE5MTEsLTAuODcxODUxODQgNDUuNDk1NjYzLDEuNDAwODAyMiA1My42MDM5NTMsNy4xMTA0MDA5IGMgOS4yNzU3NjUsNi4xODg5MjIxIDcuMTU4MTI4LDE2LjIwNzk0MjEgLTMuMTcxMDc2LDIxLjU5Mzk1MjEgLTEuNzg0MzE2LDEuNjM1ODE1IC02LjM4MDIyMiwxLjIxNDIxIC03LjA2ODM1MSwzLjE4NjE4NiAtMS4wNDAwMywwLjk3MjQyNyAtMS4yODgwNDYsMi4wNTAxNTggLTEuMjMyODY0LDMuMTY4MjAzIDEuMDE1MTExLDIuMDAwMTA4IC0zLjgzMTU0OCwxLjYzMzIxNiAtMy4yNzA1NTMsMy43NTk1NzQgMC41ODk0NzcsNS4yNjQ1NDQgLTAuMTc5Mjc2LDEwLjUzNzM4IC0wLjM2Mjg0MiwxNS44MDYyNTcgLTAuNDkyMDA2LDIuMTg0OTk4IDEuMTYzNDU2LDQuNTc0MjMyIC0wLjczNDg4OCw2LjYxMDY0MiAtMi40ODI5MTksMi4zMjUxODQgLTcuMzA2MDQsMi4xODkxNDMgLTkuMTkzNDk3LC0wLjI3NDc2NyAtMi43MzM2ODgsLTEuNzQwNjI2IC04LjI1NDQ0NywtMy42MTUyNTQgLTYuMTA0MjQ3LC02LjMzOTYyNiAzLjQ2ODExMiwtMS43MDg2ODYgLTIuMTE2MTk3LC0zLjQ0OTg5NyAwLjQzMTI0MiwtNS4wODAyNzQgNS4wNTg0MDIsLTEuMzkyNTYgLTIuMzkzMjE1LC0yLjMwNDMxOCAtMC4xNDY4ODksLTQuMzM0NjQ1IDMuMDY5MTk4LC0wLjk3NzQxNSAyLjA1Njk4NiwtMi41MTgzNTIgLTAuMjE5MTIxLC0zLjU0MDM5NyAxLjg3NjU2NywtMS44MDcxNTEgMS40ODQxNDksLTQuODY4OTE5IC0yLjU2NTQ1NSwtNS45NDIyMDUgMC4xNTA4NjYsLTEuODA1NDc0IDIuOTA1NzM3LC00LjEzNjg3NiAtMS42Nzk5NjcsLTUuMjA0OTMgQyAxMC4yNjA5MDIsMjcuODgyMTY3IDQuNjg3MjY5NywyMi45NTA0NSA0LjUyNDU5NDUsMTcuNjUyMDUxIHoiCisgICAgIGlkPSJwYXRoNjA0IgorICAgICBzdHlsZT0iZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjcyNjY1MTc5O3N0cm9rZS1vcGFjaXR5OjEiIC8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tbmV3cGFyYWdyYXBoLnN2ZyBiL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tbmV3cGFyYWdyYXBoLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQyNDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZXM1L3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1uZXdwYXJhZ3JhcGguc3ZnCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZworICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgd2lkdGg9IjY0IgorICAgaGVpZ2h0PSI2NCIKKyAgIHZpZXdCb3g9IjAgMCA2NCA2NCI+CisgIDxwYXRoCisgICAgIGQ9Ik0gMzIuMDAzMTQzLDEwLjkxMzA3MiA1Ny40MzI3MDEsNTMuMDg2OTI5IDYuNTY3Mjk5LDUzLjA4MzcyMyB6IgorICAgICBpZD0icGF0aDI5ODUiCisgICAgIHN0eWxlPSJmaWxsOiNmZmZmMDA7ZmlsbC1vcGFjaXR5OjAuOTQxMTc2NDc7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuODM0MDMwOTk7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvZXM1L3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1ub2ljb24uc3ZnIGIvZXM1L3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1ub2ljb24uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2QxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9lczUvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLW5vaWNvbi5zdmcKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHdpZHRoPSI0MCIKKyAgIGhlaWdodD0iNDAiCisgICB2aWV3Qm94PSIwIDAgNDAgNDAiPgorPC9zdmc+CmRpZmYgLS1naXQgYS9lczUvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLW5vdGUuc3ZnIGIvZXM1L3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1ub3RlLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDE3MzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZXM1L3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1ub3RlLnN2ZwpAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHdpZHRoPSI0MCIKKyAgIGhlaWdodD0iNDAiCisgICB2aWV3Qm94PSIwIDAgNDAgNDAiPgorICA8cmVjdAorICAgICB3aWR0aD0iMzYuMDc1NDI4IgorICAgICBoZWlnaHQ9IjMxLjA5NjU4MiIKKyAgICAgeD0iMS45NjIyODYiCisgICAgIHk9IjQuNDUxNzA4OCIKKyAgICAgaWQ9InJlY3Q0IgorICAgICBzdHlsZT0iZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjIzMDA0MjQ2O3N0cm9rZS1vcGFjaXR5OjEiIC8+CisgIDxyZWN0CisgICAgIHdpZHRoPSIyNy45Njg1OSIKKyAgICAgaGVpZ2h0PSIxLjUwMTIxNDUiCisgICAgIHg9IjYuMDE1NzA0NiIKKyAgICAgeT0iMTAuMjg1IgorICAgICBpZD0icmVjdDYiCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CisgIDxyZWN0CisgICAgIHdpZHRoPSIyNy45Njg1OSIKKyAgICAgaGVpZ2h0PSIwLjg1NzgzNjg0IgorICAgICB4PSI2LjAxNTcwNTYiCisgICAgIHk9IjIzLjIxNjg5IgorICAgICBpZD0icmVjdDgiCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CisgIDxyZWN0CisgICAgIHdpZHRoPSIyNy45Njg1OSIKKyAgICAgaGVpZ2h0PSIwLjg1NzgzNjg0IgorICAgICB4PSI1LjgxMzAzNDUiCisgICAgIHk9IjI4Ljk2NDM5NCIKKyAgICAgaWQ9InJlY3QxMCIKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KKyAgPHJlY3QKKyAgICAgd2lkdGg9IjI3Ljk2ODU5IgorICAgICBoZWlnaHQ9IjAuODU3ODM2ODQiCisgICAgIHg9IjYuMDE1NzA0NiIKKyAgICAgeT0iMTcuNDI2NDkzIgorICAgICBpZD0icmVjdDEyIgorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9lczUvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLXBhcmFncmFwaC5zdmcgYi9lczUvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLXBhcmFncmFwaC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlNTIxMgotLS0gL2Rldi9udWxsCisrKyBiL2VzNS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tcGFyYWdyYXBoLnN2ZwpAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHdpZHRoPSI0MCIKKyAgIGhlaWdodD0iNDAiCisgICB2aWV3Qm94PSIwIDAgNDAgNDAiPgorICA8cmVjdAorICAgICB3aWR0aD0iMzMuNzYwMTciCisgICAgIGhlaWdodD0iMzMuNzYwMTciCisgICAgIHg9IjMuMTE5OTE1IgorICAgICB5PSIzLjExOTkxNSIKKyAgICAgc3R5bGU9ImZpbGw6I2ZmZmYwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgorICA8cGF0aAorICAgICBkPSJtIDE3LjY5MjY3OCwzNC41MDIwNiAwLC0xNi4xODIyMjQgYyAtMS45MzA1MTUsLTAuMTAzMjI1IC0zLjQ1NTgyNCwtMC43MzAzODMgLTQuNTc1OTMsLTEuODgxNDczIC0xLjEyMDExLC0xLjE1MTA2NyAtMS42ODAxNjQsLTIuNjE5NTk2IC0xLjY4MDE2NCwtNC40MDU1OTEgMCwtMS45OTI0MzUgMC42MjE5OTUsLTMuNTc5Njg0OSAxLjg2NTk4OCwtNC43NjE3NTUzIDEuMjQzOTg5LC0xLjE4MjAyODggMy4wNjM1MiwtMS43NzMwNTM2IDUuNDU4NTk4LC0xLjc3MzA3NjQgbCA5LjgwMjI0NiwwIDAsMi42Nzg5NzExIC0yLjIyOTg5NSwwIDAsMjYuMzI1MTQ4NiAtMi42MzI1MTUsMCAwLC0yNi4zMjUxNDg2IC0zLjQ1MzI0LDAgMCwyNi4zMjUxNDg2IHoiCisgICAgIHN0eWxlPSJmb250LXNpemU6MjkuNDIwNTExMjVweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjA3Nzk1NzUxO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6QXJpYWw7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpBcmlhbCIgLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvZXM1L3dlYi9pbWFnZXMvbG9hZGluZy1pY29uLmdpZiBiL2VzNS93ZWIvaW1hZ2VzL2xvYWRpbmctaWNvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3MmViYgotLS0gL2Rldi9udWxsCisrKyBiL2VzNS93ZWIvaW1hZ2VzL2xvYWRpbmctaWNvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXM1L3dlYi9pbWFnZXMvc2hhZG93LnBuZyBiL2VzNS93ZWIvaW1hZ2VzL3NoYWRvdy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwMDYxYQotLS0gL2Rldi9udWxsCisrKyBiL2VzNS93ZWIvaW1hZ2VzL3NoYWRvdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXM1L3dlYi9wZGZfdmlld2VyLmNzcyBiL2VzNS93ZWIvcGRmX3ZpZXdlci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhNDE0NAotLS0gL2Rldi9udWxsCisrKyBiL2VzNS93ZWIvcGRmX3ZpZXdlci5jc3MKQEAgLTAsMCArMSw0MDYgQEAKKy8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy50ZXh0TGF5ZXIgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IDA7CisgIHRvcDogMDsKKyAgcmlnaHQ6IDA7CisgIGJvdHRvbTogMDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgb3BhY2l0eTogMC4yOworICBsaW5lLWhlaWdodDogMTsKK30KKworLnRleHRMYXllciA+IHNwYW4geworICBjb2xvcjogdHJhbnNwYXJlbnQ7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgd2hpdGUtc3BhY2U6IHByZTsKKyAgY3Vyc29yOiB0ZXh0OworICB0cmFuc2Zvcm0tb3JpZ2luOiAwJSAwJTsKK30KKworLnRleHRMYXllciAuaGlnaGxpZ2h0IHsKKyAgbWFyZ2luOiAtMXB4OworICBwYWRkaW5nOiAxcHg7CisgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTgwLCAwLCAxNzAsIDEpOworICBib3JkZXItcmFkaXVzOiA0cHg7Cit9CisKKy50ZXh0TGF5ZXIgLmhpZ2hsaWdodC5iZWdpbiB7CisgIGJvcmRlci1yYWRpdXM6IDRweCAwcHggMHB4IDRweDsKK30KKworLnRleHRMYXllciAuaGlnaGxpZ2h0LmVuZCB7CisgIGJvcmRlci1yYWRpdXM6IDBweCA0cHggNHB4IDBweDsKK30KKworLnRleHRMYXllciAuaGlnaGxpZ2h0Lm1pZGRsZSB7CisgIGJvcmRlci1yYWRpdXM6IDBweDsKK30KKworLnRleHRMYXllciAuaGlnaGxpZ2h0LnNlbGVjdGVkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAxMDAsIDAsIDEpOworfQorCisudGV4dExheWVyIDo6LW1vei1zZWxlY3Rpb24geworICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDI1NSwgMSk7Cit9CisKKy50ZXh0TGF5ZXIgOjpzZWxlY3Rpb24geworICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDI1NSwgMSk7Cit9CisKKy50ZXh0TGF5ZXIgLmVuZE9mQ29udGVudCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IDBweDsKKyAgdG9wOiAxMDAlOworICByaWdodDogMHB4OworICBib3R0b206IDBweDsKKyAgei1pbmRleDogLTE7CisgIGN1cnNvcjogZGVmYXVsdDsKKyAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKK30KKworLnRleHRMYXllciAuZW5kT2ZDb250ZW50LmFjdGl2ZSB7CisgIHRvcDogMHB4OworfQorCisKKy5hbm5vdGF0aW9uTGF5ZXIgc2VjdGlvbiB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKK30KKworLmFubm90YXRpb25MYXllciAubGlua0Fubm90YXRpb24gPiBhLAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5wdXNoQnV0dG9uID4gYSB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgZm9udC1zaXplOiAxZW07CisgIHRvcDogMDsKKyAgbGVmdDogMDsKKyAgd2lkdGg6IDEwMCU7CisgIGhlaWdodDogMTAwJTsKK30KKworLmFubm90YXRpb25MYXllciAubGlua0Fubm90YXRpb24gPiBhOmhvdmVyLAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5wdXNoQnV0dG9uID4gYTpob3ZlciB7CisgIG9wYWNpdHk6IDAuMjsKKyAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMCwgMSk7CisgIGJveC1zaGFkb3c6IDBweCAycHggMTBweCByZ2JhKDI1NSwgMjU1LCAwLCAxKTsKK30KKworLmFubm90YXRpb25MYXllciAudGV4dEFubm90YXRpb24gaW1nIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBjdXJzb3I6IHBvaW50ZXI7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnRleHRXaWRnZXRBbm5vdGF0aW9uIGlucHV0LAorLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gdGV4dGFyZWEsCisuYW5ub3RhdGlvbkxheWVyIC5jaG9pY2VXaWRnZXRBbm5vdGF0aW9uIHNlbGVjdCwKKy5hbm5vdGF0aW9uTGF5ZXIgLmJ1dHRvbldpZGdldEFubm90YXRpb24uY2hlY2tCb3ggaW5wdXQsCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLnJhZGlvQnV0dG9uIGlucHV0IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCA1NCwgMjU1LCAwLjEzKTsKKyAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIGZvbnQtc2l6ZTogOXB4OworICBoZWlnaHQ6IDEwMCU7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMCAzcHg7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgIHdpZHRoOiAxMDAlOworfQorCisuYW5ub3RhdGlvbkxheWVyIC5jaG9pY2VXaWRnZXRBbm5vdGF0aW9uIHNlbGVjdCBvcHRpb24geworICBwYWRkaW5nOiAwOworfQorCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLnJhZGlvQnV0dG9uIGlucHV0IHsKKyAgYm9yZGVyLXJhZGl1czogNTAlOworfQorCisuYW5ub3RhdGlvbkxheWVyIC50ZXh0V2lkZ2V0QW5ub3RhdGlvbiB0ZXh0YXJlYSB7CisgIGZvbnQ6IG1lc3NhZ2UtYm94OworICBmb250LXNpemU6IDlweDsKKyAgcmVzaXplOiBub25lOworfQorCisuYW5ub3RhdGlvbkxheWVyIC50ZXh0V2lkZ2V0QW5ub3RhdGlvbiBpbnB1dFtkaXNhYmxlZF0sCisuYW5ub3RhdGlvbkxheWVyIC50ZXh0V2lkZ2V0QW5ub3RhdGlvbiB0ZXh0YXJlYVtkaXNhYmxlZF0sCisuYW5ub3RhdGlvbkxheWVyIC5jaG9pY2VXaWRnZXRBbm5vdGF0aW9uIHNlbGVjdFtkaXNhYmxlZF0sCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0W2Rpc2FibGVkXSwKKy5hbm5vdGF0aW9uTGF5ZXIgLmJ1dHRvbldpZGdldEFubm90YXRpb24ucmFkaW9CdXR0b24gaW5wdXRbZGlzYWJsZWRdIHsKKyAgYmFja2dyb3VuZDogbm9uZTsKKyAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGN1cnNvcjogbm90LWFsbG93ZWQ7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnRleHRXaWRnZXRBbm5vdGF0aW9uIGlucHV0OmhvdmVyLAorLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gdGV4dGFyZWE6aG92ZXIsCisuYW5ub3RhdGlvbkxheWVyIC5jaG9pY2VXaWRnZXRBbm5vdGF0aW9uIHNlbGVjdDpob3ZlciwKKy5hbm5vdGF0aW9uTGF5ZXIgLmJ1dHRvbldpZGdldEFubm90YXRpb24uY2hlY2tCb3ggaW5wdXQ6aG92ZXIsCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLnJhZGlvQnV0dG9uIGlucHV0OmhvdmVyIHsKKyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAxKTsKK30KKworLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gaW5wdXQ6Zm9jdXMsCisuYW5ub3RhdGlvbkxheWVyIC50ZXh0V2lkZ2V0QW5ub3RhdGlvbiB0ZXh0YXJlYTpmb2N1cywKKy5hbm5vdGF0aW9uTGF5ZXIgLmNob2ljZVdpZGdldEFubm90YXRpb24gc2VsZWN0OmZvY3VzIHsKKyAgYmFja2dyb3VuZDogbm9uZTsKKyAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLmJ1dHRvbldpZGdldEFubm90YXRpb24uY2hlY2tCb3ggaW5wdXQ6Y2hlY2tlZDpiZWZvcmUsCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0OmNoZWNrZWQ6YWZ0ZXIsCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLnJhZGlvQnV0dG9uIGlucHV0OmNoZWNrZWQ6YmVmb3JlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAxKTsKKyAgY29udGVudDogIiI7CisgIGRpc3BsYXk6IGJsb2NrOworICBwb3NpdGlvbjogYWJzb2x1dGU7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLmJ1dHRvbldpZGdldEFubm90YXRpb24uY2hlY2tCb3ggaW5wdXQ6Y2hlY2tlZDpiZWZvcmUsCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0OmNoZWNrZWQ6YWZ0ZXIgeworICBoZWlnaHQ6IDgwJTsKKyAgbGVmdDogNDUlOworICB3aWR0aDogMXB4OworfQorCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0OmNoZWNrZWQ6YmVmb3JlIHsKKyAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOworfQorCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0OmNoZWNrZWQ6YWZ0ZXIgeworICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpOworfQorCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLnJhZGlvQnV0dG9uIGlucHV0OmNoZWNrZWQ6YmVmb3JlIHsKKyAgYm9yZGVyLXJhZGl1czogNTAlOworICBoZWlnaHQ6IDUwJTsKKyAgbGVmdDogMzAlOworICB0b3A6IDIwJTsKKyAgd2lkdGg6IDUwJTsKK30KKworLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gaW5wdXQuY29tYiB7CisgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisgIHBhZGRpbmctbGVmdDogMnB4OworICBwYWRkaW5nLXJpZ2h0OiAwOworfQorCisuYW5ub3RhdGlvbkxheWVyIC50ZXh0V2lkZ2V0QW5ub3RhdGlvbiBpbnB1dC5jb21iOmZvY3VzIHsKKyAgLyoKKyAgICogTGV0dGVyIHNwYWNpbmcgaXMgcGxhY2VkIG9uIHRoZSByaWdodCBzaWRlIG9mIGVhY2ggY2hhcmFjdGVyLiBIZW5jZSwgdGhlCisgICAqIGxldHRlciBzcGFjaW5nIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBtYXkgYmUgcGxhY2VkIG91dHNpZGUgdGhlIHZpc2libGUKKyAgICogYXJlYSwgY2F1c2luZyBob3Jpem9udGFsIHNjcm9sbGluZy4gV2UgYXZvaWQgdGhpcyBieSBleHRlbmRpbmcgdGhlIHdpZHRoCisgICAqIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGZvY3VzIGFuZCByZXZlcnQgdGhpcyB3aGVuIGl0IGxvc2VzIGZvY3VzLgorICAgKi8KKyAgd2lkdGg6IDExNSU7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLmJ1dHRvbldpZGdldEFubm90YXRpb24uY2hlY2tCb3ggaW5wdXQsCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLnJhZGlvQnV0dG9uIGlucHV0IHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CisgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsKKyAgcGFkZGluZzogMDsKK30KKworLmFubm90YXRpb25MYXllciAucG9wdXBXcmFwcGVyIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB3aWR0aDogMjBlbTsKK30KKworLmFubm90YXRpb25MYXllciAucG9wdXAgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHotaW5kZXg6IDIwMDsKKyAgbWF4LXdpZHRoOiAyMGVtOworICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAxNTMsIDEpOworICBib3gtc2hhZG93OiAwcHggMnB4IDVweCByZ2JhKDEzNiwgMTM2LCAxMzYsIDEpOworICBib3JkZXItcmFkaXVzOiAycHg7CisgIHBhZGRpbmc6IDZweDsKKyAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgY3Vyc29yOiBwb2ludGVyOworICBmb250OiBtZXNzYWdlLWJveDsKKyAgZm9udC1zaXplOiA5cHg7CisgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKK30KKworLmFubm90YXRpb25MYXllciAucG9wdXAgPiAqIHsKKyAgZm9udC1zaXplOiA5cHg7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnBvcHVwIGgxIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworfQorCisuYW5ub3RhdGlvbkxheWVyIC5wb3B1cCBzcGFuIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBtYXJnaW4tbGVmdDogNXB4OworfQorCisuYW5ub3RhdGlvbkxheWVyIC5wb3B1cCBwIHsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoNTEsIDUxLCA1MSwgMSk7CisgIG1hcmdpbi10b3A6IDJweDsKKyAgcGFkZGluZy10b3A6IDJweDsKK30KKworLmFubm90YXRpb25MYXllciAuaGlnaGxpZ2h0QW5ub3RhdGlvbiwKKy5hbm5vdGF0aW9uTGF5ZXIgLnVuZGVybGluZUFubm90YXRpb24sCisuYW5ub3RhdGlvbkxheWVyIC5zcXVpZ2dseUFubm90YXRpb24sCisuYW5ub3RhdGlvbkxheWVyIC5zdHJpa2VvdXRBbm5vdGF0aW9uLAorLmFubm90YXRpb25MYXllciAuZnJlZVRleHRBbm5vdGF0aW9uLAorLmFubm90YXRpb25MYXllciAubGluZUFubm90YXRpb24gc3ZnIGxpbmUsCisuYW5ub3RhdGlvbkxheWVyIC5zcXVhcmVBbm5vdGF0aW9uIHN2ZyByZWN0LAorLmFubm90YXRpb25MYXllciAuY2lyY2xlQW5ub3RhdGlvbiBzdmcgZWxsaXBzZSwKKy5hbm5vdGF0aW9uTGF5ZXIgLnBvbHlsaW5lQW5ub3RhdGlvbiBzdmcgcG9seWxpbmUsCisuYW5ub3RhdGlvbkxheWVyIC5wb2x5Z29uQW5ub3RhdGlvbiBzdmcgcG9seWdvbiwKKy5hbm5vdGF0aW9uTGF5ZXIgLmNhcmV0QW5ub3RhdGlvbiwKKy5hbm5vdGF0aW9uTGF5ZXIgLmlua0Fubm90YXRpb24gc3ZnIHBvbHlsaW5lLAorLmFubm90YXRpb25MYXllciAuc3RhbXBBbm5vdGF0aW9uLAorLmFubm90YXRpb25MYXllciAuZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIHsKKyAgY3Vyc29yOiBwb2ludGVyOworfQorCisucGRmVmlld2VyIC5jYW52YXNXcmFwcGVyIHsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworLnBkZlZpZXdlciAucGFnZSB7CisgIGRpcmVjdGlvbjogbHRyOworICB3aWR0aDogODE2cHg7CisgIGhlaWdodDogMTA1NnB4OworICBtYXJnaW46IDFweCBhdXRvIC04cHggYXV0bzsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBvdmVyZmxvdzogdmlzaWJsZTsKKyAgYm9yZGVyOiA5cHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJhY2tncm91bmQtY2xpcDogY29udGVudC1ib3g7CisgIC1vLWJvcmRlci1pbWFnZTogdXJsKGltYWdlcy9zaGFkb3cucG5nKSA5IDkgcmVwZWF0OworICAgICBib3JkZXItaW1hZ2U6IHVybChpbWFnZXMvc2hhZG93LnBuZykgOSA5IHJlcGVhdDsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAxKTsKK30KKworLnBkZlZpZXdlci5yZW1vdmVQYWdlQm9yZGVycyAucGFnZSB7CisgIG1hcmdpbjogMHB4IGF1dG8gMTBweCBhdXRvOworICBib3JkZXI6IG5vbmU7Cit9CisKKy5wZGZWaWV3ZXIuc2luZ2xlUGFnZVZpZXcgeworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cit9CisKKy5wZGZWaWV3ZXIuc2luZ2xlUGFnZVZpZXcgLnBhZ2UgeworICBtYXJnaW46IDA7CisgIGJvcmRlcjogbm9uZTsKK30KKworLnBkZlZpZXdlci5zY3JvbGxIb3Jpem9udGFsLAorLnBkZlZpZXdlci5zY3JvbGxXcmFwcGVkLAorLnNwcmVhZCB7CisgIG1hcmdpbi1sZWZ0OiAzLjVweDsKKyAgbWFyZ2luLXJpZ2h0OiAzLjVweDsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisucGRmVmlld2VyLnNjcm9sbEhvcml6b250YWwsCisuc3ByZWFkIHsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLnBkZlZpZXdlci5yZW1vdmVQYWdlQm9yZGVycywKKy5wZGZWaWV3ZXIuc2Nyb2xsSG9yaXpvbnRhbCAuc3ByZWFkLAorLnBkZlZpZXdlci5zY3JvbGxXcmFwcGVkIC5zcHJlYWQgeworICBtYXJnaW4tbGVmdDogMDsKKyAgbWFyZ2luLXJpZ2h0OiAwOworfQorCisuc3ByZWFkIC5wYWdlLAorLnBkZlZpZXdlci5zY3JvbGxIb3Jpem9udGFsIC5wYWdlLAorLnBkZlZpZXdlci5zY3JvbGxXcmFwcGVkIC5wYWdlLAorLnBkZlZpZXdlci5zY3JvbGxIb3Jpem9udGFsIC5zcHJlYWQsCisucGRmVmlld2VyLnNjcm9sbFdyYXBwZWQgLnNwcmVhZCB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLnNwcmVhZCAucGFnZSwKKy5wZGZWaWV3ZXIuc2Nyb2xsSG9yaXpvbnRhbCAucGFnZSwKKy5wZGZWaWV3ZXIuc2Nyb2xsV3JhcHBlZCAucGFnZSB7CisgIG1hcmdpbi1sZWZ0OiAtMy41cHg7CisgIG1hcmdpbi1yaWdodDogLTMuNXB4OworfQorCisucGRmVmlld2VyLnJlbW92ZVBhZ2VCb3JkZXJzIC5zcHJlYWQgLnBhZ2UsCisucGRmVmlld2VyLnJlbW92ZVBhZ2VCb3JkZXJzLnNjcm9sbEhvcml6b250YWwgLnBhZ2UsCisucGRmVmlld2VyLnJlbW92ZVBhZ2VCb3JkZXJzLnNjcm9sbFdyYXBwZWQgLnBhZ2UgeworICBtYXJnaW4tbGVmdDogNXB4OworICBtYXJnaW4tcmlnaHQ6IDVweDsKK30KKworLnBkZlZpZXdlciAucGFnZSBjYW52YXMgeworICBtYXJnaW46IDA7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisucGRmVmlld2VyIC5wYWdlIGNhbnZhc1toaWRkZW5dIHsKKyAgZGlzcGxheTogbm9uZTsKK30KKworLnBkZlZpZXdlciAucGFnZSAubG9hZGluZ0ljb24geworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGRpc3BsYXk6IGJsb2NrOworICBsZWZ0OiAwOworICB0b3A6IDA7CisgIHJpZ2h0OiAwOworICBib3R0b206IDA7CisgIGJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL2xvYWRpbmctaWNvbi5naWYiKSBjZW50ZXIgbm8tcmVwZWF0OworfQorCisucGRmUHJlc2VudGF0aW9uTW9kZSAucGRmVmlld2VyIHsKKyAgbWFyZ2luLWxlZnQ6IDA7CisgIG1hcmdpbi1yaWdodDogMDsKK30KKworLnBkZlByZXNlbnRhdGlvbk1vZGUgLnBkZlZpZXdlciAucGFnZSwKKy5wZGZQcmVzZW50YXRpb25Nb2RlIC5wZGZWaWV3ZXIgLnNwcmVhZCB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisucGRmUHJlc2VudGF0aW9uTW9kZSAucGRmVmlld2VyIC5wYWdlLAorLnBkZlByZXNlbnRhdGlvbk1vZGUgLnBkZlZpZXdlci5yZW1vdmVQYWdlQm9yZGVycyAucGFnZSB7CisgIG1hcmdpbi1sZWZ0OiBhdXRvOworICBtYXJnaW4tcmlnaHQ6IGF1dG87Cit9CisKKy5wZGZQcmVzZW50YXRpb25Nb2RlOi1tcy1mdWxsc2NyZWVuIC5wZGZWaWV3ZXIgLnBhZ2UgeworICBtYXJnaW4tYm90dG9tOiAxMDAlICFpbXBvcnRhbnQ7Cit9CisKKy5wZGZQcmVzZW50YXRpb25Nb2RlOi13ZWJraXQtZnVsbC1zY3JlZW4gLnBkZlZpZXdlciAucGFnZSB7CisgIG1hcmdpbi1ib3R0b206IDEwMCU7CisgIGJvcmRlcjogMDsKK30KKworLnBkZlByZXNlbnRhdGlvbk1vZGU6LW1vei1mdWxsLXNjcmVlbiAucGRmVmlld2VyIC5wYWdlIHsKKyAgbWFyZ2luLWJvdHRvbTogMTAwJTsKKyAgYm9yZGVyOiAwOworfQorCisucGRmUHJlc2VudGF0aW9uTW9kZTpmdWxsc2NyZWVuIC5wZGZWaWV3ZXIgLnBhZ2UgeworICBtYXJnaW4tYm90dG9tOiAxMDAlOworICBib3JkZXI6IDA7Cit9CmRpZmYgLS1naXQgYS9lczUvd2ViL3BkZl92aWV3ZXIuanMgYi9lczUvd2ViL3BkZl92aWV3ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2MjY2MgotLS0gL2Rldi9udWxsCisrKyBiL2VzNS93ZWIvcGRmX3ZpZXdlci5qcwpAQCAtMCwwICsxLDc4ODYgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKworKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKKwlpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpCisJCW1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOworCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQorCQlkZWZpbmUoInBkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIiLCBbXSwgZmFjdG9yeSk7CisJZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpCisJCWV4cG9ydHNbInBkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIiXSA9IGZhY3RvcnkoKTsKKwllbHNlCisJCXJvb3RbInBkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIiXSA9IHJvb3QucGRmanNWaWV3ZXIgPSBmYWN0b3J5KCk7Cit9KSh0aGlzLCBmdW5jdGlvbigpIHsKK3JldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwCisvKioqKioqLyAJLy8gVGhlIG1vZHVsZSBjYWNoZQorLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CisvKioqKioqLworLyoqKioqKi8gCS8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uCisvKioqKioqLyAJZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhtb2R1bGVJZCkgeworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCisvKioqKioqLyAJCWlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7CisvKioqKioqLyAJCQlyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0czsKKy8qKioqKiovIAkJfQorLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQorLyoqKioqKi8gCQl2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7CisvKioqKioqLyAJCQlpOiBtb2R1bGVJZCwKKy8qKioqKiovIAkJCWw6IGZhbHNlLAorLyoqKioqKi8gCQkJZXhwb3J0czoge30KKy8qKioqKiovIAkJfTsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgorLyoqKioqKi8gCQltb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKTsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWQKKy8qKioqKiovIAkJbW9kdWxlLmwgPSB0cnVlOworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKKy8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOworLyoqKioqKi8gCX0KKy8qKioqKiovCisvKioqKioqLworLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGUKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzOworLyoqKioqKi8KKy8qKioqKiovIAkvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHsKKy8qKioqKiovIAkJaWYoIV9fd19wZGZqc19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkgeworLyoqKioqKi8gCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7CisvKioqKioqLyAJCX0KKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykgeworLyoqKioqKi8gCQlpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHsKKy8qKioqKiovIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pOworLyoqKioqKi8gCQl9CisvKioqKioqLyAJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0CisvKioqKioqLyAJLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0CisvKioqKioqLyAJLy8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zCisvKioqKioqLyAJLy8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0CisvKioqKioqLyAJLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZQorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7CisvKioqKioqLyAJCWlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18odmFsdWUpOworLyoqKioqKi8gCQlpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlOworLyoqKioqKi8gCQlpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlOworLyoqKioqKi8gCQl2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworLyoqKioqKi8gCQlfX3dfcGRmanNfcmVxdWlyZV9fLnIobnMpOworLyoqKioqKi8gCQlPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7CisvKioqKioqLyAJCWlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd19wZGZqc19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTsKKy8qKioqKiovIAkJcmV0dXJuIG5zOworLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7CisvKioqKioqLyAJCXZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgPworLyoqKioqKi8gCQkJZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDoKKy8qKioqKiovIAkJCWZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07CisvKioqKioqLyAJCV9fd19wZGZqc19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTsKKy8qKioqKiovIAkJcmV0dXJuIGdldHRlcjsKKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07CisvKioqKioqLworLyoqKioqKi8gCS8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5wID0gIiI7CisvKioqKioqLworLyoqKioqKi8KKy8qKioqKiovIAkvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHMKKy8qKioqKiovIAlyZXR1cm4gX193X3BkZmpzX3JlcXVpcmVfXyhfX3dfcGRmanNfcmVxdWlyZV9fLnMgPSAwKTsKKy8qKioqKiovIH0pCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKi8gKFsKKy8qIDAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlci5Bbm5vdGF0aW9uTGF5ZXJCdWlsZGVyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiRGVmYXVsdEFubm90YXRpb25MYXllckZhY3RvcnkiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyLkRlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiRGVmYXVsdFRleHRMYXllckZhY3RvcnkiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdGV4dF9sYXllcl9idWlsZGVyLkRlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiVGV4dExheWVyQnVpbGRlciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF90ZXh0X2xheWVyX2J1aWxkZXIuVGV4dExheWVyQnVpbGRlcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkV2ZW50QnVzIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3VpX3V0aWxzLkV2ZW50QnVzOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiTnVsbEwxMG4iLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfdWlfdXRpbHMuTnVsbEwxMG47CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQcm9ncmVzc0JhciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF91aV91dGlscy5Qcm9ncmVzc0JhcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERkxpbmtTZXJ2aWNlIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3BkZl9saW5rX3NlcnZpY2UuUERGTGlua1NlcnZpY2U7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJTaW1wbGVMaW5rU2VydmljZSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9wZGZfbGlua19zZXJ2aWNlLlNpbXBsZUxpbmtTZXJ2aWNlOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiRG93bmxvYWRNYW5hZ2VyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX2Rvd25sb2FkX21hbmFnZXIuRG93bmxvYWRNYW5hZ2VyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiR2VuZXJpY0wxMG4iLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfZ2VuZXJpY2wxMG4uR2VuZXJpY0wxMG47CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZGaW5kQ29udHJvbGxlciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9wZGZfZmluZF9jb250cm9sbGVyLlBERkZpbmRDb250cm9sbGVyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGSGlzdG9yeSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgcmV0dXJuIF9wZGZfaGlzdG9yeS5QREZIaXN0b3J5OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGUGFnZVZpZXciLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfcGRmX3BhZ2Vfdmlldy5QREZQYWdlVmlldzsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERlNpbmdsZVBhZ2VWaWV3ZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgIHJldHVybiBfcGRmX3NpbmdsZV9wYWdlX3ZpZXdlci5QREZTaW5nbGVQYWdlVmlld2VyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGVmlld2VyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICByZXR1cm4gX3BkZl92aWV3ZXIuUERGVmlld2VyOworICB9Cit9KTsKKwordmFyIF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCit2YXIgX3RleHRfbGF5ZXJfYnVpbGRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOworCit2YXIgX3BkZl9saW5rX3NlcnZpY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOworCit2YXIgX2Rvd25sb2FkX21hbmFnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkpOworCit2YXIgX2dlbmVyaWNsMTBuID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7CisKK3ZhciBfcGRmX2ZpbmRfY29udHJvbGxlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOworCit2YXIgX3BkZl9oaXN0b3J5ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7CisKK3ZhciBfcGRmX3BhZ2VfdmlldyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOworCit2YXIgX3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKKwordmFyIF9wZGZfdmlld2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7CisKK3ZhciBwZGZqc1ZlcnNpb24gPSAnMi42LjM0Nyc7Cit2YXIgcGRmanNCdWlsZCA9ICczYmU5YzY1Zic7CisKKy8qKiovIH0pLAorLyogMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkRlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5ID0gZXhwb3J0cy5Bbm5vdGF0aW9uTGF5ZXJCdWlsZGVyID0gdm9pZCAwOworCit2YXIgX3BkZmpzTGliID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF91aV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CisKK3ZhciBfcGRmX2xpbmtfc2VydmljZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgQW5ub3RhdGlvbkxheWVyQnVpbGRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEFubm90YXRpb25MYXllckJ1aWxkZXIoX3JlZikgeworICAgIHZhciBwYWdlRGl2ID0gX3JlZi5wYWdlRGl2LAorICAgICAgICBwZGZQYWdlID0gX3JlZi5wZGZQYWdlLAorICAgICAgICBsaW5rU2VydmljZSA9IF9yZWYubGlua1NlcnZpY2UsCisgICAgICAgIGRvd25sb2FkTWFuYWdlciA9IF9yZWYuZG93bmxvYWRNYW5hZ2VyLAorICAgICAgICBfcmVmJGFubm90YXRpb25TdG9yYWcgPSBfcmVmLmFubm90YXRpb25TdG9yYWdlLAorICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZSA9IF9yZWYkYW5ub3RhdGlvblN0b3JhZyA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkYW5ub3RhdGlvblN0b3JhZywKKyAgICAgICAgX3JlZiRpbWFnZVJlc291cmNlc1BhID0gX3JlZi5pbWFnZVJlc291cmNlc1BhdGgsCisgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aCA9IF9yZWYkaW1hZ2VSZXNvdXJjZXNQYSA9PT0gdm9pZCAwID8gIiIgOiBfcmVmJGltYWdlUmVzb3VyY2VzUGEsCisgICAgICAgIF9yZWYkcmVuZGVySW50ZXJhY3RpdiA9IF9yZWYucmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IF9yZWYkcmVuZGVySW50ZXJhY3RpdiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkcmVuZGVySW50ZXJhY3RpdiwKKyAgICAgICAgX3JlZiRsMTBuID0gX3JlZi5sMTBuLAorICAgICAgICBsMTBuID0gX3JlZiRsMTBuID09PSB2b2lkIDAgPyBfdWlfdXRpbHMuTnVsbEwxMG4gOiBfcmVmJGwxMG47CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5ub3RhdGlvbkxheWVyQnVpbGRlcik7CisKKyAgICB0aGlzLnBhZ2VEaXYgPSBwYWdlRGl2OworICAgIHRoaXMucGRmUGFnZSA9IHBkZlBhZ2U7CisgICAgdGhpcy5saW5rU2VydmljZSA9IGxpbmtTZXJ2aWNlOworICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gZG93bmxvYWRNYW5hZ2VyOworICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gaW1hZ2VSZXNvdXJjZXNQYXRoOworICAgIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IHJlbmRlckludGVyYWN0aXZlRm9ybXM7CisgICAgdGhpcy5sMTBuID0gbDEwbjsKKyAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlID0gYW5ub3RhdGlvblN0b3JhZ2U7CisgICAgdGhpcy5kaXYgPSBudWxsOworICAgIHRoaXMuX2NhbmNlbGxlZCA9IGZhbHNlOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEFubm90YXRpb25MYXllckJ1aWxkZXIsIFt7CisgICAga2V5OiAicmVuZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHZpZXdwb3J0KSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICB2YXIgaW50ZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAiZGlzcGxheSI7CisgICAgICByZXR1cm4gdGhpcy5wZGZQYWdlLmdldEFubm90YXRpb25zKHsKKyAgICAgICAgaW50ZW50OiBpbnRlbnQKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGFubm90YXRpb25zKSB7CisgICAgICAgIGlmIChfdGhpcy5fY2FuY2VsbGVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwYXJhbWV0ZXJzID0geworICAgICAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydC5jbG9uZSh7CisgICAgICAgICAgICBkb250RmxpcDogdHJ1ZQorICAgICAgICAgIH0pLAorICAgICAgICAgIGRpdjogX3RoaXMuZGl2LAorICAgICAgICAgIGFubm90YXRpb25zOiBhbm5vdGF0aW9ucywKKyAgICAgICAgICBwYWdlOiBfdGhpcy5wZGZQYWdlLAorICAgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogX3RoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoLAorICAgICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IF90aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMsCisgICAgICAgICAgbGlua1NlcnZpY2U6IF90aGlzLmxpbmtTZXJ2aWNlLAorICAgICAgICAgIGRvd25sb2FkTWFuYWdlcjogX3RoaXMuZG93bmxvYWRNYW5hZ2VyLAorICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBfdGhpcy5hbm5vdGF0aW9uU3RvcmFnZQorICAgICAgICB9OworCisgICAgICAgIGlmIChfdGhpcy5kaXYpIHsKKyAgICAgICAgICBfcGRmanNMaWIuQW5ub3RhdGlvbkxheWVyLnVwZGF0ZShwYXJhbWV0ZXJzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfdGhpcy5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgICAgICBfdGhpcy5kaXYuY2xhc3NOYW1lID0gImFubm90YXRpb25MYXllciI7CisKKyAgICAgICAgICBfdGhpcy5wYWdlRGl2LmFwcGVuZENoaWxkKF90aGlzLmRpdik7CisKKyAgICAgICAgICBwYXJhbWV0ZXJzLmRpdiA9IF90aGlzLmRpdjsKKworICAgICAgICAgIF9wZGZqc0xpYi5Bbm5vdGF0aW9uTGF5ZXIucmVuZGVyKHBhcmFtZXRlcnMpOworCisgICAgICAgICAgX3RoaXMubDEwbi50cmFuc2xhdGUoX3RoaXMuZGl2KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2FuY2VsIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsKCkgeworICAgICAgdGhpcy5fY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJoaWRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaGlkZSgpIHsKKyAgICAgIGlmICghdGhpcy5kaXYpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsICJ0cnVlIik7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIEFubm90YXRpb25MYXllckJ1aWxkZXI7Cit9KCk7CisKK2V4cG9ydHMuQW5ub3RhdGlvbkxheWVyQnVpbGRlciA9IEFubm90YXRpb25MYXllckJ1aWxkZXI7CisKK3ZhciBEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5KCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoRGVmYXVsdEFubm90YXRpb25MYXllckZhY3RvcnksIFt7CisgICAga2V5OiAiY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUFubm90YXRpb25MYXllckJ1aWxkZXIocGFnZURpdiwgcGRmUGFnZSkgeworICAgICAgdmFyIGFubm90YXRpb25TdG9yYWdlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsOworICAgICAgdmFyIGltYWdlUmVzb3VyY2VzUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogIiI7CisgICAgICB2YXIgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTsKKyAgICAgIHZhciBsMTBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBfdWlfdXRpbHMuTnVsbEwxMG47CisgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25MYXllckJ1aWxkZXIoeworICAgICAgICBwYWdlRGl2OiBwYWdlRGl2LAorICAgICAgICBwZGZQYWdlOiBwZGZQYWdlLAorICAgICAgICBpbWFnZVJlc291cmNlc1BhdGg6IGltYWdlUmVzb3VyY2VzUGF0aCwKKyAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogcmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgICAgbGlua1NlcnZpY2U6IG5ldyBfcGRmX2xpbmtfc2VydmljZS5TaW1wbGVMaW5rU2VydmljZSgpLAorICAgICAgICBsMTBuOiBsMTBuLAorICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogYW5ub3RhdGlvblN0b3JhZ2UKKyAgICAgIH0pOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeTsKK30oKTsKKworZXhwb3J0cy5EZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSA9IERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OworCisvKioqLyB9KSwKKy8qIDIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK3ZhciBwZGZqc0xpYjsKKworaWYgKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHdpbmRvd1sicGRmanMtZGlzdC9idWlsZC9wZGYiXSkgeworICBwZGZqc0xpYiA9IHdpbmRvd1sicGRmanMtZGlzdC9idWlsZC9wZGYiXTsKK30gZWxzZSB7CisgIHBkZmpzTGliID0gcmVxdWlyZSgiLi4vYnVpbGQvcGRmLmpzIik7Cit9CisKK21vZHVsZS5leHBvcnRzID0gcGRmanNMaWI7CisKKy8qKiovIH0pLAorLyogMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmlzVmFsaWRSb3RhdGlvbiA9IGlzVmFsaWRSb3RhdGlvbjsKK2V4cG9ydHMuaXNWYWxpZFNjcm9sbE1vZGUgPSBpc1ZhbGlkU2Nyb2xsTW9kZTsKK2V4cG9ydHMuaXNWYWxpZFNwcmVhZE1vZGUgPSBpc1ZhbGlkU3ByZWFkTW9kZTsKK2V4cG9ydHMuaXNQb3J0cmFpdE9yaWVudGF0aW9uID0gaXNQb3J0cmFpdE9yaWVudGF0aW9uOworZXhwb3J0cy5jbGFtcCA9IGNsYW1wOworZXhwb3J0cy5nZXRQREZGaWxlTmFtZUZyb21VUkwgPSBnZXRQREZGaWxlTmFtZUZyb21VUkw7CitleHBvcnRzLm5vQ29udGV4dE1lbnVIYW5kbGVyID0gbm9Db250ZXh0TWVudUhhbmRsZXI7CitleHBvcnRzLnBhcnNlUXVlcnlTdHJpbmcgPSBwYXJzZVF1ZXJ5U3RyaW5nOworZXhwb3J0cy5iYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMgPSBiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHM7CitleHBvcnRzLmdldFZpc2libGVFbGVtZW50cyA9IGdldFZpc2libGVFbGVtZW50czsKK2V4cG9ydHMucm91bmRUb0RpdmlkZSA9IHJvdW5kVG9EaXZpZGU7CitleHBvcnRzLmdldFBhZ2VTaXplSW5jaGVzID0gZ2V0UGFnZVNpemVJbmNoZXM7CitleHBvcnRzLmFwcHJveGltYXRlRnJhY3Rpb24gPSBhcHByb3hpbWF0ZUZyYWN0aW9uOworZXhwb3J0cy5nZXRPdXRwdXRTY2FsZSA9IGdldE91dHB1dFNjYWxlOworZXhwb3J0cy5zY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3OworZXhwb3J0cy53YXRjaFNjcm9sbCA9IHdhdGNoU2Nyb2xsOworZXhwb3J0cy5iaW5hcnlTZWFyY2hGaXJzdEl0ZW0gPSBiaW5hcnlTZWFyY2hGaXJzdEl0ZW07CitleHBvcnRzLm5vcm1hbGl6ZVdoZWVsRXZlbnREaXJlY3Rpb24gPSBub3JtYWxpemVXaGVlbEV2ZW50RGlyZWN0aW9uOworZXhwb3J0cy5ub3JtYWxpemVXaGVlbEV2ZW50RGVsdGEgPSBub3JtYWxpemVXaGVlbEV2ZW50RGVsdGE7CitleHBvcnRzLndhaXRPbkV2ZW50T3JUaW1lb3V0ID0gd2FpdE9uRXZlbnRPclRpbWVvdXQ7CitleHBvcnRzLm1vdmVUb0VuZE9mQXJyYXkgPSBtb3ZlVG9FbmRPZkFycmF5OworZXhwb3J0cy5XYWl0T25UeXBlID0gZXhwb3J0cy5hbmltYXRpb25TdGFydGVkID0gZXhwb3J0cy5Qcm9ncmVzc0JhciA9IGV4cG9ydHMuRXZlbnRCdXMgPSBleHBvcnRzLk51bGxMMTBuID0gZXhwb3J0cy5TcHJlYWRNb2RlID0gZXhwb3J0cy5TY3JvbGxNb2RlID0gZXhwb3J0cy5UZXh0TGF5ZXJNb2RlID0gZXhwb3J0cy5SZW5kZXJlclR5cGUgPSBleHBvcnRzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IGV4cG9ydHMuVkVSVElDQUxfUEFERElORyA9IGV4cG9ydHMuU0NST0xMQkFSX1BBRERJTkcgPSBleHBvcnRzLk1BWF9BVVRPX1NDQUxFID0gZXhwb3J0cy5VTktOT1dOX1NDQUxFID0gZXhwb3J0cy5NQVhfU0NBTEUgPSBleHBvcnRzLk1JTl9TQ0FMRSA9IGV4cG9ydHMuREVGQVVMVF9TQ0FMRSA9IGV4cG9ydHMuREVGQVVMVF9TQ0FMRV9WQUxVRSA9IGV4cG9ydHMuQ1NTX1VOSVRTID0gZXhwb3J0cy5BdXRvUHJpbnRSZWdFeHAgPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oNCkpOworCitmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAiZGVmYXVsdCI6IG9iaiB9OyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCitmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH0KKworZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH0KKworZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKworZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pWyJyZXR1cm4iXSAhPSBudWxsKSBfaVsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9CisKK2Z1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfQorCitmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9CisKK2Z1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9CisKK3ZhciBDU1NfVU5JVFMgPSA5Ni4wIC8gNzIuMDsKK2V4cG9ydHMuQ1NTX1VOSVRTID0gQ1NTX1VOSVRTOwordmFyIERFRkFVTFRfU0NBTEVfVkFMVUUgPSAiYXV0byI7CitleHBvcnRzLkRFRkFVTFRfU0NBTEVfVkFMVUUgPSBERUZBVUxUX1NDQUxFX1ZBTFVFOwordmFyIERFRkFVTFRfU0NBTEUgPSAxLjA7CitleHBvcnRzLkRFRkFVTFRfU0NBTEUgPSBERUZBVUxUX1NDQUxFOwordmFyIE1JTl9TQ0FMRSA9IDAuMTsKK2V4cG9ydHMuTUlOX1NDQUxFID0gTUlOX1NDQUxFOwordmFyIE1BWF9TQ0FMRSA9IDEwLjA7CitleHBvcnRzLk1BWF9TQ0FMRSA9IE1BWF9TQ0FMRTsKK3ZhciBVTktOT1dOX1NDQUxFID0gMDsKK2V4cG9ydHMuVU5LTk9XTl9TQ0FMRSA9IFVOS05PV05fU0NBTEU7Cit2YXIgTUFYX0FVVE9fU0NBTEUgPSAxLjI1OworZXhwb3J0cy5NQVhfQVVUT19TQ0FMRSA9IE1BWF9BVVRPX1NDQUxFOwordmFyIFNDUk9MTEJBUl9QQURESU5HID0gNDA7CitleHBvcnRzLlNDUk9MTEJBUl9QQURESU5HID0gU0NST0xMQkFSX1BBRERJTkc7Cit2YXIgVkVSVElDQUxfUEFERElORyA9IDU7CitleHBvcnRzLlZFUlRJQ0FMX1BBRERJTkcgPSBWRVJUSUNBTF9QQURESU5HOwordmFyIFByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IHsKKyAgVU5LTk9XTjogMCwKKyAgTk9STUFMOiAxLAorICBDSEFOR0lORzogMiwKKyAgRlVMTFNDUkVFTjogMworfTsKK2V4cG9ydHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlID0gUHJlc2VudGF0aW9uTW9kZVN0YXRlOwordmFyIFJlbmRlcmVyVHlwZSA9IHsKKyAgQ0FOVkFTOiAiY2FudmFzIiwKKyAgU1ZHOiAic3ZnIgorfTsKK2V4cG9ydHMuUmVuZGVyZXJUeXBlID0gUmVuZGVyZXJUeXBlOwordmFyIFRleHRMYXllck1vZGUgPSB7CisgIERJU0FCTEU6IDAsCisgIEVOQUJMRTogMSwKKyAgRU5BQkxFX0VOSEFOQ0U6IDIKK307CitleHBvcnRzLlRleHRMYXllck1vZGUgPSBUZXh0TGF5ZXJNb2RlOwordmFyIFNjcm9sbE1vZGUgPSB7CisgIFVOS05PV046IC0xLAorICBWRVJUSUNBTDogMCwKKyAgSE9SSVpPTlRBTDogMSwKKyAgV1JBUFBFRDogMgorfTsKK2V4cG9ydHMuU2Nyb2xsTW9kZSA9IFNjcm9sbE1vZGU7Cit2YXIgU3ByZWFkTW9kZSA9IHsKKyAgVU5LTk9XTjogLTEsCisgIE5PTkU6IDAsCisgIE9ERDogMSwKKyAgRVZFTjogMgorfTsKK2V4cG9ydHMuU3ByZWFkTW9kZSA9IFNwcmVhZE1vZGU7Cit2YXIgQXV0b1ByaW50UmVnRXhwID0gL1xicHJpbnRccypcKC87CitleHBvcnRzLkF1dG9QcmludFJlZ0V4cCA9IEF1dG9QcmludFJlZ0V4cDsKKworZnVuY3Rpb24gZm9ybWF0TDEwblZhbHVlKHRleHQsIGFyZ3MpIHsKKyAgaWYgKCFhcmdzKSB7CisgICAgcmV0dXJuIHRleHQ7CisgIH0KKworICByZXR1cm4gdGV4dC5yZXBsYWNlKC9ce1x7XHMqKFx3KylccypcfVx9L2csIGZ1bmN0aW9uIChhbGwsIG5hbWUpIHsKKyAgICByZXR1cm4gbmFtZSBpbiBhcmdzID8gYXJnc1tuYW1lXSA6ICJ7eyIgKyBuYW1lICsgIn19IjsKKyAgfSk7Cit9CisKK3ZhciBOdWxsTDEwbiA9IHsKKyAgZ2V0TGFuZ3VhZ2U6IGZ1bmN0aW9uIGdldExhbmd1YWdlKCkgeworICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKKyAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCAiZW4tdXMiKTsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sIF9jYWxsZWUpOworICAgIH0pKSgpOworICB9LAorICBnZXREaXJlY3Rpb246IGZ1bmN0aW9uIGdldERpcmVjdGlvbigpIHsKKyAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgeworICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgImx0ciIpOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sIF9jYWxsZWUyKTsKKyAgICB9KSkoKTsKKyAgfSwKKyAgZ2V0OiBmdW5jdGlvbiBnZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKSB7CisgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHsKKyAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIGZvcm1hdEwxMG5WYWx1ZShmYWxsYmFjaywgYXJncykpOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sIF9jYWxsZWUzKTsKKyAgICB9KSkoKTsKKyAgfSwKKyAgdHJhbnNsYXRlOiBmdW5jdGlvbiB0cmFuc2xhdGUoZWxlbWVudCkgeworICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoKSB7CisgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sIF9jYWxsZWU0KTsKKyAgICB9KSkoKTsKKyAgfQorfTsKK2V4cG9ydHMuTnVsbEwxMG4gPSBOdWxsTDEwbjsKKworZnVuY3Rpb24gZ2V0T3V0cHV0U2NhbGUoY3R4KSB7CisgIHZhciBkZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTsKKyAgdmFyIGJhY2tpbmdTdG9yZVJhdGlvID0gY3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY3R4Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY3R4Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY3R4LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMTsKKyAgdmFyIHBpeGVsUmF0aW8gPSBkZXZpY2VQaXhlbFJhdGlvIC8gYmFja2luZ1N0b3JlUmF0aW87CisgIHJldHVybiB7CisgICAgc3g6IHBpeGVsUmF0aW8sCisgICAgc3k6IHBpeGVsUmF0aW8sCisgICAgc2NhbGVkOiBwaXhlbFJhdGlvICE9PSAxCisgIH07Cit9CisKK2Z1bmN0aW9uIHNjcm9sbEludG9WaWV3KGVsZW1lbnQsIHNwb3QpIHsKKyAgdmFyIHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTsKKyAgdmFyIHBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OworCisgIGlmICghcGFyZW50KSB7CisgICAgY29uc29sZS5lcnJvcigib2Zmc2V0UGFyZW50IGlzIG5vdCBzZXQgLS0gY2Fubm90IHNjcm9sbCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBvZmZzZXRZID0gZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcDsKKyAgdmFyIG9mZnNldFggPSBlbGVtZW50Lm9mZnNldExlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7CisKKyAgd2hpbGUgKHBhcmVudC5jbGllbnRIZWlnaHQgPT09IHBhcmVudC5zY3JvbGxIZWlnaHQgJiYgcGFyZW50LmNsaWVudFdpZHRoID09PSBwYXJlbnQuc2Nyb2xsV2lkdGggfHwgc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMgJiYgZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpLm92ZXJmbG93ID09PSAiaGlkZGVuIikgeworICAgIGlmIChwYXJlbnQuZGF0YXNldC5fc2NhbGVZKSB7CisgICAgICBvZmZzZXRZIC89IHBhcmVudC5kYXRhc2V0Ll9zY2FsZVk7CisgICAgICBvZmZzZXRYIC89IHBhcmVudC5kYXRhc2V0Ll9zY2FsZVg7CisgICAgfQorCisgICAgb2Zmc2V0WSArPSBwYXJlbnQub2Zmc2V0VG9wOworICAgIG9mZnNldFggKz0gcGFyZW50Lm9mZnNldExlZnQ7CisgICAgcGFyZW50ID0gcGFyZW50Lm9mZnNldFBhcmVudDsKKworICAgIGlmICghcGFyZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaWYgKHNwb3QpIHsKKyAgICBpZiAoc3BvdC50b3AgIT09IHVuZGVmaW5lZCkgeworICAgICAgb2Zmc2V0WSArPSBzcG90LnRvcDsKKyAgICB9CisKKyAgICBpZiAoc3BvdC5sZWZ0ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIG9mZnNldFggKz0gc3BvdC5sZWZ0OworICAgICAgcGFyZW50LnNjcm9sbExlZnQgPSBvZmZzZXRYOworICAgIH0KKyAgfQorCisgIHBhcmVudC5zY3JvbGxUb3AgPSBvZmZzZXRZOworfQorCitmdW5jdGlvbiB3YXRjaFNjcm9sbCh2aWV3QXJlYUVsZW1lbnQsIGNhbGxiYWNrKSB7CisgIHZhciBkZWJvdW5jZVNjcm9sbCA9IGZ1bmN0aW9uIGRlYm91bmNlU2Nyb2xsKGV2dCkgeworICAgIGlmIChyQUYpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIHZpZXdBcmVhRWxlbWVudFNjcm9sbGVkKCkgeworICAgICAgckFGID0gbnVsbDsKKyAgICAgIHZhciBjdXJyZW50WCA9IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxMZWZ0OworICAgICAgdmFyIGxhc3RYID0gc3RhdGUubGFzdFg7CisKKyAgICAgIGlmIChjdXJyZW50WCAhPT0gbGFzdFgpIHsKKyAgICAgICAgc3RhdGUucmlnaHQgPSBjdXJyZW50WCA+IGxhc3RYOworICAgICAgfQorCisgICAgICBzdGF0ZS5sYXN0WCA9IGN1cnJlbnRYOworICAgICAgdmFyIGN1cnJlbnRZID0gdmlld0FyZWFFbGVtZW50LnNjcm9sbFRvcDsKKyAgICAgIHZhciBsYXN0WSA9IHN0YXRlLmxhc3RZOworCisgICAgICBpZiAoY3VycmVudFkgIT09IGxhc3RZKSB7CisgICAgICAgIHN0YXRlLmRvd24gPSBjdXJyZW50WSA+IGxhc3RZOworICAgICAgfQorCisgICAgICBzdGF0ZS5sYXN0WSA9IGN1cnJlbnRZOworICAgICAgY2FsbGJhY2soc3RhdGUpOworICAgIH0pOworICB9OworCisgIHZhciBzdGF0ZSA9IHsKKyAgICByaWdodDogdHJ1ZSwKKyAgICBkb3duOiB0cnVlLAorICAgIGxhc3RYOiB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsTGVmdCwKKyAgICBsYXN0WTogdmlld0FyZWFFbGVtZW50LnNjcm9sbFRvcCwKKyAgICBfZXZlbnRIYW5kbGVyOiBkZWJvdW5jZVNjcm9sbAorICB9OworICB2YXIgckFGID0gbnVsbDsKKyAgdmlld0FyZWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGRlYm91bmNlU2Nyb2xsLCB0cnVlKTsKKyAgcmV0dXJuIHN0YXRlOworfQorCitmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KSB7CisgIHZhciBwYXJ0cyA9IHF1ZXJ5LnNwbGl0KCImIik7CisgIHZhciBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhcnRzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICB2YXIgcGFyYW0gPSBwYXJ0c1tpXS5zcGxpdCgiPSIpOworICAgIHZhciBrZXkgPSBwYXJhbVswXS50b0xvd2VyQ2FzZSgpOworICAgIHZhciB2YWx1ZSA9IHBhcmFtLmxlbmd0aCA+IDEgPyBwYXJhbVsxXSA6IG51bGw7CisgICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChrZXkpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisgIH0KKworICByZXR1cm4gcGFyYW1zOworfQorCitmdW5jdGlvbiBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0oaXRlbXMsIGNvbmRpdGlvbikgeworICB2YXIgbWluSW5kZXggPSAwOworICB2YXIgbWF4SW5kZXggPSBpdGVtcy5sZW5ndGggLSAxOworCisgIGlmIChtYXhJbmRleCA8IDAgfHwgIWNvbmRpdGlvbihpdGVtc1ttYXhJbmRleF0pKSB7CisgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKKyAgfQorCisgIGlmIChjb25kaXRpb24oaXRlbXNbbWluSW5kZXhdKSkgeworICAgIHJldHVybiBtaW5JbmRleDsKKyAgfQorCisgIHdoaWxlIChtaW5JbmRleCA8IG1heEluZGV4KSB7CisgICAgdmFyIGN1cnJlbnRJbmRleCA9IG1pbkluZGV4ICsgbWF4SW5kZXggPj4gMTsKKyAgICB2YXIgY3VycmVudEl0ZW0gPSBpdGVtc1tjdXJyZW50SW5kZXhdOworCisgICAgaWYgKGNvbmRpdGlvbihjdXJyZW50SXRlbSkpIHsKKyAgICAgIG1heEluZGV4ID0gY3VycmVudEluZGV4OworICAgIH0gZWxzZSB7CisgICAgICBtaW5JbmRleCA9IGN1cnJlbnRJbmRleCArIDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG1pbkluZGV4OworfQorCitmdW5jdGlvbiBhcHByb3hpbWF0ZUZyYWN0aW9uKHgpIHsKKyAgaWYgKE1hdGguZmxvb3IoeCkgPT09IHgpIHsKKyAgICByZXR1cm4gW3gsIDFdOworICB9CisKKyAgdmFyIHhpbnYgPSAxIC8geDsKKyAgdmFyIGxpbWl0ID0gODsKKworICBpZiAoeGludiA+IGxpbWl0KSB7CisgICAgcmV0dXJuIFsxLCBsaW1pdF07CisgIH0gZWxzZSBpZiAoTWF0aC5mbG9vcih4aW52KSA9PT0geGludikgeworICAgIHJldHVybiBbMSwgeGludl07CisgIH0KKworICB2YXIgeF8gPSB4ID4gMSA/IHhpbnYgOiB4OworICB2YXIgYSA9IDAsCisgICAgICBiID0gMSwKKyAgICAgIGMgPSAxLAorICAgICAgZCA9IDE7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB2YXIgcCA9IGEgKyBjLAorICAgICAgICBxID0gYiArIGQ7CisKKyAgICBpZiAocSA+IGxpbWl0KSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoeF8gPD0gcCAvIHEpIHsKKyAgICAgIGMgPSBwOworICAgICAgZCA9IHE7CisgICAgfSBlbHNlIHsKKyAgICAgIGEgPSBwOworICAgICAgYiA9IHE7CisgICAgfQorICB9CisKKyAgdmFyIHJlc3VsdDsKKworICBpZiAoeF8gLSBhIC8gYiA8IGMgLyBkIC0geF8pIHsKKyAgICByZXN1bHQgPSB4XyA9PT0geCA/IFthLCBiXSA6IFtiLCBhXTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSB4XyA9PT0geCA/IFtjLCBkXSA6IFtkLCBjXTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Z1bmN0aW9uIHJvdW5kVG9EaXZpZGUoeCwgZGl2KSB7CisgIHZhciByID0geCAlIGRpdjsKKyAgcmV0dXJuIHIgPT09IDAgPyB4IDogTWF0aC5yb3VuZCh4IC0gciArIGRpdik7Cit9CisKK2Z1bmN0aW9uIGdldFBhZ2VTaXplSW5jaGVzKF9yZWYpIHsKKyAgdmFyIHZpZXcgPSBfcmVmLnZpZXcsCisgICAgICB1c2VyVW5pdCA9IF9yZWYudXNlclVuaXQsCisgICAgICByb3RhdGUgPSBfcmVmLnJvdGF0ZTsKKworICB2YXIgX3ZpZXcgPSBfc2xpY2VkVG9BcnJheSh2aWV3LCA0KSwKKyAgICAgIHgxID0gX3ZpZXdbMF0sCisgICAgICB5MSA9IF92aWV3WzFdLAorICAgICAgeDIgPSBfdmlld1syXSwKKyAgICAgIHkyID0gX3ZpZXdbM107CisKKyAgdmFyIGNoYW5nZU9yaWVudGF0aW9uID0gcm90YXRlICUgMTgwICE9PSAwOworICB2YXIgd2lkdGggPSAoeDIgLSB4MSkgLyA3MiAqIHVzZXJVbml0OworICB2YXIgaGVpZ2h0ID0gKHkyIC0geTEpIC8gNzIgKiB1c2VyVW5pdDsKKyAgcmV0dXJuIHsKKyAgICB3aWR0aDogY2hhbmdlT3JpZW50YXRpb24gPyBoZWlnaHQgOiB3aWR0aCwKKyAgICBoZWlnaHQ6IGNoYW5nZU9yaWVudGF0aW9uID8gd2lkdGggOiBoZWlnaHQKKyAgfTsKK30KKworZnVuY3Rpb24gYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzKGluZGV4LCB2aWV3cywgdG9wKSB7CisgIGlmIChpbmRleCA8IDIpIHsKKyAgICByZXR1cm4gaW5kZXg7CisgIH0KKworICB2YXIgZWx0ID0gdmlld3NbaW5kZXhdLmRpdjsKKyAgdmFyIHBhZ2VUb3AgPSBlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcDsKKworICBpZiAocGFnZVRvcCA+PSB0b3ApIHsKKyAgICBlbHQgPSB2aWV3c1tpbmRleCAtIDFdLmRpdjsKKyAgICBwYWdlVG9wID0gZWx0Lm9mZnNldFRvcCArIGVsdC5jbGllbnRUb3A7CisgIH0KKworICBmb3IgKHZhciBpID0gaW5kZXggLSAyOyBpID49IDA7IC0taSkgeworICAgIGVsdCA9IHZpZXdzW2ldLmRpdjsKKworICAgIGlmIChlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcCArIGVsdC5jbGllbnRIZWlnaHQgPD0gcGFnZVRvcCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW5kZXggPSBpOworICB9CisKKyAgcmV0dXJuIGluZGV4OworfQorCitmdW5jdGlvbiBnZXRWaXNpYmxlRWxlbWVudHMoc2Nyb2xsRWwsIHZpZXdzKSB7CisgIHZhciBzb3J0QnlWaXNpYmlsaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTsKKyAgdmFyIGhvcml6b250YWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlOworICB2YXIgdG9wID0gc2Nyb2xsRWwuc2Nyb2xsVG9wLAorICAgICAgYm90dG9tID0gdG9wICsgc2Nyb2xsRWwuY2xpZW50SGVpZ2h0OworICB2YXIgbGVmdCA9IHNjcm9sbEVsLnNjcm9sbExlZnQsCisgICAgICByaWdodCA9IGxlZnQgKyBzY3JvbGxFbC5jbGllbnRXaWR0aDsKKworICBmdW5jdGlvbiBpc0VsZW1lbnRCb3R0b21BZnRlclZpZXdUb3AodmlldykgeworICAgIHZhciBlbGVtZW50ID0gdmlldy5kaXY7CisgICAgdmFyIGVsZW1lbnRCb3R0b20gPSBlbGVtZW50Lm9mZnNldFRvcCArIGVsZW1lbnQuY2xpZW50VG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7CisgICAgcmV0dXJuIGVsZW1lbnRCb3R0b20gPiB0b3A7CisgIH0KKworICBmdW5jdGlvbiBpc0VsZW1lbnRSaWdodEFmdGVyVmlld0xlZnQodmlldykgeworICAgIHZhciBlbGVtZW50ID0gdmlldy5kaXY7CisgICAgdmFyIGVsZW1lbnRSaWdodCA9IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgcmV0dXJuIGVsZW1lbnRSaWdodCA+IGxlZnQ7CisgIH0KKworICB2YXIgdmlzaWJsZSA9IFtdLAorICAgICAgbnVtVmlld3MgPSB2aWV3cy5sZW5ndGg7CisgIHZhciBmaXJzdFZpc2libGVFbGVtZW50SW5kID0gbnVtVmlld3MgPT09IDAgPyAwIDogYmluYXJ5U2VhcmNoRmlyc3RJdGVtKHZpZXdzLCBob3Jpem9udGFsID8gaXNFbGVtZW50UmlnaHRBZnRlclZpZXdMZWZ0IDogaXNFbGVtZW50Qm90dG9tQWZ0ZXJWaWV3VG9wKTsKKworICBpZiAoZmlyc3RWaXNpYmxlRWxlbWVudEluZCA+IDAgJiYgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA8IG51bVZpZXdzICYmICFob3Jpem9udGFsKSB7CisgICAgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA9IGJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cyhmaXJzdFZpc2libGVFbGVtZW50SW5kLCB2aWV3cywgdG9wKTsKKyAgfQorCisgIHZhciBsYXN0RWRnZSA9IGhvcml6b250YWwgPyByaWdodCA6IC0xOworCisgIGZvciAodmFyIGkgPSBmaXJzdFZpc2libGVFbGVtZW50SW5kOyBpIDwgbnVtVmlld3M7IGkrKykgeworICAgIHZhciB2aWV3ID0gdmlld3NbaV0sCisgICAgICAgIGVsZW1lbnQgPSB2aWV3LmRpdjsKKyAgICB2YXIgY3VycmVudFdpZHRoID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0OworICAgIHZhciBjdXJyZW50SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcDsKKyAgICB2YXIgdmlld1dpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aCwKKyAgICAgICAgdmlld0hlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0OworICAgIHZhciB2aWV3UmlnaHQgPSBjdXJyZW50V2lkdGggKyB2aWV3V2lkdGg7CisgICAgdmFyIHZpZXdCb3R0b20gPSBjdXJyZW50SGVpZ2h0ICsgdmlld0hlaWdodDsKKworICAgIGlmIChsYXN0RWRnZSA9PT0gLTEpIHsKKyAgICAgIGlmICh2aWV3Qm90dG9tID49IGJvdHRvbSkgeworICAgICAgICBsYXN0RWRnZSA9IHZpZXdCb3R0b207CisgICAgICB9CisgICAgfSBlbHNlIGlmICgoaG9yaXpvbnRhbCA/IGN1cnJlbnRXaWR0aCA6IGN1cnJlbnRIZWlnaHQpID4gbGFzdEVkZ2UpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh2aWV3Qm90dG9tIDw9IHRvcCB8fCBjdXJyZW50SGVpZ2h0ID49IGJvdHRvbSB8fCB2aWV3UmlnaHQgPD0gbGVmdCB8fCBjdXJyZW50V2lkdGggPj0gcmlnaHQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHZhciBoaWRkZW5IZWlnaHQgPSBNYXRoLm1heCgwLCB0b3AgLSBjdXJyZW50SGVpZ2h0KSArIE1hdGgubWF4KDAsIHZpZXdCb3R0b20gLSBib3R0b20pOworICAgIHZhciBoaWRkZW5XaWR0aCA9IE1hdGgubWF4KDAsIGxlZnQgLSBjdXJyZW50V2lkdGgpICsgTWF0aC5tYXgoMCwgdmlld1JpZ2h0IC0gcmlnaHQpOworICAgIHZhciBwZXJjZW50ID0gKHZpZXdIZWlnaHQgLSBoaWRkZW5IZWlnaHQpICogKHZpZXdXaWR0aCAtIGhpZGRlbldpZHRoKSAqIDEwMCAvIHZpZXdIZWlnaHQgLyB2aWV3V2lkdGggfCAwOworICAgIHZpc2libGUucHVzaCh7CisgICAgICBpZDogdmlldy5pZCwKKyAgICAgIHg6IGN1cnJlbnRXaWR0aCwKKyAgICAgIHk6IGN1cnJlbnRIZWlnaHQsCisgICAgICB2aWV3OiB2aWV3LAorICAgICAgcGVyY2VudDogcGVyY2VudAorICAgIH0pOworICB9CisKKyAgdmFyIGZpcnN0ID0gdmlzaWJsZVswXSwKKyAgICAgIGxhc3QgPSB2aXNpYmxlW3Zpc2libGUubGVuZ3RoIC0gMV07CisKKyAgaWYgKHNvcnRCeVZpc2liaWxpdHkpIHsKKyAgICB2aXNpYmxlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKKyAgICAgIHZhciBwYyA9IGEucGVyY2VudCAtIGIucGVyY2VudDsKKworICAgICAgaWYgKE1hdGguYWJzKHBjKSA+IDAuMDAxKSB7CisgICAgICAgIHJldHVybiAtcGM7CisgICAgICB9CisKKyAgICAgIHJldHVybiBhLmlkIC0gYi5pZDsKKyAgICB9KTsKKyAgfQorCisgIHJldHVybiB7CisgICAgZmlyc3Q6IGZpcnN0LAorICAgIGxhc3Q6IGxhc3QsCisgICAgdmlld3M6IHZpc2libGUKKyAgfTsKK30KKworZnVuY3Rpb24gbm9Db250ZXh0TWVudUhhbmRsZXIoZXZ0KSB7CisgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworfQorCitmdW5jdGlvbiBpc0RhdGFTY2hlbWEodXJsKSB7CisgIHZhciBpID0gMDsKKyAgdmFyIGlpID0gdXJsLmxlbmd0aDsKKworICB3aGlsZSAoaSA8IGlpICYmIHVybFtpXS50cmltKCkgPT09ICIiKSB7CisgICAgaSsrOworICB9CisKKyAgcmV0dXJuIHVybC5zdWJzdHJpbmcoaSwgaSArIDUpLnRvTG93ZXJDYXNlKCkgPT09ICJkYXRhOiI7Cit9CisKK2Z1bmN0aW9uIGdldFBERkZpbGVOYW1lRnJvbVVSTCh1cmwpIHsKKyAgdmFyIGRlZmF1bHRGaWxlbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogImRvY3VtZW50LnBkZiI7CisKKyAgaWYgKHR5cGVvZiB1cmwgIT09ICJzdHJpbmciKSB7CisgICAgcmV0dXJuIGRlZmF1bHRGaWxlbmFtZTsKKyAgfQorCisgIGlmIChpc0RhdGFTY2hlbWEodXJsKSkgeworICAgIGNvbnNvbGUud2FybigiZ2V0UERGRmlsZU5hbWVGcm9tVVJMOiAiICsgJ2lnbm9yaW5nICJkYXRhOiIgVVJMIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLicpOworICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7CisgIH0KKworICB2YXIgcmVVUkkgPSAvXig/Oig/OlteOl0rOik/XC9cL1teXC9dKyk/KFtePyNdKikoXD9bXiNdKik/KCMuKik/JC87CisgIHZhciByZUZpbGVuYW1lID0gL1teXC8/Iz1dK1wucGRmXGIoPyEuKlwucGRmXGIpL2k7CisgIHZhciBzcGxpdFVSSSA9IHJlVVJJLmV4ZWModXJsKTsKKyAgdmFyIHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzFdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMl0pIHx8IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVszXSk7CisKKyAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lKSB7CisgICAgc3VnZ2VzdGVkRmlsZW5hbWUgPSBzdWdnZXN0ZWRGaWxlbmFtZVswXTsKKworICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pbmNsdWRlcygiJSIpKSB7CisgICAgICB0cnkgeworICAgICAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhkZWNvZGVVUklDb21wb25lbnQoc3VnZ2VzdGVkRmlsZW5hbWUpKVswXTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7fQorICAgIH0KKyAgfQorCisgIHJldHVybiBzdWdnZXN0ZWRGaWxlbmFtZSB8fCBkZWZhdWx0RmlsZW5hbWU7Cit9CisKK2Z1bmN0aW9uIG5vcm1hbGl6ZVdoZWVsRXZlbnREaXJlY3Rpb24oZXZ0KSB7CisgIHZhciBkZWx0YSA9IE1hdGguc3FydChldnQuZGVsdGFYICogZXZ0LmRlbHRhWCArIGV2dC5kZWx0YVkgKiBldnQuZGVsdGFZKTsKKyAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihldnQuZGVsdGFZLCBldnQuZGVsdGFYKTsKKworICBpZiAoLTAuMjUgKiBNYXRoLlBJIDwgYW5nbGUgJiYgYW5nbGUgPCAwLjc1ICogTWF0aC5QSSkgeworICAgIGRlbHRhID0gLWRlbHRhOworICB9CisKKyAgcmV0dXJuIGRlbHRhOworfQorCitmdW5jdGlvbiBub3JtYWxpemVXaGVlbEV2ZW50RGVsdGEoZXZ0KSB7CisgIHZhciBkZWx0YSA9IG5vcm1hbGl6ZVdoZWVsRXZlbnREaXJlY3Rpb24oZXZ0KTsKKyAgdmFyIE1PVVNFX0RPTV9ERUxUQV9QSVhFTF9NT0RFID0gMDsKKyAgdmFyIE1PVVNFX0RPTV9ERUxUQV9MSU5FX01PREUgPSAxOworICB2YXIgTU9VU0VfUElYRUxTX1BFUl9MSU5FID0gMzA7CisgIHZhciBNT1VTRV9MSU5FU19QRVJfUEFHRSA9IDMwOworCisgIGlmIChldnQuZGVsdGFNb2RlID09PSBNT1VTRV9ET01fREVMVEFfUElYRUxfTU9ERSkgeworICAgIGRlbHRhIC89IE1PVVNFX1BJWEVMU19QRVJfTElORSAqIE1PVVNFX0xJTkVTX1BFUl9QQUdFOworICB9IGVsc2UgaWYgKGV2dC5kZWx0YU1vZGUgPT09IE1PVVNFX0RPTV9ERUxUQV9MSU5FX01PREUpIHsKKyAgICBkZWx0YSAvPSBNT1VTRV9MSU5FU19QRVJfUEFHRTsKKyAgfQorCisgIHJldHVybiBkZWx0YTsKK30KKworZnVuY3Rpb24gaXNWYWxpZFJvdGF0aW9uKGFuZ2xlKSB7CisgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGFuZ2xlKSAmJiBhbmdsZSAlIDkwID09PSAwOworfQorCitmdW5jdGlvbiBpc1ZhbGlkU2Nyb2xsTW9kZShtb2RlKSB7CisgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG1vZGUpICYmIE9iamVjdC52YWx1ZXMoU2Nyb2xsTW9kZSkuaW5jbHVkZXMobW9kZSkgJiYgbW9kZSAhPT0gU2Nyb2xsTW9kZS5VTktOT1dOOworfQorCitmdW5jdGlvbiBpc1ZhbGlkU3ByZWFkTW9kZShtb2RlKSB7CisgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG1vZGUpICYmIE9iamVjdC52YWx1ZXMoU3ByZWFkTW9kZSkuaW5jbHVkZXMobW9kZSkgJiYgbW9kZSAhPT0gU3ByZWFkTW9kZS5VTktOT1dOOworfQorCitmdW5jdGlvbiBpc1BvcnRyYWl0T3JpZW50YXRpb24oc2l6ZSkgeworICByZXR1cm4gc2l6ZS53aWR0aCA8PSBzaXplLmhlaWdodDsKK30KKwordmFyIFdhaXRPblR5cGUgPSB7CisgIEVWRU5UOiAiZXZlbnQiLAorICBUSU1FT1VUOiAidGltZW91dCIKK307CitleHBvcnRzLldhaXRPblR5cGUgPSBXYWl0T25UeXBlOworCitmdW5jdGlvbiB3YWl0T25FdmVudE9yVGltZW91dChfcmVmMikgeworICB2YXIgdGFyZ2V0ID0gX3JlZjIudGFyZ2V0LAorICAgICAgbmFtZSA9IF9yZWYyLm5hbWUsCisgICAgICBfcmVmMiRkZWxheSA9IF9yZWYyLmRlbGF5LAorICAgICAgZGVsYXkgPSBfcmVmMiRkZWxheSA9PT0gdm9pZCAwID8gMCA6IF9yZWYyJGRlbGF5OworICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgIGlmIChfdHlwZW9mKHRhcmdldCkgIT09ICJvYmplY3QiIHx8ICEobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHx8ICEoTnVtYmVyLmlzSW50ZWdlcihkZWxheSkgJiYgZGVsYXkgPj0gMCkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigid2FpdE9uRXZlbnRPclRpbWVvdXQgLSBpbnZhbGlkIHBhcmFtZXRlcnMuIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gaGFuZGxlcih0eXBlKSB7CisgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRXZlbnRCdXMpIHsKKyAgICAgICAgdGFyZ2V0Ll9vZmYobmFtZSwgZXZlbnRIYW5kbGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50SGFuZGxlcik7CisgICAgICB9CisKKyAgICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTsKKyAgICAgIH0KKworICAgICAgcmVzb2x2ZSh0eXBlKTsKKyAgICB9CisKKyAgICB2YXIgZXZlbnRIYW5kbGVyID0gaGFuZGxlci5iaW5kKG51bGwsIFdhaXRPblR5cGUuRVZFTlQpOworCisgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50QnVzKSB7CisgICAgICB0YXJnZXQuX29uKG5hbWUsIGV2ZW50SGFuZGxlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50SGFuZGxlcik7CisgICAgfQorCisgICAgdmFyIHRpbWVvdXRIYW5kbGVyID0gaGFuZGxlci5iaW5kKG51bGwsIFdhaXRPblR5cGUuVElNRU9VVCk7CisgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCBkZWxheSk7CisgIH0pOworfQorCit2YXIgYW5pbWF0aW9uU3RhcnRlZCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSk7Cit9KTsKK2V4cG9ydHMuYW5pbWF0aW9uU3RhcnRlZCA9IGFuaW1hdGlvblN0YXJ0ZWQ7CisKK2Z1bmN0aW9uIGRpc3BhdGNoRE9NRXZlbnQoZXZlbnROYW1lKSB7CisgIHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsOworICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogZGlzcGF0Y2hET01FdmVudCIpOworfQorCit2YXIgRXZlbnRCdXMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBFdmVudEJ1cyhvcHRpb25zKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50QnVzKTsKKworICAgIHRoaXMuX2xpc3RlbmVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoRXZlbnRCdXMsIFt7CisgICAga2V5OiAib24iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudE5hbWUsIGxpc3RlbmVyKSB7CisgICAgICB0aGlzLl9vbihldmVudE5hbWUsIGxpc3RlbmVyLCB7CisgICAgICAgIGV4dGVybmFsOiB0cnVlCisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvZmYiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoZXZlbnROYW1lLCBsaXN0ZW5lcikgeworICAgICAgdGhpcy5fb2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIsIHsKKyAgICAgICAgZXh0ZXJuYWw6IHRydWUKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImRpc3BhdGNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcGF0Y2goZXZlbnROYW1lKSB7CisgICAgICB2YXIgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTsKKworICAgICAgaWYgKCFldmVudExpc3RlbmVycyB8fCBldmVudExpc3RlbmVycy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgICB2YXIgZXh0ZXJuYWxMaXN0ZW5lcnM7CisgICAgICBldmVudExpc3RlbmVycy5zbGljZSgwKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykgeworICAgICAgICB2YXIgbGlzdGVuZXIgPSBfcmVmMy5saXN0ZW5lciwKKyAgICAgICAgICAgIGV4dGVybmFsID0gX3JlZjMuZXh0ZXJuYWw7CisKKyAgICAgICAgaWYgKGV4dGVybmFsKSB7CisgICAgICAgICAgaWYgKCFleHRlcm5hbExpc3RlbmVycykgeworICAgICAgICAgICAgZXh0ZXJuYWxMaXN0ZW5lcnMgPSBbXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBleHRlcm5hbExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBsaXN0ZW5lci5hcHBseShudWxsLCBhcmdzKTsKKyAgICAgIH0pOworCisgICAgICBpZiAoZXh0ZXJuYWxMaXN0ZW5lcnMpIHsKKyAgICAgICAgZXh0ZXJuYWxMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsKKyAgICAgICAgICBsaXN0ZW5lci5hcHBseShudWxsLCBhcmdzKTsKKyAgICAgICAgfSk7CisgICAgICAgIGV4dGVybmFsTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfb24iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfb24oZXZlbnROYW1lLCBsaXN0ZW5lcikgeworICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7CisgICAgICB2YXIgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTsKKworICAgICAgaWYgKCFldmVudExpc3RlbmVycykgeworICAgICAgICB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXSA9IGV2ZW50TGlzdGVuZXJzID0gW107CisgICAgICB9CisKKyAgICAgIGV2ZW50TGlzdGVuZXJzLnB1c2goeworICAgICAgICBsaXN0ZW5lcjogbGlzdGVuZXIsCisgICAgICAgIGV4dGVybmFsOiAob3B0aW9ucyAmJiBvcHRpb25zLmV4dGVybmFsKSA9PT0gdHJ1ZQorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX29mZiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9vZmYoZXZlbnROYW1lLCBsaXN0ZW5lcikgeworICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7CisgICAgICB2YXIgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTsKKworICAgICAgaWYgKCFldmVudExpc3RlbmVycykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzW2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikgeworICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLnNwbGljZShpLCAxKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gRXZlbnRCdXM7Cit9KCk7CisKK2V4cG9ydHMuRXZlbnRCdXMgPSBFdmVudEJ1czsKKworZnVuY3Rpb24gY2xhbXAodiwgbWluLCBtYXgpIHsKKyAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHYsIG1pbiksIG1heCk7Cit9CisKK3ZhciBQcm9ncmVzc0JhciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFByb2dyZXNzQmFyKGlkKSB7CisgICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSwKKyAgICAgICAgaGVpZ2h0ID0gX3JlZjQuaGVpZ2h0LAorICAgICAgICB3aWR0aCA9IF9yZWY0LndpZHRoLAorICAgICAgICB1bml0cyA9IF9yZWY0LnVuaXRzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb2dyZXNzQmFyKTsKKworICAgIHRoaXMudmlzaWJsZSA9IHRydWU7CisgICAgdGhpcy5kaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkICsgIiAucHJvZ3Jlc3MiKTsKKyAgICB0aGlzLmJhciA9IHRoaXMuZGl2LnBhcmVudE5vZGU7CisgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgfHwgMTAwOworICAgIHRoaXMud2lkdGggPSB3aWR0aCB8fCAxMDA7CisgICAgdGhpcy51bml0cyA9IHVuaXRzIHx8ICIlIjsKKyAgICB0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCArIHRoaXMudW5pdHM7CisgICAgdGhpcy5wZXJjZW50ID0gMDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQcm9ncmVzc0JhciwgW3sKKyAgICBrZXk6ICJfdXBkYXRlQmFyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUJhcigpIHsKKyAgICAgIGlmICh0aGlzLl9pbmRldGVybWluYXRlKSB7CisgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoImluZGV0ZXJtaW5hdGUiKTsKKyAgICAgICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgdGhpcy51bml0czsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QucmVtb3ZlKCJpbmRldGVybWluYXRlIik7CisgICAgICB2YXIgcHJvZ3Jlc3NTaXplID0gdGhpcy53aWR0aCAqIHRoaXMuX3BlcmNlbnQgLyAxMDA7CisgICAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IHByb2dyZXNzU2l6ZSArIHRoaXMudW5pdHM7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0V2lkdGgiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRXaWR0aCh2aWV3ZXIpIHsKKyAgICAgIGlmICghdmlld2VyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGNvbnRhaW5lciA9IHZpZXdlci5wYXJlbnROb2RlOworICAgICAgdmFyIHNjcm9sbGJhcldpZHRoID0gY29udGFpbmVyLm9mZnNldFdpZHRoIC0gdmlld2VyLm9mZnNldFdpZHRoOworCisgICAgICBpZiAoc2Nyb2xsYmFyV2lkdGggPiAwKSB7CisgICAgICAgIHRoaXMuYmFyLnN0eWxlLndpZHRoID0gImNhbGMoMTAwJSAtICIuY29uY2F0KHNjcm9sbGJhcldpZHRoLCAicHgpIik7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaGlkZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGhpZGUoKSB7CisgICAgICBpZiAoIXRoaXMudmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOworICAgICAgdGhpcy5iYXIuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7CisgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImxvYWRpbmdJblByb2dyZXNzIik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2hvdyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coKSB7CisgICAgICBpZiAodGhpcy52aXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKKyAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibG9hZGluZ0luUHJvZ3Jlc3MiKTsKKyAgICAgIHRoaXMuYmFyLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBlcmNlbnQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX3BlcmNlbnQ7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHsKKyAgICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBpc05hTih2YWwpOworICAgICAgdGhpcy5fcGVyY2VudCA9IGNsYW1wKHZhbCwgMCwgMTAwKTsKKworICAgICAgdGhpcy5fdXBkYXRlQmFyKCk7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFByb2dyZXNzQmFyOworfSgpOworCitleHBvcnRzLlByb2dyZXNzQmFyID0gUHJvZ3Jlc3NCYXI7CisKK2Z1bmN0aW9uIG1vdmVUb0VuZE9mQXJyYXkoYXJyLCBjb25kaXRpb24pIHsKKyAgdmFyIG1vdmVkID0gW10sCisgICAgICBsZW4gPSBhcnIubGVuZ3RoOworICB2YXIgd3JpdGUgPSAwOworCisgIGZvciAodmFyIHJlYWQgPSAwOyByZWFkIDwgbGVuOyArK3JlYWQpIHsKKyAgICBpZiAoY29uZGl0aW9uKGFycltyZWFkXSkpIHsKKyAgICAgIG1vdmVkLnB1c2goYXJyW3JlYWRdKTsKKyAgICB9IGVsc2UgeworICAgICAgYXJyW3dyaXRlXSA9IGFycltyZWFkXTsKKyAgICAgICsrd3JpdGU7CisgICAgfQorICB9CisKKyAgZm9yICh2YXIgX3JlYWQgPSAwOyB3cml0ZSA8IGxlbjsgKytfcmVhZCwgKyt3cml0ZSkgeworICAgIGFyclt3cml0ZV0gPSBtb3ZlZFtfcmVhZF07CisgIH0KK30KKworLyoqKi8gfSksCisvKiA0ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCittb2R1bGUuZXhwb3J0cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKKy8qKiovIH0pLAorLyogNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24obW9kdWxlKSB7CisKK2Z1bmN0aW9uIF90eXBlb2Yob2JqKSB7ICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7IGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfQorCit2YXIgcnVudGltZSA9IGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlOworICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7CisgIHZhciB1bmRlZmluZWQ7CisgIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiA/IFN5bWJvbCA6IHt9OworICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIjsKKyAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciI7CisgIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOworCisgIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKKyAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgIGVudW1lcmFibGU6IHRydWUsCisgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICB3cml0YWJsZTogdHJ1ZQorICAgIH0pOworICAgIHJldHVybiBvYmpba2V5XTsKKyAgfQorCisgIHRyeSB7CisgICAgZGVmaW5lKHt9LCAiIik7CisgIH0gY2F0Y2ggKGVycikgeworICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7CisgICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7CisgICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTsKKyAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTsKKyAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CisgICAgcmV0dXJuIGdlbmVyYXRvcjsKKyAgfQorCisgIGV4cG9ydHMud3JhcCA9IHdyYXA7CisKKyAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHR5cGU6ICJub3JtYWwiLAorICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpCisgICAgICB9OworICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdHlwZTogInRocm93IiwKKyAgICAgICAgYXJnOiBlcnIKKyAgICAgIH07CisgICAgfQorICB9CisKKyAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSAic3VzcGVuZGVkU3RhcnQiOworICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9ICJzdXNwZW5kZWRZaWVsZCI7CisgIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9ICJleGVjdXRpbmciOworICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSAiY29tcGxldGVkIjsKKyAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTsKKworICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fQorCisgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KKworICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9CisKKyAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CisKKyAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzOworICB9OworCisgIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKKyAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOworCisgIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJiBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiYgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkgeworICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7CisgIH0KKworICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CisgIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7CisgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247CisgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvckZ1bmN0aW9uIik7CisKKyAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgeworICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsKKyAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgeworICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgeworICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gImZ1bmN0aW9uIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7CisgICAgcmV0dXJuIGN0b3IgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSAiR2VuZXJhdG9yRnVuY3Rpb24iIDogZmFsc2U7CisgIH07CisKKyAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgeworICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHsKKyAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlOworICAgICAgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpOworICAgIH0KKworICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTsKKyAgICByZXR1cm4gZ2VuRnVuOworICB9OworCisgIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIF9fYXdhaXQ6IGFyZworICAgIH07CisgIH07CisKKyAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CisgICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpOworCisgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKKyAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7CisgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKKworICAgICAgICBpZiAodmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09ICJvYmplY3QiICYmIGhhc093bi5jYWxsKHZhbHVlLCAiX19hd2FpdCIpKSB7CisgICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgICAgIGludm9rZSgibmV4dCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOworICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAgICAgIGludm9rZSgidGhyb3ciLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7CisgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkOworICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKKworICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHsKKyAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkgeworICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7CisgICAgfQorCisgICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTsKKyAgfQorCisgIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7CisKKyAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjsKKworICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24gKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkgeworICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7CisgICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOworICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikgPyBpdGVyIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsKKyAgICB9KTsKKyAgfTsKKworICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHsKKyAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0OworICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHsKKyAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHsKKyAgICAgICAgaWYgKG1ldGhvZCA9PT0gInRocm93IikgeworICAgICAgICAgIHRocm93IGFyZzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7CisgICAgICB9CisKKyAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kOworICAgICAgY29udGV4dC5hcmcgPSBhcmc7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7CisKKyAgICAgICAgaWYgKGRlbGVnYXRlKSB7CisgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CisKKyAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAibmV4dCIpIHsKKyAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09ICJ0aHJvdyIpIHsKKyAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7CisgICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gInJldHVybiIpIHsKKyAgICAgICAgICBjb250ZXh0LmFicnVwdCgicmV0dXJuIiwgY29udGV4dC5hcmcpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZzsKKyAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOworCisgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gIm5vcm1hbCIpIHsKKyAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IEdlblN0YXRlQ29tcGxldGVkIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDsKKworICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsCisgICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmUKKyAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CisgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDsKKyAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsKKyAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdOworCisgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKworICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAidGhyb3ciKSB7CisgICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvclsicmV0dXJuIl0pIHsKKyAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iOworICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOworICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOworCisgICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAidGhyb3ciKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpOworICAgICAgfQorCisgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICB9CisKKyAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpOworCisgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CisgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CisgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7CisgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKyAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgIH0KKworICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZzsKKworICAgIGlmICghaW5mbykgeworICAgICAgY29udGV4dC5tZXRob2QgPSAidGhyb3ciOworICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpOworICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7CisgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgICB9CisKKyAgICBpZiAoaW5mby5kb25lKSB7CisgICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTsKKyAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7CisKKyAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gInJldHVybiIpIHsKKyAgICAgICAgY29udGV4dC5tZXRob2QgPSAibmV4dCI7CisgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKKyAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKKyAgfQorCisgIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7CisgIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKTsKKworICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOworICB9OworCisgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CisgICAgdmFyIGVudHJ5ID0geworICAgICAgdHJ5TG9jOiBsb2NzWzBdCisgICAgfTsKKworICAgIGlmICgxIGluIGxvY3MpIHsKKyAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTsKKyAgICB9CisKKyAgICBpZiAoMiBpbiBsb2NzKSB7CisgICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTsKKyAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTsKKyAgICB9CisKKyAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7CisgIH0KKworICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CisgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307CisgICAgcmVjb3JkLnR5cGUgPSAibm9ybWFsIjsKKyAgICBkZWxldGUgcmVjb3JkLmFyZzsKKyAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOworICB9CisKKyAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkgeworICAgIHRoaXMudHJ5RW50cmllcyA9IFt7CisgICAgICB0cnlMb2M6ICJyb290IgorICAgIH1dOworICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTsKKyAgICB0aGlzLnJlc2V0KHRydWUpOworICB9CisKKyAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKG9iamVjdCkgeworICAgIHZhciBrZXlzID0gW107CisKKyAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7CisgICAgICBrZXlzLnB1c2goa2V5KTsKKyAgICB9CisKKyAgICBrZXlzLnJldmVyc2UoKTsKKyAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHsKKyAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkgeworICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKKworICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgeworICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7CisgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7CisgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbmV4dC5kb25lID0gdHJ1ZTsKKyAgICAgIHJldHVybiBuZXh0OworICAgIH07CisgIH07CisKKyAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7CisgICAgaWYgKGl0ZXJhYmxlKSB7CisgICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07CisKKyAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgeworICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gImZ1bmN0aW9uIikgeworICAgICAgICByZXR1cm4gaXRlcmFibGU7CisgICAgICB9CisKKyAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgeworICAgICAgICB2YXIgaSA9IC0xLAorICAgICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7CisgICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkgeworICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgeworICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07CisgICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkOworICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIG5leHQ6IGRvbmVSZXN1bHQKKyAgICB9OworICB9CisKKyAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7CisKKyAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHsKKyAgICByZXR1cm4geworICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgIGRvbmU6IHRydWUKKyAgICB9OworICB9CisKKyAgQ29udGV4dC5wcm90b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6IENvbnRleHQsCisgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsKKyAgICAgIHRoaXMucHJldiA9IDA7CisgICAgICB0aGlzLm5leHQgPSAwOworICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMuZG9uZSA9IGZhbHNlOworICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7CisgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKKyAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkOworICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7CisKKyAgICAgIGlmICghc2tpcFRlbXBSZXNldCkgeworICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHsKKyAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICJ0IiAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7CisgICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKKyAgICAgIHRoaXMuZG9uZSA9IHRydWU7CisgICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdOworICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjsKKworICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMucnZhbDsKKyAgICB9LAorICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHsKKyAgICAgIGlmICh0aGlzLmRvbmUpIHsKKyAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworICAgICAgfQorCisgICAgICB2YXIgY29udGV4dCA9IHRoaXM7CisKKyAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgeworICAgICAgICByZWNvcmQudHlwZSA9ICJ0aHJvdyI7CisgICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247CisgICAgICAgIGNvbnRleHQubmV4dCA9IGxvYzsKKworICAgICAgICBpZiAoY2F1Z2h0KSB7CisgICAgICAgICAgY29udGV4dC5tZXRob2QgPSAibmV4dCI7CisgICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gISFjYXVnaHQ7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOworICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSAicm9vdCIpIHsKKyAgICAgICAgICByZXR1cm4gaGFuZGxlKCJlbmQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7CisgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpOworICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksICJmaW5hbGx5TG9jIik7CisKKyAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CisgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkgeworICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmaW5hbGx5RW50cnkgJiYgKHR5cGUgPT09ICJicmVhayIgfHwgdHlwZSA9PT0gImNvbnRpbnVlIikgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7CisgICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OworICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlOworICAgICAgcmVjb3JkLmFyZyA9IGFyZzsKKworICAgICAgaWYgKGZpbmFsbHlFbnRyeSkgeworICAgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKKyAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7CisgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpOworICAgIH0sCisgICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJlY29yZCwgYWZ0ZXJMb2MpIHsKKyAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICB0aHJvdyByZWNvcmQuYXJnOworICAgICAgfQorCisgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJicmVhayIgfHwgcmVjb3JkLnR5cGUgPT09ICJjb250aW51ZSIpIHsKKyAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZzsKKyAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09ICJyZXR1cm4iKSB7CisgICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZzsKKyAgICAgICAgdGhpcy5tZXRob2QgPSAicmV0dXJuIjsKKyAgICAgICAgdGhpcy5uZXh0ID0gImVuZCI7CisgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAibm9ybWFsIiAmJiBhZnRlckxvYykgeworICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CisgICAgfSwKKyAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgeworICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpOworICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpOworICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKKworICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKKyAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKKworICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gInRocm93IikgeworICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7CisgICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdGhyb3duOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CisgICAgfSwKKyAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7CisgICAgICB0aGlzLmRlbGVnYXRlID0geworICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSwKKyAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKKyAgICAgICAgbmV4dExvYzogbmV4dExvYworICAgICAgfTsKKworICAgICAgaWYgKHRoaXMubWV0aG9kID09PSAibmV4dCIpIHsKKyAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIGV4cG9ydHM7Cit9KCggZmFsc2UgPyB1bmRlZmluZWQgOiBfdHlwZW9mKG1vZHVsZSkpID09PSAib2JqZWN0IiA/IG1vZHVsZS5leHBvcnRzIDoge30pOworCit0cnkgeworICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOworfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKKyAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOworfQorLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKHRoaXMsIF9fd19wZGZqc19yZXF1aXJlX18oNikobW9kdWxlKSkpCisKKy8qKiovIH0pLAorLyogNiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobW9kdWxlKSB7CisgIGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkgeworICAgIG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbiAoKSB7fTsKKworICAgIG1vZHVsZS5wYXRocyA9IFtdOworICAgIGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAibG9hZGVkIiwgeworICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbW9kdWxlLmw7CisgICAgICB9CisgICAgfSk7CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgImlkIiwgeworICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbW9kdWxlLmk7CisgICAgICB9CisgICAgfSk7CisgICAgbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7CisgIH0KKworICByZXR1cm4gbW9kdWxlOworfTsKKworLyoqKi8gfSksCisvKiA3ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuU2ltcGxlTGlua1NlcnZpY2UgPSBleHBvcnRzLlBERkxpbmtTZXJ2aWNlID0gdm9pZCAwOworCit2YXIgX3VpX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgUERGTGlua1NlcnZpY2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZMaW5rU2VydmljZSgpIHsKKyAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sCisgICAgICAgIGV2ZW50QnVzID0gX3JlZi5ldmVudEJ1cywKKyAgICAgICAgX3JlZiRleHRlcm5hbExpbmtUYXJnID0gX3JlZi5leHRlcm5hbExpbmtUYXJnZXQsCisgICAgICAgIGV4dGVybmFsTGlua1RhcmdldCA9IF9yZWYkZXh0ZXJuYWxMaW5rVGFyZyA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkZXh0ZXJuYWxMaW5rVGFyZywKKyAgICAgICAgX3JlZiRleHRlcm5hbExpbmtSZWwgPSBfcmVmLmV4dGVybmFsTGlua1JlbCwKKyAgICAgICAgZXh0ZXJuYWxMaW5rUmVsID0gX3JlZiRleHRlcm5hbExpbmtSZWwgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJGV4dGVybmFsTGlua1JlbCwKKyAgICAgICAgX3JlZiRleHRlcm5hbExpbmtFbmFiID0gX3JlZi5leHRlcm5hbExpbmtFbmFibGVkLAorICAgICAgICBleHRlcm5hbExpbmtFbmFibGVkID0gX3JlZiRleHRlcm5hbExpbmtFbmFiID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRleHRlcm5hbExpbmtFbmFiLAorICAgICAgICBfcmVmJGlnbm9yZURlc3RpbmF0aW8gPSBfcmVmLmlnbm9yZURlc3RpbmF0aW9uWm9vbSwKKyAgICAgICAgaWdub3JlRGVzdGluYXRpb25ab29tID0gX3JlZiRpZ25vcmVEZXN0aW5hdGlvID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkaWdub3JlRGVzdGluYXRpbzsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZMaW5rU2VydmljZSk7CisKKyAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7CisgICAgdGhpcy5leHRlcm5hbExpbmtUYXJnZXQgPSBleHRlcm5hbExpbmtUYXJnZXQ7CisgICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSBleHRlcm5hbExpbmtSZWw7CisgICAgdGhpcy5leHRlcm5hbExpbmtFbmFibGVkID0gZXh0ZXJuYWxMaW5rRW5hYmxlZDsKKyAgICB0aGlzLl9pZ25vcmVEZXN0aW5hdGlvblpvb20gPSBpZ25vcmVEZXN0aW5hdGlvblpvb207CisgICAgdGhpcy5iYXNlVXJsID0gbnVsbDsKKyAgICB0aGlzLnBkZkRvY3VtZW50ID0gbnVsbDsKKyAgICB0aGlzLnBkZlZpZXdlciA9IG51bGw7CisgICAgdGhpcy5wZGZIaXN0b3J5ID0gbnVsbDsKKyAgICB0aGlzLl9wYWdlc1JlZkNhY2hlID0gbnVsbDsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQREZMaW5rU2VydmljZSwgW3sKKyAgICBrZXk6ICJzZXREb2N1bWVudCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldERvY3VtZW50KHBkZkRvY3VtZW50KSB7CisgICAgICB2YXIgYmFzZVVybCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDsKKyAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7CisgICAgICB0aGlzLnBkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7CisgICAgICB0aGlzLl9wYWdlc1JlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRWaWV3ZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWaWV3ZXIocGRmVmlld2VyKSB7CisgICAgICB0aGlzLnBkZlZpZXdlciA9IHBkZlZpZXdlcjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRIaXN0b3J5IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0SGlzdG9yeShwZGZIaXN0b3J5KSB7CisgICAgICB0aGlzLnBkZkhpc3RvcnkgPSBwZGZIaXN0b3J5OworICAgIH0KKyAgfSwgeworICAgIGtleTogIm5hdmlnYXRlVG8iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBuYXZpZ2F0ZVRvKGRlc3QpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHZhciBnb1RvRGVzdGluYXRpb24gPSBmdW5jdGlvbiBnb1RvRGVzdGluYXRpb24oX3JlZjIpIHsKKyAgICAgICAgdmFyIG5hbWVkRGVzdCA9IF9yZWYyLm5hbWVkRGVzdCwKKyAgICAgICAgICAgIGV4cGxpY2l0RGVzdCA9IF9yZWYyLmV4cGxpY2l0RGVzdDsKKyAgICAgICAgdmFyIGRlc3RSZWYgPSBleHBsaWNpdERlc3RbMF07CisgICAgICAgIHZhciBwYWdlTnVtYmVyOworCisgICAgICAgIGlmIChkZXN0UmVmIGluc3RhbmNlb2YgT2JqZWN0KSB7CisgICAgICAgICAgcGFnZU51bWJlciA9IF90aGlzLl9jYWNoZWRQYWdlTnVtYmVyKGRlc3RSZWYpOworCisgICAgICAgICAgaWYgKHBhZ2VOdW1iZXIgPT09IG51bGwpIHsKKyAgICAgICAgICAgIF90aGlzLnBkZkRvY3VtZW50LmdldFBhZ2VJbmRleChkZXN0UmVmKS50aGVuKGZ1bmN0aW9uIChwYWdlSW5kZXgpIHsKKyAgICAgICAgICAgICAgX3RoaXMuY2FjaGVQYWdlUmVmKHBhZ2VJbmRleCArIDEsIGRlc3RSZWYpOworCisgICAgICAgICAgICAgIGdvVG9EZXN0aW5hdGlvbih7CisgICAgICAgICAgICAgICAgbmFtZWREZXN0OiBuYW1lZERlc3QsCisgICAgICAgICAgICAgICAgZXhwbGljaXREZXN0OiBleHBsaWNpdERlc3QKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFwiIi5jb25jYXQoZGVzdFJlZiwgIlwiIGlzIG5vdCAiKSArICJhIHZhbGlkIHBhZ2UgcmVmZXJlbmNlLCBmb3IgZGVzdD1cIiIuY29uY2F0KGRlc3QsICJcIi4iKSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGRlc3RSZWYpKSB7CisgICAgICAgICAgcGFnZU51bWJlciA9IGRlc3RSZWYgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFwiIi5jb25jYXQoZGVzdFJlZiwgIlwiIGlzIG5vdCAiKSArICJhIHZhbGlkIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSwgZm9yIGRlc3Q9XCIiLmNvbmNhdChkZXN0LCAiXCIuIikpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcGFnZU51bWJlciB8fCBwYWdlTnVtYmVyIDwgMSB8fCBwYWdlTnVtYmVyID4gX3RoaXMucGFnZXNDb3VudCkgeworICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFwiIi5jb25jYXQocGFnZU51bWJlciwgIlwiIGlzIG5vdCAiKSArICJhIHZhbGlkIHBhZ2UgbnVtYmVyLCBmb3IgZGVzdD1cIiIuY29uY2F0KGRlc3QsICJcIi4iKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF90aGlzLnBkZkhpc3RvcnkpIHsKKyAgICAgICAgICBfdGhpcy5wZGZIaXN0b3J5LnB1c2hDdXJyZW50UG9zaXRpb24oKTsKKworICAgICAgICAgIF90aGlzLnBkZkhpc3RvcnkucHVzaCh7CisgICAgICAgICAgICBuYW1lZERlc3Q6IG5hbWVkRGVzdCwKKyAgICAgICAgICAgIGV4cGxpY2l0RGVzdDogZXhwbGljaXREZXN0LAorICAgICAgICAgICAgcGFnZU51bWJlcjogcGFnZU51bWJlcgorICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgX3RoaXMucGRmVmlld2VyLnNjcm9sbFBhZ2VJbnRvVmlldyh7CisgICAgICAgICAgcGFnZU51bWJlcjogcGFnZU51bWJlciwKKyAgICAgICAgICBkZXN0QXJyYXk6IGV4cGxpY2l0RGVzdCwKKyAgICAgICAgICBpZ25vcmVEZXN0aW5hdGlvblpvb206IF90aGlzLl9pZ25vcmVEZXN0aW5hdGlvblpvb20KKyAgICAgICAgfSk7CisgICAgICB9OworCisgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gInN0cmluZyIpIHsKKyAgICAgICAgICBfdGhpcy5wZGZEb2N1bWVudC5nZXREZXN0aW5hdGlvbihkZXN0KS50aGVuKGZ1bmN0aW9uIChkZXN0QXJyYXkpIHsKKyAgICAgICAgICAgIHJlc29sdmUoeworICAgICAgICAgICAgICBuYW1lZERlc3Q6IGRlc3QsCisgICAgICAgICAgICAgIGV4cGxpY2l0RGVzdDogZGVzdEFycmF5CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJlc29sdmUoeworICAgICAgICAgIG5hbWVkRGVzdDogIiIsCisgICAgICAgICAgZXhwbGljaXREZXN0OiBkZXN0CisgICAgICAgIH0pOworICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5leHBsaWNpdERlc3QpKSB7CisgICAgICAgICAgY29uc29sZS5lcnJvcigiUERGTGlua1NlcnZpY2UubmF2aWdhdGVUbzogXCIiLmNvbmNhdChkYXRhLmV4cGxpY2l0RGVzdCwgIlwiIGlzIikgKyAiIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIGFycmF5LCBmb3IgZGVzdD1cIiIuY29uY2F0KGRlc3QsICJcIi4iKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ29Ub0Rlc3RpbmF0aW9uKGRhdGEpOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0RGVzdGluYXRpb25IYXNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVzdGluYXRpb25IYXNoKGRlc3QpIHsKKyAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gInN0cmluZyIpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jaG9yVXJsKCIjIiArIGVzY2FwZShkZXN0KSk7CisgICAgICB9CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlc3QpKSB7CisgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShkZXN0KTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jaG9yVXJsKCIjIiArIGVzY2FwZShzdHIpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jaG9yVXJsKCIiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRBbmNob3JVcmwiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbmNob3JVcmwoYW5jaG9yKSB7CisgICAgICByZXR1cm4gKHRoaXMuYmFzZVVybCB8fCAiIikgKyBhbmNob3I7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0SGFzaCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEhhc2goaGFzaCkgeworICAgICAgdmFyIHBhZ2VOdW1iZXIsIGRlc3Q7CisKKyAgICAgIGlmIChoYXNoLmluY2x1ZGVzKCI9IikpIHsKKyAgICAgICAgdmFyIHBhcmFtcyA9ICgwLCBfdWlfdXRpbHMucGFyc2VRdWVyeVN0cmluZykoaGFzaCk7CisKKyAgICAgICAgaWYgKCJzZWFyY2giIGluIHBhcmFtcykgeworICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImZpbmRmcm9tdXJsaGFzaCIsIHsKKyAgICAgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMuc2VhcmNoLnJlcGxhY2UoLyIvZywgIiIpLAorICAgICAgICAgICAgcGhyYXNlU2VhcmNoOiBwYXJhbXMucGhyYXNlID09PSAidHJ1ZSIKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgicGFnZSIgaW4gcGFyYW1zKSB7CisgICAgICAgICAgcGFnZU51bWJlciA9IHBhcmFtcy5wYWdlIHwgMCB8fCAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCJ6b29tIiBpbiBwYXJhbXMpIHsKKyAgICAgICAgICB2YXIgem9vbUFyZ3MgPSBwYXJhbXMuem9vbS5zcGxpdCgiLCIpOworICAgICAgICAgIHZhciB6b29tQXJnID0gem9vbUFyZ3NbMF07CisgICAgICAgICAgdmFyIHpvb21BcmdOdW1iZXIgPSBwYXJzZUZsb2F0KHpvb21BcmcpOworCisgICAgICAgICAgaWYgKCF6b29tQXJnLmluY2x1ZGVzKCJGaXQiKSkgeworICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7CisgICAgICAgICAgICAgIG5hbWU6ICJYWVoiCisgICAgICAgICAgICB9LCB6b29tQXJncy5sZW5ndGggPiAxID8gem9vbUFyZ3NbMV0gfCAwIDogbnVsbCwgem9vbUFyZ3MubGVuZ3RoID4gMiA/IHpvb21BcmdzWzJdIHwgMCA6IG51bGwsIHpvb21BcmdOdW1iZXIgPyB6b29tQXJnTnVtYmVyIC8gMTAwIDogem9vbUFyZ107CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh6b29tQXJnID09PSAiRml0IiB8fCB6b29tQXJnID09PSAiRml0QiIpIHsKKyAgICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7CisgICAgICAgICAgICAgICAgbmFtZTogem9vbUFyZworICAgICAgICAgICAgICB9XTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoem9vbUFyZyA9PT0gIkZpdEgiIHx8IHpvb21BcmcgPT09ICJGaXRCSCIgfHwgem9vbUFyZyA9PT0gIkZpdFYiIHx8IHpvb21BcmcgPT09ICJGaXRCViIpIHsKKyAgICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7CisgICAgICAgICAgICAgICAgbmFtZTogem9vbUFyZworICAgICAgICAgICAgICB9LCB6b29tQXJncy5sZW5ndGggPiAxID8gem9vbUFyZ3NbMV0gfCAwIDogbnVsbF07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHpvb21BcmcgPT09ICJGaXRSIikgeworICAgICAgICAgICAgICBpZiAoem9vbUFyZ3MubGVuZ3RoICE9PSA1KSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUERGTGlua1NlcnZpY2Uuc2V0SGFzaDogTm90IGVub3VnaCBwYXJhbWV0ZXJzIGZvciAiRml0UiIuJyk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7CisgICAgICAgICAgICAgICAgICBuYW1lOiB6b29tQXJnCisgICAgICAgICAgICAgICAgfSwgem9vbUFyZ3NbMV0gfCAwLCB6b29tQXJnc1syXSB8IDAsIHpvb21BcmdzWzNdIHwgMCwgem9vbUFyZ3NbNF0gfCAwXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUERGTGlua1NlcnZpY2Uuc2V0SGFzaDogXCIiLmNvbmNhdCh6b29tQXJnLCAiXCIgaXMgbm90ICIpICsgImEgdmFsaWQgem9vbSB2YWx1ZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdCkgeworICAgICAgICAgIHRoaXMucGRmVmlld2VyLnNjcm9sbFBhZ2VJbnRvVmlldyh7CisgICAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyIHx8IHRoaXMucGFnZSwKKyAgICAgICAgICAgIGRlc3RBcnJheTogZGVzdCwKKyAgICAgICAgICAgIGFsbG93TmVnYXRpdmVPZmZzZXQ6IHRydWUKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIGlmIChwYWdlTnVtYmVyKSB7CisgICAgICAgICAgdGhpcy5wYWdlID0gcGFnZU51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgicGFnZW1vZGUiIGluIHBhcmFtcykgeworICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInBhZ2Vtb2RlIiwgeworICAgICAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICAgICAgbW9kZTogcGFyYW1zLnBhZ2Vtb2RlCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIm5hbWVkZGVzdCIgaW4gcGFyYW1zKSB7CisgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHBhcmFtcy5uYW1lZGRlc3QpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXN0ID0gdW5lc2NhcGUoaGFzaCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBkZXN0ID0gSlNPTi5wYXJzZShkZXN0KTsKKworICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkZXN0KSkgeworICAgICAgICAgICAgZGVzdCA9IGRlc3QudG9TdHJpbmcoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGV4KSB7fQorCisgICAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gInN0cmluZyIgfHwgaXNWYWxpZEV4cGxpY2l0RGVzdGluYXRpb24oZGVzdCkpIHsKKyAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8oZGVzdCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc29sZS5lcnJvcigiUERGTGlua1NlcnZpY2Uuc2V0SGFzaDogXCIiLmNvbmNhdCh1bmVzY2FwZShoYXNoKSwgIlwiIGlzIG5vdCAiKSArICJhIHZhbGlkIGRlc3RpbmF0aW9uLiIpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImV4ZWN1dGVOYW1lZEFjdGlvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pIHsKKyAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgIGNhc2UgIkdvQmFjayI6CisgICAgICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkgeworICAgICAgICAgICAgdGhpcy5wZGZIaXN0b3J5LmJhY2soKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJHb0ZvcndhcmQiOgorICAgICAgICAgIGlmICh0aGlzLnBkZkhpc3RvcnkpIHsKKyAgICAgICAgICAgIHRoaXMucGRmSGlzdG9yeS5mb3J3YXJkKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiTmV4dFBhZ2UiOgorICAgICAgICAgIGlmICh0aGlzLnBhZ2UgPCB0aGlzLnBhZ2VzQ291bnQpIHsKKyAgICAgICAgICAgIHRoaXMucGFnZSsrOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIlByZXZQYWdlIjoKKyAgICAgICAgICBpZiAodGhpcy5wYWdlID4gMSkgeworICAgICAgICAgICAgdGhpcy5wYWdlLS07CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiTGFzdFBhZ2UiOgorICAgICAgICAgIHRoaXMucGFnZSA9IHRoaXMucGFnZXNDb3VudDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJGaXJzdFBhZ2UiOgorICAgICAgICAgIHRoaXMucGFnZSA9IDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgibmFtZWRhY3Rpb24iLCB7CisgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgYWN0aW9uOiBhY3Rpb24KKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNhY2hlUGFnZVJlZiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhY2hlUGFnZVJlZihwYWdlTnVtLCBwYWdlUmVmKSB7CisgICAgICBpZiAoIXBhZ2VSZWYpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcmVmU3RyID0gcGFnZVJlZi5nZW4gPT09IDAgPyAiIi5jb25jYXQocGFnZVJlZi5udW0sICJSIikgOiAiIi5jb25jYXQocGFnZVJlZi5udW0sICJSIikuY29uY2F0KHBhZ2VSZWYuZ2VuKTsKKyAgICAgIHRoaXMuX3BhZ2VzUmVmQ2FjaGVbcmVmU3RyXSA9IHBhZ2VOdW07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2NhY2hlZFBhZ2VOdW1iZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FjaGVkUGFnZU51bWJlcihwYWdlUmVmKSB7CisgICAgICB2YXIgcmVmU3RyID0gcGFnZVJlZi5nZW4gPT09IDAgPyAiIi5jb25jYXQocGFnZVJlZi5udW0sICJSIikgOiAiIi5jb25jYXQocGFnZVJlZi5udW0sICJSIikuY29uY2F0KHBhZ2VSZWYuZ2VuKTsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlc1JlZkNhY2hlICYmIHRoaXMuX3BhZ2VzUmVmQ2FjaGVbcmVmU3RyXSB8fCBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzUGFnZVZpc2libGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5pc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBhZ2VzQ291bnQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLnBkZkRvY3VtZW50Lm51bVBhZ2VzIDogMDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwYWdlIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlcjsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7CisgICAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciA9IHZhbHVlOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJvdGF0aW9uIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5wYWdlc1JvdGF0aW9uOworICAgIH0sCisgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHsKKyAgICAgIHRoaXMucGRmVmlld2VyLnBhZ2VzUm90YXRpb24gPSB2YWx1ZTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGTGlua1NlcnZpY2U7Cit9KCk7CisKK2V4cG9ydHMuUERGTGlua1NlcnZpY2UgPSBQREZMaW5rU2VydmljZTsKKworZnVuY3Rpb24gaXNWYWxpZEV4cGxpY2l0RGVzdGluYXRpb24oZGVzdCkgeworICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2YXIgZGVzdExlbmd0aCA9IGRlc3QubGVuZ3RoOworCisgIGlmIChkZXN0TGVuZ3RoIDwgMikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZhciBwYWdlID0gZGVzdFswXTsKKworICBpZiAoIShfdHlwZW9mKHBhZ2UpID09PSAib2JqZWN0IiAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UubnVtKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UuZ2VuKSkgJiYgIShOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UpICYmIHBhZ2UgPj0gMCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2YXIgem9vbSA9IGRlc3RbMV07CisKKyAgaWYgKCEoX3R5cGVvZih6b29tKSA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIHpvb20ubmFtZSA9PT0gInN0cmluZyIpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmFyIGFsbG93TnVsbCA9IHRydWU7CisKKyAgc3dpdGNoICh6b29tLm5hbWUpIHsKKyAgICBjYXNlICJYWVoiOgorICAgICAgaWYgKGRlc3RMZW5ndGggIT09IDUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgIkZpdCI6CisgICAgY2FzZSAiRml0QiI6CisgICAgICByZXR1cm4gZGVzdExlbmd0aCA9PT0gMjsKKworICAgIGNhc2UgIkZpdEgiOgorICAgIGNhc2UgIkZpdEJIIjoKKyAgICBjYXNlICJGaXRWIjoKKyAgICBjYXNlICJGaXRCViI6CisgICAgICBpZiAoZGVzdExlbmd0aCAhPT0gMykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAiRml0UiI6CisgICAgICBpZiAoZGVzdExlbmd0aCAhPT0gNikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGFsbG93TnVsbCA9IGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZm9yICh2YXIgaSA9IDI7IGkgPCBkZXN0TGVuZ3RoOyBpKyspIHsKKyAgICB2YXIgcGFyYW0gPSBkZXN0W2ldOworCisgICAgaWYgKCEodHlwZW9mIHBhcmFtID09PSAibnVtYmVyIiB8fCBhbGxvd051bGwgJiYgcGFyYW0gPT09IG51bGwpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZhciBTaW1wbGVMaW5rU2VydmljZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFNpbXBsZUxpbmtTZXJ2aWNlKCkgeworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTaW1wbGVMaW5rU2VydmljZSk7CisKKyAgICB0aGlzLmV4dGVybmFsTGlua1RhcmdldCA9IG51bGw7CisgICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSBudWxsOworICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWU7CisgICAgdGhpcy5faWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2U7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoU2ltcGxlTGlua1NlcnZpY2UsIFt7CisgICAga2V5OiAibmF2aWdhdGVUbyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIG5hdmlnYXRlVG8oZGVzdCkge30KKyAgfSwgeworICAgIGtleTogImdldERlc3RpbmF0aW9uSGFzaCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlc3RpbmF0aW9uSGFzaChkZXN0KSB7CisgICAgICByZXR1cm4gIiMiOworICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEFuY2hvclVybCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFuY2hvclVybChoYXNoKSB7CisgICAgICByZXR1cm4gIiMiOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldEhhc2giLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRIYXNoKGhhc2gpIHt9CisgIH0sIHsKKyAgICBrZXk6ICJleGVjdXRlTmFtZWRBY3Rpb24iLAorICAgIHZhbHVlOiBmdW5jdGlvbiBleGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKSB7fQorICB9LCB7CisgICAga2V5OiAiY2FjaGVQYWdlUmVmIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2FjaGVQYWdlUmVmKHBhZ2VOdW0sIHBhZ2VSZWYpIHt9CisgIH0sIHsKKyAgICBrZXk6ICJpc1BhZ2VWaXNpYmxlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwYWdlc0NvdW50IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBhZ2UiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge30KKyAgfSwgeworICAgIGtleTogInJvdGF0aW9uIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0sCisgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHt9CisgIH1dKTsKKworICByZXR1cm4gU2ltcGxlTGlua1NlcnZpY2U7Cit9KCk7CisKK2V4cG9ydHMuU2ltcGxlTGlua1NlcnZpY2UgPSBTaW1wbGVMaW5rU2VydmljZTsKKworLyoqKi8gfSksCisvKiA4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRGVmYXVsdFRleHRMYXllckZhY3RvcnkgPSBleHBvcnRzLlRleHRMYXllckJ1aWxkZXIgPSB2b2lkIDA7CisKK3ZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIEVYUEFORF9ESVZTX1RJTUVPVVQgPSAzMDA7CisKK3ZhciBUZXh0TGF5ZXJCdWlsZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gVGV4dExheWVyQnVpbGRlcihfcmVmKSB7CisgICAgdmFyIHRleHRMYXllckRpdiA9IF9yZWYudGV4dExheWVyRGl2LAorICAgICAgICBldmVudEJ1cyA9IF9yZWYuZXZlbnRCdXMsCisgICAgICAgIHBhZ2VJbmRleCA9IF9yZWYucGFnZUluZGV4LAorICAgICAgICB2aWV3cG9ydCA9IF9yZWYudmlld3BvcnQsCisgICAgICAgIF9yZWYkZmluZENvbnRyb2xsZXIgPSBfcmVmLmZpbmRDb250cm9sbGVyLAorICAgICAgICBmaW5kQ29udHJvbGxlciA9IF9yZWYkZmluZENvbnRyb2xsZXIgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJGZpbmRDb250cm9sbGVyLAorICAgICAgICBfcmVmJGVuaGFuY2VUZXh0U2VsZWMgPSBfcmVmLmVuaGFuY2VUZXh0U2VsZWN0aW9uLAorICAgICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbiA9IF9yZWYkZW5oYW5jZVRleHRTZWxlYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGVuaGFuY2VUZXh0U2VsZWM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dExheWVyQnVpbGRlcik7CisKKyAgICB0aGlzLnRleHRMYXllckRpdiA9IHRleHRMYXllckRpdjsKKyAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7CisgICAgdGhpcy50ZXh0Q29udGVudCA9IG51bGw7CisgICAgdGhpcy50ZXh0Q29udGVudEl0ZW1zU3RyID0gW107CisgICAgdGhpcy50ZXh0Q29udGVudFN0cmVhbSA9IG51bGw7CisgICAgdGhpcy5yZW5kZXJpbmdEb25lID0gZmFsc2U7CisgICAgdGhpcy5wYWdlSWR4ID0gcGFnZUluZGV4OworICAgIHRoaXMucGFnZU51bWJlciA9IHRoaXMucGFnZUlkeCArIDE7CisgICAgdGhpcy5tYXRjaGVzID0gW107CisgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0OworICAgIHRoaXMudGV4dERpdnMgPSBbXTsKKyAgICB0aGlzLmZpbmRDb250cm9sbGVyID0gZmluZENvbnRyb2xsZXI7CisgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrID0gbnVsbDsKKyAgICB0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uID0gZW5oYW5jZVRleHRTZWxlY3Rpb247CisgICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzID0gbnVsbDsKKworICAgIHRoaXMuX2JpbmRNb3VzZSgpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFRleHRMYXllckJ1aWxkZXIsIFt7CisgICAga2V5OiAiX2ZpbmlzaFJlbmRlcmluZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9maW5pc2hSZW5kZXJpbmcoKSB7CisgICAgICB0aGlzLnJlbmRlcmluZ0RvbmUgPSB0cnVlOworCisgICAgICBpZiAoIXRoaXMuZW5oYW5jZVRleHRTZWxlY3Rpb24pIHsKKyAgICAgICAgdmFyIGVuZE9mQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICBlbmRPZkNvbnRlbnQuY2xhc3NOYW1lID0gImVuZE9mQ29udGVudCI7CisgICAgICAgIHRoaXMudGV4dExheWVyRGl2LmFwcGVuZENoaWxkKGVuZE9mQ29udGVudCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInRleHRsYXllcnJlbmRlcmVkIiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIHBhZ2VOdW1iZXI6IHRoaXMucGFnZU51bWJlciwKKyAgICAgICAgbnVtVGV4dERpdnM6IHRoaXMudGV4dERpdnMubGVuZ3RoCisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZW5kZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICB2YXIgdGltZW91dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDsKKworICAgICAgaWYgKCEodGhpcy50ZXh0Q29udGVudCB8fCB0aGlzLnRleHRDb250ZW50U3RyZWFtKSB8fCB0aGlzLnJlbmRlcmluZ0RvbmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmNhbmNlbCgpOworICAgICAgdGhpcy50ZXh0RGl2cyA9IFtdOworICAgICAgdmFyIHRleHRMYXllckZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2sgPSAoMCwgX3BkZmpzTGliLnJlbmRlclRleHRMYXllcikoeworICAgICAgICB0ZXh0Q29udGVudDogdGhpcy50ZXh0Q29udGVudCwKKyAgICAgICAgdGV4dENvbnRlbnRTdHJlYW06IHRoaXMudGV4dENvbnRlbnRTdHJlYW0sCisgICAgICAgIGNvbnRhaW5lcjogdGV4dExheWVyRnJhZywKKyAgICAgICAgdmlld3BvcnQ6IHRoaXMudmlld3BvcnQsCisgICAgICAgIHRleHREaXZzOiB0aGlzLnRleHREaXZzLAorICAgICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyOiB0aGlzLnRleHRDb250ZW50SXRlbXNTdHIsCisgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsCisgICAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiB0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uCisgICAgICB9KTsKKyAgICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBfdGhpcy50ZXh0TGF5ZXJEaXYuYXBwZW5kQ2hpbGQodGV4dExheWVyRnJhZyk7CisKKyAgICAgICAgX3RoaXMuX2ZpbmlzaFJlbmRlcmluZygpOworCisgICAgICAgIF90aGlzLl91cGRhdGVNYXRjaGVzKCk7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7fSk7CisKKyAgICAgIGlmICghdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzKSB7CisgICAgICAgIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyA9IGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgICBpZiAoZXZ0LnBhZ2VJbmRleCA9PT0gX3RoaXMucGFnZUlkeCB8fCBldnQucGFnZUluZGV4ID09PSAtMSkgeworICAgICAgICAgICAgX3RoaXMuX3VwZGF0ZU1hdGNoZXMoKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5fb24oInVwZGF0ZXRleHRsYXllcm1hdGNoZXMiLCB0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImNhbmNlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbmNlbCgpIHsKKyAgICAgIGlmICh0aGlzLnRleHRMYXllclJlbmRlclRhc2spIHsKKyAgICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrLmNhbmNlbCgpOworICAgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2sgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzKSB7CisgICAgICAgIHRoaXMuZXZlbnRCdXMuX29mZigidXBkYXRldGV4dGxheWVybWF0Y2hlcyIsIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyk7CisKKyAgICAgICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZXRUZXh0Q29udGVudFN0cmVhbSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRleHRDb250ZW50U3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7CisgICAgICB0aGlzLmNhbmNlbCgpOworICAgICAgdGhpcy50ZXh0Q29udGVudFN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldFRleHRDb250ZW50IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4dENvbnRlbnQodGV4dENvbnRlbnQpIHsKKyAgICAgIHRoaXMuY2FuY2VsKCk7CisgICAgICB0aGlzLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2NvbnZlcnRNYXRjaGVzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2NvbnZlcnRNYXRjaGVzKG1hdGNoZXMsIG1hdGNoZXNMZW5ndGgpIHsKKyAgICAgIGlmICghbWF0Y2hlcykgeworICAgICAgICByZXR1cm4gW107CisgICAgICB9CisKKyAgICAgIHZhciBmaW5kQ29udHJvbGxlciA9IHRoaXMuZmluZENvbnRyb2xsZXIsCisgICAgICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRoaXMudGV4dENvbnRlbnRJdGVtc1N0cjsKKyAgICAgIHZhciBpID0gMCwKKyAgICAgICAgICBpSW5kZXggPSAwOworICAgICAgdmFyIGVuZCA9IHRleHRDb250ZW50SXRlbXNTdHIubGVuZ3RoIC0gMTsKKyAgICAgIHZhciBxdWVyeUxlbiA9IGZpbmRDb250cm9sbGVyLnN0YXRlLnF1ZXJ5Lmxlbmd0aDsKKyAgICAgIHZhciByZXN1bHQgPSBbXTsKKworICAgICAgZm9yICh2YXIgbSA9IDAsIG1tID0gbWF0Y2hlcy5sZW5ndGg7IG0gPCBtbTsgbSsrKSB7CisgICAgICAgIHZhciBtYXRjaElkeCA9IG1hdGNoZXNbbV07CisKKyAgICAgICAgd2hpbGUgKGkgIT09IGVuZCAmJiBtYXRjaElkeCA+PSBpSW5kZXggKyB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aCkgeworICAgICAgICAgIGlJbmRleCArPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aDsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA9PT0gdGV4dENvbnRlbnRJdGVtc1N0ci5sZW5ndGgpIHsKKyAgICAgICAgICBjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIG1hcHBpbmciKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBtYXRjaCA9IHsKKyAgICAgICAgICBiZWdpbjogeworICAgICAgICAgICAgZGl2SWR4OiBpLAorICAgICAgICAgICAgb2Zmc2V0OiBtYXRjaElkeCAtIGlJbmRleAorICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBpZiAobWF0Y2hlc0xlbmd0aCkgeworICAgICAgICAgIG1hdGNoSWR4ICs9IG1hdGNoZXNMZW5ndGhbbV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWF0Y2hJZHggKz0gcXVlcnlMZW47CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoaSAhPT0gZW5kICYmIG1hdGNoSWR4ID4gaUluZGV4ICsgdGV4dENvbnRlbnRJdGVtc1N0cltpXS5sZW5ndGgpIHsKKyAgICAgICAgICBpSW5kZXggKz0gdGV4dENvbnRlbnRJdGVtc1N0cltpXS5sZW5ndGg7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgbWF0Y2guZW5kID0geworICAgICAgICAgIGRpdklkeDogaSwKKyAgICAgICAgICBvZmZzZXQ6IG1hdGNoSWR4IC0gaUluZGV4CisgICAgICAgIH07CisgICAgICAgIHJlc3VsdC5wdXNoKG1hdGNoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcmVuZGVyTWF0Y2hlcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMpIHsKKyAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBmaW5kQ29udHJvbGxlciA9IHRoaXMuZmluZENvbnRyb2xsZXIsCisgICAgICAgICAgcGFnZUlkeCA9IHRoaXMucGFnZUlkeCwKKyAgICAgICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyID0gdGhpcy50ZXh0Q29udGVudEl0ZW1zU3RyLAorICAgICAgICAgIHRleHREaXZzID0gdGhpcy50ZXh0RGl2czsKKyAgICAgIHZhciBpc1NlbGVjdGVkUGFnZSA9IHBhZ2VJZHggPT09IGZpbmRDb250cm9sbGVyLnNlbGVjdGVkLnBhZ2VJZHg7CisgICAgICB2YXIgc2VsZWN0ZWRNYXRjaElkeCA9IGZpbmRDb250cm9sbGVyLnNlbGVjdGVkLm1hdGNoSWR4OworICAgICAgdmFyIGhpZ2hsaWdodEFsbCA9IGZpbmRDb250cm9sbGVyLnN0YXRlLmhpZ2hsaWdodEFsbDsKKyAgICAgIHZhciBwcmV2RW5kID0gbnVsbDsKKyAgICAgIHZhciBpbmZpbml0eSA9IHsKKyAgICAgICAgZGl2SWR4OiAtMSwKKyAgICAgICAgb2Zmc2V0OiB1bmRlZmluZWQKKyAgICAgIH07CisKKyAgICAgIGZ1bmN0aW9uIGJlZ2luVGV4dChiZWdpbiwgY2xhc3NOYW1lKSB7CisgICAgICAgIHZhciBkaXZJZHggPSBiZWdpbi5kaXZJZHg7CisgICAgICAgIHRleHREaXZzW2RpdklkeF0udGV4dENvbnRlbnQgPSAiIjsKKyAgICAgICAgYXBwZW5kVGV4dFRvRGl2KGRpdklkeCwgMCwgYmVnaW4ub2Zmc2V0LCBjbGFzc05hbWUpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBhcHBlbmRUZXh0VG9EaXYoZGl2SWR4LCBmcm9tT2Zmc2V0LCB0b09mZnNldCwgY2xhc3NOYW1lKSB7CisgICAgICAgIHZhciBkaXYgPSB0ZXh0RGl2c1tkaXZJZHhdOworICAgICAgICB2YXIgY29udGVudCA9IHRleHRDb250ZW50SXRlbXNTdHJbZGl2SWR4XS5zdWJzdHJpbmcoZnJvbU9mZnNldCwgdG9PZmZzZXQpOworICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpOworCisgICAgICAgIGlmIChjbGFzc05hbWUpIHsKKyAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKyAgICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgICAgICBzcGFuLmFwcGVuZENoaWxkKG5vZGUpOworICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChzcGFuKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7CisgICAgICB9CisKKyAgICAgIHZhciBpMCA9IHNlbGVjdGVkTWF0Y2hJZHgsCisgICAgICAgICAgaTEgPSBpMCArIDE7CisKKyAgICAgIGlmIChoaWdobGlnaHRBbGwpIHsKKyAgICAgICAgaTAgPSAwOworICAgICAgICBpMSA9IG1hdGNoZXMubGVuZ3RoOworICAgICAgfSBlbHNlIGlmICghaXNTZWxlY3RlZFBhZ2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0gaTA7IGkgPCBpMTsgaSsrKSB7CisgICAgICAgIHZhciBtYXRjaCA9IG1hdGNoZXNbaV07CisgICAgICAgIHZhciBiZWdpbiA9IG1hdGNoLmJlZ2luOworICAgICAgICB2YXIgZW5kID0gbWF0Y2guZW5kOworICAgICAgICB2YXIgaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWRQYWdlICYmIGkgPT09IHNlbGVjdGVkTWF0Y2hJZHg7CisgICAgICAgIHZhciBoaWdobGlnaHRTdWZmaXggPSBpc1NlbGVjdGVkID8gIiBzZWxlY3RlZCIgOiAiIjsKKworICAgICAgICBpZiAoaXNTZWxlY3RlZCkgeworICAgICAgICAgIGZpbmRDb250cm9sbGVyLnNjcm9sbE1hdGNoSW50b1ZpZXcoeworICAgICAgICAgICAgZWxlbWVudDogdGV4dERpdnNbYmVnaW4uZGl2SWR4XSwKKyAgICAgICAgICAgIHBhZ2VJbmRleDogcGFnZUlkeCwKKyAgICAgICAgICAgIG1hdGNoSW5kZXg6IHNlbGVjdGVkTWF0Y2hJZHgKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcHJldkVuZCB8fCBiZWdpbi5kaXZJZHggIT09IHByZXZFbmQuZGl2SWR4KSB7CisgICAgICAgICAgaWYgKHByZXZFbmQgIT09IG51bGwpIHsKKyAgICAgICAgICAgIGFwcGVuZFRleHRUb0RpdihwcmV2RW5kLmRpdklkeCwgcHJldkVuZC5vZmZzZXQsIGluZmluaXR5Lm9mZnNldCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYmVnaW5UZXh0KGJlZ2luKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhcHBlbmRUZXh0VG9EaXYocHJldkVuZC5kaXZJZHgsIHByZXZFbmQub2Zmc2V0LCBiZWdpbi5vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJlZ2luLmRpdklkeCA9PT0gZW5kLmRpdklkeCkgeworICAgICAgICAgIGFwcGVuZFRleHRUb0RpdihiZWdpbi5kaXZJZHgsIGJlZ2luLm9mZnNldCwgZW5kLm9mZnNldCwgImhpZ2hsaWdodCIgKyBoaWdobGlnaHRTdWZmaXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFwcGVuZFRleHRUb0RpdihiZWdpbi5kaXZJZHgsIGJlZ2luLm9mZnNldCwgaW5maW5pdHkub2Zmc2V0LCAiaGlnaGxpZ2h0IGJlZ2luIiArIGhpZ2hsaWdodFN1ZmZpeCk7CisKKyAgICAgICAgICBmb3IgKHZhciBuMCA9IGJlZ2luLmRpdklkeCArIDEsIG4xID0gZW5kLmRpdklkeDsgbjAgPCBuMTsgbjArKykgeworICAgICAgICAgICAgdGV4dERpdnNbbjBdLmNsYXNzTmFtZSA9ICJoaWdobGlnaHQgbWlkZGxlIiArIGhpZ2hsaWdodFN1ZmZpeDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBiZWdpblRleHQoZW5kLCAiaGlnaGxpZ2h0IGVuZCIgKyBoaWdobGlnaHRTdWZmaXgpOworICAgICAgICB9CisKKyAgICAgICAgcHJldkVuZCA9IGVuZDsKKyAgICAgIH0KKworICAgICAgaWYgKHByZXZFbmQpIHsKKyAgICAgICAgYXBwZW5kVGV4dFRvRGl2KHByZXZFbmQuZGl2SWR4LCBwcmV2RW5kLm9mZnNldCwgaW5maW5pdHkub2Zmc2V0KTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfdXBkYXRlTWF0Y2hlcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVNYXRjaGVzKCkgeworICAgICAgaWYgKCF0aGlzLnJlbmRlcmluZ0RvbmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgZmluZENvbnRyb2xsZXIgPSB0aGlzLmZpbmRDb250cm9sbGVyLAorICAgICAgICAgIG1hdGNoZXMgPSB0aGlzLm1hdGNoZXMsCisgICAgICAgICAgcGFnZUlkeCA9IHRoaXMucGFnZUlkeCwKKyAgICAgICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyID0gdGhpcy50ZXh0Q29udGVudEl0ZW1zU3RyLAorICAgICAgICAgIHRleHREaXZzID0gdGhpcy50ZXh0RGl2czsKKyAgICAgIHZhciBjbGVhcmVkVW50aWxEaXZJZHggPSAtMTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbWF0Y2hlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHZhciBtYXRjaCA9IG1hdGNoZXNbaV07CisgICAgICAgIHZhciBiZWdpbiA9IE1hdGgubWF4KGNsZWFyZWRVbnRpbERpdklkeCwgbWF0Y2guYmVnaW4uZGl2SWR4KTsKKworICAgICAgICBmb3IgKHZhciBuID0gYmVnaW4sIGVuZCA9IG1hdGNoLmVuZC5kaXZJZHg7IG4gPD0gZW5kOyBuKyspIHsKKyAgICAgICAgICB2YXIgZGl2ID0gdGV4dERpdnNbbl07CisgICAgICAgICAgZGl2LnRleHRDb250ZW50ID0gdGV4dENvbnRlbnRJdGVtc1N0cltuXTsKKyAgICAgICAgICBkaXYuY2xhc3NOYW1lID0gIiI7CisgICAgICAgIH0KKworICAgICAgICBjbGVhcmVkVW50aWxEaXZJZHggPSBtYXRjaC5lbmQuZGl2SWR4ICsgMTsKKyAgICAgIH0KKworICAgICAgaWYgKCFmaW5kQ29udHJvbGxlciB8fCAhZmluZENvbnRyb2xsZXIuaGlnaGxpZ2h0TWF0Y2hlcykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBwYWdlTWF0Y2hlcyA9IGZpbmRDb250cm9sbGVyLnBhZ2VNYXRjaGVzW3BhZ2VJZHhdIHx8IG51bGw7CisgICAgICB2YXIgcGFnZU1hdGNoZXNMZW5ndGggPSBmaW5kQ29udHJvbGxlci5wYWdlTWF0Y2hlc0xlbmd0aFtwYWdlSWR4XSB8fCBudWxsOworICAgICAgdGhpcy5tYXRjaGVzID0gdGhpcy5fY29udmVydE1hdGNoZXMocGFnZU1hdGNoZXMsIHBhZ2VNYXRjaGVzTGVuZ3RoKTsKKworICAgICAgdGhpcy5fcmVuZGVyTWF0Y2hlcyh0aGlzLm1hdGNoZXMpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9iaW5kTW91c2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfYmluZE1vdXNlKCkgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHZhciBkaXYgPSB0aGlzLnRleHRMYXllckRpdjsKKyAgICAgIHZhciBleHBhbmREaXZzVGltZXIgPSBudWxsOworICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgaWYgKF90aGlzMi5lbmhhbmNlVGV4dFNlbGVjdGlvbiAmJiBfdGhpczIudGV4dExheWVyUmVuZGVyVGFzaykgeworICAgICAgICAgIF90aGlzMi50ZXh0TGF5ZXJSZW5kZXJUYXNrLmV4cGFuZFRleHREaXZzKHRydWUpOworCisgICAgICAgICAgaWYgKGV4cGFuZERpdnNUaW1lcikgeworICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGV4cGFuZERpdnNUaW1lcik7CisgICAgICAgICAgICBleHBhbmREaXZzVGltZXIgPSBudWxsOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBlbmQgPSBkaXYucXVlcnlTZWxlY3RvcigiLmVuZE9mQ29udGVudCIpOworCisgICAgICAgIGlmICghZW5kKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGFkanVzdFRvcCA9IGV2dC50YXJnZXQgIT09IGRpdjsKKyAgICAgICAgYWRqdXN0VG9wID0gYWRqdXN0VG9wICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVuZCkuZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei11c2VyLXNlbGVjdCIpICE9PSAibm9uZSI7CisKKyAgICAgICAgaWYgKGFkanVzdFRvcCkgeworICAgICAgICAgIHZhciBkaXZCb3VuZHMgPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisgICAgICAgICAgdmFyIHIgPSBNYXRoLm1heCgwLCAoZXZ0LnBhZ2VZIC0gZGl2Qm91bmRzLnRvcCkgLyBkaXZCb3VuZHMuaGVpZ2h0KTsKKyAgICAgICAgICBlbmQuc3R5bGUudG9wID0gKHIgKiAxMDApLnRvRml4ZWQoMikgKyAiJSI7CisgICAgICAgIH0KKworICAgICAgICBlbmQuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIik7CisgICAgICB9KTsKKyAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoX3RoaXMyLmVuaGFuY2VUZXh0U2VsZWN0aW9uICYmIF90aGlzMi50ZXh0TGF5ZXJSZW5kZXJUYXNrKSB7CisgICAgICAgICAgZXhwYW5kRGl2c1RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAoX3RoaXMyLnRleHRMYXllclJlbmRlclRhc2spIHsKKyAgICAgICAgICAgICAgX3RoaXMyLnRleHRMYXllclJlbmRlclRhc2suZXhwYW5kVGV4dERpdnMoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBleHBhbmREaXZzVGltZXIgPSBudWxsOworICAgICAgICAgIH0sIEVYUEFORF9ESVZTX1RJTUVPVVQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBlbmQgPSBkaXYucXVlcnlTZWxlY3RvcigiLmVuZE9mQ29udGVudCIpOworCisgICAgICAgIGlmICghZW5kKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZW5kLnN0eWxlLnRvcCA9ICIiOworICAgICAgICBlbmQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIik7CisgICAgICB9KTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gVGV4dExheWVyQnVpbGRlcjsKK30oKTsKKworZXhwb3J0cy5UZXh0TGF5ZXJCdWlsZGVyID0gVGV4dExheWVyQnVpbGRlcjsKKwordmFyIERlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gRGVmYXVsdFRleHRMYXllckZhY3RvcnkoKSB7CisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5KTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhEZWZhdWx0VGV4dExheWVyRmFjdG9yeSwgW3sKKyAgICBrZXk6ICJjcmVhdGVUZXh0TGF5ZXJCdWlsZGVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlVGV4dExheWVyQnVpbGRlcih0ZXh0TGF5ZXJEaXYsIHBhZ2VJbmRleCwgdmlld3BvcnQpIHsKKyAgICAgIHZhciBlbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7CisgICAgICB2YXIgZXZlbnRCdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCA/IGFyZ3VtZW50c1s0XSA6IHVuZGVmaW5lZDsKKyAgICAgIHJldHVybiBuZXcgVGV4dExheWVyQnVpbGRlcih7CisgICAgICAgIHRleHRMYXllckRpdjogdGV4dExheWVyRGl2LAorICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCwKKyAgICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0LAorICAgICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbjogZW5oYW5jZVRleHRTZWxlY3Rpb24sCisgICAgICAgIGV2ZW50QnVzOiBldmVudEJ1cworICAgICAgfSk7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIERlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5OworfSgpOworCitleHBvcnRzLkRlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5ID0gRGVmYXVsdFRleHRMYXllckZhY3Rvcnk7CisKKy8qKiovIH0pLAorLyogOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkRvd25sb2FkTWFuYWdlciA9IHZvaWQgMDsKKwordmFyIF9wZGZqc0xpYiA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfdmlld2VyX2NvbXBhdGliaWxpdHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKKzsKKworZnVuY3Rpb24gX2Rvd25sb2FkKGJsb2JVcmwsIGZpbGVuYW1lKSB7CisgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOworCisgIGlmICghYS5jbGljaykgeworICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWRNYW5hZ2VyOiAiYS5jbGljaygpIiBpcyBub3Qgc3VwcG9ydGVkLicpOworICB9CisKKyAgYS5ocmVmID0gYmxvYlVybDsKKyAgYS50YXJnZXQgPSAiX3BhcmVudCI7CisKKyAgaWYgKCJkb3dubG9hZCIgaW4gYSkgeworICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTsKKyAgfQorCisgIChkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoYSk7CisgIGEuY2xpY2soKTsKKyAgYS5yZW1vdmUoKTsKK30KKwordmFyIERvd25sb2FkTWFuYWdlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIERvd25sb2FkTWFuYWdlcigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG93bmxvYWRNYW5hZ2VyKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhEb3dubG9hZE1hbmFnZXIsIFt7CisgICAga2V5OiAiZG93bmxvYWRVcmwiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBkb3dubG9hZFVybCh1cmwsIGZpbGVuYW1lKSB7CisgICAgICBpZiAoISgwLCBfcGRmanNMaWIuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodXJsLCAiaHR0cDovL2V4YW1wbGUuY29tIikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBfZG93bmxvYWQodXJsICsgIiNwZGZqcy5hY3Rpb249ZG93bmxvYWQiLCBmaWxlbmFtZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZG93bmxvYWREYXRhIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZG93bmxvYWREYXRhKGRhdGEsIGZpbGVuYW1lLCBjb250ZW50VHlwZSkgeworICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7CisgICAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgICAgIHR5cGU6IGNvbnRlbnRUeXBlCisgICAgICAgIH0pLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGJsb2JVcmwgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZU9iamVjdFVSTCkoZGF0YSwgY29udGVudFR5cGUsIF92aWV3ZXJfY29tcGF0aWJpbGl0eS52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVDcmVhdGVPYmplY3RVUkwpOworCisgICAgICBfZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImRvd25sb2FkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZG93bmxvYWQoYmxvYiwgdXJsLCBmaWxlbmFtZSkgeworICAgICAgdmFyIHNvdXJjZUV2ZW50VHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogImRvd25sb2FkIjsKKworICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7CisgICAgICAgIGlmICghbmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpKSB7CisgICAgICAgICAgdGhpcy5kb3dubG9hZFVybCh1cmwsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKF92aWV3ZXJfY29tcGF0aWJpbGl0eS52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVDcmVhdGVPYmplY3RVUkwpIHsKKyAgICAgICAgdGhpcy5kb3dubG9hZFVybCh1cmwsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CisKKyAgICAgIF9kb3dubG9hZChibG9iVXJsLCBmaWxlbmFtZSk7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIERvd25sb2FkTWFuYWdlcjsKK30oKTsKKworZXhwb3J0cy5Eb3dubG9hZE1hbmFnZXIgPSBEb3dubG9hZE1hbmFnZXI7CisKKy8qKiovIH0pLAorLyogMTAgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zID0gdm9pZCAwOwordmFyIGNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworeworICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gInVuZGVmaW5lZCIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAiIjsKKyAgdmFyIHBsYXRmb3JtID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gInVuZGVmaW5lZCIgJiYgbmF2aWdhdG9yLnBsYXRmb3JtIHx8ICIiOworICB2YXIgbWF4VG91Y2hQb2ludHMgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAidW5kZWZpbmVkIiAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgMTsKKyAgdmFyIGlzQW5kcm9pZCA9IC9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCk7CisgIHZhciBpc0lFID0gL1RyaWRlbnQvLnRlc3QodXNlckFnZW50KTsKKyAgdmFyIGlzSU9TID0gL1xiKGlQYWR8aVBob25lfGlQb2QpKD89OykvLnRlc3QodXNlckFnZW50KSB8fCBwbGF0Zm9ybSA9PT0gIk1hY0ludGVsIiAmJiBtYXhUb3VjaFBvaW50cyA+IDE7CisgIHZhciBpc0lPU0Nocm9tZSA9IC9DcmlPUy8udGVzdCh1c2VyQWdlbnQpOworCisgIChmdW5jdGlvbiBjaGVja09uQmxvYlN1cHBvcnQoKSB7CisgICAgaWYgKGlzSUUgfHwgaXNJT1NDaHJvbWUpIHsKKyAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUNyZWF0ZU9iamVjdFVSTCA9IHRydWU7CisgICAgfQorICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja0NhbnZhc1NpemVMaW1pdGF0aW9uKCkgeworICAgIGlmIChpc0lPUyB8fCBpc0FuZHJvaWQpIHsKKyAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMubWF4Q2FudmFzUGl4ZWxzID0gNTI0Mjg4MDsKKyAgICB9CisgIH0pKCk7Cit9Cit2YXIgdmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcyA9IE9iamVjdC5mcmVlemUoY29tcGF0aWJpbGl0eVBhcmFtcyk7CitleHBvcnRzLnZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMgPSB2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zOworCisvKioqLyB9KSwKKy8qIDExICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuR2VuZXJpY0wxMG4gPSB2b2lkIDA7CisKK3ZhciBfcmVnZW5lcmF0b3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd19wZGZqc19yZXF1aXJlX18oNCkpOworCitfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKKworZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgImRlZmF1bHQiOiBvYmogfTsgfQorCitmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9CisKK2Z1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgd2ViTDEwbiA9IGRvY3VtZW50LndlYkwxMG47CisKK3ZhciBHZW5lcmljTDEwbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEdlbmVyaWNMMTBuKGxhbmcpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgR2VuZXJpY0wxMG4pOworCisgICAgdGhpcy5fbGFuZyA9IGxhbmc7CisgICAgdGhpcy5fcmVhZHkgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICB3ZWJMMTBuLnNldExhbmd1YWdlKGxhbmcsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmVzb2x2ZSh3ZWJMMTBuKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKEdlbmVyaWNMMTBuLCBbeworICAgIGtleTogImdldExhbmd1YWdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9nZXRMYW5ndWFnZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgeworICAgICAgICB2YXIgbDEwbjsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWR5OworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBsMTBuID0gX2NvbnRleHQuc2VudDsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCBsMTBuLmdldExhbmd1YWdlKCkpOworCisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CisgICAgICB9KSk7CisKKyAgICAgIGZ1bmN0aW9uIGdldExhbmd1YWdlKCkgeworICAgICAgICByZXR1cm4gX2dldExhbmd1YWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBnZXRMYW5ndWFnZTsKKyAgICB9KCkKKyAgfSwgeworICAgIGtleTogImdldERpcmVjdGlvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfZ2V0RGlyZWN0aW9uID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbImRlZmF1bHQiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgeworICAgICAgICB2YXIgbDEwbjsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHk7CisKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGwxMG4gPSBfY29udGV4dDIuc2VudDsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgbDEwbi5nZXREaXJlY3Rpb24oKSk7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICBjYXNlICJlbmQiOgorICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpOworICAgICAgfSkpOworCisgICAgICBmdW5jdGlvbiBnZXREaXJlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBfZ2V0RGlyZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBnZXREaXJlY3Rpb247CisgICAgfSgpCisgIH0sIHsKKyAgICBrZXk6ICJnZXQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX2dldCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhwcm9wZXJ0eSwgYXJncywgZmFsbGJhY2spIHsKKyAgICAgICAgdmFyIGwxMG47CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKKyAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWR5OworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBsMTBuID0gX2NvbnRleHQzLnNlbnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIGwxMG4uZ2V0KHByb3BlcnR5LCBhcmdzLCBmYWxsYmFjaykpOworCisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeworICAgICAgICByZXR1cm4gX2dldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gZ2V0OworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAidHJhbnNsYXRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF90cmFuc2xhdGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclsiZGVmYXVsdCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoZWxlbWVudCkgeworICAgICAgICB2YXIgbDEwbjsKKyAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclsiZGVmYXVsdCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkgeworICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHk7CisKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGwxMG4gPSBfY29udGV4dDQuc2VudDsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgicmV0dXJuIiwgbDEwbi50cmFuc2xhdGUoZWxlbWVudCkpOworCisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sIF9jYWxsZWU0LCB0aGlzKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gdHJhbnNsYXRlKF94NCkgeworICAgICAgICByZXR1cm4gX3RyYW5zbGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJhbnNsYXRlOworICAgIH0oKQorICB9XSk7CisKKyAgcmV0dXJuIEdlbmVyaWNMMTBuOworfSgpOworCitleHBvcnRzLkdlbmVyaWNMMTBuID0gR2VuZXJpY0wxMG47CisKKy8qKiovIH0pLAorLyogMTIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK2RvY3VtZW50LndlYkwxMG4gPSBmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7CisgIHZhciBnTDEwbkRhdGEgPSB7fTsKKyAgdmFyIGdUZXh0RGF0YSA9ICcnOworICB2YXIgZ1RleHRQcm9wID0gJ3RleHRDb250ZW50JzsKKyAgdmFyIGdMYW5ndWFnZSA9ICcnOworICB2YXIgZ01hY3JvcyA9IHt9OworICB2YXIgZ1JlYWR5U3RhdGUgPSAnbG9hZGluZyc7CisgIHZhciBnQXN5bmNSZXNvdXJjZUxvYWRpbmcgPSB0cnVlOworCisgIGZ1bmN0aW9uIGdldEwxMG5SZXNvdXJjZUxpbmtzKCkgeworICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3R5cGU9ImFwcGxpY2F0aW9uL2wxMG4iXScpOworICB9CisKKyAgZnVuY3Rpb24gZ2V0TDEwbkRpY3Rpb25hcnkoKSB7CisgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFt0eXBlPSJhcHBsaWNhdGlvbi9sMTBuIl0nKTsKKyAgICByZXR1cm4gc2NyaXB0ID8gSlNPTi5wYXJzZShzY3JpcHQuaW5uZXJIVE1MKSA6IG51bGw7CisgIH0KKworICBmdW5jdGlvbiBnZXRUcmFuc2xhdGFibGVDaGlsZHJlbihlbGVtZW50KSB7CisgICAgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJypbZGF0YS1sMTBuLWlkXScpIDogW107CisgIH0KKworICBmdW5jdGlvbiBnZXRMMTBuQXR0cmlidXRlcyhlbGVtZW50KSB7CisgICAgaWYgKCFlbGVtZW50KSByZXR1cm4ge307CisgICAgdmFyIGwxMG5JZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWwxMG4taWQnKTsKKyAgICB2YXIgbDEwbkFyZ3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1sMTBuLWFyZ3MnKTsKKyAgICB2YXIgYXJncyA9IHt9OworCisgICAgaWYgKGwxMG5BcmdzKSB7CisgICAgICB0cnkgeworICAgICAgICBhcmdzID0gSlNPTi5wYXJzZShsMTBuQXJncyk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGNvbnNvbGUud2FybignY291bGQgbm90IHBhcnNlIGFyZ3VtZW50cyBmb3IgIycgKyBsMTBuSWQpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBpZDogbDEwbklkLAorICAgICAgYXJnczogYXJncworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB4aHJMb2FkVGV4dCh1cmwsIG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7CisgICAgb25TdWNjZXNzID0gb25TdWNjZXNzIHx8IGZ1bmN0aW9uIF9vblN1Y2Nlc3MoZGF0YSkge307CisKKyAgICBvbkZhaWx1cmUgPSBvbkZhaWx1cmUgfHwgZnVuY3Rpb24gX29uRmFpbHVyZSgpIHt9OworCisgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIGdBc3luY1Jlc291cmNlTG9hZGluZyk7CisKKyAgICBpZiAoeGhyLm92ZXJyaWRlTWltZVR5cGUpIHsKKyAgICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Jyk7CisgICAgfQorCisgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0KSB7CisgICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCB8fCB4aHIuc3RhdHVzID09PSAwKSB7CisgICAgICAgICAgb25TdWNjZXNzKHhoci5yZXNwb25zZVRleHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG9uRmFpbHVyZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIHhoci5vbmVycm9yID0gb25GYWlsdXJlOworICAgIHhoci5vbnRpbWVvdXQgPSBvbkZhaWx1cmU7CisKKyAgICB0cnkgeworICAgICAgeGhyLnNlbmQobnVsbCk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgb25GYWlsdXJlKCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VSZXNvdXJjZShocmVmLCBsYW5nLCBzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykgeworICAgIHZhciBiYXNlVVJMID0gaHJlZi5yZXBsYWNlKC9bXlwvXSokLywgJycpIHx8ICcuLyc7CisKKyAgICBmdW5jdGlvbiBldmFsU3RyaW5nKHRleHQpIHsKKyAgICAgIGlmICh0ZXh0Lmxhc3RJbmRleE9mKCdcXCcpIDwgMCkgcmV0dXJuIHRleHQ7CisgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXFxcL2csICdcXCcpLnJlcGxhY2UoL1xcbi9nLCAnXG4nKS5yZXBsYWNlKC9cXHIvZywgJ1xyJykucmVwbGFjZSgvXFx0L2csICdcdCcpLnJlcGxhY2UoL1xcYi9nLCAnXGInKS5yZXBsYWNlKC9cXGYvZywgJ1xmJykucmVwbGFjZSgvXFx7L2csICd7JykucmVwbGFjZSgvXFx9L2csICd9JykucmVwbGFjZSgvXFwiL2csICciJykucmVwbGFjZSgvXFwnL2csICInIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gcGFyc2VQcm9wZXJ0aWVzKHRleHQsIHBhcnNlZFByb3BlcnRpZXNDYWxsYmFjaykgeworICAgICAgdmFyIGRpY3Rpb25hcnkgPSB7fTsKKyAgICAgIHZhciByZUJsYW5rID0gL15ccyp8XHMqJC87CisgICAgICB2YXIgcmVDb21tZW50ID0gL15ccyojfF5ccyokLzsKKyAgICAgIHZhciByZVNlY3Rpb24gPSAvXlxzKlxbKC4qKVxdXHMqJC87CisgICAgICB2YXIgcmVJbXBvcnQgPSAvXlxzKkBpbXBvcnRccyt1cmxcKCguKilcKVxzKiQvaTsKKyAgICAgIHZhciByZVNwbGl0ID0gL14oW149XHNdKilccyo9XHMqKC4rKSQvOworCisgICAgICBmdW5jdGlvbiBwYXJzZVJhd0xpbmVzKHJhd1RleHQsIGV4dGVuZGVkU3ludGF4LCBwYXJzZWRSYXdMaW5lc0NhbGxiYWNrKSB7CisgICAgICAgIHZhciBlbnRyaWVzID0gcmF3VGV4dC5yZXBsYWNlKHJlQmxhbmssICcnKS5zcGxpdCgvW1xyXG5dKy8pOworICAgICAgICB2YXIgY3VycmVudExhbmcgPSAnKic7CisgICAgICAgIHZhciBnZW5lcmljTGFuZyA9IGxhbmcuc3BsaXQoJy0nLCAxKVswXTsKKyAgICAgICAgdmFyIHNraXBMYW5nID0gZmFsc2U7CisgICAgICAgIHZhciBtYXRjaCA9ICcnOworCisgICAgICAgIGZ1bmN0aW9uIG5leHRFbnRyeSgpIHsKKyAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgeworICAgICAgICAgICAgICBwYXJzZWRSYXdMaW5lc0NhbGxiYWNrKCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxpbmUgPSBlbnRyaWVzLnNoaWZ0KCk7CisgICAgICAgICAgICBpZiAocmVDb21tZW50LnRlc3QobGluZSkpIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoZXh0ZW5kZWRTeW50YXgpIHsKKyAgICAgICAgICAgICAgbWF0Y2ggPSByZVNlY3Rpb24uZXhlYyhsaW5lKTsKKworICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50TGFuZyA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgc2tpcExhbmcgPSBjdXJyZW50TGFuZyAhPT0gJyonICYmIGN1cnJlbnRMYW5nICE9PSBsYW5nICYmIGN1cnJlbnRMYW5nICE9PSBnZW5lcmljTGFuZzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChza2lwTGFuZykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbWF0Y2ggPSByZUltcG9ydC5leGVjKGxpbmUpOworCisgICAgICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgICAgIGxvYWRJbXBvcnQoYmFzZVVSTCArIG1hdGNoWzFdLCBuZXh0RW50cnkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdG1wID0gbGluZS5tYXRjaChyZVNwbGl0KTsKKworICAgICAgICAgICAgaWYgKHRtcCAmJiB0bXAubGVuZ3RoID09IDMpIHsKKyAgICAgICAgICAgICAgZGljdGlvbmFyeVt0bXBbMV1dID0gZXZhbFN0cmluZyh0bXBbMl0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5leHRFbnRyeSgpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBsb2FkSW1wb3J0KHVybCwgY2FsbGJhY2spIHsKKyAgICAgICAgeGhyTG9hZFRleHQodXJsLCBmdW5jdGlvbiAoY29udGVudCkgeworICAgICAgICAgIHBhcnNlUmF3TGluZXMoY29udGVudCwgZmFsc2UsIGNhbGxiYWNrKTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgICAgIGNvbnNvbGUud2Fybih1cmwgKyAnIG5vdCBmb3VuZC4nKTsKKyAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcGFyc2VSYXdMaW5lcyh0ZXh0LCB0cnVlLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIHBhcnNlZFByb3BlcnRpZXNDYWxsYmFjayhkaWN0aW9uYXJ5KTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHhockxvYWRUZXh0KGhyZWYsIGZ1bmN0aW9uIChyZXNwb25zZSkgeworICAgICAgZ1RleHREYXRhICs9IHJlc3BvbnNlOworICAgICAgcGFyc2VQcm9wZXJ0aWVzKHJlc3BvbnNlLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgeworICAgICAgICAgIHZhciBpZCwKKyAgICAgICAgICAgICAgcHJvcCwKKyAgICAgICAgICAgICAgaW5kZXggPSBrZXkubGFzdEluZGV4T2YoJy4nKTsKKworICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKKyAgICAgICAgICAgIGlkID0ga2V5LnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICBwcm9wID0ga2V5LnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZCA9IGtleTsKKyAgICAgICAgICAgIHByb3AgPSBnVGV4dFByb3A7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFnTDEwbkRhdGFbaWRdKSB7CisgICAgICAgICAgICBnTDEwbkRhdGFbaWRdID0ge307CisgICAgICAgICAgfQorCisgICAgICAgICAgZ0wxMG5EYXRhW2lkXVtwcm9wXSA9IGRhdGFba2V5XTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzQ2FsbGJhY2spIHsKKyAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSwgZmFpbHVyZUNhbGxiYWNrKTsKKyAgfQorCisgIGZ1bmN0aW9uIGxvYWRMb2NhbGUobGFuZywgY2FsbGJhY2spIHsKKyAgICBpZiAobGFuZykgeworICAgICAgbGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTsKKyAgICB9CisKKyAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uIF9jYWxsYmFjaygpIHt9OworCisgICAgY2xlYXIoKTsKKyAgICBnTGFuZ3VhZ2UgPSBsYW5nOworICAgIHZhciBsYW5nTGlua3MgPSBnZXRMMTBuUmVzb3VyY2VMaW5rcygpOworICAgIHZhciBsYW5nQ291bnQgPSBsYW5nTGlua3MubGVuZ3RoOworCisgICAgaWYgKGxhbmdDb3VudCA9PT0gMCkgeworICAgICAgdmFyIGRpY3QgPSBnZXRMMTBuRGljdGlvbmFyeSgpOworCisgICAgICBpZiAoZGljdCAmJiBkaWN0LmxvY2FsZXMgJiYgZGljdC5kZWZhdWx0X2xvY2FsZSkgeworICAgICAgICBjb25zb2xlLmxvZygndXNpbmcgdGhlIGVtYmVkZGVkIEpTT04gZGlyZWN0b3J5LCBlYXJseSB3YXkgb3V0Jyk7CisgICAgICAgIGdMMTBuRGF0YSA9IGRpY3QubG9jYWxlc1tsYW5nXTsKKworICAgICAgICBpZiAoIWdMMTBuRGF0YSkgeworICAgICAgICAgIHZhciBkZWZhdWx0TG9jYWxlID0gZGljdC5kZWZhdWx0X2xvY2FsZS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgZm9yICh2YXIgYW55Q2FzZUxhbmcgaW4gZGljdC5sb2NhbGVzKSB7CisgICAgICAgICAgICBhbnlDYXNlTGFuZyA9IGFueUNhc2VMYW5nLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgICAgIGlmIChhbnlDYXNlTGFuZyA9PT0gbGFuZykgeworICAgICAgICAgICAgICBnTDEwbkRhdGEgPSBkaWN0LmxvY2FsZXNbbGFuZ107CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChhbnlDYXNlTGFuZyA9PT0gZGVmYXVsdExvY2FsZSkgeworICAgICAgICAgICAgICBnTDEwbkRhdGEgPSBkaWN0LmxvY2FsZXNbZGVmYXVsdExvY2FsZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnNvbGUubG9nKCdubyByZXNvdXJjZSB0byBsb2FkLCBlYXJseSB3YXkgb3V0Jyk7CisgICAgICB9CisKKyAgICAgIGdSZWFkeVN0YXRlID0gJ2NvbXBsZXRlJzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgb25SZXNvdXJjZUxvYWRlZCA9IG51bGw7CisgICAgdmFyIGdSZXNvdXJjZUNvdW50ID0gMDsKKworICAgIG9uUmVzb3VyY2VMb2FkZWQgPSBmdW5jdGlvbiBvblJlc291cmNlTG9hZGVkKCkgeworICAgICAgZ1Jlc291cmNlQ291bnQrKzsKKworICAgICAgaWYgKGdSZXNvdXJjZUNvdW50ID49IGxhbmdDb3VudCkgeworICAgICAgICBjYWxsYmFjaygpOworICAgICAgICBnUmVhZHlTdGF0ZSA9ICdjb21wbGV0ZSc7CisgICAgICB9CisgICAgfTsKKworICAgIGZ1bmN0aW9uIEwxMG5SZXNvdXJjZUxpbmsobGluaykgeworICAgICAgdmFyIGhyZWYgPSBsaW5rLmhyZWY7CisKKyAgICAgIHRoaXMubG9hZCA9IGZ1bmN0aW9uIChsYW5nLCBjYWxsYmFjaykgeworICAgICAgICBwYXJzZVJlc291cmNlKGhyZWYsIGxhbmcsIGNhbGxiYWNrLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgY29uc29sZS53YXJuKGhyZWYgKyAnIG5vdCBmb3VuZC4nKTsKKyAgICAgICAgICBjb25zb2xlLndhcm4oJyInICsgbGFuZyArICciIHJlc291cmNlIG5vdCBmb3VuZCcpOworICAgICAgICAgIGdMYW5ndWFnZSA9ICcnOworICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIH0pOworICAgICAgfTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhbmdDb3VudDsgaSsrKSB7CisgICAgICB2YXIgcmVzb3VyY2UgPSBuZXcgTDEwblJlc291cmNlTGluayhsYW5nTGlua3NbaV0pOworICAgICAgcmVzb3VyY2UubG9hZChsYW5nLCBvblJlc291cmNlTG9hZGVkKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjbGVhcigpIHsKKyAgICBnTDEwbkRhdGEgPSB7fTsKKyAgICBnVGV4dERhdGEgPSAnJzsKKyAgICBnTGFuZ3VhZ2UgPSAnJzsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFBsdXJhbFJ1bGVzKGxhbmcpIHsKKyAgICB2YXIgbG9jYWxlczJydWxlcyA9IHsKKyAgICAgICdhZic6IDMsCisgICAgICAnYWsnOiA0LAorICAgICAgJ2FtJzogNCwKKyAgICAgICdhcic6IDEsCisgICAgICAnYXNhJzogMywKKyAgICAgICdheic6IDAsCisgICAgICAnYmUnOiAxMSwKKyAgICAgICdiZW0nOiAzLAorICAgICAgJ2Jleic6IDMsCisgICAgICAnYmcnOiAzLAorICAgICAgJ2JoJzogNCwKKyAgICAgICdibSc6IDAsCisgICAgICAnYm4nOiAzLAorICAgICAgJ2JvJzogMCwKKyAgICAgICdicic6IDIwLAorICAgICAgJ2JyeCc6IDMsCisgICAgICAnYnMnOiAxMSwKKyAgICAgICdjYSc6IDMsCisgICAgICAnY2dnJzogMywKKyAgICAgICdjaHInOiAzLAorICAgICAgJ2NzJzogMTIsCisgICAgICAnY3knOiAxNywKKyAgICAgICdkYSc6IDMsCisgICAgICAnZGUnOiAzLAorICAgICAgJ2R2JzogMywKKyAgICAgICdkeic6IDAsCisgICAgICAnZWUnOiAzLAorICAgICAgJ2VsJzogMywKKyAgICAgICdlbic6IDMsCisgICAgICAnZW8nOiAzLAorICAgICAgJ2VzJzogMywKKyAgICAgICdldCc6IDMsCisgICAgICAnZXUnOiAzLAorICAgICAgJ2ZhJzogMCwKKyAgICAgICdmZic6IDUsCisgICAgICAnZmknOiAzLAorICAgICAgJ2ZpbCc6IDQsCisgICAgICAnZm8nOiAzLAorICAgICAgJ2ZyJzogNSwKKyAgICAgICdmdXInOiAzLAorICAgICAgJ2Z5JzogMywKKyAgICAgICdnYSc6IDgsCisgICAgICAnZ2QnOiAyNCwKKyAgICAgICdnbCc6IDMsCisgICAgICAnZ3N3JzogMywKKyAgICAgICdndSc6IDMsCisgICAgICAnZ3V3JzogNCwKKyAgICAgICdndic6IDIzLAorICAgICAgJ2hhJzogMywKKyAgICAgICdoYXcnOiAzLAorICAgICAgJ2hlJzogMiwKKyAgICAgICdoaSc6IDQsCisgICAgICAnaHInOiAxMSwKKyAgICAgICdodSc6IDAsCisgICAgICAnaWQnOiAwLAorICAgICAgJ2lnJzogMCwKKyAgICAgICdpaSc6IDAsCisgICAgICAnaXMnOiAzLAorICAgICAgJ2l0JzogMywKKyAgICAgICdpdSc6IDcsCisgICAgICAnamEnOiAwLAorICAgICAgJ2ptYyc6IDMsCisgICAgICAnanYnOiAwLAorICAgICAgJ2thJzogMCwKKyAgICAgICdrYWInOiA1LAorICAgICAgJ2thaic6IDMsCisgICAgICAna2NnJzogMywKKyAgICAgICdrZGUnOiAwLAorICAgICAgJ2tlYSc6IDAsCisgICAgICAna2snOiAzLAorICAgICAgJ2tsJzogMywKKyAgICAgICdrbSc6IDAsCisgICAgICAna24nOiAwLAorICAgICAgJ2tvJzogMCwKKyAgICAgICdrc2InOiAzLAorICAgICAgJ2tzaCc6IDIxLAorICAgICAgJ2t1JzogMywKKyAgICAgICdrdyc6IDcsCisgICAgICAnbGFnJzogMTgsCisgICAgICAnbGInOiAzLAorICAgICAgJ2xnJzogMywKKyAgICAgICdsbic6IDQsCisgICAgICAnbG8nOiAwLAorICAgICAgJ2x0JzogMTAsCisgICAgICAnbHYnOiA2LAorICAgICAgJ21hcyc6IDMsCisgICAgICAnbWcnOiA0LAorICAgICAgJ21rJzogMTYsCisgICAgICAnbWwnOiAzLAorICAgICAgJ21uJzogMywKKyAgICAgICdtbyc6IDksCisgICAgICAnbXInOiAzLAorICAgICAgJ21zJzogMCwKKyAgICAgICdtdCc6IDE1LAorICAgICAgJ215JzogMCwKKyAgICAgICduYWgnOiAzLAorICAgICAgJ25hcSc6IDcsCisgICAgICAnbmInOiAzLAorICAgICAgJ25kJzogMywKKyAgICAgICduZSc6IDMsCisgICAgICAnbmwnOiAzLAorICAgICAgJ25uJzogMywKKyAgICAgICdubyc6IDMsCisgICAgICAnbnInOiAzLAorICAgICAgJ25zbyc6IDQsCisgICAgICAnbnknOiAzLAorICAgICAgJ255bic6IDMsCisgICAgICAnb20nOiAzLAorICAgICAgJ29yJzogMywKKyAgICAgICdwYSc6IDMsCisgICAgICAncGFwJzogMywKKyAgICAgICdwbCc6IDEzLAorICAgICAgJ3BzJzogMywKKyAgICAgICdwdCc6IDMsCisgICAgICAncm0nOiAzLAorICAgICAgJ3JvJzogOSwKKyAgICAgICdyb2YnOiAzLAorICAgICAgJ3J1JzogMTEsCisgICAgICAncndrJzogMywKKyAgICAgICdzYWgnOiAwLAorICAgICAgJ3NhcSc6IDMsCisgICAgICAnc2UnOiA3LAorICAgICAgJ3NlaCc6IDMsCisgICAgICAnc2VzJzogMCwKKyAgICAgICdzZyc6IDAsCisgICAgICAnc2gnOiAxMSwKKyAgICAgICdzaGknOiAxOSwKKyAgICAgICdzayc6IDEyLAorICAgICAgJ3NsJzogMTQsCisgICAgICAnc21hJzogNywKKyAgICAgICdzbWknOiA3LAorICAgICAgJ3Ntaic6IDcsCisgICAgICAnc21uJzogNywKKyAgICAgICdzbXMnOiA3LAorICAgICAgJ3NuJzogMywKKyAgICAgICdzbyc6IDMsCisgICAgICAnc3EnOiAzLAorICAgICAgJ3NyJzogMTEsCisgICAgICAnc3MnOiAzLAorICAgICAgJ3NzeSc6IDMsCisgICAgICAnc3QnOiAzLAorICAgICAgJ3N2JzogMywKKyAgICAgICdzdyc6IDMsCisgICAgICAnc3lyJzogMywKKyAgICAgICd0YSc6IDMsCisgICAgICAndGUnOiAzLAorICAgICAgJ3Rlbyc6IDMsCisgICAgICAndGgnOiAwLAorICAgICAgJ3RpJzogNCwKKyAgICAgICd0aWcnOiAzLAorICAgICAgJ3RrJzogMywKKyAgICAgICd0bCc6IDQsCisgICAgICAndG4nOiAzLAorICAgICAgJ3RvJzogMCwKKyAgICAgICd0cic6IDAsCisgICAgICAndHMnOiAzLAorICAgICAgJ3R6bSc6IDIyLAorICAgICAgJ3VrJzogMTEsCisgICAgICAndXInOiAzLAorICAgICAgJ3ZlJzogMywKKyAgICAgICd2aSc6IDAsCisgICAgICAndnVuJzogMywKKyAgICAgICd3YSc6IDQsCisgICAgICAnd2FlJzogMywKKyAgICAgICd3byc6IDAsCisgICAgICAneGgnOiAzLAorICAgICAgJ3hvZyc6IDMsCisgICAgICAneW8nOiAwLAorICAgICAgJ3poJzogMCwKKyAgICAgICd6dSc6IDMKKyAgICB9OworCisgICAgZnVuY3Rpb24gaXNJbihuLCBsaXN0KSB7CisgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKG4pICE9PSAtMTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBpc0JldHdlZW4obiwgc3RhcnQsIGVuZCkgeworICAgICAgcmV0dXJuIHN0YXJ0IDw9IG4gJiYgbiA8PSBlbmQ7CisgICAgfQorCisgICAgdmFyIHBsdXJhbFJ1bGVzID0geworICAgICAgJzAnOiBmdW5jdGlvbiBfKG4pIHsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzEnOiBmdW5jdGlvbiBfKG4pIHsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuICUgMTAwLCAzLCAxMCkpIHJldHVybiAnZmV3JzsKKyAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiAnemVybyc7CisgICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwMCwgMTEsIDk5KSkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gPT0gMikgcmV0dXJuICd0d28nOworICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcyJzogZnVuY3Rpb24gXyhuKSB7CisgICAgICAgIGlmIChuICE9PSAwICYmIG4gJSAxMCA9PT0gMCkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gPT0gMikgcmV0dXJuICd0d28nOworICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICczJzogZnVuY3Rpb24gXyhuKSB7CisgICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzQnOiBmdW5jdGlvbiBfKG4pIHsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuLCAwLCAxKSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnNSc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDAsIDIpICYmIG4gIT0gMikgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnNic6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAobiA9PT0gMCkgcmV0dXJuICd6ZXJvJzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzcnOiBmdW5jdGlvbiBfKG4pIHsKKyAgICAgICAgaWYgKG4gPT0gMikgcmV0dXJuICd0d28nOworICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICc4JzogZnVuY3Rpb24gXyhuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiwgMywgNikpIHJldHVybiAnZmV3JzsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuLCA3LCAxMCkpIHJldHVybiAnbWFueSc7CisgICAgICAgIGlmIChuID09IDIpIHJldHVybiAndHdvJzsKKyAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnOSc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAobiA9PT0gMCB8fCBuICE9IDEgJiYgaXNCZXR3ZWVuKG4gJSAxMDAsIDEsIDE5KSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcxMCc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMCwgMiwgOSkgJiYgIWlzQmV0d2VlbihuICUgMTAwLCAxMSwgMTkpKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChuICUgMTAgPT0gMSAmJiAhaXNCZXR3ZWVuKG4gJSAxMDAsIDExLCAxOSkpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzExJzogZnVuY3Rpb24gXyhuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwLCAyLCA0KSAmJiAhaXNCZXR3ZWVuKG4gJSAxMDAsIDEyLCAxNCkpIHJldHVybiAnZmV3JzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PT0gMCB8fCBpc0JldHdlZW4obiAlIDEwLCA1LCA5KSB8fCBpc0JldHdlZW4obiAlIDEwMCwgMTEsIDE0KSkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzEyJzogZnVuY3Rpb24gXyhuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiwgMiwgNCkpIHJldHVybiAnZmV3JzsKKyAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMTMnOiBmdW5jdGlvbiBfKG4pIHsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuICUgMTAsIDIsIDQpICYmICFpc0JldHdlZW4obiAlIDEwMCwgMTIsIDE0KSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAobiAhPSAxICYmIGlzQmV0d2VlbihuICUgMTAsIDAsIDEpIHx8IGlzQmV0d2VlbihuICUgMTAsIDUsIDkpIHx8IGlzQmV0d2VlbihuICUgMTAwLCAxMiwgMTQpKSByZXR1cm4gJ21hbnknOworICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcxNCc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMDAsIDMsIDQpKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChuICUgMTAwID09IDIpIHJldHVybiAndHdvJzsKKyAgICAgICAgaWYgKG4gJSAxMDAgPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMTUnOiBmdW5jdGlvbiBfKG4pIHsKKyAgICAgICAgaWYgKG4gPT09IDAgfHwgaXNCZXR3ZWVuKG4gJSAxMDAsIDIsIDEwKSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMDAsIDExLCAxOSkpIHJldHVybiAnbWFueSc7CisgICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzE2JzogZnVuY3Rpb24gXyhuKSB7CisgICAgICAgIGlmIChuICUgMTAgPT0gMSAmJiBuICE9IDExKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcxNyc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAobiA9PSAzKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gJ3plcm8nOworICAgICAgICBpZiAobiA9PSA2KSByZXR1cm4gJ21hbnknOworICAgICAgICBpZiAobiA9PSAyKSByZXR1cm4gJ3R3byc7CisgICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzE4JzogZnVuY3Rpb24gXyhuKSB7CisgICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gJ3plcm8nOworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDAsIDIpICYmIG4gIT09IDAgJiYgbiAhPSAyKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcxOSc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDIsIDEwKSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDAsIDEpKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcyMCc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAoKGlzQmV0d2VlbihuICUgMTAsIDMsIDQpIHx8IG4gJSAxMCA9PSA5KSAmJiAhKGlzQmV0d2VlbihuICUgMTAwLCAxMCwgMTkpIHx8IGlzQmV0d2VlbihuICUgMTAwLCA3MCwgNzkpIHx8IGlzQmV0d2VlbihuICUgMTAwLCA5MCwgOTkpKSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAobiAlIDEwMDAwMDAgPT09IDAgJiYgbiAhPT0gMCkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PSAyICYmICFpc0luKG4gJSAxMDAsIFsxMiwgNzIsIDkyXSkpIHJldHVybiAndHdvJzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PSAxICYmICFpc0luKG4gJSAxMDAsIFsxMSwgNzEsIDkxXSkpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzIxJzogZnVuY3Rpb24gXyhuKSB7CisgICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gJ3plcm8nOworICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcyMic6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDAsIDEpIHx8IGlzQmV0d2VlbihuLCAxMSwgOTkpKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcyMyc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMCwgMSwgMikgfHwgbiAlIDIwID09PSAwKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcyNCc6IGZ1bmN0aW9uIF8obikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDMsIDEwKSB8fCBpc0JldHdlZW4obiwgMTMsIDE5KSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAoaXNJbihuLCBbMiwgMTJdKSkgcmV0dXJuICd0d28nOworICAgICAgICBpZiAoaXNJbihuLCBbMSwgMTFdKSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0KKyAgICB9OworICAgIHZhciBpbmRleCA9IGxvY2FsZXMycnVsZXNbbGFuZy5yZXBsYWNlKC8tLiokLywgJycpXTsKKworICAgIGlmICghKGluZGV4IGluIHBsdXJhbFJ1bGVzKSkgeworICAgICAgY29uc29sZS53YXJuKCdwbHVyYWwgZm9ybSB1bmtub3duIGZvciBbJyArIGxhbmcgKyAnXScpOworICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9OworICAgIH0KKworICAgIHJldHVybiBwbHVyYWxSdWxlc1tpbmRleF07CisgIH0KKworICBnTWFjcm9zLnBsdXJhbCA9IGZ1bmN0aW9uIChzdHIsIHBhcmFtLCBrZXksIHByb3ApIHsKKyAgICB2YXIgbiA9IHBhcnNlRmxvYXQocGFyYW0pOworICAgIGlmIChpc05hTihuKSkgcmV0dXJuIHN0cjsKKyAgICBpZiAocHJvcCAhPSBnVGV4dFByb3ApIHJldHVybiBzdHI7CisKKyAgICBpZiAoIWdNYWNyb3MuX3BsdXJhbFJ1bGVzKSB7CisgICAgICBnTWFjcm9zLl9wbHVyYWxSdWxlcyA9IGdldFBsdXJhbFJ1bGVzKGdMYW5ndWFnZSk7CisgICAgfQorCisgICAgdmFyIGluZGV4ID0gJ1snICsgZ01hY3Jvcy5fcGx1cmFsUnVsZXMobikgKyAnXSc7CisKKyAgICBpZiAobiA9PT0gMCAmJiBrZXkgKyAnW3plcm9dJyBpbiBnTDEwbkRhdGEpIHsKKyAgICAgIHN0ciA9IGdMMTBuRGF0YVtrZXkgKyAnW3plcm9dJ11bcHJvcF07CisgICAgfSBlbHNlIGlmIChuID09IDEgJiYga2V5ICsgJ1tvbmVdJyBpbiBnTDEwbkRhdGEpIHsKKyAgICAgIHN0ciA9IGdMMTBuRGF0YVtrZXkgKyAnW29uZV0nXVtwcm9wXTsKKyAgICB9IGVsc2UgaWYgKG4gPT0gMiAmJiBrZXkgKyAnW3R3b10nIGluIGdMMTBuRGF0YSkgeworICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbdHdvXSddW3Byb3BdOworICAgIH0gZWxzZSBpZiAoa2V5ICsgaW5kZXggaW4gZ0wxMG5EYXRhKSB7CisgICAgICBzdHIgPSBnTDEwbkRhdGFba2V5ICsgaW5kZXhdW3Byb3BdOworICAgIH0gZWxzZSBpZiAoa2V5ICsgJ1tvdGhlcl0nIGluIGdMMTBuRGF0YSkgeworICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbb3RoZXJdJ11bcHJvcF07CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKKyAgfTsKKworICBmdW5jdGlvbiBnZXRMMTBuRGF0YShrZXksIGFyZ3MsIGZhbGxiYWNrKSB7CisgICAgdmFyIGRhdGEgPSBnTDEwbkRhdGFba2V5XTsKKworICAgIGlmICghZGF0YSkgeworICAgICAgY29uc29sZS53YXJuKCcjJyArIGtleSArICcgaXMgdW5kZWZpbmVkLicpOworCisgICAgICBpZiAoIWZhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBkYXRhID0gZmFsbGJhY2s7CisgICAgfQorCisgICAgdmFyIHJ2ID0ge307CisKKyAgICBmb3IgKHZhciBwcm9wIGluIGRhdGEpIHsKKyAgICAgIHZhciBzdHIgPSBkYXRhW3Byb3BdOworICAgICAgc3RyID0gc3Vic3RJbmRleGVzKHN0ciwgYXJncywga2V5LCBwcm9wKTsKKyAgICAgIHN0ciA9IHN1YnN0QXJndW1lbnRzKHN0ciwgYXJncywga2V5KTsKKyAgICAgIHJ2W3Byb3BdID0gc3RyOworICAgIH0KKworICAgIHJldHVybiBydjsKKyAgfQorCisgIGZ1bmN0aW9uIHN1YnN0SW5kZXhlcyhzdHIsIGFyZ3MsIGtleSwgcHJvcCkgeworICAgIHZhciByZUluZGV4ID0gL1x7XFtccyooW2EtekEtWl0rKVwoKFthLXpBLVpdKylcKVxzKlxdXH0vOworICAgIHZhciByZU1hdGNoID0gcmVJbmRleC5leGVjKHN0cik7CisgICAgaWYgKCFyZU1hdGNoIHx8ICFyZU1hdGNoLmxlbmd0aCkgcmV0dXJuIHN0cjsKKyAgICB2YXIgbWFjcm9OYW1lID0gcmVNYXRjaFsxXTsKKyAgICB2YXIgcGFyYW1OYW1lID0gcmVNYXRjaFsyXTsKKyAgICB2YXIgcGFyYW07CisKKyAgICBpZiAoYXJncyAmJiBwYXJhbU5hbWUgaW4gYXJncykgeworICAgICAgcGFyYW0gPSBhcmdzW3BhcmFtTmFtZV07CisgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUgaW4gZ0wxMG5EYXRhKSB7CisgICAgICBwYXJhbSA9IGdMMTBuRGF0YVtwYXJhbU5hbWVdOworICAgIH0KKworICAgIGlmIChtYWNyb05hbWUgaW4gZ01hY3JvcykgeworICAgICAgdmFyIG1hY3JvID0gZ01hY3Jvc1ttYWNyb05hbWVdOworICAgICAgc3RyID0gbWFjcm8oc3RyLCBwYXJhbSwga2V5LCBwcm9wKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgZnVuY3Rpb24gc3Vic3RBcmd1bWVudHMoc3RyLCBhcmdzLCBrZXkpIHsKKyAgICB2YXIgcmVBcmdzID0gL1x7XHtccyooLis/KVxzKlx9XH0vZzsKKyAgICByZXR1cm4gc3RyLnJlcGxhY2UocmVBcmdzLCBmdW5jdGlvbiAobWF0Y2hlZF90ZXh0LCBhcmcpIHsKKyAgICAgIGlmIChhcmdzICYmIGFyZyBpbiBhcmdzKSB7CisgICAgICAgIHJldHVybiBhcmdzW2FyZ107CisgICAgICB9CisKKyAgICAgIGlmIChhcmcgaW4gZ0wxMG5EYXRhKSB7CisgICAgICAgIHJldHVybiBnTDEwbkRhdGFbYXJnXTsKKyAgICAgIH0KKworICAgICAgY29uc29sZS5sb2coJ2FyZ3VtZW50IHt7JyArIGFyZyArICd9fSBmb3IgIycgKyBrZXkgKyAnIGlzIHVuZGVmaW5lZC4nKTsKKyAgICAgIHJldHVybiBtYXRjaGVkX3RleHQ7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiB0cmFuc2xhdGVFbGVtZW50KGVsZW1lbnQpIHsKKyAgICB2YXIgbDEwbiA9IGdldEwxMG5BdHRyaWJ1dGVzKGVsZW1lbnQpOworICAgIGlmICghbDEwbi5pZCkgcmV0dXJuOworICAgIHZhciBkYXRhID0gZ2V0TDEwbkRhdGEobDEwbi5pZCwgbDEwbi5hcmdzKTsKKworICAgIGlmICghZGF0YSkgeworICAgICAgY29uc29sZS53YXJuKCcjJyArIGwxMG4uaWQgKyAnIGlzIHVuZGVmaW5lZC4nKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZGF0YVtnVGV4dFByb3BdKSB7CisgICAgICBpZiAoZ2V0Q2hpbGRFbGVtZW50Q291bnQoZWxlbWVudCkgPT09IDApIHsKKyAgICAgICAgZWxlbWVudFtnVGV4dFByb3BdID0gZGF0YVtnVGV4dFByb3BdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZE5vZGVzOworICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gMyAmJiAvXFMvLnRlc3QoY2hpbGRyZW5baV0ubm9kZVZhbHVlKSkgeworICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgIGNoaWxkcmVuW2ldLm5vZGVWYWx1ZSA9ICcnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY2hpbGRyZW5baV0ubm9kZVZhbHVlID0gZGF0YVtnVGV4dFByb3BdOworICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgIHZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGFbZ1RleHRQcm9wXSk7CisgICAgICAgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIGVsZW1lbnQuZmlyc3RDaGlsZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZGVsZXRlIGRhdGFbZ1RleHRQcm9wXTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBrIGluIGRhdGEpIHsKKyAgICAgIGVsZW1lbnRba10gPSBkYXRhW2tdOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGdldENoaWxkRWxlbWVudENvdW50KGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeworICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOworICAgIH0KKworICAgIGlmICh0eXBlb2YgZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudCAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIHJldHVybiBlbGVtZW50LmNoaWxkRWxlbWVudENvdW50OworICAgIH0KKworICAgIHZhciBjb3VudCA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgY291bnQgKz0gZWxlbWVudC5ub2RlVHlwZSA9PT0gMSA/IDEgOiAwOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zbGF0ZUZyYWdtZW50KGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gZWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisgICAgdmFyIGNoaWxkcmVuID0gZ2V0VHJhbnNsYXRhYmxlQ2hpbGRyZW4oZWxlbWVudCk7CisgICAgdmFyIGVsZW1lbnRDb3VudCA9IGNoaWxkcmVuLmxlbmd0aDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudENvdW50OyBpKyspIHsKKyAgICAgIHRyYW5zbGF0ZUVsZW1lbnQoY2hpbGRyZW5baV0pOworICAgIH0KKworICAgIHRyYW5zbGF0ZUVsZW1lbnQoZWxlbWVudCk7CisgIH0KKworICByZXR1cm4geworICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSwgYXJncywgZmFsbGJhY2tTdHJpbmcpIHsKKyAgICAgIHZhciBpbmRleCA9IGtleS5sYXN0SW5kZXhPZignLicpOworICAgICAgdmFyIHByb3AgPSBnVGV4dFByb3A7CisKKyAgICAgIGlmIChpbmRleCA+IDApIHsKKyAgICAgICAgcHJvcCA9IGtleS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICB9CisKKyAgICAgIHZhciBmYWxsYmFjazsKKworICAgICAgaWYgKGZhbGxiYWNrU3RyaW5nKSB7CisgICAgICAgIGZhbGxiYWNrID0ge307CisgICAgICAgIGZhbGxiYWNrW3Byb3BdID0gZmFsbGJhY2tTdHJpbmc7CisgICAgICB9CisKKyAgICAgIHZhciBkYXRhID0gZ2V0TDEwbkRhdGEoa2V5LCBhcmdzLCBmYWxsYmFjayk7CisKKyAgICAgIGlmIChkYXRhICYmIHByb3AgaW4gZGF0YSkgeworICAgICAgICByZXR1cm4gZGF0YVtwcm9wXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICd7eycgKyBrZXkgKyAnfX0nOworICAgIH0sCisgICAgZ2V0RGF0YTogZnVuY3Rpb24gZ2V0RGF0YSgpIHsKKyAgICAgIHJldHVybiBnTDEwbkRhdGE7CisgICAgfSwKKyAgICBnZXRUZXh0OiBmdW5jdGlvbiBnZXRUZXh0KCkgeworICAgICAgcmV0dXJuIGdUZXh0RGF0YTsKKyAgICB9LAorICAgIGdldExhbmd1YWdlOiBmdW5jdGlvbiBnZXRMYW5ndWFnZSgpIHsKKyAgICAgIHJldHVybiBnTGFuZ3VhZ2U7CisgICAgfSwKKyAgICBzZXRMYW5ndWFnZTogZnVuY3Rpb24gc2V0TGFuZ3VhZ2UobGFuZywgY2FsbGJhY2spIHsKKyAgICAgIGxvYWRMb2NhbGUobGFuZywgZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7CisgICAgICB9KTsKKyAgICB9LAorICAgIGdldERpcmVjdGlvbjogZnVuY3Rpb24gZ2V0RGlyZWN0aW9uKCkgeworICAgICAgdmFyIHJ0bExpc3QgPSBbJ2FyJywgJ2hlJywgJ2ZhJywgJ3BzJywgJ3VyJ107CisgICAgICB2YXIgc2hvcnRDb2RlID0gZ0xhbmd1YWdlLnNwbGl0KCctJywgMSlbMF07CisgICAgICByZXR1cm4gcnRsTGlzdC5pbmRleE9mKHNob3J0Q29kZSkgPj0gMCA/ICdydGwnIDogJ2x0cic7CisgICAgfSwKKyAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZUZyYWdtZW50LAorICAgIGdldFJlYWR5U3RhdGU6IGZ1bmN0aW9uIGdldFJlYWR5U3RhdGUoKSB7CisgICAgICByZXR1cm4gZ1JlYWR5U3RhdGU7CisgICAgfSwKKyAgICByZWFkeTogZnVuY3Rpb24gcmVhZHkoY2FsbGJhY2spIHsKKyAgICAgIGlmICghY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChnUmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IGdSZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZScpIHsKKyAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIH0pOworICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvY2FsaXplZCcsIGZ1bmN0aW9uIG9uY2UoKSB7CisgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9jYWxpemVkJywgb25jZSk7CisgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9OworfSh3aW5kb3csIGRvY3VtZW50KTsKKworLyoqKi8gfSksCisvKiAxMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERkZpbmRDb250cm9sbGVyID0gZXhwb3J0cy5GaW5kU3RhdGUgPSB2b2lkIDA7CisKK3ZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX3BkZl9maW5kX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7CisKK3ZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIEZpbmRTdGF0ZSA9IHsKKyAgRk9VTkQ6IDAsCisgIE5PVF9GT1VORDogMSwKKyAgV1JBUFBFRDogMiwKKyAgUEVORElORzogMworfTsKK2V4cG9ydHMuRmluZFN0YXRlID0gRmluZFN0YXRlOwordmFyIEZJTkRfVElNRU9VVCA9IDI1MDsKK3ZhciBNQVRDSF9TQ1JPTExfT0ZGU0VUX1RPUCA9IC01MDsKK3ZhciBNQVRDSF9TQ1JPTExfT0ZGU0VUX0xFRlQgPSAtNDAwOwordmFyIENIQVJBQ1RFUlNfVE9fTk9STUFMSVpFID0geworICAiXHUyMDE4IjogIiciLAorICAiXHUyMDE5IjogIiciLAorICAiXHUyMDFBIjogIiciLAorICAiXHUyMDFCIjogIiciLAorICAiXHUyMDFDIjogJyInLAorICAiXHUyMDFEIjogJyInLAorICAiXHUyMDFFIjogJyInLAorICAiXHUyMDFGIjogJyInLAorICAiXHhCQyI6ICIxLzQiLAorICAiXHhCRCI6ICIxLzIiLAorICAiXHhCRSI6ICIzLzQiCit9OwordmFyIG5vcm1hbGl6YXRpb25SZWdleCA9IG51bGw7CisKK2Z1bmN0aW9uIG5vcm1hbGl6ZSh0ZXh0KSB7CisgIGlmICghbm9ybWFsaXphdGlvblJlZ2V4KSB7CisgICAgdmFyIHJlcGxhY2UgPSBPYmplY3Qua2V5cyhDSEFSQUNURVJTX1RPX05PUk1BTElaRSkuam9pbigiIik7CisgICAgbm9ybWFsaXphdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cCgiWyIuY29uY2F0KHJlcGxhY2UsICJdIiksICJnIik7CisgIH0KKworICByZXR1cm4gdGV4dC5yZXBsYWNlKG5vcm1hbGl6YXRpb25SZWdleCwgZnVuY3Rpb24gKGNoKSB7CisgICAgcmV0dXJuIENIQVJBQ1RFUlNfVE9fTk9STUFMSVpFW2NoXTsKKyAgfSk7Cit9CisKK3ZhciBQREZGaW5kQ29udHJvbGxlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBERkZpbmRDb250cm9sbGVyKF9yZWYpIHsKKyAgICB2YXIgbGlua1NlcnZpY2UgPSBfcmVmLmxpbmtTZXJ2aWNlLAorICAgICAgICBldmVudEJ1cyA9IF9yZWYuZXZlbnRCdXM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGRmluZENvbnRyb2xsZXIpOworCisgICAgdGhpcy5fbGlua1NlcnZpY2UgPSBsaW5rU2VydmljZTsKKyAgICB0aGlzLl9ldmVudEJ1cyA9IGV2ZW50QnVzOworCisgICAgdGhpcy5fcmVzZXQoKTsKKworICAgIGV2ZW50QnVzLl9vbigiZmluZGJhcmNsb3NlIiwgdGhpcy5fb25GaW5kQmFyQ2xvc2UuYmluZCh0aGlzKSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGRmluZENvbnRyb2xsZXIsIFt7CisgICAga2V5OiAic2V0RG9jdW1lbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREb2N1bWVudChwZGZEb2N1bWVudCkgeworICAgICAgaWYgKHRoaXMuX3BkZkRvY3VtZW50KSB7CisgICAgICAgIHRoaXMuX3Jlc2V0KCk7CisgICAgICB9CisKKyAgICAgIGlmICghcGRmRG9jdW1lbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9wZGZEb2N1bWVudCA9IHBkZkRvY3VtZW50OworCisgICAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJleGVjdXRlQ29tbWFuZCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGV4ZWN1dGVDb21tYW5kKGNtZCwgc3RhdGUpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIGlmICghc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcGRmRG9jdW1lbnQgPSB0aGlzLl9wZGZEb2N1bWVudDsKKworICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBudWxsIHx8IHRoaXMuX3Nob3VsZERpcnR5TWF0Y2goY21kLCBzdGF0ZSkpIHsKKyAgICAgICAgdGhpcy5fZGlydHlNYXRjaCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7CisKKyAgICAgIGlmIChjbWQgIT09ICJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlIikgeworICAgICAgICB0aGlzLl91cGRhdGVVSVN0YXRlKEZpbmRTdGF0ZS5QRU5ESU5HKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoIV90aGlzLl9wZGZEb2N1bWVudCB8fCBwZGZEb2N1bWVudCAmJiBfdGhpcy5fcGRmRG9jdW1lbnQgIT09IHBkZkRvY3VtZW50KSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgX3RoaXMuX2V4dHJhY3RUZXh0KCk7CisKKyAgICAgICAgdmFyIGZpbmRiYXJDbG9zZWQgPSAhX3RoaXMuX2hpZ2hsaWdodE1hdGNoZXM7CisgICAgICAgIHZhciBwZW5kaW5nVGltZW91dCA9ICEhX3RoaXMuX2ZpbmRUaW1lb3V0OworCisgICAgICAgIGlmIChfdGhpcy5fZmluZFRpbWVvdXQpIHsKKyAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuX2ZpbmRUaW1lb3V0KTsKKyAgICAgICAgICBfdGhpcy5fZmluZFRpbWVvdXQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNtZCA9PT0gImZpbmQiKSB7CisgICAgICAgICAgX3RoaXMuX2ZpbmRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBfdGhpcy5fbmV4dE1hdGNoKCk7CisKKyAgICAgICAgICAgIF90aGlzLl9maW5kVGltZW91dCA9IG51bGw7CisgICAgICAgICAgfSwgRklORF9USU1FT1VUKTsKKyAgICAgICAgfSBlbHNlIGlmIChfdGhpcy5fZGlydHlNYXRjaCkgeworICAgICAgICAgIF90aGlzLl9uZXh0TWF0Y2goKTsKKyAgICAgICAgfSBlbHNlIGlmIChjbWQgPT09ICJmaW5kYWdhaW4iKSB7CisgICAgICAgICAgX3RoaXMuX25leHRNYXRjaCgpOworCisgICAgICAgICAgaWYgKGZpbmRiYXJDbG9zZWQgJiYgX3RoaXMuX3N0YXRlLmhpZ2hsaWdodEFsbCkgeworICAgICAgICAgICAgX3RoaXMuX3VwZGF0ZUFsbFBhZ2VzKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gImZpbmRoaWdobGlnaHRhbGxjaGFuZ2UiKSB7CisgICAgICAgICAgaWYgKHBlbmRpbmdUaW1lb3V0KSB7CisgICAgICAgICAgICBfdGhpcy5fbmV4dE1hdGNoKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF90aGlzLl9oaWdobGlnaHRNYXRjaGVzID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBfdGhpcy5fdXBkYXRlQWxsUGFnZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfdGhpcy5fbmV4dE1hdGNoKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNjcm9sbE1hdGNoSW50b1ZpZXciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzY3JvbGxNYXRjaEludG9WaWV3KF9yZWYyKSB7CisgICAgICB2YXIgX3JlZjIkZWxlbWVudCA9IF9yZWYyLmVsZW1lbnQsCisgICAgICAgICAgZWxlbWVudCA9IF9yZWYyJGVsZW1lbnQgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRlbGVtZW50LAorICAgICAgICAgIF9yZWYyJHBhZ2VJbmRleCA9IF9yZWYyLnBhZ2VJbmRleCwKKyAgICAgICAgICBwYWdlSW5kZXggPSBfcmVmMiRwYWdlSW5kZXggPT09IHZvaWQgMCA/IC0xIDogX3JlZjIkcGFnZUluZGV4LAorICAgICAgICAgIF9yZWYyJG1hdGNoSW5kZXggPSBfcmVmMi5tYXRjaEluZGV4LAorICAgICAgICAgIG1hdGNoSW5kZXggPSBfcmVmMiRtYXRjaEluZGV4ID09PSB2b2lkIDAgPyAtMSA6IF9yZWYyJG1hdGNoSW5kZXg7CisKKyAgICAgIGlmICghdGhpcy5fc2Nyb2xsTWF0Y2hlcyB8fCAhZWxlbWVudCkgeworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKG1hdGNoSW5kZXggPT09IC0xIHx8IG1hdGNoSW5kZXggIT09IHRoaXMuX3NlbGVjdGVkLm1hdGNoSWR4KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAocGFnZUluZGV4ID09PSAtMSB8fCBwYWdlSW5kZXggIT09IHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHgpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9zY3JvbGxNYXRjaGVzID0gZmFsc2U7CisgICAgICB2YXIgc3BvdCA9IHsKKyAgICAgICAgdG9wOiBNQVRDSF9TQ1JPTExfT0ZGU0VUX1RPUCwKKyAgICAgICAgbGVmdDogTUFUQ0hfU0NST0xMX09GRlNFVF9MRUZUCisgICAgICB9OworICAgICAgKDAsIF91aV91dGlscy5zY3JvbGxJbnRvVmlldykoZWxlbWVudCwgc3BvdCwgdHJ1ZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3Jlc2V0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3Jlc2V0KCkgeworICAgICAgdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcyA9IGZhbHNlOworICAgICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IGZhbHNlOworICAgICAgdGhpcy5fcGRmRG9jdW1lbnQgPSBudWxsOworICAgICAgdGhpcy5fcGFnZU1hdGNoZXMgPSBbXTsKKyAgICAgIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoID0gW107CisgICAgICB0aGlzLl9zdGF0ZSA9IG51bGw7CisgICAgICB0aGlzLl9zZWxlY3RlZCA9IHsKKyAgICAgICAgcGFnZUlkeDogLTEsCisgICAgICAgIG1hdGNoSWR4OiAtMQorICAgICAgfTsKKyAgICAgIHRoaXMuX29mZnNldCA9IHsKKyAgICAgICAgcGFnZUlkeDogbnVsbCwKKyAgICAgICAgbWF0Y2hJZHg6IG51bGwsCisgICAgICAgIHdyYXBwZWQ6IGZhbHNlCisgICAgICB9OworICAgICAgdGhpcy5fZXh0cmFjdFRleHRQcm9taXNlcyA9IFtdOworICAgICAgdGhpcy5fcGFnZUNvbnRlbnRzID0gW107CisgICAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCA9IDA7CisgICAgICB0aGlzLl9wYWdlc1RvU2VhcmNoID0gbnVsbDsKKyAgICAgIHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gbnVsbDsKKyAgICAgIHRoaXMuX2RpcnR5TWF0Y2ggPSBmYWxzZTsKKyAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5kVGltZW91dCk7CisgICAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7CisgICAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5ID0gKDAsIF9wZGZqc0xpYi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfc2hvdWxkRGlydHlNYXRjaCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9zaG91bGREaXJ0eU1hdGNoKGNtZCwgc3RhdGUpIHsKKyAgICAgIGlmIChzdGF0ZS5xdWVyeSAhPT0gdGhpcy5fc3RhdGUucXVlcnkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgImZpbmRhZ2FpbiI6CisgICAgICAgICAgdmFyIHBhZ2VOdW1iZXIgPSB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ICsgMTsKKyAgICAgICAgICB2YXIgbGlua1NlcnZpY2UgPSB0aGlzLl9saW5rU2VydmljZTsKKworICAgICAgICAgIGlmIChwYWdlTnVtYmVyID49IDEgJiYgcGFnZU51bWJlciA8PSBsaW5rU2VydmljZS5wYWdlc0NvdW50ICYmIHBhZ2VOdW1iZXIgIT09IGxpbmtTZXJ2aWNlLnBhZ2UgJiYgIWxpbmtTZXJ2aWNlLmlzUGFnZVZpc2libGUocGFnZU51bWJlcikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBjYXNlICJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlIjoKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9wcmVwYXJlTWF0Y2hlcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9wcmVwYXJlTWF0Y2hlcyhtYXRjaGVzV2l0aExlbmd0aCwgbWF0Y2hlcywgbWF0Y2hlc0xlbmd0aCkgeworICAgICAgZnVuY3Rpb24gaXNTdWJUZXJtKGN1cnJlbnRJbmRleCkgeworICAgICAgICB2YXIgY3VycmVudEVsZW0gPSBtYXRjaGVzV2l0aExlbmd0aFtjdXJyZW50SW5kZXhdOworICAgICAgICB2YXIgbmV4dEVsZW0gPSBtYXRjaGVzV2l0aExlbmd0aFtjdXJyZW50SW5kZXggKyAxXTsKKworICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgbWF0Y2hlc1dpdGhMZW5ndGgubGVuZ3RoIC0gMSAmJiBjdXJyZW50RWxlbS5tYXRjaCA9PT0gbmV4dEVsZW0ubWF0Y2gpIHsKKyAgICAgICAgICBjdXJyZW50RWxlbS5za2lwcGVkID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIGkgPSBjdXJyZW50SW5kZXggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgIHZhciBwcmV2RWxlbSA9IG1hdGNoZXNXaXRoTGVuZ3RoW2ldOworCisgICAgICAgICAgaWYgKHByZXZFbGVtLnNraXBwZWQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwcmV2RWxlbS5tYXRjaCArIHByZXZFbGVtLm1hdGNoTGVuZ3RoIDwgY3VycmVudEVsZW0ubWF0Y2gpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwcmV2RWxlbS5tYXRjaCArIHByZXZFbGVtLm1hdGNoTGVuZ3RoID49IGN1cnJlbnRFbGVtLm1hdGNoICsgY3VycmVudEVsZW0ubWF0Y2hMZW5ndGgpIHsKKyAgICAgICAgICAgIGN1cnJlbnRFbGVtLnNraXBwZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBtYXRjaGVzV2l0aExlbmd0aC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICAgIHJldHVybiBhLm1hdGNoID09PSBiLm1hdGNoID8gYS5tYXRjaExlbmd0aCAtIGIubWF0Y2hMZW5ndGggOiBhLm1hdGNoIC0gYi5tYXRjaDsKKyAgICAgIH0pOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbWF0Y2hlc1dpdGhMZW5ndGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKGlzU3ViVGVybShpKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoZXNXaXRoTGVuZ3RoW2ldLm1hdGNoKTsKKyAgICAgICAgbWF0Y2hlc0xlbmd0aC5wdXNoKG1hdGNoZXNXaXRoTGVuZ3RoW2ldLm1hdGNoTGVuZ3RoKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfaXNFbnRpcmVXb3JkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2lzRW50aXJlV29yZChjb250ZW50LCBzdGFydElkeCwgbGVuZ3RoKSB7CisgICAgICBpZiAoc3RhcnRJZHggPiAwKSB7CisgICAgICAgIHZhciBmaXJzdCA9IGNvbnRlbnQuY2hhckNvZGVBdChzdGFydElkeCk7CisgICAgICAgIHZhciBsaW1pdCA9IGNvbnRlbnQuY2hhckNvZGVBdChzdGFydElkeCAtIDEpOworCisgICAgICAgIGlmICgoMCwgX3BkZl9maW5kX3V0aWxzLmdldENoYXJhY3RlclR5cGUpKGZpcnN0KSA9PT0gKDAsIF9wZGZfZmluZF91dGlscy5nZXRDaGFyYWN0ZXJUeXBlKShsaW1pdCkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGVuZElkeCA9IHN0YXJ0SWR4ICsgbGVuZ3RoIC0gMTsKKworICAgICAgaWYgKGVuZElkeCA8IGNvbnRlbnQubGVuZ3RoIC0gMSkgeworICAgICAgICB2YXIgbGFzdCA9IGNvbnRlbnQuY2hhckNvZGVBdChlbmRJZHgpOworCisgICAgICAgIHZhciBfbGltaXQgPSBjb250ZW50LmNoYXJDb2RlQXQoZW5kSWR4ICsgMSk7CisKKyAgICAgICAgaWYgKCgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkobGFzdCkgPT09ICgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkoX2xpbWl0KSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfY2FsY3VsYXRlUGhyYXNlTWF0Y2giLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlUGhyYXNlTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpIHsKKyAgICAgIHZhciBtYXRjaGVzID0gW107CisgICAgICB2YXIgcXVlcnlMZW4gPSBxdWVyeS5sZW5ndGg7CisgICAgICB2YXIgbWF0Y2hJZHggPSAtcXVlcnlMZW47CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIG1hdGNoSWR4ID0gcGFnZUNvbnRlbnQuaW5kZXhPZihxdWVyeSwgbWF0Y2hJZHggKyBxdWVyeUxlbik7CisKKyAgICAgICAgaWYgKG1hdGNoSWR4ID09PSAtMSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVudGlyZVdvcmQgJiYgIXRoaXMuX2lzRW50aXJlV29yZChwYWdlQ29udGVudCwgbWF0Y2hJZHgsIHF1ZXJ5TGVuKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoSWR4KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XSA9IG1hdGNoZXM7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2NhbGN1bGF0ZVdvcmRNYXRjaCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9jYWxjdWxhdGVXb3JkTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpIHsKKyAgICAgIHZhciBtYXRjaGVzV2l0aExlbmd0aCA9IFtdOworICAgICAgdmFyIHF1ZXJ5QXJyYXkgPSBxdWVyeS5tYXRjaCgvXFMrL2cpOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcXVlcnlBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworICAgICAgICB2YXIgc3VicXVlcnkgPSBxdWVyeUFycmF5W2ldOworICAgICAgICB2YXIgc3VicXVlcnlMZW4gPSBzdWJxdWVyeS5sZW5ndGg7CisgICAgICAgIHZhciBtYXRjaElkeCA9IC1zdWJxdWVyeUxlbjsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIG1hdGNoSWR4ID0gcGFnZUNvbnRlbnQuaW5kZXhPZihzdWJxdWVyeSwgbWF0Y2hJZHggKyBzdWJxdWVyeUxlbik7CisKKyAgICAgICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZW50aXJlV29yZCAmJiAhdGhpcy5faXNFbnRpcmVXb3JkKHBhZ2VDb250ZW50LCBtYXRjaElkeCwgc3VicXVlcnlMZW4pKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBtYXRjaGVzV2l0aExlbmd0aC5wdXNoKHsKKyAgICAgICAgICAgIG1hdGNoOiBtYXRjaElkeCwKKyAgICAgICAgICAgIG1hdGNoTGVuZ3RoOiBzdWJxdWVyeUxlbiwKKyAgICAgICAgICAgIHNraXBwZWQ6IGZhbHNlCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGhbcGFnZUluZGV4XSA9IFtdOworICAgICAgdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XSA9IFtdOworCisgICAgICB0aGlzLl9wcmVwYXJlTWF0Y2hlcyhtYXRjaGVzV2l0aExlbmd0aCwgdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XSwgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGhbcGFnZUluZGV4XSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2NhbGN1bGF0ZU1hdGNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2NhbGN1bGF0ZU1hdGNoKHBhZ2VJbmRleCkgeworICAgICAgdmFyIHBhZ2VDb250ZW50ID0gdGhpcy5fcGFnZUNvbnRlbnRzW3BhZ2VJbmRleF07CisgICAgICB2YXIgcXVlcnkgPSB0aGlzLl9xdWVyeTsKKyAgICAgIHZhciBfdGhpcyRfc3RhdGUgPSB0aGlzLl9zdGF0ZSwKKyAgICAgICAgICBjYXNlU2Vuc2l0aXZlID0gX3RoaXMkX3N0YXRlLmNhc2VTZW5zaXRpdmUsCisgICAgICAgICAgZW50aXJlV29yZCA9IF90aGlzJF9zdGF0ZS5lbnRpcmVXb3JkLAorICAgICAgICAgIHBocmFzZVNlYXJjaCA9IF90aGlzJF9zdGF0ZS5waHJhc2VTZWFyY2g7CisKKyAgICAgIGlmIChxdWVyeS5sZW5ndGggPT09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgcGFnZUNvbnRlbnQgPSBwYWdlQ29udGVudC50b0xvd2VyQ2FzZSgpOworICAgICAgICBxdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CisgICAgICB9CisKKyAgICAgIGlmIChwaHJhc2VTZWFyY2gpIHsKKyAgICAgICAgdGhpcy5fY2FsY3VsYXRlUGhyYXNlTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fY2FsY3VsYXRlV29yZE1hdGNoKHF1ZXJ5LCBwYWdlSW5kZXgsIHBhZ2VDb250ZW50LCBlbnRpcmVXb3JkKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3N0YXRlLmhpZ2hsaWdodEFsbCkgeworICAgICAgICB0aGlzLl91cGRhdGVQYWdlKHBhZ2VJbmRleCk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4ID09PSBwYWdlSW5kZXgpIHsKKyAgICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IG51bGw7CisKKyAgICAgICAgdGhpcy5fbmV4dFBhZ2VNYXRjaCgpOworICAgICAgfQorCisgICAgICB2YXIgcGFnZU1hdGNoZXNDb3VudCA9IHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJbmRleF0ubGVuZ3RoOworCisgICAgICBpZiAocGFnZU1hdGNoZXNDb3VudCA+IDApIHsKKyAgICAgICAgdGhpcy5fbWF0Y2hlc0NvdW50VG90YWwgKz0gcGFnZU1hdGNoZXNDb3VudDsKKworICAgICAgICB0aGlzLl91cGRhdGVVSVJlc3VsdHNDb3VudCgpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIl9leHRyYWN0VGV4dCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9leHRyYWN0VGV4dCgpIHsKKyAgICAgIHZhciBfdGhpczIgPSB0aGlzOworCisgICAgICBpZiAodGhpcy5fZXh0cmFjdFRleHRQcm9taXNlcy5sZW5ndGggPiAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKKworICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSwgaWkpIHsKKyAgICAgICAgdmFyIGV4dHJhY3RUZXh0Q2FwYWJpbGl0eSA9ICgwLCBfcGRmanNMaWIuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgIF90aGlzMi5fZXh0cmFjdFRleHRQcm9taXNlc1tpXSA9IGV4dHJhY3RUZXh0Q2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wZGZEb2N1bWVudC5nZXRQYWdlKGkgKyAxKS50aGVuKGZ1bmN0aW9uIChwZGZQYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gcGRmUGFnZS5nZXRUZXh0Q29udGVudCh7CisgICAgICAgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2U6IHRydWUKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHRleHRDb250ZW50KSB7CisgICAgICAgICAgICB2YXIgdGV4dEl0ZW1zID0gdGV4dENvbnRlbnQuaXRlbXM7CisgICAgICAgICAgICB2YXIgc3RyQnVmID0gW107CisKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHRleHRJdGVtcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKHRleHRJdGVtc1tqXS5zdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfdGhpczIuX3BhZ2VDb250ZW50c1tpXSA9IG5vcm1hbGl6ZShzdHJCdWYuam9pbigiIikpOworICAgICAgICAgICAgZXh0cmFjdFRleHRDYXBhYmlsaXR5LnJlc29sdmUoaSk7CisgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVW5hYmxlIHRvIGdldCB0ZXh0IGNvbnRlbnQgZm9yIHBhZ2UgIi5jb25jYXQoaSArIDEpLCByZWFzb24pOworICAgICAgICAgICAgX3RoaXMyLl9wYWdlQ29udGVudHNbaV0gPSAiIjsKKyAgICAgICAgICAgIGV4dHJhY3RUZXh0Q2FwYWJpbGl0eS5yZXNvbHZlKGkpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH07CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2VzQ291bnQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIF9sb29wKGksIGlpKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfdXBkYXRlUGFnZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVQYWdlKGluZGV4KSB7CisgICAgICBpZiAodGhpcy5fc2Nyb2xsTWF0Y2hlcyAmJiB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ID09PSBpbmRleCkgeworICAgICAgICB0aGlzLl9saW5rU2VydmljZS5wYWdlID0gaW5kZXggKyAxOworICAgICAgfQorCisgICAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaCgidXBkYXRldGV4dGxheWVybWF0Y2hlcyIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICBwYWdlSW5kZXg6IGluZGV4CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfdXBkYXRlQWxsUGFnZXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlQWxsUGFnZXMoKSB7CisgICAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaCgidXBkYXRldGV4dGxheWVybWF0Y2hlcyIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICBwYWdlSW5kZXg6IC0xCisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfbmV4dE1hdGNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX25leHRNYXRjaCgpIHsKKyAgICAgIHZhciBfdGhpczMgPSB0aGlzOworCisgICAgICB2YXIgcHJldmlvdXMgPSB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXM7CisgICAgICB2YXIgY3VycmVudFBhZ2VJbmRleCA9IHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2UgLSAxOworICAgICAgdmFyIG51bVBhZ2VzID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZXNDb3VudDsKKyAgICAgIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXMgPSB0cnVlOworCisgICAgICBpZiAodGhpcy5fZGlydHlNYXRjaCkgeworICAgICAgICB0aGlzLl9kaXJ0eU1hdGNoID0gZmFsc2U7CisgICAgICAgIHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggPSB0aGlzLl9zZWxlY3RlZC5tYXRjaElkeCA9IC0xOworICAgICAgICB0aGlzLl9vZmZzZXQucGFnZUlkeCA9IGN1cnJlbnRQYWdlSW5kZXg7CisgICAgICAgIHRoaXMuX29mZnNldC5tYXRjaElkeCA9IG51bGw7CisgICAgICAgIHRoaXMuX29mZnNldC53cmFwcGVkID0gZmFsc2U7CisgICAgICAgIHRoaXMuX3Jlc3VtZVBhZ2VJZHggPSBudWxsOworICAgICAgICB0aGlzLl9wYWdlTWF0Y2hlcy5sZW5ndGggPSAwOworICAgICAgICB0aGlzLl9wYWdlTWF0Y2hlc0xlbmd0aC5sZW5ndGggPSAwOworICAgICAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCA9IDA7CisKKyAgICAgICAgdGhpcy5fdXBkYXRlQWxsUGFnZXMoKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVBhZ2VzOyBpKyspIHsKKyAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0ZpbmRNYXRjaGVzW2ldID09PSB0cnVlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLl9wZW5kaW5nRmluZE1hdGNoZXNbaV0gPSB0cnVlOworCisgICAgICAgICAgdGhpcy5fZXh0cmFjdFRleHRQcm9taXNlc1tpXS50aGVuKGZ1bmN0aW9uIChwYWdlSWR4KSB7CisgICAgICAgICAgICBkZWxldGUgX3RoaXMzLl9wZW5kaW5nRmluZE1hdGNoZXNbcGFnZUlkeF07CisKKyAgICAgICAgICAgIF90aGlzMy5fY2FsY3VsYXRlTWF0Y2gocGFnZUlkeCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3F1ZXJ5ID09PSAiIikgeworICAgICAgICB0aGlzLl91cGRhdGVVSVN0YXRlKEZpbmRTdGF0ZS5GT1VORCk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fcmVzdW1lUGFnZUlkeCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vZmZzZXQ7CisgICAgICB0aGlzLl9wYWdlc1RvU2VhcmNoID0gbnVtUGFnZXM7CisKKyAgICAgIGlmIChvZmZzZXQubWF0Y2hJZHggIT09IG51bGwpIHsKKyAgICAgICAgdmFyIG51bVBhZ2VNYXRjaGVzID0gdGhpcy5fcGFnZU1hdGNoZXNbb2Zmc2V0LnBhZ2VJZHhdLmxlbmd0aDsKKworICAgICAgICBpZiAoIXByZXZpb3VzICYmIG9mZnNldC5tYXRjaElkeCArIDEgPCBudW1QYWdlTWF0Y2hlcyB8fCBwcmV2aW91cyAmJiBvZmZzZXQubWF0Y2hJZHggPiAwKSB7CisgICAgICAgICAgb2Zmc2V0Lm1hdGNoSWR4ID0gcHJldmlvdXMgPyBvZmZzZXQubWF0Y2hJZHggLSAxIDogb2Zmc2V0Lm1hdGNoSWR4ICsgMTsKKworICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKHRydWUpOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fYWR2YW5jZU9mZnNldFBhZ2UocHJldmlvdXMpOworICAgICAgfQorCisgICAgICB0aGlzLl9uZXh0UGFnZU1hdGNoKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX21hdGNoZXNSZWFkeSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9tYXRjaGVzUmVhZHkobWF0Y2hlcykgeworICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldDsKKyAgICAgIHZhciBudW1NYXRjaGVzID0gbWF0Y2hlcy5sZW5ndGg7CisgICAgICB2YXIgcHJldmlvdXMgPSB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXM7CisKKyAgICAgIGlmIChudW1NYXRjaGVzKSB7CisgICAgICAgIG9mZnNldC5tYXRjaElkeCA9IHByZXZpb3VzID8gbnVtTWF0Y2hlcyAtIDEgOiAwOworCisgICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKHRydWUpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICB0aGlzLl9hZHZhbmNlT2Zmc2V0UGFnZShwcmV2aW91cyk7CisKKyAgICAgIGlmIChvZmZzZXQud3JhcHBlZCkgeworICAgICAgICBvZmZzZXQubWF0Y2hJZHggPSBudWxsOworCisgICAgICAgIGlmICh0aGlzLl9wYWdlc1RvU2VhcmNoIDwgMCkgeworICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKGZhbHNlKTsKKworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfbmV4dFBhZ2VNYXRjaCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9uZXh0UGFnZU1hdGNoKCkgeworICAgICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHggIT09IG51bGwpIHsKKyAgICAgICAgY29uc29sZS5lcnJvcigiVGhlcmUgY2FuIG9ubHkgYmUgb25lIHBlbmRpbmcgcGFnZS4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIG1hdGNoZXMgPSBudWxsOworCisgICAgICBkbyB7CisgICAgICAgIHZhciBwYWdlSWR4ID0gdGhpcy5fb2Zmc2V0LnBhZ2VJZHg7CisgICAgICAgIG1hdGNoZXMgPSB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSWR4XTsKKworICAgICAgICBpZiAoIW1hdGNoZXMpIHsKKyAgICAgICAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gcGFnZUlkeDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoIXRoaXMuX21hdGNoZXNSZWFkeShtYXRjaGVzKSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2FkdmFuY2VPZmZzZXRQYWdlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2FkdmFuY2VPZmZzZXRQYWdlKHByZXZpb3VzKSB7CisgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0OworICAgICAgdmFyIG51bVBhZ2VzID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZXNDb3VudDsKKyAgICAgIG9mZnNldC5wYWdlSWR4ID0gcHJldmlvdXMgPyBvZmZzZXQucGFnZUlkeCAtIDEgOiBvZmZzZXQucGFnZUlkeCArIDE7CisgICAgICBvZmZzZXQubWF0Y2hJZHggPSBudWxsOworICAgICAgdGhpcy5fcGFnZXNUb1NlYXJjaC0tOworCisgICAgICBpZiAob2Zmc2V0LnBhZ2VJZHggPj0gbnVtUGFnZXMgfHwgb2Zmc2V0LnBhZ2VJZHggPCAwKSB7CisgICAgICAgIG9mZnNldC5wYWdlSWR4ID0gcHJldmlvdXMgPyBudW1QYWdlcyAtIDEgOiAwOworICAgICAgICBvZmZzZXQud3JhcHBlZCA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3VwZGF0ZU1hdGNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZU1hdGNoKCkgeworICAgICAgdmFyIGZvdW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTsKKyAgICAgIHZhciBzdGF0ZSA9IEZpbmRTdGF0ZS5OT1RfRk9VTkQ7CisgICAgICB2YXIgd3JhcHBlZCA9IHRoaXMuX29mZnNldC53cmFwcGVkOworICAgICAgdGhpcy5fb2Zmc2V0LndyYXBwZWQgPSBmYWxzZTsKKworICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgIHZhciBwcmV2aW91c1BhZ2UgPSB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4OworICAgICAgICB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ID0gdGhpcy5fb2Zmc2V0LnBhZ2VJZHg7CisgICAgICAgIHRoaXMuX3NlbGVjdGVkLm1hdGNoSWR4ID0gdGhpcy5fb2Zmc2V0Lm1hdGNoSWR4OworICAgICAgICBzdGF0ZSA9IHdyYXBwZWQgPyBGaW5kU3RhdGUuV1JBUFBFRCA6IEZpbmRTdGF0ZS5GT1VORDsKKworICAgICAgICBpZiAocHJldmlvdXNQYWdlICE9PSAtMSAmJiBwcmV2aW91c1BhZ2UgIT09IHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHgpIHsKKyAgICAgICAgICB0aGlzLl91cGRhdGVQYWdlKHByZXZpb3VzUGFnZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZShzdGF0ZSwgdGhpcy5fc3RhdGUuZmluZFByZXZpb3VzKTsKKworICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggIT09IC0xKSB7CisgICAgICAgIHRoaXMuX3Njcm9sbE1hdGNoZXMgPSB0cnVlOworCisgICAgICAgIHRoaXMuX3VwZGF0ZVBhZ2UodGhpcy5fc2VsZWN0ZWQucGFnZUlkeCk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX29uRmluZEJhckNsb3NlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX29uRmluZEJhckNsb3NlKGV2dCkgeworICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CisKKyAgICAgIHZhciBwZGZEb2N1bWVudCA9IHRoaXMuX3BkZkRvY3VtZW50OworCisgICAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmICghX3RoaXM0Ll9wZGZEb2N1bWVudCB8fCBwZGZEb2N1bWVudCAmJiBfdGhpczQuX3BkZkRvY3VtZW50ICE9PSBwZGZEb2N1bWVudCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfdGhpczQuX2ZpbmRUaW1lb3V0KSB7CisgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzNC5fZmluZFRpbWVvdXQpOworICAgICAgICAgIF90aGlzNC5fZmluZFRpbWVvdXQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF90aGlzNC5fcmVzdW1lUGFnZUlkeCkgeworICAgICAgICAgIF90aGlzNC5fcmVzdW1lUGFnZUlkeCA9IG51bGw7CisgICAgICAgICAgX3RoaXM0Ll9kaXJ0eU1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIF90aGlzNC5fdXBkYXRlVUlTdGF0ZShGaW5kU3RhdGUuRk9VTkQpOworCisgICAgICAgIF90aGlzNC5faGlnaGxpZ2h0TWF0Y2hlcyA9IGZhbHNlOworCisgICAgICAgIF90aGlzNC5fdXBkYXRlQWxsUGFnZXMoKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9yZXF1ZXN0TWF0Y2hlc0NvdW50IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3JlcXVlc3RNYXRjaGVzQ291bnQoKSB7CisgICAgICB2YXIgX3RoaXMkX3NlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWQsCisgICAgICAgICAgcGFnZUlkeCA9IF90aGlzJF9zZWxlY3RlZC5wYWdlSWR4LAorICAgICAgICAgIG1hdGNoSWR4ID0gX3RoaXMkX3NlbGVjdGVkLm1hdGNoSWR4OworICAgICAgdmFyIGN1cnJlbnQgPSAwLAorICAgICAgICAgIHRvdGFsID0gdGhpcy5fbWF0Y2hlc0NvdW50VG90YWw7CisKKyAgICAgIGlmIChtYXRjaElkeCAhPT0gLTEpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlSWR4OyBpKyspIHsKKyAgICAgICAgICBjdXJyZW50ICs9IHRoaXMuX3BhZ2VNYXRjaGVzW2ldICYmIHRoaXMuX3BhZ2VNYXRjaGVzW2ldLmxlbmd0aCB8fCAwOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudCArPSBtYXRjaElkeCArIDE7CisgICAgICB9CisKKyAgICAgIGlmIChjdXJyZW50IDwgMSB8fCBjdXJyZW50ID4gdG90YWwpIHsKKyAgICAgICAgY3VycmVudCA9IHRvdGFsID0gMDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgY3VycmVudDogY3VycmVudCwKKyAgICAgICAgdG90YWw6IHRvdGFsCisgICAgICB9OworICAgIH0KKyAgfSwgeworICAgIGtleTogIl91cGRhdGVVSVJlc3VsdHNDb3VudCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVVSVJlc3VsdHNDb3VudCgpIHsKKyAgICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKCJ1cGRhdGVmaW5kbWF0Y2hlc2NvdW50IiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIG1hdGNoZXNDb3VudDogdGhpcy5fcmVxdWVzdE1hdGNoZXNDb3VudCgpCisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfdXBkYXRlVUlTdGF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVVSVN0YXRlKHN0YXRlLCBwcmV2aW91cykgeworICAgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goInVwZGF0ZWZpbmRjb250cm9sc3RhdGUiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgc3RhdGU6IHN0YXRlLAorICAgICAgICBwcmV2aW91czogcHJldmlvdXMsCisgICAgICAgIG1hdGNoZXNDb3VudDogdGhpcy5fcmVxdWVzdE1hdGNoZXNDb3VudCgpLAorICAgICAgICByYXdRdWVyeTogdGhpcy5fc3RhdGUgPyB0aGlzLl9zdGF0ZS5xdWVyeSA6IG51bGwKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImhpZ2hsaWdodE1hdGNoZXMiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXM7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicGFnZU1hdGNoZXMiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VNYXRjaGVzOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBhZ2VNYXRjaGVzTGVuZ3RoIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlTWF0Y2hlc0xlbmd0aDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzZWxlY3RlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic3RhdGUiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9xdWVyeSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICBpZiAodGhpcy5fc3RhdGUucXVlcnkgIT09IHRoaXMuX3Jhd1F1ZXJ5KSB7CisgICAgICAgIHRoaXMuX3Jhd1F1ZXJ5ID0gdGhpcy5fc3RhdGUucXVlcnk7CisgICAgICAgIHRoaXMuX25vcm1hbGl6ZWRRdWVyeSA9IG5vcm1hbGl6ZSh0aGlzLl9zdGF0ZS5xdWVyeSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVkUXVlcnk7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERkZpbmRDb250cm9sbGVyOworfSgpOworCitleHBvcnRzLlBERkZpbmRDb250cm9sbGVyID0gUERGRmluZENvbnRyb2xsZXI7CisKKy8qKiovIH0pLAorLyogMTQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRDaGFyYWN0ZXJUeXBlID0gZ2V0Q2hhcmFjdGVyVHlwZTsKK2V4cG9ydHMuQ2hhcmFjdGVyVHlwZSA9IHZvaWQgMDsKK3ZhciBDaGFyYWN0ZXJUeXBlID0geworICBTUEFDRTogMCwKKyAgQUxQSEFfTEVUVEVSOiAxLAorICBQVU5DVDogMiwKKyAgSEFOX0xFVFRFUjogMywKKyAgS0FUQUtBTkFfTEVUVEVSOiA0LAorICBISVJBR0FOQV9MRVRURVI6IDUsCisgIEhBTEZXSURUSF9LQVRBS0FOQV9MRVRURVI6IDYsCisgIFRIQUlfTEVUVEVSOiA3Cit9OworZXhwb3J0cy5DaGFyYWN0ZXJUeXBlID0gQ2hhcmFjdGVyVHlwZTsKKworZnVuY3Rpb24gaXNBbHBoYWJldGljYWxTY3JpcHQoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlIDwgMHgyZTgwOworfQorCitmdW5jdGlvbiBpc0FzY2lpKGNoYXJDb2RlKSB7CisgIHJldHVybiAoY2hhckNvZGUgJiAweGZmODApID09PSAwOworfQorCitmdW5jdGlvbiBpc0FzY2lpQWxwaGEoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlID49IDB4NjEgJiYgY2hhckNvZGUgPD0gMHg3YSB8fCBjaGFyQ29kZSA+PSAweDQxICYmIGNoYXJDb2RlIDw9IDB4NWE7Cit9CisKK2Z1bmN0aW9uIGlzQXNjaWlEaWdpdChjaGFyQ29kZSkgeworICByZXR1cm4gY2hhckNvZGUgPj0gMHgzMCAmJiBjaGFyQ29kZSA8PSAweDM5OworfQorCitmdW5jdGlvbiBpc0FzY2lpU3BhY2UoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlID09PSAweDIwIHx8IGNoYXJDb2RlID09PSAweDA5IHx8IGNoYXJDb2RlID09PSAweDBkIHx8IGNoYXJDb2RlID09PSAweDBhOworfQorCitmdW5jdGlvbiBpc0hhbihjaGFyQ29kZSkgeworICByZXR1cm4gY2hhckNvZGUgPj0gMHgzNDAwICYmIGNoYXJDb2RlIDw9IDB4OWZmZiB8fCBjaGFyQ29kZSA+PSAweGY5MDAgJiYgY2hhckNvZGUgPD0gMHhmYWZmOworfQorCitmdW5jdGlvbiBpc0thdGFrYW5hKGNoYXJDb2RlKSB7CisgIHJldHVybiBjaGFyQ29kZSA+PSAweDMwYTAgJiYgY2hhckNvZGUgPD0gMHgzMGZmOworfQorCitmdW5jdGlvbiBpc0hpcmFnYW5hKGNoYXJDb2RlKSB7CisgIHJldHVybiBjaGFyQ29kZSA+PSAweDMwNDAgJiYgY2hhckNvZGUgPD0gMHgzMDlmOworfQorCitmdW5jdGlvbiBpc0hhbGZ3aWR0aEthdGFrYW5hKGNoYXJDb2RlKSB7CisgIHJldHVybiBjaGFyQ29kZSA+PSAweGZmNjAgJiYgY2hhckNvZGUgPD0gMHhmZjlmOworfQorCitmdW5jdGlvbiBpc1RoYWkoY2hhckNvZGUpIHsKKyAgcmV0dXJuIChjaGFyQ29kZSAmIDB4ZmY4MCkgPT09IDB4MGUwMDsKK30KKworZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyVHlwZShjaGFyQ29kZSkgeworICBpZiAoaXNBbHBoYWJldGljYWxTY3JpcHQoY2hhckNvZGUpKSB7CisgICAgaWYgKGlzQXNjaWkoY2hhckNvZGUpKSB7CisgICAgICBpZiAoaXNBc2NpaVNwYWNlKGNoYXJDb2RlKSkgeworICAgICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5TUEFDRTsKKyAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaUFscGhhKGNoYXJDb2RlKSB8fCBpc0FzY2lpRGlnaXQoY2hhckNvZGUpIHx8IGNoYXJDb2RlID09PSAweDVmKSB7CisgICAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuUFVOQ1Q7CisgICAgfSBlbHNlIGlmIChpc1RoYWkoY2hhckNvZGUpKSB7CisgICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5USEFJX0xFVFRFUjsKKyAgICB9IGVsc2UgaWYgKGNoYXJDb2RlID09PSAweGEwKSB7CisgICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5TUEFDRTsKKyAgICB9CisKKyAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVI7CisgIH0KKworICBpZiAoaXNIYW4oY2hhckNvZGUpKSB7CisgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSEFOX0xFVFRFUjsKKyAgfSBlbHNlIGlmIChpc0thdGFrYW5hKGNoYXJDb2RlKSkgeworICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLktBVEFLQU5BX0xFVFRFUjsKKyAgfSBlbHNlIGlmIChpc0hpcmFnYW5hKGNoYXJDb2RlKSkgeworICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkhJUkFHQU5BX0xFVFRFUjsKKyAgfSBlbHNlIGlmIChpc0hhbGZ3aWR0aEthdGFrYW5hKGNoYXJDb2RlKSkgeworICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkhBTEZXSURUSF9LQVRBS0FOQV9MRVRURVI7CisgIH0KKworICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVI7Cit9CisKKy8qKiovIH0pLAorLyogMTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5pc0Rlc3RIYXNoZXNFcXVhbCA9IGlzRGVzdEhhc2hlc0VxdWFsOworZXhwb3J0cy5pc0Rlc3RBcnJheXNFcXVhbCA9IGlzRGVzdEFycmF5c0VxdWFsOworZXhwb3J0cy5QREZIaXN0b3J5ID0gdm9pZCAwOworCit2YXIgX3VpX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9CisKK2Z1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0KKworZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KKworZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9CisKK2Z1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJ1bmRlZmluZWQiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuOyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVkOyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVsicmV0dXJuIl0gIT0gbnVsbCkgX2lbInJldHVybiJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfQorCitmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBIQVNIX0NIQU5HRV9USU1FT1VUID0gMTAwMDsKK3ZhciBQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRCA9IDUwOwordmFyIFVQREFURV9WSUVXQVJFQV9USU1FT1VUID0gMTAwMDsKKworZnVuY3Rpb24gZ2V0Q3VycmVudEhhc2goKSB7CisgIHJldHVybiBkb2N1bWVudC5sb2NhdGlvbi5oYXNoOworfQorCit2YXIgUERGSGlzdG9yeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBERkhpc3RvcnkoX3JlZikgeworICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICB2YXIgbGlua1NlcnZpY2UgPSBfcmVmLmxpbmtTZXJ2aWNlLAorICAgICAgICBldmVudEJ1cyA9IF9yZWYuZXZlbnRCdXM7CisKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGSGlzdG9yeSk7CisKKyAgICB0aGlzLmxpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7CisgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOworICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7CisgICAgdGhpcy5fZmluZ2VycHJpbnQgPSAiIjsKKyAgICB0aGlzLnJlc2V0KCk7CisgICAgdGhpcy5fYm91bmRFdmVudHMgPSBudWxsOworICAgIHRoaXMuX2lzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlID0gZmFsc2U7CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigicHJlc2VudGF0aW9ubW9kZWNoYW5nZWQiLCBmdW5jdGlvbiAoZXZ0KSB7CisgICAgICBfdGhpcy5faXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUgPSBldnQuYWN0aXZlIHx8IGV2dC5zd2l0Y2hJblByb2dyZXNzOworICAgIH0pOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInBhZ2VzaW5pdCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIF90aGlzLl9pc1BhZ2VzTG9hZGVkID0gZmFsc2U7CisKKyAgICAgIHZhciBvblBhZ2VzTG9hZGVkID0gZnVuY3Rpb24gb25QYWdlc0xvYWRlZChldnQpIHsKKyAgICAgICAgX3RoaXMuZXZlbnRCdXMuX29mZigicGFnZXNsb2FkZWQiLCBvblBhZ2VzTG9hZGVkKTsKKworICAgICAgICBfdGhpcy5faXNQYWdlc0xvYWRlZCA9ICEhZXZ0LnBhZ2VzQ291bnQ7CisgICAgICB9OworCisgICAgICBfdGhpcy5ldmVudEJ1cy5fb24oInBhZ2VzbG9hZGVkIiwgb25QYWdlc0xvYWRlZCk7CisgICAgfSk7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGSGlzdG9yeSwgW3sKKyAgICBrZXk6ICJpbml0aWFsaXplIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShfcmVmMikgeworICAgICAgdmFyIGZpbmdlcnByaW50ID0gX3JlZjIuZmluZ2VycHJpbnQsCisgICAgICAgICAgX3JlZjIkcmVzZXRIaXN0b3J5ID0gX3JlZjIucmVzZXRIaXN0b3J5LAorICAgICAgICAgIHJlc2V0SGlzdG9yeSA9IF9yZWYyJHJlc2V0SGlzdG9yeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiRyZXNldEhpc3RvcnksCisgICAgICAgICAgX3JlZjIkdXBkYXRlVXJsID0gX3JlZjIudXBkYXRlVXJsLAorICAgICAgICAgIHVwZGF0ZVVybCA9IF9yZWYyJHVwZGF0ZVVybCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiR1cGRhdGVVcmw7CisKKyAgICAgIGlmICghZmluZ2VycHJpbnQgfHwgdHlwZW9mIGZpbmdlcnByaW50ICE9PSAic3RyaW5nIikgeworICAgICAgICBjb25zb2xlLmVycm9yKCdQREZIaXN0b3J5LmluaXRpYWxpemU6IFRoZSAiZmluZ2VycHJpbnQiIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgeworICAgICAgICB0aGlzLnJlc2V0KCk7CisgICAgICB9CisKKyAgICAgIHZhciByZUluaXRpYWxpemVkID0gdGhpcy5fZmluZ2VycHJpbnQgIT09ICIiICYmIHRoaXMuX2ZpbmdlcnByaW50ICE9PSBmaW5nZXJwcmludDsKKyAgICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7CisgICAgICB0aGlzLl91cGRhdGVVcmwgPSB1cGRhdGVVcmwgPT09IHRydWU7CisgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgIHRoaXMuX2JpbmRFdmVudHMoKTsKKworICAgICAgdmFyIHN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7CisgICAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIHRoaXMuX2Jsb2NrSGFzaENoYW5nZSA9IDA7CisgICAgICB0aGlzLl9jdXJyZW50SGFzaCA9IGdldEN1cnJlbnRIYXNoKCk7CisgICAgICB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMgPSAwOworICAgICAgdGhpcy5fdWlkID0gdGhpcy5fbWF4VWlkID0gMDsKKyAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0gbnVsbDsKKyAgICAgIHRoaXMuX3Bvc2l0aW9uID0gbnVsbDsKKworICAgICAgaWYgKCF0aGlzLl9pc1ZhbGlkU3RhdGUoc3RhdGUsIHRydWUpIHx8IHJlc2V0SGlzdG9yeSkgeworICAgICAgICB2YXIgX3RoaXMkX3BhcnNlQ3VycmVudEhhID0gdGhpcy5fcGFyc2VDdXJyZW50SGFzaCh0cnVlKSwKKyAgICAgICAgICAgIGhhc2ggPSBfdGhpcyRfcGFyc2VDdXJyZW50SGEuaGFzaCwKKyAgICAgICAgICAgIHBhZ2UgPSBfdGhpcyRfcGFyc2VDdXJyZW50SGEucGFnZSwKKyAgICAgICAgICAgIHJvdGF0aW9uID0gX3RoaXMkX3BhcnNlQ3VycmVudEhhLnJvdGF0aW9uOworCisgICAgICAgIGlmICghaGFzaCB8fCByZUluaXRpYWxpemVkIHx8IHJlc2V0SGlzdG9yeSkgeworICAgICAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShudWxsLCB0cnVlKTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZSh7CisgICAgICAgICAgaGFzaDogaGFzaCwKKyAgICAgICAgICBwYWdlOiBwYWdlLAorICAgICAgICAgIHJvdGF0aW9uOiByb3RhdGlvbgorICAgICAgICB9LCB0cnVlKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHN0YXRlLmRlc3RpbmF0aW9uOworCisgICAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKGRlc3RpbmF0aW9uLCBzdGF0ZS51aWQsIHRydWUpOworCisgICAgICBpZiAodGhpcy5fdWlkID4gdGhpcy5fbWF4VWlkKSB7CisgICAgICAgIHRoaXMuX21heFVpZCA9IHRoaXMuX3VpZDsKKyAgICAgIH0KKworICAgICAgaWYgKGRlc3RpbmF0aW9uLnJvdGF0aW9uICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhpcy5faW5pdGlhbFJvdGF0aW9uID0gZGVzdGluYXRpb24ucm90YXRpb247CisgICAgICB9CisKKyAgICAgIGlmIChkZXN0aW5hdGlvbi5kZXN0KSB7CisgICAgICAgIHRoaXMuX2luaXRpYWxCb29rbWFyayA9IEpTT04uc3RyaW5naWZ5KGRlc3RpbmF0aW9uLmRlc3QpOworICAgICAgICB0aGlzLl9kZXN0aW5hdGlvbi5wYWdlID0gbnVsbDsKKyAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uaGFzaCkgeworICAgICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBkZXN0aW5hdGlvbi5oYXNoOworICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5wYWdlKSB7CisgICAgICAgIHRoaXMuX2luaXRpYWxCb29rbWFyayA9ICJwYWdlPSIuY29uY2F0KGRlc3RpbmF0aW9uLnBhZ2UpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogInJlc2V0IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7CisgICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgdGhpcy5fcGFnZUhpZGUoKTsKKworICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgIHRoaXMuX3VuYmluZEV2ZW50cygpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpOworICAgICAgICB0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQgPSBudWxsOworICAgICAgfQorCisgICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBudWxsOworICAgICAgdGhpcy5faW5pdGlhbFJvdGF0aW9uID0gbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwdXNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaChfcmVmMykgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHZhciBfcmVmMyRuYW1lZERlc3QgPSBfcmVmMy5uYW1lZERlc3QsCisgICAgICAgICAgbmFtZWREZXN0ID0gX3JlZjMkbmFtZWREZXN0ID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjMkbmFtZWREZXN0LAorICAgICAgICAgIGV4cGxpY2l0RGVzdCA9IF9yZWYzLmV4cGxpY2l0RGVzdCwKKyAgICAgICAgICBwYWdlTnVtYmVyID0gX3JlZjMucGFnZU51bWJlcjsKKworICAgICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChuYW1lZERlc3QgJiYgdHlwZW9mIG5hbWVkRGVzdCAhPT0gInN0cmluZyIpIHsKKyAgICAgICAgY29uc29sZS5lcnJvcigiUERGSGlzdG9yeS5wdXNoOiAiICsgIlwiIi5jb25jYXQobmFtZWREZXN0LCAiXCIgaXMgbm90IGEgdmFsaWQgbmFtZWREZXN0IHBhcmFtZXRlci4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoZXhwbGljaXREZXN0KSkgeworICAgICAgICBjb25zb2xlLmVycm9yKCJQREZIaXN0b3J5LnB1c2g6ICIgKyAiXCIiLmNvbmNhdChleHBsaWNpdERlc3QsICJcIiBpcyBub3QgYSB2YWxpZCBleHBsaWNpdERlc3QgcGFyYW1ldGVyLiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmICghKE51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikgJiYgcGFnZU51bWJlciA+IDAgJiYgcGFnZU51bWJlciA8PSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2VzQ291bnQpKSB7CisgICAgICAgIGlmIChwYWdlTnVtYmVyICE9PSBudWxsIHx8IHRoaXMuX2Rlc3RpbmF0aW9uKSB7CisgICAgICAgICAgY29uc29sZS5lcnJvcigiUERGSGlzdG9yeS5wdXNoOiAiICsgIlwiIi5jb25jYXQocGFnZU51bWJlciwgIlwiIGlzIG5vdCBhIHZhbGlkIHBhZ2VOdW1iZXIgcGFyYW1ldGVyLiIpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGhhc2ggPSBuYW1lZERlc3QgfHwgSlNPTi5zdHJpbmdpZnkoZXhwbGljaXREZXN0KTsKKworICAgICAgaWYgKCFoYXNoKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGZvcmNlUmVwbGFjZSA9IGZhbHNlOworCisgICAgICBpZiAodGhpcy5fZGVzdGluYXRpb24gJiYgKGlzRGVzdEhhc2hlc0VxdWFsKHRoaXMuX2Rlc3RpbmF0aW9uLmhhc2gsIGhhc2gpIHx8IGlzRGVzdEFycmF5c0VxdWFsKHRoaXMuX2Rlc3RpbmF0aW9uLmRlc3QsIGV4cGxpY2l0RGVzdCkpKSB7CisgICAgICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5wYWdlKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yY2VSZXBsYWNlID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyAmJiAhZm9yY2VSZXBsYWNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHsKKyAgICAgICAgZGVzdDogZXhwbGljaXREZXN0LAorICAgICAgICBoYXNoOiBoYXNoLAorICAgICAgICBwYWdlOiBwYWdlTnVtYmVyLAorICAgICAgICByb3RhdGlvbjogdGhpcy5saW5rU2VydmljZS5yb3RhdGlvbgorICAgICAgfSwgZm9yY2VSZXBsYWNlKTsKKworICAgICAgaWYgKCF0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHsKKyAgICAgICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgX3RoaXMyLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAicHVzaEN1cnJlbnRQb3NpdGlvbiIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHB1c2hDdXJyZW50UG9zaXRpb24oKSB7CisgICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkIHx8IHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX3RyeVB1c2hDdXJyZW50UG9zaXRpb24oKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJiYWNrIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gYmFjaygpIHsKKyAgICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7CisKKyAgICAgIGlmICh0aGlzLl9pc1ZhbGlkU3RhdGUoc3RhdGUpICYmIHN0YXRlLnVpZCA+IDApIHsKKyAgICAgICAgd2luZG93Lmhpc3RvcnkuYmFjaygpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImZvcndhcmQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBmb3J3YXJkKCkgeworICAgICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgc3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTsKKworICAgICAgaWYgKHRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSkgJiYgc3RhdGUudWlkIDwgdGhpcy5fbWF4VWlkKSB7CisgICAgICAgIHdpbmRvdy5oaXN0b3J5LmZvcndhcmQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcHVzaE9yUmVwbGFjZVN0YXRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3B1c2hPclJlcGxhY2VTdGF0ZShkZXN0aW5hdGlvbikgeworICAgICAgdmFyIGZvcmNlUmVwbGFjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisgICAgICB2YXIgc2hvdWxkUmVwbGFjZSA9IGZvcmNlUmVwbGFjZSB8fCAhdGhpcy5fZGVzdGluYXRpb247CisgICAgICB2YXIgbmV3U3RhdGUgPSB7CisgICAgICAgIGZpbmdlcnByaW50OiB0aGlzLl9maW5nZXJwcmludCwKKyAgICAgICAgdWlkOiBzaG91bGRSZXBsYWNlID8gdGhpcy5fdWlkIDogdGhpcy5fdWlkICsgMSwKKyAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uCisgICAgICB9OworCisgICAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKGRlc3RpbmF0aW9uLCBuZXdTdGF0ZS51aWQpOworCisgICAgICB2YXIgbmV3VXJsOworCisgICAgICBpZiAodGhpcy5fdXBkYXRlVXJsICYmIGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLmhhc2gpIHsKKyAgICAgICAgdmFyIGJhc2VVcmwgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLnNwbGl0KCIjIilbMF07CisKKyAgICAgICAgaWYgKCFiYXNlVXJsLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSkgeworICAgICAgICAgIG5ld1VybCA9ICIiLmNvbmNhdChiYXNlVXJsLCAiIyIpLmNvbmNhdChkZXN0aW5hdGlvbi5oYXNoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc2hvdWxkUmVwbGFjZSkgeworICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobmV3U3RhdGUsICIiLCBuZXdVcmwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fbWF4VWlkID0gdGhpcy5fdWlkOworICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobmV3U3RhdGUsICIiLCBuZXdVcmwpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIl90cnlQdXNoQ3VycmVudFBvc2l0aW9uIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3RyeVB1c2hDdXJyZW50UG9zaXRpb24oKSB7CisgICAgICB2YXIgdGVtcG9yYXJ5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTsKKworICAgICAgaWYgKCF0aGlzLl9wb3NpdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uOworCisgICAgICBpZiAodGVtcG9yYXJ5KSB7CisgICAgICAgIHBvc2l0aW9uID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLl9wb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uLnRlbXBvcmFyeSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICghdGhpcy5fZGVzdGluYXRpb24pIHsKKyAgICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHBvc2l0aW9uKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHsKKyAgICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHBvc2l0aW9uLCB0cnVlKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5oYXNoID09PSBwb3NpdGlvbi5oYXNoKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLl9kZXN0aW5hdGlvbi5wYWdlICYmIChQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRCA8PSAwIHx8IHRoaXMuX251bVBvc2l0aW9uVXBkYXRlcyA8PSBQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgZm9yY2VSZXBsYWNlID0gZmFsc2U7CisKKyAgICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5wYWdlID49IHBvc2l0aW9uLmZpcnN0ICYmIHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgPD0gcG9zaXRpb24ucGFnZSkgeworICAgICAgICBpZiAodGhpcy5fZGVzdGluYXRpb24uZGVzdCB8fCAhdGhpcy5fZGVzdGluYXRpb24uZmlyc3QpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3JjZVJlcGxhY2UgPSB0cnVlOworICAgICAgfQorCisgICAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUocG9zaXRpb24sIGZvcmNlUmVwbGFjZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2lzVmFsaWRTdGF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9pc1ZhbGlkU3RhdGUoc3RhdGUpIHsKKyAgICAgIHZhciBjaGVja1JlbG9hZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisKKyAgICAgIGlmICghc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGUuZmluZ2VycHJpbnQgIT09IHRoaXMuX2ZpbmdlcnByaW50KSB7CisgICAgICAgIGlmIChjaGVja1JlbG9hZCkgeworICAgICAgICAgIGlmICh0eXBlb2Ygc3RhdGUuZmluZ2VycHJpbnQgIT09ICJzdHJpbmciIHx8IHN0YXRlLmZpbmdlcnByaW50Lmxlbmd0aCAhPT0gdGhpcy5fZmluZ2VycHJpbnQubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIF9wZXJmb3JtYW5jZSRnZXRFbnRyaSA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoIm5hdmlnYXRpb24iKSwKKyAgICAgICAgICAgICAgX3BlcmZvcm1hbmNlJGdldEVudHJpMiA9IF9zbGljZWRUb0FycmF5KF9wZXJmb3JtYW5jZSRnZXRFbnRyaSwgMSksCisgICAgICAgICAgICAgIHBlcmZFbnRyeSA9IF9wZXJmb3JtYW5jZSRnZXRFbnRyaTJbMF07CisKKyAgICAgICAgICBpZiAoIXBlcmZFbnRyeSB8fCBwZXJmRW50cnkudHlwZSAhPT0gInJlbG9hZCIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihzdGF0ZS51aWQpIHx8IHN0YXRlLnVpZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGUuZGVzdGluYXRpb24gPT09IG51bGwgfHwgX3R5cGVvZihzdGF0ZS5kZXN0aW5hdGlvbikgIT09ICJvYmplY3QiKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3VwZGF0ZUludGVybmFsU3RhdGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlSW50ZXJuYWxTdGF0ZShkZXN0aW5hdGlvbiwgdWlkKSB7CisgICAgICB2YXIgcmVtb3ZlVGVtcG9yYXJ5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTsKKworICAgICAgaWYgKHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCkgeworICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KTsKKyAgICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHJlbW92ZVRlbXBvcmFyeSAmJiBkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHsKKyAgICAgICAgZGVsZXRlIGRlc3RpbmF0aW9uLnRlbXBvcmFyeTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKKyAgICAgIHRoaXMuX3VpZCA9IHVpZDsKKyAgICAgIHRoaXMuX251bVBvc2l0aW9uVXBkYXRlcyA9IDA7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3BhcnNlQ3VycmVudEhhc2giLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFyc2VDdXJyZW50SGFzaCgpIHsKKyAgICAgIHZhciBjaGVja05hbWVkZGVzdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CisgICAgICB2YXIgaGFzaCA9IHVuZXNjYXBlKGdldEN1cnJlbnRIYXNoKCkpLnN1YnN0cmluZygxKTsKKyAgICAgIHZhciBwYXJhbXMgPSAoMCwgX3VpX3V0aWxzLnBhcnNlUXVlcnlTdHJpbmcpKGhhc2gpOworICAgICAgdmFyIG5hbWVkZGVzdCA9IHBhcmFtcy5uYW1lZGRlc3QgfHwgIiI7CisgICAgICB2YXIgcGFnZSA9IHBhcmFtcy5wYWdlIHwgMDsKKworICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID4gMCAmJiBwYWdlIDw9IHRoaXMubGlua1NlcnZpY2UucGFnZXNDb3VudCkgfHwgY2hlY2tOYW1lZGRlc3QgJiYgbmFtZWRkZXN0Lmxlbmd0aCA+IDApIHsKKyAgICAgICAgcGFnZSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIGhhc2g6IGhhc2gsCisgICAgICAgIHBhZ2U6IHBhZ2UsCisgICAgICAgIHJvdGF0aW9uOiB0aGlzLmxpbmtTZXJ2aWNlLnJvdGF0aW9uCisgICAgICB9OworICAgIH0KKyAgfSwgeworICAgIGtleTogIl91cGRhdGVWaWV3YXJlYSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVWaWV3YXJlYShfcmVmNCkgeworICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CisKKyAgICAgIHZhciBsb2NhdGlvbiA9IF9yZWY0LmxvY2F0aW9uOworCisgICAgICBpZiAodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpOworICAgICAgICB0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQgPSBudWxsOworICAgICAgfQorCisgICAgICB0aGlzLl9wb3NpdGlvbiA9IHsKKyAgICAgICAgaGFzaDogdGhpcy5faXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUgPyAicGFnZT0iLmNvbmNhdChsb2NhdGlvbi5wYWdlTnVtYmVyKSA6IGxvY2F0aW9uLnBkZk9wZW5QYXJhbXMuc3Vic3RyaW5nKDEpLAorICAgICAgICBwYWdlOiB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UsCisgICAgICAgIGZpcnN0OiBsb2NhdGlvbi5wYWdlTnVtYmVyLAorICAgICAgICByb3RhdGlvbjogbG9jYXRpb24ucm90YXRpb24KKyAgICAgIH07CisKKyAgICAgIGlmICh0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPiAwICYmIHRoaXMuX2lzUGFnZXNMb2FkZWQgJiYgdGhpcy5fZGVzdGluYXRpb24gJiYgIXRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UpIHsKKyAgICAgICAgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzKys7CisgICAgICB9CisKKyAgICAgIGlmIChVUERBVEVfVklFV0FSRUFfVElNRU9VVCA+IDApIHsKKyAgICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgaWYgKCFfdGhpczMuX3BvcFN0YXRlSW5Qcm9ncmVzcykgeworICAgICAgICAgICAgX3RoaXMzLl90cnlQdXNoQ3VycmVudFBvc2l0aW9uKHRydWUpOworICAgICAgICAgIH0KKworICAgICAgICAgIF90aGlzMy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDsKKyAgICAgICAgfSwgVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVQpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIl9wb3BTdGF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9wb3BTdGF0ZShfcmVmNSkgeworICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CisKKyAgICAgIHZhciBzdGF0ZSA9IF9yZWY1LnN0YXRlOworICAgICAgdmFyIG5ld0hhc2ggPSBnZXRDdXJyZW50SGFzaCgpLAorICAgICAgICAgIGhhc2hDaGFuZ2VkID0gdGhpcy5fY3VycmVudEhhc2ggIT09IG5ld0hhc2g7CisgICAgICB0aGlzLl9jdXJyZW50SGFzaCA9IG5ld0hhc2g7CisKKyAgICAgIGlmICghc3RhdGUpIHsKKyAgICAgICAgdGhpcy5fdWlkKys7CisKKyAgICAgICAgdmFyIF90aGlzJF9wYXJzZUN1cnJlbnRIYTIgPSB0aGlzLl9wYXJzZUN1cnJlbnRIYXNoKCksCisgICAgICAgICAgICBoYXNoID0gX3RoaXMkX3BhcnNlQ3VycmVudEhhMi5oYXNoLAorICAgICAgICAgICAgcGFnZSA9IF90aGlzJF9wYXJzZUN1cnJlbnRIYTIucGFnZSwKKyAgICAgICAgICAgIHJvdGF0aW9uID0gX3RoaXMkX3BhcnNlQ3VycmVudEhhMi5yb3RhdGlvbjsKKworICAgICAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUoeworICAgICAgICAgIGhhc2g6IGhhc2gsCisgICAgICAgICAgcGFnZTogcGFnZSwKKyAgICAgICAgICByb3RhdGlvbjogcm90YXRpb24KKyAgICAgICAgfSwgdHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSB0cnVlOworCisgICAgICBpZiAoaGFzaENoYW5nZWQpIHsKKyAgICAgICAgdGhpcy5fYmxvY2tIYXNoQ2hhbmdlKys7CisgICAgICAgICgwLCBfdWlfdXRpbHMud2FpdE9uRXZlbnRPclRpbWVvdXQpKHsKKyAgICAgICAgICB0YXJnZXQ6IHdpbmRvdywKKyAgICAgICAgICBuYW1lOiAiaGFzaGNoYW5nZSIsCisgICAgICAgICAgZGVsYXk6IEhBU0hfQ0hBTkdFX1RJTUVPVVQKKyAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgX3RoaXM0Ll9ibG9ja0hhc2hDaGFuZ2UtLTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHN0YXRlLmRlc3RpbmF0aW9uOworCisgICAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKGRlc3RpbmF0aW9uLCBzdGF0ZS51aWQsIHRydWUpOworCisgICAgICBpZiAodGhpcy5fdWlkID4gdGhpcy5fbWF4VWlkKSB7CisgICAgICAgIHRoaXMuX21heFVpZCA9IHRoaXMuX3VpZDsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfdWlfdXRpbHMuaXNWYWxpZFJvdGF0aW9uKShkZXN0aW5hdGlvbi5yb3RhdGlvbikpIHsKKyAgICAgICAgdGhpcy5saW5rU2VydmljZS5yb3RhdGlvbiA9IGRlc3RpbmF0aW9uLnJvdGF0aW9uOworICAgICAgfQorCisgICAgICBpZiAoZGVzdGluYXRpb24uZGVzdCkgeworICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLm5hdmlnYXRlVG8oZGVzdGluYXRpb24uZGVzdCk7CisgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmhhc2gpIHsKKyAgICAgICAgdGhpcy5saW5rU2VydmljZS5zZXRIYXNoKGRlc3RpbmF0aW9uLmhhc2gpOworICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5wYWdlKSB7CisgICAgICAgIHRoaXMubGlua1NlcnZpY2UucGFnZSA9IGRlc3RpbmF0aW9uLnBhZ2U7CisgICAgICB9CisKKyAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBfdGhpczQuX3BvcFN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3BhZ2VIaWRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3BhZ2VIaWRlKCkgeworICAgICAgaWYgKCF0aGlzLl9kZXN0aW5hdGlvbiB8fCB0aGlzLl9kZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHsKKyAgICAgICAgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIl9iaW5kRXZlbnRzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2JpbmRFdmVudHMoKSB7CisgICAgICBpZiAodGhpcy5fYm91bmRFdmVudHMpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9ib3VuZEV2ZW50cyA9IHsKKyAgICAgICAgdXBkYXRlVmlld2FyZWE6IHRoaXMuX3VwZGF0ZVZpZXdhcmVhLmJpbmQodGhpcyksCisgICAgICAgIHBvcFN0YXRlOiB0aGlzLl9wb3BTdGF0ZS5iaW5kKHRoaXMpLAorICAgICAgICBwYWdlSGlkZTogdGhpcy5fcGFnZUhpZGUuYmluZCh0aGlzKQorICAgICAgfTsKKworICAgICAgdGhpcy5ldmVudEJ1cy5fb24oInVwZGF0ZXZpZXdhcmVhIiwgdGhpcy5fYm91bmRFdmVudHMudXBkYXRlVmlld2FyZWEpOworCisgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCB0aGlzLl9ib3VuZEV2ZW50cy5wb3BTdGF0ZSk7CisgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLCB0aGlzLl9ib3VuZEV2ZW50cy5wYWdlSGlkZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3VuYmluZEV2ZW50cyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91bmJpbmRFdmVudHMoKSB7CisgICAgICBpZiAoIXRoaXMuX2JvdW5kRXZlbnRzKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKCJ1cGRhdGV2aWV3YXJlYSIsIHRoaXMuX2JvdW5kRXZlbnRzLnVwZGF0ZVZpZXdhcmVhKTsKKworICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIiwgdGhpcy5fYm91bmRFdmVudHMucG9wU3RhdGUpOworICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBhZ2VoaWRlIiwgdGhpcy5fYm91bmRFdmVudHMucGFnZUhpZGUpOworICAgICAgdGhpcy5fYm91bmRFdmVudHMgPSBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBvcFN0YXRlSW5Qcm9ncmVzcyIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQgJiYgKHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyB8fCB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UgPiAwKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpbml0aWFsQm9va21hcmsiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkID8gdGhpcy5faW5pdGlhbEJvb2ttYXJrIDogbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpbml0aWFsUm90YXRpb24iLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkID8gdGhpcy5faW5pdGlhbFJvdGF0aW9uIDogbnVsbDsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gUERGSGlzdG9yeTsKK30oKTsKKworZXhwb3J0cy5QREZIaXN0b3J5ID0gUERGSGlzdG9yeTsKKworZnVuY3Rpb24gaXNEZXN0SGFzaGVzRXF1YWwoZGVzdEhhc2gsIHB1c2hIYXNoKSB7CisgIGlmICh0eXBlb2YgZGVzdEhhc2ggIT09ICJzdHJpbmciIHx8IHR5cGVvZiBwdXNoSGFzaCAhPT0gInN0cmluZyIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoZGVzdEhhc2ggPT09IHB1c2hIYXNoKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2YXIgX3BhcnNlUXVlcnlTdHJpbmcgPSAoMCwgX3VpX3V0aWxzLnBhcnNlUXVlcnlTdHJpbmcpKGRlc3RIYXNoKSwKKyAgICAgIG5hbWVkZGVzdCA9IF9wYXJzZVF1ZXJ5U3RyaW5nLm5hbWVkZGVzdDsKKworICBpZiAobmFtZWRkZXN0ID09PSBwdXNoSGFzaCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitmdW5jdGlvbiBpc0Rlc3RBcnJheXNFcXVhbChmaXJzdERlc3QsIHNlY29uZERlc3QpIHsKKyAgZnVuY3Rpb24gaXNFbnRyeUVxdWFsKGZpcnN0LCBzZWNvbmQpIHsKKyAgICBpZiAoX3R5cGVvZihmaXJzdCkgIT09IF90eXBlb2Yoc2Vjb25kKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChBcnJheS5pc0FycmF5KGZpcnN0KSB8fCBBcnJheS5pc0FycmF5KHNlY29uZCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlyc3QgIT09IG51bGwgJiYgX3R5cGVvZihmaXJzdCkgPT09ICJvYmplY3QiICYmIHNlY29uZCAhPT0gbnVsbCkgeworICAgICAgaWYgKE9iamVjdC5rZXlzKGZpcnN0KS5sZW5ndGggIT09IE9iamVjdC5rZXlzKHNlY29uZCkubGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIga2V5IGluIGZpcnN0KSB7CisgICAgICAgIGlmICghaXNFbnRyeUVxdWFsKGZpcnN0W2tleV0sIHNlY29uZFtrZXldKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmlyc3QgPT09IHNlY29uZCB8fCBOdW1iZXIuaXNOYU4oZmlyc3QpICYmIE51bWJlci5pc05hTihzZWNvbmQpOworICB9CisKKyAgaWYgKCEoQXJyYXkuaXNBcnJheShmaXJzdERlc3QpICYmIEFycmF5LmlzQXJyYXkoc2Vjb25kRGVzdCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGZpcnN0RGVzdC5sZW5ndGggIT09IHNlY29uZERlc3QubGVuZ3RoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZm9yICh2YXIgaSA9IDAsIGlpID0gZmlyc3REZXN0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICBpZiAoIWlzRW50cnlFcXVhbChmaXJzdERlc3RbaV0sIHNlY29uZERlc3RbaV0pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiovIH0pLAorLyogMTYgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZQYWdlVmlldyA9IHZvaWQgMDsKKwordmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXyg0KSk7CisKK3ZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOworCit2YXIgX3BkZmpzTGliID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9wZGZfcmVuZGVyaW5nX3F1ZXVlID0gX193X3BkZmpzX3JlcXVpcmVfXygxNyk7CisKK3ZhciBfdmlld2VyX2NvbXBhdGliaWxpdHkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTsKKworZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgImRlZmF1bHQiOiBvYmogfTsgfQorCitmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9CisKK2Z1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCit2YXIgTUFYX0NBTlZBU19QSVhFTFMgPSBfdmlld2VyX2NvbXBhdGliaWxpdHkudmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcy5tYXhDYW52YXNQaXhlbHMgfHwgMTY3NzcyMTY7CisKK3ZhciBQREZQYWdlVmlldyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIFBERlBhZ2VWaWV3KG9wdGlvbnMpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGUGFnZVZpZXcpOworCisgICAgdmFyIGNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyOworICAgIHZhciBkZWZhdWx0Vmlld3BvcnQgPSBvcHRpb25zLmRlZmF1bHRWaWV3cG9ydDsKKyAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDsKKyAgICB0aGlzLnJlbmRlcmluZ0lkID0gInBhZ2UiICsgdGhpcy5pZDsKKyAgICB0aGlzLnBkZlBhZ2UgPSBudWxsOworICAgIHRoaXMucGFnZUxhYmVsID0gbnVsbDsKKyAgICB0aGlzLnJvdGF0aW9uID0gMDsKKyAgICB0aGlzLnNjYWxlID0gb3B0aW9ucy5zY2FsZSB8fCBfdWlfdXRpbHMuREVGQVVMVF9TQ0FMRTsKKyAgICB0aGlzLnZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0OworICAgIHRoaXMucGRmUGFnZVJvdGF0ZSA9IGRlZmF1bHRWaWV3cG9ydC5yb3RhdGlvbjsKKyAgICB0aGlzLl9hbm5vdGF0aW9uU3RvcmFnZSA9IG9wdGlvbnMuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbnVsbDsKKyAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9ucy5vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIHx8IG51bGw7CisgICAgdGhpcy5oYXNSZXN0cmljdGVkU2NhbGluZyA9IGZhbHNlOworICAgIHRoaXMudGV4dExheWVyTW9kZSA9IE51bWJlci5pc0ludGVnZXIob3B0aW9ucy50ZXh0TGF5ZXJNb2RlKSA/IG9wdGlvbnMudGV4dExheWVyTW9kZSA6IF91aV91dGlscy5UZXh0TGF5ZXJNb2RlLkVOQUJMRTsKKyAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IG9wdGlvbnMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8ICIiOworICAgIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IHR5cGVvZiBvcHRpb25zLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPT09ICJib29sZWFuIiA/IG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA6IHRydWU7CisgICAgdGhpcy51c2VPbmx5Q3NzWm9vbSA9IG9wdGlvbnMudXNlT25seUNzc1pvb20gfHwgZmFsc2U7CisgICAgdGhpcy5tYXhDYW52YXNQaXhlbHMgPSBvcHRpb25zLm1heENhbnZhc1BpeGVscyB8fCBNQVhfQ0FOVkFTX1BJWEVMUzsKKyAgICB0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1czsKKyAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gb3B0aW9ucy5yZW5kZXJpbmdRdWV1ZTsKKyAgICB0aGlzLnRleHRMYXllckZhY3RvcnkgPSBvcHRpb25zLnRleHRMYXllckZhY3Rvcnk7CisgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5ID0gb3B0aW9ucy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OworICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zLnJlbmRlcmVyIHx8IF91aV91dGlscy5SZW5kZXJlclR5cGUuQ0FOVkFTOworICAgIHRoaXMuZW5hYmxlV2ViR0wgPSBvcHRpb25zLmVuYWJsZVdlYkdMIHx8IGZhbHNlOworICAgIHRoaXMubDEwbiA9IG9wdGlvbnMubDEwbiB8fCBfdWlfdXRpbHMuTnVsbEwxMG47CisgICAgdGhpcy5wYWludFRhc2sgPSBudWxsOworICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwID0gbmV3IFdlYWtNYXAoKTsKKyAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw7CisgICAgdGhpcy5yZXN1bWUgPSBudWxsOworICAgIHRoaXMuZXJyb3IgPSBudWxsOworICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyID0gbnVsbDsKKyAgICB0aGlzLnRleHRMYXllciA9IG51bGw7CisgICAgdGhpcy56b29tTGF5ZXIgPSBudWxsOworICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICBkaXYuY2xhc3NOYW1lID0gInBhZ2UiOworICAgIGRpdi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC53aWR0aCkgKyAicHgiOworICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSArICJweCI7CisgICAgZGl2LnNldEF0dHJpYnV0ZSgiZGF0YS1wYWdlLW51bWJlciIsIHRoaXMuaWQpOworICAgIHRoaXMuZGl2ID0gZGl2OworICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpOworICB9CisKKyAgX2NyZWF0ZUNsYXNzKFBERlBhZ2VWaWV3LCBbeworICAgIGtleTogInNldFBkZlBhZ2UiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQZGZQYWdlKHBkZlBhZ2UpIHsKKyAgICAgIHRoaXMucGRmUGFnZSA9IHBkZlBhZ2U7CisgICAgICB0aGlzLnBkZlBhZ2VSb3RhdGUgPSBwZGZQYWdlLnJvdGF0ZTsKKyAgICAgIHZhciB0b3RhbFJvdGF0aW9uID0gKHRoaXMucm90YXRpb24gKyB0aGlzLnBkZlBhZ2VSb3RhdGUpICUgMzYwOworICAgICAgdGhpcy52aWV3cG9ydCA9IHBkZlBhZ2UuZ2V0Vmlld3BvcnQoeworICAgICAgICBzY2FsZTogdGhpcy5zY2FsZSAqIF91aV91dGlscy5DU1NfVU5JVFMsCisgICAgICAgIHJvdGF0aW9uOiB0b3RhbFJvdGF0aW9uCisgICAgICB9KTsKKyAgICAgIHRoaXMuc3RhdHMgPSBwZGZQYWdlLnN0YXRzOworICAgICAgdGhpcy5yZXNldCgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogImRlc3Ryb3kiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkgeworICAgICAgdGhpcy5yZXNldCgpOworCisgICAgICBpZiAodGhpcy5wZGZQYWdlKSB7CisgICAgICAgIHRoaXMucGRmUGFnZS5jbGVhbnVwKCk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3JlbmRlckFubm90YXRpb25MYXllciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBfcmVuZGVyQW5ub3RhdGlvbkxheWVyMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgeworICAgICAgICB2YXIgZXJyb3I7CisgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CisgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGVycm9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTsKKyAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uTGF5ZXIucmVuZGVyKHRoaXMudmlld3BvcnQsICJkaXNwbGF5Iik7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNjsKKyAgICAgICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0WyJjYXRjaCJdKDEpOworICAgICAgICAgICAgICAgIGVycm9yID0gX2NvbnRleHQudDA7CisKKyAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA5OworICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImFubm90YXRpb25sYXllcnJlbmRlcmVkIiwgeworICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCwKKyAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcgorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goOSk7CisKKyAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwgX2NhbGxlZSwgdGhpcywgW1sxLCA2LCA5LCAxMl1dKTsKKyAgICAgIH0pKTsKKworICAgICAgZnVuY3Rpb24gX3JlbmRlckFubm90YXRpb25MYXllcigpIHsKKyAgICAgICAgcmV0dXJuIF9yZW5kZXJBbm5vdGF0aW9uTGF5ZXIyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBfcmVuZGVyQW5ub3RhdGlvbkxheWVyOworICAgIH0oKQorICB9LCB7CisgICAga2V5OiAiX3Jlc2V0Wm9vbUxheWVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3Jlc2V0Wm9vbUxheWVyKCkgeworICAgICAgdmFyIHJlbW92ZUZyb21ET00gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlOworCisgICAgICBpZiAoIXRoaXMuem9vbUxheWVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHpvb21MYXllckNhbnZhcyA9IHRoaXMuem9vbUxheWVyLmZpcnN0Q2hpbGQ7CisgICAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcFsiZGVsZXRlIl0oem9vbUxheWVyQ2FudmFzKTsKKyAgICAgIHpvb21MYXllckNhbnZhcy53aWR0aCA9IDA7CisgICAgICB6b29tTGF5ZXJDYW52YXMuaGVpZ2h0ID0gMDsKKworICAgICAgaWYgKHJlbW92ZUZyb21ET00pIHsKKyAgICAgICAgdGhpcy56b29tTGF5ZXIucmVtb3ZlKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuem9vbUxheWVyID0gbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZXNldCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkgeworICAgICAgdmFyIGtlZXBab29tTGF5ZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlOworICAgICAgdmFyIGtlZXBBbm5vdGF0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisgICAgICB0aGlzLmNhbmNlbFJlbmRlcmluZyhrZWVwQW5ub3RhdGlvbnMpOworICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5JTklUSUFMOworICAgICAgdmFyIGRpdiA9IHRoaXMuZGl2OworICAgICAgZGl2LnN0eWxlLndpZHRoID0gTWF0aC5mbG9vcih0aGlzLnZpZXdwb3J0LndpZHRoKSArICJweCI7CisgICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gTWF0aC5mbG9vcih0aGlzLnZpZXdwb3J0LmhlaWdodCkgKyAicHgiOworICAgICAgdmFyIGNoaWxkTm9kZXMgPSBkaXYuY2hpbGROb2RlczsKKyAgICAgIHZhciBjdXJyZW50Wm9vbUxheWVyTm9kZSA9IGtlZXBab29tTGF5ZXIgJiYgdGhpcy56b29tTGF5ZXIgfHwgbnVsbDsKKyAgICAgIHZhciBjdXJyZW50QW5ub3RhdGlvbk5vZGUgPSBrZWVwQW5ub3RhdGlvbnMgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2IHx8IG51bGw7CisKKyAgICAgIGZvciAodmFyIGkgPSBjaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHZhciBub2RlID0gY2hpbGROb2Rlc1tpXTsKKworICAgICAgICBpZiAoY3VycmVudFpvb21MYXllck5vZGUgPT09IG5vZGUgfHwgY3VycmVudEFubm90YXRpb25Ob2RlID09PSBub2RlKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBkaXYucmVtb3ZlQ2hpbGQobm9kZSk7CisgICAgICB9CisKKyAgICAgIGRpdi5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbG9hZGVkIik7CisKKyAgICAgIGlmIChjdXJyZW50QW5ub3RhdGlvbk5vZGUpIHsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuaGlkZSgpOworICAgICAgfSBlbHNlIGlmICh0aGlzLmFubm90YXRpb25MYXllcikgeworICAgICAgICB0aGlzLmFubm90YXRpb25MYXllci5jYW5jZWwoKTsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoIWN1cnJlbnRab29tTGF5ZXJOb2RlKSB7CisgICAgICAgIGlmICh0aGlzLmNhbnZhcykgeworICAgICAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwWyJkZWxldGUiXSh0aGlzLmNhbnZhcyk7CisgICAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSAwOworICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IDA7CisgICAgICAgICAgZGVsZXRlIHRoaXMuY2FudmFzOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fcmVzZXRab29tTGF5ZXIoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuc3ZnKSB7CisgICAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwWyJkZWxldGUiXSh0aGlzLnN2Zyk7CisgICAgICAgIGRlbGV0ZSB0aGlzLnN2ZzsKKyAgICAgIH0KKworICAgICAgdGhpcy5sb2FkaW5nSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgdGhpcy5sb2FkaW5nSWNvbkRpdi5jbGFzc05hbWUgPSAibG9hZGluZ0ljb24iOworICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMubG9hZGluZ0ljb25EaXYpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInVwZGF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZShzY2FsZSwgcm90YXRpb24pIHsKKyAgICAgIHZhciBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsOworICAgICAgdGhpcy5zY2FsZSA9IHNjYWxlIHx8IHRoaXMuc2NhbGU7CisKKyAgICAgIGlmICh0eXBlb2Ygcm90YXRpb24gIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgIHRoaXMucm90YXRpb24gPSByb3RhdGlvbjsKKyAgICAgIH0KKworICAgICAgaWYgKG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7CisgICAgICAgIHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlOworICAgICAgfQorCisgICAgICB2YXIgdG90YWxSb3RhdGlvbiA9ICh0aGlzLnJvdGF0aW9uICsgdGhpcy5wZGZQYWdlUm90YXRlKSAlIDM2MDsKKyAgICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0LmNsb25lKHsKKyAgICAgICAgc2NhbGU6IHRoaXMuc2NhbGUgKiBfdWlfdXRpbHMuQ1NTX1VOSVRTLAorICAgICAgICByb3RhdGlvbjogdG90YWxSb3RhdGlvbgorICAgICAgfSk7CisKKyAgICAgIGlmICh0aGlzLnN2ZykgeworICAgICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLnN2ZywgdHJ1ZSk7CisgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInBhZ2VyZW5kZXJlZCIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCwKKyAgICAgICAgICBjc3NUcmFuc2Zvcm06IHRydWUsCisgICAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgaXNTY2FsaW5nUmVzdHJpY3RlZCA9IGZhbHNlOworCisgICAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5tYXhDYW52YXNQaXhlbHMgPiAwKSB7CisgICAgICAgIHZhciBvdXRwdXRTY2FsZSA9IHRoaXMub3V0cHV0U2NhbGU7CisKKyAgICAgICAgaWYgKChNYXRoLmZsb29yKHRoaXMudmlld3BvcnQud2lkdGgpICogb3V0cHV0U2NhbGUuc3ggfCAwKSAqIChNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSAqIG91dHB1dFNjYWxlLnN5IHwgMCkgPiB0aGlzLm1heENhbnZhc1BpeGVscykgeworICAgICAgICAgIGlzU2NhbGluZ1Jlc3RyaWN0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmNhbnZhcykgeworICAgICAgICBpZiAodGhpcy51c2VPbmx5Q3NzWm9vbSB8fCB0aGlzLmhhc1Jlc3RyaWN0ZWRTY2FsaW5nICYmIGlzU2NhbGluZ1Jlc3RyaWN0ZWQpIHsKKyAgICAgICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLmNhbnZhcywgdHJ1ZSk7CisgICAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgicGFnZXJlbmRlcmVkIiwgeworICAgICAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCwKKyAgICAgICAgICAgIGNzc1RyYW5zZm9ybTogdHJ1ZSwKKyAgICAgICAgICAgIHRpbWVzdGFtcDogcGVyZm9ybWFuY2Uubm93KCkKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuem9vbUxheWVyICYmICF0aGlzLmNhbnZhcy5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpKSB7CisgICAgICAgICAgdGhpcy56b29tTGF5ZXIgPSB0aGlzLmNhbnZhcy5wYXJlbnROb2RlOworICAgICAgICAgIHRoaXMuem9vbUxheWVyLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodGhpcy56b29tTGF5ZXIpIHsKKyAgICAgICAgdGhpcy5jc3NUcmFuc2Zvcm0odGhpcy56b29tTGF5ZXIuZmlyc3RDaGlsZCk7CisgICAgICB9CisKKyAgICAgIHRoaXMucmVzZXQodHJ1ZSwgdHJ1ZSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY2FuY2VsUmVuZGVyaW5nIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsUmVuZGVyaW5nKCkgeworICAgICAgdmFyIGtlZXBBbm5vdGF0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CisKKyAgICAgIGlmICh0aGlzLnBhaW50VGFzaykgeworICAgICAgICB0aGlzLnBhaW50VGFzay5jYW5jZWwoKTsKKyAgICAgICAgdGhpcy5wYWludFRhc2sgPSBudWxsOworICAgICAgfQorCisgICAgICB0aGlzLnJlc3VtZSA9IG51bGw7CisKKyAgICAgIGlmICh0aGlzLnRleHRMYXllcikgeworICAgICAgICB0aGlzLnRleHRMYXllci5jYW5jZWwoKTsKKyAgICAgICAgdGhpcy50ZXh0TGF5ZXIgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoIWtlZXBBbm5vdGF0aW9ucyAmJiB0aGlzLmFubm90YXRpb25MYXllcikgeworICAgICAgICB0aGlzLmFubm90YXRpb25MYXllci5jYW5jZWwoKTsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSBudWxsOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImNzc1RyYW5zZm9ybSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNzc1RyYW5zZm9ybSh0YXJnZXQpIHsKKyAgICAgIHZhciByZWRyYXdBbm5vdGF0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CisgICAgICB2YXIgd2lkdGggPSB0aGlzLnZpZXdwb3J0LndpZHRoOworICAgICAgdmFyIGhlaWdodCA9IHRoaXMudmlld3BvcnQuaGVpZ2h0OworICAgICAgdmFyIGRpdiA9IHRoaXMuZGl2OworICAgICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gdGFyZ2V0LnBhcmVudE5vZGUuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUud2lkdGggPSBNYXRoLmZsb29yKHdpZHRoKSArICJweCI7CisgICAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gdGFyZ2V0LnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0ID0gZGl2LnN0eWxlLmhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0KSArICJweCI7CisgICAgICB2YXIgcmVsYXRpdmVSb3RhdGlvbiA9IHRoaXMudmlld3BvcnQucm90YXRpb24gLSB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcC5nZXQodGFyZ2V0KS5yb3RhdGlvbjsKKyAgICAgIHZhciBhYnNSb3RhdGlvbiA9IE1hdGguYWJzKHJlbGF0aXZlUm90YXRpb24pOworICAgICAgdmFyIHNjYWxlWCA9IDEsCisgICAgICAgICAgc2NhbGVZID0gMTsKKworICAgICAgaWYgKGFic1JvdGF0aW9uID09PSA5MCB8fCBhYnNSb3RhdGlvbiA9PT0gMjcwKSB7CisgICAgICAgIHNjYWxlWCA9IGhlaWdodCAvIHdpZHRoOworICAgICAgICBzY2FsZVkgPSB3aWR0aCAvIGhlaWdodDsKKyAgICAgIH0KKworICAgICAgdmFyIGNzc1RyYW5zZm9ybSA9ICJyb3RhdGUoIiArIHJlbGF0aXZlUm90YXRpb24gKyAiZGVnKSAiICsgInNjYWxlKCIgKyBzY2FsZVggKyAiLCIgKyBzY2FsZVkgKyAiKSI7CisgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gY3NzVHJhbnNmb3JtOworCisgICAgICBpZiAodGhpcy50ZXh0TGF5ZXIpIHsKKyAgICAgICAgdmFyIHRleHRMYXllclZpZXdwb3J0ID0gdGhpcy50ZXh0TGF5ZXIudmlld3BvcnQ7CisgICAgICAgIHZhciB0ZXh0UmVsYXRpdmVSb3RhdGlvbiA9IHRoaXMudmlld3BvcnQucm90YXRpb24gLSB0ZXh0TGF5ZXJWaWV3cG9ydC5yb3RhdGlvbjsKKyAgICAgICAgdmFyIHRleHRBYnNSb3RhdGlvbiA9IE1hdGguYWJzKHRleHRSZWxhdGl2ZVJvdGF0aW9uKTsKKyAgICAgICAgdmFyIHNjYWxlID0gd2lkdGggLyB0ZXh0TGF5ZXJWaWV3cG9ydC53aWR0aDsKKworICAgICAgICBpZiAodGV4dEFic1JvdGF0aW9uID09PSA5MCB8fCB0ZXh0QWJzUm90YXRpb24gPT09IDI3MCkgeworICAgICAgICAgIHNjYWxlID0gd2lkdGggLyB0ZXh0TGF5ZXJWaWV3cG9ydC5oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdGV4dExheWVyRGl2ID0gdGhpcy50ZXh0TGF5ZXIudGV4dExheWVyRGl2OworICAgICAgICB2YXIgdHJhbnNYLCB0cmFuc1k7CisKKyAgICAgICAgc3dpdGNoICh0ZXh0QWJzUm90YXRpb24pIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0cmFuc1ggPSB0cmFuc1kgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgdHJhbnNYID0gMDsKKyAgICAgICAgICAgIHRyYW5zWSA9ICItIiArIHRleHRMYXllckRpdi5zdHlsZS5oZWlnaHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgICAgdHJhbnNYID0gIi0iICsgdGV4dExheWVyRGl2LnN0eWxlLndpZHRoOworICAgICAgICAgICAgdHJhbnNZID0gIi0iICsgdGV4dExheWVyRGl2LnN0eWxlLmhlaWdodDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICB0cmFuc1ggPSAiLSIgKyB0ZXh0TGF5ZXJEaXYuc3R5bGUud2lkdGg7CisgICAgICAgICAgICB0cmFuc1kgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29uc29sZS5lcnJvcigiQmFkIHJvdGF0aW9uIHZhbHVlLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUudHJhbnNmb3JtID0gInJvdGF0ZSgiICsgdGV4dEFic1JvdGF0aW9uICsgImRlZykgIiArICJzY2FsZSgiICsgc2NhbGUgKyAiLCAiICsgc2NhbGUgKyAiKSAiICsgInRyYW5zbGF0ZSgiICsgdHJhbnNYICsgIiwgIiArIHRyYW5zWSArICIpIjsKKyAgICAgICAgdGV4dExheWVyRGl2LnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICIwJSAwJSI7CisgICAgICB9CisKKyAgICAgIGlmIChyZWRyYXdBbm5vdGF0aW9ucyAmJiB0aGlzLmFubm90YXRpb25MYXllcikgeworICAgICAgICB0aGlzLl9yZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJnZXRQYWdlUG9pbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlUG9pbnQoeCwgeSkgeworICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnQuY29udmVydFRvUGRmUG9pbnQoeCwgeSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZHJhdyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGRyYXcoKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICBpZiAodGhpcy5yZW5kZXJpbmdTdGF0ZSAhPT0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLklOSVRJQUwpIHsKKyAgICAgICAgY29uc29sZS5lcnJvcigiTXVzdCBiZSBpbiBuZXcgc3RhdGUgYmVmb3JlIGRyYXdpbmciKTsKKyAgICAgICAgdGhpcy5yZXNldCgpOworICAgICAgfQorCisgICAgICB2YXIgZGl2ID0gdGhpcy5kaXYsCisgICAgICAgICAgcGRmUGFnZSA9IHRoaXMucGRmUGFnZTsKKworICAgICAgaWYgKCFwZGZQYWdlKSB7CisgICAgICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ7CisKKyAgICAgICAgaWYgKHRoaXMubG9hZGluZ0ljb25EaXYpIHsKKyAgICAgICAgICBkaXYucmVtb3ZlQ2hpbGQodGhpcy5sb2FkaW5nSWNvbkRpdik7CisgICAgICAgICAgZGVsZXRlIHRoaXMubG9hZGluZ0ljb25EaXY7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJwZGZQYWdlIGlzIG5vdCBsb2FkZWQiKSk7CisgICAgICB9CisKKyAgICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuUlVOTklORzsKKyAgICAgIHZhciBjYW52YXNXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICBjYW52YXNXcmFwcGVyLnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLndpZHRoOworICAgICAgY2FudmFzV3JhcHBlci5zdHlsZS5oZWlnaHQgPSBkaXYuc3R5bGUuaGVpZ2h0OworICAgICAgY2FudmFzV3JhcHBlci5jbGFzc0xpc3QuYWRkKCJjYW52YXNXcmFwcGVyIik7CisKKyAgICAgIGlmICh0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYpIHsKKyAgICAgICAgZGl2Lmluc2VydEJlZm9yZShjYW52YXNXcmFwcGVyLCB0aGlzLmFubm90YXRpb25MYXllci5kaXYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGl2LmFwcGVuZENoaWxkKGNhbnZhc1dyYXBwZXIpOworICAgICAgfQorCisgICAgICB2YXIgdGV4dExheWVyID0gbnVsbDsKKworICAgICAgaWYgKHRoaXMudGV4dExheWVyTW9kZSAhPT0gX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRElTQUJMRSAmJiB0aGlzLnRleHRMYXllckZhY3RvcnkpIHsKKyAgICAgICAgdmFyIHRleHRMYXllckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICB0ZXh0TGF5ZXJEaXYuY2xhc3NOYW1lID0gInRleHRMYXllciI7CisgICAgICAgIHRleHRMYXllckRpdi5zdHlsZS53aWR0aCA9IGNhbnZhc1dyYXBwZXIuc3R5bGUud2lkdGg7CisgICAgICAgIHRleHRMYXllckRpdi5zdHlsZS5oZWlnaHQgPSBjYW52YXNXcmFwcGVyLnN0eWxlLmhlaWdodDsKKworICAgICAgICBpZiAodGhpcy5hbm5vdGF0aW9uTGF5ZXIgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2KSB7CisgICAgICAgICAgZGl2Lmluc2VydEJlZm9yZSh0ZXh0TGF5ZXJEaXYsIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRleHRMYXllckRpdik7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0TGF5ZXIgPSB0aGlzLnRleHRMYXllckZhY3RvcnkuY3JlYXRlVGV4dExheWVyQnVpbGRlcih0ZXh0TGF5ZXJEaXYsIHRoaXMuaWQgLSAxLCB0aGlzLnZpZXdwb3J0LCB0aGlzLnRleHRMYXllck1vZGUgPT09IF91aV91dGlscy5UZXh0TGF5ZXJNb2RlLkVOQUJMRV9FTkhBTkNFLCB0aGlzLmV2ZW50QnVzKTsKKyAgICAgIH0KKworICAgICAgdGhpcy50ZXh0TGF5ZXIgPSB0ZXh0TGF5ZXI7CisgICAgICB2YXIgcmVuZGVyQ29udGludWVDYWxsYmFjayA9IG51bGw7CisKKyAgICAgIGlmICh0aGlzLnJlbmRlcmluZ1F1ZXVlKSB7CisgICAgICAgIHJlbmRlckNvbnRpbnVlQ2FsbGJhY2sgPSBmdW5jdGlvbiByZW5kZXJDb250aW51ZUNhbGxiYWNrKGNvbnQpIHsKKyAgICAgICAgICBpZiAoIV90aGlzLnJlbmRlcmluZ1F1ZXVlLmlzSGlnaGVzdFByaW9yaXR5KF90aGlzKSkgeworICAgICAgICAgICAgX3RoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuUEFVU0VEOworCisgICAgICAgICAgICBfdGhpcy5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgIF90aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLlJVTk5JTkc7CisgICAgICAgICAgICAgIGNvbnQoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250KCk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHZhciBmaW5pc2hQYWludFRhc2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yWyJkZWZhdWx0Il0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMihlcnJvcikgeworICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbImRlZmF1bHQiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIGlmIChwYWludFRhc2sgPT09IF90aGlzLnBhaW50VGFzaykgeworICAgICAgICAgICAgICAgICAgICBfdGhpcy5wYWludFRhc2sgPSBudWxsOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIF9wZGZqc0xpYi5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIF90aGlzLmVycm9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iKTsKKworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOworCisgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMubG9hZGluZ0ljb25EaXYpIHsKKyAgICAgICAgICAgICAgICAgICAgZGl2LnJlbW92ZUNoaWxkKF90aGlzLmxvYWRpbmdJY29uRGl2KTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF90aGlzLmxvYWRpbmdJY29uRGl2OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVzZXRab29tTGF5ZXIodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgIF90aGlzLmVycm9yID0gZXJyb3I7CisgICAgICAgICAgICAgICAgICBfdGhpcy5zdGF0cyA9IHBkZlBhZ2Uuc3RhdHM7CisKKyAgICAgICAgICAgICAgICAgIF90aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlcmVuZGVyZWQiLCB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogX3RoaXMsCisgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI6IF90aGlzLmlkLAorICAgICAgICAgICAgICAgICAgICBjc3NUcmFuc2Zvcm06IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IHBlcmZvcm1hbmNlLm5vdygpCisgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CisKKyAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CisgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIF9jYWxsZWUyKTsKKyAgICAgICAgfSkpOworCisgICAgICAgIHJldHVybiBmdW5jdGlvbiBmaW5pc2hQYWludFRhc2soX3gpIHsKKyAgICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICB9OworICAgICAgfSgpOworCisgICAgICB2YXIgcGFpbnRUYXNrID0gdGhpcy5yZW5kZXJlciA9PT0gX3VpX3V0aWxzLlJlbmRlcmVyVHlwZS5TVkcgPyB0aGlzLnBhaW50T25TdmcoY2FudmFzV3JhcHBlcikgOiB0aGlzLnBhaW50T25DYW52YXMoY2FudmFzV3JhcHBlcik7CisgICAgICBwYWludFRhc2sub25SZW5kZXJDb250aW51ZSA9IHJlbmRlckNvbnRpbnVlQ2FsbGJhY2s7CisgICAgICB0aGlzLnBhaW50VGFzayA9IHBhaW50VGFzazsKKyAgICAgIHZhciByZXN1bHRQcm9taXNlID0gcGFpbnRUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBmaW5pc2hQYWludFRhc2sobnVsbCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgaWYgKHRleHRMYXllcikgeworICAgICAgICAgICAgdmFyIHJlYWRhYmxlU3RyZWFtID0gcGRmUGFnZS5zdHJlYW1UZXh0Q29udGVudCh7CisgICAgICAgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2U6IHRydWUKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdGV4dExheWVyLnNldFRleHRDb250ZW50U3RyZWFtKHJlYWRhYmxlU3RyZWFtKTsKKyAgICAgICAgICAgIHRleHRMYXllci5yZW5kZXIoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICByZXR1cm4gZmluaXNoUGFpbnRUYXNrKHJlYXNvbik7CisgICAgICB9KTsKKworICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkxheWVyRmFjdG9yeSkgeworICAgICAgICBpZiAoIXRoaXMuYW5ub3RhdGlvbkxheWVyKSB7CisgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSB0aGlzLmFubm90YXRpb25MYXllckZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlcihkaXYsIHBkZlBhZ2UsIHRoaXMuX2Fubm90YXRpb25TdG9yYWdlLCB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCwgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLCB0aGlzLmwxMG4pOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fcmVuZGVyQW5ub3RhdGlvbkxheWVyKCk7CisgICAgICB9CisKKyAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoImRhdGEtbG9hZGVkIiwgdHJ1ZSk7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlcmVuZGVyIiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIHBhZ2VOdW1iZXI6IHRoaXMuaWQKKyAgICAgIH0pOworICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicGFpbnRPbkNhbnZhcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHBhaW50T25DYW52YXMoY2FudmFzV3JhcHBlcikgeworICAgICAgdmFyIHJlbmRlckNhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgdmFyIHJlc3VsdCA9IHsKKyAgICAgICAgcHJvbWlzZTogcmVuZGVyQ2FwYWJpbGl0eS5wcm9taXNlLAorICAgICAgICBvblJlbmRlckNvbnRpbnVlOiBmdW5jdGlvbiBvblJlbmRlckNvbnRpbnVlKGNvbnQpIHsKKyAgICAgICAgICBjb250KCk7CisgICAgICAgIH0sCisgICAgICAgIGNhbmNlbDogZnVuY3Rpb24gY2FuY2VsKCkgeworICAgICAgICAgIHJlbmRlclRhc2suY2FuY2VsKCk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICB2YXIgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0OworICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworICAgICAgdGhpcy5sMTBuLmdldCgicGFnZV9jYW52YXMiLCB7CisgICAgICAgIHBhZ2U6IHRoaXMuaWQKKyAgICAgIH0sICJQYWdlIHt7cGFnZX19IikudGhlbihmdW5jdGlvbiAobXNnKSB7CisgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCBtc2cpOworICAgICAgfSk7CisgICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAiaGlkZGVuIik7CisgICAgICB2YXIgaXNDYW52YXNIaWRkZW4gPSB0cnVlOworCisgICAgICB2YXIgc2hvd0NhbnZhcyA9IGZ1bmN0aW9uIHNob3dDYW52YXMoKSB7CisgICAgICAgIGlmIChpc0NhbnZhc0hpZGRlbikgeworICAgICAgICAgIGNhbnZhcy5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpOworICAgICAgICAgIGlzQ2FudmFzSGlkZGVuID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGNhbnZhc1dyYXBwZXIuYXBwZW5kQ2hpbGQoY2FudmFzKTsKKyAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzOworICAgICAgY2FudmFzLm1vek9wYXF1ZSA9IHRydWU7CisgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgeworICAgICAgICBhbHBoYTogZmFsc2UKKyAgICAgIH0pOworICAgICAgdmFyIG91dHB1dFNjYWxlID0gKDAsIF91aV91dGlscy5nZXRPdXRwdXRTY2FsZSkoY3R4KTsKKyAgICAgIHRoaXMub3V0cHV0U2NhbGUgPSBvdXRwdXRTY2FsZTsKKworICAgICAgaWYgKHRoaXMudXNlT25seUNzc1pvb20pIHsKKyAgICAgICAgdmFyIGFjdHVhbFNpemVWaWV3cG9ydCA9IHZpZXdwb3J0LmNsb25lKHsKKyAgICAgICAgICBzY2FsZTogX3VpX3V0aWxzLkNTU19VTklUUworICAgICAgICB9KTsKKyAgICAgICAgb3V0cHV0U2NhbGUuc3ggKj0gYWN0dWFsU2l6ZVZpZXdwb3J0LndpZHRoIC8gdmlld3BvcnQud2lkdGg7CisgICAgICAgIG91dHB1dFNjYWxlLnN5ICo9IGFjdHVhbFNpemVWaWV3cG9ydC5oZWlnaHQgLyB2aWV3cG9ydC5oZWlnaHQ7CisgICAgICAgIG91dHB1dFNjYWxlLnNjYWxlZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm1heENhbnZhc1BpeGVscyA+IDApIHsKKyAgICAgICAgdmFyIHBpeGVsc0luVmlld3BvcnQgPSB2aWV3cG9ydC53aWR0aCAqIHZpZXdwb3J0LmhlaWdodDsKKyAgICAgICAgdmFyIG1heFNjYWxlID0gTWF0aC5zcXJ0KHRoaXMubWF4Q2FudmFzUGl4ZWxzIC8gcGl4ZWxzSW5WaWV3cG9ydCk7CisKKyAgICAgICAgaWYgKG91dHB1dFNjYWxlLnN4ID4gbWF4U2NhbGUgfHwgb3V0cHV0U2NhbGUuc3kgPiBtYXhTY2FsZSkgeworICAgICAgICAgIG91dHB1dFNjYWxlLnN4ID0gbWF4U2NhbGU7CisgICAgICAgICAgb3V0cHV0U2NhbGUuc3kgPSBtYXhTY2FsZTsKKyAgICAgICAgICBvdXRwdXRTY2FsZS5zY2FsZWQgPSB0cnVlOworICAgICAgICAgIHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgc2Z4ID0gKDAsIF91aV91dGlscy5hcHByb3hpbWF0ZUZyYWN0aW9uKShvdXRwdXRTY2FsZS5zeCk7CisgICAgICB2YXIgc2Z5ID0gKDAsIF91aV91dGlscy5hcHByb3hpbWF0ZUZyYWN0aW9uKShvdXRwdXRTY2FsZS5zeSk7CisgICAgICBjYW52YXMud2lkdGggPSAoMCwgX3VpX3V0aWxzLnJvdW5kVG9EaXZpZGUpKHZpZXdwb3J0LndpZHRoICogb3V0cHV0U2NhbGUuc3gsIHNmeFswXSk7CisgICAgICBjYW52YXMuaGVpZ2h0ID0gKDAsIF91aV91dGlscy5yb3VuZFRvRGl2aWRlKSh2aWV3cG9ydC5oZWlnaHQgKiBvdXRwdXRTY2FsZS5zeSwgc2Z5WzBdKTsKKyAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICgwLCBfdWlfdXRpbHMucm91bmRUb0RpdmlkZSkodmlld3BvcnQud2lkdGgsIHNmeFsxXSkgKyAicHgiOworICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9ICgwLCBfdWlfdXRpbHMucm91bmRUb0RpdmlkZSkodmlld3BvcnQuaGVpZ2h0LCBzZnlbMV0pICsgInB4IjsKKyAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLnNldChjYW52YXMsIHZpZXdwb3J0KTsKKyAgICAgIHZhciB0cmFuc2Zvcm0gPSAhb3V0cHV0U2NhbGUuc2NhbGVkID8gbnVsbCA6IFtvdXRwdXRTY2FsZS5zeCwgMCwgMCwgb3V0cHV0U2NhbGUuc3ksIDAsIDBdOworICAgICAgdmFyIHJlbmRlckNvbnRleHQgPSB7CisgICAgICAgIGNhbnZhc0NvbnRleHQ6IGN0eCwKKyAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sCisgICAgICAgIHZpZXdwb3J0OiB0aGlzLnZpZXdwb3J0LAorICAgICAgICBlbmFibGVXZWJHTDogdGhpcy5lbmFibGVXZWJHTCwKKyAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlOiB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlCisgICAgICB9OworICAgICAgdmFyIHJlbmRlclRhc2sgPSB0aGlzLnBkZlBhZ2UucmVuZGVyKHJlbmRlckNvbnRleHQpOworCisgICAgICByZW5kZXJUYXNrLm9uQ29udGludWUgPSBmdW5jdGlvbiAoY29udCkgeworICAgICAgICBzaG93Q2FudmFzKCk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5vblJlbmRlckNvbnRpbnVlKSB7CisgICAgICAgICAgcmVzdWx0Lm9uUmVuZGVyQ29udGludWUoY29udCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29udCgpOworICAgICAgICB9CisgICAgICB9OworCisgICAgICByZW5kZXJUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHNob3dDYW52YXMoKTsKKyAgICAgICAgcmVuZGVyQ2FwYWJpbGl0eS5yZXNvbHZlKHVuZGVmaW5lZCk7CisgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKKyAgICAgICAgc2hvd0NhbnZhcygpOworICAgICAgICByZW5kZXJDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7CisgICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicGFpbnRPblN2ZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHBhaW50T25Tdmcod3JhcHBlcikgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHZhciBjYW5jZWxsZWQgPSBmYWxzZTsKKworICAgICAgdmFyIGVuc3VyZU5vdENhbmNlbGxlZCA9IGZ1bmN0aW9uIGVuc3VyZU5vdENhbmNlbGxlZCgpIHsKKyAgICAgICAgaWYgKGNhbmNlbGxlZCkgeworICAgICAgICAgIHRocm93IG5ldyBfcGRmanNMaWIuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKCJSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICIuY29uY2F0KF90aGlzMi5pZCksICJzdmciKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdmFyIHBkZlBhZ2UgPSB0aGlzLnBkZlBhZ2U7CisgICAgICB2YXIgYWN0dWFsU2l6ZVZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydC5jbG9uZSh7CisgICAgICAgIHNjYWxlOiBfdWlfdXRpbHMuQ1NTX1VOSVRTCisgICAgICB9KTsKKyAgICAgIHZhciBwcm9taXNlID0gcGRmUGFnZS5nZXRPcGVyYXRvckxpc3QoKS50aGVuKGZ1bmN0aW9uIChvcExpc3QpIHsKKyAgICAgICAgZW5zdXJlTm90Q2FuY2VsbGVkKCk7CisgICAgICAgIHZhciBzdmdHZnggPSBuZXcgX3BkZmpzTGliLlNWR0dyYXBoaWNzKHBkZlBhZ2UuY29tbW9uT2JqcywgcGRmUGFnZS5vYmpzKTsKKyAgICAgICAgcmV0dXJuIHN2Z0dmeC5nZXRTVkcob3BMaXN0LCBhY3R1YWxTaXplVmlld3BvcnQpLnRoZW4oZnVuY3Rpb24gKHN2ZykgeworICAgICAgICAgIGVuc3VyZU5vdENhbmNlbGxlZCgpOworICAgICAgICAgIF90aGlzMi5zdmcgPSBzdmc7CisKKyAgICAgICAgICBfdGhpczIucGFpbnRlZFZpZXdwb3J0TWFwLnNldChzdmcsIGFjdHVhbFNpemVWaWV3cG9ydCk7CisKKyAgICAgICAgICBzdmcuc3R5bGUud2lkdGggPSB3cmFwcGVyLnN0eWxlLndpZHRoOworICAgICAgICAgIHN2Zy5zdHlsZS5oZWlnaHQgPSB3cmFwcGVyLnN0eWxlLmhlaWdodDsKKyAgICAgICAgICBfdGhpczIucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ7CisgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChzdmcpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIHsKKyAgICAgICAgcHJvbWlzZTogcHJvbWlzZSwKKyAgICAgICAgb25SZW5kZXJDb250aW51ZTogZnVuY3Rpb24gb25SZW5kZXJDb250aW51ZShjb250KSB7CisgICAgICAgICAgY29udCgpOworICAgICAgICB9LAorICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHsKKyAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9OworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldFBhZ2VMYWJlbCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBhZ2VMYWJlbChsYWJlbCkgeworICAgICAgdGhpcy5wYWdlTGFiZWwgPSB0eXBlb2YgbGFiZWwgPT09ICJzdHJpbmciID8gbGFiZWwgOiBudWxsOworCisgICAgICBpZiAodGhpcy5wYWdlTGFiZWwgIT09IG51bGwpIHsKKyAgICAgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKCJkYXRhLXBhZ2UtbGFiZWwiLCB0aGlzLnBhZ2VMYWJlbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmRpdi5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtcGFnZS1sYWJlbCIpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIndpZHRoIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0LndpZHRoOworICAgIH0KKyAgfSwgeworICAgIGtleTogImhlaWdodCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy52aWV3cG9ydC5oZWlnaHQ7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERlBhZ2VWaWV3OworfSgpOworCitleHBvcnRzLlBERlBhZ2VWaWV3ID0gUERGUGFnZVZpZXc7CisKKy8qKiovIH0pLAorLyogMTcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZSZW5kZXJpbmdRdWV1ZSA9IGV4cG9ydHMuUmVuZGVyaW5nU3RhdGVzID0gdm9pZCAwOworCitmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KKworZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KKworZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKwordmFyIENMRUFOVVBfVElNRU9VVCA9IDMwMDAwOwordmFyIFJlbmRlcmluZ1N0YXRlcyA9IHsKKyAgSU5JVElBTDogMCwKKyAgUlVOTklORzogMSwKKyAgUEFVU0VEOiAyLAorICBGSU5JU0hFRDogMworfTsKK2V4cG9ydHMuUmVuZGVyaW5nU3RhdGVzID0gUmVuZGVyaW5nU3RhdGVzOworCit2YXIgUERGUmVuZGVyaW5nUXVldWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBQREZSZW5kZXJpbmdRdWV1ZSgpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGUmVuZGVyaW5nUXVldWUpOworCisgICAgdGhpcy5wZGZWaWV3ZXIgPSBudWxsOworICAgIHRoaXMucGRmVGh1bWJuYWlsVmlld2VyID0gbnVsbDsKKyAgICB0aGlzLm9uSWRsZSA9IG51bGw7CisgICAgdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID0gbnVsbDsKKyAgICB0aGlzLmlkbGVUaW1lb3V0ID0gbnVsbDsKKyAgICB0aGlzLnByaW50aW5nID0gZmFsc2U7CisgICAgdGhpcy5pc1RodW1ibmFpbFZpZXdFbmFibGVkID0gZmFsc2U7CisgIH0KKworICBfY3JlYXRlQ2xhc3MoUERGUmVuZGVyaW5nUXVldWUsIFt7CisgICAga2V5OiAic2V0Vmlld2VyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vmlld2VyKHBkZlZpZXdlcikgeworICAgICAgdGhpcy5wZGZWaWV3ZXIgPSBwZGZWaWV3ZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0VGh1bWJuYWlsVmlld2VyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGh1bWJuYWlsVmlld2VyKHBkZlRodW1ibmFpbFZpZXdlcikgeworICAgICAgdGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIgPSBwZGZUaHVtYm5haWxWaWV3ZXI7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNIaWdoZXN0UHJpb3JpdHkiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBpc0hpZ2hlc3RQcmlvcml0eSh2aWV3KSB7CisgICAgICByZXR1cm4gdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID09PSB2aWV3LnJlbmRlcmluZ0lkOworICAgIH0KKyAgfSwgeworICAgIGtleTogInJlbmRlckhpZ2hlc3RQcmlvcml0eSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckhpZ2hlc3RQcmlvcml0eShjdXJyZW50bHlWaXNpYmxlUGFnZXMpIHsKKyAgICAgIGlmICh0aGlzLmlkbGVUaW1lb3V0KSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KTsKKyAgICAgICAgdGhpcy5pZGxlVGltZW91dCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLnBkZlZpZXdlci5mb3JjZVJlbmRlcmluZyhjdXJyZW50bHlWaXNpYmxlUGFnZXMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMucGRmVGh1bWJuYWlsVmlld2VyICYmIHRoaXMuaXNUaHVtYm5haWxWaWV3RW5hYmxlZCkgeworICAgICAgICBpZiAodGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIuZm9yY2VSZW5kZXJpbmcoKSkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodGhpcy5wcmludGluZykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm9uSWRsZSkgeworICAgICAgICB0aGlzLmlkbGVUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLm9uSWRsZS5iaW5kKHRoaXMpLCBDTEVBTlVQX1RJTUVPVVQpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImdldEhpZ2hlc3RQcmlvcml0eSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eSh2aXNpYmxlLCB2aWV3cywgc2Nyb2xsZWREb3duKSB7CisgICAgICB2YXIgdmlzaWJsZVZpZXdzID0gdmlzaWJsZS52aWV3czsKKyAgICAgIHZhciBudW1WaXNpYmxlID0gdmlzaWJsZVZpZXdzLmxlbmd0aDsKKworICAgICAgaWYgKG51bVZpc2libGUgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVmlzaWJsZTsgKytpKSB7CisgICAgICAgIHZhciB2aWV3ID0gdmlzaWJsZVZpZXdzW2ldLnZpZXc7CisKKyAgICAgICAgaWYgKCF0aGlzLmlzVmlld0ZpbmlzaGVkKHZpZXcpKSB7CisgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNjcm9sbGVkRG93bikgeworICAgICAgICB2YXIgbmV4dFBhZ2VJbmRleCA9IHZpc2libGUubGFzdC5pZDsKKworICAgICAgICBpZiAodmlld3NbbmV4dFBhZ2VJbmRleF0gJiYgIXRoaXMuaXNWaWV3RmluaXNoZWQodmlld3NbbmV4dFBhZ2VJbmRleF0pKSB7CisgICAgICAgICAgcmV0dXJuIHZpZXdzW25leHRQYWdlSW5kZXhdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgcHJldmlvdXNQYWdlSW5kZXggPSB2aXNpYmxlLmZpcnN0LmlkIC0gMjsKKworICAgICAgICBpZiAodmlld3NbcHJldmlvdXNQYWdlSW5kZXhdICYmICF0aGlzLmlzVmlld0ZpbmlzaGVkKHZpZXdzW3ByZXZpb3VzUGFnZUluZGV4XSkpIHsKKyAgICAgICAgICByZXR1cm4gdmlld3NbcHJldmlvdXNQYWdlSW5kZXhdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogImlzVmlld0ZpbmlzaGVkIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gaXNWaWV3RmluaXNoZWQodmlldykgeworICAgICAgcmV0dXJuIHZpZXcucmVuZGVyaW5nU3RhdGUgPT09IFJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJyZW5kZXJWaWV3IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyVmlldyh2aWV3KSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICBzd2l0Y2ggKHZpZXcucmVuZGVyaW5nU3RhdGUpIHsKKyAgICAgICAgY2FzZSBSZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ6CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLlBBVVNFRDoKKyAgICAgICAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSB2aWV3LnJlbmRlcmluZ0lkOworICAgICAgICAgIHZpZXcucmVzdW1lKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSZW5kZXJpbmdTdGF0ZXMuUlVOTklORzoKKyAgICAgICAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSB2aWV3LnJlbmRlcmluZ0lkOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw6CisgICAgICAgICAgdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID0gdmlldy5yZW5kZXJpbmdJZDsKKyAgICAgICAgICB2aWV3LmRyYXcoKVsiZmluYWxseSJdKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIF90aGlzLnJlbmRlckhpZ2hlc3RQcmlvcml0eSgpOworICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoInJlbmRlclZpZXc6IFwiIi5jb25jYXQocmVhc29uLCAiXCIiKSk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQREZSZW5kZXJpbmdRdWV1ZTsKK30oKTsKKworZXhwb3J0cy5QREZSZW5kZXJpbmdRdWV1ZSA9IFBERlJlbmRlcmluZ1F1ZXVlOworCisvKioqLyB9KSwKKy8qIDE4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGU2luZ2xlUGFnZVZpZXdlciA9IHZvaWQgMDsKKwordmFyIF9iYXNlX3ZpZXdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOworCit2YXIgX3BkZmpzTGliID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCitmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5nZXQpIHsgX2dldCA9IFJlZmxlY3QuZ2V0OyB9IGVsc2UgeyBfZ2V0ID0gZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgYmFzZSA9IF9zdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpOyBpZiAoIWJhc2UpIHJldHVybjsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTsgaWYgKGRlc2MuZ2V0KSB7IHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTsgfSByZXR1cm4gZGVzYy52YWx1ZTsgfTsgfSByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpOyB9CisKK2Z1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHsgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrOyB9IHJldHVybiBvYmplY3Q7IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCit2YXIgUERGU2luZ2xlUGFnZVZpZXdlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Jhc2VWaWV3ZXIpIHsKKyAgX2luaGVyaXRzKFBERlNpbmdsZVBhZ2VWaWV3ZXIsIF9CYXNlVmlld2VyKTsKKworICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFBERlNpbmdsZVBhZ2VWaWV3ZXIpOworCisgIGZ1bmN0aW9uIFBERlNpbmdsZVBhZ2VWaWV3ZXIob3B0aW9ucykgeworICAgIHZhciBfdGhpczsKKworICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZTaW5nbGVQYWdlVmlld2VyKTsKKworICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgb3B0aW9ucyk7CisKKyAgICBfdGhpcy5ldmVudEJ1cy5fb24oInBhZ2VzaW5pdCIsIGZ1bmN0aW9uIChldnQpIHsKKyAgICAgIF90aGlzLl9lbnN1cmVQYWdlVmlld1Zpc2libGUoKTsKKyAgICB9KTsKKworICAgIHJldHVybiBfdGhpczsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQREZTaW5nbGVQYWdlVmlld2VyLCBbeworICAgIGtleTogIl9yZXNldFZpZXciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVzZXRWaWV3KCkgeworICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoUERGU2luZ2xlUGFnZVZpZXdlci5wcm90b3R5cGUpLCAiX3Jlc2V0VmlldyIsIHRoaXMpLmNhbGwodGhpcyk7CisKKyAgICAgIHRoaXMuX3ByZXZpb3VzUGFnZU51bWJlciA9IDE7CisgICAgICB0aGlzLl9zaGFkb3dWaWV3ZXIgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICB0aGlzLl91cGRhdGVTY3JvbGxEb3duID0gbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfZW5zdXJlUGFnZVZpZXdWaXNpYmxlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpIHsKKyAgICAgIHZhciBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07CisgICAgICB2YXIgcHJldmlvdXNQYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX3ByZXZpb3VzUGFnZU51bWJlciAtIDFdOworICAgICAgdmFyIHZpZXdlck5vZGVzID0gdGhpcy52aWV3ZXIuY2hpbGROb2RlczsKKworICAgICAgc3dpdGNoICh2aWV3ZXJOb2Rlcy5sZW5ndGgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHRoaXMudmlld2VyLmFwcGVuZENoaWxkKHBhZ2VWaWV3LmRpdik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGlmICh2aWV3ZXJOb2Rlc1swXSAhPT0gcHJldmlvdXNQYWdlVmlldy5kaXYpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZTogVW5leHBlY3RlZCBwcmV2aW91c2x5IHZpc2libGUgcGFnZS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocGFnZVZpZXcgPT09IHByZXZpb3VzUGFnZVZpZXcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHRoaXMuX3NoYWRvd1ZpZXdlci5hcHBlbmRDaGlsZChwcmV2aW91c1BhZ2VWaWV3LmRpdik7CisKKyAgICAgICAgICB0aGlzLnZpZXdlci5hcHBlbmRDaGlsZChwYWdlVmlldy5kaXYpOworICAgICAgICAgIHRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCA9IDA7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIl9lbnN1cmVQYWdlVmlld1Zpc2libGU6IE9ubHkgb25lIHBhZ2Ugc2hvdWxkIGJlIHZpc2libGUgYXQgYSB0aW1lLiIpOworICAgICAgfQorCisgICAgICB0aGlzLl9wcmV2aW91c1BhZ2VOdW1iZXIgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfc2Nyb2xsVXBkYXRlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3Njcm9sbFVwZGF0ZSgpIHsKKyAgICAgIGlmICh0aGlzLl91cGRhdGVTY3JvbGxEb3duKSB7CisgICAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbERvd24oKTsKKyAgICAgIH0KKworICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoUERGU2luZ2xlUGFnZVZpZXdlci5wcm90b3R5cGUpLCAiX3Njcm9sbFVwZGF0ZSIsIHRoaXMpLmNhbGwodGhpcyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3Njcm9sbEludG9WaWV3IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3Njcm9sbEludG9WaWV3KF9yZWYpIHsKKyAgICAgIHZhciBfdGhpczIgPSB0aGlzOworCisgICAgICB2YXIgcGFnZURpdiA9IF9yZWYucGFnZURpdiwKKyAgICAgICAgICBfcmVmJHBhZ2VTcG90ID0gX3JlZi5wYWdlU3BvdCwKKyAgICAgICAgICBwYWdlU3BvdCA9IF9yZWYkcGFnZVNwb3QgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJHBhZ2VTcG90LAorICAgICAgICAgIF9yZWYkcGFnZU51bWJlciA9IF9yZWYucGFnZU51bWJlciwKKyAgICAgICAgICBwYWdlTnVtYmVyID0gX3JlZiRwYWdlTnVtYmVyID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRwYWdlTnVtYmVyOworCisgICAgICBpZiAocGFnZU51bWJlcikgeworICAgICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyKTsKKyAgICAgIH0KKworICAgICAgdmFyIHNjcm9sbGVkRG93biA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID49IHRoaXMuX3ByZXZpb3VzUGFnZU51bWJlcjsKKworICAgICAgdGhpcy5fZW5zdXJlUGFnZVZpZXdWaXNpYmxlKCk7CisKKyAgICAgIHRoaXMudXBkYXRlKCk7CisKKyAgICAgIF9nZXQoX2dldFByb3RvdHlwZU9mKFBERlNpbmdsZVBhZ2VWaWV3ZXIucHJvdG90eXBlKSwgIl9zY3JvbGxJbnRvVmlldyIsIHRoaXMpLmNhbGwodGhpcywgeworICAgICAgICBwYWdlRGl2OiBwYWdlRGl2LAorICAgICAgICBwYWdlU3BvdDogcGFnZVNwb3QsCisgICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXIKKyAgICAgIH0pOworCisgICAgICB0aGlzLl91cGRhdGVTY3JvbGxEb3duID0gZnVuY3Rpb24gKCkgeworICAgICAgICBfdGhpczIuc2Nyb2xsLmRvd24gPSBzY3JvbGxlZERvd247CisgICAgICAgIF90aGlzMi5fdXBkYXRlU2Nyb2xsRG93biA9IG51bGw7CisgICAgICB9OworICAgIH0KKyAgfSwgeworICAgIGtleTogIl9nZXRWaXNpYmxlUGFnZXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0VmlzaWJsZVBhZ2VzKCkgeworICAgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnRWaXNpYmxlUGFnZSgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl91cGRhdGVIZWxwZXIiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlSGVscGVyKHZpc2libGVQYWdlcykge30KKyAgfSwgeworICAgIGtleTogIl91cGRhdGVTY3JvbGxNb2RlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZVNjcm9sbE1vZGUoKSB7fQorICB9LCB7CisgICAga2V5OiAiX3VwZGF0ZVNwcmVhZE1vZGUiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlU3ByZWFkTW9kZSgpIHt9CisgIH0sIHsKKyAgICBrZXk6ICJfdmlld2VyRWxlbWVudCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gKDAsIF9wZGZqc0xpYi5zaGFkb3cpKHRoaXMsICJfdmlld2VyRWxlbWVudCIsIHRoaXMuX3NoYWRvd1ZpZXdlcik7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2lzU2Nyb2xsTW9kZUhvcml6b250YWwiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuICgwLCBfcGRmanNMaWIuc2hhZG93KSh0aGlzLCAiX2lzU2Nyb2xsTW9kZUhvcml6b250YWwiLCBmYWxzZSk7CisgICAgfQorICB9XSk7CisKKyAgcmV0dXJuIFBERlNpbmdsZVBhZ2VWaWV3ZXI7Cit9KF9iYXNlX3ZpZXdlci5CYXNlVmlld2VyKTsKKworZXhwb3J0cy5QREZTaW5nbGVQYWdlVmlld2VyID0gUERGU2luZ2xlUGFnZVZpZXdlcjsKKworLyoqKi8gfSksCisvKiAxOSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkJhc2VWaWV3ZXIgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOworCit2YXIgX3BkZl9yZW5kZXJpbmdfcXVldWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTsKKwordmFyIF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCit2YXIgX3BkZmpzTGliID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF9wZGZfcGFnZV92aWV3ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7CisKK3ZhciBfcGRmX2xpbmtfc2VydmljZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7CisKK3ZhciBfdGV4dF9sYXllcl9idWlsZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKKworZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gInVuZGVmaW5lZCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQorCitmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfQorCitmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0KKworZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9CisKK2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CisKK2Z1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKK3ZhciBERUZBVUxUX0NBQ0hFX1NJWkUgPSAxMDsKKworZnVuY3Rpb24gUERGUGFnZVZpZXdCdWZmZXIoc2l6ZSkgeworICB2YXIgZGF0YSA9IFtdOworCisgIHRoaXMucHVzaCA9IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgdmFyIGkgPSBkYXRhLmluZGV4T2Yodmlldyk7CisKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICBkYXRhLnNwbGljZShpLCAxKTsKKyAgICB9CisKKyAgICBkYXRhLnB1c2godmlldyk7CisKKyAgICBpZiAoZGF0YS5sZW5ndGggPiBzaXplKSB7CisgICAgICBkYXRhLnNoaWZ0KCkuZGVzdHJveSgpOworICAgIH0KKyAgfTsKKworICB0aGlzLnJlc2l6ZSA9IGZ1bmN0aW9uIChuZXdTaXplLCBwYWdlc1RvS2VlcCkgeworICAgIHNpemUgPSBuZXdTaXplOworCisgICAgaWYgKHBhZ2VzVG9LZWVwKSB7CisgICAgICB2YXIgcGFnZUlkc1RvS2VlcCA9IG5ldyBTZXQoKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlNYXggPSBwYWdlc1RvS2VlcC5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHsKKyAgICAgICAgcGFnZUlkc1RvS2VlcC5hZGQocGFnZXNUb0tlZXBbaV0uaWQpOworICAgICAgfQorCisgICAgICAoMCwgX3VpX3V0aWxzLm1vdmVUb0VuZE9mQXJyYXkpKGRhdGEsIGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICAgIHJldHVybiBwYWdlSWRzVG9LZWVwLmhhcyhwYWdlLmlkKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHdoaWxlIChkYXRhLmxlbmd0aCA+IHNpemUpIHsKKyAgICAgIGRhdGEuc2hpZnQoKS5kZXN0cm95KCk7CisgICAgfQorICB9OworfQorCitmdW5jdGlvbiBpc1NhbWVTY2FsZShvbGRTY2FsZSwgbmV3U2NhbGUpIHsKKyAgaWYgKG5ld1NjYWxlID09PSBvbGRTY2FsZSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKE1hdGguYWJzKG5ld1NjYWxlIC0gb2xkU2NhbGUpIDwgMWUtMTUpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKwordmFyIEJhc2VWaWV3ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBCYXNlVmlld2VyKG9wdGlvbnMpIHsKKyAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJhc2VWaWV3ZXIpOworCisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VWaWV3ZXIpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGluaXRpYWxpemUgQmFzZVZpZXdlci4iKTsKKyAgICB9CisKKyAgICB0aGlzLl9uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7CisgICAgdGhpcy52aWV3ZXIgPSBvcHRpb25zLnZpZXdlciB8fCBvcHRpb25zLmNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZDsKKworICAgIGlmICghKHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTERpdkVsZW1lbnQgJiYgdGhpcy52aWV3ZXIgaW5zdGFuY2VvZiBIVE1MRGl2RWxlbWVudCkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBgY29udGFpbmVyYCBhbmQvb3IgYHZpZXdlcmAgb3B0aW9uLiIpOworICAgIH0KKworICAgIHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzOworICAgIHRoaXMubGlua1NlcnZpY2UgPSBvcHRpb25zLmxpbmtTZXJ2aWNlIHx8IG5ldyBfcGRmX2xpbmtfc2VydmljZS5TaW1wbGVMaW5rU2VydmljZSgpOworICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gb3B0aW9ucy5kb3dubG9hZE1hbmFnZXIgfHwgbnVsbDsKKyAgICB0aGlzLmZpbmRDb250cm9sbGVyID0gb3B0aW9ucy5maW5kQ29udHJvbGxlciB8fCBudWxsOworICAgIHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMgPSBvcHRpb25zLnJlbW92ZVBhZ2VCb3JkZXJzIHx8IGZhbHNlOworICAgIHRoaXMudGV4dExheWVyTW9kZSA9IE51bWJlci5pc0ludGVnZXIob3B0aW9ucy50ZXh0TGF5ZXJNb2RlKSA/IG9wdGlvbnMudGV4dExheWVyTW9kZSA6IF91aV91dGlscy5UZXh0TGF5ZXJNb2RlLkVOQUJMRTsKKyAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IG9wdGlvbnMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8ICIiOworICAgIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IHR5cGVvZiBvcHRpb25zLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPT09ICJib29sZWFuIiA/IG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA6IHRydWU7CisgICAgdGhpcy5lbmFibGVQcmludEF1dG9Sb3RhdGUgPSBvcHRpb25zLmVuYWJsZVByaW50QXV0b1JvdGF0ZSB8fCBmYWxzZTsKKyAgICB0aGlzLnJlbmRlcmVyID0gb3B0aW9ucy5yZW5kZXJlciB8fCBfdWlfdXRpbHMuUmVuZGVyZXJUeXBlLkNBTlZBUzsKKyAgICB0aGlzLmVuYWJsZVdlYkdMID0gb3B0aW9ucy5lbmFibGVXZWJHTCB8fCBmYWxzZTsKKyAgICB0aGlzLnVzZU9ubHlDc3Nab29tID0gb3B0aW9ucy51c2VPbmx5Q3NzWm9vbSB8fCBmYWxzZTsKKyAgICB0aGlzLm1heENhbnZhc1BpeGVscyA9IG9wdGlvbnMubWF4Q2FudmFzUGl4ZWxzOworICAgIHRoaXMubDEwbiA9IG9wdGlvbnMubDEwbiB8fCBfdWlfdXRpbHMuTnVsbEwxMG47CisgICAgdGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUgPSAhb3B0aW9ucy5yZW5kZXJpbmdRdWV1ZTsKKworICAgIGlmICh0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSkgeworICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZSA9IG5ldyBfcGRmX3JlbmRlcmluZ19xdWV1ZS5QREZSZW5kZXJpbmdRdWV1ZSgpOworICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZS5zZXRWaWV3ZXIodGhpcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMucmVuZGVyaW5nUXVldWUgPSBvcHRpb25zLnJlbmRlcmluZ1F1ZXVlOworICAgIH0KKworICAgIHRoaXMuc2Nyb2xsID0gKDAsIF91aV91dGlscy53YXRjaFNjcm9sbCkodGhpcy5jb250YWluZXIsIHRoaXMuX3Njcm9sbFVwZGF0ZS5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLnByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IF91aV91dGlscy5QcmVzZW50YXRpb25Nb2RlU3RhdGUuVU5LTk9XTjsKKyAgICB0aGlzLl9vbkJlZm9yZURyYXcgPSB0aGlzLl9vbkFmdGVyRHJhdyA9IG51bGw7CisKKyAgICB0aGlzLl9yZXNldFZpZXcoKTsKKworICAgIGlmICh0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzKSB7CisgICAgICB0aGlzLnZpZXdlci5jbGFzc0xpc3QuYWRkKCJyZW1vdmVQYWdlQm9yZGVycyIpOworICAgIH0KKworICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgX3RoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImJhc2V2aWV3ZXJpbml0IiwgeworICAgICAgICBzb3VyY2U6IF90aGlzCisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhCYXNlVmlld2VyLCBbeworICAgIGtleTogImdldFBhZ2VWaWV3IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGFnZVZpZXcoaW5kZXgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlc1tpbmRleF07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3NldEN1cnJlbnRQYWdlTnVtYmVyIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3NldEN1cnJlbnRQYWdlTnVtYmVyKHZhbCkgeworICAgICAgdmFyIHJlc2V0Q3VycmVudFBhZ2VWaWV3ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKKworICAgICAgaWYgKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID09PSB2YWwpIHsKKyAgICAgICAgaWYgKHJlc2V0Q3VycmVudFBhZ2VWaWV3KSB7CisgICAgICAgICAgdGhpcy5fcmVzZXRDdXJyZW50UGFnZVZpZXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoISgwIDwgdmFsICYmIHZhbCA8PSB0aGlzLnBhZ2VzQ291bnQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSB2YWw7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlY2hhbmdpbmciLCB7CisgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgcGFnZU51bWJlcjogdmFsLAorICAgICAgICBwYWdlTGFiZWw6IHRoaXMuX3BhZ2VMYWJlbHMgJiYgdGhpcy5fcGFnZUxhYmVsc1t2YWwgLSAxXQorICAgICAgfSk7CisKKyAgICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykgeworICAgICAgICB0aGlzLl9yZXNldEN1cnJlbnRQYWdlVmlldygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfb25lUGFnZVJlbmRlcmVkT3JGb3JjZUZldGNoIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX29uZVBhZ2VSZW5kZXJlZE9yRm9yY2VGZXRjaCgpIHsKKyAgICAgIGlmICghdGhpcy5jb250YWluZXIub2Zmc2V0UGFyZW50IHx8IHRoaXMuX2dldFZpc2libGVQYWdlcygpLnZpZXdzLmxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9vbmVQYWdlUmVuZGVyZWRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAic2V0RG9jdW1lbnQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREb2N1bWVudChwZGZEb2N1bWVudCkgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIGlmICh0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICAgIHRoaXMuX2NhbmNlbFJlbmRlcmluZygpOworCisgICAgICAgIHRoaXMuX3Jlc2V0VmlldygpOworCisgICAgICAgIGlmICh0aGlzLmZpbmRDb250cm9sbGVyKSB7CisgICAgICAgICAgdGhpcy5maW5kQ29udHJvbGxlci5zZXREb2N1bWVudChudWxsKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLnBkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7CisKKyAgICAgIGlmICghcGRmRG9jdW1lbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcGFnZXNDb3VudCA9IHBkZkRvY3VtZW50Lm51bVBhZ2VzOworICAgICAgdmFyIGZpcnN0UGFnZVByb21pc2UgPSBwZGZEb2N1bWVudC5nZXRQYWdlKDEpOworICAgICAgdmFyIGFubm90YXRpb25TdG9yYWdlID0gcGRmRG9jdW1lbnQuYW5ub3RhdGlvblN0b3JhZ2U7CisgICAgICB2YXIgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpOworCisgICAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgX3RoaXMyLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlc2xvYWRlZCIsIHsKKyAgICAgICAgICBzb3VyY2U6IF90aGlzMiwKKyAgICAgICAgICBwYWdlc0NvdW50OiBwYWdlc0NvdW50CisgICAgICAgIH0pOworICAgICAgfSk7CisKKyAgICAgIHRoaXMuX29uQmVmb3JlRHJhdyA9IGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgdmFyIHBhZ2VWaWV3ID0gX3RoaXMyLl9wYWdlc1tldnQucGFnZU51bWJlciAtIDFdOworCisgICAgICAgIGlmICghcGFnZVZpZXcpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBfdGhpczIuX2J1ZmZlci5wdXNoKHBhZ2VWaWV3KTsKKyAgICAgIH07CisKKyAgICAgIHRoaXMuZXZlbnRCdXMuX29uKCJwYWdlcmVuZGVyIiwgdGhpcy5fb25CZWZvcmVEcmF3KTsKKworICAgICAgdGhpcy5fb25BZnRlckRyYXcgPSBmdW5jdGlvbiAoZXZ0KSB7CisgICAgICAgIGlmIChldnQuY3NzVHJhbnNmb3JtIHx8IF90aGlzMi5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5zZXR0bGVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgX3RoaXMyLl9vbmVQYWdlUmVuZGVyZWRDYXBhYmlsaXR5LnJlc29sdmUoKTsKKworICAgICAgICBfdGhpczIuZXZlbnRCdXMuX29mZigicGFnZXJlbmRlcmVkIiwgX3RoaXMyLl9vbkFmdGVyRHJhdyk7CisKKyAgICAgICAgX3RoaXMyLl9vbkFmdGVyRHJhdyA9IG51bGw7CisgICAgICB9OworCisgICAgICB0aGlzLmV2ZW50QnVzLl9vbigicGFnZXJlbmRlcmVkIiwgdGhpcy5fb25BZnRlckRyYXcpOworCisgICAgICBmaXJzdFBhZ2VQcm9taXNlLnRoZW4oZnVuY3Rpb24gKGZpcnN0UGRmUGFnZSkgeworICAgICAgICBfdGhpczIuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucmVzb2x2ZShmaXJzdFBkZlBhZ2UpOworCisgICAgICAgIF90aGlzMi5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U7CisgICAgICAgIHZhciBzY2FsZSA9IF90aGlzMi5jdXJyZW50U2NhbGU7CisgICAgICAgIHZhciB2aWV3cG9ydCA9IGZpcnN0UGRmUGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgICAgc2NhbGU6IHNjYWxlICogX3VpX3V0aWxzLkNTU19VTklUUworICAgICAgICB9KTsKKyAgICAgICAgdmFyIHRleHRMYXllckZhY3RvcnkgPSBfdGhpczIudGV4dExheWVyTW9kZSAhPT0gX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRElTQUJMRSA/IF90aGlzMiA6IG51bGw7CisKKyAgICAgICAgZm9yICh2YXIgcGFnZU51bSA9IDE7IHBhZ2VOdW0gPD0gcGFnZXNDb3VudDsgKytwYWdlTnVtKSB7CisgICAgICAgICAgdmFyIHBhZ2VWaWV3ID0gbmV3IF9wZGZfcGFnZV92aWV3LlBERlBhZ2VWaWV3KHsKKyAgICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMyLl92aWV3ZXJFbGVtZW50LAorICAgICAgICAgICAgZXZlbnRCdXM6IF90aGlzMi5ldmVudEJ1cywKKyAgICAgICAgICAgIGlkOiBwYWdlTnVtLAorICAgICAgICAgICAgc2NhbGU6IHNjYWxlLAorICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiB2aWV3cG9ydC5jbG9uZSgpLAorICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IGFubm90YXRpb25TdG9yYWdlLAorICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTogb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSwKKyAgICAgICAgICAgIHJlbmRlcmluZ1F1ZXVlOiBfdGhpczIucmVuZGVyaW5nUXVldWUsCisgICAgICAgICAgICB0ZXh0TGF5ZXJGYWN0b3J5OiB0ZXh0TGF5ZXJGYWN0b3J5LAorICAgICAgICAgICAgdGV4dExheWVyTW9kZTogX3RoaXMyLnRleHRMYXllck1vZGUsCisgICAgICAgICAgICBhbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OiBfdGhpczIsCisgICAgICAgICAgICBpbWFnZVJlc291cmNlc1BhdGg6IF90aGlzMi5pbWFnZVJlc291cmNlc1BhdGgsCisgICAgICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiBfdGhpczIucmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgICAgICAgIHJlbmRlcmVyOiBfdGhpczIucmVuZGVyZXIsCisgICAgICAgICAgICBlbmFibGVXZWJHTDogX3RoaXMyLmVuYWJsZVdlYkdMLAorICAgICAgICAgICAgdXNlT25seUNzc1pvb206IF90aGlzMi51c2VPbmx5Q3NzWm9vbSwKKyAgICAgICAgICAgIG1heENhbnZhc1BpeGVsczogX3RoaXMyLm1heENhbnZhc1BpeGVscywKKyAgICAgICAgICAgIGwxMG46IF90aGlzMi5sMTBuCisgICAgICAgICAgfSk7CisKKyAgICAgICAgICBfdGhpczIuX3BhZ2VzLnB1c2gocGFnZVZpZXcpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZpcnN0UGFnZVZpZXcgPSBfdGhpczIuX3BhZ2VzWzBdOworCisgICAgICAgIGlmIChmaXJzdFBhZ2VWaWV3KSB7CisgICAgICAgICAgZmlyc3RQYWdlVmlldy5zZXRQZGZQYWdlKGZpcnN0UGRmUGFnZSk7CisKKyAgICAgICAgICBfdGhpczIubGlua1NlcnZpY2UuY2FjaGVQYWdlUmVmKDEsIGZpcnN0UGRmUGFnZS5yZWYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF90aGlzMi5fc3ByZWFkTW9kZSAhPT0gX3VpX3V0aWxzLlNwcmVhZE1vZGUuTk9ORSkgeworICAgICAgICAgIF90aGlzMi5fdXBkYXRlU3ByZWFkTW9kZSgpOworICAgICAgICB9CisKKyAgICAgICAgX3RoaXMyLl9vbmVQYWdlUmVuZGVyZWRPckZvcmNlRmV0Y2goKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBpZiAoX3RoaXMyLmZpbmRDb250cm9sbGVyKSB7CisgICAgICAgICAgICBfdGhpczIuZmluZENvbnRyb2xsZXIuc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwZGZEb2N1bWVudC5sb2FkaW5nUGFyYW1zLmRpc2FibGVBdXRvRmV0Y2ggfHwgcGFnZXNDb3VudCA+IDc1MDApIHsKKyAgICAgICAgICAgIF90aGlzMi5fcGFnZXNDYXBhYmlsaXR5LnJlc29sdmUoKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBnZXRQYWdlc0xlZnQgPSBwYWdlc0NvdW50IC0gMTsKKworICAgICAgICAgIGlmIChnZXRQYWdlc0xlZnQgPD0gMCkgeworICAgICAgICAgICAgX3RoaXMyLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX3BhZ2VOdW0pIHsKKyAgICAgICAgICAgIHBkZkRvY3VtZW50LmdldFBhZ2UoX3BhZ2VOdW0pLnRoZW4oZnVuY3Rpb24gKHBkZlBhZ2UpIHsKKyAgICAgICAgICAgICAgdmFyIHBhZ2VWaWV3ID0gX3RoaXMyLl9wYWdlc1tfcGFnZU51bSAtIDFdOworCisgICAgICAgICAgICAgIGlmICghcGFnZVZpZXcucGRmUGFnZSkgeworICAgICAgICAgICAgICAgIHBhZ2VWaWV3LnNldFBkZlBhZ2UocGRmUGFnZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBfdGhpczIubGlua1NlcnZpY2UuY2FjaGVQYWdlUmVmKF9wYWdlTnVtLCBwZGZQYWdlLnJlZik7CisKKyAgICAgICAgICAgICAgaWYgKC0tZ2V0UGFnZXNMZWZ0ID09PSAwKSB7CisgICAgICAgICAgICAgICAgX3RoaXMyLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlVuYWJsZSB0byBnZXQgcGFnZSAiLmNvbmNhdChfcGFnZU51bSwgIiB0byBpbml0aWFsaXplIHZpZXdlciIpLCByZWFzb24pOworCisgICAgICAgICAgICAgIGlmICgtLWdldFBhZ2VzTGVmdCA9PT0gMCkgeworICAgICAgICAgICAgICAgIF90aGlzMi5fcGFnZXNDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfTsKKworICAgICAgICAgIGZvciAodmFyIF9wYWdlTnVtID0gMjsgX3BhZ2VOdW0gPD0gcGFnZXNDb3VudDsgKytfcGFnZU51bSkgeworICAgICAgICAgICAgX2xvb3AoX3BhZ2VOdW0pOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgX3RoaXMyLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlc2luaXQiLCB7CisgICAgICAgICAgc291cmNlOiBfdGhpczIKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKF90aGlzMi5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHsKKyAgICAgICAgICBfdGhpczIudXBkYXRlKCk7CisgICAgICAgIH0KKyAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgY29uc29sZS5lcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUgdmlld2VyIiwgcmVhc29uKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogInNldFBhZ2VMYWJlbHMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQYWdlTGFiZWxzKGxhYmVscykgeworICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCFsYWJlbHMpIHsKKyAgICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7CisgICAgICB9IGVsc2UgaWYgKCEoQXJyYXkuaXNBcnJheShsYWJlbHMpICYmIHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgPT09IGxhYmVscy5sZW5ndGgpKSB7CisgICAgICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBudWxsOworICAgICAgICBjb25zb2xlLmVycm9yKCIiLmNvbmNhdCh0aGlzLl9uYW1lLCAiLnNldFBhZ2VMYWJlbHM6IEludmFsaWQgcGFnZSBsYWJlbHMuIikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IGxhYmVsczsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1tpXTsKKyAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5fcGFnZUxhYmVscyAmJiB0aGlzLl9wYWdlTGFiZWxzW2ldOworICAgICAgICBwYWdlVmlldy5zZXRQYWdlTGFiZWwobGFiZWwpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIl9yZXNldFZpZXciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVzZXRWaWV3KCkgeworICAgICAgdGhpcy5fcGFnZXMgPSBbXTsKKyAgICAgIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID0gMTsKKyAgICAgIHRoaXMuX2N1cnJlbnRTY2FsZSA9IF91aV91dGlscy5VTktOT1dOX1NDQUxFOworICAgICAgdGhpcy5fY3VycmVudFNjYWxlVmFsdWUgPSBudWxsOworICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7CisgICAgICB0aGlzLl9idWZmZXIgPSBuZXcgUERGUGFnZVZpZXdCdWZmZXIoREVGQVVMVF9DQUNIRV9TSVpFKTsKKyAgICAgIHRoaXMuX2xvY2F0aW9uID0gbnVsbDsKKyAgICAgIHRoaXMuX3BhZ2VzUm90YXRpb24gPSAwOworICAgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGw7CisgICAgICB0aGlzLl9wYWdlc1JlcXVlc3RzID0gbmV3IFdlYWtNYXAoKTsKKyAgICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eSA9ICgwLCBfcGRmanNMaWIuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgdGhpcy5fc2Nyb2xsTW9kZSA9IF91aV91dGlscy5TY3JvbGxNb2RlLlZFUlRJQ0FMOworICAgICAgdGhpcy5fc3ByZWFkTW9kZSA9IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkU7CisKKyAgICAgIGlmICh0aGlzLl9vbkJlZm9yZURyYXcpIHsKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKCJwYWdlcmVuZGVyIiwgdGhpcy5fb25CZWZvcmVEcmF3KTsKKworICAgICAgICB0aGlzLl9vbkJlZm9yZURyYXcgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fb25BZnRlckRyYXcpIHsKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKCJwYWdlcmVuZGVyZWQiLCB0aGlzLl9vbkFmdGVyRHJhdyk7CisKKyAgICAgICAgdGhpcy5fb25BZnRlckRyYXcgPSBudWxsOworICAgICAgfQorCisgICAgICB0aGlzLnZpZXdlci50ZXh0Q29udGVudCA9ICIiOworCisgICAgICB0aGlzLl91cGRhdGVTY3JvbGxNb2RlKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3Njcm9sbFVwZGF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9zY3JvbGxVcGRhdGUoKSB7CisgICAgICBpZiAodGhpcy5wYWdlc0NvdW50ID09PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy51cGRhdGUoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfc2Nyb2xsSW50b1ZpZXciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfc2Nyb2xsSW50b1ZpZXcoX3JlZikgeworICAgICAgdmFyIHBhZ2VEaXYgPSBfcmVmLnBhZ2VEaXYsCisgICAgICAgICAgX3JlZiRwYWdlU3BvdCA9IF9yZWYucGFnZVNwb3QsCisgICAgICAgICAgcGFnZVNwb3QgPSBfcmVmJHBhZ2VTcG90ID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRwYWdlU3BvdCwKKyAgICAgICAgICBfcmVmJHBhZ2VOdW1iZXIgPSBfcmVmLnBhZ2VOdW1iZXIsCisgICAgICAgICAgcGFnZU51bWJlciA9IF9yZWYkcGFnZU51bWJlciA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkcGFnZU51bWJlcjsKKyAgICAgICgwLCBfdWlfdXRpbHMuc2Nyb2xsSW50b1ZpZXcpKHBhZ2VEaXYsIHBhZ2VTcG90KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfc2V0U2NhbGVVcGRhdGVQYWdlcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRTY2FsZVVwZGF0ZVBhZ2VzKG5ld1NjYWxlLCBuZXdWYWx1ZSkgeworICAgICAgdmFyIG5vU2Nyb2xsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTsKKyAgICAgIHZhciBwcmVzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlOworICAgICAgdGhpcy5fY3VycmVudFNjYWxlVmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpOworCisgICAgICBpZiAoaXNTYW1lU2NhbGUodGhpcy5fY3VycmVudFNjYWxlLCBuZXdTY2FsZSkpIHsKKyAgICAgICAgaWYgKHByZXNldCkgeworICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInNjYWxlY2hhbmdpbmciLCB7CisgICAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgICBzY2FsZTogbmV3U2NhbGUsCisgICAgICAgICAgICBwcmVzZXRWYWx1ZTogbmV3VmFsdWUKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB0aGlzLl9wYWdlc1tpXS51cGRhdGUobmV3U2NhbGUpOworICAgICAgfQorCisgICAgICB0aGlzLl9jdXJyZW50U2NhbGUgPSBuZXdTY2FsZTsKKworICAgICAgaWYgKCFub1Njcm9sbCkgeworICAgICAgICB2YXIgcGFnZSA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyLAorICAgICAgICAgICAgZGVzdDsKKworICAgICAgICBpZiAodGhpcy5fbG9jYXRpb24gJiYgISh0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlIHx8IHRoaXMuaXNDaGFuZ2luZ1ByZXNlbnRhdGlvbk1vZGUpKSB7CisgICAgICAgICAgcGFnZSA9IHRoaXMuX2xvY2F0aW9uLnBhZ2VOdW1iZXI7CisgICAgICAgICAgZGVzdCA9IFtudWxsLCB7CisgICAgICAgICAgICBuYW1lOiAiWFlaIgorICAgICAgICAgIH0sIHRoaXMuX2xvY2F0aW9uLmxlZnQsIHRoaXMuX2xvY2F0aW9uLnRvcCwgbnVsbF07CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnNjcm9sbFBhZ2VJbnRvVmlldyh7CisgICAgICAgICAgcGFnZU51bWJlcjogcGFnZSwKKyAgICAgICAgICBkZXN0QXJyYXk6IGRlc3QsCisgICAgICAgICAgYWxsb3dOZWdhdGl2ZU9mZnNldDogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgic2NhbGVjaGFuZ2luZyIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICBzY2FsZTogbmV3U2NhbGUsCisgICAgICAgIHByZXNldFZhbHVlOiBwcmVzZXQgPyBuZXdWYWx1ZSA6IHVuZGVmaW5lZAorICAgICAgfSk7CisKKyAgICAgIGlmICh0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSkgeworICAgICAgICB0aGlzLnVwZGF0ZSgpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogIl9zZXRTY2FsZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRTY2FsZSh2YWx1ZSkgeworICAgICAgdmFyIG5vU2Nyb2xsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKKyAgICAgIHZhciBzY2FsZSA9IHBhcnNlRmxvYXQodmFsdWUpOworCisgICAgICBpZiAoc2NhbGUgPiAwKSB7CisgICAgICAgIHRoaXMuX3NldFNjYWxlVXBkYXRlUGFnZXMoc2NhbGUsIHZhbHVlLCBub1Njcm9sbCwgZmFsc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGN1cnJlbnRQYWdlID0gdGhpcy5fcGFnZXNbdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSAxXTsKKworICAgICAgICBpZiAoIWN1cnJlbnRQYWdlKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG5vUGFkZGluZyA9IHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgdGhpcy5yZW1vdmVQYWdlQm9yZGVyczsKKyAgICAgICAgdmFyIGhQYWRkaW5nID0gbm9QYWRkaW5nID8gMCA6IF91aV91dGlscy5TQ1JPTExCQVJfUEFERElORzsKKyAgICAgICAgdmFyIHZQYWRkaW5nID0gbm9QYWRkaW5nID8gMCA6IF91aV91dGlscy5WRVJUSUNBTF9QQURESU5HOworCisgICAgICAgIGlmICghbm9QYWRkaW5nICYmIHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWwpIHsKKyAgICAgICAgICB2YXIgX3JlZjIgPSBbdlBhZGRpbmcsIGhQYWRkaW5nXTsKKyAgICAgICAgICBoUGFkZGluZyA9IF9yZWYyWzBdOworICAgICAgICAgIHZQYWRkaW5nID0gX3JlZjJbMV07CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGFnZVdpZHRoU2NhbGUgPSAodGhpcy5jb250YWluZXIuY2xpZW50V2lkdGggLSBoUGFkZGluZykgLyBjdXJyZW50UGFnZS53aWR0aCAqIGN1cnJlbnRQYWdlLnNjYWxlOworICAgICAgICB2YXIgcGFnZUhlaWdodFNjYWxlID0gKHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHZQYWRkaW5nKSAvIGN1cnJlbnRQYWdlLmhlaWdodCAqIGN1cnJlbnRQYWdlLnNjYWxlOworCisgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICBjYXNlICJwYWdlLWFjdHVhbCI6CisgICAgICAgICAgICBzY2FsZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInBhZ2Utd2lkdGgiOgorICAgICAgICAgICAgc2NhbGUgPSBwYWdlV2lkdGhTY2FsZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAicGFnZS1oZWlnaHQiOgorICAgICAgICAgICAgc2NhbGUgPSBwYWdlSGVpZ2h0U2NhbGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInBhZ2UtZml0IjoKKyAgICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4ocGFnZVdpZHRoU2NhbGUsIHBhZ2VIZWlnaHRTY2FsZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImF1dG8iOgorICAgICAgICAgICAgdmFyIGhvcml6b250YWxTY2FsZSA9ICgwLCBfdWlfdXRpbHMuaXNQb3J0cmFpdE9yaWVudGF0aW9uKShjdXJyZW50UGFnZSkgPyBwYWdlV2lkdGhTY2FsZSA6IE1hdGgubWluKHBhZ2VIZWlnaHRTY2FsZSwgcGFnZVdpZHRoU2NhbGUpOworICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihfdWlfdXRpbHMuTUFYX0FVVE9fU0NBTEUsIGhvcml6b250YWxTY2FsZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjb25zb2xlLmVycm9yKCIiLmNvbmNhdCh0aGlzLl9uYW1lLCAiLl9zZXRTY2FsZTogXCIiKS5jb25jYXQodmFsdWUsICJcIiBpcyBhbiB1bmtub3duIHpvb20gdmFsdWUuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fc2V0U2NhbGVVcGRhdGVQYWdlcyhzY2FsZSwgdmFsdWUsIG5vU2Nyb2xsLCB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfcmVzZXRDdXJyZW50UGFnZVZpZXciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVzZXRDdXJyZW50UGFnZVZpZXcoKSB7CisgICAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkgeworICAgICAgICB0aGlzLl9zZXRTY2FsZSh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSwgdHJ1ZSk7CisgICAgICB9CisKKyAgICAgIHZhciBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07CisKKyAgICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHsKKyAgICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzY3JvbGxQYWdlSW50b1ZpZXciLAorICAgIHZhbHVlOiBmdW5jdGlvbiBzY3JvbGxQYWdlSW50b1ZpZXcoX3JlZjMpIHsKKyAgICAgIHZhciBwYWdlTnVtYmVyID0gX3JlZjMucGFnZU51bWJlciwKKyAgICAgICAgICBfcmVmMyRkZXN0QXJyYXkgPSBfcmVmMy5kZXN0QXJyYXksCisgICAgICAgICAgZGVzdEFycmF5ID0gX3JlZjMkZGVzdEFycmF5ID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjMkZGVzdEFycmF5LAorICAgICAgICAgIF9yZWYzJGFsbG93TmVnYXRpdmVPZiA9IF9yZWYzLmFsbG93TmVnYXRpdmVPZmZzZXQsCisgICAgICAgICAgYWxsb3dOZWdhdGl2ZU9mZnNldCA9IF9yZWYzJGFsbG93TmVnYXRpdmVPZiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRhbGxvd05lZ2F0aXZlT2YsCisgICAgICAgICAgX3JlZjMkaWdub3JlRGVzdGluYXRpID0gX3JlZjMuaWdub3JlRGVzdGluYXRpb25ab29tLAorICAgICAgICAgIGlnbm9yZURlc3RpbmF0aW9uWm9vbSA9IF9yZWYzJGlnbm9yZURlc3RpbmF0aSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRpZ25vcmVEZXN0aW5hdGk7CisKKyAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBwYWdlVmlldyA9IE51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikgJiYgdGhpcy5fcGFnZXNbcGFnZU51bWJlciAtIDFdOworCisgICAgICBpZiAoIXBhZ2VWaWV3KSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoIiIuY29uY2F0KHRoaXMuX25hbWUsICIuc2Nyb2xsUGFnZUludG9WaWV3OiAiKSArICJcIiIuY29uY2F0KHBhZ2VOdW1iZXIsICJcIiBpcyBub3QgYSB2YWxpZCBwYWdlTnVtYmVyIHBhcmFtZXRlci4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgIWRlc3RBcnJheSkgeworICAgICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyLCB0cnVlKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciB4ID0gMCwKKyAgICAgICAgICB5ID0gMDsKKyAgICAgIHZhciB3aWR0aCA9IDAsCisgICAgICAgICAgaGVpZ2h0ID0gMCwKKyAgICAgICAgICB3aWR0aFNjYWxlLAorICAgICAgICAgIGhlaWdodFNjYWxlOworICAgICAgdmFyIGNoYW5nZU9yaWVudGF0aW9uID0gcGFnZVZpZXcucm90YXRpb24gJSAxODAgIT09IDA7CisgICAgICB2YXIgcGFnZVdpZHRoID0gKGNoYW5nZU9yaWVudGF0aW9uID8gcGFnZVZpZXcuaGVpZ2h0IDogcGFnZVZpZXcud2lkdGgpIC8gcGFnZVZpZXcuc2NhbGUgLyBfdWlfdXRpbHMuQ1NTX1VOSVRTOworICAgICAgdmFyIHBhZ2VIZWlnaHQgPSAoY2hhbmdlT3JpZW50YXRpb24gPyBwYWdlVmlldy53aWR0aCA6IHBhZ2VWaWV3LmhlaWdodCkgLyBwYWdlVmlldy5zY2FsZSAvIF91aV91dGlscy5DU1NfVU5JVFM7CisgICAgICB2YXIgc2NhbGUgPSAwOworCisgICAgICBzd2l0Y2ggKGRlc3RBcnJheVsxXS5uYW1lKSB7CisgICAgICAgIGNhc2UgIlhZWiI6CisgICAgICAgICAgeCA9IGRlc3RBcnJheVsyXTsKKyAgICAgICAgICB5ID0gZGVzdEFycmF5WzNdOworICAgICAgICAgIHNjYWxlID0gZGVzdEFycmF5WzRdOworICAgICAgICAgIHggPSB4ICE9PSBudWxsID8geCA6IDA7CisgICAgICAgICAgeSA9IHkgIT09IG51bGwgPyB5IDogcGFnZUhlaWdodDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJGaXQiOgorICAgICAgICBjYXNlICJGaXRCIjoKKyAgICAgICAgICBzY2FsZSA9ICJwYWdlLWZpdCI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiRml0SCI6CisgICAgICAgIGNhc2UgIkZpdEJIIjoKKyAgICAgICAgICB5ID0gZGVzdEFycmF5WzJdOworICAgICAgICAgIHNjYWxlID0gInBhZ2Utd2lkdGgiOworCisgICAgICAgICAgaWYgKHkgPT09IG51bGwgJiYgdGhpcy5fbG9jYXRpb24pIHsKKyAgICAgICAgICAgIHggPSB0aGlzLl9sb2NhdGlvbi5sZWZ0OworICAgICAgICAgICAgeSA9IHRoaXMuX2xvY2F0aW9uLnRvcDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJGaXRWIjoKKyAgICAgICAgY2FzZSAiRml0QlYiOgorICAgICAgICAgIHggPSBkZXN0QXJyYXlbMl07CisgICAgICAgICAgd2lkdGggPSBwYWdlV2lkdGg7CisgICAgICAgICAgaGVpZ2h0ID0gcGFnZUhlaWdodDsKKyAgICAgICAgICBzY2FsZSA9ICJwYWdlLWhlaWdodCI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiRml0UiI6CisgICAgICAgICAgeCA9IGRlc3RBcnJheVsyXTsKKyAgICAgICAgICB5ID0gZGVzdEFycmF5WzNdOworICAgICAgICAgIHdpZHRoID0gZGVzdEFycmF5WzRdIC0geDsKKyAgICAgICAgICBoZWlnaHQgPSBkZXN0QXJyYXlbNV0gLSB5OworICAgICAgICAgIHZhciBoUGFkZGluZyA9IHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMgPyAwIDogX3VpX3V0aWxzLlNDUk9MTEJBUl9QQURESU5HOworICAgICAgICAgIHZhciB2UGFkZGluZyA9IHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMgPyAwIDogX3VpX3V0aWxzLlZFUlRJQ0FMX1BBRERJTkc7CisgICAgICAgICAgd2lkdGhTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCAtIGhQYWRkaW5nKSAvIHdpZHRoIC8gX3VpX3V0aWxzLkNTU19VTklUUzsKKyAgICAgICAgICBoZWlnaHRTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgLSB2UGFkZGluZykgLyBoZWlnaHQgLyBfdWlfdXRpbHMuQ1NTX1VOSVRTOworICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oTWF0aC5hYnMod2lkdGhTY2FsZSksIE1hdGguYWJzKGhlaWdodFNjYWxlKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb25zb2xlLmVycm9yKCIiLmNvbmNhdCh0aGlzLl9uYW1lLCAiLnNjcm9sbFBhZ2VJbnRvVmlldzogIikgKyAiXCIiLmNvbmNhdChkZXN0QXJyYXlbMV0ubmFtZSwgIlwiIGlzIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIHR5cGUuIikpOworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCFpZ25vcmVEZXN0aW5hdGlvblpvb20pIHsKKyAgICAgICAgaWYgKHNjYWxlICYmIHNjYWxlICE9PSB0aGlzLl9jdXJyZW50U2NhbGUpIHsKKyAgICAgICAgICB0aGlzLmN1cnJlbnRTY2FsZVZhbHVlID0gc2NhbGU7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudFNjYWxlID09PSBfdWlfdXRpbHMuVU5LTk9XTl9TQ0FMRSkgeworICAgICAgICAgIHRoaXMuY3VycmVudFNjYWxlVmFsdWUgPSBfdWlfdXRpbHMuREVGQVVMVF9TQ0FMRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc2NhbGUgPT09ICJwYWdlLWZpdCIgJiYgIWRlc3RBcnJheVs0XSkgeworICAgICAgICB0aGlzLl9zY3JvbGxJbnRvVmlldyh7CisgICAgICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2LAorICAgICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXIKKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgYm91bmRpbmdSZWN0ID0gW3BhZ2VWaWV3LnZpZXdwb3J0LmNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCwgeSksIHBhZ2VWaWV3LnZpZXdwb3J0LmNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCArIHdpZHRoLCB5ICsgaGVpZ2h0KV07CisgICAgICB2YXIgbGVmdCA9IE1hdGgubWluKGJvdW5kaW5nUmVjdFswXVswXSwgYm91bmRpbmdSZWN0WzFdWzBdKTsKKyAgICAgIHZhciB0b3AgPSBNYXRoLm1pbihib3VuZGluZ1JlY3RbMF1bMV0sIGJvdW5kaW5nUmVjdFsxXVsxXSk7CisKKyAgICAgIGlmICghYWxsb3dOZWdhdGl2ZU9mZnNldCkgeworICAgICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgMCk7CisgICAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgMCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHsKKyAgICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2LAorICAgICAgICBwYWdlU3BvdDogeworICAgICAgICAgIGxlZnQ6IGxlZnQsCisgICAgICAgICAgdG9wOiB0b3AKKyAgICAgICAgfSwKKyAgICAgICAgcGFnZU51bWJlcjogcGFnZU51bWJlcgorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3VwZGF0ZUxvY2F0aW9uIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUxvY2F0aW9uKGZpcnN0UGFnZSkgeworICAgICAgdmFyIGN1cnJlbnRTY2FsZSA9IHRoaXMuX2N1cnJlbnRTY2FsZTsKKyAgICAgIHZhciBjdXJyZW50U2NhbGVWYWx1ZSA9IHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlOworICAgICAgdmFyIG5vcm1hbGl6ZWRTY2FsZVZhbHVlID0gcGFyc2VGbG9hdChjdXJyZW50U2NhbGVWYWx1ZSkgPT09IGN1cnJlbnRTY2FsZSA/IE1hdGgucm91bmQoY3VycmVudFNjYWxlICogMTAwMDApIC8gMTAwIDogY3VycmVudFNjYWxlVmFsdWU7CisgICAgICB2YXIgcGFnZU51bWJlciA9IGZpcnN0UGFnZS5pZDsKKyAgICAgIHZhciBwZGZPcGVuUGFyYW1zID0gIiNwYWdlPSIgKyBwYWdlTnVtYmVyOworICAgICAgcGRmT3BlblBhcmFtcyArPSAiJnpvb209IiArIG5vcm1hbGl6ZWRTY2FsZVZhbHVlOworICAgICAgdmFyIGN1cnJlbnRQYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3BhZ2VOdW1iZXIgLSAxXTsKKyAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKKyAgICAgIHZhciB0b3BMZWZ0ID0gY3VycmVudFBhZ2VWaWV3LmdldFBhZ2VQb2ludChjb250YWluZXIuc2Nyb2xsTGVmdCAtIGZpcnN0UGFnZS54LCBjb250YWluZXIuc2Nyb2xsVG9wIC0gZmlyc3RQYWdlLnkpOworICAgICAgdmFyIGludExlZnQgPSBNYXRoLnJvdW5kKHRvcExlZnRbMF0pOworICAgICAgdmFyIGludFRvcCA9IE1hdGgucm91bmQodG9wTGVmdFsxXSk7CisgICAgICBwZGZPcGVuUGFyYW1zICs9ICIsIiArIGludExlZnQgKyAiLCIgKyBpbnRUb3A7CisgICAgICB0aGlzLl9sb2NhdGlvbiA9IHsKKyAgICAgICAgcGFnZU51bWJlcjogcGFnZU51bWJlciwKKyAgICAgICAgc2NhbGU6IG5vcm1hbGl6ZWRTY2FsZVZhbHVlLAorICAgICAgICB0b3A6IGludFRvcCwKKyAgICAgICAgbGVmdDogaW50TGVmdCwKKyAgICAgICAgcm90YXRpb246IHRoaXMuX3BhZ2VzUm90YXRpb24sCisgICAgICAgIHBkZk9wZW5QYXJhbXM6IHBkZk9wZW5QYXJhbXMKKyAgICAgIH07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3VwZGF0ZUhlbHBlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogX3VwZGF0ZUhlbHBlciIpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInVwZGF0ZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHsKKyAgICAgIHZhciB2aXNpYmxlID0gdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCk7CisKKyAgICAgIHZhciB2aXNpYmxlUGFnZXMgPSB2aXNpYmxlLnZpZXdzLAorICAgICAgICAgIG51bVZpc2libGVQYWdlcyA9IHZpc2libGVQYWdlcy5sZW5ndGg7CisKKyAgICAgIGlmIChudW1WaXNpYmxlUGFnZXMgPT09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgbmV3Q2FjaGVTaXplID0gTWF0aC5tYXgoREVGQVVMVF9DQUNIRV9TSVpFLCAyICogbnVtVmlzaWJsZVBhZ2VzICsgMSk7CisKKyAgICAgIHRoaXMuX2J1ZmZlci5yZXNpemUobmV3Q2FjaGVTaXplLCB2aXNpYmxlUGFnZXMpOworCisgICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlLnJlbmRlckhpZ2hlc3RQcmlvcml0eSh2aXNpYmxlKTsKKworICAgICAgdGhpcy5fdXBkYXRlSGVscGVyKHZpc2libGVQYWdlcyk7CisKKyAgICAgIHRoaXMuX3VwZGF0ZUxvY2F0aW9uKHZpc2libGUuZmlyc3QpOworCisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJ1cGRhdGV2aWV3YXJlYSIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICBsb2NhdGlvbjogdGhpcy5fbG9jYXRpb24KKyAgICAgIH0pOworICAgIH0KKyAgfSwgeworICAgIGtleTogImNvbnRhaW5zRWxlbWVudCIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnRhaW5zRWxlbWVudChlbGVtZW50KSB7CisgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuY29udGFpbnMoZWxlbWVudCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZm9jdXMiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBmb2N1cygpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLmZvY3VzKCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2dldEN1cnJlbnRWaXNpYmxlUGFnZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRDdXJyZW50VmlzaWJsZVBhZ2UoKSB7CisgICAgICBpZiAoIXRoaXMucGFnZXNDb3VudCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIHZpZXdzOiBbXQorICAgICAgICB9OworICAgICAgfQorCisgICAgICB2YXIgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdOworICAgICAgdmFyIGVsZW1lbnQgPSBwYWdlVmlldy5kaXY7CisgICAgICB2YXIgdmlldyA9IHsKKyAgICAgICAgaWQ6IHBhZ2VWaWV3LmlkLAorICAgICAgICB4OiBlbGVtZW50Lm9mZnNldExlZnQgKyBlbGVtZW50LmNsaWVudExlZnQsCisgICAgICAgIHk6IGVsZW1lbnQub2Zmc2V0VG9wICsgZWxlbWVudC5jbGllbnRUb3AsCisgICAgICAgIHZpZXc6IHBhZ2VWaWV3CisgICAgICB9OworICAgICAgcmV0dXJuIHsKKyAgICAgICAgZmlyc3Q6IHZpZXcsCisgICAgICAgIGxhc3Q6IHZpZXcsCisgICAgICAgIHZpZXdzOiBbdmlld10KKyAgICAgIH07CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2dldFZpc2libGVQYWdlcyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRWaXNpYmxlUGFnZXMoKSB7CisgICAgICByZXR1cm4gKDAsIF91aV91dGlscy5nZXRWaXNpYmxlRWxlbWVudHMpKHRoaXMuY29udGFpbmVyLCB0aGlzLl9wYWdlcywgdHJ1ZSwgdGhpcy5faXNTY3JvbGxNb2RlSG9yaXpvbnRhbCk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNQYWdlVmlzaWJsZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGlzUGFnZVZpc2libGUocGFnZU51bWJlcikgeworICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhZ2VOdW1iZXIgPCAxIHx8IHBhZ2VOdW1iZXIgPiB0aGlzLnBhZ2VzQ291bnQpIHsKKyAgICAgICAgY29uc29sZS5lcnJvcigiIi5jb25jYXQodGhpcy5fbmFtZSwgIi5pc1BhZ2VWaXNpYmxlOiBcIiIpLmNvbmNhdChwYWdlTnVtYmVyLCAiXCIgaXMgb3V0IG9mIGJvdW5kcy4iKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX2dldFZpc2libGVQYWdlcygpLnZpZXdzLnNvbWUoZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgICAgcmV0dXJuIHZpZXcuaWQgPT09IHBhZ2VOdW1iZXI7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjbGVhbnVwIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYW51cCgpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgaWYgKHRoaXMuX3BhZ2VzW2ldICYmIHRoaXMuX3BhZ2VzW2ldLnJlbmRlcmluZ1N0YXRlICE9PSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQpIHsKKyAgICAgICAgICB0aGlzLl9wYWdlc1tpXS5yZXNldCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2NhbmNlbFJlbmRlcmluZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF9jYW5jZWxSZW5kZXJpbmcoKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLl9wYWdlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGlmICh0aGlzLl9wYWdlc1tpXSkgeworICAgICAgICAgIHRoaXMuX3BhZ2VzW2ldLmNhbmNlbFJlbmRlcmluZygpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX2Vuc3VyZVBkZlBhZ2VMb2FkZWQiLAorICAgIHZhbHVlOiBmdW5jdGlvbiBfZW5zdXJlUGRmUGFnZUxvYWRlZChwYWdlVmlldykgeworICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CisKKyAgICAgIGlmIChwYWdlVmlldy5wZGZQYWdlKSB7CisgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocGFnZVZpZXcucGRmUGFnZSk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9wYWdlc1JlcXVlc3RzLmhhcyhwYWdlVmlldykpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzUmVxdWVzdHMuZ2V0KHBhZ2VWaWV3KTsKKyAgICAgIH0KKworICAgICAgdmFyIHByb21pc2UgPSB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZVZpZXcuaWQpLnRoZW4oZnVuY3Rpb24gKHBkZlBhZ2UpIHsKKyAgICAgICAgaWYgKCFwYWdlVmlldy5wZGZQYWdlKSB7CisgICAgICAgICAgcGFnZVZpZXcuc2V0UGRmUGFnZShwZGZQYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIF90aGlzMy5fcGFnZXNSZXF1ZXN0c1siZGVsZXRlIl0ocGFnZVZpZXcpOworCisgICAgICAgIHJldHVybiBwZGZQYWdlOworICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gZ2V0IHBhZ2UgZm9yIHBhZ2UgdmlldyIsIHJlYXNvbik7CisKKyAgICAgICAgX3RoaXMzLl9wYWdlc1JlcXVlc3RzWyJkZWxldGUiXShwYWdlVmlldyk7CisgICAgICB9KTsKKworICAgICAgdGhpcy5fcGFnZXNSZXF1ZXN0cy5zZXQocGFnZVZpZXcsIHByb21pc2UpOworCisgICAgICByZXR1cm4gcHJvbWlzZTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmb3JjZVJlbmRlcmluZyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGZvcmNlUmVuZGVyaW5nKGN1cnJlbnRseVZpc2libGVQYWdlcykgeworICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CisKKyAgICAgIHZhciB2aXNpYmxlUGFnZXMgPSBjdXJyZW50bHlWaXNpYmxlUGFnZXMgfHwgdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCk7CisKKyAgICAgIHZhciBzY3JvbGxBaGVhZCA9IHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWwgPyB0aGlzLnNjcm9sbC5yaWdodCA6IHRoaXMuc2Nyb2xsLmRvd247CisgICAgICB2YXIgcGFnZVZpZXcgPSB0aGlzLnJlbmRlcmluZ1F1ZXVlLmdldEhpZ2hlc3RQcmlvcml0eSh2aXNpYmxlUGFnZXMsIHRoaXMuX3BhZ2VzLCBzY3JvbGxBaGVhZCk7CisKKyAgICAgIGlmIChwYWdlVmlldykgeworICAgICAgICB0aGlzLl9lbnN1cmVQZGZQYWdlTG9hZGVkKHBhZ2VWaWV3KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBfdGhpczQucmVuZGVyaW5nUXVldWUucmVuZGVyVmlldyhwYWdlVmlldyk7CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY3JlYXRlVGV4dExheWVyQnVpbGRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZVRleHRMYXllckJ1aWxkZXIodGV4dExheWVyRGl2LCBwYWdlSW5kZXgsIHZpZXdwb3J0KSB7CisgICAgICB2YXIgZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlOworICAgICAgdmFyIGV2ZW50QnVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgPyBhcmd1bWVudHNbNF0gOiB1bmRlZmluZWQ7CisgICAgICByZXR1cm4gbmV3IF90ZXh0X2xheWVyX2J1aWxkZXIuVGV4dExheWVyQnVpbGRlcih7CisgICAgICAgIHRleHRMYXllckRpdjogdGV4dExheWVyRGl2LAorICAgICAgICBldmVudEJ1czogZXZlbnRCdXMsCisgICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LAorICAgICAgICB2aWV3cG9ydDogdmlld3BvcnQsCisgICAgICAgIGZpbmRDb250cm9sbGVyOiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlID8gbnVsbCA6IHRoaXMuZmluZENvbnRyb2xsZXIsCisgICAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlID8gZmFsc2UgOiBlbmhhbmNlVGV4dFNlbGVjdGlvbgorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUFubm90YXRpb25MYXllckJ1aWxkZXIocGFnZURpdiwgcGRmUGFnZSkgeworICAgICAgdmFyIGFubm90YXRpb25TdG9yYWdlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsOworICAgICAgdmFyIGltYWdlUmVzb3VyY2VzUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogIiI7CisgICAgICB2YXIgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogZmFsc2U7CisgICAgICB2YXIgbDEwbiA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogX3VpX3V0aWxzLk51bGxMMTBuOworICAgICAgcmV0dXJuIG5ldyBfYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyLkFubm90YXRpb25MYXllckJ1aWxkZXIoeworICAgICAgICBwYWdlRGl2OiBwYWdlRGl2LAorICAgICAgICBwZGZQYWdlOiBwZGZQYWdlLAorICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogYW5ub3RhdGlvblN0b3JhZ2UsCisgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogaW1hZ2VSZXNvdXJjZXNQYXRoLAorICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgICBsaW5rU2VydmljZTogdGhpcy5saW5rU2VydmljZSwKKyAgICAgICAgZG93bmxvYWRNYW5hZ2VyOiB0aGlzLmRvd25sb2FkTWFuYWdlciwKKyAgICAgICAgbDEwbjogbDEwbgorICAgICAgfSk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiZ2V0UGFnZXNPdmVydmlldyIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBhZ2VzT3ZlcnZpZXcoKSB7CisgICAgICB2YXIgcGFnZXNPdmVydmlldyA9IHRoaXMuX3BhZ2VzLm1hcChmdW5jdGlvbiAocGFnZVZpZXcpIHsKKyAgICAgICAgdmFyIHZpZXdwb3J0ID0gcGFnZVZpZXcucGRmUGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgICAgc2NhbGU6IDEKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLAorICAgICAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LAorICAgICAgICAgIHJvdGF0aW9uOiB2aWV3cG9ydC5yb3RhdGlvbgorICAgICAgICB9OworICAgICAgfSk7CisKKyAgICAgIGlmICghdGhpcy5lbmFibGVQcmludEF1dG9Sb3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIHBhZ2VzT3ZlcnZpZXc7CisgICAgICB9CisKKyAgICAgIHJldHVybiBwYWdlc092ZXJ2aWV3Lm1hcChmdW5jdGlvbiAoc2l6ZSkgeworICAgICAgICBpZiAoKDAsIF91aV91dGlscy5pc1BvcnRyYWl0T3JpZW50YXRpb24pKHNpemUpKSB7CisgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgIHdpZHRoOiBzaXplLmhlaWdodCwKKyAgICAgICAgICBoZWlnaHQ6IHNpemUud2lkdGgsCisgICAgICAgICAgcm90YXRpb246IChzaXplLnJvdGF0aW9uICsgOTApICUgMzYwCisgICAgICAgIH07CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfdXBkYXRlU2Nyb2xsTW9kZSIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVTY3JvbGxNb2RlKCkgeworICAgICAgdmFyIHBhZ2VOdW1iZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7CisgICAgICB2YXIgc2Nyb2xsTW9kZSA9IHRoaXMuX3Njcm9sbE1vZGUsCisgICAgICAgICAgdmlld2VyID0gdGhpcy52aWV3ZXI7CisgICAgICB2aWV3ZXIuY2xhc3NMaXN0LnRvZ2dsZSgic2Nyb2xsSG9yaXpvbnRhbCIsIHNjcm9sbE1vZGUgPT09IF91aV91dGlscy5TY3JvbGxNb2RlLkhPUklaT05UQUwpOworICAgICAgdmlld2VyLmNsYXNzTGlzdC50b2dnbGUoInNjcm9sbFdyYXBwZWQiLCBzY3JvbGxNb2RlID09PSBfdWlfdXRpbHMuU2Nyb2xsTW9kZS5XUkFQUEVEKTsKKworICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50IHx8ICFwYWdlTnVtYmVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlICYmIGlzTmFOKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlKSkgeworICAgICAgICB0aGlzLl9zZXRTY2FsZSh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSwgdHJ1ZSk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKHBhZ2VOdW1iZXIsIHRydWUpOworCisgICAgICB0aGlzLnVwZGF0ZSgpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl91cGRhdGVTcHJlYWRNb2RlIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZVNwcmVhZE1vZGUoKSB7CisgICAgICB2YXIgcGFnZU51bWJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDsKKworICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHZpZXdlciA9IHRoaXMudmlld2VyLAorICAgICAgICAgIHBhZ2VzID0gdGhpcy5fcGFnZXM7CisgICAgICB2aWV3ZXIudGV4dENvbnRlbnQgPSAiIjsKKworICAgICAgaWYgKHRoaXMuX3NwcmVhZE1vZGUgPT09IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkUpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlNYXggPSBwYWdlcy5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHsKKyAgICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQocGFnZXNbaV0uZGl2KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIHBhcml0eSA9IHRoaXMuX3NwcmVhZE1vZGUgLSAxOworICAgICAgICB2YXIgc3ByZWFkID0gbnVsbDsKKworICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9pTWF4ID0gcGFnZXMubGVuZ3RoOyBfaSA8IF9pTWF4OyArK19pKSB7CisgICAgICAgICAgaWYgKHNwcmVhZCA9PT0gbnVsbCkgeworICAgICAgICAgICAgc3ByZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgICAgICBzcHJlYWQuY2xhc3NOYW1lID0gInNwcmVhZCI7CisgICAgICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQoc3ByZWFkKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKF9pICUgMiA9PT0gcGFyaXR5KSB7CisgICAgICAgICAgICBzcHJlYWQgPSBzcHJlYWQuY2xvbmVOb2RlKGZhbHNlKTsKKyAgICAgICAgICAgIHZpZXdlci5hcHBlbmRDaGlsZChzcHJlYWQpOworICAgICAgICAgIH0KKworICAgICAgICAgIHNwcmVhZC5hcHBlbmRDaGlsZChwYWdlc1tfaV0uZGl2KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXBhZ2VOdW1iZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyLCB0cnVlKTsKKworICAgICAgdGhpcy51cGRhdGUoKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJwYWdlc0NvdW50IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlcy5sZW5ndGg7CisgICAgfQorICB9LCB7CisgICAga2V5OiAicGFnZVZpZXdzUmVhZHkiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgaWYgKCF0aGlzLl9wYWdlc0NhcGFiaWxpdHkuc2V0dGxlZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlcy5ldmVyeShmdW5jdGlvbiAocGFnZVZpZXcpIHsKKyAgICAgICAgcmV0dXJuIHBhZ2VWaWV3ICYmIHBhZ2VWaWV3LnBkZlBhZ2U7CisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjdXJyZW50UGFnZU51bWJlciIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXI7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHsKKyAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWwpKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYWdlIG51bWJlci4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcih2YWwsIHRydWUpKSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoIiIuY29uY2F0KHRoaXMuX25hbWUsICIuY3VycmVudFBhZ2VOdW1iZXI6IFwiIikuY29uY2F0KHZhbCwgIlwiIGlzIG5vdCBhIHZhbGlkIHBhZ2UuIikpOworICAgICAgfQorICAgIH0KKyAgfSwgeworICAgIGtleTogImN1cnJlbnRQYWdlTGFiZWwiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VMYWJlbHMgJiYgdGhpcy5fcGFnZUxhYmVsc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdOworICAgIH0sCisgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsKSB7CisgICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcGFnZSA9IHZhbCB8IDA7CisKKyAgICAgIGlmICh0aGlzLl9wYWdlTGFiZWxzKSB7CisgICAgICAgIHZhciBpID0gdGhpcy5fcGFnZUxhYmVscy5pbmRleE9mKHZhbCk7CisKKyAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgIHBhZ2UgPSBpICsgMTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKHBhZ2UsIHRydWUpKSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoIiIuY29uY2F0KHRoaXMuX25hbWUsICIuY3VycmVudFBhZ2VMYWJlbDogXCIiKS5jb25jYXQodmFsLCAiXCIgaXMgbm90IGEgdmFsaWQgcGFnZS4iKSk7CisgICAgICB9CisgICAgfQorICB9LCB7CisgICAga2V5OiAiY3VycmVudFNjYWxlIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2NhbGUgIT09IF91aV91dGlscy5VTktOT1dOX1NDQUxFID8gdGhpcy5fY3VycmVudFNjYWxlIDogX3VpX3V0aWxzLkRFRkFVTFRfU0NBTEU7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHsKKyAgICAgIGlmIChpc05hTih2YWwpKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBudW1lcmljIHNjYWxlLiIpOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9zZXRTY2FsZSh2YWwsIGZhbHNlKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJjdXJyZW50U2NhbGVWYWx1ZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFNjYWxlVmFsdWU7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHsKKyAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX3NldFNjYWxlKHZhbCwgZmFsc2UpOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBhZ2VzUm90YXRpb24iLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzUm90YXRpb247CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uIHNldChyb3RhdGlvbikgeworICAgICAgaWYgKCEoMCwgX3VpX3V0aWxzLmlzVmFsaWRSb3RhdGlvbikocm90YXRpb24pKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYWdlcyByb3RhdGlvbiBhbmdsZS4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3BhZ2VzUm90YXRpb24gPT09IHJvdGF0aW9uKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IHJvdGF0aW9uOworICAgICAgdmFyIHBhZ2VOdW1iZXIgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1tpXTsKKyAgICAgICAgcGFnZVZpZXcudXBkYXRlKHBhZ2VWaWV3LnNjYWxlLCByb3RhdGlvbik7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSkgeworICAgICAgICB0aGlzLl9zZXRTY2FsZSh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSwgdHJ1ZSk7CisgICAgICB9CisKKyAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInJvdGF0aW9uY2hhbmdpbmciLCB7CisgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgcGFnZXNSb3RhdGlvbjogcm90YXRpb24sCisgICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXIKKyAgICAgIH0pOworCisgICAgICBpZiAodGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHsKKyAgICAgICAgdGhpcy51cGRhdGUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJmaXJzdFBhZ2VQcm9taXNlIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5wcm9taXNlIDogbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJvbmVQYWdlUmVuZGVyZWQiLAorICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLl9vbmVQYWdlUmVuZGVyZWRDYXBhYmlsaXR5LnByb21pc2UgOiBudWxsOworICAgIH0KKyAgfSwgeworICAgIGtleTogInBhZ2VzUHJvbWlzZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5wcm9taXNlIDogbnVsbDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfdmlld2VyRWxlbWVudCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogX3ZpZXdlckVsZW1lbnQiKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfaXNTY3JvbGxNb2RlSG9yaXpvbnRhbCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSA/IGZhbHNlIDogdGhpcy5fc2Nyb2xsTW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuSE9SSVpPTlRBTDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc0luUHJlc2VudGF0aW9uTW9kZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5wcmVzZW50YXRpb25Nb2RlU3RhdGUgPT09IF91aV91dGlscy5QcmVzZW50YXRpb25Nb2RlU3RhdGUuRlVMTFNDUkVFTjsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc0NoYW5naW5nUHJlc2VudGF0aW9uTW9kZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5wcmVzZW50YXRpb25Nb2RlU3RhdGUgPT09IF91aV91dGlscy5QcmVzZW50YXRpb25Nb2RlU3RhdGUuQ0hBTkdJTkc7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiaXNIb3Jpem9udGFsU2Nyb2xsYmFyRW5hYmxlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSA/IGZhbHNlIDogdGhpcy5jb250YWluZXIuc2Nyb2xsV2lkdGggPiB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aDsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJpc1ZlcnRpY2FsU2Nyb2xsYmFyRW5hYmxlZCIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSA/IGZhbHNlIDogdGhpcy5jb250YWluZXIuc2Nyb2xsSGVpZ2h0ID4gdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0OworICAgIH0KKyAgfSwgeworICAgIGtleTogImhhc0VxdWFsUGFnZVNpemVzIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHZhciBmaXJzdFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbMF07CisKKyAgICAgIGZvciAodmFyIGkgPSAxLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgdmFyIHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbaV07CisKKyAgICAgICAgaWYgKHBhZ2VWaWV3LndpZHRoICE9PSBmaXJzdFBhZ2VWaWV3LndpZHRoIHx8IHBhZ2VWaWV3LmhlaWdodCAhPT0gZmlyc3RQYWdlVmlldy5oZWlnaHQpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9LCB7CisgICAga2V5OiAib3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSIsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24gc2V0KHByb21pc2UpIHsKKyAgICAgIGlmICghKHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTogIi5jb25jYXQocHJvbWlzZSkpOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gcHJvbWlzZTsKKworICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuX3BhZ2VzKSwKKyAgICAgICAgICBfc3RlcDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgcGFnZVZpZXcgPSBfc3RlcC52YWx1ZTsKKyAgICAgICAgICBwYWdlVmlldy51cGRhdGUocGFnZVZpZXcuc2NhbGUsIHBhZ2VWaWV3LnJvdGF0aW9uLCBwcm9taXNlKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIF9pdGVyYXRvci5lKGVycik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBfaXRlcmF0b3IuZigpOworICAgICAgfQorCisgICAgICB0aGlzLnVwZGF0ZSgpOworICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgib3B0aW9uYWxjb250ZW50Y29uZmlnY2hhbmdlZCIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICBwcm9taXNlOiBwcm9taXNlCisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzY3JvbGxNb2RlIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxNb2RlOworICAgIH0sCisgICAgc2V0OiBmdW5jdGlvbiBzZXQobW9kZSkgeworICAgICAgaWYgKHRoaXMuX3Njcm9sbE1vZGUgPT09IG1vZGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoISgwLCBfdWlfdXRpbHMuaXNWYWxpZFNjcm9sbE1vZGUpKG1vZGUpKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzY3JvbGwgbW9kZTogIi5jb25jYXQobW9kZSkpOworICAgICAgfQorCisgICAgICB0aGlzLl9zY3JvbGxNb2RlID0gbW9kZTsKKyAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInNjcm9sbG1vZGVjaGFuZ2VkIiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIG1vZGU6IG1vZGUKKyAgICAgIH0pOworCisgICAgICB0aGlzLl91cGRhdGVTY3JvbGxNb2RlKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyKTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJzcHJlYWRNb2RlIiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9zcHJlYWRNb2RlOworICAgIH0sCisgICAgc2V0OiBmdW5jdGlvbiBzZXQobW9kZSkgeworICAgICAgaWYgKHRoaXMuX3NwcmVhZE1vZGUgPT09IG1vZGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoISgwLCBfdWlfdXRpbHMuaXNWYWxpZFNwcmVhZE1vZGUpKG1vZGUpKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzcHJlYWQgbW9kZTogIi5jb25jYXQobW9kZSkpOworICAgICAgfQorCisgICAgICB0aGlzLl9zcHJlYWRNb2RlID0gbW9kZTsKKyAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInNwcmVhZG1vZGVjaGFuZ2VkIiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIG1vZGU6IG1vZGUKKyAgICAgIH0pOworCisgICAgICB0aGlzLl91cGRhdGVTcHJlYWRNb2RlKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyKTsKKyAgICB9CisgIH1dKTsKKworICByZXR1cm4gQmFzZVZpZXdlcjsKK30oKTsKKworZXhwb3J0cy5CYXNlVmlld2VyID0gQmFzZVZpZXdlcjsKKworLyoqKi8gfSksCisvKiAyMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERlZpZXdlciA9IHZvaWQgMDsKKwordmFyIF9iYXNlX3ZpZXdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpOworCit2YXIgX3BkZmpzTGliID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9CisKK2Z1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJ1bmRlZmluZWQiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFsicmV0dXJuIl0gIT0gbnVsbCkgaXRbInJldHVybiJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH0KKworZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KKworZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9CisKK2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQorCitmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfQorCitmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQorCitmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5nZXQpIHsgX2dldCA9IFJlZmxlY3QuZ2V0OyB9IGVsc2UgeyBfZ2V0ID0gZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgYmFzZSA9IF9zdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpOyBpZiAoIWJhc2UpIHJldHVybjsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTsgaWYgKGRlc2MuZ2V0KSB7IHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTsgfSByZXR1cm4gZGVzYy52YWx1ZTsgfTsgfSByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpOyB9CisKK2Z1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHsgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrOyB9IHJldHVybiBvYmplY3Q7IH0KKworZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfQorCitmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfQorCitmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQorCitmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH0KKworZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsgfSByZXR1cm4gc2VsZjsgfQorCitmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KKworZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfQorCit2YXIgUERGVmlld2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQmFzZVZpZXdlcikgeworICBfaW5oZXJpdHMoUERGVmlld2VyLCBfQmFzZVZpZXdlcik7CisKKyAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQREZWaWV3ZXIpOworCisgIGZ1bmN0aW9uIFBERlZpZXdlcigpIHsKKyAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGVmlld2VyKTsKKworICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfQorCisgIF9jcmVhdGVDbGFzcyhQREZWaWV3ZXIsIFt7CisgICAga2V5OiAiX3Njcm9sbEludG9WaWV3IiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX3Njcm9sbEludG9WaWV3KF9yZWYpIHsKKyAgICAgIHZhciBwYWdlRGl2ID0gX3JlZi5wYWdlRGl2LAorICAgICAgICAgIF9yZWYkcGFnZVNwb3QgPSBfcmVmLnBhZ2VTcG90LAorICAgICAgICAgIHBhZ2VTcG90ID0gX3JlZiRwYWdlU3BvdCA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkcGFnZVNwb3QsCisgICAgICAgICAgX3JlZiRwYWdlTnVtYmVyID0gX3JlZi5wYWdlTnVtYmVyLAorICAgICAgICAgIHBhZ2VOdW1iZXIgPSBfcmVmJHBhZ2VOdW1iZXIgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJHBhZ2VOdW1iZXI7CisKKyAgICAgIGlmICghcGFnZVNwb3QgJiYgIXRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUpIHsKKyAgICAgICAgdmFyIGxlZnQgPSBwYWdlRGl2Lm9mZnNldExlZnQgKyBwYWdlRGl2LmNsaWVudExlZnQ7CisgICAgICAgIHZhciByaWdodCA9IGxlZnQgKyBwYWdlRGl2LmNsaWVudFdpZHRoOworICAgICAgICB2YXIgX3RoaXMkY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsCisgICAgICAgICAgICBzY3JvbGxMZWZ0ID0gX3RoaXMkY29udGFpbmVyLnNjcm9sbExlZnQsCisgICAgICAgICAgICBjbGllbnRXaWR0aCA9IF90aGlzJGNvbnRhaW5lci5jbGllbnRXaWR0aDsKKworICAgICAgICBpZiAodGhpcy5faXNTY3JvbGxNb2RlSG9yaXpvbnRhbCB8fCBsZWZ0IDwgc2Nyb2xsTGVmdCB8fCByaWdodCA+IHNjcm9sbExlZnQgKyBjbGllbnRXaWR0aCkgeworICAgICAgICAgIHBhZ2VTcG90ID0geworICAgICAgICAgICAgbGVmdDogMCwKKyAgICAgICAgICAgIHRvcDogMAorICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoUERGVmlld2VyLnByb3RvdHlwZSksICJfc2Nyb2xsSW50b1ZpZXciLCB0aGlzKS5jYWxsKHRoaXMsIHsKKyAgICAgICAgcGFnZURpdjogcGFnZURpdiwKKyAgICAgICAgcGFnZVNwb3Q6IHBhZ2VTcG90LAorICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyCisgICAgICB9KTsKKyAgICB9CisgIH0sIHsKKyAgICBrZXk6ICJfZ2V0VmlzaWJsZVBhZ2VzIiwKKyAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFZpc2libGVQYWdlcygpIHsKKyAgICAgIGlmICh0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9nZXRDdXJyZW50VmlzaWJsZVBhZ2UoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKFBERlZpZXdlci5wcm90b3R5cGUpLCAiX2dldFZpc2libGVQYWdlcyIsIHRoaXMpLmNhbGwodGhpcyk7CisgICAgfQorICB9LCB7CisgICAga2V5OiAiX3VwZGF0ZUhlbHBlciIsCisgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKSB7CisgICAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBjdXJyZW50SWQgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKyAgICAgIHZhciBzdGlsbEZ1bGx5VmlzaWJsZSA9IGZhbHNlOworCisgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodmlzaWJsZVBhZ2VzKSwKKyAgICAgICAgICBfc3RlcDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKKyAgICAgICAgICB2YXIgcGFnZSA9IF9zdGVwLnZhbHVlOworCisgICAgICAgICAgaWYgKHBhZ2UucGVyY2VudCA8IDEwMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHBhZ2UuaWQgPT09IGN1cnJlbnRJZCkgeworICAgICAgICAgICAgc3RpbGxGdWxseVZpc2libGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIF9pdGVyYXRvci5mKCk7CisgICAgICB9CisKKyAgICAgIGlmICghc3RpbGxGdWxseVZpc2libGUpIHsKKyAgICAgICAgY3VycmVudElkID0gdmlzaWJsZVBhZ2VzWzBdLmlkOworICAgICAgfQorCisgICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihjdXJyZW50SWQpOworICAgIH0KKyAgfSwgeworICAgIGtleTogIl92aWV3ZXJFbGVtZW50IiwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiAoMCwgX3BkZmpzTGliLnNoYWRvdykodGhpcywgIl92aWV3ZXJFbGVtZW50IiwgdGhpcy52aWV3ZXIpOworICAgIH0KKyAgfV0pOworCisgIHJldHVybiBQREZWaWV3ZXI7Cit9KF9iYXNlX3ZpZXdlci5CYXNlVmlld2VyKTsKKworZXhwb3J0cy5QREZWaWV3ZXIgPSBQREZWaWV3ZXI7CisKKy8qKiovIH0pCisvKioqKioqLyBdKTsKK30pOworLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGRmX3ZpZXdlci5qcy5tYXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9lczUvd2ViL3BkZl92aWV3ZXIuanMubWFwIGIvZXM1L3dlYi9wZGZfdmlld2VyLmpzLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDRkMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZXM1L3dlYi9wZGZfdmlld2VyLmpzLm1hcApAQCAtMCwwICsxIEBACit7InZlcnNpb24iOjMsInNvdXJjZXMiOlsid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvcGRmX3ZpZXdlci5jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3BkZmpzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3VpX3V0aWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyL3dlYi9wZGZfbGlua19zZXJ2aWNlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3RleHRfbGF5ZXJfYnVpbGRlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyL3dlYi9kb3dubG9hZF9tYW5hZ2VyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3ZpZXdlcl9jb21wYXRpYmlsaXR5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL2dlbmVyaWNsMTBuLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvZXh0ZXJuYWwvd2ViTDEwbi9sMTBuLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3BkZl9maW5kX2NvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvcGRmX2ZpbmRfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvcGRmX2hpc3RvcnkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvcGRmX3BhZ2Vfdmlldy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyL3dlYi9wZGZfcmVuZGVyaW5nX3F1ZXVlLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvYmFzZV92aWV3ZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvcGRmX3ZpZXdlci5qcyJdLCJuYW1lcyI6WyJwZGZqc1ZlcnNpb24iLCJwZGZqc0J1aWxkIiwiY29uc3RydWN0b3IiLCJhbm5vdGF0aW9uU3RvcmFnZSIsImltYWdlUmVzb3VyY2VzUGF0aCIsInJlbmRlckludGVyYWN0aXZlRm9ybXMiLCJsMTBuIiwicmVuZGVyIiwiaW50ZW50IiwiYW5ub3RhdGlvbnMiLCJwYXJhbWV0ZXJzIiwidmlld3BvcnQiLCJkb250RmxpcCIsImRpdiIsInBhZ2UiLCJsaW5rU2VydmljZSIsImRvd25sb2FkTWFuYWdlciIsIkFubm90YXRpb25MYXllciIsImRvY3VtZW50IiwiY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlciIsInBhZ2VEaXYiLCJwZGZQYWdlIiwid2luZG93IiwicGRmanNMaWIiLCJfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZSIsIkNTU19VTklUUyIsIkRFRkFVTFRfU0NBTEVfVkFMVUUiLCJERUZBVUxUX1NDQUxFIiwiTUlOX1NDQUxFIiwiTUFYX1NDQUxFIiwiVU5LTk9XTl9TQ0FMRSIsIk1BWF9BVVRPX1NDQUxFIiwiU0NST0xMQkFSX1BBRERJTkciLCJWRVJUSUNBTF9QQURESU5HIiwiUHJlc2VudGF0aW9uTW9kZVN0YXRlIiwiVU5LTk9XTiIsIk5PUk1BTCIsIkNIQU5HSU5HIiwiRlVMTFNDUkVFTiIsIlJlbmRlcmVyVHlwZSIsIkNBTlZBUyIsIlNWRyIsIlRleHRMYXllck1vZGUiLCJESVNBQkxFIiwiRU5BQkxFIiwiRU5BQkxFX0VOSEFOQ0UiLCJTY3JvbGxNb2RlIiwiVkVSVElDQUwiLCJIT1JJWk9OVEFMIiwiV1JBUFBFRCIsIlNwcmVhZE1vZGUiLCJOT05FIiwiT0REIiwiRVZFTiIsIkF1dG9QcmludFJlZ0V4cCIsIm5hbWUiLCJhcmdzIiwiTnVsbEwxMG4iLCJmb3JtYXRMMTBuVmFsdWUiLCJkZXZpY2VQaXhlbFJhdGlvIiwiYmFja2luZ1N0b3JlUmF0aW8iLCJjdHgiLCJwaXhlbFJhdGlvIiwic3giLCJzeSIsInNjYWxlZCIsInNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzIiwicGFyZW50IiwiZWxlbWVudCIsImNvbnNvbGUiLCJvZmZzZXRZIiwib2Zmc2V0WCIsImdldENvbXB1dGVkU3R5bGUiLCJzcG90IiwiZGVib3VuY2VTY3JvbGwiLCJyQUYiLCJjdXJyZW50WCIsInZpZXdBcmVhRWxlbWVudCIsImxhc3RYIiwic3RhdGUiLCJjdXJyZW50WSIsImxhc3RZIiwiY2FsbGJhY2siLCJyaWdodCIsImRvd24iLCJfZXZlbnRIYW5kbGVyIiwicGFydHMiLCJxdWVyeSIsInBhcmFtcyIsIk9iamVjdCIsImkiLCJpaSIsInBhcmFtIiwia2V5IiwidmFsdWUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJtaW5JbmRleCIsIm1heEluZGV4IiwiaXRlbXMiLCJjb25kaXRpb24iLCJjdXJyZW50SW5kZXgiLCJjdXJyZW50SXRlbSIsIk1hdGgiLCJ4aW52IiwibGltaXQiLCJ4XyIsIngiLCJhIiwiYiIsImMiLCJkIiwicCIsInEiLCJyZXN1bHQiLCJyIiwiY2hhbmdlT3JpZW50YXRpb24iLCJyb3RhdGUiLCJ3aWR0aCIsImhlaWdodCIsImluZGV4IiwiZWx0Iiwidmlld3MiLCJwYWdlVG9wIiwic29ydEJ5VmlzaWJpbGl0eSIsImhvcml6b250YWwiLCJ0b3AiLCJzY3JvbGxFbCIsImJvdHRvbSIsImxlZnQiLCJ2aWV3IiwiZWxlbWVudEJvdHRvbSIsImVsZW1lbnRSaWdodCIsInZpc2libGUiLCJudW1WaWV3cyIsImZpcnN0VmlzaWJsZUVsZW1lbnRJbmQiLCJiaW5hcnlTZWFyY2hGaXJzdEl0ZW0iLCJiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMiLCJsYXN0RWRnZSIsImN1cnJlbnRXaWR0aCIsImN1cnJlbnRIZWlnaHQiLCJ2aWV3V2lkdGgiLCJ2aWV3SGVpZ2h0Iiwidmlld1JpZ2h0Iiwidmlld0JvdHRvbSIsImhpZGRlbkhlaWdodCIsImhpZGRlbldpZHRoIiwicGVyY2VudCIsImlkIiwieSIsImZpcnN0IiwibGFzdCIsInBjIiwiZXZ0IiwidXJsIiwiZGVmYXVsdEZpbGVuYW1lIiwiaXNEYXRhU2NoZW1hIiwicmVVUkkiLCJyZUZpbGVuYW1lIiwic3BsaXRVUkkiLCJzdWdnZXN0ZWRGaWxlbmFtZSIsImRlbHRhIiwiYW5nbGUiLCJub3JtYWxpemVXaGVlbEV2ZW50RGlyZWN0aW9uIiwiTU9VU0VfRE9NX0RFTFRBX1BJWEVMX01PREUiLCJNT1VTRV9ET01fREVMVEFfTElORV9NT0RFIiwiTU9VU0VfUElYRUxTX1BFUl9MSU5FIiwiTU9VU0VfTElORVNfUEVSX1BBR0UiLCJOdW1iZXIiLCJtb2RlIiwic2l6ZSIsIldhaXRPblR5cGUiLCJFVkVOVCIsIlRJTUVPVVQiLCJkZWxheSIsInRhcmdldCIsImNsZWFyVGltZW91dCIsInJlc29sdmUiLCJldmVudEhhbmRsZXIiLCJoYW5kbGVyIiwidGltZW91dEhhbmRsZXIiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsImFuaW1hdGlvblN0YXJ0ZWQiLCJvbiIsImV4dGVybmFsIiwib2ZmIiwiZGlzcGF0Y2giLCJldmVudExpc3RlbmVycyIsIkFycmF5IiwiZXh0ZXJuYWxMaXN0ZW5lcnMiLCJsaXN0ZW5lciIsIl9vbiIsIm9wdGlvbnMiLCJfb2ZmIiwidW5pdHMiLCJwcm9ncmVzc1NpemUiLCJzZXRXaWR0aCIsImNvbnRhaW5lciIsInZpZXdlciIsInNjcm9sbGJhcldpZHRoIiwiaXNOYU4iLCJjbGFtcCIsIm1vdmVkIiwibGVuIiwiYXJyIiwid3JpdGUiLCJyZWFkIiwicmVxdWlyZSIsInJ1bnRpbWUiLCJPcCIsImhhc093biIsIiRTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIm9iaiIsImRlZmluZSIsInByb3RvR2VuZXJhdG9yIiwib3V0ZXJGbiIsImdlbmVyYXRvciIsImNvbnRleHQiLCJ0cnlMb2NzTGlzdCIsIm1ha2VJbnZva2VNZXRob2QiLCJleHBvcnRzIiwidHlwZSIsImFyZyIsImZuIiwiR2VuU3RhdGVTdXNwZW5kZWRTdGFydCIsIkdlblN0YXRlU3VzcGVuZGVkWWllbGQiLCJHZW5TdGF0ZUV4ZWN1dGluZyIsIkdlblN0YXRlQ29tcGxldGVkIiwiQ29udGludWVTZW50aW5lbCIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJHZW5lcmF0b3JGdW5jdGlvbiIsImN0b3IiLCJnZW5GdW4iLCJfX2F3YWl0IiwicmVjb3JkIiwidHJ5Q2F0Y2giLCJyZWplY3QiLCJpbnZva2UiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsIml0ZXIiLCJ3cmFwIiwibWV0aG9kIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwiZG9uZSIsImluZm8iLCJlbnRyeSIsInRyeUxvYyIsImxvY3MiLCJrZXlzIiwibmV4dCIsIml0ZXJhdG9yTWV0aG9kIiwiaXRlcmFibGUiLCJDb250ZXh0IiwicmVzZXQiLCJzdG9wIiwicm9vdEVudHJ5Iiwicm9vdFJlY29yZCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiaGFuZGxlIiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiYWJydXB0IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJyZXNldFRyeUVudHJ5IiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIml0ZXJhdG9yIiwicmVzdWx0TmFtZSIsIm5leHRMb2MiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJGdW5jdGlvbiIsImdldCIsImV4dGVybmFsTGlua1RhcmdldCIsImV4dGVybmFsTGlua1JlbCIsImV4dGVybmFsTGlua0VuYWJsZWQiLCJpZ25vcmVEZXN0aW5hdGlvblpvb20iLCJzZXREb2N1bWVudCIsImJhc2VVcmwiLCJzZXRWaWV3ZXIiLCJzZXRIaXN0b3J5IiwibmF2aWdhdGVUbyIsImdvVG9EZXN0aW5hdGlvbiIsImRlc3RSZWYiLCJleHBsaWNpdERlc3QiLCJwYWdlTnVtYmVyIiwicGFnZUluZGV4IiwibmFtZWREZXN0IiwiZGVzdEFycmF5IiwiZGF0YSIsImdldERlc3RpbmF0aW9uSGFzaCIsImVzY2FwZSIsInN0ciIsIkpTT04iLCJnZXRBbmNob3JVcmwiLCJzZXRIYXNoIiwiaGFzaCIsInBhcnNlUXVlcnlTdHJpbmciLCJzb3VyY2UiLCJwaHJhc2VTZWFyY2giLCJ6b29tQXJncyIsInpvb21BcmciLCJ6b29tQXJnTnVtYmVyIiwicGFyc2VGbG9hdCIsImRlc3QiLCJhbGxvd05lZ2F0aXZlT2Zmc2V0IiwidW5lc2NhcGUiLCJpc1ZhbGlkRXhwbGljaXREZXN0aW5hdGlvbiIsImV4ZWN1dGVOYW1lZEFjdGlvbiIsImFjdGlvbiIsImNhY2hlUGFnZVJlZiIsInJlZlN0ciIsInBhZ2VSZWYiLCJfY2FjaGVkUGFnZU51bWJlciIsImlzUGFnZVZpc2libGUiLCJkZXN0TGVuZ3RoIiwiem9vbSIsImFsbG93TnVsbCIsIkVYUEFORF9ESVZTX1RJTUVPVVQiLCJmaW5kQ29udHJvbGxlciIsImVuaGFuY2VUZXh0U2VsZWN0aW9uIiwiZW5kT2ZDb250ZW50IiwibnVtVGV4dERpdnMiLCJ0ZXh0TGF5ZXJGcmFnIiwidGV4dENvbnRlbnQiLCJ0ZXh0Q29udGVudFN0cmVhbSIsInRleHREaXZzIiwidGV4dENvbnRlbnRJdGVtc1N0ciIsInNldFRleHRDb250ZW50U3RyZWFtIiwic2V0VGV4dENvbnRlbnQiLCJfY29udmVydE1hdGNoZXMiLCJpSW5kZXgiLCJlbmQiLCJxdWVyeUxlbiIsIm0iLCJtbSIsIm1hdGNoZXMiLCJtYXRjaElkeCIsIm1hdGNoIiwiYmVnaW4iLCJkaXZJZHgiLCJvZmZzZXQiLCJtYXRjaGVzTGVuZ3RoIiwiX3JlbmRlck1hdGNoZXMiLCJpc1NlbGVjdGVkUGFnZSIsInBhZ2VJZHgiLCJzZWxlY3RlZE1hdGNoSWR4IiwiaGlnaGxpZ2h0QWxsIiwicHJldkVuZCIsImluZmluaXR5IiwiYXBwZW5kVGV4dFRvRGl2IiwiY29udGVudCIsIm5vZGUiLCJzcGFuIiwiaTAiLCJpMSIsImlzU2VsZWN0ZWQiLCJoaWdobGlnaHRTdWZmaXgiLCJtYXRjaEluZGV4IiwiYmVnaW5UZXh0IiwibjAiLCJuMSIsImNsZWFyZWRVbnRpbERpdklkeCIsIm4iLCJwYWdlTWF0Y2hlcyIsInBhZ2VNYXRjaGVzTGVuZ3RoIiwiZXhwYW5kRGl2c1RpbWVyIiwiYWRqdXN0VG9wIiwiZGl2Qm91bmRzIiwiY3JlYXRlVGV4dExheWVyQnVpbGRlciIsInRleHRMYXllckRpdiIsImV2ZW50QnVzIiwiZG93bmxvYWRVcmwiLCJjcmVhdGVWYWxpZEFic29sdXRlVXJsIiwiZG93bmxvYWQiLCJkb3dubG9hZERhdGEiLCJuYXZpZ2F0b3IiLCJibG9iVXJsIiwiY3JlYXRlT2JqZWN0VVJMIiwidmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcyIsInNvdXJjZUV2ZW50VHlwZSIsIlVSTCIsImNvbXBhdGliaWxpdHlQYXJhbXMiLCJ1c2VyQWdlbnQiLCJwbGF0Zm9ybSIsIm1heFRvdWNoUG9pbnRzIiwiaXNBbmRyb2lkIiwiaXNJRSIsImlzSU9TIiwiaXNJT1NDaHJvbWUiLCJ3ZWJMMTBuIiwiZ0wxMG5EYXRhIiwiZ1RleHREYXRhIiwiZ1RleHRQcm9wIiwiZ0xhbmd1YWdlIiwiZ01hY3JvcyIsImdSZWFkeVN0YXRlIiwiZ0FzeW5jUmVzb3VyY2VMb2FkaW5nIiwic2NyaXB0IiwibDEwbklkIiwibDEwbkFyZ3MiLCJvblN1Y2Nlc3MiLCJvbkZhaWx1cmUiLCJ4aHIiLCJiYXNlVVJMIiwiaHJlZiIsInRleHQiLCJkaWN0aW9uYXJ5IiwicmVCbGFuayIsInJlQ29tbWVudCIsInJlU2VjdGlvbiIsInJlSW1wb3J0IiwicmVTcGxpdCIsImVudHJpZXMiLCJyYXdUZXh0IiwiY3VycmVudExhbmciLCJnZW5lcmljTGFuZyIsImxhbmciLCJza2lwTGFuZyIsInBhcnNlZFJhd0xpbmVzQ2FsbGJhY2siLCJsaW5lIiwibG9hZEltcG9ydCIsInRtcCIsImV2YWxTdHJpbmciLCJuZXh0RW50cnkiLCJ4aHJMb2FkVGV4dCIsInBhcnNlUmF3TGluZXMiLCJwYXJzZWRQcm9wZXJ0aWVzQ2FsbGJhY2siLCJwYXJzZVByb3BlcnRpZXMiLCJwcm9wIiwic3VjY2Vzc0NhbGxiYWNrIiwiY2xlYXIiLCJsYW5nTGlua3MiLCJnZXRMMTBuUmVzb3VyY2VMaW5rcyIsImxhbmdDb3VudCIsImRpY3QiLCJnZXRMMTBuRGljdGlvbmFyeSIsImRlZmF1bHRMb2NhbGUiLCJhbnlDYXNlTGFuZyIsIm9uUmVzb3VyY2VMb2FkZWQiLCJnUmVzb3VyY2VDb3VudCIsImxpbmsiLCJwYXJzZVJlc291cmNlIiwicmVzb3VyY2UiLCJsb2NhbGVzMnJ1bGVzIiwibGlzdCIsInN0YXJ0IiwicGx1cmFsUnVsZXMiLCJpc0JldHdlZW4iLCJnZXRQbHVyYWxSdWxlcyIsInJ2Iiwic3Vic3RJbmRleGVzIiwic3Vic3RBcmd1bWVudHMiLCJyZUluZGV4IiwicmVNYXRjaCIsIm1hY3JvTmFtZSIsInBhcmFtTmFtZSIsIm1hY3JvIiwicmVBcmdzIiwiZ2V0TDEwbkF0dHJpYnV0ZXMiLCJnZXRMMTBuRGF0YSIsImdldENoaWxkRWxlbWVudENvdW50IiwiY2hpbGRyZW4iLCJmb3VuZCIsImwiLCJ0ZXh0Tm9kZSIsImNvdW50IiwiZ2V0VHJhbnNsYXRhYmxlQ2hpbGRyZW4iLCJlbGVtZW50Q291bnQiLCJ0cmFuc2xhdGVFbGVtZW50IiwiZmFsbGJhY2siLCJnZXREYXRhIiwiZ2V0VGV4dCIsImdldExhbmd1YWdlIiwic2V0TGFuZ3VhZ2UiLCJsb2FkTG9jYWxlIiwiZ2V0RGlyZWN0aW9uIiwicnRsTGlzdCIsInNob3J0Q29kZSIsInRyYW5zbGF0ZSIsImdldFJlYWR5U3RhdGUiLCJyZWFkeSIsIkZpbmRTdGF0ZSIsIkZPVU5EIiwiTk9UX0ZPVU5EIiwiUEVORElORyIsIkZJTkRfVElNRU9VVCIsIk1BVENIX1NDUk9MTF9PRkZTRVRfVE9QIiwiTUFUQ0hfU0NST0xMX09GRlNFVF9MRUZUIiwiQ0hBUkFDVEVSU19UT19OT1JNQUxJWkUiLCJub3JtYWxpemF0aW9uUmVnZXgiLCJyZXBsYWNlIiwiZXhlY3V0ZUNvbW1hbmQiLCJwZGZEb2N1bWVudCIsImNtZCIsImZpbmRiYXJDbG9zZWQiLCJwZW5kaW5nVGltZW91dCIsInNjcm9sbE1hdGNoSW50b1ZpZXciLCJzY3JvbGxJbnRvVmlldyIsIndyYXBwZWQiLCJfc2hvdWxkRGlydHlNYXRjaCIsIl9wcmVwYXJlTWF0Y2hlcyIsImN1cnJlbnRFbGVtIiwibWF0Y2hlc1dpdGhMZW5ndGgiLCJuZXh0RWxlbSIsInByZXZFbGVtIiwiaXNTdWJUZXJtIiwiX2lzRW50aXJlV29yZCIsInN0YXJ0SWR4IiwiZ2V0Q2hhcmFjdGVyVHlwZSIsImVuZElkeCIsIl9jYWxjdWxhdGVQaHJhc2VNYXRjaCIsInBhZ2VDb250ZW50IiwiZW50aXJlV29yZCIsIl9jYWxjdWxhdGVXb3JkTWF0Y2giLCJxdWVyeUFycmF5Iiwic3VicXVlcnkiLCJzdWJxdWVyeUxlbiIsIm1hdGNoTGVuZ3RoIiwic2tpcHBlZCIsIl9jYWxjdWxhdGVNYXRjaCIsInBhZ2VNYXRjaGVzQ291bnQiLCJwcm9taXNlIiwiUHJvbWlzZSIsImV4dHJhY3RUZXh0Q2FwYWJpbGl0eSIsIm5vcm1hbGl6ZVdoaXRlc3BhY2UiLCJ0ZXh0SXRlbXMiLCJzdHJCdWYiLCJqIiwiamoiLCJub3JtYWxpemUiLCJyZWFzb24iLCJfdXBkYXRlUGFnZSIsInByZXZpb3VzIiwiY3VycmVudFBhZ2VJbmRleCIsIm51bVBhZ2VzIiwibnVtUGFnZU1hdGNoZXMiLCJfbWF0Y2hlc1JlYWR5IiwibnVtTWF0Y2hlcyIsIl9hZHZhbmNlT2Zmc2V0UGFnZSIsIl91cGRhdGVNYXRjaCIsInByZXZpb3VzUGFnZSIsIl9vbkZpbmRCYXJDbG9zZSIsImN1cnJlbnQiLCJ0b3RhbCIsIm1hdGNoZXNDb3VudCIsIl91cGRhdGVVSVN0YXRlIiwicmF3UXVlcnkiLCJDaGFyYWN0ZXJUeXBlIiwiU1BBQ0UiLCJBTFBIQV9MRVRURVIiLCJQVU5DVCIsIkhBTl9MRVRURVIiLCJLQVRBS0FOQV9MRVRURVIiLCJISVJBR0FOQV9MRVRURVIiLCJIQUxGV0lEVEhfS0FUQUtBTkFfTEVUVEVSIiwiVEhBSV9MRVRURVIiLCJjaGFyQ29kZSIsImlzQWxwaGFiZXRpY2FsU2NyaXB0IiwiaXNBc2NpaSIsImlzQXNjaWlTcGFjZSIsImlzQXNjaWlBbHBoYSIsImlzQXNjaWlEaWdpdCIsImlzVGhhaSIsImlzSGFuIiwiaXNLYXRha2FuYSIsImlzSGlyYWdhbmEiLCJpc0hhbGZ3aWR0aEthdGFrYW5hIiwiSEFTSF9DSEFOR0VfVElNRU9VVCIsIlBPU0lUSU9OX1VQREFURURfVEhSRVNIT0xEIiwiVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVQiLCJvblBhZ2VzTG9hZGVkIiwicmVzZXRIaXN0b3J5IiwidXBkYXRlVXJsIiwiaW5pdGlhbGl6ZSIsInJlSW5pdGlhbGl6ZWQiLCJnZXRDdXJyZW50SGFzaCIsInJvdGF0aW9uIiwiZGVzdGluYXRpb24iLCJwdXNoIiwiZm9yY2VSZXBsYWNlIiwiaXNEZXN0QXJyYXlzRXF1YWwiLCJfcHVzaE9yUmVwbGFjZVN0YXRlIiwic2hvdWxkUmVwbGFjZSIsIm5ld1N0YXRlIiwiZmluZ2VycHJpbnQiLCJ1aWQiLCJuZXdVcmwiLCJ0ZW1wb3JhcnkiLCJfdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbiIsInBvc2l0aW9uIiwiX2lzVmFsaWRTdGF0ZSIsImNoZWNrUmVsb2FkIiwicGVyZm9ybWFuY2UiLCJwZXJmRW50cnkiLCJfdXBkYXRlSW50ZXJuYWxTdGF0ZSIsInJlbW92ZVRlbXBvcmFyeSIsImNoZWNrTmFtZWRkZXN0IiwiX3BhcnNlQ3VycmVudEhhc2giLCJuYW1lZGRlc3QiLCJfdXBkYXRlVmlld2FyZWEiLCJsb2NhdGlvbiIsIl9wb3BTdGF0ZSIsIm5ld0hhc2giLCJoYXNoQ2hhbmdlZCIsIndhaXRPbkV2ZW50T3JUaW1lb3V0IiwiaXNWYWxpZFJvdGF0aW9uIiwidXBkYXRlVmlld2FyZWEiLCJwb3BTdGF0ZSIsInBhZ2VIaWRlIiwiZGVzdEhhc2giLCJzZWNvbmQiLCJpc0VudHJ5RXF1YWwiLCJmaXJzdERlc3QiLCJzZWNvbmREZXN0IiwiTUFYX0NBTlZBU19QSVhFTFMiLCJkZWZhdWx0Vmlld3BvcnQiLCJSZW5kZXJpbmdTdGF0ZXMiLCJzZXRQZGZQYWdlIiwidG90YWxSb3RhdGlvbiIsInNjYWxlIiwiZXJyb3IiLCJyZW1vdmVGcm9tRE9NIiwiX3Jlc2V0Wm9vbUxheWVyIiwiem9vbUxheWVyQ2FudmFzIiwia2VlcFpvb21MYXllciIsImtlZXBBbm5vdGF0aW9ucyIsImNoaWxkTm9kZXMiLCJjdXJyZW50Wm9vbUxheWVyTm9kZSIsImN1cnJlbnRBbm5vdGF0aW9uTm9kZSIsInVwZGF0ZSIsIm9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UiLCJjc3NUcmFuc2Zvcm0iLCJ0aW1lc3RhbXAiLCJpc1NjYWxpbmdSZXN0cmljdGVkIiwib3V0cHV0U2NhbGUiLCJjYW5jZWxSZW5kZXJpbmciLCJyZWRyYXdBbm5vdGF0aW9ucyIsInJlbGF0aXZlUm90YXRpb24iLCJhYnNSb3RhdGlvbiIsInNjYWxlWCIsInNjYWxlWSIsInRleHRMYXllclZpZXdwb3J0IiwidGV4dFJlbGF0aXZlUm90YXRpb24iLCJ0ZXh0QWJzUm90YXRpb24iLCJ0cmFuc1giLCJ0cmFuc1kiLCJnZXRQYWdlUG9pbnQiLCJjYW52YXNXcmFwcGVyIiwidGV4dExheWVyIiwicmVuZGVyQ29udGludWVDYWxsYmFjayIsImNvbnQiLCJmaW5pc2hQYWludFRhc2siLCJwYWludFRhc2siLCJyZXN1bHRQcm9taXNlIiwicmVhZGFibGVTdHJlYW0iLCJwYWludE9uQ2FudmFzIiwicmVuZGVyQ2FwYWJpbGl0eSIsIm9uUmVuZGVyQ29udGludWUiLCJjYW5jZWwiLCJyZW5kZXJUYXNrIiwiY2FudmFzIiwibXNnIiwiaXNDYW52YXNIaWRkZW4iLCJzaG93Q2FudmFzIiwiYWxwaGEiLCJnZXRPdXRwdXRTY2FsZSIsImFjdHVhbFNpemVWaWV3cG9ydCIsInBpeGVsc0luVmlld3BvcnQiLCJtYXhTY2FsZSIsInNmeCIsImFwcHJveGltYXRlRnJhY3Rpb24iLCJzZnkiLCJyb3VuZFRvRGl2aWRlIiwidHJhbnNmb3JtIiwicmVuZGVyQ29udGV4dCIsImNhbnZhc0NvbnRleHQiLCJlbmFibGVXZWJHTCIsInBhaW50T25TdmciLCJjYW5jZWxsZWQiLCJlbnN1cmVOb3RDYW5jZWxsZWQiLCJvcExpc3QiLCJzdmdHZngiLCJzdmciLCJ3cmFwcGVyIiwic2V0UGFnZUxhYmVsIiwiQ0xFQU5VUF9USU1FT1VUIiwiSU5JVElBTCIsIlJVTk5JTkciLCJQQVVTRUQiLCJGSU5JU0hFRCIsInNldFRodW1ibmFpbFZpZXdlciIsImlzSGlnaGVzdFByaW9yaXR5IiwicmVuZGVySGlnaGVzdFByaW9yaXR5IiwiZ2V0SGlnaGVzdFByaW9yaXR5IiwidmlzaWJsZVZpZXdzIiwibnVtVmlzaWJsZSIsIm5leHRQYWdlSW5kZXgiLCJwcmV2aW91c1BhZ2VJbmRleCIsImlzVmlld0ZpbmlzaGVkIiwicmVuZGVyVmlldyIsInBhZ2VWaWV3IiwicHJldmlvdXNQYWdlVmlldyIsInZpZXdlck5vZGVzIiwicGFnZVNwb3QiLCJfc2Nyb2xsSW50b1ZpZXciLCJzY3JvbGxlZERvd24iLCJfdXBkYXRlSGVscGVyIiwic2hhZG93IiwiREVGQVVMVF9DQUNIRV9TSVpFIiwicGFnZUlkc1RvS2VlcCIsImlNYXgiLCJwYWdlc1RvS2VlcCIsIm1vdmVUb0VuZE9mQXJyYXkiLCJuZXdTY2FsZSIsIndhdGNoU2Nyb2xsIiwiZ2V0UGFnZVZpZXciLCJfc2V0Q3VycmVudFBhZ2VOdW1iZXIiLCJyZXNldEN1cnJlbnRQYWdlVmlldyIsInZhbCIsInBhZ2VMYWJlbCIsInBhZ2VzQ291bnQiLCJmaXJzdFBhZ2VQcm9taXNlIiwiZmlyc3RQZGZQYWdlIiwidGV4dExheWVyRmFjdG9yeSIsInBhZ2VOdW0iLCJyZW5kZXJpbmdRdWV1ZSIsInRleHRMYXllck1vZGUiLCJhbm5vdGF0aW9uTGF5ZXJGYWN0b3J5IiwicmVuZGVyZXIiLCJ1c2VPbmx5Q3NzWm9vbSIsIm1heENhbnZhc1BpeGVscyIsImZpcnN0UGFnZVZpZXciLCJnZXRQYWdlc0xlZnQiLCJzZXRQYWdlTGFiZWxzIiwibGFiZWxzIiwibGFiZWwiLCJfc2V0U2NhbGVVcGRhdGVQYWdlcyIsIm5vU2Nyb2xsIiwicHJlc2V0IiwibmV3VmFsdWUiLCJpc1NhbWVTY2FsZSIsInByZXNldFZhbHVlIiwiX3NldFNjYWxlIiwiY3VycmVudFBhZ2UiLCJub1BhZGRpbmciLCJoUGFkZGluZyIsInZQYWRkaW5nIiwicGFnZVdpZHRoU2NhbGUiLCJwYWdlSGVpZ2h0U2NhbGUiLCJob3Jpem9udGFsU2NhbGUiLCJpc1BvcnRyYWl0T3JpZW50YXRpb24iLCJzY3JvbGxQYWdlSW50b1ZpZXciLCJwYWdlV2lkdGgiLCJwYWdlSGVpZ2h0Iiwid2lkdGhTY2FsZSIsImhlaWdodFNjYWxlIiwiYm91bmRpbmdSZWN0IiwiX3VwZGF0ZUxvY2F0aW9uIiwiY3VycmVudFNjYWxlIiwiY3VycmVudFNjYWxlVmFsdWUiLCJub3JtYWxpemVkU2NhbGVWYWx1ZSIsImZpcnN0UGFnZSIsInBkZk9wZW5QYXJhbXMiLCJjdXJyZW50UGFnZVZpZXciLCJ0b3BMZWZ0IiwiaW50TGVmdCIsImludFRvcCIsInZpc2libGVQYWdlcyIsIm51bVZpc2libGVQYWdlcyIsIm5ld0NhY2hlU2l6ZSIsImNvbnRhaW5zRWxlbWVudCIsImdldFZpc2libGVFbGVtZW50cyIsIl9lbnN1cmVQZGZQYWdlTG9hZGVkIiwiZm9yY2VSZW5kZXJpbmciLCJjdXJyZW50bHlWaXNpYmxlUGFnZXMiLCJzY3JvbGxBaGVhZCIsInBhZ2VzT3ZlcnZpZXciLCJfdXBkYXRlU2Nyb2xsTW9kZSIsInNjcm9sbE1vZGUiLCJfdXBkYXRlU3ByZWFkTW9kZSIsInBhZ2VzIiwicGFyaXR5Iiwic3ByZWFkIiwicGFnZXNSb3RhdGlvbiIsImlzVmFsaWRTY3JvbGxNb2RlIiwiaXNWYWxpZFNwcmVhZE1vZGUiLCJzY3JvbGxMZWZ0IiwiY3VycmVudElkIiwic3RpbGxGdWxseVZpc2libGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7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QUMvQixjQUFJNXhCLGVBQUosS0FBd0I7QUFBQTtBQURPOztBQUkvQixjQUFJQSxZQUFKLFdBQTJCO0FBQ3pCNHhCLGdDQUR5QixJQUN6QkE7QUFEeUI7QUFKSTtBQVBQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFnQjFCLFVBQUksQ0FBSixtQkFBd0I7QUFDdEJELG9CQUFZcEIsZ0JBRFUsRUFDdEJvQjtBQWpCd0I7O0FBbUIxQixpQ0FuQjBCLFNBbUIxQjtBQWpEK0I7Ozt3QkFDWjtBQUNuQixhQUFPaEYsOENBQStCLEtBRG5CLE1BQ1pBLENBQVA7QUFGK0I7Ozs7RUFBbkMsdUIiLCJmaWxlIjoicGRmX3ZpZXdlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwicGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlclwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJwZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInBkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXJcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd19wZGZqc19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd19wZGZqc19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193X3BkZmpzX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd19wZGZqc19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193X3BkZmpzX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd19wZGZqc19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193X3BkZmpzX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193X3BkZmpzX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd19wZGZqc19yZXF1aXJlX18oX193X3BkZmpzX3JlcXVpcmVfXy5zID0gMCk7XG4iLCIvKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQW5ub3RhdGlvbkxheWVyQnVpbGRlcixcbiAgRGVmYXVsdEFubm90YXRpb25MYXllckZhY3RvcnksXG59IGZyb20gXCIuL2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlci5qc1wiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdFRleHRMYXllckZhY3RvcnksXG4gIFRleHRMYXllckJ1aWxkZXIsXG59IGZyb20gXCIuL3RleHRfbGF5ZXJfYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMsIE51bGxMMTBuLCBQcm9ncmVzc0JhciB9IGZyb20gXCIuL3VpX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBQREZMaW5rU2VydmljZSwgU2ltcGxlTGlua1NlcnZpY2UgfSBmcm9tIFwiLi9wZGZfbGlua19zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBEb3dubG9hZE1hbmFnZXIgfSBmcm9tIFwiLi9kb3dubG9hZF9tYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBHZW5lcmljTDEwbiB9IGZyb20gXCIuL2dlbmVyaWNsMTBuLmpzXCI7XG5pbXBvcnQgeyBQREZGaW5kQ29udHJvbGxlciB9IGZyb20gXCIuL3BkZl9maW5kX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7IFBERkhpc3RvcnkgfSBmcm9tIFwiLi9wZGZfaGlzdG9yeS5qc1wiO1xuaW1wb3J0IHsgUERGUGFnZVZpZXcgfSBmcm9tIFwiLi9wZGZfcGFnZV92aWV3LmpzXCI7XG5pbXBvcnQgeyBQREZTaW5nbGVQYWdlVmlld2VyIH0gZnJvbSBcIi4vcGRmX3NpbmdsZV9wYWdlX3ZpZXdlci5qc1wiO1xuaW1wb3J0IHsgUERGVmlld2VyIH0gZnJvbSBcIi4vcGRmX3ZpZXdlci5qc1wiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmNvbnN0IHBkZmpzVmVyc2lvbiA9IFBERkpTRGV2LmV2YWwoXCJCVU5ETEVfVkVSU0lPTlwiKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuY29uc3QgcGRmanNCdWlsZCA9IFBERkpTRGV2LmV2YWwoXCJCVU5ETEVfQlVJTERcIik7XG5cbmV4cG9ydCB7XG4gIFBERlZpZXdlcixcbiAgUERGU2luZ2xlUGFnZVZpZXdlcixcbiAgUERGUGFnZVZpZXcsXG4gIFBERkxpbmtTZXJ2aWNlLFxuICBTaW1wbGVMaW5rU2VydmljZSxcbiAgVGV4dExheWVyQnVpbGRlcixcbiAgRGVmYXVsdFRleHRMYXllckZhY3RvcnksXG4gIEFubm90YXRpb25MYXllckJ1aWxkZXIsXG4gIERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5LFxuICBQREZIaXN0b3J5LFxuICBQREZGaW5kQ29udHJvbGxlcixcbiAgRXZlbnRCdXMsXG4gIERvd25sb2FkTWFuYWdlcixcbiAgUHJvZ3Jlc3NCYXIsXG4gIEdlbmVyaWNMMTBuLFxuICBOdWxsTDEwbixcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQW5ub3RhdGlvbkxheWVyIH0gZnJvbSBcInBkZmpzLWxpYlwiO1xuaW1wb3J0IHsgTnVsbEwxMG4gfSBmcm9tIFwiLi91aV91dGlscy5qc1wiO1xuaW1wb3J0IHsgU2ltcGxlTGlua1NlcnZpY2UgfSBmcm9tIFwiLi9wZGZfbGlua19zZXJ2aWNlLmpzXCI7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQW5ub3RhdGlvbkxheWVyQnVpbGRlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7SFRNTERpdkVsZW1lbnR9IHBhZ2VEaXZcbiAqIEBwcm9wZXJ0eSB7UERGUGFnZX0gcGRmUGFnZVxuICogQHByb3BlcnR5IHtBbm5vdGF0aW9uU3RvcmFnZX0gW2Fubm90YXRpb25TdG9yYWdlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbWFnZVJlc291cmNlc1BhdGhdIC0gUGF0aCBmb3IgaW1hZ2UgcmVzb3VyY2VzLCBtYWlubHlcbiAqICAgZm9yIGFubm90YXRpb24gaWNvbnMuIEluY2x1ZGUgdHJhaWxpbmcgc2xhc2guXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlbmRlckludGVyYWN0aXZlRm9ybXNcbiAqIEBwcm9wZXJ0eSB7SVBERkxpbmtTZXJ2aWNlfSBsaW5rU2VydmljZVxuICogQHByb3BlcnR5IHtEb3dubG9hZE1hbmFnZXJ9IGRvd25sb2FkTWFuYWdlclxuICogQHByb3BlcnR5IHtJTDEwbn0gbDEwbiAtIExvY2FsaXphdGlvbiBzZXJ2aWNlLlxuICovXG5cbmNsYXNzIEFubm90YXRpb25MYXllckJ1aWxkZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyT3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe1xuICAgIHBhZ2VEaXYsXG4gICAgcGRmUGFnZSxcbiAgICBsaW5rU2VydmljZSxcbiAgICBkb3dubG9hZE1hbmFnZXIsXG4gICAgYW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsLFxuICAgIGltYWdlUmVzb3VyY2VzUGF0aCA9IFwiXCIsXG4gICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IHRydWUsXG4gICAgbDEwbiA9IE51bGxMMTBuLFxuICB9KSB7XG4gICAgdGhpcy5wYWdlRGl2ID0gcGFnZURpdjtcbiAgICB0aGlzLnBkZlBhZ2UgPSBwZGZQYWdlO1xuICAgIHRoaXMubGlua1NlcnZpY2UgPSBsaW5rU2VydmljZTtcbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IGRvd25sb2FkTWFuYWdlcjtcbiAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IGltYWdlUmVzb3VyY2VzUGF0aDtcbiAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPSByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zO1xuICAgIHRoaXMubDEwbiA9IGwxMG47XG4gICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSA9IGFubm90YXRpb25TdG9yYWdlO1xuXG4gICAgdGhpcy5kaXYgPSBudWxsO1xuICAgIHRoaXMuX2NhbmNlbGxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IChkZWZhdWx0IHZhbHVlIGlzICdkaXNwbGF5JylcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gcmVuZGVyaW5nIG9mIHRoZVxuICAgKiAgIGFubm90YXRpb25zIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgcmVuZGVyKHZpZXdwb3J0LCBpbnRlbnQgPSBcImRpc3BsYXlcIikge1xuICAgIHJldHVybiB0aGlzLnBkZlBhZ2UuZ2V0QW5ub3RhdGlvbnMoeyBpbnRlbnQgfSkudGhlbihhbm5vdGF0aW9ucyA9PiB7XG4gICAgICBpZiAodGhpcy5fY2FuY2VsbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChhbm5vdGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgICB2aWV3cG9ydDogdmlld3BvcnQuY2xvbmUoeyBkb250RmxpcDogdHJ1ZSB9KSxcbiAgICAgICAgZGl2OiB0aGlzLmRpdixcbiAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgIHBhZ2U6IHRoaXMucGRmUGFnZSxcbiAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCxcbiAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLFxuICAgICAgICBsaW5rU2VydmljZTogdGhpcy5saW5rU2VydmljZSxcbiAgICAgICAgZG93bmxvYWRNYW5hZ2VyOiB0aGlzLmRvd25sb2FkTWFuYWdlcixcbiAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UsXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgICAgLy8gSWYgYW4gYW5ub3RhdGlvbkxheWVyIGFscmVhZHkgZXhpc3RzLCByZWZyZXNoIGl0cyBjaGlsZHJlbidzXG4gICAgICAgIC8vIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzLlxuICAgICAgICBBbm5vdGF0aW9uTGF5ZXIudXBkYXRlKHBhcmFtZXRlcnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGFubm90YXRpb24gbGF5ZXIgZGl2IGFuZCByZW5kZXIgdGhlIGFubm90YXRpb25zXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBhbm5vdGF0aW9uLlxuICAgICAgICB0aGlzLmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZGl2LmNsYXNzTmFtZSA9IFwiYW5ub3RhdGlvbkxheWVyXCI7XG4gICAgICAgIHRoaXMucGFnZURpdi5hcHBlbmRDaGlsZCh0aGlzLmRpdik7XG4gICAgICAgIHBhcmFtZXRlcnMuZGl2ID0gdGhpcy5kaXY7XG5cbiAgICAgICAgQW5ub3RhdGlvbkxheWVyLnJlbmRlcihwYXJhbWV0ZXJzKTtcbiAgICAgICAgdGhpcy5sMTBuLnRyYW5zbGF0ZSh0aGlzLmRpdik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5fY2FuY2VsbGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmRpdikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICB9XG59XG5cbi8qKlxuICogQGltcGxlbWVudHMgSVBERkFubm90YXRpb25MYXllckZhY3RvcnlcbiAqL1xuY2xhc3MgRGVmYXVsdEFubm90YXRpb25MYXllckZhY3Rvcnkge1xuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gcGFnZURpdlxuICAgKiBAcGFyYW0ge1BERlBhZ2V9IHBkZlBhZ2VcbiAgICogQHBhcmFtIHtBbm5vdGF0aW9uU3RvcmFnZX0gW2Fubm90YXRpb25TdG9yYWdlXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ltYWdlUmVzb3VyY2VzUGF0aF0gLSBQYXRoIGZvciBpbWFnZSByZXNvdXJjZXMsIG1haW5seVxuICAgKiAgIGZvciBhbm5vdGF0aW9uIGljb25zLiBJbmNsdWRlIHRyYWlsaW5nIHNsYXNoLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlbmRlckludGVyYWN0aXZlRm9ybXNcbiAgICogQHBhcmFtIHtJTDEwbn0gbDEwblxuICAgKiBAcmV0dXJucyB7QW5ub3RhdGlvbkxheWVyQnVpbGRlcn1cbiAgICovXG4gIGNyZWF0ZUFubm90YXRpb25MYXllckJ1aWxkZXIoXG4gICAgcGFnZURpdixcbiAgICBwZGZQYWdlLFxuICAgIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCxcbiAgICBpbWFnZVJlc291cmNlc1BhdGggPSBcIlwiLFxuICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSB0cnVlLFxuICAgIGwxMG4gPSBOdWxsTDEwblxuICApIHtcbiAgICByZXR1cm4gbmV3IEFubm90YXRpb25MYXllckJ1aWxkZXIoe1xuICAgICAgcGFnZURpdixcbiAgICAgIHBkZlBhZ2UsXG4gICAgICBpbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLFxuICAgICAgbGlua1NlcnZpY2U6IG5ldyBTaW1wbGVMaW5rU2VydmljZSgpLFxuICAgICAgbDEwbixcbiAgICAgIGFubm90YXRpb25TdG9yYWdlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IEFubm90YXRpb25MYXllckJ1aWxkZXIsIERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5IH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbHMgbW9kdWxlLCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxubGV0IHBkZmpzTGliO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93W1wicGRmanMtZGlzdC9idWlsZC9wZGZcIl0pIHtcbiAgcGRmanNMaWIgPSB3aW5kb3dbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZlwiXTtcbn0gZWxzZSB7XG4gIHBkZmpzTGliID0gX19ub25fd2VicGFja19yZXF1aXJlX18oXCIuLi9idWlsZC9wZGYuanNcIik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHBkZmpzTGliO1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IENTU19VTklUUyA9IDk2LjAgLyA3Mi4wO1xuY29uc3QgREVGQVVMVF9TQ0FMRV9WQUxVRSA9IFwiYXV0b1wiO1xuY29uc3QgREVGQVVMVF9TQ0FMRSA9IDEuMDtcbmNvbnN0IE1JTl9TQ0FMRSA9IDAuMTtcbmNvbnN0IE1BWF9TQ0FMRSA9IDEwLjA7XG5jb25zdCBVTktOT1dOX1NDQUxFID0gMDtcbmNvbnN0IE1BWF9BVVRPX1NDQUxFID0gMS4yNTtcbmNvbnN0IFNDUk9MTEJBUl9QQURESU5HID0gNDA7XG5jb25zdCBWRVJUSUNBTF9QQURESU5HID0gNTtcblxuY29uc3QgUHJlc2VudGF0aW9uTW9kZVN0YXRlID0ge1xuICBVTktOT1dOOiAwLFxuICBOT1JNQUw6IDEsXG4gIENIQU5HSU5HOiAyLFxuICBGVUxMU0NSRUVOOiAzLFxufTtcblxuY29uc3QgUmVuZGVyZXJUeXBlID0ge1xuICBDQU5WQVM6IFwiY2FudmFzXCIsXG4gIFNWRzogXCJzdmdcIixcbn07XG5cbmNvbnN0IFRleHRMYXllck1vZGUgPSB7XG4gIERJU0FCTEU6IDAsXG4gIEVOQUJMRTogMSxcbiAgRU5BQkxFX0VOSEFOQ0U6IDIsXG59O1xuXG5jb25zdCBTY3JvbGxNb2RlID0ge1xuICBVTktOT1dOOiAtMSxcbiAgVkVSVElDQUw6IDAsIC8vIERlZmF1bHQgdmFsdWUuXG4gIEhPUklaT05UQUw6IDEsXG4gIFdSQVBQRUQ6IDIsXG59O1xuXG5jb25zdCBTcHJlYWRNb2RlID0ge1xuICBVTktOT1dOOiAtMSxcbiAgTk9ORTogMCwgLy8gRGVmYXVsdCB2YWx1ZS5cbiAgT0REOiAxLFxuICBFVkVOOiAyLFxufTtcblxuLy8gVXNlZCBieSBgUERGVmlld2VyQXBwbGljYXRpb25gLCBhbmQgYnkgdGhlIEFQSSB1bml0LXRlc3RzLlxuY29uc3QgQXV0b1ByaW50UmVnRXhwID0gL1xcYnByaW50XFxzKlxcKC87XG5cbi8vIFJlcGxhY2VzIHt7YXJndW1lbnRzfX0gd2l0aCB0aGVpciB2YWx1ZXMuXG5mdW5jdGlvbiBmb3JtYXRMMTBuVmFsdWUodGV4dCwgYXJncykge1xuICBpZiAoIWFyZ3MpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHtcXHtcXHMqKFxcdyspXFxzKlxcfVxcfS9nLCAoYWxsLCBuYW1lKSA9PiB7XG4gICAgcmV0dXJuIG5hbWUgaW4gYXJncyA/IGFyZ3NbbmFtZV0gOiBcInt7XCIgKyBuYW1lICsgXCJ9fVwiO1xuICB9KTtcbn1cblxuLyoqXG4gKiBOby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbG9jYWxpemF0aW9uIHNlcnZpY2UuXG4gKiBAaW1wbGVtZW50cyB7SUwxMG59XG4gKi9cbmNvbnN0IE51bGxMMTBuID0ge1xuICBhc3luYyBnZXRMYW5ndWFnZSgpIHtcbiAgICByZXR1cm4gXCJlbi11c1wiO1xuICB9LFxuXG4gIGFzeW5jIGdldERpcmVjdGlvbigpIHtcbiAgICByZXR1cm4gXCJsdHJcIjtcbiAgfSxcblxuICBhc3luYyBnZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZvcm1hdEwxMG5WYWx1ZShmYWxsYmFjaywgYXJncyk7XG4gIH0sXG5cbiAgYXN5bmMgdHJhbnNsYXRlKGVsZW1lbnQpIHt9LFxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHNjYWxlIGZhY3RvciBmb3IgdGhlIGNhbnZhcy4gSXQgbWFrZXMgc2Vuc2UgZm9yIHRoZSBIaURQSSBkaXNwbGF5cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBvYmplY3Qgd2l0aCBob3Jpem9udGFsIChzeCkgYW5kIHZlcnRpY2FsIChzeSlcbiAqICAgICAgICAgICAgICAgICAgIHNjYWxlcy4gVGhlIHNjYWxlZCBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UgaWYgc2NhbGluZyBpc1xuICogICAgICAgICAgICAgICAgICAgbm90IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gZ2V0T3V0cHV0U2NhbGUoY3R4KSB7XG4gIGNvbnN0IGRldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICBjb25zdCBiYWNraW5nU3RvcmVSYXRpbyA9XG4gICAgY3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjdHgubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGN0eC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjdHguYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIDE7XG4gIGNvbnN0IHBpeGVsUmF0aW8gPSBkZXZpY2VQaXhlbFJhdGlvIC8gYmFja2luZ1N0b3JlUmF0aW87XG4gIHJldHVybiB7XG4gICAgc3g6IHBpeGVsUmF0aW8sXG4gICAgc3k6IHBpeGVsUmF0aW8sXG4gICAgc2NhbGVkOiBwaXhlbFJhdGlvICE9PSAxLFxuICB9O1xufVxuXG4vKipcbiAqIFNjcm9sbHMgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB2aWV3IG9mIGl0cyBwYXJlbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGJlIHZpc2libGUuXG4gKiBAcGFyYW0ge09iamVjdH0gc3BvdCAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbmFsIHRvcCBhbmQgbGVmdCBwcm9wZXJ0aWVzLFxuICogICBzcGVjaWZ5aW5nIHRoZSBvZmZzZXQgZnJvbSB0aGUgdG9wIGxlZnQgZWRnZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMgLSBJZ25vcmUgZWxlbWVudHMgdGhhdCBoYXZlXG4gKiAgIHRoZSBDU1MgcnVsZSBgb3ZlcmZsb3c6IGhpZGRlbjtgIHNldC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuXG4gKi9cbmZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KGVsZW1lbnQsIHNwb3QsIHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzID0gZmFsc2UpIHtcbiAgLy8gQXNzdW1pbmcgb2Zmc2V0UGFyZW50IGlzIGF2YWlsYWJsZSAoaXQncyBub3QgYXZhaWxhYmxlIHdoZW4gdmlld2VyIGlzIGluXG4gIC8vIGhpZGRlbiBpZnJhbWUgb3Igb2JqZWN0KS4gV2UgaGF2ZSB0byBzY3JvbGw6IGlmIHRoZSBvZmZzZXRQYXJlbnQgaXMgbm90IHNldFxuICAvLyBwcm9kdWNpbmcgdGhlIGVycm9yLiBTZWUgYWxzbyBhbmltYXRpb25TdGFydGVkLlxuICBsZXQgcGFyZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG4gIGlmICghcGFyZW50KSB7XG4gICAgY29uc29sZS5lcnJvcihcIm9mZnNldFBhcmVudCBpcyBub3Qgc2V0IC0tIGNhbm5vdCBzY3JvbGxcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBvZmZzZXRZID0gZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgbGV0IG9mZnNldFggPSBlbGVtZW50Lm9mZnNldExlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHdoaWxlIChcbiAgICAocGFyZW50LmNsaWVudEhlaWdodCA9PT0gcGFyZW50LnNjcm9sbEhlaWdodCAmJlxuICAgICAgcGFyZW50LmNsaWVudFdpZHRoID09PSBwYXJlbnQuc2Nyb2xsV2lkdGgpIHx8XG4gICAgKHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzICYmXG4gICAgICBnZXRDb21wdXRlZFN0eWxlKHBhcmVudCkub3ZlcmZsb3cgPT09IFwiaGlkZGVuXCIpXG4gICkge1xuICAgIGlmIChwYXJlbnQuZGF0YXNldC5fc2NhbGVZKSB7XG4gICAgICBvZmZzZXRZIC89IHBhcmVudC5kYXRhc2V0Ll9zY2FsZVk7XG4gICAgICBvZmZzZXRYIC89IHBhcmVudC5kYXRhc2V0Ll9zY2FsZVg7XG4gICAgfVxuICAgIG9mZnNldFkgKz0gcGFyZW50Lm9mZnNldFRvcDtcbiAgICBvZmZzZXRYICs9IHBhcmVudC5vZmZzZXRMZWZ0O1xuICAgIHBhcmVudCA9IHBhcmVudC5vZmZzZXRQYXJlbnQ7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byBzY3JvbGxcbiAgICB9XG4gIH1cbiAgaWYgKHNwb3QpIHtcbiAgICBpZiAoc3BvdC50b3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb2Zmc2V0WSArPSBzcG90LnRvcDtcbiAgICB9XG4gICAgaWYgKHNwb3QubGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvZmZzZXRYICs9IHNwb3QubGVmdDtcbiAgICAgIHBhcmVudC5zY3JvbGxMZWZ0ID0gb2Zmc2V0WDtcbiAgICB9XG4gIH1cbiAgcGFyZW50LnNjcm9sbFRvcCA9IG9mZnNldFk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHN0YXJ0IG1vbml0b3JpbmcgdGhlIHNjcm9sbCBldmVudCBhbmQgY29udmVydGluZyB0aGVtIGludG9cbiAqIFBERi5qcyBmcmllbmRseSBvbmU6IHdpdGggc2Nyb2xsIGRlYm91bmNlIGFuZCBzY3JvbGwgZGlyZWN0aW9uLlxuICovXG5mdW5jdGlvbiB3YXRjaFNjcm9sbCh2aWV3QXJlYUVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGRlYm91bmNlU2Nyb2xsID0gZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmIChyQUYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gc2NoZWR1bGUgYW4gaW52b2NhdGlvbiBvZiBzY3JvbGwgZm9yIG5leHQgYW5pbWF0aW9uIGZyYW1lLlxuICAgIHJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gdmlld0FyZWFFbGVtZW50U2Nyb2xsZWQoKSB7XG4gICAgICByQUYgPSBudWxsO1xuXG4gICAgICBjb25zdCBjdXJyZW50WCA9IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgY29uc3QgbGFzdFggPSBzdGF0ZS5sYXN0WDtcbiAgICAgIGlmIChjdXJyZW50WCAhPT0gbGFzdFgpIHtcbiAgICAgICAgc3RhdGUucmlnaHQgPSBjdXJyZW50WCA+IGxhc3RYO1xuICAgICAgfVxuICAgICAgc3RhdGUubGFzdFggPSBjdXJyZW50WDtcbiAgICAgIGNvbnN0IGN1cnJlbnRZID0gdmlld0FyZWFFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgIGNvbnN0IGxhc3RZID0gc3RhdGUubGFzdFk7XG4gICAgICBpZiAoY3VycmVudFkgIT09IGxhc3RZKSB7XG4gICAgICAgIHN0YXRlLmRvd24gPSBjdXJyZW50WSA+IGxhc3RZO1xuICAgICAgfVxuICAgICAgc3RhdGUubGFzdFkgPSBjdXJyZW50WTtcbiAgICAgIGNhbGxiYWNrKHN0YXRlKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICByaWdodDogdHJ1ZSxcbiAgICBkb3duOiB0cnVlLFxuICAgIGxhc3RYOiB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBsYXN0WTogdmlld0FyZWFFbGVtZW50LnNjcm9sbFRvcCxcbiAgICBfZXZlbnRIYW5kbGVyOiBkZWJvdW5jZVNjcm9sbCxcbiAgfTtcblxuICBsZXQgckFGID0gbnVsbDtcbiAgdmlld0FyZWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgZGVib3VuY2VTY3JvbGwsIHRydWUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHBhcnNlIHF1ZXJ5IHN0cmluZyAoZS5nLiA/cGFyYW0xPXZhbHVlJnBhcm0yPS4uLikuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHtcbiAgY29uc3QgcGFydHMgPSBxdWVyeS5zcGxpdChcIiZcIik7XG4gIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAobGV0IGkgPSAwLCBpaSA9IHBhcnRzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICBjb25zdCBwYXJhbSA9IHBhcnRzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICBjb25zdCBrZXkgPSBwYXJhbVswXS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW0ubGVuZ3RoID4gMSA/IHBhcmFtWzFdIDogbnVsbDtcbiAgICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KGtleSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufVxuXG4vKipcbiAqIFVzZSBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtIGluIGEgZ2l2ZW4gYXJyYXkgd2hpY2hcbiAqIHBhc3NlcyBhIGdpdmVuIGNvbmRpdGlvbi4gVGhlIGl0ZW1zIGFyZSBleHBlY3RlZCB0byBiZSBzb3J0ZWQgaW4gdGhlIHNlbnNlXG4gKiB0aGF0IGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBmb3Igb25lIGl0ZW0gaW4gdGhlIGFycmF5LCB0aGVuIGl0IGlzIGFsc28gdHJ1ZVxuICogZm9yIGFsbCBmb2xsb3dpbmcgaXRlbXMuXG4gKlxuICogQHJldHVybnMge251bWJlcn0gSW5kZXggb2YgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgdG8gcGFzcyB0aGUgdGVzdCxcbiAqICAgICAgICAgICAgICAgICAgIG9yIHxpdGVtcy5sZW5ndGh8IGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaEZpcnN0SXRlbShpdGVtcywgY29uZGl0aW9uKSB7XG4gIGxldCBtaW5JbmRleCA9IDA7XG4gIGxldCBtYXhJbmRleCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG5cbiAgaWYgKG1heEluZGV4IDwgMCB8fCAhY29uZGl0aW9uKGl0ZW1zW21heEluZGV4XSkpIHtcbiAgICByZXR1cm4gaXRlbXMubGVuZ3RoO1xuICB9XG4gIGlmIChjb25kaXRpb24oaXRlbXNbbWluSW5kZXhdKSkge1xuICAgIHJldHVybiBtaW5JbmRleDtcbiAgfVxuXG4gIHdoaWxlIChtaW5JbmRleCA8IG1heEluZGV4KSB7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gKG1pbkluZGV4ICsgbWF4SW5kZXgpID4+IDE7XG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSBpdGVtc1tjdXJyZW50SW5kZXhdO1xuICAgIGlmIChjb25kaXRpb24oY3VycmVudEl0ZW0pKSB7XG4gICAgICBtYXhJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWluSW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWluSW5kZXg7IC8qID09PSBtYXhJbmRleCAqL1xufVxuXG4vKipcbiAqICBBcHByb3hpbWF0ZXMgZmxvYXQgbnVtYmVyIGFzIGEgZnJhY3Rpb24gdXNpbmcgRmFyZXkgc2VxdWVuY2UgKG1heCBvcmRlclxuICogIG9mIDgpLlxuICogIEBwYXJhbSB7bnVtYmVyfSB4IC0gUG9zaXRpdmUgZmxvYXQgbnVtYmVyLlxuICogIEByZXR1cm5zIHtBcnJheX0gRXN0aW1hdGVkIGZyYWN0aW9uOiB0aGUgZmlyc3QgYXJyYXkgaXRlbSBpcyBhIG51bWVyYXRvcixcbiAqICAgICAgICAgICAgICAgICAgIHRoZSBzZWNvbmQgb25lIGlzIGEgZGVub21pbmF0b3IuXG4gKi9cbmZ1bmN0aW9uIGFwcHJveGltYXRlRnJhY3Rpb24oeCkge1xuICAvLyBGYXN0IHBhdGhzIGZvciBpbnQgbnVtYmVycyBvciB0aGVpciBpbnZlcnNpb25zLlxuICBpZiAoTWF0aC5mbG9vcih4KSA9PT0geCkge1xuICAgIHJldHVybiBbeCwgMV07XG4gIH1cbiAgY29uc3QgeGludiA9IDEgLyB4O1xuICBjb25zdCBsaW1pdCA9IDg7XG4gIGlmICh4aW52ID4gbGltaXQpIHtcbiAgICByZXR1cm4gWzEsIGxpbWl0XTtcbiAgfSBlbHNlIGlmIChNYXRoLmZsb29yKHhpbnYpID09PSB4aW52KSB7XG4gICAgcmV0dXJuIFsxLCB4aW52XTtcbiAgfVxuXG4gIGNvbnN0IHhfID0geCA+IDEgPyB4aW52IDogeDtcbiAgLy8gYS9iIGFuZCBjL2QgYXJlIG5laWdoYm91cnMgaW4gRmFyZXkgc2VxdWVuY2UuXG4gIGxldCBhID0gMCxcbiAgICBiID0gMSxcbiAgICBjID0gMSxcbiAgICBkID0gMTtcbiAgLy8gTGltaXRpbmcgc2VhcmNoIHRvIG9yZGVyIDguXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gR2VuZXJhdGluZyBuZXh0IHRlcm0gaW4gc2VxdWVuY2UgKG9yZGVyIG9mIHEpLlxuICAgIGNvbnN0IHAgPSBhICsgYyxcbiAgICAgIHEgPSBiICsgZDtcbiAgICBpZiAocSA+IGxpbWl0KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHhfIDw9IHAgLyBxKSB7XG4gICAgICBjID0gcDtcbiAgICAgIGQgPSBxO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gcDtcbiAgICAgIGIgPSBxO1xuICAgIH1cbiAgfVxuICBsZXQgcmVzdWx0O1xuICAvLyBTZWxlY3QgY2xvc2VzdCBvZiB0aGUgbmVpZ2hib3VycyB0byB4LlxuICBpZiAoeF8gLSBhIC8gYiA8IGMgLyBkIC0geF8pIHtcbiAgICByZXN1bHQgPSB4XyA9PT0geCA/IFthLCBiXSA6IFtiLCBhXTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB4XyA9PT0geCA/IFtjLCBkXSA6IFtkLCBjXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByb3VuZFRvRGl2aWRlKHgsIGRpdikge1xuICBjb25zdCByID0geCAlIGRpdjtcbiAgcmV0dXJuIHIgPT09IDAgPyB4IDogTWF0aC5yb3VuZCh4IC0gciArIGRpdik7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIHBhZ2UsIGNvbnZlcnRlZCBmcm9tIFBERiB1bml0cyB0byBpbmNoZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gQW4gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXM6IHtBcnJheX0gYHZpZXdgLFxuICogICB7bnVtYmVyfSBgdXNlclVuaXRgLCBhbmQge251bWJlcn0gYHJvdGF0ZWAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBPYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllczoge251bWJlcn0gYHdpZHRoYFxuICogICBhbmQge251bWJlcn0gYGhlaWdodGAsIGdpdmVuIGluIGluY2hlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UGFnZVNpemVJbmNoZXMoeyB2aWV3LCB1c2VyVW5pdCwgcm90YXRlIH0pIHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IHZpZXc7XG4gIC8vIFdlIG5lZWQgdG8gdGFrZSB0aGUgcGFnZSByb3RhdGlvbiBpbnRvIGFjY291bnQgYXMgd2VsbC5cbiAgY29uc3QgY2hhbmdlT3JpZW50YXRpb24gPSByb3RhdGUgJSAxODAgIT09IDA7XG5cbiAgY29uc3Qgd2lkdGggPSAoKHgyIC0geDEpIC8gNzIpICogdXNlclVuaXQ7XG4gIGNvbnN0IGhlaWdodCA9ICgoeTIgLSB5MSkgLyA3MikgKiB1c2VyVW5pdDtcblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBjaGFuZ2VPcmllbnRhdGlvbiA/IGhlaWdodCA6IHdpZHRoLFxuICAgIGhlaWdodDogY2hhbmdlT3JpZW50YXRpb24gPyB3aWR0aCA6IGhlaWdodCxcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGdldFZpc2libGVFbGVtZW50cy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBpbml0aWFsIGd1ZXNzIGF0IHRoZSBmaXJzdCB2aXNpYmxlIGVsZW1lbnRcbiAqIEBwYXJhbSB7QXJyYXl9IHZpZXdzIC0gYXJyYXkgb2YgcGFnZXMsIGludG8gd2hpY2ggYGluZGV4YCBpcyBhbiBpbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IHRvcCAtIHRoZSB0b3Agb2YgdGhlIHNjcm9sbCBwYW5lXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGluZGV4YCB0aGF0IGlzIGRlZmluaXRlbHkgYXQgb3JcbiAqICAgYmVmb3JlIHRoZSBmaXJzdCB2aXNpYmxlIGVsZW1lbnQgaW4gYHZpZXdzYCwgYnV0IG5vdCBieSB0b28gbXVjaC4gKFVzdWFsbHksXG4gKiAgIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgZmlyc3QgcGFydGlhbGx5IHZpc2libGUgcm93IGluXG4gKiAgIGB2aWV3c2AsIGFsdGhvdWdoIHNvbWV0aW1lcyBpdCBnb2VzIGJhY2sgb25lIHJvdyBmdXJ0aGVyLilcbiAqL1xuZnVuY3Rpb24gYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzKGluZGV4LCB2aWV3cywgdG9wKSB7XG4gIC8vIGJpbmFyeVNlYXJjaEZpcnN0SXRlbSdzIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgaW5wdXQgaXMgb3JkZXJlZCwgd2l0aCBvbmx5XG4gIC8vIG9uZSBpbmRleCB3aGVyZSB0aGUgY29uZGl0aW9ucyBmbGlwcyBmcm9tIGZhbHNlIHRvIHRydWU6IFtmYWxzZSAuLi4sXG4gIC8vIHRydWUuLi5dLiBXaXRoIHZlcnRpY2FsIHNjcm9sbGluZyBhbmQgc3ByZWFkcywgaXQgaXMgcG9zc2libGUgdG8gaGF2ZVxuICAvLyBbZmFsc2UgLi4uLCB0cnVlLCBmYWxzZSwgdHJ1ZSAuLi5dLiBXaXRoIHdyYXBwZWQgc2Nyb2xsaW5nIHdlIGNhbiBoYXZlIGFcbiAgLy8gc2ltaWxhciBzZXF1ZW5jZSwgd2l0aCBtYW55IG1vcmUgbWl4ZWQgdHJ1ZSBhbmQgZmFsc2UgaW4gdGhlIG1pZGRsZS5cbiAgLy9cbiAgLy8gU28gdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGJpbmFyeSBzZWFyY2ggeWllbGRzIHRoZSBpbmRleCBvZiB0aGVcbiAgLy8gZmlyc3QgdmlzaWJsZSBlbGVtZW50LiBJdCBjb3VsZCBoYXZlIGJlZW4gYW55IG9mIHRoZSBvdGhlciB2aXNpYmxlIGVsZW1lbnRzXG4gIC8vIHRoYXQgd2VyZSBwcmVjZWRlZCBieSBhIGhpZGRlbiBlbGVtZW50LlxuXG4gIC8vIE9mIGNvdXJzZSwgaWYgZWl0aGVyIHRoaXMgZWxlbWVudCBvciB0aGUgcHJldmlvdXMgKGhpZGRlbikgZWxlbWVudCBpcyBhbHNvXG4gIC8vIHRoZSBmaXJzdCBlbGVtZW50LCB0aGVyZSdzIG5vdGhpbmcgdG8gd29ycnkgYWJvdXQuXG4gIGlmIChpbmRleCA8IDIpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvLyBUaGF0IGFzaWRlLCB0aGUgcG9zc2libGUgY2FzZXMgYXJlIHJlcHJlc2VudGVkIGJlbG93LlxuICAvL1xuICAvLyAgICAgKioqKiAgPSBmdWxseSBoaWRkZW5cbiAgLy8gICAgIEEqQiogID0gbWl4IG9mIHBhcnRpYWxseSB2aXNpYmxlIGFuZC9vciBoaWRkZW4gcGFnZXNcbiAgLy8gICAgIENERUYgID0gZnVsbHkgdmlzaWJsZVxuICAvL1xuICAvLyAoMSkgQmluYXJ5IHNlYXJjaCBjb3VsZCBoYXZlIHJldHVybmVkIEEsIGluIHdoaWNoIGNhc2Ugd2UgY2FuIHN0b3AuXG4gIC8vICgyKSBCaW5hcnkgc2VhcmNoIGNvdWxkIGFsc28gaGF2ZSByZXR1cm5lZCBCLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG9cbiAgLy8gY2hlY2sgdGhlIHdob2xlIHJvdy5cbiAgLy8gKDMpIEJpbmFyeSBzZWFyY2ggY291bGQgYWxzbyBoYXZlIHJldHVybmVkIEMsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0b1xuICAvLyBjaGVjayB0aGUgd2hvbGUgcHJldmlvdXMgcm93LlxuICAvL1xuICAvLyBUaGVyZSdzIG9uZSBvdGhlciBwb3NzaWJpbGl0eTpcbiAgLy9cbiAgLy8gICAgICoqKiogID0gZnVsbHkgaGlkZGVuXG4gIC8vICAgICBBQkNEICA9IG1peCBvZiBmdWxseSBhbmQvb3IgcGFydGlhbGx5IHZpc2libGUgcGFnZXNcbiAgLy9cbiAgLy8gKDQpIEJpbmFyeSBzZWFyY2ggY291bGQgb25seSBoYXZlIHJldHVybmVkIEEuXG5cbiAgLy8gSW5pdGlhbGx5IGFzc3VtZSB0aGF0IHdlIG5lZWQgdG8gZmluZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IHJvd1xuICAvLyAoY2FzZSAxLCAyLCBvciA0KSwgd2hpY2ggbWVhbnMgZmluZGluZyBhIHBhZ2UgdGhhdCBpcyBhYm92ZSB0aGUgY3VycmVudFxuICAvLyBwYWdlJ3MgdG9wLiBJZiB0aGUgZm91bmQgcGFnZSBpcyBwYXJ0aWFsbHkgdmlzaWJsZSwgd2UncmUgZGVmaW5pdGVseSBub3QgaW5cbiAgLy8gY2FzZSAzLCBhbmQgdGhpcyBhc3N1bXB0aW9uIGlzIGNvcnJlY3QuXG4gIGxldCBlbHQgPSB2aWV3c1tpbmRleF0uZGl2O1xuICBsZXQgcGFnZVRvcCA9IGVsdC5vZmZzZXRUb3AgKyBlbHQuY2xpZW50VG9wO1xuXG4gIGlmIChwYWdlVG9wID49IHRvcCkge1xuICAgIC8vIFRoZSBmb3VuZCBwYWdlIGlzIGZ1bGx5IHZpc2libGUsIHNvIHdlJ3JlIGFjdHVhbGx5IGVpdGhlciBpbiBjYXNlIDMgb3IgNCxcbiAgICAvLyBhbmQgdW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSB3aXRob3V0XG4gICAgLy8gc2Nhbm5pbmcgdGhlIGVudGlyZSBwcmV2aW91cyByb3csIHNvIHdlIGp1c3QgY29uc2VydmF0aXZlbHkgYXNzdW1lIHRoYXRcbiAgICAvLyB3ZSBkbyBuZWVkIHRvIGJhY2t0cmFjayB0byB0aGF0IHJvdy4gSW4gYm90aCBjYXNlcywgdGhlIHByZXZpb3VzIHBhZ2UgaXNcbiAgICAvLyBpbiB0aGUgcHJldmlvdXMgcm93LCBzbyB1c2UgaXRzIHRvcCBpbnN0ZWFkLlxuICAgIGVsdCA9IHZpZXdzW2luZGV4IC0gMV0uZGl2O1xuICAgIHBhZ2VUb3AgPSBlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcDtcbiAgfVxuXG4gIC8vIE5vdyB3ZSBiYWNrdHJhY2sgdG8gdGhlIGZpcnN0IHBhZ2UgdGhhdCBzdGlsbCBoYXMgaXRzIGJvdHRvbSBiZWxvd1xuICAvLyBgcGFnZVRvcGAsIHdoaWNoIGlzIHRoZSB0b3Agb2YgYSBwYWdlIGluIHRoZSBmaXJzdCB2aXNpYmxlIHJvdyAodW5sZXNzXG4gIC8vIHdlJ3JlIGluIGNhc2UgNCwgaW4gd2hpY2ggY2FzZSBpdCdzIHRoZSByb3cgYmVmb3JlIHRoYXQpLlxuICAvLyBgaW5kZXhgIGlzIGZvdW5kIGJ5IGJpbmFyeSBzZWFyY2gsIHNvIHRoZSBwYWdlIGF0IGBpbmRleCAtIDFgIGlzXG4gIC8vIGludmlzaWJsZSBhbmQgd2UgY2FuIHN0YXJ0IGxvb2tpbmcgZm9yIHBvdGVudGlhbGx5IHZpc2libGUgcGFnZXMgZnJvbVxuICAvLyBgaW5kZXggLSAyYC4gKEhvd2V2ZXIsIGlmIHRoaXMgbG9vcCB0ZXJtaW5hdGVzIG9uIGl0cyBmaXJzdCBpdGVyYXRpb24sXG4gIC8vIHdoaWNoIGlzIHRoZSBjYXNlIHdoZW4gcGFnZXMgYXJlIHN0YWNrZWQgdmVydGljYWxseSwgYGluZGV4YCBzaG91bGQgcmVtYWluXG4gIC8vIHVuY2hhbmdlZCwgc28gd2UgdXNlIGEgZGlzdGluY3QgbG9vcCB2YXJpYWJsZS4pXG4gIGZvciAobGV0IGkgPSBpbmRleCAtIDI7IGkgPj0gMDsgLS1pKSB7XG4gICAgZWx0ID0gdmlld3NbaV0uZGl2O1xuICAgIGlmIChlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcCArIGVsdC5jbGllbnRIZWlnaHQgPD0gcGFnZVRvcCkge1xuICAgICAgLy8gV2UgaGF2ZSByZWFjaGVkIHRoZSBwcmV2aW91cyByb3csIHNvIHN0b3Agbm93LlxuICAgICAgLy8gVGhpcyBsb29wIGlzIGV4cGVjdGVkIHRvIHRlcm1pbmF0ZSByZWxhdGl2ZWx5IHF1aWNrbHkgYmVjYXVzZSB0aGVcbiAgICAgIC8vIG51bWJlciBvZiBwYWdlcyBwZXIgcm93IGlzIGV4cGVjdGVkIHRvIGJlIHNtYWxsLlxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGluZGV4ID0gaTtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKlxuICogR2VuZXJpYyBoZWxwZXIgdG8gZmluZCBvdXQgd2hhdCBlbGVtZW50cyBhcmUgdmlzaWJsZSB3aXRoaW4gYSBzY3JvbGwgcGFuZS5cbiAqXG4gKiBXZWxsLCBwcmV0dHkgZ2VuZXJpYy4gVGhlcmUgYXJlIHNvbWUgYXNzdW1wdGlvbnMgcGxhY2VkIG9uIHRoZSBlbGVtZW50c1xuICogcmVmZXJlbmNlZCBieSBgdmlld3NgOlxuICogICAtIElmIGBob3Jpem9udGFsYCwgbm8gbGVmdCBvZiBhbnkgZWFybGllciBlbGVtZW50IGlzIHRvIHRoZSByaWdodCBvZiB0aGVcbiAqICAgICBsZWZ0IG9mIGFueSBsYXRlciBlbGVtZW50LlxuICogICAtIE90aGVyd2lzZSwgYHZpZXdzYCBjYW4gYmUgc3BsaXQgaW50byBjb250aWd1b3VzIHJvd3Mgd2hlcmUsIHdpdGhpbiBhIHJvdyxcbiAqICAgICBubyB0b3Agb2YgYW55IGVsZW1lbnQgaXMgYmVsb3cgdGhlIGJvdHRvbSBvZiBhbnkgb3RoZXIgZWxlbWVudCwgYW5kXG4gKiAgICAgYmV0d2VlbiByb3dzLCBubyBib3R0b20gb2YgYW55IGVsZW1lbnQgaW4gYW4gZWFybGllciByb3cgaXMgYmVsb3cgdGhlXG4gKiAgICAgdG9wIG9mIGFueSBlbGVtZW50IGluIGEgbGF0ZXIgcm93LlxuICpcbiAqIChIZXJlLCB0b3AsIGxlZnQsIGV0Yy4gYWxsIHJlZmVyIHRvIHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhlIGVsZW1lbnQgaW5cbiAqIHF1ZXN0aW9uLiBGb3IgcGFnZXMsIHRoYXQgZW5kcyB1cCBiZWluZyBlcXVpdmFsZW50IHRvIHRoZSBib3VuZGluZyBib3ggb2YgdGhlXG4gKiByZW5kZXJpbmcgY2FudmFzLiBFYXJsaWVyIGFuZCBsYXRlciByZWZlciB0byBpbmRleCBpbiBgdmlld3NgLCBub3QgcGFnZVxuICogbGF5b3V0LilcbiAqXG4gKiBAcGFyYW0gc2Nyb2xsRWwge0hUTUxFbGVtZW50fSAtIGEgY29udGFpbmVyIHRoYXQgY2FuIHBvc3NpYmx5IHNjcm9sbFxuICogQHBhcmFtIHZpZXdzIHtBcnJheX0gLSBvYmplY3RzIHdpdGggYSBgZGl2YCBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIGFuXG4gKiAgIEhUTUxFbGVtZW50LCB3aGljaCBzaG91bGQgYWxsIGJlIGRlc2NlbmRlbnRzIG9mIGBzY3JvbGxFbGAgc2F0aXNmeWluZyB0aGVcbiAqICAgYWJvdmUgbGF5b3V0IGFzc3VtcHRpb25zXG4gKiBAcGFyYW0gc29ydEJ5VmlzaWJpbGl0eSB7Ym9vbGVhbn0gLSBpZiB0cnVlLCB0aGUgcmV0dXJuZWQgZWxlbWVudHMgYXJlIHNvcnRlZFxuICogICBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZSBwZXJjZW50IG9mIHRoZWlyIHBhZGRpbmcgYm94IHRoYXQgaXMgdmlzaWJsZVxuICogQHBhcmFtIGhvcml6b250YWwge2Jvb2xlYW59IC0gaWYgdHJ1ZSwgdGhlIGVsZW1lbnRzIGFyZSBhc3N1bWVkIHRvIGJlIGxhaWRcbiAqICAgb3V0IGhvcml6b250YWxseSBpbnN0ZWFkIG9mIHZlcnRpY2FsbHlcbiAqIEByZXR1cm5zIHtPYmplY3R9IGB7IGZpcnN0LCBsYXN0LCB2aWV3czogW3sgaWQsIHgsIHksIHZpZXcsIHBlcmNlbnQgfV0gfWBcbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZUVsZW1lbnRzKFxuICBzY3JvbGxFbCxcbiAgdmlld3MsXG4gIHNvcnRCeVZpc2liaWxpdHkgPSBmYWxzZSxcbiAgaG9yaXpvbnRhbCA9IGZhbHNlXG4pIHtcbiAgY29uc3QgdG9wID0gc2Nyb2xsRWwuc2Nyb2xsVG9wLFxuICAgIGJvdHRvbSA9IHRvcCArIHNjcm9sbEVsLmNsaWVudEhlaWdodDtcbiAgY29uc3QgbGVmdCA9IHNjcm9sbEVsLnNjcm9sbExlZnQsXG4gICAgcmlnaHQgPSBsZWZ0ICsgc2Nyb2xsRWwuY2xpZW50V2lkdGg7XG5cbiAgLy8gVGhyb3VnaG91dCB0aGlzIFwiZ2VuZXJpY1wiIGZ1bmN0aW9uLCBjb21tZW50cyB3aWxsIGFzc3VtZSB3ZSdyZSB3b3JraW5nIHdpdGhcbiAgLy8gUERGIGRvY3VtZW50IHBhZ2VzLCB3aGljaCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgYW5kIGNvbXBsZXggY2FzZS4gSW4gdGhpc1xuICAvLyBjYXNlLCB0aGUgdmlzaWJsZSBlbGVtZW50cyB3ZSdyZSBhY3R1YWxseSBpbnRlcmVzdGVkIGlzIHRoZSBwYWdlIGNhbnZhcyxcbiAgLy8gd2hpY2ggaXMgY29udGFpbmVkIGluIGEgd3JhcHBlciB3aGljaCBhZGRzIG5vIHBhZGRpbmcvYm9yZGVyL21hcmdpbiwgd2hpY2hcbiAgLy8gaXMgaXRzZWxmIGNvbnRhaW5lZCBpbiBgdmlldy5kaXZgIHdoaWNoIGFkZHMgbm8gcGFkZGluZyAoYnV0IGRvZXMgYWRkIGFcbiAgLy8gYm9yZGVyKS4gU28sIGFzIHNwZWNpZmllZCBpbiB0aGlzIGZ1bmN0aW9uJ3MgZG9jIGNvbW1lbnQsIHRoaXMgZnVuY3Rpb25cbiAgLy8gZG9lcyBhbGwgb2YgaXRzIHdvcmsgb24gdGhlIHBhZGRpbmcgZWRnZSBvZiB0aGUgcHJvdmlkZWQgdmlld3MsIHN0YXJ0aW5nIGF0XG4gIC8vIG9mZnNldExlZnQvVG9wICh3aGljaCBpbmNsdWRlcyBtYXJnaW4pIGFuZCBhZGRpbmcgY2xpZW50TGVmdC9Ub3AgKHdoaWNoIGlzXG4gIC8vIHRoZSBib3JkZXIpLiBBZGRpbmcgY2xpZW50V2lkdGgvSGVpZ2h0IGdldHMgdXMgdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgb2ZcbiAgLy8gdGhlIHBhZGRpbmcgZWRnZS5cbiAgZnVuY3Rpb24gaXNFbGVtZW50Qm90dG9tQWZ0ZXJWaWV3VG9wKHZpZXcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdmlldy5kaXY7XG4gICAgY29uc3QgZWxlbWVudEJvdHRvbSA9XG4gICAgICBlbGVtZW50Lm9mZnNldFRvcCArIGVsZW1lbnQuY2xpZW50VG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgcmV0dXJuIGVsZW1lbnRCb3R0b20gPiB0b3A7XG4gIH1cbiAgZnVuY3Rpb24gaXNFbGVtZW50UmlnaHRBZnRlclZpZXdMZWZ0KHZpZXcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdmlldy5kaXY7XG4gICAgY29uc3QgZWxlbWVudFJpZ2h0ID1cbiAgICAgIGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgcmV0dXJuIGVsZW1lbnRSaWdodCA+IGxlZnQ7XG4gIH1cblxuICBjb25zdCB2aXNpYmxlID0gW10sXG4gICAgbnVtVmlld3MgPSB2aWV3cy5sZW5ndGg7XG4gIGxldCBmaXJzdFZpc2libGVFbGVtZW50SW5kID1cbiAgICBudW1WaWV3cyA9PT0gMFxuICAgICAgPyAwXG4gICAgICA6IGJpbmFyeVNlYXJjaEZpcnN0SXRlbShcbiAgICAgICAgICB2aWV3cyxcbiAgICAgICAgICBob3Jpem9udGFsID8gaXNFbGVtZW50UmlnaHRBZnRlclZpZXdMZWZ0IDogaXNFbGVtZW50Qm90dG9tQWZ0ZXJWaWV3VG9wXG4gICAgICAgICk7XG5cbiAgLy8gUGxlYXNlIG5vdGUgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYGJpbmFyeVNlYXJjaEZpcnN0SXRlbWAgZnVuY3Rpb24gd2hlblxuICAvLyBubyB2YWxpZCBlbGVtZW50IGlzIGZvdW5kIChoZW5jZSB0aGUgYGZpcnN0VmlzaWJsZUVsZW1lbnRJbmRgIGNoZWNrIGJlbG93KS5cbiAgaWYgKFxuICAgIGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQgPiAwICYmXG4gICAgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA8IG51bVZpZXdzICYmXG4gICAgIWhvcml6b250YWxcbiAgKSB7XG4gICAgLy8gSW4gd3JhcHBlZCBzY3JvbGxpbmcgKG9yIHZlcnRpY2FsIHNjcm9sbGluZyB3aXRoIHNwcmVhZHMpLCB3aXRoIHNvbWUgcGFnZVxuICAgIC8vIHNpemVzLCBpc0VsZW1lbnRCb3R0b21BZnRlclZpZXdUb3AgZG9lc24ndCBzYXRpc2Z5IHRoZSBiaW5hcnkgc2VhcmNoXG4gICAgLy8gY29uZGl0aW9uOiB0aGVyZSBjYW4gYmUgcGFnZXMgd2l0aCBib3R0b21zIGFib3ZlIHRoZSB2aWV3IHRvcCBiZXR3ZWVuXG4gICAgLy8gcGFnZXMgd2l0aCBib3R0b21zIGJlbG93LiBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgYW5kIGNvcnJlY3RzIHRoYXQgZXJyb3I7XG4gICAgLy8gc2VlIGl0IGZvciBtb3JlIGNvbW1lbnRzLlxuICAgIGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQgPSBiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMoXG4gICAgICBmaXJzdFZpc2libGVFbGVtZW50SW5kLFxuICAgICAgdmlld3MsXG4gICAgICB0b3BcbiAgICApO1xuICB9XG5cbiAgLy8gbGFzdEVkZ2UgYWN0cyBhcyBhIGN1dG9mZiBmb3IgdXMgdG8gc3RvcCBsb29waW5nLCBiZWNhdXNlIHdlIGtub3cgYWxsXG4gIC8vIHN1YnNlcXVlbnQgcGFnZXMgd2lsbCBiZSBoaWRkZW4uXG4gIC8vXG4gIC8vIFdoZW4gdXNpbmcgd3JhcHBlZCBzY3JvbGxpbmcgb3IgdmVydGljYWwgc2Nyb2xsaW5nIHdpdGggc3ByZWFkcywgd2UgY2FuJ3RcbiAgLy8gc2ltcGx5IHN0b3AgdGhlIGZpcnN0IHRpbWUgd2UgcmVhY2ggYSBwYWdlIGJlbG93IHRoZSBib3R0b20gb2YgdGhlIHZpZXc7XG4gIC8vIHRoZSB0b3BzIG9mIHN1YnNlcXVlbnQgcGFnZXMgb24gdGhlIHNhbWUgcm93IGNvdWxkIHN0aWxsIGJlIHZpc2libGUuIEluXG4gIC8vIGhvcml6b250YWwgc2Nyb2xsaW5nLCB3ZSBkb24ndCBoYXZlIHRoYXQgaXNzdWUsIHNvIHdlIGNhbiBzdG9wIGFzIHNvb24gYXNcbiAgLy8gd2UgcGFzcyBgcmlnaHRgLCB3aXRob3V0IG5lZWRpbmcgdGhlIGNvZGUgYmVsb3cgdGhhdCBoYW5kbGVzIHRoZSAtMSBjYXNlLlxuICBsZXQgbGFzdEVkZ2UgPSBob3Jpem9udGFsID8gcmlnaHQgOiAtMTtcblxuICBmb3IgKGxldCBpID0gZmlyc3RWaXNpYmxlRWxlbWVudEluZDsgaSA8IG51bVZpZXdzOyBpKyspIHtcbiAgICBjb25zdCB2aWV3ID0gdmlld3NbaV0sXG4gICAgICBlbGVtZW50ID0gdmlldy5kaXY7XG4gICAgY29uc3QgY3VycmVudFdpZHRoID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldFRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICAgIGNvbnN0IHZpZXdXaWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICB2aWV3SGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3Qgdmlld1JpZ2h0ID0gY3VycmVudFdpZHRoICsgdmlld1dpZHRoO1xuICAgIGNvbnN0IHZpZXdCb3R0b20gPSBjdXJyZW50SGVpZ2h0ICsgdmlld0hlaWdodDtcblxuICAgIGlmIChsYXN0RWRnZSA9PT0gLTEpIHtcbiAgICAgIC8vIEFzIGNvbW1lbnRlZCBhYm92ZSwgdGhpcyBpcyBvbmx5IG5lZWRlZCBpbiBub24taG9yaXpvbnRhbCBjYXNlcy5cbiAgICAgIC8vIFNldHRpbmcgbGFzdEVkZ2UgdG8gdGhlIGJvdHRvbSBvZiB0aGUgZmlyc3QgcGFnZSB0aGF0IGlzIHBhcnRpYWxseVxuICAgICAgLy8gdmlzaWJsZSBlbnN1cmVzIHRoYXQgdGhlIG5leHQgcGFnZSBmdWxseSBiZWxvdyBsYXN0RWRnZSBpcyBvbiB0aGVcbiAgICAgIC8vIG5leHQgcm93LCB3aGljaCBoYXMgdG8gYmUgZnVsbHkgaGlkZGVuIGFsb25nIHdpdGggYWxsIHN1YnNlcXVlbnQgcm93cy5cbiAgICAgIGlmICh2aWV3Qm90dG9tID49IGJvdHRvbSkge1xuICAgICAgICBsYXN0RWRnZSA9IHZpZXdCb3R0b207XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgoaG9yaXpvbnRhbCA/IGN1cnJlbnRXaWR0aCA6IGN1cnJlbnRIZWlnaHQpID4gbGFzdEVkZ2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHZpZXdCb3R0b20gPD0gdG9wIHx8XG4gICAgICBjdXJyZW50SGVpZ2h0ID49IGJvdHRvbSB8fFxuICAgICAgdmlld1JpZ2h0IDw9IGxlZnQgfHxcbiAgICAgIGN1cnJlbnRXaWR0aCA+PSByaWdodFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaGlkZGVuSGVpZ2h0ID1cbiAgICAgIE1hdGgubWF4KDAsIHRvcCAtIGN1cnJlbnRIZWlnaHQpICsgTWF0aC5tYXgoMCwgdmlld0JvdHRvbSAtIGJvdHRvbSk7XG4gICAgY29uc3QgaGlkZGVuV2lkdGggPVxuICAgICAgTWF0aC5tYXgoMCwgbGVmdCAtIGN1cnJlbnRXaWR0aCkgKyBNYXRoLm1heCgwLCB2aWV3UmlnaHQgLSByaWdodCk7XG4gICAgY29uc3QgcGVyY2VudCA9XG4gICAgICAoKCh2aWV3SGVpZ2h0IC0gaGlkZGVuSGVpZ2h0KSAqICh2aWV3V2lkdGggLSBoaWRkZW5XaWR0aCkgKiAxMDApIC9cbiAgICAgICAgdmlld0hlaWdodCAvXG4gICAgICAgIHZpZXdXaWR0aCkgfFxuICAgICAgMDtcbiAgICB2aXNpYmxlLnB1c2goe1xuICAgICAgaWQ6IHZpZXcuaWQsXG4gICAgICB4OiBjdXJyZW50V2lkdGgsXG4gICAgICB5OiBjdXJyZW50SGVpZ2h0LFxuICAgICAgdmlldyxcbiAgICAgIHBlcmNlbnQsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBmaXJzdCA9IHZpc2libGVbMF0sXG4gICAgbGFzdCA9IHZpc2libGVbdmlzaWJsZS5sZW5ndGggLSAxXTtcblxuICBpZiAoc29ydEJ5VmlzaWJpbGl0eSkge1xuICAgIHZpc2libGUuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgY29uc3QgcGMgPSBhLnBlcmNlbnQgLSBiLnBlcmNlbnQ7XG4gICAgICBpZiAoTWF0aC5hYnMocGMpID4gMC4wMDEpIHtcbiAgICAgICAgcmV0dXJuIC1wYztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhLmlkIC0gYi5pZDsgLy8gZW5zdXJlIHN0YWJpbGl0eVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7IGZpcnN0LCBsYXN0LCB2aWV3czogdmlzaWJsZSB9O1xufVxuXG4vKipcbiAqIEV2ZW50IGhhbmRsZXIgdG8gc3VwcHJlc3MgY29udGV4dCBtZW51LlxuICovXG5mdW5jdGlvbiBub0NvbnRleHRNZW51SGFuZGxlcihldnQpIHtcbiAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGF0YVNjaGVtYSh1cmwpIHtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBpaSA9IHVybC5sZW5ndGg7XG4gIHdoaWxlIChpIDwgaWkgJiYgdXJsW2ldLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gdXJsLnN1YnN0cmluZyhpLCBpICsgNSkudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhOlwiO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpbGVuYW1lIG9yIGd1ZXNzZWQgZmlsZW5hbWUgZnJvbSB0aGUgdXJsIChzZWUgaXNzdWUgMzQ1NSkuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIG9yaWdpbmFsIFBERiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0RmlsZW5hbWUgLSBUaGUgdmFsdWUgcmV0dXJuZWQgaWYgdGhlIGZpbGVuYW1lIGlzXG4gKiAgIHVua25vd24sIG9yIHRoZSBwcm90b2NvbCBpcyB1bnN1cHBvcnRlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEd1ZXNzZWQgUERGIGZpbGVuYW1lLlxuICovXG5mdW5jdGlvbiBnZXRQREZGaWxlTmFtZUZyb21VUkwodXJsLCBkZWZhdWx0RmlsZW5hbWUgPSBcImRvY3VtZW50LnBkZlwiKSB7XG4gIGlmICh0eXBlb2YgdXJsICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRGaWxlbmFtZTtcbiAgfVxuICBpZiAoaXNEYXRhU2NoZW1hKHVybCkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcImdldFBERkZpbGVOYW1lRnJvbVVSTDogXCIgK1xuICAgICAgICAnaWdub3JpbmcgXCJkYXRhOlwiIFVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nXG4gICAgKTtcbiAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuICB9XG4gIGNvbnN0IHJlVVJJID0gL14oPzooPzpbXjpdKzopP1xcL1xcL1teXFwvXSspPyhbXj8jXSopKFxcP1teI10qKT8oIy4qKT8kLztcbiAgLy8gICAgICAgICAgICAgIFNDSEVNRSAgICAgICAgSE9TVCAgICAgICAgIDEuUEFUSCAgMi5RVUVSWSAgIDMuUkVGXG4gIC8vIFBhdHRlcm4gdG8gZ2V0IGxhc3QgbWF0Y2hpbmcgTkFNRS5wZGZcbiAgY29uc3QgcmVGaWxlbmFtZSA9IC9bXlxcLz8jPV0rXFwucGRmXFxiKD8hLipcXC5wZGZcXGIpL2k7XG4gIGNvbnN0IHNwbGl0VVJJID0gcmVVUkkuZXhlYyh1cmwpO1xuICBsZXQgc3VnZ2VzdGVkRmlsZW5hbWUgPVxuICAgIHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVsxXSkgfHxcbiAgICByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMl0pIHx8XG4gICAgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzNdKTtcbiAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lKSB7XG4gICAgc3VnZ2VzdGVkRmlsZW5hbWUgPSBzdWdnZXN0ZWRGaWxlbmFtZVswXTtcbiAgICBpZiAoc3VnZ2VzdGVkRmlsZW5hbWUuaW5jbHVkZXMoXCIlXCIpKSB7XG4gICAgICAvLyBVUkwtZW5jb2RlZCAlMkZwYXRoJTJGdG8lMkZmaWxlLnBkZiBzaG91bGQgYmUgZmlsZS5wZGZcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKFxuICAgICAgICAgIGRlY29kZVVSSUNvbXBvbmVudChzdWdnZXN0ZWRGaWxlbmFtZSlcbiAgICAgICAgKVswXTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIC8vIFBvc3NpYmxlIChleHRyZW1lbHkgcmFyZSkgZXJyb3JzOlxuICAgICAgICAvLyBVUklFcnJvciBcIk1hbGZvcm1lZCBVUklcIiwgZS5nLiBmb3IgXCIlQUEucGRmXCJcbiAgICAgICAgLy8gVHlwZUVycm9yIFwibnVsbCBoYXMgbm8gcHJvcGVydGllc1wiLCBlLmcuIGZvciBcIiUyRi5wZGZcIlxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3VnZ2VzdGVkRmlsZW5hbWUgfHwgZGVmYXVsdEZpbGVuYW1lO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVXaGVlbEV2ZW50RGlyZWN0aW9uKGV2dCkge1xuICBsZXQgZGVsdGEgPSBNYXRoLnNxcnQoZXZ0LmRlbHRhWCAqIGV2dC5kZWx0YVggKyBldnQuZGVsdGFZICogZXZ0LmRlbHRhWSk7XG4gIGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMihldnQuZGVsdGFZLCBldnQuZGVsdGFYKTtcbiAgaWYgKC0wLjI1ICogTWF0aC5QSSA8IGFuZ2xlICYmIGFuZ2xlIDwgMC43NSAqIE1hdGguUEkpIHtcbiAgICAvLyBBbGwgdGhhdCBpcyBsZWZ0LXVwIG9yaWVudGVkIGhhcyB0byBjaGFuZ2UgdGhlIHNpZ24uXG4gICAgZGVsdGEgPSAtZGVsdGE7XG4gIH1cbiAgcmV0dXJuIGRlbHRhO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVXaGVlbEV2ZW50RGVsdGEoZXZ0KSB7XG4gIGxldCBkZWx0YSA9IG5vcm1hbGl6ZVdoZWVsRXZlbnREaXJlY3Rpb24oZXZ0KTtcblxuICBjb25zdCBNT1VTRV9ET01fREVMVEFfUElYRUxfTU9ERSA9IDA7XG4gIGNvbnN0IE1PVVNFX0RPTV9ERUxUQV9MSU5FX01PREUgPSAxO1xuICBjb25zdCBNT1VTRV9QSVhFTFNfUEVSX0xJTkUgPSAzMDtcbiAgY29uc3QgTU9VU0VfTElORVNfUEVSX1BBR0UgPSAzMDtcblxuICAvLyBDb252ZXJ0cyBkZWx0YSB0byBwZXItcGFnZSB1bml0c1xuICBpZiAoZXZ0LmRlbHRhTW9kZSA9PT0gTU9VU0VfRE9NX0RFTFRBX1BJWEVMX01PREUpIHtcbiAgICBkZWx0YSAvPSBNT1VTRV9QSVhFTFNfUEVSX0xJTkUgKiBNT1VTRV9MSU5FU19QRVJfUEFHRTtcbiAgfSBlbHNlIGlmIChldnQuZGVsdGFNb2RlID09PSBNT1VTRV9ET01fREVMVEFfTElORV9NT0RFKSB7XG4gICAgZGVsdGEgLz0gTU9VU0VfTElORVNfUEVSX1BBR0U7XG4gIH1cbiAgcmV0dXJuIGRlbHRhO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkUm90YXRpb24oYW5nbGUpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoYW5nbGUpICYmIGFuZ2xlICUgOTAgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRTY3JvbGxNb2RlKG1vZGUpIHtcbiAgcmV0dXJuIChcbiAgICBOdW1iZXIuaXNJbnRlZ2VyKG1vZGUpICYmXG4gICAgT2JqZWN0LnZhbHVlcyhTY3JvbGxNb2RlKS5pbmNsdWRlcyhtb2RlKSAmJlxuICAgIG1vZGUgIT09IFNjcm9sbE1vZGUuVU5LTk9XTlxuICApO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkU3ByZWFkTW9kZShtb2RlKSB7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyLmlzSW50ZWdlcihtb2RlKSAmJlxuICAgIE9iamVjdC52YWx1ZXMoU3ByZWFkTW9kZSkuaW5jbHVkZXMobW9kZSkgJiZcbiAgICBtb2RlICE9PSBTcHJlYWRNb2RlLlVOS05PV05cbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNQb3J0cmFpdE9yaWVudGF0aW9uKHNpemUpIHtcbiAgcmV0dXJuIHNpemUud2lkdGggPD0gc2l6ZS5oZWlnaHQ7XG59XG5cbmNvbnN0IFdhaXRPblR5cGUgPSB7XG4gIEVWRU5UOiBcImV2ZW50XCIsXG4gIFRJTUVPVVQ6IFwidGltZW91dFwiLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXYWl0T25FdmVudE9yVGltZW91dFBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0YXJnZXQgLSBUaGUgZXZlbnQgdGFyZ2V0LCBjYW4gZm9yIGV4YW1wbGUgYmU6XG4gKiAgIGB3aW5kb3dgLCBgZG9jdW1lbnRgLCBhIERPTSBlbGVtZW50LCBvciBhbiB7RXZlbnRCdXN9IGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVsYXkgLSBUaGUgZGVsYXksIGluIG1pbGxpc2Vjb25kcywgYWZ0ZXIgd2hpY2ggdGhlXG4gKiAgIHRpbWVvdXQgb2NjdXJzIChpZiB0aGUgZXZlbnQgd2Fzbid0IGFscmVhZHkgZGlzcGF0Y2hlZCkuXG4gKi9cblxuLyoqXG4gKiBBbGxvd3Mgd2FpdGluZyBmb3IgYW4gZXZlbnQgb3IgYSB0aW1lb3V0LCB3aGljaGV2ZXIgb2NjdXJzIGZpcnN0LlxuICogQ2FuIGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgYW4gYWN0aW9uIGFsd2F5cyBvY2N1cnMsIGV2ZW4gd2hlbiBhbiBldmVudFxuICogYXJyaXZlcyBsYXRlIG9yIG5vdCBhdCBhbGwuXG4gKlxuICogQHBhcmFtIHtXYWl0T25FdmVudE9yVGltZW91dFBhcmFtZXRlcnN9XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhIHtXYWl0T25UeXBlfSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gd2FpdE9uRXZlbnRPclRpbWVvdXQoeyB0YXJnZXQsIG5hbWUsIGRlbGF5ID0gMCB9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgIShuYW1lICYmIHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB8fFxuICAgICAgIShOdW1iZXIuaXNJbnRlZ2VyKGRlbGF5KSAmJiBkZWxheSA+PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwid2FpdE9uRXZlbnRPclRpbWVvdXQgLSBpbnZhbGlkIHBhcmFtZXRlcnMuXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZXIodHlwZSkge1xuICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50QnVzKSB7XG4gICAgICAgIHRhcmdldC5fb2ZmKG5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHR5cGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50SGFuZGxlciA9IGhhbmRsZXIuYmluZChudWxsLCBXYWl0T25UeXBlLkVWRU5UKTtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRXZlbnRCdXMpIHtcbiAgICAgIHRhcmdldC5fb24obmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGhhbmRsZXIuYmluZChudWxsLCBXYWl0T25UeXBlLlRJTUVPVVQpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCBkZWxheSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIERPTSB3aW5kb3cgYmVjb21lcyB2aXNpYmxlLlxuICovXG5jb25zdCBhbmltYXRpb25TdGFydGVkID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIFBERkpTRGV2LnRlc3QoXCJMSUIgJiYgVEVTVElOR1wiKSAmJlxuICAgIHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCJcbiAgKSB7XG4gICAgLy8gUHJldmVudCBcIlJlZmVyZW5jZUVycm9yOiB3aW5kb3cgaXMgbm90IGRlZmluZWRcIiBlcnJvcnMgd2hlbiBydW5uaW5nIHRoZVxuICAgIC8vIHVuaXQtdGVzdHMgaW4gTm9kZS5qcy9UcmF2aXMuXG4gICAgc2V0VGltZW91dChyZXNvbHZlLCAyMCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSk7XG59KTtcblxuLyoqXG4gKiBOT1RFOiBPbmx5IHVzZWQgdG8gc3VwcG9ydCB2YXJpb3VzIFBERiB2aWV3ZXIgdGVzdHMgaW4gYG1vemlsbGEtY2VudHJhbGAuXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoRE9NRXZlbnQoZXZlbnROYW1lLCBhcmdzID0gbnVsbCkge1xuICBpZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmICFQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTFwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZDogZGlzcGF0Y2hET01FdmVudFwiKTtcbiAgfVxuICBjb25zdCBkZXRhaWxzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgb2JqID0gYXJnc1swXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICBpZiAoa2V5ID09PSBcInNvdXJjZVwiKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gd2luZG93IHx8IHZhbHVlID09PSBkb2N1bWVudCkge1xuICAgICAgICAgIHJldHVybjsgLy8gTm8gbmVlZCB0byByZS1kaXNwYXRjaCAoYWxyZWFkeSkgZ2xvYmFsIGV2ZW50cy5cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTsgLy8gSWdub3JlIHRoZSBgc291cmNlYCBwcm9wZXJ0eS5cbiAgICAgIH1cbiAgICAgIGRldGFpbHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gIGV2ZW50LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbHMpO1xuICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgZXZlbnQgYnVzIGZvciBhbiBhcHBsaWNhdGlvbi4gTGlzdGVuZXJzIGFyZSBhdHRhY2hlZCB1c2luZyB0aGUgYG9uYFxuICogYW5kIGBvZmZgIG1ldGhvZHMuIFRvIHJhaXNlIGFuIGV2ZW50LCB0aGUgYGRpc3BhdGNoYCBtZXRob2Qgc2hhbGwgYmUgdXNlZC5cbiAqL1xuY2xhc3MgRXZlbnRCdXMge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIGlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHtcbiAgICAgIHRoaXMuX2lzSW5BdXRvbWF0aW9uID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5pc0luQXV0b21hdGlvbikgPT09IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICovXG4gIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9vbihldmVudE5hbWUsIGxpc3RlbmVyLCB7IGV4dGVybmFsOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICovXG4gIG9mZihldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fb2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIsIHsgZXh0ZXJuYWw6IHRydWUgfSk7XG4gIH1cblxuICBkaXNwYXRjaChldmVudE5hbWUpIHtcbiAgICBjb25zdCBldmVudExpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudE5hbWVdO1xuICAgIGlmICghZXZlbnRMaXN0ZW5lcnMgfHwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpICYmXG4gICAgICAgIHRoaXMuX2lzSW5BdXRvbWF0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGRpc3BhdGNoRE9NRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUGFzc2luZyBhbGwgYXJndW1lbnRzIGFmdGVyIHRoZSBldmVudE5hbWUgdG8gdGhlIGxpc3RlbmVycy5cbiAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBsZXQgZXh0ZXJuYWxMaXN0ZW5lcnM7XG4gICAgLy8gTWFraW5nIGNvcHkgb2YgdGhlIGxpc3RlbmVycyBhcnJheSBpbiBjYXNlIGlmIGl0IHdpbGwgYmUgbW9kaWZpZWRcbiAgICAvLyBkdXJpbmcgZGlzcGF0Y2guXG4gICAgZXZlbnRMaXN0ZW5lcnMuc2xpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAoeyBsaXN0ZW5lciwgZXh0ZXJuYWwgfSkge1xuICAgICAgaWYgKGV4dGVybmFsKSB7XG4gICAgICAgIGlmICghZXh0ZXJuYWxMaXN0ZW5lcnMpIHtcbiAgICAgICAgICBleHRlcm5hbExpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGV4dGVybmFsTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsaXN0ZW5lci5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgICAvLyBEaXNwYXRjaCBhbnkgXCJleHRlcm5hbFwiIGxpc3RlbmVycyAqYWZ0ZXIqIHRoZSBpbnRlcm5hbCBvbmVzLCB0byBnaXZlIHRoZVxuICAgIC8vIHZpZXdlciBjb21wb25lbnRzIHRpbWUgdG8gaGFuZGxlIGV2ZW50cyBhbmQgdXBkYXRlIHRoZWlyIHN0YXRlIGZpcnN0LlxuICAgIGlmIChleHRlcm5hbExpc3RlbmVycykge1xuICAgICAgZXh0ZXJuYWxMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXIuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIGV4dGVybmFsTGlzdGVuZXJzID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTFwiKSkgJiZcbiAgICAgIHRoaXMuX2lzSW5BdXRvbWF0aW9uXG4gICAgKSB7XG4gICAgICBkaXNwYXRjaERPTUV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIF9vbihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zID0gbnVsbCkge1xuICAgIGxldCBldmVudExpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudE5hbWVdO1xuICAgIGlmICghZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVyc1tldmVudE5hbWVdID0gZXZlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgICB9XG4gICAgZXZlbnRMaXN0ZW5lcnMucHVzaCh7XG4gICAgICBsaXN0ZW5lcixcbiAgICAgIGV4dGVybmFsOiAob3B0aW9ucyAmJiBvcHRpb25zLmV4dGVybmFsKSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBfb2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIsIG9wdGlvbnMgPSBudWxsKSB7XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTtcbiAgICBpZiAoIWV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGlmIChldmVudExpc3RlbmVyc1tpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNsYW1wKHYsIG1pbiwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2LCBtaW4pLCBtYXgpO1xufVxuXG5jbGFzcyBQcm9ncmVzc0JhciB7XG4gIGNvbnN0cnVjdG9yKGlkLCB7IGhlaWdodCwgd2lkdGgsIHVuaXRzIH0gPSB7fSkge1xuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG5cbiAgICAvLyBGZXRjaCB0aGUgc3ViLWVsZW1lbnRzIGZvciBsYXRlci5cbiAgICB0aGlzLmRpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaWQgKyBcIiAucHJvZ3Jlc3NcIik7XG4gICAgLy8gR2V0IHRoZSBsb2FkaW5nIGJhciBlbGVtZW50LCBzbyBpdCBjYW4gYmUgcmVzaXplZCB0byBmaXQgdGhlIHZpZXdlci5cbiAgICB0aGlzLmJhciA9IHRoaXMuZGl2LnBhcmVudE5vZGU7XG5cbiAgICAvLyBHZXQgb3B0aW9ucywgd2l0aCBzZW5zaWJsZSBkZWZhdWx0cy5cbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCB8fCAxMDA7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoIHx8IDEwMDtcbiAgICB0aGlzLnVuaXRzID0gdW5pdHMgfHwgXCIlXCI7XG5cbiAgICAvLyBJbml0aWFsaXplIGhlaWdodHMuXG4gICAgdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyB0aGlzLnVuaXRzO1xuICAgIHRoaXMucGVyY2VudCA9IDA7XG4gIH1cblxuICBfdXBkYXRlQmFyKCkge1xuICAgIGlmICh0aGlzLl9pbmRldGVybWluYXRlKSB7XG4gICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiaW5kZXRlcm1pbmF0ZVwiKTtcbiAgICAgIHRoaXMuZGl2LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIHRoaXMudW5pdHM7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImluZGV0ZXJtaW5hdGVcIik7XG4gICAgY29uc3QgcHJvZ3Jlc3NTaXplID0gKHRoaXMud2lkdGggKiB0aGlzLl9wZXJjZW50KSAvIDEwMDtcbiAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IHByb2dyZXNzU2l6ZSArIHRoaXMudW5pdHM7XG4gIH1cblxuICBnZXQgcGVyY2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyY2VudDtcbiAgfVxuXG4gIHNldCBwZXJjZW50KHZhbCkge1xuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBpc05hTih2YWwpO1xuICAgIHRoaXMuX3BlcmNlbnQgPSBjbGFtcCh2YWwsIDAsIDEwMCk7XG4gICAgdGhpcy5fdXBkYXRlQmFyKCk7XG4gIH1cblxuICBzZXRXaWR0aCh2aWV3ZXIpIHtcbiAgICBpZiAoIXZpZXdlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXIgPSB2aWV3ZXIucGFyZW50Tm9kZTtcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IGNvbnRhaW5lci5vZmZzZXRXaWR0aCAtIHZpZXdlci5vZmZzZXRXaWR0aDtcbiAgICBpZiAoc2Nyb2xsYmFyV2lkdGggPiAwKSB7XG4gICAgICB0aGlzLmJhci5zdHlsZS53aWR0aCA9IGBjYWxjKDEwMCUgLSAke3Njcm9sbGJhcldpZHRofXB4KWA7XG4gICAgfVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmJhci5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcImxvYWRpbmdJblByb2dyZXNzXCIpO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwibG9hZGluZ0luUHJvZ3Jlc3NcIik7XG4gICAgdGhpcy5iYXIuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vdmVzIGFsbCBlbGVtZW50cyBvZiBhbiBhcnJheSB0aGF0IHNhdGlzZnkgY29uZGl0aW9uIHRvIHRoZSBlbmQgb2YgdGhlXG4gKiBhcnJheSwgcHJlc2VydmluZyB0aGUgb3JkZXIgb2YgdGhlIHJlc3QuXG4gKi9cbmZ1bmN0aW9uIG1vdmVUb0VuZE9mQXJyYXkoYXJyLCBjb25kaXRpb24pIHtcbiAgY29uc3QgbW92ZWQgPSBbXSxcbiAgICBsZW4gPSBhcnIubGVuZ3RoO1xuICBsZXQgd3JpdGUgPSAwO1xuICBmb3IgKGxldCByZWFkID0gMDsgcmVhZCA8IGxlbjsgKytyZWFkKSB7XG4gICAgaWYgKGNvbmRpdGlvbihhcnJbcmVhZF0pKSB7XG4gICAgICBtb3ZlZC5wdXNoKGFycltyZWFkXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyclt3cml0ZV0gPSBhcnJbcmVhZF07XG4gICAgICArK3dyaXRlO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCByZWFkID0gMDsgd3JpdGUgPCBsZW47ICsrcmVhZCwgKyt3cml0ZSkge1xuICAgIGFyclt3cml0ZV0gPSBtb3ZlZFtyZWFkXTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBBdXRvUHJpbnRSZWdFeHAsXG4gIENTU19VTklUUyxcbiAgREVGQVVMVF9TQ0FMRV9WQUxVRSxcbiAgREVGQVVMVF9TQ0FMRSxcbiAgTUlOX1NDQUxFLFxuICBNQVhfU0NBTEUsXG4gIFVOS05PV05fU0NBTEUsXG4gIE1BWF9BVVRPX1NDQUxFLFxuICBTQ1JPTExCQVJfUEFERElORyxcbiAgVkVSVElDQUxfUEFERElORyxcbiAgaXNWYWxpZFJvdGF0aW9uLFxuICBpc1ZhbGlkU2Nyb2xsTW9kZSxcbiAgaXNWYWxpZFNwcmVhZE1vZGUsXG4gIGlzUG9ydHJhaXRPcmllbnRhdGlvbixcbiAgUHJlc2VudGF0aW9uTW9kZVN0YXRlLFxuICBSZW5kZXJlclR5cGUsXG4gIFRleHRMYXllck1vZGUsXG4gIFNjcm9sbE1vZGUsXG4gIFNwcmVhZE1vZGUsXG4gIE51bGxMMTBuLFxuICBFdmVudEJ1cyxcbiAgY2xhbXAsXG4gIFByb2dyZXNzQmFyLFxuICBnZXRQREZGaWxlTmFtZUZyb21VUkwsXG4gIG5vQ29udGV4dE1lbnVIYW5kbGVyLFxuICBwYXJzZVF1ZXJ5U3RyaW5nLFxuICBiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMsIC8vIG9ubHkgZXhwb3J0ZWQgZm9yIHRlc3RpbmdcbiAgZ2V0VmlzaWJsZUVsZW1lbnRzLFxuICByb3VuZFRvRGl2aWRlLFxuICBnZXRQYWdlU2l6ZUluY2hlcyxcbiAgYXBwcm94aW1hdGVGcmFjdGlvbixcbiAgZ2V0T3V0cHV0U2NhbGUsXG4gIHNjcm9sbEludG9WaWV3LFxuICB3YXRjaFNjcm9sbCxcbiAgYmluYXJ5U2VhcmNoRmlyc3RJdGVtLFxuICBub3JtYWxpemVXaGVlbEV2ZW50RGlyZWN0aW9uLFxuICBub3JtYWxpemVXaGVlbEV2ZW50RGVsdGEsXG4gIGFuaW1hdGlvblN0YXJ0ZWQsXG4gIFdhaXRPblR5cGUsXG4gIHdhaXRPbkV2ZW50T3JUaW1lb3V0LFxuICBtb3ZlVG9FbmRPZkFycmF5LFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy5cbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICB0b1N0cmluZ1RhZ1N5bWJvbCxcbiAgICBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgKTtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiIsIi8qIENvcHlyaWdodCAyMDE1IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBwYXJzZVF1ZXJ5U3RyaW5nIH0gZnJvbSBcIi4vdWlfdXRpbHMuanNcIjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQREZMaW5rU2VydmljZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RXZlbnRCdXN9IGV2ZW50QnVzIC0gVGhlIGFwcGxpY2F0aW9uIGV2ZW50IGJ1cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZXh0ZXJuYWxMaW5rVGFyZ2V0XSAtIFNwZWNpZmllcyB0aGUgYHRhcmdldGAgYXR0cmlidXRlXG4gKiAgIGZvciBleHRlcm5hbCBsaW5rcy4gTXVzdCB1c2Ugb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSB7TGlua1RhcmdldH0uXG4gKiAgIERlZmF1bHRzIHRvIHVzaW5nIG5vIHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXh0ZXJuYWxMaW5rUmVsXSAtIFNwZWNpZmllcyB0aGUgYHJlbGAgYXR0cmlidXRlIGZvclxuICogICBleHRlcm5hbCBsaW5rcy4gRGVmYXVsdHMgdG8gc3RyaXBwaW5nIHRoZSByZWZlcnJlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZURlc3RpbmF0aW9uWm9vbV0gLSBJZ25vcmVzIHRoZSB6b29tIGFyZ3VtZW50LFxuICogICB0aHVzIHByZXNlcnZpbmcgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBpbiB0aGUgdmlld2VyLCB3aGVuIG5hdmlnYXRpbmdcbiAqICAgdG8gaW50ZXJuYWwgZGVzdGluYXRpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgbmF2aWdhdGlvbiBmdW5jdGlvbnMgaW5zaWRlIFBERiwgc3VjaCBhcyBvcGVuaW5nIHNwZWNpZmllZCBwYWdlLFxuICogb3IgZGVzdGluYXRpb24uXG4gKiBAaW1wbGVtZW50cyB7SVBERkxpbmtTZXJ2aWNlfVxuICovXG5jbGFzcyBQREZMaW5rU2VydmljZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge1BERkxpbmtTZXJ2aWNlT3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe1xuICAgIGV2ZW50QnVzLFxuICAgIGV4dGVybmFsTGlua1RhcmdldCA9IG51bGwsXG4gICAgZXh0ZXJuYWxMaW5rUmVsID0gbnVsbCxcbiAgICBleHRlcm5hbExpbmtFbmFibGVkID0gdHJ1ZSxcbiAgICBpZ25vcmVEZXN0aW5hdGlvblpvb20gPSBmYWxzZSxcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gZXh0ZXJuYWxMaW5rVGFyZ2V0O1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rUmVsID0gZXh0ZXJuYWxMaW5rUmVsO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IGV4dGVybmFsTGlua0VuYWJsZWQ7XG4gICAgdGhpcy5faWdub3JlRGVzdGluYXRpb25ab29tID0gaWdub3JlRGVzdGluYXRpb25ab29tO1xuXG4gICAgdGhpcy5iYXNlVXJsID0gbnVsbDtcbiAgICB0aGlzLnBkZkRvY3VtZW50ID0gbnVsbDtcbiAgICB0aGlzLnBkZlZpZXdlciA9IG51bGw7XG4gICAgdGhpcy5wZGZIaXN0b3J5ID0gbnVsbDtcblxuICAgIHRoaXMuX3BhZ2VzUmVmQ2FjaGUgPSBudWxsO1xuICB9XG5cbiAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQsIGJhc2VVcmwgPSBudWxsKSB7XG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcbiAgICB0aGlzLnBkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7XG4gICAgdGhpcy5fcGFnZXNSZWZDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICBzZXRWaWV3ZXIocGRmVmlld2VyKSB7XG4gICAgdGhpcy5wZGZWaWV3ZXIgPSBwZGZWaWV3ZXI7XG4gIH1cblxuICBzZXRIaXN0b3J5KHBkZkhpc3RvcnkpIHtcbiAgICB0aGlzLnBkZkhpc3RvcnkgPSBwZGZIaXN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcGFnZXNDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgOiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqL1xuICBzZXQgcGFnZSh2YWx1ZSkge1xuICAgIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCByb3RhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZWaWV3ZXIucGFnZXNSb3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICovXG4gIHNldCByb3RhdGlvbih2YWx1ZSkge1xuICAgIHRoaXMucGRmVmlld2VyLnBhZ2VzUm90YXRpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gZGVzdCAtIFRoZSBuYW1lZCwgb3IgZXhwbGljaXQsIFBERiBkZXN0aW5hdGlvbi5cbiAgICovXG4gIG5hdmlnYXRlVG8oZGVzdCkge1xuICAgIGNvbnN0IGdvVG9EZXN0aW5hdGlvbiA9ICh7IG5hbWVkRGVzdCwgZXhwbGljaXREZXN0IH0pID0+IHtcbiAgICAgIC8vIERlc3QgYXJyYXkgbG9va3MgbGlrZSB0aGF0OiA8cGFnZS1yZWY+IDwvWFlafC9GaXRYWFg+IDxhcmdzLi4+XG4gICAgICBjb25zdCBkZXN0UmVmID0gZXhwbGljaXREZXN0WzBdO1xuICAgICAgbGV0IHBhZ2VOdW1iZXI7XG5cbiAgICAgIGlmIChkZXN0UmVmIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIHBhZ2VOdW1iZXIgPSB0aGlzLl9jYWNoZWRQYWdlTnVtYmVyKGRlc3RSZWYpO1xuXG4gICAgICAgIGlmIChwYWdlTnVtYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gRmV0Y2ggdGhlIHBhZ2UgcmVmZXJlbmNlIGlmIGl0J3Mgbm90IHlldCBhdmFpbGFibGUuIFRoaXMgY291bGRcbiAgICAgICAgICAvLyBvbmx5IG9jY3VyIGR1cmluZyBsb2FkaW5nLCBiZWZvcmUgYWxsIHBhZ2VzIGhhdmUgYmVlbiByZXNvbHZlZC5cbiAgICAgICAgICB0aGlzLnBkZkRvY3VtZW50XG4gICAgICAgICAgICAuZ2V0UGFnZUluZGV4KGRlc3RSZWYpXG4gICAgICAgICAgICAudGhlbihwYWdlSW5kZXggPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNhY2hlUGFnZVJlZihwYWdlSW5kZXggKyAxLCBkZXN0UmVmKTtcbiAgICAgICAgICAgICAgZ29Ub0Rlc3RpbmF0aW9uKHsgbmFtZWREZXN0LCBleHBsaWNpdERlc3QgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBgUERGTGlua1NlcnZpY2UubmF2aWdhdGVUbzogXCIke2Rlc3RSZWZ9XCIgaXMgbm90IGAgK1xuICAgICAgICAgICAgICAgICAgYGEgdmFsaWQgcGFnZSByZWZlcmVuY2UsIGZvciBkZXN0PVwiJHtkZXN0fVwiLmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGRlc3RSZWYpKSB7XG4gICAgICAgIHBhZ2VOdW1iZXIgPSBkZXN0UmVmICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFwiJHtkZXN0UmVmfVwiIGlzIG5vdCBgICtcbiAgICAgICAgICAgIGBhIHZhbGlkIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSwgZm9yIGRlc3Q9XCIke2Rlc3R9XCIuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXBhZ2VOdW1iZXIgfHwgcGFnZU51bWJlciA8IDEgfHwgcGFnZU51bWJlciA+IHRoaXMucGFnZXNDb3VudCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvOiBcIiR7cGFnZU51bWJlcn1cIiBpcyBub3QgYCArXG4gICAgICAgICAgICBgYSB2YWxpZCBwYWdlIG51bWJlciwgZm9yIGRlc3Q9XCIke2Rlc3R9XCIuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBkZkhpc3RvcnkpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBicm93c2VyIGhpc3RvcnkgYmVmb3JlIHNjcm9sbGluZyB0aGUgbmV3IGRlc3RpbmF0aW9uIGludG9cbiAgICAgICAgLy8gdmlldywgdG8gYmUgYWJsZSB0byBhY2N1cmF0ZWx5IGNhcHR1cmUgdGhlIGN1cnJlbnQgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgICAgIHRoaXMucGRmSGlzdG9yeS5wdXNoQ3VycmVudFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMucGRmSGlzdG9yeS5wdXNoKHsgbmFtZWREZXN0LCBleHBsaWNpdERlc3QsIHBhZ2VOdW1iZXIgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGRmVmlld2VyLnNjcm9sbFBhZ2VJbnRvVmlldyh7XG4gICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgIGRlc3RBcnJheTogZXhwbGljaXREZXN0LFxuICAgICAgICBpZ25vcmVEZXN0aW5hdGlvblpvb206IHRoaXMuX2lnbm9yZURlc3RpbmF0aW9uWm9vbSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGRlc3QgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5wZGZEb2N1bWVudC5nZXREZXN0aW5hdGlvbihkZXN0KS50aGVuKGRlc3RBcnJheSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBuYW1lZERlc3Q6IGRlc3QsXG4gICAgICAgICAgICBleHBsaWNpdERlc3Q6IGRlc3RBcnJheSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBuYW1lZERlc3Q6IFwiXCIsXG4gICAgICAgIGV4cGxpY2l0RGVzdDogZGVzdCxcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZGF0YSA9PiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5leHBsaWNpdERlc3QpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFwiJHtkYXRhLmV4cGxpY2l0RGVzdH1cIiBpc2AgK1xuICAgICAgICAgICAgYCBub3QgYSB2YWxpZCBkZXN0aW5hdGlvbiBhcnJheSwgZm9yIGRlc3Q9XCIke2Rlc3R9XCIuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBnb1RvRGVzdGluYXRpb24oZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IGRlc3QgLSBUaGUgUERGIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGVybGluayB0byB0aGUgUERGIG9iamVjdC5cbiAgICovXG4gIGdldERlc3RpbmF0aW9uSGFzaChkZXN0KSB7XG4gICAgaWYgKHR5cGVvZiBkZXN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoXCIjXCIgKyBlc2NhcGUoZGVzdCkpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZXN0KSkge1xuICAgICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGVzdCk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoXCIjXCIgKyBlc2NhcGUoc3RyKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEFuY2hvclVybChcIlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggdGhlIGZ1bGwgdXJsIG9uIGFuY2hvciBsaW5rcyB0byBtYWtlIHN1cmUgdGhhdCBsaW5rcyBhcmUgcmVzb2x2ZWRcbiAgICogcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgVVJMIGluc3RlYWQgb2YgdGhlIG9uZSBkZWZpbmVkIGluIDxiYXNlIGhyZWY+LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYW5jaG9yIFRoZSBhbmNob3IgaGFzaCwgaW5jbHVkaW5nIHRoZSAjLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaHlwZXJsaW5rIHRvIHRoZSBQREYgb2JqZWN0LlxuICAgKi9cbiAgZ2V0QW5jaG9yVXJsKGFuY2hvcikge1xuICAgIHJldHVybiAodGhpcy5iYXNlVXJsIHx8IFwiXCIpICsgYW5jaG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoXG4gICAqL1xuICBzZXRIYXNoKGhhc2gpIHtcbiAgICBsZXQgcGFnZU51bWJlciwgZGVzdDtcbiAgICBpZiAoaGFzaC5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHBhcnNlUXVlcnlTdHJpbmcoaGFzaCk7XG4gICAgICBpZiAoXCJzZWFyY2hcIiBpbiBwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcImZpbmRmcm9tdXJsaGFzaFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMuc2VhcmNoLnJlcGxhY2UoL1wiL2csIFwiXCIpLFxuICAgICAgICAgIHBocmFzZVNlYXJjaDogcGFyYW1zLnBocmFzZSA9PT0gXCJ0cnVlXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gYm9ycm93aW5nIHN5bnRheCBmcm9tIFwiUGFyYW1ldGVycyBmb3IgT3BlbmluZyBQREYgRmlsZXNcIlxuICAgICAgaWYgKFwicGFnZVwiIGluIHBhcmFtcykge1xuICAgICAgICBwYWdlTnVtYmVyID0gcGFyYW1zLnBhZ2UgfCAwIHx8IDE7XG4gICAgICB9XG4gICAgICBpZiAoXCJ6b29tXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIC8vIEJ1aWxkIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cbiAgICAgICAgY29uc3Qgem9vbUFyZ3MgPSBwYXJhbXMuem9vbS5zcGxpdChcIixcIik7IC8vIHNjYWxlLGxlZnQsdG9wXG4gICAgICAgIGNvbnN0IHpvb21BcmcgPSB6b29tQXJnc1swXTtcbiAgICAgICAgY29uc3Qgem9vbUFyZ051bWJlciA9IHBhcnNlRmxvYXQoem9vbUFyZyk7XG5cbiAgICAgICAgaWYgKCF6b29tQXJnLmluY2x1ZGVzKFwiRml0XCIpKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHpvb21BcmcgaXMgYSBudW1iZXIsIGl0IGhhcyB0byBnZXQgZGl2aWRlZCBieSAxMDAuIElmIGl0J3NcbiAgICAgICAgICAvLyBhIHN0cmluZywgaXQgc2hvdWxkIHN0YXkgYXMgaXQgaXMuXG4gICAgICAgICAgZGVzdCA9IFtcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB7IG5hbWU6IFwiWFlaXCIgfSxcbiAgICAgICAgICAgIHpvb21BcmdzLmxlbmd0aCA+IDEgPyB6b29tQXJnc1sxXSB8IDAgOiBudWxsLFxuICAgICAgICAgICAgem9vbUFyZ3MubGVuZ3RoID4gMiA/IHpvb21BcmdzWzJdIHwgMCA6IG51bGwsXG4gICAgICAgICAgICB6b29tQXJnTnVtYmVyID8gem9vbUFyZ051bWJlciAvIDEwMCA6IHpvb21BcmcsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoem9vbUFyZyA9PT0gXCJGaXRcIiB8fCB6b29tQXJnID09PSBcIkZpdEJcIikge1xuICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7IG5hbWU6IHpvb21BcmcgfV07XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHpvb21BcmcgPT09IFwiRml0SFwiIHx8XG4gICAgICAgICAgICB6b29tQXJnID09PSBcIkZpdEJIXCIgfHxcbiAgICAgICAgICAgIHpvb21BcmcgPT09IFwiRml0VlwiIHx8XG4gICAgICAgICAgICB6b29tQXJnID09PSBcIkZpdEJWXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGRlc3QgPSBbXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIHsgbmFtZTogem9vbUFyZyB9LFxuICAgICAgICAgICAgICB6b29tQXJncy5sZW5ndGggPiAxID8gem9vbUFyZ3NbMV0gfCAwIDogbnVsbCxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSBlbHNlIGlmICh6b29tQXJnID09PSBcIkZpdFJcIikge1xuICAgICAgICAgICAgaWYgKHpvb21BcmdzLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdQREZMaW5rU2VydmljZS5zZXRIYXNoOiBOb3QgZW5vdWdoIHBhcmFtZXRlcnMgZm9yIFwiRml0UlwiLidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlc3QgPSBbXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICB7IG5hbWU6IHpvb21BcmcgfSxcbiAgICAgICAgICAgICAgICB6b29tQXJnc1sxXSB8IDAsXG4gICAgICAgICAgICAgICAgem9vbUFyZ3NbMl0gfCAwLFxuICAgICAgICAgICAgICAgIHpvb21BcmdzWzNdIHwgMCxcbiAgICAgICAgICAgICAgICB6b29tQXJnc1s0XSB8IDAsXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBQREZMaW5rU2VydmljZS5zZXRIYXNoOiBcIiR7em9vbUFyZ31cIiBpcyBub3QgYCArXG4gICAgICAgICAgICAgICAgXCJhIHZhbGlkIHpvb20gdmFsdWUuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGVzdCkge1xuICAgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXIgfHwgdGhpcy5wYWdlLFxuICAgICAgICAgIGRlc3RBcnJheTogZGVzdCxcbiAgICAgICAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFnZU51bWJlcikge1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlTnVtYmVyOyAvLyBzaW1wbGUgcGFnZVxuICAgICAgfVxuICAgICAgaWYgKFwicGFnZW1vZGVcIiBpbiBwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2Vtb2RlXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgbW9kZTogcGFyYW1zLnBhZ2Vtb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgcGFyYW1ldGVyIGlzICphbHdheXMqIGhhbmRsZWQgbGFzdCwgaW4gb3JkZXIgdG9cbiAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGl0IHdvbid0IGJlIG92ZXJyaWRkZW4gKGUuZy4gYnkgdGhlIFwicGFnZVwiIHBhcmFtZXRlcikuXG4gICAgICBpZiAoXCJuYW1lZGRlc3RcIiBpbiBwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHBhcmFtcy5uYW1lZGRlc3QpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOYW1lZCAob3IgZXhwbGljaXQpIGRlc3RpbmF0aW9uLlxuICAgICAgZGVzdCA9IHVuZXNjYXBlKGhhc2gpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVzdCA9IEpTT04ucGFyc2UoZGVzdCk7XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRlc3QpKSB7XG4gICAgICAgICAgLy8gQXZvaWQgaW5jb3JyZWN0bHkgcmVqZWN0aW5nIGEgdmFsaWQgbmFtZWQgZGVzdGluYXRpb24sIHN1Y2ggYXNcbiAgICAgICAgICAvLyBlLmcuIFwiNC4zXCIgb3IgXCJ0cnVlXCIsIGJlY2F1c2UgYEpTT04ucGFyc2VgIGNvbnZlcnRlZCBpdHMgdHlwZS5cbiAgICAgICAgICBkZXN0ID0gZGVzdC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge31cblxuICAgICAgaWYgKHR5cGVvZiBkZXN0ID09PSBcInN0cmluZ1wiIHx8IGlzVmFsaWRFeHBsaWNpdERlc3RpbmF0aW9uKGRlc3QpKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUbyhkZXN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFBERkxpbmtTZXJ2aWNlLnNldEhhc2g6IFwiJHt1bmVzY2FwZShoYXNoKX1cIiBpcyBub3QgYCArXG4gICAgICAgICAgXCJhIHZhbGlkIGRlc3RpbmF0aW9uLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uXG4gICAqL1xuICBleGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKSB7XG4gICAgLy8gU2VlIFBERiByZWZlcmVuY2UsIHRhYmxlIDguNDUgLSBOYW1lZCBhY3Rpb25cbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgY2FzZSBcIkdvQmFja1wiOlxuICAgICAgICBpZiAodGhpcy5wZGZIaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5wZGZIaXN0b3J5LmJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkdvRm9yd2FyZFwiOlxuICAgICAgICBpZiAodGhpcy5wZGZIaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5wZGZIaXN0b3J5LmZvcndhcmQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIk5leHRQYWdlXCI6XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgPCB0aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgICAgICB0aGlzLnBhZ2UrKztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlByZXZQYWdlXCI6XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgPiAxKSB7XG4gICAgICAgICAgdGhpcy5wYWdlLS07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJMYXN0UGFnZVwiOlxuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLnBhZ2VzQ291bnQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiRmlyc3RQYWdlXCI6XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhazsgLy8gTm8gYWN0aW9uIGFjY29yZGluZyB0byBzcGVjXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcIm5hbWVkYWN0aW9uXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIGFjdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZU51bSAtIHBhZ2UgbnVtYmVyLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFnZVJlZiAtIHJlZmVyZW5jZSB0byB0aGUgcGFnZS5cbiAgICovXG4gIGNhY2hlUGFnZVJlZihwYWdlTnVtLCBwYWdlUmVmKSB7XG4gICAgaWYgKCFwYWdlUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZlN0ciA9XG4gICAgICBwYWdlUmVmLmdlbiA9PT0gMCA/IGAke3BhZ2VSZWYubnVtfVJgIDogYCR7cGFnZVJlZi5udW19UiR7cGFnZVJlZi5nZW59YDtcbiAgICB0aGlzLl9wYWdlc1JlZkNhY2hlW3JlZlN0cl0gPSBwYWdlTnVtO1xuICB9XG5cbiAgX2NhY2hlZFBhZ2VOdW1iZXIocGFnZVJlZikge1xuICAgIGNvbnN0IHJlZlN0ciA9XG4gICAgICBwYWdlUmVmLmdlbiA9PT0gMCA/IGAke3BhZ2VSZWYubnVtfVJgIDogYCR7cGFnZVJlZi5udW19UiR7cGFnZVJlZi5nZW59YDtcbiAgICByZXR1cm4gKHRoaXMuX3BhZ2VzUmVmQ2FjaGUgJiYgdGhpcy5fcGFnZXNSZWZDYWNoZVtyZWZTdHJdKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlTnVtYmVyXG4gICAqL1xuICBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZWaWV3ZXIuaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRXhwbGljaXREZXN0aW5hdGlvbihkZXN0KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkZXN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXN0TGVuZ3RoID0gZGVzdC5sZW5ndGg7XG4gIGlmIChkZXN0TGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwYWdlID0gZGVzdFswXTtcbiAgaWYgKFxuICAgICEoXG4gICAgICB0eXBlb2YgcGFnZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgTnVtYmVyLmlzSW50ZWdlcihwYWdlLm51bSkgJiZcbiAgICAgIE51bWJlci5pc0ludGVnZXIocGFnZS5nZW4pXG4gICAgKSAmJlxuICAgICEoTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID49IDApXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB6b29tID0gZGVzdFsxXTtcbiAgaWYgKCEodHlwZW9mIHpvb20gPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHpvb20ubmFtZSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGFsbG93TnVsbCA9IHRydWU7XG4gIHN3aXRjaCAoem9vbS5uYW1lKSB7XG4gICAgY2FzZSBcIlhZWlwiOlxuICAgICAgaWYgKGRlc3RMZW5ndGggIT09IDUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIkZpdFwiOlxuICAgIGNhc2UgXCJGaXRCXCI6XG4gICAgICByZXR1cm4gZGVzdExlbmd0aCA9PT0gMjtcbiAgICBjYXNlIFwiRml0SFwiOlxuICAgIGNhc2UgXCJGaXRCSFwiOlxuICAgIGNhc2UgXCJGaXRWXCI6XG4gICAgY2FzZSBcIkZpdEJWXCI6XG4gICAgICBpZiAoZGVzdExlbmd0aCAhPT0gMykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiRml0UlwiOlxuICAgICAgaWYgKGRlc3RMZW5ndGggIT09IDYpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYWxsb3dOdWxsID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAyOyBpIDwgZGVzdExlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFyYW0gPSBkZXN0W2ldO1xuICAgIGlmICghKHR5cGVvZiBwYXJhbSA9PT0gXCJudW1iZXJcIiB8fCAoYWxsb3dOdWxsICYmIHBhcmFtID09PSBudWxsKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQGltcGxlbWVudHMge0lQREZMaW5rU2VydmljZX1cbiAqL1xuY2xhc3MgU2ltcGxlTGlua1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV4dGVybmFsTGlua1RhcmdldCA9IG51bGw7XG4gICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSBudWxsO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5faWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBwYWdlc0NvdW50KCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcGFnZSgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICovXG4gIHNldCBwYWdlKHZhbHVlKSB7fVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHJvdGF0aW9uKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKi9cbiAgc2V0IHJvdGF0aW9uKHZhbHVlKSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGVzdCAtIFRoZSBQREYgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgKi9cbiAgbmF2aWdhdGVUbyhkZXN0KSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGVzdCAtIFRoZSBQREYgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaHlwZXJsaW5rIHRvIHRoZSBQREYgb2JqZWN0LlxuICAgKi9cbiAgZ2V0RGVzdGluYXRpb25IYXNoKGRlc3QpIHtcbiAgICByZXR1cm4gXCIjXCI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGhhc2ggLSBUaGUgUERGIHBhcmFtZXRlcnMvaGFzaC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGVybGluayB0byB0aGUgUERGIG9iamVjdC5cbiAgICovXG4gIGdldEFuY2hvclVybChoYXNoKSB7XG4gICAgcmV0dXJuIFwiI1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoXG4gICAqL1xuICBzZXRIYXNoKGhhc2gpIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25cbiAgICovXG4gIGV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlTnVtIC0gcGFnZSBudW1iZXIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYWdlUmVmIC0gcmVmZXJlbmNlIHRvIHRoZSBwYWdlLlxuICAgKi9cbiAgY2FjaGVQYWdlUmVmKHBhZ2VOdW0sIHBhZ2VSZWYpIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlTnVtYmVyXG4gICAqL1xuICBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5leHBvcnQgeyBQREZMaW5rU2VydmljZSwgU2ltcGxlTGlua1NlcnZpY2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyByZW5kZXJUZXh0TGF5ZXIgfSBmcm9tIFwicGRmanMtbGliXCI7XG5cbmNvbnN0IEVYUEFORF9ESVZTX1RJTUVPVVQgPSAzMDA7IC8vIG1zXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGV4dExheWVyQnVpbGRlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7SFRNTERpdkVsZW1lbnR9IHRleHRMYXllckRpdiAtIFRoZSB0ZXh0IGxheWVyIGNvbnRhaW5lci5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRCdXN9IGV2ZW50QnVzIC0gVGhlIGFwcGxpY2F0aW9uIGV2ZW50IGJ1cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwYWdlSW5kZXggLSBUaGUgcGFnZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydCAtIFRoZSB2aWV3cG9ydCBvZiB0aGUgdGV4dCBsYXllci5cbiAqIEBwcm9wZXJ0eSB7UERGRmluZENvbnRyb2xsZXJ9IGZpbmRDb250cm9sbGVyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuaGFuY2VUZXh0U2VsZWN0aW9uIC0gT3B0aW9uIHRvIHR1cm4gb24gaW1wcm92ZWRcbiAqICAgdGV4dCBzZWxlY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBUaGUgdGV4dCBsYXllciBidWlsZGVyIHByb3ZpZGVzIHRleHQgc2VsZWN0aW9uIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBQREYuXG4gKiBJdCBkb2VzIHRoaXMgYnkgY3JlYXRpbmcgb3ZlcmxheSBkaXZzIG92ZXIgdGhlIFBERidzIHRleHQuIFRoZXNlIGRpdnNcbiAqIGNvbnRhaW4gdGV4dCB0aGF0IG1hdGNoZXMgdGhlIFBERiB0ZXh0IHRoZXkgYXJlIG92ZXJsYXlpbmcuIFRoaXMgb2JqZWN0XG4gKiBhbHNvIHByb3ZpZGVzIGEgd2F5IHRvIGhpZ2hsaWdodCB0ZXh0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQgZm9yLlxuICovXG5jbGFzcyBUZXh0TGF5ZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHRleHRMYXllckRpdixcbiAgICBldmVudEJ1cyxcbiAgICBwYWdlSW5kZXgsXG4gICAgdmlld3BvcnQsXG4gICAgZmluZENvbnRyb2xsZXIgPSBudWxsLFxuICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uID0gZmFsc2UsXG4gIH0pIHtcbiAgICB0aGlzLnRleHRMYXllckRpdiA9IHRleHRMYXllckRpdjtcbiAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IG51bGw7XG4gICAgdGhpcy50ZXh0Q29udGVudEl0ZW1zU3RyID0gW107XG4gICAgdGhpcy50ZXh0Q29udGVudFN0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5yZW5kZXJpbmdEb25lID0gZmFsc2U7XG4gICAgdGhpcy5wYWdlSWR4ID0gcGFnZUluZGV4O1xuICAgIHRoaXMucGFnZU51bWJlciA9IHRoaXMucGFnZUlkeCArIDE7XG4gICAgdGhpcy5tYXRjaGVzID0gW107XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHRoaXMudGV4dERpdnMgPSBbXTtcbiAgICB0aGlzLmZpbmRDb250cm9sbGVyID0gZmluZENvbnRyb2xsZXI7XG4gICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrID0gbnVsbDtcbiAgICB0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uID0gZW5oYW5jZVRleHRTZWxlY3Rpb247XG5cbiAgICB0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMgPSBudWxsO1xuICAgIHRoaXMuX2JpbmRNb3VzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZmluaXNoUmVuZGVyaW5nKCkge1xuICAgIHRoaXMucmVuZGVyaW5nRG9uZSA9IHRydWU7XG5cbiAgICBpZiAoIXRoaXMuZW5oYW5jZVRleHRTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IGVuZE9mQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbmRPZkNvbnRlbnQuY2xhc3NOYW1lID0gXCJlbmRPZkNvbnRlbnRcIjtcbiAgICAgIHRoaXMudGV4dExheWVyRGl2LmFwcGVuZENoaWxkKGVuZE9mQ29udGVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInRleHRsYXllcnJlbmRlcmVkXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIHBhZ2VOdW1iZXI6IHRoaXMucGFnZU51bWJlcixcbiAgICAgIG51bVRleHREaXZzOiB0aGlzLnRleHREaXZzLmxlbmd0aCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSB0ZXh0IGxheWVyLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdIC0gV2FpdCBmb3IgYSBzcGVjaWZpZWQgYW1vdW50IG9mIG1pbGxpc2Vjb25kc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHJlbmRlcmluZy5cbiAgICovXG4gIHJlbmRlcih0aW1lb3V0ID0gMCkge1xuICAgIGlmICghKHRoaXMudGV4dENvbnRlbnQgfHwgdGhpcy50ZXh0Q29udGVudFN0cmVhbSkgfHwgdGhpcy5yZW5kZXJpbmdEb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FuY2VsKCk7XG5cbiAgICB0aGlzLnRleHREaXZzID0gW107XG4gICAgY29uc3QgdGV4dExheWVyRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2sgPSByZW5kZXJUZXh0TGF5ZXIoe1xuICAgICAgdGV4dENvbnRlbnQ6IHRoaXMudGV4dENvbnRlbnQsXG4gICAgICB0ZXh0Q29udGVudFN0cmVhbTogdGhpcy50ZXh0Q29udGVudFN0cmVhbSxcbiAgICAgIGNvbnRhaW5lcjogdGV4dExheWVyRnJhZyxcbiAgICAgIHZpZXdwb3J0OiB0aGlzLnZpZXdwb3J0LFxuICAgICAgdGV4dERpdnM6IHRoaXMudGV4dERpdnMsXG4gICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyOiB0aGlzLnRleHRDb250ZW50SXRlbXNTdHIsXG4gICAgICB0aW1lb3V0LFxuICAgICAgZW5oYW5jZVRleHRTZWxlY3Rpb246IHRoaXMuZW5oYW5jZVRleHRTZWxlY3Rpb24sXG4gICAgfSk7XG4gICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrLnByb21pc2UudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy50ZXh0TGF5ZXJEaXYuYXBwZW5kQ2hpbGQodGV4dExheWVyRnJhZyk7XG4gICAgICAgIHRoaXMuX2ZpbmlzaFJlbmRlcmluZygpO1xuICAgICAgICB0aGlzLl91cGRhdGVNYXRjaGVzKCk7XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBDYW5jZWxsZWQgb3IgZmFpbGVkIHRvIHJlbmRlciB0ZXh0IGxheWVyOyBza2lwcGluZyBlcnJvcnMuXG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmICghdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzKSB7XG4gICAgICB0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMgPSBldnQgPT4ge1xuICAgICAgICBpZiAoZXZ0LnBhZ2VJbmRleCA9PT0gdGhpcy5wYWdlSWR4IHx8IGV2dC5wYWdlSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlTWF0Y2hlcygpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5ldmVudEJ1cy5fb24oXG4gICAgICAgIFwidXBkYXRldGV4dGxheWVybWF0Y2hlc1wiLFxuICAgICAgICB0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXNcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCByZW5kZXJpbmcgb2YgdGhlIHRleHQgbGF5ZXIuXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMudGV4dExheWVyUmVuZGVyVGFzaykge1xuICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrLmNhbmNlbCgpO1xuICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcykge1xuICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKFxuICAgICAgICBcInVwZGF0ZXRleHRsYXllcm1hdGNoZXNcIixcbiAgICAgICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzXG4gICAgICApO1xuICAgICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzZXRUZXh0Q29udGVudFN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy50ZXh0Q29udGVudFN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtO1xuICB9XG5cbiAgc2V0VGV4dENvbnRlbnQodGV4dENvbnRlbnQpIHtcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcbiAgfVxuXG4gIF9jb252ZXJ0TWF0Y2hlcyhtYXRjaGVzLCBtYXRjaGVzTGVuZ3RoKSB7XG4gICAgLy8gRWFybHkgZXhpdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbnZlcnQuXG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHsgZmluZENvbnRyb2xsZXIsIHRleHRDb250ZW50SXRlbXNTdHIgfSA9IHRoaXM7XG5cbiAgICBsZXQgaSA9IDAsXG4gICAgICBpSW5kZXggPSAwO1xuICAgIGNvbnN0IGVuZCA9IHRleHRDb250ZW50SXRlbXNTdHIubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBxdWVyeUxlbiA9IGZpbmRDb250cm9sbGVyLnN0YXRlLnF1ZXJ5Lmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGZvciAobGV0IG0gPSAwLCBtbSA9IG1hdGNoZXMubGVuZ3RoOyBtIDwgbW07IG0rKykge1xuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgIGxldCBtYXRjaElkeCA9IG1hdGNoZXNbbV07XG5cbiAgICAgIC8vIExvb3Agb3ZlciB0aGUgZGl2SWR4cy5cbiAgICAgIHdoaWxlIChpICE9PSBlbmQgJiYgbWF0Y2hJZHggPj0gaUluZGV4ICsgdGV4dENvbnRlbnRJdGVtc1N0cltpXS5sZW5ndGgpIHtcbiAgICAgICAgaUluZGV4ICs9IHRleHRDb250ZW50SXRlbXNTdHJbaV0ubGVuZ3RoO1xuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChpID09PSB0ZXh0Q29udGVudEl0ZW1zU3RyLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyBtYXBwaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IHtcbiAgICAgICAgYmVnaW46IHtcbiAgICAgICAgICBkaXZJZHg6IGksXG4gICAgICAgICAgb2Zmc2V0OiBtYXRjaElkeCAtIGlJbmRleCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZW5kIHBvc2l0aW9uLlxuICAgICAgaWYgKG1hdGNoZXNMZW5ndGgpIHtcbiAgICAgICAgLy8gTXVsdGl0ZXJtIHNlYXJjaC5cbiAgICAgICAgbWF0Y2hJZHggKz0gbWF0Y2hlc0xlbmd0aFttXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFBocmFzZSBzZWFyY2guXG4gICAgICAgIG1hdGNoSWR4ICs9IHF1ZXJ5TGVuO1xuICAgICAgfVxuXG4gICAgICAvLyBTb21ld2hhdCB0aGUgc2FtZSBhcnJheSBhcyBhYm92ZSwgYnV0IHVzZSA+IGluc3RlYWQgb2YgPj0gdG8gZ2V0XG4gICAgICAvLyB0aGUgZW5kIHBvc2l0aW9uIHJpZ2h0LlxuICAgICAgd2hpbGUgKGkgIT09IGVuZCAmJiBtYXRjaElkeCA+IGlJbmRleCArIHRleHRDb250ZW50SXRlbXNTdHJbaV0ubGVuZ3RoKSB7XG4gICAgICAgIGlJbmRleCArPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aDtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBtYXRjaC5lbmQgPSB7XG4gICAgICAgIGRpdklkeDogaSxcbiAgICAgICAgb2Zmc2V0OiBtYXRjaElkeCAtIGlJbmRleCxcbiAgICAgIH07XG4gICAgICByZXN1bHQucHVzaChtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfcmVuZGVyTWF0Y2hlcyhtYXRjaGVzKSB7XG4gICAgLy8gRWFybHkgZXhpdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHJlbmRlci5cbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBmaW5kQ29udHJvbGxlciwgcGFnZUlkeCwgdGV4dENvbnRlbnRJdGVtc1N0ciwgdGV4dERpdnMgfSA9IHRoaXM7XG5cbiAgICBjb25zdCBpc1NlbGVjdGVkUGFnZSA9IHBhZ2VJZHggPT09IGZpbmRDb250cm9sbGVyLnNlbGVjdGVkLnBhZ2VJZHg7XG4gICAgY29uc3Qgc2VsZWN0ZWRNYXRjaElkeCA9IGZpbmRDb250cm9sbGVyLnNlbGVjdGVkLm1hdGNoSWR4O1xuICAgIGNvbnN0IGhpZ2hsaWdodEFsbCA9IGZpbmRDb250cm9sbGVyLnN0YXRlLmhpZ2hsaWdodEFsbDtcbiAgICBsZXQgcHJldkVuZCA9IG51bGw7XG4gICAgY29uc3QgaW5maW5pdHkgPSB7XG4gICAgICBkaXZJZHg6IC0xLFxuICAgICAgb2Zmc2V0OiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGJlZ2luVGV4dChiZWdpbiwgY2xhc3NOYW1lKSB7XG4gICAgICBjb25zdCBkaXZJZHggPSBiZWdpbi5kaXZJZHg7XG4gICAgICB0ZXh0RGl2c1tkaXZJZHhdLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgIGFwcGVuZFRleHRUb0RpdihkaXZJZHgsIDAsIGJlZ2luLm9mZnNldCwgY2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBlbmRUZXh0VG9EaXYoZGl2SWR4LCBmcm9tT2Zmc2V0LCB0b09mZnNldCwgY2xhc3NOYW1lKSB7XG4gICAgICBjb25zdCBkaXYgPSB0ZXh0RGl2c1tkaXZJZHhdO1xuICAgICAgY29uc3QgY29udGVudCA9IHRleHRDb250ZW50SXRlbXNTdHJbZGl2SWR4XS5zdWJzdHJpbmcoXG4gICAgICAgIGZyb21PZmZzZXQsXG4gICAgICAgIHRvT2Zmc2V0XG4gICAgICApO1xuICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpO1xuICAgICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4uY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICBzcGFuLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG5cbiAgICBsZXQgaTAgPSBzZWxlY3RlZE1hdGNoSWR4LFxuICAgICAgaTEgPSBpMCArIDE7XG4gICAgaWYgKGhpZ2hsaWdodEFsbCkge1xuICAgICAgaTAgPSAwO1xuICAgICAgaTEgPSBtYXRjaGVzLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkUGFnZSkge1xuICAgICAgLy8gTm90IGhpZ2hsaWdodGluZyBhbGwgYW5kIHRoaXMgaXNuJ3QgdGhlIHNlbGVjdGVkIHBhZ2UsIHNvIGRvIG5vdGhpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IGkwOyBpIDwgaTE7IGkrKykge1xuICAgICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldO1xuICAgICAgY29uc3QgYmVnaW4gPSBtYXRjaC5iZWdpbjtcbiAgICAgIGNvbnN0IGVuZCA9IG1hdGNoLmVuZDtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBpc1NlbGVjdGVkUGFnZSAmJiBpID09PSBzZWxlY3RlZE1hdGNoSWR4O1xuICAgICAgY29uc3QgaGlnaGxpZ2h0U3VmZml4ID0gaXNTZWxlY3RlZCA/IFwiIHNlbGVjdGVkXCIgOiBcIlwiO1xuXG4gICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgbWF0Y2ggaW50byB2aWV3LlxuICAgICAgICBmaW5kQ29udHJvbGxlci5zY3JvbGxNYXRjaEludG9WaWV3KHtcbiAgICAgICAgICBlbGVtZW50OiB0ZXh0RGl2c1tiZWdpbi5kaXZJZHhdLFxuICAgICAgICAgIHBhZ2VJbmRleDogcGFnZUlkeCxcbiAgICAgICAgICBtYXRjaEluZGV4OiBzZWxlY3RlZE1hdGNoSWR4LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTWF0Y2ggaW5zaWRlIG5ldyBkaXYuXG4gICAgICBpZiAoIXByZXZFbmQgfHwgYmVnaW4uZGl2SWR4ICE9PSBwcmV2RW5kLmRpdklkeCkge1xuICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBkaXYsIHRoZW4gYWRkIHRoZSB0ZXh0IGF0IHRoZSBlbmQuXG4gICAgICAgIGlmIChwcmV2RW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgYXBwZW5kVGV4dFRvRGl2KHByZXZFbmQuZGl2SWR4LCBwcmV2RW5kLm9mZnNldCwgaW5maW5pdHkub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbGVhciB0aGUgZGl2cyBhbmQgc2V0IHRoZSBjb250ZW50IHVudGlsIHRoZSBzdGFydGluZyBwb2ludC5cbiAgICAgICAgYmVnaW5UZXh0KGJlZ2luKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGVuZFRleHRUb0RpdihwcmV2RW5kLmRpdklkeCwgcHJldkVuZC5vZmZzZXQsIGJlZ2luLm9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChiZWdpbi5kaXZJZHggPT09IGVuZC5kaXZJZHgpIHtcbiAgICAgICAgYXBwZW5kVGV4dFRvRGl2KFxuICAgICAgICAgIGJlZ2luLmRpdklkeCxcbiAgICAgICAgICBiZWdpbi5vZmZzZXQsXG4gICAgICAgICAgZW5kLm9mZnNldCxcbiAgICAgICAgICBcImhpZ2hsaWdodFwiICsgaGlnaGxpZ2h0U3VmZml4XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmRUZXh0VG9EaXYoXG4gICAgICAgICAgYmVnaW4uZGl2SWR4LFxuICAgICAgICAgIGJlZ2luLm9mZnNldCxcbiAgICAgICAgICBpbmZpbml0eS5vZmZzZXQsXG4gICAgICAgICAgXCJoaWdobGlnaHQgYmVnaW5cIiArIGhpZ2hsaWdodFN1ZmZpeFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGxldCBuMCA9IGJlZ2luLmRpdklkeCArIDEsIG4xID0gZW5kLmRpdklkeDsgbjAgPCBuMTsgbjArKykge1xuICAgICAgICAgIHRleHREaXZzW24wXS5jbGFzc05hbWUgPSBcImhpZ2hsaWdodCBtaWRkbGVcIiArIGhpZ2hsaWdodFN1ZmZpeDtcbiAgICAgICAgfVxuICAgICAgICBiZWdpblRleHQoZW5kLCBcImhpZ2hsaWdodCBlbmRcIiArIGhpZ2hsaWdodFN1ZmZpeCk7XG4gICAgICB9XG4gICAgICBwcmV2RW5kID0gZW5kO1xuICAgIH1cblxuICAgIGlmIChwcmV2RW5kKSB7XG4gICAgICBhcHBlbmRUZXh0VG9EaXYocHJldkVuZC5kaXZJZHgsIHByZXZFbmQub2Zmc2V0LCBpbmZpbml0eS5vZmZzZXQpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVNYXRjaGVzKCkge1xuICAgIC8vIE9ubHkgc2hvdyBtYXRjaGVzIHdoZW4gYWxsIHJlbmRlcmluZyBpcyBkb25lLlxuICAgIGlmICghdGhpcy5yZW5kZXJpbmdEb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGZpbmRDb250cm9sbGVyLFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIHBhZ2VJZHgsXG4gICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyLFxuICAgICAgdGV4dERpdnMsXG4gICAgfSA9IHRoaXM7XG4gICAgbGV0IGNsZWFyZWRVbnRpbERpdklkeCA9IC0xO1xuXG4gICAgLy8gQ2xlYXIgYWxsIGN1cnJlbnQgbWF0Y2hlcy5cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBtYXRjaGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpXTtcbiAgICAgIGNvbnN0IGJlZ2luID0gTWF0aC5tYXgoY2xlYXJlZFVudGlsRGl2SWR4LCBtYXRjaC5iZWdpbi5kaXZJZHgpO1xuICAgICAgZm9yIChsZXQgbiA9IGJlZ2luLCBlbmQgPSBtYXRjaC5lbmQuZGl2SWR4OyBuIDw9IGVuZDsgbisrKSB7XG4gICAgICAgIGNvbnN0IGRpdiA9IHRleHREaXZzW25dO1xuICAgICAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudEl0ZW1zU3RyW25dO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIGNsZWFyZWRVbnRpbERpdklkeCA9IG1hdGNoLmVuZC5kaXZJZHggKyAxO1xuICAgIH1cblxuICAgIGlmICghZmluZENvbnRyb2xsZXIgfHwgIWZpbmRDb250cm9sbGVyLmhpZ2hsaWdodE1hdGNoZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ29udmVydCB0aGUgbWF0Y2hlcyBvbiB0aGUgYGZpbmRDb250cm9sbGVyYCBpbnRvIHRoZSBtYXRjaCBmb3JtYXRcbiAgICAvLyB1c2VkIGZvciB0aGUgdGV4dExheWVyLlxuICAgIGNvbnN0IHBhZ2VNYXRjaGVzID0gZmluZENvbnRyb2xsZXIucGFnZU1hdGNoZXNbcGFnZUlkeF0gfHwgbnVsbDtcbiAgICBjb25zdCBwYWdlTWF0Y2hlc0xlbmd0aCA9IGZpbmRDb250cm9sbGVyLnBhZ2VNYXRjaGVzTGVuZ3RoW3BhZ2VJZHhdIHx8IG51bGw7XG5cbiAgICB0aGlzLm1hdGNoZXMgPSB0aGlzLl9jb252ZXJ0TWF0Y2hlcyhwYWdlTWF0Y2hlcywgcGFnZU1hdGNoZXNMZW5ndGgpO1xuICAgIHRoaXMuX3JlbmRlck1hdGNoZXModGhpcy5tYXRjaGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXByb3ZlcyB0ZXh0IHNlbGVjdGlvbiBieSBhZGRpbmcgYW4gYWRkaXRpb25hbCBkaXYgd2hlcmUgdGhlIG1vdXNlIHdhc1xuICAgKiBjbGlja2VkLiBUaGlzIHJlZHVjZXMgZmxpY2tlcmluZyBvZiB0aGUgY29udGVudCBpZiB0aGUgbW91c2UgaXMgc2xvd2x5XG4gICAqIGRyYWdnZWQgdXAgb3IgZG93bi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9iaW5kTW91c2UoKSB7XG4gICAgY29uc3QgZGl2ID0gdGhpcy50ZXh0TGF5ZXJEaXY7XG4gICAgbGV0IGV4cGFuZERpdnNUaW1lciA9IG51bGw7XG5cbiAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBldnQgPT4ge1xuICAgICAgaWYgKHRoaXMuZW5oYW5jZVRleHRTZWxlY3Rpb24gJiYgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrKSB7XG4gICAgICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5leHBhbmRUZXh0RGl2cyh0cnVlKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMXCIpKSAmJlxuICAgICAgICAgIGV4cGFuZERpdnNUaW1lclxuICAgICAgICApIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZXhwYW5kRGl2c1RpbWVyKTtcbiAgICAgICAgICBleHBhbmREaXZzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kID0gZGl2LnF1ZXJ5U2VsZWN0b3IoXCIuZW5kT2ZDb250ZW50XCIpO1xuICAgICAgaWYgKCFlbmQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHtcbiAgICAgICAgLy8gT24gbm9uLUZpcmVmb3ggYnJvd3NlcnMsIHRoZSBzZWxlY3Rpb24gd2lsbCBmZWVsIGJldHRlciBpZiB0aGUgaGVpZ2h0XG4gICAgICAgIC8vIG9mIHRoZSBgZW5kT2ZDb250ZW50YCBkaXYgaXMgYWRqdXN0ZWQgdG8gc3RhcnQgYXQgbW91c2UgY2xpY2tcbiAgICAgICAgLy8gbG9jYXRpb24uIFRoaXMgYXZvaWRzIGZsaWNrZXJpbmcgd2hlbiB0aGUgc2VsZWN0aW9uIG1vdmVzIHVwLlxuICAgICAgICAvLyBIb3dldmVyIGl0IGRvZXMgbm90IHdvcmsgd2hlbiBzZWxlY3Rpb24gaXMgc3RhcnRlZCBvbiBlbXB0eSBzcGFjZS5cbiAgICAgICAgbGV0IGFkanVzdFRvcCA9IGV2dC50YXJnZXQgIT09IGRpdjtcbiAgICAgICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkge1xuICAgICAgICAgIGFkanVzdFRvcCA9XG4gICAgICAgICAgICBhZGp1c3RUb3AgJiZcbiAgICAgICAgICAgIHdpbmRvd1xuICAgICAgICAgICAgICAuZ2V0Q29tcHV0ZWRTdHlsZShlbmQpXG4gICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKFwiLW1vei11c2VyLXNlbGVjdFwiKSAhPT0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkanVzdFRvcCkge1xuICAgICAgICAgIGNvbnN0IGRpdkJvdW5kcyA9IGRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICBjb25zdCByID0gTWF0aC5tYXgoMCwgKGV2dC5wYWdlWSAtIGRpdkJvdW5kcy50b3ApIC8gZGl2Qm91bmRzLmhlaWdodCk7XG4gICAgICAgICAgZW5kLnN0eWxlLnRvcCA9IChyICogMTAwKS50b0ZpeGVkKDIpICsgXCIlXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVuZC5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgIH0pO1xuXG4gICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uICYmIHRoaXMudGV4dExheWVyUmVuZGVyVGFzaykge1xuICAgICAgICBpZiAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8ICFQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTFwiKSkge1xuICAgICAgICAgIGV4cGFuZERpdnNUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMudGV4dExheWVyUmVuZGVyVGFzaykge1xuICAgICAgICAgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2suZXhwYW5kVGV4dERpdnMoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhwYW5kRGl2c1RpbWVyID0gbnVsbDtcbiAgICAgICAgICB9LCBFWFBBTkRfRElWU19USU1FT1VUKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2suZXhwYW5kVGV4dERpdnMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kID0gZGl2LnF1ZXJ5U2VsZWN0b3IoXCIuZW5kT2ZDb250ZW50XCIpO1xuICAgICAgaWYgKCFlbmQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHtcbiAgICAgICAgZW5kLnN0eWxlLnRvcCA9IFwiXCI7XG4gICAgICB9XG4gICAgICBlbmQuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEBpbXBsZW1lbnRzIElQREZUZXh0TGF5ZXJGYWN0b3J5XG4gKi9cbmNsYXNzIERlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IHRleHRMYXllckRpdlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZUluZGV4XG4gICAqIEBwYXJhbSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuaGFuY2VUZXh0U2VsZWN0aW9uXG4gICAqIEBwYXJhbSB7RXZlbnRCdXN9IGV2ZW50QnVzXG4gICAqIEByZXR1cm5zIHtUZXh0TGF5ZXJCdWlsZGVyfVxuICAgKi9cbiAgY3JlYXRlVGV4dExheWVyQnVpbGRlcihcbiAgICB0ZXh0TGF5ZXJEaXYsXG4gICAgcGFnZUluZGV4LFxuICAgIHZpZXdwb3J0LFxuICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uID0gZmFsc2UsXG4gICAgZXZlbnRCdXNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0TGF5ZXJCdWlsZGVyKHtcbiAgICAgIHRleHRMYXllckRpdixcbiAgICAgIHBhZ2VJbmRleCxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgZW5oYW5jZVRleHRTZWxlY3Rpb24sXG4gICAgICBldmVudEJ1cyxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBUZXh0TGF5ZXJCdWlsZGVyLCBEZWZhdWx0VGV4dExheWVyRmFjdG9yeSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTMgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZU9iamVjdFVSTCwgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCB9IGZyb20gXCJwZGZqcy1saWJcIjtcbmltcG9ydCB7IHZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMgfSBmcm9tIFwiLi92aWV3ZXJfY29tcGF0aWJpbGl0eS5qc1wiO1xuXG5pZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmICFQREZKU0Rldi50ZXN0KFwiQ0hST01FIHx8IEdFTkVSSUNcIikpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdNb2R1bGUgXCJwZGZqcy13ZWIvZG93bmxvYWRfbWFuYWdlclwiIHNoYWxsIG5vdCBiZSB1c2VkICcgK1xuICAgICAgXCJvdXRzaWRlIENIUk9NRSBhbmQgR0VORVJJQyBidWlsZHMuXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpIHtcbiAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICBpZiAoIWEuY2xpY2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rvd25sb2FkTWFuYWdlcjogXCJhLmNsaWNrKClcIiBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG4gIGEuaHJlZiA9IGJsb2JVcmw7XG4gIGEudGFyZ2V0ID0gXCJfcGFyZW50XCI7XG4gIC8vIFVzZSBhLmRvd25sb2FkIGlmIGF2YWlsYWJsZS4gVGhpcyBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2QgdGhhdFxuICAvLyB0aGUgZmlsZSBpcyBkb3dubG9hZGVkIGluc3RlYWQgb2Ygb3BlbmVkIGJ5IGFub3RoZXIgUERGIHBsdWdpbi5cbiAgaWYgKFwiZG93bmxvYWRcIiBpbiBhKSB7XG4gICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICB9XG4gIC8vIDxhPiBtdXN0IGJlIGluIHRoZSBkb2N1bWVudCBmb3IgSUUgYW5kIHJlY2VudCBGaXJlZm94IHZlcnNpb25zLFxuICAvLyBvdGhlcndpc2UgLmNsaWNrKCkgaXMgaWdub3JlZC5cbiAgKGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChhKTtcbiAgYS5jbGljaygpO1xuICBhLnJlbW92ZSgpO1xufVxuXG5jbGFzcyBEb3dubG9hZE1hbmFnZXIge1xuICBkb3dubG9hZFVybCh1cmwsIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgXCJodHRwOi8vZXhhbXBsZS5jb21cIikpIHtcbiAgICAgIHJldHVybjsgLy8gcmVzdHJpY3RlZC9pbnZhbGlkIFVSTFxuICAgIH1cbiAgICBkb3dubG9hZCh1cmwgKyBcIiNwZGZqcy5hY3Rpb249ZG93bmxvYWRcIiwgZmlsZW5hbWUpO1xuICB9XG5cbiAgZG93bmxvYWREYXRhKGRhdGEsIGZpbGVuYW1lLCBjb250ZW50VHlwZSkge1xuICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xuICAgICAgLy8gSUUxMCBhbmQgYWJvdmVcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KSwgZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBibG9iVXJsID0gY3JlYXRlT2JqZWN0VVJMKFxuICAgICAgZGF0YSxcbiAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgdmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcy5kaXNhYmxlQ3JlYXRlT2JqZWN0VVJMXG4gICAgKTtcbiAgICBkb3dubG9hZChibG9iVXJsLCBmaWxlbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHNvdXJjZUV2ZW50VHlwZSB7c3RyaW5nfSBVc2VkIHRvIHNpZ25hbCB3aGF0IHRyaWdnZXJlZCB0aGUgZG93bmxvYWQuXG4gICAqICAgVGhlIHZlcnNpb24gb2YgUERGLmpzIGludGVncmF0ZWQgd2l0aCBGaXJlZm94IHVzZXMgdGhpcyB0byB0byBkZXRlcm1pbmVcbiAgICogICB3aGljaCBkaWFsb2cgdG8gc2hvdy4gXCJzYXZlXCIgdHJpZ2dlcnMgXCJzYXZlIGFzXCIgYW5kIFwiZG93bmxvYWRcIiB0cmlnZ2Vyc1xuICAgKiAgIHRoZSBcIm9wZW4gd2l0aFwiIGRpYWxvZy5cbiAgICovXG4gIGRvd25sb2FkKGJsb2IsIHVybCwgZmlsZW5hbWUsIHNvdXJjZUV2ZW50VHlwZSA9IFwiZG93bmxvYWRcIikge1xuICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xuICAgICAgLy8gSUUxMCAvIElFMTFcbiAgICAgIGlmICghbmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpKSB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRVcmwodXJsLCBmaWxlbmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUNyZWF0ZU9iamVjdFVSTCkge1xuICAgICAgLy8gVVJMLmNyZWF0ZU9iamVjdFVSTCBpcyBub3Qgc3VwcG9ydGVkXG4gICAgICB0aGlzLmRvd25sb2FkVXJsKHVybCwgZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGRvd25sb2FkKGJsb2JVcmwsIGZpbGVuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgeyBEb3dubG9hZE1hbmFnZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE4IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBjb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpIHtcbiAgY29uc3QgdXNlckFnZW50ID1cbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBcIlwiO1xuICBjb25zdCBwbGF0Zm9ybSA9XG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLnBsYXRmb3JtKSB8fCBcIlwiO1xuICBjb25zdCBtYXhUb3VjaFBvaW50cyA9XG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzKSB8fCAxO1xuXG4gIGNvbnN0IGlzQW5kcm9pZCA9IC9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCk7XG4gIGNvbnN0IGlzSUUgPSAvVHJpZGVudC8udGVzdCh1c2VyQWdlbnQpO1xuICBjb25zdCBpc0lPUyA9XG4gICAgL1xcYihpUGFkfGlQaG9uZXxpUG9kKSg/PTspLy50ZXN0KHVzZXJBZ2VudCkgfHxcbiAgICAocGxhdGZvcm0gPT09IFwiTWFjSW50ZWxcIiAmJiBtYXhUb3VjaFBvaW50cyA+IDEpO1xuICBjb25zdCBpc0lPU0Nocm9tZSA9IC9DcmlPUy8udGVzdCh1c2VyQWdlbnQpO1xuXG4gIC8vIENoZWNrcyBpZiBwb3NzaWJsZSB0byB1c2UgVVJMLmNyZWF0ZU9iamVjdFVSTCgpXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWUgb24gaU9TXG4gIChmdW5jdGlvbiBjaGVja09uQmxvYlN1cHBvcnQoKSB7XG4gICAgLy8gU29tZXRpbWVzIElFIGFuZCBDaHJvbWUgb24gaU9TIGxvc2luZyB0aGUgZGF0YSBjcmVhdGVkIHdpdGhcbiAgICAvLyBjcmVhdGVPYmplY3RVUkwoKSwgc2VlIGlzc3VlcyAjMzk3NyBhbmQgIzgwODEuXG4gICAgaWYgKGlzSUUgfHwgaXNJT1NDaHJvbWUpIHtcbiAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUNyZWF0ZU9iamVjdFVSTCA9IHRydWU7XG4gICAgfVxuICB9KSgpO1xuXG4gIC8vIExpbWl0IGNhbnZhcyBzaXplIHRvIDUgbWVnYS1waXhlbHMgb24gbW9iaWxlLlxuICAvLyBTdXBwb3J0OiBBbmRyb2lkLCBpT1NcbiAgKGZ1bmN0aW9uIGNoZWNrQ2FudmFzU2l6ZUxpbWl0YXRpb24oKSB7XG4gICAgaWYgKGlzSU9TIHx8IGlzQW5kcm9pZCkge1xuICAgICAgY29tcGF0aWJpbGl0eVBhcmFtcy5tYXhDYW52YXNQaXhlbHMgPSA1MjQyODgwO1xuICAgIH1cbiAgfSkoKTtcbn1cbmNvbnN0IHZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuZnJlZXplKGNvbXBhdGliaWxpdHlQYXJhbXMpO1xuXG5leHBvcnQgeyB2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNyBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IFwiLi4vZXh0ZXJuYWwvd2ViTDEwbi9sMTBuLmpzXCI7XG5cbmNvbnN0IHdlYkwxMG4gPSBkb2N1bWVudC53ZWJMMTBuO1xuXG5jbGFzcyBHZW5lcmljTDEwbiB7XG4gIGNvbnN0cnVjdG9yKGxhbmcpIHtcbiAgICB0aGlzLl9sYW5nID0gbGFuZztcbiAgICB0aGlzLl9yZWFkeSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdlYkwxMG4uc2V0TGFuZ3VhZ2UobGFuZywgKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHdlYkwxMG4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRMYW5ndWFnZSgpIHtcbiAgICBjb25zdCBsMTBuID0gYXdhaXQgdGhpcy5fcmVhZHk7XG4gICAgcmV0dXJuIGwxMG4uZ2V0TGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldERpcmVjdGlvbigpIHtcbiAgICBjb25zdCBsMTBuID0gYXdhaXQgdGhpcy5fcmVhZHk7XG4gICAgcmV0dXJuIGwxMG4uZ2V0RGlyZWN0aW9uKCk7XG4gIH1cblxuICBhc3luYyBnZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKSB7XG4gICAgY29uc3QgbDEwbiA9IGF3YWl0IHRoaXMuX3JlYWR5O1xuICAgIHJldHVybiBsMTBuLmdldChwcm9wZXJ0eSwgYXJncywgZmFsbGJhY2spO1xuICB9XG5cbiAgYXN5bmMgdHJhbnNsYXRlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBsMTBuID0gYXdhaXQgdGhpcy5fcmVhZHk7XG4gICAgcmV0dXJuIGwxMG4udHJhbnNsYXRlKGVsZW1lbnQpO1xuICB9XG59XG5cbmV4cG9ydCB7IEdlbmVyaWNMMTBuIH07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIEZhYmllbiBDYXplbmF2ZSwgTW96aWxsYS5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbiAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuICogSU4gVEhFIFNPRlRXQVJFLlxuICovXG4vKlxuICBBZGRpdGlvbmFsIG1vZGlmaWNhdGlvbnMgZm9yIFBERi5qcyBwcm9qZWN0OlxuICAgIC0gRGlzYWJsZXMgbGFuZ3VhZ2UgaW5pdGlhbGl6YXRpb24gb24gcGFnZSBsb2FkaW5nLlxuICAgIC0gRGlzYWJsZXMgZG9jdW1lbnQgdHJhbnNsYXRpb24gb24gcGFnZSBsb2FkaW5nLlxuICAgIC0gUmVtb3ZlcyBjb25zb2xlV2FybiBhbmQgY29uc29sZUxvZyBhbmQgdXNlIGNvbnNvbGUubG9nL3dhcm4gZGlyZWN0bHkuXG4gICAgLSBSZW1vdmVzIHdpbmRvdy5fIGFzc2lnbm1lbnQuXG4gICAgLSBSZW1vdmUgY29tcGF0aWJpbGl0eSBjb2RlIGZvciBPbGRJRS5cbiAgICAtIFJlcGxhY2VzIGBTdHJpbmcucHJvdG90eXBlLnN1YnN0cigpYCB3aXRoIGBTdHJpbmcucHJvdG90eXBlLnN1YnN0cmluZygpYC5cbiAgICAtIFJlbW92ZXMgYGZpcmVMMTBuUmVhZHlFdmVudGAgc2luY2UgdGhlIFwibG9jYWxpemVkXCIgZXZlbnQgaXQgZGlzcGF0Y2hlc1xuICAgICAgaXMgdW51c2VkIGFuZCBtYXkgY2xhc2ggd2l0aCBhbiBpZGVudGljYWxseSBuYW1lZCBldmVudCBpbiB0aGUgdmlld2VyLlxuKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgZGV2ZWw6IHRydWUsIGVzNTogdHJ1ZSwgZ2xvYmFsc3RyaWN0OiB0cnVlICovXG4ndXNlIHN0cmljdCc7XG5cbmRvY3VtZW50LndlYkwxMG4gPSAoZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gIHZhciBnTDEwbkRhdGEgPSB7fTtcbiAgdmFyIGdUZXh0RGF0YSA9ICcnO1xuICB2YXIgZ1RleHRQcm9wID0gJ3RleHRDb250ZW50JztcbiAgdmFyIGdMYW5ndWFnZSA9ICcnO1xuICB2YXIgZ01hY3JvcyA9IHt9O1xuICB2YXIgZ1JlYWR5U3RhdGUgPSAnbG9hZGluZyc7XG5cblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBsb2FkaW5nIGwxMG4gcmVzb3VyY2VzIHNpZ25pZmljYW50bHkgbWluaW1pemVzIGZsaWNrZXJpbmdcbiAgICogZnJvbSBkaXNwbGF5aW5nIHRoZSBhcHAgd2l0aCBub24tbG9jYWxpemVkIHN0cmluZ3MgYW5kIHRoZW4gdXBkYXRpbmcgdGhlXG4gICAqIHN0cmluZ3MuIEFsdGhvdWdoIHRoaXMgd2lsbCBibG9jayBhbGwgc2NyaXB0IGV4ZWN1dGlvbiBvbiB0aGlzIHBhZ2UsIHdlXG4gICAqIGV4cGVjdCB0aGF0IHRoZSBsMTBuIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlIGxvY2FsbHkgb24gZmxhc2gtc3RvcmFnZS5cbiAgICpcbiAgICogQXMgc3luY2hyb25vdXMgWEhSIGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIGFzIGEgYmFkIGlkZWEsIHdlJ3JlIHN0aWxsXG4gICAqIGxvYWRpbmcgbDEwbiByZXNvdXJjZXMgYXN5bmNocm9ub3VzbHkgLS0gYnV0IHdlIGtlZXAgdGhpcyBpbiBhIHNldHRpbmcsXG4gICAqIGp1c3QgaW4gY2FzZS4uLiBhbmQgYXBwbGljYXRpb25zIHVzaW5nIHRoaXMgbGlicmFyeSBzaG91bGQgaGlkZSB0aGVpclxuICAgKiBjb250ZW50IHVudGlsIHRoZSBgbG9jYWxpemVkJyBldmVudCBoYXBwZW5zLlxuICAgKi9cblxuICB2YXIgZ0FzeW5jUmVzb3VyY2VMb2FkaW5nID0gdHJ1ZTsgLy8gcmVhZC1vbmx5XG5cblxuICAvKipcbiAgICogRE9NIGhlbHBlcnMgZm9yIHRoZSBzby1jYWxsZWQgXCJIVE1MIEFQSVwiLlxuICAgKlxuICAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHdyaXR0ZW4gZm9yIG1vZGVybiBicm93c2Vycy4gRm9yIG9sZCB2ZXJzaW9ucyBvZiBJRSxcbiAgICogdGhleSdyZSBvdmVycmlkZGVuIGluIHRoZSAnc3RhcnR1cCcgc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS5cbiAgICovXG5cbiAgZnVuY3Rpb24gZ2V0TDEwblJlc291cmNlTGlua3MoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmtbdHlwZT1cImFwcGxpY2F0aW9uL2wxMG5cIl0nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEwxMG5EaWN0aW9uYXJ5KCkge1xuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbdHlwZT1cImFwcGxpY2F0aW9uL2wxMG5cIl0nKTtcbiAgICAvLyBUT0RPOiBzdXBwb3J0IG11bHRpcGxlIGFuZCBleHRlcm5hbCBKU09OIGRpY3Rpb25hcmllc1xuICAgIHJldHVybiBzY3JpcHQgPyBKU09OLnBhcnNlKHNjcmlwdC5pbm5lckhUTUwpIDogbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRyYW5zbGF0YWJsZUNoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudCA/IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKltkYXRhLWwxMG4taWRdJykgOiBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEwxMG5BdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpXG4gICAgICByZXR1cm4ge307XG5cbiAgICB2YXIgbDEwbklkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbDEwbi1pZCcpO1xuICAgIHZhciBsMTBuQXJncyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWwxMG4tYXJncycpO1xuICAgIHZhciBhcmdzID0ge307XG4gICAgaWYgKGwxMG5BcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcmdzID0gSlNPTi5wYXJzZShsMTBuQXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignY291bGQgbm90IHBhcnNlIGFyZ3VtZW50cyBmb3IgIycgKyBsMTBuSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBpZDogbDEwbklkLCBhcmdzOiBhcmdzIH07XG4gIH1cblxuICBmdW5jdGlvbiB4aHJMb2FkVGV4dCh1cmwsIG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7XG4gICAgb25TdWNjZXNzID0gb25TdWNjZXNzIHx8IGZ1bmN0aW9uIF9vblN1Y2Nlc3MoZGF0YSkge307XG4gICAgb25GYWlsdXJlID0gb25GYWlsdXJlIHx8IGZ1bmN0aW9uIF9vbkZhaWx1cmUoKSB7fTtcblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbignR0VUJywgdXJsLCBnQXN5bmNSZXNvdXJjZUxvYWRpbmcpO1xuICAgIGlmICh4aHIub3ZlcnJpZGVNaW1lVHlwZSkge1xuICAgICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnKTtcbiAgICB9XG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09IDQpIHtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8IHhoci5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICBvblN1Y2Nlc3MoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25GYWlsdXJlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHhoci5vbmVycm9yID0gb25GYWlsdXJlO1xuICAgIHhoci5vbnRpbWVvdXQgPSBvbkZhaWx1cmU7XG5cbiAgICAvLyBpbiBGaXJlZm94IE9TIHdpdGggdGhlIGFwcDovLyBwcm90b2NvbCwgdHJ5aW5nIHRvIFhIUiBhIG5vbi1leGlzdGluZ1xuICAgIC8vIFVSTCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBoZXJlIC0tIGhlbmNlIHRoaXMgdWdseSB0cnkuLi5jYXRjaC5cbiAgICB0cnkge1xuICAgICAgeGhyLnNlbmQobnVsbCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb25GYWlsdXJlKCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogbDEwbiByZXNvdXJjZSBwYXJzZXI6XG4gICAqICAtIHJlYWRzIChhc3luYyBYSFIpIHRoZSBsMTBuIHJlc291cmNlIG1hdGNoaW5nIGBsYW5nJztcbiAgICogIC0gaW1wb3J0cyBsaW5rZWQgcmVzb3VyY2VzIChzeW5jaHJvbm91c2x5KSB3aGVuIHNwZWNpZmllZDtcbiAgICogIC0gcGFyc2VzIHRoZSB0ZXh0IGRhdGEgKGZpbGxzIGBnTDEwbkRhdGEnIGFuZCBgZ1RleHREYXRhJyk7XG4gICAqICAtIHRyaWdnZXJzIHN1Y2Nlc3MvZmFpbHVyZSBjYWxsYmFja3Mgd2hlbiBkb25lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZlxuICAgKiAgICBVUkwgb2YgdGhlIGwxMG4gcmVzb3VyY2UgdG8gcGFyc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nXG4gICAqICAgIGxvY2FsZSAobGFuZ3VhZ2UpIHRvIHBhcnNlLiBNdXN0IGJlIGEgbG93ZXJjYXNlIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2Vzc0NhbGxiYWNrXG4gICAqICAgIHRyaWdnZXJlZCB3aGVuIHRoZSBsMTBuIHJlc291cmNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwYXJzZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZhaWx1cmVDYWxsYmFja1xuICAgKiAgICB0cmlnZ2VyZWQgd2hlbiB0aGUgYW4gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiAgICB1c2VzIHRoZSBmb2xsb3dpbmcgZ2xvYmFsIHZhcmlhYmxlczogZ0wxMG5EYXRhLCBnVGV4dERhdGEsIGdUZXh0UHJvcC5cbiAgICovXG5cbiAgZnVuY3Rpb24gcGFyc2VSZXNvdXJjZShocmVmLCBsYW5nLCBzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgIHZhciBiYXNlVVJMID0gaHJlZi5yZXBsYWNlKC9bXlxcL10qJC8sICcnKSB8fCAnLi8nO1xuXG4gICAgLy8gaGFuZGxlIGVzY2FwZWQgY2hhcmFjdGVycyAoYmFja3NsYXNoZXMpIGluIGEgc3RyaW5nXG4gICAgZnVuY3Rpb24gZXZhbFN0cmluZyh0ZXh0KSB7XG4gICAgICBpZiAodGV4dC5sYXN0SW5kZXhPZignXFxcXCcpIDwgMClcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcbi9nLCAnXFxuJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxyL2csICdcXHInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXHQvZywgJ1xcdCcpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcYi9nLCAnXFxiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxmL2csICdcXGYnKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXHsvZywgJ3snKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXH0vZywgJ30nKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIik7XG4gICAgfVxuXG4gICAgLy8gcGFyc2UgKi5wcm9wZXJ0aWVzIHRleHQgZGF0YSBpbnRvIGFuIGwxMG4gZGljdGlvbmFyeVxuICAgIC8vIElmIGdBc3luY1Jlc291cmNlTG9hZGluZyBpcyBmYWxzZSwgdGhlbiB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWRcbiAgICAvLyBzeW5jaHJvbm91c2x5LiBPdGhlcndpc2UgaXQgaXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5LlxuICAgIGZ1bmN0aW9uIHBhcnNlUHJvcGVydGllcyh0ZXh0LCBwYXJzZWRQcm9wZXJ0aWVzQ2FsbGJhY2spIHtcbiAgICAgIHZhciBkaWN0aW9uYXJ5ID0ge307XG5cbiAgICAgIC8vIHRva2VuIGV4cHJlc3Npb25zXG4gICAgICB2YXIgcmVCbGFuayA9IC9eXFxzKnxcXHMqJC87XG4gICAgICB2YXIgcmVDb21tZW50ID0gL15cXHMqI3xeXFxzKiQvO1xuICAgICAgdmFyIHJlU2VjdGlvbiA9IC9eXFxzKlxcWyguKilcXF1cXHMqJC87XG4gICAgICB2YXIgcmVJbXBvcnQgPSAvXlxccypAaW1wb3J0XFxzK3VybFxcKCguKilcXClcXHMqJC9pO1xuICAgICAgdmFyIHJlU3BsaXQgPSAvXihbXj1cXHNdKilcXHMqPVxccyooLispJC87IC8vIFRPRE86IGVzY2FwZSBFT0xzIHdpdGggJ1xcJ1xuXG4gICAgICAvLyBwYXJzZSB0aGUgKi5wcm9wZXJ0aWVzIGZpbGUgaW50byBhbiBhc3NvY2lhdGl2ZSBhcnJheVxuICAgICAgZnVuY3Rpb24gcGFyc2VSYXdMaW5lcyhyYXdUZXh0LCBleHRlbmRlZFN5bnRheCwgcGFyc2VkUmF3TGluZXNDYWxsYmFjaykge1xuICAgICAgICB2YXIgZW50cmllcyA9IHJhd1RleHQucmVwbGFjZShyZUJsYW5rLCAnJykuc3BsaXQoL1tcXHJcXG5dKy8pO1xuICAgICAgICB2YXIgY3VycmVudExhbmcgPSAnKic7XG4gICAgICAgIHZhciBnZW5lcmljTGFuZyA9IGxhbmcuc3BsaXQoJy0nLCAxKVswXTtcbiAgICAgICAgdmFyIHNraXBMYW5nID0gZmFsc2U7XG4gICAgICAgIHZhciBtYXRjaCA9ICcnO1xuXG4gICAgICAgIGZ1bmN0aW9uIG5leHRFbnRyeSgpIHtcbiAgICAgICAgICAvLyBVc2UgaW5maW5pdGUgbG9vcCBpbnN0ZWFkIG9mIHJlY3Vyc2lvbiB0byBhdm9pZCByZWFjaGluZyB0aGVcbiAgICAgICAgICAvLyBtYXhpbXVtIHJlY3Vyc2lvbiBsaW1pdCBmb3IgY29udGVudCB3aXRoIG1hbnkgbGluZXMuXG4gICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmICghZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcGFyc2VkUmF3TGluZXNDYWxsYmFjaygpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbGluZSA9IGVudHJpZXMuc2hpZnQoKTtcblxuICAgICAgICAgICAgLy8gY29tbWVudCBvciBibGFuayBsaW5lP1xuICAgICAgICAgICAgaWYgKHJlQ29tbWVudC50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gdGhlIGV4dGVuZGVkIHN5bnRheCBzdXBwb3J0cyBbbGFuZ10gc2VjdGlvbnMgYW5kIEBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgIGlmIChleHRlbmRlZFN5bnRheCkge1xuICAgICAgICAgICAgICBtYXRjaCA9IHJlU2VjdGlvbi5leGVjKGxpbmUpO1xuICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsgLy8gc2VjdGlvbiBzdGFydD9cbiAgICAgICAgICAgICAgICAvLyBSRkMgNDY0Niwgc2VjdGlvbiA0LjQsIFwiQWxsIGNvbXBhcmlzb25zIE1VU1QgYmUgcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgLy8gaW4gYSBjYXNlLWluc2Vuc2l0aXZlIG1hbm5lci5cIlxuXG4gICAgICAgICAgICAgICAgY3VycmVudExhbmcgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHNraXBMYW5nID0gKGN1cnJlbnRMYW5nICE9PSAnKicpICYmXG4gICAgICAgICAgICAgICAgICAgIChjdXJyZW50TGFuZyAhPT0gbGFuZykgJiYgKGN1cnJlbnRMYW5nICE9PSBnZW5lcmljTGFuZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcExhbmcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXRjaCA9IHJlSW1wb3J0LmV4ZWMobGluZSk7XG4gICAgICAgICAgICAgIGlmIChtYXRjaCkgeyAvLyBAaW1wb3J0IHJ1bGU/XG4gICAgICAgICAgICAgICAgbG9hZEltcG9ydChiYXNlVVJMICsgbWF0Y2hbMV0sIG5leHRFbnRyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGtleS12YWx1ZSBwYWlyXG4gICAgICAgICAgICB2YXIgdG1wID0gbGluZS5tYXRjaChyZVNwbGl0KTtcbiAgICAgICAgICAgIGlmICh0bXAgJiYgdG1wLmxlbmd0aCA9PSAzKSB7XG4gICAgICAgICAgICAgIGRpY3Rpb25hcnlbdG1wWzFdXSA9IGV2YWxTdHJpbmcodG1wWzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV4dEVudHJ5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGltcG9ydCBhbm90aGVyICoucHJvcGVydGllcyBmaWxlXG4gICAgICBmdW5jdGlvbiBsb2FkSW1wb3J0KHVybCwgY2FsbGJhY2spIHtcbiAgICAgICAgeGhyTG9hZFRleHQodXJsLCBmdW5jdGlvbihjb250ZW50KSB7XG4gICAgICAgICAgcGFyc2VSYXdMaW5lcyhjb250ZW50LCBmYWxzZSwgY2FsbGJhY2spOyAvLyBkb24ndCBhbGxvdyByZWN1cnNpdmUgaW1wb3J0c1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKHVybCArICcgbm90IGZvdW5kLicpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBmaWxsIHRoZSBkaWN0aW9uYXJ5XG4gICAgICBwYXJzZVJhd0xpbmVzKHRleHQsIHRydWUsIGZ1bmN0aW9uKCkge1xuICAgICAgICBwYXJzZWRQcm9wZXJ0aWVzQ2FsbGJhY2soZGljdGlvbmFyeSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBsb2FkIGFuZCBwYXJzZSBsMTBuIGRhdGEgKHdhcm5pbmc6IGdsb2JhbCB2YXJpYWJsZXMgYXJlIHVzZWQgaGVyZSlcbiAgICB4aHJMb2FkVGV4dChocmVmLCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgZ1RleHREYXRhICs9IHJlc3BvbnNlOyAvLyBtb3N0bHkgZm9yIGRlYnVnXG5cbiAgICAgIC8vIHBhcnNlICoucHJvcGVydGllcyB0ZXh0IGRhdGEgaW50byBhbiBsMTBuIGRpY3Rpb25hcnlcbiAgICAgIHBhcnNlUHJvcGVydGllcyhyZXNwb25zZSwgZnVuY3Rpb24oZGF0YSkge1xuXG4gICAgICAgIC8vIGZpbmQgYXR0cmlidXRlIGRlc2NyaXB0aW9ucywgaWYgYW55XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgdmFyIGlkLCBwcm9wLCBpbmRleCA9IGtleS5sYXN0SW5kZXhPZignLicpO1xuICAgICAgICAgIGlmIChpbmRleCA+IDApIHsgLy8gYW4gYXR0cmlidXRlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgICAgICAgICAgaWQgPSBrZXkuc3Vic3RyaW5nKDAsIGluZGV4KTtcbiAgICAgICAgICAgIHByb3AgPSBrZXkuc3Vic3RyaW5nKGluZGV4ICsgMSk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gbm8gYXR0cmlidXRlOiBhc3N1bWluZyB0ZXh0IGNvbnRlbnQgYnkgZGVmYXVsdFxuICAgICAgICAgICAgaWQgPSBrZXk7XG4gICAgICAgICAgICBwcm9wID0gZ1RleHRQcm9wO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWdMMTBuRGF0YVtpZF0pIHtcbiAgICAgICAgICAgIGdMMTBuRGF0YVtpZF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ0wxMG5EYXRhW2lkXVtwcm9wXSA9IGRhdGFba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyaWdnZXIgY2FsbGJhY2tcbiAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykge1xuICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBmYWlsdXJlQ2FsbGJhY2spO1xuICB9XG5cbiAgLy8gbG9hZCBhbmQgcGFyc2UgYWxsIHJlc291cmNlcyBmb3IgdGhlIHNwZWNpZmllZCBsb2NhbGVcbiAgZnVuY3Rpb24gbG9hZExvY2FsZShsYW5nLCBjYWxsYmFjaykge1xuICAgIC8vIFJGQyA0NjQ2LCBzZWN0aW9uIDIuMSBzdGF0ZXMgdGhhdCBsYW5ndWFnZSB0YWdzIGhhdmUgdG8gYmUgdHJlYXRlZCBhc1xuICAgIC8vIGNhc2UtaW5zZW5zaXRpdmUuIENvbnZlcnQgdG8gbG93ZXJjYXNlIGZvciBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zLlxuICAgIGlmIChsYW5nKSB7XG4gICAgICBsYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gX2NhbGxiYWNrKCkge307XG5cbiAgICBjbGVhcigpO1xuICAgIGdMYW5ndWFnZSA9IGxhbmc7XG5cbiAgICAvLyBjaGVjayBhbGwgPGxpbmsgdHlwZT1cImFwcGxpY2F0aW9uL2wxMG5cIiBocmVmPVwiLi4uXCIgLz4gbm9kZXNcbiAgICAvLyBhbmQgbG9hZCB0aGUgcmVzb3VyY2UgZmlsZXNcbiAgICB2YXIgbGFuZ0xpbmtzID0gZ2V0TDEwblJlc291cmNlTGlua3MoKTtcbiAgICB2YXIgbGFuZ0NvdW50ID0gbGFuZ0xpbmtzLmxlbmd0aDtcbiAgICBpZiAobGFuZ0NvdW50ID09PSAwKSB7XG4gICAgICAvLyB3ZSBtaWdodCBoYXZlIGEgcHJlLWNvbXBpbGVkIGRpY3Rpb25hcnkgaW5zdGVhZFxuICAgICAgdmFyIGRpY3QgPSBnZXRMMTBuRGljdGlvbmFyeSgpO1xuICAgICAgaWYgKGRpY3QgJiYgZGljdC5sb2NhbGVzICYmIGRpY3QuZGVmYXVsdF9sb2NhbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3VzaW5nIHRoZSBlbWJlZGRlZCBKU09OIGRpcmVjdG9yeSwgZWFybHkgd2F5IG91dCcpO1xuICAgICAgICBnTDEwbkRhdGEgPSBkaWN0LmxvY2FsZXNbbGFuZ107XG4gICAgICAgIGlmICghZ0wxMG5EYXRhKSB7XG4gICAgICAgICAgdmFyIGRlZmF1bHRMb2NhbGUgPSBkaWN0LmRlZmF1bHRfbG9jYWxlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgZm9yICh2YXIgYW55Q2FzZUxhbmcgaW4gZGljdC5sb2NhbGVzKSB7XG4gICAgICAgICAgICBhbnlDYXNlTGFuZyA9IGFueUNhc2VMYW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYW55Q2FzZUxhbmcgPT09IGxhbmcpIHtcbiAgICAgICAgICAgICAgZ0wxMG5EYXRhID0gZGljdC5sb2NhbGVzW2xhbmddO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW55Q2FzZUxhbmcgPT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgICAgICAgZ0wxMG5EYXRhID0gZGljdC5sb2NhbGVzW2RlZmF1bHRMb2NhbGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ25vIHJlc291cmNlIHRvIGxvYWQsIGVhcmx5IHdheSBvdXQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGVhcmx5IHdheSBvdXRcbiAgICAgIGdSZWFkeVN0YXRlID0gJ2NvbXBsZXRlJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGFydCB0aGUgY2FsbGJhY2sgd2hlbiBhbGwgcmVzb3VyY2VzIGFyZSBsb2FkZWRcbiAgICB2YXIgb25SZXNvdXJjZUxvYWRlZCA9IG51bGw7XG4gICAgdmFyIGdSZXNvdXJjZUNvdW50ID0gMDtcbiAgICBvblJlc291cmNlTG9hZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICBnUmVzb3VyY2VDb3VudCsrO1xuICAgICAgaWYgKGdSZXNvdXJjZUNvdW50ID49IGxhbmdDb3VudCkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBnUmVhZHlTdGF0ZSA9ICdjb21wbGV0ZSc7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGxvYWQgYWxsIHJlc291cmNlIGZpbGVzXG4gICAgZnVuY3Rpb24gTDEwblJlc291cmNlTGluayhsaW5rKSB7XG4gICAgICB2YXIgaHJlZiA9IGxpbmsuaHJlZjtcbiAgICAgIC8vIE5vdGU6IElmIHxnQXN5bmNSZXNvdXJjZUxvYWRpbmd8IGlzIGZhbHNlLCB0aGVuIHRoZSBmb2xsb3dpbmcgY2FsbGJhY2tzXG4gICAgICAvLyBhcmUgc3luY2hyb25vdXNseSBjYWxsZWQuXG4gICAgICB0aGlzLmxvYWQgPSBmdW5jdGlvbihsYW5nLCBjYWxsYmFjaykge1xuICAgICAgICBwYXJzZVJlc291cmNlKGhyZWYsIGxhbmcsIGNhbGxiYWNrLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oaHJlZiArICcgbm90IGZvdW5kLicpO1xuICAgICAgICAgIC8vIGxhbmcgbm90IGZvdW5kLCB1c2VkIGRlZmF1bHQgcmVzb3VyY2UgaW5zdGVhZFxuICAgICAgICAgIGNvbnNvbGUud2FybignXCInICsgbGFuZyArICdcIiByZXNvdXJjZSBub3QgZm91bmQnKTtcbiAgICAgICAgICBnTGFuZ3VhZ2UgPSAnJztcbiAgICAgICAgICAvLyBSZXNvdXJjZSBub3QgbG9hZGVkLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBjYWxsIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYW5nQ291bnQ7IGkrKykge1xuICAgICAgdmFyIHJlc291cmNlID0gbmV3IEwxMG5SZXNvdXJjZUxpbmsobGFuZ0xpbmtzW2ldKTtcbiAgICAgIHJlc291cmNlLmxvYWQobGFuZywgb25SZXNvdXJjZUxvYWRlZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gY2xlYXIgYWxsIGwxMG4gZGF0YVxuICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICBnTDEwbkRhdGEgPSB7fTtcbiAgICBnVGV4dERhdGEgPSAnJztcbiAgICBnTGFuZ3VhZ2UgPSAnJztcbiAgICAvLyBUT0RPOiBjbGVhciBhbGwgbm9uIHByZWRlZmluZWQgbWFjcm9zLlxuICAgIC8vIFRoZXJlJ3Mgbm8gc3VjaCBtYWNybyAveWV0LyBidXQgd2UncmUgcGxhbm5pbmcgdG8gaGF2ZSBzb21lLi4uXG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgcnVsZXMgZm9yIHBsdXJhbCBmb3JtcyAoc2hhcmVkIHdpdGggSmV0UGFjayksIHNlZTpcbiAgICogaHR0cDovL3VuaWNvZGUub3JnL3JlcG9zL2NsZHItdG1wL3RydW5rL2RpZmYvc3VwcGxlbWVudGFsL2xhbmd1YWdlX3BsdXJhbF9ydWxlcy5odG1sXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2FkZG9uLXNkay9ibG9iL21hc3Rlci9weXRob24tbGliL3BsdXJhbC1ydWxlcy1nZW5lcmF0b3IucFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ1xuICAgKiAgICBsb2NhbGUgKGxhbmd1YWdlKSB1c2VkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAgICogICAgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZ2l2ZXMgdGhlIHBsdXJhbCBmb3JtIG5hbWUgZm9yIGEgZ2l2ZW4gaW50ZWdlcjpcbiAgICogICAgICAgdmFyIGZ1biA9IGdldFBsdXJhbFJ1bGVzKCdlbicpO1xuICAgKiAgICAgICBmdW4oMSkgICAgLT4gJ29uZSdcbiAgICogICAgICAgZnVuKDApICAgIC0+ICdvdGhlcidcbiAgICogICAgICAgZnVuKDEwMDApIC0+ICdvdGhlcicuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGdldFBsdXJhbFJ1bGVzKGxhbmcpIHtcbiAgICB2YXIgbG9jYWxlczJydWxlcyA9IHtcbiAgICAgICdhZic6IDMsXG4gICAgICAnYWsnOiA0LFxuICAgICAgJ2FtJzogNCxcbiAgICAgICdhcic6IDEsXG4gICAgICAnYXNhJzogMyxcbiAgICAgICdheic6IDAsXG4gICAgICAnYmUnOiAxMSxcbiAgICAgICdiZW0nOiAzLFxuICAgICAgJ2Jleic6IDMsXG4gICAgICAnYmcnOiAzLFxuICAgICAgJ2JoJzogNCxcbiAgICAgICdibSc6IDAsXG4gICAgICAnYm4nOiAzLFxuICAgICAgJ2JvJzogMCxcbiAgICAgICdicic6IDIwLFxuICAgICAgJ2JyeCc6IDMsXG4gICAgICAnYnMnOiAxMSxcbiAgICAgICdjYSc6IDMsXG4gICAgICAnY2dnJzogMyxcbiAgICAgICdjaHInOiAzLFxuICAgICAgJ2NzJzogMTIsXG4gICAgICAnY3knOiAxNyxcbiAgICAgICdkYSc6IDMsXG4gICAgICAnZGUnOiAzLFxuICAgICAgJ2R2JzogMyxcbiAgICAgICdkeic6IDAsXG4gICAgICAnZWUnOiAzLFxuICAgICAgJ2VsJzogMyxcbiAgICAgICdlbic6IDMsXG4gICAgICAnZW8nOiAzLFxuICAgICAgJ2VzJzogMyxcbiAgICAgICdldCc6IDMsXG4gICAgICAnZXUnOiAzLFxuICAgICAgJ2ZhJzogMCxcbiAgICAgICdmZic6IDUsXG4gICAgICAnZmknOiAzLFxuICAgICAgJ2ZpbCc6IDQsXG4gICAgICAnZm8nOiAzLFxuICAgICAgJ2ZyJzogNSxcbiAgICAgICdmdXInOiAzLFxuICAgICAgJ2Z5JzogMyxcbiAgICAgICdnYSc6IDgsXG4gICAgICAnZ2QnOiAyNCxcbiAgICAgICdnbCc6IDMsXG4gICAgICAnZ3N3JzogMyxcbiAgICAgICdndSc6IDMsXG4gICAgICAnZ3V3JzogNCxcbiAgICAgICdndic6IDIzLFxuICAgICAgJ2hhJzogMyxcbiAgICAgICdoYXcnOiAzLFxuICAgICAgJ2hlJzogMixcbiAgICAgICdoaSc6IDQsXG4gICAgICAnaHInOiAxMSxcbiAgICAgICdodSc6IDAsXG4gICAgICAnaWQnOiAwLFxuICAgICAgJ2lnJzogMCxcbiAgICAgICdpaSc6IDAsXG4gICAgICAnaXMnOiAzLFxuICAgICAgJ2l0JzogMyxcbiAgICAgICdpdSc6IDcsXG4gICAgICAnamEnOiAwLFxuICAgICAgJ2ptYyc6IDMsXG4gICAgICAnanYnOiAwLFxuICAgICAgJ2thJzogMCxcbiAgICAgICdrYWInOiA1LFxuICAgICAgJ2thaic6IDMsXG4gICAgICAna2NnJzogMyxcbiAgICAgICdrZGUnOiAwLFxuICAgICAgJ2tlYSc6IDAsXG4gICAgICAna2snOiAzLFxuICAgICAgJ2tsJzogMyxcbiAgICAgICdrbSc6IDAsXG4gICAgICAna24nOiAwLFxuICAgICAgJ2tvJzogMCxcbiAgICAgICdrc2InOiAzLFxuICAgICAgJ2tzaCc6IDIxLFxuICAgICAgJ2t1JzogMyxcbiAgICAgICdrdyc6IDcsXG4gICAgICAnbGFnJzogMTgsXG4gICAgICAnbGInOiAzLFxuICAgICAgJ2xnJzogMyxcbiAgICAgICdsbic6IDQsXG4gICAgICAnbG8nOiAwLFxuICAgICAgJ2x0JzogMTAsXG4gICAgICAnbHYnOiA2LFxuICAgICAgJ21hcyc6IDMsXG4gICAgICAnbWcnOiA0LFxuICAgICAgJ21rJzogMTYsXG4gICAgICAnbWwnOiAzLFxuICAgICAgJ21uJzogMyxcbiAgICAgICdtbyc6IDksXG4gICAgICAnbXInOiAzLFxuICAgICAgJ21zJzogMCxcbiAgICAgICdtdCc6IDE1LFxuICAgICAgJ215JzogMCxcbiAgICAgICduYWgnOiAzLFxuICAgICAgJ25hcSc6IDcsXG4gICAgICAnbmInOiAzLFxuICAgICAgJ25kJzogMyxcbiAgICAgICduZSc6IDMsXG4gICAgICAnbmwnOiAzLFxuICAgICAgJ25uJzogMyxcbiAgICAgICdubyc6IDMsXG4gICAgICAnbnInOiAzLFxuICAgICAgJ25zbyc6IDQsXG4gICAgICAnbnknOiAzLFxuICAgICAgJ255bic6IDMsXG4gICAgICAnb20nOiAzLFxuICAgICAgJ29yJzogMyxcbiAgICAgICdwYSc6IDMsXG4gICAgICAncGFwJzogMyxcbiAgICAgICdwbCc6IDEzLFxuICAgICAgJ3BzJzogMyxcbiAgICAgICdwdCc6IDMsXG4gICAgICAncm0nOiAzLFxuICAgICAgJ3JvJzogOSxcbiAgICAgICdyb2YnOiAzLFxuICAgICAgJ3J1JzogMTEsXG4gICAgICAncndrJzogMyxcbiAgICAgICdzYWgnOiAwLFxuICAgICAgJ3NhcSc6IDMsXG4gICAgICAnc2UnOiA3LFxuICAgICAgJ3NlaCc6IDMsXG4gICAgICAnc2VzJzogMCxcbiAgICAgICdzZyc6IDAsXG4gICAgICAnc2gnOiAxMSxcbiAgICAgICdzaGknOiAxOSxcbiAgICAgICdzayc6IDEyLFxuICAgICAgJ3NsJzogMTQsXG4gICAgICAnc21hJzogNyxcbiAgICAgICdzbWknOiA3LFxuICAgICAgJ3Ntaic6IDcsXG4gICAgICAnc21uJzogNyxcbiAgICAgICdzbXMnOiA3LFxuICAgICAgJ3NuJzogMyxcbiAgICAgICdzbyc6IDMsXG4gICAgICAnc3EnOiAzLFxuICAgICAgJ3NyJzogMTEsXG4gICAgICAnc3MnOiAzLFxuICAgICAgJ3NzeSc6IDMsXG4gICAgICAnc3QnOiAzLFxuICAgICAgJ3N2JzogMyxcbiAgICAgICdzdyc6IDMsXG4gICAgICAnc3lyJzogMyxcbiAgICAgICd0YSc6IDMsXG4gICAgICAndGUnOiAzLFxuICAgICAgJ3Rlbyc6IDMsXG4gICAgICAndGgnOiAwLFxuICAgICAgJ3RpJzogNCxcbiAgICAgICd0aWcnOiAzLFxuICAgICAgJ3RrJzogMyxcbiAgICAgICd0bCc6IDQsXG4gICAgICAndG4nOiAzLFxuICAgICAgJ3RvJzogMCxcbiAgICAgICd0cic6IDAsXG4gICAgICAndHMnOiAzLFxuICAgICAgJ3R6bSc6IDIyLFxuICAgICAgJ3VrJzogMTEsXG4gICAgICAndXInOiAzLFxuICAgICAgJ3ZlJzogMyxcbiAgICAgICd2aSc6IDAsXG4gICAgICAndnVuJzogMyxcbiAgICAgICd3YSc6IDQsXG4gICAgICAnd2FlJzogMyxcbiAgICAgICd3byc6IDAsXG4gICAgICAneGgnOiAzLFxuICAgICAgJ3hvZyc6IDMsXG4gICAgICAneW8nOiAwLFxuICAgICAgJ3poJzogMCxcbiAgICAgICd6dSc6IDNcbiAgICB9O1xuXG4gICAgLy8gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHBsdXJhbCBydWxlcyBtZXRob2RzXG4gICAgZnVuY3Rpb24gaXNJbihuLCBsaXN0KSB7XG4gICAgICByZXR1cm4gbGlzdC5pbmRleE9mKG4pICE9PSAtMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNCZXR3ZWVuKG4sIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiBzdGFydCA8PSBuICYmIG4gPD0gZW5kO1xuICAgIH1cblxuICAgIC8vIGxpc3Qgb2YgYWxsIHBsdXJhbCBydWxlcyBtZXRob2RzOlxuICAgIC8vIG1hcCBhbiBpbnRlZ2VyIHRvIHRoZSBwbHVyYWwgZm9ybSBuYW1lIHRvIHVzZVxuICAgIHZhciBwbHVyYWxSdWxlcyA9IHtcbiAgICAgICcwJzogZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMSc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4oKG4gJSAxMDApLCAzLCAxMCkpKVxuICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgcmV0dXJuICd6ZXJvJztcbiAgICAgICAgaWYgKChpc0JldHdlZW4oKG4gJSAxMDApLCAxMSwgOTkpKSlcbiAgICAgICAgICByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiA9PSAyKVxuICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcyJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobiAhPT0gMCAmJiAobiAlIDEwKSA9PT0gMClcbiAgICAgICAgICByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiA9PSAyKVxuICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICczJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobiA9PSAxKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzQnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKG4sIDAsIDEpKSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc1JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbihuLCAwLCAyKSkgJiYgbiAhPSAyKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzYnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgIHJldHVybiAnemVybyc7XG4gICAgICAgIGlmICgobiAlIDEwKSA9PSAxICYmIChuICUgMTAwKSAhPSAxMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc3JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobiA9PSAyKVxuICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc4JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbihuLCAzLCA2KSkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAoKGlzQmV0d2VlbihuLCA3LCAxMCkpKVxuICAgICAgICAgIHJldHVybiAnbWFueSc7XG4gICAgICAgIGlmIChuID09IDIpXG4gICAgICAgICAgcmV0dXJuICd0d28nO1xuICAgICAgICBpZiAobiA9PSAxKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzknOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmIChuID09PSAwIHx8IG4gIT0gMSAmJiAoaXNCZXR3ZWVuKChuICUgMTAwKSwgMSwgMTkpKSlcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChuID09IDEpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTAnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKChuICUgMTApLCAyLCA5KSkgJiYgIShpc0JldHdlZW4oKG4gJSAxMDApLCAxMSwgMTkpKSlcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmICgobiAlIDEwKSA9PSAxICYmICEoaXNCZXR3ZWVuKChuICUgMTAwKSwgMTEsIDE5KSkpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTEnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKChuICUgMTApLCAyLCA0KSkgJiYgIShpc0JldHdlZW4oKG4gJSAxMDApLCAxMiwgMTQpKSlcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmICgobiAlIDEwKSA9PT0gMCB8fFxuICAgICAgICAgICAgKGlzQmV0d2VlbigobiAlIDEwKSwgNSwgOSkpIHx8XG4gICAgICAgICAgICAoaXNCZXR3ZWVuKChuICUgMTAwKSwgMTEsIDE0KSkpXG4gICAgICAgICAgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKChuICUgMTApID09IDEgJiYgKG4gJSAxMDApICE9IDExKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzEyJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbihuLCAyLCA0KSkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAobiA9PSAxKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzEzJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbigobiAlIDEwKSwgMiwgNCkpICYmICEoaXNCZXR3ZWVuKChuICUgMTAwKSwgMTIsIDE0KSkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAobiAhPSAxICYmIChpc0JldHdlZW4oKG4gJSAxMCksIDAsIDEpKSB8fFxuICAgICAgICAgICAgKGlzQmV0d2VlbigobiAlIDEwKSwgNSwgOSkpIHx8XG4gICAgICAgICAgICAoaXNCZXR3ZWVuKChuICUgMTAwKSwgMTIsIDE0KSkpXG4gICAgICAgICAgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxNCc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4oKG4gJSAxMDApLCAzLCA0KSkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAoKG4gJSAxMDApID09IDIpXG4gICAgICAgICAgcmV0dXJuICd0d28nO1xuICAgICAgICBpZiAoKG4gJSAxMDApID09IDEpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTUnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmIChuID09PSAwIHx8IChpc0JldHdlZW4oKG4gJSAxMDApLCAyLCAxMCkpKVxuICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKChpc0JldHdlZW4oKG4gJSAxMDApLCAxMSwgMTkpKSlcbiAgICAgICAgICByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiA9PSAxKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzE2JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKG4gJSAxMCkgPT0gMSAmJiBuICE9IDExKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzE3JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobiA9PSAzKVxuICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgcmV0dXJuICd6ZXJvJztcbiAgICAgICAgaWYgKG4gPT0gNilcbiAgICAgICAgICByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiA9PSAyKVxuICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxOCc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgcmV0dXJuICd6ZXJvJztcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgMCwgMikpICYmIG4gIT09IDAgJiYgbiAhPSAyKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzE5JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbihuLCAyLCAxMCkpKVxuICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgMCwgMSkpKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzIwJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbigobiAlIDEwKSwgMywgNCkgfHwgKChuICUgMTApID09IDkpKSAmJiAhKFxuICAgICAgICAgICAgaXNCZXR3ZWVuKChuICUgMTAwKSwgMTAsIDE5KSB8fFxuICAgICAgICAgICAgaXNCZXR3ZWVuKChuICUgMTAwKSwgNzAsIDc5KSB8fFxuICAgICAgICAgICAgaXNCZXR3ZWVuKChuICUgMTAwKSwgOTAsIDk5KVxuICAgICAgICAgICAgKSlcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmICgobiAlIDEwMDAwMDApID09PSAwICYmIG4gIT09IDApXG4gICAgICAgICAgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKChuICUgMTApID09IDIgJiYgIWlzSW4oKG4gJSAxMDApLCBbMTIsIDcyLCA5Ml0pKVxuICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKChuICUgMTApID09IDEgJiYgIWlzSW4oKG4gJSAxMDApLCBbMTEsIDcxLCA5MV0pKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzIxJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobiA9PT0gMClcbiAgICAgICAgICByZXR1cm4gJ3plcm8nO1xuICAgICAgICBpZiAobiA9PSAxKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzIyJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbihuLCAwLCAxKSkgfHwgKGlzQmV0d2VlbihuLCAxMSwgOTkpKSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcyMyc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4oKG4gJSAxMCksIDEsIDIpKSB8fCAobiAlIDIwKSA9PT0gMClcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcyNCc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgMywgMTApIHx8IGlzQmV0d2VlbihuLCAxMywgMTkpKSlcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChpc0luKG4sIFsyLCAxMl0pKVxuICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKGlzSW4obiwgWzEsIDExXSkpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBnaXZlcyB0aGUgcGx1cmFsIGZvcm0gbmFtZSBmb3IgYSBnaXZlbiBpbnRlZ2VyXG4gICAgdmFyIGluZGV4ID0gbG9jYWxlczJydWxlc1tsYW5nLnJlcGxhY2UoLy0uKiQvLCAnJyldO1xuICAgIGlmICghKGluZGV4IGluIHBsdXJhbFJ1bGVzKSkge1xuICAgICAgY29uc29sZS53YXJuKCdwbHVyYWwgZm9ybSB1bmtub3duIGZvciBbJyArIGxhbmcgKyAnXScpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gJ290aGVyJzsgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBsdXJhbFJ1bGVzW2luZGV4XTtcbiAgfVxuXG4gIC8vIHByZS1kZWZpbmVkICdwbHVyYWwnIG1hY3JvXG4gIGdNYWNyb3MucGx1cmFsID0gZnVuY3Rpb24oc3RyLCBwYXJhbSwga2V5LCBwcm9wKSB7XG4gICAgdmFyIG4gPSBwYXJzZUZsb2F0KHBhcmFtKTtcbiAgICBpZiAoaXNOYU4obikpXG4gICAgICByZXR1cm4gc3RyO1xuXG4gICAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciBwcm9wZXJ0aWVzIChsMjBuIHN0aWxsIGRvZXNuJ3QuLi4pXG4gICAgaWYgKHByb3AgIT0gZ1RleHRQcm9wKVxuICAgICAgcmV0dXJuIHN0cjtcblxuICAgIC8vIGluaXRpYWxpemUgX3BsdXJhbFJ1bGVzXG4gICAgaWYgKCFnTWFjcm9zLl9wbHVyYWxSdWxlcykge1xuICAgICAgZ01hY3Jvcy5fcGx1cmFsUnVsZXMgPSBnZXRQbHVyYWxSdWxlcyhnTGFuZ3VhZ2UpO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSAnWycgKyBnTWFjcm9zLl9wbHVyYWxSdWxlcyhuKSArICddJztcblxuICAgIC8vIHRyeSB0byBmaW5kIGEgW3plcm98b25lfHR3b10ga2V5IGlmIGl0J3MgZGVmaW5lZFxuICAgIGlmIChuID09PSAwICYmIChrZXkgKyAnW3plcm9dJykgaW4gZ0wxMG5EYXRhKSB7XG4gICAgICBzdHIgPSBnTDEwbkRhdGFba2V5ICsgJ1t6ZXJvXSddW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAobiA9PSAxICYmIChrZXkgKyAnW29uZV0nKSBpbiBnTDEwbkRhdGEpIHtcbiAgICAgIHN0ciA9IGdMMTBuRGF0YVtrZXkgKyAnW29uZV0nXVtwcm9wXTtcbiAgICB9IGVsc2UgaWYgKG4gPT0gMiAmJiAoa2V5ICsgJ1t0d29dJykgaW4gZ0wxMG5EYXRhKSB7XG4gICAgICBzdHIgPSBnTDEwbkRhdGFba2V5ICsgJ1t0d29dJ11bcHJvcF07XG4gICAgfSBlbHNlIGlmICgoa2V5ICsgaW5kZXgpIGluIGdMMTBuRGF0YSkge1xuICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArIGluZGV4XVtwcm9wXTtcbiAgICB9IGVsc2UgaWYgKChrZXkgKyAnW290aGVyXScpIGluIGdMMTBuRGF0YSkge1xuICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbb3RoZXJdJ11bcHJvcF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxuXG4gIC8qKlxuICAgKiBsMTBuIGRpY3Rpb25hcnkgZnVuY3Rpb25zXG4gICAqL1xuXG4gIC8vIGZldGNoIGFuIGwxMG4gb2JqZWN0LCB3YXJuIGlmIG5vdCBmb3VuZCwgYXBwbHkgYGFyZ3MnIGlmIHBvc3NpYmxlXG4gIGZ1bmN0aW9uIGdldEwxMG5EYXRhKGtleSwgYXJncywgZmFsbGJhY2spIHtcbiAgICB2YXIgZGF0YSA9IGdMMTBuRGF0YVtrZXldO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgY29uc29sZS53YXJuKCcjJyArIGtleSArICcgaXMgdW5kZWZpbmVkLicpO1xuICAgICAgaWYgKCFmYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGRhdGEgPSBmYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKiogVGhpcyBpcyB3aGVyZSBsMTBuIGV4cHJlc3Npb25zIHNob3VsZCBiZSBwcm9jZXNzZWQuXG4gICAgICAqIFRoZSBwbGFuIGlzIHRvIHN1cHBvcnQgQy1zdHlsZSBleHByZXNzaW9ucyBmcm9tIHRoZSBsMjBuIHByb2plY3Q7XG4gICAgICAqIHVudGlsIHRoZW4sIG9ubHkgdHdvIGtpbmRzIG9mIHNpbXBsZSBleHByZXNzaW9ucyBhcmUgc3VwcG9ydGVkOlxuICAgICAgKiAgIHtbIGluZGV4IF19IGFuZCB7eyBhcmd1bWVudHMgfX0uXG4gICAgICAqL1xuICAgIHZhciBydiA9IHt9O1xuICAgIGZvciAodmFyIHByb3AgaW4gZGF0YSkge1xuICAgICAgdmFyIHN0ciA9IGRhdGFbcHJvcF07XG4gICAgICBzdHIgPSBzdWJzdEluZGV4ZXMoc3RyLCBhcmdzLCBrZXksIHByb3ApO1xuICAgICAgc3RyID0gc3Vic3RBcmd1bWVudHMoc3RyLCBhcmdzLCBrZXkpO1xuICAgICAgcnZbcHJvcF0gPSBzdHI7XG4gICAgfVxuICAgIHJldHVybiBydjtcbiAgfVxuXG4gIC8vIHJlcGxhY2Uge1ttYWNyb3NdfSB3aXRoIHRoZWlyIHZhbHVlc1xuICBmdW5jdGlvbiBzdWJzdEluZGV4ZXMoc3RyLCBhcmdzLCBrZXksIHByb3ApIHtcbiAgICB2YXIgcmVJbmRleCA9IC9cXHtcXFtcXHMqKFthLXpBLVpdKylcXCgoW2EtekEtWl0rKVxcKVxccypcXF1cXH0vO1xuICAgIHZhciByZU1hdGNoID0gcmVJbmRleC5leGVjKHN0cik7XG4gICAgaWYgKCFyZU1hdGNoIHx8ICFyZU1hdGNoLmxlbmd0aClcbiAgICAgIHJldHVybiBzdHI7XG5cbiAgICAvLyBhbiBpbmRleC9tYWNybyBoYXMgYmVlbiBmb3VuZFxuICAgIC8vIE5vdGU6IGF0IHRoZSBtb21lbnQsIG9ubHkgb25lIHBhcmFtZXRlciBpcyBzdXBwb3J0ZWRcbiAgICB2YXIgbWFjcm9OYW1lID0gcmVNYXRjaFsxXTtcbiAgICB2YXIgcGFyYW1OYW1lID0gcmVNYXRjaFsyXTtcbiAgICB2YXIgcGFyYW07XG4gICAgaWYgKGFyZ3MgJiYgcGFyYW1OYW1lIGluIGFyZ3MpIHtcbiAgICAgIHBhcmFtID0gYXJnc1twYXJhbU5hbWVdO1xuICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lIGluIGdMMTBuRGF0YSkge1xuICAgICAgcGFyYW0gPSBnTDEwbkRhdGFbcGFyYW1OYW1lXTtcbiAgICB9XG5cbiAgICAvLyB0aGVyZSdzIG5vIG1hY3JvIHBhcnNlciB5ZXQ6IGl0IGhhcyB0byBiZSBkZWZpbmVkIGluIGdNYWNyb3NcbiAgICBpZiAobWFjcm9OYW1lIGluIGdNYWNyb3MpIHtcbiAgICAgIHZhciBtYWNybyA9IGdNYWNyb3NbbWFjcm9OYW1lXTtcbiAgICAgIHN0ciA9IG1hY3JvKHN0ciwgcGFyYW0sIGtleSwgcHJvcCk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICAvLyByZXBsYWNlIHt7YXJndW1lbnRzfX0gd2l0aCB0aGVpciB2YWx1ZXNcbiAgZnVuY3Rpb24gc3Vic3RBcmd1bWVudHMoc3RyLCBhcmdzLCBrZXkpIHtcbiAgICB2YXIgcmVBcmdzID0gL1xce1xce1xccyooLis/KVxccypcXH1cXH0vZztcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocmVBcmdzLCBmdW5jdGlvbihtYXRjaGVkX3RleHQsIGFyZykge1xuICAgICAgaWYgKGFyZ3MgJiYgYXJnIGluIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnXTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmcgaW4gZ0wxMG5EYXRhKSB7XG4gICAgICAgIHJldHVybiBnTDEwbkRhdGFbYXJnXTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCdhcmd1bWVudCB7eycgKyBhcmcgKyAnfX0gZm9yICMnICsga2V5ICsgJyBpcyB1bmRlZmluZWQuJyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZF90ZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdHJhbnNsYXRlIGFuIEhUTUwgZWxlbWVudFxuICBmdW5jdGlvbiB0cmFuc2xhdGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB2YXIgbDEwbiA9IGdldEwxMG5BdHRyaWJ1dGVzKGVsZW1lbnQpO1xuICAgIGlmICghbDEwbi5pZClcbiAgICAgIHJldHVybjtcblxuICAgIC8vIGdldCB0aGUgcmVsYXRlZCBsMTBuIG9iamVjdFxuICAgIHZhciBkYXRhID0gZ2V0TDEwbkRhdGEobDEwbi5pZCwgbDEwbi5hcmdzKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGNvbnNvbGUud2FybignIycgKyBsMTBuLmlkICsgJyBpcyB1bmRlZmluZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdHJhbnNsYXRlIGVsZW1lbnQgKFRPRE86IHNlY3VyaXR5IGNoZWNrcz8pXG4gICAgaWYgKGRhdGFbZ1RleHRQcm9wXSkgeyAvLyBYWFhcbiAgICAgIGlmIChnZXRDaGlsZEVsZW1lbnRDb3VudChlbGVtZW50KSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50W2dUZXh0UHJvcF0gPSBkYXRhW2dUZXh0UHJvcF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGVsZW1lbnQgaGFzIGVsZW1lbnQgY2hpbGRyZW46IHJlcGxhY2UgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0XG4gICAgICAgIC8vIChub24tZW1wdHkpIGNoaWxkIHRleHROb2RlIGFuZCBjbGVhciBvdGhlciBjaGlsZCB0ZXh0Tm9kZXNcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT09IDMgJiYgL1xcUy8udGVzdChjaGlsZHJlbltpXS5ub2RlVmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW5baV0ubm9kZVZhbHVlID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGlsZHJlbltpXS5ub2RlVmFsdWUgPSBkYXRhW2dUZXh0UHJvcF07XG4gICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgbm8gKG5vbi1lbXB0eSkgdGV4dE5vZGUgaXMgZm91bmQsIGluc2VydCBhIHRleHROb2RlIGJlZm9yZSB0aGVcbiAgICAgICAgLy8gZmlyc3QgZWxlbWVudCBjaGlsZC5cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgIHZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGFbZ1RleHRQcm9wXSk7XG4gICAgICAgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBkYXRhW2dUZXh0UHJvcF07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgayBpbiBkYXRhKSB7XG4gICAgICBlbGVtZW50W2tdID0gZGF0YVtrXTtcbiAgICB9XG4gIH1cblxuICAvLyB3ZWJraXQgYnJvd3NlcnMgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgJ2NoaWxkcmVuJyBvbiBTVkcgZWxlbWVudHMuLi5cbiAgZnVuY3Rpb24gZ2V0Q2hpbGRFbGVtZW50Q291bnQoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmNoaWxkRWxlbWVudENvdW50O1xuICAgIH1cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb3VudCArPSBlbGVtZW50Lm5vZGVUeXBlID09PSAxID8gMSA6IDA7XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8vIHRyYW5zbGF0ZSBhbiBIVE1MIHN1YnRyZWVcbiAgZnVuY3Rpb24gdHJhbnNsYXRlRnJhZ21lbnQoZWxlbWVudCkge1xuICAgIGVsZW1lbnQgPSBlbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICAgIC8vIGNoZWNrIGFsbCB0cmFuc2xhdGFibGUgY2hpbGRyZW4gKD0gdy8gYSBgZGF0YS1sMTBuLWlkJyBhdHRyaWJ1dGUpXG4gICAgdmFyIGNoaWxkcmVuID0gZ2V0VHJhbnNsYXRhYmxlQ2hpbGRyZW4oZWxlbWVudCk7XG4gICAgdmFyIGVsZW1lbnRDb3VudCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRDb3VudDsgaSsrKSB7XG4gICAgICB0cmFuc2xhdGVFbGVtZW50KGNoaWxkcmVuW2ldKTtcbiAgICB9XG5cbiAgICAvLyB0cmFuc2xhdGUgZWxlbWVudCBpdHNlbGYgaWYgbmVjZXNzYXJ5XG4gICAgdHJhbnNsYXRlRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gZ2V0IGEgbG9jYWxpemVkIHN0cmluZ1xuICAgIGdldDogZnVuY3Rpb24oa2V5LCBhcmdzLCBmYWxsYmFja1N0cmluZykge1xuICAgICAgdmFyIGluZGV4ID0ga2V5Lmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICB2YXIgcHJvcCA9IGdUZXh0UHJvcDtcbiAgICAgIGlmIChpbmRleCA+IDApIHsgLy8gQW4gYXR0cmlidXRlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgICAgICBwcm9wID0ga2V5LnN1YnN0cmluZyhpbmRleCArIDEpO1xuICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHZhciBmYWxsYmFjaztcbiAgICAgIGlmIChmYWxsYmFja1N0cmluZykge1xuICAgICAgICBmYWxsYmFjayA9IHt9O1xuICAgICAgICBmYWxsYmFja1twcm9wXSA9IGZhbGxiYWNrU3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXRMMTBuRGF0YShrZXksIGFyZ3MsIGZhbGxiYWNrKTtcbiAgICAgIGlmIChkYXRhICYmIHByb3AgaW4gZGF0YSkge1xuICAgICAgICByZXR1cm4gZGF0YVtwcm9wXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAne3snICsga2V5ICsgJ319JztcbiAgICB9LFxuXG4gICAgLy8gZGVidWdcbiAgICBnZXREYXRhOiBmdW5jdGlvbigpIHsgcmV0dXJuIGdMMTBuRGF0YTsgfSxcbiAgICBnZXRUZXh0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGdUZXh0RGF0YTsgfSxcblxuICAgIC8vIGdldHxzZXQgdGhlIGRvY3VtZW50IGxhbmd1YWdlXG4gICAgZ2V0TGFuZ3VhZ2U6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZ0xhbmd1YWdlOyB9LFxuICAgIHNldExhbmd1YWdlOiBmdW5jdGlvbihsYW5nLCBjYWxsYmFjaykge1xuICAgICAgbG9hZExvY2FsZShsYW5nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKVxuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gZ2V0IHRoZSBkaXJlY3Rpb24gKGx0cnxydGwpIG9mIHRoZSBjdXJyZW50IGxhbmd1YWdlXG4gICAgZ2V0RGlyZWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL0ludGVybmF0aW9uYWwvcXVlc3Rpb25zL3FhLXNjcmlwdHNcbiAgICAgIC8vIEFyYWJpYywgSGVicmV3LCBGYXJzaSwgUGFzaHRvLCBVcmR1XG4gICAgICB2YXIgcnRsTGlzdCA9IFsnYXInLCAnaGUnLCAnZmEnLCAncHMnLCAndXInXTtcbiAgICAgIHZhciBzaG9ydENvZGUgPSBnTGFuZ3VhZ2Uuc3BsaXQoJy0nLCAxKVswXTtcbiAgICAgIHJldHVybiAocnRsTGlzdC5pbmRleE9mKHNob3J0Q29kZSkgPj0gMCkgPyAncnRsJyA6ICdsdHInO1xuICAgIH0sXG5cbiAgICAvLyB0cmFuc2xhdGUgYW4gZWxlbWVudCBvciBkb2N1bWVudCBmcmFnbWVudFxuICAgIHRyYW5zbGF0ZTogdHJhbnNsYXRlRnJhZ21lbnQsXG5cbiAgICAvLyB0aGlzIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgZ2V0UmVhZHlTdGF0ZTogZnVuY3Rpb24oKSB7IHJldHVybiBnUmVhZHlTdGF0ZTsgfSxcbiAgICByZWFkeTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChnUmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IGdSZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZScpIHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9jYWxpemVkJywgZnVuY3Rpb24gb25jZSgpIHtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2NhbGl6ZWQnLCBvbmNlKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59KSAod2luZG93LCBkb2N1bWVudCk7XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkgfSBmcm9tIFwicGRmanMtbGliXCI7XG5pbXBvcnQgeyBnZXRDaGFyYWN0ZXJUeXBlIH0gZnJvbSBcIi4vcGRmX2ZpbmRfdXRpbHMuanNcIjtcbmltcG9ydCB7IHNjcm9sbEludG9WaWV3IH0gZnJvbSBcIi4vdWlfdXRpbHMuanNcIjtcblxuY29uc3QgRmluZFN0YXRlID0ge1xuICBGT1VORDogMCxcbiAgTk9UX0ZPVU5EOiAxLFxuICBXUkFQUEVEOiAyLFxuICBQRU5ESU5HOiAzLFxufTtcblxuY29uc3QgRklORF9USU1FT1VUID0gMjUwOyAvLyBtc1xuY29uc3QgTUFUQ0hfU0NST0xMX09GRlNFVF9UT1AgPSAtNTA7IC8vIHB4XG5jb25zdCBNQVRDSF9TQ1JPTExfT0ZGU0VUX0xFRlQgPSAtNDAwOyAvLyBweFxuXG5jb25zdCBDSEFSQUNURVJTX1RPX05PUk1BTElaRSA9IHtcbiAgXCJcXHUyMDE4XCI6IFwiJ1wiLCAvLyBMZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFya1xuICBcIlxcdTIwMTlcIjogXCInXCIsIC8vIFJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFya1xuICBcIlxcdTIwMUFcIjogXCInXCIsIC8vIFNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFya1xuICBcIlxcdTIwMUJcIjogXCInXCIsIC8vIFNpbmdsZSBoaWdoLXJldmVyc2VkLTkgcXVvdGF0aW9uIG1hcmtcbiAgXCJcXHUyMDFDXCI6ICdcIicsIC8vIExlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrXG4gIFwiXFx1MjAxRFwiOiAnXCInLCAvLyBSaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmtcbiAgXCJcXHUyMDFFXCI6ICdcIicsIC8vIERvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFya1xuICBcIlxcdTIwMUZcIjogJ1wiJywgLy8gRG91YmxlIGhpZ2gtcmV2ZXJzZWQtOSBxdW90YXRpb24gbWFya1xuICBcIlxcdTAwQkNcIjogXCIxLzRcIiwgLy8gVnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyXG4gIFwiXFx1MDBCRFwiOiBcIjEvMlwiLCAvLyBWdWxnYXIgZnJhY3Rpb24gb25lIGhhbGZcbiAgXCJcXHUwMEJFXCI6IFwiMy80XCIsIC8vIFZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVyc1xufTtcblxubGV0IG5vcm1hbGl6YXRpb25SZWdleCA9IG51bGw7XG5mdW5jdGlvbiBub3JtYWxpemUodGV4dCkge1xuICBpZiAoIW5vcm1hbGl6YXRpb25SZWdleCkge1xuICAgIC8vIENvbXBpbGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGV4dCBub3JtYWxpemF0aW9uIG9uY2UuXG4gICAgY29uc3QgcmVwbGFjZSA9IE9iamVjdC5rZXlzKENIQVJBQ1RFUlNfVE9fTk9STUFMSVpFKS5qb2luKFwiXCIpO1xuICAgIG5vcm1hbGl6YXRpb25SZWdleCA9IG5ldyBSZWdFeHAoYFske3JlcGxhY2V9XWAsIFwiZ1wiKTtcbiAgfVxuICByZXR1cm4gdGV4dC5yZXBsYWNlKG5vcm1hbGl6YXRpb25SZWdleCwgZnVuY3Rpb24gKGNoKSB7XG4gICAgcmV0dXJuIENIQVJBQ1RFUlNfVE9fTk9STUFMSVpFW2NoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGRmluZENvbnRyb2xsZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge0lQREZMaW5rU2VydmljZX0gbGlua1NlcnZpY2UgLSBUaGUgbmF2aWdhdGlvbi9saW5raW5nIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge0V2ZW50QnVzfSBldmVudEJ1cyAtIFRoZSBhcHBsaWNhdGlvbiBldmVudCBidXMuXG4gKi9cblxuLyoqXG4gKiBQcm92aWRlcyBzZWFyY2ggZnVuY3Rpb25hbGl0eSB0byBmaW5kIGEgZ2l2ZW4gc3RyaW5nIGluIGEgUERGIGRvY3VtZW50LlxuICovXG5jbGFzcyBQREZGaW5kQ29udHJvbGxlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge1BERkZpbmRDb250cm9sbGVyT3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoeyBsaW5rU2VydmljZSwgZXZlbnRCdXMgfSkge1xuICAgIHRoaXMuX2xpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7XG4gICAgdGhpcy5fZXZlbnRCdXMgPSBldmVudEJ1cztcblxuICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgZXZlbnRCdXMuX29uKFwiZmluZGJhcmNsb3NlXCIsIHRoaXMuX29uRmluZEJhckNsb3NlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgZ2V0IGhpZ2hsaWdodE1hdGNoZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXM7XG4gIH1cblxuICBnZXQgcGFnZU1hdGNoZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VNYXRjaGVzO1xuICB9XG5cbiAgZ2V0IHBhZ2VNYXRjaGVzTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlTWF0Y2hlc0xlbmd0aDtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gIH1cblxuICBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHJlZmVyZW5jZSB0byB0aGUgUERGIGRvY3VtZW50IGluIG9yZGVyIHRvIHNlYXJjaCBpdC5cbiAgICogTm90ZSB0aGF0IHNlYXJjaGluZyBpcyBub3QgcG9zc2libGUgaWYgdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtQREZEb2N1bWVudFByb3h5fSBwZGZEb2N1bWVudCAtIFRoZSBQREYgZG9jdW1lbnQgdG8gc2VhcmNoLlxuICAgKi9cbiAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHtcbiAgICBpZiAodGhpcy5fcGRmRG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgfVxuICAgIGlmICghcGRmRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDtcbiAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIGV4ZWN1dGVDb21tYW5kKGNtZCwgc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBkZkRvY3VtZW50ID0gdGhpcy5fcGRmRG9jdW1lbnQ7XG5cbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IG51bGwgfHwgdGhpcy5fc2hvdWxkRGlydHlNYXRjaChjbWQsIHN0YXRlKSkge1xuICAgICAgdGhpcy5fZGlydHlNYXRjaCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gICAgaWYgKGNtZCAhPT0gXCJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlXCIpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUoRmluZFN0YXRlLlBFTkRJTkcpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIC8vIElmIHRoZSBkb2N1bWVudCB3YXMgY2xvc2VkIGJlZm9yZSBzZWFyY2hpbmcgYmVnYW4sIG9yIGlmIHRoZSBzZWFyY2hcbiAgICAgIC8vIG9wZXJhdGlvbiB3YXMgcmVsZXZhbnQgZm9yIGEgcHJldmlvdXNseSBvcGVuZWQgZG9jdW1lbnQsIGRvIG5vdGhpbmcuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLl9wZGZEb2N1bWVudCB8fFxuICAgICAgICAocGRmRG9jdW1lbnQgJiYgdGhpcy5fcGRmRG9jdW1lbnQgIT09IHBkZkRvY3VtZW50KVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2V4dHJhY3RUZXh0KCk7XG5cbiAgICAgIGNvbnN0IGZpbmRiYXJDbG9zZWQgPSAhdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcztcbiAgICAgIGNvbnN0IHBlbmRpbmdUaW1lb3V0ID0gISF0aGlzLl9maW5kVGltZW91dDtcblxuICAgICAgaWYgKHRoaXMuX2ZpbmRUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5kVGltZW91dCk7XG4gICAgICAgIHRoaXMuX2ZpbmRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChjbWQgPT09IFwiZmluZFwiKSB7XG4gICAgICAgIC8vIFRyaWdnZXIgdGhlIGZpbmQgYWN0aW9uIHdpdGggYSBzbWFsbCBkZWxheSB0byBhdm9pZCBzdGFydGluZyB0aGVcbiAgICAgICAgLy8gc2VhcmNoIHdoZW4gdGhlIHVzZXIgaXMgc3RpbGwgdHlwaW5nIChzYXZpbmcgcmVzb3VyY2VzKS5cbiAgICAgICAgdGhpcy5fZmluZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9uZXh0TWF0Y2goKTtcbiAgICAgICAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7XG4gICAgICAgIH0sIEZJTkRfVElNRU9VVCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2RpcnR5TWF0Y2gpIHtcbiAgICAgICAgLy8gSW1tZWRpYXRlbHkgdHJpZ2dlciBzZWFyY2hpbmcgZm9yIG5vbi0nZmluZCcgb3BlcmF0aW9ucywgd2hlbiB0aGVcbiAgICAgICAgLy8gY3VycmVudCBzdGF0ZSBuZWVkcyB0byBiZSByZXNldCBhbmQgbWF0Y2hlcyByZS1jYWxjdWxhdGVkLlxuICAgICAgICB0aGlzLl9uZXh0TWF0Y2goKTtcbiAgICAgIH0gZWxzZSBpZiAoY21kID09PSBcImZpbmRhZ2FpblwiKSB7XG4gICAgICAgIHRoaXMuX25leHRNYXRjaCgpO1xuXG4gICAgICAgIC8vIFdoZW4gdGhlIGZpbmRiYXIgd2FzIHByZXZpb3VzbHkgY2xvc2VkLCBhbmQgYGhpZ2hsaWdodEFsbGAgaXMgc2V0LFxuICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgbWF0Y2hlcyBvbiBhbGwgYWN0aXZlIHBhZ2VzIGFyZSBoaWdobGlnaHRlZCBhZ2Fpbi5cbiAgICAgICAgaWYgKGZpbmRiYXJDbG9zZWQgJiYgdGhpcy5fc3RhdGUuaGlnaGxpZ2h0QWxsKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlQWxsUGFnZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjbWQgPT09IFwiZmluZGhpZ2hsaWdodGFsbGNoYW5nZVwiKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHBlbmRpbmcgc2VhcmNoIG9wZXJhdGlvbiwgc3luY2hyb25vdXNseSB0cmlnZ2VyIGEgbmV3XG4gICAgICAgIC8vIHNlYXJjaCAqZmlyc3QqIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IG1hdGNoZXMgYXJlIGhpZ2hsaWdodGVkLlxuICAgICAgICBpZiAocGVuZGluZ1RpbWVvdXQpIHtcbiAgICAgICAgICB0aGlzLl9uZXh0TWF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9oaWdobGlnaHRNYXRjaGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVBbGxQYWdlcygpOyAvLyBVcGRhdGUgdGhlIGhpZ2hsaWdodGluZyBvbiBhbGwgYWN0aXZlIHBhZ2VzLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzY3JvbGxNYXRjaEludG9WaWV3KHsgZWxlbWVudCA9IG51bGwsIHBhZ2VJbmRleCA9IC0xLCBtYXRjaEluZGV4ID0gLTEgfSkge1xuICAgIGlmICghdGhpcy5fc2Nyb2xsTWF0Y2hlcyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAobWF0Y2hJbmRleCA9PT0gLTEgfHwgbWF0Y2hJbmRleCAhPT0gdGhpcy5fc2VsZWN0ZWQubWF0Y2hJZHgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHBhZ2VJbmRleCA9PT0gLTEgfHwgcGFnZUluZGV4ICE9PSB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3Njcm9sbE1hdGNoZXMgPSBmYWxzZTsgLy8gRW5zdXJlIHRoYXQgc2Nyb2xsaW5nIG9ubHkgaGFwcGVucyBvbmNlLlxuXG4gICAgY29uc3Qgc3BvdCA9IHtcbiAgICAgIHRvcDogTUFUQ0hfU0NST0xMX09GRlNFVF9UT1AsXG4gICAgICBsZWZ0OiBNQVRDSF9TQ1JPTExfT0ZGU0VUX0xFRlQsXG4gICAgfTtcbiAgICBzY3JvbGxJbnRvVmlldyhlbGVtZW50LCBzcG90LCAvKiBza2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyA9ICovIHRydWUpO1xuICB9XG5cbiAgX3Jlc2V0KCkge1xuICAgIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXMgPSBmYWxzZTtcbiAgICB0aGlzLl9zY3JvbGxNYXRjaGVzID0gZmFsc2U7XG4gICAgdGhpcy5fcGRmRG9jdW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX3BhZ2VNYXRjaGVzID0gW107XG4gICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGggPSBbXTtcbiAgICB0aGlzLl9zdGF0ZSA9IG51bGw7XG4gICAgLy8gQ3VycmVudGx5IHNlbGVjdGVkIG1hdGNoLlxuICAgIHRoaXMuX3NlbGVjdGVkID0ge1xuICAgICAgcGFnZUlkeDogLTEsXG4gICAgICBtYXRjaElkeDogLTEsXG4gICAgfTtcbiAgICAvLyBXaGVyZSB0aGUgZmluZCBhbGdvcml0aG0gY3VycmVudGx5IGlzIGluIHRoZSBkb2N1bWVudC5cbiAgICB0aGlzLl9vZmZzZXQgPSB7XG4gICAgICBwYWdlSWR4OiBudWxsLFxuICAgICAgbWF0Y2hJZHg6IG51bGwsXG4gICAgICB3cmFwcGVkOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMuX2V4dHJhY3RUZXh0UHJvbWlzZXMgPSBbXTtcbiAgICB0aGlzLl9wYWdlQ29udGVudHMgPSBbXTsgLy8gU3RvcmVzIHRoZSBub3JtYWxpemVkIHRleHQgZm9yIGVhY2ggcGFnZS5cbiAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCA9IDA7XG4gICAgdGhpcy5fcGFnZXNUb1NlYXJjaCA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ0ZpbmRNYXRjaGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gbnVsbDtcbiAgICB0aGlzLl9kaXJ0eU1hdGNoID0gZmFsc2U7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2ZpbmRUaW1lb3V0KTtcbiAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7XG5cbiAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfSBUaGUgKGN1cnJlbnQpIG5vcm1hbGl6ZWQgc2VhcmNoIHF1ZXJ5LlxuICAgKi9cbiAgZ2V0IF9xdWVyeSgpIHtcbiAgICBpZiAodGhpcy5fc3RhdGUucXVlcnkgIT09IHRoaXMuX3Jhd1F1ZXJ5KSB7XG4gICAgICB0aGlzLl9yYXdRdWVyeSA9IHRoaXMuX3N0YXRlLnF1ZXJ5O1xuICAgICAgdGhpcy5fbm9ybWFsaXplZFF1ZXJ5ID0gbm9ybWFsaXplKHRoaXMuX3N0YXRlLnF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZWRRdWVyeTtcbiAgfVxuXG4gIF9zaG91bGREaXJ0eU1hdGNoKGNtZCwgc3RhdGUpIHtcbiAgICAvLyBXaGVuIHRoZSBzZWFyY2ggcXVlcnkgY2hhbmdlcywgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIHNlYXJjaCBjb21tYW5kXG4gICAgLy8gdXNlZCwgYWx3YXlzIHJlLWNhbGN1bGF0ZSBtYXRjaGVzIHRvIGF2b2lkIGVycm9ycyAoZml4ZXMgYnVnIDEwMzA2MjIpLlxuICAgIGlmIChzdGF0ZS5xdWVyeSAhPT0gdGhpcy5fc3RhdGUucXVlcnkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGNtZCkge1xuICAgICAgY2FzZSBcImZpbmRhZ2FpblwiOlxuICAgICAgICBjb25zdCBwYWdlTnVtYmVyID0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCArIDE7XG4gICAgICAgIGNvbnN0IGxpbmtTZXJ2aWNlID0gdGhpcy5fbGlua1NlcnZpY2U7XG4gICAgICAgIC8vIE9ubHkgdHJlYXQgYSAnZmluZGFnYWluJyBldmVudCBhcyBhIG5ldyBzZWFyY2ggb3BlcmF0aW9uIHdoZW4gaXQnc1xuICAgICAgICAvLyAqYWJzb2x1dGVseSogY2VydGFpbiB0aGF0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWF0Y2ggaXMgbm8gbG9uZ2VyXG4gICAgICAgIC8vIHZpc2libGUsIGUuZy4gYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgc2Nyb2xsaW5nIGluIHRoZSBkb2N1bWVudC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTk9URTogSWYgb25seSBhIHNpbXBsZSBgdGhpcy5fbGlua1NlcnZpY2UucGFnZWAgY2hlY2sgd2FzIHVzZWQgaGVyZSxcbiAgICAgICAgLy8gdGhlcmUncyBhIHJpc2sgdGhhdCBjb25zZWN1dGl2ZSAnZmluZGFnYWluJyBvcGVyYXRpb25zIGNvdWxkIFwic2tpcFwiXG4gICAgICAgIC8vIG92ZXIgbWF0Y2hlcyBhdCB0aGUgdG9wL2JvdHRvbSBvZiBwYWdlcyB0aHVzIG1ha2luZyB0aGVtIGNvbXBsZXRlbHlcbiAgICAgICAgLy8gaW5hY2Nlc3NpYmxlIHdoZW4gdGhlcmUncyBtdWx0aXBsZSBwYWdlcyB2aXNpYmxlIGluIHRoZSB2aWV3ZXIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwYWdlTnVtYmVyID49IDEgJiZcbiAgICAgICAgICBwYWdlTnVtYmVyIDw9IGxpbmtTZXJ2aWNlLnBhZ2VzQ291bnQgJiZcbiAgICAgICAgICBwYWdlTnVtYmVyICE9PSBsaW5rU2VydmljZS5wYWdlICYmXG4gICAgICAgICAgIWxpbmtTZXJ2aWNlLmlzUGFnZVZpc2libGUocGFnZU51bWJlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY2FzZSBcImZpbmRoaWdobGlnaHRhbGxjaGFuZ2VcIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZm9yIG11bHRpLXRlcm0gc2VhcmNoIHRoYXQgZmlsbHMgdGhlIGBtYXRjaGVzV2l0aExlbmd0aGAgYXJyYXlcbiAgICogYW5kIGhhbmRsZXMgY2FzZXMgd2hlcmUgb25lIHNlYXJjaCB0ZXJtIGluY2x1ZGVzIGFub3RoZXIgc2VhcmNoIHRlcm0gKGZvclxuICAgKiBleGFtcGxlLCBcInRhbWVkIHRhbWVcIiBvciBcInRoaXMgaXNcIikuIEl0IGxvb2tzIGZvciBpbnRlcnNlY3RpbmcgdGVybXMgaW5cbiAgICogdGhlIGBtYXRjaGVzYCBhbmQga2VlcHMgZWxlbWVudHMgd2l0aCBhIGxvbmdlciBtYXRjaCBsZW5ndGguXG4gICAqL1xuICBfcHJlcGFyZU1hdGNoZXMobWF0Y2hlc1dpdGhMZW5ndGgsIG1hdGNoZXMsIG1hdGNoZXNMZW5ndGgpIHtcbiAgICBmdW5jdGlvbiBpc1N1YlRlcm0oY3VycmVudEluZGV4KSB7XG4gICAgICBjb25zdCBjdXJyZW50RWxlbSA9IG1hdGNoZXNXaXRoTGVuZ3RoW2N1cnJlbnRJbmRleF07XG4gICAgICBjb25zdCBuZXh0RWxlbSA9IG1hdGNoZXNXaXRoTGVuZ3RoW2N1cnJlbnRJbmRleCArIDFdO1xuXG4gICAgICAvLyBDaGVjayBmb3IgY2FzZXMgbGlrZSBcIlRBTUVkIFRBTUVcIi5cbiAgICAgIGlmIChcbiAgICAgICAgY3VycmVudEluZGV4IDwgbWF0Y2hlc1dpdGhMZW5ndGgubGVuZ3RoIC0gMSAmJlxuICAgICAgICBjdXJyZW50RWxlbS5tYXRjaCA9PT0gbmV4dEVsZW0ubWF0Y2hcbiAgICAgICkge1xuICAgICAgICBjdXJyZW50RWxlbS5za2lwcGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBjYXNlcyBsaWtlIFwidGhJUyBJU1wiLlxuICAgICAgZm9yIChsZXQgaSA9IGN1cnJlbnRJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHByZXZFbGVtID0gbWF0Y2hlc1dpdGhMZW5ndGhbaV07XG4gICAgICAgIGlmIChwcmV2RWxlbS5za2lwcGVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZFbGVtLm1hdGNoICsgcHJldkVsZW0ubWF0Y2hMZW5ndGggPCBjdXJyZW50RWxlbS5tYXRjaCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmV2RWxlbS5tYXRjaCArIHByZXZFbGVtLm1hdGNoTGVuZ3RoID49XG4gICAgICAgICAgY3VycmVudEVsZW0ubWF0Y2ggKyBjdXJyZW50RWxlbS5tYXRjaExlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICBjdXJyZW50RWxlbS5za2lwcGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNvcnQgdGhlIGFycmF5IG9mIGB7IG1hdGNoOiA8bWF0Y2g+LCBtYXRjaExlbmd0aDogPG1hdGNoTGVuZ3RoPiB9YFxuICAgIC8vIG9iamVjdHMgb24gaW5jcmVhc2luZyBpbmRleCBmaXJzdCBhbmQgb24gdGhlIGxlbmd0aCBvdGhlcndpc2UuXG4gICAgbWF0Y2hlc1dpdGhMZW5ndGguc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEubWF0Y2ggPT09IGIubWF0Y2hcbiAgICAgICAgPyBhLm1hdGNoTGVuZ3RoIC0gYi5tYXRjaExlbmd0aFxuICAgICAgICA6IGEubWF0Y2ggLSBiLm1hdGNoO1xuICAgIH0pO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtYXRjaGVzV2l0aExlbmd0aC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGlzU3ViVGVybShpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1hdGNoZXMucHVzaChtYXRjaGVzV2l0aExlbmd0aFtpXS5tYXRjaCk7XG4gICAgICBtYXRjaGVzTGVuZ3RoLnB1c2gobWF0Y2hlc1dpdGhMZW5ndGhbaV0ubWF0Y2hMZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgdGhlIHNlYXJjaCBxdWVyeSBjb25zdGl0dXRlcyBhIFwid2hvbGUgd29yZFwiLCBieSBjb21wYXJpbmcgdGhlXG4gICAqIGZpcnN0L2xhc3QgY2hhcmFjdGVyIHR5cGUgd2l0aCB0aGUgcHJlY2VkaW5nL2ZvbGxvd2luZyBjaGFyYWN0ZXIgdHlwZS5cbiAgICovXG4gIF9pc0VudGlyZVdvcmQoY29udGVudCwgc3RhcnRJZHgsIGxlbmd0aCkge1xuICAgIGlmIChzdGFydElkeCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gY29udGVudC5jaGFyQ29kZUF0KHN0YXJ0SWR4KTtcbiAgICAgIGNvbnN0IGxpbWl0ID0gY29udGVudC5jaGFyQ29kZUF0KHN0YXJ0SWR4IC0gMSk7XG4gICAgICBpZiAoZ2V0Q2hhcmFjdGVyVHlwZShmaXJzdCkgPT09IGdldENoYXJhY3RlclR5cGUobGltaXQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZW5kSWR4ID0gc3RhcnRJZHggKyBsZW5ndGggLSAxO1xuICAgIGlmIChlbmRJZHggPCBjb250ZW50Lmxlbmd0aCAtIDEpIHtcbiAgICAgIGNvbnN0IGxhc3QgPSBjb250ZW50LmNoYXJDb2RlQXQoZW5kSWR4KTtcbiAgICAgIGNvbnN0IGxpbWl0ID0gY29udGVudC5jaGFyQ29kZUF0KGVuZElkeCArIDEpO1xuICAgICAgaWYgKGdldENoYXJhY3RlclR5cGUobGFzdCkgPT09IGdldENoYXJhY3RlclR5cGUobGltaXQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBfY2FsY3VsYXRlUGhyYXNlTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgY29uc3QgcXVlcnlMZW4gPSBxdWVyeS5sZW5ndGg7XG5cbiAgICBsZXQgbWF0Y2hJZHggPSAtcXVlcnlMZW47XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIG1hdGNoSWR4ID0gcGFnZUNvbnRlbnQuaW5kZXhPZihxdWVyeSwgbWF0Y2hJZHggKyBxdWVyeUxlbik7XG4gICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGVudGlyZVdvcmQgJiYgIXRoaXMuX2lzRW50aXJlV29yZChwYWdlQ29udGVudCwgbWF0Y2hJZHgsIHF1ZXJ5TGVuKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1hdGNoZXMucHVzaChtYXRjaElkeCk7XG4gICAgfVxuICAgIHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJbmRleF0gPSBtYXRjaGVzO1xuICB9XG5cbiAgX2NhbGN1bGF0ZVdvcmRNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCkge1xuICAgIGNvbnN0IG1hdGNoZXNXaXRoTGVuZ3RoID0gW107XG5cbiAgICAvLyBEaXZpZGUgdGhlIHF1ZXJ5IGludG8gcGllY2VzIGFuZCBzZWFyY2ggZm9yIHRleHQgaW4gZWFjaCBwaWVjZS5cbiAgICBjb25zdCBxdWVyeUFycmF5ID0gcXVlcnkubWF0Y2goL1xcUysvZyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHF1ZXJ5QXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YnF1ZXJ5ID0gcXVlcnlBcnJheVtpXTtcbiAgICAgIGNvbnN0IHN1YnF1ZXJ5TGVuID0gc3VicXVlcnkubGVuZ3RoO1xuXG4gICAgICBsZXQgbWF0Y2hJZHggPSAtc3VicXVlcnlMZW47XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBtYXRjaElkeCA9IHBhZ2VDb250ZW50LmluZGV4T2Yoc3VicXVlcnksIG1hdGNoSWR4ICsgc3VicXVlcnlMZW4pO1xuICAgICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVudGlyZVdvcmQgJiZcbiAgICAgICAgICAhdGhpcy5faXNFbnRpcmVXb3JkKHBhZ2VDb250ZW50LCBtYXRjaElkeCwgc3VicXVlcnlMZW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyIHNlYXJjaGVzIGRvIG5vdCwgc28gd2Ugc3RvcmUgdGhlIGxlbmd0aC5cbiAgICAgICAgbWF0Y2hlc1dpdGhMZW5ndGgucHVzaCh7XG4gICAgICAgICAgbWF0Y2g6IG1hdGNoSWR4LFxuICAgICAgICAgIG1hdGNoTGVuZ3RoOiBzdWJxdWVyeUxlbixcbiAgICAgICAgICBza2lwcGVkOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBhcnJheXMgZm9yIHN0b3JpbmcgdGhlIG1hdGNoZXMuXG4gICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGhbcGFnZUluZGV4XSA9IFtdO1xuICAgIHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJbmRleF0gPSBbXTtcblxuICAgIC8vIFNvcnQgYG1hdGNoZXNXaXRoTGVuZ3RoYCwgcmVtb3ZlIGludGVyc2VjdGluZyB0ZXJtcyBhbmQgcHV0IHRoZSByZXN1bHRcbiAgICAvLyBpbnRvIHRoZSB0d28gYXJyYXlzLlxuICAgIHRoaXMuX3ByZXBhcmVNYXRjaGVzKFxuICAgICAgbWF0Y2hlc1dpdGhMZW5ndGgsXG4gICAgICB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSW5kZXhdLFxuICAgICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGhbcGFnZUluZGV4XVxuICAgICk7XG4gIH1cblxuICBfY2FsY3VsYXRlTWF0Y2gocGFnZUluZGV4KSB7XG4gICAgbGV0IHBhZ2VDb250ZW50ID0gdGhpcy5fcGFnZUNvbnRlbnRzW3BhZ2VJbmRleF07XG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5fcXVlcnk7XG4gICAgY29uc3QgeyBjYXNlU2Vuc2l0aXZlLCBlbnRpcmVXb3JkLCBwaHJhc2VTZWFyY2ggfSA9IHRoaXMuX3N0YXRlO1xuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRG8gbm90aGluZzogdGhlIG1hdGNoZXMgc2hvdWxkIGJlIHdpcGVkIG91dCBhbHJlYWR5LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgcGFnZUNvbnRlbnQgPSBwYWdlQ29udGVudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgcXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmIChwaHJhc2VTZWFyY2gpIHtcbiAgICAgIHRoaXMuX2NhbGN1bGF0ZVBocmFzZU1hdGNoKHF1ZXJ5LCBwYWdlSW5kZXgsIHBhZ2VDb250ZW50LCBlbnRpcmVXb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2FsY3VsYXRlV29yZE1hdGNoKHF1ZXJ5LCBwYWdlSW5kZXgsIHBhZ2VDb250ZW50LCBlbnRpcmVXb3JkKTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGBoaWdobGlnaHRBbGxgIGlzIHNldCwgZW5zdXJlIHRoYXQgdGhlIG1hdGNoZXMgb24gcHJldmlvdXNseVxuICAgIC8vIHJlbmRlcmVkIChhbmQgc3RpbGwgYWN0aXZlKSBwYWdlcyBhcmUgY29ycmVjdGx5IGhpZ2hsaWdodGVkLlxuICAgIGlmICh0aGlzLl9zdGF0ZS5oaWdobGlnaHRBbGwpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBhZ2UocGFnZUluZGV4KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHggPT09IHBhZ2VJbmRleCkge1xuICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IG51bGw7XG4gICAgICB0aGlzLl9uZXh0UGFnZU1hdGNoKCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBtYXRjaCBjb3VudC5cbiAgICBjb25zdCBwYWdlTWF0Y2hlc0NvdW50ID0gdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XS5sZW5ndGg7XG4gICAgaWYgKHBhZ2VNYXRjaGVzQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCArPSBwYWdlTWF0Y2hlc0NvdW50O1xuICAgICAgdGhpcy5fdXBkYXRlVUlSZXN1bHRzQ291bnQoKTtcbiAgICB9XG4gIH1cblxuICBfZXh0cmFjdFRleHQoKSB7XG4gICAgLy8gUGVyZm9ybSB0ZXh0IGV4dHJhY3Rpb24gb25jZSBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMuXG4gICAgaWYgKHRoaXMuX2V4dHJhY3RUZXh0UHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZXNDb3VudDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dHJhY3RUZXh0Q2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICB0aGlzLl9leHRyYWN0VGV4dFByb21pc2VzW2ldID0gZXh0cmFjdFRleHRDYXBhYmlsaXR5LnByb21pc2U7XG5cbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGRmRG9jdW1lbnRcbiAgICAgICAgICAuZ2V0UGFnZShpICsgMSlcbiAgICAgICAgICAudGhlbihwZGZQYWdlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwZGZQYWdlLmdldFRleHRDb250ZW50KHtcbiAgICAgICAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICB0ZXh0Q29udGVudCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRleHRJdGVtcyA9IHRleHRDb250ZW50Lml0ZW1zO1xuICAgICAgICAgICAgICBjb25zdCBzdHJCdWYgPSBbXTtcblxuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamogPSB0ZXh0SXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKHRleHRJdGVtc1tqXS5zdHIpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIG5vcm1hbGl6ZWQgcGFnZSBjb250ZW50ICh0ZXh0IGl0ZW1zKSBhcyBvbmUgc3RyaW5nLlxuICAgICAgICAgICAgICB0aGlzLl9wYWdlQ29udGVudHNbaV0gPSBub3JtYWxpemUoc3RyQnVmLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICBleHRyYWN0VGV4dENhcGFiaWxpdHkucmVzb2x2ZShpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFzb24gPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gZ2V0IHRleHQgY29udGVudCBmb3IgcGFnZSAke2kgKyAxfWAsXG4gICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIFBhZ2UgZXJyb3IgLS0gYXNzdW1pbmcgbm8gdGV4dCBjb250ZW50LlxuICAgICAgICAgICAgICB0aGlzLl9wYWdlQ29udGVudHNbaV0gPSBcIlwiO1xuICAgICAgICAgICAgICBleHRyYWN0VGV4dENhcGFiaWxpdHkucmVzb2x2ZShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZVBhZ2UoaW5kZXgpIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsTWF0Y2hlcyAmJiB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ID09PSBpbmRleCkge1xuICAgICAgLy8gSWYgdGhlIHBhZ2UgaXMgc2VsZWN0ZWQsIHNjcm9sbCB0aGUgcGFnZSBpbnRvIHZpZXcsIHdoaWNoIHRyaWdnZXJzXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIHBhZ2UsIHdoaWNoIGFkZHMgdGhlIHRleHQgbGF5ZXIuIE9uY2UgdGhlIHRleHQgbGF5ZXJcbiAgICAgIC8vIGlzIGJ1aWx0LCBpdCB3aWxsIGF0dGVtcHQgdG8gc2Nyb2xsIHRoZSBzZWxlY3RlZCBtYXRjaCBpbnRvIHZpZXcuXG4gICAgICB0aGlzLl9saW5rU2VydmljZS5wYWdlID0gaW5kZXggKyAxO1xuICAgIH1cblxuICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwidXBkYXRldGV4dGxheWVybWF0Y2hlc1wiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBwYWdlSW5kZXg6IGluZGV4LFxuICAgIH0pO1xuICB9XG5cbiAgX3VwZGF0ZUFsbFBhZ2VzKCkge1xuICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwidXBkYXRldGV4dGxheWVybWF0Y2hlc1wiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBwYWdlSW5kZXg6IC0xLFxuICAgIH0pO1xuICB9XG5cbiAgX25leHRNYXRjaCgpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX3N0YXRlLmZpbmRQcmV2aW91cztcbiAgICBjb25zdCBjdXJyZW50UGFnZUluZGV4ID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZSAtIDE7XG4gICAgY29uc3QgbnVtUGFnZXMgPSB0aGlzLl9saW5rU2VydmljZS5wYWdlc0NvdW50O1xuXG4gICAgdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcyA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5fZGlydHlNYXRjaCkge1xuICAgICAgLy8gTmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgbWF0Y2hlcywgcmVzZXQgZXZlcnl0aGluZy5cbiAgICAgIHRoaXMuX2RpcnR5TWF0Y2ggPSBmYWxzZTtcbiAgICAgIHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggPSB0aGlzLl9zZWxlY3RlZC5tYXRjaElkeCA9IC0xO1xuICAgICAgdGhpcy5fb2Zmc2V0LnBhZ2VJZHggPSBjdXJyZW50UGFnZUluZGV4O1xuICAgICAgdGhpcy5fb2Zmc2V0Lm1hdGNoSWR4ID0gbnVsbDtcbiAgICAgIHRoaXMuX29mZnNldC53cmFwcGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhZ2VNYXRjaGVzLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLl9wYWdlTWF0Y2hlc0xlbmd0aC5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5fbWF0Y2hlc0NvdW50VG90YWwgPSAwO1xuXG4gICAgICB0aGlzLl91cGRhdGVBbGxQYWdlcygpOyAvLyBXaXBlIG91dCBhbnkgcHJldmlvdXNseSBoaWdobGlnaHRlZCBtYXRjaGVzLlxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVBhZ2VzOyBpKyspIHtcbiAgICAgICAgLy8gU3RhcnQgZmluZGluZyB0aGUgbWF0Y2hlcyBhcyBzb29uIGFzIHRoZSB0ZXh0IGlzIGV4dHJhY3RlZC5cbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlc1tpXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlc1tpXSA9IHRydWU7XG4gICAgICAgIHRoaXMuX2V4dHJhY3RUZXh0UHJvbWlzZXNbaV0udGhlbihwYWdlSWR4ID0+IHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ0ZpbmRNYXRjaGVzW3BhZ2VJZHhdO1xuICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZU1hdGNoKHBhZ2VJZHgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIHF1ZXJ5IHRoZXJlJ3Mgbm8gcG9pbnQgaW4gc2VhcmNoaW5nLlxuICAgIGlmICh0aGlzLl9xdWVyeSA9PT0gXCJcIikge1xuICAgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZShGaW5kU3RhdGUuRk9VTkQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJZiB3ZSdyZSB3YWl0aW5nIG9uIGEgcGFnZSwgd2UgcmV0dXJuIHNpbmNlIHdlIGNhbid0IGRvIGFueXRoaW5nIGVsc2UuXG4gICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9vZmZzZXQ7XG4gICAgLy8gS2VlcCB0cmFjayBvZiBob3cgbWFueSBwYWdlcyB3ZSBzaG91bGQgbWF4aW1hbGx5IGl0ZXJhdGUgdGhyb3VnaC5cbiAgICB0aGlzLl9wYWdlc1RvU2VhcmNoID0gbnVtUGFnZXM7XG4gICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgYG1hdGNoSWR4YCB0aGF0IG1lYW5zIHdlIGFyZSBpdGVyYXRpbmcgdGhyb3VnaCBhXG4gICAgLy8gcGFnZSdzIG1hdGNoZXMuXG4gICAgaWYgKG9mZnNldC5tYXRjaElkeCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbnVtUGFnZU1hdGNoZXMgPSB0aGlzLl9wYWdlTWF0Y2hlc1tvZmZzZXQucGFnZUlkeF0ubGVuZ3RoO1xuICAgICAgaWYgKFxuICAgICAgICAoIXByZXZpb3VzICYmIG9mZnNldC5tYXRjaElkeCArIDEgPCBudW1QYWdlTWF0Y2hlcykgfHxcbiAgICAgICAgKHByZXZpb3VzICYmIG9mZnNldC5tYXRjaElkeCA+IDApXG4gICAgICApIHtcbiAgICAgICAgLy8gVGhlIHNpbXBsZSBjYXNlOyB3ZSBqdXN0IGhhdmUgYWR2YW5jZSB0aGUgbWF0Y2hJZHggdG8gc2VsZWN0XG4gICAgICAgIC8vIHRoZSBuZXh0IG1hdGNoIG9uIHRoZSBwYWdlLlxuICAgICAgICBvZmZzZXQubWF0Y2hJZHggPSBwcmV2aW91cyA/IG9mZnNldC5tYXRjaElkeCAtIDEgOiBvZmZzZXQubWF0Y2hJZHggKyAxO1xuICAgICAgICB0aGlzLl91cGRhdGVNYXRjaCgvKiBmb3VuZCA9ICovIHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBXZSB3ZW50IGJleW9uZCB0aGUgY3VycmVudCBwYWdlJ3MgbWF0Y2hlcywgc28gd2UgYWR2YW5jZSB0b1xuICAgICAgLy8gdGhlIG5leHQgcGFnZS5cbiAgICAgIHRoaXMuX2FkdmFuY2VPZmZzZXRQYWdlKHByZXZpb3VzKTtcbiAgICB9XG4gICAgLy8gU3RhcnQgc2VhcmNoaW5nIHRocm91Z2ggdGhlIHBhZ2UuXG4gICAgdGhpcy5fbmV4dFBhZ2VNYXRjaCgpO1xuICB9XG5cbiAgX21hdGNoZXNSZWFkeShtYXRjaGVzKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0O1xuICAgIGNvbnN0IG51bU1hdGNoZXMgPSBtYXRjaGVzLmxlbmd0aDtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX3N0YXRlLmZpbmRQcmV2aW91cztcblxuICAgIGlmIChudW1NYXRjaGVzKSB7XG4gICAgICAvLyBUaGVyZSB3ZXJlIG1hdGNoZXMgZm9yIHRoZSBwYWdlLCBzbyBpbml0aWFsaXplIGBtYXRjaElkeGAuXG4gICAgICBvZmZzZXQubWF0Y2hJZHggPSBwcmV2aW91cyA/IG51bU1hdGNoZXMgLSAxIDogMDtcbiAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKC8qIGZvdW5kID0gKi8gdHJ1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gTm8gbWF0Y2hlcywgc28gYXR0ZW1wdCB0byBzZWFyY2ggdGhlIG5leHQgcGFnZS5cbiAgICB0aGlzLl9hZHZhbmNlT2Zmc2V0UGFnZShwcmV2aW91cyk7XG4gICAgaWYgKG9mZnNldC53cmFwcGVkKSB7XG4gICAgICBvZmZzZXQubWF0Y2hJZHggPSBudWxsO1xuICAgICAgaWYgKHRoaXMuX3BhZ2VzVG9TZWFyY2ggPCAwKSB7XG4gICAgICAgIC8vIE5vIHBvaW50IGluIHdyYXBwaW5nIGFnYWluLCB0aGVyZSB3ZXJlIG5vIG1hdGNoZXMuXG4gICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKC8qIGZvdW5kID0gKi8gZmFsc2UpO1xuICAgICAgICAvLyBXaGlsZSBtYXRjaGVzIHdlcmUgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIGEgcGFnZVxuICAgICAgICAvLyB3aXRoIG1hdGNoZXMgc2hvdWxkIG5ldmVydGhlbGVzcyBoYWx0LlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTWF0Y2hlcyB3ZXJlIG5vdCBmb3VuZCAoYW5kIHNlYXJjaGluZyBpcyBub3QgZG9uZSkuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX25leHRQYWdlTWF0Y2goKSB7XG4gICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHggIT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGVyZSBjYW4gb25seSBiZSBvbmUgcGVuZGluZyBwYWdlLlwiKTtcbiAgICB9XG5cbiAgICBsZXQgbWF0Y2hlcyA9IG51bGw7XG4gICAgZG8ge1xuICAgICAgY29uc3QgcGFnZUlkeCA9IHRoaXMuX29mZnNldC5wYWdlSWR4O1xuICAgICAgbWF0Y2hlcyA9IHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJZHhdO1xuICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgIC8vIFRoZSBtYXRjaGVzIGRvbid0IGV4aXN0IHlldCBmb3IgcHJvY2Vzc2luZyBieSBgX21hdGNoZXNSZWFkeWAsXG4gICAgICAgIC8vIHNvIHNldCBhIHJlc3VtZSBwb2ludCBmb3Igd2hlbiB0aGV5IGRvIGV4aXN0LlxuICAgICAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gcGFnZUlkeDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoIXRoaXMuX21hdGNoZXNSZWFkeShtYXRjaGVzKSk7XG4gIH1cblxuICBfYWR2YW5jZU9mZnNldFBhZ2UocHJldmlvdXMpIHtcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9vZmZzZXQ7XG4gICAgY29uc3QgbnVtUGFnZXMgPSB0aGlzLl9saW5rU2VydmljZS5wYWdlc0NvdW50O1xuICAgIG9mZnNldC5wYWdlSWR4ID0gcHJldmlvdXMgPyBvZmZzZXQucGFnZUlkeCAtIDEgOiBvZmZzZXQucGFnZUlkeCArIDE7XG4gICAgb2Zmc2V0Lm1hdGNoSWR4ID0gbnVsbDtcblxuICAgIHRoaXMuX3BhZ2VzVG9TZWFyY2gtLTtcblxuICAgIGlmIChvZmZzZXQucGFnZUlkeCA+PSBudW1QYWdlcyB8fCBvZmZzZXQucGFnZUlkeCA8IDApIHtcbiAgICAgIG9mZnNldC5wYWdlSWR4ID0gcHJldmlvdXMgPyBudW1QYWdlcyAtIDEgOiAwO1xuICAgICAgb2Zmc2V0LndyYXBwZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVNYXRjaChmb3VuZCA9IGZhbHNlKSB7XG4gICAgbGV0IHN0YXRlID0gRmluZFN0YXRlLk5PVF9GT1VORDtcbiAgICBjb25zdCB3cmFwcGVkID0gdGhpcy5fb2Zmc2V0LndyYXBwZWQ7XG4gICAgdGhpcy5fb2Zmc2V0LndyYXBwZWQgPSBmYWxzZTtcblxuICAgIGlmIChmb3VuZCkge1xuICAgICAgY29uc3QgcHJldmlvdXNQYWdlID0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeDtcbiAgICAgIHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggPSB0aGlzLl9vZmZzZXQucGFnZUlkeDtcbiAgICAgIHRoaXMuX3NlbGVjdGVkLm1hdGNoSWR4ID0gdGhpcy5fb2Zmc2V0Lm1hdGNoSWR4O1xuICAgICAgc3RhdGUgPSB3cmFwcGVkID8gRmluZFN0YXRlLldSQVBQRUQgOiBGaW5kU3RhdGUuRk9VTkQ7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhZ2UgdG8gd2lwZSBvdXQgYW55IHNlbGVjdGVkIG1hdGNoZXMuXG4gICAgICBpZiAocHJldmlvdXNQYWdlICE9PSAtMSAmJiBwcmV2aW91c1BhZ2UgIT09IHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlUGFnZShwcmV2aW91c1BhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUoc3RhdGUsIHRoaXMuX3N0YXRlLmZpbmRQcmV2aW91cyk7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggIT09IC0xKSB7XG4gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbWF0Y2ggd2lsbCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICB0aGlzLl9zY3JvbGxNYXRjaGVzID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fdXBkYXRlUGFnZSh0aGlzLl9zZWxlY3RlZC5wYWdlSWR4KTtcbiAgICB9XG4gIH1cblxuICBfb25GaW5kQmFyQ2xvc2UoZXZ0KSB7XG4gICAgY29uc3QgcGRmRG9jdW1lbnQgPSB0aGlzLl9wZGZEb2N1bWVudDtcbiAgICAvLyBTaW5jZSBzZWFyY2hpbmcgaXMgYXN5bmNocm9ub3VzLCBlbnN1cmUgdGhhdCB0aGUgcmVtb3ZhbCBvZiBoaWdobGlnaHRlZFxuICAgIC8vIG1hdGNoZXMgKGZyb20gdGhlIFVJKSBpcyBhc3luYyB0b28gc3VjaCB0aGF0IHRoZSAndXBkYXRldGV4dGxheWVybWF0Y2hlcydcbiAgICAvLyBldmVudHMgd2lsbCBhbHdheXMgYmUgZGlzcGF0Y2hlZCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIuXG4gICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gT25seSB1cGRhdGUgdGhlIFVJIGlmIHRoZSBkb2N1bWVudCBpcyBvcGVuLCBhbmQgaXMgdGhlIGN1cnJlbnQgb25lLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5fcGRmRG9jdW1lbnQgfHxcbiAgICAgICAgKHBkZkRvY3VtZW50ICYmIHRoaXMuX3BkZkRvY3VtZW50ICE9PSBwZGZEb2N1bWVudClcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhhdCBhIHBlbmRpbmcsIG5vdCB5ZXQgc3RhcnRlZCwgc2VhcmNoIG9wZXJhdGlvbiBpcyBhYm9ydGVkLlxuICAgICAgaWYgKHRoaXMuX2ZpbmRUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5kVGltZW91dCk7XG4gICAgICAgIHRoaXMuX2ZpbmRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIEFib3J0IGFueSBsb25nIHJ1bm5pbmcgc2VhcmNoZXMsIHRvIGF2b2lkIGEgbWF0Y2ggYmVpbmcgc2Nyb2xsZWQgaW50b1xuICAgICAgLy8gdmlldyAqYWZ0ZXIqIHRoZSBmaW5kYmFyIGhhcyBiZWVuIGNsb3NlZC4gSW4gdGhpcyBjYXNlIGB0aGlzLl9vZmZzZXRgXG4gICAgICAvLyB3aWxsIG1vc3QgbGlrZWx5IGRpZmZlciBmcm9tIGB0aGlzLl9zZWxlY3RlZGAsIGhlbmNlIHdlIGFsc28gZW5zdXJlXG4gICAgICAvLyB0aGF0IGFueSBuZXcgc2VhcmNoIG9wZXJhdGlvbiB3aWxsIGFsd2F5cyBzdGFydCB3aXRoIGEgY2xlYW4gc2xhdGUuXG4gICAgICBpZiAodGhpcy5fcmVzdW1lUGFnZUlkeCkge1xuICAgICAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGlydHlNYXRjaCA9IHRydWU7XG4gICAgICB9XG4gICAgICAvLyBBdm9pZCB0aGUgVUkgYmVpbmcgaW4gYSBwZW5kaW5nIHN0YXRlIHdoZW4gdGhlIGZpbmRiYXIgaXMgcmUtb3BlbmVkLlxuICAgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZShGaW5kU3RhdGUuRk9VTkQpO1xuXG4gICAgICB0aGlzLl9oaWdobGlnaHRNYXRjaGVzID0gZmFsc2U7XG4gICAgICB0aGlzLl91cGRhdGVBbGxQYWdlcygpOyAvLyBXaXBlIG91dCBhbnkgcHJldmlvdXNseSBoaWdobGlnaHRlZCBtYXRjaGVzLlxuICAgIH0pO1xuICB9XG5cbiAgX3JlcXVlc3RNYXRjaGVzQ291bnQoKSB7XG4gICAgY29uc3QgeyBwYWdlSWR4LCBtYXRjaElkeCB9ID0gdGhpcy5fc2VsZWN0ZWQ7XG4gICAgbGV0IGN1cnJlbnQgPSAwLFxuICAgICAgdG90YWwgPSB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbDtcbiAgICBpZiAobWF0Y2hJZHggIT09IC0xKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZ2VJZHg7IGkrKykge1xuICAgICAgICBjdXJyZW50ICs9ICh0aGlzLl9wYWdlTWF0Y2hlc1tpXSAmJiB0aGlzLl9wYWdlTWF0Y2hlc1tpXS5sZW5ndGgpIHx8IDA7XG4gICAgICB9XG4gICAgICBjdXJyZW50ICs9IG1hdGNoSWR4ICsgMTtcbiAgICB9XG4gICAgLy8gV2hlbiBzZWFyY2hpbmcgc3RhcnRzLCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgYHBhZ2VNYXRjaGVzYFxuICAgIC8vIGhhdmUgYmVlbiBjb3VudGVkIChpbiBgX2NhbGN1bGF0ZU1hdGNoYCkuIEVuc3VyZSB0aGF0IHRoZSBVSSB3b24ndCBzaG93XG4gICAgLy8gdGVtcG9yYXJpbHkgYnJva2VuIHN0YXRlIHdoZW4gdGhlIGFjdGl2ZSBmaW5kIHJlc3VsdCBkb2Vzbid0IG1ha2Ugc2Vuc2UuXG4gICAgaWYgKGN1cnJlbnQgPCAxIHx8IGN1cnJlbnQgPiB0b3RhbCkge1xuICAgICAgY3VycmVudCA9IHRvdGFsID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHsgY3VycmVudCwgdG90YWwgfTtcbiAgfVxuXG4gIF91cGRhdGVVSVJlc3VsdHNDb3VudCgpIHtcbiAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInVwZGF0ZWZpbmRtYXRjaGVzY291bnRcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgbWF0Y2hlc0NvdW50OiB0aGlzLl9yZXF1ZXN0TWF0Y2hlc0NvdW50KCksXG4gICAgfSk7XG4gIH1cblxuICBfdXBkYXRlVUlTdGF0ZShzdGF0ZSwgcHJldmlvdXMpIHtcbiAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInVwZGF0ZWZpbmRjb250cm9sc3RhdGVcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgc3RhdGUsXG4gICAgICBwcmV2aW91cyxcbiAgICAgIG1hdGNoZXNDb3VudDogdGhpcy5fcmVxdWVzdE1hdGNoZXNDb3VudCgpLFxuICAgICAgcmF3UXVlcnk6IHRoaXMuX3N0YXRlID8gdGhpcy5fc3RhdGUucXVlcnkgOiBudWxsLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IEZpbmRTdGF0ZSwgUERGRmluZENvbnRyb2xsZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE4IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBDaGFyYWN0ZXJUeXBlID0ge1xuICBTUEFDRTogMCxcbiAgQUxQSEFfTEVUVEVSOiAxLFxuICBQVU5DVDogMixcbiAgSEFOX0xFVFRFUjogMyxcbiAgS0FUQUtBTkFfTEVUVEVSOiA0LFxuICBISVJBR0FOQV9MRVRURVI6IDUsXG4gIEhBTEZXSURUSF9LQVRBS0FOQV9MRVRURVI6IDYsXG4gIFRIQUlfTEVUVEVSOiA3LFxufTtcblxuZnVuY3Rpb24gaXNBbHBoYWJldGljYWxTY3JpcHQoY2hhckNvZGUpIHtcbiAgcmV0dXJuIGNoYXJDb2RlIDwgMHgyZTgwO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpKGNoYXJDb2RlKSB7XG4gIHJldHVybiAoY2hhckNvZGUgJiAweGZmODApID09PSAwO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpQWxwaGEoY2hhckNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICAoY2hhckNvZGUgPj0gLyogYSA9ICovIDB4NjEgJiYgY2hhckNvZGUgPD0gLyogeiA9ICovIDB4N2EpIHx8XG4gICAgKGNoYXJDb2RlID49IC8qIEEgPSAqLyAweDQxICYmIGNoYXJDb2RlIDw9IC8qIFogPSAqLyAweDVhKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpRGlnaXQoY2hhckNvZGUpIHtcbiAgcmV0dXJuIGNoYXJDb2RlID49IC8qIDAgPSAqLyAweDMwICYmIGNoYXJDb2RlIDw9IC8qIDkgPSAqLyAweDM5O1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpU3BhY2UoY2hhckNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICBjaGFyQ29kZSA9PT0gLyogU1BBQ0UgPSAqLyAweDIwIHx8XG4gICAgY2hhckNvZGUgPT09IC8qIFRBQiA9ICovIDB4MDkgfHxcbiAgICBjaGFyQ29kZSA9PT0gLyogQ1IgPSAqLyAweDBkIHx8XG4gICAgY2hhckNvZGUgPT09IC8qIExGID0gKi8gMHgwYVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0hhbihjaGFyQ29kZSkge1xuICByZXR1cm4gKFxuICAgIChjaGFyQ29kZSA+PSAweDM0MDAgJiYgY2hhckNvZGUgPD0gMHg5ZmZmKSB8fFxuICAgIChjaGFyQ29kZSA+PSAweGY5MDAgJiYgY2hhckNvZGUgPD0gMHhmYWZmKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0thdGFrYW5hKGNoYXJDb2RlKSB7XG4gIHJldHVybiBjaGFyQ29kZSA+PSAweDMwYTAgJiYgY2hhckNvZGUgPD0gMHgzMGZmO1xufVxuXG5mdW5jdGlvbiBpc0hpcmFnYW5hKGNoYXJDb2RlKSB7XG4gIHJldHVybiBjaGFyQ29kZSA+PSAweDMwNDAgJiYgY2hhckNvZGUgPD0gMHgzMDlmO1xufVxuXG5mdW5jdGlvbiBpc0hhbGZ3aWR0aEthdGFrYW5hKGNoYXJDb2RlKSB7XG4gIHJldHVybiBjaGFyQ29kZSA+PSAweGZmNjAgJiYgY2hhckNvZGUgPD0gMHhmZjlmO1xufVxuXG5mdW5jdGlvbiBpc1RoYWkoY2hhckNvZGUpIHtcbiAgcmV0dXJuIChjaGFyQ29kZSAmIDB4ZmY4MCkgPT09IDB4MGUwMDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSB3b3JkLWJyZWFrIGRldGVjdGlvbiBpbXBsZW1lbnRlZCBpbjpcbiAqIGh0dHBzOi8vaGcubW96aWxsYS5vcmcvbW96aWxsYS1jZW50cmFsL2ZpbGUvdGlwL2ludGwvbHdicmsvV29yZEJyZWFrZXIuY3BwXG4gKi9cbmZ1bmN0aW9uIGdldENoYXJhY3RlclR5cGUoY2hhckNvZGUpIHtcbiAgaWYgKGlzQWxwaGFiZXRpY2FsU2NyaXB0KGNoYXJDb2RlKSkge1xuICAgIGlmIChpc0FzY2lpKGNoYXJDb2RlKSkge1xuICAgICAgaWYgKGlzQXNjaWlTcGFjZShjaGFyQ29kZSkpIHtcbiAgICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuU1BBQ0U7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc0FzY2lpQWxwaGEoY2hhckNvZGUpIHx8XG4gICAgICAgIGlzQXNjaWlEaWdpdChjaGFyQ29kZSkgfHxcbiAgICAgICAgY2hhckNvZGUgPT09IC8qIFVOREVSU0NPUkUgPSAqLyAweDVmXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuQUxQSEFfTEVUVEVSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuUFVOQ1Q7XG4gICAgfSBlbHNlIGlmIChpc1RoYWkoY2hhckNvZGUpKSB7XG4gICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5USEFJX0xFVFRFUjtcbiAgICB9IGVsc2UgaWYgKGNoYXJDb2RlID09PSAvKiBOQlNQID0gKi8gMHhhMCkge1xuICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuU1BBQ0U7XG4gICAgfVxuICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUjtcbiAgfVxuXG4gIGlmIChpc0hhbihjaGFyQ29kZSkpIHtcbiAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5IQU5fTEVUVEVSO1xuICB9IGVsc2UgaWYgKGlzS2F0YWthbmEoY2hhckNvZGUpKSB7XG4gICAgcmV0dXJuIENoYXJhY3RlclR5cGUuS0FUQUtBTkFfTEVUVEVSO1xuICB9IGVsc2UgaWYgKGlzSGlyYWdhbmEoY2hhckNvZGUpKSB7XG4gICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSElSQUdBTkFfTEVUVEVSO1xuICB9IGVsc2UgaWYgKGlzSGFsZndpZHRoS2F0YWthbmEoY2hhckNvZGUpKSB7XG4gICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSEFMRldJRFRIX0tBVEFLQU5BX0xFVFRFUjtcbiAgfVxuICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVI7XG59XG5cbmV4cG9ydCB7IENoYXJhY3RlclR5cGUsIGdldENoYXJhY3RlclR5cGUgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBpc1ZhbGlkUm90YXRpb24sXG4gIHBhcnNlUXVlcnlTdHJpbmcsXG4gIHdhaXRPbkV2ZW50T3JUaW1lb3V0LFxufSBmcm9tIFwiLi91aV91dGlscy5qc1wiO1xuXG4vLyBIZXVyaXN0aWMgdmFsdWUgdXNlZCB3aGVuIGZvcmNlLXJlc2V0dGluZyBgdGhpcy5fYmxvY2tIYXNoQ2hhbmdlYC5cbmNvbnN0IEhBU0hfQ0hBTkdFX1RJTUVPVVQgPSAxMDAwOyAvLyBtaWxsaXNlY29uZHNcbi8vIEhldXJpc3RpYyB2YWx1ZSB1c2VkIHdoZW4gYWRkaW5nIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBicm93c2VyIGhpc3RvcnkuXG5jb25zdCBQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRCA9IDUwO1xuLy8gSGV1cmlzdGljIHZhbHVlIHVzZWQgd2hlbiBhZGRpbmcgYSB0ZW1wb3JhcnkgcG9zaXRpb24gdG8gdGhlIGJyb3dzZXIgaGlzdG9yeS5cbmNvbnN0IFVQREFURV9WSUVXQVJFQV9USU1FT1VUID0gMTAwMDsgLy8gbWlsbGlzZWNvbmRzXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGSGlzdG9yeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7SVBERkxpbmtTZXJ2aWNlfSBsaW5rU2VydmljZSAtIFRoZSBuYXZpZ2F0aW9uL2xpbmtpbmcgc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRCdXN9IGV2ZW50QnVzIC0gVGhlIGFwcGxpY2F0aW9uIGV2ZW50IGJ1cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluaXRpYWxpemVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmluZ2VycHJpbnQgLSBUaGUgUERGIGRvY3VtZW50J3MgdW5pcXVlIGZpbmdlcnByaW50LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVzZXRIaXN0b3J5XSAtIFJlc2V0IHRoZSBicm93c2luZyBoaXN0b3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXBkYXRlVXJsXSAtIEF0dGVtcHQgdG8gdXBkYXRlIHRoZSBkb2N1bWVudCBVUkwsIHdpdGhcbiAqICAgdGhlIGN1cnJlbnQgaGFzaCwgd2hlbiBwdXNoaW5nL3JlcGxhY2luZyBicm93c2VyIGhpc3RvcnkgZW50cmllcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1c2hQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVkRGVzdF0gLSBUaGUgbmFtZWQgZGVzdGluYXRpb24uIElmIGFic2VudCwgYVxuICogICBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIGBleHBsaWNpdERlc3RgIGlzIHVzZWQuXG4gKiBAcHJvcGVydHkge0FycmF5fSBleHBsaWNpdERlc3QgLSBUaGUgZXhwbGljaXQgZGVzdGluYXRpb24gYXJyYXkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGFnZU51bWJlciAtIFRoZSBwYWdlIHRvIHdoaWNoIHRoZSBkZXN0aW5hdGlvbiBwb2ludHMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEhhc2goKSB7XG4gIHJldHVybiBkb2N1bWVudC5sb2NhdGlvbi5oYXNoO1xufVxuXG5jbGFzcyBQREZIaXN0b3J5IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UERGSGlzdG9yeU9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHsgbGlua1NlcnZpY2UsIGV2ZW50QnVzIH0pIHtcbiAgICB0aGlzLmxpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7XG4gICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9maW5nZXJwcmludCA9IFwiXCI7XG4gICAgdGhpcy5yZXNldCgpO1xuXG4gICAgdGhpcy5fYm91bmRFdmVudHMgPSBudWxsO1xuICAgIHRoaXMuX2lzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlID0gZmFsc2U7XG4gICAgLy8gRW5zdXJlIHRoYXQgd2UgZG9uJ3QgbWlzcyBlaXRoZXIgYSAncHJlc2VudGF0aW9ubW9kZWNoYW5nZWQnIG9yIGFcbiAgICAvLyAncGFnZXNpbml0JyBldmVudCwgYnkgcmVnaXN0ZXJpbmcgdGhlIGxpc3RlbmVycyBpbW1lZGlhdGVseS5cbiAgICB0aGlzLmV2ZW50QnVzLl9vbihcInByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkXCIsIGV2dCA9PiB7XG4gICAgICB0aGlzLl9pc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSA9IGV2dC5hY3RpdmUgfHwgZXZ0LnN3aXRjaEluUHJvZ3Jlc3M7XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudEJ1cy5fb24oXCJwYWdlc2luaXRcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5faXNQYWdlc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBvblBhZ2VzTG9hZGVkID0gZXZ0ID0+IHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKFwicGFnZXNsb2FkZWRcIiwgb25QYWdlc0xvYWRlZCk7XG4gICAgICAgIHRoaXMuX2lzUGFnZXNMb2FkZWQgPSAhIWV2dC5wYWdlc0NvdW50O1xuICAgICAgfTtcbiAgICAgIHRoaXMuZXZlbnRCdXMuX29uKFwicGFnZXNsb2FkZWRcIiwgb25QYWdlc0xvYWRlZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgaGlzdG9yeSBmb3IgdGhlIFBERiBkb2N1bWVudCwgdXNpbmcgZWl0aGVyIHRoZSBjdXJyZW50XG4gICAqIGJyb3dzZXIgaGlzdG9yeSBlbnRyeSBvciB0aGUgZG9jdW1lbnQgaGFzaCwgd2hpY2hldmVyIGlzIHByZXNlbnQuXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZVBhcmFtZXRlcnN9IHBhcmFtc1xuICAgKi9cbiAgaW5pdGlhbGl6ZSh7IGZpbmdlcnByaW50LCByZXNldEhpc3RvcnkgPSBmYWxzZSwgdXBkYXRlVXJsID0gZmFsc2UgfSkge1xuICAgIGlmICghZmluZ2VycHJpbnQgfHwgdHlwZW9mIGZpbmdlcnByaW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnUERGSGlzdG9yeS5pbml0aWFsaXplOiBUaGUgXCJmaW5nZXJwcmludFwiIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLidcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEVuc3VyZSB0aGF0IGFueSBvbGQgc3RhdGUgaXMgYWx3YXlzIHJlc2V0IHVwb24gaW5pdGlhbGl6YXRpb24uXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIGNvbnN0IHJlSW5pdGlhbGl6ZWQgPVxuICAgICAgdGhpcy5fZmluZ2VycHJpbnQgIT09IFwiXCIgJiYgdGhpcy5fZmluZ2VycHJpbnQgIT09IGZpbmdlcnByaW50O1xuICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7XG4gICAgdGhpcy5fdXBkYXRlVXJsID0gdXBkYXRlVXJsID09PSB0cnVlO1xuXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnN0YXRlO1xuXG4gICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5fYmxvY2tIYXNoQ2hhbmdlID0gMDtcbiAgICB0aGlzLl9jdXJyZW50SGFzaCA9IGdldEN1cnJlbnRIYXNoKCk7XG4gICAgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzID0gMDtcblxuICAgIHRoaXMuX3VpZCA9IHRoaXMuX21heFVpZCA9IDA7XG4gICAgdGhpcy5fZGVzdGluYXRpb24gPSBudWxsO1xuICAgIHRoaXMuX3Bvc2l0aW9uID0gbnVsbDtcblxuICAgIGlmICghdGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlLCAvKiBjaGVja1JlbG9hZCA9ICovIHRydWUpIHx8IHJlc2V0SGlzdG9yeSkge1xuICAgICAgY29uc3QgeyBoYXNoLCBwYWdlLCByb3RhdGlvbiB9ID0gdGhpcy5fcGFyc2VDdXJyZW50SGFzaChcbiAgICAgICAgLyogY2hlY2tOYW1lZGRlc3QgPSAqLyB0cnVlXG4gICAgICApO1xuXG4gICAgICBpZiAoIWhhc2ggfHwgcmVJbml0aWFsaXplZCB8fCByZXNldEhpc3RvcnkpIHtcbiAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGJyb3dzZXIgaGlzdG9yeSBpcyByZXNldCBvbiBQREYgZG9jdW1lbnQgbG9hZC5cbiAgICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKG51bGwsIC8qIGZvcmNlUmVwbGFjZSA9ICovIHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgYnJvd3NlciBoaXN0b3J5IGlzIGluaXRpYWxpemVkIGNvcnJlY3RseSB3aGVuXG4gICAgICAvLyB0aGUgZG9jdW1lbnQgaGFzaCBpcyBwcmVzZW50IG9uIFBERiBkb2N1bWVudCBsb2FkLlxuICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKFxuICAgICAgICB7IGhhc2gsIHBhZ2UsIHJvdGF0aW9uIH0sXG4gICAgICAgIC8qIGZvcmNlUmVwbGFjZSA9ICovIHRydWVcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGJyb3dzZXIgaGlzdG9yeSBjb250YWlucyBhIHZhbGlkIGVudHJ5LCBlbnN1cmUgdGhhdCB0aGUgaGlzdG9yeSBpc1xuICAgIC8vIGluaXRpYWxpemVkIGNvcnJlY3RseSBvbiBQREYgZG9jdW1lbnQgbG9hZC5cbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHN0YXRlLmRlc3RpbmF0aW9uO1xuICAgIHRoaXMuX3VwZGF0ZUludGVybmFsU3RhdGUoXG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIHN0YXRlLnVpZCxcbiAgICAgIC8qIHJlbW92ZVRlbXBvcmFyeSA9ICovIHRydWVcbiAgICApO1xuICAgIGlmICh0aGlzLl91aWQgPiB0aGlzLl9tYXhVaWQpIHtcbiAgICAgIHRoaXMuX21heFVpZCA9IHRoaXMuX3VpZDtcbiAgICB9XG5cbiAgICBpZiAoZGVzdGluYXRpb24ucm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faW5pdGlhbFJvdGF0aW9uID0gZGVzdGluYXRpb24ucm90YXRpb247XG4gICAgfVxuICAgIGlmIChkZXN0aW5hdGlvbi5kZXN0KSB7XG4gICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBKU09OLnN0cmluZ2lmeShkZXN0aW5hdGlvbi5kZXN0KTtcblxuICAgICAgLy8gSWYgdGhlIGhpc3RvcnkgaXMgdXBkYXRlZCwgZS5nLiB0aHJvdWdoIHRoZSB1c2VyIGNoYW5naW5nIHRoZSBoYXNoLFxuICAgICAgLy8gYmVmb3JlIHRoZSBpbml0aWFsIGRlc3RpbmF0aW9uIGhhcyBiZWNvbWUgdmlzaWJsZSwgdGhlbiB3ZSBkbyAqbm90KlxuICAgICAgLy8gd2FudCB0byBwb3RlbnRpYWxseSBhZGQgYHRoaXMuX3Bvc2l0aW9uYCB0byB0aGUgYnJvd3NlciBoaXN0b3J5LlxuICAgICAgdGhpcy5fZGVzdGluYXRpb24ucGFnZSA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5oYXNoKSB7XG4gICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBkZXN0aW5hdGlvbi5oYXNoO1xuICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24ucGFnZSkge1xuICAgICAgLy8gRmFsbGJhY2sgY2FzZTsgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkuXG4gICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBgcGFnZT0ke2Rlc3RpbmF0aW9uLnBhZ2V9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIGN1cnJlbnQgYFBERkhpc3RvcnlgIGluc3RhbmNlLCBhbmQgY29uc2VxdWVudGx5IHByZXZlbnQgYW55XG4gICAqIGZ1cnRoZXIgdXBkYXRlcyBhbmQvb3IgbmF2aWdhdGlvbiBvZiB0aGUgYnJvd3NlciBoaXN0b3J5LlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl9wYWdlSGlkZSgpOyAvLyBTaW11bGF0ZSBhICdwYWdlaGlkZScgZXZlbnQgd2hlbiByZXNldHRpbmcuXG5cbiAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB0aGlzLl91bmJpbmRFdmVudHMoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCk7XG4gICAgICB0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBudWxsO1xuICAgIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhbiBpbnRlcm5hbCBkZXN0aW5hdGlvbiB0byB0aGUgYnJvd3NlciBoaXN0b3J5LlxuICAgKiBAcGFyYW0ge1B1c2hQYXJhbWV0ZXJzfVxuICAgKi9cbiAgcHVzaCh7IG5hbWVkRGVzdCA9IG51bGwsIGV4cGxpY2l0RGVzdCwgcGFnZU51bWJlciB9KSB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZWREZXN0ICYmIHR5cGVvZiBuYW1lZERlc3QgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiUERGSGlzdG9yeS5wdXNoOiBcIiArXG4gICAgICAgICAgYFwiJHtuYW1lZERlc3R9XCIgaXMgbm90IGEgdmFsaWQgbmFtZWREZXN0IHBhcmFtZXRlci5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoZXhwbGljaXREZXN0KSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJQREZIaXN0b3J5LnB1c2g6IFwiICtcbiAgICAgICAgICBgXCIke2V4cGxpY2l0RGVzdH1cIiBpcyBub3QgYSB2YWxpZCBleHBsaWNpdERlc3QgcGFyYW1ldGVyLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICEoXG4gICAgICAgIE51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikgJiZcbiAgICAgICAgcGFnZU51bWJlciA+IDAgJiZcbiAgICAgICAgcGFnZU51bWJlciA8PSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2VzQ291bnRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIC8vIEFsbG93IGFuIHVuc2V0IGBwYWdlTnVtYmVyYCBpZiBhbmQgb25seSBpZiB0aGUgaGlzdG9yeSBpcyBzdGlsbCBlbXB0eTtcbiAgICAgIC8vIHBsZWFzZSByZWZlciB0byB0aGUgYHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgPSBudWxsO2AgY29tbWVudCBhYm92ZS5cbiAgICAgIGlmIChwYWdlTnVtYmVyICE9PSBudWxsIHx8IHRoaXMuX2Rlc3RpbmF0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJQREZIaXN0b3J5LnB1c2g6IFwiICtcbiAgICAgICAgICAgIGBcIiR7cGFnZU51bWJlcn1cIiBpcyBub3QgYSB2YWxpZCBwYWdlTnVtYmVyIHBhcmFtZXRlci5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYXNoID0gbmFtZWREZXN0IHx8IEpTT04uc3RyaW5naWZ5KGV4cGxpY2l0RGVzdCk7XG4gICAgaWYgKCFoYXNoKSB7XG4gICAgICAvLyBUaGUgaGFzaCAqc2hvdWxkKiBuZXZlciBiZSB1bmRlZmluZWQsIGJ1dCBpZiB0aGF0IHdlcmUgdG8gb2NjdXIsXG4gICAgICAvLyBhdm9pZCBhbnkgcG9zc2libGUgaXNzdWVzIGJ5IG5vdCB1cGRhdGluZyB0aGUgYnJvd3NlciBoaXN0b3J5LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVJlcGxhY2UgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbiAmJlxuICAgICAgKGlzRGVzdEhhc2hlc0VxdWFsKHRoaXMuX2Rlc3RpbmF0aW9uLmhhc2gsIGhhc2gpIHx8XG4gICAgICAgIGlzRGVzdEFycmF5c0VxdWFsKHRoaXMuX2Rlc3RpbmF0aW9uLmRlc3QsIGV4cGxpY2l0RGVzdCkpXG4gICAgKSB7XG4gICAgICAvLyBXaGVuIHRoZSBuZXcgZGVzdGluYXRpb24gaXMgaWRlbnRpY2FsIHRvIGB0aGlzLl9kZXN0aW5hdGlvbmAsIGFuZFxuICAgICAgLy8gaXRzIGBwYWdlYCBpcyB1bmRlZmluZWQsIHJlcGxhY2UgdGhlIGN1cnJlbnQgYnJvd3NlciBoaXN0b3J5IGVudHJ5LlxuICAgICAgLy8gTk9URTogVGhpcyBjYW4gb25seSBvY2N1ciBpZiBgdGhpcy5fZGVzdGluYXRpb25gIHdhcyBzZXQgZWl0aGVyOlxuICAgICAgLy8gIC0gdGhyb3VnaCB0aGUgZG9jdW1lbnQgaGFzaCBiZWluZyBzcGVjaWZpZWQgb24gbG9hZC5cbiAgICAgIC8vICAtIHRocm91Z2ggdGhlIHVzZXIgY2hhbmdpbmcgdGhlIGhhc2ggb2YgdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yY2VSZXBsYWNlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyAmJiAhZm9yY2VSZXBsYWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKFxuICAgICAge1xuICAgICAgICBkZXN0OiBleHBsaWNpdERlc3QsXG4gICAgICAgIGhhc2gsXG4gICAgICAgIHBhZ2U6IHBhZ2VOdW1iZXIsXG4gICAgICAgIHJvdGF0aW9uOiB0aGlzLmxpbmtTZXJ2aWNlLnJvdGF0aW9uLFxuICAgICAgfSxcbiAgICAgIGZvcmNlUmVwbGFjZVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcykge1xuICAgICAgLy8gUHJldmVudCB0aGUgYnJvd3NlciBoaXN0b3J5IGZyb20gdXBkYXRpbmcgd2hpbGUgdGhlIG5ldyBkZXN0aW5hdGlvbiBpc1xuICAgICAgLy8gYmVpbmcgc2Nyb2xsZWQgaW50byB2aWV3LCB0byBhdm9pZCBwb3RlbnRpYWxseSBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gICAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgLy8gV2UgZGVmZXIgdGhlIHJlc2V0dGluZyBvZiBgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzYCwgdG8gYWNjb3VudCBmb3JcbiAgICAgIC8vIGUuZy4gem9vbWluZyBvY2N1cmluZyB3aGVuIHRoZSBuZXcgZGVzdGluYXRpb24gaXMgYmVpbmcgbmF2aWdhdGVkIHRvLlxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1c2ggdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICovXG4gIHB1c2hDdXJyZW50UG9zaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdvIGJhY2sgb25lIHN0ZXAgaW4gdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICogTk9URTogQXZvaWRzIG5hdmlnYXRpbmcgYXdheSBmcm9tIHRoZSBkb2N1bWVudCwgdXNlZnVsIGZvciBcIm5hbWVkIGFjdGlvbnNcIi5cbiAgICovXG4gIGJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTtcbiAgICBpZiAodGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlKSAmJiBzdGF0ZS51aWQgPiAwKSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdvIGZvcndhcmQgb25lIHN0ZXAgaW4gdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICogTk9URTogQXZvaWRzIG5hdmlnYXRpbmcgYXdheSBmcm9tIHRoZSBkb2N1bWVudCwgdXNlZnVsIGZvciBcIm5hbWVkIGFjdGlvbnNcIi5cbiAgICovXG4gIGZvcndhcmQoKSB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTtcbiAgICBpZiAodGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlKSAmJiBzdGF0ZS51aWQgPCB0aGlzLl9tYXhVaWQpIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LmZvcndhcmQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59IEluZGljYXRpbmcgaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IG1vdmluZyB0aHJvdWdoIHRoZVxuICAgKiAgIGJyb3dzZXIgaGlzdG9yeSwgdXNlZnVsIGUuZy4gZm9yIHNraXBwaW5nIHRoZSBuZXh0ICdoYXNoY2hhbmdlJyBldmVudC5cbiAgICovXG4gIGdldCBwb3BTdGF0ZUluUHJvZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkICYmXG4gICAgICAodGhpcy5fcG9wU3RhdGVJblByb2dyZXNzIHx8IHRoaXMuX2Jsb2NrSGFzaENoYW5nZSA+IDApXG4gICAgKTtcbiAgfVxuXG4gIGdldCBpbml0aWFsQm9va21hcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkID8gdGhpcy5faW5pdGlhbEJvb2ttYXJrIDogbnVsbDtcbiAgfVxuXG4gIGdldCBpbml0aWFsUm90YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkID8gdGhpcy5faW5pdGlhbFJvdGF0aW9uIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3B1c2hPclJlcGxhY2VTdGF0ZShkZXN0aW5hdGlvbiwgZm9yY2VSZXBsYWNlID0gZmFsc2UpIHtcbiAgICBjb25zdCBzaG91bGRSZXBsYWNlID0gZm9yY2VSZXBsYWNlIHx8ICF0aGlzLl9kZXN0aW5hdGlvbjtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgIGZpbmdlcnByaW50OiB0aGlzLl9maW5nZXJwcmludCxcbiAgICAgIHVpZDogc2hvdWxkUmVwbGFjZSA/IHRoaXMuX3VpZCA6IHRoaXMuX3VpZCArIDEsXG4gICAgICBkZXN0aW5hdGlvbixcbiAgICB9O1xuXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICBQREZKU0Rldi50ZXN0KFwiQ0hST01FXCIpICYmXG4gICAgICB3aW5kb3cuaGlzdG9yeS5zdGF0ZSAmJlxuICAgICAgd2luZG93Lmhpc3Rvcnkuc3RhdGUuY2hyb21lY29tU3RhdGVcbiAgICApIHtcbiAgICAgIC8vIGhpc3Rvcnkuc3RhdGUuY2hyb21lY29tU3RhdGUgaXMgbWFuYWdlZCBieSBjaHJvbWVjb20uanMuXG4gICAgICBuZXdTdGF0ZS5jaHJvbWVjb21TdGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnN0YXRlLmNocm9tZWNvbVN0YXRlO1xuICAgIH1cbiAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKGRlc3RpbmF0aW9uLCBuZXdTdGF0ZS51aWQpO1xuXG4gICAgbGV0IG5ld1VybDtcbiAgICBpZiAodGhpcy5fdXBkYXRlVXJsICYmIGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLmhhc2gpIHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiI1wiKVswXTtcbiAgICAgIC8vIFByZXZlbnQgZXJyb3JzIGluIEZpcmVmb3guXG4gICAgICBpZiAoIWJhc2VVcmwuc3RhcnRzV2l0aChcImZpbGU6Ly9cIikpIHtcbiAgICAgICAgbmV3VXJsID0gYCR7YmFzZVVybH0jJHtkZXN0aW5hdGlvbi5oYXNofWA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRSZXBsYWNlKSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobmV3U3RhdGUsIFwiXCIsIG5ld1VybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21heFVpZCA9IHRoaXMuX3VpZDtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShuZXdTdGF0ZSwgXCJcIiwgbmV3VXJsKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIFBERkpTRGV2LnRlc3QoXCJDSFJPTUVcIikgJiZcbiAgICAgIHRvcCA9PT0gd2luZG93XG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKFwic2hvd1BhZ2VBY3Rpb25cIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbih0ZW1wb3JhcnkgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy5fcG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5fcG9zaXRpb247XG4gICAgaWYgKHRlbXBvcmFyeSkge1xuICAgICAgcG9zaXRpb24gPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuX3Bvc2l0aW9uKTtcbiAgICAgIHBvc2l0aW9uLnRlbXBvcmFyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9kZXN0aW5hdGlvbikge1xuICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHBvc2l0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rlc3RpbmF0aW9uLnRlbXBvcmFyeSkge1xuICAgICAgLy8gQWx3YXlzIHJlcGxhY2UgYSBwcmV2aW91cyAqdGVtcG9yYXJ5KiBwb3NpdGlvbi5cbiAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShwb3NpdGlvbiwgLyogZm9yY2VSZXBsYWNlID0gKi8gdHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5oYXNoID09PSBwb3NpdGlvbi5oYXNoKSB7XG4gICAgICByZXR1cm47IC8vIFRoZSBjdXJyZW50IGRvY3VtZW50IHBvc2l0aW9uIGhhcyBub3QgY2hhbmdlZC5cbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgJiZcbiAgICAgIChQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRCA8PSAwIHx8XG4gICAgICAgIHRoaXMuX251bVBvc2l0aW9uVXBkYXRlcyA8PSBQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRClcbiAgICApIHtcbiAgICAgIC8vIGB0aGlzLl9kZXN0aW5hdGlvbmAgd2FzIHNldCB0aHJvdWdoIHRoZSB1c2VyIGNoYW5naW5nIHRoZSBoYXNoIG9mXG4gICAgICAvLyB0aGUgZG9jdW1lbnQuIERvIG5vdCBhZGQgYHRoaXMuX3Bvc2l0aW9uYCB0byB0aGUgYnJvd3NlciBoaXN0b3J5LFxuICAgICAgLy8gdG8gYXZvaWQgXCJmbG9vZGluZ1wiIGl0IHdpdGggbG90cyBvZiAobmVhcmx5KSBpZGVudGljYWwgZW50cmllcyxcbiAgICAgIC8vIHNpbmNlIHdlIGNhbm5vdCBlbnN1cmUgdGhhdCB0aGUgZG9jdW1lbnQgcG9zaXRpb24gaGFzIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGZvcmNlUmVwbGFjZSA9IGZhbHNlO1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgPj0gcG9zaXRpb24uZmlyc3QgJiZcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgPD0gcG9zaXRpb24ucGFnZVxuICAgICkge1xuICAgICAgLy8gV2hlbiB0aGUgYHBhZ2VgIG9mIGB0aGlzLl9kZXN0aW5hdGlvbmAgaXMgc3RpbGwgdmlzaWJsZSwgZG8gbm90XG4gICAgICAvLyB1cGRhdGUgdGhlIGJyb3dzaW5nIGhpc3Rvcnkgd2hlbiBgdGhpcy5fZGVzdGluYXRpb25gIGVpdGhlcjpcbiAgICAgIC8vICAtIGNvbnRhaW5zIGFuIGludGVybmFsIGRlc3RpbmF0aW9uLCBzaW5jZSBpbiB0aGlzIGNhc2Ugd2VcbiAgICAgIC8vICAgIGNhbm5vdCBlbnN1cmUgdGhhdCB0aGUgZG9jdW1lbnQgcG9zaXRpb24gaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG4gICAgICAvLyAgLSB3YXMgc2V0IHRocm91Z2ggdGhlIHVzZXIgY2hhbmdpbmcgdGhlIGhhc2ggb2YgdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKHRoaXMuX2Rlc3RpbmF0aW9uLmRlc3QgfHwgIXRoaXMuX2Rlc3RpbmF0aW9uLmZpcnN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRvIGF2b2lkIFwiZmxvb2RpbmdcIiB0aGUgYnJvd3NlciBoaXN0b3J5LCByZXBsYWNlIHRoZSBjdXJyZW50IGVudHJ5LlxuICAgICAgZm9yY2VSZXBsYWNlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHBvc2l0aW9uLCBmb3JjZVJlcGxhY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaXNWYWxpZFN0YXRlKHN0YXRlLCBjaGVja1JlbG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZmluZ2VycHJpbnQgIT09IHRoaXMuX2ZpbmdlcnByaW50KSB7XG4gICAgICBpZiAoY2hlY2tSZWxvYWQpIHtcbiAgICAgICAgLy8gUG90ZW50aWFsbHkgYWNjZXB0IHRoZSBoaXN0b3J5IGVudHJ5LCBldmVuIGlmIHRoZSBmaW5nZXJwcmludHMgZG9uJ3RcbiAgICAgICAgLy8gbWF0Y2gsIHdoZW4gdGhlIHZpZXdlciB3YXMgcmVsb2FkZWQgKHNlZSBpc3N1ZSA2ODQ3KS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiBzdGF0ZS5maW5nZXJwcmludCAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgIHN0YXRlLmZpbmdlcnByaW50Lmxlbmd0aCAhPT0gdGhpcy5fZmluZ2VycHJpbnQubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbcGVyZkVudHJ5XSA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoXCJuYXZpZ2F0aW9uXCIpO1xuICAgICAgICBpZiAoIXBlcmZFbnRyeSB8fCBwZXJmRW50cnkudHlwZSAhPT0gXCJyZWxvYWRcIikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBvY2N1ciBpbiB2aWV3ZXJzIHdpdGggc3VwcG9ydCBmb3Igb3BlbmluZyBtb3JlIHRoYW5cbiAgICAgICAgLy8gb25lIFBERiBkb2N1bWVudCwgZS5nLiB0aGUgR0VORVJJQyB2aWV3ZXIuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHN0YXRlLnVpZCkgfHwgc3RhdGUudWlkIDwgMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZGVzdGluYXRpb24gPT09IG51bGwgfHwgdHlwZW9mIHN0YXRlLmRlc3RpbmF0aW9uICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlSW50ZXJuYWxTdGF0ZShkZXN0aW5hdGlvbiwgdWlkLCByZW1vdmVUZW1wb3JhcnkgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpIHtcbiAgICAgIC8vIFdoZW4gdXBkYXRpbmcgYHRoaXMuX2Rlc3RpbmF0aW9uYCwgbWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIHdhaXQgZm9yXG4gICAgICAvLyB0aGUgbmV4dCAndXBkYXRldmlld2FyZWEnIGV2ZW50IGJlZm9yZSAocG90ZW50aWFsbHkpIGF0dGVtcHRpbmcgdG9cbiAgICAgIC8vIHB1c2ggdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpO1xuICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHJlbW92ZVRlbXBvcmFyeSAmJiBkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHtcbiAgICAgIC8vIFdoZW4gdGhlIGBkZXN0aW5hdGlvbmAgY29tZXMgZnJvbSB0aGUgYnJvd3NlciBoaXN0b3J5LFxuICAgICAgLy8gd2Ugbm8gbG9uZ2VyIHRyZWF0IGl0IGFzIGEgKnRlbXBvcmFyeSogcG9zaXRpb24uXG4gICAgICBkZWxldGUgZGVzdGluYXRpb24udGVtcG9yYXJ5O1xuICAgIH1cbiAgICB0aGlzLl9kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICAgIHRoaXMuX3VpZCA9IHVpZDtcbiAgICAvLyBUaGlzIHNob3VsZCBhbHdheXMgYmUgcmVzZXQgd2hlbiBgdGhpcy5fZGVzdGluYXRpb25gIGlzIHVwZGF0ZWQuXG4gICAgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BhcnNlQ3VycmVudEhhc2goY2hlY2tOYW1lZGRlc3QgPSBmYWxzZSkge1xuICAgIGNvbnN0IGhhc2ggPSB1bmVzY2FwZShnZXRDdXJyZW50SGFzaCgpKS5zdWJzdHJpbmcoMSk7XG4gICAgY29uc3QgcGFyYW1zID0gcGFyc2VRdWVyeVN0cmluZyhoYXNoKTtcblxuICAgIGNvbnN0IG5hbWVkZGVzdCA9IHBhcmFtcy5uYW1lZGRlc3QgfHwgXCJcIjtcbiAgICBsZXQgcGFnZSA9IHBhcmFtcy5wYWdlIHwgMDtcblxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIE51bWJlci5pc0ludGVnZXIocGFnZSkgJiZcbiAgICAgICAgcGFnZSA+IDAgJiZcbiAgICAgICAgcGFnZSA8PSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2VzQ291bnRcbiAgICAgICkgfHxcbiAgICAgIChjaGVja05hbWVkZGVzdCAmJiBuYW1lZGRlc3QubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIHBhZ2UgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4geyBoYXNoLCBwYWdlLCByb3RhdGlvbjogdGhpcy5saW5rU2VydmljZS5yb3RhdGlvbiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlVmlld2FyZWEoeyBsb2NhdGlvbiB9KSB7XG4gICAgaWYgKHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCk7XG4gICAgICB0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX3Bvc2l0aW9uID0ge1xuICAgICAgaGFzaDogdGhpcy5faXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGVcbiAgICAgICAgPyBgcGFnZT0ke2xvY2F0aW9uLnBhZ2VOdW1iZXJ9YFxuICAgICAgICA6IGxvY2F0aW9uLnBkZk9wZW5QYXJhbXMuc3Vic3RyaW5nKDEpLFxuICAgICAgcGFnZTogdGhpcy5saW5rU2VydmljZS5wYWdlLFxuICAgICAgZmlyc3Q6IGxvY2F0aW9uLnBhZ2VOdW1iZXIsXG4gICAgICByb3RhdGlvbjogbG9jYXRpb24ucm90YXRpb24sXG4gICAgfTtcblxuICAgIGlmICh0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRCA+IDAgJiZcbiAgICAgIHRoaXMuX2lzUGFnZXNMb2FkZWQgJiZcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uICYmXG4gICAgICAhdGhpcy5fZGVzdGluYXRpb24ucGFnZVxuICAgICkge1xuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZGVzdGluYXRpb24gd2FzIHNldCB0aHJvdWdoIHRoZSB1c2VyIGNoYW5naW5nIHRoZSBoYXNoXG4gICAgICAvLyBvZiB0aGUgZG9jdW1lbnQsIHdlIHdpbGwgdXN1YWxseSBub3QgdHJ5IHRvIHB1c2ggdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgIC8vIHRvIHRoZSBicm93c2VyIGhpc3Rvcnk7IHNlZSBgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpYC5cbiAgICAgIC8vXG4gICAgICAvLyBUbyBwcmV2ZW50IGB0aGlzLl90cnlQdXNoQ3VycmVudFBvc2l0aW9uKClgIGZyb20gZWZmZWN0aXZlbHkgYmVpbmdcbiAgICAgIC8vIHJlZHVjZWQgdG8gYSBuby1vcCBpbiB0aGlzIGNhc2UsIHdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIHBvc2l0aW9uXG4gICAgICAvLyAqZGlkKiBpbiBmYWN0IGNoYW5nZSBpZiB0aGUgJ3VwZGF0ZXZpZXdhcmVhJyBldmVudCB3YXMgZGlzcGF0Y2hlZFxuICAgICAgLy8gbW9yZSB0aGFuIGBQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRGAgdGltZXMuXG4gICAgICB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMrKztcbiAgICB9XG5cbiAgICBpZiAoVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVQgPiAwKSB7XG4gICAgICAvLyBXaGVuIGNsb3NpbmcgdGhlIGJyb3dzZXIsIGEgJ3BhZ2VoaWRlJyBldmVudCB3aWxsIGJlIGRpc3BhdGNoZWQgd2hpY2hcbiAgICAgIC8vICpzaG91bGQqIGFsbG93IHVzIHRvIHB1c2ggdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICAgIC8vIEluIHByYWN0aWNlLCBpdCBzZWVtcyB0aGF0IHRoZSBldmVudCBpcyBhcnJpdmluZyB0b28gbGF0ZSBpbiBvcmRlciBmb3JcbiAgICAgIC8vIHRoZSBzZXNzaW9uIGhpc3RvcnkgdG8gYmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICAvLyAoRm9yIGFkZGl0aW9uYWwgZGV0YWlscywgcGxlYXNlIHJlZmVyIHRvIHRoZSBkaXNjdXNzaW9uIGluXG4gICAgICAvLyAgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MzM5My4pXG4gICAgICAvL1xuICAgICAgLy8gVG8gd29ya2Fyb3VuZCB0aGlzIHdlIGF0dGVtcHQgdG8gKnRlbXBvcmFyaWx5KiBhZGQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgIC8vIHRvIHRoZSBicm93c2VyIGhpc3Rvcnkgb25seSB3aGVuIHRoZSB2aWV3ZXIgaXMgKmlkbGUqLFxuICAgICAgLy8gaS5lLiB3aGVuIHNjcm9sbGluZyBhbmQvb3Igem9vbWluZyBkb2VzIG5vdCBvY2N1ci5cbiAgICAgIC8vXG4gICAgICAvLyBQTEVBU0UgTk9URTogSXQncyBhYnNvbHV0ZWx5IGltcGVyYXRpdmUgdGhhdCB0aGUgYnJvd3NlciBoaXN0b3J5IGlzXG4gICAgICAvLyAqbm90KiB1cGRhdGVkIHRvbyBvZnRlbiwgc2luY2UgdGhhdCB3b3VsZCByZW5kZXIgdGhlIHZpZXdlciBtb3JlIG9yXG4gICAgICAvLyBsZXNzIHVudXNhYmxlLiBIZW5jZSB0aGUgdXNlIG9mIGEgdGltZW91dCB0byBkZWxheSB0aGUgdXBkYXRlIHVudGlsXG4gICAgICAvLyB0aGUgdmlld2VyIGhhcyBiZWVuIGlkbGUgZm9yIGBVUERBVEVfVklFV0FSRUFfVElNRU9VVGAgbWlsbGlzZWNvbmRzLlxuICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7XG4gICAgICAgICAgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigvKiB0ZW1wb3JhcnkgPSAqLyB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQgPSBudWxsO1xuICAgICAgfSwgVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BvcFN0YXRlKHsgc3RhdGUgfSkge1xuICAgIGNvbnN0IG5ld0hhc2ggPSBnZXRDdXJyZW50SGFzaCgpLFxuICAgICAgaGFzaENoYW5nZWQgPSB0aGlzLl9jdXJyZW50SGFzaCAhPT0gbmV3SGFzaDtcbiAgICB0aGlzLl9jdXJyZW50SGFzaCA9IG5ld0hhc2g7XG5cbiAgICBpZiAoXG4gICAgICAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCJDSFJPTUVcIikgJiZcbiAgICAgICAgc3RhdGUgJiZcbiAgICAgICAgc3RhdGUuY2hyb21lY29tU3RhdGUgJiZcbiAgICAgICAgIXRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSkpIHx8XG4gICAgICAhc3RhdGVcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgY2FzZSBjb3JyZXNwb25kcyB0byB0aGUgdXNlciBjaGFuZ2luZyB0aGUgaGFzaCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICB0aGlzLl91aWQrKztcblxuICAgICAgY29uc3QgeyBoYXNoLCBwYWdlLCByb3RhdGlvbiB9ID0gdGhpcy5fcGFyc2VDdXJyZW50SGFzaCgpO1xuICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKFxuICAgICAgICB7IGhhc2gsIHBhZ2UsIHJvdGF0aW9uIH0sXG4gICAgICAgIC8qIGZvcmNlUmVwbGFjZSA9ICovIHRydWVcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlKSkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBvY2N1ciBpbiB2aWV3ZXJzIHdpdGggc3VwcG9ydCBmb3Igb3BlbmluZyBtb3JlIHRoYW5cbiAgICAgIC8vIG9uZSBQREYgZG9jdW1lbnQsIGUuZy4gdGhlIEdFTkVSSUMgdmlld2VyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgdGhlIGJyb3dzZXIgaGlzdG9yeSBmcm9tIHVwZGF0aW5nIHVudGlsIHRoZSBuZXcgZGVzdGluYXRpb24sXG4gICAgLy8gYXMgc3RvcmVkIGluIHRoZSBicm93c2VyIGhpc3RvcnksIGhhcyBiZWVuIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgaWYgKGhhc2hDaGFuZ2VkKSB7XG4gICAgICAvLyBXaGVuIHRoZSBoYXNoIGNoYW5nZWQsIGltcGx5aW5nIHRoYXQgdGhlICdwb3BzdGF0ZScgZXZlbnQgd2lsbCBiZVxuICAgICAgLy8gZm9sbG93ZWQgYnkgYSAnaGFzaGNoYW5nZScgZXZlbnQsIHRoZW4gd2UgZG8gKm5vdCogd2FudCB0byB1cGRhdGUgdGhlXG4gICAgICAvLyBicm93c2VyIGhpc3Rvcnkgd2hlbiBoYW5kbGluZyB0aGUgJ2hhc2hjaGFuZ2UnIGV2ZW50IChpbiB3ZWIvYXBwLmpzKVxuICAgICAgLy8gc2luY2UgdGhhdCB3b3VsZCAqb3ZlcndyaXRlKiB0aGUgbmV3IGRlc3RpbmF0aW9uIG5hdmlnYXRlZCB0byBiZWxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBUbyBhdm9pZCBhY2NpZGVudGFsbHkgZGlzYWJsaW5nIGFsbCBmdXR1cmUgdXNlci1pbml0aWF0ZWQgaGFzaCBjaGFuZ2VzLFxuICAgICAgLy8gaWYgdGhlcmUncyBlLmcuIGFub3RoZXIgJ2hhc2hjaGFuZ2UnIGxpc3RlbmVyIHRoYXQgc3RvcHMgdGhlIGV2ZW50XG4gICAgICAvLyBwcm9wYWdhdGlvbiwgd2UgbWFrZSBzdXJlIHRvIGFsd2F5cyBmb3JjZS1yZXNldCBgdGhpcy5fYmxvY2tIYXNoQ2hhbmdlYFxuICAgICAgLy8gYWZ0ZXIgYEhBU0hfQ0hBTkdFX1RJTUVPVVRgIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZC5cbiAgICAgIHRoaXMuX2Jsb2NrSGFzaENoYW5nZSsrO1xuICAgICAgd2FpdE9uRXZlbnRPclRpbWVvdXQoe1xuICAgICAgICB0YXJnZXQ6IHdpbmRvdyxcbiAgICAgICAgbmFtZTogXCJoYXNoY2hhbmdlXCIsXG4gICAgICAgIGRlbGF5OiBIQVNIX0NIQU5HRV9USU1FT1VULFxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Jsb2NrSGFzaENoYW5nZS0tO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTmF2aWdhdGUgdG8gdGhlIG5ldyBkZXN0aW5hdGlvbi5cbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHN0YXRlLmRlc3RpbmF0aW9uO1xuICAgIHRoaXMuX3VwZGF0ZUludGVybmFsU3RhdGUoXG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIHN0YXRlLnVpZCxcbiAgICAgIC8qIHJlbW92ZVRlbXBvcmFyeSA9ICovIHRydWVcbiAgICApO1xuICAgIGlmICh0aGlzLl91aWQgPiB0aGlzLl9tYXhVaWQpIHtcbiAgICAgIHRoaXMuX21heFVpZCA9IHRoaXMuX3VpZDtcbiAgICB9XG5cbiAgICBpZiAoaXNWYWxpZFJvdGF0aW9uKGRlc3RpbmF0aW9uLnJvdGF0aW9uKSkge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5yb3RhdGlvbiA9IGRlc3RpbmF0aW9uLnJvdGF0aW9uO1xuICAgIH1cbiAgICBpZiAoZGVzdGluYXRpb24uZGVzdCkge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5uYXZpZ2F0ZVRvKGRlc3RpbmF0aW9uLmRlc3QpO1xuICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uaGFzaCkge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5zZXRIYXNoKGRlc3RpbmF0aW9uLmhhc2gpO1xuICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24ucGFnZSkge1xuICAgICAgLy8gRmFsbGJhY2sgY2FzZTsgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkuXG4gICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSBkZXN0aW5hdGlvbi5wYWdlO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIGBQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvYCBpcyBhc3luY2hyb25vdXMsIHdlIHRodXMgZGVmZXIgdGhlXG4gICAgLy8gcmVzZXR0aW5nIG9mIGB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3NgIHNsaWdodGx5LlxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYWdlSGlkZSgpIHtcbiAgICAvLyBBdHRlbXB0IHRvIHB1c2ggdGhlIGB0aGlzLl9wb3NpdGlvbmAgaW50byB0aGUgYnJvd3NlciBoaXN0b3J5IHdoZW5cbiAgICAvLyBuYXZpZ2F0aW5nIGF3YXkgZnJvbSB0aGUgZG9jdW1lbnQuIFRoaXMgaXMgKm9ubHkqIGRvbmUgaWYgdGhlIGhpc3RvcnlcbiAgICAvLyBpcyBlbXB0eS90ZW1wb3JhcnksIHNpbmNlIG90aGVyd2lzZSBhbiBleGlzdGluZyBicm93c2VyIGhpc3RvcnkgZW50cnlcbiAgICAvLyB3aWxsIGVuZCB1cCBiZWluZyBvdmVyd3JpdHRlbiAoZ2l2ZW4gdGhhdCBuZXcgZW50cmllcyBjYW5ub3QgYmUgcHVzaGVkXG4gICAgLy8gaW50byB0aGUgYnJvd3NlciBoaXN0b3J5IHdoZW4gdGhlICd1bmxvYWQnIGV2ZW50IGhhcyBhbHJlYWR5IGZpcmVkKS5cbiAgICBpZiAoIXRoaXMuX2Rlc3RpbmF0aW9uIHx8IHRoaXMuX2Rlc3RpbmF0aW9uLnRlbXBvcmFyeSkge1xuICAgICAgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2JpbmRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuX2JvdW5kRXZlbnRzKSB7XG4gICAgICByZXR1cm47IC8vIFRoZSBldmVudCBsaXN0ZW5lcnMgd2VyZSBhbHJlYWR5IGFkZGVkLlxuICAgIH1cbiAgICB0aGlzLl9ib3VuZEV2ZW50cyA9IHtcbiAgICAgIHVwZGF0ZVZpZXdhcmVhOiB0aGlzLl91cGRhdGVWaWV3YXJlYS5iaW5kKHRoaXMpLFxuICAgICAgcG9wU3RhdGU6IHRoaXMuX3BvcFN0YXRlLmJpbmQodGhpcyksXG4gICAgICBwYWdlSGlkZTogdGhpcy5fcGFnZUhpZGUuYmluZCh0aGlzKSxcbiAgICB9O1xuXG4gICAgdGhpcy5ldmVudEJ1cy5fb24oXCJ1cGRhdGV2aWV3YXJlYVwiLCB0aGlzLl9ib3VuZEV2ZW50cy51cGRhdGVWaWV3YXJlYSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9ib3VuZEV2ZW50cy5wb3BTdGF0ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCB0aGlzLl9ib3VuZEV2ZW50cy5wYWdlSGlkZSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91bmJpbmRFdmVudHMoKSB7XG4gICAgaWYgKCF0aGlzLl9ib3VuZEV2ZW50cykge1xuICAgICAgcmV0dXJuOyAvLyBUaGUgZXZlbnQgbGlzdGVuZXJzIHdlcmUgYWxyZWFkeSByZW1vdmVkLlxuICAgIH1cbiAgICB0aGlzLmV2ZW50QnVzLl9vZmYoXCJ1cGRhdGV2aWV3YXJlYVwiLCB0aGlzLl9ib3VuZEV2ZW50cy51cGRhdGVWaWV3YXJlYSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9ib3VuZEV2ZW50cy5wb3BTdGF0ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCB0aGlzLl9ib3VuZEV2ZW50cy5wYWdlSGlkZSk7XG5cbiAgICB0aGlzLl9ib3VuZEV2ZW50cyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNEZXN0SGFzaGVzRXF1YWwoZGVzdEhhc2gsIHB1c2hIYXNoKSB7XG4gIGlmICh0eXBlb2YgZGVzdEhhc2ggIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHB1c2hIYXNoICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChkZXN0SGFzaCA9PT0gcHVzaEhhc2gpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCB7IG5hbWVkZGVzdCB9ID0gcGFyc2VRdWVyeVN0cmluZyhkZXN0SGFzaCk7XG4gIGlmIChuYW1lZGRlc3QgPT09IHB1c2hIYXNoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0Rlc3RBcnJheXNFcXVhbChmaXJzdERlc3QsIHNlY29uZERlc3QpIHtcbiAgZnVuY3Rpb24gaXNFbnRyeUVxdWFsKGZpcnN0LCBzZWNvbmQpIHtcbiAgICBpZiAodHlwZW9mIGZpcnN0ICE9PSB0eXBlb2Ygc2Vjb25kKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGZpcnN0KSB8fCBBcnJheS5pc0FycmF5KHNlY29uZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZpcnN0ICE9PSBudWxsICYmIHR5cGVvZiBmaXJzdCA9PT0gXCJvYmplY3RcIiAmJiBzZWNvbmQgIT09IG51bGwpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmaXJzdCkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzZWNvbmQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaXJzdCkge1xuICAgICAgICBpZiAoIWlzRW50cnlFcXVhbChmaXJzdFtrZXldLCBzZWNvbmRba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3QgPT09IHNlY29uZCB8fCAoTnVtYmVyLmlzTmFOKGZpcnN0KSAmJiBOdW1iZXIuaXNOYU4oc2Vjb25kKSk7XG4gIH1cblxuICBpZiAoIShBcnJheS5pc0FycmF5KGZpcnN0RGVzdCkgJiYgQXJyYXkuaXNBcnJheShzZWNvbmREZXN0KSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGZpcnN0RGVzdC5sZW5ndGggIT09IHNlY29uZERlc3QubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwLCBpaSA9IGZpcnN0RGVzdC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgaWYgKCFpc0VudHJ5RXF1YWwoZmlyc3REZXN0W2ldLCBzZWNvbmREZXN0W2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IHsgUERGSGlzdG9yeSwgaXNEZXN0SGFzaGVzRXF1YWwsIGlzRGVzdEFycmF5c0VxdWFsIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXBwcm94aW1hdGVGcmFjdGlvbixcbiAgQ1NTX1VOSVRTLFxuICBERUZBVUxUX1NDQUxFLFxuICBnZXRPdXRwdXRTY2FsZSxcbiAgTnVsbEwxMG4sXG4gIFJlbmRlcmVyVHlwZSxcbiAgcm91bmRUb0RpdmlkZSxcbiAgVGV4dExheWVyTW9kZSxcbn0gZnJvbSBcIi4vdWlfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24sXG4gIFNWR0dyYXBoaWNzLFxufSBmcm9tIFwicGRmanMtbGliXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdTdGF0ZXMgfSBmcm9tIFwiLi9wZGZfcmVuZGVyaW5nX3F1ZXVlLmpzXCI7XG5pbXBvcnQgeyB2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zIH0gZnJvbSBcIi4vdmlld2VyX2NvbXBhdGliaWxpdHkuanNcIjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQREZQYWdlVmlld09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lciAtIFRoZSB2aWV3ZXIgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRCdXN9IGV2ZW50QnVzIC0gVGhlIGFwcGxpY2F0aW9uIGV2ZW50IGJ1cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZCAtIFRoZSBwYWdlIHVuaXF1ZSBJRCAobm9ybWFsbHkgaXRzIG51bWJlcikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2NhbGUgLSBUaGUgcGFnZSBzY2FsZSBkaXNwbGF5LlxuICogQHByb3BlcnR5IHtQYWdlVmlld3BvcnR9IGRlZmF1bHRWaWV3cG9ydCAtIFRoZSBwYWdlIHZpZXdwb3J0LlxuICogQHByb3BlcnR5IHtBbm5vdGF0aW9uU3RvcmFnZX0gW2Fubm90YXRpb25TdG9yYWdlXSAtIFN0b3JhZ2UgZm9yIGFubm90YXRpb25cbiAqICAgZGF0YSBpbiBmb3Jtcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLlxuICogQHByb3BlcnR5IHtQcm9taXNlPE9wdGlvbmFsQ29udGVudENvbmZpZz59IFtvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlXSAtXG4gKiAgIEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4ge0BsaW5rIE9wdGlvbmFsQ29udGVudENvbmZpZ30gaW5zdGFuY2UuXG4gKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC5cbiAqIEBwcm9wZXJ0eSB7UERGUmVuZGVyaW5nUXVldWV9IHJlbmRlcmluZ1F1ZXVlIC0gVGhlIHJlbmRlcmluZyBxdWV1ZSBvYmplY3QuXG4gKiBAcHJvcGVydHkge0lQREZUZXh0TGF5ZXJGYWN0b3J5fSB0ZXh0TGF5ZXJGYWN0b3J5XG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RleHRMYXllck1vZGVdIC0gQ29udHJvbHMgaWYgdGhlIHRleHQgbGF5ZXIgdXNlZCBmb3JcbiAqICAgc2VsZWN0aW9uIGFuZCBzZWFyY2hpbmcgaXMgY3JlYXRlZCwgYW5kIGlmIHRoZSBpbXByb3ZlZCB0ZXh0IHNlbGVjdGlvblxuICogICBiZWhhdmlvdXIgaXMgZW5hYmxlZC4gVGhlIGNvbnN0YW50cyBmcm9tIHtUZXh0TGF5ZXJNb2RlfSBzaG91bGQgYmUgdXNlZC5cbiAqICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYFRleHRMYXllck1vZGUuRU5BQkxFYC5cbiAqIEBwcm9wZXJ0eSB7SVBERkFubm90YXRpb25MYXllckZhY3Rvcnl9IGFubm90YXRpb25MYXllckZhY3RvcnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW1hZ2VSZXNvdXJjZXNQYXRoXSAtIFBhdGggZm9yIGltYWdlIHJlc291cmNlcywgbWFpbmx5XG4gKiAgIGZvciBhbm5vdGF0aW9uIGljb25zLiBJbmNsdWRlIHRyYWlsaW5nIHNsYXNoLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIC0gVHVybnMgb24gcmVuZGVyaW5nIG9mXG4gKiAgIGludGVyYWN0aXZlIGZvcm0gZWxlbWVudHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZW5kZXJlciAtICdjYW52YXMnIG9yICdzdmcnLiBUaGUgZGVmYXVsdCBpcyAnY2FudmFzJy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZVdlYkdMXSAtIEVuYWJsZXMgV2ViR0wgYWNjZWxlcmF0ZWQgcmVuZGVyaW5nIGZvclxuICogICBzb21lIG9wZXJhdGlvbnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VPbmx5Q3NzWm9vbV0gLSBFbmFibGVzIENTUyBvbmx5IHpvb21pbmcuIFRoZSBkZWZhdWx0XG4gKiAgIHZhbHVlIGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heENhbnZhc1BpeGVsc10gLSBUaGUgbWF4aW11bSBzdXBwb3J0ZWQgY2FudmFzIHNpemUgaW5cbiAqICAgdG90YWwgcGl4ZWxzLCBpLmUuIHdpZHRoICogaGVpZ2h0LiBVc2UgLTEgZm9yIG5vIGxpbWl0LiBUaGUgZGVmYXVsdCB2YWx1ZVxuICogICBpcyA0MDk2ICogNDA5NiAoMTYgbWVnYS1waXhlbHMpLlxuICogQHByb3BlcnR5IHtJTDEwbn0gbDEwbiAtIExvY2FsaXphdGlvbiBzZXJ2aWNlLlxuICovXG5cbmNvbnN0IE1BWF9DQU5WQVNfUElYRUxTID0gdmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcy5tYXhDYW52YXNQaXhlbHMgfHwgMTY3NzcyMTY7XG5cbi8qKlxuICogQGltcGxlbWVudHMge0lSZW5kZXJhYmxlVmlld31cbiAqL1xuY2xhc3MgUERGUGFnZVZpZXcge1xuICAvKipcbiAgICogQHBhcmFtIHtQREZQYWdlVmlld09wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSBvcHRpb25zLmRlZmF1bHRWaWV3cG9ydDtcblxuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkO1xuICAgIHRoaXMucmVuZGVyaW5nSWQgPSBcInBhZ2VcIiArIHRoaXMuaWQ7XG5cbiAgICB0aGlzLnBkZlBhZ2UgPSBudWxsO1xuICAgIHRoaXMucGFnZUxhYmVsID0gbnVsbDtcbiAgICB0aGlzLnJvdGF0aW9uID0gMDtcbiAgICB0aGlzLnNjYWxlID0gb3B0aW9ucy5zY2FsZSB8fCBERUZBVUxUX1NDQUxFO1xuICAgIHRoaXMudmlld3BvcnQgPSBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgdGhpcy5wZGZQYWdlUm90YXRlID0gZGVmYXVsdFZpZXdwb3J0LnJvdGF0aW9uO1xuICAgIHRoaXMuX2Fubm90YXRpb25TdG9yYWdlID0gb3B0aW9ucy5hbm5vdGF0aW9uU3RvcmFnZSB8fCBudWxsO1xuICAgIHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPVxuICAgICAgb3B0aW9ucy5vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIHx8IG51bGw7XG4gICAgdGhpcy5oYXNSZXN0cmljdGVkU2NhbGluZyA9IGZhbHNlO1xuICAgIHRoaXMudGV4dExheWVyTW9kZSA9IE51bWJlci5pc0ludGVnZXIob3B0aW9ucy50ZXh0TGF5ZXJNb2RlKVxuICAgICAgPyBvcHRpb25zLnRleHRMYXllck1vZGVcbiAgICAgIDogVGV4dExheWVyTW9kZS5FTkFCTEU7XG4gICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBvcHRpb25zLmltYWdlUmVzb3VyY2VzUGF0aCB8fCBcIlwiO1xuICAgIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID09PSBcImJvb2xlYW5cIlxuICAgICAgICA/IG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3Jtc1xuICAgICAgICA6IHRydWU7XG4gICAgdGhpcy51c2VPbmx5Q3NzWm9vbSA9IG9wdGlvbnMudXNlT25seUNzc1pvb20gfHwgZmFsc2U7XG4gICAgdGhpcy5tYXhDYW52YXNQaXhlbHMgPSBvcHRpb25zLm1heENhbnZhc1BpeGVscyB8fCBNQVhfQ0FOVkFTX1BJWEVMUztcblxuICAgIHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuICAgIHRoaXMucmVuZGVyaW5nUXVldWUgPSBvcHRpb25zLnJlbmRlcmluZ1F1ZXVlO1xuICAgIHRoaXMudGV4dExheWVyRmFjdG9yeSA9IG9wdGlvbnMudGV4dExheWVyRmFjdG9yeTtcbiAgICB0aGlzLmFubm90YXRpb25MYXllckZhY3RvcnkgPSBvcHRpb25zLmFubm90YXRpb25MYXllckZhY3Rvcnk7XG4gICAgdGhpcy5yZW5kZXJlciA9IG9wdGlvbnMucmVuZGVyZXIgfHwgUmVuZGVyZXJUeXBlLkNBTlZBUztcbiAgICB0aGlzLmVuYWJsZVdlYkdMID0gb3B0aW9ucy5lbmFibGVXZWJHTCB8fCBmYWxzZTtcbiAgICB0aGlzLmwxMG4gPSBvcHRpb25zLmwxMG4gfHwgTnVsbEwxMG47XG5cbiAgICB0aGlzLnBhaW50VGFzayA9IG51bGw7XG4gICAgdGhpcy5wYWludGVkVmlld3BvcnRNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBSZW5kZXJpbmdTdGF0ZXMuSU5JVElBTDtcbiAgICB0aGlzLnJlc3VtZSA9IG51bGw7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICB0aGlzLmFubm90YXRpb25MYXllciA9IG51bGw7XG4gICAgdGhpcy50ZXh0TGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuem9vbUxheWVyID0gbnVsbDtcblxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmNsYXNzTmFtZSA9IFwicGFnZVwiO1xuICAgIGRpdi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC53aWR0aCkgKyBcInB4XCI7XG4gICAgZGl2LnN0eWxlLmhlaWdodCA9IE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC5oZWlnaHQpICsgXCJweFwiO1xuICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ2UtbnVtYmVyXCIsIHRoaXMuaWQpO1xuICAgIHRoaXMuZGl2ID0gZGl2O1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdik7XG4gIH1cblxuICBzZXRQZGZQYWdlKHBkZlBhZ2UpIHtcbiAgICB0aGlzLnBkZlBhZ2UgPSBwZGZQYWdlO1xuICAgIHRoaXMucGRmUGFnZVJvdGF0ZSA9IHBkZlBhZ2Uucm90YXRlO1xuXG4gICAgY29uc3QgdG90YWxSb3RhdGlvbiA9ICh0aGlzLnJvdGF0aW9uICsgdGhpcy5wZGZQYWdlUm90YXRlKSAlIDM2MDtcbiAgICB0aGlzLnZpZXdwb3J0ID0gcGRmUGFnZS5nZXRWaWV3cG9ydCh7XG4gICAgICBzY2FsZTogdGhpcy5zY2FsZSAqIENTU19VTklUUyxcbiAgICAgIHJvdGF0aW9uOiB0b3RhbFJvdGF0aW9uLFxuICAgIH0pO1xuICAgIHRoaXMuc3RhdHMgPSBwZGZQYWdlLnN0YXRzO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIGlmICh0aGlzLnBkZlBhZ2UpIHtcbiAgICAgIHRoaXMucGRmUGFnZS5jbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3luYyBfcmVuZGVyQW5ub3RhdGlvbkxheWVyKCkge1xuICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYW5ub3RhdGlvbkxheWVyLnJlbmRlcih0aGlzLnZpZXdwb3J0LCBcImRpc3BsYXlcIik7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGVycm9yID0gZXg7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJhbm5vdGF0aW9ubGF5ZXJyZW5kZXJlZFwiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXNldFpvb21MYXllcihyZW1vdmVGcm9tRE9NID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMuem9vbUxheWVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHpvb21MYXllckNhbnZhcyA9IHRoaXMuem9vbUxheWVyLmZpcnN0Q2hpbGQ7XG4gICAgdGhpcy5wYWludGVkVmlld3BvcnRNYXAuZGVsZXRlKHpvb21MYXllckNhbnZhcyk7XG4gICAgLy8gWmVyb2luZyB0aGUgd2lkdGggYW5kIGhlaWdodCBjYXVzZXMgRmlyZWZveCB0byByZWxlYXNlIGdyYXBoaWNzXG4gICAgLy8gcmVzb3VyY2VzIGltbWVkaWF0ZWx5LCB3aGljaCBjYW4gZ3JlYXRseSByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uLlxuICAgIHpvb21MYXllckNhbnZhcy53aWR0aCA9IDA7XG4gICAgem9vbUxheWVyQ2FudmFzLmhlaWdodCA9IDA7XG5cbiAgICBpZiAocmVtb3ZlRnJvbURPTSkge1xuICAgICAgLy8gTm90ZTogYENoaWxkTm9kZS5yZW1vdmVgIGRvZXNuJ3QgdGhyb3cgaWYgdGhlIHBhcmVudCBub2RlIGlzIHVuZGVmaW5lZC5cbiAgICAgIHRoaXMuem9vbUxheWVyLnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLnpvb21MYXllciA9IG51bGw7XG4gIH1cblxuICByZXNldChrZWVwWm9vbUxheWVyID0gZmFsc2UsIGtlZXBBbm5vdGF0aW9ucyA9IGZhbHNlKSB7XG4gICAgdGhpcy5jYW5jZWxSZW5kZXJpbmcoa2VlcEFubm90YXRpb25zKTtcbiAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw7XG5cbiAgICBjb25zdCBkaXYgPSB0aGlzLmRpdjtcbiAgICBkaXYuc3R5bGUud2lkdGggPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQud2lkdGgpICsgXCJweFwiO1xuICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSArIFwicHhcIjtcblxuICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBkaXYuY2hpbGROb2RlcztcbiAgICBjb25zdCBjdXJyZW50Wm9vbUxheWVyTm9kZSA9IChrZWVwWm9vbUxheWVyICYmIHRoaXMuem9vbUxheWVyKSB8fCBudWxsO1xuICAgIGNvbnN0IGN1cnJlbnRBbm5vdGF0aW9uTm9kZSA9XG4gICAgICAoa2VlcEFubm90YXRpb25zICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdikgfHxcbiAgICAgIG51bGw7XG4gICAgZm9yIChsZXQgaSA9IGNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBjaGlsZE5vZGVzW2ldO1xuICAgICAgaWYgKGN1cnJlbnRab29tTGF5ZXJOb2RlID09PSBub2RlIHx8IGN1cnJlbnRBbm5vdGF0aW9uTm9kZSA9PT0gbm9kZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRpdi5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gICAgZGl2LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtbG9hZGVkXCIpO1xuXG4gICAgaWYgKGN1cnJlbnRBbm5vdGF0aW9uTm9kZSkge1xuICAgICAgLy8gSGlkZSB0aGUgYW5ub3RhdGlvbiBsYXllciB1bnRpbCBhbGwgZWxlbWVudHMgYXJlIHJlc2l6ZWRcbiAgICAgIC8vIHNvIHRoZXkgYXJlIG5vdCBkaXNwbGF5ZWQgb24gdGhlIGFscmVhZHkgcmVzaXplZCBwYWdlLlxuICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuaGlkZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hbm5vdGF0aW9uTGF5ZXIpIHtcbiAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyLmNhbmNlbCgpO1xuICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghY3VycmVudFpvb21MYXllck5vZGUpIHtcbiAgICAgIGlmICh0aGlzLmNhbnZhcykge1xuICAgICAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcC5kZWxldGUodGhpcy5jYW52YXMpO1xuICAgICAgICAvLyBaZXJvaW5nIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGNhdXNlcyBGaXJlZm94IHRvIHJlbGVhc2UgZ3JhcGhpY3NcbiAgICAgICAgLy8gcmVzb3VyY2VzIGltbWVkaWF0ZWx5LCB3aGljaCBjYW4gZ3JlYXRseSByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uLlxuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IDA7XG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhbnZhcztcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jlc2V0Wm9vbUxheWVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN2Zykge1xuICAgICAgdGhpcy5wYWludGVkVmlld3BvcnRNYXAuZGVsZXRlKHRoaXMuc3ZnKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnN2ZztcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRpbmdJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmxvYWRpbmdJY29uRGl2LmNsYXNzTmFtZSA9IFwibG9hZGluZ0ljb25cIjtcbiAgICBkaXYuYXBwZW5kQ2hpbGQodGhpcy5sb2FkaW5nSWNvbkRpdik7XG4gIH1cblxuICB1cGRhdGUoc2NhbGUsIHJvdGF0aW9uLCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gbnVsbCkge1xuICAgIHRoaXMuc2NhbGUgPSBzY2FsZSB8fCB0aGlzLnNjYWxlO1xuICAgIC8vIFRoZSByb3RhdGlvbiBtYXkgYmUgemVyby5cbiAgICBpZiAodHlwZW9mIHJvdGF0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgfVxuICAgIGlmIChvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWxSb3RhdGlvbiA9ICh0aGlzLnJvdGF0aW9uICsgdGhpcy5wZGZQYWdlUm90YXRlKSAlIDM2MDtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydC5jbG9uZSh7XG4gICAgICBzY2FsZTogdGhpcy5zY2FsZSAqIENTU19VTklUUyxcbiAgICAgIHJvdGF0aW9uOiB0b3RhbFJvdGF0aW9uLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc3ZnKSB7XG4gICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLnN2ZywgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJwYWdlcmVuZGVyZWRcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIHBhZ2VOdW1iZXI6IHRoaXMuaWQsXG4gICAgICAgIGNzc1RyYW5zZm9ybTogdHJ1ZSxcbiAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpc1NjYWxpbmdSZXN0cmljdGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMubWF4Q2FudmFzUGl4ZWxzID4gMCkge1xuICAgICAgY29uc3Qgb3V0cHV0U2NhbGUgPSB0aGlzLm91dHB1dFNjYWxlO1xuICAgICAgaWYgKFxuICAgICAgICAoKE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC53aWR0aCkgKiBvdXRwdXRTY2FsZS5zeCkgfCAwKSAqXG4gICAgICAgICAgKChNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSAqIG91dHB1dFNjYWxlLnN5KSB8IDApID5cbiAgICAgICAgdGhpcy5tYXhDYW52YXNQaXhlbHNcbiAgICAgICkge1xuICAgICAgICBpc1NjYWxpbmdSZXN0cmljdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy51c2VPbmx5Q3NzWm9vbSB8fFxuICAgICAgICAodGhpcy5oYXNSZXN0cmljdGVkU2NhbGluZyAmJiBpc1NjYWxpbmdSZXN0cmljdGVkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY3NzVHJhbnNmb3JtKHRoaXMuY2FudmFzLCB0cnVlKTtcblxuICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwicGFnZXJlbmRlcmVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCxcbiAgICAgICAgICBjc3NUcmFuc2Zvcm06IHRydWUsXG4gICAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy56b29tTGF5ZXIgJiYgIXRoaXMuY2FudmFzLmhhc0F0dHJpYnV0ZShcImhpZGRlblwiKSkge1xuICAgICAgICB0aGlzLnpvb21MYXllciA9IHRoaXMuY2FudmFzLnBhcmVudE5vZGU7XG4gICAgICAgIHRoaXMuem9vbUxheWVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy56b29tTGF5ZXIpIHtcbiAgICAgIHRoaXMuY3NzVHJhbnNmb3JtKHRoaXMuem9vbUxheWVyLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0KC8qIGtlZXBab29tTGF5ZXIgPSAqLyB0cnVlLCAvKiBrZWVwQW5ub3RhdGlvbnMgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQTEVBU0UgTk9URTogTW9zdCBsaWtlbHkgeW91IHdhbnQgdG8gdXNlIHRoZSBgdGhpcy5yZXNldCgpYCBtZXRob2QsXG4gICAqICAgICAgICAgICAgICByYXRoZXIgdGhhbiBjYWxsaW5nIHRoaXMgb25lIGRpcmVjdGx5LlxuICAgKi9cbiAgY2FuY2VsUmVuZGVyaW5nKGtlZXBBbm5vdGF0aW9ucyA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMucGFpbnRUYXNrKSB7XG4gICAgICB0aGlzLnBhaW50VGFzay5jYW5jZWwoKTtcbiAgICAgIHRoaXMucGFpbnRUYXNrID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZXN1bWUgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMudGV4dExheWVyKSB7XG4gICAgICB0aGlzLnRleHRMYXllci5jYW5jZWwoKTtcbiAgICAgIHRoaXMudGV4dExheWVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFrZWVwQW5ub3RhdGlvbnMgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIpIHtcbiAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyLmNhbmNlbCgpO1xuICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNzc1RyYW5zZm9ybSh0YXJnZXQsIHJlZHJhd0Fubm90YXRpb25zID0gZmFsc2UpIHtcbiAgICAvLyBTY2FsZSB0YXJnZXQgKGNhbnZhcyBvciBzdmcpLCBpdHMgd3JhcHBlciBhbmQgcGFnZSBjb250YWluZXIuXG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLnZpZXdwb3J0LndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMudmlld3BvcnQuaGVpZ2h0O1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuZGl2O1xuICAgIHRhcmdldC5zdHlsZS53aWR0aCA9IHRhcmdldC5wYXJlbnROb2RlLnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLndpZHRoID1cbiAgICAgIE1hdGguZmxvb3Iod2lkdGgpICsgXCJweFwiO1xuICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSB0YXJnZXQucGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQgPSBkaXYuc3R5bGUuaGVpZ2h0ID1cbiAgICAgIE1hdGguZmxvb3IoaGVpZ2h0KSArIFwicHhcIjtcbiAgICAvLyBUaGUgY2FudmFzIG1heSBoYXZlIGJlZW4gb3JpZ2luYWxseSByb3RhdGVkOyByb3RhdGUgcmVsYXRpdmUgdG8gdGhhdC5cbiAgICBjb25zdCByZWxhdGl2ZVJvdGF0aW9uID1cbiAgICAgIHRoaXMudmlld3BvcnQucm90YXRpb24gLSB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcC5nZXQodGFyZ2V0KS5yb3RhdGlvbjtcbiAgICBjb25zdCBhYnNSb3RhdGlvbiA9IE1hdGguYWJzKHJlbGF0aXZlUm90YXRpb24pO1xuICAgIGxldCBzY2FsZVggPSAxLFxuICAgICAgc2NhbGVZID0gMTtcbiAgICBpZiAoYWJzUm90YXRpb24gPT09IDkwIHx8IGFic1JvdGF0aW9uID09PSAyNzApIHtcbiAgICAgIC8vIFNjYWxlIHggYW5kIHkgYmVjYXVzZSBvZiB0aGUgcm90YXRpb24uXG4gICAgICBzY2FsZVggPSBoZWlnaHQgLyB3aWR0aDtcbiAgICAgIHNjYWxlWSA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBjc3NUcmFuc2Zvcm0gPVxuICAgICAgXCJyb3RhdGUoXCIgK1xuICAgICAgcmVsYXRpdmVSb3RhdGlvbiArXG4gICAgICBcImRlZykgXCIgK1xuICAgICAgXCJzY2FsZShcIiArXG4gICAgICBzY2FsZVggK1xuICAgICAgXCIsXCIgK1xuICAgICAgc2NhbGVZICtcbiAgICAgIFwiKVwiO1xuICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBjc3NUcmFuc2Zvcm07XG5cbiAgICBpZiAodGhpcy50ZXh0TGF5ZXIpIHtcbiAgICAgIC8vIFJvdGF0aW5nIHRoZSB0ZXh0IGxheWVyIGlzIG1vcmUgY29tcGxpY2F0ZWQgc2luY2UgdGhlIGRpdnMgaW5zaWRlIHRoZVxuICAgICAgLy8gdGhlIHRleHQgbGF5ZXIgYXJlIHJvdGF0ZWQuXG4gICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIHNpbXBsaWZpZWQgYnkgZHJhd2luZyB0aGUgdGV4dCBsYXllciBpblxuICAgICAgLy8gb25lIG9yaWVudGF0aW9uIGFuZCB0aGVuIHJvdGF0aW5nIG92ZXJhbGwuXG4gICAgICBjb25zdCB0ZXh0TGF5ZXJWaWV3cG9ydCA9IHRoaXMudGV4dExheWVyLnZpZXdwb3J0O1xuICAgICAgY29uc3QgdGV4dFJlbGF0aXZlUm90YXRpb24gPVxuICAgICAgICB0aGlzLnZpZXdwb3J0LnJvdGF0aW9uIC0gdGV4dExheWVyVmlld3BvcnQucm90YXRpb247XG4gICAgICBjb25zdCB0ZXh0QWJzUm90YXRpb24gPSBNYXRoLmFicyh0ZXh0UmVsYXRpdmVSb3RhdGlvbik7XG4gICAgICBsZXQgc2NhbGUgPSB3aWR0aCAvIHRleHRMYXllclZpZXdwb3J0LndpZHRoO1xuICAgICAgaWYgKHRleHRBYnNSb3RhdGlvbiA9PT0gOTAgfHwgdGV4dEFic1JvdGF0aW9uID09PSAyNzApIHtcbiAgICAgICAgc2NhbGUgPSB3aWR0aCAvIHRleHRMYXllclZpZXdwb3J0LmhlaWdodDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHRMYXllckRpdiA9IHRoaXMudGV4dExheWVyLnRleHRMYXllckRpdjtcbiAgICAgIGxldCB0cmFuc1gsIHRyYW5zWTtcbiAgICAgIHN3aXRjaCAodGV4dEFic1JvdGF0aW9uKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICB0cmFuc1ggPSB0cmFuc1kgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgIHRyYW5zWCA9IDA7XG4gICAgICAgICAgdHJhbnNZID0gXCItXCIgKyB0ZXh0TGF5ZXJEaXYuc3R5bGUuaGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICB0cmFuc1ggPSBcIi1cIiArIHRleHRMYXllckRpdi5zdHlsZS53aWR0aDtcbiAgICAgICAgICB0cmFuc1kgPSBcIi1cIiArIHRleHRMYXllckRpdi5zdHlsZS5oZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgIHRyYW5zWCA9IFwiLVwiICsgdGV4dExheWVyRGl2LnN0eWxlLndpZHRoO1xuICAgICAgICAgIHRyYW5zWSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkJhZCByb3RhdGlvbiB2YWx1ZS5cIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRleHRMYXllckRpdi5zdHlsZS50cmFuc2Zvcm0gPVxuICAgICAgICBcInJvdGF0ZShcIiArXG4gICAgICAgIHRleHRBYnNSb3RhdGlvbiArXG4gICAgICAgIFwiZGVnKSBcIiArXG4gICAgICAgIFwic2NhbGUoXCIgK1xuICAgICAgICBzY2FsZSArXG4gICAgICAgIFwiLCBcIiArXG4gICAgICAgIHNjYWxlICtcbiAgICAgICAgXCIpIFwiICtcbiAgICAgICAgXCJ0cmFuc2xhdGUoXCIgK1xuICAgICAgICB0cmFuc1ggK1xuICAgICAgICBcIiwgXCIgK1xuICAgICAgICB0cmFuc1kgK1xuICAgICAgICBcIilcIjtcbiAgICAgIHRleHRMYXllckRpdi5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSBcIjAlIDAlXCI7XG4gICAgfVxuXG4gICAgaWYgKHJlZHJhd0Fubm90YXRpb25zICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICB0aGlzLl9yZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlld3BvcnQud2lkdGg7XG4gIH1cblxuICBnZXQgaGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0LmhlaWdodDtcbiAgfVxuXG4gIGdldFBhZ2VQb2ludCh4LCB5KSB7XG4gICAgcmV0dXJuIHRoaXMudmlld3BvcnQuY29udmVydFRvUGRmUG9pbnQoeCwgeSk7XG4gIH1cblxuICBkcmF3KCkge1xuICAgIGlmICh0aGlzLnJlbmRlcmluZ1N0YXRlICE9PSBSZW5kZXJpbmdTdGF0ZXMuSU5JVElBTCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIk11c3QgYmUgaW4gbmV3IHN0YXRlIGJlZm9yZSBkcmF3aW5nXCIpO1xuICAgICAgdGhpcy5yZXNldCgpOyAvLyBFbnN1cmUgdGhhdCB3ZSByZXNldCBhbGwgc3RhdGUgdG8gcHJldmVudCBpc3N1ZXMuXG4gICAgfVxuICAgIGNvbnN0IHsgZGl2LCBwZGZQYWdlIH0gPSB0aGlzO1xuXG4gICAgaWYgKCFwZGZQYWdlKSB7XG4gICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEO1xuXG4gICAgICBpZiAodGhpcy5sb2FkaW5nSWNvbkRpdikge1xuICAgICAgICBkaXYucmVtb3ZlQ2hpbGQodGhpcy5sb2FkaW5nSWNvbkRpdik7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdJY29uRGl2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInBkZlBhZ2UgaXMgbm90IGxvYWRlZFwiKSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IFJlbmRlcmluZ1N0YXRlcy5SVU5OSU5HO1xuXG4gICAgLy8gV3JhcCB0aGUgY2FudmFzIHNvIHRoYXQgaWYgaXQgaGFzIGEgQ1NTIHRyYW5zZm9ybSBmb3IgaGlnaCBEUEkgdGhlXG4gICAgLy8gb3ZlcmZsb3cgd2lsbCBiZSBoaWRkZW4gaW4gRmlyZWZveC5cbiAgICBjb25zdCBjYW52YXNXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjYW52YXNXcmFwcGVyLnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLndpZHRoO1xuICAgIGNhbnZhc1dyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gZGl2LnN0eWxlLmhlaWdodDtcbiAgICBjYW52YXNXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJjYW52YXNXcmFwcGVyXCIpO1xuXG4gICAgaWYgKHRoaXMuYW5ub3RhdGlvbkxheWVyICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdikge1xuICAgICAgLy8gVGhlIGFubm90YXRpb24gbGF5ZXIgbmVlZHMgdG8gc3RheSBvbiB0b3AuXG4gICAgICBkaXYuaW5zZXJ0QmVmb3JlKGNhbnZhc1dyYXBwZXIsIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpdi5hcHBlbmRDaGlsZChjYW52YXNXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBsZXQgdGV4dExheWVyID0gbnVsbDtcbiAgICBpZiAodGhpcy50ZXh0TGF5ZXJNb2RlICE9PSBUZXh0TGF5ZXJNb2RlLkRJU0FCTEUgJiYgdGhpcy50ZXh0TGF5ZXJGYWN0b3J5KSB7XG4gICAgICBjb25zdCB0ZXh0TGF5ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGV4dExheWVyRGl2LmNsYXNzTmFtZSA9IFwidGV4dExheWVyXCI7XG4gICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUud2lkdGggPSBjYW52YXNXcmFwcGVyLnN0eWxlLndpZHRoO1xuICAgICAgdGV4dExheWVyRGl2LnN0eWxlLmhlaWdodCA9IGNhbnZhc1dyYXBwZXIuc3R5bGUuaGVpZ2h0O1xuICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkxheWVyICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdikge1xuICAgICAgICAvLyBUaGUgYW5ub3RhdGlvbiBsYXllciBuZWVkcyB0byBzdGF5IG9uIHRvcC5cbiAgICAgICAgZGl2Lmluc2VydEJlZm9yZSh0ZXh0TGF5ZXJEaXYsIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGV4dExheWVyRGl2KTtcbiAgICAgIH1cblxuICAgICAgdGV4dExheWVyID0gdGhpcy50ZXh0TGF5ZXJGYWN0b3J5LmNyZWF0ZVRleHRMYXllckJ1aWxkZXIoXG4gICAgICAgIHRleHRMYXllckRpdixcbiAgICAgICAgdGhpcy5pZCAtIDEsXG4gICAgICAgIHRoaXMudmlld3BvcnQsXG4gICAgICAgIHRoaXMudGV4dExheWVyTW9kZSA9PT0gVGV4dExheWVyTW9kZS5FTkFCTEVfRU5IQU5DRSxcbiAgICAgICAgdGhpcy5ldmVudEJ1c1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy50ZXh0TGF5ZXIgPSB0ZXh0TGF5ZXI7XG5cbiAgICBsZXQgcmVuZGVyQ29udGludWVDYWxsYmFjayA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVuZGVyaW5nUXVldWUpIHtcbiAgICAgIHJlbmRlckNvbnRpbnVlQ2FsbGJhY2sgPSBjb250ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmluZ1F1ZXVlLmlzSGlnaGVzdFByaW9yaXR5KHRoaXMpKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IFJlbmRlcmluZ1N0YXRlcy5QQVVTRUQ7XG4gICAgICAgICAgdGhpcy5yZXN1bWUgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gUmVuZGVyaW5nU3RhdGVzLlJVTk5JTkc7XG4gICAgICAgICAgICBjb250KCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udCgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5pc2hQYWludFRhc2sgPSBhc3luYyBlcnJvciA9PiB7XG4gICAgICAvLyBUaGUgcGFpbnRUYXNrIG1heSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgYSBuZXcgb25lLCBzbyBvbmx5IHJlbW92ZVxuICAgICAgLy8gdGhlIHJlZmVyZW5jZSB0byB0aGUgcGFpbnRUYXNrIGlmIGl0IG1hdGNoZXMgdGhlIG9uZSB0aGF0IGlzXG4gICAgICAvLyB0cmlnZ2VyaW5nIHRoaXMgY2FsbGJhY2suXG4gICAgICBpZiAocGFpbnRUYXNrID09PSB0aGlzLnBhaW50VGFzaykge1xuICAgICAgICB0aGlzLnBhaW50VGFzayA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikge1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEO1xuXG4gICAgICBpZiAodGhpcy5sb2FkaW5nSWNvbkRpdikge1xuICAgICAgICBkaXYucmVtb3ZlQ2hpbGQodGhpcy5sb2FkaW5nSWNvbkRpdik7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdJY29uRGl2O1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVzZXRab29tTGF5ZXIoLyogcmVtb3ZlRnJvbURPTSA9ICovIHRydWUpO1xuXG4gICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICB0aGlzLnN0YXRzID0gcGRmUGFnZS5zdGF0cztcblxuICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VyZW5kZXJlZFwiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCxcbiAgICAgICAgY3NzVHJhbnNmb3JtOiBmYWxzZSxcbiAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHBhaW50VGFzayA9XG4gICAgICB0aGlzLnJlbmRlcmVyID09PSBSZW5kZXJlclR5cGUuU1ZHXG4gICAgICAgID8gdGhpcy5wYWludE9uU3ZnKGNhbnZhc1dyYXBwZXIpXG4gICAgICAgIDogdGhpcy5wYWludE9uQ2FudmFzKGNhbnZhc1dyYXBwZXIpO1xuICAgIHBhaW50VGFzay5vblJlbmRlckNvbnRpbnVlID0gcmVuZGVyQ29udGludWVDYWxsYmFjaztcbiAgICB0aGlzLnBhaW50VGFzayA9IHBhaW50VGFzaztcblxuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSBwYWludFRhc2sucHJvbWlzZS50aGVuKFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmluaXNoUGFpbnRUYXNrKG51bGwpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0ZXh0TGF5ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gcGRmUGFnZS5zdHJlYW1UZXh0Q29udGVudCh7XG4gICAgICAgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2U6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRleHRMYXllci5zZXRUZXh0Q29udGVudFN0cmVhbShyZWFkYWJsZVN0cmVhbSk7XG4gICAgICAgICAgICB0ZXh0TGF5ZXIucmVuZGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHJldHVybiBmaW5pc2hQYWludFRhc2socmVhc29uKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKHRoaXMuYW5ub3RhdGlvbkxheWVyRmFjdG9yeSkge1xuICAgICAgaWYgKCF0aGlzLmFubm90YXRpb25MYXllcikge1xuICAgICAgICB0aGlzLmFubm90YXRpb25MYXllciA9IHRoaXMuYW5ub3RhdGlvbkxheWVyRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKFxuICAgICAgICAgIGRpdixcbiAgICAgICAgICBwZGZQYWdlLFxuICAgICAgICAgIHRoaXMuX2Fubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoLFxuICAgICAgICAgIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgICAgICB0aGlzLmwxMG5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlbmRlckFubm90YXRpb25MYXllcigpO1xuICAgIH1cbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1sb2FkZWRcIiwgdHJ1ZSk7XG5cbiAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwicGFnZXJlbmRlclwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xuICB9XG5cbiAgcGFpbnRPbkNhbnZhcyhjYW52YXNXcmFwcGVyKSB7XG4gICAgY29uc3QgcmVuZGVyQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgcHJvbWlzZTogcmVuZGVyQ2FwYWJpbGl0eS5wcm9taXNlLFxuICAgICAgb25SZW5kZXJDb250aW51ZShjb250KSB7XG4gICAgICAgIGNvbnQoKTtcbiAgICAgIH0sXG4gICAgICBjYW5jZWwoKSB7XG4gICAgICAgIHJlbmRlclRhc2suY2FuY2VsKCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQ7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICB0aGlzLmwxMG5cbiAgICAgIC5nZXQoXCJwYWdlX2NhbnZhc1wiLCB7IHBhZ2U6IHRoaXMuaWQgfSwgXCJQYWdlIHt7cGFnZX19XCIpXG4gICAgICAudGhlbihtc2cgPT4ge1xuICAgICAgICBjYW52YXMuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBtc2cpO1xuICAgICAgfSk7XG5cbiAgICAvLyBLZWVwIHRoZSBjYW52YXMgaGlkZGVuIHVudGlsIHRoZSBmaXJzdCBkcmF3IGNhbGxiYWNrLCBvciB1bnRpbCBkcmF3aW5nXG4gICAgLy8gaXMgY29tcGxldGUgd2hlbiBgIXRoaXMucmVuZGVyaW5nUXVldWVgLCB0byBwcmV2ZW50IGJsYWNrIGZsaWNrZXJpbmcuXG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZShcImhpZGRlblwiLCBcImhpZGRlblwiKTtcbiAgICBsZXQgaXNDYW52YXNIaWRkZW4gPSB0cnVlO1xuICAgIGNvbnN0IHNob3dDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXNDYW52YXNIaWRkZW4pIHtcbiAgICAgICAgY2FudmFzLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgaXNDYW52YXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2FudmFzV3JhcHBlci5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICBQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTCB8fCBHRU5FUklDXCIpXG4gICAgKSB7XG4gICAgICBjYW52YXMubW96T3BhcXVlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIsIHsgYWxwaGE6IGZhbHNlIH0pO1xuICAgIGNvbnN0IG91dHB1dFNjYWxlID0gZ2V0T3V0cHV0U2NhbGUoY3R4KTtcbiAgICB0aGlzLm91dHB1dFNjYWxlID0gb3V0cHV0U2NhbGU7XG5cbiAgICBpZiAodGhpcy51c2VPbmx5Q3NzWm9vbSkge1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZVZpZXdwb3J0ID0gdmlld3BvcnQuY2xvbmUoeyBzY2FsZTogQ1NTX1VOSVRTIH0pO1xuICAgICAgLy8gVXNlIGEgc2NhbGUgdGhhdCBtYWtlcyB0aGUgY2FudmFzIGhhdmUgdGhlIG9yaWdpbmFsbHkgaW50ZW5kZWQgc2l6ZVxuICAgICAgLy8gb2YgdGhlIHBhZ2UuXG4gICAgICBvdXRwdXRTY2FsZS5zeCAqPSBhY3R1YWxTaXplVmlld3BvcnQud2lkdGggLyB2aWV3cG9ydC53aWR0aDtcbiAgICAgIG91dHB1dFNjYWxlLnN5ICo9IGFjdHVhbFNpemVWaWV3cG9ydC5oZWlnaHQgLyB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICBvdXRwdXRTY2FsZS5zY2FsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heENhbnZhc1BpeGVscyA+IDApIHtcbiAgICAgIGNvbnN0IHBpeGVsc0luVmlld3BvcnQgPSB2aWV3cG9ydC53aWR0aCAqIHZpZXdwb3J0LmhlaWdodDtcbiAgICAgIGNvbnN0IG1heFNjYWxlID0gTWF0aC5zcXJ0KHRoaXMubWF4Q2FudmFzUGl4ZWxzIC8gcGl4ZWxzSW5WaWV3cG9ydCk7XG4gICAgICBpZiAob3V0cHV0U2NhbGUuc3ggPiBtYXhTY2FsZSB8fCBvdXRwdXRTY2FsZS5zeSA+IG1heFNjYWxlKSB7XG4gICAgICAgIG91dHB1dFNjYWxlLnN4ID0gbWF4U2NhbGU7XG4gICAgICAgIG91dHB1dFNjYWxlLnN5ID0gbWF4U2NhbGU7XG4gICAgICAgIG91dHB1dFNjYWxlLnNjYWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oYXNSZXN0cmljdGVkU2NhbGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNmeCA9IGFwcHJveGltYXRlRnJhY3Rpb24ob3V0cHV0U2NhbGUuc3gpO1xuICAgIGNvbnN0IHNmeSA9IGFwcHJveGltYXRlRnJhY3Rpb24ob3V0cHV0U2NhbGUuc3kpO1xuICAgIGNhbnZhcy53aWR0aCA9IHJvdW5kVG9EaXZpZGUodmlld3BvcnQud2lkdGggKiBvdXRwdXRTY2FsZS5zeCwgc2Z4WzBdKTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gcm91bmRUb0RpdmlkZSh2aWV3cG9ydC5oZWlnaHQgKiBvdXRwdXRTY2FsZS5zeSwgc2Z5WzBdKTtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSByb3VuZFRvRGl2aWRlKHZpZXdwb3J0LndpZHRoLCBzZnhbMV0pICsgXCJweFwiO1xuICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSByb3VuZFRvRGl2aWRlKHZpZXdwb3J0LmhlaWdodCwgc2Z5WzFdKSArIFwicHhcIjtcbiAgICAvLyBBZGQgdGhlIHZpZXdwb3J0IHNvIGl0J3Mga25vd24gd2hhdCBpdCB3YXMgb3JpZ2luYWxseSBkcmF3biB3aXRoLlxuICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLnNldChjYW52YXMsIHZpZXdwb3J0KTtcblxuICAgIC8vIFJlbmRlcmluZyBhcmVhXG4gICAgY29uc3QgdHJhbnNmb3JtID0gIW91dHB1dFNjYWxlLnNjYWxlZFxuICAgICAgPyBudWxsXG4gICAgICA6IFtvdXRwdXRTY2FsZS5zeCwgMCwgMCwgb3V0cHV0U2NhbGUuc3ksIDAsIDBdO1xuICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7XG4gICAgICBjYW52YXNDb250ZXh0OiBjdHgsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB2aWV3cG9ydDogdGhpcy52aWV3cG9ydCxcbiAgICAgIGVuYWJsZVdlYkdMOiB0aGlzLmVuYWJsZVdlYkdMLFxuICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLFxuICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTogdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSxcbiAgICB9O1xuICAgIGNvbnN0IHJlbmRlclRhc2sgPSB0aGlzLnBkZlBhZ2UucmVuZGVyKHJlbmRlckNvbnRleHQpO1xuICAgIHJlbmRlclRhc2sub25Db250aW51ZSA9IGZ1bmN0aW9uIChjb250KSB7XG4gICAgICBzaG93Q2FudmFzKCk7XG4gICAgICBpZiAocmVzdWx0Lm9uUmVuZGVyQ29udGludWUpIHtcbiAgICAgICAgcmVzdWx0Lm9uUmVuZGVyQ29udGludWUoY29udCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICBzaG93Q2FudmFzKCk7XG4gICAgICAgIHJlbmRlckNhcGFiaWxpdHkucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBzaG93Q2FudmFzKCk7XG4gICAgICAgIHJlbmRlckNhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwYWludE9uU3ZnKHdyYXBwZXIpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIFBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMIHx8IENIUk9NRVwiKVxuICAgICkge1xuICAgICAgLy8gUmV0dXJuIGEgbW9jayBvYmplY3QsIHRvIHByZXZlbnQgZXJyb3JzIHN1Y2ggYXMgZS5nLlxuICAgICAgLy8gXCJUeXBlRXJyb3I6IHBhaW50VGFzay5wcm9taXNlIGlzIHVuZGVmaW5lZFwiLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU1ZHIHJlbmRlcmluZyBpcyBub3Qgc3VwcG9ydGVkLlwiKSksXG4gICAgICAgIG9uUmVuZGVyQ29udGludWUoY29udCkge30sXG4gICAgICAgIGNhbmNlbCgpIHt9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZW5zdXJlTm90Q2FuY2VsbGVkID0gKCkgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKFxuICAgICAgICAgIGBSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICR7dGhpcy5pZH1gLFxuICAgICAgICAgIFwic3ZnXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcGRmUGFnZSA9IHRoaXMucGRmUGFnZTtcbiAgICBjb25zdCBhY3R1YWxTaXplVmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0LmNsb25lKHsgc2NhbGU6IENTU19VTklUUyB9KTtcbiAgICBjb25zdCBwcm9taXNlID0gcGRmUGFnZS5nZXRPcGVyYXRvckxpc3QoKS50aGVuKG9wTGlzdCA9PiB7XG4gICAgICBlbnN1cmVOb3RDYW5jZWxsZWQoKTtcbiAgICAgIGNvbnN0IHN2Z0dmeCA9IG5ldyBTVkdHcmFwaGljcyhwZGZQYWdlLmNvbW1vbk9ianMsIHBkZlBhZ2Uub2Jqcyk7XG4gICAgICByZXR1cm4gc3ZnR2Z4LmdldFNWRyhvcExpc3QsIGFjdHVhbFNpemVWaWV3cG9ydCkudGhlbihzdmcgPT4ge1xuICAgICAgICBlbnN1cmVOb3RDYW5jZWxsZWQoKTtcbiAgICAgICAgdGhpcy5zdmcgPSBzdmc7XG4gICAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLnNldChzdmcsIGFjdHVhbFNpemVWaWV3cG9ydCk7XG5cbiAgICAgICAgc3ZnLnN0eWxlLndpZHRoID0gd3JhcHBlci5zdHlsZS53aWR0aDtcbiAgICAgICAgc3ZnLnN0eWxlLmhlaWdodCA9IHdyYXBwZXIuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEO1xuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHN2Zyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9taXNlLFxuICAgICAgb25SZW5kZXJDb250aW51ZShjb250KSB7XG4gICAgICAgIGNvbnQoKTtcbiAgICAgIH0sXG4gICAgICBjYW5jZWwoKSB7XG4gICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFiZWxcbiAgICovXG4gIHNldFBhZ2VMYWJlbChsYWJlbCkge1xuICAgIHRoaXMucGFnZUxhYmVsID0gdHlwZW9mIGxhYmVsID09PSBcInN0cmluZ1wiID8gbGFiZWwgOiBudWxsO1xuXG4gICAgaWYgKHRoaXMucGFnZUxhYmVsICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ2UtbGFiZWxcIiwgdGhpcy5wYWdlTGFiZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpdi5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXBhZ2UtbGFiZWxcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBERlBhZ2VWaWV3IH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgQ0xFQU5VUF9USU1FT1VUID0gMzAwMDA7XG5cbmNvbnN0IFJlbmRlcmluZ1N0YXRlcyA9IHtcbiAgSU5JVElBTDogMCxcbiAgUlVOTklORzogMSxcbiAgUEFVU0VEOiAyLFxuICBGSU5JU0hFRDogMyxcbn07XG5cbi8qKlxuICogQ29udHJvbHMgcmVuZGVyaW5nIG9mIHRoZSB2aWV3cyBmb3IgcGFnZXMgYW5kIHRodW1ibmFpbHMuXG4gKi9cbmNsYXNzIFBERlJlbmRlcmluZ1F1ZXVlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wZGZWaWV3ZXIgPSBudWxsO1xuICAgIHRoaXMucGRmVGh1bWJuYWlsVmlld2VyID0gbnVsbDtcbiAgICB0aGlzLm9uSWRsZSA9IG51bGw7XG4gICAgdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID0gbnVsbDtcbiAgICB0aGlzLmlkbGVUaW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLnByaW50aW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc1RodW1ibmFpbFZpZXdFbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQREZWaWV3ZXJ9IHBkZlZpZXdlclxuICAgKi9cbiAgc2V0Vmlld2VyKHBkZlZpZXdlcikge1xuICAgIHRoaXMucGRmVmlld2VyID0gcGRmVmlld2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UERGVGh1bWJuYWlsVmlld2VyfSBwZGZUaHVtYm5haWxWaWV3ZXJcbiAgICovXG4gIHNldFRodW1ibmFpbFZpZXdlcihwZGZUaHVtYm5haWxWaWV3ZXIpIHtcbiAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlciA9IHBkZlRodW1ibmFpbFZpZXdlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0lSZW5kZXJhYmxlVmlld30gdmlld1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzSGlnaGVzdFByaW9yaXR5KHZpZXcpIHtcbiAgICByZXR1cm4gdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID09PSB2aWV3LnJlbmRlcmluZ0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50bHlWaXNpYmxlUGFnZXNcbiAgICovXG4gIHJlbmRlckhpZ2hlc3RQcmlvcml0eShjdXJyZW50bHlWaXNpYmxlUGFnZXMpIHtcbiAgICBpZiAodGhpcy5pZGxlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaWRsZVRpbWVvdXQpO1xuICAgICAgdGhpcy5pZGxlVGltZW91dCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUGFnZXMgaGF2ZSBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRodW1ibmFpbHMsIHNvIGNoZWNrIHRoZW0gZmlyc3QuXG4gICAgaWYgKHRoaXMucGRmVmlld2VyLmZvcmNlUmVuZGVyaW5nKGN1cnJlbnRseVZpc2libGVQYWdlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm8gcGFnZXMgbmVlZGVkIHJlbmRlcmluZywgc28gY2hlY2sgdGh1bWJuYWlscy5cbiAgICBpZiAodGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIgJiYgdGhpcy5pc1RodW1ibmFpbFZpZXdFbmFibGVkKSB7XG4gICAgICBpZiAodGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIuZm9yY2VSZW5kZXJpbmcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJpbnRpbmcpIHtcbiAgICAgIC8vIElmIHByaW50aW5nIGlzIGN1cnJlbnRseSBvbmdvaW5nIGRvIG5vdCByZXNjaGVkdWxlIGNsZWFudXAuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub25JZGxlKSB7XG4gICAgICB0aGlzLmlkbGVUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLm9uSWRsZS5iaW5kKHRoaXMpLCBDTEVBTlVQX1RJTUVPVVQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmlzaWJsZVxuICAgKiBAcGFyYW0ge0FycmF5fSB2aWV3c1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNjcm9sbGVkRG93blxuICAgKi9cbiAgZ2V0SGlnaGVzdFByaW9yaXR5KHZpc2libGUsIHZpZXdzLCBzY3JvbGxlZERvd24pIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgaGFzIGNoYW5nZWQuIEZpZ3VyZSBvdXQgd2hpY2ggcGFnZSBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdG9cbiAgICAgKiByZW5kZXIgbmV4dCAoaWYgYW55KS5cbiAgICAgKlxuICAgICAqIFByaW9yaXR5OlxuICAgICAqIDEuIHZpc2libGUgcGFnZXNcbiAgICAgKiAyLiBpZiBsYXN0IHNjcm9sbGVkIGRvd24sIHRoZSBwYWdlIGFmdGVyIHRoZSB2aXNpYmxlIHBhZ2VzLCBvclxuICAgICAqICAgIGlmIGxhc3Qgc2Nyb2xsZWQgdXAsIHRoZSBwYWdlIGJlZm9yZSB0aGUgdmlzaWJsZSBwYWdlc1xuICAgICAqL1xuICAgIGNvbnN0IHZpc2libGVWaWV3cyA9IHZpc2libGUudmlld3M7XG5cbiAgICBjb25zdCBudW1WaXNpYmxlID0gdmlzaWJsZVZpZXdzLmxlbmd0aDtcbiAgICBpZiAobnVtVmlzaWJsZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmlzaWJsZTsgKytpKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdmlzaWJsZVZpZXdzW2ldLnZpZXc7XG4gICAgICBpZiAoIXRoaXMuaXNWaWV3RmluaXNoZWQodmlldykpIHtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxsIHRoZSB2aXNpYmxlIHZpZXdzIGhhdmUgcmVuZGVyZWQ7IHRyeSB0byByZW5kZXIgbmV4dC9wcmV2aW91cyBwYWdlcy5cbiAgICBpZiAoc2Nyb2xsZWREb3duKSB7XG4gICAgICBjb25zdCBuZXh0UGFnZUluZGV4ID0gdmlzaWJsZS5sYXN0LmlkO1xuICAgICAgLy8gSURzIHN0YXJ0IGF0IDEsIHNvIG5vIG5lZWQgdG8gYWRkIDEuXG4gICAgICBpZiAodmlld3NbbmV4dFBhZ2VJbmRleF0gJiYgIXRoaXMuaXNWaWV3RmluaXNoZWQodmlld3NbbmV4dFBhZ2VJbmRleF0pKSB7XG4gICAgICAgIHJldHVybiB2aWV3c1tuZXh0UGFnZUluZGV4XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJldmlvdXNQYWdlSW5kZXggPSB2aXNpYmxlLmZpcnN0LmlkIC0gMjtcbiAgICAgIGlmIChcbiAgICAgICAgdmlld3NbcHJldmlvdXNQYWdlSW5kZXhdICYmXG4gICAgICAgICF0aGlzLmlzVmlld0ZpbmlzaGVkKHZpZXdzW3ByZXZpb3VzUGFnZUluZGV4XSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdmlld3NbcHJldmlvdXNQYWdlSW5kZXhdO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBFdmVyeXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgaGFzIGJlZW4uXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtJUmVuZGVyYWJsZVZpZXd9IHZpZXdcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1ZpZXdGaW5pc2hlZCh2aWV3KSB7XG4gICAgcmV0dXJuIHZpZXcucmVuZGVyaW5nU3RhdGUgPT09IFJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSBwYWdlIG9yIHRodW1ibmFpbCB2aWV3LiBUaGlzIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvblxuICAgKiBiYXNlZCBvbiB0aGUgdmlld3Mgc3RhdGUuIElmIHRoZSB2aWV3IGlzIGFscmVhZHkgcmVuZGVyZWQgaXQgd2lsbCByZXR1cm5cbiAgICogYGZhbHNlYC5cbiAgICpcbiAgICogQHBhcmFtIHtJUmVuZGVyYWJsZVZpZXd9IHZpZXdcbiAgICovXG4gIHJlbmRlclZpZXcodmlldykge1xuICAgIHN3aXRjaCAodmlldy5yZW5kZXJpbmdTdGF0ZSkge1xuICAgICAgY2FzZSBSZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLlBBVVNFRDpcbiAgICAgICAgdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID0gdmlldy5yZW5kZXJpbmdJZDtcbiAgICAgICAgdmlldy5yZXN1bWUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlbmRlcmluZ1N0YXRlcy5SVU5OSU5HOlxuICAgICAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSB2aWV3LnJlbmRlcmluZ0lkO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw6XG4gICAgICAgIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9IHZpZXcucmVuZGVyaW5nSWQ7XG4gICAgICAgIHZpZXdcbiAgICAgICAgICAuZHJhdygpXG4gICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJIaWdoZXN0UHJpb3JpdHkoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgcmVuZGVyVmlldzogXCIke3JlYXNvbn1cImApO1xuICAgICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IHsgUmVuZGVyaW5nU3RhdGVzLCBQREZSZW5kZXJpbmdRdWV1ZSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTcgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEJhc2VWaWV3ZXIgfSBmcm9tIFwiLi9iYXNlX3ZpZXdlci5qc1wiO1xuaW1wb3J0IHsgc2hhZG93IH0gZnJvbSBcInBkZmpzLWxpYlwiO1xuXG5jbGFzcyBQREZTaW5nbGVQYWdlVmlld2VyIGV4dGVuZHMgQmFzZVZpZXdlciB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZXZlbnRCdXMuX29uKFwicGFnZXNpbml0XCIsIGV2dCA9PiB7XG4gICAgICAvLyBTaW5jZSB0aGUgcGFnZXMgYXJlIHBsYWNlZCBpbiBhIGBEb2N1bWVudEZyYWdtZW50YCwgbWFrZSBzdXJlIHRoYXRcbiAgICAgIC8vIHRoZSBjdXJyZW50IHBhZ2UgYmVjb21lcyB2aXNpYmxlIHVwb24gbG9hZGluZyBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICB0aGlzLl9lbnN1cmVQYWdlVmlld1Zpc2libGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBfdmlld2VyRWxlbWVudCgpIHtcbiAgICAvLyBTaW5jZSB3ZSBvbmx5IHdhbnQgdG8gZGlzcGxheSAqb25lKiBwYWdlIGF0IGEgdGltZSB3aGVuIHVzaW5nIHRoZVxuICAgIC8vIGBQREZTaW5nbGVQYWdlVmlld2VyYCwgd2UgY2Fubm90IGFwcGVuZCB0aGVtIHRvIHRoZSBgdmlld2VyYCBET00gZWxlbWVudC5cbiAgICAvLyBJbnN0ZWFkLCB0aGV5IGFyZSBwbGFjZWQgaW4gYSBgRG9jdW1lbnRGcmFnbWVudGAsIGFuZCBvbmx5IHRoZSBjdXJyZW50XG4gICAgLy8gcGFnZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIHZpZXdlciAocmVmZXIgdG8gYHRoaXMuX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZWApLlxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfdmlld2VyRWxlbWVudFwiLCB0aGlzLl9zaGFkb3dWaWV3ZXIpO1xuICB9XG5cbiAgX3Jlc2V0VmlldygpIHtcbiAgICBzdXBlci5fcmVzZXRWaWV3KCk7XG4gICAgdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyID0gMTtcbiAgICB0aGlzLl9zaGFkb3dWaWV3ZXIgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgdGhpcy5fdXBkYXRlU2Nyb2xsRG93biA9IG51bGw7XG4gIH1cblxuICBfZW5zdXJlUGFnZVZpZXdWaXNpYmxlKCkge1xuICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSAxXTtcbiAgICBjb25zdCBwcmV2aW91c1BhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyIC0gMV07XG5cbiAgICBjb25zdCB2aWV3ZXJOb2RlcyA9IHRoaXMudmlld2VyLmNoaWxkTm9kZXM7XG4gICAgc3dpdGNoICh2aWV3ZXJOb2Rlcy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogLy8gU2hvdWxkICpvbmx5KiBvY2N1ciBvbiBpbml0aWFsIGxvYWRpbmcuXG4gICAgICAgIHRoaXMudmlld2VyLmFwcGVuZENoaWxkKHBhZ2VWaWV3LmRpdik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAvLyBUaGUgbm9ybWFsIHBhZ2Utc3dpdGNoaW5nIGNhc2UuXG4gICAgICAgIGlmICh2aWV3ZXJOb2Rlc1swXSAhPT0gcHJldmlvdXNQYWdlVmlldy5kaXYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIl9lbnN1cmVQYWdlVmlld1Zpc2libGU6IFVuZXhwZWN0ZWQgcHJldmlvdXNseSB2aXNpYmxlIHBhZ2UuXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlVmlldyA9PT0gcHJldmlvdXNQYWdlVmlldykge1xuICAgICAgICAgIGJyZWFrOyAvLyBUaGUgY29ycmVjdCBwYWdlIGlzIGFscmVhZHkgdmlzaWJsZS5cbiAgICAgICAgfVxuICAgICAgICAvLyBTd2l0Y2ggdmlzaWJsZSBwYWdlcywgYW5kIHJlc2V0IHRoZSB2aWV3ZXJDb250YWluZXIgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAgICB0aGlzLl9zaGFkb3dWaWV3ZXIuYXBwZW5kQ2hpbGQocHJldmlvdXNQYWdlVmlldy5kaXYpO1xuICAgICAgICB0aGlzLnZpZXdlci5hcHBlbmRDaGlsZChwYWdlVmlldy5kaXYpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZTogT25seSBvbmUgcGFnZSBzaG91bGQgYmUgdmlzaWJsZSBhdCBhIHRpbWUuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXI7XG4gIH1cblxuICBfc2Nyb2xsVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLl91cGRhdGVTY3JvbGxEb3duKSB7XG4gICAgICB0aGlzLl91cGRhdGVTY3JvbGxEb3duKCk7XG4gICAgfVxuICAgIHN1cGVyLl9zY3JvbGxVcGRhdGUoKTtcbiAgfVxuXG4gIF9zY3JvbGxJbnRvVmlldyh7IHBhZ2VEaXYsIHBhZ2VTcG90ID0gbnVsbCwgcGFnZU51bWJlciA9IG51bGwgfSkge1xuICAgIGlmIChwYWdlTnVtYmVyKSB7XG4gICAgICAvLyBFbnN1cmUgdGhhdCBgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXJgIGlzIGNvcnJlY3QuXG4gICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyKTtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsZWREb3duID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPj0gdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyO1xuXG4gICAgdGhpcy5fZW5zdXJlUGFnZVZpZXdWaXNpYmxlKCk7XG4gICAgLy8gRW5zdXJlIHRoYXQgcmVuZGVyaW5nIGFsd2F5cyBvY2N1cnMsIHRvIGF2b2lkIHNob3dpbmcgYSBibGFuayBwYWdlLFxuICAgIC8vIGV2ZW4gaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gZG9lc24ndCBjaGFuZ2Ugd2hlbiB0aGUgcGFnZSBpcyBzY3JvbGxlZC5cbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgc3VwZXIuX3Njcm9sbEludG9WaWV3KHsgcGFnZURpdiwgcGFnZVNwb3QsIHBhZ2VOdW1iZXIgfSk7XG5cbiAgICAvLyBTaW5jZSBzY3JvbGxpbmcgaXMgdHJhY2tlZCB1c2luZyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgdXBkYXRlIHRoZVxuICAgIC8vIHNjcm9sbCBkaXJlY3Rpb24gZHVyaW5nIHRoZSBuZXh0IGB0aGlzLl9zY3JvbGxVcGRhdGVgIGludm9jYXRpb24uXG4gICAgdGhpcy5fdXBkYXRlU2Nyb2xsRG93biA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsLmRvd24gPSBzY3JvbGxlZERvd247XG4gICAgICB0aGlzLl91cGRhdGVTY3JvbGxEb3duID0gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgX2dldFZpc2libGVQYWdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q3VycmVudFZpc2libGVQYWdlKCk7XG4gIH1cblxuICBfdXBkYXRlSGVscGVyKHZpc2libGVQYWdlcykge31cblxuICBnZXQgX2lzU2Nyb2xsTW9kZUhvcml6b250YWwoKSB7XG4gICAgLy8gVGhlIFNjcm9sbC9TcHJlYWQgbW9kZXMgYXJlIG5ldmVyIHVzZWQgaW4gYFBERlNpbmdsZVBhZ2VWaWV3ZXJgLlxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfaXNTY3JvbGxNb2RlSG9yaXpvbnRhbFwiLCBmYWxzZSk7XG4gIH1cblxuICBfdXBkYXRlU2Nyb2xsTW9kZSgpIHt9XG5cbiAgX3VwZGF0ZVNwcmVhZE1vZGUoKSB7fVxufVxuXG5leHBvcnQgeyBQREZTaW5nbGVQYWdlVmlld2VyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ1NTX1VOSVRTLFxuICBERUZBVUxUX1NDQUxFLFxuICBERUZBVUxUX1NDQUxFX1ZBTFVFLFxuICBnZXRWaXNpYmxlRWxlbWVudHMsXG4gIGlzUG9ydHJhaXRPcmllbnRhdGlvbixcbiAgaXNWYWxpZFJvdGF0aW9uLFxuICBpc1ZhbGlkU2Nyb2xsTW9kZSxcbiAgaXNWYWxpZFNwcmVhZE1vZGUsXG4gIE1BWF9BVVRPX1NDQUxFLFxuICBtb3ZlVG9FbmRPZkFycmF5LFxuICBOdWxsTDEwbixcbiAgUHJlc2VudGF0aW9uTW9kZVN0YXRlLFxuICBSZW5kZXJlclR5cGUsXG4gIFNDUk9MTEJBUl9QQURESU5HLFxuICBzY3JvbGxJbnRvVmlldyxcbiAgU2Nyb2xsTW9kZSxcbiAgU3ByZWFkTW9kZSxcbiAgVGV4dExheWVyTW9kZSxcbiAgVU5LTk9XTl9TQ0FMRSxcbiAgVkVSVElDQUxfUEFERElORyxcbiAgd2F0Y2hTY3JvbGwsXG59IGZyb20gXCIuL3VpX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBQREZSZW5kZXJpbmdRdWV1ZSwgUmVuZGVyaW5nU3RhdGVzIH0gZnJvbSBcIi4vcGRmX3JlbmRlcmluZ19xdWV1ZS5qc1wiO1xuaW1wb3J0IHsgQW5ub3RhdGlvbkxheWVyQnVpbGRlciB9IGZyb20gXCIuL2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkgfSBmcm9tIFwicGRmanMtbGliXCI7XG5pbXBvcnQgeyBQREZQYWdlVmlldyB9IGZyb20gXCIuL3BkZl9wYWdlX3ZpZXcuanNcIjtcbmltcG9ydCB7IFNpbXBsZUxpbmtTZXJ2aWNlIH0gZnJvbSBcIi4vcGRmX2xpbmtfc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgVGV4dExheWVyQnVpbGRlciB9IGZyb20gXCIuL3RleHRfbGF5ZXJfYnVpbGRlci5qc1wiO1xuXG5jb25zdCBERUZBVUxUX0NBQ0hFX1NJWkUgPSAxMDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQREZWaWV3ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXIgLSBUaGUgY29udGFpbmVyIGZvciB0aGUgdmlld2VyIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSBbdmlld2VyXSAtIFRoZSB2aWV3ZXIgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRCdXN9IGV2ZW50QnVzIC0gVGhlIGFwcGxpY2F0aW9uIGV2ZW50IGJ1cy5cbiAqIEBwcm9wZXJ0eSB7SVBERkxpbmtTZXJ2aWNlfSBsaW5rU2VydmljZSAtIFRoZSBuYXZpZ2F0aW9uL2xpbmtpbmcgc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7RG93bmxvYWRNYW5hZ2VyfSBbZG93bmxvYWRNYW5hZ2VyXSAtIFRoZSBkb3dubG9hZCBtYW5hZ2VyXG4gKiAgIGNvbXBvbmVudC5cbiAqIEBwcm9wZXJ0eSB7UERGRmluZENvbnRyb2xsZXJ9IFtmaW5kQ29udHJvbGxlcl0gLSBUaGUgZmluZCBjb250cm9sbGVyXG4gKiAgIGNvbXBvbmVudC5cbiAqIEBwcm9wZXJ0eSB7UERGUmVuZGVyaW5nUXVldWV9IFtyZW5kZXJpbmdRdWV1ZV0gLSBUaGUgcmVuZGVyaW5nIHF1ZXVlIG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JlbW92ZVBhZ2VCb3JkZXJzXSAtIFJlbW92ZXMgdGhlIGJvcmRlciBzaGFkb3cgYXJvdW5kXG4gKiAgIHRoZSBwYWdlcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGV4dExheWVyTW9kZV0gLSBDb250cm9scyBpZiB0aGUgdGV4dCBsYXllciB1c2VkIGZvclxuICogICBzZWxlY3Rpb24gYW5kIHNlYXJjaGluZyBpcyBjcmVhdGVkLCBhbmQgaWYgdGhlIGltcHJvdmVkIHRleHQgc2VsZWN0aW9uXG4gKiAgIGJlaGF2aW91ciBpcyBlbmFibGVkLiBUaGUgY29uc3RhbnRzIGZyb20ge1RleHRMYXllck1vZGV9IHNob3VsZCBiZSB1c2VkLlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgVGV4dExheWVyTW9kZS5FTkFCTEVgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbWFnZVJlc291cmNlc1BhdGhdIC0gUGF0aCBmb3IgaW1hZ2UgcmVzb3VyY2VzLCBtYWlubHlcbiAqICAgbWFpbmx5IGZvciBhbm5vdGF0aW9uIGljb25zLiBJbmNsdWRlIHRyYWlsaW5nIHNsYXNoLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVuZGVySW50ZXJhY3RpdmVGb3Jtc10gLSBFbmFibGVzIHJlbmRlcmluZyBvZlxuICogICBpbnRlcmFjdGl2ZSBmb3JtIGVsZW1lbnRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVQcmludEF1dG9Sb3RhdGVdIC0gRW5hYmxlcyBhdXRvbWF0aWMgcm90YXRpb24gb2ZcbiAqICAgbGFuZHNjYXBlIHBhZ2VzIHVwb24gcHJpbnRpbmcuIFRoZSBkZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVuZGVyZXIgLSAnY2FudmFzJyBvciAnc3ZnJy4gVGhlIGRlZmF1bHQgaXMgJ2NhbnZhcycuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVXZWJHTF0gLSBFbmFibGVzIFdlYkdMIGFjY2VsZXJhdGVkIHJlbmRlcmluZyBmb3JcbiAqICAgc29tZSBvcGVyYXRpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlT25seUNzc1pvb21dIC0gRW5hYmxlcyBDU1Mgb25seSB6b29taW5nLiBUaGUgZGVmYXVsdFxuICogICB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDYW52YXNQaXhlbHNdIC0gVGhlIG1heGltdW0gc3VwcG9ydGVkIGNhbnZhcyBzaXplIGluXG4gKiAgIHRvdGFsIHBpeGVscywgaS5lLiB3aWR0aCAqIGhlaWdodC4gVXNlIC0xIGZvciBubyBsaW1pdC4gVGhlIGRlZmF1bHQgdmFsdWVcbiAqICAgaXMgNDA5NiAqIDQwOTYgKDE2IG1lZ2EtcGl4ZWxzKS5cbiAqIEBwcm9wZXJ0eSB7SUwxMG59IGwxMG4gLSBMb2NhbGl6YXRpb24gc2VydmljZS5cbiAqL1xuXG5mdW5jdGlvbiBQREZQYWdlVmlld0J1ZmZlcihzaXplKSB7XG4gIGNvbnN0IGRhdGEgPSBbXTtcbiAgdGhpcy5wdXNoID0gZnVuY3Rpb24gKHZpZXcpIHtcbiAgICBjb25zdCBpID0gZGF0YS5pbmRleE9mKHZpZXcpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIGRhdGEuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgICBkYXRhLnB1c2godmlldyk7XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gc2l6ZSkge1xuICAgICAgZGF0YS5zaGlmdCgpLmRlc3Ryb3koKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBBZnRlciBjYWxsaW5nIHJlc2l6ZSwgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3aWxsIGJlIG5ld1NpemUuIFRoZSBvcHRpb25hbFxuICAgKiBwYXJhbWV0ZXIgcGFnZXNUb0tlZXAgaXMsIGlmIHByZXNlbnQsIGFuIGFycmF5IG9mIHBhZ2VzIHRvIHB1c2ggdG8gdGhlIGJhY2tcbiAgICogb2YgdGhlIGJ1ZmZlciwgZGVsYXlpbmcgdGhlaXIgZGVzdHJ1Y3Rpb24uIFRoZSBzaXplIG9mIHBhZ2VzVG9LZWVwIGhhcyBub1xuICAgKiBpbXBhY3Qgb24gdGhlIGZpbmFsIHNpemUgb2YgdGhlIGJ1ZmZlcjsgaWYgcGFnZXNUb0tlZXAgaGFzIGxlbmd0aCBsYXJnZXJcbiAgICogdGhhbiBuZXdTaXplLCBzb21lIG9mIHRob3NlIHBhZ2VzIHdpbGwgYmUgZGVzdHJveWVkIGFueXdheS5cbiAgICovXG4gIHRoaXMucmVzaXplID0gZnVuY3Rpb24gKG5ld1NpemUsIHBhZ2VzVG9LZWVwKSB7XG4gICAgc2l6ZSA9IG5ld1NpemU7XG4gICAgaWYgKHBhZ2VzVG9LZWVwKSB7XG4gICAgICBjb25zdCBwYWdlSWRzVG9LZWVwID0gbmV3IFNldCgpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGlNYXggPSBwYWdlc1RvS2VlcC5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHtcbiAgICAgICAgcGFnZUlkc1RvS2VlcC5hZGQocGFnZXNUb0tlZXBbaV0uaWQpO1xuICAgICAgfVxuICAgICAgbW92ZVRvRW5kT2ZBcnJheShkYXRhLCBmdW5jdGlvbiAocGFnZSkge1xuICAgICAgICByZXR1cm4gcGFnZUlkc1RvS2VlcC5oYXMocGFnZS5pZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgd2hpbGUgKGRhdGEubGVuZ3RoID4gc2l6ZSkge1xuICAgICAgZGF0YS5zaGlmdCgpLmRlc3Ryb3koKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzU2FtZVNjYWxlKG9sZFNjYWxlLCBuZXdTY2FsZSkge1xuICBpZiAobmV3U2NhbGUgPT09IG9sZFNjYWxlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKE1hdGguYWJzKG5ld1NjYWxlIC0gb2xkU2NhbGUpIDwgMWUtMTUpIHtcbiAgICAvLyBQcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcmluZyBvZiBhbGwgcGFnZXMgd2hlbiB0aGUgc2NhbGVcbiAgICAvLyBjaGFuZ2VzIG9ubHkgYmVjYXVzZSBvZiBsaW1pdGVkIG51bWVyaWNhbCBwcmVjaXNpb24uXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNpbXBsZSB2aWV3ZXIgY29udHJvbCB0byBkaXNwbGF5IFBERiBjb250ZW50L3BhZ2VzLlxuICogQGltcGxlbWVudHMge0lSZW5kZXJhYmxlVmlld31cbiAqL1xuY2xhc3MgQmFzZVZpZXdlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge1BERlZpZXdlck9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVZpZXdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVZpZXdlci5cIik7XG4gICAgfVxuICAgIHRoaXMuX25hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuICAgIHRoaXMudmlld2VyID0gb3B0aW9ucy52aWV3ZXIgfHwgb3B0aW9ucy5jb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICBpZiAoXG4gICAgICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIFBERkpTRGV2LnRlc3QoXCIhUFJPRFVDVElPTiB8fCBHRU5FUklDXCIpKSAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRGl2RWxlbWVudCAmJlxuICAgICAgICB0aGlzLnZpZXdlciBpbnN0YW5jZW9mIEhUTUxEaXZFbGVtZW50XG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGBjb250YWluZXJgIGFuZC9vciBgdmlld2VyYCBvcHRpb24uXCIpO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcbiAgICB0aGlzLmxpbmtTZXJ2aWNlID0gb3B0aW9ucy5saW5rU2VydmljZSB8fCBuZXcgU2ltcGxlTGlua1NlcnZpY2UoKTtcbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IG9wdGlvbnMuZG93bmxvYWRNYW5hZ2VyIHx8IG51bGw7XG4gICAgdGhpcy5maW5kQ29udHJvbGxlciA9IG9wdGlvbnMuZmluZENvbnRyb2xsZXIgfHwgbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzID0gb3B0aW9ucy5yZW1vdmVQYWdlQm9yZGVycyB8fCBmYWxzZTtcbiAgICB0aGlzLnRleHRMYXllck1vZGUgPSBOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMudGV4dExheWVyTW9kZSlcbiAgICAgID8gb3B0aW9ucy50ZXh0TGF5ZXJNb2RlXG4gICAgICA6IFRleHRMYXllck1vZGUuRU5BQkxFO1xuICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gb3B0aW9ucy5pbWFnZVJlc291cmNlc1BhdGggfHwgXCJcIjtcbiAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgPyBvcHRpb25zLnJlbmRlckludGVyYWN0aXZlRm9ybXNcbiAgICAgICAgOiB0cnVlO1xuICAgIHRoaXMuZW5hYmxlUHJpbnRBdXRvUm90YXRlID0gb3B0aW9ucy5lbmFibGVQcmludEF1dG9Sb3RhdGUgfHwgZmFsc2U7XG4gICAgdGhpcy5yZW5kZXJlciA9IG9wdGlvbnMucmVuZGVyZXIgfHwgUmVuZGVyZXJUeXBlLkNBTlZBUztcbiAgICB0aGlzLmVuYWJsZVdlYkdMID0gb3B0aW9ucy5lbmFibGVXZWJHTCB8fCBmYWxzZTtcbiAgICB0aGlzLnVzZU9ubHlDc3Nab29tID0gb3B0aW9ucy51c2VPbmx5Q3NzWm9vbSB8fCBmYWxzZTtcbiAgICB0aGlzLm1heENhbnZhc1BpeGVscyA9IG9wdGlvbnMubWF4Q2FudmFzUGl4ZWxzO1xuICAgIHRoaXMubDEwbiA9IG9wdGlvbnMubDEwbiB8fCBOdWxsTDEwbjtcblxuICAgIHRoaXMuZGVmYXVsdFJlbmRlcmluZ1F1ZXVlID0gIW9wdGlvbnMucmVuZGVyaW5nUXVldWU7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFJlbmRlcmluZ1F1ZXVlKSB7XG4gICAgICAvLyBDdXN0b20gcmVuZGVyaW5nIHF1ZXVlIGlzIG5vdCBzcGVjaWZpZWQsIHVzaW5nIGRlZmF1bHQgb25lXG4gICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gbmV3IFBERlJlbmRlcmluZ1F1ZXVlKCk7XG4gICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlLnNldFZpZXdlcih0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZSA9IG9wdGlvbnMucmVuZGVyaW5nUXVldWU7XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGwgPSB3YXRjaFNjcm9sbCh0aGlzLmNvbnRhaW5lciwgdGhpcy5fc2Nyb2xsVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID0gUHJlc2VudGF0aW9uTW9kZVN0YXRlLlVOS05PV047XG4gICAgdGhpcy5fb25CZWZvcmVEcmF3ID0gdGhpcy5fb25BZnRlckRyYXcgPSBudWxsO1xuICAgIHRoaXMuX3Jlc2V0VmlldygpO1xuXG4gICAgaWYgKHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMpIHtcbiAgICAgIHRoaXMudmlld2VyLmNsYXNzTGlzdC5hZGQoXCJyZW1vdmVQYWdlQm9yZGVyc1wiKTtcbiAgICB9XG4gICAgLy8gRGVmZXIgdGhlIGRpc3BhdGNoaW5nIG9mIHRoaXMgZXZlbnQsIHRvIGdpdmUgb3RoZXIgdmlld2VyIGNvbXBvbmVudHNcbiAgICAvLyB0aW1lIHRvIGluaXRpYWxpemUgKmFuZCogcmVnaXN0ZXIgJ2Jhc2V2aWV3ZXJpbml0JyBldmVudCBsaXN0ZW5lcnMuXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwiYmFzZXZpZXdlcmluaXRcIiwgeyBzb3VyY2U6IHRoaXMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgcGFnZXNDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZXMubGVuZ3RoO1xuICB9XG5cbiAgZ2V0UGFnZVZpZXcoaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZXNbaW5kZXhdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtib29sZWFufSAtIFRydWUgaWYgYWxsIHtQREZQYWdlVmlld30gb2JqZWN0cyBhcmUgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBnZXQgcGFnZVZpZXdzUmVhZHkoKSB7XG4gICAgaWYgKCF0aGlzLl9wYWdlc0NhcGFiaWxpdHkuc2V0dGxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBQcmV2ZW50IHByaW50aW5nIGVycm9ycyB3aGVuICdkaXNhYmxlQXV0b0ZldGNoJyBpcyBzZXQsIGJ5IGVuc3VyaW5nXG4gICAgLy8gdGhhdCAqYWxsKiBwYWdlcyBoYXZlIGluIGZhY3QgYmVlbiBjb21wbGV0ZWx5IGxvYWRlZC5cbiAgICByZXR1cm4gdGhpcy5fcGFnZXMuZXZlcnkoZnVuY3Rpb24gKHBhZ2VWaWV3KSB7XG4gICAgICByZXR1cm4gcGFnZVZpZXcgJiYgcGFnZVZpZXcucGRmUGFnZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGN1cnJlbnRQYWdlTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsIC0gVGhlIHBhZ2UgbnVtYmVyLlxuICAgKi9cbiAgc2V0IGN1cnJlbnRQYWdlTnVtYmVyKHZhbCkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZ2UgbnVtYmVyLlwiKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSBpbnRlbnQgY2FuIGJlIHRvIGp1c3QgcmVzZXQgYSBzY3JvbGwgcG9zaXRpb24gYW5kL29yIHNjYWxlLlxuICAgIGlmICghdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIodmFsLCAvKiByZXNldEN1cnJlbnRQYWdlVmlldyA9ICovIHRydWUpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgJHt0aGlzLl9uYW1lfS5jdXJyZW50UGFnZU51bWJlcjogXCIke3ZhbH1cIiBpcyBub3QgYSB2YWxpZCBwYWdlLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBwYWdlTnVtYmVyIGlzIHZhbGlkICh3aXRoaW4gYm91bmRzKS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXRDdXJyZW50UGFnZU51bWJlcih2YWwsIHJlc2V0Q3VycmVudFBhZ2VWaWV3ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPT09IHZhbCkge1xuICAgICAgaWYgKHJlc2V0Q3VycmVudFBhZ2VWaWV3KSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0Q3VycmVudFBhZ2VWaWV3KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoISgwIDwgdmFsICYmIHZhbCA8PSB0aGlzLnBhZ2VzQ291bnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID0gdmFsO1xuXG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VjaGFuZ2luZ1wiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBwYWdlTnVtYmVyOiB2YWwsXG4gICAgICBwYWdlTGFiZWw6IHRoaXMuX3BhZ2VMYWJlbHMgJiYgdGhpcy5fcGFnZUxhYmVsc1t2YWwgLSAxXSxcbiAgICB9KTtcblxuICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykge1xuICAgICAgdGhpcy5fcmVzZXRDdXJyZW50UGFnZVZpZXcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ3xudWxsfSBSZXR1cm5zIHRoZSBjdXJyZW50IHBhZ2UgbGFiZWwsIG9yIGBudWxsYCBpZiBubyBwYWdlXG4gICAqICAgbGFiZWxzIGV4aXN0LlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRQYWdlTGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VMYWJlbHMgJiYgdGhpcy5fcGFnZUxhYmVsc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgLSBUaGUgcGFnZSBsYWJlbC5cbiAgICovXG4gIHNldCBjdXJyZW50UGFnZUxhYmVsKHZhbCkge1xuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcGFnZSA9IHZhbCB8IDA7IC8vIEZhbGxiYWNrIHBhZ2UgbnVtYmVyLlxuICAgIGlmICh0aGlzLl9wYWdlTGFiZWxzKSB7XG4gICAgICBjb25zdCBpID0gdGhpcy5fcGFnZUxhYmVscy5pbmRleE9mKHZhbCk7XG4gICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgIHBhZ2UgPSBpICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlIGludGVudCBjYW4gYmUgdG8ganVzdCByZXNldCBhIHNjcm9sbCBwb3NpdGlvbiBhbmQvb3Igc2NhbGUuXG4gICAgaWYgKCF0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlLCAvKiByZXNldEN1cnJlbnRQYWdlVmlldyA9ICovIHRydWUpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgJHt0aGlzLl9uYW1lfS5jdXJyZW50UGFnZUxhYmVsOiBcIiR7dmFsfVwiIGlzIG5vdCBhIHZhbGlkIHBhZ2UuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBjdXJyZW50U2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTY2FsZSAhPT0gVU5LTk9XTl9TQ0FMRVxuICAgICAgPyB0aGlzLl9jdXJyZW50U2NhbGVcbiAgICAgIDogREVGQVVMVF9TQ0FMRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsIC0gU2NhbGUgb2YgdGhlIHBhZ2VzIGluIHBlcmNlbnRzLlxuICAgKi9cbiAgc2V0IGN1cnJlbnRTY2FsZSh2YWwpIHtcbiAgICBpZiAoaXNOYU4odmFsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBudW1lcmljIHNjYWxlLlwiKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NldFNjYWxlKHZhbCwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY3VycmVudFNjYWxlVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWwgLSBUaGUgc2NhbGUgb2YgdGhlIHBhZ2VzIChpbiBwZXJjZW50IG9yIHByZWRlZmluZWQgdmFsdWUpLlxuICAgKi9cbiAgc2V0IGN1cnJlbnRTY2FsZVZhbHVlKHZhbCkge1xuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRTY2FsZSh2YWwsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHBhZ2VzUm90YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzUm90YXRpb247XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJvdGF0aW9uIC0gVGhlIHJvdGF0aW9uIG9mIHRoZSBwYWdlcyAoMCwgOTAsIDE4MCwgMjcwKS5cbiAgICovXG4gIHNldCBwYWdlc1JvdGF0aW9uKHJvdGF0aW9uKSB7XG4gICAgaWYgKCFpc1ZhbGlkUm90YXRpb24ocm90YXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZ2VzIHJvdGF0aW9uIGFuZ2xlLlwiKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9wYWdlc1JvdGF0aW9uID09PSByb3RhdGlvbikge1xuICAgICAgcmV0dXJuOyAvLyBUaGUgcm90YXRpb24gZGlkbid0IGNoYW5nZS5cbiAgICB9XG4gICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IHJvdGF0aW9uO1xuXG4gICAgY29uc3QgcGFnZU51bWJlciA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1tpXTtcbiAgICAgIHBhZ2VWaWV3LnVwZGF0ZShwYWdlVmlldy5zY2FsZSwgcm90YXRpb24pO1xuICAgIH1cbiAgICAvLyBQcmV2ZW50IGVycm9ycyBpbiBjYXNlIHRoZSByb3RhdGlvbiBjaGFuZ2VzICpiZWZvcmUqIHRoZSBzY2FsZSBoYXMgYmVlblxuICAgIC8vIHNldCB0byBhIG5vbi1kZWZhdWx0IHZhbHVlLlxuICAgIGlmICh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSkge1xuICAgICAgdGhpcy5fc2V0U2NhbGUodGhpcy5fY3VycmVudFNjYWxlVmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJyb3RhdGlvbmNoYW5naW5nXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIHBhZ2VzUm90YXRpb246IHJvdGF0aW9uLFxuICAgICAgcGFnZU51bWJlcixcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSkge1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmlyc3RQYWdlUHJvbWlzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucHJvbWlzZSA6IG51bGw7XG4gIH1cblxuICBnZXQgb25lUGFnZVJlbmRlcmVkKCkge1xuICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5wcm9taXNlIDogbnVsbDtcbiAgfVxuXG4gIGdldCBwYWdlc1Byb21pc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucHJvbWlzZSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfdmlld2VyRWxlbWVudCgpIHtcbiAgICAvLyBJbiBtb3N0IHZpZXdlcnMsIGUuZy4gYFBERlZpZXdlcmAsIHRoaXMgc2hvdWxkIHJldHVybiBgdGhpcy52aWV3ZXJgLlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZDogX3ZpZXdlckVsZW1lbnRcIik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbmVQYWdlUmVuZGVyZWRPckZvcmNlRmV0Y2goKSB7XG4gICAgLy8gVW5sZXNzIHRoZSB2aWV3ZXIgKmFuZCogaXRzIHBhZ2VzIGFyZSB2aXNpYmxlLCByZW5kZXJpbmcgd29uJ3Qgc3RhcnQgYW5kXG4gICAgLy8gYHRoaXMuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHlgIHRodXMgd29uJ3QgYmUgcmVzb2x2ZWQuXG4gICAgLy8gVG8gZW5zdXJlIHRoYXQgYXV0b21hdGljIHByaW50aW5nLCBvbiBkb2N1bWVudCBsb2FkLCBzdGlsbCB3b3JrcyBldmVuIGluXG4gICAgLy8gdGhvc2UgY2FzZXMgd2UgZm9yY2UtYWxsb3cgZmV0Y2hpbmcgb2YgYWxsIHBhZ2VzIHdoZW46XG4gICAgLy8gIC0gVGhlIHZpZXdlciBpcyBoaWRkZW4gaW4gdGhlIERPTSwgZS5nLiBpbiBhIGBkaXNwbGF5OiBub25lYCA8aWZyYW1lPlxuICAgIC8vICAgIGVsZW1lbnQ7IGZpeGVzIGJ1ZyAxNjE4NjIxLlxuICAgIC8vICAtIFRoZSB2aWV3ZXIgaXMgdmlzaWJsZSwgYnV0IG5vbmUgb2YgdGhlIHBhZ2VzIGFyZSAoZS5nLiBpZiB0aGVcbiAgICAvLyAgICB2aWV3ZXIgaXMgdmVyeSBzbWFsbCk7IGZpeGVzIGJ1ZyAxNjE4OTU1LlxuICAgIGlmIChcbiAgICAgICF0aGlzLmNvbnRhaW5lci5vZmZzZXRQYXJlbnQgfHxcbiAgICAgIHRoaXMuX2dldFZpc2libGVQYWdlcygpLnZpZXdzLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwZGZEb2N1bWVudCB7UERGRG9jdW1lbnR9XG4gICAqL1xuICBzZXREb2N1bWVudChwZGZEb2N1bWVudCkge1xuICAgIGlmICh0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICB0aGlzLl9jYW5jZWxSZW5kZXJpbmcoKTtcbiAgICAgIHRoaXMuX3Jlc2V0VmlldygpO1xuXG4gICAgICBpZiAodGhpcy5maW5kQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLmZpbmRDb250cm9sbGVyLnNldERvY3VtZW50KG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDtcbiAgICBpZiAoIXBkZkRvY3VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VzQ291bnQgPSBwZGZEb2N1bWVudC5udW1QYWdlcztcbiAgICBjb25zdCBmaXJzdFBhZ2VQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0UGFnZSgxKTtcblxuICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0gcGRmRG9jdW1lbnQuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3Qgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuXG4gICAgdGhpcy5fcGFnZXNDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwicGFnZXNsb2FkZWRcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIHBhZ2VzQ291bnQsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX29uQmVmb3JlRHJhdyA9IGV2dCA9PiB7XG4gICAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW2V2dC5wYWdlTnVtYmVyIC0gMV07XG4gICAgICBpZiAoIXBhZ2VWaWV3KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCB0aGUgcGFnZSB0byB0aGUgYnVmZmVyIGF0IHRoZSBzdGFydCBvZiBkcmF3aW5nLiBUaGF0IHdheSBpdCBjYW4gYmVcbiAgICAgIC8vIGV2aWN0ZWQgZnJvbSB0aGUgYnVmZmVyIGFuZCBkZXN0cm95ZWQgZXZlbiBpZiB3ZSBwYXVzZSBpdHMgcmVuZGVyaW5nLlxuICAgICAgdGhpcy5fYnVmZmVyLnB1c2gocGFnZVZpZXcpO1xuICAgIH07XG4gICAgdGhpcy5ldmVudEJ1cy5fb24oXCJwYWdlcmVuZGVyXCIsIHRoaXMuX29uQmVmb3JlRHJhdyk7XG5cbiAgICB0aGlzLl9vbkFmdGVyRHJhdyA9IGV2dCA9PiB7XG4gICAgICBpZiAoZXZ0LmNzc1RyYW5zZm9ybSB8fCB0aGlzLl9vbmVQYWdlUmVuZGVyZWRDYXBhYmlsaXR5LnNldHRsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cbiAgICAgIHRoaXMuZXZlbnRCdXMuX29mZihcInBhZ2VyZW5kZXJlZFwiLCB0aGlzLl9vbkFmdGVyRHJhdyk7XG4gICAgICB0aGlzLl9vbkFmdGVyRHJhdyA9IG51bGw7XG4gICAgfTtcbiAgICB0aGlzLmV2ZW50QnVzLl9vbihcInBhZ2VyZW5kZXJlZFwiLCB0aGlzLl9vbkFmdGVyRHJhdyk7XG5cbiAgICAvLyBGZXRjaCBhIHNpbmdsZSBwYWdlIHNvIHdlIGNhbiBnZXQgYSB2aWV3cG9ydCB0aGF0IHdpbGwgYmUgdGhlIGRlZmF1bHRcbiAgICAvLyB2aWV3cG9ydCBmb3IgYWxsIHBhZ2VzXG4gICAgZmlyc3RQYWdlUHJvbWlzZVxuICAgICAgLnRoZW4oZmlyc3RQZGZQYWdlID0+IHtcbiAgICAgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5yZXNvbHZlKGZpcnN0UGRmUGFnZSk7XG4gICAgICAgIHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlO1xuXG4gICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5jdXJyZW50U2NhbGU7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gZmlyc3RQZGZQYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IHNjYWxlICogQ1NTX1VOSVRTIH0pO1xuICAgICAgICBjb25zdCB0ZXh0TGF5ZXJGYWN0b3J5ID1cbiAgICAgICAgICB0aGlzLnRleHRMYXllck1vZGUgIT09IFRleHRMYXllck1vZGUuRElTQUJMRSA/IHRoaXMgOiBudWxsO1xuXG4gICAgICAgIGZvciAobGV0IHBhZ2VOdW0gPSAxOyBwYWdlTnVtIDw9IHBhZ2VzQ291bnQ7ICsrcGFnZU51bSkge1xuICAgICAgICAgIGNvbnN0IHBhZ2VWaWV3ID0gbmV3IFBERlBhZ2VWaWV3KHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5fdmlld2VyRWxlbWVudCxcbiAgICAgICAgICAgIGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzLFxuICAgICAgICAgICAgaWQ6IHBhZ2VOdW0sXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICAgIGRlZmF1bHRWaWV3cG9ydDogdmlld3BvcnQuY2xvbmUoKSxcbiAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSxcbiAgICAgICAgICAgIHJlbmRlcmluZ1F1ZXVlOiB0aGlzLnJlbmRlcmluZ1F1ZXVlLFxuICAgICAgICAgICAgdGV4dExheWVyRmFjdG9yeSxcbiAgICAgICAgICAgIHRleHRMYXllck1vZGU6IHRoaXMudGV4dExheWVyTW9kZSxcbiAgICAgICAgICAgIGFubm90YXRpb25MYXllckZhY3Rvcnk6IHRoaXMsXG4gICAgICAgICAgICBpbWFnZVJlc291cmNlc1BhdGg6IHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoLFxuICAgICAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLFxuICAgICAgICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICAgICAgICBlbmFibGVXZWJHTDogdGhpcy5lbmFibGVXZWJHTCxcbiAgICAgICAgICAgIHVzZU9ubHlDc3Nab29tOiB0aGlzLnVzZU9ubHlDc3Nab29tLFxuICAgICAgICAgICAgbWF4Q2FudmFzUGl4ZWxzOiB0aGlzLm1heENhbnZhc1BpeGVscyxcbiAgICAgICAgICAgIGwxMG46IHRoaXMubDEwbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9wYWdlcy5wdXNoKHBhZ2VWaWV3KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdGhlIGZpcnN0IGBwZGZQYWdlYCBpbW1lZGlhdGVseSwgc2luY2UgaXQncyBhbHJlYWR5IGxvYWRlZCxcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHJlcGVhdCB0aGUgYFBERkRvY3VtZW50UHJveHkuZ2V0UGFnZWAgY2FsbCBpblxuICAgICAgICAvLyB0aGUgYHRoaXMuX2Vuc3VyZVBkZlBhZ2VMb2FkZWRgIG1ldGhvZCBiZWZvcmUgcmVuZGVyaW5nIGNhbiBzdGFydC5cbiAgICAgICAgY29uc3QgZmlyc3RQYWdlVmlldyA9IHRoaXMuX3BhZ2VzWzBdO1xuICAgICAgICBpZiAoZmlyc3RQYWdlVmlldykge1xuICAgICAgICAgIGZpcnN0UGFnZVZpZXcuc2V0UGRmUGFnZShmaXJzdFBkZlBhZ2UpO1xuICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuY2FjaGVQYWdlUmVmKDEsIGZpcnN0UGRmUGFnZS5yZWYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zcHJlYWRNb2RlICE9PSBTcHJlYWRNb2RlLk5PTkUpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVTcHJlYWRNb2RlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCBhbGwgdGhlIHBhZ2VzIHNpbmNlIHRoZSB2aWV3cG9ydCBpcyBuZWVkZWQgYmVmb3JlIHByaW50aW5nXG4gICAgICAgIC8vIHN0YXJ0cyB0byBjcmVhdGUgdGhlIGNvcnJlY3Qgc2l6ZSBjYW52YXMuIFdhaXQgdW50aWwgb25lIHBhZ2UgaXNcbiAgICAgICAgLy8gcmVuZGVyZWQgc28gd2UgZG9uJ3QgdGllIHVwIHRvbyBtYW55IHJlc291cmNlcyBlYXJseSBvbi5cbiAgICAgICAgdGhpcy5fb25lUGFnZVJlbmRlcmVkT3JGb3JjZUZldGNoKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZmluZENvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZENvbnRyb2xsZXIuc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpOyAvLyBFbmFibGUgc2VhcmNoaW5nLlxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEluIGFkZGl0aW9uIHRvICdkaXNhYmxlQXV0b0ZldGNoJyBiZWluZyBzZXQsIGFsc28gYXR0ZW1wdCB0byByZWR1Y2VcbiAgICAgICAgICAvLyByZXNvdXJjZSB1c2FnZSB3aGVuIGxvYWRpbmcgKnZlcnkqIGxvbmcvbGFyZ2UgZG9jdW1lbnRzLlxuICAgICAgICAgIGlmIChwZGZEb2N1bWVudC5sb2FkaW5nUGFyYW1zLmRpc2FibGVBdXRvRmV0Y2ggfHwgcGFnZXNDb3VudCA+IDc1MDApIHtcbiAgICAgICAgICAgIC8vIFhYWDogUHJpbnRpbmcgaXMgc2VtaS1icm9rZW4gd2l0aCBhdXRvIGZldGNoIGRpc2FibGVkLlxuICAgICAgICAgICAgdGhpcy5fcGFnZXNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGdldFBhZ2VzTGVmdCA9IHBhZ2VzQ291bnQgLSAxOyAvLyBUaGUgZmlyc3QgcGFnZSB3YXMgYWxyZWFkeSBsb2FkZWQuXG5cbiAgICAgICAgICBpZiAoZ2V0UGFnZXNMZWZ0IDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IHBhZ2VOdW0gPSAyOyBwYWdlTnVtIDw9IHBhZ2VzQ291bnQ7ICsrcGFnZU51bSkge1xuICAgICAgICAgICAgcGRmRG9jdW1lbnQuZ2V0UGFnZShwYWdlTnVtKS50aGVuKFxuICAgICAgICAgICAgICBwZGZQYWdlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3BhZ2VOdW0gLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhZ2VWaWV3LnBkZlBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VWaWV3LnNldFBkZlBhZ2UocGRmUGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuY2FjaGVQYWdlUmVmKHBhZ2VOdW0sIHBkZlBhZ2UucmVmKTtcbiAgICAgICAgICAgICAgICBpZiAoLS1nZXRQYWdlc0xlZnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZWFzb24gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGdldCBwYWdlICR7cGFnZU51bX0gdG8gaW5pdGlhbGl6ZSB2aWV3ZXJgLFxuICAgICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoLS1nZXRQYWdlc0xlZnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VzaW5pdFwiLCB7IHNvdXJjZTogdGhpcyB9KTtcblxuICAgICAgICBpZiAodGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmFibGUgdG8gaW5pdGlhbGl6ZSB2aWV3ZXJcIiwgcmVhc29uKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXl8bnVsbH0gbGFiZWxzXG4gICAqL1xuICBzZXRQYWdlTGFiZWxzKGxhYmVscykge1xuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWxhYmVscykge1xuICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICEoQXJyYXkuaXNBcnJheShsYWJlbHMpICYmIHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgPT09IGxhYmVscy5sZW5ndGgpXG4gICAgKSB7XG4gICAgICB0aGlzLl9wYWdlTGFiZWxzID0gbnVsbDtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbmFtZX0uc2V0UGFnZUxhYmVsczogSW52YWxpZCBwYWdlIGxhYmVscy5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IGxhYmVscztcbiAgICB9XG4gICAgLy8gVXBkYXRlIGFsbCB0aGUgYFBERlBhZ2VWaWV3YCBpbnN0YW5jZXMuXG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1tpXTtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fcGFnZUxhYmVscyAmJiB0aGlzLl9wYWdlTGFiZWxzW2ldO1xuICAgICAgcGFnZVZpZXcuc2V0UGFnZUxhYmVsKGxhYmVsKTtcbiAgICB9XG4gIH1cblxuICBfcmVzZXRWaWV3KCkge1xuICAgIHRoaXMuX3BhZ2VzID0gW107XG4gICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSAxO1xuICAgIHRoaXMuX2N1cnJlbnRTY2FsZSA9IFVOS05PV05fU0NBTEU7XG4gICAgdGhpcy5fY3VycmVudFNjYWxlVmFsdWUgPSBudWxsO1xuICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBudWxsO1xuICAgIHRoaXMuX2J1ZmZlciA9IG5ldyBQREZQYWdlVmlld0J1ZmZlcihERUZBVUxUX0NBQ0hFX1NJWkUpO1xuICAgIHRoaXMuX2xvY2F0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9wYWdlc1JvdGF0aW9uID0gMDtcbiAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLl9wYWdlc1JlcXVlc3RzID0gbmV3IFdlYWtNYXAoKTtcbiAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9vbmVQYWdlUmVuZGVyZWRDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX3Njcm9sbE1vZGUgPSBTY3JvbGxNb2RlLlZFUlRJQ0FMO1xuICAgIHRoaXMuX3NwcmVhZE1vZGUgPSBTcHJlYWRNb2RlLk5PTkU7XG5cbiAgICBpZiAodGhpcy5fb25CZWZvcmVEcmF3KSB7XG4gICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoXCJwYWdlcmVuZGVyXCIsIHRoaXMuX29uQmVmb3JlRHJhdyk7XG4gICAgICB0aGlzLl9vbkJlZm9yZURyYXcgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb25BZnRlckRyYXcpIHtcbiAgICAgIHRoaXMuZXZlbnRCdXMuX29mZihcInBhZ2VyZW5kZXJlZFwiLCB0aGlzLl9vbkFmdGVyRHJhdyk7XG4gICAgICB0aGlzLl9vbkFmdGVyRHJhdyA9IG51bGw7XG4gICAgfVxuICAgIC8vIFJlbW92ZSB0aGUgcGFnZXMgZnJvbSB0aGUgRE9NLi4uXG4gICAgdGhpcy52aWV3ZXIudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIC8vIC4uLiBhbmQgcmVzZXQgdGhlIFNjcm9sbCBtb2RlIENTUyBjbGFzcyhlcykgYWZ0ZXJ3YXJkcy5cbiAgICB0aGlzLl91cGRhdGVTY3JvbGxNb2RlKCk7XG4gIH1cblxuICBfc2Nyb2xsVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnBhZ2VzQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIF9zY3JvbGxJbnRvVmlldyh7IHBhZ2VEaXYsIHBhZ2VTcG90ID0gbnVsbCwgcGFnZU51bWJlciA9IG51bGwgfSkge1xuICAgIHNjcm9sbEludG9WaWV3KHBhZ2VEaXYsIHBhZ2VTcG90KTtcbiAgfVxuXG4gIF9zZXRTY2FsZVVwZGF0ZVBhZ2VzKG5ld1NjYWxlLCBuZXdWYWx1ZSwgbm9TY3JvbGwgPSBmYWxzZSwgcHJlc2V0ID0gZmFsc2UpIHtcbiAgICB0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSA9IG5ld1ZhbHVlLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoaXNTYW1lU2NhbGUodGhpcy5fY3VycmVudFNjYWxlLCBuZXdTY2FsZSkpIHtcbiAgICAgIGlmIChwcmVzZXQpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInNjYWxlY2hhbmdpbmdcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBzY2FsZTogbmV3U2NhbGUsXG4gICAgICAgICAgcHJlc2V0VmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLl9wYWdlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICB0aGlzLl9wYWdlc1tpXS51cGRhdGUobmV3U2NhbGUpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50U2NhbGUgPSBuZXdTY2FsZTtcblxuICAgIGlmICghbm9TY3JvbGwpIHtcbiAgICAgIGxldCBwYWdlID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIsXG4gICAgICAgIGRlc3Q7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2xvY2F0aW9uICYmXG4gICAgICAgICEodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSB8fCB0aGlzLmlzQ2hhbmdpbmdQcmVzZW50YXRpb25Nb2RlKVxuICAgICAgKSB7XG4gICAgICAgIHBhZ2UgPSB0aGlzLl9sb2NhdGlvbi5wYWdlTnVtYmVyO1xuICAgICAgICBkZXN0ID0gW1xuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgeyBuYW1lOiBcIlhZWlwiIH0sXG4gICAgICAgICAgdGhpcy5fbG9jYXRpb24ubGVmdCxcbiAgICAgICAgICB0aGlzLl9sb2NhdGlvbi50b3AsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2Nyb2xsUGFnZUludG9WaWV3KHtcbiAgICAgICAgcGFnZU51bWJlcjogcGFnZSxcbiAgICAgICAgZGVzdEFycmF5OiBkZXN0LFxuICAgICAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0OiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInNjYWxlY2hhbmdpbmdcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgc2NhbGU6IG5ld1NjYWxlLFxuICAgICAgcHJlc2V0VmFsdWU6IHByZXNldCA/IG5ld1ZhbHVlIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZGVmYXVsdFJlbmRlcmluZ1F1ZXVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9zZXRTY2FsZSh2YWx1ZSwgbm9TY3JvbGwgPSBmYWxzZSkge1xuICAgIGxldCBzY2FsZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gICAgaWYgKHNjYWxlID4gMCkge1xuICAgICAgdGhpcy5fc2V0U2NhbGVVcGRhdGVQYWdlcyhzY2FsZSwgdmFsdWUsIG5vU2Nyb2xsLCAvKiBwcmVzZXQgPSAqLyBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5fcGFnZXNbdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSAxXTtcbiAgICAgIGlmICghY3VycmVudFBhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9QYWRkaW5nID0gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSB8fCB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzO1xuICAgICAgbGV0IGhQYWRkaW5nID0gbm9QYWRkaW5nID8gMCA6IFNDUk9MTEJBUl9QQURESU5HO1xuICAgICAgbGV0IHZQYWRkaW5nID0gbm9QYWRkaW5nID8gMCA6IFZFUlRJQ0FMX1BBRERJTkc7XG5cbiAgICAgIGlmICghbm9QYWRkaW5nICYmIHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWwpIHtcbiAgICAgICAgW2hQYWRkaW5nLCB2UGFkZGluZ10gPSBbdlBhZGRpbmcsIGhQYWRkaW5nXTsgLy8gU3dhcCB0aGUgcGFkZGluZyB2YWx1ZXMuXG4gICAgICB9XG4gICAgICBjb25zdCBwYWdlV2lkdGhTY2FsZSA9XG4gICAgICAgICgodGhpcy5jb250YWluZXIuY2xpZW50V2lkdGggLSBoUGFkZGluZykgLyBjdXJyZW50UGFnZS53aWR0aCkgKlxuICAgICAgICBjdXJyZW50UGFnZS5zY2FsZTtcbiAgICAgIGNvbnN0IHBhZ2VIZWlnaHRTY2FsZSA9XG4gICAgICAgICgodGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdlBhZGRpbmcpIC8gY3VycmVudFBhZ2UuaGVpZ2h0KSAqXG4gICAgICAgIGN1cnJlbnRQYWdlLnNjYWxlO1xuICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICBjYXNlIFwicGFnZS1hY3R1YWxcIjpcbiAgICAgICAgICBzY2FsZSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJwYWdlLXdpZHRoXCI6XG4gICAgICAgICAgc2NhbGUgPSBwYWdlV2lkdGhTY2FsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInBhZ2UtaGVpZ2h0XCI6XG4gICAgICAgICAgc2NhbGUgPSBwYWdlSGVpZ2h0U2NhbGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJwYWdlLWZpdFwiOlxuICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4ocGFnZVdpZHRoU2NhbGUsIHBhZ2VIZWlnaHRTY2FsZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJhdXRvXCI6XG4gICAgICAgICAgLy8gRm9yIHBhZ2VzIGluIGxhbmRzY2FwZSBtb2RlLCBmaXQgdGhlIHBhZ2UgaGVpZ2h0IHRvIHRoZSB2aWV3ZXJcbiAgICAgICAgICAvLyAqdW5sZXNzKiB0aGUgcGFnZSB3b3VsZCB0aHVzIGJlY29tZSB0b28gd2lkZSB0byBmaXQgaG9yaXpvbnRhbGx5LlxuICAgICAgICAgIGNvbnN0IGhvcml6b250YWxTY2FsZSA9IGlzUG9ydHJhaXRPcmllbnRhdGlvbihjdXJyZW50UGFnZSlcbiAgICAgICAgICAgID8gcGFnZVdpZHRoU2NhbGVcbiAgICAgICAgICAgIDogTWF0aC5taW4ocGFnZUhlaWdodFNjYWxlLCBwYWdlV2lkdGhTY2FsZSk7XG4gICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihNQVhfQVVUT19TQ0FMRSwgaG9yaXpvbnRhbFNjYWxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYCR7dGhpcy5fbmFtZX0uX3NldFNjYWxlOiBcIiR7dmFsdWV9XCIgaXMgYW4gdW5rbm93biB6b29tIHZhbHVlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NldFNjYWxlVXBkYXRlUGFnZXMoc2NhbGUsIHZhbHVlLCBub1Njcm9sbCwgLyogcHJlc2V0ID0gKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyBwYWdlIHZpZXc6IHNjcm9sbHMgdG8gdGhlIGN1cnJlbnQgcGFnZSBhbmQgdXBkYXRlcyB0aGUgc2NhbGUuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVzZXRDdXJyZW50UGFnZVZpZXcoKSB7XG4gICAgaWYgKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUpIHtcbiAgICAgIC8vIEZpeGVzIHRoZSBjYXNlIHdoZW4gUERGIGhhcyBkaWZmZXJlbnQgcGFnZSBzaXplcy5cbiAgICAgIHRoaXMuX3NldFNjYWxlKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07XG4gICAgdGhpcy5fc2Nyb2xsSW50b1ZpZXcoeyBwYWdlRGl2OiBwYWdlVmlldy5kaXYgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYgU2Nyb2xsUGFnZUludG9WaWV3UGFyYW1ldGVyc1xuICAgKiBAcHJvcGVydHkge251bWJlcn0gcGFnZU51bWJlciAtIFRoZSBwYWdlIG51bWJlci5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gW2Rlc3RBcnJheV0gLSBUaGUgb3JpZ2luYWwgUERGIGRlc3RpbmF0aW9uIGFycmF5LCBpbiB0aGVcbiAgICogICBmb3JtYXQ6IDxwYWdlLXJlZj4gPC9YWVp8L0ZpdFhYWD4gPGFyZ3MuLj5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWxsb3dOZWdhdGl2ZU9mZnNldF0gLSBBbGxvdyBuZWdhdGl2ZSBwYWdlIG9mZnNldHMuXG4gICAqICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlRGVzdGluYXRpb25ab29tXSAtIElnbm9yZSB0aGUgem9vbSBhcmd1bWVudCBpblxuICAgKiAgIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICovXG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgcGFnZSBpbnRvIHZpZXcuXG4gICAqIEBwYXJhbSB7U2Nyb2xsUGFnZUludG9WaWV3UGFyYW1ldGVyc30gcGFyYW1zXG4gICAqL1xuICBzY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgIHBhZ2VOdW1iZXIsXG4gICAgZGVzdEFycmF5ID0gbnVsbCxcbiAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0ID0gZmFsc2UsXG4gICAgaWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2UsXG4gIH0pIHtcbiAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFnZVZpZXcgPVxuICAgICAgTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSAmJiB0aGlzLl9wYWdlc1twYWdlTnVtYmVyIC0gMV07XG4gICAgaWYgKCFwYWdlVmlldykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYCR7dGhpcy5fbmFtZX0uc2Nyb2xsUGFnZUludG9WaWV3OiBgICtcbiAgICAgICAgICBgXCIke3BhZ2VOdW1iZXJ9XCIgaXMgbm90IGEgdmFsaWQgcGFnZU51bWJlciBwYXJhbWV0ZXIuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSB8fCAhZGVzdEFycmF5KSB7XG4gICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyLCAvKiByZXNldEN1cnJlbnRQYWdlVmlldyA9ICovIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgeCA9IDAsXG4gICAgICB5ID0gMDtcbiAgICBsZXQgd2lkdGggPSAwLFxuICAgICAgaGVpZ2h0ID0gMCxcbiAgICAgIHdpZHRoU2NhbGUsXG4gICAgICBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBjaGFuZ2VPcmllbnRhdGlvbiA9IHBhZ2VWaWV3LnJvdGF0aW9uICUgMTgwICE9PSAwO1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9XG4gICAgICAoY2hhbmdlT3JpZW50YXRpb24gPyBwYWdlVmlldy5oZWlnaHQgOiBwYWdlVmlldy53aWR0aCkgL1xuICAgICAgcGFnZVZpZXcuc2NhbGUgL1xuICAgICAgQ1NTX1VOSVRTO1xuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPVxuICAgICAgKGNoYW5nZU9yaWVudGF0aW9uID8gcGFnZVZpZXcud2lkdGggOiBwYWdlVmlldy5oZWlnaHQpIC9cbiAgICAgIHBhZ2VWaWV3LnNjYWxlIC9cbiAgICAgIENTU19VTklUUztcbiAgICBsZXQgc2NhbGUgPSAwO1xuICAgIHN3aXRjaCAoZGVzdEFycmF5WzFdLm5hbWUpIHtcbiAgICAgIGNhc2UgXCJYWVpcIjpcbiAgICAgICAgeCA9IGRlc3RBcnJheVsyXTtcbiAgICAgICAgeSA9IGRlc3RBcnJheVszXTtcbiAgICAgICAgc2NhbGUgPSBkZXN0QXJyYXlbNF07XG4gICAgICAgIC8vIElmIHggYW5kL29yIHkgY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwbGllZCwgZGVmYXVsdCB0b1xuICAgICAgICAvLyBfdG9wXyBsZWZ0IG9mIHRoZSBwYWdlIChub3QgdGhlIG9idmlvdXMgYm90dG9tIGxlZnQsXG4gICAgICAgIC8vIHNpbmNlIGFsaWduaW5nIHRoZSBib3R0b20gb2YgdGhlIGludGVuZGVkIHBhZ2Ugd2l0aCB0aGVcbiAgICAgICAgLy8gdG9wIG9mIHRoZSB3aW5kb3cgaXMgcmFyZWx5IGhlbHBmdWwpLlxuICAgICAgICB4ID0geCAhPT0gbnVsbCA/IHggOiAwO1xuICAgICAgICB5ID0geSAhPT0gbnVsbCA/IHkgOiBwYWdlSGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJGaXRcIjpcbiAgICAgIGNhc2UgXCJGaXRCXCI6XG4gICAgICAgIHNjYWxlID0gXCJwYWdlLWZpdFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJGaXRIXCI6XG4gICAgICBjYXNlIFwiRml0QkhcIjpcbiAgICAgICAgeSA9IGRlc3RBcnJheVsyXTtcbiAgICAgICAgc2NhbGUgPSBcInBhZ2Utd2lkdGhcIjtcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBQREYgc3BlYywgc2VjdGlvbiAxMi4zLjIuMiwgYSBgbnVsbGAgdmFsdWUgaW4gdGhlXG4gICAgICAgIC8vIHBhcmFtZXRlciBzaG91bGQgbWFpbnRhaW4gdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBuZXcgcGFnZS5cbiAgICAgICAgaWYgKHkgPT09IG51bGwgJiYgdGhpcy5fbG9jYXRpb24pIHtcbiAgICAgICAgICB4ID0gdGhpcy5fbG9jYXRpb24ubGVmdDtcbiAgICAgICAgICB5ID0gdGhpcy5fbG9jYXRpb24udG9wO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkZpdFZcIjpcbiAgICAgIGNhc2UgXCJGaXRCVlwiOlxuICAgICAgICB4ID0gZGVzdEFycmF5WzJdO1xuICAgICAgICB3aWR0aCA9IHBhZ2VXaWR0aDtcbiAgICAgICAgaGVpZ2h0ID0gcGFnZUhlaWdodDtcbiAgICAgICAgc2NhbGUgPSBcInBhZ2UtaGVpZ2h0XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkZpdFJcIjpcbiAgICAgICAgeCA9IGRlc3RBcnJheVsyXTtcbiAgICAgICAgeSA9IGRlc3RBcnJheVszXTtcbiAgICAgICAgd2lkdGggPSBkZXN0QXJyYXlbNF0gLSB4O1xuICAgICAgICBoZWlnaHQgPSBkZXN0QXJyYXlbNV0gLSB5O1xuICAgICAgICBjb25zdCBoUGFkZGluZyA9IHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMgPyAwIDogU0NST0xMQkFSX1BBRERJTkc7XG4gICAgICAgIGNvbnN0IHZQYWRkaW5nID0gdGhpcy5yZW1vdmVQYWdlQm9yZGVycyA/IDAgOiBWRVJUSUNBTF9QQURESU5HO1xuXG4gICAgICAgIHdpZHRoU2NhbGUgPVxuICAgICAgICAgICh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCAtIGhQYWRkaW5nKSAvIHdpZHRoIC8gQ1NTX1VOSVRTO1xuICAgICAgICBoZWlnaHRTY2FsZSA9XG4gICAgICAgICAgKHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHZQYWRkaW5nKSAvIGhlaWdodCAvIENTU19VTklUUztcbiAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihNYXRoLmFicyh3aWR0aFNjYWxlKSwgTWF0aC5hYnMoaGVpZ2h0U2NhbGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGAke3RoaXMuX25hbWV9LnNjcm9sbFBhZ2VJbnRvVmlldzogYCArXG4gICAgICAgICAgICBgXCIke2Rlc3RBcnJheVsxXS5uYW1lfVwiIGlzIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIHR5cGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpZ25vcmVEZXN0aW5hdGlvblpvb20pIHtcbiAgICAgIGlmIChzY2FsZSAmJiBzY2FsZSAhPT0gdGhpcy5fY3VycmVudFNjYWxlKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNjYWxlVmFsdWUgPSBzY2FsZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudFNjYWxlID09PSBVTktOT1dOX1NDQUxFKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNjYWxlVmFsdWUgPSBERUZBVUxUX1NDQUxFX1ZBTFVFO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY2FsZSA9PT0gXCJwYWdlLWZpdFwiICYmICFkZXN0QXJyYXlbNF0pIHtcbiAgICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHtcbiAgICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2LFxuICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRpbmdSZWN0ID0gW1xuICAgICAgcGFnZVZpZXcudmlld3BvcnQuY29udmVydFRvVmlld3BvcnRQb2ludCh4LCB5KSxcbiAgICAgIHBhZ2VWaWV3LnZpZXdwb3J0LmNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCArIHdpZHRoLCB5ICsgaGVpZ2h0KSxcbiAgICBdO1xuICAgIGxldCBsZWZ0ID0gTWF0aC5taW4oYm91bmRpbmdSZWN0WzBdWzBdLCBib3VuZGluZ1JlY3RbMV1bMF0pO1xuICAgIGxldCB0b3AgPSBNYXRoLm1pbihib3VuZGluZ1JlY3RbMF1bMV0sIGJvdW5kaW5nUmVjdFsxXVsxXSk7XG5cbiAgICBpZiAoIWFsbG93TmVnYXRpdmVPZmZzZXQpIHtcbiAgICAgIC8vIFNvbWUgYmFkIFBERiBnZW5lcmF0b3JzIHdpbGwgY3JlYXRlIGRlc3RpbmF0aW9ucyB3aXRoIGUuZy4gdG9wIHZhbHVlc1xuICAgICAgLy8gdGhhdCBleGNlZWRzIHRoZSBwYWdlIGhlaWdodC4gRW5zdXJlIHRoYXQgb2Zmc2V0cyBhcmUgbm90IG5lZ2F0aXZlLFxuICAgICAgLy8gdG8gcHJldmVudCBhIHByZXZpb3VzIHBhZ2UgZnJvbSBiZWNvbWluZyB2aXNpYmxlIChmaXhlcyBidWcgODc0NDgyKS5cbiAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCAwKTtcbiAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgMCk7XG4gICAgfVxuICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHtcbiAgICAgIHBhZ2VEaXY6IHBhZ2VWaWV3LmRpdixcbiAgICAgIHBhZ2VTcG90OiB7IGxlZnQsIHRvcCB9LFxuICAgICAgcGFnZU51bWJlcixcbiAgICB9KTtcbiAgfVxuXG4gIF91cGRhdGVMb2NhdGlvbihmaXJzdFBhZ2UpIHtcbiAgICBjb25zdCBjdXJyZW50U2NhbGUgPSB0aGlzLl9jdXJyZW50U2NhbGU7XG4gICAgY29uc3QgY3VycmVudFNjYWxlVmFsdWUgPSB0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZTtcbiAgICBjb25zdCBub3JtYWxpemVkU2NhbGVWYWx1ZSA9XG4gICAgICBwYXJzZUZsb2F0KGN1cnJlbnRTY2FsZVZhbHVlKSA9PT0gY3VycmVudFNjYWxlXG4gICAgICAgID8gTWF0aC5yb3VuZChjdXJyZW50U2NhbGUgKiAxMDAwMCkgLyAxMDBcbiAgICAgICAgOiBjdXJyZW50U2NhbGVWYWx1ZTtcblxuICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBmaXJzdFBhZ2UuaWQ7XG4gICAgbGV0IHBkZk9wZW5QYXJhbXMgPSBcIiNwYWdlPVwiICsgcGFnZU51bWJlcjtcbiAgICBwZGZPcGVuUGFyYW1zICs9IFwiJnpvb209XCIgKyBub3JtYWxpemVkU2NhbGVWYWx1ZTtcbiAgICBjb25zdCBjdXJyZW50UGFnZVZpZXcgPSB0aGlzLl9wYWdlc1twYWdlTnVtYmVyIC0gMV07XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gICAgY29uc3QgdG9wTGVmdCA9IGN1cnJlbnRQYWdlVmlldy5nZXRQYWdlUG9pbnQoXG4gICAgICBjb250YWluZXIuc2Nyb2xsTGVmdCAtIGZpcnN0UGFnZS54LFxuICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCAtIGZpcnN0UGFnZS55XG4gICAgKTtcbiAgICBjb25zdCBpbnRMZWZ0ID0gTWF0aC5yb3VuZCh0b3BMZWZ0WzBdKTtcbiAgICBjb25zdCBpbnRUb3AgPSBNYXRoLnJvdW5kKHRvcExlZnRbMV0pO1xuICAgIHBkZk9wZW5QYXJhbXMgKz0gXCIsXCIgKyBpbnRMZWZ0ICsgXCIsXCIgKyBpbnRUb3A7XG5cbiAgICB0aGlzLl9sb2NhdGlvbiA9IHtcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICBzY2FsZTogbm9ybWFsaXplZFNjYWxlVmFsdWUsXG4gICAgICB0b3A6IGludFRvcCxcbiAgICAgIGxlZnQ6IGludExlZnQsXG4gICAgICByb3RhdGlvbjogdGhpcy5fcGFnZXNSb3RhdGlvbixcbiAgICAgIHBkZk9wZW5QYXJhbXMsXG4gICAgfTtcbiAgfVxuXG4gIF91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkOiBfdXBkYXRlSGVscGVyXCIpO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKTtcbiAgICBjb25zdCB2aXNpYmxlUGFnZXMgPSB2aXNpYmxlLnZpZXdzLFxuICAgICAgbnVtVmlzaWJsZVBhZ2VzID0gdmlzaWJsZVBhZ2VzLmxlbmd0aDtcblxuICAgIGlmIChudW1WaXNpYmxlUGFnZXMgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3Q2FjaGVTaXplID0gTWF0aC5tYXgoREVGQVVMVF9DQUNIRV9TSVpFLCAyICogbnVtVmlzaWJsZVBhZ2VzICsgMSk7XG4gICAgdGhpcy5fYnVmZmVyLnJlc2l6ZShuZXdDYWNoZVNpemUsIHZpc2libGVQYWdlcyk7XG5cbiAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlLnJlbmRlckhpZ2hlc3RQcmlvcml0eSh2aXNpYmxlKTtcblxuICAgIHRoaXMuX3VwZGF0ZUhlbHBlcih2aXNpYmxlUGFnZXMpOyAvLyBSdW4gYW55IGNsYXNzLXNwZWNpZmljIHVwZGF0ZSBjb2RlLlxuXG4gICAgdGhpcy5fdXBkYXRlTG9jYXRpb24odmlzaWJsZS5maXJzdCk7XG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInVwZGF0ZXZpZXdhcmVhXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIGxvY2F0aW9uOiB0aGlzLl9sb2NhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnRhaW5zRWxlbWVudChlbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgdGhpcy5jb250YWluZXIuZm9jdXMoKTtcbiAgfVxuXG4gIGdldCBfaXNTY3JvbGxNb2RlSG9yaXpvbnRhbCgpIHtcbiAgICAvLyBVc2VkIHRvIGVuc3VyZSB0aGF0IHByZS1yZW5kZXJpbmcgb2YgdGhlIG5leHQvcHJldmlvdXMgcGFnZSB3b3Jrc1xuICAgIC8vIGNvcnJlY3RseSwgc2luY2UgU2Nyb2xsL1NwcmVhZCBtb2RlcyBhcmUgaWdub3JlZCBpbiBQcmVzZW50YXRpb24gTW9kZS5cbiAgICByZXR1cm4gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZVxuICAgICAgPyBmYWxzZVxuICAgICAgOiB0aGlzLl9zY3JvbGxNb2RlID09PSBTY3JvbGxNb2RlLkhPUklaT05UQUw7XG4gIH1cblxuICBnZXQgaXNJblByZXNlbnRhdGlvbk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID09PSBQcmVzZW50YXRpb25Nb2RlU3RhdGUuRlVMTFNDUkVFTjtcbiAgfVxuXG4gIGdldCBpc0NoYW5naW5nUHJlc2VudGF0aW9uTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZW50YXRpb25Nb2RlU3RhdGUgPT09IFByZXNlbnRhdGlvbk1vZGVTdGF0ZS5DSEFOR0lORztcbiAgfVxuXG4gIGdldCBpc0hvcml6b250YWxTY3JvbGxiYXJFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlXG4gICAgICA/IGZhbHNlXG4gICAgICA6IHRoaXMuY29udGFpbmVyLnNjcm9sbFdpZHRoID4gdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGg7XG4gIH1cblxuICBnZXQgaXNWZXJ0aWNhbFNjcm9sbGJhckVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGVcbiAgICAgID8gZmFsc2VcbiAgICAgIDogdGhpcy5jb250YWluZXIuc2Nyb2xsSGVpZ2h0ID4gdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIGB0aGlzLl9nZXRWaXNpYmxlUGFnZXNgLiBTaG91bGQgb25seSBldmVyIGJlIHVzZWQgd2hlblxuICAgKiB0aGUgdmlld2VyIGNhbiBvbmx5IGRpc3BsYXkgYSBzaW5nbGUgcGFnZSBhdCBhIHRpbWUsIGZvciBleGFtcGxlIGluOlxuICAgKiAgLSBgUERGU2luZ2xlUGFnZVZpZXdlcmAuXG4gICAqICAtIGBQREZWaWV3ZXJgIHdpdGggUHJlc2VudGF0aW9uIE1vZGUgYWN0aXZlLlxuICAgKi9cbiAgX2dldEN1cnJlbnRWaXNpYmxlUGFnZSgpIHtcbiAgICBpZiAoIXRoaXMucGFnZXNDb3VudCkge1xuICAgICAgcmV0dXJuIHsgdmlld3M6IFtdIH07XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSAxXTtcbiAgICAvLyBOT1RFOiBDb21wdXRlIHRoZSBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IHZpZXcsXG4gICAgLy8gc2luY2UgYHRoaXMuX3VwZGF0ZUxvY2F0aW9uYCBkZXBlbmRzIG9mIHRoZW0gYmVpbmcgYXZhaWxhYmxlLlxuICAgIGNvbnN0IGVsZW1lbnQgPSBwYWdlVmlldy5kaXY7XG5cbiAgICBjb25zdCB2aWV3ID0ge1xuICAgICAgaWQ6IHBhZ2VWaWV3LmlkLFxuICAgICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0LFxuICAgICAgeTogZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcCxcbiAgICAgIHZpZXc6IHBhZ2VWaWV3LFxuICAgIH07XG4gICAgcmV0dXJuIHsgZmlyc3Q6IHZpZXcsIGxhc3Q6IHZpZXcsIHZpZXdzOiBbdmlld10gfTtcbiAgfVxuXG4gIF9nZXRWaXNpYmxlUGFnZXMoKSB7XG4gICAgcmV0dXJuIGdldFZpc2libGVFbGVtZW50cyhcbiAgICAgIHRoaXMuY29udGFpbmVyLFxuICAgICAgdGhpcy5fcGFnZXMsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5faXNTY3JvbGxNb2RlSG9yaXpvbnRhbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VOdW1iZXJcbiAgICovXG4gIGlzUGFnZVZpc2libGUocGFnZU51bWJlcikge1xuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAocGFnZU51bWJlciA8IDEgfHwgcGFnZU51bWJlciA+IHRoaXMucGFnZXNDb3VudCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYCR7dGhpcy5fbmFtZX0uaXNQYWdlVmlzaWJsZTogXCIke3BhZ2VOdW1iZXJ9XCIgaXMgb3V0IG9mIGJvdW5kcy5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCkudmlld3Muc29tZShmdW5jdGlvbiAodmlldykge1xuICAgICAgcmV0dXJuIHZpZXcuaWQgPT09IHBhZ2VOdW1iZXI7XG4gICAgfSk7XG4gIH1cblxuICBjbGVhbnVwKCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fcGFnZXNbaV0gJiZcbiAgICAgICAgdGhpcy5fcGFnZXNbaV0ucmVuZGVyaW5nU3RhdGUgIT09IFJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3BhZ2VzW2ldLnJlc2V0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2FuY2VsUmVuZGVyaW5nKCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl9wYWdlc1tpXSkge1xuICAgICAgICB0aGlzLl9wYWdlc1tpXS5jYW5jZWxSZW5kZXJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQREZQYWdlVmlld30gcGFnZVZpZXdcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgYSBwcm9taXNlIGNvbnRhaW5pbmcgYSB7UERGUGFnZVByb3h5fSBvYmplY3QuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZW5zdXJlUGRmUGFnZUxvYWRlZChwYWdlVmlldykge1xuICAgIGlmIChwYWdlVmlldy5wZGZQYWdlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhZ2VWaWV3LnBkZlBhZ2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGFnZXNSZXF1ZXN0cy5oYXMocGFnZVZpZXcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFnZXNSZXF1ZXN0cy5nZXQocGFnZVZpZXcpO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5wZGZEb2N1bWVudFxuICAgICAgLmdldFBhZ2UocGFnZVZpZXcuaWQpXG4gICAgICAudGhlbihwZGZQYWdlID0+IHtcbiAgICAgICAgaWYgKCFwYWdlVmlldy5wZGZQYWdlKSB7XG4gICAgICAgICAgcGFnZVZpZXcuc2V0UGRmUGFnZShwZGZQYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wYWdlc1JlcXVlc3RzLmRlbGV0ZShwYWdlVmlldyk7XG4gICAgICAgIHJldHVybiBwZGZQYWdlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVW5hYmxlIHRvIGdldCBwYWdlIGZvciBwYWdlIHZpZXdcIiwgcmVhc29uKTtcbiAgICAgICAgLy8gUGFnZSBlcnJvciAtLSB0aGVyZSBpcyBub3RoaW5nIHRoYXQgY2FuIGJlIGRvbmUuXG4gICAgICAgIHRoaXMuX3BhZ2VzUmVxdWVzdHMuZGVsZXRlKHBhZ2VWaWV3KTtcbiAgICAgIH0pO1xuICAgIHRoaXMuX3BhZ2VzUmVxdWVzdHMuc2V0KHBhZ2VWaWV3LCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGZvcmNlUmVuZGVyaW5nKGN1cnJlbnRseVZpc2libGVQYWdlcykge1xuICAgIGNvbnN0IHZpc2libGVQYWdlcyA9IGN1cnJlbnRseVZpc2libGVQYWdlcyB8fCB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKTtcbiAgICBjb25zdCBzY3JvbGxBaGVhZCA9IHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWxcbiAgICAgID8gdGhpcy5zY3JvbGwucmlnaHRcbiAgICAgIDogdGhpcy5zY3JvbGwuZG93bjtcbiAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMucmVuZGVyaW5nUXVldWUuZ2V0SGlnaGVzdFByaW9yaXR5KFxuICAgICAgdmlzaWJsZVBhZ2VzLFxuICAgICAgdGhpcy5fcGFnZXMsXG4gICAgICBzY3JvbGxBaGVhZFxuICAgICk7XG4gICAgaWYgKHBhZ2VWaWV3KSB7XG4gICAgICB0aGlzLl9lbnN1cmVQZGZQYWdlTG9hZGVkKHBhZ2VWaWV3KS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZS5yZW5kZXJWaWV3KHBhZ2VWaWV3KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSB0ZXh0TGF5ZXJEaXZcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VJbmRleFxuICAgKiBAcGFyYW0ge1BhZ2VWaWV3cG9ydH0gdmlld3BvcnRcbiAgICogQHBhcmFtIHtib29sZWFufSBlbmhhbmNlVGV4dFNlbGVjdGlvblxuICAgKiBAcGFyYW0ge0V2ZW50QnVzfSBldmVudEJ1c1xuICAgKiBAcmV0dXJucyB7VGV4dExheWVyQnVpbGRlcn1cbiAgICovXG4gIGNyZWF0ZVRleHRMYXllckJ1aWxkZXIoXG4gICAgdGV4dExheWVyRGl2LFxuICAgIHBhZ2VJbmRleCxcbiAgICB2aWV3cG9ydCxcbiAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGZhbHNlLFxuICAgIGV2ZW50QnVzXG4gICkge1xuICAgIHJldHVybiBuZXcgVGV4dExheWVyQnVpbGRlcih7XG4gICAgICB0ZXh0TGF5ZXJEaXYsXG4gICAgICBldmVudEJ1cyxcbiAgICAgIHBhZ2VJbmRleCxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgZmluZENvbnRyb2xsZXI6IHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBudWxsIDogdGhpcy5maW5kQ29udHJvbGxlcixcbiAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiBlbmhhbmNlVGV4dFNlbGVjdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBwYWdlRGl2XG4gICAqIEBwYXJhbSB7UERGUGFnZX0gcGRmUGFnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ltYWdlUmVzb3VyY2VzUGF0aF0gLSBQYXRoIGZvciBpbWFnZSByZXNvdXJjZXMsIG1haW5seVxuICAgKiAgIGZvciBhbm5vdGF0aW9uIGljb25zLiBJbmNsdWRlIHRyYWlsaW5nIHNsYXNoLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlbmRlckludGVyYWN0aXZlRm9ybXNcbiAgICogQHBhcmFtIHtJTDEwbn0gbDEwblxuICAgKiBAcmV0dXJucyB7QW5ub3RhdGlvbkxheWVyQnVpbGRlcn1cbiAgICovXG4gIGNyZWF0ZUFubm90YXRpb25MYXllckJ1aWxkZXIoXG4gICAgcGFnZURpdixcbiAgICBwZGZQYWdlLFxuICAgIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCxcbiAgICBpbWFnZVJlc291cmNlc1BhdGggPSBcIlwiLFxuICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSBmYWxzZSxcbiAgICBsMTBuID0gTnVsbEwxMG5cbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKHtcbiAgICAgIHBhZ2VEaXYsXG4gICAgICBwZGZQYWdlLFxuICAgICAgYW5ub3RhdGlvblN0b3JhZ2UsXG4gICAgICBpbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLFxuICAgICAgbGlua1NlcnZpY2U6IHRoaXMubGlua1NlcnZpY2UsXG4gICAgICBkb3dubG9hZE1hbmFnZXI6IHRoaXMuZG93bmxvYWRNYW5hZ2VyLFxuICAgICAgbDEwbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gV2hldGhlciBhbGwgcGFnZXMgb2YgdGhlIFBERiBkb2N1bWVudCBoYXZlIGlkZW50aWNhbFxuICAgKiAgIHdpZHRocyBhbmQgaGVpZ2h0cy5cbiAgICovXG4gIGdldCBoYXNFcXVhbFBhZ2VTaXplcygpIHtcbiAgICBjb25zdCBmaXJzdFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbMF07XG4gICAgZm9yIChsZXQgaSA9IDEsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgcGFnZVZpZXcud2lkdGggIT09IGZpcnN0UGFnZVZpZXcud2lkdGggfHxcbiAgICAgICAgcGFnZVZpZXcuaGVpZ2h0ICE9PSBmaXJzdFBhZ2VWaWV3LmhlaWdodFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzaXplcyBvZiB0aGUgcGFnZXMuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHdpZHRoL2hlaWdodC9yb3RhdGlvbiBmaWVsZHMuXG4gICAqL1xuICBnZXRQYWdlc092ZXJ2aWV3KCkge1xuICAgIGNvbnN0IHBhZ2VzT3ZlcnZpZXcgPSB0aGlzLl9wYWdlcy5tYXAoZnVuY3Rpb24gKHBhZ2VWaWV3KSB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IHBhZ2VWaWV3LnBkZlBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogMSB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB2aWV3cG9ydC5oZWlnaHQsXG4gICAgICAgIHJvdGF0aW9uOiB2aWV3cG9ydC5yb3RhdGlvbixcbiAgICAgIH07XG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVByaW50QXV0b1JvdGF0ZSkge1xuICAgICAgcmV0dXJuIHBhZ2VzT3ZlcnZpZXc7XG4gICAgfVxuICAgIHJldHVybiBwYWdlc092ZXJ2aWV3Lm1hcChmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgaWYgKGlzUG9ydHJhaXRPcmllbnRhdGlvbihzaXplKSkge1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBzaXplLmhlaWdodCxcbiAgICAgICAgaGVpZ2h0OiBzaXplLndpZHRoLFxuICAgICAgICByb3RhdGlvbjogKHNpemUucm90YXRpb24gKyA5MCkgJSAzNjAsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtQcm9taXNlPE9wdGlvbmFsQ29udGVudENvbmZpZyB8IG51bGw+fVxuICAgKi9cbiAgZ2V0IG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UoKSB7XG4gICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UpIHtcbiAgICAgIC8vIFByZXZlbnQgaXNzdWVzIGlmIHRoZSBnZXR0ZXIgaXMgYWNjZXNzZWQgKmJlZm9yZSogdGhlIGBvbmVQYWdlUmVuZGVyZWRgXG4gICAgICAvLyBwcm9taXNlIGhhcyByZXNvbHZlZDsgd29uJ3QgKG5vcm1hbGx5KSBoYXBwZW4gaW4gdGhlIGRlZmF1bHQgdmlld2VyLlxuICAgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UHJvbWlzZTxPcHRpb25hbENvbnRlbnRDb25maWc+fSBwcm9taXNlIC0gQSBwcm9taXNlIHRoYXQgaXNcbiAgICogICByZXNvbHZlZCB3aXRoIGFuIHtAbGluayBPcHRpb25hbENvbnRlbnRDb25maWd9IGluc3RhbmNlLlxuICAgKi9cbiAgc2V0IG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UocHJvbWlzZSkge1xuICAgIGlmICghKHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U6ICR7cHJvbWlzZX1gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSkge1xuICAgICAgLy8gSWdub3JlIHRoZSBzZXR0ZXIgKmJlZm9yZSogdGhlIGBvbmVQYWdlUmVuZGVyZWRgIHByb21pc2UgaGFzIHJlc29sdmVkLFxuICAgICAgLy8gc2luY2UgaXQnbGwgYmUgb3ZlcndyaXR0ZW4gYW55d2F5OyB3b24ndCBoYXBwZW4gaW4gdGhlIGRlZmF1bHQgdmlld2VyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gcHJvbWlzZTtcblxuICAgIGZvciAoY29uc3QgcGFnZVZpZXcgb2YgdGhpcy5fcGFnZXMpIHtcbiAgICAgIHBhZ2VWaWV3LnVwZGF0ZShwYWdlVmlldy5zY2FsZSwgcGFnZVZpZXcucm90YXRpb24sIHByb21pc2UpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcIm9wdGlvbmFsY29udGVudGNvbmZpZ2NoYW5nZWRcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgcHJvbWlzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfSBPbmUgb2YgdGhlIHZhbHVlcyBpbiB7U2Nyb2xsTW9kZX0uXG4gICAqL1xuICBnZXQgc2Nyb2xsTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsTW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbW9kZSAtIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIGRvY3VtZW50IHBhZ2VzIHNob3VsZCBiZVxuICAgKiAgIGxhaWQgb3V0IHdpdGhpbiB0aGUgc2Nyb2xsaW5nIGNvbnRhaW5lci5cbiAgICogICBUaGUgY29uc3RhbnRzIGZyb20ge1Njcm9sbE1vZGV9IHNob3VsZCBiZSB1c2VkLlxuICAgKi9cbiAgc2V0IHNjcm9sbE1vZGUobW9kZSkge1xuICAgIGlmICh0aGlzLl9zY3JvbGxNb2RlID09PSBtb2RlKSB7XG4gICAgICByZXR1cm47IC8vIFRoZSBTY3JvbGwgbW9kZSBkaWRuJ3QgY2hhbmdlLlxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRTY3JvbGxNb2RlKG1vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Nyb2xsIG1vZGU6ICR7bW9kZX1gKTtcbiAgICB9XG4gICAgdGhpcy5fc2Nyb2xsTW9kZSA9IG1vZGU7XG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInNjcm9sbG1vZGVjaGFuZ2VkXCIsIHsgc291cmNlOiB0aGlzLCBtb2RlIH0pO1xuXG4gICAgdGhpcy5fdXBkYXRlU2Nyb2xsTW9kZSgvKiBwYWdlTnVtYmVyID0gKi8gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIpO1xuICB9XG5cbiAgX3VwZGF0ZVNjcm9sbE1vZGUocGFnZU51bWJlciA9IG51bGwpIHtcbiAgICBjb25zdCBzY3JvbGxNb2RlID0gdGhpcy5fc2Nyb2xsTW9kZSxcbiAgICAgIHZpZXdlciA9IHRoaXMudmlld2VyO1xuXG4gICAgdmlld2VyLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICBcInNjcm9sbEhvcml6b250YWxcIixcbiAgICAgIHNjcm9sbE1vZGUgPT09IFNjcm9sbE1vZGUuSE9SSVpPTlRBTFxuICAgICk7XG4gICAgdmlld2VyLmNsYXNzTGlzdC50b2dnbGUoXCJzY3JvbGxXcmFwcGVkXCIsIHNjcm9sbE1vZGUgPT09IFNjcm9sbE1vZGUuV1JBUFBFRCk7XG5cbiAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQgfHwgIXBhZ2VOdW1iZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm9uLW51bWVyaWMgc2NhbGUgdmFsdWVzIGNhbiBiZSBzZW5zaXRpdmUgdG8gdGhlIHNjcm9sbCBvcmllbnRhdGlvbi5cbiAgICAvLyBDYWxsIHRoaXMgYmVmb3JlIHJlLXNjcm9sbGluZyB0byB0aGUgY3VycmVudCBwYWdlLCB0byBlbnN1cmUgdGhhdCBhbnlcbiAgICAvLyBjaGFuZ2VzIGluIHNjYWxlIGRvbid0IG1vdmUgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICBpZiAodGhpcy5fY3VycmVudFNjYWxlVmFsdWUgJiYgaXNOYU4odGhpcy5fY3VycmVudFNjYWxlVmFsdWUpKSB7XG4gICAgICB0aGlzLl9zZXRTY2FsZSh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSwgdHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKHBhZ2VOdW1iZXIsIC8qIHJlc2V0Q3VycmVudFBhZ2VWaWV3ID0gKi8gdHJ1ZSk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfSBPbmUgb2YgdGhlIHZhbHVlcyBpbiB7U3ByZWFkTW9kZX0uXG4gICAqL1xuICBnZXQgc3ByZWFkTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3ByZWFkTW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbW9kZSAtIEdyb3VwIHRoZSBwYWdlcyBpbiBzcHJlYWRzLCBzdGFydGluZyB3aXRoIG9kZC0gb3JcbiAgICogICBldmVuLW51bWJlciBwYWdlcyAodW5sZXNzIGBTcHJlYWRNb2RlLk5PTkVgIGlzIHVzZWQpLlxuICAgKiAgIFRoZSBjb25zdGFudHMgZnJvbSB7U3ByZWFkTW9kZX0gc2hvdWxkIGJlIHVzZWQuXG4gICAqL1xuICBzZXQgc3ByZWFkTW9kZShtb2RlKSB7XG4gICAgaWYgKHRoaXMuX3NwcmVhZE1vZGUgPT09IG1vZGUpIHtcbiAgICAgIHJldHVybjsgLy8gVGhlIFNwcmVhZCBtb2RlIGRpZG4ndCBjaGFuZ2UuXG4gICAgfVxuICAgIGlmICghaXNWYWxpZFNwcmVhZE1vZGUobW9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcHJlYWQgbW9kZTogJHttb2RlfWApO1xuICAgIH1cbiAgICB0aGlzLl9zcHJlYWRNb2RlID0gbW9kZTtcbiAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwic3ByZWFkbW9kZWNoYW5nZWRcIiwgeyBzb3VyY2U6IHRoaXMsIG1vZGUgfSk7XG5cbiAgICB0aGlzLl91cGRhdGVTcHJlYWRNb2RlKC8qIHBhZ2VOdW1iZXIgPSAqLyB0aGlzLl9jdXJyZW50UGFnZU51bWJlcik7XG4gIH1cblxuICBfdXBkYXRlU3ByZWFkTW9kZShwYWdlTnVtYmVyID0gbnVsbCkge1xuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlcixcbiAgICAgIHBhZ2VzID0gdGhpcy5fcGFnZXM7XG4gICAgLy8gVGVtcG9yYXJpbHkgcmVtb3ZlIGFsbCB0aGUgcGFnZXMgZnJvbSB0aGUgRE9NLlxuICAgIHZpZXdlci50ZXh0Q29udGVudCA9IFwiXCI7XG5cbiAgICBpZiAodGhpcy5fc3ByZWFkTW9kZSA9PT0gU3ByZWFkTW9kZS5OT05FKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaU1heCA9IHBhZ2VzLmxlbmd0aDsgaSA8IGlNYXg7ICsraSkge1xuICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQocGFnZXNbaV0uZGl2KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGFyaXR5ID0gdGhpcy5fc3ByZWFkTW9kZSAtIDE7XG4gICAgICBsZXQgc3ByZWFkID0gbnVsbDtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpTWF4ID0gcGFnZXMubGVuZ3RoOyBpIDwgaU1heDsgKytpKSB7XG4gICAgICAgIGlmIChzcHJlYWQgPT09IG51bGwpIHtcbiAgICAgICAgICBzcHJlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIHNwcmVhZC5jbGFzc05hbWUgPSBcInNwcmVhZFwiO1xuICAgICAgICAgIHZpZXdlci5hcHBlbmRDaGlsZChzcHJlYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGkgJSAyID09PSBwYXJpdHkpIHtcbiAgICAgICAgICBzcHJlYWQgPSBzcHJlYWQuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQoc3ByZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBzcHJlYWQuYXBwZW5kQ2hpbGQocGFnZXNbaV0uZGl2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBhZ2VOdW1iZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlciwgLyogcmVzZXRDdXJyZW50UGFnZVZpZXcgPSAqLyB0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCB7IEJhc2VWaWV3ZXIgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBCYXNlVmlld2VyIH0gZnJvbSBcIi4vYmFzZV92aWV3ZXIuanNcIjtcbmltcG9ydCB7IHNoYWRvdyB9IGZyb20gXCJwZGZqcy1saWJcIjtcblxuY2xhc3MgUERGVmlld2VyIGV4dGVuZHMgQmFzZVZpZXdlciB7XG4gIGdldCBfdmlld2VyRWxlbWVudCgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX3ZpZXdlckVsZW1lbnRcIiwgdGhpcy52aWV3ZXIpO1xuICB9XG5cbiAgX3Njcm9sbEludG9WaWV3KHsgcGFnZURpdiwgcGFnZVNwb3QgPSBudWxsLCBwYWdlTnVtYmVyID0gbnVsbCB9KSB7XG4gICAgaWYgKCFwYWdlU3BvdCAmJiAhdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkge1xuICAgICAgY29uc3QgbGVmdCA9IHBhZ2VEaXYub2Zmc2V0TGVmdCArIHBhZ2VEaXYuY2xpZW50TGVmdDtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gbGVmdCArIHBhZ2VEaXYuY2xpZW50V2lkdGg7XG4gICAgICBjb25zdCB7IHNjcm9sbExlZnQsIGNsaWVudFdpZHRoIH0gPSB0aGlzLmNvbnRhaW5lcjtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5faXNTY3JvbGxNb2RlSG9yaXpvbnRhbCB8fFxuICAgICAgICBsZWZ0IDwgc2Nyb2xsTGVmdCB8fFxuICAgICAgICByaWdodCA+IHNjcm9sbExlZnQgKyBjbGllbnRXaWR0aFxuICAgICAgKSB7XG4gICAgICAgIHBhZ2VTcG90ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuX3Njcm9sbEludG9WaWV3KHsgcGFnZURpdiwgcGFnZVNwb3QsIHBhZ2VOdW1iZXIgfSk7XG4gIH1cblxuICBfZ2V0VmlzaWJsZVBhZ2VzKCkge1xuICAgIGlmICh0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7XG4gICAgICAvLyBUaGUgYWxnb3JpdGhtIGluIGBnZXRWaXNpYmxlRWxlbWVudHNgIGRvZXNuJ3Qgd29yayBpbiBhbGwgYnJvd3NlcnMgYW5kXG4gICAgICAvLyBjb25maWd1cmF0aW9ucyAoZS5nLiBDaHJvbWUpIHdoZW4gUHJlc2VudGF0aW9uIE1vZGUgaXMgYWN0aXZlLlxuICAgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnRWaXNpYmxlUGFnZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuX2dldFZpc2libGVQYWdlcygpO1xuICB9XG5cbiAgX3VwZGF0ZUhlbHBlcih2aXNpYmxlUGFnZXMpIHtcbiAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY3VycmVudElkID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXI7XG4gICAgbGV0IHN0aWxsRnVsbHlWaXNpYmxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgdmlzaWJsZVBhZ2VzKSB7XG4gICAgICBpZiAocGFnZS5wZXJjZW50IDwgMTAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHBhZ2UuaWQgPT09IGN1cnJlbnRJZCkge1xuICAgICAgICBzdGlsbEZ1bGx5VmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXN0aWxsRnVsbHlWaXNpYmxlKSB7XG4gICAgICBjdXJyZW50SWQgPSB2aXNpYmxlUGFnZXNbMF0uaWQ7XG4gICAgfVxuICAgIHRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKGN1cnJlbnRJZCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGVmlld2VyIH07XG4iXSwic291cmNlUm9vdCI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzLmpzIGIvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjM5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMuanMKQEAgLTAsMCArMSw4MDE2IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisKKyhmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7CisJaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKQorCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKKwllbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkKKwkJZGVmaW5lKCJwZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycyIsIFtdLCBmYWN0b3J5KTsKKwllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKKwkJZXhwb3J0c1sicGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMiXSA9IGZhY3RvcnkoKTsKKwllbHNlCisJCXJvb3RbInBkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzIl0gPSByb290LnBkZmpzSW1hZ2VEZWNvZGVycyA9IGZhY3RvcnkoKTsKK30pKHRoaXMsIGZ1bmN0aW9uKCkgeworcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKKy8qKioqKiovIAkvLyBUaGUgbW9kdWxlIGNhY2hlCisvKioqKioqLyAJdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KKy8qKioqKiovIAlmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CisvKioqKioqLworLyoqKioqKi8gCQkvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKKy8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHsKKy8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOworLyoqKioqKi8gCQl9CisvKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCisvKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKKy8qKioqKiovIAkJCWk6IG1vZHVsZUlkLAorLyoqKioqKi8gCQkJbDogZmFsc2UsCisvKioqKioqLyAJCQlleHBvcnRzOiB7fQorLyoqKioqKi8gCQl9OworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCisvKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pOworLyoqKioqKi8KKy8qKioqKiovIAkJLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZAorLyoqKioqKi8gCQltb2R1bGUubCA9IHRydWU7CisvKioqKioqLworLyoqKioqKi8gCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQorLyoqKioqKi8gCQlyZXR1cm4gbW9kdWxlLmV4cG9ydHM7CisvKioqKioqLyAJfQorLyoqKioqKi8KKy8qKioqKiovCisvKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXykKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm0gPSBtb2R1bGVzOworLyoqKioqKi8KKy8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7CisvKioqKioqLworLyoqKioqKi8gCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0cworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikgeworLyoqKioqKi8gCQlpZighX193X3BkZmpzX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7CisvKioqKioqLyAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTsKKy8qKioqKiovIAkJfQorLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7CisvKioqKioqLyAJCWlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykgeworLyoqKioqKi8gCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7CisvKioqKioqLyAJCX0KKy8qKioqKiovIAkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3QKKy8qKioqKiovIAkvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXQKKy8qKioqKiovIAkvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnMKKy8qKioqKiovIAkvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3QKKy8qKioqKiovIAkvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHsKKy8qKioqKiovIAkJaWYobW9kZSAmIDEpIHZhbHVlID0gX193X3BkZmpzX3JlcXVpcmVfXyh2YWx1ZSk7CisvKioqKioqLyAJCWlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7CisvKioqKioqLyAJCWlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7CisvKioqKioqLyAJCXZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisvKioqKioqLyAJCV9fd19wZGZqc19yZXF1aXJlX18ucihucyk7CisvKioqKioqLyAJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTsKKy8qKioqKiovIAkJaWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193X3BkZmpzX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpOworLyoqKioqKi8gCQlyZXR1cm4gbnM7CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXMKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHsKKy8qKioqKiovIAkJdmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/CisvKioqKioqLyAJCQlmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOgorLyoqKioqKi8gCQkJZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTsKKy8qKioqKiovIAkJX193X3BkZmpzX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpOworLyoqKioqKi8gCQlyZXR1cm4gZ2V0dGVyOworLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbAorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX18KKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLnAgPSAiIjsKKy8qKioqKiovCisvKioqKioqLworLyoqKioqKi8gCS8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0cworLyoqKioqKi8gCXJldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucyA9IDApOworLyoqKioqKi8gfSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqLyAoWworLyogMCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImdldFZlcmJvc2l0eUxldmVsIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuZ2V0VmVyYm9zaXR5TGV2ZWw7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJzZXRWZXJib3NpdHlMZXZlbCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLnNldFZlcmJvc2l0eUxldmVsOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiSmJpZzJtYWdlIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2piaWcuSmJpZzJtYWdlOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiSnBlZ0ltYWdlIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2pwZy5KcGVnSW1hZ2U7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJKcHhJbWFnZSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9qcHguSnB4SW1hZ2U7CisgIH0KK30pOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCit2YXIgX2piaWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOworCit2YXIgX2pwZyA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBfanB4ID0gX193X3BkZmpzX3JlcXVpcmVfXyg5KTsKKworY29uc3QgcGRmanNWZXJzaW9uID0gJzIuNi4zNDcnOworY29uc3QgcGRmanNCdWlsZCA9ICczYmU5YzY1Zic7CisKKy8qKiovIH0pLAorLyogMSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmFycmF5Qnl0ZUxlbmd0aCA9IGFycmF5Qnl0ZUxlbmd0aDsKK2V4cG9ydHMuYXJyYXlzVG9CeXRlcyA9IGFycmF5c1RvQnl0ZXM7CitleHBvcnRzLmFzc2VydCA9IGFzc2VydDsKK2V4cG9ydHMuYnl0ZXNUb1N0cmluZyA9IGJ5dGVzVG9TdHJpbmc7CitleHBvcnRzLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHk7CitleHBvcnRzLmVzY2FwZVN0cmluZyA9IGVzY2FwZVN0cmluZzsKK2V4cG9ydHMuZ2V0TW9kaWZpY2F0aW9uRGF0ZSA9IGdldE1vZGlmaWNhdGlvbkRhdGU7CitleHBvcnRzLmdldFZlcmJvc2l0eUxldmVsID0gZ2V0VmVyYm9zaXR5TGV2ZWw7CitleHBvcnRzLmluZm8gPSBpbmZvOworZXhwb3J0cy5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjsKK2V4cG9ydHMuaXNBcnJheUVxdWFsID0gaXNBcnJheUVxdWFsOworZXhwb3J0cy5pc0Jvb2wgPSBpc0Jvb2w7CitleHBvcnRzLmlzTnVtID0gaXNOdW07CitleHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7CitleHBvcnRzLmlzU2FtZU9yaWdpbiA9IGlzU2FtZU9yaWdpbjsKK2V4cG9ydHMuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCA9IGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw7CitleHBvcnRzLnJlbW92ZU51bGxDaGFyYWN0ZXJzID0gcmVtb3ZlTnVsbENoYXJhY3RlcnM7CitleHBvcnRzLnNldFZlcmJvc2l0eUxldmVsID0gc2V0VmVyYm9zaXR5TGV2ZWw7CitleHBvcnRzLnNoYWRvdyA9IHNoYWRvdzsKK2V4cG9ydHMuc3RyaW5nMzIgPSBzdHJpbmczMjsKK2V4cG9ydHMuc3RyaW5nVG9CeXRlcyA9IHN0cmluZ1RvQnl0ZXM7CitleHBvcnRzLnN0cmluZ1RvUERGU3RyaW5nID0gc3RyaW5nVG9QREZTdHJpbmc7CitleHBvcnRzLnN0cmluZ1RvVVRGOFN0cmluZyA9IHN0cmluZ1RvVVRGOFN0cmluZzsKK2V4cG9ydHMudXRmOFN0cmluZ1RvU3RyaW5nID0gdXRmOFN0cmluZ1RvU3RyaW5nOworZXhwb3J0cy53YXJuID0gd2FybjsKK2V4cG9ydHMudW5yZWFjaGFibGUgPSB1bnJlYWNoYWJsZTsKK2V4cG9ydHMuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkID0gZXhwb3J0cy5Jc0xpdHRsZUVuZGlhbkNhY2hlZCA9IGV4cG9ydHMuY3JlYXRlT2JqZWN0VVJMID0gZXhwb3J0cy5Gb3JtYXRFcnJvciA9IGV4cG9ydHMuVXRpbCA9IGV4cG9ydHMuVW5rbm93bkVycm9yRXhjZXB0aW9uID0gZXhwb3J0cy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gZXhwb3J0cy5TdHJlYW1UeXBlID0gZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IGV4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBleHBvcnRzLlBhc3N3b3JkRXhjZXB0aW9uID0gZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gZXhwb3J0cy5JbnZhbGlkUERGRXhjZXB0aW9uID0gZXhwb3J0cy5BYm9ydEV4Y2VwdGlvbiA9IGV4cG9ydHMuQ01hcENvbXByZXNzaW9uVHlwZSA9IGV4cG9ydHMuSW1hZ2VLaW5kID0gZXhwb3J0cy5Gb250VHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblR5cGUgPSBleHBvcnRzLkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblJldmlld1N0YXRlID0gZXhwb3J0cy5Bbm5vdGF0aW9uUmVwbHlUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBleHBvcnRzLkFubm90YXRpb25GbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmllbGRGbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gZXhwb3J0cy5VTlNVUFBPUlRFRF9GRUFUVVJFUyA9IGV4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBleHBvcnRzLk9QUyA9IGV4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gZXhwb3J0cy5GT05UX0lERU5USVRZX01BVFJJWCA9IGV4cG9ydHMuQmFzZUV4Y2VwdGlvbiA9IHZvaWQgMDsKKworX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworY29uc3QgSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdOworZXhwb3J0cy5JREVOVElUWV9NQVRSSVggPSBJREVOVElUWV9NQVRSSVg7Citjb25zdCBGT05UX0lERU5USVRZX01BVFJJWCA9IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdOworZXhwb3J0cy5GT05UX0lERU5USVRZX01BVFJJWCA9IEZPTlRfSURFTlRJVFlfTUFUUklYOworY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7CisgIFBSSU5UOiAweDA0LAorICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsCisgIENPUFk6IDB4MTAsCisgIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCwKKyAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsCisgIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLAorICBBU1NFTUJMRTogMHg0MDAsCisgIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAKK307CitleHBvcnRzLlBlcm1pc3Npb25GbGFnID0gUGVybWlzc2lvbkZsYWc7Citjb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHsKKyAgRklMTDogMCwKKyAgU1RST0tFOiAxLAorICBGSUxMX1NUUk9LRTogMiwKKyAgSU5WSVNJQkxFOiAzLAorICBGSUxMX0FERF9UT19QQVRIOiA0LAorICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsCisgIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LAorICBBRERfVE9fUEFUSDogNywKKyAgRklMTF9TVFJPS0VfTUFTSzogMywKKyAgQUREX1RPX1BBVEhfRkxBRzogNAorfTsKK2V4cG9ydHMuVGV4dFJlbmRlcmluZ01vZGUgPSBUZXh0UmVuZGVyaW5nTW9kZTsKK2NvbnN0IEltYWdlS2luZCA9IHsKKyAgR1JBWVNDQUxFXzFCUFA6IDEsCisgIFJHQl8yNEJQUDogMiwKKyAgUkdCQV8zMkJQUDogMworfTsKK2V4cG9ydHMuSW1hZ2VLaW5kID0gSW1hZ2VLaW5kOworY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7CisgIFRFWFQ6IDEsCisgIExJTks6IDIsCisgIEZSRUVURVhUOiAzLAorICBMSU5FOiA0LAorICBTUVVBUkU6IDUsCisgIENJUkNMRTogNiwKKyAgUE9MWUdPTjogNywKKyAgUE9MWUxJTkU6IDgsCisgIEhJR0hMSUdIVDogOSwKKyAgVU5ERVJMSU5FOiAxMCwKKyAgU1FVSUdHTFk6IDExLAorICBTVFJJS0VPVVQ6IDEyLAorICBTVEFNUDogMTMsCisgIENBUkVUOiAxNCwKKyAgSU5LOiAxNSwKKyAgUE9QVVA6IDE2LAorICBGSUxFQVRUQUNITUVOVDogMTcsCisgIFNPVU5EOiAxOCwKKyAgTU9WSUU6IDE5LAorICBXSURHRVQ6IDIwLAorICBTQ1JFRU46IDIxLAorICBQUklOVEVSTUFSSzogMjIsCisgIFRSQVBORVQ6IDIzLAorICBXQVRFUk1BUks6IDI0LAorICBUSFJFRUQ6IDI1LAorICBSRURBQ1Q6IDI2Cit9OworZXhwb3J0cy5Bbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlOworY29uc3QgQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0geworICBNQVJLRUQ6ICJNYXJrZWQiLAorICBSRVZJRVc6ICJSZXZpZXciCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGU7Citjb25zdCBBbm5vdGF0aW9uTWFya2VkU3RhdGUgPSB7CisgIE1BUktFRDogIk1hcmtlZCIsCisgIFVOTUFSS0VEOiAiVW5tYXJrZWQiCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBBbm5vdGF0aW9uTWFya2VkU3RhdGU7Citjb25zdCBBbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSB7CisgIEFDQ0VQVEVEOiAiQWNjZXB0ZWQiLAorICBSRUpFQ1RFRDogIlJlamVjdGVkIiwKKyAgQ0FOQ0VMTEVEOiAiQ2FuY2VsbGVkIiwKKyAgQ09NUExFVEVEOiAiQ29tcGxldGVkIiwKKyAgTk9ORTogIk5vbmUiCit9OworZXhwb3J0cy5Bbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSBBbm5vdGF0aW9uUmV2aWV3U3RhdGU7Citjb25zdCBBbm5vdGF0aW9uUmVwbHlUeXBlID0geworICBHUk9VUDogIkdyb3VwIiwKKyAgUkVQTFk6ICJSIgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblJlcGx5VHlwZSA9IEFubm90YXRpb25SZXBseVR5cGU7Citjb25zdCBBbm5vdGF0aW9uRmxhZyA9IHsKKyAgSU5WSVNJQkxFOiAweDAxLAorICBISURERU46IDB4MDIsCisgIFBSSU5UOiAweDA0LAorICBOT1pPT006IDB4MDgsCisgIE5PUk9UQVRFOiAweDEwLAorICBOT1ZJRVc6IDB4MjAsCisgIFJFQURPTkxZOiAweDQwLAorICBMT0NLRUQ6IDB4ODAsCisgIFRPR0dMRU5PVklFVzogMHgxMDAsCisgIExPQ0tFRENPTlRFTlRTOiAweDIwMAorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkZsYWcgPSBBbm5vdGF0aW9uRmxhZzsKK2NvbnN0IEFubm90YXRpb25GaWVsZEZsYWcgPSB7CisgIFJFQURPTkxZOiAweDAwMDAwMDEsCisgIFJFUVVJUkVEOiAweDAwMDAwMDIsCisgIE5PRVhQT1JUOiAweDAwMDAwMDQsCisgIE1VTFRJTElORTogMHgwMDAxMDAwLAorICBQQVNTV09SRDogMHgwMDAyMDAwLAorICBOT1RPR0dMRVRPT0ZGOiAweDAwMDQwMDAsCisgIFJBRElPOiAweDAwMDgwMDAsCisgIFBVU0hCVVRUT046IDB4MDAxMDAwMCwKKyAgQ09NQk86IDB4MDAyMDAwMCwKKyAgRURJVDogMHgwMDQwMDAwLAorICBTT1JUOiAweDAwODAwMDAsCisgIEZJTEVTRUxFQ1Q6IDB4MDEwMDAwMCwKKyAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKKyAgRE9OT1RTUEVMTENIRUNLOiAweDA0MDAwMDAsCisgIERPTk9UU0NST0xMOiAweDA4MDAwMDAsCisgIENPTUI6IDB4MTAwMDAwMCwKKyAgUklDSFRFWFQ6IDB4MjAwMDAwMCwKKyAgUkFESU9TSU5VTklTT046IDB4MjAwMDAwMCwKKyAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IEFubm90YXRpb25GaWVsZEZsYWc7Citjb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0geworICBTT0xJRDogMSwKKyAgREFTSEVEOiAyLAorICBCRVZFTEVEOiAzLAorICBJTlNFVDogNCwKKyAgVU5ERVJMSU5FOiA1Cit9OworZXhwb3J0cy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZTsKK2NvbnN0IFN0cmVhbVR5cGUgPSB7CisgIFVOS05PV046ICJVTktOT1dOIiwKKyAgRkxBVEU6ICJGTEFURSIsCisgIExaVzogIkxaVyIsCisgIERDVDogIkRDVCIsCisgIEpQWDogIkpQWCIsCisgIEpCSUc6ICJKQklHIiwKKyAgQTg1OiAiQTg1IiwKKyAgQUhYOiAiQUhYIiwKKyAgQ0NGOiAiQ0NGIiwKKyAgUkxYOiAiUkxYIgorfTsKK2V4cG9ydHMuU3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU7Citjb25zdCBGb250VHlwZSA9IHsKKyAgVU5LTk9XTjogIlVOS05PV04iLAorICBUWVBFMTogIlRZUEUxIiwKKyAgVFlQRTFDOiAiVFlQRTFDIiwKKyAgQ0lERk9OVFRZUEUwOiAiQ0lERk9OVFRZUEUwIiwKKyAgQ0lERk9OVFRZUEUwQzogIkNJREZPTlRUWVBFMEMiLAorICBUUlVFVFlQRTogIlRSVUVUWVBFIiwKKyAgQ0lERk9OVFRZUEUyOiAiQ0lERk9OVFRZUEUyIiwKKyAgVFlQRTM6ICJUWVBFMyIsCisgIE9QRU5UWVBFOiAiT1BFTlRZUEUiLAorICBUWVBFMDogIlRZUEUwIiwKKyAgTU1UWVBFMTogIk1NVFlQRTEiCit9OworZXhwb3J0cy5Gb250VHlwZSA9IEZvbnRUeXBlOworY29uc3QgVmVyYm9zaXR5TGV2ZWwgPSB7CisgIEVSUk9SUzogMCwKKyAgV0FSTklOR1M6IDEsCisgIElORk9TOiA1Cit9OworZXhwb3J0cy5WZXJib3NpdHlMZXZlbCA9IFZlcmJvc2l0eUxldmVsOworY29uc3QgQ01hcENvbXByZXNzaW9uVHlwZSA9IHsKKyAgTk9ORTogMCwKKyAgQklOQVJZOiAxLAorICBTVFJFQU06IDIKK307CitleHBvcnRzLkNNYXBDb21wcmVzc2lvblR5cGUgPSBDTWFwQ29tcHJlc3Npb25UeXBlOworY29uc3QgT1BTID0geworICBkZXBlbmRlbmN5OiAxLAorICBzZXRMaW5lV2lkdGg6IDIsCisgIHNldExpbmVDYXA6IDMsCisgIHNldExpbmVKb2luOiA0LAorICBzZXRNaXRlckxpbWl0OiA1LAorICBzZXREYXNoOiA2LAorICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsCisgIHNldEZsYXRuZXNzOiA4LAorICBzZXRHU3RhdGU6IDksCisgIHNhdmU6IDEwLAorICByZXN0b3JlOiAxMSwKKyAgdHJhbnNmb3JtOiAxMiwKKyAgbW92ZVRvOiAxMywKKyAgbGluZVRvOiAxNCwKKyAgY3VydmVUbzogMTUsCisgIGN1cnZlVG8yOiAxNiwKKyAgY3VydmVUbzM6IDE3LAorICBjbG9zZVBhdGg6IDE4LAorICByZWN0YW5nbGU6IDE5LAorICBzdHJva2U6IDIwLAorICBjbG9zZVN0cm9rZTogMjEsCisgIGZpbGw6IDIyLAorICBlb0ZpbGw6IDIzLAorICBmaWxsU3Ryb2tlOiAyNCwKKyAgZW9GaWxsU3Ryb2tlOiAyNSwKKyAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKKyAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LAorICBlbmRQYXRoOiAyOCwKKyAgY2xpcDogMjksCisgIGVvQ2xpcDogMzAsCisgIGJlZ2luVGV4dDogMzEsCisgIGVuZFRleHQ6IDMyLAorICBzZXRDaGFyU3BhY2luZzogMzMsCisgIHNldFdvcmRTcGFjaW5nOiAzNCwKKyAgc2V0SFNjYWxlOiAzNSwKKyAgc2V0TGVhZGluZzogMzYsCisgIHNldEZvbnQ6IDM3LAorICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsCisgIHNldFRleHRSaXNlOiAzOSwKKyAgbW92ZVRleHQ6IDQwLAorICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAorICBzZXRUZXh0TWF0cml4OiA0MiwKKyAgbmV4dExpbmU6IDQzLAorICBzaG93VGV4dDogNDQsCisgIHNob3dTcGFjZWRUZXh0OiA0NSwKKyAgbmV4dExpbmVTaG93VGV4dDogNDYsCisgIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKKyAgc2V0Q2hhcldpZHRoOiA0OCwKKyAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSwKKyAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCisgIHNldEZpbGxDb2xvclNwYWNlOiA1MSwKKyAgc2V0U3Ryb2tlQ29sb3I6IDUyLAorICBzZXRTdHJva2VDb2xvck46IDUzLAorICBzZXRGaWxsQ29sb3I6IDU0LAorICBzZXRGaWxsQ29sb3JOOiA1NSwKKyAgc2V0U3Ryb2tlR3JheTogNTYsCisgIHNldEZpbGxHcmF5OiA1NywKKyAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LAorICBzZXRGaWxsUkdCQ29sb3I6IDU5LAorICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLAorICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSwKKyAgc2hhZGluZ0ZpbGw6IDYyLAorICBiZWdpbklubGluZUltYWdlOiA2MywKKyAgYmVnaW5JbWFnZURhdGE6IDY0LAorICBlbmRJbmxpbmVJbWFnZTogNjUsCisgIHBhaW50WE9iamVjdDogNjYsCisgIG1hcmtQb2ludDogNjcsCisgIG1hcmtQb2ludFByb3BzOiA2OCwKKyAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSwKKyAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLAorICBlbmRNYXJrZWRDb250ZW50OiA3MSwKKyAgYmVnaW5Db21wYXQ6IDcyLAorICBlbmRDb21wYXQ6IDczLAorICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAorICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSwKKyAgYmVnaW5Hcm91cDogNzYsCisgIGVuZEdyb3VwOiA3NywKKyAgYmVnaW5Bbm5vdGF0aW9uczogNzgsCisgIGVuZEFubm90YXRpb25zOiA3OSwKKyAgYmVnaW5Bbm5vdGF0aW9uOiA4MCwKKyAgZW5kQW5ub3RhdGlvbjogODEsCisgIHBhaW50SnBlZ1hPYmplY3Q6IDgyLAorICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLAorICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsCisgIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKKyAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LAorICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NywKKyAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAorICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LAorICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLAorICBjb25zdHJ1Y3RQYXRoOiA5MQorfTsKK2V4cG9ydHMuT1BTID0gT1BTOworY29uc3QgVU5TVVBQT1JURURfRkVBVFVSRVMgPSB7CisgIHVua25vd246ICJ1bmtub3duIiwKKyAgZm9ybXM6ICJmb3JtcyIsCisgIGphdmFTY3JpcHQ6ICJqYXZhU2NyaXB0IiwKKyAgc21hc2s6ICJzbWFzayIsCisgIHNoYWRpbmdQYXR0ZXJuOiAic2hhZGluZ1BhdHRlcm4iLAorICBmb250OiAiZm9udCIsCisgIGVycm9yVGlsaW5nUGF0dGVybjogImVycm9yVGlsaW5nUGF0dGVybiIsCisgIGVycm9yRXh0R1N0YXRlOiAiZXJyb3JFeHRHU3RhdGUiLAorICBlcnJvclhPYmplY3Q6ICJlcnJvclhPYmplY3QiLAorICBlcnJvckZvbnRMb2FkVHlwZTM6ICJlcnJvckZvbnRMb2FkVHlwZTMiLAorICBlcnJvckZvbnRTdGF0ZTogImVycm9yRm9udFN0YXRlIiwKKyAgZXJyb3JGb250TWlzc2luZzogImVycm9yRm9udE1pc3NpbmciLAorICBlcnJvckZvbnRUcmFuc2xhdGU6ICJlcnJvckZvbnRUcmFuc2xhdGUiLAorICBlcnJvckNvbG9yU3BhY2U6ICJlcnJvckNvbG9yU3BhY2UiLAorICBlcnJvck9wZXJhdG9yTGlzdDogImVycm9yT3BlcmF0b3JMaXN0IiwKKyAgZXJyb3JGb250VG9Vbmljb2RlOiAiZXJyb3JGb250VG9Vbmljb2RlIiwKKyAgZXJyb3JGb250TG9hZE5hdGl2ZTogImVycm9yRm9udExvYWROYXRpdmUiLAorICBlcnJvckZvbnRHZXRQYXRoOiAiZXJyb3JGb250R2V0UGF0aCIsCisgIGVycm9yTWFya2VkQ29udGVudDogImVycm9yTWFya2VkQ29udGVudCIKK307CitleHBvcnRzLlVOU1VQUE9SVEVEX0ZFQVRVUkVTID0gVU5TVVBQT1JURURfRkVBVFVSRVM7Citjb25zdCBQYXNzd29yZFJlc3BvbnNlcyA9IHsKKyAgTkVFRF9QQVNTV09SRDogMSwKKyAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyCit9OworZXhwb3J0cy5QYXNzd29yZFJlc3BvbnNlcyA9IFBhc3N3b3JkUmVzcG9uc2VzOworbGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTOworCitmdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkgeworICBpZiAoTnVtYmVyLmlzSW50ZWdlcihsZXZlbCkpIHsKKyAgICB2ZXJib3NpdHkgPSBsZXZlbDsKKyAgfQorfQorCitmdW5jdGlvbiBnZXRWZXJib3NpdHlMZXZlbCgpIHsKKyAgcmV0dXJuIHZlcmJvc2l0eTsKK30KKworZnVuY3Rpb24gaW5mbyhtc2cpIHsKKyAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykgeworICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTsKKyAgfQorfQorCitmdW5jdGlvbiB3YXJuKG1zZykgeworICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7CisgICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApOworICB9Cit9CisKK2Z1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykgeworICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKK30KKworZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykgeworICBpZiAoIWNvbmQpIHsKKyAgICB1bnJlYWNoYWJsZShtc2cpOworICB9Cit9CisKK2Z1bmN0aW9uIGlzU2FtZU9yaWdpbihiYXNlVXJsLCBvdGhlclVybCkgeworICBsZXQgYmFzZTsKKworICB0cnkgeworICAgIGJhc2UgPSBuZXcgVVJMKGJhc2VVcmwpOworCisgICAgaWYgKCFiYXNlLm9yaWdpbiB8fCBiYXNlLm9yaWdpbiA9PT0gIm51bGwiKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3Qgb3RoZXIgPSBuZXcgVVJMKG90aGVyVXJsLCBiYXNlKTsKKyAgcmV0dXJuIGJhc2Uub3JpZ2luID09PSBvdGhlci5vcmlnaW47Cit9CisKK2Z1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2wodXJsKSB7CisgIGlmICghdXJsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHsKKyAgICBjYXNlICJodHRwOiI6CisgICAgY2FzZSAiaHR0cHM6IjoKKyAgICBjYXNlICJmdHA6IjoKKyAgICBjYXNlICJtYWlsdG86IjoKKyAgICBjYXNlICJ0ZWw6IjoKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitmdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgYmFzZVVybCkgeworICBpZiAoIXVybCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgdHJ5IHsKKyAgICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCk7CisKKyAgICBpZiAoX2lzVmFsaWRQcm90b2NvbChhYnNvbHV0ZVVybCkpIHsKKyAgICAgIHJldHVybiBhYnNvbHV0ZVVybDsKKyAgICB9CisgIH0gY2F0Y2ggKGV4KSB7fQorCisgIHJldHVybiBudWxsOworfQorCitmdW5jdGlvbiBzaGFkb3cob2JqLCBwcm9wLCB2YWx1ZSkgeworICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7CisgICAgdmFsdWUsCisgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgd3JpdGFibGU6IGZhbHNlCisgIH0pOworICByZXR1cm4gdmFsdWU7Cit9CisKK2NvbnN0IEJhc2VFeGNlcHRpb24gPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VFeGNlcHRpb24pIHsKKyAgICAgIHVucmVhY2hhYmxlKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLiIpOworICAgIH0KKworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB9CisKKyAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKKyAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247CisgIHJldHVybiBCYXNlRXhjZXB0aW9uOworfSgpOworCitleHBvcnRzLkJhc2VFeGNlcHRpb24gPSBCYXNlRXhjZXB0aW9uOworCitjbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHsKKyAgICBzdXBlcihtc2cpOworICAgIHRoaXMuY29kZSA9IGNvZGU7CisgIH0KKworfQorCitleHBvcnRzLlBhc3N3b3JkRXhjZXB0aW9uID0gUGFzc3dvcmRFeGNlcHRpb247CisKK2NsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHsKKyAgICBzdXBlcihtc2cpOworICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7CisgIH0KKworfQorCitleHBvcnRzLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IFVua25vd25FcnJvckV4Y2VwdGlvbjsKKworY2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5JbnZhbGlkUERGRXhjZXB0aW9uID0gSW52YWxpZFBERkV4Y2VwdGlvbjsKKworY2xhc3MgTWlzc2luZ1BERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gTWlzc2luZ1BERkV4Y2VwdGlvbjsKKworY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CisgIGNvbnN0cnVjdG9yKG1zZywgc3RhdHVzKSB7CisgICAgc3VwZXIobXNnKTsKKyAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgfQorCit9CisKK2V4cG9ydHMuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uOworCitjbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5Gb3JtYXRFcnJvciA9IEZvcm1hdEVycm9yOworCitjbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5BYm9ydEV4Y2VwdGlvbiA9IEFib3J0RXhjZXB0aW9uOworY29uc3QgTnVsbENoYXJhY3RlcnNSZWdFeHAgPSAvXHgwMC9nOworCitmdW5jdGlvbiByZW1vdmVOdWxsQ2hhcmFjdGVycyhzdHIpIHsKKyAgaWYgKHR5cGVvZiBzdHIgIT09ICJzdHJpbmciKSB7CisgICAgd2FybigiVGhlIGFyZ3VtZW50IGZvciByZW1vdmVOdWxsQ2hhcmFjdGVycyBtdXN0IGJlIGEgc3RyaW5nLiIpOworICAgIHJldHVybiBzdHI7CisgIH0KKworICByZXR1cm4gc3RyLnJlcGxhY2UoTnVsbENoYXJhY3RlcnNSZWdFeHAsICIiKTsKK30KKworZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyhieXRlcykgeworICBhc3NlcnQoYnl0ZXMgIT09IG51bGwgJiYgdHlwZW9mIGJ5dGVzID09PSAib2JqZWN0IiAmJiBieXRlcy5sZW5ndGggIT09IHVuZGVmaW5lZCwgIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmciKTsKKyAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyOworCisgIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKKyAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7CisgIH0KKworICBjb25zdCBzdHJCdWYgPSBbXTsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKKyAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7CisgICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7CisgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpOworICB9CisKKyAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHsKKyAgYXNzZXJ0KHR5cGVvZiBzdHIgPT09ICJzdHJpbmciLCAiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpOworICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoOworICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmOworICB9CisKKyAgcmV0dXJuIGJ5dGVzOworfQorCitmdW5jdGlvbiBhcnJheUJ5dGVMZW5ndGgoYXJyKSB7CisgIGlmIChhcnIubGVuZ3RoICE9PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gYXJyLmxlbmd0aDsKKyAgfQorCisgIGFzc2VydChhcnIuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkLCAiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC4iKTsKKyAgcmV0dXJuIGFyci5ieXRlTGVuZ3RoOworfQorCitmdW5jdGlvbiBhcnJheXNUb0J5dGVzKGFycikgeworICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoOworCisgIGlmIChsZW5ndGggPT09IDEgJiYgYXJyWzBdIGluc3RhbmNlb2YgVWludDhBcnJheSkgeworICAgIHJldHVybiBhcnJbMF07CisgIH0KKworICBsZXQgcmVzdWx0TGVuZ3RoID0gMDsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgcmVzdWx0TGVuZ3RoICs9IGFycmF5Qnl0ZUxlbmd0aChhcnJbaV0pOworICB9CisKKyAgbGV0IHBvcyA9IDA7CisgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShyZXN1bHRMZW5ndGgpOworCisgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICBsZXQgaXRlbSA9IGFycltpXTsKKworICAgIGlmICghKGl0ZW0gaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgeworICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAic3RyaW5nIikgeworICAgICAgICBpdGVtID0gc3RyaW5nVG9CeXRlcyhpdGVtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGl0ZW0gPSBuZXcgVWludDhBcnJheShpdGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBpdGVtTGVuZ3RoID0gaXRlbS5ieXRlTGVuZ3RoOworICAgIGRhdGEuc2V0KGl0ZW0sIHBvcyk7CisgICAgcG9zICs9IGl0ZW1MZW5ndGg7CisgIH0KKworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHsKKyAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOworfQorCitmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHsKKyAgY29uc3QgYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KDQpOworICBidWZmZXI4WzBdID0gMTsKKyAgY29uc3QgdmlldzMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcjguYnVmZmVyLCAwLCAxKTsKKyAgcmV0dXJuIHZpZXczMlswXSA9PT0gMTsKK30KKworY29uc3QgSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSB7CisgIGdldCB2YWx1ZSgpIHsKKyAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2YWx1ZSIsIGlzTGl0dGxlRW5kaWFuKCkpOworICB9CisKK307CitleHBvcnRzLklzTGl0dGxlRW5kaWFuQ2FjaGVkID0gSXNMaXR0bGVFbmRpYW5DYWNoZWQ7CisKK2Z1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHsKKyAgdHJ5IHsKKyAgICBuZXcgRnVuY3Rpb24oIiIpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2NvbnN0IElzRXZhbFN1cHBvcnRlZENhY2hlZCA9IHsKKyAgZ2V0IHZhbHVlKCkgeworICAgIHJldHVybiBzaGFkb3codGhpcywgInZhbHVlIiwgaXNFdmFsU3VwcG9ydGVkKCkpOworICB9CisKK307CitleHBvcnRzLklzRXZhbFN1cHBvcnRlZENhY2hlZCA9IElzRXZhbFN1cHBvcnRlZENhY2hlZDsKK2NvbnN0IHJnYkJ1ZiA9IFsicmdiKCIsIDAsICIsIiwgMCwgIiwiLCAwLCAiKSJdOworCitjbGFzcyBVdGlsIHsKKyAgc3RhdGljIG1ha2VDc3NSZ2IociwgZywgYikgeworICAgIHJnYkJ1ZlsxXSA9IHI7CisgICAgcmdiQnVmWzNdID0gZzsKKyAgICByZ2JCdWZbNV0gPSBiOworICAgIHJldHVybiByZ2JCdWYuam9pbigiIik7CisgIH0KKworICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikgeworICAgIHJldHVybiBbbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLCBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSwgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV1dOworICB9CisKKyAgc3RhdGljIGFwcGx5VHJhbnNmb3JtKHAsIG0pIHsKKyAgICBjb25zdCB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdOworICAgIGNvbnN0IHl0ID0gcFswXSAqIG1bMV0gKyBwWzFdICogbVszXSArIG1bNV07CisgICAgcmV0dXJuIFt4dCwgeXRdOworICB9CisKKyAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7CisgICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07CisgICAgY29uc3QgeHQgPSAocFswXSAqIG1bM10gLSBwWzFdICogbVsyXSArIG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZDsKKyAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDsKKyAgICByZXR1cm4gW3h0LCB5dF07CisgIH0KKworICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkgeworICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLCBtKTsKKyAgICBjb25zdCBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7CisgICAgY29uc3QgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7CisgICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7CisgICAgcmV0dXJuIFtNYXRoLm1pbihwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSwgTWF0aC5tYXgocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1heChwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSldOworICB9CisKKyAgc3RhdGljIGludmVyc2VUcmFuc2Zvcm0obSkgeworICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOworICAgIHJldHVybiBbbVszXSAvIGQsIC1tWzFdIC8gZCwgLW1bMl0gLyBkLCBtWzBdIC8gZCwgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCwgKG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZF07CisgIH0KKworICBzdGF0aWMgYXBwbHkzZFRyYW5zZm9ybShtLCB2KSB7CisgICAgcmV0dXJuIFttWzBdICogdlswXSArIG1bMV0gKiB2WzFdICsgbVsyXSAqIHZbMl0sIG1bM10gKiB2WzBdICsgbVs0XSAqIHZbMV0gKyBtWzVdICogdlsyXSwgbVs2XSAqIHZbMF0gKyBtWzddICogdlsxXSArIG1bOF0gKiB2WzJdXTsKKyAgfQorCisgIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7CisgICAgY29uc3QgdHJhbnNwb3NlID0gW21bMF0sIG1bMl0sIG1bMV0sIG1bM11dOworICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTsKKyAgICBjb25zdCBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107CisgICAgY29uc3QgYyA9IG1bMl0gKiB0cmFuc3Bvc2VbMF0gKyBtWzNdICogdHJhbnNwb3NlWzJdOworICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTsKKyAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyOworICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICogKGEgKyBkKSAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjsKKyAgICBjb25zdCBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7CisgICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxOworICAgIHJldHVybiBbTWF0aC5zcXJ0KHN4KSwgTWF0aC5zcXJ0KHN5KV07CisgIH0KKworICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7CisgICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7CisKKyAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHsKKyAgICAgIHJbMF0gPSByZWN0WzJdOworICAgICAgclsyXSA9IHJlY3RbMF07CisgICAgfQorCisgICAgaWYgKHJlY3RbMV0gPiByZWN0WzNdKSB7CisgICAgICByWzFdID0gcmVjdFszXTsKKyAgICAgIHJbM10gPSByZWN0WzFdOworICAgIH0KKworICAgIHJldHVybiByOworICB9CisKKyAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHsKKyAgICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHsKKyAgICAgIHJldHVybiBhIC0gYjsKKyAgICB9CisKKyAgICBjb25zdCBvcmRlcmVkWCA9IFtyZWN0MVswXSwgcmVjdDFbMl0sIHJlY3QyWzBdLCByZWN0MlsyXV0uc29ydChjb21wYXJlKTsKKyAgICBjb25zdCBvcmRlcmVkWSA9IFtyZWN0MVsxXSwgcmVjdDFbM10sIHJlY3QyWzFdLCByZWN0MlszXV0uc29ydChjb21wYXJlKTsKKyAgICBjb25zdCByZXN1bHQgPSBbXTsKKyAgICByZWN0MSA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0MSk7CisgICAgcmVjdDIgPSBVdGlsLm5vcm1hbGl6ZVJlY3QocmVjdDIpOworCisgICAgaWYgKG9yZGVyZWRYWzBdID09PSByZWN0MVswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDJbMF0gfHwgb3JkZXJlZFhbMF0gPT09IHJlY3QyWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MVswXSkgeworICAgICAgcmVzdWx0WzBdID0gb3JkZXJlZFhbMV07CisgICAgICByZXN1bHRbMl0gPSBvcmRlcmVkWFsyXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaWYgKG9yZGVyZWRZWzBdID09PSByZWN0MVsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDJbMV0gfHwgb3JkZXJlZFlbMF0gPT09IHJlY3QyWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MVsxXSkgeworICAgICAgcmVzdWx0WzFdID0gb3JkZXJlZFlbMV07CisgICAgICByZXN1bHRbM10gPSBvcmRlcmVkWVsyXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCit9CisKK2V4cG9ydHMuVXRpbCA9IFV0aWw7Citjb25zdCBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJEOCwgMHgyQzcsIDB4MkM2LCAweDJEOSwgMHgyREQsIDB4MkRCLCAweDJEQSwgMHgyREMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNBLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFFLCAweDIwMUMsIDB4MjAxRCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQSwgMHgyMTIyLCAweEZCMDEsIDB4RkIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdELCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN0UsIDAsIDB4MjBBQ107CisKK2Z1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikgeworICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoLAorICAgICAgICBzdHJCdWYgPSBbXTsKKworICBpZiAoc3RyWzBdID09PSAiXHhGRSIgJiYgc3RyWzFdID09PSAiXHhGRiIpIHsKKyAgICBmb3IgKGxldCBpID0gMjsgaSA8IGxlbmd0aDsgaSArPSAyKSB7CisgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ci5jaGFyQ29kZUF0KGkpIDw8IDggfCBzdHIuY2hhckNvZGVBdChpICsgMSkpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyWzBdID09PSAiXHhGRiIgJiYgc3RyWzFdID09PSAiXHhGRSIpIHsKKyAgICBmb3IgKGxldCBpID0gMjsgaSA8IGxlbmd0aDsgaSArPSAyKSB7CisgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSA8PCA4IHwgc3RyLmNoYXJDb2RlQXQoaSkpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgY29uc3QgY29kZSA9IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlW3N0ci5jaGFyQ29kZUF0KGkpXTsKKyAgICAgIHN0ckJ1Zi5wdXNoKGNvZGUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpIDogc3RyLmNoYXJBdChpKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cikgeworICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXChcKVxcXSkvZywgIlxcJDEiKTsKK30KKworZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cikgeworICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTsKK30KKworZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikgeworICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOworfQorCitmdW5jdGlvbiBpc0Jvb2wodikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJib29sZWFuIjsKK30KKworZnVuY3Rpb24gaXNOdW0odikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJudW1iZXIiOworfQorCitmdW5jdGlvbiBpc1N0cmluZyh2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gInN0cmluZyI7Cit9CisKK2Z1bmN0aW9uIGlzQXJyYXlCdWZmZXIodikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJvYmplY3QiICYmIHYgIT09IG51bGwgJiYgdi5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQ7Cit9CisKK2Z1bmN0aW9uIGlzQXJyYXlFcXVhbChhcnIxLCBhcnIyKSB7CisgIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gYXJyMS5ldmVyeShmdW5jdGlvbiAoZWxlbWVudCwgaW5kZXgpIHsKKyAgICByZXR1cm4gZWxlbWVudCA9PT0gYXJyMltpbmRleF07CisgIH0pOworfQorCitmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpKSkgeworICBjb25zdCBidWZmZXIgPSBbZGF0ZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksIChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIChkYXRlLmdldFVUQ0RhdGUoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIildOworICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOworfQorCitmdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpIHsKKyAgY29uc3QgY2FwYWJpbGl0eSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIGxldCBpc1NldHRsZWQgPSBmYWxzZTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhcGFiaWxpdHksICJzZXR0bGVkIiwgeworICAgIGdldCgpIHsKKyAgICAgIHJldHVybiBpc1NldHRsZWQ7CisgICAgfQorCisgIH0pOworICBjYXBhYmlsaXR5LnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgY2FwYWJpbGl0eS5yZXNvbHZlID0gZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgIGlzU2V0dGxlZCA9IHRydWU7CisgICAgICByZXNvbHZlKGRhdGEpOworICAgIH07CisKKyAgICBjYXBhYmlsaXR5LnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGlzU2V0dGxlZCA9IHRydWU7CisgICAgICByZWplY3QocmVhc29uKTsKKyAgICB9OworICB9KTsKKyAgcmV0dXJuIGNhcGFiaWxpdHk7Cit9CisKK2NvbnN0IGNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTENsb3N1cmUoKSB7CisgIGNvbnN0IGRpZ2l0cyA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7CisgIHJldHVybiBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwoZGF0YSwgY29udGVudFR5cGUsIGZvcmNlRGF0YVNjaGVtYSA9IGZhbHNlKSB7CisgICAgaWYgKCFmb3JjZURhdGFTY2hlbWEgJiYgVVJMLmNyZWF0ZU9iamVjdFVSTCkgeworICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgICB0eXBlOiBjb250ZW50VHlwZQorICAgICAgfSk7CisgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKKyAgICB9CisKKyAgICBsZXQgYnVmZmVyID0gYGRhdGE6JHtjb250ZW50VHlwZX07YmFzZTY0LGA7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHsKKyAgICAgIGNvbnN0IGIxID0gZGF0YVtpXSAmIDB4ZmY7CisgICAgICBjb25zdCBiMiA9IGRhdGFbaSArIDFdICYgMHhmZjsKKyAgICAgIGNvbnN0IGIzID0gZGF0YVtpICsgMl0gJiAweGZmOworICAgICAgY29uc3QgZDEgPSBiMSA+PiAyLAorICAgICAgICAgICAgZDIgPSAoYjEgJiAzKSA8PCA0IHwgYjIgPj4gNDsKKyAgICAgIGNvbnN0IGQzID0gaSArIDEgPCBpaSA/IChiMiAmIDB4ZikgPDwgMiB8IGIzID4+IDYgOiA2NDsKKyAgICAgIGNvbnN0IGQ0ID0gaSArIDIgPCBpaSA/IGIzICYgMHgzZiA6IDY0OworICAgICAgYnVmZmVyICs9IGRpZ2l0c1tkMV0gKyBkaWdpdHNbZDJdICsgZGlnaXRzW2QzXSArIGRpZ2l0c1tkNF07CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfTsKK30oKTsKKworZXhwb3J0cy5jcmVhdGVPYmplY3RVUkwgPSBjcmVhdGVPYmplY3RVUkw7CisKKy8qKiovIH0pLAorLyogMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKwordmFyIF9pc19ub2RlID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKKworOworCisvKioqLyB9KSwKKy8qIDMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5pc05vZGVKUyA9IHZvaWQgMDsKK2NvbnN0IGlzTm9kZUpTID0gdHlwZW9mIHByb2Nlc3MgPT09ICJvYmplY3QiICYmIHByb2Nlc3MgKyAiIiA9PT0gIltvYmplY3QgcHJvY2Vzc10iICYmICFwcm9jZXNzLnZlcnNpb25zLm53ICYmICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSAiYnJvd3NlciIpOworZXhwb3J0cy5pc05vZGVKUyA9IGlzTm9kZUpTOworCisvKioqLyB9KSwKKy8qIDQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5KYmlnMkltYWdlID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX2FyaXRobWV0aWNfZGVjb2RlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7CisKK3ZhciBfY2NpdHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpOworCitjbGFzcyBKYmlnMkVycm9yIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7CisgIGNvbnN0cnVjdG9yKG1zZykgeworICAgIHN1cGVyKGBKQklHMiBlcnJvcjogJHttc2d9YCk7CisgIH0KKworfQorCit2YXIgSmJpZzJJbWFnZSA9IGZ1bmN0aW9uIEpiaWcySW1hZ2VDbG9zdXJlKCkgeworICBmdW5jdGlvbiBDb250ZXh0Q2FjaGUoKSB7fQorCisgIENvbnRleHRDYWNoZS5wcm90b3R5cGUgPSB7CisgICAgZ2V0Q29udGV4dHMoaWQpIHsKKyAgICAgIGlmIChpZCBpbiB0aGlzKSB7CisgICAgICAgIHJldHVybiB0aGlzW2lkXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXNbaWRdID0gbmV3IEludDhBcnJheSgxIDw8IDE2KTsKKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgIHRoaXMuZW5kID0gZW5kOworICB9CisKKyAgRGVjb2RpbmdDb250ZXh0LnByb3RvdHlwZSA9IHsKKyAgICBnZXQgZGVjb2RlcigpIHsKKyAgICAgIHZhciBkZWNvZGVyID0gbmV3IF9hcml0aG1ldGljX2RlY29kZXIuQXJpdGhtZXRpY0RlY29kZXIodGhpcy5kYXRhLCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRlY29kZXIiLCBkZWNvZGVyKTsKKyAgICB9LAorCisgICAgZ2V0IGNvbnRleHRDYWNoZSgpIHsKKyAgICAgIHZhciBjYWNoZSA9IG5ldyBDb250ZXh0Q2FjaGUoKTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiY29udGV4dENhY2hlIiwgY2FjaGUpOworICAgIH0KKworICB9OworCisgIGZ1bmN0aW9uIGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBwcm9jZWR1cmUsIGRlY29kZXIpIHsKKyAgICB2YXIgY29udGV4dHMgPSBjb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMocHJvY2VkdXJlKTsKKyAgICB2YXIgcHJldiA9IDE7CisKKyAgICBmdW5jdGlvbiByZWFkQml0cyhsZW5ndGgpIHsKKyAgICAgIHZhciB2ID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKKyAgICAgICAgcHJldiA9IHByZXYgPCAyNTYgPyBwcmV2IDw8IDEgfCBiaXQgOiAocHJldiA8PCAxIHwgYml0KSAmIDUxMSB8IDI1NjsKKyAgICAgICAgdiA9IHYgPDwgMSB8IGJpdDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHYgPj4+IDA7CisgICAgfQorCisgICAgdmFyIHNpZ24gPSByZWFkQml0cygxKTsKKyAgICB2YXIgdmFsdWUgPSByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMzIpICsgNDQzNiA6IHJlYWRCaXRzKDEyKSArIDM0MCA6IHJlYWRCaXRzKDgpICsgODQgOiByZWFkQml0cyg2KSArIDIwIDogcmVhZEJpdHMoNCkgKyA0IDogcmVhZEJpdHMoMik7CisKKyAgICBpZiAoc2lnbiA9PT0gMCkgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gZWxzZSBpZiAodmFsdWUgPiAwKSB7CisgICAgICByZXR1cm4gLXZhbHVlOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIGNvZGVMZW5ndGgpIHsKKyAgICB2YXIgY29udGV4dHMgPSBjb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIklBSUQiKTsKKyAgICB2YXIgcHJldiA9IDE7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVMZW5ndGg7IGkrKykgeworICAgICAgdmFyIGJpdCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHJldik7CisgICAgICBwcmV2ID0gcHJldiA8PCAxIHwgYml0OworICAgIH0KKworICAgIGlmIChjb2RlTGVuZ3RoIDwgMzEpIHsKKyAgICAgIHJldHVybiBwcmV2ICYgKDEgPDwgY29kZUxlbmd0aCkgLSAxOworICAgIH0KKworICAgIHJldHVybiBwcmV2ICYgMHg3ZmZmZmZmZjsKKyAgfQorCisgIHZhciBTZWdtZW50VHlwZXMgPSBbIlN5bWJvbERpY3Rpb25hcnkiLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVUZXh0UmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYXR0ZXJuRGljdGlvbmFyeSIsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCAiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYWdlSW5mb3JtYXRpb24iLCAiRW5kT2ZQYWdlIiwgIkVuZE9mU3RyaXBlIiwgIkVuZE9mRmlsZSIsICJQcm9maWxlcyIsICJUYWJsZXMiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiRXh0ZW5zaW9uIl07CisgIHZhciBDb2RpbmdUZW1wbGF0ZXMgPSBbW3sKKyAgICB4OiAtMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAyLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtNCwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMywKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAwCisgIH1dLCBbeworICAgIHg6IC0xLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAyLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0zLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IDAKKyAgfV0sIFt7CisgICAgeDogLTEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogMAorICB9XSwgW3sKKyAgICB4OiAtMywKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtNCwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMywKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAwCisgIH1dXTsKKyAgdmFyIFJlZmluZW1lbnRUZW1wbGF0ZXMgPSBbeworICAgIGNvZGluZzogW3sKKyAgICAgIHg6IDAsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMAorICAgIH1dLAorICAgIHJlZmVyZW5jZTogW3sKKyAgICAgIHg6IDAsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IDEKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAxCisgICAgfV0KKyAgfSwgeworICAgIGNvZGluZzogW3sKKyAgICAgIHg6IC0xLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IDAKKyAgICB9XSwKKyAgICByZWZlcmVuY2U6IFt7CisgICAgICB4OiAwLAorICAgICAgeTogLTEKKyAgICB9LCB7CisgICAgICB4OiAtMSwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMCwKKyAgICAgIHk6IDEKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogMQorICAgIH1dCisgIH1dOworICB2YXIgUmV1c2VkQ29udGV4dHMgPSBbMHg5YjI1LCAweDA3OTUsIDB4MDBlNSwgMHgwMTk1XTsKKyAgdmFyIFJlZmluZW1lbnRSZXVzZWRDb250ZXh0cyA9IFsweDAwMjAsIDB4MDAwOF07CisKKyAgZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkgeworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKTsKKyAgICB2YXIgY29udGV4dExhYmVsLAorICAgICAgICBpLAorICAgICAgICBqLAorICAgICAgICBwaXhlbCwKKyAgICAgICAgcm93LAorICAgICAgICByb3cxLAorICAgICAgICByb3cyLAorICAgICAgICBiaXRtYXAgPSBbXTsKKyAgICB2YXIgT0xEX1BJWEVMX01BU0sgPSAweDdiZjc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHJvdyA9IGJpdG1hcFtpXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKyAgICAgIHJvdzEgPSBpIDwgMSA/IHJvdyA6IGJpdG1hcFtpIC0gMV07CisgICAgICByb3cyID0gaSA8IDIgPyByb3cgOiBiaXRtYXBbaSAtIDJdOworICAgICAgY29udGV4dExhYmVsID0gcm93MlswXSA8PCAxMyB8IHJvdzJbMV0gPDwgMTIgfCByb3cyWzJdIDw8IDExIHwgcm93MVswXSA8PCA3IHwgcm93MVsxXSA8PCA2IHwgcm93MVsyXSA8PCA1IHwgcm93MVszXSA8PCA0OworCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICByb3dbal0gPSBwaXhlbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTsKKyAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCAmIE9MRF9QSVhFTF9NQVNLKSA8PCAxIHwgKGogKyAzIDwgd2lkdGggPyByb3cyW2ogKyAzXSA8PCAxMSA6IDApIHwgKGogKyA0IDwgd2lkdGggPyByb3cxW2ogKyA0XSA8PCA0IDogMCkgfCBwaXhlbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlQml0bWFwKG1tciwgd2lkdGgsIGhlaWdodCwgdGVtcGxhdGVJbmRleCwgcHJlZGljdGlvbiwgc2tpcCwgYXQsIGRlY29kaW5nQ29udGV4dCkgeworICAgIGlmIChtbXIpIHsKKyAgICAgIGNvbnN0IGlucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKKyAgICAgIHJldHVybiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAodGVtcGxhdGVJbmRleCA9PT0gMCAmJiAhc2tpcCAmJiAhcHJlZGljdGlvbiAmJiBhdC5sZW5ndGggPT09IDQgJiYgYXRbMF0ueCA9PT0gMyAmJiBhdFswXS55ID09PSAtMSAmJiBhdFsxXS54ID09PSAtMyAmJiBhdFsxXS55ID09PSAtMSAmJiBhdFsyXS54ID09PSAyICYmIGF0WzJdLnkgPT09IC0yICYmIGF0WzNdLnggPT09IC0yICYmIGF0WzNdLnkgPT09IC0yKSB7CisgICAgICByZXR1cm4gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgfQorCisgICAgdmFyIHVzZXNraXAgPSAhIXNraXA7CisgICAgdmFyIHRlbXBsYXRlID0gQ29kaW5nVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvbmNhdChhdCk7CisgICAgdGVtcGxhdGUuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgcmV0dXJuIGEueSAtIGIueSB8fCBhLnggLSBiLng7CisgICAgfSk7CisgICAgdmFyIHRlbXBsYXRlTGVuZ3RoID0gdGVtcGxhdGUubGVuZ3RoOworICAgIHZhciB0ZW1wbGF0ZVggPSBuZXcgSW50OEFycmF5KHRlbXBsYXRlTGVuZ3RoKTsKKyAgICB2YXIgdGVtcGxhdGVZID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CisgICAgdmFyIGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzID0gW107CisgICAgdmFyIHJldXNlTWFzayA9IDAsCisgICAgICAgIG1pblggPSAwLAorICAgICAgICBtYXhYID0gMCwKKyAgICAgICAgbWluWSA9IDA7CisgICAgdmFyIGMsIGs7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgdGVtcGxhdGVYW2tdID0gdGVtcGxhdGVba10ueDsKKyAgICAgIHRlbXBsYXRlWVtrXSA9IHRlbXBsYXRlW2tdLnk7CisgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgdGVtcGxhdGVba10ueCk7CisgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgdGVtcGxhdGVba10ueCk7CisgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgdGVtcGxhdGVba10ueSk7CisKKyAgICAgIGlmIChrIDwgdGVtcGxhdGVMZW5ndGggLSAxICYmIHRlbXBsYXRlW2tdLnkgPT09IHRlbXBsYXRlW2sgKyAxXS55ICYmIHRlbXBsYXRlW2tdLnggPT09IHRlbXBsYXRlW2sgKyAxXS54IC0gMSkgeworICAgICAgICByZXVzZU1hc2sgfD0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMucHVzaChrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMubGVuZ3RoOworICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKKyAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CisgICAgdmFyIGNoYW5naW5nVGVtcGxhdGVCaXQgPSBuZXcgVWludDE2QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKKworICAgIGZvciAoYyA9IDA7IGMgPCBjaGFuZ2luZ0VudHJpZXNMZW5ndGg7IGMrKykgeworICAgICAgayA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzW2NdOworICAgICAgY2hhbmdpbmdUZW1wbGF0ZVhbY10gPSB0ZW1wbGF0ZVtrXS54OworICAgICAgY2hhbmdpbmdUZW1wbGF0ZVlbY10gPSB0ZW1wbGF0ZVtrXS55OworICAgICAgY2hhbmdpbmdUZW1wbGF0ZUJpdFtjXSA9IDEgPDwgdGVtcGxhdGVMZW5ndGggLSAxIC0gazsKKyAgICB9CisKKyAgICB2YXIgc2JiX2xlZnQgPSAtbWluWDsKKyAgICB2YXIgc2JiX3RvcCA9IC1taW5ZOworICAgIHZhciBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7CisgICAgdmFyIHBzZXVkb1BpeGVsQ29udGV4dCA9IFJldXNlZENvbnRleHRzW3RlbXBsYXRlSW5kZXhdOworICAgIHZhciByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKTsKKyAgICB2YXIgbHRwID0gMCwKKyAgICAgICAgaiwKKyAgICAgICAgaTAsCisgICAgICAgIGowLAorICAgICAgICBjb250ZXh0TGFiZWwgPSAwLAorICAgICAgICBiaXQsCisgICAgICAgIHNoaWZ0OworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgaWYgKHByZWRpY3Rpb24pIHsKKyAgICAgICAgdmFyIHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7CisgICAgICAgIGx0cCBePSBzbHRwOworCisgICAgICAgIGlmIChsdHApIHsKKyAgICAgICAgICBiaXRtYXAucHVzaChyb3cpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHJvdyk7CisgICAgICBiaXRtYXAucHVzaChyb3cpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICBpZiAodXNlc2tpcCAmJiBza2lwW2ldW2pdKSB7CisgICAgICAgICAgcm93W2pdID0gMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqID49IHNiYl9sZWZ0ICYmIGogPCBzYmJfcmlnaHQgJiYgaSA+PSBzYmJfdG9wKSB7CisgICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgJiByZXVzZU1hc2s7CisKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIGkwID0gaSArIGNoYW5naW5nVGVtcGxhdGVZW2tdOworICAgICAgICAgICAgajAgPSBqICsgY2hhbmdpbmdUZW1wbGF0ZVhba107CisgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTsKKworICAgICAgICAgICAgaWYgKGJpdCkgeworICAgICAgICAgICAgICBiaXQgPSBjaGFuZ2luZ1RlbXBsYXRlQml0W2tdOworICAgICAgICAgICAgICBjb250ZXh0TGFiZWwgfD0gYml0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSAwOworICAgICAgICAgIHNoaWZ0ID0gdGVtcGxhdGVMZW5ndGggLSAxOworCisgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyssIHNoaWZ0LS0pIHsKKyAgICAgICAgICAgIGowID0gaiArIHRlbXBsYXRlWFtrXTsKKworICAgICAgICAgICAgaWYgKGowID49IDAgJiYgajAgPCB3aWR0aCkgeworICAgICAgICAgICAgICBpMCA9IGkgKyB0ZW1wbGF0ZVlba107CisKKyAgICAgICAgICAgICAgaWYgKGkwID49IDApIHsKKyAgICAgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTsKKworICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKKyAgICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICByb3dbal0gPSBwaXhlbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlUmVmaW5lbWVudCh3aWR0aCwgaGVpZ2h0LCB0ZW1wbGF0ZUluZGV4LCByZWZlcmVuY2VCaXRtYXAsIG9mZnNldFgsIG9mZnNldFksIHByZWRpY3Rpb24sIGF0LCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICB2YXIgY29kaW5nVGVtcGxhdGUgPSBSZWZpbmVtZW50VGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvZGluZzsKKworICAgIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CisgICAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTsKKyAgICB9CisKKyAgICB2YXIgY29kaW5nVGVtcGxhdGVMZW5ndGggPSBjb2RpbmdUZW1wbGF0ZS5sZW5ndGg7CisgICAgdmFyIGNvZGluZ1RlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTsKKyAgICB2YXIgY29kaW5nVGVtcGxhdGVZID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOworICAgIHZhciBrOworCisgICAgZm9yIChrID0gMDsgayA8IGNvZGluZ1RlbXBsYXRlTGVuZ3RoOyBrKyspIHsKKyAgICAgIGNvZGluZ1RlbXBsYXRlWFtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLng7CisgICAgICBjb2RpbmdUZW1wbGF0ZVlba10gPSBjb2RpbmdUZW1wbGF0ZVtrXS55OworICAgIH0KKworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0ucmVmZXJlbmNlOworCisgICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHsKKyAgICAgIHJlZmVyZW5jZVRlbXBsYXRlID0gcmVmZXJlbmNlVGVtcGxhdGUuY29uY2F0KFthdFsxXV0pOworICAgIH0KKworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCA9IHJlZmVyZW5jZVRlbXBsYXRlLmxlbmd0aDsKKyAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpOworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZVkgPSBuZXcgSW50MzJBcnJheShyZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCk7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgcmVmZXJlbmNlVGVtcGxhdGVYW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueDsKKyAgICAgIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLnk7CisgICAgfQorCisgICAgdmFyIHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDsKKyAgICB2YXIgcmVmZXJlbmNlSGVpZ2h0ID0gcmVmZXJlbmNlQml0bWFwLmxlbmd0aDsKKyAgICB2YXIgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmVmaW5lbWVudFJldXNlZENvbnRleHRzW3RlbXBsYXRlSW5kZXhdOworICAgIHZhciBiaXRtYXAgPSBbXTsKKyAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOworICAgIHZhciBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdSIik7CisgICAgdmFyIGx0cCA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBpZiAocHJlZGljdGlvbikgeworICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKKyAgICAgICAgbHRwIF49IHNsdHA7CisKKyAgICAgICAgaWYgKGx0cCkgeworICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJwcmVkaWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgYml0bWFwLnB1c2gocm93KTsKKworICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIHZhciBpMCwgajA7CisgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSAwOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb2RpbmdUZW1wbGF0ZUxlbmd0aDsgaysrKSB7CisgICAgICAgICAgaTAgPSBpICsgY29kaW5nVGVtcGxhdGVZW2tdOworICAgICAgICAgIGowID0gaiArIGNvZGluZ1RlbXBsYXRlWFtrXTsKKworICAgICAgICAgIGlmIChpMCA8IDAgfHwgajAgPCAwIHx8IGowID49IHdpZHRoKSB7CisgICAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxIHwgYml0bWFwW2kwXVtqMF07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICBpMCA9IGkgKyByZWZlcmVuY2VUZW1wbGF0ZVlba10gLSBvZmZzZXRZOworICAgICAgICAgIGowID0gaiArIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSAtIG9mZnNldFg7CisKKyAgICAgICAgICBpZiAoaTAgPCAwIHx8IGkwID49IHJlZmVyZW5jZUhlaWdodCB8fCBqMCA8IDAgfHwgajAgPj0gcmVmZXJlbmNlV2lkdGgpIHsKKyAgICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCByZWZlcmVuY2VCaXRtYXBbaTBdW2owXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgIHJvd1tqXSA9IHBpeGVsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGh1ZmZtYW4sIHJlZmluZW1lbnQsIHN5bWJvbHMsIG51bWJlck9mTmV3U3ltYm9scywgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIHRlbXBsYXRlSW5kZXgsIGF0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGh1ZmZtYW5JbnB1dCkgeworICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIHZhciBuZXdTeW1ib2xzID0gW107CisgICAgdmFyIGN1cnJlbnRIZWlnaHQgPSAwOworICAgIHZhciBzeW1ib2xDb2RlTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzKTsKKyAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOworICAgIHZhciBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOworICAgIGxldCB0YWJsZUIxLCBzeW1ib2xXaWR0aHM7CisKKyAgICBpZiAoaHVmZm1hbikgeworICAgICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CisgICAgICBzeW1ib2xXaWR0aHMgPSBbXTsKKyAgICAgIHN5bWJvbENvZGVMZW5ndGggPSBNYXRoLm1heChzeW1ib2xDb2RlTGVuZ3RoLCAxKTsKKyAgICB9CisKKyAgICB3aGlsZSAobmV3U3ltYm9scy5sZW5ndGggPCBudW1iZXJPZk5ld1N5bWJvbHMpIHsKKyAgICAgIHZhciBkZWx0YUhlaWdodCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFIZWlnaHQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBREgiLCBkZWNvZGVyKTsKKyAgICAgIGN1cnJlbnRIZWlnaHQgKz0gZGVsdGFIZWlnaHQ7CisgICAgICBsZXQgY3VycmVudFdpZHRoID0gMCwKKyAgICAgICAgICB0b3RhbFdpZHRoID0gMDsKKyAgICAgIGNvbnN0IGZpcnN0U3ltYm9sID0gaHVmZm1hbiA/IHN5bWJvbFdpZHRocy5sZW5ndGggOiAwOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgZGVsdGFXaWR0aCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFXaWR0aC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVyIsIGRlY29kZXIpOworCisgICAgICAgIGlmIChkZWx0YVdpZHRoID09PSBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDsKKyAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7CisgICAgICAgIHZhciBiaXRtYXA7CisKKyAgICAgICAgaWYgKHJlZmluZW1lbnQpIHsKKyAgICAgICAgICB2YXIgbnVtYmVyT2ZJbnN0YW5jZXMgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBQUkiLCBkZWNvZGVyKTsKKworICAgICAgICAgIGlmIChudW1iZXJPZkluc3RhbmNlcyA+IDEpIHsKKyAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24oaHVmZm1hbiwgcmVmaW5lbWVudCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCAwLCBudW1iZXJPZkluc3RhbmNlcywgMSwgc3ltYm9scy5jb25jYXQobmV3U3ltYm9scyksIHN5bWJvbENvZGVMZW5ndGgsIDAsIDAsIDEsIDAsIGh1ZmZtYW5UYWJsZXMsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgMCwgaHVmZm1hbklucHV0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFyIHN5bWJvbElkID0gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpOworICAgICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFgiLCBkZWNvZGVyKTsKKyAgICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRZIiwgZGVjb2Rlcik7CisgICAgICAgICAgICB2YXIgc3ltYm9sID0gc3ltYm9sSWQgPCBzeW1ib2xzLmxlbmd0aCA/IHN5bWJvbHNbc3ltYm9sSWRdIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTsKKyAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgc3ltYm9sLCByZHgsIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTsKKyAgICAgICAgfSBlbHNlIGlmIChodWZmbWFuKSB7CisgICAgICAgICAgc3ltYm9sV2lkdGhzLnB1c2goY3VycmVudFdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgdGVtcGxhdGVJbmRleCwgZmFsc2UsIG51bGwsIGF0LCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChiaXRtYXApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChodWZmbWFuICYmICFyZWZpbmVtZW50KSB7CisgICAgICAgIGNvbnN0IGJpdG1hcFNpemUgPSBodWZmbWFuVGFibGVzLnRhYmxlQml0bWFwU2l6ZS5kZWNvZGUoaHVmZm1hbklucHV0KTsKKyAgICAgICAgaHVmZm1hbklucHV0LmJ5dGVBbGlnbigpOworICAgICAgICBsZXQgY29sbGVjdGl2ZUJpdG1hcDsKKworICAgICAgICBpZiAoYml0bWFwU2l6ZSA9PT0gMCkgeworICAgICAgICAgIGNvbGxlY3RpdmVCaXRtYXAgPSByZWFkVW5jb21wcmVzc2VkQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kOworICAgICAgICAgIGNvbnN0IGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7CisgICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDsKKyAgICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCwgZmFsc2UpOworICAgICAgICAgIGh1ZmZtYW5JbnB1dC5lbmQgPSBvcmlnaW5hbEVuZDsKKyAgICAgICAgICBodWZmbWFuSW5wdXQucG9zaXRpb24gPSBiaXRtYXBFbmQ7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkID0gc3ltYm9sV2lkdGhzLmxlbmd0aDsKKworICAgICAgICBpZiAoZmlyc3RTeW1ib2wgPT09IG51bWJlck9mU3ltYm9sc0RlY29kZWQgLSAxKSB7CisgICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGNvbGxlY3RpdmVCaXRtYXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxldCBpLAorICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICB4TWluID0gMCwKKyAgICAgICAgICAgICAgeE1heCwKKyAgICAgICAgICAgICAgYml0bWFwV2lkdGgsCisgICAgICAgICAgICAgIHN5bWJvbEJpdG1hcDsKKworICAgICAgICAgIGZvciAoaSA9IGZpcnN0U3ltYm9sOyBpIDwgbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZDsgaSsrKSB7CisgICAgICAgICAgICBiaXRtYXBXaWR0aCA9IHN5bWJvbFdpZHRoc1tpXTsKKyAgICAgICAgICAgIHhNYXggPSB4TWluICsgYml0bWFwV2lkdGg7CisgICAgICAgICAgICBzeW1ib2xCaXRtYXAgPSBbXTsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV3U3ltYm9scy5wdXNoKHN5bWJvbEJpdG1hcCk7CisgICAgICAgICAgICB4TWluID0geE1heDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZXhwb3J0ZWRTeW1ib2xzID0gW107CisgICAgdmFyIGZsYWdzID0gW10sCisgICAgICAgIGN1cnJlbnRGbGFnID0gZmFsc2U7CisgICAgdmFyIHRvdGFsU3ltYm9sc0xlbmd0aCA9IHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzOworCisgICAgd2hpbGUgKGZsYWdzLmxlbmd0aCA8IHRvdGFsU3ltYm9sc0xlbmd0aCkgeworICAgICAgdmFyIHJ1bkxlbmd0aCA9IGh1ZmZtYW4gPyB0YWJsZUIxLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUVYIiwgZGVjb2Rlcik7CisKKyAgICAgIHdoaWxlIChydW5MZW5ndGgtLSkgeworICAgICAgICBmbGFncy5wdXNoKGN1cnJlbnRGbGFnKTsKKyAgICAgIH0KKworICAgICAgY3VycmVudEZsYWcgPSAhY3VycmVudEZsYWc7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3ltYm9scy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBpZiAoZmxhZ3NbaV0pIHsKKyAgICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2goc3ltYm9sc1tpXSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1iZXJPZk5ld1N5bWJvbHM7IGkrKywgaisrKSB7CisgICAgICBpZiAoZmxhZ3NbaV0pIHsKKyAgICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2gobmV3U3ltYm9sc1tqXSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGV4cG9ydGVkU3ltYm9sczsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVRleHRSZWdpb24oaHVmZm1hbiwgcmVmaW5lbWVudCwgd2lkdGgsIGhlaWdodCwgZGVmYXVsdFBpeGVsVmFsdWUsIG51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCBzdHJpcFNpemUsIGlucHV0U3ltYm9scywgc3ltYm9sQ29kZUxlbmd0aCwgdHJhbnNwb3NlZCwgZHNPZmZzZXQsIHJlZmVyZW5jZUNvcm5lciwgY29tYmluYXRpb25PcGVyYXRvciwgaHVmZm1hblRhYmxlcywgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBsb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCkgeworICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBpLCByb3c7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKworICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgIHJvd1tqXSA9IGRlZmF1bHRQaXhlbFZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisgICAgfQorCisgICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKKyAgICB2YXIgY29udGV4dENhY2hlID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZTsKKyAgICB2YXIgc3RyaXBUID0gaHVmZm1hbiA/IC1odWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpIDogLWRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVCIsIGRlY29kZXIpOworICAgIHZhciBmaXJzdFMgPSAwOworICAgIGkgPSAwOworCisgICAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykgeworICAgICAgdmFyIGRlbHRhVCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURUIiwgZGVjb2Rlcik7CisgICAgICBzdHJpcFQgKz0gZGVsdGFUOworICAgICAgdmFyIGRlbHRhRmlyc3RTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVGaXJzdFMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRlMiLCBkZWNvZGVyKTsKKyAgICAgIGZpcnN0UyArPSBkZWx0YUZpcnN0UzsKKyAgICAgIHZhciBjdXJyZW50UyA9IGZpcnN0UzsKKworICAgICAgZG8geworICAgICAgICBsZXQgY3VycmVudFQgPSAwOworCisgICAgICAgIGlmIChzdHJpcFNpemUgPiAxKSB7CisgICAgICAgICAgY3VycmVudFQgPSBodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBSVQiLCBkZWNvZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0ID0gc3RyaXBTaXplICogc3RyaXBUICsgY3VycmVudFQ7CisgICAgICAgIHZhciBzeW1ib2xJZCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnN5bWJvbElEVGFibGUuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2Rlciwgc3ltYm9sQ29kZUxlbmd0aCk7CisgICAgICAgIHZhciBhcHBseVJlZmluZW1lbnQgPSByZWZpbmVtZW50ICYmIChodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXQoKSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSSSIsIGRlY29kZXIpKTsKKyAgICAgICAgdmFyIHN5bWJvbEJpdG1hcCA9IGlucHV0U3ltYm9sc1tzeW1ib2xJZF07CisgICAgICAgIHZhciBzeW1ib2xXaWR0aCA9IHN5bWJvbEJpdG1hcFswXS5sZW5ndGg7CisgICAgICAgIHZhciBzeW1ib2xIZWlnaHQgPSBzeW1ib2xCaXRtYXAubGVuZ3RoOworCisgICAgICAgIGlmIChhcHBseVJlZmluZW1lbnQpIHsKKyAgICAgICAgICB2YXIgcmR3ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEVyIsIGRlY29kZXIpOworICAgICAgICAgIHZhciByZGggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRIIiwgZGVjb2Rlcik7CisgICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFgiLCBkZWNvZGVyKTsKKyAgICAgICAgICB2YXIgcmR5ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWSIsIGRlY29kZXIpOworICAgICAgICAgIHN5bWJvbFdpZHRoICs9IHJkdzsKKyAgICAgICAgICBzeW1ib2xIZWlnaHQgKz0gcmRoOworICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoc3ltYm9sV2lkdGgsIHN5bWJvbEhlaWdodCwgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHN5bWJvbEJpdG1hcCwgKHJkdyA+PiAxKSArIHJkeCwgKHJkaCA+PiAxKSArIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpOworICAgICAgICB2YXIgb2Zmc2V0UyA9IGN1cnJlbnRTIC0gKHJlZmVyZW5jZUNvcm5lciAmIDIgPyBzeW1ib2xXaWR0aCAtIDEgOiAwKTsKKyAgICAgICAgdmFyIHMyLCB0Miwgc3ltYm9sUm93OworCisgICAgICAgIGlmICh0cmFuc3Bvc2VkKSB7CisgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sSGVpZ2h0OyBzMisrKSB7CisgICAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0UyArIHMyXTsKKworICAgICAgICAgICAgaWYgKCFyb3cpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFtzMl07CisgICAgICAgICAgICB2YXIgbWF4V2lkdGggPSBNYXRoLm1pbih3aWR0aCAtIG9mZnNldFQsIHN5bWJvbFdpZHRoKTsKKworICAgICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykgeworICAgICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gfD0gc3ltYm9sUm93W3QyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHsKKyAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIF49IHN5bWJvbFJvd1t0Ml07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudFMgKz0gc3ltYm9sSGVpZ2h0IC0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBzeW1ib2xIZWlnaHQ7IHQyKyspIHsKKyAgICAgICAgICAgIHJvdyA9IGJpdG1hcFtvZmZzZXRUICsgdDJdOworCisgICAgICAgICAgICBpZiAoIXJvdykgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3QyXTsKKworICAgICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xXaWR0aDsgczIrKykgeworICAgICAgICAgICAgICAgICAgcm93W29mZnNldFMgKyBzMl0gfD0gc3ltYm9sUm93W3MyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sV2lkdGg7IHMyKyspIHsKKyAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRTICsgczJdIF49IHN5bWJvbFJvd1tzMl07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudFMgKz0gc3ltYm9sV2lkdGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgaSsrOworICAgICAgICB2YXIgZGVsdGFTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFMiLCBkZWNvZGVyKTsKKworICAgICAgICBpZiAoZGVsdGFTID09PSBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50UyArPSBkZWx0YVMgKyBkc09mZnNldDsKKyAgICAgIH0gd2hpbGUgKHRydWUpOworICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShtbXIsIHBhdHRlcm5XaWR0aCwgcGF0dGVybkhlaWdodCwgbWF4UGF0dGVybkluZGV4LCB0ZW1wbGF0ZSwgZGVjb2RpbmdDb250ZXh0KSB7CisgICAgY29uc3QgYXQgPSBbXTsKKworICAgIGlmICghbW1yKSB7CisgICAgICBhdC5wdXNoKHsKKyAgICAgICAgeDogLXBhdHRlcm5XaWR0aCwKKyAgICAgICAgeTogMAorICAgICAgfSk7CisKKyAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gMCkgeworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAtMywKKyAgICAgICAgICB5OiAtMQorICAgICAgICB9KTsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogMiwKKyAgICAgICAgICB5OiAtMgorICAgICAgICB9KTsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogLTIsCisgICAgICAgICAgeTogLTIKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgY29sbGVjdGl2ZVdpZHRoID0gKG1heFBhdHRlcm5JbmRleCArIDEpICogcGF0dGVybldpZHRoOworICAgIGNvbnN0IGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVCaXRtYXAobW1yLCBjb2xsZWN0aXZlV2lkdGgsIHBhdHRlcm5IZWlnaHQsIHRlbXBsYXRlLCBmYWxzZSwgbnVsbCwgYXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgY29uc3QgcGF0dGVybnMgPSBbXTsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1heFBhdHRlcm5JbmRleDsgaSsrKSB7CisgICAgICBjb25zdCBwYXR0ZXJuQml0bWFwID0gW107CisgICAgICBjb25zdCB4TWluID0gcGF0dGVybldpZHRoICogaTsKKyAgICAgIGNvbnN0IHhNYXggPSB4TWluICsgcGF0dGVybldpZHRoOworCisgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHBhdHRlcm5IZWlnaHQ7IHkrKykgeworICAgICAgICBwYXR0ZXJuQml0bWFwLnB1c2goY29sbGVjdGl2ZUJpdG1hcFt5XS5zdWJhcnJheSh4TWluLCB4TWF4KSk7CisgICAgICB9CisKKyAgICAgIHBhdHRlcm5zLnB1c2gocGF0dGVybkJpdG1hcCk7CisgICAgfQorCisgICAgcmV0dXJuIHBhdHRlcm5zOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24obW1yLCBwYXR0ZXJucywgdGVtcGxhdGUsIHJlZ2lvbldpZHRoLCByZWdpb25IZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBlbmFibGVTa2lwLCBjb21iaW5hdGlvbk9wZXJhdG9yLCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIGdyaWRPZmZzZXRYLCBncmlkT2Zmc2V0WSwgZ3JpZFZlY3RvclgsIGdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICBjb25zdCBza2lwID0gbnVsbDsKKworICAgIGlmIChlbmFibGVTa2lwKSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigic2tpcCBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgaWYgKGNvbWJpbmF0aW9uT3BlcmF0b3IgIT09IDApIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJvcGVyYXRvciAiICsgY29tYmluYXRpb25PcGVyYXRvciArICIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb24iKTsKKyAgICB9CisKKyAgICBjb25zdCByZWdpb25CaXRtYXAgPSBbXTsKKyAgICBsZXQgaSwgaiwgcm93OworCisgICAgZm9yIChpID0gMDsgaSA8IHJlZ2lvbkhlaWdodDsgaSsrKSB7CisgICAgICByb3cgPSBuZXcgVWludDhBcnJheShyZWdpb25XaWR0aCk7CisKKyAgICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVnaW9uV2lkdGg7IGorKykgeworICAgICAgICAgIHJvd1tqXSA9IGRlZmF1bHRQaXhlbFZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7CisgICAgfQorCisgICAgY29uc3QgbnVtYmVyT2ZQYXR0ZXJucyA9IHBhdHRlcm5zLmxlbmd0aDsKKyAgICBjb25zdCBwYXR0ZXJuMCA9IHBhdHRlcm5zWzBdOworICAgIGNvbnN0IHBhdHRlcm5XaWR0aCA9IHBhdHRlcm4wWzBdLmxlbmd0aCwKKyAgICAgICAgICBwYXR0ZXJuSGVpZ2h0ID0gcGF0dGVybjAubGVuZ3RoOworICAgIGNvbnN0IGJpdHNQZXJWYWx1ZSA9ICgwLCBfY29yZV91dGlscy5sb2cyKShudW1iZXJPZlBhdHRlcm5zKTsKKyAgICBjb25zdCBhdCA9IFtdOworCisgICAgaWYgKCFtbXIpIHsKKyAgICAgIGF0LnB1c2goeworICAgICAgICB4OiB0ZW1wbGF0ZSA8PSAxID8gMyA6IDIsCisgICAgICAgIHk6IC0xCisgICAgICB9KTsKKworICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IC0zLAorICAgICAgICAgIHk6IC0xCisgICAgICAgIH0pOworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAyLAorICAgICAgICAgIHk6IC0yCisgICAgICAgIH0pOworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAtMiwKKyAgICAgICAgICB5OiAtMgorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBncmF5U2NhbGVCaXRQbGFuZXMgPSBbXTsKKyAgICBsZXQgbW1ySW5wdXQsIGJpdG1hcDsKKworICAgIGlmIChtbXIpIHsKKyAgICAgIG1tcklucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBiaXRzUGVyVmFsdWUgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgaWYgKG1tcikgeworICAgICAgICBiaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAobW1ySW5wdXQsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgZ3JheVNjYWxlQml0UGxhbmVzW2ldID0gYml0bWFwOworICAgIH0KKworICAgIGxldCBtZywgbmcsIGJpdCwgcGF0dGVybkluZGV4LCBwYXR0ZXJuQml0bWFwLCB4LCB5LCBwYXR0ZXJuUm93LCByZWdpb25Sb3c7CisKKyAgICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7CisgICAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHsKKyAgICAgICAgYml0ID0gMDsKKyAgICAgICAgcGF0dGVybkluZGV4ID0gMDsKKworICAgICAgICBmb3IgKGogPSBiaXRzUGVyVmFsdWUgLSAxOyBqID49IDA7IGotLSkgeworICAgICAgICAgIGJpdCA9IGdyYXlTY2FsZUJpdFBsYW5lc1tqXVttZ11bbmddIF4gYml0OworICAgICAgICAgIHBhdHRlcm5JbmRleCB8PSBiaXQgPDwgajsKKyAgICAgICAgfQorCisgICAgICAgIHBhdHRlcm5CaXRtYXAgPSBwYXR0ZXJuc1twYXR0ZXJuSW5kZXhdOworICAgICAgICB4ID0gZ3JpZE9mZnNldFggKyBtZyAqIGdyaWRWZWN0b3JZICsgbmcgKiBncmlkVmVjdG9yWCA+PiA4OworICAgICAgICB5ID0gZ3JpZE9mZnNldFkgKyBtZyAqIGdyaWRWZWN0b3JYIC0gbmcgKiBncmlkVmVjdG9yWSA+PiA4OworCisgICAgICAgIGlmICh4ID49IDAgJiYgeCArIHBhdHRlcm5XaWR0aCA8PSByZWdpb25XaWR0aCAmJiB5ID49IDAgJiYgeSArIHBhdHRlcm5IZWlnaHQgPD0gcmVnaW9uSGVpZ2h0KSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdHRlcm5IZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgcmVnaW9uUm93ID0gcmVnaW9uQml0bWFwW3kgKyBpXTsKKyAgICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0dGVybldpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgcmVnaW9uUm93W3ggKyBqXSB8PSBwYXR0ZXJuUm93W2pdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsZXQgcmVnaW9uWCwgcmVnaW9uWTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTsKKworICAgICAgICAgICAgaWYgKHJlZ2lvblkgPCAwIHx8IHJlZ2lvblkgPj0gcmVnaW9uSGVpZ2h0KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWdpb25Sb3cgPSByZWdpb25CaXRtYXBbcmVnaW9uWV07CisgICAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CisgICAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajsKKworICAgICAgICAgICAgICBpZiAocmVnaW9uWCA+PSAwICYmIHJlZ2lvblggPCByZWdpb25XaWR0aCkgeworICAgICAgICAgICAgICAgIHJlZ2lvblJvd1tyZWdpb25YXSB8PSBwYXR0ZXJuUm93W2pdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlZ2lvbkJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHN0YXJ0KSB7CisgICAgdmFyIHNlZ21lbnRIZWFkZXIgPSB7fTsKKyAgICBzZWdtZW50SGVhZGVyLm51bWJlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCk7CisgICAgdmFyIGZsYWdzID0gZGF0YVtzdGFydCArIDRdOworICAgIHZhciBzZWdtZW50VHlwZSA9IGZsYWdzICYgMHgzZjsKKworICAgIGlmICghU2VnbWVudFR5cGVzW3NlZ21lbnRUeXBlXSkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgc2VnbWVudCB0eXBlOiAiICsgc2VnbWVudFR5cGUpOworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIudHlwZSA9IHNlZ21lbnRUeXBlOworICAgIHNlZ21lbnRIZWFkZXIudHlwZU5hbWUgPSBTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdOworICAgIHNlZ21lbnRIZWFkZXIuZGVmZXJyZWROb25SZXRhaW4gPSAhIShmbGFncyAmIDB4ODApOworICAgIHZhciBwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUgPSAhIShmbGFncyAmIDB4NDApOworICAgIHZhciByZWZlcnJlZEZsYWdzID0gZGF0YVtzdGFydCArIDVdOworICAgIHZhciByZWZlcnJlZFRvQ291bnQgPSByZWZlcnJlZEZsYWdzID4+IDUgJiA3OworICAgIHZhciByZXRhaW5CaXRzID0gW3JlZmVycmVkRmxhZ3MgJiAzMV07CisgICAgdmFyIHBvc2l0aW9uID0gc3RhcnQgKyA2OworCisgICAgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDcpIHsKKyAgICAgIHJlZmVycmVkVG9Db3VudCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiAtIDEpICYgMHgxZmZmZmZmZjsKKyAgICAgIHBvc2l0aW9uICs9IDM7CisgICAgICB2YXIgYnl0ZXMgPSByZWZlcnJlZFRvQ291bnQgKyA3ID4+IDM7CisgICAgICByZXRhaW5CaXRzWzBdID0gZGF0YVtwb3NpdGlvbisrXTsKKworICAgICAgd2hpbGUgKC0tYnl0ZXMgPiAwKSB7CisgICAgICAgIHJldGFpbkJpdHMucHVzaChkYXRhW3Bvc2l0aW9uKytdKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDUgfHwgcmVmZXJyZWRGbGFncyA9PT0gNikgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgcmVmZXJyZWQtdG8gZmxhZ3MiKTsKKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLnJldGFpbkJpdHMgPSByZXRhaW5CaXRzOworICAgIGxldCByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSA0OworCisgICAgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDI1NikgeworICAgICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMTsKKyAgICB9IGVsc2UgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDY1NTM2KSB7CisgICAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAyOworICAgIH0KKworICAgIHZhciByZWZlcnJlZFRvID0gW107CisgICAgdmFyIGksIGlpOworCisgICAgZm9yIChpID0gMDsgaSA8IHJlZmVycmVkVG9Db3VudDsgaSsrKSB7CisgICAgICBsZXQgbnVtYmVyOworCisgICAgICBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAxKSB7CisgICAgICAgIG51bWJlciA9IGRhdGFbcG9zaXRpb25dOworICAgICAgfSBlbHNlIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDIpIHsKKyAgICAgICAgbnVtYmVyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG51bWJlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICB9CisKKyAgICAgIHJlZmVycmVkVG8ucHVzaChudW1iZXIpOworICAgICAgcG9zaXRpb24gKz0gcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplOworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIucmVmZXJyZWRUbyA9IHJlZmVycmVkVG87CisKKyAgICBpZiAoIXBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSkgeworICAgICAgc2VnbWVudEhlYWRlci5wYWdlQXNzb2NpYXRpb24gPSBkYXRhW3Bvc2l0aW9uKytdOworICAgIH0gZWxzZSB7CisgICAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICBwb3NpdGlvbiArPSA0OworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICBwb3NpdGlvbiArPSA0OworCisgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CisgICAgICBpZiAoc2VnbWVudFR5cGUgPT09IDM4KSB7CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uSW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aF07CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uTW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpOworICAgICAgICB2YXIgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7CisgICAgICAgIHZhciBzZWFyY2hQYXR0ZXJuID0gbmV3IFVpbnQ4QXJyYXkoc2VhcmNoUGF0dGVybkxlbmd0aCk7CisKKyAgICAgICAgaWYgKCFnZW5lcmljUmVnaW9uTW1yKSB7CisgICAgICAgICAgc2VhcmNoUGF0dGVyblswXSA9IDB4ZmY7CisgICAgICAgICAgc2VhcmNoUGF0dGVyblsxXSA9IDB4YWM7CisgICAgICAgIH0KKworICAgICAgICBzZWFyY2hQYXR0ZXJuWzJdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+PiAyNCAmIDB4ZmY7CisgICAgICAgIHNlYXJjaFBhdHRlcm5bM10gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgPj4gMTYgJiAweGZmOworICAgICAgICBzZWFyY2hQYXR0ZXJuWzRdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDggJiAweGZmOworICAgICAgICBzZWFyY2hQYXR0ZXJuWzVdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ICYgMHhmZjsKKworICAgICAgICBmb3IgKGkgPSBwb3NpdGlvbiwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICB2YXIgaiA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoaiA8IHNlYXJjaFBhdHRlcm5MZW5ndGggJiYgc2VhcmNoUGF0dGVybltqXSA9PT0gZGF0YVtpICsgal0pIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaiA9PT0gc2VhcmNoUGF0dGVybkxlbmd0aCkgeworICAgICAgICAgICAgc2VnbWVudEhlYWRlci5sZW5ndGggPSBpICsgc2VhcmNoUGF0dGVybkxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikgeworICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzZWdtZW50IGVuZCB3YXMgbm90IGZvdW5kIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGgiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzZWdtZW50SGVhZGVyLmhlYWRlckVuZCA9IHBvc2l0aW9uOworICAgIHJldHVybiBzZWdtZW50SGVhZGVyOworICB9CisKKyAgZnVuY3Rpb24gcmVhZFNlZ21lbnRzKGhlYWRlciwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHZhciBzZWdtZW50cyA9IFtdOworICAgIHZhciBwb3NpdGlvbiA9IHN0YXJ0OworCisgICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7CisgICAgICB2YXIgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7CisgICAgICB2YXIgc2VnbWVudCA9IHsKKyAgICAgICAgaGVhZGVyOiBzZWdtZW50SGVhZGVyLAorICAgICAgICBkYXRhCisgICAgICB9OworCisgICAgICBpZiAoIWhlYWRlci5yYW5kb21BY2Nlc3MpIHsKKyAgICAgICAgc2VnbWVudC5zdGFydCA9IHBvc2l0aW9uOworICAgICAgICBwb3NpdGlvbiArPSBzZWdtZW50SGVhZGVyLmxlbmd0aDsKKyAgICAgICAgc2VnbWVudC5lbmQgPSBwb3NpdGlvbjsKKyAgICAgIH0KKworICAgICAgc2VnbWVudHMucHVzaChzZWdtZW50KTsKKworICAgICAgaWYgKHNlZ21lbnRIZWFkZXIudHlwZSA9PT0gNTEpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhlYWRlci5yYW5kb21BY2Nlc3MpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgc2VnbWVudHNbaV0uc3RhcnQgPSBwb3NpdGlvbjsKKyAgICAgICAgcG9zaXRpb24gKz0gc2VnbWVudHNbaV0uaGVhZGVyLmxlbmd0aDsKKyAgICAgICAgc2VnbWVudHNbaV0uZW5kID0gcG9zaXRpb247CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNlZ21lbnRzOworICB9CisKKyAgZnVuY3Rpb24gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBzdGFydCkgeworICAgIHJldHVybiB7CisgICAgICB3aWR0aDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0KSwKKyAgICAgIGhlaWdodDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgNCksCisgICAgICB4OiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyA4KSwKKyAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDEyKSwKKyAgICAgIGNvbWJpbmF0aW9uT3BlcmF0b3I6IGRhdGFbc3RhcnQgKyAxNl0gJiA3CisgICAgfTsKKyAgfQorCisgIHZhciBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3OworCisgIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHNlZ21lbnQsIHZpc2l0b3IpIHsKKyAgICB2YXIgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7CisgICAgdmFyIGRhdGEgPSBzZWdtZW50LmRhdGEsCisgICAgICAgIHBvc2l0aW9uID0gc2VnbWVudC5zdGFydCwKKyAgICAgICAgZW5kID0gc2VnbWVudC5lbmQ7CisgICAgdmFyIGFyZ3MsIGF0LCBpLCBhdExlbmd0aDsKKworICAgIHN3aXRjaCAoaGVhZGVyLnR5cGUpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdmFyIGRpY3Rpb25hcnkgPSB7fTsKKyAgICAgICAgdmFyIGRpY3Rpb25hcnlGbGFncyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpOworICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTsKKyAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiAyICYgMzsKKyAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA0ICYgMzsKKyAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNiAmIDE7CisgICAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA3ICYgMTsKKyAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDI1Nik7CisgICAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkID0gISEoZGljdGlvbmFyeUZsYWdzICYgNTEyKTsKKyAgICAgICAgZGljdGlvbmFyeS50ZW1wbGF0ZSA9IGRpY3Rpb25hcnlGbGFncyA+PiAxMCAmIDM7CisgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlID0gZGljdGlvbmFyeUZsYWdzID4+IDEyICYgMTsKKyAgICAgICAgcG9zaXRpb24gKz0gMjsKKworICAgICAgICBpZiAoIWRpY3Rpb25hcnkuaHVmZm1hbikgeworICAgICAgICAgIGF0TGVuZ3RoID0gZGljdGlvbmFyeS50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBkaWN0aW9uYXJ5LmF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGljdGlvbmFyeS5yZWZpbmVtZW50ICYmICFkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSkgeworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudEF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBhcmdzID0gW2RpY3Rpb25hcnksIGhlYWRlci5udW1iZXIsIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNjoKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgdmFyIHRleHRSZWdpb24gPSB7fTsKKyAgICAgICAgdGV4dFJlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoOworICAgICAgICB2YXIgdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbiA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKKyAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50ID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDIpOworICAgICAgICB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMiAmIDM7CisgICAgICAgIHRleHRSZWdpb24uc3RyaXBTaXplID0gMSA8PCB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZTsKKyAgICAgICAgdGV4dFJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDQgJiAzOworICAgICAgICB0ZXh0UmVnaW9uLnRyYW5zcG9zZWQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgNjQpOworICAgICAgICB0ZXh0UmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDcgJiAzOworICAgICAgICB0ZXh0UmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA5ICYgMTsKKyAgICAgICAgdGV4dFJlZ2lvbi5kc09mZnNldCA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPDwgMTcgPj4gMjc7CisgICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiAxNSAmIDE7CisKKyAgICAgICAgaWYgKHRleHRSZWdpb24uaHVmZm1hbikgeworICAgICAgICAgIHZhciB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkZTID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFMgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDIgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRUID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA0ICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFcgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDYgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRESCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gOCAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERYID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMCAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERZID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMiAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudFNpemVTZWxlY3RvciA9ICEhKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAweDQwMDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCAmJiAhdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUpIHsKKyAgICAgICAgICBhdCA9IFtdOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRBdCA9IGF0OworICAgICAgICB9CisKKyAgICAgICAgdGV4dFJlZ2lvbi5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGFyZ3MgPSBbdGV4dFJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxNjoKKyAgICAgICAgY29uc3QgcGF0dGVybkRpY3Rpb25hcnkgPSB7fTsKKyAgICAgICAgY29uc3QgcGF0dGVybkRpY3Rpb25hcnlGbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1tciA9ICEhKHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgJiAxKTsKKyAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkudGVtcGxhdGUgPSBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID4+IDEgJiAzOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuV2lkdGggPSBkYXRhW3Bvc2l0aW9uKytdOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0ID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgYXJncyA9IFtwYXR0ZXJuRGljdGlvbmFyeSwgaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDIyOgorICAgICAgY2FzZSAyMzoKKyAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb24gPSB7fTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKKyAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb25GbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLm1tciA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiAxKTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24udGVtcGxhdGUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDEgJiAzOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5lbmFibGVTa2lwID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDgpOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiA0ICYgNzsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDcgJiAxOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkV2lkdGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkSGVpZ2h0ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFkgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFZlY3RvclggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkVmVjdG9yWSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgIGFyZ3MgPSBbaGFsZnRvbmVSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzg6CisgICAgICBjYXNlIDM5OgorICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvbiA9IHt9OworICAgICAgICBnZW5lcmljUmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgZ2VuZXJpY1JlZ2lvbi5tbXIgPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CisgICAgICAgIGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPSBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID4+IDEgJiAzOworICAgICAgICBnZW5lcmljUmVnaW9uLnByZWRpY3Rpb24gPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgOCk7CisKKyAgICAgICAgaWYgKCFnZW5lcmljUmVnaW9uLm1tcikgeworICAgICAgICAgIGF0TGVuZ3RoID0gZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnZW5lcmljUmVnaW9uLmF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICBhcmdzID0gW2dlbmVyaWNSZWdpb24sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0ODoKKyAgICAgICAgdmFyIHBhZ2VJbmZvID0geworICAgICAgICAgIHdpZHRoOiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pLAorICAgICAgICAgIGhlaWdodDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCksCisgICAgICAgICAgcmVzb2x1dGlvblg6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDgpLAorICAgICAgICAgIHJlc29sdXRpb25ZOiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAxMikKKyAgICAgICAgfTsKKworICAgICAgICBpZiAocGFnZUluZm8uaGVpZ2h0ID09PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgZGVsZXRlIHBhZ2VJbmZvLmhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwYWdlU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIDE2XTsKKyAgICAgICAgKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uICsgMTcpOworICAgICAgICBwYWdlSW5mby5sb3NzbGVzcyA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAxKTsKKyAgICAgICAgcGFnZUluZm8ucmVmaW5lbWVudCA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAyKTsKKyAgICAgICAgcGFnZUluZm8uZGVmYXVsdFBpeGVsVmFsdWUgPSBwYWdlU2VnbWVudEZsYWdzID4+IDIgJiAxOworICAgICAgICBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yID0gcGFnZVNlZ21lbnRGbGFncyA+PiAzICYgMzsKKyAgICAgICAgcGFnZUluZm8ucmVxdWlyZXNCdWZmZXIgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMzIpOworICAgICAgICBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGUgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgNjQpOworICAgICAgICBhcmdzID0gW3BhZ2VJbmZvXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDk6CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDUwOgorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA1MToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNTM6CisgICAgICAgIGFyZ3MgPSBbaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDYyOgorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYHNlZ21lbnQgdHlwZSAke2hlYWRlci50eXBlTmFtZX0oJHtoZWFkZXIudHlwZX0pYCArICIgaXMgbm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgdmFyIGNhbGxiYWNrTmFtZSA9ICJvbiIgKyBoZWFkZXIudHlwZU5hbWU7CisKKyAgICBpZiAoY2FsbGJhY2tOYW1lIGluIHZpc2l0b3IpIHsKKyAgICAgIHZpc2l0b3JbY2FsbGJhY2tOYW1lXS5hcHBseSh2aXNpdG9yLCBhcmdzKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBwcm9jZXNzU2VnbWVudChzZWdtZW50c1tpXSwgdmlzaXRvcik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpIHsKKyAgICB2YXIgdmlzaXRvciA9IG5ldyBTaW1wbGVTZWdtZW50VmlzaXRvcigpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjaHVuayA9IGNodW5rc1tpXTsKKyAgICAgIHZhciBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyh7fSwgY2h1bmsuZGF0YSwgY2h1bmsuc3RhcnQsIGNodW5rLmVuZCk7CisgICAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpOworICAgIH0KKworICAgIHJldHVybiB2aXNpdG9yLmJ1ZmZlcjsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlSmJpZzIoZGF0YSkgeworICAgIGNvbnN0IGVuZCA9IGRhdGEubGVuZ3RoOworICAgIGxldCBwb3NpdGlvbiA9IDA7CisKKyAgICBpZiAoZGF0YVtwb3NpdGlvbl0gIT09IDB4OTcgfHwgZGF0YVtwb3NpdGlvbiArIDFdICE9PSAweDRhIHx8IGRhdGFbcG9zaXRpb24gKyAyXSAhPT0gMHg0MiB8fCBkYXRhW3Bvc2l0aW9uICsgM10gIT09IDB4MzIgfHwgZGF0YVtwb3NpdGlvbiArIDRdICE9PSAweDBkIHx8IGRhdGFbcG9zaXRpb24gKyA1XSAhPT0gMHgwYSB8fCBkYXRhW3Bvc2l0aW9uICsgNl0gIT09IDB4MWEgfHwgZGF0YVtwb3NpdGlvbiArIDddICE9PSAweDBhKSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicGFyc2VKYmlnMiAtIGludmFsaWQgaGVhZGVyLiIpOworICAgIH0KKworICAgIGNvbnN0IGhlYWRlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgcG9zaXRpb24gKz0gODsKKyAgICBjb25zdCBmbGFncyA9IGRhdGFbcG9zaXRpb24rK107CisgICAgaGVhZGVyLnJhbmRvbUFjY2VzcyA9ICEoZmxhZ3MgJiAxKTsKKworICAgIGlmICghKGZsYWdzICYgMikpIHsKKyAgICAgIGhlYWRlci5udW1iZXJPZlBhZ2VzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgfQorCisgICAgY29uc3Qgc2VnbWVudHMgPSByZWFkU2VnbWVudHMoaGVhZGVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kKTsKKyAgICBjb25zdCB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7CisgICAgcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKTsKKyAgICBjb25zdCB7CisgICAgICB3aWR0aCwKKyAgICAgIGhlaWdodAorICAgIH0gPSB2aXNpdG9yLmN1cnJlbnRQYWdlSW5mbzsKKyAgICBjb25zdCBiaXRQYWNrZWQgPSB2aXNpdG9yLmJ1ZmZlcjsKKyAgICBjb25zdCBpbWdEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTsKKyAgICBsZXQgcSA9IDAsCisgICAgICAgIGsgPSAwOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgbGV0IG1hc2sgPSAwLAorICAgICAgICAgIGJ1ZmZlcjsKKworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGlmICghbWFzaykgeworICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgYnVmZmVyID0gYml0UGFja2VkW2srK107CisgICAgICAgIH0KKworICAgICAgICBpbWdEYXRhW3ErK10gPSBidWZmZXIgJiBtYXNrID8gMCA6IDI1NTsKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgaW1nRGF0YSwKKyAgICAgIHdpZHRoLAorICAgICAgaGVpZ2h0CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yKCkge30KKworICBTaW1wbGVTZWdtZW50VmlzaXRvci5wcm90b3R5cGUgPSB7CisgICAgb25QYWdlSW5mb3JtYXRpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uUGFnZUluZm9ybWF0aW9uKGluZm8pIHsKKyAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbzsKKyAgICAgIHZhciByb3dTaXplID0gaW5mby53aWR0aCArIDcgPj4gMzsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSAqIGluZm8uaGVpZ2h0KTsKKworICAgICAgaWYgKGluZm8uZGVmYXVsdFBpeGVsVmFsdWUpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBidWZmZXJbaV0gPSAweGZmOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOworICAgIH0sCisgICAgZHJhd0JpdG1hcDogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3JfZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApIHsKKyAgICAgIHZhciBwYWdlSW5mbyA9IHRoaXMuY3VycmVudFBhZ2VJbmZvOworICAgICAgdmFyIHdpZHRoID0gcmVnaW9uSW5mby53aWR0aCwKKyAgICAgICAgICBoZWlnaHQgPSByZWdpb25JbmZvLmhlaWdodDsKKyAgICAgIHZhciByb3dTaXplID0gcGFnZUluZm8ud2lkdGggKyA3ID4+IDM7CisgICAgICB2YXIgY29tYmluYXRpb25PcGVyYXRvciA9IHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA/IHJlZ2lvbkluZm8uY29tYmluYXRpb25PcGVyYXRvciA6IHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3I7CisgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CisgICAgICB2YXIgbWFzazAgPSAxMjggPj4gKHJlZ2lvbkluZm8ueCAmIDcpOworICAgICAgdmFyIG9mZnNldDAgPSByZWdpb25JbmZvLnkgKiByb3dTaXplICsgKHJlZ2lvbkluZm8ueCA+PiAzKTsKKyAgICAgIHZhciBpLCBqLCBtYXNrLCBvZmZzZXQ7CisKKyAgICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBtYXNrID0gbWFzazA7CisgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQwOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gfD0gbWFzazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG1hc2sgPj49IDE7CisKKyAgICAgICAgICAgICAgaWYgKCFtYXNrKSB7CisgICAgICAgICAgICAgICAgbWFzayA9IDEyODsKKyAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgbWFzayA9IG1hc2swOworICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJpdG1hcFtpXVtqXSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXRdIF49IG1hc2s7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBtYXNrID4+PSAxOworCisgICAgICAgICAgICAgIGlmICghbWFzaykgeworICAgICAgICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0MCArPSByb3dTaXplOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICR7Y29tYmluYXRpb25PcGVyYXRvcn0gaXMgbm90IHN1cHBvcnRlZGApOworICAgICAgfQorICAgIH0sCisgICAgb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24ocmVnaW9uLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvOworICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICB2YXIgYml0bWFwID0gZGVjb2RlQml0bWFwKHJlZ2lvbi5tbXIsIHJlZ2lvbkluZm8ud2lkdGgsIHJlZ2lvbkluZm8uaGVpZ2h0LCByZWdpb24udGVtcGxhdGUsIHJlZ2lvbi5wcmVkaWN0aW9uLCBudWxsLCByZWdpb24uYXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbigpIHsKKyAgICAgIHRoaXMub25JbW1lZGlhdGVHZW5lcmljUmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKyAgICBvblN5bWJvbERpY3Rpb25hcnk6IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uU3ltYm9sRGljdGlvbmFyeShkaWN0aW9uYXJ5LCBjdXJyZW50U2VnbWVudCwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgbGV0IGh1ZmZtYW5UYWJsZXMsIGh1ZmZtYW5JbnB1dDsKKworICAgICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikgeworICAgICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRTZWdtZW50cywgdGhpcy5jdXN0b21UYWJsZXMpOworICAgICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgfQorCisgICAgICB2YXIgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKKworICAgICAgaWYgKCFzeW1ib2xzKSB7CisgICAgICAgIHRoaXMuc3ltYm9scyA9IHN5bWJvbHMgPSB7fTsKKyAgICAgIH0KKworICAgICAgdmFyIGlucHV0U3ltYm9scyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29uc3QgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRzW2ldXTsKKworICAgICAgICBpZiAocmVmZXJyZWRTeW1ib2xzKSB7CisgICAgICAgICAgaW5wdXRTeW1ib2xzID0gaW5wdXRTeW1ib2xzLmNvbmNhdChyZWZlcnJlZFN5bWJvbHMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgc3ltYm9sc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnkuaHVmZm1hbiwgZGljdGlvbmFyeS5yZWZpbmVtZW50LCBpbnB1dFN5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZOZXdTeW1ib2xzLCBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLCBodWZmbWFuVGFibGVzLCBkaWN0aW9uYXJ5LnRlbXBsYXRlLCBkaWN0aW9uYXJ5LmF0LCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSwgZGljdGlvbmFyeS5yZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgaHVmZm1hbklucHV0KTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlVGV4dFJlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVUZXh0UmVnaW9uKHJlZ2lvbiwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKKyAgICAgIGxldCBodWZmbWFuVGFibGVzLCBodWZmbWFuSW5wdXQ7CisgICAgICB2YXIgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKKyAgICAgIHZhciBpbnB1dFN5bWJvbHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVmZXJyZWRTZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50c1tpXV07CisKKyAgICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykgeworICAgICAgICAgIGlucHV0U3ltYm9scyA9IGlucHV0U3ltYm9scy5jb25jYXQocmVmZXJyZWRTeW1ib2xzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgc3ltYm9sQ29kZUxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5sb2cyKShpbnB1dFN5bWJvbHMubGVuZ3RoKTsKKworICAgICAgaWYgKHJlZ2lvbi5odWZmbWFuKSB7CisgICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIHRoaXMuY3VzdG9tVGFibGVzLCBpbnB1dFN5bWJvbHMubGVuZ3RoLCBodWZmbWFuSW5wdXQpOworICAgICAgfQorCisgICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKHJlZ2lvbi5odWZmbWFuLCByZWdpb24ucmVmaW5lbWVudCwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCByZWdpb24uc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHJlZ2lvbi50cmFuc3Bvc2VkLCByZWdpb24uZHNPZmZzZXQsIHJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCBodWZmbWFuVGFibGVzLCByZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlLCByZWdpb24ucmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIHJlZ2lvbi5sb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCk7CisgICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKKyAgICB9LAorICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpIHsKKyAgICAgIHRoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKworICAgIG9uUGF0dGVybkRpY3Rpb25hcnkoZGljdGlvbmFyeSwgY3VycmVudFNlZ21lbnQsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIGxldCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnM7CisKKyAgICAgIGlmICghcGF0dGVybnMpIHsKKyAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHBhdHRlcm5zID0ge307CisgICAgICB9CisKKyAgICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShkaWN0aW9uYXJ5Lm1tciwgZGljdGlvbmFyeS5wYXR0ZXJuV2lkdGgsIGRpY3Rpb25hcnkucGF0dGVybkhlaWdodCwgZGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXgsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCk7CisgICAgfSwKKworICAgIG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnNbcmVmZXJyZWRTZWdtZW50c1swXV07CisgICAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CisgICAgICBjb25zdCBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgY29uc3QgYml0bWFwID0gZGVjb2RlSGFsZnRvbmVSZWdpb24ocmVnaW9uLm1tciwgcGF0dGVybnMsIHJlZ2lvbi50ZW1wbGF0ZSwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLmVuYWJsZVNraXAsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCByZWdpb24uZ3JpZFdpZHRoLCByZWdpb24uZ3JpZEhlaWdodCwgcmVnaW9uLmdyaWRPZmZzZXRYLCByZWdpb24uZ3JpZE9mZnNldFksIHJlZ2lvbi5ncmlkVmVjdG9yWCwgcmVnaW9uLmdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CisgICAgfSwKKworICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbigpIHsKKyAgICAgIHRoaXMub25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgbGV0IGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzOworCisgICAgICBpZiAoIWN1c3RvbVRhYmxlcykgeworICAgICAgICB0aGlzLmN1c3RvbVRhYmxlcyA9IGN1c3RvbVRhYmxlcyA9IHt9OworICAgICAgfQorCisgICAgICBjdXN0b21UYWJsZXNbY3VycmVudFNlZ21lbnRdID0gZGVjb2RlVGFibGVzU2VnbWVudChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBIdWZmbWFuTGluZShsaW5lRGF0YSkgeworICAgIGlmIChsaW5lRGF0YS5sZW5ndGggPT09IDIpIHsKKyAgICAgIHRoaXMuaXNPT0IgPSB0cnVlOworICAgICAgdGhpcy5yYW5nZUxvdyA9IDA7CisgICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzBdOworICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IDA7CisgICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVsxXTsKKyAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuaXNPT0IgPSBmYWxzZTsKKyAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lRGF0YVswXTsKKyAgICAgIHRoaXMucHJlZml4TGVuZ3RoID0gbGluZURhdGFbMV07CisgICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gbGluZURhdGFbMl07CisgICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVszXTsKKyAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gbGluZURhdGFbNF0gPT09ICJsb3dlciI7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gSHVmZm1hblRyZWVOb2RlKGxpbmUpIHsKKyAgICB0aGlzLmNoaWxkcmVuID0gW107CisKKyAgICBpZiAobGluZSkgeworICAgICAgdGhpcy5pc0xlYWYgPSB0cnVlOworICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmUucmFuZ2VMZW5ndGg7CisgICAgICB0aGlzLnJhbmdlTG93ID0gbGluZS5yYW5nZUxvdzsKKyAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gbGluZS5pc0xvd2VyUmFuZ2U7CisgICAgICB0aGlzLmlzT09CID0gbGluZS5pc09PQjsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5pc0xlYWYgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBIdWZmbWFuVHJlZU5vZGUucHJvdG90eXBlID0geworICAgIGJ1aWxkVHJlZShsaW5lLCBzaGlmdCkgeworICAgICAgY29uc3QgYml0ID0gbGluZS5wcmVmaXhDb2RlID4+IHNoaWZ0ICYgMTsKKworICAgICAgaWYgKHNoaWZ0IDw9IDApIHsKKyAgICAgICAgdGhpcy5jaGlsZHJlbltiaXRdID0gbmV3IEh1ZmZtYW5UcmVlTm9kZShsaW5lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxldCBub2RlID0gdGhpcy5jaGlsZHJlbltiaXRdOworCisgICAgICAgIGlmICghbm9kZSkgeworICAgICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgbm9kZS5idWlsZFRyZWUobGluZSwgc2hpZnQgLSAxKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgZGVjb2RlTm9kZShyZWFkZXIpIHsKKyAgICAgIGlmICh0aGlzLmlzTGVhZikgeworICAgICAgICBpZiAodGhpcy5pc09PQikgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaHRPZmZzZXQgPSByZWFkZXIucmVhZEJpdHModGhpcy5yYW5nZUxlbmd0aCk7CisgICAgICAgIHJldHVybiB0aGlzLnJhbmdlTG93ICsgKHRoaXMuaXNMb3dlclJhbmdlID8gLWh0T2Zmc2V0IDogaHRPZmZzZXQpOworICAgICAgfQorCisgICAgICBjb25zdCBub2RlID0gdGhpcy5jaGlsZHJlbltyZWFkZXIucmVhZEJpdCgpXTsKKworICAgICAgaWYgKCFub2RlKSB7CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gZGF0YSIpOworICAgICAgfQorCisgICAgICByZXR1cm4gbm9kZS5kZWNvZGVOb2RlKHJlYWRlcik7CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gSHVmZm1hblRhYmxlKGxpbmVzLCBwcmVmaXhDb2Rlc0RvbmUpIHsKKyAgICBpZiAoIXByZWZpeENvZGVzRG9uZSkgeworICAgICAgdGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhsaW5lcyk7CisgICAgfQorCisgICAgdGhpcy5yb290Tm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07CisKKyAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5yb290Tm9kZS5idWlsZFRyZWUobGluZSwgbGluZS5wcmVmaXhMZW5ndGggLSAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBIdWZmbWFuVGFibGUucHJvdG90eXBlID0geworICAgIGRlY29kZShyZWFkZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTsKKyAgICB9LAorCisgICAgYXNzaWduUHJlZml4Q29kZXMobGluZXMpIHsKKyAgICAgIGNvbnN0IGxpbmVzTGVuZ3RoID0gbGluZXMubGVuZ3RoOworICAgICAgbGV0IHByZWZpeExlbmd0aE1heCA9IDA7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNMZW5ndGg7IGkrKykgeworICAgICAgICBwcmVmaXhMZW5ndGhNYXggPSBNYXRoLm1heChwcmVmaXhMZW5ndGhNYXgsIGxpbmVzW2ldLnByZWZpeExlbmd0aCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGhpc3RvZ3JhbSA9IG5ldyBVaW50MzJBcnJheShwcmVmaXhMZW5ndGhNYXggKyAxKTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7CisgICAgICAgIGhpc3RvZ3JhbVtsaW5lc1tpXS5wcmVmaXhMZW5ndGhdKys7CisgICAgICB9CisKKyAgICAgIGxldCBjdXJyZW50TGVuZ3RoID0gMSwKKyAgICAgICAgICBmaXJzdENvZGUgPSAwLAorICAgICAgICAgIGN1cnJlbnRDb2RlLAorICAgICAgICAgIGN1cnJlbnRUZW1wLAorICAgICAgICAgIGxpbmU7CisgICAgICBoaXN0b2dyYW1bMF0gPSAwOworCisgICAgICB3aGlsZSAoY3VycmVudExlbmd0aCA8PSBwcmVmaXhMZW5ndGhNYXgpIHsKKyAgICAgICAgZmlyc3RDb2RlID0gZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSA8PCAxOworICAgICAgICBjdXJyZW50Q29kZSA9IGZpcnN0Q29kZTsKKyAgICAgICAgY3VycmVudFRlbXAgPSAwOworCisgICAgICAgIHdoaWxlIChjdXJyZW50VGVtcCA8IGxpbmVzTGVuZ3RoKSB7CisgICAgICAgICAgbGluZSA9IGxpbmVzW2N1cnJlbnRUZW1wXTsKKworICAgICAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA9PT0gY3VycmVudExlbmd0aCkgeworICAgICAgICAgICAgbGluZS5wcmVmaXhDb2RlID0gY3VycmVudENvZGU7CisgICAgICAgICAgICBjdXJyZW50Q29kZSsrOworICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnRUZW1wKys7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50TGVuZ3RoKys7CisgICAgICB9CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gZGVjb2RlVGFibGVzU2VnbWVudChkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgY29uc3QgZmxhZ3MgPSBkYXRhW3N0YXJ0XTsKKyAgICBjb25zdCBsb3dlc3RWYWx1ZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDEpICYgMHhmZmZmZmZmZjsKKyAgICBjb25zdCBoaWdoZXN0VmFsdWUgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyA1KSAmIDB4ZmZmZmZmZmY7CisgICAgY29uc3QgcmVhZGVyID0gbmV3IFJlYWRlcihkYXRhLCBzdGFydCArIDksIGVuZCk7CisgICAgY29uc3QgcHJlZml4U2l6ZUJpdHMgPSAoZmxhZ3MgPj4gMSAmIDcpICsgMTsKKyAgICBjb25zdCByYW5nZVNpemVCaXRzID0gKGZsYWdzID4+IDQgJiA3KSArIDE7CisgICAgY29uc3QgbGluZXMgPSBbXTsKKyAgICBsZXQgcHJlZml4TGVuZ3RoLAorICAgICAgICByYW5nZUxlbmd0aCwKKyAgICAgICAgY3VycmVudFJhbmdlTG93ID0gbG93ZXN0VmFsdWU7CisKKyAgICBkbyB7CisgICAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOworICAgICAgcmFuZ2VMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocmFuZ2VTaXplQml0cyk7CisgICAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbY3VycmVudFJhbmdlTG93LCBwcmVmaXhMZW5ndGgsIHJhbmdlTGVuZ3RoLCAwXSkpOworICAgICAgY3VycmVudFJhbmdlTG93ICs9IDEgPDwgcmFuZ2VMZW5ndGg7CisgICAgfSB3aGlsZSAoY3VycmVudFJhbmdlTG93IDwgaGlnaGVzdFZhbHVlKTsKKworICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CisgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2xvd2VzdFZhbHVlIC0gMSwgcHJlZml4TGVuZ3RoLCAzMiwgMCwgImxvd2VyIl0pKTsKKyAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOworICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtoaWdoZXN0VmFsdWUsIHByZWZpeExlbmd0aCwgMzIsIDBdKSk7CisKKyAgICBpZiAoZmxhZ3MgJiAxKSB7CisgICAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOworICAgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgZmFsc2UpOworICB9CisKKyAgY29uc3Qgc3RhbmRhcmRUYWJsZXNDYWNoZSA9IHt9OworCisgIGZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7CisgICAgbGV0IHRhYmxlID0gc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdOworCisgICAgaWYgKHRhYmxlKSB7CisgICAgICByZXR1cm4gdGFibGU7CisgICAgfQorCisgICAgbGV0IGxpbmVzOworCisgICAgc3dpdGNoIChudW1iZXIpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgbGluZXMgPSBbWzAsIDEsIDQsIDB4MF0sIFsxNiwgMiwgOCwgMHgyXSwgWzI3MiwgMywgMTYsIDB4Nl0sIFs2NTgwOCwgMywgMzIsIDB4N11dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAyOgorICAgICAgICBsaW5lcyA9IFtbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWzc1LCA2LCAzMiwgMHgzZV0sIFs2LCAweDNmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIGxpbmVzID0gW1stMjU2LCA4LCA4LCAweGZlXSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAyLCAwLCAweDJdLCBbMiwgMywgMCwgMHg2XSwgWzMsIDQsIDMsIDB4ZV0sIFsxMSwgNSwgNiwgMHgxZV0sIFstMjU3LCA4LCAzMiwgMHhmZiwgImxvd2VyIl0sIFs3NSwgNywgMzIsIDB4N2VdLCBbNiwgMHgzZV1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0OgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWzc2LCA1LCAzMiwgMHgxZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA1OgorICAgICAgICBsaW5lcyA9IFtbLTI1NSwgNywgOCwgMHg3ZV0sIFsxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDAsIDB4Nl0sIFs0LCA0LCAzLCAweGVdLCBbMTIsIDUsIDYsIDB4MWVdLCBbLTI1NiwgNywgMzIsIDB4N2YsICJsb3dlciJdLCBbNzYsIDYsIDMyLCAweDNlXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDY6CisgICAgICAgIGxpbmVzID0gW1stMjA0OCwgNSwgMTAsIDB4MWNdLCBbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCA0LCA4LCAweDldLCBbLTI1NiwgNCwgNywgMHhhXSwgWy0xMjgsIDUsIDYsIDB4MWRdLCBbLTY0LCA1LCA1LCAweDFlXSwgWy0zMiwgNCwgNSwgMHhiXSwgWzAsIDIsIDcsIDB4MF0sIFsxMjgsIDMsIDcsIDB4Ml0sIFsyNTYsIDMsIDgsIDB4M10sIFs1MTIsIDQsIDksIDB4Y10sIFsxMDI0LCA0LCAxMCwgMHhkXSwgWy0yMDQ5LCA2LCAzMiwgMHgzZSwgImxvd2VyIl0sIFsyMDQ4LCA2LCAzMiwgMHgzZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA3OgorICAgICAgICBsaW5lcyA9IFtbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCAzLCA4LCAweDBdLCBbLTI1NiwgNCwgNywgMHg5XSwgWy0xMjgsIDUsIDYsIDB4MWFdLCBbLTY0LCA1LCA1LCAweDFiXSwgWy0zMiwgNCwgNSwgMHhhXSwgWzAsIDQsIDUsIDB4Yl0sIFszMiwgNSwgNSwgMHgxY10sIFs2NCwgNSwgNiwgMHgxZF0sIFsxMjgsIDQsIDcsIDB4Y10sIFsyNTYsIDMsIDgsIDB4MV0sIFs1MTIsIDMsIDksIDB4Ml0sIFsxMDI0LCAzLCAxMCwgMHgzXSwgWy0xMDI1LCA1LCAzMiwgMHgxZSwgImxvd2VyIl0sIFsyMDQ4LCA1LCAzMiwgMHgxZl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA4OgorICAgICAgICBsaW5lcyA9IFtbLTE1LCA4LCAzLCAweGZjXSwgWy03LCA5LCAxLCAweDFmY10sIFstNSwgOCwgMSwgMHhmZF0sIFstMywgOSwgMCwgMHgxZmRdLCBbLTIsIDcsIDAsIDB4N2NdLCBbLTEsIDQsIDAsIDB4YV0sIFswLCAyLCAxLCAweDBdLCBbMiwgNSwgMCwgMHgxYV0sIFszLCA2LCAwLCAweDNhXSwgWzQsIDMsIDQsIDB4NF0sIFsyMCwgNiwgMSwgMHgzYl0sIFsyMiwgNCwgNCwgMHhiXSwgWzM4LCA0LCA1LCAweGNdLCBbNzAsIDUsIDYsIDB4MWJdLCBbMTM0LCA1LCA3LCAweDFjXSwgWzI2MiwgNiwgNywgMHgzY10sIFszOTAsIDcsIDgsIDB4N2RdLCBbNjQ2LCA2LCAxMCwgMHgzZF0sIFstMTYsIDksIDMyLCAweDFmZSwgImxvd2VyIl0sIFsxNjcwLCA5LCAzMiwgMHgxZmZdLCBbMiwgMHgxXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDk6CisgICAgICAgIGxpbmVzID0gW1stMzEsIDgsIDQsIDB4ZmNdLCBbLTE1LCA5LCAyLCAweDFmY10sIFstMTEsIDgsIDIsIDB4ZmRdLCBbLTcsIDksIDEsIDB4MWZkXSwgWy01LCA3LCAxLCAweDdjXSwgWy0zLCA0LCAxLCAweGFdLCBbLTEsIDMsIDEsIDB4Ml0sIFsxLCAzLCAxLCAweDNdLCBbMywgNSwgMSwgMHgxYV0sIFs1LCA2LCAxLCAweDNhXSwgWzcsIDMsIDUsIDB4NF0sIFszOSwgNiwgMiwgMHgzYl0sIFs0MywgNCwgNSwgMHhiXSwgWzc1LCA0LCA2LCAweGNdLCBbMTM5LCA1LCA3LCAweDFiXSwgWzI2NywgNSwgOCwgMHgxY10sIFs1MjMsIDYsIDgsIDB4M2NdLCBbNzc5LCA3LCA5LCAweDdkXSwgWzEyOTEsIDYsIDExLCAweDNkXSwgWy0zMiwgOSwgMzIsIDB4MWZlLCAibG93ZXIiXSwgWzMzMzksIDksIDMyLCAweDFmZl0sIFsyLCAweDBdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIGxpbmVzID0gW1stMjEsIDcsIDQsIDB4N2FdLCBbLTUsIDgsIDAsIDB4ZmNdLCBbLTQsIDcsIDAsIDB4N2JdLCBbLTMsIDUsIDAsIDB4MThdLCBbLTIsIDIsIDIsIDB4MF0sIFsyLCA1LCAwLCAweDE5XSwgWzMsIDYsIDAsIDB4MzZdLCBbNCwgNywgMCwgMHg3Y10sIFs1LCA4LCAwLCAweGZkXSwgWzYsIDIsIDYsIDB4MV0sIFs3MCwgNSwgNSwgMHgxYV0sIFsxMDIsIDYsIDUsIDB4MzddLCBbMTM0LCA2LCA2LCAweDM4XSwgWzE5OCwgNiwgNywgMHgzOV0sIFszMjYsIDYsIDgsIDB4M2FdLCBbNTgyLCA2LCA5LCAweDNiXSwgWzEwOTQsIDYsIDEwLCAweDNjXSwgWzIxMTgsIDcsIDExLCAweDdkXSwgWy0yMiwgOCwgMzIsIDB4ZmUsICJsb3dlciJdLCBbNDE2NiwgOCwgMzIsIDB4ZmZdLCBbMiwgMHgyXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDExOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDEsIDB4Ml0sIFs0LCA0LCAwLCAweGNdLCBbNSwgNCwgMSwgMHhkXSwgWzcsIDUsIDEsIDB4MWNdLCBbOSwgNSwgMiwgMHgxZF0sIFsxMywgNiwgMiwgMHgzY10sIFsxNywgNywgMiwgMHg3YV0sIFsyMSwgNywgMywgMHg3Yl0sIFsyOSwgNywgNCwgMHg3Y10sIFs0NSwgNywgNSwgMHg3ZF0sIFs3NywgNywgNiwgMHg3ZV0sIFsxNDEsIDcsIDMyLCAweDdmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDEyOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAxLCAweDZdLCBbNSwgNSwgMCwgMHgxY10sIFs2LCA1LCAxLCAweDFkXSwgWzgsIDYsIDEsIDB4M2NdLCBbMTAsIDcsIDAsIDB4N2FdLCBbMTEsIDcsIDEsIDB4N2JdLCBbMTMsIDcsIDIsIDB4N2NdLCBbMTcsIDcsIDMsIDB4N2RdLCBbMjUsIDcsIDQsIDB4N2VdLCBbNDEsIDgsIDUsIDB4ZmVdLCBbNzMsIDgsIDMyLCAweGZmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDEzOgorICAgICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDMsIDAsIDB4NF0sIFszLCA0LCAwLCAweGNdLCBbNCwgNSwgMCwgMHgxY10sIFs1LCA0LCAxLCAweGRdLCBbNywgMywgMywgMHg1XSwgWzE1LCA2LCAxLCAweDNhXSwgWzE3LCA2LCAyLCAweDNiXSwgWzIxLCA2LCAzLCAweDNjXSwgWzI5LCA2LCA0LCAweDNkXSwgWzQ1LCA2LCA1LCAweDNlXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTQ6CisgICAgICAgIGxpbmVzID0gW1stMiwgMywgMCwgMHg0XSwgWy0xLCAzLCAwLCAweDVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4Nl0sIFsyLCAzLCAwLCAweDddXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIGxpbmVzID0gW1stMjQsIDcsIDQsIDB4N2NdLCBbLTgsIDYsIDIsIDB4M2NdLCBbLTQsIDUsIDEsIDB4MWNdLCBbLTIsIDQsIDAsIDB4Y10sIFstMSwgMywgMCwgMHg0XSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAzLCAwLCAweDVdLCBbMiwgNCwgMCwgMHhkXSwgWzMsIDUsIDEsIDB4MWRdLCBbNSwgNiwgMiwgMHgzZF0sIFs5LCA3LCA0LCAweDdkXSwgWy0yNSwgNywgMzIsIDB4N2UsICJsb3dlciJdLCBbMjUsIDcsIDMyLCAweDdmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBsaW5lc1tpXSA9IG5ldyBIdWZmbWFuTGluZShsaW5lc1tpXSk7CisgICAgfQorCisgICAgdGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGxpbmVzLCB0cnVlKTsKKyAgICBzdGFuZGFyZFRhYmxlc0NhY2hlW251bWJlcl0gPSB0YWJsZTsKKyAgICByZXR1cm4gdGFibGU7CisgIH0KKworICBmdW5jdGlvbiBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgIHRoaXMuZW5kID0gZW5kOworICAgIHRoaXMucG9zaXRpb24gPSBzdGFydDsKKyAgICB0aGlzLnNoaWZ0ID0gLTE7CisgICAgdGhpcy5jdXJyZW50Qnl0ZSA9IDA7CisgIH0KKworICBSZWFkZXIucHJvdG90eXBlID0geworICAgIHJlYWRCaXQoKSB7CisgICAgICBpZiAodGhpcy5zaGlmdCA8IDApIHsKKyAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5lbmQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY3VycmVudEJ5dGUgPSB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTsKKyAgICAgICAgdGhpcy5zaGlmdCA9IDc7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGJpdCA9IHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCAmIDE7CisgICAgICB0aGlzLnNoaWZ0LS07CisgICAgICByZXR1cm4gYml0OworICAgIH0sCisKKyAgICByZWFkQml0cyhudW1CaXRzKSB7CisgICAgICBsZXQgcmVzdWx0ID0gMCwKKyAgICAgICAgICBpOworCisgICAgICBmb3IgKGkgPSBudW1CaXRzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgcmVzdWx0IHw9IHRoaXMucmVhZEJpdCgpIDw8IGk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSwKKworICAgIGJ5dGVBbGlnbigpIHsKKyAgICAgIHRoaXMuc2hpZnQgPSAtMTsKKyAgICB9LAorCisgICAgbmV4dCgpIHsKKyAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdOworICAgIH0KKworICB9OworCisgIGZ1bmN0aW9uIGdldEN1c3RvbUh1ZmZtYW5UYWJsZShpbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CisgICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSByZWZlcnJlZFRvLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IHRhYmxlID0gY3VzdG9tVGFibGVzW3JlZmVycmVkVG9baV1dOworCisgICAgICBpZiAodGFibGUpIHsKKyAgICAgICAgaWYgKGluZGV4ID09PSBjdXJyZW50SW5kZXgpIHsKKyAgICAgICAgICByZXR1cm4gdGFibGU7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50SW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpOworICB9CisKKyAgZnVuY3Rpb24gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXModGV4dFJlZ2lvbiwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzLCBudW1iZXJPZlN5bWJvbHMsIHJlYWRlcikgeworICAgIGNvbnN0IGNvZGVzID0gW107CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAzNDsgaSsrKSB7CisgICAgICBjb25zdCBjb2RlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKDQpOworICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIGNvZGVMZW5ndGgsIDAsIDBdKSk7CisgICAgfQorCisgICAgY29uc3QgcnVuQ29kZXNUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKKyAgICBjb2Rlcy5sZW5ndGggPSAwOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlN5bWJvbHM7KSB7CisgICAgICBjb25zdCBjb2RlTGVuZ3RoID0gcnVuQ29kZXNUYWJsZS5kZWNvZGUocmVhZGVyKTsKKworICAgICAgaWYgKGNvZGVMZW5ndGggPj0gMzIpIHsKKyAgICAgICAgbGV0IHJlcGVhdGVkTGVuZ3RoLCBudW1iZXJPZlJlcGVhdHMsIGo7CisKKyAgICAgICAgc3dpdGNoIChjb2RlTGVuZ3RoKSB7CisgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgIGlmIChpID09PSAwKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJubyBwcmV2aW91cyB2YWx1ZSBpbiBzeW1ib2wgSUQgdGFibGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDIpICsgMzsKKyAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gY29kZXNbaSAtIDFdLnByZWZpeExlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygzKSArIDM7CisgICAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTsKKyAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIGNvZGUgbGVuZ3RoIGluIHN5bWJvbCBJRCB0YWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUmVwZWF0czsgaisrKSB7CisgICAgICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIHJlcGVhdGVkTGVuZ3RoLCAwLCAwXSkpOworICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ksIGNvZGVMZW5ndGgsIDAsIDBdKSk7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZWFkZXIuYnl0ZUFsaWduKCk7CisgICAgY29uc3Qgc3ltYm9sSURUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKKyAgICBsZXQgY3VzdG9tSW5kZXggPSAwLAorICAgICAgICB0YWJsZUZpcnN0UywKKyAgICAgICAgdGFibGVEZWx0YVMsCisgICAgICAgIHRhYmxlRGVsdGFUOworCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5GUykgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgICB0YWJsZUZpcnN0UyA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRlMgKyA2KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVGaXJzdFMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5EUykgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgY2FzZSAyOgorICAgICAgICB0YWJsZURlbHRhUyA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRFMgKyA4KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVEZWx0YVMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5EVCkgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgY2FzZSAyOgorICAgICAgICB0YWJsZURlbHRhVCA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRFQgKyAxMSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgICBjdXN0b21JbmRleCsrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpOworICAgIH0KKworICAgIGlmICh0ZXh0UmVnaW9uLnJlZmluZW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIHN5bWJvbElEVGFibGUsCisgICAgICB0YWJsZUZpcnN0UywKKyAgICAgIHRhYmxlRGVsdGFTLAorICAgICAgdGFibGVEZWx0YVQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CisgICAgbGV0IGN1c3RvbUluZGV4ID0gMCwKKyAgICAgICAgdGFibGVEZWx0YUhlaWdodCwKKyAgICAgICAgdGFibGVEZWx0YVdpZHRoOworCisgICAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgKyA0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gREggc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yICsgMik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFcgc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICBsZXQgdGFibGVCaXRtYXBTaXplLCB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczsKKworICAgIGlmIChkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3RvcikgeworICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKKyAgICB9CisKKyAgICBpZiAoZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yKSB7CisgICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMgPSBnZXRTdGFuZGFyZFRhYmxlKDEpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICB0YWJsZURlbHRhSGVpZ2h0LAorICAgICAgdGFibGVEZWx0YVdpZHRoLAorICAgICAgdGFibGVCaXRtYXBTaXplLAorICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChyZWFkZXIsIHdpZHRoLCBoZWlnaHQpIHsKKyAgICBjb25zdCBiaXRtYXAgPSBbXTsKKworICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgIGNvbnN0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKyAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisKKyAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpOworICAgICAgfQorCisgICAgICByZWFkZXIuYnl0ZUFsaWduKCk7CisgICAgfQorCisgICAgcmV0dXJuIGJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZW5kT2ZCbG9jaykgeworICAgIGNvbnN0IHBhcmFtcyA9IHsKKyAgICAgIEs6IC0xLAorICAgICAgQ29sdW1uczogd2lkdGgsCisgICAgICBSb3dzOiBoZWlnaHQsCisgICAgICBCbGFja0lzMTogdHJ1ZSwKKyAgICAgIEVuZE9mQmxvY2s6IGVuZE9mQmxvY2sKKyAgICB9OworICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgX2NjaXR0LkNDSVRURmF4RGVjb2RlcihpbnB1dCwgcGFyYW1zKTsKKyAgICBjb25zdCBiaXRtYXAgPSBbXTsKKyAgICBsZXQgY3VycmVudEJ5dGUsCisgICAgICAgIGVvZiA9IGZhbHNlOworCisgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgYml0bWFwLnB1c2gocm93KTsKKyAgICAgIGxldCBzaGlmdCA9IC0xOworCisgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgaWYgKHNoaWZ0IDwgMCkgeworICAgICAgICAgIGN1cnJlbnRCeXRlID0gZGVjb2Rlci5yZWFkTmV4dENoYXIoKTsKKworICAgICAgICAgIGlmIChjdXJyZW50Qnl0ZSA9PT0gLTEpIHsKKyAgICAgICAgICAgIGN1cnJlbnRCeXRlID0gMDsKKyAgICAgICAgICAgIGVvZiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2hpZnQgPSA3OworICAgICAgICB9CisKKyAgICAgICAgcm93W3hdID0gY3VycmVudEJ5dGUgPj4gc2hpZnQgJiAxOworICAgICAgICBzaGlmdC0tOworICAgICAgfQorICAgIH0KKworICAgIGlmIChlbmRPZkJsb2NrICYmICFlb2YpIHsKKyAgICAgIGNvbnN0IGxvb2tGb3JFT0ZMaW1pdCA9IDU7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va0ZvckVPRkxpbWl0OyBpKyspIHsKKyAgICAgICAgaWYgKGRlY29kZXIucmVhZE5leHRDaGFyKCkgPT09IC0xKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gSmJpZzJJbWFnZSgpIHt9CisKKyAgSmJpZzJJbWFnZS5wcm90b3R5cGUgPSB7CisgICAgcGFyc2VDaHVua3MoY2h1bmtzKSB7CisgICAgICByZXR1cm4gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpOworICAgIH0sCisKKyAgICBwYXJzZShkYXRhKSB7CisgICAgICBjb25zdCB7CisgICAgICAgIGltZ0RhdGEsCisgICAgICAgIHdpZHRoLAorICAgICAgICBoZWlnaHQKKyAgICAgIH0gPSBwYXJzZUpiaWcyKGRhdGEpOworICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICByZXR1cm4gaW1nRGF0YTsKKyAgICB9CisKKyAgfTsKKyAgcmV0dXJuIEpiaWcySW1hZ2U7Cit9KCk7CisKK2V4cG9ydHMuSmJpZzJJbWFnZSA9IEpiaWcySW1hZ2U7CisKKy8qKiovIH0pLAorLyogNSAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldExvb2t1cFRhYmxlRmFjdG9yeSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeTsKK2V4cG9ydHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSA9IGdldEluaGVyaXRhYmxlUHJvcGVydHk7CitleHBvcnRzLnRvUm9tYW5OdW1lcmFscyA9IHRvUm9tYW5OdW1lcmFsczsKK2V4cG9ydHMubG9nMiA9IGxvZzI7CitleHBvcnRzLnJlYWRJbnQ4ID0gcmVhZEludDg7CitleHBvcnRzLnJlYWRVaW50MTYgPSByZWFkVWludDE2OworZXhwb3J0cy5yZWFkVWludDMyID0gcmVhZFVpbnQzMjsKK2V4cG9ydHMuaXNXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlOworZXhwb3J0cy5YUmVmUGFyc2VFeGNlcHRpb24gPSBleHBvcnRzLlhSZWZFbnRyeUV4Y2VwdGlvbiA9IGV4cG9ydHMuTWlzc2luZ0RhdGFFeGNlcHRpb24gPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK2Z1bmN0aW9uIGdldExvb2t1cFRhYmxlRmFjdG9yeShpbml0aWFsaXplcikgeworICBsZXQgbG9va3VwOworICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIGlmIChpbml0aWFsaXplcikgeworICAgICAgbG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIGluaXRpYWxpemVyKGxvb2t1cCk7CisgICAgICBpbml0aWFsaXplciA9IG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIGxvb2t1cDsKKyAgfTsKK30KKworY2xhc3MgTWlzc2luZ0RhdGFFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCkgeworICAgIHN1cGVyKGBNaXNzaW5nIGRhdGEgWyR7YmVnaW59LCAke2VuZH0pYCk7CisgICAgdGhpcy5iZWdpbiA9IGJlZ2luOworICAgIHRoaXMuZW5kID0gZW5kOworICB9CisKK30KKworZXhwb3J0cy5NaXNzaW5nRGF0YUV4Y2VwdGlvbiA9IE1pc3NpbmdEYXRhRXhjZXB0aW9uOworCitjbGFzcyBYUmVmRW50cnlFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuWFJlZkVudHJ5RXhjZXB0aW9uID0gWFJlZkVudHJ5RXhjZXB0aW9uOworCitjbGFzcyBYUmVmUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuWFJlZlBhcnNlRXhjZXB0aW9uID0gWFJlZlBhcnNlRXhjZXB0aW9uOworCitmdW5jdGlvbiBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKKyAgZGljdCwKKyAga2V5LAorICBnZXRBcnJheSA9IGZhbHNlLAorICBzdG9wV2hlbkZvdW5kID0gdHJ1ZQorfSkgeworICBjb25zdCBMT09QX0xJTUlUID0gMTAwOworICBsZXQgbG9vcENvdW50ID0gMDsKKyAgbGV0IHZhbHVlczsKKworICB3aGlsZSAoZGljdCkgeworICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpOworCisgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGlmIChzdG9wV2hlbkZvdW5kKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCF2YWx1ZXMpIHsKKyAgICAgICAgdmFsdWVzID0gW107CisgICAgICB9CisKKyAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAoKytsb29wQ291bnQgPiBMT09QX0xJTUlUKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoYGdldEluaGVyaXRhYmxlUHJvcGVydHk6IG1heGltdW0gbG9vcCBjb3VudCBleGNlZWRlZCBmb3IgIiR7a2V5fSJgKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRpY3QgPSBkaWN0LmdldCgiUGFyZW50Iik7CisgIH0KKworICByZXR1cm4gdmFsdWVzOworfQorCitjb25zdCBST01BTl9OVU1CRVJfTUFQID0gWyIiLCAiQyIsICJDQyIsICJDQ0MiLCAiQ0QiLCAiRCIsICJEQyIsICJEQ0MiLCAiRENDQyIsICJDTSIsICIiLCAiWCIsICJYWCIsICJYWFgiLCAiWEwiLCAiTCIsICJMWCIsICJMWFgiLCAiTFhYWCIsICJYQyIsICIiLCAiSSIsICJJSSIsICJJSUkiLCAiSVYiLCAiViIsICJWSSIsICJWSUkiLCAiVklJSSIsICJJWCJdOworCitmdW5jdGlvbiB0b1JvbWFuTnVtZXJhbHMobnVtYmVyLCBsb3dlckNhc2UgPSBmYWxzZSkgeworICAoMCwgX3V0aWwuYXNzZXJ0KShOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcikgJiYgbnVtYmVyID4gMCwgIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4iKTsKKyAgY29uc3Qgcm9tYW5CdWYgPSBbXTsKKyAgbGV0IHBvczsKKworICB3aGlsZSAobnVtYmVyID49IDEwMDApIHsKKyAgICBudW1iZXIgLT0gMTAwMDsKKyAgICByb21hbkJ1Zi5wdXNoKCJNIik7CisgIH0KKworICBwb3MgPSBudW1iZXIgLyAxMDAgfCAwOworICBudW1iZXIgJT0gMTAwOworICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbcG9zXSk7CisgIHBvcyA9IG51bWJlciAvIDEwIHwgMDsKKyAgbnVtYmVyICU9IDEwOworICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbMTAgKyBwb3NdKTsKKyAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyXSk7CisgIGNvbnN0IHJvbWFuU3RyID0gcm9tYW5CdWYuam9pbigiIik7CisgIHJldHVybiBsb3dlckNhc2UgPyByb21hblN0ci50b0xvd2VyQ2FzZSgpIDogcm9tYW5TdHI7Cit9CisKK2Z1bmN0aW9uIGxvZzIoeCkgeworICBpZiAoeCA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nMih4KSk7Cit9CisKK2Z1bmN0aW9uIHJlYWRJbnQ4KGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDI0ID4+IDI0OworfQorCitmdW5jdGlvbiByZWFkVWludDE2KGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDggfCBkYXRhW29mZnNldCArIDFdOworfQorCitmdW5jdGlvbiByZWFkVWludDMyKGRhdGEsIG9mZnNldCkgeworICByZXR1cm4gKGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdKSA+Pj4gMDsKK30KKworZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CisgIHJldHVybiBjaCA9PT0gMHgyMCB8fCBjaCA9PT0gMHgwOSB8fCBjaCA9PT0gMHgwZCB8fCBjaCA9PT0gMHgwYTsKK30KKworLyoqKi8gfSksCisvKiA2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQXJpdGhtZXRpY0RlY29kZXIgPSB2b2lkIDA7Citjb25zdCBRZVRhYmxlID0gW3sKKyAgcWU6IDB4NTYwMSwKKyAgbm1wczogMSwKKyAgbmxwczogMSwKKyAgc3dpdGNoRmxhZzogMQorfSwgeworICBxZTogMHgzNDAxLAorICBubXBzOiAyLAorICBubHBzOiA2LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE4MDEsCisgIG5tcHM6IDMsCisgIG5scHM6IDksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MGFjMSwKKyAgbm1wczogNCwKKyAgbmxwczogMTIsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDUyMSwKKyAgbm1wczogNSwKKyAgbmxwczogMjksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDIyMSwKKyAgbm1wczogMzgsCisgIG5scHM6IDMzLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDU2MDEsCisgIG5tcHM6IDcsCisgIG5scHM6IDYsCisgIHN3aXRjaEZsYWc6IDEKK30sIHsKKyAgcWU6IDB4NTQwMSwKKyAgbm1wczogOCwKKyAgbmxwczogMTQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NDgwMSwKKyAgbm1wczogOSwKKyAgbmxwczogMTQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MzgwMSwKKyAgbm1wczogMTAsCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDMwMDEsCisgIG5tcHM6IDExLAorICBubHBzOiAxNywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgyNDAxLAorICBubXBzOiAxMiwKKyAgbmxwczogMTgsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MWMwMSwKKyAgbm1wczogMTMsCisgIG5scHM6IDIwLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE2MDEsCisgIG5tcHM6IDI5LAorICBubHBzOiAyMSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg1NjAxLAorICBubXBzOiAxNSwKKyAgbmxwczogMTQsCisgIHN3aXRjaEZsYWc6IDEKK30sIHsKKyAgcWU6IDB4NTQwMSwKKyAgbm1wczogMTYsCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDUxMDEsCisgIG5tcHM6IDE3LAorICBubHBzOiAxNSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg0ODAxLAorICBubXBzOiAxOCwKKyAgbmxwczogMTYsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MzgwMSwKKyAgbm1wczogMTksCisgIG5scHM6IDE3LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDM0MDEsCisgIG5tcHM6IDIwLAorICBubHBzOiAxOCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgzMDAxLAorICBubXBzOiAyMSwKKyAgbmxwczogMTksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MjgwMSwKKyAgbm1wczogMjIsCisgIG5scHM6IDE5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDI0MDEsCisgIG5tcHM6IDIzLAorICBubHBzOiAyMCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgyMjAxLAorICBubXBzOiAyNCwKKyAgbmxwczogMjEsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MWMwMSwKKyAgbm1wczogMjUsCisgIG5scHM6IDIyLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE4MDEsCisgIG5tcHM6IDI2LAorICBubHBzOiAyMywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxNjAxLAorICBubXBzOiAyNywKKyAgbmxwczogMjQsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTQwMSwKKyAgbm1wczogMjgsCisgIG5scHM6IDI1LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDEyMDEsCisgIG5tcHM6IDI5LAorICBubHBzOiAyNiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxMTAxLAorICBubXBzOiAzMCwKKyAgbmxwczogMjcsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MGFjMSwKKyAgbm1wczogMzEsCisgIG5scHM6IDI4LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA5YzEsCisgIG5tcHM6IDMyLAorICBubHBzOiAyOSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwOGExLAorICBubXBzOiAzMywKKyAgbmxwczogMzAsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDUyMSwKKyAgbm1wczogMzQsCisgIG5scHM6IDMxLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA0NDEsCisgIG5tcHM6IDM1LAorICBubHBzOiAzMiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMmExLAorICBubXBzOiAzNiwKKyAgbmxwczogMzMsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDIyMSwKKyAgbm1wczogMzcsCisgIG5scHM6IDM0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAxNDEsCisgIG5tcHM6IDM4LAorICBubHBzOiAzNSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMTExLAorICBubXBzOiAzOSwKKyAgbmxwczogMzYsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDA4NSwKKyAgbm1wczogNDAsCisgIG5scHM6IDM3LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwNDksCisgIG5tcHM6IDQxLAorICBubHBzOiAzOCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDI1LAorICBubXBzOiA0MiwKKyAgbmxwczogMzksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAxNSwKKyAgbm1wczogNDMsCisgIG5scHM6IDQwLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwMDksCisgIG5tcHM6IDQ0LAorICBubHBzOiA0MSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDA1LAorICBubXBzOiA0NSwKKyAgbmxwczogNDIsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAwMSwKKyAgbm1wczogNDUsCisgIG5scHM6IDQzLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDU2MDEsCisgIG5tcHM6IDQ2LAorICBubHBzOiA0NiwKKyAgc3dpdGNoRmxhZzogMAorfV07CisKK2NsYXNzIEFyaXRobWV0aWNEZWNvZGVyIHsKKyAgY29uc3RydWN0b3IoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5icCA9IHN0YXJ0OworICAgIHRoaXMuZGF0YUVuZCA9IGVuZDsKKyAgICB0aGlzLmNoaWdoID0gZGF0YVtzdGFydF07CisgICAgdGhpcy5jbG93ID0gMDsKKyAgICB0aGlzLmJ5dGVJbigpOworICAgIHRoaXMuY2hpZ2ggPSB0aGlzLmNoaWdoIDw8IDcgJiAweGZmZmYgfCB0aGlzLmNsb3cgPj4gOSAmIDB4N2Y7CisgICAgdGhpcy5jbG93ID0gdGhpcy5jbG93IDw8IDcgJiAweGZmZmY7CisgICAgdGhpcy5jdCAtPSA3OworICAgIHRoaXMuYSA9IDB4ODAwMDsKKyAgfQorCisgIGJ5dGVJbigpIHsKKyAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOworICAgIGxldCBicCA9IHRoaXMuYnA7CisKKyAgICBpZiAoZGF0YVticF0gPT09IDB4ZmYpIHsKKyAgICAgIGlmIChkYXRhW2JwICsgMV0gPiAweDhmKSB7CisgICAgICAgIHRoaXMuY2xvdyArPSAweGZmMDA7CisgICAgICAgIHRoaXMuY3QgPSA4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnArKzsKKyAgICAgICAgdGhpcy5jbG93ICs9IGRhdGFbYnBdIDw8IDk7CisgICAgICAgIHRoaXMuY3QgPSA3OworICAgICAgICB0aGlzLmJwID0gYnA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGJwKys7CisgICAgICB0aGlzLmNsb3cgKz0gYnAgPCB0aGlzLmRhdGFFbmQgPyBkYXRhW2JwXSA8PCA4IDogMHhmZjAwOworICAgICAgdGhpcy5jdCA9IDg7CisgICAgICB0aGlzLmJwID0gYnA7CisgICAgfQorCisgICAgaWYgKHRoaXMuY2xvdyA+IDB4ZmZmZikgeworICAgICAgdGhpcy5jaGlnaCArPSB0aGlzLmNsb3cgPj4gMTY7CisgICAgICB0aGlzLmNsb3cgJj0gMHhmZmZmOworICAgIH0KKyAgfQorCisgIHJlYWRCaXQoY29udGV4dHMsIHBvcykgeworICAgIGxldCBjeF9pbmRleCA9IGNvbnRleHRzW3Bvc10gPj4gMSwKKyAgICAgICAgY3hfbXBzID0gY29udGV4dHNbcG9zXSAmIDE7CisgICAgY29uc3QgcWVUYWJsZUljeCA9IFFlVGFibGVbY3hfaW5kZXhdOworICAgIGNvbnN0IHFlSWN4ID0gcWVUYWJsZUljeC5xZTsKKyAgICBsZXQgZDsKKyAgICBsZXQgYSA9IHRoaXMuYSAtIHFlSWN4OworCisgICAgaWYgKHRoaXMuY2hpZ2ggPCBxZUljeCkgeworICAgICAgaWYgKGEgPCBxZUljeCkgeworICAgICAgICBhID0gcWVJY3g7CisgICAgICAgIGQgPSBjeF9tcHM7CisgICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYSA9IHFlSWN4OworICAgICAgICBkID0gMSBeIGN4X21wczsKKworICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7CisgICAgICAgICAgY3hfbXBzID0gZDsKKyAgICAgICAgfQorCisgICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmNoaWdoIC09IHFlSWN4OworCisgICAgICBpZiAoKGEgJiAweDgwMDApICE9PSAwKSB7CisgICAgICAgIHRoaXMuYSA9IGE7CisgICAgICAgIHJldHVybiBjeF9tcHM7CisgICAgICB9CisKKyAgICAgIGlmIChhIDwgcWVJY3gpIHsKKyAgICAgICAgZCA9IDEgXiBjeF9tcHM7CisKKyAgICAgICAgaWYgKHFlVGFibGVJY3guc3dpdGNoRmxhZyA9PT0gMSkgeworICAgICAgICAgIGN4X21wcyA9IGQ7CisgICAgICAgIH0KKworICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGQgPSBjeF9tcHM7CisgICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOworICAgICAgfQorICAgIH0KKworICAgIGRvIHsKKyAgICAgIGlmICh0aGlzLmN0ID09PSAwKSB7CisgICAgICAgIHRoaXMuYnl0ZUluKCk7CisgICAgICB9CisKKyAgICAgIGEgPDw9IDE7CisgICAgICB0aGlzLmNoaWdoID0gdGhpcy5jaGlnaCA8PCAxICYgMHhmZmZmIHwgdGhpcy5jbG93ID4+IDE1ICYgMTsKKyAgICAgIHRoaXMuY2xvdyA9IHRoaXMuY2xvdyA8PCAxICYgMHhmZmZmOworICAgICAgdGhpcy5jdC0tOworICAgIH0gd2hpbGUgKChhICYgMHg4MDAwKSA9PT0gMCk7CisKKyAgICB0aGlzLmEgPSBhOworICAgIGNvbnRleHRzW3Bvc10gPSBjeF9pbmRleCA8PCAxIHwgY3hfbXBzOworICAgIHJldHVybiBkOworICB9CisKK30KKworZXhwb3J0cy5Bcml0aG1ldGljRGVjb2RlciA9IEFyaXRobWV0aWNEZWNvZGVyOworCisvKioqLyB9KSwKKy8qIDcgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DQ0lUVEZheERlY29kZXIgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK2NvbnN0IENDSVRURmF4RGVjb2RlciA9IGZ1bmN0aW9uIENDSVRURmF4RGVjb2RlcigpIHsKKyAgY29uc3QgY2NpdHRFT0wgPSAtMjsKKyAgY29uc3QgY2NpdHRFT0YgPSAtMTsKKyAgY29uc3QgdHdvRGltUGFzcyA9IDA7CisgIGNvbnN0IHR3b0RpbUhvcml6ID0gMTsKKyAgY29uc3QgdHdvRGltVmVydDAgPSAyOworICBjb25zdCB0d29EaW1WZXJ0UjEgPSAzOworICBjb25zdCB0d29EaW1WZXJ0TDEgPSA0OworICBjb25zdCB0d29EaW1WZXJ0UjIgPSA1OworICBjb25zdCB0d29EaW1WZXJ0TDIgPSA2OworICBjb25zdCB0d29EaW1WZXJ0UjMgPSA3OworICBjb25zdCB0d29EaW1WZXJ0TDMgPSA4OworICBjb25zdCB0d29EaW1UYWJsZSA9IFtbLTEsIC0xXSwgWy0xLCAtMV0sIFs3LCB0d29EaW1WZXJ0TDNdLCBbNywgdHdvRGltVmVydFIzXSwgWzYsIHR3b0RpbVZlcnRMMl0sIFs2LCB0d29EaW1WZXJ0TDJdLCBbNiwgdHdvRGltVmVydFIyXSwgWzYsIHR3b0RpbVZlcnRSMl0sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF1dOworICBjb25zdCB3aGl0ZVRhYmxlMSA9IFtbLTEsIC0xXSwgWzEyLCBjY2l0dEVPTF0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzEyLCAxOTg0XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMTEyXSwgWzEyLCAyMTc2XSwgWzEyLCAyMjQwXSwgWzEyLCAyMzA0XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzEyLCAyMzY4XSwgWzEyLCAyNDMyXSwgWzEyLCAyNDk2XSwgWzEyLCAyNTYwXV07CisgIGNvbnN0IHdoaXRlVGFibGUyID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbOCwgMjldLCBbOCwgMjldLCBbOCwgMzBdLCBbOCwgMzBdLCBbOCwgNDVdLCBbOCwgNDVdLCBbOCwgNDZdLCBbOCwgNDZdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjNdLCBbNywgMjNdLCBbNywgMjNdLCBbNywgMjNdLCBbOCwgNDddLCBbOCwgNDddLCBbOCwgNDhdLCBbOCwgNDhdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNiwgMTNdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbOCwgMzNdLCBbOCwgMzNdLCBbOCwgMzRdLCBbOCwgMzRdLCBbOCwgMzVdLCBbOCwgMzVdLCBbOCwgMzZdLCBbOCwgMzZdLCBbOCwgMzddLCBbOCwgMzddLCBbOCwgMzhdLCBbOCwgMzhdLCBbNywgMTldLCBbNywgMTldLCBbNywgMTldLCBbNywgMTldLCBbOCwgMzFdLCBbOCwgMzFdLCBbOCwgMzJdLCBbOCwgMzJdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzgsIDUzXSwgWzgsIDUzXSwgWzgsIDU0XSwgWzgsIDU0XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzgsIDM5XSwgWzgsIDM5XSwgWzgsIDQwXSwgWzgsIDQwXSwgWzgsIDQxXSwgWzgsIDQxXSwgWzgsIDQyXSwgWzgsIDQyXSwgWzgsIDQzXSwgWzgsIDQzXSwgWzgsIDQ0XSwgWzgsIDQ0XSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDIxXSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzcsIDI4XSwgWzgsIDYxXSwgWzgsIDYxXSwgWzgsIDYyXSwgWzgsIDYyXSwgWzgsIDYzXSwgWzgsIDYzXSwgWzgsIDBdLCBbOCwgMF0sIFs4LCAzMjBdLCBbOCwgMzIwXSwgWzgsIDM4NF0sIFs4LCAzODRdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNywgMjddLCBbNywgMjddLCBbNywgMjddLCBbNywgMjddLCBbOCwgNTldLCBbOCwgNTldLCBbOCwgNjBdLCBbOCwgNjBdLCBbOSwgMTQ3Ml0sIFs5LCAxNTM2XSwgWzksIDE2MDBdLCBbOSwgMTcyOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAxOF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs3LCAyNF0sIFs4LCA0OV0sIFs4LCA0OV0sIFs4LCA1MF0sIFs4LCA1MF0sIFs4LCA1MV0sIFs4LCA1MV0sIFs4LCA1Ml0sIFs4LCA1Ml0sIFs3LCAyNV0sIFs3LCAyNV0sIFs3LCAyNV0sIFs3LCAyNV0sIFs4LCA1NV0sIFs4LCA1NV0sIFs4LCA1Nl0sIFs4LCA1Nl0sIFs4LCA1N10sIFs4LCA1N10sIFs4LCA1OF0sIFs4LCA1OF0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs4LCA0NDhdLCBbOCwgNDQ4XSwgWzgsIDUxMl0sIFs4LCA1MTJdLCBbOSwgNzA0XSwgWzksIDc2OF0sIFs4LCA2NDBdLCBbOCwgNjQwXSwgWzgsIDU3Nl0sIFs4LCA1NzZdLCBbOSwgODMyXSwgWzksIDg5Nl0sIFs5LCA5NjBdLCBbOSwgMTAyNF0sIFs5LCAxMDg4XSwgWzksIDExNTJdLCBbOSwgMTIxNl0sIFs5LCAxMjgwXSwgWzksIDEzNDRdLCBbOSwgMTQwOF0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzYsIDE3XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNiwgMTVdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN11dOworICBjb25zdCBibGFja1RhYmxlMSA9IFtbLTEsIC0xXSwgWy0xLCAtMV0sIFsxMiwgY2NpdHRFT0xdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMiwgMTk4NF0sIFsxMiwgMTk4NF0sIFsxMiwgMjA0OF0sIFsxMiwgMjA0OF0sIFsxMiwgMjExMl0sIFsxMiwgMjExMl0sIFsxMiwgMjE3Nl0sIFsxMiwgMjE3Nl0sIFsxMiwgMjI0MF0sIFsxMiwgMjI0MF0sIFsxMiwgMjMwNF0sIFsxMiwgMjMwNF0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTkyMF0sIFsxMSwgMTkyMF0sIFsxMSwgMTkyMF0sIFsxMSwgMTkyMF0sIFsxMiwgMjM2OF0sIFsxMiwgMjM2OF0sIFsxMiwgMjQzMl0sIFsxMiwgMjQzMl0sIFsxMiwgMjQ5Nl0sIFsxMiwgMjQ5Nl0sIFsxMiwgMjU2MF0sIFsxMiwgMjU2MF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEyLCA1Ml0sIFsxMiwgNTJdLCBbMTMsIDY0MF0sIFsxMywgNzA0XSwgWzEzLCA3NjhdLCBbMTMsIDgzMl0sIFsxMiwgNTVdLCBbMTIsIDU1XSwgWzEyLCA1Nl0sIFsxMiwgNTZdLCBbMTMsIDEyODBdLCBbMTMsIDEzNDRdLCBbMTMsIDE0MDhdLCBbMTMsIDE0NzJdLCBbMTIsIDU5XSwgWzEyLCA1OV0sIFsxMiwgNjBdLCBbMTIsIDYwXSwgWzEzLCAxNTM2XSwgWzEzLCAxNjAwXSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTMsIDE2NjRdLCBbMTMsIDE3MjhdLCBbMTIsIDMyMF0sIFsxMiwgMzIwXSwgWzEyLCAzODRdLCBbMTIsIDM4NF0sIFsxMiwgNDQ4XSwgWzEyLCA0NDhdLCBbMTMsIDUxMl0sIFsxMywgNTc2XSwgWzEyLCA1M10sIFsxMiwgNTNdLCBbMTIsIDU0XSwgWzEyLCA1NF0sIFsxMywgODk2XSwgWzEzLCA5NjBdLCBbMTMsIDEwMjRdLCBbMTMsIDEwODhdLCBbMTMsIDExNTJdLCBbMTMsIDEyMTZdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF1dOworICBjb25zdCBibGFja1RhYmxlMiA9IFtbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbMTEsIDIzXSwgWzExLCAyM10sIFsxMiwgNTBdLCBbMTIsIDUxXSwgWzEyLCA0NF0sIFsxMiwgNDVdLCBbMTIsIDQ2XSwgWzEyLCA0N10sIFsxMiwgNTddLCBbMTIsIDU4XSwgWzEyLCA2MV0sIFsxMiwgMjU2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTIsIDQ4XSwgWzEyLCA0OV0sIFsxMiwgNjJdLCBbMTIsIDYzXSwgWzEyLCAzMF0sIFsxMiwgMzFdLCBbMTIsIDMyXSwgWzEyLCAzM10sIFsxMiwgNDBdLCBbMTIsIDQxXSwgWzExLCAyMl0sIFsxMSwgMjJdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbMTIsIDEyOF0sIFsxMiwgMTkyXSwgWzEyLCAyNl0sIFsxMiwgMjddLCBbMTIsIDI4XSwgWzEyLCAyOV0sIFsxMSwgMTldLCBbMTEsIDE5XSwgWzExLCAyMF0sIFsxMSwgMjBdLCBbMTIsIDM0XSwgWzEyLCAzNV0sIFsxMiwgMzZdLCBbMTIsIDM3XSwgWzEyLCAzOF0sIFsxMiwgMzldLCBbMTEsIDIxXSwgWzExLCAyMV0sIFsxMiwgNDJdLCBbMTIsIDQzXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzEwLCAwXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXV07CisgIGNvbnN0IGJsYWNrVGFibGUzID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbNiwgOV0sIFs2LCA4XSwgWzUsIDddLCBbNSwgN10sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdXTsKKworICBmdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoc291cmNlLCBvcHRpb25zID0ge30pIHsKKyAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlLm5leHQgIT09ICJmdW5jdGlvbiIpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignQ0NJVFRGYXhEZWNvZGVyIC0gaW52YWxpZCAic291cmNlIiBwYXJhbWV0ZXIuJyk7CisgICAgfQorCisgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgdGhpcy5lb2YgPSBmYWxzZTsKKyAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5LIHx8IDA7CisgICAgdGhpcy5lb2xpbmUgPSBvcHRpb25zLkVuZE9mTGluZSB8fCBmYWxzZTsKKyAgICB0aGlzLmJ5dGVBbGlnbiA9IG9wdGlvbnMuRW5jb2RlZEJ5dGVBbGlnbiB8fCBmYWxzZTsKKyAgICB0aGlzLmNvbHVtbnMgPSBvcHRpb25zLkNvbHVtbnMgfHwgMTcyODsKKyAgICB0aGlzLnJvd3MgPSBvcHRpb25zLlJvd3MgfHwgMDsKKyAgICBsZXQgZW9ibG9jayA9IG9wdGlvbnMuRW5kT2ZCbG9jazsKKworICAgIGlmIChlb2Jsb2NrID09PSBudWxsIHx8IGVvYmxvY2sgPT09IHVuZGVmaW5lZCkgeworICAgICAgZW9ibG9jayA9IHRydWU7CisgICAgfQorCisgICAgdGhpcy5lb2Jsb2NrID0gZW9ibG9jazsKKyAgICB0aGlzLmJsYWNrID0gb3B0aW9ucy5CbGFja0lzMSB8fCBmYWxzZTsKKyAgICB0aGlzLmNvZGluZ0xpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMSk7CisgICAgdGhpcy5yZWZMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDIpOworICAgIHRoaXMuY29kaW5nTGluZVswXSA9IHRoaXMuY29sdW1uczsKKyAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CisgICAgdGhpcy5yb3cgPSAwOworICAgIHRoaXMubmV4dExpbmUyRCA9IHRoaXMuZW5jb2RpbmcgPCAwOworICAgIHRoaXMuaW5wdXRCaXRzID0gMDsKKyAgICB0aGlzLmlucHV0QnVmID0gMDsKKyAgICB0aGlzLm91dHB1dEJpdHMgPSAwOworICAgIHRoaXMucm93c0RvbmUgPSBmYWxzZTsKKyAgICBsZXQgY29kZTE7CisKKyAgICB3aGlsZSAoKGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpKSA9PT0gMCkgeworICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICB9CisKKyAgICBpZiAoY29kZTEgPT09IDEpIHsKKyAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworICAgIH0KKworICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkgeworICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOworCisgICAgICB0aGlzLl9lYXRCaXRzKDEpOworICAgIH0KKyAgfQorCisgIENDSVRURmF4RGVjb2Rlci5wcm90b3R5cGUgPSB7CisgICAgcmVhZE5leHRDaGFyKCkgeworICAgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgY29uc3QgcmVmTGluZSA9IHRoaXMucmVmTGluZTsKKyAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CisgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOworICAgICAgbGV0IHJlZlBvcywgYmxhY2tQaXhlbHMsIGJpdHMsIGk7CisKKyAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDApIHsKKyAgICAgICAgaWYgKHRoaXMucm93c0RvbmUpIHsKKyAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmVyciA9IGZhbHNlOworICAgICAgICBsZXQgY29kZTEsIGNvZGUyLCBjb2RlMzsKKworICAgICAgICBpZiAodGhpcy5uZXh0TGluZTJEKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgY29kaW5nTGluZVtpXSA8IGNvbHVtbnM7ICsraSkgeworICAgICAgICAgICAgcmVmTGluZVtpXSA9IGNvZGluZ0xpbmVbaV07CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVmTGluZVtpKytdID0gY29sdW1uczsKKyAgICAgICAgICByZWZMaW5lW2ldID0gY29sdW1uczsKKyAgICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKKyAgICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CisgICAgICAgICAgcmVmUG9zID0gMDsKKyAgICAgICAgICBibGFja1BpeGVscyA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2dldFR3b0RpbUNvZGUoKTsKKworICAgICAgICAgICAgc3dpdGNoIChjb2RlMSkgeworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVBhc3M6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zICsgMV0sIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWZMaW5lW3JlZlBvcyArIDFdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1Ib3JpejoKKyAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUyID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgeworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworCisgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CisgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKKyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMiwgYmxhY2tQaXhlbHMgXiAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIzOgorICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAzLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOworCisgICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRSMjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdICsgMiwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjE6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICArK3JlZlBvczsKKworICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydDA6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDM6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDMsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDI6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDIsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDE6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLXJlZlBvczsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBjY2l0dEVPRjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoImJhZCAyZCBjb2RlIik7CisKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVyciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOworICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKKyAgICAgICAgICBibGFja1BpeGVscyA9IDA7CisKKyAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICBjb2RlMSA9IDA7CisKKyAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgeworICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CisgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsZXQgZ290RU9MID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHRoaXMuYnl0ZUFsaWduKSB7CisgICAgICAgICAgdGhpcy5pbnB1dEJpdHMgJj0gfjc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuZW9ibG9jayAmJiB0aGlzLnJvdyA9PT0gdGhpcy5yb3dzIC0gMSkgeworICAgICAgICAgIHRoaXMucm93c0RvbmUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOworCisgICAgICAgICAgaWYgKHRoaXMuZW9saW5lKSB7CisgICAgICAgICAgICB3aGlsZSAoY29kZTEgIT09IGNjaXR0RU9GICYmIGNvZGUxICE9PSAxKSB7CisgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdoaWxlIChjb2RlMSA9PT0gMCkgeworICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjb2RlMSA9PT0gMSkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICAgIGdvdEVPTCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuZW9mICYmIHRoaXMuZW5jb2RpbmcgPiAwICYmICF0aGlzLnJvd3NEb25lKSB7CisgICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOworCisgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmVvYmxvY2sgJiYgZ290RU9MICYmIHRoaXMuYnl0ZUFsaWduKSB7CisgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICBpZiAoY29kZTEgPT09IDEpIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworCisgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7CisKKyAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPj0gMCkgeworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHsKKyAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIHJ0YyBjb2RlOiAiICsgY29kZTEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKKworICAgICAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVyciAmJiB0aGlzLmVvbGluZSkgeworICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKKworICAgICAgICAgICAgaWYgKGNvZGUxID09PSBjY2l0dEVPRikgeworICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGUxID4+IDEgPT09IDEpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgIHRoaXMubmV4dExpbmUyRCA9ICEoY29kZTEgJiAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kaW5nTGluZVswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zID0gMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyA9IDFdOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5yb3crKzsKKyAgICAgIH0KKworICAgICAgbGV0IGM7CisKKyAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPj0gOCkgeworICAgICAgICBjID0gdGhpcy5jb2RpbmdQb3MgJiAxID8gMCA6IDB4ZmY7CisgICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSA4OworCisgICAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDAgJiYgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYml0cyA9IDg7CisgICAgICAgIGMgPSAwOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykgeworICAgICAgICAgICAgYyA8PD0gYml0czsKKworICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgeworICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIGJpdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyAtPSBiaXRzOworICAgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMgPDw9IHRoaXMub3V0cHV0Qml0czsKKworICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgeworICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIHRoaXMub3V0cHV0Qml0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0cyAtPSB0aGlzLm91dHB1dEJpdHM7CisgICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSAwOworCisgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgIHRoaXMuY29kaW5nUG9zKys7CisgICAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdOworICAgICAgICAgICAgfSBlbHNlIGlmIChiaXRzID4gMCkgeworICAgICAgICAgICAgICBjIDw8PSBiaXRzOworICAgICAgICAgICAgICBiaXRzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGJpdHMpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5ibGFjaykgeworICAgICAgICBjIF49IDB4ZmY7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjOworICAgIH0sCisKKyAgICBfYWRkUGl4ZWxzKGExLCBibGFja1BpeGVscykgeworICAgICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKKyAgICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvczsKKworICAgICAgaWYgKGExID4gY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7CisgICAgICAgIGlmIChhMSA+IHRoaXMuY29sdW1ucykgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgicm93IGlzIHdyb25nIGxlbmd0aCIpOworICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKKyAgICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RpbmdQb3MgJiAxIF4gYmxhY2tQaXhlbHMpIHsKKyAgICAgICAgICArK2NvZGluZ1BvczsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOworICAgICAgfQorCisgICAgICB0aGlzLmNvZGluZ1BvcyA9IGNvZGluZ1BvczsKKyAgICB9LAorCisgICAgX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHsKKyAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CisgICAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CisKKyAgICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkgeworICAgICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKTsKKyAgICAgICAgICB0aGlzLmVyciA9IHRydWU7CisgICAgICAgICAgYTEgPSB0aGlzLmNvbHVtbnM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kaW5nUG9zICYgMSBeIGJsYWNrUGl4ZWxzKSB7CisgICAgICAgICAgKytjb2RpbmdQb3M7CisgICAgICAgIH0KKworICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTsKKyAgICAgIH0gZWxzZSBpZiAoYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKKyAgICAgICAgaWYgKGExIDwgMCkgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiaW52YWxpZCBjb2RlIik7CisgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOworICAgICAgICAgIGExID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChjb2RpbmdQb3MgPiAwICYmIGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3MgLSAxXSkgeworICAgICAgICAgIC0tY29kaW5nUG9zOworICAgICAgICB9CisKKyAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zOworICAgIH0sCisKKyAgICBfZmluZFRhYmxlQ29kZShzdGFydCwgZW5kLCB0YWJsZSwgbGltaXQpIHsKKyAgICAgIGNvbnN0IGxpbWl0VmFsdWUgPSBsaW1pdCB8fCAwOworCisgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKKyAgICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTsKKworICAgICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICByZXR1cm4gW3RydWUsIDEsIGZhbHNlXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgZW5kKSB7CisgICAgICAgICAgY29kZSA8PD0gZW5kIC0gaTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHsKKyAgICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdOworCisgICAgICAgICAgaWYgKHBbMF0gPT09IGkpIHsKKyAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoaSk7CisKKyAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgcFsxXSwgdHJ1ZV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTsKKyAgICB9LAorCisgICAgX2dldFR3b0RpbUNvZGUoKSB7CisgICAgICBsZXQgY29kZSA9IDA7CisgICAgICBsZXQgcDsKKworICAgICAgaWYgKHRoaXMuZW9ibG9jaykgeworICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoNyk7CisgICAgICAgIHAgPSB0d29EaW1UYWJsZVtjb2RlXTsKKworICAgICAgICBpZiAocCAmJiBwWzBdID4gMCkgeworICAgICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CisKKyAgICAgICAgICByZXR1cm4gcFsxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA3LCB0d29EaW1UYWJsZSk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSAmJiByZXN1bHRbMl0pIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiQmFkIHR3byBkaW0gY29kZSIpOworICAgICAgcmV0dXJuIGNjaXR0RU9GOworICAgIH0sCisKKyAgICBfZ2V0V2hpdGVDb2RlKCkgeworICAgICAgbGV0IGNvZGUgPSAwOworICAgICAgbGV0IHA7CisKKyAgICAgIGlmICh0aGlzLmVvYmxvY2spIHsKKyAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKKworICAgICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RlID4+IDUgPT09IDApIHsKKyAgICAgICAgICBwID0gd2hpdGVUYWJsZTFbY29kZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcCA9IHdoaXRlVGFibGUyW2NvZGUgPj4gM107CisgICAgICAgIH0KKworICAgICAgICBpZiAocFswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOworCisgICAgICAgICAgcmV0dXJuIHBbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsIDEyLCB3aGl0ZVRhYmxlMSk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJiYWQgd2hpdGUgY29kZSIpOworCisgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICByZXR1cm4gMTsKKyAgICB9LAorCisgICAgX2dldEJsYWNrQ29kZSgpIHsKKyAgICAgIGxldCBjb2RlLCBwOworCisgICAgICBpZiAodGhpcy5lb2Jsb2NrKSB7CisgICAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMyk7CisKKyAgICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kZSA+PiA3ID09PSAwKSB7CisgICAgICAgICAgcCA9IGJsYWNrVGFibGUxW2NvZGVdOworICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPj4gOSA9PT0gMCAmJiBjb2RlID4+IDcgIT09IDApIHsKKyAgICAgICAgICBwID0gYmxhY2tUYWJsZTJbKGNvZGUgPj4gMSkgLSA2NF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcCA9IGJsYWNrVGFibGUzW2NvZGUgPj4gN107CisgICAgICAgIH0KKworICAgICAgICBpZiAocFswXSA+IDApIHsKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOworCisgICAgICAgICAgcmV0dXJuIHBbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDIsIDYsIGJsYWNrVGFibGUzKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoNywgMTIsIGJsYWNrVGFibGUyLCA2NCk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEwLCAxMywgYmxhY2tUYWJsZTEpOworCisgICAgICAgIGlmIChyZXN1bHRbMF0pIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIGJsYWNrIGNvZGUiKTsKKworICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKworICAgICAgcmV0dXJuIDE7CisgICAgfSwKKworICAgIF9sb29rQml0cyhuKSB7CisgICAgICBsZXQgYzsKKworICAgICAgd2hpbGUgKHRoaXMuaW5wdXRCaXRzIDwgbikgeworICAgICAgICBpZiAoKGMgPSB0aGlzLnNvdXJjZS5uZXh0KCkpID09PSAtMSkgeworICAgICAgICAgIGlmICh0aGlzLmlucHV0Qml0cyA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNjaXR0RU9GOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0QnVmIDw8IG4gLSB0aGlzLmlucHV0Qml0cyAmIDB4ZmZmZiA+PiAxNiAtIG47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmlucHV0QnVmID0gdGhpcy5pbnB1dEJ1ZiA8PCA4IHwgYzsKKyAgICAgICAgdGhpcy5pbnB1dEJpdHMgKz0gODsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuaW5wdXRCdWYgPj4gdGhpcy5pbnB1dEJpdHMgLSBuICYgMHhmZmZmID4+IDE2IC0gbjsKKyAgICB9LAorCisgICAgX2VhdEJpdHMobikgeworICAgICAgaWYgKCh0aGlzLmlucHV0Qml0cyAtPSBuKSA8IDApIHsKKyAgICAgICAgdGhpcy5pbnB1dEJpdHMgPSAwOworICAgICAgfQorICAgIH0KKworICB9OworICByZXR1cm4gQ0NJVFRGYXhEZWNvZGVyOworfSgpOworCitleHBvcnRzLkNDSVRURmF4RGVjb2RlciA9IENDSVRURmF4RGVjb2RlcjsKKworLyoqKi8gfSksCisvKiA4ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSnBlZ0ltYWdlID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpOworCit2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCitjbGFzcyBKcGVnRXJyb3IgZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnKSB7CisgICAgc3VwZXIoYEpQRUcgZXJyb3I6ICR7bXNnfWApOworICB9CisKK30KKworY2xhc3MgRE5MTWFya2VyRXJyb3IgZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobWVzc2FnZSwgc2NhbkxpbmVzKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgICAgdGhpcy5zY2FuTGluZXMgPSBzY2FuTGluZXM7CisgIH0KKworfQorCitjbGFzcyBFT0lNYXJrZXJFcnJvciBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24ge30KKwordmFyIEpwZWdJbWFnZSA9IGZ1bmN0aW9uIEpwZWdJbWFnZUNsb3N1cmUoKSB7CisgIHZhciBkY3RaaWdaYWcgPSBuZXcgVWludDhBcnJheShbMCwgMSwgOCwgMTYsIDksIDIsIDMsIDEwLCAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCA0LCA1LCAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsIDI3LCAyMCwgMTMsIDYsIDcsIDE0LCAyMSwgMjgsIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLCA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2M10pOworICB2YXIgZGN0Q29zMSA9IDQwMTc7CisgIHZhciBkY3RTaW4xID0gNzk5OworICB2YXIgZGN0Q29zMyA9IDM0MDY7CisgIHZhciBkY3RTaW4zID0gMjI3NjsKKyAgdmFyIGRjdENvczYgPSAxNTY3OworICB2YXIgZGN0U2luNiA9IDM3ODQ7CisgIHZhciBkY3RTcXJ0MiA9IDU3OTM7CisgIHZhciBkY3RTcXJ0MWQyID0gMjg5NjsKKworICBmdW5jdGlvbiBKcGVnSW1hZ2UoeworICAgIGRlY29kZVRyYW5zZm9ybSA9IG51bGwsCisgICAgY29sb3JUcmFuc2Zvcm0gPSAtMQorICB9ID0ge30pIHsKKyAgICB0aGlzLl9kZWNvZGVUcmFuc2Zvcm0gPSBkZWNvZGVUcmFuc2Zvcm07CisgICAgdGhpcy5fY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCB2YWx1ZXMpIHsKKyAgICB2YXIgayA9IDAsCisgICAgICAgIGNvZGUgPSBbXSwKKyAgICAgICAgaSwKKyAgICAgICAgaiwKKyAgICAgICAgbGVuZ3RoID0gMTY7CisKKyAgICB3aGlsZSAobGVuZ3RoID4gMCAmJiAhY29kZUxlbmd0aHNbbGVuZ3RoIC0gMV0pIHsKKyAgICAgIGxlbmd0aC0tOworICAgIH0KKworICAgIGNvZGUucHVzaCh7CisgICAgICBjaGlsZHJlbjogW10sCisgICAgICBpbmRleDogMAorICAgIH0pOworICAgIHZhciBwID0gY29kZVswXSwKKyAgICAgICAgcTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGVMZW5ndGhzW2ldOyBqKyspIHsKKyAgICAgICAgcCA9IGNvZGUucG9wKCk7CisgICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSB2YWx1ZXNba107CisKKyAgICAgICAgd2hpbGUgKHAuaW5kZXggPiAwKSB7CisgICAgICAgICAgcCA9IGNvZGUucG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwLmluZGV4Kys7CisgICAgICAgIGNvZGUucHVzaChwKTsKKworICAgICAgICB3aGlsZSAoY29kZS5sZW5ndGggPD0gaSkgeworICAgICAgICAgIGNvZGUucHVzaChxID0geworICAgICAgICAgICAgY2hpbGRyZW46IFtdLAorICAgICAgICAgICAgaW5kZXg6IDAKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKKyAgICAgICAgICBwID0gcTsKKyAgICAgICAgfQorCisgICAgICAgIGsrKzsKKyAgICAgIH0KKworICAgICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7CisgICAgICAgIGNvZGUucHVzaChxID0geworICAgICAgICAgIGNoaWxkcmVuOiBbXSwKKyAgICAgICAgICBpbmRleDogMAorICAgICAgICB9KTsKKyAgICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHEuY2hpbGRyZW47CisgICAgICAgIHAgPSBxOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb2RlWzBdLmNoaWxkcmVuOworICB9CisKKyAgZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkgeworICAgIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlUHJldiwgc3VjY2Vzc2l2ZSwgcGFyc2VETkxNYXJrZXIgPSBmYWxzZSkgeworICAgIHZhciBtY3VzUGVyTGluZSA9IGZyYW1lLm1jdXNQZXJMaW5lOworICAgIHZhciBwcm9ncmVzc2l2ZSA9IGZyYW1lLnByb2dyZXNzaXZlOworICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OworICAgIGxldCBiaXRzRGF0YSA9IDAsCisgICAgICAgIGJpdHNDb3VudCA9IDA7CisKKyAgICBmdW5jdGlvbiByZWFkQml0KCkgeworICAgICAgaWYgKGJpdHNDb3VudCA+IDApIHsKKyAgICAgICAgYml0c0NvdW50LS07CisgICAgICAgIHJldHVybiBiaXRzRGF0YSA+PiBiaXRzQ291bnQgJiAxOworICAgICAgfQorCisgICAgICBiaXRzRGF0YSA9IGRhdGFbb2Zmc2V0KytdOworCisgICAgICBpZiAoYml0c0RhdGEgPT09IDB4ZmYpIHsKKyAgICAgICAgdmFyIG5leHRCeXRlID0gZGF0YVtvZmZzZXQrK107CisKKyAgICAgICAgaWYgKG5leHRCeXRlKSB7CisgICAgICAgICAgaWYgKG5leHRCeXRlID09PSAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGNvbnN0IHNjYW5MaW5lcyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgICAgICAgIGlmIChzY2FuTGluZXMgPiAwICYmIHNjYW5MaW5lcyAhPT0gZnJhbWUuc2NhbkxpbmVzKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRE5MIG1hcmtlciAoMHhGRkRDKSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIsIHNjYW5MaW5lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Qnl0ZSA9PT0gMHhkOSkgeworICAgICAgICAgICAgaWYgKHBhcnNlRE5MTWFya2VyKSB7CisgICAgICAgICAgICAgIGNvbnN0IG1heWJlU2NhbkxpbmVzID0gYmxvY2tSb3cgKiAoZnJhbWUucHJlY2lzaW9uID09PSA4ID8gOCA6IDApOworCisgICAgICAgICAgICAgIGlmIChtYXliZVNjYW5MaW5lcyA+IDAgJiYgTWF0aC5yb3VuZChmcmFtZS5zY2FuTGluZXMgLyBtYXliZVNjYW5MaW5lcykgPj0gMTApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEsICIgKyAicG9zc2libHkgY2F1c2VkIGJ5IGluY29ycmVjdCBgc2NhbkxpbmVzYCBwYXJhbWV0ZXIiLCBtYXliZVNjYW5MaW5lcyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IEVPSU1hcmtlckVycm9yKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihgdW5leHBlY3RlZCBtYXJrZXIgJHsoYml0c0RhdGEgPDwgOCB8IG5leHRCeXRlKS50b1N0cmluZygxNil9YCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYml0c0NvdW50ID0gNzsKKyAgICAgIHJldHVybiBiaXRzRGF0YSA+Pj4gNzsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBkZWNvZGVIdWZmbWFuKHRyZWUpIHsKKyAgICAgIHZhciBub2RlID0gdHJlZTsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgbm9kZSA9IG5vZGVbcmVhZEJpdCgpXTsKKworICAgICAgICBzd2l0Y2ggKHR5cGVvZiBub2RlKSB7CisgICAgICAgICAgY2FzZSAibnVtYmVyIjoKKyAgICAgICAgICAgIHJldHVybiBub2RlOworCisgICAgICAgICAgY2FzZSAib2JqZWN0IjoKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiaW52YWxpZCBodWZmbWFuIHNlcXVlbmNlIik7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVjZWl2ZShsZW5ndGgpIHsKKyAgICAgIHZhciBuID0gMDsKKworICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgbiA9IG4gPDwgMSB8IHJlYWRCaXQoKTsKKyAgICAgICAgbGVuZ3RoLS07CisgICAgICB9CisKKyAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIGZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQobGVuZ3RoKSB7CisgICAgICBpZiAobGVuZ3RoID09PSAxKSB7CisgICAgICAgIHJldHVybiByZWFkQml0KCkgPT09IDEgPyAxIDogLTE7CisgICAgICB9CisKKyAgICAgIHZhciBuID0gcmVjZWl2ZShsZW5ndGgpOworCisgICAgICBpZiAobiA+PSAxIDw8IGxlbmd0aCAtIDEpIHsKKyAgICAgICAgcmV0dXJuIG47CisgICAgICB9CisKKyAgICAgIHJldHVybiBuICsgKC0xIDw8IGxlbmd0aCkgKyAxOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZUJhc2VsaW5lKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIHZhciB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpOworICAgICAgdmFyIGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCk7CisgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CisgICAgICB2YXIgayA9IDE7CisKKyAgICAgIHdoaWxlIChrIDwgNjQpIHsKKyAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOworICAgICAgICB2YXIgcyA9IHJzICYgMTUsCisgICAgICAgICAgICByID0gcnMgPj4gNDsKKworICAgICAgICBpZiAocyA9PT0gMCkgeworICAgICAgICAgIGlmIChyIDwgMTUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGsgKz0gMTY7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBrICs9IHI7CisgICAgICAgIHZhciB6ID0gZGN0WmlnWmFnW2tdOworICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0ICsgel0gPSByZWNlaXZlQW5kRXh0ZW5kKHMpOworICAgICAgICBrKys7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlRENGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICB2YXIgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKKyAgICAgIHZhciBkaWZmID0gdCA9PT0gMCA/IDAgOiByZWNlaXZlQW5kRXh0ZW5kKHQpIDw8IHN1Y2Nlc3NpdmU7CisgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlRENTdWNjZXNzaXZlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdIHw9IHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlOworICAgIH0KKworICAgIHZhciBlb2JydW4gPSAwOworCisgICAgZnVuY3Rpb24gZGVjb2RlQUNGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICBpZiAoZW9icnVuID4gMCkgeworICAgICAgICBlb2JydW4tLTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQsCisgICAgICAgICAgZSA9IHNwZWN0cmFsRW5kOworCisgICAgICB3aGlsZSAoayA8PSBlKSB7CisgICAgICAgIHZhciBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKKyAgICAgICAgdmFyIHMgPSBycyAmIDE1LAorICAgICAgICAgICAgciA9IHJzID4+IDQ7CisKKyAgICAgICAgaWYgKHMgPT09IDApIHsKKyAgICAgICAgICBpZiAociA8IDE1KSB7CisgICAgICAgICAgICBlb2JydW4gPSByZWNlaXZlKHIpICsgKDEgPDwgcikgLSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgayArPSAxNjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGsgKz0gcjsKKyAgICAgICAgdmFyIHogPSBkY3RaaWdaYWdba107CisgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocykgKiAoMSA8PCBzdWNjZXNzaXZlKTsKKyAgICAgICAgaysrOworICAgICAgfQorICAgIH0KKworICAgIHZhciBzdWNjZXNzaXZlQUNTdGF0ZSA9IDAsCisgICAgICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZTsKKworICAgIGZ1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CisgICAgICB2YXIgayA9IHNwZWN0cmFsU3RhcnQ7CisgICAgICB2YXIgZSA9IHNwZWN0cmFsRW5kOworICAgICAgdmFyIHIgPSAwOworICAgICAgdmFyIHM7CisgICAgICB2YXIgcnM7CisKKyAgICAgIHdoaWxlIChrIDw9IGUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0WiA9IGJsb2NrT2Zmc2V0ICsgZGN0WmlnWmFnW2tdOworICAgICAgICBjb25zdCBzaWduID0gY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA8IDAgPyAtMSA6IDE7CisKKyAgICAgICAgc3dpdGNoIChzdWNjZXNzaXZlQUNTdGF0ZSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOworICAgICAgICAgICAgcyA9IHJzICYgMTU7CisgICAgICAgICAgICByID0gcnMgPj4gNDsKKworICAgICAgICAgICAgaWYgKHMgPT09IDApIHsKKyAgICAgICAgICAgICAgaWYgKHIgPCAxNSkgeworICAgICAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKTsKKyAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDQ7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgciA9IDE2OworICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHMgIT09IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIEFDbiBlbmNvZGluZyIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTsKKyAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CisgICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByLS07CisKKyAgICAgICAgICAgICAgaWYgKHIgPT09IDApIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSAyID8gMyA6IDA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkgeworICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA9IHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZSA8PCBzdWNjZXNzaXZlOworICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBrKys7CisgICAgICB9CisKKyAgICAgIGlmIChzdWNjZXNzaXZlQUNTdGF0ZSA9PT0gNCkgeworICAgICAgICBlb2JydW4tLTsKKworICAgICAgICBpZiAoZW9icnVuID09PSAwKSB7CisgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgbGV0IGJsb2NrUm93ID0gMDsKKworICAgIGZ1bmN0aW9uIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZSwgbWN1LCByb3csIGNvbCkgeworICAgICAgdmFyIG1jdVJvdyA9IG1jdSAvIG1jdXNQZXJMaW5lIHwgMDsKKyAgICAgIHZhciBtY3VDb2wgPSBtY3UgJSBtY3VzUGVyTGluZTsKKyAgICAgIGJsb2NrUm93ID0gbWN1Um93ICogY29tcG9uZW50LnYgKyByb3c7CisgICAgICB2YXIgYmxvY2tDb2wgPSBtY3VDb2wgKiBjb21wb25lbnQuaCArIGNvbDsKKyAgICAgIGNvbnN0IGJsb2NrT2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpOworICAgICAgZGVjb2RlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlLCBtY3UpIHsKKyAgICAgIGJsb2NrUm93ID0gbWN1IC8gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgfCAwOworICAgICAgdmFyIGJsb2NrQ29sID0gbWN1ICUgY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7CisgICAgICBjb25zdCBibG9ja09mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKKyAgICAgIGRlY29kZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KTsKKyAgICB9CisKKyAgICB2YXIgY29tcG9uZW50c0xlbmd0aCA9IGNvbXBvbmVudHMubGVuZ3RoOworICAgIHZhciBjb21wb25lbnQsIGksIGosIGssIG47CisgICAgdmFyIGRlY29kZUZuOworCisgICAgaWYgKHByb2dyZXNzaXZlKSB7CisgICAgICBpZiAoc3BlY3RyYWxTdGFydCA9PT0gMCkgeworICAgICAgICBkZWNvZGVGbiA9IHN1Y2Nlc3NpdmVQcmV2ID09PSAwID8gZGVjb2RlRENGaXJzdCA6IGRlY29kZURDU3VjY2Vzc2l2ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVBQ0ZpcnN0IDogZGVjb2RlQUNTdWNjZXNzaXZlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBkZWNvZGVGbiA9IGRlY29kZUJhc2VsaW5lOworICAgIH0KKworICAgIHZhciBtY3UgPSAwLAorICAgICAgICBmaWxlTWFya2VyOworICAgIHZhciBtY3VFeHBlY3RlZDsKKworICAgIGlmIChjb21wb25lbnRzTGVuZ3RoID09PSAxKSB7CisgICAgICBtY3VFeHBlY3RlZCA9IGNvbXBvbmVudHNbMF0uYmxvY2tzUGVyTGluZSAqIGNvbXBvbmVudHNbMF0uYmxvY2tzUGVyQ29sdW1uOworICAgIH0gZWxzZSB7CisgICAgICBtY3VFeHBlY3RlZCA9IG1jdXNQZXJMaW5lICogZnJhbWUubWN1c1BlckNvbHVtbjsKKyAgICB9CisKKyAgICB2YXIgaCwgdjsKKworICAgIHdoaWxlIChtY3UgPD0gbWN1RXhwZWN0ZWQpIHsKKyAgICAgIHZhciBtY3VUb1JlYWQgPSByZXNldEludGVydmFsID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpIDogbWN1RXhwZWN0ZWQ7CisKKyAgICAgIGlmIChtY3VUb1JlYWQgPiAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBjb21wb25lbnRzW2ldLnByZWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgZW9icnVuID0gMDsKKworICAgICAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkgeworICAgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbMF07CisKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHsKKyAgICAgICAgICAgIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlRm4sIG1jdSk7CisgICAgICAgICAgICBtY3UrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG1jdVRvUmVhZDsgbisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07CisgICAgICAgICAgICAgIGggPSBjb21wb25lbnQuaDsKKyAgICAgICAgICAgICAgdiA9IGNvbXBvbmVudC52OworCisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2OyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaDsgaysrKSB7CisgICAgICAgICAgICAgICAgICBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1LCBqLCBrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWN1Kys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJpdHNDb3VudCA9IDA7CisgICAgICBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIG9mZnNldCk7CisKKyAgICAgIGlmICghZmlsZU1hcmtlcikgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkgeworICAgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/ICJ1bmV4cGVjdGVkIiA6ICJleGNlc3NpdmUiOworICAgICAgICAoMCwgX3V0aWwud2FybikoYGRlY29kZVNjYW4gLSAke3BhcnRpYWxNc2d9IE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogJHtmaWxlTWFya2VyLmludmFsaWR9YCk7CisgICAgICAgIG9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0OworICAgICAgfQorCisgICAgICBpZiAoZmlsZU1hcmtlci5tYXJrZXIgPj0gMHhmZmQwICYmIGZpbGVNYXJrZXIubWFya2VyIDw9IDB4ZmZkNykgeworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDsKKyAgfQorCisgIGZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIGJsb2NrQnVmZmVyT2Zmc2V0LCBwKSB7CisgICAgdmFyIHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLAorICAgICAgICBibG9ja0RhdGEgPSBjb21wb25lbnQuYmxvY2tEYXRhOworICAgIHZhciB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2Niwgdjc7CisgICAgdmFyIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNzsKKyAgICB2YXIgdDsKKworICAgIGlmICghcXQpIHsKKyAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpOworICAgIH0KKworICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IDY0OyByb3cgKz0gOCkgeworICAgICAgcDAgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3ddOworICAgICAgcDEgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAxXTsKKyAgICAgIHAyID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMl07CisgICAgICBwMyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDNdOworICAgICAgcDQgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA0XTsKKyAgICAgIHA1ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNV07CisgICAgICBwNiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDZdOworICAgICAgcDcgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA3XTsKKyAgICAgIHAwICo9IHF0W3Jvd107CisKKyAgICAgIGlmICgocDEgfCBwMiB8IHAzIHwgcDQgfCBwNSB8IHA2IHwgcDcpID09PSAwKSB7CisgICAgICAgIHQgPSBkY3RTcXJ0MiAqIHAwICsgNTEyID4+IDEwOworICAgICAgICBwW3Jvd10gPSB0OworICAgICAgICBwW3JvdyArIDFdID0gdDsKKyAgICAgICAgcFtyb3cgKyAyXSA9IHQ7CisgICAgICAgIHBbcm93ICsgM10gPSB0OworICAgICAgICBwW3JvdyArIDRdID0gdDsKKyAgICAgICAgcFtyb3cgKyA1XSA9IHQ7CisgICAgICAgIHBbcm93ICsgNl0gPSB0OworICAgICAgICBwW3JvdyArIDddID0gdDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHAxICo9IHF0W3JvdyArIDFdOworICAgICAgcDIgKj0gcXRbcm93ICsgMl07CisgICAgICBwMyAqPSBxdFtyb3cgKyAzXTsKKyAgICAgIHA0ICo9IHF0W3JvdyArIDRdOworICAgICAgcDUgKj0gcXRbcm93ICsgNV07CisgICAgICBwNiAqPSBxdFtyb3cgKyA2XTsKKyAgICAgIHA3ICo9IHF0W3JvdyArIDddOworICAgICAgdjAgPSBkY3RTcXJ0MiAqIHAwICsgMTI4ID4+IDg7CisgICAgICB2MSA9IGRjdFNxcnQyICogcDQgKyAxMjggPj4gODsKKyAgICAgIHYyID0gcDI7CisgICAgICB2MyA9IHA2OworICAgICAgdjQgPSBkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMTI4ID4+IDg7CisgICAgICB2NyA9IGRjdFNxcnQxZDIgKiAocDEgKyBwNykgKyAxMjggPj4gODsKKyAgICAgIHY1ID0gcDMgPDwgNDsKKyAgICAgIHY2ID0gcDUgPDwgNDsKKyAgICAgIHYwID0gdjAgKyB2MSArIDEgPj4gMTsKKyAgICAgIHYxID0gdjAgLSB2MTsKKyAgICAgIHQgPSB2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAxMjggPj4gODsKKyAgICAgIHYyID0gdjIgKiBkY3RDb3M2IC0gdjMgKiBkY3RTaW42ICsgMTI4ID4+IDg7CisgICAgICB2MyA9IHQ7CisgICAgICB2NCA9IHY0ICsgdjYgKyAxID4+IDE7CisgICAgICB2NiA9IHY0IC0gdjY7CisgICAgICB2NyA9IHY3ICsgdjUgKyAxID4+IDE7CisgICAgICB2NSA9IHY3IC0gdjU7CisgICAgICB2MCA9IHYwICsgdjMgKyAxID4+IDE7CisgICAgICB2MyA9IHYwIC0gdjM7CisgICAgICB2MSA9IHYxICsgdjIgKyAxID4+IDE7CisgICAgICB2MiA9IHYxIC0gdjI7CisgICAgICB0ID0gdjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCA+PiAxMjsKKyAgICAgIHY0ID0gdjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCA+PiAxMjsKKyAgICAgIHY3ID0gdDsKKyAgICAgIHQgPSB2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4ID4+IDEyOworICAgICAgdjUgPSB2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4ID4+IDEyOworICAgICAgdjYgPSB0OworICAgICAgcFtyb3ddID0gdjAgKyB2NzsKKyAgICAgIHBbcm93ICsgN10gPSB2MCAtIHY3OworICAgICAgcFtyb3cgKyAxXSA9IHYxICsgdjY7CisgICAgICBwW3JvdyArIDZdID0gdjEgLSB2NjsKKyAgICAgIHBbcm93ICsgMl0gPSB2MiArIHY1OworICAgICAgcFtyb3cgKyA1XSA9IHYyIC0gdjU7CisgICAgICBwW3JvdyArIDNdID0gdjMgKyB2NDsKKyAgICAgIHBbcm93ICsgNF0gPSB2MyAtIHY0OworICAgIH0KKworICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IDg7ICsrY29sKSB7CisgICAgICBwMCA9IHBbY29sXTsKKyAgICAgIHAxID0gcFtjb2wgKyA4XTsKKyAgICAgIHAyID0gcFtjb2wgKyAxNl07CisgICAgICBwMyA9IHBbY29sICsgMjRdOworICAgICAgcDQgPSBwW2NvbCArIDMyXTsKKyAgICAgIHA1ID0gcFtjb2wgKyA0MF07CisgICAgICBwNiA9IHBbY29sICsgNDhdOworICAgICAgcDcgPSBwW2NvbCArIDU2XTsKKworICAgICAgaWYgKChwMSB8IHAyIHwgcDMgfCBwNCB8IHA1IHwgcDYgfCBwNykgPT09IDApIHsKKyAgICAgICAgdCA9IGRjdFNxcnQyICogcDAgKyA4MTkyID4+IDE0OworCisgICAgICAgIGlmICh0IDwgLTIwNDApIHsKKyAgICAgICAgICB0ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh0ID49IDIwMjQpIHsKKyAgICAgICAgICB0ID0gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHQgPSB0ICsgMjA1NiA+PiA0OworICAgICAgICB9CisKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHQ7CisgICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gdDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHYwID0gZGN0U3FydDIgKiBwMCArIDIwNDggPj4gMTI7CisgICAgICB2MSA9IGRjdFNxcnQyICogcDQgKyAyMDQ4ID4+IDEyOworICAgICAgdjIgPSBwMjsKKyAgICAgIHYzID0gcDY7CisgICAgICB2NCA9IGRjdFNxcnQxZDIgKiAocDEgLSBwNykgKyAyMDQ4ID4+IDEyOworICAgICAgdjcgPSBkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMjA0OCA+PiAxMjsKKyAgICAgIHY1ID0gcDM7CisgICAgICB2NiA9IHA1OworICAgICAgdjAgPSAodjAgKyB2MSArIDEgPj4gMSkgKyA0MTEyOworICAgICAgdjEgPSB2MCAtIHYxOworICAgICAgdCA9IHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDIwNDggPj4gMTI7CisgICAgICB2MiA9IHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDIwNDggPj4gMTI7CisgICAgICB2MyA9IHQ7CisgICAgICB2NCA9IHY0ICsgdjYgKyAxID4+IDE7CisgICAgICB2NiA9IHY0IC0gdjY7CisgICAgICB2NyA9IHY3ICsgdjUgKyAxID4+IDE7CisgICAgICB2NSA9IHY3IC0gdjU7CisgICAgICB2MCA9IHYwICsgdjMgKyAxID4+IDE7CisgICAgICB2MyA9IHYwIC0gdjM7CisgICAgICB2MSA9IHYxICsgdjIgKyAxID4+IDE7CisgICAgICB2MiA9IHYxIC0gdjI7CisgICAgICB0ID0gdjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCA+PiAxMjsKKyAgICAgIHY0ID0gdjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCA+PiAxMjsKKyAgICAgIHY3ID0gdDsKKyAgICAgIHQgPSB2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4ID4+IDEyOworICAgICAgdjUgPSB2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4ID4+IDEyOworICAgICAgdjYgPSB0OworICAgICAgcDAgPSB2MCArIHY3OworICAgICAgcDcgPSB2MCAtIHY3OworICAgICAgcDEgPSB2MSArIHY2OworICAgICAgcDYgPSB2MSAtIHY2OworICAgICAgcDIgPSB2MiArIHY1OworICAgICAgcDUgPSB2MiAtIHY1OworICAgICAgcDMgPSB2MyArIHY0OworICAgICAgcDQgPSB2MyAtIHY0OworCisgICAgICBpZiAocDAgPCAxNikgeworICAgICAgICBwMCA9IDA7CisgICAgICB9IGVsc2UgaWYgKHAwID49IDQwODApIHsKKyAgICAgICAgcDAgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwMCA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHAxIDwgMTYpIHsKKyAgICAgICAgcDEgPSAwOworICAgICAgfSBlbHNlIGlmIChwMSA+PSA0MDgwKSB7CisgICAgICAgIHAxID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDEgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwMiA8IDE2KSB7CisgICAgICAgIHAyID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDIgPj0gNDA4MCkgeworICAgICAgICBwMiA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHAyID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDMgPCAxNikgeworICAgICAgICBwMyA9IDA7CisgICAgICB9IGVsc2UgaWYgKHAzID49IDQwODApIHsKKyAgICAgICAgcDMgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwMyA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHA0IDwgMTYpIHsKKyAgICAgICAgcDQgPSAwOworICAgICAgfSBlbHNlIGlmIChwNCA+PSA0MDgwKSB7CisgICAgICAgIHA0ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDQgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwNSA8IDE2KSB7CisgICAgICAgIHA1ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDUgPj0gNDA4MCkgeworICAgICAgICBwNSA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHA1ID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDYgPCAxNikgeworICAgICAgICBwNiA9IDA7CisgICAgICB9IGVsc2UgaWYgKHA2ID49IDQwODApIHsKKyAgICAgICAgcDYgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwNiA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHA3IDwgMTYpIHsKKyAgICAgICAgcDcgPSAwOworICAgICAgfSBlbHNlIGlmIChwNyA+PSA0MDgwKSB7CisgICAgICAgIHA3ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDcgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbF0gPSBwMDsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gcDE7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSBwMjsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDI0XSA9IHAzOworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gcDQ7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSBwNTsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQ4XSA9IHA2OworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gcDc7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpIHsKKyAgICB2YXIgYmxvY2tzUGVyTGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOworICAgIHZhciBibG9ja3NQZXJDb2x1bW4gPSBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uOworICAgIHZhciBjb21wdXRhdGlvbkJ1ZmZlciA9IG5ldyBJbnQxNkFycmF5KDY0KTsKKworICAgIGZvciAodmFyIGJsb2NrUm93ID0gMDsgYmxvY2tSb3cgPCBibG9ja3NQZXJDb2x1bW47IGJsb2NrUm93KyspIHsKKyAgICAgIGZvciAodmFyIGJsb2NrQ29sID0gMDsgYmxvY2tDb2wgPCBibG9ja3NQZXJMaW5lOyBibG9ja0NvbCsrKSB7CisgICAgICAgIHZhciBvZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CisgICAgICAgIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIG9mZnNldCwgY29tcHV0YXRpb25CdWZmZXIpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhOworICB9CisKKyAgZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGN1cnJlbnRQb3MsIHN0YXJ0UG9zID0gY3VycmVudFBvcykgeworICAgIGNvbnN0IG1heFBvcyA9IGRhdGEubGVuZ3RoIC0gMTsKKyAgICB2YXIgbmV3UG9zID0gc3RhcnRQb3MgPCBjdXJyZW50UG9zID8gc3RhcnRQb3MgOiBjdXJyZW50UG9zOworCisgICAgaWYgKGN1cnJlbnRQb3MgPj0gbWF4UG9zKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgY3VycmVudE1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBjdXJyZW50UG9zKTsKKworICAgIGlmIChjdXJyZW50TWFya2VyID49IDB4ZmZjMCAmJiBjdXJyZW50TWFya2VyIDw9IDB4ZmZmZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgaW52YWxpZDogbnVsbCwKKyAgICAgICAgbWFya2VyOiBjdXJyZW50TWFya2VyLAorICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQb3MKKyAgICAgIH07CisgICAgfQorCisgICAgdmFyIG5ld01hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBuZXdQb3MpOworCisgICAgd2hpbGUgKCEobmV3TWFya2VyID49IDB4ZmZjMCAmJiBuZXdNYXJrZXIgPD0gMHhmZmZlKSkgeworICAgICAgaWYgKCsrbmV3UG9zID49IG1heFBvcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgbmV3TWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG5ld1Bvcyk7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGludmFsaWQ6IGN1cnJlbnRNYXJrZXIudG9TdHJpbmcoMTYpLAorICAgICAgbWFya2VyOiBuZXdNYXJrZXIsCisgICAgICBvZmZzZXQ6IG5ld1BvcworICAgIH07CisgIH0KKworICBKcGVnSW1hZ2UucHJvdG90eXBlID0geworICAgIHBhcnNlKGRhdGEsIHsKKyAgICAgIGRubFNjYW5MaW5lcyA9IG51bGwKKyAgICB9ID0ge30pIHsKKyAgICAgIGZ1bmN0aW9uIHJlYWREYXRhQmxvY2soKSB7CisgICAgICAgIGNvbnN0IGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgbGV0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7CisgICAgICAgIHZhciBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGVuZE9mZnNldCwgb2Zmc2V0KTsKKworICAgICAgICBpZiAoZmlsZU1hcmtlciAmJiBmaWxlTWFya2VyLmludmFsaWQpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIiArIGZpbGVNYXJrZXIuaW52YWxpZCk7CisgICAgICAgICAgZW5kT2Zmc2V0ID0gZmlsZU1hcmtlci5vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYXJyYXkgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgZW5kT2Zmc2V0KTsKKyAgICAgICAgb2Zmc2V0ICs9IGFycmF5Lmxlbmd0aDsKKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBwcmVwYXJlQ29tcG9uZW50cyhmcmFtZSkgeworICAgICAgICB2YXIgbWN1c1BlckxpbmUgPSBNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4IC8gZnJhbWUubWF4SCk7CisgICAgICAgIHZhciBtY3VzUGVyQ29sdW1uID0gTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDggLyBmcmFtZS5tYXhWKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2ldOworICAgICAgICAgIHZhciBibG9ja3NQZXJMaW5lID0gTWF0aC5jZWlsKE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDgpICogY29tcG9uZW50LmggLyBmcmFtZS5tYXhIKTsKKyAgICAgICAgICB2YXIgYmxvY2tzUGVyQ29sdW1uID0gTWF0aC5jZWlsKE1hdGguY2VpbChmcmFtZS5zY2FuTGluZXMgLyA4KSAqIGNvbXBvbmVudC52IC8gZnJhbWUubWF4Vik7CisgICAgICAgICAgdmFyIGJsb2Nrc1BlckxpbmVGb3JNY3UgPSBtY3VzUGVyTGluZSAqIGNvbXBvbmVudC5oOworICAgICAgICAgIHZhciBibG9ja3NQZXJDb2x1bW5Gb3JNY3UgPSBtY3VzUGVyQ29sdW1uICogY29tcG9uZW50LnY7CisgICAgICAgICAgdmFyIGJsb2Nrc0J1ZmZlclNpemUgPSA2NCAqIGJsb2Nrc1BlckNvbHVtbkZvck1jdSAqIChibG9ja3NQZXJMaW5lRm9yTWN1ICsgMSk7CisgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YSA9IG5ldyBJbnQxNkFycmF5KGJsb2Nrc0J1ZmZlclNpemUpOworICAgICAgICAgIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lID0gYmxvY2tzUGVyTGluZTsKKyAgICAgICAgICBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uID0gYmxvY2tzUGVyQ29sdW1uOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWUubWN1c1BlckxpbmUgPSBtY3VzUGVyTGluZTsKKyAgICAgICAgZnJhbWUubWN1c1BlckNvbHVtbiA9IG1jdXNQZXJDb2x1bW47CisgICAgICB9CisKKyAgICAgIHZhciBvZmZzZXQgPSAwOworICAgICAgdmFyIGpmaWYgPSBudWxsOworICAgICAgdmFyIGFkb2JlID0gbnVsbDsKKyAgICAgIHZhciBmcmFtZSwgcmVzZXRJbnRlcnZhbDsKKyAgICAgIGxldCBudW1TT1NNYXJrZXJzID0gMDsKKyAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTsKKyAgICAgIHZhciBodWZmbWFuVGFibGVzQUMgPSBbXSwKKyAgICAgICAgICBodWZmbWFuVGFibGVzREMgPSBbXTsKKyAgICAgIGxldCBmaWxlTWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgaWYgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOCkgeworICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJTT0kgbm90IGZvdW5kIik7CisgICAgICB9CisKKyAgICAgIGZpbGVNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCArPSAyOworCisgICAgICBtYXJrZXJMb29wOiB3aGlsZSAoZmlsZU1hcmtlciAhPT0gMHhmZmQ5KSB7CisgICAgICAgIHZhciBpLCBqLCBsOworCisgICAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikgeworICAgICAgICAgIGNhc2UgMHhmZmUwOgorICAgICAgICAgIGNhc2UgMHhmZmUxOgorICAgICAgICAgIGNhc2UgMHhmZmUyOgorICAgICAgICAgIGNhc2UgMHhmZmUzOgorICAgICAgICAgIGNhc2UgMHhmZmU0OgorICAgICAgICAgIGNhc2UgMHhmZmU1OgorICAgICAgICAgIGNhc2UgMHhmZmU2OgorICAgICAgICAgIGNhc2UgMHhmZmU3OgorICAgICAgICAgIGNhc2UgMHhmZmU4OgorICAgICAgICAgIGNhc2UgMHhmZmU5OgorICAgICAgICAgIGNhc2UgMHhmZmVhOgorICAgICAgICAgIGNhc2UgMHhmZmViOgorICAgICAgICAgIGNhc2UgMHhmZmVjOgorICAgICAgICAgIGNhc2UgMHhmZmVkOgorICAgICAgICAgIGNhc2UgMHhmZmVlOgorICAgICAgICAgIGNhc2UgMHhmZmVmOgorICAgICAgICAgIGNhc2UgMHhmZmZlOgorICAgICAgICAgICAgdmFyIGFwcERhdGEgPSByZWFkRGF0YUJsb2NrKCk7CisKKyAgICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZTApIHsKKyAgICAgICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NGEgJiYgYXBwRGF0YVsxXSA9PT0gMHg0NiAmJiBhcHBEYXRhWzJdID09PSAweDQ5ICYmIGFwcERhdGFbM10gPT09IDB4NDYgJiYgYXBwRGF0YVs0XSA9PT0gMCkgeworICAgICAgICAgICAgICAgIGpmaWYgPSB7CisgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB7CisgICAgICAgICAgICAgICAgICAgIG1ham9yOiBhcHBEYXRhWzVdLAorICAgICAgICAgICAgICAgICAgICBtaW5vcjogYXBwRGF0YVs2XQorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIGRlbnNpdHlVbml0czogYXBwRGF0YVs3XSwKKyAgICAgICAgICAgICAgICAgIHhEZW5zaXR5OiBhcHBEYXRhWzhdIDw8IDggfCBhcHBEYXRhWzldLAorICAgICAgICAgICAgICAgICAgeURlbnNpdHk6IGFwcERhdGFbMTBdIDw8IDggfCBhcHBEYXRhWzExXSwKKyAgICAgICAgICAgICAgICAgIHRodW1iV2lkdGg6IGFwcERhdGFbMTJdLAorICAgICAgICAgICAgICAgICAgdGh1bWJIZWlnaHQ6IGFwcERhdGFbMTNdLAorICAgICAgICAgICAgICAgICAgdGh1bWJEYXRhOiBhcHBEYXRhLnN1YmFycmF5KDE0LCAxNCArIDMgKiBhcHBEYXRhWzEyXSAqIGFwcERhdGFbMTNdKQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpbGVNYXJrZXIgPT09IDB4ZmZlZSkgeworICAgICAgICAgICAgICBpZiAoYXBwRGF0YVswXSA9PT0gMHg0MSAmJiBhcHBEYXRhWzFdID09PSAweDY0ICYmIGFwcERhdGFbMl0gPT09IDB4NmYgJiYgYXBwRGF0YVszXSA9PT0gMHg2MiAmJiBhcHBEYXRhWzRdID09PSAweDY1KSB7CisgICAgICAgICAgICAgICAgYWRvYmUgPSB7CisgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBhcHBEYXRhWzVdIDw8IDggfCBhcHBEYXRhWzZdLAorICAgICAgICAgICAgICAgICAgZmxhZ3MwOiBhcHBEYXRhWzddIDw8IDggfCBhcHBEYXRhWzhdLAorICAgICAgICAgICAgICAgICAgZmxhZ3MxOiBhcHBEYXRhWzldIDw8IDggfCBhcHBEYXRhWzEwXSwKKyAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUNvZGU6IGFwcERhdGFbMTFdCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmRiOgorICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZXNFbmQgPSBxdWFudGl6YXRpb25UYWJsZXNMZW5ndGggKyBvZmZzZXQgLSAyOworICAgICAgICAgICAgdmFyIHo7CisKKyAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBxdWFudGl6YXRpb25UYWJsZXNFbmQpIHsKKyAgICAgICAgICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICB2YXIgdGFibGVEYXRhID0gbmV3IFVpbnQxNkFycmF5KDY0KTsKKworICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTsKKyAgICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisgICAgICAgICAgICAgICAgICB6ID0gZGN0WmlnWmFnW2pdOworICAgICAgICAgICAgICAgICAgdGFibGVEYXRhW3pdID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiRFFUIC0gaW52YWxpZCB0YWJsZSBzcGVjIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmMwOgorICAgICAgICAgIGNhc2UgMHhmZmMxOgorICAgICAgICAgIGNhc2UgMHhmZmMyOgorICAgICAgICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIk9ubHkgc2luZ2xlIGZyYW1lIEpQRUdzIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGZyYW1lID0ge307CisgICAgICAgICAgICBmcmFtZS5leHRlbmRlZCA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMTsKKyAgICAgICAgICAgIGZyYW1lLnByb2dyZXNzaXZlID0gZmlsZU1hcmtlciA9PT0gMHhmZmMyOworICAgICAgICAgICAgZnJhbWUucHJlY2lzaW9uID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICBjb25zdCBzb2ZTY2FuTGluZXMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgZnJhbWUuc2NhbkxpbmVzID0gZG5sU2NhbkxpbmVzIHx8IHNvZlNjYW5MaW5lczsKKyAgICAgICAgICAgIGZyYW1lLnNhbXBsZXNQZXJMaW5lID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudHMgPSBbXTsKKyAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkcyA9IHt9OworICAgICAgICAgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IGRhdGFbb2Zmc2V0KytdLAorICAgICAgICAgICAgICAgIGNvbXBvbmVudElkOworICAgICAgICAgICAgdmFyIG1heEggPSAwLAorICAgICAgICAgICAgICAgIG1heFYgPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07CisgICAgICAgICAgICAgIHZhciBoID0gZGF0YVtvZmZzZXQgKyAxXSA+PiA0OworICAgICAgICAgICAgICB2YXIgdiA9IGRhdGFbb2Zmc2V0ICsgMV0gJiAxNTsKKworICAgICAgICAgICAgICBpZiAobWF4SCA8IGgpIHsKKyAgICAgICAgICAgICAgICBtYXhIID0gaDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChtYXhWIDwgdikgeworICAgICAgICAgICAgICAgIG1heFYgPSB2OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07CisgICAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goeworICAgICAgICAgICAgICAgIGgsCisgICAgICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLAorICAgICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHNbY29tcG9uZW50SWRdID0gbCAtIDE7CisgICAgICAgICAgICAgIG9mZnNldCArPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZS5tYXhIID0gbWF4SDsKKyAgICAgICAgICAgIGZyYW1lLm1heFYgPSBtYXhWOworICAgICAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZjNDoKKyAgICAgICAgICAgIGNvbnN0IGh1ZmZtYW5MZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgaHVmZm1hbkxlbmd0aDspIHsKKyAgICAgICAgICAgICAgdmFyIGh1ZmZtYW5UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgICAgdmFyIGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoMTYpOworICAgICAgICAgICAgICB2YXIgY29kZUxlbmd0aFN1bSA9IDA7CisKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyssIG9mZnNldCsrKSB7CisgICAgICAgICAgICAgICAgY29kZUxlbmd0aFN1bSArPSBjb2RlTGVuZ3Roc1tqXSA9IGRhdGFbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7CisKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGVMZW5ndGhTdW07IGorKywgb2Zmc2V0KyspIHsKKyAgICAgICAgICAgICAgICBodWZmbWFuVmFsdWVzW2pdID0gZGF0YVtvZmZzZXRdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaSArPSAxNyArIGNvZGVMZW5ndGhTdW07CisgICAgICAgICAgICAgIChodWZmbWFuVGFibGVTcGVjID4+IDQgPT09IDAgPyBodWZmbWFuVGFibGVzREMgOiBodWZmbWFuVGFibGVzQUMpW2h1ZmZtYW5UYWJsZVNwZWMgJiAxNV0gPSBidWlsZEh1ZmZtYW5UYWJsZShjb2RlTGVuZ3RocywgaHVmZm1hblZhbHVlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZGQ6CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHJlc2V0SW50ZXJ2YWwgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZkYToKKyAgICAgICAgICAgIGNvbnN0IHBhcnNlRE5MTWFya2VyID0gKytudW1TT1NNYXJrZXJzID09PSAxICYmICFkbmxTY2FuTGluZXM7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIHZhciBzZWxlY3RvcnNDb3VudCA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXSwKKyAgICAgICAgICAgICAgICBjb21wb25lbnQ7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgIHZhciBjb21wb25lbnRJbmRleCA9IGZyYW1lLmNvbXBvbmVudElkc1tpbmRleF07CisgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbY29tcG9uZW50SW5kZXhdOworICAgICAgICAgICAgICBjb21wb25lbnQuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgdmFyIHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlREMgPSBodWZmbWFuVGFibGVzRENbdGFibGVTcGVjID4+IDRdOworICAgICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlQUMgPSBodWZmbWFuVGFibGVzQUNbdGFibGVTcGVjICYgMTVdOworICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNwZWN0cmFsU3RhcnQgPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgIHZhciBzcGVjdHJhbEVuZCA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgdmFyIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID0gZGF0YVtvZmZzZXQrK107CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHZhciBwcm9jZXNzZWQgPSBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA+PiA0LCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LCBwYXJzZUROTE1hcmtlcik7CisgICAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7CisgICAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgJHtleC5tZXNzYWdlfSAtLSBhdHRlbXB0aW5nIHRvIHJlLXBhcnNlIHRoZSBKUEVHIGltYWdlLmApOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlKGRhdGEsIHsKKyAgICAgICAgICAgICAgICAgIGRubFNjYW5MaW5lczogZXguc2NhbkxpbmVzCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFT0lNYXJrZXJFcnJvcikgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgJHtleC5tZXNzYWdlfSAtLSBpZ25vcmluZyB0aGUgcmVzdCBvZiB0aGUgaW1hZ2UgZGF0YS5gKTsKKyAgICAgICAgICAgICAgICBicmVhayBtYXJrZXJMb29wOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZGM6CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZmY6CisgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CisgICAgICAgICAgICAgIG9mZnNldC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjb25zdCBuZXh0RmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBvZmZzZXQgLSAyLCBvZmZzZXQgLSAzKTsKKworICAgICAgICAgICAgaWYgKG5leHRGaWxlTWFya2VyICYmIG5leHRGaWxlTWFya2VyLmludmFsaWQpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAiICsgbmV4dEZpbGVNYXJrZXIuaW52YWxpZCk7CisgICAgICAgICAgICAgIG9mZnNldCA9IG5leHRGaWxlTWFya2VyLm9mZnNldDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gZGF0YS5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhICIgKyAid2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuIik7CisgICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiAiICsgZmlsZU1hcmtlci50b1N0cmluZygxNikpOworICAgICAgICB9CisKKyAgICAgICAgZmlsZU1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIH0KKworICAgICAgdGhpcy53aWR0aCA9IGZyYW1lLnNhbXBsZXNQZXJMaW5lOworICAgICAgdGhpcy5oZWlnaHQgPSBmcmFtZS5zY2FuTGluZXM7CisgICAgICB0aGlzLmpmaWYgPSBqZmlmOworICAgICAgdGhpcy5hZG9iZSA9IGFkb2JlOworICAgICAgdGhpcy5jb21wb25lbnRzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS5jb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbaV07CisgICAgICAgIHZhciBxdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlc1tjb21wb25lbnQucXVhbnRpemF0aW9uSWRdOworCisgICAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZSkgeworICAgICAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goeworICAgICAgICAgIGluZGV4OiBjb21wb25lbnQuaW5kZXgsCisgICAgICAgICAgb3V0cHV0OiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCksCisgICAgICAgICAgc2NhbGVYOiBjb21wb25lbnQuaCAvIGZyYW1lLm1heEgsCisgICAgICAgICAgc2NhbGVZOiBjb21wb25lbnQudiAvIGZyYW1lLm1heFYsCisgICAgICAgICAgYmxvY2tzUGVyTGluZTogY29tcG9uZW50LmJsb2Nrc1BlckxpbmUsCisgICAgICAgICAgYmxvY2tzUGVyQ29sdW1uOiBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLm51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9LAorCisgICAgX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCwgaXNTb3VyY2VQREYgPSBmYWxzZSkgeworICAgICAgdmFyIHNjYWxlWCA9IHRoaXMud2lkdGggLyB3aWR0aCwKKyAgICAgICAgICBzY2FsZVkgPSB0aGlzLmhlaWdodCAvIGhlaWdodDsKKyAgICAgIHZhciBjb21wb25lbnQsIGNvbXBvbmVudFNjYWxlWCwgY29tcG9uZW50U2NhbGVZLCBibG9ja3NQZXJTY2FubGluZTsKKyAgICAgIHZhciB4LCB5LCBpLCBqLCBrOworICAgICAgdmFyIGluZGV4OworICAgICAgdmFyIG9mZnNldCA9IDA7CisgICAgICB2YXIgb3V0cHV0OworICAgICAgdmFyIG51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOworICAgICAgdmFyIGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7CisgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoKTsKKyAgICAgIHZhciB4U2NhbGVCbG9ja09mZnNldCA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCk7CisgICAgICB2YXIgbWFzazNMU0IgPSAweGZmZmZmZmY4OworICAgICAgbGV0IGxhc3RDb21wb25lbnRTY2FsZVg7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2ldOworICAgICAgICBjb21wb25lbnRTY2FsZVggPSBjb21wb25lbnQuc2NhbGVYICogc2NhbGVYOworICAgICAgICBjb21wb25lbnRTY2FsZVkgPSBjb21wb25lbnQuc2NhbGVZICogc2NhbGVZOworICAgICAgICBvZmZzZXQgPSBpOworICAgICAgICBvdXRwdXQgPSBjb21wb25lbnQub3V0cHV0OworICAgICAgICBibG9ja3NQZXJTY2FubGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lICsgMSA8PCAzOworCisgICAgICAgIGlmIChjb21wb25lbnRTY2FsZVggIT09IGxhc3RDb21wb25lbnRTY2FsZVgpIHsKKyAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaiA9IDAgfCB4ICogY29tcG9uZW50U2NhbGVYOworICAgICAgICAgICAgeFNjYWxlQmxvY2tPZmZzZXRbeF0gPSAoaiAmIG1hc2szTFNCKSA8PCAzIHwgaiAmIDc7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgIGogPSAwIHwgeSAqIGNvbXBvbmVudFNjYWxlWTsKKyAgICAgICAgICBpbmRleCA9IGJsb2Nrc1BlclNjYW5saW5lICogKGogJiBtYXNrM0xTQikgfCAoaiAmIDcpIDw8IDM7CisKKyAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgZGF0YVtvZmZzZXRdID0gb3V0cHV0W2luZGV4ICsgeFNjYWxlQmxvY2tPZmZzZXRbeF1dOworICAgICAgICAgICAgb2Zmc2V0ICs9IG51bUNvbXBvbmVudHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07CisKKyAgICAgIGlmICghaXNTb3VyY2VQREYgJiYgbnVtQ29tcG9uZW50cyA9PT0gNCAmJiAhdHJhbnNmb3JtKSB7CisgICAgICAgIHRyYW5zZm9ybSA9IG5ldyBJbnQzMkFycmF5KFstMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1LCAtMjU2LCAyNTVdKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRyYW5zZm9ybSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDspIHsKKyAgICAgICAgICBmb3IgKGogPSAwLCBrID0gMDsgaiA8IG51bUNvbXBvbmVudHM7IGorKywgaSsrLCBrICs9IDIpIHsKKyAgICAgICAgICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAqIHRyYW5zZm9ybVtrXSA+PiA4KSArIHRyYW5zZm9ybVtrICsgMV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisKKyAgICBnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCkgeworICAgICAgaWYgKHRoaXMuYWRvYmUpIHsKKyAgICAgICAgcmV0dXJuICEhdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzKSB7CisgICAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudHNbMF0uaW5kZXggPT09IDB4NTIgJiYgdGhpcy5jb21wb25lbnRzWzFdLmluZGV4ID09PSAweDQ3ICYmIHRoaXMuY29tcG9uZW50c1syXS5pbmRleCA9PT0gMHg0MikgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgX2NvbnZlcnRZY2NUb1JnYjogZnVuY3Rpb24gY29udmVydFljY1RvUmdiKGRhdGEpIHsKKyAgICAgIHZhciBZLCBDYiwgQ3I7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CisgICAgICAgIFkgPSBkYXRhW2ldOworICAgICAgICBDYiA9IGRhdGFbaSArIDFdOworICAgICAgICBDciA9IGRhdGFbaSArIDJdOworICAgICAgICBkYXRhW2ldID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyOworICAgICAgICBkYXRhW2kgKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CisgICAgICAgIGRhdGFbaSArIDJdID0gWSAtIDIyNi44MTYgKyAxLjc3MiAqIENiOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YTsKKyAgICB9LAorICAgIF9jb252ZXJ0WWNja1RvUmdiOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvUmdiKGRhdGEpIHsKKyAgICAgIHZhciBZLCBDYiwgQ3IsIGs7CisgICAgICB2YXIgb2Zmc2V0ID0gMDsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgICAgWSA9IGRhdGFbaV07CisgICAgICAgIENiID0gZGF0YVtpICsgMV07CisgICAgICAgIENyID0gZGF0YVtpICsgMl07CisgICAgICAgIGsgPSBkYXRhW2kgKyAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAtMTIyLjY3MTk1NDA2ODk0ICsgQ2IgKiAoLTYuNjA2MzU2Njk0MjAzNjRlLTUgKiBDYiArIDAuMDAwNDM3MTMwNDc1OTI2MjMyICogQ3IgLSA1LjQwODA2MTAwNjQ1OTllLTUgKiBZICsgMC4wMDA0ODQ0OTc5NzEyMDI4MSAqIGsgLSAwLjE1NDM2MjE1MTg3MTEyNikgKyBDciAqICgtMC4wMDA5NTc5NjQzNzg0NDU3NzMgKiBDciArIDAuMDAwODE3MDc2OTExMzQ2NjI1ICogWSAtIDAuMDA0NzcyNzE0MDU0MDg3NDcgKiBrICsgMS41MzM4MDI1MzIyMTczNCkgKyBZICogKDAuMDAwOTYxMjUwMTg0MTMwNjg4ICogWSAtIDAuMDAyNjYyNTczMzIyODM5MzMgKiBrICsgMC40ODM1NzA4ODQ1MTI2NSkgKyBrICogKC0wLjAwMDMzNjE5NzE3NzYxODM5NCAqIGsgKyAwLjQ4NDc5MTU2MTQ5MDc3Nik7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMTA3LjI2ODAzOTM5NzcyNCArIENiICogKDIuMTk5MjcxMDQ1MjU3NDFlLTUgKiBDYiAtIDAuMDAwNjQwOTkyMDE4Mjk3OTQ1ICogQ3IgKyAwLjAwMDY1OTM5NzAwMTI0NTU3NyAqIFkgKyAwLjAwMDQyNjEwNTY1MjkzODgzNyAqIGsgLSAwLjE3NjQ5MTc5MjQ2Mjg3NSkgKyBDciAqICgtMC4wMDA3NzgyNjk5NDE1MTM2ODMgKiBDciArIDAuMDAxMzA4NzIyNjE0MDgyNzUgKiBZICsgMC4wMDA3NzA0ODI2MzE4MDExMzIgKiBrIC0gMC4xNTEwNTE0OTI3NzU1NjIpICsgWSAqICgwLjAwMTI2OTM1MzY4MTE0ODQzICogWSAtIDAuMDAyNjUwOTAxODkwMTA4OTggKiBrICsgMC4yNTgwMjkxMDIwNjg0NSkgKyBrICogKC0wLjAwMDMxODkxMzExNzU4ODMyOCAqIGsgLSAwLjIxMzc0MjQwMDMyMzY2NSk7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gLTIwLjgxMDAxMjU0Njk0NyArIENiICogKC0wLjAwMDU3MDExNTE5Njk3MzY3NyAqIENiIC0gMi42MzQwOTA1MTAwNDU4OWUtNSAqIENyICsgMC4wMDIwNzQxMDg4MTE1MDEyICogWSAtIDAuMDAyODgyNjAyMzY4NTM0NDIgKiBrICsgMC44MTQyNzI5NjgzNTkyOTUpICsgQ3IgKiAoLTEuNTM0OTYwNTc0NDA5NzVlLTUgKiBDciAtIDAuMDAwMTMyNjg5MDQzOTYxNDQ2ICogWSArIDAuMDAwNTYwODMzNjkxMjQyODEyICogayAtIDAuMTk1MTUyMDI3NTM0MDQ5KSArIFkgKiAoMC4wMDE3NDQxODEzMjkyNzU4MiAqIFkgLSAwLjAwMjU1MjQzMzIxNDM5MzQ3ICogayArIDAuMTE2OTM1MDIwNDY1MTQ1KSArIGsgKiAoLTAuMDAwMzQzNTMxOTk2NTEwNTU1ICogayArIDAuMjQxNjUyNjAyMzI0MDcpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YS5zdWJhcnJheSgwLCBvZmZzZXQpOworICAgIH0sCisgICAgX2NvbnZlcnRZY2NrVG9DbXlrOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7CisgICAgICB2YXIgWSwgQ2IsIENyOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgeworICAgICAgICBZID0gZGF0YVtpXTsKKyAgICAgICAgQ2IgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgQ3IgPSBkYXRhW2kgKyAyXTsKKyAgICAgICAgZGF0YVtpXSA9IDQzNC40NTYgLSBZIC0gMS40MDIgKiBDcjsKKyAgICAgICAgZGF0YVtpICsgMV0gPSAxMTkuNTQxIC0gWSArIDAuMzQ0ICogQ2IgKyAwLjcxNCAqIENyOworICAgICAgICBkYXRhW2kgKyAyXSA9IDQ4MS44MTYgLSBZIC0gMS43NzIgKiBDYjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfSwKKyAgICBfY29udmVydENteWtUb1JnYjogZnVuY3Rpb24gY29udmVydENteWtUb1JnYihkYXRhKSB7CisgICAgICB2YXIgYywgbSwgeSwgazsKKyAgICAgIHZhciBvZmZzZXQgPSAwOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgeworICAgICAgICBjID0gZGF0YVtpXTsKKyAgICAgICAgbSA9IGRhdGFbaSArIDFdOworICAgICAgICB5ID0gZGF0YVtpICsgMl07CisgICAgICAgIGsgPSBkYXRhW2kgKyAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKC0wLjAwMDA2NzQ3MTQ3MDczNjAyNDQxICogYyArIDAuMDAwODM3OTI2MjEyMTAxMzcyNyAqIG0gKyAwLjAwMDI4OTQ3MTgxODg2NDMyOTQgKiB5ICsgMC4wMDMyNjQyMzEwNTc1Mzc4MDYgKiBrIC0gMS4xMTg1NjExODY3MjAzOTM3KSArIG0gKiAoMC4wMDAwMjYzNzQxMDc2MTYwODk0MDUgKiBtIC0gMC4wMDAwODYyNjk0OTE1ODYzODU3MiAqIHkgLSAwLjAwMDI3NDg3NjkwNjc0OTk0OTEgKiBrIC0gMC4wMjE1NTY4ODc5NDk3ODk2NykgKyB5ICogKC0wLjAwMDAzODc4MDk5MjEyODY5MzYzICogeSAtIDAuMDAwMzI2NzgwODI3OTQ4NTI4NiAqIGsgKyAwLjA2ODY3NDIyMzg1OTUzNDUpIC0gayAqICgwLjAwMDMzNjE5NzE3NzYxODM5MzcgKiBrICsgMC43NDMwNjU5MTUxMzQyMjU0KTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKDAuMDAwMTM1OTYzNzI4MTM1ODg4NDggKiBjICsgMC4wMDA5MjQ1MzcxMzI1NzM1ODUgKiBtICsgMC4wMDAxMDU2NzM1OTYxODY4MzU5MyAqIHkgKyAwLjAwMDQ3OTE4NjQ2ODc0MzY1MTIgKiBrIC0gMC4zMTA5Njg5NTg3NTE1ODc1KSArIG0gKiAoLTAuMDAwMjM1NDUzNDYxMDgzNzAzNDQgKiBtICsgMC4wMDAyNzAyODQ1MjUzNTM0NzE0ICogeSArIDAuMDAyMDIwMDMwODk3NzMwNzE1NiAqIGsgLSAwLjc0ODgwNTIxNjcwMTU0OTQpICsgeSAqICgwLjAwMDA2ODM0ODE1OTk4MjM1NjYyICogeSArIDAuMDAwMTUxNjg0NTIzNjM0NjA5NzMgKiBrIC0gMC4wOTc1MTkyNzc3NDcyODkzMykgLSBrICogKDAuMDAwMzE4OTEzMTE3NTg4MzI4MTQgKiBrICsgMC43MzY0ODgzODA3NzMzMTY4KTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKDAuMDAwMDEzNTk4NjUwNDExMzg1MzA3ICogYyArIDAuMDAwMTI0MjM5NTYxNzU0OTA4NTEgKiBtICsgMC4wMDA0NzUxOTg1MDk3NTgzNTg5ICogeSAtIDAuMDAwMDAzNjcyOTMxNzQ3NjYzMDQyMiAqIGsgLSAwLjA1NTYyMTg2OTgwMjY0MDM0KSArIG0gKiAoMC4wMDAxNjE0MTM4MDU5ODcyNDY3NiAqIG0gKyAwLjAwMDk2OTIyMzkxMzA3MjUxODYgKiB5ICsgMC4wMDA3NzgyNjkyNDUwMDM2MjUzICogayAtIDAuNDQwMTUyMzIzNjc1MjY0NjMpICsgeSAqICg1LjA2ODg4MjkxNDA2ODc2OWUtNyAqIHkgKyAwLjAwMTc3NzgzNjkwMTEzNzUwNzEgKiBrIC0gMC43NTkxNDU0NjQ5NzQ5NjA5KSAtIGsgKiAoMC4wMDAzNDM1MzE5OTY1MTA1NTUzICogayArIDAuNzA2Mzc3MDE4NjE2MDE0NCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7CisgICAgfSwKKworICAgIGdldERhdGEoeworICAgICAgd2lkdGgsCisgICAgICBoZWlnaHQsCisgICAgICBmb3JjZVJHQiA9IGZhbHNlLAorICAgICAgaXNTb3VyY2VQREYgPSBmYWxzZQorICAgIH0pIHsKKyAgICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPiA0KSB7CisgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTsKKworICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMSAmJiBmb3JjZVJHQikgeworICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgICAgICB2YXIgcmdiRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhTGVuZ3RoICogMyk7CisgICAgICAgIHZhciBvZmZzZXQgPSAwOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgdmFyIGdyYXlDb2xvciA9IGRhdGFbaV07CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgICAgcmdiRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmdiRGF0YTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzICYmIHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2IoZGF0YSk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gNCkgeworICAgICAgICBpZiAodGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKKyAgICAgICAgICBpZiAoZm9yY2VSR0IpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvUmdiKGRhdGEpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JjZVJHQikgeworICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICB9OworICByZXR1cm4gSnBlZ0ltYWdlOworfSgpOworCitleHBvcnRzLkpwZWdJbWFnZSA9IEpwZWdJbWFnZTsKKworLyoqKi8gfSksCisvKiA5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSnB4SW1hZ2UgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CisKK3ZhciBfYXJpdGhtZXRpY19kZWNvZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKKworY2xhc3MgSnB4RXJyb3IgZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnKSB7CisgICAgc3VwZXIoYEpQWCBlcnJvcjogJHttc2d9YCk7CisgIH0KKworfQorCit2YXIgSnB4SW1hZ2UgPSBmdW5jdGlvbiBKcHhJbWFnZUNsb3N1cmUoKSB7CisgIHZhciBTdWJiYW5kc0dhaW5Mb2cyID0geworICAgIExMOiAwLAorICAgIExIOiAxLAorICAgIEhMOiAxLAorICAgIEhIOiAyCisgIH07CisKKyAgZnVuY3Rpb24gSnB4SW1hZ2UoKSB7CisgICAgdGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSA9IGZhbHNlOworICB9CisKKyAgSnB4SW1hZ2UucHJvdG90eXBlID0geworICAgIHBhcnNlOiBmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZShkYXRhKSB7CisgICAgICB2YXIgaGVhZCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCAwKTsKKworICAgICAgaWYgKGhlYWQgPT09IDB4ZmY0ZikgeworICAgICAgICB0aGlzLnBhcnNlQ29kZXN0cmVhbShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHBvc2l0aW9uID0gMCwKKyAgICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aDsKKworICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciBoZWFkZXJTaXplID0gODsKKyAgICAgICAgdmFyIGxib3ggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICB2YXIgdGJveCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpOworICAgICAgICBwb3NpdGlvbiArPSBoZWFkZXJTaXplOworCisgICAgICAgIGlmIChsYm94ID09PSAxKSB7CisgICAgICAgICAgbGJveCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgKiA0Mjk0OTY3Mjk2ICsgKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CisgICAgICAgICAgcG9zaXRpb24gKz0gODsKKyAgICAgICAgICBoZWFkZXJTaXplICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGJveCA9PT0gMCkgeworICAgICAgICAgIGxib3ggPSBsZW5ndGggLSBwb3NpdGlvbiArIGhlYWRlclNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGJveCA8IGhlYWRlclNpemUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgYm94IGZpZWxkIHNpemUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkYXRhTGVuZ3RoID0gbGJveCAtIGhlYWRlclNpemU7CisgICAgICAgIHZhciBqdW1wRGF0YUxlbmd0aCA9IHRydWU7CisKKyAgICAgICAgc3dpdGNoICh0Ym94KSB7CisgICAgICAgICAgY2FzZSAweDZhNzAzMjY4OgorICAgICAgICAgICAganVtcERhdGFMZW5ndGggPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDYzNmY2YzcyOgorICAgICAgICAgICAgdmFyIG1ldGhvZCA9IGRhdGFbcG9zaXRpb25dOworCisgICAgICAgICAgICBpZiAobWV0aG9kID09PSAxKSB7CisgICAgICAgICAgICAgIHZhciBjb2xvcnNwYWNlID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMyk7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChjb2xvcnNwYWNlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVua25vd24gY29sb3JzcGFjZSAiICsgY29sb3JzcGFjZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IDIpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJJQ0MgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDZhNzAzMjYzOgorICAgICAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgcG9zaXRpb24sIHBvc2l0aW9uICsgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHg2YTUwMjAyMDoKKyAgICAgICAgICAgIGlmICgoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pICE9PSAweDBkMGE4NzBhKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBKUDIgc2lnbmF0dXJlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDZhNTAxYTFhOgorICAgICAgICAgIGNhc2UgMHg2Njc0Nzk3MDoKKyAgICAgICAgICBjYXNlIDB4NzI3MjY1NzE6CisgICAgICAgICAgY2FzZSAweDcyNjU3MzIwOgorICAgICAgICAgIGNhc2UgMHg2OTY4NjQ3MjoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhciBoZWFkZXJUeXBlID0gU3RyaW5nLmZyb21DaGFyQ29kZSh0Ym94ID4+IDI0ICYgMHhmZiwgdGJveCA+PiAxNiAmIDB4ZmYsIHRib3ggPj4gOCAmIDB4ZmYsIHRib3ggJiAweGZmKTsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgIiArIHRib3ggKyAiICgiICsgaGVhZGVyVHlwZSArICIpIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqdW1wRGF0YUxlbmd0aCkgeworICAgICAgICAgIHBvc2l0aW9uICs9IGRhdGFMZW5ndGg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIHBhcnNlSW1hZ2VQcm9wZXJ0aWVzOiBmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZUltYWdlUHJvcGVydGllcyhzdHJlYW0pIHsKKyAgICAgIHZhciBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKKworICAgICAgd2hpbGUgKG5ld0J5dGUgPj0gMCkgeworICAgICAgICB2YXIgb2xkQnl0ZSA9IG5ld0J5dGU7CisgICAgICAgIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICB2YXIgY29kZSA9IG9sZEJ5dGUgPDwgOCB8IG5ld0J5dGU7CisKKyAgICAgICAgaWYgKGNvZGUgPT09IDB4ZmY1MSkgeworICAgICAgICAgIHN0cmVhbS5za2lwKDQpOworICAgICAgICAgIHZhciBYc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgdmFyIFlzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICB2YXIgWE9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICB2YXIgWU9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICBzdHJlYW0uc2tpcCgxNik7CisgICAgICAgICAgdmFyIENzaXogPSBzdHJlYW0uZ2V0VWludDE2KCk7CisgICAgICAgICAgdGhpcy53aWR0aCA9IFhzaXogLSBYT3NpejsKKyAgICAgICAgICB0aGlzLmhlaWdodCA9IFlzaXogLSBZT3NpejsKKyAgICAgICAgICB0aGlzLmNvbXBvbmVudHNDb3VudCA9IENzaXo7CisgICAgICAgICAgdGhpcy5iaXRzUGVyQ29tcG9uZW50ID0gODsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJObyBzaXplIG1hcmtlciBmb3VuZCBpbiBKUFggc3RyZWFtIik7CisgICAgfSwKKyAgICBwYXJzZUNvZGVzdHJlYW06IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlQ29kZXN0cmVhbShkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgY29udGV4dCA9IHt9OworICAgICAgdmFyIGRvTm90UmVjb3ZlciA9IGZhbHNlOworCisgICAgICB0cnkgeworICAgICAgICB2YXIgcG9zaXRpb24gPSBzdGFydDsKKworICAgICAgICB3aGlsZSAocG9zaXRpb24gKyAxIDwgZW5kKSB7CisgICAgICAgICAgdmFyIGNvZGUgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgICAgdmFyIGxlbmd0aCA9IDAsCisgICAgICAgICAgICAgIGosCisgICAgICAgICAgICAgIHNxY2QsCisgICAgICAgICAgICAgIHNwcWNkcywKKyAgICAgICAgICAgICAgc3BxY2RTaXplLAorICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQsCisgICAgICAgICAgICAgIHRpbGU7CisKKyAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMHhmZjRmOgorICAgICAgICAgICAgICBjb250ZXh0Lm1haW5IZWFkZXIgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmZDk6CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1MToKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgdmFyIHNpeiA9IHt9OworICAgICAgICAgICAgICBzaXouWHNpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpOworICAgICAgICAgICAgICBzaXouWXNpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDgpOworICAgICAgICAgICAgICBzaXouWE9zaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAxMik7CisgICAgICAgICAgICAgIHNpei5ZT3NpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDE2KTsKKyAgICAgICAgICAgICAgc2l6LlhUc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMjApOworICAgICAgICAgICAgICBzaXouWVRzaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAyNCk7CisgICAgICAgICAgICAgIHNpei5YVE9zaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAyOCk7CisgICAgICAgICAgICAgIHNpei5ZVE9zaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAzMik7CisgICAgICAgICAgICAgIHZhciBjb21wb25lbnRzQ291bnQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24gKyAzNik7CisgICAgICAgICAgICAgIHNpei5Dc2l6ID0gY29tcG9uZW50c0NvdW50OworICAgICAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdOworICAgICAgICAgICAgICBqID0gcG9zaXRpb24gKyAzODsKKworICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHsKKyAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogKGRhdGFbal0gJiAweDdmKSArIDEsCisgICAgICAgICAgICAgICAgICBpc1NpZ25lZDogISEoZGF0YVtqXSAmIDB4ODApLAorICAgICAgICAgICAgICAgICAgWFJzaXo6IGRhdGFbaiArIDFdLAorICAgICAgICAgICAgICAgICAgWVJzaXo6IGRhdGFbaiArIDJdCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBqICs9IDM7CisgICAgICAgICAgICAgICAgY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhjb21wb25lbnQsIHNpeik7CisgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb250ZXh0LlNJWiA9IHNpejsKKyAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gY29tcG9uZW50czsKKyAgICAgICAgICAgICAgY2FsY3VsYXRlVGlsZUdyaWRzKGNvbnRleHQsIGNvbXBvbmVudHMpOworICAgICAgICAgICAgICBjb250ZXh0LlFDQyA9IFtdOworICAgICAgICAgICAgICBjb250ZXh0LkNPQyA9IFtdOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNWM6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHZhciBxY2QgPSB7fTsKKyAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjsKKyAgICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKHNxY2QgJiAweDFmKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gODsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIgKyBzcWNkKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHFjZC5ub1F1YW50aXphdGlvbiA9IHNwcWNkU2l6ZSA9PT0gODsKKyAgICAgICAgICAgICAgcWNkLnNjYWxhckV4cG91bmRlZCA9IHNjYWxhckV4cG91bmRlZDsKKyAgICAgICAgICAgICAgcWNkLmd1YXJkQml0cyA9IHNxY2QgPj4gNTsKKyAgICAgICAgICAgICAgc3BxY2RzID0gW107CisKKyAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikgeworICAgICAgICAgICAgICAgIHZhciBzcHFjZCA9IHt9OworCisgICAgICAgICAgICAgICAgaWYgKHNwcWNkU2l6ZSA9PT0gOCkgeworICAgICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbaisrXSA+PiAzOworICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqXSA+PiAzOworICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAoZGF0YVtqXSAmIDB4NykgPDwgOCB8IGRhdGFbaiArIDFdOworICAgICAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwcWNkcy5wdXNoKHNwcWNkKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHFjZC5TUHFjZHMgPSBzcHFjZHM7CisKKyAgICAgICAgICAgICAgaWYgKGNvbnRleHQubWFpbkhlYWRlcikgeworICAgICAgICAgICAgICAgIGNvbnRleHQuUUNEID0gcWNkOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNEID0gcWNkOworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNDID0gW107CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNWQ6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHZhciBxY2MgPSB7fTsKKyAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjsKKyAgICAgICAgICAgICAgdmFyIGNxY2M7CisKKyAgICAgICAgICAgICAgaWYgKGNvbnRleHQuU0laLkNzaXogPCAyNTcpIHsKKyAgICAgICAgICAgICAgICBjcWNjID0gZGF0YVtqKytdOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNxY2MgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgaik7CisgICAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKHNxY2QgJiAweDFmKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gODsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIgKyBzcWNkKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHFjYy5ub1F1YW50aXphdGlvbiA9IHNwcWNkU2l6ZSA9PT0gODsKKyAgICAgICAgICAgICAgcWNjLnNjYWxhckV4cG91bmRlZCA9IHNjYWxhckV4cG91bmRlZDsKKyAgICAgICAgICAgICAgcWNjLmd1YXJkQml0cyA9IHNxY2QgPj4gNTsKKyAgICAgICAgICAgICAgc3BxY2RzID0gW107CisKKyAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikgeworICAgICAgICAgICAgICAgIHNwcWNkID0ge307CisKKyAgICAgICAgICAgICAgICBpZiAoc3BxY2RTaXplID09PSA4KSB7CisgICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqKytdID4+IDM7CisgICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2pdID4+IDM7CisgICAgICAgICAgICAgICAgICBzcHFjZC5tdSA9IChkYXRhW2pdICYgMHg3KSA8PCA4IHwgZGF0YVtqICsgMV07CisgICAgICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3BxY2RzLnB1c2goc3BxY2QpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNjLlNQcWNkcyA9IHNwcWNkczsKKworICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5RQ0NbY3FjY10gPSBxY2M7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0NbY3FjY10gPSBxY2M7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNTI6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHZhciBjb2QgPSB7fTsKKyAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjsKKyAgICAgICAgICAgICAgdmFyIHNjb2QgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzID0gISEoc2NvZCAmIDEpOworICAgICAgICAgICAgICBjb2Quc29wTWFya2VyVXNlZCA9ICEhKHNjb2QgJiAyKTsKKyAgICAgICAgICAgICAgY29kLmVwaE1hcmtlclVzZWQgPSAhIShzY29kICYgNCk7CisgICAgICAgICAgICAgIGNvZC5wcm9ncmVzc2lvbk9yZGVyID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2QubGF5ZXJzQ291bnQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgaik7CisgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgICAgY29kLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2QuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2QueGNiID0gKGRhdGFbaisrXSAmIDB4ZikgKyAyOworICAgICAgICAgICAgICBjb2QueWNiID0gKGRhdGFbaisrXSAmIDB4ZikgKyAyOworICAgICAgICAgICAgICB2YXIgYmxvY2tTdHlsZSA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgY29kLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MgPSAhIShibG9ja1N0eWxlICYgMSk7CisgICAgICAgICAgICAgIGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzID0gISEoYmxvY2tTdHlsZSAmIDIpOworICAgICAgICAgICAgICBjb2QudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzID0gISEoYmxvY2tTdHlsZSAmIDQpOworICAgICAgICAgICAgICBjb2QudmVydGljYWxseVN0cmlwZSA9ICEhKGJsb2NrU3R5bGUgJiA4KTsKKyAgICAgICAgICAgICAgY29kLnByZWRpY3RhYmxlVGVybWluYXRpb24gPSAhIShibG9ja1N0eWxlICYgMTYpOworICAgICAgICAgICAgICBjb2Quc2VnbWVudGF0aW9uU3ltYm9sVXNlZCA9ICEhKGJsb2NrU3R5bGUgJiAzMik7CisgICAgICAgICAgICAgIGNvZC5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24gPSBkYXRhW2orK107CisKKyAgICAgICAgICAgICAgaWYgKGNvZC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7CisgICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemVzID0gW107CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICB2YXIgcHJlY2luY3RzU2l6ZSA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgICAgIHByZWNpbmN0c1NpemVzLnB1c2goeworICAgICAgICAgICAgICAgICAgICBQUHg6IHByZWNpbmN0c1NpemUgJiAweGYsCisgICAgICAgICAgICAgICAgICAgIFBQeTogcHJlY2luY3RzU2l6ZSA+PiA0CisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb2QucHJlY2luY3RzU2l6ZXMgPSBwcmVjaW5jdHNTaXplczsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciB1bnN1cHBvcnRlZCA9IFtdOworCisgICAgICAgICAgICAgIGlmIChjb2Quc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcykgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb2QucmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcykgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb2QudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgidGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoY29kLnZlcnRpY2FsbHlTdHJpcGUpIHsKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKCJ2ZXJ0aWNhbGx5U3RyaXBlIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoY29kLnByZWRpY3RhYmxlVGVybWluYXRpb24pIHsKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKCJwcmVkaWN0YWJsZVRlcm1pbmF0aW9uIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWQubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGRvTm90UmVjb3ZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBDT0Qgb3B0aW9ucyAoIiArIHVuc3VwcG9ydGVkLmpvaW4oIiwgIikgKyAiKSIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvbnRleHQubWFpbkhlYWRlcikgeworICAgICAgICAgICAgICAgIGNvbnRleHQuQ09EID0gY29kOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuQ09EID0gY29kOworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuQ09DID0gW107CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmOTA6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHRpbGUgPSB7fTsKKyAgICAgICAgICAgICAgdGlsZS5pbmRleCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbiArIDIpOworICAgICAgICAgICAgICB0aWxlLmxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpOworICAgICAgICAgICAgICB0aWxlLmRhdGFFbmQgPSB0aWxlLmxlbmd0aCArIHBvc2l0aW9uIC0gMjsKKyAgICAgICAgICAgICAgdGlsZS5wYXJ0SW5kZXggPSBkYXRhW3Bvc2l0aW9uICsgOF07CisgICAgICAgICAgICAgIHRpbGUucGFydHNDb3VudCA9IGRhdGFbcG9zaXRpb24gKyA5XTsKKyAgICAgICAgICAgICAgY29udGV4dC5tYWluSGVhZGVyID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgaWYgKHRpbGUucGFydEluZGV4ID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGlsZS5DT0QgPSBjb250ZXh0LkNPRDsKKyAgICAgICAgICAgICAgICB0aWxlLkNPQyA9IGNvbnRleHQuQ09DLnNsaWNlKDApOworICAgICAgICAgICAgICAgIHRpbGUuUUNEID0gY29udGV4dC5RQ0Q7CisgICAgICAgICAgICAgICAgdGlsZS5RQ0MgPSBjb250ZXh0LlFDQy5zbGljZSgwKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUgPSB0aWxlOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmOTM6CisgICAgICAgICAgICAgIHRpbGUgPSBjb250ZXh0LmN1cnJlbnRUaWxlOworCisgICAgICAgICAgICAgIGlmICh0aWxlLnBhcnRJbmRleCA9PT0gMCkgeworICAgICAgICAgICAgICAgIGluaXRpYWxpemVUaWxlKGNvbnRleHQsIHRpbGUuaW5kZXgpOworICAgICAgICAgICAgICAgIGJ1aWxkUGFja2V0cyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGxlbmd0aCA9IHRpbGUuZGF0YUVuZCAtIHBvc2l0aW9uOworICAgICAgICAgICAgICBwYXJzZVRpbGVQYWNrZXRzKGNvbnRleHQsIGRhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNTU6CisgICAgICAgICAgICBjYXNlIDB4ZmY1NzoKKyAgICAgICAgICAgIGNhc2UgMHhmZjU4OgorICAgICAgICAgICAgY2FzZSAweGZmNjQ6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4ZmY1MzoKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb2Rlc3RyZWFtIGNvZGUgMHhGRjUzIChDT0MpIGlzIG5vdCBpbXBsZW1lbnRlZCIpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29kZXN0cmVhbSBjb2RlOiAiICsgY29kZS50b1N0cmluZygxNikpOworICAgICAgICAgIH0KKworICAgICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBpZiAoZG9Ob3RSZWNvdmVyIHx8IHRoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2UpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoZS5tZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkpQWDogVHJ5aW5nIHRvIHJlY292ZXIgZnJvbTogIiArIGUubWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy50aWxlcyA9IHRyYW5zZm9ybUNvbXBvbmVudHMoY29udGV4dCk7CisgICAgICB0aGlzLndpZHRoID0gY29udGV4dC5TSVouWHNpeiAtIGNvbnRleHQuU0laLlhPc2l6OworICAgICAgdGhpcy5oZWlnaHQgPSBjb250ZXh0LlNJWi5Zc2l6IC0gY29udGV4dC5TSVouWU9zaXo7CisgICAgICB0aGlzLmNvbXBvbmVudHNDb3VudCA9IGNvbnRleHQuU0laLkNzaXo7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnMoY29tcG9uZW50LCBzaXopIHsKKyAgICBjb21wb25lbnQueDAgPSBNYXRoLmNlaWwoc2l6LlhPc2l6IC8gY29tcG9uZW50LlhSc2l6KTsKKyAgICBjb21wb25lbnQueDEgPSBNYXRoLmNlaWwoc2l6LlhzaXogLyBjb21wb25lbnQuWFJzaXopOworICAgIGNvbXBvbmVudC55MCA9IE1hdGguY2VpbChzaXouWU9zaXogLyBjb21wb25lbnQuWVJzaXopOworICAgIGNvbXBvbmVudC55MSA9IE1hdGguY2VpbChzaXouWXNpeiAvIGNvbXBvbmVudC5ZUnNpeik7CisgICAgY29tcG9uZW50LndpZHRoID0gY29tcG9uZW50LngxIC0gY29tcG9uZW50LngwOworICAgIGNvbXBvbmVudC5oZWlnaHQgPSBjb21wb25lbnQueTEgLSBjb21wb25lbnQueTA7CisgIH0KKworICBmdW5jdGlvbiBjYWxjdWxhdGVUaWxlR3JpZHMoY29udGV4dCwgY29tcG9uZW50cykgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZSwKKyAgICAgICAgdGlsZXMgPSBbXTsKKyAgICB2YXIgbnVtWHRpbGVzID0gTWF0aC5jZWlsKChzaXouWHNpeiAtIHNpei5YVE9zaXopIC8gc2l6LlhUc2l6KTsKKyAgICB2YXIgbnVtWXRpbGVzID0gTWF0aC5jZWlsKChzaXouWXNpeiAtIHNpei5ZVE9zaXopIC8gc2l6LllUc2l6KTsKKworICAgIGZvciAodmFyIHEgPSAwOyBxIDwgbnVtWXRpbGVzOyBxKyspIHsKKyAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgbnVtWHRpbGVzOyBwKyspIHsKKyAgICAgICAgdGlsZSA9IHt9OworICAgICAgICB0aWxlLnR4MCA9IE1hdGgubWF4KHNpei5YVE9zaXogKyBwICogc2l6LlhUc2l6LCBzaXouWE9zaXopOworICAgICAgICB0aWxlLnR5MCA9IE1hdGgubWF4KHNpei5ZVE9zaXogKyBxICogc2l6LllUc2l6LCBzaXouWU9zaXopOworICAgICAgICB0aWxlLnR4MSA9IE1hdGgubWluKHNpei5YVE9zaXogKyAocCArIDEpICogc2l6LlhUc2l6LCBzaXouWHNpeik7CisgICAgICAgIHRpbGUudHkxID0gTWF0aC5taW4oc2l6LllUT3NpeiArIChxICsgMSkgKiBzaXouWVRzaXosIHNpei5Zc2l6KTsKKyAgICAgICAgdGlsZS53aWR0aCA9IHRpbGUudHgxIC0gdGlsZS50eDA7CisgICAgICAgIHRpbGUuaGVpZ2h0ID0gdGlsZS50eTEgLSB0aWxlLnR5MDsKKyAgICAgICAgdGlsZS5jb21wb25lbnRzID0gW107CisgICAgICAgIHRpbGVzLnB1c2godGlsZSk7CisgICAgICB9CisgICAgfQorCisgICAgY29udGV4dC50aWxlcyA9IHRpbGVzOworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbXBvbmVudHNDb3VudDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOworCisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSB0aWxlcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIHZhciB0aWxlQ29tcG9uZW50ID0ge307CisgICAgICAgIHRpbGUgPSB0aWxlc1tqXTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC50Y3gwID0gTWF0aC5jZWlsKHRpbGUudHgwIC8gY29tcG9uZW50LlhSc2l6KTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC50Y3kwID0gTWF0aC5jZWlsKHRpbGUudHkwIC8gY29tcG9uZW50LllSc2l6KTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC50Y3gxID0gTWF0aC5jZWlsKHRpbGUudHgxIC8gY29tcG9uZW50LlhSc2l6KTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC50Y3kxID0gTWF0aC5jZWlsKHRpbGUudHkxIC8gY29tcG9uZW50LllSc2l6KTsKKyAgICAgICAgdGlsZUNvbXBvbmVudC53aWR0aCA9IHRpbGVDb21wb25lbnQudGN4MSAtIHRpbGVDb21wb25lbnQudGN4MDsKKyAgICAgICAgdGlsZUNvbXBvbmVudC5oZWlnaHQgPSB0aWxlQ29tcG9uZW50LnRjeTEgLSB0aWxlQ29tcG9uZW50LnRjeTA7CisgICAgICAgIHRpbGUuY29tcG9uZW50c1tpXSA9IHRpbGVDb21wb25lbnQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpIHsKKyAgICB2YXIgY29kT3JDb2MgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzOworICAgIHZhciByZXN1bHQgPSB7fTsKKworICAgIGlmICghY29kT3JDb2MuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cykgeworICAgICAgcmVzdWx0LlBQeCA9IDE1OworICAgICAgcmVzdWx0LlBQeSA9IDE1OworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQuUFB4ID0gY29kT3JDb2MucHJlY2luY3RzU2l6ZXNbcl0uUFB4OworICAgICAgcmVzdWx0LlBQeSA9IGNvZE9yQ29jLnByZWNpbmN0c1NpemVzW3JdLlBQeTsKKyAgICB9CisKKyAgICByZXN1bHQueGNiXyA9IHIgPiAwID8gTWF0aC5taW4oY29kT3JDb2MueGNiLCByZXN1bHQuUFB4IC0gMSkgOiBNYXRoLm1pbihjb2RPckNvYy54Y2IsIHJlc3VsdC5QUHgpOworICAgIHJlc3VsdC55Y2JfID0gciA+IDAgPyBNYXRoLm1pbihjb2RPckNvYy55Y2IsIHJlc3VsdC5QUHkgLSAxKSA6IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkUHJlY2luY3RzKGNvbnRleHQsIHJlc29sdXRpb24sIGRpbWVuc2lvbnMpIHsKKyAgICB2YXIgcHJlY2luY3RXaWR0aCA9IDEgPDwgZGltZW5zaW9ucy5QUHg7CisgICAgdmFyIHByZWNpbmN0SGVpZ2h0ID0gMSA8PCBkaW1lbnNpb25zLlBQeTsKKyAgICB2YXIgaXNaZXJvUmVzID0gcmVzb2x1dGlvbi5yZXNMZXZlbCA9PT0gMDsKKyAgICB2YXIgcHJlY2luY3RXaWR0aEluU3ViYmFuZCA9IDEgPDwgZGltZW5zaW9ucy5QUHggKyAoaXNaZXJvUmVzID8gMCA6IC0xKTsKKyAgICB2YXIgcHJlY2luY3RIZWlnaHRJblN1YmJhbmQgPSAxIDw8IGRpbWVuc2lvbnMuUFB5ICsgKGlzWmVyb1JlcyA/IDAgOiAtMSk7CisgICAgdmFyIG51bXByZWNpbmN0c3dpZGUgPSByZXNvbHV0aW9uLnRyeDEgPiByZXNvbHV0aW9uLnRyeDAgPyBNYXRoLmNlaWwocmVzb2x1dGlvbi50cngxIC8gcHJlY2luY3RXaWR0aCkgLSBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ4MCAvIHByZWNpbmN0V2lkdGgpIDogMDsKKyAgICB2YXIgbnVtcHJlY2luY3RzaGlnaCA9IHJlc29sdXRpb24udHJ5MSA+IHJlc29sdXRpb24udHJ5MCA/IE1hdGguY2VpbChyZXNvbHV0aW9uLnRyeTEgLyBwcmVjaW5jdEhlaWdodCkgLSBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ5MCAvIHByZWNpbmN0SGVpZ2h0KSA6IDA7CisgICAgdmFyIG51bXByZWNpbmN0cyA9IG51bXByZWNpbmN0c3dpZGUgKiBudW1wcmVjaW5jdHNoaWdoOworICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzID0geworICAgICAgcHJlY2luY3RXaWR0aCwKKyAgICAgIHByZWNpbmN0SGVpZ2h0LAorICAgICAgbnVtcHJlY2luY3Rzd2lkZSwKKyAgICAgIG51bXByZWNpbmN0c2hpZ2gsCisgICAgICBudW1wcmVjaW5jdHMsCisgICAgICBwcmVjaW5jdFdpZHRoSW5TdWJiYW5kLAorICAgICAgcHJlY2luY3RIZWlnaHRJblN1YmJhbmQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGRpbWVuc2lvbnMpIHsKKyAgICB2YXIgeGNiXyA9IGRpbWVuc2lvbnMueGNiXzsKKyAgICB2YXIgeWNiXyA9IGRpbWVuc2lvbnMueWNiXzsKKyAgICB2YXIgY29kZWJsb2NrV2lkdGggPSAxIDw8IHhjYl87CisgICAgdmFyIGNvZGVibG9ja0hlaWdodCA9IDEgPDwgeWNiXzsKKyAgICB2YXIgY2J4MCA9IHN1YmJhbmQudGJ4MCA+PiB4Y2JfOworICAgIHZhciBjYnkwID0gc3ViYmFuZC50YnkwID4+IHljYl87CisgICAgdmFyIGNieDEgPSBzdWJiYW5kLnRieDEgKyBjb2RlYmxvY2tXaWR0aCAtIDEgPj4geGNiXzsKKyAgICB2YXIgY2J5MSA9IHN1YmJhbmQudGJ5MSArIGNvZGVibG9ja0hlaWdodCAtIDEgPj4geWNiXzsKKyAgICB2YXIgcHJlY2luY3RQYXJhbWV0ZXJzID0gc3ViYmFuZC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVyczsKKyAgICB2YXIgY29kZWJsb2NrcyA9IFtdOworICAgIHZhciBwcmVjaW5jdHMgPSBbXTsKKyAgICB2YXIgaSwgaiwgY29kZWJsb2NrLCBwcmVjaW5jdE51bWJlcjsKKworICAgIGZvciAoaiA9IGNieTA7IGogPCBjYnkxOyBqKyspIHsKKyAgICAgIGZvciAoaSA9IGNieDA7IGkgPCBjYngxOyBpKyspIHsKKyAgICAgICAgY29kZWJsb2NrID0geworICAgICAgICAgIGNieDogaSwKKyAgICAgICAgICBjYnk6IGosCisgICAgICAgICAgdGJ4MDogY29kZWJsb2NrV2lkdGggKiBpLAorICAgICAgICAgIHRieTA6IGNvZGVibG9ja0hlaWdodCAqIGosCisgICAgICAgICAgdGJ4MTogY29kZWJsb2NrV2lkdGggKiAoaSArIDEpLAorICAgICAgICAgIHRieTE6IGNvZGVibG9ja0hlaWdodCAqIChqICsgMSkKKyAgICAgICAgfTsKKyAgICAgICAgY29kZWJsb2NrLnRieDBfID0gTWF0aC5tYXgoc3ViYmFuZC50YngwLCBjb2RlYmxvY2sudGJ4MCk7CisgICAgICAgIGNvZGVibG9jay50YnkwXyA9IE1hdGgubWF4KHN1YmJhbmQudGJ5MCwgY29kZWJsb2NrLnRieTApOworICAgICAgICBjb2RlYmxvY2sudGJ4MV8gPSBNYXRoLm1pbihzdWJiYW5kLnRieDEsIGNvZGVibG9jay50YngxKTsKKyAgICAgICAgY29kZWJsb2NrLnRieTFfID0gTWF0aC5taW4oc3ViYmFuZC50YnkxLCBjb2RlYmxvY2sudGJ5MSk7CisgICAgICAgIHZhciBwaSA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YngwXyAtIHN1YmJhbmQudGJ4MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aEluU3ViYmFuZCk7CisgICAgICAgIHZhciBwaiA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YnkwXyAtIHN1YmJhbmQudGJ5MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHRJblN1YmJhbmQpOworICAgICAgICBwcmVjaW5jdE51bWJlciA9IHBpICsgcGogKiBwcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTsKKyAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyID0gcHJlY2luY3ROdW1iZXI7CisgICAgICAgIGNvZGVibG9jay5zdWJiYW5kVHlwZSA9IHN1YmJhbmQudHlwZTsKKyAgICAgICAgY29kZWJsb2NrLkxibG9jayA9IDM7CisKKyAgICAgICAgaWYgKGNvZGVibG9jay50YngxXyA8PSBjb2RlYmxvY2sudGJ4MF8gfHwgY29kZWJsb2NrLnRieTFfIDw9IGNvZGVibG9jay50YnkwXykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7CisgICAgICAgIHZhciBwcmVjaW5jdCA9IHByZWNpbmN0c1twcmVjaW5jdE51bWJlcl07CisKKyAgICAgICAgaWYgKHByZWNpbmN0ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBpZiAoaSA8IHByZWNpbmN0LmNieE1pbikgeworICAgICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gaTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBwcmVjaW5jdC5jYnhNYXgpIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1heCA9IGk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGogPCBwcmVjaW5jdC5jYnlNaW4pIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1pbiA9IGo7CisgICAgICAgICAgfSBlbHNlIGlmIChqID4gcHJlY2luY3QuY2J5TWF4KSB7CisgICAgICAgICAgICBwcmVjaW5jdC5jYnlNYXggPSBqOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmVjaW5jdHNbcHJlY2luY3ROdW1iZXJdID0gcHJlY2luY3QgPSB7CisgICAgICAgICAgICBjYnhNaW46IGksCisgICAgICAgICAgICBjYnlNaW46IGosCisgICAgICAgICAgICBjYnhNYXg6IGksCisgICAgICAgICAgICBjYnlNYXg6IGoKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0ID0gcHJlY2luY3Q7CisgICAgICB9CisgICAgfQorCisgICAgc3ViYmFuZC5jb2RlYmxvY2tQYXJhbWV0ZXJzID0geworICAgICAgY29kZWJsb2NrV2lkdGg6IHhjYl8sCisgICAgICBjb2RlYmxvY2tIZWlnaHQ6IHljYl8sCisgICAgICBudW1jb2RlYmxvY2t3aWRlOiBjYngxIC0gY2J4MCArIDEsCisgICAgICBudW1jb2RlYmxvY2toaWdoOiBjYnkxIC0gY2J5MCArIDEKKyAgICB9OworICAgIHN1YmJhbmQuY29kZWJsb2NrcyA9IGNvZGVibG9ja3M7CisgICAgc3ViYmFuZC5wcmVjaW5jdHMgPSBwcmVjaW5jdHM7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcHJlY2luY3ROdW1iZXIsIGxheWVyTnVtYmVyKSB7CisgICAgdmFyIHByZWNpbmN0Q29kZWJsb2NrcyA9IFtdOworICAgIHZhciBzdWJiYW5kcyA9IHJlc29sdXRpb24uc3ViYmFuZHM7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdWJiYW5kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgc3ViYmFuZCA9IHN1YmJhbmRzW2ldOworICAgICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGNvZGVibG9ja3MubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICB2YXIgY29kZWJsb2NrID0gY29kZWJsb2Nrc1tqXTsKKworICAgICAgICBpZiAoY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyICE9PSBwcmVjaW5jdE51bWJlcikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJlY2luY3RDb2RlYmxvY2tzLnB1c2goY29kZWJsb2NrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgbGF5ZXJOdW1iZXIsCisgICAgICBjb2RlYmxvY2tzOiBwcmVjaW5jdENvZGVibG9ja3MKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IDA7CisKKyAgICBmb3IgKHZhciBxID0gMDsgcSA8IGNvbXBvbmVudHNDb3VudDsgcSsrKSB7CisgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBNYXRoLm1heChtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsIHRpbGUuY29tcG9uZW50c1txXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KTsKKyAgICB9CisKKyAgICB2YXIgbCA9IDAsCisgICAgICAgIHIgPSAwLAorICAgICAgICBpID0gMCwKKyAgICAgICAgayA9IDA7CisKKyAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgeworICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgbCsrKSB7CisgICAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgICAgZm9yICg7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tpXTsKKworICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzOworCisgICAgICAgICAgICBmb3IgKDsgayA8IG51bXByZWNpbmN0czspIHsKKyAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgICByZXR1cm4gcGFja2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHIgPSAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBjb21wb25lbnRzQ291bnQ7IHErKykgeworICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CisgICAgfQorCisgICAgdmFyIHIgPSAwLAorICAgICAgICBsID0gMCwKKyAgICAgICAgaSA9IDAsCisgICAgICAgIGsgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7IGwrKykgeworICAgICAgICAgIGZvciAoOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbaV07CisKKyAgICAgICAgICAgIGlmIChyID4gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgdmFyIG51bXByZWNpbmN0cyA9IHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0czsKKworICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7KSB7CisgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7CisgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBsID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgbCwgciwgYywgcDsKKyAgICB2YXIgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gMDsKKworICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CisgICAgfQorCisgICAgdmFyIG1heE51bVByZWNpbmN0c0luTGV2ZWwgPSBuZXcgSW50MzJBcnJheShtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgKyAxKTsKKworICAgIGZvciAociA9IDA7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyArK3IpIHsKKyAgICAgIHZhciBtYXhOdW1QcmVjaW5jdHMgPSAwOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyArK2MpIHsKKyAgICAgICAgdmFyIHJlc29sdXRpb25zID0gdGlsZS5jb21wb25lbnRzW2NdLnJlc29sdXRpb25zOworCisgICAgICAgIGlmIChyIDwgcmVzb2x1dGlvbnMubGVuZ3RoKSB7CisgICAgICAgICAgbWF4TnVtUHJlY2luY3RzID0gTWF0aC5tYXgobWF4TnVtUHJlY2luY3RzLCByZXNvbHV0aW9uc1tyXS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBtYXhOdW1QcmVjaW5jdHNJbkxldmVsW3JdID0gbWF4TnVtUHJlY2luY3RzOworICAgIH0KKworICAgIGwgPSAwOworICAgIHIgPSAwOworICAgIGMgPSAwOworICAgIHAgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgIGZvciAoOyBwIDwgbWF4TnVtUHJlY2luY3RzSW5MZXZlbFtyXTsgcCsrKSB7CisgICAgICAgICAgZm9yICg7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworCisgICAgICAgICAgICBpZiAociA+IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKKyAgICAgICAgICAgIHZhciBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CisKKyAgICAgICAgICAgIGlmIChwID49IG51bXByZWNpbmN0cykgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDspIHsKKyAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBwLCBsKTsKKyAgICAgICAgICAgICAgbCsrOworICAgICAgICAgICAgICByZXR1cm4gcGFja2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7CisgICAgdmFyIHByZWNpbmN0c0l0ZXJhdGlvblNpemVzID0gcHJlY2luY3RzU2l6ZXM7CisgICAgdmFyIGwgPSAwLAorICAgICAgICByID0gMCwKKyAgICAgICAgYyA9IDAsCisgICAgICAgIHB4ID0gMCwKKyAgICAgICAgcHkgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyBweSA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bUhpZ2g7IHB5KyspIHsKKyAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykgeworICAgICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisKKyAgICAgICAgICAgIGZvciAoOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgICB2YXIgc2l6ZUluSW1hZ2VTY2FsZSA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY10ucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHgsIHB5LCBzaXplSW5JbWFnZVNjYWxlLCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB4ID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgcHJlY2luY3RzU2l6ZXMgPSBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpOworICAgIHZhciBsID0gMCwKKyAgICAgICAgciA9IDAsCisgICAgICAgIGMgPSAwLAorICAgICAgICBweCA9IDAsCisgICAgICAgIHB5ID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7CisgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICAgIHZhciBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyA9IHByZWNpbmN0c1NpemVzLmNvbXBvbmVudHNbY107CisgICAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKKworICAgICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7CisgICAgICAgICAgZm9yICg7IHB4IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtV2lkZTsgcHgrKykgeworICAgICAgICAgICAgZm9yICg7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICAgIHZhciBrID0gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHgsIHB5LCBzaXplSW5JbWFnZVNjYWxlLCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBweCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBweSA9IDA7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHhJbmRleCwgcHlJbmRleCwgc2l6ZUluSW1hZ2VTY2FsZSwgcHJlY2luY3RJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbikgeworICAgIHZhciBwb3NYID0gcHhJbmRleCAqIHByZWNpbmN0SXRlcmF0aW9uU2l6ZXMubWluV2lkdGg7CisgICAgdmFyIHBvc1kgPSBweUluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5IZWlnaHQ7CisKKyAgICBpZiAocG9zWCAlIHNpemVJbkltYWdlU2NhbGUud2lkdGggIT09IDAgfHwgcG9zWSAlIHNpemVJbkltYWdlU2NhbGUuaGVpZ2h0ICE9PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgc3RhcnRQcmVjaW5jdFJvd0luZGV4ID0gcG9zWSAvIHNpemVJbkltYWdlU2NhbGUud2lkdGggKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlOworICAgIHJldHVybiBwb3NYIC8gc2l6ZUluSW1hZ2VTY2FsZS5oZWlnaHQgKyBzdGFydFByZWNpbmN0Um93SW5kZXg7CisgIH0KKworICBmdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpIHsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gdGlsZS5jb21wb25lbnRzLmxlbmd0aDsKKyAgICB2YXIgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFOworICAgIHZhciBtaW5IZWlnaHQgPSBOdW1iZXIuTUFYX1ZBTFVFOworICAgIHZhciBtYXhOdW1XaWRlID0gMDsKKyAgICB2YXIgbWF4TnVtSGlnaCA9IDA7CisgICAgdmFyIHNpemVQZXJDb21wb25lbnQgPSBuZXcgQXJyYXkoY29tcG9uZW50c0NvdW50KTsKKworICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisgICAgICB2YXIgc2l6ZVBlclJlc29sdXRpb24gPSBuZXcgQXJyYXkoZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ICsgMSk7CisgICAgICB2YXIgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgIHZhciBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgIHZhciBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IDA7CisgICAgICB2YXIgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSAwOworICAgICAgdmFyIHNjYWxlID0gMTsKKworICAgICAgZm9yICh2YXIgciA9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgciA+PSAwOyAtLXIpIHsKKyAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgIHZhciB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uID0gc2NhbGUgKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdFdpZHRoOworICAgICAgICB2YXIgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24gPSBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0OworICAgICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1pbihtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsIHdpZHRoQ3VycmVudFJlc29sdXRpb24pOworICAgICAgICBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4obWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24pOworICAgICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IE1hdGgubWF4KG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LCByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlKTsKKyAgICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCwgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzaGlnaCk7CisgICAgICAgIHNpemVQZXJSZXNvbHV0aW9uW3JdID0geworICAgICAgICAgIHdpZHRoOiB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uLAorICAgICAgICAgIGhlaWdodDogaGVpZ2h0Q3VycmVudFJlc29sdXRpb24KKyAgICAgICAgfTsKKyAgICAgICAgc2NhbGUgPDw9IDE7CisgICAgICB9CisKKyAgICAgIG1pbldpZHRoID0gTWF0aC5taW4obWluV2lkdGgsIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCk7CisgICAgICBtaW5IZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQpOworICAgICAgbWF4TnVtV2lkZSA9IE1hdGgubWF4KG1heE51bVdpZGUsIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50KTsKKyAgICAgIG1heE51bUhpZ2ggPSBNYXRoLm1heChtYXhOdW1IaWdoLCBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCk7CisgICAgICBzaXplUGVyQ29tcG9uZW50W2NdID0geworICAgICAgICByZXNvbHV0aW9uczogc2l6ZVBlclJlc29sdXRpb24sCisgICAgICAgIG1pbldpZHRoOiBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1pbkhlaWdodDogbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwKKyAgICAgICAgbWF4TnVtV2lkZTogbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1heE51bUhpZ2g6IG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50CisgICAgICB9OworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBjb21wb25lbnRzOiBzaXplUGVyQ29tcG9uZW50LAorICAgICAgbWluV2lkdGgsCisgICAgICBtaW5IZWlnaHQsCisgICAgICBtYXhOdW1XaWRlLAorICAgICAgbWF4TnVtSGlnaAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBidWlsZFBhY2tldHMoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisKKyAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OworICAgICAgdmFyIHJlc29sdXRpb25zID0gW107CisgICAgICB2YXIgc3ViYmFuZHMgPSBbXTsKKworICAgICAgZm9yICh2YXIgciA9IDA7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKKyAgICAgICAgdmFyIGJsb2Nrc0RpbWVuc2lvbnMgPSBnZXRCbG9ja3NEaW1lbnNpb25zKGNvbnRleHQsIGNvbXBvbmVudCwgcik7CisgICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CisgICAgICAgIHZhciBzY2FsZSA9IDEgPDwgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50IC0gcjsKKyAgICAgICAgcmVzb2x1dGlvbi50cngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnRyeTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7CisgICAgICAgIHJlc29sdXRpb24udHJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTsKKyAgICAgICAgcmVzb2x1dGlvbi50cnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnJlc0xldmVsID0gcjsKKyAgICAgICAgYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgIHJlc29sdXRpb25zLnB1c2gocmVzb2x1dGlvbik7CisgICAgICAgIHZhciBzdWJiYW5kOworCisgICAgICAgIGlmIChyID09PSAwKSB7CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJMTCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIHNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IFtzdWJiYW5kXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgYnNjYWxlID0gMSA8PCBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByICsgMTsKKyAgICAgICAgICB2YXIgcmVzb2x1dGlvblN1YmJhbmRzID0gW107CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJITCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOworICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTsKKyAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHN1YmJhbmQgPSB7fTsKKyAgICAgICAgICBzdWJiYW5kLnR5cGUgPSAiTEgiOworICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKyAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICBzdWJiYW5kID0ge307CisgICAgICAgICAgc3ViYmFuZC50eXBlID0gIkhIIjsKKyAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IHJlc29sdXRpb25TdWJiYW5kczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb21wb25lbnQucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uczsKKyAgICAgIGNvbXBvbmVudC5zdWJiYW5kcyA9IHN1YmJhbmRzOworICAgIH0KKworICAgIHZhciBwcm9ncmVzc2lvbk9yZGVyID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7CisKKyAgICBzd2l0Y2ggKHByb2dyZXNzaW9uT3JkZXIpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvbkxheWVyQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihgVW5zdXBwb3J0ZWQgcHJvZ3Jlc3Npb24gb3JkZXIgJHtwcm9ncmVzc2lvbk9yZGVyfWApOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgb2Zmc2V0LCBkYXRhTGVuZ3RoKSB7CisgICAgdmFyIHBvc2l0aW9uID0gMDsKKyAgICB2YXIgYnVmZmVyLAorICAgICAgICBidWZmZXJTaXplID0gMCwKKyAgICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTsKKworICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGNvdW50KSB7CisgICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IGNvdW50KSB7CisgICAgICAgIHZhciBiID0gZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl07CisgICAgICAgIHBvc2l0aW9uKys7CisKKyAgICAgICAgaWYgKHNraXBOZXh0Qml0KSB7CisgICAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDcgfCBiOworICAgICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKKyAgICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCA4IHwgYjsKKyAgICAgICAgICBidWZmZXJTaXplICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYiA9PT0gMHhmZikgeworICAgICAgICAgIHNraXBOZXh0Qml0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBidWZmZXJTaXplIC09IGNvdW50OworICAgICAgcmV0dXJuIGJ1ZmZlciA+Pj4gYnVmZmVyU2l6ZSAmICgxIDw8IGNvdW50KSAtIDE7CisgICAgfQorCisgICAgZnVuY3Rpb24gc2tpcE1hcmtlcklmRXF1YWwodmFsdWUpIHsKKyAgICAgIGlmIChkYXRhW29mZnNldCArIHBvc2l0aW9uIC0gMV0gPT09IDB4ZmYgJiYgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl0gPT09IHZhbHVlKSB7CisgICAgICAgIHNraXBCeXRlcygxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSAweGZmICYmIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb24gKyAxXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgc2tpcEJ5dGVzKDIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIHNraXBCeXRlcyhjb3VudCkgeworICAgICAgcG9zaXRpb24gKz0gY291bnQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKSB7CisgICAgICBidWZmZXJTaXplID0gMDsKKworICAgICAgaWYgKHNraXBOZXh0Qml0KSB7CisgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgIHNraXBOZXh0Qml0ID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVhZENvZGluZ3Bhc3NlcygpIHsKKyAgICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlYWRCaXRzKDEpID09PSAwKSB7CisgICAgICAgIHJldHVybiAyOworICAgICAgfQorCisgICAgICB2YXIgdmFsdWUgPSByZWFkQml0cygyKTsKKworICAgICAgaWYgKHZhbHVlIDwgMykgeworICAgICAgICByZXR1cm4gdmFsdWUgKyAzOworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHJlYWRCaXRzKDUpOworCisgICAgICBpZiAodmFsdWUgPCAzMSkgeworICAgICAgICByZXR1cm4gdmFsdWUgKyA2OworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHJlYWRCaXRzKDcpOworICAgICAgcmV0dXJuIHZhbHVlICsgMzc7CisgICAgfQorCisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIHNvcE1hcmtlclVzZWQgPSBjb250ZXh0LkNPRC5zb3BNYXJrZXJVc2VkOworICAgIHZhciBlcGhNYXJrZXJVc2VkID0gY29udGV4dC5DT0QuZXBoTWFya2VyVXNlZDsKKyAgICB2YXIgcGFja2V0c0l0ZXJhdG9yID0gdGlsZS5wYWNrZXRzSXRlcmF0b3I7CisKKyAgICB3aGlsZSAocG9zaXRpb24gPCBkYXRhTGVuZ3RoKSB7CisgICAgICBhbGlnblRvQnl0ZSgpOworCisgICAgICBpZiAoc29wTWFya2VyVXNlZCAmJiBza2lwTWFya2VySWZFcXVhbCgweDkxKSkgeworICAgICAgICBza2lwQnl0ZXMoNCk7CisgICAgICB9CisKKyAgICAgIHZhciBwYWNrZXQgPSBwYWNrZXRzSXRlcmF0b3IubmV4dFBhY2tldCgpOworCisgICAgICBpZiAoIXJlYWRCaXRzKDEpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgbGF5ZXJOdW1iZXIgPSBwYWNrZXQubGF5ZXJOdW1iZXI7CisgICAgICB2YXIgcXVldWUgPSBbXSwKKyAgICAgICAgICBjb2RlYmxvY2s7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhY2tldC5jb2RlYmxvY2tzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29kZWJsb2NrID0gcGFja2V0LmNvZGVibG9ja3NbaV07CisgICAgICAgIHZhciBwcmVjaW5jdCA9IGNvZGVibG9jay5wcmVjaW5jdDsKKyAgICAgICAgdmFyIGNvZGVibG9ja0NvbHVtbiA9IGNvZGVibG9jay5jYnggLSBwcmVjaW5jdC5jYnhNaW47CisgICAgICAgIHZhciBjb2RlYmxvY2tSb3cgPSBjb2RlYmxvY2suY2J5IC0gcHJlY2luY3QuY2J5TWluOworICAgICAgICB2YXIgY29kZWJsb2NrSW5jbHVkZWQgPSBmYWxzZTsKKyAgICAgICAgdmFyIGZpcnN0VGltZUluY2x1c2lvbiA9IGZhbHNlOworICAgICAgICB2YXIgdmFsdWVSZWFkeTsKKworICAgICAgICBpZiAoY29kZWJsb2NrLmluY2x1ZGVkICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBjb2RlYmxvY2tJbmNsdWRlZCA9ICEhcmVhZEJpdHMoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJlY2luY3QgPSBjb2RlYmxvY2sucHJlY2luY3Q7CisgICAgICAgICAgdmFyIGluY2x1c2lvblRyZWUsIHplcm9CaXRQbGFuZXNUcmVlOworCisgICAgICAgICAgaWYgKHByZWNpbmN0LmluY2x1c2lvblRyZWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgaW5jbHVzaW9uVHJlZSA9IHByZWNpbmN0LmluY2x1c2lvblRyZWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciB3aWR0aCA9IHByZWNpbmN0LmNieE1heCAtIHByZWNpbmN0LmNieE1pbiArIDE7CisgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcHJlY2luY3QuY2J5TWF4IC0gcHJlY2luY3QuY2J5TWluICsgMTsKKyAgICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBuZXcgSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBsYXllck51bWJlcik7CisgICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IG5ldyBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgcHJlY2luY3QuaW5jbHVzaW9uVHJlZSA9IGluY2x1c2lvblRyZWU7CisgICAgICAgICAgICBwcmVjaW5jdC56ZXJvQml0UGxhbmVzVHJlZSA9IHplcm9CaXRQbGFuZXNUcmVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpbmNsdXNpb25UcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93LCBsYXllck51bWJlcikpIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgeworICAgICAgICAgICAgICAgIHZhbHVlUmVhZHkgPSAhaW5jbHVzaW9uVHJlZS5uZXh0TGV2ZWwoKTsKKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CisgICAgICAgICAgICAgICAgICBjb2RlYmxvY2suaW5jbHVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgY29kZWJsb2NrSW5jbHVkZWQgPSBmaXJzdFRpbWVJbmNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluY2x1c2lvblRyZWUuaW5jcmVtZW50VmFsdWUobGF5ZXJOdW1iZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb2RlYmxvY2tJbmNsdWRlZCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0VGltZUluY2x1c2lvbikgeworICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlID0gcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWU7CisgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUucmVzZXQoY29kZWJsb2NrQ29sdW1uLCBjb2RlYmxvY2tSb3cpOworCisgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgeworICAgICAgICAgICAgICB2YWx1ZVJlYWR5ID0gIXplcm9CaXRQbGFuZXNUcmVlLm5leHRMZXZlbCgpOworCisgICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlLmluY3JlbWVudFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMgPSB6ZXJvQml0UGxhbmVzVHJlZS52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBjb2RpbmdwYXNzZXMgPSByZWFkQ29kaW5ncGFzc2VzKCk7CisKKyAgICAgICAgd2hpbGUgKHJlYWRCaXRzKDEpKSB7CisgICAgICAgICAgY29kZWJsb2NrLkxibG9jaysrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNvZGluZ3Bhc3Nlc0xvZzIgPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoY29kaW5ncGFzc2VzKTsKKyAgICAgICAgdmFyIGJpdHMgPSAoY29kaW5ncGFzc2VzIDwgMSA8PCBjb2RpbmdwYXNzZXNMb2cyID8gY29kaW5ncGFzc2VzTG9nMiAtIDEgOiBjb2RpbmdwYXNzZXNMb2cyKSArIGNvZGVibG9jay5MYmxvY2s7CisgICAgICAgIHZhciBjb2RlZERhdGFMZW5ndGggPSByZWFkQml0cyhiaXRzKTsKKyAgICAgICAgcXVldWUucHVzaCh7CisgICAgICAgICAgY29kZWJsb2NrLAorICAgICAgICAgIGNvZGluZ3Bhc3NlcywKKyAgICAgICAgICBkYXRhTGVuZ3RoOiBjb2RlZERhdGFMZW5ndGgKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGFsaWduVG9CeXRlKCk7CisKKyAgICAgIGlmIChlcGhNYXJrZXJVc2VkKSB7CisgICAgICAgIHNraXBNYXJrZXJJZkVxdWFsKDB4OTIpOworICAgICAgfQorCisgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgeworICAgICAgICB2YXIgcGFja2V0SXRlbSA9IHF1ZXVlLnNoaWZ0KCk7CisgICAgICAgIGNvZGVibG9jayA9IHBhY2tldEl0ZW0uY29kZWJsb2NrOworCisgICAgICAgIGlmIChjb2RlYmxvY2suZGF0YSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgY29kZWJsb2NrLmRhdGEgPSBbXTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGVibG9jay5kYXRhLnB1c2goeworICAgICAgICAgIGRhdGEsCisgICAgICAgICAgc3RhcnQ6IG9mZnNldCArIHBvc2l0aW9uLAorICAgICAgICAgIGVuZDogb2Zmc2V0ICsgcG9zaXRpb24gKyBwYWNrZXRJdGVtLmRhdGFMZW5ndGgsCisgICAgICAgICAgY29kaW5ncGFzc2VzOiBwYWNrZXRJdGVtLmNvZGluZ3Bhc3NlcworICAgICAgICB9KTsKKyAgICAgICAgcG9zaXRpb24gKz0gcGFja2V0SXRlbS5kYXRhTGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwb3NpdGlvbjsKKyAgfQorCisgIGZ1bmN0aW9uIGNvcHlDb2VmZmljaWVudHMoY29lZmZpY2llbnRzLCBsZXZlbFdpZHRoLCBsZXZlbEhlaWdodCwgc3ViYmFuZCwgZGVsdGEsIG1iLCByZXZlcnNpYmxlLCBzZWdtZW50YXRpb25TeW1ib2xVc2VkKSB7CisgICAgdmFyIHgwID0gc3ViYmFuZC50YngwOworICAgIHZhciB5MCA9IHN1YmJhbmQudGJ5MDsKKyAgICB2YXIgd2lkdGggPSBzdWJiYW5kLnRieDEgLSBzdWJiYW5kLnRieDA7CisgICAgdmFyIGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7CisgICAgdmFyIHJpZ2h0ID0gc3ViYmFuZC50eXBlLmNoYXJBdCgwKSA9PT0gIkgiID8gMSA6IDA7CisgICAgdmFyIGJvdHRvbSA9IHN1YmJhbmQudHlwZS5jaGFyQXQoMSkgPT09ICJIIiA/IGxldmVsV2lkdGggOiAwOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29kZWJsb2Nrcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICB2YXIgY29kZWJsb2NrID0gY29kZWJsb2Nrc1tpXTsKKyAgICAgIHZhciBibG9ja1dpZHRoID0gY29kZWJsb2NrLnRieDFfIC0gY29kZWJsb2NrLnRieDBfOworICAgICAgdmFyIGJsb2NrSGVpZ2h0ID0gY29kZWJsb2NrLnRieTFfIC0gY29kZWJsb2NrLnRieTBfOworCisgICAgICBpZiAoYmxvY2tXaWR0aCA9PT0gMCB8fCBibG9ja0hlaWdodCA9PT0gMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvZGVibG9jay5kYXRhID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHZhciBiaXRNb2RlbCwgY3VycmVudENvZGluZ3Bhc3NUeXBlOworICAgICAgYml0TW9kZWwgPSBuZXcgQml0TW9kZWwoYmxvY2tXaWR0aCwgYmxvY2tIZWlnaHQsIGNvZGVibG9jay5zdWJiYW5kVHlwZSwgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMsIG1iKTsKKyAgICAgIGN1cnJlbnRDb2RpbmdwYXNzVHlwZSA9IDI7CisgICAgICB2YXIgZGF0YSA9IGNvZGVibG9jay5kYXRhLAorICAgICAgICAgIHRvdGFsTGVuZ3RoID0gMCwKKyAgICAgICAgICBjb2RpbmdwYXNzZXMgPSAwOworICAgICAgdmFyIGosIGpqLCBkYXRhSXRlbTsKKworICAgICAgZm9yIChqID0gMCwgamogPSBkYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgZGF0YUl0ZW0gPSBkYXRhW2pdOworICAgICAgICB0b3RhbExlbmd0aCArPSBkYXRhSXRlbS5lbmQgLSBkYXRhSXRlbS5zdGFydDsKKyAgICAgICAgY29kaW5ncGFzc2VzICs9IGRhdGFJdGVtLmNvZGluZ3Bhc3NlczsKKyAgICAgIH0KKworICAgICAgdmFyIGVuY29kZWREYXRhID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpOworICAgICAgdmFyIHBvc2l0aW9uID0gMDsKKworICAgICAgZm9yIChqID0gMCwgamogPSBkYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgZGF0YUl0ZW0gPSBkYXRhW2pdOworICAgICAgICB2YXIgY2h1bmsgPSBkYXRhSXRlbS5kYXRhLnN1YmFycmF5KGRhdGFJdGVtLnN0YXJ0LCBkYXRhSXRlbS5lbmQpOworICAgICAgICBlbmNvZGVkRGF0YS5zZXQoY2h1bmssIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gY2h1bmsubGVuZ3RoOworICAgICAgfQorCisgICAgICB2YXIgZGVjb2RlciA9IG5ldyBfYXJpdGhtZXRpY19kZWNvZGVyLkFyaXRobWV0aWNEZWNvZGVyKGVuY29kZWREYXRhLCAwLCB0b3RhbExlbmd0aCk7CisgICAgICBiaXRNb2RlbC5zZXREZWNvZGVyKGRlY29kZXIpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgY29kaW5ncGFzc2VzOyBqKyspIHsKKyAgICAgICAgc3dpdGNoIChjdXJyZW50Q29kaW5ncGFzc1R5cGUpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBiaXRNb2RlbC5ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYml0TW9kZWwucnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYml0TW9kZWwucnVuQ2xlYW51cFBhc3MoKTsKKworICAgICAgICAgICAgaWYgKHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpIHsKKyAgICAgICAgICAgICAgYml0TW9kZWwuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAoY3VycmVudENvZGluZ3Bhc3NUeXBlICsgMSkgJSAzOworICAgICAgfQorCisgICAgICB2YXIgb2Zmc2V0ID0gY29kZWJsb2NrLnRieDBfIC0geDAgKyAoY29kZWJsb2NrLnRieTBfIC0geTApICogd2lkdGg7CisgICAgICB2YXIgc2lnbiA9IGJpdE1vZGVsLmNvZWZmaWNlbnRzU2lnbjsKKyAgICAgIHZhciBtYWduaXR1ZGUgPSBiaXRNb2RlbC5jb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgIHZhciBiaXRzRGVjb2RlZCA9IGJpdE1vZGVsLmJpdHNEZWNvZGVkOworICAgICAgdmFyIG1hZ25pdHVkZUNvcnJlY3Rpb24gPSByZXZlcnNpYmxlID8gMCA6IDAuNTsKKyAgICAgIHZhciBrLCBuLCBuYjsKKyAgICAgIHBvc2l0aW9uID0gMDsKKyAgICAgIHZhciBpbnRlcmxlYXZlID0gc3ViYmFuZC50eXBlICE9PSAiTEwiOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgYmxvY2tIZWlnaHQ7IGorKykgeworICAgICAgICB2YXIgcm93ID0gb2Zmc2V0IC8gd2lkdGggfCAwOworICAgICAgICB2YXIgbGV2ZWxPZmZzZXQgPSAyICogcm93ICogKGxldmVsV2lkdGggLSB3aWR0aCkgKyByaWdodCArIGJvdHRvbTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgYmxvY2tXaWR0aDsgaysrKSB7CisgICAgICAgICAgbiA9IG1hZ25pdHVkZVtwb3NpdGlvbl07CisKKyAgICAgICAgICBpZiAobiAhPT0gMCkgeworICAgICAgICAgICAgbiA9IChuICsgbWFnbml0dWRlQ29ycmVjdGlvbikgKiBkZWx0YTsKKworICAgICAgICAgICAgaWYgKHNpZ25bcG9zaXRpb25dICE9PSAwKSB7CisgICAgICAgICAgICAgIG4gPSAtbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmIgPSBiaXRzRGVjb2RlZFtwb3NpdGlvbl07CisgICAgICAgICAgICB2YXIgcG9zID0gaW50ZXJsZWF2ZSA/IGxldmVsT2Zmc2V0ICsgKG9mZnNldCA8PCAxKSA6IG9mZnNldDsKKworICAgICAgICAgICAgaWYgKHJldmVyc2libGUgJiYgbmIgPj0gbWIpIHsKKyAgICAgICAgICAgICAgY29lZmZpY2llbnRzW3Bvc10gPSBuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY29lZmZpY2llbnRzW3Bvc10gPSBuICogKDEgPDwgbWIgLSBuYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgcG9zaXRpb24rKzsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSB3aWR0aCAtIGJsb2NrV2lkdGg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gdHJhbnNmb3JtVGlsZShjb250ZXh0LCB0aWxlLCBjKSB7CisgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKyAgICB2YXIgY29kaW5nU3R5bGVQYXJhbWV0ZXJzID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVyczsKKyAgICB2YXIgcXVhbnRpemF0aW9uUGFyYW1ldGVycyA9IGNvbXBvbmVudC5xdWFudGl6YXRpb25QYXJhbWV0ZXJzOworICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBjb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OworICAgIHZhciBzcHFjZHMgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlNQcWNkczsKKyAgICB2YXIgc2NhbGFyRXhwb3VuZGVkID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5zY2FsYXJFeHBvdW5kZWQ7CisgICAgdmFyIGd1YXJkQml0cyA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuZ3VhcmRCaXRzOworICAgIHZhciBzZWdtZW50YXRpb25TeW1ib2xVc2VkID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQ7CisgICAgdmFyIHByZWNpc2lvbiA9IGNvbnRleHQuY29tcG9uZW50c1tjXS5wcmVjaXNpb247CisgICAgdmFyIHJldmVyc2libGUgPSBjb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uOworICAgIHZhciB0cmFuc2Zvcm0gPSByZXZlcnNpYmxlID8gbmV3IFJldmVyc2libGVUcmFuc2Zvcm0oKSA6IG5ldyBJcnJldmVyc2libGVUcmFuc2Zvcm0oKTsKKyAgICB2YXIgc3ViYmFuZENvZWZmaWNpZW50cyA9IFtdOworICAgIHZhciBiID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgaSsrKSB7CisgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tpXTsKKyAgICAgIHZhciB3aWR0aCA9IHJlc29sdXRpb24udHJ4MSAtIHJlc29sdXRpb24udHJ4MDsKKyAgICAgIHZhciBoZWlnaHQgPSByZXNvbHV0aW9uLnRyeTEgLSByZXNvbHV0aW9uLnRyeTA7CisgICAgICB2YXIgY29lZmZpY2llbnRzID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCk7CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHJlc29sdXRpb24uc3ViYmFuZHMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICB2YXIgbXUsIGVwc2lsb247CisKKyAgICAgICAgaWYgKCFzY2FsYXJFeHBvdW5kZWQpIHsKKyAgICAgICAgICBtdSA9IHNwcWNkc1swXS5tdTsKKyAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzWzBdLmVwc2lsb24gKyAoaSA+IDAgPyAxIC0gaSA6IDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG11ID0gc3BxY2RzW2JdLm11OworICAgICAgICAgIGVwc2lsb24gPSBzcHFjZHNbYl0uZXBzaWxvbjsKKyAgICAgICAgICBiKys7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3ViYmFuZCA9IHJlc29sdXRpb24uc3ViYmFuZHNbal07CisgICAgICAgIHZhciBnYWluTG9nMiA9IFN1YmJhbmRzR2FpbkxvZzJbc3ViYmFuZC50eXBlXTsKKyAgICAgICAgdmFyIGRlbHRhID0gcmV2ZXJzaWJsZSA/IDEgOiAyICoqIChwcmVjaXNpb24gKyBnYWluTG9nMiAtIGVwc2lsb24pICogKDEgKyBtdSAvIDIwNDgpOworICAgICAgICB2YXIgbWIgPSBndWFyZEJpdHMgKyBlcHNpbG9uIC0gMTsKKyAgICAgICAgY29weUNvZWZmaWNpZW50cyhjb2VmZmljaWVudHMsIHdpZHRoLCBoZWlnaHQsIHN1YmJhbmQsIGRlbHRhLCBtYiwgcmV2ZXJzaWJsZSwgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCk7CisgICAgICB9CisKKyAgICAgIHN1YmJhbmRDb2VmZmljaWVudHMucHVzaCh7CisgICAgICAgIHdpZHRoLAorICAgICAgICBoZWlnaHQsCisgICAgICAgIGl0ZW1zOiBjb2VmZmljaWVudHMKKyAgICAgIH0pOworICAgIH0KKworICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm0uY2FsY3VsYXRlKHN1YmJhbmRDb2VmZmljaWVudHMsIGNvbXBvbmVudC50Y3gwLCBjb21wb25lbnQudGN5MCk7CisgICAgcmV0dXJuIHsKKyAgICAgIGxlZnQ6IGNvbXBvbmVudC50Y3gwLAorICAgICAgdG9wOiBjb21wb25lbnQudGN5MCwKKyAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsCisgICAgICBoZWlnaHQ6IHJlc3VsdC5oZWlnaHQsCisgICAgICBpdGVtczogcmVzdWx0Lml0ZW1zCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zZm9ybUNvbXBvbmVudHMoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgY29tcG9uZW50cyA9IGNvbnRleHQuY29tcG9uZW50czsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIHJlc3VsdEltYWdlcyA9IFtdOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29udGV4dC50aWxlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbaV07CisgICAgICB2YXIgdHJhbnNmb3JtZWRUaWxlcyA9IFtdOworICAgICAgdmFyIGM7CisKKyAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgICB0cmFuc2Zvcm1lZFRpbGVzW2NdID0gdHJhbnNmb3JtVGlsZShjb250ZXh0LCB0aWxlLCBjKTsKKyAgICAgIH0KKworICAgICAgdmFyIHRpbGUwID0gdHJhbnNmb3JtZWRUaWxlc1swXTsKKyAgICAgIHZhciBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodGlsZTAuaXRlbXMubGVuZ3RoICogY29tcG9uZW50c0NvdW50KTsKKyAgICAgIHZhciByZXN1bHQgPSB7CisgICAgICAgIGxlZnQ6IHRpbGUwLmxlZnQsCisgICAgICAgIHRvcDogdGlsZTAudG9wLAorICAgICAgICB3aWR0aDogdGlsZTAud2lkdGgsCisgICAgICAgIGhlaWdodDogdGlsZTAuaGVpZ2h0LAorICAgICAgICBpdGVtczogb3V0CisgICAgICB9OworICAgICAgdmFyIHNoaWZ0LCBvZmZzZXQ7CisgICAgICB2YXIgcG9zID0gMCwKKyAgICAgICAgICBqLAorICAgICAgICAgIGpqLAorICAgICAgICAgIHkwLAorICAgICAgICAgIHkxLAorICAgICAgICAgIHkyOworCisgICAgICBpZiAodGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKSB7CisgICAgICAgIHZhciBmb3VyQ29tcG9uZW50cyA9IGNvbXBvbmVudHNDb3VudCA9PT0gNDsKKyAgICAgICAgdmFyIHkwaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdLml0ZW1zOworICAgICAgICB2YXIgeTFpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMV0uaXRlbXM7CisgICAgICAgIHZhciB5Mml0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1syXS5pdGVtczsKKyAgICAgICAgdmFyIHkzaXRlbXMgPSBmb3VyQ29tcG9uZW50cyA/IHRyYW5zZm9ybWVkVGlsZXNbM10uaXRlbXMgOiBudWxsOworICAgICAgICBzaGlmdCA9IGNvbXBvbmVudHNbMF0ucHJlY2lzaW9uIC0gODsKKyAgICAgICAgb2Zmc2V0ID0gKDEyOCA8PCBzaGlmdCkgKyAwLjU7CisgICAgICAgIHZhciBjb21wb25lbnQwID0gdGlsZS5jb21wb25lbnRzWzBdOworICAgICAgICB2YXIgYWxwaGEwMSA9IGNvbXBvbmVudHNDb3VudCAtIDM7CisgICAgICAgIGpqID0geTBpdGVtcy5sZW5ndGg7CisKKyAgICAgICAgaWYgKCFjb21wb25lbnQwLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgamo7IGorKywgcG9zICs9IGFscGhhMDEpIHsKKyAgICAgICAgICAgIHkwID0geTBpdGVtc1tqXSArIG9mZnNldDsKKyAgICAgICAgICAgIHkxID0geTFpdGVtc1tqXTsKKyAgICAgICAgICAgIHkyID0geTJpdGVtc1tqXTsKKyAgICAgICAgICAgIG91dFtwb3MrK10gPSB5MCArIDEuNDAyICogeTIgPj4gc2hpZnQ7CisgICAgICAgICAgICBvdXRbcG9zKytdID0geTAgLSAwLjM0NDEzICogeTEgLSAwLjcxNDE0ICogeTIgPj4gc2hpZnQ7CisgICAgICAgICAgICBvdXRbcG9zKytdID0geTAgKyAxLjc3MiAqIHkxID4+IHNoaWZ0OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgamo7IGorKywgcG9zICs9IGFscGhhMDEpIHsKKyAgICAgICAgICAgIHkwID0geTBpdGVtc1tqXSArIG9mZnNldDsKKyAgICAgICAgICAgIHkxID0geTFpdGVtc1tqXTsKKyAgICAgICAgICAgIHkyID0geTJpdGVtc1tqXTsKKyAgICAgICAgICAgIGNvbnN0IGcgPSB5MCAtICh5MiArIHkxID4+IDIpOworICAgICAgICAgICAgb3V0W3BvcysrXSA9IGcgKyB5MiA+PiBzaGlmdDsKKyAgICAgICAgICAgIG91dFtwb3MrK10gPSBnID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IGcgKyB5MSA+PiBzaGlmdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91ckNvbXBvbmVudHMpIHsKKyAgICAgICAgICBmb3IgKGogPSAwLCBwb3MgPSAzOyBqIDwgamo7IGorKywgcG9zICs9IDQpIHsKKyAgICAgICAgICAgIG91dFtwb3NdID0geTNpdGVtc1tqXSArIG9mZnNldCA+PiBzaGlmdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgICAgIHZhciBpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbY10uaXRlbXM7CisgICAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzW2NdLnByZWNpc2lvbiAtIDg7CisgICAgICAgICAgb2Zmc2V0ID0gKDEyOCA8PCBzaGlmdCkgKyAwLjU7CisKKyAgICAgICAgICBmb3IgKHBvcyA9IGMsIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICAgIG91dFtwb3NdID0gaXRlbXNbal0gKyBvZmZzZXQgPj4gc2hpZnQ7CisgICAgICAgICAgICBwb3MgKz0gY29tcG9uZW50c0NvdW50OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXN1bHRJbWFnZXMucHVzaChyZXN1bHQpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHRJbWFnZXM7CisgIH0KKworICBmdW5jdGlvbiBpbml0aWFsaXplVGlsZShjb250ZXh0LCB0aWxlSW5kZXgpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworCisgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKyAgICAgIHZhciBxY2RPclFjYyA9IGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NdICE9PSB1bmRlZmluZWQgPyBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjXSA6IGNvbnRleHQuY3VycmVudFRpbGUuUUNEOworICAgICAgY29tcG9uZW50LnF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBxY2RPclFjYzsKKyAgICAgIHZhciBjb2RPckNvYyA9IGNvbnRleHQuY3VycmVudFRpbGUuQ09DW2NdICE9PSB1bmRlZmluZWQgPyBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXSA6IGNvbnRleHQuY3VycmVudFRpbGUuQ09EOworICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvZE9yQ29jOworICAgIH0KKworICAgIHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycyA9IGNvbnRleHQuY3VycmVudFRpbGUuQ09EOworICB9CisKKyAgdmFyIFRhZ1RyZWUgPSBmdW5jdGlvbiBUYWdUcmVlQ2xvc3VyZSgpIHsKKyAgICBmdW5jdGlvbiBUYWdUcmVlKHdpZHRoLCBoZWlnaHQpIHsKKyAgICAgIHZhciBsZXZlbHNMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpICsgMTsKKyAgICAgIHRoaXMubGV2ZWxzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGV2ZWxzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGxldmVsID0geworICAgICAgICAgIHdpZHRoLAorICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICBpdGVtczogW10KKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7CisgICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7CisgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBUYWdUcmVlLnByb3RvdHlwZSA9IHsKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBUYWdUcmVlX3Jlc2V0KGksIGopIHsKKyAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IDAsCisgICAgICAgICAgICB2YWx1ZSA9IDAsCisgICAgICAgICAgICBsZXZlbDsKKworICAgICAgICB3aGlsZSAoY3VycmVudExldmVsIDwgdGhpcy5sZXZlbHMubGVuZ3RoKSB7CisgICAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICAgIHZhciBpbmRleCA9IGkgKyBqICogbGV2ZWwud2lkdGg7CisKKyAgICAgICAgICBpZiAobGV2ZWwuaXRlbXNbaW5kZXhdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbGV2ZWwuaXRlbXNbaW5kZXhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICBpID4+PSAxOworICAgICAgICAgIGogPj49IDE7CisgICAgICAgICAgY3VycmVudExldmVsKys7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50TGV2ZWwtLTsKKyAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7CisgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlOworICAgICAgfSwKKyAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBUYWdUcmVlX2luY3JlbWVudFZhbHVlKCkgeworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSsrOworICAgICAgfSwKKyAgICAgIG5leHRMZXZlbDogZnVuY3Rpb24gVGFnVHJlZV9uZXh0TGV2ZWwoKSB7CisgICAgICAgIHZhciBjdXJyZW50TGV2ZWwgPSB0aGlzLmN1cnJlbnRMZXZlbDsKKyAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgdmFyIHZhbHVlID0gbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdOworICAgICAgICBjdXJyZW50TGV2ZWwtLTsKKworICAgICAgICBpZiAoY3VycmVudExldmVsIDwgMCkgeworICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gVGFnVHJlZTsKKyAgfSgpOworCisgIHZhciBJbmNsdXNpb25UcmVlID0gZnVuY3Rpb24gSW5jbHVzaW9uVHJlZUNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gSW5jbHVzaW9uVHJlZSh3aWR0aCwgaGVpZ2h0LCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgIHZhciBsZXZlbHNMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpICsgMTsKKyAgICAgIHRoaXMubGV2ZWxzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGV2ZWxzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGl0ZW1zID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpOworCisgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICBpdGVtc1tqXSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsZXZlbCA9IHsKKyAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgaXRlbXMKKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7CisgICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7CisgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBJbmNsdXNpb25UcmVlLnByb3RvdHlwZSA9IHsKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Jlc2V0KGksIGosIHN0b3BWYWx1ZSkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gMDsKKworICAgICAgICB3aGlsZSAoY3VycmVudExldmVsIDwgdGhpcy5sZXZlbHMubGVuZ3RoKSB7CisgICAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoOworICAgICAgICAgIGxldmVsLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgdmFyIHZhbHVlID0gbGV2ZWwuaXRlbXNbaW5kZXhdOworCisgICAgICAgICAgaWYgKHZhbHVlID09PSAweGZmKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodmFsdWUgPiBzdG9wVmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsOworICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpID4+PSAxOworICAgICAgICAgIGogPj49IDE7CisgICAgICAgICAgY3VycmVudExldmVsKys7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbCAtIDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSwKKyAgICAgIGluY3JlbWVudFZhbHVlOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKHN0b3BWYWx1ZSkgeworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHN0b3BWYWx1ZSArIDE7CisgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7CisgICAgICB9LAorICAgICAgcHJvcGFnYXRlVmFsdWVzOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Byb3BhZ2F0ZVZhbHVlcygpIHsKKyAgICAgICAgdmFyIGxldmVsSW5kZXggPSB0aGlzLmN1cnJlbnRMZXZlbDsKKyAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07CisgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07CisKKyAgICAgICAgd2hpbGUgKC0tbGV2ZWxJbmRleCA+PSAwKSB7CisgICAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tsZXZlbEluZGV4XTsKKyAgICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSBjdXJyZW50VmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBuZXh0TGV2ZWw6IGZ1bmN0aW9uIEluY2x1c2lvblRyZWVfbmV4dExldmVsKCkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gdGhpcy5jdXJyZW50TGV2ZWw7CisgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gMHhmZjsKKyAgICAgICAgY3VycmVudExldmVsLS07CisKKyAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA8IDApIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gSW5jbHVzaW9uVHJlZTsKKyAgfSgpOworCisgIHZhciBCaXRNb2RlbCA9IGZ1bmN0aW9uIEJpdE1vZGVsQ2xvc3VyZSgpIHsKKyAgICB2YXIgVU5JRk9STV9DT05URVhUID0gMTc7CisgICAgdmFyIFJVTkxFTkdUSF9DT05URVhUID0gMTg7CisgICAgdmFyIExMQW5kTEhDb250ZXh0c0xhYmVsID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDUsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDEsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDhdKTsKKyAgICB2YXIgSExDb250ZXh0TGFiZWwgPSBuZXcgVWludDhBcnJheShbMCwgMywgNCwgMCwgNSwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMSwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOF0pOworICAgIHZhciBISENvbnRleHRMYWJlbCA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAyLCAwLCAxLCAyLCAyLCAwLCAyLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAzLCA0LCA1LCAwLCA0LCA1LCA1LCAwLCA1LCA1LCA1LCAwLCAwLCAwLCAwLCAwLCA2LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4LCAwLCA4LCA4LCA4XSk7CisKKyAgICBmdW5jdGlvbiBCaXRNb2RlbCh3aWR0aCwgaGVpZ2h0LCBzdWJiYW5kLCB6ZXJvQml0UGxhbmVzLCBtYikgeworICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICBsZXQgY29udGV4dExhYmVsVGFibGU7CisKKyAgICAgIGlmIChzdWJiYW5kID09PSAiSEgiKSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gSEhDb250ZXh0TGFiZWw7CisgICAgICB9IGVsc2UgaWYgKHN1YmJhbmQgPT09ICJITCIpIHsKKyAgICAgICAgY29udGV4dExhYmVsVGFibGUgPSBITENvbnRleHRMYWJlbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gTExBbmRMSENvbnRleHRzTGFiZWw7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29udGV4dExhYmVsVGFibGUgPSBjb250ZXh0TGFiZWxUYWJsZTsKKyAgICAgIHZhciBjb2VmZmljaWVudENvdW50ID0gd2lkdGggKiBoZWlnaHQ7CisgICAgICB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpOworICAgICAgdGhpcy5jb2VmZmljZW50c1NpZ24gPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIGxldCBjb2VmZmljZW50c01hZ25pdHVkZTsKKworICAgICAgaWYgKG1iID4gMTQpIHsKKyAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDMyQXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9IGVsc2UgaWYgKG1iID4gNikgeworICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50MTZBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUgPSBjb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgIHRoaXMucHJvY2Vzc2luZ0ZsYWdzID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB2YXIgYml0c0RlY29kZWQgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKworICAgICAgaWYgKHplcm9CaXRQbGFuZXMgIT09IDApIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2VmZmljaWVudENvdW50OyBpKyspIHsKKyAgICAgICAgICBiaXRzRGVjb2RlZFtpXSA9IHplcm9CaXRQbGFuZXM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5iaXRzRGVjb2RlZCA9IGJpdHNEZWNvZGVkOworICAgICAgdGhpcy5yZXNldCgpOworICAgIH0KKworICAgIEJpdE1vZGVsLnByb3RvdHlwZSA9IHsKKyAgICAgIHNldERlY29kZXI6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldERlY29kZXIoZGVjb2RlcikgeworICAgICAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyOworICAgICAgfSwKKyAgICAgIHJlc2V0OiBmdW5jdGlvbiBCaXRNb2RlbF9yZXNldCgpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0cyA9IG5ldyBJbnQ4QXJyYXkoMTkpOworICAgICAgICB0aGlzLmNvbnRleHRzWzBdID0gNCA8PCAxIHwgMDsKKyAgICAgICAgdGhpcy5jb250ZXh0c1tVTklGT1JNX0NPTlRFWFRdID0gNDYgPDwgMSB8IDA7CisgICAgICAgIHRoaXMuY29udGV4dHNbUlVOTEVOR1RIX0NPTlRFWFRdID0gMyA8PCAxIHwgMDsKKyAgICAgIH0sCisgICAgICBzZXROZWlnaGJvcnNTaWduaWZpY2FuY2U6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldE5laWdoYm9yc1NpZ25pZmljYW5jZShyb3csIGNvbHVtbiwgaW5kZXgpIHsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBsZWZ0ID0gY29sdW1uID4gMDsKKyAgICAgICAgdmFyIHJpZ2h0ID0gY29sdW1uICsgMSA8IHdpZHRoOworICAgICAgICB2YXIgaTsKKworICAgICAgICBpZiAocm93ID4gMCkgeworICAgICAgICAgIGkgPSBpbmRleCAtIHdpZHRoOworCisgICAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmlnaHQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaV0gKz0gMHgwNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0KSB7CisgICAgICAgICAgaSA9IGluZGV4ICsgd2lkdGg7CisKKyAgICAgICAgICBpZiAobGVmdCkgeworICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgLSAxXSArPSAweDEwOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyaWdodCkgeworICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgKyAxXSArPSAweDEwOworICAgICAgICAgIH0KKworICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpXSArPSAweDA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXggLSAxXSArPSAweDAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJpZ2h0KSB7CisgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4ICsgMV0gKz0gMHgwMTsKKyAgICAgICAgfQorCisgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gfD0gMHg4MDsKKyAgICAgIH0sCisgICAgICBydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduOworICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CisgICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKKyAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0czsKKyAgICAgICAgdmFyIGxhYmVscyA9IHRoaXMuY29udGV4dExhYmVsVGFibGU7CisgICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CisgICAgICAgIHZhciBwcm9jZXNzZWRJbnZlcnNlTWFzayA9IH4xOworICAgICAgICB2YXIgcHJvY2Vzc2VkTWFzayA9IDE7CisgICAgICAgIHZhciBmaXJzdE1hZ25pdHVkZUJpdE1hc2sgPSAyOworCisgICAgICAgIGZvciAodmFyIGkwID0gMDsgaTAgPCBoZWlnaHQ7IGkwICs9IDQpIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBpbmRleCA9IGkwICogd2lkdGggKyBqOworCisgICAgICAgICAgICBmb3IgKHZhciBpMSA9IDA7IGkxIDwgNDsgaTErKywgaW5kZXggKz0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgdmFyIGkgPSBpMCArIGkxOworCisgICAgICAgICAgICAgIGlmIChpID49IGhlaWdodCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmPSBwcm9jZXNzZWRJbnZlcnNlTWFzazsKKworICAgICAgICAgICAgICBpZiAoY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8ICFuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dOworICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisKKyAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uKSB7CisgICAgICAgICAgICAgICAgdmFyIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gcHJvY2Vzc2VkTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBkZWNvZGVTaWduQml0OiBmdW5jdGlvbiBCaXRNb2RlbF9kZWNvZGVTaWduQml0KHJvdywgY29sdW1uLCBpbmRleCkgeworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjsKKyAgICAgICAgdmFyIGNvbnRyaWJ1dGlvbiwgc2lnbjAsIHNpZ24xLCBzaWduaWZpY2FuY2UxOworICAgICAgICB2YXIgY29udGV4dExhYmVsLCBkZWNvZGVkOworICAgICAgICBzaWduaWZpY2FuY2UxID0gY29sdW1uID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIDFdICE9PSAwOworCisgICAgICAgIGlmIChjb2x1bW4gKyAxIDwgd2lkdGggJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyAxXSAhPT0gMCkgeworICAgICAgICAgIHNpZ24xID0gY29lZmZpY2VudHNTaWduW2luZGV4ICsgMV07CisKKyAgICAgICAgICBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSAxXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gMV07CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBob3Jpem9udGFsQ29udHJpYnV0aW9uID0gMyAqIGNvbnRyaWJ1dGlvbjsKKyAgICAgICAgc2lnbmlmaWNhbmNlMSA9IHJvdyA+IDAgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggLSB3aWR0aF0gIT09IDA7CisKKyAgICAgICAgaWYgKHJvdyArIDEgPCBoZWlnaHQgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggKyB3aWR0aF0gIT09IDApIHsKKyAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIHdpZHRoXTsKKworICAgICAgICAgIGlmIChzaWduaWZpY2FuY2UxKSB7CisgICAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIHdpZHRoXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjEgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzaWduaWZpY2FuY2UxKSB7CisgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSB3aWR0aF07CisgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjAgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IGhvcml6b250YWxDb250cmlidXRpb247CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udHJpYnV0aW9uID49IDApIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSA5ICsgY29udHJpYnV0aW9uOworICAgICAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRleHRMYWJlbCA9IDkgLSBjb250cmlidXRpb247CisgICAgICAgICAgZGVjb2RlZCA9IHRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsIGNvbnRleHRMYWJlbCkgXiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlY29kZWQ7CisgICAgICB9LAorICAgICAgcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCkgeworICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjsKKyAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CisgICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKKyAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxOworICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjsKKyAgICAgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB2YXIgd2lkdGg0ID0gd2lkdGggKiA0OworCisgICAgICAgIGZvciAodmFyIGluZGV4MCA9IDAsIGluZGV4TmV4dDsgaW5kZXgwIDwgbGVuZ3RoOyBpbmRleDAgPSBpbmRleE5leHQpIHsKKyAgICAgICAgICBpbmRleE5leHQgPSBNYXRoLm1pbihsZW5ndGgsIGluZGV4MCArIHdpZHRoNCk7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gaW5kZXgwICsgajsgaW5kZXggPCBpbmRleE5leHQ7IGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgIGlmICghY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8IChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBjb250ZXh0TGFiZWwgPSAxNjsKKworICAgICAgICAgICAgICBpZiAoKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBmaXJzdE1hZ25pdHVkZUJpdE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSBePSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF0gJiAxMjc7CisgICAgICAgICAgICAgICAgY29udGV4dExhYmVsID0gc2lnbmlmaWNhbmNlID09PSAwID8gMTUgOiAxNDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA8PCAxIHwgYml0OworICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBwcm9jZXNzZWRNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHJ1bkNsZWFudXBQYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5DbGVhbnVwUGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBsYWJlbHMgPSB0aGlzLmNvbnRleHRMYWJlbFRhYmxlOworICAgICAgICB2YXIgYml0c0RlY29kZWQgPSB0aGlzLmJpdHNEZWNvZGVkOworICAgICAgICB2YXIgcHJvY2Vzc2luZ0ZsYWdzID0gdGhpcy5wcm9jZXNzaW5nRmxhZ3M7CisgICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTsKKyAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7CisgICAgICAgIHZhciBvbmVSb3dEb3duID0gd2lkdGg7CisgICAgICAgIHZhciB0d29Sb3dzRG93biA9IHdpZHRoICogMjsKKyAgICAgICAgdmFyIHRocmVlUm93c0Rvd24gPSB3aWR0aCAqIDM7CisgICAgICAgIHZhciBpTmV4dDsKKworICAgICAgICBmb3IgKHZhciBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCA9IGlOZXh0KSB7CisgICAgICAgICAgaU5leHQgPSBNYXRoLm1pbihpMCArIDQsIGhlaWdodCk7CisgICAgICAgICAgdmFyIGluZGV4QmFzZSA9IGkwICogd2lkdGg7CisgICAgICAgICAgdmFyIGNoZWNrQWxsRW1wdHkgPSBpMCArIDMgPCBoZWlnaHQ7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBpbmRleDAgPSBpbmRleEJhc2UgKyBqOworICAgICAgICAgICAgdmFyIGFsbEVtcHR5ID0gY2hlY2tBbGxFbXB0eSAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwXSA9PT0gMCAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgb25lUm93RG93bl0gPT09IDAgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHR3b1Jvd3NEb3duXSA9PT0gMCAmJiBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgdGhyZWVSb3dzRG93bl0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MF0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiYgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwOworICAgICAgICAgICAgdmFyIGkxID0gMCwKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4MDsKKyAgICAgICAgICAgIHZhciBpID0gaTAsCisgICAgICAgICAgICAgICAgc2lnbjsKKworICAgICAgICAgICAgaWYgKGFsbEVtcHR5KSB7CisgICAgICAgICAgICAgIHZhciBoYXNTaWduaWZpY2FudENvZWZmaWNlbnQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFJVTkxFTkdUSF9DT05URVhUKTsKKworICAgICAgICAgICAgICBpZiAoIWhhc1NpZ25pZmljYW50Q29lZmZpY2VudCkgeworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MF0rKzsKKyAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleDAgKyBvbmVSb3dEb3duXSsrOworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHR3b1Jvd3NEb3duXSsrOworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHRocmVlUm93c0Rvd25dKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpMSA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpOworCisgICAgICAgICAgICAgIGlmIChpMSAhPT0gMCkgeworICAgICAgICAgICAgICAgIGkgPSBpMCArIGkxOworICAgICAgICAgICAgICAgIGluZGV4ICs9IGkxICogd2lkdGg7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzaWduID0gdGhpcy5kZWNvZGVTaWduQml0KGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgIHRoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgwOworCisgICAgICAgICAgICAgIGZvciAodmFyIGkyID0gaTA7IGkyIDw9IGk7IGkyKyssIGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpMSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSBpMCArIGkxOyBpIDwgaU5leHQ7IGkrKywgaW5kZXggKz0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fCAocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIHByb2Nlc3NlZE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dOworICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisKKyAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uID09PSAxKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CisgICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBjaGVja1NlZ21lbnRhdGlvblN5bWJvbDogZnVuY3Rpb24gQml0TW9kZWxfY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKSB7CisgICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyOworICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOworICAgICAgICB2YXIgc3ltYm9sID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpIDw8IDMgfCBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMiB8IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpOworCisgICAgICAgIGlmIChzeW1ib2wgIT09IDB4YSkgeworICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiSW52YWxpZCBzZWdtZW50YXRpb24gc3ltYm9sIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIHJldHVybiBCaXRNb2RlbDsKKyAgfSgpOworCisgIHZhciBUcmFuc2Zvcm0gPSBmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFRyYW5zZm9ybSgpIHt9CisKKyAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLmNhbGN1bGF0ZSA9IGZ1bmN0aW9uIHRyYW5zZm9ybUNhbGN1bGF0ZShzdWJiYW5kcywgdTAsIHYwKSB7CisgICAgICB2YXIgbGwgPSBzdWJiYW5kc1swXTsKKworICAgICAgZm9yICh2YXIgaSA9IDEsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBsbCA9IHRoaXMuaXRlcmF0ZShsbCwgc3ViYmFuZHNbaV0sIHUwLCB2MCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBsbDsKKyAgICB9OworCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbiBleHRlbmQoYnVmZmVyLCBvZmZzZXQsIHNpemUpIHsKKyAgICAgIHZhciBpMSA9IG9mZnNldCAtIDEsCisgICAgICAgICAgajEgPSBvZmZzZXQgKyAxOworICAgICAgdmFyIGkyID0gb2Zmc2V0ICsgc2l6ZSAtIDIsCisgICAgICAgICAgajIgPSBvZmZzZXQgKyBzaXplOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxLS1dID0gYnVmZmVyW2oxKytdOworICAgICAgYnVmZmVyW2oyKytdID0gYnVmZmVyW2kyLS1dOworICAgICAgYnVmZmVyW2kxXSA9IGJ1ZmZlcltqMV07CisgICAgICBidWZmZXJbajJdID0gYnVmZmVyW2kyXTsKKyAgICB9OworCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24gVHJhbnNmb3JtX2l0ZXJhdGUobGwsIGhsX2xoX2hoLCB1MCwgdjApIHsKKyAgICAgIHZhciBsbFdpZHRoID0gbGwud2lkdGgsCisgICAgICAgICAgbGxIZWlnaHQgPSBsbC5oZWlnaHQsCisgICAgICAgICAgbGxJdGVtcyA9IGxsLml0ZW1zOworICAgICAgdmFyIHdpZHRoID0gaGxfbGhfaGgud2lkdGg7CisgICAgICB2YXIgaGVpZ2h0ID0gaGxfbGhfaGguaGVpZ2h0OworICAgICAgdmFyIGl0ZW1zID0gaGxfbGhfaGguaXRlbXM7CisgICAgICB2YXIgaSwgaiwgaywgbCwgdSwgdjsKKworICAgICAgZm9yIChrID0gMCwgaSA9IDA7IGkgPCBsbEhlaWdodDsgaSsrKSB7CisgICAgICAgIGwgPSBpICogMiAqIHdpZHRoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsbFdpZHRoOyBqKyssIGsrKywgbCArPSAyKSB7CisgICAgICAgICAgaXRlbXNbbF0gPSBsbEl0ZW1zW2tdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxsSXRlbXMgPSBsbC5pdGVtcyA9IG51bGw7CisgICAgICB2YXIgYnVmZmVyUGFkZGluZyA9IDQ7CisgICAgICB2YXIgcm93QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCArIDIgKiBidWZmZXJQYWRkaW5nKTsKKworICAgICAgaWYgKHdpZHRoID09PSAxKSB7CisgICAgICAgIGlmICgodTAgJiAxKSAhPT0gMCkgeworICAgICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKKyAgICAgICAgICAgIGl0ZW1zW2tdICo9IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKKyAgICAgICAgICByb3dCdWZmZXIuc2V0KGl0ZW1zLnN1YmFycmF5KGssIGsgKyB3aWR0aCksIGJ1ZmZlclBhZGRpbmcpOworICAgICAgICAgIHRoaXMuZXh0ZW5kKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOworICAgICAgICAgIHRoaXMuZmlsdGVyKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOworICAgICAgICAgIGl0ZW1zLnNldChyb3dCdWZmZXIuc3ViYXJyYXkoYnVmZmVyUGFkZGluZywgYnVmZmVyUGFkZGluZyArIHdpZHRoKSwgayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIG51bUJ1ZmZlcnMgPSAxNjsKKyAgICAgIHZhciBjb2xCdWZmZXJzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspIHsKKyAgICAgICAgY29sQnVmZmVycy5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoaGVpZ2h0ICsgMiAqIGJ1ZmZlclBhZGRpbmcpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGIsCisgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IDA7CisgICAgICBsbCA9IGJ1ZmZlclBhZGRpbmcgKyBoZWlnaHQ7CisKKyAgICAgIGlmIChoZWlnaHQgPT09IDEpIHsKKyAgICAgICAgaWYgKCh2MCAmIDEpICE9PSAwKSB7CisgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHsKKyAgICAgICAgICAgIGl0ZW1zW3VdICo9IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodSA9IDA7IHUgPCB3aWR0aDsgdSsrKSB7CisgICAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXIgPT09IDApIHsKKyAgICAgICAgICAgIG51bUJ1ZmZlcnMgPSBNYXRoLm1pbih3aWR0aCAtIHUsIG51bUJ1ZmZlcnMpOworCisgICAgICAgICAgICBmb3IgKGsgPSB1LCBsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGNvbEJ1ZmZlcnNbYl1bbF0gPSBpdGVtc1trICsgYl07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IG51bUJ1ZmZlcnM7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudEJ1ZmZlci0tOworICAgICAgICAgIHZhciBidWZmZXIgPSBjb2xCdWZmZXJzW2N1cnJlbnRCdWZmZXJdOworICAgICAgICAgIHRoaXMuZXh0ZW5kKGJ1ZmZlciwgYnVmZmVyUGFkZGluZywgaGVpZ2h0KTsKKyAgICAgICAgICB0aGlzLmZpbHRlcihidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7CisKKyAgICAgICAgICBpZiAoY3VycmVudEJ1ZmZlciA9PT0gMCkgeworICAgICAgICAgICAgayA9IHUgLSBudW1CdWZmZXJzICsgMTsKKworICAgICAgICAgICAgZm9yIChsID0gYnVmZmVyUGFkZGluZzsgbCA8IGxsOyBrICs9IHdpZHRoLCBsKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IG51bUJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGl0ZW1zW2sgKyBiXSA9IGNvbEJ1ZmZlcnNbYl1bbF07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgd2lkdGgsCisgICAgICAgIGhlaWdodCwKKyAgICAgICAgaXRlbXMKKyAgICAgIH07CisgICAgfTsKKworICAgIHJldHVybiBUcmFuc2Zvcm07CisgIH0oKTsKKworICB2YXIgSXJyZXZlcnNpYmxlVHJhbnNmb3JtID0gZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtQ2xvc3VyZSgpIHsKKyAgICBmdW5jdGlvbiBJcnJldmVyc2libGVUcmFuc2Zvcm0oKSB7CisgICAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTsKKyAgICB9CisKKyAgICBJcnJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm0ucHJvdG90eXBlKTsKKworICAgIElycmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gaXJyZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKHgsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7CisgICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwOworICAgICAgdmFyIGosIG4sIGN1cnJlbnQsIG5leHQ7CisgICAgICB2YXIgYWxwaGEgPSAtMS41ODYxMzQzNDIwNTk5MjQ7CisgICAgICB2YXIgYmV0YSA9IC0wLjA1Mjk4MDExODU3Mjk2MTsKKyAgICAgIHZhciBnYW1tYSA9IDAuODgyOTExMDc1NTMwOTM0OworICAgICAgdmFyIGRlbHRhID0gMC40NDM1MDY4NTIwNDM5NzE7CisgICAgICB2YXIgSyA9IDEuMjMwMTc0MTA0OTE0MDAxOworICAgICAgdmFyIEtfID0gMSAvIEs7CisgICAgICBqID0gb2Zmc2V0IC0gMzsKKworICAgICAgZm9yIChuID0gbGVuICsgNDsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgeFtqXSAqPSBLXzsKKyAgICAgIH0KKworICAgICAgaiA9IG9mZnNldCAtIDI7CisgICAgICBjdXJyZW50ID0gZGVsdGEgKiB4W2ogLSAxXTsKKworICAgICAgZm9yIChuID0gbGVuICsgMzsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgbmV4dCA9IGRlbHRhICogeFtqICsgMV07CisgICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0OworCisgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgY3VycmVudCA9IGRlbHRhICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSA9IEsgKiB4W2pdIC0gY3VycmVudCAtIG5leHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaiA9IG9mZnNldCAtIDE7CisgICAgICBjdXJyZW50ID0gZ2FtbWEgKiB4W2ogLSAxXTsKKworICAgICAgZm9yIChuID0gbGVuICsgMjsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgbmV4dCA9IGdhbW1hICogeFtqICsgMV07CisgICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7CisKKyAgICAgICAgaWYgKG4tLSkgeworICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICBjdXJyZW50ID0gZ2FtbWEgKiB4W2ogKyAxXTsKKyAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGogPSBvZmZzZXQ7CisgICAgICBjdXJyZW50ID0gYmV0YSAqIHhbaiAtIDFdOworCisgICAgICBmb3IgKG4gPSBsZW4gKyAxOyBuLS07IGogKz0gMikgeworICAgICAgICBuZXh0ID0gYmV0YSAqIHhbaiArIDFdOworICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworCisgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogKyAxXTsKKyAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChsZW4gIT09IDApIHsKKyAgICAgICAgaiA9IG9mZnNldCArIDE7CisgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiAtIDFdOworCisgICAgICAgIGZvciAobiA9IGxlbjsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgICBuZXh0ID0gYWxwaGEgKiB4W2ogKyAxXTsKKyAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworCisgICAgICAgICAgaWYgKG4tLSkgeworICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgY3VycmVudCA9IGFscGhhICogeFtqICsgMV07CisgICAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAgcmV0dXJuIElycmV2ZXJzaWJsZVRyYW5zZm9ybTsKKyAgfSgpOworCisgIHZhciBSZXZlcnNpYmxlVHJhbnNmb3JtID0gZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybSgpIHsKKyAgICAgIFRyYW5zZm9ybS5jYWxsKHRoaXMpOworICAgIH0KKworICAgIFJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm0ucHJvdG90eXBlKTsKKworICAgIFJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIHJldmVyc2libGVUcmFuc2Zvcm1GaWx0ZXIoeCwgb2Zmc2V0LCBsZW5ndGgpIHsKKyAgICAgIHZhciBsZW4gPSBsZW5ndGggPj4gMTsKKyAgICAgIG9mZnNldCA9IG9mZnNldCB8IDA7CisgICAgICB2YXIgaiwgbjsKKworICAgICAgZm9yIChqID0gb2Zmc2V0LCBuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgeFtqXSAtPSB4W2ogLSAxXSArIHhbaiArIDFdICsgMiA+PiAyOworICAgICAgfQorCisgICAgICBmb3IgKGogPSBvZmZzZXQgKyAxLCBuID0gbGVuOyBuLS07IGogKz0gMikgeworICAgICAgICB4W2pdICs9IHhbaiAtIDFdICsgeFtqICsgMV0gPj4gMTsKKyAgICAgIH0KKyAgICB9OworCisgICAgcmV0dXJuIFJldmVyc2libGVUcmFuc2Zvcm07CisgIH0oKTsKKworICByZXR1cm4gSnB4SW1hZ2U7Cit9KCk7CisKK2V4cG9ydHMuSnB4SW1hZ2UgPSBKcHhJbWFnZTsKKworLyoqKi8gfSkKKy8qKioqKiovIF0pOworfSk7CisvLyMgc291cmNlTWFwcGluZ1VSTD1wZGYuaW1hZ2VfZGVjb2RlcnMuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzLmpzLm1hcCBiL2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy5qcy5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkMmIwOAotLS0gL2Rldi9udWxsCisrKyBiL2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy5qcy5tYXAKQEAgLTAsMCArMSBAQAoreyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvc3JjL3BkZi5pbWFnZV9kZWNvZGVycy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9zcmMvc2hhcmVkL3V0aWwuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvc3JjL3NoYXJlZC9jb21wYXRpYmlsaXR5LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL3NyYy9zaGFyZWQvaXNfbm9kZS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9zcmMvY29yZS9qYmlnMi5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9zcmMvY29yZS9jb3JlX3V0aWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzL3NyYy9jb3JlL2FyaXRobWV0aWNfZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9zcmMvY29yZS9jY2l0dC5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy9zcmMvY29yZS9qcGcuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMvc3JjL2NvcmUvanB4LmpzIl0sIm5hbWVzIjpbInBkZmpzVmVyc2lvbiIsInBkZmpzQnVpbGQiLCJJREVOVElUWV9NQVRSSVgiLCJGT05UX0lERU5USVRZX01BVFJJWCIsIlBlcm1pc3Npb25GbGFnIiwiUFJJTlQiLCJNT0RJRllfQ09OVEVOVFMiLCJDT1BZIiwiTU9ESUZZX0FOTk9UQVRJT05TIiwiRklMTF9JTlRFUkFDVElWRV9GT1JNUyIsIkNPUFlfRk9SX0FDQ0VTU0lCSUxJVFkiLCJBU1NFTUJMRSIsIlBSSU5UX0hJR0hfUVVBTElUWSIsIlRleHRSZW5kZXJpbmdNb2RlIiwiRklMTCIsIlNUUk9LRSIsIkZJTExfU1RST0tFIiwiSU5WSVNJQkxFIiwiRklMTF9BRERfVE9fUEFUSCIsIlNUUk9LRV9BRERfVE9fUEFUSCIsIkZJTExfU1RST0tFX0FERF9UT19QQVRIIiwiQUREX1RPX1BBVEgiLCJGSUxMX1NUUk9LRV9NQVNLIiwiQUREX1RPX1BBVEhfRkxBRyIsIkltYWdlS2luZCIsIkdSQVlTQ0FMRV8xQlBQIiwiUkdCXzI0QlBQIiwiUkdCQV8zMkJQUCIsIkFubm90YXRpb25UeXBlIiwiVEVYVCIsIkxJTksiLCJGUkVFVEVYVCIsIkxJTkUiLCJTUVVBUkUiLCJDSVJDTEUiLCJQT0xZR09OIiwiUE9MWUxJTkUiLCJISUdITElHSFQiLCJVTkRFUkxJTkUiLCJTUVVJR0dMWSIsIlNUUklLRU9VVCIsIlNUQU1QIiwiQ0FSRVQiLCJJTksiLCJQT1BVUCIsIkZJTEVBVFRBQ0hNRU5UIiwiU09VTkQiLCJNT1ZJRSIsIldJREdFVCIsIlNDUkVFTiIsIlBSSU5URVJNQVJLIiwiVFJBUE5FVCIsIldBVEVSTUFSSyIsIlRIUkVFRCIsIlJFREFDVCIsIkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSIsIk1BUktFRCIsIlJFVklFVyIsIkFubm90YXRpb25NYXJrZWRTdGF0ZSIsIlVOTUFSS0VEIiwiQW5ub3RhdGlvblJldmlld1N0YXRlIiwiQUNDRVBURUQiLCJSRUpFQ1RFRCIsIkNBTkNFTExFRCIsIkNPTVBMRVRFRCIsIk5PTkUiLCJBbm5vdGF0aW9uUmVwbHlUeXBlIiwiR1JPVVAiLCJSRVBMWSIsIkFubm90YXRpb25GbGFnIiwiSElEREVOIiwiTk9aT09NIiwiTk9ST1RBVEUiLCJOT1ZJRVciLCJSRUFET05MWSIsIkxPQ0tFRCIsIlRPR0dMRU5PVklFVyIsIkxPQ0tFRENPTlRFTlRTIiwiQW5ub3RhdGlvbkZpZWxkRmxhZyIsIlJFUVVJUkVEIiwiTk9FWFBPUlQiLCJNVUxUSUxJTkUiLCJQQVNTV09SRCIsIk5PVE9HR0xFVE9PRkYiLCJSQURJTyIsIlBVU0hCVVRUT04iLCJDT01CTyIsIkVESVQiLCJTT1JUIiwiRklMRVNFTEVDVCIsIk1VTFRJU0VMRUNUIiwiRE9OT1RTUEVMTENIRUNLIiwiRE9OT1RTQ1JPTEwiLCJDT01CIiwiUklDSFRFWFQiLCJSQURJT1NJTlVOSVNPTiIsIkNPTU1JVE9OU0VMQ0hBTkdFIiwiQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSIsIlNPTElEIiwiREFTSEVEIiwiQkVWRUxFRCIsIklOU0VUIiwiU3RyZWFtVHlwZSIsIlVOS05PV04iLCJGTEFURSIsIkxaVyIsIkRDVCIsIkpQWCIsIkpCSUciLCJBODUiLCJBSFgiLCJDQ0YiLCJSTFgiLCJGb250VHlwZSIsIlRZUEUxIiwiVFlQRTFDIiwiQ0lERk9OVFRZUEUwIiwiQ0lERk9OVFRZUEUwQyIsIlRSVUVUWVBFIiwiQ0lERk9OVFRZUEUyIiwiVFlQRTMiLCJPUEVOVFlQRSIsIlRZUEUwIiwiTU1UWVBFMSIsIlZlcmJvc2l0eUxldmVsIiwiRVJST1JTIiwiV0FSTklOR1MiLCJJTkZPUyIsIkNNYXBDb21wcmVzc2lvblR5cGUiLCJCSU5BUlkiLCJTVFJFQU0iLCJPUFMiLCJkZXBlbmRlbmN5Iiwic2V0TGluZVdpZHRoIiwic2V0TGluZUNhcCIsInNldExpbmVKb2luIiwic2V0TWl0ZXJMaW1pdCIsInNldERhc2giLCJzZXRSZW5kZXJpbmdJbnRlbnQiLCJzZXRGbGF0bmVzcyIsInNldEdTdGF0ZSIsInNhdmUiLCJyZXN0b3JlIiwidHJhbnNmb3JtIiwibW92ZVRvIiwibGluZVRvIiwiY3VydmVUbyIsImN1cnZlVG8yIiwiY3VydmVUbzMiLCJjbG9zZVBhdGgiLCJyZWN0YW5nbGUiLCJzdHJva2UiLCJjbG9zZVN0cm9rZSIsImZpbGwiLCJlb0ZpbGwiLCJmaWxsU3Ryb2tlIiwiZW9GaWxsU3Ryb2tlIiwiY2xvc2VGaWxsU3Ryb2tlIiwiY2xvc2VFT0ZpbGxTdHJva2UiLCJlbmRQYXRoIiwiY2xpcCIsImVvQ2xpcCIsImJlZ2luVGV4dCIsImVuZFRleHQiLCJzZXRDaGFyU3BhY2luZyIsInNldFdvcmRTcGFjaW5nIiwic2V0SFNjYWxlIiwic2V0TGVhZGluZyIsInNldEZvbnQiLCJzZXRUZXh0UmVuZGVyaW5nTW9kZSIsInNldFRleHRSaXNlIiwibW92ZVRleHQiLCJzZXRMZWFkaW5nTW92ZVRleHQiLCJzZXRUZXh0TWF0cml4IiwibmV4dExpbmUiLCJzaG93VGV4dCIsInNob3dTcGFjZWRUZXh0IiwibmV4dExpbmVTaG93VGV4dCIsIm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0Iiwic2V0Q2hhcldpZHRoIiwic2V0Q2hhcldpZHRoQW5kQm91bmRzIiwic2V0U3Ryb2tlQ29sb3JTcGFjZSIsInNldEZpbGxDb2xvclNwYWNlIiwic2V0U3Ryb2tlQ29sb3IiLCJzZXRTdHJva2VDb2xvck4iLCJzZXRGaWxsQ29sb3IiLCJzZXRGaWxsQ29sb3JOIiwic2V0U3Ryb2tlR3JheSIsInNldEZpbGxHcmF5Iiwic2V0U3Ryb2tlUkdCQ29sb3IiLCJzZXRGaWxsUkdCQ29sb3IiLCJzZXRTdHJva2VDTVlLQ29sb3IiLCJzZXRGaWxsQ01ZS0NvbG9yIiwic2hhZGluZ0ZpbGwiLCJiZWdpbklubGluZUltYWdlIiwiYmVnaW5JbWFnZURhdGEiLCJlbmRJbmxpbmVJbWFnZSIsInBhaW50WE9iamVjdCIsIm1hcmtQb2ludCIsIm1hcmtQb2ludFByb3BzIiwiYmVnaW5NYXJrZWRDb250ZW50IiwiYmVnaW5NYXJrZWRDb250ZW50UHJvcHMiLCJlbmRNYXJrZWRDb250ZW50IiwiYmVnaW5Db21wYXQiLCJlbmRDb21wYXQiLCJwYWludEZvcm1YT2JqZWN0QmVnaW4iLCJwYWludEZvcm1YT2JqZWN0RW5kIiwiYmVnaW5Hcm91cCIsImVuZEdyb3VwIiwiYmVnaW5Bbm5vdGF0aW9ucyIsImVuZEFubm90YXRpb25zIiwiYmVnaW5Bbm5vdGF0aW9uIiwiZW5kQW5ub3RhdGlvbiIsInBhaW50SnBlZ1hPYmplY3QiLCJwYWludEltYWdlTWFza1hPYmplY3QiLCJwYWludEltYWdlTWFza1hPYmplY3RHcm91cCIsInBhaW50SW1hZ2VYT2JqZWN0IiwicGFpbnRJbmxpbmVJbWFnZVhPYmplY3QiLCJwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwIiwicGFpbnRJbWFnZVhPYmplY3RSZXBlYXQiLCJwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQiLCJwYWludFNvbGlkQ29sb3JJbWFnZU1hc2siLCJjb25zdHJ1Y3RQYXRoIiwiVU5TVVBQT1JURURfRkVBVFVSRVMiLCJ1bmtub3duIiwiZm9ybXMiLCJqYXZhU2NyaXB0Iiwic21hc2siLCJzaGFkaW5nUGF0dGVybiIsImZvbnQiLCJlcnJvclRpbGluZ1BhdHRlcm4iLCJlcnJvckV4dEdTdGF0ZSIsImVycm9yWE9iamVjdCIsImVycm9yRm9udExvYWRUeXBlMyIsImVycm9yRm9udFN0YXRlIiwiZXJyb3JGb250TWlzc2luZyIsImVycm9yRm9udFRyYW5zbGF0ZSIsImVycm9yQ29sb3JTcGFjZSIsImVycm9yT3BlcmF0b3JMaXN0IiwiZXJyb3JGb250VG9Vbmljb2RlIiwiZXJyb3JGb250TG9hZE5hdGl2ZSIsImVycm9yRm9udEdldFBhdGgiLCJlcnJvck1hcmtlZENvbnRlbnQiLCJQYXNzd29yZFJlc3BvbnNlcyIsIk5FRURfUEFTU1dPUkQiLCJJTkNPUlJFQ1RfUEFTU1dPUkQiLCJ2ZXJib3NpdHkiLCJOdW1iZXIiLCJjb25zb2xlIiwidW5yZWFjaGFibGUiLCJiYXNlIiwib3RoZXIiLCJ1cmwiLCJhYnNvbHV0ZVVybCIsImJhc2VVcmwiLCJfaXNWYWxpZFByb3RvY29sIiwiT2JqZWN0IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiQmFzZUV4Y2VwdGlvbiIsImNvbnN0cnVjdG9yIiwiTnVsbENoYXJhY3RlcnNSZWdFeHAiLCJ3YXJuIiwic3RyIiwiYXNzZXJ0IiwiYnl0ZXMiLCJsZW5ndGgiLCJNQVhfQVJHVU1FTlRfQ09VTlQiLCJTdHJpbmciLCJzdHJCdWYiLCJpIiwiY2h1bmtFbmQiLCJNYXRoIiwiY2h1bmsiLCJhcnIiLCJyZXN1bHRMZW5ndGgiLCJhcnJheUJ5dGVMZW5ndGgiLCJwb3MiLCJkYXRhIiwiaXRlbSIsInN0cmluZ1RvQnl0ZXMiLCJpdGVtTGVuZ3RoIiwidmFsdWUiLCJidWZmZXI4IiwidmlldzMyIiwiSXNMaXR0bGVFbmRpYW5DYWNoZWQiLCJzaGFkb3ciLCJpc0xpdHRsZUVuZGlhbiIsIklzRXZhbFN1cHBvcnRlZENhY2hlZCIsImlzRXZhbFN1cHBvcnRlZCIsInJnYkJ1ZiIsIm0xIiwibTIiLCJ4dCIsInAiLCJtIiwieXQiLCJkIiwicDEiLCJVdGlsIiwicDIiLCJyIiwicDMiLCJwNCIsInYiLCJ0cmFuc3Bvc2UiLCJhIiwiYiIsImMiLCJmaXJzdCIsInNlY29uZCIsInN4Iiwic3kiLCJyZWN0Iiwib3JkZXJlZFgiLCJyZWN0MSIsInJlY3QyIiwib3JkZXJlZFkiLCJyZXN1bHQiLCJQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSIsImNvZGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJ1bmVzY2FwZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImFycjEiLCJhcnIyIiwiZWxlbWVudCIsImRhdGUiLCJEYXRlIiwiYnVmZmVyIiwiY2FwYWJpbGl0eSIsImlzU2V0dGxlZCIsImdldCIsInJlc29sdmUiLCJyZWplY3QiLCJjcmVhdGVPYmplY3RVUkwiLCJkaWdpdHMiLCJmb3JjZURhdGFTY2hlbWEiLCJVUkwiLCJibG9iIiwidHlwZSIsImlpIiwiYjEiLCJiMiIsImIzIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJpc05vZGVKUyIsInByb2Nlc3MiLCJKYmlnMkltYWdlIiwiQ29udGV4dENhY2hlIiwiZ2V0Q29udGV4dHMiLCJpZCIsIkRlY29kaW5nQ29udGV4dCIsImRlY29kZXIiLCJjYWNoZSIsImNvbnRleHRzIiwiY29udGV4dENhY2hlIiwicHJldiIsImJpdCIsInNpZ24iLCJyZWFkQml0cyIsImNvZGVMZW5ndGgiLCJTZWdtZW50VHlwZXMiLCJDb2RpbmdUZW1wbGF0ZXMiLCJ4IiwieSIsIlJlZmluZW1lbnRUZW1wbGF0ZXMiLCJjb2RpbmciLCJyZWZlcmVuY2UiLCJSZXVzZWRDb250ZXh0cyIsIlJlZmluZW1lbnRSZXVzZWRDb250ZXh0cyIsImRlY29kaW5nQ29udGV4dCIsImJpdG1hcCIsIk9MRF9QSVhFTF9NQVNLIiwicm93Iiwicm93MSIsInJvdzIiLCJjb250ZXh0TGFiZWwiLCJqIiwicGl4ZWwiLCJpbnB1dCIsImRlY29kZU1NUkJpdG1hcCIsInRlbXBsYXRlSW5kZXgiLCJhdCIsImRlY29kZUJpdG1hcFRlbXBsYXRlMCIsInVzZXNraXAiLCJ0ZW1wbGF0ZSIsInRlbXBsYXRlTGVuZ3RoIiwidGVtcGxhdGVYIiwidGVtcGxhdGVZIiwiY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMiLCJyZXVzZU1hc2siLCJtaW5YIiwibWF4WCIsIm1pblkiLCJrIiwiY2hhbmdpbmdFbnRyaWVzTGVuZ3RoIiwiY2hhbmdpbmdUZW1wbGF0ZVgiLCJjaGFuZ2luZ1RlbXBsYXRlWSIsImNoYW5naW5nVGVtcGxhdGVCaXQiLCJzYmJfbGVmdCIsInNiYl90b3AiLCJzYmJfcmlnaHQiLCJ3aWR0aCIsInBzZXVkb1BpeGVsQ29udGV4dCIsImx0cCIsInNsdHAiLCJza2lwIiwiaTAiLCJqMCIsInNoaWZ0IiwiY29kaW5nVGVtcGxhdGUiLCJjb2RpbmdUZW1wbGF0ZUxlbmd0aCIsImNvZGluZ1RlbXBsYXRlWCIsImNvZGluZ1RlbXBsYXRlWSIsInJlZmVyZW5jZVRlbXBsYXRlIiwicmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgiLCJyZWZlcmVuY2VUZW1wbGF0ZVgiLCJyZWZlcmVuY2VUZW1wbGF0ZVkiLCJyZWZlcmVuY2VXaWR0aCIsInJlZmVyZW5jZUJpdG1hcCIsInJlZmVyZW5jZUhlaWdodCIsImh1ZmZtYW4iLCJuZXdTeW1ib2xzIiwiY3VycmVudEhlaWdodCIsInN5bWJvbENvZGVMZW5ndGgiLCJsb2cyIiwic3ltYm9scyIsInRhYmxlQjEiLCJnZXRTdGFuZGFyZFRhYmxlIiwic3ltYm9sV2lkdGhzIiwiZGVsdGFIZWlnaHQiLCJodWZmbWFuVGFibGVzIiwiZGVjb2RlSW50ZWdlciIsImN1cnJlbnRXaWR0aCIsInRvdGFsV2lkdGgiLCJmaXJzdFN5bWJvbCIsImRlbHRhV2lkdGgiLCJudW1iZXJPZkluc3RhbmNlcyIsImRlY29kZVRleHRSZWdpb24iLCJzeW1ib2xJZCIsImRlY29kZUlBSUQiLCJyZHgiLCJyZHkiLCJzeW1ib2wiLCJkZWNvZGVSZWZpbmVtZW50IiwiZGVjb2RlQml0bWFwIiwiYml0bWFwU2l6ZSIsImh1ZmZtYW5JbnB1dCIsImNvbGxlY3RpdmVCaXRtYXAiLCJyZWFkVW5jb21wcmVzc2VkQml0bWFwIiwib3JpZ2luYWxFbmQiLCJiaXRtYXBFbmQiLCJudW1iZXJPZlN5bWJvbHNEZWNvZGVkIiwieE1pbiIsImJpdG1hcFdpZHRoIiwieE1heCIsInN5bWJvbEJpdG1hcCIsImV4cG9ydGVkU3ltYm9scyIsImZsYWdzIiwiY3VycmVudEZsYWciLCJ0b3RhbFN5bWJvbHNMZW5ndGgiLCJydW5MZW5ndGgiLCJzdHJpcFQiLCJmaXJzdFMiLCJkZWx0YVQiLCJkZWx0YUZpcnN0UyIsImN1cnJlbnRTIiwiY3VycmVudFQiLCJzdHJpcFNpemUiLCJ0IiwiYXBwbHlSZWZpbmVtZW50IiwicmVmaW5lbWVudCIsImlucHV0U3ltYm9scyIsInN5bWJvbFdpZHRoIiwic3ltYm9sSGVpZ2h0IiwicmR3IiwicmRoIiwib2Zmc2V0VCIsIm9mZnNldFMiLCJzMiIsInN5bWJvbFJvdyIsIm1heFdpZHRoIiwidDIiLCJkZWx0YVMiLCJjb2xsZWN0aXZlV2lkdGgiLCJwYXR0ZXJucyIsInBhdHRlcm5CaXRtYXAiLCJwYXR0ZXJuV2lkdGgiLCJjb21iaW5hdGlvbk9wZXJhdG9yIiwicmVnaW9uQml0bWFwIiwibnVtYmVyT2ZQYXR0ZXJucyIsInBhdHRlcm4wIiwicGF0dGVybkhlaWdodCIsImJpdHNQZXJWYWx1ZSIsImdyYXlTY2FsZUJpdFBsYW5lcyIsIm1tcklucHV0IiwibWciLCJuZyIsInBhdHRlcm5JbmRleCIsImdyaWRPZmZzZXRYIiwiZ3JpZE9mZnNldFkiLCJyZWdpb25Sb3ciLCJwYXR0ZXJuUm93IiwicmVnaW9uWSIsInJlZ2lvblgiLCJzZWdtZW50SGVhZGVyIiwicmVhZFVpbnQzMiIsInN0YXJ0Iiwic2VnbWVudFR5cGUiLCJwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUiLCJyZWZlcnJlZEZsYWdzIiwicmVmZXJyZWRUb0NvdW50IiwicmV0YWluQml0cyIsInBvc2l0aW9uIiwicmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplIiwicmVmZXJyZWRUbyIsIm51bWJlciIsInJlYWRVaW50MTYiLCJnZW5lcmljUmVnaW9uSW5mbyIsInJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24iLCJnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzIiwiZ2VuZXJpY1JlZ2lvbk1tciIsInNlYXJjaFBhdHRlcm5MZW5ndGgiLCJzZWFyY2hQYXR0ZXJuIiwic2VnbWVudHMiLCJyZWFkU2VnbWVudEhlYWRlciIsInNlZ21lbnQiLCJoZWFkZXIiLCJoZWlnaHQiLCJSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCIsImVuZCIsImRpY3Rpb25hcnkiLCJkaWN0aW9uYXJ5RmxhZ3MiLCJhdExlbmd0aCIsInJlYWRJbnQ4IiwiYXJncyIsInRleHRSZWdpb24iLCJ0ZXh0UmVnaW9uU2VnbWVudEZsYWdzIiwidGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyIsInBhdHRlcm5EaWN0aW9uYXJ5IiwicGF0dGVybkRpY3Rpb25hcnlGbGFncyIsImhhbGZ0b25lUmVnaW9uIiwiaGFsZnRvbmVSZWdpb25GbGFncyIsImdlbmVyaWNSZWdpb24iLCJwYWdlSW5mbyIsInJlc29sdXRpb25YIiwicmVzb2x1dGlvblkiLCJwYWdlU2VnbWVudEZsYWdzIiwiY2FsbGJhY2tOYW1lIiwidmlzaXRvciIsInByb2Nlc3NTZWdtZW50IiwiY2h1bmtzIiwicmVhZFNlZ21lbnRzIiwicHJvY2Vzc1NlZ21lbnRzIiwiYml0UGFja2VkIiwiaW1nRGF0YSIsInEiLCJtYXNrIiwiU2ltcGxlU2VnbWVudFZpc2l0b3IiLCJvblBhZ2VJbmZvcm1hdGlvbiIsInJvd1NpemUiLCJpbmZvIiwiZHJhd0JpdG1hcCIsInJlZ2lvbkluZm8iLCJtYXNrMCIsIm9mZnNldDAiLCJvZmZzZXQiLCJvbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24iLCJyZWdpb24iLCJvbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbiIsIm9uU3ltYm9sRGljdGlvbmFyeSIsImdldFN5bWJvbERpY3Rpb25hcnlIdWZmbWFuVGFibGVzIiwicmVmZXJyZWRTZWdtZW50cyIsInJlZmVycmVkU3ltYm9scyIsImRlY29kZVN5bWJvbERpY3Rpb25hcnkiLCJvbkltbWVkaWF0ZVRleHRSZWdpb24iLCJnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyIsIm9uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uIiwib25QYXR0ZXJuRGljdGlvbmFyeSIsImRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5Iiwib25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsImRlY29kZUhhbGZ0b25lUmVnaW9uIiwib25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIiwib25UYWJsZXMiLCJjdXN0b21UYWJsZXMiLCJkZWNvZGVUYWJsZXNTZWdtZW50IiwibGluZURhdGEiLCJsaW5lIiwiSHVmZm1hblRyZWVOb2RlIiwiYnVpbGRUcmVlIiwibm9kZSIsImRlY29kZU5vZGUiLCJodE9mZnNldCIsInJlYWRlciIsImxpbmVzIiwiSHVmZm1hblRhYmxlIiwiZGVjb2RlIiwiYXNzaWduUHJlZml4Q29kZXMiLCJsaW5lc0xlbmd0aCIsInByZWZpeExlbmd0aE1heCIsImhpc3RvZ3JhbSIsImN1cnJlbnRMZW5ndGgiLCJmaXJzdENvZGUiLCJjdXJyZW50Q29kZSIsImN1cnJlbnRUZW1wIiwibG93ZXN0VmFsdWUiLCJoaWdoZXN0VmFsdWUiLCJwcmVmaXhTaXplQml0cyIsInJhbmdlU2l6ZUJpdHMiLCJjdXJyZW50UmFuZ2VMb3ciLCJwcmVmaXhMZW5ndGgiLCJyYW5nZUxlbmd0aCIsInN0YW5kYXJkVGFibGVzQ2FjaGUiLCJ0YWJsZSIsIlJlYWRlciIsInJlYWRCaXQiLCJudW1CaXRzIiwiYnl0ZUFsaWduIiwibmV4dCIsImN1cnJlbnRJbmRleCIsImluZGV4IiwiY29kZXMiLCJydW5Db2Rlc1RhYmxlIiwibnVtYmVyT2ZSZXBlYXRzIiwicmVwZWF0ZWRMZW5ndGgiLCJzeW1ib2xJRFRhYmxlIiwiY3VzdG9tSW5kZXgiLCJ0YWJsZUZpcnN0UyIsImdldEN1c3RvbUh1ZmZtYW5UYWJsZSIsInRhYmxlRGVsdGFTIiwidGFibGVEZWx0YVQiLCJ0YWJsZURlbHRhSGVpZ2h0IiwidGFibGVEZWx0YVdpZHRoIiwidGFibGVCaXRtYXBTaXplIiwidGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMiLCJwYXJhbXMiLCJLIiwiQ29sdW1ucyIsIlJvd3MiLCJCbGFja0lzMSIsIkVuZE9mQmxvY2siLCJlb2YiLCJjdXJyZW50Qnl0ZSIsImVuZE9mQmxvY2siLCJsb29rRm9yRU9GTGltaXQiLCJwYXJzZUNodW5rcyIsInBhcnNlSmJpZzJDaHVua3MiLCJwYXJzZSIsInBhcnNlSmJpZzIiLCJsb29rdXAiLCJpbml0aWFsaXplciIsImdldEFycmF5Iiwic3RvcFdoZW5Gb3VuZCIsIkxPT1BfTElNSVQiLCJsb29wQ291bnQiLCJkaWN0IiwidmFsdWVzIiwiUk9NQU5fTlVNQkVSX01BUCIsImxvd2VyQ2FzZSIsInJvbWFuQnVmIiwicm9tYW5TdHIiLCJjaCIsIlFlVGFibGUiLCJxZSIsIm5tcHMiLCJubHBzIiwic3dpdGNoRmxhZyIsImJ5dGVJbiIsImJwIiwiY3hfaW5kZXgiLCJjeF9tcHMiLCJxZVRhYmxlSWN4IiwicWVJY3giLCJDQ0lUVEZheERlY29kZXIiLCJjY2l0dEVPTCIsImNjaXR0RU9GIiwidHdvRGltUGFzcyIsInR3b0RpbUhvcml6IiwidHdvRGltVmVydDAiLCJ0d29EaW1WZXJ0UjEiLCJ0d29EaW1WZXJ0TDEiLCJ0d29EaW1WZXJ0UjIiLCJ0d29EaW1WZXJ0TDIiLCJ0d29EaW1WZXJ0UjMiLCJ0d29EaW1WZXJ0TDMiLCJ0d29EaW1UYWJsZSIsIndoaXRlVGFibGUxIiwid2hpdGVUYWJsZTIiLCJibGFja1RhYmxlMSIsImJsYWNrVGFibGUyIiwiYmxhY2tUYWJsZTMiLCJvcHRpb25zIiwic291cmNlIiwiZW9ibG9jayIsImNvZGUxIiwicmVhZE5leHRDaGFyIiwicmVmTGluZSIsImNvZGluZ0xpbmUiLCJjb2x1bW5zIiwicmVmUG9zIiwiYmxhY2tQaXhlbHMiLCJjb2RlMiIsImNvZGUzIiwiZ290RU9MIiwiYml0cyIsIl9hZGRQaXhlbHMiLCJjb2RpbmdQb3MiLCJhMSIsIl9hZGRQaXhlbHNOZWciLCJfZmluZFRhYmxlQ29kZSIsImxpbWl0VmFsdWUiLCJsaW1pdCIsIl9nZXRUd29EaW1Db2RlIiwiX2dldFdoaXRlQ29kZSIsIl9nZXRCbGFja0NvZGUiLCJfbG9va0JpdHMiLCJuIiwiX2VhdEJpdHMiLCJKcGVnSW1hZ2UiLCJkY3RaaWdaYWciLCJkY3RDb3MxIiwiZGN0U2luMSIsImRjdENvczMiLCJkY3RTaW4zIiwiZGN0Q29zNiIsImRjdFNpbjYiLCJkY3RTcXJ0MiIsImRjdFNxcnQxZDIiLCJkZWNvZGVUcmFuc2Zvcm0iLCJjb2xvclRyYW5zZm9ybSIsImNvZGVMZW5ndGhzIiwiY2hpbGRyZW4iLCJwYXJzZUROTE1hcmtlciIsIm1jdXNQZXJMaW5lIiwiZnJhbWUiLCJwcm9ncmVzc2l2ZSIsInN0YXJ0T2Zmc2V0IiwiYml0c0RhdGEiLCJiaXRzQ291bnQiLCJuZXh0Qnl0ZSIsInNjYW5MaW5lcyIsIm1heWJlU2NhbkxpbmVzIiwiYmxvY2tSb3ciLCJyZWNlaXZlIiwiZGVjb2RlSHVmZm1hbiIsImNvbXBvbmVudCIsImRpZmYiLCJyZWNlaXZlQW5kRXh0ZW5kIiwicnMiLCJzIiwieiIsImJsb2NrT2Zmc2V0IiwiZW9icnVuIiwiZSIsInN1Y2Nlc3NpdmVBQ1N0YXRlIiwib2Zmc2V0WiIsInN1Y2Nlc3NpdmVBQ05leHRWYWx1ZSIsIm1jdVJvdyIsIm1jdSIsIm1jdUNvbCIsImJsb2NrQ29sIiwiZ2V0QmxvY2tCdWZmZXJPZmZzZXQiLCJjb21wb25lbnRzTGVuZ3RoIiwiY29tcG9uZW50cyIsInNwZWN0cmFsU3RhcnQiLCJkZWNvZGVGbiIsInN1Y2Nlc3NpdmVQcmV2IiwibWN1RXhwZWN0ZWQiLCJtY3VUb1JlYWQiLCJyZXNldEludGVydmFsIiwiZGVjb2RlQmxvY2siLCJoIiwiZGVjb2RlTWN1IiwiZmlsZU1hcmtlciIsImZpbmROZXh0RmlsZU1hcmtlciIsInBhcnRpYWxNc2ciLCJxdCIsImJsb2NrRGF0YSIsInAwIiwiYmxvY2tCdWZmZXJPZmZzZXQiLCJwNSIsInA2IiwicDciLCJ2MCIsInYxIiwidjIiLCJ2MyIsInY0IiwidjciLCJ2NSIsInY2IiwiY29sIiwiYmxvY2tzUGVyTGluZSIsImJsb2Nrc1BlckNvbHVtbiIsImNvbXB1dGF0aW9uQnVmZmVyIiwicXVhbnRpemVBbmRJbnZlcnNlIiwic3RhcnRQb3MiLCJtYXhQb3MiLCJuZXdQb3MiLCJjdXJyZW50UG9zIiwiY3VycmVudE1hcmtlciIsImludmFsaWQiLCJtYXJrZXIiLCJuZXdNYXJrZXIiLCJkbmxTY2FuTGluZXMiLCJlbmRPZmZzZXQiLCJhcnJheSIsIm1jdXNQZXJDb2x1bW4iLCJibG9ja3NQZXJMaW5lRm9yTWN1IiwiYmxvY2tzUGVyQ29sdW1uRm9yTWN1IiwiYmxvY2tzQnVmZmVyU2l6ZSIsImpmaWYiLCJhZG9iZSIsIm51bVNPU01hcmtlcnMiLCJxdWFudGl6YXRpb25UYWJsZXMiLCJodWZmbWFuVGFibGVzQUMiLCJodWZmbWFuVGFibGVzREMiLCJhcHBEYXRhIiwicmVhZERhdGFCbG9jayIsInZlcnNpb24iLCJtYWpvciIsIm1pbm9yIiwiZGVuc2l0eVVuaXRzIiwieERlbnNpdHkiLCJ5RGVuc2l0eSIsInRodW1iV2lkdGgiLCJ0aHVtYkhlaWdodCIsInRodW1iRGF0YSIsImZsYWdzMCIsImZsYWdzMSIsInRyYW5zZm9ybUNvZGUiLCJxdWFudGl6YXRpb25UYWJsZXNMZW5ndGgiLCJxdWFudGl6YXRpb25UYWJsZXNFbmQiLCJxdWFudGl6YXRpb25UYWJsZVNwZWMiLCJ0YWJsZURhdGEiLCJzb2ZTY2FuTGluZXMiLCJjb21wb25lbnRzQ291bnQiLCJtYXhIIiwibWF4ViIsImNvbXBvbmVudElkIiwicUlkIiwibCIsInF1YW50aXphdGlvbklkIiwicXVhbnRpemF0aW9uVGFibGUiLCJwcmVwYXJlQ29tcG9uZW50cyIsImh1ZmZtYW5MZW5ndGgiLCJodWZmbWFuVGFibGVTcGVjIiwiY29kZUxlbmd0aFN1bSIsImh1ZmZtYW5WYWx1ZXMiLCJidWlsZEh1ZmZtYW5UYWJsZSIsInNlbGVjdG9yc0NvdW50IiwiY29tcG9uZW50SW5kZXgiLCJ0YWJsZVNwZWMiLCJzcGVjdHJhbEVuZCIsInN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uIiwicHJvY2Vzc2VkIiwiZGVjb2RlU2NhbiIsImV4IiwibmV4dEZpbGVNYXJrZXIiLCJvdXRwdXQiLCJidWlsZENvbXBvbmVudERhdGEiLCJzY2FsZVgiLCJzY2FsZVkiLCJfZ2V0TGluZWFyaXplZEJsb2NrRGF0YSIsImlzU291cmNlUERGIiwibnVtQ29tcG9uZW50cyIsImRhdGFMZW5ndGgiLCJ4U2NhbGVCbG9ja09mZnNldCIsIm1hc2szTFNCIiwiY29tcG9uZW50U2NhbGVYIiwiY29tcG9uZW50U2NhbGVZIiwiYmxvY2tzUGVyU2NhbmxpbmUiLCJsYXN0Q29tcG9uZW50U2NhbGVYIiwiX2NvbnZlcnRZY2NUb1JnYiIsIlkiLCJDYiIsIkNyIiwiX2NvbnZlcnRZY2NrVG9SZ2IiLCJfY29udmVydFljY2tUb0NteWsiLCJfY29udmVydENteWtUb1JnYiIsImdldERhdGEiLCJmb3JjZVJHQiIsInJnYkRhdGEiLCJncmF5Q29sb3IiLCJKcHhJbWFnZSIsIlN1YmJhbmRzR2FpbkxvZzIiLCJMTCIsIkxIIiwiSEwiLCJISCIsImhlYWQiLCJoZWFkZXJTaXplIiwibGJveCIsInRib3giLCJqdW1wRGF0YUxlbmd0aCIsIm1ldGhvZCIsImNvbG9yc3BhY2UiLCJoZWFkZXJUeXBlIiwicGFyc2VJbWFnZVByb3BlcnRpZXMiLCJuZXdCeXRlIiwic3RyZWFtIiwib2xkQnl0ZSIsIlhzaXoiLCJZc2l6IiwiWE9zaXoiLCJZT3NpeiIsIkNzaXoiLCJwYXJzZUNvZGVzdHJlYW0iLCJjb250ZXh0IiwiZG9Ob3RSZWNvdmVyIiwic2l6IiwicHJlY2lzaW9uIiwiaXNTaWduZWQiLCJYUnNpeiIsIllSc2l6IiwiY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyIsImNhbGN1bGF0ZVRpbGVHcmlkcyIsInFjZCIsInNxY2QiLCJzcHFjZFNpemUiLCJzY2FsYXJFeHBvdW5kZWQiLCJzcHFjZHMiLCJzcHFjZCIsInFjYyIsImNxY2MiLCJjb2QiLCJzY29kIiwiYmxvY2tTdHlsZSIsInByZWNpbmN0c1NpemVzIiwicHJlY2luY3RzU2l6ZSIsIlBQeCIsIlBQeSIsInVuc3VwcG9ydGVkIiwidGlsZSIsImluaXRpYWxpemVUaWxlIiwiYnVpbGRQYWNrZXRzIiwicGFyc2VUaWxlUGFja2V0cyIsInRyYW5zZm9ybUNvbXBvbmVudHMiLCJ0aWxlcyIsIm51bVh0aWxlcyIsIm51bVl0aWxlcyIsImpqIiwidGlsZUNvbXBvbmVudCIsImNvZE9yQ29jIiwicHJlY2luY3RXaWR0aCIsImRpbWVuc2lvbnMiLCJwcmVjaW5jdEhlaWdodCIsImlzWmVyb1JlcyIsInJlc29sdXRpb24iLCJwcmVjaW5jdFdpZHRoSW5TdWJiYW5kIiwicHJlY2luY3RIZWlnaHRJblN1YmJhbmQiLCJudW1wcmVjaW5jdHN3aWRlIiwibnVtcHJlY2luY3RzaGlnaCIsIm51bXByZWNpbmN0cyIsInhjYl8iLCJ5Y2JfIiwiY29kZWJsb2NrV2lkdGgiLCJjb2RlYmxvY2tIZWlnaHQiLCJjYngwIiwic3ViYmFuZCIsImNieTAiLCJjYngxIiwiY2J5MSIsInByZWNpbmN0UGFyYW1ldGVycyIsImNvZGVibG9ja3MiLCJwcmVjaW5jdHMiLCJjb2RlYmxvY2siLCJjYngiLCJjYnkiLCJ0YngwIiwidGJ5MCIsInRieDEiLCJ0YnkxIiwicGkiLCJwaiIsInByZWNpbmN0TnVtYmVyIiwicHJlY2luY3QiLCJjYnhNaW4iLCJjYnlNaW4iLCJjYnhNYXgiLCJjYnlNYXgiLCJudW1jb2RlYmxvY2t3aWRlIiwibnVtY29kZWJsb2NraGlnaCIsInByZWNpbmN0Q29kZWJsb2NrcyIsInN1YmJhbmRzIiwidGlsZUluZGV4IiwibGF5ZXJzQ291bnQiLCJtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQiLCJwYWNrZXQiLCJjcmVhdGVQYWNrZXQiLCJtYXhOdW1QcmVjaW5jdHNJbkxldmVsIiwibWF4TnVtUHJlY2luY3RzIiwicmVzb2x1dGlvbnMiLCJnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlIiwicHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMiLCJweCIsInB5IiwiZGVjb21wb3NpdGlvbkxldmVsc0NvdW50Iiwic2l6ZUluSW1hZ2VTY2FsZSIsImdldFByZWNpbmN0SW5kZXhJZkV4aXN0IiwicG9zWCIsInB4SW5kZXgiLCJwcmVjaW5jdEl0ZXJhdGlvblNpemVzIiwicG9zWSIsInB5SW5kZXgiLCJzdGFydFByZWNpbmN0Um93SW5kZXgiLCJtaW5XaWR0aCIsIm1pbkhlaWdodCIsIm1heE51bVdpZGUiLCJtYXhOdW1IaWdoIiwic2l6ZVBlckNvbXBvbmVudCIsInNpemVQZXJSZXNvbHV0aW9uIiwibWluV2lkdGhDdXJyZW50Q29tcG9uZW50IiwibWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCIsIm1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50IiwibWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQiLCJzY2FsZSIsIndpZHRoQ3VycmVudFJlc29sdXRpb24iLCJoZWlnaHRDdXJyZW50UmVzb2x1dGlvbiIsImJsb2Nrc0RpbWVuc2lvbnMiLCJnZXRCbG9ja3NEaW1lbnNpb25zIiwiYnVpbGRQcmVjaW5jdHMiLCJidWlsZENvZGVibG9ja3MiLCJic2NhbGUiLCJyZXNvbHV0aW9uU3ViYmFuZHMiLCJwcm9ncmVzc2lvbk9yZGVyIiwiYnVmZmVyU2l6ZSIsInNraXBOZXh0Qml0Iiwic2tpcEJ5dGVzIiwic29wTWFya2VyVXNlZCIsImVwaE1hcmtlclVzZWQiLCJwYWNrZXRzSXRlcmF0b3IiLCJhbGlnblRvQnl0ZSIsInNraXBNYXJrZXJJZkVxdWFsIiwibGF5ZXJOdW1iZXIiLCJxdWV1ZSIsImNvZGVibG9ja0NvbHVtbiIsImNvZGVibG9ja1JvdyIsImNvZGVibG9ja0luY2x1ZGVkIiwiZmlyc3RUaW1lSW5jbHVzaW9uIiwiaW5jbHVzaW9uVHJlZSIsInplcm9CaXRQbGFuZXNUcmVlIiwidmFsdWVSZWFkeSIsImNvZGluZ3Bhc3NlcyIsInJlYWRDb2RpbmdwYXNzZXMiLCJjb2RpbmdwYXNzZXNMb2cyIiwiY29kZWREYXRhTGVuZ3RoIiwicGFja2V0SXRlbSIsIngwIiwieTAiLCJyaWdodCIsImJvdHRvbSIsImJsb2NrV2lkdGgiLCJibG9ja0hlaWdodCIsImJpdE1vZGVsIiwiY3VycmVudENvZGluZ3Bhc3NUeXBlIiwidG90YWxMZW5ndGgiLCJkYXRhSXRlbSIsImVuY29kZWREYXRhIiwibWFnbml0dWRlIiwiYml0c0RlY29kZWQiLCJtYWduaXR1ZGVDb3JyZWN0aW9uIiwicmV2ZXJzaWJsZSIsImludGVybGVhdmUiLCJsZXZlbE9mZnNldCIsIm5iIiwiY29lZmZpY2llbnRzIiwibWIiLCJjb2RpbmdTdHlsZVBhcmFtZXRlcnMiLCJxdWFudGl6YXRpb25QYXJhbWV0ZXJzIiwiZ3VhcmRCaXRzIiwic2VnbWVudGF0aW9uU3ltYm9sVXNlZCIsInN1YmJhbmRDb2VmZmljaWVudHMiLCJtdSIsImVwc2lsb24iLCJnYWluTG9nMiIsImRlbHRhIiwiY29weUNvZWZmaWNpZW50cyIsIml0ZW1zIiwibGVmdCIsInRvcCIsInJlc3VsdEltYWdlcyIsInRyYW5zZm9ybWVkVGlsZXMiLCJ0cmFuc2Zvcm1UaWxlIiwidGlsZTAiLCJvdXQiLCJmb3VyQ29tcG9uZW50cyIsInkwaXRlbXMiLCJ5MWl0ZW1zIiwieTJpdGVtcyIsInkzaXRlbXMiLCJjb21wb25lbnQwIiwiYWxwaGEwMSIsInkxIiwieTIiLCJnIiwicWNkT3JRY2MiLCJUYWdUcmVlIiwibGV2ZWxzTGVuZ3RoIiwibGV2ZWwiLCJyZXNldCIsImN1cnJlbnRMZXZlbCIsImluY3JlbWVudFZhbHVlIiwibmV4dExldmVsIiwiSW5jbHVzaW9uVHJlZSIsInN0b3BWYWx1ZSIsInByb3BhZ2F0ZVZhbHVlcyIsImxldmVsSW5kZXgiLCJjdXJyZW50VmFsdWUiLCJCaXRNb2RlbCIsIlVOSUZPUk1fQ09OVEVYVCIsIlJVTkxFTkdUSF9DT05URVhUIiwiTExBbmRMSENvbnRleHRzTGFiZWwiLCJITENvbnRleHRMYWJlbCIsIkhIQ29udGV4dExhYmVsIiwiY29udGV4dExhYmVsVGFibGUiLCJjb2VmZmljaWVudENvdW50IiwiY29lZmZpY2VudHNNYWduaXR1ZGUiLCJ6ZXJvQml0UGxhbmVzIiwic2V0RGVjb2RlciIsInNldE5laWdoYm9yc1NpZ25pZmljYW5jZSIsIm5laWdoYm9yc1NpZ25pZmljYW5jZSIsImNvbHVtbiIsInJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcyIsImNvZWZmaWNlbnRzU2lnbiIsInByb2Nlc3NpbmdGbGFncyIsImxhYmVscyIsInByb2Nlc3NlZEludmVyc2VNYXNrIiwicHJvY2Vzc2VkTWFzayIsImZpcnN0TWFnbml0dWRlQml0TWFzayIsImkxIiwiZGVjaXNpb24iLCJkZWNvZGVTaWduQml0Iiwic2lnbmlmaWNhbmNlMSIsInNpZ24xIiwic2lnbjAiLCJjb250cmlidXRpb24iLCJob3Jpem9udGFsQ29udHJpYnV0aW9uIiwiZGVjb2RlZCIsInJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzIiwid2lkdGg0IiwiaW5kZXgwIiwiaW5kZXhOZXh0Iiwic2lnbmlmaWNhbmNlIiwicnVuQ2xlYW51cFBhc3MiLCJvbmVSb3dEb3duIiwidHdvUm93c0Rvd24iLCJ0aHJlZVJvd3NEb3duIiwiaU5leHQiLCJpbmRleEJhc2UiLCJjaGVja0FsbEVtcHR5IiwiYWxsRW1wdHkiLCJoYXNTaWduaWZpY2FudENvZWZmaWNlbnQiLCJpMiIsImNoZWNrU2VnbWVudGF0aW9uU3ltYm9sIiwiVHJhbnNmb3JtIiwibGwiLCJqMSIsImoyIiwibGxXaWR0aCIsImxsSGVpZ2h0IiwibGxJdGVtcyIsImhsX2xoX2hoIiwiYnVmZmVyUGFkZGluZyIsInJvd0J1ZmZlciIsIm51bUJ1ZmZlcnMiLCJjb2xCdWZmZXJzIiwiY3VycmVudEJ1ZmZlciIsInUiLCJJcnJldmVyc2libGVUcmFuc2Zvcm0iLCJsZW4iLCJhbHBoYSIsImJldGEiLCJnYW1tYSIsIktfIiwiY3VycmVudCIsIlJldmVyc2libGVUcmFuc2Zvcm0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENB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InBkZi5pbWFnZV9kZWNvZGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwicGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnNcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wicGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wicGRmanMtZGlzdC9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnNcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd19wZGZqc19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd19wZGZqc19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193X3BkZmpzX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd19wZGZqc19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193X3BkZmpzX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd19wZGZqc19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193X3BkZmpzX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193X3BkZmpzX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd19wZGZqc19yZXF1aXJlX18oX193X3BkZmpzX3JlcXVpcmVfXy5zID0gMCk7XG4iLCIvKiBDb3B5cmlnaHQgMjAxOCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZ2V0VmVyYm9zaXR5TGV2ZWwsIHNldFZlcmJvc2l0eUxldmVsIH0gZnJvbSBcIi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IEpiaWcybWFnZSB9IGZyb20gXCIuL2NvcmUvamJpZzIuanNcIjtcbmltcG9ydCB7IEpwZWdJbWFnZSB9IGZyb20gXCIuL2NvcmUvanBnLmpzXCI7XG5pbXBvcnQgeyBKcHhJbWFnZSB9IGZyb20gXCIuL2NvcmUvanB4LmpzXCI7XG5cbi8vIFRvIGVuc3VyZSB0aGF0IHRoZSBzdGFuZGFsb25lIFBERi5qcyBpbWFnZSBkZWNvZGVycyBoYXZlIHRoZSBzYW1lXG4vLyBicm93c2VyL2Vudmlyb25tZW50IGNvbXBhdGliaWxpdHkgYXMgdGhlIHJlZ3VsYXIgUERGLmpzIGxpYnJhcnksXG4vLyB0aGUgc3RhbmRhcmQgc2V0IG9mIHBvbHlmaWxscyBhcmUgdGh1cyBpbmNsdWRlZCBpbiB0aGlzIGJ1aWxkIGFzIHdlbGwuXG4vL1xuLy8gR2l2ZW4gdGhhdCB0aGUgKGN1cnJlbnQpIGltYWdlIGRlY29kZXJzIGRvbid0IHVzZSBhbGwgb2YgdGhlIGZlYXR1cmVzXG4vLyBvZiB0aGUgY29tcGxldGUgUERGLmpzIGxpYnJhcnksIGUuZy4gdGhleSBhcmUgY29tcGxldGVseSBzeW5jaHJvbm91cyxcbi8vIHNvbWUgb2YgdGhlIGxhcmdlciBwb2x5ZmlsbHMgYXJlIHRodXMgdW5uZWNlc3NhcnkuXG4vL1xuLy8gSW4gYW4gYXR0ZW1wdCB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHN0YW5kYWxvbmUgUERGLmpzIGltYWdlIGRlY29kZXJzLFxuLy8gdGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIGN1cnJlbnRseSBiZWluZyBleGNsdWRlZDpcbi8vICAtIFJlYWRhYmxlU3RyZWFtXG4vLyAgLSBQcm9taXNlXG4vLyAgLSBVUkxcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBwZGZqc1ZlcnNpb24gPSBQREZKU0Rldi5ldmFsKFwiQlVORExFX1ZFUlNJT05cIik7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmNvbnN0IHBkZmpzQnVpbGQgPSBQREZKU0Rldi5ldmFsKFwiQlVORExFX0JVSUxEXCIpO1xuXG5leHBvcnQgeyBKYmlnMm1hZ2UsIEpwZWdJbWFnZSwgSnB4SW1hZ2UsIGdldFZlcmJvc2l0eUxldmVsLCBzZXRWZXJib3NpdHlMZXZlbCB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQgbm8tdmFyOiBlcnJvciAqL1xuXG5pbXBvcnQgXCIuL2NvbXBhdGliaWxpdHkuanNcIjtcblxuY29uc3QgSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdO1xuY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTtcblxuLy8gUGVybWlzc2lvbiBmbGFncyBmcm9tIFRhYmxlIDIyLCBTZWN0aW9uIDcuNi4zLjIgb2YgdGhlIFBERiBzcGVjaWZpY2F0aW9uLlxuY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7XG4gIFBSSU5UOiAweDA0LFxuICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsXG4gIENPUFk6IDB4MTAsXG4gIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCxcbiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsXG4gIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLFxuICBBU1NFTUJMRTogMHg0MDAsXG4gIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAsXG59O1xuXG5jb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHtcbiAgRklMTDogMCxcbiAgU1RST0tFOiAxLFxuICBGSUxMX1NUUk9LRTogMixcbiAgSU5WSVNJQkxFOiAzLFxuICBGSUxMX0FERF9UT19QQVRIOiA0LFxuICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsXG4gIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LFxuICBBRERfVE9fUEFUSDogNyxcbiAgRklMTF9TVFJPS0VfTUFTSzogMyxcbiAgQUREX1RPX1BBVEhfRkxBRzogNCxcbn07XG5cbmNvbnN0IEltYWdlS2luZCA9IHtcbiAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gIFJHQl8yNEJQUDogMixcbiAgUkdCQV8zMkJQUDogMyxcbn07XG5cbmNvbnN0IEFubm90YXRpb25UeXBlID0ge1xuICBURVhUOiAxLFxuICBMSU5LOiAyLFxuICBGUkVFVEVYVDogMyxcbiAgTElORTogNCxcbiAgU1FVQVJFOiA1LFxuICBDSVJDTEU6IDYsXG4gIFBPTFlHT046IDcsXG4gIFBPTFlMSU5FOiA4LFxuICBISUdITElHSFQ6IDksXG4gIFVOREVSTElORTogMTAsXG4gIFNRVUlHR0xZOiAxMSxcbiAgU1RSSUtFT1VUOiAxMixcbiAgU1RBTVA6IDEzLFxuICBDQVJFVDogMTQsXG4gIElOSzogMTUsXG4gIFBPUFVQOiAxNixcbiAgRklMRUFUVEFDSE1FTlQ6IDE3LFxuICBTT1VORDogMTgsXG4gIE1PVklFOiAxOSxcbiAgV0lER0VUOiAyMCxcbiAgU0NSRUVOOiAyMSxcbiAgUFJJTlRFUk1BUks6IDIyLFxuICBUUkFQTkVUOiAyMyxcbiAgV0FURVJNQVJLOiAyNCxcbiAgVEhSRUVEOiAyNSxcbiAgUkVEQUNUOiAyNixcbn07XG5cbmNvbnN0IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHtcbiAgTUFSS0VEOiBcIk1hcmtlZFwiLFxuICBSRVZJRVc6IFwiUmV2aWV3XCIsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uTWFya2VkU3RhdGUgPSB7XG4gIE1BUktFRDogXCJNYXJrZWRcIixcbiAgVU5NQVJLRUQ6IFwiVW5tYXJrZWRcIixcbn07XG5cbmNvbnN0IEFubm90YXRpb25SZXZpZXdTdGF0ZSA9IHtcbiAgQUNDRVBURUQ6IFwiQWNjZXB0ZWRcIixcbiAgUkVKRUNURUQ6IFwiUmVqZWN0ZWRcIixcbiAgQ0FOQ0VMTEVEOiBcIkNhbmNlbGxlZFwiLFxuICBDT01QTEVURUQ6IFwiQ29tcGxldGVkXCIsXG4gIE5PTkU6IFwiTm9uZVwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHtcbiAgR1JPVVA6IFwiR3JvdXBcIixcbiAgUkVQTFk6IFwiUlwiLFxufTtcblxuY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7XG4gIElOVklTSUJMRTogMHgwMSxcbiAgSElEREVOOiAweDAyLFxuICBQUklOVDogMHgwNCxcbiAgTk9aT09NOiAweDA4LFxuICBOT1JPVEFURTogMHgxMCxcbiAgTk9WSUVXOiAweDIwLFxuICBSRUFET05MWTogMHg0MCxcbiAgTE9DS0VEOiAweDgwLFxuICBUT0dHTEVOT1ZJRVc6IDB4MTAwLFxuICBMT0NLRURDT05URU5UUzogMHgyMDAsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0ge1xuICBSRUFET05MWTogMHgwMDAwMDAxLFxuICBSRVFVSVJFRDogMHgwMDAwMDAyLFxuICBOT0VYUE9SVDogMHgwMDAwMDA0LFxuICBNVUxUSUxJTkU6IDB4MDAwMTAwMCxcbiAgUEFTU1dPUkQ6IDB4MDAwMjAwMCxcbiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLFxuICBSQURJTzogMHgwMDA4MDAwLFxuICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsXG4gIENPTUJPOiAweDAwMjAwMDAsXG4gIEVESVQ6IDB4MDA0MDAwMCxcbiAgU09SVDogMHgwMDgwMDAwLFxuICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsXG4gIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsXG4gIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLFxuICBET05PVFNDUk9MTDogMHgwODAwMDAwLFxuICBDT01COiAweDEwMDAwMDAsXG4gIFJJQ0hURVhUOiAweDIwMDAwMDAsXG4gIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsXG4gIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDAsXG59O1xuXG5jb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0ge1xuICBTT0xJRDogMSxcbiAgREFTSEVEOiAyLFxuICBCRVZFTEVEOiAzLFxuICBJTlNFVDogNCxcbiAgVU5ERVJMSU5FOiA1LFxufTtcblxuY29uc3QgU3RyZWFtVHlwZSA9IHtcbiAgVU5LTk9XTjogXCJVTktOT1dOXCIsXG4gIEZMQVRFOiBcIkZMQVRFXCIsXG4gIExaVzogXCJMWldcIixcbiAgRENUOiBcIkRDVFwiLFxuICBKUFg6IFwiSlBYXCIsXG4gIEpCSUc6IFwiSkJJR1wiLFxuICBBODU6IFwiQTg1XCIsXG4gIEFIWDogXCJBSFhcIixcbiAgQ0NGOiBcIkNDRlwiLFxuICBSTFg6IFwiUkxYXCIsIC8vIFBERiBzaG9ydCBuYW1lIGlzICdSTCcsIGJ1dCB0ZWxlbWV0cnkgcmVxdWlyZXMgdGhyZWUgY2hhcnMuXG59O1xuXG5jb25zdCBGb250VHlwZSA9IHtcbiAgVU5LTk9XTjogXCJVTktOT1dOXCIsXG4gIFRZUEUxOiBcIlRZUEUxXCIsXG4gIFRZUEUxQzogXCJUWVBFMUNcIixcbiAgQ0lERk9OVFRZUEUwOiBcIkNJREZPTlRUWVBFMFwiLFxuICBDSURGT05UVFlQRTBDOiBcIkNJREZPTlRUWVBFMENcIixcbiAgVFJVRVRZUEU6IFwiVFJVRVRZUEVcIixcbiAgQ0lERk9OVFRZUEUyOiBcIkNJREZPTlRUWVBFMlwiLFxuICBUWVBFMzogXCJUWVBFM1wiLFxuICBPUEVOVFlQRTogXCJPUEVOVFlQRVwiLFxuICBUWVBFMDogXCJUWVBFMFwiLFxuICBNTVRZUEUxOiBcIk1NVFlQRTFcIixcbn07XG5cbmNvbnN0IFZlcmJvc2l0eUxldmVsID0ge1xuICBFUlJPUlM6IDAsXG4gIFdBUk5JTkdTOiAxLFxuICBJTkZPUzogNSxcbn07XG5cbmNvbnN0IENNYXBDb21wcmVzc2lvblR5cGUgPSB7XG4gIE5PTkU6IDAsXG4gIEJJTkFSWTogMSxcbiAgU1RSRUFNOiAyLFxufTtcblxuLy8gQWxsIHRoZSBwb3NzaWJsZSBvcGVyYXRpb25zIGZvciBhbiBvcGVyYXRvciBsaXN0LlxuY29uc3QgT1BTID0ge1xuICAvLyBJbnRlbnRpb25hbGx5IHN0YXJ0IGZyb20gMSBzbyBpdCBpcyBlYXN5IHRvIHNwb3QgYmFkIG9wZXJhdG9ycyB0aGF0IHdpbGwgYmVcbiAgLy8gMCdzLlxuICBkZXBlbmRlbmN5OiAxLFxuICBzZXRMaW5lV2lkdGg6IDIsXG4gIHNldExpbmVDYXA6IDMsXG4gIHNldExpbmVKb2luOiA0LFxuICBzZXRNaXRlckxpbWl0OiA1LFxuICBzZXREYXNoOiA2LFxuICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gIHNldEZsYXRuZXNzOiA4LFxuICBzZXRHU3RhdGU6IDksXG4gIHNhdmU6IDEwLFxuICByZXN0b3JlOiAxMSxcbiAgdHJhbnNmb3JtOiAxMixcbiAgbW92ZVRvOiAxMyxcbiAgbGluZVRvOiAxNCxcbiAgY3VydmVUbzogMTUsXG4gIGN1cnZlVG8yOiAxNixcbiAgY3VydmVUbzM6IDE3LFxuICBjbG9zZVBhdGg6IDE4LFxuICByZWN0YW5nbGU6IDE5LFxuICBzdHJva2U6IDIwLFxuICBjbG9zZVN0cm9rZTogMjEsXG4gIGZpbGw6IDIyLFxuICBlb0ZpbGw6IDIzLFxuICBmaWxsU3Ryb2tlOiAyNCxcbiAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICBlbmRQYXRoOiAyOCxcbiAgY2xpcDogMjksXG4gIGVvQ2xpcDogMzAsXG4gIGJlZ2luVGV4dDogMzEsXG4gIGVuZFRleHQ6IDMyLFxuICBzZXRDaGFyU3BhY2luZzogMzMsXG4gIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgc2V0SFNjYWxlOiAzNSxcbiAgc2V0TGVhZGluZzogMzYsXG4gIHNldEZvbnQ6IDM3LFxuICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gIHNldFRleHRSaXNlOiAzOSxcbiAgbW92ZVRleHQ6IDQwLFxuICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICBzZXRUZXh0TWF0cml4OiA0MixcbiAgbmV4dExpbmU6IDQzLFxuICBzaG93VGV4dDogNDQsXG4gIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICBzZXRTdHJva2VDb2xvck46IDUzLFxuICBzZXRGaWxsQ29sb3I6IDU0LFxuICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgc2V0U3Ryb2tlR3JheTogNTYsXG4gIHNldEZpbGxHcmF5OiA1NyxcbiAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgc2hhZGluZ0ZpbGw6IDYyLFxuICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gIHBhaW50WE9iamVjdDogNjYsXG4gIG1hcmtQb2ludDogNjcsXG4gIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgYmVnaW5Db21wYXQ6IDcyLFxuICBlbmRDb21wYXQ6IDczLFxuICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgYmVnaW5Hcm91cDogNzYsXG4gIGVuZEdyb3VwOiA3NyxcbiAgYmVnaW5Bbm5vdGF0aW9uczogNzgsXG4gIGVuZEFubm90YXRpb25zOiA3OSxcbiAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgZW5kQW5ub3RhdGlvbjogODEsXG4gIHBhaW50SnBlZ1hPYmplY3Q6IDgyLFxuICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLFxuICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsXG4gIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSxcbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LFxuICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NyxcbiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LFxuICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LFxuICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLFxuICBjb25zdHJ1Y3RQYXRoOiA5MSxcbn07XG5cbmNvbnN0IFVOU1VQUE9SVEVEX0ZFQVRVUkVTID0ge1xuICAvKiogQGRlcHJlY2F0ZWQgdW51c2VkICovXG4gIHVua25vd246IFwidW5rbm93blwiLFxuICBmb3JtczogXCJmb3Jtc1wiLFxuICBqYXZhU2NyaXB0OiBcImphdmFTY3JpcHRcIixcbiAgc21hc2s6IFwic21hc2tcIixcbiAgc2hhZGluZ1BhdHRlcm46IFwic2hhZGluZ1BhdHRlcm5cIixcbiAgLyoqIEBkZXByZWNhdGVkIHVudXNlZCAqL1xuICBmb250OiBcImZvbnRcIixcbiAgZXJyb3JUaWxpbmdQYXR0ZXJuOiBcImVycm9yVGlsaW5nUGF0dGVyblwiLFxuICBlcnJvckV4dEdTdGF0ZTogXCJlcnJvckV4dEdTdGF0ZVwiLFxuICBlcnJvclhPYmplY3Q6IFwiZXJyb3JYT2JqZWN0XCIsXG4gIGVycm9yRm9udExvYWRUeXBlMzogXCJlcnJvckZvbnRMb2FkVHlwZTNcIixcbiAgZXJyb3JGb250U3RhdGU6IFwiZXJyb3JGb250U3RhdGVcIixcbiAgZXJyb3JGb250TWlzc2luZzogXCJlcnJvckZvbnRNaXNzaW5nXCIsXG4gIGVycm9yRm9udFRyYW5zbGF0ZTogXCJlcnJvckZvbnRUcmFuc2xhdGVcIixcbiAgZXJyb3JDb2xvclNwYWNlOiBcImVycm9yQ29sb3JTcGFjZVwiLFxuICBlcnJvck9wZXJhdG9yTGlzdDogXCJlcnJvck9wZXJhdG9yTGlzdFwiLFxuICBlcnJvckZvbnRUb1VuaWNvZGU6IFwiZXJyb3JGb250VG9Vbmljb2RlXCIsXG4gIGVycm9yRm9udExvYWROYXRpdmU6IFwiZXJyb3JGb250TG9hZE5hdGl2ZVwiLFxuICBlcnJvckZvbnRHZXRQYXRoOiBcImVycm9yRm9udEdldFBhdGhcIixcbiAgZXJyb3JNYXJrZWRDb250ZW50OiBcImVycm9yTWFya2VkQ29udGVudFwiLFxufTtcblxuY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7XG4gIE5FRURfUEFTU1dPUkQ6IDEsXG4gIElOQ09SUkVDVF9QQVNTV09SRDogMixcbn07XG5cbmxldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUztcblxuZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHtcbiAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7XG4gICAgdmVyYm9zaXR5ID0gbGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7XG4gIHJldHVybiB2ZXJib3NpdHk7XG59XG5cbi8vIEEgbm90aWNlIGZvciBkZXZzLiBUaGVzZSBhcmUgZ29vZCBmb3IgdGhpbmdzIHRoYXQgYXJlIGhlbHBmdWwgdG8gZGV2cywgc3VjaFxuLy8gYXMgd2FybmluZyB0aGF0IFdvcmtlcnMgd2VyZSBkaXNhYmxlZCwgd2hpY2ggaXMgaW1wb3J0YW50IHRvIGRldnMgYnV0IG5vdFxuLy8gZW5kIHVzZXJzLlxuZnVuY3Rpb24gaW5mbyhtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykge1xuICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTtcbiAgfVxufVxuXG4vLyBOb24tZmF0YWwgd2FybmluZ3MuXG5mdW5jdGlvbiB3YXJuKG1zZykge1xuICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7XG4gICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykge1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykge1xuICBpZiAoIWNvbmQpIHtcbiAgICB1bnJlYWNoYWJsZShtc2cpO1xuICB9XG59XG5cbi8vIENoZWNrcyBpZiBVUkxzIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiBGb3Igbm9uLUhUVFAgYmFzZWQgVVJMcywgcmV0dXJucyBmYWxzZS5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbihiYXNlVXJsLCBvdGhlclVybCkge1xuICBsZXQgYmFzZTtcbiAgdHJ5IHtcbiAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICBpZiAoIWJhc2Uub3JpZ2luIHx8IGJhc2Uub3JpZ2luID09PSBcIm51bGxcIikge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub24tSFRUUCB1cmxcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvdGhlciA9IG5ldyBVUkwob3RoZXJVcmwsIGJhc2UpO1xuICByZXR1cm4gYmFzZS5vcmlnaW4gPT09IG90aGVyLm9yaWdpbjtcbn1cblxuLy8gQ2hlY2tzIGlmIFVSTHMgdXNlIG9uZSBvZiB0aGUgYWxsb3dlZCBwcm90b2NvbHMsIGUuZy4gdG8gYXZvaWQgWFNTLlxuZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh1cmwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHtcbiAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICBjYXNlIFwiaHR0cHM6XCI6XG4gICAgY2FzZSBcImZ0cDpcIjpcbiAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgIGNhc2UgXCJ0ZWw6XCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgdmFsaWQgYWJzb2x1dGUgVVJMLlxuICpcbiAqIEBwYXJhbSB7VVJMfHN0cmluZ30gdXJsIC0gQW4gYWJzb2x1dGUsIG9yIHJlbGF0aXZlLCBVUkwuXG4gKiBAcGFyYW0ge1VSTHxzdHJpbmd9IGJhc2VVcmwgLSBBbiBhYnNvbHV0ZSBVUkwuXG4gKiBAcmV0dXJucyBFaXRoZXIgYSB2YWxpZCB7VVJMfSwgb3IgYG51bGxgIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGFic29sdXRlVXJsID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICBpZiAoX2lzVmFsaWRQcm90b2NvbChhYnNvbHV0ZVVybCkpIHtcbiAgICAgIHJldHVybiBhYnNvbHV0ZVVybDtcbiAgICB9XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgLyogYG5ldyBVUkwoKWAgd2lsbCB0aHJvdyBvbiBpbmNvcnJlY3QgZGF0YS4gKi9cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuICAgIHZhbHVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZSB7YW55fVxuICovXG5jb25zdCBCYXNlRXhjZXB0aW9uID0gKGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcblxuICByZXR1cm4gQmFzZUV4Y2VwdGlvbjtcbn0pKCk7XG5cbmNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgY29kZSkge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuXG5jbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICB9XG59XG5cbmNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciBjYXVzZWQgZHVyaW5nIHBhcnNpbmcgUERGIGRhdGEuXG4gKi9cbmNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG4vKipcbiAqIEVycm9yIHVzZWQgdG8gaW5kaWNhdGUgdGFzayBjYW5jZWxsYXRpb24uXG4gKi9cbmNsYXNzIEFib3J0RXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7fVxuXG5jb25zdCBOdWxsQ2hhcmFjdGVyc1JlZ0V4cCA9IC9cXHgwMC9nO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnMoc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgd2FybihcIlRoZSBhcmd1bWVudCBmb3IgcmVtb3ZlTnVsbENoYXJhY3RlcnMgbXVzdCBiZSBhIHN0cmluZy5cIik7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICByZXR1cm4gc3RyLnJlcGxhY2UoTnVsbENoYXJhY3RlcnNSZWdFeHAsIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7XG4gIGFzc2VydChcbiAgICBieXRlcyAhPT0gbnVsbCAmJiB0eXBlb2YgYnl0ZXMgPT09IFwib2JqZWN0XCIgJiYgYnl0ZXMubGVuZ3RoICE9PSB1bmRlZmluZWQsXG4gICAgXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nXCJcbiAgKTtcbiAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyO1xuICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICB9XG4gIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcbiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7XG4gICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7XG4gICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpO1xuICB9XG4gIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgYXNzZXJ0KHR5cGVvZiBzdHIgPT09IFwic3RyaW5nXCIsIFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKipcbiAqIEdldHMgbGVuZ3RoIG9mIHRoZSBhcnJheSAoQXJyYXksIFVpbnQ4QXJyYXksIG9yIHN0cmluZykgaW4gYnl0ZXMuXG4gKiBAcGFyYW0ge0FycmF5PGFueT58VWludDhBcnJheXxzdHJpbmd9IGFyclxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gYXJyYXlCeXRlTGVuZ3RoKGFycikge1xuICBpZiAoYXJyLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGFyci5sZW5ndGg7XG4gIH1cbiAgYXNzZXJ0KGFyci5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQsIFwiYXJyYXlCeXRlTGVuZ3RoIC0gaW52YWxpZCBhcmd1bWVudC5cIik7XG4gIHJldHVybiBhcnIuYnl0ZUxlbmd0aDtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyBhcnJheSBpdGVtcyAoYXJyYXlzKSBpbnRvIHNpbmdsZSBVaW50OEFycmF5IG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8YW55PnxVaW50OEFycmF5fHN0cmluZz59IGFyciAtIHRoZSBhcnJheSBvZiB0aGUgYXJyYXlzXG4gKiAgIChBcnJheSwgVWludDhBcnJheSwgb3Igc3RyaW5nKS5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiBhcnJheXNUb0J5dGVzKGFycikge1xuICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICAvLyBTaG9ydGN1dDogaWYgZmlyc3QgYW5kIG9ubHkgaXRlbSBpcyBVaW50OEFycmF5LCByZXR1cm4gaXQuXG4gIGlmIChsZW5ndGggPT09IDEgJiYgYXJyWzBdIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiBhcnJbMF07XG4gIH1cbiAgbGV0IHJlc3VsdExlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRMZW5ndGggKz0gYXJyYXlCeXRlTGVuZ3RoKGFycltpXSk7XG4gIH1cbiAgbGV0IHBvcyA9IDA7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShyZXN1bHRMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGl0ZW0gPSBhcnJbaV07XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbSA9IHN0cmluZ1RvQnl0ZXMoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtID0gbmV3IFVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1MZW5ndGggPSBpdGVtLmJ5dGVMZW5ndGg7XG4gICAgZGF0YS5zZXQoaXRlbSwgcG9zKTtcbiAgICBwb3MgKz0gaXRlbUxlbmd0aDtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgKHZhbHVlID4+IDI0KSAmIDB4ZmYsXG4gICAgKHZhbHVlID4+IDE2KSAmIDB4ZmYsXG4gICAgKHZhbHVlID4+IDgpICYgMHhmZixcbiAgICB2YWx1ZSAmIDB4ZmZcbiAgKTtcbn1cblxuLy8gQ2hlY2tzIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBwbGF0Zm9ybS5cbmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkge1xuICBjb25zdCBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gIGJ1ZmZlcjhbMF0gPSAxO1xuICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpO1xuICByZXR1cm4gdmlldzMyWzBdID09PSAxO1xufVxuY29uc3QgSXNMaXR0bGVFbmRpYW5DYWNoZWQgPSB7XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwidmFsdWVcIiwgaXNMaXR0bGVFbmRpYW4oKSk7XG4gIH0sXG59O1xuXG4vLyBDaGVja3MgaWYgaXQncyBwb3NzaWJsZSB0byBldmFsIEpTIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkge1xuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbihcIlwiKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcsIG5vLW5ldy1mdW5jXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmNvbnN0IElzRXZhbFN1cHBvcnRlZENhY2hlZCA9IHtcbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJ2YWx1ZVwiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7XG4gIH0sXG59O1xuXG5jb25zdCByZ2JCdWYgPSBbXCJyZ2IoXCIsIDAsIFwiLFwiLCAwLCBcIixcIiwgMCwgXCIpXCJdO1xuXG5jbGFzcyBVdGlsIHtcbiAgLy8gbWFrZUNzc1JnYigpIGNhbiBiZSBjYWxsZWQgdGhvdXNhbmRzIG9mIHRpbWVzLiBVc2luZyDCtHJnYkJ1ZmAgYXZvaWRzXG4gIC8vIGNyZWF0aW5nIG1hbnkgaW50ZXJtZWRpYXRlIHN0cmluZ3MuXG4gIHN0YXRpYyBtYWtlQ3NzUmdiKHIsIGcsIGIpIHtcbiAgICByZ2JCdWZbMV0gPSByO1xuICAgIHJnYkJ1ZlszXSA9IGc7XG4gICAgcmdiQnVmWzVdID0gYjtcbiAgICByZXR1cm4gcmdiQnVmLmpvaW4oXCJcIik7XG4gIH1cblxuICAvLyBDb25jYXRlbmF0ZXMgdHdvIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIHRvZ2V0aGVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gIHN0YXRpYyB0cmFuc2Zvcm0obTEsIG0yKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG0xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLFxuICAgICAgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sXG4gICAgICBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSxcbiAgICAgIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLFxuICAgICAgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSxcbiAgICAgIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIEZvciAyZCBhZmZpbmUgdHJhbnNmb3Jtc1xuICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0ocCwgbSkge1xuICAgIGNvbnN0IHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07XG4gICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cblxuICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHAsIG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICBjb25zdCB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkO1xuICAgIGNvbnN0IHl0ID0gKC1wWzBdICogbVsxXSArIHBbMV0gKiBtWzBdICsgbVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHRyYW5zZm9ybSB0byB0aGUgcmVjdGFuZ2xlIGFuZCBmaW5kcyB0aGUgbWluaW11bSBheGlhbGx5XG4gIC8vIGFsaWduZWQgYm91bmRpbmcgYm94LlxuICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkge1xuICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLCBtKTtcbiAgICBjb25zdCBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7XG4gICAgY29uc3QgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7XG4gICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7XG4gICAgcmV0dXJuIFtcbiAgICAgIE1hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSxcbiAgICAgIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSxcbiAgICAgIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSxcbiAgICAgIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSxcbiAgICBdO1xuICB9XG5cbiAgc3RhdGljIGludmVyc2VUcmFuc2Zvcm0obSkge1xuICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuICAgIHJldHVybiBbXG4gICAgICBtWzNdIC8gZCxcbiAgICAgIC1tWzFdIC8gZCxcbiAgICAgIC1tWzJdIC8gZCxcbiAgICAgIG1bMF0gLyBkLFxuICAgICAgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCxcbiAgICAgIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQsXG4gICAgXTtcbiAgfVxuXG4gIC8vIEFwcGx5IGEgZ2VuZXJpYyAzZCBtYXRyaXggTSBvbiBhIDMtdmVjdG9yIHY6XG4gIC8vICAgfCBhIGIgYyB8ICAgfCBYIHxcbiAgLy8gICB8IGQgZSBmIHwgeCB8IFkgfFxuICAvLyAgIHwgZyBoIGkgfCAgIHwgWiB8XG4gIC8vIE0gaXMgYXNzdW1lZCB0byBiZSBzZXJpYWxpemVkIGFzIFthLGIsYyxkLGUsZixnLGgsaV0sXG4gIC8vIHdpdGggdiBhcyBbWCxZLFpdXG4gIHN0YXRpYyBhcHBseTNkVHJhbnNmb3JtKG0sIHYpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbVswXSAqIHZbMF0gKyBtWzFdICogdlsxXSArIG1bMl0gKiB2WzJdLFxuICAgICAgbVszXSAqIHZbMF0gKyBtWzRdICogdlsxXSArIG1bNV0gKiB2WzJdLFxuICAgICAgbVs2XSAqIHZbMF0gKyBtWzddICogdlsxXSArIG1bOF0gKiB2WzJdLFxuICAgIF07XG4gIH1cblxuICAvLyBUaGlzIGNhbGN1bGF0aW9uIHVzZXMgU2luZ3VsYXIgVmFsdWUgRGVjb21wb3NpdGlvbi5cbiAgLy8gVGhlIFNWRCBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aCBmb3JtdWxhIEEgPSBVU1YuIFdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZVxuICAvLyBtYXRyaXggUyBoZXJlIGJlY2F1c2UgaXQgcmVwcmVzZW50cyB0aGUgc2NhbGUgdmFsdWVzLlxuICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkge1xuICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTtcblxuICAgIC8vIE11bHRpcGx5IG1hdHJpeCBtIHdpdGggaXRzIHRyYW5zcG9zZS5cbiAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07XG4gICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdO1xuICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107XG5cbiAgICAvLyBTb2x2ZSB0aGUgc2Vjb25kIGRlZ3JlZSBwb2x5bm9taWFsIHRvIGdldCByb290cy5cbiAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyO1xuICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICogKGEgKyBkKSAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjtcbiAgICBjb25zdCBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7XG4gICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxO1xuXG4gICAgLy8gU2NhbGUgdmFsdWVzIGFyZSB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBlaWdlbnZhbHVlcy5cbiAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHJlY3RhbmdsZSByZWN0PVt4MSwgeTEsIHgyLCB5Ml0gc28gdGhhdCAoeDEseTEpIDwgKHgyLHkyKVxuICAvLyBGb3IgY29vcmRpbmF0ZSBzeXN0ZW1zIHdob3NlIG9yaWdpbiBsaWVzIGluIHRoZSBib3R0b20tbGVmdCwgdGhpc1xuICAvLyBtZWFucyBub3JtYWxpemF0aW9uIHRvIChCTCxUUikgb3JkZXJpbmcuIEZvciBzeXN0ZW1zIHdpdGggb3JpZ2luIGluIHRoZVxuICAvLyB0b3AtbGVmdCwgdGhpcyBtZWFucyAoVEwsQlIpIG9yZGVyaW5nLlxuICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7XG4gICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7IC8vIGNsb25lIHJlY3RcbiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHtcbiAgICAgIHJbMF0gPSByZWN0WzJdO1xuICAgICAgclsyXSA9IHJlY3RbMF07XG4gICAgfVxuICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkge1xuICAgICAgclsxXSA9IHJlY3RbM107XG4gICAgICByWzNdID0gcmVjdFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgcmVjdGFuZ2xlIFt4MSwgeTEsIHgyLCB5Ml0gY29ycmVzcG9uZGluZyB0byB0aGVcbiAgLy8gaW50ZXJzZWN0aW9uIG9mIHJlY3QxIGFuZCByZWN0Mi4gSWYgbm8gaW50ZXJzZWN0aW9uLCByZXR1cm5zICdmYWxzZSdcbiAgLy8gVGhlIHJlY3RhbmdsZSBjb29yZGluYXRlcyBvZiByZWN0MSwgcmVjdDIgc2hvdWxkIGJlIFt4MSwgeTEsIHgyLCB5Ml1cbiAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHtcbiAgICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9XG5cbiAgICAvLyBPcmRlciBwb2ludHMgYWxvbmcgdGhlIGF4ZXNcbiAgICBjb25zdCBvcmRlcmVkWCA9IFtyZWN0MVswXSwgcmVjdDFbMl0sIHJlY3QyWzBdLCByZWN0MlsyXV0uc29ydChjb21wYXJlKTtcbiAgICBjb25zdCBvcmRlcmVkWSA9IFtyZWN0MVsxXSwgcmVjdDFbM10sIHJlY3QyWzFdLCByZWN0MlszXV0uc29ydChjb21wYXJlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHJlY3QxID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QxKTtcbiAgICByZWN0MiA9IFV0aWwubm9ybWFsaXplUmVjdChyZWN0Mik7XG5cbiAgICAvLyBYOiBmaXJzdCBhbmQgc2Vjb25kIHBvaW50cyBiZWxvbmcgdG8gZGlmZmVyZW50IHJlY3RhbmdsZXM/XG4gICAgaWYgKFxuICAgICAgKG9yZGVyZWRYWzBdID09PSByZWN0MVswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDJbMF0pIHx8XG4gICAgICAob3JkZXJlZFhbMF0gPT09IHJlY3QyWzBdICYmIG9yZGVyZWRYWzFdID09PSByZWN0MVswXSlcbiAgICApIHtcbiAgICAgIC8vIEludGVyc2VjdGlvbiBtdXN0IGJlIGJldHdlZW4gc2Vjb25kIGFuZCB0aGlyZCBwb2ludHNcbiAgICAgIHJlc3VsdFswXSA9IG9yZGVyZWRYWzFdO1xuICAgICAgcmVzdWx0WzJdID0gb3JkZXJlZFhbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFk6IGZpcnN0IGFuZCBzZWNvbmQgcG9pbnRzIGJlbG9uZyB0byBkaWZmZXJlbnQgcmVjdGFuZ2xlcz9cbiAgICBpZiAoXG4gICAgICAob3JkZXJlZFlbMF0gPT09IHJlY3QxWzFdICYmIG9yZGVyZWRZWzFdID09PSByZWN0MlsxXSkgfHxcbiAgICAgIChvcmRlcmVkWVswXSA9PT0gcmVjdDJbMV0gJiYgb3JkZXJlZFlbMV0gPT09IHJlY3QxWzFdKVxuICAgICkge1xuICAgICAgLy8gSW50ZXJzZWN0aW9uIG11c3QgYmUgYmV0d2VlbiBzZWNvbmQgYW5kIHRoaXJkIHBvaW50c1xuICAgICAgcmVzdWx0WzFdID0gb3JkZXJlZFlbMV07XG4gICAgICByZXN1bHRbM10gPSBvcmRlcmVkWVsyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAweDJEOCwgMHgyQzcsIDB4MkM2LCAweDJEOSwgMHgyREQsIDB4MkRCLCAweDJEQSwgMHgyREMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LFxuICAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNBLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFFLCAweDIwMUMsXG4gIDB4MjAxRCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQSwgMHgyMTIyLCAweEZCMDEsIDB4RkIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCxcbiAgMHgxNzgsIDB4MTdELCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN0UsIDAsIDB4MjBBQ1xuXTtcblxuZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoc3RyKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgc3RyQnVmID0gW107XG4gIGlmIChzdHJbMF0gPT09IFwiXFx4RkVcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkZcIikge1xuICAgIC8vIFVURjE2QkUgQk9NXG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikge1xuICAgICAgc3RyQnVmLnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoKHN0ci5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEZGXCIgJiYgc3RyWzFdID09PSBcIlxceEZFXCIpIHtcbiAgICAvLyBVVEYxNkxFIEJPTVxuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHN0ckJ1Zi5wdXNoKFxuICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKChzdHIuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgfCBzdHIuY2hhckNvZGVBdChpKSlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChpKV07XG4gICAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgLy8gcmVwbGFjZSBcIihcIiwgXCIpXCIgYW5kIFwiXFxcIiBieSBcIlxcKFwiLCBcIlxcKVwiIGFuZCBcIlxcXFxcIlxuICAvLyBpbiBvcmRlciB0byB3cml0ZSBpdCBpbiBhIFBERiBmaWxlLlxuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXFwoXFwpXFxcXF0pL2csIFwiXFxcXCQxXCIpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xufVxuXG5mdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7XG4gIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbCh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJib29sZWFuXCI7XG59XG5cbmZ1bmN0aW9uIGlzTnVtKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm51bWJlclwiO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmIHYuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikge1xuICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBhcnIxLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgIHJldHVybiBlbGVtZW50ID09PSBhcnIyW2luZGV4XTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoZGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkpKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IFtcbiAgICBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSxcbiAgICAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgKGRhdGUuZ2V0VVRDRGF0ZSgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLFxuICBdO1xuXG4gIHJldHVybiBidWZmZXIuam9pbihcIlwiKTtcbn1cblxuLyoqXG4gKiBQcm9taXNlIENhcGFiaWxpdHkgb2JqZWN0LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb21pc2VDYXBhYmlsaXR5XG4gKiBAcHJvcGVydHkge1Byb21pc2U8YW55Pn0gcHJvbWlzZSAtIEEgUHJvbWlzZSBvYmplY3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNldHRsZWQgLSBJZiB0aGUgUHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQvcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZXNvbHZlIC0gRnVsZmlsbHMgdGhlIFByb21pc2UuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByZWplY3QgLSBSZWplY3RzIHRoZSBQcm9taXNlLlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb21pc2UgY2FwYWJpbGl0eSBvYmplY3QuXG4gKiBAYWxpYXMgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZUNhcGFiaWxpdHl9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCkge1xuICBjb25zdCBjYXBhYmlsaXR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IGlzU2V0dGxlZCA9IGZhbHNlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYXBhYmlsaXR5LCBcInNldHRsZWRcIiwge1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBpc1NldHRsZWQ7XG4gICAgfSxcbiAgfSk7XG4gIGNhcGFiaWxpdHkucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBjYXBhYmlsaXR5LnJlc29sdmUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaXNTZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgfTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlzU2V0dGxlZCA9IHRydWU7XG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGNhcGFiaWxpdHk7XG59XG5cbmNvbnN0IGNyZWF0ZU9iamVjdFVSTCA9IChmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkxDbG9zdXJlKCkge1xuICAvLyBCbG9iL2NyZWF0ZU9iamVjdFVSTCBpcyBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gZGF0YSBzY2hlbWEuXG4gIGNvbnN0IGRpZ2l0cyA9XG4gICAgXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChkYXRhLCBjb250ZW50VHlwZSwgZm9yY2VEYXRhU2NoZW1hID0gZmFsc2UpIHtcbiAgICBpZiAoIWZvcmNlRGF0YVNjaGVtYSAmJiBVUkwuY3JlYXRlT2JqZWN0VVJMKSB7XG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2RhdGFdLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlciA9IGBkYXRhOiR7Y29udGVudFR5cGV9O2Jhc2U2NCxgO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMykge1xuICAgICAgY29uc3QgYjEgPSBkYXRhW2ldICYgMHhmZjtcbiAgICAgIGNvbnN0IGIyID0gZGF0YVtpICsgMV0gJiAweGZmO1xuICAgICAgY29uc3QgYjMgPSBkYXRhW2kgKyAyXSAmIDB4ZmY7XG4gICAgICBjb25zdCBkMSA9IGIxID4+IDIsXG4gICAgICAgIGQyID0gKChiMSAmIDMpIDw8IDQpIHwgKGIyID4+IDQpO1xuICAgICAgY29uc3QgZDMgPSBpICsgMSA8IGlpID8gKChiMiAmIDB4ZikgPDwgMikgfCAoYjMgPj4gNikgOiA2NDtcbiAgICAgIGNvbnN0IGQ0ID0gaSArIDIgPCBpaSA/IGIzICYgMHgzZiA6IDY0O1xuICAgICAgYnVmZmVyICs9IGRpZ2l0c1tkMV0gKyBkaWdpdHNbZDJdICsgZGlnaXRzW2QzXSArIGRpZ2l0c1tkNF07XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG4gIH07XG59KSgpO1xuXG5leHBvcnQge1xuICBCYXNlRXhjZXB0aW9uLFxuICBGT05UX0lERU5USVRZX01BVFJJWCxcbiAgSURFTlRJVFlfTUFUUklYLFxuICBPUFMsXG4gIFZlcmJvc2l0eUxldmVsLFxuICBVTlNVUFBPUlRFRF9GRUFUVVJFUyxcbiAgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSxcbiAgQW5ub3RhdGlvbkZpZWxkRmxhZyxcbiAgQW5ub3RhdGlvbkZsYWcsXG4gIEFubm90YXRpb25NYXJrZWRTdGF0ZSxcbiAgQW5ub3RhdGlvblJlcGx5VHlwZSxcbiAgQW5ub3RhdGlvblJldmlld1N0YXRlLFxuICBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUsXG4gIEFubm90YXRpb25UeXBlLFxuICBGb250VHlwZSxcbiAgSW1hZ2VLaW5kLFxuICBDTWFwQ29tcHJlc3Npb25UeXBlLFxuICBBYm9ydEV4Y2VwdGlvbixcbiAgSW52YWxpZFBERkV4Y2VwdGlvbixcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbixcbiAgUGFzc3dvcmRFeGNlcHRpb24sXG4gIFBhc3N3b3JkUmVzcG9uc2VzLFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgU3RyZWFtVHlwZSxcbiAgVGV4dFJlbmRlcmluZ01vZGUsXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbixcbiAgVW5rbm93bkVycm9yRXhjZXB0aW9uLFxuICBVdGlsLFxuICBGb3JtYXRFcnJvcixcbiAgYXJyYXlCeXRlTGVuZ3RoLFxuICBhcnJheXNUb0J5dGVzLFxuICBhc3NlcnQsXG4gIGJ5dGVzVG9TdHJpbmcsXG4gIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LFxuICBjcmVhdGVPYmplY3RVUkwsXG4gIGVzY2FwZVN0cmluZyxcbiAgZ2V0TW9kaWZpY2F0aW9uRGF0ZSxcbiAgZ2V0VmVyYm9zaXR5TGV2ZWwsXG4gIGluZm8sXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQXJyYXlFcXVhbCxcbiAgaXNCb29sLFxuICBpc051bSxcbiAgaXNTdHJpbmcsXG4gIGlzU2FtZU9yaWdpbixcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCxcbiAgSXNMaXR0bGVFbmRpYW5DYWNoZWQsXG4gIElzRXZhbFN1cHBvcnRlZENhY2hlZCxcbiAgcmVtb3ZlTnVsbENoYXJhY3RlcnMsXG4gIHNldFZlcmJvc2l0eUxldmVsLFxuICBzaGFkb3csXG4gIHN0cmluZzMyLFxuICBzdHJpbmdUb0J5dGVzLFxuICBzdHJpbmdUb1BERlN0cmluZyxcbiAgc3RyaW5nVG9VVEY4U3RyaW5nLFxuICB1dGY4U3RyaW5nVG9TdHJpbmcsXG4gIHdhcm4sXG4gIHVucmVhY2hhYmxlLFxufTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgaXNOb2RlSlMgfSBmcm9tIFwiLi9pc19ub2RlLmpzXCI7XG5cbi8vIFNraXAgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIG1vZGVybiBidWlsZHMgYW5kIGlmIHdlIGFscmVhZHkgcmFuIHRoZSBtb2R1bGUuXG5pZiAoXG4gICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJTS0lQX0JBQkVMXCIpKSAmJlxuICAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwidW5kZWZpbmVkXCIgfHwgIWdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQpXG4pIHtcbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgZ2xvYmFsVGhpcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEvRWRnZSwgT3BlcmFcbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcInVuZGVmaW5lZFwiIHx8IGdsb2JhbFRoaXMuTWF0aCAhPT0gTWF0aCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduXG4gICAgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL2dsb2JhbC10aGlzXCIpO1xuICB9XG4gIGdsb2JhbFRoaXMuX3BkZmpzQ29tcGF0aWJpbGl0eUNoZWNrZWQgPSB0cnVlO1xuXG4gIGNvbnN0IGhhc0RPTSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRvY3VtZW50ID09PSBcIm9iamVjdFwiO1xuICBjb25zdCB1c2VyQWdlbnQgPVxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IFwiXCI7XG4gIGNvbnN0IGlzSUUgPSAvVHJpZGVudC8udGVzdCh1c2VyQWdlbnQpO1xuXG4gIC8vIFN1cHBvcnQ6IE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrTm9kZUJ0b2EoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuYnRvYSB8fCAhaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5idG9hID0gZnVuY3Rpb24gKGNoYXJzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShjaGFycywgXCJiaW5hcnlcIikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBOb2RlLmpzXG4gIChmdW5jdGlvbiBjaGVja05vZGVBdG9iKCkge1xuICAgIGlmIChnbG9iYWxUaGlzLmF0b2IgfHwgIWlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuYXRvYiA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oaW5wdXQsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgQ2hpbGROb2RlLnJlbW92ZSBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLlxuICAoZnVuY3Rpb24gY2hlY2tDaGlsZE5vZGVSZW1vdmUoKSB7XG4gICAgaWYgKCFoYXNET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbW96aWxsYS9hdm9pZC1yZW1vdmVDaGlsZFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBET01Ub2tlbkxpc3QucHJvdG90eXBlLnthZGQsIHJlbW92ZX0sIHdpdGggbW9yZSB0aGFuXG4gIC8vIG9uZSBwYXJhbWV0ZXIsIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrRE9NVG9rZW5MaXN0QWRkUmVtb3ZlKCkge1xuICAgIGlmICghaGFzRE9NIHx8IGlzTm9kZUpTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJ0ZXN0T25lXCIsIFwidGVzdFR3b1wiKTtcblxuICAgIGlmIChcbiAgICAgIGRpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJ0ZXN0T25lXCIpID09PSB0cnVlICYmXG4gICAgICBkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKFwidGVzdFR3b1wiKSA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBPcmlnaW5hbERPTVRva2VuTGlzdEFkZCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO1xuICAgIGNvbnN0IE9yaWdpbmFsRE9NVG9rZW5MaXN0UmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XG5cbiAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICguLi50b2tlbnMpIHtcbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIE9yaWdpbmFsRE9NVG9rZW5MaXN0QWRkLmNhbGwodGhpcywgdG9rZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoLi4udG9rZW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBPcmlnaW5hbERPTVRva2VuTGlzdFJlbW92ZS5jYWxsKHRoaXMsIHRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlLCB3aXRoIHRoZSBvcHRpb25hbFxuICAvLyBcImZvcmNlXCIgcGFyYW1ldGVyLCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja0RPTVRva2VuTGlzdFRvZ2dsZSgpIHtcbiAgICBpZiAoIWhhc0RPTSB8fCBpc05vZGVKUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGlmIChkaXYuY2xhc3NMaXN0LnRvZ2dsZShcInRlc3RcIiwgMCkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGZvcmNlID1cbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAhIWFyZ3VtZW50c1sxXSA6ICF0aGlzLmNvbnRhaW5zKHRva2VuKTtcbiAgICAgIHJldHVybiB0aGlzW2ZvcmNlID8gXCJhZGRcIiA6IFwicmVtb3ZlXCJdKHRva2VuKSwgZm9yY2U7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciB3aW5kb3cuaGlzdG9yeS57cHVzaFN0YXRlLCByZXBsYWNlU3RhdGV9LCB3aXRoIHRoZVxuICAvLyBgdXJsYCBwYXJhbWV0ZXIgc2V0IHRvIGB1bmRlZmluZWRgLCB3aXRob3V0IGJyZWFraW5nIHRoZSBkb2N1bWVudCBVUkwuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1dpbmRvd0hpc3RvcnlQdXNoU3RhdGVSZXBsYWNlU3RhdGUoKSB7XG4gICAgaWYgKCFoYXNET00gfHwgIWlzSUUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgT3JpZ2luYWxQdXNoU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7XG4gICAgY29uc3QgT3JpZ2luYWxSZXBsYWNlU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG5cbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSB1cmwgPT09IHVuZGVmaW5lZCA/IFtzdGF0ZSwgdGl0bGVdIDogW3N0YXRlLCB0aXRsZSwgdXJsXTtcbiAgICAgIE9yaWdpbmFsUHVzaFN0YXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7XG4gICAgICBjb25zdCBhcmdzID0gdXJsID09PSB1bmRlZmluZWQgPyBbc3RhdGUsIHRpdGxlXSA6IFtzdGF0ZSwgdGl0bGUsIHVybF07XG4gICAgICBPcmlnaW5hbFJlcGxhY2VTdGF0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NDFcbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nU3RhcnRzV2l0aCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9zdGFydHMtd2l0aC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw0MVxuICAoZnVuY3Rpb24gY2hlY2tTdHJpbmdFbmRzV2l0aCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvZW5kcy13aXRoLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQxXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0luY2x1ZGVzKCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9pbmNsdWRlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDQ3XG4gIChmdW5jdGlvbiBjaGVja0FycmF5SW5jbHVkZXMoKSB7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9hcnJheS9pbmNsdWRlcy5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBBcnJheS5mcm9tIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrQXJyYXlGcm9tKCkge1xuICAgIGlmIChBcnJheS5mcm9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL2FycmF5L2Zyb20uanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LmFzc2lnbiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja09iamVjdEFzc2lnbigpIHtcbiAgICBpZiAoT2JqZWN0LmFzc2lnbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5mcm9tRW50cmllcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NzNcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0RnJvbUVudHJpZXMoKSB7XG4gICAgaWYgKE9iamVjdC5mcm9tRW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvZnJvbS1lbnRyaWVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE1hdGgubG9nMiBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8MzhcbiAgKGZ1bmN0aW9uIGNoZWNrTWF0aExvZzIoKSB7XG4gICAgaWYgKE1hdGgubG9nMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBNYXRoLmxvZzIgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9tYXRoL2xvZzIuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgTnVtYmVyLmlzTmFOIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUuXG4gIChmdW5jdGlvbiBjaGVja051bWJlcklzTmFOKCkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTnVtYmVyLmlzTmFOID0gcmVxdWlyZShcImNvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBQcm92aWRlcyBzdXBwb3J0IGZvciBOdW1iZXIuaXNJbnRlZ2VyIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTwzNFxuICAoZnVuY3Rpb24gY2hlY2tOdW1iZXJJc0ludGVnZXIoKSB7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTnVtYmVyLmlzSW50ZWdlciA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFR5cGVkQXJyYXkucHJvdG90eXBlLnNsaWNlIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUVcbiAgKGZ1bmN0aW9uIGNoZWNrVHlwZWRBcnJheVNsaWNlKCkge1xuICAgIGlmIChVaW50OEFycmF5LnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1aXJlKFwiY29yZS1qcy9lcy90eXBlZC1hcnJheS9zbGljZVwiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRSwgU2FmYXJpPDExLCBDaHJvbWU8NjNcbiAgKGZ1bmN0aW9uIGNoZWNrUHJvbWlzZSgpIHtcbiAgICBpZiAodHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmIFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgYXJlIHN5bmNocm9ub3VzLCBoZW5jZSBgUHJvbWlzZWAgc2hvdWxkbid0XG4gICAgICAvLyBuZWVkIHRvIGJlIHBvbHlmaWxsZWQgZm9yIHRoZSBJTUFHRV9ERUNPREVSUyBidWlsZCB0YXJnZXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChnbG9iYWxUaGlzLlByb21pc2UgJiYgZ2xvYmFsVGhpcy5Qcm9taXNlLmFsbFNldHRsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5Qcm9taXNlID0gcmVxdWlyZShcImNvcmUtanMvZXMvcHJvbWlzZS9pbmRleC5qc1wiKTtcbiAgfSkoKTtcblxuICAvLyBTdXBwb3J0OiBJRVxuICAoZnVuY3Rpb24gY2hlY2tVUkwoKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIlBST0RVQ1RJT05cIikpIHtcbiAgICAgIC8vIFByZXZlbnQgXCJyZXF1aXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIgZXJyb3JzIGluIGRldmVsb3BtZW50IG1vZGUsXG4gICAgICAvLyBzaW5jZSB0aGUgYFVSTGAgY29uc3RydWN0b3Igc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBtb2Rlcm4gYnJvd2Vycy5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCFQREZKU0Rldi50ZXN0KFwiR0VORVJJQ1wiKSkge1xuICAgICAgLy8gVGhlIGBVUkxgIGNvbnN0cnVjdG9yIGlzIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlIGluIHRoZSBleHRlbnNpb25cbiAgICAgIC8vIGJ1aWxkcy5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFBERkpTRGV2LnRlc3QoXCJJTUFHRV9ERUNPREVSU1wiKSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgaW1hZ2UgZGVjb2RlcnMgZG9uJ3QgdXNlIHRoZSBgVVJMYCBjb25zdHJ1Y3Rvciwgc28gaXRcbiAgICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSBwb2x5ZmlsbGVkIGZvciB0aGUgSU1BR0VfREVDT0RFUlMgYnVpbGQgdGFyZ2V0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnbG9iYWxUaGlzLlVSTCA9IHJlcXVpcmUoXCJjb3JlLWpzL3dlYi91cmwuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUUsIE5vZGUuanNcbiAgKGZ1bmN0aW9uIGNoZWNrUmVhZGFibGVTdHJlYW0oKSB7XG4gICAgaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBQREZKU0Rldi50ZXN0KFwiSU1BR0VfREVDT0RFUlNcIikpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IGltYWdlIGRlY29kZXJzIGFyZSBzeW5jaHJvbm91cywgaGVuY2UgYFJlYWRhYmxlU3RyZWFtYFxuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gYmUgcG9seWZpbGxlZCBmb3IgdGhlIElNQUdFX0RFQ09ERVJTIGJ1aWxkIHRhcmdldC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIC8vIE1TIEVkZ2UgbWF5IHNheSBpdCBoYXMgUmVhZGFibGVTdHJlYW0gYnV0IHRoZXkgYXJlIG5vdCB1cCB0byBzcGVjIHlldC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICAgICAgbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUaGUgUmVhZGFibGVTdHJlYW0gY29uc3RydWN0b3IgY2Fubm90IGJlIHVzZWQuXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKFwid2ViLXN0cmVhbXMtcG9seWZpbGwvZGlzdC9wb255ZmlsbC5qc1wiKS5SZWFkYWJsZVN0cmVhbTtcbiAgfSkoKTtcblxuICAvLyBXZSB3YW50IHRvIHN1cHBvcnQgTWFwIGl0ZXJhdGlvbiwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSBwb3NzaWJsZSB0byBlYXNpbHlcbiAgLy8gdGVzdCBmb3IgdGhhdCBzcGVjaWZpY2FsbHk7IGhlbmNlIHVzaW5nIGEgc2ltaWxhcmx5IHVuc3VwcG9ydGVkIHByb3BlcnR5LlxuICAvLyBTdXBwb3J0OiBJRTExXG4gIChmdW5jdGlvbiBjaGVja01hcEVudHJpZXMoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuTWFwICYmIGdsb2JhbFRoaXMuTWFwLnByb3RvdHlwZS5lbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuTWFwID0gcmVxdWlyZShcImNvcmUtanMvZXMvbWFwL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFdlIHdhbnQgdG8gc3VwcG9ydCBTZXQgaXRlcmF0aW9uLCBidXQgaXQgZG9lc24ndCBzZWVtIHBvc3NpYmxlIHRvIGVhc2lseVxuICAvLyB0ZXN0IGZvciB0aGF0IHNwZWNpZmljYWxseTsgaGVuY2UgdXNpbmcgYSBzaW1pbGFybHkgdW5zdXBwb3J0ZWQgcHJvcGVydHkuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrU2V0RW50cmllcygpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5TZXQgJiYgZ2xvYmFsVGhpcy5TZXQucHJvdG90eXBlLmVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ2xvYmFsVGhpcy5TZXQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9zZXQvaW5kZXguanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gU3VwcG9ydDogSUU8MTEsIFNhZmFyaTw4LCBDaHJvbWU8MzZcbiAgKGZ1bmN0aW9uIGNoZWNrV2Vha01hcCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuV2Vha01hcCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3dlYWstbWFwL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFMTFcbiAgKGZ1bmN0aW9uIGNoZWNrV2Vha1NldCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrU2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdsb2JhbFRoaXMuV2Vha1NldCA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL3dlYWstc2V0L2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5jb2RlUG9pbnRBdCBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFMTEuXG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ0NvZGVQb2ludEF0KCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9jb2RlLXBvaW50LWF0LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5mcm9tQ29kZVBvaW50IGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUxMS5cbiAgKGZ1bmN0aW9uIGNoZWNrU3RyaW5nRnJvbUNvZGVQb2ludCgpIHtcbiAgICBpZiAoU3RyaW5nLmZyb21Db2RlUG9pbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgU3RyaW5nLmZyb21Db2RlUG9pbnQgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9zdHJpbmcvZnJvbS1jb2RlLXBvaW50LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFN1cHBvcnQ6IElFXG4gIChmdW5jdGlvbiBjaGVja1N5bWJvbCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5TeW1ib2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3ltYm9sL2luZGV4LmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU3XG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1BhZFN0YXJ0KCkge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcXVpcmUoXCJjb3JlLWpzL2VzL3N0cmluZy9wYWQtc3RhcnQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQgaW4gbGVnYWN5IGJyb3dzZXJzLlxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lPDU3XG4gIChmdW5jdGlvbiBjaGVja1N0cmluZ1BhZEVuZCgpIHtcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxdWlyZShcImNvcmUtanMvZXMvc3RyaW5nL3BhZC1lbmQuanNcIik7XG4gIH0pKCk7XG5cbiAgLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgT2JqZWN0LnZhbHVlcyBpbiBsZWdhY3kgYnJvd3NlcnMuXG4gIC8vIFN1cHBvcnQ6IElFLCBDaHJvbWU8NTRcbiAgKGZ1bmN0aW9uIGNoZWNrT2JqZWN0VmFsdWVzKCkge1xuICAgIGlmIChPYmplY3QudmFsdWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXMgPSByZXF1aXJlKFwiY29yZS1qcy9lcy9vYmplY3QvdmFsdWVzLmpzXCIpO1xuICB9KSgpO1xuXG4gIC8vIFByb3ZpZGVzIHN1cHBvcnQgZm9yIE9iamVjdC5lbnRyaWVzIGluIGxlZ2FjeSBicm93c2Vycy5cbiAgLy8gU3VwcG9ydDogSUUsIENocm9tZTw1NFxuICAoZnVuY3Rpb24gY2hlY2tPYmplY3RFbnRyaWVzKCkge1xuICAgIGlmIChPYmplY3QuZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyA9IHJlcXVpcmUoXCJjb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzXCIpO1xuICB9KSgpO1xufVxuIiwiLyogQ29weXJpZ2h0IDIwMTggTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWxzIHByb2Nlc3MgKi9cblxuLy8gTlcuanMgLyBFbGVjdHJvbiBpcyBhIGJyb3dzZXIgY29udGV4dCwgYnV0IGNvcGllcyBzb21lIE5vZGUuanMgb2JqZWN0czsgc2VlXG4vLyBodHRwOi8vZG9jcy5ud2pzLmlvL2VuL2xhdGVzdC9Gb3IlMjBVc2Vycy9BZHZhbmNlZC9KYXZhU2NyaXB0JTIwQ29udGV4dHMlMjBpbiUyME5XLmpzLyNhY2Nlc3Mtbm9kZWpzLWFuZC1ud2pzLWFwaS1pbi1icm93c2VyLWNvbnRleHRcbi8vIGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvYXBpL3Byb2Nlc3MjcHJvY2Vzc3ZlcnNpb25zZWxlY3Ryb24tcmVhZG9ubHlcbi8vIGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvYXBpL3Byb2Nlc3MjcHJvY2Vzc3R5cGUtcmVhZG9ubHlcbmNvbnN0IGlzTm9kZUpTID1cbiAgdHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiZcbiAgcHJvY2VzcyArIFwiXCIgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiICYmXG4gICFwcm9jZXNzLnZlcnNpb25zLm53ICYmXG4gICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSBcImJyb3dzZXJcIik7XG5cbmV4cG9ydCB7IGlzTm9kZUpTIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiwgc2hhZG93IH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5pbXBvcnQgeyBsb2cyLCByZWFkSW50OCwgcmVhZFVpbnQxNiwgcmVhZFVpbnQzMiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IEFyaXRobWV0aWNEZWNvZGVyIH0gZnJvbSBcIi4vYXJpdGhtZXRpY19kZWNvZGVyLmpzXCI7XG5pbXBvcnQgeyBDQ0lUVEZheERlY29kZXIgfSBmcm9tIFwiLi9jY2l0dC5qc1wiO1xuXG5jbGFzcyBKYmlnMkVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKGBKQklHMiBlcnJvcjogJHttc2d9YCk7XG4gIH1cbn1cblxudmFyIEpiaWcySW1hZ2UgPSAoZnVuY3Rpb24gSmJpZzJJbWFnZUNsb3N1cmUoKSB7XG4gIC8vIFV0aWxpdHkgZGF0YSBzdHJ1Y3R1cmVzXG4gIGZ1bmN0aW9uIENvbnRleHRDYWNoZSgpIHt9XG5cbiAgQ29udGV4dENhY2hlLnByb3RvdHlwZSA9IHtcbiAgICBnZXRDb250ZXh0cyhpZCkge1xuICAgICAgaWYgKGlkIGluIHRoaXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaWRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuICh0aGlzW2lkXSA9IG5ldyBJbnQ4QXJyYXkoMSA8PCAxNikpO1xuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIERlY29kaW5nQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgZ2V0IGRlY29kZXIoKSB7XG4gICAgICB2YXIgZGVjb2RlciA9IG5ldyBBcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMuZW5kKTtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJkZWNvZGVyXCIsIGRlY29kZXIpO1xuICAgIH0sXG4gICAgZ2V0IGNvbnRleHRDYWNoZSgpIHtcbiAgICAgIHZhciBjYWNoZSA9IG5ldyBDb250ZXh0Q2FjaGUoKTtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJjb250ZXh0Q2FjaGVcIiwgY2FjaGUpO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gQW5uZXggQS4gQXJpdGhtZXRpYyBJbnRlZ2VyIERlY29kaW5nIFByb2NlZHVyZVxuICAvLyBBLjIgUHJvY2VkdXJlIGZvciBkZWNvZGluZyB2YWx1ZXNcbiAgZnVuY3Rpb24gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIHByb2NlZHVyZSwgZGVjb2Rlcikge1xuICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpO1xuICAgIHZhciBwcmV2ID0gMTtcblxuICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGxlbmd0aCkge1xuICAgICAgdmFyIHYgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTtcbiAgICAgICAgcHJldiA9XG4gICAgICAgICAgcHJldiA8IDI1NiA/IChwcmV2IDw8IDEpIHwgYml0IDogKCgocHJldiA8PCAxKSB8IGJpdCkgJiA1MTEpIHwgMjU2O1xuICAgICAgICB2ID0gKHYgPDwgMSkgfCBiaXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdiA+Pj4gMDtcbiAgICB9XG5cbiAgICB2YXIgc2lnbiA9IHJlYWRCaXRzKDEpO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4gICAgdmFyIHZhbHVlID0gcmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgICAocmVhZEJpdHMoMSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDEpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWRCaXRzKDMyKSArIDQ0MzYpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRCaXRzKDEyKSArIDM0MCkgOlxuICAgICAgICAgICAgICAgICAgICAgIHJlYWRCaXRzKDgpICsgODQpIDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZEJpdHMoNikgKyAyMCkgOlxuICAgICAgICAgICAgICAgICAgcmVhZEJpdHMoNCkgKyA0KSA6XG4gICAgICAgICAgICAgICAgcmVhZEJpdHMoMik7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuICAgIGlmIChzaWduID09PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgIHJldHVybiAtdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQS4zIFRoZSBJQUlEIGRlY29kaW5nIHByb2NlZHVyZVxuICBmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkge1xuICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhcIklBSURcIik7XG5cbiAgICB2YXIgcHJldiA9IDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpO1xuICAgICAgcHJldiA9IChwcmV2IDw8IDEpIHwgYml0O1xuICAgIH1cbiAgICBpZiAoY29kZUxlbmd0aCA8IDMxKSB7XG4gICAgICByZXR1cm4gcHJldiAmICgoMSA8PCBjb2RlTGVuZ3RoKSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gcHJldiAmIDB4N2ZmZmZmZmY7XG4gIH1cblxuICAvLyA3LjMgU2VnbWVudCB0eXBlc1xuICB2YXIgU2VnbWVudFR5cGVzID0gW1xuICAgIFwiU3ltYm9sRGljdGlvbmFyeVwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIFwiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgXCJJbW1lZGlhdGVUZXh0UmVnaW9uXCIsXG4gICAgXCJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb25cIixcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgXCJQYXR0ZXJuRGljdGlvbmFyeVwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIFwiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb25cIixcbiAgICBudWxsLFxuICAgIFwiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb25cIixcbiAgICBcIkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb25cIixcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBcIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb25cIixcbiAgICBudWxsLFxuICAgIFwiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvblwiLFxuICAgIFwiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uXCIsXG4gICAgXCJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgXCJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIFwiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvblwiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgXCJQYWdlSW5mb3JtYXRpb25cIixcbiAgICBcIkVuZE9mUGFnZVwiLFxuICAgIFwiRW5kT2ZTdHJpcGVcIixcbiAgICBcIkVuZE9mRmlsZVwiLFxuICAgIFwiUHJvZmlsZXNcIixcbiAgICBcIlRhYmxlc1wiLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBcIkV4dGVuc2lvblwiLFxuICBdO1xuXG4gIHZhciBDb2RpbmdUZW1wbGF0ZXMgPSBbXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAyLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtNCwgeTogMCB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMiwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAyLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMSwgeTogLTIgfSxcbiAgICAgIHsgeDogMCwgeTogLTIgfSxcbiAgICAgIHsgeDogMSwgeTogLTIgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgeyB4OiAtMywgeTogLTEgfSxcbiAgICAgIHsgeDogLTIsIHk6IC0xIH0sXG4gICAgICB7IHg6IC0xLCB5OiAtMSB9LFxuICAgICAgeyB4OiAwLCB5OiAtMSB9LFxuICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgeyB4OiAtNCwgeTogMCB9LFxuICAgICAgeyB4OiAtMywgeTogMCB9LFxuICAgICAgeyB4OiAtMiwgeTogMCB9LFxuICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgIF0sXG4gIF07XG5cbiAgdmFyIFJlZmluZW1lbnRUZW1wbGF0ZXMgPSBbXG4gICAge1xuICAgICAgY29kaW5nOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICBdLFxuICAgICAgcmVmZXJlbmNlOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMCwgeTogMCB9LFxuICAgICAgICB7IHg6IDEsIHk6IDAgfSxcbiAgICAgICAgeyB4OiAtMSwgeTogMSB9LFxuICAgICAgICB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAxIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgY29kaW5nOiBbXG4gICAgICAgIHsgeDogLTEsIHk6IC0xIH0sXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAtMSB9LFxuICAgICAgICB7IHg6IC0xLCB5OiAwIH0sXG4gICAgICBdLFxuICAgICAgcmVmZXJlbmNlOiBbXG4gICAgICAgIHsgeDogMCwgeTogLTEgfSxcbiAgICAgICAgeyB4OiAtMSwgeTogMCB9LFxuICAgICAgICB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgeyB4OiAxLCB5OiAwIH0sXG4gICAgICAgIHsgeDogMCwgeTogMSB9LFxuICAgICAgICB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXTtcblxuICAvLyBTZWUgNi4yLjUuNyBEZWNvZGluZyB0aGUgYml0bWFwLlxuICB2YXIgUmV1c2VkQ29udGV4dHMgPSBbXG4gICAgMHg5YjI1LCAvLyAxMDAxMSAwMTEwMDEwIDAxMDFcbiAgICAweDA3OTUsIC8vIDAwMTEgMTEwMDEwIDEwMVxuICAgIDB4MDBlNSwgLy8gMDAxIDExMDAxIDAxXG4gICAgMHgwMTk1LCAvLyAwMTEwMDEgMDEwMVxuICBdO1xuXG4gIHZhciBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHMgPSBbXG4gICAgMHgwMDIwLCAvLyAnMDAwJyArICcwJyAoY29kaW5nKSArICcwMDAxMDAwMCcgKyAnMCcgKHJlZmVyZW5jZSlcbiAgICAweDAwMDgsIC8vICcwMDAwJyArICcwMDEwMDAnXG4gIF07XG5cbiAgZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkge1xuICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7XG4gICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhcIkdCXCIpO1xuICAgIHZhciBjb250ZXh0TGFiZWwsXG4gICAgICBpLFxuICAgICAgaixcbiAgICAgIHBpeGVsLFxuICAgICAgcm93LFxuICAgICAgcm93MSxcbiAgICAgIHJvdzIsXG4gICAgICBiaXRtYXAgPSBbXTtcblxuICAgIC8vIC4uLm9vb29vLi4uLlxuICAgIC8vIC4ub29vb29vby4uLiBDb250ZXh0IHRlbXBsYXRlIGZvciBjdXJyZW50IHBpeGVsIChYKVxuICAgIC8vIC5vb29vWC4uLi4uLiAoY29uY2F0ZW5hdGUgdmFsdWVzIG9mICdvJy1waXhlbHMgdG8gZ2V0IGNvbnRleHRMYWJlbClcbiAgICB2YXIgT0xEX1BJWEVMX01BU0sgPSAweDdiZjc7IC8vIDAxMTExIDAxMTExMTEgMDExMVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICByb3cgPSBiaXRtYXBbaV0gPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICByb3cxID0gaSA8IDEgPyByb3cgOiBiaXRtYXBbaSAtIDFdO1xuICAgICAgcm93MiA9IGkgPCAyID8gcm93IDogYml0bWFwW2kgLSAyXTtcblxuICAgICAgLy8gQXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdzpcbiAgICAgIC8vIEZpbGwgY29udGV4dExhYmVsIHdpdGggcGl4ZWxzIHRoYXQgYXJlIGFib3ZlL3JpZ2h0IG9mIChYKVxuICAgICAgY29udGV4dExhYmVsID1cbiAgICAgICAgKHJvdzJbMF0gPDwgMTMpIHxcbiAgICAgICAgKHJvdzJbMV0gPDwgMTIpIHxcbiAgICAgICAgKHJvdzJbMl0gPDwgMTEpIHxcbiAgICAgICAgKHJvdzFbMF0gPDwgNykgfFxuICAgICAgICAocm93MVsxXSA8PCA2KSB8XG4gICAgICAgIChyb3cxWzJdIDw8IDUpIHxcbiAgICAgICAgKHJvdzFbM10gPDwgNCk7XG5cbiAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpO1xuXG4gICAgICAgIC8vIEF0IGVhY2ggcGl4ZWw6IENsZWFyIGNvbnRleHRMYWJlbCBwaXhlbHMgdGhhdCBhcmUgc2hpZnRlZFxuICAgICAgICAvLyBvdXQgb2YgdGhlIGNvbnRleHQsIHRoZW4gYWRkIG5ldyBvbmVzLlxuICAgICAgICBjb250ZXh0TGFiZWwgPVxuICAgICAgICAgICgoY29udGV4dExhYmVsICYgT0xEX1BJWEVMX01BU0spIDw8IDEpIHxcbiAgICAgICAgICAoaiArIDMgPCB3aWR0aCA/IHJvdzJbaiArIDNdIDw8IDExIDogMCkgfFxuICAgICAgICAgIChqICsgNCA8IHdpZHRoID8gcm93MVtqICsgNF0gPDwgNCA6IDApIHxcbiAgICAgICAgICBwaXhlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gNi4yIEdlbmVyaWMgUmVnaW9uIERlY29kaW5nIFByb2NlZHVyZVxuICBmdW5jdGlvbiBkZWNvZGVCaXRtYXAoXG4gICAgbW1yLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB0ZW1wbGF0ZUluZGV4LFxuICAgIHByZWRpY3Rpb24sXG4gICAgc2tpcCxcbiAgICBhdCxcbiAgICBkZWNvZGluZ0NvbnRleHRcbiAgKSB7XG4gICAgaWYgKG1tcikge1xuICAgICAgY29uc3QgaW5wdXQgPSBuZXcgUmVhZGVyKFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuZGF0YSxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuZW5kXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFVzZSBvcHRpbWl6ZWQgdmVyc2lvbiBmb3IgdGhlIG1vc3QgY29tbW9uIGNhc2VcbiAgICBpZiAoXG4gICAgICB0ZW1wbGF0ZUluZGV4ID09PSAwICYmXG4gICAgICAhc2tpcCAmJlxuICAgICAgIXByZWRpY3Rpb24gJiZcbiAgICAgIGF0Lmxlbmd0aCA9PT0gNCAmJlxuICAgICAgYXRbMF0ueCA9PT0gMyAmJlxuICAgICAgYXRbMF0ueSA9PT0gLTEgJiZcbiAgICAgIGF0WzFdLnggPT09IC0zICYmXG4gICAgICBhdFsxXS55ID09PSAtMSAmJlxuICAgICAgYXRbMl0ueCA9PT0gMiAmJlxuICAgICAgYXRbMl0ueSA9PT0gLTIgJiZcbiAgICAgIGF0WzNdLnggPT09IC0yICYmXG4gICAgICBhdFszXS55ID09PSAtMlxuICAgICkge1xuICAgICAgcmV0dXJuIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpO1xuICAgIH1cblxuICAgIHZhciB1c2Vza2lwID0gISFza2lwO1xuICAgIHZhciB0ZW1wbGF0ZSA9IENvZGluZ1RlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5jb25jYXQoYXQpO1xuXG4gICAgLy8gU29ydGluZyBpcyBub24tc3RhbmRhcmQsIGFuZCBpdCBpcyBub3QgcmVxdWlyZWQuIEJ1dCBzb3J0aW5nIGluY3JlYXNlc1xuICAgIC8vIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYml0cyB0aGF0IGNhbiBiZSByZXVzZWQgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyBjb250ZXh0TGFiZWwgaW4gdGhlIG1haW4gbG9vcC5cbiAgICB0ZW1wbGF0ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS55IC0gYi55IHx8IGEueCAtIGIueDtcbiAgICB9KTtcblxuICAgIHZhciB0ZW1wbGF0ZUxlbmd0aCA9IHRlbXBsYXRlLmxlbmd0aDtcbiAgICB2YXIgdGVtcGxhdGVYID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7XG4gICAgdmFyIHRlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkodGVtcGxhdGVMZW5ndGgpO1xuICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcyA9IFtdO1xuICAgIHZhciByZXVzZU1hc2sgPSAwLFxuICAgICAgbWluWCA9IDAsXG4gICAgICBtYXhYID0gMCxcbiAgICAgIG1pblkgPSAwO1xuICAgIHZhciBjLCBrO1xuXG4gICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyspIHtcbiAgICAgIHRlbXBsYXRlWFtrXSA9IHRlbXBsYXRlW2tdLng7XG4gICAgICB0ZW1wbGF0ZVlba10gPSB0ZW1wbGF0ZVtrXS55O1xuICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHRlbXBsYXRlW2tdLngpO1xuICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHRlbXBsYXRlW2tdLngpO1xuICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHRlbXBsYXRlW2tdLnkpO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRlbXBsYXRlIHBpeGVsIGFwcGVhcnMgaW4gdHdvIGNvbnNlY3V0aXZlIGNvbnRleHQgbGFiZWxzLFxuICAgICAgLy8gc28gaXQgY2FuIGJlIHJldXNlZC4gT3RoZXJ3aXNlLCB3ZSBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgY2hhbmdpbmdcbiAgICAgIC8vIHRlbXBsYXRlIGVudHJpZXMuXG4gICAgICBpZiAoXG4gICAgICAgIGsgPCB0ZW1wbGF0ZUxlbmd0aCAtIDEgJiZcbiAgICAgICAgdGVtcGxhdGVba10ueSA9PT0gdGVtcGxhdGVbayArIDFdLnkgJiZcbiAgICAgICAgdGVtcGxhdGVba10ueCA9PT0gdGVtcGxhdGVbayArIDFdLnggLSAxXG4gICAgICApIHtcbiAgICAgICAgcmV1c2VNYXNrIHw9IDEgPDwgKHRlbXBsYXRlTGVuZ3RoIC0gMSAtIGspO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMucHVzaChrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNoYW5naW5nRW50cmllc0xlbmd0aCA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLmxlbmd0aDtcblxuICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTtcbiAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7XG4gICAgdmFyIGNoYW5naW5nVGVtcGxhdGVCaXQgPSBuZXcgVWludDE2QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTtcbiAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbmdpbmdFbnRyaWVzTGVuZ3RoOyBjKyspIHtcbiAgICAgIGsgPSBjaGFuZ2luZ1RlbXBsYXRlRW50cmllc1tjXTtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVYW2NdID0gdGVtcGxhdGVba10ueDtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVZW2NdID0gdGVtcGxhdGVba10ueTtcbiAgICAgIGNoYW5naW5nVGVtcGxhdGVCaXRbY10gPSAxIDw8ICh0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHNhZmUgYm91bmRpbmcgYm94IGVkZ2VzIGZyb20gdGhlIHdpZHRoLCBoZWlnaHQsIG1pblgsIG1heFgsIG1pbllcbiAgICB2YXIgc2JiX2xlZnQgPSAtbWluWDtcbiAgICB2YXIgc2JiX3RvcCA9IC1taW5ZO1xuICAgIHZhciBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7XG5cbiAgICB2YXIgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07XG4gICAgdmFyIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICB2YXIgYml0bWFwID0gW107XG5cbiAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyO1xuICAgIHZhciBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoXCJHQlwiKTtcblxuICAgIHZhciBsdHAgPSAwLFxuICAgICAgaixcbiAgICAgIGkwLFxuICAgICAgajAsXG4gICAgICBjb250ZXh0TGFiZWwgPSAwLFxuICAgICAgYml0LFxuICAgICAgc2hpZnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgICAgaWYgKHByZWRpY3Rpb24pIHtcbiAgICAgICAgdmFyIHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7XG4gICAgICAgIGx0cCBePSBzbHRwO1xuICAgICAgICBpZiAobHRwKSB7XG4gICAgICAgICAgYml0bWFwLnB1c2gocm93KTsgLy8gZHVwbGljYXRlIHByZXZpb3VzIHJvd1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByb3cgPSBuZXcgVWludDhBcnJheShyb3cpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHtcbiAgICAgICAgICByb3dbal0gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFyZSB3ZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2NhbmxpbmUsIHNvIHdlIGNhbiByZXVzZSBjb250ZXh0TGFiZWxcbiAgICAgICAgLy8gYml0cz9cbiAgICAgICAgaWYgKGogPj0gc2JiX2xlZnQgJiYgaiA8IHNiYl9yaWdodCAmJiBpID49IHNiYl90b3ApIHtcbiAgICAgICAgICAvLyBJZiB5ZXMsIHdlIGNhbiBqdXN0IHNoaWZ0IHRoZSBiaXRzIHRoYXQgYXJlIHJldXNhYmxlIGFuZCBvbmx5XG4gICAgICAgICAgLy8gZmV0Y2ggdGhlIHJlbWFpbmluZyBvbmVzLlxuICAgICAgICAgIGNvbnRleHRMYWJlbCA9IChjb250ZXh0TGFiZWwgPDwgMSkgJiByZXVzZU1hc2s7XG4gICAgICAgICAgZm9yIChrID0gMDsgayA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBpMCA9IGkgKyBjaGFuZ2luZ1RlbXBsYXRlWVtrXTtcbiAgICAgICAgICAgIGowID0gaiArIGNoYW5naW5nVGVtcGxhdGVYW2tdO1xuICAgICAgICAgICAgYml0ID0gYml0bWFwW2kwXVtqMF07XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107XG4gICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGNvbnRleHRMYWJlbCBmcm9tIHNjcmF0Y2hcbiAgICAgICAgICBjb250ZXh0TGFiZWwgPSAwO1xuICAgICAgICAgIHNoaWZ0ID0gdGVtcGxhdGVMZW5ndGggLSAxO1xuICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZUxlbmd0aDsgaysrLCBzaGlmdC0tKSB7XG4gICAgICAgICAgICBqMCA9IGogKyB0ZW1wbGF0ZVhba107XG4gICAgICAgICAgICBpZiAoajAgPj0gMCAmJiBqMCA8IHdpZHRoKSB7XG4gICAgICAgICAgICAgIGkwID0gaSArIHRlbXBsYXRlWVtrXTtcbiAgICAgICAgICAgICAgaWYgKGkwID49IDApIHtcbiAgICAgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTtcbiAgICAgICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0TGFiZWwgfD0gYml0IDw8IHNoaWZ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gNi4zLjIgR2VuZXJpYyBSZWZpbmVtZW50IFJlZ2lvbiBEZWNvZGluZyBQcm9jZWR1cmVcbiAgZnVuY3Rpb24gZGVjb2RlUmVmaW5lbWVudChcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgdGVtcGxhdGVJbmRleCxcbiAgICByZWZlcmVuY2VCaXRtYXAsXG4gICAgb2Zmc2V0WCxcbiAgICBvZmZzZXRZLFxuICAgIHByZWRpY3Rpb24sXG4gICAgYXQsXG4gICAgZGVjb2RpbmdDb250ZXh0XG4gICkge1xuICAgIHZhciBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nO1xuICAgIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7XG4gICAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTtcbiAgICB9XG4gICAgdmFyIGNvZGluZ1RlbXBsYXRlTGVuZ3RoID0gY29kaW5nVGVtcGxhdGUubGVuZ3RoO1xuICAgIHZhciBjb2RpbmdUZW1wbGF0ZVggPSBuZXcgSW50MzJBcnJheShjb2RpbmdUZW1wbGF0ZUxlbmd0aCk7XG4gICAgdmFyIGNvZGluZ1RlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTtcbiAgICB2YXIgaztcbiAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykge1xuICAgICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDtcbiAgICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7XG4gICAgfVxuXG4gICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlID0gUmVmaW5lbWVudFRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5yZWZlcmVuY2U7XG4gICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHtcbiAgICAgIHJlZmVyZW5jZVRlbXBsYXRlID0gcmVmZXJlbmNlVGVtcGxhdGUuY29uY2F0KFthdFsxXV0pO1xuICAgIH1cbiAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGggPSByZWZlcmVuY2VUZW1wbGF0ZS5sZW5ndGg7XG4gICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTtcbiAgICB2YXIgcmVmZXJlbmNlVGVtcGxhdGVZID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpO1xuICAgIGZvciAoayA9IDA7IGsgPCByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aDsgaysrKSB7XG4gICAgICByZWZlcmVuY2VUZW1wbGF0ZVhba10gPSByZWZlcmVuY2VUZW1wbGF0ZVtrXS54O1xuICAgICAgcmVmZXJlbmNlVGVtcGxhdGVZW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueTtcbiAgICB9XG4gICAgdmFyIHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDtcbiAgICB2YXIgcmVmZXJlbmNlSGVpZ2h0ID0gcmVmZXJlbmNlQml0bWFwLmxlbmd0aDtcblxuICAgIHZhciBwc2V1ZG9QaXhlbENvbnRleHQgPSBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07XG4gICAgdmFyIGJpdG1hcCA9IFtdO1xuXG4gICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjtcbiAgICB2YXIgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKFwiR1JcIik7XG5cbiAgICB2YXIgbHRwID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICBpZiAocHJlZGljdGlvbikge1xuICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTtcbiAgICAgICAgbHRwIF49IHNsdHA7XG4gICAgICAgIGlmIChsdHApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICAgIGJpdG1hcC5wdXNoKHJvdyk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgdmFyIGkwLCBqMDtcbiAgICAgICAgdmFyIGNvbnRleHRMYWJlbCA9IDA7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBjb2RpbmdUZW1wbGF0ZUxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgaTAgPSBpICsgY29kaW5nVGVtcGxhdGVZW2tdO1xuICAgICAgICAgIGowID0gaiArIGNvZGluZ1RlbXBsYXRlWFtrXTtcbiAgICAgICAgICBpZiAoaTAgPCAwIHx8IGowIDwgMCB8fCBqMCA+PSB3aWR0aCkge1xuICAgICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOyAvLyBvdXQgb2YgYm91bmQgcGl4ZWxcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCA8PCAxKSB8IGJpdG1hcFtpMF1bajBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykge1xuICAgICAgICAgIGkwID0gaSArIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSAtIG9mZnNldFk7XG4gICAgICAgICAgajAgPSBqICsgcmVmZXJlbmNlVGVtcGxhdGVYW2tdIC0gb2Zmc2V0WDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpMCA8IDAgfHxcbiAgICAgICAgICAgIGkwID49IHJlZmVyZW5jZUhlaWdodCB8fFxuICAgICAgICAgICAgajAgPCAwIHx8XG4gICAgICAgICAgICBqMCA+PSByZWZlcmVuY2VXaWR0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOyAvLyBvdXQgb2YgYm91bmQgcGl4ZWxcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dExhYmVsID0gKGNvbnRleHRMYWJlbCA8PCAxKSB8IHJlZmVyZW5jZUJpdG1hcFtpMF1bajBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgIHJvd1tqXSA9IHBpeGVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICAvLyA2LjUuNSBEZWNvZGluZyB0aGUgc3ltYm9sIGRpY3Rpb25hcnlcbiAgZnVuY3Rpb24gZGVjb2RlU3ltYm9sRGljdGlvbmFyeShcbiAgICBodWZmbWFuLFxuICAgIHJlZmluZW1lbnQsXG4gICAgc3ltYm9scyxcbiAgICBudW1iZXJPZk5ld1N5bWJvbHMsXG4gICAgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsXG4gICAgaHVmZm1hblRhYmxlcyxcbiAgICB0ZW1wbGF0ZUluZGV4LFxuICAgIGF0LFxuICAgIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LFxuICAgIHJlZmluZW1lbnRBdCxcbiAgICBkZWNvZGluZ0NvbnRleHQsXG4gICAgaHVmZm1hbklucHV0XG4gICkge1xuICAgIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgdmFyIG5ld1N5bWJvbHMgPSBbXTtcbiAgICB2YXIgY3VycmVudEhlaWdodCA9IDA7XG4gICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSBsb2cyKHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzKTtcblxuICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7XG4gICAgdmFyIGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7XG4gICAgbGV0IHRhYmxlQjEsIHN5bWJvbFdpZHRocztcbiAgICBpZiAoaHVmZm1hbikge1xuICAgICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7IC8vIHN0YW5kYXJkIHRhYmxlIEIuMVxuICAgICAgc3ltYm9sV2lkdGhzID0gW107XG4gICAgICBzeW1ib2xDb2RlTGVuZ3RoID0gTWF0aC5tYXgoc3ltYm9sQ29kZUxlbmd0aCwgMSk7IC8vIDYuNS44LjIuM1xuICAgIH1cblxuICAgIHdoaWxlIChuZXdTeW1ib2xzLmxlbmd0aCA8IG51bWJlck9mTmV3U3ltYm9scykge1xuICAgICAgdmFyIGRlbHRhSGVpZ2h0ID0gaHVmZm1hblxuICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YUhlaWdodC5kZWNvZGUoaHVmZm1hbklucHV0KVxuICAgICAgICA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBREhcIiwgZGVjb2Rlcik7IC8vIDYuNS42XG4gICAgICBjdXJyZW50SGVpZ2h0ICs9IGRlbHRhSGVpZ2h0O1xuICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IDAsXG4gICAgICAgIHRvdGFsV2lkdGggPSAwO1xuICAgICAgY29uc3QgZmlyc3RTeW1ib2wgPSBodWZmbWFuID8gc3ltYm9sV2lkdGhzLmxlbmd0aCA6IDA7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsdGFXaWR0aCA9IGh1ZmZtYW5cbiAgICAgICAgICA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVdpZHRoLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQURXXCIsIGRlY29kZXIpOyAvLyA2LjUuN1xuICAgICAgICBpZiAoZGVsdGFXaWR0aCA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrOyAvLyBPT0JcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDtcbiAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7XG4gICAgICAgIHZhciBiaXRtYXA7XG4gICAgICAgIGlmIChyZWZpbmVtZW50KSB7XG4gICAgICAgICAgLy8gNi41LjguMiBSZWZpbmVtZW50L2FnZ3JlZ2F0ZS1jb2RlZCBzeW1ib2wgYml0bWFwXG4gICAgICAgICAgdmFyIG51bWJlck9mSW5zdGFuY2VzID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFBSVwiLCBkZWNvZGVyKTtcbiAgICAgICAgICBpZiAobnVtYmVyT2ZJbnN0YW5jZXMgPiAxKSB7XG4gICAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKFxuICAgICAgICAgICAgICBodWZmbWFuLFxuICAgICAgICAgICAgICByZWZpbmVtZW50LFxuICAgICAgICAgICAgICBjdXJyZW50V2lkdGgsXG4gICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIG51bWJlck9mSW5zdGFuY2VzLFxuICAgICAgICAgICAgICAxLCAvLyBzdHJpcCBzaXplXG4gICAgICAgICAgICAgIHN5bWJvbHMuY29uY2F0KG5ld1N5bWJvbHMpLFxuICAgICAgICAgICAgICBzeW1ib2xDb2RlTGVuZ3RoLFxuICAgICAgICAgICAgICAwLCAvLyB0cmFuc3Bvc2VkXG4gICAgICAgICAgICAgIDAsIC8vIGRzIG9mZnNldFxuICAgICAgICAgICAgICAxLCAvLyB0b3AgbGVmdCA3LjQuMy4xLjFcbiAgICAgICAgICAgICAgMCwgLy8gT1Igb3BlcmF0b3JcbiAgICAgICAgICAgICAgaHVmZm1hblRhYmxlcyxcbiAgICAgICAgICAgICAgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICAgIHJlZmluZW1lbnRBdCxcbiAgICAgICAgICAgICAgZGVjb2RpbmdDb250ZXh0LFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBodWZmbWFuSW5wdXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2xJZCA9IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciByZHggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWFwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjNcbiAgICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWVwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjRcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPVxuICAgICAgICAgICAgICBzeW1ib2xJZCA8IHN5bWJvbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBzeW1ib2xzW3N5bWJvbElkXVxuICAgICAgICAgICAgICAgIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTtcbiAgICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoXG4gICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCxcbiAgICAgICAgICAgICAgY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgICAgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgICAgcmR4LFxuICAgICAgICAgICAgICByZHksXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICByZWZpbmVtZW50QXQsXG4gICAgICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaHVmZm1hbikge1xuICAgICAgICAgIC8vIFN0b3JlIG9ubHkgc3ltYm9sIHdpZHRoIGFuZCBkZWNvZGUgYSBjb2xsZWN0aXZlIGJpdG1hcCB3aGVuIHRoZVxuICAgICAgICAgIC8vIGhlaWdodCBjbGFzcyBpcyBkb25lLlxuICAgICAgICAgIHN5bWJvbFdpZHRocy5wdXNoKGN1cnJlbnRXaWR0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gNi41LjguMSBEaXJlY3QtY29kZWQgc3ltYm9sIGJpdG1hcFxuICAgICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgY3VycmVudFdpZHRoLFxuICAgICAgICAgICAgY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgIHRlbXBsYXRlSW5kZXgsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBhdCxcbiAgICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChodWZmbWFuICYmICFyZWZpbmVtZW50KSB7XG4gICAgICAgIC8vIDYuNS45IEhlaWdodCBjbGFzcyBjb2xsZWN0aXZlIGJpdG1hcFxuICAgICAgICBjb25zdCBiaXRtYXBTaXplID0gaHVmZm1hblRhYmxlcy50YWJsZUJpdG1hcFNpemUuZGVjb2RlKGh1ZmZtYW5JbnB1dCk7XG4gICAgICAgIGh1ZmZtYW5JbnB1dC5ieXRlQWxpZ24oKTtcbiAgICAgICAgbGV0IGNvbGxlY3RpdmVCaXRtYXA7XG4gICAgICAgIGlmIChiaXRtYXBTaXplID09PSAwKSB7XG4gICAgICAgICAgLy8gVW5jb21wcmVzc2VkIGNvbGxlY3RpdmUgYml0bWFwXG4gICAgICAgICAgY29sbGVjdGl2ZUJpdG1hcCA9IHJlYWRVbmNvbXByZXNzZWRCaXRtYXAoXG4gICAgICAgICAgICBodWZmbWFuSW5wdXQsXG4gICAgICAgICAgICB0b3RhbFdpZHRoLFxuICAgICAgICAgICAgY3VycmVudEhlaWdodFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTU1SIGNvbGxlY3RpdmUgYml0bWFwXG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kO1xuICAgICAgICAgIGNvbnN0IGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7XG4gICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDtcbiAgICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKFxuICAgICAgICAgICAgaHVmZm1hbklucHV0LFxuICAgICAgICAgICAgdG90YWxXaWR0aCxcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IG9yaWdpbmFsRW5kO1xuICAgICAgICAgIGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiA9IGJpdG1hcEVuZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkID0gc3ltYm9sV2lkdGhzLmxlbmd0aDtcbiAgICAgICAgaWYgKGZpcnN0U3ltYm9sID09PSBudW1iZXJPZlN5bWJvbHNEZWNvZGVkIC0gMSkge1xuICAgICAgICAgIC8vIGNvbGxlY3RpdmVCaXRtYXAgaXMgYSBzaW5nbGUgc3ltYm9sLlxuICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChjb2xsZWN0aXZlQml0bWFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEaXZpZGUgY29sbGVjdGl2ZUJpdG1hcCBpbnRvIHN5bWJvbHMuXG4gICAgICAgICAgbGV0IGksXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgeE1pbiA9IDAsXG4gICAgICAgICAgICB4TWF4LFxuICAgICAgICAgICAgYml0bWFwV2lkdGgsXG4gICAgICAgICAgICBzeW1ib2xCaXRtYXA7XG4gICAgICAgICAgZm9yIChpID0gZmlyc3RTeW1ib2w7IGkgPCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkOyBpKyspIHtcbiAgICAgICAgICAgIGJpdG1hcFdpZHRoID0gc3ltYm9sV2lkdGhzW2ldO1xuICAgICAgICAgICAgeE1heCA9IHhNaW4gKyBiaXRtYXBXaWR0aDtcbiAgICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IFtdO1xuICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChzeW1ib2xCaXRtYXApO1xuICAgICAgICAgICAgeE1pbiA9IHhNYXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNi41LjEwIEV4cG9ydGVkIHN5bWJvbHNcbiAgICB2YXIgZXhwb3J0ZWRTeW1ib2xzID0gW107XG4gICAgdmFyIGZsYWdzID0gW10sXG4gICAgICBjdXJyZW50RmxhZyA9IGZhbHNlO1xuICAgIHZhciB0b3RhbFN5bWJvbHNMZW5ndGggPSBzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9scztcbiAgICB3aGlsZSAoZmxhZ3MubGVuZ3RoIDwgdG90YWxTeW1ib2xzTGVuZ3RoKSB7XG4gICAgICB2YXIgcnVuTGVuZ3RoID0gaHVmZm1hblxuICAgICAgICA/IHRhYmxlQjEuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQUVYXCIsIGRlY29kZXIpO1xuICAgICAgd2hpbGUgKHJ1bkxlbmd0aC0tKSB7XG4gICAgICAgIGZsYWdzLnB1c2goY3VycmVudEZsYWcpO1xuICAgICAgfVxuICAgICAgY3VycmVudEZsYWcgPSAhY3VycmVudEZsYWc7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN5bWJvbHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgaWYgKGZsYWdzW2ldKSB7XG4gICAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKHN5bWJvbHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bWJlck9mTmV3U3ltYm9sczsgaSsrLCBqKyspIHtcbiAgICAgIGlmIChmbGFnc1tpXSkge1xuICAgICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChuZXdTeW1ib2xzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cG9ydGVkU3ltYm9scztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZVRleHRSZWdpb24oXG4gICAgaHVmZm1hbixcbiAgICByZWZpbmVtZW50LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkZWZhdWx0UGl4ZWxWYWx1ZSxcbiAgICBudW1iZXJPZlN5bWJvbEluc3RhbmNlcyxcbiAgICBzdHJpcFNpemUsXG4gICAgaW5wdXRTeW1ib2xzLFxuICAgIHN5bWJvbENvZGVMZW5ndGgsXG4gICAgdHJhbnNwb3NlZCxcbiAgICBkc09mZnNldCxcbiAgICByZWZlcmVuY2VDb3JuZXIsXG4gICAgY29tYmluYXRpb25PcGVyYXRvcixcbiAgICBodWZmbWFuVGFibGVzLFxuICAgIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LFxuICAgIHJlZmluZW1lbnRBdCxcbiAgICBkZWNvZGluZ0NvbnRleHQsXG4gICAgbG9nU3RyaXBTaXplLFxuICAgIGh1ZmZtYW5JbnB1dFxuICApIHtcbiAgICBpZiAoaHVmZm1hbiAmJiByZWZpbmVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBiaXRtYXBcbiAgICB2YXIgYml0bWFwID0gW107XG4gICAgdmFyIGksIHJvdztcbiAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgICByb3dbal0gPSBkZWZhdWx0UGl4ZWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyO1xuICAgIHZhciBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlO1xuXG4gICAgdmFyIHN0cmlwVCA9IGh1ZmZtYW5cbiAgICAgID8gLWh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgIDogLWRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBRFRcIiwgZGVjb2Rlcik7IC8vIDYuNC42XG4gICAgdmFyIGZpcnN0UyA9IDA7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykge1xuICAgICAgdmFyIGRlbHRhVCA9IGh1ZmZtYW5cbiAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFULmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFEVFwiLCBkZWNvZGVyKTsgLy8gNi40LjZcbiAgICAgIHN0cmlwVCArPSBkZWx0YVQ7XG5cbiAgICAgIHZhciBkZWx0YUZpcnN0UyA9IGh1ZmZtYW5cbiAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRmlyc3RTLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFGU1wiLCBkZWNvZGVyKTsgLy8gNi40LjdcbiAgICAgIGZpcnN0UyArPSBkZWx0YUZpcnN0UztcbiAgICAgIHZhciBjdXJyZW50UyA9IGZpcnN0UztcbiAgICAgIGRvIHtcbiAgICAgICAgbGV0IGN1cnJlbnRUID0gMDsgLy8gNi40LjlcbiAgICAgICAgaWYgKHN0cmlwU2l6ZSA+IDEpIHtcbiAgICAgICAgICBjdXJyZW50VCA9IGh1ZmZtYW5cbiAgICAgICAgICAgID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSlcbiAgICAgICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFJVFwiLCBkZWNvZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdCA9IHN0cmlwU2l6ZSAqIHN0cmlwVCArIGN1cnJlbnRUO1xuICAgICAgICB2YXIgc3ltYm9sSWQgPSBodWZmbWFuXG4gICAgICAgICAgPyBodWZmbWFuVGFibGVzLnN5bWJvbElEVGFibGUuZGVjb2RlKGh1ZmZtYW5JbnB1dClcbiAgICAgICAgICA6IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTtcbiAgICAgICAgdmFyIGFwcGx5UmVmaW5lbWVudCA9XG4gICAgICAgICAgcmVmaW5lbWVudCAmJlxuICAgICAgICAgIChodWZmbWFuXG4gICAgICAgICAgICA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0KClcbiAgICAgICAgICAgIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFSSVwiLCBkZWNvZGVyKSk7XG4gICAgICAgIHZhciBzeW1ib2xCaXRtYXAgPSBpbnB1dFN5bWJvbHNbc3ltYm9sSWRdO1xuICAgICAgICB2YXIgc3ltYm9sV2lkdGggPSBzeW1ib2xCaXRtYXBbMF0ubGVuZ3RoO1xuICAgICAgICB2YXIgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sQml0bWFwLmxlbmd0aDtcbiAgICAgICAgaWYgKGFwcGx5UmVmaW5lbWVudCkge1xuICAgICAgICAgIHZhciByZHcgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEV1wiLCBkZWNvZGVyKTsgLy8gNi40LjExLjFcbiAgICAgICAgICB2YXIgcmRoID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIFwiSUFSREhcIiwgZGVjb2Rlcik7IC8vIDYuNC4xMS4yXG4gICAgICAgICAgdmFyIHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBcIklBUkRYXCIsIGRlY29kZXIpOyAvLyA2LjQuMTEuM1xuICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQVJEWVwiLCBkZWNvZGVyKTsgLy8gNi40LjExLjRcbiAgICAgICAgICBzeW1ib2xXaWR0aCArPSByZHc7XG4gICAgICAgICAgc3ltYm9sSGVpZ2h0ICs9IHJkaDtcbiAgICAgICAgICBzeW1ib2xCaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KFxuICAgICAgICAgICAgc3ltYm9sV2lkdGgsXG4gICAgICAgICAgICBzeW1ib2xIZWlnaHQsXG4gICAgICAgICAgICByZWZpbmVtZW50VGVtcGxhdGVJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEJpdG1hcCxcbiAgICAgICAgICAgIChyZHcgPj4gMSkgKyByZHgsXG4gICAgICAgICAgICAocmRoID4+IDEpICsgcmR5LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICByZWZpbmVtZW50QXQsXG4gICAgICAgICAgICBkZWNvZGluZ0NvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpO1xuICAgICAgICB2YXIgb2Zmc2V0UyA9IGN1cnJlbnRTIC0gKHJlZmVyZW5jZUNvcm5lciAmIDIgPyBzeW1ib2xXaWR0aCAtIDEgOiAwKTtcbiAgICAgICAgdmFyIHMyLCB0Miwgc3ltYm9sUm93O1xuICAgICAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgICAgIC8vIFBsYWNlIFN5bWJvbCBCaXRtYXAgZnJvbSBUMSxTMVxuICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbEhlaWdodDsgczIrKykge1xuICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFMgKyBzMl07XG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFtzMl07XG4gICAgICAgICAgICAvLyBUbyBpZ25vcmUgUGFydHMgb2YgU3ltYm9sIGJpdG1hcCB3aGljaCBnb2VzXG4gICAgICAgICAgICAvLyBvdXRzaWRlIGJpdG1hcCByZWdpb25cbiAgICAgICAgICAgIHZhciBtYXhXaWR0aCA9IE1hdGgubWluKHdpZHRoIC0gb2Zmc2V0VCwgc3ltYm9sV2lkdGgpO1xuICAgICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogLy8gT1JcbiAgICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykge1xuICAgICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gfD0gc3ltYm9sUm93W3QyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgMjogLy8gWE9SXG4gICAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHtcbiAgICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIF49IHN5bWJvbFJvd1t0Ml07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFxuICAgICAgICAgICAgICAgICAgYG9wZXJhdG9yICR7Y29tYmluYXRpb25PcGVyYXRvcn0gaXMgbm90IHN1cHBvcnRlZGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xIZWlnaHQgLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykge1xuICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07XG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFt0Ml07XG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiAvLyBPUlxuICAgICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7XG4gICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAyOiAvLyBYT1JcbiAgICAgICAgICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xXaWR0aDsgczIrKykge1xuICAgICAgICAgICAgICAgICAgcm93W29mZnNldFMgKyBzMl0gXj0gc3ltYm9sUm93W3MyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbFdpZHRoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICAgIHZhciBkZWx0YVMgPSBodWZmbWFuXG4gICAgICAgICAgPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFTLmRlY29kZShodWZmbWFuSW5wdXQpXG4gICAgICAgICAgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgXCJJQURTXCIsIGRlY29kZXIpOyAvLyA2LjQuOFxuICAgICAgICBpZiAoZGVsdGFTID09PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7IC8vIE9PQlxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTICs9IGRlbHRhUyArIGRzT2Zmc2V0O1xuICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShcbiAgICBtbXIsXG4gICAgcGF0dGVybldpZHRoLFxuICAgIHBhdHRlcm5IZWlnaHQsXG4gICAgbWF4UGF0dGVybkluZGV4LFxuICAgIHRlbXBsYXRlLFxuICAgIGRlY29kaW5nQ29udGV4dFxuICApIHtcbiAgICBjb25zdCBhdCA9IFtdO1xuICAgIGlmICghbW1yKSB7XG4gICAgICBhdC5wdXNoKHtcbiAgICAgICAgeDogLXBhdHRlcm5XaWR0aCxcbiAgICAgICAgeTogMCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0zLFxuICAgICAgICAgIHk6IC0xLFxuICAgICAgICB9KTtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAtMixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0yLFxuICAgICAgICAgIHk6IC0yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29sbGVjdGl2ZVdpZHRoID0gKG1heFBhdHRlcm5JbmRleCArIDEpICogcGF0dGVybldpZHRoO1xuICAgIGNvbnN0IGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVCaXRtYXAoXG4gICAgICBtbXIsXG4gICAgICBjb2xsZWN0aXZlV2lkdGgsXG4gICAgICBwYXR0ZXJuSGVpZ2h0LFxuICAgICAgdGVtcGxhdGUsXG4gICAgICBmYWxzZSxcbiAgICAgIG51bGwsXG4gICAgICBhdCxcbiAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICk7XG4gICAgLy8gRGl2aWRlIGNvbGxlY3RpdmUgYml0bWFwIGludG8gcGF0dGVybnMuXG4gICAgY29uc3QgcGF0dGVybnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBtYXhQYXR0ZXJuSW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVybkJpdG1hcCA9IFtdO1xuICAgICAgY29uc3QgeE1pbiA9IHBhdHRlcm5XaWR0aCAqIGk7XG4gICAgICBjb25zdCB4TWF4ID0geE1pbiArIHBhdHRlcm5XaWR0aDtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcGF0dGVybkhlaWdodDsgeSsrKSB7XG4gICAgICAgIHBhdHRlcm5CaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2gocGF0dGVybkJpdG1hcCk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZUhhbGZ0b25lUmVnaW9uKFxuICAgIG1tcixcbiAgICBwYXR0ZXJucyxcbiAgICB0ZW1wbGF0ZSxcbiAgICByZWdpb25XaWR0aCxcbiAgICByZWdpb25IZWlnaHQsXG4gICAgZGVmYXVsdFBpeGVsVmFsdWUsXG4gICAgZW5hYmxlU2tpcCxcbiAgICBjb21iaW5hdGlvbk9wZXJhdG9yLFxuICAgIGdyaWRXaWR0aCxcbiAgICBncmlkSGVpZ2h0LFxuICAgIGdyaWRPZmZzZXRYLFxuICAgIGdyaWRPZmZzZXRZLFxuICAgIGdyaWRWZWN0b3JYLFxuICAgIGdyaWRWZWN0b3JZLFxuICAgIGRlY29kaW5nQ29udGV4dFxuICApIHtcbiAgICBjb25zdCBza2lwID0gbnVsbDtcbiAgICBpZiAoZW5hYmxlU2tpcCkge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJza2lwIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuICAgIGlmIChjb21iaW5hdGlvbk9wZXJhdG9yICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcbiAgICAgICAgXCJvcGVyYXRvciBcIiArXG4gICAgICAgICAgY29tYmluYXRpb25PcGVyYXRvciArXG4gICAgICAgICAgXCIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb25cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIGJpdG1hcC5cbiAgICBjb25zdCByZWdpb25CaXRtYXAgPSBbXTtcbiAgICBsZXQgaSwgaiwgcm93O1xuICAgIGZvciAoaSA9IDA7IGkgPCByZWdpb25IZWlnaHQ7IGkrKykge1xuICAgICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocmVnaW9uV2lkdGgpO1xuICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCByZWdpb25XaWR0aDsgaisrKSB7XG4gICAgICAgICAgcm93W2pdID0gZGVmYXVsdFBpeGVsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgY29uc3QgbnVtYmVyT2ZQYXR0ZXJucyA9IHBhdHRlcm5zLmxlbmd0aDtcbiAgICBjb25zdCBwYXR0ZXJuMCA9IHBhdHRlcm5zWzBdO1xuICAgIGNvbnN0IHBhdHRlcm5XaWR0aCA9IHBhdHRlcm4wWzBdLmxlbmd0aCxcbiAgICAgIHBhdHRlcm5IZWlnaHQgPSBwYXR0ZXJuMC5sZW5ndGg7XG4gICAgY29uc3QgYml0c1BlclZhbHVlID0gbG9nMihudW1iZXJPZlBhdHRlcm5zKTtcbiAgICBjb25zdCBhdCA9IFtdO1xuICAgIGlmICghbW1yKSB7XG4gICAgICBhdC5wdXNoKHtcbiAgICAgICAgeDogdGVtcGxhdGUgPD0gMSA/IDMgOiAyLFxuICAgICAgICB5OiAtMSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0zLFxuICAgICAgICAgIHk6IC0xLFxuICAgICAgICB9KTtcbiAgICAgICAgYXQucHVzaCh7XG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAtMixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgIHg6IC0yLFxuICAgICAgICAgIHk6IC0yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQW5uZXggQy4gR3JheS1zY2FsZSBJbWFnZSBEZWNvZGluZyBQcm9jZWR1cmUuXG4gICAgY29uc3QgZ3JheVNjYWxlQml0UGxhbmVzID0gW107XG4gICAgbGV0IG1tcklucHV0LCBiaXRtYXA7XG4gICAgaWYgKG1tcikge1xuICAgICAgLy8gTU1SIGJpdCBwbGFuZXMgYXJlIGluIG9uZSBjb250aW51b3VzIHN0cmVhbS4gT25seSBFT0ZCIGNvZGVzIGluZGljYXRlXG4gICAgICAvLyB0aGUgZW5kIG9mIGVhY2ggYml0bWFwLCBzbyBFT0ZCcyBtdXN0IGJlIGRlY29kZWQuXG4gICAgICBtbXJJbnB1dCA9IG5ldyBSZWFkZXIoXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5kYXRhLFxuICAgICAgICBkZWNvZGluZ0NvbnRleHQuc3RhcnQsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dC5lbmRcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoaSA9IGJpdHNQZXJWYWx1ZSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAobW1yKSB7XG4gICAgICAgIGJpdG1hcCA9IGRlY29kZU1NUkJpdG1hcChtbXJJbnB1dCwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBncmlkV2lkdGgsXG4gICAgICAgICAgZ3JpZEhlaWdodCxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBza2lwLFxuICAgICAgICAgIGF0LFxuICAgICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZ3JheVNjYWxlQml0UGxhbmVzW2ldID0gYml0bWFwO1xuICAgIH1cbiAgICAvLyA2LjYuNS4yIFJlbmRlcmluZyB0aGUgcGF0dGVybnMuXG4gICAgbGV0IG1nLCBuZywgYml0LCBwYXR0ZXJuSW5kZXgsIHBhdHRlcm5CaXRtYXAsIHgsIHksIHBhdHRlcm5Sb3csIHJlZ2lvblJvdztcbiAgICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7XG4gICAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHtcbiAgICAgICAgYml0ID0gMDtcbiAgICAgICAgcGF0dGVybkluZGV4ID0gMDtcbiAgICAgICAgZm9yIChqID0gYml0c1BlclZhbHVlIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICBiaXQgPSBncmF5U2NhbGVCaXRQbGFuZXNbal1bbWddW25nXSBeIGJpdDsgLy8gR3JheSBkZWNvZGluZ1xuICAgICAgICAgIHBhdHRlcm5JbmRleCB8PSBiaXQgPDwgajtcbiAgICAgICAgfVxuICAgICAgICBwYXR0ZXJuQml0bWFwID0gcGF0dGVybnNbcGF0dGVybkluZGV4XTtcbiAgICAgICAgeCA9IChncmlkT2Zmc2V0WCArIG1nICogZ3JpZFZlY3RvclkgKyBuZyAqIGdyaWRWZWN0b3JYKSA+PiA4O1xuICAgICAgICB5ID0gKGdyaWRPZmZzZXRZICsgbWcgKiBncmlkVmVjdG9yWCAtIG5nICogZ3JpZFZlY3RvclkpID4+IDg7XG4gICAgICAgIC8vIERyYXcgcGF0dGVybkJpdG1hcCBhdCAoeCwgeSkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB4ID49IDAgJiZcbiAgICAgICAgICB4ICsgcGF0dGVybldpZHRoIDw9IHJlZ2lvbldpZHRoICYmXG4gICAgICAgICAgeSA+PSAwICYmXG4gICAgICAgICAgeSArIHBhdHRlcm5IZWlnaHQgPD0gcmVnaW9uSGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFt5ICsgaV07XG4gICAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykge1xuICAgICAgICAgICAgICByZWdpb25Sb3dbeCArIGpdIHw9IHBhdHRlcm5Sb3dbal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZWdpb25YLCByZWdpb25ZO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTtcbiAgICAgICAgICAgIGlmIChyZWdpb25ZIDwgMCB8fCByZWdpb25ZID49IHJlZ2lvbkhlaWdodCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFtyZWdpb25ZXTtcbiAgICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajtcbiAgICAgICAgICAgICAgaWYgKHJlZ2lvblggPj0gMCAmJiByZWdpb25YIDwgcmVnaW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICByZWdpb25Sb3dbcmVnaW9uWF0gfD0gcGF0dGVyblJvd1tqXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVnaW9uQml0bWFwO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZFNlZ21lbnRIZWFkZXIoZGF0YSwgc3RhcnQpIHtcbiAgICB2YXIgc2VnbWVudEhlYWRlciA9IHt9O1xuICAgIHNlZ21lbnRIZWFkZXIubnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCk7XG4gICAgdmFyIGZsYWdzID0gZGF0YVtzdGFydCArIDRdO1xuICAgIHZhciBzZWdtZW50VHlwZSA9IGZsYWdzICYgMHgzZjtcbiAgICBpZiAoIVNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV0pIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBzZWdtZW50IHR5cGU6IFwiICsgc2VnbWVudFR5cGUpO1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLnR5cGUgPSBzZWdtZW50VHlwZTtcbiAgICBzZWdtZW50SGVhZGVyLnR5cGVOYW1lID0gU2VnbWVudFR5cGVzW3NlZ21lbnRUeXBlXTtcbiAgICBzZWdtZW50SGVhZGVyLmRlZmVycmVkTm9uUmV0YWluID0gISEoZmxhZ3MgJiAweDgwKTtcblxuICAgIHZhciBwYWdlQXNzb2NpYXRpb25GaWVsZFNpemUgPSAhIShmbGFncyAmIDB4NDApO1xuICAgIHZhciByZWZlcnJlZEZsYWdzID0gZGF0YVtzdGFydCArIDVdO1xuICAgIHZhciByZWZlcnJlZFRvQ291bnQgPSAocmVmZXJyZWRGbGFncyA+PiA1KSAmIDc7XG4gICAgdmFyIHJldGFpbkJpdHMgPSBbcmVmZXJyZWRGbGFncyAmIDMxXTtcbiAgICB2YXIgcG9zaXRpb24gPSBzdGFydCArIDY7XG4gICAgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDcpIHtcbiAgICAgIHJlZmVycmVkVG9Db3VudCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gLSAxKSAmIDB4MWZmZmZmZmY7XG4gICAgICBwb3NpdGlvbiArPSAzO1xuICAgICAgdmFyIGJ5dGVzID0gKHJlZmVycmVkVG9Db3VudCArIDcpID4+IDM7XG4gICAgICByZXRhaW5CaXRzWzBdID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgIHdoaWxlICgtLWJ5dGVzID4gMCkge1xuICAgICAgICByZXRhaW5CaXRzLnB1c2goZGF0YVtwb3NpdGlvbisrXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWZlcnJlZEZsYWdzID09PSA1IHx8IHJlZmVycmVkRmxhZ3MgPT09IDYpIHtcbiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCByZWZlcnJlZC10byBmbGFnc1wiKTtcbiAgICB9XG5cbiAgICBzZWdtZW50SGVhZGVyLnJldGFpbkJpdHMgPSByZXRhaW5CaXRzO1xuXG4gICAgbGV0IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDQ7XG4gICAgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDI1Nikge1xuICAgICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDY1NTM2KSB7XG4gICAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAyO1xuICAgIH1cbiAgICB2YXIgcmVmZXJyZWRUbyA9IFtdO1xuICAgIHZhciBpLCBpaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgcmVmZXJyZWRUb0NvdW50OyBpKyspIHtcbiAgICAgIGxldCBudW1iZXI7XG4gICAgICBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAxKSB7XG4gICAgICAgIG51bWJlciA9IGRhdGFbcG9zaXRpb25dO1xuICAgICAgfSBlbHNlIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDIpIHtcbiAgICAgICAgbnVtYmVyID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1iZXIgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJlZmVycmVkVG8ucHVzaChudW1iZXIpO1xuICAgICAgcG9zaXRpb24gKz0gcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplO1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLnJlZmVycmVkVG8gPSByZWZlcnJlZFRvO1xuICAgIGlmICghcGFnZUFzc29jaWF0aW9uRmllbGRTaXplKSB7XG4gICAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlZ21lbnRIZWFkZXIucGFnZUFzc29jaWF0aW9uID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICBwb3NpdGlvbiArPSA0O1xuICAgIH1cbiAgICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgIHBvc2l0aW9uICs9IDQ7XG5cbiAgICBpZiAoc2VnbWVudEhlYWRlci5sZW5ndGggPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgIC8vIDcuMi43IFNlZ21lbnQgZGF0YSBsZW5ndGgsIHVua25vd24gc2VnbWVudCBsZW5ndGhcbiAgICAgIGlmIChzZWdtZW50VHlwZSA9PT0gMzgpIHtcbiAgICAgICAgLy8gSW1tZWRpYXRlR2VuZXJpY1JlZ2lvblxuICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvbkluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPVxuICAgICAgICAgIGRhdGFbcG9zaXRpb24gKyBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aF07XG4gICAgICAgIHZhciBnZW5lcmljUmVnaW9uTW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICAvLyBzZWFyY2hpbmcgZm9yIHRoZSBzZWdtZW50IGVuZFxuICAgICAgICB2YXIgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7XG4gICAgICAgIHZhciBzZWFyY2hQYXR0ZXJuID0gbmV3IFVpbnQ4QXJyYXkoc2VhcmNoUGF0dGVybkxlbmd0aCk7XG4gICAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbk1tcikge1xuICAgICAgICAgIHNlYXJjaFBhdHRlcm5bMF0gPSAweGZmO1xuICAgICAgICAgIHNlYXJjaFBhdHRlcm5bMV0gPSAweGFjO1xuICAgICAgICB9XG4gICAgICAgIHNlYXJjaFBhdHRlcm5bMl0gPSAoZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzZWFyY2hQYXR0ZXJuWzNdID0gKGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiAxNikgJiAweGZmO1xuICAgICAgICBzZWFyY2hQYXR0ZXJuWzRdID0gKGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHNlYXJjaFBhdHRlcm5bNV0gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgJiAweGZmO1xuICAgICAgICBmb3IgKGkgPSBwb3NpdGlvbiwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICB2YXIgaiA9IDA7XG4gICAgICAgICAgd2hpbGUgKGogPCBzZWFyY2hQYXR0ZXJuTGVuZ3RoICYmIHNlYXJjaFBhdHRlcm5bal0gPT09IGRhdGFbaSArIGpdKSB7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqID09PSBzZWFyY2hQYXR0ZXJuTGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9IGkgKyBzZWFyY2hQYXR0ZXJuTGVuZ3RoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikge1xuICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwic2VnbWVudCBlbmQgd2FzIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGhcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHNlZ21lbnRIZWFkZXIuaGVhZGVyRW5kID0gcG9zaXRpb247XG4gICAgcmV0dXJuIHNlZ21lbnRIZWFkZXI7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkU2VnbWVudHMoaGVhZGVyLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHNlZ21lbnRzID0gW107XG4gICAgdmFyIHBvc2l0aW9uID0gc3RhcnQ7XG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7XG4gICAgICB2YXIgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7XG4gICAgICB2YXIgc2VnbWVudCA9IHtcbiAgICAgICAgaGVhZGVyOiBzZWdtZW50SGVhZGVyLFxuICAgICAgICBkYXRhLFxuICAgICAgfTtcbiAgICAgIGlmICghaGVhZGVyLnJhbmRvbUFjY2Vzcykge1xuICAgICAgICBzZWdtZW50LnN0YXJ0ID0gcG9zaXRpb247XG4gICAgICAgIHBvc2l0aW9uICs9IHNlZ21lbnRIZWFkZXIubGVuZ3RoO1xuICAgICAgICBzZWdtZW50LmVuZCA9IHBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgIGlmIChzZWdtZW50SGVhZGVyLnR5cGUgPT09IDUxKSB7XG4gICAgICAgIGJyZWFrOyAvLyBlbmQgb2YgZmlsZSBpcyBmb3VuZFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGVhZGVyLnJhbmRvbUFjY2Vzcykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBzZWdtZW50c1tpXS5zdGFydCA9IHBvc2l0aW9uO1xuICAgICAgICBwb3NpdGlvbiArPSBzZWdtZW50c1tpXS5oZWFkZXIubGVuZ3RoO1xuICAgICAgICBzZWdtZW50c1tpXS5lbmQgPSBwb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgLy8gNy40LjEgUmVnaW9uIHNlZ21lbnQgaW5mb3JtYXRpb24gZmllbGRcbiAgZnVuY3Rpb24gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBzdGFydCkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCksXG4gICAgICBoZWlnaHQ6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA0KSxcbiAgICAgIHg6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA4KSxcbiAgICAgIHk6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxMiksXG4gICAgICBjb21iaW5hdGlvbk9wZXJhdG9yOiBkYXRhW3N0YXJ0ICsgMTZdICYgNyxcbiAgICB9O1xuICB9XG4gIHZhciBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3O1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHNlZ21lbnQsIHZpc2l0b3IpIHtcbiAgICB2YXIgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7XG5cbiAgICB2YXIgZGF0YSA9IHNlZ21lbnQuZGF0YSxcbiAgICAgIHBvc2l0aW9uID0gc2VnbWVudC5zdGFydCxcbiAgICAgIGVuZCA9IHNlZ21lbnQuZW5kO1xuICAgIHZhciBhcmdzLCBhdCwgaSwgYXRMZW5ndGg7XG4gICAgc3dpdGNoIChoZWFkZXIudHlwZSkge1xuICAgICAgY2FzZSAwOiAvLyBTeW1ib2xEaWN0aW9uYXJ5XG4gICAgICAgIC8vIDcuNC4yIFN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgc3ludGF4XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5ID0ge307XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5RmxhZ3MgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTsgLy8gNy40LjIuMS4xXG4gICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpO1xuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTtcbiAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yID0gKGRpY3Rpb25hcnlGbGFncyA+PiA0KSAmIDM7XG4gICAgICAgIGRpY3Rpb25hcnkuYml0bWFwU2l6ZVNlbGVjdG9yID0gKGRpY3Rpb25hcnlGbGFncyA+PiA2KSAmIDE7XG4gICAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gNykgJiAxO1xuICAgICAgICBkaWN0aW9uYXJ5LmJpdG1hcENvZGluZ0NvbnRleHRVc2VkID0gISEoZGljdGlvbmFyeUZsYWdzICYgMjU2KTtcbiAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0UmV0YWluZWQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiA1MTIpO1xuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlID0gKGRpY3Rpb25hcnlGbGFncyA+PiAxMCkgJiAzO1xuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSA9IChkaWN0aW9uYXJ5RmxhZ3MgPj4gMTIpICYgMTtcbiAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgaWYgKCFkaWN0aW9uYXJ5Lmh1ZmZtYW4pIHtcbiAgICAgICAgICBhdExlbmd0aCA9IGRpY3Rpb25hcnkudGVtcGxhdGUgPT09IDAgPyA0IDogMTtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkaWN0aW9uYXJ5LmF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpY3Rpb25hcnkucmVmaW5lbWVudCAmJiAhZGljdGlvbmFyeS5yZWZpbmVtZW50VGVtcGxhdGUpIHtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGF0LnB1c2goe1xuICAgICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksXG4gICAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudEF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgZGljdGlvbmFyeS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mTmV3U3ltYm9scyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBhcmdzID0gW1xuICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgaGVhZGVyLm51bWJlcixcbiAgICAgICAgICBoZWFkZXIucmVmZXJyZWRUbyxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIGVuZCxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6IC8vIEltbWVkaWF0ZVRleHRSZWdpb25cbiAgICAgIGNhc2UgNzogLy8gSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uXG4gICAgICAgIHZhciB0ZXh0UmVnaW9uID0ge307XG4gICAgICAgIHRleHRSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDtcbiAgICAgICAgdmFyIHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMik7XG4gICAgICAgIHRleHRSZWdpb24ubG9nU3RyaXBTaXplID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICB0ZXh0UmVnaW9uLnN0cmlwU2l6ZSA9IDEgPDwgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemU7XG4gICAgICAgIHRleHRSZWdpb24ucmVmZXJlbmNlQ29ybmVyID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gNCkgJiAzO1xuICAgICAgICB0ZXh0UmVnaW9uLnRyYW5zcG9zZWQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgNjQpO1xuICAgICAgICB0ZXh0UmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA3KSAmIDM7XG4gICAgICAgIHRleHRSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA5KSAmIDE7XG4gICAgICAgIHRleHRSZWdpb24uZHNPZmZzZXQgPSAodGV4dFJlZ2lvblNlZ21lbnRGbGFncyA8PCAxNykgPj4gMjc7XG4gICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlID0gKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMTUpICYgMTtcbiAgICAgICAgaWYgKHRleHRSZWdpb24uaHVmZm1hbikge1xuICAgICAgICAgIHZhciB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24gKz0gMjtcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5GUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRTID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMikgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRUID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNCkgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREVyA9ICh0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDYpICYgMztcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50REggPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA4KSAmIDM7XG4gICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERYID0gKHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTApICYgMztcbiAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFkgPSAodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAxMikgJiAzO1xuICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRTaXplU2VsZWN0b3IgPSAhIShcbiAgICAgICAgICAgIHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAweDQwMDBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0UmVnaW9uLnJlZmluZW1lbnQgJiYgIXRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlKSB7XG4gICAgICAgICAgYXQgPSBbXTtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRBdCA9IGF0O1xuICAgICAgICB9XG4gICAgICAgIHRleHRSZWdpb24ubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgYXJncyA9IFt0ZXh0UmVnaW9uLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNjogLy8gUGF0dGVybkRpY3Rpb25hcnlcbiAgICAgICAgLy8gNy40LjQuIFBhdHRlcm4gZGljdGlvbmFyeSBzZWdtZW50IHN5bnRheFxuICAgICAgICBjb25zdCBwYXR0ZXJuRGljdGlvbmFyeSA9IHt9O1xuICAgICAgICBjb25zdCBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubW1yID0gISEocGF0dGVybkRpY3Rpb25hcnlGbGFncyAmIDEpO1xuICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS50ZW1wbGF0ZSA9IChwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID4+IDEpICYgMztcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybldpZHRoID0gZGF0YVtwb3NpdGlvbisrXTtcbiAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybkhlaWdodCA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBhcmdzID0gW3BhdHRlcm5EaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDIyOiAvLyBJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvblxuICAgICAgY2FzZSAyMzogLy8gSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvblxuICAgICAgICAvLyA3LjQuNSBIYWxmdG9uZSByZWdpb24gc2VnbWVudCBzeW50YXhcbiAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb24gPSB7fTtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDtcbiAgICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb25GbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLm1tciA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiAxKTtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24udGVtcGxhdGUgPSAoaGFsZnRvbmVSZWdpb25GbGFncyA+PiAxKSAmIDM7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmVuYWJsZVNraXAgPSAhIShoYWxmdG9uZVJlZ2lvbkZsYWdzICYgOCk7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSAoaGFsZnRvbmVSZWdpb25GbGFncyA+PiA0KSAmIDc7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gKGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gNykgJiAxO1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkV2lkdGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZEhlaWdodCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbiArPSA0O1xuICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjtcbiAgICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFkgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7XG4gICAgICAgIHBvc2l0aW9uICs9IDQ7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JYID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JZID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IDI7XG4gICAgICAgIGFyZ3MgPSBbaGFsZnRvbmVSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OiAvLyBJbW1lZGlhdGVHZW5lcmljUmVnaW9uXG4gICAgICBjYXNlIDM5OiAvLyBJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb25cbiAgICAgICAgdmFyIGdlbmVyaWNSZWdpb24gPSB7fTtcbiAgICAgICAgZ2VuZXJpY1JlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoO1xuICAgICAgICB2YXIgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgICAgIGdlbmVyaWNSZWdpb24ubW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICBnZW5lcmljUmVnaW9uLnRlbXBsYXRlID0gKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPj4gMSkgJiAzO1xuICAgICAgICBnZW5lcmljUmVnaW9uLnByZWRpY3Rpb24gPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgOCk7XG4gICAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbi5tbXIpIHtcbiAgICAgICAgICBhdExlbmd0aCA9IGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPT09IDAgPyA0IDogMTtcbiAgICAgICAgICBhdCA9IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhdC5wdXNoKHtcbiAgICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZW5lcmljUmVnaW9uLmF0ID0gYXQ7XG4gICAgICAgIH1cbiAgICAgICAgYXJncyA9IFtnZW5lcmljUmVnaW9uLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ4OiAvLyBQYWdlSW5mb3JtYXRpb25cbiAgICAgICAgdmFyIHBhZ2VJbmZvID0ge1xuICAgICAgICAgIHdpZHRoOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSxcbiAgICAgICAgICBoZWlnaHQ6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA0KSxcbiAgICAgICAgICByZXNvbHV0aW9uWDogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDgpLFxuICAgICAgICAgIHJlc29sdXRpb25ZOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMTIpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAocGFnZUluZm8uaGVpZ2h0ID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgZGVsZXRlIHBhZ2VJbmZvLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFnZVNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyAxNl07XG4gICAgICAgIHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAxNyk7IC8vIHBhZ2VTdHJpcGluZ0luZm9ybWF0aW9uXG4gICAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpO1xuICAgICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpO1xuICAgICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IChwYWdlU2VnbWVudEZsYWdzID4+IDIpICYgMTtcbiAgICAgICAgcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvciA9IChwYWdlU2VnbWVudEZsYWdzID4+IDMpICYgMztcbiAgICAgICAgcGFnZUluZm8ucmVxdWlyZXNCdWZmZXIgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMzIpO1xuICAgICAgICBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGUgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgNjQpO1xuICAgICAgICBhcmdzID0gW3BhZ2VJbmZvXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ5OiAvLyBFbmRPZlBhZ2VcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDUwOiAvLyBFbmRPZlN0cmlwZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTE6IC8vIEVuZE9mRmlsZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTM6IC8vIFRhYmxlc1xuICAgICAgICBhcmdzID0gW2hlYWRlci5udW1iZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmRdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vIDcuNC4xNSBkZWZpbmVzIDIgZXh0ZW5zaW9uIHR5cGVzIHdoaWNoXG4gICAgICAgIC8vIGFyZSBjb21tZW50cyBhbmQgY2FuIGJlIGlnbm9yZWQuXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgYHNlZ21lbnQgdHlwZSAke2hlYWRlci50eXBlTmFtZX0oJHtoZWFkZXIudHlwZX0pYCArXG4gICAgICAgICAgICBcIiBpcyBub3QgaW1wbGVtZW50ZWRcIlxuICAgICAgICApO1xuICAgIH1cbiAgICB2YXIgY2FsbGJhY2tOYW1lID0gXCJvblwiICsgaGVhZGVyLnR5cGVOYW1lO1xuICAgIGlmIChjYWxsYmFja05hbWUgaW4gdmlzaXRvcikge1xuICAgICAgdmlzaXRvcltjYWxsYmFja05hbWVdLmFwcGx5KHZpc2l0b3IsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcikge1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHByb2Nlc3NTZWdtZW50KHNlZ21lbnRzW2ldLCB2aXNpdG9yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcykge1xuICAgIHZhciB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHZhciBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyh7fSwgY2h1bmsuZGF0YSwgY2h1bmsuc3RhcnQsIGNodW5rLmVuZCk7XG4gICAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaXRvci5idWZmZXI7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUpiaWcyKGRhdGEpIHtcbiAgICBjb25zdCBlbmQgPSBkYXRhLmxlbmd0aDtcbiAgICBsZXQgcG9zaXRpb24gPSAwO1xuXG4gICAgaWYgKFxuICAgICAgZGF0YVtwb3NpdGlvbl0gIT09IDB4OTcgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyAxXSAhPT0gMHg0YSB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDJdICE9PSAweDQyIHx8XG4gICAgICBkYXRhW3Bvc2l0aW9uICsgM10gIT09IDB4MzIgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyA0XSAhPT0gMHgwZCB8fFxuICAgICAgZGF0YVtwb3NpdGlvbiArIDVdICE9PSAweDBhIHx8XG4gICAgICBkYXRhW3Bvc2l0aW9uICsgNl0gIT09IDB4MWEgfHxcbiAgICAgIGRhdGFbcG9zaXRpb24gKyA3XSAhPT0gMHgwYVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJwYXJzZUpiaWcyIC0gaW52YWxpZCBoZWFkZXIuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcG9zaXRpb24gKz0gODtcbiAgICBjb25zdCBmbGFncyA9IGRhdGFbcG9zaXRpb24rK107XG4gICAgaGVhZGVyLnJhbmRvbUFjY2VzcyA9ICEoZmxhZ3MgJiAxKTtcbiAgICBpZiAoIShmbGFncyAmIDIpKSB7XG4gICAgICBoZWFkZXIubnVtYmVyT2ZQYWdlcyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgcG9zaXRpb24gKz0gNDtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmQpO1xuICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgU2ltcGxlU2VnbWVudFZpc2l0b3IoKTtcbiAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpO1xuXG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB2aXNpdG9yLmN1cnJlbnRQYWdlSW5mbztcbiAgICBjb25zdCBiaXRQYWNrZWQgPSB2aXNpdG9yLmJ1ZmZlcjtcbiAgICBjb25zdCBpbWdEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTtcbiAgICBsZXQgcSA9IDAsXG4gICAgICBrID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICBsZXQgbWFzayA9IDAsXG4gICAgICAgIGJ1ZmZlcjtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgIGJ1ZmZlciA9IGJpdFBhY2tlZFtrKytdO1xuICAgICAgICB9XG4gICAgICAgIGltZ0RhdGFbcSsrXSA9IGJ1ZmZlciAmIG1hc2sgPyAwIDogMjU1O1xuICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGltZ0RhdGEsIHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yKCkge31cblxuICBTaW1wbGVTZWdtZW50VmlzaXRvci5wcm90b3R5cGUgPSB7XG4gICAgb25QYWdlSW5mb3JtYXRpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uUGFnZUluZm9ybWF0aW9uKGluZm8pIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbztcbiAgICAgIHZhciByb3dTaXplID0gKGluZm8ud2lkdGggKyA3KSA+PiAzO1xuICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OENsYW1wZWRBcnJheShyb3dTaXplICogaW5mby5oZWlnaHQpO1xuICAgICAgLy8gVGhlIGNvbnRlbnRzIG9mIEFycmF5QnVmZmVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gMC5cbiAgICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIDB4RkYgb25seSBpZiBpbmZvLmRlZmF1bHRQaXhlbFZhbHVlIGlzIHNldFxuICAgICAgaWYgKGluZm8uZGVmYXVsdFBpeGVsVmFsdWUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICBidWZmZXJbaV0gPSAweGZmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICB9LFxuICAgIGRyYXdCaXRtYXA6IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX2RyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKSB7XG4gICAgICB2YXIgcGFnZUluZm8gPSB0aGlzLmN1cnJlbnRQYWdlSW5mbztcbiAgICAgIHZhciB3aWR0aCA9IHJlZ2lvbkluZm8ud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IHJlZ2lvbkluZm8uaGVpZ2h0O1xuICAgICAgdmFyIHJvd1NpemUgPSAocGFnZUluZm8ud2lkdGggKyA3KSA+PiAzO1xuICAgICAgdmFyIGNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGVcbiAgICAgICAgPyByZWdpb25JbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JcbiAgICAgICAgOiBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yO1xuICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgdmFyIG1hc2swID0gMTI4ID4+IChyZWdpb25JbmZvLnggJiA3KTtcbiAgICAgIHZhciBvZmZzZXQwID0gcmVnaW9uSW5mby55ICogcm93U2l6ZSArIChyZWdpb25JbmZvLnggPj4gMyk7XG4gICAgICB2YXIgaSwgaiwgbWFzaywgb2Zmc2V0O1xuICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgMDogLy8gT1JcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIG1hc2sgPSBtYXNrMDtcbiAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gfD0gbWFzaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgICAgICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6IC8vIFhPUlxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgICAgICAgICAgbWFzayA9IG1hc2swO1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSBePSBtYXNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgICAgICAgIGlmICghbWFzaykge1xuICAgICAgICAgICAgICAgIG1hc2sgPSAxMjg7XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXG4gICAgICAgICAgICBgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUdlbmVyaWNSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihcbiAgICAgIHJlZ2lvbixcbiAgICAgIGRhdGEsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgICkge1xuICAgICAgdmFyIHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbztcbiAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgICAgdmFyIGJpdG1hcCA9IGRlY29kZUJpdG1hcChcbiAgICAgICAgcmVnaW9uLm1tcixcbiAgICAgICAgcmVnaW9uSW5mby53aWR0aCxcbiAgICAgICAgcmVnaW9uSW5mby5oZWlnaHQsXG4gICAgICAgIHJlZ2lvbi50ZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uLnByZWRpY3Rpb24sXG4gICAgICAgIG51bGwsXG4gICAgICAgIHJlZ2lvbi5hdCxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0XG4gICAgICApO1xuICAgICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24oKSB7XG4gICAgICB0aGlzLm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgb25TeW1ib2xEaWN0aW9uYXJ5OiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vblN5bWJvbERpY3Rpb25hcnkoXG4gICAgICBkaWN0aW9uYXJ5LFxuICAgICAgY3VycmVudFNlZ21lbnQsXG4gICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgKSB7XG4gICAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0O1xuICAgICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikge1xuICAgICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoXG4gICAgICAgICAgZGljdGlvbmFyeSxcbiAgICAgICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgICAgIHRoaXMuY3VzdG9tVGFibGVzXG4gICAgICAgICk7XG4gICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbWJpbmVzIGV4cG9ydGVkIHN5bWJvbHMgZnJvbSBhbGwgcmVmZXJyZWQgc2VnbWVudHNcbiAgICAgIHZhciBzeW1ib2xzID0gdGhpcy5zeW1ib2xzO1xuICAgICAgaWYgKCFzeW1ib2xzKSB7XG4gICAgICAgIHRoaXMuc3ltYm9scyA9IHN5bWJvbHMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdmFyIGlucHV0U3ltYm9scyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVmZXJyZWRTZWdtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50c1tpXV07XG4gICAgICAgIC8vIHJlZmVycmVkU3ltYm9scyBpcyB1bmRlZmluZWQgd2hlbiB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgVGFibGVzXG4gICAgICAgIC8vIHNlZ21lbnQgaW5zdGVhZCBvZiBhIFN5bWJvbERpY3Rpb25hcnkuXG4gICAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHtcbiAgICAgICAgICBpbnB1dFN5bWJvbHMgPSBpbnB1dFN5bWJvbHMuY29uY2F0KHJlZmVycmVkU3ltYm9scyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoXG4gICAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbixcbiAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50LFxuICAgICAgICBpbnB1dFN5bWJvbHMsXG4gICAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZOZXdTeW1ib2xzLFxuICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLFxuICAgICAgICBodWZmbWFuVGFibGVzLFxuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlLFxuICAgICAgICBkaWN0aW9uYXJ5LmF0LFxuICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSxcbiAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50QXQsXG4gICAgICAgIGRlY29kaW5nQ29udGV4dCxcbiAgICAgICAgaHVmZm1hbklucHV0XG4gICAgICApO1xuICAgIH0sXG4gICAgb25JbW1lZGlhdGVUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZVRleHRSZWdpb24oXG4gICAgICByZWdpb24sXG4gICAgICByZWZlcnJlZFNlZ21lbnRzLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgKSB7XG4gICAgICB2YXIgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvO1xuICAgICAgbGV0IGh1ZmZtYW5UYWJsZXMsIGh1ZmZtYW5JbnB1dDtcblxuICAgICAgLy8gQ29tYmluZXMgZXhwb3J0ZWQgc3ltYm9scyBmcm9tIGFsbCByZWZlcnJlZCBzZWdtZW50c1xuICAgICAgdmFyIHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7XG4gICAgICB2YXIgaW5wdXRTeW1ib2xzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRzW2ldXTtcbiAgICAgICAgLy8gcmVmZXJyZWRTeW1ib2xzIGlzIHVuZGVmaW5lZCB3aGVuIHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYSBUYWJsZXNcbiAgICAgICAgLy8gc2VnbWVudCBpbnN0ZWFkIG9mIGEgU3ltYm9sRGljdGlvbmFyeS5cbiAgICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykge1xuICAgICAgICAgIGlucHV0U3ltYm9scyA9IGlucHV0U3ltYm9scy5jb25jYXQocmVmZXJyZWRTeW1ib2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSBsb2cyKGlucHV0U3ltYm9scy5sZW5ndGgpO1xuICAgICAgaWYgKHJlZ2lvbi5odWZmbWFuKSB7XG4gICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgcmVmZXJyZWRTZWdtZW50cyxcbiAgICAgICAgICB0aGlzLmN1c3RvbVRhYmxlcyxcbiAgICAgICAgICBpbnB1dFN5bWJvbHMubGVuZ3RoLFxuICAgICAgICAgIGh1ZmZtYW5JbnB1dFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKFxuICAgICAgICByZWdpb24uaHVmZm1hbixcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnQsXG4gICAgICAgIHJlZ2lvbkluZm8ud2lkdGgsXG4gICAgICAgIHJlZ2lvbkluZm8uaGVpZ2h0LFxuICAgICAgICByZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUsXG4gICAgICAgIHJlZ2lvbi5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyxcbiAgICAgICAgcmVnaW9uLnN0cmlwU2l6ZSxcbiAgICAgICAgaW5wdXRTeW1ib2xzLFxuICAgICAgICBzeW1ib2xDb2RlTGVuZ3RoLFxuICAgICAgICByZWdpb24udHJhbnNwb3NlZCxcbiAgICAgICAgcmVnaW9uLmRzT2Zmc2V0LFxuICAgICAgICByZWdpb24ucmVmZXJlbmNlQ29ybmVyLFxuICAgICAgICByZWdpb24uY29tYmluYXRpb25PcGVyYXRvcixcbiAgICAgICAgaHVmZm1hblRhYmxlcyxcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uLnJlZmluZW1lbnRBdCxcbiAgICAgICAgZGVjb2RpbmdDb250ZXh0LFxuICAgICAgICByZWdpb24ubG9nU3RyaXBTaXplLFxuICAgICAgICBodWZmbWFuSW5wdXRcbiAgICAgICk7XG4gICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTtcbiAgICB9LFxuICAgIG9uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpIHtcbiAgICAgIHRoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBvblBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgICBsZXQgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zO1xuICAgICAgaWYgKCFwYXR0ZXJucykge1xuICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShcbiAgICAgICAgZGljdGlvbmFyeS5tbXIsXG4gICAgICAgIGRpY3Rpb25hcnkucGF0dGVybldpZHRoLFxuICAgICAgICBkaWN0aW9uYXJ5LnBhdHRlcm5IZWlnaHQsXG4gICAgICAgIGRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4LFxuICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlLFxuICAgICAgICBkZWNvZGluZ0NvbnRleHRcbiAgICAgICk7XG4gICAgfSxcbiAgICBvbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uKHJlZ2lvbiwgcmVmZXJyZWRTZWdtZW50cywgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgICAgLy8gSGFsZnRvbmVSZWdpb24gcmVmZXJzIHRvIGV4YWN0bHkgb25lIFBhdHRlcm5EaWN0aW9uYXJ5LlxuICAgICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zW3JlZmVycmVkU2VnbWVudHNbMF1dO1xuICAgICAgY29uc3QgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvO1xuICAgICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZUhhbGZ0b25lUmVnaW9uKFxuICAgICAgICByZWdpb24ubW1yLFxuICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgcmVnaW9uLnRlbXBsYXRlLFxuICAgICAgICByZWdpb25JbmZvLndpZHRoLFxuICAgICAgICByZWdpb25JbmZvLmhlaWdodCxcbiAgICAgICAgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLFxuICAgICAgICByZWdpb24uZW5hYmxlU2tpcCxcbiAgICAgICAgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsXG4gICAgICAgIHJlZ2lvbi5ncmlkV2lkdGgsXG4gICAgICAgIHJlZ2lvbi5ncmlkSGVpZ2h0LFxuICAgICAgICByZWdpb24uZ3JpZE9mZnNldFgsXG4gICAgICAgIHJlZ2lvbi5ncmlkT2Zmc2V0WSxcbiAgICAgICAgcmVnaW9uLmdyaWRWZWN0b3JYLFxuICAgICAgICByZWdpb24uZ3JpZFZlY3RvclksXG4gICAgICAgIGRlY29kaW5nQ29udGV4dFxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApO1xuICAgIH0sXG4gICAgb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uKCkge1xuICAgICAgdGhpcy5vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgICAgbGV0IGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzO1xuICAgICAgaWYgKCFjdXN0b21UYWJsZXMpIHtcbiAgICAgICAgdGhpcy5jdXN0b21UYWJsZXMgPSBjdXN0b21UYWJsZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGN1c3RvbVRhYmxlc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gSHVmZm1hbkxpbmUobGluZURhdGEpIHtcbiAgICBpZiAobGluZURhdGEubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBPT0IgbGluZS5cbiAgICAgIHRoaXMuaXNPT0IgPSB0cnVlO1xuICAgICAgdGhpcy5yYW5nZUxvdyA9IDA7XG4gICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzBdO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IDA7XG4gICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVsxXTtcbiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vcm1hbCwgdXBwZXIgcmFuZ2Ugb3IgbG93ZXIgcmFuZ2UgbGluZS5cbiAgICAgIC8vIFVwcGVyIHJhbmdlIGxpbmVzIGFyZSBwcm9jZXNzZWQgbGlrZSBub3JtYWwgbGluZXMuXG4gICAgICB0aGlzLmlzT09CID0gZmFsc2U7XG4gICAgICB0aGlzLnJhbmdlTG93ID0gbGluZURhdGFbMF07XG4gICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzFdO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmVEYXRhWzJdO1xuICAgICAgdGhpcy5wcmVmaXhDb2RlID0gbGluZURhdGFbM107XG4gICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmVEYXRhWzRdID09PSBcImxvd2VyXCI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gSHVmZm1hblRyZWVOb2RlKGxpbmUpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIC8vIExlYWYgbm9kZVxuICAgICAgdGhpcy5pc0xlYWYgPSB0cnVlO1xuICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmUucmFuZ2VMZW5ndGg7XG4gICAgICB0aGlzLnJhbmdlTG93ID0gbGluZS5yYW5nZUxvdztcbiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gbGluZS5pc0xvd2VyUmFuZ2U7XG4gICAgICB0aGlzLmlzT09CID0gbGluZS5pc09PQjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJtZWRpYXRlIG9yIHJvb3Qgbm9kZVxuICAgICAgdGhpcy5pc0xlYWYgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBIdWZmbWFuVHJlZU5vZGUucHJvdG90eXBlID0ge1xuICAgIGJ1aWxkVHJlZShsaW5lLCBzaGlmdCkge1xuICAgICAgY29uc3QgYml0ID0gKGxpbmUucHJlZml4Q29kZSA+PiBzaGlmdCkgJiAxO1xuICAgICAgaWYgKHNoaWZ0IDw9IDApIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbGVhZiBub2RlLlxuICAgICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBuZXcgSHVmZm1hblRyZWVOb2RlKGxpbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGludGVybWVkaWF0ZSBub2RlIGFuZCBjb250aW51ZSByZWN1cnNpdmVseS5cbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW2JpdF07XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuYnVpbGRUcmVlKGxpbmUsIHNoaWZ0IC0gMSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWNvZGVOb2RlKHJlYWRlcikge1xuICAgICAgaWYgKHRoaXMuaXNMZWFmKSB7XG4gICAgICAgIGlmICh0aGlzLmlzT09CKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHRPZmZzZXQgPSByZWFkZXIucmVhZEJpdHModGhpcy5yYW5nZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlTG93ICsgKHRoaXMuaXNMb3dlclJhbmdlID8gLWh0T2Zmc2V0IDogaHRPZmZzZXQpO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY2hpbGRyZW5bcmVhZGVyLnJlYWRCaXQoKV07XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIEh1ZmZtYW4gZGF0YVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLmRlY29kZU5vZGUocmVhZGVyKTtcbiAgICB9LFxuICB9O1xuXG4gIGZ1bmN0aW9uIEh1ZmZtYW5UYWJsZShsaW5lcywgcHJlZml4Q29kZXNEb25lKSB7XG4gICAgaWYgKCFwcmVmaXhDb2Rlc0RvbmUpIHtcbiAgICAgIHRoaXMuYXNzaWduUHJlZml4Q29kZXMobGluZXMpO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgSHVmZm1hbiB0cmVlLlxuICAgIHRoaXMucm9vdE5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yb290Tm9kZS5idWlsZFRyZWUobGluZSwgbGluZS5wcmVmaXhMZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBIdWZmbWFuVGFibGUucHJvdG90eXBlID0ge1xuICAgIGRlY29kZShyZWFkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTtcbiAgICB9LFxuICAgIGFzc2lnblByZWZpeENvZGVzKGxpbmVzKSB7XG4gICAgICAvLyBBbm5leCBCLjMgQXNzaWduaW5nIHRoZSBwcmVmaXggY29kZXMuXG4gICAgICBjb25zdCBsaW5lc0xlbmd0aCA9IGxpbmVzLmxlbmd0aDtcbiAgICAgIGxldCBwcmVmaXhMZW5ndGhNYXggPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByZWZpeExlbmd0aE1heCA9IE1hdGgubWF4KHByZWZpeExlbmd0aE1heCwgbGluZXNbaV0ucHJlZml4TGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGlzdG9ncmFtID0gbmV3IFVpbnQzMkFycmF5KHByZWZpeExlbmd0aE1heCArIDEpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhpc3RvZ3JhbVtsaW5lc1tpXS5wcmVmaXhMZW5ndGhdKys7XG4gICAgICB9XG4gICAgICBsZXQgY3VycmVudExlbmd0aCA9IDEsXG4gICAgICAgIGZpcnN0Q29kZSA9IDAsXG4gICAgICAgIGN1cnJlbnRDb2RlLFxuICAgICAgICBjdXJyZW50VGVtcCxcbiAgICAgICAgbGluZTtcbiAgICAgIGhpc3RvZ3JhbVswXSA9IDA7XG5cbiAgICAgIHdoaWxlIChjdXJyZW50TGVuZ3RoIDw9IHByZWZpeExlbmd0aE1heCkge1xuICAgICAgICBmaXJzdENvZGUgPSAoZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSkgPDwgMTtcbiAgICAgICAgY3VycmVudENvZGUgPSBmaXJzdENvZGU7XG4gICAgICAgIGN1cnJlbnRUZW1wID0gMDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRUZW1wIDwgbGluZXNMZW5ndGgpIHtcbiAgICAgICAgICBsaW5lID0gbGluZXNbY3VycmVudFRlbXBdO1xuICAgICAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA9PT0gY3VycmVudExlbmd0aCkge1xuICAgICAgICAgICAgbGluZS5wcmVmaXhDb2RlID0gY3VycmVudENvZGU7XG4gICAgICAgICAgICBjdXJyZW50Q29kZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50VGVtcCsrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRMZW5ndGgrKztcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGZ1bmN0aW9uIGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIC8vIERlY29kZXMgYSBUYWJsZXMgc2VnbWVudCwgaS5lLiwgYSBjdXN0b20gSHVmZm1hbiB0YWJsZS5cbiAgICAvLyBBbm5leCBCLjIgQ29kZSB0YWJsZSBzdHJ1Y3R1cmUuXG4gICAgY29uc3QgZmxhZ3MgPSBkYXRhW3N0YXJ0XTtcbiAgICBjb25zdCBsb3dlc3RWYWx1ZSA9IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxKSAmIDB4ZmZmZmZmZmY7XG4gICAgY29uc3QgaGlnaGVzdFZhbHVlID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDUpICYgMHhmZmZmZmZmZjtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0ICsgOSwgZW5kKTtcblxuICAgIGNvbnN0IHByZWZpeFNpemVCaXRzID0gKChmbGFncyA+PiAxKSAmIDcpICsgMTtcbiAgICBjb25zdCByYW5nZVNpemVCaXRzID0gKChmbGFncyA+PiA0KSAmIDcpICsgMTtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGxldCBwcmVmaXhMZW5ndGgsXG4gICAgICByYW5nZUxlbmd0aCxcbiAgICAgIGN1cnJlbnRSYW5nZUxvdyA9IGxvd2VzdFZhbHVlO1xuXG4gICAgLy8gTm9ybWFsIHRhYmxlIGxpbmVzXG4gICAgZG8ge1xuICAgICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTtcbiAgICAgIHJhbmdlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHJhbmdlU2l6ZUJpdHMpO1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgbmV3IEh1ZmZtYW5MaW5lKFtjdXJyZW50UmFuZ2VMb3csIHByZWZpeExlbmd0aCwgcmFuZ2VMZW5ndGgsIDBdKVxuICAgICAgKTtcbiAgICAgIGN1cnJlbnRSYW5nZUxvdyArPSAxIDw8IHJhbmdlTGVuZ3RoO1xuICAgIH0gd2hpbGUgKGN1cnJlbnRSYW5nZUxvdyA8IGhpZ2hlc3RWYWx1ZSk7XG5cbiAgICAvLyBMb3dlciByYW5nZSB0YWJsZSBsaW5lXG4gICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgbmV3IEh1ZmZtYW5MaW5lKFtsb3dlc3RWYWx1ZSAtIDEsIHByZWZpeExlbmd0aCwgMzIsIDAsIFwibG93ZXJcIl0pXG4gICAgKTtcblxuICAgIC8vIFVwcGVyIHJhbmdlIHRhYmxlIGxpbmVcbiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpO1xuICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtoaWdoZXN0VmFsdWUsIHByZWZpeExlbmd0aCwgMzIsIDBdKSk7XG5cbiAgICBpZiAoZmxhZ3MgJiAxKSB7XG4gICAgICAvLyBPdXQtb2YtYmFuZCB0YWJsZSBsaW5lXG4gICAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpO1xuICAgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgZmFsc2UpO1xuICB9XG5cbiAgY29uc3Qgc3RhbmRhcmRUYWJsZXNDYWNoZSA9IHt9O1xuXG4gIGZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7XG4gICAgLy8gQW5uZXggQi41IFN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzLlxuICAgIGxldCB0YWJsZSA9IHN0YW5kYXJkVGFibGVzQ2FjaGVbbnVtYmVyXTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gICAgbGV0IGxpbmVzO1xuICAgIHN3aXRjaCAobnVtYmVyKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFswLCAxLCA0LCAweDBdLFxuICAgICAgICAgIFsxNiwgMiwgOCwgMHgyXSxcbiAgICAgICAgICBbMjcyLCAzLCAxNiwgMHg2XSxcbiAgICAgICAgICBbNjU4MDgsIDMsIDMyLCAweDddLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWzAsIDEsIDAsIDB4MF0sXG4gICAgICAgICAgWzEsIDIsIDAsIDB4Ml0sXG4gICAgICAgICAgWzIsIDMsIDAsIDB4Nl0sXG4gICAgICAgICAgWzMsIDQsIDMsIDB4ZV0sXG4gICAgICAgICAgWzExLCA1LCA2LCAweDFlXSxcbiAgICAgICAgICBbNzUsIDYsIDMyLCAweDNlXSwgLy8gdXBwZXJcbiAgICAgICAgICBbNiwgMHgzZl0sIC8vIE9PQlxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yNTYsIDgsIDgsIDB4ZmVdLFxuICAgICAgICAgIFswLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsxLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFsyLCAzLCAwLCAweDZdLFxuICAgICAgICAgIFszLCA0LCAzLCAweGVdLFxuICAgICAgICAgIFsxMSwgNSwgNiwgMHgxZV0sXG4gICAgICAgICAgWy0yNTcsIDgsIDMyLCAweGZmLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs3NSwgNywgMzIsIDB4N2VdLCAvLyB1cHBlclxuICAgICAgICAgIFs2LCAweDNlXSwgLy8gT09CXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbMSwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMiwgMiwgMCwgMHgyXSxcbiAgICAgICAgICBbMywgMywgMCwgMHg2XSxcbiAgICAgICAgICBbNCwgNCwgMywgMHhlXSxcbiAgICAgICAgICBbMTIsIDUsIDYsIDB4MWVdLFxuICAgICAgICAgIFs3NiwgNSwgMzIsIDB4MWZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yNTUsIDcsIDgsIDB4N2VdLFxuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFszLCAzLCAwLCAweDZdLFxuICAgICAgICAgIFs0LCA0LCAzLCAweGVdLFxuICAgICAgICAgIFsxMiwgNSwgNiwgMHgxZV0sXG4gICAgICAgICAgWy0yNTYsIDcsIDMyLCAweDdmLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs3NiwgNiwgMzIsIDB4M2VdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yMDQ4LCA1LCAxMCwgMHgxY10sXG4gICAgICAgICAgWy0xMDI0LCA0LCA5LCAweDhdLFxuICAgICAgICAgIFstNTEyLCA0LCA4LCAweDldLFxuICAgICAgICAgIFstMjU2LCA0LCA3LCAweGFdLFxuICAgICAgICAgIFstMTI4LCA1LCA2LCAweDFkXSxcbiAgICAgICAgICBbLTY0LCA1LCA1LCAweDFlXSxcbiAgICAgICAgICBbLTMyLCA0LCA1LCAweGJdLFxuICAgICAgICAgIFswLCAyLCA3LCAweDBdLFxuICAgICAgICAgIFsxMjgsIDMsIDcsIDB4Ml0sXG4gICAgICAgICAgWzI1NiwgMywgOCwgMHgzXSxcbiAgICAgICAgICBbNTEyLCA0LCA5LCAweGNdLFxuICAgICAgICAgIFsxMDI0LCA0LCAxMCwgMHhkXSxcbiAgICAgICAgICBbLTIwNDksIDYsIDMyLCAweDNlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFsyMDQ4LCA2LCAzMiwgMHgzZl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA3OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTEwMjQsIDQsIDksIDB4OF0sXG4gICAgICAgICAgWy01MTIsIDMsIDgsIDB4MF0sXG4gICAgICAgICAgWy0yNTYsIDQsIDcsIDB4OV0sXG4gICAgICAgICAgWy0xMjgsIDUsIDYsIDB4MWFdLFxuICAgICAgICAgIFstNjQsIDUsIDUsIDB4MWJdLFxuICAgICAgICAgIFstMzIsIDQsIDUsIDB4YV0sXG4gICAgICAgICAgWzAsIDQsIDUsIDB4Yl0sXG4gICAgICAgICAgWzMyLCA1LCA1LCAweDFjXSxcbiAgICAgICAgICBbNjQsIDUsIDYsIDB4MWRdLFxuICAgICAgICAgIFsxMjgsIDQsIDcsIDB4Y10sXG4gICAgICAgICAgWzI1NiwgMywgOCwgMHgxXSxcbiAgICAgICAgICBbNTEyLCAzLCA5LCAweDJdLFxuICAgICAgICAgIFsxMDI0LCAzLCAxMCwgMHgzXSxcbiAgICAgICAgICBbLTEwMjUsIDUsIDMyLCAweDFlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFsyMDQ4LCA1LCAzMiwgMHgxZl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTE1LCA4LCAzLCAweGZjXSxcbiAgICAgICAgICBbLTcsIDksIDEsIDB4MWZjXSxcbiAgICAgICAgICBbLTUsIDgsIDEsIDB4ZmRdLFxuICAgICAgICAgIFstMywgOSwgMCwgMHgxZmRdLFxuICAgICAgICAgIFstMiwgNywgMCwgMHg3Y10sXG4gICAgICAgICAgWy0xLCA0LCAwLCAweGFdLFxuICAgICAgICAgIFswLCAyLCAxLCAweDBdLFxuICAgICAgICAgIFsyLCA1LCAwLCAweDFhXSxcbiAgICAgICAgICBbMywgNiwgMCwgMHgzYV0sXG4gICAgICAgICAgWzQsIDMsIDQsIDB4NF0sXG4gICAgICAgICAgWzIwLCA2LCAxLCAweDNiXSxcbiAgICAgICAgICBbMjIsIDQsIDQsIDB4Yl0sXG4gICAgICAgICAgWzM4LCA0LCA1LCAweGNdLFxuICAgICAgICAgIFs3MCwgNSwgNiwgMHgxYl0sXG4gICAgICAgICAgWzEzNCwgNSwgNywgMHgxY10sXG4gICAgICAgICAgWzI2MiwgNiwgNywgMHgzY10sXG4gICAgICAgICAgWzM5MCwgNywgOCwgMHg3ZF0sXG4gICAgICAgICAgWzY0NiwgNiwgMTAsIDB4M2RdLFxuICAgICAgICAgIFstMTYsIDksIDMyLCAweDFmZSwgXCJsb3dlclwiXSxcbiAgICAgICAgICBbMTY3MCwgOSwgMzIsIDB4MWZmXSwgLy8gdXBwZXJcbiAgICAgICAgICBbMiwgMHgxXSwgLy8gT09CXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTMxLCA4LCA0LCAweGZjXSxcbiAgICAgICAgICBbLTE1LCA5LCAyLCAweDFmY10sXG4gICAgICAgICAgWy0xMSwgOCwgMiwgMHhmZF0sXG4gICAgICAgICAgWy03LCA5LCAxLCAweDFmZF0sXG4gICAgICAgICAgWy01LCA3LCAxLCAweDdjXSxcbiAgICAgICAgICBbLTMsIDQsIDEsIDB4YV0sXG4gICAgICAgICAgWy0xLCAzLCAxLCAweDJdLFxuICAgICAgICAgIFsxLCAzLCAxLCAweDNdLFxuICAgICAgICAgIFszLCA1LCAxLCAweDFhXSxcbiAgICAgICAgICBbNSwgNiwgMSwgMHgzYV0sXG4gICAgICAgICAgWzcsIDMsIDUsIDB4NF0sXG4gICAgICAgICAgWzM5LCA2LCAyLCAweDNiXSxcbiAgICAgICAgICBbNDMsIDQsIDUsIDB4Yl0sXG4gICAgICAgICAgWzc1LCA0LCA2LCAweGNdLFxuICAgICAgICAgIFsxMzksIDUsIDcsIDB4MWJdLFxuICAgICAgICAgIFsyNjcsIDUsIDgsIDB4MWNdLFxuICAgICAgICAgIFs1MjMsIDYsIDgsIDB4M2NdLFxuICAgICAgICAgIFs3NzksIDcsIDksIDB4N2RdLFxuICAgICAgICAgIFsxMjkxLCA2LCAxMSwgMHgzZF0sXG4gICAgICAgICAgWy0zMiwgOSwgMzIsIDB4MWZlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFszMzM5LCA5LCAzMiwgMHgxZmZdLCAvLyB1cHBlclxuICAgICAgICAgIFsyLCAweDBdLCAvLyBPT0JcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTIxLCA3LCA0LCAweDdhXSxcbiAgICAgICAgICBbLTUsIDgsIDAsIDB4ZmNdLFxuICAgICAgICAgIFstNCwgNywgMCwgMHg3Yl0sXG4gICAgICAgICAgWy0zLCA1LCAwLCAweDE4XSxcbiAgICAgICAgICBbLTIsIDIsIDIsIDB4MF0sXG4gICAgICAgICAgWzIsIDUsIDAsIDB4MTldLFxuICAgICAgICAgIFszLCA2LCAwLCAweDM2XSxcbiAgICAgICAgICBbNCwgNywgMCwgMHg3Y10sXG4gICAgICAgICAgWzUsIDgsIDAsIDB4ZmRdLFxuICAgICAgICAgIFs2LCAyLCA2LCAweDFdLFxuICAgICAgICAgIFs3MCwgNSwgNSwgMHgxYV0sXG4gICAgICAgICAgWzEwMiwgNiwgNSwgMHgzN10sXG4gICAgICAgICAgWzEzNCwgNiwgNiwgMHgzOF0sXG4gICAgICAgICAgWzE5OCwgNiwgNywgMHgzOV0sXG4gICAgICAgICAgWzMyNiwgNiwgOCwgMHgzYV0sXG4gICAgICAgICAgWzU4MiwgNiwgOSwgMHgzYl0sXG4gICAgICAgICAgWzEwOTQsIDYsIDEwLCAweDNjXSxcbiAgICAgICAgICBbMjExOCwgNywgMTEsIDB4N2RdLFxuICAgICAgICAgIFstMjIsIDgsIDMyLCAweGZlLCBcImxvd2VyXCJdLFxuICAgICAgICAgIFs0MTY2LCA4LCAzMiwgMHhmZl0sIC8vIHVwcGVyXG4gICAgICAgICAgWzIsIDB4Ml0sIC8vIE9PQlxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAxLCAweDJdLFxuICAgICAgICAgIFs0LCA0LCAwLCAweGNdLFxuICAgICAgICAgIFs1LCA0LCAxLCAweGRdLFxuICAgICAgICAgIFs3LCA1LCAxLCAweDFjXSxcbiAgICAgICAgICBbOSwgNSwgMiwgMHgxZF0sXG4gICAgICAgICAgWzEzLCA2LCAyLCAweDNjXSxcbiAgICAgICAgICBbMTcsIDcsIDIsIDB4N2FdLFxuICAgICAgICAgIFsyMSwgNywgMywgMHg3Yl0sXG4gICAgICAgICAgWzI5LCA3LCA0LCAweDdjXSxcbiAgICAgICAgICBbNDUsIDcsIDUsIDB4N2RdLFxuICAgICAgICAgIFs3NywgNywgNiwgMHg3ZV0sXG4gICAgICAgICAgWzE0MSwgNywgMzIsIDB4N2ZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAyLCAwLCAweDJdLFxuICAgICAgICAgIFszLCAzLCAxLCAweDZdLFxuICAgICAgICAgIFs1LCA1LCAwLCAweDFjXSxcbiAgICAgICAgICBbNiwgNSwgMSwgMHgxZF0sXG4gICAgICAgICAgWzgsIDYsIDEsIDB4M2NdLFxuICAgICAgICAgIFsxMCwgNywgMCwgMHg3YV0sXG4gICAgICAgICAgWzExLCA3LCAxLCAweDdiXSxcbiAgICAgICAgICBbMTMsIDcsIDIsIDB4N2NdLFxuICAgICAgICAgIFsxNywgNywgMywgMHg3ZF0sXG4gICAgICAgICAgWzI1LCA3LCA0LCAweDdlXSxcbiAgICAgICAgICBbNDEsIDgsIDUsIDB4ZmVdLFxuICAgICAgICAgIFs3MywgOCwgMzIsIDB4ZmZdLCAvLyB1cHBlclxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGxpbmVzID0gW1xuICAgICAgICAgIFsxLCAxLCAwLCAweDBdLFxuICAgICAgICAgIFsyLCAzLCAwLCAweDRdLFxuICAgICAgICAgIFszLCA0LCAwLCAweGNdLFxuICAgICAgICAgIFs0LCA1LCAwLCAweDFjXSxcbiAgICAgICAgICBbNSwgNCwgMSwgMHhkXSxcbiAgICAgICAgICBbNywgMywgMywgMHg1XSxcbiAgICAgICAgICBbMTUsIDYsIDEsIDB4M2FdLFxuICAgICAgICAgIFsxNywgNiwgMiwgMHgzYl0sXG4gICAgICAgICAgWzIxLCA2LCAzLCAweDNjXSxcbiAgICAgICAgICBbMjksIDYsIDQsIDB4M2RdLFxuICAgICAgICAgIFs0NSwgNiwgNSwgMHgzZV0sXG4gICAgICAgICAgWzc3LCA3LCA2LCAweDdlXSxcbiAgICAgICAgICBbMTQxLCA3LCAzMiwgMHg3Zl0sIC8vIHVwcGVyXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNDpcbiAgICAgICAgbGluZXMgPSBbXG4gICAgICAgICAgWy0yLCAzLCAwLCAweDRdLFxuICAgICAgICAgIFstMSwgMywgMCwgMHg1XSxcbiAgICAgICAgICBbMCwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMSwgMywgMCwgMHg2XSxcbiAgICAgICAgICBbMiwgMywgMCwgMHg3XSxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE1OlxuICAgICAgICBsaW5lcyA9IFtcbiAgICAgICAgICBbLTI0LCA3LCA0LCAweDdjXSxcbiAgICAgICAgICBbLTgsIDYsIDIsIDB4M2NdLFxuICAgICAgICAgIFstNCwgNSwgMSwgMHgxY10sXG4gICAgICAgICAgWy0yLCA0LCAwLCAweGNdLFxuICAgICAgICAgIFstMSwgMywgMCwgMHg0XSxcbiAgICAgICAgICBbMCwgMSwgMCwgMHgwXSxcbiAgICAgICAgICBbMSwgMywgMCwgMHg1XSxcbiAgICAgICAgICBbMiwgNCwgMCwgMHhkXSxcbiAgICAgICAgICBbMywgNSwgMSwgMHgxZF0sXG4gICAgICAgICAgWzUsIDYsIDIsIDB4M2RdLFxuICAgICAgICAgIFs5LCA3LCA0LCAweDdkXSxcbiAgICAgICAgICBbLTI1LCA3LCAzMiwgMHg3ZSwgXCJsb3dlclwiXSxcbiAgICAgICAgICBbMjUsIDcsIDMyLCAweDdmXSwgLy8gdXBwZXJcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBsaW5lc1tpXSA9IG5ldyBIdWZmbWFuTGluZShsaW5lc1tpXSk7XG4gICAgfVxuICAgIHRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgdHJ1ZSk7XG4gICAgc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdID0gdGFibGU7XG4gICAgcmV0dXJuIHRhYmxlO1xuICB9XG5cbiAgZnVuY3Rpb24gUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICB0aGlzLnBvc2l0aW9uID0gc3RhcnQ7XG4gICAgdGhpcy5zaGlmdCA9IC0xO1xuICAgIHRoaXMuY3VycmVudEJ5dGUgPSAwO1xuICB9XG5cbiAgUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICByZWFkQml0KCkge1xuICAgICAgaWYgKHRoaXMuc2hpZnQgPCAwKSB7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJlbmQgb2YgZGF0YSB3aGlsZSByZWFkaW5nIGJpdFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCeXRlID0gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107XG4gICAgICAgIHRoaXMuc2hpZnQgPSA3O1xuICAgICAgfVxuICAgICAgY29uc3QgYml0ID0gKHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCkgJiAxO1xuICAgICAgdGhpcy5zaGlmdC0tO1xuICAgICAgcmV0dXJuIGJpdDtcbiAgICB9LFxuXG4gICAgcmVhZEJpdHMobnVtQml0cykge1xuICAgICAgbGV0IHJlc3VsdCA9IDAsXG4gICAgICAgIGk7XG4gICAgICBmb3IgKGkgPSBudW1CaXRzIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgcmVzdWx0IHw9IHRoaXMucmVhZEJpdCgpIDw8IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBieXRlQWxpZ24oKSB7XG4gICAgICB0aGlzLnNoaWZ0ID0gLTE7XG4gICAgfSxcblxuICAgIG5leHQoKSB7XG4gICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSB0aGlzLmVuZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107XG4gICAgfSxcbiAgfTtcblxuICBmdW5jdGlvbiBnZXRDdXN0b21IdWZmbWFuVGFibGUoaW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcykge1xuICAgIC8vIFJldHVybnMgYSBUYWJsZXMgc2VnbWVudCB0aGF0IGhhcyBiZWVuIGVhcmxpZXIgZGVjb2RlZC5cbiAgICAvLyBTZWUgNy40LjIuMS42IChzeW1ib2wgZGljdGlvbmFyeSkgb3IgNy40LjMuMS42ICh0ZXh0IHJlZ2lvbikuXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmVmZXJyZWRUby5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IGN1c3RvbVRhYmxlc1tyZWZlcnJlZFRvW2ldXTtcbiAgICAgIGlmICh0YWJsZSkge1xuICAgICAgICBpZiAoaW5kZXggPT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0YWJsZTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJjYW4ndCBmaW5kIGN1c3RvbSBIdWZmbWFuIHRhYmxlXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMoXG4gICAgdGV4dFJlZ2lvbixcbiAgICByZWZlcnJlZFRvLFxuICAgIGN1c3RvbVRhYmxlcyxcbiAgICBudW1iZXJPZlN5bWJvbHMsXG4gICAgcmVhZGVyXG4gICkge1xuICAgIC8vIDcuNC4zLjEuNyBTeW1ib2wgSUQgSHVmZm1hbiB0YWJsZSBkZWNvZGluZ1xuXG4gICAgLy8gUmVhZCBjb2RlIGxlbmd0aHMgZm9yIFJVTkNPREVzIDAuLi4zNC5cbiAgICBjb25zdCBjb2RlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDM0OyBpKyspIHtcbiAgICAgIGNvbnN0IGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7XG4gICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTtcbiAgICB9XG4gICAgLy8gQXNzaWduIEh1ZmZtYW4gY29kZXMgZm9yIFJVTkNPREVzLlxuICAgIGNvbnN0IHJ1bkNvZGVzVGFibGUgPSBuZXcgSHVmZm1hblRhYmxlKGNvZGVzLCBmYWxzZSk7XG5cbiAgICAvLyBSZWFkIGEgSHVmZm1hbiBjb2RlIHVzaW5nIHRoZSBhc3NpZ25tZW50IGFib3ZlLlxuICAgIC8vIEludGVycHJldCB0aGUgUlVOQ09ERSBjb2RlcyBhbmQgdGhlIGFkZGl0aW9uYWwgYml0cyAoaWYgYW55KS5cbiAgICBjb2Rlcy5sZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZTeW1ib2xzOyApIHtcbiAgICAgIGNvbnN0IGNvZGVMZW5ndGggPSBydW5Db2Rlc1RhYmxlLmRlY29kZShyZWFkZXIpO1xuICAgICAgaWYgKGNvZGVMZW5ndGggPj0gMzIpIHtcbiAgICAgICAgbGV0IHJlcGVhdGVkTGVuZ3RoLCBudW1iZXJPZlJlcGVhdHMsIGo7XG4gICAgICAgIHN3aXRjaCAoY29kZUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygyKSArIDM7XG4gICAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IGNvZGVzW2kgLSAxXS5wcmVmaXhMZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMztcbiAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTtcbiAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgY29kZSBsZW5ndGggaW4gc3ltYm9sIElEIHRhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZlJlcGVhdHM7IGorKykge1xuICAgICAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCByZXBlYXRlZExlbmd0aCwgMCwgMF0pKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCBjb2RlTGVuZ3RoLCAwLCAwXSkpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJlYWRlci5ieXRlQWxpZ24oKTtcbiAgICBjb25zdCBzeW1ib2xJRFRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShjb2RlcywgZmFsc2UpO1xuXG4gICAgLy8gNy40LjMuMS42IFRleHQgcmVnaW9uIHNlZ21lbnQgSHVmZm1hbiB0YWJsZSBzZWxlY3Rpb25cblxuICAgIGxldCBjdXN0b21JbmRleCA9IDAsXG4gICAgICB0YWJsZUZpcnN0UyxcbiAgICAgIHRhYmxlRGVsdGFTLFxuICAgICAgdGFibGVEZWx0YVQ7XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkZTKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRhYmxlRmlyc3RTID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5GUyArIDYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVGaXJzdFMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoXG4gICAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgICBjdXN0b21UYWJsZXNcbiAgICAgICAgKTtcbiAgICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgSHVmZm1hbiBGUyBzZWxlY3RvclwiKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkRTKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRhYmxlRGVsdGFTID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5EUyArIDgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVEZWx0YVMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoXG4gICAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgICBjdXN0b21UYWJsZXNcbiAgICAgICAgKTtcbiAgICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihcImludmFsaWQgSHVmZm1hbiBEUyBzZWxlY3RvclwiKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkRUKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5EVCArIDExKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICAgIGN1c3RvbUluZGV4LFxuICAgICAgICAgIHJlZmVycmVkVG8sXG4gICAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICAgICk7XG4gICAgICAgIGN1c3RvbUluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJpbnZhbGlkIEh1ZmZtYW4gRFQgc2VsZWN0b3JcIik7XG4gICAgfVxuXG4gICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCkge1xuICAgICAgLy8gTG9hZCB0YWJsZXMgUkRXLCBSREgsIFJEWCBhbmQgUkRZLlxuICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoXCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzeW1ib2xJRFRhYmxlLFxuICAgICAgdGFibGVGaXJzdFMsXG4gICAgICB0YWJsZURlbHRhUyxcbiAgICAgIHRhYmxlRGVsdGFULFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhcbiAgICBkaWN0aW9uYXJ5LFxuICAgIHJlZmVycmVkVG8sXG4gICAgY3VzdG9tVGFibGVzXG4gICkge1xuICAgIC8vIDcuNC4yLjEuNiBTeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IEh1ZmZtYW4gdGFibGUgc2VsZWN0aW9uXG5cbiAgICBsZXQgY3VzdG9tSW5kZXggPSAwLFxuICAgICAgdGFibGVEZWx0YUhlaWdodCxcbiAgICAgIHRhYmxlRGVsdGFXaWR0aDtcbiAgICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldFN0YW5kYXJkVGFibGUoZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciArIDQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgICApO1xuICAgICAgICBjdXN0b21JbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBIdWZmbWFuIERIIHNlbGVjdG9yXCIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3Rvcikge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IgKyAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgICByZWZlcnJlZFRvLFxuICAgICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgICApO1xuICAgICAgICBjdXN0b21JbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKFwiaW52YWxpZCBIdWZmbWFuIERXIHNlbGVjdG9yXCIpO1xuICAgIH1cblxuICAgIGxldCB0YWJsZUJpdG1hcFNpemUsIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzO1xuICAgIGlmIChkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3Rvcikge1xuICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKFxuICAgICAgICBjdXN0b21JbmRleCxcbiAgICAgICAgcmVmZXJyZWRUbyxcbiAgICAgICAgY3VzdG9tVGFibGVzXG4gICAgICApO1xuICAgICAgY3VzdG9tSW5kZXgrKztcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVCaXRtYXBTaXplID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTtcbiAgICB9XG5cbiAgICBpZiAoZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yKSB7XG4gICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShcbiAgICAgICAgY3VzdG9tSW5kZXgsXG4gICAgICAgIHJlZmVycmVkVG8sXG4gICAgICAgIGN1c3RvbVRhYmxlc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMgPSBnZXRTdGFuZGFyZFRhYmxlKDEpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZURlbHRhSGVpZ2h0LFxuICAgICAgdGFibGVEZWx0YVdpZHRoLFxuICAgICAgdGFibGVCaXRtYXBTaXplLFxuICAgICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRVbmNvbXByZXNzZWRCaXRtYXAocmVhZGVyLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgYml0bWFwID0gW107XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpO1xuICAgICAgfVxuICAgICAgcmVhZGVyLmJ5dGVBbGlnbigpO1xuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlTU1SQml0bWFwKGlucHV0LCB3aWR0aCwgaGVpZ2h0LCBlbmRPZkJsb2NrKSB7XG4gICAgLy8gTU1SIGlzIHRoZSBzYW1lIGNvbXByZXNzaW9uIGFsZ29yaXRobSBhcyB0aGUgUERGIGZpbHRlclxuICAgIC8vIENDSVRURmF4RGVjb2RlIHdpdGggL0sgLTEuXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgSzogLTEsXG4gICAgICBDb2x1bW5zOiB3aWR0aCxcbiAgICAgIFJvd3M6IGhlaWdodCxcbiAgICAgIEJsYWNrSXMxOiB0cnVlLFxuICAgICAgRW5kT2ZCbG9jazogZW5kT2ZCbG9jayxcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKGlucHV0LCBwYXJhbXMpO1xuICAgIGNvbnN0IGJpdG1hcCA9IFtdO1xuICAgIGxldCBjdXJyZW50Qnl0ZSxcbiAgICAgIGVvZiA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpO1xuICAgICAgYml0bWFwLnB1c2gocm93KTtcbiAgICAgIGxldCBzaGlmdCA9IC0xO1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIGlmIChzaGlmdCA8IDApIHtcbiAgICAgICAgICBjdXJyZW50Qnl0ZSA9IGRlY29kZXIucmVhZE5leHRDaGFyKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRCeXRlID09PSAtMSkge1xuICAgICAgICAgICAgLy8gU2V0IHRoZSByZXN0IG9mIHRoZSBiaXRzIHRvIHplcm8uXG4gICAgICAgICAgICBjdXJyZW50Qnl0ZSA9IDA7XG4gICAgICAgICAgICBlb2YgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGlmdCA9IDc7XG4gICAgICAgIH1cbiAgICAgICAgcm93W3hdID0gKGN1cnJlbnRCeXRlID4+IHNoaWZ0KSAmIDE7XG4gICAgICAgIHNoaWZ0LS07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVuZE9mQmxvY2sgJiYgIWVvZikge1xuICAgICAgLy8gUmVhZCB1bnRpbCBFT0ZCIGhhcyBiZWVuIGNvbnN1bWVkLlxuICAgICAgY29uc3QgbG9va0ZvckVPRkxpbWl0ID0gNTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va0ZvckVPRkxpbWl0OyBpKyspIHtcbiAgICAgICAgaWYgKGRlY29kZXIucmVhZE5leHRDaGFyKCkgPT09IC0xKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBKYmlnMkltYWdlKCkge31cblxuICBKYmlnMkltYWdlLnByb3RvdHlwZSA9IHtcbiAgICBwYXJzZUNodW5rcyhjaHVua3MpIHtcbiAgICAgIHJldHVybiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcyk7XG4gICAgfSxcblxuICAgIHBhcnNlKGRhdGEpIHtcbiAgICAgIGNvbnN0IHsgaW1nRGF0YSwgd2lkdGgsIGhlaWdodCB9ID0gcGFyc2VKYmlnMihkYXRhKTtcbiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgcmV0dXJuIGltZ0RhdGE7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gSmJpZzJJbWFnZTtcbn0pKCk7XG5cbmV4cG9ydCB7IEpiaWcySW1hZ2UgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE5IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50IG5vLXZhcjogZXJyb3IgKi9cblxuaW1wb3J0IHsgYXNzZXJ0LCBCYXNlRXhjZXB0aW9uLCB3YXJuIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbmZ1bmN0aW9uIGdldExvb2t1cFRhYmxlRmFjdG9yeShpbml0aWFsaXplcikge1xuICBsZXQgbG9va3VwO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChpbml0aWFsaXplcikge1xuICAgICAgbG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGluaXRpYWxpemVyKGxvb2t1cCk7XG4gICAgICBpbml0aWFsaXplciA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBsb29rdXA7XG4gIH07XG59XG5cbmNsYXNzIE1pc3NpbmdEYXRhRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKGJlZ2luLCBlbmQpIHtcbiAgICBzdXBlcihgTWlzc2luZyBkYXRhIFske2JlZ2lufSwgJHtlbmR9KWApO1xuICAgIHRoaXMuYmVnaW4gPSBiZWdpbjtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxufVxuXG5jbGFzcyBYUmVmRW50cnlFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbmNsYXNzIFhSZWZQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge31cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGluaGVyaXRhYmxlIHByb3BlcnR5LlxuICpcbiAqIElmIHRoZSBQREYgc3BlY2lmaWNhdGlvbiBleHBsaWNpdGx5IGxpc3RzIGEgcHJvcGVydHkgaW4gYSBkaWN0aW9uYXJ5IGFzXG4gKiBpbmhlcml0YWJsZSwgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG1heSBiZSBwcmVzZW50IGluIHRoZSBkaWN0aW9uYXJ5XG4gKiBpdHNlbGYgb3IgaW4gb25lIG9yIG1vcmUgcGFyZW50cyBvZiB0aGUgZGljdGlvbmFyeS5cbiAqXG4gKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgdHJlZSwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSxcbiAqIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSBpcyByZXR1cm5lZCBvciwgaWYgYHN0b3BXaGVuRm91bmRgIGlzIGBmYWxzZWAsIGEgbGlzdFxuICogb2YgdmFsdWVzIGlzIHJldHVybmVkLiBUbyBhdm9pZCBpbmZpbml0ZSBsb29wcywgdGhlIHRyYXZlcnNhbCBpcyBzdG9wcGVkIHdoZW5cbiAqIHRoZSBsb29wIGxpbWl0IGlzIHJlYWNoZWQuXG4gKlxuICogQHBhcmFtIHtEaWN0fSBkaWN0IC0gRGljdGlvbmFyeSBmcm9tIHdoZXJlIHRvIHN0YXJ0IHRoZSB0cmF2ZXJzYWwuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZmluZCB0aGUgdmFsdWUgZm9yLlxuICogQHBhcmFtIHtib29sZWFufSBnZXRBcnJheSAtIFdoZXRoZXIgb3Igbm90IHRoZSB2YWx1ZSBzaG91bGQgYmUgZmV0Y2hlZCBhcyBhblxuICogICBhcnJheS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RvcFdoZW5Gb3VuZCAtIFdoZXRoZXIgb3Igbm90IHRvIHN0b3AgdGhlIHRyYXZlcnNhbCB3aGVuXG4gKiAgIHRoZSBrZXkgaXMgZm91bmQuIElmIHNldCB0byBgZmFsc2VgLCB3ZSBhbHdheXMgd2FsayB1cCB0aGUgZW50aXJlIHBhcmVudFxuICogICBjaGFpbiwgZm9yIGV4YW1wbGUgdG8gYmUgYWJsZSB0byBmaW5kIGBcXFJlc291cmNlc2AgcGxhY2VkIG9uIG11bHRpcGxlXG4gKiAgIGxldmVscyBvZiB0aGUgdHJlZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICovXG5mdW5jdGlvbiBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHtcbiAgZGljdCxcbiAga2V5LFxuICBnZXRBcnJheSA9IGZhbHNlLFxuICBzdG9wV2hlbkZvdW5kID0gdHJ1ZSxcbn0pIHtcbiAgY29uc3QgTE9PUF9MSU1JVCA9IDEwMDtcbiAgbGV0IGxvb3BDb3VudCA9IDA7XG4gIGxldCB2YWx1ZXM7XG5cbiAgd2hpbGUgKGRpY3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldEFycmF5ID8gZGljdC5nZXRBcnJheShrZXkpIDogZGljdC5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHN0b3BXaGVuRm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgICAgdmFsdWVzID0gW107XG4gICAgICB9XG4gICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICgrK2xvb3BDb3VudCA+IExPT1BfTElNSVQpIHtcbiAgICAgIHdhcm4oYGdldEluaGVyaXRhYmxlUHJvcGVydHk6IG1heGltdW0gbG9vcCBjb3VudCBleGNlZWRlZCBmb3IgXCIke2tleX1cImApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRpY3QgPSBkaWN0LmdldChcIlBhcmVudFwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFJPTUFOX05VTUJFUl9NQVAgPSBbXG4gIFwiXCIsIFwiQ1wiLCBcIkNDXCIsIFwiQ0NDXCIsIFwiQ0RcIiwgXCJEXCIsIFwiRENcIiwgXCJEQ0NcIiwgXCJEQ0NDXCIsIFwiQ01cIixcbiAgXCJcIiwgXCJYXCIsIFwiWFhcIiwgXCJYWFhcIiwgXCJYTFwiLCBcIkxcIiwgXCJMWFwiLCBcIkxYWFwiLCBcIkxYWFhcIiwgXCJYQ1wiLFxuICBcIlwiLCBcIklcIiwgXCJJSVwiLCBcIklJSVwiLCBcIklWXCIsIFwiVlwiLCBcIlZJXCIsIFwiVklJXCIsIFwiVklJSVwiLCBcIklYXCJcbl07XG5cbi8qKlxuICogQ29udmVydHMgcG9zaXRpdmUgaW50ZWdlcnMgdG8gKHVwcGVyIGNhc2UpIFJvbWFuIG51bWVyYWxzLlxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciAtIFRoZSBudW1iZXIgdGhhdCBzaG91bGQgYmUgY29udmVydGVkLlxuICogQHBhcmFtIHtib29sZWFufSBsb3dlckNhc2UgLSBJbmRpY2F0ZXMgaWYgdGhlIHJlc3VsdCBzaG91bGQgYmUgY29udmVydGVkXG4gKiAgIHRvIGxvd2VyIGNhc2UgbGV0dGVycy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSByZXN1bHRpbmcgUm9tYW4gbnVtYmVyLlxuICovXG5mdW5jdGlvbiB0b1JvbWFuTnVtZXJhbHMobnVtYmVyLCBsb3dlckNhc2UgPSBmYWxzZSkge1xuICBhc3NlcnQoXG4gICAgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpICYmIG51bWJlciA+IDAsXG4gICAgXCJUaGUgbnVtYmVyIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIuXCJcbiAgKTtcbiAgY29uc3Qgcm9tYW5CdWYgPSBbXTtcbiAgbGV0IHBvcztcbiAgLy8gVGhvdXNhbmRzXG4gIHdoaWxlIChudW1iZXIgPj0gMTAwMCkge1xuICAgIG51bWJlciAtPSAxMDAwO1xuICAgIHJvbWFuQnVmLnB1c2goXCJNXCIpO1xuICB9XG4gIC8vIEh1bmRyZWRzXG4gIHBvcyA9IChudW1iZXIgLyAxMDApIHwgMDtcbiAgbnVtYmVyICU9IDEwMDtcbiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQW3Bvc10pO1xuICAvLyBUZW5zXG4gIHBvcyA9IChudW1iZXIgLyAxMCkgfCAwO1xuICBudW1iZXIgJT0gMTA7XG4gIHJvbWFuQnVmLnB1c2goUk9NQU5fTlVNQkVSX01BUFsxMCArIHBvc10pO1xuICAvLyBPbmVzXG4gIHJvbWFuQnVmLnB1c2goUk9NQU5fTlVNQkVSX01BUFsyMCArIG51bWJlcl0pO1xuXG4gIGNvbnN0IHJvbWFuU3RyID0gcm9tYW5CdWYuam9pbihcIlwiKTtcbiAgcmV0dXJuIGxvd2VyQ2FzZSA/IHJvbWFuU3RyLnRvTG93ZXJDYXNlKCkgOiByb21hblN0cjtcbn1cblxuLy8gQ2FsY3VsYXRlIHRoZSBiYXNlIDIgbG9nYXJpdGhtIG9mIHRoZSBudW1iZXIgYHhgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGVcbi8vIG5hdGl2ZSBmdW5jdGlvbiBpbiB0aGUgc2Vuc2UgdGhhdCBpdCByZXR1cm5zIHRoZSBjZWlsaW5nIHZhbHVlIGFuZCB0aGF0IGl0XG4vLyByZXR1cm5zIDAgaW5zdGVhZCBvZiBgSW5maW5pdHlgL2BOYU5gIGZvciBgeGAgdmFsdWVzIHNtYWxsZXIgdGhhbi9lcXVhbCB0byAwLlxuZnVuY3Rpb24gbG9nMih4KSB7XG4gIGlmICh4IDw9IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nMih4KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQ4KGRhdGEsIG9mZnNldCkge1xuICByZXR1cm4gKGRhdGFbb2Zmc2V0XSA8PCAyNCkgPj4gMjQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KSB7XG4gIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDgpIHwgZGF0YVtvZmZzZXQgKyAxXTtcbn1cblxuZnVuY3Rpb24gcmVhZFVpbnQzMihkYXRhLCBvZmZzZXQpIHtcbiAgcmV0dXJuIChcbiAgICAoKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICAgKGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAgIChkYXRhW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAgIGRhdGFbb2Zmc2V0ICsgM10pID4+PlxuICAgIDBcbiAgKTtcbn1cblxuLy8gQ2hlY2tzIGlmIGNoIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6IFNQQUNFLCBUQUIsIENSIG9yIExGLlxuZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7XG4gIHJldHVybiBjaCA9PT0gMHgyMCB8fCBjaCA9PT0gMHgwOSB8fCBjaCA9PT0gMHgwZCB8fCBjaCA9PT0gMHgwYTtcbn1cblxuZXhwb3J0IHtcbiAgZ2V0TG9va3VwVGFibGVGYWN0b3J5LFxuICBNaXNzaW5nRGF0YUV4Y2VwdGlvbixcbiAgWFJlZkVudHJ5RXhjZXB0aW9uLFxuICBYUmVmUGFyc2VFeGNlcHRpb24sXG4gIGdldEluaGVyaXRhYmxlUHJvcGVydHksXG4gIHRvUm9tYW5OdW1lcmFscyxcbiAgbG9nMixcbiAgcmVhZEludDgsXG4gIHJlYWRVaW50MTYsXG4gIHJlYWRVaW50MzIsXG4gIGlzV2hpdGVTcGFjZSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludCBuby12YXI6IGVycm9yICovXG5cbi8vIFRhYmxlIEMtMlxuY29uc3QgUWVUYWJsZSA9IFtcbiAgeyBxZTogMHg1NjAxLCBubXBzOiAxLCBubHBzOiAxLCBzd2l0Y2hGbGFnOiAxIH0sXG4gIHsgcWU6IDB4MzQwMSwgbm1wczogMiwgbmxwczogNiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDE4MDEsIG5tcHM6IDMsIG5scHM6IDksIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwYWMxLCBubXBzOiA0LCBubHBzOiAxMiwgc3dpdGNoRmxhZzogMCB9LFxuICB7IHFlOiAweDA1MjEsIG5tcHM6IDUsIG5scHM6IDI5LCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4MDIyMSwgbm1wczogMzgsIG5scHM6IDMzLCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4NTYwMSwgbm1wczogNywgbmxwczogNiwgc3dpdGNoRmxhZzogMSB9LFxuICB7IHFlOiAweDU0MDEsIG5tcHM6IDgsIG5scHM6IDE0LCBzd2l0Y2hGbGFnOiAwIH0sXG4gIHsgcWU6IDB4NDgwMSwgbm1wczogOSwgbmxwczogMTQsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgzODAxLCBubXBzOiAxMCwgbmxwczogMTQsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgzMDAxLCBubXBzOiAxMSwgbmxwczogMTcsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgyNDAxLCBubXBzOiAxMiwgbmxwczogMTgsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgxYzAxLCBubXBzOiAxMywgbmxwczogMjAsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgxNjAxLCBubXBzOiAyOSwgbmxwczogMjEsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg1NjAxLCBubXBzOiAxNSwgbmxwczogMTQsIHN3aXRjaEZsYWc6IDEgfSxcbiAgeyBxZTogMHg1NDAxLCBubXBzOiAxNiwgbmxwczogMTQsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg1MTAxLCBubXBzOiAxNywgbmxwczogMTUsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg0ODAxLCBubXBzOiAxOCwgbmxwczogMTYsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgzODAxLCBubXBzOiAxOSwgbmxwczogMTcsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgzNDAxLCBubXBzOiAyMCwgbmxwczogMTgsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgzMDAxLCBubXBzOiAyMSwgbmxwczogMTksIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgyODAxLCBubXBzOiAyMiwgbmxwczogMTksIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgyNDAxLCBubXBzOiAyMywgbmxwczogMjAsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgyMjAxLCBubXBzOiAyNCwgbmxwczogMjEsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgxYzAxLCBubXBzOiAyNSwgbmxwczogMjIsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgxODAxLCBubXBzOiAyNiwgbmxwczogMjMsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgxNjAxLCBubXBzOiAyNywgbmxwczogMjQsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgxNDAxLCBubXBzOiAyOCwgbmxwczogMjUsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgxMjAxLCBubXBzOiAyOSwgbmxwczogMjYsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgxMTAxLCBubXBzOiAzMCwgbmxwczogMjcsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwYWMxLCBubXBzOiAzMSwgbmxwczogMjgsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwOWMxLCBubXBzOiAzMiwgbmxwczogMjksIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwOGExLCBubXBzOiAzMywgbmxwczogMzAsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwNTIxLCBubXBzOiAzNCwgbmxwczogMzEsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwNDQxLCBubXBzOiAzNSwgbmxwczogMzIsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMmExLCBubXBzOiAzNiwgbmxwczogMzMsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMjIxLCBubXBzOiAzNywgbmxwczogMzQsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMTQxLCBubXBzOiAzOCwgbmxwczogMzUsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMTExLCBubXBzOiAzOSwgbmxwczogMzYsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMDg1LCBubXBzOiA0MCwgbmxwczogMzcsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMDQ5LCBubXBzOiA0MSwgbmxwczogMzgsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMDI1LCBubXBzOiA0MiwgbmxwczogMzksIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMDE1LCBubXBzOiA0MywgbmxwczogNDAsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMDA5LCBubXBzOiA0NCwgbmxwczogNDEsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMDA1LCBubXBzOiA0NSwgbmxwczogNDIsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHgwMDAxLCBubXBzOiA0NSwgbmxwczogNDMsIHN3aXRjaEZsYWc6IDAgfSxcbiAgeyBxZTogMHg1NjAxLCBubXBzOiA0NiwgbmxwczogNDYsIHN3aXRjaEZsYWc6IDAgfSxcbl07XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBRTSBDb2RlciBkZWNvZGluZyBhcyBkZWZpbmVkIGluXG4gKiAgIEpQRUcgMjAwMCBQYXJ0IEkgRmluYWwgQ29tbWl0dGVlIERyYWZ0IFZlcnNpb24gMS4wXG4gKiAgIEFubmV4IEMuMyBBcml0aG1ldGljIGRlY29kaW5nIHByb2NlZHVyZVxuICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuanBlZy5vcmcvcHVibGljL2ZjZDE1NDQ0LTEucGRmXG4gKlxuICogVGhlIGFyaXRobWV0aWMgZGVjb2RlciBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY29udGV4dCBtb2RlbHMgdG8gZGVjb2RlXG4gKiBKUEVHMjAwMCBhbmQgSkJJRzIgc3RyZWFtcy5cbiAqL1xuY2xhc3MgQXJpdGhtZXRpY0RlY29kZXIge1xuICAvLyBDLjMuNSBJbml0aWFsaXNhdGlvbiBvZiB0aGUgZGVjb2RlciAoSU5JVERFQylcbiAgY29uc3RydWN0b3IoZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5icCA9IHN0YXJ0O1xuICAgIHRoaXMuZGF0YUVuZCA9IGVuZDtcblxuICAgIHRoaXMuY2hpZ2ggPSBkYXRhW3N0YXJ0XTtcbiAgICB0aGlzLmNsb3cgPSAwO1xuXG4gICAgdGhpcy5ieXRlSW4oKTtcblxuICAgIHRoaXMuY2hpZ2ggPSAoKHRoaXMuY2hpZ2ggPDwgNykgJiAweGZmZmYpIHwgKCh0aGlzLmNsb3cgPj4gOSkgJiAweDdmKTtcbiAgICB0aGlzLmNsb3cgPSAodGhpcy5jbG93IDw8IDcpICYgMHhmZmZmO1xuICAgIHRoaXMuY3QgLT0gNztcbiAgICB0aGlzLmEgPSAweDgwMDA7XG4gIH1cblxuICAvLyBDLjMuNCBDb21wcmVzc2VkIGRhdGEgaW5wdXQgKEJZVEVJTilcbiAgYnl0ZUluKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgbGV0IGJwID0gdGhpcy5icDtcblxuICAgIGlmIChkYXRhW2JwXSA9PT0gMHhmZikge1xuICAgICAgaWYgKGRhdGFbYnAgKyAxXSA+IDB4OGYpIHtcbiAgICAgICAgdGhpcy5jbG93ICs9IDB4ZmYwMDtcbiAgICAgICAgdGhpcy5jdCA9IDg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicCsrO1xuICAgICAgICB0aGlzLmNsb3cgKz0gZGF0YVticF0gPDwgOTtcbiAgICAgICAgdGhpcy5jdCA9IDc7XG4gICAgICAgIHRoaXMuYnAgPSBicDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnArKztcbiAgICAgIHRoaXMuY2xvdyArPSBicCA8IHRoaXMuZGF0YUVuZCA/IGRhdGFbYnBdIDw8IDggOiAweGZmMDA7XG4gICAgICB0aGlzLmN0ID0gODtcbiAgICAgIHRoaXMuYnAgPSBicDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvdyA+IDB4ZmZmZikge1xuICAgICAgdGhpcy5jaGlnaCArPSB0aGlzLmNsb3cgPj4gMTY7XG4gICAgICB0aGlzLmNsb3cgJj0gMHhmZmZmO1xuICAgIH1cbiAgfVxuXG4gIC8vIEMuMy4yIERlY29kaW5nIGEgZGVjaXNpb24gKERFQ09ERSlcbiAgcmVhZEJpdChjb250ZXh0cywgcG9zKSB7XG4gICAgLy8gQ29udGV4dHMgYXJlIHBhY2tlZCBpbnRvIDEgYnl0ZTpcbiAgICAvLyBoaWdoZXN0IDcgYml0cyBjYXJyeSBjeC5pbmRleCwgbG93ZXN0IGJpdCBjYXJyaWVzIGN4Lm1wc1xuICAgIGxldCBjeF9pbmRleCA9IGNvbnRleHRzW3Bvc10gPj4gMSxcbiAgICAgIGN4X21wcyA9IGNvbnRleHRzW3Bvc10gJiAxO1xuICAgIGNvbnN0IHFlVGFibGVJY3ggPSBRZVRhYmxlW2N4X2luZGV4XTtcbiAgICBjb25zdCBxZUljeCA9IHFlVGFibGVJY3gucWU7XG4gICAgbGV0IGQ7XG4gICAgbGV0IGEgPSB0aGlzLmEgLSBxZUljeDtcblxuICAgIGlmICh0aGlzLmNoaWdoIDwgcWVJY3gpIHtcbiAgICAgIC8vIGV4Y2hhbmdlTHBzXG4gICAgICBpZiAoYSA8IHFlSWN4KSB7XG4gICAgICAgIGEgPSBxZUljeDtcbiAgICAgICAgZCA9IGN4X21wcztcbiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5tcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhID0gcWVJY3g7XG4gICAgICAgIGQgPSAxIF4gY3hfbXBzO1xuICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7XG4gICAgICAgICAgY3hfbXBzID0gZDtcbiAgICAgICAgfVxuICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwcztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGlnaCAtPSBxZUljeDtcbiAgICAgIGlmICgoYSAmIDB4ODAwMCkgIT09IDApIHtcbiAgICAgICAgdGhpcy5hID0gYTtcbiAgICAgICAgcmV0dXJuIGN4X21wcztcbiAgICAgIH1cbiAgICAgIC8vIGV4Y2hhbmdlTXBzXG4gICAgICBpZiAoYSA8IHFlSWN4KSB7XG4gICAgICAgIGQgPSAxIF4gY3hfbXBzO1xuICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7XG4gICAgICAgICAgY3hfbXBzID0gZDtcbiAgICAgICAgfVxuICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGQgPSBjeF9tcHM7XG4gICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDLjMuMyByZW5vcm1EO1xuICAgIGRvIHtcbiAgICAgIGlmICh0aGlzLmN0ID09PSAwKSB7XG4gICAgICAgIHRoaXMuYnl0ZUluKCk7XG4gICAgICB9XG5cbiAgICAgIGEgPDw9IDE7XG4gICAgICB0aGlzLmNoaWdoID0gKCh0aGlzLmNoaWdoIDw8IDEpICYgMHhmZmZmKSB8ICgodGhpcy5jbG93ID4+IDE1KSAmIDEpO1xuICAgICAgdGhpcy5jbG93ID0gKHRoaXMuY2xvdyA8PCAxKSAmIDB4ZmZmZjtcbiAgICAgIHRoaXMuY3QtLTtcbiAgICB9IHdoaWxlICgoYSAmIDB4ODAwMCkgPT09IDApO1xuICAgIHRoaXMuYSA9IGE7XG5cbiAgICBjb250ZXh0c1twb3NdID0gKGN4X2luZGV4IDw8IDEpIHwgY3hfbXBzO1xuICAgIHJldHVybiBkO1xuICB9XG59XG5cbmV4cG9ydCB7IEFyaXRobWV0aWNEZWNvZGVyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIENvcHlyaWdodCAxOTk2LTIwMDMgR2x5cGggJiBDb2csIExMQ1xuICpcbiAqIFRoZSBDQ0lUVCBzdHJlYW0gaW1wbGVtZW50YXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIEphdmFTY3JpcHQgcG9ydFxuICogb2YgWFBERidzIGltcGxlbWVudGF0aW9uLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZVxuICogbGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENDSVRURmF4RGVjb2RlclNvdXJjZVxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gbmV4dCAtIE1ldGhvZCB0aGF0IHJldHVybiBvbmUgYnl0ZSBvZiBkYXRhIGZvciBkZWNvZGluZyxcbiAqICAgb3IgLTEgd2hlbiBFT0YgaXMgcmVhY2hlZC5cbiAqL1xuXG5pbXBvcnQgeyBpbmZvIH0gZnJvbSBcIi4uL3NoYXJlZC91dGlsLmpzXCI7XG5cbmNvbnN0IENDSVRURmF4RGVjb2RlciA9IChmdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoKSB7XG4gIGNvbnN0IGNjaXR0RU9MID0gLTI7XG4gIGNvbnN0IGNjaXR0RU9GID0gLTE7XG4gIGNvbnN0IHR3b0RpbVBhc3MgPSAwO1xuICBjb25zdCB0d29EaW1Ib3JpeiA9IDE7XG4gIGNvbnN0IHR3b0RpbVZlcnQwID0gMjtcbiAgY29uc3QgdHdvRGltVmVydFIxID0gMztcbiAgY29uc3QgdHdvRGltVmVydEwxID0gNDtcbiAgY29uc3QgdHdvRGltVmVydFIyID0gNTtcbiAgY29uc3QgdHdvRGltVmVydEwyID0gNjtcbiAgY29uc3QgdHdvRGltVmVydFIzID0gNztcbiAgY29uc3QgdHdvRGltVmVydEwzID0gODtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3QgdHdvRGltVGFibGUgPSBbXG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDB4XG4gICAgWzcsIHR3b0RpbVZlcnRMM10sICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwXG4gICAgWzcsIHR3b0RpbVZlcnRSM10sICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExXG4gICAgWzYsIHR3b0RpbVZlcnRMMl0sIFs2LCB0d29EaW1WZXJ0TDJdLCAvLyAwMDAwMTB4XG4gICAgWzYsIHR3b0RpbVZlcnRSMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCAvLyAwMDAwMTF4XG4gICAgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sICAgICAvLyAwMDAxeHh4XG4gICAgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sXG4gICAgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sXG4gICAgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgICAvLyAwMDF4eHh4XG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltSG9yaXpdLCBbMywgdHdvRGltSG9yaXpdLFxuICAgIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sXG4gICAgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIC8vIDAxMHh4eHhcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLFxuICAgIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSxcbiAgICBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCAvLyAwMTF4eHh4XG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSxcbiAgICBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sXG4gICAgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sICAgLy8gMXh4eHh4eFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF0sXG4gICAgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSxcbiAgICBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLFxuICAgIFsxLCB0d29EaW1WZXJ0MF0sIFsxLCB0d29EaW1WZXJ0MF1cbiAgXTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3Qgd2hpdGVUYWJsZTEgPSBbXG4gICAgWy0xLCAtMV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwXG4gICAgWzEyLCBjY2l0dEVPTF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxXG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDF4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIC8vIDAwMXh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIC8vIDAxMHh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIC8vIDAxMXh4XG4gICAgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgICAgICAgICAgICAgICAgIC8vIDEwMDB4XG4gICAgWzEyLCAxOTg0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEwMDEwXG4gICAgWzEyLCAyMDQ4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEwMDExXG4gICAgWzEyLCAyMTEyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEwMTAwXG4gICAgWzEyLCAyMTc2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEwMTAxXG4gICAgWzEyLCAyMjQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEwMTEwXG4gICAgWzEyLCAyMzA0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEwMTExXG4gICAgWzExLCAxODU2XSwgWzExLCAxODU2XSwgICAgICAgICAgICAgICAgIC8vIDExMDB4XG4gICAgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgICAgICAgICAgICAgICAgIC8vIDExMDF4XG4gICAgWzEyLCAyMzY4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExMTAwXG4gICAgWzEyLCAyNDMyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExMTAxXG4gICAgWzEyLCAyNDk2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExMTEwXG4gICAgWzEyLCAyNTYwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExMTExXG4gIF07XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IHdoaXRlVGFibGUyID0gW1xuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgLy8gMDAwMDAwMHh4XG4gICAgWzgsIDI5XSwgWzgsIDI5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMHhcbiAgICBbOCwgMzBdLCBbOCwgMzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExeFxuICAgIFs4LCA0NV0sIFs4LCA0NV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDB4XG4gICAgWzgsIDQ2XSwgWzgsIDQ2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMXhcbiAgICBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCBbNywgMjJdLCAgICAgICAgIC8vIDAwMDAwMTF4eFxuICAgIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sICAgICAgICAgLy8gMDAwMDEwMHh4XG4gICAgWzgsIDQ3XSwgWzgsIDQ3XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTAxMHhcbiAgICBbOCwgNDhdLCBbOCwgNDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMDExeFxuICAgIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sICAgICAgICAgLy8gMDAwMDExeHh4XG4gICAgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSxcbiAgICBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCBbNywgMjBdLCAgICAgICAgIC8vIDAwMDEwMDB4eFxuICAgIFs4LCAzM10sIFs4LCAzM10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAwMTB4XG4gICAgWzgsIDM0XSwgWzgsIDM0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDAxMXhcbiAgICBbOCwgMzVdLCBbOCwgMzVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMTAweFxuICAgIFs4LCAzNl0sIFs4LCAzNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTAxMDF4XG4gICAgWzgsIDM3XSwgWzgsIDM3XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDExMHhcbiAgICBbOCwgMzhdLCBbOCwgMzhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMTExeFxuICAgIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sICAgICAgICAgLy8gMDAwMTEwMHh4XG4gICAgWzgsIDMxXSwgWzgsIDMxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMTAxMHhcbiAgICBbOCwgMzJdLCBbOCwgMzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDExMDExeFxuICAgIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgICAgICAgICAgICAgLy8gMDAwMTExeHh4XG4gICAgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLFxuICAgIFs2LCAxMl0sIFs2LCAxMl0sIFs2LCAxMl0sIFs2LCAxMl0sICAgICAgICAgLy8gMDAxMDAweHh4XG4gICAgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSwgWzYsIDEyXSxcbiAgICBbOCwgNTNdLCBbOCwgNTNdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAwMTAweFxuICAgIFs4LCA1NF0sIFs4LCA1NF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDAxMDF4XG4gICAgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgWzcsIDI2XSwgICAgICAgICAvLyAwMDEwMDExeHhcbiAgICBbOCwgMzldLCBbOCwgMzldLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAxMDAweFxuICAgIFs4LCA0MF0sIFs4LCA0MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDEwMDF4XG4gICAgWzgsIDQxXSwgWzgsIDQxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMTAxMHhcbiAgICBbOCwgNDJdLCBbOCwgNDJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTAxMDExeFxuICAgIFs4LCA0M10sIFs4LCA0M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMDExMDB4XG4gICAgWzgsIDQ0XSwgWzgsIDQ0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDEwMTEwMXhcbiAgICBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCAgICAgICAgIC8vIDAwMTAxMTF4eFxuICAgIFs3LCAyOF0sIFs3LCAyOF0sIFs3LCAyOF0sIFs3LCAyOF0sICAgICAgICAgLy8gMDAxMTAwMHh4XG4gICAgWzgsIDYxXSwgWzgsIDYxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDExMDAxMHhcbiAgICBbOCwgNjJdLCBbOCwgNjJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTEwMDExeFxuICAgIFs4LCA2M10sIFs4LCA2M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMTAxMDB4XG4gICAgWzgsIDBdLCBbOCwgMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDExMDEwMXhcbiAgICBbOCwgMzIwXSwgWzgsIDMyMF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMTEwMTEweFxuICAgIFs4LCAzODRdLCBbOCwgMzg0XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAxMTAxMTF4XG4gICAgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgICAgICAgICAvLyAwMDExMXh4eHhcbiAgICBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLCBbNSwgMTBdLFxuICAgIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sXG4gICAgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSxcbiAgICBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCAgICAgICAgIC8vIDAxMDAweHh4eFxuICAgIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sXG4gICAgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSxcbiAgICBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLCBbNSwgMTFdLFxuICAgIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sICAgICAgICAgLy8gMDEwMDEwMHh4XG4gICAgWzgsIDU5XSwgWzgsIDU5XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAwMTAxMHhcbiAgICBbOCwgNjBdLCBbOCwgNjBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDAxMDExeFxuICAgIFs5LCAxNDcyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMDExMDAwXG4gICAgWzksIDE1MzZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAwMTEwMDFcbiAgICBbOSwgMTYwMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDAxMTAxMFxuICAgIFs5LCAxNzI4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMDExMDExXG4gICAgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgICAgICAgICAvLyAwMTAwMTExeHhcbiAgICBbNywgMjRdLCBbNywgMjRdLCBbNywgMjRdLCBbNywgMjRdLCAgICAgICAgIC8vIDAxMDEwMDB4eFxuICAgIFs4LCA0OV0sIFs4LCA0OV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTAwMTB4XG4gICAgWzgsIDUwXSwgWzgsIDUwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMDAxMXhcbiAgICBbOCwgNTFdLCBbOCwgNTFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDEwMTAweFxuICAgIFs4LCA1Ml0sIFs4LCA1Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTAxMDF4XG4gICAgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgICAgICAgICAvLyAwMTAxMDExeHhcbiAgICBbOCwgNTVdLCBbOCwgNTVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDExMDAweFxuICAgIFs4LCA1Nl0sIFs4LCA1Nl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDEwMTEwMDF4XG4gICAgWzgsIDU3XSwgWzgsIDU3XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTAxMTAxMHhcbiAgICBbOCwgNThdLCBbOCwgNThdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMDExMDExeFxuICAgIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCAgICAgLy8gMDEwMTExeHh4XG4gICAgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sXG4gICAgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCAvLyAwMTEwMDB4eHhcbiAgICBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sXG4gICAgWzgsIDQ0OF0sIFs4LCA0NDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMDEwMHhcbiAgICBbOCwgNTEyXSwgWzgsIDUxMl0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAwMTAxeFxuICAgIFs5LCA3MDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDAxMTAwXG4gICAgWzksIDc2OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMDExMDFcbiAgICBbOCwgNjQwXSwgWzgsIDY0MF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAwMTExeFxuICAgIFs4LCA1NzZdLCBbOCwgNTc2XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMDB4XG4gICAgWzksIDgzMl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAwMTBcbiAgICBbOSwgODk2XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMDAxMVxuICAgIFs5LCA5NjBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMTAwXG4gICAgWzksIDEwMjRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTAxMDFcbiAgICBbOSwgMTA4OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMDExMFxuICAgIFs5LCAxMTUyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDEwMTExXG4gICAgWzksIDEyMTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTEwMDBcbiAgICBbOSwgMTI4MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAxMTAxMTAwMVxuICAgIFs5LCAxMzQ0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDExMDExMDEwXG4gICAgWzksIDE0MDhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMTEwMTEwMTFcbiAgICBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNywgMjU2XSwgICAgIC8vIDAxMTAxMTF4eFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgICAgICAgICAgICAgLy8gMDExMXh4eHh4XG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSxcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSxcbiAgICBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sXG4gICAgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgICAgICAgICAgICAgLy8gMTAwMHh4eHh4XG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSxcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSxcbiAgICBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sXG4gICAgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLFxuICAgIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCAgICAgLy8gMTAwMTB4eHh4XG4gICAgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sXG4gICAgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sXG4gICAgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sXG4gICAgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCAgICAgICAgICAgICAvLyAxMDAxMXh4eHhcbiAgICBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sXG4gICAgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLFxuICAgIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSxcbiAgICBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sICAgICAgICAgICAgIC8vIDEwMTAweHh4eFxuICAgIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSxcbiAgICBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sXG4gICAgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLFxuICAgIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxNl0sICAgICAgICAgLy8gMTAxMDEweHh4XG4gICAgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSwgWzYsIDE2XSxcbiAgICBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCAgICAgICAgIC8vIDEwMTAxMXh4eFxuICAgIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCAgICAgICAgICAgICAvLyAxMDExeHh4eHhcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLFxuICAgIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSxcbiAgICBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCAgICAgICAgICAgICAvLyAxMTAweHh4eHhcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSxcbiAgICBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sXG4gICAgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE0XSwgICAgICAgICAvLyAxMTAxMDB4eHhcbiAgICBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLCBbNiwgMTRdLFxuICAgIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sICAgICAgICAgLy8gMTEwMTAxeHh4XG4gICAgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSxcbiAgICBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCAgICAgICAgIC8vIDExMDExeHh4eFxuICAgIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sXG4gICAgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSxcbiAgICBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLCBbNSwgNjRdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgICAgICAgICAgICAgLy8gMTExMHh4eHh4XG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSxcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSxcbiAgICBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sXG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgICAgICAgICAgICAgLy8gMTExMXh4eHh4XG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSxcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLFxuICAgIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSxcbiAgICBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sXG4gICAgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddXG4gIF07XG5cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IGJsYWNrVGFibGUxID0gW1xuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAwMDAwMHhcbiAgICBbMTIsIGNjaXR0RU9MXSwgWzEyLCBjY2l0dEVPTF0sICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMDAwMDF4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAwMDF4eFxuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgIC8vIDAwMDAwMDAwMDEweHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDAxMXh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAxMDB4eFxuICAgIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCAgICAgICAgIC8vIDAwMDAwMDAwMTAxeHhcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgICAgICAgICAvLyAwMDAwMDAwMDExMHh4XG4gICAgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sICAgICAgICAgLy8gMDAwMDAwMDAxMTF4eFxuICAgIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIC8vIDAwMDAwMDAxMDAweHhcbiAgICBbMTIsIDE5ODRdLCBbMTIsIDE5ODRdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTAwMTB4XG4gICAgWzEyLCAyMDQ4XSwgWzEyLCAyMDQ4XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDEwMDExeFxuICAgIFsxMiwgMjExMl0sIFsxMiwgMjExMl0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMDEwMHhcbiAgICBbMTIsIDIxNzZdLCBbMTIsIDIxNzZdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTAxMDF4XG4gICAgWzEyLCAyMjQwXSwgWzEyLCAyMjQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDEwMTEweFxuICAgIFsxMiwgMjMwNF0sIFsxMiwgMjMwNF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMDExMXhcbiAgICBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCAvLyAwMDAwMDAwMTEwMHh4XG4gICAgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgLy8gMDAwMDAwMDExMDF4eFxuICAgIFsxMiwgMjM2OF0sIFsxMiwgMjM2OF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMTEwMHhcbiAgICBbMTIsIDI0MzJdLCBbMTIsIDI0MzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAwMTExMDF4XG4gICAgWzEyLCAyNDk2XSwgWzEyLCAyNDk2XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMDExMTEweFxuICAgIFsxMiwgMjU2MF0sIFsxMiwgMjU2MF0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDAxMTExMXhcbiAgICBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgICAgICAgICAvLyAwMDAwMDAxMDAweHh4XG4gICAgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sXG4gICAgWzEyLCA1Ml0sIFsxMiwgNTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAwMTAweFxuICAgIFsxMywgNjQwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMDEwMTBcbiAgICBbMTMsIDcwNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDAxMDExXG4gICAgWzEzLCA3NjhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAwMTEwMFxuICAgIFsxMywgODMyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMDExMDFcbiAgICBbMTIsIDU1XSwgWzEyLCA1NV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDAxMTF4XG4gICAgWzEyLCA1Nl0sIFsxMiwgNTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMDAweFxuICAgIFsxMywgMTI4MF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTAwMTBcbiAgICBbMTMsIDEzNDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDEwMDExXG4gICAgWzEzLCAxNDA4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMDEwMFxuICAgIFsxMywgMTQ3Ml0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTAxMDFcbiAgICBbMTIsIDU5XSwgWzEyLCA1OV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDEwMTF4XG4gICAgWzEyLCA2MF0sIFsxMiwgNjBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTAxMTAweFxuICAgIFsxMywgMTUzNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDEwMTEwMTBcbiAgICBbMTMsIDE2MDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMDExMDExXG4gICAgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNF0sICAgICAgICAgLy8gMDAwMDAwMTAxMTF4eFxuICAgIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMSwgMjVdLCAgICAgICAgIC8vIDAwMDAwMDExMDAweHhcbiAgICBbMTMsIDE2NjRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAwMTAwXG4gICAgWzEzLCAxNzI4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMDEwMVxuICAgIFsxMiwgMzIwXSwgWzEyLCAzMjBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDAxMXhcbiAgICBbMTIsIDM4NF0sIFsxMiwgMzg0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAxMDB4XG4gICAgWzEyLCA0NDhdLCBbMTIsIDQ0OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMTAxeFxuICAgIFsxMywgNTEyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMDExMDBcbiAgICBbMTMsIDU3Nl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTAxMTAxXG4gICAgWzEyLCA1M10sIFsxMiwgNTNdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTEwMTExeFxuICAgIFsxMiwgNTRdLCBbMTIsIDU0XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAwMHhcbiAgICBbMTMsIDg5Nl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTEwMDEwXG4gICAgWzEzLCA5NjBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDAxMVxuICAgIFsxMywgMTAyNF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAxMDBcbiAgICBbMTMsIDEwODhdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDAxMTEwMTAxXG4gICAgWzEzLCAxMTUyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAwMTExMDExMFxuICAgIFsxMywgMTIxNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMDExMTAxMTFcbiAgICBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgICAgICAgICAvLyAwMDAwMDAxMTExeHh4XG4gICAgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF1cbiAgXTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3QgYmxhY2tUYWJsZTIgPSBbXG4gICAgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgICAgIC8vIDAwMDAwMTAweHh4eFxuICAgIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sXG4gICAgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSxcbiAgICBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLCBbOCwgMTNdLFxuICAgIFsxMSwgMjNdLCBbMTEsIDIzXSwgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAwMHhcbiAgICBbMTIsIDUwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDEwMDEwXG4gICAgWzEyLCA1MV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDAxMVxuICAgIFsxMiwgNDRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAxMDBcbiAgICBbMTIsIDQ1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDEwMTAxXG4gICAgWzEyLCA0Nl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMDExMFxuICAgIFsxMiwgNDddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTAxMTFcbiAgICBbMTIsIDU3XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDExMDAwXG4gICAgWzEyLCA1OF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTAxMTAwMVxuICAgIFsxMiwgNjFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDEwMTEwMTBcbiAgICBbMTIsIDI1Nl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMDExMDExXG4gICAgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIC8vIDAwMDAwMTAxMTF4eFxuICAgIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMCwgMTddLCAvLyAwMDAwMDExMDAweHhcbiAgICBbMTIsIDQ4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAwMTAwXG4gICAgWzEyLCA0OV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMDEwMVxuICAgIFsxMiwgNjJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDAxMTBcbiAgICBbMTIsIDYzXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAwMTExXG4gICAgWzEyLCAzMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTAwMFxuICAgIFsxMiwgMzFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDEwMDFcbiAgICBbMTIsIDMyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMDEwXG4gICAgWzEyLCAzM10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTAxMVxuICAgIFsxMiwgNDBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMDExMDExMDBcbiAgICBbMTIsIDQxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDAxMTAxMTAxXG4gICAgWzExLCAyMl0sIFsxMSwgMjJdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAwMTEwMTExeFxuICAgIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sICAgICAvLyAwMDAwMDExMXh4eHhcbiAgICBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLCBbOCwgMTRdLFxuICAgIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sXG4gICAgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCAgICAgLy8gMDAwMDEwMHh4eHh4XG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sXG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLCBbNywgMTBdLFxuICAgIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sXG4gICAgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCAgICAgLy8gMDAwMDEwMXh4eHh4XG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sXG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLCBbNywgMTFdLFxuICAgIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sXG4gICAgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSxcbiAgICBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCBbOSwgMTVdLCAgICAgLy8gMDAwMDExMDAweHh4XG4gICAgWzksIDE1XSwgWzksIDE1XSwgWzksIDE1XSwgWzksIDE1XSxcbiAgICBbMTIsIDEyOF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMDAwXG4gICAgWzEyLCAxOTJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAwMTAwMVxuICAgIFsxMiwgMjZdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDEwMTBcbiAgICBbMTIsIDI3XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMDExXG4gICAgWzEyLCAyOF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAwMTEwMFxuICAgIFsxMiwgMjldLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMDExMDFcbiAgICBbMTEsIDE5XSwgWzExLCAxOV0sICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDAxMTF4XG4gICAgWzExLCAyMF0sIFsxMSwgMjBdLCAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDAweFxuICAgIFsxMiwgMzRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTAwMTBcbiAgICBbMTIsIDM1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMDExXG4gICAgWzEyLCAzNl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDEwMFxuICAgIFsxMiwgMzddLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTAxMDFcbiAgICBbMTIsIDM4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDEwMTEwXG4gICAgWzEyLCAzOV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMDExMVxuICAgIFsxMSwgMjFdLCBbMTEsIDIxXSwgICAgICAgICAgICAgICAgICAgICAvLyAwMDAwMTEwMTEwMHhcbiAgICBbMTIsIDQyXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMDExMDExMDEwXG4gICAgWzEyLCA0M10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDAxMTAxMTAxMVxuICAgIFsxMCwgMF0sIFsxMCwgMF0sIFsxMCwgMF0sIFsxMCwgMF0sICAgICAvLyAwMDAwMTEwMTExeHhcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCAgICAgLy8gMDAwMDExMXh4eHh4XG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSxcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sXG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSxcbiAgICBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLFxuICAgIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sXG4gICAgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXSwgWzcsIDEyXVxuICBdO1xuXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBibGFja1RhYmxlMyA9IFtcbiAgICBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgLy8gMDAwMHh4XG4gICAgWzYsIDldLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAwMDEwMFxuICAgIFs2LCA4XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwMDAxMDFcbiAgICBbNSwgN10sIFs1LCA3XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDAwMTF4XG4gICAgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCAgICAgICAgIC8vIDAwMTB4eFxuICAgIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgICAgICAgICAvLyAwMDExeHhcbiAgICBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sICAgICAgICAgLy8gMDEweHh4XG4gICAgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLFxuICAgIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgICAgICAgICAvLyAwMTF4eHhcbiAgICBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sXG4gICAgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCAgICAgICAgIC8vIDEweHh4eFxuICAgIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSxcbiAgICBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sXG4gICAgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLFxuICAgIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgICAgICAgICAvLyAxMXh4eHhcbiAgICBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sXG4gICAgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLFxuICAgIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXVxuICBdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0NDSVRURmF4RGVjb2RlclNvdXJjZX0gc291cmNlIC0gVGhlIGRhdGEgd2hpY2ggc2hvdWxkIGJlIGRlY29kZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBEZWNvZGluZyBvcHRpb25zLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICBmdW5jdGlvbiBDQ0lUVEZheERlY29kZXIoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlLm5leHQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDQ0lUVEZheERlY29kZXIgLSBpbnZhbGlkIFwic291cmNlXCIgcGFyYW1ldGVyLicpO1xuICAgIH1cbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLmVvZiA9IGZhbHNlO1xuXG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuSyB8fCAwO1xuICAgIHRoaXMuZW9saW5lID0gb3B0aW9ucy5FbmRPZkxpbmUgfHwgZmFsc2U7XG4gICAgdGhpcy5ieXRlQWxpZ24gPSBvcHRpb25zLkVuY29kZWRCeXRlQWxpZ24gfHwgZmFsc2U7XG4gICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5Db2x1bW5zIHx8IDE3Mjg7XG4gICAgdGhpcy5yb3dzID0gb3B0aW9ucy5Sb3dzIHx8IDA7XG4gICAgbGV0IGVvYmxvY2sgPSBvcHRpb25zLkVuZE9mQmxvY2s7XG4gICAgaWYgKGVvYmxvY2sgPT09IG51bGwgfHwgZW9ibG9jayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlb2Jsb2NrID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5lb2Jsb2NrID0gZW9ibG9jaztcbiAgICB0aGlzLmJsYWNrID0gb3B0aW9ucy5CbGFja0lzMSB8fCBmYWxzZTtcblxuICAgIHRoaXMuY29kaW5nTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAxKTtcbiAgICB0aGlzLnJlZkxpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMik7XG5cbiAgICB0aGlzLmNvZGluZ0xpbmVbMF0gPSB0aGlzLmNvbHVtbnM7XG4gICAgdGhpcy5jb2RpbmdQb3MgPSAwO1xuXG4gICAgdGhpcy5yb3cgPSAwO1xuICAgIHRoaXMubmV4dExpbmUyRCA9IHRoaXMuZW5jb2RpbmcgPCAwO1xuICAgIHRoaXMuaW5wdXRCaXRzID0gMDtcbiAgICB0aGlzLmlucHV0QnVmID0gMDtcbiAgICB0aGlzLm91dHB1dEJpdHMgPSAwO1xuICAgIHRoaXMucm93c0RvbmUgPSBmYWxzZTtcblxuICAgIGxldCBjb2RlMTtcbiAgICB3aGlsZSAoKGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpKSA9PT0gMCkge1xuICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICB9XG4gICAgaWYgKGNvZGUxID09PSAxKSB7XG4gICAgICB0aGlzLl9lYXRCaXRzKDEyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7XG4gICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7XG4gICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgIH1cbiAgfVxuXG4gIENDSVRURmF4RGVjb2Rlci5wcm90b3R5cGUgPSB7XG4gICAgcmVhZE5leHRDaGFyKCkge1xuICAgICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlZkxpbmUgPSB0aGlzLnJlZkxpbmU7XG4gICAgICBjb25zdCBjb2RpbmdMaW5lID0gdGhpcy5jb2RpbmdMaW5lO1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblxuICAgICAgbGV0IHJlZlBvcywgYmxhY2tQaXhlbHMsIGJpdHMsIGk7XG5cbiAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDApIHtcbiAgICAgICAgaWYgKHRoaXMucm93c0RvbmUpIHtcbiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXJyID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IGNvZGUxLCBjb2RlMiwgY29kZTM7XG4gICAgICAgIGlmICh0aGlzLm5leHRMaW5lMkQpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBjb2RpbmdMaW5lW2ldIDwgY29sdW1uczsgKytpKSB7XG4gICAgICAgICAgICByZWZMaW5lW2ldID0gY29kaW5nTGluZVtpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVmTGluZVtpKytdID0gY29sdW1ucztcbiAgICAgICAgICByZWZMaW5lW2ldID0gY29sdW1ucztcbiAgICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDtcbiAgICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7XG4gICAgICAgICAgcmVmUG9zID0gMDtcbiAgICAgICAgICBibGFja1BpeGVscyA9IDA7XG5cbiAgICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2dldFR3b0RpbUNvZGUoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoY29kZTEpIHtcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1QYXNzOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvcyArIDFdLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkxpbmVbcmVmUG9zICsgMV0gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltSG9yaXo6XG4gICAgICAgICAgICAgICAgY29kZTEgPSBjb2RlMiA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGJsYWNrUGl4ZWxzKSB7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKFxuICAgICAgICAgICAgICAgICAgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMSxcbiAgICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICAgIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTIsXG4gICAgICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF4gMVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIzOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAzLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIyOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAyLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIxOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAxLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydDA6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSwgYmxhY2tQaXhlbHMpO1xuICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgKytyZWZQb3M7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJlxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMzpcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMywgYmxhY2tQaXhlbHMpO1xuICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICArK3JlZlBvcztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwyOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAyLCBibGFja1BpeGVscyk7XG4gICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAtLXJlZlBvcztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICsrcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDE6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDEsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC0tcmVmUG9zO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgKytyZWZQb3M7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgIHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJlxuICAgICAgICAgICAgICAgICAgICByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIGNjaXR0RU9GOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2x1bW5zLCAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaW5mbyhcImJhZCAyZCBjb2RlXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2x1bW5zLCAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVyciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwO1xuICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDtcbiAgICAgICAgICBibGFja1BpeGVscyA9IDA7XG4gICAgICAgICAgd2hpbGUgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgICAgY29kZTEgPSAwO1xuICAgICAgICAgICAgaWYgKGJsYWNrUGl4ZWxzKSB7XG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpO1xuICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTtcbiAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTtcbiAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGdvdEVPTCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVBbGlnbikge1xuICAgICAgICAgIHRoaXMuaW5wdXRCaXRzICY9IH43O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmVvYmxvY2sgJiYgdGhpcy5yb3cgPT09IHRoaXMucm93cyAtIDEpIHtcbiAgICAgICAgICB0aGlzLnJvd3NEb25lID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTtcbiAgICAgICAgICBpZiAodGhpcy5lb2xpbmUpIHtcbiAgICAgICAgICAgIHdoaWxlIChjb2RlMSAhPT0gY2NpdHRFT0YgJiYgY29kZTEgIT09IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlIChjb2RlMSA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvZGUxID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTtcbiAgICAgICAgICAgIGdvdEVPTCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZW9mICYmIHRoaXMuZW5jb2RpbmcgPiAwICYmICF0aGlzLnJvd3NEb25lKSB7XG4gICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpO1xuICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lb2Jsb2NrICYmIGdvdEVPTCAmJiB0aGlzLmJ5dGVBbGlnbikge1xuICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICAgIGlmIChjb2RlMSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7XG4gICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7XG4gICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+PSAwKSB7XG4gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgIGluZm8oXCJiYWQgcnRjIGNvZGU6IFwiICsgY29kZTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2tCaXRzKDEpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lcnIgJiYgdGhpcy5lb2xpbmUpIHtcbiAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMyk7XG4gICAgICAgICAgICBpZiAoY29kZTEgPT09IGNjaXR0RU9GKSB7XG4gICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGUxID4+IDEgPT09IDEpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTtcbiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhKGNvZGUxICYgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGluZ0xpbmVbMF0gPiAwKSB7XG4gICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVsodGhpcy5jb2RpbmdQb3MgPSAwKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVsodGhpcy5jb2RpbmdQb3MgPSAxKV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3crKztcbiAgICAgIH1cblxuICAgICAgbGV0IGM7XG4gICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID49IDgpIHtcbiAgICAgICAgYyA9IHRoaXMuY29kaW5nUG9zICYgMSA/IDAgOiAweGZmO1xuICAgICAgICB0aGlzLm91dHB1dEJpdHMgLT0gODtcbiAgICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA9PT0gMCAmJiBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHtcbiAgICAgICAgICB0aGlzLmNvZGluZ1BvcysrO1xuICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9XG4gICAgICAgICAgICBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYml0cyA9IDg7XG4gICAgICAgIGMgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA+IGJpdHMpIHtcbiAgICAgICAgICAgIGMgPDw9IGJpdHM7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmNvZGluZ1BvcyAmIDEpKSB7XG4gICAgICAgICAgICAgIGMgfD0gMHhmZiA+PiAoOCAtIGJpdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IGJpdHM7XG4gICAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyA8PD0gdGhpcy5vdXRwdXRCaXRzO1xuICAgICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkge1xuICAgICAgICAgICAgICBjIHw9IDB4ZmYgPj4gKDggLSB0aGlzLm91dHB1dEJpdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYml0cyAtPSB0aGlzLm91dHB1dEJpdHM7XG4gICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSAwO1xuICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykge1xuICAgICAgICAgICAgICB0aGlzLmNvZGluZ1BvcysrO1xuICAgICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPVxuICAgICAgICAgICAgICAgIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChiaXRzID4gMCkge1xuICAgICAgICAgICAgICBjIDw8PSBiaXRzO1xuICAgICAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGJpdHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYmxhY2spIHtcbiAgICAgICAgYyBePSAweGZmO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFBpeGVscyhhMSwgYmxhY2tQaXhlbHMpIHtcbiAgICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7XG4gICAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7XG5cbiAgICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkge1xuICAgICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICBpbmZvKFwicm93IGlzIHdyb25nIGxlbmd0aFwiKTtcbiAgICAgICAgICB0aGlzLmVyciA9IHRydWU7XG4gICAgICAgICAgYTEgPSB0aGlzLmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjb2RpbmdQb3MgJiAxKSBeIGJsYWNrUGl4ZWxzKSB7XG4gICAgICAgICAgKytjb2RpbmdQb3M7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRQaXhlbHNOZWcoYTEsIGJsYWNrUGl4ZWxzKSB7XG4gICAgICBjb25zdCBjb2RpbmdMaW5lID0gdGhpcy5jb2RpbmdMaW5lO1xuICAgICAgbGV0IGNvZGluZ1BvcyA9IHRoaXMuY29kaW5nUG9zO1xuXG4gICAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHtcbiAgICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgaW5mbyhcInJvdyBpcyB3cm9uZyBsZW5ndGhcIik7XG4gICAgICAgICAgdGhpcy5lcnIgPSB0cnVlO1xuICAgICAgICAgIGExID0gdGhpcy5jb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoY29kaW5nUG9zICYgMSkgXiBibGFja1BpeGVscykge1xuICAgICAgICAgICsrY29kaW5nUG9zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7XG4gICAgICB9IGVsc2UgaWYgKGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7XG4gICAgICAgIGlmIChhMSA8IDApIHtcbiAgICAgICAgICBpbmZvKFwiaW52YWxpZCBjb2RlXCIpO1xuICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTtcbiAgICAgICAgICBhMSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGNvZGluZ1BvcyA+IDAgJiYgYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1BvcyAtIDFdKSB7XG4gICAgICAgICAgLS1jb2RpbmdQb3M7XG4gICAgICAgIH1cbiAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvZGUgZm91bmQgZnJvbSB0aGUgdGFibGUuXG4gICAgICogVGhlIHN0YXJ0IGFuZCBlbmQgcGFyYW1ldGVycyBzZXQgdGhlIGJvdW5kYXJpZXMgZm9yIHNlYXJjaGluZyB0aGUgdGFibGUuXG4gICAgICogVGhlIGxpbWl0IHBhcmFtZXRlciBpcyBvcHRpb25hbC4gRnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIHRocmVlXG4gICAgICogdmFsdWVzLiBUaGUgZmlyc3QgYXJyYXkgZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciBhIHZhbGlkIGNvZGUgaXMgYmVpbmdcbiAgICAgKiByZXR1cm5lZC4gVGhlIHNlY29uZCBhcnJheSBlbGVtZW50IGlzIHRoZSBhY3R1YWwgY29kZS4gVGhlIHRoaXJkIGFycmF5XG4gICAgICogZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciBFT0Ygd2FzIHJlYWNoZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZmluZFRhYmxlQ29kZShzdGFydCwgZW5kLCB0YWJsZSwgbGltaXQpIHtcbiAgICAgIGNvbnN0IGxpbWl0VmFsdWUgPSBsaW1pdCB8fCAwO1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgKytpKSB7XG4gICAgICAgIGxldCBjb2RlID0gdGhpcy5fbG9va0JpdHMoaSk7XG4gICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikge1xuICAgICAgICAgIHJldHVybiBbdHJ1ZSwgMSwgZmFsc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgZW5kKSB7XG4gICAgICAgICAgY29kZSA8PD0gZW5kIC0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxpbWl0VmFsdWUgfHwgY29kZSA+PSBsaW1pdFZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgcCA9IHRhYmxlW2NvZGUgLSBsaW1pdFZhbHVlXTtcbiAgICAgICAgICBpZiAocFswXSA9PT0gaSkge1xuICAgICAgICAgICAgdGhpcy5fZWF0Qml0cyhpKTtcbiAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgcFsxXSwgdHJ1ZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW2ZhbHNlLCAwLCBmYWxzZV07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldFR3b0RpbUNvZGUoKSB7XG4gICAgICBsZXQgY29kZSA9IDA7XG4gICAgICBsZXQgcDtcbiAgICAgIGlmICh0aGlzLmVvYmxvY2spIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDcpO1xuICAgICAgICBwID0gdHdvRGltVGFibGVbY29kZV07XG4gICAgICAgIGlmIChwICYmIHBbMF0gPiAwKSB7XG4gICAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTtcbiAgICAgICAgICByZXR1cm4gcFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA3LCB0d29EaW1UYWJsZSk7XG4gICAgICAgIGlmIChyZXN1bHRbMF0gJiYgcmVzdWx0WzJdKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5mbyhcIkJhZCB0d28gZGltIGNvZGVcIik7XG4gICAgICByZXR1cm4gY2NpdHRFT0Y7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldFdoaXRlQ29kZSgpIHtcbiAgICAgIGxldCBjb2RlID0gMDtcbiAgICAgIGxldCBwO1xuICAgICAgaWYgKHRoaXMuZW9ibG9jaykge1xuICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoMTIpO1xuICAgICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID4+IDUgPT09IDApIHtcbiAgICAgICAgICBwID0gd2hpdGVUYWJsZTFbY29kZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcCA9IHdoaXRlVGFibGUyW2NvZGUgPj4gM107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocFswXSA+IDApIHtcbiAgICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pO1xuICAgICAgICAgIHJldHVybiBwWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA5LCB3aGl0ZVRhYmxlMik7XG4gICAgICAgIGlmIChyZXN1bHRbMF0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMSwgMTIsIHdoaXRlVGFibGUxKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluZm8oXCJiYWQgd2hpdGUgY29kZVwiKTtcbiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0QmxhY2tDb2RlKCkge1xuICAgICAgbGV0IGNvZGUsIHA7XG4gICAgICBpZiAodGhpcy5lb2Jsb2NrKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMyk7XG4gICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID4+IDcgPT09IDApIHtcbiAgICAgICAgICBwID0gYmxhY2tUYWJsZTFbY29kZV07XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA+PiA5ID09PSAwICYmIGNvZGUgPj4gNyAhPT0gMCkge1xuICAgICAgICAgIHAgPSBibGFja1RhYmxlMlsoY29kZSA+PiAxKSAtIDY0XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwID0gYmxhY2tUYWJsZTNbY29kZSA+PiA3XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwWzBdID4gMCkge1xuICAgICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7XG4gICAgICAgICAgcmV0dXJuIHBbMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDIsIDYsIGJsYWNrVGFibGUzKTtcbiAgICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDcsIDEyLCBibGFja1RhYmxlMiwgNjQpO1xuICAgICAgICBpZiAocmVzdWx0WzBdKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMTAsIDEzLCBibGFja1RhYmxlMSk7XG4gICAgICAgIGlmIChyZXN1bHRbMF0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmZvKFwiYmFkIGJsYWNrIGNvZGVcIik7XG4gICAgICB0aGlzLl9lYXRCaXRzKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2xvb2tCaXRzKG4pIHtcbiAgICAgIGxldCBjO1xuICAgICAgd2hpbGUgKHRoaXMuaW5wdXRCaXRzIDwgbikge1xuICAgICAgICBpZiAoKGMgPSB0aGlzLnNvdXJjZS5uZXh0KCkpID09PSAtMSkge1xuICAgICAgICAgIGlmICh0aGlzLmlucHV0Qml0cyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNjaXR0RU9GO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHRoaXMuaW5wdXRCdWYgPDwgKG4gLSB0aGlzLmlucHV0Qml0cykpICYgKDB4ZmZmZiA+PiAoMTYgLSBuKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dEJ1ZiA9ICh0aGlzLmlucHV0QnVmIDw8IDgpIHwgYztcbiAgICAgICAgdGhpcy5pbnB1dEJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIHJldHVybiAodGhpcy5pbnB1dEJ1ZiA+PiAodGhpcy5pbnB1dEJpdHMgLSBuKSkgJiAoMHhmZmZmID4+ICgxNiAtIG4pKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZWF0Qml0cyhuKSB7XG4gICAgICBpZiAoKHRoaXMuaW5wdXRCaXRzIC09IG4pIDwgMCkge1xuICAgICAgICB0aGlzLmlucHV0Qml0cyA9IDA7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gQ0NJVFRGYXhEZWNvZGVyO1xufSkoKTtcblxuZXhwb3J0IHsgQ0NJVFRGYXhEZWNvZGVyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnQsIEJhc2VFeGNlcHRpb24sIHdhcm4gfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWwuanNcIjtcbmltcG9ydCB7IHJlYWRVaW50MTYgfSBmcm9tIFwiLi9jb3JlX3V0aWxzLmpzXCI7XG5cbmNsYXNzIEpwZWdFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBzdXBlcihgSlBFRyBlcnJvcjogJHttc2d9YCk7XG4gIH1cbn1cblxuY2xhc3MgRE5MTWFya2VyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSwgc2NhbkxpbmVzKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5zY2FuTGluZXMgPSBzY2FuTGluZXM7XG4gIH1cbn1cblxuY2xhc3MgRU9JTWFya2VyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9XG5cbi8qKlxuICogVGhpcyBjb2RlIHdhcyBmb3JrZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm90bWFzdGVyeWV0L2pwZ2pzLlxuICogVGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIGNyZWF0ZWQgYnkgR2l0SHViIHVzZXIgbm90bWFzdGVyeWV0LlxuICpcbiAqIC0gVGhlIEpQRUcgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIElUVSBDQ0lUVCBSZWNvbW1lbmRhdGlvbiBULjgxXG4gKiAgICh3d3cudzMub3JnL0dyYXBoaWNzL0pQRUcvaXR1LXQ4MS5wZGYpXG4gKiAtIFRoZSBKRklGIHNwZWNpZmljYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBKUEVHIEZpbGUgSW50ZXJjaGFuZ2UgRm9ybWF0XG4gKiAgICh3d3cudzMub3JnL0dyYXBoaWNzL0pQRUcvamZpZjMucGRmKVxuICogLSBUaGUgQWRvYmUgQXBwbGljYXRpb24tU3BlY2lmaWMgSlBFRyBtYXJrZXJzIGluIHRoZVxuICogICBTdXBwb3J0aW5nIHRoZSBEQ1QgRmlsdGVycyBpbiBQb3N0U2NyaXB0IExldmVsIDIsIFRlY2huaWNhbCBOb3RlICM1MTE2XG4gKiAgIChwYXJ0bmVycy5hZG9iZS5jb20vcHVibGljL2RldmVsb3Blci9lbi9wcy9zZGsvNTExNi5EQ1RfRmlsdGVyLnBkZilcbiAqL1xuXG52YXIgSnBlZ0ltYWdlID0gKGZ1bmN0aW9uIEpwZWdJbWFnZUNsb3N1cmUoKSB7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICB2YXIgZGN0WmlnWmFnID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAwLFxuICAgICAxLCAgOCxcbiAgICAxNiwgIDksICAyLFxuICAgICAzLCAxMCwgMTcsIDI0LFxuICAgIDMyLCAyNSwgMTgsIDExLCA0LFxuICAgICA1LCAxMiwgMTksIDI2LCAzMywgNDAsXG4gICAgNDgsIDQxLCAzNCwgMjcsIDIwLCAxMywgIDYsXG4gICAgIDcsIDE0LCAyMSwgMjgsIDM1LCA0MiwgNDksIDU2LFxuICAgIDU3LCA1MCwgNDMsIDM2LCAyOSwgMjIsIDE1LFxuICAgIDIzLCAzMCwgMzcsIDQ0LCA1MSwgNTgsXG4gICAgNTksIDUyLCA0NSwgMzgsIDMxLFxuICAgIDM5LCA0NiwgNTMsIDYwLFxuICAgIDYxLCA1NCwgNDcsXG4gICAgNTUsIDYyLFxuICAgIDYzXG4gIF0pO1xuXG4gIHZhciBkY3RDb3MxID0gNDAxNzsgLy8gY29zKHBpLzE2KVxuICB2YXIgZGN0U2luMSA9IDc5OTsgLy8gc2luKHBpLzE2KVxuICB2YXIgZGN0Q29zMyA9IDM0MDY7IC8vIGNvcygzKnBpLzE2KVxuICB2YXIgZGN0U2luMyA9IDIyNzY7IC8vIHNpbigzKnBpLzE2KVxuICB2YXIgZGN0Q29zNiA9IDE1Njc7IC8vIGNvcyg2KnBpLzE2KVxuICB2YXIgZGN0U2luNiA9IDM3ODQ7IC8vIHNpbig2KnBpLzE2KVxuICB2YXIgZGN0U3FydDIgPSA1NzkzOyAvLyBzcXJ0KDIpXG4gIHZhciBkY3RTcXJ0MWQyID0gMjg5NjsgLy8gc3FydCgyKSAvIDJcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEpwZWdJbWFnZSh7IGRlY29kZVRyYW5zZm9ybSA9IG51bGwsIGNvbG9yVHJhbnNmb3JtID0gLTEgfSA9IHt9KSB7XG4gICAgdGhpcy5fZGVjb2RlVHJhbnNmb3JtID0gZGVjb2RlVHJhbnNmb3JtO1xuICAgIHRoaXMuX2NvbG9yVHJhbnNmb3JtID0gY29sb3JUcmFuc2Zvcm07XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZEh1ZmZtYW5UYWJsZShjb2RlTGVuZ3RocywgdmFsdWVzKSB7XG4gICAgdmFyIGsgPSAwLFxuICAgICAgY29kZSA9IFtdLFxuICAgICAgaSxcbiAgICAgIGosXG4gICAgICBsZW5ndGggPSAxNjtcbiAgICB3aGlsZSAobGVuZ3RoID4gMCAmJiAhY29kZUxlbmd0aHNbbGVuZ3RoIC0gMV0pIHtcbiAgICAgIGxlbmd0aC0tO1xuICAgIH1cbiAgICBjb2RlLnB1c2goeyBjaGlsZHJlbjogW10sIGluZGV4OiAwIH0pO1xuICAgIHZhciBwID0gY29kZVswXSxcbiAgICAgIHE7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aHNbaV07IGorKykge1xuICAgICAgICBwID0gY29kZS5wb3AoKTtcbiAgICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHZhbHVlc1trXTtcbiAgICAgICAgd2hpbGUgKHAuaW5kZXggPiAwKSB7XG4gICAgICAgICAgcCA9IGNvZGUucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgcC5pbmRleCsrO1xuICAgICAgICBjb2RlLnB1c2gocCk7XG4gICAgICAgIHdoaWxlIChjb2RlLmxlbmd0aCA8PSBpKSB7XG4gICAgICAgICAgY29kZS5wdXNoKChxID0geyBjaGlsZHJlbjogW10sIGluZGV4OiAwIH0pKTtcbiAgICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjtcbiAgICAgICAgICBwID0gcTtcbiAgICAgICAgfVxuICAgICAgICBrKys7XG4gICAgICB9XG4gICAgICBpZiAoaSArIDEgPCBsZW5ndGgpIHtcbiAgICAgICAgLy8gcCBoZXJlIHBvaW50cyB0byBsYXN0IGNvZGVcbiAgICAgICAgY29kZS5wdXNoKChxID0geyBjaGlsZHJlbjogW10sIGluZGV4OiAwIH0pKTtcbiAgICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHEuY2hpbGRyZW47XG4gICAgICAgIHAgPSBxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29kZVswXS5jaGlsZHJlbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgcm93LCBjb2wpIHtcbiAgICByZXR1cm4gNjQgKiAoKGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lICsgMSkgKiByb3cgKyBjb2wpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlU2NhbihcbiAgICBkYXRhLFxuICAgIG9mZnNldCxcbiAgICBmcmFtZSxcbiAgICBjb21wb25lbnRzLFxuICAgIHJlc2V0SW50ZXJ2YWwsXG4gICAgc3BlY3RyYWxTdGFydCxcbiAgICBzcGVjdHJhbEVuZCxcbiAgICBzdWNjZXNzaXZlUHJldixcbiAgICBzdWNjZXNzaXZlLFxuICAgIHBhcnNlRE5MTWFya2VyID0gZmFsc2VcbiAgKSB7XG4gICAgdmFyIG1jdXNQZXJMaW5lID0gZnJhbWUubWN1c1BlckxpbmU7XG4gICAgdmFyIHByb2dyZXNzaXZlID0gZnJhbWUucHJvZ3Jlc3NpdmU7XG5cbiAgICBjb25zdCBzdGFydE9mZnNldCA9IG9mZnNldDtcbiAgICBsZXQgYml0c0RhdGEgPSAwLFxuICAgICAgYml0c0NvdW50ID0gMDtcblxuICAgIGZ1bmN0aW9uIHJlYWRCaXQoKSB7XG4gICAgICBpZiAoYml0c0NvdW50ID4gMCkge1xuICAgICAgICBiaXRzQ291bnQtLTtcbiAgICAgICAgcmV0dXJuIChiaXRzRGF0YSA+PiBiaXRzQ291bnQpICYgMTtcbiAgICAgIH1cbiAgICAgIGJpdHNEYXRhID0gZGF0YVtvZmZzZXQrK107XG4gICAgICBpZiAoYml0c0RhdGEgPT09IDB4ZmYpIHtcbiAgICAgICAgdmFyIG5leHRCeXRlID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgIGlmIChuZXh0Qnl0ZSkge1xuICAgICAgICAgIGlmIChuZXh0Qnl0ZSA9PT0gLyogRE5MID0gKi8gMHhkYyAmJiBwYXJzZUROTE1hcmtlcikge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7IC8vIFNraXAgbWFya2VyIGxlbmd0aC5cblxuICAgICAgICAgICAgY29uc3Qgc2NhbkxpbmVzID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBpZiAoc2NhbkxpbmVzID4gMCAmJiBzY2FuTGluZXMgIT09IGZyYW1lLnNjYW5MaW5lcykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhXCIsXG4gICAgICAgICAgICAgICAgc2NhbkxpbmVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChuZXh0Qnl0ZSA9PT0gLyogRU9JID0gKi8gMHhkOSkge1xuICAgICAgICAgICAgaWYgKHBhcnNlRE5MTWFya2VyKSB7XG4gICAgICAgICAgICAgIC8vIE5PVEU6IG9ubHkgOC1iaXQgSlBFRyBpbWFnZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIGRlY29kZXIuXG4gICAgICAgICAgICAgIGNvbnN0IG1heWJlU2NhbkxpbmVzID0gYmxvY2tSb3cgKiAoZnJhbWUucHJlY2lzaW9uID09PSA4ID8gOCA6IDApO1xuICAgICAgICAgICAgICAvLyBIZXVyaXN0aWMgdG8gYXR0ZW1wdCB0byBoYW5kbGUgY29ycnVwdCBKUEVHIGltYWdlcyB3aXRoIHRvb1xuICAgICAgICAgICAgICAvLyBsYXJnZSBgc2NhbkxpbmVzYCBwYXJhbWV0ZXIsIGJ5IGZhbGxpbmcgYmFjayB0byB0aGUgY3VycmVudGx5XG4gICAgICAgICAgICAgIC8vIHBhcnNlZCBudW1iZXIgb2Ygc2NhbkxpbmVzIHdoZW4gaXQncyBhdCBsZWFzdCAoYXBwcm94aW1hdGVseSlcbiAgICAgICAgICAgICAgLy8gb25lIG9yZGVyIG9mIG1hZ25pdHVkZSBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQgKGZpeGVzXG4gICAgICAgICAgICAgIC8vIGlzc3VlMTA4ODAucGRmIGFuZCBpc3N1ZTEwOTg5LnBkZikuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtYXliZVNjYW5MaW5lcyA+IDAgJiZcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZyYW1lLnNjYW5MaW5lcyAvIG1heWJlU2NhbkxpbmVzKSA+PSAxMFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlclwiLFxuICAgICAgICAgICAgICAgICAgbWF5YmVTY2FuTGluZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRU9JTWFya2VyRXJyb3IoXG4gICAgICAgICAgICAgIFwiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFxuICAgICAgICAgICAgYHVuZXhwZWN0ZWQgbWFya2VyICR7KChiaXRzRGF0YSA8PCA4KSB8IG5leHRCeXRlKS50b1N0cmluZygxNil9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5zdHVmZiAwXG4gICAgICB9XG4gICAgICBiaXRzQ291bnQgPSA3O1xuICAgICAgcmV0dXJuIGJpdHNEYXRhID4+PiA3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZUh1ZmZtYW4odHJlZSkge1xuICAgICAgdmFyIG5vZGUgPSB0cmVlO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVbcmVhZEJpdCgpXTtcbiAgICAgICAgc3dpdGNoICh0eXBlb2Ygbm9kZSkge1xuICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXCJpbnZhbGlkIGh1ZmZtYW4gc2VxdWVuY2VcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVjZWl2ZShsZW5ndGgpIHtcbiAgICAgIHZhciBuID0gMDtcbiAgICAgIHdoaWxlIChsZW5ndGggPiAwKSB7XG4gICAgICAgIG4gPSAobiA8PCAxKSB8IHJlYWRCaXQoKTtcbiAgICAgICAgbGVuZ3RoLS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWNlaXZlQW5kRXh0ZW5kKGxlbmd0aCkge1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcmVhZEJpdCgpID09PSAxID8gMSA6IC0xO1xuICAgICAgfVxuICAgICAgdmFyIG4gPSByZWNlaXZlKGxlbmd0aCk7XG4gICAgICBpZiAobiA+PSAxIDw8IChsZW5ndGggLSAxKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuICsgKC0xIDw8IGxlbmd0aCkgKyAxO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZUJhc2VsaW5lKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHtcbiAgICAgIHZhciB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpO1xuICAgICAgdmFyIGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCk7XG4gICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7XG4gICAgICB2YXIgayA9IDE7XG4gICAgICB3aGlsZSAoayA8IDY0KSB7XG4gICAgICAgIHZhciBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTtcbiAgICAgICAgdmFyIHMgPSBycyAmIDE1LFxuICAgICAgICAgIHIgPSBycyA+PiA0O1xuICAgICAgICBpZiAocyA9PT0gMCkge1xuICAgICAgICAgIGlmIChyIDwgMTUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrICs9IDE2O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGsgKz0gcjtcbiAgICAgICAgdmFyIHogPSBkY3RaaWdaYWdba107XG4gICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocyk7XG4gICAgICAgIGsrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWNvZGVEQ0ZpcnN0KGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHtcbiAgICAgIHZhciB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpO1xuICAgICAgdmFyIGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCkgPDwgc3VjY2Vzc2l2ZTtcbiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdID0gY29tcG9uZW50LnByZWQgKz0gZGlmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkge1xuICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gfD0gcmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmU7XG4gICAgfVxuXG4gICAgdmFyIGVvYnJ1biA9IDA7XG4gICAgZnVuY3Rpb24gZGVjb2RlQUNGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7XG4gICAgICBpZiAoZW9icnVuID4gMCkge1xuICAgICAgICBlb2JydW4tLTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGsgPSBzcGVjdHJhbFN0YXJ0LFxuICAgICAgICBlID0gc3BlY3RyYWxFbmQ7XG4gICAgICB3aGlsZSAoayA8PSBlKSB7XG4gICAgICAgIHZhciBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTtcbiAgICAgICAgdmFyIHMgPSBycyAmIDE1LFxuICAgICAgICAgIHIgPSBycyA+PiA0O1xuICAgICAgICBpZiAocyA9PT0gMCkge1xuICAgICAgICAgIGlmIChyIDwgMTUpIHtcbiAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKSAtIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgayArPSAxNjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBrICs9IHI7XG4gICAgICAgIHZhciB6ID0gZGN0WmlnWmFnW2tdO1xuICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0ICsgel0gPVxuICAgICAgICAgIHJlY2VpdmVBbmRFeHRlbmQocykgKiAoMSA8PCBzdWNjZXNzaXZlKTtcbiAgICAgICAgaysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdWNjZXNzaXZlQUNTdGF0ZSA9IDAsXG4gICAgICBzdWNjZXNzaXZlQUNOZXh0VmFsdWU7XG4gICAgZnVuY3Rpb24gZGVjb2RlQUNTdWNjZXNzaXZlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHtcbiAgICAgIHZhciBrID0gc3BlY3RyYWxTdGFydDtcbiAgICAgIHZhciBlID0gc3BlY3RyYWxFbmQ7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICB2YXIgcztcbiAgICAgIHZhciBycztcbiAgICAgIHdoaWxlIChrIDw9IGUpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WiA9IGJsb2NrT2Zmc2V0ICsgZGN0WmlnWmFnW2tdO1xuICAgICAgICBjb25zdCBzaWduID0gY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA8IDAgPyAtMSA6IDE7XG4gICAgICAgIHN3aXRjaCAoc3VjY2Vzc2l2ZUFDU3RhdGUpIHtcbiAgICAgICAgICBjYXNlIDA6IC8vIGluaXRpYWwgc3RhdGVcbiAgICAgICAgICAgIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpO1xuICAgICAgICAgICAgcyA9IHJzICYgMTU7XG4gICAgICAgICAgICByID0gcnMgPj4gNDtcbiAgICAgICAgICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgICAgICAgIGlmIChyIDwgMTUpIHtcbiAgICAgICAgICAgICAgICBlb2JydW4gPSByZWNlaXZlKHIpICsgKDEgPDwgcik7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSA0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHIgPSAxNjtcbiAgICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcImludmFsaWQgQUNuIGVuY29kaW5nXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZSA9IHJlY2VpdmVBbmRFeHRlbmQocyk7XG4gICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gciA/IDIgOiAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSAxOiAvLyBza2lwcGluZyByIHplcm8gaXRlbXNcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkge1xuICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgci0tO1xuICAgICAgICAgICAgICBpZiAociA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDIgPyAzIDogMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOiAvLyBzZXQgdmFsdWUgZm9yIGEgemVybyBpdGVtXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkge1xuICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA9XG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIDw8IHN1Y2Nlc3NpdmU7XG4gICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDogLy8gZW9iXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkge1xuICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaysrO1xuICAgICAgfVxuICAgICAgaWYgKHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSA0KSB7XG4gICAgICAgIGVvYnJ1bi0tO1xuICAgICAgICBpZiAoZW9icnVuID09PSAwKSB7XG4gICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJsb2NrUm93ID0gMDtcbiAgICBmdW5jdGlvbiBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGUsIG1jdSwgcm93LCBjb2wpIHtcbiAgICAgIHZhciBtY3VSb3cgPSAobWN1IC8gbWN1c1BlckxpbmUpIHwgMDtcbiAgICAgIHZhciBtY3VDb2wgPSBtY3UgJSBtY3VzUGVyTGluZTtcbiAgICAgIGJsb2NrUm93ID0gbWN1Um93ICogY29tcG9uZW50LnYgKyByb3c7XG4gICAgICB2YXIgYmxvY2tDb2wgPSBtY3VDb2wgKiBjb21wb25lbnQuaCArIGNvbDtcbiAgICAgIGNvbnN0IGJsb2NrT2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpO1xuICAgICAgZGVjb2RlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlLCBtY3UpIHtcbiAgICAgIGJsb2NrUm93ID0gKG1jdSAvIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lKSB8IDA7XG4gICAgICB2YXIgYmxvY2tDb2wgPSBtY3UgJSBjb21wb25lbnQuYmxvY2tzUGVyTGluZTtcbiAgICAgIGNvbnN0IGJsb2NrT2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpO1xuICAgICAgZGVjb2RlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRzTGVuZ3RoID0gY29tcG9uZW50cy5sZW5ndGg7XG4gICAgdmFyIGNvbXBvbmVudCwgaSwgaiwgaywgbjtcbiAgICB2YXIgZGVjb2RlRm47XG4gICAgaWYgKHByb2dyZXNzaXZlKSB7XG4gICAgICBpZiAoc3BlY3RyYWxTdGFydCA9PT0gMCkge1xuICAgICAgICBkZWNvZGVGbiA9IHN1Y2Nlc3NpdmVQcmV2ID09PSAwID8gZGVjb2RlRENGaXJzdCA6IGRlY29kZURDU3VjY2Vzc2l2ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVBQ0ZpcnN0IDogZGVjb2RlQUNTdWNjZXNzaXZlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWNvZGVGbiA9IGRlY29kZUJhc2VsaW5lO1xuICAgIH1cblxuICAgIHZhciBtY3UgPSAwLFxuICAgICAgZmlsZU1hcmtlcjtcbiAgICB2YXIgbWN1RXhwZWN0ZWQ7XG4gICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHtcbiAgICAgIG1jdUV4cGVjdGVkID0gY29tcG9uZW50c1swXS5ibG9ja3NQZXJMaW5lICogY29tcG9uZW50c1swXS5ibG9ja3NQZXJDb2x1bW47XG4gICAgfSBlbHNlIHtcbiAgICAgIG1jdUV4cGVjdGVkID0gbWN1c1BlckxpbmUgKiBmcmFtZS5tY3VzUGVyQ29sdW1uO1xuICAgIH1cblxuICAgIHZhciBoLCB2O1xuICAgIHdoaWxlIChtY3UgPD0gbWN1RXhwZWN0ZWQpIHtcbiAgICAgIC8vIHJlc2V0IGludGVydmFsIHN0dWZmXG4gICAgICB2YXIgbWN1VG9SZWFkID0gcmVzZXRJbnRlcnZhbFxuICAgICAgICA/IE1hdGgubWluKG1jdUV4cGVjdGVkIC0gbWN1LCByZXNldEludGVydmFsKVxuICAgICAgICA6IG1jdUV4cGVjdGVkO1xuXG4gICAgICAvLyBUaGUgYG1jdVRvUmVhZCA9PT0gMGAgY2FzZSBzaG91bGQgb25seSBvY2N1ciB3aGVuIGFsbCBvZiB0aGUgZXhwZWN0ZWRcbiAgICAgIC8vIE1DVSBkYXRhIGhhcyBiZWVuIGFscmVhZHkgcGFyc2VkLCBpLmUuIHdoZW4gYG1jdSA9PT0gbWN1RXhwZWN0ZWRgLCBidXRcbiAgICAgIC8vIHNvbWUgY29ycnVwdCBKUEVHIGltYWdlcyBjb250YWluIG1vcmUgZGF0YSB0aGFuIGludGVuZGVkIGFuZCB3ZSB0aHVzXG4gICAgICAvLyB3YW50IHRvIHNraXAgb3ZlciBhbnkgZXh0cmEgUlNUeCBtYXJrZXJzIGJlbG93IChmaXhlcyBpc3N1ZTExNzk0LnBkZikuXG4gICAgICBpZiAobWN1VG9SZWFkID4gMCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29tcG9uZW50c1tpXS5wcmVkID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlb2JydW4gPSAwO1xuXG4gICAgICAgIGlmIChjb21wb25lbnRzTGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1swXTtcbiAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHtcbiAgICAgICAgICAgIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlRm4sIG1jdSk7XG4gICAgICAgICAgICBtY3UrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChuID0gMDsgbiA8IG1jdVRvUmVhZDsgbisrKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07XG4gICAgICAgICAgICAgIGggPSBjb21wb25lbnQuaDtcbiAgICAgICAgICAgICAgdiA9IGNvbXBvbmVudC52O1xuICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdjsgaisrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgZGVjb2RlTWN1KGNvbXBvbmVudCwgZGVjb2RlRm4sIG1jdSwgaiwgayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtY3UrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZmluZCBtYXJrZXJcbiAgICAgIGJpdHNDb3VudCA9IDA7XG4gICAgICBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIG9mZnNldCk7XG4gICAgICBpZiAoIWZpbGVNYXJrZXIpIHtcbiAgICAgICAgYnJlYWs7IC8vIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UgZGF0YSB3aXRob3V0IGZpbmRpbmcgYW55IG1hcmtlci5cbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWFya2VyLmludmFsaWQpIHtcbiAgICAgICAgLy8gU29tZSBiYWQgaW1hZ2VzIHNlZW0gdG8gcGFkIFNjYW4gYmxvY2tzIHdpdGggZS5nLiB6ZXJvIGJ5dGVzLCBza2lwXG4gICAgICAgIC8vIHBhc3QgdGhvc2UgdG8gYXR0ZW1wdCB0byBmaW5kIGEgdmFsaWQgbWFya2VyIChmaXhlcyBpc3N1ZTQwOTAucGRmKS5cbiAgICAgICAgY29uc3QgcGFydGlhbE1zZyA9IG1jdVRvUmVhZCA+IDAgPyBcInVuZXhwZWN0ZWRcIiA6IFwiZXhjZXNzaXZlXCI7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYGRlY29kZVNjYW4gLSAke3BhcnRpYWxNc2d9IE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogJHtmaWxlTWFya2VyLmludmFsaWR9YFxuICAgICAgICApO1xuICAgICAgICBvZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWFya2VyLm1hcmtlciA+PSAweGZmZDAgJiYgZmlsZU1hcmtlci5tYXJrZXIgPD0gMHhmZmQ3KSB7XG4gICAgICAgIC8vIFJTVHhcbiAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0IC0gc3RhcnRPZmZzZXQ7XG4gIH1cblxuICAvLyBBIHBvcnQgb2YgcG9wcGxlcidzIElEQ1QgbWV0aG9kIHdoaWNoIGluIHR1cm4gaXMgdGFrZW4gZnJvbTpcbiAgLy8gICBDaHJpc3RvcGggTG9lZmZsZXIsIEFkcmlhYW4gTGlndGVuYmVyZywgR2VvcmdlIFMuIE1vc2NoeXR6LFxuICAvLyAgICdQcmFjdGljYWwgRmFzdCAxLUQgRENUIEFsZ29yaXRobXMgd2l0aCAxMSBNdWx0aXBsaWNhdGlvbnMnLFxuICAvLyAgIElFRUUgSW50bC4gQ29uZi4gb24gQWNvdXN0aWNzLCBTcGVlY2ggJiBTaWduYWwgUHJvY2Vzc2luZywgMTk4OSxcbiAgLy8gICA5ODgtOTkxLlxuICBmdW5jdGlvbiBxdWFudGl6ZUFuZEludmVyc2UoY29tcG9uZW50LCBibG9ja0J1ZmZlck9mZnNldCwgcCkge1xuICAgIHZhciBxdCA9IGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSxcbiAgICAgIGJsb2NrRGF0YSA9IGNvbXBvbmVudC5ibG9ja0RhdGE7XG4gICAgdmFyIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NztcbiAgICB2YXIgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3O1xuICAgIHZhciB0O1xuXG4gICAgaWYgKCFxdCkge1xuICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLlwiKTtcbiAgICB9XG5cbiAgICAvLyBpbnZlcnNlIERDVCBvbiByb3dzXG4gICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgNjQ7IHJvdyArPSA4KSB7XG4gICAgICAvLyBnYXRoZXIgYmxvY2sgZGF0YVxuICAgICAgcDAgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3ddO1xuICAgICAgcDEgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAxXTtcbiAgICAgIHAyID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMl07XG4gICAgICBwMyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDNdO1xuICAgICAgcDQgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA0XTtcbiAgICAgIHA1ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNV07XG4gICAgICBwNiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDZdO1xuICAgICAgcDcgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA3XTtcblxuICAgICAgLy8gZGVxdWFudCBwMFxuICAgICAgcDAgKj0gcXRbcm93XTtcblxuICAgICAgLy8gY2hlY2sgZm9yIGFsbC16ZXJvIEFDIGNvZWZmaWNpZW50c1xuICAgICAgaWYgKChwMSB8IHAyIHwgcDMgfCBwNCB8IHA1IHwgcDYgfCBwNykgPT09IDApIHtcbiAgICAgICAgdCA9IChkY3RTcXJ0MiAqIHAwICsgNTEyKSA+PiAxMDtcbiAgICAgICAgcFtyb3ddID0gdDtcbiAgICAgICAgcFtyb3cgKyAxXSA9IHQ7XG4gICAgICAgIHBbcm93ICsgMl0gPSB0O1xuICAgICAgICBwW3JvdyArIDNdID0gdDtcbiAgICAgICAgcFtyb3cgKyA0XSA9IHQ7XG4gICAgICAgIHBbcm93ICsgNV0gPSB0O1xuICAgICAgICBwW3JvdyArIDZdID0gdDtcbiAgICAgICAgcFtyb3cgKyA3XSA9IHQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gZGVxdWFudCBwMSAuLi4gcDdcbiAgICAgIHAxICo9IHF0W3JvdyArIDFdO1xuICAgICAgcDIgKj0gcXRbcm93ICsgMl07XG4gICAgICBwMyAqPSBxdFtyb3cgKyAzXTtcbiAgICAgIHA0ICo9IHF0W3JvdyArIDRdO1xuICAgICAgcDUgKj0gcXRbcm93ICsgNV07XG4gICAgICBwNiAqPSBxdFtyb3cgKyA2XTtcbiAgICAgIHA3ICo9IHF0W3JvdyArIDddO1xuXG4gICAgICAvLyBzdGFnZSA0XG4gICAgICB2MCA9IChkY3RTcXJ0MiAqIHAwICsgMTI4KSA+PiA4O1xuICAgICAgdjEgPSAoZGN0U3FydDIgKiBwNCArIDEyOCkgPj4gODtcbiAgICAgIHYyID0gcDI7XG4gICAgICB2MyA9IHA2O1xuICAgICAgdjQgPSAoZGN0U3FydDFkMiAqIChwMSAtIHA3KSArIDEyOCkgPj4gODtcbiAgICAgIHY3ID0gKGRjdFNxcnQxZDIgKiAocDEgKyBwNykgKyAxMjgpID4+IDg7XG4gICAgICB2NSA9IHAzIDw8IDQ7XG4gICAgICB2NiA9IHA1IDw8IDQ7XG5cbiAgICAgIC8vIHN0YWdlIDNcbiAgICAgIHYwID0gKHYwICsgdjEgKyAxKSA+PiAxO1xuICAgICAgdjEgPSB2MCAtIHYxO1xuICAgICAgdCA9ICh2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAxMjgpID4+IDg7XG4gICAgICB2MiA9ICh2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAxMjgpID4+IDg7XG4gICAgICB2MyA9IHQ7XG4gICAgICB2NCA9ICh2NCArIHY2ICsgMSkgPj4gMTtcbiAgICAgIHY2ID0gdjQgLSB2NjtcbiAgICAgIHY3ID0gKHY3ICsgdjUgKyAxKSA+PiAxO1xuICAgICAgdjUgPSB2NyAtIHY1O1xuXG4gICAgICAvLyBzdGFnZSAyXG4gICAgICB2MCA9ICh2MCArIHYzICsgMSkgPj4gMTtcbiAgICAgIHYzID0gdjAgLSB2MztcbiAgICAgIHYxID0gKHYxICsgdjIgKyAxKSA+PiAxO1xuICAgICAgdjIgPSB2MSAtIHYyO1xuICAgICAgdCA9ICh2NCAqIGRjdFNpbjMgKyB2NyAqIGRjdENvczMgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHY0ID0gKHY0ICogZGN0Q29zMyAtIHY3ICogZGN0U2luMyArIDIwNDgpID4+IDEyO1xuICAgICAgdjcgPSB0O1xuICAgICAgdCA9ICh2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHY1ID0gKHY1ICogZGN0Q29zMSAtIHY2ICogZGN0U2luMSArIDIwNDgpID4+IDEyO1xuICAgICAgdjYgPSB0O1xuXG4gICAgICAvLyBzdGFnZSAxXG4gICAgICBwW3Jvd10gPSB2MCArIHY3O1xuICAgICAgcFtyb3cgKyA3XSA9IHYwIC0gdjc7XG4gICAgICBwW3JvdyArIDFdID0gdjEgKyB2NjtcbiAgICAgIHBbcm93ICsgNl0gPSB2MSAtIHY2O1xuICAgICAgcFtyb3cgKyAyXSA9IHYyICsgdjU7XG4gICAgICBwW3JvdyArIDVdID0gdjIgLSB2NTtcbiAgICAgIHBbcm93ICsgM10gPSB2MyArIHY0O1xuICAgICAgcFtyb3cgKyA0XSA9IHYzIC0gdjQ7XG4gICAgfVxuXG4gICAgLy8gaW52ZXJzZSBEQ1Qgb24gY29sdW1uc1xuICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IDg7ICsrY29sKSB7XG4gICAgICBwMCA9IHBbY29sXTtcbiAgICAgIHAxID0gcFtjb2wgKyA4XTtcbiAgICAgIHAyID0gcFtjb2wgKyAxNl07XG4gICAgICBwMyA9IHBbY29sICsgMjRdO1xuICAgICAgcDQgPSBwW2NvbCArIDMyXTtcbiAgICAgIHA1ID0gcFtjb2wgKyA0MF07XG4gICAgICBwNiA9IHBbY29sICsgNDhdO1xuICAgICAgcDcgPSBwW2NvbCArIDU2XTtcblxuICAgICAgLy8gY2hlY2sgZm9yIGFsbC16ZXJvIEFDIGNvZWZmaWNpZW50c1xuICAgICAgaWYgKChwMSB8IHAyIHwgcDMgfCBwNCB8IHA1IHwgcDYgfCBwNykgPT09IDApIHtcbiAgICAgICAgdCA9IChkY3RTcXJ0MiAqIHAwICsgODE5MikgPj4gMTQ7XG4gICAgICAgIC8vIENvbnZlcnQgdG8gOC1iaXQuXG4gICAgICAgIGlmICh0IDwgLTIwNDApIHtcbiAgICAgICAgICB0ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0ID49IDIwMjQpIHtcbiAgICAgICAgICB0ID0gMjU1O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHQgPSAodCArIDIwNTYpID4+IDQ7XG4gICAgICAgIH1cbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHQ7XG4gICAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gdDtcbiAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YWdlIDRcbiAgICAgIHYwID0gKGRjdFNxcnQyICogcDAgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHYxID0gKGRjdFNxcnQyICogcDQgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHYyID0gcDI7XG4gICAgICB2MyA9IHA2O1xuICAgICAgdjQgPSAoZGN0U3FydDFkMiAqIChwMSAtIHA3KSArIDIwNDgpID4+IDEyO1xuICAgICAgdjcgPSAoZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDIwNDgpID4+IDEyO1xuICAgICAgdjUgPSBwMztcbiAgICAgIHY2ID0gcDU7XG5cbiAgICAgIC8vIHN0YWdlIDNcbiAgICAgIC8vIFNoaWZ0IHYwIGJ5IDEyOC41IDw8IDUgaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBzaGlmdCBwMC4uLnA3IHdoZW5cbiAgICAgIC8vIGNvbnZlcnRpbmcgdG8gVUludDggcmFuZ2UgbGF0ZXIuXG4gICAgICB2MCA9ICgodjAgKyB2MSArIDEpID4+IDEpICsgNDExMjtcbiAgICAgIHYxID0gdjAgLSB2MTtcbiAgICAgIHQgPSAodjIgKiBkY3RTaW42ICsgdjMgKiBkY3RDb3M2ICsgMjA0OCkgPj4gMTI7XG4gICAgICB2MiA9ICh2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAyMDQ4KSA+PiAxMjtcbiAgICAgIHYzID0gdDtcbiAgICAgIHY0ID0gKHY0ICsgdjYgKyAxKSA+PiAxO1xuICAgICAgdjYgPSB2NCAtIHY2O1xuICAgICAgdjcgPSAodjcgKyB2NSArIDEpID4+IDE7XG4gICAgICB2NSA9IHY3IC0gdjU7XG5cbiAgICAgIC8vIHN0YWdlIDJcbiAgICAgIHYwID0gKHYwICsgdjMgKyAxKSA+PiAxO1xuICAgICAgdjMgPSB2MCAtIHYzO1xuICAgICAgdjEgPSAodjEgKyB2MiArIDEpID4+IDE7XG4gICAgICB2MiA9IHYxIC0gdjI7XG4gICAgICB0ID0gKHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDgpID4+IDEyO1xuICAgICAgdjQgPSAodjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NyA9IHQ7XG4gICAgICB0ID0gKHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDgpID4+IDEyO1xuICAgICAgdjUgPSAodjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCkgPj4gMTI7XG4gICAgICB2NiA9IHQ7XG5cbiAgICAgIC8vIHN0YWdlIDFcbiAgICAgIHAwID0gdjAgKyB2NztcbiAgICAgIHA3ID0gdjAgLSB2NztcbiAgICAgIHAxID0gdjEgKyB2NjtcbiAgICAgIHA2ID0gdjEgLSB2NjtcbiAgICAgIHAyID0gdjIgKyB2NTtcbiAgICAgIHA1ID0gdjIgLSB2NTtcbiAgICAgIHAzID0gdjMgKyB2NDtcbiAgICAgIHA0ID0gdjMgLSB2NDtcblxuICAgICAgLy8gQ29udmVydCB0byA4LWJpdCBpbnRlZ2Vycy5cbiAgICAgIGlmIChwMCA8IDE2KSB7XG4gICAgICAgIHAwID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDAgPj0gNDA4MCkge1xuICAgICAgICBwMCA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAwID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHAxIDwgMTYpIHtcbiAgICAgICAgcDEgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwMSA+PSA0MDgwKSB7XG4gICAgICAgIHAxID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDEgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDIgPCAxNikge1xuICAgICAgICBwMiA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHAyID49IDQwODApIHtcbiAgICAgICAgcDIgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwMiA+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmIChwMyA8IDE2KSB7XG4gICAgICAgIHAzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDMgPj0gNDA4MCkge1xuICAgICAgICBwMyA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHAzID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHA0IDwgMTYpIHtcbiAgICAgICAgcDQgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwNCA+PSA0MDgwKSB7XG4gICAgICAgIHA0ID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDQgPj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAocDUgPCAxNikge1xuICAgICAgICBwNSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHA1ID49IDQwODApIHtcbiAgICAgICAgcDUgPSAyNTU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwNSA+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmIChwNiA8IDE2KSB7XG4gICAgICAgIHA2ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocDYgPj0gNDA4MCkge1xuICAgICAgICBwNiA9IDI1NTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHA2ID4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHA3IDwgMTYpIHtcbiAgICAgICAgcDcgPSAwO1xuICAgICAgfSBlbHNlIGlmIChwNyA+PSA0MDgwKSB7XG4gICAgICAgIHA3ID0gMjU1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcDcgPj49IDQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0b3JlIGJsb2NrIGRhdGFcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbF0gPSBwMDtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gcDE7XG4gICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSBwMjtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDI0XSA9IHAzO1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gcDQ7XG4gICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSBwNTtcbiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQ4XSA9IHA2O1xuICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gcDc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpIHtcbiAgICB2YXIgYmxvY2tzUGVyTGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lO1xuICAgIHZhciBibG9ja3NQZXJDb2x1bW4gPSBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uO1xuICAgIHZhciBjb21wdXRhdGlvbkJ1ZmZlciA9IG5ldyBJbnQxNkFycmF5KDY0KTtcblxuICAgIGZvciAodmFyIGJsb2NrUm93ID0gMDsgYmxvY2tSb3cgPCBibG9ja3NQZXJDb2x1bW47IGJsb2NrUm93KyspIHtcbiAgICAgIGZvciAodmFyIGJsb2NrQ29sID0gMDsgYmxvY2tDb2wgPCBibG9ja3NQZXJMaW5lOyBibG9ja0NvbCsrKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7XG4gICAgICAgIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIG9mZnNldCwgY29tcHV0YXRpb25CdWZmZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50LmJsb2NrRGF0YTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBjdXJyZW50UG9zLCBzdGFydFBvcyA9IGN1cnJlbnRQb3MpIHtcbiAgICBjb25zdCBtYXhQb3MgPSBkYXRhLmxlbmd0aCAtIDE7XG4gICAgdmFyIG5ld1BvcyA9IHN0YXJ0UG9zIDwgY3VycmVudFBvcyA/IHN0YXJ0UG9zIDogY3VycmVudFBvcztcblxuICAgIGlmIChjdXJyZW50UG9zID49IG1heFBvcykge1xuICAgICAgcmV0dXJuIG51bGw7IC8vIERvbid0IGF0dGVtcHQgdG8gcmVhZCBub24tZXhpc3RlbnQgZGF0YSBhbmQganVzdCByZXR1cm4uXG4gICAgfVxuICAgIHZhciBjdXJyZW50TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBjdXJyZW50UG9zKTtcbiAgICBpZiAoY3VycmVudE1hcmtlciA+PSAweGZmYzAgJiYgY3VycmVudE1hcmtlciA8PSAweGZmZmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGludmFsaWQ6IG51bGwsXG4gICAgICAgIG1hcmtlcjogY3VycmVudE1hcmtlcixcbiAgICAgICAgb2Zmc2V0OiBjdXJyZW50UG9zLFxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIG5ld01hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgbmV3UG9zKTtcbiAgICB3aGlsZSAoIShuZXdNYXJrZXIgPj0gMHhmZmMwICYmIG5ld01hcmtlciA8PSAweGZmZmUpKSB7XG4gICAgICBpZiAoKytuZXdQb3MgPj0gbWF4UG9zKSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBEb24ndCBhdHRlbXB0IHRvIHJlYWQgbm9uLWV4aXN0ZW50IGRhdGEgYW5kIGp1c3QgcmV0dXJuLlxuICAgICAgfVxuICAgICAgbmV3TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBuZXdQb3MpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaW52YWxpZDogY3VycmVudE1hcmtlci50b1N0cmluZygxNiksXG4gICAgICBtYXJrZXI6IG5ld01hcmtlcixcbiAgICAgIG9mZnNldDogbmV3UG9zLFxuICAgIH07XG4gIH1cblxuICBKcGVnSW1hZ2UucHJvdG90eXBlID0ge1xuICAgIHBhcnNlKGRhdGEsIHsgZG5sU2NhbkxpbmVzID0gbnVsbCB9ID0ge30pIHtcbiAgICAgIGZ1bmN0aW9uIHJlYWREYXRhQmxvY2soKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgIGxldCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGggLSAyO1xuXG4gICAgICAgIHZhciBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGVuZE9mZnNldCwgb2Zmc2V0KTtcbiAgICAgICAgaWYgKGZpbGVNYXJrZXIgJiYgZmlsZU1hcmtlci5pbnZhbGlkKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwicmVhZERhdGFCbG9jayAtIGluY29ycmVjdCBsZW5ndGgsIGN1cnJlbnQgbWFya2VyIGlzOiBcIiArXG4gICAgICAgICAgICAgIGZpbGVNYXJrZXIuaW52YWxpZFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kT2Zmc2V0ID0gZmlsZU1hcmtlci5vZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXJyYXkgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgZW5kT2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwcmVwYXJlQ29tcG9uZW50cyhmcmFtZSkge1xuICAgICAgICB2YXIgbWN1c1BlckxpbmUgPSBNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4IC8gZnJhbWUubWF4SCk7XG4gICAgICAgIHZhciBtY3VzUGVyQ29sdW1uID0gTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDggLyBmcmFtZS5tYXhWKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFtZS5jb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tpXTtcbiAgICAgICAgICB2YXIgYmxvY2tzUGVyTGluZSA9IE1hdGguY2VpbChcbiAgICAgICAgICAgIChNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4KSAqIGNvbXBvbmVudC5oKSAvIGZyYW1lLm1heEhcbiAgICAgICAgICApO1xuICAgICAgICAgIHZhciBibG9ja3NQZXJDb2x1bW4gPSBNYXRoLmNlaWwoXG4gICAgICAgICAgICAoTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDgpICogY29tcG9uZW50LnYpIC8gZnJhbWUubWF4VlxuICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIGJsb2Nrc1BlckxpbmVGb3JNY3UgPSBtY3VzUGVyTGluZSAqIGNvbXBvbmVudC5oO1xuICAgICAgICAgIHZhciBibG9ja3NQZXJDb2x1bW5Gb3JNY3UgPSBtY3VzUGVyQ29sdW1uICogY29tcG9uZW50LnY7XG5cbiAgICAgICAgICB2YXIgYmxvY2tzQnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICA2NCAqIGJsb2Nrc1BlckNvbHVtbkZvck1jdSAqIChibG9ja3NQZXJMaW5lRm9yTWN1ICsgMSk7XG4gICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YSA9IG5ldyBJbnQxNkFycmF5KGJsb2Nrc0J1ZmZlclNpemUpO1xuICAgICAgICAgIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lID0gYmxvY2tzUGVyTGluZTtcbiAgICAgICAgICBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uID0gYmxvY2tzUGVyQ29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIGZyYW1lLm1jdXNQZXJMaW5lID0gbWN1c1BlckxpbmU7XG4gICAgICAgIGZyYW1lLm1jdXNQZXJDb2x1bW4gPSBtY3VzUGVyQ29sdW1uO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgIHZhciBqZmlmID0gbnVsbDtcbiAgICAgIHZhciBhZG9iZSA9IG51bGw7XG4gICAgICB2YXIgZnJhbWUsIHJlc2V0SW50ZXJ2YWw7XG4gICAgICBsZXQgbnVtU09TTWFya2VycyA9IDA7XG4gICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVzID0gW107XG4gICAgICB2YXIgaHVmZm1hblRhYmxlc0FDID0gW10sXG4gICAgICAgIGh1ZmZtYW5UYWJsZXNEQyA9IFtdO1xuXG4gICAgICBsZXQgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSAyO1xuICAgICAgaWYgKGZpbGVNYXJrZXIgIT09IC8qIFNPSSAoU3RhcnQgb2YgSW1hZ2UpID0gKi8gMHhmZmQ4KSB7XG4gICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoXCJTT0kgbm90IGZvdW5kXCIpO1xuICAgICAgfVxuICAgICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSAyO1xuXG4gICAgICBtYXJrZXJMb29wOiB3aGlsZSAoZmlsZU1hcmtlciAhPT0gLyogRU9JIChFbmQgb2YgSW1hZ2UpID0gKi8gMHhmZmQ5KSB7XG4gICAgICAgIHZhciBpLCBqLCBsO1xuICAgICAgICBzd2l0Y2ggKGZpbGVNYXJrZXIpIHtcbiAgICAgICAgICBjYXNlIDB4ZmZlMDogLy8gQVBQMCAoQXBwbGljYXRpb24gU3BlY2lmaWMpXG4gICAgICAgICAgY2FzZSAweGZmZTE6IC8vIEFQUDFcbiAgICAgICAgICBjYXNlIDB4ZmZlMjogLy8gQVBQMlxuICAgICAgICAgIGNhc2UgMHhmZmUzOiAvLyBBUFAzXG4gICAgICAgICAgY2FzZSAweGZmZTQ6IC8vIEFQUDRcbiAgICAgICAgICBjYXNlIDB4ZmZlNTogLy8gQVBQNVxuICAgICAgICAgIGNhc2UgMHhmZmU2OiAvLyBBUFA2XG4gICAgICAgICAgY2FzZSAweGZmZTc6IC8vIEFQUDdcbiAgICAgICAgICBjYXNlIDB4ZmZlODogLy8gQVBQOFxuICAgICAgICAgIGNhc2UgMHhmZmU5OiAvLyBBUFA5XG4gICAgICAgICAgY2FzZSAweGZmZWE6IC8vIEFQUDEwXG4gICAgICAgICAgY2FzZSAweGZmZWI6IC8vIEFQUDExXG4gICAgICAgICAgY2FzZSAweGZmZWM6IC8vIEFQUDEyXG4gICAgICAgICAgY2FzZSAweGZmZWQ6IC8vIEFQUDEzXG4gICAgICAgICAgY2FzZSAweGZmZWU6IC8vIEFQUDE0XG4gICAgICAgICAgY2FzZSAweGZmZWY6IC8vIEFQUDE1XG4gICAgICAgICAgY2FzZSAweGZmZmU6IC8vIENPTSAoQ29tbWVudClcbiAgICAgICAgICAgIHZhciBhcHBEYXRhID0gcmVhZERhdGFCbG9jaygpO1xuXG4gICAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmUwKSB7XG4gICAgICAgICAgICAgIC8vICdKRklGXFx4MDAnXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzBdID09PSAweDRhICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVsxXSA9PT0gMHg0NiAmJlxuICAgICAgICAgICAgICAgIGFwcERhdGFbMl0gPT09IDB4NDkgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzNdID09PSAweDQ2ICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVs0XSA9PT0gMFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBqZmlmID0ge1xuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogeyBtYWpvcjogYXBwRGF0YVs1XSwgbWlub3I6IGFwcERhdGFbNl0gfSxcbiAgICAgICAgICAgICAgICAgIGRlbnNpdHlVbml0czogYXBwRGF0YVs3XSxcbiAgICAgICAgICAgICAgICAgIHhEZW5zaXR5OiAoYXBwRGF0YVs4XSA8PCA4KSB8IGFwcERhdGFbOV0sXG4gICAgICAgICAgICAgICAgICB5RGVuc2l0eTogKGFwcERhdGFbMTBdIDw8IDgpIHwgYXBwRGF0YVsxMV0sXG4gICAgICAgICAgICAgICAgICB0aHVtYldpZHRoOiBhcHBEYXRhWzEyXSxcbiAgICAgICAgICAgICAgICAgIHRodW1iSGVpZ2h0OiBhcHBEYXRhWzEzXSxcbiAgICAgICAgICAgICAgICAgIHRodW1iRGF0YTogYXBwRGF0YS5zdWJhcnJheShcbiAgICAgICAgICAgICAgICAgICAgMTQsXG4gICAgICAgICAgICAgICAgICAgIDE0ICsgMyAqIGFwcERhdGFbMTJdICogYXBwRGF0YVsxM11cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETyBBUFAxIC0gRXhpZlxuICAgICAgICAgICAgaWYgKGZpbGVNYXJrZXIgPT09IDB4ZmZlZSkge1xuICAgICAgICAgICAgICAvLyAnQWRvYmUnXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzBdID09PSAweDQxICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVsxXSA9PT0gMHg2NCAmJlxuICAgICAgICAgICAgICAgIGFwcERhdGFbMl0gPT09IDB4NmYgJiZcbiAgICAgICAgICAgICAgICBhcHBEYXRhWzNdID09PSAweDYyICYmXG4gICAgICAgICAgICAgICAgYXBwRGF0YVs0XSA9PT0gMHg2NVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhZG9iZSA9IHtcbiAgICAgICAgICAgICAgICAgIHZlcnNpb246IChhcHBEYXRhWzVdIDw8IDgpIHwgYXBwRGF0YVs2XSxcbiAgICAgICAgICAgICAgICAgIGZsYWdzMDogKGFwcERhdGFbN10gPDwgOCkgfCBhcHBEYXRhWzhdLFxuICAgICAgICAgICAgICAgICAgZmxhZ3MxOiAoYXBwRGF0YVs5XSA8PCA4KSB8IGFwcERhdGFbMTBdLFxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtQ29kZTogYXBwRGF0YVsxMV0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZkYjogLy8gRFFUIChEZWZpbmUgUXVhbnRpemF0aW9uIFRhYmxlcylcbiAgICAgICAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlc0VuZCA9IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCArIG9mZnNldCAtIDI7XG4gICAgICAgICAgICB2YXIgejtcbiAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBxdWFudGl6YXRpb25UYWJsZXNFbmQpIHtcbiAgICAgICAgICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICB2YXIgdGFibGVEYXRhID0gbmV3IFVpbnQxNkFycmF5KDY0KTtcbiAgICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvblRhYmxlU3BlYyA+PiA0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gOCBiaXQgdmFsdWVzXG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIHogPSBkY3RaaWdaYWdbal07XG4gICAgICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyAxNiBiaXQgdmFsdWVzXG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIHogPSBkY3RaaWdaYWdbal07XG4gICAgICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcIkRRVCAtIGludmFsaWQgdGFibGUgc3BlY1wiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZjMDogLy8gU09GMCAoU3RhcnQgb2YgRnJhbWUsIEJhc2VsaW5lIERDVClcbiAgICAgICAgICBjYXNlIDB4ZmZjMTogLy8gU09GMSAoU3RhcnQgb2YgRnJhbWUsIEV4dGVuZGVkIERDVClcbiAgICAgICAgICBjYXNlIDB4ZmZjMjogLy8gU09GMiAoU3RhcnQgb2YgRnJhbWUsIFByb2dyZXNzaXZlIERDVClcbiAgICAgICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFwiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7IC8vIFNraXAgbWFya2VyIGxlbmd0aC5cblxuICAgICAgICAgICAgZnJhbWUgPSB7fTtcbiAgICAgICAgICAgIGZyYW1lLmV4dGVuZGVkID0gZmlsZU1hcmtlciA9PT0gMHhmZmMxO1xuICAgICAgICAgICAgZnJhbWUucHJvZ3Jlc3NpdmUgPSBmaWxlTWFya2VyID09PSAweGZmYzI7XG4gICAgICAgICAgICBmcmFtZS5wcmVjaXNpb24gPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgIGNvbnN0IHNvZlNjYW5MaW5lcyA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgICAgZnJhbWUuc2NhbkxpbmVzID0gZG5sU2NhbkxpbmVzIHx8IHNvZlNjYW5MaW5lcztcbiAgICAgICAgICAgIGZyYW1lLnNhbXBsZXNQZXJMaW5lID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBmcmFtZS5jb21wb25lbnRzID0gW107XG4gICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHMgPSB7fTtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBkYXRhW29mZnNldCsrXSxcbiAgICAgICAgICAgICAgY29tcG9uZW50SWQ7XG4gICAgICAgICAgICB2YXIgbWF4SCA9IDAsXG4gICAgICAgICAgICAgIG1heFYgPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudElkID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICB2YXIgaCA9IGRhdGFbb2Zmc2V0ICsgMV0gPj4gNDtcbiAgICAgICAgICAgICAgdmFyIHYgPSBkYXRhW29mZnNldCArIDFdICYgMTU7XG4gICAgICAgICAgICAgIGlmIChtYXhIIDwgaCkge1xuICAgICAgICAgICAgICAgIG1heEggPSBoO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChtYXhWIDwgdikge1xuICAgICAgICAgICAgICAgIG1heFYgPSB2O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBxSWQgPSBkYXRhW29mZnNldCArIDJdO1xuICAgICAgICAgICAgICBsID0gZnJhbWUuY29tcG9uZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBoLFxuICAgICAgICAgICAgICAgIHYsXG4gICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uSWQ6IHFJZCxcbiAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZTogbnVsbCwgLy8gU2VlIGNvbW1lbnQgYmVsb3cuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHNbY29tcG9uZW50SWRdID0gbCAtIDE7XG4gICAgICAgICAgICAgIG9mZnNldCArPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJhbWUubWF4SCA9IG1heEg7XG4gICAgICAgICAgICBmcmFtZS5tYXhWID0gbWF4VjtcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAweGZmYzQ6IC8vIERIVCAoRGVmaW5lIEh1ZmZtYW4gVGFibGVzKVxuICAgICAgICAgICAgY29uc3QgaHVmZm1hbkxlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgICAgZm9yIChpID0gMjsgaSA8IGh1ZmZtYW5MZW5ndGg7ICkge1xuICAgICAgICAgICAgICB2YXIgaHVmZm1hblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICB2YXIgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgICAgICAgICAgIHZhciBjb2RlTGVuZ3RoU3VtID0gMDtcbiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyssIG9mZnNldCsrKSB7XG4gICAgICAgICAgICAgICAgY29kZUxlbmd0aFN1bSArPSBjb2RlTGVuZ3Roc1tqXSA9IGRhdGFbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgaHVmZm1hblZhbHVlcyA9IG5ldyBVaW50OEFycmF5KGNvZGVMZW5ndGhTdW0pO1xuICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aFN1bTsgaisrLCBvZmZzZXQrKykge1xuICAgICAgICAgICAgICAgIGh1ZmZtYW5WYWx1ZXNbal0gPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaSArPSAxNyArIGNvZGVMZW5ndGhTdW07XG5cbiAgICAgICAgICAgICAgKGh1ZmZtYW5UYWJsZVNwZWMgPj4gNCA9PT0gMCA/IGh1ZmZtYW5UYWJsZXNEQyA6IGh1ZmZtYW5UYWJsZXNBQylbXG4gICAgICAgICAgICAgICAgaHVmZm1hblRhYmxlU3BlYyAmIDE1XG4gICAgICAgICAgICAgIF0gPSBidWlsZEh1ZmZtYW5UYWJsZShjb2RlTGVuZ3RocywgaHVmZm1hblZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMHhmZmRkOiAvLyBEUkkgKERlZmluZSBSZXN0YXJ0IEludGVydmFsKVxuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7IC8vIFNraXAgbWFya2VyIGxlbmd0aC5cblxuICAgICAgICAgICAgcmVzZXRJbnRlcnZhbCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZkYTogLy8gU09TIChTdGFydCBvZiBTY2FuKVxuICAgICAgICAgICAgLy8gQSBETkwgbWFya2VyICgweEZGREMpLCBpZiBpdCBleGlzdHMsIGlzIG9ubHkgYWxsb3dlZCBhdCB0aGUgZW5kXG4gICAgICAgICAgICAvLyBvZiB0aGUgZmlyc3Qgc2NhbiBzZWdtZW50IGFuZCBtYXkgb25seSBvY2N1ciBvbmNlIGluIGFuIGltYWdlLlxuICAgICAgICAgICAgLy8gRnVydGhlcm1vcmUsIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCwgZG8gKm5vdCogYXR0ZW1wdCB0b1xuICAgICAgICAgICAgLy8gcGFyc2UgRE5MIG1hcmtlcnMgZHVyaW5nIHJlLXBhcnNpbmcgb2YgdGhlIEpQRUcgc2NhbiBkYXRhLlxuICAgICAgICAgICAgY29uc3QgcGFyc2VETkxNYXJrZXIgPSArK251bVNPU01hcmtlcnMgPT09IDEgJiYgIWRubFNjYW5MaW5lcztcblxuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7IC8vIFNraXAgbWFya2VyIGxlbmd0aC5cblxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yc0NvdW50ID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdLFxuICAgICAgICAgICAgICBjb21wb25lbnQ7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZWN0b3JzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICB2YXIgY29tcG9uZW50SW5kZXggPSBmcmFtZS5jb21wb25lbnRJZHNbaW5kZXhdO1xuICAgICAgICAgICAgICBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2NvbXBvbmVudEluZGV4XTtcbiAgICAgICAgICAgICAgY29tcG9uZW50LmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgIHZhciB0YWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDID0gaHVmZm1hblRhYmxlc0RDW3RhYmxlU3BlYyA+PiA0XTtcbiAgICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDID0gaHVmZm1hblRhYmxlc0FDW3RhYmxlU3BlYyAmIDE1XTtcbiAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3BlY3RyYWxTdGFydCA9IGRhdGFbb2Zmc2V0KytdO1xuICAgICAgICAgICAgdmFyIHNwZWN0cmFsRW5kID0gZGF0YVtvZmZzZXQrK107XG4gICAgICAgICAgICB2YXIgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPSBkYXRhW29mZnNldCsrXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciBwcm9jZXNzZWQgPSBkZWNvZGVTY2FuKFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgICAgIGZyYW1lLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgcmVzZXRJbnRlcnZhbCxcbiAgICAgICAgICAgICAgICBzcGVjdHJhbFN0YXJ0LFxuICAgICAgICAgICAgICAgIHNwZWN0cmFsRW5kLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID4+IDQsXG4gICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gJiAxNSxcbiAgICAgICAgICAgICAgICBwYXJzZUROTE1hcmtlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBvZmZzZXQgKz0gcHJvY2Vzc2VkO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRE5MTWFya2VyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB3YXJuKGAke2V4Lm1lc3NhZ2V9IC0tIGF0dGVtcHRpbmcgdG8gcmUtcGFyc2UgdGhlIEpQRUcgaW1hZ2UuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoZGF0YSwgeyBkbmxTY2FuTGluZXM6IGV4LnNjYW5MaW5lcyB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIEVPSU1hcmtlckVycm9yKSB7XG4gICAgICAgICAgICAgICAgd2FybihgJHtleC5tZXNzYWdlfSAtLSBpZ25vcmluZyB0aGUgcmVzdCBvZiB0aGUgaW1hZ2UgZGF0YS5gKTtcbiAgICAgICAgICAgICAgICBicmVhayBtYXJrZXJMb29wO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDB4ZmZkYzogLy8gRE5MIChEZWZpbmUgTnVtYmVyIG9mIExpbmVzKVxuICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBtYXJrZXIsIHNpbmNlIGl0J3MgYmVpbmcgaGFuZGxlZCBpbiBgZGVjb2RlU2NhbmAuXG4gICAgICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAweGZmZmY6IC8vIEZpbGwgYnl0ZXNcbiAgICAgICAgICAgIGlmIChkYXRhW29mZnNldF0gIT09IDB4ZmYpIHtcbiAgICAgICAgICAgICAgLy8gQXZvaWQgc2tpcHBpbmcgYSB2YWxpZCBtYXJrZXIuXG4gICAgICAgICAgICAgIG9mZnNldC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gQ291bGQgYmUgaW5jb3JyZWN0IGVuY29kaW5nIC0tIHRoZSBsYXN0IDB4RkYgYnl0ZSBvZiB0aGUgcHJldmlvdXNcbiAgICAgICAgICAgIC8vIGJsb2NrIGNvdWxkIGhhdmUgYmVlbiBlYXRlbiBieSB0aGUgZW5jb2RlciwgaGVuY2Ugd2UgZmFsbGJhY2sgdG9cbiAgICAgICAgICAgIC8vIGBzdGFydFBvcyA9IG9mZnNldCAtIDNgIHdoZW4gbG9va2luZyBmb3IgdGhlIG5leHQgdmFsaWQgbWFya2VyLlxuICAgICAgICAgICAgY29uc3QgbmV4dEZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIC8qIGN1cnJlbnRQb3MgPSAqLyBvZmZzZXQgLSAyLFxuICAgICAgICAgICAgICAvKiBzdGFydFBvcyA9ICovIG9mZnNldCAtIDNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobmV4dEZpbGVNYXJrZXIgJiYgbmV4dEZpbGVNYXJrZXIuaW52YWxpZCkge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwiSnBlZ0ltYWdlLnBhcnNlIC0gdW5leHBlY3RlZCBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogXCIgK1xuICAgICAgICAgICAgICAgICAgbmV4dEZpbGVNYXJrZXIuaW52YWxpZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBvZmZzZXQgPSBuZXh0RmlsZU1hcmtlci5vZmZzZXQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBkYXRhLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICBcIkpwZWdJbWFnZS5wYXJzZSAtIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UgZGF0YSBcIiArXG4gICAgICAgICAgICAgICAgICBcIndpdGhvdXQgZmluZGluZyBhbiBFT0kgbWFya2VyICgweEZGRDkpLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKFxuICAgICAgICAgICAgICBcIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiBcIiArIGZpbGVNYXJrZXIudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgfVxuXG4gICAgICB0aGlzLndpZHRoID0gZnJhbWUuc2FtcGxlc1BlckxpbmU7XG4gICAgICB0aGlzLmhlaWdodCA9IGZyYW1lLnNjYW5MaW5lcztcbiAgICAgIHRoaXMuamZpZiA9IGpmaWY7XG4gICAgICB0aGlzLmFkb2JlID0gYWRvYmU7XG4gICAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS5jb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbaV07XG5cbiAgICAgICAgLy8gUHJldmVudCBlcnJvcnMgd2hlbiBEUVQgbWFya2VycyBhcmUgcGxhY2VkIGFmdGVyIFNPRntufSBtYXJrZXJzLFxuICAgICAgICAvLyBieSBhc3NpZ25pbmcgdGhlIGBxdWFudGl6YXRpb25UYWJsZWAgZW50cnkgYWZ0ZXIgdGhlIGVudGlyZSBpbWFnZVxuICAgICAgICAvLyBoYXMgYmVlbiBwYXJzZWQgKGZpeGVzIGlzc3VlNzQwNi5wZGYpLlxuICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGUgPSBxdWFudGl6YXRpb25UYWJsZXNbY29tcG9uZW50LnF1YW50aXphdGlvbklkXTtcbiAgICAgICAgaWYgKHF1YW50aXphdGlvblRhYmxlKSB7XG4gICAgICAgICAgY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlID0gcXVhbnRpemF0aW9uVGFibGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IGNvbXBvbmVudC5pbmRleCxcbiAgICAgICAgICBvdXRwdXQ6IGJ1aWxkQ29tcG9uZW50RGF0YShmcmFtZSwgY29tcG9uZW50KSxcbiAgICAgICAgICBzY2FsZVg6IGNvbXBvbmVudC5oIC8gZnJhbWUubWF4SCxcbiAgICAgICAgICBzY2FsZVk6IGNvbXBvbmVudC52IC8gZnJhbWUubWF4VixcbiAgICAgICAgICBibG9ja3NQZXJMaW5lOiBjb21wb25lbnQuYmxvY2tzUGVyTGluZSxcbiAgICAgICAgICBibG9ja3NQZXJDb2x1bW46IGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5udW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIF9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGID0gZmFsc2UpIHtcbiAgICAgIHZhciBzY2FsZVggPSB0aGlzLndpZHRoIC8gd2lkdGgsXG4gICAgICAgIHNjYWxlWSA9IHRoaXMuaGVpZ2h0IC8gaGVpZ2h0O1xuXG4gICAgICB2YXIgY29tcG9uZW50LCBjb21wb25lbnRTY2FsZVgsIGNvbXBvbmVudFNjYWxlWSwgYmxvY2tzUGVyU2NhbmxpbmU7XG4gICAgICB2YXIgeCwgeSwgaSwgaiwgaztcbiAgICAgIHZhciBpbmRleDtcbiAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgdmFyIG91dHB1dDtcbiAgICAgIHZhciBudW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDtcbiAgICAgIHZhciBkYXRhTGVuZ3RoID0gd2lkdGggKiBoZWlnaHQgKiBudW1Db21wb25lbnRzO1xuICAgICAgdmFyIGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YUxlbmd0aCk7XG4gICAgICB2YXIgeFNjYWxlQmxvY2tPZmZzZXQgPSBuZXcgVWludDMyQXJyYXkod2lkdGgpO1xuICAgICAgdmFyIG1hc2szTFNCID0gMHhmZmZmZmZmODsgLy8gdXNlZCB0byBjbGVhciB0aGUgMyBMU0JzXG4gICAgICBsZXQgbGFzdENvbXBvbmVudFNjYWxlWDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKykge1xuICAgICAgICBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbaV07XG4gICAgICAgIGNvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudC5zY2FsZVggKiBzY2FsZVg7XG4gICAgICAgIGNvbXBvbmVudFNjYWxlWSA9IGNvbXBvbmVudC5zY2FsZVkgKiBzY2FsZVk7XG4gICAgICAgIG9mZnNldCA9IGk7XG4gICAgICAgIG91dHB1dCA9IGNvbXBvbmVudC5vdXRwdXQ7XG4gICAgICAgIGJsb2Nrc1BlclNjYW5saW5lID0gKGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lICsgMSkgPDwgMztcbiAgICAgICAgLy8gUHJlY2FsY3VsYXRlIHRoZSBgeFNjYWxlQmxvY2tPZmZzZXRgLiBTaW5jZSBpdCBkb2Vzbid0IGRlcGVuZCBvbiB0aGVcbiAgICAgICAgLy8gY29tcG9uZW50IGRhdGEsIHRoYXQncyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGBjb21wb25lbnRTY2FsZVhgIGNoYW5nZXMuXG4gICAgICAgIGlmIChjb21wb25lbnRTY2FsZVggIT09IGxhc3RDb21wb25lbnRTY2FsZVgpIHtcbiAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgaiA9IDAgfCAoeCAqIGNvbXBvbmVudFNjYWxlWCk7XG4gICAgICAgICAgICB4U2NhbGVCbG9ja09mZnNldFt4XSA9ICgoaiAmIG1hc2szTFNCKSA8PCAzKSB8IChqICYgNyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxhc3RDb21wb25lbnRTY2FsZVggPSBjb21wb25lbnRTY2FsZVg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbGluZWFyaXplIHRoZSBibG9ja3Mgb2YgdGhlIGNvbXBvbmVudFxuICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICBqID0gMCB8ICh5ICogY29tcG9uZW50U2NhbGVZKTtcbiAgICAgICAgICBpbmRleCA9IChibG9ja3NQZXJTY2FubGluZSAqIChqICYgbWFzazNMU0IpKSB8ICgoaiAmIDcpIDw8IDMpO1xuICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBkYXRhW29mZnNldF0gPSBvdXRwdXRbaW5kZXggKyB4U2NhbGVCbG9ja09mZnNldFt4XV07XG4gICAgICAgICAgICBvZmZzZXQgKz0gbnVtQ29tcG9uZW50cztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZGVjb2RlVHJhbnNmb3JtIGNvbnRhaW5zIHBhaXJzIG9mIG11bHRpcGxpZXIgKC0yNTYuLjI1NikgYW5kIGFkZGl0aXZlXG4gICAgICBsZXQgdHJhbnNmb3JtID0gdGhpcy5fZGVjb2RlVHJhbnNmb3JtO1xuXG4gICAgICAvLyBJbiBQREYgZmlsZXMsIEpQRUcgaW1hZ2VzIHdpdGggQ01ZSyBjb2xvdXIgc3BhY2VzIGFyZSB1c3VhbGx5IGludmVydGVkXG4gICAgICAvLyAodGhpcyBjYW4gYmUgb2JzZXJ2ZWQgYnkgZXh0cmFjdGluZyB0aGUgcmF3IGltYWdlIGRhdGEpLlxuICAgICAgLy8gU2luY2UgdGhlIGNvbnZlcnNpb24gYWxnb3JpdGhtcyAoc2VlIGJlbG93KSB3ZXJlIHdyaXR0ZW4gcHJpbWFyaWx5IGZvclxuICAgICAgLy8gdGhlIFBERiB1c2UtY2FzZXMsIGF0dGVtcHRpbmcgdG8gdXNlIGBKcGVnSW1hZ2VgIHRvIHBhcnNlIHN0YW5kYWxvbmVcbiAgICAgIC8vIEpQRUcgKENNWUspIGltYWdlcyBtYXkgdGh1cyByZXN1bHQgaW4gaW52ZXJ0ZWQgaW1hZ2VzIChzZWUgaXNzdWUgOTUxMykuXG4gICAgICAvL1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSBpdCdzIG5vdCAoYWx3YXlzKSBwb3NzaWJsZSB0byB0ZWxsLCBmcm9tIHRoZSBpbWFnZSBkYXRhXG4gICAgICAvLyBhbG9uZSwgaWYgaXQgbmVlZHMgdG8gYmUgaW52ZXJ0ZWQuIFRodXMgaW4gYW4gYXR0ZW1wdCB0byBwcm92aWRlIGJldHRlclxuICAgICAgLy8gb3V0LW9mLWJveCBiZWhhdmlvdXIgd2hlbiBgSnBlZ0ltYWdlYCBpcyB1c2VkIHN0YW5kYWxvbmUsIGRlZmF1bHQgdG9cbiAgICAgIC8vIGludmVydGluZyBKUEVHIChDTVlLKSBpbWFnZXMgaWYgYW5kIG9ubHkgaWYgdGhlIGltYWdlIGRhdGEgZG9lcyAqbm90KlxuICAgICAgLy8gY29tZSBmcm9tIGEgUERGIGZpbGUgYW5kIG5vIGBkZWNvZGVUcmFuc2Zvcm1gIHdhcyBwYXNzZWQgYnkgdGhlIHVzZXIuXG4gICAgICBpZiAoIWlzU291cmNlUERGICYmIG51bUNvbXBvbmVudHMgPT09IDQgJiYgIXRyYW5zZm9ybSkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdHJhbnNmb3JtID0gbmV3IEludDMyQXJyYXkoW1xuICAgICAgICAgIC0yNTYsIDI1NSwgLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyApIHtcbiAgICAgICAgICBmb3IgKGogPSAwLCBrID0gMDsgaiA8IG51bUNvbXBvbmVudHM7IGorKywgaSsrLCBrICs9IDIpIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSAoKGRhdGFbaV0gKiB0cmFuc2Zvcm1ba10pID4+IDgpICsgdHJhbnNmb3JtW2sgKyAxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG5cbiAgICBnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCkge1xuICAgICAgaWYgKHRoaXMuYWRvYmUpIHtcbiAgICAgICAgLy8gVGhlIGFkb2JlIHRyYW5zZm9ybSBtYXJrZXIgb3ZlcnJpZGVzIGFueSBwcmV2aW91cyBzZXR0aW5nLlxuICAgICAgICByZXR1cm4gISF0aGlzLmFkb2JlLnRyYW5zZm9ybUNvZGU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMCkge1xuICAgICAgICAgIC8vIElmIHRoZSBBZG9iZSB0cmFuc2Zvcm0gbWFya2VyIGlzIG5vdCBwcmVzZW50IGFuZCB0aGUgaW1hZ2VcbiAgICAgICAgICAvLyBkaWN0aW9uYXJ5IGhhcyBhICdDb2xvclRyYW5zZm9ybScgZW50cnksIGV4cGxpY2l0bHkgc2V0IHRvIGAwYCxcbiAgICAgICAgICAvLyB0aGVuIHRoZSBjb2xvdXJzIHNob3VsZCAqbm90KiBiZSB0cmFuc2Zvcm1lZC5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5jb21wb25lbnRzWzBdLmluZGV4ID09PSAvKiBcIlJcIiA9ICovIDB4NTIgJiZcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbMV0uaW5kZXggPT09IC8qIFwiR1wiID0gKi8gMHg0NyAmJlxuICAgICAgICAgIHRoaXMuY29tcG9uZW50c1syXS5pbmRleCA9PT0gLyogXCJCXCIgPSAqLyAweDQyXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIElmIHRoZSB0aHJlZSBjb21wb25lbnRzIGFyZSBpbmRleGVkIGFzIFJHQiBpbiBBU0NJSVxuICAgICAgICAgIC8vIHRoZW4gdGhlIGNvbG91cnMgc2hvdWxkICpub3QqIGJlIHRyYW5zZm9ybWVkLlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIGB0aGlzLm51bUNvbXBvbmVudHMgIT09IDNgXG4gICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDEpIHtcbiAgICAgICAgLy8gSWYgdGhlIEFkb2JlIHRyYW5zZm9ybSBtYXJrZXIgaXMgbm90IHByZXNlbnQgYW5kIHRoZSBpbWFnZVxuICAgICAgICAvLyBkaWN0aW9uYXJ5IGhhcyBhICdDb2xvclRyYW5zZm9ybScgZW50cnksIGV4cGxpY2l0bHkgc2V0IHRvIGAxYCxcbiAgICAgICAgLy8gdGhlbiB0aGUgY29sb3VycyBzaG91bGQgYmUgdHJhbnNmb3JtZWQuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBfY29udmVydFljY1RvUmdiOiBmdW5jdGlvbiBjb252ZXJ0WWNjVG9SZ2IoZGF0YSkge1xuICAgICAgdmFyIFksIENiLCBDcjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIFkgPSBkYXRhW2ldO1xuICAgICAgICBDYiA9IGRhdGFbaSArIDFdO1xuICAgICAgICBDciA9IGRhdGFbaSArIDJdO1xuICAgICAgICBkYXRhW2ldID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyO1xuICAgICAgICBkYXRhW2kgKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7XG4gICAgICAgIGRhdGFbaSArIDJdID0gWSAtIDIyNi44MTYgKyAxLjc3MiAqIENiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIF9jb252ZXJ0WWNja1RvUmdiOiBmdW5jdGlvbiBjb252ZXJ0WWNja1RvUmdiKGRhdGEpIHtcbiAgICAgIHZhciBZLCBDYiwgQ3IsIGs7XG4gICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIFkgPSBkYXRhW2ldO1xuICAgICAgICBDYiA9IGRhdGFbaSArIDFdO1xuICAgICAgICBDciA9IGRhdGFbaSArIDJdO1xuICAgICAgICBrID0gZGF0YVtpICsgM107XG5cbiAgICAgICAgZGF0YVtvZmZzZXQrK10gPVxuICAgICAgICAgIC0xMjIuNjcxOTU0MDY4OTQgK1xuICAgICAgICAgIENiICpcbiAgICAgICAgICAgICgtNi42MDYzNTY2OTQyMDM2NGUtNSAqIENiICtcbiAgICAgICAgICAgICAgMC4wMDA0MzcxMzA0NzU5MjYyMzIgKiBDciAtXG4gICAgICAgICAgICAgIDUuNDA4MDYxMDA2NDU5OWUtNSAqIFkgK1xuICAgICAgICAgICAgICAwLjAwMDQ4NDQ5Nzk3MTIwMjgxICogayAtXG4gICAgICAgICAgICAgIDAuMTU0MzYyMTUxODcxMTI2KSArXG4gICAgICAgICAgQ3IgKlxuICAgICAgICAgICAgKC0wLjAwMDk1Nzk2NDM3ODQ0NTc3MyAqIENyICtcbiAgICAgICAgICAgICAgMC4wMDA4MTcwNzY5MTEzNDY2MjUgKiBZIC1cbiAgICAgICAgICAgICAgMC4wMDQ3NzI3MTQwNTQwODc0NyAqIGsgK1xuICAgICAgICAgICAgICAxLjUzMzgwMjUzMjIxNzM0KSArXG4gICAgICAgICAgWSAqXG4gICAgICAgICAgICAoMC4wMDA5NjEyNTAxODQxMzA2ODggKiBZIC1cbiAgICAgICAgICAgICAgMC4wMDI2NjI1NzMzMjI4MzkzMyAqIGsgK1xuICAgICAgICAgICAgICAwLjQ4MzU3MDg4NDUxMjY1KSArXG4gICAgICAgICAgayAqICgtMC4wMDAzMzYxOTcxNzc2MTgzOTQgKiBrICsgMC40ODQ3OTE1NjE0OTA3NzYpO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAxMDcuMjY4MDM5Mzk3NzI0ICtcbiAgICAgICAgICBDYiAqXG4gICAgICAgICAgICAoMi4xOTkyNzEwNDUyNTc0MWUtNSAqIENiIC1cbiAgICAgICAgICAgICAgMC4wMDA2NDA5OTIwMTgyOTc5NDUgKiBDciArXG4gICAgICAgICAgICAgIDAuMDAwNjU5Mzk3MDAxMjQ1NTc3ICogWSArXG4gICAgICAgICAgICAgIDAuMDAwNDI2MTA1NjUyOTM4ODM3ICogayAtXG4gICAgICAgICAgICAgIDAuMTc2NDkxNzkyNDYyODc1KSArXG4gICAgICAgICAgQ3IgKlxuICAgICAgICAgICAgKC0wLjAwMDc3ODI2OTk0MTUxMzY4MyAqIENyICtcbiAgICAgICAgICAgICAgMC4wMDEzMDg3MjI2MTQwODI3NSAqIFkgK1xuICAgICAgICAgICAgICAwLjAwMDc3MDQ4MjYzMTgwMTEzMiAqIGsgLVxuICAgICAgICAgICAgICAwLjE1MTA1MTQ5Mjc3NTU2MikgK1xuICAgICAgICAgIFkgKlxuICAgICAgICAgICAgKDAuMDAxMjY5MzUzNjgxMTQ4NDMgKiBZIC1cbiAgICAgICAgICAgICAgMC4wMDI2NTA5MDE4OTAxMDg5OCAqIGsgK1xuICAgICAgICAgICAgICAwLjI1ODAyOTEwMjA2ODQ1KSArXG4gICAgICAgICAgayAqICgtMC4wMDAzMTg5MTMxMTc1ODgzMjggKiBrIC0gMC4yMTM3NDI0MDAzMjM2NjUpO1xuXG4gICAgICAgIGRhdGFbb2Zmc2V0KytdID1cbiAgICAgICAgICAtMjAuODEwMDEyNTQ2OTQ3ICtcbiAgICAgICAgICBDYiAqXG4gICAgICAgICAgICAoLTAuMDAwNTcwMTE1MTk2OTczNjc3ICogQ2IgLVxuICAgICAgICAgICAgICAyLjYzNDA5MDUxMDA0NTg5ZS01ICogQ3IgK1xuICAgICAgICAgICAgICAwLjAwMjA3NDEwODgxMTUwMTIgKiBZIC1cbiAgICAgICAgICAgICAgMC4wMDI4ODI2MDIzNjg1MzQ0MiAqIGsgK1xuICAgICAgICAgICAgICAwLjgxNDI3Mjk2ODM1OTI5NSkgK1xuICAgICAgICAgIENyICpcbiAgICAgICAgICAgICgtMS41MzQ5NjA1NzQ0MDk3NWUtNSAqIENyIC1cbiAgICAgICAgICAgICAgMC4wMDAxMzI2ODkwNDM5NjE0NDYgKiBZICtcbiAgICAgICAgICAgICAgMC4wMDA1NjA4MzM2OTEyNDI4MTIgKiBrIC1cbiAgICAgICAgICAgICAgMC4xOTUxNTIwMjc1MzQwNDkpICtcbiAgICAgICAgICBZICpcbiAgICAgICAgICAgICgwLjAwMTc0NDE4MTMyOTI3NTgyICogWSAtXG4gICAgICAgICAgICAgIDAuMDAyNTUyNDMzMjE0MzkzNDcgKiBrICtcbiAgICAgICAgICAgICAgMC4xMTY5MzUwMjA0NjUxNDUpICtcbiAgICAgICAgICBrICogKC0wLjAwMDM0MzUzMTk5NjUxMDU1NSAqIGsgKyAwLjI0MTY1MjYwMjMyNDA3KTtcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGF0IG9ubHkgdGhlIGNvbnZlcnRlZCBSR0IgZGF0YSBpcyByZXR1cm5lZC5cbiAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7XG4gICAgfSxcblxuICAgIF9jb252ZXJ0WWNja1RvQ215azogZnVuY3Rpb24gY29udmVydFljY2tUb0NteWsoZGF0YSkge1xuICAgICAgdmFyIFksIENiLCBDcjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIFkgPSBkYXRhW2ldO1xuICAgICAgICBDYiA9IGRhdGFbaSArIDFdO1xuICAgICAgICBDciA9IGRhdGFbaSArIDJdO1xuICAgICAgICBkYXRhW2ldID0gNDM0LjQ1NiAtIFkgLSAxLjQwMiAqIENyO1xuICAgICAgICBkYXRhW2kgKyAxXSA9IDExOS41NDEgLSBZICsgMC4zNDQgKiBDYiArIDAuNzE0ICogQ3I7XG4gICAgICAgIGRhdGFbaSArIDJdID0gNDgxLjgxNiAtIFkgLSAxLjc3MiAqIENiO1xuICAgICAgICAvLyBLIGluIGRhdGFbaSArIDNdIGlzIHVuY2hhbmdlZFxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIF9jb252ZXJ0Q215a1RvUmdiOiBmdW5jdGlvbiBjb252ZXJ0Q215a1RvUmdiKGRhdGEpIHtcbiAgICAgIHZhciBjLCBtLCB5LCBrO1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBjID0gZGF0YVtpXTtcbiAgICAgICAgbSA9IGRhdGFbaSArIDFdO1xuICAgICAgICB5ID0gZGF0YVtpICsgMl07XG4gICAgICAgIGsgPSBkYXRhW2kgKyAzXTtcblxuICAgICAgICBkYXRhW29mZnNldCsrXSA9XG4gICAgICAgICAgMjU1ICtcbiAgICAgICAgICBjICpcbiAgICAgICAgICAgICgtMC4wMDAwNjc0NzE0NzA3MzYwMjQ0MSAqIGMgK1xuICAgICAgICAgICAgICAwLjAwMDgzNzkyNjIxMjEwMTM3MjcgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDAyODk0NzE4MTg4NjQzMjk0ICogeSArXG4gICAgICAgICAgICAgIDAuMDAzMjY0MjMxMDU3NTM3ODA2ICogayAtXG4gICAgICAgICAgICAgIDEuMTE4NTYxMTg2NzIwMzkzNykgK1xuICAgICAgICAgIG0gKlxuICAgICAgICAgICAgKDAuMDAwMDI2Mzc0MTA3NjE2MDg5NDA1ICogbSAtXG4gICAgICAgICAgICAgIDAuMDAwMDg2MjY5NDkxNTg2Mzg1NzIgKiB5IC1cbiAgICAgICAgICAgICAgMC4wMDAyNzQ4NzY5MDY3NDk5NDkxICogayAtXG4gICAgICAgICAgICAgIDAuMDIxNTU2ODg3OTQ5Nzg5NjcpICtcbiAgICAgICAgICB5ICpcbiAgICAgICAgICAgICgtMC4wMDAwMzg3ODA5OTIxMjg2OTM2MyAqIHkgLVxuICAgICAgICAgICAgICAwLjAwMDMyNjc4MDgyNzk0ODUyODYgKiBrICtcbiAgICAgICAgICAgICAgMC4wNjg2NzQyMjM4NTk1MzQ1KSAtXG4gICAgICAgICAgayAqICgwLjAwMDMzNjE5NzE3NzYxODM5MzcgKiBrICsgMC43NDMwNjU5MTUxMzQyMjU0KTtcblxuICAgICAgICBkYXRhW29mZnNldCsrXSA9XG4gICAgICAgICAgMjU1ICtcbiAgICAgICAgICBjICpcbiAgICAgICAgICAgICgwLjAwMDEzNTk2MzcyODEzNTg4ODQ4ICogYyArXG4gICAgICAgICAgICAgIDAuMDAwOTI0NTM3MTMyNTczNTg1ICogbSArXG4gICAgICAgICAgICAgIDAuMDAwMTA1NjczNTk2MTg2ODM1OTMgKiB5ICtcbiAgICAgICAgICAgICAgMC4wMDA0NzkxODY0Njg3NDM2NTEyICogayAtXG4gICAgICAgICAgICAgIDAuMzEwOTY4OTU4NzUxNTg3NSkgK1xuICAgICAgICAgIG0gKlxuICAgICAgICAgICAgKC0wLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0ICogbSArXG4gICAgICAgICAgICAgIDAuMDAwMjcwMjg0NTI1MzUzNDcxNCAqIHkgK1xuICAgICAgICAgICAgICAwLjAwMjAyMDAzMDg5NzczMDcxNTYgKiBrIC1cbiAgICAgICAgICAgICAgMC43NDg4MDUyMTY3MDE1NDk0KSArXG4gICAgICAgICAgeSAqXG4gICAgICAgICAgICAoMC4wMDAwNjgzNDgxNTk5ODIzNTY2MiAqIHkgK1xuICAgICAgICAgICAgICAwLjAwMDE1MTY4NDUyMzYzNDYwOTczICogayAtXG4gICAgICAgICAgICAgIDAuMDk3NTE5Mjc3NzQ3Mjg5MzMpIC1cbiAgICAgICAgICBrICogKDAuMDAwMzE4OTEzMTE3NTg4MzI4MTQgKiBrICsgMC43MzY0ODgzODA3NzMzMTY4KTtcblxuICAgICAgICBkYXRhW29mZnNldCsrXSA9XG4gICAgICAgICAgMjU1ICtcbiAgICAgICAgICBjICpcbiAgICAgICAgICAgICgwLjAwMDAxMzU5ODY1MDQxMTM4NTMwNyAqIGMgK1xuICAgICAgICAgICAgICAwLjAwMDEyNDIzOTU2MTc1NDkwODUxICogbSArXG4gICAgICAgICAgICAgIDAuMDAwNDc1MTk4NTA5NzU4MzU4OSAqIHkgLVxuICAgICAgICAgICAgICAwLjAwMDAwMzY3MjkzMTc0NzY2MzA0MjIgKiBrIC1cbiAgICAgICAgICAgICAgMC4wNTU2MjE4Njk4MDI2NDAzNCkgK1xuICAgICAgICAgIG0gKlxuICAgICAgICAgICAgKDAuMDAwMTYxNDEzODA1OTg3MjQ2NzYgKiBtICtcbiAgICAgICAgICAgICAgMC4wMDA5NjkyMjM5MTMwNzI1MTg2ICogeSArXG4gICAgICAgICAgICAgIDAuMDAwNzc4MjY5MjQ1MDAzNjI1MyAqIGsgLVxuICAgICAgICAgICAgICAwLjQ0MDE1MjMyMzY3NTI2NDYzKSArXG4gICAgICAgICAgeSAqXG4gICAgICAgICAgICAoNS4wNjg4ODI5MTQwNjg3NjllLTcgKiB5ICtcbiAgICAgICAgICAgICAgMC4wMDE3Nzc4MzY5MDExMzc1MDcxICogayAtXG4gICAgICAgICAgICAgIDAuNzU5MTQ1NDY0OTc0OTYwOSkgLVxuICAgICAgICAgIGsgKiAoMC4wMDAzNDM1MzE5OTY1MTA1NTUzICogayArIDAuNzA2Mzc3MDE4NjE2MDE0NCk7XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhhdCBvbmx5IHRoZSBjb252ZXJ0ZWQgUkdCIGRhdGEgaXMgcmV0dXJuZWQuXG4gICAgICByZXR1cm4gZGF0YS5zdWJhcnJheSgwLCBvZmZzZXQpO1xuICAgIH0sXG5cbiAgICBnZXREYXRhKHsgd2lkdGgsIGhlaWdodCwgZm9yY2VSR0IgPSBmYWxzZSwgaXNTb3VyY2VQREYgPSBmYWxzZSB9KSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgVEVTVElOR1wiKVxuICAgICAgKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBpc1NvdXJjZVBERiA9PT0gdHJ1ZSxcbiAgICAgICAgICAnSnBlZ0ltYWdlLmdldERhdGE6IFVuZXhwZWN0ZWQgXCJpc1NvdXJjZVBERlwiIHZhbHVlIGZvciBQREYgZmlsZXMuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA+IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcihcIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGVcIik7XG4gICAgICB9XG4gICAgICAvLyBUeXBlIG9mIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcG9uZW50cylcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh3aWR0aCwgaGVpZ2h0LCBpc1NvdXJjZVBERik7XG5cbiAgICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDEgJiYgZm9yY2VSR0IpIHtcbiAgICAgICAgdmFyIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgdmFyIHJnYkRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YUxlbmd0aCAqIDMpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZ3JheUNvbG9yID0gZGF0YVtpXTtcbiAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjtcbiAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjtcbiAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmdiRGF0YTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzICYmIHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2IoZGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gNCkge1xuICAgICAgICBpZiAodGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHtcbiAgICAgICAgICBpZiAoZm9yY2VSR0IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvUmdiKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY2tUb0NteWsoZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9yY2VSR0IpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gSnBlZ0ltYWdlO1xufSkoKTtcblxuZXhwb3J0IHsgSnBlZ0ltYWdlIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiwgaW5mbywgd2FybiB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbC5qc1wiO1xuaW1wb3J0IHsgbG9nMiwgcmVhZFVpbnQxNiwgcmVhZFVpbnQzMiB9IGZyb20gXCIuL2NvcmVfdXRpbHMuanNcIjtcbmltcG9ydCB7IEFyaXRobWV0aWNEZWNvZGVyIH0gZnJvbSBcIi4vYXJpdGhtZXRpY19kZWNvZGVyLmpzXCI7XG5cbmNsYXNzIEpweEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKGBKUFggZXJyb3I6ICR7bXNnfWApO1xuICB9XG59XG5cbnZhciBKcHhJbWFnZSA9IChmdW5jdGlvbiBKcHhJbWFnZUNsb3N1cmUoKSB7XG4gIC8vIFRhYmxlIEUuMVxuICB2YXIgU3ViYmFuZHNHYWluTG9nMiA9IHtcbiAgICBMTDogMCxcbiAgICBMSDogMSxcbiAgICBITDogMSxcbiAgICBISDogMixcbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGZ1bmN0aW9uIEpweEltYWdlKCkge1xuICAgIHRoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2UgPSBmYWxzZTtcbiAgfVxuICBKcHhJbWFnZS5wcm90b3R5cGUgPSB7XG4gICAgcGFyc2U6IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlKGRhdGEpIHtcbiAgICAgIHZhciBoZWFkID0gcmVhZFVpbnQxNihkYXRhLCAwKTtcbiAgICAgIC8vIE5vIGJveCBoZWFkZXIsIGltbWVkaWF0ZSBzdGFydCBvZiBjb2Rlc3RyZWFtIChTT0MpXG4gICAgICBpZiAoaGVhZCA9PT0gMHhmZjRmKSB7XG4gICAgICAgIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zaXRpb24gPSAwLFxuICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgaGVhZGVyU2l6ZSA9IDg7XG4gICAgICAgIHZhciBsYm94ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgIHZhciB0Ym94ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDQpO1xuICAgICAgICBwb3NpdGlvbiArPSBoZWFkZXJTaXplO1xuICAgICAgICBpZiAobGJveCA9PT0gMSkge1xuICAgICAgICAgIC8vIFhMQm94OiByZWFkIFVJbnQ2NCBhY2NvcmRpbmcgdG8gc3BlYy5cbiAgICAgICAgICAvLyBKYXZhU2NyaXB0J3MgaW50IHByZWNpc2lvbiBvZiA1MyBiaXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgaGVyZS5cbiAgICAgICAgICBsYm94ID1cbiAgICAgICAgICAgIHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICogNDI5NDk2NzI5NiArXG4gICAgICAgICAgICByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCk7XG4gICAgICAgICAgcG9zaXRpb24gKz0gODtcbiAgICAgICAgICBoZWFkZXJTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxib3ggPT09IDApIHtcbiAgICAgICAgICBsYm94ID0gbGVuZ3RoIC0gcG9zaXRpb24gKyBoZWFkZXJTaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYm94IDwgaGVhZGVyU2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihcIkludmFsaWQgYm94IGZpZWxkIHNpemVcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGFMZW5ndGggPSBsYm94IC0gaGVhZGVyU2l6ZTtcbiAgICAgICAgdmFyIGp1bXBEYXRhTGVuZ3RoID0gdHJ1ZTtcbiAgICAgICAgc3dpdGNoICh0Ym94KSB7XG4gICAgICAgICAgY2FzZSAweDZhNzAzMjY4OiAvLyAnanAyaCdcbiAgICAgICAgICAgIGp1bXBEYXRhTGVuZ3RoID0gZmFsc2U7IC8vIHBhcnNpbmcgY2hpbGQgYm94ZXNcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHg2MzZmNmM3MjogLy8gJ2NvbHInXG4gICAgICAgICAgICAvLyBDb2xvcnNwYWNlcyBhcmUgbm90IHVzZWQsIHRoZSBDUyBmcm9tIHRoZSBQREYgaXMgdXNlZC5cbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBkYXRhW3Bvc2l0aW9uXTtcbiAgICAgICAgICAgIGlmIChtZXRob2QgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gZW51bWVyYXRlZCBjb2xvcnNwYWNlXG4gICAgICAgICAgICAgIHZhciBjb2xvcnNwYWNlID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDMpO1xuICAgICAgICAgICAgICBzd2l0Y2ggKGNvbG9yc3BhY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE2OiAvLyB0aGlzIGluZGljYXRlcyBhIHNSR0IgY29sb3JzcGFjZVxuICAgICAgICAgICAgICAgIGNhc2UgMTc6IC8vIHRoaXMgaW5kaWNhdGVzIGEgZ3JheXNjYWxlIGNvbG9yc3BhY2VcbiAgICAgICAgICAgICAgICBjYXNlIDE4OiAvLyB0aGlzIGluZGljYXRlcyBhIFlVViBjb2xvcnNwYWNlXG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgd2FybihcIlVua25vd24gY29sb3JzcGFjZSBcIiArIGNvbG9yc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAyKSB7XG4gICAgICAgICAgICAgIGluZm8oXCJJQ0MgcHJvZmlsZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDZhNzAzMjYzOiAvLyAnanAyYydcbiAgICAgICAgICAgIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHBvc2l0aW9uLCBwb3NpdGlvbiArIGRhdGFMZW5ndGgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDZhNTAyMDIwOiAvLyAnalBcXDAyNFxcMDI0J1xuICAgICAgICAgICAgaWYgKHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICE9PSAweDBkMGE4NzBhKSB7XG4gICAgICAgICAgICAgIHdhcm4oXCJJbnZhbGlkIEpQMiBzaWduYXR1cmVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhlYWRlciB0eXBlcyBhcmUgdmFsaWQgYnV0IGN1cnJlbnRseSBub3QgdXNlZDpcbiAgICAgICAgICBjYXNlIDB4NmE1MDFhMWE6IC8vICdqUFxcMDMyXFwwMzInXG4gICAgICAgICAgY2FzZSAweDY2NzQ3OTcwOiAvLyAnZnR5cCdcbiAgICAgICAgICBjYXNlIDB4NzI3MjY1NzE6IC8vICdycmVxJ1xuICAgICAgICAgIGNhc2UgMHg3MjY1NzMyMDogLy8gJ3JlcyAnXG4gICAgICAgICAgY2FzZSAweDY5Njg2NDcyOiAvLyAnaWhkcidcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgaGVhZGVyVHlwZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAgICh0Ym94ID4+IDI0KSAmIDB4ZmYsXG4gICAgICAgICAgICAgICh0Ym94ID4+IDE2KSAmIDB4ZmYsXG4gICAgICAgICAgICAgICh0Ym94ID4+IDgpICYgMHhmZixcbiAgICAgICAgICAgICAgdGJveCAmIDB4ZmZcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB3YXJuKFwiVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgXCIgKyB0Ym94ICsgXCIgKFwiICsgaGVhZGVyVHlwZSArIFwiKVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqdW1wRGF0YUxlbmd0aCkge1xuICAgICAgICAgIHBvc2l0aW9uICs9IGRhdGFMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHBhcnNlSW1hZ2VQcm9wZXJ0aWVzOiBmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZUltYWdlUHJvcGVydGllcyhzdHJlYW0pIHtcbiAgICAgIHZhciBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgIHdoaWxlIChuZXdCeXRlID49IDApIHtcbiAgICAgICAgdmFyIG9sZEJ5dGUgPSBuZXdCeXRlO1xuICAgICAgICBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGNvZGUgPSAob2xkQnl0ZSA8PCA4KSB8IG5ld0J5dGU7XG4gICAgICAgIC8vIEltYWdlIGFuZCB0aWxlIHNpemUgKFNJWilcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4ZmY1MSkge1xuICAgICAgICAgIHN0cmVhbS5za2lwKDQpO1xuICAgICAgICAgIHZhciBYc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7IC8vIEJ5dGUgNFxuICAgICAgICAgIHZhciBZc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7IC8vIEJ5dGUgOFxuICAgICAgICAgIHZhciBYT3NpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOyAvLyBCeXRlIDEyXG4gICAgICAgICAgdmFyIFlPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7IC8vIEJ5dGUgMTZcbiAgICAgICAgICBzdHJlYW0uc2tpcCgxNik7XG4gICAgICAgICAgdmFyIENzaXogPSBzdHJlYW0uZ2V0VWludDE2KCk7IC8vIEJ5dGUgMzZcbiAgICAgICAgICB0aGlzLndpZHRoID0gWHNpeiAtIFhPc2l6O1xuICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gWXNpeiAtIFlPc2l6O1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50c0NvdW50ID0gQ3NpejtcbiAgICAgICAgICAvLyBSZXN1bHRzIGFyZSBhbHdheXMgcmV0dXJuZWQgYXMgYFVpbnQ4Q2xhbXBlZEFycmF5YHMuXG4gICAgICAgICAgdGhpcy5iaXRzUGVyQ29tcG9uZW50ID0gODtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBKcHhFcnJvcihcIk5vIHNpemUgbWFya2VyIGZvdW5kIGluIEpQWCBzdHJlYW1cIik7XG4gICAgfSxcbiAgICBwYXJzZUNvZGVzdHJlYW06IGZ1bmN0aW9uIEpweEltYWdlX3BhcnNlQ29kZXN0cmVhbShkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgdmFyIGRvTm90UmVjb3ZlciA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gc3RhcnQ7XG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiArIDEgPCBlbmQpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICAgIHBvc2l0aW9uICs9IDI7XG5cbiAgICAgICAgICB2YXIgbGVuZ3RoID0gMCxcbiAgICAgICAgICAgIGosXG4gICAgICAgICAgICBzcWNkLFxuICAgICAgICAgICAgc3BxY2RzLFxuICAgICAgICAgICAgc3BxY2RTaXplLFxuICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkLFxuICAgICAgICAgICAgdGlsZTtcbiAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgMHhmZjRmOiAvLyBTdGFydCBvZiBjb2Rlc3RyZWFtIChTT0MpXG4gICAgICAgICAgICAgIGNvbnRleHQubWFpbkhlYWRlciA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweGZmZDk6IC8vIEVuZCBvZiBjb2Rlc3RyZWFtIChFT0MpXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweGZmNTE6IC8vIEltYWdlIGFuZCB0aWxlIHNpemUgKFNJWilcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHZhciBzaXogPSB7fTtcbiAgICAgICAgICAgICAgc2l6LlhzaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCk7XG4gICAgICAgICAgICAgIHNpei5Zc2l6ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDgpO1xuICAgICAgICAgICAgICBzaXouWE9zaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMTIpO1xuICAgICAgICAgICAgICBzaXouWU9zaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMTYpO1xuICAgICAgICAgICAgICBzaXouWFRzaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMjApO1xuICAgICAgICAgICAgICBzaXouWVRzaXogPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgMjQpO1xuICAgICAgICAgICAgICBzaXouWFRPc2l6ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDI4KTtcbiAgICAgICAgICAgICAgc2l6LllUT3NpeiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAzMik7XG4gICAgICAgICAgICAgIHZhciBjb21wb25lbnRzQ291bnQgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uICsgMzYpO1xuICAgICAgICAgICAgICBzaXouQ3NpeiA9IGNvbXBvbmVudHNDb3VudDtcbiAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMzg7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0ge1xuICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAoZGF0YVtqXSAmIDB4N2YpICsgMSxcbiAgICAgICAgICAgICAgICAgIGlzU2lnbmVkOiAhIShkYXRhW2pdICYgMHg4MCksXG4gICAgICAgICAgICAgICAgICBYUnNpejogZGF0YVtqICsgMV0sXG4gICAgICAgICAgICAgICAgICBZUnNpejogZGF0YVtqICsgMl0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBqICs9IDM7XG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhjb21wb25lbnQsIHNpeik7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGV4dC5TSVogPSBzaXo7XG4gICAgICAgICAgICAgIGNvbnRleHQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gICAgICAgICAgICAgIGNhbGN1bGF0ZVRpbGVHcmlkcyhjb250ZXh0LCBjb21wb25lbnRzKTtcbiAgICAgICAgICAgICAgY29udGV4dC5RQ0MgPSBbXTtcbiAgICAgICAgICAgICAgY29udGV4dC5DT0MgPSBbXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1YzogLy8gUXVhbnRpemF0aW9uIGRlZmF1bHQgKFFDRClcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHZhciBxY2QgPSB7fTtcbiAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjtcbiAgICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgc3dpdGNoIChzcWNkICYgMHgxZikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDg7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7XG4gICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2O1xuICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNRY2QgdmFsdWUgXCIgKyBzcWNkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBxY2Qubm9RdWFudGl6YXRpb24gPSBzcHFjZFNpemUgPT09IDg7XG4gICAgICAgICAgICAgIHFjZC5zY2FsYXJFeHBvdW5kZWQgPSBzY2FsYXJFeHBvdW5kZWQ7XG4gICAgICAgICAgICAgIHFjZC5ndWFyZEJpdHMgPSBzcWNkID4+IDU7XG4gICAgICAgICAgICAgIHNwcWNkcyA9IFtdO1xuICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCArIHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwcWNkID0ge307XG4gICAgICAgICAgICAgICAgaWYgKHNwcWNkU2l6ZSA9PT0gOCkge1xuICAgICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbaisrXSA+PiAzO1xuICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqXSA+PiAzO1xuICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAoKGRhdGFbal0gJiAweDcpIDw8IDgpIHwgZGF0YVtqICsgMV07XG4gICAgICAgICAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwcWNkcy5wdXNoKHNwcWNkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBxY2QuU1BxY2RzID0gc3BxY2RzO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5RQ0QgPSBxY2Q7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0QgPSBxY2Q7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0MgPSBbXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHhmZjVkOiAvLyBRdWFudGl6YXRpb24gY29tcG9uZW50IChRQ0MpXG4gICAgICAgICAgICAgIGxlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICB2YXIgcWNjID0ge307XG4gICAgICAgICAgICAgIGogPSBwb3NpdGlvbiArIDI7XG4gICAgICAgICAgICAgIHZhciBjcWNjO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dC5TSVouQ3NpeiA8IDI1Nykge1xuICAgICAgICAgICAgICAgIGNxY2MgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3FjYyA9IHJlYWRVaW50MTYoZGF0YSwgaik7XG4gICAgICAgICAgICAgICAgaiArPSAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNxY2QgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIHN3aXRjaCAoc3FjZCAmIDB4MWYpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSA4O1xuICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2O1xuICAgICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSAxNjtcbiAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBTUWNkIHZhbHVlIFwiICsgc3FjZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcWNjLm5vUXVhbnRpemF0aW9uID0gc3BxY2RTaXplID09PSA4O1xuICAgICAgICAgICAgICBxY2Muc2NhbGFyRXhwb3VuZGVkID0gc2NhbGFyRXhwb3VuZGVkO1xuICAgICAgICAgICAgICBxY2MuZ3VhcmRCaXRzID0gc3FjZCA+PiA1O1xuICAgICAgICAgICAgICBzcHFjZHMgPSBbXTtcbiAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHNwcWNkID0ge307XG4gICAgICAgICAgICAgICAgaWYgKHNwcWNkU2l6ZSA9PT0gOCkge1xuICAgICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbaisrXSA+PiAzO1xuICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqXSA+PiAzO1xuICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAoKGRhdGFbal0gJiAweDcpIDw8IDgpIHwgZGF0YVtqICsgMV07XG4gICAgICAgICAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwcWNkcy5wdXNoKHNwcWNkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBxY2MuU1BxY2RzID0gc3BxY2RzO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5RQ0NbY3FjY10gPSBxY2M7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5RQ0NbY3FjY10gPSBxY2M7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1MjogLy8gQ29kaW5nIHN0eWxlIGRlZmF1bHQgKENPRClcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIHZhciBjb2QgPSB7fTtcbiAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjtcbiAgICAgICAgICAgICAgdmFyIHNjb2QgPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIGNvZC5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzID0gISEoc2NvZCAmIDEpO1xuICAgICAgICAgICAgICBjb2Quc29wTWFya2VyVXNlZCA9ICEhKHNjb2QgJiAyKTtcbiAgICAgICAgICAgICAgY29kLmVwaE1hcmtlclVzZWQgPSAhIShzY29kICYgNCk7XG4gICAgICAgICAgICAgIGNvZC5wcm9ncmVzc2lvbk9yZGVyID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICBjb2QubGF5ZXJzQ291bnQgPSByZWFkVWludDE2KGRhdGEsIGopO1xuICAgICAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgICAgIGNvZC5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSA9IGRhdGFbaisrXTtcblxuICAgICAgICAgICAgICBjb2QuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICBjb2QueGNiID0gKGRhdGFbaisrXSAmIDB4ZikgKyAyO1xuICAgICAgICAgICAgICBjb2QueWNiID0gKGRhdGFbaisrXSAmIDB4ZikgKyAyO1xuICAgICAgICAgICAgICB2YXIgYmxvY2tTdHlsZSA9IGRhdGFbaisrXTtcbiAgICAgICAgICAgICAgY29kLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MgPSAhIShibG9ja1N0eWxlICYgMSk7XG4gICAgICAgICAgICAgIGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzID0gISEoYmxvY2tTdHlsZSAmIDIpO1xuICAgICAgICAgICAgICBjb2QudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzID0gISEoYmxvY2tTdHlsZSAmIDQpO1xuICAgICAgICAgICAgICBjb2QudmVydGljYWxseVN0cmlwZSA9ICEhKGJsb2NrU3R5bGUgJiA4KTtcbiAgICAgICAgICAgICAgY29kLnByZWRpY3RhYmxlVGVybWluYXRpb24gPSAhIShibG9ja1N0eWxlICYgMTYpO1xuICAgICAgICAgICAgICBjb2Quc2VnbWVudGF0aW9uU3ltYm9sVXNlZCA9ICEhKGJsb2NrU3R5bGUgJiAzMik7XG4gICAgICAgICAgICAgIGNvZC5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24gPSBkYXRhW2orK107XG4gICAgICAgICAgICAgIGlmIChjb2QuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cykge1xuICAgICAgICAgICAgICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IFtdO1xuICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICsgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBwcmVjaW5jdHNTaXplID0gZGF0YVtqKytdO1xuICAgICAgICAgICAgICAgICAgcHJlY2luY3RzU2l6ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIFBQeDogcHJlY2luY3RzU2l6ZSAmIDB4ZixcbiAgICAgICAgICAgICAgICAgICAgUFB5OiBwcmVjaW5jdHNTaXplID4+IDQsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kLnByZWNpbmN0c1NpemVzID0gcHJlY2luY3RzU2l6ZXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHVuc3VwcG9ydGVkID0gW107XG4gICAgICAgICAgICAgIGlmIChjb2Quc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcykge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goXCJzZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2QucmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcykge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goXCJyZXNldENvbnRleHRQcm9iYWJpbGl0aWVzXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2QudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzKSB7XG4gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaChcInRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzc1wiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY29kLnZlcnRpY2FsbHlTdHJpcGUpIHtcbiAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKFwidmVydGljYWxseVN0cmlwZVwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY29kLnByZWRpY3RhYmxlVGVybWluYXRpb24pIHtcbiAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKFwicHJlZGljdGFibGVUZXJtaW5hdGlvblwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGRvTm90UmVjb3ZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJVbnN1cHBvcnRlZCBDT0Qgb3B0aW9ucyAoXCIgKyB1bnN1cHBvcnRlZC5qb2luKFwiLCBcIikgKyBcIilcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvbnRleHQubWFpbkhlYWRlcikge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuQ09EID0gY29kO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuQ09EID0gY29kO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuQ09DID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY5MDogLy8gU3RhcnQgb2YgdGlsZS1wYXJ0IChTT1QpXG4gICAgICAgICAgICAgIGxlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICB0aWxlID0ge307XG4gICAgICAgICAgICAgIHRpbGUuaW5kZXggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uICsgMik7XG4gICAgICAgICAgICAgIHRpbGUubGVuZ3RoID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDQpO1xuICAgICAgICAgICAgICB0aWxlLmRhdGFFbmQgPSB0aWxlLmxlbmd0aCArIHBvc2l0aW9uIC0gMjtcbiAgICAgICAgICAgICAgdGlsZS5wYXJ0SW5kZXggPSBkYXRhW3Bvc2l0aW9uICsgOF07XG4gICAgICAgICAgICAgIHRpbGUucGFydHNDb3VudCA9IGRhdGFbcG9zaXRpb24gKyA5XTtcblxuICAgICAgICAgICAgICBjb250ZXh0Lm1haW5IZWFkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgaWYgKHRpbGUucGFydEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgY29tcG9uZW50IHNwZWNpZmljIHNldHRpbmdzXG4gICAgICAgICAgICAgICAgdGlsZS5DT0QgPSBjb250ZXh0LkNPRDtcbiAgICAgICAgICAgICAgICB0aWxlLkNPQyA9IGNvbnRleHQuQ09DLnNsaWNlKDApOyAvLyBjbG9uZSBvZiB0aGUgZ2xvYmFsIENPQ1xuICAgICAgICAgICAgICAgIHRpbGUuUUNEID0gY29udGV4dC5RQ0Q7XG4gICAgICAgICAgICAgICAgdGlsZS5RQ0MgPSBjb250ZXh0LlFDQy5zbGljZSgwKTsgLy8gY2xvbmUgb2YgdGhlIGdsb2JhbCBDT0NcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlID0gdGlsZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY5MzogLy8gU3RhcnQgb2YgZGF0YSAoU09EKVxuICAgICAgICAgICAgICB0aWxlID0gY29udGV4dC5jdXJyZW50VGlsZTtcbiAgICAgICAgICAgICAgaWYgKHRpbGUucGFydEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVRpbGUoY29udGV4dCwgdGlsZS5pbmRleCk7XG4gICAgICAgICAgICAgICAgYnVpbGRQYWNrZXRzKGNvbnRleHQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gbW92aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGRhdGFcbiAgICAgICAgICAgICAgbGVuZ3RoID0gdGlsZS5kYXRhRW5kIC0gcG9zaXRpb247XG4gICAgICAgICAgICAgIHBhcnNlVGlsZVBhY2tldHMoY29udGV4dCwgZGF0YSwgcG9zaXRpb24sIGxlbmd0aCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweGZmNTU6IC8vIFRpbGUtcGFydCBsZW5ndGhzLCBtYWluIGhlYWRlciAoVExNKVxuICAgICAgICAgICAgY2FzZSAweGZmNTc6IC8vIFBhY2tldCBsZW5ndGgsIG1haW4gaGVhZGVyIChQTE0pXG4gICAgICAgICAgICBjYXNlIDB4ZmY1ODogLy8gUGFja2V0IGxlbmd0aCwgdGlsZS1wYXJ0IGhlYWRlciAoUExUKVxuICAgICAgICAgICAgY2FzZSAweGZmNjQ6IC8vIENvbW1lbnQgKENPTSlcbiAgICAgICAgICAgICAgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgIC8vIHNraXBwaW5nIGNvbnRlbnRcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4ZmY1MzogLy8gQ29kaW5nIHN0eWxlIGNvbXBvbmVudCAoQ09DKVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb2Rlc3RyZWFtIGNvZGUgMHhGRjUzIChDT0MpIGlzIG5vdCBpbXBsZW1lbnRlZFwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvZGVzdHJlYW0gY29kZTogXCIgKyBjb2RlLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZG9Ob3RSZWNvdmVyIHx8IHRoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuKFwiSlBYOiBUcnlpbmcgdG8gcmVjb3ZlciBmcm9tOiBcIiArIGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudGlsZXMgPSB0cmFuc2Zvcm1Db21wb25lbnRzKGNvbnRleHQpO1xuICAgICAgdGhpcy53aWR0aCA9IGNvbnRleHQuU0laLlhzaXogLSBjb250ZXh0LlNJWi5YT3NpejtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gY29udGV4dC5TSVouWXNpeiAtIGNvbnRleHQuU0laLllPc2l6O1xuICAgICAgdGhpcy5jb21wb25lbnRzQ291bnQgPSBjb250ZXh0LlNJWi5Dc2l6O1xuICAgIH0sXG4gIH07XG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnMoY29tcG9uZW50LCBzaXopIHtcbiAgICAvLyBTZWN0aW9uIEIuMiBDb21wb25lbnQgbWFwcGluZ1xuICAgIGNvbXBvbmVudC54MCA9IE1hdGguY2VpbChzaXouWE9zaXogLyBjb21wb25lbnQuWFJzaXopO1xuICAgIGNvbXBvbmVudC54MSA9IE1hdGguY2VpbChzaXouWHNpeiAvIGNvbXBvbmVudC5YUnNpeik7XG4gICAgY29tcG9uZW50LnkwID0gTWF0aC5jZWlsKHNpei5ZT3NpeiAvIGNvbXBvbmVudC5ZUnNpeik7XG4gICAgY29tcG9uZW50LnkxID0gTWF0aC5jZWlsKHNpei5Zc2l6IC8gY29tcG9uZW50LllSc2l6KTtcbiAgICBjb21wb25lbnQud2lkdGggPSBjb21wb25lbnQueDEgLSBjb21wb25lbnQueDA7XG4gICAgY29tcG9uZW50LmhlaWdodCA9IGNvbXBvbmVudC55MSAtIGNvbXBvbmVudC55MDtcbiAgfVxuICBmdW5jdGlvbiBjYWxjdWxhdGVUaWxlR3JpZHMoY29udGV4dCwgY29tcG9uZW50cykge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICAvLyBTZWN0aW9uIEIuMyBEaXZpc2lvbiBpbnRvIHRpbGUgYW5kIHRpbGUtY29tcG9uZW50c1xuICAgIHZhciB0aWxlLFxuICAgICAgdGlsZXMgPSBbXTtcbiAgICB2YXIgbnVtWHRpbGVzID0gTWF0aC5jZWlsKChzaXouWHNpeiAtIHNpei5YVE9zaXopIC8gc2l6LlhUc2l6KTtcbiAgICB2YXIgbnVtWXRpbGVzID0gTWF0aC5jZWlsKChzaXouWXNpeiAtIHNpei5ZVE9zaXopIC8gc2l6LllUc2l6KTtcbiAgICBmb3IgKHZhciBxID0gMDsgcSA8IG51bVl0aWxlczsgcSsrKSB7XG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IG51bVh0aWxlczsgcCsrKSB7XG4gICAgICAgIHRpbGUgPSB7fTtcbiAgICAgICAgdGlsZS50eDAgPSBNYXRoLm1heChzaXouWFRPc2l6ICsgcCAqIHNpei5YVHNpeiwgc2l6LlhPc2l6KTtcbiAgICAgICAgdGlsZS50eTAgPSBNYXRoLm1heChzaXouWVRPc2l6ICsgcSAqIHNpei5ZVHNpeiwgc2l6LllPc2l6KTtcbiAgICAgICAgdGlsZS50eDEgPSBNYXRoLm1pbihzaXouWFRPc2l6ICsgKHAgKyAxKSAqIHNpei5YVHNpeiwgc2l6LlhzaXopO1xuICAgICAgICB0aWxlLnR5MSA9IE1hdGgubWluKHNpei5ZVE9zaXogKyAocSArIDEpICogc2l6LllUc2l6LCBzaXouWXNpeik7XG4gICAgICAgIHRpbGUud2lkdGggPSB0aWxlLnR4MSAtIHRpbGUudHgwO1xuICAgICAgICB0aWxlLmhlaWdodCA9IHRpbGUudHkxIC0gdGlsZS50eTA7XG4gICAgICAgIHRpbGUuY29tcG9uZW50cyA9IFtdO1xuICAgICAgICB0aWxlcy5wdXNoKHRpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb250ZXh0LnRpbGVzID0gdGlsZXM7XG5cbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY29tcG9uZW50c0NvdW50OyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07XG4gICAgICBmb3IgKHZhciBqID0gMCwgamogPSB0aWxlcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIHZhciB0aWxlQ29tcG9uZW50ID0ge307XG4gICAgICAgIHRpbGUgPSB0aWxlc1tqXTtcbiAgICAgICAgdGlsZUNvbXBvbmVudC50Y3gwID0gTWF0aC5jZWlsKHRpbGUudHgwIC8gY29tcG9uZW50LlhSc2l6KTtcbiAgICAgICAgdGlsZUNvbXBvbmVudC50Y3kwID0gTWF0aC5jZWlsKHRpbGUudHkwIC8gY29tcG9uZW50LllSc2l6KTtcbiAgICAgICAgdGlsZUNvbXBvbmVudC50Y3gxID0gTWF0aC5jZWlsKHRpbGUudHgxIC8gY29tcG9uZW50LlhSc2l6KTtcbiAgICAgICAgdGlsZUNvbXBvbmVudC50Y3kxID0gTWF0aC5jZWlsKHRpbGUudHkxIC8gY29tcG9uZW50LllSc2l6KTtcbiAgICAgICAgdGlsZUNvbXBvbmVudC53aWR0aCA9IHRpbGVDb21wb25lbnQudGN4MSAtIHRpbGVDb21wb25lbnQudGN4MDtcbiAgICAgICAgdGlsZUNvbXBvbmVudC5oZWlnaHQgPSB0aWxlQ29tcG9uZW50LnRjeTEgLSB0aWxlQ29tcG9uZW50LnRjeTA7XG4gICAgICAgIHRpbGUuY29tcG9uZW50c1tpXSA9IHRpbGVDb21wb25lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldEJsb2Nrc0RpbWVuc2lvbnMoY29udGV4dCwgY29tcG9uZW50LCByKSB7XG4gICAgdmFyIGNvZE9yQ29jID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycztcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKCFjb2RPckNvYy5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7XG4gICAgICByZXN1bHQuUFB4ID0gMTU7XG4gICAgICByZXN1bHQuUFB5ID0gMTU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5QUHggPSBjb2RPckNvYy5wcmVjaW5jdHNTaXplc1tyXS5QUHg7XG4gICAgICByZXN1bHQuUFB5ID0gY29kT3JDb2MucHJlY2luY3RzU2l6ZXNbcl0uUFB5O1xuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgY29kZWJsb2NrIHNpemUgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gQi43XG4gICAgcmVzdWx0LnhjYl8gPVxuICAgICAgciA+IDBcbiAgICAgICAgPyBNYXRoLm1pbihjb2RPckNvYy54Y2IsIHJlc3VsdC5QUHggLSAxKVxuICAgICAgICA6IE1hdGgubWluKGNvZE9yQ29jLnhjYiwgcmVzdWx0LlBQeCk7XG4gICAgcmVzdWx0LnljYl8gPVxuICAgICAgciA+IDBcbiAgICAgICAgPyBNYXRoLm1pbihjb2RPckNvYy55Y2IsIHJlc3VsdC5QUHkgLSAxKVxuICAgICAgICA6IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBmdW5jdGlvbiBidWlsZFByZWNpbmN0cyhjb250ZXh0LCByZXNvbHV0aW9uLCBkaW1lbnNpb25zKSB7XG4gICAgLy8gU2VjdGlvbiBCLjYgRGl2aXNpb24gcmVzb2x1dGlvbiB0byBwcmVjaW5jdHNcbiAgICB2YXIgcHJlY2luY3RXaWR0aCA9IDEgPDwgZGltZW5zaW9ucy5QUHg7XG4gICAgdmFyIHByZWNpbmN0SGVpZ2h0ID0gMSA8PCBkaW1lbnNpb25zLlBQeTtcbiAgICAvLyBKYXNwZXIgaW50cm9kdWNlcyBjb2RlYmxvY2sgZ3JvdXBzIGZvciBtYXBwaW5nIGVhY2ggc3ViYmFuZCBjb2RlYmxvY2tzXG4gICAgLy8gdG8gcHJlY2luY3RzLiBQcmVjaW5jdCBwYXJ0aXRpb24gZGl2aWRlcyBhIHJlc29sdXRpb24gYWNjb3JkaW5nIHRvIHdpZHRoXG4gICAgLy8gYW5kIGhlaWdodCBwYXJhbWV0ZXJzLiBUaGUgc3ViYmFuZCB0aGF0IGJlbG9uZ3MgdG8gdGhlIHJlc29sdXRpb24gbGV2ZWxcbiAgICAvLyBoYXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIHRoZSBsZXZlbCwgdW5sZXNzIGl0IGlzIHRoZSB6ZXJvIHJlc29sdXRpb24uXG5cbiAgICAvLyBGcm9tIEphc3BlciBkb2N1bWVudGF0aW9uOiBqcGVnMjAwMC5wZGYsIHNlY3Rpb24gSzogVGllci0yIGNvZGluZzpcbiAgICAvLyBUaGUgcHJlY2luY3QgcGFydGl0aW9uaW5nIGZvciBhIHBhcnRpY3VsYXIgc3ViYmFuZCBpcyBkZXJpdmVkIGZyb20gYVxuICAgIC8vIHBhcnRpdGlvbmluZyBvZiBpdHMgcGFyZW50IExMIGJhbmQgKGkuZS4sIHRoZSBMTCBiYW5kIGF0IHRoZSBuZXh0IGhpZ2hlclxuICAgIC8vIHJlc29sdXRpb24gbGV2ZWwpLi4uIFRoZSBMTCBiYW5kIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHJlc29sdXRpb24gbGV2ZWwgaXNcbiAgICAvLyBkaXZpZGVkIGludG8gcHJlY2luY3RzLi4uIEVhY2ggb2YgdGhlIHJlc3VsdGluZyBwcmVjaW5jdCByZWdpb25zIGlzIHRoZW5cbiAgICAvLyBtYXBwZWQgaW50byBpdHMgY2hpbGQgc3ViYmFuZHMgKGlmIGFueSkgYXQgdGhlIG5leHQgbG93ZXIgcmVzb2x1dGlvblxuICAgIC8vIGxldmVsLiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvblxuICAgIC8vICh1LCB2KSA9IChjZWlsKHgvMiksIGNlaWwoeS8yKSkgd2hlcmUgKHgsIHkpIGFuZCAodSwgdikgYXJlIHRoZVxuICAgIC8vIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQgaW4gdGhlIExMIGJhbmQgYW5kIGNoaWxkIHN1YmJhbmQsIHJlc3BlY3RpdmVseS5cbiAgICB2YXIgaXNaZXJvUmVzID0gcmVzb2x1dGlvbi5yZXNMZXZlbCA9PT0gMDtcbiAgICB2YXIgcHJlY2luY3RXaWR0aEluU3ViYmFuZCA9IDEgPDwgKGRpbWVuc2lvbnMuUFB4ICsgKGlzWmVyb1JlcyA/IDAgOiAtMSkpO1xuICAgIHZhciBwcmVjaW5jdEhlaWdodEluU3ViYmFuZCA9IDEgPDwgKGRpbWVuc2lvbnMuUFB5ICsgKGlzWmVyb1JlcyA/IDAgOiAtMSkpO1xuICAgIHZhciBudW1wcmVjaW5jdHN3aWRlID1cbiAgICAgIHJlc29sdXRpb24udHJ4MSA+IHJlc29sdXRpb24udHJ4MFxuICAgICAgICA/IE1hdGguY2VpbChyZXNvbHV0aW9uLnRyeDEgLyBwcmVjaW5jdFdpZHRoKSAtXG4gICAgICAgICAgTWF0aC5mbG9vcihyZXNvbHV0aW9uLnRyeDAgLyBwcmVjaW5jdFdpZHRoKVxuICAgICAgICA6IDA7XG4gICAgdmFyIG51bXByZWNpbmN0c2hpZ2ggPVxuICAgICAgcmVzb2x1dGlvbi50cnkxID4gcmVzb2x1dGlvbi50cnkwXG4gICAgICAgID8gTWF0aC5jZWlsKHJlc29sdXRpb24udHJ5MSAvIHByZWNpbmN0SGVpZ2h0KSAtXG4gICAgICAgICAgTWF0aC5mbG9vcihyZXNvbHV0aW9uLnRyeTAgLyBwcmVjaW5jdEhlaWdodClcbiAgICAgICAgOiAwO1xuICAgIHZhciBudW1wcmVjaW5jdHMgPSBudW1wcmVjaW5jdHN3aWRlICogbnVtcHJlY2luY3RzaGlnaDtcblxuICAgIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzID0ge1xuICAgICAgcHJlY2luY3RXaWR0aCxcbiAgICAgIHByZWNpbmN0SGVpZ2h0LFxuICAgICAgbnVtcHJlY2luY3Rzd2lkZSxcbiAgICAgIG51bXByZWNpbmN0c2hpZ2gsXG4gICAgICBudW1wcmVjaW5jdHMsXG4gICAgICBwcmVjaW5jdFdpZHRoSW5TdWJiYW5kLFxuICAgICAgcHJlY2luY3RIZWlnaHRJblN1YmJhbmQsXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgZGltZW5zaW9ucykge1xuICAgIC8vIFNlY3Rpb24gQi43IERpdmlzaW9uIHN1Yi1iYW5kIGludG8gY29kZS1ibG9ja3NcbiAgICB2YXIgeGNiXyA9IGRpbWVuc2lvbnMueGNiXztcbiAgICB2YXIgeWNiXyA9IGRpbWVuc2lvbnMueWNiXztcbiAgICB2YXIgY29kZWJsb2NrV2lkdGggPSAxIDw8IHhjYl87XG4gICAgdmFyIGNvZGVibG9ja0hlaWdodCA9IDEgPDwgeWNiXztcbiAgICB2YXIgY2J4MCA9IHN1YmJhbmQudGJ4MCA+PiB4Y2JfO1xuICAgIHZhciBjYnkwID0gc3ViYmFuZC50YnkwID4+IHljYl87XG4gICAgdmFyIGNieDEgPSAoc3ViYmFuZC50YngxICsgY29kZWJsb2NrV2lkdGggLSAxKSA+PiB4Y2JfO1xuICAgIHZhciBjYnkxID0gKHN1YmJhbmQudGJ5MSArIGNvZGVibG9ja0hlaWdodCAtIDEpID4+IHljYl87XG4gICAgdmFyIHByZWNpbmN0UGFyYW1ldGVycyA9IHN1YmJhbmQucmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnM7XG4gICAgdmFyIGNvZGVibG9ja3MgPSBbXTtcbiAgICB2YXIgcHJlY2luY3RzID0gW107XG4gICAgdmFyIGksIGosIGNvZGVibG9jaywgcHJlY2luY3ROdW1iZXI7XG4gICAgZm9yIChqID0gY2J5MDsgaiA8IGNieTE7IGorKykge1xuICAgICAgZm9yIChpID0gY2J4MDsgaSA8IGNieDE7IGkrKykge1xuICAgICAgICBjb2RlYmxvY2sgPSB7XG4gICAgICAgICAgY2J4OiBpLFxuICAgICAgICAgIGNieTogaixcbiAgICAgICAgICB0YngwOiBjb2RlYmxvY2tXaWR0aCAqIGksXG4gICAgICAgICAgdGJ5MDogY29kZWJsb2NrSGVpZ2h0ICogaixcbiAgICAgICAgICB0YngxOiBjb2RlYmxvY2tXaWR0aCAqIChpICsgMSksXG4gICAgICAgICAgdGJ5MTogY29kZWJsb2NrSGVpZ2h0ICogKGogKyAxKSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb2RlYmxvY2sudGJ4MF8gPSBNYXRoLm1heChzdWJiYW5kLnRieDAsIGNvZGVibG9jay50YngwKTtcbiAgICAgICAgY29kZWJsb2NrLnRieTBfID0gTWF0aC5tYXgoc3ViYmFuZC50YnkwLCBjb2RlYmxvY2sudGJ5MCk7XG4gICAgICAgIGNvZGVibG9jay50YngxXyA9IE1hdGgubWluKHN1YmJhbmQudGJ4MSwgY29kZWJsb2NrLnRieDEpO1xuICAgICAgICBjb2RlYmxvY2sudGJ5MV8gPSBNYXRoLm1pbihzdWJiYW5kLnRieTEsIGNvZGVibG9jay50YnkxKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgcHJlY2luY3QgbnVtYmVyIGZvciB0aGlzIGNvZGVibG9jaywgY29kZWJsb2NrIHBvc2l0aW9uXG4gICAgICAgIC8vIHNob3VsZCBiZSByZWxhdGl2ZSB0byBpdHMgc3ViYmFuZCwgdXNlIGFjdHVhbCBkaW1lbnNpb24gYW5kIHBvc2l0aW9uXG4gICAgICAgIC8vIFNlZSBjb21tZW50IGFib3V0IGNvZGVibG9jayBncm91cCB3aWR0aCBhbmQgaGVpZ2h0XG4gICAgICAgIHZhciBwaSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgKGNvZGVibG9jay50YngwXyAtIHN1YmJhbmQudGJ4MCkgL1xuICAgICAgICAgICAgcHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0V2lkdGhJblN1YmJhbmRcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHBqID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAoY29kZWJsb2NrLnRieTBfIC0gc3ViYmFuZC50YnkwKSAvXG4gICAgICAgICAgICBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHRJblN1YmJhbmRcbiAgICAgICAgKTtcbiAgICAgICAgcHJlY2luY3ROdW1iZXIgPSBwaSArIHBqICogcHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7XG5cbiAgICAgICAgY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyID0gcHJlY2luY3ROdW1iZXI7XG4gICAgICAgIGNvZGVibG9jay5zdWJiYW5kVHlwZSA9IHN1YmJhbmQudHlwZTtcbiAgICAgICAgY29kZWJsb2NrLkxibG9jayA9IDM7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvZGVibG9jay50YngxXyA8PSBjb2RlYmxvY2sudGJ4MF8gfHxcbiAgICAgICAgICBjb2RlYmxvY2sudGJ5MV8gPD0gY29kZWJsb2NrLnRieTBfXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVibG9ja3MucHVzaChjb2RlYmxvY2spO1xuICAgICAgICAvLyBidWlsZGluZyBwcmVjaW5jdCBmb3IgdGhlIHN1Yi1iYW5kXG4gICAgICAgIHZhciBwcmVjaW5jdCA9IHByZWNpbmN0c1twcmVjaW5jdE51bWJlcl07XG4gICAgICAgIGlmIChwcmVjaW5jdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGkgPCBwcmVjaW5jdC5jYnhNaW4pIHtcbiAgICAgICAgICAgIHByZWNpbmN0LmNieE1pbiA9IGk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpID4gcHJlY2luY3QuY2J4TWF4KSB7XG4gICAgICAgICAgICBwcmVjaW5jdC5jYnhNYXggPSBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaiA8IHByZWNpbmN0LmNieU1pbikge1xuICAgICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gajtcbiAgICAgICAgICB9IGVsc2UgaWYgKGogPiBwcmVjaW5jdC5jYnlNYXgpIHtcbiAgICAgICAgICAgIHByZWNpbmN0LmNieU1heCA9IGo7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZWNpbmN0c1twcmVjaW5jdE51bWJlcl0gPSBwcmVjaW5jdCA9IHtcbiAgICAgICAgICAgIGNieE1pbjogaSxcbiAgICAgICAgICAgIGNieU1pbjogaixcbiAgICAgICAgICAgIGNieE1heDogaSxcbiAgICAgICAgICAgIGNieU1heDogaixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvZGVibG9jay5wcmVjaW5jdCA9IHByZWNpbmN0O1xuICAgICAgfVxuICAgIH1cbiAgICBzdWJiYW5kLmNvZGVibG9ja1BhcmFtZXRlcnMgPSB7XG4gICAgICBjb2RlYmxvY2tXaWR0aDogeGNiXyxcbiAgICAgIGNvZGVibG9ja0hlaWdodDogeWNiXyxcbiAgICAgIG51bWNvZGVibG9ja3dpZGU6IGNieDEgLSBjYngwICsgMSxcbiAgICAgIG51bWNvZGVibG9ja2hpZ2g6IGNieTEgLSBjYnkwICsgMSxcbiAgICB9O1xuICAgIHN1YmJhbmQuY29kZWJsb2NrcyA9IGNvZGVibG9ja3M7XG4gICAgc3ViYmFuZC5wcmVjaW5jdHMgPSBwcmVjaW5jdHM7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIHByZWNpbmN0TnVtYmVyLCBsYXllck51bWJlcikge1xuICAgIHZhciBwcmVjaW5jdENvZGVibG9ja3MgPSBbXTtcbiAgICAvLyBTZWN0aW9uIEIuMTAuOCBPcmRlciBvZiBpbmZvIGluIHBhY2tldFxuICAgIHZhciBzdWJiYW5kcyA9IHJlc29sdXRpb24uc3ViYmFuZHM7XG4gICAgLy8gc3ViLWJhbmRzIGFscmVhZHkgb3JkZXJlZCBpbiAnTEwnLCAnSEwnLCAnTEgnLCBhbmQgJ0hIJyBzZXF1ZW5jZVxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN1YmJhbmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBzdWJiYW5kID0gc3ViYmFuZHNbaV07XG4gICAgICB2YXIgY29kZWJsb2NrcyA9IHN1YmJhbmQuY29kZWJsb2NrcztcbiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGNvZGVibG9ja3MubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICB2YXIgY29kZWJsb2NrID0gY29kZWJsb2Nrc1tqXTtcbiAgICAgICAgaWYgKGNvZGVibG9jay5wcmVjaW5jdE51bWJlciAhPT0gcHJlY2luY3ROdW1iZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwcmVjaW5jdENvZGVibG9ja3MucHVzaChjb2RlYmxvY2spO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGF5ZXJOdW1iZXIsXG4gICAgICBjb2RlYmxvY2tzOiBwcmVjaW5jdENvZGVibG9ja3MsXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBMYXllclJlc29sdXRpb25Db21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGNvbnRleHQpIHtcbiAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7XG4gICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50O1xuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICB2YXIgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gMDtcbiAgICBmb3IgKHZhciBxID0gMDsgcSA8IGNvbXBvbmVudHNDb3VudDsgcSsrKSB7XG4gICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBNYXRoLm1heChcbiAgICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LFxuICAgICAgICB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IDAsXG4gICAgICByID0gMCxcbiAgICAgIGkgPSAwLFxuICAgICAgayA9IDA7XG5cbiAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkge1xuICAgICAgLy8gU2VjdGlvbiBCLjEyLjEuMSBMYXllci1yZXNvbHV0aW9uLWNvbXBvbmVudC1wb3NpdGlvblxuICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgbCsrKSB7XG4gICAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7XG4gICAgICAgICAgZm9yICg7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgIGlmIChyID4gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdO1xuICAgICAgICAgICAgdmFyIG51bXByZWNpbmN0cyA9IHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztcbiAgICAgICAgICAgIGZvciAoOyBrIDwgbnVtcHJlY2luY3RzOyApIHtcbiAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTtcbiAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICByZXR1cm4gcGFja2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgayA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHIgPSAwO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiT3V0IG9mIHBhY2tldHNcIik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGNvbnRleHQpIHtcbiAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7XG4gICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50O1xuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICB2YXIgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gMDtcbiAgICBmb3IgKHZhciBxID0gMDsgcSA8IGNvbXBvbmVudHNDb3VudDsgcSsrKSB7XG4gICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBNYXRoLm1heChcbiAgICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LFxuICAgICAgICB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgciA9IDAsXG4gICAgICBsID0gMCxcbiAgICAgIGkgPSAwLFxuICAgICAgayA9IDA7XG5cbiAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkge1xuICAgICAgLy8gU2VjdGlvbiBCLjEyLjEuMiBSZXNvbHV0aW9uLWxheWVyLWNvbXBvbmVudC1wb3NpdGlvblxuICAgICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgbCsrKSB7XG4gICAgICAgICAgZm9yICg7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgIGlmIChyID4gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdO1xuICAgICAgICAgICAgdmFyIG51bXByZWNpbmN0cyA9IHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztcbiAgICAgICAgICAgIGZvciAoOyBrIDwgbnVtcHJlY2luY3RzOyApIHtcbiAgICAgICAgICAgICAgdmFyIHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTtcbiAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICByZXR1cm4gcGFja2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgayA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGwgPSAwO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiT3V0IG9mIHBhY2tldHNcIik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKGNvbnRleHQpIHtcbiAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7XG4gICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50O1xuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICB2YXIgbCwgciwgYywgcDtcbiAgICB2YXIgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gMDtcbiAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTtcbiAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KFxuICAgICAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsXG4gICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50XG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgbWF4TnVtUHJlY2luY3RzSW5MZXZlbCA9IG5ldyBJbnQzMkFycmF5KFxuICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ICsgMVxuICAgICk7XG4gICAgZm9yIChyID0gMDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7ICsrcikge1xuICAgICAgdmFyIG1heE51bVByZWNpbmN0cyA9IDA7XG4gICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyArK2MpIHtcbiAgICAgICAgdmFyIHJlc29sdXRpb25zID0gdGlsZS5jb21wb25lbnRzW2NdLnJlc29sdXRpb25zO1xuICAgICAgICBpZiAociA8IHJlc29sdXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIG1heE51bVByZWNpbmN0cyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgbWF4TnVtUHJlY2luY3RzLFxuICAgICAgICAgICAgcmVzb2x1dGlvbnNbcl0ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1heE51bVByZWNpbmN0c0luTGV2ZWxbcl0gPSBtYXhOdW1QcmVjaW5jdHM7XG4gICAgfVxuICAgIGwgPSAwO1xuICAgIHIgPSAwO1xuICAgIGMgPSAwO1xuICAgIHAgPSAwO1xuXG4gICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHtcbiAgICAgIC8vIFNlY3Rpb24gQi4xMi4xLjMgUmVzb2x1dGlvbi1wb3NpdGlvbi1jb21wb25lbnQtbGF5ZXJcbiAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7XG4gICAgICAgIGZvciAoOyBwIDwgbWF4TnVtUHJlY2luY3RzSW5MZXZlbFtyXTsgcCsrKSB7XG4gICAgICAgICAgZm9yICg7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdO1xuICAgICAgICAgICAgdmFyIG51bXByZWNpbmN0cyA9IHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztcbiAgICAgICAgICAgIGlmIChwID49IG51bXByZWNpbmN0cykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7ICkge1xuICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIHAsIGwpO1xuICAgICAgICAgICAgICBsKys7XG4gICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcCA9IDA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoXCJPdXQgb2YgcGFja2V0c1wiKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDtcbiAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTtcbiAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7XG4gICAgdmFyIHByZWNpbmN0c0l0ZXJhdGlvblNpemVzID0gcHJlY2luY3RzU2l6ZXM7XG4gICAgdmFyIGwgPSAwLFxuICAgICAgciA9IDAsXG4gICAgICBjID0gMCxcbiAgICAgIHB4ID0gMCxcbiAgICAgIHB5ID0gMDtcblxuICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7XG4gICAgICAvLyBTZWN0aW9uIEIuMTIuMS40IFBvc2l0aW9uLWNvbXBvbmVudC1yZXNvbHV0aW9uLWxheWVyXG4gICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7XG4gICAgICAgIGZvciAoOyBweCA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bVdpZGU7IHB4KyspIHtcbiAgICAgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgICAgICAgICAgZm9yICg7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHtcbiAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgICAgICAgIHZhciBzaXplSW5JbWFnZVNjYWxlID1cbiAgICAgICAgICAgICAgICBwcmVjaW5jdHNTaXplcy5jb21wb25lbnRzW2NdLnJlc29sdXRpb25zW3JdO1xuICAgICAgICAgICAgICB2YXIgayA9IGdldFByZWNpbmN0SW5kZXhJZkV4aXN0KFxuICAgICAgICAgICAgICAgIHB4LFxuICAgICAgICAgICAgICAgIHB5LFxuICAgICAgICAgICAgICAgIHNpemVJbkltYWdlU2NhbGUsXG4gICAgICAgICAgICAgICAgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoayA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7ICkge1xuICAgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7XG4gICAgICAgICAgICAgICAgbCsrO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHggPSAwO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiT3V0IG9mIHBhY2tldHNcIik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGNvbnRleHQpIHtcbiAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7XG4gICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50O1xuICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejtcbiAgICB2YXIgcHJlY2luY3RzU2l6ZXMgPSBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpO1xuICAgIHZhciBsID0gMCxcbiAgICAgIHIgPSAwLFxuICAgICAgYyA9IDAsXG4gICAgICBweCA9IDAsXG4gICAgICBweSA9IDA7XG5cbiAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkge1xuICAgICAgLy8gU2VjdGlvbiBCLjEyLjEuNSBDb21wb25lbnQtcG9zaXRpb24tcmVzb2x1dGlvbi1sYXllclxuICAgICAgZm9yICg7IGMgPCBjb21wb25lbnRzQ291bnQ7ICsrYykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgICAgICB2YXIgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMgPSBwcmVjaW5jdHNTaXplcy5jb21wb25lbnRzW2NdO1xuICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID1cbiAgICAgICAgICBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDtcbiAgICAgICAgZm9yICg7IHB5IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtSGlnaDsgcHkrKykge1xuICAgICAgICAgIGZvciAoOyBweCA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bVdpZGU7IHB4KyspIHtcbiAgICAgICAgICAgIGZvciAoOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7XG4gICAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdO1xuICAgICAgICAgICAgICB2YXIgc2l6ZUluSW1hZ2VTY2FsZSA9IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLnJlc29sdXRpb25zW3JdO1xuICAgICAgICAgICAgICB2YXIgayA9IGdldFByZWNpbmN0SW5kZXhJZkV4aXN0KFxuICAgICAgICAgICAgICAgIHB4LFxuICAgICAgICAgICAgICAgIHB5LFxuICAgICAgICAgICAgICAgIHNpemVJbkltYWdlU2NhbGUsXG4gICAgICAgICAgICAgICAgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoayA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7ICkge1xuICAgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7XG4gICAgICAgICAgICAgICAgbCsrO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB5ID0gMDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBKcHhFcnJvcihcIk91dCBvZiBwYWNrZXRzXCIpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoXG4gICAgcHhJbmRleCxcbiAgICBweUluZGV4LFxuICAgIHNpemVJbkltYWdlU2NhbGUsXG4gICAgcHJlY2luY3RJdGVyYXRpb25TaXplcyxcbiAgICByZXNvbHV0aW9uXG4gICkge1xuICAgIHZhciBwb3NYID0gcHhJbmRleCAqIHByZWNpbmN0SXRlcmF0aW9uU2l6ZXMubWluV2lkdGg7XG4gICAgdmFyIHBvc1kgPSBweUluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5IZWlnaHQ7XG4gICAgaWYgKFxuICAgICAgcG9zWCAlIHNpemVJbkltYWdlU2NhbGUud2lkdGggIT09IDAgfHxcbiAgICAgIHBvc1kgJSBzaXplSW5JbWFnZVNjYWxlLmhlaWdodCAhPT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzdGFydFByZWNpbmN0Um93SW5kZXggPVxuICAgICAgKHBvc1kgLyBzaXplSW5JbWFnZVNjYWxlLndpZHRoKSAqXG4gICAgICByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlO1xuICAgIHJldHVybiBwb3NYIC8gc2l6ZUluSW1hZ2VTY2FsZS5oZWlnaHQgKyBzdGFydFByZWNpbmN0Um93SW5kZXg7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSh0aWxlKSB7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHRpbGUuY29tcG9uZW50cy5sZW5ndGg7XG4gICAgdmFyIG1pbldpZHRoID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICB2YXIgbWluSGVpZ2h0ID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICB2YXIgbWF4TnVtV2lkZSA9IDA7XG4gICAgdmFyIG1heE51bUhpZ2ggPSAwO1xuICAgIHZhciBzaXplUGVyQ29tcG9uZW50ID0gbmV3IEFycmF5KGNvbXBvbmVudHNDb3VudCk7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTtcbiAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPVxuICAgICAgICBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDtcbiAgICAgIHZhciBzaXplUGVyUmVzb2x1dGlvbiA9IG5ldyBBcnJheShkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgKyAxKTtcbiAgICAgIHZhciBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgdmFyIG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgdmFyIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50ID0gMDtcbiAgICAgIHZhciBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCA9IDA7XG4gICAgICB2YXIgc2NhbGUgPSAxO1xuICAgICAgZm9yICh2YXIgciA9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgciA+PSAwOyAtLXIpIHtcbiAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07XG4gICAgICAgIHZhciB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uID1cbiAgICAgICAgICBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHRDdXJyZW50UmVzb2x1dGlvbiA9XG4gICAgICAgICAgc2NhbGUgKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdEhlaWdodDtcbiAgICAgICAgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4oXG4gICAgICAgICAgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHdpZHRoQ3VycmVudFJlc29sdXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCA9IE1hdGgubWluKFxuICAgICAgICAgIG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQsXG4gICAgICAgICAgaGVpZ2h0Q3VycmVudFJlc29sdXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChcbiAgICAgICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCxcbiAgICAgICAgICByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlXG4gICAgICAgICk7XG4gICAgICAgIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5tYXgoXG4gICAgICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzaGlnaFxuICAgICAgICApO1xuICAgICAgICBzaXplUGVyUmVzb2x1dGlvbltyXSA9IHtcbiAgICAgICAgICB3aWR0aDogd2lkdGhDdXJyZW50UmVzb2x1dGlvbixcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodEN1cnJlbnRSZXNvbHV0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBzY2FsZSA8PD0gMTtcbiAgICAgIH1cbiAgICAgIG1pbldpZHRoID0gTWF0aC5taW4obWluV2lkdGgsIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCk7XG4gICAgICBtaW5IZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQpO1xuICAgICAgbWF4TnVtV2lkZSA9IE1hdGgubWF4KG1heE51bVdpZGUsIG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50KTtcbiAgICAgIG1heE51bUhpZ2ggPSBNYXRoLm1heChtYXhOdW1IaWdoLCBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCk7XG4gICAgICBzaXplUGVyQ29tcG9uZW50W2NdID0ge1xuICAgICAgICByZXNvbHV0aW9uczogc2l6ZVBlclJlc29sdXRpb24sXG4gICAgICAgIG1pbldpZHRoOiBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsXG4gICAgICAgIG1pbkhlaWdodDogbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCxcbiAgICAgICAgbWF4TnVtV2lkZTogbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQsXG4gICAgICAgIG1heE51bUhpZ2g6IG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBvbmVudHM6IHNpemVQZXJDb21wb25lbnQsXG4gICAgICBtaW5XaWR0aCxcbiAgICAgIG1pbkhlaWdodCxcbiAgICAgIG1heE51bVdpZGUsXG4gICAgICBtYXhOdW1IaWdoLFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gYnVpbGRQYWNrZXRzKGNvbnRleHQpIHtcbiAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7XG4gICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7XG4gICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIC8vIENyZWF0aW5nIHJlc29sdXRpb25zIGFuZCBzdWItYmFuZHMgZm9yIGVhY2ggY29tcG9uZW50XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTtcbiAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPVxuICAgICAgICBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDtcbiAgICAgIC8vIFNlY3Rpb24gQi41IFJlc29sdXRpb24gbGV2ZWxzIGFuZCBzdWItYmFuZHNcbiAgICAgIHZhciByZXNvbHV0aW9ucyA9IFtdO1xuICAgICAgdmFyIHN1YmJhbmRzID0gW107XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykge1xuICAgICAgICB2YXIgYmxvY2tzRGltZW5zaW9ucyA9IGdldEJsb2Nrc0RpbWVuc2lvbnMoY29udGV4dCwgY29tcG9uZW50LCByKTtcbiAgICAgICAgdmFyIHJlc29sdXRpb24gPSB7fTtcbiAgICAgICAgdmFyIHNjYWxlID0gMSA8PCAoZGVjb21wb3NpdGlvbkxldmVsc0NvdW50IC0gcik7XG4gICAgICAgIHJlc29sdXRpb24udHJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIHNjYWxlKTtcbiAgICAgICAgcmVzb2x1dGlvbi50cnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gc2NhbGUpO1xuICAgICAgICByZXNvbHV0aW9uLnRyeDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBzY2FsZSk7XG4gICAgICAgIHJlc29sdXRpb24udHJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIHNjYWxlKTtcbiAgICAgICAgcmVzb2x1dGlvbi5yZXNMZXZlbCA9IHI7XG4gICAgICAgIGJ1aWxkUHJlY2luY3RzKGNvbnRleHQsIHJlc29sdXRpb24sIGJsb2Nrc0RpbWVuc2lvbnMpO1xuICAgICAgICByZXNvbHV0aW9ucy5wdXNoKHJlc29sdXRpb24pO1xuXG4gICAgICAgIHZhciBzdWJiYW5kO1xuICAgICAgICBpZiAociA9PT0gMCkge1xuICAgICAgICAgIC8vIG9uZSBzdWItYmFuZCAoTEwpIHdpdGggbGFzdCBkZWNvbXBvc2l0aW9uXG4gICAgICAgICAgc3ViYmFuZCA9IHt9O1xuICAgICAgICAgIHN1YmJhbmQudHlwZSA9IFwiTExcIjtcbiAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gc2NhbGUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTtcbiAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7XG4gICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTtcbiAgICAgICAgICByZXNvbHV0aW9uLnN1YmJhbmRzID0gW3N1YmJhbmRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBic2NhbGUgPSAxIDw8IChkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByICsgMSk7XG4gICAgICAgICAgdmFyIHJlc29sdXRpb25TdWJiYW5kcyA9IFtdO1xuICAgICAgICAgIC8vIHRocmVlIHN1Yi1iYW5kcyAoSEwsIExIIGFuZCBISCkgd2l0aCByZXN0IG9mIGRlY29tcG9zaXRpb25zXG4gICAgICAgICAgc3ViYmFuZCA9IHt9O1xuICAgICAgICAgIHN1YmJhbmQudHlwZSA9IFwiSExcIjtcbiAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUpO1xuICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpO1xuICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7XG4gICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7XG5cbiAgICAgICAgICBzdWJiYW5kID0ge307XG4gICAgICAgICAgc3ViYmFuZC50eXBlID0gXCJMSFwiO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSAtIDAuNSk7XG4gICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7XG4gICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTtcbiAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTtcblxuICAgICAgICAgIHN1YmJhbmQgPSB7fTtcbiAgICAgICAgICBzdWJiYW5kLnR5cGUgPSBcIkhIXCI7XG4gICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUgLSAwLjUpO1xuICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSAtIDAuNSk7XG4gICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlIC0gMC41KTtcbiAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTtcbiAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpO1xuXG4gICAgICAgICAgcmVzb2x1dGlvbi5zdWJiYW5kcyA9IHJlc29sdXRpb25TdWJiYW5kcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29tcG9uZW50LnJlc29sdXRpb25zID0gcmVzb2x1dGlvbnM7XG4gICAgICBjb21wb25lbnQuc3ViYmFuZHMgPSBzdWJiYW5kcztcbiAgICB9XG4gICAgLy8gR2VuZXJhdGUgdGhlIHBhY2tldHMgc2VxdWVuY2VcbiAgICB2YXIgcHJvZ3Jlc3Npb25PcmRlciA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5wcm9ncmVzc2lvbk9yZGVyO1xuICAgIHN3aXRjaCAocHJvZ3Jlc3Npb25PcmRlcikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0aWxlLnBhY2tldHNJdGVyYXRvciA9IG5ldyBMYXllclJlc29sdXRpb25Db21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICB0aWxlLnBhY2tldHNJdGVyYXRvciA9IG5ldyBQb3NpdGlvbkNvbXBvbmVudFJlc29sdXRpb25MYXllckl0ZXJhdG9yKFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihgVW5zdXBwb3J0ZWQgcHJvZ3Jlc3Npb24gb3JkZXIgJHtwcm9ncmVzc2lvbk9yZGVyfWApO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwYXJzZVRpbGVQYWNrZXRzKGNvbnRleHQsIGRhdGEsIG9mZnNldCwgZGF0YUxlbmd0aCkge1xuICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgdmFyIGJ1ZmZlcixcbiAgICAgIGJ1ZmZlclNpemUgPSAwLFxuICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiByZWFkQml0cyhjb3VudCkge1xuICAgICAgd2hpbGUgKGJ1ZmZlclNpemUgPCBjb3VudCkge1xuICAgICAgICB2YXIgYiA9IGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dO1xuICAgICAgICBwb3NpdGlvbisrO1xuICAgICAgICBpZiAoc2tpcE5leHRCaXQpIHtcbiAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDcpIHwgYjtcbiAgICAgICAgICBidWZmZXJTaXplICs9IDc7XG4gICAgICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDgpIHwgYjtcbiAgICAgICAgICBidWZmZXJTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPT09IDB4ZmYpIHtcbiAgICAgICAgICBza2lwTmV4dEJpdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1ZmZlclNpemUgLT0gY291bnQ7XG4gICAgICByZXR1cm4gKGJ1ZmZlciA+Pj4gYnVmZmVyU2l6ZSkgJiAoKDEgPDwgY291bnQpIC0gMSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNraXBNYXJrZXJJZkVxdWFsKHZhbHVlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb24gLSAxXSA9PT0gMHhmZiAmJlxuICAgICAgICBkYXRhW29mZnNldCArIHBvc2l0aW9uXSA9PT0gdmFsdWVcbiAgICAgICkge1xuICAgICAgICBza2lwQnl0ZXMoMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl0gPT09IDB4ZmYgJiZcbiAgICAgICAgZGF0YVtvZmZzZXQgKyBwb3NpdGlvbiArIDFdID09PSB2YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIHNraXBCeXRlcygyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNraXBCeXRlcyhjb3VudCkge1xuICAgICAgcG9zaXRpb24gKz0gY291bnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFsaWduVG9CeXRlKCkge1xuICAgICAgYnVmZmVyU2l6ZSA9IDA7XG4gICAgICBpZiAoc2tpcE5leHRCaXQpIHtcbiAgICAgICAgcG9zaXRpb24rKztcbiAgICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVhZENvZGluZ3Bhc3NlcygpIHtcbiAgICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMjtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9IHJlYWRCaXRzKDIpO1xuICAgICAgaWYgKHZhbHVlIDwgMykge1xuICAgICAgICByZXR1cm4gdmFsdWUgKyAzO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSByZWFkQml0cyg1KTtcbiAgICAgIGlmICh2YWx1ZSA8IDMxKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSArIDY7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHJlYWRCaXRzKDcpO1xuICAgICAgcmV0dXJuIHZhbHVlICsgMzc7XG4gICAgfVxuICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4O1xuICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdO1xuICAgIHZhciBzb3BNYXJrZXJVc2VkID0gY29udGV4dC5DT0Quc29wTWFya2VyVXNlZDtcbiAgICB2YXIgZXBoTWFya2VyVXNlZCA9IGNvbnRleHQuQ09ELmVwaE1hcmtlclVzZWQ7XG4gICAgdmFyIHBhY2tldHNJdGVyYXRvciA9IHRpbGUucGFja2V0c0l0ZXJhdG9yO1xuICAgIHdoaWxlIChwb3NpdGlvbiA8IGRhdGFMZW5ndGgpIHtcbiAgICAgIGFsaWduVG9CeXRlKCk7XG4gICAgICBpZiAoc29wTWFya2VyVXNlZCAmJiBza2lwTWFya2VySWZFcXVhbCgweDkxKSkge1xuICAgICAgICAvLyBTa2lwIGFsc28gbWFya2VyIHNlZ21lbnQgbGVuZ3RoIGFuZCBwYWNrZXQgc2VxdWVuY2UgSURcbiAgICAgICAgc2tpcEJ5dGVzKDQpO1xuICAgICAgfVxuICAgICAgdmFyIHBhY2tldCA9IHBhY2tldHNJdGVyYXRvci5uZXh0UGFja2V0KCk7XG4gICAgICBpZiAoIXJlYWRCaXRzKDEpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGxheWVyTnVtYmVyID0gcGFja2V0LmxheWVyTnVtYmVyO1xuICAgICAgdmFyIHF1ZXVlID0gW10sXG4gICAgICAgIGNvZGVibG9jaztcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhY2tldC5jb2RlYmxvY2tzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29kZWJsb2NrID0gcGFja2V0LmNvZGVibG9ja3NbaV07XG4gICAgICAgIHZhciBwcmVjaW5jdCA9IGNvZGVibG9jay5wcmVjaW5jdDtcbiAgICAgICAgdmFyIGNvZGVibG9ja0NvbHVtbiA9IGNvZGVibG9jay5jYnggLSBwcmVjaW5jdC5jYnhNaW47XG4gICAgICAgIHZhciBjb2RlYmxvY2tSb3cgPSBjb2RlYmxvY2suY2J5IC0gcHJlY2luY3QuY2J5TWluO1xuICAgICAgICB2YXIgY29kZWJsb2NrSW5jbHVkZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGZpcnN0VGltZUluY2x1c2lvbiA9IGZhbHNlO1xuICAgICAgICB2YXIgdmFsdWVSZWFkeTtcbiAgICAgICAgaWYgKGNvZGVibG9jay5pbmNsdWRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29kZWJsb2NrSW5jbHVkZWQgPSAhIXJlYWRCaXRzKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHJlYWRpbmcgaW5jbHVzaW9uIHRyZWVcbiAgICAgICAgICBwcmVjaW5jdCA9IGNvZGVibG9jay5wcmVjaW5jdDtcbiAgICAgICAgICB2YXIgaW5jbHVzaW9uVHJlZSwgemVyb0JpdFBsYW5lc1RyZWU7XG4gICAgICAgICAgaWYgKHByZWNpbmN0LmluY2x1c2lvblRyZWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaW5jbHVzaW9uVHJlZSA9IHByZWNpbmN0LmluY2x1c2lvblRyZWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJ1aWxkaW5nIGluY2x1c2lvbiBhbmQgemVybyBiaXQtcGxhbmVzIHRyZWVzXG4gICAgICAgICAgICB2YXIgd2lkdGggPSBwcmVjaW5jdC5jYnhNYXggLSBwcmVjaW5jdC5jYnhNaW4gKyAxO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHByZWNpbmN0LmNieU1heCAtIHByZWNpbmN0LmNieU1pbiArIDE7XG4gICAgICAgICAgICBpbmNsdXNpb25UcmVlID0gbmV3IEluY2x1c2lvblRyZWUod2lkdGgsIGhlaWdodCwgbGF5ZXJOdW1iZXIpO1xuICAgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUgPSBuZXcgVGFnVHJlZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIHByZWNpbmN0LmluY2x1c2lvblRyZWUgPSBpbmNsdXNpb25UcmVlO1xuICAgICAgICAgICAgcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWUgPSB6ZXJvQml0UGxhbmVzVHJlZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW5jbHVzaW9uVHJlZS5yZXNldChjb2RlYmxvY2tDb2x1bW4sIGNvZGVibG9ja1JvdywgbGF5ZXJOdW1iZXIpKSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICBpZiAocmVhZEJpdHMoMSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVJlYWR5ID0gIWluY2x1c2lvblRyZWUubmV4dExldmVsKCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlUmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgIGNvZGVibG9jay5pbmNsdWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBjb2RlYmxvY2tJbmNsdWRlZCA9IGZpcnN0VGltZUluY2x1c2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5jbHVzaW9uVHJlZS5pbmNyZW1lbnRWYWx1ZShsYXllck51bWJlcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb2RlYmxvY2tJbmNsdWRlZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaXJzdFRpbWVJbmNsdXNpb24pIHtcbiAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IHByZWNpbmN0Lnplcm9CaXRQbGFuZXNUcmVlO1xuICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93KTtcbiAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgaWYgKHJlYWRCaXRzKDEpKSB7XG4gICAgICAgICAgICAgIHZhbHVlUmVhZHkgPSAhemVyb0JpdFBsYW5lc1RyZWUubmV4dExldmVsKCk7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlLmluY3JlbWVudFZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvZGVibG9jay56ZXJvQml0UGxhbmVzID0gemVyb0JpdFBsYW5lc1RyZWUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGluZ3Bhc3NlcyA9IHJlYWRDb2RpbmdwYXNzZXMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRCaXRzKDEpKSB7XG4gICAgICAgICAgY29kZWJsb2NrLkxibG9jaysrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb2RpbmdwYXNzZXNMb2cyID0gbG9nMihjb2RpbmdwYXNzZXMpO1xuICAgICAgICAvLyByb3VuZGluZyBkb3duIGxvZzJcbiAgICAgICAgdmFyIGJpdHMgPVxuICAgICAgICAgIChjb2RpbmdwYXNzZXMgPCAxIDw8IGNvZGluZ3Bhc3Nlc0xvZzJcbiAgICAgICAgICAgID8gY29kaW5ncGFzc2VzTG9nMiAtIDFcbiAgICAgICAgICAgIDogY29kaW5ncGFzc2VzTG9nMikgKyBjb2RlYmxvY2suTGJsb2NrO1xuICAgICAgICB2YXIgY29kZWREYXRhTGVuZ3RoID0gcmVhZEJpdHMoYml0cyk7XG4gICAgICAgIHF1ZXVlLnB1c2goe1xuICAgICAgICAgIGNvZGVibG9jayxcbiAgICAgICAgICBjb2RpbmdwYXNzZXMsXG4gICAgICAgICAgZGF0YUxlbmd0aDogY29kZWREYXRhTGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGFsaWduVG9CeXRlKCk7XG4gICAgICBpZiAoZXBoTWFya2VyVXNlZCkge1xuICAgICAgICBza2lwTWFya2VySWZFcXVhbCgweDkyKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBwYWNrZXRJdGVtID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgY29kZWJsb2NrID0gcGFja2V0SXRlbS5jb2RlYmxvY2s7XG4gICAgICAgIGlmIChjb2RlYmxvY2suZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29kZWJsb2NrLmRhdGEgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlYmxvY2suZGF0YS5wdXNoKHtcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIHN0YXJ0OiBvZmZzZXQgKyBwb3NpdGlvbixcbiAgICAgICAgICBlbmQ6IG9mZnNldCArIHBvc2l0aW9uICsgcGFja2V0SXRlbS5kYXRhTGVuZ3RoLFxuICAgICAgICAgIGNvZGluZ3Bhc3NlczogcGFja2V0SXRlbS5jb2RpbmdwYXNzZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBwb3NpdGlvbiArPSBwYWNrZXRJdGVtLmRhdGFMZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuICBmdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKFxuICAgIGNvZWZmaWNpZW50cyxcbiAgICBsZXZlbFdpZHRoLFxuICAgIGxldmVsSGVpZ2h0LFxuICAgIHN1YmJhbmQsXG4gICAgZGVsdGEsXG4gICAgbWIsXG4gICAgcmV2ZXJzaWJsZSxcbiAgICBzZWdtZW50YXRpb25TeW1ib2xVc2VkXG4gICkge1xuICAgIHZhciB4MCA9IHN1YmJhbmQudGJ4MDtcbiAgICB2YXIgeTAgPSBzdWJiYW5kLnRieTA7XG4gICAgdmFyIHdpZHRoID0gc3ViYmFuZC50YngxIC0gc3ViYmFuZC50YngwO1xuICAgIHZhciBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzO1xuICAgIHZhciByaWdodCA9IHN1YmJhbmQudHlwZS5jaGFyQXQoMCkgPT09IFwiSFwiID8gMSA6IDA7XG4gICAgdmFyIGJvdHRvbSA9IHN1YmJhbmQudHlwZS5jaGFyQXQoMSkgPT09IFwiSFwiID8gbGV2ZWxXaWR0aCA6IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjb2RlYmxvY2tzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIHZhciBjb2RlYmxvY2sgPSBjb2RlYmxvY2tzW2ldO1xuICAgICAgdmFyIGJsb2NrV2lkdGggPSBjb2RlYmxvY2sudGJ4MV8gLSBjb2RlYmxvY2sudGJ4MF87XG4gICAgICB2YXIgYmxvY2tIZWlnaHQgPSBjb2RlYmxvY2sudGJ5MV8gLSBjb2RlYmxvY2sudGJ5MF87XG4gICAgICBpZiAoYmxvY2tXaWR0aCA9PT0gMCB8fCBibG9ja0hlaWdodCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2RlYmxvY2suZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgYml0TW9kZWwsIGN1cnJlbnRDb2RpbmdwYXNzVHlwZTtcbiAgICAgIGJpdE1vZGVsID0gbmV3IEJpdE1vZGVsKFxuICAgICAgICBibG9ja1dpZHRoLFxuICAgICAgICBibG9ja0hlaWdodCxcbiAgICAgICAgY29kZWJsb2NrLnN1YmJhbmRUeXBlLFxuICAgICAgICBjb2RlYmxvY2suemVyb0JpdFBsYW5lcyxcbiAgICAgICAgbWJcbiAgICAgICk7XG4gICAgICBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAyOyAvLyBmaXJzdCBiaXQgcGxhbmUgc3RhcnRzIGZyb20gY2xlYW51cFxuXG4gICAgICAvLyBjb2xsZWN0IGRhdGFcbiAgICAgIHZhciBkYXRhID0gY29kZWJsb2NrLmRhdGEsXG4gICAgICAgIHRvdGFsTGVuZ3RoID0gMCxcbiAgICAgICAgY29kaW5ncGFzc2VzID0gMDtcbiAgICAgIHZhciBqLCBqaiwgZGF0YUl0ZW07XG4gICAgICBmb3IgKGogPSAwLCBqaiA9IGRhdGEubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBkYXRhSXRlbSA9IGRhdGFbal07XG4gICAgICAgIHRvdGFsTGVuZ3RoICs9IGRhdGFJdGVtLmVuZCAtIGRhdGFJdGVtLnN0YXJ0O1xuICAgICAgICBjb2RpbmdwYXNzZXMgKz0gZGF0YUl0ZW0uY29kaW5ncGFzc2VzO1xuICAgICAgfVxuICAgICAgdmFyIGVuY29kZWREYXRhID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTtcbiAgICAgICAgdmFyIGNodW5rID0gZGF0YUl0ZW0uZGF0YS5zdWJhcnJheShkYXRhSXRlbS5zdGFydCwgZGF0YUl0ZW0uZW5kKTtcbiAgICAgICAgZW5jb2RlZERhdGEuc2V0KGNodW5rLCBwb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uICs9IGNodW5rLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIGRlY29kaW5nIHRoZSBpdGVtXG4gICAgICB2YXIgZGVjb2RlciA9IG5ldyBBcml0aG1ldGljRGVjb2RlcihlbmNvZGVkRGF0YSwgMCwgdG90YWxMZW5ndGgpO1xuICAgICAgYml0TW9kZWwuc2V0RGVjb2RlcihkZWNvZGVyKTtcblxuICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGluZ3Bhc3NlczsgaisrKSB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudENvZGluZ3Bhc3NUeXBlKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYml0TW9kZWwucnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBiaXRNb2RlbC5ydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzcygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgYml0TW9kZWwucnVuQ2xlYW51cFBhc3MoKTtcbiAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25TeW1ib2xVc2VkKSB7XG4gICAgICAgICAgICAgIGJpdE1vZGVsLmNoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAoY3VycmVudENvZGluZ3Bhc3NUeXBlICsgMSkgJSAzO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2Zmc2V0ID0gY29kZWJsb2NrLnRieDBfIC0geDAgKyAoY29kZWJsb2NrLnRieTBfIC0geTApICogd2lkdGg7XG4gICAgICB2YXIgc2lnbiA9IGJpdE1vZGVsLmNvZWZmaWNlbnRzU2lnbjtcbiAgICAgIHZhciBtYWduaXR1ZGUgPSBiaXRNb2RlbC5jb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgIHZhciBiaXRzRGVjb2RlZCA9IGJpdE1vZGVsLmJpdHNEZWNvZGVkO1xuICAgICAgdmFyIG1hZ25pdHVkZUNvcnJlY3Rpb24gPSByZXZlcnNpYmxlID8gMCA6IDAuNTtcbiAgICAgIHZhciBrLCBuLCBuYjtcbiAgICAgIHBvc2l0aW9uID0gMDtcbiAgICAgIC8vIERvIHRoZSBpbnRlcmxlYXZpbmcgb2YgU2VjdGlvbiBGLjMuMyBoZXJlLCBzbyB3ZSBkbyBub3QgbmVlZFxuICAgICAgLy8gdG8gY29weSBsYXRlci4gTEwgbGV2ZWwgaXMgbm90IGludGVybGVhdmVkLCBqdXN0IGNvcGllZC5cbiAgICAgIHZhciBpbnRlcmxlYXZlID0gc3ViYmFuZC50eXBlICE9PSBcIkxMXCI7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgYmxvY2tIZWlnaHQ7IGorKykge1xuICAgICAgICB2YXIgcm93ID0gKG9mZnNldCAvIHdpZHRoKSB8IDA7IC8vIHJvdyBpbiB0aGUgbm9uLWludGVybGVhdmVkIHN1YmJhbmRcbiAgICAgICAgdmFyIGxldmVsT2Zmc2V0ID0gMiAqIHJvdyAqIChsZXZlbFdpZHRoIC0gd2lkdGgpICsgcmlnaHQgKyBib3R0b207XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBibG9ja1dpZHRoOyBrKyspIHtcbiAgICAgICAgICBuID0gbWFnbml0dWRlW3Bvc2l0aW9uXTtcbiAgICAgICAgICBpZiAobiAhPT0gMCkge1xuICAgICAgICAgICAgbiA9IChuICsgbWFnbml0dWRlQ29ycmVjdGlvbikgKiBkZWx0YTtcbiAgICAgICAgICAgIGlmIChzaWduW3Bvc2l0aW9uXSAhPT0gMCkge1xuICAgICAgICAgICAgICBuID0gLW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYiA9IGJpdHNEZWNvZGVkW3Bvc2l0aW9uXTtcbiAgICAgICAgICAgIHZhciBwb3MgPSBpbnRlcmxlYXZlID8gbGV2ZWxPZmZzZXQgKyAob2Zmc2V0IDw8IDEpIDogb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKHJldmVyc2libGUgJiYgbmIgPj0gbWIpIHtcbiAgICAgICAgICAgICAgY29lZmZpY2llbnRzW3Bvc10gPSBuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29lZmZpY2llbnRzW3Bvc10gPSBuICogKDEgPDwgKG1iIC0gbmIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgcG9zaXRpb24rKztcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgKz0gd2lkdGggLSBibG9ja1dpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKGNvbnRleHQsIHRpbGUsIGMpIHtcbiAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdO1xuICAgIHZhciBjb2RpbmdTdHlsZVBhcmFtZXRlcnMgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzO1xuICAgIHZhciBxdWFudGl6YXRpb25QYXJhbWV0ZXJzID0gY29tcG9uZW50LnF1YW50aXphdGlvblBhcmFtZXRlcnM7XG4gICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9XG4gICAgICBjb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O1xuICAgIHZhciBzcHFjZHMgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlNQcWNkcztcbiAgICB2YXIgc2NhbGFyRXhwb3VuZGVkID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5zY2FsYXJFeHBvdW5kZWQ7XG4gICAgdmFyIGd1YXJkQml0cyA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuZ3VhcmRCaXRzO1xuICAgIHZhciBzZWdtZW50YXRpb25TeW1ib2xVc2VkID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQ7XG4gICAgdmFyIHByZWNpc2lvbiA9IGNvbnRleHQuY29tcG9uZW50c1tjXS5wcmVjaXNpb247XG5cbiAgICB2YXIgcmV2ZXJzaWJsZSA9IGNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb247XG4gICAgdmFyIHRyYW5zZm9ybSA9IHJldmVyc2libGVcbiAgICAgID8gbmV3IFJldmVyc2libGVUcmFuc2Zvcm0oKVxuICAgICAgOiBuZXcgSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCk7XG5cbiAgICB2YXIgc3ViYmFuZENvZWZmaWNpZW50cyA9IFtdO1xuICAgIHZhciBiID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IGkrKykge1xuICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbaV07XG5cbiAgICAgIHZhciB3aWR0aCA9IHJlc29sdXRpb24udHJ4MSAtIHJlc29sdXRpb24udHJ4MDtcbiAgICAgIHZhciBoZWlnaHQgPSByZXNvbHV0aW9uLnRyeTEgLSByZXNvbHV0aW9uLnRyeTA7XG4gICAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdob2xlIHN1YmxldmVsLlxuICAgICAgdmFyIGNvZWZmaWNpZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiBoZWlnaHQpO1xuXG4gICAgICBmb3IgKHZhciBqID0gMCwgamogPSByZXNvbHV0aW9uLnN1YmJhbmRzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgdmFyIG11LCBlcHNpbG9uO1xuICAgICAgICBpZiAoIXNjYWxhckV4cG91bmRlZCkge1xuICAgICAgICAgIC8vIGZvcm11bGEgRS01XG4gICAgICAgICAgbXUgPSBzcHFjZHNbMF0ubXU7XG4gICAgICAgICAgZXBzaWxvbiA9IHNwcWNkc1swXS5lcHNpbG9uICsgKGkgPiAwID8gMSAtIGkgOiAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtdSA9IHNwcWNkc1tiXS5tdTtcbiAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzW2JdLmVwc2lsb247XG4gICAgICAgICAgYisrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN1YmJhbmQgPSByZXNvbHV0aW9uLnN1YmJhbmRzW2pdO1xuICAgICAgICB2YXIgZ2FpbkxvZzIgPSBTdWJiYW5kc0dhaW5Mb2cyW3N1YmJhbmQudHlwZV07XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHF1YW50aXphdGlvbiBjb2VmZmljaWVudCAoU2VjdGlvbiBFLjEuMS4xKVxuICAgICAgICB2YXIgZGVsdGEgPSByZXZlcnNpYmxlXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiAyICoqIChwcmVjaXNpb24gKyBnYWluTG9nMiAtIGVwc2lsb24pICogKDEgKyBtdSAvIDIwNDgpO1xuICAgICAgICB2YXIgbWIgPSBndWFyZEJpdHMgKyBlcHNpbG9uIC0gMTtcblxuICAgICAgICAvLyBJbiB0aGUgZmlyc3QgcmVzb2x1dGlvbiBsZXZlbCwgY29weUNvZWZmaWNpZW50cyB3aWxsIGZpbGwgdGhlXG4gICAgICAgIC8vIHdob2xlIGFycmF5IHdpdGggY29lZmZpY2llbnRzLiBJbiB0aGUgc3VjY2VlZGluZyBwYXNzZXMsXG4gICAgICAgIC8vIGNvcHlDb2VmZmljaWVudHMgd2lsbCBjb25zZWN1dGl2ZWx5IGZpbGwgaW4gdGhlIHZhbHVlcyB0aGF0IGJlbG9uZ1xuICAgICAgICAvLyB0byB0aGUgaW50ZXJsZWF2ZWQgcG9zaXRpb25zIG9mIHRoZSBITCwgTEgsIGFuZCBISCBjb2VmZmljaWVudHMuXG4gICAgICAgIC8vIFRoZSBMTCBjb2VmZmljaWVudHMgd2lsbCB0aGVuIGJlIGludGVybGVhdmVkIGluIFRyYW5zZm9ybS5pdGVyYXRlKCkuXG4gICAgICAgIGNvcHlDb2VmZmljaWVudHMoXG4gICAgICAgICAgY29lZmZpY2llbnRzLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBzdWJiYW5kLFxuICAgICAgICAgIGRlbHRhLFxuICAgICAgICAgIG1iLFxuICAgICAgICAgIHJldmVyc2libGUsXG4gICAgICAgICAgc2VnbWVudGF0aW9uU3ltYm9sVXNlZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3ViYmFuZENvZWZmaWNpZW50cy5wdXNoKHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgaXRlbXM6IGNvZWZmaWNpZW50cyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm0uY2FsY3VsYXRlKFxuICAgICAgc3ViYmFuZENvZWZmaWNpZW50cyxcbiAgICAgIGNvbXBvbmVudC50Y3gwLFxuICAgICAgY29tcG9uZW50LnRjeTBcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBjb21wb25lbnQudGN4MCxcbiAgICAgIHRvcDogY29tcG9uZW50LnRjeTAsXG4gICAgICB3aWR0aDogcmVzdWx0LndpZHRoLFxuICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LFxuICAgICAgaXRlbXM6IHJlc3VsdC5pdGVtcyxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybUNvbXBvbmVudHMoY29udGV4dCkge1xuICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjtcbiAgICB2YXIgY29tcG9uZW50cyA9IGNvbnRleHQuY29tcG9uZW50cztcbiAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7XG4gICAgdmFyIHJlc3VsdEltYWdlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbnRleHQudGlsZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW2ldO1xuICAgICAgdmFyIHRyYW5zZm9ybWVkVGlsZXMgPSBbXTtcbiAgICAgIHZhciBjO1xuICAgICAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7XG4gICAgICAgIHRyYW5zZm9ybWVkVGlsZXNbY10gPSB0cmFuc2Zvcm1UaWxlKGNvbnRleHQsIHRpbGUsIGMpO1xuICAgICAgfVxuICAgICAgdmFyIHRpbGUwID0gdHJhbnNmb3JtZWRUaWxlc1swXTtcbiAgICAgIHZhciBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodGlsZTAuaXRlbXMubGVuZ3RoICogY29tcG9uZW50c0NvdW50KTtcbiAgICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIGxlZnQ6IHRpbGUwLmxlZnQsXG4gICAgICAgIHRvcDogdGlsZTAudG9wLFxuICAgICAgICB3aWR0aDogdGlsZTAud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGlsZTAuaGVpZ2h0LFxuICAgICAgICBpdGVtczogb3V0LFxuICAgICAgfTtcblxuICAgICAgLy8gU2VjdGlvbiBHLjIuMiBJbnZlcnNlIG11bHRpIGNvbXBvbmVudCB0cmFuc2Zvcm1cbiAgICAgIHZhciBzaGlmdCwgb2Zmc2V0O1xuICAgICAgdmFyIHBvcyA9IDAsXG4gICAgICAgIGosXG4gICAgICAgIGpqLFxuICAgICAgICB5MCxcbiAgICAgICAgeTEsXG4gICAgICAgIHkyO1xuICAgICAgaWYgKHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSkge1xuICAgICAgICB2YXIgZm91ckNvbXBvbmVudHMgPSBjb21wb25lbnRzQ291bnQgPT09IDQ7XG4gICAgICAgIHZhciB5MGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1swXS5pdGVtcztcbiAgICAgICAgdmFyIHkxaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzFdLml0ZW1zO1xuICAgICAgICB2YXIgeTJpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMl0uaXRlbXM7XG4gICAgICAgIHZhciB5M2l0ZW1zID0gZm91ckNvbXBvbmVudHMgPyB0cmFuc2Zvcm1lZFRpbGVzWzNdLml0ZW1zIDogbnVsbDtcblxuICAgICAgICAvLyBIQUNLOiBUaGUgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybSBmb3JtdWxhcyBiZWxvdyBhc3N1bWUgdGhhdFxuICAgICAgICAvLyBhbGwgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lIHByZWNpc2lvbi4gV2l0aCB0aGlzIGluIG1pbmQsIHdlXG4gICAgICAgIC8vIGNvbXB1dGUgc2hpZnQgYW5kIG9mZnNldCBvbmx5IG9uY2UuXG4gICAgICAgIHNoaWZ0ID0gY29tcG9uZW50c1swXS5wcmVjaXNpb24gLSA4O1xuICAgICAgICBvZmZzZXQgPSAoMTI4IDw8IHNoaWZ0KSArIDAuNTtcblxuICAgICAgICB2YXIgY29tcG9uZW50MCA9IHRpbGUuY29tcG9uZW50c1swXTtcbiAgICAgICAgdmFyIGFscGhhMDEgPSBjb21wb25lbnRzQ291bnQgLSAzO1xuICAgICAgICBqaiA9IHkwaXRlbXMubGVuZ3RoO1xuICAgICAgICBpZiAoIWNvbXBvbmVudDAuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbikge1xuICAgICAgICAgIC8vIGludmVyc2UgaXJyZXZlcnNpYmxlIG11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1cbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgamo7IGorKywgcG9zICs9IGFscGhhMDEpIHtcbiAgICAgICAgICAgIHkwID0geTBpdGVtc1tqXSArIG9mZnNldDtcbiAgICAgICAgICAgIHkxID0geTFpdGVtc1tqXTtcbiAgICAgICAgICAgIHkyID0geTJpdGVtc1tqXTtcbiAgICAgICAgICAgIG91dFtwb3MrK10gPSAoeTAgKyAxLjQwMiAqIHkyKSA+PiBzaGlmdDtcbiAgICAgICAgICAgIG91dFtwb3MrK10gPSAoeTAgLSAwLjM0NDEzICogeTEgLSAwLjcxNDE0ICogeTIpID4+IHNoaWZ0O1xuICAgICAgICAgICAgb3V0W3BvcysrXSA9ICh5MCArIDEuNzcyICogeTEpID4+IHNoaWZ0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpbnZlcnNlIHJldmVyc2libGUgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybVxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqajsgaisrLCBwb3MgKz0gYWxwaGEwMSkge1xuICAgICAgICAgICAgeTAgPSB5MGl0ZW1zW2pdICsgb2Zmc2V0O1xuICAgICAgICAgICAgeTEgPSB5MWl0ZW1zW2pdO1xuICAgICAgICAgICAgeTIgPSB5Mml0ZW1zW2pdO1xuICAgICAgICAgICAgY29uc3QgZyA9IHkwIC0gKCh5MiArIHkxKSA+PiAyKTtcblxuICAgICAgICAgICAgb3V0W3BvcysrXSA9IChnICsgeTIpID4+IHNoaWZ0O1xuICAgICAgICAgICAgb3V0W3BvcysrXSA9IGcgPj4gc2hpZnQ7XG4gICAgICAgICAgICBvdXRbcG9zKytdID0gKGcgKyB5MSkgPj4gc2hpZnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VyQ29tcG9uZW50cykge1xuICAgICAgICAgIGZvciAoaiA9IDAsIHBvcyA9IDM7IGogPCBqajsgaisrLCBwb3MgKz0gNCkge1xuICAgICAgICAgICAgb3V0W3Bvc10gPSAoeTNpdGVtc1tqXSArIG9mZnNldCkgPj4gc2hpZnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBubyBtdWx0aS1jb21wb25lbnQgdHJhbnNmb3JtXG4gICAgICAgIGZvciAoYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykge1xuICAgICAgICAgIHZhciBpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbY10uaXRlbXM7XG4gICAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzW2NdLnByZWNpc2lvbiAtIDg7XG4gICAgICAgICAgb2Zmc2V0ID0gKDEyOCA8PCBzaGlmdCkgKyAwLjU7XG4gICAgICAgICAgZm9yIChwb3MgPSBjLCBqID0gMCwgamogPSBpdGVtcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgICBvdXRbcG9zXSA9IChpdGVtc1tqXSArIG9mZnNldCkgPj4gc2hpZnQ7XG4gICAgICAgICAgICBwb3MgKz0gY29tcG9uZW50c0NvdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0SW1hZ2VzLnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdEltYWdlcztcbiAgfVxuICBmdW5jdGlvbiBpbml0aWFsaXplVGlsZShjb250ZXh0LCB0aWxlSW5kZXgpIHtcbiAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7XG4gICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6O1xuICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdO1xuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHtcbiAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107XG4gICAgICB2YXIgcWNkT3JRY2MgPVxuICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjXVxuICAgICAgICAgIDogY29udGV4dC5jdXJyZW50VGlsZS5RQ0Q7XG4gICAgICBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVycyA9IHFjZE9yUWNjO1xuICAgICAgdmFyIGNvZE9yQ29jID1cbiAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0NbY10gIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gY29udGV4dC5jdXJyZW50VGlsZS5DT0NbY11cbiAgICAgICAgICA6IGNvbnRleHQuY3VycmVudFRpbGUuQ09EO1xuICAgICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvZE9yQ29jO1xuICAgIH1cbiAgICB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMgPSBjb250ZXh0LmN1cnJlbnRUaWxlLkNPRDtcbiAgfVxuXG4gIC8vIFNlY3Rpb24gQi4xMC4yIFRhZyB0cmVlc1xuICB2YXIgVGFnVHJlZSA9IChmdW5jdGlvbiBUYWdUcmVlQ2xvc3VyZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gVGFnVHJlZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB2YXIgbGV2ZWxzTGVuZ3RoID0gbG9nMihNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSkgKyAxO1xuICAgICAgdGhpcy5sZXZlbHMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGV2ZWxzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGxldmVsID0ge1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubGV2ZWxzLnB1c2gobGV2ZWwpO1xuICAgICAgICB3aWR0aCA9IE1hdGguY2VpbCh3aWR0aCAvIDIpO1xuICAgICAgICBoZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0IC8gMik7XG4gICAgICB9XG4gICAgfVxuICAgIFRhZ1RyZWUucHJvdG90eXBlID0ge1xuICAgICAgcmVzZXQ6IGZ1bmN0aW9uIFRhZ1RyZWVfcmVzZXQoaSwgaikge1xuICAgICAgICB2YXIgY3VycmVudExldmVsID0gMCxcbiAgICAgICAgICB2YWx1ZSA9IDAsXG4gICAgICAgICAgbGV2ZWw7XG4gICAgICAgIHdoaWxlIChjdXJyZW50TGV2ZWwgPCB0aGlzLmxldmVscy5sZW5ndGgpIHtcbiAgICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgICAgdmFyIGluZGV4ID0gaSArIGogKiBsZXZlbC53aWR0aDtcbiAgICAgICAgICBpZiAobGV2ZWwuaXRlbXNbaW5kZXhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbGV2ZWwuaXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldmVsLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgaSA+Pj0gMTtcbiAgICAgICAgICBqID4+PSAxO1xuICAgICAgICAgIGN1cnJlbnRMZXZlbCsrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRMZXZlbC0tO1xuICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07XG4gICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDtcbiAgICAgICAgZGVsZXRlIHRoaXMudmFsdWU7XG4gICAgICB9LFxuICAgICAgaW5jcmVtZW50VmFsdWU6IGZ1bmN0aW9uIFRhZ1RyZWVfaW5jcmVtZW50VmFsdWUoKSB7XG4gICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTtcbiAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdKys7XG4gICAgICB9LFxuICAgICAgbmV4dExldmVsOiBmdW5jdGlvbiBUYWdUcmVlX25leHRMZXZlbCgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IHRoaXMuY3VycmVudExldmVsO1xuICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07XG4gICAgICAgIGN1cnJlbnRMZXZlbC0tO1xuICAgICAgICBpZiAoY3VycmVudExldmVsIDwgMCkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDtcbiAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIFRhZ1RyZWU7XG4gIH0pKCk7XG5cbiAgdmFyIEluY2x1c2lvblRyZWUgPSAoZnVuY3Rpb24gSW5jbHVzaW9uVHJlZUNsb3N1cmUoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZ1bmN0aW9uIEluY2x1c2lvblRyZWUod2lkdGgsIGhlaWdodCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgbGV2ZWxzTGVuZ3RoID0gbG9nMihNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSkgKyAxO1xuICAgICAgdGhpcy5sZXZlbHMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGV2ZWxzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBpdGVtcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgaXRlbXNbal0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGV2ZWwgPSB7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmxldmVscy5wdXNoKGxldmVsKTtcblxuICAgICAgICB3aWR0aCA9IE1hdGguY2VpbCh3aWR0aCAvIDIpO1xuICAgICAgICBoZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0IC8gMik7XG4gICAgICB9XG4gICAgfVxuICAgIEluY2x1c2lvblRyZWUucHJvdG90eXBlID0ge1xuICAgICAgcmVzZXQ6IGZ1bmN0aW9uIEluY2x1c2lvblRyZWVfcmVzZXQoaSwgaiwgc3RvcFZhbHVlKSB7XG4gICAgICAgIHZhciBjdXJyZW50TGV2ZWwgPSAwO1xuICAgICAgICB3aGlsZSAoY3VycmVudExldmVsIDwgdGhpcy5sZXZlbHMubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoO1xuICAgICAgICAgIGxldmVsLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgdmFyIHZhbHVlID0gbGV2ZWwuaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAweGZmKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPiBzdG9wVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsO1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBrbm93IGFib3V0IHRoaXMgb25lLCBwcm9wYWdhdGluZyB0aGUgdmFsdWUgdG8gdG9wIGxldmVsc1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpID4+PSAxO1xuICAgICAgICAgIGogPj49IDE7XG4gICAgICAgICAgY3VycmVudExldmVsKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWwgLSAxO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBpbmNyZW1lbnRWYWx1ZTogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9pbmNyZW1lbnRWYWx1ZShzdG9wVmFsdWUpIHtcbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxdO1xuICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSBzdG9wVmFsdWUgKyAxO1xuICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlcygpO1xuICAgICAgfSxcbiAgICAgIHByb3BhZ2F0ZVZhbHVlczogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9wcm9wYWdhdGVWYWx1ZXMoKSB7XG4gICAgICAgIHZhciBsZXZlbEluZGV4ID0gdGhpcy5jdXJyZW50TGV2ZWw7XG4gICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2xldmVsSW5kZXhdO1xuICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdO1xuICAgICAgICB3aGlsZSAoLS1sZXZlbEluZGV4ID49IDApIHtcbiAgICAgICAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2xldmVsSW5kZXhdO1xuICAgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG5leHRMZXZlbDogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9uZXh0TGV2ZWwoKSB7XG4gICAgICAgIHZhciBjdXJyZW50TGV2ZWwgPSB0aGlzLmN1cnJlbnRMZXZlbDtcbiAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTtcbiAgICAgICAgdmFyIHZhbHVlID0gbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdO1xuICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSAweGZmO1xuICAgICAgICBjdXJyZW50TGV2ZWwtLTtcbiAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA8IDApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDtcbiAgICAgICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdO1xuICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIEluY2x1c2lvblRyZWU7XG4gIH0pKCk7XG5cbiAgLy8gU2VjdGlvbiBELiBDb2VmZmljaWVudCBiaXQgbW9kZWxpbmdcbiAgdmFyIEJpdE1vZGVsID0gKGZ1bmN0aW9uIEJpdE1vZGVsQ2xvc3VyZSgpIHtcbiAgICB2YXIgVU5JRk9STV9DT05URVhUID0gMTc7XG4gICAgdmFyIFJVTkxFTkdUSF9DT05URVhUID0gMTg7XG4gICAgLy8gVGFibGUgRC0xXG4gICAgLy8gVGhlIGluZGV4IGlzIGJpbmFyeSBwcmVzZW50YXRpb246IDBkZGR2dmhoLCBkZGQgLSBzdW0gb2YgRGkgKDAuLjQpLFxuICAgIC8vIHZ2IC0gc3VtIG9mIFZpICgwLi4yKSwgYW5kIGhoIC0gc3VtIG9mIEhpICgwLi4yKVxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHZhciBMTEFuZExIQ29udGV4dHNMYWJlbCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsIDUsIDgsIDAsIDMsIDcsIDgsIDAsIDQsIDcsIDgsIDAsIDAsIDAsIDAsIDAsIDEsIDYsIDgsIDAsIDMsIDcsIDgsIDAsIDQsXG4gICAgICA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LFxuICAgICAgOCwgMCwgMywgNywgOCwgMCwgNCwgNywgOCwgMCwgMCwgMCwgMCwgMCwgMiwgNiwgOCwgMCwgMywgNywgOCwgMCwgNCwgNywgOFxuICAgIF0pO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHZhciBITENvbnRleHRMYWJlbCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsIDMsIDQsIDAsIDUsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDEsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsXG4gICAgICA4LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAzLCA0LCAwLCA2LCA3LCA3LCAwLCA4LCA4LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAzLFxuICAgICAgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgNiwgNywgNywgMCwgOCwgOCwgOFxuICAgIF0pO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHZhciBISENvbnRleHRMYWJlbCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsIDEsIDIsIDAsIDEsIDIsIDIsIDAsIDIsIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDMsIDQsIDUsIDAsIDQsIDUsIDUsIDAsIDUsXG4gICAgICA1LCA1LCAwLCAwLCAwLCAwLCAwLCA2LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCA3LCA3LCA3LCAwLCAwLCAwLCAwLCAwLCA4LCA4LFxuICAgICAgOCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOFxuICAgIF0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZ1bmN0aW9uIEJpdE1vZGVsKHdpZHRoLCBoZWlnaHQsIHN1YmJhbmQsIHplcm9CaXRQbGFuZXMsIG1iKSB7XG4gICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgbGV0IGNvbnRleHRMYWJlbFRhYmxlO1xuICAgICAgaWYgKHN1YmJhbmQgPT09IFwiSEhcIikge1xuICAgICAgICBjb250ZXh0TGFiZWxUYWJsZSA9IEhIQ29udGV4dExhYmVsO1xuICAgICAgfSBlbHNlIGlmIChzdWJiYW5kID09PSBcIkhMXCIpIHtcbiAgICAgICAgY29udGV4dExhYmVsVGFibGUgPSBITENvbnRleHRMYWJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gTExBbmRMSENvbnRleHRzTGFiZWw7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRleHRMYWJlbFRhYmxlID0gY29udGV4dExhYmVsVGFibGU7XG5cbiAgICAgIHZhciBjb2VmZmljaWVudENvdW50ID0gd2lkdGggKiBoZWlnaHQ7XG5cbiAgICAgIC8vIGNvZWZmaWNpZW50cyBvdXRzaWRlIHRoZSBlbmNvZGluZyByZWdpb24gdHJlYXRlZCBhcyBpbnNpZ25pZmljYW50XG4gICAgICAvLyBhZGQgYm9yZGVyIHN0YXRlIGNlbGxzIGZvciBzaWduaWZpY2FuY2VTdGF0ZVxuICAgICAgdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2UgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTtcbiAgICAgIHRoaXMuY29lZmZpY2VudHNTaWduID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7XG4gICAgICBsZXQgY29lZmZpY2VudHNNYWduaXR1ZGU7XG4gICAgICBpZiAobWIgPiAxNCkge1xuICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50MzJBcnJheShjb2VmZmljaWVudENvdW50KTtcbiAgICAgIH0gZWxzZSBpZiAobWIgPiA2KSB7XG4gICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQxNkFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUgPSBjb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgIHRoaXMucHJvY2Vzc2luZ0ZsYWdzID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7XG5cbiAgICAgIHZhciBiaXRzRGVjb2RlZCA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpO1xuICAgICAgaWYgKHplcm9CaXRQbGFuZXMgIT09IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2VmZmljaWVudENvdW50OyBpKyspIHtcbiAgICAgICAgICBiaXRzRGVjb2RlZFtpXSA9IHplcm9CaXRQbGFuZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYml0c0RlY29kZWQgPSBiaXRzRGVjb2RlZDtcblxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIEJpdE1vZGVsLnByb3RvdHlwZSA9IHtcbiAgICAgIHNldERlY29kZXI6IGZ1bmN0aW9uIEJpdE1vZGVsX3NldERlY29kZXIoZGVjb2Rlcikge1xuICAgICAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyO1xuICAgICAgfSxcbiAgICAgIHJlc2V0OiBmdW5jdGlvbiBCaXRNb2RlbF9yZXNldCgpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSAxNyBjb250ZXh0cyB0aGF0IGFyZSBhY2Nlc3NlZCB2aWEgY29udGV4dCBsYWJlbHMsXG4gICAgICAgIC8vIHBsdXMgdGhlIHVuaWZvcm0gYW5kIHJ1bmxlbmd0aCBjb250ZXh0LlxuICAgICAgICB0aGlzLmNvbnRleHRzID0gbmV3IEludDhBcnJheSgxOSk7XG5cbiAgICAgICAgLy8gQ29udGV4dHMgYXJlIHBhY2tlZCBpbnRvIDEgYnl0ZTpcbiAgICAgICAgLy8gaGlnaGVzdCA3IGJpdHMgY2FycnkgdGhlIGluZGV4LCBsb3dlc3QgYml0IGNhcnJpZXMgbXBzXG4gICAgICAgIHRoaXMuY29udGV4dHNbMF0gPSAoNCA8PCAxKSB8IDA7XG4gICAgICAgIHRoaXMuY29udGV4dHNbVU5JRk9STV9DT05URVhUXSA9ICg0NiA8PCAxKSB8IDA7XG4gICAgICAgIHRoaXMuY29udGV4dHNbUlVOTEVOR1RIX0NPTlRFWFRdID0gKDMgPDwgMSkgfCAwO1xuICAgICAgfSxcbiAgICAgIHNldE5laWdoYm9yc1NpZ25pZmljYW5jZTogZnVuY3Rpb24gQml0TW9kZWxfc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKFxuICAgICAgICByb3csXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgaW5kZXhcbiAgICAgICkge1xuICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7XG4gICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgIHZhciBsZWZ0ID0gY29sdW1uID4gMDtcbiAgICAgICAgdmFyIHJpZ2h0ID0gY29sdW1uICsgMSA8IHdpZHRoO1xuICAgICAgICB2YXIgaTtcblxuICAgICAgICBpZiAocm93ID4gMCkge1xuICAgICAgICAgIGkgPSBpbmRleCAtIHdpZHRoO1xuICAgICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaSAtIDFdICs9IDB4MTA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgKyAxXSArPSAweDEwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaV0gKz0gMHgwNDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0KSB7XG4gICAgICAgICAgaSA9IGluZGV4ICsgd2lkdGg7XG4gICAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaSArIDFdICs9IDB4MTA7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpXSArPSAweDA0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXggLSAxXSArPSAweDAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleCArIDFdICs9IDB4MDE7XG4gICAgICAgIH1cbiAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XSB8PSAweDgwO1xuICAgICAgfSxcbiAgICAgIHJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzczogZnVuY3Rpb24gQml0TW9kZWxfcnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCkge1xuICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduO1xuICAgICAgICB2YXIgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7XG4gICAgICAgIHZhciBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFncztcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdmFyIGxhYmVscyA9IHRoaXMuY29udGV4dExhYmVsVGFibGU7XG4gICAgICAgIHZhciBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7XG4gICAgICAgIHZhciBwcm9jZXNzZWRJbnZlcnNlTWFzayA9IH4xO1xuICAgICAgICB2YXIgcHJvY2Vzc2VkTWFzayA9IDE7XG4gICAgICAgIHZhciBmaXJzdE1hZ25pdHVkZUJpdE1hc2sgPSAyO1xuXG4gICAgICAgIGZvciAodmFyIGkwID0gMDsgaTAgPCBoZWlnaHQ7IGkwICs9IDQpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGkwICogd2lkdGggKyBqO1xuICAgICAgICAgICAgZm9yICh2YXIgaTEgPSAwOyBpMSA8IDQ7IGkxKyssIGluZGV4ICs9IHdpZHRoKSB7XG4gICAgICAgICAgICAgIHZhciBpID0gaTAgKyBpMTtcbiAgICAgICAgICAgICAgaWYgKGkgPj0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gY2xlYXIgcHJvY2Vzc2VkIGZsYWcgZmlyc3RcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmPSBwcm9jZXNzZWRJbnZlcnNlTWFzaztcblxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8XG4gICAgICAgICAgICAgICAgIW5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dO1xuICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgICAgICAgIGlmIChkZWNpc2lvbikge1xuICAgICAgICAgICAgICAgIHZhciBzaWduID0gdGhpcy5kZWNvZGVTaWduQml0KGksIGosIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb2VmZmljZW50c1NpZ25baW5kZXhdID0gc2lnbjtcbiAgICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGksIGosIGluZGV4KTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IGZpcnN0TWFnbml0dWRlQml0TWFzaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKztcbiAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBwcm9jZXNzZWRNYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlY29kZVNpZ25CaXQ6IGZ1bmN0aW9uIEJpdE1vZGVsX2RlY29kZVNpZ25CaXQocm93LCBjb2x1bW4sIGluZGV4KSB7XG4gICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7XG4gICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjtcbiAgICAgICAgdmFyIGNvbnRyaWJ1dGlvbiwgc2lnbjAsIHNpZ24xLCBzaWduaWZpY2FuY2UxO1xuICAgICAgICB2YXIgY29udGV4dExhYmVsLCBkZWNvZGVkO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBob3Jpem9udGFsIGNvbnRyaWJ1dGlvblxuICAgICAgICBzaWduaWZpY2FuY2UxID0gY29sdW1uID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIDFdICE9PSAwO1xuICAgICAgICBpZiAoY29sdW1uICsgMSA8IHdpZHRoICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4ICsgMV0gIT09IDApIHtcbiAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIDFdO1xuICAgICAgICAgIGlmIChzaWduaWZpY2FuY2UxKSB7XG4gICAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIDFdO1xuICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaWduaWZpY2FuY2UxKSB7XG4gICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSAxXTtcbiAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjAgLSBzaWduMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cmlidXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBob3Jpem9udGFsQ29udHJpYnV0aW9uID0gMyAqIGNvbnRyaWJ1dGlvbjtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgdmVydGljYWwgY29udHJpYnV0aW9uIGFuZCBjb21iaW5lIHdpdGggdGhlIGhvcml6b250YWxcbiAgICAgICAgc2lnbmlmaWNhbmNlMSA9IHJvdyA+IDAgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggLSB3aWR0aF0gIT09IDA7XG4gICAgICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0ICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4ICsgd2lkdGhdICE9PSAwKSB7XG4gICAgICAgICAgc2lnbjEgPSBjb2VmZmljZW50c1NpZ25baW5kZXggKyB3aWR0aF07XG4gICAgICAgICAgaWYgKHNpZ25pZmljYW5jZTEpIHtcbiAgICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gd2lkdGhdO1xuICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjAgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMSArIGhvcml6b250YWxDb250cmlidXRpb247XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNpZ25pZmljYW5jZTEpIHtcbiAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIHdpZHRoXTtcbiAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjAgLSBzaWduMCArIGhvcml6b250YWxDb250cmlidXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJpYnV0aW9uID0gaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250cmlidXRpb24gPj0gMCkge1xuICAgICAgICAgIGNvbnRleHRMYWJlbCA9IDkgKyBjb250cmlidXRpb247XG4gICAgICAgICAgZGVjb2RlZCA9IHRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dExhYmVsID0gOSAtIGNvbnRyaWJ1dGlvbjtcbiAgICAgICAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cywgY29udGV4dExhYmVsKSBeIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICB9LFxuICAgICAgcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCkge1xuICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTtcbiAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlO1xuICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzO1xuICAgICAgICB2YXIgYml0c0RlY29kZWQgPSB0aGlzLmJpdHNEZWNvZGVkO1xuICAgICAgICB2YXIgcHJvY2Vzc2luZ0ZsYWdzID0gdGhpcy5wcm9jZXNzaW5nRmxhZ3M7XG4gICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTtcbiAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7XG4gICAgICAgIHZhciBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDtcbiAgICAgICAgdmFyIHdpZHRoNCA9IHdpZHRoICogNDtcblxuICAgICAgICBmb3IgKHZhciBpbmRleDAgPSAwLCBpbmRleE5leHQ7IGluZGV4MCA8IGxlbmd0aDsgaW5kZXgwID0gaW5kZXhOZXh0KSB7XG4gICAgICAgICAgaW5kZXhOZXh0ID0gTWF0aC5taW4obGVuZ3RoLCBpbmRleDAgKyB3aWR0aDQpO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSBpbmRleDAgKyBqOyBpbmRleCA8IGluZGV4TmV4dDsgaW5kZXggKz0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgLy8gc2lnbmlmaWNhbnQgYnV0IG5vdCB0aG9zZSB0aGF0IGhhdmUganVzdCBiZWNvbWVcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gfHxcbiAgICAgICAgICAgICAgICAocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIHByb2Nlc3NlZE1hc2spICE9PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIGNvbnRleHRMYWJlbCA9IDE2O1xuICAgICAgICAgICAgICBpZiAoKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBmaXJzdE1hZ25pdHVkZUJpdE1hc2spICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSBePSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7XG4gICAgICAgICAgICAgICAgLy8gZmlyc3QgcmVmaW5lbWVudFxuICAgICAgICAgICAgICAgIHZhciBzaWduaWZpY2FuY2UgPSBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdICYgMTI3O1xuICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCA9IHNpZ25pZmljYW5jZSA9PT0gMCA/IDE1IDogMTQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpO1xuICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPVxuICAgICAgICAgICAgICAgIChjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPDwgMSkgfCBiaXQ7XG4gICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrO1xuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IHByb2Nlc3NlZE1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcnVuQ2xlYW51cFBhc3M6IGZ1bmN0aW9uIEJpdE1vZGVsX3J1bkNsZWFudXBQYXNzKCkge1xuICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlO1xuICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlO1xuICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247XG4gICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7XG4gICAgICAgIHZhciBsYWJlbHMgPSB0aGlzLmNvbnRleHRMYWJlbFRhYmxlO1xuICAgICAgICB2YXIgYml0c0RlY29kZWQgPSB0aGlzLmJpdHNEZWNvZGVkO1xuICAgICAgICB2YXIgcHJvY2Vzc2luZ0ZsYWdzID0gdGhpcy5wcm9jZXNzaW5nRmxhZ3M7XG4gICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTtcbiAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7XG4gICAgICAgIHZhciBvbmVSb3dEb3duID0gd2lkdGg7XG4gICAgICAgIHZhciB0d29Sb3dzRG93biA9IHdpZHRoICogMjtcbiAgICAgICAgdmFyIHRocmVlUm93c0Rvd24gPSB3aWR0aCAqIDM7XG4gICAgICAgIHZhciBpTmV4dDtcbiAgICAgICAgZm9yICh2YXIgaTAgPSAwOyBpMCA8IGhlaWdodDsgaTAgPSBpTmV4dCkge1xuICAgICAgICAgIGlOZXh0ID0gTWF0aC5taW4oaTAgKyA0LCBoZWlnaHQpO1xuICAgICAgICAgIHZhciBpbmRleEJhc2UgPSBpMCAqIHdpZHRoO1xuICAgICAgICAgIHZhciBjaGVja0FsbEVtcHR5ID0gaTAgKyAzIDwgaGVpZ2h0O1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGluZGV4MCA9IGluZGV4QmFzZSArIGo7XG4gICAgICAgICAgICAvLyB1c2luZyB0aGUgcHJvcGVydHk6IGxhYmVsc1tuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdXSA9PT0gMFxuICAgICAgICAgICAgLy8gd2hlbiBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdID09PSAwXG4gICAgICAgICAgICB2YXIgYWxsRW1wdHkgPVxuICAgICAgICAgICAgICBjaGVja0FsbEVtcHR5ICYmXG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleDBdID09PSAwICYmXG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleDAgKyBvbmVSb3dEb3duXSA9PT0gMCAmJlxuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXgwICsgdHdvUm93c0Rvd25dID09PSAwICYmXG4gICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleDAgKyB0aHJlZVJvd3NEb3duXSA9PT0gMCAmJlxuICAgICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXgwXSA9PT0gMCAmJlxuICAgICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXgwICsgb25lUm93RG93bl0gPT09IDAgJiZcbiAgICAgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4MCArIHR3b1Jvd3NEb3duXSA9PT0gMCAmJlxuICAgICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXgwICsgdGhyZWVSb3dzRG93bl0gPT09IDA7XG4gICAgICAgICAgICB2YXIgaTEgPSAwLFxuICAgICAgICAgICAgICBpbmRleCA9IGluZGV4MDtcbiAgICAgICAgICAgIHZhciBpID0gaTAsXG4gICAgICAgICAgICAgIHNpZ247XG4gICAgICAgICAgICBpZiAoYWxsRW1wdHkpIHtcbiAgICAgICAgICAgICAgdmFyIGhhc1NpZ25pZmljYW50Q29lZmZpY2VudCA9IGRlY29kZXIucmVhZEJpdChcbiAgICAgICAgICAgICAgICBjb250ZXh0cyxcbiAgICAgICAgICAgICAgICBSVU5MRU5HVEhfQ09OVEVYVFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoIWhhc1NpZ25pZmljYW50Q29lZmZpY2VudCkge1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MF0rKztcbiAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleDAgKyBvbmVSb3dEb3duXSsrO1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHR3b1Jvd3NEb3duXSsrO1xuICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHRocmVlUm93c0Rvd25dKys7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5leHQgY29sdW1uXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaTEgPVxuICAgICAgICAgICAgICAgIChkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMSkgfFxuICAgICAgICAgICAgICAgIGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKTtcbiAgICAgICAgICAgICAgaWYgKGkxICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaSA9IGkwICsgaTE7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gaTEgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICBjb2VmZmljZW50c1NpZ25baW5kZXhdID0gc2lnbjtcbiAgICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTtcbiAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IGZpcnN0TWFnbml0dWRlQml0TWFzaztcblxuICAgICAgICAgICAgICBpbmRleCA9IGluZGV4MDtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaTIgPSBpMDsgaTIgPD0gaTsgaTIrKywgaW5kZXggKz0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGkxKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSBpMCArIGkxOyBpIDwgaU5leHQ7IGkrKywgaW5kZXggKz0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fFxuICAgICAgICAgICAgICAgIChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDBcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gbGFiZWxzW25laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleF1dO1xuICAgICAgICAgICAgICB2YXIgZGVjaXNpb24gPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7XG4gICAgICAgICAgICAgIGlmIChkZWNpc2lvbiA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduO1xuICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNoZWNrU2VnbWVudGF0aW9uU3ltYm9sOiBmdW5jdGlvbiBCaXRNb2RlbF9jaGVja1NlZ21lbnRhdGlvblN5bWJvbCgpIHtcbiAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7XG4gICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7XG4gICAgICAgIHZhciBzeW1ib2wgPVxuICAgICAgICAgIChkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMykgfFxuICAgICAgICAgIChkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMikgfFxuICAgICAgICAgIChkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMSkgfFxuICAgICAgICAgIGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKTtcbiAgICAgICAgaWYgKHN5bWJvbCAhPT0gMHhhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKFwiSW52YWxpZCBzZWdtZW50YXRpb24gc3ltYm9sXCIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gQml0TW9kZWw7XG4gIH0pKCk7XG5cbiAgLy8gU2VjdGlvbiBGLCBEaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybWF0aW9uXG4gIHZhciBUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gVHJhbnNmb3JtQ2xvc3VyZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgZnVuY3Rpb24gVHJhbnNmb3JtKCkge31cblxuICAgIFRyYW5zZm9ybS5wcm90b3R5cGUuY2FsY3VsYXRlID0gZnVuY3Rpb24gdHJhbnNmb3JtQ2FsY3VsYXRlKFxuICAgICAgc3ViYmFuZHMsXG4gICAgICB1MCxcbiAgICAgIHYwXG4gICAgKSB7XG4gICAgICB2YXIgbGwgPSBzdWJiYW5kc1swXTtcbiAgICAgIGZvciAodmFyIGkgPSAxLCBpaSA9IHN1YmJhbmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgbGwgPSB0aGlzLml0ZXJhdGUobGwsIHN1YmJhbmRzW2ldLCB1MCwgdjApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxsO1xuICAgIH07XG4gICAgVHJhbnNmb3JtLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbiBleHRlbmQoYnVmZmVyLCBvZmZzZXQsIHNpemUpIHtcbiAgICAgIC8vIFNlY3Rpb24gRi4zLjcgZXh0ZW5kaW5nLi4uIHVzaW5nIG1heCBleHRlbnNpb24gb2YgNFxuICAgICAgdmFyIGkxID0gb2Zmc2V0IC0gMSxcbiAgICAgICAgajEgPSBvZmZzZXQgKyAxO1xuICAgICAgdmFyIGkyID0gb2Zmc2V0ICsgc2l6ZSAtIDIsXG4gICAgICAgIGoyID0gb2Zmc2V0ICsgc2l6ZTtcbiAgICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTtcbiAgICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTtcbiAgICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTtcbiAgICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTtcbiAgICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTtcbiAgICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTtcbiAgICAgIGJ1ZmZlcltpMV0gPSBidWZmZXJbajFdO1xuICAgICAgYnVmZmVyW2oyXSA9IGJ1ZmZlcltpMl07XG4gICAgfTtcbiAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLml0ZXJhdGUgPSBmdW5jdGlvbiBUcmFuc2Zvcm1faXRlcmF0ZShcbiAgICAgIGxsLFxuICAgICAgaGxfbGhfaGgsXG4gICAgICB1MCxcbiAgICAgIHYwXG4gICAgKSB7XG4gICAgICB2YXIgbGxXaWR0aCA9IGxsLndpZHRoLFxuICAgICAgICBsbEhlaWdodCA9IGxsLmhlaWdodCxcbiAgICAgICAgbGxJdGVtcyA9IGxsLml0ZW1zO1xuICAgICAgdmFyIHdpZHRoID0gaGxfbGhfaGgud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gaGxfbGhfaGguaGVpZ2h0O1xuICAgICAgdmFyIGl0ZW1zID0gaGxfbGhfaGguaXRlbXM7XG4gICAgICB2YXIgaSwgaiwgaywgbCwgdSwgdjtcblxuICAgICAgLy8gSW50ZXJsZWF2ZSBMTCBhY2NvcmRpbmcgdG8gU2VjdGlvbiBGLjMuM1xuICAgICAgZm9yIChrID0gMCwgaSA9IDA7IGkgPCBsbEhlaWdodDsgaSsrKSB7XG4gICAgICAgIGwgPSBpICogMiAqIHdpZHRoO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGxXaWR0aDsgaisrLCBrKyssIGwgKz0gMikge1xuICAgICAgICAgIGl0ZW1zW2xdID0gbGxJdGVtc1trXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIExMIGJhbmQgaXMgbm90IG5lZWRlZCBhbnltb3JlLlxuICAgICAgbGxJdGVtcyA9IGxsLml0ZW1zID0gbnVsbDtcblxuICAgICAgdmFyIGJ1ZmZlclBhZGRpbmcgPSA0O1xuICAgICAgdmFyIHJvd0J1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKyAyICogYnVmZmVyUGFkZGluZyk7XG5cbiAgICAgIC8vIFNlY3Rpb24gRi4zLjQgSE9SX1NSXG4gICAgICBpZiAod2lkdGggPT09IDEpIHtcbiAgICAgICAgLy8gaWYgd2lkdGggPSAxLCB3aGVuIHUwIGV2ZW4ga2VlcCBpdGVtcyBhcyBpcywgd2hlbiBvZGQgZGl2aWRlIGJ5IDJcbiAgICAgICAgaWYgKCh1MCAmIDEpICE9PSAwKSB7XG4gICAgICAgICAgZm9yICh2ID0gMCwgayA9IDA7IHYgPCBoZWlnaHQ7IHYrKywgayArPSB3aWR0aCkge1xuICAgICAgICAgICAgaXRlbXNba10gKj0gMC41O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2ID0gMCwgayA9IDA7IHYgPCBoZWlnaHQ7IHYrKywgayArPSB3aWR0aCkge1xuICAgICAgICAgIHJvd0J1ZmZlci5zZXQoaXRlbXMuc3ViYXJyYXkoaywgayArIHdpZHRoKSwgYnVmZmVyUGFkZGluZyk7XG5cbiAgICAgICAgICB0aGlzLmV4dGVuZChyb3dCdWZmZXIsIGJ1ZmZlclBhZGRpbmcsIHdpZHRoKTtcbiAgICAgICAgICB0aGlzLmZpbHRlcihyb3dCdWZmZXIsIGJ1ZmZlclBhZGRpbmcsIHdpZHRoKTtcblxuICAgICAgICAgIGl0ZW1zLnNldChcbiAgICAgICAgICAgIHJvd0J1ZmZlci5zdWJhcnJheShidWZmZXJQYWRkaW5nLCBidWZmZXJQYWRkaW5nICsgd2lkdGgpLFxuICAgICAgICAgICAga1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWNjZXNzZXMgdG8gdGhlIGl0ZW1zIGFycmF5IGNhbiB0YWtlIGxvbmcsIGJlY2F1c2UgaXQgbWF5IG5vdCBmaXQgaW50b1xuICAgICAgLy8gQ1BVIGNhY2hlIGFuZCBoYXMgdG8gYmUgZmV0Y2hlZCBmcm9tIG1haW4gbWVtb3J5LiBTaW5jZSBzdWJzZXF1ZW50XG4gICAgICAvLyBhY2Nlc3NlcyB0byB0aGUgaXRlbXMgYXJyYXkgYXJlIG5vdCBsb2NhbCB3aGVuIHJlYWRpbmcgY29sdW1ucywgd2VcbiAgICAgIC8vIGhhdmUgYSBjYWNoZSBtaXNzIGV2ZXJ5IHRpbWUuIFRvIHJlZHVjZSBjYWNoZSBtaXNzZXMsIGdldCB1cCB0b1xuICAgICAgLy8gJ251bUJ1ZmZlcnMnIGl0ZW1zIGF0IGEgdGltZSBhbmQgc3RvcmUgdGhlbSBpbnRvIHRoZSBpbmRpdmlkdWFsXG4gICAgICAvLyBidWZmZXJzLiBUaGUgY29sQnVmZmVycyBzaG91bGQgYmUgc21hbGwgZW5vdWdoIHRvIGZpdCBpbnRvIENQVSBjYWNoZS5cbiAgICAgIHZhciBudW1CdWZmZXJzID0gMTY7XG4gICAgICB2YXIgY29sQnVmZmVycyA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykge1xuICAgICAgICBjb2xCdWZmZXJzLnB1c2gobmV3IEZsb2F0MzJBcnJheShoZWlnaHQgKyAyICogYnVmZmVyUGFkZGluZykpO1xuICAgICAgfVxuICAgICAgdmFyIGIsXG4gICAgICAgIGN1cnJlbnRCdWZmZXIgPSAwO1xuICAgICAgbGwgPSBidWZmZXJQYWRkaW5nICsgaGVpZ2h0O1xuXG4gICAgICAvLyBTZWN0aW9uIEYuMy41IFZFUl9TUlxuICAgICAgaWYgKGhlaWdodCA9PT0gMSkge1xuICAgICAgICAvLyBpZiBoZWlnaHQgPSAxLCB3aGVuIHYwIGV2ZW4ga2VlcCBpdGVtcyBhcyBpcywgd2hlbiBvZGQgZGl2aWRlIGJ5IDJcbiAgICAgICAgaWYgKCh2MCAmIDEpICE9PSAwKSB7XG4gICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHtcbiAgICAgICAgICAgIGl0ZW1zW3VdICo9IDAuNTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodSA9IDA7IHUgPCB3aWR0aDsgdSsrKSB7XG4gICAgICAgICAgLy8gaWYgd2UgcmFuIG91dCBvZiBidWZmZXJzLCBjb3B5IHNldmVyYWwgaW1hZ2UgY29sdW1ucyBhdCBvbmNlXG4gICAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXIgPT09IDApIHtcbiAgICAgICAgICAgIG51bUJ1ZmZlcnMgPSBNYXRoLm1pbih3aWR0aCAtIHUsIG51bUJ1ZmZlcnMpO1xuICAgICAgICAgICAgZm9yIChrID0gdSwgbCA9IGJ1ZmZlclBhZGRpbmc7IGwgPCBsbDsgayArPSB3aWR0aCwgbCsrKSB7XG4gICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBudW1CdWZmZXJzOyBiKyspIHtcbiAgICAgICAgICAgICAgICBjb2xCdWZmZXJzW2JdW2xdID0gaXRlbXNbayArIGJdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50QnVmZmVyID0gbnVtQnVmZmVycztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjdXJyZW50QnVmZmVyLS07XG4gICAgICAgICAgdmFyIGJ1ZmZlciA9IGNvbEJ1ZmZlcnNbY3VycmVudEJ1ZmZlcl07XG4gICAgICAgICAgdGhpcy5leHRlbmQoYnVmZmVyLCBidWZmZXJQYWRkaW5nLCBoZWlnaHQpO1xuICAgICAgICAgIHRoaXMuZmlsdGVyKGJ1ZmZlciwgYnVmZmVyUGFkZGluZywgaGVpZ2h0KTtcblxuICAgICAgICAgIC8vIElmIHRoaXMgaXMgbGFzdCBidWZmZXIgaW4gdGhpcyBncm91cCBvZiBidWZmZXJzLCBmbHVzaCBhbGwgYnVmZmVycy5cbiAgICAgICAgICBpZiAoY3VycmVudEJ1ZmZlciA9PT0gMCkge1xuICAgICAgICAgICAgayA9IHUgLSBudW1CdWZmZXJzICsgMTtcbiAgICAgICAgICAgIGZvciAobCA9IGJ1ZmZlclBhZGRpbmc7IGwgPCBsbDsgayArPSB3aWR0aCwgbCsrKSB7XG4gICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBudW1CdWZmZXJzOyBiKyspIHtcbiAgICAgICAgICAgICAgICBpdGVtc1trICsgYl0gPSBjb2xCdWZmZXJzW2JdW2xdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGl0ZW1zLFxuICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBUcmFuc2Zvcm07XG4gIH0pKCk7XG5cbiAgLy8gU2VjdGlvbiAzLjguMiBJcnJldmVyc2libGUgOS03IGZpbHRlclxuICB2YXIgSXJyZXZlcnNpYmxlVHJhbnNmb3JtID0gKGZ1bmN0aW9uIElycmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZ1bmN0aW9uIElycmV2ZXJzaWJsZVRyYW5zZm9ybSgpIHtcbiAgICAgIFRyYW5zZm9ybS5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIElycmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybS5wcm90b3R5cGUpO1xuICAgIElycmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gaXJyZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKFxuICAgICAgeCxcbiAgICAgIG9mZnNldCxcbiAgICAgIGxlbmd0aFxuICAgICkge1xuICAgICAgdmFyIGxlbiA9IGxlbmd0aCA+PiAxO1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgICAgIHZhciBqLCBuLCBjdXJyZW50LCBuZXh0O1xuXG4gICAgICB2YXIgYWxwaGEgPSAtMS41ODYxMzQzNDIwNTk5MjQ7XG4gICAgICB2YXIgYmV0YSA9IC0wLjA1Mjk4MDExODU3Mjk2MTtcbiAgICAgIHZhciBnYW1tYSA9IDAuODgyOTExMDc1NTMwOTM0O1xuICAgICAgdmFyIGRlbHRhID0gMC40NDM1MDY4NTIwNDM5NzE7XG4gICAgICB2YXIgSyA9IDEuMjMwMTc0MTA0OTE0MDAxO1xuICAgICAgdmFyIEtfID0gMSAvIEs7XG5cbiAgICAgIC8vIHN0ZXAgMSBpcyBjb21iaW5lZCB3aXRoIHN0ZXAgM1xuXG4gICAgICAvLyBzdGVwIDJcbiAgICAgIGogPSBvZmZzZXQgLSAzO1xuICAgICAgZm9yIChuID0gbGVuICsgNDsgbi0tOyBqICs9IDIpIHtcbiAgICAgICAgeFtqXSAqPSBLXztcbiAgICAgIH1cblxuICAgICAgLy8gc3RlcCAxICYgM1xuICAgICAgaiA9IG9mZnNldCAtIDI7XG4gICAgICBjdXJyZW50ID0gZGVsdGEgKiB4W2ogLSAxXTtcbiAgICAgIGZvciAobiA9IGxlbiArIDM7IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIG5leHQgPSBkZWx0YSAqIHhbaiArIDFdO1xuICAgICAgICB4W2pdID0gSyAqIHhbal0gLSBjdXJyZW50IC0gbmV4dDtcbiAgICAgICAgaWYgKG4tLSkge1xuICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICBjdXJyZW50ID0gZGVsdGEgKiB4W2ogKyAxXTtcbiAgICAgICAgICB4W2pdID0gSyAqIHhbal0gLSBjdXJyZW50IC0gbmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzdGVwIDRcbiAgICAgIGogPSBvZmZzZXQgLSAxO1xuICAgICAgY3VycmVudCA9IGdhbW1hICogeFtqIC0gMV07XG4gICAgICBmb3IgKG4gPSBsZW4gKyAyOyBuLS07IGogKz0gMikge1xuICAgICAgICBuZXh0ID0gZ2FtbWEgKiB4W2ogKyAxXTtcbiAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDtcbiAgICAgICAgaWYgKG4tLSkge1xuICAgICAgICAgIGogKz0gMjtcbiAgICAgICAgICBjdXJyZW50ID0gZ2FtbWEgKiB4W2ogKyAxXTtcbiAgICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0ZXAgNVxuICAgICAgaiA9IG9mZnNldDtcbiAgICAgIGN1cnJlbnQgPSBiZXRhICogeFtqIC0gMV07XG4gICAgICBmb3IgKG4gPSBsZW4gKyAxOyBuLS07IGogKz0gMikge1xuICAgICAgICBuZXh0ID0gYmV0YSAqIHhbaiArIDFdO1xuICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0O1xuICAgICAgICBpZiAobi0tKSB7XG4gICAgICAgICAgaiArPSAyO1xuICAgICAgICAgIGN1cnJlbnQgPSBiZXRhICogeFtqICsgMV07XG4gICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzdGVwIDZcbiAgICAgIGlmIChsZW4gIT09IDApIHtcbiAgICAgICAgaiA9IG9mZnNldCArIDE7XG4gICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiAtIDFdO1xuICAgICAgICBmb3IgKG4gPSBsZW47IG4tLTsgaiArPSAyKSB7XG4gICAgICAgICAgbmV4dCA9IGFscGhhICogeFtqICsgMV07XG4gICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDtcbiAgICAgICAgICBpZiAobi0tKSB7XG4gICAgICAgICAgICBqICs9IDI7XG4gICAgICAgICAgICBjdXJyZW50ID0gYWxwaGEgKiB4W2ogKyAxXTtcbiAgICAgICAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gSXJyZXZlcnNpYmxlVHJhbnNmb3JtO1xuICB9KSgpO1xuXG4gIC8vIFNlY3Rpb24gMy44LjEgUmV2ZXJzaWJsZSA1LTMgZmlsdGVyXG4gIHZhciBSZXZlcnNpYmxlVHJhbnNmb3JtID0gKGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm1DbG9zdXJlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBmdW5jdGlvbiBSZXZlcnNpYmxlVHJhbnNmb3JtKCkge1xuICAgICAgVHJhbnNmb3JtLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgUmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybS5wcm90b3R5cGUpO1xuICAgIFJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIHJldmVyc2libGVUcmFuc2Zvcm1GaWx0ZXIoXG4gICAgICB4LFxuICAgICAgb2Zmc2V0LFxuICAgICAgbGVuZ3RoXG4gICAgKSB7XG4gICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgICAgdmFyIGosIG47XG5cbiAgICAgIGZvciAoaiA9IG9mZnNldCwgbiA9IGxlbiArIDE7IG4tLTsgaiArPSAyKSB7XG4gICAgICAgIHhbal0gLT0gKHhbaiAtIDFdICsgeFtqICsgMV0gKyAyKSA+PiAyO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGogPSBvZmZzZXQgKyAxLCBuID0gbGVuOyBuLS07IGogKz0gMikge1xuICAgICAgICB4W2pdICs9ICh4W2ogLSAxXSArIHhbaiArIDFdKSA+PiAxO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gUmV2ZXJzaWJsZVRyYW5zZm9ybTtcbiAgfSkoKTtcblxuICByZXR1cm4gSnB4SW1hZ2U7XG59KSgpO1xuXG5leHBvcnQgeyBKcHhJbWFnZSB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycy5taW4uanMgYi9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NTQxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbWFnZV9kZWNvZGVycy9wZGYuaW1hZ2VfZGVjb2RlcnMubWluLmpzCkBAIC0wLDAgKzEsMjIgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyFmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKCJwZGZqcy1kaXN0L2ltYWdlX2RlY29kZXJzL3BkZi5pbWFnZV9kZWNvZGVycyIsW10sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHNbInBkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzIl09dCgpOmVbInBkZmpzLWRpc3QvaW1hZ2VfZGVjb2RlcnMvcGRmLmltYWdlX2RlY29kZXJzIl09ZS5wZGZqc0ltYWdlRGVjb2RlcnM9dCgpfSh0aGlzLChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD17fTtmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKHIpe2lmKHRbcl0pcmV0dXJuIHRbcl0uZXhwb3J0czt2YXIgbj10W3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtlW3JdLmNhbGwobi5leHBvcnRzLG4sbi5leHBvcnRzLF9fd19wZGZqc19yZXF1aXJlX18pO24ubD0hMDtyZXR1cm4gbi5leHBvcnRzfV9fd19wZGZqc19yZXF1aXJlX18ubT1lO19fd19wZGZqc19yZXF1aXJlX18uYz10O19fd19wZGZqc19yZXF1aXJlX18uZD1mdW5jdGlvbihlLHQscil7X193X3BkZmpzX3JlcXVpcmVfXy5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX07X193X3BkZmpzX3JlcXVpcmVfXy5yPWZ1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9O19fd19wZGZqc19yZXF1aXJlX18udD1mdW5jdGlvbihlLHQpezEmdCYmKGU9X193X3BkZmpzX3JlcXVpcmVfXyhlKSk7aWYoOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtfX3dfcGRmanNfcmVxdWlyZV9fLnIocik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KTtpZigyJnQmJiJzdHJpbmciIT10eXBlb2YgZSlmb3IodmFyIG4gaW4gZSlfX3dfcGRmanNfcmVxdWlyZV9fLmQocixuLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbikpO3JldHVybiByfTtfX3dfcGRmanNfcmVxdWlyZV9fLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uIGdldERlZmF1bHQoKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCl7cmV0dXJuIGV9O19fd19wZGZqc19yZXF1aXJlX18uZCh0LCJhIix0KTtyZXR1cm4gdH07X193X3BkZmpzX3JlcXVpcmVfXy5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfTtfX3dfcGRmanNfcmVxdWlyZV9fLnA9IiI7cmV0dXJuIF9fd19wZGZqc19yZXF1aXJlX18oX193X3BkZmpzX3JlcXVpcmVfXy5zPTApfShbZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImdldFZlcmJvc2l0eUxldmVsIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXRWZXJib3NpdHlMZXZlbH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwic2V0VmVyYm9zaXR5TGV2ZWwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuLnNldFZlcmJvc2l0eUxldmVsfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJKYmlnMm1hZ2UiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLkpiaWcybWFnZX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiSnBlZ0ltYWdlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5KcGVnSW1hZ2V9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIkpweEltYWdlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5KcHhJbWFnZX19KTt2YXIgbj1yKDEpLGk9cig0KSxvPXIoOCkscz1yKDkpfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmFycmF5Qnl0ZUxlbmd0aD1hcnJheUJ5dGVMZW5ndGg7dC5hcnJheXNUb0J5dGVzPWZ1bmN0aW9uIGFycmF5c1RvQnl0ZXMoZSl7Y29uc3QgdD1lLmxlbmd0aDtpZigxPT09dCYmZVswXWluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gZVswXTtsZXQgcj0wO2ZvcihsZXQgbj0wO248dDtuKyspcis9YXJyYXlCeXRlTGVuZ3RoKGVbbl0pO2xldCBuPTA7Y29uc3QgaT1uZXcgVWludDhBcnJheShyKTtmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD1lW3JdO3QgaW5zdGFuY2VvZiBVaW50OEFycmF5fHwodD0ic3RyaW5nIj09dHlwZW9mIHQ/c3RyaW5nVG9CeXRlcyh0KTpuZXcgVWludDhBcnJheSh0KSk7Y29uc3Qgbz10LmJ5dGVMZW5ndGg7aS5zZXQodCxuKTtuKz1vfXJldHVybiBpfTt0LmFzc2VydD1hc3NlcnQ7dC5ieXRlc1RvU3RyaW5nPWZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoZSl7YXNzZXJ0KG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJnZvaWQgMCE9PWUubGVuZ3RoLCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7Y29uc3QgdD1lLmxlbmd0aDtpZih0PDgxOTIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxlKTtjb25zdCByPVtdO2ZvcihsZXQgbj0wO248dDtuKz04MTkyKXtjb25zdCBpPU1hdGgubWluKG4rODE5Mix0KSxvPWUuc3ViYXJyYXkobixpKTtyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG8pKX1yZXR1cm4gci5qb2luKCIiKX07dC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpe2NvbnN0IGU9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgdD0hMTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwic2V0dGxlZCIse2dldDooKT0+dH0pO2UucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixuKXtlLnJlc29sdmU9ZnVuY3Rpb24oZSl7dD0hMDtyKGUpfTtlLnJlamVjdD1mdW5jdGlvbihlKXt0PSEwO24oZSl9fSkpO3JldHVybiBlfTt0LmVzY2FwZVN0cmluZz1mdW5jdGlvbiBlc2NhcGVTdHJpbmcoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFtcKFwpXFxdKS9nLCJcXCQxIil9O3QuZ2V0TW9kaWZpY2F0aW9uRGF0ZT1mdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGU9bmV3IERhdGUoRGF0ZS5ub3coKSkpe3JldHVybltlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwoZS5nZXRVVENNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLChlLmdldFVUQ0RhdGUoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIildLmpvaW4oIiIpfTt0LmdldFZlcmJvc2l0eUxldmVsPWZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCl7cmV0dXJuIGl9O3QuaW5mbz1mdW5jdGlvbiBpbmZvKGUpe2k+PW4uSU5GT1MmJmNvbnNvbGUubG9nKCJJbmZvOiAiK2UpfTt0LmlzQXJyYXlCdWZmZXI9ZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lJiZ2b2lkIDAhPT1lLmJ5dGVMZW5ndGh9O3QuaXNBcnJheUVxdWFsPWZ1bmN0aW9uIGlzQXJyYXlFcXVhbChlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7cmV0dXJuIGUuZXZlcnkoKGZ1bmN0aW9uKGUscil7cmV0dXJuIGU9PT10W3JdfSkpfTt0LmlzQm9vbD1mdW5jdGlvbiBpc0Jvb2woZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZX07dC5pc051bT1mdW5jdGlvbiBpc051bShlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9O3QuaXNTdHJpbmc9ZnVuY3Rpb24gaXNTdHJpbmcoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfTt0LmlzU2FtZU9yaWdpbj1mdW5jdGlvbiBpc1NhbWVPcmlnaW4oZSx0KXtsZXQgcjt0cnl7cj1uZXcgVVJMKGUpO2lmKCFyLm9yaWdpbnx8Im51bGwiPT09ci5vcmlnaW4pcmV0dXJuITF9Y2F0Y2goZSl7cmV0dXJuITF9Y29uc3Qgbj1uZXcgVVJMKHQscik7cmV0dXJuIHIub3JpZ2luPT09bi5vcmlnaW59O3QuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybD1mdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKGUsdCl7aWYoIWUpcmV0dXJuIG51bGw7dHJ5e2NvbnN0IHI9dD9uZXcgVVJMKGUsdCk6bmV3IFVSTChlKTtpZihmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKGUpe2lmKCFlKXJldHVybiExO3N3aXRjaChlLnByb3RvY29sKXtjYXNlImh0dHA6IjpjYXNlImh0dHBzOiI6Y2FzZSJmdHA6IjpjYXNlIm1haWx0bzoiOmNhc2UidGVsOiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19KHIpKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gbnVsbH07dC5yZW1vdmVOdWxsQ2hhcmFjdGVycz1mdW5jdGlvbiByZW1vdmVOdWxsQ2hhcmFjdGVycyhlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpe3dhcm4oIlRoZSBhcmd1bWVudCBmb3IgcmVtb3ZlTnVsbENoYXJhY3RlcnMgbXVzdCBiZSBhIHN0cmluZy4iKTtyZXR1cm4gZX1yZXR1cm4gZS5yZXBsYWNlKHMsIiIpfTt0LnNldFZlcmJvc2l0eUxldmVsPWZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGUpe051bWJlci5pc0ludGVnZXIoZSkmJihpPWUpfTt0LnNoYWRvdz1zaGFkb3c7dC5zdHJpbmczMj1mdW5jdGlvbiBzdHJpbmczMihlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LDI1NSZlKX07dC5zdHJpbmdUb0J5dGVzPXN0cmluZ1RvQnl0ZXM7dC5zdHJpbmdUb1BERlN0cmluZz1mdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhlKXtjb25zdCB0PWUubGVuZ3RoLHI9W107aWYoIsO+Ij09PWVbMF0mJiLDvyI9PT1lWzFdKWZvcihsZXQgbj0yO248dDtuKz0yKXIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGVBdChuKTw8OHxlLmNoYXJDb2RlQXQobisxKSkpO2Vsc2UgaWYoIsO/Ij09PWVbMF0mJiLDviI9PT1lWzFdKWZvcihsZXQgbj0yO248dDtuKz0yKXIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGVBdChuKzEpPDw4fGUuY2hhckNvZGVBdChuKSkpO2Vsc2UgZm9yKGxldCBuPTA7bjx0Oysrbil7Y29uc3QgdD1kW2UuY2hhckNvZGVBdChuKV07ci5wdXNoKHQ/U3RyaW5nLmZyb21DaGFyQ29kZSh0KTplLmNoYXJBdChuKSl9cmV0dXJuIHIuam9pbigiIil9O3Quc3RyaW5nVG9VVEY4U3RyaW5nPWZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhlKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShlKSl9O3QudXRmOFN0cmluZ1RvU3RyaW5nPWZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhlKXtyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKX07dC53YXJuPXdhcm47dC51bnJlYWNoYWJsZT11bnJlYWNoYWJsZTt0LklzRXZhbFN1cHBvcnRlZENhY2hlZD10LklzTGl0dGxlRW5kaWFuQ2FjaGVkPXQuY3JlYXRlT2JqZWN0VVJMPXQuRm9ybWF0RXJyb3I9dC5VdGlsPXQuVW5rbm93bkVycm9yRXhjZXB0aW9uPXQuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uPXQuVGV4dFJlbmRlcmluZ01vZGU9dC5TdHJlYW1UeXBlPXQuUGVybWlzc2lvbkZsYWc9dC5QYXNzd29yZFJlc3BvbnNlcz10LlBhc3N3b3JkRXhjZXB0aW9uPXQuTWlzc2luZ1BERkV4Y2VwdGlvbj10LkludmFsaWRQREZFeGNlcHRpb249dC5BYm9ydEV4Y2VwdGlvbj10LkNNYXBDb21wcmVzc2lvblR5cGU9dC5JbWFnZUtpbmQ9dC5Gb250VHlwZT10LkFubm90YXRpb25UeXBlPXQuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlPXQuQW5ub3RhdGlvblJldmlld1N0YXRlPXQuQW5ub3RhdGlvblJlcGx5VHlwZT10LkFubm90YXRpb25NYXJrZWRTdGF0ZT10LkFubm90YXRpb25GbGFnPXQuQW5ub3RhdGlvbkZpZWxkRmxhZz10LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9dC5VTlNVUFBPUlRFRF9GRUFUVVJFUz10LlZlcmJvc2l0eUxldmVsPXQuT1BTPXQuSURFTlRJVFlfTUFUUklYPXQuRk9OVF9JREVOVElUWV9NQVRSSVg9dC5CYXNlRXhjZXB0aW9uPXZvaWQgMDtyKDIpO3QuSURFTlRJVFlfTUFUUklYPVsxLDAsMCwxLDAsMF07dC5GT05UX0lERU5USVRZX01BVFJJWD1bLjAwMSwwLDAsLjAwMSwwLDBdO3QuUGVybWlzc2lvbkZsYWc9e1BSSU5UOjQsTU9ESUZZX0NPTlRFTlRTOjgsQ09QWToxNixNT0RJRllfQU5OT1RBVElPTlM6MzIsRklMTF9JTlRFUkFDVElWRV9GT1JNUzoyNTYsQ09QWV9GT1JfQUNDRVNTSUJJTElUWTo1MTIsQVNTRU1CTEU6MTAyNCxQUklOVF9ISUdIX1FVQUxJVFk6MjA0OH07dC5UZXh0UmVuZGVyaW5nTW9kZT17RklMTDowLFNUUk9LRToxLEZJTExfU1RST0tFOjIsSU5WSVNJQkxFOjMsRklMTF9BRERfVE9fUEFUSDo0LFNUUk9LRV9BRERfVE9fUEFUSDo1LEZJTExfU1RST0tFX0FERF9UT19QQVRIOjYsQUREX1RPX1BBVEg6NyxGSUxMX1NUUk9LRV9NQVNLOjMsQUREX1RPX1BBVEhfRkxBRzo0fTt0LkltYWdlS2luZD17R1JBWVNDQUxFXzFCUFA6MSxSR0JfMjRCUFA6MixSR0JBXzMyQlBQOjN9O3QuQW5ub3RhdGlvblR5cGU9e1RFWFQ6MSxMSU5LOjIsRlJFRVRFWFQ6MyxMSU5FOjQsU1FVQVJFOjUsQ0lSQ0xFOjYsUE9MWUdPTjo3LFBPTFlMSU5FOjgsSElHSExJR0hUOjksVU5ERVJMSU5FOjEwLFNRVUlHR0xZOjExLFNUUklLRU9VVDoxMixTVEFNUDoxMyxDQVJFVDoxNCxJTks6MTUsUE9QVVA6MTYsRklMRUFUVEFDSE1FTlQ6MTcsU09VTkQ6MTgsTU9WSUU6MTksV0lER0VUOjIwLFNDUkVFTjoyMSxQUklOVEVSTUFSSzoyMixUUkFQTkVUOjIzLFdBVEVSTUFSSzoyNCxUSFJFRUQ6MjUsUkVEQUNUOjI2fTt0LkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZT17TUFSS0VEOiJNYXJrZWQiLFJFVklFVzoiUmV2aWV3In07dC5Bbm5vdGF0aW9uTWFya2VkU3RhdGU9e01BUktFRDoiTWFya2VkIixVTk1BUktFRDoiVW5tYXJrZWQifTt0LkFubm90YXRpb25SZXZpZXdTdGF0ZT17QUNDRVBURUQ6IkFjY2VwdGVkIixSRUpFQ1RFRDoiUmVqZWN0ZWQiLENBTkNFTExFRDoiQ2FuY2VsbGVkIixDT01QTEVURUQ6IkNvbXBsZXRlZCIsTk9ORToiTm9uZSJ9O3QuQW5ub3RhdGlvblJlcGx5VHlwZT17R1JPVVA6Ikdyb3VwIixSRVBMWToiUiJ9O3QuQW5ub3RhdGlvbkZsYWc9e0lOVklTSUJMRToxLEhJRERFTjoyLFBSSU5UOjQsTk9aT09NOjgsTk9ST1RBVEU6MTYsTk9WSUVXOjMyLFJFQURPTkxZOjY0LExPQ0tFRDoxMjgsVE9HR0xFTk9WSUVXOjI1NixMT0NLRURDT05URU5UUzo1MTJ9O3QuQW5ub3RhdGlvbkZpZWxkRmxhZz17UkVBRE9OTFk6MSxSRVFVSVJFRDoyLE5PRVhQT1JUOjQsTVVMVElMSU5FOjQwOTYsUEFTU1dPUkQ6ODE5MixOT1RPR0dMRVRPT0ZGOjE2Mzg0LFJBRElPOjMyNzY4LFBVU0hCVVRUT046NjU1MzYsQ09NQk86MTMxMDcyLEVESVQ6MjYyMTQ0LFNPUlQ6NTI0Mjg4LEZJTEVTRUxFQ1Q6MTA0ODU3NixNVUxUSVNFTEVDVDoyMDk3MTUyLERPTk9UU1BFTExDSEVDSzo0MTk0MzA0LERPTk9UU0NST0xMOjgzODg2MDgsQ09NQjoxNjc3NzIxNixSSUNIVEVYVDozMzU1NDQzMixSQURJT1NJTlVOSVNPTjozMzU1NDQzMixDT01NSVRPTlNFTENIQU5HRTo2NzEwODg2NH07dC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlPXtTT0xJRDoxLERBU0hFRDoyLEJFVkVMRUQ6MyxJTlNFVDo0LFVOREVSTElORTo1fTt0LlN0cmVhbVR5cGU9e1VOS05PV046IlVOS05PV04iLEZMQVRFOiJGTEFURSIsTFpXOiJMWlciLERDVDoiRENUIixKUFg6IkpQWCIsSkJJRzoiSkJJRyIsQTg1OiJBODUiLEFIWDoiQUhYIixDQ0Y6IkNDRiIsUkxYOiJSTFgifTt0LkZvbnRUeXBlPXtVTktOT1dOOiJVTktOT1dOIixUWVBFMToiVFlQRTEiLFRZUEUxQzoiVFlQRTFDIixDSURGT05UVFlQRTA6IkNJREZPTlRUWVBFMCIsQ0lERk9OVFRZUEUwQzoiQ0lERk9OVFRZUEUwQyIsVFJVRVRZUEU6IlRSVUVUWVBFIixDSURGT05UVFlQRTI6IkNJREZPTlRUWVBFMiIsVFlQRTM6IlRZUEUzIixPUEVOVFlQRToiT1BFTlRZUEUiLFRZUEUwOiJUWVBFMCIsTU1UWVBFMToiTU1UWVBFMSJ9O2NvbnN0IG49e0VSUk9SUzowLFdBUk5JTkdTOjEsSU5GT1M6NX07dC5WZXJib3NpdHlMZXZlbD1uO3QuQ01hcENvbXByZXNzaW9uVHlwZT17Tk9ORTowLEJJTkFSWToxLFNUUkVBTToyfTt0Lk9QUz17ZGVwZW5kZW5jeToxLHNldExpbmVXaWR0aDoyLHNldExpbmVDYXA6MyxzZXRMaW5lSm9pbjo0LHNldE1pdGVyTGltaXQ6NSxzZXREYXNoOjYsc2V0UmVuZGVyaW5nSW50ZW50Ojcsc2V0RmxhdG5lc3M6OCxzZXRHU3RhdGU6OSxzYXZlOjEwLHJlc3RvcmU6MTEsdHJhbnNmb3JtOjEyLG1vdmVUbzoxMyxsaW5lVG86MTQsY3VydmVUbzoxNSxjdXJ2ZVRvMjoxNixjdXJ2ZVRvMzoxNyxjbG9zZVBhdGg6MTgscmVjdGFuZ2xlOjE5LHN0cm9rZToyMCxjbG9zZVN0cm9rZToyMSxmaWxsOjIyLGVvRmlsbDoyMyxmaWxsU3Ryb2tlOjI0LGVvRmlsbFN0cm9rZToyNSxjbG9zZUZpbGxTdHJva2U6MjYsY2xvc2VFT0ZpbGxTdHJva2U6MjcsZW5kUGF0aDoyOCxjbGlwOjI5LGVvQ2xpcDozMCxiZWdpblRleHQ6MzEsZW5kVGV4dDozMixzZXRDaGFyU3BhY2luZzozMyxzZXRXb3JkU3BhY2luZzozNCxzZXRIU2NhbGU6MzUsc2V0TGVhZGluZzozNixzZXRGb250OjM3LHNldFRleHRSZW5kZXJpbmdNb2RlOjM4LHNldFRleHRSaXNlOjM5LG1vdmVUZXh0OjQwLHNldExlYWRpbmdNb3ZlVGV4dDo0MSxzZXRUZXh0TWF0cml4OjQyLG5leHRMaW5lOjQzLHNob3dUZXh0OjQ0LHNob3dTcGFjZWRUZXh0OjQ1LG5leHRMaW5lU2hvd1RleHQ6NDYsbmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6NDcsc2V0Q2hhcldpZHRoOjQ4LHNldENoYXJXaWR0aEFuZEJvdW5kczo0OSxzZXRTdHJva2VDb2xvclNwYWNlOjUwLHNldEZpbGxDb2xvclNwYWNlOjUxLHNldFN0cm9rZUNvbG9yOjUyLHNldFN0cm9rZUNvbG9yTjo1MyxzZXRGaWxsQ29sb3I6NTQsc2V0RmlsbENvbG9yTjo1NSxzZXRTdHJva2VHcmF5OjU2LHNldEZpbGxHcmF5OjU3LHNldFN0cm9rZVJHQkNvbG9yOjU4LHNldEZpbGxSR0JDb2xvcjo1OSxzZXRTdHJva2VDTVlLQ29sb3I6NjAsc2V0RmlsbENNWUtDb2xvcjo2MSxzaGFkaW5nRmlsbDo2MixiZWdpbklubGluZUltYWdlOjYzLGJlZ2luSW1hZ2VEYXRhOjY0LGVuZElubGluZUltYWdlOjY1LHBhaW50WE9iamVjdDo2NixtYXJrUG9pbnQ6NjcsbWFya1BvaW50UHJvcHM6NjgsYmVnaW5NYXJrZWRDb250ZW50OjY5LGJlZ2luTWFya2VkQ29udGVudFByb3BzOjcwLGVuZE1hcmtlZENvbnRlbnQ6NzEsYmVnaW5Db21wYXQ6NzIsZW5kQ29tcGF0OjczLHBhaW50Rm9ybVhPYmplY3RCZWdpbjo3NCxwYWludEZvcm1YT2JqZWN0RW5kOjc1LGJlZ2luR3JvdXA6NzYsZW5kR3JvdXA6NzcsYmVnaW5Bbm5vdGF0aW9uczo3OCxlbmRBbm5vdGF0aW9uczo3OSxiZWdpbkFubm90YXRpb246ODAsZW5kQW5ub3RhdGlvbjo4MSxwYWludEpwZWdYT2JqZWN0OjgyLHBhaW50SW1hZ2VNYXNrWE9iamVjdDo4MyxwYWludEltYWdlTWFza1hPYmplY3RHcm91cDo4NCxwYWludEltYWdlWE9iamVjdDo4NSxwYWludElubGluZUltYWdlWE9iamVjdDo4NixwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOjg3LHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0Ojg4LHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDo4OSxwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6OTAsY29uc3RydWN0UGF0aDo5MX07dC5VTlNVUFBPUlRFRF9GRUFUVVJFUz17dW5rbm93bjoidW5rbm93biIsZm9ybXM6ImZvcm1zIixqYXZhU2NyaXB0OiJqYXZhU2NyaXB0IixzbWFzazoic21hc2siLHNoYWRpbmdQYXR0ZXJuOiJzaGFkaW5nUGF0dGVybiIsZm9udDoiZm9udCIsZXJyb3JUaWxpbmdQYXR0ZXJuOiJlcnJvclRpbGluZ1BhdHRlcm4iLGVycm9yRXh0R1N0YXRlOiJlcnJvckV4dEdTdGF0ZSIsZXJyb3JYT2JqZWN0OiJlcnJvclhPYmplY3QiLGVycm9yRm9udExvYWRUeXBlMzoiZXJyb3JGb250TG9hZFR5cGUzIixlcnJvckZvbnRTdGF0ZToiZXJyb3JGb250U3RhdGUiLGVycm9yRm9udE1pc3Npbmc6ImVycm9yRm9udE1pc3NpbmciLGVycm9yRm9udFRyYW5zbGF0ZToiZXJyb3JGb250VHJhbnNsYXRlIixlcnJvckNvbG9yU3BhY2U6ImVycm9yQ29sb3JTcGFjZSIsZXJyb3JPcGVyYXRvckxpc3Q6ImVycm9yT3BlcmF0b3JMaXN0IixlcnJvckZvbnRUb1VuaWNvZGU6ImVycm9yRm9udFRvVW5pY29kZSIsZXJyb3JGb250TG9hZE5hdGl2ZToiZXJyb3JGb250TG9hZE5hdGl2ZSIsZXJyb3JGb250R2V0UGF0aDoiZXJyb3JGb250R2V0UGF0aCIsZXJyb3JNYXJrZWRDb250ZW50OiJlcnJvck1hcmtlZENvbnRlbnQifTt0LlBhc3N3b3JkUmVzcG9uc2VzPXtORUVEX1BBU1NXT1JEOjEsSU5DT1JSRUNUX1BBU1NXT1JEOjJ9O2xldCBpPW4uV0FSTklOR1M7ZnVuY3Rpb24gd2FybihlKXtpPj1uLldBUk5JTkdTJiZjb25zb2xlLmxvZygiV2FybmluZzogIitlKX1mdW5jdGlvbiB1bnJlYWNoYWJsZShlKXt0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gYXNzZXJ0KGUsdCl7ZXx8dW5yZWFjaGFibGUodCl9ZnVuY3Rpb24gc2hhZG93KGUsdCxyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiExfSk7cmV0dXJuIHJ9Y29uc3Qgbz1mdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpe2Z1bmN0aW9uIEJhc2VFeGNlcHRpb24oZSl7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VFeGNlcHRpb24mJnVucmVhY2hhYmxlKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLiIpO3RoaXMubWVzc2FnZT1lO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWV9QmFzZUV4Y2VwdGlvbi5wcm90b3R5cGU9bmV3IEVycm9yO0Jhc2VFeGNlcHRpb24uY29uc3RydWN0b3I9QmFzZUV4Y2VwdGlvbjtyZXR1cm4gQmFzZUV4Y2VwdGlvbn0oKTt0LkJhc2VFeGNlcHRpb249bzt0LlBhc3N3b3JkRXhjZXB0aW9uPWNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgb3tjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpO3RoaXMuY29kZT10fX07dC5Vbmtub3duRXJyb3JFeGNlcHRpb249Y2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgb3tjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpO3RoaXMuZGV0YWlscz10fX07dC5JbnZhbGlkUERGRXhjZXB0aW9uPWNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBve307dC5NaXNzaW5nUERGRXhjZXB0aW9uPWNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBve307dC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249Y2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgb3tjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUpO3RoaXMuc3RhdHVzPXR9fTt0LkZvcm1hdEVycm9yPWNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgb3t9O3QuQWJvcnRFeGNlcHRpb249Y2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBve307Y29uc3Qgcz0vXHgwMC9nO2Z1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoZSl7YXNzZXJ0KCJzdHJpbmciPT10eXBlb2YgZSwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpO2NvbnN0IHQ9ZS5sZW5ndGgscj1uZXcgVWludDhBcnJheSh0KTtmb3IobGV0IG49MDtuPHQ7KytuKXJbbl09MjU1JmUuY2hhckNvZGVBdChuKTtyZXR1cm4gcn1mdW5jdGlvbiBhcnJheUJ5dGVMZW5ndGgoZSl7aWYodm9pZCAwIT09ZS5sZW5ndGgpcmV0dXJuIGUubGVuZ3RoO2Fzc2VydCh2b2lkIDAhPT1lLmJ5dGVMZW5ndGgsImFycmF5Qnl0ZUxlbmd0aCAtIGludmFsaWQgYXJndW1lbnQuIik7cmV0dXJuIGUuYnl0ZUxlbmd0aH1jb25zdCBhPXtnZXQgdmFsdWUoKXtyZXR1cm4gc2hhZG93KHRoaXMsInZhbHVlIixmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoNCk7ZVswXT0xO3JldHVybiAxPT09bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLDAsMSlbMF19KCkpfX07dC5Jc0xpdHRsZUVuZGlhbkNhY2hlZD1hO2NvbnN0IGM9e2dldCB2YWx1ZSgpe3JldHVybiBzaGFkb3codGhpcywidmFsdWUiLGZ1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpe3RyeXtuZXcgRnVuY3Rpb24oIiIpO3JldHVybiEwfWNhdGNoKGUpe3JldHVybiExfX0oKSl9fTt0LklzRXZhbFN1cHBvcnRlZENhY2hlZD1jO2NvbnN0IGw9WyJyZ2IoIiwwLCIsIiwwLCIsIiwwLCIpIl07Y2xhc3MgVXRpbHtzdGF0aWMgbWFrZUNzc1JnYihlLHQscil7bFsxXT1lO2xbM109dDtsWzVdPXI7cmV0dXJuIGwuam9pbigiIil9c3RhdGljIHRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsyXSp0WzFdLGVbMV0qdFswXStlWzNdKnRbMV0sZVswXSp0WzJdK2VbMl0qdFszXSxlWzFdKnRbMl0rZVszXSp0WzNdLGVbMF0qdFs0XStlWzJdKnRbNV0rZVs0XSxlWzFdKnRbNF0rZVszXSp0WzVdK2VbNV1dfXN0YXRpYyBhcHBseVRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsxXSp0WzJdK3RbNF0sZVswXSp0WzFdK2VbMV0qdFszXSt0WzVdXX1zdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKGUsdCl7Y29uc3Qgcj10WzBdKnRbM10tdFsxXSp0WzJdO3JldHVyblsoZVswXSp0WzNdLWVbMV0qdFsyXSt0WzJdKnRbNV0tdFs0XSp0WzNdKS9yLCgtZVswXSp0WzFdK2VbMV0qdFswXSt0WzRdKnRbMV0tdFs1XSp0WzBdKS9yXX1zdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZSx0KXtjb25zdCByPVV0aWwuYXBwbHlUcmFuc2Zvcm0oZSx0KSxuPVV0aWwuYXBwbHlUcmFuc2Zvcm0oZS5zbGljZSgyLDQpLHQpLGk9VXRpbC5hcHBseVRyYW5zZm9ybShbZVswXSxlWzNdXSx0KSxvPVV0aWwuYXBwbHlUcmFuc2Zvcm0oW2VbMl0sZVsxXV0sdCk7cmV0dXJuW01hdGgubWluKHJbMF0sblswXSxpWzBdLG9bMF0pLE1hdGgubWluKHJbMV0sblsxXSxpWzFdLG9bMV0pLE1hdGgubWF4KHJbMF0sblswXSxpWzBdLG9bMF0pLE1hdGgubWF4KHJbMV0sblsxXSxpWzFdLG9bMV0pXX1zdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShlKXtjb25zdCB0PWVbMF0qZVszXS1lWzFdKmVbMl07cmV0dXJuW2VbM10vdCwtZVsxXS90LC1lWzJdL3QsZVswXS90LChlWzJdKmVbNV0tZVs0XSplWzNdKS90LChlWzRdKmVbMV0tZVs1XSplWzBdKS90XX1zdGF0aWMgYXBwbHkzZFRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsxXSp0WzFdK2VbMl0qdFsyXSxlWzNdKnRbMF0rZVs0XSp0WzFdK2VbNV0qdFsyXSxlWzZdKnRbMF0rZVs3XSp0WzFdK2VbOF0qdFsyXV19c3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUpe2NvbnN0IHQ9W2VbMF0sZVsyXSxlWzFdLGVbM11dLHI9ZVswXSp0WzBdK2VbMV0qdFsyXSxuPWVbMF0qdFsxXStlWzFdKnRbM10saT1lWzJdKnRbMF0rZVszXSp0WzJdLG89ZVsyXSp0WzFdK2VbM10qdFszXSxzPShyK28pLzIsYT1NYXRoLnNxcnQoKHIrbykqKHIrbyktNCoocipvLWkqbikpLzIsYz1zK2F8fDEsbD1zLWF8fDE7cmV0dXJuW01hdGguc3FydChjKSxNYXRoLnNxcnQobCldfXN0YXRpYyBub3JtYWxpemVSZWN0KGUpe2NvbnN0IHQ9ZS5zbGljZSgwKTtpZihlWzBdPmVbMl0pe3RbMF09ZVsyXTt0WzJdPWVbMF19aWYoZVsxXT5lWzNdKXt0WzFdPWVbM107dFszXT1lWzFdfXJldHVybiB0fXN0YXRpYyBpbnRlcnNlY3QoZSx0KXtmdW5jdGlvbiBjb21wYXJlKGUsdCl7cmV0dXJuIGUtdH1jb25zdCByPVtlWzBdLGVbMl0sdFswXSx0WzJdXS5zb3J0KGNvbXBhcmUpLG49W2VbMV0sZVszXSx0WzFdLHRbM11dLnNvcnQoY29tcGFyZSksaT1bXTtlPVV0aWwubm9ybWFsaXplUmVjdChlKTt0PVV0aWwubm9ybWFsaXplUmVjdCh0KTtpZighKHJbMF09PT1lWzBdJiZyWzFdPT09dFswXXx8clswXT09PXRbMF0mJnJbMV09PT1lWzBdKSlyZXR1cm4gbnVsbDtpWzBdPXJbMV07aVsyXT1yWzJdO2lmKCEoblswXT09PWVbMV0mJm5bMV09PT10WzFdfHxuWzBdPT09dFsxXSYmblsxXT09PWVbMV0pKXJldHVybiBudWxsO2lbMV09blsxXTtpWzNdPW5bMl07cmV0dXJuIGl9fXQuVXRpbD1VdGlsO2NvbnN0IGQ9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDcyOCw3MTEsNzEwLDcyOSw3MzMsNzMxLDczMCw3MzIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODIyNiw4MjI0LDgyMjUsODIzMCw4MjEyLDgyMTEsNDAyLDgyNjAsODI0OSw4MjUwLDg3MjIsODI0MCw4MjIyLDgyMjAsODIyMSw4MjE2LDgyMTcsODIxOCw4NDgyLDY0MjU3LDY0MjU4LDMyMSwzMzgsMzUyLDM3NiwzODEsMzA1LDMyMiwzMzksMzUzLDM4MiwwLDgzNjRdO2NvbnN0IGY9ZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMQ2xvc3VyZSgpe2NvbnN0IGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjtyZXR1cm4gZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKHQscixuPSExKXtpZighbiYmVVJMLmNyZWF0ZU9iamVjdFVSTCl7Y29uc3QgZT1uZXcgQmxvYihbdF0se3R5cGU6cn0pO3JldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGUpfWxldCBpPWBkYXRhOiR7cn07YmFzZTY0LGA7Zm9yKGxldCByPTAsbj10Lmxlbmd0aDtyPG47cis9Myl7Y29uc3Qgbz0yNTUmdFtyXSxzPTI1NSZ0W3IrMV0sYT0yNTUmdFtyKzJdO2krPWVbbz4+Ml0rZVsoMyZvKTw8NHxzPj40XStlW3IrMTxuPygxNSZzKTw8MnxhPj42OjY0XStlW3IrMjxuPzYzJmE6NjRdfXJldHVybiBpfX0oKTt0LmNyZWF0ZU9iamVjdFVSTD1mfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3IoMyl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuaXNOb2RlSlM9dm9pZCAwO2NvbnN0IG49ISgib2JqZWN0IiE9dHlwZW9mIHByb2Nlc3N8fHByb2Nlc3MrIiIhPSJbb2JqZWN0IHByb2Nlc3NdInx8cHJvY2Vzcy52ZXJzaW9ucy5ud3x8cHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiYmcHJvY2Vzcy50eXBlJiYiYnJvd3NlciIhPT1wcm9jZXNzLnR5cGUpO3QuaXNOb2RlSlM9bn0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5KYmlnMkltYWdlPXZvaWQgMDt2YXIgbj1yKDEpLGk9cig1KSxvPXIoNikscz1yKDcpO2NsYXNzIEpiaWcyRXJyb3IgZXh0ZW5kcyBuLkJhc2VFeGNlcHRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoIkpCSUcyIGVycm9yOiAiK2UpfX12YXIgYT1mdW5jdGlvbiBKYmlnMkltYWdlQ2xvc3VyZSgpe2Z1bmN0aW9uIENvbnRleHRDYWNoZSgpe31Db250ZXh0Q2FjaGUucHJvdG90eXBlPXtnZXRDb250ZXh0cyhlKXtyZXR1cm4gZSBpbiB0aGlzP3RoaXNbZV06dGhpc1tlXT1uZXcgSW50OEFycmF5KDY1NTM2KX19O2Z1bmN0aW9uIERlY29kaW5nQ29udGV4dChlLHQscil7dGhpcy5kYXRhPWU7dGhpcy5zdGFydD10O3RoaXMuZW5kPXJ9RGVjb2RpbmdDb250ZXh0LnByb3RvdHlwZT17Z2V0IGRlY29kZXIoKXt2YXIgZT1uZXcgby5Bcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsdGhpcy5zdGFydCx0aGlzLmVuZCk7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImRlY29kZXIiLGUpfSxnZXQgY29udGV4dENhY2hlKCl7dmFyIGU9bmV3IENvbnRleHRDYWNoZTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiY29udGV4dENhY2hlIixlKX19O2Z1bmN0aW9uIGRlY29kZUludGVnZXIoZSx0LHIpe3ZhciBuPWUuZ2V0Q29udGV4dHModCksaT0xO2Z1bmN0aW9uIHJlYWRCaXRzKGUpe2Zvcih2YXIgdD0wLG89MDtvPGU7bysrKXt2YXIgcz1yLnJlYWRCaXQobixpKTtpPWk8MjU2P2k8PDF8czo1MTEmKGk8PDF8cyl8MjU2O3Q9dDw8MXxzfXJldHVybiB0Pj4+MH12YXIgbz1yZWFkQml0cygxKSxzPXJlYWRCaXRzKDEpP3JlYWRCaXRzKDEpP3JlYWRCaXRzKDEpP3JlYWRCaXRzKDEpP3JlYWRCaXRzKDEpP3JlYWRCaXRzKDMyKSs0NDM2OnJlYWRCaXRzKDEyKSszNDA6cmVhZEJpdHMoOCkrODQ6cmVhZEJpdHMoNikrMjA6cmVhZEJpdHMoNCkrNDpyZWFkQml0cygyKTtyZXR1cm4gMD09PW8/czpzPjA/LXM6bnVsbH1mdW5jdGlvbiBkZWNvZGVJQUlEKGUsdCxyKXtmb3IodmFyIG49ZS5nZXRDb250ZXh0cygiSUFJRCIpLGk9MSxvPTA7bzxyO28rKyl7aT1pPDwxfHQucmVhZEJpdChuLGkpfXJldHVybiByPDMxP2kmKDE8PHIpLTE6MjE0NzQ4MzY0NyZpfXZhciBlPVsiU3ltYm9sRGljdGlvbmFyeSIsbnVsbCxudWxsLG51bGwsIkludGVybWVkaWF0ZVRleHRSZWdpb24iLG51bGwsIkltbWVkaWF0ZVRleHRSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiUGF0dGVybkRpY3Rpb25hcnkiLG51bGwsbnVsbCxudWxsLCJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbiIsIkludGVybWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uIixudWxsLCJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLG51bGwsbnVsbCxudWxsLG51bGwsIlBhZ2VJbmZvcm1hdGlvbiIsIkVuZE9mUGFnZSIsIkVuZE9mU3RyaXBlIiwiRW5kT2ZGaWxlIiwiUHJvZmlsZXMiLCJUYWJsZXMiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiRXh0ZW5zaW9uIl0sdD1bW3t4Oi0xLHk6LTJ9LHt4OjAseTotMn0se3g6MSx5Oi0yfSx7eDotMix5Oi0xfSx7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6Mix5Oi0xfSx7eDotNCx5OjB9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XSxbe3g6LTEseTotMn0se3g6MCx5Oi0yfSx7eDoxLHk6LTJ9LHt4OjIseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4OjIseTotMX0se3g6LTMseTowfSx7eDotMix5OjB9LHt4Oi0xLHk6MH1dLFt7eDotMSx5Oi0yfSx7eDowLHk6LTJ9LHt4OjEseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0yLHk6MH0se3g6LTEseTowfV0sW3t4Oi0zLHk6LTF9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotNCx5OjB9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XV0scj1be2NvZGluZzpbe3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH1dLHJlZmVyZW5jZTpbe3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH0se3g6MCx5OjB9LHt4OjEseTowfSx7eDotMSx5OjF9LHt4OjAseToxfSx7eDoxLHk6MX1dfSx7Y29kaW5nOlt7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTEseTowfV0scmVmZXJlbmNlOlt7eDowLHk6LTF9LHt4Oi0xLHk6MH0se3g6MCx5OjB9LHt4OjEseTowfSx7eDowLHk6MX0se3g6MSx5OjF9XX1dLGE9WzM5NzE3LDE5NDEsMjI5LDQwNV0sYz1bMzIsOF07ZnVuY3Rpb24gZGVjb2RlQml0bWFwKGUscixuLGksbyxzLGMsbCl7aWYoZSl7cmV0dXJuIGRlY29kZU1NUkJpdG1hcChuZXcgUmVhZGVyKGwuZGF0YSxsLnN0YXJ0LGwuZW5kKSxyLG4sITEpfWlmKDA9PT1pJiYhcyYmIW8mJjQ9PT1jLmxlbmd0aCYmMz09PWNbMF0ueCYmLTE9PT1jWzBdLnkmJi0zPT09Y1sxXS54JiYtMT09PWNbMV0ueSYmMj09PWNbMl0ueCYmLTI9PT1jWzJdLnkmJi0yPT09Y1szXS54JiYtMj09PWNbM10ueSlyZXR1cm4gZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKGUsdCxyKXt2YXIgbixpLG8scyxhLGMsbCxkPXIuZGVjb2RlcixmPXIuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpLGg9W107Zm9yKGk9MDtpPHQ7aSsrKXthPWhbaV09bmV3IFVpbnQ4QXJyYXkoZSk7Yz1pPDE/YTpoW2ktMV07bj0obD1pPDI/YTpoW2ktMl0pWzBdPDwxM3xsWzFdPDwxMnxsWzJdPDwxMXxjWzBdPDw3fGNbMV08PDZ8Y1syXTw8NXxjWzNdPDw0O2ZvcihvPTA7bzxlO28rKyl7YVtvXT1zPWQucmVhZEJpdChmLG4pO249KDMxNzM1Jm4pPDwxfChvKzM8ZT9sW28rM108PDExOjApfChvKzQ8ZT9jW28rNF08PDQ6MCl8c319cmV0dXJuIGh9KHIsbixsKTt2YXIgZD0hIXMsZj10W2ldLmNvbmNhdChjKTtmLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUueS10Lnl8fGUueC10Lnh9KSk7dmFyIGgsdSxwPWYubGVuZ3RoLG09bmV3IEludDhBcnJheShwKSxnPW5ldyBJbnQ4QXJyYXkocCksYj1bXSx4PTAseT0wLHY9MCx3PTA7Zm9yKHU9MDt1PHA7dSsrKXttW3VdPWZbdV0ueDtnW3VdPWZbdV0ueTt5PU1hdGgubWluKHksZlt1XS54KTt2PU1hdGgubWF4KHYsZlt1XS54KTt3PU1hdGgubWluKHcsZlt1XS55KTt1PHAtMSYmZlt1XS55PT09Zlt1KzFdLnkmJmZbdV0ueD09PWZbdSsxXS54LTE/eHw9MTw8cC0xLXU6Yi5wdXNoKHUpfXZhciBUPWIubGVuZ3RoLEM9bmV3IEludDhBcnJheShUKSxJPW5ldyBJbnQ4QXJyYXkoVCksUD1uZXcgVWludDE2QXJyYXkoVCk7Zm9yKGg9MDtoPFQ7aCsrKXt1PWJbaF07Q1toXT1mW3VdLng7SVtoXT1mW3VdLnk7UFtoXT0xPDxwLTEtdX1mb3IodmFyIGssUyxfLEUsQixMPS15LEQ9LXcsTT1yLXYsTz1hW2ldLEE9bmV3IFVpbnQ4QXJyYXkociksUj1bXSxVPWwuZGVjb2RlcixGPWwuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpLE49MCxIPTAsSj0wO0o8bjtKKyspe2lmKG8pe2lmKE5ePVUucmVhZEJpdChGLE8pKXtSLnB1c2goQSk7Y29udGludWV9fUE9bmV3IFVpbnQ4QXJyYXkoQSk7Ui5wdXNoKEEpO2ZvcihrPTA7azxyO2srKylpZihkJiZzW0pdW2tdKUFba109MDtlbHNle2lmKGs+PUwmJms8TSYmSj49RCl7SD1IPDwxJng7Zm9yKHU9MDt1PFQ7dSsrKXtTPUorSVt1XTtfPWsrQ1t1XTsoRT1SW1NdW19dKSYmKEh8PUU9UFt1XSl9fWVsc2V7SD0wO0I9cC0xO2Zvcih1PTA7dTxwO3UrKyxCLS0pKF89ayttW3VdKT49MCYmXzxyJiYoUz1KK2dbdV0pPj0wJiYoRT1SW1NdW19dKSYmKEh8PUU8PEIpfXZhciB6PVUucmVhZEJpdChGLEgpO0Fba109en19cmV0dXJuIFJ9ZnVuY3Rpb24gZGVjb2RlUmVmaW5lbWVudChlLHQsbixpLG8scyxhLGwsZCl7dmFyIGY9cltuXS5jb2Rpbmc7MD09PW4mJihmPWYuY29uY2F0KFtsWzBdXSkpO3ZhciBoLHU9Zi5sZW5ndGgscD1uZXcgSW50MzJBcnJheSh1KSxtPW5ldyBJbnQzMkFycmF5KHUpO2ZvcihoPTA7aDx1O2grKyl7cFtoXT1mW2hdLng7bVtoXT1mW2hdLnl9dmFyIGc9cltuXS5yZWZlcmVuY2U7MD09PW4mJihnPWcuY29uY2F0KFtsWzFdXSkpO3ZhciBiPWcubGVuZ3RoLHg9bmV3IEludDMyQXJyYXkoYikseT1uZXcgSW50MzJBcnJheShiKTtmb3IoaD0wO2g8YjtoKyspe3hbaF09Z1toXS54O3lbaF09Z1toXS55fWZvcih2YXIgdj1pWzBdLmxlbmd0aCx3PWkubGVuZ3RoLFQ9Y1tuXSxDPVtdLEk9ZC5kZWNvZGVyLFA9ZC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdSIiksaz0wLFM9MDtTPHQ7UysrKXtpZihhKXtpZihrXj1JLnJlYWRCaXQoUCxUKSl0aHJvdyBuZXcgSmJpZzJFcnJvcigicHJlZGljdGlvbiBpcyBub3Qgc3VwcG9ydGVkIil9dmFyIF89bmV3IFVpbnQ4QXJyYXkoZSk7Qy5wdXNoKF8pO2Zvcih2YXIgRT0wO0U8ZTtFKyspe3ZhciBCLEwsRD0wO2ZvcihoPTA7aDx1O2grKyl7Qj1TK21baF07TD1FK3BbaF07QjwwfHxMPDB8fEw+PWU/RDw8PTE6RD1EPDwxfENbQl1bTF19Zm9yKGg9MDtoPGI7aCsrKXtCPVMreVtoXS1zO0w9RSt4W2hdLW87QjwwfHxCPj13fHxMPDB8fEw+PXY/RDw8PTE6RD1EPDwxfGlbQl1bTF19dmFyIE09SS5yZWFkQml0KFAsRCk7X1tFXT1NfX1yZXR1cm4gQ31mdW5jdGlvbiBkZWNvZGVUZXh0UmVnaW9uKGUsdCxyLG4saSxvLHMsYSxjLGwsZCxmLGgsdSxwLG0sZyxiLHgpe2lmKGUmJnQpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTt2YXIgeSx2LHc9W107Zm9yKHk9MDt5PG47eSsrKXt2PW5ldyBVaW50OEFycmF5KHIpO2lmKGkpZm9yKHZhciBUPTA7VDxyO1QrKyl2W1RdPWk7dy5wdXNoKHYpfXZhciBDPWcuZGVjb2RlcixJPWcuY29udGV4dENhY2hlLFA9ZT8tdS50YWJsZURlbHRhVC5kZWNvZGUoeCk6LWRlY29kZUludGVnZXIoSSwiSUFEVCIsQyksaz0wO3k9MDtmb3IoO3k8bzspe1ArPWU/dS50YWJsZURlbHRhVC5kZWNvZGUoeCk6ZGVjb2RlSW50ZWdlcihJLCJJQURUIixDKTtmb3IodmFyIFM9ays9ZT91LnRhYmxlRmlyc3RTLmRlY29kZSh4KTpkZWNvZGVJbnRlZ2VyKEksIklBRlMiLEMpOzspe2xldCBuPTA7cz4xJiYobj1lP3gucmVhZEJpdHMoYik6ZGVjb2RlSW50ZWdlcihJLCJJQUlUIixDKSk7dmFyIF89cypQK24sRT1lP3Uuc3ltYm9sSURUYWJsZS5kZWNvZGUoeCk6ZGVjb2RlSUFJRChJLEMsYyksQj10JiYoZT94LnJlYWRCaXQoKTpkZWNvZGVJbnRlZ2VyKEksIklBUkkiLEMpKSxMPWFbRV0sRD1MWzBdLmxlbmd0aCxNPUwubGVuZ3RoO2lmKEIpe3ZhciBPPWRlY29kZUludGVnZXIoSSwiSUFSRFciLEMpLEE9ZGVjb2RlSW50ZWdlcihJLCJJQVJESCIsQyk7TD1kZWNvZGVSZWZpbmVtZW50KEQrPU8sTSs9QSxwLEwsKE8+PjEpK2RlY29kZUludGVnZXIoSSwiSUFSRFgiLEMpLChBPj4xKStkZWNvZGVJbnRlZ2VyKEksIklBUkRZIixDKSwhMSxtLGcpfXZhciBSLFUsRixOPV8tKDEmZj8wOk0tMSksSD1TLSgyJmY/RC0xOjApO2lmKGwpe2ZvcihSPTA7UjxNO1IrKylpZih2PXdbSCtSXSl7Rj1MW1JdO3ZhciBKPU1hdGgubWluKHItTixEKTtzd2l0Y2goaCl7Y2FzZSAwOmZvcihVPTA7VTxKO1UrKyl2W04rVV18PUZbVV07YnJlYWs7Y2FzZSAyOmZvcihVPTA7VTxKO1UrKyl2W04rVV1ePUZbVV07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtofSBpcyBub3Qgc3VwcG9ydGVkYCl9fVMrPU0tMX1lbHNle2ZvcihVPTA7VTxNO1UrKylpZih2PXdbTitVXSl7Rj1MW1VdO3N3aXRjaChoKXtjYXNlIDA6Zm9yKFI9MDtSPEQ7UisrKXZbSCtSXXw9RltSXTticmVhaztjYXNlIDI6Zm9yKFI9MDtSPEQ7UisrKXZbSCtSXV49RltSXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2h9IGlzIG5vdCBzdXBwb3J0ZWRgKX19Uys9RC0xfXkrKzt2YXIgej1lP3UudGFibGVEZWx0YVMuZGVjb2RlKHgpOmRlY29kZUludGVnZXIoSSwiSUFEUyIsQyk7aWYobnVsbD09PXopYnJlYWs7Uys9eitkfX1yZXR1cm4gd31mdW5jdGlvbiByZWFkU2VnbWVudEhlYWRlcih0LHIpe3ZhciBuPXt9O24ubnVtYmVyPSgwLGkucmVhZFVpbnQzMikodCxyKTt2YXIgbz10W3IrNF0scz02MyZvO2lmKCFlW3NdKXRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHNlZ21lbnQgdHlwZTogIitzKTtuLnR5cGU9cztuLnR5cGVOYW1lPWVbc107bi5kZWZlcnJlZE5vblJldGFpbj0hISgxMjgmbyk7dmFyIGE9ISEoNjQmbyksYz10W3IrNV0sZD1jPj41JjcsZj1bMzEmY10saD1yKzY7aWYoNz09PWMpe2Q9NTM2ODcwOTExJigwLGkucmVhZFVpbnQzMikodCxoLTEpO2grPTM7dmFyIHU9ZCs3Pj4zO2ZbMF09dFtoKytdO2Zvcig7LS11PjA7KWYucHVzaCh0W2grK10pfWVsc2UgaWYoNT09PWN8fDY9PT1jKXRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHJlZmVycmVkLXRvIGZsYWdzIik7bi5yZXRhaW5CaXRzPWY7bGV0IHA9NDtuLm51bWJlcjw9MjU2P3A9MTpuLm51bWJlcjw9NjU1MzYmJihwPTIpO3ZhciBtLGcsYj1bXTtmb3IobT0wO208ZDttKyspe2xldCBlO2U9MT09PXA/dFtoXToyPT09cD8oMCxpLnJlYWRVaW50MTYpKHQsaCk6KDAsaS5yZWFkVWludDMyKSh0LGgpO2IucHVzaChlKTtoKz1wfW4ucmVmZXJyZWRUbz1iO2lmKGEpe24ucGFnZUFzc29jaWF0aW9uPSgwLGkucmVhZFVpbnQzMikodCxoKTtoKz00fWVsc2Ugbi5wYWdlQXNzb2NpYXRpb249dFtoKytdO24ubGVuZ3RoPSgwLGkucmVhZFVpbnQzMikodCxoKTtoKz00O2lmKDQyOTQ5NjcyOTU9PT1uLmxlbmd0aCl7aWYoMzghPT1zKXRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGgiKTt2YXIgeD1yZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKHQsaCkseT0hISgxJnRbaCtsXSksdj1uZXcgVWludDhBcnJheSg2KTtpZigheSl7dlswXT0yNTU7dlsxXT0xNzJ9dlsyXT14LmhlaWdodD4+PjI0JjI1NTt2WzNdPXguaGVpZ2h0Pj4xNiYyNTU7dls0XT14LmhlaWdodD4+OCYyNTU7dls1XT0yNTUmeC5oZWlnaHQ7Zm9yKG09aCxnPXQubGVuZ3RoO208ZzttKyspe2Zvcih2YXIgdz0wO3c8NiYmdlt3XT09PXRbbSt3XTspdysrO2lmKDY9PT13KXtuLmxlbmd0aD1tKzY7YnJlYWt9fWlmKDQyOTQ5NjcyOTU9PT1uLmxlbmd0aCl0aHJvdyBuZXcgSmJpZzJFcnJvcigic2VnbWVudCBlbmQgd2FzIG5vdCBmb3VuZCIpfW4uaGVhZGVyRW5kPWg7cmV0dXJuIG59ZnVuY3Rpb24gcmVhZFNlZ21lbnRzKGUsdCxyLG4pe2Zvcih2YXIgaT1bXSxvPXI7bzxuOyl7dmFyIHM9cmVhZFNlZ21lbnRIZWFkZXIodCxvKTtvPXMuaGVhZGVyRW5kO3ZhciBhPXtoZWFkZXI6cyxkYXRhOnR9O2lmKCFlLnJhbmRvbUFjY2Vzcyl7YS5zdGFydD1vO28rPXMubGVuZ3RoO2EuZW5kPW99aS5wdXNoKGEpO2lmKDUxPT09cy50eXBlKWJyZWFrfWlmKGUucmFuZG9tQWNjZXNzKWZvcih2YXIgYz0wLGw9aS5sZW5ndGg7YzxsO2MrKyl7aVtjXS5zdGFydD1vO28rPWlbY10uaGVhZGVyLmxlbmd0aDtpW2NdLmVuZD1vfXJldHVybiBpfWZ1bmN0aW9uIHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZSx0KXtyZXR1cm57d2lkdGg6KDAsaS5yZWFkVWludDMyKShlLHQpLGhlaWdodDooMCxpLnJlYWRVaW50MzIpKGUsdCs0KSx4OigwLGkucmVhZFVpbnQzMikoZSx0KzgpLHk6KDAsaS5yZWFkVWludDMyKShlLHQrMTIpLGNvbWJpbmF0aW9uT3BlcmF0b3I6NyZlW3QrMTZdfX12YXIgbD0xNztmdW5jdGlvbiBwcm9jZXNzU2VnbWVudChlLHQpe3ZhciByLG4sbyxzLGE9ZS5oZWFkZXIsYz1lLmRhdGEsZD1lLnN0YXJ0LGY9ZS5lbmQ7c3dpdGNoKGEudHlwZSl7Y2FzZSAwOnZhciBoPXt9LHU9KDAsaS5yZWFkVWludDE2KShjLGQpO2guaHVmZm1hbj0hISgxJnUpO2gucmVmaW5lbWVudD0hISgyJnUpO2guaHVmZm1hbkRIU2VsZWN0b3I9dT4+MiYzO2guaHVmZm1hbkRXU2VsZWN0b3I9dT4+NCYzO2guYml0bWFwU2l6ZVNlbGVjdG9yPXU+PjYmMTtoLmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3I9dT4+NyYxO2guYml0bWFwQ29kaW5nQ29udGV4dFVzZWQ9ISEoMjU2JnUpO2guYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkPSEhKDUxMiZ1KTtoLnRlbXBsYXRlPXU+PjEwJjM7aC5yZWZpbmVtZW50VGVtcGxhdGU9dT4+MTImMTtkKz0yO2lmKCFoLmh1ZmZtYW4pe3M9MD09PWgudGVtcGxhdGU/NDoxO249W107Zm9yKG89MDtvPHM7bysrKXtuLnB1c2goe3g6KDAsaS5yZWFkSW50OCkoYyxkKSx5OigwLGkucmVhZEludDgpKGMsZCsxKX0pO2QrPTJ9aC5hdD1ufWlmKGgucmVmaW5lbWVudCYmIWgucmVmaW5lbWVudFRlbXBsYXRlKXtuPVtdO2ZvcihvPTA7bzwyO28rKyl7bi5wdXNoKHt4OigwLGkucmVhZEludDgpKGMsZCkseTooMCxpLnJlYWRJbnQ4KShjLGQrMSl9KTtkKz0yfWgucmVmaW5lbWVudEF0PW59aC5udW1iZXJPZkV4cG9ydGVkU3ltYm9scz0oMCxpLnJlYWRVaW50MzIpKGMsZCk7ZCs9NDtoLm51bWJlck9mTmV3U3ltYm9scz0oMCxpLnJlYWRVaW50MzIpKGMsZCk7ZCs9NDtyPVtoLGEubnVtYmVyLGEucmVmZXJyZWRUbyxjLGQsZl07YnJlYWs7Y2FzZSA2OmNhc2UgNzp2YXIgcD17fTtwLmluZm89cmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihjLGQpO2QrPWw7dmFyIG09KDAsaS5yZWFkVWludDE2KShjLGQpO2QrPTI7cC5odWZmbWFuPSEhKDEmbSk7cC5yZWZpbmVtZW50PSEhKDImbSk7cC5sb2dTdHJpcFNpemU9bT4+MiYzO3Auc3RyaXBTaXplPTE8PHAubG9nU3RyaXBTaXplO3AucmVmZXJlbmNlQ29ybmVyPW0+PjQmMztwLnRyYW5zcG9zZWQ9ISEoNjQmbSk7cC5jb21iaW5hdGlvbk9wZXJhdG9yPW0+PjcmMztwLmRlZmF1bHRQaXhlbFZhbHVlPW0+PjkmMTtwLmRzT2Zmc2V0PW08PDE3Pj4yNztwLnJlZmluZW1lbnRUZW1wbGF0ZT1tPj4xNSYxO2lmKHAuaHVmZm1hbil7dmFyIGc9KDAsaS5yZWFkVWludDE2KShjLGQpO2QrPTI7cC5odWZmbWFuRlM9MyZnO3AuaHVmZm1hbkRTPWc+PjImMztwLmh1ZmZtYW5EVD1nPj40JjM7cC5odWZmbWFuUmVmaW5lbWVudERXPWc+PjYmMztwLmh1ZmZtYW5SZWZpbmVtZW50REg9Zz4+OCYzO3AuaHVmZm1hblJlZmluZW1lbnREWD1nPj4xMCYzO3AuaHVmZm1hblJlZmluZW1lbnREWT1nPj4xMiYzO3AuaHVmZm1hblJlZmluZW1lbnRTaXplU2VsZWN0b3I9ISEoMTYzODQmZyl9aWYocC5yZWZpbmVtZW50JiYhcC5yZWZpbmVtZW50VGVtcGxhdGUpe249W107Zm9yKG89MDtvPDI7bysrKXtuLnB1c2goe3g6KDAsaS5yZWFkSW50OCkoYyxkKSx5OigwLGkucmVhZEludDgpKGMsZCsxKX0pO2QrPTJ9cC5yZWZpbmVtZW50QXQ9bn1wLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzPSgwLGkucmVhZFVpbnQzMikoYyxkKTtkKz00O3I9W3AsYS5yZWZlcnJlZFRvLGMsZCxmXTticmVhaztjYXNlIDE2OmNvbnN0IGU9e30sdD1jW2QrK107ZS5tbXI9ISEoMSZ0KTtlLnRlbXBsYXRlPXQ+PjEmMztlLnBhdHRlcm5XaWR0aD1jW2QrK107ZS5wYXR0ZXJuSGVpZ2h0PWNbZCsrXTtlLm1heFBhdHRlcm5JbmRleD0oMCxpLnJlYWRVaW50MzIpKGMsZCk7ZCs9NDtyPVtlLGEubnVtYmVyLGMsZCxmXTticmVhaztjYXNlIDIyOmNhc2UgMjM6Y29uc3Qgdz17fTt3LmluZm89cmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihjLGQpO2QrPWw7Y29uc3QgVD1jW2QrK107dy5tbXI9ISEoMSZUKTt3LnRlbXBsYXRlPVQ+PjEmMzt3LmVuYWJsZVNraXA9ISEoOCZUKTt3LmNvbWJpbmF0aW9uT3BlcmF0b3I9VD4+NCY3O3cuZGVmYXVsdFBpeGVsVmFsdWU9VD4+NyYxO3cuZ3JpZFdpZHRoPSgwLGkucmVhZFVpbnQzMikoYyxkKTtkKz00O3cuZ3JpZEhlaWdodD0oMCxpLnJlYWRVaW50MzIpKGMsZCk7ZCs9NDt3LmdyaWRPZmZzZXRYPTQyOTQ5NjcyOTUmKDAsaS5yZWFkVWludDMyKShjLGQpO2QrPTQ7dy5ncmlkT2Zmc2V0WT00Mjk0OTY3Mjk1JigwLGkucmVhZFVpbnQzMikoYyxkKTtkKz00O3cuZ3JpZFZlY3Rvclg9KDAsaS5yZWFkVWludDE2KShjLGQpO2QrPTI7dy5ncmlkVmVjdG9yWT0oMCxpLnJlYWRVaW50MTYpKGMsZCk7ZCs9MjtyPVt3LGEucmVmZXJyZWRUbyxjLGQsZl07YnJlYWs7Y2FzZSAzODpjYXNlIDM5OnZhciBiPXt9O2IuaW5mbz1yZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGMsZCk7ZCs9bDt2YXIgeD1jW2QrK107Yi5tbXI9ISEoMSZ4KTtiLnRlbXBsYXRlPXg+PjEmMztiLnByZWRpY3Rpb249ISEoOCZ4KTtpZighYi5tbXIpe3M9MD09PWIudGVtcGxhdGU/NDoxO249W107Zm9yKG89MDtvPHM7bysrKXtuLnB1c2goe3g6KDAsaS5yZWFkSW50OCkoYyxkKSx5OigwLGkucmVhZEludDgpKGMsZCsxKX0pO2QrPTJ9Yi5hdD1ufXI9W2IsYyxkLGZdO2JyZWFrO2Nhc2UgNDg6dmFyIHk9e3dpZHRoOigwLGkucmVhZFVpbnQzMikoYyxkKSxoZWlnaHQ6KDAsaS5yZWFkVWludDMyKShjLGQrNCkscmVzb2x1dGlvblg6KDAsaS5yZWFkVWludDMyKShjLGQrOCkscmVzb2x1dGlvblk6KDAsaS5yZWFkVWludDMyKShjLGQrMTIpfTs0Mjk0OTY3Mjk1PT09eS5oZWlnaHQmJmRlbGV0ZSB5LmhlaWdodDt2YXIgdj1jW2QrMTZdOygwLGkucmVhZFVpbnQxNikoYyxkKzE3KTt5Lmxvc3NsZXNzPSEhKDEmdik7eS5yZWZpbmVtZW50PSEhKDImdik7eS5kZWZhdWx0UGl4ZWxWYWx1ZT12Pj4yJjE7eS5jb21iaW5hdGlvbk9wZXJhdG9yPXY+PjMmMzt5LnJlcXVpcmVzQnVmZmVyPSEhKDMyJnYpO3kuY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlPSEhKDY0JnYpO3I9W3ldO2JyZWFrO2Nhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmJyZWFrO2Nhc2UgNTM6cj1bYS5udW1iZXIsYyxkLGZdO2JyZWFrO2Nhc2UgNjI6YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcihgc2VnbWVudCB0eXBlICR7YS50eXBlTmFtZX0oJHthLnR5cGV9KSBpcyBub3QgaW1wbGVtZW50ZWRgKX12YXIgdz0ib24iK2EudHlwZU5hbWU7dyBpbiB0JiZ0W3ddLmFwcGx5KHQscil9ZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnRzKGUsdCl7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXByb2Nlc3NTZWdtZW50KGVbcl0sdCl9ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3IoKXt9U2ltcGxlU2VnbWVudFZpc2l0b3IucHJvdG90eXBlPXtvblBhZ2VJbmZvcm1hdGlvbjpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vblBhZ2VJbmZvcm1hdGlvbihlKXt0aGlzLmN1cnJlbnRQYWdlSW5mbz1lO3ZhciB0PWUud2lkdGgrNz4+MyxyPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KmUuaGVpZ2h0KTtpZihlLmRlZmF1bHRQaXhlbFZhbHVlKWZvcih2YXIgbj0wLGk9ci5sZW5ndGg7bjxpO24rKylyW25dPTI1NTt0aGlzLmJ1ZmZlcj1yfSxkcmF3Qml0bWFwOmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX2RyYXdCaXRtYXAoZSx0KXt2YXIgcixuLGksbyxzPXRoaXMuY3VycmVudFBhZ2VJbmZvLGE9ZS53aWR0aCxjPWUuaGVpZ2h0LGw9cy53aWR0aCs3Pj4zLGQ9cy5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGU/ZS5jb21iaW5hdGlvbk9wZXJhdG9yOnMuY29tYmluYXRpb25PcGVyYXRvcixmPXRoaXMuYnVmZmVyLGg9MTI4Pj4oNyZlLngpLHU9ZS55KmwrKGUueD4+Myk7c3dpdGNoKGQpe2Nhc2UgMDpmb3Iocj0wO3I8YztyKyspe2k9aDtvPXU7Zm9yKG49MDtuPGE7bisrKXt0W3JdW25dJiYoZltvXXw9aSk7aWYoIShpPj49MSkpe2k9MTI4O28rK319dSs9bH1icmVhaztjYXNlIDI6Zm9yKHI9MDtyPGM7cisrKXtpPWg7bz11O2ZvcihuPTA7bjxhO24rKyl7dFtyXVtuXSYmKGZbb11ePWkpO2lmKCEoaT4+PTEpKXtpPTEyODtvKyt9fXUrPWx9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtkfSBpcyBub3Qgc3VwcG9ydGVkYCl9fSxvbkltbWVkaWF0ZUdlbmVyaWNSZWdpb246ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uKGUsdCxyLG4pe3ZhciBpPWUuaW5mbyxvPW5ldyBEZWNvZGluZ0NvbnRleHQodCxyLG4pLHM9ZGVjb2RlQml0bWFwKGUubW1yLGkud2lkdGgsaS5oZWlnaHQsZS50ZW1wbGF0ZSxlLnByZWRpY3Rpb24sbnVsbCxlLmF0LG8pO3RoaXMuZHJhd0JpdG1hcChpLHMpfSxvbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbjpmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbigpe3RoaXMub25JbW1lZGlhdGVHZW5lcmljUmVnaW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sb25TeW1ib2xEaWN0aW9uYXJ5OmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uU3ltYm9sRGljdGlvbmFyeShlLHQscixuLG8scyl7bGV0IGEsYztpZihlLmh1ZmZtYW4pe2E9ZnVuY3Rpb24gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZSx0LHIpe2xldCBuLGksbyxzLGE9MDtzd2l0Y2goZS5odWZmbWFuREhTZWxlY3Rvcil7Y2FzZSAwOmNhc2UgMTpuPWdldFN0YW5kYXJkVGFibGUoZS5odWZmbWFuREhTZWxlY3Rvcis0KTticmVhaztjYXNlIDM6bj1nZXRDdXN0b21IdWZmbWFuVGFibGUoYSx0LHIpO2ErKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gREggc2VsZWN0b3IiKX1zd2l0Y2goZS5odWZmbWFuRFdTZWxlY3Rvcil7Y2FzZSAwOmNhc2UgMTppPWdldFN0YW5kYXJkVGFibGUoZS5odWZmbWFuRFdTZWxlY3RvcisyKTticmVhaztjYXNlIDM6aT1nZXRDdXN0b21IdWZmbWFuVGFibGUoYSx0LHIpO2ErKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFcgc2VsZWN0b3IiKX1pZihlLmJpdG1hcFNpemVTZWxlY3Rvcil7bz1nZXRDdXN0b21IdWZmbWFuVGFibGUoYSx0LHIpO2ErK31lbHNlIG89Z2V0U3RhbmRhcmRUYWJsZSgxKTtzPWUuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3Rvcj9nZXRDdXN0b21IdWZmbWFuVGFibGUoYSx0LHIpOmdldFN0YW5kYXJkVGFibGUoMSk7cmV0dXJue3RhYmxlRGVsdGFIZWlnaHQ6bix0YWJsZURlbHRhV2lkdGg6aSx0YWJsZUJpdG1hcFNpemU6byx0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczpzfX0oZSxyLHRoaXMuY3VzdG9tVGFibGVzKTtjPW5ldyBSZWFkZXIobixvLHMpfXZhciBsPXRoaXMuc3ltYm9scztsfHwodGhpcy5zeW1ib2xzPWw9e30pO2Zvcih2YXIgZD1bXSxmPTAsaD1yLmxlbmd0aDtmPGg7ZisrKXtjb25zdCBlPWxbcltmXV07ZSYmKGQ9ZC5jb25jYXQoZSkpfXZhciB1PW5ldyBEZWNvZGluZ0NvbnRleHQobixvLHMpO2xbdF09ZnVuY3Rpb24gZGVjb2RlU3ltYm9sRGljdGlvbmFyeShlLHQscixuLG8scyxhLGMsbCxkLGYsaCl7aWYoZSYmdCl0aHJvdyBuZXcgSmJpZzJFcnJvcigic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTt2YXIgdT1bXSxwPTAsbT0oMCxpLmxvZzIpKHIubGVuZ3RoK24pLGc9Zi5kZWNvZGVyLGI9Zi5jb250ZXh0Q2FjaGU7bGV0IHgseTtpZihlKXt4PWdldFN0YW5kYXJkVGFibGUoMSk7eT1bXTttPU1hdGgubWF4KG0sMSl9Zm9yKDt1Lmxlbmd0aDxuOyl7cCs9ZT9zLnRhYmxlRGVsdGFIZWlnaHQuZGVjb2RlKGgpOmRlY29kZUludGVnZXIoYiwiSUFESCIsZyk7bGV0IG49MCxpPTA7Y29uc3Qgbz1lP3kubGVuZ3RoOjA7Zm9yKDs7KXt2YXIgdix3PWU/cy50YWJsZURlbHRhV2lkdGguZGVjb2RlKGgpOmRlY29kZUludGVnZXIoYiwiSUFEVyIsZyk7aWYobnVsbD09PXcpYnJlYWs7bis9dztpKz1uO2lmKHQpe3ZhciBUPWRlY29kZUludGVnZXIoYiwiSUFBSSIsZyk7aWYoVD4xKXY9ZGVjb2RlVGV4dFJlZ2lvbihlLHQsbixwLDAsVCwxLHIuY29uY2F0KHUpLG0sMCwwLDEsMCxzLGwsZCxmLDAsaCk7ZWxzZXt2YXIgQz1kZWNvZGVJQUlEKGIsZyxtKSxJPWRlY29kZUludGVnZXIoYiwiSUFSRFgiLGcpLFA9ZGVjb2RlSW50ZWdlcihiLCJJQVJEWSIsZyk7dj1kZWNvZGVSZWZpbmVtZW50KG4scCxsLEM8ci5sZW5ndGg/cltDXTp1W0Mtci5sZW5ndGhdLEksUCwhMSxkLGYpfXUucHVzaCh2KX1lbHNlIGlmKGUpeS5wdXNoKG4pO2Vsc2V7dj1kZWNvZGVCaXRtYXAoITEsbixwLGEsITEsbnVsbCxjLGYpO3UucHVzaCh2KX19aWYoZSYmIXQpe2NvbnN0IGU9cy50YWJsZUJpdG1hcFNpemUuZGVjb2RlKGgpO2guYnl0ZUFsaWduKCk7bGV0IHQ7aWYoMD09PWUpdD1yZWFkVW5jb21wcmVzc2VkQml0bWFwKGgsaSxwKTtlbHNle2NvbnN0IHI9aC5lbmQsbj1oLnBvc2l0aW9uK2U7aC5lbmQ9bjt0PWRlY29kZU1NUkJpdG1hcChoLGkscCwhMSk7aC5lbmQ9cjtoLnBvc2l0aW9uPW59Y29uc3Qgcj15Lmxlbmd0aDtpZihvPT09ci0xKXUucHVzaCh0KTtlbHNle2xldCBlLG4saSxzLGEsYz0wO2ZvcihlPW87ZTxyO2UrKyl7cz15W2VdO2k9YytzO2E9W107Zm9yKG49MDtuPHA7bisrKWEucHVzaCh0W25dLnN1YmFycmF5KGMsaSkpO3UucHVzaChhKTtjPWl9fX19Zm9yKHZhciBrPVtdLFM9W10sXz0hMSxFPXIubGVuZ3RoK247Uy5sZW5ndGg8RTspe2Zvcih2YXIgQj1lP3guZGVjb2RlKGgpOmRlY29kZUludGVnZXIoYiwiSUFFWCIsZyk7Qi0tOylTLnB1c2goXyk7Xz0hX31mb3IodmFyIEw9MCxEPXIubGVuZ3RoO0w8RDtMKyspU1tMXSYmay5wdXNoKHJbTF0pO2Zvcih2YXIgTT0wO008bjtMKyssTSsrKVNbTF0mJmsucHVzaCh1W01dKTtyZXR1cm4ga30oZS5odWZmbWFuLGUucmVmaW5lbWVudCxkLGUubnVtYmVyT2ZOZXdTeW1ib2xzLGUubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsYSxlLnRlbXBsYXRlLGUuYXQsZS5yZWZpbmVtZW50VGVtcGxhdGUsZS5yZWZpbmVtZW50QXQsdSxjKX0sb25JbW1lZGlhdGVUZXh0UmVnaW9uOmZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlVGV4dFJlZ2lvbihlLHQscixuLG8pe3ZhciBzPWUuaW5mbztsZXQgYSxjO2Zvcih2YXIgbD10aGlzLnN5bWJvbHMsZD1bXSxmPTAsaD10Lmxlbmd0aDtmPGg7ZisrKXtjb25zdCBlPWxbdFtmXV07ZSYmKGQ9ZC5jb25jYXQoZSkpfXZhciB1PSgwLGkubG9nMikoZC5sZW5ndGgpO2lmKGUuaHVmZm1hbil7Yz1uZXcgUmVhZGVyKHIsbixvKTthPWZ1bmN0aW9uIGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKGUsdCxyLG4saSl7Y29uc3Qgbz1bXTtmb3IobGV0IGU9MDtlPD0zNDtlKyspe2NvbnN0IHQ9aS5yZWFkQml0cyg0KTtvLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtlLHQsMCwwXSkpfWNvbnN0IHM9bmV3IEh1ZmZtYW5UYWJsZShvLCExKTtvLmxlbmd0aD0wO2ZvcihsZXQgZT0wO2U8bjspe2NvbnN0IHQ9cy5kZWNvZGUoaSk7aWYodD49MzIpe2xldCByLG4scztzd2l0Y2godCl7Y2FzZSAzMjppZigwPT09ZSl0aHJvdyBuZXcgSmJpZzJFcnJvcigibm8gcHJldmlvdXMgdmFsdWUgaW4gc3ltYm9sIElEIHRhYmxlIik7bj1pLnJlYWRCaXRzKDIpKzM7cj1vW2UtMV0ucHJlZml4TGVuZ3RoO2JyZWFrO2Nhc2UgMzM6bj1pLnJlYWRCaXRzKDMpKzM7cj0wO2JyZWFrO2Nhc2UgMzQ6bj1pLnJlYWRCaXRzKDcpKzExO3I9MDticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIGNvZGUgbGVuZ3RoIGluIHN5bWJvbCBJRCB0YWJsZSIpfWZvcihzPTA7czxuO3MrKyl7by5wdXNoKG5ldyBIdWZmbWFuTGluZShbZSxyLDAsMF0pKTtlKyt9fWVsc2V7by5wdXNoKG5ldyBIdWZmbWFuTGluZShbZSx0LDAsMF0pKTtlKyt9fWkuYnl0ZUFsaWduKCk7Y29uc3QgYT1uZXcgSHVmZm1hblRhYmxlKG8sITEpO2xldCBjLGwsZCxmPTA7c3dpdGNoKGUuaHVmZm1hbkZTKXtjYXNlIDA6Y2FzZSAxOmM9Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5GUys2KTticmVhaztjYXNlIDM6Yz1nZXRDdXN0b21IdWZmbWFuVGFibGUoZix0LHIpO2YrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRlMgc2VsZWN0b3IiKX1zd2l0Y2goZS5odWZmbWFuRFMpe2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOmw9Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5EUys4KTticmVhaztjYXNlIDM6bD1nZXRDdXN0b21IdWZmbWFuVGFibGUoZix0LHIpO2YrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFMgc2VsZWN0b3IiKX1zd2l0Y2goZS5odWZmbWFuRFQpe2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOmQ9Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5EVCsxMSk7YnJlYWs7Y2FzZSAzOmQ9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKGYsdCxyKTtmKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERUIHNlbGVjdG9yIil9aWYoZS5yZWZpbmVtZW50KXRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJue3N5bWJvbElEVGFibGU6YSx0YWJsZUZpcnN0UzpjLHRhYmxlRGVsdGFTOmwsdGFibGVEZWx0YVQ6ZH19KGUsdCx0aGlzLmN1c3RvbVRhYmxlcyxkLmxlbmd0aCxjKX12YXIgcD1uZXcgRGVjb2RpbmdDb250ZXh0KHIsbixvKSxtPWRlY29kZVRleHRSZWdpb24oZS5odWZmbWFuLGUucmVmaW5lbWVudCxzLndpZHRoLHMuaGVpZ2h0LGUuZGVmYXVsdFBpeGVsVmFsdWUsZS5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyxlLnN0cmlwU2l6ZSxkLHUsZS50cmFuc3Bvc2VkLGUuZHNPZmZzZXQsZS5yZWZlcmVuY2VDb3JuZXIsZS5jb21iaW5hdGlvbk9wZXJhdG9yLGEsZS5yZWZpbmVtZW50VGVtcGxhdGUsZS5yZWZpbmVtZW50QXQscCxlLmxvZ1N0cmlwU2l6ZSxjKTt0aGlzLmRyYXdCaXRtYXAocyxtKX0sb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb246ZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG9uUGF0dGVybkRpY3Rpb25hcnkoZSx0LHIsbixpKXtsZXQgbz10aGlzLnBhdHRlcm5zO298fCh0aGlzLnBhdHRlcm5zPW89e30pO2NvbnN0IHM9bmV3IERlY29kaW5nQ29udGV4dChyLG4saSk7b1t0XT1mdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShlLHQscixuLGksbyl7Y29uc3Qgcz1bXTtpZighZSl7cy5wdXNoKHt4Oi10LHk6MH0pO2lmKDA9PT1pKXtzLnB1c2goe3g6LTMseTotMX0pO3MucHVzaCh7eDoyLHk6LTJ9KTtzLnB1c2goe3g6LTIseTotMn0pfX1jb25zdCBhPWRlY29kZUJpdG1hcChlLChuKzEpKnQscixpLCExLG51bGwscyxvKSxjPVtdO2ZvcihsZXQgZT0wO2U8PW47ZSsrKXtjb25zdCBuPVtdLGk9dCplLG89aSt0O2ZvcihsZXQgZT0wO2U8cjtlKyspbi5wdXNoKGFbZV0uc3ViYXJyYXkoaSxvKSk7Yy5wdXNoKG4pfXJldHVybiBjfShlLm1tcixlLnBhdHRlcm5XaWR0aCxlLnBhdHRlcm5IZWlnaHQsZS5tYXhQYXR0ZXJuSW5kZXgsZS50ZW1wbGF0ZSxzKX0sb25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbihlLHQscixuLG8pe2NvbnN0IHM9dGhpcy5wYXR0ZXJuc1t0WzBdXSxhPWUuaW5mbyxjPW5ldyBEZWNvZGluZ0NvbnRleHQocixuLG8pLGw9ZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24oZSx0LHIsbixvLHMsYSxjLGwsZCxmLGgsdSxwLG0pe2lmKGEpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNraXAgaXMgbm90IHN1cHBvcnRlZCIpO2lmKDAhPT1jKXRocm93IG5ldyBKYmlnMkVycm9yKCJvcGVyYXRvciAiK2MrIiBpcyBub3Qgc3VwcG9ydGVkIGluIGhhbGZ0b25lIHJlZ2lvbiIpO2NvbnN0IGc9W107bGV0IGIseCx5O2ZvcihiPTA7YjxvO2IrKyl7eT1uZXcgVWludDhBcnJheShuKTtpZihzKWZvcih4PTA7eDxuO3grKyl5W3hdPXM7Zy5wdXNoKHkpfWNvbnN0IHY9dC5sZW5ndGgsdz10WzBdLFQ9d1swXS5sZW5ndGgsQz13Lmxlbmd0aCxJPSgwLGkubG9nMikodiksUD1bXTtpZighZSl7UC5wdXNoKHt4OnI8PTE/MzoyLHk6LTF9KTtpZigwPT09cil7UC5wdXNoKHt4Oi0zLHk6LTF9KTtQLnB1c2goe3g6Mix5Oi0yfSk7UC5wdXNoKHt4Oi0yLHk6LTJ9KX19Y29uc3Qgaz1bXTtsZXQgUyxfLEUsQixMLEQsTSxPLEEsUixVO2UmJihTPW5ldyBSZWFkZXIobS5kYXRhLG0uc3RhcnQsbS5lbmQpKTtmb3IoYj1JLTE7Yj49MDtiLS0pe189ZT9kZWNvZGVNTVJCaXRtYXAoUyxsLGQsITApOmRlY29kZUJpdG1hcCghMSxsLGQsciwhMSxudWxsLFAsbSk7a1tiXT1ffWZvcihFPTA7RTxkO0UrKylmb3IoQj0wO0I8bDtCKyspe0w9MDtEPTA7Zm9yKHg9SS0xO3g+PTA7eC0tKXtMPWtbeF1bRV1bQl1eTDtEfD1MPDx4fU09dFtEXTtPPWYrRSpwK0IqdT4+ODtBPWgrRSp1LUIqcD4+ODtpZihPPj0wJiZPK1Q8PW4mJkE+PTAmJkErQzw9bylmb3IoYj0wO2I8QztiKyspe1U9Z1tBK2JdO1I9TVtiXTtmb3IoeD0wO3g8VDt4KyspVVtPK3hdfD1SW3hdfWVsc2V7bGV0IGUsdDtmb3IoYj0wO2I8QztiKyspe3Q9QStiO2lmKCEodDwwfHx0Pj1vKSl7VT1nW3RdO1I9TVtiXTtmb3IoeD0wO3g8VDt4Kyspe2U9Tyt4O2U+PTAmJmU8biYmKFVbZV18PVJbeF0pfX19fX1yZXR1cm4gZ30oZS5tbXIscyxlLnRlbXBsYXRlLGEud2lkdGgsYS5oZWlnaHQsZS5kZWZhdWx0UGl4ZWxWYWx1ZSxlLmVuYWJsZVNraXAsZS5jb21iaW5hdGlvbk9wZXJhdG9yLGUuZ3JpZFdpZHRoLGUuZ3JpZEhlaWdodCxlLmdyaWRPZmZzZXRYLGUuZ3JpZE9mZnNldFksZS5ncmlkVmVjdG9yWCxlLmdyaWRWZWN0b3JZLGMpO3RoaXMuZHJhd0JpdG1hcChhLGwpfSxvbkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvblRhYmxlcyhlLHQscixuKXtsZXQgbz10aGlzLmN1c3RvbVRhYmxlcztvfHwodGhpcy5jdXN0b21UYWJsZXM9bz17fSk7b1tlXT1mdW5jdGlvbiBkZWNvZGVUYWJsZXNTZWdtZW50KGUsdCxyKXtjb25zdCBuPWVbdF0sbz00Mjk0OTY3Mjk1JigwLGkucmVhZFVpbnQzMikoZSx0KzEpLHM9NDI5NDk2NzI5NSYoMCxpLnJlYWRVaW50MzIpKGUsdCs1KSxhPW5ldyBSZWFkZXIoZSx0KzksciksYz0xKyhuPj4xJjcpLGw9MSsobj4+NCY3KSxkPVtdO2xldCBmLGgsdT1vO2Rve2Y9YS5yZWFkQml0cyhjKTtoPWEucmVhZEJpdHMobCk7ZC5wdXNoKG5ldyBIdWZmbWFuTGluZShbdSxmLGgsMF0pKTt1Kz0xPDxofXdoaWxlKHU8cyk7Zj1hLnJlYWRCaXRzKGMpO2QucHVzaChuZXcgSHVmZm1hbkxpbmUoW28tMSxmLDMyLDAsImxvd2VyIl0pKTtmPWEucmVhZEJpdHMoYyk7ZC5wdXNoKG5ldyBIdWZmbWFuTGluZShbcyxmLDMyLDBdKSk7aWYoMSZuKXtmPWEucmVhZEJpdHMoYyk7ZC5wdXNoKG5ldyBIdWZmbWFuTGluZShbZiwwXSkpfXJldHVybiBuZXcgSHVmZm1hblRhYmxlKGQsITEpfSh0LHIsbil9fTtmdW5jdGlvbiBIdWZmbWFuTGluZShlKXtpZigyPT09ZS5sZW5ndGgpe3RoaXMuaXNPT0I9ITA7dGhpcy5yYW5nZUxvdz0wO3RoaXMucHJlZml4TGVuZ3RoPWVbMF07dGhpcy5yYW5nZUxlbmd0aD0wO3RoaXMucHJlZml4Q29kZT1lWzFdO3RoaXMuaXNMb3dlclJhbmdlPSExfWVsc2V7dGhpcy5pc09PQj0hMTt0aGlzLnJhbmdlTG93PWVbMF07dGhpcy5wcmVmaXhMZW5ndGg9ZVsxXTt0aGlzLnJhbmdlTGVuZ3RoPWVbMl07dGhpcy5wcmVmaXhDb2RlPWVbM107dGhpcy5pc0xvd2VyUmFuZ2U9Imxvd2VyIj09PWVbNF19fWZ1bmN0aW9uIEh1ZmZtYW5UcmVlTm9kZShlKXt0aGlzLmNoaWxkcmVuPVtdO2lmKGUpe3RoaXMuaXNMZWFmPSEwO3RoaXMucmFuZ2VMZW5ndGg9ZS5yYW5nZUxlbmd0aDt0aGlzLnJhbmdlTG93PWUucmFuZ2VMb3c7dGhpcy5pc0xvd2VyUmFuZ2U9ZS5pc0xvd2VyUmFuZ2U7dGhpcy5pc09PQj1lLmlzT09CfWVsc2UgdGhpcy5pc0xlYWY9ITF9SHVmZm1hblRyZWVOb2RlLnByb3RvdHlwZT17YnVpbGRUcmVlKGUsdCl7Y29uc3Qgcj1lLnByZWZpeENvZGU+PnQmMTtpZih0PD0wKXRoaXMuY2hpbGRyZW5bcl09bmV3IEh1ZmZtYW5UcmVlTm9kZShlKTtlbHNle2xldCBuPXRoaXMuY2hpbGRyZW5bcl07bnx8KHRoaXMuY2hpbGRyZW5bcl09bj1uZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpKTtuLmJ1aWxkVHJlZShlLHQtMSl9fSxkZWNvZGVOb2RlKGUpe2lmKHRoaXMuaXNMZWFmKXtpZih0aGlzLmlzT09CKXJldHVybiBudWxsO2NvbnN0IHQ9ZS5yZWFkQml0cyh0aGlzLnJhbmdlTGVuZ3RoKTtyZXR1cm4gdGhpcy5yYW5nZUxvdysodGhpcy5pc0xvd2VyUmFuZ2U/LXQ6dCl9Y29uc3QgdD10aGlzLmNoaWxkcmVuW2UucmVhZEJpdCgpXTtpZighdCl0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTtyZXR1cm4gdC5kZWNvZGVOb2RlKGUpfX07ZnVuY3Rpb24gSHVmZm1hblRhYmxlKGUsdCl7dHx8dGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhlKTt0aGlzLnJvb3ROb2RlPW5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCsrKXtjb25zdCByPWVbdF07ci5wcmVmaXhMZW5ndGg+MCYmdGhpcy5yb290Tm9kZS5idWlsZFRyZWUocixyLnByZWZpeExlbmd0aC0xKX19SHVmZm1hblRhYmxlLnByb3RvdHlwZT17ZGVjb2RlKGUpe3JldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUoZSl9LGFzc2lnblByZWZpeENvZGVzKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IHI9MDtmb3IobGV0IG49MDtuPHQ7bisrKXI9TWF0aC5tYXgocixlW25dLnByZWZpeExlbmd0aCk7Y29uc3Qgbj1uZXcgVWludDMyQXJyYXkocisxKTtmb3IobGV0IHI9MDtyPHQ7cisrKW5bZVtyXS5wcmVmaXhMZW5ndGhdKys7bGV0IGksbyxzLGE9MSxjPTA7blswXT0wO2Zvcig7YTw9cjspe2M9YytuW2EtMV08PDE7aT1jO289MDtmb3IoO288dDspe3M9ZVtvXTtpZihzLnByZWZpeExlbmd0aD09PWEpe3MucHJlZml4Q29kZT1pO2krK31vKyt9YSsrfX19O2NvbnN0IGQ9e307ZnVuY3Rpb24gZ2V0U3RhbmRhcmRUYWJsZShlKXtsZXQgdCxyPWRbZV07aWYocilyZXR1cm4gcjtzd2l0Y2goZSl7Y2FzZSAxOnQ9W1swLDEsNCwwXSxbMTYsMiw4LDJdLFsyNzIsMywxNiw2XSxbNjU4MDgsMywzMiw3XV07YnJlYWs7Y2FzZSAyOnQ9W1swLDEsMCwwXSxbMSwyLDAsMl0sWzIsMywwLDZdLFszLDQsMywxNF0sWzExLDUsNiwzMF0sWzc1LDYsMzIsNjJdLFs2LDYzXV07YnJlYWs7Y2FzZSAzOnQ9W1stMjU2LDgsOCwyNTRdLFswLDEsMCwwXSxbMSwyLDAsMl0sWzIsMywwLDZdLFszLDQsMywxNF0sWzExLDUsNiwzMF0sWy0yNTcsOCwzMiwyNTUsImxvd2VyIl0sWzc1LDcsMzIsMTI2XSxbNiw2Ml1dO2JyZWFrO2Nhc2UgNDp0PVtbMSwxLDAsMF0sWzIsMiwwLDJdLFszLDMsMCw2XSxbNCw0LDMsMTRdLFsxMiw1LDYsMzBdLFs3Niw1LDMyLDMxXV07YnJlYWs7Y2FzZSA1OnQ9W1stMjU1LDcsOCwxMjZdLFsxLDEsMCwwXSxbMiwyLDAsMl0sWzMsMywwLDZdLFs0LDQsMywxNF0sWzEyLDUsNiwzMF0sWy0yNTYsNywzMiwxMjcsImxvd2VyIl0sWzc2LDYsMzIsNjJdXTticmVhaztjYXNlIDY6dD1bWy0yMDQ4LDUsMTAsMjhdLFstMTAyNCw0LDksOF0sWy01MTIsNCw4LDldLFstMjU2LDQsNywxMF0sWy0xMjgsNSw2LDI5XSxbLTY0LDUsNSwzMF0sWy0zMiw0LDUsMTFdLFswLDIsNywwXSxbMTI4LDMsNywyXSxbMjU2LDMsOCwzXSxbNTEyLDQsOSwxMl0sWzEwMjQsNCwxMCwxM10sWy0yMDQ5LDYsMzIsNjIsImxvd2VyIl0sWzIwNDgsNiwzMiw2M11dO2JyZWFrO2Nhc2UgNzp0PVtbLTEwMjQsNCw5LDhdLFstNTEyLDMsOCwwXSxbLTI1Niw0LDcsOV0sWy0xMjgsNSw2LDI2XSxbLTY0LDUsNSwyN10sWy0zMiw0LDUsMTBdLFswLDQsNSwxMV0sWzMyLDUsNSwyOF0sWzY0LDUsNiwyOV0sWzEyOCw0LDcsMTJdLFsyNTYsMyw4LDFdLFs1MTIsMyw5LDJdLFsxMDI0LDMsMTAsM10sWy0xMDI1LDUsMzIsMzAsImxvd2VyIl0sWzIwNDgsNSwzMiwzMV1dO2JyZWFrO2Nhc2UgODp0PVtbLTE1LDgsMywyNTJdLFstNyw5LDEsNTA4XSxbLTUsOCwxLDI1M10sWy0zLDksMCw1MDldLFstMiw3LDAsMTI0XSxbLTEsNCwwLDEwXSxbMCwyLDEsMF0sWzIsNSwwLDI2XSxbMyw2LDAsNThdLFs0LDMsNCw0XSxbMjAsNiwxLDU5XSxbMjIsNCw0LDExXSxbMzgsNCw1LDEyXSxbNzAsNSw2LDI3XSxbMTM0LDUsNywyOF0sWzI2Miw2LDcsNjBdLFszOTAsNyw4LDEyNV0sWzY0Niw2LDEwLDYxXSxbLTE2LDksMzIsNTEwLCJsb3dlciJdLFsxNjcwLDksMzIsNTExXSxbMiwxXV07YnJlYWs7Y2FzZSA5OnQ9W1stMzEsOCw0LDI1Ml0sWy0xNSw5LDIsNTA4XSxbLTExLDgsMiwyNTNdLFstNyw5LDEsNTA5XSxbLTUsNywxLDEyNF0sWy0zLDQsMSwxMF0sWy0xLDMsMSwyXSxbMSwzLDEsM10sWzMsNSwxLDI2XSxbNSw2LDEsNThdLFs3LDMsNSw0XSxbMzksNiwyLDU5XSxbNDMsNCw1LDExXSxbNzUsNCw2LDEyXSxbMTM5LDUsNywyN10sWzI2Nyw1LDgsMjhdLFs1MjMsNiw4LDYwXSxbNzc5LDcsOSwxMjVdLFsxMjkxLDYsMTEsNjFdLFstMzIsOSwzMiw1MTAsImxvd2VyIl0sWzMzMzksOSwzMiw1MTFdLFsyLDBdXTticmVhaztjYXNlIDEwOnQ9W1stMjEsNyw0LDEyMl0sWy01LDgsMCwyNTJdLFstNCw3LDAsMTIzXSxbLTMsNSwwLDI0XSxbLTIsMiwyLDBdLFsyLDUsMCwyNV0sWzMsNiwwLDU0XSxbNCw3LDAsMTI0XSxbNSw4LDAsMjUzXSxbNiwyLDYsMV0sWzcwLDUsNSwyNl0sWzEwMiw2LDUsNTVdLFsxMzQsNiw2LDU2XSxbMTk4LDYsNyw1N10sWzMyNiw2LDgsNThdLFs1ODIsNiw5LDU5XSxbMTA5NCw2LDEwLDYwXSxbMjExOCw3LDExLDEyNV0sWy0yMiw4LDMyLDI1NCwibG93ZXIiXSxbNDE2Niw4LDMyLDI1NV0sWzIsMl1dO2JyZWFrO2Nhc2UgMTE6dD1bWzEsMSwwLDBdLFsyLDIsMSwyXSxbNCw0LDAsMTJdLFs1LDQsMSwxM10sWzcsNSwxLDI4XSxbOSw1LDIsMjldLFsxMyw2LDIsNjBdLFsxNyw3LDIsMTIyXSxbMjEsNywzLDEyM10sWzI5LDcsNCwxMjRdLFs0NSw3LDUsMTI1XSxbNzcsNyw2LDEyNl0sWzE0MSw3LDMyLDEyN11dO2JyZWFrO2Nhc2UgMTI6dD1bWzEsMSwwLDBdLFsyLDIsMCwyXSxbMywzLDEsNl0sWzUsNSwwLDI4XSxbNiw1LDEsMjldLFs4LDYsMSw2MF0sWzEwLDcsMCwxMjJdLFsxMSw3LDEsMTIzXSxbMTMsNywyLDEyNF0sWzE3LDcsMywxMjVdLFsyNSw3LDQsMTI2XSxbNDEsOCw1LDI1NF0sWzczLDgsMzIsMjU1XV07YnJlYWs7Y2FzZSAxMzp0PVtbMSwxLDAsMF0sWzIsMywwLDRdLFszLDQsMCwxMl0sWzQsNSwwLDI4XSxbNSw0LDEsMTNdLFs3LDMsMyw1XSxbMTUsNiwxLDU4XSxbMTcsNiwyLDU5XSxbMjEsNiwzLDYwXSxbMjksNiw0LDYxXSxbNDUsNiw1LDYyXSxbNzcsNyw2LDEyNl0sWzE0MSw3LDMyLDEyN11dO2JyZWFrO2Nhc2UgMTQ6dD1bWy0yLDMsMCw0XSxbLTEsMywwLDVdLFswLDEsMCwwXSxbMSwzLDAsNl0sWzIsMywwLDddXTticmVhaztjYXNlIDE1OnQ9W1stMjQsNyw0LDEyNF0sWy04LDYsMiw2MF0sWy00LDUsMSwyOF0sWy0yLDQsMCwxMl0sWy0xLDMsMCw0XSxbMCwxLDAsMF0sWzEsMywwLDVdLFsyLDQsMCwxM10sWzMsNSwxLDI5XSxbNSw2LDIsNjFdLFs5LDcsNCwxMjVdLFstMjUsNywzMiwxMjYsImxvd2VyIl0sWzI1LDcsMzIsMTI3XV07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke2V9IGRvZXMgbm90IGV4aXN0YCl9Zm9yKGxldCBlPTAscj10Lmxlbmd0aDtlPHI7ZSsrKXRbZV09bmV3IEh1ZmZtYW5MaW5lKHRbZV0pO3I9bmV3IEh1ZmZtYW5UYWJsZSh0LCEwKTtkW2VdPXI7cmV0dXJuIHJ9ZnVuY3Rpb24gUmVhZGVyKGUsdCxyKXt0aGlzLmRhdGE9ZTt0aGlzLnN0YXJ0PXQ7dGhpcy5lbmQ9cjt0aGlzLnBvc2l0aW9uPXQ7dGhpcy5zaGlmdD0tMTt0aGlzLmN1cnJlbnRCeXRlPTB9UmVhZGVyLnByb3RvdHlwZT17cmVhZEJpdCgpe2lmKHRoaXMuc2hpZnQ8MCl7aWYodGhpcy5wb3NpdGlvbj49dGhpcy5lbmQpdGhyb3cgbmV3IEpiaWcyRXJyb3IoImVuZCBvZiBkYXRhIHdoaWxlIHJlYWRpbmcgYml0Iik7dGhpcy5jdXJyZW50Qnl0ZT10aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTt0aGlzLnNoaWZ0PTd9Y29uc3QgZT10aGlzLmN1cnJlbnRCeXRlPj50aGlzLnNoaWZ0JjE7dGhpcy5zaGlmdC0tO3JldHVybiBlfSxyZWFkQml0cyhlKXtsZXQgdCxyPTA7Zm9yKHQ9ZS0xO3Q+PTA7dC0tKXJ8PXRoaXMucmVhZEJpdCgpPDx0O3JldHVybiByfSxieXRlQWxpZ24oKXt0aGlzLnNoaWZ0PS0xfSxuZXh0KCl7cmV0dXJuIHRoaXMucG9zaXRpb24+PXRoaXMuZW5kPy0xOnRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdfX07ZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGUsdCxyKXtsZXQgbj0wO2ZvcihsZXQgaT0wLG89dC5sZW5ndGg7aTxvO2krKyl7Y29uc3Qgbz1yW3RbaV1dO2lmKG8pe2lmKGU9PT1uKXJldHVybiBvO24rK319dGhyb3cgbmV3IEpiaWcyRXJyb3IoImNhbid0IGZpbmQgY3VzdG9tIEh1ZmZtYW4gdGFibGUiKX1mdW5jdGlvbiByZWFkVW5jb21wcmVzc2VkQml0bWFwKGUsdCxyKXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wO2k8cjtpKyspe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkodCk7bi5wdXNoKHIpO2ZvcihsZXQgbj0wO248dDtuKyspcltuXT1lLnJlYWRCaXQoKTtlLmJ5dGVBbGlnbigpfXJldHVybiBufWZ1bmN0aW9uIGRlY29kZU1NUkJpdG1hcChlLHQscixuKXtjb25zdCBpPXtLOi0xLENvbHVtbnM6dCxSb3dzOnIsQmxhY2tJczE6ITAsRW5kT2ZCbG9jazpufSxvPW5ldyBzLkNDSVRURmF4RGVjb2RlcihlLGkpLGE9W107bGV0IGMsbD0hMTtmb3IobGV0IGU9MDtlPHI7ZSsrKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQpO2EucHVzaChlKTtsZXQgcj0tMTtmb3IobGV0IG49MDtuPHQ7bisrKXtpZihyPDApe2M9by5yZWFkTmV4dENoYXIoKTtpZigtMT09PWMpe2M9MDtsPSEwfXI9N31lW25dPWM+PnImMTtyLS19fWlmKG4mJiFsKXtjb25zdCBlPTU7Zm9yKGxldCB0PTA7dDxlJiYtMSE9PW8ucmVhZE5leHRDaGFyKCk7dCsrKTt9cmV0dXJuIGF9ZnVuY3Rpb24gSmJpZzJJbWFnZSgpe31KYmlnMkltYWdlLnByb3RvdHlwZT17cGFyc2VDaHVua3M6ZT0+ZnVuY3Rpb24gcGFyc2VKYmlnMkNodW5rcyhlKXtmb3IodmFyIHQ9bmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yLHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe3ZhciBpPWVbcl07cHJvY2Vzc1NlZ21lbnRzKHJlYWRTZWdtZW50cyh7fSxpLmRhdGEsaS5zdGFydCxpLmVuZCksdCl9cmV0dXJuIHQuYnVmZmVyfShlKSxwYXJzZShlKXtjb25zdHtpbWdEYXRhOnQsd2lkdGg6cixoZWlnaHQ6bn09ZnVuY3Rpb24gcGFyc2VKYmlnMihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCByPTA7aWYoMTUxIT09ZVtyXXx8NzQhPT1lW3IrMV18fDY2IT09ZVtyKzJdfHw1MCE9PWVbciszXXx8MTMhPT1lW3IrNF18fDEwIT09ZVtyKzVdfHwyNiE9PWVbcis2XXx8MTAhPT1lW3IrN10pdGhyb3cgbmV3IEpiaWcyRXJyb3IoInBhcnNlSmJpZzIgLSBpbnZhbGlkIGhlYWRlci4iKTtjb25zdCBuPU9iamVjdC5jcmVhdGUobnVsbCk7cis9ODtjb25zdCBvPWVbcisrXTtuLnJhbmRvbUFjY2Vzcz0hKDEmbyk7aWYoISgyJm8pKXtuLm51bWJlck9mUGFnZXM9KDAsaS5yZWFkVWludDMyKShlLHIpO3IrPTR9Y29uc3Qgcz1yZWFkU2VnbWVudHMobixlLHIsdCksYT1uZXcgU2ltcGxlU2VnbWVudFZpc2l0b3I7cHJvY2Vzc1NlZ21lbnRzKHMsYSk7Y29uc3R7d2lkdGg6YyxoZWlnaHQ6bH09YS5jdXJyZW50UGFnZUluZm8sZD1hLmJ1ZmZlcixmPW5ldyBVaW50OENsYW1wZWRBcnJheShjKmwpO2xldCBoPTAsdT0wO2ZvcihsZXQgZT0wO2U8bDtlKyspe2xldCBlLHQ9MDtmb3IobGV0IHI9MDtyPGM7cisrKXtpZighdCl7dD0xMjg7ZT1kW3UrK119ZltoKytdPWUmdD8wOjI1NTt0Pj49MX19cmV0dXJue2ltZ0RhdGE6Zix3aWR0aDpjLGhlaWdodDpsfX0oZSk7dGhpcy53aWR0aD1yO3RoaXMuaGVpZ2h0PW47cmV0dXJuIHR9fTtyZXR1cm4gSmJpZzJJbWFnZX0oKTt0LkpiaWcySW1hZ2U9YX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5nZXRMb29rdXBUYWJsZUZhY3Rvcnk9ZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGUpe2xldCB0O3JldHVybiBmdW5jdGlvbigpe2lmKGUpe3Q9T2JqZWN0LmNyZWF0ZShudWxsKTtlKHQpO2U9bnVsbH1yZXR1cm4gdH19O3QuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eT1mdW5jdGlvbiBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHtkaWN0OmUsa2V5OnQsZ2V0QXJyYXk6cj0hMSxzdG9wV2hlbkZvdW5kOmk9ITB9KXtsZXQgbyxzPTA7Zm9yKDtlOyl7Y29uc3QgYT1yP2UuZ2V0QXJyYXkodCk6ZS5nZXQodCk7aWYodm9pZCAwIT09YSl7aWYoaSlyZXR1cm4gYTtvfHwobz1bXSk7by5wdXNoKGEpfWlmKCsrcz4xMDApeygwLG4ud2FybikoYGdldEluaGVyaXRhYmxlUHJvcGVydHk6IG1heGltdW0gbG9vcCBjb3VudCBleGNlZWRlZCBmb3IgIiR7dH0iYCk7YnJlYWt9ZT1lLmdldCgiUGFyZW50Iil9cmV0dXJuIG99O3QudG9Sb21hbk51bWVyYWxzPWZ1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhlLHQ9ITEpeygwLG4uYXNzZXJ0KShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPjAsIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4iKTtjb25zdCByPVtdO2xldCBvO2Zvcig7ZT49MWUzOyl7ZS09MWUzO3IucHVzaCgiTSIpfW89ZS8xMDB8MDtlJT0xMDA7ci5wdXNoKGlbb10pO289ZS8xMHwwO2UlPTEwO3IucHVzaChpWzEwK29dKTtyLnB1c2goaVsyMCtlXSk7Y29uc3Qgcz1yLmpvaW4oIiIpO3JldHVybiB0P3MudG9Mb3dlckNhc2UoKTpzfTt0LmxvZzI9ZnVuY3Rpb24gbG9nMihlKXtpZihlPD0wKXJldHVybiAwO3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2cyKGUpKX07dC5yZWFkSW50OD1mdW5jdGlvbiByZWFkSW50OChlLHQpe3JldHVybiBlW3RdPDwyND4+MjR9O3QucmVhZFVpbnQxNj1mdW5jdGlvbiByZWFkVWludDE2KGUsdCl7cmV0dXJuIGVbdF08PDh8ZVt0KzFdfTt0LnJlYWRVaW50MzI9ZnVuY3Rpb24gcmVhZFVpbnQzMihlLHQpe3JldHVybihlW3RdPDwyNHxlW3QrMV08PDE2fGVbdCsyXTw8OHxlW3QrM10pPj4+MH07dC5pc1doaXRlU3BhY2U9ZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGUpe3JldHVybiAzMj09PWV8fDk9PT1lfHwxMz09PWV8fDEwPT09ZX07dC5YUmVmUGFyc2VFeGNlcHRpb249dC5YUmVmRW50cnlFeGNlcHRpb249dC5NaXNzaW5nRGF0YUV4Y2VwdGlvbj12b2lkIDA7dmFyIG49cigxKTtjbGFzcyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGBNaXNzaW5nIGRhdGEgWyR7ZX0sICR7dH0pYCk7dGhpcy5iZWdpbj1lO3RoaXMuZW5kPXR9fXQuTWlzc2luZ0RhdGFFeGNlcHRpb249TWlzc2luZ0RhdGFFeGNlcHRpb247Y2xhc3MgWFJlZkVudHJ5RXhjZXB0aW9uIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue310LlhSZWZFbnRyeUV4Y2VwdGlvbj1YUmVmRW50cnlFeGNlcHRpb247Y2xhc3MgWFJlZlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue310LlhSZWZQYXJzZUV4Y2VwdGlvbj1YUmVmUGFyc2VFeGNlcHRpb247Y29uc3QgaT1bIiIsIkMiLCJDQyIsIkNDQyIsIkNEIiwiRCIsIkRDIiwiRENDIiwiRENDQyIsIkNNIiwiIiwiWCIsIlhYIiwiWFhYIiwiWEwiLCJMIiwiTFgiLCJMWFgiLCJMWFhYIiwiWEMiLCIiLCJJIiwiSUkiLCJJSUkiLCJJViIsIlYiLCJWSSIsIlZJSSIsIlZJSUkiLCJJWCJdfSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkFyaXRobWV0aWNEZWNvZGVyPXZvaWQgMDtjb25zdCBuPVt7cWU6MjIwMTcsbm1wczoxLG5scHM6MSxzd2l0Y2hGbGFnOjF9LHtxZToxMzMxMyxubXBzOjIsbmxwczo2LHN3aXRjaEZsYWc6MH0se3FlOjYxNDUsbm1wczozLG5scHM6OSxzd2l0Y2hGbGFnOjB9LHtxZToyNzUzLG5tcHM6NCxubHBzOjEyLHN3aXRjaEZsYWc6MH0se3FlOjEzMTMsbm1wczo1LG5scHM6Mjksc3dpdGNoRmxhZzowfSx7cWU6NTQ1LG5tcHM6MzgsbmxwczozMyxzd2l0Y2hGbGFnOjB9LHtxZToyMjAxNyxubXBzOjcsbmxwczo2LHN3aXRjaEZsYWc6MX0se3FlOjIxNTA1LG5tcHM6OCxubHBzOjE0LHN3aXRjaEZsYWc6MH0se3FlOjE4NDMzLG5tcHM6OSxubHBzOjE0LHN3aXRjaEZsYWc6MH0se3FlOjE0MzM3LG5tcHM6MTAsbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxMjI4OSxubXBzOjExLG5scHM6MTcsc3dpdGNoRmxhZzowfSx7cWU6OTIxNyxubXBzOjEyLG5scHM6MTgsc3dpdGNoRmxhZzowfSx7cWU6NzE2OSxubXBzOjEzLG5scHM6MjAsc3dpdGNoRmxhZzowfSx7cWU6NTYzMyxubXBzOjI5LG5scHM6MjEsc3dpdGNoRmxhZzowfSx7cWU6MjIwMTcsbm1wczoxNSxubHBzOjE0LHN3aXRjaEZsYWc6MX0se3FlOjIxNTA1LG5tcHM6MTYsbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToyMDczNyxubXBzOjE3LG5scHM6MTUsc3dpdGNoRmxhZzowfSx7cWU6MTg0MzMsbm1wczoxOCxubHBzOjE2LHN3aXRjaEZsYWc6MH0se3FlOjE0MzM3LG5tcHM6MTksbmxwczoxNyxzd2l0Y2hGbGFnOjB9LHtxZToxMzMxMyxubXBzOjIwLG5scHM6MTgsc3dpdGNoRmxhZzowfSx7cWU6MTIyODksbm1wczoyMSxubHBzOjE5LHN3aXRjaEZsYWc6MH0se3FlOjEwMjQxLG5tcHM6MjIsbmxwczoxOSxzd2l0Y2hGbGFnOjB9LHtxZTo5MjE3LG5tcHM6MjMsbmxwczoyMCxzd2l0Y2hGbGFnOjB9LHtxZTo4NzA1LG5tcHM6MjQsbmxwczoyMSxzd2l0Y2hGbGFnOjB9LHtxZTo3MTY5LG5tcHM6MjUsbmxwczoyMixzd2l0Y2hGbGFnOjB9LHtxZTo2MTQ1LG5tcHM6MjYsbmxwczoyMyxzd2l0Y2hGbGFnOjB9LHtxZTo1NjMzLG5tcHM6MjcsbmxwczoyNCxzd2l0Y2hGbGFnOjB9LHtxZTo1MTIxLG5tcHM6MjgsbmxwczoyNSxzd2l0Y2hGbGFnOjB9LHtxZTo0NjA5LG5tcHM6MjksbmxwczoyNixzd2l0Y2hGbGFnOjB9LHtxZTo0MzUzLG5tcHM6MzAsbmxwczoyNyxzd2l0Y2hGbGFnOjB9LHtxZToyNzUzLG5tcHM6MzEsbmxwczoyOCxzd2l0Y2hGbGFnOjB9LHtxZToyNDk3LG5tcHM6MzIsbmxwczoyOSxzd2l0Y2hGbGFnOjB9LHtxZToyMjA5LG5tcHM6MzMsbmxwczozMCxzd2l0Y2hGbGFnOjB9LHtxZToxMzEzLG5tcHM6MzQsbmxwczozMSxzd2l0Y2hGbGFnOjB9LHtxZToxMDg5LG5tcHM6MzUsbmxwczozMixzd2l0Y2hGbGFnOjB9LHtxZTo2NzMsbm1wczozNixubHBzOjMzLHN3aXRjaEZsYWc6MH0se3FlOjU0NSxubXBzOjM3LG5scHM6MzQsc3dpdGNoRmxhZzowfSx7cWU6MzIxLG5tcHM6MzgsbmxwczozNSxzd2l0Y2hGbGFnOjB9LHtxZToyNzMsbm1wczozOSxubHBzOjM2LHN3aXRjaEZsYWc6MH0se3FlOjEzMyxubXBzOjQwLG5scHM6Mzcsc3dpdGNoRmxhZzowfSx7cWU6NzMsbm1wczo0MSxubHBzOjM4LHN3aXRjaEZsYWc6MH0se3FlOjM3LG5tcHM6NDIsbmxwczozOSxzd2l0Y2hGbGFnOjB9LHtxZToyMSxubXBzOjQzLG5scHM6NDAsc3dpdGNoRmxhZzowfSx7cWU6OSxubXBzOjQ0LG5scHM6NDEsc3dpdGNoRmxhZzowfSx7cWU6NSxubXBzOjQ1LG5scHM6NDIsc3dpdGNoRmxhZzowfSx7cWU6MSxubXBzOjQ1LG5scHM6NDMsc3dpdGNoRmxhZzowfSx7cWU6MjIwMTcsbm1wczo0NixubHBzOjQ2LHN3aXRjaEZsYWc6MH1dO3QuQXJpdGhtZXRpY0RlY29kZXI9Y2xhc3MgQXJpdGhtZXRpY0RlY29kZXJ7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuZGF0YT1lO3RoaXMuYnA9dDt0aGlzLmRhdGFFbmQ9cjt0aGlzLmNoaWdoPWVbdF07dGhpcy5jbG93PTA7dGhpcy5ieXRlSW4oKTt0aGlzLmNoaWdoPXRoaXMuY2hpZ2g8PDcmNjU1MzV8dGhpcy5jbG93Pj45JjEyNzt0aGlzLmNsb3c9dGhpcy5jbG93PDw3JjY1NTM1O3RoaXMuY3QtPTc7dGhpcy5hPTMyNzY4fWJ5dGVJbigpe2NvbnN0IGU9dGhpcy5kYXRhO2xldCB0PXRoaXMuYnA7aWYoMjU1PT09ZVt0XSlpZihlW3QrMV0+MTQzKXt0aGlzLmNsb3crPTY1MjgwO3RoaXMuY3Q9OH1lbHNle3QrKzt0aGlzLmNsb3crPWVbdF08PDk7dGhpcy5jdD03O3RoaXMuYnA9dH1lbHNle3QrKzt0aGlzLmNsb3crPXQ8dGhpcy5kYXRhRW5kP2VbdF08PDg6NjUyODA7dGhpcy5jdD04O3RoaXMuYnA9dH1pZih0aGlzLmNsb3c+NjU1MzUpe3RoaXMuY2hpZ2grPXRoaXMuY2xvdz4+MTY7dGhpcy5jbG93Jj02NTUzNX19cmVhZEJpdChlLHQpe2xldCByPWVbdF0+PjEsaT0xJmVbdF07Y29uc3Qgbz1uW3JdLHM9by5xZTtsZXQgYSxjPXRoaXMuYS1zO2lmKHRoaXMuY2hpZ2g8cylpZihjPHMpe2M9czthPWk7cj1vLm5tcHN9ZWxzZXtjPXM7YT0xXmk7MT09PW8uc3dpdGNoRmxhZyYmKGk9YSk7cj1vLm5scHN9ZWxzZXt0aGlzLmNoaWdoLT1zO2lmKDAhPSgzMjc2OCZjKSl7dGhpcy5hPWM7cmV0dXJuIGl9aWYoYzxzKXthPTFeaTsxPT09by5zd2l0Y2hGbGFnJiYoaT1hKTtyPW8ubmxwc31lbHNle2E9aTtyPW8ubm1wc319ZG97MD09PXRoaXMuY3QmJnRoaXMuYnl0ZUluKCk7Yzw8PTE7dGhpcy5jaGlnaD10aGlzLmNoaWdoPDwxJjY1NTM1fHRoaXMuY2xvdz4+MTUmMTt0aGlzLmNsb3c9dGhpcy5jbG93PDwxJjY1NTM1O3RoaXMuY3QtLX13aGlsZSgwPT0oMzI3NjgmYykpO3RoaXMuYT1jO2VbdF09cjw8MXxpO3JldHVybiBhfX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQ0NJVFRGYXhEZWNvZGVyPXZvaWQgMDt2YXIgbj1yKDEpO2NvbnN0IGk9ZnVuY3Rpb24gQ0NJVFRGYXhEZWNvZGVyKCl7Y29uc3QgZT1bWy0xLC0xXSxbLTEsLTFdLFs3LDhdLFs3LDddLFs2LDZdLFs2LDZdLFs2LDVdLFs2LDVdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdXSx0PVtbLTEsLTFdLFsxMiwtMl0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0OTZdLFsxMiwyNTYwXV0scj1bWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbOCwyOV0sWzgsMjldLFs4LDMwXSxbOCwzMF0sWzgsNDVdLFs4LDQ1XSxbOCw0Nl0sWzgsNDZdLFs3LDIyXSxbNywyMl0sWzcsMjJdLFs3LDIyXSxbNywyM10sWzcsMjNdLFs3LDIzXSxbNywyM10sWzgsNDddLFs4LDQ3XSxbOCw0OF0sWzgsNDhdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzcsMjBdLFs3LDIwXSxbNywyMF0sWzcsMjBdLFs4LDMzXSxbOCwzM10sWzgsMzRdLFs4LDM0XSxbOCwzNV0sWzgsMzVdLFs4LDM2XSxbOCwzNl0sWzgsMzddLFs4LDM3XSxbOCwzOF0sWzgsMzhdLFs3LDE5XSxbNywxOV0sWzcsMTldLFs3LDE5XSxbOCwzMV0sWzgsMzFdLFs4LDMyXSxbOCwzMl0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbOCw1M10sWzgsNTNdLFs4LDU0XSxbOCw1NF0sWzcsMjZdLFs3LDI2XSxbNywyNl0sWzcsMjZdLFs4LDM5XSxbOCwzOV0sWzgsNDBdLFs4LDQwXSxbOCw0MV0sWzgsNDFdLFs4LDQyXSxbOCw0Ml0sWzgsNDNdLFs4LDQzXSxbOCw0NF0sWzgsNDRdLFs3LDIxXSxbNywyMV0sWzcsMjFdLFs3LDIxXSxbNywyOF0sWzcsMjhdLFs3LDI4XSxbNywyOF0sWzgsNjFdLFs4LDYxXSxbOCw2Ml0sWzgsNjJdLFs4LDYzXSxbOCw2M10sWzgsMF0sWzgsMF0sWzgsMzIwXSxbOCwzMjBdLFs4LDM4NF0sWzgsMzg0XSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs3LDI3XSxbNywyN10sWzcsMjddLFs3LDI3XSxbOCw1OV0sWzgsNTldLFs4LDYwXSxbOCw2MF0sWzksMTQ3Ml0sWzksMTUzNl0sWzksMTYwMF0sWzksMTcyOF0sWzcsMThdLFs3LDE4XSxbNywxOF0sWzcsMThdLFs3LDI0XSxbNywyNF0sWzcsMjRdLFs3LDI0XSxbOCw0OV0sWzgsNDldLFs4LDUwXSxbOCw1MF0sWzgsNTFdLFs4LDUxXSxbOCw1Ml0sWzgsNTJdLFs3LDI1XSxbNywyNV0sWzcsMjVdLFs3LDI1XSxbOCw1NV0sWzgsNTVdLFs4LDU2XSxbOCw1Nl0sWzgsNTddLFs4LDU3XSxbOCw1OF0sWzgsNThdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbOCw0NDhdLFs4LDQ0OF0sWzgsNTEyXSxbOCw1MTJdLFs5LDcwNF0sWzksNzY4XSxbOCw2NDBdLFs4LDY0MF0sWzgsNTc2XSxbOCw1NzZdLFs5LDgzMl0sWzksODk2XSxbOSw5NjBdLFs5LDEwMjRdLFs5LDEwODhdLFs5LDExNTJdLFs5LDEyMTZdLFs5LDEyODBdLFs5LDEzNDRdLFs5LDE0MDhdLFs3LDI1Nl0sWzcsMjU2XSxbNywyNTZdLFs3LDI1Nl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XV0saT1bWy0xLC0xXSxbLTEsLTFdLFsxMiwtMl0sWzEyLC0yXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTIsMTk4NF0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjA0OF0sWzEyLDIxMTJdLFsxMiwyMTEyXSxbMTIsMjE3Nl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjI0MF0sWzEyLDIzMDRdLFsxMiwyMzA0XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTg1Nl0sWzExLDE5MjBdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjM2OF0sWzEyLDI0MzJdLFsxMiwyNDMyXSxbMTIsMjQ5Nl0sWzEyLDI0OTZdLFsxMiwyNTYwXSxbMTIsMjU2MF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMiw1Ml0sWzEyLDUyXSxbMTMsNjQwXSxbMTMsNzA0XSxbMTMsNzY4XSxbMTMsODMyXSxbMTIsNTVdLFsxMiw1NV0sWzEyLDU2XSxbMTIsNTZdLFsxMywxMjgwXSxbMTMsMTM0NF0sWzEzLDE0MDhdLFsxMywxNDcyXSxbMTIsNTldLFsxMiw1OV0sWzEyLDYwXSxbMTIsNjBdLFsxMywxNTM2XSxbMTMsMTYwMF0sWzExLDI0XSxbMTEsMjRdLFsxMSwyNF0sWzExLDI0XSxbMTEsMjVdLFsxMSwyNV0sWzExLDI1XSxbMTEsMjVdLFsxMywxNjY0XSxbMTMsMTcyOF0sWzEyLDMyMF0sWzEyLDMyMF0sWzEyLDM4NF0sWzEyLDM4NF0sWzEyLDQ0OF0sWzEyLDQ0OF0sWzEzLDUxMl0sWzEzLDU3Nl0sWzEyLDUzXSxbMTIsNTNdLFsxMiw1NF0sWzEyLDU0XSxbMTMsODk2XSxbMTMsOTYwXSxbMTMsMTAyNF0sWzEzLDEwODhdLFsxMywxMTUyXSxbMTMsMTIxNl0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdXSxvPVtbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzExLDIzXSxbMTEsMjNdLFsxMiw1MF0sWzEyLDUxXSxbMTIsNDRdLFsxMiw0NV0sWzEyLDQ2XSxbMTIsNDddLFsxMiw1N10sWzEyLDU4XSxbMTIsNjFdLFsxMiwyNTZdLFsxMCwxNl0sWzEwLDE2XSxbMTAsMTZdLFsxMCwxNl0sWzEwLDE3XSxbMTAsMTddLFsxMCwxN10sWzEwLDE3XSxbMTIsNDhdLFsxMiw0OV0sWzEyLDYyXSxbMTIsNjNdLFsxMiwzMF0sWzEyLDMxXSxbMTIsMzJdLFsxMiwzM10sWzEyLDQwXSxbMTIsNDFdLFsxMSwyMl0sWzExLDIyXSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzEyLDEyOF0sWzEyLDE5Ml0sWzEyLDI2XSxbMTIsMjddLFsxMiwyOF0sWzEyLDI5XSxbMTEsMTldLFsxMSwxOV0sWzExLDIwXSxbMTEsMjBdLFsxMiwzNF0sWzEyLDM1XSxbMTIsMzZdLFsxMiwzN10sWzEyLDM4XSxbMTIsMzldLFsxMSwyMV0sWzExLDIxXSxbMTIsNDJdLFsxMiw0M10sWzEwLDBdLFsxMCwwXSxbMTAsMF0sWzEwLDBdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl1dLHM9W1stMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzYsOV0sWzYsOF0sWzUsN10sWzUsN10sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl1dO2Z1bmN0aW9uIENDSVRURmF4RGVjb2RlcihlLHQ9e30pe2lmKCFlfHwiZnVuY3Rpb24iIT10eXBlb2YgZS5uZXh0KXRocm93IG5ldyBFcnJvcignQ0NJVFRGYXhEZWNvZGVyIC0gaW52YWxpZCAic291cmNlIiBwYXJhbWV0ZXIuJyk7dGhpcy5zb3VyY2U9ZTt0aGlzLmVvZj0hMTt0aGlzLmVuY29kaW5nPXQuS3x8MDt0aGlzLmVvbGluZT10LkVuZE9mTGluZXx8ITE7dGhpcy5ieXRlQWxpZ249dC5FbmNvZGVkQnl0ZUFsaWdufHwhMTt0aGlzLmNvbHVtbnM9dC5Db2x1bW5zfHwxNzI4O3RoaXMucm93cz10LlJvd3N8fDA7bGV0IHIsbj10LkVuZE9mQmxvY2s7bnVsbD09biYmKG49ITApO3RoaXMuZW9ibG9jaz1uO3RoaXMuYmxhY2s9dC5CbGFja0lzMXx8ITE7dGhpcy5jb2RpbmdMaW5lPW5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMrMSk7dGhpcy5yZWZMaW5lPW5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMrMik7dGhpcy5jb2RpbmdMaW5lWzBdPXRoaXMuY29sdW1uczt0aGlzLmNvZGluZ1Bvcz0wO3RoaXMucm93PTA7dGhpcy5uZXh0TGluZTJEPXRoaXMuZW5jb2Rpbmc8MDt0aGlzLmlucHV0Qml0cz0wO3RoaXMuaW5wdXRCdWY9MDt0aGlzLm91dHB1dEJpdHM9MDt0aGlzLnJvd3NEb25lPSExO2Zvcig7MD09PShyPXRoaXMuX2xvb2tCaXRzKDEyKSk7KXRoaXMuX2VhdEJpdHMoMSk7MT09PXImJnRoaXMuX2VhdEJpdHMoMTIpO2lmKHRoaXMuZW5jb2Rpbmc+MCl7dGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfX1DQ0lUVEZheERlY29kZXIucHJvdG90eXBlPXtyZWFkTmV4dENoYXIoKXtpZih0aGlzLmVvZilyZXR1cm4tMTtjb25zdCBlPXRoaXMucmVmTGluZSx0PXRoaXMuY29kaW5nTGluZSxyPXRoaXMuY29sdW1ucztsZXQgaSxvLHMsYSxjO2lmKDA9PT10aGlzLm91dHB1dEJpdHMpe3RoaXMucm93c0RvbmUmJih0aGlzLmVvZj0hMCk7aWYodGhpcy5lb2YpcmV0dXJuLTE7dGhpcy5lcnI9ITE7bGV0IHMsYyxsO2lmKHRoaXMubmV4dExpbmUyRCl7Zm9yKGE9MDt0W2FdPHI7KythKWVbYV09dFthXTtlW2ErK109cjtlW2FdPXI7dFswXT0wO3RoaXMuY29kaW5nUG9zPTA7aT0wO289MDtmb3IoO3RbdGhpcy5jb2RpbmdQb3NdPHI7KXtzPXRoaXMuX2dldFR3b0RpbUNvZGUoKTtzd2l0Y2gocyl7Y2FzZSAwOnRoaXMuX2FkZFBpeGVscyhlW2krMV0sbyk7ZVtpKzFdPHImJihpKz0yKTticmVhaztjYXNlIDE6cz1jPTA7aWYobyl7ZG97cys9bD10aGlzLl9nZXRCbGFja0NvZGUoKX13aGlsZShsPj02NCk7ZG97Yys9bD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShsPj02NCl9ZWxzZXtkb3tzKz1sPXRoaXMuX2dldFdoaXRlQ29kZSgpfXdoaWxlKGw+PTY0KTtkb3tjKz1sPXRoaXMuX2dldEJsYWNrQ29kZSgpfXdoaWxlKGw+PTY0KX10aGlzLl9hZGRQaXhlbHModFt0aGlzLmNvZGluZ1Bvc10rcyxvKTt0W3RoaXMuY29kaW5nUG9zXTxyJiZ0aGlzLl9hZGRQaXhlbHModFt0aGlzLmNvZGluZ1Bvc10rYywxXm8pO2Zvcig7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIDc6dGhpcy5fYWRkUGl4ZWxzKGVbaV0rMyxvKTtvXj0xO2lmKHRbdGhpcy5jb2RpbmdQb3NdPHIpeysraTtmb3IoO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTJ9YnJlYWs7Y2FzZSA1OnRoaXMuX2FkZFBpeGVscyhlW2ldKzIsbyk7b149MTtpZih0W3RoaXMuY29kaW5nUG9zXTxyKXsrK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yfWJyZWFrO2Nhc2UgMzp0aGlzLl9hZGRQaXhlbHMoZVtpXSsxLG8pO29ePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108cil7KytpO2Zvcig7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9Mn1icmVhaztjYXNlIDI6dGhpcy5fYWRkUGl4ZWxzKGVbaV0sbyk7b149MTtpZih0W3RoaXMuY29kaW5nUG9zXTxyKXsrK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yfWJyZWFrO2Nhc2UgODp0aGlzLl9hZGRQaXhlbHNOZWcoZVtpXS0zLG8pO29ePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108cil7aT4wPy0taTorK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yfWJyZWFrO2Nhc2UgNjp0aGlzLl9hZGRQaXhlbHNOZWcoZVtpXS0yLG8pO29ePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108cil7aT4wPy0taTorK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yfWJyZWFrO2Nhc2UgNDp0aGlzLl9hZGRQaXhlbHNOZWcoZVtpXS0xLG8pO29ePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108cil7aT4wPy0taTorK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yfWJyZWFrO2Nhc2UtMTp0aGlzLl9hZGRQaXhlbHMociwwKTt0aGlzLmVvZj0hMDticmVhaztkZWZhdWx0OigwLG4uaW5mbykoImJhZCAyZCBjb2RlIik7dGhpcy5fYWRkUGl4ZWxzKHIsMCk7dGhpcy5lcnI9ITB9fX1lbHNle3RbMF09MDt0aGlzLmNvZGluZ1Bvcz0wO289MDtmb3IoO3RbdGhpcy5jb2RpbmdQb3NdPHI7KXtzPTA7aWYobylkb3tzKz1sPXRoaXMuX2dldEJsYWNrQ29kZSgpfXdoaWxlKGw+PTY0KTtlbHNlIGRve3MrPWw9dGhpcy5fZ2V0V2hpdGVDb2RlKCl9d2hpbGUobD49NjQpO3RoaXMuX2FkZFBpeGVscyh0W3RoaXMuY29kaW5nUG9zXStzLG8pO29ePTF9fWxldCBkPSExO3RoaXMuYnl0ZUFsaWduJiYodGhpcy5pbnB1dEJpdHMmPS04KTtpZih0aGlzLmVvYmxvY2t8fHRoaXMucm93IT09dGhpcy5yb3dzLTEpe3M9dGhpcy5fbG9va0JpdHMoMTIpO2lmKHRoaXMuZW9saW5lKWZvcig7LTEhPT1zJiYxIT09czspe3RoaXMuX2VhdEJpdHMoMSk7cz10aGlzLl9sb29rQml0cygxMil9ZWxzZSBmb3IoOzA9PT1zOyl7dGhpcy5fZWF0Qml0cygxKTtzPXRoaXMuX2xvb2tCaXRzKDEyKX1pZigxPT09cyl7dGhpcy5fZWF0Qml0cygxMik7ZD0hMH1lbHNlLTE9PT1zJiYodGhpcy5lb2Y9ITApfWVsc2UgdGhpcy5yb3dzRG9uZT0hMDtpZighdGhpcy5lb2YmJnRoaXMuZW5jb2Rpbmc+MCYmIXRoaXMucm93c0RvbmUpe3RoaXMubmV4dExpbmUyRD0hdGhpcy5fbG9va0JpdHMoMSk7dGhpcy5fZWF0Qml0cygxKX1pZih0aGlzLmVvYmxvY2smJmQmJnRoaXMuYnl0ZUFsaWduKXtzPXRoaXMuX2xvb2tCaXRzKDEyKTtpZigxPT09cyl7dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfWlmKHRoaXMuZW5jb2Rpbmc+PTApZm9yKGE9MDthPDQ7KythKXtzPXRoaXMuX2xvb2tCaXRzKDEyKTsxIT09cyYmKDAsbi5pbmZvKSgiYmFkIHJ0YyBjb2RlOiAiK3MpO3RoaXMuX2VhdEJpdHMoMTIpO2lmKHRoaXMuZW5jb2Rpbmc+MCl7dGhpcy5fbG9va0JpdHMoMSk7dGhpcy5fZWF0Qml0cygxKX19dGhpcy5lb2Y9ITB9fWVsc2UgaWYodGhpcy5lcnImJnRoaXMuZW9saW5lKXtmb3IoOzspe3M9dGhpcy5fbG9va0JpdHMoMTMpO2lmKC0xPT09cyl7dGhpcy5lb2Y9ITA7cmV0dXJuLTF9aWYocz4+MT09MSlicmVhazt0aGlzLl9lYXRCaXRzKDEpfXRoaXMuX2VhdEJpdHMoMTIpO2lmKHRoaXMuZW5jb2Rpbmc+MCl7dGhpcy5fZWF0Qml0cygxKTt0aGlzLm5leHRMaW5lMkQ9ISgxJnMpfX10WzBdPjA/dGhpcy5vdXRwdXRCaXRzPXRbdGhpcy5jb2RpbmdQb3M9MF06dGhpcy5vdXRwdXRCaXRzPXRbdGhpcy5jb2RpbmdQb3M9MV07dGhpcy5yb3crK31pZih0aGlzLm91dHB1dEJpdHM+PTgpe2M9MSZ0aGlzLmNvZGluZ1Bvcz8wOjI1NTt0aGlzLm91dHB1dEJpdHMtPTg7aWYoMD09PXRoaXMub3V0cHV0Qml0cyYmdFt0aGlzLmNvZGluZ1Bvc108cil7dGhpcy5jb2RpbmdQb3MrKzt0aGlzLm91dHB1dEJpdHM9dFt0aGlzLmNvZGluZ1Bvc10tdFt0aGlzLmNvZGluZ1Bvcy0xXX19ZWxzZXtzPTg7Yz0wO2Rve2lmKHRoaXMub3V0cHV0Qml0cz5zKXtjPDw9czsxJnRoaXMuY29kaW5nUG9zfHwoY3w9MjU1Pj44LXMpO3RoaXMub3V0cHV0Qml0cy09cztzPTB9ZWxzZXtjPDw9dGhpcy5vdXRwdXRCaXRzOzEmdGhpcy5jb2RpbmdQb3N8fChjfD0yNTU+PjgtdGhpcy5vdXRwdXRCaXRzKTtzLT10aGlzLm91dHB1dEJpdHM7dGhpcy5vdXRwdXRCaXRzPTA7aWYodFt0aGlzLmNvZGluZ1Bvc108cil7dGhpcy5jb2RpbmdQb3MrKzt0aGlzLm91dHB1dEJpdHM9dFt0aGlzLmNvZGluZ1Bvc10tdFt0aGlzLmNvZGluZ1Bvcy0xXX1lbHNlIGlmKHM+MCl7Yzw8PXM7cz0wfX19d2hpbGUocyl9dGhpcy5ibGFjayYmKGNePTI1NSk7cmV0dXJuIGN9LF9hZGRQaXhlbHMoZSx0KXtjb25zdCByPXRoaXMuY29kaW5nTGluZTtsZXQgaT10aGlzLmNvZGluZ1BvcztpZihlPnJbaV0pe2lmKGU+dGhpcy5jb2x1bW5zKXsoMCxuLmluZm8pKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7dGhpcy5lcnI9ITA7ZT10aGlzLmNvbHVtbnN9MSZpXnQmJisraTtyW2ldPWV9dGhpcy5jb2RpbmdQb3M9aX0sX2FkZFBpeGVsc05lZyhlLHQpe2NvbnN0IHI9dGhpcy5jb2RpbmdMaW5lO2xldCBpPXRoaXMuY29kaW5nUG9zO2lmKGU+cltpXSl7aWYoZT50aGlzLmNvbHVtbnMpeygwLG4uaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKTt0aGlzLmVycj0hMDtlPXRoaXMuY29sdW1uc30xJmledCYmKytpO3JbaV09ZX1lbHNlIGlmKGU8cltpXSl7aWYoZTwwKXsoMCxuLmluZm8pKCJpbnZhbGlkIGNvZGUiKTt0aGlzLmVycj0hMDtlPTB9Zm9yKDtpPjAmJmU8cltpLTFdOyktLWk7cltpXT1lfXRoaXMuY29kaW5nUG9zPWl9LF9maW5kVGFibGVDb2RlKGUsdCxyLG4pe2NvbnN0IGk9bnx8MDtmb3IobGV0IG49ZTtuPD10Oysrbil7bGV0IGU9dGhpcy5fbG9va0JpdHMobik7aWYoLTE9PT1lKXJldHVyblshMCwxLCExXTtuPHQmJihlPDw9dC1uKTtpZighaXx8ZT49aSl7Y29uc3QgdD1yW2UtaV07aWYodFswXT09PW4pe3RoaXMuX2VhdEJpdHMobik7cmV0dXJuWyEwLHRbMV0sITBdfX19cmV0dXJuWyExLDAsITFdfSxfZ2V0VHdvRGltQ29kZSgpe2xldCB0LHI9MDtpZih0aGlzLmVvYmxvY2spe3I9dGhpcy5fbG9va0JpdHMoNyk7dD1lW3JdO2lmKHQmJnRbMF0+MCl7dGhpcy5fZWF0Qml0cyh0WzBdKTtyZXR1cm4gdFsxXX19ZWxzZXtjb25zdCB0PXRoaXMuX2ZpbmRUYWJsZUNvZGUoMSw3LGUpO2lmKHRbMF0mJnRbMl0pcmV0dXJuIHRbMV19KDAsbi5pbmZvKSgiQmFkIHR3byBkaW0gY29kZSIpO3JldHVybi0xfSxfZ2V0V2hpdGVDb2RlKCl7bGV0IGUsaT0wO2lmKHRoaXMuZW9ibG9jayl7aT10aGlzLl9sb29rQml0cygxMik7aWYoLTE9PT1pKXJldHVybiAxO2U9aT4+NT09MD90W2ldOnJbaT4+M107aWYoZVswXT4wKXt0aGlzLl9lYXRCaXRzKGVbMF0pO3JldHVybiBlWzFdfX1lbHNle2xldCBlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMSw5LHIpO2lmKGVbMF0pcmV0dXJuIGVbMV07ZT10aGlzLl9maW5kVGFibGVDb2RlKDExLDEyLHQpO2lmKGVbMF0pcmV0dXJuIGVbMV19KDAsbi5pbmZvKSgiYmFkIHdoaXRlIGNvZGUiKTt0aGlzLl9lYXRCaXRzKDEpO3JldHVybiAxfSxfZ2V0QmxhY2tDb2RlKCl7bGV0IGUsdDtpZih0aGlzLmVvYmxvY2spe2U9dGhpcy5fbG9va0JpdHMoMTMpO2lmKC0xPT09ZSlyZXR1cm4gMTt0PWU+Pjc9PTA/aVtlXTplPj45PT0wJiZlPj43IT0wP29bKGU+PjEpLTY0XTpzW2U+PjddO2lmKHRbMF0+MCl7dGhpcy5fZWF0Qml0cyh0WzBdKTtyZXR1cm4gdFsxXX19ZWxzZXtsZXQgZT10aGlzLl9maW5kVGFibGVDb2RlKDIsNixzKTtpZihlWzBdKXJldHVybiBlWzFdO2U9dGhpcy5fZmluZFRhYmxlQ29kZSg3LDEyLG8sNjQpO2lmKGVbMF0pcmV0dXJuIGVbMV07ZT10aGlzLl9maW5kVGFibGVDb2RlKDEwLDEzLGkpO2lmKGVbMF0pcmV0dXJuIGVbMV19KDAsbi5pbmZvKSgiYmFkIGJsYWNrIGNvZGUiKTt0aGlzLl9lYXRCaXRzKDEpO3JldHVybiAxfSxfbG9va0JpdHMoZSl7bGV0IHQ7Zm9yKDt0aGlzLmlucHV0Qml0czxlOyl7aWYoLTE9PT0odD10aGlzLnNvdXJjZS5uZXh0KCkpKXJldHVybiAwPT09dGhpcy5pbnB1dEJpdHM/LTE6dGhpcy5pbnB1dEJ1Zjw8ZS10aGlzLmlucHV0Qml0cyY2NTUzNT4+MTYtZTt0aGlzLmlucHV0QnVmPXRoaXMuaW5wdXRCdWY8PDh8dDt0aGlzLmlucHV0Qml0cys9OH1yZXR1cm4gdGhpcy5pbnB1dEJ1Zj4+dGhpcy5pbnB1dEJpdHMtZSY2NTUzNT4+MTYtZX0sX2VhdEJpdHMoZSl7KHRoaXMuaW5wdXRCaXRzLT1lKTwwJiYodGhpcy5pbnB1dEJpdHM9MCl9fTtyZXR1cm4gQ0NJVFRGYXhEZWNvZGVyfSgpO3QuQ0NJVFRGYXhEZWNvZGVyPWl9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSnBlZ0ltYWdlPXZvaWQgMDt2YXIgbj1yKDEpLGk9cig1KTtjbGFzcyBKcGVnRXJyb3IgZXh0ZW5kcyBuLkJhc2VFeGNlcHRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoIkpQRUcgZXJyb3I6ICIrZSl9fWNsYXNzIEROTE1hcmtlckVycm9yIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSk7dGhpcy5zY2FuTGluZXM9dH19Y2xhc3MgRU9JTWFya2VyRXJyb3IgZXh0ZW5kcyBuLkJhc2VFeGNlcHRpb257fXZhciBvPWZ1bmN0aW9uIEpwZWdJbWFnZUNsb3N1cmUoKXt2YXIgZT1uZXcgVWludDhBcnJheShbMCwxLDgsMTYsOSwyLDMsMTAsMTcsMjQsMzIsMjUsMTgsMTEsNCw1LDEyLDE5LDI2LDMzLDQwLDQ4LDQxLDM0LDI3LDIwLDEzLDYsNywxNCwyMSwyOCwzNSw0Miw0OSw1Niw1Nyw1MCw0MywzNiwyOSwyMiwxNSwyMywzMCwzNyw0NCw1MSw1OCw1OSw1Miw0NSwzOCwzMSwzOSw0Niw1Myw2MCw2MSw1NCw0Nyw1NSw2Miw2M10pO2Z1bmN0aW9uIEpwZWdJbWFnZSh7ZGVjb2RlVHJhbnNmb3JtOmU9bnVsbCxjb2xvclRyYW5zZm9ybTp0PS0xfT17fSl7dGhpcy5fZGVjb2RlVHJhbnNmb3JtPWU7dGhpcy5fY29sb3JUcmFuc2Zvcm09dH1mdW5jdGlvbiBidWlsZEh1ZmZtYW5UYWJsZShlLHQpe2Zvcih2YXIgcixuLGk9MCxvPVtdLHM9MTY7cz4wJiYhZVtzLTFdOylzLS07by5wdXNoKHtjaGlsZHJlbjpbXSxpbmRleDowfSk7dmFyIGEsYz1vWzBdO2ZvcihyPTA7cjxzO3IrKyl7Zm9yKG49MDtuPGVbcl07bisrKXsoYz1vLnBvcCgpKS5jaGlsZHJlbltjLmluZGV4XT10W2ldO2Zvcig7Yy5pbmRleD4wOyljPW8ucG9wKCk7Yy5pbmRleCsrO28ucHVzaChjKTtmb3IoO28ubGVuZ3RoPD1yOyl7by5wdXNoKGE9e2NoaWxkcmVuOltdLGluZGV4OjB9KTtjLmNoaWxkcmVuW2MuaW5kZXhdPWEuY2hpbGRyZW47Yz1hfWkrK31pZihyKzE8cyl7by5wdXNoKGE9e2NoaWxkcmVuOltdLGluZGV4OjB9KTtjLmNoaWxkcmVuW2MuaW5kZXhdPWEuY2hpbGRyZW47Yz1hfX1yZXR1cm4gb1swXS5jaGlsZHJlbn1mdW5jdGlvbiBnZXRCbG9ja0J1ZmZlck9mZnNldChlLHQscil7cmV0dXJuIDY0KigoZS5ibG9ja3NQZXJMaW5lKzEpKnQrcil9ZnVuY3Rpb24gZGVjb2RlU2Nhbih0LHIsbyxzLGEsYyxsLGQsZixoPSExKXt2YXIgdT1vLm1jdXNQZXJMaW5lLHA9by5wcm9ncmVzc2l2ZTtjb25zdCBtPXI7bGV0IGc9MCxiPTA7ZnVuY3Rpb24gcmVhZEJpdCgpe2lmKGI+MCl7Yi0tO3JldHVybiBnPj5iJjF9Zz10W3IrK107aWYoMjU1PT09Zyl7dmFyIGU9dFtyKytdO2lmKGUpe2lmKDIyMD09PWUmJmgpe3IrPTI7Y29uc3QgZT0oMCxpLnJlYWRVaW50MTYpKHQscik7cis9MjtpZihlPjAmJmUhPT1vLnNjYW5MaW5lcyl0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoIkZvdW5kIEROTCBtYXJrZXIgKDB4RkZEQykgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiLGUpfWVsc2UgaWYoMjE3PT09ZSl7aWYoaCl7Y29uc3QgZT13Kig4PT09by5wcmVjaXNpb24/ODowKTtpZihlPjAmJk1hdGgucm91bmQoby5zY2FuTGluZXMvZSk+PTEwKXRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgcG9zc2libHkgY2F1c2VkIGJ5IGluY29ycmVjdCBgc2NhbkxpbmVzYCBwYXJhbWV0ZXIiLGUpfXRocm93IG5ldyBFT0lNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIpfXRocm93IG5ldyBKcGVnRXJyb3IoInVuZXhwZWN0ZWQgbWFya2VyICIrKGc8PDh8ZSkudG9TdHJpbmcoMTYpKX19Yj03O3JldHVybiBnPj4+N31mdW5jdGlvbiBkZWNvZGVIdWZmbWFuKGUpe2Zvcih2YXIgdD1lOzspe3N3aXRjaCh0eXBlb2YodD10W3JlYWRCaXQoKV0pKXtjYXNlIm51bWJlciI6cmV0dXJuIHQ7Y2FzZSJvYmplY3QiOmNvbnRpbnVlfXRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZSIpfX1mdW5jdGlvbiByZWNlaXZlKGUpe2Zvcih2YXIgdD0wO2U+MDspe3Q9dDw8MXxyZWFkQml0KCk7ZS0tfXJldHVybiB0fWZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQoZSl7aWYoMT09PWUpcmV0dXJuIDE9PT1yZWFkQml0KCk/MTotMTt2YXIgdD1yZWNlaXZlKGUpO3JldHVybiB0Pj0xPDxlLTE/dDp0KygtMTw8ZSkrMX12YXIgeD0wO3ZhciB5LHY9MDtsZXQgdz0wO2Z1bmN0aW9uIGRlY29kZU1jdShlLHQscixuLGkpe3ZhciBvPXIldTt3PShyL3V8MCkqZS52K247dmFyIHM9byplLmgraTt0KGUsZ2V0QmxvY2tCdWZmZXJPZmZzZXQoZSx3LHMpKX1mdW5jdGlvbiBkZWNvZGVCbG9jayhlLHQscil7dz1yL2UuYmxvY2tzUGVyTGluZXwwO3ZhciBuPXIlZS5ibG9ja3NQZXJMaW5lO3QoZSxnZXRCbG9ja0J1ZmZlck9mZnNldChlLHcsbikpfXZhciBULEMsSSxQLGssUyxfPXMubGVuZ3RoO1M9cD8wPT09Yz8wPT09ZD9mdW5jdGlvbiBkZWNvZGVEQ0ZpcnN0KGUsdCl7dmFyIHI9ZGVjb2RlSHVmZm1hbihlLmh1ZmZtYW5UYWJsZURDKSxuPTA9PT1yPzA6cmVjZWl2ZUFuZEV4dGVuZChyKTw8ZjtlLmJsb2NrRGF0YVt0XT1lLnByZWQrPW59OmZ1bmN0aW9uIGRlY29kZURDU3VjY2Vzc2l2ZShlLHQpe2UuYmxvY2tEYXRhW3RdfD1yZWFkQml0KCk8PGZ9OjA9PT1kP2Z1bmN0aW9uIGRlY29kZUFDRmlyc3QodCxyKXtpZih4PjApeC0tO2Vsc2UgZm9yKHZhciBuPWMsaT1sO248PWk7KXt2YXIgbz1kZWNvZGVIdWZmbWFuKHQuaHVmZm1hblRhYmxlQUMpLHM9MTUmbyxhPW8+PjQ7aWYoMCE9PXMpe3ZhciBkPWVbbis9YV07dC5ibG9ja0RhdGFbcitkXT1yZWNlaXZlQW5kRXh0ZW5kKHMpKigxPDxmKTtuKyt9ZWxzZXtpZihhPDE1KXt4PXJlY2VpdmUoYSkrKDE8PGEpLTE7YnJlYWt9bis9MTZ9fX06ZnVuY3Rpb24gZGVjb2RlQUNTdWNjZXNzaXZlKHQscil7Zm9yKHZhciBuLGksbz1jLHM9bCxhPTA7bzw9czspe2NvbnN0IHM9citlW29dLGM9dC5ibG9ja0RhdGFbc108MD8tMToxO3N3aXRjaCh2KXtjYXNlIDA6YT0oaT1kZWNvZGVIdWZmbWFuKHQuaHVmZm1hblRhYmxlQUMpKT4+NDtpZigwPT09KG49MTUmaSkpaWYoYTwxNSl7eD1yZWNlaXZlKGEpKygxPDxhKTt2PTR9ZWxzZXthPTE2O3Y9MX1lbHNle2lmKDEhPT1uKXRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgQUNuIGVuY29kaW5nIik7eT1yZWNlaXZlQW5kRXh0ZW5kKG4pO3Y9YT8yOjN9Y29udGludWU7Y2FzZSAxOmNhc2UgMjp0LmJsb2NrRGF0YVtzXT90LmJsb2NrRGF0YVtzXSs9YyoocmVhZEJpdCgpPDxmKTowPT09LS1hJiYodj0yPT09dj8zOjApO2JyZWFrO2Nhc2UgMzppZih0LmJsb2NrRGF0YVtzXSl0LmJsb2NrRGF0YVtzXSs9YyoocmVhZEJpdCgpPDxmKTtlbHNle3QuYmxvY2tEYXRhW3NdPXk8PGY7dj0wfWJyZWFrO2Nhc2UgNDp0LmJsb2NrRGF0YVtzXSYmKHQuYmxvY2tEYXRhW3NdKz1jKihyZWFkQml0KCk8PGYpKX1vKyt9ND09PXYmJjA9PT0tLXgmJih2PTApfTpmdW5jdGlvbiBkZWNvZGVCYXNlbGluZSh0LHIpe3ZhciBuPWRlY29kZUh1ZmZtYW4odC5odWZmbWFuVGFibGVEQyksaT0wPT09bj8wOnJlY2VpdmVBbmRFeHRlbmQobik7dC5ibG9ja0RhdGFbcl09dC5wcmVkKz1pO2Zvcih2YXIgbz0xO288NjQ7KXt2YXIgcz1kZWNvZGVIdWZmbWFuKHQuaHVmZm1hblRhYmxlQUMpLGE9MTUmcyxjPXM+PjQ7aWYoMCE9PWEpe3ZhciBsPWVbbys9Y107dC5ibG9ja0RhdGFbcitsXT1yZWNlaXZlQW5kRXh0ZW5kKGEpO28rK31lbHNle2lmKGM8MTUpYnJlYWs7bys9MTZ9fX07dmFyIEUsQixMLEQsTT0wO0I9MT09PV8/c1swXS5ibG9ja3NQZXJMaW5lKnNbMF0uYmxvY2tzUGVyQ29sdW1uOnUqby5tY3VzUGVyQ29sdW1uO2Zvcig7TTw9Qjspe3ZhciBPPWE/TWF0aC5taW4oQi1NLGEpOkI7aWYoTz4wKXtmb3IoQz0wO0M8XztDKyspc1tDXS5wcmVkPTA7eD0wO2lmKDE9PT1fKXtUPXNbMF07Zm9yKGs9MDtrPE87aysrKXtkZWNvZGVCbG9jayhULFMsTSk7TSsrfX1lbHNlIGZvcihrPTA7azxPO2srKyl7Zm9yKEM9MDtDPF87QysrKXtMPShUPXNbQ10pLmg7RD1ULnY7Zm9yKEk9MDtJPEQ7SSsrKWZvcihQPTA7UDxMO1ArKylkZWNvZGVNY3UoVCxTLE0sSSxQKX1NKyt9fWI9MDtpZighKEU9ZmluZE5leHRGaWxlTWFya2VyKHQscikpKWJyZWFrO2lmKEUuaW52YWxpZCl7Y29uc3QgZT1PPjA/InVuZXhwZWN0ZWQiOiJleGNlc3NpdmUiOygwLG4ud2FybikoYGRlY29kZVNjYW4gLSAke2V9IE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogJHtFLmludmFsaWR9YCk7cj1FLm9mZnNldH1pZighKEUubWFya2VyPj02NTQ4OCYmRS5tYXJrZXI8PTY1NDk1KSlicmVhaztyKz0yfXJldHVybiByLW19ZnVuY3Rpb24gcXVhbnRpemVBbmRJbnZlcnNlKGUsdCxyKXt2YXIgbixpLG8scyxhLGMsbCxkLGYsaCx1LHAsbSxnLGIseCx5LHY9ZS5xdWFudGl6YXRpb25UYWJsZSx3PWUuYmxvY2tEYXRhO2lmKCF2KXRocm93IG5ldyBKcGVnRXJyb3IoIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpO2Zvcih2YXIgVD0wO1Q8NjQ7VCs9OCl7Zj13W3QrVF07aD13W3QrVCsxXTt1PXdbdCtUKzJdO3A9d1t0K1QrM107bT13W3QrVCs0XTtnPXdbdCtUKzVdO2I9d1t0K1QrNl07eD13W3QrVCs3XTtmKj12W1RdO2lmKDAhPShofHV8cHxtfGd8Ynx4KSl7aCo9dltUKzFdO3UqPXZbVCsyXTtwKj12W1QrM107bSo9dltUKzRdO2cqPXZbVCs1XTtpPShuPShuPTU3OTMqZisxMjg+PjgpKyhpPTU3OTMqbSsxMjg+PjgpKzE+PjEpLWk7eT0zNzg0KihvPXUpKzE1NjcqKHM9Yio9dltUKzZdKSsxMjg+Pjg7bz0xNTY3Km8tMzc4NCpzKzEyOD4+ODtsPShhPShhPTI4OTYqKGgtKHgqPXZbVCs3XSkpKzEyOD4+OCkrKGw9Zzw8NCkrMT4+MSktbDtjPShkPShkPTI4OTYqKGgreCkrMTI4Pj44KSsoYz1wPDw0KSsxPj4xKS1jO3M9KG49bisocz15KSsxPj4xKS1zO289KGk9aStvKzE+PjEpLW87eT0yMjc2KmErMzQwNipkKzIwNDg+PjEyO2E9MzQwNiphLTIyNzYqZCsyMDQ4Pj4xMjtkPXk7eT03OTkqYys0MDE3KmwrMjA0OD4+MTI7Yz00MDE3KmMtNzk5KmwrMjA0OD4+MTI7bD15O3JbVF09bitkO3JbVCs3XT1uLWQ7cltUKzFdPWkrbDtyW1QrNl09aS1sO3JbVCsyXT1vK2M7cltUKzVdPW8tYztyW1QrM109cythO3JbVCs0XT1zLWF9ZWxzZXt5PTU3OTMqZis1MTI+PjEwO3JbVF09eTtyW1QrMV09eTtyW1QrMl09eTtyW1QrM109eTtyW1QrNF09eTtyW1QrNV09eTtyW1QrNl09eTtyW1QrN109eX19Zm9yKHZhciBDPTA7Qzw4OysrQyl7Zj1yW0NdO2lmKDAhPSgoaD1yW0MrOF0pfCh1PXJbQysxNl0pfChwPXJbQysyNF0pfChtPXJbQyszMl0pfChnPXJbQys0MF0pfChiPXJbQys0OF0pfCh4PXJbQys1Nl0pKSl7aT0obj00MTEyKygobj01NzkzKmYrMjA0OD4+MTIpKyhpPTU3OTMqbSsyMDQ4Pj4xMikrMT4+MSkpLWk7eT0zNzg0KihvPXUpKzE1NjcqKHM9YikrMjA0OD4+MTI7bz0xNTY3Km8tMzc4NCpzKzIwNDg+PjEyO3M9eTtsPShhPShhPTI4OTYqKGgteCkrMjA0OD4+MTIpKyhsPWcpKzE+PjEpLWw7Yz0oZD0oZD0yODk2KihoK3gpKzIwNDg+PjEyKSsoYz1wKSsxPj4xKS1jO3k9MjI3NiphKzM0MDYqZCsyMDQ4Pj4xMjthPTM0MDYqYS0yMjc2KmQrMjA0OD4+MTI7ZD15O3k9Nzk5KmMrNDAxNypsKzIwNDg+PjEyO2M9NDAxNypjLTc5OSpsKzIwNDg+PjEyOyhmPShuPW4rcysxPj4xKStkKTwxNj9mPTA6Zj49NDA4MD9mPTI1NTpmPj49NDsoaD0oaT1pK28rMT4+MSkrKGw9eSkpPDE2P2g9MDpoPj00MDgwP2g9MjU1Omg+Pj00Oyh1PShvPWktbykrYyk8MTY/dT0wOnU+PTQwODA/dT0yNTU6dT4+PTQ7KHA9KHM9bi1zKSthKTwxNj9wPTA6cD49NDA4MD9wPTI1NTpwPj49NDsobT1zLWEpPDE2P209MDptPj00MDgwP209MjU1Om0+Pj00OyhnPW8tYyk8MTY/Zz0wOmc+PTQwODA/Zz0yNTU6Zz4+PTQ7KGI9aS1sKTwxNj9iPTA6Yj49NDA4MD9iPTI1NTpiPj49NDsoeD1uLWQpPDE2P3g9MDp4Pj00MDgwP3g9MjU1Ong+Pj00O3dbdCtDXT1mO3dbdCtDKzhdPWg7d1t0K0MrMTZdPXU7d1t0K0MrMjRdPXA7d1t0K0MrMzJdPW07d1t0K0MrNDBdPWc7d1t0K0MrNDhdPWI7d1t0K0MrNTZdPXh9ZWxzZXt5PSh5PTU3OTMqZis4MTkyPj4xNCk8LTIwNDA/MDp5Pj0yMDI0PzI1NTp5KzIwNTY+PjQ7d1t0K0NdPXk7d1t0K0MrOF09eTt3W3QrQysxNl09eTt3W3QrQysyNF09eTt3W3QrQyszMl09eTt3W3QrQys0MF09eTt3W3QrQys0OF09eTt3W3QrQys1Nl09eX19fWZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50RGF0YShlLHQpe2Zvcih2YXIgcj10LmJsb2Nrc1BlckxpbmUsbj10LmJsb2Nrc1BlckNvbHVtbixpPW5ldyBJbnQxNkFycmF5KDY0KSxvPTA7bzxuO28rKylmb3IodmFyIHM9MDtzPHI7cysrKXtxdWFudGl6ZUFuZEludmVyc2UodCxnZXRCbG9ja0J1ZmZlck9mZnNldCh0LG8scyksaSl9cmV0dXJuIHQuYmxvY2tEYXRhfWZ1bmN0aW9uIGZpbmROZXh0RmlsZU1hcmtlcihlLHQscj10KXtjb25zdCBuPWUubGVuZ3RoLTE7dmFyIG89cjx0P3I6dDtpZih0Pj1uKXJldHVybiBudWxsO3ZhciBzPSgwLGkucmVhZFVpbnQxNikoZSx0KTtpZihzPj02NTQ3MiYmczw9NjU1MzQpcmV0dXJue2ludmFsaWQ6bnVsbCxtYXJrZXI6cyxvZmZzZXQ6dH07Zm9yKHZhciBhPSgwLGkucmVhZFVpbnQxNikoZSxvKTshKGE+PTY1NDcyJiZhPD02NTUzNCk7KXtpZigrK28+PW4pcmV0dXJuIG51bGw7YT0oMCxpLnJlYWRVaW50MTYpKGUsbyl9cmV0dXJue2ludmFsaWQ6cy50b1N0cmluZygxNiksbWFya2VyOmEsb2Zmc2V0Om99fUpwZWdJbWFnZS5wcm90b3R5cGU9e3BhcnNlKHQse2RubFNjYW5MaW5lczpyPW51bGx9PXt9KXtmdW5jdGlvbiByZWFkRGF0YUJsb2NrKCl7Y29uc3QgZT0oMCxpLnJlYWRVaW50MTYpKHQsYSk7bGV0IHI9KGErPTIpK2UtMjt2YXIgbz1maW5kTmV4dEZpbGVNYXJrZXIodCxyLGEpO2lmKG8mJm8uaW52YWxpZCl7KDAsbi53YXJuKSgicmVhZERhdGFCbG9jayAtIGluY29ycmVjdCBsZW5ndGgsIGN1cnJlbnQgbWFya2VyIGlzOiAiK28uaW52YWxpZCk7cj1vLm9mZnNldH12YXIgcz10LnN1YmFycmF5KGEscik7YSs9cy5sZW5ndGg7cmV0dXJuIHN9ZnVuY3Rpb24gcHJlcGFyZUNvbXBvbmVudHMoZSl7Zm9yKHZhciB0PU1hdGguY2VpbChlLnNhbXBsZXNQZXJMaW5lLzgvZS5tYXhIKSxyPU1hdGguY2VpbChlLnNjYW5MaW5lcy84L2UubWF4Viksbj0wO248ZS5jb21wb25lbnRzLmxlbmd0aDtuKyspe009ZS5jb21wb25lbnRzW25dO3ZhciBpPU1hdGguY2VpbChNYXRoLmNlaWwoZS5zYW1wbGVzUGVyTGluZS84KSpNLmgvZS5tYXhIKSxvPU1hdGguY2VpbChNYXRoLmNlaWwoZS5zY2FuTGluZXMvOCkqTS52L2UubWF4Vikscz10Kk0uaCxhPTY0KihyKk0udikqKHMrMSk7TS5ibG9ja0RhdGE9bmV3IEludDE2QXJyYXkoYSk7TS5ibG9ja3NQZXJMaW5lPWk7TS5ibG9ja3NQZXJDb2x1bW49b31lLm1jdXNQZXJMaW5lPXQ7ZS5tY3VzUGVyQ29sdW1uPXJ9dmFyIG8scyxhPTAsYz1udWxsLGw9bnVsbDtsZXQgZD0wO3ZhciBmPVtdLGg9W10sdT1bXTtsZXQgcD0oMCxpLnJlYWRVaW50MTYpKHQsYSk7YSs9MjtpZig2NTQ5NiE9PXApdGhyb3cgbmV3IEpwZWdFcnJvcigiU09JIG5vdCBmb3VuZCIpO3A9KDAsaS5yZWFkVWludDE2KSh0LGEpO2ErPTI7ZTpmb3IoOzY1NDk3IT09cDspe3ZhciBtLGcsYjtzd2l0Y2gocCl7Y2FzZSA2NTUwNDpjYXNlIDY1NTA1OmNhc2UgNjU1MDY6Y2FzZSA2NTUwNzpjYXNlIDY1NTA4OmNhc2UgNjU1MDk6Y2FzZSA2NTUxMDpjYXNlIDY1NTExOmNhc2UgNjU1MTI6Y2FzZSA2NTUxMzpjYXNlIDY1NTE0OmNhc2UgNjU1MTU6Y2FzZSA2NTUxNjpjYXNlIDY1NTE3OmNhc2UgNjU1MTg6Y2FzZSA2NTUxOTpjYXNlIDY1NTM0OnZhciB4PXJlYWREYXRhQmxvY2soKTs2NTUwND09PXAmJjc0PT09eFswXSYmNzA9PT14WzFdJiY3Mz09PXhbMl0mJjcwPT09eFszXSYmMD09PXhbNF0mJihjPXt2ZXJzaW9uOnttYWpvcjp4WzVdLG1pbm9yOnhbNl19LGRlbnNpdHlVbml0czp4WzddLHhEZW5zaXR5OnhbOF08PDh8eFs5XSx5RGVuc2l0eTp4WzEwXTw8OHx4WzExXSx0aHVtYldpZHRoOnhbMTJdLHRodW1iSGVpZ2h0OnhbMTNdLHRodW1iRGF0YTp4LnN1YmFycmF5KDE0LDE0KzMqeFsxMl0qeFsxM10pfSk7NjU1MTg9PT1wJiY2NT09PXhbMF0mJjEwMD09PXhbMV0mJjExMT09PXhbMl0mJjk4PT09eFszXSYmMTAxPT09eFs0XSYmKGw9e3ZlcnNpb246eFs1XTw8OHx4WzZdLGZsYWdzMDp4WzddPDw4fHhbOF0sZmxhZ3MxOnhbOV08PDh8eFsxMF0sdHJhbnNmb3JtQ29kZTp4WzExXX0pO2JyZWFrO2Nhc2UgNjU0OTk6Zm9yKHZhciB5PSgwLGkucmVhZFVpbnQxNikodCxhKSsoYSs9MiktMjthPHk7KXt2YXIgdj10W2ErK10sdz1uZXcgVWludDE2QXJyYXkoNjQpO2lmKHY+PjQ9PTApZm9yKGc9MDtnPDY0O2crKyl3W2VbZ11dPXRbYSsrXTtlbHNle2lmKHY+PjQhPTEpdGhyb3cgbmV3IEpwZWdFcnJvcigiRFFUIC0gaW52YWxpZCB0YWJsZSBzcGVjIik7Zm9yKGc9MDtnPDY0O2crKyl7d1tlW2ddXT0oMCxpLnJlYWRVaW50MTYpKHQsYSk7YSs9Mn19ZlsxNSZ2XT13fWJyZWFrO2Nhc2UgNjU0NzI6Y2FzZSA2NTQ3MzpjYXNlIDY1NDc0OmlmKG8pdGhyb3cgbmV3IEpwZWdFcnJvcigiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIik7YSs9Mjsobz17fSkuZXh0ZW5kZWQ9NjU0NzM9PT1wO28ucHJvZ3Jlc3NpdmU9NjU0NzQ9PT1wO28ucHJlY2lzaW9uPXRbYSsrXTtjb25zdCB6PSgwLGkucmVhZFVpbnQxNikodCxhKTthKz0yO28uc2NhbkxpbmVzPXJ8fHo7by5zYW1wbGVzUGVyTGluZT0oMCxpLnJlYWRVaW50MTYpKHQsYSk7YSs9MjtvLmNvbXBvbmVudHM9W107by5jb21wb25lbnRJZHM9e307dmFyIFQsQz10W2ErK10sST0wLFA9MDtmb3IobT0wO208QzttKyspe1Q9dFthXTt2YXIgaz10W2ErMV0+PjQsUz0xNSZ0W2ErMV07STxrJiYoST1rKTtQPFMmJihQPVMpO3ZhciBfPXRbYSsyXTtiPW8uY29tcG9uZW50cy5wdXNoKHtoOmssdjpTLHF1YW50aXphdGlvbklkOl8scXVhbnRpemF0aW9uVGFibGU6bnVsbH0pO28uY29tcG9uZW50SWRzW1RdPWItMTthKz0zfW8ubWF4SD1JO28ubWF4Vj1QO3ByZXBhcmVDb21wb25lbnRzKG8pO2JyZWFrO2Nhc2UgNjU0NzY6Y29uc3QgWD0oMCxpLnJlYWRVaW50MTYpKHQsYSk7YSs9Mjtmb3IobT0yO208WDspe3ZhciBFPXRbYSsrXSxCPW5ldyBVaW50OEFycmF5KDE2KSxMPTA7Zm9yKGc9MDtnPDE2O2crKyxhKyspTCs9QltnXT10W2FdO3ZhciBEPW5ldyBVaW50OEFycmF5KEwpO2ZvcihnPTA7ZzxMO2crKyxhKyspRFtnXT10W2FdO20rPTE3K0w7KEU+PjQ9PTA/dTpoKVsxNSZFXT1idWlsZEh1ZmZtYW5UYWJsZShCLEQpfWJyZWFrO2Nhc2UgNjU1MDE6YSs9MjtzPSgwLGkucmVhZFVpbnQxNikodCxhKTthKz0yO2JyZWFrO2Nhc2UgNjU0OTg6Y29uc3Qgaj0xPT0rK2QmJiFyO2ErPTI7dmFyIE0sTz10W2ErK10sQT1bXTtmb3IobT0wO208TzttKyspe2NvbnN0IGU9dFthKytdO3ZhciBSPW8uY29tcG9uZW50SWRzW2VdOyhNPW8uY29tcG9uZW50c1tSXSkuaW5kZXg9ZTt2YXIgVT10W2ErK107TS5odWZmbWFuVGFibGVEQz11W1U+PjRdO00uaHVmZm1hblRhYmxlQUM9aFsxNSZVXTtBLnB1c2goTSl9dmFyIEY9dFthKytdLE49dFthKytdLEg9dFthKytdO3RyeXt2YXIgSj1kZWNvZGVTY2FuKHQsYSxvLEEscyxGLE4sSD4+NCwxNSZILGopO2ErPUp9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIEROTE1hcmtlckVycm9yKXsoMCxuLndhcm4pKGUubWVzc2FnZSsiIC0tIGF0dGVtcHRpbmcgdG8gcmUtcGFyc2UgdGhlIEpQRUcgaW1hZ2UuIik7cmV0dXJuIHRoaXMucGFyc2UodCx7ZG5sU2NhbkxpbmVzOmUuc2NhbkxpbmVzfSl9aWYoZSBpbnN0YW5jZW9mIEVPSU1hcmtlckVycm9yKXsoMCxuLndhcm4pKGUubWVzc2FnZSsiIC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLiIpO2JyZWFrIGV9dGhyb3cgZX1icmVhaztjYXNlIDY1NTAwOmErPTQ7YnJlYWs7Y2FzZSA2NTUzNToyNTUhPT10W2FdJiZhLS07YnJlYWs7ZGVmYXVsdDpjb25zdCBxPWZpbmROZXh0RmlsZU1hcmtlcih0LGEtMixhLTMpO2lmKHEmJnEuaW52YWxpZCl7KDAsbi53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gdW5leHBlY3RlZCBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIitxLmludmFsaWQpO2E9cS5vZmZzZXQ7YnJlYWt9aWYoYT49dC5sZW5ndGgtMSl7KDAsbi53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhIHdpdGhvdXQgZmluZGluZyBhbiBFT0kgbWFya2VyICgweEZGRDkpLiIpO2JyZWFrIGV9dGhyb3cgbmV3IEpwZWdFcnJvcigiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6ICIrcC50b1N0cmluZygxNikpfXA9KDAsaS5yZWFkVWludDE2KSh0LGEpO2ErPTJ9dGhpcy53aWR0aD1vLnNhbXBsZXNQZXJMaW5lO3RoaXMuaGVpZ2h0PW8uc2NhbkxpbmVzO3RoaXMuamZpZj1jO3RoaXMuYWRvYmU9bDt0aGlzLmNvbXBvbmVudHM9W107Zm9yKG09MDttPG8uY29tcG9uZW50cy5sZW5ndGg7bSsrKXt2YXIgej1mWyhNPW8uY29tcG9uZW50c1ttXSkucXVhbnRpemF0aW9uSWRdO3omJihNLnF1YW50aXphdGlvblRhYmxlPXopO3RoaXMuY29tcG9uZW50cy5wdXNoKHtpbmRleDpNLmluZGV4LG91dHB1dDpidWlsZENvbXBvbmVudERhdGEoMCxNKSxzY2FsZVg6TS5oL28ubWF4SCxzY2FsZVk6TS52L28ubWF4VixibG9ja3NQZXJMaW5lOk0uYmxvY2tzUGVyTGluZSxibG9ja3NQZXJDb2x1bW46TS5ibG9ja3NQZXJDb2x1bW59KX10aGlzLm51bUNvbXBvbmVudHM9dGhpcy5jb21wb25lbnRzLmxlbmd0aH0sX2dldExpbmVhcml6ZWRCbG9ja0RhdGEoZSx0LHI9ITEpe3ZhciBuLGksbyxzLGEsYyxsLGQsZixoLHUscD10aGlzLndpZHRoL2UsbT10aGlzLmhlaWdodC90LGc9MCxiPXRoaXMuY29tcG9uZW50cy5sZW5ndGgseD1lKnQqYix5PW5ldyBVaW50OENsYW1wZWRBcnJheSh4KSx2PW5ldyBVaW50MzJBcnJheShlKTtsZXQgdztmb3IobD0wO2w8YjtsKyspe2k9KG49dGhpcy5jb21wb25lbnRzW2xdKS5zY2FsZVgqcDtvPW4uc2NhbGVZKm07Zz1sO3U9bi5vdXRwdXQ7cz1uLmJsb2Nrc1BlckxpbmUrMTw8MztpZihpIT09dyl7Zm9yKGE9MDthPGU7YSsrKXtkPTB8YSppO3ZbYV09KDQyOTQ5NjcyODgmZCk8PDN8NyZkfXc9aX1mb3IoYz0wO2M8dDtjKyspe2g9cyooNDI5NDk2NzI4OCYoZD0wfGMqbykpfCg3JmQpPDwzO2ZvcihhPTA7YTxlO2ErKyl7eVtnXT11W2grdlthXV07Zys9Yn19fWxldCBUPXRoaXMuX2RlY29kZVRyYW5zZm9ybTtyfHw0IT09Ynx8VHx8KFQ9bmV3IEludDMyQXJyYXkoWy0yNTYsMjU1LC0yNTYsMjU1LC0yNTYsMjU1LC0yNTYsMjU1XSkpO2lmKFQpZm9yKGw9MDtsPHg7KWZvcihkPTAsZj0wO2Q8YjtkKyssbCsrLGYrPTIpeVtsXT0oeVtsXSpUW2ZdPj44KStUW2YrMV07cmV0dXJuIHl9LGdldCBfaXNDb2xvckNvbnZlcnNpb25OZWVkZWQoKXtyZXR1cm4gdGhpcy5hZG9iZT8hIXRoaXMuYWRvYmUudHJhbnNmb3JtQ29kZTozPT09dGhpcy5udW1Db21wb25lbnRzPzAhPT10aGlzLl9jb2xvclRyYW5zZm9ybSYmKDgyIT09dGhpcy5jb21wb25lbnRzWzBdLmluZGV4fHw3MSE9PXRoaXMuY29tcG9uZW50c1sxXS5pbmRleHx8NjYhPT10aGlzLmNvbXBvbmVudHNbMl0uaW5kZXgpOjE9PT10aGlzLl9jb2xvclRyYW5zZm9ybX0sX2NvbnZlcnRZY2NUb1JnYjpmdW5jdGlvbiBjb252ZXJ0WWNjVG9SZ2IoZSl7Zm9yKHZhciB0LHIsbixpPTAsbz1lLmxlbmd0aDtpPG87aSs9Myl7dD1lW2ldO3I9ZVtpKzFdO249ZVtpKzJdO2VbaV09dC0xNzkuNDU2KzEuNDAyKm47ZVtpKzFdPXQrMTM1LjQ1OS0uMzQ0KnItLjcxNCpuO2VbaSsyXT10LTIyNi44MTYrMS43NzIqcn1yZXR1cm4gZX0sX2NvbnZlcnRZY2NrVG9SZ2I6ZnVuY3Rpb24gY29udmVydFljY2tUb1JnYihlKXtmb3IodmFyIHQscixuLGksbz0wLHM9MCxhPWUubGVuZ3RoO3M8YTtzKz00KXt0PWVbc107cj1lW3MrMV07bj1lW3MrMl07aT1lW3MrM107ZVtvKytdPXIqKC02NjA2MzU2Njk0MjAzNjRlLTE5KnIrLjAwMDQzNzEzMDQ3NTkyNjIzMipuLTU0MDgwNjEwMDY0NTk5ZS0xOCp0Ky4wMDA0ODQ0OTc5NzEyMDI4MSppLS4xNTQzNjIxNTE4NzExMjYpLTEyMi42NzE5NTQwNjg5NCtuKigtLjAwMDk1Nzk2NDM3ODQ0NTc3MypuKy4wMDA4MTcwNzY5MTEzNDY2MjUqdC0uMDA0NzcyNzE0MDU0MDg3NDcqaSsxLjUzMzgwMjUzMjIxNzM0KSt0KiguMDAwOTYxMjUwMTg0MTMwNjg4KnQtLjAwMjY2MjU3MzMyMjgzOTMzKmkrLjQ4MzU3MDg4NDUxMjY1KStpKigtLjAwMDMzNjE5NzE3NzYxODM5NCppKy40ODQ3OTE1NjE0OTA3NzYpO2VbbysrXT0xMDcuMjY4MDM5Mzk3NzI0K3IqKDIxOTkyNzEwNDUyNTc0MWUtMTkqci0uMDAwNjQwOTkyMDE4Mjk3OTQ1Km4rLjAwMDY1OTM5NzAwMTI0NTU3Nyp0Ky4wMDA0MjYxMDU2NTI5Mzg4MzcqaS0uMTc2NDkxNzkyNDYyODc1KStuKigtLjAwMDc3ODI2OTk0MTUxMzY4MypuKy4wMDEzMDg3MjI2MTQwODI3NSp0Ky4wMDA3NzA0ODI2MzE4MDExMzIqaS0uMTUxMDUxNDkyNzc1NTYyKSt0KiguMDAxMjY5MzUzNjgxMTQ4NDMqdC0uMDAyNjUwOTAxODkwMTA4OTgqaSsuMjU4MDI5MTAyMDY4NDUpK2kqKC0uMDAwMzE4OTEzMTE3NTg4MzI4KmktLjIxMzc0MjQwMDMyMzY2NSk7ZVtvKytdPXIqKC0uMDAwNTcwMTE1MTk2OTczNjc3KnItMjYzNDA5MDUxMDA0NTg5ZS0xOSpuKy4wMDIwNzQxMDg4MTE1MDEyKnQtLjAwMjg4MjYwMjM2ODUzNDQyKmkrLjgxNDI3Mjk2ODM1OTI5NSktMjAuODEwMDEyNTQ2OTQ3K24qKC0xNTM0OTYwNTc0NDA5NzVlLTE5Km4tLjAwMDEzMjY4OTA0Mzk2MTQ0Nip0Ky4wMDA1NjA4MzM2OTEyNDI4MTIqaS0uMTk1MTUyMDI3NTM0MDQ5KSt0KiguMDAxNzQ0MTgxMzI5Mjc1ODIqdC0uMDAyNTUyNDMzMjE0MzkzNDcqaSsuMTE2OTM1MDIwNDY1MTQ1KStpKigtLjAwMDM0MzUzMTk5NjUxMDU1NSppKy4yNDE2NTI2MDIzMjQwNyl9cmV0dXJuIGUuc3ViYXJyYXkoMCxvKX0sX2NvbnZlcnRZY2NrVG9DbXlrOmZ1bmN0aW9uIGNvbnZlcnRZY2NrVG9DbXlrKGUpe2Zvcih2YXIgdCxyLG4saT0wLG89ZS5sZW5ndGg7aTxvO2krPTQpe3Q9ZVtpXTtyPWVbaSsxXTtuPWVbaSsyXTtlW2ldPTQzNC40NTYtdC0xLjQwMipuO2VbaSsxXT0xMTkuNTQxLXQrLjM0NCpyKy43MTQqbjtlW2krMl09NDgxLjgxNi10LTEuNzcyKnJ9cmV0dXJuIGV9LF9jb252ZXJ0Q215a1RvUmdiOmZ1bmN0aW9uIGNvbnZlcnRDbXlrVG9SZ2IoZSl7Zm9yKHZhciB0LHIsbixpLG89MCxzPTAsYT1lLmxlbmd0aDtzPGE7cys9NCl7dD1lW3NdO3I9ZVtzKzFdO249ZVtzKzJdO2k9ZVtzKzNdO2VbbysrXT0yNTUrdCooLTY3NDcxNDcwNzM2MDI0NDFlLTIwKnQrLjAwMDgzNzkyNjIxMjEwMTM3MjcqcisuMDAwMjg5NDcxODE4ODY0MzI5NCpuKy4wMDMyNjQyMzEwNTc1Mzc4MDYqaS0xLjExODU2MTE4NjcyMDM5MzcpK3IqKDI2Mzc0MTA3NjE2MDg5NDA1ZS0yMSpyLTg2MjY5NDkxNTg2Mzg1NzJlLTIwKm4tLjAwMDI3NDg3NjkwNjc0OTk0OTEqaS0uMDIxNTU2ODg3OTQ5Nzg5NjcpK24qKC0zODc4MDk5MjEyODY5MzYzZS0yMCpuLS4wMDAzMjY3ODA4Mjc5NDg1Mjg2KmkrLjA2ODY3NDIyMzg1OTUzNDUpLWkqKC4wMDAzMzYxOTcxNzc2MTgzOTM3KmkrLjc0MzA2NTkxNTEzNDIyNTQpO2VbbysrXT0yNTUrdCooLjAwMDEzNTk2MzcyODEzNTg4ODQ4KnQrLjAwMDkyNDUzNzEzMjU3MzU4NSpyKy4wMDAxMDU2NzM1OTYxODY4MzU5MypuKy4wMDA0NzkxODY0Njg3NDM2NTEyKmktLjMxMDk2ODk1ODc1MTU4NzUpK3IqKC0uMDAwMjM1NDUzNDYxMDgzNzAzNDQqcisuMDAwMjcwMjg0NTI1MzUzNDcxNCpuKy4wMDIwMjAwMzA4OTc3MzA3MTU2KmktLjc0ODgwNTIxNjcwMTU0OTQpK24qKDY4MzQ4MTU5OTgyMzU2NjJlLTIwKm4rLjAwMDE1MTY4NDUyMzYzNDYwOTczKmktLjA5NzUxOTI3Nzc0NzI4OTMzKS1pKiguMDAwMzE4OTEzMTE3NTg4MzI4MSppKy43MzY0ODgzODA3NzMzMTY4KTtlW28rK109MjU1K3QqKDEzNTk4NjUwNDExMzg1MzA3ZS0yMSp0Ky4wMDAxMjQyMzk1NjE3NTQ5MDg1MSpyKy4wMDA0NzUxOTg1MDk3NTgzNTg5Km4tMzY3MjkzMTc0NzY2MzA0MjJlLTIyKmktLjA1NTYyMTg2OTgwMjY0MDM0KStyKiguMDAwMTYxNDEzODA1OTg3MjQ2NzYqcisuMDAwOTY5MjIzOTEzMDcyNTE4NipuKy4wMDA3NzgyNjkyNDUwMDM2MjUzKmktLjQ0MDE1MjMyMzY3NTI2NDYzKStuKig1LjA2ODg4MjkxNDA2ODc2OWUtNypuKy4wMDE3Nzc4MzY5MDExMzc1MDcxKmktLjc1OTE0NTQ2NDk3NDk2MDkpLWkqKC4wMDAzNDM1MzE5OTY1MTA1NTUzKmkrLjcwNjM3NzAxODYxNjAxNDQpfXJldHVybiBlLnN1YmFycmF5KDAsbyl9LGdldERhdGEoe3dpZHRoOmUsaGVpZ2h0OnQsZm9yY2VSR0I6cj0hMSxpc1NvdXJjZVBERjpuPSExfSl7aWYodGhpcy5udW1Db21wb25lbnRzPjQpdGhyb3cgbmV3IEpwZWdFcnJvcigiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZSIpO3ZhciBpPXRoaXMuX2dldExpbmVhcml6ZWRCbG9ja0RhdGEoZSx0LG4pO2lmKDE9PT10aGlzLm51bUNvbXBvbmVudHMmJnIpe2Zvcih2YXIgbz1pLmxlbmd0aCxzPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKm8pLGE9MCxjPTA7YzxvO2MrKyl7dmFyIGw9aVtjXTtzW2ErK109bDtzW2ErK109bDtzW2ErK109bH1yZXR1cm4gc31pZigzPT09dGhpcy5udW1Db21wb25lbnRzJiZ0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZClyZXR1cm4gdGhpcy5fY29udmVydFljY1RvUmdiKGkpO2lmKDQ9PT10aGlzLm51bUNvbXBvbmVudHMpe2lmKHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKXJldHVybiByP3RoaXMuX2NvbnZlcnRZY2NrVG9SZ2IoaSk6dGhpcy5fY29udmVydFljY2tUb0NteWsoaSk7aWYocilyZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYihpKX1yZXR1cm4gaX19O3JldHVybiBKcGVnSW1hZ2V9KCk7dC5KcGVnSW1hZ2U9b30sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5KcHhJbWFnZT12b2lkIDA7dmFyIG49cigxKSxpPXIoNSksbz1yKDYpO2NsYXNzIEpweEVycm9yIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKCJKUFggZXJyb3I6ICIrZSl9fXZhciBzPWZ1bmN0aW9uIEpweEltYWdlQ2xvc3VyZSgpe3ZhciBlPXtMTDowLExIOjEsSEw6MSxISDoyfTtmdW5jdGlvbiBKcHhJbWFnZSgpe3RoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2U9ITF9SnB4SW1hZ2UucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZShlKXtpZig2NTM1OSE9PSgwLGkucmVhZFVpbnQxNikoZSwwKSlmb3IodmFyIHQ9MCxyPWUubGVuZ3RoO3Q8cjspe3ZhciBvPTgscz0oMCxpLnJlYWRVaW50MzIpKGUsdCksYT0oMCxpLnJlYWRVaW50MzIpKGUsdCs0KTt0Kz1vO2lmKDE9PT1zKXtzPTQyOTQ5NjcyOTYqKDAsaS5yZWFkVWludDMyKShlLHQpKygwLGkucmVhZFVpbnQzMikoZSx0KzQpO3QrPTg7bys9OH0wPT09cyYmKHM9ci10K28pO2lmKHM8byl0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgYm94IGZpZWxkIHNpemUiKTt2YXIgYz1zLW8sbD0hMDtzd2l0Y2goYSl7Y2FzZSAxNzg1NzM3ODMyOmw9ITE7YnJlYWs7Y2FzZSAxNjY4MjQ2NjQyOnZhciBkPWVbdF07aWYoMT09PWQpe3ZhciBmPSgwLGkucmVhZFVpbnQzMikoZSx0KzMpO3N3aXRjaChmKXtjYXNlIDE2OmNhc2UgMTc6Y2FzZSAxODpicmVhaztkZWZhdWx0OigwLG4ud2FybikoIlVua25vd24gY29sb3JzcGFjZSAiK2YpfX1lbHNlIDI9PT1kJiYoMCxuLmluZm8pKCJJQ0MgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIik7YnJlYWs7Y2FzZSAxNzg1NzM3ODI3OnRoaXMucGFyc2VDb2Rlc3RyZWFtKGUsdCx0K2MpO2JyZWFrO2Nhc2UgMTc4MzYzNmUzOjIxODc5MzczOCE9PSgwLGkucmVhZFVpbnQzMikoZSx0KSYmKDAsbi53YXJuKSgiSW52YWxpZCBKUDIgc2lnbmF0dXJlIik7YnJlYWs7Y2FzZSAxNzgzNjM0NDU4OmNhc2UgMTcxODkwOTI5NjpjYXNlIDE5MjAwOTk2OTc6Y2FzZSAxOTE5MjUxMjMyOmNhc2UgMTc2ODQ0OTEzODpicmVhaztkZWZhdWx0OnZhciBoPVN0cmluZy5mcm9tQ2hhckNvZGUoYT4+MjQmMjU1LGE+PjE2JjI1NSxhPj44JjI1NSwyNTUmYSk7KDAsbi53YXJuKSgiVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgIithKyIgKCIraCsiKSIpfWwmJih0Kz1jKX1lbHNlIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGUsMCxlLmxlbmd0aCl9LHBhcnNlSW1hZ2VQcm9wZXJ0aWVzOmZ1bmN0aW9uIEpweEltYWdlX3BhcnNlSW1hZ2VQcm9wZXJ0aWVzKGUpe2Zvcih2YXIgdD1lLmdldEJ5dGUoKTt0Pj0wOyl7aWYoNjUzNjE9PT0odDw8OHwodD1lLmdldEJ5dGUoKSkpKXtlLnNraXAoNCk7dmFyIHI9ZS5nZXRJbnQzMigpPj4+MCxuPWUuZ2V0SW50MzIoKT4+PjAsaT1lLmdldEludDMyKCk+Pj4wLG89ZS5nZXRJbnQzMigpPj4+MDtlLnNraXAoMTYpO3ZhciBzPWUuZ2V0VWludDE2KCk7dGhpcy53aWR0aD1yLWk7dGhpcy5oZWlnaHQ9bi1vO3RoaXMuY29tcG9uZW50c0NvdW50PXM7dGhpcy5iaXRzUGVyQ29tcG9uZW50PTg7cmV0dXJufX10aHJvdyBuZXcgSnB4RXJyb3IoIk5vIHNpemUgbWFya2VyIGZvdW5kIGluIEpQWCBzdHJlYW0iKX0scGFyc2VDb2Rlc3RyZWFtOmZ1bmN0aW9uIEpweEltYWdlX3BhcnNlQ29kZXN0cmVhbShlLHQscil7dmFyIG89e30scz0hMTt0cnl7Zm9yKHZhciBhPXQ7YSsxPHI7KXt2YXIgYz0oMCxpLnJlYWRVaW50MTYpKGUsYSk7YSs9Mjt2YXIgbCxkLGYsaCx1LHAsbT0wO3N3aXRjaChjKXtjYXNlIDY1MzU5Om8ubWFpbkhlYWRlcj0hMDticmVhaztjYXNlIDY1NDk3OmJyZWFrO2Nhc2UgNjUzNjE6bT0oMCxpLnJlYWRVaW50MTYpKGUsYSk7dmFyIGc9e307Zy5Yc2l6PSgwLGkucmVhZFVpbnQzMikoZSxhKzQpO2cuWXNpej0oMCxpLnJlYWRVaW50MzIpKGUsYSs4KTtnLlhPc2l6PSgwLGkucmVhZFVpbnQzMikoZSxhKzEyKTtnLllPc2l6PSgwLGkucmVhZFVpbnQzMikoZSxhKzE2KTtnLlhUc2l6PSgwLGkucmVhZFVpbnQzMikoZSxhKzIwKTtnLllUc2l6PSgwLGkucmVhZFVpbnQzMikoZSxhKzI0KTtnLlhUT3Npej0oMCxpLnJlYWRVaW50MzIpKGUsYSsyOCk7Zy5ZVE9zaXo9KDAsaS5yZWFkVWludDMyKShlLGErMzIpO3ZhciBiPSgwLGkucmVhZFVpbnQxNikoZSxhKzM2KTtnLkNzaXo9Yjt2YXIgeD1bXTtsPWErMzg7Zm9yKHZhciB5PTA7eTxiO3krKyl7dmFyIHY9e3ByZWNpc2lvbjoxKygxMjcmZVtsXSksaXNTaWduZWQ6ISEoMTI4JmVbbF0pLFhSc2l6OmVbbCsxXSxZUnNpejplW2wrMl19O2wrPTM7Y2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyh2LGcpO3gucHVzaCh2KX1vLlNJWj1nO28uY29tcG9uZW50cz14O2NhbGN1bGF0ZVRpbGVHcmlkcyhvLHgpO28uUUNDPVtdO28uQ09DPVtdO2JyZWFrO2Nhc2UgNjUzNzI6bT0oMCxpLnJlYWRVaW50MTYpKGUsYSk7dmFyIHc9e307bD1hKzI7c3dpdGNoKDMxJihkPWVbbCsrXSkpe2Nhc2UgMDpoPTg7dT0hMDticmVhaztjYXNlIDE6aD0xNjt1PSExO2JyZWFrO2Nhc2UgMjpoPTE2O3U9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiK2QpfXcubm9RdWFudGl6YXRpb249OD09PWg7dy5zY2FsYXJFeHBvdW5kZWQ9dTt3Lmd1YXJkQml0cz1kPj41O2Y9W107Zm9yKDtsPG0rYTspe3ZhciBUPXt9O2lmKDg9PT1oKXtULmVwc2lsb249ZVtsKytdPj4zO1QubXU9MH1lbHNle1QuZXBzaWxvbj1lW2xdPj4zO1QubXU9KDcmZVtsXSk8PDh8ZVtsKzFdO2wrPTJ9Zi5wdXNoKFQpfXcuU1BxY2RzPWY7aWYoby5tYWluSGVhZGVyKW8uUUNEPXc7ZWxzZXtvLmN1cnJlbnRUaWxlLlFDRD13O28uY3VycmVudFRpbGUuUUNDPVtdfWJyZWFrO2Nhc2UgNjUzNzM6bT0oMCxpLnJlYWRVaW50MTYpKGUsYSk7dmFyIEMsST17fTtsPWErMjtpZihvLlNJWi5Dc2l6PDI1NylDPWVbbCsrXTtlbHNle0M9KDAsaS5yZWFkVWludDE2KShlLGwpO2wrPTJ9c3dpdGNoKDMxJihkPWVbbCsrXSkpe2Nhc2UgMDpoPTg7dT0hMDticmVhaztjYXNlIDE6aD0xNjt1PSExO2JyZWFrO2Nhc2UgMjpoPTE2O3U9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiK2QpfUkubm9RdWFudGl6YXRpb249OD09PWg7SS5zY2FsYXJFeHBvdW5kZWQ9dTtJLmd1YXJkQml0cz1kPj41O2Y9W107Zm9yKDtsPG0rYTspe1Q9e307aWYoOD09PWgpe1QuZXBzaWxvbj1lW2wrK10+PjM7VC5tdT0wfWVsc2V7VC5lcHNpbG9uPWVbbF0+PjM7VC5tdT0oNyZlW2xdKTw8OHxlW2wrMV07bCs9Mn1mLnB1c2goVCl9SS5TUHFjZHM9ZjtvLm1haW5IZWFkZXI/by5RQ0NbQ109STpvLmN1cnJlbnRUaWxlLlFDQ1tDXT1JO2JyZWFrO2Nhc2UgNjUzNjI6bT0oMCxpLnJlYWRVaW50MTYpKGUsYSk7dmFyIFA9e307bD1hKzI7dmFyIGs9ZVtsKytdO1AuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cz0hISgxJmspO1Auc29wTWFya2VyVXNlZD0hISgyJmspO1AuZXBoTWFya2VyVXNlZD0hISg0JmspO1AucHJvZ3Jlc3Npb25PcmRlcj1lW2wrK107UC5sYXllcnNDb3VudD0oMCxpLnJlYWRVaW50MTYpKGUsbCk7bCs9MjtQLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtPWVbbCsrXTtQLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudD1lW2wrK107UC54Y2I9MisoMTUmZVtsKytdKTtQLnljYj0yKygxNSZlW2wrK10pO3ZhciBTPWVbbCsrXTtQLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3M9ISEoMSZTKTtQLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXM9ISEoMiZTKTtQLnRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcz0hISg0JlMpO1AudmVydGljYWxseVN0cmlwZT0hISg4JlMpO1AucHJlZGljdGFibGVUZXJtaW5hdGlvbj0hISgxNiZTKTtQLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQ9ISEoMzImUyk7UC5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb249ZVtsKytdO2lmKFAuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cyl7Zm9yKHZhciBfPVtdO2w8bSthOyl7dmFyIEU9ZVtsKytdO18ucHVzaCh7UFB4OjE1JkUsUFB5OkU+PjR9KX1QLnByZWNpbmN0c1NpemVzPV99dmFyIEI9W107UC5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzJiZCLnB1c2goInNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MiKTtQLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMmJkIucHVzaCgicmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcyIpO1AudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzJiZCLnB1c2goInRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcyIpO1AudmVydGljYWxseVN0cmlwZSYmQi5wdXNoKCJ2ZXJ0aWNhbGx5U3RyaXBlIik7UC5wcmVkaWN0YWJsZVRlcm1pbmF0aW9uJiZCLnB1c2goInByZWRpY3RhYmxlVGVybWluYXRpb24iKTtpZihCLmxlbmd0aD4wKXtzPSEwO3Rocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgQ09EIG9wdGlvbnMgKCIrQi5qb2luKCIsICIpKyIpIil9aWYoby5tYWluSGVhZGVyKW8uQ09EPVA7ZWxzZXtvLmN1cnJlbnRUaWxlLkNPRD1QO28uY3VycmVudFRpbGUuQ09DPVtdfWJyZWFrO2Nhc2UgNjU0MjQ6bT0oMCxpLnJlYWRVaW50MTYpKGUsYSk7KHA9e30pLmluZGV4PSgwLGkucmVhZFVpbnQxNikoZSxhKzIpO3AubGVuZ3RoPSgwLGkucmVhZFVpbnQzMikoZSxhKzQpO3AuZGF0YUVuZD1wLmxlbmd0aCthLTI7cC5wYXJ0SW5kZXg9ZVthKzhdO3AucGFydHNDb3VudD1lW2ErOV07by5tYWluSGVhZGVyPSExO2lmKDA9PT1wLnBhcnRJbmRleCl7cC5DT0Q9by5DT0Q7cC5DT0M9by5DT0Muc2xpY2UoMCk7cC5RQ0Q9by5RQ0Q7cC5RQ0M9by5RQ0Muc2xpY2UoMCl9by5jdXJyZW50VGlsZT1wO2JyZWFrO2Nhc2UgNjU0Mjc6aWYoMD09PShwPW8uY3VycmVudFRpbGUpLnBhcnRJbmRleCl7aW5pdGlhbGl6ZVRpbGUobyxwLmluZGV4KTtidWlsZFBhY2tldHMobyl9cGFyc2VUaWxlUGFja2V0cyhvLGUsYSxtPXAuZGF0YUVuZC1hKTticmVhaztjYXNlIDY1MzY1OmNhc2UgNjUzNjc6Y2FzZSA2NTM2ODpjYXNlIDY1MzgwOm09KDAsaS5yZWFkVWludDE2KShlLGEpO2JyZWFrO2Nhc2UgNjUzNjM6dGhyb3cgbmV3IEVycm9yKCJDb2Rlc3RyZWFtIGNvZGUgMHhGRjUzIChDT0MpIGlzIG5vdCBpbXBsZW1lbnRlZCIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvZGVzdHJlYW0gY29kZTogIitjLnRvU3RyaW5nKDE2KSl9YSs9bX19Y2F0Y2goZSl7aWYoc3x8dGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSl0aHJvdyBuZXcgSnB4RXJyb3IoZS5tZXNzYWdlKTsoMCxuLndhcm4pKCJKUFg6IFRyeWluZyB0byByZWNvdmVyIGZyb206ICIrZS5tZXNzYWdlKX10aGlzLnRpbGVzPWZ1bmN0aW9uIHRyYW5zZm9ybUNvbXBvbmVudHMoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jb21wb25lbnRzLG49dC5Dc2l6LGk9W10sbz0wLHM9ZS50aWxlcy5sZW5ndGg7bzxzO28rKyl7dmFyIGEsYz1lLnRpbGVzW29dLGw9W107Zm9yKGE9MDthPG47YSsrKWxbYV09dHJhbnNmb3JtVGlsZShlLGMsYSk7dmFyIGQsZixoLHUscCxtLGcsYj1sWzBdLHg9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGIuaXRlbXMubGVuZ3RoKm4pLHk9e2xlZnQ6Yi5sZWZ0LHRvcDpiLnRvcCx3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodCxpdGVtczp4fSx2PTA7aWYoYy5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKXt2YXIgdz00PT09bixUPWxbMF0uaXRlbXMsQz1sWzFdLml0ZW1zLEk9bFsyXS5pdGVtcyxQPXc/bFszXS5pdGVtczpudWxsO2Q9clswXS5wcmVjaXNpb24tODtmPS41KygxMjg8PGQpO3ZhciBrPWMuY29tcG9uZW50c1swXSxTPW4tMzt1PVQubGVuZ3RoO2lmKGsuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbilmb3IoaD0wO2g8dTtoKyssdis9Uyl7cD1UW2hdK2Y7bT1DW2hdO2c9SVtoXTtjb25zdCBlPXAtKGcrbT4+Mik7eFt2KytdPWUrZz4+ZDt4W3YrK109ZT4+ZDt4W3YrK109ZSttPj5kfWVsc2UgZm9yKGg9MDtoPHU7aCsrLHYrPVMpe3A9VFtoXStmO209Q1toXTtnPUlbaF07eFt2KytdPXArMS40MDIqZz4+ZDt4W3YrK109cC0uMzQ0MTMqbS0uNzE0MTQqZz4+ZDt4W3YrK109cCsxLjc3MiptPj5kfWlmKHcpZm9yKGg9MCx2PTM7aDx1O2grKyx2Kz00KXhbdl09UFtoXStmPj5kfWVsc2UgZm9yKGE9MDthPG47YSsrKXt2YXIgXz1sW2FdLml0ZW1zO2Q9clthXS5wcmVjaXNpb24tODtmPS41KygxMjg8PGQpO2Zvcih2PWEsaD0wLHU9Xy5sZW5ndGg7aDx1O2grKyl7eFt2XT1fW2hdK2Y+PmQ7dis9bn19aS5wdXNoKHkpfXJldHVybiBpfShvKTt0aGlzLndpZHRoPW8uU0laLlhzaXotby5TSVouWE9zaXo7dGhpcy5oZWlnaHQ9by5TSVouWXNpei1vLlNJWi5ZT3Npejt0aGlzLmNvbXBvbmVudHNDb3VudD1vLlNJWi5Dc2l6fX07ZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9uZW50RGltZW5zaW9ucyhlLHQpe2UueDA9TWF0aC5jZWlsKHQuWE9zaXovZS5YUnNpeik7ZS54MT1NYXRoLmNlaWwodC5Yc2l6L2UuWFJzaXopO2UueTA9TWF0aC5jZWlsKHQuWU9zaXovZS5ZUnNpeik7ZS55MT1NYXRoLmNlaWwodC5Zc2l6L2UuWVJzaXopO2Uud2lkdGg9ZS54MS1lLngwO2UuaGVpZ2h0PWUueTEtZS55MH1mdW5jdGlvbiBjYWxjdWxhdGVUaWxlR3JpZHMoZSx0KXtmb3IodmFyIHIsbj1lLlNJWixpPVtdLG89TWF0aC5jZWlsKChuLlhzaXotbi5YVE9zaXopL24uWFRzaXopLHM9TWF0aC5jZWlsKChuLllzaXotbi5ZVE9zaXopL24uWVRzaXopLGE9MDthPHM7YSsrKWZvcih2YXIgYz0wO2M8bztjKyspeyhyPXt9KS50eDA9TWF0aC5tYXgobi5YVE9zaXorYypuLlhUc2l6LG4uWE9zaXopO3IudHkwPU1hdGgubWF4KG4uWVRPc2l6K2Eqbi5ZVHNpeixuLllPc2l6KTtyLnR4MT1NYXRoLm1pbihuLlhUT3NpeisoYysxKSpuLlhUc2l6LG4uWHNpeik7ci50eTE9TWF0aC5taW4obi5ZVE9zaXorKGErMSkqbi5ZVHNpeixuLllzaXopO3Iud2lkdGg9ci50eDEtci50eDA7ci5oZWlnaHQ9ci50eTEtci50eTA7ci5jb21wb25lbnRzPVtdO2kucHVzaChyKX1lLnRpbGVzPWk7Zm9yKHZhciBsPTAsZD1uLkNzaXo7bDxkO2wrKylmb3IodmFyIGY9dFtsXSxoPTAsdT1pLmxlbmd0aDtoPHU7aCsrKXt2YXIgcD17fTtyPWlbaF07cC50Y3gwPU1hdGguY2VpbChyLnR4MC9mLlhSc2l6KTtwLnRjeTA9TWF0aC5jZWlsKHIudHkwL2YuWVJzaXopO3AudGN4MT1NYXRoLmNlaWwoci50eDEvZi5YUnNpeik7cC50Y3kxPU1hdGguY2VpbChyLnR5MS9mLllSc2l6KTtwLndpZHRoPXAudGN4MS1wLnRjeDA7cC5oZWlnaHQ9cC50Y3kxLXAudGN5MDtyLmNvbXBvbmVudHNbbF09cH19ZnVuY3Rpb24gZ2V0QmxvY2tzRGltZW5zaW9ucyhlLHQscil7dmFyIG49dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMsaT17fTtpZihuLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpe2kuUFB4PW4ucHJlY2luY3RzU2l6ZXNbcl0uUFB4O2kuUFB5PW4ucHJlY2luY3RzU2l6ZXNbcl0uUFB5fWVsc2V7aS5QUHg9MTU7aS5QUHk9MTV9aS54Y2JfPXI+MD9NYXRoLm1pbihuLnhjYixpLlBQeC0xKTpNYXRoLm1pbihuLnhjYixpLlBQeCk7aS55Y2JfPXI+MD9NYXRoLm1pbihuLnljYixpLlBQeS0xKTpNYXRoLm1pbihuLnljYixpLlBQeSk7cmV0dXJuIGl9ZnVuY3Rpb24gYnVpbGRQcmVjaW5jdHMoZSx0LHIpe3ZhciBuPTE8PHIuUFB4LGk9MTw8ci5QUHksbz0wPT09dC5yZXNMZXZlbCxzPTE8PHIuUFB4KyhvPzA6LTEpLGE9MTw8ci5QUHkrKG8/MDotMSksYz10LnRyeDE+dC50cngwP01hdGguY2VpbCh0LnRyeDEvbiktTWF0aC5mbG9vcih0LnRyeDAvbik6MCxsPXQudHJ5MT50LnRyeTA/TWF0aC5jZWlsKHQudHJ5MS9pKS1NYXRoLmZsb29yKHQudHJ5MC9pKTowLGQ9YypsO3QucHJlY2luY3RQYXJhbWV0ZXJzPXtwcmVjaW5jdFdpZHRoOm4scHJlY2luY3RIZWlnaHQ6aSxudW1wcmVjaW5jdHN3aWRlOmMsbnVtcHJlY2luY3RzaGlnaDpsLG51bXByZWNpbmN0czpkLHByZWNpbmN0V2lkdGhJblN1YmJhbmQ6cyxwcmVjaW5jdEhlaWdodEluU3ViYmFuZDphfX1mdW5jdGlvbiBidWlsZENvZGVibG9ja3MoZSx0LHIpe3ZhciBuLGksbyxzLGE9ci54Y2JfLGM9ci55Y2JfLGw9MTw8YSxkPTE8PGMsZj10LnRieDA+PmEsaD10LnRieTA+PmMsdT10LnRieDErbC0xPj5hLHA9dC50YnkxK2QtMT4+YyxtPXQucmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMsZz1bXSxiPVtdO2ZvcihpPWg7aTxwO2krKylmb3Iobj1mO248dTtuKyspeyhvPXtjYng6bixjYnk6aSx0YngwOmwqbix0YnkwOmQqaSx0YngxOmwqKG4rMSksdGJ5MTpkKihpKzEpfSkudGJ4MF89TWF0aC5tYXgodC50YngwLG8udGJ4MCk7by50YnkwXz1NYXRoLm1heCh0LnRieTAsby50YnkwKTtvLnRieDFfPU1hdGgubWluKHQudGJ4MSxvLnRieDEpO28udGJ5MV89TWF0aC5taW4odC50YnkxLG8udGJ5MSk7cz1NYXRoLmZsb29yKChvLnRieDBfLXQudGJ4MCkvbS5wcmVjaW5jdFdpZHRoSW5TdWJiYW5kKStNYXRoLmZsb29yKChvLnRieTBfLXQudGJ5MCkvbS5wcmVjaW5jdEhlaWdodEluU3ViYmFuZCkqbS5udW1wcmVjaW5jdHN3aWRlO28ucHJlY2luY3ROdW1iZXI9cztvLnN1YmJhbmRUeXBlPXQudHlwZTtvLkxibG9jaz0zO2lmKCEoby50YngxXzw9by50YngwX3x8by50YnkxXzw9by50YnkwXykpe2cucHVzaChvKTt2YXIgeD1iW3NdO2lmKHZvaWQgMCE9PXgpe248eC5jYnhNaW4/eC5jYnhNaW49bjpuPnguY2J4TWF4JiYoeC5jYnhNYXg9bik7aTx4LmNieU1pbj94LmNieE1pbj1pOmk+eC5jYnlNYXgmJih4LmNieU1heD1pKX1lbHNlIGJbc109eD17Y2J4TWluOm4sY2J5TWluOmksY2J4TWF4Om4sY2J5TWF4Oml9O28ucHJlY2luY3Q9eH19dC5jb2RlYmxvY2tQYXJhbWV0ZXJzPXtjb2RlYmxvY2tXaWR0aDphLGNvZGVibG9ja0hlaWdodDpjLG51bWNvZGVibG9ja3dpZGU6dS1mKzEsbnVtY29kZWJsb2NraGlnaDpwLWgrMX07dC5jb2RlYmxvY2tzPWc7dC5wcmVjaW5jdHM9Yn1mdW5jdGlvbiBjcmVhdGVQYWNrZXQoZSx0LHIpe2Zvcih2YXIgbj1bXSxpPWUuc3ViYmFuZHMsbz0wLHM9aS5sZW5ndGg7bzxzO28rKylmb3IodmFyIGE9aVtvXS5jb2RlYmxvY2tzLGM9MCxsPWEubGVuZ3RoO2M8bDtjKyspe3ZhciBkPWFbY107ZC5wcmVjaW5jdE51bWJlcj09PXQmJm4ucHVzaChkKX1yZXR1cm57bGF5ZXJOdW1iZXI6cixjb2RlYmxvY2tzOm59fWZ1bmN0aW9uIExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0saT1uLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsbz10LkNzaXoscz0wLGE9MDthPG87YSsrKXM9TWF0aC5tYXgocyxuLmNvbXBvbmVudHNbYV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7dmFyIGM9MCxsPTAsZD0wLGY9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7YzxpO2MrKyl7Zm9yKDtsPD1zO2wrKyl7Zm9yKDtkPG87ZCsrKXt2YXIgZT1uLmNvbXBvbmVudHNbZF07aWYoIShsPmUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkpe2Zvcih2YXIgdD1lLnJlc29sdXRpb25zW2xdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO2Y8cjspe3ZhciBhPWNyZWF0ZVBhY2tldCh0LGYsYyk7ZisrO3JldHVybiBhfWY9MH19ZD0wfWw9MH10aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0saT1uLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsbz10LkNzaXoscz0wLGE9MDthPG87YSsrKXM9TWF0aC5tYXgocyxuLmNvbXBvbmVudHNbYV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7dmFyIGM9MCxsPTAsZD0wLGY9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7Yzw9cztjKyspe2Zvcig7bDxpO2wrKyl7Zm9yKDtkPG87ZCsrKXt2YXIgZT1uLmNvbXBvbmVudHNbZF07aWYoIShjPmUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkpe2Zvcih2YXIgdD1lLnJlc29sdXRpb25zW2NdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO2Y8cjspe3ZhciBhPWNyZWF0ZVBhY2tldCh0LGYsbCk7ZisrO3JldHVybiBhfWY9MH19ZD0wfWw9MH10aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIFJlc29sdXRpb25Qb3NpdGlvbkNvbXBvbmVudExheWVySXRlcmF0b3IoZSl7dmFyIHQscixuLGksbz1lLlNJWixzPWUuY3VycmVudFRpbGUuaW5kZXgsYT1lLnRpbGVzW3NdLGM9YS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LGw9by5Dc2l6LGQ9MDtmb3Iobj0wO248bDtuKyspe2NvbnN0IGU9YS5jb21wb25lbnRzW25dO2Q9TWF0aC5tYXgoZCxlLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpfXZhciBmPW5ldyBJbnQzMkFycmF5KGQrMSk7Zm9yKHI9MDtyPD1kOysrcil7dmFyIGg9MDtmb3Iobj0wO248bDsrK24pe3ZhciB1PWEuY29tcG9uZW50c1tuXS5yZXNvbHV0aW9ucztyPHUubGVuZ3RoJiYoaD1NYXRoLm1heChoLHVbcl0ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cykpfWZbcl09aH10PTA7cj0wO249MDtpPTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO3I8PWQ7cisrKXtmb3IoO2k8ZltyXTtpKyspe2Zvcig7bjxsO24rKyl7Y29uc3QgbD1hLmNvbXBvbmVudHNbbl07aWYoIShyPmwuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkpe3ZhciBlPWwucmVzb2x1dGlvbnNbcl0sbz1lLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7aWYoIShpPj1vKSl7Zm9yKDt0PGM7KXt2YXIgcz1jcmVhdGVQYWNrZXQoZSxpLHQpO3QrKztyZXR1cm4gc310PTB9fX1uPTB9aT0wfXRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihlKXt2YXIgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGk9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LG89dC5Dc2l6LHM9Z2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZShuKSxhPXMsYz0wLGw9MCxkPTAsZj0wLGg9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7aDxhLm1heE51bUhpZ2g7aCsrKXtmb3IoO2Y8YS5tYXhOdW1XaWRlO2YrKyl7Zm9yKDtkPG87ZCsrKXtmb3IodmFyIGU9bi5jb21wb25lbnRzW2RdLHQ9ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O2w8PXQ7bCsrKXt2YXIgcj1lLnJlc29sdXRpb25zW2xdLHU9cy5jb21wb25lbnRzW2RdLnJlc29sdXRpb25zW2xdLHA9Z2V0UHJlY2luY3RJbmRleElmRXhpc3QoZixoLHUsYSxyKTtpZihudWxsIT09cCl7Zm9yKDtjPGk7KXt2YXIgbT1jcmVhdGVQYWNrZXQocixwLGMpO2MrKztyZXR1cm4gbX1jPTB9fWw9MH1kPTB9Zj0wfXRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihlKXt2YXIgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGk9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LG89dC5Dc2l6LHM9Z2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZShuKSxhPTAsYz0wLGw9MCxkPTAsZj0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCl7Zm9yKDtsPG87KytsKXtmb3IodmFyIGU9bi5jb21wb25lbnRzW2xdLHQ9cy5jb21wb25lbnRzW2xdLHI9ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O2Y8dC5tYXhOdW1IaWdoO2YrKyl7Zm9yKDtkPHQubWF4TnVtV2lkZTtkKyspe2Zvcig7Yzw9cjtjKyspe3ZhciBoPWUucmVzb2x1dGlvbnNbY10sdT10LnJlc29sdXRpb25zW2NdLHA9Z2V0UHJlY2luY3RJbmRleElmRXhpc3QoZCxmLHUsdCxoKTtpZihudWxsIT09cCl7Zm9yKDthPGk7KXt2YXIgbT1jcmVhdGVQYWNrZXQoaCxwLGEpO2ErKztyZXR1cm4gbX1hPTB9fWM9MH1kPTB9Zj0wfXRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoZSx0LHIsbixpKXt2YXIgbz1lKm4ubWluV2lkdGgscz10Km4ubWluSGVpZ2h0O2lmKG8lci53aWR0aCE9MHx8cyVyLmhlaWdodCE9MClyZXR1cm4gbnVsbDt2YXIgYT1zL3Iud2lkdGgqaS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTtyZXR1cm4gby9yLmhlaWdodCthfWZ1bmN0aW9uIGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUoZSl7Zm9yKHZhciB0PWUuY29tcG9uZW50cy5sZW5ndGgscj1OdW1iZXIuTUFYX1ZBTFVFLG49TnVtYmVyLk1BWF9WQUxVRSxpPTAsbz0wLHM9bmV3IEFycmF5KHQpLGE9MDthPHQ7YSsrKXtmb3IodmFyIGM9ZS5jb21wb25lbnRzW2FdLGw9Yy5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LGQ9bmV3IEFycmF5KGwrMSksZj1OdW1iZXIuTUFYX1ZBTFVFLGg9TnVtYmVyLk1BWF9WQUxVRSx1PTAscD0wLG09MSxnPWw7Zz49MDstLWcpe3ZhciBiPWMucmVzb2x1dGlvbnNbZ10seD1tKmIucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0V2lkdGgseT1tKmIucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0O2Y9TWF0aC5taW4oZix4KTtoPU1hdGgubWluKGgseSk7dT1NYXRoLm1heCh1LGIucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGUpO3A9TWF0aC5tYXgocCxiLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHNoaWdoKTtkW2ddPXt3aWR0aDp4LGhlaWdodDp5fTttPDw9MX1yPU1hdGgubWluKHIsZik7bj1NYXRoLm1pbihuLGgpO2k9TWF0aC5tYXgoaSx1KTtvPU1hdGgubWF4KG8scCk7c1thXT17cmVzb2x1dGlvbnM6ZCxtaW5XaWR0aDpmLG1pbkhlaWdodDpoLG1heE51bVdpZGU6dSxtYXhOdW1IaWdoOnB9fXJldHVybntjb21wb25lbnRzOnMsbWluV2lkdGg6cixtaW5IZWlnaHQ6bixtYXhOdW1XaWRlOmksbWF4TnVtSGlnaDpvfX1mdW5jdGlvbiBidWlsZFBhY2tldHMoZSl7Zm9yKHZhciB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0saT10LkNzaXosbz0wO288aTtvKyspe2Zvcih2YXIgcz1uLmNvbXBvbmVudHNbb10sYT1zLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsYz1bXSxsPVtdLGQ9MDtkPD1hO2QrKyl7dmFyIGYsaD1nZXRCbG9ja3NEaW1lbnNpb25zKDAscyxkKSx1PXt9LHA9MTw8YS1kO3UudHJ4MD1NYXRoLmNlaWwocy50Y3gwL3ApO3UudHJ5MD1NYXRoLmNlaWwocy50Y3kwL3ApO3UudHJ4MT1NYXRoLmNlaWwocy50Y3gxL3ApO3UudHJ5MT1NYXRoLmNlaWwocy50Y3kxL3ApO3UucmVzTGV2ZWw9ZDtidWlsZFByZWNpbmN0cygwLHUsaCk7Yy5wdXNoKHUpO2lmKDA9PT1kKXsoZj17fSkudHlwZT0iTEwiO2YudGJ4MD1NYXRoLmNlaWwocy50Y3gwL3ApO2YudGJ5MD1NYXRoLmNlaWwocy50Y3kwL3ApO2YudGJ4MT1NYXRoLmNlaWwocy50Y3gxL3ApO2YudGJ5MT1NYXRoLmNlaWwocy50Y3kxL3ApO2YucmVzb2x1dGlvbj11O2J1aWxkQ29kZWJsb2NrcygwLGYsaCk7bC5wdXNoKGYpO3Uuc3ViYmFuZHM9W2ZdfWVsc2V7dmFyIG09MTw8YS1kKzEsZz1bXTsoZj17fSkudHlwZT0iSEwiO2YudGJ4MD1NYXRoLmNlaWwocy50Y3gwL20tLjUpO2YudGJ5MD1NYXRoLmNlaWwocy50Y3kwL20pO2YudGJ4MT1NYXRoLmNlaWwocy50Y3gxL20tLjUpO2YudGJ5MT1NYXRoLmNlaWwocy50Y3kxL20pO2YucmVzb2x1dGlvbj11O2J1aWxkQ29kZWJsb2NrcygwLGYsaCk7bC5wdXNoKGYpO2cucHVzaChmKTsoZj17fSkudHlwZT0iTEgiO2YudGJ4MD1NYXRoLmNlaWwocy50Y3gwL20pO2YudGJ5MD1NYXRoLmNlaWwocy50Y3kwL20tLjUpO2YudGJ4MT1NYXRoLmNlaWwocy50Y3gxL20pO2YudGJ5MT1NYXRoLmNlaWwocy50Y3kxL20tLjUpO2YucmVzb2x1dGlvbj11O2J1aWxkQ29kZWJsb2NrcygwLGYsaCk7bC5wdXNoKGYpO2cucHVzaChmKTsoZj17fSkudHlwZT0iSEgiO2YudGJ4MD1NYXRoLmNlaWwocy50Y3gwL20tLjUpO2YudGJ5MD1NYXRoLmNlaWwocy50Y3kwL20tLjUpO2YudGJ4MT1NYXRoLmNlaWwocy50Y3gxL20tLjUpO2YudGJ5MT1NYXRoLmNlaWwocy50Y3kxL20tLjUpO2YucmVzb2x1dGlvbj11O2J1aWxkQ29kZWJsb2NrcygwLGYsaCk7bC5wdXNoKGYpO2cucHVzaChmKTt1LnN1YmJhbmRzPWd9fXMucmVzb2x1dGlvbnM9YztzLnN1YmJhbmRzPWx9dmFyIGI9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7c3dpdGNoKGIpe2Nhc2UgMDpuLnBhY2tldHNJdGVyYXRvcj1uZXcgTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihlKTticmVhaztjYXNlIDE6bi5wYWNrZXRzSXRlcmF0b3I9bmV3IFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSk7YnJlYWs7Y2FzZSAyOm4ucGFja2V0c0l0ZXJhdG9yPW5ldyBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKGUpO2JyZWFrO2Nhc2UgMzpuLnBhY2tldHNJdGVyYXRvcj1uZXcgUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihlKTticmVhaztjYXNlIDQ6bi5wYWNrZXRzSXRlcmF0b3I9bmV3IENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSnB4RXJyb3IoIlVuc3VwcG9ydGVkIHByb2dyZXNzaW9uIG9yZGVyICIrYil9fWZ1bmN0aW9uIHBhcnNlVGlsZVBhY2tldHMoZSxuLG8scyl7dmFyIGEsYz0wLGw9MCxkPSExO2Z1bmN0aW9uIHJlYWRCaXRzKGUpe2Zvcig7bDxlOyl7dmFyIHQ9bltvK2NdO2MrKztpZihkKXthPWE8PDd8dDtsKz03O2Q9ITF9ZWxzZXthPWE8PDh8dDtsKz04fTI1NT09PXQmJihkPSEwKX1yZXR1cm4gYT4+PihsLT1lKSYoMTw8ZSktMX1mdW5jdGlvbiBza2lwTWFya2VySWZFcXVhbChlKXtpZigyNTU9PT1uW28rYy0xXSYmbltvK2NdPT09ZSl7c2tpcEJ5dGVzKDEpO3JldHVybiEwfWlmKDI1NT09PW5bbytjXSYmbltvK2MrMV09PT1lKXtza2lwQnl0ZXMoMik7cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gc2tpcEJ5dGVzKGUpe2MrPWV9ZnVuY3Rpb24gYWxpZ25Ub0J5dGUoKXtsPTA7aWYoZCl7YysrO2Q9ITF9fWZ1bmN0aW9uIHJlYWRDb2RpbmdwYXNzZXMoKXtpZigwPT09cmVhZEJpdHMoMSkpcmV0dXJuIDE7aWYoMD09PXJlYWRCaXRzKDEpKXJldHVybiAyO3ZhciBlPXJlYWRCaXRzKDIpO3JldHVybiBlPDM/ZSszOihlPXJlYWRCaXRzKDUpKTwzMT9lKzY6KGU9cmVhZEJpdHMoNykpKzM3fWZvcih2YXIgZj1lLmN1cnJlbnRUaWxlLmluZGV4LGg9ZS50aWxlc1tmXSx1PWUuQ09ELnNvcE1hcmtlclVzZWQscD1lLkNPRC5lcGhNYXJrZXJVc2VkLG09aC5wYWNrZXRzSXRlcmF0b3I7YzxzOyl7YWxpZ25Ub0J5dGUoKTt1JiZza2lwTWFya2VySWZFcXVhbCgxNDUpJiZza2lwQnl0ZXMoNCk7dmFyIGc9bS5uZXh0UGFja2V0KCk7aWYocmVhZEJpdHMoMSkpe2Zvcih2YXIgYix4PWcubGF5ZXJOdW1iZXIseT1bXSx2PTAsdz1nLmNvZGVibG9ja3MubGVuZ3RoO3Y8dzt2Kyspe3ZhciBUPShiPWcuY29kZWJsb2Nrc1t2XSkucHJlY2luY3QsQz1iLmNieC1ULmNieE1pbixJPWIuY2J5LVQuY2J5TWluLFA9ITEsaz0hMTtpZih2b2lkIDAhPT1iLmluY2x1ZGVkKVA9ISFyZWFkQml0cygxKTtlbHNle3ZhciBTLF87aWYodm9pZCAwIT09KFQ9Yi5wcmVjaW5jdCkuaW5jbHVzaW9uVHJlZSlTPVQuaW5jbHVzaW9uVHJlZTtlbHNle3ZhciBFPVQuY2J4TWF4LVQuY2J4TWluKzEsQj1ULmNieU1heC1ULmNieU1pbisxO1M9bmV3IHIoRSxCLHgpO189bmV3IHQoRSxCKTtULmluY2x1c2lvblRyZWU9UztULnplcm9CaXRQbGFuZXNUcmVlPV99aWYoUy5yZXNldChDLEkseCkpZm9yKDs7KXtpZighcmVhZEJpdHMoMSkpe1MuaW5jcmVtZW50VmFsdWUoeCk7YnJlYWt9aWYoIVMubmV4dExldmVsKCkpe2IuaW5jbHVkZWQ9ITA7UD1rPSEwO2JyZWFrfX19aWYoUCl7aWYoayl7KF89VC56ZXJvQml0UGxhbmVzVHJlZSkucmVzZXQoQyxJKTtmb3IoOzspaWYocmVhZEJpdHMoMSkpe2lmKCFfLm5leHRMZXZlbCgpKWJyZWFrfWVsc2UgXy5pbmNyZW1lbnRWYWx1ZSgpO2IuemVyb0JpdFBsYW5lcz1fLnZhbHVlfWZvcih2YXIgTD1yZWFkQ29kaW5ncGFzc2VzKCk7cmVhZEJpdHMoMSk7KWIuTGJsb2NrKys7dmFyIEQ9KDAsaS5sb2cyKShMKSxNPXJlYWRCaXRzKChMPDE8PEQ/RC0xOkQpK2IuTGJsb2NrKTt5LnB1c2goe2NvZGVibG9jazpiLGNvZGluZ3Bhc3NlczpMLGRhdGFMZW5ndGg6TX0pfX1hbGlnblRvQnl0ZSgpO3AmJnNraXBNYXJrZXJJZkVxdWFsKDE0Nik7Zm9yKDt5Lmxlbmd0aD4wOyl7dmFyIE89eS5zaGlmdCgpO3ZvaWQgMD09PShiPU8uY29kZWJsb2NrKS5kYXRhJiYoYi5kYXRhPVtdKTtiLmRhdGEucHVzaCh7ZGF0YTpuLHN0YXJ0Om8rYyxlbmQ6bytjK08uZGF0YUxlbmd0aCxjb2RpbmdwYXNzZXM6Ty5jb2RpbmdwYXNzZXN9KTtjKz1PLmRhdGFMZW5ndGh9fX1yZXR1cm4gY31mdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKGUsdCxyLG4saSxhLGMsbCl7Zm9yKHZhciBkPW4udGJ4MCxmPW4udGJ5MCxoPW4udGJ4MS1uLnRieDAsdT1uLmNvZGVibG9ja3MscD0iSCI9PT1uLnR5cGUuY2hhckF0KDApPzE6MCxtPSJIIj09PW4udHlwZS5jaGFyQXQoMSk/dDowLGc9MCxiPXUubGVuZ3RoO2c8YjsrK2cpe3ZhciB4PXVbZ10seT14LnRieDFfLXgudGJ4MF8sdj14LnRieTFfLXgudGJ5MF87aWYoMCE9PXkmJjAhPT12JiZ2b2lkIDAhPT14LmRhdGEpe3ZhciB3LFQ7dz1uZXcgcyh5LHYseC5zdWJiYW5kVHlwZSx4Lnplcm9CaXRQbGFuZXMsYSk7VD0yO3ZhciBDLEksUCxrPXguZGF0YSxTPTAsXz0wO2ZvcihDPTAsST1rLmxlbmd0aDtDPEk7QysrKXtTKz0oUD1rW0NdKS5lbmQtUC5zdGFydDtfKz1QLmNvZGluZ3Bhc3Nlc312YXIgRT1uZXcgVWludDhBcnJheShTKSxCPTA7Zm9yKEM9MCxJPWsubGVuZ3RoO0M8STtDKyspe3ZhciBMPShQPWtbQ10pLmRhdGEuc3ViYXJyYXkoUC5zdGFydCxQLmVuZCk7RS5zZXQoTCxCKTtCKz1MLmxlbmd0aH12YXIgRD1uZXcgby5Bcml0aG1ldGljRGVjb2RlcihFLDAsUyk7dy5zZXREZWNvZGVyKEQpO2ZvcihDPTA7QzxfO0MrKyl7c3dpdGNoKFQpe2Nhc2UgMDp3LnJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpO2JyZWFrO2Nhc2UgMTp3LnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7YnJlYWs7Y2FzZSAyOncucnVuQ2xlYW51cFBhc3MoKTtsJiZ3LmNoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCl9VD0oVCsxKSUzfXZhciBNLE8sQSxSPXgudGJ4MF8tZCsoeC50YnkwXy1mKSpoLFU9dy5jb2VmZmljZW50c1NpZ24sRj13LmNvZWZmaWNlbnRzTWFnbml0dWRlLE49dy5iaXRzRGVjb2RlZCxIPWM/MDouNTtCPTA7dmFyIEo9IkxMIiE9PW4udHlwZTtmb3IoQz0wO0M8djtDKyspe3ZhciB6PTIqKFIvaHwwKSoodC1oKStwK207Zm9yKE09MDtNPHk7TSsrKXtpZigwIT09KE89RltCXSkpe089KE8rSCkqaTswIT09VVtCXSYmKE89LU8pO0E9TltCXTt2YXIgWD1KP3orKFI8PDEpOlI7ZVtYXT1jJiZBPj1hP086TyooMTw8YS1BKX1SKys7QisrfVIrPWgteX19fX1mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHQscixuKXtmb3IodmFyIGk9ci5jb21wb25lbnRzW25dLG89aS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMscz1pLnF1YW50aXphdGlvblBhcmFtZXRlcnMsYT1vLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCxkPXMuU1BxY2RzLGY9cy5zY2FsYXJFeHBvdW5kZWQsaD1zLmd1YXJkQml0cyx1PW8uc2VnbWVudGF0aW9uU3ltYm9sVXNlZCxwPXQuY29tcG9uZW50c1tuXS5wcmVjaXNpb24sbT1vLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbixnPW0/bmV3IGw6bmV3IGMsYj1bXSx4PTAseT0wO3k8PWE7eSsrKXtmb3IodmFyIHY9aS5yZXNvbHV0aW9uc1t5XSx3PXYudHJ4MS12LnRyeDAsVD12LnRyeTEtdi50cnkwLEM9bmV3IEZsb2F0MzJBcnJheSh3KlQpLEk9MCxQPXYuc3ViYmFuZHMubGVuZ3RoO0k8UDtJKyspe3ZhciBrLFM7aWYoZil7az1kW3hdLm11O1M9ZFt4XS5lcHNpbG9uO3grK31lbHNle2s9ZFswXS5tdTtTPWRbMF0uZXBzaWxvbisoeT4wPzEteTowKX12YXIgXz12LnN1YmJhbmRzW0ldLEU9ZVtfLnR5cGVdO2NvcHlDb2VmZmljaWVudHMoQyx3LDAsXyxtPzE6MioqKHArRS1TKSooMStrLzIwNDgpLGgrUy0xLG0sdSl9Yi5wdXNoKHt3aWR0aDp3LGhlaWdodDpULGl0ZW1zOkN9KX12YXIgQj1nLmNhbGN1bGF0ZShiLGkudGN4MCxpLnRjeTApO3JldHVybntsZWZ0OmkudGN4MCx0b3A6aS50Y3kwLHdpZHRoOkIud2lkdGgsaGVpZ2h0OkIuaGVpZ2h0LGl0ZW1zOkIuaXRlbXN9fWZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGUsdCl7Zm9yKHZhciByPWUuU0laLkNzaXosbj1lLnRpbGVzW3RdLGk9MDtpPHI7aSsrKXt2YXIgbz1uLmNvbXBvbmVudHNbaV0scz12b2lkIDAhPT1lLmN1cnJlbnRUaWxlLlFDQ1tpXT9lLmN1cnJlbnRUaWxlLlFDQ1tpXTplLmN1cnJlbnRUaWxlLlFDRDtvLnF1YW50aXphdGlvblBhcmFtZXRlcnM9czt2YXIgYT12b2lkIDAhPT1lLmN1cnJlbnRUaWxlLkNPQ1tpXT9lLmN1cnJlbnRUaWxlLkNPQ1tpXTplLmN1cnJlbnRUaWxlLkNPRDtvLmNvZGluZ1N0eWxlUGFyYW1ldGVycz1hfW4uY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycz1lLmN1cnJlbnRUaWxlLkNPRH12YXIgdD1mdW5jdGlvbiBUYWdUcmVlQ2xvc3VyZSgpe2Z1bmN0aW9uIFRhZ1RyZWUoZSx0KXt2YXIgcj0oMCxpLmxvZzIpKE1hdGgubWF4KGUsdCkpKzE7dGhpcy5sZXZlbHM9W107Zm9yKHZhciBuPTA7bjxyO24rKyl7dmFyIG89e3dpZHRoOmUsaGVpZ2h0OnQsaXRlbXM6W119O3RoaXMubGV2ZWxzLnB1c2gobyk7ZT1NYXRoLmNlaWwoZS8yKTt0PU1hdGguY2VpbCh0LzIpfX1UYWdUcmVlLnByb3RvdHlwZT17cmVzZXQ6ZnVuY3Rpb24gVGFnVHJlZV9yZXNldChlLHQpe2Zvcih2YXIgcixuPTAsaT0wO248dGhpcy5sZXZlbHMubGVuZ3RoOyl7dmFyIG89ZSt0KihyPXRoaXMubGV2ZWxzW25dKS53aWR0aDtpZih2b2lkIDAhPT1yLml0ZW1zW29dKXtpPXIuaXRlbXNbb107YnJlYWt9ci5pbmRleD1vO2U+Pj0xO3Q+Pj0xO24rK31uLS07KHI9dGhpcy5sZXZlbHNbbl0pLml0ZW1zW3IuaW5kZXhdPWk7dGhpcy5jdXJyZW50TGV2ZWw9bjtkZWxldGUgdGhpcy52YWx1ZX0saW5jcmVtZW50VmFsdWU6ZnVuY3Rpb24gVGFnVHJlZV9pbmNyZW1lbnRWYWx1ZSgpe3ZhciBlPXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTtlLml0ZW1zW2UuaW5kZXhdKyt9LG5leHRMZXZlbDpmdW5jdGlvbiBUYWdUcmVlX25leHRMZXZlbCgpe3ZhciBlPXRoaXMuY3VycmVudExldmVsLHQ9dGhpcy5sZXZlbHNbZV0scj10Lml0ZW1zW3QuaW5kZXhdO2lmKC0tZTwwKXt0aGlzLnZhbHVlPXI7cmV0dXJuITF9dGhpcy5jdXJyZW50TGV2ZWw9ZTsodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cjtyZXR1cm4hMH19O3JldHVybiBUYWdUcmVlfSgpLHI9ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZUNsb3N1cmUoKXtmdW5jdGlvbiBJbmNsdXNpb25UcmVlKGUsdCxyKXt2YXIgbj0oMCxpLmxvZzIpKE1hdGgubWF4KGUsdCkpKzE7dGhpcy5sZXZlbHM9W107Zm9yKHZhciBvPTA7bzxuO28rKyl7Zm9yKHZhciBzPW5ldyBVaW50OEFycmF5KGUqdCksYT0wLGM9cy5sZW5ndGg7YTxjO2ErKylzW2FdPXI7dmFyIGw9e3dpZHRoOmUsaGVpZ2h0OnQsaXRlbXM6c307dGhpcy5sZXZlbHMucHVzaChsKTtlPU1hdGguY2VpbChlLzIpO3Q9TWF0aC5jZWlsKHQvMil9fUluY2x1c2lvblRyZWUucHJvdG90eXBlPXtyZXNldDpmdW5jdGlvbiBJbmNsdXNpb25UcmVlX3Jlc2V0KGUsdCxyKXtmb3IodmFyIG49MDtuPHRoaXMubGV2ZWxzLmxlbmd0aDspe3ZhciBpPXRoaXMubGV2ZWxzW25dLG89ZSt0Kmkud2lkdGg7aS5pbmRleD1vO3ZhciBzPWkuaXRlbXNbb107aWYoMjU1PT09cylicmVhaztpZihzPnIpe3RoaXMuY3VycmVudExldmVsPW47dGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTtyZXR1cm4hMX1lPj49MTt0Pj49MTtuKyt9dGhpcy5jdXJyZW50TGV2ZWw9bi0xO3JldHVybiEwfSxpbmNyZW1lbnRWYWx1ZTpmdW5jdGlvbiBJbmNsdXNpb25UcmVlX2luY3JlbWVudFZhbHVlKGUpe3ZhciB0PXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTt0Lml0ZW1zW3QuaW5kZXhdPWUrMTt0aGlzLnByb3BhZ2F0ZVZhbHVlcygpfSxwcm9wYWdhdGVWYWx1ZXM6ZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9wcm9wYWdhdGVWYWx1ZXMoKXtmb3IodmFyIGU9dGhpcy5jdXJyZW50TGV2ZWwsdD10aGlzLmxldmVsc1tlXSxyPXQuaXRlbXNbdC5pbmRleF07LS1lPj0wOykodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cn0sbmV4dExldmVsOmZ1bmN0aW9uIEluY2x1c2lvblRyZWVfbmV4dExldmVsKCl7dmFyIGU9dGhpcy5jdXJyZW50TGV2ZWwsdD10aGlzLmxldmVsc1tlXSxyPXQuaXRlbXNbdC5pbmRleF07dC5pdGVtc1t0LmluZGV4XT0yNTU7aWYoLS1lPDApcmV0dXJuITE7dGhpcy5jdXJyZW50TGV2ZWw9ZTsodD10aGlzLmxldmVsc1tlXSkuaXRlbXNbdC5pbmRleF09cjtyZXR1cm4hMH19O3JldHVybiBJbmNsdXNpb25UcmVlfSgpLHM9ZnVuY3Rpb24gQml0TW9kZWxDbG9zdXJlKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoWzAsNSw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMSw2LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwyLDYsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDIsNiw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMiw2LDgsMCwzLDcsOCwwLDQsNyw4XSksdD1uZXcgVWludDhBcnJheShbMCwzLDQsMCw1LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwxLDMsNCwwLDYsNyw3LDAsOCw4LDgsMCwwLDAsMCwwLDIsMyw0LDAsNiw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMiwzLDQsMCw2LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwyLDMsNCwwLDYsNyw3LDAsOCw4LDhdKSxyPW5ldyBVaW50OEFycmF5KFswLDEsMiwwLDEsMiwyLDAsMiwyLDIsMCwwLDAsMCwwLDMsNCw1LDAsNCw1LDUsMCw1LDUsNSwwLDAsMCwwLDAsNiw3LDcsMCw3LDcsNywwLDcsNyw3LDAsMCwwLDAsMCw4LDgsOCwwLDgsOCw4LDAsOCw4LDgsMCwwLDAsMCwwLDgsOCw4LDAsOCw4LDgsMCw4LDgsOF0pO2Z1bmN0aW9uIEJpdE1vZGVsKG4saSxvLHMsYSl7dGhpcy53aWR0aD1uO3RoaXMuaGVpZ2h0PWk7bGV0IGM7Yz0iSEgiPT09bz9yOiJITCI9PT1vP3Q6ZTt0aGlzLmNvbnRleHRMYWJlbFRhYmxlPWM7dmFyIGw9bippO3RoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlPW5ldyBVaW50OEFycmF5KGwpO3RoaXMuY29lZmZpY2VudHNTaWduPW5ldyBVaW50OEFycmF5KGwpO2xldCBkO2Q9YT4xND9uZXcgVWludDMyQXJyYXkobCk6YT42P25ldyBVaW50MTZBcnJheShsKTpuZXcgVWludDhBcnJheShsKTt0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlPWQ7dGhpcy5wcm9jZXNzaW5nRmxhZ3M9bmV3IFVpbnQ4QXJyYXkobCk7dmFyIGY9bmV3IFVpbnQ4QXJyYXkobCk7aWYoMCE9PXMpZm9yKHZhciBoPTA7aDxsO2grKylmW2hdPXM7dGhpcy5iaXRzRGVjb2RlZD1mO3RoaXMucmVzZXQoKX1CaXRNb2RlbC5wcm90b3R5cGU9e3NldERlY29kZXI6ZnVuY3Rpb24gQml0TW9kZWxfc2V0RGVjb2RlcihlKXt0aGlzLmRlY29kZXI9ZX0scmVzZXQ6ZnVuY3Rpb24gQml0TW9kZWxfcmVzZXQoKXt0aGlzLmNvbnRleHRzPW5ldyBJbnQ4QXJyYXkoMTkpO3RoaXMuY29udGV4dHNbMF09ODt0aGlzLmNvbnRleHRzWzE3XT05Mjt0aGlzLmNvbnRleHRzWzE4XT02fSxzZXROZWlnaGJvcnNTaWduaWZpY2FuY2U6ZnVuY3Rpb24gQml0TW9kZWxfc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGUsdCxyKXt2YXIgbixpPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLG89dGhpcy53aWR0aCxzPXRoaXMuaGVpZ2h0LGE9dD4wLGM9dCsxPG87aWYoZT4wKXtuPXItbzthJiYoaVtuLTFdKz0xNik7YyYmKGlbbisxXSs9MTYpO2lbbl0rPTR9aWYoZSsxPHMpe249citvO2EmJihpW24tMV0rPTE2KTtjJiYoaVtuKzFdKz0xNik7aVtuXSs9NH1hJiYoaVtyLTFdKz0xKTtjJiYoaVtyKzFdKz0xKTtpW3JdfD0xMjh9LHJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzczpmdW5jdGlvbiBCaXRNb2RlbF9ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKXtmb3IodmFyIGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LG49dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSxpPXRoaXMuY29lZmZpY2VudHNTaWduLG89dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2Uscz10aGlzLnByb2Nlc3NpbmdGbGFncyxhPXRoaXMuY29udGV4dHMsYz10aGlzLmNvbnRleHRMYWJlbFRhYmxlLGw9dGhpcy5iaXRzRGVjb2RlZCxkPTA7ZDxyO2QrPTQpZm9yKHZhciBmPTA7Zjx0O2YrKylmb3IodmFyIGg9ZCp0K2YsdT0wO3U8NDt1KyssaCs9dCl7dmFyIHA9ZCt1O2lmKHA+PXIpYnJlYWs7c1toXSY9LTI7aWYoIW5baF0mJm9baF0pe3ZhciBtPWNbb1toXV07aWYoZS5yZWFkQml0KGEsbSkpe3ZhciBnPXRoaXMuZGVjb2RlU2lnbkJpdChwLGYsaCk7aVtoXT1nO25baF09MTt0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShwLGYsaCk7c1toXXw9Mn1sW2hdKys7c1toXXw9MX19fSxkZWNvZGVTaWduQml0OmZ1bmN0aW9uIEJpdE1vZGVsX2RlY29kZVNpZ25CaXQoZSx0LHIpe3ZhciBuLGksbyxzLGEsYyxsPXRoaXMud2lkdGgsZD10aGlzLmhlaWdodCxmPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUsaD10aGlzLmNvZWZmaWNlbnRzU2lnbjtzPXQ+MCYmMCE9PWZbci0xXTtpZih0KzE8bCYmMCE9PWZbcisxXSl7bz1oW3IrMV07bj1zPzEtby0oaT1oW3ItMV0pOjEtby1vfWVsc2Ugbj1zPzEtKGk9aFtyLTFdKS1pOjA7dmFyIHU9MypuO3M9ZT4wJiYwIT09ZltyLWxdO2lmKGUrMTxkJiYwIT09ZltyK2xdKXtvPWhbcitsXTtuPXM/MS1vLShpPWhbci1sXSkrdToxLW8tbyt1fWVsc2Ugbj1zPzEtKGk9aFtyLWxdKS1pK3U6dTtpZihuPj0wKXthPTkrbjtjPXRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsYSl9ZWxzZXthPTktbjtjPTFedGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cyxhKX1yZXR1cm4gY30scnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3M6ZnVuY3Rpb24gQml0TW9kZWxfcnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKXtmb3IodmFyIGUsdD10aGlzLmRlY29kZXIscj10aGlzLndpZHRoLG49dGhpcy5oZWlnaHQsaT10aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlLG89dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2Uscz10aGlzLmNvbnRleHRzLGE9dGhpcy5iaXRzRGVjb2RlZCxjPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLGw9cipuLGQ9NCpyLGY9MDtmPGw7Zj1lKXtlPU1hdGgubWluKGwsZitkKTtmb3IodmFyIGg9MDtoPHI7aCsrKWZvcih2YXIgdT1mK2g7dTxlO3UrPXIpaWYoaVt1XSYmMD09KDEmY1t1XSkpe3ZhciBwPTE2O2lmKDAhPSgyJmNbdV0pKXtjW3VdXj0yO3A9MD09PSgxMjcmb1t1XSk/MTU6MTR9dmFyIG09dC5yZWFkQml0KHMscCk7aVt1XT1pW3VdPDwxfG07YVt1XSsrO2NbdV18PTF9fX0scnVuQ2xlYW51cFBhc3M6ZnVuY3Rpb24gQml0TW9kZWxfcnVuQ2xlYW51cFBhc3MoKXtmb3IodmFyIGUsdD10aGlzLmRlY29kZXIscj10aGlzLndpZHRoLG49dGhpcy5oZWlnaHQsaT10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxvPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUscz10aGlzLmNvZWZmaWNlbnRzU2lnbixhPXRoaXMuY29udGV4dHMsYz10aGlzLmNvbnRleHRMYWJlbFRhYmxlLGw9dGhpcy5iaXRzRGVjb2RlZCxkPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLGY9cixoPTIqcix1PTMqcixwPTA7cDxuO3A9ZSl7ZT1NYXRoLm1pbihwKzQsbik7Zm9yKHZhciBtPXAqcixnPXArMzxuLGI9MDtiPHI7YisrKXt2YXIgeCx5PW0rYix2PTAsdz15LFQ9cDtpZihnJiYwPT09ZFt5XSYmMD09PWRbeStmXSYmMD09PWRbeStoXSYmMD09PWRbeSt1XSYmMD09PWlbeV0mJjA9PT1pW3krZl0mJjA9PT1pW3kraF0mJjA9PT1pW3krdV0pe2lmKCF0LnJlYWRCaXQoYSwxOCkpe2xbeV0rKztsW3krZl0rKztsW3kraF0rKztsW3krdV0rKztjb250aW51ZX1pZigwIT09KHY9dC5yZWFkQml0KGEsMTcpPDwxfHQucmVhZEJpdChhLDE3KSkpe1Q9cCt2O3crPXYqcn14PXRoaXMuZGVjb2RlU2lnbkJpdChULGIsdyk7c1t3XT14O29bd109MTt0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShULGIsdyk7ZFt3XXw9Mjt3PXk7Zm9yKHZhciBDPXA7Qzw9VDtDKyssdys9cilsW3ddKys7disrfWZvcihUPXArdjtUPGU7VCsrLHcrPXIpaWYoIW9bd10mJjA9PSgxJmRbd10pKXt2YXIgST1jW2lbd11dO2lmKDE9PT10LnJlYWRCaXQoYSxJKSl7eD10aGlzLmRlY29kZVNpZ25CaXQoVCxiLHcpO3Nbd109eDtvW3ddPTE7dGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoVCxiLHcpO2Rbd118PTJ9bFt3XSsrfX19fSxjaGVja1NlZ21lbnRhdGlvblN5bWJvbDpmdW5jdGlvbiBCaXRNb2RlbF9jaGVja1NlZ21lbnRhdGlvblN5bWJvbCgpe3ZhciBlPXRoaXMuZGVjb2Rlcix0PXRoaXMuY29udGV4dHM7aWYoMTAhPT0oZS5yZWFkQml0KHQsMTcpPDwzfGUucmVhZEJpdCh0LDE3KTw8MnxlLnJlYWRCaXQodCwxNyk8PDF8ZS5yZWFkQml0KHQsMTcpKSl0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgc2VnbWVudGF0aW9uIHN5bWJvbCIpfX07cmV0dXJuIEJpdE1vZGVsfSgpLGE9ZnVuY3Rpb24gVHJhbnNmb3JtQ2xvc3VyZSgpe2Z1bmN0aW9uIFRyYW5zZm9ybSgpe31UcmFuc2Zvcm0ucHJvdG90eXBlLmNhbGN1bGF0ZT1mdW5jdGlvbiB0cmFuc2Zvcm1DYWxjdWxhdGUoZSx0LHIpe2Zvcih2YXIgbj1lWzBdLGk9MSxvPWUubGVuZ3RoO2k8bztpKyspbj10aGlzLml0ZXJhdGUobixlW2ldLHQscik7cmV0dXJuIG59O1RyYW5zZm9ybS5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uIGV4dGVuZChlLHQscil7dmFyIG49dC0xLGk9dCsxLG89dCtyLTIscz10K3I7ZVtuLS1dPWVbaSsrXTtlW3MrK109ZVtvLS1dO2Vbbi0tXT1lW2krK107ZVtzKytdPWVbby0tXTtlW24tLV09ZVtpKytdO2VbcysrXT1lW28tLV07ZVtuXT1lW2ldO2Vbc109ZVtvXX07VHJhbnNmb3JtLnByb3RvdHlwZS5pdGVyYXRlPWZ1bmN0aW9uIFRyYW5zZm9ybV9pdGVyYXRlKGUsdCxyLG4pe3ZhciBpLG8scyxhLGMsbCxkPWUud2lkdGgsZj1lLmhlaWdodCxoPWUuaXRlbXMsdT10LndpZHRoLHA9dC5oZWlnaHQsbT10Lml0ZW1zO2ZvcihzPTAsaT0wO2k8ZjtpKyspe2E9MippKnU7Zm9yKG89MDtvPGQ7bysrLHMrKyxhKz0yKW1bYV09aFtzXX1oPWUuaXRlbXM9bnVsbDt2YXIgZz1uZXcgRmxvYXQzMkFycmF5KHUrOCk7aWYoMT09PXUpe2lmKDAhPSgxJnIpKWZvcihsPTAscz0wO2w8cDtsKysscys9dSltW3NdKj0uNX1lbHNlIGZvcihsPTAscz0wO2w8cDtsKysscys9dSl7Zy5zZXQobS5zdWJhcnJheShzLHMrdSksNCk7dGhpcy5leHRlbmQoZyw0LHUpO3RoaXMuZmlsdGVyKGcsNCx1KTttLnNldChnLnN1YmFycmF5KDQsNCt1KSxzKX12YXIgYj0xNix4PVtdO2ZvcihpPTA7aTxiO2krKyl4LnB1c2gobmV3IEZsb2F0MzJBcnJheShwKzgpKTt2YXIgeSx2PTA7ZT00K3A7aWYoMT09PXApe2lmKDAhPSgxJm4pKWZvcihjPTA7Yzx1O2MrKyltW2NdKj0uNX1lbHNlIGZvcihjPTA7Yzx1O2MrKyl7aWYoMD09PXYpe2I9TWF0aC5taW4odS1jLGIpO2ZvcihzPWMsYT00O2E8ZTtzKz11LGErKylmb3IoeT0wO3k8Yjt5KyspeFt5XVthXT1tW3MreV07dj1ifXZhciB3PXhbLS12XTt0aGlzLmV4dGVuZCh3LDQscCk7dGhpcy5maWx0ZXIodyw0LHApO2lmKDA9PT12KXtzPWMtYisxO2ZvcihhPTQ7YTxlO3MrPXUsYSsrKWZvcih5PTA7eTxiO3krKyltW3MreV09eFt5XVthXX19cmV0dXJue3dpZHRoOnUsaGVpZ2h0OnAsaXRlbXM6bX19O3JldHVybiBUcmFuc2Zvcm19KCksYz1mdW5jdGlvbiBJcnJldmVyc2libGVUcmFuc2Zvcm1DbG9zdXJlKCl7ZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCl7YS5jYWxsKHRoaXMpfUlycmV2ZXJzaWJsZVRyYW5zZm9ybS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhLnByb3RvdHlwZSk7SXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24gaXJyZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKGUsdCxyKXt2YXIgbixpLG8scyxhPXI+PjEsYz0tMS41ODYxMzQzNDIwNTk5MjQsbD0tLjA1Mjk4MDExODU3Mjk2MSxkPS44ODI5MTEwNzU1MzA5MzQsZj0uNDQzNTA2ODUyMDQzOTcxLGg9MS4yMzAxNzQxMDQ5MTQwMDE7bj0odHw9MCktMztmb3IoaT1hKzQ7aS0tO24rPTIpZVtuXSo9LjgxMjg5MzA2NjExNTk2MDk7bz1mKmVbKG49dC0yKS0xXTtmb3IoaT1hKzM7aS0tO24rPTIpe3M9ZiplW24rMV07ZVtuXT1oKmVbbl0tby1zO2lmKCFpLS0pYnJlYWs7bz1mKmVbKG4rPTIpKzFdO2Vbbl09aCplW25dLW8tc31vPWQqZVsobj10LTEpLTFdO2ZvcihpPWErMjtpLS07bis9Mil7cz1kKmVbbisxXTtlW25dLT1vK3M7aWYoIWktLSlicmVhaztvPWQqZVsobis9MikrMV07ZVtuXS09bytzfW89bCplWyhuPXQpLTFdO2ZvcihpPWErMTtpLS07bis9Mil7cz1sKmVbbisxXTtlW25dLT1vK3M7aWYoIWktLSlicmVhaztvPWwqZVsobis9MikrMV07ZVtuXS09bytzfWlmKDAhPT1hKXtvPWMqZVsobj10KzEpLTFdO2ZvcihpPWE7aS0tO24rPTIpe3M9YyplW24rMV07ZVtuXS09bytzO2lmKCFpLS0pYnJlYWs7bz1jKmVbKG4rPTIpKzFdO2Vbbl0tPW8rc319fTtyZXR1cm4gSXJyZXZlcnNpYmxlVHJhbnNmb3JtfSgpLGw9ZnVuY3Rpb24gUmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKXtmdW5jdGlvbiBSZXZlcnNpYmxlVHJhbnNmb3JtKCl7YS5jYWxsKHRoaXMpfVJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYS5wcm90b3R5cGUpO1JldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbiByZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKGUsdCxyKXt2YXIgbixpLG89cj4+MTtmb3Iobj10fD0wLGk9bysxO2ktLTtuKz0yKWVbbl0tPWVbbi0xXStlW24rMV0rMj4+Mjtmb3Iobj10KzEsaT1vO2ktLTtuKz0yKWVbbl0rPWVbbi0xXStlW24rMV0+PjF9O3JldHVybiBSZXZlcnNpYmxlVHJhbnNmb3JtfSgpO3JldHVybiBKcHhJbWFnZX0oKTt0LkpweEltYWdlPXN9XSl9KSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL1JFQURNRS5tZCBiL2xpYi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2YTg5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9SRUFETUUubWQKQEAgLTAsMCArMSw3IEBACitJdCdzICp2ZXJ5IGhpZ2hseSogcmVjb21tZW5kZWQgdG8gKm5vdCogdXNlIHRoZXNlIGZpbGVzLCBidXQgcmF0aGVyIHVzZSB0aGUKK3ByZS1idWlsdCBsaWJyYXJ5IGFzIGZvdW5kIGluIGUuZy4gdGhlIGAvYnVpbGRgLCBgL3dlYmAsIGFuZCBgL2ltYWdlX2RlY29kZXJzYAorZm9sZGVycyBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkuCisKK1BsZWFzZSBub3RlIHRoYXQgdGhlICJsaWIiIGJ1aWxkIHRhcmdldCBleGlzdHMgbW9zdGx5IHRvIGVuYWJsZSB1bml0LXRlc3RpbmcgaW4KK05vZGUuanMvVHJhdmlzLCBhbmQgdGhhdCB5b3UnbGwgbmVlZCB0byBoYW5kbGUgZS5nLiBhbnkgbmVjZXNzYXJ5IHBvbHlmaWxscworYW5kL29yIE5vZGUuanMgZGVwZW5kZW5jaWVzIHlvdXJzZWxmIGlmIHVzaW5nIHRoZSBmaWxlcyBpbiB0aGlzIGZvbGRlci4KZGlmZiAtLWdpdCBhL2xpYi9jb3JlL2Fubm90YXRpb24uanMgYi9saWIvY29yZS9hbm5vdGF0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWQ5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9hbm5vdGF0aW9uLmpzCkBAIC0wLDAgKzEsMTUzNCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0UXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHM7CitleHBvcnRzLk1hcmt1cEFubm90YXRpb24gPSBleHBvcnRzLkFubm90YXRpb25GYWN0b3J5ID0gZXhwb3J0cy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGUgPSBleHBvcnRzLkFubm90YXRpb24gPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfb2JqID0gcmVxdWlyZSgiLi9vYmouanMiKTsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfY29sb3JzcGFjZSA9IHJlcXVpcmUoIi4vY29sb3JzcGFjZS5qcyIpOworCit2YXIgX2NvcmVfdXRpbHMgPSByZXF1aXJlKCIuL2NvcmVfdXRpbHMuanMiKTsKKwordmFyIF9vcGVyYXRvcl9saXN0ID0gcmVxdWlyZSgiLi9vcGVyYXRvcl9saXN0LmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi9zdHJlYW0uanMiKTsKKwordmFyIF93cml0ZXIgPSByZXF1aXJlKCIuL3dyaXRlci5qcyIpOworCitjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeSB7CisgIHN0YXRpYyBjcmVhdGUoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyLCBpZEZhY3RvcnkpIHsKKyAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpLnRoZW4oYWNyb0Zvcm0gPT4geworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJfY3JlYXRlIiwgW3hyZWYsIHJlZiwgcGRmTWFuYWdlciwgaWRGYWN0b3J5LCBhY3JvRm9ybV0pOworICAgIH0pOworICB9CisKKyAgc3RhdGljIF9jcmVhdGUoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyLCBpZEZhY3RvcnksIGFjcm9Gb3JtKSB7CisgICAgY29uc3QgZGljdCA9IHhyZWYuZmV0Y2hJZlJlZihyZWYpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0KSkgeworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBjb25zdCBpZCA9ICgwLCBfcHJpbWl0aXZlcy5pc1JlZikocmVmKSA/IHJlZi50b1N0cmluZygpIDogYGFubm90XyR7aWRGYWN0b3J5LmNyZWF0ZU9iaklkKCl9YDsKKyAgICBsZXQgc3VidHlwZSA9IGRpY3QuZ2V0KCJTdWJ0eXBlIik7CisgICAgc3VidHlwZSA9ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHN1YnR5cGUpID8gc3VidHlwZS5uYW1lIDogbnVsbDsKKyAgICBjb25zdCBwYXJhbWV0ZXJzID0geworICAgICAgeHJlZiwKKyAgICAgIHJlZiwKKyAgICAgIGRpY3QsCisgICAgICBzdWJ0eXBlLAorICAgICAgaWQsCisgICAgICBwZGZNYW5hZ2VyLAorICAgICAgYWNyb0Zvcm06IGFjcm9Gb3JtIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCA/IGFjcm9Gb3JtIDogX3ByaW1pdGl2ZXMuRGljdC5lbXB0eQorICAgIH07CisKKyAgICBzd2l0Y2ggKHN1YnR5cGUpIHsKKyAgICAgIGNhc2UgIkxpbmsiOgorICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJUZXh0IjoKKyAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiV2lkZ2V0IjoKKyAgICAgICAgbGV0IGZpZWxkVHlwZSA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICAgICAgZGljdCwKKyAgICAgICAgICBrZXk6ICJGVCIKKyAgICAgICAgfSk7CisgICAgICAgIGZpZWxkVHlwZSA9ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpZWxkVHlwZSkgPyBmaWVsZFR5cGUubmFtZSA6IG51bGw7CisKKyAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICBjYXNlICJUeCI6CisgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICAgICAgY2FzZSAiQnRuIjoKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgICAgIGNhc2UgIkNoIjoKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgnVW5pbXBsZW1lbnRlZCB3aWRnZXQgZmllbGQgdHlwZSAiJyArIGZpZWxkVHlwZSArICciLCAnICsgImZhbGxpbmcgYmFjayB0byBiYXNlIGZpZWxkIHR5cGUuIik7CisgICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiUG9wdXAiOgorICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiRnJlZVRleHQiOgorICAgICAgICByZXR1cm4gbmV3IEZyZWVUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiTGluZSI6CisgICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgIlNxdWFyZSI6CisgICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiQ2lyY2xlIjoKKyAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJQb2x5TGluZSI6CisgICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJQb2x5Z29uIjoKKyAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiQ2FyZXQiOgorICAgICAgICByZXR1cm4gbmV3IENhcmV0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiSW5rIjoKKyAgICAgICAgcmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJIaWdobGlnaHQiOgorICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb24ocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgIlVuZGVybGluZSI6CisgICAgICAgIHJldHVybiBuZXcgVW5kZXJsaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiU3F1aWdnbHkiOgorICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSAiU3RyaWtlT3V0IjoKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJTdGFtcCI6CisgICAgICAgIHJldHVybiBuZXcgU3RhbXBBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlICJGaWxlQXR0YWNobWVudCI6CisgICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoIXN1YnR5cGUpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkFubm90YXRpb24gaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgL1N1YnR5cGUuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCdVbmltcGxlbWVudGVkIGFubm90YXRpb24gdHlwZSAiJyArIHN1YnR5cGUgKyAnIiwgJyArICJmYWxsaW5nIGJhY2sgdG8gYmFzZSBhbm5vdGF0aW9uLiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOworICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuQW5ub3RhdGlvbkZhY3RvcnkgPSBBbm5vdGF0aW9uRmFjdG9yeTsKKworZnVuY3Rpb24gZ2V0UXVhZFBvaW50cyhkaWN0LCByZWN0KSB7CisgIGlmICghZGljdC5oYXMoIlF1YWRQb2ludHMiKSkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgY29uc3QgcXVhZFBvaW50cyA9IGRpY3QuZ2V0QXJyYXkoIlF1YWRQb2ludHMiKTsKKworICBpZiAoIUFycmF5LmlzQXJyYXkocXVhZFBvaW50cykgfHwgcXVhZFBvaW50cy5sZW5ndGggJSA4ID4gMCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgY29uc3QgcXVhZFBvaW50c0xpc3RzID0gW107CisKKyAgZm9yIChsZXQgaSA9IDAsIGlpID0gcXVhZFBvaW50cy5sZW5ndGggLyA4OyBpIDwgaWk7IGkrKykgeworICAgIHF1YWRQb2ludHNMaXN0cy5wdXNoKFtdKTsKKworICAgIGZvciAobGV0IGogPSBpICogOCwgamogPSBpICogOCArIDg7IGogPCBqajsgaiArPSAyKSB7CisgICAgICBjb25zdCB4ID0gcXVhZFBvaW50c1tqXTsKKyAgICAgIGNvbnN0IHkgPSBxdWFkUG9pbnRzW2ogKyAxXTsKKworICAgICAgaWYgKHggPCByZWN0WzBdIHx8IHggPiByZWN0WzJdIHx8IHkgPCByZWN0WzFdIHx8IHkgPiByZWN0WzNdKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBxdWFkUG9pbnRzTGlzdHNbaV0ucHVzaCh7CisgICAgICAgIHgsCisgICAgICAgIHkKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIHJldHVybiBxdWFkUG9pbnRzTGlzdHM7Cit9CisKK2Z1bmN0aW9uIGdldFRyYW5zZm9ybU1hdHJpeChyZWN0LCBiYm94LCBtYXRyaXgpIHsKKyAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gX3V0aWwuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChiYm94LCBtYXRyaXgpOworCisgIGlmIChtaW5YID09PSBtYXhYIHx8IG1pblkgPT09IG1heFkpIHsKKyAgICByZXR1cm4gWzEsIDAsIDAsIDEsIHJlY3RbMF0sIHJlY3RbMV1dOworICB9CisKKyAgY29uc3QgeFJhdGlvID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIChtYXhYIC0gbWluWCk7CisgIGNvbnN0IHlSYXRpbyA9IChyZWN0WzNdIC0gcmVjdFsxXSkgLyAobWF4WSAtIG1pblkpOworICByZXR1cm4gW3hSYXRpbywgMCwgMCwgeVJhdGlvLCByZWN0WzBdIC0gbWluWCAqIHhSYXRpbywgcmVjdFsxXSAtIG1pblkgKiB5UmF0aW9dOworfQorCitjbGFzcyBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1zKSB7CisgICAgY29uc3QgZGljdCA9IHBhcmFtcy5kaWN0OworICAgIHRoaXMuc2V0Q29udGVudHMoZGljdC5nZXQoIkNvbnRlbnRzIikpOworICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShkaWN0LmdldCgiTSIpKTsKKyAgICB0aGlzLnNldEZsYWdzKGRpY3QuZ2V0KCJGIikpOworICAgIHRoaXMuc2V0UmVjdGFuZ2xlKGRpY3QuZ2V0QXJyYXkoIlJlY3QiKSk7CisgICAgdGhpcy5zZXRDb2xvcihkaWN0LmdldEFycmF5KCJDIikpOworICAgIHRoaXMuc2V0Qm9yZGVyU3R5bGUoZGljdCk7CisgICAgdGhpcy5zZXRBcHBlYXJhbmNlKGRpY3QpOworICAgIHRoaXMuZGF0YSA9IHsKKyAgICAgIGFubm90YXRpb25GbGFnczogdGhpcy5mbGFncywKKyAgICAgIGJvcmRlclN0eWxlOiB0aGlzLmJvcmRlclN0eWxlLAorICAgICAgY29sb3I6IHRoaXMuY29sb3IsCisgICAgICBjb250ZW50czogdGhpcy5jb250ZW50cywKKyAgICAgIGhhc0FwcGVhcmFuY2U6ICEhdGhpcy5hcHBlYXJhbmNlLAorICAgICAgaWQ6IHBhcmFtcy5pZCwKKyAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMubW9kaWZpY2F0aW9uRGF0ZSwKKyAgICAgIHJlY3Q6IHRoaXMucmVjdGFuZ2xlLAorICAgICAgc3VidHlwZTogcGFyYW1zLnN1YnR5cGUKKyAgICB9OworICB9CisKKyAgX2hhc0ZsYWcoZmxhZ3MsIGZsYWcpIHsKKyAgICByZXR1cm4gISEoZmxhZ3MgJiBmbGFnKTsKKyAgfQorCisgIF9pc1ZpZXdhYmxlKGZsYWdzKSB7CisgICAgcmV0dXJuICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5ISURERU4pICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5OT1ZJRVcpOworICB9CisKKyAgX2lzUHJpbnRhYmxlKGZsYWdzKSB7CisgICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcoZmxhZ3MsIF91dGlsLkFubm90YXRpb25GbGFnLlBSSU5UKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuSElEREVOKTsKKyAgfQorCisgIGdldCB2aWV3YWJsZSgpIHsKKyAgICBpZiAodGhpcy5mbGFncyA9PT0gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX2lzVmlld2FibGUodGhpcy5mbGFncyk7CisgIH0KKworICBnZXQgcHJpbnRhYmxlKCkgeworICAgIGlmICh0aGlzLmZsYWdzID09PSAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX2lzUHJpbnRhYmxlKHRoaXMuZmxhZ3MpOworICB9CisKKyAgc2V0Q29udGVudHMoY29udGVudHMpIHsKKyAgICB0aGlzLmNvbnRlbnRzID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShjb250ZW50cyB8fCAiIik7CisgIH0KKworICBzZXRNb2RpZmljYXRpb25EYXRlKG1vZGlmaWNhdGlvbkRhdGUpIHsKKyAgICB0aGlzLm1vZGlmaWNhdGlvbkRhdGUgPSAoMCwgX3V0aWwuaXNTdHJpbmcpKG1vZGlmaWNhdGlvbkRhdGUpID8gbW9kaWZpY2F0aW9uRGF0ZSA6IG51bGw7CisgIH0KKworICBzZXRGbGFncyhmbGFncykgeworICAgIHRoaXMuZmxhZ3MgPSBOdW1iZXIuaXNJbnRlZ2VyKGZsYWdzKSAmJiBmbGFncyA+IDAgPyBmbGFncyA6IDA7CisgIH0KKworICBoYXNGbGFnKGZsYWcpIHsKKyAgICByZXR1cm4gdGhpcy5faGFzRmxhZyh0aGlzLmZsYWdzLCBmbGFnKTsKKyAgfQorCisgIHNldFJlY3RhbmdsZShyZWN0YW5nbGUpIHsKKyAgICBpZiAoQXJyYXkuaXNBcnJheShyZWN0YW5nbGUpICYmIHJlY3RhbmdsZS5sZW5ndGggPT09IDQpIHsKKyAgICAgIHRoaXMucmVjdGFuZ2xlID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KHJlY3RhbmdsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMucmVjdGFuZ2xlID0gWzAsIDAsIDAsIDBdOworICAgIH0KKyAgfQorCisgIHNldENvbG9yKGNvbG9yKSB7CisgICAgY29uc3QgcmdiQ29sb3IgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7CisKKyAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sb3IpKSB7CisgICAgICB0aGlzLmNvbG9yID0gcmdiQ29sb3I7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChjb2xvci5sZW5ndGgpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdGhpcy5jb2xvciA9IG51bGw7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDE6CisgICAgICAgIF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKKworICAgICAgICB0aGlzLmNvbG9yID0gcmdiQ29sb3I7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOworCisgICAgICAgIHRoaXMuY29sb3IgPSByZ2JDb2xvcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOworCisgICAgICAgIHRoaXMuY29sb3IgPSByZ2JDb2xvcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRoaXMuY29sb3IgPSByZ2JDb2xvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgc2V0Qm9yZGVyU3R5bGUoYm9yZGVyU3R5bGUpIHsKKyAgICB0aGlzLmJvcmRlclN0eWxlID0gbmV3IEFubm90YXRpb25Cb3JkZXJTdHlsZSgpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShib3JkZXJTdHlsZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYm9yZGVyU3R5bGUuaGFzKCJCUyIpKSB7CisgICAgICBjb25zdCBkaWN0ID0gYm9yZGVyU3R5bGUuZ2V0KCJCUyIpOworICAgICAgY29uc3QgZGljdFR5cGUgPSBkaWN0LmdldCgiVHlwZSIpOworCisgICAgICBpZiAoIWRpY3RUeXBlIHx8ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGRpY3RUeXBlLCAiQm9yZGVyIikpIHsKKyAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aChkaWN0LmdldCgiVyIpLCB0aGlzLnJlY3RhbmdsZSk7CisgICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUoZGljdC5nZXQoIlMiKSk7CisgICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0RGFzaEFycmF5KGRpY3QuZ2V0QXJyYXkoIkQiKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChib3JkZXJTdHlsZS5oYXMoIkJvcmRlciIpKSB7CisgICAgICBjb25zdCBhcnJheSA9IGJvcmRlclN0eWxlLmdldEFycmF5KCJCb3JkZXIiKTsKKworICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCA+PSAzKSB7CisgICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyhhcnJheVswXSk7CisgICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0VmVydGljYWxDb3JuZXJSYWRpdXMoYXJyYXlbMV0pOworICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGFycmF5WzJdLCB0aGlzLnJlY3RhbmdsZSk7CisKKyAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gNCkgeworICAgICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0RGFzaEFycmF5KGFycmF5WzNdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKDApOworICAgIH0KKyAgfQorCisgIHNldEFwcGVhcmFuY2UoZGljdCkgeworICAgIHRoaXMuYXBwZWFyYW5jZSA9IG51bGw7CisgICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlcyA9IGRpY3QuZ2V0KCJBUCIpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShhcHBlYXJhbmNlU3RhdGVzKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KCJOIik7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShub3JtYWxBcHBlYXJhbmNlU3RhdGUpKSB7CisgICAgICB0aGlzLmFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShub3JtYWxBcHBlYXJhbmNlU3RhdGUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYXMgPSBkaWN0LmdldCgiQVMiKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoYXMpIHx8ICFub3JtYWxBcHBlYXJhbmNlU3RhdGUuaGFzKGFzLm5hbWUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5hcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZVN0YXRlLmdldChhcy5uYW1lKTsKKyAgfQorCisgIGxvYWRSZXNvdXJjZXMoa2V5cykgeworICAgIHJldHVybiB0aGlzLmFwcGVhcmFuY2UuZGljdC5nZXRBc3luYygiUmVzb3VyY2VzIikudGhlbihyZXNvdXJjZXMgPT4geworICAgICAgaWYgKCFyZXNvdXJjZXMpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IF9vYmouT2JqZWN0TG9hZGVyKHJlc291cmNlcywga2V5cywgcmVzb3VyY2VzLnhyZWYpOworICAgICAgcmV0dXJuIG9iamVjdExvYWRlci5sb2FkKCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZXM7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorCisgIGdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKSk7CisgICAgfQorCisgICAgY29uc3QgYXBwZWFyYW5jZSA9IHRoaXMuYXBwZWFyYW5jZTsKKyAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOworICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gYXBwZWFyYW5jZS5kaWN0OworICAgIGNvbnN0IHJlc291cmNlc1Byb21pc2UgPSB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCAiQ29sb3JTcGFjZSIsICJQYXR0ZXJuIiwgIlNoYWRpbmciLCAiWE9iamVjdCIsICJGb250Il0pOworICAgIGNvbnN0IGJib3ggPSBhcHBlYXJhbmNlRGljdC5nZXRBcnJheSgiQkJveCIpIHx8IFswLCAwLCAxLCAxXTsKKyAgICBjb25zdCBtYXRyaXggPSBhcHBlYXJhbmNlRGljdC5nZXRBcnJheSgiTWF0cml4IikgfHwgWzEsIDAsIDAsIDEsIDAsIDBdOworICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeChkYXRhLnJlY3QsIGJib3gsIG1hdHJpeCk7CisgICAgcmV0dXJuIHJlc291cmNlc1Byb21pc2UudGhlbihyZXNvdXJjZXMgPT4geworICAgICAgY29uc3Qgb3BMaXN0ID0gbmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpOworICAgICAgb3BMaXN0LmFkZE9wKF91dGlsLk9QUy5iZWdpbkFubm90YXRpb24sIFtkYXRhLnJlY3QsIHRyYW5zZm9ybSwgbWF0cml4XSk7CisgICAgICByZXR1cm4gZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CisgICAgICAgIHN0cmVhbTogYXBwZWFyYW5jZSwKKyAgICAgICAgdGFzaywKKyAgICAgICAgcmVzb3VyY2VzLAorICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdAorICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgIG9wTGlzdC5hZGRPcChfdXRpbC5PUFMuZW5kQW5ub3RhdGlvbiwgW10pOworICAgICAgICBhcHBlYXJhbmNlLnJlc2V0KCk7CisgICAgICAgIHJldHVybiBvcExpc3Q7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorCisgIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIHJldHVybiBudWxsOworICB9CisKK30KKworZXhwb3J0cy5Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbjsKKworY2xhc3MgQW5ub3RhdGlvbkJvcmRlclN0eWxlIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy53aWR0aCA9IDE7CisgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ7CisgICAgdGhpcy5kYXNoQXJyYXkgPSBbM107CisgICAgdGhpcy5ob3Jpem9udGFsQ29ybmVyUmFkaXVzID0gMDsKKyAgICB0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzID0gMDsKKyAgfQorCisgIHNldFdpZHRoKHdpZHRoLCByZWN0ID0gWzAsIDAsIDAsIDBdKSB7CisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHdpZHRoKSkgeworICAgICAgdGhpcy53aWR0aCA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKE51bWJlci5pc0ludGVnZXIod2lkdGgpKSB7CisgICAgICBpZiAod2lkdGggPiAwKSB7CisgICAgICAgIGNvbnN0IG1heFdpZHRoID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIDI7CisgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IChyZWN0WzNdIC0gcmVjdFsxXSkgLyAyOworCisgICAgICAgIGlmIChtYXhXaWR0aCA+IDAgJiYgbWF4SGVpZ2h0ID4gMCAmJiAod2lkdGggPiBtYXhXaWR0aCB8fCB3aWR0aCA+IG1heEhlaWdodCkpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoYEFubm90YXRpb25Cb3JkZXJTdHlsZS5zZXRXaWR0aCAtIGlnbm9yaW5nIHdpZHRoOiAke3dpZHRofWApOworICAgICAgICAgIHdpZHRoID0gMTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgfQorICB9CisKKyAgc2V0U3R5bGUoc3R5bGUpIHsKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHN0eWxlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoc3R5bGUubmFtZSkgeworICAgICAgY2FzZSAiUyI6CisgICAgICAgIHRoaXMuc3R5bGUgPSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiRCI6CisgICAgICAgIHRoaXMuc3R5bGUgPSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIkIiOgorICAgICAgICB0aGlzLnN0eWxlID0gX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiSSI6CisgICAgICAgIHRoaXMuc3R5bGUgPSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiVSI6CisgICAgICAgIHRoaXMuc3R5bGUgPSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHNldERhc2hBcnJheShkYXNoQXJyYXkpIHsKKyAgICBpZiAoQXJyYXkuaXNBcnJheShkYXNoQXJyYXkpICYmIGRhc2hBcnJheS5sZW5ndGggPiAwKSB7CisgICAgICBsZXQgaXNWYWxpZCA9IHRydWU7CisgICAgICBsZXQgYWxsWmVyb3MgPSB0cnVlOworCisgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZGFzaEFycmF5KSB7CisgICAgICAgIGNvbnN0IHZhbGlkTnVtYmVyID0gK2VsZW1lbnQgPj0gMDsKKworICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKSB7CisgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPiAwKSB7CisgICAgICAgICAgYWxsWmVyb3MgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHsKKyAgICAgICAgdGhpcy5kYXNoQXJyYXkgPSBkYXNoQXJyYXk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLndpZHRoID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRhc2hBcnJheSkgeworICAgICAgdGhpcy53aWR0aCA9IDA7CisgICAgfQorICB9CisKKyAgc2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyhyYWRpdXMpIHsKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihyYWRpdXMpKSB7CisgICAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSByYWRpdXM7CisgICAgfQorICB9CisKKyAgc2V0VmVydGljYWxDb3JuZXJSYWRpdXMocmFkaXVzKSB7CisgICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgeworICAgICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IHJhZGl1czsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLkFubm90YXRpb25Cb3JkZXJTdHlsZSA9IEFubm90YXRpb25Cb3JkZXJTdHlsZTsKKworY2xhc3MgTWFya3VwQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgY29uc3QgZGljdCA9IHBhcmFtZXRlcnMuZGljdDsKKworICAgIGlmIChkaWN0LmhhcygiSVJUIikpIHsKKyAgICAgIGNvbnN0IHJhd0lSVCA9IGRpY3QuZ2V0UmF3KCJJUlQiKTsKKyAgICAgIHRoaXMuZGF0YS5pblJlcGx5VG8gPSAoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKHJhd0lSVCkgPyByYXdJUlQudG9TdHJpbmcoKSA6IG51bGw7CisgICAgICBjb25zdCBydCA9IGRpY3QuZ2V0KCJSVCIpOworICAgICAgdGhpcy5kYXRhLnJlcGx5VHlwZSA9ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHJ0KSA/IHJ0Lm5hbWUgOiBfdXRpbC5Bbm5vdGF0aW9uUmVwbHlUeXBlLlJFUExZOworICAgIH0KKworICAgIGlmICh0aGlzLmRhdGEucmVwbHlUeXBlID09PSBfdXRpbC5Bbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSB7CisgICAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldCgiSVJUIik7CisgICAgICB0aGlzLmRhdGEudGl0bGUgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHBhcmVudC5nZXQoIlQiKSB8fCAiIik7CisgICAgICB0aGlzLnNldENvbnRlbnRzKHBhcmVudC5nZXQoIkNvbnRlbnRzIikpOworICAgICAgdGhpcy5kYXRhLmNvbnRlbnRzID0gdGhpcy5jb250ZW50czsKKworICAgICAgaWYgKCFwYXJlbnQuaGFzKCJDcmVhdGlvbkRhdGUiKSkgeworICAgICAgICB0aGlzLmRhdGEuY3JlYXRpb25EYXRlID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc2V0Q3JlYXRpb25EYXRlKHBhcmVudC5nZXQoIkNyZWF0aW9uRGF0ZSIpKTsKKyAgICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IHRoaXMuY3JlYXRpb25EYXRlOworICAgICAgfQorCisgICAgICBpZiAoIXBhcmVudC5oYXMoIk0iKSkgeworICAgICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IG51bGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50LmdldCgiTSIpKTsKKyAgICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSB0aGlzLm1vZGlmaWNhdGlvbkRhdGU7CisgICAgICB9CisKKyAgICAgIHRoaXMuZGF0YS5oYXNQb3B1cCA9IHBhcmVudC5oYXMoIlBvcHVwIik7CisKKyAgICAgIGlmICghcGFyZW50LmhhcygiQyIpKSB7CisgICAgICAgIHRoaXMuZGF0YS5jb2xvciA9IG51bGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnNldENvbG9yKHBhcmVudC5nZXRBcnJheSgiQyIpKTsKKyAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gdGhpcy5jb2xvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5kYXRhLnRpdGxlID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShkaWN0LmdldCgiVCIpIHx8ICIiKTsKKyAgICAgIHRoaXMuc2V0Q3JlYXRpb25EYXRlKGRpY3QuZ2V0KCJDcmVhdGlvbkRhdGUiKSk7CisgICAgICB0aGlzLmRhdGEuY3JlYXRpb25EYXRlID0gdGhpcy5jcmVhdGlvbkRhdGU7CisgICAgICB0aGlzLmRhdGEuaGFzUG9wdXAgPSBkaWN0LmhhcygiUG9wdXAiKTsKKworICAgICAgaWYgKCFkaWN0LmhhcygiQyIpKSB7CisgICAgICAgIHRoaXMuZGF0YS5jb2xvciA9IG51bGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2V0Q3JlYXRpb25EYXRlKGNyZWF0aW9uRGF0ZSkgeworICAgIHRoaXMuY3JlYXRpb25EYXRlID0gKDAsIF91dGlsLmlzU3RyaW5nKShjcmVhdGlvbkRhdGUpID8gY3JlYXRpb25EYXRlIDogbnVsbDsKKyAgfQorCit9CisKK2V4cG9ydHMuTWFya3VwQW5ub3RhdGlvbiA9IE1hcmt1cEFubm90YXRpb247CisKK2NsYXNzIFdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1zKSB7CisgICAgc3VwZXIocGFyYW1zKTsKKyAgICBjb25zdCBkaWN0ID0gcGFyYW1zLmRpY3Q7CisgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICB0aGlzLnJlZiA9IHBhcmFtcy5yZWY7CisgICAgZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVDsKKyAgICBkYXRhLmZpZWxkTmFtZSA9IHRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KTsKKyAgICBjb25zdCBmaWVsZFZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3QsCisgICAgICBrZXk6ICJWIiwKKyAgICAgIGdldEFycmF5OiB0cnVlCisgICAgfSk7CisgICAgZGF0YS5maWVsZFZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGZpZWxkVmFsdWUpOworICAgIGRhdGEuYWx0ZXJuYXRpdmVUZXh0ID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShkaWN0LmdldCgiVFUiKSB8fCAiIik7CisgICAgZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0LAorICAgICAga2V5OiAiREEiCisgICAgfSkgfHwgcGFyYW1zLmFjcm9Gb3JtLmdldCgiREEiKSB8fCAiIjsKKyAgICBjb25zdCBmaWVsZFR5cGUgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgZGljdCwKKyAgICAgIGtleTogIkZUIgorICAgIH0pOworICAgIGRhdGEuZmllbGRUeXBlID0gKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmllbGRUeXBlKSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKKyAgICB0aGlzLmZpZWxkUmVzb3VyY2VzID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3QsCisgICAgICBrZXk6ICJEUiIKKyAgICB9KSB8fCBwYXJhbXMuYWNyb0Zvcm0uZ2V0KCJEUiIpIHx8IF9wcmltaXRpdmVzLkRpY3QuZW1wdHk7CisgICAgZGF0YS5maWVsZEZsYWdzID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3QsCisgICAgICBrZXk6ICJGZiIKKyAgICB9KTsKKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRhLmZpZWxkRmxhZ3MpIHx8IGRhdGEuZmllbGRGbGFncyA8IDApIHsKKyAgICAgIGRhdGEuZmllbGRGbGFncyA9IDA7CisgICAgfQorCisgICAgZGF0YS5yZWFkT25seSA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUkVBRE9OTFkpOworCisgICAgaWYgKGRhdGEuZmllbGRUeXBlID09PSAiU2lnIikgeworICAgICAgZGF0YS5maWVsZFZhbHVlID0gbnVsbDsKKyAgICAgIHRoaXMuc2V0RmxhZ3MoX3V0aWwuQW5ub3RhdGlvbkZsYWcuSElEREVOKTsKKyAgICB9CisgIH0KKworICBfY29uc3RydWN0RmllbGROYW1lKGRpY3QpIHsKKyAgICBpZiAoIWRpY3QuaGFzKCJUIikgJiYgIWRpY3QuaGFzKCJQYXJlbnQiKSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpOworICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIGlmICghZGljdC5oYXMoIlBhcmVudCIpKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShkaWN0LmdldCgiVCIpKTsKKyAgICB9CisKKyAgICBjb25zdCBmaWVsZE5hbWUgPSBbXTsKKworICAgIGlmIChkaWN0LmhhcygiVCIpKSB7CisgICAgICBmaWVsZE5hbWUudW5zaGlmdCgoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRpY3QuZ2V0KCJUIikpKTsKKyAgICB9CisKKyAgICBsZXQgbG9vcERpY3QgPSBkaWN0OworCisgICAgd2hpbGUgKGxvb3BEaWN0LmhhcygiUGFyZW50IikpIHsKKyAgICAgIGxvb3BEaWN0ID0gbG9vcERpY3QuZ2V0KCJQYXJlbnQiKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShsb29wRGljdCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChsb29wRGljdC5oYXMoIlQiKSkgeworICAgICAgICBmaWVsZE5hbWUudW5zaGlmdCgoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGxvb3BEaWN0LmdldCgiVCIpKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZpZWxkTmFtZS5qb2luKCIuIik7CisgIH0KKworICBfZGVjb2RlRm9ybVZhbHVlKGZvcm1WYWx1ZSkgeworICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZSkpIHsKKyAgICAgIHJldHVybiBmb3JtVmFsdWUuZmlsdGVyKGl0ZW0gPT4gKDAsIF91dGlsLmlzU3RyaW5nKShpdGVtKSkubWFwKGl0ZW0gPT4gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShpdGVtKSk7CisgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmb3JtVmFsdWUpKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShmb3JtVmFsdWUubmFtZSk7CisgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKGZvcm1WYWx1ZSkpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGZvcm1WYWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBoYXNGaWVsZEZsYWcoZmxhZykgeworICAgIHJldHVybiAhISh0aGlzLmRhdGEuZmllbGRGbGFncyAmIGZsYWcpOworICB9CisKKyAgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgaWYgKHJlbmRlckZvcm1zKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKSk7CisgICAgfQorCisgICAgaWYgKCF0aGlzLl9oYXNUZXh0KSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKS50aGVuKGNvbnRlbnQgPT4geworICAgICAgaWYgKHRoaXMuYXBwZWFyYW5jZSAmJiBjb250ZW50ID09PSBudWxsKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfQorCisgICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CisKKyAgICAgIGlmICghdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlIHx8IGNvbnRlbnQgPT09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG9wZXJhdG9yTGlzdDsKKyAgICAgIH0KKworICAgICAgY29uc3QgbWF0cml4ID0gWzEsIDAsIDAsIDEsIDAsIDBdOworICAgICAgY29uc3QgYmJveCA9IFswLCAwLCB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdLCB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdXTsKKyAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeCh0aGlzLmRhdGEucmVjdCwgYmJveCwgbWF0cml4KTsKKyAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9uLCBbdGhpcy5kYXRhLnJlY3QsIHRyYW5zZm9ybSwgbWF0cml4XSk7CisgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oY29udGVudCk7CisgICAgICByZXR1cm4gZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CisgICAgICAgIHN0cmVhbSwKKyAgICAgICAgdGFzaywKKyAgICAgICAgcmVzb3VyY2VzOiB0aGlzLmZpZWxkUmVzb3VyY2VzLAorICAgICAgICBvcGVyYXRvckxpc3QKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLmVuZEFubm90YXRpb24sIFtdKTsKKyAgICAgICAgcmV0dXJuIG9wZXJhdG9yTGlzdDsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgYXN5bmMgc2F2ZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgaWYgKHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSBhbm5vdGF0aW9uU3RvcmFnZVt0aGlzLmRhdGEuaWRdKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBsZXQgYXBwZWFyYW5jZSA9IGF3YWl0IHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisKKyAgICBpZiAoYXBwZWFyYW5jZSA9PT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0KSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgYmJveCA9IFswLCAwLCB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdLCB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdXTsKKyAgICBjb25zdCBuZXdSZWYgPSBldmFsdWF0b3IueHJlZi5nZXROZXdSZWYoKTsKKyAgICBjb25zdCBBUCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KGV2YWx1YXRvci54cmVmKTsKKyAgICBBUC5zZXQoIk4iLCBuZXdSZWYpOworICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXTsKKyAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDsKKyAgICBsZXQgb3JpZ2luYWxUcmFuc2Zvcm0gPSBudWxsOworICAgIGxldCBuZXdUcmFuc2Zvcm0gPSBudWxsOworCisgICAgaWYgKGVuY3J5cHQpIHsKKyAgICAgIG9yaWdpbmFsVHJhbnNmb3JtID0gZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLCB0aGlzLnJlZi5nZW4pOworICAgICAgbmV3VHJhbnNmb3JtID0gZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obmV3UmVmLm51bSwgbmV3UmVmLmdlbik7CisgICAgICBhcHBlYXJhbmNlID0gbmV3VHJhbnNmb3JtLmVuY3J5cHRTdHJpbmcoYXBwZWFyYW5jZSk7CisgICAgfQorCisgICAgZGljdC5zZXQoIlYiLCB2YWx1ZSk7CisgICAgZGljdC5zZXQoIkFQIiwgQVApOworICAgIGRpY3Quc2V0KCJNIiwgYEQ6JHsoMCwgX3V0aWwuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKX1gKTsKKyAgICBjb25zdCBhcHBlYXJhbmNlRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KGV2YWx1YXRvci54cmVmKTsKKyAgICBhcHBlYXJhbmNlRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKKyAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRm9ybSIpKTsKKyAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlJlc291cmNlcyIsIHRoaXMuZmllbGRSZXNvdXJjZXMpOworICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiQkJveCIsIGJib3gpOworICAgIGNvbnN0IGJ1ZmZlck9yaWdpbmFsID0gW2Ake3RoaXMucmVmLm51bX0gJHt0aGlzLnJlZi5nZW59IG9ialxuYF07CisgICAgKDAsIF93cml0ZXIud3JpdGVEaWN0KShkaWN0LCBidWZmZXJPcmlnaW5hbCwgb3JpZ2luYWxUcmFuc2Zvcm0pOworICAgIGJ1ZmZlck9yaWdpbmFsLnB1c2goIlxuZW5kb2JqXG4iKTsKKyAgICBjb25zdCBidWZmZXJOZXcgPSBbYCR7bmV3UmVmLm51bX0gJHtuZXdSZWYuZ2VufSBvYmpcbmBdOworICAgICgwLCBfd3JpdGVyLndyaXRlRGljdCkoYXBwZWFyYW5jZURpY3QsIGJ1ZmZlck5ldywgbmV3VHJhbnNmb3JtKTsKKyAgICBidWZmZXJOZXcucHVzaCgiIHN0cmVhbVxuIik7CisgICAgYnVmZmVyTmV3LnB1c2goYXBwZWFyYW5jZSk7CisgICAgYnVmZmVyTmV3LnB1c2goIlxuZW5kc3RyZWFtXG5lbmRvYmpcbiIpOworICAgIHJldHVybiBbeworICAgICAgcmVmOiB0aGlzLnJlZiwKKyAgICAgIGRhdGE6IGJ1ZmZlck9yaWdpbmFsLmpvaW4oIiIpCisgICAgfSwgeworICAgICAgcmVmOiBuZXdSZWYsCisgICAgICBkYXRhOiBidWZmZXJOZXcuam9pbigiIikKKyAgICB9XTsKKyAgfQorCisgIGFzeW5jIF9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICBjb25zdCBpc1Bhc3N3b3JkID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCk7CisKKyAgICBpZiAoIWFubm90YXRpb25TdG9yYWdlIHx8IGlzUGFzc3dvcmQpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXTsKKworICAgIGlmICh2YWx1ZSA9PT0gIiIpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBjb25zdCBkZWZhdWx0UGFkZGluZyA9IDI7CisgICAgY29uc3QgaFBhZGRpbmcgPSBkZWZhdWx0UGFkZGluZzsKKyAgICBjb25zdCB0b3RhbEhlaWdodCA9IHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV07CisgICAgY29uc3QgdG90YWxXaWR0aCA9IHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF07CisgICAgY29uc3QgZm9udEluZm8gPSBhd2FpdCB0aGlzLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2spOworICAgIGNvbnN0IFtmb250LCBmb250TmFtZV0gPSBmb250SW5mbzsKKyAgICBsZXQgZm9udFNpemUgPSBmb250SW5mb1syXTsKKyAgICBmb250U2l6ZSA9IHRoaXMuX2NvbXB1dGVGb250U2l6ZShmb250LCBmb250TmFtZSwgZm9udFNpemUsIHRvdGFsSGVpZ2h0KTsKKyAgICBsZXQgZGVzY2VudCA9IGZvbnQuZGVzY2VudDsKKworICAgIGlmIChpc05hTihkZXNjZW50KSkgeworICAgICAgZGVzY2VudCA9IDA7CisgICAgfQorCisgICAgY29uc3QgdlBhZGRpbmcgPSBkZWZhdWx0UGFkZGluZyArIE1hdGguYWJzKGRlc2NlbnQpICogZm9udFNpemU7CisgICAgY29uc3QgZGVmYXVsdEFwcGVhcmFuY2UgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2U7CisgICAgY29uc3QgYWxpZ25tZW50ID0gdGhpcy5kYXRhLnRleHRBbGlnbm1lbnQ7CisKKyAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHsKKyAgICAgIHJldHVybiB0aGlzLl9nZXRDb21iQXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSwgdmFsdWUsIHRvdGFsV2lkdGgsIGhQYWRkaW5nLCB2UGFkZGluZyk7CisgICAgfQorCisgICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKKyAgICAgIHJldHVybiB0aGlzLl9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCB2YWx1ZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0LCBhbGlnbm1lbnQsIGhQYWRkaW5nLCB2UGFkZGluZyk7CisgICAgfQorCisgICAgaWYgKGFsaWdubWVudCA9PT0gMCB8fCBhbGlnbm1lbnQgPiAyKSB7CisgICAgICByZXR1cm4gIi9UeCBCTUMgcSBCVCAiICsgZGVmYXVsdEFwcGVhcmFuY2UgKyBgIDEgMCAwIDEgJHtoUGFkZGluZ30gJHt2UGFkZGluZ30gVG0gKCR7KDAsIF91dGlsLmVzY2FwZVN0cmluZykodmFsdWUpfSkgVGpgICsgIiBFVCBRIEVNQyI7CisgICAgfQorCisgICAgY29uc3QgcmVuZGVyZWRUZXh0ID0gdGhpcy5fcmVuZGVyVGV4dCh2YWx1ZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nKTsKKworICAgIHJldHVybiAiL1R4IEJNQyBxIEJUICIgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAwIDAgVG0gJHtyZW5kZXJlZFRleHR9YCArICIgRVQgUSBFTUMiOworICB9CisKKyAgYXN5bmMgX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaykgeworICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKKyAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7CisgICAgICBmb250U2l6ZTogMCwKKyAgICAgIGZvbnQ6IG51bGwsCisgICAgICBmb250TmFtZTogbnVsbCwKKworICAgICAgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgfTsKKyAgICBhd2FpdCBldmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZSksCisgICAgICB0YXNrLAorICAgICAgcmVzb3VyY2VzOiB0aGlzLmZpZWxkUmVzb3VyY2VzLAorICAgICAgb3BlcmF0b3JMaXN0LAorICAgICAgaW5pdGlhbFN0YXRlCisgICAgfSk7CisgICAgcmV0dXJuIFtpbml0aWFsU3RhdGUuZm9udCwgaW5pdGlhbFN0YXRlLmZvbnROYW1lLCBpbml0aWFsU3RhdGUuZm9udFNpemVdOworICB9CisKKyAgX2NvbXB1dGVGb250U2l6ZShmb250LCBmb250TmFtZSwgZm9udFNpemUsIGhlaWdodCkgeworICAgIGlmIChmb250U2l6ZSA9PT0gbnVsbCB8fCBmb250U2l6ZSA9PT0gMCkgeworICAgICAgY29uc3QgZW0gPSBmb250LmNoYXJzVG9HbHlwaHMoIk0iLCB0cnVlKVswXS53aWR0aCAvIDEwMDA7CisgICAgICBjb25zdCBjYXBIZWlnaHQgPSAwLjcgKiBlbTsKKyAgICAgIGZvbnRTaXplID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihoZWlnaHQgLyAoMS41ICogY2FwSGVpZ2h0KSkpOworICAgICAgbGV0IGZvbnRSZWdleCA9IG5ldyBSZWdFeHAoYC8ke2ZvbnROYW1lfVxccytbMC05XC5dK1xccytUZmApOworCisgICAgICBpZiAodGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlLnNlYXJjaChmb250UmVnZXgpID09PSAtMSkgeworICAgICAgICBmb250UmVnZXggPSBuZXcgUmVnRXhwKGAvJHtmb250TmFtZX1cXHMrVGZgKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlLnJlcGxhY2UoZm9udFJlZ2V4LCBgLyR7Zm9udE5hbWV9ICR7Zm9udFNpemV9IFRmYCk7CisgICAgfQorCisgICAgcmV0dXJuIGZvbnRTaXplOworICB9CisKKyAgX3JlbmRlclRleHQodGV4dCwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nKSB7CisgICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKHRleHQpOworICAgIGNvbnN0IHNjYWxlID0gZm9udFNpemUgLyAxMDAwOworICAgIGxldCB3aWR0aCA9IDA7CisKKyAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykgeworICAgICAgd2lkdGggKz0gZ2x5cGgud2lkdGggKiBzY2FsZTsKKyAgICB9CisKKyAgICBsZXQgc2hpZnQ7CisKKyAgICBpZiAoYWxpZ25tZW50ID09PSAxKSB7CisgICAgICBzaGlmdCA9ICh0b3RhbFdpZHRoIC0gd2lkdGgpIC8gMjsKKyAgICB9IGVsc2UgaWYgKGFsaWdubWVudCA9PT0gMikgeworICAgICAgc2hpZnQgPSB0b3RhbFdpZHRoIC0gd2lkdGggLSBoUGFkZGluZzsKKyAgICB9IGVsc2UgeworICAgICAgc2hpZnQgPSBoUGFkZGluZzsKKyAgICB9CisKKyAgICBzaGlmdCA9IHNoaWZ0LnRvRml4ZWQoMik7CisgICAgdlBhZGRpbmcgPSB2UGFkZGluZy50b0ZpeGVkKDIpOworICAgIHJldHVybiBgJHtzaGlmdH0gJHt2UGFkZGluZ30gVGQgKCR7KDAsIF91dGlsLmVzY2FwZVN0cmluZykodGV4dCl9KSBUamA7CisgIH0KKworfQorCitjbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKKyAgICBzdXBlcihwYXJhbXMpOworICAgIHRoaXMuX2hhc1RleHQgPSB0cnVlOworICAgIGNvbnN0IGRpY3QgPSBwYXJhbXMuZGljdDsKKworICAgIGlmICghKDAsIF91dGlsLmlzU3RyaW5nKSh0aGlzLmRhdGEuZmllbGRWYWx1ZSkpIHsKKyAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gIiI7CisgICAgfQorCisgICAgbGV0IGFsaWdubWVudCA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0LAorICAgICAga2V5OiAiUSIKKyAgICB9KTsKKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhbGlnbm1lbnQpIHx8IGFsaWdubWVudCA8IDAgfHwgYWxpZ25tZW50ID4gMikgeworICAgICAgYWxpZ25tZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLmRhdGEudGV4dEFsaWdubWVudCA9IGFsaWdubWVudDsKKyAgICBsZXQgbWF4aW11bUxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICBkaWN0LAorICAgICAga2V5OiAiTWF4TGVuIgorICAgIH0pOworCisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heGltdW1MZW5ndGgpIHx8IG1heGltdW1MZW5ndGggPCAwKSB7CisgICAgICBtYXhpbXVtTGVuZ3RoID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLmRhdGEubWF4TGVuID0gbWF4aW11bUxlbmd0aDsKKyAgICB0aGlzLmRhdGEubXVsdGlMaW5lID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpOworICAgIHRoaXMuZGF0YS5jb21iID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpICYmICF0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSAmJiB0aGlzLmRhdGEubWF4TGVuICE9PSBudWxsOworICB9CisKKyAgX2dldENvbWJBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCB0ZXh0LCB3aWR0aCwgaFBhZGRpbmcsIHZQYWRkaW5nKSB7CisgICAgY29uc3QgY29tYldpZHRoID0gKHdpZHRoIC8gdGhpcy5kYXRhLm1heExlbikudG9GaXhlZCgyKTsKKyAgICBjb25zdCBidWYgPSBbXTsKKworICAgIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHRleHQpIHsKKyAgICAgIGJ1Zi5wdXNoKGAoJHsoMCwgX3V0aWwuZXNjYXBlU3RyaW5nKShjaGFyYWN0ZXIpfSkgVGpgKTsKKyAgICB9CisKKyAgICBjb25zdCByZW5kZXJlZENvbWIgPSBidWYuam9pbihgICR7Y29tYldpZHRofSAwIFRkIGApOworICAgIHJldHVybiAiL1R4IEJNQyBxIEJUICIgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke2hQYWRkaW5nfSAke3ZQYWRkaW5nfSBUbSAke3JlbmRlcmVkQ29tYn1gICsgIiBFVCBRIEVNQyI7CisgIH0KKworICBfZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSwgdGV4dCwgZm9udCwgZm9udFNpemUsIHdpZHRoLCBoZWlnaHQsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nKSB7CisgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KC9cclxufFxyfFxuLyk7CisgICAgY29uc3QgYnVmID0gW107CisgICAgY29uc3QgdG90YWxXaWR0aCA9IHdpZHRoIC0gMiAqIGhQYWRkaW5nOworCisgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CisgICAgICBjb25zdCBjaHVua3MgPSB0aGlzLl9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgpOworCisgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykgeworICAgICAgICBjb25zdCBwYWRkaW5nID0gYnVmLmxlbmd0aCA9PT0gMCA/IGhQYWRkaW5nIDogMDsKKyAgICAgICAgYnVmLnB1c2godGhpcy5fcmVuZGVyVGV4dChjaHVuaywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBhbGlnbm1lbnQsIHBhZGRpbmcsIC1mb250U2l6ZSkpOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IGJ1Zi5qb2luKCJcbiIpOworICAgIHJldHVybiAiL1R4IEJNQyBxIEJUICIgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAwICR7aGVpZ2h0fSBUbSAke3JlbmRlcmVkVGV4dH1gICsgIiBFVCBRIEVNQyI7CisgIH0KKworICBfc3BsaXRMaW5lKGxpbmUsIGZvbnQsIGZvbnRTaXplLCB3aWR0aCkgeworICAgIGlmIChsaW5lLmxlbmd0aCA8PSAxKSB7CisgICAgICByZXR1cm4gW2xpbmVdOworICAgIH0KKworICAgIGNvbnN0IHNjYWxlID0gZm9udFNpemUgLyAxMDAwOworICAgIGNvbnN0IHdoaXRlc3BhY2UgPSBmb250LmNoYXJzVG9HbHlwaHMoIiAiLCB0cnVlKVswXS53aWR0aCAqIHNjYWxlOworICAgIGNvbnN0IGNodW5rcyA9IFtdOworICAgIGxldCBsYXN0U3BhY2VQb3MgPSAtMSwKKyAgICAgICAgc3RhcnRDaHVuayA9IDAsCisgICAgICAgIGN1cnJlbnRXaWR0aCA9IDA7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IGNoYXJhY3RlciA9IGxpbmUuY2hhckF0KGkpOworCisgICAgICBpZiAoY2hhcmFjdGVyID09PSAiICIpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCArIHdoaXRlc3BhY2UgPiB3aWR0aCkgeworICAgICAgICAgIGNodW5rcy5wdXNoKGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q2h1bmssIGkpKTsKKyAgICAgICAgICBzdGFydENodW5rID0gaTsKKyAgICAgICAgICBjdXJyZW50V2lkdGggPSB3aGl0ZXNwYWNlOworICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGN1cnJlbnRXaWR0aCArPSB3aGl0ZXNwYWNlOworICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IGk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXJXaWR0aCA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFyYWN0ZXIsIGZhbHNlKVswXS53aWR0aCAqIHNjYWxlOworCisgICAgICAgIGlmIChjdXJyZW50V2lkdGggKyBjaGFyV2lkdGggPiB3aWR0aCkgeworICAgICAgICAgIGlmIChsYXN0U3BhY2VQb3MgIT09IC0xKSB7CisgICAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsYXN0U3BhY2VQb3MgKyAxKSk7CisgICAgICAgICAgICBzdGFydENodW5rID0gaSA9IGxhc3RTcGFjZVBvcyArIDE7CisgICAgICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTsKKyAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNodW5rcy5wdXNoKGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q2h1bmssIGkpKTsKKyAgICAgICAgICAgIHN0YXJ0Q2h1bmsgPSBpOworICAgICAgICAgICAgY3VycmVudFdpZHRoID0gY2hhcldpZHRoOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdXJyZW50V2lkdGggKz0gY2hhcldpZHRoOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXJ0Q2h1bmsgPCBsaW5lLmxlbmd0aCkgeworICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgbGluZS5sZW5ndGgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2h1bmtzOworICB9CisKK30KKworY2xhc3MgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKKyAgICBzdXBlcihwYXJhbXMpOworICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBudWxsOworICAgIHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSA9IG51bGw7CisgICAgdGhpcy5kYXRhLmNoZWNrQm94ID0gIXRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pICYmICF0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pOworICAgIHRoaXMuZGF0YS5yYWRpb0J1dHRvbiA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pICYmICF0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pOworICAgIHRoaXMuZGF0YS5wdXNoQnV0dG9uID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKTsKKworICAgIGlmICh0aGlzLmRhdGEuY2hlY2tCb3gpIHsKKyAgICAgIHRoaXMuX3Byb2Nlc3NDaGVja0JveChwYXJhbXMpOworICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnJhZGlvQnV0dG9uKSB7CisgICAgICB0aGlzLl9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKTsKKyAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CisgICAgICB0aGlzLl9wcm9jZXNzUHVzaEJ1dHRvbihwYXJhbXMpOworICAgIH0gZWxzZSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgZmllbGQgZmxhZ3MgZm9yIGJ1dHRvbiB3aWRnZXQgYW5ub3RhdGlvbiIpOworICAgIH0KKyAgfQorCisgIGdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIGlmICh0aGlzLmRhdGEucHVzaEJ1dHRvbikgeworICAgICAgcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGZhbHNlLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisgICAgfQorCisgICAgaWYgKGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgICBjb25zdCB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF0gfHwgZmFsc2U7CisgICAgICBsZXQgYXBwZWFyYW5jZTsKKworICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGFwcGVhcmFuY2UgPSB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXBwZWFyYW5jZSA9IHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTsKKyAgICAgIH0KKworICAgICAgaWYgKGFwcGVhcmFuY2UpIHsKKyAgICAgICAgY29uc3Qgc2F2ZWRBcHBlYXJhbmNlID0gdGhpcy5hcHBlYXJhbmNlOworICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlOworICAgICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCByZW5kZXJGb3JtcywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPSBzYXZlZEFwcGVhcmFuY2U7CisgICAgICAgIHJldHVybiBvcGVyYXRvckxpc3Q7CisgICAgICB9CisKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKTsKKyAgfQorCisgIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIGlmICh0aGlzLmRhdGEuY2hlY2tCb3gpIHsKKyAgICAgIHJldHVybiB0aGlzLl9zYXZlQ2hlY2tib3goZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisgICAgfQorCisgICAgaWYgKHRoaXMuZGF0YS5yYWRpb0J1dHRvbikgeworICAgICAgcmV0dXJuIHRoaXMuX3NhdmVSYWRpb0J1dHRvbihldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VwZXIuc2F2ZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKyAgfQorCisgIGFzeW5jIF9zYXZlQ2hlY2tib3goZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlICYmIHRoaXMuZGF0YS5maWVsZFZhbHVlICE9PSAiT2ZmIjsKKyAgICBjb25zdCB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlW3RoaXMuZGF0YS5pZF07CisKKyAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB2YWx1ZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0KSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgbmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KHZhbHVlID8gdGhpcy5kYXRhLmV4cG9ydFZhbHVlIDogIk9mZiIpOworCisgICAgZGljdC5zZXQoIlYiLCBuYW1lKTsKKyAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKKyAgICBkaWN0LnNldCgiTSIsIGBEOiR7KDAsIF91dGlsLmdldE1vZGlmaWNhdGlvbkRhdGUpKCl9YCk7CisgICAgY29uc3QgZW5jcnlwdCA9IGV2YWx1YXRvci54cmVmLmVuY3J5cHQ7CisgICAgbGV0IG9yaWdpbmFsVHJhbnNmb3JtID0gbnVsbDsKKworICAgIGlmIChlbmNyeXB0KSB7CisgICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucmVmLm51bSwgdGhpcy5yZWYuZ2VuKTsKKyAgICB9CisKKyAgICBjb25zdCBidWZmZXIgPSBbYCR7dGhpcy5yZWYubnVtfSAke3RoaXMucmVmLmdlbn0gb2JqXG5gXTsKKyAgICAoMCwgX3dyaXRlci53cml0ZURpY3QpKGRpY3QsIGJ1ZmZlciwgb3JpZ2luYWxUcmFuc2Zvcm0pOworICAgIGJ1ZmZlci5wdXNoKCJcbmVuZG9ialxuIik7CisgICAgcmV0dXJuIFt7CisgICAgICByZWY6IHRoaXMucmVmLAorICAgICAgZGF0YTogYnVmZmVyLmpvaW4oIiIpCisgICAgfV07CisgIH0KKworICBhc3luYyBfc2F2ZVJhZGlvQnV0dG9uKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9PT0gdGhpcy5kYXRhLmJ1dHRvblZhbHVlOworICAgIGNvbnN0IHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2VbdGhpcy5kYXRhLmlkXTsKKworICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IHZhbHVlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCBuYW1lID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgOiAiT2ZmIik7CisKKyAgICBsZXQgcGFyZW50QnVmZmVyID0gbnVsbDsKKyAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDsKKworICAgIGlmICh2YWx1ZSkgeworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikodGhpcy5wYXJlbnQpKSB7CisgICAgICAgIGNvbnN0IHBhcmVudCA9IGV2YWx1YXRvci54cmVmLmZldGNoKHRoaXMucGFyZW50KTsKKyAgICAgICAgbGV0IHBhcmVudFRyYW5zZm9ybSA9IG51bGw7CisKKyAgICAgICAgaWYgKGVuY3J5cHQpIHsKKyAgICAgICAgICBwYXJlbnRUcmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnBhcmVudC5udW0sIHRoaXMucGFyZW50Lmdlbik7CisgICAgICAgIH0KKworICAgICAgICBwYXJlbnQuc2V0KCJWIiwgbmFtZSk7CisgICAgICAgIHBhcmVudEJ1ZmZlciA9IFtgJHt0aGlzLnBhcmVudC5udW19ICR7dGhpcy5wYXJlbnQuZ2VufSBvYmpcbmBdOworICAgICAgICAoMCwgX3dyaXRlci53cml0ZURpY3QpKHBhcmVudCwgcGFyZW50QnVmZmVyLCBwYXJlbnRUcmFuc2Zvcm0pOworICAgICAgICBwYXJlbnRCdWZmZXIucHVzaCgiXG5lbmRvYmpcbiIpOworICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh0aGlzLnBhcmVudCkpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQuc2V0KCJWIiwgbmFtZSk7CisgICAgICB9CisgICAgfQorCisgICAgZGljdC5zZXQoIkFTIiwgbmFtZSk7CisgICAgZGljdC5zZXQoIk0iLCBgRDokeygwLCBfdXRpbC5nZXRNb2RpZmljYXRpb25EYXRlKSgpfWApOworICAgIGxldCBvcmlnaW5hbFRyYW5zZm9ybSA9IG51bGw7CisKKyAgICBpZiAoZW5jcnlwdCkgeworICAgICAgb3JpZ2luYWxUcmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnJlZi5udW0sIHRoaXMucmVmLmdlbik7CisgICAgfQorCisgICAgY29uc3QgYnVmZmVyID0gW2Ake3RoaXMucmVmLm51bX0gJHt0aGlzLnJlZi5nZW59IG9ialxuYF07CisgICAgKDAsIF93cml0ZXIud3JpdGVEaWN0KShkaWN0LCBidWZmZXIsIG9yaWdpbmFsVHJhbnNmb3JtKTsKKyAgICBidWZmZXIucHVzaCgiXG5lbmRvYmpcbiIpOworICAgIGNvbnN0IG5ld1JlZnMgPSBbeworICAgICAgcmVmOiB0aGlzLnJlZiwKKyAgICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQorICAgIH1dOworCisgICAgaWYgKHBhcmVudEJ1ZmZlciAhPT0gbnVsbCkgeworICAgICAgbmV3UmVmcy5wdXNoKHsKKyAgICAgICAgcmVmOiB0aGlzLnBhcmVudCwKKyAgICAgICAgZGF0YTogcGFyZW50QnVmZmVyLmpvaW4oIiIpCisgICAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3UmVmczsKKyAgfQorCisgIF9wcm9jZXNzQ2hlY2tCb3gocGFyYW1zKSB7CisgICAgY29uc3QgY3VzdG9tQXBwZWFyYW5jZSA9IHBhcmFtcy5kaWN0LmdldCgiQVAiKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY3VzdG9tQXBwZWFyYW5jZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBub3JtYWxBcHBlYXJhbmNlID0gY3VzdG9tQXBwZWFyYW5jZS5nZXQoIk4iKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9ybWFsQXBwZWFyYW5jZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBleHBvcnRWYWx1ZXMgPSBub3JtYWxBcHBlYXJhbmNlLmdldEtleXMoKTsKKworICAgIGlmICghZXhwb3J0VmFsdWVzLmluY2x1ZGVzKCJPZmYiKSkgeworICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIpOworICAgIH0KKworICAgIGlmIChleHBvcnRWYWx1ZXMubGVuZ3RoICE9PSAyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5kYXRhLmV4cG9ydFZhbHVlID0gZXhwb3J0VmFsdWVzWzBdID09PSAiT2ZmIiA/IGV4cG9ydFZhbHVlc1sxXSA6IGV4cG9ydFZhbHVlc1swXTsKKyAgICB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQodGhpcy5kYXRhLmV4cG9ydFZhbHVlKTsKKyAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIikgfHwgbnVsbDsKKyAgfQorCisgIF9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKSB7CisgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBudWxsOworICAgIGNvbnN0IGZpZWxkUGFyZW50ID0gcGFyYW1zLmRpY3QuZ2V0KCJQYXJlbnQiKTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShmaWVsZFBhcmVudCkgJiYgZmllbGRQYXJlbnQuaGFzKCJWIikpIHsKKyAgICAgIGNvbnN0IGZpZWxkUGFyZW50VmFsdWUgPSBmaWVsZFBhcmVudC5nZXQoIlYiKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpZWxkUGFyZW50VmFsdWUpKSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyYW1zLmRpY3QuZ2V0UmF3KCJQYXJlbnQiKTsKKyAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoZmllbGRQYXJlbnRWYWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlcyA9IHBhcmFtcy5kaWN0LmdldCgiQVAiKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoYXBwZWFyYW5jZVN0YXRlcykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBub3JtYWxBcHBlYXJhbmNlID0gYXBwZWFyYW5jZVN0YXRlcy5nZXQoIk4iKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9ybWFsQXBwZWFyYW5jZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGtleSBvZiBub3JtYWxBcHBlYXJhbmNlLmdldEtleXMoKSkgeworICAgICAgaWYgKGtleSAhPT0gIk9mZiIpIHsKKyAgICAgICAgdGhpcy5kYXRhLmJ1dHRvblZhbHVlID0ga2V5OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQodGhpcy5kYXRhLmJ1dHRvblZhbHVlKTsKKyAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIikgfHwgbnVsbDsKKyAgfQorCisgIF9wcm9jZXNzUHVzaEJ1dHRvbihwYXJhbXMpIHsKKyAgICBpZiAoIXBhcmFtcy5kaWN0LmhhcygiQSIpKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIlB1c2ggYnV0dG9ucyB3aXRob3V0IGFjdGlvbiBkaWN0aW9uYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfb2JqLkNhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7CisgICAgICBkZXN0RGljdDogcGFyYW1zLmRpY3QsCisgICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSwKKyAgICAgIGRvY0Jhc2VVcmw6IHBhcmFtcy5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwKKyAgICB9KTsKKyAgfQorCit9CisKK2NsYXNzIENob2ljZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1zKSB7CisgICAgc3VwZXIocGFyYW1zKTsKKyAgICB0aGlzLmRhdGEub3B0aW9ucyA9IFtdOworICAgIGNvbnN0IG9wdGlvbnMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgZGljdDogcGFyYW1zLmRpY3QsCisgICAgICBrZXk6ICJPcHQiCisgICAgfSk7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkgeworICAgICAgY29uc3QgeHJlZiA9IHBhcmFtcy54cmVmOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcHRpb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgb3B0aW9uID0geHJlZi5mZXRjaElmUmVmKG9wdGlvbnNbaV0pOworICAgICAgICBjb25zdCBpc09wdGlvbkFycmF5ID0gQXJyYXkuaXNBcnJheShvcHRpb24pOworICAgICAgICB0aGlzLmRhdGEub3B0aW9uc1tpXSA9IHsKKyAgICAgICAgICBleHBvcnRWYWx1ZTogdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGlzT3B0aW9uQXJyYXkgPyB4cmVmLmZldGNoSWZSZWYob3B0aW9uWzBdKSA6IG9wdGlvbiksCisgICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoaXNPcHRpb25BcnJheSA/IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25bMV0pIDogb3B0aW9uKQorICAgICAgICB9OworICAgICAgfQorICAgIH0KKworICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKHRoaXMuZGF0YS5maWVsZFZhbHVlKSkgeworICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBbdGhpcy5kYXRhLmZpZWxkVmFsdWVdOworICAgIH0gZWxzZSBpZiAoIXRoaXMuZGF0YS5maWVsZFZhbHVlKSB7CisgICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFtdOworICAgIH0KKworICAgIHRoaXMuZGF0YS5jb21ibyA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuQ09NQk8pOworICAgIHRoaXMuZGF0YS5tdWx0aVNlbGVjdCA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuTVVMVElTRUxFQ1QpOworICAgIHRoaXMuX2hhc1RleHQgPSB0cnVlOworICB9CisKK30KKworY2xhc3MgVGV4dEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IERFRkFVTFRfSUNPTl9TSVpFID0gMjI7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgY29uc3QgZGljdCA9IHBhcmFtZXRlcnMuZGljdDsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5URVhUOworCisgICAgaWYgKHRoaXMuZGF0YS5oYXNBcHBlYXJhbmNlKSB7CisgICAgICB0aGlzLmRhdGEubmFtZSA9ICJOb0ljb24iOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmRhdGEucmVjdFsxXSA9IHRoaXMuZGF0YS5yZWN0WzNdIC0gREVGQVVMVF9JQ09OX1NJWkU7CisgICAgICB0aGlzLmRhdGEucmVjdFsyXSA9IHRoaXMuZGF0YS5yZWN0WzBdICsgREVGQVVMVF9JQ09OX1NJWkU7CisgICAgICB0aGlzLmRhdGEubmFtZSA9IGRpY3QuaGFzKCJOYW1lIikgPyBkaWN0LmdldCgiTmFtZSIpLm5hbWUgOiAiTm90ZSI7CisgICAgfQorCisgICAgaWYgKGRpY3QuaGFzKCJTdGF0ZSIpKSB7CisgICAgICB0aGlzLmRhdGEuc3RhdGUgPSBkaWN0LmdldCgiU3RhdGUiKSB8fCBudWxsOworICAgICAgdGhpcy5kYXRhLnN0YXRlTW9kZWwgPSBkaWN0LmdldCgiU3RhdGVNb2RlbCIpIHx8IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IG51bGw7CisgICAgICB0aGlzLmRhdGEuc3RhdGVNb2RlbCA9IG51bGw7CisgICAgfQorICB9CisKK30KKworY2xhc3MgTGlua0Fubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1zKSB7CisgICAgc3VwZXIocGFyYW1zKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LOworICAgIGNvbnN0IHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKHBhcmFtcy5kaWN0LCB0aGlzLnJlY3RhbmdsZSk7CisKKyAgICBpZiAocXVhZFBvaW50cykgeworICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzOworICAgIH0KKworICAgIF9vYmouQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKKyAgICAgIGRlc3REaWN0OiBwYXJhbXMuZGljdCwKKyAgICAgIHJlc3VsdE9iajogdGhpcy5kYXRhLAorICAgICAgZG9jQmFzZVVybDogcGFyYW1zLnBkZk1hbmFnZXIuZG9jQmFzZVVybAorICAgIH0pOworICB9CisKK30KKworY2xhc3MgUG9wdXBBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT1BVUDsKKyAgICBsZXQgcGFyZW50SXRlbSA9IHBhcmFtZXRlcnMuZGljdC5nZXQoIlBhcmVudCIpOworCisgICAgaWYgKCFwYXJlbnRJdGVtKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHBhcmVudFN1YnR5cGUgPSBwYXJlbnRJdGVtLmdldCgiU3VidHlwZSIpOworICAgIHRoaXMuZGF0YS5wYXJlbnRUeXBlID0gKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkocGFyZW50U3VidHlwZSkgPyBwYXJlbnRTdWJ0eXBlLm5hbWUgOiBudWxsOworICAgIGNvbnN0IHJhd1BhcmVudCA9IHBhcmFtZXRlcnMuZGljdC5nZXRSYXcoIlBhcmVudCIpOworICAgIHRoaXMuZGF0YS5wYXJlbnRJZCA9ICgwLCBfcHJpbWl0aXZlcy5pc1JlZikocmF3UGFyZW50KSA/IHJhd1BhcmVudC50b1N0cmluZygpIDogbnVsbDsKKyAgICBjb25zdCBydCA9IHBhcmVudEl0ZW0uZ2V0KCJSVCIpOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHJ0LCBfdXRpbC5Bbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSkgeworICAgICAgcGFyZW50SXRlbSA9IHBhcmVudEl0ZW0uZ2V0KCJJUlQiKTsKKyAgICB9CisKKyAgICBpZiAoIXBhcmVudEl0ZW0uaGFzKCJNIikpIHsKKyAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKHBhcmVudEl0ZW0uZ2V0KCJNIikpOworICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSB0aGlzLm1vZGlmaWNhdGlvbkRhdGU7CisgICAgfQorCisgICAgaWYgKCFwYXJlbnRJdGVtLmhhcygiQyIpKSB7CisgICAgICB0aGlzLmRhdGEuY29sb3IgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnNldENvbG9yKHBhcmVudEl0ZW0uZ2V0QXJyYXkoIkMiKSk7CisgICAgICB0aGlzLmRhdGEuY29sb3IgPSB0aGlzLmNvbG9yOworICAgIH0KKworICAgIGlmICghdGhpcy52aWV3YWJsZSkgeworICAgICAgY29uc3QgcGFyZW50RmxhZ3MgPSBwYXJlbnRJdGVtLmdldCgiRiIpOworCisgICAgICBpZiAodGhpcy5faXNWaWV3YWJsZShwYXJlbnRGbGFncykpIHsKKyAgICAgICAgdGhpcy5zZXRGbGFncyhwYXJlbnRGbGFncyk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5kYXRhLnRpdGxlID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShwYXJlbnRJdGVtLmdldCgiVCIpIHx8ICIiKTsKKyAgICB0aGlzLmRhdGEuY29udGVudHMgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHBhcmVudEl0ZW0uZ2V0KCJDb250ZW50cyIpIHx8ICIiKTsKKyAgfQorCit9CisKK2NsYXNzIEZyZWVUZXh0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuRlJFRVRFWFQ7CisgIH0KKworfQorCitjbGFzcyBMaW5lQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuTElORTsKKyAgICB0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KHBhcmFtZXRlcnMuZGljdC5nZXRBcnJheSgiTCIpKTsKKyAgfQorCit9CisKK2NsYXNzIFNxdWFyZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlNRVUFSRTsKKyAgfQorCit9CisKK2NsYXNzIENpcmNsZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLkNJUkNMRTsKKyAgfQorCit9CisKK2NsYXNzIFBvbHlsaW5lQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU7CisgICAgY29uc3QgcmF3VmVydGljZXMgPSBwYXJhbWV0ZXJzLmRpY3QuZ2V0QXJyYXkoIlZlcnRpY2VzIik7CisgICAgdGhpcy5kYXRhLnZlcnRpY2VzID0gW107CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSByYXdWZXJ0aWNlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CisgICAgICB0aGlzLmRhdGEudmVydGljZXMucHVzaCh7CisgICAgICAgIHg6IHJhd1ZlcnRpY2VzW2ldLAorICAgICAgICB5OiByYXdWZXJ0aWNlc1tpICsgMV0KKyAgICAgIH0pOworICAgIH0KKyAgfQorCit9CisKK2NsYXNzIFBvbHlnb25Bbm5vdGF0aW9uIGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlBPTFlHT047CisgIH0KKworfQorCitjbGFzcyBDYXJldEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLkNBUkVUOworICB9CisKK30KKworY2xhc3MgSW5rQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuSU5LOworICAgIGNvbnN0IHhyZWYgPSBwYXJhbWV0ZXJzLnhyZWY7CisgICAgY29uc3Qgb3JpZ2luYWxJbmtMaXN0cyA9IHBhcmFtZXRlcnMuZGljdC5nZXRBcnJheSgiSW5rTGlzdCIpOworICAgIHRoaXMuZGF0YS5pbmtMaXN0cyA9IFtdOworCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3JpZ2luYWxJbmtMaXN0cy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICB0aGlzLmRhdGEuaW5rTGlzdHMucHVzaChbXSk7CisKKyAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IG9yaWdpbmFsSW5rTGlzdHNbaV0ubGVuZ3RoOyBqIDwgamo7IGogKz0gMikgeworICAgICAgICB0aGlzLmRhdGEuaW5rTGlzdHNbaV0ucHVzaCh7CisgICAgICAgICAgeDogeHJlZi5mZXRjaElmUmVmKG9yaWdpbmFsSW5rTGlzdHNbaV1bal0pLAorICAgICAgICAgIHk6IHhyZWYuZmV0Y2hJZlJlZihvcmlnaW5hbElua0xpc3RzW2ldW2ogKyAxXSkKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9CisKK30KKworY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuSElHSExJR0hUOworICAgIGNvbnN0IHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKHBhcmFtZXRlcnMuZGljdCwgdGhpcy5yZWN0YW5nbGUpOworCisgICAgaWYgKHF1YWRQb2ludHMpIHsKKyAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50czsKKyAgICB9CisgIH0KKworfQorCitjbGFzcyBVbmRlcmxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU7CisgICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1ldGVycy5kaWN0LCB0aGlzLnJlY3RhbmdsZSk7CisKKyAgICBpZiAocXVhZFBvaW50cykgeworICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzOworICAgIH0KKyAgfQorCit9CisKK2NsYXNzIFNxdWlnZ2x5QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk7CisgICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1ldGVycy5kaWN0LCB0aGlzLnJlY3RhbmdsZSk7CisKKyAgICBpZiAocXVhZFBvaW50cykgeworICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzOworICAgIH0KKyAgfQorCit9CisKK2NsYXNzIFN0cmlrZU91dEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlNUUklLRU9VVDsKKyAgICBjb25zdCBxdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhwYXJhbWV0ZXJzLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTsKKworICAgIGlmIChxdWFkUG9pbnRzKSB7CisgICAgICB0aGlzLmRhdGEucXVhZFBvaW50cyA9IHF1YWRQb2ludHM7CisgICAgfQorICB9CisKK30KKworY2xhc3MgU3RhbXBBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TVEFNUDsKKyAgfQorCit9CisKK2NsYXNzIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24geworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycyk7CisgICAgY29uc3QgZmlsZSA9IG5ldyBfb2JqLkZpbGVTcGVjKHBhcmFtZXRlcnMuZGljdC5nZXQoIkZTIiksIHBhcmFtZXRlcnMueHJlZik7CisgICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ7CisgICAgdGhpcy5kYXRhLmZpbGUgPSBmaWxlLnNlcmlhbGl6YWJsZTsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvYXJpdGhtZXRpY19kZWNvZGVyLmpzIGIvbGliL2NvcmUvYXJpdGhtZXRpY19kZWNvZGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTE0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9hcml0aG1ldGljX2RlY29kZXIuanMKQEAgLTAsMCArMSwzNjkgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkFyaXRobWV0aWNEZWNvZGVyID0gdm9pZCAwOworY29uc3QgUWVUYWJsZSA9IFt7CisgIHFlOiAweDU2MDEsCisgIG5tcHM6IDEsCisgIG5scHM6IDEsCisgIHN3aXRjaEZsYWc6IDEKK30sIHsKKyAgcWU6IDB4MzQwMSwKKyAgbm1wczogMiwKKyAgbmxwczogNiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxODAxLAorICBubXBzOiAzLAorICBubHBzOiA5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDBhYzEsCisgIG5tcHM6IDQsCisgIG5scHM6IDEyLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA1MjEsCisgIG5tcHM6IDUsCisgIG5scHM6IDI5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAyMjEsCisgIG5tcHM6IDM4LAorICBubHBzOiAzMywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg1NjAxLAorICBubXBzOiA3LAorICBubHBzOiA2LAorICBzd2l0Y2hGbGFnOiAxCit9LCB7CisgIHFlOiAweDU0MDEsCisgIG5tcHM6IDgsCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDQ4MDEsCisgIG5tcHM6IDksCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDM4MDEsCisgIG5tcHM6IDEwLAorICBubHBzOiAxNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgzMDAxLAorICBubXBzOiAxMSwKKyAgbmxwczogMTcsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MjQwMSwKKyAgbm1wczogMTIsCisgIG5scHM6IDE4LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDFjMDEsCisgIG5tcHM6IDEzLAorICBubHBzOiAyMCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxNjAxLAorICBubXBzOiAyOSwKKyAgbmxwczogMjEsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NTYwMSwKKyAgbm1wczogMTUsCisgIG5scHM6IDE0LAorICBzd2l0Y2hGbGFnOiAxCit9LCB7CisgIHFlOiAweDU0MDEsCisgIG5tcHM6IDE2LAorICBubHBzOiAxNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg1MTAxLAorICBubXBzOiAxNywKKyAgbmxwczogMTUsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4NDgwMSwKKyAgbm1wczogMTgsCisgIG5scHM6IDE2LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDM4MDEsCisgIG5tcHM6IDE5LAorICBubHBzOiAxNywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgzNDAxLAorICBubXBzOiAyMCwKKyAgbmxwczogMTgsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MzAwMSwKKyAgbm1wczogMjEsCisgIG5scHM6IDE5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDI4MDEsCisgIG5tcHM6IDIyLAorICBubHBzOiAxOSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgyNDAxLAorICBubXBzOiAyMywKKyAgbmxwczogMjAsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MjIwMSwKKyAgbm1wczogMjQsCisgIG5scHM6IDIxLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDFjMDEsCisgIG5tcHM6IDI1LAorICBubHBzOiAyMiwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxODAxLAorICBubXBzOiAyNiwKKyAgbmxwczogMjMsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTYwMSwKKyAgbm1wczogMjcsCisgIG5scHM6IDI0LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDE0MDEsCisgIG5tcHM6IDI4LAorICBubHBzOiAyNSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgxMjAxLAorICBubXBzOiAyOSwKKyAgbmxwczogMjYsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MTEwMSwKKyAgbm1wczogMzAsCisgIG5scHM6IDI3LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDBhYzEsCisgIG5tcHM6IDMxLAorICBubHBzOiAyOCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwOWMxLAorICBubXBzOiAzMiwKKyAgbmxwczogMjksCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDhhMSwKKyAgbm1wczogMzMsCisgIG5scHM6IDMwLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDA1MjEsCisgIG5tcHM6IDM0LAorICBubHBzOiAzMSwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwNDQxLAorICBubXBzOiAzNSwKKyAgbmxwczogMzIsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDJhMSwKKyAgbm1wczogMzYsCisgIG5scHM6IDMzLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAyMjEsCisgIG5tcHM6IDM3LAorICBubHBzOiAzNCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMTQxLAorICBubXBzOiAzOCwKKyAgbmxwczogMzUsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDExMSwKKyAgbm1wczogMzksCisgIG5scHM6IDM2LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwODUsCisgIG5tcHM6IDQwLAorICBubHBzOiAzNywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDQ5LAorICBubXBzOiA0MSwKKyAgbmxwczogMzgsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAyNSwKKyAgbm1wczogNDIsCisgIG5scHM6IDM5LAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwMTUsCisgIG5tcHM6IDQzLAorICBubHBzOiA0MCwKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHgwMDA5LAorICBubXBzOiA0NCwKKyAgbmxwczogNDEsCisgIHN3aXRjaEZsYWc6IDAKK30sIHsKKyAgcWU6IDB4MDAwNSwKKyAgbm1wczogNDUsCisgIG5scHM6IDQyLAorICBzd2l0Y2hGbGFnOiAwCit9LCB7CisgIHFlOiAweDAwMDEsCisgIG5tcHM6IDQ1LAorICBubHBzOiA0MywKKyAgc3dpdGNoRmxhZzogMAorfSwgeworICBxZTogMHg1NjAxLAorICBubXBzOiA0NiwKKyAgbmxwczogNDYsCisgIHN3aXRjaEZsYWc6IDAKK31dOworCitjbGFzcyBBcml0aG1ldGljRGVjb2RlciB7CisgIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIHRoaXMuYnAgPSBzdGFydDsKKyAgICB0aGlzLmRhdGFFbmQgPSBlbmQ7CisgICAgdGhpcy5jaGlnaCA9IGRhdGFbc3RhcnRdOworICAgIHRoaXMuY2xvdyA9IDA7CisgICAgdGhpcy5ieXRlSW4oKTsKKyAgICB0aGlzLmNoaWdoID0gdGhpcy5jaGlnaCA8PCA3ICYgMHhmZmZmIHwgdGhpcy5jbG93ID4+IDkgJiAweDdmOworICAgIHRoaXMuY2xvdyA9IHRoaXMuY2xvdyA8PCA3ICYgMHhmZmZmOworICAgIHRoaXMuY3QgLT0gNzsKKyAgICB0aGlzLmEgPSAweDgwMDA7CisgIH0KKworICBieXRlSW4oKSB7CisgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICBsZXQgYnAgPSB0aGlzLmJwOworCisgICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7CisgICAgICBpZiAoZGF0YVticCArIDFdID4gMHg4ZikgeworICAgICAgICB0aGlzLmNsb3cgKz0gMHhmZjAwOworICAgICAgICB0aGlzLmN0ID0gODsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJwKys7CisgICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5OworICAgICAgICB0aGlzLmN0ID0gNzsKKyAgICAgICAgdGhpcy5icCA9IGJwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBicCsrOworICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDsKKyAgICAgIHRoaXMuY3QgPSA4OworICAgICAgdGhpcy5icCA9IGJwOworICAgIH0KKworICAgIGlmICh0aGlzLmNsb3cgPiAweGZmZmYpIHsKKyAgICAgIHRoaXMuY2hpZ2ggKz0gdGhpcy5jbG93ID4+IDE2OworICAgICAgdGhpcy5jbG93ICY9IDB4ZmZmZjsKKyAgICB9CisgIH0KKworICByZWFkQml0KGNvbnRleHRzLCBwb3MpIHsKKyAgICBsZXQgY3hfaW5kZXggPSBjb250ZXh0c1twb3NdID4+IDEsCisgICAgICAgIGN4X21wcyA9IGNvbnRleHRzW3Bvc10gJiAxOworICAgIGNvbnN0IHFlVGFibGVJY3ggPSBRZVRhYmxlW2N4X2luZGV4XTsKKyAgICBjb25zdCBxZUljeCA9IHFlVGFibGVJY3gucWU7CisgICAgbGV0IGQ7CisgICAgbGV0IGEgPSB0aGlzLmEgLSBxZUljeDsKKworICAgIGlmICh0aGlzLmNoaWdoIDwgcWVJY3gpIHsKKyAgICAgIGlmIChhIDwgcWVJY3gpIHsKKyAgICAgICAgYSA9IHFlSWN4OworICAgICAgICBkID0gY3hfbXBzOworICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGEgPSBxZUljeDsKKyAgICAgICAgZCA9IDEgXiBjeF9tcHM7CisKKyAgICAgICAgaWYgKHFlVGFibGVJY3guc3dpdGNoRmxhZyA9PT0gMSkgeworICAgICAgICAgIGN4X21wcyA9IGQ7CisgICAgICAgIH0KKworICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5jaGlnaCAtPSBxZUljeDsKKworICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkgeworICAgICAgICB0aGlzLmEgPSBhOworICAgICAgICByZXR1cm4gY3hfbXBzOworICAgICAgfQorCisgICAgICBpZiAoYSA8IHFlSWN4KSB7CisgICAgICAgIGQgPSAxIF4gY3hfbXBzOworCisgICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHsKKyAgICAgICAgICBjeF9tcHMgPSBkOworICAgICAgICB9CisKKyAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5scHM7CisgICAgICB9IGVsc2UgeworICAgICAgICBkID0gY3hfbXBzOworICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wczsKKyAgICAgIH0KKyAgICB9CisKKyAgICBkbyB7CisgICAgICBpZiAodGhpcy5jdCA9PT0gMCkgeworICAgICAgICB0aGlzLmJ5dGVJbigpOworICAgICAgfQorCisgICAgICBhIDw8PSAxOworICAgICAgdGhpcy5jaGlnaCA9IHRoaXMuY2hpZ2ggPDwgMSAmIDB4ZmZmZiB8IHRoaXMuY2xvdyA+PiAxNSAmIDE7CisgICAgICB0aGlzLmNsb3cgPSB0aGlzLmNsb3cgPDwgMSAmIDB4ZmZmZjsKKyAgICAgIHRoaXMuY3QtLTsKKyAgICB9IHdoaWxlICgoYSAmIDB4ODAwMCkgPT09IDApOworCisgICAgdGhpcy5hID0gYTsKKyAgICBjb250ZXh0c1twb3NdID0gY3hfaW5kZXggPDwgMSB8IGN4X21wczsKKyAgICByZXR1cm4gZDsKKyAgfQorCit9CisKK2V4cG9ydHMuQXJpdGhtZXRpY0RlY29kZXIgPSBBcml0aG1ldGljRGVjb2RlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9iaWRpLmpzIGIvbGliL2NvcmUvYmlkaS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGRjZmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvYmlkaS5qcwpAQCAtMCwwICsxLDMyNyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuYmlkaSA9IGJpZGk7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBiYXNlVHlwZXMgPSBbIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIlMiLCAiQiIsICJTIiwgIldTIiwgIkIiLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQiIsICJCIiwgIkIiLCAiUyIsICJXUyIsICJPTiIsICJPTiIsICJFVCIsICJFVCIsICJFVCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJFUyIsICJDUyIsICJFUyIsICJDUyIsICJDUyIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJDUyIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkIiLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQ1MiLCAiT04iLCAiRVQiLCAiRVQiLCAiRVQiLCAiRVQiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJPTiIsICJPTiIsICJCTiIsICJPTiIsICJPTiIsICJFVCIsICJFVCIsICJFTiIsICJFTiIsICJPTiIsICJMIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkVOIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIl07Cit2YXIgYXJhYmljVHlwZXMgPSBbIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIk9OIiwgIk9OIiwgIkFMIiwgIkVUIiwgIkVUIiwgIkFMIiwgIkNTIiwgIkFMIiwgIk9OIiwgIk9OIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkVUIiwgIkFOIiwgIkFOIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQU4iLCAiT04iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiTlNNIiwgIk5TTSIsICJPTiIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiXTsKKworZnVuY3Rpb24gaXNPZGQoaSkgeworICByZXR1cm4gKGkgJiAxKSAhPT0gMDsKK30KKworZnVuY3Rpb24gaXNFdmVuKGkpIHsKKyAgcmV0dXJuIChpICYgMSkgPT09IDA7Cit9CisKK2Z1bmN0aW9uIGZpbmRVbmVxdWFsKGFyciwgc3RhcnQsIHZhbHVlKSB7CisgIGZvciAodmFyIGogPSBzdGFydCwgamogPSBhcnIubGVuZ3RoOyBqIDwgamo7ICsraikgeworICAgIGlmIChhcnJbal0gIT09IHZhbHVlKSB7CisgICAgICByZXR1cm4gajsKKyAgICB9CisgIH0KKworICByZXR1cm4gajsKK30KKworZnVuY3Rpb24gc2V0VmFsdWVzKGFyciwgc3RhcnQsIGVuZCwgdmFsdWUpIHsKKyAgZm9yICh2YXIgaiA9IHN0YXJ0OyBqIDwgZW5kOyArK2opIHsKKyAgICBhcnJbal0gPSB2YWx1ZTsKKyAgfQorfQorCitmdW5jdGlvbiByZXZlcnNlVmFsdWVzKGFyciwgc3RhcnQsIGVuZCkgeworICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSAxOyBpIDwgajsgKytpLCAtLWopIHsKKyAgICB2YXIgdGVtcCA9IGFycltpXTsKKyAgICBhcnJbaV0gPSBhcnJbal07CisgICAgYXJyW2pdID0gdGVtcDsKKyAgfQorfQorCitmdW5jdGlvbiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSLCB2ZXJ0aWNhbCA9IGZhbHNlKSB7CisgIGxldCBkaXIgPSAibHRyIjsKKworICBpZiAodmVydGljYWwpIHsKKyAgICBkaXIgPSAidHRiIjsKKyAgfSBlbHNlIGlmICghaXNMVFIpIHsKKyAgICBkaXIgPSAicnRsIjsKKyAgfQorCisgIHJldHVybiB7CisgICAgc3RyLAorICAgIGRpcgorICB9OworfQorCit2YXIgY2hhcnMgPSBbXTsKK3ZhciB0eXBlcyA9IFtdOworCitmdW5jdGlvbiBiaWRpKHN0ciwgc3RhcnRMZXZlbCwgdmVydGljYWwpIHsKKyAgdmFyIGlzTFRSID0gdHJ1ZTsKKyAgdmFyIHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7CisKKyAgaWYgKHN0ckxlbmd0aCA9PT0gMCB8fCB2ZXJ0aWNhbCkgeworICAgIHJldHVybiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSLCB2ZXJ0aWNhbCk7CisgIH0KKworICBjaGFycy5sZW5ndGggPSBzdHJMZW5ndGg7CisgIHR5cGVzLmxlbmd0aCA9IHN0ckxlbmd0aDsKKyAgdmFyIG51bUJpZGkgPSAwOworICB2YXIgaSwgaWk7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgY2hhcnNbaV0gPSBzdHIuY2hhckF0KGkpOworICAgIHZhciBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOworICAgIHZhciBjaGFyVHlwZSA9ICJMIjsKKworICAgIGlmIChjaGFyQ29kZSA8PSAweDAwZmYpIHsKKyAgICAgIGNoYXJUeXBlID0gYmFzZVR5cGVzW2NoYXJDb2RlXTsKKyAgICB9IGVsc2UgaWYgKDB4MDU5MCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDA1ZjQpIHsKKyAgICAgIGNoYXJUeXBlID0gIlIiOworICAgIH0gZWxzZSBpZiAoMHgwNjAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDZmZikgeworICAgICAgY2hhclR5cGUgPSBhcmFiaWNUeXBlc1tjaGFyQ29kZSAmIDB4ZmZdOworCisgICAgICBpZiAoIWNoYXJUeXBlKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQmlkaTogaW52YWxpZCBVbmljb2RlIGNoYXJhY3RlciAiICsgY2hhckNvZGUudG9TdHJpbmcoMTYpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKDB4MDcwMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDA4YWMpIHsKKyAgICAgIGNoYXJUeXBlID0gIkFMIjsKKyAgICB9CisKKyAgICBpZiAoY2hhclR5cGUgPT09ICJSIiB8fCBjaGFyVHlwZSA9PT0gIkFMIiB8fCBjaGFyVHlwZSA9PT0gIkFOIikgeworICAgICAgbnVtQmlkaSsrOworICAgIH0KKworICAgIHR5cGVzW2ldID0gY2hhclR5cGU7CisgIH0KKworICBpZiAobnVtQmlkaSA9PT0gMCkgeworICAgIGlzTFRSID0gdHJ1ZTsKKyAgICByZXR1cm4gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUik7CisgIH0KKworICBpZiAoc3RhcnRMZXZlbCA9PT0gLTEpIHsKKyAgICBpZiAobnVtQmlkaSAvIHN0ckxlbmd0aCA8IDAuMykgeworICAgICAgaXNMVFIgPSB0cnVlOworICAgICAgc3RhcnRMZXZlbCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGlzTFRSID0gZmFsc2U7CisgICAgICBzdGFydExldmVsID0gMTsKKyAgICB9CisgIH0KKworICB2YXIgbGV2ZWxzID0gW107CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgbGV2ZWxzW2ldID0gc3RhcnRMZXZlbDsKKyAgfQorCisgIHZhciBlID0gaXNPZGQoc3RhcnRMZXZlbCkgPyAiUiIgOiAiTCI7CisgIHZhciBzb3IgPSBlOworICB2YXIgZW9yID0gc29yOworICB2YXIgbGFzdFR5cGUgPSBzb3I7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgaWYgKHR5cGVzW2ldID09PSAiTlNNIikgeworICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgbGFzdFR5cGUgPSB0eXBlc1tpXTsKKyAgICB9CisgIH0KKworICBsYXN0VHlwZSA9IHNvcjsKKyAgdmFyIHQ7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgdCA9IHR5cGVzW2ldOworCisgICAgaWYgKHQgPT09ICJFTiIpIHsKKyAgICAgIHR5cGVzW2ldID0gbGFzdFR5cGUgPT09ICJBTCIgPyAiQU4iIDogIkVOIjsKKyAgICB9IGVsc2UgaWYgKHQgPT09ICJSIiB8fCB0ID09PSAiTCIgfHwgdCA9PT0gIkFMIikgeworICAgICAgbGFzdFR5cGUgPSB0OworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIHQgPSB0eXBlc1tpXTsKKworICAgIGlmICh0ID09PSAiQUwiKSB7CisgICAgICB0eXBlc1tpXSA9ICJSIjsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAxOyBpIDwgc3RyTGVuZ3RoIC0gMTsgKytpKSB7CisgICAgaWYgKHR5cGVzW2ldID09PSAiRVMiICYmIHR5cGVzW2kgLSAxXSA9PT0gIkVOIiAmJiB0eXBlc1tpICsgMV0gPT09ICJFTiIpIHsKKyAgICAgIHR5cGVzW2ldID0gIkVOIjsKKyAgICB9CisKKyAgICBpZiAodHlwZXNbaV0gPT09ICJDUyIgJiYgKHR5cGVzW2kgLSAxXSA9PT0gIkVOIiB8fCB0eXBlc1tpIC0gMV0gPT09ICJBTiIpICYmIHR5cGVzW2kgKyAxXSA9PT0gdHlwZXNbaSAtIDFdKSB7CisgICAgICB0eXBlc1tpXSA9IHR5cGVzW2kgLSAxXTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICBpZiAodHlwZXNbaV0gPT09ICJFTiIpIHsKKyAgICAgIHZhciBqOworCisgICAgICBmb3IgKGogPSBpIC0gMTsgaiA+PSAwOyAtLWopIHsKKyAgICAgICAgaWYgKHR5cGVzW2pdICE9PSAiRVQiKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgc3RyTGVuZ3RoOyArK2opIHsKKyAgICAgICAgaWYgKHR5cGVzW2pdICE9PSAiRVQiKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CisgICAgdCA9IHR5cGVzW2ldOworCisgICAgaWYgKHQgPT09ICJXUyIgfHwgdCA9PT0gIkVTIiB8fCB0ID09PSAiRVQiIHx8IHQgPT09ICJDUyIpIHsKKyAgICAgIHR5cGVzW2ldID0gIk9OIjsKKyAgICB9CisgIH0KKworICBsYXN0VHlwZSA9IHNvcjsKKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICB0ID0gdHlwZXNbaV07CisKKyAgICBpZiAodCA9PT0gIkVOIikgeworICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZSA9PT0gIkwiID8gIkwiIDogIkVOIjsKKyAgICB9IGVsc2UgaWYgKHQgPT09ICJSIiB8fCB0ID09PSAiTCIpIHsKKyAgICAgIGxhc3RUeXBlID0gdDsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKKyAgICBpZiAodHlwZXNbaV0gPT09ICJPTiIpIHsKKyAgICAgIHZhciBlbmQgPSBmaW5kVW5lcXVhbCh0eXBlcywgaSArIDEsICJPTiIpOworICAgICAgdmFyIGJlZm9yZSA9IHNvcjsKKworICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIGJlZm9yZSA9IHR5cGVzW2kgLSAxXTsKKyAgICAgIH0KKworICAgICAgdmFyIGFmdGVyID0gZW9yOworCisgICAgICBpZiAoZW5kICsgMSA8IHN0ckxlbmd0aCkgeworICAgICAgICBhZnRlciA9IHR5cGVzW2VuZCArIDFdOworICAgICAgfQorCisgICAgICBpZiAoYmVmb3JlICE9PSAiTCIpIHsKKyAgICAgICAgYmVmb3JlID0gIlIiOworICAgICAgfQorCisgICAgICBpZiAoYWZ0ZXIgIT09ICJMIikgeworICAgICAgICBhZnRlciA9ICJSIjsKKyAgICAgIH0KKworICAgICAgaWYgKGJlZm9yZSA9PT0gYWZ0ZXIpIHsKKyAgICAgICAgc2V0VmFsdWVzKHR5cGVzLCBpLCBlbmQsIGJlZm9yZSk7CisgICAgICB9CisKKyAgICAgIGkgPSBlbmQgLSAxOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIGlmICh0eXBlc1tpXSA9PT0gIk9OIikgeworICAgICAgdHlwZXNbaV0gPSBlOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgeworICAgIHQgPSB0eXBlc1tpXTsKKworICAgIGlmIChpc0V2ZW4obGV2ZWxzW2ldKSkgeworICAgICAgaWYgKHQgPT09ICJSIikgeworICAgICAgICBsZXZlbHNbaV0gKz0gMTsKKyAgICAgIH0gZWxzZSBpZiAodCA9PT0gIkFOIiB8fCB0ID09PSAiRU4iKSB7CisgICAgICAgIGxldmVsc1tpXSArPSAyOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAodCA9PT0gIkwiIHx8IHQgPT09ICJBTiIgfHwgdCA9PT0gIkVOIikgeworICAgICAgICBsZXZlbHNbaV0gKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2YXIgaGlnaGVzdExldmVsID0gLTE7CisgIHZhciBsb3dlc3RPZGRMZXZlbCA9IDk5OworICB2YXIgbGV2ZWw7CisKKyAgZm9yIChpID0gMCwgaWkgPSBsZXZlbHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgIGxldmVsID0gbGV2ZWxzW2ldOworCisgICAgaWYgKGhpZ2hlc3RMZXZlbCA8IGxldmVsKSB7CisgICAgICBoaWdoZXN0TGV2ZWwgPSBsZXZlbDsKKyAgICB9CisKKyAgICBpZiAobG93ZXN0T2RkTGV2ZWwgPiBsZXZlbCAmJiBpc09kZChsZXZlbCkpIHsKKyAgICAgIGxvd2VzdE9kZExldmVsID0gbGV2ZWw7CisgICAgfQorICB9CisKKyAgZm9yIChsZXZlbCA9IGhpZ2hlc3RMZXZlbDsgbGV2ZWwgPj0gbG93ZXN0T2RkTGV2ZWw7IC0tbGV2ZWwpIHsKKyAgICB2YXIgc3RhcnQgPSAtMTsKKworICAgIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgIGlmIChsZXZlbHNbaV0gPCBsZXZlbCkgeworICAgICAgICBpZiAoc3RhcnQgPj0gMCkgeworICAgICAgICAgIHJldmVyc2VWYWx1ZXMoY2hhcnMsIHN0YXJ0LCBpKTsKKyAgICAgICAgICBzdGFydCA9IC0xOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICBzdGFydCA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXJ0ID49IDApIHsKKyAgICAgIHJldmVyc2VWYWx1ZXMoY2hhcnMsIHN0YXJ0LCBsZXZlbHMubGVuZ3RoKTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICB2YXIgY2ggPSBjaGFyc1tpXTsKKworICAgIGlmIChjaCA9PT0gIjwiIHx8IGNoID09PSAiPiIpIHsKKyAgICAgIGNoYXJzW2ldID0gIiI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KGNoYXJzLmpvaW4oIiIpLCBpc0xUUik7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvY2NpdHQuanMgYi9saWIvY29yZS9jY2l0dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQ3N2QzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvY2NpdHQuanMKQEAgLTAsMCArMSw3MjAgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNDSVRURmF4RGVjb2RlciA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKworY29uc3QgQ0NJVFRGYXhEZWNvZGVyID0gZnVuY3Rpb24gQ0NJVFRGYXhEZWNvZGVyKCkgeworICBjb25zdCBjY2l0dEVPTCA9IC0yOworICBjb25zdCBjY2l0dEVPRiA9IC0xOworICBjb25zdCB0d29EaW1QYXNzID0gMDsKKyAgY29uc3QgdHdvRGltSG9yaXogPSAxOworICBjb25zdCB0d29EaW1WZXJ0MCA9IDI7CisgIGNvbnN0IHR3b0RpbVZlcnRSMSA9IDM7CisgIGNvbnN0IHR3b0RpbVZlcnRMMSA9IDQ7CisgIGNvbnN0IHR3b0RpbVZlcnRSMiA9IDU7CisgIGNvbnN0IHR3b0RpbVZlcnRMMiA9IDY7CisgIGNvbnN0IHR3b0RpbVZlcnRSMyA9IDc7CisgIGNvbnN0IHR3b0RpbVZlcnRMMyA9IDg7CisgIGNvbnN0IHR3b0RpbVRhYmxlID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzcsIHR3b0RpbVZlcnRMM10sIFs3LCB0d29EaW1WZXJ0UjNdLCBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRMMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCBbNiwgdHdvRGltVmVydFIyXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXV07CisgIGNvbnN0IHdoaXRlVGFibGUxID0gW1stMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdXTsKKyAgY29uc3Qgd2hpdGVUYWJsZTIgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs4LCAyOV0sIFs4LCAyOV0sIFs4LCAzMF0sIFs4LCAzMF0sIFs4LCA0NV0sIFs4LCA0NV0sIFs4LCA0Nl0sIFs4LCA0Nl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs4LCA0N10sIFs4LCA0N10sIFs4LCA0OF0sIFs4LCA0OF0sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs4LCAzM10sIFs4LCAzM10sIFs4LCAzNF0sIFs4LCAzNF0sIFs4LCAzNV0sIFs4LCAzNV0sIFs4LCAzNl0sIFs4LCAzNl0sIFs4LCAzN10sIFs4LCAzN10sIFs4LCAzOF0sIFs4LCAzOF0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs4LCAzMV0sIFs4LCAzMV0sIFs4LCAzMl0sIFs4LCAzMl0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbOCwgNTNdLCBbOCwgNTNdLCBbOCwgNTRdLCBbOCwgNTRdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbOCwgMzldLCBbOCwgMzldLCBbOCwgNDBdLCBbOCwgNDBdLCBbOCwgNDFdLCBbOCwgNDFdLCBbOCwgNDJdLCBbOCwgNDJdLCBbOCwgNDNdLCBbOCwgNDNdLCBbOCwgNDRdLCBbOCwgNDRdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbOCwgNjFdLCBbOCwgNjFdLCBbOCwgNjJdLCBbOCwgNjJdLCBbOCwgNjNdLCBbOCwgNjNdLCBbOCwgMF0sIFs4LCAwXSwgWzgsIDMyMF0sIFs4LCAzMjBdLCBbOCwgMzg0XSwgWzgsIDM4NF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs4LCA1OV0sIFs4LCA1OV0sIFs4LCA2MF0sIFs4LCA2MF0sIFs5LCAxNDcyXSwgWzksIDE1MzZdLCBbOSwgMTYwMF0sIFs5LCAxNzI4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzgsIDQ5XSwgWzgsIDQ5XSwgWzgsIDUwXSwgWzgsIDUwXSwgWzgsIDUxXSwgWzgsIDUxXSwgWzgsIDUyXSwgWzgsIDUyXSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzgsIDU1XSwgWzgsIDU1XSwgWzgsIDU2XSwgWzgsIDU2XSwgWzgsIDU3XSwgWzgsIDU3XSwgWzgsIDU4XSwgWzgsIDU4XSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzgsIDQ0OF0sIFs4LCA0NDhdLCBbOCwgNTEyXSwgWzgsIDUxMl0sIFs5LCA3MDRdLCBbOSwgNzY4XSwgWzgsIDY0MF0sIFs4LCA2NDBdLCBbOCwgNTc2XSwgWzgsIDU3Nl0sIFs5LCA4MzJdLCBbOSwgODk2XSwgWzksIDk2MF0sIFs5LCAxMDI0XSwgWzksIDEwODhdLCBbOSwgMTE1Ml0sIFs5LCAxMjE2XSwgWzksIDEyODBdLCBbOSwgMTM0NF0sIFs5LCAxNDA4XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XV07CisgIGNvbnN0IGJsYWNrVGFibGUxID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzEyLCBjY2l0dEVPTF0sIFsxMiwgY2NpdHRFT0xdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzEyLCAxOTg0XSwgWzEyLCAxOTg0XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMTEyXSwgWzEyLCAyMTEyXSwgWzEyLCAyMTc2XSwgWzEyLCAyMTc2XSwgWzEyLCAyMjQwXSwgWzEyLCAyMjQwXSwgWzEyLCAyMzA0XSwgWzEyLCAyMzA0XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzEyLCAyMzY4XSwgWzEyLCAyMzY4XSwgWzEyLCAyNDMyXSwgWzEyLCAyNDMyXSwgWzEyLCAyNDk2XSwgWzEyLCAyNDk2XSwgWzEyLCAyNTYwXSwgWzEyLCAyNTYwXSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTIsIDUyXSwgWzEyLCA1Ml0sIFsxMywgNjQwXSwgWzEzLCA3MDRdLCBbMTMsIDc2OF0sIFsxMywgODMyXSwgWzEyLCA1NV0sIFsxMiwgNTVdLCBbMTIsIDU2XSwgWzEyLCA1Nl0sIFsxMywgMTI4MF0sIFsxMywgMTM0NF0sIFsxMywgMTQwOF0sIFsxMywgMTQ3Ml0sIFsxMiwgNTldLCBbMTIsIDU5XSwgWzEyLCA2MF0sIFsxMiwgNjBdLCBbMTMsIDE1MzZdLCBbMTMsIDE2MDBdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMywgMTY2NF0sIFsxMywgMTcyOF0sIFsxMiwgMzIwXSwgWzEyLCAzMjBdLCBbMTIsIDM4NF0sIFsxMiwgMzg0XSwgWzEyLCA0NDhdLCBbMTIsIDQ0OF0sIFsxMywgNTEyXSwgWzEzLCA1NzZdLCBbMTIsIDUzXSwgWzEyLCA1M10sIFsxMiwgNTRdLCBbMTIsIDU0XSwgWzEzLCA4OTZdLCBbMTMsIDk2MF0sIFsxMywgMTAyNF0sIFsxMywgMTA4OF0sIFsxMywgMTE1Ml0sIFsxMywgMTIxNl0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XV07CisgIGNvbnN0IGJsYWNrVGFibGUyID0gW1s4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFsxMSwgMjNdLCBbMTEsIDIzXSwgWzEyLCA1MF0sIFsxMiwgNTFdLCBbMTIsIDQ0XSwgWzEyLCA0NV0sIFsxMiwgNDZdLCBbMTIsIDQ3XSwgWzEyLCA1N10sIFsxMiwgNThdLCBbMTIsIDYxXSwgWzEyLCAyNTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMiwgNDhdLCBbMTIsIDQ5XSwgWzEyLCA2Ml0sIFsxMiwgNjNdLCBbMTIsIDMwXSwgWzEyLCAzMV0sIFsxMiwgMzJdLCBbMTIsIDMzXSwgWzEyLCA0MF0sIFsxMiwgNDFdLCBbMTEsIDIyXSwgWzExLCAyMl0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFsxMiwgMTI4XSwgWzEyLCAxOTJdLCBbMTIsIDI2XSwgWzEyLCAyN10sIFsxMiwgMjhdLCBbMTIsIDI5XSwgWzExLCAxOV0sIFsxMSwgMTldLCBbMTEsIDIwXSwgWzExLCAyMF0sIFsxMiwgMzRdLCBbMTIsIDM1XSwgWzEyLCAzNl0sIFsxMiwgMzddLCBbMTIsIDM4XSwgWzEyLCAzOV0sIFsxMSwgMjFdLCBbMTEsIDIxXSwgWzEyLCA0Ml0sIFsxMiwgNDNdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXTsKKyAgY29uc3QgYmxhY2tUYWJsZTMgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs2LCA5XSwgWzYsIDhdLCBbNSwgN10sIFs1LCA3XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl1dOworCisgIGZ1bmN0aW9uIENDSVRURmF4RGVjb2Rlcihzb3VyY2UsIG9wdGlvbnMgPSB7fSkgeworICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UubmV4dCAhPT0gImZ1bmN0aW9uIikgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdDQ0lUVEZheERlY29kZXIgLSBpbnZhbGlkICJzb3VyY2UiIHBhcmFtZXRlci4nKTsKKyAgICB9CisKKyAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICB0aGlzLmVvZiA9IGZhbHNlOworICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLksgfHwgMDsKKyAgICB0aGlzLmVvbGluZSA9IG9wdGlvbnMuRW5kT2ZMaW5lIHx8IGZhbHNlOworICAgIHRoaXMuYnl0ZUFsaWduID0gb3B0aW9ucy5FbmNvZGVkQnl0ZUFsaWduIHx8IGZhbHNlOworICAgIHRoaXMuY29sdW1ucyA9IG9wdGlvbnMuQ29sdW1ucyB8fCAxNzI4OworICAgIHRoaXMucm93cyA9IG9wdGlvbnMuUm93cyB8fCAwOworICAgIGxldCBlb2Jsb2NrID0gb3B0aW9ucy5FbmRPZkJsb2NrOworCisgICAgaWYgKGVvYmxvY2sgPT09IG51bGwgfHwgZW9ibG9jayA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBlb2Jsb2NrID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLmVvYmxvY2sgPSBlb2Jsb2NrOworICAgIHRoaXMuYmxhY2sgPSBvcHRpb25zLkJsYWNrSXMxIHx8IGZhbHNlOworICAgIHRoaXMuY29kaW5nTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAxKTsKKyAgICB0aGlzLnJlZkxpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMik7CisgICAgdGhpcy5jb2RpbmdMaW5lWzBdID0gdGhpcy5jb2x1bW5zOworICAgIHRoaXMuY29kaW5nUG9zID0gMDsKKyAgICB0aGlzLnJvdyA9IDA7CisgICAgdGhpcy5uZXh0TGluZTJEID0gdGhpcy5lbmNvZGluZyA8IDA7CisgICAgdGhpcy5pbnB1dEJpdHMgPSAwOworICAgIHRoaXMuaW5wdXRCdWYgPSAwOworICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7CisgICAgdGhpcy5yb3dzRG9uZSA9IGZhbHNlOworICAgIGxldCBjb2RlMTsKKworICAgIHdoaWxlICgoY29kZTEgPSB0aGlzLl9sb29rQml0cygxMikpID09PSAwKSB7CisgICAgICB0aGlzLl9lYXRCaXRzKDEpOworICAgIH0KKworICAgIGlmIChjb2RlMSA9PT0gMSkgeworICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisgICAgfQorCisgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CisgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7CisKKyAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisgICAgfQorICB9CisKKyAgQ0NJVFRGYXhEZWNvZGVyLnByb3RvdHlwZSA9IHsKKyAgICByZWFkTmV4dENoYXIoKSB7CisgICAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICBjb25zdCByZWZMaW5lID0gdGhpcy5yZWZMaW5lOworICAgICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKKyAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7CisgICAgICBsZXQgcmVmUG9zLCBibGFja1BpeGVscywgYml0cywgaTsKKworICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA9PT0gMCkgeworICAgICAgICBpZiAodGhpcy5yb3dzRG9uZSkgeworICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmVvZikgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZXJyID0gZmFsc2U7CisgICAgICAgIGxldCBjb2RlMSwgY29kZTIsIGNvZGUzOworCisgICAgICAgIGlmICh0aGlzLm5leHRMaW5lMkQpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBjb2RpbmdMaW5lW2ldIDwgY29sdW1uczsgKytpKSB7CisgICAgICAgICAgICByZWZMaW5lW2ldID0gY29kaW5nTGluZVtpXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZWZMaW5lW2krK10gPSBjb2x1bW5zOworICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2x1bW5zOworICAgICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOworICAgICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKKyAgICAgICAgICByZWZQb3MgPSAwOworICAgICAgICAgIGJsYWNrUGl4ZWxzID0gMDsKKworICAgICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fZ2V0VHdvRGltQ29kZSgpOworCisgICAgICAgICAgICBzd2l0Y2ggKGNvZGUxKSB7CisgICAgICAgICAgICAgIGNhc2UgdHdvRGltUGFzczoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3MgKyAxXSwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgaWYgKHJlZkxpbmVbcmVmUG9zICsgMV0gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbUhvcml6OgorICAgICAgICAgICAgICAgIGNvZGUxID0gY29kZTIgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKGJsYWNrUGl4ZWxzKSB7CisgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7CisgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CisKKyAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKKyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpOworICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworCisgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7CisgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUyLCBibGFja1BpeGVscyBeIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjM6CisgICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDMsIGJsYWNrUGl4ZWxzKTsKKworICAgICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICArK3JlZlBvczsKKworICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIyOgorICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAyLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOworCisgICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRSMToKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdICsgMSwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICsrcmVmUG9zOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0MDoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdLCBibGFja1BpeGVscyk7CisKKyAgICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOworCisgICAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMzoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMywgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC0tcmVmUG9zOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMjoKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMiwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC0tcmVmUG9zOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMToKKyAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMSwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC0tcmVmUG9zOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIGNjaXR0RU9GOgorICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2x1bW5zLCAwKTsKKworICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIDJkIGNvZGUiKTsKKworICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2x1bW5zLCAwKTsKKworICAgICAgICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kaW5nTGluZVswXSA9IDA7CisgICAgICAgICAgdGhpcy5jb2RpbmdQb3MgPSAwOworICAgICAgICAgIGJsYWNrUGl4ZWxzID0gMDsKKworICAgICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgIGNvZGUxID0gMDsKKworICAgICAgICAgICAgaWYgKGJsYWNrUGl4ZWxzKSB7CisgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOworICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMSwgYmxhY2tQaXhlbHMpOworCisgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxldCBnb3RFT0wgPSBmYWxzZTsKKworICAgICAgICBpZiAodGhpcy5ieXRlQWxpZ24pIHsKKyAgICAgICAgICB0aGlzLmlucHV0Qml0cyAmPSB+NzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGhpcy5lb2Jsb2NrICYmIHRoaXMucm93ID09PSB0aGlzLnJvd3MgLSAxKSB7CisgICAgICAgICAgdGhpcy5yb3dzRG9uZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisKKyAgICAgICAgICBpZiAodGhpcy5lb2xpbmUpIHsKKyAgICAgICAgICAgIHdoaWxlIChjb2RlMSAhPT0gY2NpdHRFT0YgJiYgY29kZTEgIT09IDEpIHsKKyAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKworICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKGNvZGUxID09PSAwKSB7CisgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGNvZGUxID09PSAxKSB7CisgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKKworICAgICAgICAgICAgZ290RU9MID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUxID09PSBjY2l0dEVPRikgeworICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGhpcy5lb2YgJiYgdGhpcy5lbmNvZGluZyA+IDAgJiYgIXRoaXMucm93c0RvbmUpIHsKKyAgICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7CisKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuZW9ibG9jayAmJiBnb3RFT0wgJiYgdGhpcy5ieXRlQWxpZ24pIHsKKyAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKKworICAgICAgICAgIGlmIChjb2RlMSA9PT0gMSkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkgeworICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKKworICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+PSAwKSB7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKKworICAgICAgICAgICAgICAgIGlmIChjb2RlMSAhPT0gMSkgeworICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJiYWQgcnRjIGNvZGU6ICIgKyBjb2RlMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2tCaXRzKDEpOworCisgICAgICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyICYmIHRoaXMuZW9saW5lKSB7CisgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTMpOworCisgICAgICAgICAgICBpZiAoY29kZTEgPT09IGNjaXR0RU9GKSB7CisgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29kZTEgPj4gMSA9PT0gMSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKKworICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKKworICAgICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIShjb2RlMSAmIDEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RpbmdMaW5lWzBdID4gMCkgeworICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgPSAwXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zID0gMV07CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJvdysrOworICAgICAgfQorCisgICAgICBsZXQgYzsKKworICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA+PSA4KSB7CisgICAgICAgIGMgPSB0aGlzLmNvZGluZ1BvcyAmIDEgPyAwIDogMHhmZjsKKyAgICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IDg7CisKKyAgICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA9PT0gMCAmJiBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICB0aGlzLmNvZGluZ1BvcysrOworICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBiaXRzID0gODsKKyAgICAgICAgYyA9IDA7CisKKyAgICAgICAgZG8geworICAgICAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPiBiaXRzKSB7CisgICAgICAgICAgICBjIDw8PSBiaXRzOworCisgICAgICAgICAgICBpZiAoISh0aGlzLmNvZGluZ1BvcyAmIDEpKSB7CisgICAgICAgICAgICAgIGMgfD0gMHhmZiA+PiA4IC0gYml0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IGJpdHM7CisgICAgICAgICAgICBiaXRzID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYyA8PD0gdGhpcy5vdXRwdXRCaXRzOworCisgICAgICAgICAgICBpZiAoISh0aGlzLmNvZGluZ1BvcyAmIDEpKSB7CisgICAgICAgICAgICAgIGMgfD0gMHhmZiA+PiA4IC0gdGhpcy5vdXRwdXRCaXRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiaXRzIC09IHRoaXMub3V0cHV0Qml0czsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7CisKKyAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKKyAgICAgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gLSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zIC0gMV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJpdHMgPiAwKSB7CisgICAgICAgICAgICAgIGMgPDw9IGJpdHM7CisgICAgICAgICAgICAgIGJpdHMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoYml0cyk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmJsYWNrKSB7CisgICAgICAgIGMgXj0gMHhmZjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGM7CisgICAgfSwKKworICAgIF9hZGRQaXhlbHMoYTEsIGJsYWNrUGl4ZWxzKSB7CisgICAgICBjb25zdCBjb2RpbmdMaW5lID0gdGhpcy5jb2RpbmdMaW5lOworICAgICAgbGV0IGNvZGluZ1BvcyA9IHRoaXMuY29kaW5nUG9zOworCisgICAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKKyAgICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7CisgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOworICAgICAgICAgIGExID0gdGhpcy5jb2x1bW5zOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGluZ1BvcyAmIDEgXiBibGFja1BpeGVscykgeworICAgICAgICAgICsrY29kaW5nUG9zOworICAgICAgICB9CisKKyAgICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zOworICAgIH0sCisKKyAgICBfYWRkUGl4ZWxzTmVnKGExLCBibGFja1BpeGVscykgeworICAgICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKKyAgICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvczsKKworICAgICAgaWYgKGExID4gY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7CisgICAgICAgIGlmIChhMSA+IHRoaXMuY29sdW1ucykgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgicm93IGlzIHdyb25nIGxlbmd0aCIpOworICAgICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKKyAgICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RpbmdQb3MgJiAxIF4gYmxhY2tQaXhlbHMpIHsKKyAgICAgICAgICArK2NvZGluZ1BvczsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOworICAgICAgfSBlbHNlIGlmIChhMSA8IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkgeworICAgICAgICBpZiAoYTEgPCAwKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJpbnZhbGlkIGNvZGUiKTsKKyAgICAgICAgICB0aGlzLmVyciA9IHRydWU7CisgICAgICAgICAgYTEgPSAwOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGNvZGluZ1BvcyA+IDAgJiYgYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1BvcyAtIDFdKSB7CisgICAgICAgICAgLS1jb2RpbmdQb3M7CisgICAgICAgIH0KKworICAgICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7CisgICAgfSwKKworICAgIF9maW5kVGFibGVDb2RlKHN0YXJ0LCBlbmQsIHRhYmxlLCBsaW1pdCkgeworICAgICAgY29uc3QgbGltaXRWYWx1ZSA9IGxpbWl0IHx8IDA7CisKKyAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkgeworICAgICAgICBsZXQgY29kZSA9IHRoaXMuX2xvb2tCaXRzKGkpOworCisgICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikgeworICAgICAgICAgIHJldHVybiBbdHJ1ZSwgMSwgZmFsc2VdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBlbmQpIHsKKyAgICAgICAgICBjb2RlIDw8PSBlbmQgLSBpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsaW1pdFZhbHVlIHx8IGNvZGUgPj0gbGltaXRWYWx1ZSkgeworICAgICAgICAgIGNvbnN0IHAgPSB0YWJsZVtjb2RlIC0gbGltaXRWYWx1ZV07CisKKyAgICAgICAgICBpZiAocFswXSA9PT0gaSkgeworICAgICAgICAgICAgdGhpcy5fZWF0Qml0cyhpKTsKKworICAgICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIFtmYWxzZSwgMCwgZmFsc2VdOworICAgIH0sCisKKyAgICBfZ2V0VHdvRGltQ29kZSgpIHsKKyAgICAgIGxldCBjb2RlID0gMDsKKyAgICAgIGxldCBwOworCisgICAgICBpZiAodGhpcy5lb2Jsb2NrKSB7CisgICAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cyg3KTsKKyAgICAgICAgcCA9IHR3b0RpbVRhYmxlW2NvZGVdOworCisgICAgICAgIGlmIChwICYmIHBbMF0gPiAwKSB7CisgICAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKKworICAgICAgICAgIHJldHVybiBwWzFdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDcsIHR3b0RpbVRhYmxlKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdICYmIHJlc3VsdFsyXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJCYWQgdHdvIGRpbSBjb2RlIik7CisgICAgICByZXR1cm4gY2NpdHRFT0Y7CisgICAgfSwKKworICAgIF9nZXRXaGl0ZUNvZGUoKSB7CisgICAgICBsZXQgY29kZSA9IDA7CisgICAgICBsZXQgcDsKKworICAgICAgaWYgKHRoaXMuZW9ibG9jaykgeworICAgICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoMTIpOworCisgICAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvZGUgPj4gNSA9PT0gMCkgeworICAgICAgICAgIHAgPSB3aGl0ZVRhYmxlMVtjb2RlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwID0gd2hpdGVUYWJsZTJbY29kZSA+PiAzXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwWzBdID4gMCkgeworICAgICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CisKKyAgICAgICAgICByZXR1cm4gcFsxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMSwgOSwgd2hpdGVUYWJsZTIpOworCisgICAgICAgIGlmIChyZXN1bHRbMF0pIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMSwgMTIsIHdoaXRlVGFibGUxKTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoImJhZCB3aGl0ZSBjb2RlIik7CisKKyAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CisKKyAgICAgIHJldHVybiAxOworICAgIH0sCisKKyAgICBfZ2V0QmxhY2tDb2RlKCkgeworICAgICAgbGV0IGNvZGUsIHA7CisKKyAgICAgIGlmICh0aGlzLmVvYmxvY2spIHsKKyAgICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKKworICAgICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RlID4+IDcgPT09IDApIHsKKyAgICAgICAgICBwID0gYmxhY2tUYWJsZTFbY29kZV07CisgICAgICAgIH0gZWxzZSBpZiAoY29kZSA+PiA5ID09PSAwICYmIGNvZGUgPj4gNyAhPT0gMCkgeworICAgICAgICAgIHAgPSBibGFja1RhYmxlMlsoY29kZSA+PiAxKSAtIDY0XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwID0gYmxhY2tUYWJsZTNbY29kZSA+PiA3XTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwWzBdID4gMCkgeworICAgICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CisKKyAgICAgICAgICByZXR1cm4gcFsxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMiwgNiwgYmxhY2tUYWJsZTMpOworCisgICAgICAgIGlmIChyZXN1bHRbMF0pIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSg3LCAxMiwgYmxhY2tUYWJsZTIsIDY0KTsKKworICAgICAgICBpZiAocmVzdWx0WzBdKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMTAsIDEzLCBibGFja1RhYmxlMSk7CisKKyAgICAgICAgaWYgKHJlc3VsdFswXSkgeworICAgICAgICAgIHJldHVybiByZXN1bHRbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJiYWQgYmxhY2sgY29kZSIpOworCisgICAgICB0aGlzLl9lYXRCaXRzKDEpOworCisgICAgICByZXR1cm4gMTsKKyAgICB9LAorCisgICAgX2xvb2tCaXRzKG4pIHsKKyAgICAgIGxldCBjOworCisgICAgICB3aGlsZSAodGhpcy5pbnB1dEJpdHMgPCBuKSB7CisgICAgICAgIGlmICgoYyA9IHRoaXMuc291cmNlLm5leHQoKSkgPT09IC0xKSB7CisgICAgICAgICAgaWYgKHRoaXMuaW5wdXRCaXRzID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gY2NpdHRFT0Y7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRCdWYgPDwgbiAtIHRoaXMuaW5wdXRCaXRzICYgMHhmZmZmID4+IDE2IC0gbjsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuaW5wdXRCdWYgPSB0aGlzLmlucHV0QnVmIDw8IDggfCBjOworICAgICAgICB0aGlzLmlucHV0Qml0cyArPSA4OworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5pbnB1dEJ1ZiA+PiB0aGlzLmlucHV0Qml0cyAtIG4gJiAweGZmZmYgPj4gMTYgLSBuOworICAgIH0sCisKKyAgICBfZWF0Qml0cyhuKSB7CisgICAgICBpZiAoKHRoaXMuaW5wdXRCaXRzIC09IG4pIDwgMCkgeworICAgICAgICB0aGlzLmlucHV0Qml0cyA9IDA7CisgICAgICB9CisgICAgfQorCisgIH07CisgIHJldHVybiBDQ0lUVEZheERlY29kZXI7Cit9KCk7CisKK2V4cG9ydHMuQ0NJVFRGYXhEZWNvZGVyID0gQ0NJVFRGYXhEZWNvZGVyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL2NjaXR0X3N0cmVhbS5qcyBiL2xpYi9jb3JlL2NjaXR0X3N0cmVhbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjZiODk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvY2NpdHRfc3RyZWFtLmpzCkBAIC0wLDAgKzEsODIgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNDSVRURmF4U3RyZWFtID0gdm9pZCAwOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuL3ByaW1pdGl2ZXMuanMiKTsKKwordmFyIF9jY2l0dCA9IHJlcXVpcmUoIi4vY2NpdHQuanMiKTsKKwordmFyIF9zdHJlYW0gPSByZXF1aXJlKCIuL3N0cmVhbS5qcyIpOworCit2YXIgQ0NJVFRGYXhTdHJlYW0gPSBmdW5jdGlvbiBDQ0lUVEZheFN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENDSVRURmF4U3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgsIHBhcmFtcykgeworICAgIHRoaXMuc3RyID0gc3RyOworICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShwYXJhbXMpKSB7CisgICAgICBwYXJhbXMgPSBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworICAgIH0KKworICAgIGNvbnN0IHNvdXJjZSA9IHsKKyAgICAgIG5leHQoKSB7CisgICAgICAgIHJldHVybiBzdHIuZ2V0Qnl0ZSgpOworICAgICAgfQorCisgICAgfTsKKyAgICB0aGlzLmNjaXR0RmF4RGVjb2RlciA9IG5ldyBfY2NpdHQuQ0NJVFRGYXhEZWNvZGVyKHNvdXJjZSwgeworICAgICAgSzogcGFyYW1zLmdldCgiSyIpLAorICAgICAgRW5kT2ZMaW5lOiBwYXJhbXMuZ2V0KCJFbmRPZkxpbmUiKSwKKyAgICAgIEVuY29kZWRCeXRlQWxpZ246IHBhcmFtcy5nZXQoIkVuY29kZWRCeXRlQWxpZ24iKSwKKyAgICAgIENvbHVtbnM6IHBhcmFtcy5nZXQoIkNvbHVtbnMiKSwKKyAgICAgIFJvd3M6IHBhcmFtcy5nZXQoIlJvd3MiKSwKKyAgICAgIEVuZE9mQmxvY2s6IHBhcmFtcy5nZXQoIkVuZE9mQmxvY2siKSwKKyAgICAgIEJsYWNrSXMxOiBwYXJhbXMuZ2V0KCJCbGFja0lzMSIpCisgICAgfSk7CisKKyAgICBfc3RyZWFtLkRlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIENDSVRURmF4U3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoX3N0cmVhbS5EZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKworICBDQ0lUVEZheFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkgeworICAgIHdoaWxlICghdGhpcy5lb2YpIHsKKyAgICAgIGNvbnN0IGMgPSB0aGlzLmNjaXR0RmF4RGVjb2Rlci5yZWFkTmV4dENoYXIoKTsKKworICAgICAgaWYgKGMgPT09IC0xKSB7CisgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIDEpOworICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK10gPSBjOworICAgIH0KKyAgfTsKKworICByZXR1cm4gQ0NJVFRGYXhTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuQ0NJVFRGYXhTdHJlYW0gPSBDQ0lUVEZheFN0cmVhbTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9jZmZfcGFyc2VyLmpzIGIvbGliL2NvcmUvY2ZmX3BhcnNlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDBkN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvY2ZmX3BhcnNlci5qcwpAQCAtMCwwICsxLDE4NDYgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNGRkZEU2VsZWN0ID0gZXhwb3J0cy5DRkZDb21waWxlciA9IGV4cG9ydHMuQ0ZGUHJpdmF0ZURpY3QgPSBleHBvcnRzLkNGRlRvcERpY3QgPSBleHBvcnRzLkNGRkNoYXJzZXQgPSBleHBvcnRzLkNGRkluZGV4ID0gZXhwb3J0cy5DRkZTdHJpbmdzID0gZXhwb3J0cy5DRkZIZWFkZXIgPSBleHBvcnRzLkNGRiA9IGV4cG9ydHMuQ0ZGUGFyc2VyID0gZXhwb3J0cy5DRkZTdGFuZGFyZFN0cmluZ3MgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfY2hhcnNldHMgPSByZXF1aXJlKCIuL2NoYXJzZXRzLmpzIik7CisKK3ZhciBfZW5jb2RpbmdzID0gcmVxdWlyZSgiLi9lbmNvZGluZ3MuanMiKTsKKwordmFyIE1BWF9TVUJSX05FU1RJTkcgPSAxMDsKK3ZhciBDRkZTdGFuZGFyZFN0cmluZ3MgPSBbIi5ub3RkZWYiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgInF1b3RlbGVmdCIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImZyYWN0aW9uIiwgInllbiIsICJmbG9yaW4iLCAic2VjdGlvbiIsICJjdXJyZW5jeSIsICJxdW90ZXNpbmdsZSIsICJxdW90ZWRibGxlZnQiLCAiZ3VpbGxlbW90bGVmdCIsICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwgImZsIiwgImVuZGFzaCIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInBhcmFncmFwaCIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInF1b3RlZGJscmlnaHQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCAicXVlc3Rpb25kb3duIiwgImdyYXZlIiwgImFjdXRlIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJkaWVyZXNpcyIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJjYXJvbiIsICJlbWRhc2giLCAiQUUiLCAib3JkZmVtaW5pbmUiLCAiTHNsYXNoIiwgIk9zbGFzaCIsICJPRSIsICJvcmRtYXNjdWxpbmUiLCAiYWUiLCAiZG90bGVzc2kiLCAibHNsYXNoIiwgIm9zbGFzaCIsICJvZSIsICJnZXJtYW5kYmxzIiwgIm9uZXN1cGVyaW9yIiwgImxvZ2ljYWxub3QiLCAibXUiLCAidHJhZGVtYXJrIiwgIkV0aCIsICJvbmVoYWxmIiwgInBsdXNtaW51cyIsICJUaG9ybiIsICJvbmVxdWFydGVyIiwgImRpdmlkZSIsICJicm9rZW5iYXIiLCAiZGVncmVlIiwgInRob3JuIiwgInRocmVlcXVhcnRlcnMiLCAidHdvc3VwZXJpb3IiLCAicmVnaXN0ZXJlZCIsICJtaW51cyIsICJldGgiLCAibXVsdGlwbHkiLCAidGhyZWVzdXBlcmlvciIsICJjb3B5cmlnaHQiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkFkaWVyZXNpcyIsICJBZ3JhdmUiLCAiQXJpbmciLCAiQXRpbGRlIiwgIkNjZWRpbGxhIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiRWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiSWdyYXZlIiwgIk50aWxkZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiT2RpZXJlc2lzIiwgIk9ncmF2ZSIsICJPdGlsZGUiLCAiU2Nhcm9uIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZGllcmVzaXMiLCAiVWdyYXZlIiwgIllhY3V0ZSIsICJZZGllcmVzaXMiLCAiWmNhcm9uIiwgImFhY3V0ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYWdyYXZlIiwgImFyaW5nIiwgImF0aWxkZSIsICJjY2VkaWxsYSIsICJlYWN1dGUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImVncmF2ZSIsICJpYWN1dGUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgImlncmF2ZSIsICJudGlsZGUiLCAib2FjdXRlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvZ3JhdmUiLCAib3RpbGRlIiwgInNjYXJvbiIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInVncmF2ZSIsICJ5YWN1dGUiLCAieWRpZXJlc2lzIiwgInpjYXJvbiIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgInF1ZXN0aW9uc21hbGwiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICJpc3VwZXJpb3IiLCAibHN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJuc3VwZXJpb3IiLCAib3N1cGVyaW9yIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgImZmIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsICJEaWVyZXNpc3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiQ2Fyb25zbWFsbCIsICJEb3RhY2NlbnRzbWFsbCIsICJNYWNyb25zbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIiwgIkFncmF2ZXNtYWxsIiwgIkFhY3V0ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXJpbmdzbWFsbCIsICJBRXNtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIkV0aHNtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT3RpbGRlc21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT0VzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJVZ3JhdmVzbWFsbCIsICJVYWN1dGVzbWFsbCIsICJVY2lyY3VtZmxleHNtYWxsIiwgIlVkaWVyZXNpc3NtYWxsIiwgIllhY3V0ZXNtYWxsIiwgIlRob3Juc21hbGwiLCAiWWRpZXJlc2lzc21hbGwiLCAiMDAxLjAwMCIsICIwMDEuMDAxIiwgIjAwMS4wMDIiLCAiMDAxLjAwMyIsICJCbGFjayIsICJCb2xkIiwgIkJvb2siLCAiTGlnaHQiLCAiTWVkaXVtIiwgIlJlZ3VsYXIiLCAiUm9tYW4iLCAiU2VtaWJvbGQiXTsKK2V4cG9ydHMuQ0ZGU3RhbmRhcmRTdHJpbmdzID0gQ0ZGU3RhbmRhcmRTdHJpbmdzOworY29uc3QgTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTID0gMzkxOworCit2YXIgQ0ZGUGFyc2VyID0gZnVuY3Rpb24gQ0ZGUGFyc2VyQ2xvc3VyZSgpIHsKKyAgdmFyIENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YSA9IFtudWxsLCB7CisgICAgaWQ6ICJoc3RlbSIsCisgICAgbWluOiAyLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUsCisgICAgc3RlbTogdHJ1ZQorICB9LCBudWxsLCB7CisgICAgaWQ6ICJ2c3RlbSIsCisgICAgbWluOiAyLAorICAgIHN0YWNrQ2xlYXJpbmc6IHRydWUsCisgICAgc3RlbTogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJ2bW92ZXRvIiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJybGluZXRvIiwKKyAgICBtaW46IDIsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJobGluZXRvIiwKKyAgICBtaW46IDEsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJ2bGluZXRvIiwKKyAgICBtaW46IDEsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJycmN1cnZldG8iLAorICAgIG1pbjogNiwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIG51bGwsIHsKKyAgICBpZDogImNhbGxzdWJyIiwKKyAgICBtaW46IDEsCisgICAgdW5kZWZTdGFjazogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJyZXR1cm4iLAorICAgIG1pbjogMCwKKyAgICB1bmRlZlN0YWNrOiB0cnVlCisgIH0sIG51bGwsIG51bGwsIHsKKyAgICBpZDogImVuZGNoYXIiLAorICAgIG1pbjogMCwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlCisgIH0sIG51bGwsIG51bGwsIG51bGwsIHsKKyAgICBpZDogImhzdGVtaG0iLAorICAgIG1pbjogMiwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlLAorICAgIHN0ZW06IHRydWUKKyAgfSwgeworICAgIGlkOiAiaGludG1hc2siLAorICAgIG1pbjogMCwKKyAgICBzdGFja0NsZWFyaW5nOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImNudHJtYXNrIiwKKyAgICBtaW46IDAsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJybW92ZXRvIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJobW92ZXRvIiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZQorICB9LCB7CisgICAgaWQ6ICJ2c3RlbWhtIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKKyAgICBzdGVtOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInJjdXJ2ZWxpbmUiLAorICAgIG1pbjogOCwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInJsaW5lY3VydmUiLAorICAgIG1pbjogOCwKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInZ2Y3VydmV0byIsCisgICAgbWluOiA0LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAiaGhjdXJ2ZXRvIiwKKyAgICBtaW46IDQsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9LCBudWxsLCB7CisgICAgaWQ6ICJjYWxsZ3N1YnIiLAorICAgIG1pbjogMSwKKyAgICB1bmRlZlN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogInZoY3VydmV0byIsCisgICAgbWluOiA0LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAiaHZjdXJ2ZXRvIiwKKyAgICBtaW46IDQsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9XTsKKyAgdmFyIENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YTEyID0gW251bGwsIG51bGwsIG51bGwsIHsKKyAgICBpZDogImFuZCIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IC0xCisgIH0sIHsKKyAgICBpZDogIm9yIiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogLTEKKyAgfSwgeworICAgIGlkOiAibm90IiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tEZWx0YTogMAorICB9LCBudWxsLCBudWxsLCBudWxsLCB7CisgICAgaWQ6ICJhYnMiLAorICAgIG1pbjogMSwKKyAgICBzdGFja0RlbHRhOiAwCisgIH0sIHsKKyAgICBpZDogImFkZCIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IC0xLAorICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHsKKyAgICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdICsgc3RhY2tbaW5kZXggLSAxXTsKKyAgICB9CisgIH0sIHsKKyAgICBpZDogInN1YiIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IC0xLAorICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHsKKyAgICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdIC0gc3RhY2tbaW5kZXggLSAxXTsKKyAgICB9CisgIH0sIHsKKyAgICBpZDogImRpdiIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IC0xLAorICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHsKKyAgICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdIC8gc3RhY2tbaW5kZXggLSAxXTsKKyAgICB9CisgIH0sIG51bGwsIHsKKyAgICBpZDogIm5lZyIsCisgICAgbWluOiAxLAorICAgIHN0YWNrRGVsdGE6IDAsCisgICAgc3RhY2tGbjogZnVuY3Rpb24gc3RhY2tfZGl2KHN0YWNrLCBpbmRleCkgeworICAgICAgc3RhY2tbaW5kZXggLSAxXSA9IC1zdGFja1tpbmRleCAtIDFdOworICAgIH0KKyAgfSwgeworICAgIGlkOiAiZXEiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAtMQorICB9LCBudWxsLCBudWxsLCB7CisgICAgaWQ6ICJkcm9wIiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tEZWx0YTogLTEKKyAgfSwgbnVsbCwgeworICAgIGlkOiAicHV0IiwKKyAgICBtaW46IDIsCisgICAgc3RhY2tEZWx0YTogLTIKKyAgfSwgeworICAgIGlkOiAiZ2V0IiwKKyAgICBtaW46IDEsCisgICAgc3RhY2tEZWx0YTogMAorICB9LCB7CisgICAgaWQ6ICJpZmVsc2UiLAorICAgIG1pbjogNCwKKyAgICBzdGFja0RlbHRhOiAtMworICB9LCB7CisgICAgaWQ6ICJyYW5kb20iLAorICAgIG1pbjogMCwKKyAgICBzdGFja0RlbHRhOiAxCisgIH0sIHsKKyAgICBpZDogIm11bCIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IC0xLAorICAgIHN0YWNrRm46IGZ1bmN0aW9uIHN0YWNrX2RpdihzdGFjaywgaW5kZXgpIHsKKyAgICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdICogc3RhY2tbaW5kZXggLSAxXTsKKyAgICB9CisgIH0sIG51bGwsIHsKKyAgICBpZDogInNxcnQiLAorICAgIG1pbjogMSwKKyAgICBzdGFja0RlbHRhOiAwCisgIH0sIHsKKyAgICBpZDogImR1cCIsCisgICAgbWluOiAxLAorICAgIHN0YWNrRGVsdGE6IDEKKyAgfSwgeworICAgIGlkOiAiZXhjaCIsCisgICAgbWluOiAyLAorICAgIHN0YWNrRGVsdGE6IDAKKyAgfSwgeworICAgIGlkOiAiaW5kZXgiLAorICAgIG1pbjogMiwKKyAgICBzdGFja0RlbHRhOiAwCisgIH0sIHsKKyAgICBpZDogInJvbGwiLAorICAgIG1pbjogMywKKyAgICBzdGFja0RlbHRhOiAtMgorICB9LCBudWxsLCBudWxsLCBudWxsLCB7CisgICAgaWQ6ICJoZmxleCIsCisgICAgbWluOiA3LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAiZmxleCIsCisgICAgbWluOiAxMywKKyAgICByZXNldFN0YWNrOiB0cnVlCisgIH0sIHsKKyAgICBpZDogImhmbGV4MSIsCisgICAgbWluOiA5LAorICAgIHJlc2V0U3RhY2s6IHRydWUKKyAgfSwgeworICAgIGlkOiAiZmxleDEiLAorICAgIG1pbjogMTEsCisgICAgcmVzZXRTdGFjazogdHJ1ZQorICB9XTsKKworICBjbGFzcyBDRkZQYXJzZXIgeworICAgIGNvbnN0cnVjdG9yKGZpbGUsIHByb3BlcnRpZXMsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKKyAgICAgIHRoaXMuYnl0ZXMgPSBmaWxlLmdldEJ5dGVzKCk7CisgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICAgICAgdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkID0gISFzZWFjQW5hbHlzaXNFbmFibGVkOworICAgIH0KKworICAgIHBhcnNlKCkgeworICAgICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7CisgICAgICB2YXIgY2ZmID0gbmV3IENGRigpOworICAgICAgdGhpcy5jZmYgPSBjZmY7CisgICAgICB2YXIgaGVhZGVyID0gdGhpcy5wYXJzZUhlYWRlcigpOworICAgICAgdmFyIG5hbWVJbmRleCA9IHRoaXMucGFyc2VJbmRleChoZWFkZXIuZW5kUG9zKTsKKyAgICAgIHZhciB0b3BEaWN0SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgobmFtZUluZGV4LmVuZFBvcyk7CisgICAgICB2YXIgc3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdEluZGV4LmVuZFBvcyk7CisgICAgICB2YXIgZ2xvYmFsU3VickluZGV4ID0gdGhpcy5wYXJzZUluZGV4KHN0cmluZ0luZGV4LmVuZFBvcyk7CisgICAgICB2YXIgdG9wRGljdFBhcnNlZCA9IHRoaXMucGFyc2VEaWN0KHRvcERpY3RJbmRleC5vYmouZ2V0KDApKTsKKyAgICAgIHZhciB0b3BEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlRvcERpY3QsIHRvcERpY3RQYXJzZWQsIGNmZi5zdHJpbmdzKTsKKyAgICAgIGNmZi5oZWFkZXIgPSBoZWFkZXIub2JqOworICAgICAgY2ZmLm5hbWVzID0gdGhpcy5wYXJzZU5hbWVJbmRleChuYW1lSW5kZXgub2JqKTsKKyAgICAgIGNmZi5zdHJpbmdzID0gdGhpcy5wYXJzZVN0cmluZ0luZGV4KHN0cmluZ0luZGV4Lm9iaik7CisgICAgICBjZmYudG9wRGljdCA9IHRvcERpY3Q7CisgICAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gZ2xvYmFsU3VickluZGV4Lm9iajsKKyAgICAgIHRoaXMucGFyc2VQcml2YXRlRGljdChjZmYudG9wRGljdCk7CisgICAgICBjZmYuaXNDSURGb250ID0gdG9wRGljdC5oYXNOYW1lKCJST1MiKTsKKyAgICAgIHZhciBjaGFyU3RyaW5nT2Zmc2V0ID0gdG9wRGljdC5nZXRCeU5hbWUoIkNoYXJTdHJpbmdzIik7CisgICAgICB2YXIgY2hhclN0cmluZ0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KGNoYXJTdHJpbmdPZmZzZXQpLm9iajsKKyAgICAgIHZhciBmb250TWF0cml4ID0gdG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTsKKworICAgICAgaWYgKGZvbnRNYXRyaXgpIHsKKyAgICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnRCQm94ID0gdG9wRGljdC5nZXRCeU5hbWUoIkZvbnRCQm94Iik7CisKKyAgICAgIGlmIChmb250QkJveCkgeworICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudCA9IE1hdGgubWF4KGZvbnRCQm94WzNdLCBmb250QkJveFsxXSk7CisgICAgICAgIHByb3BlcnRpZXMuZGVzY2VudCA9IE1hdGgubWluKGZvbnRCQm94WzFdLCBmb250QkJveFszXSk7CisgICAgICAgIHByb3BlcnRpZXMuYXNjZW50U2NhbGVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdmFyIGNoYXJzZXQsIGVuY29kaW5nOworCisgICAgICBpZiAoY2ZmLmlzQ0lERm9udCkgeworICAgICAgICB2YXIgZmRBcnJheUluZGV4ID0gdGhpcy5wYXJzZUluZGV4KHRvcERpY3QuZ2V0QnlOYW1lKCJGREFycmF5IikpLm9iajsKKworICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmZEFycmF5SW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgdmFyIGRpY3RSYXcgPSBmZEFycmF5SW5kZXguZ2V0KGkpOworICAgICAgICAgIHZhciBmb250RGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZUb3BEaWN0LCB0aGlzLnBhcnNlRGljdChkaWN0UmF3KSwgY2ZmLnN0cmluZ3MpOworICAgICAgICAgIHRoaXMucGFyc2VQcml2YXRlRGljdChmb250RGljdCk7CisgICAgICAgICAgY2ZmLmZkQXJyYXkucHVzaChmb250RGljdCk7CisgICAgICAgIH0KKworICAgICAgICBlbmNvZGluZyA9IG51bGw7CisgICAgICAgIGNoYXJzZXQgPSB0aGlzLnBhcnNlQ2hhcnNldHModG9wRGljdC5nZXRCeU5hbWUoImNoYXJzZXQiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50LCBjZmYuc3RyaW5ncywgdHJ1ZSk7CisgICAgICAgIGNmZi5mZFNlbGVjdCA9IHRoaXMucGFyc2VGRFNlbGVjdCh0b3BEaWN0LmdldEJ5TmFtZSgiRkRTZWxlY3QiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXJzZXQgPSB0aGlzLnBhcnNlQ2hhcnNldHModG9wRGljdC5nZXRCeU5hbWUoImNoYXJzZXQiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50LCBjZmYuc3RyaW5ncywgZmFsc2UpOworICAgICAgICBlbmNvZGluZyA9IHRoaXMucGFyc2VFbmNvZGluZyh0b3BEaWN0LmdldEJ5TmFtZSgiRW5jb2RpbmciKSwgcHJvcGVydGllcywgY2ZmLnN0cmluZ3MsIGNoYXJzZXQuY2hhcnNldCk7CisgICAgICB9CisKKyAgICAgIGNmZi5jaGFyc2V0ID0gY2hhcnNldDsKKyAgICAgIGNmZi5lbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgdmFyIGNoYXJTdHJpbmdzQW5kU2VhY3MgPSB0aGlzLnBhcnNlQ2hhclN0cmluZ3MoeworICAgICAgICBjaGFyU3RyaW5nczogY2hhclN0cmluZ0luZGV4LAorICAgICAgICBsb2NhbFN1YnJJbmRleDogdG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4LAorICAgICAgICBnbG9iYWxTdWJySW5kZXg6IGdsb2JhbFN1YnJJbmRleC5vYmosCisgICAgICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsCisgICAgICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5LAorICAgICAgICBwcml2YXRlRGljdDogdG9wRGljdC5wcml2YXRlRGljdAorICAgICAgfSk7CisgICAgICBjZmYuY2hhclN0cmluZ3MgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLmNoYXJTdHJpbmdzOworICAgICAgY2ZmLnNlYWNzID0gY2hhclN0cmluZ3NBbmRTZWFjcy5zZWFjczsKKyAgICAgIGNmZi53aWR0aHMgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLndpZHRoczsKKyAgICAgIHJldHVybiBjZmY7CisgICAgfQorCisgICAgcGFyc2VIZWFkZXIoKSB7CisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzOworICAgICAgdmFyIGJ5dGVzTGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgICAgdmFyIG9mZnNldCA9IDA7CisKKyAgICAgIHdoaWxlIChvZmZzZXQgPCBieXRlc0xlbmd0aCAmJiBieXRlc1tvZmZzZXRdICE9PSAxKSB7CisgICAgICAgICsrb2Zmc2V0OworICAgICAgfQorCisgICAgICBpZiAob2Zmc2V0ID49IGJ5dGVzTGVuZ3RoKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBDRkYgaGVhZGVyIik7CisgICAgICB9CisKKyAgICAgIGlmIChvZmZzZXQgIT09IDApIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJjZmYgZGF0YSBpcyBzaGlmdGVkIik7CisgICAgICAgIGJ5dGVzID0gYnl0ZXMuc3ViYXJyYXkob2Zmc2V0KTsKKyAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOworICAgICAgfQorCisgICAgICB2YXIgbWFqb3IgPSBieXRlc1swXTsKKyAgICAgIHZhciBtaW5vciA9IGJ5dGVzWzFdOworICAgICAgdmFyIGhkclNpemUgPSBieXRlc1syXTsKKyAgICAgIHZhciBvZmZTaXplID0gYnl0ZXNbM107CisgICAgICB2YXIgaGVhZGVyID0gbmV3IENGRkhlYWRlcihtYWpvciwgbWlub3IsIGhkclNpemUsIG9mZlNpemUpOworICAgICAgcmV0dXJuIHsKKyAgICAgICAgb2JqOiBoZWFkZXIsCisgICAgICAgIGVuZFBvczogaGRyU2l6ZQorICAgICAgfTsKKyAgICB9CisKKyAgICBwYXJzZURpY3QoZGljdCkgeworICAgICAgdmFyIHBvcyA9IDA7CisKKyAgICAgIGZ1bmN0aW9uIHBhcnNlT3BlcmFuZCgpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gZGljdFtwb3MrK107CisKKyAgICAgICAgaWYgKHZhbHVlID09PSAzMCkgeworICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0T3BlcmFuZCgpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOCkgeworICAgICAgICAgIHZhbHVlID0gZGljdFtwb3MrK107CisgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgMjQgfCBkaWN0W3BvcysrXSA8PCAxNikgPj4gMTY7CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOSkgeworICAgICAgICAgIHZhbHVlID0gZGljdFtwb3MrK107CisgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA4IHwgZGljdFtwb3MrK107CisgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA4IHwgZGljdFtwb3MrK107CisgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA4IHwgZGljdFtwb3MrK107CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDMyICYmIHZhbHVlIDw9IDI0NikgeworICAgICAgICAgIHJldHVybiB2YWx1ZSAtIDEzOTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNDcgJiYgdmFsdWUgPD0gMjUwKSB7CisgICAgICAgICAgcmV0dXJuICh2YWx1ZSAtIDI0NykgKiAyNTYgKyBkaWN0W3BvcysrXSArIDEwODsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNTEgJiYgdmFsdWUgPD0gMjU0KSB7CisgICAgICAgICAgcmV0dXJuIC0oKHZhbHVlIC0gMjUxKSAqIDI1NikgLSBkaWN0W3BvcysrXSAtIDEwODsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC53YXJuKSgnQ0ZGUGFyc2VyX3BhcnNlRGljdDogIicgKyB2YWx1ZSArICciIGlzIGEgcmVzZXJ2ZWQgY29tbWFuZC4nKTsKKyAgICAgICAgcmV0dXJuIE5hTjsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcGFyc2VGbG9hdE9wZXJhbmQoKSB7CisgICAgICAgIHZhciBzdHIgPSAiIjsKKyAgICAgICAgdmFyIGVvZiA9IDE1OworICAgICAgICBjb25zdCBsb29rdXAgPSBbIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiLiIsICJFIiwgIkUtIiwgbnVsbCwgIi0iXTsKKyAgICAgICAgdmFyIGxlbmd0aCA9IGRpY3QubGVuZ3RoOworCisgICAgICAgIHdoaWxlIChwb3MgPCBsZW5ndGgpIHsKKyAgICAgICAgICB2YXIgYiA9IGRpY3RbcG9zKytdOworICAgICAgICAgIHZhciBiMSA9IGIgPj4gNDsKKyAgICAgICAgICB2YXIgYjIgPSBiICYgMTU7CisKKyAgICAgICAgICBpZiAoYjEgPT09IGVvZikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3RyICs9IGxvb2t1cFtiMV07CisKKyAgICAgICAgICBpZiAoYjIgPT09IGVvZikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3RyICs9IGxvb2t1cFtiMl07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHIpOworICAgICAgfQorCisgICAgICB2YXIgb3BlcmFuZHMgPSBbXTsKKyAgICAgIHZhciBlbnRyaWVzID0gW107CisgICAgICBwb3MgPSAwOworICAgICAgdmFyIGVuZCA9IGRpY3QubGVuZ3RoOworCisgICAgICB3aGlsZSAocG9zIDwgZW5kKSB7CisgICAgICAgIHZhciBiID0gZGljdFtwb3NdOworCisgICAgICAgIGlmIChiIDw9IDIxKSB7CisgICAgICAgICAgaWYgKGIgPT09IDEyKSB7CisgICAgICAgICAgICBiID0gYiA8PCA4IHwgZGljdFsrK3Bvc107CisgICAgICAgICAgfQorCisgICAgICAgICAgZW50cmllcy5wdXNoKFtiLCBvcGVyYW5kc10pOworICAgICAgICAgIG9wZXJhbmRzID0gW107CisgICAgICAgICAgKytwb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3BlcmFuZHMucHVzaChwYXJzZU9wZXJhbmQoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgfQorCisgICAgcGFyc2VJbmRleChwb3MpIHsKKyAgICAgIHZhciBjZmZJbmRleCA9IG5ldyBDRkZJbmRleCgpOworICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlczsKKyAgICAgIHZhciBjb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOworICAgICAgdmFyIG9mZnNldHMgPSBbXTsKKyAgICAgIHZhciBlbmQgPSBwb3M7CisgICAgICB2YXIgaSwgaWk7CisKKyAgICAgIGlmIChjb3VudCAhPT0gMCkgeworICAgICAgICB2YXIgb2Zmc2V0U2l6ZSA9IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgdmFyIHN0YXJ0UG9zID0gcG9zICsgKGNvdW50ICsgMSkgKiBvZmZzZXRTaXplIC0gMTsKKworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGNvdW50ICsgMTsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDsKKworICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2Zmc2V0U2l6ZTsgKytqKSB7CisgICAgICAgICAgICBvZmZzZXQgPDw9IDg7CisgICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNbcG9zKytdOworICAgICAgICAgIH0KKworICAgICAgICAgIG9mZnNldHMucHVzaChzdGFydFBvcyArIG9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBlbmQgPSBvZmZzZXRzW2NvdW50XTsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMCwgaWkgPSBvZmZzZXRzLmxlbmd0aCAtIDE7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHZhciBvZmZzZXRTdGFydCA9IG9mZnNldHNbaV07CisgICAgICAgIHZhciBvZmZzZXRFbmQgPSBvZmZzZXRzW2kgKyAxXTsKKyAgICAgICAgY2ZmSW5kZXguYWRkKGJ5dGVzLnN1YmFycmF5KG9mZnNldFN0YXJ0LCBvZmZzZXRFbmQpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgb2JqOiBjZmZJbmRleCwKKyAgICAgICAgZW5kUG9zOiBlbmQKKyAgICAgIH07CisgICAgfQorCisgICAgcGFyc2VOYW1lSW5kZXgoaW5kZXgpIHsKKyAgICAgIHZhciBuYW1lcyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbmRleC5jb3VudDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgdmFyIG5hbWUgPSBpbmRleC5nZXQoaSk7CisgICAgICAgIG5hbWVzLnB1c2goKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKG5hbWUpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5hbWVzOworICAgIH0KKworICAgIHBhcnNlU3RyaW5nSW5kZXgoaW5kZXgpIHsKKyAgICAgIHZhciBzdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHZhciBkYXRhID0gaW5kZXguZ2V0KGkpOworICAgICAgICBzdHJpbmdzLmFkZCgoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZGF0YSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gc3RyaW5nczsKKyAgICB9CisKKyAgICBjcmVhdGVEaWN0KFR5cGUsIGRpY3QsIHN0cmluZ3MpIHsKKyAgICAgIHZhciBjZmZEaWN0ID0gbmV3IFR5cGUoc3RyaW5ncyk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3QubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICB2YXIgcGFpciA9IGRpY3RbaV07CisgICAgICAgIHZhciBrZXkgPSBwYWlyWzBdOworICAgICAgICB2YXIgdmFsdWUgPSBwYWlyWzFdOworICAgICAgICBjZmZEaWN0LnNldEJ5S2V5KGtleSwgdmFsdWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2ZmRGljdDsKKyAgICB9CisKKyAgICBwYXJzZUNoYXJTdHJpbmcoc3RhdGUsIGRhdGEsIGxvY2FsU3VickluZGV4LCBnbG9iYWxTdWJySW5kZXgpIHsKKyAgICAgIGlmICghZGF0YSB8fCBzdGF0ZS5jYWxsRGVwdGggPiBNQVhfU1VCUl9ORVNUSU5HKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgdmFyIHN0YWNrU2l6ZSA9IHN0YXRlLnN0YWNrU2l6ZTsKKyAgICAgIHZhciBzdGFjayA9IHN0YXRlLnN0YWNrOworICAgICAgdmFyIGxlbmd0aCA9IGRhdGEubGVuZ3RoOworCisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbmd0aDspIHsKKyAgICAgICAgdmFyIHZhbHVlID0gZGF0YVtqKytdOworICAgICAgICB2YXIgdmFsaWRhdGlvbkNvbW1hbmQgPSBudWxsOworCisgICAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHsKKyAgICAgICAgICB2YXIgcSA9IGRhdGFbaisrXTsKKworICAgICAgICAgIGlmIChxID09PSAwKSB7CisgICAgICAgICAgICBkYXRhW2ogLSAyXSA9IDEzOTsKKyAgICAgICAgICAgIGRhdGFbaiAtIDFdID0gMjI7CisgICAgICAgICAgICBzdGFja1NpemUgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YTEyW3FdOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMjgpIHsKKyAgICAgICAgICBzdGFja1tzdGFja1NpemVdID0gKGRhdGFbal0gPDwgMjQgfCBkYXRhW2ogKyAxXSA8PCAxNikgPj4gMTY7CisgICAgICAgICAgaiArPSAyOworICAgICAgICAgIHN0YWNrU2l6ZSsrOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxNCkgeworICAgICAgICAgIGlmIChzdGFja1NpemUgPj0gNCkgeworICAgICAgICAgICAgc3RhY2tTaXplIC09IDQ7CisKKyAgICAgICAgICAgIGlmICh0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgc3RhdGUuc2VhYyA9IHN0YWNrLnNsaWNlKHN0YWNrU2l6ZSwgc3RhY2tTaXplICsgNCk7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CisgICAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9IHZhbHVlIC0gMTM5OworICAgICAgICAgIHN0YWNrU2l6ZSsrOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTQpIHsKKyAgICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgPCAyNTEgPyAodmFsdWUgLSAyNDcgPDwgOCkgKyBkYXRhW2pdICsgMTA4IDogLSh2YWx1ZSAtIDI1MSA8PCA4KSAtIGRhdGFbal0gLSAxMDg7CisgICAgICAgICAgaisrOworICAgICAgICAgIHN0YWNrU2l6ZSsrOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyNTUpIHsKKyAgICAgICAgICBzdGFja1tzdGFja1NpemVdID0gKGRhdGFbal0gPDwgMjQgfCBkYXRhW2ogKyAxXSA8PCAxNiB8IGRhdGFbaiArIDJdIDw8IDggfCBkYXRhW2ogKyAzXSkgLyA2NTUzNjsKKyAgICAgICAgICBqICs9IDQ7CisgICAgICAgICAgc3RhY2tTaXplKys7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDE5IHx8IHZhbHVlID09PSAyMCkgeworICAgICAgICAgIHN0YXRlLmhpbnRzICs9IHN0YWNrU2l6ZSA+PiAxOworICAgICAgICAgIGogKz0gc3RhdGUuaGludHMgKyA3ID4+IDM7CisgICAgICAgICAgc3RhY2tTaXplICU9IDI7CisgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMCB8fCB2YWx1ZSA9PT0gMjkpIHsKKyAgICAgICAgICB2YXIgc3VicnNJbmRleDsKKworICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMTApIHsKKyAgICAgICAgICAgIHN1YnJzSW5kZXggPSBsb2NhbFN1YnJJbmRleDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VicnNJbmRleCA9IGdsb2JhbFN1YnJJbmRleDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXN1YnJzSW5kZXgpIHsKKyAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTWlzc2luZyBzdWJyc0luZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBiaWFzID0gMzI3Njg7CisKKyAgICAgICAgICBpZiAoc3VicnNJbmRleC5jb3VudCA8IDEyNDApIHsKKyAgICAgICAgICAgIGJpYXMgPSAxMDc7CisgICAgICAgICAgfSBlbHNlIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMzM5MDApIHsKKyAgICAgICAgICAgIGJpYXMgPSAxMTMxOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBzdWJyTnVtYmVyID0gc3RhY2tbLS1zdGFja1NpemVdICsgYmlhczsKKworICAgICAgICAgIGlmIChzdWJyTnVtYmVyIDwgMCB8fCBzdWJyTnVtYmVyID49IHN1YnJzSW5kZXguY291bnQgfHwgaXNOYU4oc3Vick51bWJlcikpIHsKKyAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiT3V0IG9mIGJvdW5kcyBzdWJySW5kZXggZm9yICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5pZCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplOworICAgICAgICAgIHN0YXRlLmNhbGxEZXB0aCsrOworICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMucGFyc2VDaGFyU3RyaW5nKHN0YXRlLCBzdWJyc0luZGV4LmdldChzdWJyTnVtYmVyKSwgbG9jYWxTdWJySW5kZXgsIGdsb2JhbFN1YnJJbmRleCk7CisKKyAgICAgICAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3RhdGUuY2FsbERlcHRoLS07CisgICAgICAgICAgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMSkgeworICAgICAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQpIHsKKyAgICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkgeworICAgICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMyB8fCB2YWx1ZSA9PT0gMjMpIHsKKyAgICAgICAgICAgICAgc3RhdGUuaGFzVlN0ZW1zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaGFzVlN0ZW1zICYmICh2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gMTgpKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQ0ZGIHN0ZW0gaGludHMgYXJlIGluIHdyb25nIG9yZGVyIik7CisgICAgICAgICAgICAgIGRhdGFbaiAtIDFdID0gdmFsdWUgPT09IDEgPyAzIDogMjM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCJtaW4iIGluIHZhbGlkYXRpb25Db21tYW5kKSB7CisgICAgICAgICAgICBpZiAoIXN0YXRlLnVuZGVmU3RhY2sgJiYgc3RhY2tTaXplIDwgdmFsaWRhdGlvbkNvbW1hbmQubWluKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTm90IGVub3VnaCBwYXJhbWV0ZXJzIGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQgKyAiOyBhY3R1YWw6ICIgKyBzdGFja1NpemUgKyAiLCBleHBlY3RlZDogIiArIHZhbGlkYXRpb25Db21tYW5kLm1pbik7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc3RhdGUuZmlyc3RTdGFja0NsZWFyaW5nICYmIHZhbGlkYXRpb25Db21tYW5kLnN0YWNrQ2xlYXJpbmcpIHsKKyAgICAgICAgICAgIHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyA9IGZhbHNlOworICAgICAgICAgICAgc3RhY2tTaXplIC09IHZhbGlkYXRpb25Db21tYW5kLm1pbjsKKworICAgICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+PSAyICYmIHZhbGlkYXRpb25Db21tYW5kLnN0ZW0pIHsKKyAgICAgICAgICAgICAgc3RhY2tTaXplICU9IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrU2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJGb3VuZCB0b28gbWFueSBwYXJhbWV0ZXJzIGZvciBzdGFjay1jbGVhcmluZyBjb21tYW5kIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGFja1NpemUgPiAwICYmIHN0YWNrW3N0YWNrU2l6ZSAtIDFdID49IDApIHsKKyAgICAgICAgICAgICAgc3RhdGUud2lkdGggPSBzdGFja1tzdGFja1NpemUgLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoInN0YWNrRGVsdGEiIGluIHZhbGlkYXRpb25Db21tYW5kKSB7CisgICAgICAgICAgICBpZiAoInN0YWNrRm4iIGluIHZhbGlkYXRpb25Db21tYW5kKSB7CisgICAgICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kLnN0YWNrRm4oc3RhY2ssIHN0YWNrU2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YWNrU2l6ZSArPSB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0RlbHRhOworICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgeworICAgICAgICAgICAgc3RhY2tTaXplID0gMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnJlc2V0U3RhY2spIHsKKyAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CisgICAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC51bmRlZlN0YWNrKSB7CisgICAgICAgICAgICBzdGFja1NpemUgPSAwOworICAgICAgICAgICAgc3RhdGUudW5kZWZTdGFjayA9IHRydWU7CisgICAgICAgICAgICBzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcGFyc2VDaGFyU3RyaW5ncyh7CisgICAgICBjaGFyU3RyaW5ncywKKyAgICAgIGxvY2FsU3VickluZGV4LAorICAgICAgZ2xvYmFsU3VickluZGV4LAorICAgICAgZmRTZWxlY3QsCisgICAgICBmZEFycmF5LAorICAgICAgcHJpdmF0ZURpY3QKKyAgICB9KSB7CisgICAgICB2YXIgc2VhY3MgPSBbXTsKKyAgICAgIHZhciB3aWR0aHMgPSBbXTsKKyAgICAgIHZhciBjb3VudCA9IGNoYXJTdHJpbmdzLmNvdW50OworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdmFyIGNoYXJzdHJpbmcgPSBjaGFyU3RyaW5ncy5nZXQoaSk7CisgICAgICAgIHZhciBzdGF0ZSA9IHsKKyAgICAgICAgICBjYWxsRGVwdGg6IDAsCisgICAgICAgICAgc3RhY2tTaXplOiAwLAorICAgICAgICAgIHN0YWNrOiBbXSwKKyAgICAgICAgICB1bmRlZlN0YWNrOiB0cnVlLAorICAgICAgICAgIGhpbnRzOiAwLAorICAgICAgICAgIGZpcnN0U3RhY2tDbGVhcmluZzogdHJ1ZSwKKyAgICAgICAgICBzZWFjOiBudWxsLAorICAgICAgICAgIHdpZHRoOiBudWxsLAorICAgICAgICAgIGhhc1ZTdGVtczogZmFsc2UKKyAgICAgICAgfTsKKyAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgdmFyIGxvY2FsU3ViclRvVXNlID0gbnVsbDsKKyAgICAgICAgdmFyIHByaXZhdGVEaWN0VG9Vc2UgPSBwcml2YXRlRGljdDsKKworICAgICAgICBpZiAoZmRTZWxlY3QgJiYgZmRBcnJheS5sZW5ndGgpIHsKKyAgICAgICAgICB2YXIgZmRJbmRleCA9IGZkU2VsZWN0LmdldEZESW5kZXgoaSk7CisKKyAgICAgICAgICBpZiAoZmRJbmRleCA9PT0gLTEpIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiR2x5cGggaW5kZXggaXMgbm90IGluIGZkIHNlbGVjdC4iKTsKKyAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGZkSW5kZXggPj0gZmRBcnJheS5sZW5ndGgpIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIik7CisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh2YWxpZCkgeworICAgICAgICAgICAgcHJpdmF0ZURpY3RUb1VzZSA9IGZkQXJyYXlbZmRJbmRleF0ucHJpdmF0ZURpY3Q7CisgICAgICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IHByaXZhdGVEaWN0VG9Vc2Uuc3VicnNJbmRleDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxTdWJySW5kZXgpIHsKKyAgICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IGxvY2FsU3VickluZGV4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbGlkKSB7CisgICAgICAgICAgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgY2hhcnN0cmluZywgbG9jYWxTdWJyVG9Vc2UsIGdsb2JhbFN1YnJJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGUud2lkdGggIT09IG51bGwpIHsKKyAgICAgICAgICBjb25zdCBub21pbmFsV2lkdGggPSBwcml2YXRlRGljdFRvVXNlLmdldEJ5TmFtZSgibm9taW5hbFdpZHRoWCIpOworICAgICAgICAgIHdpZHRoc1tpXSA9IG5vbWluYWxXaWR0aCArIHN0YXRlLndpZHRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IHByaXZhdGVEaWN0VG9Vc2UuZ2V0QnlOYW1lKCJkZWZhdWx0V2lkdGhYIik7CisgICAgICAgICAgd2lkdGhzW2ldID0gZGVmYXVsdFdpZHRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRlLnNlYWMgIT09IG51bGwpIHsKKyAgICAgICAgICBzZWFjc1tpXSA9IHN0YXRlLnNlYWM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgICAgY2hhclN0cmluZ3Muc2V0KGksIG5ldyBVaW50OEFycmF5KFsxNF0pKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4geworICAgICAgICBjaGFyU3RyaW5ncywKKyAgICAgICAgc2VhY3MsCisgICAgICAgIHdpZHRocworICAgICAgfTsKKyAgICB9CisKKyAgICBlbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpIHsKKyAgICAgIHZhciBwcml2YXRlRGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZQcml2YXRlRGljdCwgW10sIHBhcmVudERpY3Quc3RyaW5ncyk7CisgICAgICBwYXJlbnREaWN0LnNldEJ5S2V5KDE4LCBbMCwgMF0pOworICAgICAgcGFyZW50RGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OworICAgIH0KKworICAgIHBhcnNlUHJpdmF0ZURpY3QocGFyZW50RGljdCkgeworICAgICAgaWYgKCFwYXJlbnREaWN0Lmhhc05hbWUoIlByaXZhdGUiKSkgeworICAgICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHByaXZhdGVPZmZzZXQgPSBwYXJlbnREaWN0LmdldEJ5TmFtZSgiUHJpdmF0ZSIpOworCisgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJpdmF0ZU9mZnNldCkgfHwgcHJpdmF0ZU9mZnNldC5sZW5ndGggIT09IDIpIHsKKyAgICAgICAgcGFyZW50RGljdC5yZW1vdmVCeU5hbWUoIlByaXZhdGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgc2l6ZSA9IHByaXZhdGVPZmZzZXRbMF07CisgICAgICB2YXIgb2Zmc2V0ID0gcHJpdmF0ZU9mZnNldFsxXTsKKworICAgICAgaWYgKHNpemUgPT09IDAgfHwgb2Zmc2V0ID49IHRoaXMuYnl0ZXMubGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcHJpdmF0ZURpY3RFbmQgPSBvZmZzZXQgKyBzaXplOworICAgICAgdmFyIGRpY3REYXRhID0gdGhpcy5ieXRlcy5zdWJhcnJheShvZmZzZXQsIHByaXZhdGVEaWN0RW5kKTsKKyAgICAgIHZhciBkaWN0ID0gdGhpcy5wYXJzZURpY3QoZGljdERhdGEpOworICAgICAgdmFyIHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LCBkaWN0LCBwYXJlbnREaWN0LnN0cmluZ3MpOworICAgICAgcGFyZW50RGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OworCisgICAgICBpZiAoIXByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBzdWJyc09mZnNldCA9IHByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKTsKKyAgICAgIHZhciByZWxhdGl2ZU9mZnNldCA9IG9mZnNldCArIHN1YnJzT2Zmc2V0OworCisgICAgICBpZiAoc3VicnNPZmZzZXQgPT09IDAgfHwgcmVsYXRpdmVPZmZzZXQgPj0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKKyAgICAgICAgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBzdWJyc0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KHJlbGF0aXZlT2Zmc2V0KTsKKyAgICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJyc0luZGV4Lm9iajsKKyAgICB9CisKKyAgICBwYXJzZUNoYXJzZXRzKHBvcywgbGVuZ3RoLCBzdHJpbmdzLCBjaWQpIHsKKyAgICAgIGlmIChwb3MgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KHRydWUsIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuSVNPX0FET0JFLCBfY2hhcnNldHMuSVNPQWRvYmVDaGFyc2V0KTsKKyAgICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7CisgICAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLkVYUEVSVCwgX2NoYXJzZXRzLkV4cGVydENoYXJzZXQpOworICAgICAgfSBlbHNlIGlmIChwb3MgPT09IDIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KHRydWUsIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJUX1NVQlNFVCwgX2NoYXJzZXRzLkV4cGVydFN1YnNldENoYXJzZXQpOworICAgICAgfQorCisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzOworICAgICAgdmFyIHN0YXJ0ID0gcG9zOworICAgICAgdmFyIGZvcm1hdCA9IGJ5dGVzW3BvcysrXTsKKyAgICAgIGNvbnN0IGNoYXJzZXQgPSBbY2lkID8gMCA6ICIubm90ZGVmIl07CisgICAgICB2YXIgaWQsIGNvdW50LCBpOworICAgICAgbGVuZ3RoIC09IDE7CisKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CisgICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQgOiBzdHJpbmdzLmdldChpZCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICB3aGlsZSAoY2hhcnNldC5sZW5ndGggPD0gbGVuZ3RoKSB7CisgICAgICAgICAgICBpZCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgY291bnQgPSBieXRlc1twb3MrK107CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgeworICAgICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgd2hpbGUgKGNoYXJzZXQubGVuZ3RoIDw9IGxlbmd0aCkgeworICAgICAgICAgICAgaWQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgIGNvdW50ID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgeworICAgICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBjaGFyc2V0IGZvcm1hdCIpOworICAgICAgfQorCisgICAgICB2YXIgZW5kID0gcG9zOworICAgICAgdmFyIHJhdyA9IGJ5dGVzLnN1YmFycmF5KHN0YXJ0LCBlbmQpOworICAgICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KGZhbHNlLCBmb3JtYXQsIGNoYXJzZXQsIHJhdyk7CisgICAgfQorCisgICAgcGFyc2VFbmNvZGluZyhwb3MsIHByb3BlcnRpZXMsIHN0cmluZ3MsIGNoYXJzZXQpIHsKKyAgICAgIHZhciBlbmNvZGluZyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzOworICAgICAgdmFyIHByZWRlZmluZWQgPSBmYWxzZTsKKyAgICAgIHZhciBmb3JtYXQsIGksIGlpOworICAgICAgdmFyIHJhdyA9IG51bGw7CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRTdXBwbGVtZW50KCkgeworICAgICAgICB2YXIgc3VwcGxlbWVudHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VwcGxlbWVudHNDb3VudDsgaSsrKSB7CisgICAgICAgICAgdmFyIGNvZGUgPSBieXRlc1twb3MrK107CisgICAgICAgICAgdmFyIHNpZCA9IChieXRlc1twb3MrK10gPDwgOCkgKyAoYnl0ZXNbcG9zKytdICYgMHhmZik7CisgICAgICAgICAgZW5jb2RpbmdbY29kZV0gPSBjaGFyc2V0LmluZGV4T2Yoc3RyaW5ncy5nZXQoc2lkKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHBvcyA9PT0gMCB8fCBwb3MgPT09IDEpIHsKKyAgICAgICAgcHJlZGVmaW5lZCA9IHRydWU7CisgICAgICAgIGZvcm1hdCA9IHBvczsKKyAgICAgICAgdmFyIGJhc2VFbmNvZGluZyA9IHBvcyA/IF9lbmNvZGluZ3MuRXhwZXJ0RW5jb2RpbmcgOiBfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2Rpbmc7CisKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSBjaGFyc2V0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICB2YXIgaW5kZXggPSBiYXNlRW5jb2RpbmcuaW5kZXhPZihjaGFyc2V0W2ldKTsKKworICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKKyAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgZGF0YVN0YXJ0ID0gcG9zOworICAgICAgICBmb3JtYXQgPSBieXRlc1twb3MrK107CisKKyAgICAgICAgc3dpdGNoIChmb3JtYXQgJiAweDdmKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgdmFyIGdseXBoc0NvdW50ID0gYnl0ZXNbcG9zKytdOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IGdseXBoc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgZW5jb2RpbmdbYnl0ZXNbcG9zKytdXSA9IGk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdmFyIHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdOworICAgICAgICAgICAgdmFyIGdpZCA9IDE7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIHZhciBzdGFydCA9IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgICAgdmFyIGxlZnQgPSBieXRlc1twb3MrK107CisKKyAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0OyBqIDw9IHN0YXJ0ICsgbGVmdDsgaisrKSB7CisgICAgICAgICAgICAgICAgZW5jb2Rpbmdbal0gPSBnaWQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVua25vd24gZW5jb2RpbmcgZm9ybWF0OiAke2Zvcm1hdH0gaW4gQ0ZGYCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YUVuZCA9IHBvczsKKworICAgICAgICBpZiAoZm9ybWF0ICYgMHg4MCkgeworICAgICAgICAgIGJ5dGVzW2RhdGFTdGFydF0gJj0gMHg3ZjsKKyAgICAgICAgICByZWFkU3VwcGxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcmF3ID0gYnl0ZXMuc3ViYXJyYXkoZGF0YVN0YXJ0LCBkYXRhRW5kKTsKKyAgICAgIH0KKworICAgICAgZm9ybWF0ID0gZm9ybWF0ICYgMHg3ZjsKKyAgICAgIHJldHVybiBuZXcgQ0ZGRW5jb2RpbmcocHJlZGVmaW5lZCwgZm9ybWF0LCBlbmNvZGluZywgcmF3KTsKKyAgICB9CisKKyAgICBwYXJzZUZEU2VsZWN0KHBvcywgbGVuZ3RoKSB7CisgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzOworICAgICAgdmFyIGZvcm1hdCA9IGJ5dGVzW3BvcysrXTsKKyAgICAgIHZhciBmZFNlbGVjdCA9IFtdOworICAgICAgdmFyIGk7CisKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHZhciBpZCA9IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goaWQpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICB2YXIgcmFuZ2VzQ291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXNDb3VudDsgKytpKSB7CisgICAgICAgICAgICB2YXIgZmlyc3QgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKKworICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgZmlyc3QgIT09IDApIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZUZEU2VsZWN0OiBUaGUgZmlyc3QgcmFuZ2UgbXVzdCBoYXZlIGEgZmlyc3QgR0lEIG9mIDAiICsgIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4iKTsKKyAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmRJbmRleCA9IGJ5dGVzW3BvcysrXTsKKyAgICAgICAgICAgIHZhciBuZXh0ID0gYnl0ZXNbcG9zXSA8PCA4IHwgYnl0ZXNbcG9zICsgMV07CisKKyAgICAgICAgICAgIGZvciAodmFyIGogPSBmaXJzdDsgaiA8IG5leHQ7ICsraikgeworICAgICAgICAgICAgICBmZFNlbGVjdC5wdXNoKGZkSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBwYXJzZUZEU2VsZWN0OiBVbmtub3duIGZvcm1hdCAiJHtmb3JtYXR9Ii5gKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZkU2VsZWN0Lmxlbmd0aCAhPT0gbGVuZ3RoKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigicGFyc2VGRFNlbGVjdDogSW52YWxpZCBmb250IGRhdGEuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgQ0ZGRkRTZWxlY3QoZm9ybWF0LCBmZFNlbGVjdCk7CisgICAgfQorCisgIH0KKworICByZXR1cm4gQ0ZGUGFyc2VyOworfSgpOworCitleHBvcnRzLkNGRlBhcnNlciA9IENGRlBhcnNlcjsKKworY2xhc3MgQ0ZGIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5oZWFkZXIgPSBudWxsOworICAgIHRoaXMubmFtZXMgPSBbXTsKKyAgICB0aGlzLnRvcERpY3QgPSBudWxsOworICAgIHRoaXMuc3RyaW5ncyA9IG5ldyBDRkZTdHJpbmdzKCk7CisgICAgdGhpcy5nbG9iYWxTdWJySW5kZXggPSBudWxsOworICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOworICAgIHRoaXMuY2hhcnNldCA9IG51bGw7CisgICAgdGhpcy5jaGFyU3RyaW5ncyA9IG51bGw7CisgICAgdGhpcy5mZEFycmF5ID0gW107CisgICAgdGhpcy5mZFNlbGVjdCA9IG51bGw7CisgICAgdGhpcy5pc0NJREZvbnQgPSBmYWxzZTsKKyAgfQorCisgIGR1cGxpY2F0ZUZpcnN0R2x5cGgoKSB7CisgICAgaWYgKHRoaXMuY2hhclN0cmluZ3MuY291bnQgPj0gNjU1MzUpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiTm90IGVub3VnaCBzcGFjZSBpbiBjaGFyc3RyaW5ncyB0byBkdXBsaWNhdGUgZmlyc3QgZ2x5cGguIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGdseXBoWmVybyA9IHRoaXMuY2hhclN0cmluZ3MuZ2V0KDApOworICAgIHRoaXMuY2hhclN0cmluZ3MuYWRkKGdseXBoWmVybyk7CisKKyAgICBpZiAodGhpcy5pc0NJREZvbnQpIHsKKyAgICAgIHRoaXMuZmRTZWxlY3QuZmRTZWxlY3QucHVzaCh0aGlzLmZkU2VsZWN0LmZkU2VsZWN0WzBdKTsKKyAgICB9CisgIH0KKworICBoYXNHbHlwaElkKGlkKSB7CisgICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLmNoYXJTdHJpbmdzLmNvdW50KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmFyIGdseXBoID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoaWQpOworICAgIHJldHVybiBnbHlwaC5sZW5ndGggPiAwOworICB9CisKK30KKworZXhwb3J0cy5DRkYgPSBDRkY7CisKK2NsYXNzIENGRkhlYWRlciB7CisgIGNvbnN0cnVjdG9yKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSkgeworICAgIHRoaXMubWFqb3IgPSBtYWpvcjsKKyAgICB0aGlzLm1pbm9yID0gbWlub3I7CisgICAgdGhpcy5oZHJTaXplID0gaGRyU2l6ZTsKKyAgICB0aGlzLm9mZlNpemUgPSBvZmZTaXplOworICB9CisKK30KKworZXhwb3J0cy5DRkZIZWFkZXIgPSBDRkZIZWFkZXI7CisKK2NsYXNzIENGRlN0cmluZ3MgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLnN0cmluZ3MgPSBbXTsKKyAgfQorCisgIGdldChpbmRleCkgeworICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDw9IE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyAtIDEpIHsKKyAgICAgIHJldHVybiBDRkZTdGFuZGFyZFN0cmluZ3NbaW5kZXhdOworICAgIH0KKworICAgIGlmIChpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA8PSB0aGlzLnN0cmluZ3MubGVuZ3RoKSB7CisgICAgICByZXR1cm4gdGhpcy5zdHJpbmdzW2luZGV4IC0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTXTsKKyAgICB9CisKKyAgICByZXR1cm4gQ0ZGU3RhbmRhcmRTdHJpbmdzWzBdOworICB9CisKKyAgZ2V0U0lEKHN0cikgeworICAgIGxldCBpbmRleCA9IENGRlN0YW5kYXJkU3RyaW5ncy5pbmRleE9mKHN0cik7CisKKyAgICBpZiAoaW5kZXggIT09IC0xKSB7CisgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgaW5kZXggPSB0aGlzLnN0cmluZ3MuaW5kZXhPZihzdHIpOworCisgICAgaWYgKGluZGV4ICE9PSAtMSkgeworICAgICAgcmV0dXJuIGluZGV4ICsgTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTOworICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGFkZCh2YWx1ZSkgeworICAgIHRoaXMuc3RyaW5ncy5wdXNoKHZhbHVlKTsKKyAgfQorCisgIGdldCBjb3VudCgpIHsKKyAgICByZXR1cm4gdGhpcy5zdHJpbmdzLmxlbmd0aDsKKyAgfQorCit9CisKK2V4cG9ydHMuQ0ZGU3RyaW5ncyA9IENGRlN0cmluZ3M7CisKK2NsYXNzIENGRkluZGV4IHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5vYmplY3RzID0gW107CisgICAgdGhpcy5sZW5ndGggPSAwOworICB9CisKKyAgYWRkKGRhdGEpIHsKKyAgICB0aGlzLmxlbmd0aCArPSBkYXRhLmxlbmd0aDsKKyAgICB0aGlzLm9iamVjdHMucHVzaChkYXRhKTsKKyAgfQorCisgIHNldChpbmRleCwgZGF0YSkgeworICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoIC0gdGhpcy5vYmplY3RzW2luZGV4XS5sZW5ndGg7CisgICAgdGhpcy5vYmplY3RzW2luZGV4XSA9IGRhdGE7CisgIH0KKworICBnZXQoaW5kZXgpIHsKKyAgICByZXR1cm4gdGhpcy5vYmplY3RzW2luZGV4XTsKKyAgfQorCisgIGdldCBjb3VudCgpIHsKKyAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDsKKyAgfQorCit9CisKK2V4cG9ydHMuQ0ZGSW5kZXggPSBDRkZJbmRleDsKKworY2xhc3MgQ0ZGRGljdCB7CisgIGNvbnN0cnVjdG9yKHRhYmxlcywgc3RyaW5ncykgeworICAgIHRoaXMua2V5VG9OYW1lTWFwID0gdGFibGVzLmtleVRvTmFtZU1hcDsKKyAgICB0aGlzLm5hbWVUb0tleU1hcCA9IHRhYmxlcy5uYW1lVG9LZXlNYXA7CisgICAgdGhpcy5kZWZhdWx0cyA9IHRhYmxlcy5kZWZhdWx0czsKKyAgICB0aGlzLnR5cGVzID0gdGFibGVzLnR5cGVzOworICAgIHRoaXMub3Bjb2RlcyA9IHRhYmxlcy5vcGNvZGVzOworICAgIHRoaXMub3JkZXIgPSB0YWJsZXMub3JkZXI7CisgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5nczsKKyAgICB0aGlzLnZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBzZXRCeUtleShrZXksIHZhbHVlKSB7CisgICAgaWYgKCEoa2V5IGluIHRoaXMua2V5VG9OYW1lTWFwKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZhciB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aDsKKworICAgIGlmICh2YWx1ZUxlbmd0aCA9PT0gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZUxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoaXNOYU4odmFsdWVbaV0pKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgnSW52YWxpZCBDRkZEaWN0IHZhbHVlOiAiJyArIHZhbHVlICsgJyIgZm9yIGtleSAiJyArIGtleSArICciLicpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgdHlwZSA9IHRoaXMudHlwZXNba2V5XTsKKworICAgIGlmICh0eXBlID09PSAibnVtIiB8fCB0eXBlID09PSAic2lkIiB8fCB0eXBlID09PSAib2Zmc2V0IikgeworICAgICAgdmFsdWUgPSB2YWx1ZVswXTsKKyAgICB9CisKKyAgICB0aGlzLnZhbHVlc1trZXldID0gdmFsdWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzZXRCeU5hbWUobmFtZSwgdmFsdWUpIHsKKyAgICBpZiAoIShuYW1lIGluIHRoaXMubmFtZVRvS2V5TWFwKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiJHtuYW1lfSJgKTsKKyAgICB9CisKKyAgICB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtuYW1lXV0gPSB2YWx1ZTsKKyAgfQorCisgIGhhc05hbWUobmFtZSkgeworICAgIHJldHVybiB0aGlzLm5hbWVUb0tleU1hcFtuYW1lXSBpbiB0aGlzLnZhbHVlczsKKyAgfQorCisgIGdldEJ5TmFtZShuYW1lKSB7CisgICAgaWYgKCEobmFtZSBpbiB0aGlzLm5hbWVUb0tleU1hcCkpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgJHtuYW1lfSJgKTsKKyAgICB9CisKKyAgICB2YXIga2V5ID0gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV07CisKKyAgICBpZiAoIShrZXkgaW4gdGhpcy52YWx1ZXMpKSB7CisgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0c1trZXldOworICAgIH0KKworICAgIHJldHVybiB0aGlzLnZhbHVlc1trZXldOworICB9CisKKyAgcmVtb3ZlQnlOYW1lKG5hbWUpIHsKKyAgICBkZWxldGUgdGhpcy52YWx1ZXNbdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV1dOworICB9CisKKyAgc3RhdGljIGNyZWF0ZVRhYmxlcyhsYXlvdXQpIHsKKyAgICB2YXIgdGFibGVzID0geworICAgICAga2V5VG9OYW1lTWFwOiB7fSwKKyAgICAgIG5hbWVUb0tleU1hcDoge30sCisgICAgICBkZWZhdWx0czoge30sCisgICAgICB0eXBlczoge30sCisgICAgICBvcGNvZGVzOiB7fSwKKyAgICAgIG9yZGVyOiBbXQorICAgIH07CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBsYXlvdXQubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgdmFyIGVudHJ5ID0gbGF5b3V0W2ldOworICAgICAgdmFyIGtleSA9IEFycmF5LmlzQXJyYXkoZW50cnlbMF0pID8gKGVudHJ5WzBdWzBdIDw8IDgpICsgZW50cnlbMF1bMV0gOiBlbnRyeVswXTsKKyAgICAgIHRhYmxlcy5rZXlUb05hbWVNYXBba2V5XSA9IGVudHJ5WzFdOworICAgICAgdGFibGVzLm5hbWVUb0tleU1hcFtlbnRyeVsxXV0gPSBrZXk7CisgICAgICB0YWJsZXMudHlwZXNba2V5XSA9IGVudHJ5WzJdOworICAgICAgdGFibGVzLmRlZmF1bHRzW2tleV0gPSBlbnRyeVszXTsKKyAgICAgIHRhYmxlcy5vcGNvZGVzW2tleV0gPSBBcnJheS5pc0FycmF5KGVudHJ5WzBdKSA/IGVudHJ5WzBdIDogW2VudHJ5WzBdXTsKKyAgICAgIHRhYmxlcy5vcmRlci5wdXNoKGtleSk7CisgICAgfQorCisgICAgcmV0dXJuIHRhYmxlczsKKyAgfQorCit9CisKK3ZhciBDRkZUb3BEaWN0ID0gZnVuY3Rpb24gQ0ZGVG9wRGljdENsb3N1cmUoKSB7CisgIHZhciBsYXlvdXQgPSBbW1sxMiwgMzBdLCAiUk9TIiwgWyJzaWQiLCAic2lkIiwgIm51bSJdLCBudWxsXSwgW1sxMiwgMjBdLCAiU3ludGhldGljQmFzZSIsICJudW0iLCBudWxsXSwgWzAsICJ2ZXJzaW9uIiwgInNpZCIsIG51bGxdLCBbMSwgIk5vdGljZSIsICJzaWQiLCBudWxsXSwgW1sxMiwgMF0sICJDb3B5cmlnaHQiLCAic2lkIiwgbnVsbF0sIFsyLCAiRnVsbE5hbWUiLCAic2lkIiwgbnVsbF0sIFszLCAiRmFtaWx5TmFtZSIsICJzaWQiLCBudWxsXSwgWzQsICJXZWlnaHQiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDFdLCAiaXNGaXhlZFBpdGNoIiwgIm51bSIsIDBdLCBbWzEyLCAyXSwgIkl0YWxpY0FuZ2xlIiwgIm51bSIsIDBdLCBbWzEyLCAzXSwgIlVuZGVybGluZVBvc2l0aW9uIiwgIm51bSIsIC0xMDBdLCBbWzEyLCA0XSwgIlVuZGVybGluZVRoaWNrbmVzcyIsICJudW0iLCA1MF0sIFtbMTIsIDVdLCAiUGFpbnRUeXBlIiwgIm51bSIsIDBdLCBbWzEyLCA2XSwgIkNoYXJzdHJpbmdUeXBlIiwgIm51bSIsIDJdLCBbWzEyLCA3XSwgIkZvbnRNYXRyaXgiLCBbIm51bSIsICJudW0iLCAibnVtIiwgIm51bSIsICJudW0iLCAibnVtIl0sIFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdXSwgWzEzLCAiVW5pcXVlSUQiLCAibnVtIiwgbnVsbF0sIFs1LCAiRm9udEJCb3giLCBbIm51bSIsICJudW0iLCAibnVtIiwgIm51bSJdLCBbMCwgMCwgMCwgMF1dLCBbWzEyLCA4XSwgIlN0cm9rZVdpZHRoIiwgIm51bSIsIDBdLCBbMTQsICJYVUlEIiwgImFycmF5IiwgbnVsbF0sIFsxNSwgImNoYXJzZXQiLCAib2Zmc2V0IiwgMF0sIFsxNiwgIkVuY29kaW5nIiwgIm9mZnNldCIsIDBdLCBbMTcsICJDaGFyU3RyaW5ncyIsICJvZmZzZXQiLCAwXSwgWzE4LCAiUHJpdmF0ZSIsIFsib2Zmc2V0IiwgIm9mZnNldCJdLCBudWxsXSwgW1sxMiwgMjFdLCAiUG9zdFNjcmlwdCIsICJzaWQiLCBudWxsXSwgW1sxMiwgMjJdLCAiQmFzZUZvbnROYW1lIiwgInNpZCIsIG51bGxdLCBbWzEyLCAyM10sICJCYXNlRm9udEJsZW5kIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDMxXSwgIkNJREZvbnRWZXJzaW9uIiwgIm51bSIsIDBdLCBbWzEyLCAzMl0sICJDSURGb250UmV2aXNpb24iLCAibnVtIiwgMF0sIFtbMTIsIDMzXSwgIkNJREZvbnRUeXBlIiwgIm51bSIsIDBdLCBbWzEyLCAzNF0sICJDSURDb3VudCIsICJudW0iLCA4NzIwXSwgW1sxMiwgMzVdLCAiVUlEQmFzZSIsICJudW0iLCBudWxsXSwgW1sxMiwgMzddLCAiRkRTZWxlY3QiLCAib2Zmc2V0IiwgbnVsbF0sIFtbMTIsIDM2XSwgIkZEQXJyYXkiLCAib2Zmc2V0IiwgbnVsbF0sIFtbMTIsIDM4XSwgIkZvbnROYW1lIiwgInNpZCIsIG51bGxdXTsKKyAgdmFyIHRhYmxlcyA9IG51bGw7CisKKyAgY2xhc3MgQ0ZGVG9wRGljdCBleHRlbmRzIENGRkRpY3QgeworICAgIGNvbnN0cnVjdG9yKHN0cmluZ3MpIHsKKyAgICAgIGlmICh0YWJsZXMgPT09IG51bGwpIHsKKyAgICAgICAgdGFibGVzID0gQ0ZGRGljdC5jcmVhdGVUYWJsZXMobGF5b3V0KTsKKyAgICAgIH0KKworICAgICAgc3VwZXIodGFibGVzLCBzdHJpbmdzKTsKKyAgICAgIHRoaXMucHJpdmF0ZURpY3QgPSBudWxsOworICAgIH0KKworICB9CisKKyAgcmV0dXJuIENGRlRvcERpY3Q7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGVG9wRGljdCA9IENGRlRvcERpY3Q7CisKK3ZhciBDRkZQcml2YXRlRGljdCA9IGZ1bmN0aW9uIENGRlByaXZhdGVEaWN0Q2xvc3VyZSgpIHsKKyAgdmFyIGxheW91dCA9IFtbNiwgIkJsdWVWYWx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzcsICJPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFs4LCAiRmFtaWx5Qmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzksICJGYW1pbHlPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDldLCAiQmx1ZVNjYWxlIiwgIm51bSIsIDAuMDM5NjI1XSwgW1sxMiwgMTBdLCAiQmx1ZVNoaWZ0IiwgIm51bSIsIDddLCBbWzEyLCAxMV0sICJCbHVlRnV6eiIsICJudW0iLCAxXSwgWzEwLCAiU3RkSFciLCAibnVtIiwgbnVsbF0sIFsxMSwgIlN0ZFZXIiwgIm51bSIsIG51bGxdLCBbWzEyLCAxMl0sICJTdGVtU25hcEgiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMTNdLCAiU3RlbVNuYXBWIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDE0XSwgIkZvcmNlQm9sZCIsICJudW0iLCAwXSwgW1sxMiwgMTddLCAiTGFuZ3VhZ2VHcm91cCIsICJudW0iLCAwXSwgW1sxMiwgMThdLCAiRXhwYW5zaW9uRmFjdG9yIiwgIm51bSIsIDAuMDZdLCBbWzEyLCAxOV0sICJpbml0aWFsUmFuZG9tU2VlZCIsICJudW0iLCAwXSwgWzIwLCAiZGVmYXVsdFdpZHRoWCIsICJudW0iLCAwXSwgWzIxLCAibm9taW5hbFdpZHRoWCIsICJudW0iLCAwXSwgWzE5LCAiU3VicnMiLCAib2Zmc2V0IiwgbnVsbF1dOworICB2YXIgdGFibGVzID0gbnVsbDsKKworICBjbGFzcyBDRkZQcml2YXRlRGljdCBleHRlbmRzIENGRkRpY3QgeworICAgIGNvbnN0cnVjdG9yKHN0cmluZ3MpIHsKKyAgICAgIGlmICh0YWJsZXMgPT09IG51bGwpIHsKKyAgICAgICAgdGFibGVzID0gQ0ZGRGljdC5jcmVhdGVUYWJsZXMobGF5b3V0KTsKKyAgICAgIH0KKworICAgICAgc3VwZXIodGFibGVzLCBzdHJpbmdzKTsKKyAgICAgIHRoaXMuc3VicnNJbmRleCA9IG51bGw7CisgICAgfQorCisgIH0KKworICByZXR1cm4gQ0ZGUHJpdmF0ZURpY3Q7Cit9KCk7CisKK2V4cG9ydHMuQ0ZGUHJpdmF0ZURpY3QgPSBDRkZQcml2YXRlRGljdDsKK3ZhciBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzID0geworICBJU09fQURPQkU6IDAsCisgIEVYUEVSVDogMSwKKyAgRVhQRVJUX1NVQlNFVDogMgorfTsKKworY2xhc3MgQ0ZGQ2hhcnNldCB7CisgIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgY2hhcnNldCwgcmF3KSB7CisgICAgdGhpcy5wcmVkZWZpbmVkID0gcHJlZGVmaW5lZDsKKyAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKKyAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OworICAgIHRoaXMucmF3ID0gcmF3OworICB9CisKK30KKworZXhwb3J0cy5DRkZDaGFyc2V0ID0gQ0ZGQ2hhcnNldDsKKworY2xhc3MgQ0ZGRW5jb2RpbmcgeworICBjb25zdHJ1Y3RvcihwcmVkZWZpbmVkLCBmb3JtYXQsIGVuY29kaW5nLCByYXcpIHsKKyAgICB0aGlzLnByZWRlZmluZWQgPSBwcmVkZWZpbmVkOworICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OworICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICB0aGlzLnJhdyA9IHJhdzsKKyAgfQorCit9CisKK2NsYXNzIENGRkZEU2VsZWN0IHsKKyAgY29uc3RydWN0b3IoZm9ybWF0LCBmZFNlbGVjdCkgeworICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OworICAgIHRoaXMuZmRTZWxlY3QgPSBmZFNlbGVjdDsKKyAgfQorCisgIGdldEZESW5kZXgoZ2x5cGhJbmRleCkgeworICAgIGlmIChnbHlwaEluZGV4IDwgMCB8fCBnbHlwaEluZGV4ID49IHRoaXMuZmRTZWxlY3QubGVuZ3RoKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuZmRTZWxlY3RbZ2x5cGhJbmRleF07CisgIH0KKworfQorCitleHBvcnRzLkNGRkZEU2VsZWN0ID0gQ0ZGRkRTZWxlY3Q7CisKK2NsYXNzIENGRk9mZnNldFRyYWNrZXIgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLm9mZnNldHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9CisKKyAgaXNUcmFja2luZyhrZXkpIHsKKyAgICByZXR1cm4ga2V5IGluIHRoaXMub2Zmc2V0czsKKyAgfQorCisgIHRyYWNrKGtleSwgbG9jYXRpb24pIHsKKyAgICBpZiAoa2V5IGluIHRoaXMub2Zmc2V0cykgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBBbHJlYWR5IHRyYWNraW5nIGxvY2F0aW9uIG9mICR7a2V5fWApOworICAgIH0KKworICAgIHRoaXMub2Zmc2V0c1trZXldID0gbG9jYXRpb247CisgIH0KKworICBvZmZzZXQodmFsdWUpIHsKKyAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5vZmZzZXRzKSB7CisgICAgICB0aGlzLm9mZnNldHNba2V5XSArPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICBzZXRFbnRyeUxvY2F0aW9uKGtleSwgdmFsdWVzLCBvdXRwdXQpIHsKKyAgICBpZiAoIShrZXkgaW4gdGhpcy5vZmZzZXRzKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBOb3QgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtrZXl9YCk7CisgICAgfQorCisgICAgdmFyIGRhdGEgPSBvdXRwdXQuZGF0YTsKKyAgICB2YXIgZGF0YU9mZnNldCA9IHRoaXMub2Zmc2V0c1trZXldOworICAgIHZhciBzaXplID0gNTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHZhbHVlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICB2YXIgb2Zmc2V0MCA9IGkgKiBzaXplICsgZGF0YU9mZnNldDsKKyAgICAgIHZhciBvZmZzZXQxID0gb2Zmc2V0MCArIDE7CisgICAgICB2YXIgb2Zmc2V0MiA9IG9mZnNldDAgKyAyOworICAgICAgdmFyIG9mZnNldDMgPSBvZmZzZXQwICsgMzsKKyAgICAgIHZhciBvZmZzZXQ0ID0gb2Zmc2V0MCArIDQ7CisKKyAgICAgIGlmIChkYXRhW29mZnNldDBdICE9PSAweDFkIHx8IGRhdGFbb2Zmc2V0MV0gIT09IDAgfHwgZGF0YVtvZmZzZXQyXSAhPT0gMCB8fCBkYXRhW29mZnNldDNdICE9PSAwIHx8IGRhdGFbb2Zmc2V0NF0gIT09IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJ3cml0aW5nIHRvIGFuIG9mZnNldCB0aGF0IGlzIG5vdCBlbXB0eSIpOworICAgICAgfQorCisgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07CisgICAgICBkYXRhW29mZnNldDBdID0gMHgxZDsKKyAgICAgIGRhdGFbb2Zmc2V0MV0gPSB2YWx1ZSA+PiAyNCAmIDB4ZmY7CisgICAgICBkYXRhW29mZnNldDJdID0gdmFsdWUgPj4gMTYgJiAweGZmOworICAgICAgZGF0YVtvZmZzZXQzXSA9IHZhbHVlID4+IDggJiAweGZmOworICAgICAgZGF0YVtvZmZzZXQ0XSA9IHZhbHVlICYgMHhmZjsKKyAgICB9CisgIH0KKworfQorCitjbGFzcyBDRkZDb21waWxlciB7CisgIGNvbnN0cnVjdG9yKGNmZikgeworICAgIHRoaXMuY2ZmID0gY2ZmOworICB9CisKKyAgY29tcGlsZSgpIHsKKyAgICB2YXIgY2ZmID0gdGhpcy5jZmY7CisgICAgdmFyIG91dHB1dCA9IHsKKyAgICAgIGRhdGE6IFtdLAorICAgICAgbGVuZ3RoOiAwLAorICAgICAgYWRkOiBmdW5jdGlvbiBDRkZDb21waWxlcl9hZGQoZGF0YSkgeworICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KGRhdGEpOworICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7CisgICAgICB9CisgICAgfTsKKyAgICB2YXIgaGVhZGVyID0gdGhpcy5jb21waWxlSGVhZGVyKGNmZi5oZWFkZXIpOworICAgIG91dHB1dC5hZGQoaGVhZGVyKTsKKyAgICB2YXIgbmFtZUluZGV4ID0gdGhpcy5jb21waWxlTmFtZUluZGV4KGNmZi5uYW1lcyk7CisgICAgb3V0cHV0LmFkZChuYW1lSW5kZXgpOworCisgICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKKyAgICAgIGlmIChjZmYudG9wRGljdC5oYXNOYW1lKCJGb250TWF0cml4IikpIHsKKyAgICAgICAgdmFyIGJhc2UgPSBjZmYudG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTsKKyAgICAgICAgY2ZmLnRvcERpY3QucmVtb3ZlQnlOYW1lKCJGb250TWF0cml4Iik7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2ZmLmZkQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIHZhciBzdWJEaWN0ID0gY2ZmLmZkQXJyYXlbaV07CisgICAgICAgICAgdmFyIG1hdHJpeCA9IGJhc2Uuc2xpY2UoMCk7CisKKyAgICAgICAgICBpZiAoc3ViRGljdC5oYXNOYW1lKCJGb250TWF0cml4IikpIHsKKyAgICAgICAgICAgIG1hdHJpeCA9IF91dGlsLlV0aWwudHJhbnNmb3JtKG1hdHJpeCwgc3ViRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3ViRGljdC5zZXRCeU5hbWUoIkZvbnRNYXRyaXgiLCBtYXRyaXgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgY2ZmLnRvcERpY3Quc2V0QnlOYW1lKCJjaGFyc2V0IiwgMCk7CisgICAgdmFyIGNvbXBpbGVkID0gdGhpcy5jb21waWxlVG9wRGljdHMoW2NmZi50b3BEaWN0XSwgb3V0cHV0Lmxlbmd0aCwgY2ZmLmlzQ0lERm9udCk7CisgICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOworICAgIHZhciB0b3BEaWN0VHJhY2tlciA9IGNvbXBpbGVkLnRyYWNrZXJzWzBdOworICAgIHZhciBzdHJpbmdJbmRleCA9IHRoaXMuY29tcGlsZVN0cmluZ0luZGV4KGNmZi5zdHJpbmdzLnN0cmluZ3MpOworICAgIG91dHB1dC5hZGQoc3RyaW5nSW5kZXgpOworICAgIHZhciBnbG9iYWxTdWJySW5kZXggPSB0aGlzLmNvbXBpbGVJbmRleChjZmYuZ2xvYmFsU3VickluZGV4KTsKKyAgICBvdXRwdXQuYWRkKGdsb2JhbFN1YnJJbmRleCk7CisKKyAgICBpZiAoY2ZmLmVuY29kaW5nICYmIGNmZi50b3BEaWN0Lmhhc05hbWUoIkVuY29kaW5nIikpIHsKKyAgICAgIGlmIChjZmYuZW5jb2RpbmcucHJlZGVmaW5lZCkgeworICAgICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsIFtjZmYuZW5jb2RpbmcuZm9ybWF0XSwgb3V0cHV0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBlbmNvZGluZyA9IHRoaXMuY29tcGlsZUVuY29kaW5nKGNmZi5lbmNvZGluZyk7CisgICAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOworICAgICAgICBvdXRwdXQuYWRkKGVuY29kaW5nKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY2hhcnNldCA9IHRoaXMuY29tcGlsZUNoYXJzZXQoY2ZmLmNoYXJzZXQsIGNmZi5jaGFyU3RyaW5ncy5jb3VudCwgY2ZmLnN0cmluZ3MsIGNmZi5pc0NJREZvbnQpOworICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oImNoYXJzZXQiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CisgICAgb3V0cHV0LmFkZChjaGFyc2V0KTsKKyAgICB2YXIgY2hhclN0cmluZ3MgPSB0aGlzLmNvbXBpbGVDaGFyU3RyaW5ncyhjZmYuY2hhclN0cmluZ3MpOworICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkNoYXJTdHJpbmdzIiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOworICAgIG91dHB1dC5hZGQoY2hhclN0cmluZ3MpOworCisgICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKKyAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkZEU2VsZWN0IiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOworICAgICAgdmFyIGZkU2VsZWN0ID0gdGhpcy5jb21waWxlRkRTZWxlY3QoY2ZmLmZkU2VsZWN0KTsKKyAgICAgIG91dHB1dC5hZGQoZmRTZWxlY3QpOworICAgICAgY29tcGlsZWQgPSB0aGlzLmNvbXBpbGVUb3BEaWN0cyhjZmYuZmRBcnJheSwgb3V0cHV0Lmxlbmd0aCwgdHJ1ZSk7CisgICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJGREFycmF5IiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOworICAgICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOworICAgICAgdmFyIGZvbnREaWN0VHJhY2tlcnMgPSBjb21waWxlZC50cmFja2VyczsKKyAgICAgIHRoaXMuY29tcGlsZVByaXZhdGVEaWN0cyhjZmYuZmRBcnJheSwgZm9udERpY3RUcmFja2Vycywgb3V0cHV0KTsKKyAgICB9CisKKyAgICB0aGlzLmNvbXBpbGVQcml2YXRlRGljdHMoW2NmZi50b3BEaWN0XSwgW3RvcERpY3RUcmFja2VyXSwgb3V0cHV0KTsKKyAgICBvdXRwdXQuYWRkKFswXSk7CisgICAgcmV0dXJuIG91dHB1dC5kYXRhOworICB9CisKKyAgZW5jb2RlTnVtYmVyKHZhbHVlKSB7CisgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CisgICAgICByZXR1cm4gdGhpcy5lbmNvZGVJbnRlZ2VyKHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5lbmNvZGVGbG9hdCh2YWx1ZSk7CisgIH0KKworICBzdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCkgeworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiRW5jb2RlRmxvYXRSZWdFeHAiLCAvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyk7CisgIH0KKworICBlbmNvZGVGbG9hdChudW0pIHsKKyAgICB2YXIgdmFsdWUgPSBudW0udG9TdHJpbmcoKTsKKyAgICB2YXIgbSA9IENGRkNvbXBpbGVyLkVuY29kZUZsb2F0UmVnRXhwLmV4ZWModmFsdWUpOworCisgICAgaWYgKG0pIHsKKyAgICAgIHZhciBlcHNpbG9uID0gcGFyc2VGbG9hdCgiMWUiICsgKChtWzJdID8gK21bMl0gOiAwKSArIG1bMV0ubGVuZ3RoKSk7CisgICAgICB2YWx1ZSA9IChNYXRoLnJvdW5kKG51bSAqIGVwc2lsb24pIC8gZXBzaWxvbikudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICB2YXIgbmliYmxlcyA9ICIiOworICAgIHZhciBpLCBpaTsKKworICAgIGZvciAoaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgdmFyIGEgPSB2YWx1ZVtpXTsKKworICAgICAgaWYgKGEgPT09ICJlIikgeworICAgICAgICBuaWJibGVzICs9IHZhbHVlWysraV0gPT09ICItIiA/ICJjIiA6ICJiIjsKKyAgICAgIH0gZWxzZSBpZiAoYSA9PT0gIi4iKSB7CisgICAgICAgIG5pYmJsZXMgKz0gImEiOworICAgICAgfSBlbHNlIGlmIChhID09PSAiLSIpIHsKKyAgICAgICAgbmliYmxlcyArPSAiZSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBuaWJibGVzICs9IGE7CisgICAgICB9CisgICAgfQorCisgICAgbmliYmxlcyArPSBuaWJibGVzLmxlbmd0aCAmIDEgPyAiZiIgOiAiZmYiOworICAgIHZhciBvdXQgPSBbMzBdOworCisgICAgZm9yIChpID0gMCwgaWkgPSBuaWJibGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgIG91dC5wdXNoKHBhcnNlSW50KG5pYmJsZXMuc3Vic3RyaW5nKGksIGkgKyAyKSwgMTYpKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgZW5jb2RlSW50ZWdlcih2YWx1ZSkgeworICAgIHZhciBjb2RlOworCisgICAgaWYgKHZhbHVlID49IC0xMDcgJiYgdmFsdWUgPD0gMTA3KSB7CisgICAgICBjb2RlID0gW3ZhbHVlICsgMTM5XTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlID49IDEwOCAmJiB2YWx1ZSA8PSAxMTMxKSB7CisgICAgICB2YWx1ZSA9IHZhbHVlIC0gMTA4OworICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNDcsIHZhbHVlICYgMHhmZl07CisgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAtMTEzMSAmJiB2YWx1ZSA8PSAtMTA4KSB7CisgICAgICB2YWx1ZSA9IC12YWx1ZSAtIDEwODsKKyAgICAgIGNvZGUgPSBbKHZhbHVlID4+IDgpICsgMjUxLCB2YWx1ZSAmIDB4ZmZdOworICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gLTMyNzY4ICYmIHZhbHVlIDw9IDMyNzY3KSB7CisgICAgICBjb2RlID0gWzB4MWMsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmZdOworICAgIH0gZWxzZSB7CisgICAgICBjb2RlID0gWzB4MWQsIHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmXTsKKyAgICB9CisKKyAgICByZXR1cm4gY29kZTsKKyAgfQorCisgIGNvbXBpbGVIZWFkZXIoaGVhZGVyKSB7CisgICAgcmV0dXJuIFtoZWFkZXIubWFqb3IsIGhlYWRlci5taW5vciwgaGVhZGVyLmhkclNpemUsIGhlYWRlci5vZmZTaXplXTsKKyAgfQorCisgIGNvbXBpbGVOYW1lSW5kZXgobmFtZXMpIHsKKyAgICB2YXIgbmFtZUluZGV4ID0gbmV3IENGRkluZGV4KCk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBuYW1lcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldOworICAgICAgdmFyIGxlbmd0aCA9IE1hdGgubWluKG5hbWUubGVuZ3RoLCAxMjcpOworICAgICAgdmFyIHNhbml0aXplZE5hbWUgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKworICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgICB2YXIgY2hhciA9IG5hbWVbal07CisKKyAgICAgICAgaWYgKGNoYXIgPCAiISIgfHwgY2hhciA+ICJ+IiB8fCBjaGFyID09PSAiWyIgfHwgY2hhciA9PT0gIl0iIHx8IGNoYXIgPT09ICIoIiB8fCBjaGFyID09PSAiKSIgfHwgY2hhciA9PT0gInsiIHx8IGNoYXIgPT09ICJ9IiB8fCBjaGFyID09PSAiPCIgfHwgY2hhciA9PT0gIj4iIHx8IGNoYXIgPT09ICIvIiB8fCBjaGFyID09PSAiJSIpIHsKKyAgICAgICAgICBjaGFyID0gIl8iOworICAgICAgICB9CisKKyAgICAgICAgc2FuaXRpemVkTmFtZVtqXSA9IGNoYXI7CisgICAgICB9CisKKyAgICAgIHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZWROYW1lLmpvaW4oIiIpOworCisgICAgICBpZiAoc2FuaXRpemVkTmFtZSA9PT0gIiIpIHsKKyAgICAgICAgc2FuaXRpemVkTmFtZSA9ICJCYWRfRm9udF9OYW1lIjsKKyAgICAgIH0KKworICAgICAgbmFtZUluZGV4LmFkZCgoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoc2FuaXRpemVkTmFtZSkpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChuYW1lSW5kZXgpOworICB9CisKKyAgY29tcGlsZVRvcERpY3RzKGRpY3RzLCBsZW5ndGgsIHJlbW92ZUNpZEtleXMpIHsKKyAgICB2YXIgZm9udERpY3RUcmFja2VycyA9IFtdOworICAgIHZhciBmZEFycmF5SW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgIHZhciBmb250RGljdCA9IGRpY3RzW2ldOworCisgICAgICBpZiAocmVtb3ZlQ2lkS2V5cykgeworICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIik7CisgICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiQ0lERm9udFJldmlzaW9uIik7CisgICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiQ0lERm9udFR5cGUiKTsKKyAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpOworICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIlVJREJhc2UiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnREaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CisgICAgICB2YXIgZm9udERpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChmb250RGljdCwgZm9udERpY3RUcmFja2VyKTsKKyAgICAgIGZvbnREaWN0VHJhY2tlcnMucHVzaChmb250RGljdFRyYWNrZXIpOworICAgICAgZmRBcnJheUluZGV4LmFkZChmb250RGljdERhdGEpOworICAgICAgZm9udERpY3RUcmFja2VyLm9mZnNldChsZW5ndGgpOworICAgIH0KKworICAgIGZkQXJyYXlJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGZkQXJyYXlJbmRleCwgZm9udERpY3RUcmFja2Vycyk7CisgICAgcmV0dXJuIHsKKyAgICAgIHRyYWNrZXJzOiBmb250RGljdFRyYWNrZXJzLAorICAgICAgb3V0cHV0OiBmZEFycmF5SW5kZXgKKyAgICB9OworICB9CisKKyAgY29tcGlsZVByaXZhdGVEaWN0cyhkaWN0cywgdHJhY2tlcnMsIG91dHB1dCkgeworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgIHZhciBmb250RGljdCA9IGRpY3RzW2ldOworICAgICAgdmFyIHByaXZhdGVEaWN0ID0gZm9udERpY3QucHJpdmF0ZURpY3Q7CisKKyAgICAgIGlmICghcHJpdmF0ZURpY3QgfHwgIWZvbnREaWN0Lmhhc05hbWUoIlByaXZhdGUiKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlRoZXJlIG11c3QgYmUgYSBwcml2YXRlIGRpY3Rpb25hcnkuIik7CisgICAgICB9CisKKyAgICAgIHZhciBwcml2YXRlRGljdFRyYWNrZXIgPSBuZXcgQ0ZGT2Zmc2V0VHJhY2tlcigpOworICAgICAgdmFyIHByaXZhdGVEaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QocHJpdmF0ZURpY3QsIHByaXZhdGVEaWN0VHJhY2tlcik7CisgICAgICB2YXIgb3V0cHV0TGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDsKKyAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5vZmZzZXQob3V0cHV0TGVuZ3RoKTsKKworICAgICAgaWYgKCFwcml2YXRlRGljdERhdGEubGVuZ3RoKSB7CisgICAgICAgIG91dHB1dExlbmd0aCA9IDA7CisgICAgICB9CisKKyAgICAgIHRyYWNrZXJzW2ldLnNldEVudHJ5TG9jYXRpb24oIlByaXZhdGUiLCBbcHJpdmF0ZURpY3REYXRhLmxlbmd0aCwgb3V0cHV0TGVuZ3RoXSwgb3V0cHV0KTsKKyAgICAgIG91dHB1dC5hZGQocHJpdmF0ZURpY3REYXRhKTsKKworICAgICAgaWYgKHByaXZhdGVEaWN0LnN1YnJzSW5kZXggJiYgcHJpdmF0ZURpY3QuaGFzTmFtZSgiU3VicnMiKSkgeworICAgICAgICB2YXIgc3VicnMgPSB0aGlzLmNvbXBpbGVJbmRleChwcml2YXRlRGljdC5zdWJyc0luZGV4KTsKKyAgICAgICAgcHJpdmF0ZURpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIlN1YnJzIiwgW3ByaXZhdGVEaWN0RGF0YS5sZW5ndGhdLCBvdXRwdXQpOworICAgICAgICBvdXRwdXQuYWRkKHN1YnJzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjb21waWxlRGljdChkaWN0LCBvZmZzZXRUcmFja2VyKSB7CisgICAgdmFyIG91dCA9IFtdOworICAgIHZhciBvcmRlciA9IGRpY3Qub3JkZXI7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgKytpKSB7CisgICAgICB2YXIga2V5ID0gb3JkZXJbaV07CisKKyAgICAgIGlmICghKGtleSBpbiBkaWN0LnZhbHVlcykpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHZhciB2YWx1ZXMgPSBkaWN0LnZhbHVlc1trZXldOworICAgICAgdmFyIHR5cGVzID0gZGljdC50eXBlc1trZXldOworCisgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7CisgICAgICAgIHR5cGVzID0gW3R5cGVzXTsKKyAgICAgIH0KKworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHsKKyAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSB0eXBlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CisgICAgICAgIHZhciB0eXBlID0gdHlwZXNbal07CisgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tqXTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICBjYXNlICJudW0iOgorICAgICAgICAgIGNhc2UgInNpZCI6CisgICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KHRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm9mZnNldCI6CisgICAgICAgICAgICB2YXIgbmFtZSA9IGRpY3Qua2V5VG9OYW1lTWFwW2tleV07CisKKyAgICAgICAgICAgIGlmICghb2Zmc2V0VHJhY2tlci5pc1RyYWNraW5nKG5hbWUpKSB7CisgICAgICAgICAgICAgIG9mZnNldFRyYWNrZXIudHJhY2sobmFtZSwgb3V0Lmxlbmd0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA9IG91dC5jb25jYXQoWzB4MWQsIDAsIDAsIDAsIDBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiYXJyYXkiOgorICAgICAgICAgIGNhc2UgImRlbHRhIjoKKyAgICAgICAgICAgIG91dCA9IG91dC5jb25jYXQodGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKKworICAgICAgICAgICAgZm9yICh2YXIgayA9IDEsIGtrID0gdmFsdWVzLmxlbmd0aDsgayA8IGtrOyArK2spIHsKKyAgICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdCh0aGlzLmVuY29kZU51bWJlcih2YWx1ZXNba10pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSBvZiAke3R5cGV9YCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgb3V0ID0gb3V0LmNvbmNhdChkaWN0Lm9wY29kZXNba2V5XSk7CisgICAgfQorCisgICAgcmV0dXJuIG91dDsKKyAgfQorCisgIGNvbXBpbGVTdHJpbmdJbmRleChzdHJpbmdzKSB7CisgICAgdmFyIHN0cmluZ0luZGV4ID0gbmV3IENGRkluZGV4KCk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgIHN0cmluZ0luZGV4LmFkZCgoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoc3RyaW5nc1tpXSkpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChzdHJpbmdJbmRleCk7CisgIH0KKworICBjb21waWxlR2xvYmFsU3VickluZGV4KCkgeworICAgIHZhciBnbG9iYWxTdWJySW5kZXggPSB0aGlzLmNmZi5nbG9iYWxTdWJySW5kZXg7CisgICAgdGhpcy5vdXQud3JpdGVCeXRlQXJyYXkodGhpcy5jb21waWxlSW5kZXgoZ2xvYmFsU3VickluZGV4KSk7CisgIH0KKworICBjb21waWxlQ2hhclN0cmluZ3MoY2hhclN0cmluZ3MpIHsKKyAgICB2YXIgY2hhclN0cmluZ3NJbmRleCA9IG5ldyBDRkZJbmRleCgpOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFyU3RyaW5ncy5jb3VudDsgaSsrKSB7CisgICAgICB2YXIgZ2x5cGggPSBjaGFyU3RyaW5ncy5nZXQoaSk7CisKKyAgICAgIGlmIChnbHlwaC5sZW5ndGggPT09IDApIHsKKyAgICAgICAgY2hhclN0cmluZ3NJbmRleC5hZGQobmV3IFVpbnQ4QXJyYXkoWzB4OGIsIDB4MGVdKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaCk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KGNoYXJTdHJpbmdzSW5kZXgpOworICB9CisKKyAgY29tcGlsZUNoYXJzZXQoY2hhcnNldCwgbnVtR2x5cGhzLCBzdHJpbmdzLCBpc0NJREZvbnQpIHsKKyAgICBsZXQgb3V0OworICAgIGNvbnN0IG51bUdseXBoc0xlc3NOb3REZWYgPSBudW1HbHlwaHMgLSAxOworCisgICAgaWYgKGlzQ0lERm9udCkgeworICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoWzIsIDAsIDAsIG51bUdseXBoc0xlc3NOb3REZWYgPj4gOCAmIDB4ZmYsIG51bUdseXBoc0xlc3NOb3REZWYgJiAweGZmXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGxlbmd0aCA9IDEgKyBudW1HbHlwaHNMZXNzTm90RGVmICogMjsKKyAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisgICAgICBvdXRbMF0gPSAwOworICAgICAgbGV0IGNoYXJzZXRJbmRleCA9IDA7CisgICAgICBjb25zdCBudW1DaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldC5sZW5ndGg7CisgICAgICBsZXQgd2FybmVkID0gZmFsc2U7CisKKyAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgIGxldCBzaWQgPSAwOworCisgICAgICAgIGlmIChjaGFyc2V0SW5kZXggPCBudW1DaGFyc2V0cykgeworICAgICAgICAgIGNvbnN0IG5hbWUgPSBjaGFyc2V0LmNoYXJzZXRbY2hhcnNldEluZGV4KytdOworICAgICAgICAgIHNpZCA9IHN0cmluZ3MuZ2V0U0lEKG5hbWUpOworCisgICAgICAgICAgaWYgKHNpZCA9PT0gLTEpIHsKKyAgICAgICAgICAgIHNpZCA9IDA7CisKKyAgICAgICAgICAgIGlmICghd2FybmVkKSB7CisgICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgQ291bGRuJ3QgZmluZCAke25hbWV9IGluIENGRiBzdHJpbmdzYCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0W2ldID0gc2lkID4+IDggJiAweGZmOworICAgICAgICBvdXRbaSArIDFdID0gc2lkICYgMHhmZjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOworICB9CisKKyAgY29tcGlsZUVuY29kaW5nKGVuY29kaW5nKSB7CisgICAgcmV0dXJuIHRoaXMuY29tcGlsZVR5cGVkQXJyYXkoZW5jb2RpbmcucmF3KTsKKyAgfQorCisgIGNvbXBpbGVGRFNlbGVjdChmZFNlbGVjdCkgeworICAgIGNvbnN0IGZvcm1hdCA9IGZkU2VsZWN0LmZvcm1hdDsKKyAgICBsZXQgb3V0LCBpOworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoMSArIGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aCk7CisgICAgICAgIG91dFswXSA9IGZvcm1hdDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBvdXRbaSArIDFdID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzOgorICAgICAgICBjb25zdCBzdGFydCA9IDA7CisgICAgICAgIGxldCBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTsKKyAgICAgICAgY29uc3QgcmFuZ2VzID0gW2Zvcm1hdCwgMCwgMCwgc3RhcnQgPj4gOCAmIDB4ZmYsIHN0YXJ0ICYgMHhmZiwgbGFzdEZEXTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBjb25zdCBjdXJyZW50RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFtpXTsKKworICAgICAgICAgIGlmIChjdXJyZW50RkQgIT09IGxhc3RGRCkgeworICAgICAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7CisgICAgICAgICAgICBsYXN0RkQgPSBjdXJyZW50RkQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3QgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7CisgICAgICAgIHJhbmdlc1sxXSA9IG51bVJhbmdlcyA+PiA4ICYgMHhmZjsKKyAgICAgICAgcmFuZ2VzWzJdID0gbnVtUmFuZ2VzICYgMHhmZjsKKyAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYpOworICAgICAgICBvdXQgPSBuZXcgVWludDhBcnJheShyYW5nZXMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOworICB9CisKKyAgY29tcGlsZVR5cGVkQXJyYXkoZGF0YSkgeworICAgIHZhciBvdXQgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgb3V0W2ldID0gZGF0YVtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgY29tcGlsZUluZGV4KGluZGV4LCB0cmFja2VycyA9IFtdKSB7CisgICAgdmFyIG9iamVjdHMgPSBpbmRleC5vYmplY3RzOworICAgIHZhciBjb3VudCA9IG9iamVjdHMubGVuZ3RoOworCisgICAgaWYgKGNvdW50ID09PSAwKSB7CisgICAgICByZXR1cm4gWzAsIDAsIDBdOworICAgIH0KKworICAgIHZhciBkYXRhID0gW2NvdW50ID4+IDggJiAweGZmLCBjb3VudCAmIDB4ZmZdOworICAgIHZhciBsYXN0T2Zmc2V0ID0gMSwKKyAgICAgICAgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICBsYXN0T2Zmc2V0ICs9IG9iamVjdHNbaV0ubGVuZ3RoOworICAgIH0KKworICAgIHZhciBvZmZzZXRTaXplOworCisgICAgaWYgKGxhc3RPZmZzZXQgPCAweDEwMCkgeworICAgICAgb2Zmc2V0U2l6ZSA9IDE7CisgICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMCkgeworICAgICAgb2Zmc2V0U2l6ZSA9IDI7CisgICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMDAwKSB7CisgICAgICBvZmZzZXRTaXplID0gMzsKKyAgICB9IGVsc2UgeworICAgICAgb2Zmc2V0U2l6ZSA9IDQ7CisgICAgfQorCisgICAgZGF0YS5wdXNoKG9mZnNldFNpemUpOworICAgIHZhciByZWxhdGl2ZU9mZnNldCA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgKyAxOyBpKyspIHsKKyAgICAgIGlmIChvZmZzZXRTaXplID09PSAxKSB7CisgICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOworICAgICAgfSBlbHNlIGlmIChvZmZzZXRTaXplID09PSAyKSB7CisgICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+PiA4ICYgMHhmZiwgcmVsYXRpdmVPZmZzZXQgJiAweGZmKTsKKyAgICAgIH0gZWxzZSBpZiAob2Zmc2V0U2l6ZSA9PT0gMykgeworICAgICAgICBkYXRhLnB1c2gocmVsYXRpdmVPZmZzZXQgPj4gMTYgJiAweGZmLCByZWxhdGl2ZU9mZnNldCA+PiA4ICYgMHhmZiwgcmVsYXRpdmVPZmZzZXQgJiAweGZmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQgJiAweGZmLCByZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOworICAgICAgfQorCisgICAgICBpZiAob2JqZWN0c1tpXSkgeworICAgICAgICByZWxhdGl2ZU9mZnNldCArPSBvYmplY3RzW2ldLmxlbmd0aDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgaWYgKHRyYWNrZXJzW2ldKSB7CisgICAgICAgIHRyYWNrZXJzW2ldLm9mZnNldChkYXRhLmxlbmd0aCk7CisgICAgICB9CisKKyAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IG9iamVjdHNbaV0ubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICBkYXRhLnB1c2gob2JqZWN0c1tpXVtqXSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworfQorCitleHBvcnRzLkNGRkNvbXBpbGVyID0gQ0ZGQ29tcGlsZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvY2hhcnNldHMuanMgYi9saWIvY29yZS9jaGFyc2V0cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGViMjZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvY2hhcnNldHMuanMKQEAgLTAsMCArMSwzMyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRXhwZXJ0U3Vic2V0Q2hhcnNldCA9IGV4cG9ydHMuRXhwZXJ0Q2hhcnNldCA9IGV4cG9ydHMuSVNPQWRvYmVDaGFyc2V0ID0gdm9pZCAwOworY29uc3QgSVNPQWRvYmVDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iXTsKK2V4cG9ydHMuSVNPQWRvYmVDaGFyc2V0ID0gSVNPQWRvYmVDaGFyc2V0OworY29uc3QgRXhwZXJ0Q2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgInF1ZXN0aW9uc21hbGwiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICJpc3VwZXJpb3IiLCAibHN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJuc3VwZXJpb3IiLCAib3N1cGVyaW9yIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsICJEaWVyZXNpc3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiQ2Fyb25zbWFsbCIsICJEb3RhY2NlbnRzbWFsbCIsICJNYWNyb25zbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkFFc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklncmF2ZXNtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiRXRoc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCJdOworZXhwb3J0cy5FeHBlcnRDaGFyc2V0ID0gRXhwZXJ0Q2hhcnNldDsKK2NvbnN0IEV4cGVydFN1YnNldENoYXJzZXQgPSBbIi5ub3RkZWYiLCAic3BhY2UiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAicGFyZW5sZWZ0c3VwZXJpb3IiLCAicGFyZW5yaWdodHN1cGVyaW9yIiwgInR3b2RvdGVubGVhZGVyIiwgIm9uZWRvdGVubGVhZGVyIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAiZnJhY3Rpb24iLCAiemVyb29sZHN0eWxlIiwgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwgImZpdmVvbGRzdHlsZSIsICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJjb21tYXN1cGVyaW9yIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAicGVyaW9kc3VwZXJpb3IiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICJpc3VwZXJpb3IiLCAibHN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJuc3VwZXJpb3IiLCAib3N1cGVyaW9yIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgImh5cGhlbnN1cGVyaW9yIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJjZW50b2xkc3R5bGUiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJvbmVxdWFydGVyIiwgIm9uZWhhbGYiLCAidGhyZWVxdWFydGVycyIsICJvbmVlaWdodGgiLCAidGhyZWVlaWdodGhzIiwgImZpdmVlaWdodGhzIiwgInNldmVuZWlnaHRocyIsICJvbmV0aGlyZCIsICJ0d290aGlyZHMiLCAiemVyb3N1cGVyaW9yIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciJdOworZXhwb3J0cy5FeHBlcnRTdWJzZXRDaGFyc2V0ID0gRXhwZXJ0U3Vic2V0Q2hhcnNldDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9jaHVua2VkX3N0cmVhbS5qcyBiL2xpYi9jb3JlL2NodW5rZWRfc3RyZWFtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NDI2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9jaHVua2VkX3N0cmVhbS5qcwpAQCAtMCwwICsxLDY0MiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQ2h1bmtlZFN0cmVhbU1hbmFnZXIgPSBleHBvcnRzLkNodW5rZWRTdHJlYW0gPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfY29yZV91dGlscyA9IHJlcXVpcmUoIi4vY29yZV91dGlscy5qcyIpOworCitjbGFzcyBDaHVua2VkU3RyZWFtIHsKKyAgY29uc3RydWN0b3IobGVuZ3RoLCBjaHVua1NpemUsIG1hbmFnZXIpIHsKKyAgICB0aGlzLmJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKKyAgICB0aGlzLnN0YXJ0ID0gMDsKKyAgICB0aGlzLnBvcyA9IDA7CisgICAgdGhpcy5lbmQgPSBsZW5ndGg7CisgICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7CisgICAgdGhpcy5fbG9hZGVkQ2h1bmtzID0gbmV3IFNldCgpOworICAgIHRoaXMubnVtQ2h1bmtzID0gTWF0aC5jZWlsKGxlbmd0aCAvIGNodW5rU2l6ZSk7CisgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IDA7CisgICAgdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayA9IC0xOworICB9CisKKyAgZ2V0TWlzc2luZ0NodW5rcygpIHsKKyAgICBjb25zdCBjaHVua3MgPSBbXTsKKworICAgIGZvciAobGV0IGNodW5rID0gMCwgbiA9IHRoaXMubnVtQ2h1bmtzOyBjaHVuayA8IG47ICsrY2h1bmspIHsKKyAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKKyAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjaHVua3M7CisgIH0KKworICBnZXRCYXNlU3RyZWFtcygpIHsKKyAgICByZXR1cm4gW3RoaXNdOworICB9CisKKyAgZ2V0IG51bUNodW5rc0xvYWRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5fbG9hZGVkQ2h1bmtzLnNpemU7CisgIH0KKworICBhbGxDaHVua3NMb2FkZWQoKSB7CisgICAgcmV0dXJuIHRoaXMubnVtQ2h1bmtzTG9hZGVkID09PSB0aGlzLm51bUNodW5rczsKKyAgfQorCisgIG9uUmVjZWl2ZURhdGEoYmVnaW4sIGNodW5rKSB7CisgICAgY29uc3QgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemU7CisKKyAgICBpZiAoYmVnaW4gJSBjaHVua1NpemUgIT09IDApIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIGJlZ2luIG9mZnNldDogJHtiZWdpbn1gKTsKKyAgICB9CisKKyAgICBjb25zdCBlbmQgPSBiZWdpbiArIGNodW5rLmJ5dGVMZW5ndGg7CisKKyAgICBpZiAoZW5kICUgY2h1bmtTaXplICE9PSAwICYmIGVuZCAhPT0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIGVuZCBvZmZzZXQ6ICR7ZW5kfWApOworICAgIH0KKworICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgYmVnaW4pOworICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTsKKyAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gY2h1bmtTaXplKSArIDE7CisKKyAgICBmb3IgKGxldCBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHsKKyAgICAgIHRoaXMuX2xvYWRlZENodW5rcy5hZGQoY3VyQ2h1bmspOworICAgIH0KKyAgfQorCisgIG9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YShkYXRhKSB7CisgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg7CisgICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CisgICAgdGhpcy5ieXRlcy5zZXQobmV3IFVpbnQ4QXJyYXkoZGF0YSksIHBvc2l0aW9uKTsKKyAgICBwb3NpdGlvbiArPSBkYXRhLmJ5dGVMZW5ndGg7CisgICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBwb3NpdGlvbjsKKyAgICBjb25zdCBlbmRDaHVuayA9IHBvc2l0aW9uID49IHRoaXMuZW5kID8gdGhpcy5udW1DaHVua3MgOiBNYXRoLmZsb29yKHBvc2l0aW9uIC8gdGhpcy5jaHVua1NpemUpOworCisgICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CisgICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTsKKyAgICB9CisgIH0KKworICBlbnN1cmVCeXRlKHBvcykgeworICAgIGlmIChwb3MgPCB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNodW5rID0gTWF0aC5mbG9vcihwb3MgLyB0aGlzLmNodW5rU2l6ZSk7CisKKyAgICBpZiAoY2h1bmsgPT09IHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmspIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CisgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24ocG9zLCBwb3MgKyAxKTsKKyAgICB9CisKKyAgICB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rID0gY2h1bms7CisgIH0KKworICBlbnN1cmVSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgaWYgKGJlZ2luID49IGVuZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlbmQgPD0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZTsKKyAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihiZWdpbiAvIGNodW5rU2l6ZSk7CisgICAgY29uc3QgZW5kQ2h1bmsgPSBNYXRoLmZsb29yKChlbmQgLSAxKSAvIGNodW5rU2l6ZSkgKyAxOworCisgICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7CisgICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CisgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbihiZWdpbiwgZW5kKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBuZXh0RW1wdHlDaHVuayhiZWdpbkNodW5rKSB7CisgICAgY29uc3QgbnVtQ2h1bmtzID0gdGhpcy5udW1DaHVua3M7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNodW5rczsgKytpKSB7CisgICAgICBjb25zdCBjaHVuayA9IChiZWdpbkNodW5rICsgaSkgJSBudW1DaHVua3M7CisKKyAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKKyAgICAgICAgcmV0dXJuIGNodW5rOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgaGFzQ2h1bmsoY2h1bmspIHsKKyAgICByZXR1cm4gdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuayk7CisgIH0KKworICBnZXQgbGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7CisgIH0KKworICBnZXQgaXNFbXB0eSgpIHsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7CisgIH0KKworICBnZXRCeXRlKCkgeworICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOworCisgICAgaWYgKHBvcyA+PSB0aGlzLmVuZCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChwb3MgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgIHRoaXMuZW5zdXJlQnl0ZShwb3MpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdOworICB9CisKKyAgZ2V0VWludDE2KCkgeworICAgIGNvbnN0IGIwID0gdGhpcy5nZXRCeXRlKCk7CisgICAgY29uc3QgYjEgPSB0aGlzLmdldEJ5dGUoKTsKKworICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxOworICB9CisKKyAgZ2V0SW50MzIoKSB7CisgICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICBjb25zdCBiMSA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgIGNvbnN0IGIyID0gdGhpcy5nZXRCeXRlKCk7CisgICAgY29uc3QgYjMgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKKyAgfQorCisgIGdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkID0gZmFsc2UpIHsKKyAgICBjb25zdCBieXRlcyA9IHRoaXMuYnl0ZXM7CisgICAgY29uc3QgcG9zID0gdGhpcy5wb3M7CisgICAgY29uc3Qgc3RyRW5kID0gdGhpcy5lbmQ7CisKKyAgICBpZiAoIWxlbmd0aCkgeworICAgICAgaWYgKHN0ckVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlUmFuZ2UocG9zLCBzdHJFbmQpOworICAgICAgfQorCisgICAgICBjb25zdCBzdWJhcnJheSA9IGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTsKKyAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7CisgICAgfQorCisgICAgbGV0IGVuZCA9IHBvcyArIGxlbmd0aDsKKworICAgIGlmIChlbmQgPiBzdHJFbmQpIHsKKyAgICAgIGVuZCA9IHN0ckVuZDsKKyAgICB9CisKKyAgICBpZiAoZW5kID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgIHRoaXMuZW5zdXJlUmFuZ2UocG9zLCBlbmQpOworICAgIH0KKworICAgIHRoaXMucG9zID0gZW5kOworICAgIGNvbnN0IHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpOworICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7CisgIH0KKworICBwZWVrQnl0ZSgpIHsKKyAgICBjb25zdCBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7CisKKyAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKKyAgICAgIHRoaXMucG9zLS07CisgICAgfQorCisgICAgcmV0dXJuIHBlZWtlZEJ5dGU7CisgIH0KKworICBwZWVrQnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkgeworICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7CisgICAgdGhpcy5wb3MgLT0gYnl0ZXMubGVuZ3RoOworICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgaWYgKGJlZ2luIDwgMCkgeworICAgICAgYmVnaW4gPSAwOworICAgIH0KKworICAgIGlmIChlbmQgPiB0aGlzLmVuZCkgeworICAgICAgZW5kID0gdGhpcy5lbmQ7CisgICAgfQorCisgICAgaWYgKGVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICB0aGlzLmVuc3VyZVJhbmdlKGJlZ2luLCBlbmQpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KGJlZ2luLCBlbmQpOworICB9CisKKyAgc2tpcChuKSB7CisgICAgaWYgKCFuKSB7CisgICAgICBuID0gMTsKKyAgICB9CisKKyAgICB0aGlzLnBvcyArPSBuOworICB9CisKKyAgcmVzZXQoKSB7CisgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0OworICB9CisKKyAgbW92ZVN0YXJ0KCkgeworICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKKyAgfQorCisgIG1ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCkgeworICAgIGlmIChsZW5ndGgpIHsKKyAgICAgIGlmIChzdGFydCArIGxlbmd0aCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHN0YXJ0ID49IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlQnl0ZShzdGFydCk7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbSgpIHt9CisKKyAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CisKKyAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5nZXRNaXNzaW5nQ2h1bmtzID0gZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemU7CisgICAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcih0aGlzLnN0YXJ0IC8gY2h1bmtTaXplKTsKKyAgICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5mbG9vcigodGhpcy5lbmQgLSAxKSAvIGNodW5rU2l6ZSkgKyAxOworICAgICAgY29uc3QgbWlzc2luZ0NodW5rcyA9IFtdOworCisgICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKKyAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgeworICAgICAgICAgIG1pc3NpbmdDaHVua3MucHVzaChjaHVuayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1pc3NpbmdDaHVua3M7CisgICAgfTsKKworICAgIENodW5rZWRTdHJlYW1TdWJzdHJlYW0ucHJvdG90eXBlLmFsbENodW5rc0xvYWRlZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3MpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmdldE1pc3NpbmdDaHVua3MoKS5sZW5ndGggPT09IDA7CisgICAgfTsKKworICAgIGNvbnN0IHN1YlN0cmVhbSA9IG5ldyBDaHVua2VkU3RyZWFtU3Vic3RyZWFtKCk7CisgICAgc3ViU3RyZWFtLnBvcyA9IHN1YlN0cmVhbS5zdGFydCA9IHN0YXJ0OworICAgIHN1YlN0cmVhbS5lbmQgPSBzdGFydCArIGxlbmd0aCB8fCB0aGlzLmVuZDsKKyAgICBzdWJTdHJlYW0uZGljdCA9IGRpY3Q7CisgICAgcmV0dXJuIHN1YlN0cmVhbTsKKyAgfQorCit9CisKK2V4cG9ydHMuQ2h1bmtlZFN0cmVhbSA9IENodW5rZWRTdHJlYW07CisKK2NsYXNzIENodW5rZWRTdHJlYW1NYW5hZ2VyIHsKKyAgY29uc3RydWN0b3IocGRmTmV0d29ya1N0cmVhbSwgYXJncykgeworICAgIHRoaXMubGVuZ3RoID0gYXJncy5sZW5ndGg7CisgICAgdGhpcy5jaHVua1NpemUgPSBhcmdzLnJhbmdlQ2h1bmtTaXplOworICAgIHRoaXMuc3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW0odGhpcy5sZW5ndGgsIHRoaXMuY2h1bmtTaXplLCB0aGlzKTsKKyAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0gPSBwZGZOZXR3b3JrU3RyZWFtOworICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaCA9IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaDsKKyAgICB0aGlzLm1zZ0hhbmRsZXIgPSBhcmdzLm1zZ0hhbmRsZXI7CisgICAgdGhpcy5jdXJyUmVxdWVzdElkID0gMDsKKyAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QgPSBuZXcgTWFwKCk7CisgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rID0gbmV3IE1hcCgpOworICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0ID0gbmV3IE1hcCgpOworICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gMDsKKyAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICB9CisKKyAgb25Mb2FkZWRTdHJlYW0oKSB7CisgICAgcmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIHNlbmRSZXF1ZXN0KGJlZ2luLCBlbmQpIHsKKyAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMucGRmTmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKTsKKworICAgIGlmICghcmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKKyAgICAgIHJhbmdlUmVhZGVyLm9uUHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzKTsKKyAgICB9CisKKyAgICBsZXQgY2h1bmtzID0gW10sCisgICAgICAgIGxvYWRlZCA9IDA7CisgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKKyAgICAgIGNvbnN0IHJlYWRDaHVuayA9IGNodW5rID0+IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoIWNodW5rLmRvbmUpIHsKKyAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjaHVuay52YWx1ZTsKKyAgICAgICAgICAgIGNodW5rcy5wdXNoKGRhdGEpOworICAgICAgICAgICAgbG9hZGVkICs9ICgwLCBfdXRpbC5hcnJheUJ5dGVMZW5ndGgpKGRhdGEpOworCisgICAgICAgICAgICBpZiAocmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzKHsKKyAgICAgICAgICAgICAgICBsb2FkZWQKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBjaHVua0RhdGEgPSAoMCwgX3V0aWwuYXJyYXlzVG9CeXRlcykoY2h1bmtzKTsKKyAgICAgICAgICBjaHVua3MgPSBudWxsOworICAgICAgICAgIHJlc29sdmUoY2h1bmtEYXRhKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgIHJlamVjdChlKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOworICAgIH0pOworICAgIHByb21pc2UudGhlbihkYXRhID0+IHsKKyAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLm9uUmVjZWl2ZURhdGEoeworICAgICAgICBjaHVuazogZGF0YSwKKyAgICAgICAgYmVnaW4KKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgcmVxdWVzdEFsbENodW5rcygpIHsKKyAgICBjb25zdCBtaXNzaW5nQ2h1bmtzID0gdGhpcy5zdHJlYW0uZ2V0TWlzc2luZ0NodW5rcygpOworCisgICAgdGhpcy5fcmVxdWVzdENodW5rcyhtaXNzaW5nQ2h1bmtzKTsKKworICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBfcmVxdWVzdENodW5rcyhjaHVua3MpIHsKKyAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmN1cnJSZXF1ZXN0SWQrKzsKKyAgICBjb25zdCBjaHVua3NOZWVkZWQgPSBuZXcgU2V0KCk7CisKKyAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2h1bmtzTmVlZGVkKTsKKworICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7CisgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGNodW5rKSkgeworICAgICAgICBjaHVua3NOZWVkZWQuYWRkKGNodW5rKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2h1bmtzTmVlZGVkLnNpemUgPT09IDApIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICBjb25zdCBjYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2FwYWJpbGl0eSk7CisKKyAgICBjb25zdCBjaHVua3NUb1JlcXVlc3QgPSBbXTsKKworICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzTmVlZGVkKSB7CisgICAgICBsZXQgcmVxdWVzdElkcyA9IHRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoY2h1bmspOworCisgICAgICBpZiAoIXJlcXVlc3RJZHMpIHsKKyAgICAgICAgcmVxdWVzdElkcyA9IFtdOworCisgICAgICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zZXQoY2h1bmssIHJlcXVlc3RJZHMpOworCisgICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTsKKyAgICAgIH0KKworICAgICAgcmVxdWVzdElkcy5wdXNoKHJlcXVlc3RJZCk7CisgICAgfQorCisgICAgaWYgKGNodW5rc1RvUmVxdWVzdC5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCBncm91cGVkQ2h1bmtzVG9SZXF1ZXN0ID0gdGhpcy5ncm91cENodW5rcyhjaHVua3NUb1JlcXVlc3QpOworCisgICAgICBmb3IgKGNvbnN0IGdyb3VwZWRDaHVuayBvZiBncm91cGVkQ2h1bmtzVG9SZXF1ZXN0KSB7CisgICAgICAgIGNvbnN0IGJlZ2luID0gZ3JvdXBlZENodW5rLmJlZ2luQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZTsKKyAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oZ3JvdXBlZENodW5rLmVuZENodW5rICogdGhpcy5jaHVua1NpemUsIHRoaXMubGVuZ3RoKTsKKyAgICAgICAgdGhpcy5zZW5kUmVxdWVzdChiZWdpbiwgZW5kKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBpZiAodGhpcy5hYm9ydGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhyb3cgcmVhc29uOworICAgIH0pOworICB9CisKKyAgZ2V0U3RyZWFtKCkgeworICAgIHJldHVybiB0aGlzLnN0cmVhbTsKKyAgfQorCisgIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgZW5kID0gTWF0aC5taW4oZW5kLCB0aGlzLmxlbmd0aCk7CisgICAgY29uc3QgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhiZWdpbik7CisgICAgY29uc3QgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKGVuZCk7CisgICAgY29uc3QgY2h1bmtzID0gW107CisKKyAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKKyAgICAgIGNodW5rcy5wdXNoKGNodW5rKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3MpOworICB9CisKKyAgcmVxdWVzdFJhbmdlcyhyYW5nZXMgPSBbXSkgeworICAgIGNvbnN0IGNodW5rc1RvUmVxdWVzdCA9IFtdOworCisgICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHsKKyAgICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsocmFuZ2UuYmVnaW4pOworICAgICAgY29uc3QgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKHJhbmdlLmVuZCk7CisKKyAgICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgeworICAgICAgICBpZiAoIWNodW5rc1RvUmVxdWVzdC5pbmNsdWRlcyhjaHVuaykpIHsKKyAgICAgICAgICBjaHVua3NUb1JlcXVlc3QucHVzaChjaHVuayk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjaHVua3NUb1JlcXVlc3Quc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgcmV0dXJuIGEgLSBiOworICAgIH0pOworICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rc1RvUmVxdWVzdCk7CisgIH0KKworICBncm91cENodW5rcyhjaHVua3MpIHsKKyAgICBjb25zdCBncm91cGVkQ2h1bmtzID0gW107CisgICAgbGV0IGJlZ2luQ2h1bmsgPSAtMTsKKyAgICBsZXQgcHJldkNodW5rID0gLTE7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaV07CisKKyAgICAgIGlmIChiZWdpbkNodW5rIDwgMCkgeworICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7CisgICAgICB9CisKKyAgICAgIGlmIChwcmV2Q2h1bmsgPj0gMCAmJiBwcmV2Q2h1bmsgKyAxICE9PSBjaHVuaykgeworICAgICAgICBncm91cGVkQ2h1bmtzLnB1c2goeworICAgICAgICAgIGJlZ2luQ2h1bmssCisgICAgICAgICAgZW5kQ2h1bms6IHByZXZDaHVuayArIDEKKyAgICAgICAgfSk7CisgICAgICAgIGJlZ2luQ2h1bmsgPSBjaHVuazsKKyAgICAgIH0KKworICAgICAgaWYgKGkgKyAxID09PSBjaHVua3MubGVuZ3RoKSB7CisgICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7CisgICAgICAgICAgYmVnaW5DaHVuaywKKyAgICAgICAgICBlbmRDaHVuazogY2h1bmsgKyAxCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBwcmV2Q2h1bmsgPSBjaHVuazsKKyAgICB9CisKKyAgICByZXR1cm4gZ3JvdXBlZENodW5rczsKKyAgfQorCisgIG9uUHJvZ3Jlc3MoYXJncykgeworICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKKyAgICAgIGxvYWRlZDogdGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkICogdGhpcy5jaHVua1NpemUgKyBhcmdzLmxvYWRlZCwKKyAgICAgIHRvdGFsOiB0aGlzLmxlbmd0aAorICAgIH0pOworICB9CisKKyAgb25SZWNlaXZlRGF0YShhcmdzKSB7CisgICAgY29uc3QgY2h1bmsgPSBhcmdzLmNodW5rOworICAgIGNvbnN0IGlzUHJvZ3Jlc3NpdmUgPSBhcmdzLmJlZ2luID09PSB1bmRlZmluZWQ7CisgICAgY29uc3QgYmVnaW4gPSBpc1Byb2dyZXNzaXZlID8gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggOiBhcmdzLmJlZ2luOworICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgY2h1bmsuYnl0ZUxlbmd0aDsKKyAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihiZWdpbiAvIHRoaXMuY2h1bmtTaXplKTsKKyAgICBjb25zdCBlbmRDaHVuayA9IGVuZCA8IHRoaXMubGVuZ3RoID8gTWF0aC5mbG9vcihlbmQgLyB0aGlzLmNodW5rU2l6ZSkgOiBNYXRoLmNlaWwoZW5kIC8gdGhpcy5jaHVua1NpemUpOworCisgICAgaWYgKGlzUHJvZ3Jlc3NpdmUpIHsKKyAgICAgIHRoaXMuc3RyZWFtLm9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YShjaHVuayk7CisgICAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IGVuZDsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlRGF0YShiZWdpbiwgY2h1bmspOworICAgIH0KKworICAgIGlmICh0aGlzLnN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSkgeworICAgICAgdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5yZXNvbHZlKHRoaXMuc3RyZWFtKTsKKyAgICB9CisKKyAgICBjb25zdCBsb2FkZWRSZXF1ZXN0cyA9IFtdOworCisgICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CisgICAgICBjb25zdCByZXF1ZXN0SWRzID0gdGhpcy5fcmVxdWVzdHNCeUNodW5rLmdldChjdXJDaHVuayk7CisKKyAgICAgIGlmICghcmVxdWVzdElkcykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rLmRlbGV0ZShjdXJDaHVuayk7CisKKyAgICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIHJlcXVlc3RJZHMpIHsKKyAgICAgICAgY29uc3QgY2h1bmtzTmVlZGVkID0gdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0LmdldChyZXF1ZXN0SWQpOworCisgICAgICAgIGlmIChjaHVua3NOZWVkZWQuaGFzKGN1ckNodW5rKSkgeworICAgICAgICAgIGNodW5rc05lZWRlZC5kZWxldGUoY3VyQ2h1bmspOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNodW5rc05lZWRlZC5zaXplID4gMCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbG9hZGVkUmVxdWVzdHMucHVzaChyZXF1ZXN0SWQpOworICAgICAgfQorICAgIH0KKworICAgIGlmICghdGhpcy5kaXNhYmxlQXV0b0ZldGNoICYmIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zaXplID09PSAwKSB7CisgICAgICBsZXQgbmV4dEVtcHR5Q2h1bms7CisKKyAgICAgIGlmICh0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgPT09IDEpIHsKKyAgICAgICAgY29uc3QgbGFzdENodW5rID0gdGhpcy5zdHJlYW0ubnVtQ2h1bmtzIC0gMTsKKworICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHsKKyAgICAgICAgICBuZXh0RW1wdHlDaHVuayA9IGxhc3RDaHVuazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dEVtcHR5Q2h1bmsgPSB0aGlzLnN0cmVhbS5uZXh0RW1wdHlDaHVuayhlbmRDaHVuayk7CisgICAgICB9CisKKyAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG5leHRFbXB0eUNodW5rKSkgeworICAgICAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKFtuZXh0RW1wdHlDaHVua10pOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIGxvYWRlZFJlcXVlc3RzKSB7CisgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CisKKyAgICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShyZXF1ZXN0SWQpOworCisgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICB9CisKKyAgICB0aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLCB7CisgICAgICBsb2FkZWQ6IHRoaXMuc3RyZWFtLm51bUNodW5rc0xvYWRlZCAqIHRoaXMuY2h1bmtTaXplLAorICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCisgICAgfSk7CisgIH0KKworICBvbkVycm9yKGVycikgeworICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7CisgIH0KKworICBnZXRCZWdpbkNodW5rKGJlZ2luKSB7CisgICAgcmV0dXJuIE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CisgIH0KKworICBnZXRFbmRDaHVuayhlbmQpIHsKKyAgICByZXR1cm4gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyB0aGlzLmNodW5rU2l6ZSkgKyAxOworICB9CisKKyAgYWJvcnQocmVhc29uKSB7CisgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKKworICAgIGlmICh0aGlzLnBkZk5ldHdvcmtTdHJlYW0pIHsKKyAgICAgIHRoaXMucGRmTmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pOworICAgIH0KKworICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSkgeworICAgICAgY2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLkNodW5rZWRTdHJlYW1NYW5hZ2VyID0gQ2h1bmtlZFN0cmVhbU1hbmFnZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvY21hcC5qcyBiL2xpYi9jb3JlL2NtYXAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1MDBlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL2NtYXAuanMKQEAgLTAsMCArMSw5MjUgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNNYXBGYWN0b3J5ID0gZXhwb3J0cy5JZGVudGl0eUNNYXAgPSBleHBvcnRzLkNNYXAgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4vcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX3BhcnNlciA9IHJlcXVpcmUoIi4vcGFyc2VyLmpzIik7CisKK3ZhciBfY29yZV91dGlscyA9IHJlcXVpcmUoIi4vY29yZV91dGlscy5qcyIpOworCit2YXIgX3N0cmVhbSA9IHJlcXVpcmUoIi4vc3RyZWFtLmpzIik7CisKK3ZhciBCVUlMVF9JTl9DTUFQUyA9IFsiQWRvYmUtR0IxLVVDUzIiLCAiQWRvYmUtQ05TMS1VQ1MyIiwgIkFkb2JlLUphcGFuMS1VQ1MyIiwgIkFkb2JlLUtvcmVhMS1VQ1MyIiwgIjc4LUVVQy1IIiwgIjc4LUVVQy1WIiwgIjc4LUgiLCAiNzgtUktTSi1IIiwgIjc4LVJLU0otViIsICI3OC1WIiwgIjc4bXMtUktTSi1IIiwgIjc4bXMtUktTSi1WIiwgIjgzcHYtUktTSi1IIiwgIjkwbXMtUktTSi1IIiwgIjkwbXMtUktTSi1WIiwgIjkwbXNwLVJLU0otSCIsICI5MG1zcC1SS1NKLVYiLCAiOTBwdi1SS1NKLUgiLCAiOTBwdi1SS1NKLVYiLCAiQWRkLUgiLCAiQWRkLVJLU0otSCIsICJBZGQtUktTSi1WIiwgIkFkZC1WIiwgIkFkb2JlLUNOUzEtMCIsICJBZG9iZS1DTlMxLTEiLCAiQWRvYmUtQ05TMS0yIiwgIkFkb2JlLUNOUzEtMyIsICJBZG9iZS1DTlMxLTQiLCAiQWRvYmUtQ05TMS01IiwgIkFkb2JlLUNOUzEtNiIsICJBZG9iZS1HQjEtMCIsICJBZG9iZS1HQjEtMSIsICJBZG9iZS1HQjEtMiIsICJBZG9iZS1HQjEtMyIsICJBZG9iZS1HQjEtNCIsICJBZG9iZS1HQjEtNSIsICJBZG9iZS1KYXBhbjEtMCIsICJBZG9iZS1KYXBhbjEtMSIsICJBZG9iZS1KYXBhbjEtMiIsICJBZG9iZS1KYXBhbjEtMyIsICJBZG9iZS1KYXBhbjEtNCIsICJBZG9iZS1KYXBhbjEtNSIsICJBZG9iZS1KYXBhbjEtNiIsICJBZG9iZS1Lb3JlYTEtMCIsICJBZG9iZS1Lb3JlYTEtMSIsICJBZG9iZS1Lb3JlYTEtMiIsICJCNS1IIiwgIkI1LVYiLCAiQjVwYy1IIiwgIkI1cGMtViIsICJDTlMtRVVDLUgiLCAiQ05TLUVVQy1WIiwgIkNOUzEtSCIsICJDTlMxLVYiLCAiQ05TMi1IIiwgIkNOUzItViIsICJFVEhLLUI1LUgiLCAiRVRISy1CNS1WIiwgIkVUZW4tQjUtSCIsICJFVGVuLUI1LVYiLCAiRVRlbm1zLUI1LUgiLCAiRVRlbm1zLUI1LVYiLCAiRVVDLUgiLCAiRVVDLVYiLCAiRXh0LUgiLCAiRXh0LVJLU0otSCIsICJFeHQtUktTSi1WIiwgIkV4dC1WIiwgIkdCLUVVQy1IIiwgIkdCLUVVQy1WIiwgIkdCLUgiLCAiR0ItViIsICJHQkstRVVDLUgiLCAiR0JLLUVVQy1WIiwgIkdCSzJLLUgiLCAiR0JLMkstViIsICJHQktwLUVVQy1IIiwgIkdCS3AtRVVDLVYiLCAiR0JULUVVQy1IIiwgIkdCVC1FVUMtViIsICJHQlQtSCIsICJHQlQtViIsICJHQlRwYy1FVUMtSCIsICJHQlRwYy1FVUMtViIsICJHQnBjLUVVQy1IIiwgIkdCcGMtRVVDLVYiLCAiSCIsICJIS2RsYS1CNS1IIiwgIkhLZGxhLUI1LVYiLCAiSEtkbGItQjUtSCIsICJIS2RsYi1CNS1WIiwgIkhLZ2Njcy1CNS1IIiwgIkhLZ2Njcy1CNS1WIiwgIkhLbTMxNC1CNS1IIiwgIkhLbTMxNC1CNS1WIiwgIkhLbTQ3MS1CNS1IIiwgIkhLbTQ3MS1CNS1WIiwgIkhLc2NzLUI1LUgiLCAiSEtzY3MtQjUtViIsICJIYW5rYWt1IiwgIkhpcmFnYW5hIiwgIktTQy1FVUMtSCIsICJLU0MtRVVDLVYiLCAiS1NDLUgiLCAiS1NDLUpvaGFiLUgiLCAiS1NDLUpvaGFiLVYiLCAiS1NDLVYiLCAiS1NDbXMtVUhDLUgiLCAiS1NDbXMtVUhDLUhXLUgiLCAiS1NDbXMtVUhDLUhXLVYiLCAiS1NDbXMtVUhDLVYiLCAiS1NDcGMtRVVDLUgiLCAiS1NDcGMtRVVDLVYiLCAiS2F0YWthbmEiLCAiTldQLUgiLCAiTldQLVYiLCAiUktTSi1IIiwgIlJLU0otViIsICJSb21hbiIsICJVbmlDTlMtVUNTMi1IIiwgIlVuaUNOUy1VQ1MyLVYiLCAiVW5pQ05TLVVURjE2LUgiLCAiVW5pQ05TLVVURjE2LVYiLCAiVW5pQ05TLVVURjMyLUgiLCAiVW5pQ05TLVVURjMyLVYiLCAiVW5pQ05TLVVURjgtSCIsICJVbmlDTlMtVVRGOC1WIiwgIlVuaUdCLVVDUzItSCIsICJVbmlHQi1VQ1MyLVYiLCAiVW5pR0ItVVRGMTYtSCIsICJVbmlHQi1VVEYxNi1WIiwgIlVuaUdCLVVURjMyLUgiLCAiVW5pR0ItVVRGMzItViIsICJVbmlHQi1VVEY4LUgiLCAiVW5pR0ItVVRGOC1WIiwgIlVuaUpJUy1VQ1MyLUgiLCAiVW5pSklTLVVDUzItSFctSCIsICJVbmlKSVMtVUNTMi1IVy1WIiwgIlVuaUpJUy1VQ1MyLVYiLCAiVW5pSklTLVVURjE2LUgiLCAiVW5pSklTLVVURjE2LVYiLCAiVW5pSklTLVVURjMyLUgiLCAiVW5pSklTLVVURjMyLVYiLCAiVW5pSklTLVVURjgtSCIsICJVbmlKSVMtVVRGOC1WIiwgIlVuaUpJUzIwMDQtVVRGMTYtSCIsICJVbmlKSVMyMDA0LVVURjE2LVYiLCAiVW5pSklTMjAwNC1VVEYzMi1IIiwgIlVuaUpJUzIwMDQtVVRGMzItViIsICJVbmlKSVMyMDA0LVVURjgtSCIsICJVbmlKSVMyMDA0LVVURjgtViIsICJVbmlKSVNQcm8tVUNTMi1IVy1WIiwgIlVuaUpJU1Byby1VQ1MyLVYiLCAiVW5pSklTUHJvLVVURjgtViIsICJVbmlKSVNYMDIxMy1VVEYzMi1IIiwgIlVuaUpJU1gwMjEzLVVURjMyLVYiLCAiVW5pSklTWDAyMTMyMDA0LVVURjMyLUgiLCAiVW5pSklTWDAyMTMyMDA0LVVURjMyLVYiLCAiVW5pS1MtVUNTMi1IIiwgIlVuaUtTLVVDUzItViIsICJVbmlLUy1VVEYxNi1IIiwgIlVuaUtTLVVURjE2LVYiLCAiVW5pS1MtVVRGMzItSCIsICJVbmlLUy1VVEYzMi1WIiwgIlVuaUtTLVVURjgtSCIsICJVbmlLUy1VVEY4LVYiLCAiViIsICJXUC1TeW1ib2wiXTsKK2NvbnN0IE1BWF9NQVBfUkFOR0UgPSAyICoqIDI0IC0gMTsKKworY2xhc3MgQ01hcCB7CisgIGNvbnN0cnVjdG9yKGJ1aWx0SW5DTWFwID0gZmFsc2UpIHsKKyAgICB0aGlzLmNvZGVzcGFjZVJhbmdlcyA9IFtbXSwgW10sIFtdLCBbXV07CisgICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMgPSAwOworICAgIHRoaXMuX21hcCA9IFtdOworICAgIHRoaXMubmFtZSA9ICIiOworICAgIHRoaXMudmVydGljYWwgPSBmYWxzZTsKKyAgICB0aGlzLnVzZUNNYXAgPSBudWxsOworICAgIHRoaXMuYnVpbHRJbkNNYXAgPSBidWlsdEluQ01hcDsKKyAgfQorCisgIGFkZENvZGVzcGFjZVJhbmdlKG4sIGxvdywgaGlnaCkgeworICAgIHRoaXMuY29kZXNwYWNlUmFuZ2VzW24gLSAxXS5wdXNoKGxvdywgaGlnaCk7CisgICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMrKzsKKyAgfQorCisgIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CisgICAgaWYgKGhpZ2ggLSBsb3cgPiBNQVhfTUFQX1JBTkdFKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcENpZFJhbmdlIC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpOworICAgIH0KKworICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgeworICAgICAgdGhpcy5fbWFwW2xvdysrXSA9IGRzdExvdysrOworICAgIH0KKyAgfQorCisgIG1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKKyAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKKyAgICB9CisKKyAgICB2YXIgbGFzdEJ5dGUgPSBkc3RMb3cubGVuZ3RoIC0gMTsKKworICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgeworICAgICAgdGhpcy5fbWFwW2xvdysrXSA9IGRzdExvdzsKKyAgICAgIGRzdExvdyA9IGRzdExvdy5zdWJzdHJpbmcoMCwgbGFzdEJ5dGUpICsgU3RyaW5nLmZyb21DaGFyQ29kZShkc3RMb3cuY2hhckNvZGVBdChsYXN0Qnl0ZSkgKyAxKTsKKyAgICB9CisgIH0KKworICBtYXBCZlJhbmdlVG9BcnJheShsb3csIGhpZ2gsIGFycmF5KSB7CisgICAgaWYgKGhpZ2ggLSBsb3cgPiBNQVhfTUFQX1JBTkdFKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpOworICAgIH0KKworICAgIGNvbnN0IGlpID0gYXJyYXkubGVuZ3RoOworICAgIGxldCBpID0gMDsKKworICAgIHdoaWxlIChsb3cgPD0gaGlnaCAmJiBpIDwgaWkpIHsKKyAgICAgIHRoaXMuX21hcFtsb3ddID0gYXJyYXlbaSsrXTsKKyAgICAgICsrbG93OworICAgIH0KKyAgfQorCisgIG1hcE9uZShzcmMsIGRzdCkgeworICAgIHRoaXMuX21hcFtzcmNdID0gZHN0OworICB9CisKKyAgbG9va3VwKGNvZGUpIHsKKyAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdOworICB9CisKKyAgY29udGFpbnMoY29kZSkgeworICAgIHJldHVybiB0aGlzLl9tYXBbY29kZV0gIT09IHVuZGVmaW5lZDsKKyAgfQorCisgIGZvckVhY2goY2FsbGJhY2spIHsKKyAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7CisgICAgY29uc3QgbGVuZ3RoID0gbWFwLmxlbmd0aDsKKworICAgIGlmIChsZW5ndGggPD0gMHgxMDAwMCkgeworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAobWFwW2ldICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBjYWxsYmFjayhpLCBtYXBbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoY29uc3QgaSBpbiBtYXApIHsKKyAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjaGFyQ29kZU9mKHZhbHVlKSB7CisgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwOworCisgICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkgeworICAgICAgcmV0dXJuIG1hcC5pbmRleE9mKHZhbHVlKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgeworICAgICAgaWYgKG1hcFtjaGFyQ29kZV0gPT09IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZ2V0TWFwKCkgeworICAgIHJldHVybiB0aGlzLl9tYXA7CisgIH0KKworICByZWFkQ2hhckNvZGUoc3RyLCBvZmZzZXQsIG91dCkgeworICAgIGxldCBjID0gMDsKKyAgICBjb25zdCBjb2Rlc3BhY2VSYW5nZXMgPSB0aGlzLmNvZGVzcGFjZVJhbmdlczsKKworICAgIGZvciAobGV0IG4gPSAwLCBubiA9IGNvZGVzcGFjZVJhbmdlcy5sZW5ndGg7IG4gPCBubjsgbisrKSB7CisgICAgICBjID0gKGMgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KG9mZnNldCArIG4pKSA+Pj4gMDsKKyAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOworCisgICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKKyAgICAgICAgY29uc3QgbG93ID0gY29kZXNwYWNlUmFuZ2VbaysrXTsKKyAgICAgICAgY29uc3QgaGlnaCA9IGNvZGVzcGFjZVJhbmdlW2srK107CisKKyAgICAgICAgaWYgKGMgPj0gbG93ICYmIGMgPD0gaGlnaCkgeworICAgICAgICAgIG91dC5jaGFyY29kZSA9IGM7CisgICAgICAgICAgb3V0Lmxlbmd0aCA9IG4gKyAxOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG91dC5jaGFyY29kZSA9IDA7CisgICAgb3V0Lmxlbmd0aCA9IDE7CisgIH0KKworICBnZXQgbGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9tYXAubGVuZ3RoOworICB9CisKKyAgZ2V0IGlzSWRlbnRpdHlDTWFwKCkgeworICAgIGlmICghKHRoaXMubmFtZSA9PT0gIklkZW50aXR5LUgiIHx8IHRoaXMubmFtZSA9PT0gIklkZW50aXR5LVYiKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh0aGlzLl9tYXAubGVuZ3RoICE9PSAweDEwMDAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAweDEwMDAwOyBpKyspIHsKKyAgICAgIGlmICh0aGlzLl9tYXBbaV0gIT09IGkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKK30KKworZXhwb3J0cy5DTWFwID0gQ01hcDsKKworY2xhc3MgSWRlbnRpdHlDTWFwIGV4dGVuZHMgQ01hcCB7CisgIGNvbnN0cnVjdG9yKHZlcnRpY2FsLCBuKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLnZlcnRpY2FsID0gdmVydGljYWw7CisgICAgdGhpcy5hZGRDb2Rlc3BhY2VSYW5nZShuLCAwLCAweGZmZmYpOworICB9CisKKyAgbWFwQ2lkUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2UiKTsKKyAgfQorCisgIG1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZSIpOworICB9CisKKyAgbWFwQmZSYW5nZVRvQXJyYXkobG93LCBoaWdoLCBhcnJheSkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlVG9BcnJheSIpOworICB9CisKKyAgbWFwT25lKHNyYywgZHN0KSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcENpZE9uZSIpOworICB9CisKKyAgbG9va3VwKGNvZGUpIHsKKyAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2RlKSAmJiBjb2RlIDw9IDB4ZmZmZiA/IGNvZGUgOiB1bmRlZmluZWQ7CisgIH0KKworICBjb250YWlucyhjb2RlKSB7CisgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29kZSkgJiYgY29kZSA8PSAweGZmZmY7CisgIH0KKworICBmb3JFYWNoKGNhbGxiYWNrKSB7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMHhmZmZmOyBpKyspIHsKKyAgICAgIGNhbGxiYWNrKGksIGkpOworICAgIH0KKyAgfQorCisgIGNoYXJDb2RlT2YodmFsdWUpIHsKKyAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPD0gMHhmZmZmID8gdmFsdWUgOiAtMTsKKyAgfQorCisgIGdldE1hcCgpIHsKKyAgICBjb25zdCBtYXAgPSBuZXcgQXJyYXkoMHgxMDAwMCk7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAweGZmZmY7IGkrKykgeworICAgICAgbWFwW2ldID0gaTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFwOworICB9CisKKyAgZ2V0IGxlbmd0aCgpIHsKKyAgICByZXR1cm4gMHgxMDAwMDsKKyAgfQorCisgIGdldCBpc0lkZW50aXR5Q01hcCgpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGFjY2VzcyAuaXNJZGVudGl0eUNNYXAiKTsKKyAgfQorCit9CisKK2V4cG9ydHMuSWRlbnRpdHlDTWFwID0gSWRlbnRpdHlDTWFwOworCit2YXIgQmluYXJ5Q01hcFJlYWRlciA9IGZ1bmN0aW9uIEJpbmFyeUNNYXBSZWFkZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiBoZXhUb0ludChhLCBzaXplKSB7CisgICAgdmFyIG4gPSAwOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7CisgICAgICBuID0gbiA8PCA4IHwgYVtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gbiA+Pj4gMDsKKyAgfQorCisgIGZ1bmN0aW9uIGhleFRvU3RyKGEsIHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PT0gMSkgeworICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYVswXSwgYVsxXSk7CisgICAgfQorCisgICAgaWYgKHNpemUgPT09IDMpIHsKKyAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pOworICAgIH0KKworICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGEuc3ViYXJyYXkoMCwgc2l6ZSArIDEpKTsKKyAgfQorCisgIGZ1bmN0aW9uIGFkZEhleChhLCBiLCBzaXplKSB7CisgICAgdmFyIGMgPSAwOworCisgICAgZm9yICh2YXIgaSA9IHNpemU7IGkgPj0gMDsgaS0tKSB7CisgICAgICBjICs9IGFbaV0gKyBiW2ldOworICAgICAgYVtpXSA9IGMgJiAyNTU7CisgICAgICBjID4+PSA4OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGluY0hleChhLCBzaXplKSB7CisgICAgdmFyIGMgPSAxOworCisgICAgZm9yICh2YXIgaSA9IHNpemU7IGkgPj0gMCAmJiBjID4gMDsgaS0tKSB7CisgICAgICBjICs9IGFbaV07CisgICAgICBhW2ldID0gYyAmIDI1NTsKKyAgICAgIGMgPj49IDg7CisgICAgfQorICB9CisKKyAgdmFyIE1BWF9OVU1fU0laRSA9IDE2OworICB2YXIgTUFYX0VOQ09ERURfTlVNX1NJWkUgPSAxOTsKKworICBmdW5jdGlvbiBCaW5hcnlDTWFwU3RyZWFtKGRhdGEpIHsKKyAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7CisgICAgdGhpcy5wb3MgPSAwOworICAgIHRoaXMuZW5kID0gZGF0YS5sZW5ndGg7CisgICAgdGhpcy50bXBCdWYgPSBuZXcgVWludDhBcnJheShNQVhfRU5DT0RFRF9OVU1fU0laRSk7CisgIH0KKworICBCaW5hcnlDTWFwU3RyZWFtLnByb3RvdHlwZSA9IHsKKyAgICByZWFkQnl0ZSgpIHsKKyAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmVuZCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXTsKKyAgICB9LAorCisgICAgcmVhZE51bWJlcigpIHsKKyAgICAgIHZhciBuID0gMDsKKyAgICAgIHZhciBsYXN0OworCisgICAgICBkbyB7CisgICAgICAgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpOworCisgICAgICAgIGlmIChiIDwgMCkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3QgPSAhKGIgJiAweDgwKTsKKyAgICAgICAgbiA9IG4gPDwgNyB8IGIgJiAweDdmOworICAgICAgfSB3aGlsZSAoIWxhc3QpOworCisgICAgICByZXR1cm4gbjsKKyAgICB9LAorCisgICAgcmVhZFNpZ25lZCgpIHsKKyAgICAgIHZhciBuID0gdGhpcy5yZWFkTnVtYmVyKCk7CisgICAgICByZXR1cm4gbiAmIDEgPyB+KG4gPj4+IDEpIDogbiA+Pj4gMTsKKyAgICB9LAorCisgICAgcmVhZEhleChudW0sIHNpemUpIHsKKyAgICAgIG51bS5zZXQodGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3MsIHRoaXMucG9zICsgc2l6ZSArIDEpKTsKKyAgICAgIHRoaXMucG9zICs9IHNpemUgKyAxOworICAgIH0sCisKKyAgICByZWFkSGV4TnVtYmVyKG51bSwgc2l6ZSkgeworICAgICAgdmFyIGxhc3Q7CisgICAgICB2YXIgc3RhY2sgPSB0aGlzLnRtcEJ1ZiwKKyAgICAgICAgICBzcCA9IDA7CisKKyAgICAgIGRvIHsKKyAgICAgICAgdmFyIGIgPSB0aGlzLnJlYWRCeXRlKCk7CisKKyAgICAgICAgaWYgKGIgPCAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJ1bmV4cGVjdGVkIEVPRiBpbiBiY21hcCIpOworICAgICAgICB9CisKKyAgICAgICAgbGFzdCA9ICEoYiAmIDB4ODApOworICAgICAgICBzdGFja1tzcCsrXSA9IGIgJiAweDdmOworICAgICAgfSB3aGlsZSAoIWxhc3QpOworCisgICAgICB2YXIgaSA9IHNpemUsCisgICAgICAgICAgYnVmZmVyID0gMCwKKyAgICAgICAgICBidWZmZXJTaXplID0gMDsKKworICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IDggJiYgc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgIGJ1ZmZlciA9IHN0YWNrWy0tc3BdIDw8IGJ1ZmZlclNpemUgfCBidWZmZXI7CisgICAgICAgICAgYnVmZmVyU2l6ZSArPSA3OworICAgICAgICB9CisKKyAgICAgICAgbnVtW2ldID0gYnVmZmVyICYgMjU1OworICAgICAgICBpLS07CisgICAgICAgIGJ1ZmZlciA+Pj0gODsKKyAgICAgICAgYnVmZmVyU2l6ZSAtPSA4OworICAgICAgfQorICAgIH0sCisKKyAgICByZWFkSGV4U2lnbmVkKG51bSwgc2l6ZSkgeworICAgICAgdGhpcy5yZWFkSGV4TnVtYmVyKG51bSwgc2l6ZSk7CisgICAgICB2YXIgc2lnbiA9IG51bVtzaXplXSAmIDEgPyAyNTUgOiAwOworICAgICAgdmFyIGMgPSAwOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzaXplOyBpKyspIHsKKyAgICAgICAgYyA9IChjICYgMSkgPDwgOCB8IG51bVtpXTsKKyAgICAgICAgbnVtW2ldID0gYyA+PiAxIF4gc2lnbjsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVhZFN0cmluZygpIHsKKyAgICAgIHZhciBsZW4gPSB0aGlzLnJlYWROdW1iZXIoKTsKKyAgICAgIHZhciBzID0gIiI7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMucmVhZE51bWJlcigpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gcHJvY2Vzc0JpbmFyeUNNYXAoZGF0YSwgY01hcCwgZXh0ZW5kKSB7CisgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgQmluYXJ5Q01hcFN0cmVhbShkYXRhKTsKKyAgICAgIHZhciBoZWFkZXIgPSBzdHJlYW0ucmVhZEJ5dGUoKTsKKyAgICAgIGNNYXAudmVydGljYWwgPSAhIShoZWFkZXIgJiAxKTsKKyAgICAgIHZhciB1c2VDTWFwID0gbnVsbDsKKyAgICAgIHZhciBzdGFydCA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7CisgICAgICB2YXIgZW5kID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKKyAgICAgIHZhciBjaGFyID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKKyAgICAgIHZhciBjaGFyQ29kZSA9IG5ldyBVaW50OEFycmF5KE1BWF9OVU1fU0laRSk7CisgICAgICB2YXIgdG1wID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKKyAgICAgIHZhciBjb2RlOworICAgICAgdmFyIGI7CisKKyAgICAgIHdoaWxlICgoYiA9IHN0cmVhbS5yZWFkQnl0ZSgpKSA+PSAwKSB7CisgICAgICAgIHZhciB0eXBlID0gYiA+PiA1OworCisgICAgICAgIGlmICh0eXBlID09PSA3KSB7CisgICAgICAgICAgc3dpdGNoIChiICYgMHgxZikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBzdHJlYW0ucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICB1c2VDTWFwID0gc3RyZWFtLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc2VxdWVuY2UgPSAhIShiICYgMHgxMCk7CisgICAgICAgIHZhciBkYXRhU2l6ZSA9IGIgJiAxNTsKKworICAgICAgICBpZiAoZGF0YVNpemUgKyAxID4gTUFYX05VTV9TSVpFKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzQmluYXJ5Q01hcDogSW52YWxpZCBkYXRhU2l6ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB1Y3MyRGF0YVNpemUgPSAxOworICAgICAgICB2YXIgc3ViaXRlbXNDb3VudCA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CisgICAgICAgIHZhciBpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBjTWFwLmFkZENvZGVzcGFjZVJhbmdlKGRhdGFTaXplICsgMSwgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSkpOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGluY0hleChlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgYWRkSGV4KHN0YXJ0LCBlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGNNYXAuYWRkQ29kZXNwYWNlUmFuZ2UoZGF0YVNpemUgKyAxLCBoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBjb2RlID0gc3RyZWFtLnJlYWROdW1iZXIoKTsKKyAgICAgICAgICAgIGNNYXAubWFwT25lKGhleFRvSW50KGNoYXIsIGRhdGFTaXplKSwgY29kZSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgaW5jSGV4KGNoYXIsIGRhdGFTaXplKTsKKworICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIodG1wLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkSGV4KGNoYXIsIHRtcCwgZGF0YVNpemUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkU2lnbmVkKCkgKyAoY29kZSArIDEpOworICAgICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBjb2RlID0gc3RyZWFtLnJlYWROdW1iZXIoKTsKKyAgICAgICAgICAgIGNNYXAubWFwQ2lkUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSksIGNvZGUpOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGluY0hleChlbmQsIGRhdGFTaXplKTsKKworICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoc3RhcnQsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0LnNldChlbmQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOworICAgICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLCBjb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyLCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhckNvZGUsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIGNNYXAubWFwT25lKGhleFRvSW50KGNoYXIsIHVjczJEYXRhU2l6ZSksIGhleFRvU3RyKGNoYXJDb2RlLCBkYXRhU2l6ZSkpOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgIGluY0hleChjaGFyLCB1Y3MyRGF0YVNpemUpOworCisgICAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcih0bXAsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkSGV4KGNoYXIsIHRtcCwgdWNzMkRhdGFTaXplKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGluY0hleChjaGFyQ29kZSwgZGF0YVNpemUpOworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleFNpZ25lZCh0bXAsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgYWRkSGV4KGNoYXJDb2RlLCB0bXAsIGRhdGFTaXplKTsKKyAgICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICBhZGRIZXgoZW5kLCBzdGFydCwgdWNzMkRhdGFTaXplKTsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXJDb2RlLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgaW5jSGV4KGVuZCwgdWNzMkRhdGFTaXplKTsKKworICAgICAgICAgICAgICBpZiAoIXNlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoc3RhcnQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgYWRkSGV4KHN0YXJ0LCBlbmQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CisgICAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOworICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOworICAgICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoInByb2Nlc3NCaW5hcnlDTWFwOiBVbmtub3duIHR5cGU6ICIgKyB0eXBlKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHVzZUNNYXApIHsKKyAgICAgICAgcmVzb2x2ZShleHRlbmQodXNlQ01hcCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHJlc29sdmUoY01hcCk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBCaW5hcnlDTWFwUmVhZGVyKCkge30KKworICBCaW5hcnlDTWFwUmVhZGVyLnByb3RvdHlwZSA9IHsKKyAgICBwcm9jZXNzOiBwcm9jZXNzQmluYXJ5Q01hcAorICB9OworICByZXR1cm4gQmluYXJ5Q01hcFJlYWRlcjsKK30oKTsKKwordmFyIENNYXBGYWN0b3J5ID0gZnVuY3Rpb24gQ01hcEZhY3RvcnlDbG9zdXJlKCkgeworICBmdW5jdGlvbiBzdHJUb0ludChzdHIpIHsKKyAgICB2YXIgYSA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworICAgICAgYSA9IGEgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkpOworICAgIH0KKworICAgIHJldHVybiBhID4+PiAwOworICB9CisKKyAgZnVuY3Rpb24gZXhwZWN0U3RyaW5nKG9iaikgeworICAgIGlmICghKDAsIF91dGlsLmlzU3RyaW5nKShvYmopKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBzdHJpbmcuIik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZXhwZWN0SW50KG9iaikgeworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBpbnQuIik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VCZkNoYXIoY01hcCwgbGV4ZXIpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKShvYmopKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJlbmRiZmNoYXIiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIHNyYyA9IHN0clRvSW50KG9iaik7CisgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIGRzdCA9IG9iajsKKyAgICAgIGNNYXAubWFwT25lKHNyYywgZHN0KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUJmUmFuZ2UoY01hcCwgbGV4ZXIpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKShvYmopKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJlbmRiZnJhbmdlIikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBsb3cgPSBzdHJUb0ludChvYmopOworICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisgICAgICBleHBlY3RTdHJpbmcob2JqKTsKKyAgICAgIHZhciBoaWdoID0gc3RyVG9JbnQob2JqKTsKKyAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopIHx8ICgwLCBfdXRpbC5pc1N0cmluZykob2JqKSkgeworICAgICAgICB2YXIgZHN0TG93ID0gTnVtYmVyLmlzSW50ZWdlcihvYmopID8gU3RyaW5nLmZyb21DaGFyQ29kZShvYmopIDogb2JqOworICAgICAgICBjTWFwLm1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpOworICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgIlsiKSkgeworICAgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgICAgd2hpbGUgKCEoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgIl0iKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRU9GKShvYmopKSB7CisgICAgICAgICAgYXJyYXkucHVzaChvYmopOworICAgICAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOworICAgICAgICB9CisKKyAgICAgICAgY01hcC5tYXBCZlJhbmdlVG9BcnJheShsb3csIGhpZ2gsIGFycmF5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBiZiByYW5nZS4iKTsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlQ2lkQ2hhcihjTWFwLCBsZXhlcikgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKG9iaikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgImVuZGNpZGNoYXIiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIHNyYyA9IHN0clRvSW50KG9iaik7CisgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgIGV4cGVjdEludChvYmopOworICAgICAgdmFyIGRzdCA9IG9iajsKKyAgICAgIGNNYXAubWFwT25lKHNyYywgZHN0KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAiZW5kY2lkcmFuZ2UiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIGxvdyA9IHN0clRvSW50KG9iaik7CisgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKKyAgICAgIGV4cGVjdFN0cmluZyhvYmopOworICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopOworICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisgICAgICBleHBlY3RJbnQob2JqKTsKKyAgICAgIHZhciBkc3RMb3cgPSBvYmo7CisgICAgICBjTWFwLm1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUNvZGVzcGFjZVJhbmdlKGNNYXAsIGxleGVyKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBvYmogPSBsZXhlci5nZXRPYmooKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAiZW5kY29kZXNwYWNlcmFuZ2UiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICghKDAsIF91dGlsLmlzU3RyaW5nKShvYmopKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB2YXIgbG93ID0gc3RyVG9JbnQob2JqKTsKKyAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICBpZiAoISgwLCBfdXRpbC5pc1N0cmluZykob2JqKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdmFyIGhpZ2ggPSBzdHJUb0ludChvYmopOworICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShvYmoubGVuZ3RoLCBsb3csIGhpZ2gpOworICAgIH0KKworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBjb2Rlc3BhY2UgcmFuZ2UuIik7CisgIH0KKworICBmdW5jdGlvbiBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKSB7CisgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSkgeworICAgICAgY01hcC52ZXJ0aWNhbCA9ICEhb2JqOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlQ01hcE5hbWUoY01hcCwgbGV4ZXIpIHsKKyAgICB2YXIgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkob2JqKSAmJiAoMCwgX3V0aWwuaXNTdHJpbmcpKG9iai5uYW1lKSkgeworICAgICAgY01hcC5uYW1lID0gb2JqLm5hbWU7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcGFyc2VDTWFwKGNNYXAsIGxleGVyLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7CisgICAgdmFyIHByZXZpb3VzOworICAgIHZhciBlbWJlZGRlZFVzZUNNYXA7CisKKyAgICBvYmpMb29wOiB3aGlsZSAodHJ1ZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgdmFyIG9iaiA9IGxleGVyLmdldE9iaigpOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKG9iaikpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShvYmopKSB7CisgICAgICAgICAgaWYgKG9iai5uYW1lID09PSAiV01vZGUiKSB7CisgICAgICAgICAgICBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKG9iai5uYW1lID09PSAiQ01hcE5hbWUiKSB7CisgICAgICAgICAgICBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcmV2aW91cyA9IG9iajsKKyAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaikpIHsKKyAgICAgICAgICBzd2l0Y2ggKG9iai5jbWQpIHsKKyAgICAgICAgICAgIGNhc2UgImVuZGNtYXAiOgorICAgICAgICAgICAgICBicmVhayBvYmpMb29wOworCisgICAgICAgICAgICBjYXNlICJ1c2VjbWFwIjoKKyAgICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHByZXZpb3VzKSkgeworICAgICAgICAgICAgICAgIGVtYmVkZGVkVXNlQ01hcCA9IHByZXZpb3VzLm5hbWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYmVnaW5jb2Rlc3BhY2VyYW5nZSI6CisgICAgICAgICAgICAgIHBhcnNlQ29kZXNwYWNlUmFuZ2UoY01hcCwgbGV4ZXIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYmVnaW5iZmNoYXIiOgorICAgICAgICAgICAgICBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJiZWdpbmNpZGNoYXIiOgorICAgICAgICAgICAgICBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiYmVnaW5iZnJhbmdlIjoKKyAgICAgICAgICAgICAgcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgImJlZ2luY2lkcmFuZ2UiOgorICAgICAgICAgICAgICBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGNNYXAgZGF0YTogIiArIGV4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCF1c2VDTWFwICYmIGVtYmVkZGVkVXNlQ01hcCkgeworICAgICAgdXNlQ01hcCA9IGVtYmVkZGVkVXNlQ01hcDsKKyAgICB9CisKKyAgICBpZiAodXNlQ01hcCkgeworICAgICAgcmV0dXJuIGV4dGVuZENNYXAoY01hcCwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCk7CisgICAgfQorCisgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjTWFwKTsKKyAgfQorCisgIGZ1bmN0aW9uIGV4dGVuZENNYXAoY01hcCwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkgeworICAgIHJldHVybiBjcmVhdGVCdWlsdEluQ01hcCh1c2VDTWFwLCBmZXRjaEJ1aWx0SW5DTWFwKS50aGVuKGZ1bmN0aW9uIChuZXdDTWFwKSB7CisgICAgICBjTWFwLnVzZUNNYXAgPSBuZXdDTWFwOworCisgICAgICBpZiAoY01hcC5udW1Db2Rlc3BhY2VSYW5nZXMgPT09IDApIHsKKyAgICAgICAgdmFyIHVzZUNvZGVzcGFjZVJhbmdlcyA9IGNNYXAudXNlQ01hcC5jb2Rlc3BhY2VSYW5nZXM7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1c2VDb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBjTWFwLmNvZGVzcGFjZVJhbmdlc1tpXSA9IHVzZUNvZGVzcGFjZVJhbmdlc1tpXS5zbGljZSgpOworICAgICAgICB9CisKKyAgICAgICAgY01hcC5udW1Db2Rlc3BhY2VSYW5nZXMgPSBjTWFwLnVzZUNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzOworICAgICAgfQorCisgICAgICBjTWFwLnVzZUNNYXAuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgICBpZiAoIWNNYXAuY29udGFpbnMoa2V5KSkgeworICAgICAgICAgIGNNYXAubWFwT25lKGtleSwgY01hcC51c2VDTWFwLmxvb2t1cChrZXkpKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gY01hcDsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKG5hbWUsIGZldGNoQnVpbHRJbkNNYXApIHsKKyAgICBpZiAobmFtZSA9PT0gIklkZW50aXR5LUgiKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBJZGVudGl0eUNNYXAoZmFsc2UsIDIpKTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICJJZGVudGl0eS1WIikgeworICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgSWRlbnRpdHlDTWFwKHRydWUsIDIpKTsKKyAgICB9CisKKyAgICBpZiAoIUJVSUxUX0lOX0NNQVBTLmluY2x1ZGVzKG5hbWUpKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJVbmtub3duIENNYXAgbmFtZTogIiArIG5hbWUpKTsKKyAgICB9CisKKyAgICBpZiAoIWZldGNoQnVpbHRJbkNNYXApIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkJ1aWx0LWluIENNYXAgcGFyYW1ldGVycyBhcmUgbm90IHByb3ZpZGVkLiIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmV0Y2hCdWlsdEluQ01hcChuYW1lKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICB2YXIgY01hcERhdGEgPSBkYXRhLmNNYXBEYXRhLAorICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSA9IGRhdGEuY29tcHJlc3Npb25UeXBlOworICAgICAgdmFyIGNNYXAgPSBuZXcgQ01hcCh0cnVlKTsKKworICAgICAgaWYgKGNvbXByZXNzaW9uVHlwZSA9PT0gX3V0aWwuQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlDTWFwUmVhZGVyKCkucHJvY2VzcyhjTWFwRGF0YSwgY01hcCwgZnVuY3Rpb24gKHVzZUNNYXApIHsKKyAgICAgICAgICByZXR1cm4gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmIChjb21wcmVzc2lvblR5cGUgPT09IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORSkgeworICAgICAgICB2YXIgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihuZXcgX3N0cmVhbS5TdHJlYW0oY01hcERhdGEpKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgbnVsbCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIlRPRE86IE9ubHkgQklOQVJZL05PTkUgQ01hcCBjb21wcmVzc2lvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLiIpKTsKKyAgICB9KTsKKyAgfQorCisgIHJldHVybiB7CisgICAgYXN5bmMgY3JlYXRlKHBhcmFtcykgeworICAgICAgdmFyIGVuY29kaW5nID0gcGFyYW1zLmVuY29kaW5nOworICAgICAgdmFyIGZldGNoQnVpbHRJbkNNYXAgPSBwYXJhbXMuZmV0Y2hCdWlsdEluQ01hcDsKKyAgICAgIHZhciB1c2VDTWFwID0gcGFyYW1zLnVzZUNNYXA7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShlbmNvZGluZykpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKGVuY29kaW5nLm5hbWUsIGZldGNoQnVpbHRJbkNNYXApOworICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGVuY29kaW5nKSkgeworICAgICAgICB2YXIgY01hcCA9IG5ldyBDTWFwKCk7CisgICAgICAgIHZhciBsZXhlciA9IG5ldyBfcGFyc2VyLkxleGVyKGVuY29kaW5nKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkudGhlbihmdW5jdGlvbiAocGFyc2VkQ01hcCkgeworICAgICAgICAgIGlmIChwYXJzZWRDTWFwLmlzSWRlbnRpdHlDTWFwKSB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAocGFyc2VkQ01hcC5uYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gcGFyc2VkQ01hcDsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBFcnJvcigiRW5jb2RpbmcgcmVxdWlyZWQuIik7CisgICAgfQorCisgIH07Cit9KCk7CisKK2V4cG9ydHMuQ01hcEZhY3RvcnkgPSBDTWFwRmFjdG9yeTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9jb2xvcnNwYWNlLmpzIGIvbGliL2NvcmUvY29sb3JzcGFjZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJiMmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvY29sb3JzcGFjZS5qcwpAQCAtMCwwICsxLDEwODMgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkNvbG9yU3BhY2UgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4vcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX2NvcmVfdXRpbHMgPSByZXF1aXJlKCIuL2NvcmVfdXRpbHMuanMiKTsKKworZnVuY3Rpb24gcmVzaXplUmdiSW1hZ2Uoc3JjLCBkZXN0LCB3MSwgaDEsIHcyLCBoMiwgYWxwaGEwMSkgeworICBjb25zdCBDT01QT05FTlRTID0gMzsKKyAgYWxwaGEwMSA9IGFscGhhMDEgIT09IDEgPyAwIDogYWxwaGEwMTsKKyAgY29uc3QgeFJhdGlvID0gdzEgLyB3MjsKKyAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKKyAgbGV0IG5ld0luZGV4ID0gMCwKKyAgICAgIG9sZEluZGV4OworICBjb25zdCB4U2NhbGVkID0gbmV3IFVpbnQxNkFycmF5KHcyKTsKKyAgY29uc3QgdzFTY2FubGluZSA9IHcxICogQ09NUE9ORU5UUzsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKKyAgICB4U2NhbGVkW2ldID0gTWF0aC5mbG9vcihpICogeFJhdGlvKSAqIENPTVBPTkVOVFM7CisgIH0KKworICBmb3IgKGxldCBpID0gMDsgaSA8IGgyOyBpKyspIHsKKyAgICBjb25zdCBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lOworCisgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3MjsgaisrKSB7CisgICAgICBvbGRJbmRleCA9IHB5ICsgeFNjYWxlZFtqXTsKKyAgICAgIGRlc3RbbmV3SW5kZXgrK10gPSBzcmNbb2xkSW5kZXgrK107CisgICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOworICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IHNyY1tvbGRJbmRleCsrXTsKKyAgICAgIG5ld0luZGV4ICs9IGFscGhhMDE7CisgICAgfQorICB9Cit9CisKK2NsYXNzIENvbG9yU3BhY2UgeworICBjb25zdHJ1Y3RvcihuYW1lLCBudW1Db21wcykgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBDb2xvclNwYWNlKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBDb2xvclNwYWNlLiIpOworICAgIH0KKworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5udW1Db21wcyA9IG51bUNvbXBzOworICB9CisKKyAgZ2V0UmdiKHNyYywgc3JjT2Zmc2V0KSB7CisgICAgY29uc3QgcmdiID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpOworICAgIHRoaXMuZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgcmdiLCAwKTsKKyAgICByZXR1cm4gcmdiOworICB9CisKKyAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkl0ZW0iKTsKKyAgfQorCisgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JCdWZmZXIiKTsKKyAgfQorCisgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCIpOworICB9CisKKyAgaXNQYXNzdGhyb3VnaChiaXRzKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CisgICAgcmV0dXJuIENvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgdGhpcy5udW1Db21wcyk7CisgIH0KKworICBmaWxsUmdiKGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpIHsKKyAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsV2lkdGggKiBvcmlnaW5hbEhlaWdodDsKKyAgICBsZXQgcmdiQnVmID0gbnVsbDsKKyAgICBjb25zdCBudW1Db21wb25lbnRDb2xvcnMgPSAxIDw8IGJwYzsKKyAgICBjb25zdCBuZWVkc1Jlc2l6aW5nID0gb3JpZ2luYWxIZWlnaHQgIT09IGhlaWdodCB8fCBvcmlnaW5hbFdpZHRoICE9PSB3aWR0aDsKKworICAgIGlmICh0aGlzLmlzUGFzc3Rocm91Z2goYnBjKSkgeworICAgICAgcmdiQnVmID0gY29tcHM7CisgICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBzID09PSAxICYmIGNvdW50ID4gbnVtQ29tcG9uZW50Q29sb3JzICYmIHRoaXMubmFtZSAhPT0gIkRldmljZUdyYXkiICYmIHRoaXMubmFtZSAhPT0gIkRldmljZVJHQiIpIHsKKyAgICAgIGNvbnN0IGFsbENvbG9ycyA9IGJwYyA8PSA4ID8gbmV3IFVpbnQ4QXJyYXkobnVtQ29tcG9uZW50Q29sb3JzKSA6IG5ldyBVaW50MTZBcnJheShudW1Db21wb25lbnRDb2xvcnMpOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbXBvbmVudENvbG9yczsgaSsrKSB7CisgICAgICAgIGFsbENvbG9yc1tpXSA9IGk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGNvbG9yTWFwID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG51bUNvbXBvbmVudENvbG9ycyAqIDMpOworICAgICAgdGhpcy5nZXRSZ2JCdWZmZXIoYWxsQ29sb3JzLCAwLCBudW1Db21wb25lbnRDb2xvcnMsIGNvbG9yTWFwLCAwLCBicGMsIDApOworCisgICAgICBpZiAoIW5lZWRzUmVzaXppbmcpIHsKKyAgICAgICAgbGV0IGRlc3RQb3MgPSAwOworCisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgIGNvbnN0IGtleSA9IGNvbXBzW2ldICogMzsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXldOworICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleSArIDFdOworICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleSArIDJdOworICAgICAgICAgIGRlc3RQb3MgKz0gYWxwaGEwMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmdiQnVmID0gbmV3IFVpbnQ4QXJyYXkoY291bnQgKiAzKTsKKyAgICAgICAgbGV0IHJnYlBvcyA9IDA7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgY29uc3Qga2V5ID0gY29tcHNbaV0gKiAzOworICAgICAgICAgIHJnYkJ1ZltyZ2JQb3MrK10gPSBjb2xvck1hcFtrZXldOworICAgICAgICAgIHJnYkJ1ZltyZ2JQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTsKKyAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFuZWVkc1Jlc2l6aW5nKSB7CisgICAgICAgIHRoaXMuZ2V0UmdiQnVmZmVyKGNvbXBzLCAwLCB3aWR0aCAqIGFjdHVhbEhlaWdodCwgZGVzdCwgMCwgYnBjLCBhbHBoYTAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShjb3VudCAqIDMpOworICAgICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgY291bnQsIHJnYkJ1ZiwgMCwgYnBjLCAwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmdiQnVmKSB7CisgICAgICBpZiAobmVlZHNSZXNpemluZykgeworICAgICAgICByZXNpemVSZ2JJbWFnZShyZ2JCdWYsIGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhbHBoYTAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxldCBkZXN0UG9zID0gMCwKKyAgICAgICAgICAgIHJnYlBvcyA9IDA7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gd2lkdGggKiBhY3R1YWxIZWlnaHQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdOworICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107CisgICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgZ2V0IHVzZXNaZXJvVG9PbmVSYW5nZSgpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInVzZXNaZXJvVG9PbmVSYW5nZSIsIHRydWUpOworICB9CisKKyAgc3RhdGljIF9jYWNoZShjYWNoZUtleSwgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIHBhcnNlZENvbG9yU3BhY2UpIHsKKyAgICBpZiAoIWxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTsKKyAgICB9CisKKyAgICBpZiAoIXBhcnNlZENvbG9yU3BhY2UpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkQ29sb3JTcGFjZSIgYXJndW1lbnQuJyk7CisgICAgfQorCisgICAgbGV0IGNzTmFtZSwgY3NSZWY7CisKKyAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgIGNzUmVmID0gY2FjaGVLZXk7CisgICAgICBjYWNoZUtleSA9IHhyZWYuZmV0Y2goY2FjaGVLZXkpOworICAgIH0KKworICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKKyAgICAgIGNzTmFtZSA9IGNhY2hlS2V5Lm5hbWU7CisgICAgfQorCisgICAgaWYgKGNzTmFtZSB8fCBjc1JlZikgeworICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0KGNzTmFtZSwgY3NSZWYsIHBhcnNlZENvbG9yU3BhY2UpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBnZXRDYWNoZWQoY2FjaGVLZXksIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CisgICAgaWYgKCFsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xvclNwYWNlLmdldENhY2hlZCAtIGV4cGVjdGVkICJsb2NhbENvbG9yU3BhY2VDYWNoZSIgYXJndW1lbnQuJyk7CisgICAgfQorCisgICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICBjb25zdCBsb2NhbENvbG9yU3BhY2UgPSBsb2NhbENvbG9yU3BhY2VDYWNoZS5nZXRCeVJlZihjYWNoZUtleSk7CisKKyAgICAgIGlmIChsb2NhbENvbG9yU3BhY2UpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsQ29sb3JTcGFjZTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgY2FjaGVLZXkgPSB4cmVmLmZldGNoKGNhY2hlS2V5KTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CisgICAgICBjb25zdCBsb2NhbENvbG9yU3BhY2UgPSBsb2NhbENvbG9yU3BhY2VDYWNoZS5nZXRCeU5hbWUoY2FjaGVLZXkubmFtZSk7CisKKyAgICAgIGlmIChsb2NhbENvbG9yU3BhY2UpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsQ29sb3JTcGFjZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHN0YXRpYyBhc3luYyBwYXJzZUFzeW5jKHsKKyAgICBjcywKKyAgICB4cmVmLAorICAgIHJlc291cmNlcyA9IG51bGwsCisgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgIH0pIHsKKyAgICBjb25zdCBwYXJzZWRDb2xvclNwYWNlID0gdGhpcy5fcGFyc2UoY3MsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKKworICAgIHRoaXMuX2NhY2hlKGNzLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSk7CisKKyAgICByZXR1cm4gcGFyc2VkQ29sb3JTcGFjZTsKKyAgfQorCisgIHN0YXRpYyBwYXJzZSh7CisgICAgY3MsCisgICAgeHJlZiwKKyAgICByZXNvdXJjZXMgPSBudWxsLAorICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICB9KSB7CisgICAgY29uc3QgY2FjaGVkQ29sb3JTcGFjZSA9IHRoaXMuZ2V0Q2FjaGVkKGNzLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisKKyAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkgeworICAgICAgcmV0dXJuIGNhY2hlZENvbG9yU3BhY2U7CisgICAgfQorCisgICAgY29uc3QgcGFyc2VkQ29sb3JTcGFjZSA9IHRoaXMuX3BhcnNlKGNzLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CisKKyAgICB0aGlzLl9jYWNoZShjcywgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIHBhcnNlZENvbG9yU3BhY2UpOworCisgICAgcmV0dXJuIHBhcnNlZENvbG9yU3BhY2U7CisgIH0KKworICBzdGF0aWMgX3BhcnNlKGNzLCB4cmVmLCByZXNvdXJjZXMgPSBudWxsLCBwZGZGdW5jdGlvbkZhY3RvcnkpIHsKKyAgICBjcyA9IHhyZWYuZmV0Y2hJZlJlZihjcyk7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoY3MpKSB7CisgICAgICBzd2l0Y2ggKGNzLm5hbWUpIHsKKyAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CisgICAgICAgIGNhc2UgIkciOgorICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTsKKworICAgICAgICBjYXNlICJEZXZpY2VSR0IiOgorICAgICAgICBjYXNlICJSR0IiOgorICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiOworCisgICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgorICAgICAgICBjYXNlICJDTVlLIjoKKyAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7CisKKyAgICAgICAgY2FzZSAiUGF0dGVybiI6CisgICAgICAgICAgcmV0dXJuIG5ldyBQYXR0ZXJuQ1MobnVsbCk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkocmVzb3VyY2VzKSkgeworICAgICAgICAgICAgY29uc3QgY29sb3JTcGFjZXMgPSByZXNvdXJjZXMuZ2V0KCJDb2xvclNwYWNlIik7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShjb2xvclNwYWNlcykpIHsKKyAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VzQ1MgPSBjb2xvclNwYWNlcy5nZXQoY3MubmFtZSk7CisKKyAgICAgICAgICAgICAgaWYgKHJlc291cmNlc0NTKSB7CisgICAgICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHJlc291cmNlc0NTKSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlKHJlc291cmNlc0NTLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3MgPSByZXNvdXJjZXNDUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2U6ICR7Y3MubmFtZX1gKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShjcykpIHsKKyAgICAgIGNvbnN0IG1vZGUgPSB4cmVmLmZldGNoSWZSZWYoY3NbMF0pLm5hbWU7CisgICAgICBsZXQgcGFyYW1zLCBudW1Db21wcywgYmFzZUNTLCB3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYTsKKworICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgorICAgICAgICBjYXNlICJHIjoKKyAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7CisKKyAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKKyAgICAgICAgY2FzZSAiUkdCIjoKKyAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjsKKworICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKKyAgICAgICAgY2FzZSAiQ01ZSyI6CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOworCisgICAgICAgIGNhc2UgIkNhbEdyYXkiOgorICAgICAgICAgIHBhcmFtcyA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CisgICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOworICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKKyAgICAgICAgICBnYW1tYSA9IHBhcmFtcy5nZXQoIkdhbW1hIik7CisgICAgICAgICAgcmV0dXJuIG5ldyBDYWxHcmF5Q1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEpOworCisgICAgICAgIGNhc2UgIkNhbFJHQiI6CisgICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKKyAgICAgICAgICB3aGl0ZVBvaW50ID0gcGFyYW1zLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7CisgICAgICAgICAgYmxhY2tQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiQmxhY2tQb2ludCIpOworICAgICAgICAgIGdhbW1hID0gcGFyYW1zLmdldEFycmF5KCJHYW1tYSIpOworICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IHBhcmFtcy5nZXRBcnJheSgiTWF0cml4Iik7CisgICAgICAgICAgcmV0dXJuIG5ldyBDYWxSR0JDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KTsKKworICAgICAgICBjYXNlICJJQ0NCYXNlZCI6CisgICAgICAgICAgY29uc3Qgc3RyZWFtID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKKyAgICAgICAgICBjb25zdCBkaWN0ID0gc3RyZWFtLmRpY3Q7CisgICAgICAgICAgbnVtQ29tcHMgPSBkaWN0LmdldCgiTiIpOworICAgICAgICAgIGNvbnN0IGFsdCA9IGRpY3QuZ2V0KCJBbHRlcm5hdGUiKTsKKworICAgICAgICAgIGlmIChhbHQpIHsKKyAgICAgICAgICAgIGNvbnN0IGFsdENTID0gdGhpcy5fcGFyc2UoYWx0LCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CisKKyAgICAgICAgICAgIGlmIChhbHRDUy5udW1Db21wcyA9PT0gbnVtQ29tcHMpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGFsdENTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIklDQ0Jhc2VkIGNvbG9yIHNwYWNlOiBJZ25vcmluZyBpbmNvcnJlY3QgL0FsdGVybmF0ZSBlbnRyeS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobnVtQ29tcHMgPT09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTsKKyAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSAzKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjsKKyAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSA0KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiUGF0dGVybiI6CisgICAgICAgICAgYmFzZUNTID0gY3NbMV0gfHwgbnVsbDsKKworICAgICAgICAgIGlmIChiYXNlQ1MpIHsKKyAgICAgICAgICAgIGJhc2VDUyA9IHRoaXMuX3BhcnNlKGJhc2VDUywgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKGJhc2VDUyk7CisKKyAgICAgICAgY2FzZSAiSW5kZXhlZCI6CisgICAgICAgIGNhc2UgIkkiOgorICAgICAgICAgIGJhc2VDUyA9IHRoaXMuX3BhcnNlKGNzWzFdLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CisgICAgICAgICAgY29uc3QgaGlWYWwgPSB4cmVmLmZldGNoSWZSZWYoY3NbMl0pICsgMTsKKyAgICAgICAgICBjb25zdCBsb29rdXAgPSB4cmVmLmZldGNoSWZSZWYoY3NbM10pOworICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhlZENTKGJhc2VDUywgaGlWYWwsIGxvb2t1cCk7CisKKyAgICAgICAgY2FzZSAiU2VwYXJhdGlvbiI6CisgICAgICAgIGNhc2UgIkRldmljZU4iOgorICAgICAgICAgIGNvbnN0IG5hbWUgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOworICAgICAgICAgIG51bUNvbXBzID0gQXJyYXkuaXNBcnJheShuYW1lKSA/IG5hbWUubGVuZ3RoIDogMTsKKyAgICAgICAgICBiYXNlQ1MgPSB0aGlzLl9wYXJzZShjc1syXSwgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOworICAgICAgICAgIGNvbnN0IHRpbnRGbiA9IHBkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUoY3NbM10pOworICAgICAgICAgIHJldHVybiBuZXcgQWx0ZXJuYXRlQ1MobnVtQ29tcHMsIGJhc2VDUywgdGludEZuKTsKKworICAgICAgICBjYXNlICJMYWIiOgorICAgICAgICAgIHBhcmFtcyA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CisgICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOworICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKKyAgICAgICAgICBjb25zdCByYW5nZSA9IHBhcmFtcy5nZXRBcnJheSgiUmFuZ2UiKTsKKyAgICAgICAgICByZXR1cm4gbmV3IExhYkNTKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIHJhbmdlKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5pbXBsZW1lbnRlZCBDb2xvclNwYWNlIG9iamVjdDogJHttb2RlfWApOworICAgICAgfQorICAgIH0KKworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke2NzfWApOworICB9CisKKyAgc3RhdGljIGlzRGVmYXVsdERlY29kZShkZWNvZGUsIG51bUNvbXBzKSB7CisgICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChudW1Db21wcyAqIDIgIT09IGRlY29kZS5sZW5ndGgpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiVGhlIGRlY29kZSBtYXAgaXMgbm90IHRoZSBjb3JyZWN0IGxlbmd0aCIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGVjb2RlLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgIGlmIChkZWNvZGVbaV0gIT09IDAgfHwgZGVjb2RlW2kgKyAxXSAhPT0gMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGF0aWMgZ2V0IHNpbmdsZXRvbnMoKSB7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJzaW5nbGV0b25zIiwgeworICAgICAgZ2V0IGdyYXkoKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZ3JheSIsIG5ldyBEZXZpY2VHcmF5Q1MoKSk7CisgICAgICB9LAorCisgICAgICBnZXQgcmdiKCkgeworICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInJnYiIsIG5ldyBEZXZpY2VSZ2JDUygpKTsKKyAgICAgIH0sCisKKyAgICAgIGdldCBjbXlrKCkgeworICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImNteWsiLCBuZXcgRGV2aWNlQ215a0NTKCkpOworICAgICAgfQorCisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLkNvbG9yU3BhY2UgPSBDb2xvclNwYWNlOworCitjbGFzcyBBbHRlcm5hdGVDUyBleHRlbmRzIENvbG9yU3BhY2UgeworICBjb25zdHJ1Y3RvcihudW1Db21wcywgYmFzZSwgdGludEZuKSB7CisgICAgc3VwZXIoIkFsdGVybmF0ZSIsIG51bUNvbXBzKTsKKyAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgIHRoaXMudGludEZuID0gdGludEZuOworICAgIHRoaXMudG1wQnVmID0gbmV3IEZsb2F0MzJBcnJheShiYXNlLm51bUNvbXBzKTsKKyAgfQorCisgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICBjb25zdCB0bXBCdWYgPSB0aGlzLnRtcEJ1ZjsKKyAgICB0aGlzLnRpbnRGbihzcmMsIHNyY09mZnNldCwgdG1wQnVmLCAwKTsKKyAgICB0aGlzLmJhc2UuZ2V0UmdiSXRlbSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpOworICB9CisKKyAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgIGNvbnN0IHRpbnRGbiA9IHRoaXMudGludEZuOworICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7CisgICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CisgICAgY29uc3QgYmFzZU51bUNvbXBzID0gYmFzZS5udW1Db21wczsKKyAgICBjb25zdCB1c2VzWmVyb1RvT25lUmFuZ2UgPSBiYXNlLnVzZXNaZXJvVG9PbmVSYW5nZTsKKyAgICBjb25zdCBpc1Bhc3N0aHJvdWdoID0gKGJhc2UuaXNQYXNzdGhyb3VnaCg4KSB8fCAhdXNlc1plcm9Ub09uZVJhbmdlKSAmJiBhbHBoYTAxID09PSAwOworICAgIGxldCBwb3MgPSBpc1Bhc3N0aHJvdWdoID8gZGVzdE9mZnNldCA6IDA7CisgICAgY29uc3QgYmFzZUJ1ZiA9IGlzUGFzc3Rocm91Z2ggPyBkZXN0IDogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJhc2VOdW1Db21wcyAqIGNvdW50KTsKKyAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CisgICAgY29uc3Qgc2NhbGVkID0gbmV3IEZsb2F0MzJBcnJheShudW1Db21wcyk7CisgICAgY29uc3QgdGludGVkID0gbmV3IEZsb2F0MzJBcnJheShiYXNlTnVtQ29tcHMpOworICAgIGxldCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1Db21wczsgaisrKSB7CisgICAgICAgIHNjYWxlZFtqXSA9IHNyY1tzcmNPZmZzZXQrK10gKiBzY2FsZTsKKyAgICAgIH0KKworICAgICAgdGludEZuKHNjYWxlZCwgMCwgdGludGVkLCAwKTsKKworICAgICAgaWYgKHVzZXNaZXJvVG9PbmVSYW5nZSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmFzZU51bUNvbXBzOyBqKyspIHsKKyAgICAgICAgICBiYXNlQnVmW3BvcysrXSA9IHRpbnRlZFtqXSAqIDI1NTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmFzZS5nZXRSZ2JJdGVtKHRpbnRlZCwgMCwgYmFzZUJ1ZiwgcG9zKTsKKyAgICAgICAgcG9zICs9IGJhc2VOdW1Db21wczsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWlzUGFzc3Rocm91Z2gpIHsKKyAgICAgIGJhc2UuZ2V0UmdiQnVmZmVyKGJhc2VCdWYsIDAsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCBhbHBoYTAxKTsKKyAgICB9CisgIH0KKworICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKKyAgICByZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCAqIHRoaXMuYmFzZS5udW1Db21wcyAvIHRoaXMubnVtQ29tcHMsIGFscGhhMDEpOworICB9CisKK30KKworY2xhc3MgUGF0dGVybkNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CisgIGNvbnN0cnVjdG9yKGJhc2VDUykgeworICAgIHN1cGVyKCJQYXR0ZXJuIiwgbnVsbCk7CisgICAgdGhpcy5iYXNlID0gYmFzZUNTOworICB9CisKKyAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm5DUy5pc0RlZmF1bHREZWNvZGUiKTsKKyAgfQorCit9CisKK2NsYXNzIEluZGV4ZWRDUyBleHRlbmRzIENvbG9yU3BhY2UgeworICBjb25zdHJ1Y3RvcihiYXNlLCBoaWdoVmFsLCBsb29rdXApIHsKKyAgICBzdXBlcigiSW5kZXhlZCIsIDEpOworICAgIHRoaXMuYmFzZSA9IGJhc2U7CisgICAgdGhpcy5oaWdoVmFsID0gaGlnaFZhbDsKKyAgICBjb25zdCBsZW5ndGggPSBiYXNlLm51bUNvbXBzICogaGlnaFZhbDsKKyAgICB0aGlzLmxvb2t1cCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShsb29rdXApKSB7CisgICAgICBjb25zdCBieXRlcyA9IGxvb2t1cC5nZXRCeXRlcyhsZW5ndGgpOworICAgICAgdGhpcy5sb29rdXAuc2V0KGJ5dGVzKTsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBsb29rdXAgPT09ICJzdHJpbmciKSB7CisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIHRoaXMubG9va3VwW2ldID0gbG9va3VwLmNoYXJDb2RlQXQoaSkgJiAweGZmOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICR7bG9va3VwfWApOworICAgIH0KKyAgfQorCisgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICBjb25zdCBudW1Db21wcyA9IHRoaXMuYmFzZS5udW1Db21wczsKKyAgICBjb25zdCBzdGFydCA9IHNyY1tzcmNPZmZzZXRdICogbnVtQ29tcHM7CisgICAgdGhpcy5iYXNlLmdldFJnYkJ1ZmZlcih0aGlzLmxvb2t1cCwgc3RhcnQsIDEsIGRlc3QsIGRlc3RPZmZzZXQsIDgsIDApOworICB9CisKKyAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7CisgICAgY29uc3QgbnVtQ29tcHMgPSBiYXNlLm51bUNvbXBzOworICAgIGNvbnN0IG91dHB1dERlbHRhID0gYmFzZS5nZXRPdXRwdXRMZW5ndGgobnVtQ29tcHMsIGFscGhhMDEpOworICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICBjb25zdCBsb29rdXBQb3MgPSBzcmNbc3JjT2Zmc2V0KytdICogbnVtQ29tcHM7CisgICAgICBiYXNlLmdldFJnYkJ1ZmZlcihsb29rdXAsIGxvb2t1cFBvcywgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7CisgICAgICBkZXN0T2Zmc2V0ICs9IG91dHB1dERlbHRhOworICAgIH0KKyAgfQorCisgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgeworICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoICogdGhpcy5iYXNlLm51bUNvbXBzLCBhbHBoYTAxKTsKKyAgfQorCisgIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgeworICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNvZGVNYXApKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZGVjb2RlTWFwLmxlbmd0aCAhPT0gMikgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJEZWNvZGUgbWFwIGxlbmd0aCBpcyBub3QgY29ycmVjdCIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGJwYykgfHwgYnBjIDwgMSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJCaXRzIHBlciBjb21wb25lbnQgaXMgbm90IGNvcnJlY3QiKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBkZWNvZGVNYXBbMF0gPT09IDAgJiYgZGVjb2RlTWFwWzFdID09PSAoMSA8PCBicGMpIC0gMTsKKyAgfQorCit9CisKK2NsYXNzIERldmljZUdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2UgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICBzdXBlcigiRGV2aWNlR3JheSIsIDEpOworICB9CisKKyAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgIGNvbnN0IGMgPSBzcmNbc3JjT2Zmc2V0XSAqIDI1NTsKKyAgICBkZXN0W2Rlc3RPZmZzZXRdID0gZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGM7CisgIH0KKworICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CisgICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYml0cykgLSAxKTsKKyAgICBsZXQgaiA9IHNyY09mZnNldCwKKyAgICAgICAgcSA9IGRlc3RPZmZzZXQ7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgIGNvbnN0IGMgPSBzY2FsZSAqIHNyY1tqKytdOworICAgICAgZGVzdFtxKytdID0gYzsKKyAgICAgIGRlc3RbcSsrXSA9IGM7CisgICAgICBkZXN0W3ErK10gPSBjOworICAgICAgcSArPSBhbHBoYTAxOworICAgIH0KKyAgfQorCisgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgeworICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSk7CisgIH0KKworfQorCitjbGFzcyBEZXZpY2VSZ2JDUyBleHRlbmRzIENvbG9yU3BhY2UgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICBzdXBlcigiRGV2aWNlUkdCIiwgMyk7CisgIH0KKworICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHNyY1tzcmNPZmZzZXRdICogMjU1OworICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gc3JjW3NyY09mZnNldCArIDFdICogMjU1OworICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc3JjW3NyY09mZnNldCArIDJdICogMjU1OworICB9CisKKyAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgIGlmIChiaXRzID09PSA4ICYmIGFscGhhMDEgPT09IDApIHsKKyAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50ICogMyksIGRlc3RPZmZzZXQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHNjYWxlID0gMjU1IC8gKCgxIDw8IGJpdHMpIC0gMSk7CisgICAgbGV0IGogPSBzcmNPZmZzZXQsCisgICAgICAgIHEgPSBkZXN0T2Zmc2V0OworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICBkZXN0W3ErK10gPSBzY2FsZSAqIHNyY1tqKytdOworICAgICAgZGVzdFtxKytdID0gc2NhbGUgKiBzcmNbaisrXTsKKyAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CisgICAgICBxICs9IGFscGhhMDE7CisgICAgfQorICB9CisKKyAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSAvIDMgfCAwOworICB9CisKKyAgaXNQYXNzdGhyb3VnaChiaXRzKSB7CisgICAgcmV0dXJuIGJpdHMgPT09IDg7CisgIH0KKworfQorCitjb25zdCBEZXZpY2VDbXlrQ1MgPSBmdW5jdGlvbiBEZXZpY2VDbXlrQ1NDbG9zdXJlKCkgeworICBmdW5jdGlvbiBjb252ZXJ0VG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIHNyY1NjYWxlLCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgY29uc3QgYyA9IHNyY1tzcmNPZmZzZXRdICogc3JjU2NhbGU7CisgICAgY29uc3QgbSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNyY1NjYWxlOworICAgIGNvbnN0IHkgPSBzcmNbc3JjT2Zmc2V0ICsgMl0gKiBzcmNTY2FsZTsKKyAgICBjb25zdCBrID0gc3JjW3NyY09mZnNldCArIDNdICogc3JjU2NhbGU7CisgICAgZGVzdFtkZXN0T2Zmc2V0XSA9IDI1NSArIGMgKiAoLTQuMzg3MzMyMzg0NjA5OTg4ICogYyArIDU0LjQ4NjE1MTk0MTg5MTc2ICogbSArIDE4LjgyMjkwNTAyMTY1MzAyICogeSArIDIxMi4yNTY2MjQ1MTYzOTU4NSAqIGsgKyAtMjg1LjIzMzEwMjYxMzcwMDQpICsgbSAqICgxLjcxNDk3NjM0NzczNjIxMzQgKiBtIC0gNS42MDk2NzM2OTA0MDQ3MzE1ICogeSArIC0xNy44NzM4NzA4NjE0MTU0NDQgKiBrIC0gNS40OTcwMDY0MjcxOTYzNjYpICsgeSAqICgtMi41MjE3MzQwMTMxNjgzMDMzICogeSAtIDIxLjI0ODkyMzMzNzM1MzA3MyAqIGsgKyAxNy41MTE5MjcwODQxODEzKSArIGsgKiAoLTIxLjg2MTIyMTQ3NDYzNjA1ICogayAtIDE4OS40ODE4MDgzNTkyMjc0Nyk7CisgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSAyNTUgKyBjICogKDguODQxMDQxNDIyMDM2MTQ5ICogYyArIDYwLjExODAyNzA0NTU5NzM2NiAqIG0gKyA2Ljg3MTQyNTU5MjA0OTAwNyAqIHkgKyAzMS4xNTkxMDAxMzAwNTU5MjIgKiBrICsgLTc5LjI5NzA4NDQ4MTY1NDgpICsgbSAqICgtMTUuMzEwMzYxMzA2OTY3ODE3ICogbSArIDE3LjU3NTI1MTI2MTEwOTQ4MiAqIHkgKyAxMzEuMzUyNTA5MTI0OTM5NzYgKiBrIC0gMTkwLjk0NTMzMDI1ODg5NTEpICsgeSAqICg0LjQ0NDMzOTEwMjg1MjczOSAqIHkgKyA5Ljg2MzI4NjE0OTM0MDUgKiBrIC0gMjQuODY3NDE1ODI1NTU4NzgpICsgayAqICgtMjAuNzM3MzI1NDcxMTgxMDM0ICogayAtIDE4Ny44MDQ1MzcwOTcxOTU3OCk7CisgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSAyNTUgKyBjICogKDAuODg0MjUyMjQzMDAwMzI5NiAqIGMgKyA4LjA3ODY3NzUwMzExMjkyOCAqIG0gKyAzMC44OTk3ODMwOTcwMzcyOSAqIHkgLSAwLjIzODgzMjM4Njg5MTc4OTM0ICogayArIC0xNC4xODM1NzY3OTk2NzMyODYpICsgbSAqICgxMC40OTU5MzI3MzQzMjA3MiAqIG0gKyA2My4wMjM3ODQ5NDc1NDA1MiAqIHkgKyA1MC42MDY5NTc2NTYzNjA3MzQgKiBrIC0gMTEyLjIzODg0MjUzNzE5MjQ4KSArIHkgKiAoMC4wMzI5NjA0MTExNDg3MzIxNyAqIHkgKyAxMTUuNjAzODQ0NDk2NDY2NDEgKiBrICsgLTE5My41ODIwOTM1Njg2MTUwNSkgKyBrICogKC0yMi4zMzgxNjgwNzMwOTg4NiAqIGsgLSAxODAuMTI2MTM5NzQ3MDgzNjcpOworICB9CisKKyAgY2xhc3MgRGV2aWNlQ215a0NTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICBzdXBlcigiRGV2aWNlQ01ZSyIsIDQpOworICAgIH0KKworICAgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgIGNvbnZlcnRUb1JnYihzcmMsIHNyY09mZnNldCwgMSwgZGVzdCwgZGVzdE9mZnNldCk7CisgICAgfQorCisgICAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjb252ZXJ0VG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIHNjYWxlLCBkZXN0LCBkZXN0T2Zmc2V0KTsKKyAgICAgICAgc3JjT2Zmc2V0ICs9IDQ7CisgICAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CisgICAgICB9CisgICAgfQorCisgICAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICByZXR1cm4gaW5wdXRMZW5ndGggLyA0ICogKDMgKyBhbHBoYTAxKSB8IDA7CisgICAgfQorCisgIH0KKworICByZXR1cm4gRGV2aWNlQ215a0NTOworfSgpOworCitjb25zdCBDYWxHcmF5Q1MgPSBmdW5jdGlvbiBDYWxHcmF5Q1NDbG9zdXJlKCkgeworICBmdW5jdGlvbiBjb252ZXJ0VG9SZ2IoY3MsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSkgeworICAgIGNvbnN0IEEgPSBzcmNbc3JjT2Zmc2V0XSAqIHNjYWxlOworICAgIGNvbnN0IEFHID0gQSAqKiBjcy5HOworICAgIGNvbnN0IEwgPSBjcy5ZVyAqIEFHOworICAgIGNvbnN0IHZhbCA9IE1hdGgubWF4KDI5NS44ICogTCAqKiAwLjMzMzMzMzMzMzMzMzMzMzMzMyAtIDQwLjgsIDApOworICAgIGRlc3RbZGVzdE9mZnNldF0gPSB2YWw7CisgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSB2YWw7CisgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSB2YWw7CisgIH0KKworICBjbGFzcyBDYWxHcmF5Q1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKKyAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSkgeworICAgICAgc3VwZXIoIkNhbEdyYXkiLCAxKTsKKworICAgICAgaWYgKCF3aGl0ZVBvaW50KSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXkiKTsKKyAgICAgIH0KKworICAgICAgYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQgfHwgWzAsIDAsIDBdOworICAgICAgZ2FtbWEgPSBnYW1tYSB8fCAxOworICAgICAgdGhpcy5YVyA9IHdoaXRlUG9pbnRbMF07CisgICAgICB0aGlzLllXID0gd2hpdGVQb2ludFsxXTsKKyAgICAgIHRoaXMuWlcgPSB3aGl0ZVBvaW50WzJdOworICAgICAgdGhpcy5YQiA9IGJsYWNrUG9pbnRbMF07CisgICAgICB0aGlzLllCID0gYmxhY2tQb2ludFsxXTsKKyAgICAgIHRoaXMuWkIgPSBibGFja1BvaW50WzJdOworICAgICAgdGhpcy5HID0gZ2FtbWE7CisKKyAgICAgIGlmICh0aGlzLlhXIDwgMCB8fCB0aGlzLlpXIDwgMCB8fCB0aGlzLllXICE9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMgZm9yICR7dGhpcy5uYW1lfWAgKyAiLCBubyBmYWxsYmFjayBhdmFpbGFibGUiKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuWEIgPCAwIHx8IHRoaXMuWUIgPCAwIHx8IHRoaXMuWkIgPCAwKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKShgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApOworICAgICAgICB0aGlzLlhCID0gdGhpcy5ZQiA9IHRoaXMuWkIgPSAwOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5YQiAhPT0gMCB8fCB0aGlzLllCICE9PSAwIHx8IHRoaXMuWkIgIT09IDApIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGAke3RoaXMubmFtZX0sIEJsYWNrUG9pbnQ6IFhCOiAke3RoaXMuWEJ9LCBZQjogJHt0aGlzLllCfSwgYCArIGBaQjogJHt0aGlzLlpCfSwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLmApOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5HIDwgMSkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoYEludmFsaWQgR2FtbWE6ICR7dGhpcy5HfSBmb3IgJHt0aGlzLm5hbWV9LCBgICsgImZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpOworICAgICAgICB0aGlzLkcgPSAxOworICAgICAgfQorICAgIH0KKworICAgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CisgICAgfQorCisgICAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKTsKKyAgICAgICAgc3JjT2Zmc2V0ICs9IDE7CisgICAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CisgICAgICB9CisgICAgfQorCisgICAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CisgICAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpOworICAgIH0KKworICB9CisKKyAgcmV0dXJuIENhbEdyYXlDUzsKK30oKTsKKworY29uc3QgQ2FsUkdCQ1MgPSBmdW5jdGlvbiBDYWxSR0JDU0Nsb3N1cmUoKSB7CisgIGNvbnN0IEJSQURGT1JEX1NDQUxFX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzAuODk1MSwgMC4yNjY0LCAtMC4xNjE0LCAtMC43NTAyLCAxLjcxMzUsIDAuMDM2NywgMC4wMzg5LCAtMC4wNjg1LCAxLjAyOTZdKTsKKyAgY29uc3QgQlJBREZPUkRfU0NBTEVfSU5WRVJTRV9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFswLjk4Njk5MjksIC0wLjE0NzA1NDMsIDAuMTU5OTYyNywgMC40MzIzMDUzLCAwLjUxODM2MDMsIDAuMDQ5MjkxMiwgLTAuMDA4NTI4NywgMC4wNDAwNDI4LCAwLjk2ODQ4NjddKTsKKyAgY29uc3QgU1JHQl9ENjVfWFlaX1RPX1JHQl9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFszLjI0MDQ1NDIsIC0xLjUzNzEzODUsIC0wLjQ5ODUzMTQsIC0wLjk2OTI2NjAsIDEuODc2MDEwOCwgMC4wNDE1NTYwLCAwLjA1NTY0MzQsIC0wLjIwNDAyNTksIDEuMDU3MjI1Ml0pOworICBjb25zdCBGTEFUX1dISVRFUE9JTlRfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMSwgMSwgMV0pOworICBjb25zdCB0ZW1wTm9ybWFsaXplTWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKKyAgY29uc3QgdGVtcENvbnZlcnRNYXRyaXgxID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKKyAgY29uc3QgdGVtcENvbnZlcnRNYXRyaXgyID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKKyAgY29uc3QgREVDT0RFX0xfQ09OU1RBTlQgPSAoKDggKyAxNikgLyAxMTYpICoqIDMgLyA4LjA7CisKKyAgZnVuY3Rpb24gbWF0cml4UHJvZHVjdChhLCBiLCByZXN1bHQpIHsKKyAgICByZXN1bHRbMF0gPSBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07CisgICAgcmVzdWx0WzFdID0gYVszXSAqIGJbMF0gKyBhWzRdICogYlsxXSArIGFbNV0gKiBiWzJdOworICAgIHJlc3VsdFsyXSA9IGFbNl0gKiBiWzBdICsgYVs3XSAqIGJbMV0gKyBhWzhdICogYlsyXTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbnZlcnRUb0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCByZXN1bHQpIHsKKyAgICByZXN1bHRbMF0gPSBMTVNbMF0gKiAxIC8gc291cmNlV2hpdGVQb2ludFswXTsKKyAgICByZXN1bHRbMV0gPSBMTVNbMV0gKiAxIC8gc291cmNlV2hpdGVQb2ludFsxXTsKKyAgICByZXN1bHRbMl0gPSBMTVNbMl0gKiAxIC8gc291cmNlV2hpdGVQb2ludFsyXTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbnZlcnRUb0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIHJlc3VsdCkgeworICAgIGNvbnN0IEQ2NVggPSAwLjk1MDQ3OworICAgIGNvbnN0IEQ2NVkgPSAxOworICAgIGNvbnN0IEQ2NVogPSAxLjA4ODgzOworICAgIHJlc3VsdFswXSA9IExNU1swXSAqIEQ2NVggLyBzb3VyY2VXaGl0ZVBvaW50WzBdOworICAgIHJlc3VsdFsxXSA9IExNU1sxXSAqIEQ2NVkgLyBzb3VyY2VXaGl0ZVBvaW50WzFdOworICAgIHJlc3VsdFsyXSA9IExNU1syXSAqIEQ2NVogLyBzb3VyY2VXaGl0ZVBvaW50WzJdOworICB9CisKKyAgZnVuY3Rpb24gc1JHQlRyYW5zZmVyRnVuY3Rpb24oY29sb3IpIHsKKyAgICBpZiAoY29sb3IgPD0gMC4wMDMxMzA4KSB7CisgICAgICByZXR1cm4gYWRqdXN0VG9SYW5nZSgwLCAxLCAxMi45MiAqIGNvbG9yKTsKKyAgICB9CisKKyAgICBpZiAoY29sb3IgPj0gMC45OTU1NDUyNSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIGFkanVzdFRvUmFuZ2UoMCwgMSwgKDEgKyAwLjA1NSkgKiBjb2xvciAqKiAoMSAvIDIuNCkgLSAwLjA1NSk7CisgIH0KKworICBmdW5jdGlvbiBhZGp1c3RUb1JhbmdlKG1pbiwgbWF4LCB2YWx1ZSkgeworICAgIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZUwoTCkgeworICAgIGlmIChMIDwgMCkgeworICAgICAgcmV0dXJuIC1kZWNvZGVMKC1MKTsKKyAgICB9CisKKyAgICBpZiAoTCA+IDguMCkgeworICAgICAgcmV0dXJuICgoTCArIDE2KSAvIDExNikgKiogMzsKKyAgICB9CisKKyAgICByZXR1cm4gTCAqIERFQ09ERV9MX0NPTlNUQU5UOworICB9CisKKyAgZnVuY3Rpb24gY29tcGVuc2F0ZUJsYWNrUG9pbnQoc291cmNlQmxhY2tQb2ludCwgWFlaX0ZsYXQsIHJlc3VsdCkgeworICAgIGlmIChzb3VyY2VCbGFja1BvaW50WzBdID09PSAwICYmIHNvdXJjZUJsYWNrUG9pbnRbMV0gPT09IDAgJiYgc291cmNlQmxhY2tQb2ludFsyXSA9PT0gMCkgeworICAgICAgcmVzdWx0WzBdID0gWFlaX0ZsYXRbMF07CisgICAgICByZXN1bHRbMV0gPSBYWVpfRmxhdFsxXTsKKyAgICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHplcm9EZWNvZGVMID0gZGVjb2RlTCgwKTsKKyAgICBjb25zdCBYX0RTVCA9IHplcm9EZWNvZGVMOworICAgIGNvbnN0IFhfU1JDID0gZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzBdKTsKKyAgICBjb25zdCBZX0RTVCA9IHplcm9EZWNvZGVMOworICAgIGNvbnN0IFlfU1JDID0gZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzFdKTsKKyAgICBjb25zdCBaX0RTVCA9IHplcm9EZWNvZGVMOworICAgIGNvbnN0IFpfU1JDID0gZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzJdKTsKKyAgICBjb25zdCBYX1NjYWxlID0gKDEgLSBYX0RTVCkgLyAoMSAtIFhfU1JDKTsKKyAgICBjb25zdCBYX09mZnNldCA9IDEgLSBYX1NjYWxlOworICAgIGNvbnN0IFlfU2NhbGUgPSAoMSAtIFlfRFNUKSAvICgxIC0gWV9TUkMpOworICAgIGNvbnN0IFlfT2Zmc2V0ID0gMSAtIFlfU2NhbGU7CisgICAgY29uc3QgWl9TY2FsZSA9ICgxIC0gWl9EU1QpIC8gKDEgLSBaX1NSQyk7CisgICAgY29uc3QgWl9PZmZzZXQgPSAxIC0gWl9TY2FsZTsKKyAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXSAqIFhfU2NhbGUgKyBYX09mZnNldDsKKyAgICByZXN1bHRbMV0gPSBYWVpfRmxhdFsxXSAqIFlfU2NhbGUgKyBZX09mZnNldDsKKyAgICByZXN1bHRbMl0gPSBYWVpfRmxhdFsyXSAqIFpfU2NhbGUgKyBaX09mZnNldDsKKyAgfQorCisgIGZ1bmN0aW9uIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQoc291cmNlV2hpdGVQb2ludCwgWFlaX0luLCByZXN1bHQpIHsKKyAgICBpZiAoc291cmNlV2hpdGVQb2ludFswXSA9PT0gMSAmJiBzb3VyY2VXaGl0ZVBvaW50WzJdID09PSAxKSB7CisgICAgICByZXN1bHRbMF0gPSBYWVpfSW5bMF07CisgICAgICByZXN1bHRbMV0gPSBYWVpfSW5bMV07CisgICAgICByZXN1bHRbMl0gPSBYWVpfSW5bMl07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgTE1TID0gcmVzdWx0OworICAgIG1hdHJpeFByb2R1Y3QoQlJBREZPUkRfU0NBTEVfTUFUUklYLCBYWVpfSW4sIExNUyk7CisgICAgY29uc3QgTE1TX0ZsYXQgPSB0ZW1wTm9ybWFsaXplTWF0cml4OworICAgIGNvbnZlcnRUb0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRmxhdCk7CisgICAgbWF0cml4UHJvZHVjdChCUkFERk9SRF9TQ0FMRV9JTlZFUlNFX01BVFJJWCwgTE1TX0ZsYXQsIHJlc3VsdCk7CisgIH0KKworICBmdW5jdGlvbiBub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUoc291cmNlV2hpdGVQb2ludCwgWFlaX0luLCByZXN1bHQpIHsKKyAgICBjb25zdCBMTVMgPSByZXN1bHQ7CisgICAgbWF0cml4UHJvZHVjdChCUkFERk9SRF9TQ0FMRV9NQVRSSVgsIFhZWl9JbiwgTE1TKTsKKyAgICBjb25zdCBMTVNfRDY1ID0gdGVtcE5vcm1hbGl6ZU1hdHJpeDsKKyAgICBjb252ZXJ0VG9ENjUoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRDY1KTsKKyAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRDY1LCByZXN1bHQpOworICB9CisKKyAgZnVuY3Rpb24gY29udmVydFRvUmdiKGNzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpIHsKKyAgICBjb25zdCBBID0gYWRqdXN0VG9SYW5nZSgwLCAxLCBzcmNbc3JjT2Zmc2V0XSAqIHNjYWxlKTsKKyAgICBjb25zdCBCID0gYWRqdXN0VG9SYW5nZSgwLCAxLCBzcmNbc3JjT2Zmc2V0ICsgMV0gKiBzY2FsZSk7CisgICAgY29uc3QgQyA9IGFkanVzdFRvUmFuZ2UoMCwgMSwgc3JjW3NyY09mZnNldCArIDJdICogc2NhbGUpOworICAgIGNvbnN0IEFHUiA9IEEgPT09IDEgPyAxIDogQSAqKiBjcy5HUjsKKyAgICBjb25zdCBCR0cgPSBCID09PSAxID8gMSA6IEIgKiogY3MuR0c7CisgICAgY29uc3QgQ0dCID0gQyA9PT0gMSA/IDEgOiBDICoqIGNzLkdCOworICAgIGNvbnN0IFggPSBjcy5NWEEgKiBBR1IgKyBjcy5NWEIgKiBCR0cgKyBjcy5NWEMgKiBDR0I7CisgICAgY29uc3QgWSA9IGNzLk1ZQSAqIEFHUiArIGNzLk1ZQiAqIEJHRyArIGNzLk1ZQyAqIENHQjsKKyAgICBjb25zdCBaID0gY3MuTVpBICogQUdSICsgY3MuTVpCICogQkdHICsgY3MuTVpDICogQ0dCOworICAgIGNvbnN0IFhZWiA9IHRlbXBDb252ZXJ0TWF0cml4MTsKKyAgICBYWVpbMF0gPSBYOworICAgIFhZWlsxXSA9IFk7CisgICAgWFlaWzJdID0gWjsKKyAgICBjb25zdCBYWVpfRmxhdCA9IHRlbXBDb252ZXJ0TWF0cml4MjsKKyAgICBub3JtYWxpemVXaGl0ZVBvaW50VG9GbGF0KGNzLndoaXRlUG9pbnQsIFhZWiwgWFlaX0ZsYXQpOworICAgIGNvbnN0IFhZWl9CbGFjayA9IHRlbXBDb252ZXJ0TWF0cml4MTsKKyAgICBjb21wZW5zYXRlQmxhY2tQb2ludChjcy5ibGFja1BvaW50LCBYWVpfRmxhdCwgWFlaX0JsYWNrKTsKKyAgICBjb25zdCBYWVpfRDY1ID0gdGVtcENvbnZlcnRNYXRyaXgyOworICAgIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShGTEFUX1dISVRFUE9JTlRfTUFUUklYLCBYWVpfQmxhY2ssIFhZWl9ENjUpOworICAgIGNvbnN0IFNSR0IgPSB0ZW1wQ29udmVydE1hdHJpeDE7CisgICAgbWF0cml4UHJvZHVjdChTUkdCX0Q2NV9YWVpfVE9fUkdCX01BVFJJWCwgWFlaX0Q2NSwgU1JHQik7CisgICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHNSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMF0pICogMjU1OworICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlsxXSkgKiAyNTU7CisgICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzJdKSAqIDI1NTsKKyAgfQorCisgIGNsYXNzIENhbFJHQkNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CisgICAgY29uc3RydWN0b3Iod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEsIG1hdHJpeCkgeworICAgICAgc3VwZXIoIkNhbFJHQiIsIDMpOworCisgICAgICBpZiAoIXdoaXRlUG9pbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsUkdCIik7CisgICAgICB9CisKKyAgICAgIGJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IG5ldyBGbG9hdDMyQXJyYXkoMyk7CisgICAgICBnYW1tYSA9IGdhbW1hIHx8IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDFdKTsKKyAgICAgIG1hdHJpeCA9IG1hdHJpeCB8fCBuZXcgRmxvYXQzMkFycmF5KFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXSk7CisgICAgICBjb25zdCBYVyA9IHdoaXRlUG9pbnRbMF07CisgICAgICBjb25zdCBZVyA9IHdoaXRlUG9pbnRbMV07CisgICAgICBjb25zdCBaVyA9IHdoaXRlUG9pbnRbMl07CisgICAgICB0aGlzLndoaXRlUG9pbnQgPSB3aGl0ZVBvaW50OworICAgICAgY29uc3QgWEIgPSBibGFja1BvaW50WzBdOworICAgICAgY29uc3QgWUIgPSBibGFja1BvaW50WzFdOworICAgICAgY29uc3QgWkIgPSBibGFja1BvaW50WzJdOworICAgICAgdGhpcy5ibGFja1BvaW50ID0gYmxhY2tQb2ludDsKKyAgICAgIHRoaXMuR1IgPSBnYW1tYVswXTsKKyAgICAgIHRoaXMuR0cgPSBnYW1tYVsxXTsKKyAgICAgIHRoaXMuR0IgPSBnYW1tYVsyXTsKKyAgICAgIHRoaXMuTVhBID0gbWF0cml4WzBdOworICAgICAgdGhpcy5NWUEgPSBtYXRyaXhbMV07CisgICAgICB0aGlzLk1aQSA9IG1hdHJpeFsyXTsKKyAgICAgIHRoaXMuTVhCID0gbWF0cml4WzNdOworICAgICAgdGhpcy5NWUIgPSBtYXRyaXhbNF07CisgICAgICB0aGlzLk1aQiA9IG1hdHJpeFs1XTsKKyAgICAgIHRoaXMuTVhDID0gbWF0cml4WzZdOworICAgICAgdGhpcy5NWUMgPSBtYXRyaXhbN107CisgICAgICB0aGlzLk1aQyA9IG1hdHJpeFs4XTsKKworICAgICAgaWYgKFhXIDwgMCB8fCBaVyA8IDAgfHwgWVcgIT09IDEpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9YCArICIsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpOworICAgICAgfQorCisgICAgICBpZiAoWEIgPCAwIHx8IFlCIDwgMCB8fCBaQiA8IDApIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKGBJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICR7dGhpcy5uYW1lfSBbJHtYQn0sICR7WUJ9LCAke1pCfV0sIGAgKyAiZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIik7CisgICAgICAgIHRoaXMuYmxhY2tQb2ludCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLkdSIDwgMCB8fCB0aGlzLkdHIDwgMCB8fCB0aGlzLkdCIDwgMCkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoYEludmFsaWQgR2FtbWEgWyR7dGhpcy5HUn0sICR7dGhpcy5HR30sICR7dGhpcy5HQn1dIGZvciBgICsgYCR7dGhpcy5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuYCk7CisgICAgICAgIHRoaXMuR1IgPSB0aGlzLkdHID0gdGhpcy5HQiA9IDE7CisgICAgICB9CisgICAgfQorCisgICAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgY29udmVydFRvUmdiKHRoaXMsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCAxKTsKKyAgICB9CisKKyAgICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CisgICAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpOworICAgICAgICBzcmNPZmZzZXQgKz0gMzsKKyAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKKyAgICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSkgLyAzIHwgMDsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiBDYWxSR0JDUzsKK30oKTsKKworY29uc3QgTGFiQ1MgPSBmdW5jdGlvbiBMYWJDU0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGZuX2coeCkgeworICAgIGxldCByZXN1bHQ7CisKKyAgICBpZiAoeCA+PSA2IC8gMjkpIHsKKyAgICAgIHJlc3VsdCA9IHggKiB4ICogeDsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gMTA4IC8gODQxICogKHggLSA0IC8gMjkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGUodmFsdWUsIGhpZ2gxLCBsb3cyLCBoaWdoMikgeworICAgIHJldHVybiBsb3cyICsgdmFsdWUgKiAoaGlnaDIgLSBsb3cyKSAvIGhpZ2gxOworICB9CisKKyAgZnVuY3Rpb24gY29udmVydFRvUmdiKGNzLCBzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgbGV0IExzID0gc3JjW3NyY09mZnNldF07CisgICAgbGV0IGFzID0gc3JjW3NyY09mZnNldCArIDFdOworICAgIGxldCBicyA9IHNyY1tzcmNPZmZzZXQgKyAyXTsKKworICAgIGlmIChtYXhWYWwgIT09IGZhbHNlKSB7CisgICAgICBMcyA9IGRlY29kZShMcywgbWF4VmFsLCAwLCAxMDApOworICAgICAgYXMgPSBkZWNvZGUoYXMsIG1heFZhbCwgY3MuYW1pbiwgY3MuYW1heCk7CisgICAgICBicyA9IGRlY29kZShicywgbWF4VmFsLCBjcy5ibWluLCBjcy5ibWF4KTsKKyAgICB9CisKKyAgICBpZiAoYXMgPiBjcy5hbWF4KSB7CisgICAgICBhcyA9IGNzLmFtYXg7CisgICAgfSBlbHNlIGlmIChhcyA8IGNzLmFtaW4pIHsKKyAgICAgIGFzID0gY3MuYW1pbjsKKyAgICB9CisKKyAgICBpZiAoYnMgPiBjcy5ibWF4KSB7CisgICAgICBicyA9IGNzLmJtYXg7CisgICAgfSBlbHNlIGlmIChicyA8IGNzLmJtaW4pIHsKKyAgICAgIGJzID0gY3MuYm1pbjsKKyAgICB9CisKKyAgICBjb25zdCBNID0gKExzICsgMTYpIC8gMTE2OworICAgIGNvbnN0IEwgPSBNICsgYXMgLyA1MDA7CisgICAgY29uc3QgTiA9IE0gLSBicyAvIDIwMDsKKyAgICBjb25zdCBYID0gY3MuWFcgKiBmbl9nKEwpOworICAgIGNvbnN0IFkgPSBjcy5ZVyAqIGZuX2coTSk7CisgICAgY29uc3QgWiA9IGNzLlpXICogZm5fZyhOKTsKKyAgICBsZXQgciwgZywgYjsKKworICAgIGlmIChjcy5aVyA8IDEpIHsKKyAgICAgIHIgPSBYICogMy4xMzM5ICsgWSAqIC0xLjYxNyArIFogKiAtMC40OTA2OworICAgICAgZyA9IFggKiAtMC45Nzg1ICsgWSAqIDEuOTE2ICsgWiAqIDAuMDMzMzsKKyAgICAgIGIgPSBYICogMC4wNzIgKyBZICogLTAuMjI5ICsgWiAqIDEuNDA1NzsKKyAgICB9IGVsc2UgeworICAgICAgciA9IFggKiAzLjI0MDYgKyBZICogLTEuNTM3MiArIFogKiAtMC40OTg2OworICAgICAgZyA9IFggKiAtMC45Njg5ICsgWSAqIDEuODc1OCArIFogKiAwLjA0MTU7CisgICAgICBiID0gWCAqIDAuMDU1NyArIFkgKiAtMC4yMDQgKyBaICogMS4wNTc7CisgICAgfQorCisgICAgZGVzdFtkZXN0T2Zmc2V0XSA9IE1hdGguc3FydChyKSAqIDI1NTsKKyAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IE1hdGguc3FydChnKSAqIDI1NTsKKyAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IE1hdGguc3FydChiKSAqIDI1NTsKKyAgfQorCisgIGNsYXNzIExhYkNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CisgICAgY29uc3RydWN0b3Iod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgcmFuZ2UpIHsKKyAgICAgIHN1cGVyKCJMYWIiLCAzKTsKKworICAgICAgaWYgKCF3aGl0ZVBvaW50KSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIExhYiIpOworICAgICAgfQorCisgICAgICBibGFja1BvaW50ID0gYmxhY2tQb2ludCB8fCBbMCwgMCwgMF07CisgICAgICByYW5nZSA9IHJhbmdlIHx8IFstMTAwLCAxMDAsIC0xMDAsIDEwMF07CisgICAgICB0aGlzLlhXID0gd2hpdGVQb2ludFswXTsKKyAgICAgIHRoaXMuWVcgPSB3aGl0ZVBvaW50WzFdOworICAgICAgdGhpcy5aVyA9IHdoaXRlUG9pbnRbMl07CisgICAgICB0aGlzLmFtaW4gPSByYW5nZVswXTsKKyAgICAgIHRoaXMuYW1heCA9IHJhbmdlWzFdOworICAgICAgdGhpcy5ibWluID0gcmFuZ2VbMl07CisgICAgICB0aGlzLmJtYXggPSByYW5nZVszXTsKKyAgICAgIHRoaXMuWEIgPSBibGFja1BvaW50WzBdOworICAgICAgdGhpcy5ZQiA9IGJsYWNrUG9pbnRbMV07CisgICAgICB0aGlzLlpCID0gYmxhY2tQb2ludFsyXTsKKworICAgICAgaWYgKHRoaXMuWFcgPCAwIHx8IHRoaXMuWlcgPCAwIHx8IHRoaXMuWVcgIT09IDEpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cywgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLlhCIDwgMCB8fCB0aGlzLllCIDwgMCB8fCB0aGlzLlpCIDwgMCkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkludmFsaWQgQmxhY2tQb2ludCwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQiKTsKKyAgICAgICAgdGhpcy5YQiA9IHRoaXMuWUIgPSB0aGlzLlpCID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuYW1pbiA+IHRoaXMuYW1heCB8fCB0aGlzLmJtaW4gPiB0aGlzLmJtYXgpIHsKKyAgICAgICAgKDAsIF91dGlsLmluZm8pKCJJbnZhbGlkIFJhbmdlLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdHMiKTsKKyAgICAgICAgdGhpcy5hbWluID0gLTEwMDsKKyAgICAgICAgdGhpcy5hbWF4ID0gMTAwOworICAgICAgICB0aGlzLmJtaW4gPSAtMTAwOworICAgICAgICB0aGlzLmJtYXggPSAxMDA7CisgICAgICB9CisgICAgfQorCisgICAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgY29udmVydFRvUmdiKHRoaXMsIHNyYywgc3JjT2Zmc2V0LCBmYWxzZSwgZGVzdCwgZGVzdE9mZnNldCk7CisgICAgfQorCisgICAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgeworICAgICAgY29uc3QgbWF4VmFsID0gKDEgPDwgYml0cykgLSAxOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgY29udmVydFRvUmdiKHRoaXMsIHNyYywgc3JjT2Zmc2V0LCBtYXhWYWwsIGRlc3QsIGRlc3RPZmZzZXQpOworICAgICAgICBzcmNPZmZzZXQgKz0gMzsKKyAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKKyAgICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSkgLyAzIHwgMDsKKyAgICB9CisKKyAgICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInVzZXNaZXJvVG9PbmVSYW5nZSIsIGZhbHNlKTsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiBMYWJDUzsKK30oKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9jb3JlX3V0aWxzLmpzIGIvbGliL2NvcmUvY29yZV91dGlscy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTMzNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvY29yZV91dGlscy5qcwpAQCAtMCwwICsxLDE1MiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5ID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5OworZXhwb3J0cy5nZXRJbmhlcml0YWJsZVByb3BlcnR5ID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTsKK2V4cG9ydHMudG9Sb21hbk51bWVyYWxzID0gdG9Sb21hbk51bWVyYWxzOworZXhwb3J0cy5sb2cyID0gbG9nMjsKK2V4cG9ydHMucmVhZEludDggPSByZWFkSW50ODsKK2V4cG9ydHMucmVhZFVpbnQxNiA9IHJlYWRVaW50MTY7CitleHBvcnRzLnJlYWRVaW50MzIgPSByZWFkVWludDMyOworZXhwb3J0cy5pc1doaXRlU3BhY2UgPSBpc1doaXRlU3BhY2U7CitleHBvcnRzLlhSZWZQYXJzZUV4Y2VwdGlvbiA9IGV4cG9ydHMuWFJlZkVudHJ5RXhjZXB0aW9uID0gZXhwb3J0cy5NaXNzaW5nRGF0YUV4Y2VwdGlvbiA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKworZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGluaXRpYWxpemVyKSB7CisgIGxldCBsb29rdXA7CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgaWYgKGluaXRpYWxpemVyKSB7CisgICAgICBsb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgaW5pdGlhbGl6ZXIobG9va3VwKTsKKyAgICAgIGluaXRpYWxpemVyID0gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4gbG9va3VwOworICB9OworfQorCitjbGFzcyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3RvcihiZWdpbiwgZW5kKSB7CisgICAgc3VwZXIoYE1pc3NpbmcgZGF0YSBbJHtiZWdpbn0sICR7ZW5kfSlgKTsKKyAgICB0aGlzLmJlZ2luID0gYmVnaW47CisgICAgdGhpcy5lbmQgPSBlbmQ7CisgIH0KKworfQorCitleHBvcnRzLk1pc3NpbmdEYXRhRXhjZXB0aW9uID0gTWlzc2luZ0RhdGFFeGNlcHRpb247CisKK2NsYXNzIFhSZWZFbnRyeUV4Y2VwdGlvbiBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5YUmVmRW50cnlFeGNlcHRpb24gPSBYUmVmRW50cnlFeGNlcHRpb247CisKK2NsYXNzIFhSZWZQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24ge30KKworZXhwb3J0cy5YUmVmUGFyc2VFeGNlcHRpb24gPSBYUmVmUGFyc2VFeGNlcHRpb247CisKK2Z1bmN0aW9uIGdldEluaGVyaXRhYmxlUHJvcGVydHkoeworICBkaWN0LAorICBrZXksCisgIGdldEFycmF5ID0gZmFsc2UsCisgIHN0b3BXaGVuRm91bmQgPSB0cnVlCit9KSB7CisgIGNvbnN0IExPT1BfTElNSVQgPSAxMDA7CisgIGxldCBsb29wQ291bnQgPSAwOworICBsZXQgdmFsdWVzOworCisgIHdoaWxlIChkaWN0KSB7CisgICAgY29uc3QgdmFsdWUgPSBnZXRBcnJheSA/IGRpY3QuZ2V0QXJyYXkoa2V5KSA6IGRpY3QuZ2V0KGtleSk7CisKKyAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgaWYgKHN0b3BXaGVuRm91bmQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorCisgICAgICBpZiAoIXZhbHVlcykgeworICAgICAgICB2YWx1ZXMgPSBbXTsKKyAgICAgIH0KKworICAgICAgdmFsdWVzLnB1c2godmFsdWUpOworICAgIH0KKworICAgIGlmICgrK2xvb3BDb3VudCA+IExPT1BfTElNSVQpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTogbWF4aW11bSBsb29wIGNvdW50IGV4Y2VlZGVkIGZvciAiJHtrZXl9ImApOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGljdCA9IGRpY3QuZ2V0KCJQYXJlbnQiKTsKKyAgfQorCisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2NvbnN0IFJPTUFOX05VTUJFUl9NQVAgPSBbIiIsICJDIiwgIkNDIiwgIkNDQyIsICJDRCIsICJEIiwgIkRDIiwgIkRDQyIsICJEQ0NDIiwgIkNNIiwgIiIsICJYIiwgIlhYIiwgIlhYWCIsICJYTCIsICJMIiwgIkxYIiwgIkxYWCIsICJMWFhYIiwgIlhDIiwgIiIsICJJIiwgIklJIiwgIklJSSIsICJJViIsICJWIiwgIlZJIiwgIlZJSSIsICJWSUlJIiwgIklYIl07CisKK2Z1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhudW1iZXIsIGxvd2VyQ2FzZSA9IGZhbHNlKSB7CisgICgwLCBfdXRpbC5hc3NlcnQpKE51bWJlci5pc0ludGVnZXIobnVtYmVyKSAmJiBudW1iZXIgPiAwLCAiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOworICBjb25zdCByb21hbkJ1ZiA9IFtdOworICBsZXQgcG9zOworCisgIHdoaWxlIChudW1iZXIgPj0gMTAwMCkgeworICAgIG51bWJlciAtPSAxMDAwOworICAgIHJvbWFuQnVmLnB1c2goIk0iKTsKKyAgfQorCisgIHBvcyA9IG51bWJlciAvIDEwMCB8IDA7CisgIG51bWJlciAlPSAxMDA7CisgIHJvbWFuQnVmLnB1c2goUk9NQU5fTlVNQkVSX01BUFtwb3NdKTsKKyAgcG9zID0gbnVtYmVyIC8gMTAgfCAwOworICBudW1iZXIgJT0gMTA7CisgIHJvbWFuQnVmLnB1c2goUk9NQU5fTlVNQkVSX01BUFsxMCArIHBvc10pOworICByb21hbkJ1Zi5wdXNoKFJPTUFOX05VTUJFUl9NQVBbMjAgKyBudW1iZXJdKTsKKyAgY29uc3Qgcm9tYW5TdHIgPSByb21hbkJ1Zi5qb2luKCIiKTsKKyAgcmV0dXJuIGxvd2VyQ2FzZSA/IHJvbWFuU3RyLnRvTG93ZXJDYXNlKCkgOiByb21hblN0cjsKK30KKworZnVuY3Rpb24gbG9nMih4KSB7CisgIGlmICh4IDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBNYXRoLmNlaWwoTWF0aC5sb2cyKHgpKTsKK30KKworZnVuY3Rpb24gcmVhZEludDgoZGF0YSwgb2Zmc2V0KSB7CisgIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgPj4gMjQ7Cit9CisKK2Z1bmN0aW9uIHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KSB7CisgIHJldHVybiBkYXRhW29mZnNldF0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgMV07Cit9CisKK2Z1bmN0aW9uIHJlYWRVaW50MzIoZGF0YSwgb2Zmc2V0KSB7CisgIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNiB8IGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgM10pID4+PiAwOworfQorCitmdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHsKKyAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL2NyeXB0by5qcyBiL2xpYi9jb3JlL2NyeXB0by5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE0NzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvY3J5cHRvLmpzCkBAIC0wLDAgKzEsMTY0MiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuY2FsY3VsYXRlU0hBNTEyID0gZXhwb3J0cy5jYWxjdWxhdGVTSEEzODQgPSBleHBvcnRzLmNhbGN1bGF0ZVNIQTI1NiA9IGV4cG9ydHMuY2FsY3VsYXRlTUQ1ID0gZXhwb3J0cy5QREYyMCA9IGV4cG9ydHMuUERGMTcgPSBleHBvcnRzLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkgPSBleHBvcnRzLkFSQ0ZvdXJDaXBoZXIgPSBleHBvcnRzLkFFUzI1NkNpcGhlciA9IGV4cG9ydHMuQUVTMTI4Q2lwaGVyID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuL3ByaW1pdGl2ZXMuanMiKTsKKwordmFyIF9zdHJlYW0gPSByZXF1aXJlKCIuL3N0cmVhbS5qcyIpOworCit2YXIgQVJDRm91ckNpcGhlciA9IGZ1bmN0aW9uIEFSQ0ZvdXJDaXBoZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiBBUkNGb3VyQ2lwaGVyKGtleSkgeworICAgIHRoaXMuYSA9IDA7CisgICAgdGhpcy5iID0gMDsKKyAgICB2YXIgcyA9IG5ldyBVaW50OEFycmF5KDI1Nik7CisgICAgdmFyIGksCisgICAgICAgIGogPSAwLAorICAgICAgICB0bXAsCisgICAgICAgIGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgIHNbaV0gPSBpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgdG1wID0gc1tpXTsKKyAgICAgIGogPSBqICsgdG1wICsga2V5W2kgJSBrZXlMZW5ndGhdICYgMHhmZjsKKyAgICAgIHNbaV0gPSBzW2pdOworICAgICAgc1tqXSA9IHRtcDsKKyAgICB9CisKKyAgICB0aGlzLnMgPSBzOworICB9CisKKyAgQVJDRm91ckNpcGhlci5wcm90b3R5cGUgPSB7CisgICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiBBUkNGb3VyQ2lwaGVyX2VuY3J5cHRCbG9jayhkYXRhKSB7CisgICAgICB2YXIgaSwKKyAgICAgICAgICBuID0gZGF0YS5sZW5ndGgsCisgICAgICAgICAgdG1wLAorICAgICAgICAgIHRtcDI7CisgICAgICB2YXIgYSA9IHRoaXMuYSwKKyAgICAgICAgICBiID0gdGhpcy5iLAorICAgICAgICAgIHMgPSB0aGlzLnM7CisgICAgICB2YXIgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkobik7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgYSA9IGEgKyAxICYgMHhmZjsKKyAgICAgICAgdG1wID0gc1thXTsKKyAgICAgICAgYiA9IGIgKyB0bXAgJiAweGZmOworICAgICAgICB0bXAyID0gc1tiXTsKKyAgICAgICAgc1thXSA9IHRtcDI7CisgICAgICAgIHNbYl0gPSB0bXA7CisgICAgICAgIG91dHB1dFtpXSA9IGRhdGFbaV0gXiBzW3RtcCArIHRtcDIgJiAweGZmXTsKKyAgICAgIH0KKworICAgICAgdGhpcy5hID0gYTsKKyAgICAgIHRoaXMuYiA9IGI7CisgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKyAgfTsKKyAgQVJDRm91ckNpcGhlci5wcm90b3R5cGUuZGVjcnlwdEJsb2NrID0gQVJDRm91ckNpcGhlci5wcm90b3R5cGUuZW5jcnlwdEJsb2NrOworICBBUkNGb3VyQ2lwaGVyLnByb3RvdHlwZS5lbmNyeXB0ID0gQVJDRm91ckNpcGhlci5wcm90b3R5cGUuZW5jcnlwdEJsb2NrOworICByZXR1cm4gQVJDRm91ckNpcGhlcjsKK30oKTsKKworZXhwb3J0cy5BUkNGb3VyQ2lwaGVyID0gQVJDRm91ckNpcGhlcjsKKwordmFyIGNhbGN1bGF0ZU1ENSA9IGZ1bmN0aW9uIGNhbGN1bGF0ZU1ENUNsb3N1cmUoKSB7CisgIHZhciByID0gbmV3IFVpbnQ4QXJyYXkoWzcsIDEyLCAxNywgMjIsIDcsIDEyLCAxNywgMjIsIDcsIDEyLCAxNywgMjIsIDcsIDEyLCAxNywgMjIsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNCwgMTEsIDE2LCAyMywgNCwgMTEsIDE2LCAyMywgNCwgMTEsIDE2LCAyMywgNCwgMTEsIDE2LCAyMywgNiwgMTAsIDE1LCAyMSwgNiwgMTAsIDE1LCAyMSwgNiwgMTAsIDE1LCAyMSwgNiwgMTAsIDE1LCAyMV0pOworICB2YXIgayA9IG5ldyBJbnQzMkFycmF5KFstNjgwODc2OTM2LCAtMzg5NTY0NTg2LCA2MDYxMDU4MTksIC0xMDQ0NTI1MzMwLCAtMTc2NDE4ODk3LCAxMjAwMDgwNDI2LCAtMTQ3MzIzMTM0MSwgLTQ1NzA1OTgzLCAxNzcwMDM1NDE2LCAtMTk1ODQxNDQxNywgLTQyMDYzLCAtMTk5MDQwNDE2MiwgMTgwNDYwMzY4MiwgLTQwMzQxMTAxLCAtMTUwMjAwMjI5MCwgMTIzNjUzNTMyOSwgLTE2NTc5NjUxMCwgLTEwNjk1MDE2MzIsIDY0MzcxNzcxMywgLTM3Mzg5NzMwMiwgLTcwMTU1ODY5MSwgMzgwMTYwODMsIC02NjA0NzgzMzUsIC00MDU1Mzc4NDgsIDU2ODQ0NjQzOCwgLTEwMTk4MDM2OTAsIC0xODczNjM5NjEsIDExNjM1MzE1MDEsIC0xNDQ0NjgxNDY3LCAtNTE0MDM3ODQsIDE3MzUzMjg0NzMsIC0xOTI2NjA3NzM0LCAtMzc4NTU4LCAtMjAyMjU3NDQ2MywgMTgzOTAzMDU2MiwgLTM1MzA5NTU2LCAtMTUzMDk5MjA2MCwgMTI3Mjg5MzM1MywgLTE1NTQ5NzYzMiwgLTEwOTQ3MzA2NDAsIDY4MTI3OTE3NCwgLTM1ODUzNzIyMiwgLTcyMjUyMTk3OSwgNzYwMjkxODksIC02NDAzNjQ0ODcsIC00MjE4MTU4MzUsIDUzMDc0MjUyMCwgLTk5NTMzODY1MSwgLTE5ODYzMDg0NCwgMTEyNjg5MTQxNSwgLTE0MTYzNTQ5MDUsIC01NzQzNDA1NSwgMTcwMDQ4NTU3MSwgLTE4OTQ5ODY2MDYsIC0xMDUxNTIzLCAtMjA1NDkyMjc5OSwgMTg3MzMxMzM1OSwgLTMwNjExNzQ0LCAtMTU2MDE5ODM4MCwgMTMwOTE1MTY0OSwgLTE0NTUyMzA3MCwgLTExMjAyMTAzNzksIDcxODc4NzI1OSwgLTM0MzQ4NTU1MV0pOworCisgIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHsKKyAgICB2YXIgaDAgPSAxNzMyNTg0MTkzLAorICAgICAgICBoMSA9IC0yNzE3MzM4NzksCisgICAgICAgIGgyID0gLTE3MzI1ODQxOTQsCisgICAgICAgIGgzID0gMjcxNzMzODc4OworICAgIHZhciBwYWRkZWRMZW5ndGggPSBsZW5ndGggKyA3MiAmIH42MzsKKyAgICB2YXIgcGFkZGVkID0gbmV3IFVpbnQ4QXJyYXkocGFkZGVkTGVuZ3RoKTsKKyAgICB2YXIgaSwgaiwgbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CisgICAgfQorCisgICAgcGFkZGVkW2krK10gPSAweDgwOworICAgIG4gPSBwYWRkZWRMZW5ndGggLSA4OworCisgICAgd2hpbGUgKGkgPCBuKSB7CisgICAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgfQorCisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPDwgMyAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gNSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMTMgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDIxICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+Pj4gMjkgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHZhciB3ID0gbmV3IEludDMyQXJyYXkoMTYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqLCBpICs9IDQpIHsKKyAgICAgICAgd1tqXSA9IHBhZGRlZFtpXSB8IHBhZGRlZFtpICsgMV0gPDwgOCB8IHBhZGRlZFtpICsgMl0gPDwgMTYgfCBwYWRkZWRbaSArIDNdIDw8IDI0OworICAgICAgfQorCisgICAgICB2YXIgYSA9IGgwLAorICAgICAgICAgIGIgPSBoMSwKKyAgICAgICAgICBjID0gaDIsCisgICAgICAgICAgZCA9IGgzLAorICAgICAgICAgIGYsCisgICAgICAgICAgZzsKKworICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyArK2opIHsKKyAgICAgICAgaWYgKGogPCAxNikgeworICAgICAgICAgIGYgPSBiICYgYyB8IH5iICYgZDsKKyAgICAgICAgICBnID0gajsKKyAgICAgICAgfSBlbHNlIGlmIChqIDwgMzIpIHsKKyAgICAgICAgICBmID0gZCAmIGIgfCB+ZCAmIGM7CisgICAgICAgICAgZyA9IDUgKiBqICsgMSAmIDE1OworICAgICAgICB9IGVsc2UgaWYgKGogPCA0OCkgeworICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7CisgICAgICAgICAgZyA9IDMgKiBqICsgNSAmIDE1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGYgPSBjIF4gKGIgfCB+ZCk7CisgICAgICAgICAgZyA9IDcgKiBqICYgMTU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdG1wID0gZCwKKyAgICAgICAgICAgIHJvdGF0ZUFyZyA9IGEgKyBmICsga1tqXSArIHdbZ10gfCAwLAorICAgICAgICAgICAgcm90YXRlID0gcltqXTsKKyAgICAgICAgZCA9IGM7CisgICAgICAgIGMgPSBiOworICAgICAgICBiID0gYiArIChyb3RhdGVBcmcgPDwgcm90YXRlIHwgcm90YXRlQXJnID4+PiAzMiAtIHJvdGF0ZSkgfCAwOworICAgICAgICBhID0gdG1wOworICAgICAgfQorCisgICAgICBoMCA9IGgwICsgYSB8IDA7CisgICAgICBoMSA9IGgxICsgYiB8IDA7CisgICAgICBoMiA9IGgyICsgYyB8IDA7CisgICAgICBoMyA9IGgzICsgZCB8IDA7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtoMCAmIDB4RkYsIGgwID4+IDggJiAweEZGLCBoMCA+PiAxNiAmIDB4RkYsIGgwID4+PiAyNCAmIDB4RkYsIGgxICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4+IDI0ICYgMHhGRiwgaDIgJiAweEZGLCBoMiA+PiA4ICYgMHhGRiwgaDIgPj4gMTYgJiAweEZGLCBoMiA+Pj4gMjQgJiAweEZGLCBoMyAmIDB4RkYsIGgzID4+IDggJiAweEZGLCBoMyA+PiAxNiAmIDB4RkYsIGgzID4+PiAyNCAmIDB4RkZdKTsKKyAgfQorCisgIHJldHVybiBoYXNoOworfSgpOworCitleHBvcnRzLmNhbGN1bGF0ZU1ENSA9IGNhbGN1bGF0ZU1ENTsKKwordmFyIFdvcmQ2NCA9IGZ1bmN0aW9uIFdvcmQ2NENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFdvcmQ2NChoaWdoSW50ZWdlciwgbG93SW50ZWdlcikgeworICAgIHRoaXMuaGlnaCA9IGhpZ2hJbnRlZ2VyIHwgMDsKKyAgICB0aGlzLmxvdyA9IGxvd0ludGVnZXIgfCAwOworICB9CisKKyAgV29yZDY0LnByb3RvdHlwZSA9IHsKKyAgICBhbmQ6IGZ1bmN0aW9uIFdvcmQ2NF9hbmQod29yZCkgeworICAgICAgdGhpcy5oaWdoICY9IHdvcmQuaGlnaDsKKyAgICAgIHRoaXMubG93ICY9IHdvcmQubG93OworICAgIH0sCisgICAgeG9yOiBmdW5jdGlvbiBXb3JkNjRfeG9yKHdvcmQpIHsKKyAgICAgIHRoaXMuaGlnaCBePSB3b3JkLmhpZ2g7CisgICAgICB0aGlzLmxvdyBePSB3b3JkLmxvdzsKKyAgICB9LAorICAgIG9yOiBmdW5jdGlvbiBXb3JkNjRfb3Iod29yZCkgeworICAgICAgdGhpcy5oaWdoIHw9IHdvcmQuaGlnaDsKKyAgICAgIHRoaXMubG93IHw9IHdvcmQubG93OworICAgIH0sCisgICAgc2hpZnRSaWdodDogZnVuY3Rpb24gV29yZDY0X3NoaWZ0UmlnaHQocGxhY2VzKSB7CisgICAgICBpZiAocGxhY2VzID49IDMyKSB7CisgICAgICAgIHRoaXMubG93ID0gdGhpcy5oaWdoID4+PiBwbGFjZXMgLSAzMiB8IDA7CisgICAgICAgIHRoaXMuaGlnaCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmxvdyA9IHRoaXMubG93ID4+PiBwbGFjZXMgfCB0aGlzLmhpZ2ggPDwgMzIgLSBwbGFjZXM7CisgICAgICAgIHRoaXMuaGlnaCA9IHRoaXMuaGlnaCA+Pj4gcGxhY2VzIHwgMDsKKyAgICAgIH0KKyAgICB9LAorICAgIHNoaWZ0TGVmdDogZnVuY3Rpb24gV29yZDY0X3NoaWZ0TGVmdChwbGFjZXMpIHsKKyAgICAgIGlmIChwbGFjZXMgPj0gMzIpIHsKKyAgICAgICAgdGhpcy5oaWdoID0gdGhpcy5sb3cgPDwgcGxhY2VzIC0gMzI7CisgICAgICAgIHRoaXMubG93ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuaGlnaCA9IHRoaXMuaGlnaCA8PCBwbGFjZXMgfCB0aGlzLmxvdyA+Pj4gMzIgLSBwbGFjZXM7CisgICAgICAgIHRoaXMubG93ID0gdGhpcy5sb3cgPDwgcGxhY2VzOworICAgICAgfQorICAgIH0sCisgICAgcm90YXRlUmlnaHQ6IGZ1bmN0aW9uIFdvcmQ2NF9yb3RhdGVSaWdodChwbGFjZXMpIHsKKyAgICAgIHZhciBsb3csIGhpZ2g7CisKKyAgICAgIGlmIChwbGFjZXMgJiAzMikgeworICAgICAgICBoaWdoID0gdGhpcy5sb3c7CisgICAgICAgIGxvdyA9IHRoaXMuaGlnaDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvdyA9IHRoaXMubG93OworICAgICAgICBoaWdoID0gdGhpcy5oaWdoOworICAgICAgfQorCisgICAgICBwbGFjZXMgJj0gMzE7CisgICAgICB0aGlzLmxvdyA9IGxvdyA+Pj4gcGxhY2VzIHwgaGlnaCA8PCAzMiAtIHBsYWNlczsKKyAgICAgIHRoaXMuaGlnaCA9IGhpZ2ggPj4+IHBsYWNlcyB8IGxvdyA8PCAzMiAtIHBsYWNlczsKKyAgICB9LAorICAgIG5vdDogZnVuY3Rpb24gV29yZDY0X25vdCgpIHsKKyAgICAgIHRoaXMuaGlnaCA9IH50aGlzLmhpZ2g7CisgICAgICB0aGlzLmxvdyA9IH50aGlzLmxvdzsKKyAgICB9LAorICAgIGFkZDogZnVuY3Rpb24gV29yZDY0X2FkZCh3b3JkKSB7CisgICAgICB2YXIgbG93QWRkID0gKHRoaXMubG93ID4+PiAwKSArICh3b3JkLmxvdyA+Pj4gMCk7CisgICAgICB2YXIgaGlnaEFkZCA9ICh0aGlzLmhpZ2ggPj4+IDApICsgKHdvcmQuaGlnaCA+Pj4gMCk7CisKKyAgICAgIGlmIChsb3dBZGQgPiAweGZmZmZmZmZmKSB7CisgICAgICAgIGhpZ2hBZGQgKz0gMTsKKyAgICAgIH0KKworICAgICAgdGhpcy5sb3cgPSBsb3dBZGQgfCAwOworICAgICAgdGhpcy5oaWdoID0gaGlnaEFkZCB8IDA7CisgICAgfSwKKyAgICBjb3B5VG86IGZ1bmN0aW9uIFdvcmQ2NF9jb3B5VG8oYnl0ZXMsIG9mZnNldCkgeworICAgICAgYnl0ZXNbb2Zmc2V0XSA9IHRoaXMuaGlnaCA+Pj4gMjQgJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgMV0gPSB0aGlzLmhpZ2ggPj4gMTYgJiAweGZmOworICAgICAgYnl0ZXNbb2Zmc2V0ICsgMl0gPSB0aGlzLmhpZ2ggPj4gOCAmIDB4ZmY7CisgICAgICBieXRlc1tvZmZzZXQgKyAzXSA9IHRoaXMuaGlnaCAmIDB4ZmY7CisgICAgICBieXRlc1tvZmZzZXQgKyA0XSA9IHRoaXMubG93ID4+PiAyNCAmIDB4ZmY7CisgICAgICBieXRlc1tvZmZzZXQgKyA1XSA9IHRoaXMubG93ID4+IDE2ICYgMHhmZjsKKyAgICAgIGJ5dGVzW29mZnNldCArIDZdID0gdGhpcy5sb3cgPj4gOCAmIDB4ZmY7CisgICAgICBieXRlc1tvZmZzZXQgKyA3XSA9IHRoaXMubG93ICYgMHhmZjsKKyAgICB9LAorICAgIGFzc2lnbjogZnVuY3Rpb24gV29yZDY0X2Fzc2lnbih3b3JkKSB7CisgICAgICB0aGlzLmhpZ2ggPSB3b3JkLmhpZ2g7CisgICAgICB0aGlzLmxvdyA9IHdvcmQubG93OworICAgIH0KKyAgfTsKKyAgcmV0dXJuIFdvcmQ2NDsKK30oKTsKKwordmFyIGNhbGN1bGF0ZVNIQTI1NiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTI1NkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIHJvdHIoeCwgbikgeworICAgIHJldHVybiB4ID4+PiBuIHwgeCA8PCAzMiAtIG47CisgIH0KKworICBmdW5jdGlvbiBjaCh4LCB5LCB6KSB7CisgICAgcmV0dXJuIHggJiB5IF4gfnggJiB6OworICB9CisKKyAgZnVuY3Rpb24gbWFqKHgsIHksIHopIHsKKyAgICByZXR1cm4geCAmIHkgXiB4ICYgeiBeIHkgJiB6OworICB9CisKKyAgZnVuY3Rpb24gc2lnbWEoeCkgeworICAgIHJldHVybiByb3RyKHgsIDIpIF4gcm90cih4LCAxMykgXiByb3RyKHgsIDIyKTsKKyAgfQorCisgIGZ1bmN0aW9uIHNpZ21hUHJpbWUoeCkgeworICAgIHJldHVybiByb3RyKHgsIDYpIF4gcm90cih4LCAxMSkgXiByb3RyKHgsIDI1KTsKKyAgfQorCisgIGZ1bmN0aW9uIGxpdHRsZVNpZ21hKHgpIHsKKyAgICByZXR1cm4gcm90cih4LCA3KSBeIHJvdHIoeCwgMTgpIF4geCA+Pj4gMzsKKyAgfQorCisgIGZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUoeCkgeworICAgIHJldHVybiByb3RyKHgsIDE3KSBeIHJvdHIoeCwgMTkpIF4geCA+Pj4gMTA7CisgIH0KKworICB2YXIgayA9IFsweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LCAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LCAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLCAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LCAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLCAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLCAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LCAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LCAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLCAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LCAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLCAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLCAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLCAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LCAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXTsKKworICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgdmFyIGgwID0gMHg2YTA5ZTY2NywKKyAgICAgICAgaDEgPSAweGJiNjdhZTg1LAorICAgICAgICBoMiA9IDB4M2M2ZWYzNzIsCisgICAgICAgIGgzID0gMHhhNTRmZjUzYSwKKyAgICAgICAgaDQgPSAweDUxMGU1MjdmLAorICAgICAgICBoNSA9IDB4OWIwNTY4OGMsCisgICAgICAgIGg2ID0gMHgxZjgzZDlhYiwKKyAgICAgICAgaDcgPSAweDViZTBjZDE5OworICAgIHZhciBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDkpIC8gNjQpICogNjQ7CisgICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7CisgICAgdmFyIGksIGosIG47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIHBhZGRlZFtpXSA9IGRhdGFbb2Zmc2V0KytdOworICAgIH0KKworICAgIHBhZGRlZFtpKytdID0gMHg4MDsKKyAgICBuID0gcGFkZGVkTGVuZ3RoIC0gODsKKworICAgIHdoaWxlIChpIDwgbikgeworICAgICAgcGFkZGVkW2krK10gPSAwOworICAgIH0KKworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKKyAgICB2YXIgdyA9IG5ldyBVaW50MzJBcnJheSg2NCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFkZGVkTGVuZ3RoOykgeworICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgd1tqXSA9IHBhZGRlZFtpXSA8PCAyNCB8IHBhZGRlZFtpICsgMV0gPDwgMTYgfCBwYWRkZWRbaSArIDJdIDw8IDggfCBwYWRkZWRbaSArIDNdOworICAgICAgICBpICs9IDQ7CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IDE2OyBqIDwgNjQ7ICsraikgeworICAgICAgICB3W2pdID0gbGl0dGxlU2lnbWFQcmltZSh3W2ogLSAyXSkgKyB3W2ogLSA3XSArIGxpdHRsZVNpZ21hKHdbaiAtIDE1XSkgKyB3W2ogLSAxNl0gfCAwOworICAgICAgfQorCisgICAgICB2YXIgYSA9IGgwLAorICAgICAgICAgIGIgPSBoMSwKKyAgICAgICAgICBjID0gaDIsCisgICAgICAgICAgZCA9IGgzLAorICAgICAgICAgIGUgPSBoNCwKKyAgICAgICAgICBmID0gaDUsCisgICAgICAgICAgZyA9IGg2LAorICAgICAgICAgIGggPSBoNywKKyAgICAgICAgICB0MSwKKyAgICAgICAgICB0MjsKKworICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyArK2opIHsKKyAgICAgICAgdDEgPSBoICsgc2lnbWFQcmltZShlKSArIGNoKGUsIGYsIGcpICsga1tqXSArIHdbal07CisgICAgICAgIHQyID0gc2lnbWEoYSkgKyBtYWooYSwgYiwgYyk7CisgICAgICAgIGggPSBnOworICAgICAgICBnID0gZjsKKyAgICAgICAgZiA9IGU7CisgICAgICAgIGUgPSBkICsgdDEgfCAwOworICAgICAgICBkID0gYzsKKyAgICAgICAgYyA9IGI7CisgICAgICAgIGIgPSBhOworICAgICAgICBhID0gdDEgKyB0MiB8IDA7CisgICAgICB9CisKKyAgICAgIGgwID0gaDAgKyBhIHwgMDsKKyAgICAgIGgxID0gaDEgKyBiIHwgMDsKKyAgICAgIGgyID0gaDIgKyBjIHwgMDsKKyAgICAgIGgzID0gaDMgKyBkIHwgMDsKKyAgICAgIGg0ID0gaDQgKyBlIHwgMDsKKyAgICAgIGg1ID0gaDUgKyBmIHwgMDsKKyAgICAgIGg2ID0gaDYgKyBnIHwgMDsKKyAgICAgIGg3ID0gaDcgKyBoIHwgMDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2gwID4+IDI0ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgJiAweEZGLCBoMSA+PiAyNCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxICYgMHhGRiwgaDIgPj4gMjQgJiAweEZGLCBoMiA+PiAxNiAmIDB4RkYsIGgyID4+IDggJiAweEZGLCBoMiAmIDB4RkYsIGgzID4+IDI0ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgJiAweEZGLCBoNCA+PiAyNCAmIDB4RkYsIGg0ID4+IDE2ICYgMHhGRiwgaDQgPj4gOCAmIDB4RkYsIGg0ICYgMHhGRiwgaDUgPj4gMjQgJiAweEZGLCBoNSA+PiAxNiAmIDB4RkYsIGg1ID4+IDggJiAweEZGLCBoNSAmIDB4RkYsIGg2ID4+IDI0ICYgMHhGRiwgaDYgPj4gMTYgJiAweEZGLCBoNiA+PiA4ICYgMHhGRiwgaDYgJiAweEZGLCBoNyA+PiAyNCAmIDB4RkYsIGg3ID4+IDE2ICYgMHhGRiwgaDcgPj4gOCAmIDB4RkYsIGg3ICYgMHhGRl0pOworICB9CisKKyAgcmV0dXJuIGhhc2g7Cit9KCk7CisKK2V4cG9ydHMuY2FsY3VsYXRlU0hBMjU2ID0gY2FsY3VsYXRlU0hBMjU2OworCit2YXIgY2FsY3VsYXRlU0hBNTEyID0gZnVuY3Rpb24gY2FsY3VsYXRlU0hBNTEyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gY2gocmVzdWx0LCB4LCB5LCB6LCB0bXApIHsKKyAgICByZXN1bHQuYXNzaWduKHgpOworICAgIHJlc3VsdC5hbmQoeSk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAubm90KCk7CisgICAgdG1wLmFuZCh6KTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgIH0KKworICBmdW5jdGlvbiBtYWoocmVzdWx0LCB4LCB5LCB6LCB0bXApIHsKKyAgICByZXN1bHQuYXNzaWduKHgpOworICAgIHJlc3VsdC5hbmQoeSk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAuYW5kKHopOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgICB0bXAuYXNzaWduKHkpOworICAgIHRtcC5hbmQoeik7CisgICAgcmVzdWx0Lnhvcih0bXApOworICB9CisKKyAgZnVuY3Rpb24gc2lnbWEocmVzdWx0LCB4LCB0bXApIHsKKyAgICByZXN1bHQuYXNzaWduKHgpOworICAgIHJlc3VsdC5yb3RhdGVSaWdodCgyOCk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAucm90YXRlUmlnaHQoMzQpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgICB0bXAuYXNzaWduKHgpOworICAgIHRtcC5yb3RhdGVSaWdodCgzOSk7CisgICAgcmVzdWx0Lnhvcih0bXApOworICB9CisKKyAgZnVuY3Rpb24gc2lnbWFQcmltZShyZXN1bHQsIHgsIHRtcCkgeworICAgIHJlc3VsdC5hc3NpZ24oeCk7CisgICAgcmVzdWx0LnJvdGF0ZVJpZ2h0KDE0KTsKKyAgICB0bXAuYXNzaWduKHgpOworICAgIHRtcC5yb3RhdGVSaWdodCgxOCk7CisgICAgcmVzdWx0Lnhvcih0bXApOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLnJvdGF0ZVJpZ2h0KDQxKTsKKyAgICByZXN1bHQueG9yKHRtcCk7CisgIH0KKworICBmdW5jdGlvbiBsaXR0bGVTaWdtYShyZXN1bHQsIHgsIHRtcCkgeworICAgIHJlc3VsdC5hc3NpZ24oeCk7CisgICAgcmVzdWx0LnJvdGF0ZVJpZ2h0KDEpOworICAgIHRtcC5hc3NpZ24oeCk7CisgICAgdG1wLnJvdGF0ZVJpZ2h0KDgpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgICB0bXAuYXNzaWduKHgpOworICAgIHRtcC5zaGlmdFJpZ2h0KDcpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgfQorCisgIGZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKKyAgICByZXN1bHQuYXNzaWduKHgpOworICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxOSk7CisgICAgdG1wLmFzc2lnbih4KTsKKyAgICB0bXAucm90YXRlUmlnaHQoNjEpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgICB0bXAuYXNzaWduKHgpOworICAgIHRtcC5zaGlmdFJpZ2h0KDYpOworICAgIHJlc3VsdC54b3IodG1wKTsKKyAgfQorCisgIHZhciBrID0gW25ldyBXb3JkNjQoMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiksIG5ldyBXb3JkNjQoMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCksIG5ldyBXb3JkNjQoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIG5ldyBXb3JkNjQoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksIG5ldyBXb3JkNjQoMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCksIG5ldyBXb3JkNjQoMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSksIG5ldyBXb3JkNjQoMHg5MjNmODJhNCwgMHhhZjE5NGY5YiksIG5ldyBXb3JkNjQoMHhhYjFjNWVkNSwgMHhkYTZkODExOCksIG5ldyBXb3JkNjQoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIG5ldyBXb3JkNjQoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksIG5ldyBXb3JkNjQoMHgyNDMxODViZSwgMHg0ZWU0YjI4YyksIG5ldyBXb3JkNjQoMHg1NTBjN2RjMywgMHhkNWZmYjRlMiksIG5ldyBXb3JkNjQoMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiksIG5ldyBXb3JkNjQoMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSksIG5ldyBXb3JkNjQoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIG5ldyBXb3JkNjQoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksIG5ldyBXb3JkNjQoMHhlNDliNjljMSwgMHg5ZWYxNGFkMiksIG5ldyBXb3JkNjQoMHhlZmJlNDc4NiwgMHgzODRmMjVlMyksIG5ldyBXb3JkNjQoMHgwZmMxOWRjNiwgMHg4YjhjZDViNSksIG5ldyBXb3JkNjQoMHgyNDBjYTFjYywgMHg3N2FjOWM2NSksIG5ldyBXb3JkNjQoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIG5ldyBXb3JkNjQoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksIG5ldyBXb3JkNjQoMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCksIG5ldyBXb3JkNjQoMHg3NmY5ODhkYSwgMHg4MzExNTNiNSksIG5ldyBXb3JkNjQoMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiksIG5ldyBXb3JkNjQoMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCksIG5ldyBXb3JkNjQoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIG5ldyBXb3JkNjQoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksIG5ldyBXb3JkNjQoMHhjNmUwMGJmMywgMHgzZGE4OGZjMiksIG5ldyBXb3JkNjQoMHhkNWE3OTE0NywgMHg5MzBhYTcyNSksIG5ldyBXb3JkNjQoMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiksIG5ldyBXb3JkNjQoMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCksIG5ldyBXb3JkNjQoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIG5ldyBXb3JkNjQoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksIG5ldyBXb3JkNjQoMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCksIG5ldyBXb3JkNjQoMHg1MzM4MGQxMywgMHg5ZDk1YjNkZiksIG5ldyBXb3JkNjQoMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSksIG5ldyBXb3JkNjQoMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCksIG5ldyBXb3JkNjQoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIG5ldyBXb3JkNjQoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksIG5ldyBXb3JkNjQoMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCksIG5ldyBXb3JkNjQoMHhhODFhNjY0YiwgMHhiYzQyMzAwMSksIG5ldyBXb3JkNjQoMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSksIG5ldyBXb3JkNjQoMHhjNzZjNTFhMywgMHgwNjU0YmUzMCksIG5ldyBXb3JkNjQoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIG5ldyBXb3JkNjQoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksIG5ldyBXb3JkNjQoMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSksIG5ldyBXb3JkNjQoMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCksIG5ldyBXb3JkNjQoMHgxOWE0YzExNiwgMHhiOGQyZDBjOCksIG5ldyBXb3JkNjQoMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyksIG5ldyBXb3JkNjQoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIG5ldyBXb3JkNjQoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksIG5ldyBXb3JkNjQoMHgzOTFjMGNiMywgMHhjNWM5NWE2MyksIG5ldyBXb3JkNjQoMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYiksIG5ldyBXb3JkNjQoMHg1YjljY2E0ZiwgMHg3NzYzZTM3MyksIG5ldyBXb3JkNjQoMHg2ODJlNmZmMywgMHhkNmIyYjhhMyksIG5ldyBXb3JkNjQoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIG5ldyBXb3JkNjQoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksIG5ldyBXb3JkNjQoMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiksIG5ldyBXb3JkNjQoMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyksIG5ldyBXb3JkNjQoMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCksIG5ldyBXb3JkNjQoMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSksIG5ldyBXb3JkNjQoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIG5ldyBXb3JkNjQoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksIG5ldyBXb3JkNjQoMHhjYTI3M2VjZSwgMHhlYTI2NjE5YyksIG5ldyBXb3JkNjQoMHhkMTg2YjhjNywgMHgyMWMwYzIwNyksIG5ldyBXb3JkNjQoMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSksIG5ldyBXb3JkNjQoMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCksIG5ldyBXb3JkNjQoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIG5ldyBXb3JkNjQoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksIG5ldyBXb3JkNjQoMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSksIG5ldyBXb3JkNjQoMHgxYjcxMGIzNSwgMHgxMzFjNDcxYiksIG5ldyBXb3JkNjQoMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCksIG5ldyBXb3JkNjQoMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyksIG5ldyBXb3JkNjQoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIG5ldyBXb3JkNjQoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksIG5ldyBXb3JkNjQoMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiksIG5ldyBXb3JkNjQoMHg1OTdmMjk5YywgMHhmYzY1N2UyYSksIG5ldyBXb3JkNjQoMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYyksIG5ldyBXb3JkNjQoMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNyldOworCisgIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIG1vZGUzODQpIHsKKyAgICBtb2RlMzg0ID0gISFtb2RlMzg0OworICAgIHZhciBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaDc7CisKKyAgICBpZiAoIW1vZGUzODQpIHsKKyAgICAgIGgwID0gbmV3IFdvcmQ2NCgweDZhMDllNjY3LCAweGYzYmNjOTA4KTsKKyAgICAgIGgxID0gbmV3IFdvcmQ2NCgweGJiNjdhZTg1LCAweDg0Y2FhNzNiKTsKKyAgICAgIGgyID0gbmV3IFdvcmQ2NCgweDNjNmVmMzcyLCAweGZlOTRmODJiKTsKKyAgICAgIGgzID0gbmV3IFdvcmQ2NCgweGE1NGZmNTNhLCAweDVmMWQzNmYxKTsKKyAgICAgIGg0ID0gbmV3IFdvcmQ2NCgweDUxMGU1MjdmLCAweGFkZTY4MmQxKTsKKyAgICAgIGg1ID0gbmV3IFdvcmQ2NCgweDliMDU2ODhjLCAweDJiM2U2YzFmKTsKKyAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweDFmODNkOWFiLCAweGZiNDFiZDZiKTsKKyAgICAgIGg3ID0gbmV3IFdvcmQ2NCgweDViZTBjZDE5LCAweDEzN2UyMTc5KTsKKyAgICB9IGVsc2UgeworICAgICAgaDAgPSBuZXcgV29yZDY0KDB4Y2JiYjlkNWQsIDB4YzEwNTllZDgpOworICAgICAgaDEgPSBuZXcgV29yZDY0KDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcpOworICAgICAgaDIgPSBuZXcgV29yZDY0KDB4OTE1OTAxNWEsIDB4MzA3MGRkMTcpOworICAgICAgaDMgPSBuZXcgV29yZDY0KDB4MTUyZmVjZDgsIDB4ZjcwZTU5MzkpOworICAgICAgaDQgPSBuZXcgV29yZDY0KDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEpOworICAgICAgaDUgPSBuZXcgV29yZDY0KDB4OGViNDRhODcsIDB4Njg1ODE1MTEpOworICAgICAgaDYgPSBuZXcgV29yZDY0KDB4ZGIwYzJlMGQsIDB4NjRmOThmYTcpOworICAgICAgaDcgPSBuZXcgV29yZDY0KDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQpOworICAgIH0KKworICAgIHZhciBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDE3KSAvIDEyOCkgKiAxMjg7CisgICAgdmFyIHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7CisgICAgdmFyIGksIGosIG47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIHBhZGRlZFtpXSA9IGRhdGFbb2Zmc2V0KytdOworICAgIH0KKworICAgIHBhZGRlZFtpKytdID0gMHg4MDsKKyAgICBuID0gcGFkZGVkTGVuZ3RoIC0gMTY7CisKKyAgICB3aGlsZSAoaSA8IG4pIHsKKyAgICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICB9CisKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gMDsKKyAgICBwYWRkZWRbaSsrXSA9IDA7CisgICAgcGFkZGVkW2krK10gPSAwOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CisgICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOworICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKKyAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKKyAgICB2YXIgdyA9IG5ldyBBcnJheSg4MCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykgeworICAgICAgd1tpXSA9IG5ldyBXb3JkNjQoMCwgMCk7CisgICAgfQorCisgICAgdmFyIGEgPSBuZXcgV29yZDY0KDAsIDApLAorICAgICAgICBiID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgYyA9IG5ldyBXb3JkNjQoMCwgMCk7CisgICAgdmFyIGQgPSBuZXcgV29yZDY0KDAsIDApLAorICAgICAgICBlID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgZiA9IG5ldyBXb3JkNjQoMCwgMCk7CisgICAgdmFyIGcgPSBuZXcgV29yZDY0KDAsIDApLAorICAgICAgICBoID0gbmV3IFdvcmQ2NCgwLCAwKTsKKyAgICB2YXIgdDEgPSBuZXcgV29yZDY0KDAsIDApLAorICAgICAgICB0MiA9IG5ldyBXb3JkNjQoMCwgMCk7CisgICAgdmFyIHRtcDEgPSBuZXcgV29yZDY0KDAsIDApLAorICAgICAgICB0bXAyID0gbmV3IFdvcmQ2NCgwLCAwKSwKKyAgICAgICAgdG1wMzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICB3W2pdLmhpZ2ggPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKKyAgICAgICAgd1tqXS5sb3cgPSBwYWRkZWRbaSArIDRdIDw8IDI0IHwgcGFkZGVkW2kgKyA1XSA8PCAxNiB8IHBhZGRlZFtpICsgNl0gPDwgOCB8IHBhZGRlZFtpICsgN107CisgICAgICAgIGkgKz0gODsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gMTY7IGogPCA4MDsgKytqKSB7CisgICAgICAgIHRtcDMgPSB3W2pdOworICAgICAgICBsaXR0bGVTaWdtYVByaW1lKHRtcDMsIHdbaiAtIDJdLCB0bXAyKTsKKyAgICAgICAgdG1wMy5hZGQod1tqIC0gN10pOworICAgICAgICBsaXR0bGVTaWdtYSh0bXAxLCB3W2ogLSAxNV0sIHRtcDIpOworICAgICAgICB0bXAzLmFkZCh0bXAxKTsKKyAgICAgICAgdG1wMy5hZGQod1tqIC0gMTZdKTsKKyAgICAgIH0KKworICAgICAgYS5hc3NpZ24oaDApOworICAgICAgYi5hc3NpZ24oaDEpOworICAgICAgYy5hc3NpZ24oaDIpOworICAgICAgZC5hc3NpZ24oaDMpOworICAgICAgZS5hc3NpZ24oaDQpOworICAgICAgZi5hc3NpZ24oaDUpOworICAgICAgZy5hc3NpZ24oaDYpOworICAgICAgaC5hc3NpZ24oaDcpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgODA7ICsraikgeworICAgICAgICB0MS5hc3NpZ24oaCk7CisgICAgICAgIHNpZ21hUHJpbWUodG1wMSwgZSwgdG1wMik7CisgICAgICAgIHQxLmFkZCh0bXAxKTsKKyAgICAgICAgY2godG1wMSwgZSwgZiwgZywgdG1wMik7CisgICAgICAgIHQxLmFkZCh0bXAxKTsKKyAgICAgICAgdDEuYWRkKGtbal0pOworICAgICAgICB0MS5hZGQod1tqXSk7CisgICAgICAgIHNpZ21hKHQyLCBhLCB0bXAyKTsKKyAgICAgICAgbWFqKHRtcDEsIGEsIGIsIGMsIHRtcDIpOworICAgICAgICB0Mi5hZGQodG1wMSk7CisgICAgICAgIHRtcDMgPSBoOworICAgICAgICBoID0gZzsKKyAgICAgICAgZyA9IGY7CisgICAgICAgIGYgPSBlOworICAgICAgICBkLmFkZCh0MSk7CisgICAgICAgIGUgPSBkOworICAgICAgICBkID0gYzsKKyAgICAgICAgYyA9IGI7CisgICAgICAgIGIgPSBhOworICAgICAgICB0bXAzLmFzc2lnbih0MSk7CisgICAgICAgIHRtcDMuYWRkKHQyKTsKKyAgICAgICAgYSA9IHRtcDM7CisgICAgICB9CisKKyAgICAgIGgwLmFkZChhKTsKKyAgICAgIGgxLmFkZChiKTsKKyAgICAgIGgyLmFkZChjKTsKKyAgICAgIGgzLmFkZChkKTsKKyAgICAgIGg0LmFkZChlKTsKKyAgICAgIGg1LmFkZChmKTsKKyAgICAgIGg2LmFkZChnKTsKKyAgICAgIGg3LmFkZChoKTsKKyAgICB9CisKKyAgICB2YXIgcmVzdWx0OworCisgICAgaWYgKCFtb2RlMzg0KSB7CisgICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg2NCk7CisgICAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKKyAgICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOworICAgICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOworICAgICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOworICAgICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOworICAgICAgaDUuY29weVRvKHJlc3VsdCwgNDApOworICAgICAgaDYuY29weVRvKHJlc3VsdCwgNDgpOworICAgICAgaDcuY29weVRvKHJlc3VsdCwgNTYpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg0OCk7CisgICAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKKyAgICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOworICAgICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOworICAgICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOworICAgICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOworICAgICAgaDUuY29weVRvKHJlc3VsdCwgNDApOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICByZXR1cm4gaGFzaDsKK30oKTsKKworZXhwb3J0cy5jYWxjdWxhdGVTSEE1MTIgPSBjYWxjdWxhdGVTSEE1MTI7CisKK3ZhciBjYWxjdWxhdGVTSEEzODQgPSBmdW5jdGlvbiBjYWxjdWxhdGVTSEEzODRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgcmV0dXJuIGNhbGN1bGF0ZVNIQTUxMihkYXRhLCBvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7CisgIH0KKworICByZXR1cm4gaGFzaDsKK30oKTsKKworZXhwb3J0cy5jYWxjdWxhdGVTSEEzODQgPSBjYWxjdWxhdGVTSEEzODQ7CisKK3ZhciBOdWxsQ2lwaGVyID0gZnVuY3Rpb24gTnVsbENpcGhlckNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIE51bGxDaXBoZXIoKSB7fQorCisgIE51bGxDaXBoZXIucHJvdG90eXBlID0geworICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gTnVsbENpcGhlcl9kZWNyeXB0QmxvY2soZGF0YSkgeworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfSwKKyAgICBlbmNyeXB0OiBmdW5jdGlvbiBOdWxsQ2lwaGVyX2VuY3J5cHQoZGF0YSkgeworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorICB9OworICByZXR1cm4gTnVsbENpcGhlcjsKK30oKTsKKworY2xhc3MgQUVTQmFzZUNpcGhlciB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBBRVNCYXNlQ2lwaGVyKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBBRVNCYXNlQ2lwaGVyLiIpOworICAgIH0KKworICAgIHRoaXMuX3MgPSBuZXcgVWludDhBcnJheShbMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwgMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwgMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwgMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwgMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwgMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywgMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwgMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwgMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwgMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwgMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNl0pOworICAgIHRoaXMuX2ludl9zID0gbmV3IFVpbnQ4QXJyYXkoWzB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgsIDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcsIDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IsIDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QsIDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUsIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUsIDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYsIDB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIsIDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQsIDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEsIDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYsIDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIsIDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIsIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEsIDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMsIDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUsIDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODksIDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIsIDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAsIDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQsIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYsIDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQsIDB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYsIDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2RdKTsKKyAgICB0aGlzLl9taXggPSBuZXcgVWludDMyQXJyYXkoWzB4MDAwMDAwMDAsIDB4MGUwOTBkMGIsIDB4MWMxMjFhMTYsIDB4MTIxYjE3MWQsIDB4MzgyNDM0MmMsIDB4MzYyZDM5MjcsIDB4MjQzNjJlM2EsIDB4MmEzZjIzMzEsIDB4NzA0ODY4NTgsIDB4N2U0MTY1NTMsIDB4NmM1YTcyNGUsIDB4NjI1MzdmNDUsIDB4NDg2YzVjNzQsIDB4NDY2NTUxN2YsIDB4NTQ3ZTQ2NjIsIDB4NWE3NzRiNjksIDB4ZTA5MGQwYjAsIDB4ZWU5OWRkYmIsIDB4ZmM4MmNhYTYsIDB4ZjI4YmM3YWQsIDB4ZDhiNGU0OWMsIDB4ZDZiZGU5OTcsIDB4YzRhNmZlOGEsIDB4Y2FhZmYzODEsIDB4OTBkOGI4ZTgsIDB4OWVkMWI1ZTMsIDB4OGNjYWEyZmUsIDB4ODJjM2FmZjUsIDB4YThmYzhjYzQsIDB4YTZmNTgxY2YsIDB4YjRlZTk2ZDIsIDB4YmFlNzliZDksIDB4ZGIzYmJiN2IsIDB4ZDUzMmI2NzAsIDB4YzcyOWExNmQsIDB4YzkyMGFjNjYsIDB4ZTMxZjhmNTcsIDB4ZWQxNjgyNWMsIDB4ZmYwZDk1NDEsIDB4ZjEwNDk4NGEsIDB4YWI3M2QzMjMsIDB4YTU3YWRlMjgsIDB4Yjc2MWM5MzUsIDB4Yjk2OGM0M2UsIDB4OTM1N2U3MGYsIDB4OWQ1ZWVhMDQsIDB4OGY0NWZkMTksIDB4ODE0Y2YwMTIsIDB4M2JhYjZiY2IsIDB4MzVhMjY2YzAsIDB4MjdiOTcxZGQsIDB4MjliMDdjZDYsIDB4MDM4ZjVmZTcsIDB4MGQ4NjUyZWMsIDB4MWY5ZDQ1ZjEsIDB4MTE5NDQ4ZmEsIDB4NGJlMzAzOTMsIDB4NDVlYTBlOTgsIDB4NTdmMTE5ODUsIDB4NTlmODE0OGUsIDB4NzNjNzM3YmYsIDB4N2RjZTNhYjQsIDB4NmZkNTJkYTksIDB4NjFkYzIwYTIsIDB4YWQ3NjZkZjYsIDB4YTM3ZjYwZmQsIDB4YjE2NDc3ZTAsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEsIDB4OWI1YjU0ZDEsIDB4ODk0MDQzY2MsIDB4ODc0OTRlYzcsIDB4ZGQzZTA1YWUsIDB4ZDMzNzA4YTUsIDB4YzEyYzFmYjgsIDB4Y2YyNTEyYjMsIDB4ZTUxYTMxODIsIDB4ZWIxMzNjODksIDB4ZjkwODJiOTQsIDB4ZjcwMTI2OWYsIDB4NGRlNmJkNDYsIDB4NDNlZmIwNGQsIDB4NTFmNGE3NTAsIDB4NWZmZGFhNWIsIDB4NzVjMjg5NmEsIDB4N2JjYjg0NjEsIDB4NjlkMDkzN2MsIDB4NjdkOTllNzcsIDB4M2RhZWQ1MWUsIDB4MzNhN2Q4MTUsIDB4MjFiY2NmMDgsIDB4MmZiNWMyMDMsIDB4MDU4YWUxMzIsIDB4MGI4M2VjMzksIDB4MTk5OGZiMjQsIDB4MTc5MWY2MmYsIDB4NzY0ZGQ2OGQsIDB4Nzg0NGRiODYsIDB4NmE1ZmNjOWIsIDB4NjQ1NmMxOTAsIDB4NGU2OWUyYTEsIDB4NDA2MGVmYWEsIDB4NTI3YmY4YjcsIDB4NWM3MmY1YmMsIDB4MDYwNWJlZDUsIDB4MDgwY2IzZGUsIDB4MWExN2E0YzMsIDB4MTQxZWE5YzgsIDB4M2UyMThhZjksIDB4MzAyODg3ZjIsIDB4MjIzMzkwZWYsIDB4MmMzYTlkZTQsIDB4OTZkZDA2M2QsIDB4OThkNDBiMzYsIDB4OGFjZjFjMmIsIDB4ODRjNjExMjAsIDB4YWVmOTMyMTEsIDB4YTBmMDNmMWEsIDB4YjJlYjI4MDcsIDB4YmNlMjI1MGMsIDB4ZTY5NTZlNjUsIDB4ZTg5YzYzNmUsIDB4ZmE4Nzc0NzMsIDB4ZjQ4ZTc5NzgsIDB4ZGViMTVhNDksIDB4ZDBiODU3NDIsIDB4YzJhMzQwNWYsIDB4Y2NhYTRkNTQsIDB4NDFlY2RhZjcsIDB4NGZlNWQ3ZmMsIDB4NWRmZWMwZTEsIDB4NTNmN2NkZWEsIDB4NzljOGVlZGIsIDB4NzdjMWUzZDAsIDB4NjVkYWY0Y2QsIDB4NmJkM2Y5YzYsIDB4MzFhNGIyYWYsIDB4M2ZhZGJmYTQsIDB4MmRiNmE4YjksIDB4MjNiZmE1YjIsIDB4MDk4MDg2ODMsIDB4MDc4OThiODgsIDB4MTU5MjljOTUsIDB4MWI5YjkxOWUsIDB4YTE3YzBhNDcsIDB4YWY3NTA3NGMsIDB4YmQ2ZTEwNTEsIDB4YjM2NzFkNWEsIDB4OTk1ODNlNmIsIDB4OTc1MTMzNjAsIDB4ODU0YTI0N2QsIDB4OGI0MzI5NzYsIDB4ZDEzNDYyMWYsIDB4ZGYzZDZmMTQsIDB4Y2QyNjc4MDksIDB4YzMyZjc1MDIsIDB4ZTkxMDU2MzMsIDB4ZTcxOTViMzgsIDB4ZjUwMjRjMjUsIDB4ZmIwYjQxMmUsIDB4OWFkNzYxOGMsIDB4OTRkZTZjODcsIDB4ODZjNTdiOWEsIDB4ODhjYzc2OTEsIDB4YTJmMzU1YTAsIDB4YWNmYTU4YWIsIDB4YmVlMTRmYjYsIDB4YjBlODQyYmQsIDB4ZWE5ZjA5ZDQsIDB4ZTQ5NjA0ZGYsIDB4ZjY4ZDEzYzIsIDB4Zjg4NDFlYzksIDB4ZDJiYjNkZjgsIDB4ZGNiMjMwZjMsIDB4Y2VhOTI3ZWUsIDB4YzBhMDJhZTUsIDB4N2E0N2IxM2MsIDB4NzQ0ZWJjMzcsIDB4NjY1NWFiMmEsIDB4Njg1Y2E2MjEsIDB4NDI2Mzg1MTAsIDB4NGM2YTg4MWIsIDB4NWU3MTlmMDYsIDB4NTA3ODkyMGQsIDB4MGEwZmQ5NjQsIDB4MDQwNmQ0NmYsIDB4MTYxZGMzNzIsIDB4MTgxNGNlNzksIDB4MzIyYmVkNDgsIDB4M2MyMmUwNDMsIDB4MmUzOWY3NWUsIDB4MjAzMGZhNTUsIDB4ZWM5YWI3MDEsIDB4ZTI5M2JhMGEsIDB4ZjA4OGFkMTcsIDB4ZmU4MWEwMWMsIDB4ZDRiZTgzMmQsIDB4ZGFiNzhlMjYsIDB4YzhhYzk5M2IsIDB4YzZhNTk0MzAsIDB4OWNkMmRmNTksIDB4OTJkYmQyNTIsIDB4ODBjMGM1NGYsIDB4OGVjOWM4NDQsIDB4YTRmNmViNzUsIDB4YWFmZmU2N2UsIDB4YjhlNGYxNjMsIDB4YjZlZGZjNjgsIDB4MGMwYTY3YjEsIDB4MDIwMzZhYmEsIDB4MTAxODdkYTcsIDB4MWUxMTcwYWMsIDB4MzQyZTUzOWQsIDB4M2EyNzVlOTYsIDB4MjgzYzQ5OGIsIDB4MjYzNTQ0ODAsIDB4N2M0MjBmZTksIDB4NzI0YjAyZTIsIDB4NjA1MDE1ZmYsIDB4NmU1OTE4ZjQsIDB4NDQ2NjNiYzUsIDB4NGE2ZjM2Y2UsIDB4NTg3NDIxZDMsIDB4NTY3ZDJjZDgsIDB4MzdhMTBjN2EsIDB4MzlhODAxNzEsIDB4MmJiMzE2NmMsIDB4MjViYTFiNjcsIDB4MGY4NTM4NTYsIDB4MDE4YzM1NWQsIDB4MTM5NzIyNDAsIDB4MWQ5ZTJmNGIsIDB4NDdlOTY0MjIsIDB4NDllMDY5MjksIDB4NWJmYjdlMzQsIDB4NTVmMjczM2YsIDB4N2ZjZDUwMGUsIDB4NzFjNDVkMDUsIDB4NjNkZjRhMTgsIDB4NmRkNjQ3MTMsIDB4ZDczMWRjY2EsIDB4ZDkzOGQxYzEsIDB4Y2IyM2M2ZGMsIDB4YzUyYWNiZDcsIDB4ZWYxNWU4ZTYsIDB4ZTExY2U1ZWQsIDB4ZjMwN2YyZjAsIDB4ZmQwZWZmZmIsIDB4YTc3OWI0OTIsIDB4YTk3MGI5OTksIDB4YmI2YmFlODQsIDB4YjU2MmEzOGYsIDB4OWY1ZDgwYmUsIDB4OTE1NDhkYjUsIDB4ODM0ZjlhYTgsIDB4OGQ0Njk3YTNdKTsKKyAgICB0aGlzLl9taXhDb2wgPSBuZXcgVWludDhBcnJheSgyNTYpOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgaWYgKGkgPCAxMjgpIHsKKyAgICAgICAgdGhpcy5fbWl4Q29sW2ldID0gaSA8PCAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fbWl4Q29sW2ldID0gaSA8PCAxIF4gMHgxYjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKKyAgICB0aGlzLmJ1ZmZlclBvc2l0aW9uID0gMDsKKyAgfQorCisgIF9leHBhbmRLZXkoY2lwaGVyS2V5KSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGNhbGwgYF9leHBhbmRLZXlgIG9uIHRoZSBiYXNlIGNsYXNzIik7CisgIH0KKworICBfZGVjcnlwdChpbnB1dCwga2V5KSB7CisgICAgbGV0IHQsIHUsIHY7CisgICAgY29uc3Qgc3RhdGUgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgc3RhdGUuc2V0KGlucHV0KTsKKworICAgIGZvciAobGV0IGogPSAwLCBrID0gdGhpcy5fa2V5U2l6ZTsgaiA8IDE2OyArK2osICsraykgeworICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gLSAxOyBpID49IDE7IC0taSkgeworICAgICAgdCA9IHN0YXRlWzEzXTsKKyAgICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldOworICAgICAgc3RhdGVbOV0gPSBzdGF0ZVs1XTsKKyAgICAgIHN0YXRlWzVdID0gc3RhdGVbMV07CisgICAgICBzdGF0ZVsxXSA9IHQ7CisgICAgICB0ID0gc3RhdGVbMTRdOworICAgICAgdSA9IHN0YXRlWzEwXTsKKyAgICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdOworICAgICAgc3RhdGVbMTBdID0gc3RhdGVbMl07CisgICAgICBzdGF0ZVs2XSA9IHQ7CisgICAgICBzdGF0ZVsyXSA9IHU7CisgICAgICB0ID0gc3RhdGVbMTVdOworICAgICAgdSA9IHN0YXRlWzExXTsKKyAgICAgIHYgPSBzdGF0ZVs3XTsKKyAgICAgIHN0YXRlWzE1XSA9IHN0YXRlWzNdOworICAgICAgc3RhdGVbMTFdID0gdDsKKyAgICAgIHN0YXRlWzddID0gdTsKKyAgICAgIHN0YXRlWzNdID0gdjsKKworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICAgIHN0YXRlW2pdID0gdGhpcy5faW52X3Nbc3RhdGVbal1dOworICAgICAgfQorCisgICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykgeworICAgICAgICBzdGF0ZVtqXSBePSBrZXlba107CisgICAgICB9CisKKyAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGogKz0gNCkgeworICAgICAgICBjb25zdCBzMCA9IHRoaXMuX21peFtzdGF0ZVtqXV07CisgICAgICAgIGNvbnN0IHMxID0gdGhpcy5fbWl4W3N0YXRlW2ogKyAxXV07CisgICAgICAgIGNvbnN0IHMyID0gdGhpcy5fbWl4W3N0YXRlW2ogKyAyXV07CisgICAgICAgIGNvbnN0IHMzID0gdGhpcy5fbWl4W3N0YXRlW2ogKyAzXV07CisgICAgICAgIHQgPSBzMCBeIHMxID4+PiA4IF4gczEgPDwgMjQgXiBzMiA+Pj4gMTYgXiBzMiA8PCAxNiBeIHMzID4+PiAyNCBeIHMzIDw8IDg7CisgICAgICAgIHN0YXRlW2pdID0gdCA+Pj4gMjQgJiAweGZmOworICAgICAgICBzdGF0ZVtqICsgMV0gPSB0ID4+IDE2ICYgMHhmZjsKKyAgICAgICAgc3RhdGVbaiArIDJdID0gdCA+PiA4ICYgMHhmZjsKKyAgICAgICAgc3RhdGVbaiArIDNdID0gdCAmIDB4ZmY7CisgICAgICB9CisgICAgfQorCisgICAgdCA9IHN0YXRlWzEzXTsKKyAgICBzdGF0ZVsxM10gPSBzdGF0ZVs5XTsKKyAgICBzdGF0ZVs5XSA9IHN0YXRlWzVdOworICAgIHN0YXRlWzVdID0gc3RhdGVbMV07CisgICAgc3RhdGVbMV0gPSB0OworICAgIHQgPSBzdGF0ZVsxNF07CisgICAgdSA9IHN0YXRlWzEwXTsKKyAgICBzdGF0ZVsxNF0gPSBzdGF0ZVs2XTsKKyAgICBzdGF0ZVsxMF0gPSBzdGF0ZVsyXTsKKyAgICBzdGF0ZVs2XSA9IHQ7CisgICAgc3RhdGVbMl0gPSB1OworICAgIHQgPSBzdGF0ZVsxNV07CisgICAgdSA9IHN0YXRlWzExXTsKKyAgICB2ID0gc3RhdGVbN107CisgICAgc3RhdGVbMTVdID0gc3RhdGVbM107CisgICAgc3RhdGVbMTFdID0gdDsKKyAgICBzdGF0ZVs3XSA9IHU7CisgICAgc3RhdGVbM10gPSB2OworCisgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICBzdGF0ZVtqXSA9IHRoaXMuX2ludl9zW3N0YXRlW2pdXTsKKyAgICAgIHN0YXRlW2pdIF49IGtleVtqXTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGU7CisgIH0KKworICBfZW5jcnlwdChpbnB1dCwga2V5KSB7CisgICAgY29uc3QgcyA9IHRoaXMuX3M7CisgICAgbGV0IHQsIHUsIHY7CisgICAgY29uc3Qgc3RhdGUgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgc3RhdGUuc2V0KGlucHV0KTsKKworICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgc3RhdGVbal0gXj0ga2V5W2pdOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uOyBpKyspIHsKKyAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICBzdGF0ZVtqXSA9IHNbc3RhdGVbal1dOworICAgICAgfQorCisgICAgICB2ID0gc3RhdGVbMV07CisgICAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdOworICAgICAgc3RhdGVbNV0gPSBzdGF0ZVs5XTsKKyAgICAgIHN0YXRlWzldID0gc3RhdGVbMTNdOworICAgICAgc3RhdGVbMTNdID0gdjsKKyAgICAgIHYgPSBzdGF0ZVsyXTsKKyAgICAgIHUgPSBzdGF0ZVs2XTsKKyAgICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdOworICAgICAgc3RhdGVbNl0gPSBzdGF0ZVsxNF07CisgICAgICBzdGF0ZVsxMF0gPSB2OworICAgICAgc3RhdGVbMTRdID0gdTsKKyAgICAgIHYgPSBzdGF0ZVszXTsKKyAgICAgIHUgPSBzdGF0ZVs3XTsKKyAgICAgIHQgPSBzdGF0ZVsxMV07CisgICAgICBzdGF0ZVszXSA9IHN0YXRlWzE1XTsKKyAgICAgIHN0YXRlWzddID0gdjsKKyAgICAgIHN0YXRlWzExXSA9IHU7CisgICAgICBzdGF0ZVsxNV0gPSB0OworCisgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKKyAgICAgICAgY29uc3QgczAgPSBzdGF0ZVtqICsgMF07CisgICAgICAgIGNvbnN0IHMxID0gc3RhdGVbaiArIDFdOworICAgICAgICBjb25zdCBzMiA9IHN0YXRlW2ogKyAyXTsKKyAgICAgICAgY29uc3QgczMgPSBzdGF0ZVtqICsgM107CisgICAgICAgIHQgPSBzMCBeIHMxIF4gczIgXiBzMzsKKyAgICAgICAgc3RhdGVbaiArIDBdIF49IHQgXiB0aGlzLl9taXhDb2xbczAgXiBzMV07CisgICAgICAgIHN0YXRlW2ogKyAxXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MxIF4gczJdOworICAgICAgICBzdGF0ZVtqICsgMl0gXj0gdCBeIHRoaXMuX21peENvbFtzMiBeIHMzXTsKKyAgICAgICAgc3RhdGVbaiArIDNdIF49IHQgXiB0aGlzLl9taXhDb2xbczMgXiBzMF07CisgICAgICB9CisKKyAgICAgIGZvciAobGV0IGogPSAwLCBrID0gaSAqIDE2OyBqIDwgMTY7ICsraiwgKytrKSB7CisgICAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgIHN0YXRlW2pdID0gc1tzdGF0ZVtqXV07CisgICAgfQorCisgICAgdiA9IHN0YXRlWzFdOworICAgIHN0YXRlWzFdID0gc3RhdGVbNV07CisgICAgc3RhdGVbNV0gPSBzdGF0ZVs5XTsKKyAgICBzdGF0ZVs5XSA9IHN0YXRlWzEzXTsKKyAgICBzdGF0ZVsxM10gPSB2OworICAgIHYgPSBzdGF0ZVsyXTsKKyAgICB1ID0gc3RhdGVbNl07CisgICAgc3RhdGVbMl0gPSBzdGF0ZVsxMF07CisgICAgc3RhdGVbNl0gPSBzdGF0ZVsxNF07CisgICAgc3RhdGVbMTBdID0gdjsKKyAgICBzdGF0ZVsxNF0gPSB1OworICAgIHYgPSBzdGF0ZVszXTsKKyAgICB1ID0gc3RhdGVbN107CisgICAgdCA9IHN0YXRlWzExXTsKKyAgICBzdGF0ZVszXSA9IHN0YXRlWzE1XTsKKyAgICBzdGF0ZVs3XSA9IHY7CisgICAgc3RhdGVbMTFdID0gdTsKKyAgICBzdGF0ZVsxNV0gPSB0OworCisgICAgZm9yIChsZXQgaiA9IDAsIGsgPSB0aGlzLl9rZXlTaXplOyBqIDwgMTY7ICsraiwgKytrKSB7CisgICAgICBzdGF0ZVtqXSBePSBrZXlba107CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRlOworICB9CisKKyAgX2RlY3J5cHRCbG9jazIoZGF0YSwgZmluYWxpemUpIHsKKyAgICBjb25zdCBzb3VyY2VMZW5ndGggPSBkYXRhLmxlbmd0aDsKKyAgICBsZXQgYnVmZmVyID0gdGhpcy5idWZmZXIsCisgICAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CisgICAgY29uc3QgcmVzdWx0ID0gW107CisgICAgbGV0IGl2ID0gdGhpcy5pdjsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyArK2kpIHsKKyAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKKyAgICAgICsrYnVmZmVyTGVuZ3RoOworCisgICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHBsYWluID0gdGhpcy5fZGVjcnlwdChidWZmZXIsIHRoaXMuX2tleSk7CisKKyAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICBwbGFpbltqXSBePSBpdltqXTsKKyAgICAgIH0KKworICAgICAgaXYgPSBidWZmZXI7CisgICAgICByZXN1bHQucHVzaChwbGFpbik7CisgICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgICBidWZmZXJMZW5ndGggPSAwOworICAgIH0KKworICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgIHRoaXMuaXYgPSBpdjsKKworICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CisgICAgfQorCisgICAgbGV0IG91dHB1dExlbmd0aCA9IDE2ICogcmVzdWx0Lmxlbmd0aDsKKworICAgIGlmIChmaW5hbGl6ZSkgeworICAgICAgY29uc3QgbGFzdEJsb2NrID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTsKKyAgICAgIGxldCBwc0xlbiA9IGxhc3RCbG9ja1sxNV07CisKKyAgICAgIGlmIChwc0xlbiA8PSAxNikgeworICAgICAgICBmb3IgKGxldCBpID0gMTUsIGlpID0gMTYgLSBwc0xlbjsgaSA+PSBpaTsgLS1pKSB7CisgICAgICAgICAgaWYgKGxhc3RCbG9ja1tpXSAhPT0gcHNMZW4pIHsKKyAgICAgICAgICAgIHBzTGVuID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dExlbmd0aCAtPSBwc0xlbjsKKyAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGxhc3RCbG9jay5zdWJhcnJheSgwLCAxNiAtIHBzTGVuKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBvdXRwdXQgPSBuZXcgVWludDhBcnJheShvdXRwdXRMZW5ndGgpOworCisgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7CisgICAgICBvdXRwdXQuc2V0KHJlc3VsdFtpXSwgaik7CisgICAgfQorCisgICAgcmV0dXJuIG91dHB1dDsKKyAgfQorCisgIGRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSwgaXYgPSBudWxsKSB7CisgICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7CisgICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CisKKyAgICBpZiAoaXYpIHsKKyAgICAgIHRoaXMuaXYgPSBpdjsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChsZXQgaSA9IDA7IGJ1ZmZlckxlbmd0aCA8IDE2ICYmIGkgPCBzb3VyY2VMZW5ndGg7ICsraSwgKytidWZmZXJMZW5ndGgpIHsKKyAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aF0gPSBkYXRhW2ldOworICAgICAgfQorCisgICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHsKKyAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5pdiA9IGJ1ZmZlcjsKKyAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KDE2KTsKKyAgICB9CisKKyAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7CisgICAgdGhpcy5kZWNyeXB0QmxvY2sgPSB0aGlzLl9kZWNyeXB0QmxvY2syOworICAgIHJldHVybiB0aGlzLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CisgIH0KKworICBlbmNyeXB0KGRhdGEsIGl2KSB7CisgICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgbGV0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAorICAgICAgICBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOworICAgIGNvbnN0IHJlc3VsdCA9IFtdOworCisgICAgaWYgKCFpdikgeworICAgICAgaXYgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgfQorCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7ICsraSkgeworICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aF0gPSBkYXRhW2ldOworICAgICAgKytidWZmZXJMZW5ndGg7CisKKyAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICAgIGJ1ZmZlcltqXSBePSBpdltqXTsKKyAgICAgIH0KKworICAgICAgY29uc3QgY2lwaGVyID0gdGhpcy5fZW5jcnlwdChidWZmZXIsIHRoaXMuX2tleSk7CisKKyAgICAgIGl2ID0gY2lwaGVyOworICAgICAgcmVzdWx0LnB1c2goY2lwaGVyKTsKKyAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKKyAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7CisgICAgfQorCisgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CisgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgdGhpcy5pdiA9IGl2OworCisgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHsKKyAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKKyAgICB9CisKKyAgICBjb25zdCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7CisgICAgY29uc3Qgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTsKKworICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7ICsraSwgaiArPSAxNikgeworICAgICAgb3V0cHV0LnNldChyZXN1bHRbaV0sIGopOworICAgIH0KKworICAgIHJldHVybiBvdXRwdXQ7CisgIH0KKworfQorCitjbGFzcyBBRVMxMjhDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHsKKyAgY29uc3RydWN0b3Ioa2V5KSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxMDsKKyAgICB0aGlzLl9rZXlTaXplID0gMTYwOworICAgIHRoaXMuX3Jjb24gPSBuZXcgVWludDhBcnJheShbMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSwgMHgzOSwgMHg3MiwgMHhlNCwgMHhkMywgMHhiZCwgMHg2MSwgMHhjMiwgMHg5ZiwgMHgyNSwgMHg0YSwgMHg5NCwgMHgzMywgMHg2NiwgMHhjYywgMHg4MywgMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHhjYiwgMHg4ZF0pOworICAgIHRoaXMuX2tleSA9IHRoaXMuX2V4cGFuZEtleShrZXkpOworICB9CisKKyAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKKyAgICBjb25zdCBiID0gMTc2OworICAgIGNvbnN0IHMgPSB0aGlzLl9zOworICAgIGNvbnN0IHJjb24gPSB0aGlzLl9yY29uOworICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGIpOworICAgIHJlc3VsdC5zZXQoY2lwaGVyS2V5KTsKKworICAgIGZvciAobGV0IGogPSAxNiwgaSA9IDE7IGogPCBiOyArK2kpIHsKKyAgICAgIGxldCB0MSA9IHJlc3VsdFtqIC0gM107CisgICAgICBsZXQgdDIgPSByZXN1bHRbaiAtIDJdOworICAgICAgbGV0IHQzID0gcmVzdWx0W2ogLSAxXTsKKyAgICAgIGxldCB0NCA9IHJlc3VsdFtqIC0gNF07CisgICAgICB0MSA9IHNbdDFdOworICAgICAgdDIgPSBzW3QyXTsKKyAgICAgIHQzID0gc1t0M107CisgICAgICB0NCA9IHNbdDRdOworICAgICAgdDEgPSB0MSBeIHJjb25baV07CisKKyAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgNDsgKytuKSB7CisgICAgICAgIHJlc3VsdFtqXSA9IHQxIF49IHJlc3VsdFtqIC0gMTZdOworICAgICAgICBqKys7CisgICAgICAgIHJlc3VsdFtqXSA9IHQyIF49IHJlc3VsdFtqIC0gMTZdOworICAgICAgICBqKys7CisgICAgICAgIHJlc3VsdFtqXSA9IHQzIF49IHJlc3VsdFtqIC0gMTZdOworICAgICAgICBqKys7CisgICAgICAgIHJlc3VsdFtqXSA9IHQ0IF49IHJlc3VsdFtqIC0gMTZdOworICAgICAgICBqKys7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCit9CisKK2V4cG9ydHMuQUVTMTI4Q2lwaGVyID0gQUVTMTI4Q2lwaGVyOworCitjbGFzcyBBRVMyNTZDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHsKKyAgY29uc3RydWN0b3Ioa2V5KSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxNDsKKyAgICB0aGlzLl9rZXlTaXplID0gMjI0OworICAgIHRoaXMuX2tleSA9IHRoaXMuX2V4cGFuZEtleShrZXkpOworICB9CisKKyAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKKyAgICBjb25zdCBiID0gMjQwOworICAgIGNvbnN0IHMgPSB0aGlzLl9zOworICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGIpOworICAgIHJlc3VsdC5zZXQoY2lwaGVyS2V5KTsKKyAgICBsZXQgciA9IDE7CisgICAgbGV0IHQxLCB0MiwgdDMsIHQ0OworCisgICAgZm9yIChsZXQgaiA9IDMyLCBpID0gMTsgaiA8IGI7ICsraSkgeworICAgICAgaWYgKGogJSAzMiA9PT0gMTYpIHsKKyAgICAgICAgdDEgPSBzW3QxXTsKKyAgICAgICAgdDIgPSBzW3QyXTsKKyAgICAgICAgdDMgPSBzW3QzXTsKKyAgICAgICAgdDQgPSBzW3Q0XTsKKyAgICAgIH0gZWxzZSBpZiAoaiAlIDMyID09PSAwKSB7CisgICAgICAgIHQxID0gcmVzdWx0W2ogLSAzXTsKKyAgICAgICAgdDIgPSByZXN1bHRbaiAtIDJdOworICAgICAgICB0MyA9IHJlc3VsdFtqIC0gMV07CisgICAgICAgIHQ0ID0gcmVzdWx0W2ogLSA0XTsKKyAgICAgICAgdDEgPSBzW3QxXTsKKyAgICAgICAgdDIgPSBzW3QyXTsKKyAgICAgICAgdDMgPSBzW3QzXTsKKyAgICAgICAgdDQgPSBzW3Q0XTsKKyAgICAgICAgdDEgPSB0MSBeIHI7CisKKyAgICAgICAgaWYgKChyIDw8PSAxKSA+PSAyNTYpIHsKKyAgICAgICAgICByID0gKHIgXiAweDFiKSAmIDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA0OyArK24pIHsKKyAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAzMl07CisgICAgICAgIGorKzsKKyAgICAgICAgcmVzdWx0W2pdID0gdDIgXj0gcmVzdWx0W2ogLSAzMl07CisgICAgICAgIGorKzsKKyAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAzMl07CisgICAgICAgIGorKzsKKyAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAzMl07CisgICAgICAgIGorKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK30KKworZXhwb3J0cy5BRVMyNTZDaXBoZXIgPSBBRVMyNTZDaXBoZXI7CisKK3ZhciBQREYxNyA9IGZ1bmN0aW9uIFBERjE3Q2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gY29tcGFyZUJ5dGVBcnJheXMoYXJyYXkxLCBhcnJheTIpIHsKKyAgICBpZiAoYXJyYXkxLmxlbmd0aCAhPT0gYXJyYXkyLmxlbmd0aCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkxLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZnVuY3Rpb24gUERGMTcoKSB7fQorCisgIFBERjE3LnByb3RvdHlwZSA9IHsKKyAgICBjaGVja093bmVyUGFzc3dvcmQ6IGZ1bmN0aW9uIFBERjE3X2NoZWNrT3duZXJQYXNzd29yZChwYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgdXNlckJ5dGVzLCBvd25lclBhc3N3b3JkKSB7CisgICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CisgICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOworICAgICAgaGFzaERhdGEuc2V0KG93bmVyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lclZhbGlkYXRpb25TYWx0Lmxlbmd0aCk7CisgICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlU0hBMjU2KGhhc2hEYXRhLCAwLCBoYXNoRGF0YS5sZW5ndGgpOworICAgICAgcmV0dXJuIGNvbXBhcmVCeXRlQXJyYXlzKHJlc3VsdCwgb3duZXJQYXNzd29yZCk7CisgICAgfSwKKyAgICBjaGVja1VzZXJQYXNzd29yZDogZnVuY3Rpb24gUERGMTdfY2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlclBhc3N3b3JkKSB7CisgICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTsKKyAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CisgICAgICBoYXNoRGF0YS5zZXQodXNlclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTsKKyAgICAgIHJldHVybiBjb21wYXJlQnl0ZUFycmF5cyhyZXN1bHQsIHVzZXJQYXNzd29yZCk7CisgICAgfSwKKyAgICBnZXRPd25lcktleTogZnVuY3Rpb24gUERGMTdfZ2V0T3duZXJLZXkocGFzc3dvcmQsIG93bmVyS2V5U2FsdCwgdXNlckJ5dGVzLCBvd25lckVuY3J5cHRpb24pIHsKKyAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDU2KTsKKyAgICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CisgICAgICBoYXNoRGF0YS5zZXQob3duZXJLZXlTYWx0LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJLZXlTYWx0Lmxlbmd0aCk7CisgICAgICB2YXIga2V5ID0gY2FsY3VsYXRlU0hBMjU2KGhhc2hEYXRhLCAwLCBoYXNoRGF0YS5sZW5ndGgpOworICAgICAgdmFyIGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKKyAgICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKG93bmVyRW5jcnlwdGlvbiwgZmFsc2UsIG5ldyBVaW50OEFycmF5KDE2KSk7CisgICAgfSwKKyAgICBnZXRVc2VyS2V5OiBmdW5jdGlvbiBQREYxN19nZXRVc2VyS2V5KHBhc3N3b3JkLCB1c2VyS2V5U2FsdCwgdXNlckVuY3J5cHRpb24pIHsKKyAgICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOworICAgICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKKyAgICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIHZhciBrZXkgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7CisgICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpOworICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sodXNlckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIFBERjE3OworfSgpOworCitleHBvcnRzLlBERjE3ID0gUERGMTc7CisKK3ZhciBQREYyMCA9IGZ1bmN0aW9uIFBERjIwQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gY29uY2F0QXJyYXlzKGFycmF5MSwgYXJyYXkyKSB7CisgICAgdmFyIHQgPSBuZXcgVWludDhBcnJheShhcnJheTEubGVuZ3RoICsgYXJyYXkyLmxlbmd0aCk7CisgICAgdC5zZXQoYXJyYXkxLCAwKTsKKyAgICB0LnNldChhcnJheTIsIGFycmF5MS5sZW5ndGgpOworICAgIHJldHVybiB0OworICB9CisKKyAgZnVuY3Rpb24gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBpbnB1dCwgdXNlckJ5dGVzKSB7CisgICAgdmFyIGsgPSBjYWxjdWxhdGVTSEEyNTYoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCkuc3ViYXJyYXkoMCwgMzIpOworICAgIHZhciBlID0gWzBdOworICAgIHZhciBpID0gMDsKKworICAgIHdoaWxlIChpIDwgNjQgfHwgZVtlLmxlbmd0aCAtIDFdID4gaSAtIDMyKSB7CisgICAgICB2YXIgYXJyYXlMZW5ndGggPSBwYXNzd29yZC5sZW5ndGggKyBrLmxlbmd0aCArIHVzZXJCeXRlcy5sZW5ndGg7CisgICAgICB2YXIgazEgPSBuZXcgVWludDhBcnJheShhcnJheUxlbmd0aCAqIDY0KTsKKyAgICAgIHZhciBhcnJheSA9IGNvbmNhdEFycmF5cyhwYXNzd29yZCwgayk7CisgICAgICBhcnJheSA9IGNvbmNhdEFycmF5cyhhcnJheSwgdXNlckJ5dGVzKTsKKworICAgICAgZm9yICh2YXIgaiA9IDAsIHBvcyA9IDA7IGogPCA2NDsgaisrLCBwb3MgKz0gYXJyYXlMZW5ndGgpIHsKKyAgICAgICAgazEuc2V0KGFycmF5LCBwb3MpOworICAgICAgfQorCisgICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzEyOENpcGhlcihrLnN1YmFycmF5KDAsIDE2KSk7CisgICAgICBlID0gY2lwaGVyLmVuY3J5cHQoazEsIGsuc3ViYXJyYXkoMTYsIDMyKSk7CisgICAgICB2YXIgcmVtYWluZGVyID0gMDsKKworICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCAxNjsgeisrKSB7CisgICAgICAgIHJlbWFpbmRlciAqPSAyNTYgJSAzOworICAgICAgICByZW1haW5kZXIgJT0gMzsKKyAgICAgICAgcmVtYWluZGVyICs9IChlW3pdID4+PiAwKSAlIDM7CisgICAgICAgIHJlbWFpbmRlciAlPSAzOworICAgICAgfQorCisgICAgICBpZiAocmVtYWluZGVyID09PSAwKSB7CisgICAgICAgIGsgPSBjYWxjdWxhdGVTSEEyNTYoZSwgMCwgZS5sZW5ndGgpOworICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDEpIHsKKyAgICAgICAgayA9IGNhbGN1bGF0ZVNIQTM4NChlLCAwLCBlLmxlbmd0aCk7CisgICAgICB9IGVsc2UgaWYgKHJlbWFpbmRlciA9PT0gMikgeworICAgICAgICBrID0gY2FsY3VsYXRlU0hBNTEyKGUsIDAsIGUubGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiBrLnN1YmFycmF5KDAsIDMyKTsKKyAgfQorCisgIGZ1bmN0aW9uIFBERjIwKCkge30KKworICBmdW5jdGlvbiBjb21wYXJlQnl0ZUFycmF5cyhhcnJheTEsIGFycmF5MikgeworICAgIGlmIChhcnJheTEubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChhcnJheTFbaV0gIT09IGFycmF5MltpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBQREYyMC5wcm90b3R5cGUgPSB7CisgICAgaGFzaDogZnVuY3Rpb24gUERGMjBfaGFzaChwYXNzd29yZCwgY29uY2F0Qnl0ZXMsIHVzZXJCeXRlcykgeworICAgICAgcmV0dXJuIGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgY29uY2F0Qnl0ZXMsIHVzZXJCeXRlcyk7CisgICAgfSwKKyAgICBjaGVja093bmVyUGFzc3dvcmQ6IGZ1bmN0aW9uIFBERjIwX2NoZWNrT3duZXJQYXNzd29yZChwYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgdXNlckJ5dGVzLCBvd25lclBhc3N3b3JkKSB7CisgICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CisgICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOworICAgICAgaGFzaERhdGEuc2V0KG93bmVyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CisgICAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lclZhbGlkYXRpb25TYWx0Lmxlbmd0aCk7CisgICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlUERGMjBIYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgdXNlckJ5dGVzKTsKKyAgICAgIHJldHVybiBjb21wYXJlQnl0ZUFycmF5cyhyZXN1bHQsIG93bmVyUGFzc3dvcmQpOworICAgIH0sCisgICAgY2hlY2tVc2VyUGFzc3dvcmQ6IGZ1bmN0aW9uIFBERjIwX2NoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJQYXNzd29yZCkgeworICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CisgICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOworICAgICAgaGFzaERhdGEuc2V0KHVzZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGVQREYyMEhhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCBbXSk7CisgICAgICByZXR1cm4gY29tcGFyZUJ5dGVBcnJheXMocmVzdWx0LCB1c2VyUGFzc3dvcmQpOworICAgIH0sCisgICAgZ2V0T3duZXJLZXk6IGZ1bmN0aW9uIFBERjIwX2dldE93bmVyS2V5KHBhc3N3b3JkLCBvd25lcktleVNhbHQsIHVzZXJCeXRlcywgb3duZXJFbmNyeXB0aW9uKSB7CisgICAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CisgICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOworICAgICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKKyAgICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpOworICAgICAgdmFyIGtleSA9IGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CisgICAgICB2YXIgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpOworICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKKyAgICB9LAorICAgIGdldFVzZXJLZXk6IGZ1bmN0aW9uIFBERjIwX2dldFVzZXJLZXkocGFzc3dvcmQsIHVzZXJLZXlTYWx0LCB1c2VyRW5jcnlwdGlvbikgeworICAgICAgdmFyIGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CisgICAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOworICAgICAgaGFzaERhdGEuc2V0KHVzZXJLZXlTYWx0LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgdmFyIGtleSA9IGNhbGN1bGF0ZVBERjIwSGFzaChwYXNzd29yZCwgaGFzaERhdGEsIFtdKTsKKyAgICAgIHZhciBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CisgICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayh1c2VyRW5jcnlwdGlvbiwgZmFsc2UsIG5ldyBVaW50OEFycmF5KDE2KSk7CisgICAgfQorICB9OworICByZXR1cm4gUERGMjA7Cit9KCk7CisKK2V4cG9ydHMuUERGMjAgPSBQREYyMDsKKwordmFyIENpcGhlclRyYW5zZm9ybSA9IGZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybShzdHJpbmdDaXBoZXJDb25zdHJ1Y3Rvciwgc3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IpIHsKKyAgICB0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yID0gc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3I7CisgICAgdGhpcy5TdHJlYW1DaXBoZXJDb25zdHJ1Y3RvciA9IHN0cmVhbUNpcGhlckNvbnN0cnVjdG9yOworICB9CisKKyAgQ2lwaGVyVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKKyAgICBjcmVhdGVTdHJlYW06IGZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybV9jcmVhdGVTdHJlYW0oc3RyZWFtLCBsZW5ndGgpIHsKKyAgICAgIHZhciBjaXBoZXIgPSBuZXcgdGhpcy5TdHJlYW1DaXBoZXJDb25zdHJ1Y3RvcigpOworICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLkRlY3J5cHRTdHJlYW0oc3RyZWFtLCBsZW5ndGgsIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybURlY3J5cHRTdHJlYW0oZGF0YSwgZmluYWxpemUpIHsKKyAgICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUpOworICAgICAgfSk7CisgICAgfSwKKyAgICBkZWNyeXB0U3RyaW5nOiBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1fZGVjcnlwdFN0cmluZyhzKSB7CisgICAgICB2YXIgY2lwaGVyID0gbmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IoKTsKKyAgICAgIHZhciBkYXRhID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHMpOworICAgICAgZGF0YSA9IGNpcGhlci5kZWNyeXB0QmxvY2soZGF0YSwgdHJ1ZSk7CisgICAgICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGRhdGEpOworICAgIH0sCisgICAgZW5jcnlwdFN0cmluZzogZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtX2VuY3J5cHRTdHJpbmcocykgeworICAgICAgY29uc3QgY2lwaGVyID0gbmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IoKTsKKworICAgICAgaWYgKGNpcGhlciBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyTGVuID0gcy5sZW5ndGg7CisgICAgICAgIGNvbnN0IHBhZCA9IDE2IC0gc3RyTGVuICUgMTY7CisKKyAgICAgICAgaWYgKHBhZCAhPT0gMTYpIHsKKyAgICAgICAgICBzID0gcy5wYWRFbmQoMTYgKiBNYXRoLmNlaWwoc3RyTGVuIC8gMTYpLCBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhZCkpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheSgxNik7CisKKyAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBpdltpXSA9IE1hdGguZmxvb3IoMjU2ICogTWF0aC5yYW5kb20oKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGV0IGRhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykocyk7CisgICAgICAgIGRhdGEgPSBjaXBoZXIuZW5jcnlwdChkYXRhLCBpdik7CisgICAgICAgIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KDE2ICsgZGF0YS5sZW5ndGgpOworICAgICAgICBidWYuc2V0KGl2KTsKKyAgICAgICAgYnVmLnNldChkYXRhLCAxNik7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoYnVmKTsKKyAgICAgIH0KKworICAgICAgbGV0IGRhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykocyk7CisgICAgICBkYXRhID0gY2lwaGVyLmVuY3J5cHQoZGF0YSk7CisgICAgICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGRhdGEpOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIENpcGhlclRyYW5zZm9ybTsKK30oKTsKKwordmFyIENpcGhlclRyYW5zZm9ybUZhY3RvcnkgPSBmdW5jdGlvbiBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5Q2xvc3VyZSgpIHsKKyAgdmFyIGRlZmF1bHRQYXNzd29yZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzB4MjgsIDB4QkYsIDB4NEUsIDB4NUUsIDB4NEUsIDB4NzUsIDB4OEEsIDB4NDEsIDB4NjQsIDB4MDAsIDB4NEUsIDB4NTYsIDB4RkYsIDB4RkEsIDB4MDEsIDB4MDgsIDB4MkUsIDB4MkUsIDB4MDAsIDB4QjYsIDB4RDAsIDB4NjgsIDB4M0UsIDB4ODAsIDB4MkYsIDB4MEMsIDB4QTksIDB4RkUsIDB4NjQsIDB4NTMsIDB4NjksIDB4N0FdKTsKKworICBmdW5jdGlvbiBjcmVhdGVFbmNyeXB0aW9uS2V5MjAocmV2aXNpb24sIHBhc3N3b3JkLCBvd25lclBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCBvd25lcktleVNhbHQsIHVCeXRlcywgdXNlclBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJLZXlTYWx0LCBvd25lckVuY3J5cHRpb24sIHVzZXJFbmNyeXB0aW9uLCBwZXJtcykgeworICAgIGlmIChwYXNzd29yZCkgeworICAgICAgdmFyIHBhc3N3b3JkTGVuZ3RoID0gTWF0aC5taW4oMTI3LCBwYXNzd29yZC5sZW5ndGgpOworICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZC5zdWJhcnJheSgwLCBwYXNzd29yZExlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhc3N3b3JkID0gW107CisgICAgfQorCisgICAgdmFyIHBkZkFsZ29yaXRobTsKKworICAgIGlmIChyZXZpc2lvbiA9PT0gNikgeworICAgICAgcGRmQWxnb3JpdGhtID0gbmV3IFBERjIwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBkZkFsZ29yaXRobSA9IG5ldyBQREYxNygpOworICAgIH0KKworICAgIGlmIChwZGZBbGdvcml0aG0uY2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlclBhc3N3b3JkKSkgeworICAgICAgcmV0dXJuIHBkZkFsZ29yaXRobS5nZXRVc2VyS2V5KHBhc3N3b3JkLCB1c2VyS2V5U2FsdCwgdXNlckVuY3J5cHRpb24pOworICAgIH0gZWxzZSBpZiAocGFzc3dvcmQubGVuZ3RoICYmIHBkZkFsZ29yaXRobS5jaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIHVCeXRlcywgb3duZXJQYXNzd29yZCkpIHsKKyAgICAgIHJldHVybiBwZGZBbGdvcml0aG0uZ2V0T3duZXJLZXkocGFzc3dvcmQsIG93bmVyS2V5U2FsdCwgdUJ5dGVzLCBvd25lckVuY3J5cHRpb24pOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgZnVuY3Rpb24gcHJlcGFyZUtleURhdGEoZmlsZUlkLCBwYXNzd29yZCwgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKSB7CisgICAgdmFyIGhhc2hEYXRhU2l6ZSA9IDQwICsgb3duZXJQYXNzd29yZC5sZW5ndGggKyBmaWxlSWQubGVuZ3RoOworICAgIHZhciBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KGhhc2hEYXRhU2l6ZSksCisgICAgICAgIGkgPSAwLAorICAgICAgICBqLAorICAgICAgICBuOworCisgICAgaWYgKHBhc3N3b3JkKSB7CisgICAgICBuID0gTWF0aC5taW4oMzIsIHBhc3N3b3JkLmxlbmd0aCk7CisKKyAgICAgIGZvciAoOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGhhc2hEYXRhW2ldID0gcGFzc3dvcmRbaV07CisgICAgICB9CisgICAgfQorCisgICAgaiA9IDA7CisKKyAgICB3aGlsZSAoaSA8IDMyKSB7CisgICAgICBoYXNoRGF0YVtpKytdID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwLCBuID0gb3duZXJQYXNzd29yZC5sZW5ndGg7IGogPCBuOyArK2opIHsKKyAgICAgIGhhc2hEYXRhW2krK10gPSBvd25lclBhc3N3b3JkW2pdOworICAgIH0KKworICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyAmIDB4ZmY7CisgICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+IDggJiAweGZmOworICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyA+PiAxNiAmIDB4ZmY7CisgICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+PiAyNCAmIDB4ZmY7CisKKyAgICBmb3IgKGogPSAwLCBuID0gZmlsZUlkLmxlbmd0aDsgaiA8IG47ICsraikgeworICAgICAgaGFzaERhdGFbaSsrXSA9IGZpbGVJZFtqXTsKKyAgICB9CisKKyAgICBpZiAocmV2aXNpb24gPj0gNCAmJiAhZW5jcnlwdE1ldGFkYXRhKSB7CisgICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjsKKyAgICAgIGhhc2hEYXRhW2krK10gPSAweGZmOworICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7CisgICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjsKKyAgICB9CisKKyAgICB2YXIgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CisgICAgdmFyIGtleUxlbmd0aEluQnl0ZXMgPSBrZXlMZW5ndGggPj4gMzsKKworICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgeworICAgICAgICBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2gsIDAsIGtleUxlbmd0aEluQnl0ZXMpOworICAgICAgfQorICAgIH0KKworICAgIHZhciBlbmNyeXB0aW9uS2V5ID0gaGFzaC5zdWJhcnJheSgwLCBrZXlMZW5ndGhJbkJ5dGVzKTsKKyAgICB2YXIgY2lwaGVyLCBjaGVja0RhdGE7CisKKyAgICBpZiAocmV2aXNpb24gPj0gMykgeworICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKKyAgICAgICAgaGFzaERhdGFbaV0gPSBkZWZhdWx0UGFzc3dvcmRCeXRlc1tpXTsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gMCwgbiA9IGZpbGVJZC5sZW5ndGg7IGogPCBuOyArK2opIHsKKyAgICAgICAgaGFzaERhdGFbaSsrXSA9IGZpbGVJZFtqXTsKKyAgICAgIH0KKworICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZW5jcnlwdGlvbktleSk7CisgICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSkpOworICAgICAgbiA9IGVuY3J5cHRpb25LZXkubGVuZ3RoOworICAgICAgdmFyIGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShuKSwKKyAgICAgICAgICBrOworCisgICAgICBmb3IgKGogPSAxOyBqIDw9IDE5OyArK2opIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG47ICsraykgeworICAgICAgICAgIGRlcml2ZWRLZXlba10gPSBlbmNyeXB0aW9uS2V5W2tdIF4gajsKKyAgICAgICAgfQorCisgICAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGRlcml2ZWRLZXkpOworICAgICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNoZWNrRGF0YSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IDAsIG4gPSBjaGVja0RhdGEubGVuZ3RoOyBqIDwgbjsgKytqKSB7CisgICAgICAgIGlmICh1c2VyUGFzc3dvcmRbal0gIT09IGNoZWNrRGF0YVtqXSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOworICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhkZWZhdWx0UGFzc3dvcmRCeXRlcyk7CisKKyAgICAgIGZvciAoaiA9IDAsIG4gPSBjaGVja0RhdGEubGVuZ3RoOyBqIDwgbjsgKytqKSB7CisgICAgICAgIGlmICh1c2VyUGFzc3dvcmRbal0gIT09IGNoZWNrRGF0YVtqXSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVuY3J5cHRpb25LZXk7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpIHsKKyAgICB2YXIgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheSgzMiksCisgICAgICAgIGkgPSAwLAorICAgICAgICBqLAorICAgICAgICBuOworICAgIG4gPSBNYXRoLm1pbigzMiwgcGFzc3dvcmQubGVuZ3RoKTsKKworICAgIGZvciAoOyBpIDwgbjsgKytpKSB7CisgICAgICBoYXNoRGF0YVtpXSA9IHBhc3N3b3JkW2ldOworICAgIH0KKworICAgIGogPSAwOworCisgICAgd2hpbGUgKGkgPCAzMikgeworICAgICAgaGFzaERhdGFbaSsrXSA9IGRlZmF1bHRQYXNzd29yZEJ5dGVzW2orK107CisgICAgfQorCisgICAgdmFyIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaERhdGEsIDAsIGkpOworICAgIHZhciBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CisKKyAgICBpZiAocmV2aXNpb24gPj0gMykgeworICAgICAgZm9yIChqID0gMDsgaiA8IDUwOyArK2opIHsKKyAgICAgICAgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoLCAwLCBoYXNoLmxlbmd0aCk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGNpcGhlciwgdXNlclBhc3N3b3JkOworCisgICAgaWYgKHJldmlzaW9uID49IDMpIHsKKyAgICAgIHVzZXJQYXNzd29yZCA9IG93bmVyUGFzc3dvcmQ7CisgICAgICB2YXIgZGVyaXZlZEtleSA9IG5ldyBVaW50OEFycmF5KGtleUxlbmd0aEluQnl0ZXMpLAorICAgICAgICAgIGs7CisKKyAgICAgIGZvciAoaiA9IDE5OyBqID49IDA7IGotLSkgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwga2V5TGVuZ3RoSW5CeXRlczsgKytrKSB7CisgICAgICAgICAgZGVyaXZlZEtleVtrXSA9IGhhc2hba10gXiBqOworICAgICAgICB9CisKKyAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7CisgICAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sodXNlclBhc3N3b3JkKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoaGFzaC5zdWJhcnJheSgwLCBrZXlMZW5ndGhJbkJ5dGVzKSk7CisgICAgICB1c2VyUGFzc3dvcmQgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKG93bmVyUGFzc3dvcmQpOworICAgIH0KKworICAgIHJldHVybiB1c2VyUGFzc3dvcmQ7CisgIH0KKworICB2YXIgaWRlbnRpdHlOYW1lID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIklkZW50aXR5Iik7CisKKyAgZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShkaWN0LCBmaWxlSWQsIHBhc3N3b3JkKSB7CisgICAgdmFyIGZpbHRlciA9IGRpY3QuZ2V0KCJGaWx0ZXIiKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmlsdGVyLCAiU3RhbmRhcmQiKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJ1bmtub3duIGVuY3J5cHRpb24gbWV0aG9kIik7CisgICAgfQorCisgICAgdGhpcy5kaWN0ID0gZGljdDsKKyAgICB2YXIgYWxnb3JpdGhtID0gZGljdC5nZXQoIlYiKTsKKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhbGdvcml0aG0pIHx8IGFsZ29yaXRobSAhPT0gMSAmJiBhbGdvcml0aG0gIT09IDIgJiYgYWxnb3JpdGhtICE9PSA0ICYmIGFsZ29yaXRobSAhPT0gNSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSIpOworICAgIH0KKworICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOworICAgIHZhciBrZXlMZW5ndGggPSBkaWN0LmdldCgiTGVuZ3RoIik7CisKKyAgICBpZiAoIWtleUxlbmd0aCkgeworICAgICAgaWYgKGFsZ29yaXRobSA8PSAzKSB7CisgICAgICAgIGtleUxlbmd0aCA9IDQwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGNmRGljdCA9IGRpY3QuZ2V0KCJDRiIpOworICAgICAgICB2YXIgc3RyZWFtQ3J5cHRvTmFtZSA9IGRpY3QuZ2V0KCJTdG1GIik7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGNmRGljdCkgJiYgKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoc3RyZWFtQ3J5cHRvTmFtZSkpIHsKKyAgICAgICAgICBjZkRpY3Quc3VwcHJlc3NFbmNyeXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICB2YXIgaGFuZGxlckRpY3QgPSBjZkRpY3QuZ2V0KHN0cmVhbUNyeXB0b05hbWUubmFtZSk7CisgICAgICAgICAga2V5TGVuZ3RoID0gaGFuZGxlckRpY3QgJiYgaGFuZGxlckRpY3QuZ2V0KCJMZW5ndGgiKSB8fCAxMjg7CisKKyAgICAgICAgICBpZiAoa2V5TGVuZ3RoIDwgNDApIHsKKyAgICAgICAgICAgIGtleUxlbmd0aCA8PD0gMzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoa2V5TGVuZ3RoKSB8fCBrZXlMZW5ndGggPCA0MCB8fCBrZXlMZW5ndGggJSA4ICE9PSAwKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoImludmFsaWQga2V5IGxlbmd0aCIpOworICAgIH0KKworICAgIHZhciBvd25lclBhc3N3b3JkID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJPIikpLnN1YmFycmF5KDAsIDMyKTsKKyAgICB2YXIgdXNlclBhc3N3b3JkID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJVIikpLnN1YmFycmF5KDAsIDMyKTsKKyAgICB2YXIgZmxhZ3MgPSBkaWN0LmdldCgiUCIpOworICAgIHZhciByZXZpc2lvbiA9IGRpY3QuZ2V0KCJSIik7CisgICAgdmFyIGVuY3J5cHRNZXRhZGF0YSA9IChhbGdvcml0aG0gPT09IDQgfHwgYWxnb3JpdGhtID09PSA1KSAmJiBkaWN0LmdldCgiRW5jcnlwdE1ldGFkYXRhIikgIT09IGZhbHNlOworICAgIHRoaXMuZW5jcnlwdE1ldGFkYXRhID0gZW5jcnlwdE1ldGFkYXRhOworICAgIHZhciBmaWxlSWRCeXRlcyA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShmaWxlSWQpOworICAgIHZhciBwYXNzd29yZEJ5dGVzOworCisgICAgaWYgKHBhc3N3b3JkKSB7CisgICAgICBpZiAocmV2aXNpb24gPT09IDYpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwYXNzd29yZCA9ICgwLCBfdXRpbC51dGY4U3RyaW5nVG9TdHJpbmcpKHBhc3N3b3JkKTsKKyAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk6ICIgKyAiVW5hYmxlIHRvIGNvbnZlcnQgVVRGOCBlbmNvZGVkIHBhc3N3b3JkLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBhc3N3b3JkQnl0ZXMgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykocGFzc3dvcmQpOworICAgIH0KKworICAgIHZhciBlbmNyeXB0aW9uS2V5OworCisgICAgaWYgKGFsZ29yaXRobSAhPT0gNSkgeworICAgICAgZW5jcnlwdGlvbktleSA9IHByZXBhcmVLZXlEYXRhKGZpbGVJZEJ5dGVzLCBwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCB1c2VyUGFzc3dvcmQsIGZsYWdzLCByZXZpc2lvbiwga2V5TGVuZ3RoLCBlbmNyeXB0TWV0YWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgb3duZXJWYWxpZGF0aW9uU2FsdCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiTyIpKS5zdWJhcnJheSgzMiwgNDApOworICAgICAgdmFyIG93bmVyS2V5U2FsdCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiTyIpKS5zdWJhcnJheSg0MCwgNDgpOworICAgICAgdmFyIHVCeXRlcyA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiVSIpKS5zdWJhcnJheSgwLCA0OCk7CisgICAgICB2YXIgdXNlclZhbGlkYXRpb25TYWx0ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJVIikpLnN1YmFycmF5KDMyLCA0MCk7CisgICAgICB2YXIgdXNlcktleVNhbHQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIlUiKSkuc3ViYXJyYXkoNDAsIDQ4KTsKKyAgICAgIHZhciBvd25lckVuY3J5cHRpb24gPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIk9FIikpOworICAgICAgdmFyIHVzZXJFbmNyeXB0aW9uID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJVRSIpKTsKKyAgICAgIHZhciBwZXJtcyA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiUGVybXMiKSk7CisgICAgICBlbmNyeXB0aW9uS2V5ID0gY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCBvd25lcktleVNhbHQsIHVCeXRlcywgdXNlclBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJLZXlTYWx0LCBvd25lckVuY3J5cHRpb24sIHVzZXJFbmNyeXB0aW9uLCBwZXJtcyk7CisgICAgfQorCisgICAgaWYgKCFlbmNyeXB0aW9uS2V5ICYmICFwYXNzd29yZCkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKCJObyBwYXNzd29yZCBnaXZlbiIsIF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkQpOworICAgIH0gZWxzZSBpZiAoIWVuY3J5cHRpb25LZXkgJiYgcGFzc3dvcmQpIHsKKyAgICAgIHZhciBkZWNvZGVkUGFzc3dvcmQgPSBkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgcmV2aXNpb24sIGtleUxlbmd0aCk7CisgICAgICBlbmNyeXB0aW9uS2V5ID0gcHJlcGFyZUtleURhdGEoZmlsZUlkQnl0ZXMsIGRlY29kZWRQYXNzd29yZCwgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKTsKKyAgICB9CisKKyAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbigiSW5jb3JyZWN0IFBhc3N3b3JkIiwgX3V0aWwuUGFzc3dvcmRSZXNwb25zZXMuSU5DT1JSRUNUX1BBU1NXT1JEKTsKKyAgICB9CisKKyAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5OworCisgICAgaWYgKGFsZ29yaXRobSA+PSA0KSB7CisgICAgICB2YXIgY2YgPSBkaWN0LmdldCgiQ0YiKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGNmKSkgeworICAgICAgICBjZi5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOworICAgICAgfQorCisgICAgICB0aGlzLmNmID0gY2Y7CisgICAgICB0aGlzLnN0bWYgPSBkaWN0LmdldCgiU3RtRiIpIHx8IGlkZW50aXR5TmFtZTsKKyAgICAgIHRoaXMuc3RyZiA9IGRpY3QuZ2V0KCJTdHJGIikgfHwgaWRlbnRpdHlOYW1lOworICAgICAgdGhpcy5lZmYgPSBkaWN0LmdldCgiRUZGIikgfHwgdGhpcy5zdG1mOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBlbmNyeXB0aW9uS2V5LCBpc0FlcykgeworICAgIHZhciBrZXkgPSBuZXcgVWludDhBcnJheShlbmNyeXB0aW9uS2V5Lmxlbmd0aCArIDkpLAorICAgICAgICBpLAorICAgICAgICBuOworCisgICAgZm9yIChpID0gMCwgbiA9IGVuY3J5cHRpb25LZXkubGVuZ3RoOyBpIDwgbjsgKytpKSB7CisgICAgICBrZXlbaV0gPSBlbmNyeXB0aW9uS2V5W2ldOworICAgIH0KKworICAgIGtleVtpKytdID0gbnVtICYgMHhmZjsKKyAgICBrZXlbaSsrXSA9IG51bSA+PiA4ICYgMHhmZjsKKyAgICBrZXlbaSsrXSA9IG51bSA+PiAxNiAmIDB4ZmY7CisgICAga2V5W2krK10gPSBnZW4gJiAweGZmOworICAgIGtleVtpKytdID0gZ2VuID4+IDggJiAweGZmOworCisgICAgaWYgKGlzQWVzKSB7CisgICAgICBrZXlbaSsrXSA9IDB4NzM7CisgICAgICBrZXlbaSsrXSA9IDB4NDE7CisgICAgICBrZXlbaSsrXSA9IDB4NmM7CisgICAgICBrZXlbaSsrXSA9IDB4NTQ7CisgICAgfQorCisgICAgdmFyIGhhc2ggPSBjYWxjdWxhdGVNRDUoa2V5LCAwLCBpKTsKKyAgICByZXR1cm4gaGFzaC5zdWJhcnJheSgwLCBNYXRoLm1pbihlbmNyeXB0aW9uS2V5Lmxlbmd0aCArIDUsIDE2KSk7CisgIH0KKworICBmdW5jdGlvbiBidWlsZENpcGhlckNvbnN0cnVjdG9yKGNmLCBuYW1lLCBudW0sIGdlbiwga2V5KSB7CisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShuYW1lKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIGNyeXB0IGZpbHRlciBuYW1lLiIpOworICAgIH0KKworICAgIHZhciBjcnlwdEZpbHRlciA9IGNmLmdldChuYW1lLm5hbWUpOworICAgIHZhciBjZm07CisKKyAgICBpZiAoY3J5cHRGaWx0ZXIgIT09IG51bGwgJiYgY3J5cHRGaWx0ZXIgIT09IHVuZGVmaW5lZCkgeworICAgICAgY2ZtID0gY3J5cHRGaWx0ZXIuZ2V0KCJDRk0iKTsKKyAgICB9CisKKyAgICBpZiAoIWNmbSB8fCBjZm0ubmFtZSA9PT0gIk5vbmUiKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JOb25lKCkgeworICAgICAgICByZXR1cm4gbmV3IE51bGxDaXBoZXIoKTsKKyAgICAgIH07CisgICAgfQorCisgICAgaWYgKGNmbS5uYW1lID09PSAiVjIiKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JWMigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIGZhbHNlKSk7CisgICAgICB9OworICAgIH0KKworICAgIGlmIChjZm0ubmFtZSA9PT0gIkFFU1YyIikgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yQUVTVjIoKSB7CisgICAgICAgIHJldHVybiBuZXcgQUVTMTI4Q2lwaGVyKGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIHRydWUpKTsKKyAgICAgIH07CisgICAgfQorCisgICAgaWYgKGNmbS5uYW1lID09PSAiQUVTVjMiKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JBRVNWMygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKKyAgICAgIH07CisgICAgfQorCisgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIGNyeXB0byBtZXRob2QiKTsKKyAgfQorCisgIENpcGhlclRyYW5zZm9ybUZhY3RvcnkucHJvdG90eXBlID0geworICAgIGNyZWF0ZUNpcGhlclRyYW5zZm9ybTogZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeV9jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pIHsKKyAgICAgIGlmICh0aGlzLmFsZ29yaXRobSA9PT0gNCB8fCB0aGlzLmFsZ29yaXRobSA9PT0gNSkgeworICAgICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsIHRoaXMuc3RtZiwgbnVtLCBnZW4sIHRoaXMuZW5jcnlwdGlvbktleSksIGJ1aWxkQ2lwaGVyQ29uc3RydWN0b3IodGhpcy5jZiwgdGhpcy5zdHJmLCBudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5KSk7CisgICAgICB9CisKKyAgICAgIHZhciBrZXkgPSBidWlsZE9iamVjdEtleShudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5LCBmYWxzZSk7CisKKyAgICAgIHZhciBjaXBoZXJDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIGJ1aWxkQ2lwaGVyQ2lwaGVyQ29uc3RydWN0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgQVJDRm91ckNpcGhlcihrZXkpOworICAgICAgfTsKKworICAgICAgcmV0dXJuIG5ldyBDaXBoZXJUcmFuc2Zvcm0oY2lwaGVyQ29uc3RydWN0b3IsIGNpcGhlckNvbnN0cnVjdG9yKTsKKyAgICB9CisgIH07CisgIHJldHVybiBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5OworfSgpOworCitleHBvcnRzLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkgPSBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL2RvY3VtZW50LmpzIGIvbGliL2NvcmUvZG9jdW1lbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmMzZmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL2RvY3VtZW50LmpzCkBAIC0wLDAgKzEsODE3IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZEb2N1bWVudCA9IGV4cG9ydHMuUGFnZSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9vYmogPSByZXF1aXJlKCIuL29iai5qcyIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuL3ByaW1pdGl2ZXMuanMiKTsKKwordmFyIF9jb3JlX3V0aWxzID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi9zdHJlYW0uanMiKTsKKwordmFyIF9hbm5vdGF0aW9uID0gcmVxdWlyZSgiLi9hbm5vdGF0aW9uLmpzIik7CisKK3ZhciBfY3J5cHRvID0gcmVxdWlyZSgiLi9jcnlwdG8uanMiKTsKKwordmFyIF9wYXJzZXIgPSByZXF1aXJlKCIuL3BhcnNlci5qcyIpOworCit2YXIgX29wZXJhdG9yX2xpc3QgPSByZXF1aXJlKCIuL29wZXJhdG9yX2xpc3QuanMiKTsKKwordmFyIF9ldmFsdWF0b3IgPSByZXF1aXJlKCIuL2V2YWx1YXRvci5qcyIpOworCitjb25zdCBERUZBVUxUX1VTRVJfVU5JVCA9IDEuMDsKK2NvbnN0IExFVFRFUl9TSVpFX01FRElBQk9YID0gWzAsIDAsIDYxMiwgNzkyXTsKKworZnVuY3Rpb24gaXNBbm5vdGF0aW9uUmVuZGVyYWJsZShhbm5vdGF0aW9uLCBpbnRlbnQpIHsKKyAgcmV0dXJuIGludGVudCA9PT0gImRpc3BsYXkiICYmIGFubm90YXRpb24udmlld2FibGUgfHwgaW50ZW50ID09PSAicHJpbnQiICYmIGFubm90YXRpb24ucHJpbnRhYmxlOworfQorCitjbGFzcyBQYWdlIHsKKyAgY29uc3RydWN0b3IoeworICAgIHBkZk1hbmFnZXIsCisgICAgeHJlZiwKKyAgICBwYWdlSW5kZXgsCisgICAgcGFnZURpY3QsCisgICAgcmVmLAorICAgIGdsb2JhbElkRmFjdG9yeSwKKyAgICBmb250Q2FjaGUsCisgICAgYnVpbHRJbkNNYXBDYWNoZSwKKyAgICBnbG9iYWxJbWFnZUNhY2hlCisgIH0pIHsKKyAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOworICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OworICAgIHRoaXMucGFnZURpY3QgPSBwYWdlRGljdDsKKyAgICB0aGlzLnhyZWYgPSB4cmVmOworICAgIHRoaXMucmVmID0gcmVmOworICAgIHRoaXMuZm9udENhY2hlID0gZm9udENhY2hlOworICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CisgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gZ2xvYmFsSW1hZ2VDYWNoZTsKKyAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBwZGZNYW5hZ2VyLmV2YWx1YXRvck9wdGlvbnM7CisgICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gbnVsbDsKKyAgICBjb25zdCBpZENvdW50ZXJzID0geworICAgICAgb2JqOiAwCisgICAgfTsKKyAgICB0aGlzLl9sb2NhbElkRmFjdG9yeSA9IGNsYXNzIGV4dGVuZHMgZ2xvYmFsSWRGYWN0b3J5IHsKKyAgICAgIHN0YXRpYyBjcmVhdGVPYmpJZCgpIHsKKyAgICAgICAgcmV0dXJuIGBwJHtwYWdlSW5kZXh9XyR7KytpZENvdW50ZXJzLm9ian1gOworICAgICAgfQorCisgICAgfTsKKyAgfQorCisgIF9nZXRJbmhlcml0YWJsZVByb3BlcnR5KGtleSwgZ2V0QXJyYXkgPSBmYWxzZSkgeworICAgIGNvbnN0IHZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgIGRpY3Q6IHRoaXMucGFnZURpY3QsCisgICAgICBrZXksCisgICAgICBnZXRBcnJheSwKKyAgICAgIHN0b3BXaGVuRm91bmQ6IGZhbHNlCisgICAgfSk7CisKKyAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSB8fCAhKDAsIF9wcmltaXRpdmVzLmlzRGljdCkodmFsdWVbMF0pKSB7CisgICAgICByZXR1cm4gdmFsdWVbMF07CisgICAgfQorCisgICAgcmV0dXJuIF9wcmltaXRpdmVzLkRpY3QubWVyZ2UoeworICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgZGljdEFycmF5OiB2YWx1ZQorICAgIH0pOworICB9CisKKyAgZ2V0IGNvbnRlbnQoKSB7CisgICAgcmV0dXJuIHRoaXMucGFnZURpY3QuZ2V0KCJDb250ZW50cyIpOworICB9CisKKyAgZ2V0IHJlc291cmNlcygpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInJlc291cmNlcyIsIHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJlc291cmNlcyIpIHx8IF9wcmltaXRpdmVzLkRpY3QuZW1wdHkpOworICB9CisKKyAgX2dldEJvdW5kaW5nQm94KG5hbWUpIHsKKyAgICBjb25zdCBib3ggPSB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KG5hbWUsIHRydWUpOworCisgICAgaWYgKEFycmF5LmlzQXJyYXkoYm94KSAmJiBib3gubGVuZ3RoID09PSA0KSB7CisgICAgICBpZiAoYm94WzJdIC0gYm94WzBdICE9PSAwICYmIGJveFszXSAtIGJveFsxXSAhPT0gMCkgeworICAgICAgICByZXR1cm4gYm94OworICAgICAgfQorCisgICAgICAoMCwgX3V0aWwud2FybikoYEVtcHR5IC8ke25hbWV9IGVudHJ5LmApOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgZ2V0IG1lZGlhQm94KCkgeworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAibWVkaWFCb3giLCB0aGlzLl9nZXRCb3VuZGluZ0JveCgiTWVkaWFCb3giKSB8fCBMRVRURVJfU0laRV9NRURJQUJPWCk7CisgIH0KKworICBnZXQgY3JvcEJveCgpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImNyb3BCb3giLCB0aGlzLl9nZXRCb3VuZGluZ0JveCgiQ3JvcEJveCIpIHx8IHRoaXMubWVkaWFCb3gpOworICB9CisKKyAgZ2V0IHVzZXJVbml0KCkgeworICAgIGxldCBvYmogPSB0aGlzLnBhZ2VEaWN0LmdldCgiVXNlclVuaXQiKTsKKworICAgIGlmICghKDAsIF91dGlsLmlzTnVtKShvYmopIHx8IG9iaiA8PSAwKSB7CisgICAgICBvYmogPSBERUZBVUxUX1VTRVJfVU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInVzZXJVbml0Iiwgb2JqKTsKKyAgfQorCisgIGdldCB2aWV3KCkgeworICAgIGNvbnN0IHsKKyAgICAgIGNyb3BCb3gsCisgICAgICBtZWRpYUJveAorICAgIH0gPSB0aGlzOworICAgIGxldCB2aWV3OworCisgICAgaWYgKGNyb3BCb3ggPT09IG1lZGlhQm94IHx8ICgwLCBfdXRpbC5pc0FycmF5RXF1YWwpKGNyb3BCb3gsIG1lZGlhQm94KSkgeworICAgICAgdmlldyA9IG1lZGlhQm94OworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBib3ggPSBfdXRpbC5VdGlsLmludGVyc2VjdChjcm9wQm94LCBtZWRpYUJveCk7CisKKyAgICAgIGlmIChib3ggJiYgYm94WzJdIC0gYm94WzBdICE9PSAwICYmIGJveFszXSAtIGJveFsxXSAhPT0gMCkgeworICAgICAgICB2aWV3ID0gYm94OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJFbXB0eSAvQ3JvcEJveCBhbmQgL01lZGlhQm94IGludGVyc2VjdGlvbi4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInZpZXciLCB2aWV3IHx8IG1lZGlhQm94KTsKKyAgfQorCisgIGdldCByb3RhdGUoKSB7CisgICAgbGV0IHJvdGF0ZSA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJvdGF0ZSIpIHx8IDA7CisKKyAgICBpZiAocm90YXRlICUgOTAgIT09IDApIHsKKyAgICAgIHJvdGF0ZSA9IDA7CisgICAgfSBlbHNlIGlmIChyb3RhdGUgPj0gMzYwKSB7CisgICAgICByb3RhdGUgPSByb3RhdGUgJSAzNjA7CisgICAgfSBlbHNlIGlmIChyb3RhdGUgPCAwKSB7CisgICAgICByb3RhdGUgPSAocm90YXRlICUgMzYwICsgMzYwKSAlIDM2MDsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInJvdGF0ZSIsIHJvdGF0ZSk7CisgIH0KKworICBnZXRDb250ZW50U3RyZWFtKCkgeworICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7CisgICAgbGV0IHN0cmVhbTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7CisgICAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOworICAgICAgY29uc3Qgc3RyZWFtcyA9IFtdOworCisgICAgICBmb3IgKGNvbnN0IHN1YlN0cmVhbSBvZiBjb250ZW50KSB7CisgICAgICAgIHN0cmVhbXMucHVzaCh4cmVmLmZldGNoSWZSZWYoc3ViU3RyZWFtKSk7CisgICAgICB9CisKKyAgICAgIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmVhbXNTZXF1ZW5jZVN0cmVhbShzdHJlYW1zKTsKKyAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoY29udGVudCkpIHsKKyAgICAgIHN0cmVhbSA9IGNvbnRlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmVhbSA9IG5ldyBfc3RyZWFtLk51bGxTdHJlYW0oKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgc2F2ZShoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgX2V2YWx1YXRvci5QYXJ0aWFsRXZhbHVhdG9yKHsKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIGhhbmRsZXIsCisgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAorICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKKyAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCisgICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCisgICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCisgICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKKyAgICB9KTsKKyAgICByZXR1cm4gdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHsKKyAgICAgIGNvbnN0IG5ld1JlZnNQcm9taXNlcyA9IFtdOworCisgICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgaWYgKCFpc0Fubm90YXRpb25SZW5kZXJhYmxlKGFubm90YXRpb24sICJwcmludCIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBuZXdSZWZzUHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLnNhdmUocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoInNhdmUgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5ld1JlZnNQcm9taXNlcyk7CisgICAgfSk7CisgIH0KKworICBsb2FkUmVzb3VyY2VzKGtleXMpIHsKKyAgICBpZiAoIXRoaXMucmVzb3VyY2VzUHJvbWlzZSkgeworICAgICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAicmVzb3VyY2VzIik7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzUHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBfb2JqLk9iamVjdExvYWRlcih0aGlzLnJlc291cmNlcywga2V5cywgdGhpcy54cmVmKTsKKyAgICAgIHJldHVybiBvYmplY3RMb2FkZXIubG9hZCgpOworICAgIH0pOworICB9CisKKyAgZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICBoYW5kbGVyLAorICAgIHNpbmssCisgICAgdGFzaywKKyAgICBpbnRlbnQsCisgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICBhbm5vdGF0aW9uU3RvcmFnZQorICB9KSB7CisgICAgY29uc3QgY29udGVudFN0cmVhbVByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJnZXRDb250ZW50U3RyZWFtIik7CisgICAgY29uc3QgcmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJDb2xvclNwYWNlIiwgIlBhdHRlcm4iLCAiU2hhZGluZyIsICJYT2JqZWN0IiwgIkZvbnQiXSk7CisgICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBfZXZhbHVhdG9yLlBhcnRpYWxFdmFsdWF0b3IoeworICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgaGFuZGxlciwKKyAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCisgICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAorICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKKyAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKKyAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKKyAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucworICAgIH0pOworICAgIGNvbnN0IGRhdGFQcm9taXNlcyA9IFByb21pc2UuYWxsKFtjb250ZW50U3RyZWFtUHJvbWlzZSwgcmVzb3VyY2VzUHJvbWlzZV0pOworICAgIGNvbnN0IHBhZ2VMaXN0UHJvbWlzZSA9IGRhdGFQcm9taXNlcy50aGVuKChbY29udGVudFN0cmVhbV0pID0+IHsKKyAgICAgIGNvbnN0IG9wTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoaW50ZW50LCBzaW5rKTsKKyAgICAgIGhhbmRsZXIuc2VuZCgiU3RhcnRSZW5kZXJQYWdlIiwgeworICAgICAgICB0cmFuc3BhcmVuY3k6IHBhcnRpYWxFdmFsdWF0b3IuaGFzQmxlbmRNb2Rlcyh0aGlzLnJlc291cmNlcyksCisgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCisgICAgICAgIGludGVudAorICAgICAgfSk7CisgICAgICByZXR1cm4gcGFydGlhbEV2YWx1YXRvci5nZXRPcGVyYXRvckxpc3QoeworICAgICAgICBzdHJlYW06IGNvbnRlbnRTdHJlYW0sCisgICAgICAgIHRhc2ssCisgICAgICAgIHJlc291cmNlczogdGhpcy5yZXNvdXJjZXMsCisgICAgICAgIG9wZXJhdG9yTGlzdDogb3BMaXN0CisgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIG9wTGlzdDsKKyAgICAgIH0pOworICAgIH0pOworICAgIHJldHVybiBQcm9taXNlLmFsbChbcGFnZUxpc3RQcm9taXNlLCB0aGlzLl9wYXJzZWRBbm5vdGF0aW9uc10pLnRoZW4oZnVuY3Rpb24gKFtwYWdlT3BMaXN0LCBhbm5vdGF0aW9uc10pIHsKKyAgICAgIGlmIChhbm5vdGF0aW9ucy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgcGFnZU9wTGlzdC5mbHVzaCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGgKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgY29uc3Qgb3BMaXN0UHJvbWlzZXMgPSBbXTsKKworICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CisgICAgICAgIGlmIChpc0Fubm90YXRpb25SZW5kZXJhYmxlKGFubm90YXRpb24sIGludGVudCkpIHsKKyAgICAgICAgICBvcExpc3RQcm9taXNlcy5wdXNoKGFubm90YXRpb24uZ2V0T3BlcmF0b3JMaXN0KHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIHJlbmRlckludGVyYWN0aXZlRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoImdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGFubm90YXRpb24gZGF0YSBkdXJpbmcgIiArIGAiJHt0YXNrLm5hbWV9IiB0YXNrOiAiJHtyZWFzb259Ii5gKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gUHJvbWlzZS5hbGwob3BMaXN0UHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKG9wTGlzdHMpIHsKKyAgICAgICAgcGFnZU9wTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9ucywgW10pOworCisgICAgICAgIGZvciAoY29uc3Qgb3BMaXN0IG9mIG9wTGlzdHMpIHsKKyAgICAgICAgICBwYWdlT3BMaXN0LmFkZE9wTGlzdChvcExpc3QpOworICAgICAgICB9CisKKyAgICAgICAgcGFnZU9wTGlzdC5hZGRPcChfdXRpbC5PUFMuZW5kQW5ub3RhdGlvbnMsIFtdKTsKKyAgICAgICAgcGFnZU9wTGlzdC5mbHVzaCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGgKKyAgICAgICAgfTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgZXh0cmFjdFRleHRDb250ZW50KHsKKyAgICBoYW5kbGVyLAorICAgIHRhc2ssCisgICAgbm9ybWFsaXplV2hpdGVzcGFjZSwKKyAgICBzaW5rLAorICAgIGNvbWJpbmVUZXh0SXRlbXMKKyAgfSkgeworICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1Qcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiZ2V0Q29udGVudFN0cmVhbSIpOworICAgIGNvbnN0IHJlc291cmNlc1Byb21pc2UgPSB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCAiWE9iamVjdCIsICJGb250Il0pOworICAgIGNvbnN0IGRhdGFQcm9taXNlcyA9IFByb21pc2UuYWxsKFtjb250ZW50U3RyZWFtUHJvbWlzZSwgcmVzb3VyY2VzUHJvbWlzZV0pOworICAgIHJldHVybiBkYXRhUHJvbWlzZXMudGhlbigoW2NvbnRlbnRTdHJlYW1dKSA9PiB7CisgICAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IF9ldmFsdWF0b3IuUGFydGlhbEV2YWx1YXRvcih7CisgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgICAgaGFuZGxlciwKKyAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKKyAgICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKKyAgICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKKyAgICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAorICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCisgICAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucworICAgICAgfSk7CisgICAgICByZXR1cm4gcGFydGlhbEV2YWx1YXRvci5nZXRUZXh0Q29udGVudCh7CisgICAgICAgIHN0cmVhbTogY29udGVudFN0cmVhbSwKKyAgICAgICAgdGFzaywKKyAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKKyAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZSwKKyAgICAgICAgY29tYmluZVRleHRJdGVtcywKKyAgICAgICAgc2luaworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworICBnZXRBbm5vdGF0aW9uc0RhdGEoaW50ZW50KSB7CisgICAgcmV0dXJuIHRoaXMuX3BhcnNlZEFubm90YXRpb25zLnRoZW4oZnVuY3Rpb24gKGFubm90YXRpb25zKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uc0RhdGEgPSBbXTsKKworICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBpZiAoIWludGVudCB8fCBpc0Fubm90YXRpb25SZW5kZXJhYmxlKGFubm90YXRpb25zW2ldLCBpbnRlbnQpKSB7CisgICAgICAgICAgYW5ub3RhdGlvbnNEYXRhLnB1c2goYW5ub3RhdGlvbnNbaV0uZGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGFubm90YXRpb25zRGF0YTsKKyAgICB9KTsKKyAgfQorCisgIGdldCBhbm5vdGF0aW9ucygpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImFubm90YXRpb25zIiwgdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiQW5ub3RzIikgfHwgW10pOworICB9CisKKyAgZ2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpIHsKKyAgICBjb25zdCBwYXJzZWRBbm5vdGF0aW9ucyA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywgImFubm90YXRpb25zIikudGhlbigoKSA9PiB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uUHJvbWlzZXMgPSBbXTsKKworICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uUmVmIG9mIHRoaXMuYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgYW5ub3RhdGlvblByb21pc2VzLnB1c2goX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHRoaXMueHJlZiwgYW5ub3RhdGlvblJlZiwgdGhpcy5wZGZNYW5hZ2VyLCB0aGlzLl9sb2NhbElkRmFjdG9yeSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgX3BhcnNlZEFubm90YXRpb25zOiAiJHtyZWFzb259Ii5gKTsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYW5ub3RhdGlvblByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChhbm5vdGF0aW9ucykgeworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnMuZmlsdGVyKGFubm90YXRpb24gPT4gISFhbm5vdGF0aW9uKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiX3BhcnNlZEFubm90YXRpb25zIiwgcGFyc2VkQW5ub3RhdGlvbnMpOworICB9CisKK30KKworZXhwb3J0cy5QYWdlID0gUGFnZTsKK2NvbnN0IFBERl9IRUFERVJfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4MjUsIDB4NTAsIDB4NDQsIDB4NDYsIDB4MmRdKTsKK2NvbnN0IFNUQVJUWFJFRl9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHg3MywgMHg3NCwgMHg2MSwgMHg3MiwgMHg3NCwgMHg3OCwgMHg3MiwgMHg2NSwgMHg2Nl0pOworY29uc3QgRU5ET0JKX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDY1LCAweDZlLCAweDY0LCAweDZmLCAweDYyLCAweDZhXSk7Citjb25zdCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyA9IDEwMjQ7Citjb25zdCBFTVBUWV9GSU5HRVJQUklOVCA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIjsKK2NvbnN0IFBERl9IRUFERVJfVkVSU0lPTl9SRUdFWFAgPSAvXlsxLTldXC5bMC05XSQvOworCitmdW5jdGlvbiBmaW5kKHN0cmVhbSwgc2lnbmF0dXJlLCBsaW1pdCA9IDEwMjQsIGJhY2t3YXJkcyA9IGZhbHNlKSB7CisgIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CisgIGNvbnN0IHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMobGltaXQpOworICBjb25zdCBzY2FuTGVuZ3RoID0gc2NhbkJ5dGVzLmxlbmd0aCAtIHNpZ25hdHVyZUxlbmd0aDsKKworICBpZiAoc2Nhbkxlbmd0aCA8PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGJhY2t3YXJkcykgeworICAgIGNvbnN0IHNpZ25hdHVyZUVuZCA9IHNpZ25hdHVyZUxlbmd0aCAtIDE7CisgICAgbGV0IHBvcyA9IHNjYW5CeXRlcy5sZW5ndGggLSAxOworCisgICAgd2hpbGUgKHBvcyA+PSBzaWduYXR1cmVFbmQpIHsKKyAgICAgIGxldCBqID0gMDsKKworICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyAtIGpdID09PSBzaWduYXR1cmVbc2lnbmF0dXJlRW5kIC0gal0pIHsKKyAgICAgICAgaisrOworICAgICAgfQorCisgICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKKyAgICAgICAgc3RyZWFtLnBvcyArPSBwb3MgLSBzaWduYXR1cmVFbmQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBwb3MtLTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbGV0IHBvcyA9IDA7CisKKyAgICB3aGlsZSAocG9zIDw9IHNjYW5MZW5ndGgpIHsKKyAgICAgIGxldCBqID0gMDsKKworICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyArIGpdID09PSBzaWduYXR1cmVbal0pIHsKKyAgICAgICAgaisrOworICAgICAgfQorCisgICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKKyAgICAgICAgc3RyZWFtLnBvcyArPSBwb3M7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBwb3MrKzsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2NsYXNzIFBERkRvY3VtZW50IHsKKyAgY29uc3RydWN0b3IocGRmTWFuYWdlciwgYXJnKSB7CisgICAgbGV0IHN0cmVhbTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGFyZykpIHsKKyAgICAgIHN0cmVhbSA9IGFyZzsKKyAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShhcmcpKSB7CisgICAgICBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJlYW0oYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJQREZEb2N1bWVudDogVW5rbm93biBhcmd1bWVudCB0eXBlIik7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS5sZW5ndGggPD0gMCkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkludmFsaWRQREZFeGNlcHRpb24oIlRoZSBQREYgZmlsZSBpcyBlbXB0eSwgaS5lLiBpdHMgc2l6ZSBpcyB6ZXJvIGJ5dGVzLiIpOworICAgIH0KKworICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy54cmVmID0gbmV3IF9vYmouWFJlZihzdHJlYW0sIHBkZk1hbmFnZXIpOworICAgIHRoaXMuX3BhZ2VQcm9taXNlcyA9IFtdOworICAgIHRoaXMuX3ZlcnNpb24gPSBudWxsOworICAgIGNvbnN0IGlkQ291bnRlcnMgPSB7CisgICAgICBmb250OiAwCisgICAgfTsKKyAgICB0aGlzLl9nbG9iYWxJZEZhY3RvcnkgPSBjbGFzcyB7CisgICAgICBzdGF0aWMgZ2V0RG9jSWQoKSB7CisgICAgICAgIHJldHVybiBgZ18ke3BkZk1hbmFnZXIuZG9jSWR9YDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNyZWF0ZUZvbnRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGBmJHsrK2lkQ291bnRlcnMuZm9udH1gOworICAgICAgfQorCisgICAgICBzdGF0aWMgY3JlYXRlT2JqSWQoKSB7CisgICAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlT2JqSWRgIGNhbGxlZC4iKTsKKyAgICAgIH0KKworICAgIH07CisgIH0KKworICBwYXJzZShyZWNvdmVyeU1vZGUpIHsKKyAgICB0aGlzLnhyZWYucGFyc2UocmVjb3ZlcnlNb2RlKTsKKyAgICB0aGlzLmNhdGFsb2cgPSBuZXcgX29iai5DYXRhbG9nKHRoaXMucGRmTWFuYWdlciwgdGhpcy54cmVmKTsKKworICAgIGlmICh0aGlzLmNhdGFsb2cudmVyc2lvbikgeworICAgICAgdGhpcy5fdmVyc2lvbiA9IHRoaXMuY2F0YWxvZy52ZXJzaW9uOworICAgIH0KKyAgfQorCisgIGdldCBsaW5lYXJpemF0aW9uKCkgeworICAgIGxldCBsaW5lYXJpemF0aW9uID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBsaW5lYXJpemF0aW9uID0gX3BhcnNlci5MaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSk7CisgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgZXJyOworICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImxpbmVhcml6YXRpb24iLCBsaW5lYXJpemF0aW9uKTsKKyAgfQorCisgIGdldCBzdGFydFhSZWYoKSB7CisgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CisgICAgbGV0IHN0YXJ0WFJlZiA9IDA7CisKKyAgICBpZiAodGhpcy5saW5lYXJpemF0aW9uKSB7CisgICAgICBzdHJlYW0ucmVzZXQoKTsKKworICAgICAgaWYgKGZpbmQoc3RyZWFtLCBFTkRPQkpfU0lHTkFUVVJFKSkgeworICAgICAgICBzdGFydFhSZWYgPSBzdHJlYW0ucG9zICsgNiAtIHN0cmVhbS5zdGFydDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY29uc3Qgc3RlcCA9IDEwMjQ7CisgICAgICBjb25zdCBzdGFydFhSZWZMZW5ndGggPSBTVEFSVFhSRUZfU0lHTkFUVVJFLmxlbmd0aDsKKyAgICAgIGxldCBmb3VuZCA9IGZhbHNlLAorICAgICAgICAgIHBvcyA9IHN0cmVhbS5lbmQ7CisKKyAgICAgIHdoaWxlICghZm91bmQgJiYgcG9zID4gMCkgeworICAgICAgICBwb3MgLT0gc3RlcCAtIHN0YXJ0WFJlZkxlbmd0aDsKKworICAgICAgICBpZiAocG9zIDwgMCkgeworICAgICAgICAgIHBvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0ucG9zID0gcG9zOworICAgICAgICBmb3VuZCA9IGZpbmQoc3RyZWFtLCBTVEFSVFhSRUZfU0lHTkFUVVJFLCBzdGVwLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgIHN0cmVhbS5za2lwKDkpOworICAgICAgICBsZXQgY2g7CisKKyAgICAgICAgZG8geworICAgICAgICAgIGNoID0gc3RyZWFtLmdldEJ5dGUoKTsKKyAgICAgICAgfSB3aGlsZSAoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKTsKKworICAgICAgICBsZXQgc3RyID0gIiI7CisKKyAgICAgICAgd2hpbGUgKGNoID49IDB4MjAgJiYgY2ggPD0gMHgzOSkgeworICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKyAgICAgICAgICBjaCA9IHN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGFydFhSZWYgPSBwYXJzZUludChzdHIsIDEwKTsKKworICAgICAgICBpZiAoaXNOYU4oc3RhcnRYUmVmKSkgeworICAgICAgICAgIHN0YXJ0WFJlZiA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInN0YXJ0WFJlZiIsIHN0YXJ0WFJlZik7CisgIH0KKworICBjaGVja0hlYWRlcigpIHsKKyAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKKyAgICBzdHJlYW0ucmVzZXQoKTsKKworICAgIGlmICghZmluZChzdHJlYW0sIFBERl9IRUFERVJfU0lHTkFUVVJFKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cmVhbS5tb3ZlU3RhcnQoKTsKKyAgICBjb25zdCBNQVhfUERGX1ZFUlNJT05fTEVOR1RIID0gMTI7CisgICAgbGV0IHZlcnNpb24gPSAiIiwKKyAgICAgICAgY2g7CisKKyAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgPiAweDIwKSB7CisgICAgICBpZiAodmVyc2lvbi5sZW5ndGggPj0gTUFYX1BERl9WRVJTSU9OX0xFTkdUSCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdmVyc2lvbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX3ZlcnNpb24pIHsKKyAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uLnN1YnN0cmluZyg1KTsKKyAgICB9CisgIH0KKworICBwYXJzZVN0YXJ0WFJlZigpIHsKKyAgICB0aGlzLnhyZWYuc2V0U3RhcnRYUmVmKHRoaXMuc3RhcnRYUmVmKTsKKyAgfQorCisgIGdldCBudW1QYWdlcygpIHsKKyAgICBjb25zdCBsaW5lYXJpemF0aW9uID0gdGhpcy5saW5lYXJpemF0aW9uOworICAgIGNvbnN0IG51bSA9IGxpbmVhcml6YXRpb24gPyBsaW5lYXJpemF0aW9uLm51bVBhZ2VzIDogdGhpcy5jYXRhbG9nLm51bVBhZ2VzOworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAibnVtUGFnZXMiLCBudW0pOworICB9CisKKyAgX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoZmllbGRzLCByZWN1cnNpb25EZXB0aCA9IDApIHsKKyAgICBjb25zdCBSRUNVUlNJT05fTElNSVQgPSAxMDsKKyAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KGZpZWxkID0+IHsKKyAgICAgIGZpZWxkID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmllbGQpOworCisgICAgICBpZiAoZmllbGQuaGFzKCJLaWRzIikpIHsKKyAgICAgICAgaWYgKCsrcmVjdXJzaW9uRGVwdGggPiBSRUNVUlNJT05fTElNSVQpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOiBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCByZWFjaGVkIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMuX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoZmllbGQuZ2V0KCJLaWRzIiksIHJlY3Vyc2lvbkRlcHRoKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmaWVsZC5nZXQoIkZUIiksICJTaWciKTsKKyAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGZpZWxkLmdldCgiUmVjdCIpOworICAgICAgY29uc3QgaXNJbnZpc2libGUgPSBBcnJheS5pc0FycmF5KHJlY3RhbmdsZSkgJiYgcmVjdGFuZ2xlLmV2ZXJ5KHZhbHVlID0+IHZhbHVlID09PSAwKTsKKyAgICAgIHJldHVybiBpc1NpZ25hdHVyZSAmJiBpc0ludmlzaWJsZTsKKyAgICB9KTsKKyAgfQorCisgIGdldCBmb3JtSW5mbygpIHsKKyAgICBjb25zdCBmb3JtSW5mbyA9IHsKKyAgICAgIGhhc0Fjcm9Gb3JtOiBmYWxzZSwKKyAgICAgIGhhc1hmYTogZmFsc2UKKyAgICB9OworICAgIGNvbnN0IGFjcm9Gb3JtID0gdGhpcy5jYXRhbG9nLmFjcm9Gb3JtOworCisgICAgaWYgKCFhY3JvRm9ybSkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgY29uc3QgeGZhID0gYWNyb0Zvcm0uZ2V0KCJYRkEiKTsKKyAgICAgIGNvbnN0IGhhc1hmYSA9IEFycmF5LmlzQXJyYXkoeGZhKSAmJiB4ZmEubGVuZ3RoID4gMCB8fCAoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKHhmYSkgJiYgIXhmYS5pc0VtcHR5OworICAgICAgZm9ybUluZm8uaGFzWGZhID0gaGFzWGZhOworICAgICAgY29uc3QgZmllbGRzID0gYWNyb0Zvcm0uZ2V0KCJGaWVsZHMiKTsKKyAgICAgIGNvbnN0IGhhc0ZpZWxkcyA9IEFycmF5LmlzQXJyYXkoZmllbGRzKSAmJiBmaWVsZHMubGVuZ3RoID4gMDsKKyAgICAgIGNvbnN0IHNpZ0ZsYWdzID0gYWNyb0Zvcm0uZ2V0KCJTaWdGbGFncyIpOworCisgICAgICBjb25zdCBoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzID0gISEoc2lnRmxhZ3MgJiAweDEpICYmIHRoaXMuX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoZmllbGRzKTsKKworICAgICAgZm9ybUluZm8uaGFzQWNyb0Zvcm0gPSBoYXNGaWVsZHMgJiYgIWhhc09ubHlEb2N1bWVudFNpZ25hdHVyZXM7CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoIkNhbm5vdCBmZXRjaCBmb3JtIGluZm9ybWF0aW9uLiIpOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZm9ybUluZm8iLCBmb3JtSW5mbyk7CisgIH0KKworICBnZXQgZG9jdW1lbnRJbmZvKCkgeworICAgIGNvbnN0IERvY3VtZW50SW5mb1ZhbGlkYXRvcnMgPSB7CisgICAgICBUaXRsZTogX3V0aWwuaXNTdHJpbmcsCisgICAgICBBdXRob3I6IF91dGlsLmlzU3RyaW5nLAorICAgICAgU3ViamVjdDogX3V0aWwuaXNTdHJpbmcsCisgICAgICBLZXl3b3JkczogX3V0aWwuaXNTdHJpbmcsCisgICAgICBDcmVhdG9yOiBfdXRpbC5pc1N0cmluZywKKyAgICAgIFByb2R1Y2VyOiBfdXRpbC5pc1N0cmluZywKKyAgICAgIENyZWF0aW9uRGF0ZTogX3V0aWwuaXNTdHJpbmcsCisgICAgICBNb2REYXRlOiBfdXRpbC5pc1N0cmluZywKKyAgICAgIFRyYXBwZWQ6IF9wcmltaXRpdmVzLmlzTmFtZQorICAgIH07CisgICAgbGV0IHZlcnNpb24gPSB0aGlzLl92ZXJzaW9uOworCisgICAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAic3RyaW5nIiB8fCAhUERGX0hFQURFUl9WRVJTSU9OX1JFR0VYUC50ZXN0KHZlcnNpb24pKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoYEludmFsaWQgUERGIGhlYWRlciB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9ufWApOworICAgICAgdmVyc2lvbiA9IG51bGw7CisgICAgfQorCisgICAgY29uc3QgZG9jSW5mbyA9IHsKKyAgICAgIFBERkZvcm1hdFZlcnNpb246IHZlcnNpb24sCisgICAgICBJc0xpbmVhcml6ZWQ6ICEhdGhpcy5saW5lYXJpemF0aW9uLAorICAgICAgSXNBY3JvRm9ybVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0sCisgICAgICBJc1hGQVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzWGZhLAorICAgICAgSXNDb2xsZWN0aW9uUHJlc2VudDogISF0aGlzLmNhdGFsb2cuY29sbGVjdGlvbgorICAgIH07CisgICAgbGV0IGluZm9EaWN0OworCisgICAgdHJ5IHsKKyAgICAgIGluZm9EaWN0ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIik7CisgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgZXJyOworICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CisgICAgfQorCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGluZm9EaWN0KSkgeworICAgICAgZm9yIChjb25zdCBrZXkgb2YgaW5mb0RpY3QuZ2V0S2V5cygpKSB7CisgICAgICAgIGNvbnN0IHZhbHVlID0gaW5mb0RpY3QuZ2V0KGtleSk7CisKKyAgICAgICAgaWYgKERvY3VtZW50SW5mb1ZhbGlkYXRvcnNba2V5XSkgeworICAgICAgICAgIGlmIChEb2N1bWVudEluZm9WYWxpZGF0b3JzW2tleV0odmFsdWUpKSB7CisgICAgICAgICAgICBkb2NJbmZvW2tleV0gPSB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciID8gdmFsdWUgOiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHZhbHVlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBCYWQgdmFsdWUgaW4gZG9jdW1lbnQgaW5mbyBmb3IgIiR7a2V5fSIuYCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgbGV0IGN1c3RvbVZhbHVlOworCisgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykodmFsdWUpKSB7CisgICAgICAgICAgICBjdXN0b21WYWx1ZSA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykodmFsdWUpOworICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodmFsdWUpIHx8ICgwLCBfdXRpbC5pc051bSkodmFsdWUpIHx8ICgwLCBfdXRpbC5pc0Jvb2wpKHZhbHVlKSkgeworICAgICAgICAgICAgY3VzdG9tVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBkb2N1bWVudCBpbmZvIGZvciAoY3VzdG9tKSAiJHtrZXl9Ii5gKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghZG9jSW5mby5DdXN0b20pIHsKKyAgICAgICAgICAgIGRvY0luZm8uQ3VzdG9tID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBkb2NJbmZvLkN1c3RvbVtrZXldID0gY3VzdG9tVmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRvY3VtZW50SW5mbyIsIGRvY0luZm8pOworICB9CisKKyAgZ2V0IGZpbmdlcnByaW50KCkgeworICAgIGxldCBoYXNoOworICAgIGNvbnN0IGlkQXJyYXkgPSB0aGlzLnhyZWYudHJhaWxlci5nZXQoIklEIik7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShpZEFycmF5KSAmJiBpZEFycmF5WzBdICYmICgwLCBfdXRpbC5pc1N0cmluZykoaWRBcnJheVswXSkgJiYgaWRBcnJheVswXSAhPT0gRU1QVFlfRklOR0VSUFJJTlQpIHsKKyAgICAgIGhhc2ggPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoaWRBcnJheVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGhhc2ggPSAoMCwgX2NyeXB0by5jYWxjdWxhdGVNRDUpKHRoaXMuc3RyZWFtLmdldEJ5dGVSYW5nZSgwLCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyksIDAsIEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTKTsKKyAgICB9CisKKyAgICBjb25zdCBmaW5nZXJwcmludEJ1ZiA9IFtdOworCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaGFzaC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBjb25zdCBoZXggPSBoYXNoW2ldLnRvU3RyaW5nKDE2KTsKKyAgICAgIGZpbmdlcnByaW50QnVmLnB1c2goaGV4LnBhZFN0YXJ0KDIsICIwIikpOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZmluZ2VycHJpbnQiLCBmaW5nZXJwcmludEJ1Zi5qb2luKCIiKSk7CisgIH0KKworICBfZ2V0TGluZWFyaXphdGlvblBhZ2UocGFnZUluZGV4KSB7CisgICAgY29uc3QgeworICAgICAgY2F0YWxvZywKKyAgICAgIGxpbmVhcml6YXRpb24KKyAgICB9ID0gdGhpczsKKworICAgIGNvbnN0IHJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQobGluZWFyaXphdGlvbi5vYmplY3ROdW1iZXJGaXJzdCwgMCk7CisKKyAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoQXN5bmMocmVmKS50aGVuKG9iaiA9PiB7CisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqLCAiUGFnZSIpIHx8ICgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaikgJiYgIW9iai5oYXMoIlR5cGUiKSAmJiBvYmouaGFzKCJDb250ZW50cyIpKSB7CisgICAgICAgIGlmIChyZWYgJiYgIWNhdGFsb2cucGFnZUtpZHNDb3VudENhY2hlLmhhcyhyZWYpKSB7CisgICAgICAgICAgY2F0YWxvZy5wYWdlS2lkc0NvdW50Q2FjaGUucHV0KHJlZiwgMSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gW29iaiwgcmVmXTsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJUaGUgTGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgcG9pbnQgIiArICJ0byBhIHZhbGlkIFBhZ2UgZGljdGlvbmFyeS4iKTsKKyAgICB9KS5jYXRjaChyZWFzb24gPT4geworICAgICAgKDAsIF91dGlsLmluZm8pKHJlYXNvbik7CisgICAgICByZXR1cm4gY2F0YWxvZy5nZXRQYWdlRGljdChwYWdlSW5kZXgpOworICAgIH0pOworICB9CisKKyAgZ2V0UGFnZShwYWdlSW5kZXgpIHsKKyAgICBpZiAodGhpcy5fcGFnZVByb21pc2VzW3BhZ2VJbmRleF0gIT09IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VQcm9taXNlc1twYWdlSW5kZXhdOworICAgIH0KKworICAgIGNvbnN0IHsKKyAgICAgIGNhdGFsb2csCisgICAgICBsaW5lYXJpemF0aW9uCisgICAgfSA9IHRoaXM7CisgICAgY29uc3QgcHJvbWlzZSA9IGxpbmVhcml6YXRpb24gJiYgbGluZWFyaXphdGlvbi5wYWdlRmlyc3QgPT09IHBhZ2VJbmRleCA/IHRoaXMuX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCkgOiBjYXRhbG9nLmdldFBhZ2VEaWN0KHBhZ2VJbmRleCk7CisgICAgcmV0dXJuIHRoaXMuX3BhZ2VQcm9taXNlc1twYWdlSW5kZXhdID0gcHJvbWlzZS50aGVuKChbcGFnZURpY3QsIHJlZl0pID0+IHsKKyAgICAgIHJldHVybiBuZXcgUGFnZSh7CisgICAgICAgIHBkZk1hbmFnZXI6IHRoaXMucGRmTWFuYWdlciwKKyAgICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgICBwYWdlSW5kZXgsCisgICAgICAgIHBhZ2VEaWN0LAorICAgICAgICByZWYsCisgICAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAorICAgICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLAorICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCisgICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZQorICAgICAgfSk7CisgICAgfSk7CisgIH0KKworICBjaGVja0ZpcnN0UGFnZSgpIHsKKyAgICByZXR1cm4gdGhpcy5nZXRQYWdlKDApLmNhdGNoKGFzeW5jIHJlYXNvbiA9PiB7CisgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuWFJlZkVudHJ5RXhjZXB0aW9uKSB7CisgICAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5sZW5ndGggPSAwOworICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXAoKTsKKyAgICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLlhSZWZQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CisgICAgcmV0dXJuIHRoaXMuY2F0YWxvZy5mb250RmFsbGJhY2soaWQsIGhhbmRsZXIpOworICB9CisKKyAgYXN5bmMgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIHRoaXMuY2F0YWxvZyA/IHRoaXMuY2F0YWxvZy5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKSA6ICgwLCBfcHJpbWl0aXZlcy5jbGVhclByaW1pdGl2ZUNhY2hlcykoKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGRG9jdW1lbnQgPSBQREZEb2N1bWVudDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9lbmNvZGluZ3MuanMgYi9saWIvY29yZS9lbmNvZGluZ3MuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3NjdkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL2VuY29kaW5ncy5qcwpAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRFbmNvZGluZyA9IGdldEVuY29kaW5nOworZXhwb3J0cy5FeHBlcnRFbmNvZGluZyA9IGV4cG9ydHMuWmFwZkRpbmdiYXRzRW5jb2RpbmcgPSBleHBvcnRzLlN5bWJvbFNldEVuY29kaW5nID0gZXhwb3J0cy5NYWNSb21hbkVuY29kaW5nID0gZXhwb3J0cy5TdGFuZGFyZEVuY29kaW5nID0gZXhwb3J0cy5XaW5BbnNpRW5jb2RpbmcgPSB2b2lkIDA7Citjb25zdCBFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICIiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgIiIsICIiLCAiIiwgImlzdXBlcmlvciIsICIiLCAiIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICIiLCAiIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbnN1cGVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIlNjYXJvbnNtYWxsIiwgIlpjYXJvbnNtYWxsIiwgIkRpZXJlc2lzc21hbGwiLCAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIiIsICJEb3RhY2NlbnRzbWFsbCIsICIiLCAiIiwgIk1hY3JvbnNtYWxsIiwgIiIsICIiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICIiLCAiIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiemVyb3N1cGVyaW9yIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIl07CitleHBvcnRzLkV4cGVydEVuY29kaW5nID0gRXhwZXJ0RW5jb2Rpbmc7Citjb25zdCBNYWNFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgIiIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgIiIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICIiLCAiIiwgIiIsICJFdGhzbWFsbCIsICIiLCAiIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbmluZmVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgImFzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgIkFhY3V0ZXNtYWxsIiwgIkFncmF2ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQXJpbmdzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk90aWxkZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiIiwgImVpZ2h0c3VwZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgIlNjYXJvbnNtYWxsIiwgIiIsICJjZW50aW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAiIiwgIkRpZXJlc2lzc21hbGwiLCAiIiwgIkNhcm9uc21hbGwiLCAib3N1cGVyaW9yIiwgImZpdmVpbmZlcmlvciIsICIiLCAiY29tbWFpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJZYWN1dGVzbWFsbCIsICIiLCAiZG9sbGFyaW5mZXJpb3IiLCAiIiwgIiIsICJUaG9ybnNtYWxsIiwgIiIsICJuaW5laW5mZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIlpjYXJvbnNtYWxsIiwgIkFFc21hbGwiLCAiT3NsYXNoc21hbGwiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25laW5mZXJpb3IiLCAiTHNsYXNoc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiQ2VkaWxsYXNtYWxsIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiT0VzbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbnN1cGVyaW9yIiwgIiIsICIiLCAiIiwgIiIsICJleGNsYW1kb3duc21hbGwiLCAiIiwgIllkaWVyZXNpc3NtYWxsIiwgIiIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb3N1cGVyaW9yIiwgIiIsICJlc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInRzdXBlcmlvciIsICIiLCAiIiwgImlzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgIiIsICIiLCAiIiwgIiIsICIiLCAibHN1cGVyaW9yIiwgIk9nb25la3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiTWFjcm9uc21hbGwiLCAiYnN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJtc3VwZXJpb3IiLCAiY29tbWFzdXBlcmlvciIsICJwZXJpb2RzdXBlcmlvciIsICJEb3RhY2NlbnRzbWFsbCIsICJSaW5nc21hbGwiLCAiIiwgIiIsICIiLCAiIl07Citjb25zdCBNYWNSb21hbkVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAiZ3JhdmUiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIiIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIk50aWxkZSIsICJPZGllcmVzaXMiLCAiVWRpZXJlc2lzIiwgImFhY3V0ZSIsICJhZ3JhdmUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImF0aWxkZSIsICJhcmluZyIsICJjY2VkaWxsYSIsICJlYWN1dGUiLCAiZWdyYXZlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpYWN1dGUiLCAiaWdyYXZlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJudGlsZGUiLCAib2FjdXRlIiwgIm9ncmF2ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib3RpbGRlIiwgInVhY3V0ZSIsICJ1Z3JhdmUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgImRhZ2dlciIsICJkZWdyZWUiLCAiY2VudCIsICJzdGVybGluZyIsICJzZWN0aW9uIiwgImJ1bGxldCIsICJwYXJhZ3JhcGgiLCAiZ2VybWFuZGJscyIsICJyZWdpc3RlcmVkIiwgImNvcHlyaWdodCIsICJ0cmFkZW1hcmsiLCAiYWN1dGUiLCAiZGllcmVzaXMiLCAibm90ZXF1YWwiLCAiQUUiLCAiT3NsYXNoIiwgImluZmluaXR5IiwgInBsdXNtaW51cyIsICJsZXNzZXF1YWwiLCAiZ3JlYXRlcmVxdWFsIiwgInllbiIsICJtdSIsICJwYXJ0aWFsZGlmZiIsICJzdW1tYXRpb24iLCAicHJvZHVjdCIsICJwaSIsICJpbnRlZ3JhbCIsICJvcmRmZW1pbmluZSIsICJvcmRtYXNjdWxpbmUiLCAiT21lZ2EiLCAiYWUiLCAib3NsYXNoIiwgInF1ZXN0aW9uZG93biIsICJleGNsYW1kb3duIiwgImxvZ2ljYWxub3QiLCAicmFkaWNhbCIsICJmbG9yaW4iLCAiYXBwcm94ZXF1YWwiLCAiRGVsdGEiLCAiZ3VpbGxlbW90bGVmdCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJzcGFjZSIsICJBZ3JhdmUiLCAiQXRpbGRlIiwgIk90aWxkZSIsICJPRSIsICJvZSIsICJlbmRhc2giLCAiZW1kYXNoIiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgImRpdmlkZSIsICJsb3plbmdlIiwgInlkaWVyZXNpcyIsICJZZGllcmVzaXMiLCAiZnJhY3Rpb24iLCAiY3VycmVuY3kiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInBlcnRob3VzYW5kIiwgIkFjaXJjdW1mbGV4IiwgIkVjaXJjdW1mbGV4IiwgIkFhY3V0ZSIsICJFZGllcmVzaXMiLCAiRWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiSWdyYXZlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJhcHBsZSIsICJPZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVncmF2ZSIsICJkb3RsZXNzaSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iXTsKK2V4cG9ydHMuTWFjUm9tYW5FbmNvZGluZyA9IE1hY1JvbWFuRW5jb2Rpbmc7Citjb25zdCBTdGFuZGFyZEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiIiwgImVuZGFzaCIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgIiIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgIiIsICJxdWVzdGlvbmRvd24iLCAiIiwgImdyYXZlIiwgImFjdXRlIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJkaWVyZXNpcyIsICIiLCAicmluZyIsICJjZWRpbGxhIiwgIiIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiQUUiLCAiIiwgIm9yZGZlbWluaW5lIiwgIiIsICIiLCAiIiwgIiIsICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICIiLCAiIiwgIiIsICIiLCAiIiwgImFlIiwgIiIsICIiLCAiIiwgImRvdGxlc3NpIiwgIiIsICIiLCAibHNsYXNoIiwgIm9zbGFzaCIsICJvZSIsICJnZXJtYW5kYmxzIiwgIiIsICIiLCAiIiwgIiJdOworZXhwb3J0cy5TdGFuZGFyZEVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKK2NvbnN0IFdpbkFuc2lFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJidWxsZXQiLCAiRXVybyIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAiZmxvcmluIiwgInF1b3RlZGJsYmFzZSIsICJlbGxpcHNpcyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgImNpcmN1bWZsZXgiLCAicGVydGhvdXNhbmQiLCAiU2Nhcm9uIiwgImd1aWxzaW5nbGxlZnQiLCAiT0UiLCAiYnVsbGV0IiwgIlpjYXJvbiIsICJidWxsZXQiLCAiYnVsbGV0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgImJ1bGxldCIsICJlbmRhc2giLCAiZW1kYXNoIiwgInRpbGRlIiwgInRyYWRlbWFyayIsICJzY2Fyb24iLCAiZ3VpbHNpbmdscmlnaHQiLCAib2UiLCAiYnVsbGV0IiwgInpjYXJvbiIsICJZZGllcmVzaXMiLCAic3BhY2UiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImN1cnJlbmN5IiwgInllbiIsICJicm9rZW5iYXIiLCAic2VjdGlvbiIsICJkaWVyZXNpcyIsICJjb3B5cmlnaHQiLCAib3JkZmVtaW5pbmUiLCAiZ3VpbGxlbW90bGVmdCIsICJsb2dpY2Fsbm90IiwgImh5cGhlbiIsICJyZWdpc3RlcmVkIiwgIm1hY3JvbiIsICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwgImNlZGlsbGEiLCAib25lc3VwZXJpb3IiLCAib3JkbWFzY3VsaW5lIiwgImd1aWxsZW1vdHJpZ2h0IiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93biIsICJBZ3JhdmUiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkF0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQUUiLCAiQ2NlZGlsbGEiLCAiRWdyYXZlIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiSWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiRXRoIiwgIk50aWxkZSIsICJPZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk90aWxkZSIsICJPZGllcmVzaXMiLCAibXVsdGlwbHkiLCAiT3NsYXNoIiwgIlVncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIllhY3V0ZSIsICJUaG9ybiIsICJnZXJtYW5kYmxzIiwgImFncmF2ZSIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYXRpbGRlIiwgImFkaWVyZXNpcyIsICJhcmluZyIsICJhZSIsICJjY2VkaWxsYSIsICJlZ3JhdmUiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJldGgiLCAibnRpbGRlIiwgIm9ncmF2ZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib3RpbGRlIiwgIm9kaWVyZXNpcyIsICJkaXZpZGUiLCAib3NsYXNoIiwgInVncmF2ZSIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInlhY3V0ZSIsICJ0aG9ybiIsICJ5ZGllcmVzaXMiXTsKK2V4cG9ydHMuV2luQW5zaUVuY29kaW5nID0gV2luQW5zaUVuY29kaW5nOworY29uc3QgU3ltYm9sU2V0RW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInVuaXZlcnNhbCIsICJudW1iZXJzaWduIiwgImV4aXN0ZW50aWFsIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInN1Y2h0aGF0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrbWF0aCIsICJwbHVzIiwgImNvbW1hIiwgIm1pbnVzIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiY29uZ3J1ZW50IiwgIkFscGhhIiwgIkJldGEiLCAiQ2hpIiwgIkRlbHRhIiwgIkVwc2lsb24iLCAiUGhpIiwgIkdhbW1hIiwgIkV0YSIsICJJb3RhIiwgInRoZXRhMSIsICJLYXBwYSIsICJMYW1iZGEiLCAiTXUiLCAiTnUiLCAiT21pY3JvbiIsICJQaSIsICJUaGV0YSIsICJSaG8iLCAiU2lnbWEiLCAiVGF1IiwgIlVwc2lsb24iLCAic2lnbWExIiwgIk9tZWdhIiwgIlhpIiwgIlBzaSIsICJaZXRhIiwgImJyYWNrZXRsZWZ0IiwgInRoZXJlZm9yZSIsICJicmFja2V0cmlnaHQiLCAicGVycGVuZGljdWxhciIsICJ1bmRlcnNjb3JlIiwgInJhZGljYWxleCIsICJhbHBoYSIsICJiZXRhIiwgImNoaSIsICJkZWx0YSIsICJlcHNpbG9uIiwgInBoaSIsICJnYW1tYSIsICJldGEiLCAiaW90YSIsICJwaGkxIiwgImthcHBhIiwgImxhbWJkYSIsICJtdSIsICJudSIsICJvbWljcm9uIiwgInBpIiwgInRoZXRhIiwgInJobyIsICJzaWdtYSIsICJ0YXUiLCAidXBzaWxvbiIsICJvbWVnYTEiLCAib21lZ2EiLCAieGkiLCAicHNpIiwgInpldGEiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgInNpbWlsYXIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiRXVybyIsICJVcHNpbG9uMSIsICJtaW51dGUiLCAibGVzc2VxdWFsIiwgImZyYWN0aW9uIiwgImluZmluaXR5IiwgImZsb3JpbiIsICJjbHViIiwgImRpYW1vbmQiLCAiaGVhcnQiLCAic3BhZGUiLCAiYXJyb3dib3RoIiwgImFycm93bGVmdCIsICJhcnJvd3VwIiwgImFycm93cmlnaHQiLCAiYXJyb3dkb3duIiwgImRlZ3JlZSIsICJwbHVzbWludXMiLCAic2Vjb25kIiwgImdyZWF0ZXJlcXVhbCIsICJtdWx0aXBseSIsICJwcm9wb3J0aW9uYWwiLCAicGFydGlhbGRpZmYiLCAiYnVsbGV0IiwgImRpdmlkZSIsICJub3RlcXVhbCIsICJlcXVpdmFsZW5jZSIsICJhcHByb3hlcXVhbCIsICJlbGxpcHNpcyIsICJhcnJvd3ZlcnRleCIsICJhcnJvd2hvcml6ZXgiLCAiY2FycmlhZ2VyZXR1cm4iLCAiYWxlcGgiLCAiSWZyYWt0dXIiLCAiUmZyYWt0dXIiLCAid2VpZXJzdHJhc3MiLCAiY2lyY2xlbXVsdGlwbHkiLCAiY2lyY2xlcGx1cyIsICJlbXB0eXNldCIsICJpbnRlcnNlY3Rpb24iLCAidW5pb24iLCAicHJvcGVyc3VwZXJzZXQiLCAicmVmbGV4c3VwZXJzZXQiLCAibm90c3Vic2V0IiwgInByb3BlcnN1YnNldCIsICJyZWZsZXhzdWJzZXQiLCAiZWxlbWVudCIsICJub3RlbGVtZW50IiwgImFuZ2xlIiwgImdyYWRpZW50IiwgInJlZ2lzdGVyc2VyaWYiLCAiY29weXJpZ2h0c2VyaWYiLCAidHJhZGVtYXJrc2VyaWYiLCAicHJvZHVjdCIsICJyYWRpY2FsIiwgImRvdG1hdGgiLCAibG9naWNhbG5vdCIsICJsb2dpY2FsYW5kIiwgImxvZ2ljYWxvciIsICJhcnJvd2RibGJvdGgiLCAiYXJyb3dkYmxsZWZ0IiwgImFycm93ZGJsdXAiLCAiYXJyb3dkYmxyaWdodCIsICJhcnJvd2RibGRvd24iLCAibG96ZW5nZSIsICJhbmdsZWxlZnQiLCAicmVnaXN0ZXJzYW5zIiwgImNvcHlyaWdodHNhbnMiLCAidHJhZGVtYXJrc2FucyIsICJzdW1tYXRpb24iLCAicGFyZW5sZWZ0dHAiLCAicGFyZW5sZWZ0ZXgiLCAicGFyZW5sZWZ0YnQiLCAiYnJhY2tldGxlZnR0cCIsICJicmFja2V0bGVmdGV4IiwgImJyYWNrZXRsZWZ0YnQiLCAiYnJhY2VsZWZ0dHAiLCAiYnJhY2VsZWZ0bWlkIiwgImJyYWNlbGVmdGJ0IiwgImJyYWNlZXgiLCAiIiwgImFuZ2xlcmlnaHQiLCAiaW50ZWdyYWwiLCAiaW50ZWdyYWx0cCIsICJpbnRlZ3JhbGV4IiwgImludGVncmFsYnQiLCAicGFyZW5yaWdodHRwIiwgInBhcmVucmlnaHRleCIsICJwYXJlbnJpZ2h0YnQiLCAiYnJhY2tldHJpZ2h0dHAiLCAiYnJhY2tldHJpZ2h0ZXgiLCAiYnJhY2tldHJpZ2h0YnQiLCAiYnJhY2VyaWdodHRwIiwgImJyYWNlcmlnaHRtaWQiLCAiYnJhY2VyaWdodGJ0IiwgIiJdOworZXhwb3J0cy5TeW1ib2xTZXRFbmNvZGluZyA9IFN5bWJvbFNldEVuY29kaW5nOworY29uc3QgWmFwZkRpbmdiYXRzRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiYTEiLCAiYTIiLCAiYTIwMiIsICJhMyIsICJhNCIsICJhNSIsICJhMTE5IiwgImExMTgiLCAiYTExNyIsICJhMTEiLCAiYTEyIiwgImExMyIsICJhMTQiLCAiYTE1IiwgImExNiIsICJhMTA1IiwgImExNyIsICJhMTgiLCAiYTE5IiwgImEyMCIsICJhMjEiLCAiYTIyIiwgImEyMyIsICJhMjQiLCAiYTI1IiwgImEyNiIsICJhMjciLCAiYTI4IiwgImE2IiwgImE3IiwgImE4IiwgImE5IiwgImExMCIsICJhMjkiLCAiYTMwIiwgImEzMSIsICJhMzIiLCAiYTMzIiwgImEzNCIsICJhMzUiLCAiYTM2IiwgImEzNyIsICJhMzgiLCAiYTM5IiwgImE0MCIsICJhNDEiLCAiYTQyIiwgImE0MyIsICJhNDQiLCAiYTQ1IiwgImE0NiIsICJhNDciLCAiYTQ4IiwgImE0OSIsICJhNTAiLCAiYTUxIiwgImE1MiIsICJhNTMiLCAiYTU0IiwgImE1NSIsICJhNTYiLCAiYTU3IiwgImE1OCIsICJhNTkiLCAiYTYwIiwgImE2MSIsICJhNjIiLCAiYTYzIiwgImE2NCIsICJhNjUiLCAiYTY2IiwgImE2NyIsICJhNjgiLCAiYTY5IiwgImE3MCIsICJhNzEiLCAiYTcyIiwgImE3MyIsICJhNzQiLCAiYTIwMyIsICJhNzUiLCAiYTIwNCIsICJhNzYiLCAiYTc3IiwgImE3OCIsICJhNzkiLCAiYTgxIiwgImE4MiIsICJhODMiLCAiYTg0IiwgImE5NyIsICJhOTgiLCAiYTk5IiwgImExMDAiLCAiIiwgImE4OSIsICJhOTAiLCAiYTkzIiwgImE5NCIsICJhOTEiLCAiYTkyIiwgImEyMDUiLCAiYTg1IiwgImEyMDYiLCAiYTg2IiwgImE4NyIsICJhODgiLCAiYTk1IiwgImE5NiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiYTEwMSIsICJhMTAyIiwgImExMDMiLCAiYTEwNCIsICJhMTA2IiwgImExMDciLCAiYTEwOCIsICJhMTEyIiwgImExMTEiLCAiYTExMCIsICJhMTA5IiwgImExMjAiLCAiYTEyMSIsICJhMTIyIiwgImExMjMiLCAiYTEyNCIsICJhMTI1IiwgImExMjYiLCAiYTEyNyIsICJhMTI4IiwgImExMjkiLCAiYTEzMCIsICJhMTMxIiwgImExMzIiLCAiYTEzMyIsICJhMTM0IiwgImExMzUiLCAiYTEzNiIsICJhMTM3IiwgImExMzgiLCAiYTEzOSIsICJhMTQwIiwgImExNDEiLCAiYTE0MiIsICJhMTQzIiwgImExNDQiLCAiYTE0NSIsICJhMTQ2IiwgImExNDciLCAiYTE0OCIsICJhMTQ5IiwgImExNTAiLCAiYTE1MSIsICJhMTUyIiwgImExNTMiLCAiYTE1NCIsICJhMTU1IiwgImExNTYiLCAiYTE1NyIsICJhMTU4IiwgImExNTkiLCAiYTE2MCIsICJhMTYxIiwgImExNjMiLCAiYTE2NCIsICJhMTk2IiwgImExNjUiLCAiYTE5MiIsICJhMTY2IiwgImExNjciLCAiYTE2OCIsICJhMTY5IiwgImExNzAiLCAiYTE3MSIsICJhMTcyIiwgImExNzMiLCAiYTE2MiIsICJhMTc0IiwgImExNzUiLCAiYTE3NiIsICJhMTc3IiwgImExNzgiLCAiYTE3OSIsICJhMTkzIiwgImExODAiLCAiYTE5OSIsICJhMTgxIiwgImEyMDAiLCAiYTE4MiIsICIiLCAiYTIwMSIsICJhMTgzIiwgImExODQiLCAiYTE5NyIsICJhMTg1IiwgImExOTQiLCAiYTE5OCIsICJhMTg2IiwgImExOTUiLCAiYTE4NyIsICJhMTg4IiwgImExODkiLCAiYTE5MCIsICJhMTkxIiwgIiJdOworZXhwb3J0cy5aYXBmRGluZ2JhdHNFbmNvZGluZyA9IFphcGZEaW5nYmF0c0VuY29kaW5nOworCitmdW5jdGlvbiBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpIHsKKyAgc3dpdGNoIChlbmNvZGluZ05hbWUpIHsKKyAgICBjYXNlICJXaW5BbnNpRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFdpbkFuc2lFbmNvZGluZzsKKworICAgIGNhc2UgIlN0YW5kYXJkRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFN0YW5kYXJkRW5jb2Rpbmc7CisKKyAgICBjYXNlICJNYWNSb21hbkVuY29kaW5nIjoKKyAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nOworCisgICAgY2FzZSAiU3ltYm9sU2V0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIFN5bWJvbFNldEVuY29kaW5nOworCisgICAgY2FzZSAiWmFwZkRpbmdiYXRzRW5jb2RpbmciOgorICAgICAgcmV0dXJuIFphcGZEaW5nYmF0c0VuY29kaW5nOworCisgICAgY2FzZSAiRXhwZXJ0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIEV4cGVydEVuY29kaW5nOworCisgICAgY2FzZSAiTWFjRXhwZXJ0RW5jb2RpbmciOgorICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxsOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvZXZhbHVhdG9yLmpzIGIvbGliL2NvcmUvZXZhbHVhdG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDAwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9ldmFsdWF0b3IuanMKQEAgLTAsMCArMSwzODc1IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QYXJ0aWFsRXZhbHVhdG9yID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX2NtYXAgPSByZXF1aXJlKCIuL2NtYXAuanMiKTsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfZm9udHMgPSByZXF1aXJlKCIuL2ZvbnRzLmpzIik7CisKK3ZhciBfZW5jb2RpbmdzID0gcmVxdWlyZSgiLi9lbmNvZGluZ3MuanMiKTsKKwordmFyIF9jb3JlX3V0aWxzID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIik7CisKK3ZhciBfdW5pY29kZSA9IHJlcXVpcmUoIi4vdW5pY29kZS5qcyIpOworCit2YXIgX3N0YW5kYXJkX2ZvbnRzID0gcmVxdWlyZSgiLi9zdGFuZGFyZF9mb250cy5qcyIpOworCit2YXIgX3BhdHRlcm4gPSByZXF1aXJlKCIuL3BhdHRlcm4uanMiKTsKKwordmFyIF9mdW5jdGlvbiA9IHJlcXVpcmUoIi4vZnVuY3Rpb24uanMiKTsKKwordmFyIF9wYXJzZXIgPSByZXF1aXJlKCIuL3BhcnNlci5qcyIpOworCit2YXIgX2ltYWdlX3V0aWxzID0gcmVxdWlyZSgiLi9pbWFnZV91dGlscy5qcyIpOworCit2YXIgX2JpZGkgPSByZXF1aXJlKCIuL2JpZGkuanMiKTsKKwordmFyIF9jb2xvcnNwYWNlID0gcmVxdWlyZSgiLi9jb2xvcnNwYWNlLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi9zdHJlYW0uanMiKTsKKwordmFyIF9nbHlwaGxpc3QgPSByZXF1aXJlKCIuL2dseXBobGlzdC5qcyIpOworCit2YXIgX21ldHJpY3MgPSByZXF1aXJlKCIuL21ldHJpY3MuanMiKTsKKwordmFyIF9tdXJtdXJoYXNoID0gcmVxdWlyZSgiLi9tdXJtdXJoYXNoMy5qcyIpOworCit2YXIgX29wZXJhdG9yX2xpc3QgPSByZXF1aXJlKCIuL29wZXJhdG9yX2xpc3QuanMiKTsKKwordmFyIF9pbWFnZSA9IHJlcXVpcmUoIi4vaW1hZ2UuanMiKTsKKworY29uc3QgRGVmYXVsdFBhcnRpYWxFdmFsdWF0b3JPcHRpb25zID0gT2JqZWN0LmZyZWV6ZSh7CisgIG1heEltYWdlU2l6ZTogLTEsCisgIGRpc2FibGVGb250RmFjZTogZmFsc2UsCisgIGlnbm9yZUVycm9yczogZmFsc2UsCisgIGlzRXZhbFN1cHBvcnRlZDogdHJ1ZSwKKyAgZm9udEV4dHJhUHJvcGVydGllczogZmFsc2UKK30pOworY29uc3QgUGF0dGVyblR5cGUgPSB7CisgIFRJTElORzogMSwKKyAgU0hBRElORzogMgorfTsKK2NvbnN0IGRlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7CisKK2Z1bmN0aW9uIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSwgcGFyc2luZ0FycmF5ID0gZmFsc2UpIHsKKyAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgY29uc3QgbWF5YmVCTSA9IG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZVtpXSwgdHJ1ZSk7CisKKyAgICAgIGlmIChtYXliZUJNKSB7CisgICAgICAgIHJldHVybiBtYXliZUJNOworICAgICAgfQorICAgIH0KKworICAgICgwLCBfdXRpbC53YXJuKShgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZSBBcnJheTogJHt2YWx1ZX1gKTsKKyAgICByZXR1cm4gInNvdXJjZS1vdmVyIjsKKyAgfQorCisgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodmFsdWUpKSB7CisgICAgaWYgKHBhcnNpbmdBcnJheSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CisgIH0KKworICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKKyAgICBjYXNlICJOb3JtYWwiOgorICAgIGNhc2UgIkNvbXBhdGlibGUiOgorICAgICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CisKKyAgICBjYXNlICJNdWx0aXBseSI6CisgICAgICByZXR1cm4gIm11bHRpcGx5IjsKKworICAgIGNhc2UgIlNjcmVlbiI6CisgICAgICByZXR1cm4gInNjcmVlbiI7CisKKyAgICBjYXNlICJPdmVybGF5IjoKKyAgICAgIHJldHVybiAib3ZlcmxheSI7CisKKyAgICBjYXNlICJEYXJrZW4iOgorICAgICAgcmV0dXJuICJkYXJrZW4iOworCisgICAgY2FzZSAiTGlnaHRlbiI6CisgICAgICByZXR1cm4gImxpZ2h0ZW4iOworCisgICAgY2FzZSAiQ29sb3JEb2RnZSI6CisgICAgICByZXR1cm4gImNvbG9yLWRvZGdlIjsKKworICAgIGNhc2UgIkNvbG9yQnVybiI6CisgICAgICByZXR1cm4gImNvbG9yLWJ1cm4iOworCisgICAgY2FzZSAiSGFyZExpZ2h0IjoKKyAgICAgIHJldHVybiAiaGFyZC1saWdodCI7CisKKyAgICBjYXNlICJTb2Z0TGlnaHQiOgorICAgICAgcmV0dXJuICJzb2Z0LWxpZ2h0IjsKKworICAgIGNhc2UgIkRpZmZlcmVuY2UiOgorICAgICAgcmV0dXJuICJkaWZmZXJlbmNlIjsKKworICAgIGNhc2UgIkV4Y2x1c2lvbiI6CisgICAgICByZXR1cm4gImV4Y2x1c2lvbiI7CisKKyAgICBjYXNlICJIdWUiOgorICAgICAgcmV0dXJuICJodWUiOworCisgICAgY2FzZSAiU2F0dXJhdGlvbiI6CisgICAgICByZXR1cm4gInNhdHVyYXRpb24iOworCisgICAgY2FzZSAiQ29sb3IiOgorICAgICAgcmV0dXJuICJjb2xvciI7CisKKyAgICBjYXNlICJMdW1pbm9zaXR5IjoKKyAgICAgIHJldHVybiAibHVtaW5vc2l0eSI7CisgIH0KKworICBpZiAocGFyc2luZ0FycmF5KSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAoMCwgX3V0aWwud2FybikoYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGU6ICR7dmFsdWUubmFtZX1gKTsKKyAgcmV0dXJuICJzb3VyY2Utb3ZlciI7Cit9CisKK2NsYXNzIFRpbWVTbG90TWFuYWdlciB7CisgIHN0YXRpYyBnZXQgVElNRV9TTE9UX0RVUkFUSU9OX01TKCkgeworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiVElNRV9TTE9UX0RVUkFUSU9OX01TIiwgMjApOworICB9CisKKyAgc3RhdGljIGdldCBDSEVDS19USU1FX0VWRVJZKCkgeworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiQ0hFQ0tfVElNRV9FVkVSWSIsIDEwMCk7CisgIH0KKworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLnJlc2V0KCk7CisgIH0KKworICBjaGVjaygpIHsKKyAgICBpZiAoKyt0aGlzLmNoZWNrZWQgPCBUaW1lU2xvdE1hbmFnZXIuQ0hFQ0tfVElNRV9FVkVSWSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRoaXMuY2hlY2tlZCA9IDA7CisgICAgcmV0dXJuIHRoaXMuZW5kVGltZSA8PSBEYXRlLm5vdygpOworICB9CisKKyAgcmVzZXQoKSB7CisgICAgdGhpcy5lbmRUaW1lID0gRGF0ZS5ub3coKSArIFRpbWVTbG90TWFuYWdlci5USU1FX1NMT1RfRFVSQVRJT05fTVM7CisgICAgdGhpcy5jaGVja2VkID0gMDsKKyAgfQorCit9CisKK2NsYXNzIFBhcnRpYWxFdmFsdWF0b3IgeworICBjb25zdHJ1Y3Rvcih7CisgICAgeHJlZiwKKyAgICBoYW5kbGVyLAorICAgIHBhZ2VJbmRleCwKKyAgICBpZEZhY3RvcnksCisgICAgZm9udENhY2hlLAorICAgIGJ1aWx0SW5DTWFwQ2FjaGUsCisgICAgZ2xvYmFsSW1hZ2VDYWNoZSwKKyAgICBvcHRpb25zID0gbnVsbAorICB9KSB7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OworICAgIHRoaXMuaWRGYWN0b3J5ID0gaWRGYWN0b3J5OworICAgIHRoaXMuZm9udENhY2hlID0gZm9udENhY2hlOworICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CisgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gZ2xvYmFsSW1hZ2VDYWNoZTsKKyAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IERlZmF1bHRQYXJ0aWFsRXZhbHVhdG9yT3B0aW9uczsKKyAgICB0aGlzLnBhcnNpbmdUeXBlM0ZvbnQgPSBmYWxzZTsKKyAgICB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQgPSB0aGlzLmZldGNoQnVpbHRJbkNNYXAuYmluZCh0aGlzKTsKKyAgfQorCisgIGdldCBfcGRmRnVuY3Rpb25GYWN0b3J5KCkgeworICAgIGNvbnN0IHBkZkZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBfZnVuY3Rpb24uUERGRnVuY3Rpb25GYWN0b3J5KHsKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5vcHRpb25zLmlzRXZhbFN1cHBvcnRlZAorICAgIH0pOworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiX3BkZkZ1bmN0aW9uRmFjdG9yeSIsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CisgIH0KKworICBjbG9uZShuZXdPcHRpb25zID0gRGVmYXVsdFBhcnRpYWxFdmFsdWF0b3JPcHRpb25zKSB7CisgICAgdmFyIG5ld0V2YWx1YXRvciA9IE9iamVjdC5jcmVhdGUodGhpcyk7CisgICAgbmV3RXZhbHVhdG9yLm9wdGlvbnMgPSBuZXdPcHRpb25zOworICAgIHJldHVybiBuZXdFdmFsdWF0b3I7CisgIH0KKworICBoYXNCbGVuZE1vZGVzKHJlc291cmNlcykgeworICAgIGlmICghKHJlc291cmNlcyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOworCisgICAgaWYgKHJlc291cmNlcy5vYmpJZCkgeworICAgICAgcHJvY2Vzc2VkLnB1dChyZXNvdXJjZXMub2JqSWQpOworICAgIH0KKworICAgIHZhciBub2RlcyA9IFtyZXNvdXJjZXNdLAorICAgICAgICB4cmVmID0gdGhpcy54cmVmOworCisgICAgd2hpbGUgKG5vZGVzLmxlbmd0aCkgeworICAgICAgdmFyIG5vZGUgPSBub2Rlcy5zaGlmdCgpOworICAgICAgdmFyIGdyYXBoaWNTdGF0ZXMgPSBub2RlLmdldCgiRXh0R1N0YXRlIik7CisKKyAgICAgIGlmIChncmFwaGljU3RhdGVzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgeworICAgICAgICBmb3IgKGxldCBncmFwaGljU3RhdGUgb2YgZ3JhcGhpY1N0YXRlcy5nZXRSYXdWYWx1ZXMoKSkgeworICAgICAgICAgIGlmIChncmFwaGljU3RhdGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGdyYXBoaWNTdGF0ZSkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGdyYXBoaWNTdGF0ZSA9IHhyZWYuZmV0Y2goZ3JhcGhpY1N0YXRlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBwcm9jZXNzZWQucHV0KGdyYXBoaWNTdGF0ZSk7CisgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgaGFzQmxlbmRNb2RlcyAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7ZXh9Ii5gKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCEoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChncmFwaGljU3RhdGUub2JqSWQpIHsKKyAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoZ3JhcGhpY1N0YXRlLm9iaklkKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBibSA9IGdyYXBoaWNTdGF0ZS5nZXQoIkJNIik7CisKKyAgICAgICAgICBpZiAoYm0gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CisgICAgICAgICAgICBpZiAoYm0ubmFtZSAhPT0gIk5vcm1hbCIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChibSAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkoYm0pKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm0pIHsKKyAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lICYmIGVsZW1lbnQubmFtZSAhPT0gIk5vcm1hbCIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgeE9iamVjdHMgPSBub2RlLmdldCgiWE9iamVjdCIpOworCisgICAgICBpZiAoISh4T2JqZWN0cyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKGxldCB4T2JqZWN0IG9mIHhPYmplY3RzLmdldFJhd1ZhbHVlcygpKSB7CisgICAgICAgIGlmICh4T2JqZWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoeE9iamVjdCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB4T2JqZWN0ID0geHJlZi5mZXRjaCh4T2JqZWN0KTsKKyAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeE9iamVjdCk7CisgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBYT2JqZWN0OiAiJHtleH0iLmApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKHhPYmplY3QpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeE9iamVjdC5kaWN0Lm9iaklkKSB7CisgICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4T2JqZWN0LmRpY3Qub2JqSWQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHhSZXNvdXJjZXMgPSB4T2JqZWN0LmRpY3QuZ2V0KCJSZXNvdXJjZXMiKTsKKworICAgICAgICBpZiAoISh4UmVzb3VyY2VzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkICYmIHByb2Nlc3NlZC5oYXMoeFJlc291cmNlcy5vYmpJZCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGVzLnB1c2goeFJlc291cmNlcyk7CisKKyAgICAgICAgaWYgKHhSZXNvdXJjZXMub2JqSWQpIHsKKyAgICAgICAgICBwcm9jZXNzZWQucHV0KHhSZXNvdXJjZXMub2JqSWQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYXN5bmMgZmV0Y2hCdWlsdEluQ01hcChuYW1lKSB7CisgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuYnVpbHRJbkNNYXBDYWNoZS5nZXQobmFtZSk7CisKKyAgICBpZiAoY2FjaGVkRGF0YSkgeworICAgICAgcmV0dXJuIGNhY2hlZERhdGE7CisgICAgfQorCisgICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLmhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkZldGNoQnVpbHRJbkNNYXAiLCB7CisgICAgICBuYW1lCisgICAgfSk7CisgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CisgICAgY29uc3QgZGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIGZ1bmN0aW9uIHB1bXAoKSB7CisgICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoeworICAgICAgICAgIHZhbHVlLAorICAgICAgICAgIGRvbmUKKyAgICAgICAgfSkgeworICAgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7CisgICAgICAgICAgcHVtcCgpOworICAgICAgICB9LCByZWplY3QpOworICAgICAgfQorCisgICAgICBwdW1wKCk7CisgICAgfSk7CisKKyAgICBpZiAoZGF0YS5jb21wcmVzc2lvblR5cGUgIT09IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORSkgeworICAgICAgdGhpcy5idWlsdEluQ01hcENhY2hlLnNldChuYW1lLCBkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCisgIGFzeW5jIGJ1aWxkRm9ybVhPYmplY3QocmVzb3VyY2VzLCB4b2JqLCBzbWFzaywgb3BlcmF0b3JMaXN0LCB0YXNrLCBpbml0aWFsU3RhdGUsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CisgICAgdmFyIGRpY3QgPSB4b2JqLmRpY3Q7CisgICAgdmFyIG1hdHJpeCA9IGRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpOworICAgIHZhciBiYm94ID0gZGljdC5nZXRBcnJheSgiQkJveCIpOworCisgICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHsKKyAgICAgIGJib3ggPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJib3ggPSBudWxsOworICAgIH0KKworICAgIGxldCBvcHRpb25hbENvbnRlbnQgPSBudWxsOworCisgICAgaWYgKGRpY3QuaGFzKCJPQyIpKSB7CisgICAgICBvcHRpb25hbENvbnRlbnQgPSBhd2FpdCB0aGlzLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGRpY3QuZ2V0KCJPQyIpLCByZXNvdXJjZXMpOworICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOworICAgIH0KKworICAgIHZhciBncm91cCA9IGRpY3QuZ2V0KCJHcm91cCIpOworCisgICAgaWYgKGdyb3VwKSB7CisgICAgICB2YXIgZ3JvdXBPcHRpb25zID0geworICAgICAgICBtYXRyaXgsCisgICAgICAgIGJib3gsCisgICAgICAgIHNtYXNrLAorICAgICAgICBpc29sYXRlZDogZmFsc2UsCisgICAgICAgIGtub2Nrb3V0OiBmYWxzZQorICAgICAgfTsKKyAgICAgIHZhciBncm91cFN1YnR5cGUgPSBncm91cC5nZXQoIlMiKTsKKyAgICAgIHZhciBjb2xvclNwYWNlID0gbnVsbDsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGdyb3VwU3VidHlwZSwgIlRyYW5zcGFyZW5jeSIpKSB7CisgICAgICAgIGdyb3VwT3B0aW9ucy5pc29sYXRlZCA9IGdyb3VwLmdldCgiSSIpIHx8IGZhbHNlOworICAgICAgICBncm91cE9wdGlvbnMua25vY2tvdXQgPSBncm91cC5nZXQoIksiKSB8fCBmYWxzZTsKKworICAgICAgICBpZiAoZ3JvdXAuaGFzKCJDUyIpKSB7CisgICAgICAgICAgY29uc3QgY3MgPSBncm91cC5nZXRSYXcoIkNTIik7CisKKyAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5nZXRDYWNoZWQoY3MsIHRoaXMueHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgICAgICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHsKKyAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBjYWNoZWRDb2xvclNwYWNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2xvclNwYWNlID0gYXdhaXQgdGhpcy5wYXJzZUNvbG9yU3BhY2UoeworICAgICAgICAgICAgICBjcywKKyAgICAgICAgICAgICAgcmVzb3VyY2VzLAorICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChzbWFzayAmJiBzbWFzay5iYWNrZHJvcCkgeworICAgICAgICBjb2xvclNwYWNlID0gY29sb3JTcGFjZSB8fCBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiOworICAgICAgICBzbWFzay5iYWNrZHJvcCA9IGNvbG9yU3BhY2UuZ2V0UmdiKHNtYXNrLmJhY2tkcm9wLCAwKTsKKyAgICAgIH0KKworICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5iZWdpbkdyb3VwLCBbZ3JvdXBPcHRpb25zXSk7CisgICAgfQorCisgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW4sIFttYXRyaXgsIGJib3hdKTsKKyAgICByZXR1cm4gdGhpcy5nZXRPcGVyYXRvckxpc3QoeworICAgICAgc3RyZWFtOiB4b2JqLAorICAgICAgdGFzaywKKyAgICAgIHJlc291cmNlczogZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlcywKKyAgICAgIG9wZXJhdG9yTGlzdCwKKyAgICAgIGluaXRpYWxTdGF0ZQorICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5wYWludEZvcm1YT2JqZWN0RW5kLCBbXSk7CisKKyAgICAgIGlmIChncm91cCkgeworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLmVuZEdyb3VwLCBbZ3JvdXBPcHRpb25zXSk7CisgICAgICB9CisKKyAgICAgIGlmIChvcHRpb25hbENvbnRlbnQpIHsKKyAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5lbmRNYXJrZWRDb250ZW50LCBbXSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBfc2VuZEltZ0RhdGEob2JqSWQsIGltZ0RhdGEsIGNhY2hlR2xvYmFsbHkgPSBmYWxzZSkgeworICAgIGNvbnN0IHRyYW5zZmVycyA9IGltZ0RhdGEgPyBbaW1nRGF0YS5kYXRhLmJ1ZmZlcl0gOiBudWxsOworCisgICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCB8fCBjYWNoZUdsb2JhbGx5KSB7CisgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLnNlbmQoImNvbW1vbm9iaiIsIFtvYmpJZCwgIkltYWdlIiwgaW1nRGF0YV0sIHRyYW5zZmVycyk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5zZW5kKCJvYmoiLCBbb2JqSWQsIHRoaXMucGFnZUluZGV4LCAiSW1hZ2UiLCBpbWdEYXRhXSwgdHJhbnNmZXJzKTsKKyAgfQorCisgIGFzeW5jIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoeworICAgIHJlc291cmNlcywKKyAgICBpbWFnZSwKKyAgICBpc0lubGluZSA9IGZhbHNlLAorICAgIG9wZXJhdG9yTGlzdCwKKyAgICBjYWNoZUtleSwKKyAgICBsb2NhbEltYWdlQ2FjaGUsCisgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgfSkgeworICAgIHZhciBkaWN0ID0gaW1hZ2UuZGljdDsKKyAgICBjb25zdCBpbWFnZVJlZiA9IGRpY3Qub2JqSWQ7CisgICAgdmFyIHcgPSBkaWN0LmdldCgiV2lkdGgiLCAiVyIpOworICAgIHZhciBoID0gZGljdC5nZXQoIkhlaWdodCIsICJIIik7CisKKyAgICBpZiAoISh3ICYmICgwLCBfdXRpbC5pc051bSkodykpIHx8ICEoaCAmJiAoMCwgX3V0aWwuaXNOdW0pKGgpKSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJJbWFnZSBkaW1lbnNpb25zIGFyZSBtaXNzaW5nLCBvciBub3QgbnVtYmVycy4iKTsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgdmFyIG1heEltYWdlU2l6ZSA9IHRoaXMub3B0aW9ucy5tYXhJbWFnZVNpemU7CisKKyAgICBpZiAobWF4SW1hZ2VTaXplICE9PSAtMSAmJiB3ICogaCA+IG1heEltYWdlU2l6ZSkgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJJbWFnZSBleGNlZWRlZCBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBhbmQgd2FzIHJlbW92ZWQuIik7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIHZhciBpbWFnZU1hc2sgPSBkaWN0LmdldCgiSW1hZ2VNYXNrIiwgIklNIikgfHwgZmFsc2U7CisgICAgdmFyIGltZ0RhdGEsIGFyZ3M7CisKKyAgICBpZiAoaW1hZ2VNYXNrKSB7CisgICAgICB2YXIgd2lkdGggPSBkaWN0LmdldCgiV2lkdGgiLCAiVyIpOworICAgICAgdmFyIGhlaWdodCA9IGRpY3QuZ2V0KCJIZWlnaHQiLCAiSCIpOworICAgICAgdmFyIGJpdFN0cmlkZUxlbmd0aCA9IHdpZHRoICsgNyA+PiAzOworICAgICAgdmFyIGltZ0FycmF5ID0gaW1hZ2UuZ2V0Qnl0ZXMoYml0U3RyaWRlTGVuZ3RoICogaGVpZ2h0LCB0cnVlKTsKKyAgICAgIHZhciBkZWNvZGUgPSBkaWN0LmdldEFycmF5KCJEZWNvZGUiLCAiRCIpOworICAgICAgaW1nRGF0YSA9IF9pbWFnZS5QREZJbWFnZS5jcmVhdGVNYXNrKHsKKyAgICAgICAgaW1nQXJyYXksCisgICAgICAgIHdpZHRoLAorICAgICAgICBoZWlnaHQsCisgICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIF9zdHJlYW0uRGVjb2RlU3RyZWFtLAorICAgICAgICBpbnZlcnNlRGVjb2RlOiAhIWRlY29kZSAmJiBkZWNvZGVbMF0gPiAwCisgICAgICB9KTsKKyAgICAgIGltZ0RhdGEuY2FjaGVkID0gISFjYWNoZUtleTsKKyAgICAgIGFyZ3MgPSBbaW1nRGF0YV07CisgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCwgYXJncyk7CisKKyAgICAgIGlmIChjYWNoZUtleSkgeworICAgICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwgeworICAgICAgICAgIGZuOiBfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LAorICAgICAgICAgIGFyZ3MKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgdmFyIHNvZnRNYXNrID0gZGljdC5nZXQoIlNNYXNrIiwgIlNNIikgfHwgZmFsc2U7CisgICAgdmFyIG1hc2sgPSBkaWN0LmdldCgiTWFzayIpIHx8IGZhbHNlOworICAgIHZhciBTTUFMTF9JTUFHRV9ESU1FTlNJT05TID0gMjAwOworCisgICAgaWYgKGlzSW5saW5lICYmICFzb2Z0TWFzayAmJiAhbWFzayAmJiB3ICsgaCA8IFNNQUxMX0lNQUdFX0RJTUVOU0lPTlMpIHsKKyAgICAgIGNvbnN0IGltYWdlT2JqID0gbmV3IF9pbWFnZS5QREZJbWFnZSh7CisgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgICAgcmVzOiByZXNvdXJjZXMsCisgICAgICAgIGltYWdlLAorICAgICAgICBpc0lubGluZSwKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgICB9KTsKKyAgICAgIGltZ0RhdGEgPSBpbWFnZU9iai5jcmVhdGVJbWFnZURhdGEodHJ1ZSk7CisgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0LCBbaW1nRGF0YV0pOworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBsZXQgb2JqSWQgPSBgaW1nXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gLAorICAgICAgICBjYWNoZUdsb2JhbGx5ID0gZmFsc2U7CisKKyAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CisgICAgICBvYmpJZCA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9X3R5cGUzXyR7b2JqSWR9YDsKKyAgICB9IGVsc2UgaWYgKGltYWdlUmVmKSB7CisgICAgICBjYWNoZUdsb2JhbGx5ID0gdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNob3VsZENhY2hlKGltYWdlUmVmLCB0aGlzLnBhZ2VJbmRleCk7CisKKyAgICAgIGlmIChjYWNoZUdsb2JhbGx5KSB7CisgICAgICAgIG9iaklkID0gYCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fJHtvYmpJZH1gOworICAgICAgfQorICAgIH0KKworICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKKyAgICBhcmdzID0gW29iaklkLCB3LCBoXTsKKworICAgIF9pbWFnZS5QREZJbWFnZS5idWlsZEltYWdlKHsKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIHJlczogcmVzb3VyY2VzLAorICAgICAgaW1hZ2UsCisgICAgICBpc0lubGluZSwKKyAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICB9KS50aGVuKGltYWdlT2JqID0+IHsKKyAgICAgIGltZ0RhdGEgPSBpbWFnZU9iai5jcmVhdGVJbWFnZURhdGEoZmFsc2UpOworICAgICAgcmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5KTsKKyAgICB9KS5jYXRjaChyZWFzb24gPT4geworICAgICAgKDAsIF91dGlsLndhcm4pKGBVbmFibGUgdG8gZGVjb2RlIGltYWdlICIke29iaklkfSI6ICIke3JlYXNvbn0iLmApOworICAgICAgcmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBudWxsLCBjYWNoZUdsb2JhbGx5KTsKKyAgICB9KTsKKworICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QsIGFyZ3MpOworCisgICAgaWYgKGNhY2hlS2V5KSB7CisgICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwgeworICAgICAgICBmbjogX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LAorICAgICAgICBhcmdzCisgICAgICB9KTsKKworICAgICAgaWYgKGltYWdlUmVmKSB7CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKCFpc0lubGluZSwgIkNhbm5vdCBjYWNoZSBhbiBpbmxpbmUgaW1hZ2UgZ2xvYmFsbHkuIik7CisgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRQYWdlSW5kZXgoaW1hZ2VSZWYsIHRoaXMucGFnZUluZGV4KTsKKworICAgICAgICBpZiAoY2FjaGVHbG9iYWxseSkgeworICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhKGltYWdlUmVmLCB7CisgICAgICAgICAgICBvYmpJZCwKKyAgICAgICAgICAgIGZuOiBfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QsCisgICAgICAgICAgICBhcmdzCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdW5kZWZpbmVkOworICB9CisKKyAgaGFuZGxlU01hc2soc21hc2ssIHJlc291cmNlcywgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CisgICAgdmFyIHNtYXNrQ29udGVudCA9IHNtYXNrLmdldCgiRyIpOworICAgIHZhciBzbWFza09wdGlvbnMgPSB7CisgICAgICBzdWJ0eXBlOiBzbWFzay5nZXQoIlMiKS5uYW1lLAorICAgICAgYmFja2Ryb3A6IHNtYXNrLmdldCgiQkMiKQorICAgIH07CisgICAgdmFyIHRyYW5zZmVyT2JqID0gc21hc2suZ2V0KCJUUiIpOworCisgICAgaWYgKCgwLCBfZnVuY3Rpb24uaXNQREZGdW5jdGlvbikodHJhbnNmZXJPYmopKSB7CisgICAgICBjb25zdCB0cmFuc2ZlckZuID0gdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZSh0cmFuc2Zlck9iaik7CisKKyAgICAgIHZhciB0cmFuc2Zlck1hcCA9IG5ldyBVaW50OEFycmF5KDI1Nik7CisgICAgICB2YXIgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICB0bXBbMF0gPSBpIC8gMjU1OworICAgICAgICB0cmFuc2ZlckZuKHRtcCwgMCwgdG1wLCAwKTsKKyAgICAgICAgdHJhbnNmZXJNYXBbaV0gPSB0bXBbMF0gKiAyNTUgfCAwOworICAgICAgfQorCisgICAgICBzbWFza09wdGlvbnMudHJhbnNmZXJNYXAgPSB0cmFuc2Zlck1hcDsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgc21hc2tDb250ZW50LCBzbWFza09wdGlvbnMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKyAgfQorCisgIGhhbmRsZVRyYW5zZmVyRnVuY3Rpb24odHIpIHsKKyAgICBsZXQgdHJhbnNmZXJBcnJheTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KHRyKSkgeworICAgICAgdHJhbnNmZXJBcnJheSA9IHRyOworICAgIH0gZWxzZSBpZiAoKDAsIF9mdW5jdGlvbi5pc1BERkZ1bmN0aW9uKSh0cikpIHsKKyAgICAgIHRyYW5zZmVyQXJyYXkgPSBbdHJdOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCB0cmFuc2Zlck1hcHMgPSBbXTsKKyAgICBsZXQgbnVtRm5zID0gMCwKKyAgICAgICAgbnVtRWZmZWN0ZnVsRm5zID0gMDsKKworICAgIGZvciAoY29uc3QgZW50cnkgb2YgdHJhbnNmZXJBcnJheSkgeworICAgICAgY29uc3QgdHJhbnNmZXJPYmogPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihlbnRyeSk7CisgICAgICBudW1GbnMrKzsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHRyYW5zZmVyT2JqLCAiSWRlbnRpdHkiKSkgeworICAgICAgICB0cmFuc2Zlck1hcHMucHVzaChudWxsKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKCEoMCwgX2Z1bmN0aW9uLmlzUERGRnVuY3Rpb24pKHRyYW5zZmVyT2JqKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgY29uc3QgdHJhbnNmZXJGbiA9IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUodHJhbnNmZXJPYmopOworCisgICAgICBjb25zdCB0cmFuc2Zlck1hcCA9IG5ldyBVaW50OEFycmF5KDI1NiksCisgICAgICAgICAgICB0bXAgPSBuZXcgRmxvYXQzMkFycmF5KDEpOworCisgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDI1NjsgaisrKSB7CisgICAgICAgIHRtcFswXSA9IGogLyAyNTU7CisgICAgICAgIHRyYW5zZmVyRm4odG1wLCAwLCB0bXAsIDApOworICAgICAgICB0cmFuc2Zlck1hcFtqXSA9IHRtcFswXSAqIDI1NSB8IDA7CisgICAgICB9CisKKyAgICAgIHRyYW5zZmVyTWFwcy5wdXNoKHRyYW5zZmVyTWFwKTsKKyAgICAgIG51bUVmZmVjdGZ1bEZucysrOworICAgIH0KKworICAgIGlmICghKG51bUZucyA9PT0gMSB8fCBudW1GbnMgPT09IDQpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAobnVtRWZmZWN0ZnVsRm5zID09PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhbnNmZXJNYXBzOworICB9CisKKyAgaGFuZGxlVGlsaW5nVHlwZShmbiwgYXJncywgcmVzb3VyY2VzLCBwYXR0ZXJuLCBwYXR0ZXJuRGljdCwgb3BlcmF0b3JMaXN0LCB0YXNrKSB7CisgICAgY29uc3QgdGlsaW5nT3BMaXN0ID0gbmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpOworCisgICAgY29uc3QgcGF0dGVyblJlc291cmNlcyA9IF9wcmltaXRpdmVzLkRpY3QubWVyZ2UoeworICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgZGljdEFycmF5OiBbcGF0dGVybkRpY3QuZ2V0KCJSZXNvdXJjZXMiKSwgcmVzb3VyY2VzXQorICAgIH0pOworCisgICAgcmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgIHN0cmVhbTogcGF0dGVybiwKKyAgICAgIHRhc2ssCisgICAgICByZXNvdXJjZXM6IHBhdHRlcm5SZXNvdXJjZXMsCisgICAgICBvcGVyYXRvckxpc3Q6IHRpbGluZ09wTGlzdAorICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuICgwLCBfcGF0dGVybi5nZXRUaWxpbmdQYXR0ZXJuSVIpKHsKKyAgICAgICAgZm5BcnJheTogdGlsaW5nT3BMaXN0LmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheTogdGlsaW5nT3BMaXN0LmFyZ3NBcnJheQorICAgICAgfSwgcGF0dGVybkRpY3QsIGFyZ3MpOworICAgIH0pLnRoZW4oZnVuY3Rpb24gKHRpbGluZ1BhdHRlcm5JUikgeworICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY2llcyh0aWxpbmdPcExpc3QuZGVwZW5kZW5jaWVzKTsKKyAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgdGlsaW5nUGF0dGVybklSKTsKKyAgICB9LCByZWFzb24gPT4geworICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yVGlsaW5nUGF0dGVybgorICAgICAgICB9KTsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGBoYW5kbGVUaWxpbmdUeXBlIC0gaWdub3JpbmcgcGF0dGVybjogIiR7cmVhc29ufSIuYCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhyb3cgcmVhc29uOworICAgIH0pOworICB9CisKKyAgaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGZvbnRBcmdzLCBmb250UmVmLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlKSB7CisgICAgdmFyIGZvbnROYW1lLAorICAgICAgICBmb250U2l6ZSA9IDA7CisKKyAgICBpZiAoZm9udEFyZ3MpIHsKKyAgICAgIGZvbnRBcmdzID0gZm9udEFyZ3Muc2xpY2UoKTsKKyAgICAgIGZvbnROYW1lID0gZm9udEFyZ3NbMF0ubmFtZTsKKyAgICAgIGZvbnRTaXplID0gZm9udEFyZ3NbMV07CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcykudGhlbih0cmFuc2xhdGVkID0+IHsKKyAgICAgIGlmICghdHJhbnNsYXRlZC5mb250LmlzVHlwZTNGb250KSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVkOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJhbnNsYXRlZC5sb2FkVHlwZTNEYXRhKHRoaXMsIHJlc291cmNlcywgdGFzaykudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmNpZXModHJhbnNsYXRlZC50eXBlM0RlcGVuZGVuY2llcyk7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVkOworICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udExvYWRUeXBlMworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2xhdGVkRm9udCh7CisgICAgICAgICAgbG9hZGVkTmFtZTogImdfZm9udF9lcnJvciIsCisgICAgICAgICAgZm9udDogbmV3IF9mb250cy5FcnJvckZvbnQoYFR5cGUzIGZvbnQgbG9hZCBlcnJvcjogJHtyZWFzb259YCksCisgICAgICAgICAgZGljdDogdHJhbnNsYXRlZC5mb250LAorICAgICAgICAgIGV4dHJhUHJvcGVydGllczogdGhpcy5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9KS50aGVuKHRyYW5zbGF0ZWQgPT4geworICAgICAgc3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKKyAgICAgIHN0YXRlLmZvbnRTaXplID0gZm9udFNpemU7CisgICAgICBzdGF0ZS5mb250TmFtZSA9IGZvbnROYW1lOworICAgICAgdHJhbnNsYXRlZC5zZW5kKHRoaXMuaGFuZGxlcik7CisgICAgICByZXR1cm4gdHJhbnNsYXRlZC5sb2FkZWROYW1lOworICAgIH0pOworICB9CisKKyAgaGFuZGxlVGV4dChjaGFycywgc3RhdGUpIHsKKyAgICBjb25zdCBmb250ID0gc3RhdGUuZm9udDsKKyAgICBjb25zdCBnbHlwaHMgPSBmb250LmNoYXJzVG9HbHlwaHMoY2hhcnMpOworCisgICAgaWYgKGZvbnQuZGF0YSkgeworICAgICAgY29uc3QgaXNBZGRUb1BhdGhTZXQgPSAhIShzdGF0ZS50ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcpOworCisgICAgICBpZiAoaXNBZGRUb1BhdGhTZXQgfHwgc3RhdGUuZmlsbENvbG9yU3BhY2UubmFtZSA9PT0gIlBhdHRlcm4iIHx8IGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlRm9udEZhY2UpIHsKKyAgICAgICAgUGFydGlhbEV2YWx1YXRvci5idWlsZEZvbnRQYXRocyhmb250LCBnbHlwaHMsIHRoaXMuaGFuZGxlcik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGdseXBoczsKKyAgfQorCisgIGVuc3VyZVN0YXRlRm9udChzdGF0ZSkgeworICAgIGlmIChzdGF0ZS5mb250KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgcmVhc29uID0gbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuIik7CisKKyAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRTdGF0ZQorICAgICAgfSk7CisgICAgICAoMCwgX3V0aWwud2FybikoYGVuc3VyZVN0YXRlRm9udDogIiR7cmVhc29ufSIuYCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgcmVhc29uOworICB9CisKKyAgYXN5bmMgc2V0R1N0YXRlKHsKKyAgICByZXNvdXJjZXMsCisgICAgZ1N0YXRlLAorICAgIG9wZXJhdG9yTGlzdCwKKyAgICBjYWNoZUtleSwKKyAgICB0YXNrLAorICAgIHN0YXRlTWFuYWdlciwKKyAgICBsb2NhbEdTdGF0ZUNhY2hlLAorICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgIH0pIHsKKyAgICBjb25zdCBnU3RhdGVSZWYgPSBnU3RhdGUub2JqSWQ7CisgICAgbGV0IGlzU2ltcGxlR1N0YXRlID0gdHJ1ZTsKKyAgICB2YXIgZ1N0YXRlT2JqID0gW107CisgICAgdmFyIGdTdGF0ZUtleXMgPSBnU3RhdGUuZ2V0S2V5cygpOworICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBnU3RhdGVLZXlzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IGtleSA9IGdTdGF0ZUtleXNbaV07CisgICAgICBjb25zdCB2YWx1ZSA9IGdTdGF0ZS5nZXQoa2V5KTsKKworICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgY2FzZSAiVHlwZSI6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiTFciOgorICAgICAgICBjYXNlICJMQyI6CisgICAgICAgIGNhc2UgIkxKIjoKKyAgICAgICAgY2FzZSAiTUwiOgorICAgICAgICBjYXNlICJEIjoKKyAgICAgICAgY2FzZSAiUkkiOgorICAgICAgICBjYXNlICJGTCI6CisgICAgICAgIGNhc2UgIkNBIjoKKyAgICAgICAgY2FzZSAiY2EiOgorICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHZhbHVlXSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiRm9udCI6CisgICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTsKKyAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBudWxsLCB2YWx1ZVswXSwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUpLnRoZW4oZnVuY3Rpb24gKGxvYWRlZE5hbWUpIHsKKyAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kobG9hZGVkTmFtZSk7CisgICAgICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIFtsb2FkZWROYW1lLCB2YWx1ZVsxXV1dKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0pOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIkJNIjoKKyAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBub3JtYWxpemVCbGVuZE1vZGUodmFsdWUpXSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiU01hc2siOgorICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh2YWx1ZSwgIk5vbmUiKSkgeworICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgZmFsc2VdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGlzU2ltcGxlR1N0YXRlID0gZmFsc2U7CisgICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU01hc2sodmFsdWUsIHJlc291cmNlcywgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgdHJ1ZV0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuc3VwcG9ydGVkIFNNYXNrIHR5cGUiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJUUiI6CisgICAgICAgICAgY29uc3QgdHJhbnNmZXJNYXBzID0gdGhpcy5oYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKHZhbHVlKTsKKyAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cmFuc2Zlck1hcHNdKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJPUCI6CisgICAgICAgIGNhc2UgIm9wIjoKKyAgICAgICAgY2FzZSAiT1BNIjoKKyAgICAgICAgY2FzZSAiQkciOgorICAgICAgICBjYXNlICJCRzIiOgorICAgICAgICBjYXNlICJVQ1IiOgorICAgICAgICBjYXNlICJVQ1IyIjoKKyAgICAgICAgY2FzZSAiVFIyIjoKKyAgICAgICAgY2FzZSAiSFQiOgorICAgICAgICBjYXNlICJTTSI6CisgICAgICAgIGNhc2UgIlNBIjoKKyAgICAgICAgY2FzZSAiQUlTIjoKKyAgICAgICAgY2FzZSAiVEsiOgorICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiICsga2V5KTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVW5rbm93biBncmFwaGljIHN0YXRlIG9wZXJhdG9yICIgKyBrZXkpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgaWYgKGdTdGF0ZU9iai5sZW5ndGggPiAwKSB7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0R1N0YXRlLCBbZ1N0YXRlT2JqXSk7CisgICAgICB9CisKKyAgICAgIGlmIChpc1NpbXBsZUdTdGF0ZSkgeworICAgICAgICBsb2NhbEdTdGF0ZUNhY2hlLnNldChjYWNoZUtleSwgZ1N0YXRlUmVmLCBnU3RhdGVPYmopOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgbG9hZEZvbnQoZm9udE5hbWUsIGZvbnQsIHJlc291cmNlcykgeworICAgIGNvbnN0IGVycm9yRm9udCA9ICgpID0+IHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IFRyYW5zbGF0ZWRGb250KHsKKyAgICAgICAgbG9hZGVkTmFtZTogImdfZm9udF9lcnJvciIsCisgICAgICAgIGZvbnQ6IG5ldyBfZm9udHMuRXJyb3JGb250KGBGb250ICIke2ZvbnROYW1lfSIgaXMgbm90IGF2YWlsYWJsZS5gKSwKKyAgICAgICAgZGljdDogZm9udCwKKyAgICAgICAgZXh0cmFQcm9wZXJ0aWVzOiB0aGlzLm9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllcworICAgICAgfSkpOworICAgIH07CisKKyAgICB2YXIgZm9udFJlZiwKKyAgICAgICAgeHJlZiA9IHRoaXMueHJlZjsKKworICAgIGlmIChmb250KSB7CisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1JlZikoZm9udCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCdUaGUgImZvbnQiIG9iamVjdCBzaG91bGQgYmUgYSByZWZlcmVuY2UuJyk7CisgICAgICB9CisKKyAgICAgIGZvbnRSZWYgPSBmb250OworICAgIH0gZWxzZSB7CisgICAgICB2YXIgZm9udFJlcyA9IHJlc291cmNlcy5nZXQoIkZvbnQiKTsKKworICAgICAgaWYgKGZvbnRSZXMpIHsKKyAgICAgICAgZm9udFJlZiA9IGZvbnRSZXMuZ2V0UmF3KGZvbnROYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvbnRSZWYpIHsKKyAgICAgIGNvbnN0IHBhcnRpYWxNc2cgPSBgRm9udCAiJHtmb250TmFtZSB8fCBmb250ICYmIGZvbnQudG9TdHJpbmcoKX0iIGlzIG5vdCBhdmFpbGFibGVgOworCisgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMgJiYgIXRoaXMucGFyc2luZ1R5cGUzRm9udCkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoYCR7cGFydGlhbE1zZ30uYCk7CisgICAgICAgIHJldHVybiBlcnJvckZvbnQoKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRNaXNzaW5nCisgICAgICB9KTsKKyAgICAgICgwLCBfdXRpbC53YXJuKShgJHtwYXJ0aWFsTXNnfSAtLSBhdHRlbXB0aW5nIHRvIGZhbGxiYWNrIHRvIGEgZGVmYXVsdCBmb250LmApOworICAgICAgZm9udFJlZiA9IFBhcnRpYWxFdmFsdWF0b3IuZmFsbGJhY2tGb250RGljdDsKKyAgICB9CisKKyAgICBpZiAodGhpcy5mb250Q2FjaGUuaGFzKGZvbnRSZWYpKSB7CisgICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnRSZWYpOworICAgIH0KKworICAgIGZvbnQgPSB4cmVmLmZldGNoSWZSZWYoZm9udFJlZik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGZvbnQpKSB7CisgICAgICByZXR1cm4gZXJyb3JGb250KCk7CisgICAgfQorCisgICAgaWYgKGZvbnQudHJhbnNsYXRlZCkgeworICAgICAgcmV0dXJuIGZvbnQudHJhbnNsYXRlZDsKKyAgICB9CisKKyAgICB2YXIgZm9udENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdmFyIHByZUV2YWx1YXRlZEZvbnQgPSB0aGlzLnByZUV2YWx1YXRlRm9udChmb250KTsKKyAgICBjb25zdCB7CisgICAgICBkZXNjcmlwdG9yLAorICAgICAgaGFzaAorICAgIH0gPSBwcmVFdmFsdWF0ZWRGb250OworICAgIHZhciBmb250UmVmSXNSZWYgPSAoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGZvbnRSZWYpLAorICAgICAgICBmb250SUQ7CisKKyAgICBpZiAoZm9udFJlZklzUmVmKSB7CisgICAgICBmb250SUQgPSBgZiR7Zm9udFJlZi50b1N0cmluZygpfWA7CisgICAgfQorCisgICAgaWYgKGhhc2ggJiYgKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGVzY3JpcHRvcikpIHsKKyAgICAgIGlmICghZGVzY3JpcHRvci5mb250QWxpYXNlcykgeworICAgICAgICBkZXNjcmlwdG9yLmZvbnRBbGlhc2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnRBbGlhc2VzID0gZGVzY3JpcHRvci5mb250QWxpYXNlczsKKworICAgICAgaWYgKGZvbnRBbGlhc2VzW2hhc2hdKSB7CisgICAgICAgIHZhciBhbGlhc0ZvbnRSZWYgPSBmb250QWxpYXNlc1toYXNoXS5hbGlhc1JlZjsKKworICAgICAgICBpZiAoZm9udFJlZklzUmVmICYmIGFsaWFzRm9udFJlZiAmJiB0aGlzLmZvbnRDYWNoZS5oYXMoYWxpYXNGb250UmVmKSkgeworICAgICAgICAgIHRoaXMuZm9udENhY2hlLnB1dEFsaWFzKGZvbnRSZWYsIGFsaWFzRm9udFJlZik7CisgICAgICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250UmVmKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9udEFsaWFzZXNbaGFzaF0gPSB7CisgICAgICAgICAgZm9udElEOiB0aGlzLmlkRmFjdG9yeS5jcmVhdGVGb250SWQoKQorICAgICAgICB9OworICAgICAgfQorCisgICAgICBpZiAoZm9udFJlZklzUmVmKSB7CisgICAgICAgIGZvbnRBbGlhc2VzW2hhc2hdLmFsaWFzUmVmID0gZm9udFJlZjsKKyAgICAgIH0KKworICAgICAgZm9udElEID0gZm9udEFsaWFzZXNbaGFzaF0uZm9udElEOworICAgIH0KKworICAgIGlmIChmb250UmVmSXNSZWYpIHsKKyAgICAgIHRoaXMuZm9udENhY2hlLnB1dChmb250UmVmLCBmb250Q2FwYWJpbGl0eS5wcm9taXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFmb250SUQpIHsKKyAgICAgICAgZm9udElEID0gdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuZm9udENhY2hlLnB1dChgaWRfJHtmb250SUR9YCwgZm9udENhcGFiaWxpdHkucHJvbWlzZSk7CisgICAgfQorCisgICAgKDAsIF91dGlsLmFzc2VydCkoZm9udElEICYmIGZvbnRJRC5zdGFydHNXaXRoKCJmIiksICdUaGUgImZvbnRJRCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLicpOworICAgIGZvbnQubG9hZGVkTmFtZSA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9XyR7Zm9udElEfWA7CisgICAgZm9udC50cmFuc2xhdGVkID0gZm9udENhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB2YXIgdHJhbnNsYXRlZFByb21pc2U7CisKKyAgICB0cnkgeworICAgICAgdHJhbnNsYXRlZFByb21pc2UgPSB0aGlzLnRyYW5zbGF0ZUZvbnQocHJlRXZhbHVhdGVkRm9udCk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdHJhbnNsYXRlZFByb21pc2UgPSBQcm9taXNlLnJlamVjdChlKTsKKyAgICB9CisKKyAgICB0cmFuc2xhdGVkUHJvbWlzZS50aGVuKHRyYW5zbGF0ZWRGb250ID0+IHsKKyAgICAgIGlmICh0cmFuc2xhdGVkRm9udC5mb250VHlwZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHZhciB4cmVmRm9udFN0YXRzID0geHJlZi5zdGF0cy5mb250VHlwZXM7CisgICAgICAgIHhyZWZGb250U3RhdHNbdHJhbnNsYXRlZEZvbnQuZm9udFR5cGVdID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZm9udENhcGFiaWxpdHkucmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoeworICAgICAgICBsb2FkZWROYW1lOiBmb250LmxvYWRlZE5hbWUsCisgICAgICAgIGZvbnQ6IHRyYW5zbGF0ZWRGb250LAorICAgICAgICBkaWN0OiBmb250LAorICAgICAgICBleHRyYVByb3BlcnRpZXM6IHRoaXMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzCisgICAgICB9KSk7CisgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250VHJhbnNsYXRlCisgICAgICB9KTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgdmFyIGZvbnRGaWxlMyA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5nZXQoIkZvbnRGaWxlMyIpOworICAgICAgICB2YXIgc3VidHlwZSA9IGZvbnRGaWxlMyAmJiBmb250RmlsZTMuZ2V0KCJTdWJ0eXBlIik7CisgICAgICAgIHZhciBmb250VHlwZSA9ICgwLCBfZm9udHMuZ2V0Rm9udFR5cGUpKHByZUV2YWx1YXRlZEZvbnQudHlwZSwgc3VidHlwZSAmJiBzdWJ0eXBlLm5hbWUpOworICAgICAgICB2YXIgeHJlZkZvbnRTdGF0cyA9IHhyZWYuc3RhdHMuZm9udFR5cGVzOworICAgICAgICB4cmVmRm9udFN0YXRzW2ZvbnRUeXBlXSA9IHRydWU7CisgICAgICB9IGNhdGNoIChleCkge30KKworICAgICAgZm9udENhcGFiaWxpdHkucmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoeworICAgICAgICBsb2FkZWROYW1lOiBmb250LmxvYWRlZE5hbWUsCisgICAgICAgIGZvbnQ6IG5ldyBfZm9udHMuRXJyb3JGb250KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uLm1lc3NhZ2UgOiByZWFzb24pLAorICAgICAgICBkaWN0OiBmb250LAorICAgICAgICBleHRyYVByb3BlcnRpZXM6IHRoaXMub3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzCisgICAgICB9KSk7CisgICAgfSk7CisgICAgcmV0dXJuIGZvbnRDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBidWlsZFBhdGgob3BlcmF0b3JMaXN0LCBmbiwgYXJncywgcGFyc2luZ1RleHQgPSBmYWxzZSkgeworICAgIHZhciBsYXN0SW5kZXggPSBvcGVyYXRvckxpc3QubGVuZ3RoIC0gMTsKKworICAgIGlmICghYXJncykgeworICAgICAgYXJncyA9IFtdOworICAgIH0KKworICAgIGlmIChsYXN0SW5kZXggPCAwIHx8IG9wZXJhdG9yTGlzdC5mbkFycmF5W2xhc3RJbmRleF0gIT09IF91dGlsLk9QUy5jb25zdHJ1Y3RQYXRoKSB7CisgICAgICBpZiAocGFyc2luZ1RleHQpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGBFbmNvdW50ZXJlZCBwYXRoIG9wZXJhdG9yICIke2ZufSIgaW5zaWRlIG9mIGEgdGV4dCBvYmplY3QuYCk7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2F2ZSwgbnVsbCk7CisgICAgICB9CisKKyAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuY29uc3RydWN0UGF0aCwgW1tmbl0sIGFyZ3NdKTsKKworICAgICAgaWYgKHBhcnNpbmdUZXh0KSB7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucmVzdG9yZSwgbnVsbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBvcEFyZ3MgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5W2xhc3RJbmRleF07CisgICAgICBvcEFyZ3NbMF0ucHVzaChmbik7CisgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShvcEFyZ3NbMV0sIGFyZ3MpOworICAgIH0KKyAgfQorCisgIHBhcnNlQ29sb3JTcGFjZSh7CisgICAgY3MsCisgICAgcmVzb3VyY2VzLAorICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgIH0pIHsKKyAgICByZXR1cm4gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZUFzeW5jKHsKKyAgICAgIGNzLAorICAgICAgeHJlZjogdGhpcy54cmVmLAorICAgICAgcmVzb3VyY2VzLAorICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckNvbG9yU3BhY2UKKyAgICAgICAgfSk7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgcGFyc2VDb2xvclNwYWNlIC0gaWdub3JpbmcgQ29sb3JTcGFjZTogIiR7cmVhc29ufSIuYCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICB0aHJvdyByZWFzb247CisgICAgfSk7CisgIH0KKworICBhc3luYyBoYW5kbGVDb2xvck4ob3BlcmF0b3JMaXN0LCBmbiwgYXJncywgY3MsIHBhdHRlcm5zLCByZXNvdXJjZXMsIHRhc2ssIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CisgICAgdmFyIHBhdHRlcm5OYW1lID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdOworICAgIHZhciBwYXR0ZXJuOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHBhdHRlcm5OYW1lKSAmJiAocGF0dGVybiA9IHBhdHRlcm5zLmdldChwYXR0ZXJuTmFtZS5uYW1lKSkpIHsKKyAgICAgIHZhciBkaWN0ID0gKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShwYXR0ZXJuKSA/IHBhdHRlcm4uZGljdCA6IHBhdHRlcm47CisgICAgICB2YXIgdHlwZU51bSA9IGRpY3QuZ2V0KCJQYXR0ZXJuVHlwZSIpOworCisgICAgICBpZiAodHlwZU51bSA9PT0gUGF0dGVyblR5cGUuVElMSU5HKSB7CisgICAgICAgIHZhciBjb2xvciA9IGNzLmJhc2UgPyBjcy5iYXNlLmdldFJnYihhcmdzLCAwKSA6IG51bGw7CisgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVRpbGluZ1R5cGUoZm4sIGNvbG9yLCByZXNvdXJjZXMsIHBhdHRlcm4sIGRpY3QsIG9wZXJhdG9yTGlzdCwgdGFzayk7CisgICAgICB9IGVsc2UgaWYgKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlNIQURJTkcpIHsKKyAgICAgICAgdmFyIHNoYWRpbmcgPSBkaWN0LmdldCgiU2hhZGluZyIpOworICAgICAgICB2YXIgbWF0cml4ID0gZGljdC5nZXRBcnJheSgiTWF0cml4Iik7CisgICAgICAgIHBhdHRlcm4gPSBfcGF0dGVybi5QYXR0ZXJuLnBhcnNlU2hhZGluZyhzaGFkaW5nLCBtYXRyaXgsIHRoaXMueHJlZiwgcmVzb3VyY2VzLCB0aGlzLmhhbmRsZXIsIHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHBhdHRlcm4uZ2V0SVIoKSk7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuVHlwZTogJHt0eXBlTnVtfWApOworICAgIH0KKworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuTmFtZTogJHtwYXR0ZXJuTmFtZX1gKTsKKyAgfQorCisgIGFzeW5jIHBhcnNlTWFya2VkQ29udGVudFByb3BzKGNvbnRlbnRQcm9wZXJ0aWVzLCByZXNvdXJjZXMpIHsKKyAgICBsZXQgb3B0aW9uYWxDb250ZW50OworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGNvbnRlbnRQcm9wZXJ0aWVzKSkgeworICAgICAgY29uc3QgcHJvcGVydGllcyA9IHJlc291cmNlcy5nZXQoIlByb3BlcnRpZXMiKTsKKyAgICAgIG9wdGlvbmFsQ29udGVudCA9IHByb3BlcnRpZXMuZ2V0KGNvbnRlbnRQcm9wZXJ0aWVzLm5hbWUpOworICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY29udGVudFByb3BlcnRpZXMpKSB7CisgICAgICBvcHRpb25hbENvbnRlbnQgPSBjb250ZW50UHJvcGVydGllczsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLiIpOworICAgIH0KKworICAgIGNvbnN0IG9wdGlvbmFsQ29udGVudFR5cGUgPSBvcHRpb25hbENvbnRlbnQuZ2V0KCJUeXBlIikubmFtZTsKKworICAgIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NHIikgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSwKKyAgICAgICAgaWQ6IG9wdGlvbmFsQ29udGVudC5vYmpJZAorICAgICAgfTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbmFsQ29udGVudFR5cGUgPT09ICJPQ01EIikgeworICAgICAgY29uc3Qgb3B0aW9uYWxDb250ZW50R3JvdXBzID0gb3B0aW9uYWxDb250ZW50LmdldCgiT0NHcyIpOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25hbENvbnRlbnRHcm91cHMpIHx8ICgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9wdGlvbmFsQ29udGVudEdyb3VwcykpIHsKKyAgICAgICAgY29uc3QgZ3JvdXBJZHMgPSBbXTsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25hbENvbnRlbnRHcm91cHMpKSB7CisgICAgICAgICAgb3B0aW9uYWxDb250ZW50LmdldCgiT0NHcyIpLmZvckVhY2gob2NnID0+IHsKKyAgICAgICAgICAgIGdyb3VwSWRzLnB1c2gob2NnLnRvU3RyaW5nKCkpOworICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdyb3VwSWRzLnB1c2gob3B0aW9uYWxDb250ZW50R3JvdXBzLm9iaklkKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBleHByZXNzaW9uID0gbnVsbDsKKworICAgICAgICBpZiAob3B0aW9uYWxDb250ZW50LmdldCgiVkUiKSkgeworICAgICAgICAgIGV4cHJlc3Npb24gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICB0eXBlOiBvcHRpb25hbENvbnRlbnRUeXBlLAorICAgICAgICAgIGlkczogZ3JvdXBJZHMsCisgICAgICAgICAgcG9saWN5OiAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShvcHRpb25hbENvbnRlbnQuZ2V0KCJQIikpID8gb3B0aW9uYWxDb250ZW50LmdldCgiUCIpLm5hbWUgOiBudWxsLAorICAgICAgICAgIGV4cHJlc3Npb24KKyAgICAgICAgfTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKShvcHRpb25hbENvbnRlbnRHcm91cHMpKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSwKKyAgICAgICAgICBpZDogb3B0aW9uYWxDb250ZW50R3JvdXBzLnRvU3RyaW5nKCkKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGdldE9wZXJhdG9yTGlzdCh7CisgICAgc3RyZWFtLAorICAgIHRhc2ssCisgICAgcmVzb3VyY2VzLAorICAgIG9wZXJhdG9yTGlzdCwKKyAgICBpbml0aWFsU3RhdGUgPSBudWxsCisgIH0pIHsKKyAgICByZXNvdXJjZXMgPSByZXNvdXJjZXMgfHwgX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKKyAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGUgfHwgbmV3IEV2YWxTdGF0ZSgpOworCisgICAgaWYgKCFvcGVyYXRvckxpc3QpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0T3BlcmF0b3JMaXN0OiBtaXNzaW5nICJvcGVyYXRvckxpc3QiIHBhcmFtZXRlcicpOworICAgIH0KKworICAgIHZhciBzZWxmID0gdGhpczsKKyAgICB2YXIgeHJlZiA9IHRoaXMueHJlZjsKKyAgICBsZXQgcGFyc2luZ1RleHQgPSBmYWxzZTsKKyAgICBjb25zdCBsb2NhbEltYWdlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsSW1hZ2VDYWNoZSgpOworICAgIGNvbnN0IGxvY2FsQ29sb3JTcGFjZUNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbENvbG9yU3BhY2VDYWNoZSgpOworICAgIGNvbnN0IGxvY2FsR1N0YXRlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsR1N0YXRlQ2FjaGUoKTsKKworICAgIHZhciB4b2JqcyA9IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworCisgICAgdmFyIHBhdHRlcm5zID0gcmVzb3VyY2VzLmdldCgiUGF0dGVybiIpIHx8IF9wcmltaXRpdmVzLkRpY3QuZW1wdHk7CisKKyAgICB2YXIgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihpbml0aWFsU3RhdGUpOworICAgIHZhciBwcmVwcm9jZXNzb3IgPSBuZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKTsKKyAgICB2YXIgdGltZVNsb3RNYW5hZ2VyID0gbmV3IFRpbWVTbG90TWFuYWdlcigpOworCisgICAgZnVuY3Rpb24gY2xvc2VQZW5kaW5nUmVzdG9yZU9QUyhhcmd1bWVudCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcHJlcHJvY2Vzc29yLnNhdmVkU3RhdGVzRGVwdGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucmVzdG9yZSwgW10pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlQm9keShyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgeworICAgICAgICBQcm9taXNlLmFsbChbcHJvbWlzZSwgb3BlcmF0b3JMaXN0LnJlYWR5XSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7CisgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICAgIHJlamVjdChleCk7CisgICAgICAgICAgfQorICAgICAgICB9LCByZWplY3QpOworICAgICAgfTsKKworICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CisgICAgICB0aW1lU2xvdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgIHZhciBzdG9wLAorICAgICAgICAgIG9wZXJhdGlvbiA9IHt9LAorICAgICAgICAgIGksCisgICAgICAgICAgaWksCisgICAgICAgICAgY3MsCisgICAgICAgICAgbmFtZTsKKworICAgICAgd2hpbGUgKCEoc3RvcCA9IHRpbWVTbG90TWFuYWdlci5jaGVjaygpKSkgeworICAgICAgICBvcGVyYXRpb24uYXJncyA9IG51bGw7CisKKyAgICAgICAgaWYgKCFwcmVwcm9jZXNzb3IucmVhZChvcGVyYXRpb24pKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYXJncyA9IG9wZXJhdGlvbi5hcmdzOworICAgICAgICB2YXIgZm4gPSBvcGVyYXRpb24uZm47CisKKyAgICAgICAgc3dpdGNoIChmbiB8IDApIHsKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludFhPYmplY3Q6CisgICAgICAgICAgICBuYW1lID0gYXJnc1swXS5uYW1lOworCisgICAgICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgICBjb25zdCBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5TmFtZShuYW1lKTsKKworICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkgeworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChsb2NhbEltYWdlLmZuLCBsb2NhbEltYWdlLmFyZ3MpOworICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KSB7CisgICAgICAgICAgICAgIGlmICghbmFtZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiWE9iamVjdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBsZXQgeG9iaiA9IHhvYmpzLmdldFJhdyhuYW1lKTsKKworICAgICAgICAgICAgICBpZiAoeG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgeworICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlSZWYoeG9iaik7CisKKyAgICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkgeworICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGxvY2FsSW1hZ2UuZm4sIGxvY2FsSW1hZ2UuYXJncyk7CisgICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOworCisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CisgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShnbG9iYWxJbWFnZS5vYmpJZCk7CisgICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZ2xvYmFsSW1hZ2UuZm4sIGdsb2JhbEltYWdlLmFyZ3MpOworICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh4b2JqKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgYmUgYSBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4b2JqLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CisKKyAgICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh0eXBlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHR5cGUubmFtZSA9PT0gIkZvcm0iKSB7CisgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnNhdmUoKTsKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkRm9ybVhPYmplY3QocmVzb3VyY2VzLCB4b2JqLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZS5jbG9uZSgpLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIucmVzdG9yZSgpOworICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKKyAgICAgICAgICAgICAgICB9LCByZWplY3RYT2JqZWN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSAiSW1hZ2UiKSB7CisgICAgICAgICAgICAgICAgc2VsZi5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHsKKyAgICAgICAgICAgICAgICAgIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgIGltYWdlOiB4b2JqLAorICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LAorICAgICAgICAgICAgICAgICAgY2FjaGVLZXk6IG5hbWUsCisgICAgICAgICAgICAgICAgICBsb2NhbEltYWdlQ2FjaGUsCisgICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLm5hbWUgPT09ICJQUyIpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIklnbm9yZWQgWE9iamVjdCBzdWJ0eXBlIFBTIik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbmhhbmRsZWQgWE9iamVjdCBzdWJ0eXBlICR7dHlwZS5uYW1lfWApOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKKyAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIiwgeworICAgICAgICAgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvclhPYmplY3QKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke3JlYXNvbn0iLmApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZvbnQ6CisgICAgICAgICAgICB2YXIgZm9udFNpemUgPSBhcmdzWzFdOworICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBhcmdzLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZSkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkgeworICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTsKKyAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5zZXRGb250LCBbbG9hZGVkTmFtZSwgZm9udFNpemVdKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmJlZ2luVGV4dDoKKyAgICAgICAgICAgIHBhcnNpbmdUZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW5kVGV4dDoKKyAgICAgICAgICAgIHBhcnNpbmdUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZElubGluZUltYWdlOgorICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gYXJnc1swXS5jYWNoZUtleTsKKworICAgICAgICAgICAgaWYgKGNhY2hlS2V5KSB7CisgICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlOYW1lKGNhY2hlS2V5KTsKKworICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkgeworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChsb2NhbEltYWdlLmZuLCBsb2NhbEltYWdlLmFyZ3MpOworICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5leHQoc2VsZi5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHsKKyAgICAgICAgICAgICAgcmVzb3VyY2VzLAorICAgICAgICAgICAgICBpbWFnZTogYXJnc1swXSwKKyAgICAgICAgICAgICAgaXNJbmxpbmU6IHRydWUsCisgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKKyAgICAgICAgICAgICAgY2FjaGVLZXksCisgICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZSwKKyAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNob3dUZXh0OgorICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXJnc1swXSA9IHNlbGYuaGFuZGxlVGV4dChhcmdzWzBdLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93U3BhY2VkVGV4dDoKKyAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBhcnIgPSBhcmdzWzBdOworICAgICAgICAgICAgdmFyIGNvbWJpbmVkR2x5cGhzID0gW107CisgICAgICAgICAgICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDsKKyAgICAgICAgICAgIHZhciBzdGF0ZSA9IHN0YXRlTWFuYWdlci5zdGF0ZTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyckxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgIHZhciBhcnJJdGVtID0gYXJyW2ldOworCisgICAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKGFyckl0ZW0pKSB7CisgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoY29tYmluZWRHbHlwaHMsIHNlbGYuaGFuZGxlVGV4dChhcnJJdGVtLCBzdGF0ZSkpOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc051bSkoYXJySXRlbSkpIHsKKyAgICAgICAgICAgICAgICBjb21iaW5lZEdseXBocy5wdXNoKGFyckl0ZW0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFyZ3NbMF0gPSBjb21iaW5lZEdseXBoczsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNob3dUZXh0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5uZXh0TGluZVNob3dUZXh0OgorICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5uZXh0TGluZSk7CisgICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaG93VGV4dDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6CisgICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CisgICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLm5leHRMaW5lKTsKKyAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0V29yZFNwYWNpbmcsIFthcmdzLnNoaWZ0KCldKTsKKyAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0Q2hhclNwYWNpbmcsIFthcmdzLnNoaWZ0KCldKTsKKyAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNob3dUZXh0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZToKKyAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS50ZXh0UmVuZGVyaW5nTW9kZSA9IGFyZ3NbMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDb2xvclNwYWNlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5nZXRDYWNoZWQoYXJnc1swXSwgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOworCisgICAgICAgICAgICAgIGlmIChjYWNoZWRDb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gY2FjaGVkQ29sb3JTcGFjZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG5leHQoc2VsZi5wYXJzZUNvbG9yU3BhY2UoeworICAgICAgICAgICAgICAgIGNzOiBhcmdzWzBdLAorICAgICAgICAgICAgICAgIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbG9yU3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yU3BhY2U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLmdldENhY2hlZChhcmdzWzBdLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisKKyAgICAgICAgICAgICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IGNhY2hlZENvbG9yU3BhY2U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBuZXh0KHNlbGYucGFyc2VDb2xvclNwYWNlKHsKKyAgICAgICAgICAgICAgICBjczogYXJnc1swXSwKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29sb3JTcGFjZSkgeworICAgICAgICAgICAgICAgIGlmIChjb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDb2xvcjoKKyAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlOworICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3I6CisgICAgICAgICAgICBjcyA9IHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlOworICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsR3JheToKKyAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5OworICAgICAgICAgICAgYXJncyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYihhcmdzLCAwKTsKKyAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlR3JheToKKyAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CisgICAgICAgICAgICBhcmdzID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGFyZ3MsIDApOworICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDTVlLQ29sb3I6CisgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215azsKKyAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNNWUtDb2xvcjoKKyAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWs7CisgICAgICAgICAgICBhcmdzID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKGFyZ3MsIDApOworICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjoKKyAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7CisgICAgICAgICAgICBhcmdzID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoYXJncywgMCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOgorICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiOworICAgICAgICAgICAgYXJncyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKGFyZ3MsIDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3JOOgorICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2U7CisKKyAgICAgICAgICAgIGlmIChjcy5uYW1lID09PSAiUGF0dGVybiIpIHsKKyAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIF91dGlsLk9QUy5zZXRGaWxsQ29sb3JOLCBhcmdzLCBjcywgcGF0dGVybnMsIHJlc291cmNlcywgdGFzaywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOworICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDb2xvck46CisgICAgICAgICAgICBjcyA9IHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlOworCisgICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CisgICAgICAgICAgICAgIG5leHQoc2VsZi5oYW5kbGVDb2xvck4ob3BlcmF0b3JMaXN0LCBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3JOLCBhcmdzLCBjcywgcGF0dGVybnMsIHJlc291cmNlcywgdGFzaywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOworICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNoYWRpbmdGaWxsOgorICAgICAgICAgICAgdmFyIHNoYWRpbmdSZXMgPSByZXNvdXJjZXMuZ2V0KCJTaGFkaW5nIik7CisKKyAgICAgICAgICAgIGlmICghc2hhZGluZ1JlcykgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vIHNoYWRpbmcgcmVzb3VyY2UgZm91bmQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNoYWRpbmcgPSBzaGFkaW5nUmVzLmdldChhcmdzWzBdLm5hbWUpOworCisgICAgICAgICAgICBpZiAoIXNoYWRpbmcpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBzaGFkaW5nIG9iamVjdCBmb3VuZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2hhZGluZ0ZpbGwgPSBfcGF0dGVybi5QYXR0ZXJuLnBhcnNlU2hhZGluZyhzaGFkaW5nLCBudWxsLCB4cmVmLCByZXNvdXJjZXMsIHNlbGYuaGFuZGxlciwgc2VsZi5fcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisKKyAgICAgICAgICAgIHZhciBwYXR0ZXJuSVIgPSBzaGFkaW5nRmlsbC5nZXRJUigpOworICAgICAgICAgICAgYXJncyA9IFtwYXR0ZXJuSVJdOworICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2hhZGluZ0ZpbGw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEdTdGF0ZToKKyAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CisKKyAgICAgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgICAgIGNvbnN0IGxvY2FsR1N0YXRlT2JqID0gbG9jYWxHU3RhdGVDYWNoZS5nZXRCeU5hbWUobmFtZSk7CisKKyAgICAgICAgICAgICAgaWYgKGxvY2FsR1N0YXRlT2JqKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsR1N0YXRlT2JqLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0R1N0YXRlLCBbbG9jYWxHU3RhdGVPYmpdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhcmdzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0KG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlR1N0YXRlLCByZWplY3RHU3RhdGUpIHsKKyAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJHU3RhdGUgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CisKKyAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkV4dEdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29uc3QgZ1N0YXRlID0gZXh0R1N0YXRlLmdldChuYW1lKTsKKworICAgICAgICAgICAgICBpZiAoIShnU3RhdGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzZWxmLnNldEdTdGF0ZSh7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgIGdTdGF0ZSwKKyAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsCisgICAgICAgICAgICAgICAgY2FjaGVLZXk6IG5hbWUsCisgICAgICAgICAgICAgICAgdGFzaywKKyAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgbG9jYWxHU3RhdGVDYWNoZSwKKyAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgICAgICAgICB9KS50aGVuKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSk7CisgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JFeHRHU3RhdGUKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7cmVhc29ufSIuYCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRvOgorICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmxpbmVUbzoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jdXJ2ZVRvOgorICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8yOgorICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8zOgorICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5yZWN0YW5nbGU6CisgICAgICAgICAgICBzZWxmLmJ1aWxkUGF0aChvcGVyYXRvckxpc3QsIGZuLCBhcmdzLCBwYXJzaW5nVGV4dCk7CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1hcmtQb2ludDoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5tYXJrUG9pbnRQcm9wczoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpbkNvbXBhdDoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRDb21wYXQ6CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzOgorICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShhcmdzWzBdKSkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYEV4cGVjdGVkIG5hbWUgZm9yIGJlZ2luTWFya2VkQ29udGVudFByb3BzIGFyZzA9JHthcmdzWzBdfWApOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFyZ3NbMF0ubmFtZSA9PT0gIk9DIikgeworICAgICAgICAgICAgICBuZXh0KHNlbGYucGFyc2VNYXJrZWRDb250ZW50UHJvcHMoYXJnc1sxXSwgcmVzb3VyY2VzKS50aGVuKGRhdGEgPT4geworICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBkYXRhXSk7CisgICAgICAgICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JNYXJrZWRDb250ZW50CisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6ICIke3JlYXNvbn0iLmApOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1swXS5uYW1lXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5NYXJrZWRDb250ZW50OgorICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZE1hcmtlZENvbnRlbnQ6CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChhcmdzICE9PSBudWxsKSB7CisgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGlpID0gYXJncy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoaSA8IGlpKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBvcGVyYXRvcjogIiArIGZuKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIGFyZ3MpOworICAgICAgfQorCisgICAgICBpZiAoc3RvcCkgeworICAgICAgICBuZXh0KGRlZmVycmVkKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCk7CisgICAgICByZXNvbHZlKCk7CisgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJVbnN1cHBvcnRlZEZlYXR1cmUiLCB7CisgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvck9wZXJhdG9yTGlzdAorICAgICAgICB9KTsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICIke3Rhc2submFtZX0iIGAgKyBgdGFzazogIiR7cmVhc29ufSIuYCk7CisgICAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aHJvdyByZWFzb247CisgICAgfSk7CisgIH0KKworICBnZXRUZXh0Q29udGVudCh7CisgICAgc3RyZWFtLAorICAgIHRhc2ssCisgICAgcmVzb3VyY2VzLAorICAgIHN0YXRlTWFuYWdlciA9IG51bGwsCisgICAgbm9ybWFsaXplV2hpdGVzcGFjZSA9IGZhbHNlLAorICAgIGNvbWJpbmVUZXh0SXRlbXMgPSBmYWxzZSwKKyAgICBzaW5rLAorICAgIHNlZW5TdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpCisgIH0pIHsKKyAgICByZXNvdXJjZXMgPSByZXNvdXJjZXMgfHwgX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKKyAgICBzdGF0ZU1hbmFnZXIgPSBzdGF0ZU1hbmFnZXIgfHwgbmV3IFN0YXRlTWFuYWdlcihuZXcgVGV4dFN0YXRlKCkpOworICAgIHZhciBXaGl0ZXNwYWNlUmVnZXhwID0gL1xzL2c7CisgICAgdmFyIHRleHRDb250ZW50ID0geworICAgICAgaXRlbXM6IFtdLAorICAgICAgc3R5bGVzOiBPYmplY3QuY3JlYXRlKG51bGwpCisgICAgfTsKKyAgICB2YXIgdGV4dENvbnRlbnRJdGVtID0geworICAgICAgaW5pdGlhbGl6ZWQ6IGZhbHNlLAorICAgICAgc3RyOiBbXSwKKyAgICAgIHdpZHRoOiAwLAorICAgICAgaGVpZ2h0OiAwLAorICAgICAgdmVydGljYWw6IGZhbHNlLAorICAgICAgbGFzdEFkdmFuY2VXaWR0aDogMCwKKyAgICAgIGxhc3RBZHZhbmNlSGVpZ2h0OiAwLAorICAgICAgdGV4dEFkdmFuY2VTY2FsZTogMCwKKyAgICAgIHNwYWNlV2lkdGg6IDAsCisgICAgICBmYWtlU3BhY2VNaW46IEluZmluaXR5LAorICAgICAgZmFrZU11bHRpU3BhY2VNaW46IEluZmluaXR5LAorICAgICAgZmFrZU11bHRpU3BhY2VNYXg6IC0wLAorICAgICAgdGV4dFJ1bkJyZWFrQWxsb3dlZDogZmFsc2UsCisgICAgICB0cmFuc2Zvcm06IG51bGwsCisgICAgICBmb250TmFtZTogbnVsbAorICAgIH07CisgICAgdmFyIFNQQUNFX0ZBQ1RPUiA9IDAuMzsKKyAgICB2YXIgTVVMVElfU1BBQ0VfRkFDVE9SID0gMS41OworICAgIHZhciBNVUxUSV9TUEFDRV9GQUNUT1JfTUFYID0gNDsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7CisgICAgdmFyIHhvYmpzID0gbnVsbDsKKyAgICBjb25zdCBlbXB0eVhPYmplY3RDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxJbWFnZUNhY2hlKCk7CisgICAgY29uc3QgZW1wdHlHU3RhdGVDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxHU3RhdGVDYWNoZSgpOworICAgIHZhciBwcmVwcm9jZXNzb3IgPSBuZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKTsKKyAgICB2YXIgdGV4dFN0YXRlOworCisgICAgZnVuY3Rpb24gZW5zdXJlVGV4dENvbnRlbnRJdGVtKCkgeworICAgICAgaWYgKHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm4gdGV4dENvbnRlbnRJdGVtOworICAgICAgfQorCisgICAgICB2YXIgZm9udCA9IHRleHRTdGF0ZS5mb250OworCisgICAgICBpZiAoIShmb250LmxvYWRlZE5hbWUgaW4gc2VlblN0eWxlcykpIHsKKyAgICAgICAgc2VlblN0eWxlc1tmb250LmxvYWRlZE5hbWVdID0gdHJ1ZTsKKyAgICAgICAgdGV4dENvbnRlbnQuc3R5bGVzW2ZvbnQubG9hZGVkTmFtZV0gPSB7CisgICAgICAgICAgZm9udEZhbWlseTogZm9udC5mYWxsYmFja05hbWUsCisgICAgICAgICAgYXNjZW50OiBmb250LmFzY2VudCwKKyAgICAgICAgICBkZXNjZW50OiBmb250LmRlc2NlbnQsCisgICAgICAgICAgdmVydGljYWw6IGZvbnQudmVydGljYWwKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgdGV4dENvbnRlbnRJdGVtLmZvbnROYW1lID0gZm9udC5sb2FkZWROYW1lOworICAgICAgdmFyIHRzbSA9IFt0ZXh0U3RhdGUuZm9udFNpemUgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCwgMCwgdGV4dFN0YXRlLmZvbnRTaXplLCAwLCB0ZXh0U3RhdGUudGV4dFJpc2VdOworCisgICAgICBpZiAoZm9udC5pc1R5cGUzRm9udCAmJiB0ZXh0U3RhdGUuZm9udFNpemUgPD0gMSAmJiAhKDAsIF91dGlsLmlzQXJyYXlFcXVhbCkodGV4dFN0YXRlLmZvbnRNYXRyaXgsIF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYKSkgeworICAgICAgICBjb25zdCBnbHlwaEhlaWdodCA9IGZvbnQuYmJveFszXSAtIGZvbnQuYmJveFsxXTsKKworICAgICAgICBpZiAoZ2x5cGhIZWlnaHQgPiAwKSB7CisgICAgICAgICAgdHNtWzNdICo9IGdseXBoSGVpZ2h0ICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbM107CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIHRybSA9IF91dGlsLlV0aWwudHJhbnNmb3JtKHRleHRTdGF0ZS5jdG0sIF91dGlsLlV0aWwudHJhbnNmb3JtKHRleHRTdGF0ZS50ZXh0TWF0cml4LCB0c20pKTsKKworICAgICAgdGV4dENvbnRlbnRJdGVtLnRyYW5zZm9ybSA9IHRybTsKKworICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CisgICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IDA7CisgICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgPSBNYXRoLnNxcnQodHJtWzJdICogdHJtWzJdICsgdHJtWzNdICogdHJtWzNdKTsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSBNYXRoLnNxcnQodHJtWzBdICogdHJtWzBdICsgdHJtWzFdICogdHJtWzFdKTsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IDA7CisgICAgICAgIHRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHZhciBhID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzBdOworICAgICAgdmFyIGIgPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMV07CisgICAgICB2YXIgc2NhbGVMaW5lWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTsKKyAgICAgIGEgPSB0ZXh0U3RhdGUuY3RtWzBdOworICAgICAgYiA9IHRleHRTdGF0ZS5jdG1bMV07CisgICAgICB2YXIgc2NhbGVDdG1YID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpOworICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUN0bVggKiBzY2FsZUxpbmVYOworICAgICAgdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGggPSAwOworICAgICAgdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlSGVpZ2h0ID0gMDsKKyAgICAgIHZhciBzcGFjZVdpZHRoID0gZm9udC5zcGFjZVdpZHRoIC8gMTAwMCAqIHRleHRTdGF0ZS5mb250U2l6ZTsKKworICAgICAgaWYgKHNwYWNlV2lkdGgpIHsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLnNwYWNlV2lkdGggPSBzcGFjZVdpZHRoOworICAgICAgICB0ZXh0Q29udGVudEl0ZW0uZmFrZVNwYWNlTWluID0gc3BhY2VXaWR0aCAqIFNQQUNFX0ZBQ1RPUjsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWluID0gc3BhY2VXaWR0aCAqIE1VTFRJX1NQQUNFX0ZBQ1RPUjsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4ID0gc3BhY2VXaWR0aCAqIE1VTFRJX1NQQUNFX0ZBQ1RPUl9NQVg7CisgICAgICAgIHRleHRDb250ZW50SXRlbS50ZXh0UnVuQnJlYWtBbGxvd2VkID0gIWZvbnQuaXNNb25vc3BhY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXh0Q29udGVudEl0ZW0uc3BhY2VXaWR0aCA9IDA7CisgICAgICAgIHRleHRDb250ZW50SXRlbS5mYWtlU3BhY2VNaW4gPSBJbmZpbml0eTsKKyAgICAgICAgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWluID0gSW5maW5pdHk7CisgICAgICAgIHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heCA9IDA7CisgICAgICAgIHRleHRDb250ZW50SXRlbS50ZXh0UnVuQnJlYWtBbGxvd2VkID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCA9IHRydWU7CisgICAgICByZXR1cm4gdGV4dENvbnRlbnRJdGVtOworICAgIH0KKworICAgIGZ1bmN0aW9uIHJlcGxhY2VXaGl0ZXNwYWNlKHN0cikgeworICAgICAgdmFyIGkgPSAwLAorICAgICAgICAgIGlpID0gc3RyLmxlbmd0aCwKKyAgICAgICAgICBjb2RlOworCisgICAgICB3aGlsZSAoaSA8IGlpICYmIChjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSkpID49IDB4MjAgJiYgY29kZSA8PSAweDdmKSB7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGkgPCBpaSA/IHN0ci5yZXBsYWNlKFdoaXRlc3BhY2VSZWdleHAsICIgIikgOiBzdHI7CisgICAgfQorCisgICAgZnVuY3Rpb24gcnVuQmlkaVRyYW5zZm9ybSh0ZXh0Q2h1bmspIHsKKyAgICAgIHZhciBzdHIgPSB0ZXh0Q2h1bmsuc3RyLmpvaW4oIiIpOworICAgICAgdmFyIGJpZGlSZXN1bHQgPSAoMCwgX2JpZGkuYmlkaSkoc3RyLCAtMSwgdGV4dENodW5rLnZlcnRpY2FsKTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHN0cjogbm9ybWFsaXplV2hpdGVzcGFjZSA/IHJlcGxhY2VXaGl0ZXNwYWNlKGJpZGlSZXN1bHQuc3RyKSA6IGJpZGlSZXN1bHQuc3RyLAorICAgICAgICBkaXI6IGJpZGlSZXN1bHQuZGlyLAorICAgICAgICB3aWR0aDogdGV4dENodW5rLndpZHRoLAorICAgICAgICBoZWlnaHQ6IHRleHRDaHVuay5oZWlnaHQsCisgICAgICAgIHRyYW5zZm9ybTogdGV4dENodW5rLnRyYW5zZm9ybSwKKyAgICAgICAgZm9udE5hbWU6IHRleHRDaHVuay5mb250TmFtZQorICAgICAgfTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBoYW5kbGVTZXRGb250KGZvbnROYW1lLCBmb250UmVmKSB7CisgICAgICByZXR1cm4gc2VsZi5sb2FkRm9udChmb250TmFtZSwgZm9udFJlZiwgcmVzb3VyY2VzKS50aGVuKGZ1bmN0aW9uICh0cmFuc2xhdGVkKSB7CisgICAgICAgIHRleHRTdGF0ZS5mb250ID0gdHJhbnNsYXRlZC5mb250OworICAgICAgICB0ZXh0U3RhdGUuZm9udE1hdHJpeCA9IHRyYW5zbGF0ZWQuZm9udC5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgfSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gYnVpbGRUZXh0Q29udGVudEl0ZW0oY2hhcnMpIHsKKyAgICAgIHZhciBmb250ID0gdGV4dFN0YXRlLmZvbnQ7CisgICAgICB2YXIgdGV4dENodW5rID0gZW5zdXJlVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICB2YXIgd2lkdGggPSAwOworICAgICAgdmFyIGhlaWdodCA9IDA7CisgICAgICB2YXIgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGNoYXJzKTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2ldOworICAgICAgICB2YXIgZ2x5cGhXaWR0aCA9IG51bGw7CisKKyAgICAgICAgaWYgKGZvbnQudmVydGljYWwgJiYgZ2x5cGgudm1ldHJpYykgeworICAgICAgICAgIGdseXBoV2lkdGggPSBnbHlwaC52bWV0cmljWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdseXBoV2lkdGggPSBnbHlwaC53aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBnbHlwaFVuaWNvZGUgPSBnbHlwaC51bmljb2RlOworICAgICAgICB2YXIgTm9ybWFsaXplZFVuaWNvZGVzID0gKDAsIF91bmljb2RlLmdldE5vcm1hbGl6ZWRVbmljb2RlcykoKTsKKworICAgICAgICBpZiAoTm9ybWFsaXplZFVuaWNvZGVzW2dseXBoVW5pY29kZV0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGdseXBoVW5pY29kZSA9IE5vcm1hbGl6ZWRVbmljb2Rlc1tnbHlwaFVuaWNvZGVdOworICAgICAgICB9CisKKyAgICAgICAgZ2x5cGhVbmljb2RlID0gKDAsIF91bmljb2RlLnJldmVyc2VJZlJ0bCkoZ2x5cGhVbmljb2RlKTsKKyAgICAgICAgdmFyIGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nOworCisgICAgICAgIGlmIChnbHlwaC5pc1NwYWNlKSB7CisgICAgICAgICAgdmFyIHdvcmRTcGFjaW5nID0gdGV4dFN0YXRlLndvcmRTcGFjaW5nOworICAgICAgICAgIGNoYXJTcGFjaW5nICs9IHdvcmRTcGFjaW5nOworCisgICAgICAgICAgaWYgKHdvcmRTcGFjaW5nID4gMCkgeworICAgICAgICAgICAgYWRkRmFrZVNwYWNlcyh3b3JkU3BhY2luZywgdGV4dENodW5rLnN0cik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIHR4ID0gMDsKKyAgICAgICAgdmFyIHR5ID0gMDsKKworICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKKyAgICAgICAgICB2YXIgdzAgPSBnbHlwaFdpZHRoICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF07CisgICAgICAgICAgdHggPSAodzAgKiB0ZXh0U3RhdGUuZm9udFNpemUgKyBjaGFyU3BhY2luZykgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZTsKKyAgICAgICAgICB3aWR0aCArPSB0eDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgdzEgPSBnbHlwaFdpZHRoICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF07CisgICAgICAgICAgdHkgPSB3MSAqIHRleHRTdGF0ZS5mb250U2l6ZSArIGNoYXJTcGFjaW5nOworICAgICAgICAgIGhlaWdodCArPSB0eTsKKyAgICAgICAgfQorCisgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHR4LCB0eSk7CisgICAgICAgIHRleHRDaHVuay5zdHIucHVzaChnbHlwaFVuaWNvZGUpOworICAgICAgfQorCisgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKKyAgICAgICAgdGV4dENodW5rLmxhc3RBZHZhbmNlV2lkdGggPSB3aWR0aDsKKyAgICAgICAgdGV4dENodW5rLndpZHRoICs9IHdpZHRoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dENodW5rLmxhc3RBZHZhbmNlSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB0ZXh0Q2h1bmsuaGVpZ2h0ICs9IE1hdGguYWJzKGhlaWdodCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0ZXh0Q2h1bms7CisgICAgfQorCisgICAgZnVuY3Rpb24gYWRkRmFrZVNwYWNlcyh3aWR0aCwgc3RyQnVmKSB7CisgICAgICBpZiAod2lkdGggPCB0ZXh0Q29udGVudEl0ZW0uZmFrZVNwYWNlTWluKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHdpZHRoIDwgdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWluKSB7CisgICAgICAgIHN0ckJ1Zi5wdXNoKCIgIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGZha2VTcGFjZXMgPSBNYXRoLnJvdW5kKHdpZHRoIC8gdGV4dENvbnRlbnRJdGVtLnNwYWNlV2lkdGgpOworCisgICAgICB3aGlsZSAoZmFrZVNwYWNlcy0tID4gMCkgeworICAgICAgICBzdHJCdWYucHVzaCgiICIpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGZsdXNoVGV4dENvbnRlbnRJdGVtKCkgeworICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoIXRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCkgeworICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKj0gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICo9IHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlOworICAgICAgfQorCisgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENvbnRlbnRJdGVtKSk7CisgICAgICB0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgIHRleHRDb250ZW50SXRlbS5zdHIubGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBlbnF1ZXVlQ2h1bmsoKSB7CisgICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7CisKKyAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgIHNpbmsuZW5xdWV1ZSh0ZXh0Q29udGVudCwgbGVuZ3RoKTsKKyAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMgPSBbXTsKKyAgICAgICAgdGV4dENvbnRlbnQuc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgdGltZVNsb3RNYW5hZ2VyID0gbmV3IFRpbWVTbG90TWFuYWdlcigpOworICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlQm9keShyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgeworICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKKyAgICAgICAgUHJvbWlzZS5hbGwoW3Byb21pc2UsIHNpbmsucmVhZHldKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KTsKKyAgICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgICAgcmVqZWN0KGV4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0sIHJlamVjdCk7CisgICAgICB9OworCisgICAgICB0YXNrLmVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKyAgICAgIHRpbWVTbG90TWFuYWdlci5yZXNldCgpOworICAgICAgdmFyIHN0b3AsCisgICAgICAgICAgb3BlcmF0aW9uID0ge30sCisgICAgICAgICAgYXJncyA9IFtdOworCisgICAgICB3aGlsZSAoIShzdG9wID0gdGltZVNsb3RNYW5hZ2VyLmNoZWNrKCkpKSB7CisgICAgICAgIGFyZ3MubGVuZ3RoID0gMDsKKyAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOworCisgICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdGV4dFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlOworICAgICAgICB2YXIgZm4gPSBvcGVyYXRpb24uZm47CisgICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKKyAgICAgICAgdmFyIGFkdmFuY2UsIGRpZmY7CisKKyAgICAgICAgc3dpdGNoIChmbiB8IDApIHsKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGb250OgorICAgICAgICAgICAgdmFyIGZvbnROYW1lQXJnID0gYXJnc1swXS5uYW1lLAorICAgICAgICAgICAgICAgIGZvbnRTaXplQXJnID0gYXJnc1sxXTsKKworICAgICAgICAgICAgaWYgKHRleHRTdGF0ZS5mb250ICYmIGZvbnROYW1lQXJnID09PSB0ZXh0U3RhdGUuZm9udE5hbWUgJiYgZm9udFNpemVBcmcgPT09IHRleHRTdGF0ZS5mb250U2l6ZSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IGZvbnROYW1lQXJnOworICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZm9udFNpemVBcmc7CisgICAgICAgICAgICBuZXh0KGhhbmRsZVNldEZvbnQoZm9udE5hbWVBcmcsIG51bGwpKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRSaXNlOgorICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0UmlzZSA9IGFyZ3NbMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEhTY2FsZToKKyAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICB0ZXh0U3RhdGUudGV4dEhTY2FsZSA9IGFyZ3NbMF0gLyAxMDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExlYWRpbmc6CisgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgdGV4dFN0YXRlLmxlYWRpbmcgPSBhcmdzWzBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5tb3ZlVGV4dDoKKyAgICAgICAgICAgIHZhciBpc1NhbWVUZXh0TGluZSA9ICF0ZXh0U3RhdGUuZm9udCA/IGZhbHNlIDogKHRleHRTdGF0ZS5mb250LnZlcnRpY2FsID8gYXJnc1swXSA6IGFyZ3NbMV0pID09PSAwOworICAgICAgICAgICAgYWR2YW5jZSA9IGFyZ3NbMF0gLSBhcmdzWzFdOworCisgICAgICAgICAgICBpZiAoY29tYmluZVRleHRJdGVtcyAmJiBpc1NhbWVUZXh0TGluZSAmJiB0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQgJiYgYWR2YW5jZSA+IDAgJiYgYWR2YW5jZSA8PSB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXgpIHsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gYXJnc1swXSAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZVdpZHRoOworICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICs9IGFyZ3NbMV0gLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VIZWlnaHQ7CisgICAgICAgICAgICAgIGRpZmYgPSBhcmdzWzBdIC0gdGV4dENvbnRlbnRJdGVtLmxhc3RBZHZhbmNlV2lkdGggLSAoYXJnc1sxXSAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZUhlaWdodCk7CisgICAgICAgICAgICAgIGFkZEZha2VTcGFjZXMoZGlmZiwgdGV4dENvbnRlbnRJdGVtLnN0cik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGVhZGluZ01vdmVUZXh0OgorICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS5sZWFkaW5nID0gLWFyZ3NbMV07CisgICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICB0ZXh0U3RhdGUudGV4dE1hdHJpeCA9IHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeC5zbGljZSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5uZXh0TGluZToKKyAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICB0ZXh0U3RhdGUuY2FycmlhZ2VSZXR1cm4oKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0VGV4dE1hdHJpeDoKKyAgICAgICAgICAgIGFkdmFuY2UgPSB0ZXh0U3RhdGUuY2FsY1RleHRMaW5lTWF0cml4QWR2YW5jZShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTsKKworICAgICAgICAgICAgaWYgKGNvbWJpbmVUZXh0SXRlbXMgJiYgYWR2YW5jZSAhPT0gbnVsbCAmJiB0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQgJiYgYWR2YW5jZS52YWx1ZSA+IDAgJiYgYWR2YW5jZS52YWx1ZSA8PSB0ZXh0Q29udGVudEl0ZW0uZmFrZU11bHRpU3BhY2VNYXgpIHsKKyAgICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFkdmFuY2Uud2lkdGgsIGFkdmFuY2UuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICs9IGFkdmFuY2Uud2lkdGggLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aDsKKyAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBhZHZhbmNlLmhlaWdodCAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZUhlaWdodDsKKyAgICAgICAgICAgICAgZGlmZiA9IGFkdmFuY2Uud2lkdGggLSB0ZXh0Q29udGVudEl0ZW0ubGFzdEFkdmFuY2VXaWR0aCAtIChhZHZhbmNlLmhlaWdodCAtIHRleHRDb250ZW50SXRlbS5sYXN0QWR2YW5jZUhlaWdodCk7CisgICAgICAgICAgICAgIGFkZEZha2VTcGFjZXMoZGlmZiwgdGV4dENvbnRlbnRJdGVtLnN0cik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgdGV4dFN0YXRlLnNldFRleHRNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7CisgICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldENoYXJTcGFjaW5nOgorICAgICAgICAgICAgdGV4dFN0YXRlLmNoYXJTcGFjaW5nID0gYXJnc1swXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0V29yZFNwYWNpbmc6CisgICAgICAgICAgICB0ZXh0U3RhdGUud29yZFNwYWNpbmcgPSBhcmdzWzBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpblRleHQ6CisgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVguc2xpY2UoKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWC5zbGljZSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93U3BhY2VkVGV4dDoKKyAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpdGVtcyA9IGFyZ3NbMF07CisgICAgICAgICAgICB2YXIgb2Zmc2V0OworCisgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBpdGVtcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbXNbal0gPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oaXRlbXNbal0pOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc051bSkoaXRlbXNbal0pKSB7CisgICAgICAgICAgICAgICAgZW5zdXJlVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGl0ZW1zW2pdICogdGV4dFN0YXRlLmZvbnRTaXplIC8gMTAwMDsKKyAgICAgICAgICAgICAgICB2YXIgYnJlYWtUZXh0UnVuID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAodGV4dFN0YXRlLmZvbnQudmVydGljYWwpIHsKKyAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGFkdmFuY2U7CisgICAgICAgICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgYnJlYWtUZXh0UnVuID0gdGV4dENvbnRlbnRJdGVtLnRleHRSdW5CcmVha0FsbG93ZWQgJiYgYWR2YW5jZSA+IHRleHRDb250ZW50SXRlbS5mYWtlTXVsdGlTcGFjZU1heDsKKworICAgICAgICAgICAgICAgICAgaWYgKCFicmVha1RleHRSdW4pIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSAtYWR2YW5jZTsKKyAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGFkdmFuY2UgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZTsKKyAgICAgICAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KG9mZnNldCwgMCk7CisgICAgICAgICAgICAgICAgICBicmVha1RleHRSdW4gPSB0ZXh0Q29udGVudEl0ZW0udGV4dFJ1bkJyZWFrQWxsb3dlZCAmJiBhZHZhbmNlID4gdGV4dENvbnRlbnRJdGVtLmZha2VNdWx0aVNwYWNlTWF4OworCisgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrVGV4dFJ1bikgeworICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChicmVha1RleHRSdW4pIHsKKyAgICAgICAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZHZhbmNlID4gMCkgeworICAgICAgICAgICAgICAgICAgYWRkRmFrZVNwYWNlcyhhZHZhbmNlLCB0ZXh0Q29udGVudEl0ZW0uc3RyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93VGV4dDoKKyAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKKyAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5uZXh0TGluZVNob3dUZXh0OgorICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOworICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OgorICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgeworICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKyAgICAgICAgICAgIHRleHRTdGF0ZS53b3JkU3BhY2luZyA9IGFyZ3NbMF07CisgICAgICAgICAgICB0ZXh0U3RhdGUuY2hhclNwYWNpbmcgPSBhcmdzWzFdOworICAgICAgICAgICAgdGV4dFN0YXRlLmNhcnJpYWdlUmV0dXJuKCk7CisgICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbShhcmdzWzJdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRYT2JqZWN0OgorICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKKworICAgICAgICAgICAgaWYgKCF4b2JqcykgeworICAgICAgICAgICAgICB4b2JqcyA9IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKKworICAgICAgICAgICAgaWYgKG5hbWUgJiYgZW1wdHlYT2JqZWN0Q2FjaGUuZ2V0QnlOYW1lKG5hbWUpKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0KG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlWE9iamVjdCwgcmVqZWN0WE9iamVjdCkgeworICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7CisKKyAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW1wdHlYT2JqZWN0Q2FjaGUuZ2V0QnlSZWYoeG9iaikpIHsKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeG9iaiA9IHhyZWYuZmV0Y2goeG9iaik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoeG9iaikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb25zdCB0eXBlID0geG9iai5kaWN0LmdldCgiU3VidHlwZSIpOworCisgICAgICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh0eXBlLm5hbWUgIT09ICJGb3JtIikgeworICAgICAgICAgICAgICAgIGVtcHR5WE9iamVjdENhY2hlLnNldChuYW1lLCB4b2JqLmRpY3Qub2JqSWQsIHRydWUpOworICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCk7CisgICAgICAgICAgICAgIGNvbnN0IHhPYmpTdGF0ZU1hbmFnZXIgPSBuZXcgU3RhdGVNYW5hZ2VyKGN1cnJlbnRTdGF0ZSk7CisgICAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IHhvYmouZGljdC5nZXRBcnJheSgiTWF0cml4Iik7CisKKyAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0cml4KSAmJiBtYXRyaXgubGVuZ3RoID09PSA2KSB7CisgICAgICAgICAgICAgICAgeE9ialN0YXRlTWFuYWdlci50cmFuc2Zvcm0obWF0cml4KTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVucXVldWVDaHVuaygpOworICAgICAgICAgICAgICBjb25zdCBzaW5rV3JhcHBlciA9IHsKKyAgICAgICAgICAgICAgICBlbnF1ZXVlSW52b2tlZDogZmFsc2UsCisKKyAgICAgICAgICAgICAgICBlbnF1ZXVlKGNodW5rLCBzaXplKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLmVucXVldWVJbnZva2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShjaHVuaywgc2l6ZSk7CisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIGdldCBkZXNpcmVkU2l6ZSgpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzaW5rLmRlc2lyZWRTaXplOworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBnZXQgcmVhZHkoKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgc2VsZi5nZXRUZXh0Q29udGVudCh7CisgICAgICAgICAgICAgICAgc3RyZWFtOiB4b2JqLAorICAgICAgICAgICAgICAgIHRhc2ssCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiB4b2JqLmRpY3QuZ2V0KCJSZXNvdXJjZXMiKSB8fCByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyOiB4T2JqU3RhdGVNYW5hZ2VyLAorICAgICAgICAgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UsCisgICAgICAgICAgICAgICAgY29tYmluZVRleHRJdGVtcywKKyAgICAgICAgICAgICAgICBzaW5rOiBzaW5rV3JhcHBlciwKKyAgICAgICAgICAgICAgICBzZWVuU3R5bGVzCisgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIGlmICghc2lua1dyYXBwZXIuZW5xdWV1ZUludm9rZWQpIHsKKyAgICAgICAgICAgICAgICAgIGVtcHR5WE9iamVjdENhY2hlLnNldChuYW1lLCB4b2JqLmRpY3Qub2JqSWQsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CisgICAgICAgICAgICAgIH0sIHJlamVjdFhPYmplY3QpOworICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBYT2JqZWN0OiAiJHtyZWFzb259Ii5gKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB0aHJvdyByZWFzb247CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRHU3RhdGU6CisgICAgICAgICAgICBuYW1lID0gYXJnc1swXS5uYW1lOworCisgICAgICAgICAgICBpZiAobmFtZSAmJiBlbXB0eUdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKSB7CisgICAgICAgICAgICAgIGlmICghbmFtZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IHJlc291cmNlcy5nZXQoIkV4dEdTdGF0ZSIpOworCisgICAgICAgICAgICAgIGlmICghKGV4dEdTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJFeHRHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CisKKyAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29uc3QgZ1N0YXRlRm9udCA9IGdTdGF0ZS5nZXQoIkZvbnQiKTsKKworICAgICAgICAgICAgICBpZiAoIWdTdGF0ZUZvbnQpIHsKKyAgICAgICAgICAgICAgICBlbXB0eUdTdGF0ZUNhY2hlLnNldChuYW1lLCBnU3RhdGUub2JqSWQsIHRydWUpOworICAgICAgICAgICAgICAgIHJlc29sdmVHU3RhdGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgICAgICAgICB0ZXh0U3RhdGUuZm9udE5hbWUgPSBudWxsOworICAgICAgICAgICAgICB0ZXh0U3RhdGUuZm9udFNpemUgPSBnU3RhdGVGb250WzFdOworICAgICAgICAgICAgICBoYW5kbGVTZXRGb250KG51bGwsIGdTdGF0ZUZvbnRbMF0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKKyAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtyZWFzb259Ii5gKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB0aHJvdyByZWFzb247CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoID49IHNpbmsuZGVzaXJlZFNpemUpIHsKKyAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc3RvcCkgeworICAgICAgICBuZXh0KGRlZmVycmVkKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOworICAgICAgZW5xdWV1ZUNodW5rKCk7CisgICAgICByZXNvbHZlKCk7CisgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICIke3Rhc2submFtZX0iIGAgKyBgdGFzazogIiR7cmVhc29ufSIuYCk7CisgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CisgICAgICAgIGVucXVldWVDaHVuaygpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRocm93IHJlYXNvbjsKKyAgICB9KTsKKyAgfQorCisgIGV4dHJhY3REYXRhU3RydWN0dXJlcyhkaWN0LCBiYXNlRGljdCwgcHJvcGVydGllcykgeworICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CisgICAgbGV0IGNpZFRvR2lkQnl0ZXM7CisgICAgdmFyIHRvVW5pY29kZSA9IGRpY3QuZ2V0KCJUb1VuaWNvZGUiKSB8fCBiYXNlRGljdC5nZXQoIlRvVW5pY29kZSIpOworICAgIHZhciB0b1VuaWNvZGVQcm9taXNlID0gdG9Vbmljb2RlID8gdGhpcy5yZWFkVG9Vbmljb2RlKHRvVW5pY29kZSkgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsKKworICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgeworICAgICAgdmFyIGNpZFN5c3RlbUluZm8gPSBkaWN0LmdldCgiQ0lEU3lzdGVtSW5mbyIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY2lkU3lzdGVtSW5mbykpIHsKKyAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvID0geworICAgICAgICAgIHJlZ2lzdHJ5OiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGNpZFN5c3RlbUluZm8uZ2V0KCJSZWdpc3RyeSIpKSwKKyAgICAgICAgICBvcmRlcmluZzogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShjaWRTeXN0ZW1JbmZvLmdldCgiT3JkZXJpbmciKSksCisgICAgICAgICAgc3VwcGxlbWVudDogY2lkU3lzdGVtSW5mby5nZXQoIlN1cHBsZW1lbnQiKQorICAgICAgICB9OworICAgICAgfQorCisgICAgICB2YXIgY2lkVG9HaWRNYXAgPSBkaWN0LmdldCgiQ0lEVG9HSURNYXAiKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoY2lkVG9HaWRNYXApKSB7CisgICAgICAgIGNpZFRvR2lkQnl0ZXMgPSBjaWRUb0dpZE1hcC5nZXRCeXRlcygpOworICAgICAgfQorICAgIH0KKworICAgIHZhciBkaWZmZXJlbmNlcyA9IFtdOworICAgIHZhciBiYXNlRW5jb2RpbmdOYW1lID0gbnVsbDsKKyAgICB2YXIgZW5jb2Rpbmc7CisKKyAgICBpZiAoZGljdC5oYXMoIkVuY29kaW5nIikpIHsKKyAgICAgIGVuY29kaW5nID0gZGljdC5nZXQoIkVuY29kaW5nIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShlbmNvZGluZykpIHsKKyAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IGVuY29kaW5nLmdldCgiQmFzZUVuY29kaW5nIik7CisgICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShiYXNlRW5jb2RpbmdOYW1lKSA/IGJhc2VFbmNvZGluZ05hbWUubmFtZSA6IG51bGw7CisKKyAgICAgICAgaWYgKGVuY29kaW5nLmhhcygiRGlmZmVyZW5jZXMiKSkgeworICAgICAgICAgIHZhciBkaWZmRW5jb2RpbmcgPSBlbmNvZGluZy5nZXQoIkRpZmZlcmVuY2VzIik7CisgICAgICAgICAgdmFyIGluZGV4ID0gMDsKKworICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGRpZmZFbmNvZGluZy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICB2YXIgZGF0YSA9IHhyZWYuZmV0Y2hJZlJlZihkaWZmRW5jb2Rpbmdbal0pOworCisgICAgICAgICAgICBpZiAoKDAsIF91dGlsLmlzTnVtKShkYXRhKSkgeworICAgICAgICAgICAgICBpbmRleCA9IGRhdGE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGRhdGEpKSB7CisgICAgICAgICAgICAgIGRpZmZlcmVuY2VzW2luZGV4KytdID0gZGF0YS5uYW1lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluICdEaWZmZXJlbmNlcycgYXJyYXk6ICR7ZGF0YX1gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZW5jb2RpbmcpKSB7CisgICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBlbmNvZGluZy5uYW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJFbmNvZGluZyBpcyBub3QgYSBOYW1lIG5vciBhIERpY3QiKTsKKyAgICAgIH0KKworICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgIT09ICJNYWNSb21hbkVuY29kaW5nIiAmJiBiYXNlRW5jb2RpbmdOYW1lICE9PSAiTWFjRXhwZXJ0RW5jb2RpbmciICYmIGJhc2VFbmNvZGluZ05hbWUgIT09ICJXaW5BbnNpRW5jb2RpbmciKSB7CisgICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIGlmIChiYXNlRW5jb2RpbmdOYW1lKSB7CisgICAgICBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShiYXNlRW5jb2RpbmdOYW1lKS5zbGljZSgpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgX2ZvbnRzLkZvbnRGbGFncy5TeW1ib2xpYyk7CisgICAgICB2YXIgaXNOb25zeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgX2ZvbnRzLkZvbnRGbGFncy5Ob25zeW1ib2xpYyk7CisgICAgICBlbmNvZGluZyA9IF9lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZzsKKworICAgICAgaWYgKHByb3BlcnRpZXMudHlwZSA9PT0gIlRydWVUeXBlIiAmJiAhaXNOb25zeW1ib2xpY0ZvbnQpIHsKKyAgICAgICAgZW5jb2RpbmcgPSBfZW5jb2RpbmdzLldpbkFuc2lFbmNvZGluZzsKKyAgICAgIH0KKworICAgICAgaWYgKGlzU3ltYm9saWNGb250KSB7CisgICAgICAgIGVuY29kaW5nID0gX2VuY29kaW5ncy5NYWNSb21hbkVuY29kaW5nOworCisgICAgICAgIGlmICghcHJvcGVydGllcy5maWxlKSB7CisgICAgICAgICAgaWYgKC9TeW1ib2wvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gX2VuY29kaW5ncy5TeW1ib2xTZXRFbmNvZGluZzsKKyAgICAgICAgICB9IGVsc2UgaWYgKC9EaW5nYmF0c3xXaW5nZGluZ3MvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gX2VuY29kaW5ncy5aYXBmRGluZ2JhdHNFbmNvZGluZzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICB9CisKKyAgICBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzID0gZGlmZmVyZW5jZXM7CisgICAgcHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID0gYmFzZUVuY29kaW5nTmFtZTsKKyAgICBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nID0gISFiYXNlRW5jb2RpbmdOYW1lIHx8IGRpZmZlcmVuY2VzLmxlbmd0aCA+IDA7CisgICAgcHJvcGVydGllcy5kaWN0ID0gZGljdDsKKyAgICByZXR1cm4gdG9Vbmljb2RlUHJvbWlzZS50aGVuKHJlYWRUb1VuaWNvZGUgPT4geworICAgICAgcHJvcGVydGllcy50b1VuaWNvZGUgPSByZWFkVG9Vbmljb2RlOworICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUb1VuaWNvZGUocHJvcGVydGllcyk7CisgICAgfSkudGhlbihidWlsdFRvVW5pY29kZSA9PiB7CisgICAgICBwcm9wZXJ0aWVzLnRvVW5pY29kZSA9IGJ1aWx0VG9Vbmljb2RlOworCisgICAgICBpZiAoY2lkVG9HaWRCeXRlcykgeworICAgICAgICBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwID0gdGhpcy5yZWFkQ2lkVG9HaWRNYXAoY2lkVG9HaWRCeXRlcywgYnVpbHRUb1VuaWNvZGUpOworICAgICAgfQorCisgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgICB9KTsKKyAgfQorCisgIF9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUocHJvcGVydGllcywgZm9yY2VHbHlwaHMgPSBmYWxzZSkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKCFwcm9wZXJ0aWVzLmNvbXBvc2l0ZSwgIk11c3QgYmUgYSBzaW1wbGUgZm9udC4iKTsKKyAgICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKKyAgICBjb25zdCBlbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nLnNsaWNlKCk7CisgICAgY29uc3QgYmFzZUVuY29kaW5nTmFtZSA9IHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZTsKKyAgICBjb25zdCBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CisKKyAgICBmb3IgKGNvbnN0IGNoYXJjb2RlIGluIGRpZmZlcmVuY2VzKSB7CisgICAgICBjb25zdCBnbHlwaE5hbWUgPSBkaWZmZXJlbmNlc1tjaGFyY29kZV07CisKKyAgICAgIGlmIChnbHlwaE5hbWUgPT09ICIubm90ZGVmIikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZW5jb2RpbmdbY2hhcmNvZGVdID0gZ2x5cGhOYW1lOworICAgIH0KKworICAgIGNvbnN0IGdseXBoc1VuaWNvZGVNYXAgPSAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOworCisgICAgZm9yIChjb25zdCBjaGFyY29kZSBpbiBlbmNvZGluZykgeworICAgICAgbGV0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJjb2RlXTsKKworICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIiIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGxldCBjb2RlID0gMDsKKworICAgICAgICBzd2l0Y2ggKGdseXBoTmFtZVswXSkgeworICAgICAgICAgIGNhc2UgIkciOgorICAgICAgICAgICAgaWYgKGdseXBoTmFtZS5sZW5ndGggPT09IDMpIHsKKyAgICAgICAgICAgICAgY29kZSA9IHBhcnNlSW50KGdseXBoTmFtZS5zdWJzdHJpbmcoMSksIDE2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJnIjoKKyAgICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSA1KSB7CisgICAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQyI6CisgICAgICAgICAgY2FzZSAiYyI6CisgICAgICAgICAgICBpZiAoZ2x5cGhOYW1lLmxlbmd0aCA+PSAzICYmIGdseXBoTmFtZS5sZW5ndGggPD0gNCkgeworICAgICAgICAgICAgICBjb25zdCBjb2RlU3RyID0gZ2x5cGhOYW1lLnN1YnN0cmluZygxKTsKKworICAgICAgICAgICAgICBpZiAoZm9yY2VHbHlwaHMpIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgMTYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29kZSA9ICtjb2RlU3RyOworCisgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oY29kZSkgJiYgTnVtYmVyLmlzSW50ZWdlcihwYXJzZUludChjb2RlU3RyLCAxNikpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2J1aWxkU2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzLCB0cnVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjb25zdCB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKKworICAgICAgICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CisgICAgICAgICAgICAgIGNvZGUgPSB1bmljb2RlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kZSA+IDAgJiYgY29kZSA8PSAweDEwZmZmZiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CisgICAgICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgY29kZSA9PT0gK2NoYXJjb2RlKSB7CisgICAgICAgICAgICBjb25zdCBiYXNlRW5jb2RpbmcgPSAoMCwgX2VuY29kaW5ncy5nZXRFbmNvZGluZykoYmFzZUVuY29kaW5nTmFtZSk7CisKKyAgICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmcgJiYgKGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyY29kZV0pKSB7CisgICAgICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZShnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV0pOworICAgIH0KKworICAgIHJldHVybiBuZXcgX2ZvbnRzLlRvVW5pY29kZU1hcCh0b1VuaWNvZGUpOworICB9CisKKyAgYnVpbGRUb1VuaWNvZGUocHJvcGVydGllcykgeworICAgIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgPSAhIXByb3BlcnRpZXMudG9Vbmljb2RlICYmIHByb3BlcnRpZXMudG9Vbmljb2RlLmxlbmd0aCA+IDA7CisKKyAgICBpZiAocHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCkgeworICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAmJiBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CisgICAgICAgIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUgPSB0aGlzLl9idWlsZFNpbXBsZUZvbnRUb1VuaWNvZGUocHJvcGVydGllcyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHJvcGVydGllcy50b1VuaWNvZGUpOworICAgIH0KKworICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYnVpbGRTaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMpKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUgJiYgKHByb3BlcnRpZXMuY01hcC5idWlsdEluQ01hcCAmJiAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIF9jbWFwLklkZW50aXR5Q01hcCkgfHwgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLnJlZ2lzdHJ5ID09PSAiQWRvYmUiICYmIChwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJHQjEiIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIkNOUzEiIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIkphcGFuMSIgfHwgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiS29yZWExIikpKSB7CisgICAgICBjb25zdCByZWdpc3RyeSA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5yZWdpc3RyeTsKKyAgICAgIGNvbnN0IG9yZGVyaW5nID0gcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nOworCisgICAgICBjb25zdCB1Y3MyQ01hcE5hbWUgPSBfcHJpbWl0aXZlcy5OYW1lLmdldChyZWdpc3RyeSArICItIiArIG9yZGVyaW5nICsgIi1VQ1MyIik7CisKKyAgICAgIHJldHVybiBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgICBlbmNvZGluZzogdWNzMkNNYXBOYW1lLAorICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCisgICAgICAgIHVzZUNNYXA6IG51bGwKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVjczJDTWFwKSB7CisgICAgICAgIGNvbnN0IGNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7CisgICAgICAgIGNvbnN0IHRvVW5pY29kZSA9IFtdOworICAgICAgICBjTWFwLmZvckVhY2goZnVuY3Rpb24gKGNoYXJjb2RlLCBjaWQpIHsKKyAgICAgICAgICBpZiAoY2lkID4gMHhmZmZmKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzUiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCB1Y3MyID0gdWNzMkNNYXAubG9va3VwKGNpZCk7CisKKyAgICAgICAgICBpZiAodWNzMikgeworICAgICAgICAgICAgdG9Vbmljb2RlW2NoYXJjb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHVjczIuY2hhckNvZGVBdCgwKSA8PCA4KSArIHVjczIuY2hhckNvZGVBdCgxKSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG5ldyBfZm9udHMuVG9Vbmljb2RlTWFwKHRvVW5pY29kZSk7CisgICAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBfZm9udHMuSWRlbnRpdHlUb1VuaWNvZGVNYXAocHJvcGVydGllcy5maXJzdENoYXIsIHByb3BlcnRpZXMubGFzdENoYXIpKTsKKyAgfQorCisgIHJlYWRUb1VuaWNvZGUodG9Vbmljb2RlKSB7CisgICAgdmFyIGNtYXBPYmogPSB0b1VuaWNvZGU7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoY21hcE9iaikpIHsKKyAgICAgIHJldHVybiBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgICBlbmNvZGluZzogY21hcE9iaiwKKyAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAorICAgICAgICB1c2VDTWFwOiBudWxsCisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICAgIGlmIChjbWFwIGluc3RhbmNlb2YgX2NtYXAuSWRlbnRpdHlDTWFwKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBfZm9udHMuSWRlbnRpdHlUb1VuaWNvZGVNYXAoMCwgMHhmZmZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgX2ZvbnRzLlRvVW5pY29kZU1hcChjbWFwLmdldE1hcCgpKTsKKyAgICAgIH0pOworICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShjbWFwT2JqKSkgeworICAgICAgcmV0dXJuIF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CisgICAgICAgIGVuY29kaW5nOiBjbWFwT2JqLAorICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCisgICAgICAgIHVzZUNNYXA6IG51bGwKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNtYXApIHsKKyAgICAgICAgaWYgKGNtYXAgaW5zdGFuY2VvZiBfY21hcC5JZGVudGl0eUNNYXApIHsKKyAgICAgICAgICByZXR1cm4gbmV3IF9mb250cy5JZGVudGl0eVRvVW5pY29kZU1hcCgwLCAweGZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG1hcCA9IG5ldyBBcnJheShjbWFwLmxlbmd0aCk7CisgICAgICAgIGNtYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHRva2VuKSB7CisgICAgICAgICAgdmFyIHN0ciA9IFtdOworCisgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0b2tlbi5sZW5ndGg7IGsgKz0gMikgeworICAgICAgICAgICAgdmFyIHcxID0gdG9rZW4uY2hhckNvZGVBdChrKSA8PCA4IHwgdG9rZW4uY2hhckNvZGVBdChrICsgMSk7CisKKyAgICAgICAgICAgIGlmICgodzEgJiAweGY4MDApICE9PSAweGQ4MDApIHsKKyAgICAgICAgICAgICAgc3RyLnB1c2godzEpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgayArPSAyOworICAgICAgICAgICAgdmFyIHcyID0gdG9rZW4uY2hhckNvZGVBdChrKSA8PCA4IHwgdG9rZW4uY2hhckNvZGVBdChrICsgMSk7CisgICAgICAgICAgICBzdHIucHVzaCgoKHcxICYgMHgzZmYpIDw8IDEwKSArICh3MiAmIDB4M2ZmKSArIDB4MTAwMDApOworICAgICAgICAgIH0KKworICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIHN0cik7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gbmV3IF9mb250cy5Ub1VuaWNvZGVNYXAobWFwKTsKKyAgICAgIH0sIHJlYXNvbiA9PiB7CisgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgICB0aGlzLmhhbmRsZXIuc2VuZCgiVW5zdXBwb3J0ZWRGZWF0dXJlIiwgeworICAgICAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5lcnJvckZvbnRUb1VuaWNvZGUKKyAgICAgICAgICB9KTsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoYHJlYWRUb1VuaWNvZGUgLSBpZ25vcmluZyBUb1VuaWNvZGUgZGF0YTogIiR7cmVhc29ufSIuYCk7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyByZWFzb247CisgICAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOworICB9CisKKyAgcmVhZENpZFRvR2lkTWFwKGdseXBoc0RhdGEsIHRvVW5pY29kZSkgeworICAgIHZhciByZXN1bHQgPSBbXTsKKworICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGdseXBoc0RhdGEubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgdmFyIGdseXBoSUQgPSBnbHlwaHNEYXRhW2orK10gPDwgOCB8IGdseXBoc0RhdGFbal07CisgICAgICBjb25zdCBjb2RlID0gaiA+PiAxOworCisgICAgICBpZiAoZ2x5cGhJRCA9PT0gMCAmJiAhdG9Vbmljb2RlLmhhcyhjb2RlKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcmVzdWx0W2NvZGVdID0gZ2x5cGhJRDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgZXh0cmFjdFdpZHRocyhkaWN0LCBkZXNjcmlwdG9yLCBwcm9wZXJ0aWVzKSB7CisgICAgdmFyIHhyZWYgPSB0aGlzLnhyZWY7CisgICAgdmFyIGdseXBoc1dpZHRocyA9IFtdOworICAgIHZhciBkZWZhdWx0V2lkdGggPSAwOworICAgIHZhciBnbHlwaHNWTWV0cmljcyA9IFtdOworICAgIHZhciBkZWZhdWx0Vk1ldHJpY3M7CisgICAgdmFyIGksIGlpLCBqLCBqaiwgc3RhcnQsIGNvZGUsIHdpZHRoczsKKworICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgeworICAgICAgZGVmYXVsdFdpZHRoID0gZGljdC5oYXMoIkRXIikgPyBkaWN0LmdldCgiRFciKSA6IDEwMDA7CisgICAgICB3aWR0aHMgPSBkaWN0LmdldCgiVyIpOworCisgICAgICBpZiAod2lkdGhzKSB7CisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBzdGFydCA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaSsrXSk7CisgICAgICAgICAgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaV0pOworCisgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29kZSkpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICAgIGdseXBoc1dpZHRoc1tzdGFydCsrXSA9IHhyZWYuZmV0Y2hJZlJlZihjb2RlW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFyIHdpZHRoID0geHJlZi5mZXRjaElmUmVmKHdpZHRoc1srK2ldKTsKKworICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7CisgICAgICAgICAgICAgIGdseXBoc1dpZHRoc1tqXSA9IHdpZHRoOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocHJvcGVydGllcy52ZXJ0aWNhbCkgeworICAgICAgICB2YXIgdm1ldHJpY3MgPSBkaWN0LmdldEFycmF5KCJEVzIiKSB8fCBbODgwLCAtMTAwMF07CisgICAgICAgIGRlZmF1bHRWTWV0cmljcyA9IFt2bWV0cmljc1sxXSwgZGVmYXVsdFdpZHRoICogMC41LCB2bWV0cmljc1swXV07CisgICAgICAgIHZtZXRyaWNzID0gZGljdC5nZXQoIlcyIik7CisKKyAgICAgICAgaWYgKHZtZXRyaWNzKSB7CisgICAgICAgICAgZm9yIChpID0gMCwgaWkgPSB2bWV0cmljcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICBzdGFydCA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpKytdKTsKKyAgICAgICAgICAgIGNvZGUgPSB4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbaV0pOworCisgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2RlKSkgeworICAgICAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvZGUubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW3N0YXJ0KytdID0gW3hyZWYuZmV0Y2hJZlJlZihjb2RlW2orK10pLCB4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSwgeHJlZi5mZXRjaElmUmVmKGNvZGVbal0pXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdmFyIHZtZXRyaWMgPSBbeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pLCB4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSksIHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKV07CisKKyAgICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7CisgICAgICAgICAgICAgICAgZ2x5cGhzVk1ldHJpY3Nbal0gPSB2bWV0cmljOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBmaXJzdENoYXIgPSBwcm9wZXJ0aWVzLmZpcnN0Q2hhcjsKKyAgICAgIHdpZHRocyA9IGRpY3QuZ2V0KCJXaWR0aHMiKTsKKworICAgICAgaWYgKHdpZHRocykgeworICAgICAgICBqID0gZmlyc3RDaGFyOworCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBnbHlwaHNXaWR0aHNbaisrXSA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdFdpZHRoID0gcGFyc2VGbG9hdChkZXNjcmlwdG9yLmdldCgiTWlzc2luZ1dpZHRoIikpIHx8IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGJhc2VGb250TmFtZSkpIHsKKyAgICAgICAgICB2YXIgbWV0cmljcyA9IHRoaXMuZ2V0QmFzZUZvbnRNZXRyaWNzKGJhc2VGb250TmFtZS5uYW1lKTsKKyAgICAgICAgICBnbHlwaHNXaWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICBkZWZhdWx0V2lkdGggPSBtZXRyaWNzLmRlZmF1bHRXaWR0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZhciBpc01vbm9zcGFjZSA9IHRydWU7CisgICAgdmFyIGZpcnN0V2lkdGggPSBkZWZhdWx0V2lkdGg7CisKKyAgICBmb3IgKHZhciBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKKyAgICAgIHZhciBnbHlwaFdpZHRoID0gZ2x5cGhzV2lkdGhzW2dseXBoXTsKKworICAgICAgaWYgKCFnbHlwaFdpZHRoKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoIWZpcnN0V2lkdGgpIHsKKyAgICAgICAgZmlyc3RXaWR0aCA9IGdseXBoV2lkdGg7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoZmlyc3RXaWR0aCAhPT0gZ2x5cGhXaWR0aCkgeworICAgICAgICBpc01vbm9zcGFjZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNNb25vc3BhY2UpIHsKKyAgICAgIHByb3BlcnRpZXMuZmxhZ3MgfD0gX2ZvbnRzLkZvbnRGbGFncy5GaXhlZFBpdGNoOworICAgIH0KKworICAgIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoOworICAgIHByb3BlcnRpZXMud2lkdGhzID0gZ2x5cGhzV2lkdGhzOworICAgIHByb3BlcnRpZXMuZGVmYXVsdFZNZXRyaWNzID0gZGVmYXVsdFZNZXRyaWNzOworICAgIHByb3BlcnRpZXMudm1ldHJpY3MgPSBnbHlwaHNWTWV0cmljczsKKyAgfQorCisgIGlzU2VyaWZGb250KGJhc2VGb250TmFtZSkgeworICAgIHZhciBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoIi0iKVswXTsKKyAgICByZXR1cm4gZm9udE5hbWVXb1N0eWxlIGluICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0U2VyaWZGb250cykoKSB8fCBmb250TmFtZVdvU3R5bGUuc2VhcmNoKC9zZXJpZi9naSkgIT09IC0xOworICB9CisKKyAgZ2V0QmFzZUZvbnRNZXRyaWNzKG5hbWUpIHsKKyAgICB2YXIgZGVmYXVsdFdpZHRoID0gMDsKKyAgICB2YXIgd2lkdGhzID0gW107CisgICAgdmFyIG1vbm9zcGFjZSA9IGZhbHNlOworICAgIHZhciBzdGRGb250TWFwID0gKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTdGRGb250TWFwKSgpOworICAgIHZhciBsb29rdXBOYW1lID0gc3RkRm9udE1hcFtuYW1lXSB8fCBuYW1lOworICAgIHZhciBNZXRyaWNzID0gKDAsIF9tZXRyaWNzLmdldE1ldHJpY3MpKCk7CisKKyAgICBpZiAoIShsb29rdXBOYW1lIGluIE1ldHJpY3MpKSB7CisgICAgICBpZiAodGhpcy5pc1NlcmlmRm9udChuYW1lKSkgeworICAgICAgICBsb29rdXBOYW1lID0gIlRpbWVzLVJvbWFuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvb2t1cE5hbWUgPSAiSGVsdmV0aWNhIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgZ2x5cGhXaWR0aHMgPSBNZXRyaWNzW2xvb2t1cE5hbWVdOworCisgICAgaWYgKCgwLCBfdXRpbC5pc051bSkoZ2x5cGhXaWR0aHMpKSB7CisgICAgICBkZWZhdWx0V2lkdGggPSBnbHlwaFdpZHRoczsKKyAgICAgIG1vbm9zcGFjZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHdpZHRocyA9IGdseXBoV2lkdGhzKCk7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGRlZmF1bHRXaWR0aCwKKyAgICAgIG1vbm9zcGFjZSwKKyAgICAgIHdpZHRocworICAgIH07CisgIH0KKworICBidWlsZENoYXJDb2RlVG9XaWR0aCh3aWR0aHNCeUdseXBoTmFtZSwgcHJvcGVydGllcykgeworICAgIHZhciB3aWR0aHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHZhciBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CisgICAgdmFyIGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7CisKKyAgICBmb3IgKHZhciBjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7CisgICAgICBpZiAoY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMgJiYgd2lkdGhzQnlHbHlwaE5hbWVbZGlmZmVyZW5jZXNbY2hhckNvZGVdXSkgeworICAgICAgICB3aWR0aHNbY2hhckNvZGVdID0gd2lkdGhzQnlHbHlwaE5hbWVbZGlmZmVyZW5jZXNbY2hhckNvZGVdXTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjaGFyQ29kZSBpbiBlbmNvZGluZyAmJiB3aWR0aHNCeUdseXBoTmFtZVtlbmNvZGluZ1tjaGFyQ29kZV1dKSB7CisgICAgICAgIHdpZHRoc1tjaGFyQ29kZV0gPSB3aWR0aHNCeUdseXBoTmFtZVtlbmNvZGluZ1tjaGFyQ29kZV1dOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2lkdGhzOworICB9CisKKyAgcHJlRXZhbHVhdGVGb250KGRpY3QpIHsKKyAgICB2YXIgYmFzZURpY3QgPSBkaWN0OworICAgIHZhciB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSkpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBmb250IFN1YnR5cGUiKTsKKyAgICB9CisKKyAgICB2YXIgY29tcG9zaXRlID0gZmFsc2U7CisgICAgdmFyIHVpbnQ4YXJyYXk7CisKKyAgICBpZiAodHlwZS5uYW1lID09PSAiVHlwZTAiKSB7CisgICAgICB2YXIgZGYgPSBkaWN0LmdldCgiRGVzY2VuZGFudEZvbnRzIik7CisKKyAgICAgIGlmICghZGYpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnRzIGFyZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICB9CisKKyAgICAgIGRpY3QgPSBBcnJheS5pc0FycmF5KGRmKSA/IHRoaXMueHJlZi5mZXRjaElmUmVmKGRmWzBdKSA6IGRmOworICAgICAgdHlwZSA9IGRpY3QuZ2V0KCJTdWJ0eXBlIik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpOworICAgICAgfQorCisgICAgICBjb21wb3NpdGUgPSB0cnVlOworICAgIH0KKworICAgIHZhciBkZXNjcmlwdG9yID0gZGljdC5nZXQoIkZvbnREZXNjcmlwdG9yIik7CisKKyAgICBpZiAoZGVzY3JpcHRvcikgeworICAgICAgdmFyIGhhc2ggPSBuZXcgX211cm11cmhhc2guTXVybXVySGFzaDNfNjQoKTsKKyAgICAgIHZhciBlbmNvZGluZyA9IGJhc2VEaWN0LmdldFJhdygiRW5jb2RpbmciKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGVuY29kaW5nKSkgeworICAgICAgICBoYXNoLnVwZGF0ZShlbmNvZGluZy5uYW1lKTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKShlbmNvZGluZykpIHsKKyAgICAgICAgaGFzaC51cGRhdGUoZW5jb2RpbmcudG9TdHJpbmcoKSk7CisgICAgICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGVuY29kaW5nKSkgeworICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVuY29kaW5nLmdldFJhd1ZhbHVlcygpKSB7CisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGVudHJ5KSkgeworICAgICAgICAgICAgaGFzaC51cGRhdGUoZW50cnkubmFtZSk7CisgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGVudHJ5KSkgeworICAgICAgICAgICAgaGFzaC51cGRhdGUoZW50cnkudG9TdHJpbmcoKSk7CisgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkgeworICAgICAgICAgICAgdmFyIGRpZmZMZW5ndGggPSBlbnRyeS5sZW5ndGgsCisgICAgICAgICAgICAgICAgZGlmZkJ1ZiA9IG5ldyBBcnJheShkaWZmTGVuZ3RoKTsKKworICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkaWZmTGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgdmFyIGRpZmZFbnRyeSA9IGVudHJ5W2pdOworCisgICAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShkaWZmRW50cnkpKSB7CisgICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS5uYW1lOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc051bSkoZGlmZkVudHJ5KSB8fCAoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGRpZmZFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBkaWZmQnVmW2pdID0gZGlmZkVudHJ5LnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFzaC51cGRhdGUoZGlmZkJ1Zi5qb2luKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb25zdCBmaXJzdENoYXIgPSBkaWN0LmdldCgiRmlyc3RDaGFyIikgfHwgMDsKKyAgICAgIGNvbnN0IGxhc3RDaGFyID0gZGljdC5nZXQoIkxhc3RDaGFyIikgfHwgKGNvbXBvc2l0ZSA/IDB4ZmZmZiA6IDB4ZmYpOworICAgICAgaGFzaC51cGRhdGUoYCR7Zmlyc3RDaGFyfS0ke2xhc3RDaGFyfWApOworICAgICAgdmFyIHRvVW5pY29kZSA9IGRpY3QuZ2V0KCJUb1VuaWNvZGUiKSB8fCBiYXNlRGljdC5nZXQoIlRvVW5pY29kZSIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh0b1VuaWNvZGUpKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTsKKyAgICAgICAgdWludDhhcnJheSA9IHN0cmVhbS5idWZmZXIgPyBuZXcgVWludDhBcnJheShzdHJlYW0uYnVmZmVyLmJ1ZmZlciwgMCwgc3RyZWFtLmJ1ZmZlckxlbmd0aCkgOiBuZXcgVWludDhBcnJheShzdHJlYW0uYnl0ZXMuYnVmZmVyLCBzdHJlYW0uc3RhcnQsIHN0cmVhbS5lbmQgLSBzdHJlYW0uc3RhcnQpOworICAgICAgICBoYXNoLnVwZGF0ZSh1aW50OGFycmF5KTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodG9Vbmljb2RlKSkgeworICAgICAgICBoYXNoLnVwZGF0ZSh0b1VuaWNvZGUubmFtZSk7CisgICAgICB9CisKKyAgICAgIHZhciB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIikgfHwgYmFzZURpY3QuZ2V0KCJXaWR0aHMiKTsKKworICAgICAgaWYgKHdpZHRocykgeworICAgICAgICB1aW50OGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQzMkFycmF5KHdpZHRocykuYnVmZmVyKTsKKyAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGRlc2NyaXB0b3IsCisgICAgICBkaWN0LAorICAgICAgYmFzZURpY3QsCisgICAgICBjb21wb3NpdGUsCisgICAgICB0eXBlOiB0eXBlLm5hbWUsCisgICAgICBoYXNoOiBoYXNoID8gaGFzaC5oZXhkaWdlc3QoKSA6ICIiCisgICAgfTsKKyAgfQorCisgIHRyYW5zbGF0ZUZvbnQocHJlRXZhbHVhdGVkRm9udCkgeworICAgIHZhciBiYXNlRGljdCA9IHByZUV2YWx1YXRlZEZvbnQuYmFzZURpY3Q7CisgICAgdmFyIGRpY3QgPSBwcmVFdmFsdWF0ZWRGb250LmRpY3Q7CisgICAgdmFyIGNvbXBvc2l0ZSA9IHByZUV2YWx1YXRlZEZvbnQuY29tcG9zaXRlOworICAgIHZhciBkZXNjcmlwdG9yID0gcHJlRXZhbHVhdGVkRm9udC5kZXNjcmlwdG9yOworICAgIHZhciB0eXBlID0gcHJlRXZhbHVhdGVkRm9udC50eXBlOworICAgIHZhciBtYXhDaGFySW5kZXggPSBjb21wb3NpdGUgPyAweGZmZmYgOiAweGZmOworICAgIHZhciBwcm9wZXJ0aWVzOworICAgIGNvbnN0IGZpcnN0Q2hhciA9IGRpY3QuZ2V0KCJGaXJzdENoYXIiKSB8fCAwOworICAgIGNvbnN0IGxhc3RDaGFyID0gZGljdC5nZXQoIkxhc3RDaGFyIikgfHwgbWF4Q2hhckluZGV4OworCisgICAgaWYgKCFkZXNjcmlwdG9yKSB7CisgICAgICBpZiAodHlwZSA9PT0gIlR5cGUzIikgeworICAgICAgICBkZXNjcmlwdG9yID0gbmV3IF9wcmltaXRpdmVzLkRpY3QobnVsbCk7CisgICAgICAgIGRlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KHR5cGUpKTsKKyAgICAgICAgZGVzY3JpcHRvci5zZXQoIkZvbnRCQm94IiwgZGljdC5nZXRBcnJheSgiRm9udEJCb3giKSB8fCBbMCwgMCwgMCwgMF0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGJhc2VGb250TmFtZSA9IGRpY3QuZ2V0KCJCYXNlRm9udCIpOworCisgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoYmFzZUZvbnROYW1lKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFzZSBmb250IGlzIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGJhc2VGb250TmFtZSA9IGJhc2VGb250TmFtZS5uYW1lLnJlcGxhY2UoL1ssX10vZywgIi0iKTsKKyAgICAgICAgdmFyIG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUpOworICAgICAgICB2YXIgZm9udE5hbWVXb1N0eWxlID0gYmFzZUZvbnROYW1lLnNwbGl0KCItIilbMF07CisgICAgICAgIHZhciBmbGFncyA9ICh0aGlzLmlzU2VyaWZGb250KGZvbnROYW1lV29TdHlsZSkgPyBfZm9udHMuRm9udEZsYWdzLlNlcmlmIDogMCkgfCAobWV0cmljcy5tb25vc3BhY2UgPyBfZm9udHMuRm9udEZsYWdzLkZpeGVkUGl0Y2ggOiAwKSB8ICgoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN5bWJvbHNGb250cykoKVtmb250TmFtZVdvU3R5bGVdID8gX2ZvbnRzLkZvbnRGbGFncy5TeW1ib2xpYyA6IF9mb250cy5Gb250RmxhZ3MuTm9uc3ltYm9saWMpOworICAgICAgICBwcm9wZXJ0aWVzID0geworICAgICAgICAgIHR5cGUsCisgICAgICAgICAgbmFtZTogYmFzZUZvbnROYW1lLAorICAgICAgICAgIHdpZHRoczogbWV0cmljcy53aWR0aHMsCisgICAgICAgICAgZGVmYXVsdFdpZHRoOiBtZXRyaWNzLmRlZmF1bHRXaWR0aCwKKyAgICAgICAgICBmbGFncywKKyAgICAgICAgICBmaXJzdENoYXIsCisgICAgICAgICAgbGFzdENoYXIKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgd2lkdGhzID0gZGljdC5nZXQoIldpZHRocyIpOworICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgZGljdCwgcHJvcGVydGllcykudGhlbihuZXdQcm9wZXJ0aWVzID0+IHsKKyAgICAgICAgICBpZiAod2lkdGhzKSB7CisgICAgICAgICAgICBjb25zdCBnbHlwaFdpZHRocyA9IFtdOworICAgICAgICAgICAgbGV0IGogPSBmaXJzdENoYXI7CisKKyAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICAgIGdseXBoV2lkdGhzW2orK10gPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLndpZHRocyA9IGdseXBoV2lkdGhzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLndpZHRocyA9IHRoaXMuYnVpbGRDaGFyQ29kZVRvV2lkdGgobWV0cmljcy53aWR0aHMsIG5ld1Byb3BlcnRpZXMpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBuZXcgX2ZvbnRzLkZvbnQoYmFzZUZvbnROYW1lLCBudWxsLCBuZXdQcm9wZXJ0aWVzKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGZvbnROYW1lID0gZGVzY3JpcHRvci5nZXQoIkZvbnROYW1lIik7CisgICAgdmFyIGJhc2VGb250ID0gZGljdC5nZXQoIkJhc2VGb250Iik7CisKKyAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShmb250TmFtZSkpIHsKKyAgICAgIGZvbnROYW1lID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoZm9udE5hbWUpOworICAgIH0KKworICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKGJhc2VGb250KSkgeworICAgICAgYmFzZUZvbnQgPSBfcHJpbWl0aXZlcy5OYW1lLmdldChiYXNlRm9udCk7CisgICAgfQorCisgICAgaWYgKHR5cGUgIT09ICJUeXBlMyIpIHsKKyAgICAgIHZhciBmb250TmFtZVN0ciA9IGZvbnROYW1lICYmIGZvbnROYW1lLm5hbWU7CisgICAgICB2YXIgYmFzZUZvbnRTdHIgPSBiYXNlRm9udCAmJiBiYXNlRm9udC5uYW1lOworCisgICAgICBpZiAoZm9udE5hbWVTdHIgIT09IGJhc2VGb250U3RyKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKShgVGhlIEZvbnREZXNjcmlwdG9yXCdzIEZvbnROYW1lIGlzICIke2ZvbnROYW1lU3RyfSIgYnV0IGAgKyBgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250XCdzIEJhc2VGb250ICIke2Jhc2VGb250U3RyfSIuYCk7CisKKyAgICAgICAgaWYgKGZvbnROYW1lU3RyICYmIGJhc2VGb250U3RyICYmIGJhc2VGb250U3RyLnN0YXJ0c1dpdGgoZm9udE5hbWVTdHIpKSB7CisgICAgICAgICAgZm9udE5hbWUgPSBiYXNlRm9udDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGZvbnROYW1lID0gZm9udE5hbWUgfHwgYmFzZUZvbnQ7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZvbnROYW1lKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgbmFtZSIpOworICAgIH0KKworICAgIHZhciBmb250RmlsZSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250RmlsZSIsICJGb250RmlsZTIiLCAiRm9udEZpbGUzIik7CisKKyAgICBpZiAoZm9udEZpbGUpIHsKKyAgICAgIGlmIChmb250RmlsZS5kaWN0KSB7CisgICAgICAgIHZhciBzdWJ0eXBlID0gZm9udEZpbGUuZGljdC5nZXQoIlN1YnR5cGUiKTsKKworICAgICAgICBpZiAoc3VidHlwZSkgeworICAgICAgICAgIHN1YnR5cGUgPSBzdWJ0eXBlLm5hbWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbGVuZ3RoMSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgxIik7CisgICAgICAgIHZhciBsZW5ndGgyID0gZm9udEZpbGUuZGljdC5nZXQoIkxlbmd0aDIiKTsKKyAgICAgICAgdmFyIGxlbmd0aDMgPSBmb250RmlsZS5kaWN0LmdldCgiTGVuZ3RoMyIpOworICAgICAgfQorICAgIH0KKworICAgIHByb3BlcnRpZXMgPSB7CisgICAgICB0eXBlLAorICAgICAgbmFtZTogZm9udE5hbWUubmFtZSwKKyAgICAgIHN1YnR5cGUsCisgICAgICBmaWxlOiBmb250RmlsZSwKKyAgICAgIGxlbmd0aDEsCisgICAgICBsZW5ndGgyLAorICAgICAgbGVuZ3RoMywKKyAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCisgICAgICBjb21wb3NpdGUsCisgICAgICBmaXhlZFBpdGNoOiBmYWxzZSwKKyAgICAgIGZvbnRNYXRyaXg6IGRpY3QuZ2V0QXJyYXkoIkZvbnRNYXRyaXgiKSB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWCwKKyAgICAgIGZpcnN0Q2hhcjogZmlyc3RDaGFyIHx8IDAsCisgICAgICBsYXN0Q2hhcjogbGFzdENoYXIgfHwgbWF4Q2hhckluZGV4LAorICAgICAgYmJveDogZGVzY3JpcHRvci5nZXRBcnJheSgiRm9udEJCb3giKSwKKyAgICAgIGFzY2VudDogZGVzY3JpcHRvci5nZXQoIkFzY2VudCIpLAorICAgICAgZGVzY2VudDogZGVzY3JpcHRvci5nZXQoIkRlc2NlbnQiKSwKKyAgICAgIHhIZWlnaHQ6IGRlc2NyaXB0b3IuZ2V0KCJYSGVpZ2h0IiksCisgICAgICBjYXBIZWlnaHQ6IGRlc2NyaXB0b3IuZ2V0KCJDYXBIZWlnaHQiKSwKKyAgICAgIGZsYWdzOiBkZXNjcmlwdG9yLmdldCgiRmxhZ3MiKSwKKyAgICAgIGl0YWxpY0FuZ2xlOiBkZXNjcmlwdG9yLmdldCgiSXRhbGljQW5nbGUiKSwKKyAgICAgIGlzVHlwZTNGb250OiBmYWxzZQorICAgIH07CisgICAgdmFyIGNNYXBQcm9taXNlOworCisgICAgaWYgKGNvbXBvc2l0ZSkgeworICAgICAgdmFyIGNpZEVuY29kaW5nID0gYmFzZURpY3QuZ2V0KCJFbmNvZGluZyIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoY2lkRW5jb2RpbmcpKSB7CisgICAgICAgIHByb3BlcnRpZXMuY2lkRW5jb2RpbmcgPSBjaWRFbmNvZGluZy5uYW1lOworICAgICAgfQorCisgICAgICBjTWFwUHJvbWlzZSA9IF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CisgICAgICAgIGVuY29kaW5nOiBjaWRFbmNvZGluZywKKyAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAorICAgICAgICB1c2VDTWFwOiBudWxsCisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjTWFwKSB7CisgICAgICAgIHByb3BlcnRpZXMuY01hcCA9IGNNYXA7CisgICAgICAgIHByb3BlcnRpZXMudmVydGljYWwgPSBwcm9wZXJ0aWVzLmNNYXAudmVydGljYWw7CisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgY01hcFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gY01hcFByb21pc2UudGhlbigoKSA9PiB7CisgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgYmFzZURpY3QsIHByb3BlcnRpZXMpOworICAgIH0pLnRoZW4obmV3UHJvcGVydGllcyA9PiB7CisgICAgICB0aGlzLmV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgbmV3UHJvcGVydGllcyk7CisKKyAgICAgIGlmICh0eXBlID09PSAiVHlwZTMiKSB7CisgICAgICAgIG5ld1Byb3BlcnRpZXMuaXNUeXBlM0ZvbnQgPSB0cnVlOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3IF9mb250cy5Gb250KGZvbnROYW1lLm5hbWUsIGZvbnRGaWxlLCBuZXdQcm9wZXJ0aWVzKTsKKyAgICB9KTsKKyAgfQorCisgIHN0YXRpYyBidWlsZEZvbnRQYXRocyhmb250LCBnbHlwaHMsIGhhbmRsZXIpIHsKKyAgICBmdW5jdGlvbiBidWlsZFBhdGgoZm9udENoYXIpIHsKKyAgICAgIGlmIChmb250LnJlbmRlcmVyLmhhc0J1aWx0UGF0aChmb250Q2hhcikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBoYW5kbGVyLnNlbmQoImNvbW1vbm9iaiIsIFtgJHtmb250LmxvYWRlZE5hbWV9X3BhdGhfJHtmb250Q2hhcn1gLCAiRm9udFBhdGgiLCBmb250LnJlbmRlcmVyLmdldFBhdGhKcyhmb250Q2hhcildKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykgeworICAgICAgYnVpbGRQYXRoKGdseXBoLmZvbnRDaGFyKTsKKyAgICAgIGNvbnN0IGFjY2VudCA9IGdseXBoLmFjY2VudDsKKworICAgICAgaWYgKGFjY2VudCAmJiBhY2NlbnQuZm9udENoYXIpIHsKKyAgICAgICAgYnVpbGRQYXRoKGFjY2VudC5mb250Q2hhcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGdldCBmYWxsYmFja0ZvbnREaWN0KCkgeworICAgIGNvbnN0IGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgIGRpY3Quc2V0KCJCYXNlRm9udCIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJQREZKUy1GYWxsYmFja0ZvbnQiKSk7CisgICAgZGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOworICAgIGRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKKyAgICBkaWN0LnNldCgiRW5jb2RpbmciLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpOworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZmFsbGJhY2tGb250RGljdCIsIGRpY3QpOworICB9CisKK30KKworZXhwb3J0cy5QYXJ0aWFsRXZhbHVhdG9yID0gUGFydGlhbEV2YWx1YXRvcjsKKworY2xhc3MgVHJhbnNsYXRlZEZvbnQgeworICBjb25zdHJ1Y3Rvcih7CisgICAgbG9hZGVkTmFtZSwKKyAgICBmb250LAorICAgIGRpY3QsCisgICAgZXh0cmFQcm9wZXJ0aWVzID0gZmFsc2UKKyAgfSkgeworICAgIHRoaXMubG9hZGVkTmFtZSA9IGxvYWRlZE5hbWU7CisgICAgdGhpcy5mb250ID0gZm9udDsKKyAgICB0aGlzLmRpY3QgPSBkaWN0OworICAgIHRoaXMuX2V4dHJhUHJvcGVydGllcyA9IGV4dHJhUHJvcGVydGllczsKKyAgICB0aGlzLnR5cGUzTG9hZGVkID0gbnVsbDsKKyAgICB0aGlzLnR5cGUzRGVwZW5kZW5jaWVzID0gZm9udC5pc1R5cGUzRm9udCA/IG5ldyBTZXQoKSA6IG51bGw7CisgICAgdGhpcy5zZW50ID0gZmFsc2U7CisgIH0KKworICBzZW5kKGhhbmRsZXIpIHsKKyAgICBpZiAodGhpcy5zZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5zZW50ID0gdHJ1ZTsKKyAgICBoYW5kbGVyLnNlbmQoImNvbW1vbm9iaiIsIFt0aGlzLmxvYWRlZE5hbWUsICJGb250IiwgdGhpcy5mb250LmV4cG9ydERhdGEodGhpcy5fZXh0cmFQcm9wZXJ0aWVzKV0pOworICB9CisKKyAgZmFsbGJhY2soaGFuZGxlcikgeworICAgIGlmICghdGhpcy5mb250LmRhdGEpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmZvbnQuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTsKKyAgICBjb25zdCBnbHlwaHMgPSB0aGlzLmZvbnQuZ2x5cGhDYWNoZVZhbHVlczsKKyAgICBQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKHRoaXMuZm9udCwgZ2x5cGhzLCBoYW5kbGVyKTsKKyAgfQorCisgIGxvYWRUeXBlM0RhdGEoZXZhbHVhdG9yLCByZXNvdXJjZXMsIHRhc2spIHsKKyAgICBpZiAodGhpcy50eXBlM0xvYWRlZCkgeworICAgICAgcmV0dXJuIHRoaXMudHlwZTNMb2FkZWQ7CisgICAgfQorCisgICAgaWYgKCF0aGlzLmZvbnQuaXNUeXBlM0ZvbnQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7CisgICAgfQorCisgICAgdmFyIHR5cGUzT3B0aW9ucyA9IE9iamVjdC5jcmVhdGUoZXZhbHVhdG9yLm9wdGlvbnMpOworICAgIHR5cGUzT3B0aW9ucy5pZ25vcmVFcnJvcnMgPSBmYWxzZTsKKyAgICB2YXIgdHlwZTNFdmFsdWF0b3IgPSBldmFsdWF0b3IuY2xvbmUodHlwZTNPcHRpb25zKTsKKyAgICB0eXBlM0V2YWx1YXRvci5wYXJzaW5nVHlwZTNGb250ID0gdHJ1ZTsKKyAgICBjb25zdCB0cmFuc2xhdGVkRm9udCA9IHRoaXMuZm9udCwKKyAgICAgICAgICB0eXBlM0RlcGVuZGVuY2llcyA9IHRoaXMudHlwZTNEZXBlbmRlbmNpZXM7CisgICAgdmFyIGxvYWRDaGFyUHJvY3NQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7CisgICAgdmFyIGNoYXJQcm9jcyA9IHRoaXMuZGljdC5nZXQoIkNoYXJQcm9jcyIpOworICAgIHZhciBmb250UmVzb3VyY2VzID0gdGhpcy5kaWN0LmdldCgiUmVzb3VyY2VzIikgfHwgcmVzb3VyY2VzOworICAgIHZhciBjaGFyUHJvY09wZXJhdG9yTGlzdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICBmb3IgKGNvbnN0IGtleSBvZiBjaGFyUHJvY3MuZ2V0S2V5cygpKSB7CisgICAgICBsb2FkQ2hhclByb2NzUHJvbWlzZSA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgZ2x5cGhTdHJlYW0gPSBjaGFyUHJvY3MuZ2V0KGtleSk7CisgICAgICAgIHZhciBvcGVyYXRvckxpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CisgICAgICAgIHJldHVybiB0eXBlM0V2YWx1YXRvci5nZXRPcGVyYXRvckxpc3QoeworICAgICAgICAgIHN0cmVhbTogZ2x5cGhTdHJlYW0sCisgICAgICAgICAgdGFzaywKKyAgICAgICAgICByZXNvdXJjZXM6IGZvbnRSZXNvdXJjZXMsCisgICAgICAgICAgb3BlcmF0b3JMaXN0CisgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgIGNoYXJQcm9jT3BlcmF0b3JMaXN0W2tleV0gPSBvcGVyYXRvckxpc3QuZ2V0SVIoKTsKKworICAgICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvcGVyYXRvckxpc3QuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICB0eXBlM0RlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CisgICAgICAgICAgfQorICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBUeXBlMyBmb250IHJlc291cmNlICIke2tleX0iIGlzIG5vdCBhdmFpbGFibGUuYCk7CisgICAgICAgICAgY29uc3QgZHVtbXlPcGVyYXRvckxpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CisgICAgICAgICAgY2hhclByb2NPcGVyYXRvckxpc3Rba2V5XSA9IGR1bW15T3BlcmF0b3JMaXN0LmdldElSKCk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorCisgICAgdGhpcy50eXBlM0xvYWRlZCA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgdHJhbnNsYXRlZEZvbnQuY2hhclByb2NPcGVyYXRvckxpc3QgPSBjaGFyUHJvY09wZXJhdG9yTGlzdDsKKyAgICB9KTsKKyAgICByZXR1cm4gdGhpcy50eXBlM0xvYWRlZDsKKyAgfQorCit9CisKK2NsYXNzIFN0YXRlTWFuYWdlciB7CisgIGNvbnN0cnVjdG9yKGluaXRpYWxTdGF0ZSkgeworICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7CisgICAgdGhpcy5zdGF0ZVN0YWNrID0gW107CisgIH0KKworICBzYXZlKCkgeworICAgIHZhciBvbGQgPSB0aGlzLnN0YXRlOworICAgIHRoaXMuc3RhdGVTdGFjay5wdXNoKHRoaXMuc3RhdGUpOworICAgIHRoaXMuc3RhdGUgPSBvbGQuY2xvbmUoKTsKKyAgfQorCisgIHJlc3RvcmUoKSB7CisgICAgdmFyIHByZXYgPSB0aGlzLnN0YXRlU3RhY2sucG9wKCk7CisKKyAgICBpZiAocHJldikgeworICAgICAgdGhpcy5zdGF0ZSA9IHByZXY7CisgICAgfQorICB9CisKKyAgdHJhbnNmb3JtKGFyZ3MpIHsKKyAgICB0aGlzLnN0YXRlLmN0bSA9IF91dGlsLlV0aWwudHJhbnNmb3JtKHRoaXMuc3RhdGUuY3RtLCBhcmdzKTsKKyAgfQorCit9CisKK2NsYXNzIFRleHRTdGF0ZSB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuY3RtID0gbmV3IEZsb2F0MzJBcnJheShfdXRpbC5JREVOVElUWV9NQVRSSVgpOworICAgIHRoaXMuZm9udE5hbWUgPSBudWxsOworICAgIHRoaXMuZm9udFNpemUgPSAwOworICAgIHRoaXMuZm9udCA9IG51bGw7CisgICAgdGhpcy5mb250TWF0cml4ID0gX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7CisgICAgdGhpcy50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CisgICAgdGhpcy50ZXh0TGluZU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWC5zbGljZSgpOworICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwOworICAgIHRoaXMud29yZFNwYWNpbmcgPSAwOworICAgIHRoaXMubGVhZGluZyA9IDA7CisgICAgdGhpcy50ZXh0SFNjYWxlID0gMTsKKyAgICB0aGlzLnRleHRSaXNlID0gMDsKKyAgfQorCisgIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgeworICAgIHZhciBtID0gdGhpcy50ZXh0TWF0cml4OworICAgIG1bMF0gPSBhOworICAgIG1bMV0gPSBiOworICAgIG1bMl0gPSBjOworICAgIG1bM10gPSBkOworICAgIG1bNF0gPSBlOworICAgIG1bNV0gPSBmOworICB9CisKKyAgc2V0VGV4dExpbmVNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgeworICAgIHZhciBtID0gdGhpcy50ZXh0TGluZU1hdHJpeDsKKyAgICBtWzBdID0gYTsKKyAgICBtWzFdID0gYjsKKyAgICBtWzJdID0gYzsKKyAgICBtWzNdID0gZDsKKyAgICBtWzRdID0gZTsKKyAgICBtWzVdID0gZjsKKyAgfQorCisgIHRyYW5zbGF0ZVRleHRNYXRyaXgoeCwgeSkgeworICAgIHZhciBtID0gdGhpcy50ZXh0TWF0cml4OworICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTsKKyAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07CisgIH0KKworICB0cmFuc2xhdGVUZXh0TGluZU1hdHJpeCh4LCB5KSB7CisgICAgdmFyIG0gPSB0aGlzLnRleHRMaW5lTWF0cml4OworICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTsKKyAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07CisgIH0KKworICBjYWxjVGV4dExpbmVNYXRyaXhBZHZhbmNlKGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICB2YXIgZm9udCA9IHRoaXMuZm9udDsKKworICAgIGlmICghZm9udCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdmFyIG0gPSB0aGlzLnRleHRMaW5lTWF0cml4OworCisgICAgaWYgKCEoYSA9PT0gbVswXSAmJiBiID09PSBtWzFdICYmIGMgPT09IG1bMl0gJiYgZCA9PT0gbVszXSkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHZhciB0eERpZmYgPSBlIC0gbVs0XSwKKyAgICAgICAgdHlEaWZmID0gZiAtIG1bNV07CisKKyAgICBpZiAoZm9udC52ZXJ0aWNhbCAmJiB0eERpZmYgIT09IDAgfHwgIWZvbnQudmVydGljYWwgJiYgdHlEaWZmICE9PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2YXIgdHgsCisgICAgICAgIHR5LAorICAgICAgICBkZW5vbWluYXRvciA9IGEgKiBkIC0gYiAqIGM7CisKKyAgICBpZiAoZm9udC52ZXJ0aWNhbCkgeworICAgICAgdHggPSAtdHlEaWZmICogYyAvIGRlbm9taW5hdG9yOworICAgICAgdHkgPSB0eURpZmYgKiBhIC8gZGVub21pbmF0b3I7CisgICAgfSBlbHNlIHsKKyAgICAgIHR4ID0gdHhEaWZmICogZCAvIGRlbm9taW5hdG9yOworICAgICAgdHkgPSAtdHhEaWZmICogYiAvIGRlbm9taW5hdG9yOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICB3aWR0aDogdHgsCisgICAgICBoZWlnaHQ6IHR5LAorICAgICAgdmFsdWU6IGZvbnQudmVydGljYWwgPyB0eSA6IHR4CisgICAgfTsKKyAgfQorCisgIGNhbGNSZW5kZXJNYXRyaXgoY3RtKSB7CisgICAgdmFyIHRzbSA9IFt0aGlzLmZvbnRTaXplICogdGhpcy50ZXh0SFNjYWxlLCAwLCAwLCB0aGlzLmZvbnRTaXplLCAwLCB0aGlzLnRleHRSaXNlXTsKKyAgICByZXR1cm4gX3V0aWwuVXRpbC50cmFuc2Zvcm0oY3RtLCBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0aGlzLnRleHRNYXRyaXgsIHRzbSkpOworICB9CisKKyAgY2FycmlhZ2VSZXR1cm4oKSB7CisgICAgdGhpcy50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCgwLCAtdGhpcy5sZWFkaW5nKTsKKyAgICB0aGlzLnRleHRNYXRyaXggPSB0aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CisgIH0KKworICBjbG9uZSgpIHsKKyAgICB2YXIgY2xvbmUgPSBPYmplY3QuY3JlYXRlKHRoaXMpOworICAgIGNsb25lLnRleHRNYXRyaXggPSB0aGlzLnRleHRNYXRyaXguc2xpY2UoKTsKKyAgICBjbG9uZS50ZXh0TGluZU1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKKyAgICBjbG9uZS5mb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4LnNsaWNlKCk7CisgICAgcmV0dXJuIGNsb25lOworICB9CisKK30KKworY2xhc3MgRXZhbFN0YXRlIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5jdG0gPSBuZXcgRmxvYXQzMkFycmF5KF91dGlsLklERU5USVRZX01BVFJJWCk7CisgICAgdGhpcy5mb250ID0gbnVsbDsKKyAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTDsKKyAgICB0aGlzLmZpbGxDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CisgICAgdGhpcy5zdHJva2VDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CisgIH0KKworICBjbG9uZSgpIHsKKyAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTsKKyAgfQorCit9CisKK2NsYXNzIEV2YWx1YXRvclByZXByb2Nlc3NvciB7CisgIHN0YXRpYyBnZXQgb3BNYXAoKSB7CisgICAgY29uc3QgZ2V0T1BNYXAgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgICAgdC53ID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldExpbmVXaWR0aCwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuSiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRMaW5lQ2FwLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5qID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldExpbmVKb2luLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5NID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldE1pdGVyTGltaXQsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LmQgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RGFzaCwKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQucmkgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0UmVuZGVyaW5nSW50ZW50LAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5pID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZsYXRuZXNzLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5ncyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRHU3RhdGUsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LnEgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2F2ZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuUSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5yZXN0b3JlLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5jbSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy50cmFuc2Zvcm0sCisgICAgICAgIG51bUFyZ3M6IDYsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0Lm0gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMubW92ZVRvLAorICAgICAgICBudW1BcmdzOiAyLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5sID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmxpbmVUbywKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuYyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5jdXJ2ZVRvLAorICAgICAgICBudW1BcmdzOiA2LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC52ID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmN1cnZlVG8yLAorICAgICAgICBudW1BcmdzOiA0LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC55ID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmN1cnZlVG8zLAorICAgICAgICBudW1BcmdzOiA0LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5oID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmNsb3NlUGF0aCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQucmUgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMucmVjdGFuZ2xlLAorICAgICAgICBudW1BcmdzOiA0LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5TID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnN0cm9rZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQucyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5jbG9zZVN0cm9rZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuZiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5GID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmZpbGwsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0WyJmKiJdID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmVvRmlsbCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuQiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsU3Ryb2tlLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdFsiQioiXSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5lb0ZpbGxTdHJva2UsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LmIgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuY2xvc2VGaWxsU3Ryb2tlLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdFsiYioiXSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5jbG9zZUVPRmlsbFN0cm9rZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQubiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRQYXRoLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5XID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmNsaXAsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0WyJXKiJdID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmVvQ2xpcCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuQlQgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuYmVnaW5UZXh0LAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5FVCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRUZXh0LAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5UYyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZywKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVHcgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0V29yZFNwYWNpbmcsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlR6ID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldEhTY2FsZSwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVEwgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0TGVhZGluZywKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVGYgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0Rm9udCwKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVHIgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGUsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlRzID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFRleHRSaXNlLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5UZCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5tb3ZlVGV4dCwKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVEQgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0TGVhZGluZ01vdmVUZXh0LAorICAgICAgICBudW1BcmdzOiAyLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5UbSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRUZXh0TWF0cml4LAorICAgICAgICBudW1BcmdzOiA2LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdFsiVCoiXSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5uZXh0TGluZSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuVGogPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2hvd1RleHQsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlRKID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNob3dTcGFjZWRUZXh0LAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdFsiJyJdID0geworICAgICAgICBpZDogX3V0aWwuT1BTLm5leHRMaW5lU2hvd1RleHQsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0WyciJ10gPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsCisgICAgICAgIG51bUFyZ3M6IDMsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LmQwID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldENoYXJXaWR0aCwKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuZDEgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0Q2hhcldpZHRoQW5kQm91bmRzLAorICAgICAgICBudW1BcmdzOiA2LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5DUyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5jcyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGaWxsQ29sb3JTcGFjZSwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuU0MgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3IsCisgICAgICAgIG51bUFyZ3M6IDQsCisgICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQorICAgICAgfTsKKyAgICAgIHQuU0NOID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yTiwKKyAgICAgICAgbnVtQXJnczogMzMsCisgICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQorICAgICAgfTsKKyAgICAgIHQuc2MgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbENvbG9yLAorICAgICAgICBudW1BcmdzOiA0LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IHRydWUKKyAgICAgIH07CisgICAgICB0LnNjbiA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGaWxsQ29sb3JOLAorICAgICAgICBudW1BcmdzOiAzMywKKyAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCisgICAgICB9OworICAgICAgdC5HID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZUdyYXksCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LmcgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbEdyYXksCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LlJHID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yLAorICAgICAgICBudW1BcmdzOiAzLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5yZyA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3IsCisgICAgICAgIG51bUFyZ3M6IDMsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LksgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLAorICAgICAgICBudW1BcmdzOiA0LAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5rID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZpbGxDTVlLQ29sb3IsCisgICAgICAgIG51bUFyZ3M6IDQsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LnNoID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnNoYWRpbmdGaWxsLAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5CSSA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5iZWdpbklubGluZUltYWdlLAorICAgICAgICBudW1BcmdzOiAwLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5JRCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5iZWdpbkltYWdlRGF0YSwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuRUkgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuZW5kSW5saW5lSW1hZ2UsCisgICAgICAgIG51bUFyZ3M6IDEsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkRvID0geworICAgICAgICBpZDogX3V0aWwuT1BTLnBhaW50WE9iamVjdCwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuTVAgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMubWFya1BvaW50LAorICAgICAgICBudW1BcmdzOiAxLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5EUCA9IHsKKyAgICAgICAgaWQ6IF91dGlsLk9QUy5tYXJrUG9pbnRQcm9wcywKKyAgICAgICAgbnVtQXJnczogMiwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuQk1DID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudCwKKyAgICAgICAgbnVtQXJnczogMSwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuQkRDID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLAorICAgICAgICBudW1BcmdzOiAyLAorICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCisgICAgICB9OworICAgICAgdC5FTUMgPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuZW5kTWFya2VkQ29udGVudCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuQlggPSB7CisgICAgICAgIGlkOiBfdXRpbC5PUFMuYmVnaW5Db21wYXQsCisgICAgICAgIG51bUFyZ3M6IDAsCisgICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKKyAgICAgIH07CisgICAgICB0LkVYID0geworICAgICAgICBpZDogX3V0aWwuT1BTLmVuZENvbXBhdCwKKyAgICAgICAgbnVtQXJnczogMCwKKyAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQorICAgICAgfTsKKyAgICAgIHQuQk0gPSBudWxsOworICAgICAgdC5CRCA9IG51bGw7CisgICAgICB0LnRydWUgPSBudWxsOworICAgICAgdC5mYSA9IG51bGw7CisgICAgICB0LmZhbCA9IG51bGw7CisgICAgICB0LmZhbHMgPSBudWxsOworICAgICAgdC5mYWxzZSA9IG51bGw7CisgICAgICB0Lm51ID0gbnVsbDsKKyAgICAgIHQubnVsID0gbnVsbDsKKyAgICAgIHQubnVsbCA9IG51bGw7CisgICAgfSk7CisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJvcE1hcCIsIGdldE9QTWFwKCkpOworICB9CisKKyAgc3RhdGljIGdldCBNQVhfSU5WQUxJRF9QQVRIX09QUygpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIk1BWF9JTlZBTElEX1BBVEhfT1BTIiwgMjApOworICB9CisKKyAgY29uc3RydWN0b3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIpIHsKKyAgICB0aGlzLnBhcnNlciA9IG5ldyBfcGFyc2VyLlBhcnNlcih7CisgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtLCBFdmFsdWF0b3JQcmVwcm9jZXNzb3Iub3BNYXApLAorICAgICAgeHJlZgorICAgIH0pOworICAgIHRoaXMuc3RhdGVNYW5hZ2VyID0gc3RhdGVNYW5hZ2VyOworICAgIHRoaXMubm9uUHJvY2Vzc2VkQXJncyA9IFtdOworICAgIHRoaXMuX251bUludmFsaWRQYXRoT1BTID0gMDsKKyAgfQorCisgIGdldCBzYXZlZFN0YXRlc0RlcHRoKCkgeworICAgIHJldHVybiB0aGlzLnN0YXRlTWFuYWdlci5zdGF0ZVN0YWNrLmxlbmd0aDsKKyAgfQorCisgIHJlYWQob3BlcmF0aW9uKSB7CisgICAgdmFyIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5wYXJzZXIuZ2V0T2JqKCk7CisKKyAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQpIHsKKyAgICAgICAgdmFyIGNtZCA9IG9iai5jbWQ7CisgICAgICAgIHZhciBvcFNwZWMgPSBFdmFsdWF0b3JQcmVwcm9jZXNzb3Iub3BNYXBbY21kXTsKKworICAgICAgICBpZiAoIW9wU3BlYykgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgVW5rbm93biBjb21tYW5kICIke2NtZH0iLmApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZuID0gb3BTcGVjLmlkOworICAgICAgICB2YXIgbnVtQXJncyA9IG9wU3BlYy5udW1BcmdzOworICAgICAgICB2YXIgYXJnc0xlbmd0aCA9IGFyZ3MgIT09IG51bGwgPyBhcmdzLmxlbmd0aCA6IDA7CisKKyAgICAgICAgaWYgKCFvcFNwZWMudmFyaWFibGVBcmdzKSB7CisgICAgICAgICAgaWYgKGFyZ3NMZW5ndGggIT09IG51bUFyZ3MpIHsKKyAgICAgICAgICAgIHZhciBub25Qcm9jZXNzZWRBcmdzID0gdGhpcy5ub25Qcm9jZXNzZWRBcmdzOworCisgICAgICAgICAgICB3aGlsZSAoYXJnc0xlbmd0aCA+IG51bUFyZ3MpIHsKKyAgICAgICAgICAgICAgbm9uUHJvY2Vzc2VkQXJncy5wdXNoKGFyZ3Muc2hpZnQoKSk7CisgICAgICAgICAgICAgIGFyZ3NMZW5ndGgtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGggPCBudW1BcmdzICYmIG5vblByb2Nlc3NlZEFyZ3MubGVuZ3RoICE9PSAwKSB7CisgICAgICAgICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXJncyA9IFtdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYXJncy51bnNoaWZ0KG5vblByb2Nlc3NlZEFyZ3MucG9wKCkpOworICAgICAgICAgICAgICBhcmdzTGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGFyZ3NMZW5ndGggPCBudW1BcmdzKSB7CisgICAgICAgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gYGNvbW1hbmQgJHtjbWR9OiBleHBlY3RlZCAke251bUFyZ3N9IGFyZ3MsIGAgKyBgYnV0IHJlY2VpdmVkICR7YXJnc0xlbmd0aH0gYXJncy5gOworCisgICAgICAgICAgICBpZiAoZm4gPj0gX3V0aWwuT1BTLm1vdmVUbyAmJiBmbiA8PSBfdXRpbC5PUFMuZW5kUGF0aCAmJiArK3RoaXMuX251bUludmFsaWRQYXRoT1BTID4gRXZhbHVhdG9yUHJlcHJvY2Vzc29yLk1BWF9JTlZBTElEX1BBVEhfT1BTKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCAke3BhcnRpYWxNc2d9YCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgU2tpcHBpbmcgJHtwYXJ0aWFsTXNnfWApOworCisgICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkgeworICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhcmdzTGVuZ3RoID4gbnVtQXJncykgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgQ29tbWFuZCAke2NtZH06IGV4cGVjdGVkIFswLCAke251bUFyZ3N9XSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnByZXByb2Nlc3NDb21tYW5kKGZuLCBhcmdzKTsKKyAgICAgICAgb3BlcmF0aW9uLmZuID0gZm47CisgICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJnczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChvYmogPT09IF9wcmltaXRpdmVzLkVPRikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChvYmogIT09IG51bGwpIHsKKyAgICAgICAgaWYgKGFyZ3MgPT09IG51bGwpIHsKKyAgICAgICAgICBhcmdzID0gW107CisgICAgICAgIH0KKworICAgICAgICBhcmdzLnB1c2gob2JqKTsKKworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAzMykgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncykgeworICAgIHN3aXRjaCAoZm4gfCAwKSB7CisgICAgICBjYXNlIF91dGlsLk9QUy5zYXZlOgorICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIF91dGlsLk9QUy5yZXN0b3JlOgorICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5yZXN0b3JlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIF91dGlsLk9QUy50cmFuc2Zvcm06CisgICAgICAgIHRoaXMuc3RhdGVNYW5hZ2VyLnRyYW5zZm9ybShhcmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9mb250X3JlbmRlcmVyLmpzIGIvbGliL2NvcmUvZm9udF9yZW5kZXJlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDI4NTYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvZm9udF9yZW5kZXJlci5qcwpAQCAtMCwwICsxLDk4MSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRm9udFJlbmRlcmVyRmFjdG9yeSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9jZmZfcGFyc2VyID0gcmVxdWlyZSgiLi9jZmZfcGFyc2VyLmpzIik7CisKK3ZhciBfZ2x5cGhsaXN0ID0gcmVxdWlyZSgiLi9nbHlwaGxpc3QuanMiKTsKKwordmFyIF9lbmNvZGluZ3MgPSByZXF1aXJlKCIuL2VuY29kaW5ncy5qcyIpOworCit2YXIgX3N0cmVhbSA9IHJlcXVpcmUoIi4vc3RyZWFtLmpzIik7CisKK3ZhciBGb250UmVuZGVyZXJGYWN0b3J5ID0gZnVuY3Rpb24gRm9udFJlbmRlcmVyRmFjdG9yeUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGdldExvbmcoZGF0YSwgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdOworICB9CisKKyAgZnVuY3Rpb24gZ2V0VXNob3J0KGRhdGEsIG9mZnNldCkgeworICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgMV07CisgIH0KKworICBmdW5jdGlvbiBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycykgeworICAgIGNvbnN0IG51bVN1YnJzID0gc3VicnMubGVuZ3RoOworICAgIGxldCBiaWFzID0gMzI3Njg7CisKKyAgICBpZiAobnVtU3VicnMgPCAxMjQwKSB7CisgICAgICBiaWFzID0gMTA3OworICAgIH0gZWxzZSBpZiAobnVtU3VicnMgPCAzMzkwMCkgeworICAgICAgYmlhcyA9IDExMzE7CisgICAgfQorCisgICAgcmV0dXJuIGJpYXM7CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUNtYXAoZGF0YSwgc3RhcnQsIGVuZCkgeworICAgIHZhciBvZmZzZXQgPSBnZXRVc2hvcnQoZGF0YSwgc3RhcnQgKyAyKSA9PT0gMSA/IGdldExvbmcoZGF0YSwgc3RhcnQgKyA4KSA6IGdldExvbmcoZGF0YSwgc3RhcnQgKyAxNik7CisgICAgdmFyIGZvcm1hdCA9IGdldFVzaG9ydChkYXRhLCBzdGFydCArIG9mZnNldCk7CisgICAgdmFyIHJhbmdlcywgcCwgaTsKKworICAgIGlmIChmb3JtYXQgPT09IDQpIHsKKyAgICAgIGdldFVzaG9ydChkYXRhLCBzdGFydCArIG9mZnNldCArIDIpOworICAgICAgdmFyIHNlZ0NvdW50ID0gZ2V0VXNob3J0KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0ICsgNikgPj4gMTsKKyAgICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE0OworICAgICAgcmFuZ2VzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKKyAgICAgICAgcmFuZ2VzW2ldID0geworICAgICAgICAgIGVuZDogZ2V0VXNob3J0KGRhdGEsIHApCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHAgKz0gMjsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgeworICAgICAgICByYW5nZXNbaV0uc3RhcnQgPSBnZXRVc2hvcnQoZGF0YSwgcCk7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKKyAgICAgICAgcmFuZ2VzW2ldLmlkRGVsdGEgPSBnZXRVc2hvcnQoZGF0YSwgcCk7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKKyAgICAgICAgdmFyIGlkT2Zmc2V0ID0gZ2V0VXNob3J0KGRhdGEsIHApOworCisgICAgICAgIGlmIChpZE9mZnNldCA9PT0gMCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmFuZ2VzW2ldLmlkcyA9IFtdOworCisgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHJhbmdlc1tpXS5lbmQgLSByYW5nZXNbaV0uc3RhcnQgKyAxOyBqIDwgamo7IGorKykgeworICAgICAgICAgIHJhbmdlc1tpXS5pZHNbal0gPSBnZXRVc2hvcnQoZGF0YSwgcCArIGlkT2Zmc2V0KTsKKyAgICAgICAgICBpZE9mZnNldCArPSAyOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiByYW5nZXM7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDEyKSB7CisgICAgICBnZXRMb25nKGRhdGEsIHN0YXJ0ICsgb2Zmc2V0ICsgNCk7CisgICAgICB2YXIgZ3JvdXBzID0gZ2V0TG9uZyhkYXRhLCBzdGFydCArIG9mZnNldCArIDEyKTsKKyAgICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE2OworICAgICAgcmFuZ2VzID0gW107CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBncm91cHM7IGkrKykgeworICAgICAgICByYW5nZXMucHVzaCh7CisgICAgICAgICAgc3RhcnQ6IGdldExvbmcoZGF0YSwgcCksCisgICAgICAgICAgZW5kOiBnZXRMb25nKGRhdGEsIHAgKyA0KSwKKyAgICAgICAgICBpZERlbHRhOiBnZXRMb25nKGRhdGEsIHAgKyA4KSAtIGdldExvbmcoZGF0YSwgcCkKKyAgICAgICAgfSk7CisgICAgICAgIHAgKz0gMTI7CisgICAgICB9CisKKyAgICAgIHJldHVybiByYW5nZXM7CisgICAgfQorCisgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGB1bnN1cHBvcnRlZCBjbWFwOiAke2Zvcm1hdH1gKTsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlQ2ZmKGRhdGEsIHN0YXJ0LCBlbmQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKKyAgICB2YXIgcHJvcGVydGllcyA9IHt9OworICAgIHZhciBwYXJzZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKG5ldyBfc3RyZWFtLlN0cmVhbShkYXRhLCBzdGFydCwgZW5kIC0gc3RhcnQpLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKKyAgICB2YXIgY2ZmID0gcGFyc2VyLnBhcnNlKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIGdseXBoczogY2ZmLmNoYXJTdHJpbmdzLm9iamVjdHMsCisgICAgICBzdWJyczogY2ZmLnRvcERpY3QucHJpdmF0ZURpY3QgJiYgY2ZmLnRvcERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleCAmJiBjZmYudG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHMsCisgICAgICBnc3VicnM6IGNmZi5nbG9iYWxTdWJySW5kZXggJiYgY2ZmLmdsb2JhbFN1YnJJbmRleC5vYmplY3RzLAorICAgICAgaXNDRkZDSURGb250OiBjZmYuaXNDSURGb250LAorICAgICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCwKKyAgICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGlzR2x5cGhMb2NhdGlvbnNMb25nKSB7CisgICAgdmFyIGl0ZW1TaXplLCBpdGVtRGVjb2RlOworCisgICAgaWYgKGlzR2x5cGhMb2NhdGlvbnNMb25nKSB7CisgICAgICBpdGVtU2l6ZSA9IDQ7CisKKyAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZUxvbmcoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXTsKKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgIGl0ZW1TaXplID0gMjsKKworICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlKGRhdGEsIG9mZnNldCkgeworICAgICAgICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDkgfCBkYXRhW29mZnNldCArIDFdIDw8IDE7CisgICAgICB9OworICAgIH0KKworICAgIHZhciBnbHlwaHMgPSBbXTsKKyAgICB2YXIgc3RhcnRPZmZzZXQgPSBpdGVtRGVjb2RlKGxvY2EsIDApOworCisgICAgZm9yICh2YXIgaiA9IGl0ZW1TaXplOyBqIDwgbG9jYS5sZW5ndGg7IGogKz0gaXRlbVNpemUpIHsKKyAgICAgIHZhciBlbmRPZmZzZXQgPSBpdGVtRGVjb2RlKGxvY2EsIGopOworICAgICAgZ2x5cGhzLnB1c2goZ2x5Zi5zdWJhcnJheShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KSk7CisgICAgICBzdGFydE9mZnNldCA9IGVuZE9mZnNldDsKKyAgICB9CisKKyAgICByZXR1cm4gZ2x5cGhzOworICB9CisKKyAgZnVuY3Rpb24gbG9va3VwQ21hcChyYW5nZXMsIHVuaWNvZGUpIHsKKyAgICB2YXIgY29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCksCisgICAgICAgIGdpZCA9IDA7CisgICAgdmFyIGwgPSAwLAorICAgICAgICByID0gcmFuZ2VzLmxlbmd0aCAtIDE7CisKKyAgICB3aGlsZSAobCA8IHIpIHsKKyAgICAgIHZhciBjID0gbCArIHIgKyAxID4+IDE7CisKKyAgICAgIGlmIChjb2RlIDwgcmFuZ2VzW2NdLnN0YXJ0KSB7CisgICAgICAgIHIgPSBjIC0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGwgPSBjOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyYW5nZXNbbF0uc3RhcnQgPD0gY29kZSAmJiBjb2RlIDw9IHJhbmdlc1tsXS5lbmQpIHsKKyAgICAgIGdpZCA9IHJhbmdlc1tsXS5pZERlbHRhICsgKHJhbmdlc1tsXS5pZHMgPyByYW5nZXNbbF0uaWRzW2NvZGUgLSByYW5nZXNbbF0uc3RhcnRdIDogY29kZSkgJiAweGZmZmY7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGNoYXJDb2RlOiBjb2RlLAorICAgICAgZ2x5cGhJZDogZ2lkCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIGZvbnQpIHsKKyAgICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgeworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAibW92ZVRvIiwKKyAgICAgICAgYXJnczogW3gsIHldCisgICAgICB9KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBsaW5lVG8oeCwgeSkgeworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAibGluZVRvIiwKKyAgICAgICAgYXJnczogW3gsIHldCisgICAgICB9KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBxdWFkcmF0aWNDdXJ2ZVRvKHhhLCB5YSwgeCwgeSkgeworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAicXVhZHJhdGljQ3VydmVUbyIsCisgICAgICAgIGFyZ3M6IFt4YSwgeWEsIHgsIHldCisgICAgICB9KTsKKyAgICB9CisKKyAgICB2YXIgaSA9IDA7CisgICAgdmFyIG51bWJlck9mQ29udG91cnMgPSAoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSA+PiAxNjsKKyAgICB2YXIgZmxhZ3M7CisgICAgdmFyIHggPSAwLAorICAgICAgICB5ID0gMDsKKyAgICBpICs9IDEwOworCisgICAgaWYgKG51bWJlck9mQ29udG91cnMgPCAwKSB7CisgICAgICBkbyB7CisgICAgICAgIGZsYWdzID0gY29kZVtpXSA8PCA4IHwgY29kZVtpICsgMV07CisgICAgICAgIHZhciBnbHlwaEluZGV4ID0gY29kZVtpICsgMl0gPDwgOCB8IGNvZGVbaSArIDNdOworICAgICAgICBpICs9IDQ7CisgICAgICAgIHZhciBhcmcxLCBhcmcyOworCisgICAgICAgIGlmIChmbGFncyAmIDB4MDEpIHsKKyAgICAgICAgICBhcmcxID0gKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNikgPj4gMTY7CisgICAgICAgICAgYXJnMiA9IChjb2RlW2kgKyAyXSA8PCAyNCB8IGNvZGVbaSArIDNdIDw8IDE2KSA+PiAxNjsKKyAgICAgICAgICBpICs9IDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXJnMSA9IGNvZGVbaSsrXTsKKyAgICAgICAgICBhcmcyID0gY29kZVtpKytdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgMHgwMikgeworICAgICAgICAgIHggPSBhcmcxOworICAgICAgICAgIHkgPSBhcmcyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHggPSAwOworICAgICAgICAgIHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHNjYWxlWCA9IDEsCisgICAgICAgICAgICBzY2FsZVkgPSAxLAorICAgICAgICAgICAgc2NhbGUwMSA9IDAsCisgICAgICAgICAgICBzY2FsZTEwID0gMDsKKworICAgICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7CisgICAgICAgICAgc2NhbGVYID0gc2NhbGVZID0gKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNikgLyAxMDczNzQxODI0OworICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4NDApIHsKKyAgICAgICAgICBzY2FsZVggPSAoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSAvIDEwNzM3NDE4MjQ7CisgICAgICAgICAgc2NhbGVZID0gKGNvZGVbaSArIDJdIDw8IDI0IHwgY29kZVtpICsgM10gPDwgMTYpIC8gMTA3Mzc0MTgyNDsKKyAgICAgICAgICBpICs9IDQ7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDgwKSB7CisgICAgICAgICAgc2NhbGVYID0gKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNikgLyAxMDczNzQxODI0OworICAgICAgICAgIHNjYWxlMDEgPSAoY29kZVtpICsgMl0gPDwgMjQgfCBjb2RlW2kgKyAzXSA8PCAxNikgLyAxMDczNzQxODI0OworICAgICAgICAgIHNjYWxlMTAgPSAoY29kZVtpICsgNF0gPDwgMjQgfCBjb2RlW2kgKyA1XSA8PCAxNikgLyAxMDczNzQxODI0OworICAgICAgICAgIHNjYWxlWSA9IChjb2RlW2kgKyA2XSA8PCAyNCB8IGNvZGVbaSArIDddIDw8IDE2KSAvIDEwNzM3NDE4MjQ7CisgICAgICAgICAgaSArPSA4OworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN1YmdseXBoID0gZm9udC5nbHlwaHNbZ2x5cGhJbmRleF07CisKKyAgICAgICAgaWYgKHN1YmdseXBoKSB7CisgICAgICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgICAgIGNtZDogInNhdmUiCisgICAgICAgICAgfSk7CisgICAgICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgICAgIGNtZDogInRyYW5zZm9ybSIsCisgICAgICAgICAgICBhcmdzOiBbc2NhbGVYLCBzY2FsZTAxLCBzY2FsZTEwLCBzY2FsZVksIHgsIHldCisgICAgICAgICAgfSk7CisgICAgICAgICAgY29tcGlsZUdseWYoc3ViZ2x5cGgsIGNtZHMsIGZvbnQpOworICAgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgICBjbWQ6ICJyZXN0b3JlIgorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChmbGFncyAmIDB4MjApOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgZW5kUHRzT2ZDb250b3VycyA9IFtdOworICAgICAgdmFyIGosIGpqOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZDb250b3VyczsgaisrKSB7CisgICAgICAgIGVuZFB0c09mQ29udG91cnMucHVzaChjb2RlW2ldIDw8IDggfCBjb2RlW2kgKyAxXSk7CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0KKworICAgICAgdmFyIGluc3RydWN0aW9uTGVuZ3RoID0gY29kZVtpXSA8PCA4IHwgY29kZVtpICsgMV07CisgICAgICBpICs9IDIgKyBpbnN0cnVjdGlvbkxlbmd0aDsKKyAgICAgIHZhciBudW1iZXJPZlBvaW50cyA9IGVuZFB0c09mQ29udG91cnNbZW5kUHRzT2ZDb250b3Vycy5sZW5ndGggLSAxXSArIDE7CisgICAgICB2YXIgcG9pbnRzID0gW107CisKKyAgICAgIHdoaWxlIChwb2ludHMubGVuZ3RoIDwgbnVtYmVyT2ZQb2ludHMpIHsKKyAgICAgICAgZmxhZ3MgPSBjb2RlW2krK107CisgICAgICAgIHZhciByZXBlYXQgPSAxOworCisgICAgICAgIGlmIChmbGFncyAmIDB4MDgpIHsKKyAgICAgICAgICByZXBlYXQgKz0gY29kZVtpKytdOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHJlcGVhdC0tID4gMCkgeworICAgICAgICAgIHBvaW50cy5wdXNoKHsKKyAgICAgICAgICAgIGZsYWdzCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKKyAgICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDEyKSB7CisgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgeCArPSAoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSA+PiAxNjsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgeCAtPSBjb2RlW2krK107CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHgxMjoKKyAgICAgICAgICAgIHggKz0gY29kZVtpKytdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwb2ludHNbal0ueCA9IHg7CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZlBvaW50czsgaisrKSB7CisgICAgICAgIHN3aXRjaCAocG9pbnRzW2pdLmZsYWdzICYgMHgyNCkgeworICAgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgICAgIHkgKz0gKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNikgPj4gMTY7CisgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHgwNDoKKyAgICAgICAgICAgIHkgLT0gY29kZVtpKytdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4MjQ6CisgICAgICAgICAgICB5ICs9IGNvZGVbaSsrXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcG9pbnRzW2pdLnkgPSB5OworICAgICAgfQorCisgICAgICB2YXIgc3RhcnRQb2ludCA9IDA7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJPZkNvbnRvdXJzOyBpKyspIHsKKyAgICAgICAgdmFyIGVuZFBvaW50ID0gZW5kUHRzT2ZDb250b3Vyc1tpXTsKKyAgICAgICAgdmFyIGNvbnRvdXIgPSBwb2ludHMuc2xpY2Uoc3RhcnRQb2ludCwgZW5kUG9pbnQgKyAxKTsKKworICAgICAgICBpZiAoY29udG91clswXS5mbGFncyAmIDEpIHsKKyAgICAgICAgICBjb250b3VyLnB1c2goY29udG91clswXSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udG91cltjb250b3VyLmxlbmd0aCAtIDFdLmZsYWdzICYgMSkgeworICAgICAgICAgIGNvbnRvdXIudW5zaGlmdChjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhciBwID0geworICAgICAgICAgICAgZmxhZ3M6IDEsCisgICAgICAgICAgICB4OiAoY29udG91clswXS54ICsgY29udG91cltjb250b3VyLmxlbmd0aCAtIDFdLngpIC8gMiwKKyAgICAgICAgICAgIHk6IChjb250b3VyWzBdLnkgKyBjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV0ueSkgLyAyCisgICAgICAgICAgfTsKKyAgICAgICAgICBjb250b3VyLnVuc2hpZnQocCk7CisgICAgICAgICAgY29udG91ci5wdXNoKHApOworICAgICAgICB9CisKKyAgICAgICAgbW92ZVRvKGNvbnRvdXJbMF0ueCwgY29udG91clswXS55KTsKKworICAgICAgICBmb3IgKGogPSAxLCBqaiA9IGNvbnRvdXIubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgIGlmIChjb250b3VyW2pdLmZsYWdzICYgMSkgeworICAgICAgICAgICAgbGluZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55KTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRvdXJbaiArIDFdLmZsYWdzICYgMSkgeworICAgICAgICAgICAgcXVhZHJhdGljQ3VydmVUbyhjb250b3VyW2pdLngsIGNvbnRvdXJbal0ueSwgY29udG91cltqICsgMV0ueCwgY29udG91cltqICsgMV0ueSk7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHF1YWRyYXRpY0N1cnZlVG8oY29udG91cltqXS54LCBjb250b3VyW2pdLnksIChjb250b3VyW2pdLnggKyBjb250b3VyW2ogKyAxXS54KSAvIDIsIChjb250b3VyW2pdLnkgKyBjb250b3VyW2ogKyAxXS55KSAvIDIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0UG9pbnQgPSBlbmRQb2ludCArIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY29tcGlsZUNoYXJTdHJpbmcoY2hhclN0cmluZ0NvZGUsIGNtZHMsIGZvbnQsIGdseXBoSWQpIHsKKyAgICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgeworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAibW92ZVRvIiwKKyAgICAgICAgYXJnczogW3gsIHldCisgICAgICB9KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBsaW5lVG8oeCwgeSkgeworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAibGluZVRvIiwKKyAgICAgICAgYXJnczogW3gsIHldCisgICAgICB9KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBiZXppZXJDdXJ2ZVRvKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7CisgICAgICBjbWRzLnB1c2goeworICAgICAgICBjbWQ6ICJiZXppZXJDdXJ2ZVRvIiwKKyAgICAgICAgYXJnczogW3gxLCB5MSwgeDIsIHkyLCB4LCB5XQorICAgICAgfSk7CisgICAgfQorCisgICAgdmFyIHN0YWNrID0gW107CisgICAgdmFyIHggPSAwLAorICAgICAgICB5ID0gMDsKKyAgICB2YXIgc3RlbXMgPSAwOworCisgICAgZnVuY3Rpb24gcGFyc2UoY29kZSkgeworICAgICAgdmFyIGkgPSAwOworCisgICAgICB3aGlsZSAoaSA8IGNvZGUubGVuZ3RoKSB7CisgICAgICAgIHZhciBzdGFja0NsZWFuID0gZmFsc2U7CisgICAgICAgIHZhciB2ID0gY29kZVtpKytdOworICAgICAgICB2YXIgeGEsIHhiLCB5YSwgeWIsIHkxLCB5MiwgeTMsIG4sIHN1YnJDb2RlOworCisgICAgICAgIHN3aXRjaCAodikgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOworICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOworICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHkgKz0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBtb3ZlVG8oeCwgeSk7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKKworICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKKworICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICBuID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdWJyQ29kZSA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChmb250LmlzQ0ZGQ0lERm9udCkgeworICAgICAgICAgICAgICBjb25zdCBmZEluZGV4ID0gZm9udC5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOworCisgICAgICAgICAgICAgIGlmIChmZEluZGV4ID49IDAgJiYgZmRJbmRleCA8IGZvbnQuZmRBcnJheS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmb250RGljdCA9IGZvbnQuZmRBcnJheVtmZEluZGV4XTsKKyAgICAgICAgICAgICAgICBsZXQgc3VicnM7CisKKyAgICAgICAgICAgICAgICBpZiAoZm9udERpY3QucHJpdmF0ZURpY3QgJiYgZm9udERpY3QucHJpdmF0ZURpY3Quc3VicnNJbmRleCkgeworICAgICAgICAgICAgICAgICAgc3VicnMgPSBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN1YnJzKSB7CisgICAgICAgICAgICAgICAgICBuICs9IGdldFN1YnJvdXRpbmVCaWFzKHN1YnJzKTsKKyAgICAgICAgICAgICAgICAgIHN1YnJDb2RlID0gc3VicnNbbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN1YnJDb2RlID0gZm9udC5zdWJyc1tuICsgZm9udC5zdWJyc0JpYXNdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3VickNvZGUpIHsKKyAgICAgICAgICAgICAgcGFyc2Uoc3VickNvZGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgdiA9IGNvZGVbaSsrXTsKKworICAgICAgICAgICAgc3dpdGNoICh2KSB7CisgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5MSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeSwgeGIsIHkxLCB4LCB5MSk7CisgICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkxLCB4YiwgeSwgeCwgeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHkxID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeTIgPSB5MSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHkyLCB4LCB5Mik7CisgICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5MyA9IHkyICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkyLCB4YiwgeTMsIHgsIHkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMzc6CisgICAgICAgICAgICAgICAgdmFyIHgwID0geCwKKyAgICAgICAgICAgICAgICAgICAgeTAgPSB5OworICAgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIHggPSB4YjsKKyAgICAgICAgICAgICAgICB5ID0geWI7CisKKyAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoeCAtIHgwKSA+IE1hdGguYWJzKHkgLSB5MCkpIHsKKyAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAxMiAke3Z9YCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPj0gNCkgeworICAgICAgICAgICAgICB2YXIgYWNoYXIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgdmFyIGJjaGFyID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHkgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgeCA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICBjbWRzLnB1c2goeworICAgICAgICAgICAgICAgIGNtZDogInNhdmUiCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICBjbWRzLnB1c2goeworICAgICAgICAgICAgICAgIGNtZDogInRyYW5zbGF0ZSIsCisgICAgICAgICAgICAgICAgYXJnczogW3gsIHldCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB2YXIgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW19lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZ1thY2hhcl1dKSk7CisgICAgICAgICAgICAgIGNvbXBpbGVDaGFyU3RyaW5nKGZvbnQuZ2x5cGhzW2NtYXAuZ2x5cGhJZF0sIGNtZHMsIGZvbnQsIGNtYXAuZ2x5cGhJZCk7CisgICAgICAgICAgICAgIGNtZHMucHVzaCh7CisgICAgICAgICAgICAgICAgY21kOiAicmVzdG9yZSIKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIGNtYXAgPSBsb29rdXBDbWFwKGZvbnQuY21hcCwgU3RyaW5nLmZyb21DaGFyQ29kZShmb250LmdseXBoTmFtZU1hcFtfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2RpbmdbYmNoYXJdXSkpOworICAgICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOworICAgICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKKyAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CisgICAgICAgICAgICBpICs9IHN0ZW1zICsgNyA+PiAzOworICAgICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgeCArPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIG1vdmVUbyh4LCB5KTsKKyAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgeCArPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIG1vdmVUbyh4LCB5KTsKKyAgICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CisgICAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAyKSB7CisgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiA2KSB7CisgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICBsaW5lVG8oeCwgeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgeworICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHhhID0geDsKKyAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4ID0geGI7CisgICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgeworICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHlhID0geTsKKyAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5ID0geWI7CisgICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICBzdGFjay5wdXNoKChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpID4+IDE2KTsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgIG4gPSBzdGFjay5wb3AoKSArIGZvbnQuZ3N1YnJzQmlhczsKKyAgICAgICAgICAgIHN1YnJDb2RlID0gZm9udC5nc3VicnNbbl07CisKKyAgICAgICAgICAgIGlmIChzdWJyQ29kZSkgeworICAgICAgICAgICAgICBwYXJzZShzdWJyQ29kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHhhID0geDsKKyAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5ID0geWIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOworICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKworICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YSA9IHk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHlhID0geTsKKyAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB4ID0geGIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOworICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKKworICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB4YSA9IHg7CisgICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CisgICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOworICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKKyAgICAgICAgICAgICAgeSA9IHliICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTsKKyAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh2IDwgMzIpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAke3Z9YCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2IDwgMjQ3KSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2godiAtIDEzOSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPCAyNTEpIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaCgodiAtIDI0NykgKiAyNTYgKyBjb2RlW2krK10gKyAxMDgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2IDwgMjU1KSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goLSh2IC0gMjUxKSAqIDI1NiAtIGNvZGVbaSsrXSAtIDEwOCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYgfCBjb2RlW2kgKyAyXSA8PCA4IHwgY29kZVtpICsgM10pIC8gNjU1MzYpOworICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YWNrQ2xlYW4pIHsKKyAgICAgICAgICBzdGFjay5sZW5ndGggPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcGFyc2UoY2hhclN0cmluZ0NvZGUpOworICB9CisKKyAgY29uc3QgTk9PUCA9IFtdOworCisgIGNsYXNzIENvbXBpbGVkRm9udCB7CisgICAgY29uc3RydWN0b3IoZm9udE1hdHJpeCkgeworICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IENvbXBpbGVkRm9udCkgeworICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBDb21waWxlZEZvbnQuIik7CisgICAgICB9CisKKyAgICAgIHRoaXMuZm9udE1hdHJpeCA9IGZvbnRNYXRyaXg7CisgICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgfQorCisgICAgZ2V0UGF0aEpzKHVuaWNvZGUpIHsKKyAgICAgIGNvbnN0IGNtYXAgPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CisgICAgICBsZXQgZm4gPSB0aGlzLmNvbXBpbGVkR2x5cGhzW2NtYXAuZ2x5cGhJZF07CisKKyAgICAgIGlmICghZm4pIHsKKyAgICAgICAgZm4gPSB0aGlzLmNvbXBpbGVHbHlwaCh0aGlzLmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWFwLmdseXBoSWQpOworICAgICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzW2NtYXAuZ2x5cGhJZF0gPSBmbjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFtjbWFwLmNoYXJDb2RlXSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFtjbWFwLmNoYXJDb2RlXSA9IGNtYXAuZ2x5cGhJZDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZuOworICAgIH0KKworICAgIGNvbXBpbGVHbHlwaChjb2RlLCBnbHlwaElkKSB7CisgICAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggPT09IDAgfHwgY29kZVswXSA9PT0gMTQpIHsKKyAgICAgICAgcmV0dXJuIE5PT1A7CisgICAgICB9CisKKyAgICAgIGxldCBmb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4OworCisgICAgICBpZiAodGhpcy5pc0NGRkNJREZvbnQpIHsKKyAgICAgICAgY29uc3QgZmRJbmRleCA9IHRoaXMuZmRTZWxlY3QuZ2V0RkRJbmRleChnbHlwaElkKTsKKworICAgICAgICBpZiAoZmRJbmRleCA+PSAwICYmIGZkSW5kZXggPCB0aGlzLmZkQXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgY29uc3QgZm9udERpY3QgPSB0aGlzLmZkQXJyYXlbZmRJbmRleF07CisgICAgICAgICAgZm9udE1hdHJpeCA9IGZvbnREaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpIHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29uc3QgY21kcyA9IFtdOworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAic2F2ZSIKKyAgICAgIH0pOworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAidHJhbnNmb3JtIiwKKyAgICAgICAgYXJnczogZm9udE1hdHJpeC5zbGljZSgpCisgICAgICB9KTsKKyAgICAgIGNtZHMucHVzaCh7CisgICAgICAgIGNtZDogInNjYWxlIiwKKyAgICAgICAgYXJnczogWyJzaXplIiwgIi1zaXplIl0KKyAgICAgIH0pOworICAgICAgdGhpcy5jb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMsIGdseXBoSWQpOworICAgICAgY21kcy5wdXNoKHsKKyAgICAgICAgY21kOiAicmVzdG9yZSIKKyAgICAgIH0pOworICAgICAgcmV0dXJuIGNtZHM7CisgICAgfQorCisgICAgY29tcGlsZUdseXBoSW1wbCgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNoaWxkcmVuIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzLiIpOworICAgIH0KKworICAgIGhhc0J1aWx0UGF0aCh1bmljb2RlKSB7CisgICAgICBjb25zdCBjbWFwID0gbG9va3VwQ21hcCh0aGlzLmNtYXAsIHVuaWNvZGUpOworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY21hcC5nbHlwaElkXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFtjbWFwLmNoYXJDb2RlXSAhPT0gdW5kZWZpbmVkOworICAgIH0KKworICB9CisKKyAgY2xhc3MgVHJ1ZVR5cGVDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udCB7CisgICAgY29uc3RydWN0b3IoZ2x5cGhzLCBjbWFwLCBmb250TWF0cml4KSB7CisgICAgICBzdXBlcihmb250TWF0cml4IHx8IFswLjAwMDQ4OCwgMCwgMCwgMC4wMDA0ODgsIDAsIDBdKTsKKyAgICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzOworICAgICAgdGhpcy5jbWFwID0gY21hcDsKKyAgICB9CisKKyAgICBjb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMpIHsKKyAgICAgIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIHRoaXMpOworICAgIH0KKworICB9CisKKyAgY2xhc3MgVHlwZTJDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udCB7CisgICAgY29uc3RydWN0b3IoY2ZmSW5mbywgY21hcCwgZm9udE1hdHJpeCwgZ2x5cGhOYW1lTWFwKSB7CisgICAgICBzdXBlcihmb250TWF0cml4IHx8IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdKTsKKyAgICAgIHRoaXMuZ2x5cGhzID0gY2ZmSW5mby5nbHlwaHM7CisgICAgICB0aGlzLmdzdWJycyA9IGNmZkluZm8uZ3N1YnJzIHx8IFtdOworICAgICAgdGhpcy5zdWJycyA9IGNmZkluZm8uc3VicnMgfHwgW107CisgICAgICB0aGlzLmNtYXAgPSBjbWFwOworICAgICAgdGhpcy5nbHlwaE5hbWVNYXAgPSBnbHlwaE5hbWVNYXAgfHwgKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKyAgICAgIHRoaXMuZ3N1YnJzQmlhcyA9IGdldFN1YnJvdXRpbmVCaWFzKHRoaXMuZ3N1YnJzKTsKKyAgICAgIHRoaXMuc3VicnNCaWFzID0gZ2V0U3Vicm91dGluZUJpYXModGhpcy5zdWJycyk7CisgICAgICB0aGlzLmlzQ0ZGQ0lERm9udCA9IGNmZkluZm8uaXNDRkZDSURGb250OworICAgICAgdGhpcy5mZFNlbGVjdCA9IGNmZkluZm8uZmRTZWxlY3Q7CisgICAgICB0aGlzLmZkQXJyYXkgPSBjZmZJbmZvLmZkQXJyYXk7CisgICAgfQorCisgICAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzLCBnbHlwaElkKSB7CisgICAgICBjb21waWxlQ2hhclN0cmluZyhjb2RlLCBjbWRzLCB0aGlzLCBnbHlwaElkKTsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiB7CisgICAgY3JlYXRlOiBmdW5jdGlvbiBGb250UmVuZGVyZXJGYWN0b3J5X2NyZWF0ZShmb250LCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CisgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGZvbnQuZGF0YSk7CisgICAgICB2YXIgY21hcCwgZ2x5ZiwgbG9jYSwgY2ZmLCBpbmRleFRvTG9jRm9ybWF0LCB1bml0c1BlckVtOworICAgICAgdmFyIG51bVRhYmxlcyA9IGdldFVzaG9ydChkYXRhLCA0KTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSAxMjsgaSA8IG51bVRhYmxlczsgaSsrLCBwICs9IDE2KSB7CisgICAgICAgIHZhciB0YWcgPSAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZGF0YS5zdWJhcnJheShwLCBwICsgNCkpOworICAgICAgICB2YXIgb2Zmc2V0ID0gZ2V0TG9uZyhkYXRhLCBwICsgOCk7CisgICAgICAgIHZhciBsZW5ndGggPSBnZXRMb25nKGRhdGEsIHAgKyAxMik7CisKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICBjYXNlICJjbWFwIjoKKyAgICAgICAgICAgIGNtYXAgPSBwYXJzZUNtYXAoZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJnbHlmIjoKKyAgICAgICAgICAgIGdseWYgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibG9jYSI6CisgICAgICAgICAgICBsb2NhID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImhlYWQiOgorICAgICAgICAgICAgdW5pdHNQZXJFbSA9IGdldFVzaG9ydChkYXRhLCBvZmZzZXQgKyAxOCk7CisgICAgICAgICAgICBpbmRleFRvTG9jRm9ybWF0ID0gZ2V0VXNob3J0KGRhdGEsIG9mZnNldCArIDUwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQ0ZGICI6CisgICAgICAgICAgICBjZmYgPSBwYXJzZUNmZihkYXRhLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCwgc2VhY0FuYWx5c2lzRW5hYmxlZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZ2x5ZikgeworICAgICAgICB2YXIgZm9udE1hdHJpeCA9ICF1bml0c1BlckVtID8gZm9udC5mb250TWF0cml4IDogWzEgLyB1bml0c1BlckVtLCAwLCAwLCAxIC8gdW5pdHNQZXJFbSwgMCwgMF07CisgICAgICAgIHJldHVybiBuZXcgVHJ1ZVR5cGVDb21waWxlZChwYXJzZUdseWZUYWJsZShnbHlmLCBsb2NhLCBpbmRleFRvTG9jRm9ybWF0KSwgY21hcCwgZm9udE1hdHJpeCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgVHlwZTJDb21waWxlZChjZmYsIGNtYXAsIGZvbnQuZm9udE1hdHJpeCwgZm9udC5nbHlwaE5hbWVNYXApOworICAgIH0KKyAgfTsKK30oKTsKKworZXhwb3J0cy5Gb250UmVuZGVyZXJGYWN0b3J5ID0gRm9udFJlbmRlcmVyRmFjdG9yeTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9mb250cy5qcyBiL2xpYi9jb3JlL2ZvbnRzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZjQ5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9mb250cy5qcwpAQCAtMCwwICsxLDMyNTYgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldEZvbnRUeXBlID0gZ2V0Rm9udFR5cGU7CitleHBvcnRzLklkZW50aXR5VG9Vbmljb2RlTWFwID0gZXhwb3J0cy5Ub1VuaWNvZGVNYXAgPSBleHBvcnRzLkZvbnRGbGFncyA9IGV4cG9ydHMuRm9udCA9IGV4cG9ydHMuRXJyb3JGb250ID0gZXhwb3J0cy5TRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfY2ZmX3BhcnNlciA9IHJlcXVpcmUoIi4vY2ZmX3BhcnNlci5qcyIpOworCit2YXIgX2dseXBobGlzdCA9IHJlcXVpcmUoIi4vZ2x5cGhsaXN0LmpzIik7CisKK3ZhciBfZW5jb2RpbmdzID0gcmVxdWlyZSgiLi9lbmNvZGluZ3MuanMiKTsKKwordmFyIF9zdGFuZGFyZF9mb250cyA9IHJlcXVpcmUoIi4vc3RhbmRhcmRfZm9udHMuanMiKTsKKwordmFyIF91bmljb2RlID0gcmVxdWlyZSgiLi91bmljb2RlLmpzIik7CisKK3ZhciBfY29yZV91dGlscyA9IHJlcXVpcmUoIi4vY29yZV91dGlscy5qcyIpOworCit2YXIgX2ZvbnRfcmVuZGVyZXIgPSByZXF1aXJlKCIuL2ZvbnRfcmVuZGVyZXIuanMiKTsKKwordmFyIF9jbWFwID0gcmVxdWlyZSgiLi9jbWFwLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi9zdHJlYW0uanMiKTsKKwordmFyIF90eXBlMV9wYXJzZXIgPSByZXF1aXJlKCIuL3R5cGUxX3BhcnNlci5qcyIpOworCitjb25zdCBQUklWQVRFX1VTRV9BUkVBUyA9IFtbMHhlMDAwLCAweGY4ZmZdLCBbMHgxMDAwMDAsIDB4MTBmZmZkXV07Cit2YXIgUERGX0dMWVBIX1NQQUNFX1VOSVRTID0gMTAwMDsKK3ZhciBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB0cnVlOworZXhwb3J0cy5TRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSBTRUFDX0FOQUxZU0lTX0VOQUJMRUQ7Citjb25zdCBFWFBPUlRfREFUQV9QUk9QRVJUSUVTID0gWyJhc2NlbnQiLCAiYmJveCIsICJibGFjayIsICJib2xkIiwgImNoYXJQcm9jT3BlcmF0b3JMaXN0IiwgImNvbXBvc2l0ZSIsICJkYXRhIiwgImRlZmF1bHRWTWV0cmljcyIsICJkZWZhdWx0V2lkdGgiLCAiZGVzY2VudCIsICJmYWxsYmFja05hbWUiLCAiZm9udE1hdHJpeCIsICJmb250VHlwZSIsICJpc01vbm9zcGFjZSIsICJpc1NlcmlmRm9udCIsICJpc1R5cGUzRm9udCIsICJpdGFsaWMiLCAibG9hZGVkTmFtZSIsICJtaW1ldHlwZSIsICJtaXNzaW5nRmlsZSIsICJuYW1lIiwgInJlbWVhc3VyZSIsICJzdWJ0eXBlIiwgInR5cGUiLCAidmVydGljYWwiXTsKK2NvbnN0IEVYUE9SVF9EQVRBX0VYVFJBX1BST1BFUlRJRVMgPSBbImNNYXAiLCAiZGVmYXVsdEVuY29kaW5nIiwgImRpZmZlcmVuY2VzIiwgImlzU3ltYm9saWNGb250IiwgInNlYWNNYXAiLCAidG9Gb250Q2hhciIsICJ0b1VuaWNvZGUiLCAidm1ldHJpY3MiLCAid2lkdGhzIl07Cit2YXIgRm9udEZsYWdzID0geworICBGaXhlZFBpdGNoOiAxLAorICBTZXJpZjogMiwKKyAgU3ltYm9saWM6IDQsCisgIFNjcmlwdDogOCwKKyAgTm9uc3ltYm9saWM6IDMyLAorICBJdGFsaWM6IDY0LAorICBBbGxDYXA6IDY1NTM2LAorICBTbWFsbENhcDogMTMxMDcyLAorICBGb3JjZUJvbGQ6IDI2MjE0NAorfTsKK2V4cG9ydHMuRm9udEZsYWdzID0gRm9udEZsYWdzOwordmFyIE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZyA9IFsiLm5vdGRlZiIsICIubnVsbCIsICJub25tYXJraW5ncmV0dXJuIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAiZ3JhdmUiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIkFkaWVyZXNpcyIsICJBcmluZyIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLCAiYWFjdXRlIiwgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvdGlsZGUiLCAidWFjdXRlIiwgInVncmF2ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLCAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwgInJlZ2lzdGVyZWQiLCAiY29weXJpZ2h0IiwgInRyYWRlbWFyayIsICJhY3V0ZSIsICJkaWVyZXNpcyIsICJub3RlcXVhbCIsICJBRSIsICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLCAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsICJwcm9kdWN0IiwgInBpIiwgImludGVncmFsIiwgIm9yZGZlbWluaW5lIiwgIm9yZG1hc2N1bGluZSIsICJPbWVnYSIsICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsICJyYWRpY2FsIiwgImZsb3JpbiIsICJhcHByb3hlcXVhbCIsICJEZWx0YSIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgIm5vbmJyZWFraW5nc3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgIkxzbGFzaCIsICJsc2xhc2giLCAiU2Nhcm9uIiwgInNjYXJvbiIsICJaY2Fyb24iLCAiemNhcm9uIiwgImJyb2tlbmJhciIsICJFdGgiLCAiZXRoIiwgIllhY3V0ZSIsICJ5YWN1dGUiLCAiVGhvcm4iLCAidGhvcm4iLCAibWludXMiLCAibXVsdGlwbHkiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJvbmVoYWxmIiwgIm9uZXF1YXJ0ZXIiLCAidGhyZWVxdWFydGVycyIsICJmcmFuYyIsICJHYnJldmUiLCAiZ2JyZXZlIiwgIklkb3RhY2NlbnQiLCAiU2NlZGlsbGEiLCAic2NlZGlsbGEiLCAiQ2FjdXRlIiwgImNhY3V0ZSIsICJDY2Fyb24iLCAiY2Nhcm9uIiwgImRjcm9hdCJdOworCitmdW5jdGlvbiBhZGp1c3RXaWR0aHMocHJvcGVydGllcykgeworICBpZiAoIXByb3BlcnRpZXMuZm9udE1hdHJpeCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF0gPT09IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYWzBdKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFyIHNjYWxlID0gMC4wMDEgLyBwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF07CisgIHZhciBnbHlwaHNXaWR0aHMgPSBwcm9wZXJ0aWVzLndpZHRoczsKKworICBmb3IgKHZhciBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKKyAgICBnbHlwaHNXaWR0aHNbZ2x5cGhdICo9IHNjYWxlOworICB9CisKKyAgcHJvcGVydGllcy5kZWZhdWx0V2lkdGggKj0gc2NhbGU7Cit9CisKK2Z1bmN0aW9uIGFkanVzdFRvVW5pY29kZShwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcpIHsKKyAgaWYgKHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZykgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChidWlsdEluRW5jb2RpbmcgPT09IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHByb3BlcnRpZXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgdG9Vbmljb2RlID0gW10sCisgICAgICBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKworICBmb3IgKHZhciBjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKKyAgICB2YXIgZ2x5cGhOYW1lID0gYnVpbHRJbkVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICB2YXIgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CisKKyAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKKyAgICAgIHRvVW5pY29kZVtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOworICAgIH0KKyAgfQorCisgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7Cit9CisKK2Z1bmN0aW9uIGdldEZvbnRUeXBlKHR5cGUsIHN1YnR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAiVHlwZTEiOgorICAgICAgcmV0dXJuIHN1YnR5cGUgPT09ICJUeXBlMUMiID8gX3V0aWwuRm9udFR5cGUuVFlQRTFDIDogX3V0aWwuRm9udFR5cGUuVFlQRTE7CisKKyAgICBjYXNlICJDSURGb250VHlwZTAiOgorICAgICAgcmV0dXJuIHN1YnR5cGUgPT09ICJDSURGb250VHlwZTBDIiA/IF91dGlsLkZvbnRUeXBlLkNJREZPTlRUWVBFMEMgOiBfdXRpbC5Gb250VHlwZS5DSURGT05UVFlQRTA7CisKKyAgICBjYXNlICJPcGVuVHlwZSI6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuT1BFTlRZUEU7CisKKyAgICBjYXNlICJUcnVlVHlwZSI6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuVFJVRVRZUEU7CisKKyAgICBjYXNlICJDSURGb250VHlwZTIiOgorICAgICAgcmV0dXJuIF91dGlsLkZvbnRUeXBlLkNJREZPTlRUWVBFMjsKKworICAgIGNhc2UgIk1NVHlwZTEiOgorICAgICAgcmV0dXJuIF91dGlsLkZvbnRUeXBlLk1NVFlQRTE7CisKKyAgICBjYXNlICJUeXBlMCI6CisgICAgICByZXR1cm4gX3V0aWwuRm9udFR5cGUuVFlQRTA7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIF91dGlsLkZvbnRUeXBlLlVOS05PV047CisgIH0KK30KKworZnVuY3Rpb24gcmVjb3ZlckdseXBoTmFtZShuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CisgIGlmIChnbHlwaHNVbmljb2RlTWFwW25hbWVdICE9PSB1bmRlZmluZWQpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIHZhciB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkobmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CisKKyAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CisgICAgZm9yICh2YXIga2V5IGluIGdseXBoc1VuaWNvZGVNYXApIHsKKyAgICAgIGlmIChnbHlwaHNVbmljb2RlTWFwW2tleV0gPT09IHVuaWNvZGUpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAoMCwgX3V0aWwuaW5mbykoIlVuYWJsZSB0byByZWNvdmVyIGEgc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3I6ICIgKyBuYW1lKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3ZhciBHbHlwaCA9IGZ1bmN0aW9uIEdseXBoQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gR2x5cGgoZm9udENoYXIsIHVuaWNvZGUsIGFjY2VudCwgd2lkdGgsIHZtZXRyaWMsIG9wZXJhdG9yTGlzdElkLCBpc1NwYWNlLCBpc0luRm9udCkgeworICAgIHRoaXMuZm9udENoYXIgPSBmb250Q2hhcjsKKyAgICB0aGlzLnVuaWNvZGUgPSB1bmljb2RlOworICAgIHRoaXMuYWNjZW50ID0gYWNjZW50OworICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKyAgICB0aGlzLnZtZXRyaWMgPSB2bWV0cmljOworICAgIHRoaXMub3BlcmF0b3JMaXN0SWQgPSBvcGVyYXRvckxpc3RJZDsKKyAgICB0aGlzLmlzU3BhY2UgPSBpc1NwYWNlOworICAgIHRoaXMuaXNJbkZvbnQgPSBpc0luRm9udDsKKyAgfQorCisgIEdseXBoLnByb3RvdHlwZS5tYXRjaGVzRm9yQ2FjaGUgPSBmdW5jdGlvbiAoZm9udENoYXIsIHVuaWNvZGUsIGFjY2VudCwgd2lkdGgsIHZtZXRyaWMsIG9wZXJhdG9yTGlzdElkLCBpc1NwYWNlLCBpc0luRm9udCkgeworICAgIHJldHVybiB0aGlzLmZvbnRDaGFyID09PSBmb250Q2hhciAmJiB0aGlzLnVuaWNvZGUgPT09IHVuaWNvZGUgJiYgdGhpcy5hY2NlbnQgPT09IGFjY2VudCAmJiB0aGlzLndpZHRoID09PSB3aWR0aCAmJiB0aGlzLnZtZXRyaWMgPT09IHZtZXRyaWMgJiYgdGhpcy5vcGVyYXRvckxpc3RJZCA9PT0gb3BlcmF0b3JMaXN0SWQgJiYgdGhpcy5pc1NwYWNlID09PSBpc1NwYWNlICYmIHRoaXMuaXNJbkZvbnQgPT09IGlzSW5Gb250OworICB9OworCisgIHJldHVybiBHbHlwaDsKK30oKTsKKwordmFyIFRvVW5pY29kZU1hcCA9IGZ1bmN0aW9uIFRvVW5pY29kZU1hcENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFRvVW5pY29kZU1hcChjbWFwID0gW10pIHsKKyAgICB0aGlzLl9tYXAgPSBjbWFwOworICB9CisKKyAgVG9Vbmljb2RlTWFwLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgbGVuZ3RoKCkgeworICAgICAgcmV0dXJuIHRoaXMuX21hcC5sZW5ndGg7CisgICAgfSwKKworICAgIGZvckVhY2goY2FsbGJhY2spIHsKKyAgICAgIGZvciAodmFyIGNoYXJDb2RlIGluIHRoaXMuX21hcCkgeworICAgICAgICBjYWxsYmFjayhjaGFyQ29kZSwgdGhpcy5fbWFwW2NoYXJDb2RlXS5jaGFyQ29kZUF0KDApKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgaGFzKGkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBbaV0gIT09IHVuZGVmaW5lZDsKKyAgICB9LAorCisgICAgZ2V0KGkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tYXBbaV07CisgICAgfSwKKworICAgIGNoYXJDb2RlT2YodmFsdWUpIHsKKyAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKKworICAgICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkgeworICAgICAgICByZXR1cm4gbWFwLmluZGV4T2YodmFsdWUpOworICAgICAgfQorCisgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgeworICAgICAgICBpZiAobWFwW2NoYXJDb2RlXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAtMTsKKyAgICB9LAorCisgICAgYW1lbmQobWFwKSB7CisgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBtYXApIHsKKyAgICAgICAgdGhpcy5fbWFwW2NoYXJDb2RlXSA9IG1hcFtjaGFyQ29kZV07CisgICAgICB9CisgICAgfQorCisgIH07CisgIHJldHVybiBUb1VuaWNvZGVNYXA7Cit9KCk7CisKK2V4cG9ydHMuVG9Vbmljb2RlTWFwID0gVG9Vbmljb2RlTWFwOworCit2YXIgSWRlbnRpdHlUb1VuaWNvZGVNYXAgPSBmdW5jdGlvbiBJZGVudGl0eVRvVW5pY29kZU1hcENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIElkZW50aXR5VG9Vbmljb2RlTWFwKGZpcnN0Q2hhciwgbGFzdENoYXIpIHsKKyAgICB0aGlzLmZpcnN0Q2hhciA9IGZpcnN0Q2hhcjsKKyAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7CisgIH0KKworICBJZGVudGl0eVRvVW5pY29kZU1hcC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGxlbmd0aCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmxhc3RDaGFyICsgMSAtIHRoaXMuZmlyc3RDaGFyOworICAgIH0sCisKKyAgICBmb3JFYWNoKGNhbGxiYWNrKSB7CisgICAgICBmb3IgKHZhciBpID0gdGhpcy5maXJzdENoYXIsIGlpID0gdGhpcy5sYXN0Q2hhcjsgaSA8PSBpaTsgaSsrKSB7CisgICAgICAgIGNhbGxiYWNrKGksIGkpOworICAgICAgfQorICAgIH0sCisKKyAgICBoYXMoaSkgeworICAgICAgcmV0dXJuIHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyOworICAgIH0sCisKKyAgICBnZXQoaSkgeworICAgICAgaWYgKHRoaXMuZmlyc3RDaGFyIDw9IGkgJiYgaSA8PSB0aGlzLmxhc3RDaGFyKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0sCisKKyAgICBjaGFyQ29kZU9mKHYpIHsKKyAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHYpICYmIHYgPj0gdGhpcy5maXJzdENoYXIgJiYgdiA8PSB0aGlzLmxhc3RDaGFyID8gdiA6IC0xOworICAgIH0sCisKKyAgICBhbWVuZChtYXApIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpIik7CisgICAgfQorCisgIH07CisgIHJldHVybiBJZGVudGl0eVRvVW5pY29kZU1hcDsKK30oKTsKKworZXhwb3J0cy5JZGVudGl0eVRvVW5pY29kZU1hcCA9IElkZW50aXR5VG9Vbmljb2RlTWFwOworCit2YXIgT3BlblR5cGVGaWxlQnVpbGRlciA9IGZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJDbG9zdXJlKCkgeworICBmdW5jdGlvbiB3cml0ZUludDE2KGRlc3QsIG9mZnNldCwgbnVtKSB7CisgICAgZGVzdFtvZmZzZXRdID0gbnVtID4+IDggJiAweGZmOworICAgIGRlc3Rbb2Zmc2V0ICsgMV0gPSBudW0gJiAweGZmOworICB9CisKKyAgZnVuY3Rpb24gd3JpdGVJbnQzMihkZXN0LCBvZmZzZXQsIG51bSkgeworICAgIGRlc3Rbb2Zmc2V0XSA9IG51bSA+PiAyNCAmIDB4ZmY7CisgICAgZGVzdFtvZmZzZXQgKyAxXSA9IG51bSA+PiAxNiAmIDB4ZmY7CisgICAgZGVzdFtvZmZzZXQgKyAyXSA9IG51bSA+PiA4ICYgMHhmZjsKKyAgICBkZXN0W29mZnNldCArIDNdID0gbnVtICYgMHhmZjsKKyAgfQorCisgIGZ1bmN0aW9uIHdyaXRlRGF0YShkZXN0LCBvZmZzZXQsIGRhdGEpIHsKKyAgICB2YXIgaSwgaWk7CisKKyAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKKyAgICAgIGRlc3Quc2V0KGRhdGEsIG9mZnNldCk7CisgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGRlc3Rbb2Zmc2V0KytdID0gZGF0YS5jaGFyQ29kZUF0KGkpICYgMHhmZjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMCwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgZGVzdFtvZmZzZXQrK10gPSBkYXRhW2ldICYgMHhmZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBPcGVuVHlwZUZpbGVCdWlsZGVyKHNmbnQpIHsKKyAgICB0aGlzLnNmbnQgPSBzZm50OworICAgIHRoaXMudGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfQorCisgIE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl9nZXRTZWFyY2hQYXJhbXMoZW50cmllc0NvdW50LCBlbnRyeVNpemUpIHsKKyAgICB2YXIgbWF4UG93ZXIyID0gMSwKKyAgICAgICAgbG9nMiA9IDA7CisKKyAgICB3aGlsZSAoKG1heFBvd2VyMiBeIGVudHJpZXNDb3VudCkgPiBtYXhQb3dlcjIpIHsKKyAgICAgIG1heFBvd2VyMiA8PD0gMTsKKyAgICAgIGxvZzIrKzsKKyAgICB9CisKKyAgICB2YXIgc2VhcmNoUmFuZ2UgPSBtYXhQb3dlcjIgKiBlbnRyeVNpemU7CisgICAgcmV0dXJuIHsKKyAgICAgIHJhbmdlOiBzZWFyY2hSYW5nZSwKKyAgICAgIGVudHJ5OiBsb2cyLAorICAgICAgcmFuZ2VTaGlmdDogZW50cnlTaXplICogZW50cmllc0NvdW50IC0gc2VhcmNoUmFuZ2UKKyAgICB9OworICB9OworCisgIHZhciBPVEZfSEVBREVSX1NJWkUgPSAxMjsKKyAgdmFyIE9URl9UQUJMRV9FTlRSWV9TSVpFID0gMTY7CisgIE9wZW5UeXBlRmlsZUJ1aWxkZXIucHJvdG90eXBlID0geworICAgIHRvQXJyYXk6IGZ1bmN0aW9uIE9wZW5UeXBlRmlsZUJ1aWxkZXJfdG9BcnJheSgpIHsKKyAgICAgIHZhciBzZm50ID0gdGhpcy5zZm50OworICAgICAgdmFyIHRhYmxlcyA9IHRoaXMudGFibGVzOworICAgICAgdmFyIHRhYmxlc05hbWVzID0gT2JqZWN0LmtleXModGFibGVzKTsKKyAgICAgIHRhYmxlc05hbWVzLnNvcnQoKTsKKyAgICAgIHZhciBudW1UYWJsZXMgPSB0YWJsZXNOYW1lcy5sZW5ndGg7CisgICAgICB2YXIgaSwgaiwgamosIHRhYmxlLCB0YWJsZU5hbWU7CisgICAgICB2YXIgb2Zmc2V0ID0gT1RGX0hFQURFUl9TSVpFICsgbnVtVGFibGVzICogT1RGX1RBQkxFX0VOVFJZX1NJWkU7CisgICAgICB2YXIgdGFibGVPZmZzZXRzID0gW29mZnNldF07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgeworICAgICAgICB0YWJsZSA9IHRhYmxlc1t0YWJsZXNOYW1lc1tpXV07CisgICAgICAgIHZhciBwYWRkZWRMZW5ndGggPSAodGFibGUubGVuZ3RoICsgMyAmIH4zKSA+Pj4gMDsKKyAgICAgICAgb2Zmc2V0ICs9IHBhZGRlZExlbmd0aDsKKyAgICAgICAgdGFibGVPZmZzZXRzLnB1c2gob2Zmc2V0KTsKKyAgICAgIH0KKworICAgICAgdmFyIGZpbGUgPSBuZXcgVWludDhBcnJheShvZmZzZXQpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgdGFibGUgPSB0YWJsZXNbdGFibGVzTmFtZXNbaV1dOworICAgICAgICB3cml0ZURhdGEoZmlsZSwgdGFibGVPZmZzZXRzW2ldLCB0YWJsZSk7CisgICAgICB9CisKKyAgICAgIGlmIChzZm50ID09PSAidHJ1ZSIpIHsKKyAgICAgICAgc2ZudCA9ICgwLCBfdXRpbC5zdHJpbmczMikoMHgwMDAxMDAwMCk7CisgICAgICB9CisKKyAgICAgIGZpbGVbMF0gPSBzZm50LmNoYXJDb2RlQXQoMCkgJiAweGZmOworICAgICAgZmlsZVsxXSA9IHNmbnQuY2hhckNvZGVBdCgxKSAmIDB4ZmY7CisgICAgICBmaWxlWzJdID0gc2ZudC5jaGFyQ29kZUF0KDIpICYgMHhmZjsKKyAgICAgIGZpbGVbM10gPSBzZm50LmNoYXJDb2RlQXQoMykgJiAweGZmOworICAgICAgd3JpdGVJbnQxNihmaWxlLCA0LCBudW1UYWJsZXMpOworICAgICAgdmFyIHNlYXJjaFBhcmFtcyA9IE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKG51bVRhYmxlcywgMTYpOworICAgICAgd3JpdGVJbnQxNihmaWxlLCA2LCBzZWFyY2hQYXJhbXMucmFuZ2UpOworICAgICAgd3JpdGVJbnQxNihmaWxlLCA4LCBzZWFyY2hQYXJhbXMuZW50cnkpOworICAgICAgd3JpdGVJbnQxNihmaWxlLCAxMCwgc2VhcmNoUGFyYW1zLnJhbmdlU2hpZnQpOworICAgICAgb2Zmc2V0ID0gT1RGX0hFQURFUl9TSVpFOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgdGFibGVOYW1lID0gdGFibGVzTmFtZXNbaV07CisgICAgICAgIGZpbGVbb2Zmc2V0XSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDApICYgMHhmZjsKKyAgICAgICAgZmlsZVtvZmZzZXQgKyAxXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDEpICYgMHhmZjsKKyAgICAgICAgZmlsZVtvZmZzZXQgKyAyXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDIpICYgMHhmZjsKKyAgICAgICAgZmlsZVtvZmZzZXQgKyAzXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDMpICYgMHhmZjsKKyAgICAgICAgdmFyIGNoZWNrc3VtID0gMDsKKworICAgICAgICBmb3IgKGogPSB0YWJsZU9mZnNldHNbaV0sIGpqID0gdGFibGVPZmZzZXRzW2kgKyAxXTsgaiA8IGpqOyBqICs9IDQpIHsKKyAgICAgICAgICB2YXIgcXVhZCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShmaWxlLCBqKTsKKyAgICAgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtICsgcXVhZCA+Pj4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgNCwgY2hlY2tzdW0pOworICAgICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDgsIHRhYmxlT2Zmc2V0c1tpXSk7CisgICAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgMTIsIHRhYmxlc1t0YWJsZU5hbWVdLmxlbmd0aCk7CisgICAgICAgIG9mZnNldCArPSBPVEZfVEFCTEVfRU5UUllfU0laRTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZpbGU7CisgICAgfSwKKyAgICBhZGRUYWJsZTogZnVuY3Rpb24gT3BlblR5cGVGaWxlQnVpbGRlcl9hZGRUYWJsZSh0YWcsIGRhdGEpIHsKKyAgICAgIGlmICh0YWcgaW4gdGhpcy50YWJsZXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYWJsZSAiICsgdGFnICsgIiBhbHJlYWR5IGV4aXN0cyIpOworICAgICAgfQorCisgICAgICB0aGlzLnRhYmxlc1t0YWddID0gZGF0YTsKKyAgICB9CisgIH07CisgIHJldHVybiBPcGVuVHlwZUZpbGVCdWlsZGVyOworfSgpOworCit2YXIgRm9udCA9IGZ1bmN0aW9uIEZvbnRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpIHsKKyAgICB2YXIgY2hhckNvZGU7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB0aGlzLmxvYWRlZE5hbWUgPSBwcm9wZXJ0aWVzLmxvYWRlZE5hbWU7CisgICAgdGhpcy5pc1R5cGUzRm9udCA9IHByb3BlcnRpZXMuaXNUeXBlM0ZvbnQ7CisgICAgdGhpcy5taXNzaW5nRmlsZSA9IGZhbHNlOworICAgIHRoaXMuZ2x5cGhDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy5pc1NlcmlmRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBGb250RmxhZ3MuU2VyaWYpOworICAgIHRoaXMuaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlN5bWJvbGljKTsKKyAgICB0aGlzLmlzTW9ub3NwYWNlID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5GaXhlZFBpdGNoKTsKKyAgICB2YXIgdHlwZSA9IHByb3BlcnRpZXMudHlwZTsKKyAgICB2YXIgc3VidHlwZSA9IHByb3BlcnRpZXMuc3VidHlwZTsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CisgICAgbGV0IGZhbGxiYWNrTmFtZSA9ICJzYW5zLXNlcmlmIjsKKworICAgIGlmICh0aGlzLmlzTW9ub3NwYWNlKSB7CisgICAgICBmYWxsYmFja05hbWUgPSAibW9ub3NwYWNlIjsKKyAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZXJpZkZvbnQpIHsKKyAgICAgIGZhbGxiYWNrTmFtZSA9ICJzZXJpZiI7CisgICAgfQorCisgICAgdGhpcy5mYWxsYmFja05hbWUgPSBmYWxsYmFja05hbWU7CisgICAgdGhpcy5kaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CisgICAgdGhpcy53aWR0aHMgPSBwcm9wZXJ0aWVzLndpZHRoczsKKyAgICB0aGlzLmRlZmF1bHRXaWR0aCA9IHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoOworICAgIHRoaXMuY29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGU7CisgICAgdGhpcy5jTWFwID0gcHJvcGVydGllcy5jTWFwOworICAgIHRoaXMuYXNjZW50ID0gcHJvcGVydGllcy5hc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CisgICAgdGhpcy5kZXNjZW50ID0gcHJvcGVydGllcy5kZXNjZW50IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOworICAgIHRoaXMuZm9udE1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeDsKKyAgICB0aGlzLmJib3ggPSBwcm9wZXJ0aWVzLmJib3g7CisgICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKKyAgICB0aGlzLnRvVW5pY29kZSA9IHByb3BlcnRpZXMudG9Vbmljb2RlOworICAgIHRoaXMuZmFsbGJhY2tUb1VuaWNvZGUgPSBwcm9wZXJ0aWVzLmZhbGxiYWNrVG9Vbmljb2RlIHx8IG5ldyBUb1VuaWNvZGVNYXAoKTsKKyAgICB0aGlzLnRvRm9udENoYXIgPSBbXTsKKworICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09ICJUeXBlMyIpIHsKKyAgICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgeworICAgICAgICB0aGlzLnRvRm9udENoYXJbY2hhckNvZGVdID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gfHwgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmdbY2hhckNvZGVdOworICAgICAgfQorCisgICAgICB0aGlzLmZvbnRUeXBlID0gX3V0aWwuRm9udFR5cGUuVFlQRTM7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5jaWRFbmNvZGluZyA9IHByb3BlcnRpZXMuY2lkRW5jb2Rpbmc7CisgICAgdGhpcy52ZXJ0aWNhbCA9ICEhcHJvcGVydGllcy52ZXJ0aWNhbDsKKworICAgIGlmICh0aGlzLnZlcnRpY2FsKSB7CisgICAgICB0aGlzLnZtZXRyaWNzID0gcHJvcGVydGllcy52bWV0cmljczsKKyAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7CisgICAgfQorCisgICAgaWYgKCFmaWxlIHx8IGZpbGUuaXNFbXB0eSkgeworICAgICAgaWYgKGZpbGUpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCdGb250IGZpbGUgaXMgZW1wdHkgaW4gIicgKyBuYW1lICsgJyIgKCcgKyB0aGlzLmxvYWRlZE5hbWUgKyAiKSIpOworICAgICAgfQorCisgICAgICB0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgW3R5cGUsIHN1YnR5cGVdID0gZ2V0Rm9udEZpbGVUeXBlKGZpbGUsIHByb3BlcnRpZXMpOworCisgICAgaWYgKHR5cGUgIT09IHRoaXMudHlwZSB8fCBzdWJ0eXBlICE9PSB0aGlzLnN1YnR5cGUpIHsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW5jb25zaXN0ZW50IGZvbnQgZmlsZSBUeXBlL1N1YlR5cGUsIGV4cGVjdGVkOiAiICsgYCR7dGhpcy50eXBlfS8ke3RoaXMuc3VidHlwZX0gYnV0IGZvdW5kOiAke3R5cGV9LyR7c3VidHlwZX0uYCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHZhciBkYXRhOworCisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSAiTU1UeXBlMSI6CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJNTVR5cGUxIGZvbnQgKCIgKyBuYW1lICsgIiksIGZhbGxpbmcgYmFjayB0byBUeXBlMS4iKTsKKworICAgICAgICBjYXNlICJUeXBlMSI6CisgICAgICAgIGNhc2UgIkNJREZvbnRUeXBlMCI6CisgICAgICAgICAgdGhpcy5taW1ldHlwZSA9ICJmb250L29wZW50eXBlIjsKKyAgICAgICAgICB2YXIgY2ZmID0gc3VidHlwZSA9PT0gIlR5cGUxQyIgfHwgc3VidHlwZSA9PT0gIkNJREZvbnRUeXBlMEMiID8gbmV3IENGRkZvbnQoZmlsZSwgcHJvcGVydGllcykgOiBuZXcgVHlwZTFGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpOworICAgICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKKyAgICAgICAgICBkYXRhID0gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiT3BlblR5cGUiOgorICAgICAgICBjYXNlICJUcnVlVHlwZSI6CisgICAgICAgIGNhc2UgIkNJREZvbnRUeXBlMiI6CisgICAgICAgICAgdGhpcy5taW1ldHlwZSA9ICJmb250L29wZW50eXBlIjsKKyAgICAgICAgICBkYXRhID0gdGhpcy5jaGVja0FuZFJlcGFpcihuYW1lLCBmaWxlLCBwcm9wZXJ0aWVzKTsKKworICAgICAgICAgIGlmICh0aGlzLmlzT3BlblR5cGUpIHsKKyAgICAgICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIHR5cGUgPSAiT3BlblR5cGUiOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBGb250ICR7dHlwZX0gaXMgbm90IHN1cHBvcnRlZGApOworICAgICAgfQorICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKShlKTsKKyAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIHRoaXMuZm9udFR5cGUgPSBnZXRGb250VHlwZSh0eXBlLCBzdWJ0eXBlKTsKKyAgICB0aGlzLmZvbnRNYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXg7CisgICAgdGhpcy53aWR0aHMgPSBwcm9wZXJ0aWVzLndpZHRoczsKKyAgICB0aGlzLmRlZmF1bHRXaWR0aCA9IHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoOworICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CisgICAgdGhpcy5zZWFjTWFwID0gcHJvcGVydGllcy5zZWFjTWFwOworICB9CisKKyAgZnVuY3Rpb24gaW50MTYoYjAsIGIxKSB7CisgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxOworICB9CisKKyAgZnVuY3Rpb24gd3JpdGVTaWduZWRJbnQxNihieXRlcywgaW5kZXgsIHZhbHVlKSB7CisgICAgYnl0ZXNbaW5kZXggKyAxXSA9IHZhbHVlOworICAgIGJ5dGVzW2luZGV4XSA9IHZhbHVlID4+PiA4OworICB9CisKKyAgZnVuY3Rpb24gc2lnbmVkSW50MTYoYjAsIGIxKSB7CisgICAgdmFyIHZhbHVlID0gKGIwIDw8IDgpICsgYjE7CisgICAgcmV0dXJuIHZhbHVlICYgMSA8PCAxNSA/IHZhbHVlIC0gMHgxMDAwMCA6IHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gaW50MzIoYjAsIGIxLCBiMiwgYjMpIHsKKyAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKKyAgfQorCisgIGZ1bmN0aW9uIHN0cmluZzE2KHZhbHVlKSB7CisgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CisgIH0KKworICBmdW5jdGlvbiBzYWZlU3RyaW5nMTYodmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPiAweDdmZmYpIHsKKyAgICAgIHZhbHVlID0gMHg3ZmZmOworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAtMHg4MDAwKSB7CisgICAgICB2YWx1ZSA9IC0weDgwMDA7CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CisgIH0KKworICBmdW5jdGlvbiBpc1RydWVUeXBlRmlsZShmaWxlKSB7CisgICAgdmFyIGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOworICAgIHJldHVybiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoaGVhZGVyLCAwKSA9PT0gMHgwMDAxMDAwMCB8fCAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoaGVhZGVyKSA9PT0gInRydWUiOworICB9CisKKyAgZnVuY3Rpb24gaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpIHsKKyAgICBjb25zdCBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyg0KTsKKyAgICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGhlYWRlcikgPT09ICJ0dGNmIjsKKyAgfQorCisgIGZ1bmN0aW9uIGlzT3BlblR5cGVGaWxlKGZpbGUpIHsKKyAgICB2YXIgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CisgICAgcmV0dXJuICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShoZWFkZXIpID09PSAiT1RUTyI7CisgIH0KKworICBmdW5jdGlvbiBpc1R5cGUxRmlsZShmaWxlKSB7CisgICAgdmFyIGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDIpOworCisgICAgaWYgKGhlYWRlclswXSA9PT0gMHgyNSAmJiBoZWFkZXJbMV0gPT09IDB4MjEpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChoZWFkZXJbMF0gPT09IDB4ODAgJiYgaGVhZGVyWzFdID09PSAweDAxKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmdW5jdGlvbiBpc0NGRkZpbGUoZmlsZSkgeworICAgIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOworCisgICAgaWYgKGhlYWRlclswXSA+PSAxICYmIGhlYWRlclszXSA+PSAxICYmIGhlYWRlclszXSA8PSA0KSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmdW5jdGlvbiBnZXRGb250RmlsZVR5cGUoZmlsZSwgeworICAgIHR5cGUsCisgICAgc3VidHlwZSwKKyAgICBjb21wb3NpdGUKKyAgfSkgeworICAgIGxldCBmaWxlVHlwZSwgZmlsZVN1YnR5cGU7CisKKyAgICBpZiAoaXNUcnVlVHlwZUZpbGUoZmlsZSkgfHwgaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpKSB7CisgICAgICBpZiAoY29tcG9zaXRlKSB7CisgICAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWxlVHlwZSA9ICJUcnVlVHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpc09wZW5UeXBlRmlsZShmaWxlKSkgeworICAgICAgaWYgKGNvbXBvc2l0ZSkgeworICAgICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsZVR5cGUgPSAiT3BlblR5cGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNUeXBlMUZpbGUoZmlsZSkpIHsKKyAgICAgIGlmIChjb21wb3NpdGUpIHsKKyAgICAgICAgZmlsZVR5cGUgPSAiQ0lERm9udFR5cGUwIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGVUeXBlID0gdHlwZSA9PT0gIk1NVHlwZTEiID8gIk1NVHlwZTEiIDogIlR5cGUxIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzQ0ZGRmlsZShmaWxlKSkgeworICAgICAgaWYgKGNvbXBvc2l0ZSkgeworICAgICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTAiOworICAgICAgICBmaWxlU3VidHlwZSA9ICJDSURGb250VHlwZTBDIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGVUeXBlID0gdHlwZSA9PT0gIk1NVHlwZTEiID8gIk1NVHlwZTEiIDogIlR5cGUxIjsKKyAgICAgICAgZmlsZVN1YnR5cGUgPSAiVHlwZTFDIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKDAsIF91dGlsLndhcm4pKCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLiIpOworICAgICAgZmlsZVR5cGUgPSB0eXBlOworICAgICAgZmlsZVN1YnR5cGUgPSBzdWJ0eXBlOworICAgIH0KKworICAgIHJldHVybiBbZmlsZVR5cGUsIGZpbGVTdWJ0eXBlXTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkVG9Gb250Q2hhcihlbmNvZGluZywgZ2x5cGhzVW5pY29kZU1hcCwgZGlmZmVyZW5jZXMpIHsKKyAgICB2YXIgdG9Gb250Q2hhciA9IFtdLAorICAgICAgICB1bmljb2RlOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZW5jb2RpbmcubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKGVuY29kaW5nW2ldLCBnbHlwaHNVbmljb2RlTWFwKTsKKworICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CisgICAgICAgIHRvRm9udENoYXJbaV0gPSB1bmljb2RlOworICAgICAgfQorICAgIH0KKworICAgIGZvciAodmFyIGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzKSB7CisgICAgICB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkoZGlmZmVyZW5jZXNbY2hhckNvZGVdLCBnbHlwaHNVbmljb2RlTWFwKTsKKworICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CisgICAgICAgIHRvRm9udENoYXJbK2NoYXJDb2RlXSA9IHVuaWNvZGU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRvRm9udENoYXI7CisgIH0KKworICBmdW5jdGlvbiBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgbmV3R2x5cGhaZXJvSWQpIHsKKyAgICB2YXIgbmV3TWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB2YXIgdG9Gb250Q2hhciA9IFtdOworICAgIHZhciBwcml2YXRlVXNlQXJlYUluZGV4ID0gMDsKKyAgICB2YXIgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzBdOworICAgIHZhciBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKKworICAgIGZvciAodmFyIG9yaWdpbmFsQ2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKKyAgICAgIG9yaWdpbmFsQ2hhckNvZGUgfD0gMDsKKyAgICAgIHZhciBnbHlwaElkID0gY2hhckNvZGVUb0dseXBoSWRbb3JpZ2luYWxDaGFyQ29kZV07CisKKyAgICAgIGlmICghaGFzR2x5cGgoZ2x5cGhJZCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlID4gcHJpdmF0ZVVzZU9mZmV0RW5kKSB7CisgICAgICAgIHByaXZhdGVVc2VBcmVhSW5kZXgrKzsKKworICAgICAgICBpZiAocHJpdmF0ZVVzZUFyZWFJbmRleCA+PSBQUklWQVRFX1VTRV9BUkVBUy5sZW5ndGgpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlJhbiBvdXQgb2Ygc3BhY2UgaW4gZm9udCBwcml2YXRlIHVzZSBhcmVhLiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzBdOworICAgICAgICBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnRDaGFyQ29kZSA9IG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrKzsKKworICAgICAgaWYgKGdseXBoSWQgPT09IDApIHsKKyAgICAgICAgZ2x5cGhJZCA9IG5ld0dseXBoWmVyb0lkOworICAgICAgfQorCisgICAgICBuZXdNYXBbZm9udENoYXJDb2RlXSA9IGdseXBoSWQ7CisgICAgICB0b0ZvbnRDaGFyW29yaWdpbmFsQ2hhckNvZGVdID0gZm9udENoYXJDb2RlOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICB0b0ZvbnRDaGFyLAorICAgICAgY2hhckNvZGVUb0dseXBoSWQ6IG5ld01hcCwKKyAgICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0UmFuZ2VzKGdseXBocywgbnVtR2x5cGhzKSB7CisgICAgdmFyIGNvZGVzID0gW107CisKKyAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBnbHlwaHMpIHsKKyAgICAgIGlmIChnbHlwaHNbY2hhckNvZGVdID49IG51bUdseXBocykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgY29kZXMucHVzaCh7CisgICAgICAgIGZvbnRDaGFyQ29kZTogY2hhckNvZGUgfCAwLAorICAgICAgICBnbHlwaElkOiBnbHlwaHNbY2hhckNvZGVdCisgICAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoY29kZXMubGVuZ3RoID09PSAwKSB7CisgICAgICBjb2Rlcy5wdXNoKHsKKyAgICAgICAgZm9udENoYXJDb2RlOiAwLAorICAgICAgICBnbHlwaElkOiAwCisgICAgICB9KTsKKyAgICB9CisKKyAgICBjb2Rlcy5zb3J0KGZ1bmN0aW9uIGZvbnRHZXRSYW5nZXNTb3J0KGEsIGIpIHsKKyAgICAgIHJldHVybiBhLmZvbnRDaGFyQ29kZSAtIGIuZm9udENoYXJDb2RlOworICAgIH0pOworICAgIHZhciByYW5nZXMgPSBbXTsKKyAgICB2YXIgbGVuZ3RoID0gY29kZXMubGVuZ3RoOworCisgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBsZW5ndGg7KSB7CisgICAgICB2YXIgc3RhcnQgPSBjb2Rlc1tuXS5mb250Q2hhckNvZGU7CisgICAgICB2YXIgY29kZUluZGljZXMgPSBbY29kZXNbbl0uZ2x5cGhJZF07CisgICAgICArK247CisgICAgICB2YXIgZW5kID0gc3RhcnQ7CisKKyAgICAgIHdoaWxlIChuIDwgbGVuZ3RoICYmIGVuZCArIDEgPT09IGNvZGVzW25dLmZvbnRDaGFyQ29kZSkgeworICAgICAgICBjb2RlSW5kaWNlcy5wdXNoKGNvZGVzW25dLmdseXBoSWQpOworICAgICAgICArK2VuZDsKKyAgICAgICAgKytuOworCisgICAgICAgIGlmIChlbmQgPT09IDB4ZmZmZikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJhbmdlcy5wdXNoKFtzdGFydCwgZW5kLCBjb2RlSW5kaWNlc10pOworICAgIH0KKworICAgIHJldHVybiByYW5nZXM7CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVDbWFwVGFibGUoZ2x5cGhzLCBudW1HbHlwaHMpIHsKKyAgICB2YXIgcmFuZ2VzID0gZ2V0UmFuZ2VzKGdseXBocywgbnVtR2x5cGhzKTsKKyAgICB2YXIgbnVtVGFibGVzID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXVsxXSA+IDB4ZmZmZiA/IDIgOiAxOworICAgIHZhciBjbWFwID0gIlx4MDBceDAwIiArIHN0cmluZzE2KG51bVRhYmxlcykgKyAiXHgwMFx4MDMiICsgIlx4MDBceDAxIiArICgwLCBfdXRpbC5zdHJpbmczMikoNCArIG51bVRhYmxlcyAqIDgpOworICAgIHZhciBpLCBpaSwgaiwgamo7CisKKyAgICBmb3IgKGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgIGlmIChyYW5nZXNbaV1bMF0gPD0gMHhmZmZmKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHZhciBibXBMZW5ndGggPSBpICsgMTsKKworICAgIGlmIChyYW5nZXNbaV1bMF0gPCAweGZmZmYgJiYgcmFuZ2VzW2ldWzFdID09PSAweGZmZmYpIHsKKyAgICAgIHJhbmdlc1tpXVsxXSA9IDB4ZmZmZTsKKyAgICB9CisKKyAgICB2YXIgdHJhaWxpbmdSYW5nZXNDb3VudCA9IHJhbmdlc1tpXVsxXSA8IDB4ZmZmZiA/IDEgOiAwOworICAgIHZhciBzZWdDb3VudCA9IGJtcExlbmd0aCArIHRyYWlsaW5nUmFuZ2VzQ291bnQ7CisgICAgdmFyIHNlYXJjaFBhcmFtcyA9IE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKHNlZ0NvdW50LCAyKTsKKyAgICB2YXIgc3RhcnRDb3VudCA9ICIiOworICAgIHZhciBlbmRDb3VudCA9ICIiOworICAgIHZhciBpZERlbHRhcyA9ICIiOworICAgIHZhciBpZFJhbmdlT2Zmc2V0cyA9ICIiOworICAgIHZhciBnbHlwaHNJZHMgPSAiIjsKKyAgICB2YXIgYmlhcyA9IDA7CisgICAgdmFyIHJhbmdlLCBzdGFydCwgZW5kLCBjb2RlczsKKworICAgIGZvciAoaSA9IDAsIGlpID0gYm1wTGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgcmFuZ2UgPSByYW5nZXNbaV07CisgICAgICBzdGFydCA9IHJhbmdlWzBdOworICAgICAgZW5kID0gcmFuZ2VbMV07CisgICAgICBzdGFydENvdW50ICs9IHN0cmluZzE2KHN0YXJ0KTsKKyAgICAgIGVuZENvdW50ICs9IHN0cmluZzE2KGVuZCk7CisgICAgICBjb2RlcyA9IHJhbmdlWzJdOworICAgICAgdmFyIGNvbnRpZ3VvdXMgPSB0cnVlOworCisgICAgICBmb3IgKGogPSAxLCBqaiA9IGNvZGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKKyAgICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CisgICAgICAgICAgY29udGlndW91cyA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghY29udGlndW91cykgeworICAgICAgICB2YXIgb2Zmc2V0ID0gKHNlZ0NvdW50IC0gaSkgKiAyICsgYmlhcyAqIDI7CisgICAgICAgIGJpYXMgKz0gZW5kIC0gc3RhcnQgKyAxOworICAgICAgICBpZERlbHRhcyArPSBzdHJpbmcxNigwKTsKKyAgICAgICAgaWRSYW5nZU9mZnNldHMgKz0gc3RyaW5nMTYob2Zmc2V0KTsKKworICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGNvZGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKKyAgICAgICAgICBnbHlwaHNJZHMgKz0gc3RyaW5nMTYoY29kZXNbal0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgc3RhcnRDb2RlID0gY29kZXNbMF07CisgICAgICAgIGlkRGVsdGFzICs9IHN0cmluZzE2KHN0YXJ0Q29kZSAtIHN0YXJ0ICYgMHhmZmZmKTsKKyAgICAgICAgaWRSYW5nZU9mZnNldHMgKz0gc3RyaW5nMTYoMCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyYWlsaW5nUmFuZ2VzQ291bnQgPiAwKSB7CisgICAgICBlbmRDb3VudCArPSAiXHhGRlx4RkYiOworICAgICAgc3RhcnRDb3VudCArPSAiXHhGRlx4RkYiOworICAgICAgaWREZWx0YXMgKz0gIlx4MDBceDAxIjsKKyAgICAgIGlkUmFuZ2VPZmZzZXRzICs9ICJceDAwXHgwMCI7CisgICAgfQorCisgICAgdmFyIGZvcm1hdDMxNCA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNigyICogc2VnQ291bnQpICsgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLnJhbmdlKSArIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5lbnRyeSkgKyBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2VTaGlmdCkgKyBlbmRDb3VudCArICJceDAwXHgwMCIgKyBzdGFydENvdW50ICsgaWREZWx0YXMgKyBpZFJhbmdlT2Zmc2V0cyArIGdseXBoc0lkczsKKyAgICB2YXIgZm9ybWF0MzEwMTIgPSAiIjsKKyAgICB2YXIgaGVhZGVyMzEwMTIgPSAiIjsKKworICAgIGlmIChudW1UYWJsZXMgPiAxKSB7CisgICAgICBjbWFwICs9ICJceDAwXHgwMyIgKyAiXHgwMFx4MEEiICsgKDAsIF91dGlsLnN0cmluZzMyKSg0ICsgbnVtVGFibGVzICogOCArIDQgKyBmb3JtYXQzMTQubGVuZ3RoKTsKKyAgICAgIGZvcm1hdDMxMDEyID0gIiI7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gcmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgcmFuZ2UgPSByYW5nZXNbaV07CisgICAgICAgIHN0YXJ0ID0gcmFuZ2VbMF07CisgICAgICAgIGNvZGVzID0gcmFuZ2VbMl07CisgICAgICAgIHZhciBjb2RlID0gY29kZXNbMF07CisKKyAgICAgICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CisgICAgICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CisgICAgICAgICAgICBlbmQgPSByYW5nZVswXSArIGogLSAxOworICAgICAgICAgICAgZm9ybWF0MzEwMTIgKz0gKDAsIF91dGlsLnN0cmluZzMyKShzdGFydCkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGVuZCkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGNvZGUpOworICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOworICAgICAgICAgICAgY29kZSA9IGNvZGVzW2pdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcm1hdDMxMDEyICs9ICgwLCBfdXRpbC5zdHJpbmczMikoc3RhcnQpICsgKDAsIF91dGlsLnN0cmluZzMyKShyYW5nZVsxXSkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGNvZGUpOworICAgICAgfQorCisgICAgICBoZWFkZXIzMTAxMiA9ICJceDAwXHgwQyIgKyAiXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKShmb3JtYXQzMTAxMi5sZW5ndGggKyAxNikgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGZvcm1hdDMxMDEyLmxlbmd0aCAvIDEyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY21hcCArICJceDAwXHgwNCIgKyBzdHJpbmcxNihmb3JtYXQzMTQubGVuZ3RoICsgNCkgKyBmb3JtYXQzMTQgKyBoZWFkZXIzMTAxMiArIGZvcm1hdDMxMDEyOworICB9CisKKyAgZnVuY3Rpb24gdmFsaWRhdGVPUzJUYWJsZShvczIsIGZpbGUpIHsKKyAgICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0IHx8IDApICsgb3MyLm9mZnNldDsKKyAgICB2YXIgdmVyc2lvbiA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgZmlsZS5za2lwKDYwKTsKKyAgICB2YXIgc2VsZWN0aW9uID0gZmlsZS5nZXRVaW50MTYoKTsKKworICAgIGlmICh2ZXJzaW9uIDwgNCAmJiBzZWxlY3Rpb24gJiAweDAzMDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2YXIgZmlyc3RDaGFyID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICB2YXIgbGFzdENoYXIgPSBmaWxlLmdldFVpbnQxNigpOworCisgICAgaWYgKGZpcnN0Q2hhciA+IGxhc3RDaGFyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmlsZS5za2lwKDYpOworICAgIHZhciB1c1dpbkFzY2VudCA9IGZpbGUuZ2V0VWludDE2KCk7CisKKyAgICBpZiAodXNXaW5Bc2NlbnQgPT09IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvczIuZGF0YVs4XSA9IG9zMi5kYXRhWzldID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZU9TMlRhYmxlKHByb3BlcnRpZXMsIGNoYXJzdHJpbmdzLCBvdmVycmlkZSkgeworICAgIG92ZXJyaWRlID0gb3ZlcnJpZGUgfHwgeworICAgICAgdW5pdHNQZXJFbTogMCwKKyAgICAgIHlNYXg6IDAsCisgICAgICB5TWluOiAwLAorICAgICAgYXNjZW50OiAwLAorICAgICAgZGVzY2VudDogMAorICAgIH07CisgICAgdmFyIHVsVW5pY29kZVJhbmdlMSA9IDA7CisgICAgdmFyIHVsVW5pY29kZVJhbmdlMiA9IDA7CisgICAgdmFyIHVsVW5pY29kZVJhbmdlMyA9IDA7CisgICAgdmFyIHVsVW5pY29kZVJhbmdlNCA9IDA7CisgICAgdmFyIGZpcnN0Q2hhckluZGV4ID0gbnVsbDsKKyAgICB2YXIgbGFzdENoYXJJbmRleCA9IDA7CisKKyAgICBpZiAoY2hhcnN0cmluZ3MpIHsKKyAgICAgIGZvciAodmFyIGNvZGUgaW4gY2hhcnN0cmluZ3MpIHsKKyAgICAgICAgY29kZSB8PSAwOworCisgICAgICAgIGlmIChmaXJzdENoYXJJbmRleCA+IGNvZGUgfHwgIWZpcnN0Q2hhckluZGV4KSB7CisgICAgICAgICAgZmlyc3RDaGFySW5kZXggPSBjb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3RDaGFySW5kZXggPCBjb2RlKSB7CisgICAgICAgICAgbGFzdENoYXJJbmRleCA9IGNvZGU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcG9zaXRpb24gPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZVJhbmdlRm9yKShjb2RlKTsKKworICAgICAgICBpZiAocG9zaXRpb24gPCAzMikgeworICAgICAgICAgIHVsVW5pY29kZVJhbmdlMSB8PSAxIDw8IHBvc2l0aW9uOworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgNjQpIHsKKyAgICAgICAgICB1bFVuaWNvZGVSYW5nZTIgfD0gMSA8PCBwb3NpdGlvbiAtIDMyOworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgOTYpIHsKKyAgICAgICAgICB1bFVuaWNvZGVSYW5nZTMgfD0gMSA8PCBwb3NpdGlvbiAtIDY0OworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgMTIzKSB7CisgICAgICAgICAgdWxVbmljb2RlUmFuZ2U0IHw9IDEgPDwgcG9zaXRpb24gLSA5NjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVuaWNvZGUgcmFuZ2VzIEJpdHMgPiAxMjMgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZSIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChsYXN0Q2hhckluZGV4ID4gMHhmZmZmKSB7CisgICAgICAgIGxhc3RDaGFySW5kZXggPSAweGZmZmY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZpcnN0Q2hhckluZGV4ID0gMDsKKyAgICAgIGxhc3RDaGFySW5kZXggPSAyNTU7CisgICAgfQorCisgICAgdmFyIGJib3ggPSBwcm9wZXJ0aWVzLmJib3ggfHwgWzAsIDAsIDAsIDBdOworICAgIHZhciB1bml0c1BlckVtID0gb3ZlcnJpZGUudW5pdHNQZXJFbSB8fCAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWClbMF07CisgICAgdmFyIHNjYWxlID0gcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPyAxLjAgOiB1bml0c1BlckVtIC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOworICAgIHZhciB0eXBvQXNjZW50ID0gb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpOworICAgIHZhciB0eXBvRGVzY2VudCA9IG92ZXJyaWRlLmRlc2NlbnQgfHwgTWF0aC5yb3VuZChzY2FsZSAqIChwcm9wZXJ0aWVzLmRlc2NlbnQgfHwgYmJveFsxXSkpOworCisgICAgaWYgKHR5cG9EZXNjZW50ID4gMCAmJiBwcm9wZXJ0aWVzLmRlc2NlbnQgPiAwICYmIGJib3hbMV0gPCAwKSB7CisgICAgICB0eXBvRGVzY2VudCA9IC10eXBvRGVzY2VudDsKKyAgICB9CisKKyAgICB2YXIgd2luQXNjZW50ID0gb3ZlcnJpZGUueU1heCB8fCB0eXBvQXNjZW50OworICAgIHZhciB3aW5EZXNjZW50ID0gLW92ZXJyaWRlLnlNaW4gfHwgLXR5cG9EZXNjZW50OworICAgIHJldHVybiAiXHgwMFx4MDMiICsgIlx4MDJceDI0IiArICJceDAxXHhGNCIgKyAiXHgwMFx4MDUiICsgIlx4MDBceDAwIiArICJceDAyXHg4QSIgKyAiXHgwMlx4QkIiICsgIlx4MDBceDAwIiArICJceDAwXHg4QyIgKyAiXHgwMlx4OEEiICsgIlx4MDJceEJCIiArICJceDAwXHgwMCIgKyAiXHgwMVx4REYiICsgIlx4MDBceDMxIiArICJceDAxXHgwMiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwNiIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHByb3BlcnRpZXMuZml4ZWRQaXRjaCA/IDB4MDkgOiAweDAwKSArICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTEpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTIpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTMpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTQpICsgIlx4MkFceDMyXHgzMVx4MkEiICsgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDEgOiAwKSArIHN0cmluZzE2KGZpcnN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMuZmlyc3RDaGFyKSArIHN0cmluZzE2KGxhc3RDaGFySW5kZXggfHwgcHJvcGVydGllcy5sYXN0Q2hhcikgKyBzdHJpbmcxNih0eXBvQXNjZW50KSArIHN0cmluZzE2KHR5cG9EZXNjZW50KSArICJceDAwXHg2NCIgKyBzdHJpbmcxNih3aW5Bc2NlbnQpICsgc3RyaW5nMTYod2luRGVzY2VudCkgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyBzdHJpbmcxNihwcm9wZXJ0aWVzLnhIZWlnaHQpICsgc3RyaW5nMTYocHJvcGVydGllcy5jYXBIZWlnaHQpICsgc3RyaW5nMTYoMCkgKyBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyAiXHgwMFx4MDMiOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpIHsKKyAgICB2YXIgYW5nbGUgPSBNYXRoLmZsb29yKHByb3BlcnRpZXMuaXRhbGljQW5nbGUgKiAyICoqIDE2KTsKKyAgICByZXR1cm4gIlx4MDBceDAzXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKShhbmdsZSkgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICgwLCBfdXRpbC5zdHJpbmczMikocHJvcGVydGllcy5maXhlZFBpdGNoKSArICJceDAwXHgwMFx4MDBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIjsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykgeworICAgIGlmICghcHJvdG8pIHsKKyAgICAgIHByb3RvID0gW1tdLCBbXV07CisgICAgfQorCisgICAgdmFyIHN0cmluZ3MgPSBbcHJvdG9bMF1bMF0gfHwgIk9yaWdpbmFsIGxpY2VuY2UiLCBwcm90b1swXVsxXSB8fCBuYW1lLCBwcm90b1swXVsyXSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzNdIHx8ICJ1bmlxdWVJRCIsIHByb3RvWzBdWzRdIHx8IG5hbWUsIHByb3RvWzBdWzVdIHx8ICJWZXJzaW9uIDAuMTEiLCBwcm90b1swXVs2XSB8fCAiIiwgcHJvdG9bMF1bN10gfHwgIlVua25vd24iLCBwcm90b1swXVs4XSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzldIHx8ICJVbmtub3duIl07CisgICAgdmFyIHN0cmluZ3NVbmljb2RlID0gW107CisgICAgdmFyIGksIGlpLCBqLCBqaiwgc3RyOworCisgICAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07CisgICAgICB2YXIgc3RyQnVmVW5pY29kZSA9IFtdOworCisgICAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpOworICAgICAgfQorCisgICAgICBzdHJpbmdzVW5pY29kZS5wdXNoKHN0ckJ1ZlVuaWNvZGUuam9pbigiIikpOworICAgIH0KKworICAgIHZhciBuYW1lcyA9IFtzdHJpbmdzLCBzdHJpbmdzVW5pY29kZV07CisgICAgdmFyIHBsYXRmb3JtcyA9IFsiXHgwMFx4MDEiLCAiXHgwMFx4MDMiXTsKKyAgICB2YXIgZW5jb2RpbmdzID0gWyJceDAwXHgwMCIsICJceDAwXHgwMSJdOworICAgIHZhciBsYW5ndWFnZXMgPSBbIlx4MDBceDAwIiwgIlx4MDRceDA5Il07CisgICAgdmFyIG5hbWVzUmVjb3JkQ291bnQgPSBzdHJpbmdzLmxlbmd0aCAqIHBsYXRmb3Jtcy5sZW5ndGg7CisgICAgdmFyIG5hbWVUYWJsZSA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOworICAgIHZhciBzdHJPZmZzZXQgPSAwOworCisgICAgZm9yIChpID0gMCwgaWkgPSBwbGF0Zm9ybXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIHN0cnMgPSBuYW1lc1tpXTsKKworICAgICAgZm9yIChqID0gMCwgamogPSBzdHJzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgc3RyID0gc3Ryc1tqXTsKKyAgICAgICAgdmFyIG5hbWVSZWNvcmQgPSBwbGF0Zm9ybXNbaV0gKyBlbmNvZGluZ3NbaV0gKyBsYW5ndWFnZXNbaV0gKyBzdHJpbmcxNihqKSArIHN0cmluZzE2KHN0ci5sZW5ndGgpICsgc3RyaW5nMTYoc3RyT2Zmc2V0KTsKKyAgICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7CisgICAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIG5hbWVUYWJsZSArPSBzdHJpbmdzLmpvaW4oIiIpICsgc3RyaW5nc1VuaWNvZGUuam9pbigiIik7CisgICAgcmV0dXJuIG5hbWVUYWJsZTsKKyAgfQorCisgIEZvbnQucHJvdG90eXBlID0geworICAgIG5hbWU6IG51bGwsCisgICAgZm9udDogbnVsbCwKKyAgICBtaW1ldHlwZTogbnVsbCwKKyAgICBkaXNhYmxlRm9udEZhY2U6IGZhbHNlLAorCisgICAgZ2V0IHJlbmRlcmVyKCkgeworICAgICAgdmFyIHJlbmRlcmVyID0gX2ZvbnRfcmVuZGVyZXIuRm9udFJlbmRlcmVyRmFjdG9yeS5jcmVhdGUodGhpcywgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKKworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJyZW5kZXJlciIsIHJlbmRlcmVyKTsKKyAgICB9LAorCisgICAgZXhwb3J0RGF0YShleHRyYVByb3BlcnRpZXMgPSBmYWxzZSkgeworICAgICAgY29uc3QgZXhwb3J0RGF0YVByb3BlcnRpZXMgPSBleHRyYVByb3BlcnRpZXMgPyBbLi4uRVhQT1JUX0RBVEFfUFJPUEVSVElFUywgLi4uRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFU10gOiBFWFBPUlRfREFUQV9QUk9QRVJUSUVTOworICAgICAgY29uc3QgZGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICBsZXQgcHJvcGVydHksIHZhbHVlOworCisgICAgICBmb3IgKHByb3BlcnR5IG9mIGV4cG9ydERhdGFQcm9wZXJ0aWVzKSB7CisgICAgICAgIHZhbHVlID0gdGhpc1twcm9wZXJ0eV07CisKKyAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBkYXRhW3Byb3BlcnR5XSA9IHZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisKKyAgICBmYWxsYmFja1RvU3lzdGVtRm9udDogZnVuY3Rpb24gRm9udF9mYWxsYmFja1RvU3lzdGVtRm9udCgpIHsKKyAgICAgIHRoaXMubWlzc2luZ0ZpbGUgPSB0cnVlOworICAgICAgdmFyIG5hbWUgPSB0aGlzLm5hbWU7CisgICAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKKyAgICAgIHZhciBzdWJ0eXBlID0gdGhpcy5zdWJ0eXBlOworICAgICAgbGV0IGZvbnROYW1lID0gbmFtZS5yZXBsYWNlKC9bLF9dL2csICItIikucmVwbGFjZSgvXHMvZywgIiIpOworICAgICAgdmFyIHN0ZEZvbnRNYXAgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN0ZEZvbnRNYXApKCksCisgICAgICAgICAgbm9uU3RkRm9udE1hcCA9ICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0Tm9uU3RkRm9udE1hcCkoKTsKKyAgICAgIHZhciBpc1N0YW5kYXJkRm9udCA9ICEhc3RkRm9udE1hcFtmb250TmFtZV0gfHwgISEobm9uU3RkRm9udE1hcFtmb250TmFtZV0gJiYgc3RkRm9udE1hcFtub25TdGRGb250TWFwW2ZvbnROYW1lXV0pOworICAgICAgZm9udE5hbWUgPSBzdGRGb250TWFwW2ZvbnROYW1lXSB8fCBub25TdGRGb250TWFwW2ZvbnROYW1lXSB8fCBmb250TmFtZTsKKyAgICAgIHRoaXMuYm9sZCA9IGZvbnROYW1lLnNlYXJjaCgvYm9sZC9naSkgIT09IC0xOworICAgICAgdGhpcy5pdGFsaWMgPSBmb250TmFtZS5zZWFyY2goL29ibGlxdWUvZ2kpICE9PSAtMSB8fCBmb250TmFtZS5zZWFyY2goL2l0YWxpYy9naSkgIT09IC0xOworICAgICAgdGhpcy5ibGFjayA9IG5hbWUuc2VhcmNoKC9CbGFjay9nKSAhPT0gLTE7CisgICAgICB0aGlzLnJlbWVhc3VyZSA9IE9iamVjdC5rZXlzKHRoaXMud2lkdGhzKS5sZW5ndGggPiAwOworCisgICAgICBpZiAoaXNTdGFuZGFyZEZvbnQgJiYgdHlwZSA9PT0gIkNJREZvbnRUeXBlMiIgJiYgdGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKCJJZGVudGl0eS0iKSkgeworICAgICAgICBjb25zdCBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKTsKKyAgICAgICAgY29uc3QgbWFwID0gW107CisKKyAgICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMpIHsKKyAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IEdseXBoTWFwRm9yU3RhbmRhcmRGb250c1tjaGFyQ29kZV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoL0FyaWFsLT9CbGFjay9pLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICB2YXIgU3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrID0gKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2spKCk7CisKKyAgICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaykgeworICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2tbY2hhckNvZGVdOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgvQ2FsaWJyaS9pLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICBjb25zdCBTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSkoKTsKKworICAgICAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gU3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpKSB7CisgICAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaVtjaGFyQ29kZV07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIGlzSWRlbnRpdHlVbmljb2RlID0gdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcDsKKworICAgICAgICBpZiAoIWlzSWRlbnRpdHlVbmljb2RlKSB7CisgICAgICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgeworICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSB1bmljb2RlQ2hhckNvZGU7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBtYXA7CisgICAgICAgIHRoaXMudG9Vbmljb2RlID0gbmV3IFRvVW5pY29kZU1hcChtYXApOworICAgICAgfSBlbHNlIGlmICgvU3ltYm9sL2kudGVzdChmb250TmFtZSkpIHsKKyAgICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKF9lbmNvZGluZ3MuU3ltYm9sU2V0RW5jb2RpbmcsICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCksIHRoaXMuZGlmZmVyZW5jZXMpOworICAgICAgfSBlbHNlIGlmICgvRGluZ2JhdHMvaS50ZXN0KGZvbnROYW1lKSkgeworICAgICAgICBpZiAoL1dpbmdkaW5ncy9pLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIk5vbi1lbWJlZGRlZCBXaW5nZGluZ3MgZm9udCwgZmFsbGluZyBiYWNrIHRvIFphcGZEaW5nYmF0cy4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihfZW5jb2RpbmdzLlphcGZEaW5nYmF0c0VuY29kaW5nLCAoMCwgX2dseXBobGlzdC5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGUpKCksIHRoaXMuZGlmZmVyZW5jZXMpOworICAgICAgfSBlbHNlIGlmIChpc1N0YW5kYXJkRm9udCkgeworICAgICAgICB0aGlzLnRvRm9udENoYXIgPSBidWlsZFRvRm9udENoYXIodGhpcy5kZWZhdWx0RW5jb2RpbmcsICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCksIHRoaXMuZGlmZmVyZW5jZXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CisgICAgICAgIGNvbnN0IG1hcCA9IFtdOworICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSA9PiB7CisgICAgICAgICAgaWYgKCF0aGlzLmNvbXBvc2l0ZSkgeworICAgICAgICAgICAgdmFyIGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdIHx8IHRoaXMuZGVmYXVsdEVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOworCisgICAgICAgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKKyAgICAgICAgICAgICAgdW5pY29kZUNoYXJDb2RlID0gdW5pY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICYmIHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKKyAgICAgICAgICBpZiAoL1ZlcmRhbmEvaS50ZXN0KG5hbWUpKSB7CisgICAgICAgICAgICBjb25zdCBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMpIHsKKyAgICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBHbHlwaE1hcEZvclN0YW5kYXJkRm9udHNbY2hhckNvZGVdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKKyAgICAgIH0KKworICAgICAgdGhpcy5sb2FkZWROYW1lID0gZm9udE5hbWUuc3BsaXQoIi0iKVswXTsKKyAgICAgIHRoaXMuZm9udFR5cGUgPSBnZXRGb250VHlwZSh0eXBlLCBzdWJ0eXBlKTsKKyAgICB9LAorICAgIGNoZWNrQW5kUmVwYWlyOiBmdW5jdGlvbiBGb250X2NoZWNrQW5kUmVwYWlyKG5hbWUsIGZvbnQsIHByb3BlcnRpZXMpIHsKKyAgICAgIGNvbnN0IFZBTElEX1RBQkxFUyA9IFsiT1MvMiIsICJjbWFwIiwgImhlYWQiLCAiaGhlYSIsICJobXR4IiwgIm1heHAiLCAibmFtZSIsICJwb3N0IiwgImxvY2EiLCAiZ2x5ZiIsICJmcGdtIiwgInByZXAiLCAiY3Z0ICIsICJDRkYgIl07CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUYWJsZXMoZmlsZSwgbnVtVGFibGVzKSB7CisgICAgICAgIGNvbnN0IHRhYmxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgIHRhYmxlc1siT1MvMiJdID0gbnVsbDsKKyAgICAgICAgdGFibGVzLmNtYXAgPSBudWxsOworICAgICAgICB0YWJsZXMuaGVhZCA9IG51bGw7CisgICAgICAgIHRhYmxlcy5oaGVhID0gbnVsbDsKKyAgICAgICAgdGFibGVzLmhtdHggPSBudWxsOworICAgICAgICB0YWJsZXMubWF4cCA9IG51bGw7CisgICAgICAgIHRhYmxlcy5uYW1lID0gbnVsbDsKKyAgICAgICAgdGFibGVzLnBvc3QgPSBudWxsOworCisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgICBjb25zdCB0YWJsZSA9IHJlYWRUYWJsZUVudHJ5KGZpbGUpOworCisgICAgICAgICAgaWYgKCFWQUxJRF9UQUJMRVMuaW5jbHVkZXModGFibGUudGFnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRhYmxlLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGFibGVzW3RhYmxlLnRhZ10gPSB0YWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0YWJsZXM7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUYWJsZUVudHJ5KGZpbGUpIHsKKyAgICAgICAgdmFyIHRhZyA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShmaWxlLmdldEJ5dGVzKDQpKTsKKyAgICAgICAgdmFyIGNoZWNrc3VtID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICB2YXIgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICB2YXIgbGVuZ3RoID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICB2YXIgcHJldmlvdXNQb3NpdGlvbiA9IGZpbGUucG9zOworICAgICAgICBmaWxlLnBvcyA9IGZpbGUuc3RhcnQgPyBmaWxlLnN0YXJ0IDogMDsKKyAgICAgICAgZmlsZS5za2lwKG9mZnNldCk7CisgICAgICAgIHZhciBkYXRhID0gZmlsZS5nZXRCeXRlcyhsZW5ndGgpOworICAgICAgICBmaWxlLnBvcyA9IHByZXZpb3VzUG9zaXRpb247CisKKyAgICAgICAgaWYgKHRhZyA9PT0gImhlYWQiKSB7CisgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOV0gPSBkYXRhWzEwXSA9IGRhdGFbMTFdID0gMDsKKyAgICAgICAgICBkYXRhWzE3XSB8PSAweDIwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICB0YWcsCisgICAgICAgICAgY2hlY2tzdW0sCisgICAgICAgICAgbGVuZ3RoLAorICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICBkYXRhCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0dGYpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICB2ZXJzaW9uOiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykodHRmLmdldEJ5dGVzKDQpKSwKKyAgICAgICAgICBudW1UYWJsZXM6IHR0Zi5nZXRVaW50MTYoKSwKKyAgICAgICAgICBzZWFyY2hSYW5nZTogdHRmLmdldFVpbnQxNigpLAorICAgICAgICAgIGVudHJ5U2VsZWN0b3I6IHR0Zi5nZXRVaW50MTYoKSwKKyAgICAgICAgICByYW5nZVNoaWZ0OiB0dGYuZ2V0VWludDE2KCkKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkhlYWRlcih0dGMpIHsKKyAgICAgICAgY29uc3QgdHRjVGFnID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKHR0Yy5nZXRCeXRlcyg0KSk7CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHR0Y1RhZyA9PT0gInR0Y2YiLCAiTXVzdCBiZSBhIFRydWVUeXBlIENvbGxlY3Rpb24gZm9udC4iKTsKKyAgICAgICAgY29uc3QgbWFqb3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpOworICAgICAgICBjb25zdCBtaW5vclZlcnNpb24gPSB0dGMuZ2V0VWludDE2KCk7CisgICAgICAgIGNvbnN0IG51bUZvbnRzID0gdHRjLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgIGNvbnN0IG9mZnNldFRhYmxlID0gW107CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Gb250czsgaSsrKSB7CisgICAgICAgICAgb2Zmc2V0VGFibGUucHVzaCh0dGMuZ2V0SW50MzIoKSA+Pj4gMCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBoZWFkZXIgPSB7CisgICAgICAgICAgdHRjVGFnLAorICAgICAgICAgIG1ham9yVmVyc2lvbiwKKyAgICAgICAgICBtaW5vclZlcnNpb24sCisgICAgICAgICAgbnVtRm9udHMsCisgICAgICAgICAgb2Zmc2V0VGFibGUKKyAgICAgICAgfTsKKworICAgICAgICBzd2l0Y2ggKG1ham9yVmVyc2lvbikgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXI7CisKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBoZWFkZXIuZHNpZ1RhZyA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgICAgaGVhZGVyLmRzaWdMZW5ndGggPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDsKKyAgICAgICAgICAgIGhlYWRlci5kc2lnT2Zmc2V0ID0gdHRjLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIFRydWVUeXBlIENvbGxlY3Rpb24gbWFqb3JWZXJzaW9uOiAke21ham9yVmVyc2lvbn0uYCk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKHR0YywgZm9udE5hbWUpIHsKKyAgICAgICAgY29uc3QgeworICAgICAgICAgIG51bUZvbnRzLAorICAgICAgICAgIG9mZnNldFRhYmxlCisgICAgICAgIH0gPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yyk7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Gb250czsgaSsrKSB7CisgICAgICAgICAgdHRjLnBvcyA9ICh0dGMuc3RhcnQgfHwgMCkgKyBvZmZzZXRUYWJsZVtpXTsKKyAgICAgICAgICBjb25zdCBwb3RlbnRpYWxIZWFkZXIgPSByZWFkT3BlblR5cGVIZWFkZXIodHRjKTsKKyAgICAgICAgICBjb25zdCBwb3RlbnRpYWxUYWJsZXMgPSByZWFkVGFibGVzKHR0YywgcG90ZW50aWFsSGVhZGVyLm51bVRhYmxlcyk7CisKKyAgICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlcy5uYW1lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZm9udCBtdXN0IGNvbnRhaW4gYSAibmFtZSIgdGFibGUuJyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgbmFtZVRhYmxlID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7CisKKyAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamogPSBuYW1lVGFibGUubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgZm9yIChsZXQgayA9IDAsIGtrID0gbmFtZVRhYmxlW2pdLmxlbmd0aDsgayA8IGtrOyBrKyspIHsKKyAgICAgICAgICAgICAgY29uc3QgbmFtZUVudHJ5ID0gbmFtZVRhYmxlW2pdW2tdOworCisgICAgICAgICAgICAgIGlmIChuYW1lRW50cnkgJiYgbmFtZUVudHJ5LnJlcGxhY2UoL1xzL2csICIiKSA9PT0gZm9udE5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgaGVhZGVyOiBwb3RlbnRpYWxIZWFkZXIsCisgICAgICAgICAgICAgICAgICB0YWJsZXM6IHBvdGVudGlhbFRhYmxlcworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFRydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiAiJHtmb250TmFtZX0iIGZvbnQuYCk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRDbWFwVGFibGUoY21hcCwgZmlsZSwgaXNTeW1ib2xpY0ZvbnQsIGhhc0VuY29kaW5nKSB7CisgICAgICAgIGlmICghY21hcCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTm8gY21hcCB0YWJsZSBhdmFpbGFibGUuIik7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAorICAgICAgICAgICAgZW5jb2RpbmdJZDogLTEsCisgICAgICAgICAgICBtYXBwaW5nczogW10sCisgICAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzZWdtZW50OworICAgICAgICB2YXIgc3RhcnQgPSAoZmlsZS5zdGFydCA/IGZpbGUuc3RhcnQgOiAwKSArIGNtYXAub2Zmc2V0OworICAgICAgICBmaWxlLnBvcyA9IHN0YXJ0OworICAgICAgICBmaWxlLnNraXAoMik7CisgICAgICAgIHZhciBudW1UYWJsZXMgPSBmaWxlLmdldFVpbnQxNigpOworICAgICAgICB2YXIgcG90ZW50aWFsVGFibGU7CisgICAgICAgIHZhciBjYW5CcmVhayA9IGZhbHNlOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKKyAgICAgICAgICB2YXIgcGxhdGZvcm1JZCA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgICAgICAgdmFyIGVuY29kaW5nSWQgPSBmaWxlLmdldFVpbnQxNigpOworICAgICAgICAgIHZhciBvZmZzZXQgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgdmFyIHVzZVRhYmxlID0gZmFsc2U7CisKKyAgICAgICAgICBpZiAocG90ZW50aWFsVGFibGUgJiYgcG90ZW50aWFsVGFibGUucGxhdGZvcm1JZCA9PT0gcGxhdGZvcm1JZCAmJiBwb3RlbnRpYWxUYWJsZS5lbmNvZGluZ0lkID09PSBlbmNvZGluZ0lkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocGxhdGZvcm1JZCA9PT0gMCAmJiAoZW5jb2RpbmdJZCA9PT0gMCB8fCBlbmNvZGluZ0lkID09PSAxIHx8IGVuY29kaW5nSWQgPT09IDMpKSB7CisgICAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChwbGF0Zm9ybUlkID09PSAxICYmIGVuY29kaW5nSWQgPT09IDApIHsKKyAgICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMSAmJiAoaGFzRW5jb2RpbmcgfHwgIXBvdGVudGlhbFRhYmxlKSkgeworICAgICAgICAgICAgdXNlVGFibGUgPSB0cnVlOworCisgICAgICAgICAgICBpZiAoIWlzU3ltYm9saWNGb250KSB7CisgICAgICAgICAgICAgIGNhbkJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGlzU3ltYm9saWNGb250ICYmIHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMCkgeworICAgICAgICAgICAgdXNlVGFibGUgPSB0cnVlOworICAgICAgICAgICAgY2FuQnJlYWsgPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh1c2VUYWJsZSkgeworICAgICAgICAgICAgcG90ZW50aWFsVGFibGUgPSB7CisgICAgICAgICAgICAgIHBsYXRmb3JtSWQsCisgICAgICAgICAgICAgIGVuY29kaW5nSWQsCisgICAgICAgICAgICAgIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoY2FuQnJlYWspIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3RlbnRpYWxUYWJsZSkgeworICAgICAgICAgIGZpbGUucG9zID0gc3RhcnQgKyBwb3RlbnRpYWxUYWJsZS5vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlIHx8IGZpbGUucGVla0J5dGUoKSA9PT0gLTEpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkNvdWxkIG5vdCBmaW5kIGEgcHJlZmVycmVkIGNtYXAgdGFibGUuIik7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAorICAgICAgICAgICAgZW5jb2RpbmdJZDogLTEsCisgICAgICAgICAgICBtYXBwaW5nczogW10sCisgICAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmb3JtYXQgPSBmaWxlLmdldFVpbnQxNigpOworICAgICAgICBmaWxlLnNraXAoMiArIDIpOworICAgICAgICB2YXIgaGFzU2hvcnRDbWFwID0gZmFsc2U7CisgICAgICAgIHZhciBtYXBwaW5ncyA9IFtdOworICAgICAgICB2YXIgaiwgZ2x5cGhJZDsKKworICAgICAgICBpZiAoZm9ybWF0ID09PSAwKSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisgICAgICAgICAgICB2YXIgaW5kZXggPSBmaWxlLmdldEJ5dGUoKTsKKworICAgICAgICAgICAgaWYgKCFpbmRleCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgIGNoYXJDb2RlOiBqLAorICAgICAgICAgICAgICBnbHlwaElkOiBpbmRleAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaGFzU2hvcnRDbWFwID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDQpIHsKKyAgICAgICAgICB2YXIgc2VnQ291bnQgPSBmaWxlLmdldFVpbnQxNigpID4+IDE7CisgICAgICAgICAgZmlsZS5za2lwKDYpOworICAgICAgICAgIHZhciBzZWdJbmRleCwKKyAgICAgICAgICAgICAgc2VnbWVudHMgPSBbXTsKKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50cy5wdXNoKHsKKyAgICAgICAgICAgICAgZW5kOiBmaWxlLmdldFVpbnQxNigpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmaWxlLnNraXAoMik7CisKKyAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykgeworICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLnN0YXJ0ID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykgeworICAgICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLmRlbHRhID0gZmlsZS5nZXRVaW50MTYoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgb2Zmc2V0c0NvdW50ID0gMDsKKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOworICAgICAgICAgICAgdmFyIHJhbmdlT2Zmc2V0ID0gZmlsZS5nZXRVaW50MTYoKTsKKworICAgICAgICAgICAgaWYgKCFyYW5nZU9mZnNldCkgeworICAgICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gLTE7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgb2Zmc2V0SW5kZXggPSAocmFuZ2VPZmZzZXQgPj4gMSkgLSAoc2VnQ291bnQgLSBzZWdJbmRleCk7CisgICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7CisgICAgICAgICAgICBvZmZzZXRzQ291bnQgPSBNYXRoLm1heChvZmZzZXRzQ291bnQsIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIG9mZnNldHMgPSBbXTsKKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvZmZzZXRzQ291bnQ7IGorKykgeworICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKGZpbGUuZ2V0VWludDE2KCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CisgICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOworICAgICAgICAgICAgc3RhcnQgPSBzZWdtZW50LnN0YXJ0OworICAgICAgICAgICAgdmFyIGVuZCA9IHNlZ21lbnQuZW5kOworICAgICAgICAgICAgdmFyIGRlbHRhID0gc2VnbWVudC5kZWx0YTsKKyAgICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDsKKworICAgICAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgaWYgKGogPT09IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZ2x5cGhJZCA9IG9mZnNldEluZGV4IDwgMCA/IGogOiBvZmZzZXRzW29mZnNldEluZGV4ICsgaiAtIHN0YXJ0XTsKKyAgICAgICAgICAgICAgZ2x5cGhJZCA9IGdseXBoSWQgKyBkZWx0YSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgICAgY2hhckNvZGU6IGosCisgICAgICAgICAgICAgICAgZ2x5cGhJZAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA2KSB7CisgICAgICAgICAgdmFyIGZpcnN0Q29kZSA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgICAgICAgdmFyIGVudHJ5Q291bnQgPSBmaWxlLmdldFVpbnQxNigpOworCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGVudHJ5Q291bnQ7IGorKykgeworICAgICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CisgICAgICAgICAgICB2YXIgY2hhckNvZGUgPSBmaXJzdENvZGUgKyBqOworICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CisgICAgICAgICAgICAgIGNoYXJDb2RlLAorICAgICAgICAgICAgICBnbHlwaElkCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJjbWFwIHRhYmxlIGhhcyB1bnN1cHBvcnRlZCBmb3JtYXQ6ICIgKyBmb3JtYXQpOworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKKyAgICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAorICAgICAgICAgICAgbWFwcGluZ3M6IFtdLAorICAgICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBtYXBwaW5ncy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICAgICAgcmV0dXJuIGEuY2hhckNvZGUgLSBiLmNoYXJDb2RlOworICAgICAgICB9KTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAobWFwcGluZ3NbaSAtIDFdLmNoYXJDb2RlID09PSBtYXBwaW5nc1tpXS5jaGFyQ29kZSkgeworICAgICAgICAgICAgbWFwcGluZ3Muc3BsaWNlKGksIDEpOworICAgICAgICAgICAgaS0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgcGxhdGZvcm1JZDogcG90ZW50aWFsVGFibGUucGxhdGZvcm1JZCwKKyAgICAgICAgICBlbmNvZGluZ0lkOiBwb3RlbnRpYWxUYWJsZS5lbmNvZGluZ0lkLAorICAgICAgICAgIG1hcHBpbmdzLAorICAgICAgICAgIGhhc1Nob3J0Q21hcAorICAgICAgICB9OworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZU1ldHJpY3MoZmlsZSwgaGVhZGVyLCBtZXRyaWNzLCBudW1HbHlwaHMsIGR1cEZpcnN0RW50cnkpIHsKKyAgICAgICAgaWYgKCFoZWFkZXIpIHsKKyAgICAgICAgICBpZiAobWV0cmljcykgeworICAgICAgICAgICAgbWV0cmljcy5kYXRhID0gbnVsbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0ID8gZmlsZS5zdGFydCA6IDApICsgaGVhZGVyLm9mZnNldDsKKyAgICAgICAgZmlsZS5wb3MgKz0gNDsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgZmlsZS5wb3MgKz0gODsKKyAgICAgICAgZmlsZS5wb3MgKz0gMjsKKyAgICAgICAgdmFyIG51bU9mTWV0cmljcyA9IGZpbGUuZ2V0VWludDE2KCk7CisKKyAgICAgICAgaWYgKG51bU9mTWV0cmljcyA+IG51bUdseXBocykgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVGhlIG51bU9mTWV0cmljcyAoIiArIG51bU9mTWV0cmljcyArICIpIHNob3VsZCBub3QgYmUgIiArICJncmVhdGVyIHRoYW4gdGhlIG51bUdseXBocyAoIiArIG51bUdseXBocyArICIpIik7CisgICAgICAgICAgbnVtT2ZNZXRyaWNzID0gbnVtR2x5cGhzOworICAgICAgICAgIGhlYWRlci5kYXRhWzM0XSA9IChudW1PZk1ldHJpY3MgJiAweGZmMDApID4+IDg7CisgICAgICAgICAgaGVhZGVyLmRhdGFbMzVdID0gbnVtT2ZNZXRyaWNzICYgMHgwMGZmOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG51bU9mU2lkZWJlYXJpbmdzID0gbnVtR2x5cGhzIC0gbnVtT2ZNZXRyaWNzOworICAgICAgICB2YXIgbnVtTWlzc2luZyA9IG51bU9mU2lkZWJlYXJpbmdzIC0gKG1ldHJpY3MubGVuZ3RoIC0gbnVtT2ZNZXRyaWNzICogNCA+PiAxKTsKKworICAgICAgICBpZiAobnVtTWlzc2luZyA+IDApIHsKKyAgICAgICAgICB2YXIgZW50cmllcyA9IG5ldyBVaW50OEFycmF5KG1ldHJpY3MubGVuZ3RoICsgbnVtTWlzc2luZyAqIDIpOworICAgICAgICAgIGVudHJpZXMuc2V0KG1ldHJpY3MuZGF0YSk7CisKKyAgICAgICAgICBpZiAoZHVwRmlyc3RFbnRyeSkgeworICAgICAgICAgICAgZW50cmllc1ttZXRyaWNzLmxlbmd0aF0gPSBtZXRyaWNzLmRhdGFbMl07CisgICAgICAgICAgICBlbnRyaWVzW21ldHJpY3MubGVuZ3RoICsgMV0gPSBtZXRyaWNzLmRhdGFbM107CisgICAgICAgICAgfQorCisgICAgICAgICAgbWV0cmljcy5kYXRhID0gZW50cmllczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgZGVzdCwgZGVzdFN0YXJ0LCBoaW50c1ZhbGlkKSB7CisgICAgICAgIHZhciBnbHlwaFByb2ZpbGUgPSB7CisgICAgICAgICAgbGVuZ3RoOiAwLAorICAgICAgICAgIHNpemVPZkluc3RydWN0aW9uczogMAorICAgICAgICB9OworCisgICAgICAgIGlmIChzb3VyY2VFbmQgLSBzb3VyY2VTdGFydCA8PSAxMikgeworICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ2x5ZiA9IHNvdXJjZS5zdWJhcnJheShzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKyAgICAgICAgdmFyIGNvbnRvdXJzQ291bnQgPSBzaWduZWRJbnQxNihnbHlmWzBdLCBnbHlmWzFdKTsKKworICAgICAgICBpZiAoY29udG91cnNDb3VudCA8IDApIHsKKyAgICAgICAgICBjb250b3Vyc0NvdW50ID0gLTE7CisgICAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCAwLCBjb250b3Vyc0NvdW50KTsKKyAgICAgICAgICBkZXN0LnNldChnbHlmLCBkZXN0U3RhcnQpOworICAgICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlmLmxlbmd0aDsKKyAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGksCisgICAgICAgICAgICBqID0gMTAsCisgICAgICAgICAgICBmbGFnc0NvdW50ID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udG91cnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgdmFyIGVuZFBvaW50ID0gZ2x5ZltqXSA8PCA4IHwgZ2x5ZltqICsgMV07CisgICAgICAgICAgZmxhZ3NDb3VudCA9IGVuZFBvaW50ICsgMTsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgIH0KKworICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zU3RhcnQgPSBqOworICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gZ2x5ZltqXSA8PCA4IHwgZ2x5ZltqICsgMV07CisgICAgICAgIGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnNMZW5ndGg7CisgICAgICAgIGogKz0gMiArIGluc3RydWN0aW9uc0xlbmd0aDsKKyAgICAgICAgdmFyIGluc3RydWN0aW9uc0VuZCA9IGo7CisgICAgICAgIHZhciBjb29yZGluYXRlc0xlbmd0aCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsYWdzQ291bnQ7IGkrKykgeworICAgICAgICAgIHZhciBmbGFnID0gZ2x5ZltqKytdOworCisgICAgICAgICAgaWYgKGZsYWcgJiAweGMwKSB7CisgICAgICAgICAgICBnbHlmW2ogLSAxXSA9IGZsYWcgJiAweDNmOworICAgICAgICAgIH0KKworICAgICAgICAgIGxldCB4TGVuZ3RoID0gMjsKKworICAgICAgICAgIGlmIChmbGFnICYgMikgeworICAgICAgICAgICAgeExlbmd0aCA9IDE7CisgICAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMTYpIHsKKyAgICAgICAgICAgIHhMZW5ndGggPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGxldCB5TGVuZ3RoID0gMjsKKworICAgICAgICAgIGlmIChmbGFnICYgNCkgeworICAgICAgICAgICAgeUxlbmd0aCA9IDE7CisgICAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMzIpIHsKKyAgICAgICAgICAgIHlMZW5ndGggPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IHh5TGVuZ3RoID0geExlbmd0aCArIHlMZW5ndGg7CisgICAgICAgICAgY29vcmRpbmF0ZXNMZW5ndGggKz0geHlMZW5ndGg7CisKKyAgICAgICAgICBpZiAoZmxhZyAmIDgpIHsKKyAgICAgICAgICAgIHZhciByZXBlYXQgPSBnbHlmW2orK107CisgICAgICAgICAgICBpICs9IHJlcGVhdDsKKyAgICAgICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHJlcGVhdCAqIHh5TGVuZ3RoOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb29yZGluYXRlc0xlbmd0aCA9PT0gMCkgeworICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ2x5cGhEYXRhTGVuZ3RoID0gaiArIGNvb3JkaW5hdGVzTGVuZ3RoOworCisgICAgICAgIGlmIChnbHlwaERhdGFMZW5ndGggPiBnbHlmLmxlbmd0aCkgeworICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWhpbnRzVmFsaWQgJiYgaW5zdHJ1Y3Rpb25zTGVuZ3RoID4gMCkgeworICAgICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoMCwgaW5zdHJ1Y3Rpb25zU3RhcnQpLCBkZXN0U3RhcnQpOworICAgICAgICAgIGRlc3Quc2V0KFswLCAwXSwgZGVzdFN0YXJ0ICsgaW5zdHJ1Y3Rpb25zU3RhcnQpOworICAgICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoaW5zdHJ1Y3Rpb25zRW5kLCBnbHlwaERhdGFMZW5ndGgpLCBkZXN0U3RhcnQgKyBpbnN0cnVjdGlvbnNTdGFydCArIDIpOworICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCAtPSBpbnN0cnVjdGlvbnNMZW5ndGg7CisKKyAgICAgICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7CisgICAgICAgICAgICBnbHlwaERhdGFMZW5ndGggPSBnbHlwaERhdGFMZW5ndGggKyAzICYgfjM7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aDsKKyAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdseWYubGVuZ3RoIC0gZ2x5cGhEYXRhTGVuZ3RoID4gMykgeworICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aCArIDMgJiB+MzsKKyAgICAgICAgICBkZXN0LnNldChnbHlmLnN1YmFycmF5KDAsIGdseXBoRGF0YUxlbmd0aCksIGRlc3RTdGFydCk7CisgICAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aDsKKyAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgICB9CisKKyAgICAgICAgZGVzdC5zZXQoZ2x5ZiwgZGVzdFN0YXJ0KTsKKyAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoOworICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZUhlYWQoaGVhZCwgbnVtR2x5cGhzLCBsb2NhTGVuZ3RoKSB7CisgICAgICAgIHZhciBkYXRhID0gaGVhZC5kYXRhOworICAgICAgICB2YXIgdmVyc2lvbiA9IGludDMyKGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworCisgICAgICAgIGlmICh2ZXJzaW9uID4+IDE2ICE9PSAxKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogIiArIHZlcnNpb24pOworICAgICAgICAgIGRhdGFbMF0gPSAwOworICAgICAgICAgIGRhdGFbMV0gPSAxOworICAgICAgICAgIGRhdGFbMl0gPSAwOworICAgICAgICAgIGRhdGFbM10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGluZGV4VG9Mb2NGb3JtYXQgPSBpbnQxNihkYXRhWzUwXSwgZGF0YVs1MV0pOworCisgICAgICAgIGlmIChpbmRleFRvTG9jRm9ybWF0IDwgMCB8fCBpbmRleFRvTG9jRm9ybWF0ID4gMSkgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCBpbmRleFRvTG9jRm9ybWF0IGluIGhlYWQgdGFibGU6ICIgKyBpbmRleFRvTG9jRm9ybWF0KTsKKyAgICAgICAgICB2YXIgbnVtR2x5cGhzUGx1c09uZSA9IG51bUdseXBocyArIDE7CisKKyAgICAgICAgICBpZiAobG9jYUxlbmd0aCA9PT0gbnVtR2x5cGhzUGx1c09uZSA8PCAxKSB7CisgICAgICAgICAgICBkYXRhWzUwXSA9IDA7CisgICAgICAgICAgICBkYXRhWzUxXSA9IDA7CisgICAgICAgICAgfSBlbHNlIGlmIChsb2NhTGVuZ3RoID09PSBudW1HbHlwaHNQbHVzT25lIDw8IDIpIHsKKyAgICAgICAgICAgIGRhdGFbNTBdID0gMDsKKyAgICAgICAgICAgIGRhdGFbNTFdID0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJDb3VsZCBub3QgZml4IGluZGV4VG9Mb2NGb3JtYXQ6ICIgKyBpbmRleFRvTG9jRm9ybWF0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc2FuaXRpemVHbHlwaExvY2F0aW9ucyhsb2NhLCBnbHlmLCBudW1HbHlwaHMsIGlzR2x5cGhMb2NhdGlvbnNMb25nLCBoaW50c1ZhbGlkLCBkdXBGaXJzdEVudHJ5LCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgdmFyIGl0ZW1TaXplLCBpdGVtRGVjb2RlLCBpdGVtRW5jb2RlOworCisgICAgICAgIGlmIChpc0dseXBoTG9jYXRpb25zTG9uZykgeworICAgICAgICAgIGl0ZW1TaXplID0gNDsKKworICAgICAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZUxvbmcoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNiB8IGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgM107CisgICAgICAgICAgfTsKKworICAgICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZUxvbmcoZGF0YSwgb2Zmc2V0LCB2YWx1ZSkgeworICAgICAgICAgICAgZGF0YVtvZmZzZXRdID0gdmFsdWUgPj4+IDI0ICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhW29mZnNldCArIDJdID0gdmFsdWUgPj4gOCAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhW29mZnNldCArIDNdID0gdmFsdWUgJiAweGZmOworICAgICAgICAgIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaXRlbVNpemUgPSAyOworCisgICAgICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlKGRhdGEsIG9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA5IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxOworICAgICAgICAgIH07CisKKyAgICAgICAgICBpdGVtRW5jb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGUoZGF0YSwgb2Zmc2V0LCB2YWx1ZSkgeworICAgICAgICAgICAgZGF0YVtvZmZzZXRdID0gdmFsdWUgPj4gOSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhW29mZnNldCArIDFdID0gdmFsdWUgPj4gMSAmIDB4ZmY7CisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBudW1HbHlwaHNPdXQgPSBkdXBGaXJzdEVudHJ5ID8gbnVtR2x5cGhzICsgMSA6IG51bUdseXBoczsKKyAgICAgICAgdmFyIGxvY2FEYXRhU2l6ZSA9IGl0ZW1TaXplICogKDEgKyBudW1HbHlwaHNPdXQpOworICAgICAgICB2YXIgbG9jYURhdGEgPSBuZXcgVWludDhBcnJheShsb2NhRGF0YVNpemUpOworICAgICAgICBsb2NhRGF0YS5zZXQobG9jYS5kYXRhLnN1YmFycmF5KDAsIGxvY2FEYXRhU2l6ZSkpOworICAgICAgICBsb2NhLmRhdGEgPSBsb2NhRGF0YTsKKyAgICAgICAgdmFyIG9sZEdseWZEYXRhID0gZ2x5Zi5kYXRhOworICAgICAgICB2YXIgb2xkR2x5ZkRhdGFMZW5ndGggPSBvbGRHbHlmRGF0YS5sZW5ndGg7CisgICAgICAgIHZhciBuZXdHbHlmRGF0YSA9IG5ldyBVaW50OEFycmF5KG9sZEdseWZEYXRhTGVuZ3RoKTsKKyAgICAgICAgdmFyIGksIGo7CisgICAgICAgIGNvbnN0IGxvY2FFbnRyaWVzID0gW107CisKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBudW1HbHlwaHMgKyAxOyBpKyssIGogKz0gaXRlbVNpemUpIHsKKyAgICAgICAgICBsZXQgb2Zmc2V0ID0gaXRlbURlY29kZShsb2NhRGF0YSwgaik7CisKKyAgICAgICAgICBpZiAob2Zmc2V0ID4gb2xkR2x5ZkRhdGFMZW5ndGgpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IG9sZEdseWZEYXRhTGVuZ3RoOworICAgICAgICAgIH0KKworICAgICAgICAgIGxvY2FFbnRyaWVzLnB1c2goeworICAgICAgICAgICAgaW5kZXg6IGksCisgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICBlbmRPZmZzZXQ6IDAKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FFbnRyaWVzLnNvcnQoKGEsIGIpID0+IHsKKyAgICAgICAgICByZXR1cm4gYS5vZmZzZXQgLSBiLm9mZnNldDsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CisgICAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbG9jYUVudHJpZXNbaSArIDFdLm9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FFbnRyaWVzLnNvcnQoKGEsIGIpID0+IHsKKyAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7CisgICAgICAgIH0pOworICAgICAgICB2YXIgbWlzc2luZ0dseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgIHZhciB3cml0ZU9mZnNldCA9IDA7CisgICAgICAgIGl0ZW1FbmNvZGUobG9jYURhdGEsIDAsIHdyaXRlT2Zmc2V0KTsKKworICAgICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHM7IGkrKywgaiArPSBpdGVtU2l6ZSkgeworICAgICAgICAgIHZhciBnbHlwaFByb2ZpbGUgPSBzYW5pdGl6ZUdseXBoKG9sZEdseWZEYXRhLCBsb2NhRW50cmllc1tpXS5vZmZzZXQsIGxvY2FFbnRyaWVzW2ldLmVuZE9mZnNldCwgbmV3R2x5ZkRhdGEsIHdyaXRlT2Zmc2V0LCBoaW50c1ZhbGlkKTsKKyAgICAgICAgICB2YXIgbmV3TGVuZ3RoID0gZ2x5cGhQcm9maWxlLmxlbmd0aDsKKworICAgICAgICAgIGlmIChuZXdMZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgIG1pc3NpbmdHbHlwaHNbaV0gPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID4gbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zOworICAgICAgICAgIH0KKworICAgICAgICAgIHdyaXRlT2Zmc2V0ICs9IG5ld0xlbmd0aDsKKyAgICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCB3cml0ZU9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JpdGVPZmZzZXQgPT09IDApIHsKKyAgICAgICAgICB2YXIgc2ltcGxlR2x5cGggPSBuZXcgVWludDhBcnJheShbMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNDksIDBdKTsKKworICAgICAgICAgIGZvciAoaSA9IDAsIGogPSBpdGVtU2l6ZTsgaSA8IG51bUdseXBoc091dDsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCBzaW1wbGVHbHlwaC5sZW5ndGgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGdseWYuZGF0YSA9IHNpbXBsZUdseXBoOworICAgICAgICB9IGVsc2UgaWYgKGR1cEZpcnN0RW50cnkpIHsKKyAgICAgICAgICB2YXIgZmlyc3RFbnRyeUxlbmd0aCA9IGl0ZW1EZWNvZGUobG9jYURhdGEsIGl0ZW1TaXplKTsKKworICAgICAgICAgIGlmIChuZXdHbHlmRGF0YS5sZW5ndGggPiBmaXJzdEVudHJ5TGVuZ3RoICsgd3JpdGVPZmZzZXQpIHsKKyAgICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdseWYuZGF0YSA9IG5ldyBVaW50OEFycmF5KGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7CisgICAgICAgICAgICBnbHlmLmRhdGEuc2V0KG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ2x5Zi5kYXRhLnNldChuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCBmaXJzdEVudHJ5TGVuZ3RoKSwgd3JpdGVPZmZzZXQpOworICAgICAgICAgIGl0ZW1FbmNvZGUobG9jYS5kYXRhLCBsb2NhRGF0YS5sZW5ndGggLSBpdGVtU2l6ZSwgd3JpdGVPZmZzZXQgKyBmaXJzdEVudHJ5TGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnbHlmLmRhdGEgPSBuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCB3cml0ZU9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgIG1pc3NpbmdHbHlwaHMsCisgICAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zCisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHJlYWRQb3N0U2NyaXB0VGFibGUocG9zdCwgcHJvcGVydGllc09iaiwgbWF4cE51bUdseXBocykgeworICAgICAgICB2YXIgc3RhcnQgPSAoZm9udC5zdGFydCA/IGZvbnQuc3RhcnQgOiAwKSArIHBvc3Qub2Zmc2V0OworICAgICAgICBmb250LnBvcyA9IHN0YXJ0OworICAgICAgICB2YXIgbGVuZ3RoID0gcG9zdC5sZW5ndGgsCisgICAgICAgICAgICBlbmQgPSBzdGFydCArIGxlbmd0aDsKKyAgICAgICAgdmFyIHZlcnNpb24gPSBmb250LmdldEludDMyKCk7CisgICAgICAgIGZvbnQuc2tpcCgyOCk7CisgICAgICAgIHZhciBnbHlwaE5hbWVzOworICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOworICAgICAgICB2YXIgaTsKKworICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIDB4MDAwMTAwMDA6CisgICAgICAgICAgICBnbHlwaE5hbWVzID0gTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4MDAwMjAwMDA6CisgICAgICAgICAgICB2YXIgbnVtR2x5cGhzID0gZm9udC5nZXRVaW50MTYoKTsKKworICAgICAgICAgICAgaWYgKG51bUdseXBocyAhPT0gbWF4cE51bUdseXBocykgeworICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdseXBoTmFtZUluZGV4ZXMgPSBbXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CisgICAgICAgICAgICAgIHZhciBpbmRleCA9IGZvbnQuZ2V0VWludDE2KCk7CisKKyAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDMyNzY4KSB7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGdseXBoTmFtZUluZGV4ZXMucHVzaChpbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBjdXN0b21OYW1lcyA9IFtdOworICAgICAgICAgICAgdmFyIHN0ckJ1ZiA9IFtdOworCisgICAgICAgICAgICB3aGlsZSAoZm9udC5wb3MgPCBlbmQpIHsKKyAgICAgICAgICAgICAgdmFyIHN0cmluZ0xlbmd0aCA9IGZvbnQuZ2V0Qnl0ZSgpOworICAgICAgICAgICAgICBzdHJCdWYubGVuZ3RoID0gc3RyaW5nTGVuZ3RoOworCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHN0ckJ1ZltpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nZXRCeXRlKCkpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY3VzdG9tTmFtZXMucHVzaChzdHJCdWYuam9pbigiIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnbHlwaE5hbWVzID0gW107CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICAgICAgICB2YXIgaiA9IGdseXBoTmFtZUluZGV4ZXNbaV07CisKKyAgICAgICAgICAgICAgaWYgKGogPCAyNTgpIHsKKyAgICAgICAgICAgICAgICBnbHlwaE5hbWVzLnB1c2goTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nW2pdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGdseXBoTmFtZXMucHVzaChjdXN0b21OYW1lc1tqIC0gMjU4XSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDAwMDMwMDAwOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmtub3duL3Vuc3VwcG9ydGVkIHBvc3QgdGFibGUgdmVyc2lvbiAiICsgdmVyc2lvbik7CisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAocHJvcGVydGllc09iai5kZWZhdWx0RW5jb2RpbmcpIHsKKyAgICAgICAgICAgICAgZ2x5cGhOYW1lcyA9IHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHByb3BlcnRpZXNPYmouZ2x5cGhOYW1lcyA9IGdseXBoTmFtZXM7CisgICAgICAgIHJldHVybiB2YWxpZDsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gcmVhZE5hbWVUYWJsZShuYW1lVGFibGUpIHsKKyAgICAgICAgdmFyIHN0YXJ0ID0gKGZvbnQuc3RhcnQgPyBmb250LnN0YXJ0IDogMCkgKyBuYW1lVGFibGUub2Zmc2V0OworICAgICAgICBmb250LnBvcyA9IHN0YXJ0OworICAgICAgICB2YXIgbmFtZXMgPSBbW10sIFtdXTsKKyAgICAgICAgdmFyIGxlbmd0aCA9IG5hbWVUYWJsZS5sZW5ndGgsCisgICAgICAgICAgICBlbmQgPSBzdGFydCArIGxlbmd0aDsKKyAgICAgICAgdmFyIGZvcm1hdCA9IGZvbnQuZ2V0VWludDE2KCk7CisgICAgICAgIHZhciBGT1JNQVRfMF9IRUFERVJfTEVOR1RIID0gNjsKKworICAgICAgICBpZiAoZm9ybWF0ICE9PSAwIHx8IGxlbmd0aCA8IEZPUk1BVF8wX0hFQURFUl9MRU5HVEgpIHsKKyAgICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbnVtUmVjb3JkcyA9IGZvbnQuZ2V0VWludDE2KCk7CisgICAgICAgIHZhciBzdHJpbmdzU3RhcnQgPSBmb250LmdldFVpbnQxNigpOworICAgICAgICB2YXIgcmVjb3JkcyA9IFtdOworICAgICAgICB2YXIgTkFNRV9SRUNPUkRfTEVOR1RIID0gMTI7CisgICAgICAgIHZhciBpLCBpaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjb3JkcyAmJiBmb250LnBvcyArIE5BTUVfUkVDT1JEX0xFTkdUSCA8PSBlbmQ7IGkrKykgeworICAgICAgICAgIHZhciByID0geworICAgICAgICAgICAgcGxhdGZvcm06IGZvbnQuZ2V0VWludDE2KCksCisgICAgICAgICAgICBlbmNvZGluZzogZm9udC5nZXRVaW50MTYoKSwKKyAgICAgICAgICAgIGxhbmd1YWdlOiBmb250LmdldFVpbnQxNigpLAorICAgICAgICAgICAgbmFtZTogZm9udC5nZXRVaW50MTYoKSwKKyAgICAgICAgICAgIGxlbmd0aDogZm9udC5nZXRVaW50MTYoKSwKKyAgICAgICAgICAgIG9mZnNldDogZm9udC5nZXRVaW50MTYoKQorICAgICAgICAgIH07CisKKyAgICAgICAgICBpZiAoci5wbGF0Zm9ybSA9PT0gMSAmJiByLmVuY29kaW5nID09PSAwICYmIHIubGFuZ3VhZ2UgPT09IDAgfHwgci5wbGF0Zm9ybSA9PT0gMyAmJiByLmVuY29kaW5nID09PSAxICYmIHIubGFuZ3VhZ2UgPT09IDB4NDA5KSB7CisgICAgICAgICAgICByZWNvcmRzLnB1c2gocik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSByZWNvcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICB2YXIgcmVjb3JkID0gcmVjb3Jkc1tpXTsKKworICAgICAgICAgIGlmIChyZWNvcmQubGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBwb3MgPSBzdGFydCArIHN0cmluZ3NTdGFydCArIHJlY29yZC5vZmZzZXQ7CisKKyAgICAgICAgICBpZiAocG9zICsgcmVjb3JkLmxlbmd0aCA+IGVuZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9udC5wb3MgPSBwb3M7CisgICAgICAgICAgdmFyIG5hbWVJbmRleCA9IHJlY29yZC5uYW1lOworCisgICAgICAgICAgaWYgKHJlY29yZC5lbmNvZGluZykgeworICAgICAgICAgICAgdmFyIHN0ciA9ICIiOworCisgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSByZWNvcmQubGVuZ3RoOyBqIDwgamo7IGogKz0gMikgeworICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmb250LmdldFVpbnQxNigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmFtZXNbMV1bbmFtZUluZGV4XSA9IHN0cjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZXNbMF1bbmFtZUluZGV4XSA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShmb250LmdldEJ5dGVzKHJlY29yZC5sZW5ndGgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgICB9CisKKyAgICAgIHZhciBUVE9wc1N0YWNrRGVsdGFzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0yLCAtMiwgLTIsIC0yLCAwLCAwLCAtMiwgLTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xLCAxLCAtMSwgLTk5OSwgMCwgMSwgMCwgLTEsIC0yLCAwLCAtMSwgLTIsIC0xLCAtMSwgMCwgLTEsIC0xLCAwLCAwLCAtOTk5LCAtOTk5LCAtMSwgLTEsIC0xLCAtMSwgLTIsIC05OTksIC0yLCAtMiwgLTk5OSwgMCwgLTIsIC0yLCAwLCAwLCAtMiwgMCwgLTIsIDAsIDAsIDAsIC0yLCAtMSwgLTEsIDEsIDEsIDAsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAtMSwgMCwgLTEsIC0xLCAwLCAtOTk5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMiwgLTk5OSwgLTk5OSwgLTk5OSwgLTk5OSwgLTk5OSwgLTEsIC0xLCAtMiwgLTIsIDAsIDAsIDAsIDAsIC0xLCAtMSwgLTk5OSwgLTIsIC0yLCAwLCAwLCAtMSwgLTIsIC0yLCAwLCAwLCAwLCAtMSwgLTEsIC0xLCAtMl07CisKKyAgICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtKHRhYmxlLCB0dENvbnRleHQpIHsKKyAgICAgICAgdmFyIGRhdGEgPSB0YWJsZS5kYXRhOworICAgICAgICB2YXIgaSA9IDAsCisgICAgICAgICAgICBqLAorICAgICAgICAgICAgbiwKKyAgICAgICAgICAgIGIsCisgICAgICAgICAgICBmdW5jSWQsCisgICAgICAgICAgICBwYywKKyAgICAgICAgICAgIGxhc3RFbmRmID0gMCwKKyAgICAgICAgICAgIGxhc3REZWZmID0gMDsKKyAgICAgICAgdmFyIHN0YWNrID0gW107CisgICAgICAgIHZhciBjYWxsc3RhY2sgPSBbXTsKKyAgICAgICAgdmFyIGZ1bmN0aW9uc0NhbGxlZCA9IFtdOworICAgICAgICB2YXIgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczsKKyAgICAgICAgdmFyIGluRkRFRiA9IGZhbHNlLAorICAgICAgICAgICAgaWZMZXZlbCA9IDAsCisgICAgICAgICAgICBpbkVMU0UgPSAwOworCisgICAgICAgIGZvciAodmFyIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTspIHsKKyAgICAgICAgICB2YXIgb3AgPSBkYXRhW2krK107CisKKyAgICAgICAgICBpZiAob3AgPT09IDB4NDApIHsKKyAgICAgICAgICAgIG4gPSBkYXRhW2krK107CisKKyAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CisgICAgICAgICAgICAgIGkgKz0gbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDQxKSB7CisgICAgICAgICAgICBuID0gZGF0YVtpKytdOworCisgICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgeworICAgICAgICAgICAgICBpICs9IG4gKiAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgeworICAgICAgICAgICAgICAgIGIgPSBkYXRhW2krK107CisgICAgICAgICAgICAgICAgc3RhY2sucHVzaChiIDw8IDggfCBkYXRhW2krK10pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiMCkgeworICAgICAgICAgICAgbiA9IG9wIC0gMHhiMCArIDE7CisKKyAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CisgICAgICAgICAgICAgIGkgKz0gbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZjgpID09PSAweGI4KSB7CisgICAgICAgICAgICBuID0gb3AgLSAweGI4ICsgMTsKKworICAgICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKKyAgICAgICAgICAgICAgaSArPSBuICogMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICBiID0gZGF0YVtpKytdOworICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYiA8PCA4IHwgZGF0YVtpKytdKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmIgJiYgIXRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgeworICAgICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgeworICAgICAgICAgICAgICBmdW5jSWQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKKworICAgICAgICAgICAgICBpZiAoaXNOYU4oZnVuY0lkKSkgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2Z1bmNJZF0gPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYgKGZ1bmNJZCBpbiB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXMpIHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YWNrTGVuZ3RoID0gc3RhY2subGVuZ3RoICsgdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW2Z1bmNJZF07CisKKyAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGFja0xlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS4iKTsKKyAgICAgICAgICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBzdGFjay5sZW5ndGggPSBuZXdTdGFja0xlbmd0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZ1bmNJZCBpbiB0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZCAmJiAhZnVuY3Rpb25zQ2FsbGVkLmluY2x1ZGVzKGZ1bmNJZCkpIHsKKyAgICAgICAgICAgICAgICAgIGNhbGxzdGFjay5wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tUb3A6IHN0YWNrLmxlbmd0aCAtIDEKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zQ2FsbGVkLnB1c2goZnVuY0lkKTsKKyAgICAgICAgICAgICAgICAgIHBjID0gdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXTsKKworICAgICAgICAgICAgICAgICAgaWYgKCFwYykgeworICAgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBDQUxMIG5vbi1leGlzdGVudCBmdW5jdGlvbiIpOworICAgICAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYy5kYXRhOworICAgICAgICAgICAgICAgICAgaSA9IHBjLmk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgyYyAmJiAhdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBuZXN0ZWQgRkRFRnMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5GREVGID0gdHJ1ZTsKKyAgICAgICAgICAgIGxhc3REZWZmID0gaTsKKyAgICAgICAgICAgIGZ1bmNJZCA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXSA9IHsKKyAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgaQorICAgICAgICAgICAgfTsKKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJkKSB7CisgICAgICAgICAgICBpZiAoaW5GREVGKSB7CisgICAgICAgICAgICAgIGluRkRFRiA9IGZhbHNlOworICAgICAgICAgICAgICBsYXN0RW5kZiA9IGk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBwYyA9IGNhbGxzdGFjay5wb3AoKTsKKworICAgICAgICAgICAgICBpZiAoIXBjKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogRU5ERiBiYWQgc3RhY2siKTsKKyAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGZ1bmNJZCA9IGZ1bmN0aW9uc0NhbGxlZC5wb3AoKTsKKyAgICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7CisgICAgICAgICAgICAgIGkgPSBwYy5pOworICAgICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXSA9IHN0YWNrLmxlbmd0aCAtIHBjLnN0YWNrVG9wOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4ODkpIHsKKyAgICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IG5lc3RlZCBJREVGcyBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbkZERUYgPSB0cnVlOworICAgICAgICAgICAgbGFzdERlZmYgPSBpOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NTgpIHsKKyAgICAgICAgICAgICsraWZMZXZlbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDFiKSB7CisgICAgICAgICAgICBpbkVMU0UgPSBpZkxldmVsOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NTkpIHsKKyAgICAgICAgICAgIGlmIChpbkVMU0UgPT09IGlmTGV2ZWwpIHsKKyAgICAgICAgICAgICAgaW5FTFNFID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLS1pZkxldmVsOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWMpIHsKKyAgICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHsKKyAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOworCisgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgaSArPSBvZmZzZXQgLSAxOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgeworICAgICAgICAgICAgbGV0IHN0YWNrRGVsdGEgPSAwOworCisgICAgICAgICAgICBpZiAob3AgPD0gMHg4ZSkgeworICAgICAgICAgICAgICBzdGFja0RlbHRhID0gVFRPcHNTdGFja0RlbHRhc1tvcF07CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4YzAgJiYgb3AgPD0gMHhkZikgeworICAgICAgICAgICAgICBzdGFja0RlbHRhID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4ZTApIHsKKyAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3AgPj0gMHg3MSAmJiBvcCA8PSAweDc1KSB7CisgICAgICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKKworICAgICAgICAgICAgICBpZiAoIWlzTmFOKG4pKSB7CisgICAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC1uICogMjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoc3RhY2tEZWx0YSA8IDAgJiYgc3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgc3RhY2tEZWx0YSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoc3RhY2tEZWx0YSA+IDApIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChOYU4pOworICAgICAgICAgICAgICBzdGFja0RlbHRhLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczsKKyAgICAgICAgdmFyIGNvbnRlbnQgPSBbZGF0YV07CisKKyAgICAgICAgaWYgKGkgPiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgIGNvbnRlbnQucHVzaChuZXcgVWludDhBcnJheShpIC0gZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RGVmZiA+IGxhc3RFbmRmKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogY29tcGxlbWVudGluZyBhIG1pc3NpbmcgZnVuY3Rpb24gdGFpbCIpOworICAgICAgICAgIGNvbnRlbnQucHVzaChuZXcgVWludDhBcnJheShbMHgyMiwgMHgyZF0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvbGRUVFRhYmxlKHRhYmxlLCBjb250ZW50KTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKSB7CisgICAgICAgIGlmICh0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkLmxlbmd0aCA+IG1heEZ1bmN0aW9uRGVmcykgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IG1vcmUgZnVuY3Rpb25zIGRlZmluZWQgdGhhbiBleHBlY3RlZCIpOworICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gdHRDb250ZXh0LmZ1bmN0aW9uc1VzZWQubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgIGlmIChqID4gbWF4RnVuY3Rpb25EZWZzKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBpbnZhbGlkIGZ1bmN0aW9uIGlkOiAiICsgaik7CisgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0dENvbnRleHQuZnVuY3Rpb25zVXNlZFtqXSAmJiAhdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbal0pIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IHVuZGVmaW5lZCBmdW5jdGlvbjogIiArIGopOworICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpIHsKKyAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gMSkgeworICAgICAgICAgIHZhciBuZXdMZW5ndGggPSAwOworICAgICAgICAgIHZhciBqLCBqajsKKworICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29udGVudC5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICBuZXdMZW5ndGggKz0gY29udGVudFtqXS5sZW5ndGg7CisgICAgICAgICAgfQorCisgICAgICAgICAgbmV3TGVuZ3RoID0gbmV3TGVuZ3RoICsgMyAmIH4zOworICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShuZXdMZW5ndGgpOworICAgICAgICAgIHZhciBwb3MgPSAwOworCisgICAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICAgIHJlc3VsdC5zZXQoY29udGVudFtqXSwgcG9zKTsKKyAgICAgICAgICAgIHBvcyArPSBjb250ZW50W2pdLmxlbmd0aDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0YWJsZS5kYXRhID0gcmVzdWx0OworICAgICAgICAgIHRhYmxlLmxlbmd0aCA9IG5ld0xlbmd0aDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbXMoZnBnbSwgcHJlcCwgY3Z0LCBtYXhGdW5jdGlvbkRlZnMpIHsKKyAgICAgICAgdmFyIHR0Q29udGV4dCA9IHsKKyAgICAgICAgICBmdW5jdGlvbnNEZWZpbmVkOiBbXSwKKyAgICAgICAgICBmdW5jdGlvbnNVc2VkOiBbXSwKKyAgICAgICAgICBmdW5jdGlvbnNTdGFja0RlbHRhczogW10sCisgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOiBmYWxzZSwKKyAgICAgICAgICBoaW50c1ZhbGlkOiB0cnVlCisgICAgICAgIH07CisKKyAgICAgICAgaWYgKGZwZ20pIHsKKyAgICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShmcGdtLCB0dENvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZXApIHsKKyAgICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShwcmVwLCB0dENvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZwZ20pIHsKKyAgICAgICAgICBjaGVja0ludmFsaWRGdW5jdGlvbnModHRDb250ZXh0LCBtYXhGdW5jdGlvbkRlZnMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN2dCAmJiBjdnQubGVuZ3RoICYgMSkgeworICAgICAgICAgIHZhciBjdnREYXRhID0gbmV3IFVpbnQ4QXJyYXkoY3Z0Lmxlbmd0aCArIDEpOworICAgICAgICAgIGN2dERhdGEuc2V0KGN2dC5kYXRhKTsKKyAgICAgICAgICBjdnQuZGF0YSA9IGN2dERhdGE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHRDb250ZXh0LmhpbnRzVmFsaWQ7CisgICAgICB9CisKKyAgICAgIGZvbnQgPSBuZXcgX3N0cmVhbS5TdHJlYW0obmV3IFVpbnQ4QXJyYXkoZm9udC5nZXRCeXRlcygpKSk7CisgICAgICBsZXQgaGVhZGVyLCB0YWJsZXM7CisKKyAgICAgIGlmIChpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZm9udCkpIHsKKyAgICAgICAgY29uc3QgdHRjRGF0YSA9IHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKGZvbnQsIHRoaXMubmFtZSk7CisgICAgICAgIGhlYWRlciA9IHR0Y0RhdGEuaGVhZGVyOworICAgICAgICB0YWJsZXMgPSB0dGNEYXRhLnRhYmxlczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWRlciA9IHJlYWRPcGVuVHlwZUhlYWRlcihmb250KTsKKyAgICAgICAgdGFibGVzID0gcmVhZFRhYmxlcyhmb250LCBoZWFkZXIubnVtVGFibGVzKTsKKyAgICAgIH0KKworICAgICAgbGV0IGNmZiwgY2ZmRmlsZTsKKyAgICAgIHZhciBpc1RydWVUeXBlID0gIXRhYmxlc1siQ0ZGICJdOworCisgICAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKKyAgICAgICAgY29uc3QgaXNDb21wb3NpdGUgPSBwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAmJiAoKHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW10pLmxlbmd0aCA+IDAgfHwgIShwcm9wZXJ0aWVzLmNNYXAgaW5zdGFuY2VvZiBfY21hcC5JZGVudGl0eUNNYXApKTsKKworICAgICAgICBpZiAoaGVhZGVyLnZlcnNpb24gPT09ICJPVFRPIiAmJiAhaXNDb21wb3NpdGUgfHwgIXRhYmxlcy5oZWFkIHx8ICF0YWJsZXMuaGhlYSB8fCAhdGFibGVzLm1heHAgfHwgIXRhYmxlcy5wb3N0KSB7CisgICAgICAgICAgY2ZmRmlsZSA9IG5ldyBfc3RyZWFtLlN0cmVhbSh0YWJsZXNbIkNGRiAiXS5kYXRhKTsKKyAgICAgICAgICBjZmYgPSBuZXcgQ0ZGRm9udChjZmZGaWxlLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CisgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydChuYW1lLCBjZmYsIHByb3BlcnRpZXMpOworICAgICAgICB9CisKKyAgICAgICAgZGVsZXRlIHRhYmxlcy5nbHlmOworICAgICAgICBkZWxldGUgdGFibGVzLmxvY2E7CisgICAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTsKKyAgICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwOworICAgICAgICBkZWxldGUgdGFibGVzWyJjdnQgIl07CisgICAgICAgIHRoaXMuaXNPcGVuVHlwZSA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXRhYmxlcy5sb2NhKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibG9jYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRhYmxlcy5nbHlmKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCdSZXF1aXJlZCAiZ2x5ZiIgdGFibGUgaXMgbm90IGZvdW5kIC0tIHRyeWluZyB0byByZWNvdmVyLicpOworICAgICAgICAgIHRhYmxlcy5nbHlmID0geworICAgICAgICAgICAgdGFnOiAiZ2x5ZiIsCisgICAgICAgICAgICBkYXRhOiBuZXcgVWludDhBcnJheSgwKQorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmlzT3BlblR5cGUgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0YWJsZXMubWF4cCkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJtYXhwIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKKyAgICAgIH0KKworICAgICAgZm9udC5wb3MgPSAoZm9udC5zdGFydCB8fCAwKSArIHRhYmxlcy5tYXhwLm9mZnNldDsKKyAgICAgIHZhciB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpOworICAgICAgY29uc3QgbnVtR2x5cGhzID0gZm9udC5nZXRVaW50MTYoKTsKKyAgICAgIGxldCBudW1HbHlwaHNPdXQgPSBudW1HbHlwaHMgKyAxOworICAgICAgbGV0IGR1cEZpcnN0RW50cnkgPSB0cnVlOworCisgICAgICBpZiAobnVtR2x5cGhzT3V0ID4gMHhmZmZmKSB7CisgICAgICAgIGR1cEZpcnN0RW50cnkgPSBmYWxzZTsKKyAgICAgICAgbnVtR2x5cGhzT3V0ID0gbnVtR2x5cGhzOworICAgICAgICAoMCwgX3V0aWwud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gZ2x5ZnMgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpOworICAgICAgfQorCisgICAgICB2YXIgbWF4RnVuY3Rpb25EZWZzID0gMDsKKyAgICAgIHZhciBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSAwOworCisgICAgICBpZiAodmVyc2lvbiA+PSAweDAwMDEwMDAwICYmIHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAyMikgeworICAgICAgICBmb250LnBvcyArPSA4OworICAgICAgICB2YXIgbWF4Wm9uZXMgPSBmb250LmdldFVpbnQxNigpOworCisgICAgICAgIGlmIChtYXhab25lcyA+IDIpIHsKKyAgICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE0XSA9IDA7CisgICAgICAgICAgdGFibGVzLm1heHAuZGF0YVsxNV0gPSAyOworICAgICAgICB9CisKKyAgICAgICAgZm9udC5wb3MgKz0gNDsKKyAgICAgICAgbWF4RnVuY3Rpb25EZWZzID0gZm9udC5nZXRVaW50MTYoKTsKKyAgICAgICAgZm9udC5wb3MgKz0gNDsKKyAgICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID0gZm9udC5nZXRVaW50MTYoKTsKKyAgICAgIH0KKworICAgICAgdGFibGVzLm1heHAuZGF0YVs0XSA9IG51bUdseXBoc091dCA+PiA4OworICAgICAgdGFibGVzLm1heHAuZGF0YVs1XSA9IG51bUdseXBoc091dCAmIDI1NTsKKyAgICAgIHZhciBoaW50c1ZhbGlkID0gc2FuaXRpemVUVFByb2dyYW1zKHRhYmxlcy5mcGdtLCB0YWJsZXMucHJlcCwgdGFibGVzWyJjdnQgIl0sIG1heEZ1bmN0aW9uRGVmcyk7CisKKyAgICAgIGlmICghaGludHNWYWxpZCkgeworICAgICAgICBkZWxldGUgdGFibGVzLmZwZ207CisgICAgICAgIGRlbGV0ZSB0YWJsZXMucHJlcDsKKyAgICAgICAgZGVsZXRlIHRhYmxlc1siY3Z0ICJdOworICAgICAgfQorCisgICAgICBzYW5pdGl6ZU1ldHJpY3MoZm9udCwgdGFibGVzLmhoZWEsIHRhYmxlcy5obXR4LCBudW1HbHlwaHNPdXQsIGR1cEZpcnN0RW50cnkpOworCisgICAgICBpZiAoIXRhYmxlcy5oZWFkKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcignUmVxdWlyZWQgImhlYWQiIHRhYmxlIGlzIG5vdCBmb3VuZCcpOworICAgICAgfQorCisgICAgICBzYW5pdGl6ZUhlYWQodGFibGVzLmhlYWQsIG51bUdseXBocywgaXNUcnVlVHlwZSA/IHRhYmxlcy5sb2NhLmxlbmd0aCA6IDApOworICAgICAgdmFyIG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICBpZiAoaXNUcnVlVHlwZSkgeworICAgICAgICB2YXIgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOworICAgICAgICB2YXIgZ2x5cGhzSW5mbyA9IHNhbml0aXplR2x5cGhMb2NhdGlvbnModGFibGVzLmxvY2EsIHRhYmxlcy5nbHlmLCBudW1HbHlwaHMsIGlzR2x5cGhMb2NhdGlvbnNMb25nLCBoaW50c1ZhbGlkLCBkdXBGaXJzdEVudHJ5LCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpOworICAgICAgICBtaXNzaW5nR2x5cGhzID0gZ2x5cGhzSW5mby5taXNzaW5nR2x5cGhzOworCisgICAgICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDIyKSB7CisgICAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyNl0gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyA+PiA4OworICAgICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMjddID0gZ2x5cGhzSW5mby5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgJiAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCF0YWJsZXMuaGhlYSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoaGVhIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRhYmxlcy5oaGVhLmRhdGFbMTBdID09PSAwICYmIHRhYmxlcy5oaGVhLmRhdGFbMTFdID09PSAwKSB7CisgICAgICAgIHRhYmxlcy5oaGVhLmRhdGFbMTBdID0gMHhmZjsKKyAgICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMV0gPSAweGZmOworICAgICAgfQorCisgICAgICB2YXIgbWV0cmljc092ZXJyaWRlID0geworICAgICAgICB1bml0c1BlckVtOiBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzE4XSwgdGFibGVzLmhlYWQuZGF0YVsxOV0pLAorICAgICAgICB5TWF4OiBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzQyXSwgdGFibGVzLmhlYWQuZGF0YVs0M10pLAorICAgICAgICB5TWluOiBzaWduZWRJbnQxNih0YWJsZXMuaGVhZC5kYXRhWzM4XSwgdGFibGVzLmhlYWQuZGF0YVszOV0pLAorICAgICAgICBhc2NlbnQ6IGludDE2KHRhYmxlcy5oaGVhLmRhdGFbNF0sIHRhYmxlcy5oaGVhLmRhdGFbNV0pLAorICAgICAgICBkZXNjZW50OiBzaWduZWRJbnQxNih0YWJsZXMuaGhlYS5kYXRhWzZdLCB0YWJsZXMuaGhlYS5kYXRhWzddKQorICAgICAgfTsKKyAgICAgIHRoaXMuYXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmFzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtOworICAgICAgdGhpcy5kZXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmRlc2NlbnQgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTsKKworICAgICAgaWYgKHRhYmxlcy5wb3N0KSB7CisgICAgICAgIHJlYWRQb3N0U2NyaXB0VGFibGUodGFibGVzLnBvc3QsIHByb3BlcnRpZXMsIG51bUdseXBocyk7CisgICAgICB9CisKKyAgICAgIHRhYmxlcy5wb3N0ID0geworICAgICAgICB0YWc6ICJwb3N0IiwKKyAgICAgICAgZGF0YTogY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpCisgICAgICB9OworICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBbXTsKKworICAgICAgZnVuY3Rpb24gaGFzR2x5cGgoZ2x5cGhJZCkgeworICAgICAgICByZXR1cm4gIW1pc3NpbmdHbHlwaHNbZ2x5cGhJZF07CisgICAgICB9CisKKyAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgeworICAgICAgICB2YXIgY2lkVG9HaWRNYXAgPSBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwIHx8IFtdOworICAgICAgICB2YXIgaXNDaWRUb0dpZE1hcEVtcHR5ID0gY2lkVG9HaWRNYXAubGVuZ3RoID09PSAwOworICAgICAgICBwcm9wZXJ0aWVzLmNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIGNpZCkgeworICAgICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBnbHlwaElkID0gLTE7CisKKyAgICAgICAgICBpZiAoaXNDaWRUb0dpZE1hcEVtcHR5KSB7CisgICAgICAgICAgICBnbHlwaElkID0gY2lkOworICAgICAgICAgIH0gZWxzZSBpZiAoY2lkVG9HaWRNYXBbY2lkXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBnbHlwaElkID0gY2lkVG9HaWRNYXBbY2lkXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwICYmIGdseXBoSWQgPCBudW1HbHlwaHMgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKKyAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBjbWFwVGFibGUgPSByZWFkQ21hcFRhYmxlKHRhYmxlcy5jbWFwLCBmb250LCB0aGlzLmlzU3ltYm9saWNGb250LCBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKTsKKyAgICAgICAgdmFyIGNtYXBQbGF0Zm9ybUlkID0gY21hcFRhYmxlLnBsYXRmb3JtSWQ7CisgICAgICAgIHZhciBjbWFwRW5jb2RpbmdJZCA9IGNtYXBUYWJsZS5lbmNvZGluZ0lkOworICAgICAgICB2YXIgY21hcE1hcHBpbmdzID0gY21hcFRhYmxlLm1hcHBpbmdzOworICAgICAgICB2YXIgY21hcE1hcHBpbmdzTGVuZ3RoID0gY21hcE1hcHBpbmdzLmxlbmd0aDsKKyAgICAgICAgbGV0IGJhc2VFbmNvZGluZyA9IFtdOworCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nICYmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPT09ICJNYWNSb21hbkVuY29kaW5nIiB8fCBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPT09ICJXaW5BbnNpRW5jb2RpbmciKSkgeworICAgICAgICAgIGJhc2VFbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzRW5jb2RpbmcgJiYgIXRoaXMuaXNTeW1ib2xpY0ZvbnQgJiYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxIHx8IGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSkgeworICAgICAgICAgIHZhciBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKworICAgICAgICAgIGZvciAobGV0IGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCAyNTY7IGNoYXJDb2RlKyspIHsKKyAgICAgICAgICAgIHZhciBnbHlwaE5hbWUsIHN0YW5kYXJkR2x5cGhOYW1lOworCisgICAgICAgICAgICBpZiAodGhpcy5kaWZmZXJlbmNlcyAmJiBjaGFyQ29kZSBpbiB0aGlzLmRpZmZlcmVuY2VzKSB7CisgICAgICAgICAgICAgIGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyQ29kZSBpbiBiYXNlRW5jb2RpbmcgJiYgYmFzZUVuY29kaW5nW2NoYXJDb2RlXSAhPT0gIiIpIHsKKyAgICAgICAgICAgICAgZ2x5cGhOYW1lID0gYmFzZUVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGdseXBoTmFtZSA9IF9lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZ1tjaGFyQ29kZV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZ2x5cGhOYW1lKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFuZGFyZEdseXBoTmFtZSA9IHJlY292ZXJHbHlwaE5hbWUoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKKyAgICAgICAgICAgIHZhciB1bmljb2RlT3JDaGFyQ29kZTsKKworICAgICAgICAgICAgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxKSB7CisgICAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtzdGFuZGFyZEdseXBoTmFtZV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CisgICAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gX2VuY29kaW5ncy5NYWNSb21hbkVuY29kaW5nLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGUgIT09IHVuaWNvZGVPckNoYXJDb2RlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBjbWFwTWFwcGluZ3NbaV0uZ2x5cGhJZDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAwKSB7CisgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbWFwTWFwcGluZ3NMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY21hcE1hcHBpbmdzW2ldLmNoYXJDb2RlXSA9IGNtYXBNYXBwaW5nc1tpXS5nbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtYXBNYXBwaW5nc0xlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgY2hhckNvZGUgPSBjbWFwTWFwcGluZ3NbaV0uY2hhckNvZGU7CisKKyAgICAgICAgICAgIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjaGFyQ29kZSA+PSAweGYwMDAgJiYgY2hhckNvZGUgPD0gMHhmMGZmKSB7CisgICAgICAgICAgICAgIGNoYXJDb2RlICY9IDB4ZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGNtYXBNYXBwaW5nc1tpXS5nbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmdseXBoTmFtZXMgJiYgYmFzZUVuY29kaW5nLmxlbmd0aCkgeworICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChjaGFyQ29kZVRvR2x5cGhJZFtpXSA9PT0gdW5kZWZpbmVkICYmIGJhc2VFbmNvZGluZ1tpXSkgeworICAgICAgICAgICAgICBnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbaV07CisgICAgICAgICAgICAgIGNvbnN0IGdseXBoSWQgPSBwcm9wZXJ0aWVzLmdseXBoTmFtZXMuaW5kZXhPZihnbHlwaE5hbWUpOworCisgICAgICAgICAgICAgIGlmIChnbHlwaElkID4gMCAmJiBoYXNHbHlwaChnbHlwaElkKSkgeworICAgICAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2ldID0gZ2x5cGhJZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2hhckNvZGVUb0dseXBoSWQubGVuZ3RoID09PSAwKSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkWzBdID0gMDsKKyAgICAgIH0KKworICAgICAgbGV0IGdseXBoWmVyb0lkID0gbnVtR2x5cGhzT3V0IC0gMTsKKworICAgICAgaWYgKCFkdXBGaXJzdEVudHJ5KSB7CisgICAgICAgIGdseXBoWmVyb0lkID0gMDsKKyAgICAgIH0KKworICAgICAgdmFyIG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgZ2x5cGhaZXJvSWQpOworICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOworICAgICAgdGFibGVzLmNtYXAgPSB7CisgICAgICAgIHRhZzogImNtYXAiLAorICAgICAgICBkYXRhOiBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbnVtR2x5cGhzT3V0KQorICAgICAgfTsKKworICAgICAgaWYgKCF0YWJsZXNbIk9TLzIiXSB8fCAhdmFsaWRhdGVPUzJUYWJsZSh0YWJsZXNbIk9TLzIiXSwgZm9udCkpIHsKKyAgICAgICAgdGFibGVzWyJPUy8yIl0gPSB7CisgICAgICAgICAgdGFnOiAiT1MvMiIsCisgICAgICAgICAgZGF0YTogY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbWV0cmljc092ZXJyaWRlKQorICAgICAgICB9OworICAgICAgfQorCisgICAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjZmZGaWxlID0gbmV3IF9zdHJlYW0uU3RyZWFtKHRhYmxlc1siQ0ZGICJdLmRhdGEpOworICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKGNmZkZpbGUsIHByb3BlcnRpZXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgICAgICAgY2ZmID0gcGFyc2VyLnBhcnNlKCk7CisgICAgICAgICAgY2ZmLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTsKKyAgICAgICAgICB2YXIgY29tcGlsZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIoY2ZmKTsKKyAgICAgICAgICB0YWJsZXNbIkNGRiAiXS5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghdGFibGVzLm5hbWUpIHsKKyAgICAgICAgdGFibGVzLm5hbWUgPSB7CisgICAgICAgICAgdGFnOiAibmFtZSIsCisgICAgICAgICAgZGF0YTogY3JlYXRlTmFtZVRhYmxlKHRoaXMubmFtZSkKKyAgICAgICAgfTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBuYW1lUHJvdG90eXBlID0gcmVhZE5hbWVUYWJsZSh0YWJsZXMubmFtZSk7CisgICAgICAgIHRhYmxlcy5uYW1lLmRhdGEgPSBjcmVhdGVOYW1lVGFibGUobmFtZSwgbmFtZVByb3RvdHlwZSk7CisgICAgICB9CisKKyAgICAgIHZhciBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoaGVhZGVyLnZlcnNpb24pOworCisgICAgICBmb3IgKHZhciB0YWJsZVRhZyBpbiB0YWJsZXMpIHsKKyAgICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpOworICAgIH0sCisgICAgY29udmVydDogZnVuY3Rpb24gRm9udF9jb252ZXJ0KGZvbnROYW1lLCBmb250LCBwcm9wZXJ0aWVzKSB7CisgICAgICBwcm9wZXJ0aWVzLmZpeGVkUGl0Y2ggPSBmYWxzZTsKKworICAgICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7CisgICAgICAgIGFkanVzdFRvVW5pY29kZShwcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZyk7CisgICAgICB9CisKKyAgICAgIGxldCBnbHlwaFplcm9JZCA9IDE7CisKKyAgICAgIGlmIChmb250IGluc3RhbmNlb2YgQ0ZGRm9udCkgeworICAgICAgICBnbHlwaFplcm9JZCA9IGZvbnQubnVtR2x5cGhzIC0gMTsKKyAgICAgIH0KKworICAgICAgdmFyIG1hcHBpbmcgPSBmb250LmdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKTsKKyAgICAgIHZhciBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhtYXBwaW5nLCBmb250Lmhhc0dseXBoSWQuYmluZChmb250KSwgZ2x5cGhaZXJvSWQpOworICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOworICAgICAgdmFyIG51bUdseXBocyA9IGZvbnQubnVtR2x5cGhzOworCisgICAgICBmdW5jdGlvbiBnZXRDaGFyQ29kZXMoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKKyAgICAgICAgdmFyIGNoYXJDb2RlcyA9IG51bGw7CisKKyAgICAgICAgZm9yICh2YXIgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKKyAgICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7CisgICAgICAgICAgICBpZiAoIWNoYXJDb2RlcykgeworICAgICAgICAgICAgICBjaGFyQ29kZXMgPSBbXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hhckNvZGVzLnB1c2goY2hhckNvZGUgfCAwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2hhckNvZGVzOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBjcmVhdGVDaGFyQ29kZShjaGFyQ29kZVRvR2x5cGhJZCwgZ2x5cGhJZCkgeworICAgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgeworICAgICAgICAgIGlmIChnbHlwaElkID09PSBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0pIHsKKyAgICAgICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZFtuZXdNYXBwaW5nLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGVdID0gZ2x5cGhJZDsKKyAgICAgICAgcmV0dXJuIG5ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrOworICAgICAgfQorCisgICAgICB2YXIgc2VhY3MgPSBmb250LnNlYWNzOworCisgICAgICBpZiAoU0VBQ19BTkFMWVNJU19FTkFCTEVEICYmIHNlYWNzICYmIHNlYWNzLmxlbmd0aCkgeworICAgICAgICB2YXIgbWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgICB2YXIgY2hhcnNldCA9IGZvbnQuZ2V0Q2hhcnNldCgpOworICAgICAgICB2YXIgc2VhY01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgZm9yICh2YXIgZ2x5cGhJZCBpbiBzZWFjcykgeworICAgICAgICAgIGdseXBoSWQgfD0gMDsKKyAgICAgICAgICB2YXIgc2VhYyA9IHNlYWNzW2dseXBoSWRdOworICAgICAgICAgIHZhciBiYXNlR2x5cGhOYW1lID0gX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nW3NlYWNbMl1dOworICAgICAgICAgIHZhciBhY2NlbnRHbHlwaE5hbWUgPSBfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2Rpbmdbc2VhY1szXV07CisgICAgICAgICAgdmFyIGJhc2VHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGJhc2VHbHlwaE5hbWUpOworICAgICAgICAgIHZhciBhY2NlbnRHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGFjY2VudEdseXBoTmFtZSk7CisKKyAgICAgICAgICBpZiAoYmFzZUdseXBoSWQgPCAwIHx8IGFjY2VudEdseXBoSWQgPCAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgYWNjZW50T2Zmc2V0ID0geworICAgICAgICAgICAgeDogc2VhY1swXSAqIG1hdHJpeFswXSArIHNlYWNbMV0gKiBtYXRyaXhbMl0gKyBtYXRyaXhbNF0sCisgICAgICAgICAgICB5OiBzZWFjWzBdICogbWF0cml4WzFdICsgc2VhY1sxXSAqIG1hdHJpeFszXSArIG1hdHJpeFs1XQorICAgICAgICAgIH07CisgICAgICAgICAgdmFyIGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTsKKworICAgICAgICAgIGlmICghY2hhckNvZGVzKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGFyQ29kZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gY2hhckNvZGVzW2ldOworICAgICAgICAgICAgdmFyIGNoYXJDb2RlVG9HbHlwaElkID0gbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZDsKKyAgICAgICAgICAgIHZhciBiYXNlRm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGJhc2VHbHlwaElkKTsKKyAgICAgICAgICAgIHZhciBhY2NlbnRGb250Q2hhckNvZGUgPSBjcmVhdGVDaGFyQ29kZShjaGFyQ29kZVRvR2x5cGhJZCwgYWNjZW50R2x5cGhJZCk7CisgICAgICAgICAgICBzZWFjTWFwW2NoYXJDb2RlXSA9IHsKKyAgICAgICAgICAgICAgYmFzZUZvbnRDaGFyQ29kZSwKKyAgICAgICAgICAgICAgYWNjZW50Rm9udENoYXJDb2RlLAorICAgICAgICAgICAgICBhY2NlbnRPZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydGllcy5zZWFjTWFwID0gc2VhY01hcDsKKyAgICAgIH0KKworICAgICAgdmFyIHVuaXRzUGVyRW0gPSAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWClbMF07CisgICAgICB2YXIgYnVpbGRlciA9IG5ldyBPcGVuVHlwZUZpbGVCdWlsZGVyKCJceDRGXHg1NFx4NTRceDRGIik7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJDRkYgIiwgZm9udC5kYXRhKTsKKyAgICAgIGJ1aWxkZXIuYWRkVGFibGUoIk9TLzIiLCBjcmVhdGVPUzJUYWJsZShwcm9wZXJ0aWVzLCBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJjbWFwIiwgY3JlYXRlQ21hcFRhYmxlKG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQsIG51bUdseXBocykpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgiaGVhZCIsICJceDAwXHgwMVx4MDBceDAwIiArICJceDAwXHgwMFx4MTBceDAwIiArICJceDAwXHgwMFx4MDBceDAwIiArICJceDVGXHgwRlx4M0NceEY1IiArICJceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYodW5pdHNQZXJFbSkgKyAiXHgwMFx4MDBceDAwXHgwMFx4OWVceDBiXHg3ZVx4MjciICsgIlx4MDBceDAwXHgwMFx4MDBceDllXHgwYlx4N2VceDI3IiArICJceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5kZXNjZW50KSArICJceDBGXHhGRiIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDIgOiAwKSArICJceDAwXHgxMSIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIpOworICAgICAgYnVpbGRlci5hZGRUYWJsZSgiaGhlYSIsICJceDAwXHgwMVx4MDBceDAwIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmFzY2VudCkgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5kZXNjZW50KSArICJceDAwXHgwMCIgKyAiXHhGRlx4RkYiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuY2FwSGVpZ2h0KSArIHNhZmVTdHJpbmcxNihNYXRoLnRhbihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlKSAqIHByb3BlcnRpZXMueEhlaWdodCkgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyBzdHJpbmcxNihudW1HbHlwaHMpKTsKKyAgICAgIGJ1aWxkZXIuYWRkVGFibGUoImhtdHgiLCBmdW5jdGlvbiBmb250RmllbGRzSG10eCgpIHsKKyAgICAgICAgdmFyIGNoYXJzdHJpbmdzID0gZm9udC5jaGFyc3RyaW5nczsKKyAgICAgICAgdmFyIGNmZldpZHRocyA9IGZvbnQuY2ZmID8gZm9udC5jZmYud2lkdGhzIDogbnVsbDsKKyAgICAgICAgdmFyIGhtdHggPSAiXHgwMFx4MDBceDAwXHgwMCI7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbnVtR2x5cGhzOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIHZhciB3aWR0aCA9IDA7CisKKyAgICAgICAgICBpZiAoY2hhcnN0cmluZ3MpIHsKKyAgICAgICAgICAgIHZhciBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbaSAtIDFdOworICAgICAgICAgICAgd2lkdGggPSAid2lkdGgiIGluIGNoYXJzdHJpbmcgPyBjaGFyc3RyaW5nLndpZHRoIDogMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNmZldpZHRocykgeworICAgICAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwoY2ZmV2lkdGhzW2ldIHx8IDApOworICAgICAgICAgIH0KKworICAgICAgICAgIGhtdHggKz0gc3RyaW5nMTYod2lkdGgpICsgc3RyaW5nMTYoMCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaG10eDsKKyAgICAgIH0oKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJtYXhwIiwgIlx4MDBceDAwXHg1MFx4MDAiICsgc3RyaW5nMTYobnVtR2x5cGhzKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJuYW1lIiwgY3JlYXRlTmFtZVRhYmxlKGZvbnROYW1lKSk7CisgICAgICBidWlsZGVyLmFkZFRhYmxlKCJwb3N0IiwgY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpKTsKKyAgICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTsKKyAgICB9LAorCisgICAgZ2V0IHNwYWNlV2lkdGgoKSB7CisgICAgICB2YXIgcG9zc2libGVTcGFjZVJlcGxhY2VtZW50cyA9IFsic3BhY2UiLCAibWludXMiLCAib25lIiwgImkiLCAiSSJdOworICAgICAgdmFyIHdpZHRoOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGdseXBoTmFtZSA9IHBvc3NpYmxlU3BhY2VSZXBsYWNlbWVudHNbaV07CisKKyAgICAgICAgaWYgKGdseXBoTmFtZSBpbiB0aGlzLndpZHRocykgeworICAgICAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbZ2x5cGhOYW1lXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKKyAgICAgICAgdmFyIGdseXBoVW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKKyAgICAgICAgdmFyIGNoYXJjb2RlID0gMDsKKworICAgICAgICBpZiAodGhpcy5jb21wb3NpdGUgJiYgdGhpcy5jTWFwLmNvbnRhaW5zKGdseXBoVW5pY29kZSkpIHsKKyAgICAgICAgICBjaGFyY29kZSA9IHRoaXMuY01hcC5sb29rdXAoZ2x5cGhVbmljb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2hhcmNvZGUgJiYgdGhpcy50b1VuaWNvZGUpIHsKKyAgICAgICAgICBjaGFyY29kZSA9IHRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YoZ2x5cGhVbmljb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFyY29kZSA8PSAwKSB7CisgICAgICAgICAgY2hhcmNvZGUgPSBnbHlwaFVuaWNvZGU7CisgICAgICAgIH0KKworICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2NoYXJjb2RlXTsKKworICAgICAgICBpZiAod2lkdGgpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB3aWR0aCA9IHdpZHRoIHx8IHRoaXMuZGVmYXVsdFdpZHRoOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJzcGFjZVdpZHRoIiwgd2lkdGgpOworICAgIH0sCisKKyAgICBjaGFyVG9HbHlwaDogZnVuY3Rpb24gRm9udF9jaGFyVG9HbHlwaChjaGFyY29kZSwgaXNTcGFjZSkgeworICAgICAgdmFyIGZvbnRDaGFyQ29kZSwgd2lkdGgsIG9wZXJhdG9yTGlzdElkOworICAgICAgdmFyIHdpZHRoQ29kZSA9IGNoYXJjb2RlOworCisgICAgICBpZiAodGhpcy5jTWFwICYmIHRoaXMuY01hcC5jb250YWlucyhjaGFyY29kZSkpIHsKKyAgICAgICAgd2lkdGhDb2RlID0gdGhpcy5jTWFwLmxvb2t1cChjaGFyY29kZSk7CisgICAgICB9CisKKyAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbd2lkdGhDb2RlXTsKKyAgICAgIHdpZHRoID0gKDAsIF91dGlsLmlzTnVtKSh3aWR0aCkgPyB3aWR0aCA6IHRoaXMuZGVmYXVsdFdpZHRoOworICAgICAgdmFyIHZtZXRyaWMgPSB0aGlzLnZtZXRyaWNzICYmIHRoaXMudm1ldHJpY3Nbd2lkdGhDb2RlXTsKKyAgICAgIGxldCB1bmljb2RlID0gdGhpcy50b1VuaWNvZGUuZ2V0KGNoYXJjb2RlKSB8fCB0aGlzLmZhbGxiYWNrVG9Vbmljb2RlLmdldChjaGFyY29kZSkgfHwgY2hhcmNvZGU7CisKKyAgICAgIGlmICh0eXBlb2YgdW5pY29kZSA9PT0gIm51bWJlciIpIHsKKyAgICAgICAgdW5pY29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7CisgICAgICB9CisKKyAgICAgIHZhciBpc0luRm9udCA9IChjaGFyY29kZSBpbiB0aGlzLnRvRm9udENoYXIpOworICAgICAgZm9udENoYXJDb2RlID0gdGhpcy50b0ZvbnRDaGFyW2NoYXJjb2RlXSB8fCBjaGFyY29kZTsKKworICAgICAgaWYgKHRoaXMubWlzc2luZ0ZpbGUpIHsKKyAgICAgICAgY29uc3QgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyY29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhcmNvZGVdOworCisgICAgICAgIGlmICgoZ2x5cGhOYW1lID09PSAiLm5vdGRlZiIgfHwgZ2x5cGhOYW1lID09PSAiIikgJiYgdGhpcy50eXBlID09PSAiVHlwZTEiKSB7CisgICAgICAgICAgZm9udENoYXJDb2RlID0gMHgyMDsKKyAgICAgICAgfQorCisgICAgICAgIGZvbnRDaGFyQ29kZSA9ICgwLCBfdW5pY29kZS5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcykoZm9udENoYXJDb2RlKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuaXNUeXBlM0ZvbnQpIHsKKyAgICAgICAgb3BlcmF0b3JMaXN0SWQgPSBmb250Q2hhckNvZGU7CisgICAgICB9CisKKyAgICAgIHZhciBhY2NlbnQgPSBudWxsOworCisgICAgICBpZiAodGhpcy5zZWFjTWFwICYmIHRoaXMuc2VhY01hcFtjaGFyY29kZV0pIHsKKyAgICAgICAgaXNJbkZvbnQgPSB0cnVlOworICAgICAgICB2YXIgc2VhYyA9IHRoaXMuc2VhY01hcFtjaGFyY29kZV07CisgICAgICAgIGZvbnRDaGFyQ29kZSA9IHNlYWMuYmFzZUZvbnRDaGFyQ29kZTsKKyAgICAgICAgYWNjZW50ID0geworICAgICAgICAgIGZvbnRDaGFyOiBTdHJpbmcuZnJvbUNvZGVQb2ludChzZWFjLmFjY2VudEZvbnRDaGFyQ29kZSksCisgICAgICAgICAgb2Zmc2V0OiBzZWFjLmFjY2VudE9mZnNldAorICAgICAgICB9OworICAgICAgfQorCisgICAgICBsZXQgZm9udENoYXIgPSAiIjsKKworICAgICAgaWYgKHR5cGVvZiBmb250Q2hhckNvZGUgPT09ICJudW1iZXIiKSB7CisgICAgICAgIGlmIChmb250Q2hhckNvZGUgPD0gMHgxMGZmZmYpIHsKKyAgICAgICAgICBmb250Q2hhciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGZvbnRDaGFyQ29kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBjaGFyVG9HbHlwaCAtIGludmFsaWQgZm9udENoYXJDb2RlOiAke2ZvbnRDaGFyQ29kZX1gKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdseXBoQ2FjaGVbY2hhcmNvZGVdOworCisgICAgICBpZiAoIWdseXBoIHx8ICFnbHlwaC5tYXRjaGVzRm9yQ2FjaGUoZm9udENoYXIsIHVuaWNvZGUsIGFjY2VudCwgd2lkdGgsIHZtZXRyaWMsIG9wZXJhdG9yTGlzdElkLCBpc1NwYWNlLCBpc0luRm9udCkpIHsKKyAgICAgICAgZ2x5cGggPSBuZXcgR2x5cGgoZm9udENoYXIsIHVuaWNvZGUsIGFjY2VudCwgd2lkdGgsIHZtZXRyaWMsIG9wZXJhdG9yTGlzdElkLCBpc1NwYWNlLCBpc0luRm9udCk7CisgICAgICAgIHRoaXMuZ2x5cGhDYWNoZVtjaGFyY29kZV0gPSBnbHlwaDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGdseXBoOworICAgIH0sCisgICAgY2hhcnNUb0dseXBoczogZnVuY3Rpb24gRm9udF9jaGFyc1RvR2x5cGhzKGNoYXJzKSB7CisgICAgICB2YXIgY2hhcnNDYWNoZSA9IHRoaXMuY2hhcnNDYWNoZTsKKyAgICAgIHZhciBnbHlwaHMsIGdseXBoLCBjaGFyY29kZTsKKworICAgICAgaWYgKGNoYXJzQ2FjaGUpIHsKKyAgICAgICAgZ2x5cGhzID0gY2hhcnNDYWNoZVtjaGFyc107CisKKyAgICAgICAgaWYgKGdseXBocykgeworICAgICAgICAgIHJldHVybiBnbHlwaHM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCFjaGFyc0NhY2hlKSB7CisgICAgICAgIGNoYXJzQ2FjaGUgPSB0aGlzLmNoYXJzQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgfQorCisgICAgICBnbHlwaHMgPSBbXTsKKyAgICAgIHZhciBjaGFyc0NhY2hlS2V5ID0gY2hhcnM7CisgICAgICB2YXIgaSA9IDAsCisgICAgICAgICAgaWk7CisKKyAgICAgIGlmICh0aGlzLmNNYXApIHsKKyAgICAgICAgdmFyIGMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICAgIHdoaWxlIChpIDwgY2hhcnMubGVuZ3RoKSB7CisgICAgICAgICAgdGhpcy5jTWFwLnJlYWRDaGFyQ29kZShjaGFycywgaSwgYyk7CisgICAgICAgICAgY2hhcmNvZGUgPSBjLmNoYXJjb2RlOworICAgICAgICAgIHZhciBsZW5ndGggPSBjLmxlbmd0aDsKKyAgICAgICAgICBpICs9IGxlbmd0aDsKKyAgICAgICAgICB2YXIgaXNTcGFjZSA9IGxlbmd0aCA9PT0gMSAmJiBjaGFycy5jaGFyQ29kZUF0KGkgLSAxKSA9PT0gMHgyMDsKKyAgICAgICAgICBnbHlwaCA9IHRoaXMuY2hhclRvR2x5cGgoY2hhcmNvZGUsIGlzU3BhY2UpOworICAgICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSBjaGFycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgY2hhcmNvZGUgPSBjaGFycy5jaGFyQ29kZUF0KGkpOworICAgICAgICAgIGdseXBoID0gdGhpcy5jaGFyVG9HbHlwaChjaGFyY29kZSwgY2hhcmNvZGUgPT09IDB4MjApOworICAgICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gY2hhcnNDYWNoZVtjaGFyc0NhY2hlS2V5XSA9IGdseXBoczsKKyAgICB9LAorCisgICAgZ2V0IGdseXBoQ2FjaGVWYWx1ZXMoKSB7CisgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmdseXBoQ2FjaGUpOworICAgIH0KKworICB9OworICByZXR1cm4gRm9udDsKK30oKTsKKworZXhwb3J0cy5Gb250ID0gRm9udDsKKwordmFyIEVycm9yRm9udCA9IGZ1bmN0aW9uIEVycm9yRm9udENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEVycm9yRm9udChlcnJvcikgeworICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKKyAgICB0aGlzLmxvYWRlZE5hbWUgPSAiZ19mb250X2Vycm9yIjsKKyAgICB0aGlzLm1pc3NpbmdGaWxlID0gdHJ1ZTsKKyAgfQorCisgIEVycm9yRm9udC5wcm90b3R5cGUgPSB7CisgICAgY2hhcnNUb0dseXBoczogZnVuY3Rpb24gRXJyb3JGb250X2NoYXJzVG9HbHlwaHMoKSB7CisgICAgICByZXR1cm4gW107CisgICAgfSwKKworICAgIGV4cG9ydERhdGEoZXh0cmFQcm9wZXJ0aWVzID0gZmFsc2UpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIGVycm9yOiB0aGlzLmVycm9yCisgICAgICB9OworICAgIH0KKworICB9OworICByZXR1cm4gRXJyb3JGb250OworfSgpOworCitleHBvcnRzLkVycm9yRm9udCA9IEVycm9yRm9udDsKKworZnVuY3Rpb24gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhOYW1lcykgeworICB2YXIgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB2YXIgZ2x5cGhJZCwgY2hhckNvZGUsIGJhc2VFbmNvZGluZzsKKyAgdmFyIGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CisKKyAgaWYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSkgeworICAgIGJhc2VFbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOworCisgICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgeworICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKKworICAgICAgaWYgKGdseXBoSWQgPj0gMCkgeworICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoaXNTeW1ib2xpY0ZvbnQpIHsKKyAgICBmb3IgKGNoYXJDb2RlIGluIGJ1aWx0SW5FbmNvZGluZykgeworICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gYnVpbHRJbkVuY29kaW5nW2NoYXJDb2RlXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYmFzZUVuY29kaW5nID0gX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nOworCisgICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgeworICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKKworICAgICAgaWYgKGdseXBoSWQgPj0gMCkgeworICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2YXIgZGlmZmVyZW5jZXMgPSBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzLAorICAgICAgZ2x5cGhzVW5pY29kZU1hcDsKKworICBpZiAoZGlmZmVyZW5jZXMpIHsKKyAgICBmb3IgKGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzKSB7CisgICAgICB2YXIgZ2x5cGhOYW1lID0gZGlmZmVyZW5jZXNbY2hhckNvZGVdOworICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihnbHlwaE5hbWUpOworCisgICAgICBpZiAoZ2x5cGhJZCA9PT0gLTEpIHsKKyAgICAgICAgaWYgKCFnbHlwaHNVbmljb2RlTWFwKSB7CisgICAgICAgICAgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3RhbmRhcmRHbHlwaE5hbWUgPSByZWNvdmVyR2x5cGhOYW1lKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CisKKyAgICAgICAgaWYgKHN0YW5kYXJkR2x5cGhOYW1lICE9PSBnbHlwaE5hbWUpIHsKKyAgICAgICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKHN0YW5kYXJkR2x5cGhOYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKK30KKwordmFyIFR5cGUxRm9udCA9IGZ1bmN0aW9uIFR5cGUxRm9udENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGZpbmRCbG9jayhzdHJlYW1CeXRlcywgc2lnbmF0dXJlLCBzdGFydEluZGV4KSB7CisgICAgdmFyIHN0cmVhbUJ5dGVzTGVuZ3RoID0gc3RyZWFtQnl0ZXMubGVuZ3RoOworICAgIHZhciBzaWduYXR1cmVMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOworICAgIHZhciBzY2FuTGVuZ3RoID0gc3RyZWFtQnl0ZXNMZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7CisgICAgdmFyIGkgPSBzdGFydEluZGV4LAorICAgICAgICBqLAorICAgICAgICBmb3VuZCA9IGZhbHNlOworCisgICAgd2hpbGUgKGkgPCBzY2FuTGVuZ3RoKSB7CisgICAgICBqID0gMDsKKworICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc3RyZWFtQnl0ZXNbaSArIGpdID09PSBzaWduYXR1cmVbal0pIHsKKyAgICAgICAgaisrOworICAgICAgfQorCisgICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKKyAgICAgICAgaSArPSBqOworCisgICAgICAgIHdoaWxlIChpIDwgc3RyZWFtQnl0ZXNMZW5ndGggJiYgKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoc3RyZWFtQnl0ZXNbaV0pKSB7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBmb3VuZCwKKyAgICAgIGxlbmd0aDogaQorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBnZXRIZWFkZXJCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgeworICAgIHZhciBFRVhFQ19TSUdOQVRVUkUgPSBbMHg2NSwgMHg2NSwgMHg3OCwgMHg2NSwgMHg2M107CisgICAgdmFyIHN0cmVhbVN0YXJ0UG9zID0gc3RyZWFtLnBvczsKKyAgICB2YXIgaGVhZGVyQnl0ZXMsIGhlYWRlckJ5dGVzTGVuZ3RoLCBibG9jazsKKworICAgIHRyeSB7CisgICAgICBoZWFkZXJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcyhzdWdnZXN0ZWRMZW5ndGgpOworICAgICAgaGVhZGVyQnl0ZXNMZW5ndGggPSBoZWFkZXJCeXRlcy5sZW5ndGg7CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorICAgIH0KKworICAgIGlmIChoZWFkZXJCeXRlc0xlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7CisgICAgICBibG9jayA9IGZpbmRCbG9jayhoZWFkZXJCeXRlcywgRUVYRUNfU0lHTkFUVVJFLCBzdWdnZXN0ZWRMZW5ndGggLSAyICogRUVYRUNfU0lHTkFUVVJFLmxlbmd0aCk7CisKKyAgICAgIGlmIChibG9jay5mb3VuZCAmJiBibG9jay5sZW5ndGggPT09IHN1Z2dlc3RlZExlbmd0aCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyZWFtKGhlYWRlckJ5dGVzKSwKKyAgICAgICAgICBsZW5ndGg6IHN1Z2dlc3RlZExlbmd0aAorICAgICAgICB9OworICAgICAgfQorICAgIH0KKworICAgICgwLCBfdXRpbC53YXJuKSgnSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKKyAgICBzdHJlYW0ucG9zID0gc3RyZWFtU3RhcnRQb3M7CisgICAgdmFyIFNDQU5fQkxPQ0tfTEVOR1RIID0gMjA0ODsKKyAgICB2YXIgYWN0dWFsTGVuZ3RoOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBzY2FuQnl0ZXMgPSBzdHJlYW0ucGVla0J5dGVzKFNDQU5fQkxPQ0tfTEVOR1RIKTsKKyAgICAgIGJsb2NrID0gZmluZEJsb2NrKHNjYW5CeXRlcywgRUVYRUNfU0lHTkFUVVJFLCAwKTsKKworICAgICAgaWYgKGJsb2NrLmxlbmd0aCA9PT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3RyZWFtLnBvcyArPSBibG9jay5sZW5ndGg7CisKKyAgICAgIGlmIChibG9jay5mb3VuZCkgeworICAgICAgICBhY3R1YWxMZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RyZWFtU3RhcnRQb3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsKKworICAgIGlmIChhY3R1YWxMZW5ndGgpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyZWFtKHN0cmVhbS5nZXRCeXRlcyhhY3R1YWxMZW5ndGgpKSwKKyAgICAgICAgbGVuZ3RoOiBhY3R1YWxMZW5ndGgKKyAgICAgIH07CisgICAgfQorCisgICAgKDAsIF91dGlsLndhcm4pKCdVbmFibGUgdG8gcmVjb3ZlciAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB1c2luZyBhcyBpcy4nKTsKKyAgICByZXR1cm4geworICAgICAgc3RyZWFtOiBuZXcgX3N0cmVhbS5TdHJlYW0oc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCkpLAorICAgICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0RWV4ZWNCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgeworICAgIHZhciBlZXhlY0J5dGVzID0gc3RyZWFtLmdldEJ5dGVzKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyZWFtKGVleGVjQnl0ZXMpLAorICAgICAgbGVuZ3RoOiBlZXhlY0J5dGVzLmxlbmd0aAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBUeXBlMUZvbnQobmFtZSwgZmlsZSwgcHJvcGVydGllcykgeworICAgIHZhciBQRkJfSEVBREVSX1NJWkUgPSA2OworICAgIHZhciBoZWFkZXJCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMTsKKyAgICB2YXIgZWV4ZWNCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMjsKKyAgICB2YXIgcGZiSGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoUEZCX0hFQURFUl9TSVpFKTsKKyAgICB2YXIgcGZiSGVhZGVyUHJlc2VudCA9IHBmYkhlYWRlclswXSA9PT0gMHg4MCAmJiBwZmJIZWFkZXJbMV0gPT09IDB4MDE7CisKKyAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkgeworICAgICAgZmlsZS5za2lwKFBGQl9IRUFERVJfU0laRSk7CisgICAgICBoZWFkZXJCbG9ja0xlbmd0aCA9IHBmYkhlYWRlcls1XSA8PCAyNCB8IHBmYkhlYWRlcls0XSA8PCAxNiB8IHBmYkhlYWRlclszXSA8PCA4IHwgcGZiSGVhZGVyWzJdOworICAgIH0KKworICAgIHZhciBoZWFkZXJCbG9jayA9IGdldEhlYWRlckJsb2NrKGZpbGUsIGhlYWRlckJsb2NrTGVuZ3RoKTsKKyAgICB2YXIgaGVhZGVyQmxvY2tQYXJzZXIgPSBuZXcgX3R5cGUxX3BhcnNlci5UeXBlMVBhcnNlcihoZWFkZXJCbG9jay5zdHJlYW0sIGZhbHNlLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOworICAgIGhlYWRlckJsb2NrUGFyc2VyLmV4dHJhY3RGb250SGVhZGVyKHByb3BlcnRpZXMpOworCisgICAgaWYgKHBmYkhlYWRlclByZXNlbnQpIHsKKyAgICAgIHBmYkhlYWRlciA9IGZpbGUuZ2V0Qnl0ZXMoUEZCX0hFQURFUl9TSVpFKTsKKyAgICAgIGVleGVjQmxvY2tMZW5ndGggPSBwZmJIZWFkZXJbNV0gPDwgMjQgfCBwZmJIZWFkZXJbNF0gPDwgMTYgfCBwZmJIZWFkZXJbM10gPDwgOCB8IHBmYkhlYWRlclsyXTsKKyAgICB9CisKKyAgICB2YXIgZWV4ZWNCbG9jayA9IGdldEVleGVjQmxvY2soZmlsZSwgZWV4ZWNCbG9ja0xlbmd0aCk7CisgICAgdmFyIGVleGVjQmxvY2tQYXJzZXIgPSBuZXcgX3R5cGUxX3BhcnNlci5UeXBlMVBhcnNlcihlZXhlY0Jsb2NrLnN0cmVhbSwgdHJ1ZSwgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKKyAgICB2YXIgZGF0YSA9IGVleGVjQmxvY2tQYXJzZXIuZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpOworCisgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YS5wcm9wZXJ0aWVzKSB7CisgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBkYXRhLnByb3BlcnRpZXNba2V5XTsKKyAgICB9CisKKyAgICB2YXIgY2hhcnN0cmluZ3MgPSBkYXRhLmNoYXJzdHJpbmdzOworICAgIHZhciB0eXBlMkNoYXJzdHJpbmdzID0gdGhpcy5nZXRUeXBlMkNoYXJzdHJpbmdzKGNoYXJzdHJpbmdzKTsKKyAgICB2YXIgc3VicnMgPSB0aGlzLmdldFR5cGUyU3VicnMoZGF0YS5zdWJycyk7CisgICAgdGhpcy5jaGFyc3RyaW5ncyA9IGNoYXJzdHJpbmdzOworICAgIHRoaXMuZGF0YSA9IHRoaXMud3JhcChuYW1lLCB0eXBlMkNoYXJzdHJpbmdzLCB0aGlzLmNoYXJzdHJpbmdzLCBzdWJycywgcHJvcGVydGllcyk7CisgICAgdGhpcy5zZWFjcyA9IHRoaXMuZ2V0U2VhY3MoZGF0YS5jaGFyc3RyaW5ncyk7CisgIH0KKworICBUeXBlMUZvbnQucHJvdG90eXBlID0geworICAgIGdldCBudW1HbHlwaHMoKSB7CisgICAgICByZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggKyAxOworICAgIH0sCisKKyAgICBnZXRDaGFyc2V0OiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0Q2hhcnNldCgpIHsKKyAgICAgIHZhciBjaGFyc2V0ID0gWyIubm90ZGVmIl07CisgICAgICB2YXIgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzOworCisgICAgICBmb3IgKHZhciBnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CisgICAgICAgIGNoYXJzZXQucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2hhcnNldDsKKyAgICB9LAorICAgIGdldEdseXBoTWFwcGluZzogZnVuY3Rpb24gVHlwZTFGb250X2dldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKSB7CisgICAgICB2YXIgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzOworCisgICAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKKyAgICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICAgIGZvciAobGV0IGdseXBoSWQgPSAwLCBjaGFyc3RyaW5nc0xlbiA9IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzTGVuOyBnbHlwaElkKyspIHsKKyAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGdseXBoSWQpOworICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQgKyAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOworICAgICAgfQorCisgICAgICB2YXIgZ2x5cGhOYW1lcyA9IFsiLm5vdGRlZiJdLAorICAgICAgICAgIGdseXBoSWQ7CisKKyAgICAgIGZvciAoZ2x5cGhJZCA9IDA7IGdseXBoSWQgPCBjaGFyc3RyaW5ncy5sZW5ndGg7IGdseXBoSWQrKykgeworICAgICAgICBnbHlwaE5hbWVzLnB1c2goY2hhcnN0cmluZ3NbZ2x5cGhJZF0uZ2x5cGhOYW1lKTsKKyAgICAgIH0KKworICAgICAgdmFyIGVuY29kaW5nID0gcHJvcGVydGllcy5idWlsdEluRW5jb2Rpbmc7CisKKyAgICAgIGlmIChlbmNvZGluZykgeworICAgICAgICB2YXIgYnVpbHRJbkVuY29kaW5nID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgICBmb3IgKHZhciBjaGFyQ29kZSBpbiBlbmNvZGluZykgeworICAgICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoZW5jb2RpbmdbY2hhckNvZGVdKTsKKworICAgICAgICAgIGlmIChnbHlwaElkID49IDApIHsKKyAgICAgICAgICAgIGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhOYW1lcyk7CisgICAgfSwKKyAgICBoYXNHbHlwaElkOiBmdW5jdGlvbiBUeXBlMUZvbnRfaGFzR2x5cGhJRChpZCkgeworICAgICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLm51bUdseXBocykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChpZCA9PT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdmFyIGdseXBoID0gdGhpcy5jaGFyc3RyaW5nc1tpZCAtIDFdOworICAgICAgcmV0dXJuIGdseXBoLmNoYXJzdHJpbmcubGVuZ3RoID4gMDsKKyAgICB9LAorICAgIGdldFNlYWNzOiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0U2VhY3MoY2hhcnN0cmluZ3MpIHsKKyAgICAgIHZhciBpLCBpaTsKKyAgICAgIHZhciBzZWFjTWFwID0gW107CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gY2hhcnN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgY2hhcnN0cmluZyA9IGNoYXJzdHJpbmdzW2ldOworCisgICAgICAgIGlmIChjaGFyc3RyaW5nLnNlYWMpIHsKKyAgICAgICAgICBzZWFjTWFwW2kgKyAxXSA9IGNoYXJzdHJpbmcuc2VhYzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gc2VhY01hcDsKKyAgICB9LAorICAgIGdldFR5cGUyQ2hhcnN0cmluZ3M6IGZ1bmN0aW9uIFR5cGUxRm9udF9nZXRUeXBlMkNoYXJzdHJpbmdzKHR5cGUxQ2hhcnN0cmluZ3MpIHsKKyAgICAgIHZhciB0eXBlMkNoYXJzdHJpbmdzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHR5cGUxQ2hhcnN0cmluZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB0eXBlMkNoYXJzdHJpbmdzLnB1c2godHlwZTFDaGFyc3RyaW5nc1tpXS5jaGFyc3RyaW5nKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHR5cGUyQ2hhcnN0cmluZ3M7CisgICAgfSwKKyAgICBnZXRUeXBlMlN1YnJzOiBmdW5jdGlvbiBUeXBlMUZvbnRfZ2V0VHlwZTJTdWJycyh0eXBlMVN1YnJzKSB7CisgICAgICB2YXIgYmlhcyA9IDA7CisgICAgICB2YXIgY291bnQgPSB0eXBlMVN1YnJzLmxlbmd0aDsKKworICAgICAgaWYgKGNvdW50IDwgMTEzMykgeworICAgICAgICBiaWFzID0gMTA3OworICAgICAgfSBlbHNlIGlmIChjb3VudCA8IDMzNzY5KSB7CisgICAgICAgIGJpYXMgPSAxMTMxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmlhcyA9IDMyNzY4OworICAgICAgfQorCisgICAgICB2YXIgdHlwZTJTdWJycyA9IFtdOworICAgICAgdmFyIGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBiaWFzOyBpKyspIHsKKyAgICAgICAgdHlwZTJTdWJycy5wdXNoKFsweDBiXSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHR5cGUyU3VicnMucHVzaCh0eXBlMVN1YnJzW2ldKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHR5cGUyU3VicnM7CisgICAgfSwKKyAgICB3cmFwOiBmdW5jdGlvbiBUeXBlMUZvbnRfd3JhcChuYW1lLCBnbHlwaHMsIGNoYXJzdHJpbmdzLCBzdWJycywgcHJvcGVydGllcykgeworICAgICAgdmFyIGNmZiA9IG5ldyBfY2ZmX3BhcnNlci5DRkYoKTsKKyAgICAgIGNmZi5oZWFkZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGSGVhZGVyKDEsIDAsIDQsIDQpOworICAgICAgY2ZmLm5hbWVzID0gW25hbWVdOworICAgICAgdmFyIHRvcERpY3QgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGVG9wRGljdCgpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoInZlcnNpb24iLCAzOTEpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIk5vdGljZSIsIDM5Mik7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRnVsbE5hbWUiLCAzOTMpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIkZhbWlseU5hbWUiLCAzOTQpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIldlaWdodCIsIDM5NSk7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRW5jb2RpbmciLCBudWxsKTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGb250TWF0cml4IiwgcHJvcGVydGllcy5mb250TWF0cml4KTsKKyAgICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGb250QkJveCIsIHByb3BlcnRpZXMuYmJveCk7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiY2hhcnNldCIsIG51bGwpOworICAgICAgdG9wRGljdC5zZXRCeU5hbWUoIkNoYXJTdHJpbmdzIiwgbnVsbCk7CisgICAgICB0b3BEaWN0LnNldEJ5TmFtZSgiUHJpdmF0ZSIsIG51bGwpOworICAgICAgY2ZmLnRvcERpY3QgPSB0b3BEaWN0OworICAgICAgdmFyIHN0cmluZ3MgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGU3RyaW5ncygpOworICAgICAgc3RyaW5ncy5hZGQoIlZlcnNpb24gMC4xMSIpOworICAgICAgc3RyaW5ncy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKTsKKyAgICAgIHN0cmluZ3MuYWRkKG5hbWUpOworICAgICAgc3RyaW5ncy5hZGQobmFtZSk7CisgICAgICBzdHJpbmdzLmFkZCgiTWVkaXVtIik7CisgICAgICBjZmYuc3RyaW5ncyA9IHN0cmluZ3M7CisgICAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gbmV3IF9jZmZfcGFyc2VyLkNGRkluZGV4KCk7CisgICAgICB2YXIgY291bnQgPSBnbHlwaHMubGVuZ3RoOworICAgICAgdmFyIGNoYXJzZXRBcnJheSA9IFsiLm5vdGRlZiJdOworICAgICAgdmFyIGksIGlpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBnbHlwaE5hbWUgPSBjaGFyc3RyaW5nc1tpXS5nbHlwaE5hbWU7CisKKyAgICAgICAgY29uc3QgaW5kZXggPSBfY2ZmX3BhcnNlci5DRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihnbHlwaE5hbWUpOworCisgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsKKyAgICAgICAgICBzdHJpbmdzLmFkZChnbHlwaE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgY2hhcnNldEFycmF5LnB1c2goZ2x5cGhOYW1lKTsKKyAgICAgIH0KKworICAgICAgY2ZmLmNoYXJzZXQgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ2hhcnNldChmYWxzZSwgMCwgY2hhcnNldEFycmF5KTsKKyAgICAgIHZhciBjaGFyU3RyaW5nc0luZGV4ID0gbmV3IF9jZmZfcGFyc2VyLkNGRkluZGV4KCk7CisgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChbMHg4YiwgMHgwZV0pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaHNbaV0pOworICAgICAgfQorCisgICAgICBjZmYuY2hhclN0cmluZ3MgPSBjaGFyU3RyaW5nc0luZGV4OworICAgICAgdmFyIHByaXZhdGVEaWN0ID0gbmV3IF9jZmZfcGFyc2VyLkNGRlByaXZhdGVEaWN0KCk7CisgICAgICBwcml2YXRlRGljdC5zZXRCeU5hbWUoIlN1YnJzIiwgbnVsbCk7CisgICAgICB2YXIgZmllbGRzID0gWyJCbHVlVmFsdWVzIiwgIk90aGVyQmx1ZXMiLCAiRmFtaWx5Qmx1ZXMiLCAiRmFtaWx5T3RoZXJCbHVlcyIsICJTdGVtU25hcEgiLCAiU3RlbVNuYXBWIiwgIkJsdWVTaGlmdCIsICJCbHVlRnV6eiIsICJCbHVlU2NhbGUiLCAiTGFuZ3VhZ2VHcm91cCIsICJFeHBhbnNpb25GYWN0b3IiLCAiRm9yY2VCb2xkIiwgIlN0ZEhXIiwgIlN0ZFZXIl07CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZmllbGRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldOworCisgICAgICAgIGlmICghKGZpZWxkIGluIHByb3BlcnRpZXMucHJpdmF0ZURhdGEpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2ZpZWxkXTsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gdmFsdWUubGVuZ3RoIC0gMTsgaiA+IDA7IGotLSkgeworICAgICAgICAgICAgdmFsdWVbal0gLT0gdmFsdWVbaiAtIDFdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZShmaWVsZCwgdmFsdWUpOworICAgICAgfQorCisgICAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OworICAgICAgdmFyIHN1YnJJbmRleCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZJbmRleCgpOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHN1YnJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgc3VickluZGV4LmFkZChzdWJyc1tpXSk7CisgICAgICB9CisKKyAgICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJySW5kZXg7CisgICAgICB2YXIgY29tcGlsZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIoY2ZmKTsKKyAgICAgIHJldHVybiBjb21waWxlci5jb21waWxlKCk7CisgICAgfQorICB9OworICByZXR1cm4gVHlwZTFGb250OworfSgpOworCit2YXIgQ0ZGRm9udCA9IGZ1bmN0aW9uIENGRkZvbnRDbG9zdXJlKCkgeworICBmdW5jdGlvbiBDRkZGb250KGZpbGUsIHByb3BlcnRpZXMpIHsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICAgIHZhciBwYXJzZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKGZpbGUsIHByb3BlcnRpZXMsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgdGhpcy5jZmYgPSBwYXJzZXIucGFyc2UoKTsKKyAgICB0aGlzLmNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7CisgICAgdmFyIGNvbXBpbGVyID0gbmV3IF9jZmZfcGFyc2VyLkNGRkNvbXBpbGVyKHRoaXMuY2ZmKTsKKyAgICB0aGlzLnNlYWNzID0gdGhpcy5jZmYuc2VhY3M7CisKKyAgICB0cnkgeworICAgICAgdGhpcy5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiICsgcHJvcGVydGllcy5sb2FkZWROYW1lKTsKKyAgICAgIHRoaXMuZGF0YSA9IGZpbGU7CisgICAgfQorICB9CisKKyAgQ0ZGRm9udC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IG51bUdseXBocygpIHsKKyAgICAgIHJldHVybiB0aGlzLmNmZi5jaGFyU3RyaW5ncy5jb3VudDsKKyAgICB9LAorCisgICAgZ2V0Q2hhcnNldDogZnVuY3Rpb24gQ0ZGRm9udF9nZXRDaGFyc2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMuY2ZmLmNoYXJzZXQuY2hhcnNldDsKKyAgICB9LAorICAgIGdldEdseXBoTWFwcGluZzogZnVuY3Rpb24gQ0ZGRm9udF9nZXRHbHlwaE1hcHBpbmcoKSB7CisgICAgICB2YXIgY2ZmID0gdGhpcy5jZmY7CisgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKKyAgICAgIHZhciBjaGFyc2V0cyA9IGNmZi5jaGFyc2V0LmNoYXJzZXQ7CisgICAgICB2YXIgY2hhckNvZGVUb0dseXBoSWQ7CisgICAgICB2YXIgZ2x5cGhJZDsKKworICAgICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CisgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgbGV0IGNoYXJDb2RlOworCisgICAgICAgIGlmIChjZmYuaXNDSURGb250KSB7CisgICAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzZXRzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CisgICAgICAgICAgICB2YXIgY2lkID0gY2hhcnNldHNbZ2x5cGhJZF07CisgICAgICAgICAgICBjaGFyQ29kZSA9IHByb3BlcnRpZXMuY01hcC5jaGFyQ29kZU9mKGNpZCk7CisgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGdseXBoSWQgPSAwOyBnbHlwaElkIDwgY2ZmLmNoYXJTdHJpbmdzLmNvdW50OyBnbHlwaElkKyspIHsKKyAgICAgICAgICAgIGNoYXJDb2RlID0gcHJvcGVydGllcy5jTWFwLmNoYXJDb2RlT2YoZ2x5cGhJZCk7CisgICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKKyAgICAgIH0KKworICAgICAgdmFyIGVuY29kaW5nID0gY2ZmLmVuY29kaW5nID8gY2ZmLmVuY29kaW5nLmVuY29kaW5nIDogbnVsbDsKKyAgICAgIGNoYXJDb2RlVG9HbHlwaElkID0gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGVuY29kaW5nLCBjaGFyc2V0cyk7CisgICAgICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7CisgICAgfSwKKyAgICBoYXNHbHlwaElkOiBmdW5jdGlvbiBDRkZGb250X2hhc0dseXBoSUQoaWQpIHsKKyAgICAgIHJldHVybiB0aGlzLmNmZi5oYXNHbHlwaElkKGlkKTsKKyAgICB9CisgIH07CisgIHJldHVybiBDRkZGb250OworfSgpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL2Z1bmN0aW9uLmpzIGIvbGliL2NvcmUvZnVuY3Rpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4NTliYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL2Z1bmN0aW9uLmpzCkBAIC0wLDAgKzEsMTQzOCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuaXNQREZGdW5jdGlvbiA9IGlzUERGRnVuY3Rpb247CitleHBvcnRzLlBvc3RTY3JpcHRDb21waWxlciA9IGV4cG9ydHMuUG9zdFNjcmlwdEV2YWx1YXRvciA9IGV4cG9ydHMuUERGRnVuY3Rpb25GYWN0b3J5ID0gdm9pZCAwOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuL3ByaW1pdGl2ZXMuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9wc19wYXJzZXIgPSByZXF1aXJlKCIuL3BzX3BhcnNlci5qcyIpOworCit2YXIgX2ltYWdlX3V0aWxzID0gcmVxdWlyZSgiLi9pbWFnZV91dGlscy5qcyIpOworCitjbGFzcyBQREZGdW5jdGlvbkZhY3RvcnkgeworICBjb25zdHJ1Y3Rvcih7CisgICAgeHJlZiwKKyAgICBpc0V2YWxTdXBwb3J0ZWQgPSB0cnVlCisgIH0pIHsKKyAgICB0aGlzLnhyZWYgPSB4cmVmOworICAgIHRoaXMuaXNFdmFsU3VwcG9ydGVkID0gaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTsKKyAgICB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUgPSBudWxsOworICB9CisKKyAgY3JlYXRlKGZuKSB7CisgICAgY29uc3QgY2FjaGVkRnVuY3Rpb24gPSB0aGlzLmdldENhY2hlZChmbik7CisKKyAgICBpZiAoY2FjaGVkRnVuY3Rpb24pIHsKKyAgICAgIHJldHVybiBjYWNoZWRGdW5jdGlvbjsKKyAgICB9CisKKyAgICBjb25zdCBwYXJzZWRGdW5jdGlvbiA9IFBERkZ1bmN0aW9uLnBhcnNlKHsKKyAgICAgIHhyZWY6IHRoaXMueHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICBmbjogZm4gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYgPyB0aGlzLnhyZWYuZmV0Y2goZm4pIDogZm4KKyAgICB9KTsKKworICAgIHRoaXMuX2NhY2hlKGZuLCBwYXJzZWRGdW5jdGlvbik7CisKKyAgICByZXR1cm4gcGFyc2VkRnVuY3Rpb247CisgIH0KKworICBjcmVhdGVGcm9tQXJyYXkoZm5PYmopIHsKKyAgICBjb25zdCBjYWNoZWRGdW5jdGlvbiA9IHRoaXMuZ2V0Q2FjaGVkKGZuT2JqKTsKKworICAgIGlmIChjYWNoZWRGdW5jdGlvbikgeworICAgICAgcmV0dXJuIGNhY2hlZEZ1bmN0aW9uOworICAgIH0KKworICAgIGNvbnN0IHBhcnNlZEZ1bmN0aW9uID0gUERGRnVuY3Rpb24ucGFyc2VBcnJheSh7CisgICAgICB4cmVmOiB0aGlzLnhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHRoaXMuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgZm5PYmo6IGZuT2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmID8gdGhpcy54cmVmLmZldGNoKGZuT2JqKSA6IGZuT2JqCisgICAgfSk7CisKKyAgICB0aGlzLl9jYWNoZShmbk9iaiwgcGFyc2VkRnVuY3Rpb24pOworCisgICAgcmV0dXJuIHBhcnNlZEZ1bmN0aW9uOworICB9CisKKyAgZ2V0Q2FjaGVkKGNhY2hlS2V5KSB7CisgICAgbGV0IGZuUmVmOworCisgICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICBmblJlZiA9IGNhY2hlS2V5OworICAgIH0gZWxzZSBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CisgICAgICBmblJlZiA9IGNhY2hlS2V5Lm9iaklkOworICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShjYWNoZUtleSkpIHsKKyAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdCAmJiBjYWNoZUtleS5kaWN0Lm9iaklkOworICAgIH0KKworICAgIGlmIChmblJlZikgeworICAgICAgaWYgKCF0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUpIHsKKyAgICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEZ1bmN0aW9uQ2FjaGUoKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgbG9jYWxGdW5jdGlvbiA9IHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5nZXRCeVJlZihmblJlZik7CisKKyAgICAgIGlmIChsb2NhbEZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBsb2NhbEZ1bmN0aW9uOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgX2NhY2hlKGNhY2hlS2V5LCBwYXJzZWRGdW5jdGlvbikgeworICAgIGlmICghcGFyc2VkRnVuY3Rpb24pIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignUERGRnVuY3Rpb25GYWN0b3J5Ll9jYWNoZSAtIGV4cGVjdGVkICJwYXJzZWRGdW5jdGlvbiIgYXJndW1lbnQuJyk7CisgICAgfQorCisgICAgbGV0IGZuUmVmOworCisgICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICBmblJlZiA9IGNhY2hlS2V5OworICAgIH0gZWxzZSBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CisgICAgICBmblJlZiA9IGNhY2hlS2V5Lm9iaklkOworICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShjYWNoZUtleSkpIHsKKyAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdCAmJiBjYWNoZUtleS5kaWN0Lm9iaklkOworICAgIH0KKworICAgIGlmIChmblJlZikgeworICAgICAgaWYgKCF0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUpIHsKKyAgICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEZ1bmN0aW9uQ2FjaGUoKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlLnNldChudWxsLCBmblJlZiwgcGFyc2VkRnVuY3Rpb24pOworICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuUERGRnVuY3Rpb25GYWN0b3J5ID0gUERGRnVuY3Rpb25GYWN0b3J5OworCitmdW5jdGlvbiB0b051bWJlckFycmF5KGFycikgeworICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgaWYgKHR5cGVvZiBhcnJbaV0gIT09ICJudW1iZXIiKSB7CisgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgICByZXN1bHRbal0gPSArYXJyW2pdOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgfQorCisgIHJldHVybiBhcnI7Cit9CisKK3ZhciBQREZGdW5jdGlvbiA9IGZ1bmN0aW9uIFBERkZ1bmN0aW9uQ2xvc3VyZSgpIHsKKyAgY29uc3QgQ09OU1RSVUNUX1NBTVBMRUQgPSAwOworICBjb25zdCBDT05TVFJVQ1RfSU5URVJQT0xBVEVEID0gMjsKKyAgY29uc3QgQ09OU1RSVUNUX1NUSUNIRUQgPSAzOworICBjb25zdCBDT05TVFJVQ1RfUE9TVFNDUklQVCA9IDQ7CisgIHJldHVybiB7CisgICAgZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBzdHJlYW0pIHsKKyAgICAgIHZhciBpLCBpaTsKKyAgICAgIHZhciBsZW5ndGggPSAxOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHNpemUubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBsZW5ndGggKj0gc2l6ZVtpXTsKKyAgICAgIH0KKworICAgICAgbGVuZ3RoICo9IG91dHB1dFNpemU7CisgICAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKyAgICAgIHZhciBjb2RlU2l6ZSA9IDA7CisgICAgICB2YXIgY29kZUJ1ZiA9IDA7CisgICAgICB2YXIgc2FtcGxlTXVsID0gMS4wIC8gKDIuMCAqKiBicHMgLSAxKTsKKyAgICAgIHZhciBzdHJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcygobGVuZ3RoICogYnBzICsgNykgLyA4KTsKKyAgICAgIHZhciBzdHJJZHggPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgd2hpbGUgKGNvZGVTaXplIDwgYnBzKSB7CisgICAgICAgICAgY29kZUJ1ZiA8PD0gODsKKyAgICAgICAgICBjb2RlQnVmIHw9IHN0ckJ5dGVzW3N0cklkeCsrXTsKKyAgICAgICAgICBjb2RlU2l6ZSArPSA4OworICAgICAgICB9CisKKyAgICAgICAgY29kZVNpemUgLT0gYnBzOworICAgICAgICBhcnJheVtpXSA9IChjb2RlQnVmID4+IGNvZGVTaXplKSAqIHNhbXBsZU11bDsKKyAgICAgICAgY29kZUJ1ZiAmPSAoMSA8PCBjb2RlU2l6ZSkgLSAxOworICAgICAgfQorCisgICAgICByZXR1cm4gYXJyYXk7CisgICAgfSwKKworICAgIGdldElSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBmbgorICAgIH0pIHsKKyAgICAgIHZhciBkaWN0ID0gZm4uZGljdDsKKworICAgICAgaWYgKCFkaWN0KSB7CisgICAgICAgIGRpY3QgPSBmbjsKKyAgICAgIH0KKworICAgICAgdmFyIHR5cGVzID0gW3RoaXMuY29uc3RydWN0U2FtcGxlZCwgbnVsbCwgdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQsIHRoaXMuY29uc3RydWN0U3RpY2hlZCwgdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0XTsKKyAgICAgIHZhciB0eXBlTnVtID0gZGljdC5nZXQoIkZ1bmN0aW9uVHlwZSIpOworICAgICAgdmFyIHR5cGVGbiA9IHR5cGVzW3R5cGVOdW1dOworCisgICAgICBpZiAoIXR5cGVGbikgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZSBvZiBmdW5jdGlvbiIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHlwZUZuLmNhbGwodGhpcywgeworICAgICAgICB4cmVmLAorICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgIGZuLAorICAgICAgICBkaWN0CisgICAgICB9KTsKKyAgICB9LAorCisgICAgZnJvbUlSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBJUgorICAgIH0pIHsKKyAgICAgIHZhciB0eXBlID0gSVJbMF07CisKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIENPTlNUUlVDVF9TQU1QTEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWRGcm9tSVIoeworICAgICAgICAgICAgeHJlZiwKKyAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICAgIElSCisgICAgICAgICAgfSk7CisKKyAgICAgICAgY2FzZSBDT05TVFJVQ1RfSU5URVJQT0xBVEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdEludGVycG9sYXRlZEZyb21JUih7CisgICAgICAgICAgICB4cmVmLAorICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgICAgSVIKKyAgICAgICAgICB9KTsKKworICAgICAgICBjYXNlIENPTlNUUlVDVF9TVElDSEVEOgorICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFN0aWNoZWRGcm9tSVIoeworICAgICAgICAgICAgeHJlZiwKKyAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICAgIElSCisgICAgICAgICAgfSk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSKHsKKyAgICAgICAgICAgIHhyZWYsCisgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgICBJUgorICAgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICBwYXJzZSh7CisgICAgICB4cmVmLAorICAgICAgaXNFdmFsU3VwcG9ydGVkLAorICAgICAgZm4KKyAgICB9KSB7CisgICAgICBjb25zdCBJUiA9IHRoaXMuZ2V0SVIoeworICAgICAgICB4cmVmLAorICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgIGZuCisgICAgICB9KTsKKyAgICAgIHJldHVybiB0aGlzLmZyb21JUih7CisgICAgICAgIHhyZWYsCisgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgSVIKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBwYXJzZUFycmF5KHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBmbk9iagorICAgIH0pIHsKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheShmbk9iaikpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoeworICAgICAgICAgIHhyZWYsCisgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICAgIGZuOiBmbk9iagorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdmFyIGZuQXJyYXkgPSBbXTsKKworICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gZm5PYmoubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICBmbkFycmF5LnB1c2godGhpcy5wYXJzZSh7CisgICAgICAgICAgeHJlZiwKKyAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgZm46IHhyZWYuZmV0Y2hJZlJlZihmbk9ialtqXSkKKyAgICAgICAgfSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gZnVuY3Rpb24gKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGZuQXJyYXlbaV0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQgKyBpKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9LAorCisgICAgY29uc3RydWN0U2FtcGxlZCh7CisgICAgICB4cmVmLAorICAgICAgaXNFdmFsU3VwcG9ydGVkLAorICAgICAgZm4sCisgICAgICBkaWN0CisgICAgfSkgeworICAgICAgZnVuY3Rpb24gdG9NdWx0aUFycmF5KGFycikgeworICAgICAgICB2YXIgaW5wdXRMZW5ndGggPSBhcnIubGVuZ3RoOworICAgICAgICB2YXIgb3V0ID0gW107CisgICAgICAgIHZhciBpbmRleCA9IDA7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgb3V0W2luZGV4XSA9IFthcnJbaV0sIGFycltpICsgMV1dOworICAgICAgICAgICsraW5kZXg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3V0OworICAgICAgfQorCisgICAgICB2YXIgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CisgICAgICB2YXIgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOworCisgICAgICBpZiAoIWRvbWFpbiB8fCAhcmFuZ2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBkb21haW4gb3IgcmFuZ2UiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggLyAyOworICAgICAgdmFyIG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggLyAyOworICAgICAgZG9tYWluID0gdG9NdWx0aUFycmF5KGRvbWFpbik7CisgICAgICByYW5nZSA9IHRvTXVsdGlBcnJheShyYW5nZSk7CisgICAgICB2YXIgc2l6ZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiU2l6ZSIpKTsKKyAgICAgIHZhciBicHMgPSBkaWN0LmdldCgiQml0c1BlclNhbXBsZSIpOworICAgICAgdmFyIG9yZGVyID0gZGljdC5nZXQoIk9yZGVyIikgfHwgMTsKKworICAgICAgaWYgKG9yZGVyICE9PSAxKSB7CisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiTm8gc3VwcG9ydCBmb3IgY3ViaWMgc3BsaW5lIGludGVycG9sYXRpb246ICIgKyBvcmRlcik7CisgICAgICB9CisKKyAgICAgIHZhciBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKKworICAgICAgaWYgKCFlbmNvZGUpIHsKKyAgICAgICAgZW5jb2RlID0gW107CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dFNpemU7ICsraSkgeworICAgICAgICAgIGVuY29kZS5wdXNoKFswLCBzaXplW2ldIC0gMV0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBlbmNvZGUgPSB0b011bHRpQXJyYXkoZW5jb2RlKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRGVjb2RlIikpOworCisgICAgICBpZiAoIWRlY29kZSkgeworICAgICAgICBkZWNvZGUgPSByYW5nZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlY29kZSA9IHRvTXVsdGlBcnJheShkZWNvZGUpOworICAgICAgfQorCisgICAgICB2YXIgc2FtcGxlcyA9IHRoaXMuZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBmbik7CisgICAgICByZXR1cm4gW0NPTlNUUlVDVF9TQU1QTEVELCBpbnB1dFNpemUsIGRvbWFpbiwgZW5jb2RlLCBkZWNvZGUsIHNhbXBsZXMsIHNpemUsIG91dHB1dFNpemUsIDIgKiogYnBzIC0gMSwgcmFuZ2VdOworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RTYW1wbGVkRnJvbUlSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBJUgorICAgIH0pIHsKKyAgICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKHgsIHhtaW4sIHhtYXgsIHltaW4sIHltYXgpIHsKKyAgICAgICAgcmV0dXJuIHltaW4gKyAoeCAtIHhtaW4pICogKCh5bWF4IC0geW1pbikgLyAoeG1heCAtIHhtaW4pKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFNhbXBsZWRGcm9tSVJSZXN1bHQoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgICAgdmFyIG0gPSBJUlsxXTsKKyAgICAgICAgdmFyIGRvbWFpbiA9IElSWzJdOworICAgICAgICB2YXIgZW5jb2RlID0gSVJbM107CisgICAgICAgIHZhciBkZWNvZGUgPSBJUls0XTsKKyAgICAgICAgdmFyIHNhbXBsZXMgPSBJUls1XTsKKyAgICAgICAgdmFyIHNpemUgPSBJUls2XTsKKyAgICAgICAgdmFyIG4gPSBJUls3XTsKKyAgICAgICAgdmFyIHJhbmdlID0gSVJbOV07CisgICAgICAgIHZhciBjdWJlVmVydGljZXMgPSAxIDw8IG07CisgICAgICAgIHZhciBjdWJlTiA9IG5ldyBGbG9hdDY0QXJyYXkoY3ViZVZlcnRpY2VzKTsKKyAgICAgICAgdmFyIGN1YmVWZXJ0ZXggPSBuZXcgVWludDMyQXJyYXkoY3ViZVZlcnRpY2VzKTsKKyAgICAgICAgdmFyIGksIGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1YmVWZXJ0aWNlczsgaisrKSB7CisgICAgICAgICAgY3ViZU5bal0gPSAxOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGsgPSBuLAorICAgICAgICAgICAgcG9zID0gMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CisgICAgICAgICAgdmFyIGRvbWFpbl8yaSA9IGRvbWFpbltpXVswXTsKKyAgICAgICAgICB2YXIgZG9tYWluXzJpXzEgPSBkb21haW5baV1bMV07CisgICAgICAgICAgdmFyIHhpID0gTWF0aC5taW4oTWF0aC5tYXgoc3JjW3NyY09mZnNldCArIGldLCBkb21haW5fMmkpLCBkb21haW5fMmlfMSk7CisgICAgICAgICAgdmFyIGUgPSBpbnRlcnBvbGF0ZSh4aSwgZG9tYWluXzJpLCBkb21haW5fMmlfMSwgZW5jb2RlW2ldWzBdLCBlbmNvZGVbaV1bMV0pOworICAgICAgICAgIHZhciBzaXplX2kgPSBzaXplW2ldOworICAgICAgICAgIGUgPSBNYXRoLm1pbihNYXRoLm1heChlLCAwKSwgc2l6ZV9pIC0gMSk7CisgICAgICAgICAgdmFyIGUwID0gZSA8IHNpemVfaSAtIDEgPyBNYXRoLmZsb29yKGUpIDogZSAtIDE7CisgICAgICAgICAgdmFyIG4wID0gZTAgKyAxIC0gZTsKKyAgICAgICAgICB2YXIgbjEgPSBlIC0gZTA7CisgICAgICAgICAgdmFyIG9mZnNldDAgPSBlMCAqIGs7CisgICAgICAgICAgdmFyIG9mZnNldDEgPSBvZmZzZXQwICsgazsKKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWJlVmVydGljZXM7IGorKykgeworICAgICAgICAgICAgaWYgKGogJiBwb3MpIHsKKyAgICAgICAgICAgICAgY3ViZU5bal0gKj0gbjE7CisgICAgICAgICAgICAgIGN1YmVWZXJ0ZXhbal0gKz0gb2Zmc2V0MTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGN1YmVOW2pdICo9IG4wOworICAgICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgayAqPSBzaXplX2k7CisgICAgICAgICAgcG9zIDw8PSAxOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgIHZhciByaiA9IDA7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3ViZVZlcnRpY2VzOyBpKyspIHsKKyAgICAgICAgICAgIHJqICs9IHNhbXBsZXNbY3ViZVZlcnRleFtpXSArIGpdICogY3ViZU5baV07CisgICAgICAgICAgfQorCisgICAgICAgICAgcmogPSBpbnRlcnBvbGF0ZShyaiwgMCwgMSwgZGVjb2RlW2pdWzBdLCBkZWNvZGVbal1bMV0pOworICAgICAgICAgIGRlc3RbZGVzdE9mZnNldCArIGpdID0gTWF0aC5taW4oTWF0aC5tYXgocmosIHJhbmdlW2pdWzBdKSwgcmFuZ2Vbal1bMV0pOworICAgICAgICB9CisgICAgICB9OworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoeworICAgICAgeHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgIGZuLAorICAgICAgZGljdAorICAgIH0pIHsKKyAgICAgIHZhciBjMCA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiQzAiKSkgfHwgWzBdOworICAgICAgdmFyIGMxID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJDMSIpKSB8fCBbMV07CisgICAgICB2YXIgbiA9IGRpY3QuZ2V0KCJOIik7CisgICAgICB2YXIgbGVuZ3RoID0gYzAubGVuZ3RoOworICAgICAgdmFyIGRpZmYgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBkaWZmLnB1c2goYzFbaV0gLSBjMFtpXSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBbQ09OU1RSVUNUX0lOVEVSUE9MQVRFRCwgYzAsIGRpZmYsIG5dOworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVIoeworICAgICAgeHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgIElSCisgICAgfSkgeworICAgICAgdmFyIGMwID0gSVJbMV07CisgICAgICB2YXIgZGlmZiA9IElSWzJdOworICAgICAgdmFyIG4gPSBJUlszXTsKKyAgICAgIHZhciBsZW5ndGggPSBkaWZmLmxlbmd0aDsKKyAgICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGcm9tSVJSZXN1bHQoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgICAgdmFyIHggPSBuID09PSAxID8gc3JjW3NyY09mZnNldF0gOiBzcmNbc3JjT2Zmc2V0XSAqKiBuOworCisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKKyAgICAgICAgICBkZXN0W2Rlc3RPZmZzZXQgKyBqXSA9IGMwW2pdICsgeCAqIGRpZmZbal07CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfSwKKworICAgIGNvbnN0cnVjdFN0aWNoZWQoeworICAgICAgeHJlZiwKKyAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgIGZuLAorICAgICAgZGljdAorICAgIH0pIHsKKyAgICAgIHZhciBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKKworICAgICAgaWYgKCFkb21haW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBkb21haW4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggLyAyOworCisgICAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGRvbWFpbiBmb3Igc3RpY2hlZCBmdW5jdGlvbiIpOworICAgICAgfQorCisgICAgICB2YXIgZm5SZWZzID0gZGljdC5nZXQoIkZ1bmN0aW9ucyIpOworICAgICAgdmFyIGZucyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmblJlZnMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICBmbnMucHVzaCh0aGlzLnBhcnNlKHsKKyAgICAgICAgICB4cmVmLAorICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKKyAgICAgICAgICBmbjogeHJlZi5mZXRjaElmUmVmKGZuUmVmc1tpXSkKKyAgICAgICAgfSkpOworICAgICAgfQorCisgICAgICB2YXIgYm91bmRzID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJCb3VuZHMiKSk7CisgICAgICB2YXIgZW5jb2RlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJFbmNvZGUiKSk7CisgICAgICByZXR1cm4gW0NPTlNUUlVDVF9TVElDSEVELCBkb21haW4sIGJvdW5kcywgZW5jb2RlLCBmbnNdOworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBJUgorICAgIH0pIHsKKyAgICAgIHZhciBkb21haW4gPSBJUlsxXTsKKyAgICAgIHZhciBib3VuZHMgPSBJUlsyXTsKKyAgICAgIHZhciBlbmNvZGUgPSBJUlszXTsKKyAgICAgIHZhciBmbnMgPSBJUls0XTsKKyAgICAgIHZhciB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KDEpOworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGcm9tSVJSZXN1bHQoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKKyAgICAgICAgdmFyIGNsaXAgPSBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSQ2xpcCh2LCBtaW4sIG1heCkgeworICAgICAgICAgIGlmICh2ID4gbWF4KSB7CisgICAgICAgICAgICB2ID0gbWF4OworICAgICAgICAgIH0gZWxzZSBpZiAodiA8IG1pbikgeworICAgICAgICAgICAgdiA9IG1pbjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfTsKKworICAgICAgICB2YXIgdiA9IGNsaXAoc3JjW3NyY09mZnNldF0sIGRvbWFpblswXSwgZG9tYWluWzFdKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBib3VuZHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIGlmICh2IDwgYm91bmRzW2ldKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgZG1pbiA9IGRvbWFpblswXTsKKworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICBkbWluID0gYm91bmRzW2kgLSAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkbWF4ID0gZG9tYWluWzFdOworCisgICAgICAgIGlmIChpIDwgYm91bmRzLmxlbmd0aCkgeworICAgICAgICAgIGRtYXggPSBib3VuZHNbaV07CisgICAgICAgIH0KKworICAgICAgICB2YXIgcm1pbiA9IGVuY29kZVsyICogaV07CisgICAgICAgIHZhciBybWF4ID0gZW5jb2RlWzIgKiBpICsgMV07CisgICAgICAgIHRtcEJ1ZlswXSA9IGRtaW4gPT09IGRtYXggPyBybWluIDogcm1pbiArICh2IC0gZG1pbikgKiAocm1heCAtIHJtaW4pIC8gKGRtYXggLSBkbWluKTsKKyAgICAgICAgZm5zW2ldKHRtcEJ1ZiwgMCwgZGVzdCwgZGVzdE9mZnNldCk7CisgICAgICB9OworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RQb3N0U2NyaXB0KHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBmbiwKKyAgICAgIGRpY3QKKyAgICB9KSB7CisgICAgICB2YXIgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CisgICAgICB2YXIgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOworCisgICAgICBpZiAoIWRvbWFpbikgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vIGRvbWFpbi4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFyYW5nZSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vIHJhbmdlLiIpOworICAgICAgfQorCisgICAgICB2YXIgbGV4ZXIgPSBuZXcgX3BzX3BhcnNlci5Qb3N0U2NyaXB0TGV4ZXIoZm4pOworICAgICAgdmFyIHBhcnNlciA9IG5ldyBfcHNfcGFyc2VyLlBvc3RTY3JpcHRQYXJzZXIobGV4ZXIpOworICAgICAgdmFyIGNvZGUgPSBwYXJzZXIucGFyc2UoKTsKKyAgICAgIHJldHVybiBbQ09OU1RSVUNUX1BPU1RTQ1JJUFQsIGRvbWFpbiwgcmFuZ2UsIGNvZGVdOworICAgIH0sCisKKyAgICBjb25zdHJ1Y3RQb3N0U2NyaXB0RnJvbUlSKHsKKyAgICAgIHhyZWYsCisgICAgICBpc0V2YWxTdXBwb3J0ZWQsCisgICAgICBJUgorICAgIH0pIHsKKyAgICAgIHZhciBkb21haW4gPSBJUlsxXTsKKyAgICAgIHZhciByYW5nZSA9IElSWzJdOworICAgICAgdmFyIGNvZGUgPSBJUlszXTsKKworICAgICAgaWYgKGlzRXZhbFN1cHBvcnRlZCAmJiBfdXRpbC5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQudmFsdWUpIHsKKyAgICAgICAgY29uc3QgY29tcGlsZWQgPSBuZXcgUG9zdFNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKTsKKworICAgICAgICBpZiAoY29tcGlsZWQpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJzcmMiLCAic3JjT2Zmc2V0IiwgImRlc3QiLCAiZGVzdE9mZnNldCIsIGNvbXBpbGVkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7CisgICAgICB2YXIgbnVtT3V0cHV0cyA9IHJhbmdlLmxlbmd0aCA+PiAxOworICAgICAgdmFyIG51bUlucHV0cyA9IGRvbWFpbi5sZW5ndGggPj4gMTsKKyAgICAgIHZhciBldmFsdWF0b3IgPSBuZXcgUG9zdFNjcmlwdEV2YWx1YXRvcihjb2RlKTsKKyAgICAgIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB2YXIgTUFYX0NBQ0hFX1NJWkUgPSAyMDQ4ICogNDsKKyAgICAgIHZhciBjYWNoZV9hdmFpbGFibGUgPSBNQVhfQ0FDSEVfU0laRTsKKyAgICAgIHZhciB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUlucHV0cyk7CisgICAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdEZyb21JUlJlc3VsdChzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgeworICAgICAgICB2YXIgaSwgdmFsdWU7CisgICAgICAgIHZhciBrZXkgPSAiIjsKKyAgICAgICAgdmFyIGlucHV0ID0gdG1wQnVmOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1JbnB1dHM7IGkrKykgeworICAgICAgICAgIHZhbHVlID0gc3JjW3NyY09mZnNldCArIGldOworICAgICAgICAgIGlucHV0W2ldID0gdmFsdWU7CisgICAgICAgICAga2V5ICs9IHZhbHVlICsgIl8iOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gY2FjaGVba2V5XTsKKworICAgICAgICBpZiAoY2FjaGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGRlc3Quc2V0KGNhY2hlZFZhbHVlLCBkZXN0T2Zmc2V0KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShudW1PdXRwdXRzKTsKKyAgICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdG9yLmV4ZWN1dGUoaW5wdXQpOworICAgICAgICB2YXIgc3RhY2tJbmRleCA9IHN0YWNrLmxlbmd0aCAtIG51bU91dHB1dHM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU91dHB1dHM7IGkrKykgeworICAgICAgICAgIHZhbHVlID0gc3RhY2tbc3RhY2tJbmRleCArIGldOworICAgICAgICAgIHZhciBib3VuZCA9IHJhbmdlW2kgKiAyXTsKKworICAgICAgICAgIGlmICh2YWx1ZSA8IGJvdW5kKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGJvdW5kOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib3VuZCA9IHJhbmdlW2kgKiAyICsgMV07CisKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IGJvdW5kKSB7CisgICAgICAgICAgICAgIHZhbHVlID0gYm91bmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgb3V0cHV0W2ldID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FjaGVfYXZhaWxhYmxlID4gMCkgeworICAgICAgICAgIGNhY2hlX2F2YWlsYWJsZS0tOworICAgICAgICAgIGNhY2hlW2tleV0gPSBvdXRwdXQ7CisgICAgICAgIH0KKworICAgICAgICBkZXN0LnNldChvdXRwdXQsIGRlc3RPZmZzZXQpOworICAgICAgfTsKKyAgICB9CisKKyAgfTsKK30oKTsKKworZnVuY3Rpb24gaXNQREZGdW5jdGlvbih2KSB7CisgIHZhciBmbkRpY3Q7CisKKyAgaWYgKHR5cGVvZiB2ICE9PSAib2JqZWN0IikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh2KSkgeworICAgIGZuRGljdCA9IHY7CisgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh2KSkgeworICAgIGZuRGljdCA9IHYuZGljdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gZm5EaWN0LmhhcygiRnVuY3Rpb25UeXBlIik7Cit9CisKK3ZhciBQb3N0U2NyaXB0U3RhY2sgPSBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tDbG9zdXJlKCkgeworICB2YXIgTUFYX1NUQUNLX1NJWkUgPSAxMDA7CisKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrKGluaXRpYWxTdGFjaykgeworICAgIHRoaXMuc3RhY2sgPSAhaW5pdGlhbFN0YWNrID8gW10gOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpbml0aWFsU3RhY2ssIDApOworICB9CisKKyAgUG9zdFNjcmlwdFN0YWNrLnByb3RvdHlwZSA9IHsKKyAgICBwdXNoOiBmdW5jdGlvbiBQb3N0U2NyaXB0U3RhY2tfcHVzaCh2YWx1ZSkgeworICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID49IE1BWF9TVEFDS19TSVpFKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy4iKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKKyAgICB9LAorICAgIHBvcDogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX3BvcCgpIHsKKyAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayB1bmRlcmZsb3cuIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpOworICAgIH0sCisgICAgY29weTogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX2NvcHkobikgeworICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoICsgbiA+PSBNQVhfU1RBQ0tfU0laRSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7CisgICAgICB9CisKKyAgICAgIHZhciBzdGFjayA9IHRoaXMuc3RhY2s7CisKKyAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSBuLCBqID0gbiAtIDE7IGogPj0gMDsgai0tLCBpKyspIHsKKyAgICAgICAgc3RhY2sucHVzaChzdGFja1tpXSk7CisgICAgICB9CisgICAgfSwKKyAgICBpbmRleDogZnVuY3Rpb24gUG9zdFNjcmlwdFN0YWNrX2luZGV4KG4pIHsKKyAgICAgIHRoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbiAtIDFdKTsKKyAgICB9LAorICAgIHJvbGw6IGZ1bmN0aW9uIFBvc3RTY3JpcHRTdGFja19yb2xsKG4sIHApIHsKKyAgICAgIHZhciBzdGFjayA9IHRoaXMuc3RhY2s7CisgICAgICB2YXIgbCA9IHN0YWNrLmxlbmd0aCAtIG47CisgICAgICB2YXIgciA9IHN0YWNrLmxlbmd0aCAtIDEsCisgICAgICAgICAgYyA9IGwgKyAocCAtIE1hdGguZmxvb3IocCAvIG4pICogbiksCisgICAgICAgICAgaSwKKyAgICAgICAgICBqLAorICAgICAgICAgIHQ7CisKKyAgICAgIGZvciAoaSA9IGwsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHsKKyAgICAgICAgdCA9IHN0YWNrW2ldOworICAgICAgICBzdGFja1tpXSA9IHN0YWNrW2pdOworICAgICAgICBzdGFja1tqXSA9IHQ7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IGwsIGogPSBjIC0gMTsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgICAgIHQgPSBzdGFja1tpXTsKKyAgICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKKyAgICAgICAgc3RhY2tbal0gPSB0OworICAgICAgfQorCisgICAgICBmb3IgKGkgPSBjLCBqID0gcjsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgICAgIHQgPSBzdGFja1tpXTsKKyAgICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKKyAgICAgICAgc3RhY2tbal0gPSB0OworICAgICAgfQorICAgIH0KKyAgfTsKKyAgcmV0dXJuIFBvc3RTY3JpcHRTdGFjazsKK30oKTsKKwordmFyIFBvc3RTY3JpcHRFdmFsdWF0b3IgPSBmdW5jdGlvbiBQb3N0U2NyaXB0RXZhbHVhdG9yQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdEV2YWx1YXRvcihvcGVyYXRvcnMpIHsKKyAgICB0aGlzLm9wZXJhdG9ycyA9IG9wZXJhdG9yczsKKyAgfQorCisgIFBvc3RTY3JpcHRFdmFsdWF0b3IucHJvdG90eXBlID0geworICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIFBvc3RTY3JpcHRFdmFsdWF0b3JfZXhlY3V0ZShpbml0aWFsU3RhY2spIHsKKyAgICAgIHZhciBzdGFjayA9IG5ldyBQb3N0U2NyaXB0U3RhY2soaW5pdGlhbFN0YWNrKTsKKyAgICAgIHZhciBjb3VudGVyID0gMDsKKyAgICAgIHZhciBvcGVyYXRvcnMgPSB0aGlzLm9wZXJhdG9yczsKKyAgICAgIHZhciBsZW5ndGggPSBvcGVyYXRvcnMubGVuZ3RoOworICAgICAgdmFyIG9wZXJhdG9yLCBhLCBiOworCisgICAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgeworICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9yc1tjb3VudGVyKytdOworCisgICAgICAgIGlmICh0eXBlb2Ygb3BlcmF0b3IgPT09ICJudW1iZXIiKSB7CisgICAgICAgICAgc3RhY2sucHVzaChvcGVyYXRvcik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7CisgICAgICAgICAgY2FzZSAianoiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAoIWEpIHsKKyAgICAgICAgICAgICAgY291bnRlciA9IGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiaiI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBjb3VudGVyID0gYTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiYWJzIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hYnMoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJhZGQiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhICsgYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImFuZCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShhKSAmJiAoMCwgX3V0aWwuaXNCb29sKShiKSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgJiYgYik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgJiBiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJhdGFuIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hdGFuKGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiYml0c2hpZnQiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAoYSA+IDApIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhIDw8IGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhID4+IGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImNlaWxpbmciOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmNlaWwoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJjb3B5IjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLmNvcHkoYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImNvcyI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY29zKGEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiY3ZpIjoKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKSB8IDA7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJjdnIiOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJkaXYiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIC8gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImR1cCI6CisgICAgICAgICAgICBzdGFjay5jb3B5KDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJlcSI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgPT09IGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJleGNoIjoKKyAgICAgICAgICAgIHN0YWNrLnJvbGwoMiwgMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImV4cCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgKiogYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImZhbHNlIjoKKyAgICAgICAgICAgIHN0YWNrLnB1c2goZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJmbG9vciI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguZmxvb3IoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJnZSI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgPj0gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImd0IjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSA+IGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJpZGl2IjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSAvIGIgfCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiaW5kZXgiOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2suaW5kZXgoYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImxlIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSA8PSBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibG4iOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmxvZyhhKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImxvZyI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nKGEpIC8gTWF0aC5MTjEwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibHQiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIDwgYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm1vZCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgJSBiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAibXVsIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSAqIGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJuZSI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJuZWciOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaCgtYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm5vdCI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShhKSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKCFhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2gofmEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm9yIjoKKyAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc0Jvb2wpKGEpICYmICgwLCBfdXRpbC5pc0Jvb2wpKGIpKSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8IGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInBvcCI6CisgICAgICAgICAgICBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAicm9sbCI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5yb2xsKGEsIGIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJyb3VuZCI6CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGgucm91bmQoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJzaW4iOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLnNpbihhKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInNxcnQiOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLnNxcnQoYSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJzdWIiOgorICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChhIC0gYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInRydWUiOgorICAgICAgICAgICAgc3RhY2sucHVzaCh0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAidHJ1bmNhdGUiOgorICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgYSA9IGEgPCAwID8gTWF0aC5jZWlsKGEpIDogTWF0aC5mbG9vcihhKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInhvciI6CisgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShhKSAmJiAoMCwgX3V0aWwuaXNCb29sKShiKSkgeworICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhIF4gYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBvcGVyYXRvciAke29wZXJhdG9yfWApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBzdGFjay5zdGFjazsKKyAgICB9CisgIH07CisgIHJldHVybiBQb3N0U2NyaXB0RXZhbHVhdG9yOworfSgpOworCitleHBvcnRzLlBvc3RTY3JpcHRFdmFsdWF0b3IgPSBQb3N0U2NyaXB0RXZhbHVhdG9yOworCit2YXIgUG9zdFNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQXN0Tm9kZSh0eXBlKSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCisgIEFzdE5vZGUucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJhYnN0cmFjdCBtZXRob2QiKTsKKyAgfTsKKworICBmdW5jdGlvbiBBc3RBcmd1bWVudChpbmRleCwgbWluLCBtYXgpIHsKKyAgICBBc3ROb2RlLmNhbGwodGhpcywgImFyZ3MiKTsKKyAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgdGhpcy5taW4gPSBtaW47CisgICAgdGhpcy5tYXggPSBtYXg7CisgIH0KKworICBBc3RBcmd1bWVudC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RBcmd1bWVudC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXRBcmd1bWVudCh0aGlzKTsKKyAgfTsKKworICBmdW5jdGlvbiBBc3RMaXRlcmFsKG51bWJlcikgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAibGl0ZXJhbCIpOworICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgIHRoaXMubWluID0gbnVtYmVyOworICAgIHRoaXMubWF4ID0gbnVtYmVyOworICB9CisKKyAgQXN0TGl0ZXJhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RMaXRlcmFsLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdExpdGVyYWwodGhpcyk7CisgIH07CisKKyAgZnVuY3Rpb24gQXN0QmluYXJ5T3BlcmF0aW9uKG9wLCBhcmcxLCBhcmcyLCBtaW4sIG1heCkgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAiYmluYXJ5Iik7CisgICAgdGhpcy5vcCA9IG9wOworICAgIHRoaXMuYXJnMSA9IGFyZzE7CisgICAgdGhpcy5hcmcyID0gYXJnMjsKKyAgICB0aGlzLm1pbiA9IG1pbjsKKyAgICB0aGlzLm1heCA9IG1heDsKKyAgfQorCisgIEFzdEJpbmFyeU9wZXJhdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RCaW5hcnlPcGVyYXRpb24ucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICB2aXNpdG9yLnZpc2l0QmluYXJ5T3BlcmF0aW9uKHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIEFzdE1pbihhcmcsIG1heCkgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAibWF4Iik7CisgICAgdGhpcy5hcmcgPSBhcmc7CisgICAgdGhpcy5taW4gPSBhcmcubWluOworICAgIHRoaXMubWF4ID0gbWF4OworICB9CisKKyAgQXN0TWluLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXN0Tm9kZS5wcm90b3R5cGUpOworCisgIEFzdE1pbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXRNaW4odGhpcyk7CisgIH07CisKKyAgZnVuY3Rpb24gQXN0VmFyaWFibGUoaW5kZXgsIG1pbiwgbWF4KSB7CisgICAgQXN0Tm9kZS5jYWxsKHRoaXMsICJ2YXIiKTsKKyAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgdGhpcy5taW4gPSBtaW47CisgICAgdGhpcy5tYXggPSBtYXg7CisgIH0KKworICBBc3RWYXJpYWJsZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RWYXJpYWJsZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZSh0aGlzKTsKKyAgfTsKKworICBmdW5jdGlvbiBBc3RWYXJpYWJsZURlZmluaXRpb24odmFyaWFibGUsIGFyZykgeworICAgIEFzdE5vZGUuY2FsbCh0aGlzLCAiZGVmaW5pdGlvbiIpOworICAgIHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsKKyAgICB0aGlzLmFyZyA9IGFyZzsKKyAgfQorCisgIEFzdFZhcmlhYmxlRGVmaW5pdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFzdE5vZGUucHJvdG90eXBlKTsKKworICBBc3RWYXJpYWJsZURlZmluaXRpb24ucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGVEZWZpbml0aW9uKHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpIHsKKyAgICB0aGlzLnBhcnRzID0gW107CisgIH0KKworICBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IucHJvdG90eXBlID0geworICAgIHZpc2l0QXJndW1lbnQoYXJnKSB7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIk1hdGgubWF4KCIsIGFyZy5taW4sICIsIE1hdGgubWluKCIsIGFyZy5tYXgsICIsIHNyY1tzcmNPZmZzZXQgKyAiLCBhcmcuaW5kZXgsICJdKSkiKTsKKyAgICB9LAorCisgICAgdmlzaXRWYXJpYWJsZSh2YXJpYWJsZSkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCJ2IiwgdmFyaWFibGUuaW5kZXgpOworICAgIH0sCisKKyAgICB2aXNpdExpdGVyYWwobGl0ZXJhbCkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKGxpdGVyYWwubnVtYmVyKTsKKyAgICB9LAorCisgICAgdmlzaXRCaW5hcnlPcGVyYXRpb24ob3BlcmF0aW9uKSB7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIigiKTsKKyAgICAgIG9wZXJhdGlvbi5hcmcxLnZpc2l0KHRoaXMpOworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCIgIiwgb3BlcmF0aW9uLm9wLCAiICIpOworICAgICAgb3BlcmF0aW9uLmFyZzIudmlzaXQodGhpcyk7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIikiKTsKKyAgICB9LAorCisgICAgdmlzaXRWYXJpYWJsZURlZmluaXRpb24oZGVmaW5pdGlvbikgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCJ2YXIgIik7CisgICAgICBkZWZpbml0aW9uLnZhcmlhYmxlLnZpc2l0KHRoaXMpOworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCIgPSAiKTsKKyAgICAgIGRlZmluaXRpb24uYXJnLnZpc2l0KHRoaXMpOworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCI7Iik7CisgICAgfSwKKworICAgIHZpc2l0TWluKG1heCkgeworICAgICAgdGhpcy5wYXJ0cy5wdXNoKCJNYXRoLm1pbigiKTsKKyAgICAgIG1heC5hcmcudmlzaXQodGhpcyk7CisgICAgICB0aGlzLnBhcnRzLnB1c2goIiwgIiwgbWF4Lm1heCwgIikiKTsKKyAgICB9LAorCisgICAgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gdGhpcy5wYXJ0cy5qb2luKCIiKTsKKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSB7CisgICAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIubnVtYmVyID09PSAwKSB7CisgICAgICByZXR1cm4gbnVtMTsKKyAgICB9CisKKyAgICBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMS5udW1iZXIgPT09IDApIHsKKyAgICAgIHJldHVybiBudW0yOworICAgIH0KKworICAgIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgeworICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICsgbnVtMi5udW1iZXIpOworICAgIH0KKworICAgIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIrIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gKyBudW0yLm1pbiwgbnVtMS5tYXggKyBudW0yLm1heCk7CisgIH0KKworICBmdW5jdGlvbiBidWlsZE11bE9wZXJhdGlvbihudW0xLCBudW0yKSB7CisgICAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiKSB7CisgICAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApOworICAgICAgfSBlbHNlIGlmIChudW0yLm51bWJlciA9PT0gMSkgeworICAgICAgICByZXR1cm4gbnVtMTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICogbnVtMi5udW1iZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgeworICAgICAgaWYgKG51bTEubnVtYmVyID09PSAwKSB7CisgICAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbCgwKTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS5udW1iZXIgPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIG51bTI7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1pbiA9IE1hdGgubWluKG51bTEubWluICogbnVtMi5taW4sIG51bTEubWluICogbnVtMi5tYXgsIG51bTEubWF4ICogbnVtMi5taW4sIG51bTEubWF4ICogbnVtMi5tYXgpOworICAgIHZhciBtYXggPSBNYXRoLm1heChudW0xLm1pbiAqIG51bTIubWluLCBudW0xLm1pbiAqIG51bTIubWF4LCBudW0xLm1heCAqIG51bTIubWluLCBudW0xLm1heCAqIG51bTIubWF4KTsKKyAgICByZXR1cm4gbmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiKiIsIG51bTEsIG51bTIsIG1pbiwgbWF4KTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkU3ViT3BlcmF0aW9uKG51bTEsIG51bTIpIHsKKyAgICBpZiAobnVtMi50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgIGlmIChudW0yLm51bWJlciA9PT0gMCkgeworICAgICAgICByZXR1cm4gbnVtMTsKKyAgICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyIC0gbnVtMi5udW1iZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChudW0yLnR5cGUgPT09ICJiaW5hcnkiICYmIG51bTIub3AgPT09ICItIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLm51bWJlciA9PT0gMSAmJiBudW0yLmFyZzEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIuYXJnMS5udW1iZXIgPT09IDEpIHsKKyAgICAgIHJldHVybiBudW0yLmFyZzI7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIi0iLCBudW0xLCBudW0yLCBudW0xLm1pbiAtIG51bTIubWF4LCBudW0xLm1heCAtIG51bTIubWluKTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIG1heCkgeworICAgIGlmIChudW0xLm1pbiA+PSBtYXgpIHsKKyAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChtYXgpOworICAgIH0gZWxzZSBpZiAobnVtMS5tYXggPD0gbWF4KSB7CisgICAgICByZXR1cm4gbnVtMTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEFzdE1pbihudW0xLCBtYXgpOworICB9CisKKyAgZnVuY3Rpb24gUG9zdFNjcmlwdENvbXBpbGVyKCkge30KKworICBQb3N0U2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0geworICAgIGNvbXBpbGU6IGZ1bmN0aW9uIFBvc3RTY3JpcHRDb21waWxlcl9jb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpIHsKKyAgICAgIHZhciBzdGFjayA9IFtdOworICAgICAgdmFyIGluc3RydWN0aW9ucyA9IFtdOworICAgICAgdmFyIGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggPj4gMSwKKyAgICAgICAgICBvdXRwdXRTaXplID0gcmFuZ2UubGVuZ3RoID4+IDE7CisgICAgICB2YXIgbGFzdFJlZ2lzdGVyID0gMDsKKyAgICAgIHZhciBuLCBqOworICAgICAgdmFyIG51bTEsIG51bTIsIGFzdDEsIGFzdDIsIHRtcFZhciwgaXRlbTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNpemU7IGkrKykgeworICAgICAgICBzdGFjay5wdXNoKG5ldyBBc3RBcmd1bWVudChpLCBkb21haW5baSAqIDJdLCBkb21haW5baSAqIDIgKyAxXSkpOworICAgICAgfQorCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb2RlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IGNvZGVbaV07CisKKyAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAibnVtYmVyIikgeworICAgICAgICAgIHN0YWNrLnB1c2gobmV3IEFzdExpdGVyYWwoaXRlbSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChpdGVtKSB7CisgICAgICAgICAgY2FzZSAiYWRkIjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkQWRkT3BlcmF0aW9uKG51bTEsIG51bTIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiY3ZyIjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIm11bCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChidWlsZE11bE9wZXJhdGlvbihudW0xLCBudW0yKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInN1YiI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgc3RhY2sucHVzaChidWlsZFN1Yk9wZXJhdGlvbihudW0xLCBudW0yKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImV4Y2giOgorICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzdDEgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGFzdDIgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYXN0MSwgYXN0Mik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgInBvcCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhY2sucG9wKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImluZGV4IjoKKyAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgIGlmIChudW0xLnR5cGUgIT09ICJsaXRlcmFsIikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbiA9IG51bTEubnVtYmVyOworCisgICAgICAgICAgICBpZiAobiA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIobikgfHwgc3RhY2subGVuZ3RoIDwgbikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXN0MSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXTsKKworICAgICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTsKKyAgICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXSA9IHRtcFZhcjsKKyAgICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImR1cCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2RlW2kgKyAxXSA9PT0gIm51bWJlciIgJiYgY29kZVtpICsgMl0gPT09ICJndCIgJiYgY29kZVtpICsgM10gPT09IGkgKyA3ICYmIGNvZGVbaSArIDRdID09PSAianoiICYmIGNvZGVbaSArIDVdID09PSAicG9wIiAmJiBjb2RlW2kgKyA2XSA9PT0gY29kZVtpICsgMV0pIHsKKyAgICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIGNvZGVbaSArIDFdKSk7CisgICAgICAgICAgICAgIGkgKz0gNjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzdDEgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKKworICAgICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTsKKyAgICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID0gdG1wVmFyOworICAgICAgICAgICAgc3RhY2sucHVzaCh0bXBWYXIpOworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2gobmV3IEFzdFZhcmlhYmxlRGVmaW5pdGlvbih0bXBWYXIsIGFzdDEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAicm9sbCI6CisgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOworICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOworCisgICAgICAgICAgICBpZiAobnVtMi50eXBlICE9PSAibGl0ZXJhbCIgfHwgbnVtMS50eXBlICE9PSAibGl0ZXJhbCIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGogPSBudW0yLm51bWJlcjsKKyAgICAgICAgICAgIG4gPSBudW0xLm51bWJlcjsKKworICAgICAgICAgICAgaWYgKG4gPD0gMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihqKSB8fCBzdGFjay5sZW5ndGggPCBuKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBqID0gKGogJSBuICsgbikgJSBuOworCisgICAgICAgICAgICBpZiAoaiA9PT0gMCkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoc3RhY2ssIHN0YWNrLnNwbGljZShzdGFjay5sZW5ndGggLSBuLCBuIC0gaikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN0YWNrLmxlbmd0aCAhPT0gb3V0cHV0U2l6ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIHJlc3VsdCA9IFtdOworICAgICAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGluc3RydWN0aW9uKSB7CisgICAgICAgIHZhciBzdGF0ZW1lbnRCdWlsZGVyID0gbmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpOworICAgICAgICBpbnN0cnVjdGlvbi52aXNpdChzdGF0ZW1lbnRCdWlsZGVyKTsKKyAgICAgICAgcmVzdWx0LnB1c2goc3RhdGVtZW50QnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgIH0pOworICAgICAgc3RhY2suZm9yRWFjaChmdW5jdGlvbiAoZXhwciwgaSkgeworICAgICAgICB2YXIgc3RhdGVtZW50QnVpbGRlciA9IG5ldyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKTsKKyAgICAgICAgZXhwci52aXNpdChzdGF0ZW1lbnRCdWlsZGVyKTsKKyAgICAgICAgdmFyIG1pbiA9IHJhbmdlW2kgKiAyXSwKKyAgICAgICAgICAgIG1heCA9IHJhbmdlW2kgKiAyICsgMV07CisgICAgICAgIHZhciBvdXQgPSBbc3RhdGVtZW50QnVpbGRlci50b1N0cmluZygpXTsKKworICAgICAgICBpZiAobWluID4gZXhwci5taW4pIHsKKyAgICAgICAgICBvdXQudW5zaGlmdCgiTWF0aC5tYXgoIiwgbWluLCAiLCAiKTsKKyAgICAgICAgICBvdXQucHVzaCgiKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1heCA8IGV4cHIubWF4KSB7CisgICAgICAgICAgb3V0LnVuc2hpZnQoIk1hdGgubWluKCIsIG1heCwgIiwgIik7CisgICAgICAgICAgb3V0LnB1c2goIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC51bnNoaWZ0KCJkZXN0W2Rlc3RPZmZzZXQgKyAiLCBpLCAiXSA9ICIpOworICAgICAgICBvdXQucHVzaCgiOyIpOworICAgICAgICByZXN1bHQucHVzaChvdXQuam9pbigiIikpOworICAgICAgfSk7CisgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oIlxuIik7CisgICAgfQorICB9OworICByZXR1cm4gUG9zdFNjcmlwdENvbXBpbGVyOworfSgpOworCitleHBvcnRzLlBvc3RTY3JpcHRDb21waWxlciA9IFBvc3RTY3JpcHRDb21waWxlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9nbHlwaGxpc3QuanMgYi9saWIvY29yZS9nbHlwaGxpc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0OTg3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL2dseXBobGlzdC5qcwpAQCAtMCwwICsxLDQ1NTYgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIGdldExvb2t1cFRhYmxlRmFjdG9yeSA9IHJlcXVpcmUoIi4vY29yZV91dGlscy5qcyIpLmdldExvb2t1cFRhYmxlRmFjdG9yeTsKKwordmFyIGdldEdseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKKyAgdC5BID0gMHgwMDQxOworICB0LkFFID0gMHgwMGM2OworICB0LkFFYWN1dGUgPSAweDAxZmM7CisgIHQuQUVtYWNyb24gPSAweDAxZTI7CisgIHQuQUVzbWFsbCA9IDB4ZjdlNjsKKyAgdC5BYWN1dGUgPSAweDAwYzE7CisgIHQuQWFjdXRlc21hbGwgPSAweGY3ZTE7CisgIHQuQWJyZXZlID0gMHgwMTAyOworICB0LkFicmV2ZWFjdXRlID0gMHgxZWFlOworICB0LkFicmV2ZWN5cmlsbGljID0gMHgwNGQwOworICB0LkFicmV2ZWRvdGJlbG93ID0gMHgxZWI2OworICB0LkFicmV2ZWdyYXZlID0gMHgxZWIwOworICB0LkFicmV2ZWhvb2thYm92ZSA9IDB4MWViMjsKKyAgdC5BYnJldmV0aWxkZSA9IDB4MWViNDsKKyAgdC5BY2Fyb24gPSAweDAxY2Q7CisgIHQuQWNpcmNsZSA9IDB4MjRiNjsKKyAgdC5BY2lyY3VtZmxleCA9IDB4MDBjMjsKKyAgdC5BY2lyY3VtZmxleGFjdXRlID0gMHgxZWE0OworICB0LkFjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYWM7CisgIHQuQWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNjsKKyAgdC5BY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVhODsKKyAgdC5BY2lyY3VtZmxleHNtYWxsID0gMHhmN2UyOworICB0LkFjaXJjdW1mbGV4dGlsZGUgPSAweDFlYWE7CisgIHQuQWN1dGUgPSAweGY2Yzk7CisgIHQuQWN1dGVzbWFsbCA9IDB4ZjdiNDsKKyAgdC5BY3lyaWxsaWMgPSAweDA0MTA7CisgIHQuQWRibGdyYXZlID0gMHgwMjAwOworICB0LkFkaWVyZXNpcyA9IDB4MDBjNDsKKyAgdC5BZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMjsKKyAgdC5BZGllcmVzaXNtYWNyb24gPSAweDAxZGU7CisgIHQuQWRpZXJlc2lzc21hbGwgPSAweGY3ZTQ7CisgIHQuQWRvdGJlbG93ID0gMHgxZWEwOworICB0LkFkb3RtYWNyb24gPSAweDAxZTA7CisgIHQuQWdyYXZlID0gMHgwMGMwOworICB0LkFncmF2ZXNtYWxsID0gMHhmN2UwOworICB0LkFob29rYWJvdmUgPSAweDFlYTI7CisgIHQuQWllY3lyaWxsaWMgPSAweDA0ZDQ7CisgIHQuQWludmVydGVkYnJldmUgPSAweDAyMDI7CisgIHQuQWxwaGEgPSAweDAzOTE7CisgIHQuQWxwaGF0b25vcyA9IDB4MDM4NjsKKyAgdC5BbWFjcm9uID0gMHgwMTAwOworICB0LkFtb25vc3BhY2UgPSAweGZmMjE7CisgIHQuQW9nb25layA9IDB4MDEwNDsKKyAgdC5BcmluZyA9IDB4MDBjNTsKKyAgdC5BcmluZ2FjdXRlID0gMHgwMWZhOworICB0LkFyaW5nYmVsb3cgPSAweDFlMDA7CisgIHQuQXJpbmdzbWFsbCA9IDB4ZjdlNTsKKyAgdC5Bc21hbGwgPSAweGY3NjE7CisgIHQuQXRpbGRlID0gMHgwMGMzOworICB0LkF0aWxkZXNtYWxsID0gMHhmN2UzOworICB0LkF5YmFybWVuaWFuID0gMHgwNTMxOworICB0LkIgPSAweDAwNDI7CisgIHQuQmNpcmNsZSA9IDB4MjRiNzsKKyAgdC5CZG90YWNjZW50ID0gMHgxZTAyOworICB0LkJkb3RiZWxvdyA9IDB4MWUwNDsKKyAgdC5CZWN5cmlsbGljID0gMHgwNDExOworICB0LkJlbmFybWVuaWFuID0gMHgwNTMyOworICB0LkJldGEgPSAweDAzOTI7CisgIHQuQmhvb2sgPSAweDAxODE7CisgIHQuQmxpbmViZWxvdyA9IDB4MWUwNjsKKyAgdC5CbW9ub3NwYWNlID0gMHhmZjIyOworICB0LkJyZXZlc21hbGwgPSAweGY2ZjQ7CisgIHQuQnNtYWxsID0gMHhmNzYyOworICB0LkJ0b3BiYXIgPSAweDAxODI7CisgIHQuQyA9IDB4MDA0MzsKKyAgdC5DYWFybWVuaWFuID0gMHgwNTNlOworICB0LkNhY3V0ZSA9IDB4MDEwNjsKKyAgdC5DYXJvbiA9IDB4ZjZjYTsKKyAgdC5DYXJvbnNtYWxsID0gMHhmNmY1OworICB0LkNjYXJvbiA9IDB4MDEwYzsKKyAgdC5DY2VkaWxsYSA9IDB4MDBjNzsKKyAgdC5DY2VkaWxsYWFjdXRlID0gMHgxZTA4OworICB0LkNjZWRpbGxhc21hbGwgPSAweGY3ZTc7CisgIHQuQ2NpcmNsZSA9IDB4MjRiODsKKyAgdC5DY2lyY3VtZmxleCA9IDB4MDEwODsKKyAgdC5DZG90ID0gMHgwMTBhOworICB0LkNkb3RhY2NlbnQgPSAweDAxMGE7CisgIHQuQ2VkaWxsYXNtYWxsID0gMHhmN2I4OworICB0LkNoYWFybWVuaWFuID0gMHgwNTQ5OworICB0LkNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJjOworICB0LkNoZWN5cmlsbGljID0gMHgwNDI3OworICB0LkNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJlOworICB0LkNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI2OworICB0LkNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjQ7CisgIHQuQ2hlaGFybWVuaWFuID0gMHgwNTQzOworICB0LkNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYjsKKyAgdC5DaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI4OworICB0LkNoaSA9IDB4MDNhNzsKKyAgdC5DaG9vayA9IDB4MDE4NzsKKyAgdC5DaXJjdW1mbGV4c21hbGwgPSAweGY2ZjY7CisgIHQuQ21vbm9zcGFjZSA9IDB4ZmYyMzsKKyAgdC5Db2FybWVuaWFuID0gMHgwNTUxOworICB0LkNzbWFsbCA9IDB4Zjc2MzsKKyAgdC5EID0gMHgwMDQ0OworICB0LkRaID0gMHgwMWYxOworICB0LkRaY2Fyb24gPSAweDAxYzQ7CisgIHQuRGFhcm1lbmlhbiA9IDB4MDUzNDsKKyAgdC5EYWZyaWNhbiA9IDB4MDE4OTsKKyAgdC5EY2Fyb24gPSAweDAxMGU7CisgIHQuRGNlZGlsbGEgPSAweDFlMTA7CisgIHQuRGNpcmNsZSA9IDB4MjRiOTsKKyAgdC5EY2lyY3VtZmxleGJlbG93ID0gMHgxZTEyOworICB0LkRjcm9hdCA9IDB4MDExMDsKKyAgdC5EZG90YWNjZW50ID0gMHgxZTBhOworICB0LkRkb3RiZWxvdyA9IDB4MWUwYzsKKyAgdC5EZWN5cmlsbGljID0gMHgwNDE0OworICB0LkRlaWNvcHRpYyA9IDB4MDNlZTsKKyAgdC5EZWx0YSA9IDB4MjIwNjsKKyAgdC5EZWx0YWdyZWVrID0gMHgwMzk0OworICB0LkRob29rID0gMHgwMThhOworICB0LkRpZXJlc2lzID0gMHhmNmNiOworICB0LkRpZXJlc2lzQWN1dGUgPSAweGY2Y2M7CisgIHQuRGllcmVzaXNHcmF2ZSA9IDB4ZjZjZDsKKyAgdC5EaWVyZXNpc3NtYWxsID0gMHhmN2E4OworICB0LkRpZ2FtbWFncmVlayA9IDB4MDNkYzsKKyAgdC5EamVjeXJpbGxpYyA9IDB4MDQwMjsKKyAgdC5EbGluZWJlbG93ID0gMHgxZTBlOworICB0LkRtb25vc3BhY2UgPSAweGZmMjQ7CisgIHQuRG90YWNjZW50c21hbGwgPSAweGY2Zjc7CisgIHQuRHNsYXNoID0gMHgwMTEwOworICB0LkRzbWFsbCA9IDB4Zjc2NDsKKyAgdC5EdG9wYmFyID0gMHgwMThiOworICB0LkR6ID0gMHgwMWYyOworICB0LkR6Y2Fyb24gPSAweDAxYzU7CisgIHQuRHplYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0ZTA7CisgIHQuRHplY3lyaWxsaWMgPSAweDA0MDU7CisgIHQuRHpoZWN5cmlsbGljID0gMHgwNDBmOworICB0LkUgPSAweDAwNDU7CisgIHQuRWFjdXRlID0gMHgwMGM5OworICB0LkVhY3V0ZXNtYWxsID0gMHhmN2U5OworICB0LkVicmV2ZSA9IDB4MDExNDsKKyAgdC5FY2Fyb24gPSAweDAxMWE7CisgIHQuRWNlZGlsbGFicmV2ZSA9IDB4MWUxYzsKKyAgdC5FY2hhcm1lbmlhbiA9IDB4MDUzNTsKKyAgdC5FY2lyY2xlID0gMHgyNGJhOworICB0LkVjaXJjdW1mbGV4ID0gMHgwMGNhOworICB0LkVjaXJjdW1mbGV4YWN1dGUgPSAweDFlYmU7CisgIHQuRWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxODsKKyAgdC5FY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWM2OworICB0LkVjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYzA7CisgIHQuRWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzI7CisgIHQuRWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlYTsKKyAgdC5FY2lyY3VtZmxleHRpbGRlID0gMHgxZWM0OworICB0LkVjeXJpbGxpYyA9IDB4MDQwNDsKKyAgdC5FZGJsZ3JhdmUgPSAweDAyMDQ7CisgIHQuRWRpZXJlc2lzID0gMHgwMGNiOworICB0LkVkaWVyZXNpc3NtYWxsID0gMHhmN2ViOworICB0LkVkb3QgPSAweDAxMTY7CisgIHQuRWRvdGFjY2VudCA9IDB4MDExNjsKKyAgdC5FZG90YmVsb3cgPSAweDFlYjg7CisgIHQuRWZjeXJpbGxpYyA9IDB4MDQyNDsKKyAgdC5FZ3JhdmUgPSAweDAwYzg7CisgIHQuRWdyYXZlc21hbGwgPSAweGY3ZTg7CisgIHQuRWhhcm1lbmlhbiA9IDB4MDUzNzsKKyAgdC5FaG9va2Fib3ZlID0gMHgxZWJhOworICB0LkVpZ2h0cm9tYW4gPSAweDIxNjc7CisgIHQuRWludmVydGVkYnJldmUgPSAweDAyMDY7CisgIHQuRWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjQ7CisgIHQuRWxjeXJpbGxpYyA9IDB4MDQxYjsKKyAgdC5FbGV2ZW5yb21hbiA9IDB4MjE2YTsKKyAgdC5FbWFjcm9uID0gMHgwMTEyOworICB0LkVtYWNyb25hY3V0ZSA9IDB4MWUxNjsKKyAgdC5FbWFjcm9uZ3JhdmUgPSAweDFlMTQ7CisgIHQuRW1jeXJpbGxpYyA9IDB4MDQxYzsKKyAgdC5FbW9ub3NwYWNlID0gMHhmZjI1OworICB0LkVuY3lyaWxsaWMgPSAweDA0MWQ7CisgIHQuRW5kZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhMjsKKyAgdC5FbmcgPSAweDAxNGE7CisgIHQuRW5naGVjeXJpbGxpYyA9IDB4MDRhNDsKKyAgdC5Fbmhvb2tjeXJpbGxpYyA9IDB4MDRjNzsKKyAgdC5Fb2dvbmVrID0gMHgwMTE4OworICB0LkVvcGVuID0gMHgwMTkwOworICB0LkVwc2lsb24gPSAweDAzOTU7CisgIHQuRXBzaWxvbnRvbm9zID0gMHgwMzg4OworICB0LkVyY3lyaWxsaWMgPSAweDA0MjA7CisgIHQuRXJldmVyc2VkID0gMHgwMThlOworICB0LkVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDJkOworICB0LkVzY3lyaWxsaWMgPSAweDA0MjE7CisgIHQuRXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYTsKKyAgdC5Fc2ggPSAweDAxYTk7CisgIHQuRXNtYWxsID0gMHhmNzY1OworICB0LkV0YSA9IDB4MDM5NzsKKyAgdC5FdGFybWVuaWFuID0gMHgwNTM4OworICB0LkV0YXRvbm9zID0gMHgwMzg5OworICB0LkV0aCA9IDB4MDBkMDsKKyAgdC5FdGhzbWFsbCA9IDB4ZjdmMDsKKyAgdC5FdGlsZGUgPSAweDFlYmM7CisgIHQuRXRpbGRlYmVsb3cgPSAweDFlMWE7CisgIHQuRXVybyA9IDB4MjBhYzsKKyAgdC5FemggPSAweDAxYjc7CisgIHQuRXpoY2Fyb24gPSAweDAxZWU7CisgIHQuRXpocmV2ZXJzZWQgPSAweDAxYjg7CisgIHQuRiA9IDB4MDA0NjsKKyAgdC5GY2lyY2xlID0gMHgyNGJiOworICB0LkZkb3RhY2NlbnQgPSAweDFlMWU7CisgIHQuRmVoYXJtZW5pYW4gPSAweDA1NTY7CisgIHQuRmVpY29wdGljID0gMHgwM2U0OworICB0LkZob29rID0gMHgwMTkxOworICB0LkZpdGFjeXJpbGxpYyA9IDB4MDQ3MjsKKyAgdC5GaXZlcm9tYW4gPSAweDIxNjQ7CisgIHQuRm1vbm9zcGFjZSA9IDB4ZmYyNjsKKyAgdC5Gb3Vycm9tYW4gPSAweDIxNjM7CisgIHQuRnNtYWxsID0gMHhmNzY2OworICB0LkcgPSAweDAwNDc7CisgIHQuR0JzcXVhcmUgPSAweDMzODc7CisgIHQuR2FjdXRlID0gMHgwMWY0OworICB0LkdhbW1hID0gMHgwMzkzOworICB0LkdhbW1hYWZyaWNhbiA9IDB4MDE5NDsKKyAgdC5HYW5naWFjb3B0aWMgPSAweDAzZWE7CisgIHQuR2JyZXZlID0gMHgwMTFlOworICB0LkdjYXJvbiA9IDB4MDFlNjsKKyAgdC5HY2VkaWxsYSA9IDB4MDEyMjsKKyAgdC5HY2lyY2xlID0gMHgyNGJjOworICB0LkdjaXJjdW1mbGV4ID0gMHgwMTFjOworICB0Lkdjb21tYWFjY2VudCA9IDB4MDEyMjsKKyAgdC5HZG90ID0gMHgwMTIwOworICB0Lkdkb3RhY2NlbnQgPSAweDAxMjA7CisgIHQuR2VjeXJpbGxpYyA9IDB4MDQxMzsKKyAgdC5HaGFkYXJtZW5pYW4gPSAweDA1NDI7CisgIHQuR2hlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNDk0OworICB0LkdoZXN0cm9rZWN5cmlsbGljID0gMHgwNDkyOworICB0LkdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkwOworICB0Lkdob29rID0gMHgwMTkzOworICB0LkdpbWFybWVuaWFuID0gMHgwNTMzOworICB0LkdqZWN5cmlsbGljID0gMHgwNDAzOworICB0LkdtYWNyb24gPSAweDFlMjA7CisgIHQuR21vbm9zcGFjZSA9IDB4ZmYyNzsKKyAgdC5HcmF2ZSA9IDB4ZjZjZTsKKyAgdC5HcmF2ZXNtYWxsID0gMHhmNzYwOworICB0LkdzbWFsbCA9IDB4Zjc2NzsKKyAgdC5Hc21hbGxob29rID0gMHgwMjliOworICB0LkdzdHJva2UgPSAweDAxZTQ7CisgIHQuSCA9IDB4MDA0ODsKKyAgdC5IMTg1MzMgPSAweDI1Y2Y7CisgIHQuSDE4NTQzID0gMHgyNWFhOworICB0LkgxODU1MSA9IDB4MjVhYjsKKyAgdC5IMjIwNzMgPSAweDI1YTE7CisgIHQuSFBzcXVhcmUgPSAweDMzY2I7CisgIHQuSGFhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRhODsKKyAgdC5IYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGIyOworICB0LkhhcmRzaWduY3lyaWxsaWMgPSAweDA0MmE7CisgIHQuSGJhciA9IDB4MDEyNjsKKyAgdC5IYnJldmViZWxvdyA9IDB4MWUyYTsKKyAgdC5IY2VkaWxsYSA9IDB4MWUyODsKKyAgdC5IY2lyY2xlID0gMHgyNGJkOworICB0LkhjaXJjdW1mbGV4ID0gMHgwMTI0OworICB0LkhkaWVyZXNpcyA9IDB4MWUyNjsKKyAgdC5IZG90YWNjZW50ID0gMHgxZTIyOworICB0Lkhkb3RiZWxvdyA9IDB4MWUyNDsKKyAgdC5IbW9ub3NwYWNlID0gMHhmZjI4OworICB0LkhvYXJtZW5pYW4gPSAweDA1NDA7CisgIHQuSG9yaWNvcHRpYyA9IDB4MDNlODsKKyAgdC5Ic21hbGwgPSAweGY3Njg7CisgIHQuSHVuZ2FydW1sYXV0ID0gMHhmNmNmOworICB0Lkh1bmdhcnVtbGF1dHNtYWxsID0gMHhmNmY4OworICB0Lkh6c3F1YXJlID0gMHgzMzkwOworICB0LkkgPSAweDAwNDk7CisgIHQuSUFjeXJpbGxpYyA9IDB4MDQyZjsKKyAgdC5JSiA9IDB4MDEzMjsKKyAgdC5JVWN5cmlsbGljID0gMHgwNDJlOworICB0LklhY3V0ZSA9IDB4MDBjZDsKKyAgdC5JYWN1dGVzbWFsbCA9IDB4ZjdlZDsKKyAgdC5JYnJldmUgPSAweDAxMmM7CisgIHQuSWNhcm9uID0gMHgwMWNmOworICB0LkljaXJjbGUgPSAweDI0YmU7CisgIHQuSWNpcmN1bWZsZXggPSAweDAwY2U7CisgIHQuSWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlZTsKKyAgdC5JY3lyaWxsaWMgPSAweDA0MDY7CisgIHQuSWRibGdyYXZlID0gMHgwMjA4OworICB0LklkaWVyZXNpcyA9IDB4MDBjZjsKKyAgdC5JZGllcmVzaXNhY3V0ZSA9IDB4MWUyZTsKKyAgdC5JZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlNDsKKyAgdC5JZGllcmVzaXNzbWFsbCA9IDB4ZjdlZjsKKyAgdC5JZG90ID0gMHgwMTMwOworICB0Lklkb3RhY2NlbnQgPSAweDAxMzA7CisgIHQuSWRvdGJlbG93ID0gMHgxZWNhOworICB0LkllYnJldmVjeXJpbGxpYyA9IDB4MDRkNjsKKyAgdC5JZWN5cmlsbGljID0gMHgwNDE1OworICB0LklmcmFrdHVyID0gMHgyMTExOworICB0LklncmF2ZSA9IDB4MDBjYzsKKyAgdC5JZ3JhdmVzbWFsbCA9IDB4ZjdlYzsKKyAgdC5JaG9va2Fib3ZlID0gMHgxZWM4OworICB0LklpY3lyaWxsaWMgPSAweDA0MTg7CisgIHQuSWludmVydGVkYnJldmUgPSAweDAyMGE7CisgIHQuSWlzaG9ydGN5cmlsbGljID0gMHgwNDE5OworICB0LkltYWNyb24gPSAweDAxMmE7CisgIHQuSW1hY3JvbmN5cmlsbGljID0gMHgwNGUyOworICB0Lkltb25vc3BhY2UgPSAweGZmMjk7CisgIHQuSW5pYXJtZW5pYW4gPSAweDA1M2I7CisgIHQuSW9jeXJpbGxpYyA9IDB4MDQwMTsKKyAgdC5Jb2dvbmVrID0gMHgwMTJlOworICB0LklvdGEgPSAweDAzOTk7CisgIHQuSW90YWFmcmljYW4gPSAweDAxOTY7CisgIHQuSW90YWRpZXJlc2lzID0gMHgwM2FhOworICB0LklvdGF0b25vcyA9IDB4MDM4YTsKKyAgdC5Jc21hbGwgPSAweGY3Njk7CisgIHQuSXN0cm9rZSA9IDB4MDE5NzsKKyAgdC5JdGlsZGUgPSAweDAxMjg7CisgIHQuSXRpbGRlYmVsb3cgPSAweDFlMmM7CisgIHQuSXpoaXRzYWN5cmlsbGljID0gMHgwNDc0OworICB0Lkl6aGl0c2FkYmxncmF2ZWN5cmlsbGljID0gMHgwNDc2OworICB0LkogPSAweDAwNGE7CisgIHQuSmFhcm1lbmlhbiA9IDB4MDU0MTsKKyAgdC5KY2lyY2xlID0gMHgyNGJmOworICB0LkpjaXJjdW1mbGV4ID0gMHgwMTM0OworICB0LkplY3lyaWxsaWMgPSAweDA0MDg7CisgIHQuSmhlaGFybWVuaWFuID0gMHgwNTRiOworICB0Lkptb25vc3BhY2UgPSAweGZmMmE7CisgIHQuSnNtYWxsID0gMHhmNzZhOworICB0LksgPSAweDAwNGI7CisgIHQuS0JzcXVhcmUgPSAweDMzODU7CisgIHQuS0tzcXVhcmUgPSAweDMzY2Q7CisgIHQuS2FiYXNoa2lyY3lyaWxsaWMgPSAweDA0YTA7CisgIHQuS2FjdXRlID0gMHgxZTMwOworICB0LkthY3lyaWxsaWMgPSAweDA0MWE7CisgIHQuS2FkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5YTsKKyAgdC5LYWhvb2tjeXJpbGxpYyA9IDB4MDRjMzsKKyAgdC5LYXBwYSA9IDB4MDM5YTsKKyAgdC5LYXN0cm9rZWN5cmlsbGljID0gMHgwNDllOworICB0LkthdmVydGljYWxzdHJva2VjeXJpbGxpYyA9IDB4MDQ5YzsKKyAgdC5LY2Fyb24gPSAweDAxZTg7CisgIHQuS2NlZGlsbGEgPSAweDAxMzY7CisgIHQuS2NpcmNsZSA9IDB4MjRjMDsKKyAgdC5LY29tbWFhY2NlbnQgPSAweDAxMzY7CisgIHQuS2RvdGJlbG93ID0gMHgxZTMyOworICB0LktlaGFybWVuaWFuID0gMHgwNTU0OworICB0LktlbmFybWVuaWFuID0gMHgwNTNmOworICB0LktoYWN5cmlsbGljID0gMHgwNDI1OworICB0LktoZWljb3B0aWMgPSAweDAzZTY7CisgIHQuS2hvb2sgPSAweDAxOTg7CisgIHQuS2plY3lyaWxsaWMgPSAweDA0MGM7CisgIHQuS2xpbmViZWxvdyA9IDB4MWUzNDsKKyAgdC5LbW9ub3NwYWNlID0gMHhmZjJiOworICB0LktvcHBhY3lyaWxsaWMgPSAweDA0ODA7CisgIHQuS29wcGFncmVlayA9IDB4MDNkZTsKKyAgdC5Lc2ljeXJpbGxpYyA9IDB4MDQ2ZTsKKyAgdC5Lc21hbGwgPSAweGY3NmI7CisgIHQuTCA9IDB4MDA0YzsKKyAgdC5MSiA9IDB4MDFjNzsKKyAgdC5MTCA9IDB4ZjZiZjsKKyAgdC5MYWN1dGUgPSAweDAxMzk7CisgIHQuTGFtYmRhID0gMHgwMzliOworICB0LkxjYXJvbiA9IDB4MDEzZDsKKyAgdC5MY2VkaWxsYSA9IDB4MDEzYjsKKyAgdC5MY2lyY2xlID0gMHgyNGMxOworICB0LkxjaXJjdW1mbGV4YmVsb3cgPSAweDFlM2M7CisgIHQuTGNvbW1hYWNjZW50ID0gMHgwMTNiOworICB0Lkxkb3QgPSAweDAxM2Y7CisgIHQuTGRvdGFjY2VudCA9IDB4MDEzZjsKKyAgdC5MZG90YmVsb3cgPSAweDFlMzY7CisgIHQuTGRvdGJlbG93bWFjcm9uID0gMHgxZTM4OworICB0Lkxpd25hcm1lbmlhbiA9IDB4MDUzYzsKKyAgdC5MaiA9IDB4MDFjODsKKyAgdC5MamVjeXJpbGxpYyA9IDB4MDQwOTsKKyAgdC5MbGluZWJlbG93ID0gMHgxZTNhOworICB0Lkxtb25vc3BhY2UgPSAweGZmMmM7CisgIHQuTHNsYXNoID0gMHgwMTQxOworICB0LkxzbGFzaHNtYWxsID0gMHhmNmY5OworICB0LkxzbWFsbCA9IDB4Zjc2YzsKKyAgdC5NID0gMHgwMDRkOworICB0Lk1Cc3F1YXJlID0gMHgzMzg2OworICB0Lk1hY3JvbiA9IDB4ZjZkMDsKKyAgdC5NYWNyb25zbWFsbCA9IDB4ZjdhZjsKKyAgdC5NYWN1dGUgPSAweDFlM2U7CisgIHQuTWNpcmNsZSA9IDB4MjRjMjsKKyAgdC5NZG90YWNjZW50ID0gMHgxZTQwOworICB0Lk1kb3RiZWxvdyA9IDB4MWU0MjsKKyAgdC5NZW5hcm1lbmlhbiA9IDB4MDU0NDsKKyAgdC5NbW9ub3NwYWNlID0gMHhmZjJkOworICB0Lk1zbWFsbCA9IDB4Zjc2ZDsKKyAgdC5NdHVybmVkID0gMHgwMTljOworICB0Lk11ID0gMHgwMzljOworICB0Lk4gPSAweDAwNGU7CisgIHQuTkogPSAweDAxY2E7CisgIHQuTmFjdXRlID0gMHgwMTQzOworICB0Lk5jYXJvbiA9IDB4MDE0NzsKKyAgdC5OY2VkaWxsYSA9IDB4MDE0NTsKKyAgdC5OY2lyY2xlID0gMHgyNGMzOworICB0Lk5jaXJjdW1mbGV4YmVsb3cgPSAweDFlNGE7CisgIHQuTmNvbW1hYWNjZW50ID0gMHgwMTQ1OworICB0Lk5kb3RhY2NlbnQgPSAweDFlNDQ7CisgIHQuTmRvdGJlbG93ID0gMHgxZTQ2OworICB0Lk5ob29rbGVmdCA9IDB4MDE5ZDsKKyAgdC5OaW5lcm9tYW4gPSAweDIxNjg7CisgIHQuTmogPSAweDAxY2I7CisgIHQuTmplY3lyaWxsaWMgPSAweDA0MGE7CisgIHQuTmxpbmViZWxvdyA9IDB4MWU0ODsKKyAgdC5ObW9ub3NwYWNlID0gMHhmZjJlOworICB0Lk5vd2FybWVuaWFuID0gMHgwNTQ2OworICB0Lk5zbWFsbCA9IDB4Zjc2ZTsKKyAgdC5OdGlsZGUgPSAweDAwZDE7CisgIHQuTnRpbGRlc21hbGwgPSAweGY3ZjE7CisgIHQuTnUgPSAweDAzOWQ7CisgIHQuTyA9IDB4MDA0ZjsKKyAgdC5PRSA9IDB4MDE1MjsKKyAgdC5PRXNtYWxsID0gMHhmNmZhOworICB0Lk9hY3V0ZSA9IDB4MDBkMzsKKyAgdC5PYWN1dGVzbWFsbCA9IDB4ZjdmMzsKKyAgdC5PYmFycmVkY3lyaWxsaWMgPSAweDA0ZTg7CisgIHQuT2JhcnJlZGRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZWE7CisgIHQuT2JyZXZlID0gMHgwMTRlOworICB0Lk9jYXJvbiA9IDB4MDFkMTsKKyAgdC5PY2VudGVyZWR0aWxkZSA9IDB4MDE5ZjsKKyAgdC5PY2lyY2xlID0gMHgyNGM0OworICB0Lk9jaXJjdW1mbGV4ID0gMHgwMGQ0OworICB0Lk9jaXJjdW1mbGV4YWN1dGUgPSAweDFlZDA7CisgIHQuT2NpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVkODsKKyAgdC5PY2lyY3VtZmxleGdyYXZlID0gMHgxZWQyOworICB0Lk9jaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWQ0OworICB0Lk9jaXJjdW1mbGV4c21hbGwgPSAweGY3ZjQ7CisgIHQuT2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNjsKKyAgdC5PY3lyaWxsaWMgPSAweDA0MWU7CisgIHQuT2RibGFjdXRlID0gMHgwMTUwOworICB0Lk9kYmxncmF2ZSA9IDB4MDIwYzsKKyAgdC5PZGllcmVzaXMgPSAweDAwZDY7CisgIHQuT2RpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTY7CisgIHQuT2RpZXJlc2lzc21hbGwgPSAweGY3ZjY7CisgIHQuT2RvdGJlbG93ID0gMHgxZWNjOworICB0Lk9nb25la3NtYWxsID0gMHhmNmZiOworICB0Lk9ncmF2ZSA9IDB4MDBkMjsKKyAgdC5PZ3JhdmVzbWFsbCA9IDB4ZjdmMjsKKyAgdC5PaGFybWVuaWFuID0gMHgwNTU1OworICB0Lk9obSA9IDB4MjEyNjsKKyAgdC5PaG9va2Fib3ZlID0gMHgxZWNlOworICB0Lk9ob3JuID0gMHgwMWEwOworICB0Lk9ob3JuYWN1dGUgPSAweDFlZGE7CisgIHQuT2hvcm5kb3RiZWxvdyA9IDB4MWVlMjsKKyAgdC5PaG9ybmdyYXZlID0gMHgxZWRjOworICB0Lk9ob3JuaG9va2Fib3ZlID0gMHgxZWRlOworICB0Lk9ob3JudGlsZGUgPSAweDFlZTA7CisgIHQuT2h1bmdhcnVtbGF1dCA9IDB4MDE1MDsKKyAgdC5PaSA9IDB4MDFhMjsKKyAgdC5PaW52ZXJ0ZWRicmV2ZSA9IDB4MDIwZTsKKyAgdC5PbWFjcm9uID0gMHgwMTRjOworICB0Lk9tYWNyb25hY3V0ZSA9IDB4MWU1MjsKKyAgdC5PbWFjcm9uZ3JhdmUgPSAweDFlNTA7CisgIHQuT21lZ2EgPSAweDIxMjY7CisgIHQuT21lZ2FjeXJpbGxpYyA9IDB4MDQ2MDsKKyAgdC5PbWVnYWdyZWVrID0gMHgwM2E5OworICB0Lk9tZWdhcm91bmRjeXJpbGxpYyA9IDB4MDQ3YTsKKyAgdC5PbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2M7CisgIHQuT21lZ2F0b25vcyA9IDB4MDM4ZjsKKyAgdC5PbWljcm9uID0gMHgwMzlmOworICB0Lk9taWNyb250b25vcyA9IDB4MDM4YzsKKyAgdC5PbW9ub3NwYWNlID0gMHhmZjJmOworICB0Lk9uZXJvbWFuID0gMHgyMTYwOworICB0Lk9vZ29uZWsgPSAweDAxZWE7CisgIHQuT29nb25la21hY3JvbiA9IDB4MDFlYzsKKyAgdC5Pb3BlbiA9IDB4MDE4NjsKKyAgdC5Pc2xhc2ggPSAweDAwZDg7CisgIHQuT3NsYXNoYWN1dGUgPSAweDAxZmU7CisgIHQuT3NsYXNoc21hbGwgPSAweGY3Zjg7CisgIHQuT3NtYWxsID0gMHhmNzZmOworICB0Lk9zdHJva2VhY3V0ZSA9IDB4MDFmZTsKKyAgdC5PdGN5cmlsbGljID0gMHgwNDdlOworICB0Lk90aWxkZSA9IDB4MDBkNTsKKyAgdC5PdGlsZGVhY3V0ZSA9IDB4MWU0YzsKKyAgdC5PdGlsZGVkaWVyZXNpcyA9IDB4MWU0ZTsKKyAgdC5PdGlsZGVzbWFsbCA9IDB4ZjdmNTsKKyAgdC5QID0gMHgwMDUwOworICB0LlBhY3V0ZSA9IDB4MWU1NDsKKyAgdC5QY2lyY2xlID0gMHgyNGM1OworICB0LlBkb3RhY2NlbnQgPSAweDFlNTY7CisgIHQuUGVjeXJpbGxpYyA9IDB4MDQxZjsKKyAgdC5QZWhhcm1lbmlhbiA9IDB4MDU0YTsKKyAgdC5QZW1pZGRsZWhvb2tjeXJpbGxpYyA9IDB4MDRhNjsKKyAgdC5QaGkgPSAweDAzYTY7CisgIHQuUGhvb2sgPSAweDAxYTQ7CisgIHQuUGkgPSAweDAzYTA7CisgIHQuUGl3cmFybWVuaWFuID0gMHgwNTUzOworICB0LlBtb25vc3BhY2UgPSAweGZmMzA7CisgIHQuUHNpID0gMHgwM2E4OworICB0LlBzaWN5cmlsbGljID0gMHgwNDcwOworICB0LlBzbWFsbCA9IDB4Zjc3MDsKKyAgdC5RID0gMHgwMDUxOworICB0LlFjaXJjbGUgPSAweDI0YzY7CisgIHQuUW1vbm9zcGFjZSA9IDB4ZmYzMTsKKyAgdC5Rc21hbGwgPSAweGY3NzE7CisgIHQuUiA9IDB4MDA1MjsKKyAgdC5SYWFybWVuaWFuID0gMHgwNTRjOworICB0LlJhY3V0ZSA9IDB4MDE1NDsKKyAgdC5SY2Fyb24gPSAweDAxNTg7CisgIHQuUmNlZGlsbGEgPSAweDAxNTY7CisgIHQuUmNpcmNsZSA9IDB4MjRjNzsKKyAgdC5SY29tbWFhY2NlbnQgPSAweDAxNTY7CisgIHQuUmRibGdyYXZlID0gMHgwMjEwOworICB0LlJkb3RhY2NlbnQgPSAweDFlNTg7CisgIHQuUmRvdGJlbG93ID0gMHgxZTVhOworICB0LlJkb3RiZWxvd21hY3JvbiA9IDB4MWU1YzsKKyAgdC5SZWhhcm1lbmlhbiA9IDB4MDU1MDsKKyAgdC5SZnJha3R1ciA9IDB4MjExYzsKKyAgdC5SaG8gPSAweDAzYTE7CisgIHQuUmluZ3NtYWxsID0gMHhmNmZjOworICB0LlJpbnZlcnRlZGJyZXZlID0gMHgwMjEyOworICB0LlJsaW5lYmVsb3cgPSAweDFlNWU7CisgIHQuUm1vbm9zcGFjZSA9IDB4ZmYzMjsKKyAgdC5Sc21hbGwgPSAweGY3NzI7CisgIHQuUnNtYWxsaW52ZXJ0ZWQgPSAweDAyODE7CisgIHQuUnNtYWxsaW52ZXJ0ZWRzdXBlcmlvciA9IDB4MDJiNjsKKyAgdC5TID0gMHgwMDUzOworICB0LlNGMDEwMDAwID0gMHgyNTBjOworICB0LlNGMDIwMDAwID0gMHgyNTE0OworICB0LlNGMDMwMDAwID0gMHgyNTEwOworICB0LlNGMDQwMDAwID0gMHgyNTE4OworICB0LlNGMDUwMDAwID0gMHgyNTNjOworICB0LlNGMDYwMDAwID0gMHgyNTJjOworICB0LlNGMDcwMDAwID0gMHgyNTM0OworICB0LlNGMDgwMDAwID0gMHgyNTFjOworICB0LlNGMDkwMDAwID0gMHgyNTI0OworICB0LlNGMTAwMDAwID0gMHgyNTAwOworICB0LlNGMTEwMDAwID0gMHgyNTAyOworICB0LlNGMTkwMDAwID0gMHgyNTYxOworICB0LlNGMjAwMDAwID0gMHgyNTYyOworICB0LlNGMjEwMDAwID0gMHgyNTU2OworICB0LlNGMjIwMDAwID0gMHgyNTU1OworICB0LlNGMjMwMDAwID0gMHgyNTYzOworICB0LlNGMjQwMDAwID0gMHgyNTUxOworICB0LlNGMjUwMDAwID0gMHgyNTU3OworICB0LlNGMjYwMDAwID0gMHgyNTVkOworICB0LlNGMjcwMDAwID0gMHgyNTVjOworICB0LlNGMjgwMDAwID0gMHgyNTViOworICB0LlNGMzYwMDAwID0gMHgyNTVlOworICB0LlNGMzcwMDAwID0gMHgyNTVmOworICB0LlNGMzgwMDAwID0gMHgyNTVhOworICB0LlNGMzkwMDAwID0gMHgyNTU0OworICB0LlNGNDAwMDAwID0gMHgyNTY5OworICB0LlNGNDEwMDAwID0gMHgyNTY2OworICB0LlNGNDIwMDAwID0gMHgyNTYwOworICB0LlNGNDMwMDAwID0gMHgyNTUwOworICB0LlNGNDQwMDAwID0gMHgyNTZjOworICB0LlNGNDUwMDAwID0gMHgyNTY3OworICB0LlNGNDYwMDAwID0gMHgyNTY4OworICB0LlNGNDcwMDAwID0gMHgyNTY0OworICB0LlNGNDgwMDAwID0gMHgyNTY1OworICB0LlNGNDkwMDAwID0gMHgyNTU5OworICB0LlNGNTAwMDAwID0gMHgyNTU4OworICB0LlNGNTEwMDAwID0gMHgyNTUyOworICB0LlNGNTIwMDAwID0gMHgyNTUzOworICB0LlNGNTMwMDAwID0gMHgyNTZiOworICB0LlNGNTQwMDAwID0gMHgyNTZhOworICB0LlNhY3V0ZSA9IDB4MDE1YTsKKyAgdC5TYWN1dGVkb3RhY2NlbnQgPSAweDFlNjQ7CisgIHQuU2FtcGlncmVlayA9IDB4MDNlMDsKKyAgdC5TY2Fyb24gPSAweDAxNjA7CisgIHQuU2Nhcm9uZG90YWNjZW50ID0gMHgxZTY2OworICB0LlNjYXJvbnNtYWxsID0gMHhmNmZkOworICB0LlNjZWRpbGxhID0gMHgwMTVlOworICB0LlNjaHdhID0gMHgwMThmOworICB0LlNjaHdhY3lyaWxsaWMgPSAweDA0ZDg7CisgIHQuU2Nod2FkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRhOworICB0LlNjaXJjbGUgPSAweDI0Yzg7CisgIHQuU2NpcmN1bWZsZXggPSAweDAxNWM7CisgIHQuU2NvbW1hYWNjZW50ID0gMHgwMjE4OworICB0LlNkb3RhY2NlbnQgPSAweDFlNjA7CisgIHQuU2RvdGJlbG93ID0gMHgxZTYyOworICB0LlNkb3RiZWxvd2RvdGFjY2VudCA9IDB4MWU2ODsKKyAgdC5TZWhhcm1lbmlhbiA9IDB4MDU0ZDsKKyAgdC5TZXZlbnJvbWFuID0gMHgyMTY2OworICB0LlNoYWFybWVuaWFuID0gMHgwNTQ3OworICB0LlNoYWN5cmlsbGljID0gMHgwNDI4OworICB0LlNoY2hhY3lyaWxsaWMgPSAweDA0Mjk7CisgIHQuU2hlaWNvcHRpYyA9IDB4MDNlMjsKKyAgdC5TaGhhY3lyaWxsaWMgPSAweDA0YmE7CisgIHQuU2hpbWFjb3B0aWMgPSAweDAzZWM7CisgIHQuU2lnbWEgPSAweDAzYTM7CisgIHQuU2l4cm9tYW4gPSAweDIxNjU7CisgIHQuU21vbm9zcGFjZSA9IDB4ZmYzMzsKKyAgdC5Tb2Z0c2lnbmN5cmlsbGljID0gMHgwNDJjOworICB0LlNzbWFsbCA9IDB4Zjc3MzsKKyAgdC5TdGlnbWFncmVlayA9IDB4MDNkYTsKKyAgdC5UID0gMHgwMDU0OworICB0LlRhdSA9IDB4MDNhNDsKKyAgdC5UYmFyID0gMHgwMTY2OworICB0LlRjYXJvbiA9IDB4MDE2NDsKKyAgdC5UY2VkaWxsYSA9IDB4MDE2MjsKKyAgdC5UY2lyY2xlID0gMHgyNGM5OworICB0LlRjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzA7CisgIHQuVGNvbW1hYWNjZW50ID0gMHgwMTYyOworICB0LlRkb3RhY2NlbnQgPSAweDFlNmE7CisgIHQuVGRvdGJlbG93ID0gMHgxZTZjOworICB0LlRlY3lyaWxsaWMgPSAweDA0MjI7CisgIHQuVGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYzsKKyAgdC5UZW5yb21hbiA9IDB4MjE2OTsKKyAgdC5UZXRzZWN5cmlsbGljID0gMHgwNGI0OworICB0LlRoZXRhID0gMHgwMzk4OworICB0LlRob29rID0gMHgwMWFjOworICB0LlRob3JuID0gMHgwMGRlOworICB0LlRob3Juc21hbGwgPSAweGY3ZmU7CisgIHQuVGhyZWVyb21hbiA9IDB4MjE2MjsKKyAgdC5UaWxkZXNtYWxsID0gMHhmNmZlOworICB0LlRpd25hcm1lbmlhbiA9IDB4MDU0ZjsKKyAgdC5UbGluZWJlbG93ID0gMHgxZTZlOworICB0LlRtb25vc3BhY2UgPSAweGZmMzQ7CisgIHQuVG9hcm1lbmlhbiA9IDB4MDUzOTsKKyAgdC5Ub25lZml2ZSA9IDB4MDFiYzsKKyAgdC5Ub25lc2l4ID0gMHgwMTg0OworICB0LlRvbmV0d28gPSAweDAxYTc7CisgIHQuVHJldHJvZmxleGhvb2sgPSAweDAxYWU7CisgIHQuVHNlY3lyaWxsaWMgPSAweDA0MjY7CisgIHQuVHNoZWN5cmlsbGljID0gMHgwNDBiOworICB0LlRzbWFsbCA9IDB4Zjc3NDsKKyAgdC5Ud2VsdmVyb21hbiA9IDB4MjE2YjsKKyAgdC5Ud29yb21hbiA9IDB4MjE2MTsKKyAgdC5VID0gMHgwMDU1OworICB0LlVhY3V0ZSA9IDB4MDBkYTsKKyAgdC5VYWN1dGVzbWFsbCA9IDB4ZjdmYTsKKyAgdC5VYnJldmUgPSAweDAxNmM7CisgIHQuVWNhcm9uID0gMHgwMWQzOworICB0LlVjaXJjbGUgPSAweDI0Y2E7CisgIHQuVWNpcmN1bWZsZXggPSAweDAwZGI7CisgIHQuVWNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3NjsKKyAgdC5VY2lyY3VtZmxleHNtYWxsID0gMHhmN2ZiOworICB0LlVjeXJpbGxpYyA9IDB4MDQyMzsKKyAgdC5VZGJsYWN1dGUgPSAweDAxNzA7CisgIHQuVWRibGdyYXZlID0gMHgwMjE0OworICB0LlVkaWVyZXNpcyA9IDB4MDBkYzsKKyAgdC5VZGllcmVzaXNhY3V0ZSA9IDB4MDFkNzsKKyAgdC5VZGllcmVzaXNiZWxvdyA9IDB4MWU3MjsKKyAgdC5VZGllcmVzaXNjYXJvbiA9IDB4MDFkOTsKKyAgdC5VZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmMDsKKyAgdC5VZGllcmVzaXNncmF2ZSA9IDB4MDFkYjsKKyAgdC5VZGllcmVzaXNtYWNyb24gPSAweDAxZDU7CisgIHQuVWRpZXJlc2lzc21hbGwgPSAweGY3ZmM7CisgIHQuVWRvdGJlbG93ID0gMHgxZWU0OworICB0LlVncmF2ZSA9IDB4MDBkOTsKKyAgdC5VZ3JhdmVzbWFsbCA9IDB4ZjdmOTsKKyAgdC5VaG9va2Fib3ZlID0gMHgxZWU2OworICB0LlVob3JuID0gMHgwMWFmOworICB0LlVob3JuYWN1dGUgPSAweDFlZTg7CisgIHQuVWhvcm5kb3RiZWxvdyA9IDB4MWVmMDsKKyAgdC5VaG9ybmdyYXZlID0gMHgxZWVhOworICB0LlVob3JuaG9va2Fib3ZlID0gMHgxZWVjOworICB0LlVob3JudGlsZGUgPSAweDFlZWU7CisgIHQuVWh1bmdhcnVtbGF1dCA9IDB4MDE3MDsKKyAgdC5VaHVuZ2FydW1sYXV0Y3lyaWxsaWMgPSAweDA0ZjI7CisgIHQuVWludmVydGVkYnJldmUgPSAweDAyMTY7CisgIHQuVWtjeXJpbGxpYyA9IDB4MDQ3ODsKKyAgdC5VbWFjcm9uID0gMHgwMTZhOworICB0LlVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZTsKKyAgdC5VbWFjcm9uZGllcmVzaXMgPSAweDFlN2E7CisgIHQuVW1vbm9zcGFjZSA9IDB4ZmYzNTsKKyAgdC5Vb2dvbmVrID0gMHgwMTcyOworICB0LlVwc2lsb24gPSAweDAzYTU7CisgIHQuVXBzaWxvbjEgPSAweDAzZDI7CisgIHQuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrID0gMHgwM2QzOworICB0LlVwc2lsb25hZnJpY2FuID0gMHgwMWIxOworICB0LlVwc2lsb25kaWVyZXNpcyA9IDB4MDNhYjsKKyAgdC5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWsgPSAweDAzZDQ7CisgIHQuVXBzaWxvbmhvb2tzeW1ib2wgPSAweDAzZDI7CisgIHQuVXBzaWxvbnRvbm9zID0gMHgwMzhlOworICB0LlVyaW5nID0gMHgwMTZlOworICB0LlVzaG9ydGN5cmlsbGljID0gMHgwNDBlOworICB0LlVzbWFsbCA9IDB4Zjc3NTsKKyAgdC5Vc3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZTsKKyAgdC5Vc3RyYWlnaHRzdHJva2VjeXJpbGxpYyA9IDB4MDRiMDsKKyAgdC5VdGlsZGUgPSAweDAxNjg7CisgIHQuVXRpbGRlYWN1dGUgPSAweDFlNzg7CisgIHQuVXRpbGRlYmVsb3cgPSAweDFlNzQ7CisgIHQuViA9IDB4MDA1NjsKKyAgdC5WY2lyY2xlID0gMHgyNGNiOworICB0LlZkb3RiZWxvdyA9IDB4MWU3ZTsKKyAgdC5WZWN5cmlsbGljID0gMHgwNDEyOworICB0LlZld2FybWVuaWFuID0gMHgwNTRlOworICB0LlZob29rID0gMHgwMWIyOworICB0LlZtb25vc3BhY2UgPSAweGZmMzY7CisgIHQuVm9hcm1lbmlhbiA9IDB4MDU0ODsKKyAgdC5Wc21hbGwgPSAweGY3NzY7CisgIHQuVnRpbGRlID0gMHgxZTdjOworICB0LlcgPSAweDAwNTc7CisgIHQuV2FjdXRlID0gMHgxZTgyOworICB0LldjaXJjbGUgPSAweDI0Y2M7CisgIHQuV2NpcmN1bWZsZXggPSAweDAxNzQ7CisgIHQuV2RpZXJlc2lzID0gMHgxZTg0OworICB0Lldkb3RhY2NlbnQgPSAweDFlODY7CisgIHQuV2RvdGJlbG93ID0gMHgxZTg4OworICB0LldncmF2ZSA9IDB4MWU4MDsKKyAgdC5XbW9ub3NwYWNlID0gMHhmZjM3OworICB0LldzbWFsbCA9IDB4Zjc3NzsKKyAgdC5YID0gMHgwMDU4OworICB0LlhjaXJjbGUgPSAweDI0Y2Q7CisgIHQuWGRpZXJlc2lzID0gMHgxZThjOworICB0Llhkb3RhY2NlbnQgPSAweDFlOGE7CisgIHQuWGVoYXJtZW5pYW4gPSAweDA1M2Q7CisgIHQuWGkgPSAweDAzOWU7CisgIHQuWG1vbm9zcGFjZSA9IDB4ZmYzODsKKyAgdC5Yc21hbGwgPSAweGY3Nzg7CisgIHQuWSA9IDB4MDA1OTsKKyAgdC5ZYWN1dGUgPSAweDAwZGQ7CisgIHQuWWFjdXRlc21hbGwgPSAweGY3ZmQ7CisgIHQuWWF0Y3lyaWxsaWMgPSAweDA0NjI7CisgIHQuWWNpcmNsZSA9IDB4MjRjZTsKKyAgdC5ZY2lyY3VtZmxleCA9IDB4MDE3NjsKKyAgdC5ZZGllcmVzaXMgPSAweDAxNzg7CisgIHQuWWRpZXJlc2lzc21hbGwgPSAweGY3ZmY7CisgIHQuWWRvdGFjY2VudCA9IDB4MWU4ZTsKKyAgdC5ZZG90YmVsb3cgPSAweDFlZjQ7CisgIHQuWWVyaWN5cmlsbGljID0gMHgwNDJiOworICB0LlllcnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY4OworICB0LllncmF2ZSA9IDB4MWVmMjsKKyAgdC5ZaG9vayA9IDB4MDFiMzsKKyAgdC5ZaG9va2Fib3ZlID0gMHgxZWY2OworICB0LllpYXJtZW5pYW4gPSAweDA1NDU7CisgIHQuWWljeXJpbGxpYyA9IDB4MDQwNzsKKyAgdC5ZaXduYXJtZW5pYW4gPSAweDA1NTI7CisgIHQuWW1vbm9zcGFjZSA9IDB4ZmYzOTsKKyAgdC5Zc21hbGwgPSAweGY3Nzk7CisgIHQuWXRpbGRlID0gMHgxZWY4OworICB0Lll1c2JpZ2N5cmlsbGljID0gMHgwNDZhOworICB0Lll1c2JpZ2lvdGlmaWVkY3lyaWxsaWMgPSAweDA0NmM7CisgIHQuWXVzbGl0dGxlY3lyaWxsaWMgPSAweDA0NjY7CisgIHQuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ODsKKyAgdC5aID0gMHgwMDVhOworICB0LlphYXJtZW5pYW4gPSAweDA1MzY7CisgIHQuWmFjdXRlID0gMHgwMTc5OworICB0LlpjYXJvbiA9IDB4MDE3ZDsKKyAgdC5aY2Fyb25zbWFsbCA9IDB4ZjZmZjsKKyAgdC5aY2lyY2xlID0gMHgyNGNmOworICB0LlpjaXJjdW1mbGV4ID0gMHgxZTkwOworICB0Llpkb3QgPSAweDAxN2I7CisgIHQuWmRvdGFjY2VudCA9IDB4MDE3YjsKKyAgdC5aZG90YmVsb3cgPSAweDFlOTI7CisgIHQuWmVjeXJpbGxpYyA9IDB4MDQxNzsKKyAgdC5aZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk4OworICB0LlplZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZTsKKyAgdC5aZXRhID0gMHgwMzk2OworICB0LlpoZWFybWVuaWFuID0gMHgwNTNhOworICB0LlpoZWJyZXZlY3lyaWxsaWMgPSAweDA0YzE7CisgIHQuWmhlY3lyaWxsaWMgPSAweDA0MTY7CisgIHQuWmhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTY7CisgIHQuWmhlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkYzsKKyAgdC5abGluZWJlbG93ID0gMHgxZTk0OworICB0Llptb25vc3BhY2UgPSAweGZmM2E7CisgIHQuWnNtYWxsID0gMHhmNzdhOworICB0LlpzdHJva2UgPSAweDAxYjU7CisgIHQuYSA9IDB4MDA2MTsKKyAgdC5hYWJlbmdhbGkgPSAweDA5ODY7CisgIHQuYWFjdXRlID0gMHgwMGUxOworICB0LmFhZGV2YSA9IDB4MDkwNjsKKyAgdC5hYWd1amFyYXRpID0gMHgwYTg2OworICB0LmFhZ3VybXVraGkgPSAweDBhMDY7CisgIHQuYWFtYXRyYWd1cm11a2hpID0gMHgwYTNlOworICB0LmFhcnVzcXVhcmUgPSAweDMzMDM7CisgIHQuYWF2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWJlOworICB0LmFhdm93ZWxzaWduZGV2YSA9IDB4MDkzZTsKKyAgdC5hYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWJlOworICB0LmFiYnJldmlhdGlvbm1hcmthcm1lbmlhbiA9IDB4MDU1ZjsKKyAgdC5hYmJyZXZpYXRpb25zaWduZGV2YSA9IDB4MDk3MDsKKyAgdC5hYmVuZ2FsaSA9IDB4MDk4NTsKKyAgdC5hYm9wb21vZm8gPSAweDMxMWE7CisgIHQuYWJyZXZlID0gMHgwMTAzOworICB0LmFicmV2ZWFjdXRlID0gMHgxZWFmOworICB0LmFicmV2ZWN5cmlsbGljID0gMHgwNGQxOworICB0LmFicmV2ZWRvdGJlbG93ID0gMHgxZWI3OworICB0LmFicmV2ZWdyYXZlID0gMHgxZWIxOworICB0LmFicmV2ZWhvb2thYm92ZSA9IDB4MWViMzsKKyAgdC5hYnJldmV0aWxkZSA9IDB4MWViNTsKKyAgdC5hY2Fyb24gPSAweDAxY2U7CisgIHQuYWNpcmNsZSA9IDB4MjRkMDsKKyAgdC5hY2lyY3VtZmxleCA9IDB4MDBlMjsKKyAgdC5hY2lyY3VtZmxleGFjdXRlID0gMHgxZWE1OworICB0LmFjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYWQ7CisgIHQuYWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNzsKKyAgdC5hY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVhOTsKKyAgdC5hY2lyY3VtZmxleHRpbGRlID0gMHgxZWFiOworICB0LmFjdXRlID0gMHgwMGI0OworICB0LmFjdXRlYmVsb3djbWIgPSAweDAzMTc7CisgIHQuYWN1dGVjbWIgPSAweDAzMDE7CisgIHQuYWN1dGVjb21iID0gMHgwMzAxOworICB0LmFjdXRlZGV2YSA9IDB4MDk1NDsKKyAgdC5hY3V0ZWxvd21vZCA9IDB4MDJjZjsKKyAgdC5hY3V0ZXRvbmVjbWIgPSAweDAzNDE7CisgIHQuYWN5cmlsbGljID0gMHgwNDMwOworICB0LmFkYmxncmF2ZSA9IDB4MDIwMTsKKyAgdC5hZGRha2d1cm11a2hpID0gMHgwYTcxOworICB0LmFkZXZhID0gMHgwOTA1OworICB0LmFkaWVyZXNpcyA9IDB4MDBlNDsKKyAgdC5hZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMzsKKyAgdC5hZGllcmVzaXNtYWNyb24gPSAweDAxZGY7CisgIHQuYWRvdGJlbG93ID0gMHgxZWExOworICB0LmFkb3RtYWNyb24gPSAweDAxZTE7CisgIHQuYWUgPSAweDAwZTY7CisgIHQuYWVhY3V0ZSA9IDB4MDFmZDsKKyAgdC5hZWtvcmVhbiA9IDB4MzE1MDsKKyAgdC5hZW1hY3JvbiA9IDB4MDFlMzsKKyAgdC5hZmlpMDAyMDggPSAweDIwMTU7CisgIHQuYWZpaTA4OTQxID0gMHgyMGE0OworICB0LmFmaWkxMDAxNyA9IDB4MDQxMDsKKyAgdC5hZmlpMTAwMTggPSAweDA0MTE7CisgIHQuYWZpaTEwMDE5ID0gMHgwNDEyOworICB0LmFmaWkxMDAyMCA9IDB4MDQxMzsKKyAgdC5hZmlpMTAwMjEgPSAweDA0MTQ7CisgIHQuYWZpaTEwMDIyID0gMHgwNDE1OworICB0LmFmaWkxMDAyMyA9IDB4MDQwMTsKKyAgdC5hZmlpMTAwMjQgPSAweDA0MTY7CisgIHQuYWZpaTEwMDI1ID0gMHgwNDE3OworICB0LmFmaWkxMDAyNiA9IDB4MDQxODsKKyAgdC5hZmlpMTAwMjcgPSAweDA0MTk7CisgIHQuYWZpaTEwMDI4ID0gMHgwNDFhOworICB0LmFmaWkxMDAyOSA9IDB4MDQxYjsKKyAgdC5hZmlpMTAwMzAgPSAweDA0MWM7CisgIHQuYWZpaTEwMDMxID0gMHgwNDFkOworICB0LmFmaWkxMDAzMiA9IDB4MDQxZTsKKyAgdC5hZmlpMTAwMzMgPSAweDA0MWY7CisgIHQuYWZpaTEwMDM0ID0gMHgwNDIwOworICB0LmFmaWkxMDAzNSA9IDB4MDQyMTsKKyAgdC5hZmlpMTAwMzYgPSAweDA0MjI7CisgIHQuYWZpaTEwMDM3ID0gMHgwNDIzOworICB0LmFmaWkxMDAzOCA9IDB4MDQyNDsKKyAgdC5hZmlpMTAwMzkgPSAweDA0MjU7CisgIHQuYWZpaTEwMDQwID0gMHgwNDI2OworICB0LmFmaWkxMDA0MSA9IDB4MDQyNzsKKyAgdC5hZmlpMTAwNDIgPSAweDA0Mjg7CisgIHQuYWZpaTEwMDQzID0gMHgwNDI5OworICB0LmFmaWkxMDA0NCA9IDB4MDQyYTsKKyAgdC5hZmlpMTAwNDUgPSAweDA0MmI7CisgIHQuYWZpaTEwMDQ2ID0gMHgwNDJjOworICB0LmFmaWkxMDA0NyA9IDB4MDQyZDsKKyAgdC5hZmlpMTAwNDggPSAweDA0MmU7CisgIHQuYWZpaTEwMDQ5ID0gMHgwNDJmOworICB0LmFmaWkxMDA1MCA9IDB4MDQ5MDsKKyAgdC5hZmlpMTAwNTEgPSAweDA0MDI7CisgIHQuYWZpaTEwMDUyID0gMHgwNDAzOworICB0LmFmaWkxMDA1MyA9IDB4MDQwNDsKKyAgdC5hZmlpMTAwNTQgPSAweDA0MDU7CisgIHQuYWZpaTEwMDU1ID0gMHgwNDA2OworICB0LmFmaWkxMDA1NiA9IDB4MDQwNzsKKyAgdC5hZmlpMTAwNTcgPSAweDA0MDg7CisgIHQuYWZpaTEwMDU4ID0gMHgwNDA5OworICB0LmFmaWkxMDA1OSA9IDB4MDQwYTsKKyAgdC5hZmlpMTAwNjAgPSAweDA0MGI7CisgIHQuYWZpaTEwMDYxID0gMHgwNDBjOworICB0LmFmaWkxMDA2MiA9IDB4MDQwZTsKKyAgdC5hZmlpMTAwNjMgPSAweGY2YzQ7CisgIHQuYWZpaTEwMDY0ID0gMHhmNmM1OworICB0LmFmaWkxMDA2NSA9IDB4MDQzMDsKKyAgdC5hZmlpMTAwNjYgPSAweDA0MzE7CisgIHQuYWZpaTEwMDY3ID0gMHgwNDMyOworICB0LmFmaWkxMDA2OCA9IDB4MDQzMzsKKyAgdC5hZmlpMTAwNjkgPSAweDA0MzQ7CisgIHQuYWZpaTEwMDcwID0gMHgwNDM1OworICB0LmFmaWkxMDA3MSA9IDB4MDQ1MTsKKyAgdC5hZmlpMTAwNzIgPSAweDA0MzY7CisgIHQuYWZpaTEwMDczID0gMHgwNDM3OworICB0LmFmaWkxMDA3NCA9IDB4MDQzODsKKyAgdC5hZmlpMTAwNzUgPSAweDA0Mzk7CisgIHQuYWZpaTEwMDc2ID0gMHgwNDNhOworICB0LmFmaWkxMDA3NyA9IDB4MDQzYjsKKyAgdC5hZmlpMTAwNzggPSAweDA0M2M7CisgIHQuYWZpaTEwMDc5ID0gMHgwNDNkOworICB0LmFmaWkxMDA4MCA9IDB4MDQzZTsKKyAgdC5hZmlpMTAwODEgPSAweDA0M2Y7CisgIHQuYWZpaTEwMDgyID0gMHgwNDQwOworICB0LmFmaWkxMDA4MyA9IDB4MDQ0MTsKKyAgdC5hZmlpMTAwODQgPSAweDA0NDI7CisgIHQuYWZpaTEwMDg1ID0gMHgwNDQzOworICB0LmFmaWkxMDA4NiA9IDB4MDQ0NDsKKyAgdC5hZmlpMTAwODcgPSAweDA0NDU7CisgIHQuYWZpaTEwMDg4ID0gMHgwNDQ2OworICB0LmFmaWkxMDA4OSA9IDB4MDQ0NzsKKyAgdC5hZmlpMTAwOTAgPSAweDA0NDg7CisgIHQuYWZpaTEwMDkxID0gMHgwNDQ5OworICB0LmFmaWkxMDA5MiA9IDB4MDQ0YTsKKyAgdC5hZmlpMTAwOTMgPSAweDA0NGI7CisgIHQuYWZpaTEwMDk0ID0gMHgwNDRjOworICB0LmFmaWkxMDA5NSA9IDB4MDQ0ZDsKKyAgdC5hZmlpMTAwOTYgPSAweDA0NGU7CisgIHQuYWZpaTEwMDk3ID0gMHgwNDRmOworICB0LmFmaWkxMDA5OCA9IDB4MDQ5MTsKKyAgdC5hZmlpMTAwOTkgPSAweDA0NTI7CisgIHQuYWZpaTEwMTAwID0gMHgwNDUzOworICB0LmFmaWkxMDEwMSA9IDB4MDQ1NDsKKyAgdC5hZmlpMTAxMDIgPSAweDA0NTU7CisgIHQuYWZpaTEwMTAzID0gMHgwNDU2OworICB0LmFmaWkxMDEwNCA9IDB4MDQ1NzsKKyAgdC5hZmlpMTAxMDUgPSAweDA0NTg7CisgIHQuYWZpaTEwMTA2ID0gMHgwNDU5OworICB0LmFmaWkxMDEwNyA9IDB4MDQ1YTsKKyAgdC5hZmlpMTAxMDggPSAweDA0NWI7CisgIHQuYWZpaTEwMTA5ID0gMHgwNDVjOworICB0LmFmaWkxMDExMCA9IDB4MDQ1ZTsKKyAgdC5hZmlpMTAxNDUgPSAweDA0MGY7CisgIHQuYWZpaTEwMTQ2ID0gMHgwNDYyOworICB0LmFmaWkxMDE0NyA9IDB4MDQ3MjsKKyAgdC5hZmlpMTAxNDggPSAweDA0NzQ7CisgIHQuYWZpaTEwMTkyID0gMHhmNmM2OworICB0LmFmaWkxMDE5MyA9IDB4MDQ1ZjsKKyAgdC5hZmlpMTAxOTQgPSAweDA0NjM7CisgIHQuYWZpaTEwMTk1ID0gMHgwNDczOworICB0LmFmaWkxMDE5NiA9IDB4MDQ3NTsKKyAgdC5hZmlpMTA4MzEgPSAweGY2Yzc7CisgIHQuYWZpaTEwODMyID0gMHhmNmM4OworICB0LmFmaWkxMDg0NiA9IDB4MDRkOTsKKyAgdC5hZmlpMjk5ID0gMHgyMDBlOworICB0LmFmaWkzMDAgPSAweDIwMGY7CisgIHQuYWZpaTMwMSA9IDB4MjAwZDsKKyAgdC5hZmlpNTczODEgPSAweDA2NmE7CisgIHQuYWZpaTU3Mzg4ID0gMHgwNjBjOworICB0LmFmaWk1NzM5MiA9IDB4MDY2MDsKKyAgdC5hZmlpNTczOTMgPSAweDA2NjE7CisgIHQuYWZpaTU3Mzk0ID0gMHgwNjYyOworICB0LmFmaWk1NzM5NSA9IDB4MDY2MzsKKyAgdC5hZmlpNTczOTYgPSAweDA2NjQ7CisgIHQuYWZpaTU3Mzk3ID0gMHgwNjY1OworICB0LmFmaWk1NzM5OCA9IDB4MDY2NjsKKyAgdC5hZmlpNTczOTkgPSAweDA2Njc7CisgIHQuYWZpaTU3NDAwID0gMHgwNjY4OworICB0LmFmaWk1NzQwMSA9IDB4MDY2OTsKKyAgdC5hZmlpNTc0MDMgPSAweDA2MWI7CisgIHQuYWZpaTU3NDA3ID0gMHgwNjFmOworICB0LmFmaWk1NzQwOSA9IDB4MDYyMTsKKyAgdC5hZmlpNTc0MTAgPSAweDA2MjI7CisgIHQuYWZpaTU3NDExID0gMHgwNjIzOworICB0LmFmaWk1NzQxMiA9IDB4MDYyNDsKKyAgdC5hZmlpNTc0MTMgPSAweDA2MjU7CisgIHQuYWZpaTU3NDE0ID0gMHgwNjI2OworICB0LmFmaWk1NzQxNSA9IDB4MDYyNzsKKyAgdC5hZmlpNTc0MTYgPSAweDA2Mjg7CisgIHQuYWZpaTU3NDE3ID0gMHgwNjI5OworICB0LmFmaWk1NzQxOCA9IDB4MDYyYTsKKyAgdC5hZmlpNTc0MTkgPSAweDA2MmI7CisgIHQuYWZpaTU3NDIwID0gMHgwNjJjOworICB0LmFmaWk1NzQyMSA9IDB4MDYyZDsKKyAgdC5hZmlpNTc0MjIgPSAweDA2MmU7CisgIHQuYWZpaTU3NDIzID0gMHgwNjJmOworICB0LmFmaWk1NzQyNCA9IDB4MDYzMDsKKyAgdC5hZmlpNTc0MjUgPSAweDA2MzE7CisgIHQuYWZpaTU3NDI2ID0gMHgwNjMyOworICB0LmFmaWk1NzQyNyA9IDB4MDYzMzsKKyAgdC5hZmlpNTc0MjggPSAweDA2MzQ7CisgIHQuYWZpaTU3NDI5ID0gMHgwNjM1OworICB0LmFmaWk1NzQzMCA9IDB4MDYzNjsKKyAgdC5hZmlpNTc0MzEgPSAweDA2Mzc7CisgIHQuYWZpaTU3NDMyID0gMHgwNjM4OworICB0LmFmaWk1NzQzMyA9IDB4MDYzOTsKKyAgdC5hZmlpNTc0MzQgPSAweDA2M2E7CisgIHQuYWZpaTU3NDQwID0gMHgwNjQwOworICB0LmFmaWk1NzQ0MSA9IDB4MDY0MTsKKyAgdC5hZmlpNTc0NDIgPSAweDA2NDI7CisgIHQuYWZpaTU3NDQzID0gMHgwNjQzOworICB0LmFmaWk1NzQ0NCA9IDB4MDY0NDsKKyAgdC5hZmlpNTc0NDUgPSAweDA2NDU7CisgIHQuYWZpaTU3NDQ2ID0gMHgwNjQ2OworICB0LmFmaWk1NzQ0OCA9IDB4MDY0ODsKKyAgdC5hZmlpNTc0NDkgPSAweDA2NDk7CisgIHQuYWZpaTU3NDUwID0gMHgwNjRhOworICB0LmFmaWk1NzQ1MSA9IDB4MDY0YjsKKyAgdC5hZmlpNTc0NTIgPSAweDA2NGM7CisgIHQuYWZpaTU3NDUzID0gMHgwNjRkOworICB0LmFmaWk1NzQ1NCA9IDB4MDY0ZTsKKyAgdC5hZmlpNTc0NTUgPSAweDA2NGY7CisgIHQuYWZpaTU3NDU2ID0gMHgwNjUwOworICB0LmFmaWk1NzQ1NyA9IDB4MDY1MTsKKyAgdC5hZmlpNTc0NTggPSAweDA2NTI7CisgIHQuYWZpaTU3NDcwID0gMHgwNjQ3OworICB0LmFmaWk1NzUwNSA9IDB4MDZhNDsKKyAgdC5hZmlpNTc1MDYgPSAweDA2N2U7CisgIHQuYWZpaTU3NTA3ID0gMHgwNjg2OworICB0LmFmaWk1NzUwOCA9IDB4MDY5ODsKKyAgdC5hZmlpNTc1MDkgPSAweDA2YWY7CisgIHQuYWZpaTU3NTExID0gMHgwNjc5OworICB0LmFmaWk1NzUxMiA9IDB4MDY4ODsKKyAgdC5hZmlpNTc1MTMgPSAweDA2OTE7CisgIHQuYWZpaTU3NTE0ID0gMHgwNmJhOworICB0LmFmaWk1NzUxOSA9IDB4MDZkMjsKKyAgdC5hZmlpNTc1MzQgPSAweDA2ZDU7CisgIHQuYWZpaTU3NjM2ID0gMHgyMGFhOworICB0LmFmaWk1NzY0NSA9IDB4MDViZTsKKyAgdC5hZmlpNTc2NTggPSAweDA1YzM7CisgIHQuYWZpaTU3NjY0ID0gMHgwNWQwOworICB0LmFmaWk1NzY2NSA9IDB4MDVkMTsKKyAgdC5hZmlpNTc2NjYgPSAweDA1ZDI7CisgIHQuYWZpaTU3NjY3ID0gMHgwNWQzOworICB0LmFmaWk1NzY2OCA9IDB4MDVkNDsKKyAgdC5hZmlpNTc2NjkgPSAweDA1ZDU7CisgIHQuYWZpaTU3NjcwID0gMHgwNWQ2OworICB0LmFmaWk1NzY3MSA9IDB4MDVkNzsKKyAgdC5hZmlpNTc2NzIgPSAweDA1ZDg7CisgIHQuYWZpaTU3NjczID0gMHgwNWQ5OworICB0LmFmaWk1NzY3NCA9IDB4MDVkYTsKKyAgdC5hZmlpNTc2NzUgPSAweDA1ZGI7CisgIHQuYWZpaTU3Njc2ID0gMHgwNWRjOworICB0LmFmaWk1NzY3NyA9IDB4MDVkZDsKKyAgdC5hZmlpNTc2NzggPSAweDA1ZGU7CisgIHQuYWZpaTU3Njc5ID0gMHgwNWRmOworICB0LmFmaWk1NzY4MCA9IDB4MDVlMDsKKyAgdC5hZmlpNTc2ODEgPSAweDA1ZTE7CisgIHQuYWZpaTU3NjgyID0gMHgwNWUyOworICB0LmFmaWk1NzY4MyA9IDB4MDVlMzsKKyAgdC5hZmlpNTc2ODQgPSAweDA1ZTQ7CisgIHQuYWZpaTU3Njg1ID0gMHgwNWU1OworICB0LmFmaWk1NzY4NiA9IDB4MDVlNjsKKyAgdC5hZmlpNTc2ODcgPSAweDA1ZTc7CisgIHQuYWZpaTU3Njg4ID0gMHgwNWU4OworICB0LmFmaWk1NzY4OSA9IDB4MDVlOTsKKyAgdC5hZmlpNTc2OTAgPSAweDA1ZWE7CisgIHQuYWZpaTU3Njk0ID0gMHhmYjJhOworICB0LmFmaWk1NzY5NSA9IDB4ZmIyYjsKKyAgdC5hZmlpNTc3MDAgPSAweGZiNGI7CisgIHQuYWZpaTU3NzA1ID0gMHhmYjFmOworICB0LmFmaWk1NzcxNiA9IDB4MDVmMDsKKyAgdC5hZmlpNTc3MTcgPSAweDA1ZjE7CisgIHQuYWZpaTU3NzE4ID0gMHgwNWYyOworICB0LmFmaWk1NzcyMyA9IDB4ZmIzNTsKKyAgdC5hZmlpNTc3OTMgPSAweDA1YjQ7CisgIHQuYWZpaTU3Nzk0ID0gMHgwNWI1OworICB0LmFmaWk1Nzc5NSA9IDB4MDViNjsKKyAgdC5hZmlpNTc3OTYgPSAweDA1YmI7CisgIHQuYWZpaTU3Nzk3ID0gMHgwNWI4OworICB0LmFmaWk1Nzc5OCA9IDB4MDViNzsKKyAgdC5hZmlpNTc3OTkgPSAweDA1YjA7CisgIHQuYWZpaTU3ODAwID0gMHgwNWIyOworICB0LmFmaWk1NzgwMSA9IDB4MDViMTsKKyAgdC5hZmlpNTc4MDIgPSAweDA1YjM7CisgIHQuYWZpaTU3ODAzID0gMHgwNWMyOworICB0LmFmaWk1NzgwNCA9IDB4MDVjMTsKKyAgdC5hZmlpNTc4MDYgPSAweDA1Yjk7CisgIHQuYWZpaTU3ODA3ID0gMHgwNWJjOworICB0LmFmaWk1NzgzOSA9IDB4MDViZDsKKyAgdC5hZmlpNTc4NDEgPSAweDA1YmY7CisgIHQuYWZpaTU3ODQyID0gMHgwNWMwOworICB0LmFmaWk1NzkyOSA9IDB4MDJiYzsKKyAgdC5hZmlpNjEyNDggPSAweDIxMDU7CisgIHQuYWZpaTYxMjg5ID0gMHgyMTEzOworICB0LmFmaWk2MTM1MiA9IDB4MjExNjsKKyAgdC5hZmlpNjE1NzMgPSAweDIwMmM7CisgIHQuYWZpaTYxNTc0ID0gMHgyMDJkOworICB0LmFmaWk2MTU3NSA9IDB4MjAyZTsKKyAgdC5hZmlpNjE2NjQgPSAweDIwMGM7CisgIHQuYWZpaTYzMTY3ID0gMHgwNjZkOworICB0LmFmaWk2NDkzNyA9IDB4MDJiZDsKKyAgdC5hZ3JhdmUgPSAweDAwZTA7CisgIHQuYWd1amFyYXRpID0gMHgwYTg1OworICB0LmFndXJtdWtoaSA9IDB4MGEwNTsKKyAgdC5haGlyYWdhbmEgPSAweDMwNDI7CisgIHQuYWhvb2thYm92ZSA9IDB4MWVhMzsKKyAgdC5haWJlbmdhbGkgPSAweDA5OTA7CisgIHQuYWlib3BvbW9mbyA9IDB4MzExZTsKKyAgdC5haWRldmEgPSAweDA5MTA7CisgIHQuYWllY3lyaWxsaWMgPSAweDA0ZDU7CisgIHQuYWlndWphcmF0aSA9IDB4MGE5MDsKKyAgdC5haWd1cm11a2hpID0gMHgwYTEwOworICB0LmFpbWF0cmFndXJtdWtoaSA9IDB4MGE0ODsKKyAgdC5haW5hcmFiaWMgPSAweDA2Mzk7CisgIHQuYWluZmluYWxhcmFiaWMgPSAweGZlY2E7CisgIHQuYWluaW5pdGlhbGFyYWJpYyA9IDB4ZmVjYjsKKyAgdC5haW5tZWRpYWxhcmFiaWMgPSAweGZlY2M7CisgIHQuYWludmVydGVkYnJldmUgPSAweDAyMDM7CisgIHQuYWl2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWM4OworICB0LmFpdm93ZWxzaWduZGV2YSA9IDB4MDk0ODsKKyAgdC5haXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM4OworICB0LmFrYXRha2FuYSA9IDB4MzBhMjsKKyAgdC5ha2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzE7CisgIHQuYWtvcmVhbiA9IDB4MzE0ZjsKKyAgdC5hbGVmID0gMHgwNWQwOworICB0LmFsZWZhcmFiaWMgPSAweDA2Mjc7CisgIHQuYWxlZmRhZ2VzaGhlYnJldyA9IDB4ZmIzMDsKKyAgdC5hbGVmZmluYWxhcmFiaWMgPSAweGZlOGU7CisgIHQuYWxlZmhhbXphYWJvdmVhcmFiaWMgPSAweDA2MjM7CisgIHQuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NDsKKyAgdC5hbGVmaGFtemFiZWxvd2FyYWJpYyA9IDB4MDYyNTsKKyAgdC5hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljID0gMHhmZTg4OworICB0LmFsZWZoZWJyZXcgPSAweDA1ZDA7CisgIHQuYWxlZmxhbWVkaGVicmV3ID0gMHhmYjRmOworICB0LmFsZWZtYWRkYWFib3ZlYXJhYmljID0gMHgwNjIyOworICB0LmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODI7CisgIHQuYWxlZm1ha3N1cmFhcmFiaWMgPSAweDA2NDk7CisgIHQuYWxlZm1ha3N1cmFmaW5hbGFyYWJpYyA9IDB4ZmVmMDsKKyAgdC5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWMgPSAweGZlZjM7CisgIHQuYWxlZm1ha3N1cmFtZWRpYWxhcmFiaWMgPSAweGZlZjQ7CisgIHQuYWxlZnBhdGFoaGVicmV3ID0gMHhmYjJlOworICB0LmFsZWZxYW1hdHNoZWJyZXcgPSAweGZiMmY7CisgIHQuYWxlcGggPSAweDIxMzU7CisgIHQuYWxsZXF1YWwgPSAweDIyNGM7CisgIHQuYWxwaGEgPSAweDAzYjE7CisgIHQuYWxwaGF0b25vcyA9IDB4MDNhYzsKKyAgdC5hbWFjcm9uID0gMHgwMTAxOworICB0LmFtb25vc3BhY2UgPSAweGZmNDE7CisgIHQuYW1wZXJzYW5kID0gMHgwMDI2OworICB0LmFtcGVyc2FuZG1vbm9zcGFjZSA9IDB4ZmYwNjsKKyAgdC5hbXBlcnNhbmRzbWFsbCA9IDB4ZjcyNjsKKyAgdC5hbXNxdWFyZSA9IDB4MzNjMjsKKyAgdC5hbmJvcG9tb2ZvID0gMHgzMTIyOworICB0LmFuZ2JvcG9tb2ZvID0gMHgzMTI0OworICB0LmFuZ2JyYWNrZXRsZWZ0ID0gMHgzMDA4OworICB0LmFuZ2JyYWNrZXRyaWdodCA9IDB4MzAwOTsKKyAgdC5hbmdraGFua2h1dGhhaSA9IDB4MGU1YTsKKyAgdC5hbmdsZSA9IDB4MjIyMDsKKyAgdC5hbmdsZWJyYWNrZXRsZWZ0ID0gMHgzMDA4OworICB0LmFuZ2xlYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzZjsKKyAgdC5hbmdsZWJyYWNrZXRyaWdodCA9IDB4MzAwOTsKKyAgdC5hbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQwOworICB0LmFuZ2xlbGVmdCA9IDB4MjMyOTsKKyAgdC5hbmdsZXJpZ2h0ID0gMHgyMzJhOworICB0LmFuZ3N0cm9tID0gMHgyMTJiOworICB0LmFub3RlbGVpYSA9IDB4MDM4NzsKKyAgdC5hbnVkYXR0YWRldmEgPSAweDA5NTI7CisgIHQuYW51c3ZhcmFiZW5nYWxpID0gMHgwOTgyOworICB0LmFudXN2YXJhZGV2YSA9IDB4MDkwMjsKKyAgdC5hbnVzdmFyYWd1amFyYXRpID0gMHgwYTgyOworICB0LmFvZ29uZWsgPSAweDAxMDU7CisgIHQuYXBhYXRvc3F1YXJlID0gMHgzMzAwOworICB0LmFwYXJlbiA9IDB4MjQ5YzsKKyAgdC5hcG9zdHJvcGhlYXJtZW5pYW4gPSAweDA1NWE7CisgIHQuYXBvc3Ryb3BoZW1vZCA9IDB4MDJiYzsKKyAgdC5hcHBsZSA9IDB4ZjhmZjsKKyAgdC5hcHByb2FjaGVzID0gMHgyMjUwOworICB0LmFwcHJveGVxdWFsID0gMHgyMjQ4OworICB0LmFwcHJveGVxdWFsb3JpbWFnZSA9IDB4MjI1MjsKKyAgdC5hcHByb3hpbWF0ZWx5ZXF1YWwgPSAweDIyNDU7CisgIHQuYXJhZWFla29yZWFuID0gMHgzMThlOworICB0LmFyYWVha29yZWFuID0gMHgzMThkOworICB0LmFyYyA9IDB4MjMxMjsKKyAgdC5hcmlnaHRoYWxmcmluZyA9IDB4MWU5YTsKKyAgdC5hcmluZyA9IDB4MDBlNTsKKyAgdC5hcmluZ2FjdXRlID0gMHgwMWZiOworICB0LmFyaW5nYmVsb3cgPSAweDFlMDE7CisgIHQuYXJyb3dib3RoID0gMHgyMTk0OworICB0LmFycm93ZGFzaGRvd24gPSAweDIxZTM7CisgIHQuYXJyb3dkYXNobGVmdCA9IDB4MjFlMDsKKyAgdC5hcnJvd2Rhc2hyaWdodCA9IDB4MjFlMjsKKyAgdC5hcnJvd2Rhc2h1cCA9IDB4MjFlMTsKKyAgdC5hcnJvd2RibGJvdGggPSAweDIxZDQ7CisgIHQuYXJyb3dkYmxkb3duID0gMHgyMWQzOworICB0LmFycm93ZGJsbGVmdCA9IDB4MjFkMDsKKyAgdC5hcnJvd2RibHJpZ2h0ID0gMHgyMWQyOworICB0LmFycm93ZGJsdXAgPSAweDIxZDE7CisgIHQuYXJyb3dkb3duID0gMHgyMTkzOworICB0LmFycm93ZG93bmxlZnQgPSAweDIxOTk7CisgIHQuYXJyb3dkb3ducmlnaHQgPSAweDIxOTg7CisgIHQuYXJyb3dkb3dud2hpdGUgPSAweDIxZTk7CisgIHQuYXJyb3doZWFkZG93bm1vZCA9IDB4MDJjNTsKKyAgdC5hcnJvd2hlYWRsZWZ0bW9kID0gMHgwMmMyOworICB0LmFycm93aGVhZHJpZ2h0bW9kID0gMHgwMmMzOworICB0LmFycm93aGVhZHVwbW9kID0gMHgwMmM0OworICB0LmFycm93aG9yaXpleCA9IDB4ZjhlNzsKKyAgdC5hcnJvd2xlZnQgPSAweDIxOTA7CisgIHQuYXJyb3dsZWZ0ZGJsID0gMHgyMWQwOworICB0LmFycm93bGVmdGRibHN0cm9rZSA9IDB4MjFjZDsKKyAgdC5hcnJvd2xlZnRvdmVycmlnaHQgPSAweDIxYzY7CisgIHQuYXJyb3dsZWZ0d2hpdGUgPSAweDIxZTY7CisgIHQuYXJyb3dyaWdodCA9IDB4MjE5MjsKKyAgdC5hcnJvd3JpZ2h0ZGJsc3Ryb2tlID0gMHgyMWNmOworICB0LmFycm93cmlnaHRoZWF2eSA9IDB4Mjc5ZTsKKyAgdC5hcnJvd3JpZ2h0b3ZlcmxlZnQgPSAweDIxYzQ7CisgIHQuYXJyb3dyaWdodHdoaXRlID0gMHgyMWU4OworICB0LmFycm93dGFibGVmdCA9IDB4MjFlNDsKKyAgdC5hcnJvd3RhYnJpZ2h0ID0gMHgyMWU1OworICB0LmFycm93dXAgPSAweDIxOTE7CisgIHQuYXJyb3d1cGRuID0gMHgyMTk1OworICB0LmFycm93dXBkbmJzZSA9IDB4MjFhODsKKyAgdC5hcnJvd3VwZG93bmJhc2UgPSAweDIxYTg7CisgIHQuYXJyb3d1cGxlZnQgPSAweDIxOTY7CisgIHQuYXJyb3d1cGxlZnRvZmRvd24gPSAweDIxYzU7CisgIHQuYXJyb3d1cHJpZ2h0ID0gMHgyMTk3OworICB0LmFycm93dXB3aGl0ZSA9IDB4MjFlNzsKKyAgdC5hcnJvd3ZlcnRleCA9IDB4ZjhlNjsKKyAgdC5hc2NpaWNpcmN1bSA9IDB4MDA1ZTsKKyAgdC5hc2NpaWNpcmN1bW1vbm9zcGFjZSA9IDB4ZmYzZTsKKyAgdC5hc2NpaXRpbGRlID0gMHgwMDdlOworICB0LmFzY2lpdGlsZGVtb25vc3BhY2UgPSAweGZmNWU7CisgIHQuYXNjcmlwdCA9IDB4MDI1MTsKKyAgdC5hc2NyaXB0dHVybmVkID0gMHgwMjUyOworICB0LmFzbWFsbGhpcmFnYW5hID0gMHgzMDQxOworICB0LmFzbWFsbGthdGFrYW5hID0gMHgzMGExOworICB0LmFzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY3OworICB0LmFzdGVyaXNrID0gMHgwMDJhOworICB0LmFzdGVyaXNrYWx0b25lYXJhYmljID0gMHgwNjZkOworICB0LmFzdGVyaXNrYXJhYmljID0gMHgwNjZkOworICB0LmFzdGVyaXNrbWF0aCA9IDB4MjIxNzsKKyAgdC5hc3Rlcmlza21vbm9zcGFjZSA9IDB4ZmYwYTsKKyAgdC5hc3Rlcmlza3NtYWxsID0gMHhmZTYxOworICB0LmFzdGVyaXNtID0gMHgyMDQyOworICB0LmFzdXBlcmlvciA9IDB4ZjZlOTsKKyAgdC5hc3ltcHRvdGljYWxseWVxdWFsID0gMHgyMjQzOworICB0LmF0ID0gMHgwMDQwOworICB0LmF0aWxkZSA9IDB4MDBlMzsKKyAgdC5hdG1vbm9zcGFjZSA9IDB4ZmYyMDsKKyAgdC5hdHNtYWxsID0gMHhmZTZiOworICB0LmF0dXJuZWQgPSAweDAyNTA7CisgIHQuYXViZW5nYWxpID0gMHgwOTk0OworICB0LmF1Ym9wb21vZm8gPSAweDMxMjA7CisgIHQuYXVkZXZhID0gMHgwOTE0OworICB0LmF1Z3VqYXJhdGkgPSAweDBhOTQ7CisgIHQuYXVndXJtdWtoaSA9IDB4MGExNDsKKyAgdC5hdWxlbmd0aG1hcmtiZW5nYWxpID0gMHgwOWQ3OworICB0LmF1bWF0cmFndXJtdWtoaSA9IDB4MGE0YzsKKyAgdC5hdXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Y2M7CisgIHQuYXV2b3dlbHNpZ25kZXZhID0gMHgwOTRjOworICB0LmF1dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhY2M7CisgIHQuYXZhZ3JhaGFkZXZhID0gMHgwOTNkOworICB0LmF5YmFybWVuaWFuID0gMHgwNTYxOworICB0LmF5aW4gPSAweDA1ZTI7CisgIHQuYXlpbmFsdG9uZWhlYnJldyA9IDB4ZmIyMDsKKyAgdC5heWluaGVicmV3ID0gMHgwNWUyOworICB0LmIgPSAweDAwNjI7CisgIHQuYmFiZW5nYWxpID0gMHgwOWFjOworICB0LmJhY2tzbGFzaCA9IDB4MDA1YzsKKyAgdC5iYWNrc2xhc2htb25vc3BhY2UgPSAweGZmM2M7CisgIHQuYmFkZXZhID0gMHgwOTJjOworICB0LmJhZ3VqYXJhdGkgPSAweDBhYWM7CisgIHQuYmFndXJtdWtoaSA9IDB4MGEyYzsKKyAgdC5iYWhpcmFnYW5hID0gMHgzMDcwOworICB0LmJhaHR0aGFpID0gMHgwZTNmOworICB0LmJha2F0YWthbmEgPSAweDMwZDA7CisgIHQuYmFyID0gMHgwMDdjOworICB0LmJhcm1vbm9zcGFjZSA9IDB4ZmY1YzsKKyAgdC5iYm9wb21vZm8gPSAweDMxMDU7CisgIHQuYmNpcmNsZSA9IDB4MjRkMTsKKyAgdC5iZG90YWNjZW50ID0gMHgxZTAzOworICB0LmJkb3RiZWxvdyA9IDB4MWUwNTsKKyAgdC5iZWFtZWRzaXh0ZWVudGhub3RlcyA9IDB4MjY2YzsKKyAgdC5iZWNhdXNlID0gMHgyMjM1OworICB0LmJlY3lyaWxsaWMgPSAweDA0MzE7CisgIHQuYmVoYXJhYmljID0gMHgwNjI4OworICB0LmJlaGZpbmFsYXJhYmljID0gMHhmZTkwOworICB0LmJlaGluaXRpYWxhcmFiaWMgPSAweGZlOTE7CisgIHQuYmVoaXJhZ2FuYSA9IDB4MzA3OTsKKyAgdC5iZWhtZWRpYWxhcmFiaWMgPSAweGZlOTI7CisgIHQuYmVobWVlbWluaXRpYWxhcmFiaWMgPSAweGZjOWY7CisgIHQuYmVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzA4OworICB0LmJlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM2ZDsKKyAgdC5iZWthdGFrYW5hID0gMHgzMGQ5OworICB0LmJlbmFybWVuaWFuID0gMHgwNTYyOworICB0LmJldCA9IDB4MDVkMTsKKyAgdC5iZXRhID0gMHgwM2IyOworICB0LmJldGFzeW1ib2xncmVlayA9IDB4MDNkMDsKKyAgdC5iZXRkYWdlc2ggPSAweGZiMzE7CisgIHQuYmV0ZGFnZXNoaGVicmV3ID0gMHhmYjMxOworICB0LmJldGhlYnJldyA9IDB4MDVkMTsKKyAgdC5iZXRyYWZlaGVicmV3ID0gMHhmYjRjOworICB0LmJoYWJlbmdhbGkgPSAweDA5YWQ7CisgIHQuYmhhZGV2YSA9IDB4MDkyZDsKKyAgdC5iaGFndWphcmF0aSA9IDB4MGFhZDsKKyAgdC5iaGFndXJtdWtoaSA9IDB4MGEyZDsKKyAgdC5iaG9vayA9IDB4MDI1MzsKKyAgdC5iaWhpcmFnYW5hID0gMHgzMDczOworICB0LmJpa2F0YWthbmEgPSAweDMwZDM7CisgIHQuYmlsYWJpYWxjbGljayA9IDB4MDI5ODsKKyAgdC5iaW5kaWd1cm11a2hpID0gMHgwYTAyOworICB0LmJpcnVzcXVhcmUgPSAweDMzMzE7CisgIHQuYmxhY2tjaXJjbGUgPSAweDI1Y2Y7CisgIHQuYmxhY2tkaWFtb25kID0gMHgyNWM2OworICB0LmJsYWNrZG93bnBvaW50aW5ndHJpYW5nbGUgPSAweDI1YmM7CisgIHQuYmxhY2tsZWZ0cG9pbnRpbmdwb2ludGVyID0gMHgyNWM0OworICB0LmJsYWNrbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzA7CisgIHQuYmxhY2tsZW50aWN1bGFyYnJhY2tldGxlZnQgPSAweDMwMTA7CisgIHQuYmxhY2tsZW50aWN1bGFyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzYjsKKyAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTE7CisgIHQuYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2M7CisgIHQuYmxhY2tsb3dlcmxlZnR0cmlhbmdsZSA9IDB4MjVlMzsKKyAgdC5ibGFja2xvd2VycmlnaHR0cmlhbmdsZSA9IDB4MjVlMjsKKyAgdC5ibGFja3JlY3RhbmdsZSA9IDB4MjVhYzsKKyAgdC5ibGFja3JpZ2h0cG9pbnRpbmdwb2ludGVyID0gMHgyNWJhOworICB0LmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI2OworICB0LmJsYWNrc21hbGxzcXVhcmUgPSAweDI1YWE7CisgIHQuYmxhY2tzbWlsaW5nZmFjZSA9IDB4MjYzYjsKKyAgdC5ibGFja3NxdWFyZSA9IDB4MjVhMDsKKyAgdC5ibGFja3N0YXIgPSAweDI2MDU7CisgIHQuYmxhY2t1cHBlcmxlZnR0cmlhbmdsZSA9IDB4MjVlNDsKKyAgdC5ibGFja3VwcGVycmlnaHR0cmlhbmdsZSA9IDB4MjVlNTsKKyAgdC5ibGFja3VwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWI0OworICB0LmJsYWNrdXBwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWIyOworICB0LmJsYW5rID0gMHgyNDIzOworICB0LmJsaW5lYmVsb3cgPSAweDFlMDc7CisgIHQuYmxvY2sgPSAweDI1ODg7CisgIHQuYm1vbm9zcGFjZSA9IDB4ZmY0MjsKKyAgdC5ib2JhaW1haXRoYWkgPSAweDBlMWE7CisgIHQuYm9oaXJhZ2FuYSA9IDB4MzA3YzsKKyAgdC5ib2thdGFrYW5hID0gMHgzMGRjOworICB0LmJwYXJlbiA9IDB4MjQ5ZDsKKyAgdC5icXNxdWFyZSA9IDB4MzNjMzsKKyAgdC5icmFjZWV4ID0gMHhmOGY0OworICB0LmJyYWNlbGVmdCA9IDB4MDA3YjsKKyAgdC5icmFjZWxlZnRidCA9IDB4ZjhmMzsKKyAgdC5icmFjZWxlZnRtaWQgPSAweGY4ZjI7CisgIHQuYnJhY2VsZWZ0bW9ub3NwYWNlID0gMHhmZjViOworICB0LmJyYWNlbGVmdHNtYWxsID0gMHhmZTViOworICB0LmJyYWNlbGVmdHRwID0gMHhmOGYxOworICB0LmJyYWNlbGVmdHZlcnRpY2FsID0gMHhmZTM3OworICB0LmJyYWNlcmlnaHQgPSAweDAwN2Q7CisgIHQuYnJhY2VyaWdodGJ0ID0gMHhmOGZlOworICB0LmJyYWNlcmlnaHRtaWQgPSAweGY4ZmQ7CisgIHQuYnJhY2VyaWdodG1vbm9zcGFjZSA9IDB4ZmY1ZDsKKyAgdC5icmFjZXJpZ2h0c21hbGwgPSAweGZlNWM7CisgIHQuYnJhY2VyaWdodHRwID0gMHhmOGZjOworICB0LmJyYWNlcmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzODsKKyAgdC5icmFja2V0bGVmdCA9IDB4MDA1YjsKKyAgdC5icmFja2V0bGVmdGJ0ID0gMHhmOGYwOworICB0LmJyYWNrZXRsZWZ0ZXggPSAweGY4ZWY7CisgIHQuYnJhY2tldGxlZnRtb25vc3BhY2UgPSAweGZmM2I7CisgIHQuYnJhY2tldGxlZnR0cCA9IDB4ZjhlZTsKKyAgdC5icmFja2V0cmlnaHQgPSAweDAwNWQ7CisgIHQuYnJhY2tldHJpZ2h0YnQgPSAweGY4ZmI7CisgIHQuYnJhY2tldHJpZ2h0ZXggPSAweGY4ZmE7CisgIHQuYnJhY2tldHJpZ2h0bW9ub3NwYWNlID0gMHhmZjNkOworICB0LmJyYWNrZXRyaWdodHRwID0gMHhmOGY5OworICB0LmJyZXZlID0gMHgwMmQ4OworICB0LmJyZXZlYmVsb3djbWIgPSAweDAzMmU7CisgIHQuYnJldmVjbWIgPSAweDAzMDY7CisgIHQuYnJldmVpbnZlcnRlZGJlbG93Y21iID0gMHgwMzJmOworICB0LmJyZXZlaW52ZXJ0ZWRjbWIgPSAweDAzMTE7CisgIHQuYnJldmVpbnZlcnRlZGRvdWJsZWNtYiA9IDB4MDM2MTsKKyAgdC5icmlkZ2ViZWxvd2NtYiA9IDB4MDMyYTsKKyAgdC5icmlkZ2VpbnZlcnRlZGJlbG93Y21iID0gMHgwMzNhOworICB0LmJyb2tlbmJhciA9IDB4MDBhNjsKKyAgdC5ic3Ryb2tlID0gMHgwMTgwOworICB0LmJzdXBlcmlvciA9IDB4ZjZlYTsKKyAgdC5idG9wYmFyID0gMHgwMTgzOworICB0LmJ1aGlyYWdhbmEgPSAweDMwNzY7CisgIHQuYnVrYXRha2FuYSA9IDB4MzBkNjsKKyAgdC5idWxsZXQgPSAweDIwMjI7CisgIHQuYnVsbGV0aW52ZXJzZSA9IDB4MjVkODsKKyAgdC5idWxsZXRvcGVyYXRvciA9IDB4MjIxOTsKKyAgdC5idWxsc2V5ZSA9IDB4MjVjZTsKKyAgdC5jID0gMHgwMDYzOworICB0LmNhYXJtZW5pYW4gPSAweDA1NmU7CisgIHQuY2FiZW5nYWxpID0gMHgwOTlhOworICB0LmNhY3V0ZSA9IDB4MDEwNzsKKyAgdC5jYWRldmEgPSAweDA5MWE7CisgIHQuY2FndWphcmF0aSA9IDB4MGE5YTsKKyAgdC5jYWd1cm11a2hpID0gMHgwYTFhOworICB0LmNhbHNxdWFyZSA9IDB4MzM4ODsKKyAgdC5jYW5kcmFiaW5kdWJlbmdhbGkgPSAweDA5ODE7CisgIHQuY2FuZHJhYmluZHVjbWIgPSAweDAzMTA7CisgIHQuY2FuZHJhYmluZHVkZXZhID0gMHgwOTAxOworICB0LmNhbmRyYWJpbmR1Z3VqYXJhdGkgPSAweDBhODE7CisgIHQuY2Fwc2xvY2sgPSAweDIxZWE7CisgIHQuY2FyZW9mID0gMHgyMTA1OworICB0LmNhcm9uID0gMHgwMmM3OworICB0LmNhcm9uYmVsb3djbWIgPSAweDAzMmM7CisgIHQuY2Fyb25jbWIgPSAweDAzMGM7CisgIHQuY2FycmlhZ2VyZXR1cm4gPSAweDIxYjU7CisgIHQuY2JvcG9tb2ZvID0gMHgzMTE4OworICB0LmNjYXJvbiA9IDB4MDEwZDsKKyAgdC5jY2VkaWxsYSA9IDB4MDBlNzsKKyAgdC5jY2VkaWxsYWFjdXRlID0gMHgxZTA5OworICB0LmNjaXJjbGUgPSAweDI0ZDI7CisgIHQuY2NpcmN1bWZsZXggPSAweDAxMDk7CisgIHQuY2N1cmwgPSAweDAyNTU7CisgIHQuY2RvdCA9IDB4MDEwYjsKKyAgdC5jZG90YWNjZW50ID0gMHgwMTBiOworICB0LmNkc3F1YXJlID0gMHgzM2M1OworICB0LmNlZGlsbGEgPSAweDAwYjg7CisgIHQuY2VkaWxsYWNtYiA9IDB4MDMyNzsKKyAgdC5jZW50ID0gMHgwMGEyOworICB0LmNlbnRpZ3JhZGUgPSAweDIxMDM7CisgIHQuY2VudGluZmVyaW9yID0gMHhmNmRmOworICB0LmNlbnRtb25vc3BhY2UgPSAweGZmZTA7CisgIHQuY2VudG9sZHN0eWxlID0gMHhmN2EyOworICB0LmNlbnRzdXBlcmlvciA9IDB4ZjZlMDsKKyAgdC5jaGFhcm1lbmlhbiA9IDB4MDU3OTsKKyAgdC5jaGFiZW5nYWxpID0gMHgwOTliOworICB0LmNoYWRldmEgPSAweDA5MWI7CisgIHQuY2hhZ3VqYXJhdGkgPSAweDBhOWI7CisgIHQuY2hhZ3VybXVraGkgPSAweDBhMWI7CisgIHQuY2hib3BvbW9mbyA9IDB4MzExNDsKKyAgdC5jaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZDsKKyAgdC5jaGVja21hcmsgPSAweDI3MTM7CisgIHQuY2hlY3lyaWxsaWMgPSAweDA0NDc7CisgIHQuY2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmY7CisgIHQuY2hlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0Yjc7CisgIHQuY2hlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmNTsKKyAgdC5jaGVoYXJtZW5pYW4gPSAweDA1NzM7CisgIHQuY2hla2hha2Fzc2lhbmN5cmlsbGljID0gMHgwNGNjOworICB0LmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0Yjk7CisgIHQuY2hpID0gMHgwM2M3OworICB0LmNoaWV1Y2hhY2lyY2xla29yZWFuID0gMHgzMjc3OworICB0LmNoaWV1Y2hhcGFyZW5rb3JlYW4gPSAweDMyMTc7CisgIHQuY2hpZXVjaGNpcmNsZWtvcmVhbiA9IDB4MzI2OTsKKyAgdC5jaGlldWNoa29yZWFuID0gMHgzMTRhOworICB0LmNoaWV1Y2hwYXJlbmtvcmVhbiA9IDB4MzIwOTsKKyAgdC5jaG9jaGFuZ3RoYWkgPSAweDBlMGE7CisgIHQuY2hvY2hhbnRoYWkgPSAweDBlMDg7CisgIHQuY2hvY2hpbmd0aGFpID0gMHgwZTA5OworICB0LmNob2Nob2V0aGFpID0gMHgwZTBjOworICB0LmNob29rID0gMHgwMTg4OworICB0LmNpZXVjYWNpcmNsZWtvcmVhbiA9IDB4MzI3NjsKKyAgdC5jaWV1Y2FwYXJlbmtvcmVhbiA9IDB4MzIxNjsKKyAgdC5jaWV1Y2NpcmNsZWtvcmVhbiA9IDB4MzI2ODsKKyAgdC5jaWV1Y2tvcmVhbiA9IDB4MzE0ODsKKyAgdC5jaWV1Y3BhcmVua29yZWFuID0gMHgzMjA4OworICB0LmNpZXVjdXBhcmVua29yZWFuID0gMHgzMjFjOworICB0LmNpcmNsZSA9IDB4MjVjYjsKKyAgdC5jaXJjbGVjb3B5cnQgPSAweDAwYTk7CisgIHQuY2lyY2xlbXVsdGlwbHkgPSAweDIyOTc7CisgIHQuY2lyY2xlb3QgPSAweDIyOTk7CisgIHQuY2lyY2xlcGx1cyA9IDB4MjI5NTsKKyAgdC5jaXJjbGVwb3N0YWxtYXJrID0gMHgzMDM2OworICB0LmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrID0gMHgyNWQwOworICB0LmNpcmNsZXdpdGhyaWdodGhhbGZibGFjayA9IDB4MjVkMTsKKyAgdC5jaXJjdW1mbGV4ID0gMHgwMmM2OworICB0LmNpcmN1bWZsZXhiZWxvd2NtYiA9IDB4MDMyZDsKKyAgdC5jaXJjdW1mbGV4Y21iID0gMHgwMzAyOworICB0LmNsZWFyID0gMHgyMzI3OworICB0LmNsaWNrYWx2ZW9sYXIgPSAweDAxYzI7CisgIHQuY2xpY2tkZW50YWwgPSAweDAxYzA7CisgIHQuY2xpY2tsYXRlcmFsID0gMHgwMWMxOworICB0LmNsaWNrcmV0cm9mbGV4ID0gMHgwMWMzOworICB0LmNsdWIgPSAweDI2NjM7CisgIHQuY2x1YnN1aXRibGFjayA9IDB4MjY2MzsKKyAgdC5jbHVic3VpdHdoaXRlID0gMHgyNjY3OworICB0LmNtY3ViZWRzcXVhcmUgPSAweDMzYTQ7CisgIHQuY21vbm9zcGFjZSA9IDB4ZmY0MzsKKyAgdC5jbXNxdWFyZWRzcXVhcmUgPSAweDMzYTA7CisgIHQuY29hcm1lbmlhbiA9IDB4MDU4MTsKKyAgdC5jb2xvbiA9IDB4MDAzYTsKKyAgdC5jb2xvbm1vbmV0YXJ5ID0gMHgyMGExOworICB0LmNvbG9ubW9ub3NwYWNlID0gMHhmZjFhOworICB0LmNvbG9uc2lnbiA9IDB4MjBhMTsKKyAgdC5jb2xvbnNtYWxsID0gMHhmZTU1OworICB0LmNvbG9udHJpYW5ndWxhcmhhbGZtb2QgPSAweDAyZDE7CisgIHQuY29sb250cmlhbmd1bGFybW9kID0gMHgwMmQwOworICB0LmNvbW1hID0gMHgwMDJjOworICB0LmNvbW1hYWJvdmVjbWIgPSAweDAzMTM7CisgIHQuY29tbWFhYm92ZXJpZ2h0Y21iID0gMHgwMzE1OworICB0LmNvbW1hYWNjZW50ID0gMHhmNmMzOworICB0LmNvbW1hYXJhYmljID0gMHgwNjBjOworICB0LmNvbW1hYXJtZW5pYW4gPSAweDA1NWQ7CisgIHQuY29tbWFpbmZlcmlvciA9IDB4ZjZlMTsKKyAgdC5jb21tYW1vbm9zcGFjZSA9IDB4ZmYwYzsKKyAgdC5jb21tYXJldmVyc2VkYWJvdmVjbWIgPSAweDAzMTQ7CisgIHQuY29tbWFyZXZlcnNlZG1vZCA9IDB4MDJiZDsKKyAgdC5jb21tYXNtYWxsID0gMHhmZTUwOworICB0LmNvbW1hc3VwZXJpb3IgPSAweGY2ZTI7CisgIHQuY29tbWF0dXJuZWRhYm92ZWNtYiA9IDB4MDMxMjsKKyAgdC5jb21tYXR1cm5lZG1vZCA9IDB4MDJiYjsKKyAgdC5jb21wYXNzID0gMHgyNjNjOworICB0LmNvbmdydWVudCA9IDB4MjI0NTsKKyAgdC5jb250b3VyaW50ZWdyYWwgPSAweDIyMmU7CisgIHQuY29udHJvbCA9IDB4MjMwMzsKKyAgdC5jb250cm9sQUNLID0gMHgwMDA2OworICB0LmNvbnRyb2xCRUwgPSAweDAwMDc7CisgIHQuY29udHJvbEJTID0gMHgwMDA4OworICB0LmNvbnRyb2xDQU4gPSAweDAwMTg7CisgIHQuY29udHJvbENSID0gMHgwMDBkOworICB0LmNvbnRyb2xEQzEgPSAweDAwMTE7CisgIHQuY29udHJvbERDMiA9IDB4MDAxMjsKKyAgdC5jb250cm9sREMzID0gMHgwMDEzOworICB0LmNvbnRyb2xEQzQgPSAweDAwMTQ7CisgIHQuY29udHJvbERFTCA9IDB4MDA3ZjsKKyAgdC5jb250cm9sRExFID0gMHgwMDEwOworICB0LmNvbnRyb2xFTSA9IDB4MDAxOTsKKyAgdC5jb250cm9sRU5RID0gMHgwMDA1OworICB0LmNvbnRyb2xFT1QgPSAweDAwMDQ7CisgIHQuY29udHJvbEVTQyA9IDB4MDAxYjsKKyAgdC5jb250cm9sRVRCID0gMHgwMDE3OworICB0LmNvbnRyb2xFVFggPSAweDAwMDM7CisgIHQuY29udHJvbEZGID0gMHgwMDBjOworICB0LmNvbnRyb2xGUyA9IDB4MDAxYzsKKyAgdC5jb250cm9sR1MgPSAweDAwMWQ7CisgIHQuY29udHJvbEhUID0gMHgwMDA5OworICB0LmNvbnRyb2xMRiA9IDB4MDAwYTsKKyAgdC5jb250cm9sTkFLID0gMHgwMDE1OworICB0LmNvbnRyb2xOVUxMID0gMHgwMDAwOworICB0LmNvbnRyb2xSUyA9IDB4MDAxZTsKKyAgdC5jb250cm9sU0kgPSAweDAwMGY7CisgIHQuY29udHJvbFNPID0gMHgwMDBlOworICB0LmNvbnRyb2xTT1QgPSAweDAwMDI7CisgIHQuY29udHJvbFNUWCA9IDB4MDAwMTsKKyAgdC5jb250cm9sU1VCID0gMHgwMDFhOworICB0LmNvbnRyb2xTWU4gPSAweDAwMTY7CisgIHQuY29udHJvbFVTID0gMHgwMDFmOworICB0LmNvbnRyb2xWVCA9IDB4MDAwYjsKKyAgdC5jb3B5cmlnaHQgPSAweDAwYTk7CisgIHQuY29weXJpZ2h0c2FucyA9IDB4ZjhlOTsKKyAgdC5jb3B5cmlnaHRzZXJpZiA9IDB4ZjZkOTsKKyAgdC5jb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwYzsKKyAgdC5jb3JuZXJicmFja2V0bGVmdGhhbGZ3aWR0aCA9IDB4ZmY2MjsKKyAgdC5jb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTQxOworICB0LmNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZDsKKyAgdC5jb3JuZXJicmFja2V0cmlnaHRoYWxmd2lkdGggPSAweGZmNjM7CisgIHQuY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlNDI7CisgIHQuY29ycG9yYXRpb25zcXVhcmUgPSAweDMzN2Y7CisgIHQuY29zcXVhcmUgPSAweDMzYzc7CisgIHQuY292ZXJrZ3NxdWFyZSA9IDB4MzNjNjsKKyAgdC5jcGFyZW4gPSAweDI0OWU7CisgIHQuY3J1emVpcm8gPSAweDIwYTI7CisgIHQuY3N0cmV0Y2hlZCA9IDB4MDI5NzsKKyAgdC5jdXJseWFuZCA9IDB4MjJjZjsKKyAgdC5jdXJseW9yID0gMHgyMmNlOworICB0LmN1cnJlbmN5ID0gMHgwMGE0OworICB0LmN5ckJyZXZlID0gMHhmNmQxOworICB0LmN5ckZsZXggPSAweGY2ZDI7CisgIHQuY3lyYnJldmUgPSAweGY2ZDQ7CisgIHQuY3lyZmxleCA9IDB4ZjZkNTsKKyAgdC5kID0gMHgwMDY0OworICB0LmRhYXJtZW5pYW4gPSAweDA1NjQ7CisgIHQuZGFiZW5nYWxpID0gMHgwOWE2OworICB0LmRhZGFyYWJpYyA9IDB4MDYzNjsKKyAgdC5kYWRldmEgPSAweDA5MjY7CisgIHQuZGFkZmluYWxhcmFiaWMgPSAweGZlYmU7CisgIHQuZGFkaW5pdGlhbGFyYWJpYyA9IDB4ZmViZjsKKyAgdC5kYWRtZWRpYWxhcmFiaWMgPSAweGZlYzA7CisgIHQuZGFnZXNoID0gMHgwNWJjOworICB0LmRhZ2VzaGhlYnJldyA9IDB4MDViYzsKKyAgdC5kYWdnZXIgPSAweDIwMjA7CisgIHQuZGFnZ2VyZGJsID0gMHgyMDIxOworICB0LmRhZ3VqYXJhdGkgPSAweDBhYTY7CisgIHQuZGFndXJtdWtoaSA9IDB4MGEyNjsKKyAgdC5kYWhpcmFnYW5hID0gMHgzMDYwOworICB0LmRha2F0YWthbmEgPSAweDMwYzA7CisgIHQuZGFsYXJhYmljID0gMHgwNjJmOworICB0LmRhbGV0ID0gMHgwNWQzOworICB0LmRhbGV0ZGFnZXNoID0gMHhmYjMzOworICB0LmRhbGV0ZGFnZXNoaGVicmV3ID0gMHhmYjMzOworICB0LmRhbGV0aGVicmV3ID0gMHgwNWQzOworICB0LmRhbGZpbmFsYXJhYmljID0gMHhmZWFhOworICB0LmRhbW1hYXJhYmljID0gMHgwNjRmOworICB0LmRhbW1hbG93YXJhYmljID0gMHgwNjRmOworICB0LmRhbW1hdGFuYWx0b25lYXJhYmljID0gMHgwNjRjOworICB0LmRhbW1hdGFuYXJhYmljID0gMHgwNjRjOworICB0LmRhbmRhID0gMHgwOTY0OworICB0LmRhcmdhaGVicmV3ID0gMHgwNWE3OworICB0LmRhcmdhbGVmdGhlYnJldyA9IDB4MDVhNzsKKyAgdC5kYXNpYXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODU7CisgIHQuZGJsR3JhdmUgPSAweGY2ZDM7CisgIHQuZGJsYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwYTsKKyAgdC5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Q7CisgIHQuZGJsYW5nbGVicmFja2V0cmlnaHQgPSAweDMwMGI7CisgIHQuZGJsYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzZTsKKyAgdC5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyYjsKKyAgdC5kYmxhcnJvd2xlZnQgPSAweDIxZDQ7CisgIHQuZGJsYXJyb3dyaWdodCA9IDB4MjFkMjsKKyAgdC5kYmxkYW5kYSA9IDB4MDk2NTsKKyAgdC5kYmxncmF2ZSA9IDB4ZjZkNjsKKyAgdC5kYmxncmF2ZWNtYiA9IDB4MDMwZjsKKyAgdC5kYmxpbnRlZ3JhbCA9IDB4MjIyYzsKKyAgdC5kYmxsb3dsaW5lID0gMHgyMDE3OworICB0LmRibGxvd2xpbmVjbWIgPSAweDAzMzM7CisgIHQuZGJsb3ZlcmxpbmVjbWIgPSAweDAzM2Y7CisgIHQuZGJscHJpbWVtb2QgPSAweDAyYmE7CisgIHQuZGJsdmVydGljYWxiYXIgPSAweDIwMTY7CisgIHQuZGJsdmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGU7CisgIHQuZGJvcG9tb2ZvID0gMHgzMTA5OworICB0LmRic3F1YXJlID0gMHgzM2M4OworICB0LmRjYXJvbiA9IDB4MDEwZjsKKyAgdC5kY2VkaWxsYSA9IDB4MWUxMTsKKyAgdC5kY2lyY2xlID0gMHgyNGQzOworICB0LmRjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTM7CisgIHQuZGNyb2F0ID0gMHgwMTExOworICB0LmRkYWJlbmdhbGkgPSAweDA5YTE7CisgIHQuZGRhZGV2YSA9IDB4MDkyMTsKKyAgdC5kZGFndWphcmF0aSA9IDB4MGFhMTsKKyAgdC5kZGFndXJtdWtoaSA9IDB4MGEyMTsKKyAgdC5kZGFsYXJhYmljID0gMHgwNjg4OworICB0LmRkYWxmaW5hbGFyYWJpYyA9IDB4ZmI4OTsKKyAgdC5kZGRoYWRldmEgPSAweDA5NWM7CisgIHQuZGRoYWJlbmdhbGkgPSAweDA5YTI7CisgIHQuZGRoYWRldmEgPSAweDA5MjI7CisgIHQuZGRoYWd1amFyYXRpID0gMHgwYWEyOworICB0LmRkaGFndXJtdWtoaSA9IDB4MGEyMjsKKyAgdC5kZG90YWNjZW50ID0gMHgxZTBiOworICB0LmRkb3RiZWxvdyA9IDB4MWUwZDsKKyAgdC5kZWNpbWFsc2VwYXJhdG9yYXJhYmljID0gMHgwNjZiOworICB0LmRlY2ltYWxzZXBhcmF0b3JwZXJzaWFuID0gMHgwNjZiOworICB0LmRlY3lyaWxsaWMgPSAweDA0MzQ7CisgIHQuZGVncmVlID0gMHgwMGIwOworICB0LmRlaGloZWJyZXcgPSAweDA1YWQ7CisgIHQuZGVoaXJhZ2FuYSA9IDB4MzA2NzsKKyAgdC5kZWljb3B0aWMgPSAweDAzZWY7CisgIHQuZGVrYXRha2FuYSA9IDB4MzBjNzsKKyAgdC5kZWxldGVsZWZ0ID0gMHgyMzJiOworICB0LmRlbGV0ZXJpZ2h0ID0gMHgyMzI2OworICB0LmRlbHRhID0gMHgwM2I0OworICB0LmRlbHRhdHVybmVkID0gMHgwMThkOworICB0LmRlbm9taW5hdG9ybWludXNvbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY4OworICB0LmRlemggPSAweDAyYTQ7CisgIHQuZGhhYmVuZ2FsaSA9IDB4MDlhNzsKKyAgdC5kaGFkZXZhID0gMHgwOTI3OworICB0LmRoYWd1amFyYXRpID0gMHgwYWE3OworICB0LmRoYWd1cm11a2hpID0gMHgwYTI3OworICB0LmRob29rID0gMHgwMjU3OworICB0LmRpYWx5dGlrYXRvbm9zID0gMHgwMzg1OworICB0LmRpYWx5dGlrYXRvbm9zY21iID0gMHgwMzQ0OworICB0LmRpYW1vbmQgPSAweDI2NjY7CisgIHQuZGlhbW9uZHN1aXR3aGl0ZSA9IDB4MjY2MjsKKyAgdC5kaWVyZXNpcyA9IDB4MDBhODsKKyAgdC5kaWVyZXNpc2FjdXRlID0gMHhmNmQ3OworICB0LmRpZXJlc2lzYmVsb3djbWIgPSAweDAzMjQ7CisgIHQuZGllcmVzaXNjbWIgPSAweDAzMDg7CisgIHQuZGllcmVzaXNncmF2ZSA9IDB4ZjZkODsKKyAgdC5kaWVyZXNpc3Rvbm9zID0gMHgwMzg1OworICB0LmRpaGlyYWdhbmEgPSAweDMwNjI7CisgIHQuZGlrYXRha2FuYSA9IDB4MzBjMjsKKyAgdC5kaXR0b21hcmsgPSAweDMwMDM7CisgIHQuZGl2aWRlID0gMHgwMGY3OworICB0LmRpdmlkZXMgPSAweDIyMjM7CisgIHQuZGl2aXNpb25zbGFzaCA9IDB4MjIxNTsKKyAgdC5kamVjeXJpbGxpYyA9IDB4MDQ1MjsKKyAgdC5ka3NoYWRlID0gMHgyNTkzOworICB0LmRsaW5lYmVsb3cgPSAweDFlMGY7CisgIHQuZGxzcXVhcmUgPSAweDMzOTc7CisgIHQuZG1hY3JvbiA9IDB4MDExMTsKKyAgdC5kbW9ub3NwYWNlID0gMHhmZjQ0OworICB0LmRuYmxvY2sgPSAweDI1ODQ7CisgIHQuZG9jaGFkYXRoYWkgPSAweDBlMGU7CisgIHQuZG9kZWt0aGFpID0gMHgwZTE0OworICB0LmRvaGlyYWdhbmEgPSAweDMwNjk7CisgIHQuZG9rYXRha2FuYSA9IDB4MzBjOTsKKyAgdC5kb2xsYXIgPSAweDAwMjQ7CisgIHQuZG9sbGFyaW5mZXJpb3IgPSAweGY2ZTM7CisgIHQuZG9sbGFybW9ub3NwYWNlID0gMHhmZjA0OworICB0LmRvbGxhcm9sZHN0eWxlID0gMHhmNzI0OworICB0LmRvbGxhcnNtYWxsID0gMHhmZTY5OworICB0LmRvbGxhcnN1cGVyaW9yID0gMHhmNmU0OworICB0LmRvbmcgPSAweDIwYWI7CisgIHQuZG9ydXNxdWFyZSA9IDB4MzMyNjsKKyAgdC5kb3RhY2NlbnQgPSAweDAyZDk7CisgIHQuZG90YWNjZW50Y21iID0gMHgwMzA3OworICB0LmRvdGJlbG93Y21iID0gMHgwMzIzOworICB0LmRvdGJlbG93Y29tYiA9IDB4MDMyMzsKKyAgdC5kb3RrYXRha2FuYSA9IDB4MzBmYjsKKyAgdC5kb3RsZXNzaSA9IDB4MDEzMTsKKyAgdC5kb3RsZXNzaiA9IDB4ZjZiZTsKKyAgdC5kb3RsZXNzanN0cm9rZWhvb2sgPSAweDAyODQ7CisgIHQuZG90bWF0aCA9IDB4MjJjNTsKKyAgdC5kb3R0ZWRjaXJjbGUgPSAweDI1Y2M7CisgIHQuZG91YmxleW9kcGF0YWggPSAweGZiMWY7CisgIHQuZG91YmxleW9kcGF0YWhoZWJyZXcgPSAweGZiMWY7CisgIHQuZG93bnRhY2tiZWxvd2NtYiA9IDB4MDMxZTsKKyAgdC5kb3dudGFja21vZCA9IDB4MDJkNTsKKyAgdC5kcGFyZW4gPSAweDI0OWY7CisgIHQuZHN1cGVyaW9yID0gMHhmNmViOworICB0LmR0YWlsID0gMHgwMjU2OworICB0LmR0b3BiYXIgPSAweDAxOGM7CisgIHQuZHVoaXJhZ2FuYSA9IDB4MzA2NTsKKyAgdC5kdWthdGFrYW5hID0gMHgzMGM1OworICB0LmR6ID0gMHgwMWYzOworICB0LmR6YWx0b25lID0gMHgwMmEzOworICB0LmR6Y2Fyb24gPSAweDAxYzY7CisgIHQuZHpjdXJsID0gMHgwMmE1OworICB0LmR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUxOworICB0LmR6ZWN5cmlsbGljID0gMHgwNDU1OworICB0LmR6aGVjeXJpbGxpYyA9IDB4MDQ1ZjsKKyAgdC5lID0gMHgwMDY1OworICB0LmVhY3V0ZSA9IDB4MDBlOTsKKyAgdC5lYXJ0aCA9IDB4MjY0MTsKKyAgdC5lYmVuZ2FsaSA9IDB4MDk4ZjsKKyAgdC5lYm9wb21vZm8gPSAweDMxMWM7CisgIHQuZWJyZXZlID0gMHgwMTE1OworICB0LmVjYW5kcmFkZXZhID0gMHgwOTBkOworICB0LmVjYW5kcmFndWphcmF0aSA9IDB4MGE4ZDsKKyAgdC5lY2FuZHJhdm93ZWxzaWduZGV2YSA9IDB4MDk0NTsKKyAgdC5lY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzU7CisgIHQuZWNhcm9uID0gMHgwMTFiOworICB0LmVjZWRpbGxhYnJldmUgPSAweDFlMWQ7CisgIHQuZWNoYXJtZW5pYW4gPSAweDA1NjU7CisgIHQuZWNoeWl3bmFybWVuaWFuID0gMHgwNTg3OworICB0LmVjaXJjbGUgPSAweDI0ZDQ7CisgIHQuZWNpcmN1bWZsZXggPSAweDAwZWE7CisgIHQuZWNpcmN1bWZsZXhhY3V0ZSA9IDB4MWViZjsKKyAgdC5lY2lyY3VtZmxleGJlbG93ID0gMHgxZTE5OworICB0LmVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzc7CisgIHQuZWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVjMTsKKyAgdC5lY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVjMzsKKyAgdC5lY2lyY3VtZmxleHRpbGRlID0gMHgxZWM1OworICB0LmVjeXJpbGxpYyA9IDB4MDQ1NDsKKyAgdC5lZGJsZ3JhdmUgPSAweDAyMDU7CisgIHQuZWRldmEgPSAweDA5MGY7CisgIHQuZWRpZXJlc2lzID0gMHgwMGViOworICB0LmVkb3QgPSAweDAxMTc7CisgIHQuZWRvdGFjY2VudCA9IDB4MDExNzsKKyAgdC5lZG90YmVsb3cgPSAweDFlYjk7CisgIHQuZWVndXJtdWtoaSA9IDB4MGEwZjsKKyAgdC5lZW1hdHJhZ3VybXVraGkgPSAweDBhNDc7CisgIHQuZWZjeXJpbGxpYyA9IDB4MDQ0NDsKKyAgdC5lZ3JhdmUgPSAweDAwZTg7CisgIHQuZWd1amFyYXRpID0gMHgwYThmOworICB0LmVoYXJtZW5pYW4gPSAweDA1Njc7CisgIHQuZWhib3BvbW9mbyA9IDB4MzExZDsKKyAgdC5laGlyYWdhbmEgPSAweDMwNDg7CisgIHQuZWhvb2thYm92ZSA9IDB4MWViYjsKKyAgdC5laWJvcG9tb2ZvID0gMHgzMTFmOworICB0LmVpZ2h0ID0gMHgwMDM4OworICB0LmVpZ2h0YXJhYmljID0gMHgwNjY4OworICB0LmVpZ2h0YmVuZ2FsaSA9IDB4MDllZTsKKyAgdC5laWdodGNpcmNsZSA9IDB4MjQ2NzsKKyAgdC5laWdodGNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OTE7CisgIHQuZWlnaHRkZXZhID0gMHgwOTZlOworICB0LmVpZ2h0ZWVuY2lyY2xlID0gMHgyNDcxOworICB0LmVpZ2h0ZWVucGFyZW4gPSAweDI0ODU7CisgIHQuZWlnaHRlZW5wZXJpb2QgPSAweDI0OTk7CisgIHQuZWlnaHRndWphcmF0aSA9IDB4MGFlZTsKKyAgdC5laWdodGd1cm11a2hpID0gMHgwYTZlOworICB0LmVpZ2h0aGFja2FyYWJpYyA9IDB4MDY2ODsKKyAgdC5laWdodGhhbmd6aG91ID0gMHgzMDI4OworICB0LmVpZ2h0aG5vdGViZWFtZWQgPSAweDI2NmI7CisgIHQuZWlnaHRpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI3OworICB0LmVpZ2h0aW5mZXJpb3IgPSAweDIwODg7CisgIHQuZWlnaHRtb25vc3BhY2UgPSAweGZmMTg7CisgIHQuZWlnaHRvbGRzdHlsZSA9IDB4ZjczODsKKyAgdC5laWdodHBhcmVuID0gMHgyNDdiOworICB0LmVpZ2h0cGVyaW9kID0gMHgyNDhmOworICB0LmVpZ2h0cGVyc2lhbiA9IDB4MDZmODsKKyAgdC5laWdodHJvbWFuID0gMHgyMTc3OworICB0LmVpZ2h0c3VwZXJpb3IgPSAweDIwNzg7CisgIHQuZWlnaHR0aGFpID0gMHgwZTU4OworICB0LmVpbnZlcnRlZGJyZXZlID0gMHgwMjA3OworICB0LmVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY1OworICB0LmVrYXRha2FuYSA9IDB4MzBhODsKKyAgdC5la2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzQ7CisgIHQuZWtvbmthcmd1cm11a2hpID0gMHgwYTc0OworICB0LmVrb3JlYW4gPSAweDMxNTQ7CisgIHQuZWxjeXJpbGxpYyA9IDB4MDQzYjsKKyAgdC5lbGVtZW50ID0gMHgyMjA4OworICB0LmVsZXZlbmNpcmNsZSA9IDB4MjQ2YTsKKyAgdC5lbGV2ZW5wYXJlbiA9IDB4MjQ3ZTsKKyAgdC5lbGV2ZW5wZXJpb2QgPSAweDI0OTI7CisgIHQuZWxldmVucm9tYW4gPSAweDIxN2E7CisgIHQuZWxsaXBzaXMgPSAweDIwMjY7CisgIHQuZWxsaXBzaXN2ZXJ0aWNhbCA9IDB4MjJlZTsKKyAgdC5lbWFjcm9uID0gMHgwMTEzOworICB0LmVtYWNyb25hY3V0ZSA9IDB4MWUxNzsKKyAgdC5lbWFjcm9uZ3JhdmUgPSAweDFlMTU7CisgIHQuZW1jeXJpbGxpYyA9IDB4MDQzYzsKKyAgdC5lbWRhc2ggPSAweDIwMTQ7CisgIHQuZW1kYXNodmVydGljYWwgPSAweGZlMzE7CisgIHQuZW1vbm9zcGFjZSA9IDB4ZmY0NTsKKyAgdC5lbXBoYXNpc21hcmthcm1lbmlhbiA9IDB4MDU1YjsKKyAgdC5lbXB0eXNldCA9IDB4MjIwNTsKKyAgdC5lbmJvcG9tb2ZvID0gMHgzMTIzOworICB0LmVuY3lyaWxsaWMgPSAweDA0M2Q7CisgIHQuZW5kYXNoID0gMHgyMDEzOworICB0LmVuZGFzaHZlcnRpY2FsID0gMHhmZTMyOworICB0LmVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTM7CisgIHQuZW5nID0gMHgwMTRiOworICB0LmVuZ2JvcG9tb2ZvID0gMHgzMTI1OworICB0LmVuZ2hlY3lyaWxsaWMgPSAweDA0YTU7CisgIHQuZW5ob29rY3lyaWxsaWMgPSAweDA0Yzg7CisgIHQuZW5zcGFjZSA9IDB4MjAwMjsKKyAgdC5lb2dvbmVrID0gMHgwMTE5OworICB0LmVva29yZWFuID0gMHgzMTUzOworICB0LmVvcGVuID0gMHgwMjViOworICB0LmVvcGVuY2xvc2VkID0gMHgwMjlhOworICB0LmVvcGVucmV2ZXJzZWQgPSAweDAyNWM7CisgIHQuZW9wZW5yZXZlcnNlZGNsb3NlZCA9IDB4MDI1ZTsKKyAgdC5lb3BlbnJldmVyc2VkaG9vayA9IDB4MDI1ZDsKKyAgdC5lcGFyZW4gPSAweDI0YTA7CisgIHQuZXBzaWxvbiA9IDB4MDNiNTsKKyAgdC5lcHNpbG9udG9ub3MgPSAweDAzYWQ7CisgIHQuZXF1YWwgPSAweDAwM2Q7CisgIHQuZXF1YWxtb25vc3BhY2UgPSAweGZmMWQ7CisgIHQuZXF1YWxzbWFsbCA9IDB4ZmU2NjsKKyAgdC5lcXVhbHN1cGVyaW9yID0gMHgyMDdjOworICB0LmVxdWl2YWxlbmNlID0gMHgyMjYxOworICB0LmVyYm9wb21vZm8gPSAweDMxMjY7CisgIHQuZXJjeXJpbGxpYyA9IDB4MDQ0MDsKKyAgdC5lcmV2ZXJzZWQgPSAweDAyNTg7CisgIHQuZXJldmVyc2VkY3lyaWxsaWMgPSAweDA0NGQ7CisgIHQuZXNjeXJpbGxpYyA9IDB4MDQ0MTsKKyAgdC5lc2Rlc2NlbmRlcmN5cmlsbGljID0gMHgwNGFiOworICB0LmVzaCA9IDB4MDI4MzsKKyAgdC5lc2hjdXJsID0gMHgwMjg2OworICB0LmVzaG9ydGRldmEgPSAweDA5MGU7CisgIHQuZXNob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0NjsKKyAgdC5lc2hyZXZlcnNlZGxvb3AgPSAweDAxYWE7CisgIHQuZXNoc3F1YXRyZXZlcnNlZCA9IDB4MDI4NTsKKyAgdC5lc21hbGxoaXJhZ2FuYSA9IDB4MzA0NzsKKyAgdC5lc21hbGxrYXRha2FuYSA9IDB4MzBhNzsKKyAgdC5lc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2YTsKKyAgdC5lc3RpbWF0ZWQgPSAweDIxMmU7CisgIHQuZXN1cGVyaW9yID0gMHhmNmVjOworICB0LmV0YSA9IDB4MDNiNzsKKyAgdC5ldGFybWVuaWFuID0gMHgwNTY4OworICB0LmV0YXRvbm9zID0gMHgwM2FlOworICB0LmV0aCA9IDB4MDBmMDsKKyAgdC5ldGlsZGUgPSAweDFlYmQ7CisgIHQuZXRpbGRlYmVsb3cgPSAweDFlMWI7CisgIHQuZXRuYWh0YWZvdWtoaGVicmV3ID0gMHgwNTkxOworICB0LmV0bmFodGFmb3VraGxlZnRoZWJyZXcgPSAweDA1OTE7CisgIHQuZXRuYWh0YWhlYnJldyA9IDB4MDU5MTsKKyAgdC5ldG5haHRhbGVmdGhlYnJldyA9IDB4MDU5MTsKKyAgdC5ldHVybmVkID0gMHgwMWRkOworICB0LmV1a29yZWFuID0gMHgzMTYxOworICB0LmV1cm8gPSAweDIwYWM7CisgIHQuZXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzc7CisgIHQuZXZvd2Vsc2lnbmRldmEgPSAweDA5NDc7CisgIHQuZXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM3OworICB0LmV4Y2xhbSA9IDB4MDAyMTsKKyAgdC5leGNsYW1hcm1lbmlhbiA9IDB4MDU1YzsKKyAgdC5leGNsYW1kYmwgPSAweDIwM2M7CisgIHQuZXhjbGFtZG93biA9IDB4MDBhMTsKKyAgdC5leGNsYW1kb3duc21hbGwgPSAweGY3YTE7CisgIHQuZXhjbGFtbW9ub3NwYWNlID0gMHhmZjAxOworICB0LmV4Y2xhbXNtYWxsID0gMHhmNzIxOworICB0LmV4aXN0ZW50aWFsID0gMHgyMjAzOworICB0LmV6aCA9IDB4MDI5MjsKKyAgdC5lemhjYXJvbiA9IDB4MDFlZjsKKyAgdC5lemhjdXJsID0gMHgwMjkzOworICB0LmV6aHJldmVyc2VkID0gMHgwMWI5OworICB0LmV6aHRhaWwgPSAweDAxYmE7CisgIHQuZiA9IDB4MDA2NjsKKyAgdC5mYWRldmEgPSAweDA5NWU7CisgIHQuZmFndXJtdWtoaSA9IDB4MGE1ZTsKKyAgdC5mYWhyZW5oZWl0ID0gMHgyMTA5OworICB0LmZhdGhhYXJhYmljID0gMHgwNjRlOworICB0LmZhdGhhbG93YXJhYmljID0gMHgwNjRlOworICB0LmZhdGhhdGFuYXJhYmljID0gMHgwNjRiOworICB0LmZib3BvbW9mbyA9IDB4MzEwODsKKyAgdC5mY2lyY2xlID0gMHgyNGQ1OworICB0LmZkb3RhY2NlbnQgPSAweDFlMWY7CisgIHQuZmVoYXJhYmljID0gMHgwNjQxOworICB0LmZlaGFybWVuaWFuID0gMHgwNTg2OworICB0LmZlaGZpbmFsYXJhYmljID0gMHhmZWQyOworICB0LmZlaGluaXRpYWxhcmFiaWMgPSAweGZlZDM7CisgIHQuZmVobWVkaWFsYXJhYmljID0gMHhmZWQ0OworICB0LmZlaWNvcHRpYyA9IDB4MDNlNTsKKyAgdC5mZW1hbGUgPSAweDI2NDA7CisgIHQuZmYgPSAweGZiMDA7CisgIHQuZl9mID0gMHhmYjAwOworICB0LmZmaSA9IDB4ZmIwMzsKKyAgdC5mZmwgPSAweGZiMDQ7CisgIHQuZmkgPSAweGZiMDE7CisgIHQuZmlmdGVlbmNpcmNsZSA9IDB4MjQ2ZTsKKyAgdC5maWZ0ZWVucGFyZW4gPSAweDI0ODI7CisgIHQuZmlmdGVlbnBlcmlvZCA9IDB4MjQ5NjsKKyAgdC5maWd1cmVkYXNoID0gMHgyMDEyOworICB0LmZpbGxlZGJveCA9IDB4MjVhMDsKKyAgdC5maWxsZWRyZWN0ID0gMHgyNWFjOworICB0LmZpbmFsa2FmID0gMHgwNWRhOworICB0LmZpbmFsa2FmZGFnZXNoID0gMHhmYjNhOworICB0LmZpbmFsa2FmZGFnZXNoaGVicmV3ID0gMHhmYjNhOworICB0LmZpbmFsa2FmaGVicmV3ID0gMHgwNWRhOworICB0LmZpbmFsbWVtID0gMHgwNWRkOworICB0LmZpbmFsbWVtaGVicmV3ID0gMHgwNWRkOworICB0LmZpbmFsbnVuID0gMHgwNWRmOworICB0LmZpbmFsbnVuaGVicmV3ID0gMHgwNWRmOworICB0LmZpbmFscGUgPSAweDA1ZTM7CisgIHQuZmluYWxwZWhlYnJldyA9IDB4MDVlMzsKKyAgdC5maW5hbHRzYWRpID0gMHgwNWU1OworICB0LmZpbmFsdHNhZGloZWJyZXcgPSAweDA1ZTU7CisgIHQuZmlyc3R0b25lY2hpbmVzZSA9IDB4MDJjOTsKKyAgdC5maXNoZXllID0gMHgyNWM5OworICB0LmZpdGFjeXJpbGxpYyA9IDB4MDQ3MzsKKyAgdC5maXZlID0gMHgwMDM1OworICB0LmZpdmVhcmFiaWMgPSAweDA2NjU7CisgIHQuZml2ZWJlbmdhbGkgPSAweDA5ZWI7CisgIHQuZml2ZWNpcmNsZSA9IDB4MjQ2NDsKKyAgdC5maXZlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZTsKKyAgdC5maXZlZGV2YSA9IDB4MDk2YjsKKyAgdC5maXZlZWlnaHRocyA9IDB4MjE1ZDsKKyAgdC5maXZlZ3VqYXJhdGkgPSAweDBhZWI7CisgIHQuZml2ZWd1cm11a2hpID0gMHgwYTZiOworICB0LmZpdmVoYWNrYXJhYmljID0gMHgwNjY1OworICB0LmZpdmVoYW5nemhvdSA9IDB4MzAyNTsKKyAgdC5maXZlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNDsKKyAgdC5maXZlaW5mZXJpb3IgPSAweDIwODU7CisgIHQuZml2ZW1vbm9zcGFjZSA9IDB4ZmYxNTsKKyAgdC5maXZlb2xkc3R5bGUgPSAweGY3MzU7CisgIHQuZml2ZXBhcmVuID0gMHgyNDc4OworICB0LmZpdmVwZXJpb2QgPSAweDI0OGM7CisgIHQuZml2ZXBlcnNpYW4gPSAweDA2ZjU7CisgIHQuZml2ZXJvbWFuID0gMHgyMTc0OworICB0LmZpdmVzdXBlcmlvciA9IDB4MjA3NTsKKyAgdC5maXZldGhhaSA9IDB4MGU1NTsKKyAgdC5mbCA9IDB4ZmIwMjsKKyAgdC5mbG9yaW4gPSAweDAxOTI7CisgIHQuZm1vbm9zcGFjZSA9IDB4ZmY0NjsKKyAgdC5mbXNxdWFyZSA9IDB4MzM5OTsKKyAgdC5mb2ZhbnRoYWkgPSAweDBlMWY7CisgIHQuZm9mYXRoYWkgPSAweDBlMWQ7CisgIHQuZm9uZ21hbnRoYWkgPSAweDBlNGY7CisgIHQuZm9yYWxsID0gMHgyMjAwOworICB0LmZvdXIgPSAweDAwMzQ7CisgIHQuZm91cmFyYWJpYyA9IDB4MDY2NDsKKyAgdC5mb3VyYmVuZ2FsaSA9IDB4MDllYTsKKyAgdC5mb3VyY2lyY2xlID0gMHgyNDYzOworICB0LmZvdXJjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhkOworICB0LmZvdXJkZXZhID0gMHgwOTZhOworICB0LmZvdXJndWphcmF0aSA9IDB4MGFlYTsKKyAgdC5mb3VyZ3VybXVraGkgPSAweDBhNmE7CisgIHQuZm91cmhhY2thcmFiaWMgPSAweDA2NjQ7CisgIHQuZm91cmhhbmd6aG91ID0gMHgzMDI0OworICB0LmZvdXJpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIzOworICB0LmZvdXJpbmZlcmlvciA9IDB4MjA4NDsKKyAgdC5mb3VybW9ub3NwYWNlID0gMHhmZjE0OworICB0LmZvdXJudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY3OworICB0LmZvdXJvbGRzdHlsZSA9IDB4ZjczNDsKKyAgdC5mb3VycGFyZW4gPSAweDI0Nzc7CisgIHQuZm91cnBlcmlvZCA9IDB4MjQ4YjsKKyAgdC5mb3VycGVyc2lhbiA9IDB4MDZmNDsKKyAgdC5mb3Vycm9tYW4gPSAweDIxNzM7CisgIHQuZm91cnN1cGVyaW9yID0gMHgyMDc0OworICB0LmZvdXJ0ZWVuY2lyY2xlID0gMHgyNDZkOworICB0LmZvdXJ0ZWVucGFyZW4gPSAweDI0ODE7CisgIHQuZm91cnRlZW5wZXJpb2QgPSAweDI0OTU7CisgIHQuZm91cnRoYWkgPSAweDBlNTQ7CisgIHQuZm91cnRodG9uZWNoaW5lc2UgPSAweDAyY2I7CisgIHQuZnBhcmVuID0gMHgyNGExOworICB0LmZyYWN0aW9uID0gMHgyMDQ0OworICB0LmZyYW5jID0gMHgyMGEzOworICB0LmcgPSAweDAwNjc7CisgIHQuZ2FiZW5nYWxpID0gMHgwOTk3OworICB0LmdhY3V0ZSA9IDB4MDFmNTsKKyAgdC5nYWRldmEgPSAweDA5MTc7CisgIHQuZ2FmYXJhYmljID0gMHgwNmFmOworICB0LmdhZmZpbmFsYXJhYmljID0gMHhmYjkzOworICB0LmdhZmluaXRpYWxhcmFiaWMgPSAweGZiOTQ7CisgIHQuZ2FmbWVkaWFsYXJhYmljID0gMHhmYjk1OworICB0LmdhZ3VqYXJhdGkgPSAweDBhOTc7CisgIHQuZ2FndXJtdWtoaSA9IDB4MGExNzsKKyAgdC5nYWhpcmFnYW5hID0gMHgzMDRjOworICB0Lmdha2F0YWthbmEgPSAweDMwYWM7CisgIHQuZ2FtbWEgPSAweDAzYjM7CisgIHQuZ2FtbWFsYXRpbnNtYWxsID0gMHgwMjYzOworICB0LmdhbW1hc3VwZXJpb3IgPSAweDAyZTA7CisgIHQuZ2FuZ2lhY29wdGljID0gMHgwM2ViOworICB0Lmdib3BvbW9mbyA9IDB4MzEwZDsKKyAgdC5nYnJldmUgPSAweDAxMWY7CisgIHQuZ2Nhcm9uID0gMHgwMWU3OworICB0LmdjZWRpbGxhID0gMHgwMTIzOworICB0LmdjaXJjbGUgPSAweDI0ZDY7CisgIHQuZ2NpcmN1bWZsZXggPSAweDAxMWQ7CisgIHQuZ2NvbW1hYWNjZW50ID0gMHgwMTIzOworICB0Lmdkb3QgPSAweDAxMjE7CisgIHQuZ2RvdGFjY2VudCA9IDB4MDEyMTsKKyAgdC5nZWN5cmlsbGljID0gMHgwNDMzOworICB0LmdlaGlyYWdhbmEgPSAweDMwNTI7CisgIHQuZ2VrYXRha2FuYSA9IDB4MzBiMjsKKyAgdC5nZW9tZXRyaWNhbGx5ZXF1YWwgPSAweDIyNTE7CisgIHQuZ2VyZXNoYWNjZW50aGVicmV3ID0gMHgwNTljOworICB0LmdlcmVzaGhlYnJldyA9IDB4MDVmMzsKKyAgdC5nZXJlc2htdXFkYW1oZWJyZXcgPSAweDA1OWQ7CisgIHQuZ2VybWFuZGJscyA9IDB4MDBkZjsKKyAgdC5nZXJzaGF5aW1hY2NlbnRoZWJyZXcgPSAweDA1OWU7CisgIHQuZ2Vyc2hheWltaGVicmV3ID0gMHgwNWY0OworICB0LmdldGFtYXJrID0gMHgzMDEzOworICB0LmdoYWJlbmdhbGkgPSAweDA5OTg7CisgIHQuZ2hhZGFybWVuaWFuID0gMHgwNTcyOworICB0LmdoYWRldmEgPSAweDA5MTg7CisgIHQuZ2hhZ3VqYXJhdGkgPSAweDBhOTg7CisgIHQuZ2hhZ3VybXVraGkgPSAweDBhMTg7CisgIHQuZ2hhaW5hcmFiaWMgPSAweDA2M2E7CisgIHQuZ2hhaW5maW5hbGFyYWJpYyA9IDB4ZmVjZTsKKyAgdC5naGFpbmluaXRpYWxhcmFiaWMgPSAweGZlY2Y7CisgIHQuZ2hhaW5tZWRpYWxhcmFiaWMgPSAweGZlZDA7CisgIHQuZ2hlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNDk1OworICB0LmdoZXN0cm9rZWN5cmlsbGljID0gMHgwNDkzOworICB0LmdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkxOworICB0LmdoaGFkZXZhID0gMHgwOTVhOworICB0LmdoaGFndXJtdWtoaSA9IDB4MGE1YTsKKyAgdC5naG9vayA9IDB4MDI2MDsKKyAgdC5naHpzcXVhcmUgPSAweDMzOTM7CisgIHQuZ2loaXJhZ2FuYSA9IDB4MzA0ZTsKKyAgdC5naWthdGFrYW5hID0gMHgzMGFlOworICB0LmdpbWFybWVuaWFuID0gMHgwNTYzOworICB0LmdpbWVsID0gMHgwNWQyOworICB0LmdpbWVsZGFnZXNoID0gMHhmYjMyOworICB0LmdpbWVsZGFnZXNoaGVicmV3ID0gMHhmYjMyOworICB0LmdpbWVsaGVicmV3ID0gMHgwNWQyOworICB0LmdqZWN5cmlsbGljID0gMHgwNDUzOworICB0Lmdsb3R0YWxpbnZlcnRlZHN0cm9rZSA9IDB4MDFiZTsKKyAgdC5nbG90dGFsc3RvcCA9IDB4MDI5NDsKKyAgdC5nbG90dGFsc3RvcGludmVydGVkID0gMHgwMjk2OworICB0Lmdsb3R0YWxzdG9wbW9kID0gMHgwMmMwOworICB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWQgPSAweDAyOTU7CisgIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZG1vZCA9IDB4MDJjMTsKKyAgdC5nbG90dGFsc3RvcHJldmVyc2Vkc3VwZXJpb3IgPSAweDAyZTQ7CisgIHQuZ2xvdHRhbHN0b3BzdHJva2UgPSAweDAyYTE7CisgIHQuZ2xvdHRhbHN0b3BzdHJva2VyZXZlcnNlZCA9IDB4MDJhMjsKKyAgdC5nbWFjcm9uID0gMHgxZTIxOworICB0Lmdtb25vc3BhY2UgPSAweGZmNDc7CisgIHQuZ29oaXJhZ2FuYSA9IDB4MzA1NDsKKyAgdC5nb2thdGFrYW5hID0gMHgzMGI0OworICB0LmdwYXJlbiA9IDB4MjRhMjsKKyAgdC5ncGFzcXVhcmUgPSAweDMzYWM7CisgIHQuZ3JhZGllbnQgPSAweDIyMDc7CisgIHQuZ3JhdmUgPSAweDAwNjA7CisgIHQuZ3JhdmViZWxvd2NtYiA9IDB4MDMxNjsKKyAgdC5ncmF2ZWNtYiA9IDB4MDMwMDsKKyAgdC5ncmF2ZWNvbWIgPSAweDAzMDA7CisgIHQuZ3JhdmVkZXZhID0gMHgwOTUzOworICB0LmdyYXZlbG93bW9kID0gMHgwMmNlOworICB0LmdyYXZlbW9ub3NwYWNlID0gMHhmZjQwOworICB0LmdyYXZldG9uZWNtYiA9IDB4MDM0MDsKKyAgdC5ncmVhdGVyID0gMHgwMDNlOworICB0LmdyZWF0ZXJlcXVhbCA9IDB4MjI2NTsKKyAgdC5ncmVhdGVyZXF1YWxvcmxlc3MgPSAweDIyZGI7CisgIHQuZ3JlYXRlcm1vbm9zcGFjZSA9IDB4ZmYxZTsKKyAgdC5ncmVhdGVyb3JlcXVpdmFsZW50ID0gMHgyMjczOworICB0LmdyZWF0ZXJvcmxlc3MgPSAweDIyNzc7CisgIHQuZ3JlYXRlcm92ZXJlcXVhbCA9IDB4MjI2NzsKKyAgdC5ncmVhdGVyc21hbGwgPSAweGZlNjU7CisgIHQuZ3NjcmlwdCA9IDB4MDI2MTsKKyAgdC5nc3Ryb2tlID0gMHgwMWU1OworICB0Lmd1aGlyYWdhbmEgPSAweDMwNTA7CisgIHQuZ3VpbGxlbW90bGVmdCA9IDB4MDBhYjsKKyAgdC5ndWlsbGVtb3RyaWdodCA9IDB4MDBiYjsKKyAgdC5ndWlsc2luZ2xsZWZ0ID0gMHgyMDM5OworICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMHgyMDNhOworICB0Lmd1a2F0YWthbmEgPSAweDMwYjA7CisgIHQuZ3VyYW11c3F1YXJlID0gMHgzMzE4OworICB0Lmd5c3F1YXJlID0gMHgzM2M5OworICB0LmggPSAweDAwNjg7CisgIHQuaGFhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRhOTsKKyAgdC5oYWFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKKyAgdC5oYWJlbmdhbGkgPSAweDA5Yjk7CisgIHQuaGFkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiMzsKKyAgdC5oYWRldmEgPSAweDA5Mzk7CisgIHQuaGFndWphcmF0aSA9IDB4MGFiOTsKKyAgdC5oYWd1cm11a2hpID0gMHgwYTM5OworICB0LmhhaGFyYWJpYyA9IDB4MDYyZDsKKyAgdC5oYWhmaW5hbGFyYWJpYyA9IDB4ZmVhMjsKKyAgdC5oYWhpbml0aWFsYXJhYmljID0gMHhmZWEzOworICB0LmhhaGlyYWdhbmEgPSAweDMwNmY7CisgIHQuaGFobWVkaWFsYXJhYmljID0gMHhmZWE0OworICB0LmhhaXR1c3F1YXJlID0gMHgzMzJhOworICB0Lmhha2F0YWthbmEgPSAweDMwY2Y7CisgIHQuaGFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YTsKKyAgdC5oYWxhbnRndXJtdWtoaSA9IDB4MGE0ZDsKKyAgdC5oYW16YWFyYWJpYyA9IDB4MDYyMTsKKyAgdC5oYW16YWxvd2FyYWJpYyA9IDB4MDYyMTsKKyAgdC5oYW5ndWxmaWxsZXIgPSAweDMxNjQ7CisgIHQuaGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQ0YTsKKyAgdC5oYXJwb29ubGVmdGJhcmJ1cCA9IDB4MjFiYzsKKyAgdC5oYXJwb29ucmlnaHRiYXJidXAgPSAweDIxYzA7CisgIHQuaGFzcXVhcmUgPSAweDMzY2E7CisgIHQuaGF0YWZwYXRhaCA9IDB4MDViMjsKKyAgdC5oYXRhZnBhdGFoMTYgPSAweDA1YjI7CisgIHQuaGF0YWZwYXRhaDIzID0gMHgwNWIyOworICB0LmhhdGFmcGF0YWgyZiA9IDB4MDViMjsKKyAgdC5oYXRhZnBhdGFoaGVicmV3ID0gMHgwNWIyOworICB0LmhhdGFmcGF0YWhuYXJyb3doZWJyZXcgPSAweDA1YjI7CisgIHQuaGF0YWZwYXRhaHF1YXJ0ZXJoZWJyZXcgPSAweDA1YjI7CisgIHQuaGF0YWZwYXRhaHdpZGVoZWJyZXcgPSAweDA1YjI7CisgIHQuaGF0YWZxYW1hdHMgPSAweDA1YjM7CisgIHQuaGF0YWZxYW1hdHMxYiA9IDB4MDViMzsKKyAgdC5oYXRhZnFhbWF0czI4ID0gMHgwNWIzOworICB0LmhhdGFmcWFtYXRzMzQgPSAweDA1YjM7CisgIHQuaGF0YWZxYW1hdHNoZWJyZXcgPSAweDA1YjM7CisgIHQuaGF0YWZxYW1hdHNuYXJyb3doZWJyZXcgPSAweDA1YjM7CisgIHQuaGF0YWZxYW1hdHNxdWFydGVyaGVicmV3ID0gMHgwNWIzOworICB0LmhhdGFmcWFtYXRzd2lkZWhlYnJldyA9IDB4MDViMzsKKyAgdC5oYXRhZnNlZ29sID0gMHgwNWIxOworICB0LmhhdGFmc2Vnb2wxNyA9IDB4MDViMTsKKyAgdC5oYXRhZnNlZ29sMjQgPSAweDA1YjE7CisgIHQuaGF0YWZzZWdvbDMwID0gMHgwNWIxOworICB0LmhhdGFmc2Vnb2xoZWJyZXcgPSAweDA1YjE7CisgIHQuaGF0YWZzZWdvbG5hcnJvd2hlYnJldyA9IDB4MDViMTsKKyAgdC5oYXRhZnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViMTsKKyAgdC5oYXRhZnNlZ29sd2lkZWhlYnJldyA9IDB4MDViMTsKKyAgdC5oYmFyID0gMHgwMTI3OworICB0Lmhib3BvbW9mbyA9IDB4MzEwZjsKKyAgdC5oYnJldmViZWxvdyA9IDB4MWUyYjsKKyAgdC5oY2VkaWxsYSA9IDB4MWUyOTsKKyAgdC5oY2lyY2xlID0gMHgyNGQ3OworICB0LmhjaXJjdW1mbGV4ID0gMHgwMTI1OworICB0LmhkaWVyZXNpcyA9IDB4MWUyNzsKKyAgdC5oZG90YWNjZW50ID0gMHgxZTIzOworICB0Lmhkb3RiZWxvdyA9IDB4MWUyNTsKKyAgdC5oZSA9IDB4MDVkNDsKKyAgdC5oZWFydCA9IDB4MjY2NTsKKyAgdC5oZWFydHN1aXRibGFjayA9IDB4MjY2NTsKKyAgdC5oZWFydHN1aXR3aGl0ZSA9IDB4MjY2MTsKKyAgdC5oZWRhZ2VzaCA9IDB4ZmIzNDsKKyAgdC5oZWRhZ2VzaGhlYnJldyA9IDB4ZmIzNDsKKyAgdC5oZWhhbHRvbmVhcmFiaWMgPSAweDA2YzE7CisgIHQuaGVoYXJhYmljID0gMHgwNjQ3OworICB0LmhlaGVicmV3ID0gMHgwNWQ0OworICB0LmhlaGZpbmFsYWx0b25lYXJhYmljID0gMHhmYmE3OworICB0LmhlaGZpbmFsYWx0dHdvYXJhYmljID0gMHhmZWVhOworICB0LmhlaGZpbmFsYXJhYmljID0gMHhmZWVhOworICB0LmhlaGhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmJhNTsKKyAgdC5oZWhoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWMgPSAweGZiYTQ7CisgIHQuaGVoaW5pdGlhbGFsdG9uZWFyYWJpYyA9IDB4ZmJhODsKKyAgdC5oZWhpbml0aWFsYXJhYmljID0gMHhmZWViOworICB0LmhlaGlyYWdhbmEgPSAweDMwNzg7CisgIHQuaGVobWVkaWFsYWx0b25lYXJhYmljID0gMHhmYmE5OworICB0LmhlaG1lZGlhbGFyYWJpYyA9IDB4ZmVlYzsKKyAgdC5oZWlzZWllcmFzcXVhcmUgPSAweDMzN2I7CisgIHQuaGVrYXRha2FuYSA9IDB4MzBkODsKKyAgdC5oZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhkOworICB0Lmhla3V0YWFydXNxdWFyZSA9IDB4MzMzNjsKKyAgdC5oZW5naG9vayA9IDB4MDI2NzsKKyAgdC5oZXJ1dHVzcXVhcmUgPSAweDMzMzk7CisgIHQuaGV0ID0gMHgwNWQ3OworICB0LmhldGhlYnJldyA9IDB4MDVkNzsKKyAgdC5oaG9vayA9IDB4MDI2NjsKKyAgdC5oaG9va3N1cGVyaW9yID0gMHgwMmIxOworICB0LmhpZXVoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YjsKKyAgdC5oaWV1aGFwYXJlbmtvcmVhbiA9IDB4MzIxYjsKKyAgdC5oaWV1aGNpcmNsZWtvcmVhbiA9IDB4MzI2ZDsKKyAgdC5oaWV1aGtvcmVhbiA9IDB4MzE0ZTsKKyAgdC5oaWV1aHBhcmVua29yZWFuID0gMHgzMjBkOworICB0LmhpaGlyYWdhbmEgPSAweDMwNzI7CisgIHQuaGlrYXRha2FuYSA9IDB4MzBkMjsKKyAgdC5oaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhiOworICB0LmhpcmlxID0gMHgwNWI0OworICB0LmhpcmlxMTQgPSAweDA1YjQ7CisgIHQuaGlyaXEyMSA9IDB4MDViNDsKKyAgdC5oaXJpcTJkID0gMHgwNWI0OworICB0LmhpcmlxaGVicmV3ID0gMHgwNWI0OworICB0LmhpcmlxbmFycm93aGVicmV3ID0gMHgwNWI0OworICB0LmhpcmlxcXVhcnRlcmhlYnJldyA9IDB4MDViNDsKKyAgdC5oaXJpcXdpZGVoZWJyZXcgPSAweDA1YjQ7CisgIHQuaGxpbmViZWxvdyA9IDB4MWU5NjsKKyAgdC5obW9ub3NwYWNlID0gMHhmZjQ4OworICB0LmhvYXJtZW5pYW4gPSAweDA1NzA7CisgIHQuaG9oaXB0aGFpID0gMHgwZTJiOworICB0LmhvaGlyYWdhbmEgPSAweDMwN2I7CisgIHQuaG9rYXRha2FuYSA9IDB4MzBkYjsKKyAgdC5ob2thdGFrYW5haGFsZndpZHRoID0gMHhmZjhlOworICB0LmhvbGFtID0gMHgwNWI5OworICB0LmhvbGFtMTkgPSAweDA1Yjk7CisgIHQuaG9sYW0yNiA9IDB4MDViOTsKKyAgdC5ob2xhbTMyID0gMHgwNWI5OworICB0LmhvbGFtaGVicmV3ID0gMHgwNWI5OworICB0LmhvbGFtbmFycm93aGVicmV3ID0gMHgwNWI5OworICB0LmhvbGFtcXVhcnRlcmhlYnJldyA9IDB4MDViOTsKKyAgdC5ob2xhbXdpZGVoZWJyZXcgPSAweDA1Yjk7CisgIHQuaG9ub2todWt0aGFpID0gMHgwZTJlOworICB0Lmhvb2thYm92ZWNvbWIgPSAweDAzMDk7CisgIHQuaG9va2NtYiA9IDB4MDMwOTsKKyAgdC5ob29rcGFsYXRhbGl6ZWRiZWxvd2NtYiA9IDB4MDMyMTsKKyAgdC5ob29rcmV0cm9mbGV4YmVsb3djbWIgPSAweDAzMjI7CisgIHQuaG9vbnNxdWFyZSA9IDB4MzM0MjsKKyAgdC5ob3JpY29wdGljID0gMHgwM2U5OworICB0Lmhvcml6b250YWxiYXIgPSAweDIwMTU7CisgIHQuaG9ybmNtYiA9IDB4MDMxYjsKKyAgdC5ob3RzcHJpbmdzID0gMHgyNjY4OworICB0LmhvdXNlID0gMHgyMzAyOworICB0LmhwYXJlbiA9IDB4MjRhMzsKKyAgdC5oc3VwZXJpb3IgPSAweDAyYjA7CisgIHQuaHR1cm5lZCA9IDB4MDI2NTsKKyAgdC5odWhpcmFnYW5hID0gMHgzMDc1OworICB0Lmh1aWl0b3NxdWFyZSA9IDB4MzMzMzsKKyAgdC5odWthdGFrYW5hID0gMHgzMGQ1OworICB0Lmh1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGM7CisgIHQuaHVuZ2FydW1sYXV0ID0gMHgwMmRkOworICB0Lmh1bmdhcnVtbGF1dGNtYiA9IDB4MDMwYjsKKyAgdC5odiA9IDB4MDE5NTsKKyAgdC5oeXBoZW4gPSAweDAwMmQ7CisgIHQuaHlwaGVuaW5mZXJpb3IgPSAweGY2ZTU7CisgIHQuaHlwaGVubW9ub3NwYWNlID0gMHhmZjBkOworICB0Lmh5cGhlbnNtYWxsID0gMHhmZTYzOworICB0Lmh5cGhlbnN1cGVyaW9yID0gMHhmNmU2OworICB0Lmh5cGhlbnR3byA9IDB4MjAxMDsKKyAgdC5pID0gMHgwMDY5OworICB0LmlhY3V0ZSA9IDB4MDBlZDsKKyAgdC5pYWN5cmlsbGljID0gMHgwNDRmOworICB0LmliZW5nYWxpID0gMHgwOTg3OworICB0Lmlib3BvbW9mbyA9IDB4MzEyNzsKKyAgdC5pYnJldmUgPSAweDAxMmQ7CisgIHQuaWNhcm9uID0gMHgwMWQwOworICB0LmljaXJjbGUgPSAweDI0ZDg7CisgIHQuaWNpcmN1bWZsZXggPSAweDAwZWU7CisgIHQuaWN5cmlsbGljID0gMHgwNDU2OworICB0LmlkYmxncmF2ZSA9IDB4MDIwOTsKKyAgdC5pZGVvZ3JhcGhlYXJ0aGNpcmNsZSA9IDB4MzI4ZjsKKyAgdC5pZGVvZ3JhcGhmaXJlY2lyY2xlID0gMHgzMjhiOworICB0LmlkZW9ncmFwaGljYWxsaWFuY2VwYXJlbiA9IDB4MzIzZjsKKyAgdC5pZGVvZ3JhcGhpY2NhbGxwYXJlbiA9IDB4MzIzYTsKKyAgdC5pZGVvZ3JhcGhpY2NlbnRyZWNpcmNsZSA9IDB4MzJhNTsKKyAgdC5pZGVvZ3JhcGhpY2Nsb3NlID0gMHgzMDA2OworICB0LmlkZW9ncmFwaGljY29tbWEgPSAweDMwMDE7CisgIHQuaWRlb2dyYXBoaWNjb21tYWxlZnQgPSAweGZmNjQ7CisgIHQuaWRlb2dyYXBoaWNjb25ncmF0dWxhdGlvbnBhcmVuID0gMHgzMjM3OworICB0LmlkZW9ncmFwaGljY29ycmVjdGNpcmNsZSA9IDB4MzJhMzsKKyAgdC5pZGVvZ3JhcGhpY2VhcnRocGFyZW4gPSAweDMyMmY7CisgIHQuaWRlb2dyYXBoaWNlbnRlcnByaXNlcGFyZW4gPSAweDMyM2Q7CisgIHQuaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGUgPSAweDMyOWQ7CisgIHQuaWRlb2dyYXBoaWNmZXN0aXZhbHBhcmVuID0gMHgzMjQwOworICB0LmlkZW9ncmFwaGljZmluYW5jaWFsY2lyY2xlID0gMHgzMjk2OworICB0LmlkZW9ncmFwaGljZmluYW5jaWFscGFyZW4gPSAweDMyMzY7CisgIHQuaWRlb2dyYXBoaWNmaXJlcGFyZW4gPSAweDMyMmI7CisgIHQuaWRlb2dyYXBoaWNoYXZlcGFyZW4gPSAweDMyMzI7CisgIHQuaWRlb2dyYXBoaWNoaWdoY2lyY2xlID0gMHgzMmE0OworICB0LmlkZW9ncmFwaGljaXRlcmF0aW9ubWFyayA9IDB4MzAwNTsKKyAgdC5pZGVvZ3JhcGhpY2xhYm9yY2lyY2xlID0gMHgzMjk4OworICB0LmlkZW9ncmFwaGljbGFib3JwYXJlbiA9IDB4MzIzODsKKyAgdC5pZGVvZ3JhcGhpY2xlZnRjaXJjbGUgPSAweDMyYTc7CisgIHQuaWRlb2dyYXBoaWNsb3djaXJjbGUgPSAweDMyYTY7CisgIHQuaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZSA9IDB4MzJhOTsKKyAgdC5pZGVvZ3JhcGhpY21ldGFscGFyZW4gPSAweDMyMmU7CisgIHQuaWRlb2dyYXBoaWNtb29ucGFyZW4gPSAweDMyMmE7CisgIHQuaWRlb2dyYXBoaWNuYW1lcGFyZW4gPSAweDMyMzQ7CisgIHQuaWRlb2dyYXBoaWNwZXJpb2QgPSAweDMwMDI7CisgIHQuaWRlb2dyYXBoaWNwcmludGNpcmNsZSA9IDB4MzI5ZTsKKyAgdC5pZGVvZ3JhcGhpY3JlYWNocGFyZW4gPSAweDMyNDM7CisgIHQuaWRlb2dyYXBoaWNyZXByZXNlbnRwYXJlbiA9IDB4MzIzOTsKKyAgdC5pZGVvZ3JhcGhpY3Jlc291cmNlcGFyZW4gPSAweDMyM2U7CisgIHQuaWRlb2dyYXBoaWNyaWdodGNpcmNsZSA9IDB4MzJhODsKKyAgdC5pZGVvZ3JhcGhpY3NlY3JldGNpcmNsZSA9IDB4MzI5OTsKKyAgdC5pZGVvZ3JhcGhpY3NlbGZwYXJlbiA9IDB4MzI0MjsKKyAgdC5pZGVvZ3JhcGhpY3NvY2lldHlwYXJlbiA9IDB4MzIzMzsKKyAgdC5pZGVvZ3JhcGhpY3NwYWNlID0gMHgzMDAwOworICB0LmlkZW9ncmFwaGljc3BlY2lhbHBhcmVuID0gMHgzMjM1OworICB0LmlkZW9ncmFwaGljc3RvY2twYXJlbiA9IDB4MzIzMTsKKyAgdC5pZGVvZ3JhcGhpY3N0dWR5cGFyZW4gPSAweDMyM2I7CisgIHQuaWRlb2dyYXBoaWNzdW5wYXJlbiA9IDB4MzIzMDsKKyAgdC5pZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuID0gMHgzMjNjOworICB0LmlkZW9ncmFwaGljd2F0ZXJwYXJlbiA9IDB4MzIyYzsKKyAgdC5pZGVvZ3JhcGhpY3dvb2RwYXJlbiA9IDB4MzIyZDsKKyAgdC5pZGVvZ3JhcGhpY3plcm8gPSAweDMwMDc7CisgIHQuaWRlb2dyYXBobWV0YWxjaXJjbGUgPSAweDMyOGU7CisgIHQuaWRlb2dyYXBobW9vbmNpcmNsZSA9IDB4MzI4YTsKKyAgdC5pZGVvZ3JhcGhuYW1lY2lyY2xlID0gMHgzMjk0OworICB0LmlkZW9ncmFwaHN1bmNpcmNsZSA9IDB4MzI5MDsKKyAgdC5pZGVvZ3JhcGh3YXRlcmNpcmNsZSA9IDB4MzI4YzsKKyAgdC5pZGVvZ3JhcGh3b29kY2lyY2xlID0gMHgzMjhkOworICB0LmlkZXZhID0gMHgwOTA3OworICB0LmlkaWVyZXNpcyA9IDB4MDBlZjsKKyAgdC5pZGllcmVzaXNhY3V0ZSA9IDB4MWUyZjsKKyAgdC5pZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlNTsKKyAgdC5pZG90YmVsb3cgPSAweDFlY2I7CisgIHQuaWVicmV2ZWN5cmlsbGljID0gMHgwNGQ3OworICB0LmllY3lyaWxsaWMgPSAweDA0MzU7CisgIHQuaWV1bmdhY2lyY2xla29yZWFuID0gMHgzMjc1OworICB0LmlldW5nYXBhcmVua29yZWFuID0gMHgzMjE1OworICB0LmlldW5nY2lyY2xla29yZWFuID0gMHgzMjY3OworICB0LmlldW5na29yZWFuID0gMHgzMTQ3OworICB0LmlldW5ncGFyZW5rb3JlYW4gPSAweDMyMDc7CisgIHQuaWdyYXZlID0gMHgwMGVjOworICB0LmlndWphcmF0aSA9IDB4MGE4NzsKKyAgdC5pZ3VybXVraGkgPSAweDBhMDc7CisgIHQuaWhpcmFnYW5hID0gMHgzMDQ0OworICB0Lmlob29rYWJvdmUgPSAweDFlYzk7CisgIHQuaWliZW5nYWxpID0gMHgwOTg4OworICB0LmlpY3lyaWxsaWMgPSAweDA0Mzg7CisgIHQuaWlkZXZhID0gMHgwOTA4OworICB0LmlpZ3VqYXJhdGkgPSAweDBhODg7CisgIHQuaWlndXJtdWtoaSA9IDB4MGEwODsKKyAgdC5paW1hdHJhZ3VybXVraGkgPSAweDBhNDA7CisgIHQuaWludmVydGVkYnJldmUgPSAweDAyMGI7CisgIHQuaWlzaG9ydGN5cmlsbGljID0gMHgwNDM5OworICB0Lmlpdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMDsKKyAgdC5paXZvd2Vsc2lnbmRldmEgPSAweDA5NDA7CisgIHQuaWl2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMDsKKyAgdC5paiA9IDB4MDEzMzsKKyAgdC5pa2F0YWthbmEgPSAweDMwYTQ7CisgIHQuaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcyOworICB0Lmlrb3JlYW4gPSAweDMxNjM7CisgIHQuaWxkZSA9IDB4MDJkYzsKKyAgdC5pbHV5aGVicmV3ID0gMHgwNWFjOworICB0LmltYWNyb24gPSAweDAxMmI7CisgIHQuaW1hY3JvbmN5cmlsbGljID0gMHgwNGUzOworICB0LmltYWdlb3JhcHByb3hpbWF0ZWx5ZXF1YWwgPSAweDIyNTM7CisgIHQuaW1hdHJhZ3VybXVraGkgPSAweDBhM2Y7CisgIHQuaW1vbm9zcGFjZSA9IDB4ZmY0OTsKKyAgdC5pbmNyZW1lbnQgPSAweDIyMDY7CisgIHQuaW5maW5pdHkgPSAweDIyMWU7CisgIHQuaW5pYXJtZW5pYW4gPSAweDA1NmI7CisgIHQuaW50ZWdyYWwgPSAweDIyMmI7CisgIHQuaW50ZWdyYWxib3R0b20gPSAweDIzMjE7CisgIHQuaW50ZWdyYWxidCA9IDB4MjMyMTsKKyAgdC5pbnRlZ3JhbGV4ID0gMHhmOGY1OworICB0LmludGVncmFsdG9wID0gMHgyMzIwOworICB0LmludGVncmFsdHAgPSAweDIzMjA7CisgIHQuaW50ZXJzZWN0aW9uID0gMHgyMjI5OworICB0LmludGlzcXVhcmUgPSAweDMzMDU7CisgIHQuaW52YnVsbGV0ID0gMHgyNWQ4OworICB0LmludmNpcmNsZSA9IDB4MjVkOTsKKyAgdC5pbnZzbWlsZWZhY2UgPSAweDI2M2I7CisgIHQuaW9jeXJpbGxpYyA9IDB4MDQ1MTsKKyAgdC5pb2dvbmVrID0gMHgwMTJmOworICB0LmlvdGEgPSAweDAzYjk7CisgIHQuaW90YWRpZXJlc2lzID0gMHgwM2NhOworICB0LmlvdGFkaWVyZXNpc3Rvbm9zID0gMHgwMzkwOworICB0LmlvdGFsYXRpbiA9IDB4MDI2OTsKKyAgdC5pb3RhdG9ub3MgPSAweDAzYWY7CisgIHQuaXBhcmVuID0gMHgyNGE0OworICB0LmlyaWd1cm11a2hpID0gMHgwYTcyOworICB0LmlzbWFsbGhpcmFnYW5hID0gMHgzMDQzOworICB0LmlzbWFsbGthdGFrYW5hID0gMHgzMGEzOworICB0LmlzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY4OworICB0Lmlzc2hhcmJlbmdhbGkgPSAweDA5ZmE7CisgIHQuaXN0cm9rZSA9IDB4MDI2ODsKKyAgdC5pc3VwZXJpb3IgPSAweGY2ZWQ7CisgIHQuaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWQ7CisgIHQuaXRlcmF0aW9ua2F0YWthbmEgPSAweDMwZmQ7CisgIHQuaXRpbGRlID0gMHgwMTI5OworICB0Lml0aWxkZWJlbG93ID0gMHgxZTJkOworICB0Lml1Ym9wb21vZm8gPSAweDMxMjk7CisgIHQuaXVjeXJpbGxpYyA9IDB4MDQ0ZTsKKyAgdC5pdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZjsKKyAgdC5pdm93ZWxzaWduZGV2YSA9IDB4MDkzZjsKKyAgdC5pdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmY7CisgIHQuaXpoaXRzYWN5cmlsbGljID0gMHgwNDc1OworICB0Lml6aGl0c2FkYmxncmF2ZWN5cmlsbGljID0gMHgwNDc3OworICB0LmogPSAweDAwNmE7CisgIHQuamFhcm1lbmlhbiA9IDB4MDU3MTsKKyAgdC5qYWJlbmdhbGkgPSAweDA5OWM7CisgIHQuamFkZXZhID0gMHgwOTFjOworICB0LmphZ3VqYXJhdGkgPSAweDBhOWM7CisgIHQuamFndXJtdWtoaSA9IDB4MGExYzsKKyAgdC5qYm9wb21vZm8gPSAweDMxMTA7CisgIHQuamNhcm9uID0gMHgwMWYwOworICB0LmpjaXJjbGUgPSAweDI0ZDk7CisgIHQuamNpcmN1bWZsZXggPSAweDAxMzU7CisgIHQuamNyb3NzZWR0YWlsID0gMHgwMjlkOworICB0Lmpkb3RsZXNzc3Ryb2tlID0gMHgwMjVmOworICB0LmplY3lyaWxsaWMgPSAweDA0NTg7CisgIHQuamVlbWFyYWJpYyA9IDB4MDYyYzsKKyAgdC5qZWVtZmluYWxhcmFiaWMgPSAweGZlOWU7CisgIHQuamVlbWluaXRpYWxhcmFiaWMgPSAweGZlOWY7CisgIHQuamVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVhMDsKKyAgdC5qZWhhcmFiaWMgPSAweDA2OTg7CisgIHQuamVoZmluYWxhcmFiaWMgPSAweGZiOGI7CisgIHQuamhhYmVuZ2FsaSA9IDB4MDk5ZDsKKyAgdC5qaGFkZXZhID0gMHgwOTFkOworICB0LmpoYWd1amFyYXRpID0gMHgwYTlkOworICB0LmpoYWd1cm11a2hpID0gMHgwYTFkOworICB0LmpoZWhhcm1lbmlhbiA9IDB4MDU3YjsKKyAgdC5qaXMgPSAweDMwMDQ7CisgIHQuam1vbm9zcGFjZSA9IDB4ZmY0YTsKKyAgdC5qcGFyZW4gPSAweDI0YTU7CisgIHQuanN1cGVyaW9yID0gMHgwMmIyOworICB0LmsgPSAweDAwNmI7CisgIHQua2FiYXNoa2lyY3lyaWxsaWMgPSAweDA0YTE7CisgIHQua2FiZW5nYWxpID0gMHgwOTk1OworICB0LmthY3V0ZSA9IDB4MWUzMTsKKyAgdC5rYWN5cmlsbGljID0gMHgwNDNhOworICB0LmthZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OWI7CisgIHQua2FkZXZhID0gMHgwOTE1OworICB0LmthZiA9IDB4MDVkYjsKKyAgdC5rYWZhcmFiaWMgPSAweDA2NDM7CisgIHQua2FmZGFnZXNoID0gMHhmYjNiOworICB0LmthZmRhZ2VzaGhlYnJldyA9IDB4ZmIzYjsKKyAgdC5rYWZmaW5hbGFyYWJpYyA9IDB4ZmVkYTsKKyAgdC5rYWZoZWJyZXcgPSAweDA1ZGI7CisgIHQua2FmaW5pdGlhbGFyYWJpYyA9IDB4ZmVkYjsKKyAgdC5rYWZtZWRpYWxhcmFiaWMgPSAweGZlZGM7CisgIHQua2FmcmFmZWhlYnJldyA9IDB4ZmI0ZDsKKyAgdC5rYWd1amFyYXRpID0gMHgwYTk1OworICB0LmthZ3VybXVraGkgPSAweDBhMTU7CisgIHQua2FoaXJhZ2FuYSA9IDB4MzA0YjsKKyAgdC5rYWhvb2tjeXJpbGxpYyA9IDB4MDRjNDsKKyAgdC5rYWthdGFrYW5hID0gMHgzMGFiOworICB0Lmtha2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzY7CisgIHQua2FwcGEgPSAweDAzYmE7CisgIHQua2FwcGFzeW1ib2xncmVlayA9IDB4MDNmMDsKKyAgdC5rYXB5ZW91bm1pZXVta29yZWFuID0gMHgzMTcxOworICB0LmthcHllb3VucGhpZXVwaGtvcmVhbiA9IDB4MzE4NDsKKyAgdC5rYXB5ZW91bnBpZXVwa29yZWFuID0gMHgzMTc4OworICB0LmthcHllb3Vuc3NhbmdwaWV1cGtvcmVhbiA9IDB4MzE3OTsKKyAgdC5rYXJvcmlpc3F1YXJlID0gMHgzMzBkOworICB0Lmthc2hpZGFhdXRvYXJhYmljID0gMHgwNjQwOworICB0Lmthc2hpZGFhdXRvbm9zaWRlYmVhcmluZ2FyYWJpYyA9IDB4MDY0MDsKKyAgdC5rYXNtYWxsa2F0YWthbmEgPSAweDMwZjU7CisgIHQua2FzcXVhcmUgPSAweDMzODQ7CisgIHQua2FzcmFhcmFiaWMgPSAweDA2NTA7CisgIHQua2FzcmF0YW5hcmFiaWMgPSAweDA2NGQ7CisgIHQua2FzdHJva2VjeXJpbGxpYyA9IDB4MDQ5ZjsKKyAgdC5rYXRhaGlyYXByb2xvbmdtYXJraGFsZndpZHRoID0gMHhmZjcwOworICB0LmthdmVydGljYWxzdHJva2VjeXJpbGxpYyA9IDB4MDQ5ZDsKKyAgdC5rYm9wb21vZm8gPSAweDMxMGU7CisgIHQua2NhbHNxdWFyZSA9IDB4MzM4OTsKKyAgdC5rY2Fyb24gPSAweDAxZTk7CisgIHQua2NlZGlsbGEgPSAweDAxMzc7CisgIHQua2NpcmNsZSA9IDB4MjRkYTsKKyAgdC5rY29tbWFhY2NlbnQgPSAweDAxMzc7CisgIHQua2RvdGJlbG93ID0gMHgxZTMzOworICB0LmtlaGFybWVuaWFuID0gMHgwNTg0OworICB0LmtlaGlyYWdhbmEgPSAweDMwNTE7CisgIHQua2VrYXRha2FuYSA9IDB4MzBiMTsKKyAgdC5rZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc5OworICB0LmtlbmFybWVuaWFuID0gMHgwNTZmOworICB0Lmtlc21hbGxrYXRha2FuYSA9IDB4MzBmNjsKKyAgdC5rZ3JlZW5sYW5kaWMgPSAweDAxMzg7CisgIHQua2hhYmVuZ2FsaSA9IDB4MDk5NjsKKyAgdC5raGFjeXJpbGxpYyA9IDB4MDQ0NTsKKyAgdC5raGFkZXZhID0gMHgwOTE2OworICB0LmtoYWd1amFyYXRpID0gMHgwYTk2OworICB0LmtoYWd1cm11a2hpID0gMHgwYTE2OworICB0LmtoYWhhcmFiaWMgPSAweDA2MmU7CisgIHQua2hhaGZpbmFsYXJhYmljID0gMHhmZWE2OworICB0LmtoYWhpbml0aWFsYXJhYmljID0gMHhmZWE3OworICB0LmtoYWhtZWRpYWxhcmFiaWMgPSAweGZlYTg7CisgIHQua2hlaWNvcHRpYyA9IDB4MDNlNzsKKyAgdC5raGhhZGV2YSA9IDB4MDk1OTsKKyAgdC5raGhhZ3VybXVraGkgPSAweDBhNTk7CisgIHQua2hpZXVraGFjaXJjbGVrb3JlYW4gPSAweDMyNzg7CisgIHQua2hpZXVraGFwYXJlbmtvcmVhbiA9IDB4MzIxODsKKyAgdC5raGlldWtoY2lyY2xla29yZWFuID0gMHgzMjZhOworICB0LmtoaWV1a2hrb3JlYW4gPSAweDMxNGI7CisgIHQua2hpZXVraHBhcmVua29yZWFuID0gMHgzMjBhOworICB0Lmtob2toYWl0aGFpID0gMHgwZTAyOworICB0Lmtob2tob250aGFpID0gMHgwZTA1OworICB0Lmtob2todWF0dGhhaSA9IDB4MGUwMzsKKyAgdC5raG9raHdhaXRoYWkgPSAweDBlMDQ7CisgIHQua2hvbXV0dGhhaSA9IDB4MGU1YjsKKyAgdC5raG9vayA9IDB4MDE5OTsKKyAgdC5raG9yYWtoYW5ndGhhaSA9IDB4MGUwNjsKKyAgdC5raHpzcXVhcmUgPSAweDMzOTE7CisgIHQua2loaXJhZ2FuYSA9IDB4MzA0ZDsKKyAgdC5raWthdGFrYW5hID0gMHgzMGFkOworICB0Lmtpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzc7CisgIHQua2lyb2d1cmFtdXNxdWFyZSA9IDB4MzMxNTsKKyAgdC5raXJvbWVldG9ydXNxdWFyZSA9IDB4MzMxNjsKKyAgdC5raXJvc3F1YXJlID0gMHgzMzE0OworICB0LmtpeWVva2FjaXJjbGVrb3JlYW4gPSAweDMyNmU7CisgIHQua2l5ZW9rYXBhcmVua29yZWFuID0gMHgzMjBlOworICB0LmtpeWVva2NpcmNsZWtvcmVhbiA9IDB4MzI2MDsKKyAgdC5raXllb2trb3JlYW4gPSAweDMxMzE7CisgIHQua2l5ZW9rcGFyZW5rb3JlYW4gPSAweDMyMDA7CisgIHQua2l5ZW9rc2lvc2tvcmVhbiA9IDB4MzEzMzsKKyAgdC5ramVjeXJpbGxpYyA9IDB4MDQ1YzsKKyAgdC5rbGluZWJlbG93ID0gMHgxZTM1OworICB0Lmtsc3F1YXJlID0gMHgzMzk4OworICB0LmttY3ViZWRzcXVhcmUgPSAweDMzYTY7CisgIHQua21vbm9zcGFjZSA9IDB4ZmY0YjsKKyAgdC5rbXNxdWFyZWRzcXVhcmUgPSAweDMzYTI7CisgIHQua29oaXJhZ2FuYSA9IDB4MzA1MzsKKyAgdC5rb2htc3F1YXJlID0gMHgzM2MwOworICB0Lmtva2FpdGhhaSA9IDB4MGUwMTsKKyAgdC5rb2thdGFrYW5hID0gMHgzMGIzOworICB0Lmtva2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2E7CisgIHQua29vcG9zcXVhcmUgPSAweDMzMWU7CisgIHQua29wcGFjeXJpbGxpYyA9IDB4MDQ4MTsKKyAgdC5rb3JlYW5zdGFuZGFyZHN5bWJvbCA9IDB4MzI3ZjsKKyAgdC5rb3JvbmlzY21iID0gMHgwMzQzOworICB0LmtwYXJlbiA9IDB4MjRhNjsKKyAgdC5rcGFzcXVhcmUgPSAweDMzYWE7CisgIHQua3NpY3lyaWxsaWMgPSAweDA0NmY7CisgIHQua3RzcXVhcmUgPSAweDMzY2Y7CisgIHQua3R1cm5lZCA9IDB4MDI5ZTsKKyAgdC5rdWhpcmFnYW5hID0gMHgzMDRmOworICB0Lmt1a2F0YWthbmEgPSAweDMwYWY7CisgIHQua3VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ODsKKyAgdC5rdnNxdWFyZSA9IDB4MzNiODsKKyAgdC5rd3NxdWFyZSA9IDB4MzNiZTsKKyAgdC5sID0gMHgwMDZjOworICB0LmxhYmVuZ2FsaSA9IDB4MDliMjsKKyAgdC5sYWN1dGUgPSAweDAxM2E7CisgIHQubGFkZXZhID0gMHgwOTMyOworICB0LmxhZ3VqYXJhdGkgPSAweDBhYjI7CisgIHQubGFndXJtdWtoaSA9IDB4MGEzMjsKKyAgdC5sYWtraGFuZ3lhb3RoYWkgPSAweDBlNDU7CisgIHQubGFtYWxlZmZpbmFsYXJhYmljID0gMHhmZWZjOworICB0LmxhbWFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlZjg7CisgIHQubGFtYWxlZmhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmVmNzsKKyAgdC5sYW1hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljID0gMHhmZWZhOworICB0LmxhbWFsZWZoYW16YWJlbG93aXNvbGF0ZWRhcmFiaWMgPSAweGZlZjk7CisgIHQubGFtYWxlZmlzb2xhdGVkYXJhYmljID0gMHhmZWZiOworICB0LmxhbWFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlZjY7CisgIHQubGFtYWxlZm1hZGRhYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmVmNTsKKyAgdC5sYW1hcmFiaWMgPSAweDA2NDQ7CisgIHQubGFtYmRhID0gMHgwM2JiOworICB0LmxhbWJkYXN0cm9rZSA9IDB4MDE5YjsKKyAgdC5sYW1lZCA9IDB4MDVkYzsKKyAgdC5sYW1lZGRhZ2VzaCA9IDB4ZmIzYzsKKyAgdC5sYW1lZGRhZ2VzaGhlYnJldyA9IDB4ZmIzYzsKKyAgdC5sYW1lZGhlYnJldyA9IDB4MDVkYzsKKyAgdC5sYW1maW5hbGFyYWJpYyA9IDB4ZmVkZTsKKyAgdC5sYW1oYWhpbml0aWFsYXJhYmljID0gMHhmY2NhOworICB0LmxhbWluaXRpYWxhcmFiaWMgPSAweGZlZGY7CisgIHQubGFtamVlbWluaXRpYWxhcmFiaWMgPSAweGZjYzk7CisgIHQubGFta2hhaGluaXRpYWxhcmFiaWMgPSAweGZjY2I7CisgIHQubGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWMgPSAweGZkZjI7CisgIHQubGFtbWVkaWFsYXJhYmljID0gMHhmZWUwOworICB0LmxhbW1lZW1oYWhpbml0aWFsYXJhYmljID0gMHhmZDg4OworICB0LmxhbW1lZW1pbml0aWFsYXJhYmljID0gMHhmY2NjOworICB0LmxhcmdlY2lyY2xlID0gMHgyNWVmOworICB0LmxiYXIgPSAweDAxOWE7CisgIHQubGJlbHQgPSAweDAyNmM7CisgIHQubGJvcG9tb2ZvID0gMHgzMTBjOworICB0LmxjYXJvbiA9IDB4MDEzZTsKKyAgdC5sY2VkaWxsYSA9IDB4MDEzYzsKKyAgdC5sY2lyY2xlID0gMHgyNGRiOworICB0LmxjaXJjdW1mbGV4YmVsb3cgPSAweDFlM2Q7CisgIHQubGNvbW1hYWNjZW50ID0gMHgwMTNjOworICB0Lmxkb3QgPSAweDAxNDA7CisgIHQubGRvdGFjY2VudCA9IDB4MDE0MDsKKyAgdC5sZG90YmVsb3cgPSAweDFlMzc7CisgIHQubGRvdGJlbG93bWFjcm9uID0gMHgxZTM5OworICB0LmxlZnRhbmdsZWFib3ZlY21iID0gMHgwMzFhOworICB0LmxlZnR0YWNrYmVsb3djbWIgPSAweDAzMTg7CisgIHQubGVzcyA9IDB4MDAzYzsKKyAgdC5sZXNzZXF1YWwgPSAweDIyNjQ7CisgIHQubGVzc2VxdWFsb3JncmVhdGVyID0gMHgyMmRhOworICB0Lmxlc3Ntb25vc3BhY2UgPSAweGZmMWM7CisgIHQubGVzc29yZXF1aXZhbGVudCA9IDB4MjI3MjsKKyAgdC5sZXNzb3JncmVhdGVyID0gMHgyMjc2OworICB0Lmxlc3NvdmVyZXF1YWwgPSAweDIyNjY7CisgIHQubGVzc3NtYWxsID0gMHhmZTY0OworICB0LmxlemggPSAweDAyNmU7CisgIHQubGZibG9jayA9IDB4MjU4YzsKKyAgdC5saG9va3JldHJvZmxleCA9IDB4MDI2ZDsKKyAgdC5saXJhID0gMHgyMGE0OworICB0Lmxpd25hcm1lbmlhbiA9IDB4MDU2YzsKKyAgdC5saiA9IDB4MDFjOTsKKyAgdC5samVjeXJpbGxpYyA9IDB4MDQ1OTsKKyAgdC5sbCA9IDB4ZjZjMDsKKyAgdC5sbGFkZXZhID0gMHgwOTMzOworICB0LmxsYWd1amFyYXRpID0gMHgwYWIzOworICB0LmxsaW5lYmVsb3cgPSAweDFlM2I7CisgIHQubGxsYWRldmEgPSAweDA5MzQ7CisgIHQubGx2b2NhbGljYmVuZ2FsaSA9IDB4MDllMTsKKyAgdC5sbHZvY2FsaWNkZXZhID0gMHgwOTYxOworICB0Lmxsdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5ZTM7CisgIHQubGx2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk2MzsKKyAgdC5sbWlkZGxldGlsZGUgPSAweDAyNmI7CisgIHQubG1vbm9zcGFjZSA9IDB4ZmY0YzsKKyAgdC5sbXNxdWFyZSA9IDB4MzNkMDsKKyAgdC5sb2NodWxhdGhhaSA9IDB4MGUyYzsKKyAgdC5sb2dpY2FsYW5kID0gMHgyMjI3OworICB0LmxvZ2ljYWxub3QgPSAweDAwYWM7CisgIHQubG9naWNhbG5vdHJldmVyc2VkID0gMHgyMzEwOworICB0LmxvZ2ljYWxvciA9IDB4MjIyODsKKyAgdC5sb2xpbmd0aGFpID0gMHgwZTI1OworICB0LmxvbmdzID0gMHgwMTdmOworICB0Lmxvd2xpbmVjZW50ZXJsaW5lID0gMHhmZTRlOworICB0Lmxvd2xpbmVjbWIgPSAweDAzMzI7CisgIHQubG93bGluZWRhc2hlZCA9IDB4ZmU0ZDsKKyAgdC5sb3plbmdlID0gMHgyNWNhOworICB0LmxwYXJlbiA9IDB4MjRhNzsKKyAgdC5sc2xhc2ggPSAweDAxNDI7CisgIHQubHNxdWFyZSA9IDB4MjExMzsKKyAgdC5sc3VwZXJpb3IgPSAweGY2ZWU7CisgIHQubHRzaGFkZSA9IDB4MjU5MTsKKyAgdC5sdXRoYWkgPSAweDBlMjY7CisgIHQubHZvY2FsaWNiZW5nYWxpID0gMHgwOThjOworICB0Lmx2b2NhbGljZGV2YSA9IDB4MDkwYzsKKyAgdC5sdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5ZTI7CisgIHQubHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYyOworICB0Lmx4c3F1YXJlID0gMHgzM2QzOworICB0Lm0gPSAweDAwNmQ7CisgIHQubWFiZW5nYWxpID0gMHgwOWFlOworICB0Lm1hY3JvbiA9IDB4MDBhZjsKKyAgdC5tYWNyb25iZWxvd2NtYiA9IDB4MDMzMTsKKyAgdC5tYWNyb25jbWIgPSAweDAzMDQ7CisgIHQubWFjcm9ubG93bW9kID0gMHgwMmNkOworICB0Lm1hY3Jvbm1vbm9zcGFjZSA9IDB4ZmZlMzsKKyAgdC5tYWN1dGUgPSAweDFlM2Y7CisgIHQubWFkZXZhID0gMHgwOTJlOworICB0Lm1hZ3VqYXJhdGkgPSAweDBhYWU7CisgIHQubWFndXJtdWtoaSA9IDB4MGEyZTsKKyAgdC5tYWhhcGFraGhlYnJldyA9IDB4MDVhNDsKKyAgdC5tYWhhcGFraGxlZnRoZWJyZXcgPSAweDA1YTQ7CisgIHQubWFoaXJhZ2FuYSA9IDB4MzA3ZTsKKyAgdC5tYWljaGF0dGF3YWxvd2xlZnR0aGFpID0gMHhmODk1OworICB0Lm1haWNoYXR0YXdhbG93cmlnaHR0aGFpID0gMHhmODk0OworICB0Lm1haWNoYXR0YXdhdGhhaSA9IDB4MGU0YjsKKyAgdC5tYWljaGF0dGF3YXVwcGVybGVmdHRoYWkgPSAweGY4OTM7CisgIHQubWFpZWtsb3dsZWZ0dGhhaSA9IDB4Zjg4YzsKKyAgdC5tYWlla2xvd3JpZ2h0dGhhaSA9IDB4Zjg4YjsKKyAgdC5tYWlla3RoYWkgPSAweDBlNDg7CisgIHQubWFpZWt1cHBlcmxlZnR0aGFpID0gMHhmODhhOworICB0Lm1haWhhbmFrYXRsZWZ0dGhhaSA9IDB4Zjg4NDsKKyAgdC5tYWloYW5ha2F0dGhhaSA9IDB4MGUzMTsKKyAgdC5tYWl0YWlraHVsZWZ0dGhhaSA9IDB4Zjg4OTsKKyAgdC5tYWl0YWlraHV0aGFpID0gMHgwZTQ3OworICB0Lm1haXRob2xvd2xlZnR0aGFpID0gMHhmODhmOworICB0Lm1haXRob2xvd3JpZ2h0dGhhaSA9IDB4Zjg4ZTsKKyAgdC5tYWl0aG90aGFpID0gMHgwZTQ5OworICB0Lm1haXRob3VwcGVybGVmdHRoYWkgPSAweGY4OGQ7CisgIHQubWFpdHJpbG93bGVmdHRoYWkgPSAweGY4OTI7CisgIHQubWFpdHJpbG93cmlnaHR0aGFpID0gMHhmODkxOworICB0Lm1haXRyaXRoYWkgPSAweDBlNGE7CisgIHQubWFpdHJpdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MDsKKyAgdC5tYWl5YW1va3RoYWkgPSAweDBlNDY7CisgIHQubWFrYXRha2FuYSA9IDB4MzBkZTsKKyAgdC5tYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhmOworICB0Lm1hbGUgPSAweDI2NDI7CisgIHQubWFuc3lvbnNxdWFyZSA9IDB4MzM0NzsKKyAgdC5tYXFhZmhlYnJldyA9IDB4MDViZTsKKyAgdC5tYXJzID0gMHgyNjQyOworICB0Lm1hc29yYWNpcmNsZWhlYnJldyA9IDB4MDVhZjsKKyAgdC5tYXNxdWFyZSA9IDB4MzM4MzsKKyAgdC5tYm9wb21vZm8gPSAweDMxMDc7CisgIHQubWJzcXVhcmUgPSAweDMzZDQ7CisgIHQubWNpcmNsZSA9IDB4MjRkYzsKKyAgdC5tY3ViZWRzcXVhcmUgPSAweDMzYTU7CisgIHQubWRvdGFjY2VudCA9IDB4MWU0MTsKKyAgdC5tZG90YmVsb3cgPSAweDFlNDM7CisgIHQubWVlbWFyYWJpYyA9IDB4MDY0NTsKKyAgdC5tZWVtZmluYWxhcmFiaWMgPSAweGZlZTI7CisgIHQubWVlbWluaXRpYWxhcmFiaWMgPSAweGZlZTM7CisgIHQubWVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVlNDsKKyAgdC5tZWVtbWVlbWluaXRpYWxhcmFiaWMgPSAweGZjZDE7CisgIHQubWVlbW1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0ODsKKyAgdC5tZWV0b3J1c3F1YXJlID0gMHgzMzRkOworICB0Lm1laGlyYWdhbmEgPSAweDMwODE7CisgIHQubWVpemllcmFzcXVhcmUgPSAweDMzN2U7CisgIHQubWVrYXRha2FuYSA9IDB4MzBlMTsKKyAgdC5tZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkyOworICB0Lm1lbSA9IDB4MDVkZTsKKyAgdC5tZW1kYWdlc2ggPSAweGZiM2U7CisgIHQubWVtZGFnZXNoaGVicmV3ID0gMHhmYjNlOworICB0Lm1lbWhlYnJldyA9IDB4MDVkZTsKKyAgdC5tZW5hcm1lbmlhbiA9IDB4MDU3NDsKKyAgdC5tZXJraGFoZWJyZXcgPSAweDA1YTU7CisgIHQubWVya2hha2VmdWxhaGVicmV3ID0gMHgwNWE2OworICB0Lm1lcmtoYWtlZnVsYWxlZnRoZWJyZXcgPSAweDA1YTY7CisgIHQubWVya2hhbGVmdGhlYnJldyA9IDB4MDVhNTsKKyAgdC5taG9vayA9IDB4MDI3MTsKKyAgdC5taHpzcXVhcmUgPSAweDMzOTI7CisgIHQubWlkZGxlZG90a2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjU7CisgIHQubWlkZG90ID0gMHgwMGI3OworICB0Lm1pZXVtYWNpcmNsZWtvcmVhbiA9IDB4MzI3MjsKKyAgdC5taWV1bWFwYXJlbmtvcmVhbiA9IDB4MzIxMjsKKyAgdC5taWV1bWNpcmNsZWtvcmVhbiA9IDB4MzI2NDsKKyAgdC5taWV1bWtvcmVhbiA9IDB4MzE0MTsKKyAgdC5taWV1bXBhbnNpb3Nrb3JlYW4gPSAweDMxNzA7CisgIHQubWlldW1wYXJlbmtvcmVhbiA9IDB4MzIwNDsKKyAgdC5taWV1bXBpZXVwa29yZWFuID0gMHgzMTZlOworICB0Lm1pZXVtc2lvc2tvcmVhbiA9IDB4MzE2ZjsKKyAgdC5taWhpcmFnYW5hID0gMHgzMDdmOworICB0Lm1pa2F0YWthbmEgPSAweDMwZGY7CisgIHQubWlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MDsKKyAgdC5taW51cyA9IDB4MjIxMjsKKyAgdC5taW51c2JlbG93Y21iID0gMHgwMzIwOworICB0Lm1pbnVzY2lyY2xlID0gMHgyMjk2OworICB0Lm1pbnVzbW9kID0gMHgwMmQ3OworICB0Lm1pbnVzcGx1cyA9IDB4MjIxMzsKKyAgdC5taW51dGUgPSAweDIwMzI7CisgIHQubWlyaWJhYXJ1c3F1YXJlID0gMHgzMzRhOworICB0Lm1pcmlzcXVhcmUgPSAweDMzNDk7CisgIHQubWxvbmdsZWd0dXJuZWQgPSAweDAyNzA7CisgIHQubWxzcXVhcmUgPSAweDMzOTY7CisgIHQubW1jdWJlZHNxdWFyZSA9IDB4MzNhMzsKKyAgdC5tbW9ub3NwYWNlID0gMHhmZjRkOworICB0Lm1tc3F1YXJlZHNxdWFyZSA9IDB4MzM5ZjsKKyAgdC5tb2hpcmFnYW5hID0gMHgzMDgyOworICB0Lm1vaG1zcXVhcmUgPSAweDMzYzE7CisgIHQubW9rYXRha2FuYSA9IDB4MzBlMjsKKyAgdC5tb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjkzOworICB0Lm1vbHNxdWFyZSA9IDB4MzNkNjsKKyAgdC5tb21hdGhhaSA9IDB4MGUyMTsKKyAgdC5tb3ZlcnNzcXVhcmUgPSAweDMzYTc7CisgIHQubW92ZXJzc3F1YXJlZHNxdWFyZSA9IDB4MzNhODsKKyAgdC5tcGFyZW4gPSAweDI0YTg7CisgIHQubXBhc3F1YXJlID0gMHgzM2FiOworICB0Lm1zc3F1YXJlID0gMHgzM2IzOworICB0Lm1zdXBlcmlvciA9IDB4ZjZlZjsKKyAgdC5tdHVybmVkID0gMHgwMjZmOworICB0Lm11ID0gMHgwMGI1OworICB0Lm11MSA9IDB4MDBiNTsKKyAgdC5tdWFzcXVhcmUgPSAweDMzODI7CisgIHQubXVjaGdyZWF0ZXIgPSAweDIyNmI7CisgIHQubXVjaGxlc3MgPSAweDIyNmE7CisgIHQubXVmc3F1YXJlID0gMHgzMzhjOworICB0Lm11Z3JlZWsgPSAweDAzYmM7CisgIHQubXVnc3F1YXJlID0gMHgzMzhkOworICB0Lm11aGlyYWdhbmEgPSAweDMwODA7CisgIHQubXVrYXRha2FuYSA9IDB4MzBlMDsKKyAgdC5tdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkxOworICB0Lm11bHNxdWFyZSA9IDB4MzM5NTsKKyAgdC5tdWx0aXBseSA9IDB4MDBkNzsKKyAgdC5tdW1zcXVhcmUgPSAweDMzOWI7CisgIHQubXVuYWhoZWJyZXcgPSAweDA1YTM7CisgIHQubXVuYWhsZWZ0aGVicmV3ID0gMHgwNWEzOworICB0Lm11c2ljYWxub3RlID0gMHgyNjZhOworICB0Lm11c2ljYWxub3RlZGJsID0gMHgyNjZiOworICB0Lm11c2ljZmxhdHNpZ24gPSAweDI2NmQ7CisgIHQubXVzaWNzaGFycHNpZ24gPSAweDI2NmY7CisgIHQubXVzc3F1YXJlID0gMHgzM2IyOworICB0Lm11dnNxdWFyZSA9IDB4MzNiNjsKKyAgdC5tdXdzcXVhcmUgPSAweDMzYmM7CisgIHQubXZtZWdhc3F1YXJlID0gMHgzM2I5OworICB0Lm12c3F1YXJlID0gMHgzM2I3OworICB0Lm13bWVnYXNxdWFyZSA9IDB4MzNiZjsKKyAgdC5td3NxdWFyZSA9IDB4MzNiZDsKKyAgdC5uID0gMHgwMDZlOworICB0Lm5hYmVuZ2FsaSA9IDB4MDlhODsKKyAgdC5uYWJsYSA9IDB4MjIwNzsKKyAgdC5uYWN1dGUgPSAweDAxNDQ7CisgIHQubmFkZXZhID0gMHgwOTI4OworICB0Lm5hZ3VqYXJhdGkgPSAweDBhYTg7CisgIHQubmFndXJtdWtoaSA9IDB4MGEyODsKKyAgdC5uYWhpcmFnYW5hID0gMHgzMDZhOworICB0Lm5ha2F0YWthbmEgPSAweDMwY2E7CisgIHQubmFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NTsKKyAgdC5uYXBvc3Ryb3BoZSA9IDB4MDE0OTsKKyAgdC5uYXNxdWFyZSA9IDB4MzM4MTsKKyAgdC5uYm9wb21vZm8gPSAweDMxMGI7CisgIHQubmJzcGFjZSA9IDB4MDBhMDsKKyAgdC5uY2Fyb24gPSAweDAxNDg7CisgIHQubmNlZGlsbGEgPSAweDAxNDY7CisgIHQubmNpcmNsZSA9IDB4MjRkZDsKKyAgdC5uY2lyY3VtZmxleGJlbG93ID0gMHgxZTRiOworICB0Lm5jb21tYWFjY2VudCA9IDB4MDE0NjsKKyAgdC5uZG90YWNjZW50ID0gMHgxZTQ1OworICB0Lm5kb3RiZWxvdyA9IDB4MWU0NzsKKyAgdC5uZWhpcmFnYW5hID0gMHgzMDZkOworICB0Lm5la2F0YWthbmEgPSAweDMwY2Q7CisgIHQubmVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ODsKKyAgdC5uZXdzaGVxZWxzaWduID0gMHgyMGFhOworICB0Lm5mc3F1YXJlID0gMHgzMzhiOworICB0Lm5nYWJlbmdhbGkgPSAweDA5OTk7CisgIHQubmdhZGV2YSA9IDB4MDkxOTsKKyAgdC5uZ2FndWphcmF0aSA9IDB4MGE5OTsKKyAgdC5uZ2FndXJtdWtoaSA9IDB4MGExOTsKKyAgdC5uZ29uZ3V0aGFpID0gMHgwZTA3OworICB0Lm5oaXJhZ2FuYSA9IDB4MzA5MzsKKyAgdC5uaG9va2xlZnQgPSAweDAyNzI7CisgIHQubmhvb2tyZXRyb2ZsZXggPSAweDAyNzM7CisgIHQubmlldW5hY2lyY2xla29yZWFuID0gMHgzMjZmOworICB0Lm5pZXVuYXBhcmVua29yZWFuID0gMHgzMjBmOworICB0Lm5pZXVuY2lldWNrb3JlYW4gPSAweDMxMzU7CisgIHQubmlldW5jaXJjbGVrb3JlYW4gPSAweDMyNjE7CisgIHQubmlldW5oaWV1aGtvcmVhbiA9IDB4MzEzNjsKKyAgdC5uaWV1bmtvcmVhbiA9IDB4MzEzNDsKKyAgdC5uaWV1bnBhbnNpb3Nrb3JlYW4gPSAweDMxNjg7CisgIHQubmlldW5wYXJlbmtvcmVhbiA9IDB4MzIwMTsKKyAgdC5uaWV1bnNpb3Nrb3JlYW4gPSAweDMxNjc7CisgIHQubmlldW50aWtldXRrb3JlYW4gPSAweDMxNjY7CisgIHQubmloaXJhZ2FuYSA9IDB4MzA2YjsKKyAgdC5uaWthdGFrYW5hID0gMHgzMGNiOworICB0Lm5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmODY7CisgIHQubmlraGFoaXRsZWZ0dGhhaSA9IDB4Zjg5OTsKKyAgdC5uaWtoYWhpdHRoYWkgPSAweDBlNGQ7CisgIHQubmluZSA9IDB4MDAzOTsKKyAgdC5uaW5lYXJhYmljID0gMHgwNjY5OworICB0Lm5pbmViZW5nYWxpID0gMHgwOWVmOworICB0Lm5pbmVjaXJjbGUgPSAweDI0Njg7CisgIHQubmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OTI7CisgIHQubmluZWRldmEgPSAweDA5NmY7CisgIHQubmluZWd1amFyYXRpID0gMHgwYWVmOworICB0Lm5pbmVndXJtdWtoaSA9IDB4MGE2ZjsKKyAgdC5uaW5laGFja2FyYWJpYyA9IDB4MDY2OTsKKyAgdC5uaW5laGFuZ3pob3UgPSAweDMwMjk7CisgIHQubmluZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjg7CisgIHQubmluZWluZmVyaW9yID0gMHgyMDg5OworICB0Lm5pbmVtb25vc3BhY2UgPSAweGZmMTk7CisgIHQubmluZW9sZHN0eWxlID0gMHhmNzM5OworICB0Lm5pbmVwYXJlbiA9IDB4MjQ3YzsKKyAgdC5uaW5lcGVyaW9kID0gMHgyNDkwOworICB0Lm5pbmVwZXJzaWFuID0gMHgwNmY5OworICB0Lm5pbmVyb21hbiA9IDB4MjE3ODsKKyAgdC5uaW5lc3VwZXJpb3IgPSAweDIwNzk7CisgIHQubmluZXRlZW5jaXJjbGUgPSAweDI0NzI7CisgIHQubmluZXRlZW5wYXJlbiA9IDB4MjQ4NjsKKyAgdC5uaW5ldGVlbnBlcmlvZCA9IDB4MjQ5YTsKKyAgdC5uaW5ldGhhaSA9IDB4MGU1OTsKKyAgdC5uaiA9IDB4MDFjYzsKKyAgdC5uamVjeXJpbGxpYyA9IDB4MDQ1YTsKKyAgdC5ua2F0YWthbmEgPSAweDMwZjM7CisgIHQubmthdGFrYW5haGFsZndpZHRoID0gMHhmZjlkOworICB0Lm5sZWdyaWdodGxvbmcgPSAweDAxOWU7CisgIHQubmxpbmViZWxvdyA9IDB4MWU0OTsKKyAgdC5ubW9ub3NwYWNlID0gMHhmZjRlOworICB0Lm5tc3F1YXJlID0gMHgzMzlhOworICB0Lm5uYWJlbmdhbGkgPSAweDA5YTM7CisgIHQubm5hZGV2YSA9IDB4MDkyMzsKKyAgdC5ubmFndWphcmF0aSA9IDB4MGFhMzsKKyAgdC5ubmFndXJtdWtoaSA9IDB4MGEyMzsKKyAgdC5ubm5hZGV2YSA9IDB4MDkyOTsKKyAgdC5ub2hpcmFnYW5hID0gMHgzMDZlOworICB0Lm5va2F0YWthbmEgPSAweDMwY2U7CisgIHQubm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4OTsKKyAgdC5ub25icmVha2luZ3NwYWNlID0gMHgwMGEwOworICB0Lm5vbmVudGhhaSA9IDB4MGUxMzsKKyAgdC5ub251dGhhaSA9IDB4MGUxOTsKKyAgdC5ub29uYXJhYmljID0gMHgwNjQ2OworICB0Lm5vb25maW5hbGFyYWJpYyA9IDB4ZmVlNjsKKyAgdC5ub29uZ2h1bm5hYXJhYmljID0gMHgwNmJhOworICB0Lm5vb25naHVubmFmaW5hbGFyYWJpYyA9IDB4ZmI5ZjsKKyAgdC5ub29uaW5pdGlhbGFyYWJpYyA9IDB4ZmVlNzsKKyAgdC5ub29uamVlbWluaXRpYWxhcmFiaWMgPSAweGZjZDI7CisgIHQubm9vbmplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0YjsKKyAgdC5ub29ubWVkaWFsYXJhYmljID0gMHhmZWU4OworICB0Lm5vb25tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkNTsKKyAgdC5ub29ubWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzRlOworICB0Lm5vb25ub29uZmluYWxhcmFiaWMgPSAweGZjOGQ7CisgIHQubm90Y29udGFpbnMgPSAweDIyMGM7CisgIHQubm90ZWxlbWVudCA9IDB4MjIwOTsKKyAgdC5ub3RlbGVtZW50b2YgPSAweDIyMDk7CisgIHQubm90ZXF1YWwgPSAweDIyNjA7CisgIHQubm90Z3JlYXRlciA9IDB4MjI2ZjsKKyAgdC5ub3RncmVhdGVybm9yZXF1YWwgPSAweDIyNzE7CisgIHQubm90Z3JlYXRlcm5vcmxlc3MgPSAweDIyNzk7CisgIHQubm90aWRlbnRpY2FsID0gMHgyMjYyOworICB0Lm5vdGxlc3MgPSAweDIyNmU7CisgIHQubm90bGVzc25vcmVxdWFsID0gMHgyMjcwOworICB0Lm5vdHBhcmFsbGVsID0gMHgyMjI2OworICB0Lm5vdHByZWNlZGVzID0gMHgyMjgwOworICB0Lm5vdHN1YnNldCA9IDB4MjI4NDsKKyAgdC5ub3RzdWNjZWVkcyA9IDB4MjI4MTsKKyAgdC5ub3RzdXBlcnNldCA9IDB4MjI4NTsKKyAgdC5ub3dhcm1lbmlhbiA9IDB4MDU3NjsKKyAgdC5ucGFyZW4gPSAweDI0YTk7CisgIHQubnNzcXVhcmUgPSAweDMzYjE7CisgIHQubnN1cGVyaW9yID0gMHgyMDdmOworICB0Lm50aWxkZSA9IDB4MDBmMTsKKyAgdC5udSA9IDB4MDNiZDsKKyAgdC5udWhpcmFnYW5hID0gMHgzMDZjOworICB0Lm51a2F0YWthbmEgPSAweDMwY2M7CisgIHQubnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NzsKKyAgdC5udWt0YWJlbmdhbGkgPSAweDA5YmM7CisgIHQubnVrdGFkZXZhID0gMHgwOTNjOworICB0Lm51a3RhZ3VqYXJhdGkgPSAweDBhYmM7CisgIHQubnVrdGFndXJtdWtoaSA9IDB4MGEzYzsKKyAgdC5udW1iZXJzaWduID0gMHgwMDIzOworICB0Lm51bWJlcnNpZ25tb25vc3BhY2UgPSAweGZmMDM7CisgIHQubnVtYmVyc2lnbnNtYWxsID0gMHhmZTVmOworICB0Lm51bWVyYWxzaWduZ3JlZWsgPSAweDAzNzQ7CisgIHQubnVtZXJhbHNpZ25sb3dlcmdyZWVrID0gMHgwMzc1OworICB0Lm51bWVybyA9IDB4MjExNjsKKyAgdC5udW4gPSAweDA1ZTA7CisgIHQubnVuZGFnZXNoID0gMHhmYjQwOworICB0Lm51bmRhZ2VzaGhlYnJldyA9IDB4ZmI0MDsKKyAgdC5udW5oZWJyZXcgPSAweDA1ZTA7CisgIHQubnZzcXVhcmUgPSAweDMzYjU7CisgIHQubndzcXVhcmUgPSAweDMzYmI7CisgIHQubnlhYmVuZ2FsaSA9IDB4MDk5ZTsKKyAgdC5ueWFkZXZhID0gMHgwOTFlOworICB0Lm55YWd1amFyYXRpID0gMHgwYTllOworICB0Lm55YWd1cm11a2hpID0gMHgwYTFlOworICB0Lm8gPSAweDAwNmY7CisgIHQub2FjdXRlID0gMHgwMGYzOworICB0Lm9hbmd0aGFpID0gMHgwZTJkOworICB0Lm9iYXJyZWQgPSAweDAyNzU7CisgIHQub2JhcnJlZGN5cmlsbGljID0gMHgwNGU5OworICB0Lm9iYXJyZWRkaWVyZXNpc2N5cmlsbGljID0gMHgwNGViOworICB0Lm9iZW5nYWxpID0gMHgwOTkzOworICB0Lm9ib3BvbW9mbyA9IDB4MzExYjsKKyAgdC5vYnJldmUgPSAweDAxNGY7CisgIHQub2NhbmRyYWRldmEgPSAweDA5MTE7CisgIHQub2NhbmRyYWd1amFyYXRpID0gMHgwYTkxOworICB0Lm9jYW5kcmF2b3dlbHNpZ25kZXZhID0gMHgwOTQ5OworICB0Lm9jYW5kcmF2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjOTsKKyAgdC5vY2Fyb24gPSAweDAxZDI7CisgIHQub2NpcmNsZSA9IDB4MjRkZTsKKyAgdC5vY2lyY3VtZmxleCA9IDB4MDBmNDsKKyAgdC5vY2lyY3VtZmxleGFjdXRlID0gMHgxZWQxOworICB0Lm9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDk7CisgIHQub2NpcmN1bWZsZXhncmF2ZSA9IDB4MWVkMzsKKyAgdC5vY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVkNTsKKyAgdC5vY2lyY3VtZmxleHRpbGRlID0gMHgxZWQ3OworICB0Lm9jeXJpbGxpYyA9IDB4MDQzZTsKKyAgdC5vZGJsYWN1dGUgPSAweDAxNTE7CisgIHQub2RibGdyYXZlID0gMHgwMjBkOworICB0Lm9kZXZhID0gMHgwOTEzOworICB0Lm9kaWVyZXNpcyA9IDB4MDBmNjsKKyAgdC5vZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlNzsKKyAgdC5vZG90YmVsb3cgPSAweDFlY2Q7CisgIHQub2UgPSAweDAxNTM7CisgIHQub2Vrb3JlYW4gPSAweDMxNWE7CisgIHQub2dvbmVrID0gMHgwMmRiOworICB0Lm9nb25la2NtYiA9IDB4MDMyODsKKyAgdC5vZ3JhdmUgPSAweDAwZjI7CisgIHQub2d1amFyYXRpID0gMHgwYTkzOworICB0Lm9oYXJtZW5pYW4gPSAweDA1ODU7CisgIHQub2hpcmFnYW5hID0gMHgzMDRhOworICB0Lm9ob29rYWJvdmUgPSAweDFlY2Y7CisgIHQub2hvcm4gPSAweDAxYTE7CisgIHQub2hvcm5hY3V0ZSA9IDB4MWVkYjsKKyAgdC5vaG9ybmRvdGJlbG93ID0gMHgxZWUzOworICB0Lm9ob3JuZ3JhdmUgPSAweDFlZGQ7CisgIHQub2hvcm5ob29rYWJvdmUgPSAweDFlZGY7CisgIHQub2hvcm50aWxkZSA9IDB4MWVlMTsKKyAgdC5vaHVuZ2FydW1sYXV0ID0gMHgwMTUxOworICB0Lm9pID0gMHgwMWEzOworICB0Lm9pbnZlcnRlZGJyZXZlID0gMHgwMjBmOworICB0Lm9rYXRha2FuYSA9IDB4MzBhYTsKKyAgdC5va2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzU7CisgIHQub2tvcmVhbiA9IDB4MzE1NzsKKyAgdC5vbGVoZWJyZXcgPSAweDA1YWI7CisgIHQub21hY3JvbiA9IDB4MDE0ZDsKKyAgdC5vbWFjcm9uYWN1dGUgPSAweDFlNTM7CisgIHQub21hY3JvbmdyYXZlID0gMHgxZTUxOworICB0Lm9tZGV2YSA9IDB4MDk1MDsKKyAgdC5vbWVnYSA9IDB4MDNjOTsKKyAgdC5vbWVnYTEgPSAweDAzZDY7CisgIHQub21lZ2FjeXJpbGxpYyA9IDB4MDQ2MTsKKyAgdC5vbWVnYWxhdGluY2xvc2VkID0gMHgwMjc3OworICB0Lm9tZWdhcm91bmRjeXJpbGxpYyA9IDB4MDQ3YjsKKyAgdC5vbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2Q7CisgIHQub21lZ2F0b25vcyA9IDB4MDNjZTsKKyAgdC5vbWd1amFyYXRpID0gMHgwYWQwOworICB0Lm9taWNyb24gPSAweDAzYmY7CisgIHQub21pY3JvbnRvbm9zID0gMHgwM2NjOworICB0Lm9tb25vc3BhY2UgPSAweGZmNGY7CisgIHQub25lID0gMHgwMDMxOworICB0Lm9uZWFyYWJpYyA9IDB4MDY2MTsKKyAgdC5vbmViZW5nYWxpID0gMHgwOWU3OworICB0Lm9uZWNpcmNsZSA9IDB4MjQ2MDsKKyAgdC5vbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhhOworICB0Lm9uZWRldmEgPSAweDA5Njc7CisgIHQub25lZG90ZW5sZWFkZXIgPSAweDIwMjQ7CisgIHQub25lZWlnaHRoID0gMHgyMTViOworICB0Lm9uZWZpdHRlZCA9IDB4ZjZkYzsKKyAgdC5vbmVndWphcmF0aSA9IDB4MGFlNzsKKyAgdC5vbmVndXJtdWtoaSA9IDB4MGE2NzsKKyAgdC5vbmVoYWNrYXJhYmljID0gMHgwNjYxOworICB0Lm9uZWhhbGYgPSAweDAwYmQ7CisgIHQub25laGFuZ3pob3UgPSAweDMwMjE7CisgIHQub25laWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMDsKKyAgdC5vbmVpbmZlcmlvciA9IDB4MjA4MTsKKyAgdC5vbmVtb25vc3BhY2UgPSAweGZmMTE7CisgIHQub25lbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNDsKKyAgdC5vbmVvbGRzdHlsZSA9IDB4ZjczMTsKKyAgdC5vbmVwYXJlbiA9IDB4MjQ3NDsKKyAgdC5vbmVwZXJpb2QgPSAweDI0ODg7CisgIHQub25lcGVyc2lhbiA9IDB4MDZmMTsKKyAgdC5vbmVxdWFydGVyID0gMHgwMGJjOworICB0Lm9uZXJvbWFuID0gMHgyMTcwOworICB0Lm9uZXN1cGVyaW9yID0gMHgwMGI5OworICB0Lm9uZXRoYWkgPSAweDBlNTE7CisgIHQub25ldGhpcmQgPSAweDIxNTM7CisgIHQub29nb25layA9IDB4MDFlYjsKKyAgdC5vb2dvbmVrbWFjcm9uID0gMHgwMWVkOworICB0Lm9vZ3VybXVraGkgPSAweDBhMTM7CisgIHQub29tYXRyYWd1cm11a2hpID0gMHgwYTRiOworICB0Lm9vcGVuID0gMHgwMjU0OworICB0Lm9wYXJlbiA9IDB4MjRhYTsKKyAgdC5vcGVuYnVsbGV0ID0gMHgyNWU2OworICB0Lm9wdGlvbiA9IDB4MjMyNTsKKyAgdC5vcmRmZW1pbmluZSA9IDB4MDBhYTsKKyAgdC5vcmRtYXNjdWxpbmUgPSAweDAwYmE7CisgIHQub3J0aG9nb25hbCA9IDB4MjIxZjsKKyAgdC5vc2hvcnRkZXZhID0gMHgwOTEyOworICB0Lm9zaG9ydHZvd2Vsc2lnbmRldmEgPSAweDA5NGE7CisgIHQub3NsYXNoID0gMHgwMGY4OworICB0Lm9zbGFzaGFjdXRlID0gMHgwMWZmOworICB0Lm9zbWFsbGhpcmFnYW5hID0gMHgzMDQ5OworICB0Lm9zbWFsbGthdGFrYW5hID0gMHgzMGE5OworICB0Lm9zbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZiOworICB0Lm9zdHJva2VhY3V0ZSA9IDB4MDFmZjsKKyAgdC5vc3VwZXJpb3IgPSAweGY2ZjA7CisgIHQub3RjeXJpbGxpYyA9IDB4MDQ3ZjsKKyAgdC5vdGlsZGUgPSAweDAwZjU7CisgIHQub3RpbGRlYWN1dGUgPSAweDFlNGQ7CisgIHQub3RpbGRlZGllcmVzaXMgPSAweDFlNGY7CisgIHQub3Vib3BvbW9mbyA9IDB4MzEyMTsKKyAgdC5vdmVybGluZSA9IDB4MjAzZTsKKyAgdC5vdmVybGluZWNlbnRlcmxpbmUgPSAweGZlNGE7CisgIHQub3ZlcmxpbmVjbWIgPSAweDAzMDU7CisgIHQub3ZlcmxpbmVkYXNoZWQgPSAweGZlNDk7CisgIHQub3ZlcmxpbmVkYmx3YXZ5ID0gMHhmZTRjOworICB0Lm92ZXJsaW5ld2F2eSA9IDB4ZmU0YjsKKyAgdC5vdmVyc2NvcmUgPSAweDAwYWY7CisgIHQub3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Y2I7CisgIHQub3Zvd2Vsc2lnbmRldmEgPSAweDA5NGI7CisgIHQub3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWNiOworICB0LnAgPSAweDAwNzA7CisgIHQucGFhbXBzc3F1YXJlID0gMHgzMzgwOworICB0LnBhYXNlbnRvc3F1YXJlID0gMHgzMzJiOworICB0LnBhYmVuZ2FsaSA9IDB4MDlhYTsKKyAgdC5wYWN1dGUgPSAweDFlNTU7CisgIHQucGFkZXZhID0gMHgwOTJhOworICB0LnBhZ2Vkb3duID0gMHgyMWRmOworICB0LnBhZ2V1cCA9IDB4MjFkZTsKKyAgdC5wYWd1amFyYXRpID0gMHgwYWFhOworICB0LnBhZ3VybXVraGkgPSAweDBhMmE7CisgIHQucGFoaXJhZ2FuYSA9IDB4MzA3MTsKKyAgdC5wYWl5YW5ub2l0aGFpID0gMHgwZTJmOworICB0LnBha2F0YWthbmEgPSAweDMwZDE7CisgIHQucGFsYXRhbGl6YXRpb25jeXJpbGxpY2NtYiA9IDB4MDQ4NDsKKyAgdC5wYWxvY2hrYWN5cmlsbGljID0gMHgwNGMwOworICB0LnBhbnNpb3Nrb3JlYW4gPSAweDMxN2Y7CisgIHQucGFyYWdyYXBoID0gMHgwMGI2OworICB0LnBhcmFsbGVsID0gMHgyMjI1OworICB0LnBhcmVubGVmdCA9IDB4MDAyODsKKyAgdC5wYXJlbmxlZnRhbHRvbmVhcmFiaWMgPSAweGZkM2U7CisgIHQucGFyZW5sZWZ0YnQgPSAweGY4ZWQ7CisgIHQucGFyZW5sZWZ0ZXggPSAweGY4ZWM7CisgIHQucGFyZW5sZWZ0aW5mZXJpb3IgPSAweDIwOGQ7CisgIHQucGFyZW5sZWZ0bW9ub3NwYWNlID0gMHhmZjA4OworICB0LnBhcmVubGVmdHNtYWxsID0gMHhmZTU5OworICB0LnBhcmVubGVmdHN1cGVyaW9yID0gMHgyMDdkOworICB0LnBhcmVubGVmdHRwID0gMHhmOGViOworICB0LnBhcmVubGVmdHZlcnRpY2FsID0gMHhmZTM1OworICB0LnBhcmVucmlnaHQgPSAweDAwMjk7CisgIHQucGFyZW5yaWdodGFsdG9uZWFyYWJpYyA9IDB4ZmQzZjsKKyAgdC5wYXJlbnJpZ2h0YnQgPSAweGY4Zjg7CisgIHQucGFyZW5yaWdodGV4ID0gMHhmOGY3OworICB0LnBhcmVucmlnaHRpbmZlcmlvciA9IDB4MjA4ZTsKKyAgdC5wYXJlbnJpZ2h0bW9ub3NwYWNlID0gMHhmZjA5OworICB0LnBhcmVucmlnaHRzbWFsbCA9IDB4ZmU1YTsKKyAgdC5wYXJlbnJpZ2h0c3VwZXJpb3IgPSAweDIwN2U7CisgIHQucGFyZW5yaWdodHRwID0gMHhmOGY2OworICB0LnBhcmVucmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzNjsKKyAgdC5wYXJ0aWFsZGlmZiA9IDB4MjIwMjsKKyAgdC5wYXNlcWhlYnJldyA9IDB4MDVjMDsKKyAgdC5wYXNodGFoZWJyZXcgPSAweDA1OTk7CisgIHQucGFzcXVhcmUgPSAweDMzYTk7CisgIHQucGF0YWggPSAweDA1Yjc7CisgIHQucGF0YWgxMSA9IDB4MDViNzsKKyAgdC5wYXRhaDFkID0gMHgwNWI3OworICB0LnBhdGFoMmEgPSAweDA1Yjc7CisgIHQucGF0YWhoZWJyZXcgPSAweDA1Yjc7CisgIHQucGF0YWhuYXJyb3doZWJyZXcgPSAweDA1Yjc7CisgIHQucGF0YWhxdWFydGVyaGVicmV3ID0gMHgwNWI3OworICB0LnBhdGFod2lkZWhlYnJldyA9IDB4MDViNzsKKyAgdC5wYXplcmhlYnJldyA9IDB4MDVhMTsKKyAgdC5wYm9wb21vZm8gPSAweDMxMDY7CisgIHQucGNpcmNsZSA9IDB4MjRkZjsKKyAgdC5wZG90YWNjZW50ID0gMHgxZTU3OworICB0LnBlID0gMHgwNWU0OworICB0LnBlY3lyaWxsaWMgPSAweDA0M2Y7CisgIHQucGVkYWdlc2ggPSAweGZiNDQ7CisgIHQucGVkYWdlc2hoZWJyZXcgPSAweGZiNDQ7CisgIHQucGVlemlzcXVhcmUgPSAweDMzM2I7CisgIHQucGVmaW5hbGRhZ2VzaGhlYnJldyA9IDB4ZmI0MzsKKyAgdC5wZWhhcmFiaWMgPSAweDA2N2U7CisgIHQucGVoYXJtZW5pYW4gPSAweDA1N2E7CisgIHQucGVoZWJyZXcgPSAweDA1ZTQ7CisgIHQucGVoZmluYWxhcmFiaWMgPSAweGZiNTc7CisgIHQucGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI1ODsKKyAgdC5wZWhpcmFnYW5hID0gMHgzMDdhOworICB0LnBlaG1lZGlhbGFyYWJpYyA9IDB4ZmI1OTsKKyAgdC5wZWthdGFrYW5hID0gMHgzMGRhOworICB0LnBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE3OworICB0LnBlcmFmZWhlYnJldyA9IDB4ZmI0ZTsKKyAgdC5wZXJjZW50ID0gMHgwMDI1OworICB0LnBlcmNlbnRhcmFiaWMgPSAweDA2NmE7CisgIHQucGVyY2VudG1vbm9zcGFjZSA9IDB4ZmYwNTsKKyAgdC5wZXJjZW50c21hbGwgPSAweGZlNmE7CisgIHQucGVyaW9kID0gMHgwMDJlOworICB0LnBlcmlvZGFybWVuaWFuID0gMHgwNTg5OworICB0LnBlcmlvZGNlbnRlcmVkID0gMHgwMGI3OworICB0LnBlcmlvZGhhbGZ3aWR0aCA9IDB4ZmY2MTsKKyAgdC5wZXJpb2RpbmZlcmlvciA9IDB4ZjZlNzsKKyAgdC5wZXJpb2Rtb25vc3BhY2UgPSAweGZmMGU7CisgIHQucGVyaW9kc21hbGwgPSAweGZlNTI7CisgIHQucGVyaW9kc3VwZXJpb3IgPSAweGY2ZTg7CisgIHQucGVyaXNwb21lbmlncmVla2NtYiA9IDB4MDM0MjsKKyAgdC5wZXJwZW5kaWN1bGFyID0gMHgyMmE1OworICB0LnBlcnRob3VzYW5kID0gMHgyMDMwOworICB0LnBlc2V0YSA9IDB4MjBhNzsKKyAgdC5wZnNxdWFyZSA9IDB4MzM4YTsKKyAgdC5waGFiZW5nYWxpID0gMHgwOWFiOworICB0LnBoYWRldmEgPSAweDA5MmI7CisgIHQucGhhZ3VqYXJhdGkgPSAweDBhYWI7CisgIHQucGhhZ3VybXVraGkgPSAweDBhMmI7CisgIHQucGhpID0gMHgwM2M2OworICB0LnBoaTEgPSAweDAzZDU7CisgIHQucGhpZXVwaGFjaXJjbGVrb3JlYW4gPSAweDMyN2E7CisgIHQucGhpZXVwaGFwYXJlbmtvcmVhbiA9IDB4MzIxYTsKKyAgdC5waGlldXBoY2lyY2xla29yZWFuID0gMHgzMjZjOworICB0LnBoaWV1cGhrb3JlYW4gPSAweDMxNGQ7CisgIHQucGhpZXVwaHBhcmVua29yZWFuID0gMHgzMjBjOworICB0LnBoaWxhdGluID0gMHgwMjc4OworICB0LnBoaW50aHV0aGFpID0gMHgwZTNhOworICB0LnBoaXN5bWJvbGdyZWVrID0gMHgwM2Q1OworICB0LnBob29rID0gMHgwMWE1OworICB0LnBob3BoYW50aGFpID0gMHgwZTFlOworICB0LnBob3BodW5ndGhhaSA9IDB4MGUxYzsKKyAgdC5waG9zYW1waGFvdGhhaSA9IDB4MGUyMDsKKyAgdC5waSA9IDB4MDNjMDsKKyAgdC5waWV1cGFjaXJjbGVrb3JlYW4gPSAweDMyNzM7CisgIHQucGlldXBhcGFyZW5rb3JlYW4gPSAweDMyMTM7CisgIHQucGlldXBjaWV1Y2tvcmVhbiA9IDB4MzE3NjsKKyAgdC5waWV1cGNpcmNsZWtvcmVhbiA9IDB4MzI2NTsKKyAgdC5waWV1cGtpeWVva2tvcmVhbiA9IDB4MzE3MjsKKyAgdC5waWV1cGtvcmVhbiA9IDB4MzE0MjsKKyAgdC5waWV1cHBhcmVua29yZWFuID0gMHgzMjA1OworICB0LnBpZXVwc2lvc2tpeWVva2tvcmVhbiA9IDB4MzE3NDsKKyAgdC5waWV1cHNpb3Nrb3JlYW4gPSAweDMxNDQ7CisgIHQucGlldXBzaW9zdGlrZXV0a29yZWFuID0gMHgzMTc1OworICB0LnBpZXVwdGhpZXV0aGtvcmVhbiA9IDB4MzE3NzsKKyAgdC5waWV1cHRpa2V1dGtvcmVhbiA9IDB4MzE3MzsKKyAgdC5waWhpcmFnYW5hID0gMHgzMDc0OworICB0LnBpa2F0YWthbmEgPSAweDMwZDQ7CisgIHQucGlzeW1ib2xncmVlayA9IDB4MDNkNjsKKyAgdC5waXdyYXJtZW5pYW4gPSAweDA1ODM7CisgIHQucGx1cyA9IDB4MDAyYjsKKyAgdC5wbHVzYmVsb3djbWIgPSAweDAzMWY7CisgIHQucGx1c2NpcmNsZSA9IDB4MjI5NTsKKyAgdC5wbHVzbWludXMgPSAweDAwYjE7CisgIHQucGx1c21vZCA9IDB4MDJkNjsKKyAgdC5wbHVzbW9ub3NwYWNlID0gMHhmZjBiOworICB0LnBsdXNzbWFsbCA9IDB4ZmU2MjsKKyAgdC5wbHVzc3VwZXJpb3IgPSAweDIwN2E7CisgIHQucG1vbm9zcGFjZSA9IDB4ZmY1MDsKKyAgdC5wbXNxdWFyZSA9IDB4MzNkODsKKyAgdC5wb2hpcmFnYW5hID0gMHgzMDdkOworICB0LnBvaW50aW5naW5kZXhkb3dud2hpdGUgPSAweDI2MWY7CisgIHQucG9pbnRpbmdpbmRleGxlZnR3aGl0ZSA9IDB4MjYxYzsKKyAgdC5wb2ludGluZ2luZGV4cmlnaHR3aGl0ZSA9IDB4MjYxZTsKKyAgdC5wb2ludGluZ2luZGV4dXB3aGl0ZSA9IDB4MjYxZDsKKyAgdC5wb2thdGFrYW5hID0gMHgzMGRkOworICB0LnBvcGxhdGhhaSA9IDB4MGUxYjsKKyAgdC5wb3N0YWxtYXJrID0gMHgzMDEyOworICB0LnBvc3RhbG1hcmtmYWNlID0gMHgzMDIwOworICB0LnBwYXJlbiA9IDB4MjRhYjsKKyAgdC5wcmVjZWRlcyA9IDB4MjI3YTsKKyAgdC5wcmVzY3JpcHRpb24gPSAweDIxMWU7CisgIHQucHJpbWVtb2QgPSAweDAyYjk7CisgIHQucHJpbWVyZXZlcnNlZCA9IDB4MjAzNTsKKyAgdC5wcm9kdWN0ID0gMHgyMjBmOworICB0LnByb2plY3RpdmUgPSAweDIzMDU7CisgIHQucHJvbG9uZ2Vka2FuYSA9IDB4MzBmYzsKKyAgdC5wcm9wZWxsb3IgPSAweDIzMTg7CisgIHQucHJvcGVyc3Vic2V0ID0gMHgyMjgyOworICB0LnByb3BlcnN1cGVyc2V0ID0gMHgyMjgzOworICB0LnByb3BvcnRpb24gPSAweDIyMzc7CisgIHQucHJvcG9ydGlvbmFsID0gMHgyMjFkOworICB0LnBzaSA9IDB4MDNjODsKKyAgdC5wc2ljeXJpbGxpYyA9IDB4MDQ3MTsKKyAgdC5wc2lsaXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODY7CisgIHQucHNzcXVhcmUgPSAweDMzYjA7CisgIHQucHVoaXJhZ2FuYSA9IDB4MzA3NzsKKyAgdC5wdWthdGFrYW5hID0gMHgzMGQ3OworICB0LnB2c3F1YXJlID0gMHgzM2I0OworICB0LnB3c3F1YXJlID0gMHgzM2JhOworICB0LnEgPSAweDAwNzE7CisgIHQucWFkZXZhID0gMHgwOTU4OworICB0LnFhZG1haGVicmV3ID0gMHgwNWE4OworICB0LnFhZmFyYWJpYyA9IDB4MDY0MjsKKyAgdC5xYWZmaW5hbGFyYWJpYyA9IDB4ZmVkNjsKKyAgdC5xYWZpbml0aWFsYXJhYmljID0gMHhmZWQ3OworICB0LnFhZm1lZGlhbGFyYWJpYyA9IDB4ZmVkODsKKyAgdC5xYW1hdHMgPSAweDA1Yjg7CisgIHQucWFtYXRzMTAgPSAweDA1Yjg7CisgIHQucWFtYXRzMWEgPSAweDA1Yjg7CisgIHQucWFtYXRzMWMgPSAweDA1Yjg7CisgIHQucWFtYXRzMjcgPSAweDA1Yjg7CisgIHQucWFtYXRzMjkgPSAweDA1Yjg7CisgIHQucWFtYXRzMzMgPSAweDA1Yjg7CisgIHQucWFtYXRzZGUgPSAweDA1Yjg7CisgIHQucWFtYXRzaGVicmV3ID0gMHgwNWI4OworICB0LnFhbWF0c25hcnJvd2hlYnJldyA9IDB4MDViODsKKyAgdC5xYW1hdHNxYXRhbmhlYnJldyA9IDB4MDViODsKKyAgdC5xYW1hdHNxYXRhbm5hcnJvd2hlYnJldyA9IDB4MDViODsKKyAgdC5xYW1hdHNxYXRhbnF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjg7CisgIHQucWFtYXRzcWF0YW53aWRlaGVicmV3ID0gMHgwNWI4OworICB0LnFhbWF0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1Yjg7CisgIHQucWFtYXRzd2lkZWhlYnJldyA9IDB4MDViODsKKyAgdC5xYXJuZXlwYXJhaGVicmV3ID0gMHgwNTlmOworICB0LnFib3BvbW9mbyA9IDB4MzExMTsKKyAgdC5xY2lyY2xlID0gMHgyNGUwOworICB0LnFob29rID0gMHgwMmEwOworICB0LnFtb25vc3BhY2UgPSAweGZmNTE7CisgIHQucW9mID0gMHgwNWU3OworICB0LnFvZmRhZ2VzaCA9IDB4ZmI0NzsKKyAgdC5xb2ZkYWdlc2hoZWJyZXcgPSAweGZiNDc7CisgIHQucW9maGVicmV3ID0gMHgwNWU3OworICB0LnFwYXJlbiA9IDB4MjRhYzsKKyAgdC5xdWFydGVybm90ZSA9IDB4MjY2OTsKKyAgdC5xdWJ1dHMgPSAweDA1YmI7CisgIHQucXVidXRzMTggPSAweDA1YmI7CisgIHQucXVidXRzMjUgPSAweDA1YmI7CisgIHQucXVidXRzMzEgPSAweDA1YmI7CisgIHQucXVidXRzaGVicmV3ID0gMHgwNWJiOworICB0LnF1YnV0c25hcnJvd2hlYnJldyA9IDB4MDViYjsKKyAgdC5xdWJ1dHNxdWFydGVyaGVicmV3ID0gMHgwNWJiOworICB0LnF1YnV0c3dpZGVoZWJyZXcgPSAweDA1YmI7CisgIHQucXVlc3Rpb24gPSAweDAwM2Y7CisgIHQucXVlc3Rpb25hcmFiaWMgPSAweDA2MWY7CisgIHQucXVlc3Rpb25hcm1lbmlhbiA9IDB4MDU1ZTsKKyAgdC5xdWVzdGlvbmRvd24gPSAweDAwYmY7CisgIHQucXVlc3Rpb25kb3duc21hbGwgPSAweGY3YmY7CisgIHQucXVlc3Rpb25ncmVlayA9IDB4MDM3ZTsKKyAgdC5xdWVzdGlvbm1vbm9zcGFjZSA9IDB4ZmYxZjsKKyAgdC5xdWVzdGlvbnNtYWxsID0gMHhmNzNmOworICB0LnF1b3RlZGJsID0gMHgwMDIyOworICB0LnF1b3RlZGJsYmFzZSA9IDB4MjAxZTsKKyAgdC5xdW90ZWRibGxlZnQgPSAweDIwMWM7CisgIHQucXVvdGVkYmxtb25vc3BhY2UgPSAweGZmMDI7CisgIHQucXVvdGVkYmxwcmltZSA9IDB4MzAxZTsKKyAgdC5xdW90ZWRibHByaW1lcmV2ZXJzZWQgPSAweDMwMWQ7CisgIHQucXVvdGVkYmxyaWdodCA9IDB4MjAxZDsKKyAgdC5xdW90ZWxlZnQgPSAweDIwMTg7CisgIHQucXVvdGVsZWZ0cmV2ZXJzZWQgPSAweDIwMWI7CisgIHQucXVvdGVyZXZlcnNlZCA9IDB4MjAxYjsKKyAgdC5xdW90ZXJpZ2h0ID0gMHgyMDE5OworICB0LnF1b3RlcmlnaHRuID0gMHgwMTQ5OworICB0LnF1b3Rlc2luZ2xiYXNlID0gMHgyMDFhOworICB0LnF1b3Rlc2luZ2xlID0gMHgwMDI3OworICB0LnF1b3Rlc2luZ2xlbW9ub3NwYWNlID0gMHhmZjA3OworICB0LnIgPSAweDAwNzI7CisgIHQucmFhcm1lbmlhbiA9IDB4MDU3YzsKKyAgdC5yYWJlbmdhbGkgPSAweDA5YjA7CisgIHQucmFjdXRlID0gMHgwMTU1OworICB0LnJhZGV2YSA9IDB4MDkzMDsKKyAgdC5yYWRpY2FsID0gMHgyMjFhOworICB0LnJhZGljYWxleCA9IDB4ZjhlNTsKKyAgdC5yYWRvdmVyc3NxdWFyZSA9IDB4MzNhZTsKKyAgdC5yYWRvdmVyc3NxdWFyZWRzcXVhcmUgPSAweDMzYWY7CisgIHQucmFkc3F1YXJlID0gMHgzM2FkOworICB0LnJhZmUgPSAweDA1YmY7CisgIHQucmFmZWhlYnJldyA9IDB4MDViZjsKKyAgdC5yYWd1amFyYXRpID0gMHgwYWIwOworICB0LnJhZ3VybXVraGkgPSAweDBhMzA7CisgIHQucmFoaXJhZ2FuYSA9IDB4MzA4OTsKKyAgdC5yYWthdGFrYW5hID0gMHgzMGU5OworICB0LnJha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTc7CisgIHQucmFsb3dlcmRpYWdvbmFsYmVuZ2FsaSA9IDB4MDlmMTsKKyAgdC5yYW1pZGRsZWRpYWdvbmFsYmVuZ2FsaSA9IDB4MDlmMDsKKyAgdC5yYW1zaG9ybiA9IDB4MDI2NDsKKyAgdC5yYXRpbyA9IDB4MjIzNjsKKyAgdC5yYm9wb21vZm8gPSAweDMxMTY7CisgIHQucmNhcm9uID0gMHgwMTU5OworICB0LnJjZWRpbGxhID0gMHgwMTU3OworICB0LnJjaXJjbGUgPSAweDI0ZTE7CisgIHQucmNvbW1hYWNjZW50ID0gMHgwMTU3OworICB0LnJkYmxncmF2ZSA9IDB4MDIxMTsKKyAgdC5yZG90YWNjZW50ID0gMHgxZTU5OworICB0LnJkb3RiZWxvdyA9IDB4MWU1YjsKKyAgdC5yZG90YmVsb3dtYWNyb24gPSAweDFlNWQ7CisgIHQucmVmZXJlbmNlbWFyayA9IDB4MjAzYjsKKyAgdC5yZWZsZXhzdWJzZXQgPSAweDIyODY7CisgIHQucmVmbGV4c3VwZXJzZXQgPSAweDIyODc7CisgIHQucmVnaXN0ZXJlZCA9IDB4MDBhZTsKKyAgdC5yZWdpc3RlcnNhbnMgPSAweGY4ZTg7CisgIHQucmVnaXN0ZXJzZXJpZiA9IDB4ZjZkYTsKKyAgdC5yZWhhcmFiaWMgPSAweDA2MzE7CisgIHQucmVoYXJtZW5pYW4gPSAweDA1ODA7CisgIHQucmVoZmluYWxhcmFiaWMgPSAweGZlYWU7CisgIHQucmVoaXJhZ2FuYSA9IDB4MzA4YzsKKyAgdC5yZWthdGFrYW5hID0gMHgzMGVjOworICB0LnJla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWE7CisgIHQucmVzaCA9IDB4MDVlODsKKyAgdC5yZXNoZGFnZXNoaGVicmV3ID0gMHhmYjQ4OworICB0LnJlc2hoZWJyZXcgPSAweDA1ZTg7CisgIHQucmV2ZXJzZWR0aWxkZSA9IDB4MjIzZDsKKyAgdC5yZXZpYWhlYnJldyA9IDB4MDU5NzsKKyAgdC5yZXZpYW11Z3Jhc2hoZWJyZXcgPSAweDA1OTc7CisgIHQucmV2bG9naWNhbG5vdCA9IDB4MjMxMDsKKyAgdC5yZmlzaGhvb2sgPSAweDAyN2U7CisgIHQucmZpc2hob29rcmV2ZXJzZWQgPSAweDAyN2Y7CisgIHQucmhhYmVuZ2FsaSA9IDB4MDlkZDsKKyAgdC5yaGFkZXZhID0gMHgwOTVkOworICB0LnJobyA9IDB4MDNjMTsKKyAgdC5yaG9vayA9IDB4MDI3ZDsKKyAgdC5yaG9va3R1cm5lZCA9IDB4MDI3YjsKKyAgdC5yaG9va3R1cm5lZHN1cGVyaW9yID0gMHgwMmI1OworICB0LnJob3N5bWJvbGdyZWVrID0gMHgwM2YxOworICB0LnJob3RpY2hvb2ttb2QgPSAweDAyZGU7CisgIHQucmlldWxhY2lyY2xla29yZWFuID0gMHgzMjcxOworICB0LnJpZXVsYXBhcmVua29yZWFuID0gMHgzMjExOworICB0LnJpZXVsY2lyY2xla29yZWFuID0gMHgzMjYzOworICB0LnJpZXVsaGlldWhrb3JlYW4gPSAweDMxNDA7CisgIHQucmlldWxraXllb2trb3JlYW4gPSAweDMxM2E7CisgIHQucmlldWxraXllb2tzaW9za29yZWFuID0gMHgzMTY5OworICB0LnJpZXVsa29yZWFuID0gMHgzMTM5OworICB0LnJpZXVsbWlldW1rb3JlYW4gPSAweDMxM2I7CisgIHQucmlldWxwYW5zaW9za29yZWFuID0gMHgzMTZjOworICB0LnJpZXVscGFyZW5rb3JlYW4gPSAweDMyMDM7CisgIHQucmlldWxwaGlldXBoa29yZWFuID0gMHgzMTNmOworICB0LnJpZXVscGlldXBrb3JlYW4gPSAweDMxM2M7CisgIHQucmlldWxwaWV1cHNpb3Nrb3JlYW4gPSAweDMxNmI7CisgIHQucmlldWxzaW9za29yZWFuID0gMHgzMTNkOworICB0LnJpZXVsdGhpZXV0aGtvcmVhbiA9IDB4MzEzZTsKKyAgdC5yaWV1bHRpa2V1dGtvcmVhbiA9IDB4MzE2YTsKKyAgdC5yaWV1bHllb3JpbmhpZXVoa29yZWFuID0gMHgzMTZkOworICB0LnJpZ2h0YW5nbGUgPSAweDIyMWY7CisgIHQucmlnaHR0YWNrYmVsb3djbWIgPSAweDAzMTk7CisgIHQucmlnaHR0cmlhbmdsZSA9IDB4MjJiZjsKKyAgdC5yaWhpcmFnYW5hID0gMHgzMDhhOworICB0LnJpa2F0YWthbmEgPSAweDMwZWE7CisgIHQucmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ODsKKyAgdC5yaW5nID0gMHgwMmRhOworICB0LnJpbmdiZWxvd2NtYiA9IDB4MDMyNTsKKyAgdC5yaW5nY21iID0gMHgwMzBhOworICB0LnJpbmdoYWxmbGVmdCA9IDB4MDJiZjsKKyAgdC5yaW5naGFsZmxlZnRhcm1lbmlhbiA9IDB4MDU1OTsKKyAgdC5yaW5naGFsZmxlZnRiZWxvd2NtYiA9IDB4MDMxYzsKKyAgdC5yaW5naGFsZmxlZnRjZW50ZXJlZCA9IDB4MDJkMzsKKyAgdC5yaW5naGFsZnJpZ2h0ID0gMHgwMmJlOworICB0LnJpbmdoYWxmcmlnaHRiZWxvd2NtYiA9IDB4MDMzOTsKKyAgdC5yaW5naGFsZnJpZ2h0Y2VudGVyZWQgPSAweDAyZDI7CisgIHQucmludmVydGVkYnJldmUgPSAweDAyMTM7CisgIHQucml0dG9ydXNxdWFyZSA9IDB4MzM1MTsKKyAgdC5ybGluZWJlbG93ID0gMHgxZTVmOworICB0LnJsb25nbGVnID0gMHgwMjdjOworICB0LnJsb25nbGVndHVybmVkID0gMHgwMjdhOworICB0LnJtb25vc3BhY2UgPSAweGZmNTI7CisgIHQucm9oaXJhZ2FuYSA9IDB4MzA4ZDsKKyAgdC5yb2thdGFrYW5hID0gMHgzMGVkOworICB0LnJva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWI7CisgIHQucm9ydWF0aGFpID0gMHgwZTIzOworICB0LnJwYXJlbiA9IDB4MjRhZDsKKyAgdC5ycmFiZW5nYWxpID0gMHgwOWRjOworICB0LnJyYWRldmEgPSAweDA5MzE7CisgIHQucnJhZ3VybXVraGkgPSAweDBhNWM7CisgIHQucnJlaGFyYWJpYyA9IDB4MDY5MTsKKyAgdC5ycmVoZmluYWxhcmFiaWMgPSAweGZiOGQ7CisgIHQucnJ2b2NhbGljYmVuZ2FsaSA9IDB4MDllMDsKKyAgdC5ycnZvY2FsaWNkZXZhID0gMHgwOTYwOworICB0LnJydm9jYWxpY2d1amFyYXRpID0gMHgwYWUwOworICB0LnJydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzQ7CisgIHQucnJ2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk0NDsKKyAgdC5ycnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNDsKKyAgdC5yc3VwZXJpb3IgPSAweGY2ZjE7CisgIHQucnRibG9jayA9IDB4MjU5MDsKKyAgdC5ydHVybmVkID0gMHgwMjc5OworICB0LnJ0dXJuZWRzdXBlcmlvciA9IDB4MDJiNDsKKyAgdC5ydWhpcmFnYW5hID0gMHgzMDhiOworICB0LnJ1a2F0YWthbmEgPSAweDMwZWI7CisgIHQucnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5OTsKKyAgdC5ydXBlZW1hcmtiZW5nYWxpID0gMHgwOWYyOworICB0LnJ1cGVlc2lnbmJlbmdhbGkgPSAweDA5ZjM7CisgIHQucnVwaWFoID0gMHhmNmRkOworICB0LnJ1dGhhaSA9IDB4MGUyNDsKKyAgdC5ydm9jYWxpY2JlbmdhbGkgPSAweDA5OGI7CisgIHQucnZvY2FsaWNkZXZhID0gMHgwOTBiOworICB0LnJ2b2NhbGljZ3VqYXJhdGkgPSAweDBhOGI7CisgIHQucnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWMzOworICB0LnJ2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk0MzsKKyAgdC5ydm9jYWxpY3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMzOworICB0LnMgPSAweDAwNzM7CisgIHQuc2FiZW5nYWxpID0gMHgwOWI4OworICB0LnNhY3V0ZSA9IDB4MDE1YjsKKyAgdC5zYWN1dGVkb3RhY2NlbnQgPSAweDFlNjU7CisgIHQuc2FkYXJhYmljID0gMHgwNjM1OworICB0LnNhZGV2YSA9IDB4MDkzODsKKyAgdC5zYWRmaW5hbGFyYWJpYyA9IDB4ZmViYTsKKyAgdC5zYWRpbml0aWFsYXJhYmljID0gMHhmZWJiOworICB0LnNhZG1lZGlhbGFyYWJpYyA9IDB4ZmViYzsKKyAgdC5zYWd1amFyYXRpID0gMHgwYWI4OworICB0LnNhZ3VybXVraGkgPSAweDBhMzg7CisgIHQuc2FoaXJhZ2FuYSA9IDB4MzA1NTsKKyAgdC5zYWthdGFrYW5hID0gMHgzMGI1OworICB0LnNha2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2I7CisgIHQuc2FsbGFsbGFob3VhbGF5aGV3YXNhbGxhbWFyYWJpYyA9IDB4ZmRmYTsKKyAgdC5zYW1la2ggPSAweDA1ZTE7CisgIHQuc2FtZWtoZGFnZXNoID0gMHhmYjQxOworICB0LnNhbWVraGRhZ2VzaGhlYnJldyA9IDB4ZmI0MTsKKyAgdC5zYW1la2hoZWJyZXcgPSAweDA1ZTE7CisgIHQuc2FyYWFhdGhhaSA9IDB4MGUzMjsKKyAgdC5zYXJhYWV0aGFpID0gMHgwZTQxOworICB0LnNhcmFhaW1haW1hbGFpdGhhaSA9IDB4MGU0NDsKKyAgdC5zYXJhYWltYWltdWFudGhhaSA9IDB4MGU0MzsKKyAgdC5zYXJhYW10aGFpID0gMHgwZTMzOworICB0LnNhcmFhdGhhaSA9IDB4MGUzMDsKKyAgdC5zYXJhZXRoYWkgPSAweDBlNDA7CisgIHQuc2FyYWlpbGVmdHRoYWkgPSAweGY4ODY7CisgIHQuc2FyYWlpdGhhaSA9IDB4MGUzNTsKKyAgdC5zYXJhaWxlZnR0aGFpID0gMHhmODg1OworICB0LnNhcmFpdGhhaSA9IDB4MGUzNDsKKyAgdC5zYXJhb3RoYWkgPSAweDBlNDI7CisgIHQuc2FyYXVlZWxlZnR0aGFpID0gMHhmODg4OworICB0LnNhcmF1ZWV0aGFpID0gMHgwZTM3OworICB0LnNhcmF1ZWxlZnR0aGFpID0gMHhmODg3OworICB0LnNhcmF1ZXRoYWkgPSAweDBlMzY7CisgIHQuc2FyYXV0aGFpID0gMHgwZTM4OworICB0LnNhcmF1dXRoYWkgPSAweDBlMzk7CisgIHQuc2JvcG9tb2ZvID0gMHgzMTE5OworICB0LnNjYXJvbiA9IDB4MDE2MTsKKyAgdC5zY2Fyb25kb3RhY2NlbnQgPSAweDFlNjc7CisgIHQuc2NlZGlsbGEgPSAweDAxNWY7CisgIHQuc2Nod2EgPSAweDAyNTk7CisgIHQuc2Nod2FjeXJpbGxpYyA9IDB4MDRkOTsKKyAgdC5zY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGI7CisgIHQuc2Nod2Fob29rID0gMHgwMjVhOworICB0LnNjaXJjbGUgPSAweDI0ZTI7CisgIHQuc2NpcmN1bWZsZXggPSAweDAxNWQ7CisgIHQuc2NvbW1hYWNjZW50ID0gMHgwMjE5OworICB0LnNkb3RhY2NlbnQgPSAweDFlNjE7CisgIHQuc2RvdGJlbG93ID0gMHgxZTYzOworICB0LnNkb3RiZWxvd2RvdGFjY2VudCA9IDB4MWU2OTsKKyAgdC5zZWFndWxsYmVsb3djbWIgPSAweDAzM2M7CisgIHQuc2Vjb25kID0gMHgyMDMzOworICB0LnNlY29uZHRvbmVjaGluZXNlID0gMHgwMmNhOworICB0LnNlY3Rpb24gPSAweDAwYTc7CisgIHQuc2VlbmFyYWJpYyA9IDB4MDYzMzsKKyAgdC5zZWVuZmluYWxhcmFiaWMgPSAweGZlYjI7CisgIHQuc2VlbmluaXRpYWxhcmFiaWMgPSAweGZlYjM7CisgIHQuc2Vlbm1lZGlhbGFyYWJpYyA9IDB4ZmViNDsKKyAgdC5zZWdvbCA9IDB4MDViNjsKKyAgdC5zZWdvbDEzID0gMHgwNWI2OworICB0LnNlZ29sMWYgPSAweDA1YjY7CisgIHQuc2Vnb2wyYyA9IDB4MDViNjsKKyAgdC5zZWdvbGhlYnJldyA9IDB4MDViNjsKKyAgdC5zZWdvbG5hcnJvd2hlYnJldyA9IDB4MDViNjsKKyAgdC5zZWdvbHF1YXJ0ZXJoZWJyZXcgPSAweDA1YjY7CisgIHQuc2Vnb2x0YWhlYnJldyA9IDB4MDU5MjsKKyAgdC5zZWdvbHdpZGVoZWJyZXcgPSAweDA1YjY7CisgIHQuc2VoYXJtZW5pYW4gPSAweDA1N2Q7CisgIHQuc2VoaXJhZ2FuYSA9IDB4MzA1YjsKKyAgdC5zZWthdGFrYW5hID0gMHgzMGJiOworICB0LnNla2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2U7CisgIHQuc2VtaWNvbG9uID0gMHgwMDNiOworICB0LnNlbWljb2xvbmFyYWJpYyA9IDB4MDYxYjsKKyAgdC5zZW1pY29sb25tb25vc3BhY2UgPSAweGZmMWI7CisgIHQuc2VtaWNvbG9uc21hbGwgPSAweGZlNTQ7CisgIHQuc2VtaXZvaWNlZG1hcmtrYW5hID0gMHgzMDljOworICB0LnNlbWl2b2ljZWRtYXJra2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ZjsKKyAgdC5zZW50aXNxdWFyZSA9IDB4MzMyMjsKKyAgdC5zZW50b3NxdWFyZSA9IDB4MzMyMzsKKyAgdC5zZXZlbiA9IDB4MDAzNzsKKyAgdC5zZXZlbmFyYWJpYyA9IDB4MDY2NzsKKyAgdC5zZXZlbmJlbmdhbGkgPSAweDA5ZWQ7CisgIHQuc2V2ZW5jaXJjbGUgPSAweDI0NjY7CisgIHQuc2V2ZW5jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzkwOworICB0LnNldmVuZGV2YSA9IDB4MDk2ZDsKKyAgdC5zZXZlbmVpZ2h0aHMgPSAweDIxNWU7CisgIHQuc2V2ZW5ndWphcmF0aSA9IDB4MGFlZDsKKyAgdC5zZXZlbmd1cm11a2hpID0gMHgwYTZkOworICB0LnNldmVuaGFja2FyYWJpYyA9IDB4MDY2NzsKKyAgdC5zZXZlbmhhbmd6aG91ID0gMHgzMDI3OworICB0LnNldmVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNjsKKyAgdC5zZXZlbmluZmVyaW9yID0gMHgyMDg3OworICB0LnNldmVubW9ub3NwYWNlID0gMHhmZjE3OworICB0LnNldmVub2xkc3R5bGUgPSAweGY3Mzc7CisgIHQuc2V2ZW5wYXJlbiA9IDB4MjQ3YTsKKyAgdC5zZXZlbnBlcmlvZCA9IDB4MjQ4ZTsKKyAgdC5zZXZlbnBlcnNpYW4gPSAweDA2Zjc7CisgIHQuc2V2ZW5yb21hbiA9IDB4MjE3NjsKKyAgdC5zZXZlbnN1cGVyaW9yID0gMHgyMDc3OworICB0LnNldmVudGVlbmNpcmNsZSA9IDB4MjQ3MDsKKyAgdC5zZXZlbnRlZW5wYXJlbiA9IDB4MjQ4NDsKKyAgdC5zZXZlbnRlZW5wZXJpb2QgPSAweDI0OTg7CisgIHQuc2V2ZW50aGFpID0gMHgwZTU3OworICB0LnNmdGh5cGhlbiA9IDB4MDBhZDsKKyAgdC5zaGFhcm1lbmlhbiA9IDB4MDU3NzsKKyAgdC5zaGFiZW5nYWxpID0gMHgwOWI2OworICB0LnNoYWN5cmlsbGljID0gMHgwNDQ4OworICB0LnNoYWRkYWFyYWJpYyA9IDB4MDY1MTsKKyAgdC5zaGFkZGFkYW1tYWFyYWJpYyA9IDB4ZmM2MTsKKyAgdC5zaGFkZGFkYW1tYXRhbmFyYWJpYyA9IDB4ZmM1ZTsKKyAgdC5zaGFkZGFmYXRoYWFyYWJpYyA9IDB4ZmM2MDsKKyAgdC5zaGFkZGFrYXNyYWFyYWJpYyA9IDB4ZmM2MjsKKyAgdC5zaGFkZGFrYXNyYXRhbmFyYWJpYyA9IDB4ZmM1ZjsKKyAgdC5zaGFkZSA9IDB4MjU5MjsKKyAgdC5zaGFkZWRhcmsgPSAweDI1OTM7CisgIHQuc2hhZGVsaWdodCA9IDB4MjU5MTsKKyAgdC5zaGFkZW1lZGl1bSA9IDB4MjU5MjsKKyAgdC5zaGFkZXZhID0gMHgwOTM2OworICB0LnNoYWd1amFyYXRpID0gMHgwYWI2OworICB0LnNoYWd1cm11a2hpID0gMHgwYTM2OworICB0LnNoYWxzaGVsZXRoZWJyZXcgPSAweDA1OTM7CisgIHQuc2hib3BvbW9mbyA9IDB4MzExNTsKKyAgdC5zaGNoYWN5cmlsbGljID0gMHgwNDQ5OworICB0LnNoZWVuYXJhYmljID0gMHgwNjM0OworICB0LnNoZWVuZmluYWxhcmFiaWMgPSAweGZlYjY7CisgIHQuc2hlZW5pbml0aWFsYXJhYmljID0gMHhmZWI3OworICB0LnNoZWVubWVkaWFsYXJhYmljID0gMHhmZWI4OworICB0LnNoZWljb3B0aWMgPSAweDAzZTM7CisgIHQuc2hlcWVsID0gMHgyMGFhOworICB0LnNoZXFlbGhlYnJldyA9IDB4MjBhYTsKKyAgdC5zaGV2YSA9IDB4MDViMDsKKyAgdC5zaGV2YTExNSA9IDB4MDViMDsKKyAgdC5zaGV2YTE1ID0gMHgwNWIwOworICB0LnNoZXZhMjIgPSAweDA1YjA7CisgIHQuc2hldmEyZSA9IDB4MDViMDsKKyAgdC5zaGV2YWhlYnJldyA9IDB4MDViMDsKKyAgdC5zaGV2YW5hcnJvd2hlYnJldyA9IDB4MDViMDsKKyAgdC5zaGV2YXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjA7CisgIHQuc2hldmF3aWRlaGVicmV3ID0gMHgwNWIwOworICB0LnNoaGFjeXJpbGxpYyA9IDB4MDRiYjsKKyAgdC5zaGltYWNvcHRpYyA9IDB4MDNlZDsKKyAgdC5zaGluID0gMHgwNWU5OworICB0LnNoaW5kYWdlc2ggPSAweGZiNDk7CisgIHQuc2hpbmRhZ2VzaGhlYnJldyA9IDB4ZmI0OTsKKyAgdC5zaGluZGFnZXNoc2hpbmRvdCA9IDB4ZmIyYzsKKyAgdC5zaGluZGFnZXNoc2hpbmRvdGhlYnJldyA9IDB4ZmIyYzsKKyAgdC5zaGluZGFnZXNoc2luZG90ID0gMHhmYjJkOworICB0LnNoaW5kYWdlc2hzaW5kb3RoZWJyZXcgPSAweGZiMmQ7CisgIHQuc2hpbmRvdGhlYnJldyA9IDB4MDVjMTsKKyAgdC5zaGluaGVicmV3ID0gMHgwNWU5OworICB0LnNoaW5zaGluZG90ID0gMHhmYjJhOworICB0LnNoaW5zaGluZG90aGVicmV3ID0gMHhmYjJhOworICB0LnNoaW5zaW5kb3QgPSAweGZiMmI7CisgIHQuc2hpbnNpbmRvdGhlYnJldyA9IDB4ZmIyYjsKKyAgdC5zaG9vayA9IDB4MDI4MjsKKyAgdC5zaWdtYSA9IDB4MDNjMzsKKyAgdC5zaWdtYTEgPSAweDAzYzI7CisgIHQuc2lnbWFmaW5hbCA9IDB4MDNjMjsKKyAgdC5zaWdtYWx1bmF0ZXN5bWJvbGdyZWVrID0gMHgwM2YyOworICB0LnNpaGlyYWdhbmEgPSAweDMwNTc7CisgIHQuc2lrYXRha2FuYSA9IDB4MzBiNzsKKyAgdC5zaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdjOworICB0LnNpbHVxaGVicmV3ID0gMHgwNWJkOworICB0LnNpbHVxbGVmdGhlYnJldyA9IDB4MDViZDsKKyAgdC5zaW1pbGFyID0gMHgyMjNjOworICB0LnNpbmRvdGhlYnJldyA9IDB4MDVjMjsKKyAgdC5zaW9zYWNpcmNsZWtvcmVhbiA9IDB4MzI3NDsKKyAgdC5zaW9zYXBhcmVua29yZWFuID0gMHgzMjE0OworICB0LnNpb3NjaWV1Y2tvcmVhbiA9IDB4MzE3ZTsKKyAgdC5zaW9zY2lyY2xla29yZWFuID0gMHgzMjY2OworICB0LnNpb3NraXllb2trb3JlYW4gPSAweDMxN2E7CisgIHQuc2lvc2tvcmVhbiA9IDB4MzE0NTsKKyAgdC5zaW9zbmlldW5rb3JlYW4gPSAweDMxN2I7CisgIHQuc2lvc3BhcmVua29yZWFuID0gMHgzMjA2OworICB0LnNpb3NwaWV1cGtvcmVhbiA9IDB4MzE3ZDsKKyAgdC5zaW9zdGlrZXV0a29yZWFuID0gMHgzMTdjOworICB0LnNpeCA9IDB4MDAzNjsKKyAgdC5zaXhhcmFiaWMgPSAweDA2NjY7CisgIHQuc2l4YmVuZ2FsaSA9IDB4MDllYzsKKyAgdC5zaXhjaXJjbGUgPSAweDI0NjU7CisgIHQuc2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZjsKKyAgdC5zaXhkZXZhID0gMHgwOTZjOworICB0LnNpeGd1amFyYXRpID0gMHgwYWVjOworICB0LnNpeGd1cm11a2hpID0gMHgwYTZjOworICB0LnNpeGhhY2thcmFiaWMgPSAweDA2NjY7CisgIHQuc2l4aGFuZ3pob3UgPSAweDMwMjY7CisgIHQuc2l4aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNTsKKyAgdC5zaXhpbmZlcmlvciA9IDB4MjA4NjsKKyAgdC5zaXhtb25vc3BhY2UgPSAweGZmMTY7CisgIHQuc2l4b2xkc3R5bGUgPSAweGY3MzY7CisgIHQuc2l4cGFyZW4gPSAweDI0Nzk7CisgIHQuc2l4cGVyaW9kID0gMHgyNDhkOworICB0LnNpeHBlcnNpYW4gPSAweDA2ZjY7CisgIHQuc2l4cm9tYW4gPSAweDIxNzU7CisgIHQuc2l4c3VwZXJpb3IgPSAweDIwNzY7CisgIHQuc2l4dGVlbmNpcmNsZSA9IDB4MjQ2ZjsKKyAgdC5zaXh0ZWVuY3VycmVuY3lkZW5vbWluYXRvcmJlbmdhbGkgPSAweDA5Zjk7CisgIHQuc2l4dGVlbnBhcmVuID0gMHgyNDgzOworICB0LnNpeHRlZW5wZXJpb2QgPSAweDI0OTc7CisgIHQuc2l4dGhhaSA9IDB4MGU1NjsKKyAgdC5zbGFzaCA9IDB4MDAyZjsKKyAgdC5zbGFzaG1vbm9zcGFjZSA9IDB4ZmYwZjsKKyAgdC5zbG9uZyA9IDB4MDE3ZjsKKyAgdC5zbG9uZ2RvdGFjY2VudCA9IDB4MWU5YjsKKyAgdC5zbWlsZWZhY2UgPSAweDI2M2E7CisgIHQuc21vbm9zcGFjZSA9IDB4ZmY1MzsKKyAgdC5zb2ZwYXN1cWhlYnJldyA9IDB4MDVjMzsKKyAgdC5zb2Z0aHlwaGVuID0gMHgwMGFkOworICB0LnNvZnRzaWduY3lyaWxsaWMgPSAweDA0NGM7CisgIHQuc29oaXJhZ2FuYSA9IDB4MzA1ZDsKKyAgdC5zb2thdGFrYW5hID0gMHgzMGJkOworICB0LnNva2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2Y7CisgIHQuc29saWR1c2xvbmdvdmVybGF5Y21iID0gMHgwMzM4OworICB0LnNvbGlkdXNzaG9ydG92ZXJsYXljbWIgPSAweDAzMzc7CisgIHQuc29ydXNpdGhhaSA9IDB4MGUyOTsKKyAgdC5zb3NhbGF0aGFpID0gMHgwZTI4OworICB0LnNvc290aGFpID0gMHgwZTBiOworICB0LnNvc3VhdGhhaSA9IDB4MGUyYTsKKyAgdC5zcGFjZSA9IDB4MDAyMDsKKyAgdC5zcGFjZWhhY2thcmFiaWMgPSAweDAwMjA7CisgIHQuc3BhZGUgPSAweDI2NjA7CisgIHQuc3BhZGVzdWl0YmxhY2sgPSAweDI2NjA7CisgIHQuc3BhZGVzdWl0d2hpdGUgPSAweDI2NjQ7CisgIHQuc3BhcmVuID0gMHgyNGFlOworICB0LnNxdWFyZWJlbG93Y21iID0gMHgwMzNiOworICB0LnNxdWFyZWNjID0gMHgzM2M0OworICB0LnNxdWFyZWNtID0gMHgzMzlkOworICB0LnNxdWFyZWRpYWdvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTk7CisgIHQuc3F1YXJlaG9yaXpvbnRhbGZpbGwgPSAweDI1YTQ7CisgIHQuc3F1YXJla2cgPSAweDMzOGY7CisgIHQuc3F1YXJla20gPSAweDMzOWU7CisgIHQuc3F1YXJla21jYXBpdGFsID0gMHgzM2NlOworICB0LnNxdWFyZWxuID0gMHgzM2QxOworICB0LnNxdWFyZWxvZyA9IDB4MzNkMjsKKyAgdC5zcXVhcmVtZyA9IDB4MzM4ZTsKKyAgdC5zcXVhcmVtaWwgPSAweDMzZDU7CisgIHQuc3F1YXJlbW0gPSAweDMzOWM7CisgIHQuc3F1YXJlbXNxdWFyZWQgPSAweDMzYTE7CisgIHQuc3F1YXJlb3J0aG9nb25hbGNyb3NzaGF0Y2hmaWxsID0gMHgyNWE2OworICB0LnNxdWFyZXVwcGVybGVmdHRvbG93ZXJyaWdodGZpbGwgPSAweDI1YTc7CisgIHQuc3F1YXJldXBwZXJyaWdodHRvbG93ZXJsZWZ0ZmlsbCA9IDB4MjVhODsKKyAgdC5zcXVhcmV2ZXJ0aWNhbGZpbGwgPSAweDI1YTU7CisgIHQuc3F1YXJld2hpdGV3aXRoc21hbGxibGFjayA9IDB4MjVhMzsKKyAgdC5zcnNxdWFyZSA9IDB4MzNkYjsKKyAgdC5zc2FiZW5nYWxpID0gMHgwOWI3OworICB0LnNzYWRldmEgPSAweDA5Mzc7CisgIHQuc3NhZ3VqYXJhdGkgPSAweDBhYjc7CisgIHQuc3NhbmdjaWV1Y2tvcmVhbiA9IDB4MzE0OTsKKyAgdC5zc2FuZ2hpZXVoa29yZWFuID0gMHgzMTg1OworICB0LnNzYW5naWV1bmdrb3JlYW4gPSAweDMxODA7CisgIHQuc3NhbmdraXllb2trb3JlYW4gPSAweDMxMzI7CisgIHQuc3NhbmduaWV1bmtvcmVhbiA9IDB4MzE2NTsKKyAgdC5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTQzOworICB0LnNzYW5nc2lvc2tvcmVhbiA9IDB4MzE0NjsKKyAgdC5zc2FuZ3Rpa2V1dGtvcmVhbiA9IDB4MzEzODsKKyAgdC5zc3VwZXJpb3IgPSAweGY2ZjI7CisgIHQuc3RlcmxpbmcgPSAweDAwYTM7CisgIHQuc3Rlcmxpbmdtb25vc3BhY2UgPSAweGZmZTE7CisgIHQuc3Ryb2tlbG9uZ292ZXJsYXljbWIgPSAweDAzMzY7CisgIHQuc3Ryb2tlc2hvcnRvdmVybGF5Y21iID0gMHgwMzM1OworICB0LnN1YnNldCA9IDB4MjI4MjsKKyAgdC5zdWJzZXRub3RlcXVhbCA9IDB4MjI4YTsKKyAgdC5zdWJzZXRvcmVxdWFsID0gMHgyMjg2OworICB0LnN1Y2NlZWRzID0gMHgyMjdiOworICB0LnN1Y2h0aGF0ID0gMHgyMjBiOworICB0LnN1aGlyYWdhbmEgPSAweDMwNTk7CisgIHQuc3VrYXRha2FuYSA9IDB4MzBiOTsKKyAgdC5zdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdkOworICB0LnN1a3VuYXJhYmljID0gMHgwNjUyOworICB0LnN1bW1hdGlvbiA9IDB4MjIxMTsKKyAgdC5zdW4gPSAweDI2M2M7CisgIHQuc3VwZXJzZXQgPSAweDIyODM7CisgIHQuc3VwZXJzZXRub3RlcXVhbCA9IDB4MjI4YjsKKyAgdC5zdXBlcnNldG9yZXF1YWwgPSAweDIyODc7CisgIHQuc3ZzcXVhcmUgPSAweDMzZGM7CisgIHQuc3lvdXdhZXJhc3F1YXJlID0gMHgzMzdjOworICB0LnQgPSAweDAwNzQ7CisgIHQudGFiZW5nYWxpID0gMHgwOWE0OworICB0LnRhY2tkb3duID0gMHgyMmE0OworICB0LnRhY2tsZWZ0ID0gMHgyMmEzOworICB0LnRhZGV2YSA9IDB4MDkyNDsKKyAgdC50YWd1amFyYXRpID0gMHgwYWE0OworICB0LnRhZ3VybXVraGkgPSAweDBhMjQ7CisgIHQudGFoYXJhYmljID0gMHgwNjM3OworICB0LnRhaGZpbmFsYXJhYmljID0gMHhmZWMyOworICB0LnRhaGluaXRpYWxhcmFiaWMgPSAweGZlYzM7CisgIHQudGFoaXJhZ2FuYSA9IDB4MzA1ZjsKKyAgdC50YWhtZWRpYWxhcmFiaWMgPSAweGZlYzQ7CisgIHQudGFpc3lvdWVyYXNxdWFyZSA9IDB4MzM3ZDsKKyAgdC50YWthdGFrYW5hID0gMHgzMGJmOworICB0LnRha2F0YWthbmFoYWxmd2lkdGggPSAweGZmODA7CisgIHQudGF0d2VlbGFyYWJpYyA9IDB4MDY0MDsKKyAgdC50YXUgPSAweDAzYzQ7CisgIHQudGF2ID0gMHgwNWVhOworICB0LnRhdmRhZ2VzID0gMHhmYjRhOworICB0LnRhdmRhZ2VzaCA9IDB4ZmI0YTsKKyAgdC50YXZkYWdlc2hoZWJyZXcgPSAweGZiNGE7CisgIHQudGF2aGVicmV3ID0gMHgwNWVhOworICB0LnRiYXIgPSAweDAxNjc7CisgIHQudGJvcG9tb2ZvID0gMHgzMTBhOworICB0LnRjYXJvbiA9IDB4MDE2NTsKKyAgdC50Y2N1cmwgPSAweDAyYTg7CisgIHQudGNlZGlsbGEgPSAweDAxNjM7CisgIHQudGNoZWhhcmFiaWMgPSAweDA2ODY7CisgIHQudGNoZWhmaW5hbGFyYWJpYyA9IDB4ZmI3YjsKKyAgdC50Y2hlaGluaXRpYWxhcmFiaWMgPSAweGZiN2M7CisgIHQudGNoZWhtZWRpYWxhcmFiaWMgPSAweGZiN2Q7CisgIHQudGNpcmNsZSA9IDB4MjRlMzsKKyAgdC50Y2lyY3VtZmxleGJlbG93ID0gMHgxZTcxOworICB0LnRjb21tYWFjY2VudCA9IDB4MDE2MzsKKyAgdC50ZGllcmVzaXMgPSAweDFlOTc7CisgIHQudGRvdGFjY2VudCA9IDB4MWU2YjsKKyAgdC50ZG90YmVsb3cgPSAweDFlNmQ7CisgIHQudGVjeXJpbGxpYyA9IDB4MDQ0MjsKKyAgdC50ZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGFkOworICB0LnRlaGFyYWJpYyA9IDB4MDYyYTsKKyAgdC50ZWhmaW5hbGFyYWJpYyA9IDB4ZmU5NjsKKyAgdC50ZWhoYWhpbml0aWFsYXJhYmljID0gMHhmY2EyOworICB0LnRlaGhhaGlzb2xhdGVkYXJhYmljID0gMHhmYzBjOworICB0LnRlaGluaXRpYWxhcmFiaWMgPSAweGZlOTc7CisgIHQudGVoaXJhZ2FuYSA9IDB4MzA2NjsKKyAgdC50ZWhqZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMTsKKyAgdC50ZWhqZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjMGI7CisgIHQudGVobWFyYnV0YWFyYWJpYyA9IDB4MDYyOTsKKyAgdC50ZWhtYXJidXRhZmluYWxhcmFiaWMgPSAweGZlOTQ7CisgIHQudGVobWVkaWFsYXJhYmljID0gMHhmZTk4OworICB0LnRlaG1lZW1pbml0aWFsYXJhYmljID0gMHhmY2E0OworICB0LnRlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwZTsKKyAgdC50ZWhub29uZmluYWxhcmFiaWMgPSAweGZjNzM7CisgIHQudGVrYXRha2FuYSA9IDB4MzBjNjsKKyAgdC50ZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgzOworICB0LnRlbGVwaG9uZSA9IDB4MjEyMTsKKyAgdC50ZWxlcGhvbmVibGFjayA9IDB4MjYwZTsKKyAgdC50ZWxpc2hhZ2Vkb2xhaGVicmV3ID0gMHgwNWEwOworICB0LnRlbGlzaGFxZXRhbmFoZWJyZXcgPSAweDA1YTk7CisgIHQudGVuY2lyY2xlID0gMHgyNDY5OworICB0LnRlbmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjk7CisgIHQudGVucGFyZW4gPSAweDI0N2Q7CisgIHQudGVucGVyaW9kID0gMHgyNDkxOworICB0LnRlbnJvbWFuID0gMHgyMTc5OworICB0LnRlc2ggPSAweDAyYTc7CisgIHQudGV0ID0gMHgwNWQ4OworICB0LnRldGRhZ2VzaCA9IDB4ZmIzODsKKyAgdC50ZXRkYWdlc2hoZWJyZXcgPSAweGZiMzg7CisgIHQudGV0aGVicmV3ID0gMHgwNWQ4OworICB0LnRldHNlY3lyaWxsaWMgPSAweDA0YjU7CisgIHQudGV2aXJoZWJyZXcgPSAweDA1OWI7CisgIHQudGV2aXJsZWZ0aGVicmV3ID0gMHgwNTliOworICB0LnRoYWJlbmdhbGkgPSAweDA5YTU7CisgIHQudGhhZGV2YSA9IDB4MDkyNTsKKyAgdC50aGFndWphcmF0aSA9IDB4MGFhNTsKKyAgdC50aGFndXJtdWtoaSA9IDB4MGEyNTsKKyAgdC50aGFsYXJhYmljID0gMHgwNjMwOworICB0LnRoYWxmaW5hbGFyYWJpYyA9IDB4ZmVhYzsKKyAgdC50aGFudGhha2hhdGxvd2xlZnR0aGFpID0gMHhmODk4OworICB0LnRoYW50aGFraGF0bG93cmlnaHR0aGFpID0gMHhmODk3OworICB0LnRoYW50aGFraGF0dGhhaSA9IDB4MGU0YzsKKyAgdC50aGFudGhha2hhdHVwcGVybGVmdHRoYWkgPSAweGY4OTY7CisgIHQudGhlaGFyYWJpYyA9IDB4MDYyYjsKKyAgdC50aGVoZmluYWxhcmFiaWMgPSAweGZlOWE7CisgIHQudGhlaGluaXRpYWxhcmFiaWMgPSAweGZlOWI7CisgIHQudGhlaG1lZGlhbGFyYWJpYyA9IDB4ZmU5YzsKKyAgdC50aGVyZWV4aXN0cyA9IDB4MjIwMzsKKyAgdC50aGVyZWZvcmUgPSAweDIyMzQ7CisgIHQudGhldGEgPSAweDAzYjg7CisgIHQudGhldGExID0gMHgwM2QxOworICB0LnRoZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDE7CisgIHQudGhpZXV0aGFjaXJjbGVrb3JlYW4gPSAweDMyNzk7CisgIHQudGhpZXV0aGFwYXJlbmtvcmVhbiA9IDB4MzIxOTsKKyAgdC50aGlldXRoY2lyY2xla29yZWFuID0gMHgzMjZiOworICB0LnRoaWV1dGhrb3JlYW4gPSAweDMxNGM7CisgIHQudGhpZXV0aHBhcmVua29yZWFuID0gMHgzMjBiOworICB0LnRoaXJ0ZWVuY2lyY2xlID0gMHgyNDZjOworICB0LnRoaXJ0ZWVucGFyZW4gPSAweDI0ODA7CisgIHQudGhpcnRlZW5wZXJpb2QgPSAweDI0OTQ7CisgIHQudGhvbmFuZ21vbnRob3RoYWkgPSAweDBlMTE7CisgIHQudGhvb2sgPSAweDAxYWQ7CisgIHQudGhvcGh1dGhhb3RoYWkgPSAweDBlMTI7CisgIHQudGhvcm4gPSAweDAwZmU7CisgIHQudGhvdGhhaGFudGhhaSA9IDB4MGUxNzsKKyAgdC50aG90aGFudGhhaSA9IDB4MGUxMDsKKyAgdC50aG90aG9uZ3RoYWkgPSAweDBlMTg7CisgIHQudGhvdGh1bmd0aGFpID0gMHgwZTE2OworICB0LnRob3VzYW5kY3lyaWxsaWMgPSAweDA0ODI7CisgIHQudGhvdXNhbmRzc2VwYXJhdG9yYXJhYmljID0gMHgwNjZjOworICB0LnRob3VzYW5kc3NlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmM7CisgIHQudGhyZWUgPSAweDAwMzM7CisgIHQudGhyZWVhcmFiaWMgPSAweDA2NjM7CisgIHQudGhyZWViZW5nYWxpID0gMHgwOWU5OworICB0LnRocmVlY2lyY2xlID0gMHgyNDYyOworICB0LnRocmVlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4YzsKKyAgdC50aHJlZWRldmEgPSAweDA5Njk7CisgIHQudGhyZWVlaWdodGhzID0gMHgyMTVjOworICB0LnRocmVlZ3VqYXJhdGkgPSAweDBhZTk7CisgIHQudGhyZWVndXJtdWtoaSA9IDB4MGE2OTsKKyAgdC50aHJlZWhhY2thcmFiaWMgPSAweDA2NjM7CisgIHQudGhyZWVoYW5nemhvdSA9IDB4MzAyMzsKKyAgdC50aHJlZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjI7CisgIHQudGhyZWVpbmZlcmlvciA9IDB4MjA4MzsKKyAgdC50aHJlZW1vbm9zcGFjZSA9IDB4ZmYxMzsKKyAgdC50aHJlZW51bWVyYXRvcmJlbmdhbGkgPSAweDA5ZjY7CisgIHQudGhyZWVvbGRzdHlsZSA9IDB4ZjczMzsKKyAgdC50aHJlZXBhcmVuID0gMHgyNDc2OworICB0LnRocmVlcGVyaW9kID0gMHgyNDhhOworICB0LnRocmVlcGVyc2lhbiA9IDB4MDZmMzsKKyAgdC50aHJlZXF1YXJ0ZXJzID0gMHgwMGJlOworICB0LnRocmVlcXVhcnRlcnNlbWRhc2ggPSAweGY2ZGU7CisgIHQudGhyZWVyb21hbiA9IDB4MjE3MjsKKyAgdC50aHJlZXN1cGVyaW9yID0gMHgwMGIzOworICB0LnRocmVldGhhaSA9IDB4MGU1MzsKKyAgdC50aHpzcXVhcmUgPSAweDMzOTQ7CisgIHQudGloaXJhZ2FuYSA9IDB4MzA2MTsKKyAgdC50aWthdGFrYW5hID0gMHgzMGMxOworICB0LnRpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmODE7CisgIHQudGlrZXV0YWNpcmNsZWtvcmVhbiA9IDB4MzI3MDsKKyAgdC50aWtldXRhcGFyZW5rb3JlYW4gPSAweDMyMTA7CisgIHQudGlrZXV0Y2lyY2xla29yZWFuID0gMHgzMjYyOworICB0LnRpa2V1dGtvcmVhbiA9IDB4MzEzNzsKKyAgdC50aWtldXRwYXJlbmtvcmVhbiA9IDB4MzIwMjsKKyAgdC50aWxkZSA9IDB4MDJkYzsKKyAgdC50aWxkZWJlbG93Y21iID0gMHgwMzMwOworICB0LnRpbGRlY21iID0gMHgwMzAzOworICB0LnRpbGRlY29tYiA9IDB4MDMwMzsKKyAgdC50aWxkZWRvdWJsZWNtYiA9IDB4MDM2MDsKKyAgdC50aWxkZW9wZXJhdG9yID0gMHgyMjNjOworICB0LnRpbGRlb3ZlcmxheWNtYiA9IDB4MDMzNDsKKyAgdC50aWxkZXZlcnRpY2FsY21iID0gMHgwMzNlOworICB0LnRpbWVzY2lyY2xlID0gMHgyMjk3OworICB0LnRpcGVoYWhlYnJldyA9IDB4MDU5NjsKKyAgdC50aXBlaGFsZWZ0aGVicmV3ID0gMHgwNTk2OworICB0LnRpcHBpZ3VybXVraGkgPSAweDBhNzA7CisgIHQudGl0bG9jeXJpbGxpY2NtYiA9IDB4MDQ4MzsKKyAgdC50aXduYXJtZW5pYW4gPSAweDA1N2Y7CisgIHQudGxpbmViZWxvdyA9IDB4MWU2ZjsKKyAgdC50bW9ub3NwYWNlID0gMHhmZjU0OworICB0LnRvYXJtZW5pYW4gPSAweDA1Njk7CisgIHQudG9oaXJhZ2FuYSA9IDB4MzA2ODsKKyAgdC50b2thdGFrYW5hID0gMHgzMGM4OworICB0LnRva2F0YWthbmFoYWxmd2lkdGggPSAweGZmODQ7CisgIHQudG9uZWJhcmV4dHJhaGlnaG1vZCA9IDB4MDJlNTsKKyAgdC50b25lYmFyZXh0cmFsb3dtb2QgPSAweDAyZTk7CisgIHQudG9uZWJhcmhpZ2htb2QgPSAweDAyZTY7CisgIHQudG9uZWJhcmxvd21vZCA9IDB4MDJlODsKKyAgdC50b25lYmFybWlkbW9kID0gMHgwMmU3OworICB0LnRvbmVmaXZlID0gMHgwMWJkOworICB0LnRvbmVzaXggPSAweDAxODU7CisgIHQudG9uZXR3byA9IDB4MDFhODsKKyAgdC50b25vcyA9IDB4MDM4NDsKKyAgdC50b25zcXVhcmUgPSAweDMzMjc7CisgIHQudG9wYXRha3RoYWkgPSAweDBlMGY7CisgIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0ID0gMHgzMDE0OworICB0LnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHNtYWxsID0gMHhmZTVkOworICB0LnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTM5OworICB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQgPSAweDMwMTU7CisgIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHNtYWxsID0gMHhmZTVlOworICB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYTsKKyAgdC50b3Rhb3RoYWkgPSAweDBlMTU7CisgIHQudHBhbGF0YWxob29rID0gMHgwMWFiOworICB0LnRwYXJlbiA9IDB4MjRhZjsKKyAgdC50cmFkZW1hcmsgPSAweDIxMjI7CisgIHQudHJhZGVtYXJrc2FucyA9IDB4ZjhlYTsKKyAgdC50cmFkZW1hcmtzZXJpZiA9IDB4ZjZkYjsKKyAgdC50cmV0cm9mbGV4aG9vayA9IDB4MDI4ODsKKyAgdC50cmlhZ2RuID0gMHgyNWJjOworICB0LnRyaWFnbGYgPSAweDI1YzQ7CisgIHQudHJpYWdydCA9IDB4MjViYTsKKyAgdC50cmlhZ3VwID0gMHgyNWIyOworICB0LnRzID0gMHgwMmE2OworICB0LnRzYWRpID0gMHgwNWU2OworICB0LnRzYWRpZGFnZXNoID0gMHhmYjQ2OworICB0LnRzYWRpZGFnZXNoaGVicmV3ID0gMHhmYjQ2OworICB0LnRzYWRpaGVicmV3ID0gMHgwNWU2OworICB0LnRzZWN5cmlsbGljID0gMHgwNDQ2OworICB0LnRzZXJlID0gMHgwNWI1OworICB0LnRzZXJlMTIgPSAweDA1YjU7CisgIHQudHNlcmUxZSA9IDB4MDViNTsKKyAgdC50c2VyZTJiID0gMHgwNWI1OworICB0LnRzZXJlaGVicmV3ID0gMHgwNWI1OworICB0LnRzZXJlbmFycm93aGVicmV3ID0gMHgwNWI1OworICB0LnRzZXJlcXVhcnRlcmhlYnJldyA9IDB4MDViNTsKKyAgdC50c2VyZXdpZGVoZWJyZXcgPSAweDA1YjU7CisgIHQudHNoZWN5cmlsbGljID0gMHgwNDViOworICB0LnRzdXBlcmlvciA9IDB4ZjZmMzsKKyAgdC50dGFiZW5nYWxpID0gMHgwOTlmOworICB0LnR0YWRldmEgPSAweDA5MWY7CisgIHQudHRhZ3VqYXJhdGkgPSAweDBhOWY7CisgIHQudHRhZ3VybXVraGkgPSAweDBhMWY7CisgIHQudHRlaGFyYWJpYyA9IDB4MDY3OTsKKyAgdC50dGVoZmluYWxhcmFiaWMgPSAweGZiNjc7CisgIHQudHRlaGluaXRpYWxhcmFiaWMgPSAweGZiNjg7CisgIHQudHRlaG1lZGlhbGFyYWJpYyA9IDB4ZmI2OTsKKyAgdC50dGhhYmVuZ2FsaSA9IDB4MDlhMDsKKyAgdC50dGhhZGV2YSA9IDB4MDkyMDsKKyAgdC50dGhhZ3VqYXJhdGkgPSAweDBhYTA7CisgIHQudHRoYWd1cm11a2hpID0gMHgwYTIwOworICB0LnR0dXJuZWQgPSAweDAyODc7CisgIHQudHVoaXJhZ2FuYSA9IDB4MzA2NDsKKyAgdC50dWthdGFrYW5hID0gMHgzMGM0OworICB0LnR1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmODI7CisgIHQudHVzbWFsbGhpcmFnYW5hID0gMHgzMDYzOworICB0LnR1c21hbGxrYXRha2FuYSA9IDB4MzBjMzsKKyAgdC50dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmY7CisgIHQudHdlbHZlY2lyY2xlID0gMHgyNDZiOworICB0LnR3ZWx2ZXBhcmVuID0gMHgyNDdmOworICB0LnR3ZWx2ZXBlcmlvZCA9IDB4MjQ5MzsKKyAgdC50d2VsdmVyb21hbiA9IDB4MjE3YjsKKyAgdC50d2VudHljaXJjbGUgPSAweDI0NzM7CisgIHQudHdlbnR5aGFuZ3pob3UgPSAweDUzNDQ7CisgIHQudHdlbnR5cGFyZW4gPSAweDI0ODc7CisgIHQudHdlbnR5cGVyaW9kID0gMHgyNDliOworICB0LnR3byA9IDB4MDAzMjsKKyAgdC50d29hcmFiaWMgPSAweDA2NjI7CisgIHQudHdvYmVuZ2FsaSA9IDB4MDllODsKKyAgdC50d29jaXJjbGUgPSAweDI0NjE7CisgIHQudHdvY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4YjsKKyAgdC50d29kZXZhID0gMHgwOTY4OworICB0LnR3b2RvdGVubGVhZGVyID0gMHgyMDI1OworICB0LnR3b2RvdGxlYWRlciA9IDB4MjAyNTsKKyAgdC50d29kb3RsZWFkZXJ2ZXJ0aWNhbCA9IDB4ZmUzMDsKKyAgdC50d29ndWphcmF0aSA9IDB4MGFlODsKKyAgdC50d29ndXJtdWtoaSA9IDB4MGE2ODsKKyAgdC50d29oYWNrYXJhYmljID0gMHgwNjYyOworICB0LnR3b2hhbmd6aG91ID0gMHgzMDIyOworICB0LnR3b2lkZW9ncmFwaGljcGFyZW4gPSAweDMyMjE7CisgIHQudHdvaW5mZXJpb3IgPSAweDIwODI7CisgIHQudHdvbW9ub3NwYWNlID0gMHhmZjEyOworICB0LnR3b251bWVyYXRvcmJlbmdhbGkgPSAweDA5ZjU7CisgIHQudHdvb2xkc3R5bGUgPSAweGY3MzI7CisgIHQudHdvcGFyZW4gPSAweDI0NzU7CisgIHQudHdvcGVyaW9kID0gMHgyNDg5OworICB0LnR3b3BlcnNpYW4gPSAweDA2ZjI7CisgIHQudHdvcm9tYW4gPSAweDIxNzE7CisgIHQudHdvc3Ryb2tlID0gMHgwMWJiOworICB0LnR3b3N1cGVyaW9yID0gMHgwMGIyOworICB0LnR3b3RoYWkgPSAweDBlNTI7CisgIHQudHdvdGhpcmRzID0gMHgyMTU0OworICB0LnUgPSAweDAwNzU7CisgIHQudWFjdXRlID0gMHgwMGZhOworICB0LnViYXIgPSAweDAyODk7CisgIHQudWJlbmdhbGkgPSAweDA5ODk7CisgIHQudWJvcG9tb2ZvID0gMHgzMTI4OworICB0LnVicmV2ZSA9IDB4MDE2ZDsKKyAgdC51Y2Fyb24gPSAweDAxZDQ7CisgIHQudWNpcmNsZSA9IDB4MjRlNDsKKyAgdC51Y2lyY3VtZmxleCA9IDB4MDBmYjsKKyAgdC51Y2lyY3VtZmxleGJlbG93ID0gMHgxZTc3OworICB0LnVjeXJpbGxpYyA9IDB4MDQ0MzsKKyAgdC51ZGF0dGFkZXZhID0gMHgwOTUxOworICB0LnVkYmxhY3V0ZSA9IDB4MDE3MTsKKyAgdC51ZGJsZ3JhdmUgPSAweDAyMTU7CisgIHQudWRldmEgPSAweDA5MDk7CisgIHQudWRpZXJlc2lzID0gMHgwMGZjOworICB0LnVkaWVyZXNpc2FjdXRlID0gMHgwMWQ4OworICB0LnVkaWVyZXNpc2JlbG93ID0gMHgxZTczOworICB0LnVkaWVyZXNpc2Nhcm9uID0gMHgwMWRhOworICB0LnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGYxOworICB0LnVkaWVyZXNpc2dyYXZlID0gMHgwMWRjOworICB0LnVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNjsKKyAgdC51ZG90YmVsb3cgPSAweDFlZTU7CisgIHQudWdyYXZlID0gMHgwMGY5OworICB0LnVndWphcmF0aSA9IDB4MGE4OTsKKyAgdC51Z3VybXVraGkgPSAweDBhMDk7CisgIHQudWhpcmFnYW5hID0gMHgzMDQ2OworICB0LnVob29rYWJvdmUgPSAweDFlZTc7CisgIHQudWhvcm4gPSAweDAxYjA7CisgIHQudWhvcm5hY3V0ZSA9IDB4MWVlOTsKKyAgdC51aG9ybmRvdGJlbG93ID0gMHgxZWYxOworICB0LnVob3JuZ3JhdmUgPSAweDFlZWI7CisgIHQudWhvcm5ob29rYWJvdmUgPSAweDFlZWQ7CisgIHQudWhvcm50aWxkZSA9IDB4MWVlZjsKKyAgdC51aHVuZ2FydW1sYXV0ID0gMHgwMTcxOworICB0LnVodW5nYXJ1bWxhdXRjeXJpbGxpYyA9IDB4MDRmMzsKKyAgdC51aW52ZXJ0ZWRicmV2ZSA9IDB4MDIxNzsKKyAgdC51a2F0YWthbmEgPSAweDMwYTY7CisgIHQudWthdGFrYW5haGFsZndpZHRoID0gMHhmZjczOworICB0LnVrY3lyaWxsaWMgPSAweDA0Nzk7CisgIHQudWtvcmVhbiA9IDB4MzE1YzsKKyAgdC51bWFjcm9uID0gMHgwMTZiOworICB0LnVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZjsKKyAgdC51bWFjcm9uZGllcmVzaXMgPSAweDFlN2I7CisgIHQudW1hdHJhZ3VybXVraGkgPSAweDBhNDE7CisgIHQudW1vbm9zcGFjZSA9IDB4ZmY1NTsKKyAgdC51bmRlcnNjb3JlID0gMHgwMDVmOworICB0LnVuZGVyc2NvcmVkYmwgPSAweDIwMTc7CisgIHQudW5kZXJzY29yZW1vbm9zcGFjZSA9IDB4ZmYzZjsKKyAgdC51bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzM7CisgIHQudW5kZXJzY29yZXdhdnkgPSAweGZlNGY7CisgIHQudW5pb24gPSAweDIyMmE7CisgIHQudW5pdmVyc2FsID0gMHgyMjAwOworICB0LnVvZ29uZWsgPSAweDAxNzM7CisgIHQudXBhcmVuID0gMHgyNGIwOworICB0LnVwYmxvY2sgPSAweDI1ODA7CisgIHQudXBwZXJkb3RoZWJyZXcgPSAweDA1YzQ7CisgIHQudXBzaWxvbiA9IDB4MDNjNTsKKyAgdC51cHNpbG9uZGllcmVzaXMgPSAweDAzY2I7CisgIHQudXBzaWxvbmRpZXJlc2lzdG9ub3MgPSAweDAzYjA7CisgIHQudXBzaWxvbmxhdGluID0gMHgwMjhhOworICB0LnVwc2lsb250b25vcyA9IDB4MDNjZDsKKyAgdC51cHRhY2tiZWxvd2NtYiA9IDB4MDMxZDsKKyAgdC51cHRhY2ttb2QgPSAweDAyZDQ7CisgIHQudXJhZ3VybXVraGkgPSAweDBhNzM7CisgIHQudXJpbmcgPSAweDAxNmY7CisgIHQudXNob3J0Y3lyaWxsaWMgPSAweDA0NWU7CisgIHQudXNtYWxsaGlyYWdhbmEgPSAweDMwNDU7CisgIHQudXNtYWxsa2F0YWthbmEgPSAweDMwYTU7CisgIHQudXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjk7CisgIHQudXN0cmFpZ2h0Y3lyaWxsaWMgPSAweDA0YWY7CisgIHQudXN0cmFpZ2h0c3Ryb2tlY3lyaWxsaWMgPSAweDA0YjE7CisgIHQudXRpbGRlID0gMHgwMTY5OworICB0LnV0aWxkZWFjdXRlID0gMHgxZTc5OworICB0LnV0aWxkZWJlbG93ID0gMHgxZTc1OworICB0LnV1YmVuZ2FsaSA9IDB4MDk4YTsKKyAgdC51dWRldmEgPSAweDA5MGE7CisgIHQudXVndWphcmF0aSA9IDB4MGE4YTsKKyAgdC51dWd1cm11a2hpID0gMHgwYTBhOworICB0LnV1bWF0cmFndXJtdWtoaSA9IDB4MGE0MjsKKyAgdC51dXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzI7CisgIHQudXV2b3dlbHNpZ25kZXZhID0gMHgwOTQyOworICB0LnV1dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzI7CisgIHQudXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzE7CisgIHQudXZvd2Vsc2lnbmRldmEgPSAweDA5NDE7CisgIHQudXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMxOworICB0LnYgPSAweDAwNzY7CisgIHQudmFkZXZhID0gMHgwOTM1OworICB0LnZhZ3VqYXJhdGkgPSAweDBhYjU7CisgIHQudmFndXJtdWtoaSA9IDB4MGEzNTsKKyAgdC52YWthdGFrYW5hID0gMHgzMGY3OworICB0LnZhdiA9IDB4MDVkNTsKKyAgdC52YXZkYWdlc2ggPSAweGZiMzU7CisgIHQudmF2ZGFnZXNoNjUgPSAweGZiMzU7CisgIHQudmF2ZGFnZXNoaGVicmV3ID0gMHhmYjM1OworICB0LnZhdmhlYnJldyA9IDB4MDVkNTsKKyAgdC52YXZob2xhbSA9IDB4ZmI0YjsKKyAgdC52YXZob2xhbWhlYnJldyA9IDB4ZmI0YjsKKyAgdC52YXZ2YXZoZWJyZXcgPSAweDA1ZjA7CisgIHQudmF2eW9kaGVicmV3ID0gMHgwNWYxOworICB0LnZjaXJjbGUgPSAweDI0ZTU7CisgIHQudmRvdGJlbG93ID0gMHgxZTdmOworICB0LnZlY3lyaWxsaWMgPSAweDA0MzI7CisgIHQudmVoYXJhYmljID0gMHgwNmE0OworICB0LnZlaGZpbmFsYXJhYmljID0gMHhmYjZiOworICB0LnZlaGluaXRpYWxhcmFiaWMgPSAweGZiNmM7CisgIHQudmVobWVkaWFsYXJhYmljID0gMHhmYjZkOworICB0LnZla2F0YWthbmEgPSAweDMwZjk7CisgIHQudmVudXMgPSAweDI2NDA7CisgIHQudmVydGljYWxiYXIgPSAweDAwN2M7CisgIHQudmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGQ7CisgIHQudmVydGljYWxsaW5lYmVsb3djbWIgPSAweDAzMjk7CisgIHQudmVydGljYWxsaW5lbG93bW9kID0gMHgwMmNjOworICB0LnZlcnRpY2FsbGluZW1vZCA9IDB4MDJjODsKKyAgdC52ZXdhcm1lbmlhbiA9IDB4MDU3ZTsKKyAgdC52aG9vayA9IDB4MDI4YjsKKyAgdC52aWthdGFrYW5hID0gMHgzMGY4OworICB0LnZpcmFtYWJlbmdhbGkgPSAweDA5Y2Q7CisgIHQudmlyYW1hZGV2YSA9IDB4MDk0ZDsKKyAgdC52aXJhbWFndWphcmF0aSA9IDB4MGFjZDsKKyAgdC52aXNhcmdhYmVuZ2FsaSA9IDB4MDk4MzsKKyAgdC52aXNhcmdhZGV2YSA9IDB4MDkwMzsKKyAgdC52aXNhcmdhZ3VqYXJhdGkgPSAweDBhODM7CisgIHQudm1vbm9zcGFjZSA9IDB4ZmY1NjsKKyAgdC52b2FybWVuaWFuID0gMHgwNTc4OworICB0LnZvaWNlZGl0ZXJhdGlvbmhpcmFnYW5hID0gMHgzMDllOworICB0LnZvaWNlZGl0ZXJhdGlvbmthdGFrYW5hID0gMHgzMGZlOworICB0LnZvaWNlZG1hcmtrYW5hID0gMHgzMDliOworICB0LnZvaWNlZG1hcmtrYW5haGFsZndpZHRoID0gMHhmZjllOworICB0LnZva2F0YWthbmEgPSAweDMwZmE7CisgIHQudnBhcmVuID0gMHgyNGIxOworICB0LnZ0aWxkZSA9IDB4MWU3ZDsKKyAgdC52dHVybmVkID0gMHgwMjhjOworICB0LnZ1aGlyYWdhbmEgPSAweDMwOTQ7CisgIHQudnVrYXRha2FuYSA9IDB4MzBmNDsKKyAgdC53ID0gMHgwMDc3OworICB0LndhY3V0ZSA9IDB4MWU4MzsKKyAgdC53YWVrb3JlYW4gPSAweDMxNTk7CisgIHQud2FoaXJhZ2FuYSA9IDB4MzA4ZjsKKyAgdC53YWthdGFrYW5hID0gMHgzMGVmOworICB0Lndha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWM7CisgIHQud2Frb3JlYW4gPSAweDMxNTg7CisgIHQud2FzbWFsbGhpcmFnYW5hID0gMHgzMDhlOworICB0Lndhc21hbGxrYXRha2FuYSA9IDB4MzBlZTsKKyAgdC53YXR0b3NxdWFyZSA9IDB4MzM1NzsKKyAgdC53YXZlZGFzaCA9IDB4MzAxYzsKKyAgdC53YXZ5dW5kZXJzY29yZXZlcnRpY2FsID0gMHhmZTM0OworICB0Lndhd2FyYWJpYyA9IDB4MDY0ODsKKyAgdC53YXdmaW5hbGFyYWJpYyA9IDB4ZmVlZTsKKyAgdC53YXdoYW16YWFib3ZlYXJhYmljID0gMHgwNjI0OworICB0Lndhd2hhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NjsKKyAgdC53YnNxdWFyZSA9IDB4MzNkZDsKKyAgdC53Y2lyY2xlID0gMHgyNGU2OworICB0LndjaXJjdW1mbGV4ID0gMHgwMTc1OworICB0LndkaWVyZXNpcyA9IDB4MWU4NTsKKyAgdC53ZG90YWNjZW50ID0gMHgxZTg3OworICB0Lndkb3RiZWxvdyA9IDB4MWU4OTsKKyAgdC53ZWhpcmFnYW5hID0gMHgzMDkxOworICB0LndlaWVyc3RyYXNzID0gMHgyMTE4OworICB0Lndla2F0YWthbmEgPSAweDMwZjE7CisgIHQud2Vrb3JlYW4gPSAweDMxNWU7CisgIHQud2Vva29yZWFuID0gMHgzMTVkOworICB0LndncmF2ZSA9IDB4MWU4MTsKKyAgdC53aGl0ZWJ1bGxldCA9IDB4MjVlNjsKKyAgdC53aGl0ZWNpcmNsZSA9IDB4MjVjYjsKKyAgdC53aGl0ZWNpcmNsZWludmVyc2UgPSAweDI1ZDk7CisgIHQud2hpdGVjb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwZTsKKyAgdC53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlNDM7CisgIHQud2hpdGVjb3JuZXJicmFja2V0cmlnaHQgPSAweDMwMGY7CisgIHQud2hpdGVjb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0NDsKKyAgdC53aGl0ZWRpYW1vbmQgPSAweDI1Yzc7CisgIHQud2hpdGVkaWFtb25kY29udGFpbmluZ2JsYWNrc21hbGxkaWFtb25kID0gMHgyNWM4OworICB0LndoaXRlZG93bnBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViZjsKKyAgdC53aGl0ZWRvd25wb2ludGluZ3RyaWFuZ2xlID0gMHgyNWJkOworICB0LndoaXRlbGVmdHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjVjMzsKKyAgdC53aGl0ZWxlZnRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWMxOworICB0LndoaXRlbGVudGljdWxhcmJyYWNrZXRsZWZ0ID0gMHgzMDE2OworICB0LndoaXRlbGVudGljdWxhcmJyYWNrZXRyaWdodCA9IDB4MzAxNzsKKyAgdC53aGl0ZXJpZ2h0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWI5OworICB0LndoaXRlcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI3OworICB0LndoaXRlc21hbGxzcXVhcmUgPSAweDI1YWI7CisgIHQud2hpdGVzbWlsaW5nZmFjZSA9IDB4MjYzYTsKKyAgdC53aGl0ZXNxdWFyZSA9IDB4MjVhMTsKKyAgdC53aGl0ZXN0YXIgPSAweDI2MDY7CisgIHQud2hpdGV0ZWxlcGhvbmUgPSAweDI2MGY7CisgIHQud2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQgPSAweDMwMTg7CisgIHQud2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0ID0gMHgzMDE5OworICB0LndoaXRldXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjU7CisgIHQud2hpdGV1cHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YjM7CisgIHQud2loaXJhZ2FuYSA9IDB4MzA5MDsKKyAgdC53aWthdGFrYW5hID0gMHgzMGYwOworICB0Lndpa29yZWFuID0gMHgzMTVmOworICB0Lndtb25vc3BhY2UgPSAweGZmNTc7CisgIHQud29oaXJhZ2FuYSA9IDB4MzA5MjsKKyAgdC53b2thdGFrYW5hID0gMHgzMGYyOworICB0Lndva2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjY7CisgIHQud29uID0gMHgyMGE5OworICB0Lndvbm1vbm9zcGFjZSA9IDB4ZmZlNjsKKyAgdC53b3dhZW50aGFpID0gMHgwZTI3OworICB0LndwYXJlbiA9IDB4MjRiMjsKKyAgdC53cmluZyA9IDB4MWU5ODsKKyAgdC53c3VwZXJpb3IgPSAweDAyYjc7CisgIHQud3R1cm5lZCA9IDB4MDI4ZDsKKyAgdC53eW5uID0gMHgwMWJmOworICB0LnggPSAweDAwNzg7CisgIHQueGFib3ZlY21iID0gMHgwMzNkOworICB0Lnhib3BvbW9mbyA9IDB4MzExMjsKKyAgdC54Y2lyY2xlID0gMHgyNGU3OworICB0LnhkaWVyZXNpcyA9IDB4MWU4ZDsKKyAgdC54ZG90YWNjZW50ID0gMHgxZThiOworICB0LnhlaGFybWVuaWFuID0gMHgwNTZkOworICB0LnhpID0gMHgwM2JlOworICB0Lnhtb25vc3BhY2UgPSAweGZmNTg7CisgIHQueHBhcmVuID0gMHgyNGIzOworICB0LnhzdXBlcmlvciA9IDB4MDJlMzsKKyAgdC55ID0gMHgwMDc5OworICB0LnlhYWRvc3F1YXJlID0gMHgzMzRlOworICB0LnlhYmVuZ2FsaSA9IDB4MDlhZjsKKyAgdC55YWN1dGUgPSAweDAwZmQ7CisgIHQueWFkZXZhID0gMHgwOTJmOworICB0LnlhZWtvcmVhbiA9IDB4MzE1MjsKKyAgdC55YWd1amFyYXRpID0gMHgwYWFmOworICB0LnlhZ3VybXVraGkgPSAweDBhMmY7CisgIHQueWFoaXJhZ2FuYSA9IDB4MzA4NDsKKyAgdC55YWthdGFrYW5hID0gMHgzMGU0OworICB0Lnlha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTQ7CisgIHQueWFrb3JlYW4gPSAweDMxNTE7CisgIHQueWFtYWtrYW50aGFpID0gMHgwZTRlOworICB0Lnlhc21hbGxoaXJhZ2FuYSA9IDB4MzA4MzsKKyAgdC55YXNtYWxsa2F0YWthbmEgPSAweDMwZTM7CisgIHQueWFzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZjOworICB0LnlhdGN5cmlsbGljID0gMHgwNDYzOworICB0LnljaXJjbGUgPSAweDI0ZTg7CisgIHQueWNpcmN1bWZsZXggPSAweDAxNzc7CisgIHQueWRpZXJlc2lzID0gMHgwMGZmOworICB0Lnlkb3RhY2NlbnQgPSAweDFlOGY7CisgIHQueWRvdGJlbG93ID0gMHgxZWY1OworICB0LnllaGFyYWJpYyA9IDB4MDY0YTsKKyAgdC55ZWhiYXJyZWVhcmFiaWMgPSAweDA2ZDI7CisgIHQueWVoYmFycmVlZmluYWxhcmFiaWMgPSAweGZiYWY7CisgIHQueWVoZmluYWxhcmFiaWMgPSAweGZlZjI7CisgIHQueWVoaGFtemFhYm92ZWFyYWJpYyA9IDB4MDYyNjsKKyAgdC55ZWhoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlOGE7CisgIHQueWVoaGFtemFhYm92ZWluaXRpYWxhcmFiaWMgPSAweGZlOGI7CisgIHQueWVoaGFtemFhYm92ZW1lZGlhbGFyYWJpYyA9IDB4ZmU4YzsKKyAgdC55ZWhpbml0aWFsYXJhYmljID0gMHhmZWYzOworICB0LnllaG1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKKyAgdC55ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkZDsKKyAgdC55ZWhtZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNTg7CisgIHQueWVobm9vbmZpbmFsYXJhYmljID0gMHhmYzk0OworICB0LnllaHRocmVlZG90c2JlbG93YXJhYmljID0gMHgwNmQxOworICB0Lnlla29yZWFuID0gMHgzMTU2OworICB0LnllbiA9IDB4MDBhNTsKKyAgdC55ZW5tb25vc3BhY2UgPSAweGZmZTU7CisgIHQueWVva29yZWFuID0gMHgzMTU1OworICB0Lnllb3JpbmhpZXVoa29yZWFuID0gMHgzMTg2OworICB0LnllcmFoYmVueW9tb2hlYnJldyA9IDB4MDVhYTsKKyAgdC55ZXJhaGJlbnlvbW9sZWZ0aGVicmV3ID0gMHgwNWFhOworICB0LnllcmljeXJpbGxpYyA9IDB4MDQ0YjsKKyAgdC55ZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmOTsKKyAgdC55ZXNpZXVuZ2tvcmVhbiA9IDB4MzE4MTsKKyAgdC55ZXNpZXVuZ3BhbnNpb3Nrb3JlYW4gPSAweDMxODM7CisgIHQueWVzaWV1bmdzaW9za29yZWFuID0gMHgzMTgyOworICB0LnlldGl2aGVicmV3ID0gMHgwNTlhOworICB0LnlncmF2ZSA9IDB4MWVmMzsKKyAgdC55aG9vayA9IDB4MDFiNDsKKyAgdC55aG9va2Fib3ZlID0gMHgxZWY3OworICB0LnlpYXJtZW5pYW4gPSAweDA1NzU7CisgIHQueWljeXJpbGxpYyA9IDB4MDQ1NzsKKyAgdC55aWtvcmVhbiA9IDB4MzE2MjsKKyAgdC55aW55YW5nID0gMHgyNjJmOworICB0Lnlpd25hcm1lbmlhbiA9IDB4MDU4MjsKKyAgdC55bW9ub3NwYWNlID0gMHhmZjU5OworICB0LnlvZCA9IDB4MDVkOTsKKyAgdC55b2RkYWdlc2ggPSAweGZiMzk7CisgIHQueW9kZGFnZXNoaGVicmV3ID0gMHhmYjM5OworICB0LnlvZGhlYnJldyA9IDB4MDVkOTsKKyAgdC55b2R5b2RoZWJyZXcgPSAweDA1ZjI7CisgIHQueW9keW9kcGF0YWhoZWJyZXcgPSAweGZiMWY7CisgIHQueW9oaXJhZ2FuYSA9IDB4MzA4ODsKKyAgdC55b2lrb3JlYW4gPSAweDMxODk7CisgIHQueW9rYXRha2FuYSA9IDB4MzBlODsKKyAgdC55b2thdGFrYW5haGFsZndpZHRoID0gMHhmZjk2OworICB0Lnlva29yZWFuID0gMHgzMTViOworICB0Lnlvc21hbGxoaXJhZ2FuYSA9IDB4MzA4NzsKKyAgdC55b3NtYWxsa2F0YWthbmEgPSAweDMwZTc7CisgIHQueW9zbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZlOworICB0LnlvdGdyZWVrID0gMHgwM2YzOworICB0LnlveWFla29yZWFuID0gMHgzMTg4OworICB0LnlveWFrb3JlYW4gPSAweDMxODc7CisgIHQueW95YWt0aGFpID0gMHgwZTIyOworICB0LnlveWluZ3RoYWkgPSAweDBlMGQ7CisgIHQueXBhcmVuID0gMHgyNGI0OworICB0Lnlwb2dlZ3JhbW1lbmkgPSAweDAzN2E7CisgIHQueXBvZ2VncmFtbWVuaWdyZWVrY21iID0gMHgwMzQ1OworICB0LnlyID0gMHgwMWE2OworICB0LnlyaW5nID0gMHgxZTk5OworICB0LnlzdXBlcmlvciA9IDB4MDJiODsKKyAgdC55dGlsZGUgPSAweDFlZjk7CisgIHQueXR1cm5lZCA9IDB4MDI4ZTsKKyAgdC55dWhpcmFnYW5hID0gMHgzMDg2OworICB0Lnl1aWtvcmVhbiA9IDB4MzE4YzsKKyAgdC55dWthdGFrYW5hID0gMHgzMGU2OworICB0Lnl1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTU7CisgIHQueXVrb3JlYW4gPSAweDMxNjA7CisgIHQueXVzYmlnY3lyaWxsaWMgPSAweDA0NmI7CisgIHQueXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ZDsKKyAgdC55dXNsaXR0bGVjeXJpbGxpYyA9IDB4MDQ2NzsKKyAgdC55dXNsaXR0bGVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY5OworICB0Lnl1c21hbGxoaXJhZ2FuYSA9IDB4MzA4NTsKKyAgdC55dXNtYWxsa2F0YWthbmEgPSAweDMwZTU7CisgIHQueXVzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZkOworICB0Lnl1eWVrb3JlYW4gPSAweDMxOGI7CisgIHQueXV5ZW9rb3JlYW4gPSAweDMxOGE7CisgIHQueXlhYmVuZ2FsaSA9IDB4MDlkZjsKKyAgdC55eWFkZXZhID0gMHgwOTVmOworICB0LnogPSAweDAwN2E7CisgIHQuemFhcm1lbmlhbiA9IDB4MDU2NjsKKyAgdC56YWN1dGUgPSAweDAxN2E7CisgIHQuemFkZXZhID0gMHgwOTViOworICB0LnphZ3VybXVraGkgPSAweDBhNWI7CisgIHQuemFoYXJhYmljID0gMHgwNjM4OworICB0LnphaGZpbmFsYXJhYmljID0gMHhmZWM2OworICB0LnphaGluaXRpYWxhcmFiaWMgPSAweGZlYzc7CisgIHQuemFoaXJhZ2FuYSA9IDB4MzA1NjsKKyAgdC56YWhtZWRpYWxhcmFiaWMgPSAweGZlYzg7CisgIHQuemFpbmFyYWJpYyA9IDB4MDYzMjsKKyAgdC56YWluZmluYWxhcmFiaWMgPSAweGZlYjA7CisgIHQuemFrYXRha2FuYSA9IDB4MzBiNjsKKyAgdC56YXFlZmdhZG9saGVicmV3ID0gMHgwNTk1OworICB0LnphcWVmcWF0YW5oZWJyZXcgPSAweDA1OTQ7CisgIHQuemFycWFoZWJyZXcgPSAweDA1OTg7CisgIHQuemF5aW4gPSAweDA1ZDY7CisgIHQuemF5aW5kYWdlc2ggPSAweGZiMzY7CisgIHQuemF5aW5kYWdlc2hoZWJyZXcgPSAweGZiMzY7CisgIHQuemF5aW5oZWJyZXcgPSAweDA1ZDY7CisgIHQuemJvcG9tb2ZvID0gMHgzMTE3OworICB0LnpjYXJvbiA9IDB4MDE3ZTsKKyAgdC56Y2lyY2xlID0gMHgyNGU5OworICB0LnpjaXJjdW1mbGV4ID0gMHgxZTkxOworICB0LnpjdXJsID0gMHgwMjkxOworICB0Lnpkb3QgPSAweDAxN2M7CisgIHQuemRvdGFjY2VudCA9IDB4MDE3YzsKKyAgdC56ZG90YmVsb3cgPSAweDFlOTM7CisgIHQuemVjeXJpbGxpYyA9IDB4MDQzNzsKKyAgdC56ZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk5OworICB0LnplZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZjsKKyAgdC56ZWhpcmFnYW5hID0gMHgzMDVjOworICB0Lnpla2F0YWthbmEgPSAweDMwYmM7CisgIHQuemVybyA9IDB4MDAzMDsKKyAgdC56ZXJvYXJhYmljID0gMHgwNjYwOworICB0Lnplcm9iZW5nYWxpID0gMHgwOWU2OworICB0Lnplcm9kZXZhID0gMHgwOTY2OworICB0Lnplcm9ndWphcmF0aSA9IDB4MGFlNjsKKyAgdC56ZXJvZ3VybXVraGkgPSAweDBhNjY7CisgIHQuemVyb2hhY2thcmFiaWMgPSAweDA2NjA7CisgIHQuemVyb2luZmVyaW9yID0gMHgyMDgwOworICB0Lnplcm9tb25vc3BhY2UgPSAweGZmMTA7CisgIHQuemVyb29sZHN0eWxlID0gMHhmNzMwOworICB0Lnplcm9wZXJzaWFuID0gMHgwNmYwOworICB0Lnplcm9zdXBlcmlvciA9IDB4MjA3MDsKKyAgdC56ZXJvdGhhaSA9IDB4MGU1MDsKKyAgdC56ZXJvd2lkdGhqb2luZXIgPSAweGZlZmY7CisgIHQuemVyb3dpZHRobm9uam9pbmVyID0gMHgyMDBjOworICB0Lnplcm93aWR0aHNwYWNlID0gMHgyMDBiOworICB0LnpldGEgPSAweDAzYjY7CisgIHQuemhib3BvbW9mbyA9IDB4MzExMzsKKyAgdC56aGVhcm1lbmlhbiA9IDB4MDU2YTsKKyAgdC56aGVicmV2ZWN5cmlsbGljID0gMHgwNGMyOworICB0LnpoZWN5cmlsbGljID0gMHgwNDM2OworICB0LnpoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk3OworICB0LnpoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGQ7CisgIHQuemloaXJhZ2FuYSA9IDB4MzA1ODsKKyAgdC56aWthdGFrYW5hID0gMHgzMGI4OworICB0Lnppbm9yaGVicmV3ID0gMHgwNWFlOworICB0LnpsaW5lYmVsb3cgPSAweDFlOTU7CisgIHQuem1vbm9zcGFjZSA9IDB4ZmY1YTsKKyAgdC56b2hpcmFnYW5hID0gMHgzMDVlOworICB0Lnpva2F0YWthbmEgPSAweDMwYmU7CisgIHQuenBhcmVuID0gMHgyNGI1OworICB0LnpyZXRyb2ZsZXhob29rID0gMHgwMjkwOworICB0LnpzdHJva2UgPSAweDAxYjY7CisgIHQuenVoaXJhZ2FuYSA9IDB4MzA1YTsKKyAgdC56dWthdGFrYW5hID0gMHgzMGJhOworICB0WyIubm90ZGVmIl0gPSAweDAwMDA7CisgIHQuYW5nYnJhY2tldGxlZnRiaWcgPSAweDIzMjk7CisgIHQuYW5nYnJhY2tldGxlZnRCaWcgPSAweDIzMjk7CisgIHQuYW5nYnJhY2tldGxlZnRiaWdnID0gMHgyMzI5OworICB0LmFuZ2JyYWNrZXRsZWZ0QmlnZyA9IDB4MjMyOTsKKyAgdC5hbmdicmFja2V0cmlnaHRCaWcgPSAweDIzMmE7CisgIHQuYW5nYnJhY2tldHJpZ2h0YmlnID0gMHgyMzJhOworICB0LmFuZ2JyYWNrZXRyaWdodEJpZ2cgPSAweDIzMmE7CisgIHQuYW5nYnJhY2tldHJpZ2h0YmlnZyA9IDB4MjMyYTsKKyAgdC5hcnJvd2hvb2tsZWZ0ID0gMHgyMWFhOworICB0LmFycm93aG9va3JpZ2h0ID0gMHgyMWE5OworICB0LmFycm93bGVmdHRvcGhhbGYgPSAweDIxYmM7CisgIHQuYXJyb3dsZWZ0Ym90aGFsZiA9IDB4MjFiZDsKKyAgdC5hcnJvd25vcnRoZWFzdCA9IDB4MjE5NzsKKyAgdC5hcnJvd25vcnRod2VzdCA9IDB4MjE5NjsKKyAgdC5hcnJvd3JpZ2h0dG9waGFsZiA9IDB4MjFjMDsKKyAgdC5hcnJvd3JpZ2h0Ym90aGFsZiA9IDB4MjFjMTsKKyAgdC5hcnJvd3NvdXRoZWFzdCA9IDB4MjE5ODsKKyAgdC5hcnJvd3NvdXRod2VzdCA9IDB4MjE5OTsKKyAgdC5iYWNrc2xhc2hiaWcgPSAweDIyMTY7CisgIHQuYmFja3NsYXNoQmlnID0gMHgyMjE2OworICB0LmJhY2tzbGFzaEJpZ2cgPSAweDIyMTY7CisgIHQuYmFja3NsYXNoYmlnZyA9IDB4MjIxNjsKKyAgdC5iYXJkYmwgPSAweDIwMTY7CisgIHQuYnJhY2VodGlwZG93bmxlZnQgPSAweGZlMzc7CisgIHQuYnJhY2VodGlwZG93bnJpZ2h0ID0gMHhmZTM3OworICB0LmJyYWNlaHRpcHVwbGVmdCA9IDB4ZmUzODsKKyAgdC5icmFjZWh0aXB1cHJpZ2h0ID0gMHhmZTM4OworICB0LmJyYWNlbGVmdEJpZyA9IDB4MDA3YjsKKyAgdC5icmFjZWxlZnRiaWcgPSAweDAwN2I7CisgIHQuYnJhY2VsZWZ0YmlnZyA9IDB4MDA3YjsKKyAgdC5icmFjZWxlZnRCaWdnID0gMHgwMDdiOworICB0LmJyYWNlcmlnaHRCaWcgPSAweDAwN2Q7CisgIHQuYnJhY2VyaWdodGJpZyA9IDB4MDA3ZDsKKyAgdC5icmFjZXJpZ2h0YmlnZyA9IDB4MDA3ZDsKKyAgdC5icmFjZXJpZ2h0QmlnZyA9IDB4MDA3ZDsKKyAgdC5icmFja2V0bGVmdGJpZyA9IDB4MDA1YjsKKyAgdC5icmFja2V0bGVmdEJpZyA9IDB4MDA1YjsKKyAgdC5icmFja2V0bGVmdGJpZ2cgPSAweDAwNWI7CisgIHQuYnJhY2tldGxlZnRCaWdnID0gMHgwMDViOworICB0LmJyYWNrZXRyaWdodEJpZyA9IDB4MDA1ZDsKKyAgdC5icmFja2V0cmlnaHRiaWcgPSAweDAwNWQ7CisgIHQuYnJhY2tldHJpZ2h0YmlnZyA9IDB4MDA1ZDsKKyAgdC5icmFja2V0cmlnaHRCaWdnID0gMHgwMDVkOworICB0LmNlaWxpbmdsZWZ0YmlnID0gMHgyMzA4OworICB0LmNlaWxpbmdsZWZ0QmlnID0gMHgyMzA4OworICB0LmNlaWxpbmdsZWZ0QmlnZyA9IDB4MjMwODsKKyAgdC5jZWlsaW5nbGVmdGJpZ2cgPSAweDIzMDg7CisgIHQuY2VpbGluZ3JpZ2h0YmlnID0gMHgyMzA5OworICB0LmNlaWxpbmdyaWdodEJpZyA9IDB4MjMwOTsKKyAgdC5jZWlsaW5ncmlnaHRiaWdnID0gMHgyMzA5OworICB0LmNlaWxpbmdyaWdodEJpZ2cgPSAweDIzMDk7CisgIHQuY2lyY2xlZG90ZGlzcGxheSA9IDB4MjI5OTsKKyAgdC5jaXJjbGVkb3R0ZXh0ID0gMHgyMjk5OworICB0LmNpcmNsZW11bHRpcGx5ZGlzcGxheSA9IDB4MjI5NzsKKyAgdC5jaXJjbGVtdWx0aXBseXRleHQgPSAweDIyOTc7CisgIHQuY2lyY2xlcGx1c2Rpc3BsYXkgPSAweDIyOTU7CisgIHQuY2lyY2xlcGx1c3RleHQgPSAweDIyOTU7CisgIHQuY29udGludGVncmFsZGlzcGxheSA9IDB4MjIyZTsKKyAgdC5jb250aW50ZWdyYWx0ZXh0ID0gMHgyMjJlOworICB0LmNvcHJvZHVjdGRpc3BsYXkgPSAweDIyMTA7CisgIHQuY29wcm9kdWN0dGV4dCA9IDB4MjIxMDsKKyAgdC5mbG9vcmxlZnRCaWcgPSAweDIzMGE7CisgIHQuZmxvb3JsZWZ0YmlnID0gMHgyMzBhOworICB0LmZsb29ybGVmdGJpZ2cgPSAweDIzMGE7CisgIHQuZmxvb3JsZWZ0QmlnZyA9IDB4MjMwYTsKKyAgdC5mbG9vcnJpZ2h0YmlnID0gMHgyMzBiOworICB0LmZsb29ycmlnaHRCaWcgPSAweDIzMGI7CisgIHQuZmxvb3JyaWdodEJpZ2cgPSAweDIzMGI7CisgIHQuZmxvb3JyaWdodGJpZ2cgPSAweDIzMGI7CisgIHQuaGF0d2lkZSA9IDB4MDMwMjsKKyAgdC5oYXR3aWRlciA9IDB4MDMwMjsKKyAgdC5oYXR3aWRlc3QgPSAweDAzMDI7CisgIHQuaW50ZXJjYWwgPSAweDFkNDA7CisgIHQuaW50ZWdyYWxkaXNwbGF5ID0gMHgyMjJiOworICB0LmludGVncmFsdGV4dCA9IDB4MjIyYjsKKyAgdC5pbnRlcnNlY3Rpb25kaXNwbGF5ID0gMHgyMmMyOworICB0LmludGVyc2VjdGlvbnRleHQgPSAweDIyYzI7CisgIHQubG9naWNhbGFuZGRpc3BsYXkgPSAweDIyMjc7CisgIHQubG9naWNhbGFuZHRleHQgPSAweDIyMjc7CisgIHQubG9naWNhbG9yZGlzcGxheSA9IDB4MjIyODsKKyAgdC5sb2dpY2Fsb3J0ZXh0ID0gMHgyMjI4OworICB0LnBhcmVubGVmdEJpZyA9IDB4MDAyODsKKyAgdC5wYXJlbmxlZnRiaWcgPSAweDAwMjg7CisgIHQucGFyZW5sZWZ0QmlnZyA9IDB4MDAyODsKKyAgdC5wYXJlbmxlZnRiaWdnID0gMHgwMDI4OworICB0LnBhcmVucmlnaHRCaWcgPSAweDAwMjk7CisgIHQucGFyZW5yaWdodGJpZyA9IDB4MDAyOTsKKyAgdC5wYXJlbnJpZ2h0QmlnZyA9IDB4MDAyOTsKKyAgdC5wYXJlbnJpZ2h0YmlnZyA9IDB4MDAyOTsKKyAgdC5wcmltZSA9IDB4MjAzMjsKKyAgdC5wcm9kdWN0ZGlzcGxheSA9IDB4MjIwZjsKKyAgdC5wcm9kdWN0dGV4dCA9IDB4MjIwZjsKKyAgdC5yYWRpY2FsYmlnID0gMHgyMjFhOworICB0LnJhZGljYWxCaWcgPSAweDIyMWE7CisgIHQucmFkaWNhbEJpZ2cgPSAweDIyMWE7CisgIHQucmFkaWNhbGJpZ2cgPSAweDIyMWE7CisgIHQucmFkaWNhbGJ0ID0gMHgyMjFhOworICB0LnJhZGljYWx0cCA9IDB4MjIxYTsKKyAgdC5yYWRpY2FsdmVydGV4ID0gMHgyMjFhOworICB0LnNsYXNoYmlnID0gMHgwMDJmOworICB0LnNsYXNoQmlnID0gMHgwMDJmOworICB0LnNsYXNoQmlnZyA9IDB4MDAyZjsKKyAgdC5zbGFzaGJpZ2cgPSAweDAwMmY7CisgIHQuc3VtbWF0aW9uZGlzcGxheSA9IDB4MjIxMTsKKyAgdC5zdW1tYXRpb250ZXh0ID0gMHgyMjExOworICB0LnRpbGRld2lkZSA9IDB4MDJkYzsKKyAgdC50aWxkZXdpZGVyID0gMHgwMmRjOworICB0LnRpbGRld2lkZXN0ID0gMHgwMmRjOworICB0LnVuaW9uZGlzcGxheSA9IDB4MjJjMzsKKyAgdC51bmlvbm11bHRpZGlzcGxheSA9IDB4MjI4ZTsKKyAgdC51bmlvbm11bHRpdGV4dCA9IDB4MjI4ZTsKKyAgdC51bmlvbnNxZGlzcGxheSA9IDB4MjI5NDsKKyAgdC51bmlvbnNxdGV4dCA9IDB4MjI5NDsKKyAgdC51bmlvbnRleHQgPSAweDIyYzM7CisgIHQudmV4dGVuZGRvdWJsZSA9IDB4MjIyNTsKKyAgdC52ZXh0ZW5kc2luZ2xlID0gMHgyMjIzOworfSk7Cit2YXIgZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CisgIHQuc3BhY2UgPSAweDAwMjA7CisgIHQuYTEgPSAweDI3MDE7CisgIHQuYTIgPSAweDI3MDI7CisgIHQuYTIwMiA9IDB4MjcwMzsKKyAgdC5hMyA9IDB4MjcwNDsKKyAgdC5hNCA9IDB4MjYwZTsKKyAgdC5hNSA9IDB4MjcwNjsKKyAgdC5hMTE5ID0gMHgyNzA3OworICB0LmExMTggPSAweDI3MDg7CisgIHQuYTExNyA9IDB4MjcwOTsKKyAgdC5hMTEgPSAweDI2MWI7CisgIHQuYTEyID0gMHgyNjFlOworICB0LmExMyA9IDB4MjcwYzsKKyAgdC5hMTQgPSAweDI3MGQ7CisgIHQuYTE1ID0gMHgyNzBlOworICB0LmExNiA9IDB4MjcwZjsKKyAgdC5hMTA1ID0gMHgyNzEwOworICB0LmExNyA9IDB4MjcxMTsKKyAgdC5hMTggPSAweDI3MTI7CisgIHQuYTE5ID0gMHgyNzEzOworICB0LmEyMCA9IDB4MjcxNDsKKyAgdC5hMjEgPSAweDI3MTU7CisgIHQuYTIyID0gMHgyNzE2OworICB0LmEyMyA9IDB4MjcxNzsKKyAgdC5hMjQgPSAweDI3MTg7CisgIHQuYTI1ID0gMHgyNzE5OworICB0LmEyNiA9IDB4MjcxYTsKKyAgdC5hMjcgPSAweDI3MWI7CisgIHQuYTI4ID0gMHgyNzFjOworICB0LmE2ID0gMHgyNzFkOworICB0LmE3ID0gMHgyNzFlOworICB0LmE4ID0gMHgyNzFmOworICB0LmE5ID0gMHgyNzIwOworICB0LmExMCA9IDB4MjcyMTsKKyAgdC5hMjkgPSAweDI3MjI7CisgIHQuYTMwID0gMHgyNzIzOworICB0LmEzMSA9IDB4MjcyNDsKKyAgdC5hMzIgPSAweDI3MjU7CisgIHQuYTMzID0gMHgyNzI2OworICB0LmEzNCA9IDB4MjcyNzsKKyAgdC5hMzUgPSAweDI2MDU7CisgIHQuYTM2ID0gMHgyNzI5OworICB0LmEzNyA9IDB4MjcyYTsKKyAgdC5hMzggPSAweDI3MmI7CisgIHQuYTM5ID0gMHgyNzJjOworICB0LmE0MCA9IDB4MjcyZDsKKyAgdC5hNDEgPSAweDI3MmU7CisgIHQuYTQyID0gMHgyNzJmOworICB0LmE0MyA9IDB4MjczMDsKKyAgdC5hNDQgPSAweDI3MzE7CisgIHQuYTQ1ID0gMHgyNzMyOworICB0LmE0NiA9IDB4MjczMzsKKyAgdC5hNDcgPSAweDI3MzQ7CisgIHQuYTQ4ID0gMHgyNzM1OworICB0LmE0OSA9IDB4MjczNjsKKyAgdC5hNTAgPSAweDI3Mzc7CisgIHQuYTUxID0gMHgyNzM4OworICB0LmE1MiA9IDB4MjczOTsKKyAgdC5hNTMgPSAweDI3M2E7CisgIHQuYTU0ID0gMHgyNzNiOworICB0LmE1NSA9IDB4MjczYzsKKyAgdC5hNTYgPSAweDI3M2Q7CisgIHQuYTU3ID0gMHgyNzNlOworICB0LmE1OCA9IDB4MjczZjsKKyAgdC5hNTkgPSAweDI3NDA7CisgIHQuYTYwID0gMHgyNzQxOworICB0LmE2MSA9IDB4Mjc0MjsKKyAgdC5hNjIgPSAweDI3NDM7CisgIHQuYTYzID0gMHgyNzQ0OworICB0LmE2NCA9IDB4Mjc0NTsKKyAgdC5hNjUgPSAweDI3NDY7CisgIHQuYTY2ID0gMHgyNzQ3OworICB0LmE2NyA9IDB4Mjc0ODsKKyAgdC5hNjggPSAweDI3NDk7CisgIHQuYTY5ID0gMHgyNzRhOworICB0LmE3MCA9IDB4Mjc0YjsKKyAgdC5hNzEgPSAweDI1Y2Y7CisgIHQuYTcyID0gMHgyNzRkOworICB0LmE3MyA9IDB4MjVhMDsKKyAgdC5hNzQgPSAweDI3NGY7CisgIHQuYTIwMyA9IDB4Mjc1MDsKKyAgdC5hNzUgPSAweDI3NTE7CisgIHQuYTIwNCA9IDB4Mjc1MjsKKyAgdC5hNzYgPSAweDI1YjI7CisgIHQuYTc3ID0gMHgyNWJjOworICB0LmE3OCA9IDB4MjVjNjsKKyAgdC5hNzkgPSAweDI3NTY7CisgIHQuYTgxID0gMHgyNWQ3OworICB0LmE4MiA9IDB4Mjc1ODsKKyAgdC5hODMgPSAweDI3NTk7CisgIHQuYTg0ID0gMHgyNzVhOworICB0LmE5NyA9IDB4Mjc1YjsKKyAgdC5hOTggPSAweDI3NWM7CisgIHQuYTk5ID0gMHgyNzVkOworICB0LmExMDAgPSAweDI3NWU7CisgIHQuYTEwMSA9IDB4Mjc2MTsKKyAgdC5hMTAyID0gMHgyNzYyOworICB0LmExMDMgPSAweDI3NjM7CisgIHQuYTEwNCA9IDB4Mjc2NDsKKyAgdC5hMTA2ID0gMHgyNzY1OworICB0LmExMDcgPSAweDI3NjY7CisgIHQuYTEwOCA9IDB4Mjc2NzsKKyAgdC5hMTEyID0gMHgyNjYzOworICB0LmExMTEgPSAweDI2NjY7CisgIHQuYTExMCA9IDB4MjY2NTsKKyAgdC5hMTA5ID0gMHgyNjYwOworICB0LmExMjAgPSAweDI0NjA7CisgIHQuYTEyMSA9IDB4MjQ2MTsKKyAgdC5hMTIyID0gMHgyNDYyOworICB0LmExMjMgPSAweDI0NjM7CisgIHQuYTEyNCA9IDB4MjQ2NDsKKyAgdC5hMTI1ID0gMHgyNDY1OworICB0LmExMjYgPSAweDI0NjY7CisgIHQuYTEyNyA9IDB4MjQ2NzsKKyAgdC5hMTI4ID0gMHgyNDY4OworICB0LmExMjkgPSAweDI0Njk7CisgIHQuYTEzMCA9IDB4Mjc3NjsKKyAgdC5hMTMxID0gMHgyNzc3OworICB0LmExMzIgPSAweDI3Nzg7CisgIHQuYTEzMyA9IDB4Mjc3OTsKKyAgdC5hMTM0ID0gMHgyNzdhOworICB0LmExMzUgPSAweDI3N2I7CisgIHQuYTEzNiA9IDB4Mjc3YzsKKyAgdC5hMTM3ID0gMHgyNzdkOworICB0LmExMzggPSAweDI3N2U7CisgIHQuYTEzOSA9IDB4Mjc3ZjsKKyAgdC5hMTQwID0gMHgyNzgwOworICB0LmExNDEgPSAweDI3ODE7CisgIHQuYTE0MiA9IDB4Mjc4MjsKKyAgdC5hMTQzID0gMHgyNzgzOworICB0LmExNDQgPSAweDI3ODQ7CisgIHQuYTE0NSA9IDB4Mjc4NTsKKyAgdC5hMTQ2ID0gMHgyNzg2OworICB0LmExNDcgPSAweDI3ODc7CisgIHQuYTE0OCA9IDB4Mjc4ODsKKyAgdC5hMTQ5ID0gMHgyNzg5OworICB0LmExNTAgPSAweDI3OGE7CisgIHQuYTE1MSA9IDB4Mjc4YjsKKyAgdC5hMTUyID0gMHgyNzhjOworICB0LmExNTMgPSAweDI3OGQ7CisgIHQuYTE1NCA9IDB4Mjc4ZTsKKyAgdC5hMTU1ID0gMHgyNzhmOworICB0LmExNTYgPSAweDI3OTA7CisgIHQuYTE1NyA9IDB4Mjc5MTsKKyAgdC5hMTU4ID0gMHgyNzkyOworICB0LmExNTkgPSAweDI3OTM7CisgIHQuYTE2MCA9IDB4Mjc5NDsKKyAgdC5hMTYxID0gMHgyMTkyOworICB0LmExNjMgPSAweDIxOTQ7CisgIHQuYTE2NCA9IDB4MjE5NTsKKyAgdC5hMTk2ID0gMHgyNzk4OworICB0LmExNjUgPSAweDI3OTk7CisgIHQuYTE5MiA9IDB4Mjc5YTsKKyAgdC5hMTY2ID0gMHgyNzliOworICB0LmExNjcgPSAweDI3OWM7CisgIHQuYTE2OCA9IDB4Mjc5ZDsKKyAgdC5hMTY5ID0gMHgyNzllOworICB0LmExNzAgPSAweDI3OWY7CisgIHQuYTE3MSA9IDB4MjdhMDsKKyAgdC5hMTcyID0gMHgyN2ExOworICB0LmExNzMgPSAweDI3YTI7CisgIHQuYTE2MiA9IDB4MjdhMzsKKyAgdC5hMTc0ID0gMHgyN2E0OworICB0LmExNzUgPSAweDI3YTU7CisgIHQuYTE3NiA9IDB4MjdhNjsKKyAgdC5hMTc3ID0gMHgyN2E3OworICB0LmExNzggPSAweDI3YTg7CisgIHQuYTE3OSA9IDB4MjdhOTsKKyAgdC5hMTkzID0gMHgyN2FhOworICB0LmExODAgPSAweDI3YWI7CisgIHQuYTE5OSA9IDB4MjdhYzsKKyAgdC5hMTgxID0gMHgyN2FkOworICB0LmEyMDAgPSAweDI3YWU7CisgIHQuYTE4MiA9IDB4MjdhZjsKKyAgdC5hMjAxID0gMHgyN2IxOworICB0LmExODMgPSAweDI3YjI7CisgIHQuYTE4NCA9IDB4MjdiMzsKKyAgdC5hMTk3ID0gMHgyN2I0OworICB0LmExODUgPSAweDI3YjU7CisgIHQuYTE5NCA9IDB4MjdiNjsKKyAgdC5hMTk4ID0gMHgyN2I3OworICB0LmExODYgPSAweDI3Yjg7CisgIHQuYTE5NSA9IDB4MjdiOTsKKyAgdC5hMTg3ID0gMHgyN2JhOworICB0LmExODggPSAweDI3YmI7CisgIHQuYTE4OSA9IDB4MjdiYzsKKyAgdC5hMTkwID0gMHgyN2JkOworICB0LmExOTEgPSAweDI3YmU7CisgIHQuYTg5ID0gMHgyNzY4OworICB0LmE5MCA9IDB4Mjc2OTsKKyAgdC5hOTMgPSAweDI3NmE7CisgIHQuYTk0ID0gMHgyNzZiOworICB0LmE5MSA9IDB4Mjc2YzsKKyAgdC5hOTIgPSAweDI3NmQ7CisgIHQuYTIwNSA9IDB4Mjc2ZTsKKyAgdC5hODUgPSAweDI3NmY7CisgIHQuYTIwNiA9IDB4Mjc3MDsKKyAgdC5hODYgPSAweDI3NzE7CisgIHQuYTg3ID0gMHgyNzcyOworICB0LmE4OCA9IDB4Mjc3MzsKKyAgdC5hOTUgPSAweDI3NzQ7CisgIHQuYTk2ID0gMHgyNzc1OworICB0WyIubm90ZGVmIl0gPSAweDAwMDA7Cit9KTsKK2V4cG9ydHMuZ2V0R2x5cGhzVW5pY29kZSA9IGdldEdseXBoc1VuaWNvZGU7CitleHBvcnRzLmdldERpbmdiYXRzR2x5cGhzVW5pY29kZSA9IGdldERpbmdiYXRzR2x5cGhzVW5pY29kZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9pbWFnZS5qcyBiL2xpYi9jb3JlL2ltYWdlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjNlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9pbWFnZS5qcwpAQCAtMCwwICsxLDY4OSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGSW1hZ2UgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4vcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX2NvbG9yc3BhY2UgPSByZXF1aXJlKCIuL2NvbG9yc3BhY2UuanMiKTsKKwordmFyIF9zdHJlYW0gPSByZXF1aXJlKCIuL3N0cmVhbS5qcyIpOworCit2YXIgX2pwZWdfc3RyZWFtID0gcmVxdWlyZSgiLi9qcGVnX3N0cmVhbS5qcyIpOworCit2YXIgX2pweCA9IHJlcXVpcmUoIi4vanB4LmpzIik7CisKK2Z1bmN0aW9uIGRlY29kZUFuZENsYW1wKHZhbHVlLCBhZGRlbmQsIGNvZWZmaWNpZW50LCBtYXgpIHsKKyAgdmFsdWUgPSBhZGRlbmQgKyB2YWx1ZSAqIGNvZWZmaWNpZW50OworCisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICB2YWx1ZSA9IDA7CisgIH0gZWxzZSBpZiAodmFsdWUgPiBtYXgpIHsKKyAgICB2YWx1ZSA9IG1heDsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworZnVuY3Rpb24gcmVzaXplSW1hZ2VNYXNrKHNyYywgYnBjLCB3MSwgaDEsIHcyLCBoMikgeworICB2YXIgbGVuZ3RoID0gdzIgKiBoMjsKKyAgbGV0IGRlc3Q7CisKKyAgaWYgKGJwYyA8PSA4KSB7CisgICAgZGVzdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisgIH0gZWxzZSBpZiAoYnBjIDw9IDE2KSB7CisgICAgZGVzdCA9IG5ldyBVaW50MTZBcnJheShsZW5ndGgpOworICB9IGVsc2UgeworICAgIGRlc3QgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTsKKyAgfQorCisgIHZhciB4UmF0aW8gPSB3MSAvIHcyOworICB2YXIgeVJhdGlvID0gaDEgLyBoMjsKKyAgdmFyIGksCisgICAgICBqLAorICAgICAgcHksCisgICAgICBuZXdJbmRleCA9IDAsCisgICAgICBvbGRJbmRleDsKKyAgdmFyIHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpOworICB2YXIgdzFTY2FubGluZSA9IHcxOworCisgIGZvciAoaSA9IDA7IGkgPCB3MjsgaSsrKSB7CisgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbyk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgaDI7IGkrKykgeworICAgIHB5ID0gTWF0aC5mbG9vcihpICogeVJhdGlvKSAqIHcxU2NhbmxpbmU7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgdzI7IGorKykgeworICAgICAgb2xkSW5kZXggPSBweSArIHhTY2FsZWRbal07CisgICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4XTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZGVzdDsKK30KKworY2xhc3MgUERGSW1hZ2UgeworICBjb25zdHJ1Y3Rvcih7CisgICAgeHJlZiwKKyAgICByZXMsCisgICAgaW1hZ2UsCisgICAgaXNJbmxpbmUgPSBmYWxzZSwKKyAgICBzbWFzayA9IG51bGwsCisgICAgbWFzayA9IG51bGwsCisgICAgaXNNYXNrID0gZmFsc2UsCisgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgIH0pIHsKKyAgICB0aGlzLmltYWdlID0gaW1hZ2U7CisgICAgdmFyIGRpY3QgPSBpbWFnZS5kaWN0OworICAgIGNvbnN0IGZpbHRlciA9IGRpY3QuZ2V0KCJGaWx0ZXIiKTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmaWx0ZXIpKSB7CisgICAgICBzd2l0Y2ggKGZpbHRlci5uYW1lKSB7CisgICAgICAgIGNhc2UgIkpQWERlY29kZSI6CisgICAgICAgICAgdmFyIGpweEltYWdlID0gbmV3IF9qcHguSnB4SW1hZ2UoKTsKKyAgICAgICAgICBqcHhJbWFnZS5wYXJzZUltYWdlUHJvcGVydGllcyhpbWFnZS5zdHJlYW0pOworICAgICAgICAgIGltYWdlLnN0cmVhbS5yZXNldCgpOworICAgICAgICAgIGltYWdlLndpZHRoID0ganB4SW1hZ2Uud2lkdGg7CisgICAgICAgICAgaW1hZ2UuaGVpZ2h0ID0ganB4SW1hZ2UuaGVpZ2h0OworICAgICAgICAgIGltYWdlLmJpdHNQZXJDb21wb25lbnQgPSBqcHhJbWFnZS5iaXRzUGVyQ29tcG9uZW50OworICAgICAgICAgIGltYWdlLm51bUNvbXBzID0ganB4SW1hZ2UuY29tcG9uZW50c0NvdW50OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIkpCSUcyRGVjb2RlIjoKKyAgICAgICAgICBpbWFnZS5iaXRzUGVyQ29tcG9uZW50ID0gMTsKKyAgICAgICAgICBpbWFnZS5udW1Db21wcyA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgbGV0IHdpZHRoID0gZGljdC5nZXQoIldpZHRoIiwgIlciKTsKKyAgICBsZXQgaGVpZ2h0ID0gZGljdC5nZXQoIkhlaWdodCIsICJIIik7CisKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbWFnZS53aWR0aCkgJiYgaW1hZ2Uud2lkdGggPiAwICYmIE51bWJlci5pc0ludGVnZXIoaW1hZ2UuaGVpZ2h0KSAmJiBpbWFnZS5oZWlnaHQgPiAwICYmIChpbWFnZS53aWR0aCAhPT0gd2lkdGggfHwgaW1hZ2UuaGVpZ2h0ICE9PSBoZWlnaHQpKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgIiArICJyYXRoZXIgdGhhbiB0aGUgaW1hZ2UgZGljdGlvbmFyeS4iKTsKKyAgICAgIHdpZHRoID0gaW1hZ2Uud2lkdGg7CisgICAgICBoZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CisgICAgfQorCisgICAgaWYgKHdpZHRoIDwgMSB8fCBoZWlnaHQgPCAxKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgaW1hZ2Ugd2lkdGg6ICR7d2lkdGh9IG9yIGhlaWdodDogJHtoZWlnaHR9YCk7CisgICAgfQorCisgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OworICAgIHRoaXMuaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSW50ZXJwb2xhdGUiLCAiSSIpIHx8IGZhbHNlOworICAgIHRoaXMuaW1hZ2VNYXNrID0gZGljdC5nZXQoIkltYWdlTWFzayIsICJJTSIpIHx8IGZhbHNlOworICAgIHRoaXMubWF0dGUgPSBkaWN0LmdldCgiTWF0dGUiKSB8fCBmYWxzZTsKKyAgICB2YXIgYml0c1BlckNvbXBvbmVudCA9IGltYWdlLmJpdHNQZXJDb21wb25lbnQ7CisKKyAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKKyAgICAgIGJpdHNQZXJDb21wb25lbnQgPSBkaWN0LmdldCgiQml0c1BlckNvbXBvbmVudCIsICJCUEMiKTsKKworICAgICAgaWYgKCFiaXRzUGVyQ29tcG9uZW50KSB7CisgICAgICAgIGlmICh0aGlzLmltYWdlTWFzaykgeworICAgICAgICAgIGJpdHNQZXJDb21wb25lbnQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgQml0cyBwZXIgY29tcG9uZW50IG1pc3NpbmcgaW4gaW1hZ2U6ICR7dGhpcy5pbWFnZU1hc2t9YCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmJwYyA9IGJpdHNQZXJDb21wb25lbnQ7CisKKyAgICBpZiAoIXRoaXMuaW1hZ2VNYXNrKSB7CisgICAgICBsZXQgY29sb3JTcGFjZSA9IGRpY3QuZ2V0UmF3KCJDb2xvclNwYWNlIikgfHwgZGljdC5nZXRSYXcoIkNTIik7CisKKyAgICAgIGlmICghY29sb3JTcGFjZSkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkpQWCBpbWFnZXMgKHdoaWNoIGRvIG5vdCByZXF1aXJlIGNvbG9yIHNwYWNlcykiKTsKKworICAgICAgICBzd2l0Y2ggKGltYWdlLm51bUNvbXBzKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY29sb3JTcGFjZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRGV2aWNlUkdCIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRGV2aWNlQ01ZSyIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBKUFggaW1hZ2VzIHdpdGggJHtpbWFnZS5udW1Db21wc30gYCArICJjb2xvciBjb21wb25lbnRzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5jb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzOiBjb2xvclNwYWNlLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXM6IGlzSW5saW5lID8gcmVzIDogbnVsbCwKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSk7CisgICAgICB0aGlzLm51bUNvbXBzID0gdGhpcy5jb2xvclNwYWNlLm51bUNvbXBzOworICAgIH0KKworICAgIHRoaXMuZGVjb2RlID0gZGljdC5nZXRBcnJheSgiRGVjb2RlIiwgIkQiKTsKKyAgICB0aGlzLm5lZWRzRGVjb2RlID0gZmFsc2U7CisKKyAgICBpZiAodGhpcy5kZWNvZGUgJiYgKHRoaXMuY29sb3JTcGFjZSAmJiAhdGhpcy5jb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgYml0c1BlckNvbXBvbmVudCkgfHwgaXNNYXNrICYmICFfY29sb3JzcGFjZS5Db2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgMSkpKSB7CisgICAgICB0aGlzLm5lZWRzRGVjb2RlID0gdHJ1ZTsKKyAgICAgIHZhciBtYXggPSAoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDE7CisgICAgICB0aGlzLmRlY29kZUNvZWZmaWNpZW50cyA9IFtdOworICAgICAgdGhpcy5kZWNvZGVBZGRlbmRzID0gW107CisgICAgICBjb25zdCBpc0luZGV4ZWQgPSB0aGlzLmNvbG9yU3BhY2UgJiYgdGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJJbmRleGVkIjsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kZWNvZGUubGVuZ3RoOyBpICs9IDIsICsraikgeworICAgICAgICB2YXIgZG1pbiA9IHRoaXMuZGVjb2RlW2ldOworICAgICAgICB2YXIgZG1heCA9IHRoaXMuZGVjb2RlW2kgKyAxXTsKKyAgICAgICAgdGhpcy5kZWNvZGVDb2VmZmljaWVudHNbal0gPSBpc0luZGV4ZWQgPyAoZG1heCAtIGRtaW4pIC8gbWF4IDogZG1heCAtIGRtaW47CisgICAgICAgIHRoaXMuZGVjb2RlQWRkZW5kc1tqXSA9IGlzSW5kZXhlZCA/IGRtaW4gOiBtYXggKiBkbWluOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzbWFzaykgeworICAgICAgdGhpcy5zbWFzayA9IG5ldyBQREZJbWFnZSh7CisgICAgICAgIHhyZWYsCisgICAgICAgIHJlcywKKyAgICAgICAgaW1hZ2U6IHNtYXNrLAorICAgICAgICBpc0lubGluZSwKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtYXNrKSB7CisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShtYXNrKSkgeworICAgICAgICB2YXIgbWFza0RpY3QgPSBtYXNrLmRpY3QsCisgICAgICAgICAgICBpbWFnZU1hc2sgPSBtYXNrRGljdC5nZXQoIkltYWdlTWFzayIsICJJTSIpOworCisgICAgICAgIGlmICghaW1hZ2VNYXNrKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJZ25vcmluZyAvTWFzayBpbiBpbWFnZSB3aXRob3V0IC9JbWFnZU1hc2suIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5tYXNrID0gbmV3IFBERkltYWdlKHsKKyAgICAgICAgICAgIHhyZWYsCisgICAgICAgICAgICByZXMsCisgICAgICAgICAgICBpbWFnZTogbWFzaywKKyAgICAgICAgICAgIGlzSW5saW5lLAorICAgICAgICAgICAgaXNNYXNrOiB0cnVlLAorICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgYXN5bmMgYnVpbGRJbWFnZSh7CisgICAgeHJlZiwKKyAgICByZXMsCisgICAgaW1hZ2UsCisgICAgaXNJbmxpbmUgPSBmYWxzZSwKKyAgICBwZGZGdW5jdGlvbkZhY3RvcnksCisgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgfSkgeworICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlOworICAgIGxldCBzbWFza0RhdGEgPSBudWxsOworICAgIGxldCBtYXNrRGF0YSA9IG51bGw7CisgICAgY29uc3Qgc21hc2sgPSBpbWFnZS5kaWN0LmdldCgiU01hc2siKTsKKyAgICBjb25zdCBtYXNrID0gaW1hZ2UuZGljdC5nZXQoIk1hc2siKTsKKworICAgIGlmIChzbWFzaykgeworICAgICAgc21hc2tEYXRhID0gc21hc2s7CisgICAgfSBlbHNlIGlmIChtYXNrKSB7CisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShtYXNrKSB8fCBBcnJheS5pc0FycmF5KG1hc2spKSB7CisgICAgICAgIG1hc2tEYXRhID0gbWFzazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5zdXBwb3J0ZWQgbWFzayBmb3JtYXQuIik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBQREZJbWFnZSh7CisgICAgICB4cmVmLAorICAgICAgcmVzLAorICAgICAgaW1hZ2U6IGltYWdlRGF0YSwKKyAgICAgIGlzSW5saW5lLAorICAgICAgc21hc2s6IHNtYXNrRGF0YSwKKyAgICAgIG1hc2s6IG1hc2tEYXRhLAorICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICB9KTsKKyAgfQorCisgIHN0YXRpYyBjcmVhdGVNYXNrKHsKKyAgICBpbWdBcnJheSwKKyAgICB3aWR0aCwKKyAgICBoZWlnaHQsCisgICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0sCisgICAgaW52ZXJzZURlY29kZQorICB9KSB7CisgICAgdmFyIGNvbXB1dGVkTGVuZ3RoID0gKHdpZHRoICsgNyA+PiAzKSAqIGhlaWdodDsKKyAgICB2YXIgYWN0dWFsTGVuZ3RoID0gaW1nQXJyYXkuYnl0ZUxlbmd0aDsKKyAgICB2YXIgaGF2ZUZ1bGxEYXRhID0gY29tcHV0ZWRMZW5ndGggPT09IGFjdHVhbExlbmd0aDsKKyAgICB2YXIgZGF0YSwgaTsKKworICAgIGlmIChpbWFnZUlzRnJvbURlY29kZVN0cmVhbSAmJiAoIWludmVyc2VEZWNvZGUgfHwgaGF2ZUZ1bGxEYXRhKSkgeworICAgICAgZGF0YSA9IGltZ0FycmF5OworICAgIH0gZWxzZSBpZiAoIWludmVyc2VEZWNvZGUpIHsKKyAgICAgIGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoYWN0dWFsTGVuZ3RoKTsKKyAgICAgIGRhdGEuc2V0KGltZ0FycmF5KTsKKyAgICB9IGVsc2UgeworICAgICAgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShjb21wdXRlZExlbmd0aCk7CisgICAgICBkYXRhLnNldChpbWdBcnJheSk7CisKKyAgICAgIGZvciAoaSA9IGFjdHVhbExlbmd0aDsgaSA8IGNvbXB1dGVkTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXSA9IDB4ZmY7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGludmVyc2VEZWNvZGUpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhY3R1YWxMZW5ndGg7IGkrKykgeworICAgICAgICBkYXRhW2ldIF49IDB4ZmY7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGRhdGEsCisgICAgICB3aWR0aCwKKyAgICAgIGhlaWdodAorICAgIH07CisgIH0KKworICBnZXQgZHJhd1dpZHRoKCkgeworICAgIHJldHVybiBNYXRoLm1heCh0aGlzLndpZHRoLCB0aGlzLnNtYXNrICYmIHRoaXMuc21hc2sud2lkdGggfHwgMCwgdGhpcy5tYXNrICYmIHRoaXMubWFzay53aWR0aCB8fCAwKTsKKyAgfQorCisgIGdldCBkcmF3SGVpZ2h0KCkgeworICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmhlaWdodCwgdGhpcy5zbWFzayAmJiB0aGlzLnNtYXNrLmhlaWdodCB8fCAwLCB0aGlzLm1hc2sgJiYgdGhpcy5tYXNrLmhlaWdodCB8fCAwKTsKKyAgfQorCisgIGRlY29kZUJ1ZmZlcihidWZmZXIpIHsKKyAgICB2YXIgYnBjID0gdGhpcy5icGM7CisgICAgdmFyIG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKKyAgICB2YXIgZGVjb2RlQWRkZW5kcyA9IHRoaXMuZGVjb2RlQWRkZW5kczsKKyAgICB2YXIgZGVjb2RlQ29lZmZpY2llbnRzID0gdGhpcy5kZWNvZGVDb2VmZmljaWVudHM7CisgICAgdmFyIG1heCA9ICgxIDw8IGJwYykgLSAxOworICAgIHZhciBpLCBpaTsKKworICAgIGlmIChicGMgPT09IDEpIHsKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgYnVmZmVyW2ldID0gKyFidWZmZXJbaV07CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaW5kZXggPSAwOworCisgICAgZm9yIChpID0gMCwgaWkgPSB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bUNvbXBzOyBqKyspIHsKKyAgICAgICAgYnVmZmVyW2luZGV4XSA9IGRlY29kZUFuZENsYW1wKGJ1ZmZlcltpbmRleF0sIGRlY29kZUFkZGVuZHNbal0sIGRlY29kZUNvZWZmaWNpZW50c1tqXSwgbWF4KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBnZXRDb21wb25lbnRzKGJ1ZmZlcikgeworICAgIHZhciBicGMgPSB0aGlzLmJwYzsKKworICAgIGlmIChicGMgPT09IDgpIHsKKyAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorCisgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aDsKKyAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgdmFyIG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKKyAgICB2YXIgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQgKiBudW1Db21wczsKKyAgICB2YXIgYnVmZmVyUG9zID0gMDsKKyAgICBsZXQgb3V0cHV0OworCisgICAgaWYgKGJwYyA8PSA4KSB7CisgICAgICBvdXRwdXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOworICAgIH0gZWxzZSBpZiAoYnBjIDw9IDE2KSB7CisgICAgICBvdXRwdXQgPSBuZXcgVWludDE2QXJyYXkobGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGxlbmd0aCk7CisgICAgfQorCisgICAgdmFyIHJvd0NvbXBzID0gd2lkdGggKiBudW1Db21wczsKKyAgICB2YXIgbWF4ID0gKDEgPDwgYnBjKSAtIDE7CisgICAgdmFyIGkgPSAwLAorICAgICAgICBpaSwKKyAgICAgICAgYnVmOworCisgICAgaWYgKGJwYyA9PT0gMSkgeworICAgICAgdmFyIG1hc2ssIGxvb3AxRW5kLCBsb29wMkVuZDsKKworICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBsb29wMUVuZCA9IGkgKyAocm93Q29tcHMgJiB+Nyk7CisgICAgICAgIGxvb3AyRW5kID0gaSArIHJvd0NvbXBzOworCisgICAgICAgIHdoaWxlIChpIDwgbG9vcDFFbmQpIHsKKyAgICAgICAgICBidWYgPSBidWZmZXJbYnVmZmVyUG9zKytdOworICAgICAgICAgIG91dHB1dFtpXSA9IGJ1ZiA+PiA3ICYgMTsKKyAgICAgICAgICBvdXRwdXRbaSArIDFdID0gYnVmID4+IDYgJiAxOworICAgICAgICAgIG91dHB1dFtpICsgMl0gPSBidWYgPj4gNSAmIDE7CisgICAgICAgICAgb3V0cHV0W2kgKyAzXSA9IGJ1ZiA+PiA0ICYgMTsKKyAgICAgICAgICBvdXRwdXRbaSArIDRdID0gYnVmID4+IDMgJiAxOworICAgICAgICAgIG91dHB1dFtpICsgNV0gPSBidWYgPj4gMiAmIDE7CisgICAgICAgICAgb3V0cHV0W2kgKyA2XSA9IGJ1ZiA+PiAxICYgMTsKKyAgICAgICAgICBvdXRwdXRbaSArIDddID0gYnVmICYgMTsKKyAgICAgICAgICBpICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IGxvb3AyRW5kKSB7CisgICAgICAgICAgYnVmID0gYnVmZmVyW2J1ZmZlclBvcysrXTsKKyAgICAgICAgICBtYXNrID0gMTI4OworCisgICAgICAgICAgd2hpbGUgKGkgPCBsb29wMkVuZCkgeworICAgICAgICAgICAgb3V0cHV0W2krK10gPSArISEoYnVmICYgbWFzayk7CisgICAgICAgICAgICBtYXNrID4+PSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgYml0cyA9IDA7CisgICAgICBidWYgPSAwOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IGxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgaWYgKGkgJSByb3dDb21wcyA9PT0gMCkgeworICAgICAgICAgIGJ1ZiA9IDA7CisgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoYml0cyA8IGJwYykgeworICAgICAgICAgIGJ1ZiA9IGJ1ZiA8PCA4IHwgYnVmZmVyW2J1ZmZlclBvcysrXTsKKyAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmVtYWluaW5nQml0cyA9IGJpdHMgLSBicGM7CisgICAgICAgIGxldCB2YWx1ZSA9IGJ1ZiA+PiByZW1haW5pbmdCaXRzOworCisgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiBtYXgpIHsKKyAgICAgICAgICB2YWx1ZSA9IG1heDsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dFtpXSA9IHZhbHVlOworICAgICAgICBidWYgPSBidWYgJiAoMSA8PCByZW1haW5pbmdCaXRzKSAtIDE7CisgICAgICAgIGJpdHMgPSByZW1haW5pbmdCaXRzOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXRwdXQ7CisgIH0KKworICBmaWxsT3BhY2l0eShyZ2JhQnVmLCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGltYWdlKSB7CisgICAgdmFyIHNtYXNrID0gdGhpcy5zbWFzazsKKyAgICB2YXIgbWFzayA9IHRoaXMubWFzazsKKyAgICB2YXIgYWxwaGFCdWYsIHN3LCBzaCwgaSwgaWksIGo7CisKKyAgICBpZiAoc21hc2spIHsKKyAgICAgIHN3ID0gc21hc2sud2lkdGg7CisgICAgICBzaCA9IHNtYXNrLmhlaWdodDsKKyAgICAgIGFscGhhQnVmID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN3ICogc2gpOworICAgICAgc21hc2suZmlsbEdyYXlCdWZmZXIoYWxwaGFCdWYpOworCisgICAgICBpZiAoc3cgIT09IHdpZHRoIHx8IHNoICE9PSBoZWlnaHQpIHsKKyAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIHNtYXNrLmJwYywgc3csIHNoLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1hc2spIHsKKyAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgUERGSW1hZ2UpIHsKKyAgICAgICAgc3cgPSBtYXNrLndpZHRoOworICAgICAgICBzaCA9IG1hc2suaGVpZ2h0OworICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzdyAqIHNoKTsKKyAgICAgICAgbWFzay5udW1Db21wcyA9IDE7CisgICAgICAgIG1hc2suZmlsbEdyYXlCdWZmZXIoYWxwaGFCdWYpOworCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gc3cgKiBzaDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgICBhbHBoYUJ1ZltpXSA9IDI1NSAtIGFscGhhQnVmW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN3ICE9PSB3aWR0aCB8fCBzaCAhPT0gaGVpZ2h0KSB7CisgICAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIG1hc2suYnBjLCBzdywgc2gsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWFzaykpIHsKKyAgICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQpOworICAgICAgICB2YXIgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOworCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGggKiBoZWlnaHQ7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgdmFyIG9wYWNpdHkgPSAwOworICAgICAgICAgIHZhciBpbWFnZU9mZnNldCA9IGkgKiBudW1Db21wczsKKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1Db21wczsgKytqKSB7CisgICAgICAgICAgICB2YXIgY29sb3IgPSBpbWFnZVtpbWFnZU9mZnNldCArIGpdOworICAgICAgICAgICAgdmFyIG1hc2tPZmZzZXQgPSBqICogMjsKKworICAgICAgICAgICAgaWYgKGNvbG9yIDwgbWFza1ttYXNrT2Zmc2V0XSB8fCBjb2xvciA+IG1hc2tbbWFza09mZnNldCArIDFdKSB7CisgICAgICAgICAgICAgIG9wYWNpdHkgPSAyNTU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGFscGhhQnVmW2ldID0gb3BhY2l0eTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIG1hc2sgZm9ybWF0LiIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChhbHBoYUJ1ZikgeworICAgICAgZm9yIChpID0gMCwgaiA9IDMsIGlpID0gd2lkdGggKiBhY3R1YWxIZWlnaHQ7IGkgPCBpaTsgKytpLCBqICs9IDQpIHsKKyAgICAgICAgcmdiYUJ1ZltqXSA9IGFscGhhQnVmW2ldOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkgeworICAgICAgICByZ2JhQnVmW2pdID0gMjU1OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHVuZG9QcmVibGVuZChidWZmZXIsIHdpZHRoLCBoZWlnaHQpIHsKKyAgICB2YXIgbWF0dGUgPSB0aGlzLnNtYXNrICYmIHRoaXMuc21hc2subWF0dGU7CisKKyAgICBpZiAoIW1hdHRlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG1hdHRlUmdiID0gdGhpcy5jb2xvclNwYWNlLmdldFJnYihtYXR0ZSwgMCk7CisgICAgdmFyIG1hdHRlUiA9IG1hdHRlUmdiWzBdOworICAgIHZhciBtYXR0ZUcgPSBtYXR0ZVJnYlsxXTsKKyAgICB2YXIgbWF0dGVCID0gbWF0dGVSZ2JbMl07CisgICAgdmFyIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgIHZhciBhbHBoYSA9IGJ1ZmZlcltpICsgM107CisKKyAgICAgIGlmIChhbHBoYSA9PT0gMCkgeworICAgICAgICBidWZmZXJbaV0gPSAyNTU7CisgICAgICAgIGJ1ZmZlcltpICsgMV0gPSAyNTU7CisgICAgICAgIGJ1ZmZlcltpICsgMl0gPSAyNTU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgayA9IDI1NSAvIGFscGhhOworICAgICAgYnVmZmVyW2ldID0gKGJ1ZmZlcltpXSAtIG1hdHRlUikgKiBrICsgbWF0dGVSOworICAgICAgYnVmZmVyW2kgKyAxXSA9IChidWZmZXJbaSArIDFdIC0gbWF0dGVHKSAqIGsgKyBtYXR0ZUc7CisgICAgICBidWZmZXJbaSArIDJdID0gKGJ1ZmZlcltpICsgMl0gLSBtYXR0ZUIpICogayArIG1hdHRlQjsKKyAgICB9CisgIH0KKworICBjcmVhdGVJbWFnZURhdGEoZm9yY2VSR0JBID0gZmFsc2UpIHsKKyAgICB2YXIgZHJhd1dpZHRoID0gdGhpcy5kcmF3V2lkdGg7CisgICAgdmFyIGRyYXdIZWlnaHQgPSB0aGlzLmRyYXdIZWlnaHQ7CisgICAgdmFyIGltZ0RhdGEgPSB7CisgICAgICB3aWR0aDogZHJhd1dpZHRoLAorICAgICAgaGVpZ2h0OiBkcmF3SGVpZ2h0LAorICAgICAga2luZDogMCwKKyAgICAgIGRhdGE6IG51bGwKKyAgICB9OworICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CisgICAgdmFyIG9yaWdpbmFsV2lkdGggPSB0aGlzLndpZHRoOworICAgIHZhciBvcmlnaW5hbEhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgIHZhciBicGMgPSB0aGlzLmJwYzsKKyAgICB2YXIgcm93Qnl0ZXMgPSBvcmlnaW5hbFdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CisgICAgdmFyIGltZ0FycmF5OworCisgICAgaWYgKCFmb3JjZVJHQkEpIHsKKyAgICAgIHZhciBraW5kOworCisgICAgICBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJEZXZpY2VHcmF5IiAmJiBicGMgPT09IDEpIHsKKyAgICAgICAga2luZCA9IF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJEZXZpY2VSR0IiICYmIGJwYyA9PT0gOCAmJiAhdGhpcy5uZWVkc0RlY29kZSkgeworICAgICAgICBraW5kID0gX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUDsKKyAgICAgIH0KKworICAgICAgaWYgKGtpbmQgJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzayAmJiBkcmF3V2lkdGggPT09IG9yaWdpbmFsV2lkdGggJiYgZHJhd0hlaWdodCA9PT0gb3JpZ2luYWxIZWlnaHQpIHsKKyAgICAgICAgaW1nRGF0YS5raW5kID0ga2luZDsKKyAgICAgICAgaW1nQXJyYXkgPSB0aGlzLmdldEltYWdlQnl0ZXMob3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlcyk7CisKKyAgICAgICAgaWYgKHRoaXMuaW1hZ2UgaW5zdGFuY2VvZiBfc3RyZWFtLkRlY29kZVN0cmVhbSkgeworICAgICAgICAgIGltZ0RhdGEuZGF0YSA9IGltZ0FycmF5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhciBuZXdBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdBcnJheS5sZW5ndGgpOworICAgICAgICAgIG5ld0FycmF5LnNldChpbWdBcnJheSk7CisgICAgICAgICAgaW1nRGF0YS5kYXRhID0gbmV3QXJyYXk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgeworICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKGtpbmQgPT09IF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCwgIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLiIpOworICAgICAgICAgIHZhciBidWZmZXIgPSBpbWdEYXRhLmRhdGE7CisKKyAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBidWZmZXIubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgYnVmZmVyW2ldIF49IDB4ZmY7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGltZ0RhdGE7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmltYWdlIGluc3RhbmNlb2YgX2pwZWdfc3RyZWFtLkpwZWdTdHJlYW0gJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzaykgeworICAgICAgICBsZXQgaW1hZ2VMZW5ndGggPSBvcmlnaW5hbEhlaWdodCAqIHJvd0J5dGVzOworCisgICAgICAgIHN3aXRjaCAodGhpcy5jb2xvclNwYWNlLm5hbWUpIHsKKyAgICAgICAgICBjYXNlICJEZXZpY2VHcmF5IjoKKyAgICAgICAgICAgIGltYWdlTGVuZ3RoICo9IDM7CisKKyAgICAgICAgICBjYXNlICJEZXZpY2VSR0IiOgorICAgICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgorICAgICAgICAgICAgaW1nRGF0YS5raW5kID0gX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUDsKKyAgICAgICAgICAgIGltZ0RhdGEuZGF0YSA9IHRoaXMuZ2V0SW1hZ2VCeXRlcyhpbWFnZUxlbmd0aCwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBpbWdEYXRhOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW1nQXJyYXkgPSB0aGlzLmdldEltYWdlQnl0ZXMob3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlcyk7CisgICAgdmFyIGFjdHVhbEhlaWdodCA9IDAgfCBpbWdBcnJheS5sZW5ndGggLyByb3dCeXRlcyAqIGRyYXdIZWlnaHQgLyBvcmlnaW5hbEhlaWdodDsKKyAgICB2YXIgY29tcHMgPSB0aGlzLmdldENvbXBvbmVudHMoaW1nQXJyYXkpOworICAgIHZhciBhbHBoYTAxLCBtYXliZVVuZG9QcmVibGVuZDsKKworICAgIGlmICghZm9yY2VSR0JBICYmICF0aGlzLnNtYXNrICYmICF0aGlzLm1hc2spIHsKKyAgICAgIGltZ0RhdGEua2luZCA9IF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA7CisgICAgICBpbWdEYXRhLmRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZHJhd1dpZHRoICogZHJhd0hlaWdodCAqIDMpOworICAgICAgYWxwaGEwMSA9IDA7CisgICAgICBtYXliZVVuZG9QcmVibGVuZCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBpbWdEYXRhLmtpbmQgPSBfdXRpbC5JbWFnZUtpbmQuUkdCQV8zMkJQUDsKKyAgICAgIGltZ0RhdGEuZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkcmF3V2lkdGggKiBkcmF3SGVpZ2h0ICogNCk7CisgICAgICBhbHBoYTAxID0gMTsKKyAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gdHJ1ZTsKKyAgICAgIHRoaXMuZmlsbE9wYWNpdHkoaW1nRGF0YS5kYXRhLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIGFjdHVhbEhlaWdodCwgY29tcHMpOworICAgIH0KKworICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CisgICAgICB0aGlzLmRlY29kZUJ1ZmZlcihjb21wcyk7CisgICAgfQorCisgICAgdGhpcy5jb2xvclNwYWNlLmZpbGxSZ2IoaW1nRGF0YS5kYXRhLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpOworCisgICAgaWYgKG1heWJlVW5kb1ByZWJsZW5kKSB7CisgICAgICB0aGlzLnVuZG9QcmVibGVuZChpbWdEYXRhLmRhdGEsIGRyYXdXaWR0aCwgYWN0dWFsSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gaW1nRGF0YTsKKyAgfQorCisgIGZpbGxHcmF5QnVmZmVyKGJ1ZmZlcikgeworICAgIHZhciBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CisKKyAgICBpZiAobnVtQ29tcHMgIT09IDEpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgUmVhZGluZyBncmF5IHNjYWxlIGZyb20gYSBjb2xvciBpbWFnZTogJHtudW1Db21wc31gKTsKKyAgICB9CisKKyAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoOworICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICB2YXIgYnBjID0gdGhpcy5icGM7CisgICAgdmFyIHJvd0J5dGVzID0gd2lkdGggKiBudW1Db21wcyAqIGJwYyArIDcgPj4gMzsKKyAgICB2YXIgaW1nQXJyYXkgPSB0aGlzLmdldEltYWdlQnl0ZXMoaGVpZ2h0ICogcm93Qnl0ZXMpOworICAgIHZhciBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7CisgICAgdmFyIGksIGxlbmd0aDsKKworICAgIGlmIChicGMgPT09IDEpIHsKKyAgICAgIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OworCisgICAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICBidWZmZXJbaV0gPSBjb21wc1tpXSAtIDEgJiAyNTU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgIGJ1ZmZlcltpXSA9IC1jb21wc1tpXSAmIDI1NTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKKyAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTsKKyAgICB9CisKKyAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKKyAgICB2YXIgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYnBjKSAtIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICBidWZmZXJbaV0gPSBzY2FsZSAqIGNvbXBzW2ldOworICAgIH0KKyAgfQorCisgIGdldEltYWdlQnl0ZXMobGVuZ3RoLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIGZvcmNlUkdCID0gZmFsc2UpIHsKKyAgICB0aGlzLmltYWdlLnJlc2V0KCk7CisgICAgdGhpcy5pbWFnZS5kcmF3V2lkdGggPSBkcmF3V2lkdGggfHwgdGhpcy53aWR0aDsKKyAgICB0aGlzLmltYWdlLmRyYXdIZWlnaHQgPSBkcmF3SGVpZ2h0IHx8IHRoaXMuaGVpZ2h0OworICAgIHRoaXMuaW1hZ2UuZm9yY2VSR0IgPSAhIWZvcmNlUkdCOworICAgIHJldHVybiB0aGlzLmltYWdlLmdldEJ5dGVzKGxlbmd0aCwgdHJ1ZSk7CisgIH0KKworfQorCitleHBvcnRzLlBERkltYWdlID0gUERGSW1hZ2U7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvaW1hZ2VfdXRpbHMuanMgYi9saWIvY29yZS9pbWFnZV91dGlscy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjZiNWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvaW1hZ2VfdXRpbHMuanMKQEAgLTAsMCArMSwyNzEgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkdsb2JhbEltYWdlQ2FjaGUgPSBleHBvcnRzLkxvY2FsR1N0YXRlQ2FjaGUgPSBleHBvcnRzLkxvY2FsRnVuY3Rpb25DYWNoZSA9IGV4cG9ydHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBleHBvcnRzLkxvY2FsSW1hZ2VDYWNoZSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi9wcmltaXRpdmVzLmpzIik7CisKK2NsYXNzIEJhc2VMb2NhbENhY2hlIHsKKyAgY29uc3RydWN0b3Iob3B0aW9ucykgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlTG9jYWxDYWNoZSkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUxvY2FsQ2FjaGUuIik7CisgICAgfQorCisgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm9ubHlSZWZzKSB7CisgICAgICB0aGlzLl9uYW1lUmVmTWFwID0gbmV3IE1hcCgpOworICAgICAgdGhpcy5faW1hZ2VNYXAgPSBuZXcgTWFwKCk7CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOworICB9CisKKyAgZ2V0QnlOYW1lKG5hbWUpIHsKKyAgICBjb25zdCByZWYgPSB0aGlzLl9uYW1lUmVmTWFwLmdldChuYW1lKTsKKworICAgIGlmIChyZWYpIHsKKyAgICAgIHJldHVybiB0aGlzLmdldEJ5UmVmKHJlZik7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX2ltYWdlTWFwLmdldChuYW1lKSB8fCBudWxsOworICB9CisKKyAgZ2V0QnlSZWYocmVmKSB7CisgICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZikgfHwgbnVsbDsKKyAgfQorCisgIHNldChuYW1lLCByZWYsIGRhdGEpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHNldGAgY2FsbGVkLiIpOworICB9CisKK30KKworY2xhc3MgTG9jYWxJbWFnZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgeworICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkgeworICAgIGlmICghbmFtZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEltYWdlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFyZ3VtZW50LicpOworICAgIH0KKworICAgIGlmIChyZWYpIHsKKyAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKKworICAgICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7CisgIH0KKworfQorCitleHBvcnRzLkxvY2FsSW1hZ2VDYWNoZSA9IExvY2FsSW1hZ2VDYWNoZTsKKworY2xhc3MgTG9jYWxDb2xvclNwYWNlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7CisgIHNldChuYW1lID0gbnVsbCwgcmVmID0gbnVsbCwgZGF0YSkgeworICAgIGlmICghbmFtZSAmJiAhcmVmKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7CisgICAgfQorCisgICAgaWYgKHJlZikgeworICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAobmFtZSkgeworICAgICAgICB0aGlzLl9uYW1lUmVmTWFwLnNldChuYW1lLCByZWYpOworICAgICAgfQorCisgICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTsKKyAgfQorCit9CisKK2V4cG9ydHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBMb2NhbENvbG9yU3BhY2VDYWNoZTsKKworY2xhc3MgTG9jYWxGdW5jdGlvbkNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgeworICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CisgICAgc3VwZXIoeworICAgICAgb25seVJlZnM6IHRydWUKKyAgICB9KTsKKyAgfQorCisgIGdldEJ5TmFtZShuYW1lKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGBnZXRCeU5hbWVgIG1ldGhvZC4iKTsKKyAgfQorCisgIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7CisgICAgaWYgKCFyZWYpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxGdW5jdGlvbkNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpOworICAgIH0KKworICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKKyAgfQorCit9CisKK2V4cG9ydHMuTG9jYWxGdW5jdGlvbkNhY2hlID0gTG9jYWxGdW5jdGlvbkNhY2hlOworCitjbGFzcyBMb2NhbEdTdGF0ZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgeworICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkgeworICAgIGlmICghbmFtZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEdTdGF0ZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhcmd1bWVudC4nKTsKKyAgICB9CisKKyAgICBpZiAocmVmKSB7CisgICAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CisKKyAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOworICB9CisKK30KKworZXhwb3J0cy5Mb2NhbEdTdGF0ZUNhY2hlID0gTG9jYWxHU3RhdGVDYWNoZTsKKworY2xhc3MgR2xvYmFsSW1hZ2VDYWNoZSB7CisgIHN0YXRpYyBnZXQgTlVNX1BBR0VTX1RIUkVTSE9MRCgpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIk5VTV9QQUdFU19USFJFU0hPTEQiLCAyKTsKKyAgfQorCisgIHN0YXRpYyBnZXQgTUFYX0lNQUdFU19UT19DQUNIRSgpIHsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIk1BWF9JTUFHRVNfVE9fQ0FDSEUiLCAxMCk7CisgIH0KKworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLl9yZWZDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOworICAgIHRoaXMuX2ltYWdlQ2FjaGUgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKTsKKyAgfQorCisgIHNob3VsZENhY2hlKHJlZiwgcGFnZUluZGV4KSB7CisgICAgY29uc3QgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7CisKKyAgICBjb25zdCBudW1QYWdlcyA9IHBhZ2VJbmRleFNldCA/IHBhZ2VJbmRleFNldC5zaXplICsgKHBhZ2VJbmRleFNldC5oYXMocGFnZUluZGV4KSA/IDAgOiAxKSA6IDE7CisKKyAgICBpZiAobnVtUGFnZXMgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikgJiYgdGhpcy5faW1hZ2VDYWNoZS5zaXplID49IEdsb2JhbEltYWdlQ2FjaGUuTUFYX0lNQUdFU19UT19DQUNIRSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYWRkUGFnZUluZGV4KHJlZiwgcGFnZUluZGV4KSB7CisgICAgbGV0IHBhZ2VJbmRleFNldCA9IHRoaXMuX3JlZkNhY2hlLmdldChyZWYpOworCisgICAgaWYgKCFwYWdlSW5kZXhTZXQpIHsKKyAgICAgIHBhZ2VJbmRleFNldCA9IG5ldyBTZXQoKTsKKworICAgICAgdGhpcy5fcmVmQ2FjaGUucHV0KHJlZiwgcGFnZUluZGV4U2V0KTsKKyAgICB9CisKKyAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7CisgIH0KKworICBnZXREYXRhKHJlZiwgcGFnZUluZGV4KSB7CisgICAgY29uc3QgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7CisKKyAgICBpZiAoIXBhZ2VJbmRleFNldCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaWYgKHBhZ2VJbmRleFNldC5zaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHBhZ2VJbmRleFNldC5hZGQocGFnZUluZGV4KTsKKyAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKTsKKyAgfQorCisgIHNldERhdGEocmVmLCBkYXRhKSB7CisgICAgaWYgKCF0aGlzLl9yZWZDYWNoZS5oYXMocmVmKSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBleHBlY3RlZCAiYWRkUGFnZUluZGV4IiB0byBoYXZlIGJlZW4gY2FsbGVkLicpOworICAgIH0KKworICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA+PSBHbG9iYWxJbWFnZUNhY2hlLk1BWF9JTUFHRVNfVE9fQ0FDSEUpIHsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gaWdub3JpbmcgaW1hZ2UgYWJvdmUgTUFYX0lNQUdFU19UT19DQUNIRS4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOworICB9CisKKyAgY2xlYXIob25seURhdGEgPSBmYWxzZSkgeworICAgIGlmICghb25seURhdGEpIHsKKyAgICAgIHRoaXMuX3JlZkNhY2hlLmNsZWFyKCk7CisgICAgfQorCisgICAgdGhpcy5faW1hZ2VDYWNoZS5jbGVhcigpOworICB9CisKK30KKworZXhwb3J0cy5HbG9iYWxJbWFnZUNhY2hlID0gR2xvYmFsSW1hZ2VDYWNoZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9qYmlnMi5qcyBiL2xpYi9jb3JlL2piaWcyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDI1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9qYmlnMi5qcwpAQCAtMCwwICsxLDIyMjMgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkpiaWcySW1hZ2UgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfY29yZV91dGlscyA9IHJlcXVpcmUoIi4vY29yZV91dGlscy5qcyIpOworCit2YXIgX2FyaXRobWV0aWNfZGVjb2RlciA9IHJlcXVpcmUoIi4vYXJpdGhtZXRpY19kZWNvZGVyLmpzIik7CisKK3ZhciBfY2NpdHQgPSByZXF1aXJlKCIuL2NjaXR0LmpzIik7CisKK2NsYXNzIEpiaWcyRXJyb3IgZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnKSB7CisgICAgc3VwZXIoYEpCSUcyIGVycm9yOiAke21zZ31gKTsKKyAgfQorCit9CisKK3ZhciBKYmlnMkltYWdlID0gZnVuY3Rpb24gSmJpZzJJbWFnZUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENvbnRleHRDYWNoZSgpIHt9CisKKyAgQ29udGV4dENhY2hlLnByb3RvdHlwZSA9IHsKKyAgICBnZXRDb250ZXh0cyhpZCkgeworICAgICAgaWYgKGlkIGluIHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIHRoaXNbaWRdOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpc1tpZF0gPSBuZXcgSW50OEFycmF5KDEgPDwgMTYpOworICAgIH0KKworICB9OworCisgIGZ1bmN0aW9uIERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgdGhpcy5lbmQgPSBlbmQ7CisgIH0KKworICBEZWNvZGluZ0NvbnRleHQucHJvdG90eXBlID0geworICAgIGdldCBkZWNvZGVyKCkgeworICAgICAgdmFyIGRlY29kZXIgPSBuZXcgX2FyaXRobWV0aWNfZGVjb2Rlci5Bcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZGVjb2RlciIsIGRlY29kZXIpOworICAgIH0sCisKKyAgICBnZXQgY29udGV4dENhY2hlKCkgeworICAgICAgdmFyIGNhY2hlID0gbmV3IENvbnRleHRDYWNoZSgpOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjb250ZXh0Q2FjaGUiLCBjYWNoZSk7CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsIHByb2NlZHVyZSwgZGVjb2RlcikgeworICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpOworICAgIHZhciBwcmV2ID0gMTsKKworICAgIGZ1bmN0aW9uIHJlYWRCaXRzKGxlbmd0aCkgeworICAgICAgdmFyIHYgPSAwOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpOworICAgICAgICBwcmV2ID0gcHJldiA8IDI1NiA/IHByZXYgPDwgMSB8IGJpdCA6IChwcmV2IDw8IDEgfCBiaXQpICYgNTExIHwgMjU2OworICAgICAgICB2ID0gdiA8PCAxIHwgYml0OworICAgICAgfQorCisgICAgICByZXR1cm4gdiA+Pj4gMDsKKyAgICB9CisKKyAgICB2YXIgc2lnbiA9IHJlYWRCaXRzKDEpOworICAgIHZhciB2YWx1ZSA9IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygzMikgKyA0NDM2IDogcmVhZEJpdHMoMTIpICsgMzQwIDogcmVhZEJpdHMoOCkgKyA4NCA6IHJlYWRCaXRzKDYpICsgMjAgOiByZWFkQml0cyg0KSArIDQgOiByZWFkQml0cygyKTsKKworICAgIGlmIChzaWduID09PSAwKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgIHJldHVybiAtdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkgeworICAgIHZhciBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiSUFJRCIpOworICAgIHZhciBwcmV2ID0gMTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZUxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKKyAgICAgIHByZXYgPSBwcmV2IDw8IDEgfCBiaXQ7CisgICAgfQorCisgICAgaWYgKGNvZGVMZW5ndGggPCAzMSkgeworICAgICAgcmV0dXJuIHByZXYgJiAoMSA8PCBjb2RlTGVuZ3RoKSAtIDE7CisgICAgfQorCisgICAgcmV0dXJuIHByZXYgJiAweDdmZmZmZmZmOworICB9CisKKyAgdmFyIFNlZ21lbnRUeXBlcyA9IFsiU3ltYm9sRGljdGlvbmFyeSIsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVUZXh0UmVnaW9uIiwgbnVsbCwgIkltbWVkaWF0ZVRleHRSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlBhdHRlcm5EaWN0aW9uYXJ5IiwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwgbnVsbCwgIkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVHZW5lcmljUmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbiIsICJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWZpbmVtZW50UmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlBhZ2VJbmZvcm1hdGlvbiIsICJFbmRPZlBhZ2UiLCAiRW5kT2ZTdHJpcGUiLCAiRW5kT2ZGaWxlIiwgIlByb2ZpbGVzIiwgIlRhYmxlcyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJFeHRlbnNpb24iXTsKKyAgdmFyIENvZGluZ1RlbXBsYXRlcyA9IFtbeworICAgIHg6IC0xLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0yCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC00LAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0zLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IDAKKyAgfV0sIFt7CisgICAgeDogLTEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IDIsCisgICAgeTogLTIKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTMsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogMAorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogMAorICB9XSwgW3sKKyAgICB4OiAtMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMCwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogMSwKKyAgICB5OiAtMgorICB9LCB7CisgICAgeDogLTIsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAwLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAxLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAwCisgIH0sIHsKKyAgICB4OiAtMSwKKyAgICB5OiAwCisgIH1dLCBbeworICAgIHg6IC0zLAorICAgIHk6IC0xCisgIH0sIHsKKyAgICB4OiAtMiwKKyAgICB5OiAtMQorICB9LCB7CisgICAgeDogLTEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDAsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IDEsCisgICAgeTogLTEKKyAgfSwgeworICAgIHg6IC00LAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0zLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0yLAorICAgIHk6IDAKKyAgfSwgeworICAgIHg6IC0xLAorICAgIHk6IDAKKyAgfV1dOworICB2YXIgUmVmaW5lbWVudFRlbXBsYXRlcyA9IFt7CisgICAgY29kaW5nOiBbeworICAgICAgeDogMCwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogLTEsCisgICAgICB5OiAwCisgICAgfV0sCisgICAgcmVmZXJlbmNlOiBbeworICAgICAgeDogMCwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IC0xCisgICAgfSwgeworICAgICAgeDogLTEsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMCwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAxLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMQorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAxCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IDEKKyAgICB9XQorICB9LCB7CisgICAgY29kaW5nOiBbeworICAgICAgeDogLTEsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMAorICAgIH1dLAorICAgIHJlZmVyZW5jZTogW3sKKyAgICAgIHg6IDAsCisgICAgICB5OiAtMQorICAgIH0sIHsKKyAgICAgIHg6IC0xLAorICAgICAgeTogMAorICAgIH0sIHsKKyAgICAgIHg6IDAsCisgICAgICB5OiAwCisgICAgfSwgeworICAgICAgeDogMSwKKyAgICAgIHk6IDAKKyAgICB9LCB7CisgICAgICB4OiAwLAorICAgICAgeTogMQorICAgIH0sIHsKKyAgICAgIHg6IDEsCisgICAgICB5OiAxCisgICAgfV0KKyAgfV07CisgIHZhciBSZXVzZWRDb250ZXh0cyA9IFsweDliMjUsIDB4MDc5NSwgMHgwMGU1LCAweDAxOTVdOworICB2YXIgUmVmaW5lbWVudFJldXNlZENvbnRleHRzID0gWzB4MDAyMCwgMHgwMDA4XTsKKworICBmdW5jdGlvbiBkZWNvZGVCaXRtYXBUZW1wbGF0ZTAod2lkdGgsIGhlaWdodCwgZGVjb2RpbmdDb250ZXh0KSB7CisgICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKKyAgICB2YXIgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOworICAgIHZhciBjb250ZXh0TGFiZWwsCisgICAgICAgIGksCisgICAgICAgIGosCisgICAgICAgIHBpeGVsLAorICAgICAgICByb3csCisgICAgICAgIHJvdzEsCisgICAgICAgIHJvdzIsCisgICAgICAgIGJpdG1hcCA9IFtdOworICAgIHZhciBPTERfUElYRUxfTUFTSyA9IDB4N2JmNzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgcm93ID0gYml0bWFwW2ldID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgcm93MSA9IGkgPCAxID8gcm93IDogYml0bWFwW2kgLSAxXTsKKyAgICAgIHJvdzIgPSBpIDwgMiA/IHJvdyA6IGJpdG1hcFtpIC0gMl07CisgICAgICBjb250ZXh0TGFiZWwgPSByb3cyWzBdIDw8IDEzIHwgcm93MlsxXSA8PCAxMiB8IHJvdzJbMl0gPDwgMTEgfCByb3cxWzBdIDw8IDcgfCByb3cxWzFdIDw8IDYgfCByb3cxWzJdIDw8IDUgfCByb3cxWzNdIDw8IDQ7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIHJvd1tqXSA9IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICBjb250ZXh0TGFiZWwgPSAoY29udGV4dExhYmVsICYgT0xEX1BJWEVMX01BU0spIDw8IDEgfCAoaiArIDMgPCB3aWR0aCA/IHJvdzJbaiArIDNdIDw8IDExIDogMCkgfCAoaiArIDQgPCB3aWR0aCA/IHJvdzFbaiArIDRdIDw8IDQgOiAwKSB8IHBpeGVsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVCaXRtYXAobW1yLCB3aWR0aCwgaGVpZ2h0LCB0ZW1wbGF0ZUluZGV4LCBwcmVkaWN0aW9uLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KSB7CisgICAgaWYgKG1tcikgeworICAgICAgY29uc3QgaW5wdXQgPSBuZXcgUmVhZGVyKGRlY29kaW5nQ29udGV4dC5kYXRhLCBkZWNvZGluZ0NvbnRleHQuc3RhcnQsIGRlY29kaW5nQ29udGV4dC5lbmQpOworICAgICAgcmV0dXJuIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOworICAgIH0KKworICAgIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwICYmICFza2lwICYmICFwcmVkaWN0aW9uICYmIGF0Lmxlbmd0aCA9PT0gNCAmJiBhdFswXS54ID09PSAzICYmIGF0WzBdLnkgPT09IC0xICYmIGF0WzFdLnggPT09IC0zICYmIGF0WzFdLnkgPT09IC0xICYmIGF0WzJdLnggPT09IDIgJiYgYXRbMl0ueSA9PT0gLTIgJiYgYXRbM10ueCA9PT0gLTIgJiYgYXRbM10ueSA9PT0gLTIpIHsKKyAgICAgIHJldHVybiBkZWNvZGVCaXRtYXBUZW1wbGF0ZTAod2lkdGgsIGhlaWdodCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICB9CisKKyAgICB2YXIgdXNlc2tpcCA9ICEhc2tpcDsKKyAgICB2YXIgdGVtcGxhdGUgPSBDb2RpbmdUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29uY2F0KGF0KTsKKyAgICB0ZW1wbGF0ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICByZXR1cm4gYS55IC0gYi55IHx8IGEueCAtIGIueDsKKyAgICB9KTsKKyAgICB2YXIgdGVtcGxhdGVMZW5ndGggPSB0ZW1wbGF0ZS5sZW5ndGg7CisgICAgdmFyIHRlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkodGVtcGxhdGVMZW5ndGgpOworICAgIHZhciB0ZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KHRlbXBsYXRlTGVuZ3RoKTsKKyAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMgPSBbXTsKKyAgICB2YXIgcmV1c2VNYXNrID0gMCwKKyAgICAgICAgbWluWCA9IDAsCisgICAgICAgIG1heFggPSAwLAorICAgICAgICBtaW5ZID0gMDsKKyAgICB2YXIgYywgazsKKworICAgIGZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZUxlbmd0aDsgaysrKSB7CisgICAgICB0ZW1wbGF0ZVhba10gPSB0ZW1wbGF0ZVtrXS54OworICAgICAgdGVtcGxhdGVZW2tdID0gdGVtcGxhdGVba10ueTsKKyAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB0ZW1wbGF0ZVtrXS54KTsKKyAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB0ZW1wbGF0ZVtrXS54KTsKKyAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB0ZW1wbGF0ZVtrXS55KTsKKworICAgICAgaWYgKGsgPCB0ZW1wbGF0ZUxlbmd0aCAtIDEgJiYgdGVtcGxhdGVba10ueSA9PT0gdGVtcGxhdGVbayArIDFdLnkgJiYgdGVtcGxhdGVba10ueCA9PT0gdGVtcGxhdGVbayArIDFdLnggLSAxKSB7CisgICAgICAgIHJldXNlTWFzayB8PSAxIDw8IHRlbXBsYXRlTGVuZ3RoIC0gMSAtIGs7CisgICAgICB9IGVsc2UgeworICAgICAgICBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcy5wdXNoKGspOworICAgICAgfQorICAgIH0KKworICAgIHZhciBjaGFuZ2luZ0VudHJpZXNMZW5ndGggPSBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcy5sZW5ndGg7CisgICAgdmFyIGNoYW5naW5nVGVtcGxhdGVYID0gbmV3IEludDhBcnJheShjaGFuZ2luZ0VudHJpZXNMZW5ndGgpOworICAgIHZhciBjaGFuZ2luZ1RlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKKyAgICB2YXIgY2hhbmdpbmdUZW1wbGF0ZUJpdCA9IG5ldyBVaW50MTZBcnJheShjaGFuZ2luZ0VudHJpZXNMZW5ndGgpOworCisgICAgZm9yIChjID0gMDsgYyA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgYysrKSB7CisgICAgICBrID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXNbY107CisgICAgICBjaGFuZ2luZ1RlbXBsYXRlWFtjXSA9IHRlbXBsYXRlW2tdLng7CisgICAgICBjaGFuZ2luZ1RlbXBsYXRlWVtjXSA9IHRlbXBsYXRlW2tdLnk7CisgICAgICBjaGFuZ2luZ1RlbXBsYXRlQml0W2NdID0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOworICAgIH0KKworICAgIHZhciBzYmJfbGVmdCA9IC1taW5YOworICAgIHZhciBzYmJfdG9wID0gLW1pblk7CisgICAgdmFyIHNiYl9yaWdodCA9IHdpZHRoIC0gbWF4WDsKKyAgICB2YXIgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CisgICAgdmFyIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKKyAgICB2YXIgYml0bWFwID0gW107CisgICAgdmFyIGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKKyAgICB2YXIgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOworICAgIHZhciBsdHAgPSAwLAorICAgICAgICBqLAorICAgICAgICBpMCwKKyAgICAgICAgajAsCisgICAgICAgIGNvbnRleHRMYWJlbCA9IDAsCisgICAgICAgIGJpdCwKKyAgICAgICAgc2hpZnQ7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBpZiAocHJlZGljdGlvbikgeworICAgICAgICB2YXIgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKKyAgICAgICAgbHRwIF49IHNsdHA7CisKKyAgICAgICAgaWYgKGx0cCkgeworICAgICAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocm93KTsKKyAgICAgIGJpdG1hcC5wdXNoKHJvdyk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHsKKyAgICAgICAgICByb3dbal0gPSAwOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGogPj0gc2JiX2xlZnQgJiYgaiA8IHNiYl9yaWdodCAmJiBpID49IHNiYl90b3ApIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSBjb250ZXh0TGFiZWwgPDwgMSAmIHJldXNlTWFzazsKKworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjaGFuZ2luZ0VudHJpZXNMZW5ndGg7IGsrKykgeworICAgICAgICAgICAgaTAgPSBpICsgY2hhbmdpbmdUZW1wbGF0ZVlba107CisgICAgICAgICAgICBqMCA9IGogKyBjaGFuZ2luZ1RlbXBsYXRlWFtrXTsKKyAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOworCisgICAgICAgICAgICBpZiAoYml0KSB7CisgICAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107CisgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRleHRMYWJlbCA9IDA7CisgICAgICAgICAgc2hpZnQgPSB0ZW1wbGF0ZUxlbmd0aCAtIDE7CisKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKywgc2hpZnQtLSkgeworICAgICAgICAgICAgajAgPSBqICsgdGVtcGxhdGVYW2tdOworCisgICAgICAgICAgICBpZiAoajAgPj0gMCAmJiBqMCA8IHdpZHRoKSB7CisgICAgICAgICAgICAgIGkwID0gaSArIHRlbXBsYXRlWVtrXTsKKworICAgICAgICAgICAgICBpZiAoaTAgPj0gMCkgeworICAgICAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOworCisgICAgICAgICAgICAgICAgaWYgKGJpdCkgeworICAgICAgICAgICAgICAgICAgY29udGV4dExhYmVsIHw9IGJpdCA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CisgICAgICAgIHJvd1tqXSA9IHBpeGVsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVSZWZpbmVtZW50KHdpZHRoLCBoZWlnaHQsIHRlbXBsYXRlSW5kZXgsIHJlZmVyZW5jZUJpdG1hcCwgb2Zmc2V0WCwgb2Zmc2V0WSwgcHJlZGljdGlvbiwgYXQsIGRlY29kaW5nQ29udGV4dCkgeworICAgIHZhciBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nOworCisgICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDApIHsKKyAgICAgIGNvZGluZ1RlbXBsYXRlID0gY29kaW5nVGVtcGxhdGUuY29uY2F0KFthdFswXV0pOworICAgIH0KKworICAgIHZhciBjb2RpbmdUZW1wbGF0ZUxlbmd0aCA9IGNvZGluZ1RlbXBsYXRlLmxlbmd0aDsKKyAgICB2YXIgY29kaW5nVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOworICAgIHZhciBjb2RpbmdUZW1wbGF0ZVkgPSBuZXcgSW50MzJBcnJheShjb2RpbmdUZW1wbGF0ZUxlbmd0aCk7CisgICAgdmFyIGs7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDsKKyAgICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7CisgICAgfQorCisgICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlID0gUmVmaW5lbWVudFRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5yZWZlcmVuY2U7CisKKyAgICBpZiAodGVtcGxhdGVJbmRleCA9PT0gMCkgeworICAgICAgcmVmZXJlbmNlVGVtcGxhdGUgPSByZWZlcmVuY2VUZW1wbGF0ZS5jb25jYXQoW2F0WzFdXSk7CisgICAgfQorCisgICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoID0gcmVmZXJlbmNlVGVtcGxhdGUubGVuZ3RoOworICAgIHZhciByZWZlcmVuY2VUZW1wbGF0ZVggPSBuZXcgSW50MzJBcnJheShyZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCk7CisgICAgdmFyIHJlZmVyZW5jZVRlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTsKKworICAgIGZvciAoayA9IDA7IGsgPCByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aDsgaysrKSB7CisgICAgICByZWZlcmVuY2VUZW1wbGF0ZVhba10gPSByZWZlcmVuY2VUZW1wbGF0ZVtrXS54OworICAgICAgcmVmZXJlbmNlVGVtcGxhdGVZW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueTsKKyAgICB9CisKKyAgICB2YXIgcmVmZXJlbmNlV2lkdGggPSByZWZlcmVuY2VCaXRtYXBbMF0ubGVuZ3RoOworICAgIHZhciByZWZlcmVuY2VIZWlnaHQgPSByZWZlcmVuY2VCaXRtYXAubGVuZ3RoOworICAgIHZhciBwc2V1ZG9QaXhlbENvbnRleHQgPSBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CisgICAgdmFyIGJpdG1hcCA9IFtdOworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR1IiKTsKKyAgICB2YXIgbHRwID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIGlmIChwcmVkaWN0aW9uKSB7CisgICAgICAgIHZhciBzbHRwID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwc2V1ZG9QaXhlbENvbnRleHQpOworICAgICAgICBsdHAgXj0gc2x0cDsKKworICAgICAgICBpZiAobHRwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgICBiaXRtYXAucHVzaChyb3cpOworCisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgdmFyIGkwLCBqMDsKKyAgICAgICAgdmFyIGNvbnRleHRMYWJlbCA9IDA7CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGNvZGluZ1RlbXBsYXRlTGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICBpMCA9IGkgKyBjb2RpbmdUZW1wbGF0ZVlba107CisgICAgICAgICAgajAgPSBqICsgY29kaW5nVGVtcGxhdGVYW2tdOworCisgICAgICAgICAgaWYgKGkwIDwgMCB8fCBqMCA8IDAgfHwgajAgPj0gd2lkdGgpIHsKKyAgICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCBiaXRtYXBbaTBdW2owXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgeworICAgICAgICAgIGkwID0gaSArIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSAtIG9mZnNldFk7CisgICAgICAgICAgajAgPSBqICsgcmVmZXJlbmNlVGVtcGxhdGVYW2tdIC0gb2Zmc2V0WDsKKworICAgICAgICAgIGlmIChpMCA8IDAgfHwgaTAgPj0gcmVmZXJlbmNlSGVpZ2h0IHx8IGowIDwgMCB8fCBqMCA+PSByZWZlcmVuY2VXaWR0aCkgeworICAgICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0TGFiZWwgPSBjb250ZXh0TGFiZWwgPDwgMSB8IHJlZmVyZW5jZUJpdG1hcFtpMF1bajBdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciBwaXhlbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTsKKyAgICAgICAgcm93W2pdID0gcGl4ZWw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVN5bWJvbERpY3Rpb25hcnkoaHVmZm1hbiwgcmVmaW5lbWVudCwgc3ltYm9scywgbnVtYmVyT2ZOZXdTeW1ib2xzLCBudW1iZXJPZkV4cG9ydGVkU3ltYm9scywgaHVmZm1hblRhYmxlcywgdGVtcGxhdGVJbmRleCwgYXQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgaHVmZm1hbklucHV0KSB7CisgICAgaWYgKGh1ZmZtYW4gJiYgcmVmaW5lbWVudCkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInN5bWJvbCByZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgdmFyIG5ld1N5bWJvbHMgPSBbXTsKKyAgICB2YXIgY3VycmVudEhlaWdodCA9IDA7CisgICAgdmFyIHN5bWJvbENvZGVMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoc3ltYm9scy5sZW5ndGggKyBudW1iZXJPZk5ld1N5bWJvbHMpOworICAgIHZhciBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CisgICAgdmFyIGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7CisgICAgbGV0IHRhYmxlQjEsIHN5bWJvbFdpZHRoczsKKworICAgIGlmIChodWZmbWFuKSB7CisgICAgICB0YWJsZUIxID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKKyAgICAgIHN5bWJvbFdpZHRocyA9IFtdOworICAgICAgc3ltYm9sQ29kZUxlbmd0aCA9IE1hdGgubWF4KHN5bWJvbENvZGVMZW5ndGgsIDEpOworICAgIH0KKworICAgIHdoaWxlIChuZXdTeW1ib2xzLmxlbmd0aCA8IG51bWJlck9mTmV3U3ltYm9scykgeworICAgICAgdmFyIGRlbHRhSGVpZ2h0ID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YUhlaWdodC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFESCIsIGRlY29kZXIpOworICAgICAgY3VycmVudEhlaWdodCArPSBkZWx0YUhlaWdodDsKKyAgICAgIGxldCBjdXJyZW50V2lkdGggPSAwLAorICAgICAgICAgIHRvdGFsV2lkdGggPSAwOworICAgICAgY29uc3QgZmlyc3RTeW1ib2wgPSBodWZmbWFuID8gc3ltYm9sV2lkdGhzLmxlbmd0aCA6IDA7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciBkZWx0YVdpZHRoID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVdpZHRoLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURXIiwgZGVjb2Rlcik7CisKKyAgICAgICAgaWYgKGRlbHRhV2lkdGggPT09IG51bGwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRXaWR0aCArPSBkZWx0YVdpZHRoOworICAgICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRXaWR0aDsKKyAgICAgICAgdmFyIGJpdG1hcDsKKworICAgICAgICBpZiAocmVmaW5lbWVudCkgeworICAgICAgICAgIHZhciBudW1iZXJPZkluc3RhbmNlcyA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFBSSIsIGRlY29kZXIpOworCisgICAgICAgICAgaWYgKG51bWJlck9mSW5zdGFuY2VzID4gMSkgeworICAgICAgICAgICAgYml0bWFwID0gZGVjb2RlVGV4dFJlZ2lvbihodWZmbWFuLCByZWZpbmVtZW50LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIDAsIG51bWJlck9mSW5zdGFuY2VzLCAxLCBzeW1ib2xzLmNvbmNhdChuZXdTeW1ib2xzKSwgc3ltYm9sQ29kZUxlbmd0aCwgMCwgMCwgMSwgMCwgaHVmZm1hblRhYmxlcywgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCAwLCBodWZmbWFuSW5wdXQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgc3ltYm9sSWQgPSBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2Rlciwgc3ltYm9sQ29kZUxlbmd0aCk7CisgICAgICAgICAgICB2YXIgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOworICAgICAgICAgICAgdmFyIHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFkiLCBkZWNvZGVyKTsKKyAgICAgICAgICAgIHZhciBzeW1ib2wgPSBzeW1ib2xJZCA8IHN5bWJvbHMubGVuZ3RoID8gc3ltYm9sc1tzeW1ib2xJZF0gOiBuZXdTeW1ib2xzW3N5bWJvbElkIC0gc3ltYm9scy5sZW5ndGhdOworICAgICAgICAgICAgYml0bWFwID0gZGVjb2RlUmVmaW5lbWVudChjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCBzeW1ib2wsIHJkeCwgcmR5LCBmYWxzZSwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgICAgIH0KKworICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChiaXRtYXApOworICAgICAgICB9IGVsc2UgaWYgKGh1ZmZtYW4pIHsKKyAgICAgICAgICBzeW1ib2xXaWR0aHMucHVzaChjdXJyZW50V2lkdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChmYWxzZSwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCB0ZW1wbGF0ZUluZGV4LCBmYWxzZSwgbnVsbCwgYXQsIGRlY29kaW5nQ29udGV4dCk7CisgICAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGh1ZmZtYW4gJiYgIXJlZmluZW1lbnQpIHsKKyAgICAgICAgY29uc3QgYml0bWFwU2l6ZSA9IGh1ZmZtYW5UYWJsZXMudGFibGVCaXRtYXBTaXplLmRlY29kZShodWZmbWFuSW5wdXQpOworICAgICAgICBodWZmbWFuSW5wdXQuYnl0ZUFsaWduKCk7CisgICAgICAgIGxldCBjb2xsZWN0aXZlQml0bWFwOworCisgICAgICAgIGlmIChiaXRtYXBTaXplID09PSAwKSB7CisgICAgICAgICAgY29sbGVjdGl2ZUJpdG1hcCA9IHJlYWRVbmNvbXByZXNzZWRCaXRtYXAoaHVmZm1hbklucHV0LCB0b3RhbFdpZHRoLCBjdXJyZW50SGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IGh1ZmZtYW5JbnB1dC5lbmQ7CisgICAgICAgICAgY29uc3QgYml0bWFwRW5kID0gaHVmZm1hbklucHV0LnBvc2l0aW9uICsgYml0bWFwU2l6ZTsKKyAgICAgICAgICBodWZmbWFuSW5wdXQuZW5kID0gYml0bWFwRW5kOworICAgICAgICAgIGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAoaHVmZm1hbklucHV0LCB0b3RhbFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBmYWxzZSk7CisgICAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IG9yaWdpbmFsRW5kOworICAgICAgICAgIGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiA9IGJpdG1hcEVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG51bWJlck9mU3ltYm9sc0RlY29kZWQgPSBzeW1ib2xXaWR0aHMubGVuZ3RoOworCisgICAgICAgIGlmIChmaXJzdFN5bWJvbCA9PT0gbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCAtIDEpIHsKKyAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goY29sbGVjdGl2ZUJpdG1hcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbGV0IGksCisgICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgIHhNaW4gPSAwLAorICAgICAgICAgICAgICB4TWF4LAorICAgICAgICAgICAgICBiaXRtYXBXaWR0aCwKKyAgICAgICAgICAgICAgc3ltYm9sQml0bWFwOworCisgICAgICAgICAgZm9yIChpID0gZmlyc3RTeW1ib2w7IGkgPCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkOyBpKyspIHsKKyAgICAgICAgICAgIGJpdG1hcFdpZHRoID0gc3ltYm9sV2lkdGhzW2ldOworICAgICAgICAgICAgeE1heCA9IHhNaW4gKyBiaXRtYXBXaWR0aDsKKyAgICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IFtdOworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgY3VycmVudEhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgIHN5bWJvbEJpdG1hcC5wdXNoKGNvbGxlY3RpdmVCaXRtYXBbeV0uc3ViYXJyYXkoeE1pbiwgeE1heCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goc3ltYm9sQml0bWFwKTsKKyAgICAgICAgICAgIHhNaW4gPSB4TWF4OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZhciBleHBvcnRlZFN5bWJvbHMgPSBbXTsKKyAgICB2YXIgZmxhZ3MgPSBbXSwKKyAgICAgICAgY3VycmVudEZsYWcgPSBmYWxzZTsKKyAgICB2YXIgdG90YWxTeW1ib2xzTGVuZ3RoID0gc3ltYm9scy5sZW5ndGggKyBudW1iZXJPZk5ld1N5bWJvbHM7CisKKyAgICB3aGlsZSAoZmxhZ3MubGVuZ3RoIDwgdG90YWxTeW1ib2xzTGVuZ3RoKSB7CisgICAgICB2YXIgcnVuTGVuZ3RoID0gaHVmZm1hbiA/IHRhYmxlQjEuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRVgiLCBkZWNvZGVyKTsKKworICAgICAgd2hpbGUgKHJ1bkxlbmd0aC0tKSB7CisgICAgICAgIGZsYWdzLnB1c2goY3VycmVudEZsYWcpOworICAgICAgfQorCisgICAgICBjdXJyZW50RmxhZyA9ICFjdXJyZW50RmxhZzsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzeW1ib2xzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGlmIChmbGFnc1tpXSkgeworICAgICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChzeW1ib2xzW2ldKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bWJlck9mTmV3U3ltYm9sczsgaSsrLCBqKyspIHsKKyAgICAgIGlmIChmbGFnc1tpXSkgeworICAgICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChuZXdTeW1ib2xzW2pdKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXhwb3J0ZWRTeW1ib2xzOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlVGV4dFJlZ2lvbihodWZmbWFuLCByZWZpbmVtZW50LCB3aWR0aCwgaGVpZ2h0LCBkZWZhdWx0UGl4ZWxWYWx1ZSwgbnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsIHN0cmlwU2l6ZSwgaW5wdXRTeW1ib2xzLCBzeW1ib2xDb2RlTGVuZ3RoLCB0cmFuc3Bvc2VkLCBkc09mZnNldCwgcmVmZXJlbmNlQ29ybmVyLCBjb21iaW5hdGlvbk9wZXJhdG9yLCBodWZmbWFuVGFibGVzLCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGxvZ1N0cmlwU2l6ZSwgaHVmZm1hbklucHV0KSB7CisgICAgaWYgKGh1ZmZtYW4gJiYgcmVmaW5lbWVudCkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICB2YXIgYml0bWFwID0gW107CisgICAgdmFyIGksIHJvdzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworCisgICAgICBpZiAoZGVmYXVsdFBpeGVsVmFsdWUpIHsKKyAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgcm93W2pdID0gZGVmYXVsdFBpeGVsVmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYml0bWFwLnB1c2gocm93KTsKKyAgICB9CisKKyAgICB2YXIgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOworICAgIHZhciBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOworICAgIHZhciBzdHJpcFQgPSBodWZmbWFuID8gLWh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiAtZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURUIiwgZGVjb2Rlcik7CisgICAgdmFyIGZpcnN0UyA9IDA7CisgICAgaSA9IDA7CisKKyAgICB3aGlsZSAoaSA8IG51bWJlck9mU3ltYm9sSW5zdGFuY2VzKSB7CisgICAgICB2YXIgZGVsdGFUID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFQiLCBkZWNvZGVyKTsKKyAgICAgIHN0cmlwVCArPSBkZWx0YVQ7CisgICAgICB2YXIgZGVsdGFGaXJzdFMgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZUZpcnN0Uy5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFGUyIsIGRlY29kZXIpOworICAgICAgZmlyc3RTICs9IGRlbHRhRmlyc3RTOworICAgICAgdmFyIGN1cnJlbnRTID0gZmlyc3RTOworCisgICAgICBkbyB7CisgICAgICAgIGxldCBjdXJyZW50VCA9IDA7CisKKyAgICAgICAgaWYgKHN0cmlwU2l6ZSA+IDEpIHsKKyAgICAgICAgICBjdXJyZW50VCA9IGh1ZmZtYW4gPyBodWZmbWFuSW5wdXQucmVhZEJpdHMobG9nU3RyaXBTaXplKSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFJVCIsIGRlY29kZXIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHQgPSBzdHJpcFNpemUgKiBzdHJpcFQgKyBjdXJyZW50VDsKKyAgICAgICAgdmFyIHN5bWJvbElkID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMuc3ltYm9sSURUYWJsZS5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTsKKyAgICAgICAgdmFyIGFwcGx5UmVmaW5lbWVudCA9IHJlZmluZW1lbnQgJiYgKGh1ZmZtYW4gPyBodWZmbWFuSW5wdXQucmVhZEJpdCgpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJJIiwgZGVjb2RlcikpOworICAgICAgICB2YXIgc3ltYm9sQml0bWFwID0gaW5wdXRTeW1ib2xzW3N5bWJvbElkXTsKKyAgICAgICAgdmFyIHN5bWJvbFdpZHRoID0gc3ltYm9sQml0bWFwWzBdLmxlbmd0aDsKKyAgICAgICAgdmFyIHN5bWJvbEhlaWdodCA9IHN5bWJvbEJpdG1hcC5sZW5ndGg7CisKKyAgICAgICAgaWYgKGFwcGx5UmVmaW5lbWVudCkgeworICAgICAgICAgIHZhciByZHcgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRXIiwgZGVjb2Rlcik7CisgICAgICAgICAgdmFyIHJkaCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSREgiLCBkZWNvZGVyKTsKKyAgICAgICAgICB2YXIgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOworICAgICAgICAgIHZhciByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRZIiwgZGVjb2Rlcik7CisgICAgICAgICAgc3ltYm9sV2lkdGggKz0gcmR3OworICAgICAgICAgIHN5bWJvbEhlaWdodCArPSByZGg7CisgICAgICAgICAgc3ltYm9sQml0bWFwID0gZGVjb2RlUmVmaW5lbWVudChzeW1ib2xXaWR0aCwgc3ltYm9sSGVpZ2h0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgc3ltYm9sQml0bWFwLCAocmR3ID4+IDEpICsgcmR4LCAocmRoID4+IDEpICsgcmR5LCBmYWxzZSwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG9mZnNldFQgPSB0IC0gKHJlZmVyZW5jZUNvcm5lciAmIDEgPyAwIDogc3ltYm9sSGVpZ2h0IC0gMSk7CisgICAgICAgIHZhciBvZmZzZXRTID0gY3VycmVudFMgLSAocmVmZXJlbmNlQ29ybmVyICYgMiA/IHN5bWJvbFdpZHRoIC0gMSA6IDApOworICAgICAgICB2YXIgczIsIHQyLCBzeW1ib2xSb3c7CisKKyAgICAgICAgaWYgKHRyYW5zcG9zZWQpIHsKKyAgICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xIZWlnaHQ7IHMyKyspIHsKKyAgICAgICAgICAgIHJvdyA9IGJpdG1hcFtvZmZzZXRTICsgczJdOworCisgICAgICAgICAgICBpZiAoIXJvdykgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3MyXTsKKyAgICAgICAgICAgIHZhciBtYXhXaWR0aCA9IE1hdGgubWluKHdpZHRoIC0gb2Zmc2V0VCwgc3ltYm9sV2lkdGgpOworCisgICAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7CisgICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSB8PSBzeW1ib2xSb3dbdDJdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykgeworICAgICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gXj0gc3ltYm9sUm93W3QyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xIZWlnaHQgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykgeworICAgICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07CisKKyAgICAgICAgICAgIGlmICghcm93KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW1ib2xSb3cgPSBzeW1ib2xCaXRtYXBbdDJdOworCisgICAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CisgICAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xXaWR0aDsgczIrKykgeworICAgICAgICAgICAgICAgICAgcm93W29mZnNldFMgKyBzMl0gXj0gc3ltYm9sUm93W3MyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xXaWR0aCAtIDE7CisgICAgICAgIH0KKworICAgICAgICBpKys7CisgICAgICAgIHZhciBkZWx0YVMgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhUy5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEUyIsIGRlY29kZXIpOworCisgICAgICAgIGlmIChkZWx0YVMgPT09IG51bGwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRTICs9IGRlbHRhUyArIGRzT2Zmc2V0OworICAgICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIGJpdG1hcDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KG1tciwgcGF0dGVybldpZHRoLCBwYXR0ZXJuSGVpZ2h0LCBtYXhQYXR0ZXJuSW5kZXgsIHRlbXBsYXRlLCBkZWNvZGluZ0NvbnRleHQpIHsKKyAgICBjb25zdCBhdCA9IFtdOworCisgICAgaWYgKCFtbXIpIHsKKyAgICAgIGF0LnB1c2goeworICAgICAgICB4OiAtcGF0dGVybldpZHRoLAorICAgICAgICB5OiAwCisgICAgICB9KTsKKworICAgICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IC0zLAorICAgICAgICAgIHk6IC0xCisgICAgICAgIH0pOworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAyLAorICAgICAgICAgIHk6IC0yCisgICAgICAgIH0pOworICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICB4OiAtMiwKKyAgICAgICAgICB5OiAtMgorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBjb2xsZWN0aXZlV2lkdGggPSAobWF4UGF0dGVybkluZGV4ICsgMSkgKiBwYXR0ZXJuV2lkdGg7CisgICAgY29uc3QgY29sbGVjdGl2ZUJpdG1hcCA9IGRlY29kZUJpdG1hcChtbXIsIGNvbGxlY3RpdmVXaWR0aCwgcGF0dGVybkhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBudWxsLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICBjb25zdCBwYXR0ZXJucyA9IFtdOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4UGF0dGVybkluZGV4OyBpKyspIHsKKyAgICAgIGNvbnN0IHBhdHRlcm5CaXRtYXAgPSBbXTsKKyAgICAgIGNvbnN0IHhNaW4gPSBwYXR0ZXJuV2lkdGggKiBpOworICAgICAgY29uc3QgeE1heCA9IHhNaW4gKyBwYXR0ZXJuV2lkdGg7CisKKyAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcGF0dGVybkhlaWdodDsgeSsrKSB7CisgICAgICAgIHBhdHRlcm5CaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTsKKyAgICAgIH0KKworICAgICAgcGF0dGVybnMucHVzaChwYXR0ZXJuQml0bWFwKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGF0dGVybnM7CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVIYWxmdG9uZVJlZ2lvbihtbXIsIHBhdHRlcm5zLCB0ZW1wbGF0ZSwgcmVnaW9uV2lkdGgsIHJlZ2lvbkhlaWdodCwgZGVmYXVsdFBpeGVsVmFsdWUsIGVuYWJsZVNraXAsIGNvbWJpbmF0aW9uT3BlcmF0b3IsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgZ3JpZE9mZnNldFgsIGdyaWRPZmZzZXRZLCBncmlkVmVjdG9yWCwgZ3JpZFZlY3RvclksIGRlY29kaW5nQ29udGV4dCkgeworICAgIGNvbnN0IHNraXAgPSBudWxsOworCisgICAgaWYgKGVuYWJsZVNraXApIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJza2lwIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoY29tYmluYXRpb25PcGVyYXRvciAhPT0gMCkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm9wZXJhdG9yICIgKyBjb21iaW5hdGlvbk9wZXJhdG9yICsgIiBpcyBub3Qgc3VwcG9ydGVkIGluIGhhbGZ0b25lIHJlZ2lvbiIpOworICAgIH0KKworICAgIGNvbnN0IHJlZ2lvbkJpdG1hcCA9IFtdOworICAgIGxldCBpLCBqLCByb3c7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVnaW9uSGVpZ2h0OyBpKyspIHsKKyAgICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHJlZ2lvbldpZHRoKTsKKworICAgICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCByZWdpb25XaWR0aDsgaisrKSB7CisgICAgICAgICAgcm93W2pdID0gZGVmYXVsdFBpeGVsVmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVnaW9uQml0bWFwLnB1c2gocm93KTsKKyAgICB9CisKKyAgICBjb25zdCBudW1iZXJPZlBhdHRlcm5zID0gcGF0dGVybnMubGVuZ3RoOworICAgIGNvbnN0IHBhdHRlcm4wID0gcGF0dGVybnNbMF07CisgICAgY29uc3QgcGF0dGVybldpZHRoID0gcGF0dGVybjBbMF0ubGVuZ3RoLAorICAgICAgICAgIHBhdHRlcm5IZWlnaHQgPSBwYXR0ZXJuMC5sZW5ndGg7CisgICAgY29uc3QgYml0c1BlclZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKG51bWJlck9mUGF0dGVybnMpOworICAgIGNvbnN0IGF0ID0gW107CisKKyAgICBpZiAoIW1tcikgeworICAgICAgYXQucHVzaCh7CisgICAgICAgIHg6IHRlbXBsYXRlIDw9IDEgPyAzIDogMiwKKyAgICAgICAgeTogLTEKKyAgICAgIH0pOworCisgICAgICBpZiAodGVtcGxhdGUgPT09IDApIHsKKyAgICAgICAgYXQucHVzaCh7CisgICAgICAgICAgeDogLTMsCisgICAgICAgICAgeTogLTEKKyAgICAgICAgfSk7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IDIsCisgICAgICAgICAgeTogLTIKKyAgICAgICAgfSk7CisgICAgICAgIGF0LnB1c2goeworICAgICAgICAgIHg6IC0yLAorICAgICAgICAgIHk6IC0yCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGdyYXlTY2FsZUJpdFBsYW5lcyA9IFtdOworICAgIGxldCBtbXJJbnB1dCwgYml0bWFwOworCisgICAgaWYgKG1tcikgeworICAgICAgbW1ySW5wdXQgPSBuZXcgUmVhZGVyKGRlY29kaW5nQ29udGV4dC5kYXRhLCBkZWNvZGluZ0NvbnRleHQuc3RhcnQsIGRlY29kaW5nQ29udGV4dC5lbmQpOworICAgIH0KKworICAgIGZvciAoaSA9IGJpdHNQZXJWYWx1ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAobW1yKSB7CisgICAgICAgIGJpdG1hcCA9IGRlY29kZU1NUkJpdG1hcChtbXJJbnB1dCwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChmYWxzZSwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB0ZW1wbGF0ZSwgZmFsc2UsIHNraXAsIGF0LCBkZWNvZGluZ0NvbnRleHQpOworICAgICAgfQorCisgICAgICBncmF5U2NhbGVCaXRQbGFuZXNbaV0gPSBiaXRtYXA7CisgICAgfQorCisgICAgbGV0IG1nLCBuZywgYml0LCBwYXR0ZXJuSW5kZXgsIHBhdHRlcm5CaXRtYXAsIHgsIHksIHBhdHRlcm5Sb3csIHJlZ2lvblJvdzsKKworICAgIGZvciAobWcgPSAwOyBtZyA8IGdyaWRIZWlnaHQ7IG1nKyspIHsKKyAgICAgIGZvciAobmcgPSAwOyBuZyA8IGdyaWRXaWR0aDsgbmcrKykgeworICAgICAgICBiaXQgPSAwOworICAgICAgICBwYXR0ZXJuSW5kZXggPSAwOworCisgICAgICAgIGZvciAoaiA9IGJpdHNQZXJWYWx1ZSAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgYml0ID0gZ3JheVNjYWxlQml0UGxhbmVzW2pdW21nXVtuZ10gXiBiaXQ7CisgICAgICAgICAgcGF0dGVybkluZGV4IHw9IGJpdCA8PCBqOworICAgICAgICB9CisKKyAgICAgICAgcGF0dGVybkJpdG1hcCA9IHBhdHRlcm5zW3BhdHRlcm5JbmRleF07CisgICAgICAgIHggPSBncmlkT2Zmc2V0WCArIG1nICogZ3JpZFZlY3RvclkgKyBuZyAqIGdyaWRWZWN0b3JYID4+IDg7CisgICAgICAgIHkgPSBncmlkT2Zmc2V0WSArIG1nICogZ3JpZFZlY3RvclggLSBuZyAqIGdyaWRWZWN0b3JZID4+IDg7CisKKyAgICAgICAgaWYgKHggPj0gMCAmJiB4ICsgcGF0dGVybldpZHRoIDw9IHJlZ2lvbldpZHRoICYmIHkgPj0gMCAmJiB5ICsgcGF0dGVybkhlaWdodCA8PSByZWdpb25IZWlnaHQpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGF0dGVybkhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICByZWdpb25Sb3cgPSByZWdpb25CaXRtYXBbeSArIGldOworICAgICAgICAgICAgcGF0dGVyblJvdyA9IHBhdHRlcm5CaXRtYXBbaV07CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykgeworICAgICAgICAgICAgICByZWdpb25Sb3dbeCArIGpdIHw9IHBhdHRlcm5Sb3dbal07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxldCByZWdpb25YLCByZWdpb25ZOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdHRlcm5IZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgcmVnaW9uWSA9IHkgKyBpOworCisgICAgICAgICAgICBpZiAocmVnaW9uWSA8IDAgfHwgcmVnaW9uWSA+PSByZWdpb25IZWlnaHQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFtyZWdpb25ZXTsKKyAgICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0dGVybldpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgcmVnaW9uWCA9IHggKyBqOworCisgICAgICAgICAgICAgIGlmIChyZWdpb25YID49IDAgJiYgcmVnaW9uWCA8IHJlZ2lvbldpZHRoKSB7CisgICAgICAgICAgICAgICAgcmVnaW9uUm93W3JlZ2lvblhdIHw9IHBhdHRlcm5Sb3dbal07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVnaW9uQml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gcmVhZFNlZ21lbnRIZWFkZXIoZGF0YSwgc3RhcnQpIHsKKyAgICB2YXIgc2VnbWVudEhlYWRlciA9IHt9OworICAgIHNlZ21lbnRIZWFkZXIubnVtYmVyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0KTsKKyAgICB2YXIgZmxhZ3MgPSBkYXRhW3N0YXJ0ICsgNF07CisgICAgdmFyIHNlZ21lbnRUeXBlID0gZmxhZ3MgJiAweDNmOworCisgICAgaWYgKCFTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdKSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIgKyBzZWdtZW50VHlwZSk7CisgICAgfQorCisgICAgc2VnbWVudEhlYWRlci50eXBlID0gc2VnbWVudFR5cGU7CisgICAgc2VnbWVudEhlYWRlci50eXBlTmFtZSA9IFNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV07CisgICAgc2VnbWVudEhlYWRlci5kZWZlcnJlZE5vblJldGFpbiA9ICEhKGZsYWdzICYgMHg4MCk7CisgICAgdmFyIHBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSA9ICEhKGZsYWdzICYgMHg0MCk7CisgICAgdmFyIHJlZmVycmVkRmxhZ3MgPSBkYXRhW3N0YXJ0ICsgNV07CisgICAgdmFyIHJlZmVycmVkVG9Db3VudCA9IHJlZmVycmVkRmxhZ3MgPj4gNSAmIDc7CisgICAgdmFyIHJldGFpbkJpdHMgPSBbcmVmZXJyZWRGbGFncyAmIDMxXTsKKyAgICB2YXIgcG9zaXRpb24gPSBzdGFydCArIDY7CisKKyAgICBpZiAocmVmZXJyZWRGbGFncyA9PT0gNykgeworICAgICAgcmVmZXJyZWRUb0NvdW50ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uIC0gMSkgJiAweDFmZmZmZmZmOworICAgICAgcG9zaXRpb24gKz0gMzsKKyAgICAgIHZhciBieXRlcyA9IHJlZmVycmVkVG9Db3VudCArIDcgPj4gMzsKKyAgICAgIHJldGFpbkJpdHNbMF0gPSBkYXRhW3Bvc2l0aW9uKytdOworCisgICAgICB3aGlsZSAoLS1ieXRlcyA+IDApIHsKKyAgICAgICAgcmV0YWluQml0cy5wdXNoKGRhdGFbcG9zaXRpb24rK10pOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocmVmZXJyZWRGbGFncyA9PT0gNSB8fCByZWZlcnJlZEZsYWdzID09PSA2KSB7CisgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCByZWZlcnJlZC10byBmbGFncyIpOworICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIucmV0YWluQml0cyA9IHJldGFpbkJpdHM7CisgICAgbGV0IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDQ7CisKKyAgICBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gMjU2KSB7CisgICAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAxOworICAgIH0gZWxzZSBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gNjU1MzYpIHsKKyAgICAgIHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDI7CisgICAgfQorCisgICAgdmFyIHJlZmVycmVkVG8gPSBbXTsKKyAgICB2YXIgaSwgaWk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVmZXJyZWRUb0NvdW50OyBpKyspIHsKKyAgICAgIGxldCBudW1iZXI7CisKKyAgICAgIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDEpIHsKKyAgICAgICAgbnVtYmVyID0gZGF0YVtwb3NpdGlvbl07CisgICAgICB9IGVsc2UgaWYgKHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9PT0gMikgeworICAgICAgICBudW1iZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtYmVyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJyZWRUby5wdXNoKG51bWJlcik7CisgICAgICBwb3NpdGlvbiArPSByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemU7CisgICAgfQorCisgICAgc2VnbWVudEhlYWRlci5yZWZlcnJlZFRvID0gcmVmZXJyZWRUbzsKKworICAgIGlmICghcGFnZUFzc29jaWF0aW9uRmllbGRTaXplKSB7CisgICAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IGRhdGFbcG9zaXRpb24rK107CisgICAgfSBlbHNlIHsKKyAgICAgIHNlZ21lbnRIZWFkZXIucGFnZUFzc29jaWF0aW9uID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgfQorCisgICAgc2VnbWVudEhlYWRlci5sZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgIHBvc2l0aW9uICs9IDQ7CisKKyAgICBpZiAoc2VnbWVudEhlYWRlci5sZW5ndGggPT09IDB4ZmZmZmZmZmYpIHsKKyAgICAgIGlmIChzZWdtZW50VHlwZSA9PT0gMzgpIHsKKyAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25JbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoXTsKKyAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25NbXIgPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CisgICAgICAgIHZhciBzZWFyY2hQYXR0ZXJuTGVuZ3RoID0gNjsKKyAgICAgICAgdmFyIHNlYXJjaFBhdHRlcm4gPSBuZXcgVWludDhBcnJheShzZWFyY2hQYXR0ZXJuTGVuZ3RoKTsKKworICAgICAgICBpZiAoIWdlbmVyaWNSZWdpb25NbXIpIHsKKyAgICAgICAgICBzZWFyY2hQYXR0ZXJuWzBdID0gMHhmZjsKKyAgICAgICAgICBzZWFyY2hQYXR0ZXJuWzFdID0gMHhhYzsKKyAgICAgICAgfQorCisgICAgICAgIHNlYXJjaFBhdHRlcm5bMl0gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgPj4+IDI0ICYgMHhmZjsKKyAgICAgICAgc2VhcmNoUGF0dGVyblszXSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiAxNiAmIDB4ZmY7CisgICAgICAgIHNlYXJjaFBhdHRlcm5bNF0gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgPj4gOCAmIDB4ZmY7CisgICAgICAgIHNlYXJjaFBhdHRlcm5bNV0gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgJiAweGZmOworCisgICAgICAgIGZvciAoaSA9IHBvc2l0aW9uLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIHZhciBqID0gMDsKKworICAgICAgICAgIHdoaWxlIChqIDwgc2VhcmNoUGF0dGVybkxlbmd0aCAmJiBzZWFyY2hQYXR0ZXJuW2pdID09PSBkYXRhW2kgKyBqXSkgeworICAgICAgICAgICAgaisrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChqID09PSBzZWFyY2hQYXR0ZXJuTGVuZ3RoKSB7CisgICAgICAgICAgICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9IGkgKyBzZWFyY2hQYXR0ZXJuTGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNlZ21lbnQgZW5kIHdhcyBub3QgZm91bmQiKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aCIpOworICAgICAgfQorICAgIH0KKworICAgIHNlZ21lbnRIZWFkZXIuaGVhZGVyRW5kID0gcG9zaXRpb247CisgICAgcmV0dXJuIHNlZ21lbnRIZWFkZXI7CisgIH0KKworICBmdW5jdGlvbiByZWFkU2VnbWVudHMoaGVhZGVyLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgdmFyIHNlZ21lbnRzID0gW107CisgICAgdmFyIHBvc2l0aW9uID0gc3RhcnQ7CisKKyAgICB3aGlsZSAocG9zaXRpb24gPCBlbmQpIHsKKyAgICAgIHZhciBzZWdtZW50SGVhZGVyID0gcmVhZFNlZ21lbnRIZWFkZXIoZGF0YSwgcG9zaXRpb24pOworICAgICAgcG9zaXRpb24gPSBzZWdtZW50SGVhZGVyLmhlYWRlckVuZDsKKyAgICAgIHZhciBzZWdtZW50ID0geworICAgICAgICBoZWFkZXI6IHNlZ21lbnRIZWFkZXIsCisgICAgICAgIGRhdGEKKyAgICAgIH07CisKKyAgICAgIGlmICghaGVhZGVyLnJhbmRvbUFjY2VzcykgeworICAgICAgICBzZWdtZW50LnN0YXJ0ID0gcG9zaXRpb247CisgICAgICAgIHBvc2l0aW9uICs9IHNlZ21lbnRIZWFkZXIubGVuZ3RoOworICAgICAgICBzZWdtZW50LmVuZCA9IHBvc2l0aW9uOworICAgICAgfQorCisgICAgICBzZWdtZW50cy5wdXNoKHNlZ21lbnQpOworCisgICAgICBpZiAoc2VnbWVudEhlYWRlci50eXBlID09PSA1MSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGVhZGVyLnJhbmRvbUFjY2VzcykgeworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBzZWdtZW50c1tpXS5zdGFydCA9IHBvc2l0aW9uOworICAgICAgICBwb3NpdGlvbiArPSBzZWdtZW50c1tpXS5oZWFkZXIubGVuZ3RoOworICAgICAgICBzZWdtZW50c1tpXS5lbmQgPSBwb3NpdGlvbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2VnbWVudHM7CisgIH0KKworICBmdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHN0YXJ0KSB7CisgICAgcmV0dXJuIHsKKyAgICAgIHdpZHRoOiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQpLAorICAgICAgaGVpZ2h0OiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyA0KSwKKyAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDgpLAorICAgICAgeTogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgMTIpLAorICAgICAgY29tYmluYXRpb25PcGVyYXRvcjogZGF0YVtzdGFydCArIDE2XSAmIDcKKyAgICB9OworICB9CisKKyAgdmFyIFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoID0gMTc7CisKKyAgZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnQoc2VnbWVudCwgdmlzaXRvcikgeworICAgIHZhciBoZWFkZXIgPSBzZWdtZW50LmhlYWRlcjsKKyAgICB2YXIgZGF0YSA9IHNlZ21lbnQuZGF0YSwKKyAgICAgICAgcG9zaXRpb24gPSBzZWdtZW50LnN0YXJ0LAorICAgICAgICBlbmQgPSBzZWdtZW50LmVuZDsKKyAgICB2YXIgYXJncywgYXQsIGksIGF0TGVuZ3RoOworCisgICAgc3dpdGNoIChoZWFkZXIudHlwZSkgeworICAgICAgY2FzZSAwOgorICAgICAgICB2YXIgZGljdGlvbmFyeSA9IHt9OworICAgICAgICB2YXIgZGljdGlvbmFyeUZsYWdzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgZGljdGlvbmFyeS5odWZmbWFuID0gISEoZGljdGlvbmFyeUZsYWdzICYgMSk7CisgICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDIpOworICAgICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yID0gZGljdGlvbmFyeUZsYWdzID4+IDIgJiAzOworICAgICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yID0gZGljdGlvbmFyeUZsYWdzID4+IDQgJiAzOworICAgICAgICBkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA2ICYgMTsKKyAgICAgICAgZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yID0gZGljdGlvbmFyeUZsYWdzID4+IDcgJiAxOworICAgICAgICBkaWN0aW9uYXJ5LmJpdG1hcENvZGluZ0NvbnRleHRVc2VkID0gISEoZGljdGlvbmFyeUZsYWdzICYgMjU2KTsKKyAgICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0UmV0YWluZWQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiA1MTIpOworICAgICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlID0gZGljdGlvbmFyeUZsYWdzID4+IDEwICYgMzsKKyAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50VGVtcGxhdGUgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gMTIgJiAxOworICAgICAgICBwb3NpdGlvbiArPSAyOworCisgICAgICAgIGlmICghZGljdGlvbmFyeS5odWZmbWFuKSB7CisgICAgICAgICAgYXRMZW5ndGggPSBkaWN0aW9uYXJ5LnRlbXBsYXRlID09PSAwID8gNCA6IDE7CisgICAgICAgICAgYXQgPSBbXTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICAgIGRpY3Rpb25hcnkuYXQgPSBhdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaWN0aW9uYXJ5LnJlZmluZW1lbnQgJiYgIWRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlKSB7CisgICAgICAgICAgYXQgPSBbXTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGF0LnB1c2goeworICAgICAgICAgICAgICB4OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uKSwKKyAgICAgICAgICAgICAgeTogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiArIDEpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50QXQgPSBhdDsKKyAgICAgICAgfQorCisgICAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mTmV3U3ltYm9scyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGFyZ3MgPSBbZGljdGlvbmFyeSwgaGVhZGVyLm51bWJlciwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA2OgorICAgICAgY2FzZSA3OgorICAgICAgICB2YXIgdGV4dFJlZ2lvbiA9IHt9OworICAgICAgICB0ZXh0UmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CisgICAgICAgIHZhciB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDEpOworICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMik7CisgICAgICAgIHRleHRSZWdpb24ubG9nU3RyaXBTaXplID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiAyICYgMzsKKyAgICAgICAgdGV4dFJlZ2lvbi5zdHJpcFNpemUgPSAxIDw8IHRleHRSZWdpb24ubG9nU3RyaXBTaXplOworICAgICAgICB0ZXh0UmVnaW9uLnJlZmVyZW5jZUNvcm5lciA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gNCAmIDM7CisgICAgICAgIHRleHRSZWdpb24udHJhbnNwb3NlZCA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiA2NCk7CisgICAgICAgIHRleHRSZWdpb24uY29tYmluYXRpb25PcGVyYXRvciA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gNyAmIDM7CisgICAgICAgIHRleHRSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDkgJiAxOworICAgICAgICB0ZXh0UmVnaW9uLmRzT2Zmc2V0ID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA8PCAxNyA+PiAyNzsKKyAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDE1ICYgMTsKKworICAgICAgICBpZiAodGV4dFJlZ2lvbi5odWZmbWFuKSB7CisgICAgICAgICAgdmFyIHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRlMgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5EUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMiAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFQgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDQgJiAzOworICAgICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREVyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNiAmIDM7CisgICAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERIID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA4ICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFggPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEwICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFkgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEyICYgMzsKKyAgICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50U2l6ZVNlbGVjdG9yID0gISEodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDB4NDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50ICYmICF0ZXh0UmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSkgeworICAgICAgICAgIGF0ID0gW107CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudEF0ID0gYXQ7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0UmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICAgICAgYXJncyA9IFt0ZXh0UmVnaW9uLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDE2OgorICAgICAgICBjb25zdCBwYXR0ZXJuRGljdGlvbmFyeSA9IHt9OworICAgICAgICBjb25zdCBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgcGF0dGVybkRpY3Rpb25hcnkubW1yID0gISEocGF0dGVybkRpY3Rpb25hcnlGbGFncyAmIDEpOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS50ZW1wbGF0ZSA9IHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgPj4gMSAmIDM7CisgICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5LnBhdHRlcm5XaWR0aCA9IGRhdGFbcG9zaXRpb24rK107CisgICAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5LnBhdHRlcm5IZWlnaHQgPSBkYXRhW3Bvc2l0aW9uKytdOworICAgICAgICBwYXR0ZXJuRGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBhcmdzID0gW3BhdHRlcm5EaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjI6CisgICAgICBjYXNlIDIzOgorICAgICAgICBjb25zdCBoYWxmdG9uZVJlZ2lvbiA9IHt9OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoOworICAgICAgICBjb25zdCBoYWxmdG9uZVJlZ2lvbkZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICAgICAgaGFsZnRvbmVSZWdpb24ubW1yID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDEpOworICAgICAgICBoYWxmdG9uZVJlZ2lvbi50ZW1wbGF0ZSA9IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gMSAmIDM7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmVuYWJsZVNraXAgPSAhIShoYWxmdG9uZVJlZ2lvbkZsYWdzICYgOCk7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDQgJiA3OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gNyAmIDE7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRXaWR0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDQ7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRIZWlnaHQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgJiAweGZmZmZmZmZmOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgJiAweGZmZmZmZmZmOworICAgICAgICBwb3NpdGlvbiArPSA0OworICAgICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkVmVjdG9yWCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IDI7CisgICAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JZID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgcG9zaXRpb24gKz0gMjsKKyAgICAgICAgYXJncyA9IFtoYWxmdG9uZVJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzODoKKyAgICAgIGNhc2UgMzk6CisgICAgICAgIHZhciBnZW5lcmljUmVnaW9uID0ge307CisgICAgICAgIGdlbmVyaWNSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKKyAgICAgICAgdmFyIGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOworICAgICAgICBnZW5lcmljUmVnaW9uLm1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKKyAgICAgICAgZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPj4gMSAmIDM7CisgICAgICAgIGdlbmVyaWNSZWdpb24ucHJlZGljdGlvbiA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiA4KTsKKworICAgICAgICBpZiAoIWdlbmVyaWNSZWdpb24ubW1yKSB7CisgICAgICAgICAgYXRMZW5ndGggPSBnZW5lcmljUmVnaW9uLnRlbXBsYXRlID09PSAwID8gNCA6IDE7CisgICAgICAgICAgYXQgPSBbXTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhdC5wdXNoKHsKKyAgICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICAgIGdlbmVyaWNSZWdpb24uYXQgPSBhdDsKKyAgICAgICAgfQorCisgICAgICAgIGFyZ3MgPSBbZ2VuZXJpY1JlZ2lvbiwgZGF0YSwgcG9zaXRpb24sIGVuZF07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQ4OgorICAgICAgICB2YXIgcGFnZUluZm8gPSB7CisgICAgICAgICAgd2lkdGg6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiksCisgICAgICAgICAgaGVpZ2h0OiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KSwKKyAgICAgICAgICByZXNvbHV0aW9uWDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgOCksCisgICAgICAgICAgcmVzb2x1dGlvblk6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDEyKQorICAgICAgICB9OworCisgICAgICAgIGlmIChwYWdlSW5mby5oZWlnaHQgPT09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICBkZWxldGUgcGFnZUluZm8uaGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgdmFyIHBhZ2VTZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uICsgMTZdOworICAgICAgICAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24gKyAxNyk7CisgICAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpOworICAgICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpOworICAgICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHBhZ2VTZWdtZW50RmxhZ3MgPj4gMiAmIDE7CisgICAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlU2VnbWVudEZsYWdzID4+IDMgJiAzOworICAgICAgICBwYWdlSW5mby5yZXF1aXJlc0J1ZmZlciA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAzMik7CisgICAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiA2NCk7CisgICAgICAgIGFyZ3MgPSBbcGFnZUluZm9dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0OToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNTA6CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDUxOgorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA1MzoKKyAgICAgICAgYXJncyA9IFtoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNjI6CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc2VnbWVudCB0eXBlICR7aGVhZGVyLnR5cGVOYW1lfSgke2hlYWRlci50eXBlfSlgICsgIiBpcyBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICB2YXIgY2FsbGJhY2tOYW1lID0gIm9uIiArIGhlYWRlci50eXBlTmFtZTsKKworICAgIGlmIChjYWxsYmFja05hbWUgaW4gdmlzaXRvcikgeworICAgICAgdmlzaXRvcltjYWxsYmFja05hbWVdLmFwcGx5KHZpc2l0b3IsIGFyZ3MpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcikgeworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHByb2Nlc3NTZWdtZW50KHNlZ21lbnRzW2ldLCB2aXNpdG9yKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcykgeworICAgIHZhciB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIGNodW5rID0gY2h1bmtzW2ldOworICAgICAgdmFyIHNlZ21lbnRzID0gcmVhZFNlZ21lbnRzKHt9LCBjaHVuay5kYXRhLCBjaHVuay5zdGFydCwgY2h1bmsuZW5kKTsKKyAgICAgIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcik7CisgICAgfQorCisgICAgcmV0dXJuIHZpc2l0b3IuYnVmZmVyOworICB9CisKKyAgZnVuY3Rpb24gcGFyc2VKYmlnMihkYXRhKSB7CisgICAgY29uc3QgZW5kID0gZGF0YS5sZW5ndGg7CisgICAgbGV0IHBvc2l0aW9uID0gMDsKKworICAgIGlmIChkYXRhW3Bvc2l0aW9uXSAhPT0gMHg5NyB8fCBkYXRhW3Bvc2l0aW9uICsgMV0gIT09IDB4NGEgfHwgZGF0YVtwb3NpdGlvbiArIDJdICE9PSAweDQyIHx8IGRhdGFbcG9zaXRpb24gKyAzXSAhPT0gMHgzMiB8fCBkYXRhW3Bvc2l0aW9uICsgNF0gIT09IDB4MGQgfHwgZGF0YVtwb3NpdGlvbiArIDVdICE9PSAweDBhIHx8IGRhdGFbcG9zaXRpb24gKyA2XSAhPT0gMHgxYSB8fCBkYXRhW3Bvc2l0aW9uICsgN10gIT09IDB4MGEpIHsKKyAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJwYXJzZUpiaWcyIC0gaW52YWxpZCBoZWFkZXIuIik7CisgICAgfQorCisgICAgY29uc3QgaGVhZGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICBwb3NpdGlvbiArPSA4OworICAgIGNvbnN0IGZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKKyAgICBoZWFkZXIucmFuZG9tQWNjZXNzID0gIShmbGFncyAmIDEpOworCisgICAgaWYgKCEoZmxhZ3MgJiAyKSkgeworICAgICAgaGVhZGVyLm51bWJlck9mUGFnZXMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOworICAgICAgcG9zaXRpb24gKz0gNDsKKyAgICB9CisKKyAgICBjb25zdCBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmQpOworICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgU2ltcGxlU2VnbWVudFZpc2l0b3IoKTsKKyAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpOworICAgIGNvbnN0IHsKKyAgICAgIHdpZHRoLAorICAgICAgaGVpZ2h0CisgICAgfSA9IHZpc2l0b3IuY3VycmVudFBhZ2VJbmZvOworICAgIGNvbnN0IGJpdFBhY2tlZCA9IHZpc2l0b3IuYnVmZmVyOworICAgIGNvbnN0IGltZ0RhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQpOworICAgIGxldCBxID0gMCwKKyAgICAgICAgayA9IDA7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBsZXQgbWFzayA9IDAsCisgICAgICAgICAgYnVmZmVyOworCisgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgaWYgKCFtYXNrKSB7CisgICAgICAgICAgbWFzayA9IDEyODsKKyAgICAgICAgICBidWZmZXIgPSBiaXRQYWNrZWRbaysrXTsKKyAgICAgICAgfQorCisgICAgICAgIGltZ0RhdGFbcSsrXSA9IGJ1ZmZlciAmIG1hc2sgPyAwIDogMjU1OworICAgICAgICBtYXNrID4+PSAxOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBpbWdEYXRhLAorICAgICAgd2lkdGgsCisgICAgICBoZWlnaHQKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3IoKSB7fQorCisgIFNpbXBsZVNlZ21lbnRWaXNpdG9yLnByb3RvdHlwZSA9IHsKKyAgICBvblBhZ2VJbmZvcm1hdGlvbjogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25QYWdlSW5mb3JtYXRpb24oaW5mbykgeworICAgICAgdGhpcy5jdXJyZW50UGFnZUluZm8gPSBpbmZvOworICAgICAgdmFyIHJvd1NpemUgPSBpbmZvLndpZHRoICsgNyA+PiAzOworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OENsYW1wZWRBcnJheShyb3dTaXplICogaW5mby5oZWlnaHQpOworCisgICAgICBpZiAoaW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSkgeworICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBidWZmZXIubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGJ1ZmZlcltpXSA9IDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CisgICAgfSwKKyAgICBkcmF3Qml0bWFwOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCkgeworICAgICAgdmFyIHBhZ2VJbmZvID0gdGhpcy5jdXJyZW50UGFnZUluZm87CisgICAgICB2YXIgd2lkdGggPSByZWdpb25JbmZvLndpZHRoLAorICAgICAgICAgIGhlaWdodCA9IHJlZ2lvbkluZm8uaGVpZ2h0OworICAgICAgdmFyIHJvd1NpemUgPSBwYWdlSW5mby53aWR0aCArIDcgPj4gMzsKKyAgICAgIHZhciBjb21iaW5hdGlvbk9wZXJhdG9yID0gcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlID8gcmVnaW9uSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yIDogcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvcjsKKyAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKKyAgICAgIHZhciBtYXNrMCA9IDEyOCA+PiAocmVnaW9uSW5mby54ICYgNyk7CisgICAgICB2YXIgb2Zmc2V0MCA9IHJlZ2lvbkluZm8ueSAqIHJvd1NpemUgKyAocmVnaW9uSW5mby54ID4+IDMpOworICAgICAgdmFyIGksIGosIG1hc2ssIG9mZnNldDsKKworICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIG1hc2sgPSBtYXNrMDsKKyAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSB8PSBtYXNrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbWFzayA+Pj0gMTsKKworICAgICAgICAgICAgICBpZiAoIW1hc2spIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gMTI4OworICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBtYXNrID0gbWFzazA7CisgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQwOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gXj0gbWFzazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG1hc2sgPj49IDE7CisKKyAgICAgICAgICAgICAgaWYgKCFtYXNrKSB7CisgICAgICAgICAgICAgICAgbWFzayA9IDEyODsKKyAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CisgICAgICB9CisgICAgfSwKKyAgICBvbkltbWVkaWF0ZUdlbmVyaWNSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihyZWdpb24sIGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIHZhciByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CisgICAgICB2YXIgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIHZhciBiaXRtYXAgPSBkZWNvZGVCaXRtYXAocmVnaW9uLm1tciwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi50ZW1wbGF0ZSwgcmVnaW9uLnByZWRpY3Rpb24sIG51bGwsIHJlZ2lvbi5hdCwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApOworICAgIH0sCisgICAgb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCkgeworICAgICAgdGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9LAorICAgIG9uU3ltYm9sRGljdGlvbmFyeTogZnVuY3Rpb24gU2ltcGxlU2VnbWVudFZpc2l0b3Jfb25TeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OworCisgICAgICBpZiAoZGljdGlvbmFyeS5odWZmbWFuKSB7CisgICAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhkaWN0aW9uYXJ5LCByZWZlcnJlZFNlZ21lbnRzLCB0aGlzLmN1c3RvbVRhYmxlcyk7CisgICAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICB9CisKKyAgICAgIHZhciBzeW1ib2xzID0gdGhpcy5zeW1ib2xzOworCisgICAgICBpZiAoIXN5bWJvbHMpIHsKKyAgICAgICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scyA9IHt9OworICAgICAgfQorCisgICAgICB2YXIgaW5wdXRTeW1ib2xzID0gW107CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHJlZmVycmVkU2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb25zdCByZWZlcnJlZFN5bWJvbHMgPSBzeW1ib2xzW3JlZmVycmVkU2VnbWVudHNbaV1dOworCisgICAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHsKKyAgICAgICAgICBpbnB1dFN5bWJvbHMgPSBpbnB1dFN5bWJvbHMuY29uY2F0KHJlZmVycmVkU3ltYm9scyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoZGljdGlvbmFyeS5odWZmbWFuLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnQsIGlucHV0U3ltYm9scywgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRpY3Rpb25hcnkuYXQsIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBodWZmbWFuSW5wdXQpOworICAgIH0sCisgICAgb25JbW1lZGlhdGVUZXh0UmVnaW9uOiBmdW5jdGlvbiBTaW1wbGVTZWdtZW50VmlzaXRvcl9vbkltbWVkaWF0ZVRleHRSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICB2YXIgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvOworICAgICAgbGV0IGh1ZmZtYW5UYWJsZXMsIGh1ZmZtYW5JbnB1dDsKKyAgICAgIHZhciBzeW1ib2xzID0gdGhpcy5zeW1ib2xzOworICAgICAgdmFyIGlucHV0U3ltYm9scyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZWZlcnJlZFNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29uc3QgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRzW2ldXTsKKworICAgICAgICBpZiAocmVmZXJyZWRTeW1ib2xzKSB7CisgICAgICAgICAgaW5wdXRTeW1ib2xzID0gaW5wdXRTeW1ib2xzLmNvbmNhdChyZWZlcnJlZFN5bWJvbHMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBzeW1ib2xDb2RlTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKGlucHV0U3ltYm9scy5sZW5ndGgpOworCisgICAgICBpZiAocmVnaW9uLmh1ZmZtYW4pIHsKKyAgICAgICAgaHVmZm1hbklucHV0ID0gbmV3IFJlYWRlcihkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgICAgaHVmZm1hblRhYmxlcyA9IGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKHJlZ2lvbiwgcmVmZXJyZWRTZWdtZW50cywgdGhpcy5jdXN0b21UYWJsZXMsIGlucHV0U3ltYm9scy5sZW5ndGgsIGh1ZmZtYW5JbnB1dCk7CisgICAgICB9CisKKyAgICAgIHZhciBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgICAgdmFyIGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24ocmVnaW9uLmh1ZmZtYW4sIHJlZ2lvbi5yZWZpbmVtZW50LCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLCByZWdpb24ubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsIHJlZ2lvbi5zdHJpcFNpemUsIGlucHV0U3ltYm9scywgc3ltYm9sQ29kZUxlbmd0aCwgcmVnaW9uLnRyYW5zcG9zZWQsIHJlZ2lvbi5kc09mZnNldCwgcmVnaW9uLnJlZmVyZW5jZUNvcm5lciwgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsIGh1ZmZtYW5UYWJsZXMsIHJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUsIHJlZ2lvbi5yZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgcmVnaW9uLmxvZ1N0cmlwU2l6ZSwgaHVmZm1hbklucHV0KTsKKyAgICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApOworICAgIH0sCisgICAgb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb246IGZ1bmN0aW9uIFNpbXBsZVNlZ21lbnRWaXNpdG9yX29uSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uKCkgeworICAgICAgdGhpcy5vbkltbWVkaWF0ZVRleHRSZWdpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgb25QYXR0ZXJuRGljdGlvbmFyeShkaWN0aW9uYXJ5LCBjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgbGV0IHBhdHRlcm5zID0gdGhpcy5wYXR0ZXJuczsKKworICAgICAgaWYgKCFwYXR0ZXJucykgeworICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnMgPSB7fTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKKyAgICAgIHBhdHRlcm5zW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnkubW1yLCBkaWN0aW9uYXJ5LnBhdHRlcm5XaWR0aCwgZGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0LCBkaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCwgZGljdGlvbmFyeS50ZW1wbGF0ZSwgZGVjb2RpbmdDb250ZXh0KTsKKyAgICB9LAorCisgICAgb25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbihyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wYXR0ZXJuc1tyZWZlcnJlZFNlZ21lbnRzWzBdXTsKKyAgICAgIGNvbnN0IHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKKyAgICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CisgICAgICBjb25zdCBiaXRtYXAgPSBkZWNvZGVIYWxmdG9uZVJlZ2lvbihyZWdpb24ubW1yLCBwYXR0ZXJucywgcmVnaW9uLnRlbXBsYXRlLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLCByZWdpb24uZW5hYmxlU2tpcCwgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsIHJlZ2lvbi5ncmlkV2lkdGgsIHJlZ2lvbi5ncmlkSGVpZ2h0LCByZWdpb24uZ3JpZE9mZnNldFgsIHJlZ2lvbi5ncmlkT2Zmc2V0WSwgcmVnaW9uLmdyaWRWZWN0b3JYLCByZWdpb24uZ3JpZFZlY3RvclksIGRlY29kaW5nQ29udGV4dCk7CisgICAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKKyAgICB9LAorCisgICAgb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uKCkgeworICAgICAgdGhpcy5vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKworICAgIG9uVGFibGVzKGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICBsZXQgY3VzdG9tVGFibGVzID0gdGhpcy5jdXN0b21UYWJsZXM7CisKKyAgICAgIGlmICghY3VzdG9tVGFibGVzKSB7CisgICAgICAgIHRoaXMuY3VzdG9tVGFibGVzID0gY3VzdG9tVGFibGVzID0ge307CisgICAgICB9CisKKyAgICAgIGN1c3RvbVRhYmxlc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpOworICAgIH0KKworICB9OworCisgIGZ1bmN0aW9uIEh1ZmZtYW5MaW5lKGxpbmVEYXRhKSB7CisgICAgaWYgKGxpbmVEYXRhLmxlbmd0aCA9PT0gMikgeworICAgICAgdGhpcy5pc09PQiA9IHRydWU7CisgICAgICB0aGlzLnJhbmdlTG93ID0gMDsKKyAgICAgIHRoaXMucHJlZml4TGVuZ3RoID0gbGluZURhdGFbMF07CisgICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gMDsKKyAgICAgIHRoaXMucHJlZml4Q29kZSA9IGxpbmVEYXRhWzFdOworICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5pc09PQiA9IGZhbHNlOworICAgICAgdGhpcy5yYW5nZUxvdyA9IGxpbmVEYXRhWzBdOworICAgICAgdGhpcy5wcmVmaXhMZW5ndGggPSBsaW5lRGF0YVsxXTsKKyAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSBsaW5lRGF0YVsyXTsKKyAgICAgIHRoaXMucHJlZml4Q29kZSA9IGxpbmVEYXRhWzNdOworICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lRGF0YVs0XSA9PT0gImxvd2VyIjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBIdWZmbWFuVHJlZU5vZGUobGluZSkgeworICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKKworICAgIGlmIChsaW5lKSB7CisgICAgICB0aGlzLmlzTGVhZiA9IHRydWU7CisgICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gbGluZS5yYW5nZUxlbmd0aDsKKyAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lLnJhbmdlTG93OworICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lLmlzTG93ZXJSYW5nZTsKKyAgICAgIHRoaXMuaXNPT0IgPSBsaW5lLmlzT09COworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmlzTGVhZiA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIEh1ZmZtYW5UcmVlTm9kZS5wcm90b3R5cGUgPSB7CisgICAgYnVpbGRUcmVlKGxpbmUsIHNoaWZ0KSB7CisgICAgICBjb25zdCBiaXQgPSBsaW5lLnByZWZpeENvZGUgPj4gc2hpZnQgJiAxOworCisgICAgICBpZiAoc2hpZnQgPD0gMCkgeworICAgICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBuZXcgSHVmZm1hblRyZWVOb2RlKGxpbmUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW2JpdF07CisKKyAgICAgICAgaWYgKCFub2RlKSB7CisgICAgICAgICAgdGhpcy5jaGlsZHJlbltiaXRdID0gbm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBub2RlLmJ1aWxkVHJlZShsaW5lLCBzaGlmdCAtIDEpOworICAgICAgfQorICAgIH0sCisKKyAgICBkZWNvZGVOb2RlKHJlYWRlcikgeworICAgICAgaWYgKHRoaXMuaXNMZWFmKSB7CisgICAgICAgIGlmICh0aGlzLmlzT09CKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBodE9mZnNldCA9IHJlYWRlci5yZWFkQml0cyh0aGlzLnJhbmdlTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VMb3cgKyAodGhpcy5pc0xvd2VyUmFuZ2UgPyAtaHRPZmZzZXQgOiBodE9mZnNldCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW3JlYWRlci5yZWFkQml0KCldOworCisgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBkYXRhIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBub2RlLmRlY29kZU5vZGUocmVhZGVyKTsKKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBIdWZmbWFuVGFibGUobGluZXMsIHByZWZpeENvZGVzRG9uZSkgeworICAgIGlmICghcHJlZml4Q29kZXNEb25lKSB7CisgICAgICB0aGlzLmFzc2lnblByZWZpeENvZGVzKGxpbmVzKTsKKyAgICB9CisKKyAgICB0aGlzLnJvb3ROb2RlID0gbmV3IEh1ZmZtYW5UcmVlTm9kZShudWxsKTsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKKworICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID4gMCkgeworICAgICAgICB0aGlzLnJvb3ROb2RlLmJ1aWxkVHJlZShsaW5lLCBsaW5lLnByZWZpeExlbmd0aCAtIDEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEh1ZmZtYW5UYWJsZS5wcm90b3R5cGUgPSB7CisgICAgZGVjb2RlKHJlYWRlcikgeworICAgICAgcmV0dXJuIHRoaXMucm9vdE5vZGUuZGVjb2RlTm9kZShyZWFkZXIpOworICAgIH0sCisKKyAgICBhc3NpZ25QcmVmaXhDb2RlcyhsaW5lcykgeworICAgICAgY29uc3QgbGluZXNMZW5ndGggPSBsaW5lcy5sZW5ndGg7CisgICAgICBsZXQgcHJlZml4TGVuZ3RoTWF4ID0gMDsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7CisgICAgICAgIHByZWZpeExlbmd0aE1heCA9IE1hdGgubWF4KHByZWZpeExlbmd0aE1heCwgbGluZXNbaV0ucHJlZml4TGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgaGlzdG9ncmFtID0gbmV3IFVpbnQzMkFycmF5KHByZWZpeExlbmd0aE1heCArIDEpOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaGlzdG9ncmFtW2xpbmVzW2ldLnByZWZpeExlbmd0aF0rKzsKKyAgICAgIH0KKworICAgICAgbGV0IGN1cnJlbnRMZW5ndGggPSAxLAorICAgICAgICAgIGZpcnN0Q29kZSA9IDAsCisgICAgICAgICAgY3VycmVudENvZGUsCisgICAgICAgICAgY3VycmVudFRlbXAsCisgICAgICAgICAgbGluZTsKKyAgICAgIGhpc3RvZ3JhbVswXSA9IDA7CisKKyAgICAgIHdoaWxlIChjdXJyZW50TGVuZ3RoIDw9IHByZWZpeExlbmd0aE1heCkgeworICAgICAgICBmaXJzdENvZGUgPSBmaXJzdENvZGUgKyBoaXN0b2dyYW1bY3VycmVudExlbmd0aCAtIDFdIDw8IDE7CisgICAgICAgIGN1cnJlbnRDb2RlID0gZmlyc3RDb2RlOworICAgICAgICBjdXJyZW50VGVtcCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRUZW1wIDwgbGluZXNMZW5ndGgpIHsKKyAgICAgICAgICBsaW5lID0gbGluZXNbY3VycmVudFRlbXBdOworCisgICAgICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKSB7CisgICAgICAgICAgICBsaW5lLnByZWZpeENvZGUgPSBjdXJyZW50Q29kZTsKKyAgICAgICAgICAgIGN1cnJlbnRDb2RlKys7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudFRlbXArKzsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRMZW5ndGgrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgfTsKKworICBmdW5jdGlvbiBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICBjb25zdCBmbGFncyA9IGRhdGFbc3RhcnRdOworICAgIGNvbnN0IGxvd2VzdFZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgMSkgJiAweGZmZmZmZmZmOworICAgIGNvbnN0IGhpZ2hlc3RWYWx1ZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDUpICYgMHhmZmZmZmZmZjsKKyAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0ICsgOSwgZW5kKTsKKyAgICBjb25zdCBwcmVmaXhTaXplQml0cyA9IChmbGFncyA+PiAxICYgNykgKyAxOworICAgIGNvbnN0IHJhbmdlU2l6ZUJpdHMgPSAoZmxhZ3MgPj4gNCAmIDcpICsgMTsKKyAgICBjb25zdCBsaW5lcyA9IFtdOworICAgIGxldCBwcmVmaXhMZW5ndGgsCisgICAgICAgIHJhbmdlTGVuZ3RoLAorICAgICAgICBjdXJyZW50UmFuZ2VMb3cgPSBsb3dlc3RWYWx1ZTsKKworICAgIGRvIHsKKyAgICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CisgICAgICByYW5nZUxlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhyYW5nZVNpemVCaXRzKTsKKyAgICAgIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtjdXJyZW50UmFuZ2VMb3csIHByZWZpeExlbmd0aCwgcmFuZ2VMZW5ndGgsIDBdKSk7CisgICAgICBjdXJyZW50UmFuZ2VMb3cgKz0gMSA8PCByYW5nZUxlbmd0aDsKKyAgICB9IHdoaWxlIChjdXJyZW50UmFuZ2VMb3cgPCBoaWdoZXN0VmFsdWUpOworCisgICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKKyAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbbG93ZXN0VmFsdWUgLSAxLCBwcmVmaXhMZW5ndGgsIDMyLCAwLCAibG93ZXIiXSkpOworICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CisgICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2hpZ2hlc3RWYWx1ZSwgcHJlZml4TGVuZ3RoLCAzMiwgMF0pKTsKKworICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CisgICAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbcHJlZml4TGVuZ3RoLCAwXSkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgSHVmZm1hblRhYmxlKGxpbmVzLCBmYWxzZSk7CisgIH0KKworICBjb25zdCBzdGFuZGFyZFRhYmxlc0NhY2hlID0ge307CisKKyAgZnVuY3Rpb24gZ2V0U3RhbmRhcmRUYWJsZShudW1iZXIpIHsKKyAgICBsZXQgdGFibGUgPSBzdGFuZGFyZFRhYmxlc0NhY2hlW251bWJlcl07CisKKyAgICBpZiAodGFibGUpIHsKKyAgICAgIHJldHVybiB0YWJsZTsKKyAgICB9CisKKyAgICBsZXQgbGluZXM7CisKKyAgICBzd2l0Y2ggKG51bWJlcikgeworICAgICAgY2FzZSAxOgorICAgICAgICBsaW5lcyA9IFtbMCwgMSwgNCwgMHgwXSwgWzE2LCAyLCA4LCAweDJdLCBbMjcyLCAzLCAxNiwgMHg2XSwgWzY1ODA4LCAzLCAzMiwgMHg3XV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI6CisgICAgICAgIGxpbmVzID0gW1swLCAxLCAwLCAweDBdLCBbMSwgMiwgMCwgMHgyXSwgWzIsIDMsIDAsIDB4Nl0sIFszLCA0LCAzLCAweGVdLCBbMTEsIDUsIDYsIDB4MWVdLCBbNzUsIDYsIDMyLCAweDNlXSwgWzYsIDB4M2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgbGluZXMgPSBbWy0yNTYsIDgsIDgsIDB4ZmVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWy0yNTcsIDgsIDMyLCAweGZmLCAibG93ZXIiXSwgWzc1LCA3LCAzMiwgMHg3ZV0sIFs2LCAweDNlXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQ6CisgICAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDAsIDB4Nl0sIFs0LCA0LCAzLCAweGVdLCBbMTIsIDUsIDYsIDB4MWVdLCBbNzYsIDUsIDMyLCAweDFmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDU6CisgICAgICAgIGxpbmVzID0gW1stMjU1LCA3LCA4LCAweDdlXSwgWzEsIDEsIDAsIDB4MF0sIFsyLCAyLCAwLCAweDJdLCBbMywgMywgMCwgMHg2XSwgWzQsIDQsIDMsIDB4ZV0sIFsxMiwgNSwgNiwgMHgxZV0sIFstMjU2LCA3LCAzMiwgMHg3ZiwgImxvd2VyIl0sIFs3NiwgNiwgMzIsIDB4M2VdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgbGluZXMgPSBbWy0yMDQ4LCA1LCAxMCwgMHgxY10sIFstMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDQsIDgsIDB4OV0sIFstMjU2LCA0LCA3LCAweGFdLCBbLTEyOCwgNSwgNiwgMHgxZF0sIFstNjQsIDUsIDUsIDB4MWVdLCBbLTMyLCA0LCA1LCAweGJdLCBbMCwgMiwgNywgMHgwXSwgWzEyOCwgMywgNywgMHgyXSwgWzI1NiwgMywgOCwgMHgzXSwgWzUxMiwgNCwgOSwgMHhjXSwgWzEwMjQsIDQsIDEwLCAweGRdLCBbLTIwNDksIDYsIDMyLCAweDNlLCAibG93ZXIiXSwgWzIwNDgsIDYsIDMyLCAweDNmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDc6CisgICAgICAgIGxpbmVzID0gW1stMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDMsIDgsIDB4MF0sIFstMjU2LCA0LCA3LCAweDldLCBbLTEyOCwgNSwgNiwgMHgxYV0sIFstNjQsIDUsIDUsIDB4MWJdLCBbLTMyLCA0LCA1LCAweGFdLCBbMCwgNCwgNSwgMHhiXSwgWzMyLCA1LCA1LCAweDFjXSwgWzY0LCA1LCA2LCAweDFkXSwgWzEyOCwgNCwgNywgMHhjXSwgWzI1NiwgMywgOCwgMHgxXSwgWzUxMiwgMywgOSwgMHgyXSwgWzEwMjQsIDMsIDEwLCAweDNdLCBbLTEwMjUsIDUsIDMyLCAweDFlLCAibG93ZXIiXSwgWzIwNDgsIDUsIDMyLCAweDFmXV07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDg6CisgICAgICAgIGxpbmVzID0gW1stMTUsIDgsIDMsIDB4ZmNdLCBbLTcsIDksIDEsIDB4MWZjXSwgWy01LCA4LCAxLCAweGZkXSwgWy0zLCA5LCAwLCAweDFmZF0sIFstMiwgNywgMCwgMHg3Y10sIFstMSwgNCwgMCwgMHhhXSwgWzAsIDIsIDEsIDB4MF0sIFsyLCA1LCAwLCAweDFhXSwgWzMsIDYsIDAsIDB4M2FdLCBbNCwgMywgNCwgMHg0XSwgWzIwLCA2LCAxLCAweDNiXSwgWzIyLCA0LCA0LCAweGJdLCBbMzgsIDQsIDUsIDB4Y10sIFs3MCwgNSwgNiwgMHgxYl0sIFsxMzQsIDUsIDcsIDB4MWNdLCBbMjYyLCA2LCA3LCAweDNjXSwgWzM5MCwgNywgOCwgMHg3ZF0sIFs2NDYsIDYsIDEwLCAweDNkXSwgWy0xNiwgOSwgMzIsIDB4MWZlLCAibG93ZXIiXSwgWzE2NzAsIDksIDMyLCAweDFmZl0sIFsyLCAweDFdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgOToKKyAgICAgICAgbGluZXMgPSBbWy0zMSwgOCwgNCwgMHhmY10sIFstMTUsIDksIDIsIDB4MWZjXSwgWy0xMSwgOCwgMiwgMHhmZF0sIFstNywgOSwgMSwgMHgxZmRdLCBbLTUsIDcsIDEsIDB4N2NdLCBbLTMsIDQsIDEsIDB4YV0sIFstMSwgMywgMSwgMHgyXSwgWzEsIDMsIDEsIDB4M10sIFszLCA1LCAxLCAweDFhXSwgWzUsIDYsIDEsIDB4M2FdLCBbNywgMywgNSwgMHg0XSwgWzM5LCA2LCAyLCAweDNiXSwgWzQzLCA0LCA1LCAweGJdLCBbNzUsIDQsIDYsIDB4Y10sIFsxMzksIDUsIDcsIDB4MWJdLCBbMjY3LCA1LCA4LCAweDFjXSwgWzUyMywgNiwgOCwgMHgzY10sIFs3NzksIDcsIDksIDB4N2RdLCBbMTI5MSwgNiwgMTEsIDB4M2RdLCBbLTMyLCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMzMzOSwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MF1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxMDoKKyAgICAgICAgbGluZXMgPSBbWy0yMSwgNywgNCwgMHg3YV0sIFstNSwgOCwgMCwgMHhmY10sIFstNCwgNywgMCwgMHg3Yl0sIFstMywgNSwgMCwgMHgxOF0sIFstMiwgMiwgMiwgMHgwXSwgWzIsIDUsIDAsIDB4MTldLCBbMywgNiwgMCwgMHgzNl0sIFs0LCA3LCAwLCAweDdjXSwgWzUsIDgsIDAsIDB4ZmRdLCBbNiwgMiwgNiwgMHgxXSwgWzcwLCA1LCA1LCAweDFhXSwgWzEwMiwgNiwgNSwgMHgzN10sIFsxMzQsIDYsIDYsIDB4MzhdLCBbMTk4LCA2LCA3LCAweDM5XSwgWzMyNiwgNiwgOCwgMHgzYV0sIFs1ODIsIDYsIDksIDB4M2JdLCBbMTA5NCwgNiwgMTAsIDB4M2NdLCBbMjExOCwgNywgMTEsIDB4N2RdLCBbLTIyLCA4LCAzMiwgMHhmZSwgImxvd2VyIl0sIFs0MTY2LCA4LCAzMiwgMHhmZl0sIFsyLCAweDJdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTE6CisgICAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMSwgMHgyXSwgWzQsIDQsIDAsIDB4Y10sIFs1LCA0LCAxLCAweGRdLCBbNywgNSwgMSwgMHgxY10sIFs5LCA1LCAyLCAweDFkXSwgWzEzLCA2LCAyLCAweDNjXSwgWzE3LCA3LCAyLCAweDdhXSwgWzIxLCA3LCAzLCAweDdiXSwgWzI5LCA3LCA0LCAweDdjXSwgWzQ1LCA3LCA1LCAweDdkXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTI6CisgICAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDEsIDB4Nl0sIFs1LCA1LCAwLCAweDFjXSwgWzYsIDUsIDEsIDB4MWRdLCBbOCwgNiwgMSwgMHgzY10sIFsxMCwgNywgMCwgMHg3YV0sIFsxMSwgNywgMSwgMHg3Yl0sIFsxMywgNywgMiwgMHg3Y10sIFsxNywgNywgMywgMHg3ZF0sIFsyNSwgNywgNCwgMHg3ZV0sIFs0MSwgOCwgNSwgMHhmZV0sIFs3MywgOCwgMzIsIDB4ZmZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTM6CisgICAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMywgMCwgMHg0XSwgWzMsIDQsIDAsIDB4Y10sIFs0LCA1LCAwLCAweDFjXSwgWzUsIDQsIDEsIDB4ZF0sIFs3LCAzLCAzLCAweDVdLCBbMTUsIDYsIDEsIDB4M2FdLCBbMTcsIDYsIDIsIDB4M2JdLCBbMjEsIDYsIDMsIDB4M2NdLCBbMjksIDYsIDQsIDB4M2RdLCBbNDUsIDYsIDUsIDB4M2VdLCBbNzcsIDcsIDYsIDB4N2VdLCBbMTQxLCA3LCAzMiwgMHg3Zl1dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxNDoKKyAgICAgICAgbGluZXMgPSBbWy0yLCAzLCAwLCAweDRdLCBbLTEsIDMsIDAsIDB4NV0sIFswLCAxLCAwLCAweDBdLCBbMSwgMywgMCwgMHg2XSwgWzIsIDMsIDAsIDB4N11dOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxNToKKyAgICAgICAgbGluZXMgPSBbWy0yNCwgNywgNCwgMHg3Y10sIFstOCwgNiwgMiwgMHgzY10sIFstNCwgNSwgMSwgMHgxY10sIFstMiwgNCwgMCwgMHhjXSwgWy0xLCAzLCAwLCAweDRdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4NV0sIFsyLCA0LCAwLCAweGRdLCBbMywgNSwgMSwgMHgxZF0sIFs1LCA2LCAyLCAweDNkXSwgWzksIDcsIDQsIDB4N2RdLCBbLTI1LCA3LCAzMiwgMHg3ZSwgImxvd2VyIl0sIFsyNSwgNywgMzIsIDB4N2ZdXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBzdGFuZGFyZCB0YWJsZSBCLiR7bnVtYmVyfSBkb2VzIG5vdCBleGlzdGApOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGxpbmVzW2ldID0gbmV3IEh1ZmZtYW5MaW5lKGxpbmVzW2ldKTsKKyAgICB9CisKKyAgICB0YWJsZSA9IG5ldyBIdWZmbWFuVGFibGUobGluZXMsIHRydWUpOworICAgIHN0YW5kYXJkVGFibGVzQ2FjaGVbbnVtYmVyXSA9IHRhYmxlOworICAgIHJldHVybiB0YWJsZTsKKyAgfQorCisgIGZ1bmN0aW9uIFJlYWRlcihkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgdGhpcy5lbmQgPSBlbmQ7CisgICAgdGhpcy5wb3NpdGlvbiA9IHN0YXJ0OworICAgIHRoaXMuc2hpZnQgPSAtMTsKKyAgICB0aGlzLmN1cnJlbnRCeXRlID0gMDsKKyAgfQorCisgIFJlYWRlci5wcm90b3R5cGUgPSB7CisgICAgcmVhZEJpdCgpIHsKKyAgICAgIGlmICh0aGlzLnNoaWZ0IDwgMCkgeworICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSB0aGlzLmVuZCkgeworICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJlbmQgb2YgZGF0YSB3aGlsZSByZWFkaW5nIGJpdCIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jdXJyZW50Qnl0ZSA9IHRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdOworICAgICAgICB0aGlzLnNoaWZ0ID0gNzsKKyAgICAgIH0KKworICAgICAgY29uc3QgYml0ID0gdGhpcy5jdXJyZW50Qnl0ZSA+PiB0aGlzLnNoaWZ0ICYgMTsKKyAgICAgIHRoaXMuc2hpZnQtLTsKKyAgICAgIHJldHVybiBiaXQ7CisgICAgfSwKKworICAgIHJlYWRCaXRzKG51bUJpdHMpIHsKKyAgICAgIGxldCByZXN1bHQgPSAwLAorICAgICAgICAgIGk7CisKKyAgICAgIGZvciAoaSA9IG51bUJpdHMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICByZXN1bHQgfD0gdGhpcy5yZWFkQml0KCkgPDwgaTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9LAorCisgICAgYnl0ZUFsaWduKCkgeworICAgICAgdGhpcy5zaGlmdCA9IC0xOworICAgIH0sCisKKyAgICBuZXh0KCkgeworICAgICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5lbmQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpIHsKKyAgICBsZXQgY3VycmVudEluZGV4ID0gMDsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHJlZmVycmVkVG8ubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgY29uc3QgdGFibGUgPSBjdXN0b21UYWJsZXNbcmVmZXJyZWRUb1tpXV07CisKKyAgICAgIGlmICh0YWJsZSkgeworICAgICAgICBpZiAoaW5kZXggPT09IGN1cnJlbnRJbmRleCkgeworICAgICAgICAgIHJldHVybiB0YWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRJbmRleCsrOworICAgICAgfQorICAgIH0KKworICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJjYW4ndCBmaW5kIGN1c3RvbSBIdWZmbWFuIHRhYmxlIik7CisgIH0KKworICBmdW5jdGlvbiBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyh0ZXh0UmVnaW9uLCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMsIG51bWJlck9mU3ltYm9scywgcmVhZGVyKSB7CisgICAgY29uc3QgY29kZXMgPSBbXTsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDM0OyBpKyspIHsKKyAgICAgIGNvbnN0IGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7CisgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKKyAgICB9CisKKyAgICBjb25zdCBydW5Db2Rlc1RhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShjb2RlcywgZmFsc2UpOworICAgIGNvZGVzLmxlbmd0aCA9IDA7CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mU3ltYm9sczspIHsKKyAgICAgIGNvbnN0IGNvZGVMZW5ndGggPSBydW5Db2Rlc1RhYmxlLmRlY29kZShyZWFkZXIpOworCisgICAgICBpZiAoY29kZUxlbmd0aCA+PSAzMikgeworICAgICAgICBsZXQgcmVwZWF0ZWRMZW5ndGgsIG51bWJlck9mUmVwZWF0cywgajsKKworICAgICAgICBzd2l0Y2ggKGNvZGVMZW5ndGgpIHsKKyAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgaWYgKGkgPT09IDApIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoMikgKyAzOworICAgICAgICAgICAgcmVwZWF0ZWRMZW5ndGggPSBjb2Rlc1tpIC0gMV0ucHJlZml4TGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMzsKKyAgICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cyg3KSArIDExOworICAgICAgICAgICAgcmVwZWF0ZWRMZW5ndGggPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgY29kZSBsZW5ndGggaW4gc3ltYm9sIElEIHRhYmxlIik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZSZXBlYXRzOyBqKyspIHsKKyAgICAgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgcmVwZWF0ZWRMZW5ndGgsIDAsIDBdKSk7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKworICAgIHJlYWRlci5ieXRlQWxpZ24oKTsKKyAgICBjb25zdCBzeW1ib2xJRFRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShjb2RlcywgZmFsc2UpOworICAgIGxldCBjdXN0b21JbmRleCA9IDAsCisgICAgICAgIHRhYmxlRmlyc3RTLAorICAgICAgICB0YWJsZURlbHRhUywKKyAgICAgICAgdGFibGVEZWx0YVQ7CisKKyAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkZTKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICAgIHRhYmxlRmlyc3RTID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5GUyArIDYpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzOgorICAgICAgICB0YWJsZUZpcnN0UyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRlMgc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkRTKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICAgIHRhYmxlRGVsdGFTID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5EUyArIDgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzOgorICAgICAgICB0YWJsZURlbHRhUyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKKyAgICAgICAgY3VzdG9tSW5kZXgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFMgc2VsZWN0b3IiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRleHRSZWdpb24uaHVmZm1hbkRUKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICAgIHRhYmxlRGVsdGFUID0gZ2V0U3RhbmRhcmRUYWJsZSh0ZXh0UmVnaW9uLmh1ZmZtYW5EVCArIDExKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVEZWx0YVQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICAgIGN1c3RvbUluZGV4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERUIHNlbGVjdG9yIik7CisgICAgfQorCisgICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCkgeworICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgc3ltYm9sSURUYWJsZSwKKyAgICAgIHRhYmxlRmlyc3RTLAorICAgICAgdGFibGVEZWx0YVMsCisgICAgICB0YWJsZURlbHRhVAorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhkaWN0aW9uYXJ5LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpIHsKKyAgICBsZXQgY3VzdG9tSW5kZXggPSAwLAorICAgICAgICB0YWJsZURlbHRhSGVpZ2h0LAorICAgICAgICB0YWJsZURlbHRhV2lkdGg7CisKKyAgICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldFN0YW5kYXJkVGFibGUoZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciArIDQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzOgorICAgICAgICB0YWJsZURlbHRhSGVpZ2h0ID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgICBjdXN0b21JbmRleCsrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpOworICAgIH0KKworICAgIHN3aXRjaCAoZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvcikgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSAxOgorICAgICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IgKyAyKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgICAgICBjdXN0b21JbmRleCsrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVyBzZWxlY3RvciIpOworICAgIH0KKworICAgIGxldCB0YWJsZUJpdG1hcFNpemUsIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzOworCisgICAgaWYgKGRpY3Rpb25hcnkuYml0bWFwU2l6ZVNlbGVjdG9yKSB7CisgICAgICB0YWJsZUJpdG1hcFNpemUgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CisgICAgICBjdXN0b21JbmRleCsrOworICAgIH0gZWxzZSB7CisgICAgICB0YWJsZUJpdG1hcFNpemUgPSBnZXRTdGFuZGFyZFRhYmxlKDEpOworICAgIH0KKworICAgIGlmIChkaWN0aW9uYXJ5LmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3IpIHsKKyAgICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOworICAgIH0gZWxzZSB7CisgICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldFN0YW5kYXJkVGFibGUoMSk7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIHRhYmxlRGVsdGFIZWlnaHQsCisgICAgICB0YWJsZURlbHRhV2lkdGgsCisgICAgICB0YWJsZUJpdG1hcFNpemUsCisgICAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcworICAgIH07CisgIH0KKworICBmdW5jdGlvbiByZWFkVW5jb21wcmVzc2VkQml0bWFwKHJlYWRlciwgd2lkdGgsIGhlaWdodCkgeworICAgIGNvbnN0IGJpdG1hcCA9IFtdOworCisgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOworICAgICAgYml0bWFwLnB1c2gocm93KTsKKworICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgIHJvd1t4XSA9IHJlYWRlci5yZWFkQml0KCk7CisgICAgICB9CisKKyAgICAgIHJlYWRlci5ieXRlQWxpZ24oKTsKKyAgICB9CisKKyAgICByZXR1cm4gYml0bWFwOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlTU1SQml0bWFwKGlucHV0LCB3aWR0aCwgaGVpZ2h0LCBlbmRPZkJsb2NrKSB7CisgICAgY29uc3QgcGFyYW1zID0geworICAgICAgSzogLTEsCisgICAgICBDb2x1bW5zOiB3aWR0aCwKKyAgICAgIFJvd3M6IGhlaWdodCwKKyAgICAgIEJsYWNrSXMxOiB0cnVlLAorICAgICAgRW5kT2ZCbG9jazogZW5kT2ZCbG9jaworICAgIH07CisgICAgY29uc3QgZGVjb2RlciA9IG5ldyBfY2NpdHQuQ0NJVFRGYXhEZWNvZGVyKGlucHV0LCBwYXJhbXMpOworICAgIGNvbnN0IGJpdG1hcCA9IFtdOworICAgIGxldCBjdXJyZW50Qnl0ZSwKKyAgICAgICAgZW9mID0gZmFsc2U7CisKKyAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CisgICAgICBiaXRtYXAucHVzaChyb3cpOworICAgICAgbGV0IHNoaWZ0ID0gLTE7CisKKyAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICBpZiAoc2hpZnQgPCAwKSB7CisgICAgICAgICAgY3VycmVudEJ5dGUgPSBkZWNvZGVyLnJlYWROZXh0Q2hhcigpOworCisgICAgICAgICAgaWYgKGN1cnJlbnRCeXRlID09PSAtMSkgeworICAgICAgICAgICAgY3VycmVudEJ5dGUgPSAwOworICAgICAgICAgICAgZW9mID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzaGlmdCA9IDc7CisgICAgICAgIH0KKworICAgICAgICByb3dbeF0gPSBjdXJyZW50Qnl0ZSA+PiBzaGlmdCAmIDE7CisgICAgICAgIHNoaWZ0LS07CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGVuZE9mQmxvY2sgJiYgIWVvZikgeworICAgICAgY29uc3QgbG9va0ZvckVPRkxpbWl0ID0gNTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rRm9yRU9GTGltaXQ7IGkrKykgeworICAgICAgICBpZiAoZGVjb2Rlci5yZWFkTmV4dENoYXIoKSA9PT0gLTEpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRtYXA7CisgIH0KKworICBmdW5jdGlvbiBKYmlnMkltYWdlKCkge30KKworICBKYmlnMkltYWdlLnByb3RvdHlwZSA9IHsKKyAgICBwYXJzZUNodW5rcyhjaHVua3MpIHsKKyAgICAgIHJldHVybiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcyk7CisgICAgfSwKKworICAgIHBhcnNlKGRhdGEpIHsKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgaW1nRGF0YSwKKyAgICAgICAgd2lkdGgsCisgICAgICAgIGhlaWdodAorICAgICAgfSA9IHBhcnNlSmJpZzIoZGF0YSk7CisgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKKyAgICAgIHJldHVybiBpbWdEYXRhOworICAgIH0KKworICB9OworICByZXR1cm4gSmJpZzJJbWFnZTsKK30oKTsKKworZXhwb3J0cy5KYmlnMkltYWdlID0gSmJpZzJJbWFnZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9qYmlnMl9zdHJlYW0uanMgYi9saWIvY29yZS9qYmlnMl9zdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhNmUxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL2piaWcyX3N0cmVhbS5qcwpAQCAtMCwwICsxLDk5IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5KYmlnMlN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi9zdHJlYW0uanMiKTsKKwordmFyIF9qYmlnID0gcmVxdWlyZSgiLi9qYmlnMi5qcyIpOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCitjb25zdCBKYmlnMlN0cmVhbSA9IGZ1bmN0aW9uIEpiaWcyU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gSmJpZzJTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZGljdCwgcGFyYW1zKSB7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5tYXliZUxlbmd0aCA9IG1heWJlTGVuZ3RoOworICAgIHRoaXMuZGljdCA9IGRpY3Q7CisgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisKKyAgICBfc3RyZWFtLkRlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIEpiaWcyU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoX3N0cmVhbS5EZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpiaWcyU3RyZWFtLnByb3RvdHlwZSwgImJ5dGVzIiwgeworICAgIGdldCgpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYnl0ZXMiLCB0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSk7CisgICAgfSwKKworICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKworICBKYmlnMlN0cmVhbS5wcm90b3R5cGUuZW5zdXJlQnVmZmVyID0gZnVuY3Rpb24gKHJlcXVlc3RlZCkge307CisKKyAgSmJpZzJTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBqYmlnMkltYWdlID0gbmV3IF9qYmlnLkpiaWcySW1hZ2UoKTsKKyAgICBjb25zdCBjaHVua3MgPSBbXTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh0aGlzLnBhcmFtcykpIHsKKyAgICAgIGNvbnN0IGdsb2JhbHNTdHJlYW0gPSB0aGlzLnBhcmFtcy5nZXQoIkpCSUcyR2xvYmFscyIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShnbG9iYWxzU3RyZWFtKSkgeworICAgICAgICBjb25zdCBnbG9iYWxzID0gZ2xvYmFsc1N0cmVhbS5nZXRCeXRlcygpOworICAgICAgICBjaHVua3MucHVzaCh7CisgICAgICAgICAgZGF0YTogZ2xvYmFscywKKyAgICAgICAgICBzdGFydDogMCwKKyAgICAgICAgICBlbmQ6IGdsb2JhbHMubGVuZ3RoCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIGNodW5rcy5wdXNoKHsKKyAgICAgIGRhdGE6IHRoaXMuYnl0ZXMsCisgICAgICBzdGFydDogMCwKKyAgICAgIGVuZDogdGhpcy5ieXRlcy5sZW5ndGgKKyAgICB9KTsKKyAgICBjb25zdCBkYXRhID0gamJpZzJJbWFnZS5wYXJzZUNodW5rcyhjaHVua3MpOworICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgaSsrKSB7CisgICAgICBkYXRhW2ldIF49IDB4ZmY7CisgICAgfQorCisgICAgdGhpcy5idWZmZXIgPSBkYXRhOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gZGF0YUxlbmd0aDsKKyAgICB0aGlzLmVvZiA9IHRydWU7CisgIH07CisKKyAgcmV0dXJuIEpiaWcyU3RyZWFtOworfSgpOworCitleHBvcnRzLkpiaWcyU3RyZWFtID0gSmJpZzJTdHJlYW07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvanBlZ19zdHJlYW0uanMgYi9saWIvY29yZS9qcGVnX3N0cmVhbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTY4NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvanBlZ19zdHJlYW0uanMKQEAgLTAsMCArMSwxMjIgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkpwZWdTdHJlYW0gPSB2b2lkIDA7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi9zdHJlYW0uanMiKTsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfanBnID0gcmVxdWlyZSgiLi9qcGcuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKworY29uc3QgSnBlZ1N0cmVhbSA9IGZ1bmN0aW9uIEpwZWdTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBKcGVnU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGRpY3QsIHBhcmFtcykgeworICAgIGxldCBjaDsKKworICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKKyAgICAgIGlmIChjaCA9PT0gMHhmZikgeworICAgICAgICBzdHJlYW0uc2tpcCgtMSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDsKKyAgICB0aGlzLmRpY3QgPSBkaWN0OworICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworCisgICAgX3N0cmVhbS5EZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBKcGVnU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoX3N0cmVhbS5EZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpwZWdTdHJlYW0ucHJvdG90eXBlLCAiYnl0ZXMiLCB7CisgICAgZ2V0OiBmdW5jdGlvbiBKcGVnU3RyZWFtX2J5dGVzKCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJieXRlcyIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTsKKyAgICB9LAorICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICB9KTsKKworICBKcGVnU3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7fTsKKworICBKcGVnU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKHRoaXMuZW9mKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QganBlZ09wdGlvbnMgPSB7CisgICAgICBkZWNvZGVUcmFuc2Zvcm06IHVuZGVmaW5lZCwKKyAgICAgIGNvbG9yVHJhbnNmb3JtOiB1bmRlZmluZWQKKyAgICB9OworICAgIGNvbnN0IGRlY29kZUFyciA9IHRoaXMuZGljdC5nZXRBcnJheSgiRGVjb2RlIiwgIkQiKTsKKworICAgIGlmICh0aGlzLmZvcmNlUkdCICYmIEFycmF5LmlzQXJyYXkoZGVjb2RlQXJyKSkgeworICAgICAgY29uc3QgYml0c1BlckNvbXBvbmVudCA9IHRoaXMuZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSB8fCA4OworICAgICAgY29uc3QgZGVjb2RlQXJyTGVuZ3RoID0gZGVjb2RlQXJyLmxlbmd0aDsKKyAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBJbnQzMkFycmF5KGRlY29kZUFyckxlbmd0aCk7CisgICAgICBsZXQgdHJhbnNmb3JtTmVlZGVkID0gZmFsc2U7CisgICAgICBjb25zdCBtYXhWYWx1ZSA9ICgxIDw8IGJpdHNQZXJDb21wb25lbnQpIC0gMTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVBcnJMZW5ndGg7IGkgKz0gMikgeworICAgICAgICB0cmFuc2Zvcm1baV0gPSAoZGVjb2RlQXJyW2kgKyAxXSAtIGRlY29kZUFycltpXSkgKiAyNTYgfCAwOworICAgICAgICB0cmFuc2Zvcm1baSArIDFdID0gZGVjb2RlQXJyW2ldICogbWF4VmFsdWUgfCAwOworCisgICAgICAgIGlmICh0cmFuc2Zvcm1baV0gIT09IDI1NiB8fCB0cmFuc2Zvcm1baSArIDFdICE9PSAwKSB7CisgICAgICAgICAgdHJhbnNmb3JtTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodHJhbnNmb3JtTmVlZGVkKSB7CisgICAgICAgIGpwZWdPcHRpb25zLmRlY29kZVRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkodGhpcy5wYXJhbXMpKSB7CisgICAgICBjb25zdCBjb2xvclRyYW5zZm9ybSA9IHRoaXMucGFyYW1zLmdldCgiQ29sb3JUcmFuc2Zvcm0iKTsKKworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoY29sb3JUcmFuc2Zvcm0pKSB7CisgICAgICAgIGpwZWdPcHRpb25zLmNvbG9yVHJhbnNmb3JtID0gY29sb3JUcmFuc2Zvcm07CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QganBlZ0ltYWdlID0gbmV3IF9qcGcuSnBlZ0ltYWdlKGpwZWdPcHRpb25zKTsKKyAgICBqcGVnSW1hZ2UucGFyc2UodGhpcy5ieXRlcyk7CisgICAgY29uc3QgZGF0YSA9IGpwZWdJbWFnZS5nZXREYXRhKHsKKyAgICAgIHdpZHRoOiB0aGlzLmRyYXdXaWR0aCwKKyAgICAgIGhlaWdodDogdGhpcy5kcmF3SGVpZ2h0LAorICAgICAgZm9yY2VSR0I6IHRoaXMuZm9yY2VSR0IsCisgICAgICBpc1NvdXJjZVBERjogdHJ1ZQorICAgIH0pOworICAgIHRoaXMuYnVmZmVyID0gZGF0YTsKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgfTsKKworICByZXR1cm4gSnBlZ1N0cmVhbTsKK30oKTsKKworZXhwb3J0cy5KcGVnU3RyZWFtID0gSnBlZ1N0cmVhbTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9qcGcuanMgYi9saWIvY29yZS9qcGcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2ZTRmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL2pwZy5qcwpAQCAtMCwwICsxLDEyNjEgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkpwZWdJbWFnZSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9jb3JlX3V0aWxzID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIik7CisKK2NsYXNzIEpwZWdFcnJvciBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3Rvcihtc2cpIHsKKyAgICBzdXBlcihgSlBFRyBlcnJvcjogJHttc2d9YCk7CisgIH0KKworfQorCitjbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzY2FuTGluZXMpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB0aGlzLnNjYW5MaW5lcyA9IHNjYW5MaW5lczsKKyAgfQorCit9CisKK2NsYXNzIEVPSU1hcmtlckVycm9yIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7fQorCit2YXIgSnBlZ0ltYWdlID0gZnVuY3Rpb24gSnBlZ0ltYWdlQ2xvc3VyZSgpIHsKKyAgdmFyIGRjdFppZ1phZyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCA4LCAxNiwgOSwgMiwgMywgMTAsIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsIDQsIDUsIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwgMjcsIDIwLCAxMywgNiwgNywgMTQsIDIxLCAyOCwgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LCAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzXSk7CisgIHZhciBkY3RDb3MxID0gNDAxNzsKKyAgdmFyIGRjdFNpbjEgPSA3OTk7CisgIHZhciBkY3RDb3MzID0gMzQwNjsKKyAgdmFyIGRjdFNpbjMgPSAyMjc2OworICB2YXIgZGN0Q29zNiA9IDE1Njc7CisgIHZhciBkY3RTaW42ID0gMzc4NDsKKyAgdmFyIGRjdFNxcnQyID0gNTc5MzsKKyAgdmFyIGRjdFNxcnQxZDIgPSAyODk2OworCisgIGZ1bmN0aW9uIEpwZWdJbWFnZSh7CisgICAgZGVjb2RlVHJhbnNmb3JtID0gbnVsbCwKKyAgICBjb2xvclRyYW5zZm9ybSA9IC0xCisgIH0gPSB7fSkgeworICAgIHRoaXMuX2RlY29kZVRyYW5zZm9ybSA9IGRlY29kZVRyYW5zZm9ybTsKKyAgICB0aGlzLl9jb2xvclRyYW5zZm9ybSA9IGNvbG9yVHJhbnNmb3JtOworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsIHZhbHVlcykgeworICAgIHZhciBrID0gMCwKKyAgICAgICAgY29kZSA9IFtdLAorICAgICAgICBpLAorICAgICAgICBqLAorICAgICAgICBsZW5ndGggPSAxNjsKKworICAgIHdoaWxlIChsZW5ndGggPiAwICYmICFjb2RlTGVuZ3Roc1tsZW5ndGggLSAxXSkgeworICAgICAgbGVuZ3RoLS07CisgICAgfQorCisgICAgY29kZS5wdXNoKHsKKyAgICAgIGNoaWxkcmVuOiBbXSwKKyAgICAgIGluZGV4OiAwCisgICAgfSk7CisgICAgdmFyIHAgPSBjb2RlWzBdLAorICAgICAgICBxOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aHNbaV07IGorKykgeworICAgICAgICBwID0gY29kZS5wb3AoKTsKKyAgICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHZhbHVlc1trXTsKKworICAgICAgICB3aGlsZSAocC5pbmRleCA+IDApIHsKKyAgICAgICAgICBwID0gY29kZS5wb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHAuaW5kZXgrKzsKKyAgICAgICAgY29kZS5wdXNoKHApOworCisgICAgICAgIHdoaWxlIChjb2RlLmxlbmd0aCA8PSBpKSB7CisgICAgICAgICAgY29kZS5wdXNoKHEgPSB7CisgICAgICAgICAgICBjaGlsZHJlbjogW10sCisgICAgICAgICAgICBpbmRleDogMAorICAgICAgICAgIH0pOworICAgICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuOworICAgICAgICAgIHAgPSBxOworICAgICAgICB9CisKKyAgICAgICAgaysrOworICAgICAgfQorCisgICAgICBpZiAoaSArIDEgPCBsZW5ndGgpIHsKKyAgICAgICAgY29kZS5wdXNoKHEgPSB7CisgICAgICAgICAgY2hpbGRyZW46IFtdLAorICAgICAgICAgIGluZGV4OiAwCisgICAgICAgIH0pOworICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKKyAgICAgICAgcCA9IHE7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvZGVbMF0uY2hpbGRyZW47CisgIH0KKworICBmdW5jdGlvbiBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIHJvdywgY29sKSB7CisgICAgcmV0dXJuIDY0ICogKChjb21wb25lbnQuYmxvY2tzUGVyTGluZSArIDEpICogcm93ICsgY29sKTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVNjYW4oZGF0YSwgb2Zmc2V0LCBmcmFtZSwgY29tcG9uZW50cywgcmVzZXRJbnRlcnZhbCwgc3BlY3RyYWxTdGFydCwgc3BlY3RyYWxFbmQsIHN1Y2Nlc3NpdmVQcmV2LCBzdWNjZXNzaXZlLCBwYXJzZUROTE1hcmtlciA9IGZhbHNlKSB7CisgICAgdmFyIG1jdXNQZXJMaW5lID0gZnJhbWUubWN1c1BlckxpbmU7CisgICAgdmFyIHByb2dyZXNzaXZlID0gZnJhbWUucHJvZ3Jlc3NpdmU7CisgICAgY29uc3Qgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CisgICAgbGV0IGJpdHNEYXRhID0gMCwKKyAgICAgICAgYml0c0NvdW50ID0gMDsKKworICAgIGZ1bmN0aW9uIHJlYWRCaXQoKSB7CisgICAgICBpZiAoYml0c0NvdW50ID4gMCkgeworICAgICAgICBiaXRzQ291bnQtLTsKKyAgICAgICAgcmV0dXJuIGJpdHNEYXRhID4+IGJpdHNDb3VudCAmIDE7CisgICAgICB9CisKKyAgICAgIGJpdHNEYXRhID0gZGF0YVtvZmZzZXQrK107CisKKyAgICAgIGlmIChiaXRzRGF0YSA9PT0gMHhmZikgeworICAgICAgICB2YXIgbmV4dEJ5dGUgPSBkYXRhW29mZnNldCsrXTsKKworICAgICAgICBpZiAobmV4dEJ5dGUpIHsKKyAgICAgICAgICBpZiAobmV4dEJ5dGUgPT09IDB4ZGMgJiYgcGFyc2VETkxNYXJrZXIpIHsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgY29uc3Qgc2NhbkxpbmVzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgICAgICAgaWYgKHNjYW5MaW5lcyA+IDAgJiYgc2NhbkxpbmVzICE9PSBmcmFtZS5zY2FuTGluZXMpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEROTE1hcmtlckVycm9yKCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIiwgc2NhbkxpbmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKG5leHRCeXRlID09PSAweGQ5KSB7CisgICAgICAgICAgICBpZiAocGFyc2VETkxNYXJrZXIpIHsKKyAgICAgICAgICAgICAgY29uc3QgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7CisKKyAgICAgICAgICAgICAgaWYgKG1heWJlU2NhbkxpbmVzID4gMCAmJiBNYXRoLnJvdW5kKGZyYW1lLnNjYW5MaW5lcyAvIG1heWJlU2NhbkxpbmVzKSA+PSAxMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgIiArICJwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsIG1heWJlU2NhbkxpbmVzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgRU9JTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKGB1bmV4cGVjdGVkIG1hcmtlciAkeyhiaXRzRGF0YSA8PCA4IHwgbmV4dEJ5dGUpLnRvU3RyaW5nKDE2KX1gKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBiaXRzQ291bnQgPSA3OworICAgICAgcmV0dXJuIGJpdHNEYXRhID4+PiA3OworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlY29kZUh1ZmZtYW4odHJlZSkgeworICAgICAgdmFyIG5vZGUgPSB0cmVlOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBub2RlID0gbm9kZVtyZWFkQml0KCldOworCisgICAgICAgIHN3aXRjaCAodHlwZW9mIG5vZGUpIHsKKyAgICAgICAgICBjYXNlICJudW1iZXIiOgorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisKKyAgICAgICAgICBjYXNlICJvYmplY3QiOgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIGh1ZmZtYW4gc2VxdWVuY2UiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCkgeworICAgICAgdmFyIG4gPSAwOworCisgICAgICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICAgICBuID0gbiA8PCAxIHwgcmVhZEJpdCgpOworICAgICAgICBsZW5ndGgtLTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVjZWl2ZUFuZEV4dGVuZChsZW5ndGgpIHsKKyAgICAgIGlmIChsZW5ndGggPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRCaXQoKSA9PT0gMSA/IDEgOiAtMTsKKyAgICAgIH0KKworICAgICAgdmFyIG4gPSByZWNlaXZlKGxlbmd0aCk7CisKKyAgICAgIGlmIChuID49IDEgPDwgbGVuZ3RoIC0gMSkgeworICAgICAgICByZXR1cm4gbjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG4gKyAoLTEgPDwgbGVuZ3RoKSArIDE7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgeworICAgICAgdmFyIHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7CisgICAgICB2YXIgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KTsKKyAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdID0gY29tcG9uZW50LnByZWQgKz0gZGlmZjsKKyAgICAgIHZhciBrID0gMTsKKworICAgICAgd2hpbGUgKGsgPCA2NCkgeworICAgICAgICB2YXIgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CisgICAgICAgIHZhciBzID0gcnMgJiAxNSwKKyAgICAgICAgICAgIHIgPSBycyA+PiA0OworCisgICAgICAgIGlmIChzID09PSAwKSB7CisgICAgICAgICAgaWYgKHIgPCAxNSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgayArPSAxNjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGsgKz0gcjsKKyAgICAgICAgdmFyIHogPSBkY3RaaWdaYWdba107CisgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocyk7CisgICAgICAgIGsrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBkZWNvZGVEQ0ZpcnN0KGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIHZhciB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpOworICAgICAgdmFyIGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCkgPDwgc3VjY2Vzc2l2ZTsKKyAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdID0gY29tcG9uZW50LnByZWQgKz0gZGlmZjsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgeworICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gfD0gcmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmU7CisgICAgfQorCisgICAgdmFyIGVvYnJ1biA9IDA7CisKKyAgICBmdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIGlmIChlb2JydW4gPiAwKSB7CisgICAgICAgIGVvYnJ1bi0tOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBrID0gc3BlY3RyYWxTdGFydCwKKyAgICAgICAgICBlID0gc3BlY3RyYWxFbmQ7CisKKyAgICAgIHdoaWxlIChrIDw9IGUpIHsKKyAgICAgICAgdmFyIHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOworICAgICAgICB2YXIgcyA9IHJzICYgMTUsCisgICAgICAgICAgICByID0gcnMgPj4gNDsKKworICAgICAgICBpZiAocyA9PT0gMCkgeworICAgICAgICAgIGlmIChyIDwgMTUpIHsKKyAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKSAtIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBrICs9IDE2OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgayArPSByOworICAgICAgICB2YXIgeiA9IGRjdFppZ1phZ1trXTsKKyAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldCArIHpdID0gcmVjZWl2ZUFuZEV4dGVuZChzKSAqICgxIDw8IHN1Y2Nlc3NpdmUpOworICAgICAgICBrKys7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMCwKKyAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlOworCisgICAgZnVuY3Rpb24gZGVjb2RlQUNTdWNjZXNzaXZlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKKyAgICAgIHZhciBrID0gc3BlY3RyYWxTdGFydDsKKyAgICAgIHZhciBlID0gc3BlY3RyYWxFbmQ7CisgICAgICB2YXIgciA9IDA7CisgICAgICB2YXIgczsKKyAgICAgIHZhciByczsKKworICAgICAgd2hpbGUgKGsgPD0gZSkgeworICAgICAgICBjb25zdCBvZmZzZXRaID0gYmxvY2tPZmZzZXQgKyBkY3RaaWdaYWdba107CisgICAgICAgIGNvbnN0IHNpZ24gPSBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdIDwgMCA/IC0xIDogMTsKKworICAgICAgICBzd2l0Y2ggKHN1Y2Nlc3NpdmVBQ1N0YXRlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CisgICAgICAgICAgICBzID0gcnMgJiAxNTsKKyAgICAgICAgICAgIHIgPSBycyA+PiA0OworCisgICAgICAgICAgICBpZiAocyA9PT0gMCkgeworICAgICAgICAgICAgICBpZiAociA8IDE1KSB7CisgICAgICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpOworICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gNDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByID0gMTY7CisgICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAxOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAocyAhPT0gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgQUNuIGVuY29kaW5nIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNOZXh0VmFsdWUgPSByZWNlaXZlQW5kRXh0ZW5kKHMpOworICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHIgPyAyIDogMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHItLTsKKworICAgICAgICAgICAgICBpZiAociA9PT0gMCkgeworICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDIgPyAzIDogMDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CisgICAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID0gc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIDw8IHN1Y2Nlc3NpdmU7CisgICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkgeworICAgICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGsrKzsKKyAgICAgIH0KKworICAgICAgaWYgKHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSA0KSB7CisgICAgICAgIGVvYnJ1bi0tOworCisgICAgICAgIGlmIChlb2JydW4gPT09IDApIHsKKyAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBsZXQgYmxvY2tSb3cgPSAwOworCisgICAgZnVuY3Rpb24gZGVjb2RlTWN1KGNvbXBvbmVudCwgZGVjb2RlLCBtY3UsIHJvdywgY29sKSB7CisgICAgICB2YXIgbWN1Um93ID0gbWN1IC8gbWN1c1BlckxpbmUgfCAwOworICAgICAgdmFyIG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lOworICAgICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdzsKKyAgICAgIHZhciBibG9ja0NvbCA9IG1jdUNvbCAqIGNvbXBvbmVudC5oICsgY29sOworICAgICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CisgICAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGUsIG1jdSkgeworICAgICAgYmxvY2tSb3cgPSBtY3UgLyBjb21wb25lbnQuYmxvY2tzUGVyTGluZSB8IDA7CisgICAgICB2YXIgYmxvY2tDb2wgPSBtY3UgJSBjb21wb25lbnQuYmxvY2tzUGVyTGluZTsKKyAgICAgIGNvbnN0IGJsb2NrT2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpOworICAgICAgZGVjb2RlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpOworICAgIH0KKworICAgIHZhciBjb21wb25lbnRzTGVuZ3RoID0gY29tcG9uZW50cy5sZW5ndGg7CisgICAgdmFyIGNvbXBvbmVudCwgaSwgaiwgaywgbjsKKyAgICB2YXIgZGVjb2RlRm47CisKKyAgICBpZiAocHJvZ3Jlc3NpdmUpIHsKKyAgICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7CisgICAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7CisgICAgfQorCisgICAgdmFyIG1jdSA9IDAsCisgICAgICAgIGZpbGVNYXJrZXI7CisgICAgdmFyIG1jdUV4cGVjdGVkOworCisgICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHsKKyAgICAgIG1jdUV4cGVjdGVkID0gY29tcG9uZW50c1swXS5ibG9ja3NQZXJMaW5lICogY29tcG9uZW50c1swXS5ibG9ja3NQZXJDb2x1bW47CisgICAgfSBlbHNlIHsKKyAgICAgIG1jdUV4cGVjdGVkID0gbWN1c1BlckxpbmUgKiBmcmFtZS5tY3VzUGVyQ29sdW1uOworICAgIH0KKworICAgIHZhciBoLCB2OworCisgICAgd2hpbGUgKG1jdSA8PSBtY3VFeHBlY3RlZCkgeworICAgICAgdmFyIG1jdVRvUmVhZCA9IHJlc2V0SW50ZXJ2YWwgPyBNYXRoLm1pbihtY3VFeHBlY3RlZCAtIG1jdSwgcmVzZXRJbnRlcnZhbCkgOiBtY3VFeHBlY3RlZDsKKworICAgICAgaWYgKG1jdVRvUmVhZCA+IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgeworICAgICAgICAgIGNvbXBvbmVudHNbaV0ucHJlZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBlb2JydW4gPSAwOworCisgICAgICAgIGlmIChjb21wb25lbnRzTGVuZ3RoID09PSAxKSB7CisgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1swXTsKKworICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykgeworICAgICAgICAgICAgZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1KTsKKyAgICAgICAgICAgIG1jdSsrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTsKKyAgICAgICAgICAgICAgaCA9IGNvbXBvbmVudC5oOworICAgICAgICAgICAgICB2ID0gY29tcG9uZW50LnY7CisKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHY7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZUZuLCBtY3UsIGosIGspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtY3UrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYml0c0NvdW50ID0gMDsKKyAgICAgIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgb2Zmc2V0KTsKKworICAgICAgaWYgKCFmaWxlTWFya2VyKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZmlsZU1hcmtlci5pbnZhbGlkKSB7CisgICAgICAgIGNvbnN0IHBhcnRpYWxNc2cgPSBtY3VUb1JlYWQgPiAwID8gInVuZXhwZWN0ZWQiIDogImV4Y2Vzc2l2ZSI7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgZGVjb2RlU2NhbiAtICR7cGFydGlhbE1zZ30gTUNVIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAke2ZpbGVNYXJrZXIuaW52YWxpZH1gKTsKKyAgICAgICAgb2Zmc2V0ID0gZmlsZU1hcmtlci5vZmZzZXQ7CisgICAgICB9CisKKyAgICAgIGlmIChmaWxlTWFya2VyLm1hcmtlciA+PSAweGZmZDAgJiYgZmlsZU1hcmtlci5tYXJrZXIgPD0gMHhmZmQ3KSB7CisgICAgICAgIG9mZnNldCArPSAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldCAtIHN0YXJ0T2Zmc2V0OworICB9CisKKyAgZnVuY3Rpb24gcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgYmxvY2tCdWZmZXJPZmZzZXQsIHApIHsKKyAgICB2YXIgcXQgPSBjb21wb25lbnQucXVhbnRpemF0aW9uVGFibGUsCisgICAgICAgIGJsb2NrRGF0YSA9IGNvbXBvbmVudC5ibG9ja0RhdGE7CisgICAgdmFyIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NzsKKyAgICB2YXIgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3OworICAgIHZhciB0OworCisgICAgaWYgKCFxdCkgeworICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuIik7CisgICAgfQorCisgICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgNjQ7IHJvdyArPSA4KSB7CisgICAgICBwMCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvd107CisgICAgICBwMSA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDFdOworICAgICAgcDIgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAyXTsKKyAgICAgIHAzID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgM107CisgICAgICBwNCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDRdOworICAgICAgcDUgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA1XTsKKyAgICAgIHA2ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNl07CisgICAgICBwNyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDddOworICAgICAgcDAgKj0gcXRbcm93XTsKKworICAgICAgaWYgKChwMSB8IHAyIHwgcDMgfCBwNCB8IHA1IHwgcDYgfCBwNykgPT09IDApIHsKKyAgICAgICAgdCA9IGRjdFNxcnQyICogcDAgKyA1MTIgPj4gMTA7CisgICAgICAgIHBbcm93XSA9IHQ7CisgICAgICAgIHBbcm93ICsgMV0gPSB0OworICAgICAgICBwW3JvdyArIDJdID0gdDsKKyAgICAgICAgcFtyb3cgKyAzXSA9IHQ7CisgICAgICAgIHBbcm93ICsgNF0gPSB0OworICAgICAgICBwW3JvdyArIDVdID0gdDsKKyAgICAgICAgcFtyb3cgKyA2XSA9IHQ7CisgICAgICAgIHBbcm93ICsgN10gPSB0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcDEgKj0gcXRbcm93ICsgMV07CisgICAgICBwMiAqPSBxdFtyb3cgKyAyXTsKKyAgICAgIHAzICo9IHF0W3JvdyArIDNdOworICAgICAgcDQgKj0gcXRbcm93ICsgNF07CisgICAgICBwNSAqPSBxdFtyb3cgKyA1XTsKKyAgICAgIHA2ICo9IHF0W3JvdyArIDZdOworICAgICAgcDcgKj0gcXRbcm93ICsgN107CisgICAgICB2MCA9IGRjdFNxcnQyICogcDAgKyAxMjggPj4gODsKKyAgICAgIHYxID0gZGN0U3FydDIgKiBwNCArIDEyOCA+PiA4OworICAgICAgdjIgPSBwMjsKKyAgICAgIHYzID0gcDY7CisgICAgICB2NCA9IGRjdFNxcnQxZDIgKiAocDEgLSBwNykgKyAxMjggPj4gODsKKyAgICAgIHY3ID0gZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDEyOCA+PiA4OworICAgICAgdjUgPSBwMyA8PCA0OworICAgICAgdjYgPSBwNSA8PCA0OworICAgICAgdjAgPSB2MCArIHYxICsgMSA+PiAxOworICAgICAgdjEgPSB2MCAtIHYxOworICAgICAgdCA9IHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDEyOCA+PiA4OworICAgICAgdjIgPSB2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAxMjggPj4gODsKKyAgICAgIHYzID0gdDsKKyAgICAgIHY0ID0gdjQgKyB2NiArIDEgPj4gMTsKKyAgICAgIHY2ID0gdjQgLSB2NjsKKyAgICAgIHY3ID0gdjcgKyB2NSArIDEgPj4gMTsKKyAgICAgIHY1ID0gdjcgLSB2NTsKKyAgICAgIHYwID0gdjAgKyB2MyArIDEgPj4gMTsKKyAgICAgIHYzID0gdjAgLSB2MzsKKyAgICAgIHYxID0gdjEgKyB2MiArIDEgPj4gMTsKKyAgICAgIHYyID0gdjEgLSB2MjsKKyAgICAgIHQgPSB2NCAqIGRjdFNpbjMgKyB2NyAqIGRjdENvczMgKyAyMDQ4ID4+IDEyOworICAgICAgdjQgPSB2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4ID4+IDEyOworICAgICAgdjcgPSB0OworICAgICAgdCA9IHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDggPj4gMTI7CisgICAgICB2NSA9IHY1ICogZGN0Q29zMSAtIHY2ICogZGN0U2luMSArIDIwNDggPj4gMTI7CisgICAgICB2NiA9IHQ7CisgICAgICBwW3Jvd10gPSB2MCArIHY3OworICAgICAgcFtyb3cgKyA3XSA9IHYwIC0gdjc7CisgICAgICBwW3JvdyArIDFdID0gdjEgKyB2NjsKKyAgICAgIHBbcm93ICsgNl0gPSB2MSAtIHY2OworICAgICAgcFtyb3cgKyAyXSA9IHYyICsgdjU7CisgICAgICBwW3JvdyArIDVdID0gdjIgLSB2NTsKKyAgICAgIHBbcm93ICsgM10gPSB2MyArIHY0OworICAgICAgcFtyb3cgKyA0XSA9IHYzIC0gdjQ7CisgICAgfQorCisgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgODsgKytjb2wpIHsKKyAgICAgIHAwID0gcFtjb2xdOworICAgICAgcDEgPSBwW2NvbCArIDhdOworICAgICAgcDIgPSBwW2NvbCArIDE2XTsKKyAgICAgIHAzID0gcFtjb2wgKyAyNF07CisgICAgICBwNCA9IHBbY29sICsgMzJdOworICAgICAgcDUgPSBwW2NvbCArIDQwXTsKKyAgICAgIHA2ID0gcFtjb2wgKyA0OF07CisgICAgICBwNyA9IHBbY29sICsgNTZdOworCisgICAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkgeworICAgICAgICB0ID0gZGN0U3FydDIgKiBwMCArIDgxOTIgPj4gMTQ7CisKKyAgICAgICAgaWYgKHQgPCAtMjA0MCkgeworICAgICAgICAgIHQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHQgPj0gMjAyNCkgeworICAgICAgICAgIHQgPSAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdCA9IHQgKyAyMDU2ID4+IDQ7CisgICAgICAgIH0KKworICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gdDsKKyAgICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSB0OworICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSB0OworICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSB0OworICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSB0OworICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSB0OworICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSB0OworICAgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSB0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdjAgPSBkY3RTcXJ0MiAqIHAwICsgMjA0OCA+PiAxMjsKKyAgICAgIHYxID0gZGN0U3FydDIgKiBwNCArIDIwNDggPj4gMTI7CisgICAgICB2MiA9IHAyOworICAgICAgdjMgPSBwNjsKKyAgICAgIHY0ID0gZGN0U3FydDFkMiAqIChwMSAtIHA3KSArIDIwNDggPj4gMTI7CisgICAgICB2NyA9IGRjdFNxcnQxZDIgKiAocDEgKyBwNykgKyAyMDQ4ID4+IDEyOworICAgICAgdjUgPSBwMzsKKyAgICAgIHY2ID0gcDU7CisgICAgICB2MCA9ICh2MCArIHYxICsgMSA+PiAxKSArIDQxMTI7CisgICAgICB2MSA9IHYwIC0gdjE7CisgICAgICB0ID0gdjIgKiBkY3RTaW42ICsgdjMgKiBkY3RDb3M2ICsgMjA0OCA+PiAxMjsKKyAgICAgIHYyID0gdjIgKiBkY3RDb3M2IC0gdjMgKiBkY3RTaW42ICsgMjA0OCA+PiAxMjsKKyAgICAgIHYzID0gdDsKKyAgICAgIHY0ID0gdjQgKyB2NiArIDEgPj4gMTsKKyAgICAgIHY2ID0gdjQgLSB2NjsKKyAgICAgIHY3ID0gdjcgKyB2NSArIDEgPj4gMTsKKyAgICAgIHY1ID0gdjcgLSB2NTsKKyAgICAgIHYwID0gdjAgKyB2MyArIDEgPj4gMTsKKyAgICAgIHYzID0gdjAgLSB2MzsKKyAgICAgIHYxID0gdjEgKyB2MiArIDEgPj4gMTsKKyAgICAgIHYyID0gdjEgLSB2MjsKKyAgICAgIHQgPSB2NCAqIGRjdFNpbjMgKyB2NyAqIGRjdENvczMgKyAyMDQ4ID4+IDEyOworICAgICAgdjQgPSB2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4ID4+IDEyOworICAgICAgdjcgPSB0OworICAgICAgdCA9IHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDggPj4gMTI7CisgICAgICB2NSA9IHY1ICogZGN0Q29zMSAtIHY2ICogZGN0U2luMSArIDIwNDggPj4gMTI7CisgICAgICB2NiA9IHQ7CisgICAgICBwMCA9IHYwICsgdjc7CisgICAgICBwNyA9IHYwIC0gdjc7CisgICAgICBwMSA9IHYxICsgdjY7CisgICAgICBwNiA9IHYxIC0gdjY7CisgICAgICBwMiA9IHYyICsgdjU7CisgICAgICBwNSA9IHYyIC0gdjU7CisgICAgICBwMyA9IHYzICsgdjQ7CisgICAgICBwNCA9IHYzIC0gdjQ7CisKKyAgICAgIGlmIChwMCA8IDE2KSB7CisgICAgICAgIHAwID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDAgPj0gNDA4MCkgeworICAgICAgICBwMCA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHAwID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDEgPCAxNikgeworICAgICAgICBwMSA9IDA7CisgICAgICB9IGVsc2UgaWYgKHAxID49IDQwODApIHsKKyAgICAgICAgcDEgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwMSA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHAyIDwgMTYpIHsKKyAgICAgICAgcDIgPSAwOworICAgICAgfSBlbHNlIGlmIChwMiA+PSA0MDgwKSB7CisgICAgICAgIHAyID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDIgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwMyA8IDE2KSB7CisgICAgICAgIHAzID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDMgPj0gNDA4MCkgeworICAgICAgICBwMyA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHAzID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDQgPCAxNikgeworICAgICAgICBwNCA9IDA7CisgICAgICB9IGVsc2UgaWYgKHA0ID49IDQwODApIHsKKyAgICAgICAgcDQgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwNCA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKHA1IDwgMTYpIHsKKyAgICAgICAgcDUgPSAwOworICAgICAgfSBlbHNlIGlmIChwNSA+PSA0MDgwKSB7CisgICAgICAgIHA1ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcDUgPj49IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChwNiA8IDE2KSB7CisgICAgICAgIHA2ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAocDYgPj0gNDA4MCkgeworICAgICAgICBwNiA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHA2ID4+PSA0OworICAgICAgfQorCisgICAgICBpZiAocDcgPCAxNikgeworICAgICAgICBwNyA9IDA7CisgICAgICB9IGVsc2UgaWYgKHA3ID49IDQwODApIHsKKyAgICAgICAgcDcgPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwNyA+Pj0gNDsKKyAgICAgIH0KKworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHAwOworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSBwMTsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDE2XSA9IHAyOworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gcDM7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSBwNDsKKyAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQwXSA9IHA1OworICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gcDY7CisgICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSBwNzsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCkgeworICAgIHZhciBibG9ja3NQZXJMaW5lID0gY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7CisgICAgdmFyIGJsb2Nrc1BlckNvbHVtbiA9IGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW47CisgICAgdmFyIGNvbXB1dGF0aW9uQnVmZmVyID0gbmV3IEludDE2QXJyYXkoNjQpOworCisgICAgZm9yICh2YXIgYmxvY2tSb3cgPSAwOyBibG9ja1JvdyA8IGJsb2Nrc1BlckNvbHVtbjsgYmxvY2tSb3crKykgeworICAgICAgZm9yICh2YXIgYmxvY2tDb2wgPSAwOyBibG9ja0NvbCA8IGJsb2Nrc1BlckxpbmU7IGJsb2NrQ29sKyspIHsKKyAgICAgICAgdmFyIG9mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKKyAgICAgICAgcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgb2Zmc2V0LCBjb21wdXRhdGlvbkJ1ZmZlcik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbXBvbmVudC5ibG9ja0RhdGE7CisgIH0KKworICBmdW5jdGlvbiBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgY3VycmVudFBvcywgc3RhcnRQb3MgPSBjdXJyZW50UG9zKSB7CisgICAgY29uc3QgbWF4UG9zID0gZGF0YS5sZW5ndGggLSAxOworICAgIHZhciBuZXdQb3MgPSBzdGFydFBvcyA8IGN1cnJlbnRQb3MgPyBzdGFydFBvcyA6IGN1cnJlbnRQb3M7CisKKyAgICBpZiAoY3VycmVudFBvcyA+PSBtYXhQb3MpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHZhciBjdXJyZW50TWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIGN1cnJlbnRQb3MpOworCisgICAgaWYgKGN1cnJlbnRNYXJrZXIgPj0gMHhmZmMwICYmIGN1cnJlbnRNYXJrZXIgPD0gMHhmZmZlKSB7CisgICAgICByZXR1cm4geworICAgICAgICBpbnZhbGlkOiBudWxsLAorICAgICAgICBtYXJrZXI6IGN1cnJlbnRNYXJrZXIsCisgICAgICAgIG9mZnNldDogY3VycmVudFBvcworICAgICAgfTsKKyAgICB9CisKKyAgICB2YXIgbmV3TWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG5ld1Bvcyk7CisKKyAgICB3aGlsZSAoIShuZXdNYXJrZXIgPj0gMHhmZmMwICYmIG5ld01hcmtlciA8PSAweGZmZmUpKSB7CisgICAgICBpZiAoKytuZXdQb3MgPj0gbWF4UG9zKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBuZXdNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgbmV3UG9zKTsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgaW52YWxpZDogY3VycmVudE1hcmtlci50b1N0cmluZygxNiksCisgICAgICBtYXJrZXI6IG5ld01hcmtlciwKKyAgICAgIG9mZnNldDogbmV3UG9zCisgICAgfTsKKyAgfQorCisgIEpwZWdJbWFnZS5wcm90b3R5cGUgPSB7CisgICAgcGFyc2UoZGF0YSwgeworICAgICAgZG5sU2NhbkxpbmVzID0gbnVsbAorICAgIH0gPSB7fSkgeworICAgICAgZnVuY3Rpb24gcmVhZERhdGFCbG9jaygpIHsKKyAgICAgICAgY29uc3QgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICBsZXQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoIC0gMjsKKyAgICAgICAgdmFyIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgZW5kT2Zmc2V0LCBvZmZzZXQpOworCisgICAgICAgIGlmIChmaWxlTWFya2VyICYmIGZpbGVNYXJrZXIuaW52YWxpZCkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicmVhZERhdGFCbG9jayAtIGluY29ycmVjdCBsZW5ndGgsIGN1cnJlbnQgbWFya2VyIGlzOiAiICsgZmlsZU1hcmtlci5pbnZhbGlkKTsKKyAgICAgICAgICBlbmRPZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBhcnJheSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBlbmRPZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoOworICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7CisgICAgICAgIHZhciBtY3VzUGVyTGluZSA9IE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZSAvIDggLyBmcmFtZS5tYXhIKTsKKyAgICAgICAgdmFyIG1jdXNQZXJDb2x1bW4gPSBNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCAvIGZyYW1lLm1heFYpOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZnJhbWUuY29tcG9uZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGNvbXBvbmVudCA9IGZyYW1lLmNvbXBvbmVudHNbaV07CisgICAgICAgICAgdmFyIGJsb2Nrc1BlckxpbmUgPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNhbXBsZXNQZXJMaW5lIC8gOCkgKiBjb21wb25lbnQuaCAvIGZyYW1lLm1heEgpOworICAgICAgICAgIHZhciBibG9ja3NQZXJDb2x1bW4gPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDgpICogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWKTsKKyAgICAgICAgICB2YXIgYmxvY2tzUGVyTGluZUZvck1jdSA9IG1jdXNQZXJMaW5lICogY29tcG9uZW50Lmg7CisgICAgICAgICAgdmFyIGJsb2Nrc1BlckNvbHVtbkZvck1jdSA9IG1jdXNQZXJDb2x1bW4gKiBjb21wb25lbnQudjsKKyAgICAgICAgICB2YXIgYmxvY2tzQnVmZmVyU2l6ZSA9IDY0ICogYmxvY2tzUGVyQ29sdW1uRm9yTWN1ICogKGJsb2Nrc1BlckxpbmVGb3JNY3UgKyAxKTsKKyAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhID0gbmV3IEludDE2QXJyYXkoYmxvY2tzQnVmZmVyU2l6ZSk7CisgICAgICAgICAgY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgPSBibG9ja3NQZXJMaW5lOworICAgICAgICAgIGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4gPSBibG9ja3NQZXJDb2x1bW47CisgICAgICAgIH0KKworICAgICAgICBmcmFtZS5tY3VzUGVyTGluZSA9IG1jdXNQZXJMaW5lOworICAgICAgICBmcmFtZS5tY3VzUGVyQ29sdW1uID0gbWN1c1BlckNvbHVtbjsKKyAgICAgIH0KKworICAgICAgdmFyIG9mZnNldCA9IDA7CisgICAgICB2YXIgamZpZiA9IG51bGw7CisgICAgICB2YXIgYWRvYmUgPSBudWxsOworICAgICAgdmFyIGZyYW1lLCByZXNldEludGVydmFsOworICAgICAgbGV0IG51bVNPU01hcmtlcnMgPSAwOworICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlcyA9IFtdOworICAgICAgdmFyIGh1ZmZtYW5UYWJsZXNBQyA9IFtdLAorICAgICAgICAgIGh1ZmZtYW5UYWJsZXNEQyA9IFtdOworICAgICAgbGV0IGZpbGVNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCArPSAyOworCisgICAgICBpZiAoZmlsZU1hcmtlciAhPT0gMHhmZmQ4KSB7CisgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTsKKyAgICAgIH0KKworICAgICAgZmlsZU1hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAweGZmZDkpIHsKKyAgICAgICAgdmFyIGksIGosIGw7CisKKyAgICAgICAgc3dpdGNoIChmaWxlTWFya2VyKSB7CisgICAgICAgICAgY2FzZSAweGZmZTA6CisgICAgICAgICAgY2FzZSAweGZmZTE6CisgICAgICAgICAgY2FzZSAweGZmZTI6CisgICAgICAgICAgY2FzZSAweGZmZTM6CisgICAgICAgICAgY2FzZSAweGZmZTQ6CisgICAgICAgICAgY2FzZSAweGZmZTU6CisgICAgICAgICAgY2FzZSAweGZmZTY6CisgICAgICAgICAgY2FzZSAweGZmZTc6CisgICAgICAgICAgY2FzZSAweGZmZTg6CisgICAgICAgICAgY2FzZSAweGZmZTk6CisgICAgICAgICAgY2FzZSAweGZmZWE6CisgICAgICAgICAgY2FzZSAweGZmZWI6CisgICAgICAgICAgY2FzZSAweGZmZWM6CisgICAgICAgICAgY2FzZSAweGZmZWQ6CisgICAgICAgICAgY2FzZSAweGZmZWU6CisgICAgICAgICAgY2FzZSAweGZmZWY6CisgICAgICAgICAgY2FzZSAweGZmZmU6CisgICAgICAgICAgICB2YXIgYXBwRGF0YSA9IHJlYWREYXRhQmxvY2soKTsKKworICAgICAgICAgICAgaWYgKGZpbGVNYXJrZXIgPT09IDB4ZmZlMCkgeworICAgICAgICAgICAgICBpZiAoYXBwRGF0YVswXSA9PT0gMHg0YSAmJiBhcHBEYXRhWzFdID09PSAweDQ2ICYmIGFwcERhdGFbMl0gPT09IDB4NDkgJiYgYXBwRGF0YVszXSA9PT0gMHg0NiAmJiBhcHBEYXRhWzRdID09PSAwKSB7CisgICAgICAgICAgICAgICAgamZpZiA9IHsKKyAgICAgICAgICAgICAgICAgIHZlcnNpb246IHsKKyAgICAgICAgICAgICAgICAgICAgbWFqb3I6IGFwcERhdGFbNV0sCisgICAgICAgICAgICAgICAgICAgIG1pbm9yOiBhcHBEYXRhWzZdCisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgZGVuc2l0eVVuaXRzOiBhcHBEYXRhWzddLAorICAgICAgICAgICAgICAgICAgeERlbnNpdHk6IGFwcERhdGFbOF0gPDwgOCB8IGFwcERhdGFbOV0sCisgICAgICAgICAgICAgICAgICB5RGVuc2l0eTogYXBwRGF0YVsxMF0gPDwgOCB8IGFwcERhdGFbMTFdLAorICAgICAgICAgICAgICAgICAgdGh1bWJXaWR0aDogYXBwRGF0YVsxMl0sCisgICAgICAgICAgICAgICAgICB0aHVtYkhlaWdodDogYXBwRGF0YVsxM10sCisgICAgICAgICAgICAgICAgICB0aHVtYkRhdGE6IGFwcERhdGEuc3ViYXJyYXkoMTQsIDE0ICsgMyAqIGFwcERhdGFbMTJdICogYXBwRGF0YVsxM10pCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmVlKSB7CisgICAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDQxICYmIGFwcERhdGFbMV0gPT09IDB4NjQgJiYgYXBwRGF0YVsyXSA9PT0gMHg2ZiAmJiBhcHBEYXRhWzNdID09PSAweDYyICYmIGFwcERhdGFbNF0gPT09IDB4NjUpIHsKKyAgICAgICAgICAgICAgICBhZG9iZSA9IHsKKyAgICAgICAgICAgICAgICAgIHZlcnNpb246IGFwcERhdGFbNV0gPDwgOCB8IGFwcERhdGFbNl0sCisgICAgICAgICAgICAgICAgICBmbGFnczA6IGFwcERhdGFbN10gPDwgOCB8IGFwcERhdGFbOF0sCisgICAgICAgICAgICAgICAgICBmbGFnczE6IGFwcERhdGFbOV0gPDwgOCB8IGFwcERhdGFbMTBdLAorICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtQ29kZTogYXBwRGF0YVsxMV0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmZGI6CisgICAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZXNMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlc0VuZCA9IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCArIG9mZnNldCAtIDI7CisgICAgICAgICAgICB2YXIgejsKKworICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHF1YW50aXphdGlvblRhYmxlc0VuZCkgeworICAgICAgICAgICAgICB2YXIgcXVhbnRpemF0aW9uVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgIHZhciB0YWJsZURhdGEgPSBuZXcgVWludDE2QXJyYXkoNjQpOworCisgICAgICAgICAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisgICAgICAgICAgICAgICAgICB6ID0gZGN0WmlnWmFnW2pdOworICAgICAgICAgICAgICAgICAgdGFibGVEYXRhW3pdID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1YW50aXphdGlvblRhYmxlU3BlYyA+PiA0ID09PSAxKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgIHogPSBkY3RaaWdaYWdbal07CisgICAgICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlc1txdWFudGl6YXRpb25UYWJsZVNwZWMgJiAxNV0gPSB0YWJsZURhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweGZmYzA6CisgICAgICAgICAgY2FzZSAweGZmYzE6CisgICAgICAgICAgY2FzZSAweGZmYzI6CisgICAgICAgICAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgZnJhbWUgPSB7fTsKKyAgICAgICAgICAgIGZyYW1lLmV4dGVuZGVkID0gZmlsZU1hcmtlciA9PT0gMHhmZmMxOworICAgICAgICAgICAgZnJhbWUucHJvZ3Jlc3NpdmUgPSBmaWxlTWFya2VyID09PSAweGZmYzI7CisgICAgICAgICAgICBmcmFtZS5wcmVjaXNpb24gPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgIGNvbnN0IHNvZlNjYW5MaW5lcyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICBmcmFtZS5zY2FuTGluZXMgPSBkbmxTY2FuTGluZXMgfHwgc29mU2NhbkxpbmVzOworICAgICAgICAgICAgZnJhbWUuc2FtcGxlc1BlckxpbmUgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgZnJhbWUuY29tcG9uZW50cyA9IFtdOworICAgICAgICAgICAgZnJhbWUuY29tcG9uZW50SWRzID0ge307CisgICAgICAgICAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gZGF0YVtvZmZzZXQrK10sCisgICAgICAgICAgICAgICAgY29tcG9uZW50SWQ7CisgICAgICAgICAgICB2YXIgbWF4SCA9IDAsCisgICAgICAgICAgICAgICAgbWF4ViA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICBjb21wb25lbnRJZCA9IGRhdGFbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgdmFyIGggPSBkYXRhW29mZnNldCArIDFdID4+IDQ7CisgICAgICAgICAgICAgIHZhciB2ID0gZGF0YVtvZmZzZXQgKyAxXSAmIDE1OworCisgICAgICAgICAgICAgIGlmIChtYXhIIDwgaCkgeworICAgICAgICAgICAgICAgIG1heEggPSBoOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKG1heFYgPCB2KSB7CisgICAgICAgICAgICAgICAgbWF4ViA9IHY7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgcUlkID0gZGF0YVtvZmZzZXQgKyAyXTsKKyAgICAgICAgICAgICAgbCA9IGZyYW1lLmNvbXBvbmVudHMucHVzaCh7CisgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICB2LAorICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbklkOiBxSWQsCisgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uVGFibGU6IG51bGwKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkc1tjb21wb25lbnRJZF0gPSBsIC0gMTsKKyAgICAgICAgICAgICAgb2Zmc2V0ICs9IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lLm1heEggPSBtYXhIOworICAgICAgICAgICAgZnJhbWUubWF4ViA9IG1heFY7CisgICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50cyhmcmFtZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmM0OgorICAgICAgICAgICAgY29uc3QgaHVmZm1hbkxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPCBodWZmbWFuTGVuZ3RoOykgeworICAgICAgICAgICAgICB2YXIgaHVmZm1hblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgICB2YXIgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgxNik7CisgICAgICAgICAgICAgIHZhciBjb2RlTGVuZ3RoU3VtID0gMDsKKworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKywgb2Zmc2V0KyspIHsKKyAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoU3VtICs9IGNvZGVMZW5ndGhzW2pdID0gZGF0YVtvZmZzZXRdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIGh1ZmZtYW5WYWx1ZXMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuZ3RoU3VtKTsKKworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aFN1bTsgaisrLCBvZmZzZXQrKykgeworICAgICAgICAgICAgICAgIGh1ZmZtYW5WYWx1ZXNbal0gPSBkYXRhW29mZnNldF07CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTsKKyAgICAgICAgICAgICAgKGh1ZmZtYW5UYWJsZVNwZWMgPj4gNCA9PT0gMCA/IGh1ZmZtYW5UYWJsZXNEQyA6IGh1ZmZtYW5UYWJsZXNBQylbaHVmZm1hblRhYmxlU3BlYyAmIDE1XSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZkZDoKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgcmVzZXRJbnRlcnZhbCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHhmZmRhOgorICAgICAgICAgICAgY29uc3QgcGFyc2VETkxNYXJrZXIgPSArK251bVNPU01hcmtlcnMgPT09IDEgJiYgIWRubFNjYW5MaW5lczsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgdmFyIHNlbGVjdG9yc0NvdW50ID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdLAorICAgICAgICAgICAgICAgIGNvbXBvbmVudDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGVjdG9yc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhW29mZnNldCsrXTsKKyAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudEluZGV4ID0gZnJhbWUuY29tcG9uZW50SWRzW2luZGV4XTsKKyAgICAgICAgICAgICAgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tjb21wb25lbnRJbmRleF07CisgICAgICAgICAgICAgIGNvbXBvbmVudC5pbmRleCA9IGluZGV4OworICAgICAgICAgICAgICB2YXIgdGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICAgIGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyA9IGh1ZmZtYW5UYWJsZXNEQ1t0YWJsZVNwZWMgPj4gNF07CisgICAgICAgICAgICAgIGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyA9IGh1ZmZtYW5UYWJsZXNBQ1t0YWJsZVNwZWMgJiAxNV07CisgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3BlY3RyYWxTdGFydCA9IGRhdGFbb2Zmc2V0KytdOworICAgICAgICAgICAgdmFyIHNwZWN0cmFsRW5kID0gZGF0YVtvZmZzZXQrK107CisgICAgICAgICAgICB2YXIgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPSBkYXRhW29mZnNldCsrXTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgdmFyIHByb2Nlc3NlZCA9IGRlY29kZVNjYW4oZGF0YSwgb2Zmc2V0LCBmcmFtZSwgY29tcG9uZW50cywgcmVzZXRJbnRlcnZhbCwgc3BlY3RyYWxTdGFydCwgc3BlY3RyYWxFbmQsIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID4+IDQsIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uICYgMTUsIHBhcnNlRE5MTWFya2VyKTsKKyAgICAgICAgICAgICAgb2Zmc2V0ICs9IHByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEROTE1hcmtlckVycm9yKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGAke2V4Lm1lc3NhZ2V9IC0tIGF0dGVtcHRpbmcgdG8gcmUtcGFyc2UgdGhlIEpQRUcgaW1hZ2UuYCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoZGF0YSwgeworICAgICAgICAgICAgICAgICAgZG5sU2NhbkxpbmVzOiBleC5zY2FuTGluZXMKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIEVPSU1hcmtlckVycm9yKSB7CisgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGAke2V4Lm1lc3NhZ2V9IC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLmApOworICAgICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZkYzoKKyAgICAgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4ZmZmZjoKKyAgICAgICAgICAgIGlmIChkYXRhW29mZnNldF0gIT09IDB4ZmYpIHsKKyAgICAgICAgICAgICAgb2Zmc2V0LS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNvbnN0IG5leHRGaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIG9mZnNldCAtIDIsIG9mZnNldCAtIDMpOworCisgICAgICAgICAgICBpZiAobmV4dEZpbGVNYXJrZXIgJiYgbmV4dEZpbGVNYXJrZXIuaW52YWxpZCkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkpwZWdJbWFnZS5wYXJzZSAtIHVuZXhwZWN0ZWQgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICIgKyBuZXh0RmlsZU1hcmtlci5pbnZhbGlkKTsKKyAgICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dEZpbGVNYXJrZXIub2Zmc2V0OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBkYXRhLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGltYWdlIGRhdGEgIiArICJ3aXRob3V0IGZpbmRpbmcgYW4gRU9JIG1hcmtlciAoMHhGRkQ5KS4iKTsKKyAgICAgICAgICAgICAgYnJlYWsgbWFya2VyTG9vcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6ICIgKyBmaWxlTWFya2VyLnRvU3RyaW5nKDE2KSk7CisgICAgICAgIH0KKworICAgICAgICBmaWxlTWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSAyOworICAgICAgfQorCisgICAgICB0aGlzLndpZHRoID0gZnJhbWUuc2FtcGxlc1BlckxpbmU7CisgICAgICB0aGlzLmhlaWdodCA9IGZyYW1lLnNjYW5MaW5lczsKKyAgICAgIHRoaXMuamZpZiA9IGpmaWY7CisgICAgICB0aGlzLmFkb2JlID0gYWRvYmU7CisgICAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tpXTsKKyAgICAgICAgdmFyIHF1YW50aXphdGlvblRhYmxlID0gcXVhbnRpemF0aW9uVGFibGVzW2NvbXBvbmVudC5xdWFudGl6YXRpb25JZF07CisKKyAgICAgICAgaWYgKHF1YW50aXphdGlvblRhYmxlKSB7CisgICAgICAgICAgY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlID0gcXVhbnRpemF0aW9uVGFibGU7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaCh7CisgICAgICAgICAgaW5kZXg6IGNvbXBvbmVudC5pbmRleCwKKyAgICAgICAgICBvdXRwdXQ6IGJ1aWxkQ29tcG9uZW50RGF0YShmcmFtZSwgY29tcG9uZW50KSwKKyAgICAgICAgICBzY2FsZVg6IGNvbXBvbmVudC5oIC8gZnJhbWUubWF4SCwKKyAgICAgICAgICBzY2FsZVk6IGNvbXBvbmVudC52IC8gZnJhbWUubWF4ViwKKyAgICAgICAgICBibG9ja3NQZXJMaW5lOiBjb21wb25lbnQuYmxvY2tzUGVyTGluZSwKKyAgICAgICAgICBibG9ja3NQZXJDb2x1bW46IGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4KKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHRoaXMubnVtQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0sCisKKyAgICBfZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh3aWR0aCwgaGVpZ2h0LCBpc1NvdXJjZVBERiA9IGZhbHNlKSB7CisgICAgICB2YXIgc2NhbGVYID0gdGhpcy53aWR0aCAvIHdpZHRoLAorICAgICAgICAgIHNjYWxlWSA9IHRoaXMuaGVpZ2h0IC8gaGVpZ2h0OworICAgICAgdmFyIGNvbXBvbmVudCwgY29tcG9uZW50U2NhbGVYLCBjb21wb25lbnRTY2FsZVksIGJsb2Nrc1BlclNjYW5saW5lOworICAgICAgdmFyIHgsIHksIGksIGosIGs7CisgICAgICB2YXIgaW5kZXg7CisgICAgICB2YXIgb2Zmc2V0ID0gMDsKKyAgICAgIHZhciBvdXRwdXQ7CisgICAgICB2YXIgbnVtQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7CisgICAgICB2YXIgZGF0YUxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcG9uZW50czsKKyAgICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGFMZW5ndGgpOworICAgICAgdmFyIHhTY2FsZUJsb2NrT2Zmc2V0ID0gbmV3IFVpbnQzMkFycmF5KHdpZHRoKTsKKyAgICAgIHZhciBtYXNrM0xTQiA9IDB4ZmZmZmZmZjg7CisgICAgICBsZXQgbGFzdENvbXBvbmVudFNjYWxlWDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKykgeworICAgICAgICBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbaV07CisgICAgICAgIGNvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudC5zY2FsZVggKiBzY2FsZVg7CisgICAgICAgIGNvbXBvbmVudFNjYWxlWSA9IGNvbXBvbmVudC5zY2FsZVkgKiBzY2FsZVk7CisgICAgICAgIG9mZnNldCA9IGk7CisgICAgICAgIG91dHB1dCA9IGNvbXBvbmVudC5vdXRwdXQ7CisgICAgICAgIGJsb2Nrc1BlclNjYW5saW5lID0gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxIDw8IDM7CisKKyAgICAgICAgaWYgKGNvbXBvbmVudFNjYWxlWCAhPT0gbGFzdENvbXBvbmVudFNjYWxlWCkgeworICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBqID0gMCB8IHggKiBjb21wb25lbnRTY2FsZVg7CisgICAgICAgICAgICB4U2NhbGVCbG9ja09mZnNldFt4XSA9IChqICYgbWFzazNMU0IpIDw8IDMgfCBqICYgNzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsYXN0Q29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50U2NhbGVYOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgaiA9IDAgfCB5ICogY29tcG9uZW50U2NhbGVZOworICAgICAgICAgIGluZGV4ID0gYmxvY2tzUGVyU2NhbmxpbmUgKiAoaiAmIG1hc2szTFNCKSB8IChqICYgNykgPDwgMzsKKworICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBkYXRhW29mZnNldF0gPSBvdXRwdXRbaW5kZXggKyB4U2NhbGVCbG9ja09mZnNldFt4XV07CisgICAgICAgICAgICBvZmZzZXQgKz0gbnVtQ29tcG9uZW50czsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbGV0IHRyYW5zZm9ybSA9IHRoaXMuX2RlY29kZVRyYW5zZm9ybTsKKworICAgICAgaWYgKCFpc1NvdXJjZVBERiAmJiBudW1Db21wb25lbnRzID09PSA0ICYmICF0cmFuc2Zvcm0pIHsKKyAgICAgICAgdHJhbnNmb3JtID0gbmV3IEludDMyQXJyYXkoWy0yNTYsIDI1NSwgLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NV0pOworICAgICAgfQorCisgICAgICBpZiAodHJhbnNmb3JtKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOykgeworICAgICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgbnVtQ29tcG9uZW50czsgaisrLCBpKyssIGsgKz0gMikgeworICAgICAgICAgICAgZGF0YVtpXSA9IChkYXRhW2ldICogdHJhbnNmb3JtW2tdID4+IDgpICsgdHJhbnNmb3JtW2sgKyAxXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfSwKKworICAgIGdldCBfaXNDb2xvckNvbnZlcnNpb25OZWVkZWQoKSB7CisgICAgICBpZiAodGhpcy5hZG9iZSkgeworICAgICAgICByZXR1cm4gISF0aGlzLmFkb2JlLnRyYW5zZm9ybUNvZGU7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMpIHsKKyAgICAgICAgaWYgKHRoaXMuX2NvbG9yVHJhbnNmb3JtID09PSAwKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50c1swXS5pbmRleCA9PT0gMHg1MiAmJiB0aGlzLmNvbXBvbmVudHNbMV0uaW5kZXggPT09IDB4NDcgJiYgdGhpcy5jb21wb25lbnRzWzJdLmluZGV4ID09PSAweDQyKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICBfY29udmVydFljY1RvUmdiOiBmdW5jdGlvbiBjb252ZXJ0WWNjVG9SZ2IoZGF0YSkgeworICAgICAgdmFyIFksIENiLCBDcjsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHsKKyAgICAgICAgWSA9IGRhdGFbaV07CisgICAgICAgIENiID0gZGF0YVtpICsgMV07CisgICAgICAgIENyID0gZGF0YVtpICsgMl07CisgICAgICAgIGRhdGFbaV0gPSBZIC0gMTc5LjQ1NiArIDEuNDAyICogQ3I7CisgICAgICAgIGRhdGFbaSArIDFdID0gWSArIDEzNS40NTkgLSAwLjM0NCAqIENiIC0gMC43MTQgKiBDcjsKKyAgICAgICAgZGF0YVtpICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisgICAgX2NvbnZlcnRZY2NrVG9SZ2I6IGZ1bmN0aW9uIGNvbnZlcnRZY2NrVG9SZ2IoZGF0YSkgeworICAgICAgdmFyIFksIENiLCBDciwgazsKKyAgICAgIHZhciBvZmZzZXQgPSAwOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgeworICAgICAgICBZID0gZGF0YVtpXTsKKyAgICAgICAgQ2IgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgQ3IgPSBkYXRhW2kgKyAyXTsKKyAgICAgICAgayA9IGRhdGFbaSArIDNdOworICAgICAgICBkYXRhW29mZnNldCsrXSA9IC0xMjIuNjcxOTU0MDY4OTQgKyBDYiAqICgtNi42MDYzNTY2OTQyMDM2NGUtNSAqIENiICsgMC4wMDA0MzcxMzA0NzU5MjYyMzIgKiBDciAtIDUuNDA4MDYxMDA2NDU5OWUtNSAqIFkgKyAwLjAwMDQ4NDQ5Nzk3MTIwMjgxICogayAtIDAuMTU0MzYyMTUxODcxMTI2KSArIENyICogKC0wLjAwMDk1Nzk2NDM3ODQ0NTc3MyAqIENyICsgMC4wMDA4MTcwNzY5MTEzNDY2MjUgKiBZIC0gMC4wMDQ3NzI3MTQwNTQwODc0NyAqIGsgKyAxLjUzMzgwMjUzMjIxNzM0KSArIFkgKiAoMC4wMDA5NjEyNTAxODQxMzA2ODggKiBZIC0gMC4wMDI2NjI1NzMzMjI4MzkzMyAqIGsgKyAwLjQ4MzU3MDg4NDUxMjY1KSArIGsgKiAoLTAuMDAwMzM2MTk3MTc3NjE4Mzk0ICogayArIDAuNDg0NzkxNTYxNDkwNzc2KTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAxMDcuMjY4MDM5Mzk3NzI0ICsgQ2IgKiAoMi4xOTkyNzEwNDUyNTc0MWUtNSAqIENiIC0gMC4wMDA2NDA5OTIwMTgyOTc5NDUgKiBDciArIDAuMDAwNjU5Mzk3MDAxMjQ1NTc3ICogWSArIDAuMDAwNDI2MTA1NjUyOTM4ODM3ICogayAtIDAuMTc2NDkxNzkyNDYyODc1KSArIENyICogKC0wLjAwMDc3ODI2OTk0MTUxMzY4MyAqIENyICsgMC4wMDEzMDg3MjI2MTQwODI3NSAqIFkgKyAwLjAwMDc3MDQ4MjYzMTgwMTEzMiAqIGsgLSAwLjE1MTA1MTQ5Mjc3NTU2MikgKyBZICogKDAuMDAxMjY5MzUzNjgxMTQ4NDMgKiBZIC0gMC4wMDI2NTA5MDE4OTAxMDg5OCAqIGsgKyAwLjI1ODAyOTEwMjA2ODQ1KSArIGsgKiAoLTAuMDAwMzE4OTEzMTE3NTg4MzI4ICogayAtIDAuMjEzNzQyNDAwMzIzNjY1KTsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAtMjAuODEwMDEyNTQ2OTQ3ICsgQ2IgKiAoLTAuMDAwNTcwMTE1MTk2OTczNjc3ICogQ2IgLSAyLjYzNDA5MDUxMDA0NTg5ZS01ICogQ3IgKyAwLjAwMjA3NDEwODgxMTUwMTIgKiBZIC0gMC4wMDI4ODI2MDIzNjg1MzQ0MiAqIGsgKyAwLjgxNDI3Mjk2ODM1OTI5NSkgKyBDciAqICgtMS41MzQ5NjA1NzQ0MDk3NWUtNSAqIENyIC0gMC4wMDAxMzI2ODkwNDM5NjE0NDYgKiBZICsgMC4wMDA1NjA4MzM2OTEyNDI4MTIgKiBrIC0gMC4xOTUxNTIwMjc1MzQwNDkpICsgWSAqICgwLjAwMTc0NDE4MTMyOTI3NTgyICogWSAtIDAuMDAyNTUyNDMzMjE0MzkzNDcgKiBrICsgMC4xMTY5MzUwMjA0NjUxNDUpICsgayAqICgtMC4wMDAzNDM1MzE5OTY1MTA1NTUgKiBrICsgMC4yNDE2NTI2MDIzMjQwNyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7CisgICAgfSwKKyAgICBfY29udmVydFljY2tUb0NteWs6IGZ1bmN0aW9uIGNvbnZlcnRZY2NrVG9DbXlrKGRhdGEpIHsKKyAgICAgIHZhciBZLCBDYiwgQ3I7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CisgICAgICAgIFkgPSBkYXRhW2ldOworICAgICAgICBDYiA9IGRhdGFbaSArIDFdOworICAgICAgICBDciA9IGRhdGFbaSArIDJdOworICAgICAgICBkYXRhW2ldID0gNDM0LjQ1NiAtIFkgLSAxLjQwMiAqIENyOworICAgICAgICBkYXRhW2kgKyAxXSA9IDExOS41NDEgLSBZICsgMC4zNDQgKiBDYiArIDAuNzE0ICogQ3I7CisgICAgICAgIGRhdGFbaSArIDJdID0gNDgxLjgxNiAtIFkgLSAxLjc3MiAqIENiOworICAgICAgfQorCisgICAgICByZXR1cm4gZGF0YTsKKyAgICB9LAorICAgIF9jb252ZXJ0Q215a1RvUmdiOiBmdW5jdGlvbiBjb252ZXJ0Q215a1RvUmdiKGRhdGEpIHsKKyAgICAgIHZhciBjLCBtLCB5LCBrOworICAgICAgdmFyIG9mZnNldCA9IDA7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CisgICAgICAgIGMgPSBkYXRhW2ldOworICAgICAgICBtID0gZGF0YVtpICsgMV07CisgICAgICAgIHkgPSBkYXRhW2kgKyAyXTsKKyAgICAgICAgayA9IGRhdGFbaSArIDNdOworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDI1NSArIGMgKiAoLTAuMDAwMDY3NDcxNDcwNzM2MDI0NDEgKiBjICsgMC4wMDA4Mzc5MjYyMTIxMDEzNzI3ICogbSArIDAuMDAwMjg5NDcxODE4ODY0MzI5NCAqIHkgKyAwLjAwMzI2NDIzMTA1NzUzNzgwNiAqIGsgLSAxLjExODU2MTE4NjcyMDM5MzcpICsgbSAqICgwLjAwMDAyNjM3NDEwNzYxNjA4OTQwNSAqIG0gLSAwLjAwMDA4NjI2OTQ5MTU4NjM4NTcyICogeSAtIDAuMDAwMjc0ODc2OTA2NzQ5OTQ5MSAqIGsgLSAwLjAyMTU1Njg4Nzk0OTc4OTY3KSArIHkgKiAoLTAuMDAwMDM4NzgwOTkyMTI4NjkzNjMgKiB5IC0gMC4wMDAzMjY3ODA4Mjc5NDg1Mjg2ICogayArIDAuMDY4Njc0MjIzODU5NTM0NSkgLSBrICogKDAuMDAwMzM2MTk3MTc3NjE4MzkzNyAqIGsgKyAwLjc0MzA2NTkxNTEzNDIyNTQpOworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDI1NSArIGMgKiAoMC4wMDAxMzU5NjM3MjgxMzU4ODg0OCAqIGMgKyAwLjAwMDkyNDUzNzEzMjU3MzU4NSAqIG0gKyAwLjAwMDEwNTY3MzU5NjE4NjgzNTkzICogeSArIDAuMDAwNDc5MTg2NDY4NzQzNjUxMiAqIGsgLSAwLjMxMDk2ODk1ODc1MTU4NzUpICsgbSAqICgtMC4wMDAyMzU0NTM0NjEwODM3MDM0NCAqIG0gKyAwLjAwMDI3MDI4NDUyNTM1MzQ3MTQgKiB5ICsgMC4wMDIwMjAwMzA4OTc3MzA3MTU2ICogayAtIDAuNzQ4ODA1MjE2NzAxNTQ5NCkgKyB5ICogKDAuMDAwMDY4MzQ4MTU5OTgyMzU2NjIgKiB5ICsgMC4wMDAxNTE2ODQ1MjM2MzQ2MDk3MyAqIGsgLSAwLjA5NzUxOTI3Nzc0NzI4OTMzKSAtIGsgKiAoMC4wMDAzMTg5MTMxMTc1ODgzMjgxNCAqIGsgKyAwLjczNjQ4ODM4MDc3MzMxNjgpOworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDI1NSArIGMgKiAoMC4wMDAwMTM1OTg2NTA0MTEzODUzMDcgKiBjICsgMC4wMDAxMjQyMzk1NjE3NTQ5MDg1MSAqIG0gKyAwLjAwMDQ3NTE5ODUwOTc1ODM1ODkgKiB5IC0gMC4wMDAwMDM2NzI5MzE3NDc2NjMwNDIyICogayAtIDAuMDU1NjIxODY5ODAyNjQwMzQpICsgbSAqICgwLjAwMDE2MTQxMzgwNTk4NzI0Njc2ICogbSArIDAuMDAwOTY5MjIzOTEzMDcyNTE4NiAqIHkgKyAwLjAwMDc3ODI2OTI0NTAwMzYyNTMgKiBrIC0gMC40NDAxNTIzMjM2NzUyNjQ2MykgKyB5ICogKDUuMDY4ODgyOTE0MDY4NzY5ZS03ICogeSArIDAuMDAxNzc3ODM2OTAxMTM3NTA3MSAqIGsgLSAwLjc1OTE0NTQ2NDk3NDk2MDkpIC0gayAqICgwLjAwMDM0MzUzMTk5NjUxMDU1NTMgKiBrICsgMC43MDYzNzcwMTg2MTYwMTQ0KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgb2Zmc2V0KTsKKyAgICB9LAorCisgICAgZ2V0RGF0YSh7CisgICAgICB3aWR0aCwKKyAgICAgIGhlaWdodCwKKyAgICAgIGZvcmNlUkdCID0gZmFsc2UsCisgICAgICBpc1NvdXJjZVBERiA9IGZhbHNlCisgICAgfSkgeworICAgICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA+IDQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZSIpOworICAgICAgfQorCisgICAgICB2YXIgZGF0YSA9IHRoaXMuX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCwgaXNTb3VyY2VQREYpOworCisgICAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAxICYmIGZvcmNlUkdCKSB7CisgICAgICAgIHZhciBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgICAgIHZhciByZ2JEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGFMZW5ndGggKiAzKTsKKyAgICAgICAgdmFyIG9mZnNldCA9IDA7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIgZ3JheUNvbG9yID0gZGF0YVtpXTsKKyAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKKyAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKKyAgICAgICAgICByZ2JEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZ2JEYXRhOworICAgICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMgJiYgdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihkYXRhKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSA0KSB7CisgICAgICAgIGlmICh0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCkgeworICAgICAgICAgIGlmIChmb3JjZVJHQikgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2IoZGF0YSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9DbXlrKGRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKGZvcmNlUkdCKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgIH07CisgIHJldHVybiBKcGVnSW1hZ2U7Cit9KCk7CisKK2V4cG9ydHMuSnBlZ0ltYWdlID0gSnBlZ0ltYWdlOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL2pweC5qcyBiL2xpYi9jb3JlL2pweC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmMxZGViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvanB4LmpzCkBAIC0wLDAgKzEsMjM1MSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuSnB4SW1hZ2UgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfY29yZV91dGlscyA9IHJlcXVpcmUoIi4vY29yZV91dGlscy5qcyIpOworCit2YXIgX2FyaXRobWV0aWNfZGVjb2RlciA9IHJlcXVpcmUoIi4vYXJpdGhtZXRpY19kZWNvZGVyLmpzIik7CisKK2NsYXNzIEpweEVycm9yIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7CisgIGNvbnN0cnVjdG9yKG1zZykgeworICAgIHN1cGVyKGBKUFggZXJyb3I6ICR7bXNnfWApOworICB9CisKK30KKwordmFyIEpweEltYWdlID0gZnVuY3Rpb24gSnB4SW1hZ2VDbG9zdXJlKCkgeworICB2YXIgU3ViYmFuZHNHYWluTG9nMiA9IHsKKyAgICBMTDogMCwKKyAgICBMSDogMSwKKyAgICBITDogMSwKKyAgICBISDogMgorICB9OworCisgIGZ1bmN0aW9uIEpweEltYWdlKCkgeworICAgIHRoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2UgPSBmYWxzZTsKKyAgfQorCisgIEpweEltYWdlLnByb3RvdHlwZSA9IHsKKyAgICBwYXJzZTogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2UoZGF0YSkgeworICAgICAgdmFyIGhlYWQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgMCk7CisKKyAgICAgIGlmIChoZWFkID09PSAweGZmNGYpIHsKKyAgICAgICAgdGhpcy5wYXJzZUNvZGVzdHJlYW0oZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBwb3NpdGlvbiA9IDAsCisgICAgICAgICAgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CisKKyAgICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkgeworICAgICAgICB2YXIgaGVhZGVyU2l6ZSA9IDg7CisgICAgICAgIHZhciBsYm94ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgdmFyIHRib3ggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KTsKKyAgICAgICAgcG9zaXRpb24gKz0gaGVhZGVyU2l6ZTsKKworICAgICAgICBpZiAobGJveCA9PT0gMSkgeworICAgICAgICAgIGxib3ggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pICogNDI5NDk2NzI5NiArICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpOworICAgICAgICAgIHBvc2l0aW9uICs9IDg7CisgICAgICAgICAgaGVhZGVyU2l6ZSArPSA4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxib3ggPT09IDApIHsKKyAgICAgICAgICBsYm94ID0gbGVuZ3RoIC0gcG9zaXRpb24gKyBoZWFkZXJTaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxib3ggPCBoZWFkZXJTaXplKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJJbnZhbGlkIGJveCBmaWVsZCBzaXplIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YUxlbmd0aCA9IGxib3ggLSBoZWFkZXJTaXplOworICAgICAgICB2YXIganVtcERhdGFMZW5ndGggPSB0cnVlOworCisgICAgICAgIHN3aXRjaCAodGJveCkgeworICAgICAgICAgIGNhc2UgMHg2YTcwMzI2ODoKKyAgICAgICAgICAgIGp1bXBEYXRhTGVuZ3RoID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHg2MzZmNmM3MjoKKyAgICAgICAgICAgIHZhciBtZXRob2QgPSBkYXRhW3Bvc2l0aW9uXTsKKworICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gMSkgeworICAgICAgICAgICAgICB2YXIgY29sb3JzcGFjZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDMpOworCisgICAgICAgICAgICAgIHN3aXRjaCAoY29sb3JzcGFjZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmtub3duIGNvbG9yc3BhY2UgIiArIGNvbG9yc3BhY2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAyKSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiSUNDIHByb2ZpbGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHg2YTcwMzI2MzoKKyAgICAgICAgICAgIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHBvc2l0aW9uLCBwb3NpdGlvbiArIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDB4NmE1MDIwMjA6CisgICAgICAgICAgICBpZiAoKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSAhPT0gMHgwZDBhODcwYSkgeworICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgSlAyIHNpZ25hdHVyZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMHg2YTUwMWExYToKKyAgICAgICAgICBjYXNlIDB4NjY3NDc5NzA6CisgICAgICAgICAgY2FzZSAweDcyNzI2NTcxOgorICAgICAgICAgIGNhc2UgMHg3MjY1NzMyMDoKKyAgICAgICAgICBjYXNlIDB4Njk2ODY0NzI6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2YXIgaGVhZGVyVHlwZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGJveCA+PiAyNCAmIDB4ZmYsIHRib3ggPj4gMTYgJiAweGZmLCB0Ym94ID4+IDggJiAweGZmLCB0Ym94ICYgMHhmZik7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuc3VwcG9ydGVkIGhlYWRlciB0eXBlICIgKyB0Ym94ICsgIiAoIiArIGhlYWRlclR5cGUgKyAiKSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoanVtcERhdGFMZW5ndGgpIHsKKyAgICAgICAgICBwb3NpdGlvbiArPSBkYXRhTGVuZ3RoOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBwYXJzZUltYWdlUHJvcGVydGllczogZnVuY3Rpb24gSnB4SW1hZ2VfcGFyc2VJbWFnZVByb3BlcnRpZXMoc3RyZWFtKSB7CisgICAgICB2YXIgbmV3Qnl0ZSA9IHN0cmVhbS5nZXRCeXRlKCk7CisKKyAgICAgIHdoaWxlIChuZXdCeXRlID49IDApIHsKKyAgICAgICAgdmFyIG9sZEJ5dGUgPSBuZXdCeXRlOworICAgICAgICBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKKyAgICAgICAgdmFyIGNvZGUgPSBvbGRCeXRlIDw8IDggfCBuZXdCeXRlOworCisgICAgICAgIGlmIChjb2RlID09PSAweGZmNTEpIHsKKyAgICAgICAgICBzdHJlYW0uc2tpcCg0KTsKKyAgICAgICAgICB2YXIgWHNpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOworICAgICAgICAgIHZhciBZc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgdmFyIFhPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgdmFyIFlPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CisgICAgICAgICAgc3RyZWFtLnNraXAoMTYpOworICAgICAgICAgIHZhciBDc2l6ID0gc3RyZWFtLmdldFVpbnQxNigpOworICAgICAgICAgIHRoaXMud2lkdGggPSBYc2l6IC0gWE9zaXo7CisgICAgICAgICAgdGhpcy5oZWlnaHQgPSBZc2l6IC0gWU9zaXo7CisgICAgICAgICAgdGhpcy5jb21wb25lbnRzQ291bnQgPSBDc2l6OworICAgICAgICAgIHRoaXMuYml0c1BlckNvbXBvbmVudCA9IDg7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbSIpOworICAgIH0sCisgICAgcGFyc2VDb2Rlc3RyZWFtOiBmdW5jdGlvbiBKcHhJbWFnZV9wYXJzZUNvZGVzdHJlYW0oZGF0YSwgc3RhcnQsIGVuZCkgeworICAgICAgdmFyIGNvbnRleHQgPSB7fTsKKyAgICAgIHZhciBkb05vdFJlY292ZXIgPSBmYWxzZTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgdmFyIHBvc2l0aW9uID0gc3RhcnQ7CisKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uICsgMSA8IGVuZCkgeworICAgICAgICAgIHZhciBjb2RlID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKKyAgICAgICAgICBwb3NpdGlvbiArPSAyOworICAgICAgICAgIHZhciBsZW5ndGggPSAwLAorICAgICAgICAgICAgICBqLAorICAgICAgICAgICAgICBzcWNkLAorICAgICAgICAgICAgICBzcHFjZHMsCisgICAgICAgICAgICAgIHNwcWNkU2l6ZSwKKyAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkLAorICAgICAgICAgICAgICB0aWxlOworCisgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgICAgICBjYXNlIDB4ZmY0ZjoKKyAgICAgICAgICAgICAgY29udGV4dC5tYWluSGVhZGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZmQ5OgorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNTE6CisgICAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgIHZhciBzaXogPSB7fTsKKyAgICAgICAgICAgICAgc2l6LlhzaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KTsKKyAgICAgICAgICAgICAgc2l6LllzaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA4KTsKKyAgICAgICAgICAgICAgc2l6LlhPc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMTIpOworICAgICAgICAgICAgICBzaXouWU9zaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAxNik7CisgICAgICAgICAgICAgIHNpei5YVHNpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDIwKTsKKyAgICAgICAgICAgICAgc2l6LllUc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMjQpOworICAgICAgICAgICAgICBzaXouWFRPc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMjgpOworICAgICAgICAgICAgICBzaXouWVRPc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMzIpOworICAgICAgICAgICAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uICsgMzYpOworICAgICAgICAgICAgICBzaXouQ3NpeiA9IGNvbXBvbmVudHNDb3VudDsKKyAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTsKKyAgICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMzg7CisKKyAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB7CisgICAgICAgICAgICAgICAgICBwcmVjaXNpb246IChkYXRhW2pdICYgMHg3ZikgKyAxLAorICAgICAgICAgICAgICAgICAgaXNTaWduZWQ6ICEhKGRhdGFbal0gJiAweDgwKSwKKyAgICAgICAgICAgICAgICAgIFhSc2l6OiBkYXRhW2ogKyAxXSwKKyAgICAgICAgICAgICAgICAgIFlSc2l6OiBkYXRhW2ogKyAyXQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgaiArPSAzOworICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnMoY29tcG9uZW50LCBzaXopOworICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29udGV4dC5TSVogPSBzaXo7CisgICAgICAgICAgICAgIGNvbnRleHQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7CisgICAgICAgICAgICAgIGNhbGN1bGF0ZVRpbGVHcmlkcyhjb250ZXh0LCBjb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgY29udGV4dC5RQ0MgPSBbXTsKKyAgICAgICAgICAgICAgY29udGV4dC5DT0MgPSBbXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjVjOgorICAgICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgICAgICB2YXIgcWNkID0ge307CisgICAgICAgICAgICAgIGogPSBwb3NpdGlvbiArIDI7CisgICAgICAgICAgICAgIHNxY2QgPSBkYXRhW2orK107CisKKyAgICAgICAgICAgICAgc3dpdGNoIChzcWNkICYgMHgxZikgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSAxNjsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSAxNjsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiICsgc3FjZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBxY2Qubm9RdWFudGl6YXRpb24gPSBzcHFjZFNpemUgPT09IDg7CisgICAgICAgICAgICAgIHFjZC5zY2FsYXJFeHBvdW5kZWQgPSBzY2FsYXJFeHBvdW5kZWQ7CisgICAgICAgICAgICAgIHFjZC5ndWFyZEJpdHMgPSBzcWNkID4+IDU7CisgICAgICAgICAgICAgIHNwcWNkcyA9IFtdOworCisgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICsgcG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICB2YXIgc3BxY2QgPSB7fTsKKworICAgICAgICAgICAgICAgIGlmIChzcHFjZFNpemUgPT09IDgpIHsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLmVwc2lsb24gPSBkYXRhW2orK10gPj4gMzsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLm11ID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbal0gPj4gMzsKKyAgICAgICAgICAgICAgICAgIHNwcWNkLm11ID0gKGRhdGFbal0gJiAweDcpIDw8IDggfCBkYXRhW2ogKyAxXTsKKyAgICAgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcHFjZHMucHVzaChzcHFjZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBxY2QuU1BxY2RzID0gc3BxY2RzOworCisgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LlFDRCA9IHFjZDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRCA9IHFjZDsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQyA9IFtdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjVkOgorICAgICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgICAgICB2YXIgcWNjID0ge307CisgICAgICAgICAgICAgIGogPSBwb3NpdGlvbiArIDI7CisgICAgICAgICAgICAgIHZhciBjcWNjOworCisgICAgICAgICAgICAgIGlmIChjb250ZXh0LlNJWi5Dc2l6IDwgMjU3KSB7CisgICAgICAgICAgICAgICAgY3FjYyA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjcWNjID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIGopOworICAgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHNxY2QgPSBkYXRhW2orK107CisKKyAgICAgICAgICAgICAgc3dpdGNoIChzcWNkICYgMHgxZikgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSAxNjsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICBzcHFjZFNpemUgPSAxNjsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckV4cG91bmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiICsgc3FjZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBxY2Mubm9RdWFudGl6YXRpb24gPSBzcHFjZFNpemUgPT09IDg7CisgICAgICAgICAgICAgIHFjYy5zY2FsYXJFeHBvdW5kZWQgPSBzY2FsYXJFeHBvdW5kZWQ7CisgICAgICAgICAgICAgIHFjYy5ndWFyZEJpdHMgPSBzcWNkID4+IDU7CisgICAgICAgICAgICAgIHNwcWNkcyA9IFtdOworCisgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICsgcG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBzcHFjZCA9IHt9OworCisgICAgICAgICAgICAgICAgaWYgKHNwcWNkU2l6ZSA9PT0gOCkgeworICAgICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbaisrXSA+PiAzOworICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqXSA+PiAzOworICAgICAgICAgICAgICAgICAgc3BxY2QubXUgPSAoZGF0YVtqXSAmIDB4NykgPDwgOCB8IGRhdGFbaiArIDFdOworICAgICAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwcWNkcy5wdXNoKHNwcWNkKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHFjYy5TUHFjZHMgPSBzcHFjZHM7CisKKyAgICAgICAgICAgICAgaWYgKGNvbnRleHQubWFpbkhlYWRlcikgeworICAgICAgICAgICAgICAgIGNvbnRleHQuUUNDW2NxY2NdID0gcWNjOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NxY2NdID0gcWNjOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjUyOgorICAgICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgICAgICB2YXIgY29kID0ge307CisgICAgICAgICAgICAgIGogPSBwb3NpdGlvbiArIDI7CisgICAgICAgICAgICAgIHZhciBzY29kID0gZGF0YVtqKytdOworICAgICAgICAgICAgICBjb2QuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cyA9ICEhKHNjb2QgJiAxKTsKKyAgICAgICAgICAgICAgY29kLnNvcE1hcmtlclVzZWQgPSAhIShzY29kICYgMik7CisgICAgICAgICAgICAgIGNvZC5lcGhNYXJrZXJVc2VkID0gISEoc2NvZCAmIDQpOworICAgICAgICAgICAgICBjb2QucHJvZ3Jlc3Npb25PcmRlciA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgY29kLmxheWVyc0NvdW50ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIGopOworICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgIGNvZC5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgY29kLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IGRhdGFbaisrXTsKKyAgICAgICAgICAgICAgY29kLnhjYiA9IChkYXRhW2orK10gJiAweGYpICsgMjsKKyAgICAgICAgICAgICAgY29kLnljYiA9IChkYXRhW2orK10gJiAweGYpICsgMjsKKyAgICAgICAgICAgICAgdmFyIGJsb2NrU3R5bGUgPSBkYXRhW2orK107CisgICAgICAgICAgICAgIGNvZC5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzID0gISEoYmxvY2tTdHlsZSAmIDEpOworICAgICAgICAgICAgICBjb2QucmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcyA9ICEhKGJsb2NrU3R5bGUgJiAyKTsKKyAgICAgICAgICAgICAgY29kLnRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcyA9ICEhKGJsb2NrU3R5bGUgJiA0KTsKKyAgICAgICAgICAgICAgY29kLnZlcnRpY2FsbHlTdHJpcGUgPSAhIShibG9ja1N0eWxlICYgOCk7CisgICAgICAgICAgICAgIGNvZC5wcmVkaWN0YWJsZVRlcm1pbmF0aW9uID0gISEoYmxvY2tTdHlsZSAmIDE2KTsKKyAgICAgICAgICAgICAgY29kLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQgPSAhIShibG9ja1N0eWxlICYgMzIpOworICAgICAgICAgICAgICBjb2QucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uID0gZGF0YVtqKytdOworCisgICAgICAgICAgICAgIGlmIChjb2QuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cykgeworICAgICAgICAgICAgICAgIHZhciBwcmVjaW5jdHNTaXplcyA9IFtdOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgdmFyIHByZWNpbmN0c1NpemUgPSBkYXRhW2orK107CisgICAgICAgICAgICAgICAgICBwcmVjaW5jdHNTaXplcy5wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgUFB4OiBwcmVjaW5jdHNTaXplICYgMHhmLAorICAgICAgICAgICAgICAgICAgICBQUHk6IHByZWNpbmN0c1NpemUgPj4gNAorICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29kLnByZWNpbmN0c1NpemVzID0gcHJlY2luY3RzU2l6ZXM7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgdW5zdXBwb3J0ZWQgPSBbXTsKKworICAgICAgICAgICAgICBpZiAoY29kLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MpIHsKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKCJzZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoY29kLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMpIHsKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZC5wdXNoKCJyZXNldENvbnRleHRQcm9iYWJpbGl0aWVzIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoY29kLnRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcykgeworICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcyIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvZC52ZXJ0aWNhbGx5U3RyaXBlKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgidmVydGljYWxseVN0cmlwZSIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvZC5wcmVkaWN0YWJsZVRlcm1pbmF0aW9uKSB7CisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgicHJlZGljdGFibGVUZXJtaW5hdGlvbiIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBkb05vdFJlY292ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgQ09EIG9wdGlvbnMgKCIgKyB1bnN1cHBvcnRlZC5qb2luKCIsICIpICsgIikiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm1haW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LkNPRCA9IGNvZDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLkNPRCA9IGNvZDsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQyA9IFtdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjkwOgorICAgICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgICAgICB0aWxlID0ge307CisgICAgICAgICAgICAgIHRpbGUuaW5kZXggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24gKyAyKTsKKyAgICAgICAgICAgICAgdGlsZS5sZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KTsKKyAgICAgICAgICAgICAgdGlsZS5kYXRhRW5kID0gdGlsZS5sZW5ndGggKyBwb3NpdGlvbiAtIDI7CisgICAgICAgICAgICAgIHRpbGUucGFydEluZGV4ID0gZGF0YVtwb3NpdGlvbiArIDhdOworICAgICAgICAgICAgICB0aWxlLnBhcnRzQ291bnQgPSBkYXRhW3Bvc2l0aW9uICsgOV07CisgICAgICAgICAgICAgIGNvbnRleHQubWFpbkhlYWRlciA9IGZhbHNlOworCisgICAgICAgICAgICAgIGlmICh0aWxlLnBhcnRJbmRleCA9PT0gMCkgeworICAgICAgICAgICAgICAgIHRpbGUuQ09EID0gY29udGV4dC5DT0Q7CisgICAgICAgICAgICAgICAgdGlsZS5DT0MgPSBjb250ZXh0LkNPQy5zbGljZSgwKTsKKyAgICAgICAgICAgICAgICB0aWxlLlFDRCA9IGNvbnRleHQuUUNEOworICAgICAgICAgICAgICAgIHRpbGUuUUNDID0gY29udGV4dC5RQ0Muc2xpY2UoMCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaWxlID0gdGlsZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjkzOgorICAgICAgICAgICAgICB0aWxlID0gY29udGV4dC5jdXJyZW50VGlsZTsKKworICAgICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplVGlsZShjb250ZXh0LCB0aWxlLmluZGV4KTsKKyAgICAgICAgICAgICAgICBidWlsZFBhY2tldHMoY29udGV4dCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBsZW5ndGggPSB0aWxlLmRhdGFFbmQgLSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgcGFyc2VUaWxlUGFja2V0cyhjb250ZXh0LCBkYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhmZjU1OgorICAgICAgICAgICAgY2FzZSAweGZmNTc6CisgICAgICAgICAgICBjYXNlIDB4ZmY1ODoKKyAgICAgICAgICAgIGNhc2UgMHhmZjY0OgorICAgICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGZmNTM6CisgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ29kZXN0cmVhbSBjb2RlIDB4RkY1MyAoQ09DKSBpcyBub3QgaW1wbGVtZW50ZWQiKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvZGVzdHJlYW0gY29kZTogIiArIGNvZGUudG9TdHJpbmcoMTYpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgaWYgKGRvTm90UmVjb3ZlciB8fCB0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKGUubWVzc2FnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJKUFg6IFRyeWluZyB0byByZWNvdmVyIGZyb206ICIgKyBlLm1lc3NhZ2UpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMudGlsZXMgPSB0cmFuc2Zvcm1Db21wb25lbnRzKGNvbnRleHQpOworICAgICAgdGhpcy53aWR0aCA9IGNvbnRleHQuU0laLlhzaXogLSBjb250ZXh0LlNJWi5YT3NpejsKKyAgICAgIHRoaXMuaGVpZ2h0ID0gY29udGV4dC5TSVouWXNpeiAtIGNvbnRleHQuU0laLllPc2l6OworICAgICAgdGhpcy5jb21wb25lbnRzQ291bnQgPSBjb250ZXh0LlNJWi5Dc2l6OworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGNvbXBvbmVudCwgc2l6KSB7CisgICAgY29tcG9uZW50LngwID0gTWF0aC5jZWlsKHNpei5YT3NpeiAvIGNvbXBvbmVudC5YUnNpeik7CisgICAgY29tcG9uZW50LngxID0gTWF0aC5jZWlsKHNpei5Yc2l6IC8gY29tcG9uZW50LlhSc2l6KTsKKyAgICBjb21wb25lbnQueTAgPSBNYXRoLmNlaWwoc2l6LllPc2l6IC8gY29tcG9uZW50LllSc2l6KTsKKyAgICBjb21wb25lbnQueTEgPSBNYXRoLmNlaWwoc2l6LllzaXogLyBjb21wb25lbnQuWVJzaXopOworICAgIGNvbXBvbmVudC53aWR0aCA9IGNvbXBvbmVudC54MSAtIGNvbXBvbmVudC54MDsKKyAgICBjb21wb25lbnQuaGVpZ2h0ID0gY29tcG9uZW50LnkxIC0gY29tcG9uZW50LnkwOworICB9CisKKyAgZnVuY3Rpb24gY2FsY3VsYXRlVGlsZUdyaWRzKGNvbnRleHQsIGNvbXBvbmVudHMpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGUsCisgICAgICAgIHRpbGVzID0gW107CisgICAgdmFyIG51bVh0aWxlcyA9IE1hdGguY2VpbCgoc2l6LlhzaXogLSBzaXouWFRPc2l6KSAvIHNpei5YVHNpeik7CisgICAgdmFyIG51bVl0aWxlcyA9IE1hdGguY2VpbCgoc2l6LllzaXogLSBzaXouWVRPc2l6KSAvIHNpei5ZVHNpeik7CisKKyAgICBmb3IgKHZhciBxID0gMDsgcSA8IG51bVl0aWxlczsgcSsrKSB7CisgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IG51bVh0aWxlczsgcCsrKSB7CisgICAgICAgIHRpbGUgPSB7fTsKKyAgICAgICAgdGlsZS50eDAgPSBNYXRoLm1heChzaXouWFRPc2l6ICsgcCAqIHNpei5YVHNpeiwgc2l6LlhPc2l6KTsKKyAgICAgICAgdGlsZS50eTAgPSBNYXRoLm1heChzaXouWVRPc2l6ICsgcSAqIHNpei5ZVHNpeiwgc2l6LllPc2l6KTsKKyAgICAgICAgdGlsZS50eDEgPSBNYXRoLm1pbihzaXouWFRPc2l6ICsgKHAgKyAxKSAqIHNpei5YVHNpeiwgc2l6LlhzaXopOworICAgICAgICB0aWxlLnR5MSA9IE1hdGgubWluKHNpei5ZVE9zaXogKyAocSArIDEpICogc2l6LllUc2l6LCBzaXouWXNpeik7CisgICAgICAgIHRpbGUud2lkdGggPSB0aWxlLnR4MSAtIHRpbGUudHgwOworICAgICAgICB0aWxlLmhlaWdodCA9IHRpbGUudHkxIC0gdGlsZS50eTA7CisgICAgICAgIHRpbGUuY29tcG9uZW50cyA9IFtdOworICAgICAgICB0aWxlcy5wdXNoKHRpbGUpOworICAgICAgfQorICAgIH0KKworICAgIGNvbnRleHQudGlsZXMgPSB0aWxlczsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjb21wb25lbnRzQ291bnQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTsKKworICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gdGlsZXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICB2YXIgdGlsZUNvbXBvbmVudCA9IHt9OworICAgICAgICB0aWxlID0gdGlsZXNbal07CisgICAgICAgIHRpbGVDb21wb25lbnQudGN4MCA9IE1hdGguY2VpbCh0aWxlLnR4MCAvIGNvbXBvbmVudC5YUnNpeik7CisgICAgICAgIHRpbGVDb21wb25lbnQudGN5MCA9IE1hdGguY2VpbCh0aWxlLnR5MCAvIGNvbXBvbmVudC5ZUnNpeik7CisgICAgICAgIHRpbGVDb21wb25lbnQudGN4MSA9IE1hdGguY2VpbCh0aWxlLnR4MSAvIGNvbXBvbmVudC5YUnNpeik7CisgICAgICAgIHRpbGVDb21wb25lbnQudGN5MSA9IE1hdGguY2VpbCh0aWxlLnR5MSAvIGNvbXBvbmVudC5ZUnNpeik7CisgICAgICAgIHRpbGVDb21wb25lbnQud2lkdGggPSB0aWxlQ29tcG9uZW50LnRjeDEgLSB0aWxlQ29tcG9uZW50LnRjeDA7CisgICAgICAgIHRpbGVDb21wb25lbnQuaGVpZ2h0ID0gdGlsZUNvbXBvbmVudC50Y3kxIC0gdGlsZUNvbXBvbmVudC50Y3kwOworICAgICAgICB0aWxlLmNvbXBvbmVudHNbaV0gPSB0aWxlQ29tcG9uZW50OworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGdldEJsb2Nrc0RpbWVuc2lvbnMoY29udGV4dCwgY29tcG9uZW50LCByKSB7CisgICAgdmFyIGNvZE9yQ29jID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVyczsKKyAgICB2YXIgcmVzdWx0ID0ge307CisKKyAgICBpZiAoIWNvZE9yQ29jLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpIHsKKyAgICAgIHJlc3VsdC5QUHggPSAxNTsKKyAgICAgIHJlc3VsdC5QUHkgPSAxNTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0LlBQeCA9IGNvZE9yQ29jLnByZWNpbmN0c1NpemVzW3JdLlBQeDsKKyAgICAgIHJlc3VsdC5QUHkgPSBjb2RPckNvYy5wcmVjaW5jdHNTaXplc1tyXS5QUHk7CisgICAgfQorCisgICAgcmVzdWx0LnhjYl8gPSByID4gMCA/IE1hdGgubWluKGNvZE9yQ29jLnhjYiwgcmVzdWx0LlBQeCAtIDEpIDogTWF0aC5taW4oY29kT3JDb2MueGNiLCByZXN1bHQuUFB4KTsKKyAgICByZXN1bHQueWNiXyA9IHIgPiAwID8gTWF0aC5taW4oY29kT3JDb2MueWNiLCByZXN1bHQuUFB5IC0gMSkgOiBNYXRoLm1pbihjb2RPckNvYy55Y2IsIHJlc3VsdC5QUHkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBmdW5jdGlvbiBidWlsZFByZWNpbmN0cyhjb250ZXh0LCByZXNvbHV0aW9uLCBkaW1lbnNpb25zKSB7CisgICAgdmFyIHByZWNpbmN0V2lkdGggPSAxIDw8IGRpbWVuc2lvbnMuUFB4OworICAgIHZhciBwcmVjaW5jdEhlaWdodCA9IDEgPDwgZGltZW5zaW9ucy5QUHk7CisgICAgdmFyIGlzWmVyb1JlcyA9IHJlc29sdXRpb24ucmVzTGV2ZWwgPT09IDA7CisgICAgdmFyIHByZWNpbmN0V2lkdGhJblN1YmJhbmQgPSAxIDw8IGRpbWVuc2lvbnMuUFB4ICsgKGlzWmVyb1JlcyA/IDAgOiAtMSk7CisgICAgdmFyIHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kID0gMSA8PCBkaW1lbnNpb25zLlBQeSArIChpc1plcm9SZXMgPyAwIDogLTEpOworICAgIHZhciBudW1wcmVjaW5jdHN3aWRlID0gcmVzb2x1dGlvbi50cngxID4gcmVzb2x1dGlvbi50cngwID8gTWF0aC5jZWlsKHJlc29sdXRpb24udHJ4MSAvIHByZWNpbmN0V2lkdGgpIC0gTWF0aC5mbG9vcihyZXNvbHV0aW9uLnRyeDAgLyBwcmVjaW5jdFdpZHRoKSA6IDA7CisgICAgdmFyIG51bXByZWNpbmN0c2hpZ2ggPSByZXNvbHV0aW9uLnRyeTEgPiByZXNvbHV0aW9uLnRyeTAgPyBNYXRoLmNlaWwocmVzb2x1dGlvbi50cnkxIC8gcHJlY2luY3RIZWlnaHQpIC0gTWF0aC5mbG9vcihyZXNvbHV0aW9uLnRyeTAgLyBwcmVjaW5jdEhlaWdodCkgOiAwOworICAgIHZhciBudW1wcmVjaW5jdHMgPSBudW1wcmVjaW5jdHN3aWRlICogbnVtcHJlY2luY3RzaGlnaDsKKyAgICByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycyA9IHsKKyAgICAgIHByZWNpbmN0V2lkdGgsCisgICAgICBwcmVjaW5jdEhlaWdodCwKKyAgICAgIG51bXByZWNpbmN0c3dpZGUsCisgICAgICBudW1wcmVjaW5jdHNoaWdoLAorICAgICAgbnVtcHJlY2luY3RzLAorICAgICAgcHJlY2luY3RXaWR0aEluU3ViYmFuZCwKKyAgICAgIHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBkaW1lbnNpb25zKSB7CisgICAgdmFyIHhjYl8gPSBkaW1lbnNpb25zLnhjYl87CisgICAgdmFyIHljYl8gPSBkaW1lbnNpb25zLnljYl87CisgICAgdmFyIGNvZGVibG9ja1dpZHRoID0gMSA8PCB4Y2JfOworICAgIHZhciBjb2RlYmxvY2tIZWlnaHQgPSAxIDw8IHljYl87CisgICAgdmFyIGNieDAgPSBzdWJiYW5kLnRieDAgPj4geGNiXzsKKyAgICB2YXIgY2J5MCA9IHN1YmJhbmQudGJ5MCA+PiB5Y2JfOworICAgIHZhciBjYngxID0gc3ViYmFuZC50YngxICsgY29kZWJsb2NrV2lkdGggLSAxID4+IHhjYl87CisgICAgdmFyIGNieTEgPSBzdWJiYW5kLnRieTEgKyBjb2RlYmxvY2tIZWlnaHQgLSAxID4+IHljYl87CisgICAgdmFyIHByZWNpbmN0UGFyYW1ldGVycyA9IHN1YmJhbmQucmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnM7CisgICAgdmFyIGNvZGVibG9ja3MgPSBbXTsKKyAgICB2YXIgcHJlY2luY3RzID0gW107CisgICAgdmFyIGksIGosIGNvZGVibG9jaywgcHJlY2luY3ROdW1iZXI7CisKKyAgICBmb3IgKGogPSBjYnkwOyBqIDwgY2J5MTsgaisrKSB7CisgICAgICBmb3IgKGkgPSBjYngwOyBpIDwgY2J4MTsgaSsrKSB7CisgICAgICAgIGNvZGVibG9jayA9IHsKKyAgICAgICAgICBjYng6IGksCisgICAgICAgICAgY2J5OiBqLAorICAgICAgICAgIHRieDA6IGNvZGVibG9ja1dpZHRoICogaSwKKyAgICAgICAgICB0YnkwOiBjb2RlYmxvY2tIZWlnaHQgKiBqLAorICAgICAgICAgIHRieDE6IGNvZGVibG9ja1dpZHRoICogKGkgKyAxKSwKKyAgICAgICAgICB0YnkxOiBjb2RlYmxvY2tIZWlnaHQgKiAoaiArIDEpCisgICAgICAgIH07CisgICAgICAgIGNvZGVibG9jay50YngwXyA9IE1hdGgubWF4KHN1YmJhbmQudGJ4MCwgY29kZWJsb2NrLnRieDApOworICAgICAgICBjb2RlYmxvY2sudGJ5MF8gPSBNYXRoLm1heChzdWJiYW5kLnRieTAsIGNvZGVibG9jay50YnkwKTsKKyAgICAgICAgY29kZWJsb2NrLnRieDFfID0gTWF0aC5taW4oc3ViYmFuZC50YngxLCBjb2RlYmxvY2sudGJ4MSk7CisgICAgICAgIGNvZGVibG9jay50YnkxXyA9IE1hdGgubWluKHN1YmJhbmQudGJ5MSwgY29kZWJsb2NrLnRieTEpOworICAgICAgICB2YXIgcGkgPSBNYXRoLmZsb29yKChjb2RlYmxvY2sudGJ4MF8gLSBzdWJiYW5kLnRieDApIC8gcHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0V2lkdGhJblN1YmJhbmQpOworICAgICAgICB2YXIgcGogPSBNYXRoLmZsb29yKChjb2RlYmxvY2sudGJ5MF8gLSBzdWJiYW5kLnRieTApIC8gcHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kKTsKKyAgICAgICAgcHJlY2luY3ROdW1iZXIgPSBwaSArIHBqICogcHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7CisgICAgICAgIGNvZGVibG9jay5wcmVjaW5jdE51bWJlciA9IHByZWNpbmN0TnVtYmVyOworICAgICAgICBjb2RlYmxvY2suc3ViYmFuZFR5cGUgPSBzdWJiYW5kLnR5cGU7CisgICAgICAgIGNvZGVibG9jay5MYmxvY2sgPSAzOworCisgICAgICAgIGlmIChjb2RlYmxvY2sudGJ4MV8gPD0gY29kZWJsb2NrLnRieDBfIHx8IGNvZGVibG9jay50YnkxXyA8PSBjb2RlYmxvY2sudGJ5MF8pIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGVibG9ja3MucHVzaChjb2RlYmxvY2spOworICAgICAgICB2YXIgcHJlY2luY3QgPSBwcmVjaW5jdHNbcHJlY2luY3ROdW1iZXJdOworCisgICAgICAgIGlmIChwcmVjaW5jdCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgaWYgKGkgPCBwcmVjaW5jdC5jYnhNaW4pIHsKKyAgICAgICAgICAgIHByZWNpbmN0LmNieE1pbiA9IGk7CisgICAgICAgICAgfSBlbHNlIGlmIChpID4gcHJlY2luY3QuY2J4TWF4KSB7CisgICAgICAgICAgICBwcmVjaW5jdC5jYnhNYXggPSBpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChqIDwgcHJlY2luY3QuY2J5TWluKSB7CisgICAgICAgICAgICBwcmVjaW5jdC5jYnhNaW4gPSBqOworICAgICAgICAgIH0gZWxzZSBpZiAoaiA+IHByZWNpbmN0LmNieU1heCkgeworICAgICAgICAgICAgcHJlY2luY3QuY2J5TWF4ID0gajsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXSA9IHByZWNpbmN0ID0geworICAgICAgICAgICAgY2J4TWluOiBpLAorICAgICAgICAgICAgY2J5TWluOiBqLAorICAgICAgICAgICAgY2J4TWF4OiBpLAorICAgICAgICAgICAgY2J5TWF4OiBqCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGVibG9jay5wcmVjaW5jdCA9IHByZWNpbmN0OworICAgICAgfQorICAgIH0KKworICAgIHN1YmJhbmQuY29kZWJsb2NrUGFyYW1ldGVycyA9IHsKKyAgICAgIGNvZGVibG9ja1dpZHRoOiB4Y2JfLAorICAgICAgY29kZWJsb2NrSGVpZ2h0OiB5Y2JfLAorICAgICAgbnVtY29kZWJsb2Nrd2lkZTogY2J4MSAtIGNieDAgKyAxLAorICAgICAgbnVtY29kZWJsb2NraGlnaDogY2J5MSAtIGNieTAgKyAxCisgICAgfTsKKyAgICBzdWJiYW5kLmNvZGVibG9ja3MgPSBjb2RlYmxvY2tzOworICAgIHN1YmJhbmQucHJlY2luY3RzID0gcHJlY2luY3RzOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIHByZWNpbmN0TnVtYmVyLCBsYXllck51bWJlcikgeworICAgIHZhciBwcmVjaW5jdENvZGVibG9ja3MgPSBbXTsKKyAgICB2YXIgc3ViYmFuZHMgPSByZXNvbHV0aW9uLnN1YmJhbmRzOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIHN1YmJhbmQgPSBzdWJiYW5kc1tpXTsKKyAgICAgIHZhciBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzOworCisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBjb2RlYmxvY2tzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgdmFyIGNvZGVibG9jayA9IGNvZGVibG9ja3Nbal07CisKKyAgICAgICAgaWYgKGNvZGVibG9jay5wcmVjaW5jdE51bWJlciAhPT0gcHJlY2luY3ROdW1iZXIpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByZWNpbmN0Q29kZWJsb2Nrcy5wdXNoKGNvZGVibG9jayk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGxheWVyTnVtYmVyLAorICAgICAgY29kZWJsb2NrczogcHJlY2luY3RDb2RlYmxvY2tzCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCkgeworICAgIHZhciBzaXogPSBjb250ZXh0LlNJWjsKKyAgICB2YXIgdGlsZUluZGV4ID0gY29udGV4dC5jdXJyZW50VGlsZS5pbmRleDsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKyAgICB2YXIgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSAwOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBjb21wb25lbnRzQ291bnQ7IHErKykgeworICAgICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CisgICAgfQorCisgICAgdmFyIGwgPSAwLAorICAgICAgICByID0gMCwKKyAgICAgICAgaSA9IDAsCisgICAgICAgIGsgPSAwOworCisgICAgdGhpcy5uZXh0UGFja2V0ID0gZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpIHsKKyAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7IGwrKykgeworICAgICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgeworICAgICAgICAgIGZvciAoOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbaV07CisKKyAgICAgICAgICAgIGlmIChyID4gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgdmFyIG51bXByZWNpbmN0cyA9IHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0czsKKworICAgICAgICAgICAgZm9yICg7IGsgPCBudW1wcmVjaW5jdHM7KSB7CisgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7CisgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKworICAgICAgICByID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gMDsKKworICAgIGZvciAodmFyIHEgPSAwOyBxIDwgY29tcG9uZW50c0NvdW50OyBxKyspIHsKKyAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCwgdGlsZS5jb21wb25lbnRzW3FdLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpOworICAgIH0KKworICAgIHZhciByID0gMCwKKyAgICAgICAgbCA9IDAsCisgICAgICAgIGkgPSAwLAorICAgICAgICBrID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgeworICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OyBsKyspIHsKKyAgICAgICAgICBmb3IgKDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldOworCisgICAgICAgICAgICBpZiAociA+IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKKyAgICAgICAgICAgIHZhciBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CisKKyAgICAgICAgICAgIGZvciAoOyBrIDwgbnVtcHJlY2luY3RzOykgeworICAgICAgICAgICAgICB2YXIgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpOworICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGsgPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbCA9IDA7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihjb250ZXh0KSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIGwsIHIsIGMsIHA7CisgICAgdmFyIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IDA7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKyAgICAgIG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IE1hdGgubWF4KG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCwgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpOworICAgIH0KKworICAgIHZhciBtYXhOdW1QcmVjaW5jdHNJbkxldmVsID0gbmV3IEludDMyQXJyYXkobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ICsgMSk7CisKKyAgICBmb3IgKHIgPSAwOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgKytyKSB7CisgICAgICB2YXIgbWF4TnVtUHJlY2luY3RzID0gMDsKKworICAgICAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7CisgICAgICAgIHZhciByZXNvbHV0aW9ucyA9IHRpbGUuY29tcG9uZW50c1tjXS5yZXNvbHV0aW9uczsKKworICAgICAgICBpZiAociA8IHJlc29sdXRpb25zLmxlbmd0aCkgeworICAgICAgICAgIG1heE51bVByZWNpbmN0cyA9IE1hdGgubWF4KG1heE51bVByZWNpbmN0cywgcmVzb2x1dGlvbnNbcl0ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbWF4TnVtUHJlY2luY3RzSW5MZXZlbFtyXSA9IG1heE51bVByZWNpbmN0czsKKyAgICB9CisKKyAgICBsID0gMDsKKyAgICByID0gMDsKKyAgICBjID0gMDsKKyAgICBwID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgeworICAgICAgICBmb3IgKDsgcCA8IG1heE51bVByZWNpbmN0c0luTGV2ZWxbcl07IHArKykgeworICAgICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKworICAgICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CisgICAgICAgICAgICB2YXIgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzOworCisgICAgICAgICAgICBpZiAocCA+PSBudW1wcmVjaW5jdHMpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CisgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgcCwgbCk7CisgICAgICAgICAgICAgIGwrKzsKKyAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbCA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgYyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwID0gMDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBQb3NpdGlvbkNvbXBvbmVudFJlc29sdXRpb25MYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGxheWVyc0NvdW50ID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50OworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgcHJlY2luY3RzU2l6ZXMgPSBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpOworICAgIHZhciBwcmVjaW5jdHNJdGVyYXRpb25TaXplcyA9IHByZWNpbmN0c1NpemVzOworICAgIHZhciBsID0gMCwKKyAgICAgICAgciA9IDAsCisgICAgICAgIGMgPSAwLAorICAgICAgICBweCA9IDAsCisgICAgICAgIHB5ID0gMDsKKworICAgIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CisgICAgICBmb3IgKDsgcHkgPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1IaWdoOyBweSsrKSB7CisgICAgICAgIGZvciAoOyBweCA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bVdpZGU7IHB4KyspIHsKKyAgICAgICAgICBmb3IgKDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OworCisgICAgICAgICAgICBmb3IgKDsgciA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgeworICAgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKKyAgICAgICAgICAgICAgdmFyIHNpemVJbkltYWdlU2NhbGUgPSBwcmVjaW5jdHNTaXplcy5jb21wb25lbnRzW2NdLnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgICB2YXIgayA9IGdldFByZWNpbmN0SW5kZXhJZkV4aXN0KHB4LCBweSwgc2l6ZUluSW1hZ2VTY2FsZSwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMsIHJlc29sdXRpb24pOworCisgICAgICAgICAgICAgIGlmIChrID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OykgeworICAgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7CisgICAgICAgICAgICAgICAgbCsrOworICAgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBsID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgciA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgYyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBweCA9IDA7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gQ29tcG9uZW50UG9zaXRpb25SZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihjb250ZXh0KSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworICAgIHZhciBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDsKKyAgICB2YXIgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CisgICAgdmFyIHByZWNpbmN0c1NpemVzID0gZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSh0aWxlKTsKKyAgICB2YXIgbCA9IDAsCisgICAgICAgIHIgPSAwLAorICAgICAgICBjID0gMCwKKyAgICAgICAgcHggPSAwLAorICAgICAgICBweSA9IDA7CisKKyAgICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgeworICAgICAgZm9yICg7IGMgPCBjb21wb25lbnRzQ291bnQ7ICsrYykgeworICAgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgICB2YXIgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMgPSBwcmVjaW5jdHNTaXplcy5jb21wb25lbnRzW2NdOworICAgICAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CisKKyAgICAgICAgZm9yICg7IHB5IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtSGlnaDsgcHkrKykgeworICAgICAgICAgIGZvciAoOyBweCA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bVdpZGU7IHB4KyspIHsKKyAgICAgICAgICAgIGZvciAoOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgICB2YXIgc2l6ZUluSW1hZ2VTY2FsZSA9IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLnJlc29sdXRpb25zW3JdOworICAgICAgICAgICAgICB2YXIgayA9IGdldFByZWNpbmN0SW5kZXhJZkV4aXN0KHB4LCBweSwgc2l6ZUluSW1hZ2VTY2FsZSwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMsIHJlc29sdXRpb24pOworCisgICAgICAgICAgICAgIGlmIChrID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OykgeworICAgICAgICAgICAgICAgIHZhciBwYWNrZXQgPSBjcmVhdGVQYWNrZXQocmVzb2x1dGlvbiwgaywgbCk7CisgICAgICAgICAgICAgICAgbCsrOworICAgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBsID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgciA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHkgPSAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFByZWNpbmN0SW5kZXhJZkV4aXN0KHB4SW5kZXgsIHB5SW5kZXgsIHNpemVJbkltYWdlU2NhbGUsIHByZWNpbmN0SXRlcmF0aW9uU2l6ZXMsIHJlc29sdXRpb24pIHsKKyAgICB2YXIgcG9zWCA9IHB4SW5kZXggKiBwcmVjaW5jdEl0ZXJhdGlvblNpemVzLm1pbldpZHRoOworICAgIHZhciBwb3NZID0gcHlJbmRleCAqIHByZWNpbmN0SXRlcmF0aW9uU2l6ZXMubWluSGVpZ2h0OworCisgICAgaWYgKHBvc1ggJSBzaXplSW5JbWFnZVNjYWxlLndpZHRoICE9PSAwIHx8IHBvc1kgJSBzaXplSW5JbWFnZVNjYWxlLmhlaWdodCAhPT0gMCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdmFyIHN0YXJ0UHJlY2luY3RSb3dJbmRleCA9IHBvc1kgLyBzaXplSW5JbWFnZVNjYWxlLndpZHRoICogcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTsKKyAgICByZXR1cm4gcG9zWCAvIHNpemVJbkltYWdlU2NhbGUuaGVpZ2h0ICsgc3RhcnRQcmVjaW5jdFJvd0luZGV4OworICB9CisKKyAgZnVuY3Rpb24gZ2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZSh0aWxlKSB7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHRpbGUuY29tcG9uZW50cy5sZW5ndGg7CisgICAgdmFyIG1pbldpZHRoID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICB2YXIgbWluSGVpZ2h0ID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICB2YXIgbWF4TnVtV2lkZSA9IDA7CisgICAgdmFyIG1heE51bUhpZ2ggPSAwOworICAgIHZhciBzaXplUGVyQ29tcG9uZW50ID0gbmV3IEFycmF5KGNvbXBvbmVudHNDb3VudCk7CisKKyAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CisgICAgICB2YXIgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOworICAgICAgdmFyIGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OworICAgICAgdmFyIHNpemVQZXJSZXNvbHV0aW9uID0gbmV3IEFycmF5KGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCArIDEpOworICAgICAgdmFyIG1pbldpZHRoQ3VycmVudENvbXBvbmVudCA9IE51bWJlci5NQVhfVkFMVUU7CisgICAgICB2YXIgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCA9IE51bWJlci5NQVhfVkFMVUU7CisgICAgICB2YXIgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQgPSAwOworICAgICAgdmFyIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50ID0gMDsKKyAgICAgIHZhciBzY2FsZSA9IDE7CisKKyAgICAgIGZvciAodmFyIHIgPSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIgPj0gMDsgLS1yKSB7CisgICAgICAgIHZhciByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOworICAgICAgICB2YXIgd2lkdGhDdXJyZW50UmVzb2x1dGlvbiA9IHNjYWxlICogcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aDsKKyAgICAgICAgdmFyIGhlaWdodEN1cnJlbnRSZXNvbHV0aW9uID0gc2NhbGUgKiByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5wcmVjaW5jdEhlaWdodDsKKyAgICAgICAgbWluV2lkdGhDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4obWluV2lkdGhDdXJyZW50Q29tcG9uZW50LCB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uKTsKKyAgICAgICAgbWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCA9IE1hdGgubWluKG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQsIGhlaWdodEN1cnJlbnRSZXNvbHV0aW9uKTsKKyAgICAgICAgbWF4TnVtV2lkZUN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCwgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZSk7CisgICAgICAgIG1heE51bUhpZ2hDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5tYXgobWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQsIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c2hpZ2gpOworICAgICAgICBzaXplUGVyUmVzb2x1dGlvbltyXSA9IHsKKyAgICAgICAgICB3aWR0aDogd2lkdGhDdXJyZW50UmVzb2x1dGlvbiwKKyAgICAgICAgICBoZWlnaHQ6IGhlaWdodEN1cnJlbnRSZXNvbHV0aW9uCisgICAgICAgIH07CisgICAgICAgIHNjYWxlIDw8PSAxOworICAgICAgfQorCisgICAgICBtaW5XaWR0aCA9IE1hdGgubWluKG1pbldpZHRoLCBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQpOworICAgICAgbWluSGVpZ2h0ID0gTWF0aC5taW4obWluSGVpZ2h0LCBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50KTsKKyAgICAgIG1heE51bVdpZGUgPSBNYXRoLm1heChtYXhOdW1XaWRlLCBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCk7CisgICAgICBtYXhOdW1IaWdoID0gTWF0aC5tYXgobWF4TnVtSGlnaCwgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQpOworICAgICAgc2l6ZVBlckNvbXBvbmVudFtjXSA9IHsKKyAgICAgICAgcmVzb2x1dGlvbnM6IHNpemVQZXJSZXNvbHV0aW9uLAorICAgICAgICBtaW5XaWR0aDogbWluV2lkdGhDdXJyZW50Q29tcG9uZW50LAorICAgICAgICBtaW5IZWlnaHQ6IG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQsCisgICAgICAgIG1heE51bVdpZGU6IG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LAorICAgICAgICBtYXhOdW1IaWdoOiBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudAorICAgICAgfTsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgY29tcG9uZW50czogc2l6ZVBlckNvbXBvbmVudCwKKyAgICAgIG1pbldpZHRoLAorICAgICAgbWluSGVpZ2h0LAorICAgICAgbWF4TnVtV2lkZSwKKyAgICAgIG1heE51bUhpZ2gKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRQYWNrZXRzKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CisgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworCisgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgeworICAgICAgdmFyIGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKKyAgICAgIHZhciBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKKyAgICAgIHZhciByZXNvbHV0aW9ucyA9IFtdOworICAgICAgdmFyIHN1YmJhbmRzID0gW107CisKKyAgICAgIGZvciAodmFyIHIgPSAwOyByIDw9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CisgICAgICAgIHZhciBibG9ja3NEaW1lbnNpb25zID0gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpOworICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IHt9OworICAgICAgICB2YXIgc2NhbGUgPSAxIDw8IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudCAtIHI7CisgICAgICAgIHJlc29sdXRpb24udHJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIHNjYWxlKTsKKyAgICAgICAgcmVzb2x1dGlvbi50cnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gc2NhbGUpOworICAgICAgICByZXNvbHV0aW9uLnRyeDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBzY2FsZSk7CisgICAgICAgIHJlc29sdXRpb24udHJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIHNjYWxlKTsKKyAgICAgICAgcmVzb2x1dGlvbi5yZXNMZXZlbCA9IHI7CisgICAgICAgIGJ1aWxkUHJlY2luY3RzKGNvbnRleHQsIHJlc29sdXRpb24sIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICByZXNvbHV0aW9ucy5wdXNoKHJlc29sdXRpb24pOworICAgICAgICB2YXIgc3ViYmFuZDsKKworICAgICAgICBpZiAociA9PT0gMCkgeworICAgICAgICAgIHN1YmJhbmQgPSB7fTsKKyAgICAgICAgICBzdWJiYW5kLnR5cGUgPSAiTEwiOworICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIHNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gc2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIHNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOworICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTsKKyAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHJlc29sdXRpb24uc3ViYmFuZHMgPSBbc3ViYmFuZF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIGJzY2FsZSA9IDEgPDwgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50IC0gciArIDE7CisgICAgICAgICAgdmFyIHJlc29sdXRpb25TdWJiYW5kcyA9IFtdOworICAgICAgICAgIHN1YmJhbmQgPSB7fTsKKyAgICAgICAgICBzdWJiYW5kLnR5cGUgPSAiSEwiOworICAgICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSk7CisgICAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKyAgICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7CisgICAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTsKKyAgICAgICAgICBzdWJiYW5kID0ge307CisgICAgICAgICAgc3ViYmFuZC50eXBlID0gIkxIIjsKKyAgICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUpOworICAgICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlKTsKKyAgICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOworICAgICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CisgICAgICAgICAgc3ViYmFuZCA9IHt9OworICAgICAgICAgIHN1YmJhbmQudHlwZSA9ICJISCI7CisgICAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUgLSAwLjUpOworICAgICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSAtIDAuNSk7CisgICAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlIC0gMC41KTsKKyAgICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOworICAgICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTsKKyAgICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpOworICAgICAgICAgIHJlc29sdXRpb24uc3ViYmFuZHMgPSByZXNvbHV0aW9uU3ViYmFuZHM7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29tcG9uZW50LnJlc29sdXRpb25zID0gcmVzb2x1dGlvbnM7CisgICAgICBjb21wb25lbnQuc3ViYmFuZHMgPSBzdWJiYW5kczsKKyAgICB9CisKKyAgICB2YXIgcHJvZ3Jlc3Npb25PcmRlciA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5wcm9ncmVzc2lvbk9yZGVyOworCisgICAgc3dpdGNoIChwcm9ncmVzc2lvbk9yZGVyKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDE6CisgICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI6CisgICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IFJlc29sdXRpb25Qb3NpdGlvbkNvbXBvbmVudExheWVySXRlcmF0b3IoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQ6CisgICAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoYFVuc3VwcG9ydGVkIHByb2dyZXNzaW9uIG9yZGVyICR7cHJvZ3Jlc3Npb25PcmRlcn1gKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZVRpbGVQYWNrZXRzKGNvbnRleHQsIGRhdGEsIG9mZnNldCwgZGF0YUxlbmd0aCkgeworICAgIHZhciBwb3NpdGlvbiA9IDA7CisgICAgdmFyIGJ1ZmZlciwKKyAgICAgICAgYnVmZmVyU2l6ZSA9IDAsCisgICAgICAgIHNraXBOZXh0Qml0ID0gZmFsc2U7CisKKyAgICBmdW5jdGlvbiByZWFkQml0cyhjb3VudCkgeworICAgICAgd2hpbGUgKGJ1ZmZlclNpemUgPCBjb3VudCkgeworICAgICAgICB2YXIgYiA9IGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dOworICAgICAgICBwb3NpdGlvbisrOworCisgICAgICAgIGlmIChza2lwTmV4dEJpdCkgeworICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCA3IHwgYjsKKyAgICAgICAgICBidWZmZXJTaXplICs9IDc7CisgICAgICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWZmZXIgPSBidWZmZXIgPDwgOCB8IGI7CisgICAgICAgICAgYnVmZmVyU2l6ZSArPSA4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGIgPT09IDB4ZmYpIHsKKyAgICAgICAgICBza2lwTmV4dEJpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYnVmZmVyU2l6ZSAtPSBjb3VudDsKKyAgICAgIHJldHVybiBidWZmZXIgPj4+IGJ1ZmZlclNpemUgJiAoMSA8PCBjb3VudCkgLSAxOworICAgIH0KKworICAgIGZ1bmN0aW9uIHNraXBNYXJrZXJJZkVxdWFsKHZhbHVlKSB7CisgICAgICBpZiAoZGF0YVtvZmZzZXQgKyBwb3NpdGlvbiAtIDFdID09PSAweGZmICYmIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSB2YWx1ZSkgeworICAgICAgICBza2lwQnl0ZXMoMSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmIChkYXRhW29mZnNldCArIHBvc2l0aW9uXSA9PT0gMHhmZiAmJiBkYXRhW29mZnNldCArIHBvc2l0aW9uICsgMV0gPT09IHZhbHVlKSB7CisgICAgICAgIHNraXBCeXRlcygyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBza2lwQnl0ZXMoY291bnQpIHsKKyAgICAgIHBvc2l0aW9uICs9IGNvdW50OworICAgIH0KKworICAgIGZ1bmN0aW9uIGFsaWduVG9CeXRlKCkgeworICAgICAgYnVmZmVyU2l6ZSA9IDA7CisKKyAgICAgIGlmIChza2lwTmV4dEJpdCkgeworICAgICAgICBwb3NpdGlvbisrOworICAgICAgICBza2lwTmV4dEJpdCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHJlYWRDb2RpbmdwYXNzZXMoKSB7CisgICAgICBpZiAocmVhZEJpdHMoMSkgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkgeworICAgICAgICByZXR1cm4gMjsKKyAgICAgIH0KKworICAgICAgdmFyIHZhbHVlID0gcmVhZEJpdHMoMik7CisKKyAgICAgIGlmICh2YWx1ZSA8IDMpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlICsgMzsKKyAgICAgIH0KKworICAgICAgdmFsdWUgPSByZWFkQml0cyg1KTsKKworICAgICAgaWYgKHZhbHVlIDwgMzEpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlICsgNjsKKyAgICAgIH0KKworICAgICAgdmFsdWUgPSByZWFkQml0cyg3KTsKKyAgICAgIHJldHVybiB2YWx1ZSArIDM3OworICAgIH0KKworICAgIHZhciB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OworICAgIHZhciB0aWxlID0gY29udGV4dC50aWxlc1t0aWxlSW5kZXhdOworICAgIHZhciBzb3BNYXJrZXJVc2VkID0gY29udGV4dC5DT0Quc29wTWFya2VyVXNlZDsKKyAgICB2YXIgZXBoTWFya2VyVXNlZCA9IGNvbnRleHQuQ09ELmVwaE1hcmtlclVzZWQ7CisgICAgdmFyIHBhY2tldHNJdGVyYXRvciA9IHRpbGUucGFja2V0c0l0ZXJhdG9yOworCisgICAgd2hpbGUgKHBvc2l0aW9uIDwgZGF0YUxlbmd0aCkgeworICAgICAgYWxpZ25Ub0J5dGUoKTsKKworICAgICAgaWYgKHNvcE1hcmtlclVzZWQgJiYgc2tpcE1hcmtlcklmRXF1YWwoMHg5MSkpIHsKKyAgICAgICAgc2tpcEJ5dGVzKDQpOworICAgICAgfQorCisgICAgICB2YXIgcGFja2V0ID0gcGFja2V0c0l0ZXJhdG9yLm5leHRQYWNrZXQoKTsKKworICAgICAgaWYgKCFyZWFkQml0cygxKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdmFyIGxheWVyTnVtYmVyID0gcGFja2V0LmxheWVyTnVtYmVyOworICAgICAgdmFyIHF1ZXVlID0gW10sCisgICAgICAgICAgY29kZWJsb2NrOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYWNrZXQuY29kZWJsb2Nrcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvZGVibG9jayA9IHBhY2tldC5jb2RlYmxvY2tzW2ldOworICAgICAgICB2YXIgcHJlY2luY3QgPSBjb2RlYmxvY2sucHJlY2luY3Q7CisgICAgICAgIHZhciBjb2RlYmxvY2tDb2x1bW4gPSBjb2RlYmxvY2suY2J4IC0gcHJlY2luY3QuY2J4TWluOworICAgICAgICB2YXIgY29kZWJsb2NrUm93ID0gY29kZWJsb2NrLmNieSAtIHByZWNpbmN0LmNieU1pbjsKKyAgICAgICAgdmFyIGNvZGVibG9ja0luY2x1ZGVkID0gZmFsc2U7CisgICAgICAgIHZhciBmaXJzdFRpbWVJbmNsdXNpb24gPSBmYWxzZTsKKyAgICAgICAgdmFyIHZhbHVlUmVhZHk7CisKKyAgICAgICAgaWYgKGNvZGVibG9jay5pbmNsdWRlZCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgY29kZWJsb2NrSW5jbHVkZWQgPSAhIXJlYWRCaXRzKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByZWNpbmN0ID0gY29kZWJsb2NrLnByZWNpbmN0OworICAgICAgICAgIHZhciBpbmNsdXNpb25UcmVlLCB6ZXJvQml0UGxhbmVzVHJlZTsKKworICAgICAgICAgIGlmIChwcmVjaW5jdC5pbmNsdXNpb25UcmVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBwcmVjaW5jdC5pbmNsdXNpb25UcmVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgd2lkdGggPSBwcmVjaW5jdC5jYnhNYXggLSBwcmVjaW5jdC5jYnhNaW4gKyAxOworICAgICAgICAgICAgdmFyIGhlaWdodCA9IHByZWNpbmN0LmNieU1heCAtIHByZWNpbmN0LmNieU1pbiArIDE7CisgICAgICAgICAgICBpbmNsdXNpb25UcmVlID0gbmV3IEluY2x1c2lvblRyZWUod2lkdGgsIGhlaWdodCwgbGF5ZXJOdW1iZXIpOworICAgICAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUgPSBuZXcgVGFnVHJlZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHByZWNpbmN0LmluY2x1c2lvblRyZWUgPSBpbmNsdXNpb25UcmVlOworICAgICAgICAgICAgcHJlY2luY3QuemVyb0JpdFBsYW5lc1RyZWUgPSB6ZXJvQml0UGxhbmVzVHJlZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaW5jbHVzaW9uVHJlZS5yZXNldChjb2RlYmxvY2tDb2x1bW4sIGNvZGVibG9ja1JvdywgbGF5ZXJOdW1iZXIpKSB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICBpZiAocmVhZEJpdHMoMSkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZVJlYWR5ID0gIWluY2x1c2lvblRyZWUubmV4dExldmVsKCk7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVSZWFkeSkgeworICAgICAgICAgICAgICAgICAgY29kZWJsb2NrLmluY2x1ZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGNvZGVibG9ja0luY2x1ZGVkID0gZmlyc3RUaW1lSW5jbHVzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmNsdXNpb25UcmVlLmluY3JlbWVudFZhbHVlKGxheWVyTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29kZWJsb2NrSW5jbHVkZWQpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaXJzdFRpbWVJbmNsdXNpb24pIHsKKyAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZSA9IHByZWNpbmN0Lnplcm9CaXRQbGFuZXNUcmVlOworICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlLnJlc2V0KGNvZGVibG9ja0NvbHVtbiwgY29kZWJsb2NrUm93KTsKKworICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAocmVhZEJpdHMoMSkpIHsKKyAgICAgICAgICAgICAgdmFsdWVSZWFkeSA9ICF6ZXJvQml0UGxhbmVzVHJlZS5uZXh0TGV2ZWwoKTsKKworICAgICAgICAgICAgICBpZiAodmFsdWVSZWFkeSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZS5pbmNyZW1lbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGNvZGVibG9jay56ZXJvQml0UGxhbmVzID0gemVyb0JpdFBsYW5lc1RyZWUudmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgY29kaW5ncGFzc2VzID0gcmVhZENvZGluZ3Bhc3NlcygpOworCisgICAgICAgIHdoaWxlIChyZWFkQml0cygxKSkgeworICAgICAgICAgIGNvZGVibG9jay5MYmxvY2srKzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBjb2RpbmdwYXNzZXNMb2cyID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKGNvZGluZ3Bhc3Nlcyk7CisgICAgICAgIHZhciBiaXRzID0gKGNvZGluZ3Bhc3NlcyA8IDEgPDwgY29kaW5ncGFzc2VzTG9nMiA/IGNvZGluZ3Bhc3Nlc0xvZzIgLSAxIDogY29kaW5ncGFzc2VzTG9nMikgKyBjb2RlYmxvY2suTGJsb2NrOworICAgICAgICB2YXIgY29kZWREYXRhTGVuZ3RoID0gcmVhZEJpdHMoYml0cyk7CisgICAgICAgIHF1ZXVlLnB1c2goeworICAgICAgICAgIGNvZGVibG9jaywKKyAgICAgICAgICBjb2RpbmdwYXNzZXMsCisgICAgICAgICAgZGF0YUxlbmd0aDogY29kZWREYXRhTGVuZ3RoCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBhbGlnblRvQnl0ZSgpOworCisgICAgICBpZiAoZXBoTWFya2VyVXNlZCkgeworICAgICAgICBza2lwTWFya2VySWZFcXVhbCgweDkyKTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdmFyIHBhY2tldEl0ZW0gPSBxdWV1ZS5zaGlmdCgpOworICAgICAgICBjb2RlYmxvY2sgPSBwYWNrZXRJdGVtLmNvZGVibG9jazsKKworICAgICAgICBpZiAoY29kZWJsb2NrLmRhdGEgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGNvZGVibG9jay5kYXRhID0gW107CisgICAgICAgIH0KKworICAgICAgICBjb2RlYmxvY2suZGF0YS5wdXNoKHsKKyAgICAgICAgICBkYXRhLAorICAgICAgICAgIHN0YXJ0OiBvZmZzZXQgKyBwb3NpdGlvbiwKKyAgICAgICAgICBlbmQ6IG9mZnNldCArIHBvc2l0aW9uICsgcGFja2V0SXRlbS5kYXRhTGVuZ3RoLAorICAgICAgICAgIGNvZGluZ3Bhc3NlczogcGFja2V0SXRlbS5jb2RpbmdwYXNzZXMKKyAgICAgICAgfSk7CisgICAgICAgIHBvc2l0aW9uICs9IHBhY2tldEl0ZW0uZGF0YUxlbmd0aDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcG9zaXRpb247CisgIH0KKworICBmdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKGNvZWZmaWNpZW50cywgbGV2ZWxXaWR0aCwgbGV2ZWxIZWlnaHQsIHN1YmJhbmQsIGRlbHRhLCBtYiwgcmV2ZXJzaWJsZSwgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCkgeworICAgIHZhciB4MCA9IHN1YmJhbmQudGJ4MDsKKyAgICB2YXIgeTAgPSBzdWJiYW5kLnRieTA7CisgICAgdmFyIHdpZHRoID0gc3ViYmFuZC50YngxIC0gc3ViYmFuZC50YngwOworICAgIHZhciBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzOworICAgIHZhciByaWdodCA9IHN1YmJhbmQudHlwZS5jaGFyQXQoMCkgPT09ICJIIiA/IDEgOiAwOworICAgIHZhciBib3R0b20gPSBzdWJiYW5kLnR5cGUuY2hhckF0KDEpID09PSAiSCIgPyBsZXZlbFdpZHRoIDogMDsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvZGVibG9ja3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgdmFyIGNvZGVibG9jayA9IGNvZGVibG9ja3NbaV07CisgICAgICB2YXIgYmxvY2tXaWR0aCA9IGNvZGVibG9jay50YngxXyAtIGNvZGVibG9jay50YngwXzsKKyAgICAgIHZhciBibG9ja0hlaWdodCA9IGNvZGVibG9jay50YnkxXyAtIGNvZGVibG9jay50YnkwXzsKKworICAgICAgaWYgKGJsb2NrV2lkdGggPT09IDAgfHwgYmxvY2tIZWlnaHQgPT09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjb2RlYmxvY2suZGF0YSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgYml0TW9kZWwsIGN1cnJlbnRDb2RpbmdwYXNzVHlwZTsKKyAgICAgIGJpdE1vZGVsID0gbmV3IEJpdE1vZGVsKGJsb2NrV2lkdGgsIGJsb2NrSGVpZ2h0LCBjb2RlYmxvY2suc3ViYmFuZFR5cGUsIGNvZGVibG9jay56ZXJvQml0UGxhbmVzLCBtYik7CisgICAgICBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAyOworICAgICAgdmFyIGRhdGEgPSBjb2RlYmxvY2suZGF0YSwKKyAgICAgICAgICB0b3RhbExlbmd0aCA9IDAsCisgICAgICAgICAgY29kaW5ncGFzc2VzID0gMDsKKyAgICAgIHZhciBqLCBqaiwgZGF0YUl0ZW07CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTsKKyAgICAgICAgdG90YWxMZW5ndGggKz0gZGF0YUl0ZW0uZW5kIC0gZGF0YUl0ZW0uc3RhcnQ7CisgICAgICAgIGNvZGluZ3Bhc3NlcyArPSBkYXRhSXRlbS5jb2RpbmdwYXNzZXM7CisgICAgICB9CisKKyAgICAgIHZhciBlbmNvZGVkRGF0YSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKKyAgICAgIHZhciBwb3NpdGlvbiA9IDA7CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gZGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGRhdGFJdGVtID0gZGF0YVtqXTsKKyAgICAgICAgdmFyIGNodW5rID0gZGF0YUl0ZW0uZGF0YS5zdWJhcnJheShkYXRhSXRlbS5zdGFydCwgZGF0YUl0ZW0uZW5kKTsKKyAgICAgICAgZW5jb2RlZERhdGEuc2V0KGNodW5rLCBwb3NpdGlvbik7CisgICAgICAgIHBvc2l0aW9uICs9IGNodW5rLmxlbmd0aDsKKyAgICAgIH0KKworICAgICAgdmFyIGRlY29kZXIgPSBuZXcgX2FyaXRobWV0aWNfZGVjb2Rlci5Bcml0aG1ldGljRGVjb2RlcihlbmNvZGVkRGF0YSwgMCwgdG90YWxMZW5ndGgpOworICAgICAgYml0TW9kZWwuc2V0RGVjb2RlcihkZWNvZGVyKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGluZ3Bhc3NlczsgaisrKSB7CisgICAgICAgIHN3aXRjaCAoY3VycmVudENvZGluZ3Bhc3NUeXBlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgYml0TW9kZWwucnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGJpdE1vZGVsLnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGJpdE1vZGVsLnJ1bkNsZWFudXBQYXNzKCk7CisKKyAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25TeW1ib2xVc2VkKSB7CisgICAgICAgICAgICAgIGJpdE1vZGVsLmNoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudENvZGluZ3Bhc3NUeXBlID0gKGN1cnJlbnRDb2RpbmdwYXNzVHlwZSArIDEpICUgMzsKKyAgICAgIH0KKworICAgICAgdmFyIG9mZnNldCA9IGNvZGVibG9jay50YngwXyAtIHgwICsgKGNvZGVibG9jay50YnkwXyAtIHkwKSAqIHdpZHRoOworICAgICAgdmFyIHNpZ24gPSBiaXRNb2RlbC5jb2VmZmljZW50c1NpZ247CisgICAgICB2YXIgbWFnbml0dWRlID0gYml0TW9kZWwuY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICB2YXIgYml0c0RlY29kZWQgPSBiaXRNb2RlbC5iaXRzRGVjb2RlZDsKKyAgICAgIHZhciBtYWduaXR1ZGVDb3JyZWN0aW9uID0gcmV2ZXJzaWJsZSA/IDAgOiAwLjU7CisgICAgICB2YXIgaywgbiwgbmI7CisgICAgICBwb3NpdGlvbiA9IDA7CisgICAgICB2YXIgaW50ZXJsZWF2ZSA9IHN1YmJhbmQudHlwZSAhPT0gIkxMIjsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2NrSGVpZ2h0OyBqKyspIHsKKyAgICAgICAgdmFyIHJvdyA9IG9mZnNldCAvIHdpZHRoIHwgMDsKKyAgICAgICAgdmFyIGxldmVsT2Zmc2V0ID0gMiAqIHJvdyAqIChsZXZlbFdpZHRoIC0gd2lkdGgpICsgcmlnaHQgKyBib3R0b207CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGJsb2NrV2lkdGg7IGsrKykgeworICAgICAgICAgIG4gPSBtYWduaXR1ZGVbcG9zaXRpb25dOworCisgICAgICAgICAgaWYgKG4gIT09IDApIHsKKyAgICAgICAgICAgIG4gPSAobiArIG1hZ25pdHVkZUNvcnJlY3Rpb24pICogZGVsdGE7CisKKyAgICAgICAgICAgIGlmIChzaWduW3Bvc2l0aW9uXSAhPT0gMCkgeworICAgICAgICAgICAgICBuID0gLW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5iID0gYml0c0RlY29kZWRbcG9zaXRpb25dOworICAgICAgICAgICAgdmFyIHBvcyA9IGludGVybGVhdmUgPyBsZXZlbE9mZnNldCArIChvZmZzZXQgPDwgMSkgOiBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChyZXZlcnNpYmxlICYmIG5iID49IG1iKSB7CisgICAgICAgICAgICAgIGNvZWZmaWNpZW50c1twb3NdID0gbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNvZWZmaWNpZW50c1twb3NdID0gbiAqICgxIDw8IG1iIC0gbmIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gd2lkdGggLSBibG9ja1dpZHRoOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYykgeworICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgdmFyIGNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7CisgICAgdmFyIHF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBjb21wb25lbnQucXVhbnRpemF0aW9uUGFyYW1ldGVyczsKKyAgICB2YXIgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKKyAgICB2YXIgc3BxY2RzID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5TUHFjZHM7CisgICAgdmFyIHNjYWxhckV4cG91bmRlZCA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuc2NhbGFyRXhwb3VuZGVkOworICAgIHZhciBndWFyZEJpdHMgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLmd1YXJkQml0czsKKyAgICB2YXIgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCA9IGNvZGluZ1N0eWxlUGFyYW1ldGVycy5zZWdtZW50YXRpb25TeW1ib2xVc2VkOworICAgIHZhciBwcmVjaXNpb24gPSBjb250ZXh0LmNvbXBvbmVudHNbY10ucHJlY2lzaW9uOworICAgIHZhciByZXZlcnNpYmxlID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbjsKKyAgICB2YXIgdHJhbnNmb3JtID0gcmV2ZXJzaWJsZSA/IG5ldyBSZXZlcnNpYmxlVHJhbnNmb3JtKCkgOiBuZXcgSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCk7CisgICAgdmFyIHN1YmJhbmRDb2VmZmljaWVudHMgPSBbXTsKKyAgICB2YXIgYiA9IDA7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IGkrKykgeworICAgICAgdmFyIHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbaV07CisgICAgICB2YXIgd2lkdGggPSByZXNvbHV0aW9uLnRyeDEgLSByZXNvbHV0aW9uLnRyeDA7CisgICAgICB2YXIgaGVpZ2h0ID0gcmVzb2x1dGlvbi50cnkxIC0gcmVzb2x1dGlvbi50cnkwOworICAgICAgdmFyIGNvZWZmaWNpZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiBoZWlnaHQpOworCisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSByZXNvbHV0aW9uLnN1YmJhbmRzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgdmFyIG11LCBlcHNpbG9uOworCisgICAgICAgIGlmICghc2NhbGFyRXhwb3VuZGVkKSB7CisgICAgICAgICAgbXUgPSBzcHFjZHNbMF0ubXU7CisgICAgICAgICAgZXBzaWxvbiA9IHNwcWNkc1swXS5lcHNpbG9uICsgKGkgPiAwID8gMSAtIGkgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtdSA9IHNwcWNkc1tiXS5tdTsKKyAgICAgICAgICBlcHNpbG9uID0gc3BxY2RzW2JdLmVwc2lsb247CisgICAgICAgICAgYisrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN1YmJhbmQgPSByZXNvbHV0aW9uLnN1YmJhbmRzW2pdOworICAgICAgICB2YXIgZ2FpbkxvZzIgPSBTdWJiYW5kc0dhaW5Mb2cyW3N1YmJhbmQudHlwZV07CisgICAgICAgIHZhciBkZWx0YSA9IHJldmVyc2libGUgPyAxIDogMiAqKiAocHJlY2lzaW9uICsgZ2FpbkxvZzIgLSBlcHNpbG9uKSAqICgxICsgbXUgLyAyMDQ4KTsKKyAgICAgICAgdmFyIG1iID0gZ3VhcmRCaXRzICsgZXBzaWxvbiAtIDE7CisgICAgICAgIGNvcHlDb2VmZmljaWVudHMoY29lZmZpY2llbnRzLCB3aWR0aCwgaGVpZ2h0LCBzdWJiYW5kLCBkZWx0YSwgbWIsIHJldmVyc2libGUsIHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpOworICAgICAgfQorCisgICAgICBzdWJiYW5kQ29lZmZpY2llbnRzLnB1c2goeworICAgICAgICB3aWR0aCwKKyAgICAgICAgaGVpZ2h0LAorICAgICAgICBpdGVtczogY29lZmZpY2llbnRzCisgICAgICB9KTsKKyAgICB9CisKKyAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtLmNhbGN1bGF0ZShzdWJiYW5kQ29lZmZpY2llbnRzLCBjb21wb25lbnQudGN4MCwgY29tcG9uZW50LnRjeTApOworICAgIHJldHVybiB7CisgICAgICBsZWZ0OiBjb21wb25lbnQudGN4MCwKKyAgICAgIHRvcDogY29tcG9uZW50LnRjeTAsCisgICAgICB3aWR0aDogcmVzdWx0LndpZHRoLAorICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LAorICAgICAgaXRlbXM6IHJlc3VsdC5pdGVtcworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB0cmFuc2Zvcm1Db21wb25lbnRzKGNvbnRleHQpIHsKKyAgICB2YXIgc2l6ID0gY29udGV4dC5TSVo7CisgICAgdmFyIGNvbXBvbmVudHMgPSBjb250ZXh0LmNvbXBvbmVudHM7CisgICAgdmFyIGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OworICAgIHZhciByZXN1bHRJbWFnZXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbnRleHQudGlsZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIHRpbGUgPSBjb250ZXh0LnRpbGVzW2ldOworICAgICAgdmFyIHRyYW5zZm9ybWVkVGlsZXMgPSBbXTsKKyAgICAgIHZhciBjOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgdHJhbnNmb3JtZWRUaWxlc1tjXSA9IHRyYW5zZm9ybVRpbGUoY29udGV4dCwgdGlsZSwgYyk7CisgICAgICB9CisKKyAgICAgIHZhciB0aWxlMCA9IHRyYW5zZm9ybWVkVGlsZXNbMF07CisgICAgICB2YXIgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRpbGUwLml0ZW1zLmxlbmd0aCAqIGNvbXBvbmVudHNDb3VudCk7CisgICAgICB2YXIgcmVzdWx0ID0geworICAgICAgICBsZWZ0OiB0aWxlMC5sZWZ0LAorICAgICAgICB0b3A6IHRpbGUwLnRvcCwKKyAgICAgICAgd2lkdGg6IHRpbGUwLndpZHRoLAorICAgICAgICBoZWlnaHQ6IHRpbGUwLmhlaWdodCwKKyAgICAgICAgaXRlbXM6IG91dAorICAgICAgfTsKKyAgICAgIHZhciBzaGlmdCwgb2Zmc2V0OworICAgICAgdmFyIHBvcyA9IDAsCisgICAgICAgICAgaiwKKyAgICAgICAgICBqaiwKKyAgICAgICAgICB5MCwKKyAgICAgICAgICB5MSwKKyAgICAgICAgICB5MjsKKworICAgICAgaWYgKHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSkgeworICAgICAgICB2YXIgZm91ckNvbXBvbmVudHMgPSBjb21wb25lbnRzQ291bnQgPT09IDQ7CisgICAgICAgIHZhciB5MGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1swXS5pdGVtczsKKyAgICAgICAgdmFyIHkxaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzFdLml0ZW1zOworICAgICAgICB2YXIgeTJpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMl0uaXRlbXM7CisgICAgICAgIHZhciB5M2l0ZW1zID0gZm91ckNvbXBvbmVudHMgPyB0cmFuc2Zvcm1lZFRpbGVzWzNdLml0ZW1zIDogbnVsbDsKKyAgICAgICAgc2hpZnQgPSBjb21wb25lbnRzWzBdLnByZWNpc2lvbiAtIDg7CisgICAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41OworICAgICAgICB2YXIgY29tcG9uZW50MCA9IHRpbGUuY29tcG9uZW50c1swXTsKKyAgICAgICAgdmFyIGFscGhhMDEgPSBjb21wb25lbnRzQ291bnQgLSAzOworICAgICAgICBqaiA9IHkwaXRlbXMubGVuZ3RoOworCisgICAgICAgIGlmICghY29tcG9uZW50MC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7CisgICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7CisgICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07CisgICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07CisgICAgICAgICAgICBvdXRbcG9zKytdID0geTAgKyAxLjQwMiAqIHkyID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IHkwIC0gMC4zNDQxMyAqIHkxIC0gMC43MTQxNCAqIHkyID4+IHNoaWZ0OworICAgICAgICAgICAgb3V0W3BvcysrXSA9IHkwICsgMS43NzIgKiB5MSA+PiBzaGlmdDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpqOyBqKyssIHBvcyArPSBhbHBoYTAxKSB7CisgICAgICAgICAgICB5MCA9IHkwaXRlbXNbal0gKyBvZmZzZXQ7CisgICAgICAgICAgICB5MSA9IHkxaXRlbXNbal07CisgICAgICAgICAgICB5MiA9IHkyaXRlbXNbal07CisgICAgICAgICAgICBjb25zdCBnID0geTAgLSAoeTIgKyB5MSA+PiAyKTsKKyAgICAgICAgICAgIG91dFtwb3MrK10gPSBnICsgeTIgPj4gc2hpZnQ7CisgICAgICAgICAgICBvdXRbcG9zKytdID0gZyA+PiBzaGlmdDsKKyAgICAgICAgICAgIG91dFtwb3MrK10gPSBnICsgeTEgPj4gc2hpZnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvdXJDb21wb25lbnRzKSB7CisgICAgICAgICAgZm9yIChqID0gMCwgcG9zID0gMzsgaiA8IGpqOyBqKyssIHBvcyArPSA0KSB7CisgICAgICAgICAgICBvdXRbcG9zXSA9IHkzaXRlbXNbal0gKyBvZmZzZXQgPj4gc2hpZnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgICAgICB2YXIgaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzW2NdLml0ZW1zOworICAgICAgICAgIHNoaWZ0ID0gY29tcG9uZW50c1tjXS5wcmVjaXNpb24gLSA4OworICAgICAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41OworCisgICAgICAgICAgZm9yIChwb3MgPSBjLCBqID0gMCwgamogPSBpdGVtcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgICBvdXRbcG9zXSA9IGl0ZW1zW2pdICsgb2Zmc2V0ID4+IHNoaWZ0OworICAgICAgICAgICAgcG9zICs9IGNvbXBvbmVudHNDb3VudDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVzdWx0SW1hZ2VzLnB1c2gocmVzdWx0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0SW1hZ2VzOworICB9CisKKyAgZnVuY3Rpb24gaW5pdGlhbGl6ZVRpbGUoY29udGV4dCwgdGlsZUluZGV4KSB7CisgICAgdmFyIHNpeiA9IGNvbnRleHQuU0laOworICAgIHZhciBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKKyAgICB2YXIgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKKworICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKKyAgICAgIHZhciBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CisgICAgICB2YXIgcWNkT3JRY2MgPSBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjXSAhPT0gdW5kZWZpbmVkID8gY29udGV4dC5jdXJyZW50VGlsZS5RQ0NbY10gOiBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRDsKKyAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25QYXJhbWV0ZXJzID0gcWNkT3JRY2M7CisgICAgICB2YXIgY29kT3JDb2MgPSBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXSAhPT0gdW5kZWZpbmVkID8gY29udGV4dC5jdXJyZW50VGlsZS5DT0NbY10gOiBjb250ZXh0LmN1cnJlbnRUaWxlLkNPRDsKKyAgICAgIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMgPSBjb2RPckNvYzsKKyAgICB9CisKKyAgICB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMgPSBjb250ZXh0LmN1cnJlbnRUaWxlLkNPRDsKKyAgfQorCisgIHZhciBUYWdUcmVlID0gZnVuY3Rpb24gVGFnVHJlZUNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gVGFnVHJlZSh3aWR0aCwgaGVpZ2h0KSB7CisgICAgICB2YXIgbGV2ZWxzTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7CisgICAgICB0aGlzLmxldmVscyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxldmVsc0xlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBsZXZlbCA9IHsKKyAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgaXRlbXM6IFtdCisgICAgICAgIH07CisgICAgICAgIHRoaXMubGV2ZWxzLnB1c2gobGV2ZWwpOworICAgICAgICB3aWR0aCA9IE1hdGguY2VpbCh3aWR0aCAvIDIpOworICAgICAgICBoZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0IC8gMik7CisgICAgICB9CisgICAgfQorCisgICAgVGFnVHJlZS5wcm90b3R5cGUgPSB7CisgICAgICByZXNldDogZnVuY3Rpb24gVGFnVHJlZV9yZXNldChpLCBqKSB7CisgICAgICAgIHZhciBjdXJyZW50TGV2ZWwgPSAwLAorICAgICAgICAgICAgdmFsdWUgPSAwLAorICAgICAgICAgICAgbGV2ZWw7CisKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRMZXZlbCA8IHRoaXMubGV2ZWxzLmxlbmd0aCkgeworICAgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgICB2YXIgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoOworCisgICAgICAgICAgaWYgKGxldmVsLml0ZW1zW2luZGV4XSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGxldmVsLml0ZW1zW2luZGV4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGxldmVsLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgaSA+Pj0gMTsKKyAgICAgICAgICBqID4+PSAxOworICAgICAgICAgIGN1cnJlbnRMZXZlbCsrOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudExldmVsLS07CisgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gdmFsdWU7CisgICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsOworICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKKyAgICAgIH0sCisgICAgICBpbmNyZW1lbnRWYWx1ZTogZnVuY3Rpb24gVGFnVHJlZV9pbmNyZW1lbnRWYWx1ZSgpIHsKKyAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0rKzsKKyAgICAgIH0sCisgICAgICBuZXh0TGV2ZWw6IGZ1bmN0aW9uIFRhZ1RyZWVfbmV4dExldmVsKCkgeworICAgICAgICB2YXIgY3VycmVudExldmVsID0gdGhpcy5jdXJyZW50TGV2ZWw7CisgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTsKKyAgICAgICAgY3VycmVudExldmVsLS07CisKKyAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA8IDApIHsKKyAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7CisgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH07CisgICAgcmV0dXJuIFRhZ1RyZWU7CisgIH0oKTsKKworICB2YXIgSW5jbHVzaW9uVHJlZSA9IGZ1bmN0aW9uIEluY2x1c2lvblRyZWVDbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIEluY2x1c2lvblRyZWUod2lkdGgsIGhlaWdodCwgZGVmYXVsdFZhbHVlKSB7CisgICAgICB2YXIgbGV2ZWxzTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7CisgICAgICB0aGlzLmxldmVscyA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxldmVsc0xlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBpdGVtcyA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0KTsKKworICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBpdGVtcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgICAgaXRlbXNbal0gPSBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbGV2ZWwgPSB7CisgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgIGl0ZW1zCisgICAgICAgIH07CisgICAgICAgIHRoaXMubGV2ZWxzLnB1c2gobGV2ZWwpOworICAgICAgICB3aWR0aCA9IE1hdGguY2VpbCh3aWR0aCAvIDIpOworICAgICAgICBoZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0IC8gMik7CisgICAgICB9CisgICAgfQorCisgICAgSW5jbHVzaW9uVHJlZS5wcm90b3R5cGUgPSB7CisgICAgICByZXNldDogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9yZXNldChpLCBqLCBzdG9wVmFsdWUpIHsKKyAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRMZXZlbCA8IHRoaXMubGV2ZWxzLmxlbmd0aCkgeworICAgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CisgICAgICAgICAgdmFyIGluZGV4ID0gaSArIGogKiBsZXZlbC53aWR0aDsKKyAgICAgICAgICBsZXZlbC5pbmRleCA9IGluZGV4OworICAgICAgICAgIHZhciB2YWx1ZSA9IGxldmVsLml0ZW1zW2luZGV4XTsKKworICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMHhmZikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHZhbHVlID4gc3RvcFZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKKyAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgaSA+Pj0gMTsKKyAgICAgICAgICBqID4+PSAxOworICAgICAgICAgIGN1cnJlbnRMZXZlbCsrOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWwgLSAxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0sCisgICAgICBpbmNyZW1lbnRWYWx1ZTogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9pbmNyZW1lbnRWYWx1ZShzdG9wVmFsdWUpIHsKKyAgICAgICAgdmFyIGxldmVsID0gdGhpcy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxdOworICAgICAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSBzdG9wVmFsdWUgKyAxOworICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlcygpOworICAgICAgfSwKKyAgICAgIHByb3BhZ2F0ZVZhbHVlczogZnVuY3Rpb24gSW5jbHVzaW9uVHJlZV9wcm9wYWdhdGVWYWx1ZXMoKSB7CisgICAgICAgIHZhciBsZXZlbEluZGV4ID0gdGhpcy5jdXJyZW50TGV2ZWw7CisgICAgICAgIHZhciBsZXZlbCA9IHRoaXMubGV2ZWxzW2xldmVsSW5kZXhdOworICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdOworCisgICAgICAgIHdoaWxlICgtLWxldmVsSW5kZXggPj0gMCkgeworICAgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07CisgICAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gY3VycmVudFZhbHVlOworICAgICAgICB9CisgICAgICB9LAorICAgICAgbmV4dExldmVsOiBmdW5jdGlvbiBJbmNsdXNpb25UcmVlX25leHRMZXZlbCgpIHsKKyAgICAgICAgdmFyIGN1cnJlbnRMZXZlbCA9IHRoaXMuY3VycmVudExldmVsOworICAgICAgICB2YXIgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOworICAgICAgICB2YXIgdmFsdWUgPSBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF07CisgICAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IDB4ZmY7CisgICAgICAgIGN1cnJlbnRMZXZlbC0tOworCisgICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7CisgICAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKKyAgICAgICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH07CisgICAgcmV0dXJuIEluY2x1c2lvblRyZWU7CisgIH0oKTsKKworICB2YXIgQml0TW9kZWwgPSBmdW5jdGlvbiBCaXRNb2RlbENsb3N1cmUoKSB7CisgICAgdmFyIFVOSUZPUk1fQ09OVEVYVCA9IDE3OworICAgIHZhciBSVU5MRU5HVEhfQ09OVEVYVCA9IDE4OworICAgIHZhciBMTEFuZExIQ29udGV4dHNMYWJlbCA9IG5ldyBVaW50OEFycmF5KFswLCA1LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAxLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4XSk7CisgICAgdmFyIEhMQ29udGV4dExhYmVsID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDMsIDQsIDAsIDUsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDEsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDhdKTsKKyAgICB2YXIgSEhDb250ZXh0TGFiZWwgPSBuZXcgVWludDhBcnJheShbMCwgMSwgMiwgMCwgMSwgMiwgMiwgMCwgMiwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMywgNCwgNSwgMCwgNCwgNSwgNSwgMCwgNSwgNSwgNSwgMCwgMCwgMCwgMCwgMCwgNiwgNywgNywgMCwgNywgNywgNywgMCwgNywgNywgNywgMCwgMCwgMCwgMCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOF0pOworCisgICAgZnVuY3Rpb24gQml0TW9kZWwod2lkdGgsIGhlaWdodCwgc3ViYmFuZCwgemVyb0JpdFBsYW5lcywgbWIpIHsKKyAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKyAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgbGV0IGNvbnRleHRMYWJlbFRhYmxlOworCisgICAgICBpZiAoc3ViYmFuZCA9PT0gIkhIIikgeworICAgICAgICBjb250ZXh0TGFiZWxUYWJsZSA9IEhIQ29udGV4dExhYmVsOworICAgICAgfSBlbHNlIGlmIChzdWJiYW5kID09PSAiSEwiKSB7CisgICAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gSExDb250ZXh0TGFiZWw7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250ZXh0TGFiZWxUYWJsZSA9IExMQW5kTEhDb250ZXh0c0xhYmVsOworICAgICAgfQorCisgICAgICB0aGlzLmNvbnRleHRMYWJlbFRhYmxlID0gY29udGV4dExhYmVsVGFibGU7CisgICAgICB2YXIgY29lZmZpY2llbnRDb3VudCA9IHdpZHRoICogaGVpZ2h0OworICAgICAgdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2UgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKKyAgICAgIHRoaXMuY29lZmZpY2VudHNTaWduID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICBsZXQgY29lZmZpY2VudHNNYWduaXR1ZGU7CisKKyAgICAgIGlmIChtYiA+IDE0KSB7CisgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQzMkFycmF5KGNvZWZmaWNpZW50Q291bnQpOworICAgICAgfSBlbHNlIGlmIChtYiA+IDYpIHsKKyAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDE2QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpOworICAgICAgfQorCisgICAgICB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlID0gY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICB0aGlzLnByb2Nlc3NpbmdGbGFncyA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpOworICAgICAgdmFyIGJpdHNEZWNvZGVkID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CisKKyAgICAgIGlmICh6ZXJvQml0UGxhbmVzICE9PSAwKSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29lZmZpY2llbnRDb3VudDsgaSsrKSB7CisgICAgICAgICAgYml0c0RlY29kZWRbaV0gPSB6ZXJvQml0UGxhbmVzOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuYml0c0RlY29kZWQgPSBiaXRzRGVjb2RlZDsKKyAgICAgIHRoaXMucmVzZXQoKTsKKyAgICB9CisKKyAgICBCaXRNb2RlbC5wcm90b3R5cGUgPSB7CisgICAgICBzZXREZWNvZGVyOiBmdW5jdGlvbiBCaXRNb2RlbF9zZXREZWNvZGVyKGRlY29kZXIpIHsKKyAgICAgICAgdGhpcy5kZWNvZGVyID0gZGVjb2RlcjsKKyAgICAgIH0sCisgICAgICByZXNldDogZnVuY3Rpb24gQml0TW9kZWxfcmVzZXQoKSB7CisgICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXcgSW50OEFycmF5KDE5KTsKKyAgICAgICAgdGhpcy5jb250ZXh0c1swXSA9IDQgPDwgMSB8IDA7CisgICAgICAgIHRoaXMuY29udGV4dHNbVU5JRk9STV9DT05URVhUXSA9IDQ2IDw8IDEgfCAwOworICAgICAgICB0aGlzLmNvbnRleHRzW1JVTkxFTkdUSF9DT05URVhUXSA9IDMgPDwgMSB8IDA7CisgICAgICB9LAorICAgICAgc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlOiBmdW5jdGlvbiBCaXRNb2RlbF9zZXROZWlnaGJvcnNTaWduaWZpY2FuY2Uocm93LCBjb2x1bW4sIGluZGV4KSB7CisgICAgICAgIHZhciBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTsKKyAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgICAgICB2YXIgbGVmdCA9IGNvbHVtbiA+IDA7CisgICAgICAgIHZhciByaWdodCA9IGNvbHVtbiArIDEgPCB3aWR0aDsKKyAgICAgICAgdmFyIGk7CisKKyAgICAgICAgaWYgKHJvdyA+IDApIHsKKyAgICAgICAgICBpID0gaW5kZXggLSB3aWR0aDsKKworICAgICAgICAgIGlmIChsZWZ0KSB7CisgICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaSAtIDFdICs9IDB4MTA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHJpZ2h0KSB7CisgICAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaSArIDFdICs9IDB4MTA7CisgICAgICAgICAgfQorCisgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2ldICs9IDB4MDQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocm93ICsgMSA8IGhlaWdodCkgeworICAgICAgICAgIGkgPSBpbmRleCArIHdpZHRoOworCisgICAgICAgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmlnaHQpIHsKKyAgICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaV0gKz0gMHgwNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZWZ0KSB7CisgICAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4IC0gMV0gKz0gMHgwMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyaWdodCkgeworICAgICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleCArIDFdICs9IDB4MDE7CisgICAgICAgIH0KKworICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdIHw9IDB4ODA7CisgICAgICB9LAorICAgICAgcnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKSB7CisgICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyOworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBjb2VmZmljZW50c01hZ25pdHVkZSA9IHRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGU7CisgICAgICAgIHZhciBjb2VmZmljZW50c1NpZ24gPSB0aGlzLmNvZWZmaWNlbnRzU2lnbjsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgcHJvY2Vzc2luZ0ZsYWdzID0gdGhpcy5wcm9jZXNzaW5nRmxhZ3M7CisgICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CisgICAgICAgIHZhciBsYWJlbHMgPSB0aGlzLmNvbnRleHRMYWJlbFRhYmxlOworICAgICAgICB2YXIgYml0c0RlY29kZWQgPSB0aGlzLmJpdHNEZWNvZGVkOworICAgICAgICB2YXIgcHJvY2Vzc2VkSW52ZXJzZU1hc2sgPSB+MTsKKyAgICAgICAgdmFyIHByb2Nlc3NlZE1hc2sgPSAxOworICAgICAgICB2YXIgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjsKKworICAgICAgICBmb3IgKHZhciBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCArPSA0KSB7CisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgICB2YXIgaW5kZXggPSBpMCAqIHdpZHRoICsgajsKKworICAgICAgICAgICAgZm9yICh2YXIgaTEgPSAwOyBpMSA8IDQ7IGkxKyssIGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgIHZhciBpID0gaTAgKyBpMTsKKworICAgICAgICAgICAgICBpZiAoaSA+PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJj0gcHJvY2Vzc2VkSW52ZXJzZU1hc2s7CisKKyAgICAgICAgICAgICAgaWYgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fCAhbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIGNvbnRleHRMYWJlbCA9IGxhYmVsc1tuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdXTsKKyAgICAgICAgICAgICAgdmFyIGRlY2lzaW9uID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworCisgICAgICAgICAgICAgIGlmIChkZWNpc2lvbikgeworICAgICAgICAgICAgICAgIHZhciBzaWduID0gdGhpcy5kZWNvZGVTaWduQml0KGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgICBjb2VmZmljZW50c1NpZ25baW5kZXhdID0gc2lnbjsKKyAgICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPSAxOworICAgICAgICAgICAgICAgIHRoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGksIGosIGluZGV4KTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IGZpcnN0TWFnbml0dWRlQml0TWFzazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrOworICAgICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IHByb2Nlc3NlZE1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LAorICAgICAgZGVjb2RlU2lnbkJpdDogZnVuY3Rpb24gQml0TW9kZWxfZGVjb2RlU2lnbkJpdChyb3csIGNvbHVtbiwgaW5kZXgpIHsKKyAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OworICAgICAgICB2YXIgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOworICAgICAgICB2YXIgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247CisgICAgICAgIHZhciBjb250cmlidXRpb24sIHNpZ24wLCBzaWduMSwgc2lnbmlmaWNhbmNlMTsKKyAgICAgICAgdmFyIGNvbnRleHRMYWJlbCwgZGVjb2RlZDsKKyAgICAgICAgc2lnbmlmaWNhbmNlMSA9IGNvbHVtbiA+IDAgJiYgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXggLSAxXSAhPT0gMDsKKworICAgICAgICBpZiAoY29sdW1uICsgMSA8IHdpZHRoICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4ICsgMV0gIT09IDApIHsKKyAgICAgICAgICBzaWduMSA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCArIDFdOworCisgICAgICAgICAgaWYgKHNpZ25pZmljYW5jZTEpIHsKKyAgICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gMV07CisgICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24xIC0gc2lnbjE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNpZ25pZmljYW5jZTEpIHsKKyAgICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIDFdOworICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMCAtIHNpZ24wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICB2YXIgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbiA9IDMgKiBjb250cmlidXRpb247CisgICAgICAgIHNpZ25pZmljYW5jZTEgPSByb3cgPiAwICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4IC0gd2lkdGhdICE9PSAwOworCisgICAgICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0ICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4ICsgd2lkdGhdICE9PSAwKSB7CisgICAgICAgICAgc2lnbjEgPSBjb2VmZmljZW50c1NpZ25baW5kZXggKyB3aWR0aF07CisKKyAgICAgICAgICBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSB3aWR0aF07CisgICAgICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMCArIGhvcml6b250YWxDb250cmlidXRpb247CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24xICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkgeworICAgICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gd2lkdGhdOworICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMCAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250cmlidXRpb24gPSBob3Jpem9udGFsQ29udHJpYnV0aW9uOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbiA+PSAwKSB7CisgICAgICAgICAgY29udGV4dExhYmVsID0gOSArIGNvbnRyaWJ1dGlvbjsKKyAgICAgICAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cywgY29udGV4dExhYmVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250ZXh0TGFiZWwgPSA5IC0gY29udHJpYnV0aW9uOworICAgICAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpIF4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZWNvZGVkOworICAgICAgfSwKKyAgICAgIHJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzOiBmdW5jdGlvbiBCaXRNb2RlbF9ydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzcygpIHsKKyAgICAgICAgdmFyIGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CisgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCisgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgICAgdmFyIG5laWdoYm9yc1NpZ25pZmljYW5jZSA9IHRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlOworICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOworICAgICAgICB2YXIgYml0c0RlY29kZWQgPSB0aGlzLmJpdHNEZWNvZGVkOworICAgICAgICB2YXIgcHJvY2Vzc2luZ0ZsYWdzID0gdGhpcy5wcm9jZXNzaW5nRmxhZ3M7CisgICAgICAgIHZhciBwcm9jZXNzZWRNYXNrID0gMTsKKyAgICAgICAgdmFyIGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7CisgICAgICAgIHZhciBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgdmFyIHdpZHRoNCA9IHdpZHRoICogNDsKKworICAgICAgICBmb3IgKHZhciBpbmRleDAgPSAwLCBpbmRleE5leHQ7IGluZGV4MCA8IGxlbmd0aDsgaW5kZXgwID0gaW5kZXhOZXh0KSB7CisgICAgICAgICAgaW5kZXhOZXh0ID0gTWF0aC5taW4obGVuZ3RoLCBpbmRleDAgKyB3aWR0aDQpOworCisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IGluZGV4MCArIGo7IGluZGV4IDwgaW5kZXhOZXh0OyBpbmRleCArPSB3aWR0aCkgeworICAgICAgICAgICAgICBpZiAoIWNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fCAocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIHByb2Nlc3NlZE1hc2spICE9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgY29udGV4dExhYmVsID0gMTY7CisKKyAgICAgICAgICAgICAgaWYgKChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgZmlyc3RNYWduaXR1ZGVCaXRNYXNrKSAhPT0gMCkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gXj0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrOworICAgICAgICAgICAgICAgIHZhciBzaWduaWZpY2FuY2UgPSBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdICYgMTI3OworICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCA9IHNpZ25pZmljYW5jZSA9PT0gMCA/IDE1IDogMTQ7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPSBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPDwgMSB8IGJpdDsKKyAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gcHJvY2Vzc2VkTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBydW5DbGVhbnVwUGFzczogZnVuY3Rpb24gQml0TW9kZWxfcnVuQ2xlYW51cFBhc3MoKSB7CisgICAgICAgIHZhciBkZWNvZGVyID0gdGhpcy5kZWNvZGVyOworICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLAorICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisgICAgICAgIHZhciBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTsKKyAgICAgICAgdmFyIGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduOworICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOworICAgICAgICB2YXIgbGFiZWxzID0gdGhpcy5jb250ZXh0TGFiZWxUYWJsZTsKKyAgICAgICAgdmFyIGJpdHNEZWNvZGVkID0gdGhpcy5iaXRzRGVjb2RlZDsKKyAgICAgICAgdmFyIHByb2Nlc3NpbmdGbGFncyA9IHRoaXMucHJvY2Vzc2luZ0ZsYWdzOworICAgICAgICB2YXIgcHJvY2Vzc2VkTWFzayA9IDE7CisgICAgICAgIHZhciBmaXJzdE1hZ25pdHVkZUJpdE1hc2sgPSAyOworICAgICAgICB2YXIgb25lUm93RG93biA9IHdpZHRoOworICAgICAgICB2YXIgdHdvUm93c0Rvd24gPSB3aWR0aCAqIDI7CisgICAgICAgIHZhciB0aHJlZVJvd3NEb3duID0gd2lkdGggKiAzOworICAgICAgICB2YXIgaU5leHQ7CisKKyAgICAgICAgZm9yICh2YXIgaTAgPSAwOyBpMCA8IGhlaWdodDsgaTAgPSBpTmV4dCkgeworICAgICAgICAgIGlOZXh0ID0gTWF0aC5taW4oaTAgKyA0LCBoZWlnaHQpOworICAgICAgICAgIHZhciBpbmRleEJhc2UgPSBpMCAqIHdpZHRoOworICAgICAgICAgIHZhciBjaGVja0FsbEVtcHR5ID0gaTAgKyAzIDwgaGVpZ2h0OworCisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgICB2YXIgaW5kZXgwID0gaW5kZXhCYXNlICsgajsKKyAgICAgICAgICAgIHZhciBhbGxFbXB0eSA9IGNoZWNrQWxsRW1wdHkgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MF0gPT09IDAgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmIHByb2Nlc3NpbmdGbGFnc1tpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDBdID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyBvbmVSb3dEb3duXSA9PT0gMCAmJiBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXgwICsgdHdvUm93c0Rvd25dID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0aHJlZVJvd3NEb3duXSA9PT0gMDsKKyAgICAgICAgICAgIHZhciBpMSA9IDAsCisgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleDA7CisgICAgICAgICAgICB2YXIgaSA9IGkwLAorICAgICAgICAgICAgICAgIHNpZ247CisKKyAgICAgICAgICAgIGlmIChhbGxFbXB0eSkgeworICAgICAgICAgICAgICB2YXIgaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBSVU5MRU5HVEhfQ09OVEVYVCk7CisKKyAgICAgICAgICAgICAgaWYgKCFoYXNTaWduaWZpY2FudENvZWZmaWNlbnQpIHsKKyAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleDBdKys7CisgICAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgb25lUm93RG93bl0rKzsKKyAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleDAgKyB0d29Sb3dzRG93bl0rKzsKKyAgICAgICAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleDAgKyB0aHJlZVJvd3NEb3duXSsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaTEgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMSB8IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKTsKKworICAgICAgICAgICAgICBpZiAoaTEgIT09IDApIHsKKyAgICAgICAgICAgICAgICBpID0gaTAgKyBpMTsKKyAgICAgICAgICAgICAgICBpbmRleCArPSBpMSAqIHdpZHRoOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc2lnbiA9IHRoaXMuZGVjb2RlU2lnbkJpdChpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduOworICAgICAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPSAxOworICAgICAgICAgICAgICB0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZShpLCBqLCBpbmRleCk7CisgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrOworICAgICAgICAgICAgICBpbmRleCA9IGluZGV4MDsKKworICAgICAgICAgICAgICBmb3IgKHZhciBpMiA9IGkwOyBpMiA8PSBpOyBpMisrLCBpbmRleCArPSB3aWR0aCkgeworICAgICAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaTErKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gaTAgKyBpMTsgaSA8IGlOZXh0OyBpKyssIGluZGV4ICs9IHdpZHRoKSB7CisgICAgICAgICAgICAgIGlmIChjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gfHwgKHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gJiBwcm9jZXNzZWRNYXNrKSAhPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdmFyIGNvbnRleHRMYWJlbCA9IGxhYmVsc1tuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdXTsKKyAgICAgICAgICAgICAgdmFyIGRlY2lzaW9uID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOworCisgICAgICAgICAgICAgIGlmIChkZWNpc2lvbiA9PT0gMSkgeworICAgICAgICAgICAgICAgIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzU2lnbltpbmRleF0gPSBzaWduOworICAgICAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdGbGFnc1tpbmRleF0gfD0gZmlyc3RNYWduaXR1ZGVCaXRNYXNrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LAorICAgICAgY2hlY2tTZWdtZW50YXRpb25TeW1ib2w6IGZ1bmN0aW9uIEJpdE1vZGVsX2NoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCkgeworICAgICAgICB2YXIgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjsKKyAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0czsKKyAgICAgICAgdmFyIHN5bWJvbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKSA8PCAzIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBVTklGT1JNX0NPTlRFWFQpIDw8IDIgfCBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIFVOSUZPUk1fQ09OVEVYVCkgPDwgMSB8IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgVU5JRk9STV9DT05URVhUKTsKKworICAgICAgICBpZiAoc3ltYm9sICE9PSAweGEpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgc2VnbWVudGF0aW9uIHN5bWJvbCIpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gQml0TW9kZWw7CisgIH0oKTsKKworICB2YXIgVHJhbnNmb3JtID0gZnVuY3Rpb24gVHJhbnNmb3JtQ2xvc3VyZSgpIHsKKyAgICBmdW5jdGlvbiBUcmFuc2Zvcm0oKSB7fQorCisgICAgVHJhbnNmb3JtLnByb3RvdHlwZS5jYWxjdWxhdGUgPSBmdW5jdGlvbiB0cmFuc2Zvcm1DYWxjdWxhdGUoc3ViYmFuZHMsIHUwLCB2MCkgeworICAgICAgdmFyIGxsID0gc3ViYmFuZHNbMF07CisKKyAgICAgIGZvciAodmFyIGkgPSAxLCBpaSA9IHN1YmJhbmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgbGwgPSB0aGlzLml0ZXJhdGUobGwsIHN1YmJhbmRzW2ldLCB1MCwgdjApOworICAgICAgfQorCisgICAgICByZXR1cm4gbGw7CisgICAgfTsKKworICAgIFRyYW5zZm9ybS5wcm90b3R5cGUuZXh0ZW5kID0gZnVuY3Rpb24gZXh0ZW5kKGJ1ZmZlciwgb2Zmc2V0LCBzaXplKSB7CisgICAgICB2YXIgaTEgPSBvZmZzZXQgLSAxLAorICAgICAgICAgIGoxID0gb2Zmc2V0ICsgMTsKKyAgICAgIHZhciBpMiA9IG9mZnNldCArIHNpemUgLSAyLAorICAgICAgICAgIGoyID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTsKKyAgICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTsKKyAgICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTsKKyAgICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTsKKyAgICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTsKKyAgICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTsKKyAgICAgIGJ1ZmZlcltpMV0gPSBidWZmZXJbajFdOworICAgICAgYnVmZmVyW2oyXSA9IGJ1ZmZlcltpMl07CisgICAgfTsKKworICAgIFRyYW5zZm9ybS5wcm90b3R5cGUuaXRlcmF0ZSA9IGZ1bmN0aW9uIFRyYW5zZm9ybV9pdGVyYXRlKGxsLCBobF9saF9oaCwgdTAsIHYwKSB7CisgICAgICB2YXIgbGxXaWR0aCA9IGxsLndpZHRoLAorICAgICAgICAgIGxsSGVpZ2h0ID0gbGwuaGVpZ2h0LAorICAgICAgICAgIGxsSXRlbXMgPSBsbC5pdGVtczsKKyAgICAgIHZhciB3aWR0aCA9IGhsX2xoX2hoLndpZHRoOworICAgICAgdmFyIGhlaWdodCA9IGhsX2xoX2hoLmhlaWdodDsKKyAgICAgIHZhciBpdGVtcyA9IGhsX2xoX2hoLml0ZW1zOworICAgICAgdmFyIGksIGosIGssIGwsIHUsIHY7CisKKyAgICAgIGZvciAoayA9IDAsIGkgPSAwOyBpIDwgbGxIZWlnaHQ7IGkrKykgeworICAgICAgICBsID0gaSAqIDIgKiB3aWR0aDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGxXaWR0aDsgaisrLCBrKyssIGwgKz0gMikgeworICAgICAgICAgIGl0ZW1zW2xdID0gbGxJdGVtc1trXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBsbEl0ZW1zID0gbGwuaXRlbXMgPSBudWxsOworICAgICAgdmFyIGJ1ZmZlclBhZGRpbmcgPSA0OworICAgICAgdmFyIHJvd0J1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKyAyICogYnVmZmVyUGFkZGluZyk7CisKKyAgICAgIGlmICh3aWR0aCA9PT0gMSkgeworICAgICAgICBpZiAoKHUwICYgMSkgIT09IDApIHsKKyAgICAgICAgICBmb3IgKHYgPSAwLCBrID0gMDsgdiA8IGhlaWdodDsgdisrLCBrICs9IHdpZHRoKSB7CisgICAgICAgICAgICBpdGVtc1trXSAqPSAwLjU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHYgPSAwLCBrID0gMDsgdiA8IGhlaWdodDsgdisrLCBrICs9IHdpZHRoKSB7CisgICAgICAgICAgcm93QnVmZmVyLnNldChpdGVtcy5zdWJhcnJheShrLCBrICsgd2lkdGgpLCBidWZmZXJQYWRkaW5nKTsKKyAgICAgICAgICB0aGlzLmV4dGVuZChyb3dCdWZmZXIsIGJ1ZmZlclBhZGRpbmcsIHdpZHRoKTsKKyAgICAgICAgICB0aGlzLmZpbHRlcihyb3dCdWZmZXIsIGJ1ZmZlclBhZGRpbmcsIHdpZHRoKTsKKyAgICAgICAgICBpdGVtcy5zZXQocm93QnVmZmVyLnN1YmFycmF5KGJ1ZmZlclBhZGRpbmcsIGJ1ZmZlclBhZGRpbmcgKyB3aWR0aCksIGspOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBudW1CdWZmZXJzID0gMTY7CisgICAgICB2YXIgY29sQnVmZmVycyA9IFtdOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKSB7CisgICAgICAgIGNvbEJ1ZmZlcnMucHVzaChuZXcgRmxvYXQzMkFycmF5KGhlaWdodCArIDIgKiBidWZmZXJQYWRkaW5nKSk7CisgICAgICB9CisKKyAgICAgIHZhciBiLAorICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSAwOworICAgICAgbGwgPSBidWZmZXJQYWRkaW5nICsgaGVpZ2h0OworCisgICAgICBpZiAoaGVpZ2h0ID09PSAxKSB7CisgICAgICAgIGlmICgodjAgJiAxKSAhPT0gMCkgeworICAgICAgICAgIGZvciAodSA9IDA7IHUgPCB3aWR0aDsgdSsrKSB7CisgICAgICAgICAgICBpdGVtc1t1XSAqPSAwLjU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHUgPSAwOyB1IDwgd2lkdGg7IHUrKykgeworICAgICAgICAgIGlmIChjdXJyZW50QnVmZmVyID09PSAwKSB7CisgICAgICAgICAgICBudW1CdWZmZXJzID0gTWF0aC5taW4od2lkdGggLSB1LCBudW1CdWZmZXJzKTsKKworICAgICAgICAgICAgZm9yIChrID0gdSwgbCA9IGJ1ZmZlclBhZGRpbmc7IGwgPCBsbDsgayArPSB3aWR0aCwgbCsrKSB7CisgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBudW1CdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBjb2xCdWZmZXJzW2JdW2xdID0gaXRlbXNbayArIGJdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBudW1CdWZmZXJzOworICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnRCdWZmZXItLTsKKyAgICAgICAgICB2YXIgYnVmZmVyID0gY29sQnVmZmVyc1tjdXJyZW50QnVmZmVyXTsKKyAgICAgICAgICB0aGlzLmV4dGVuZChidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7CisgICAgICAgICAgdGhpcy5maWx0ZXIoYnVmZmVyLCBidWZmZXJQYWRkaW5nLCBoZWlnaHQpOworCisgICAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXIgPT09IDApIHsKKyAgICAgICAgICAgIGsgPSB1IC0gbnVtQnVmZmVycyArIDE7CisKKyAgICAgICAgICAgIGZvciAobCA9IGJ1ZmZlclBhZGRpbmc7IGwgPCBsbDsgayArPSB3aWR0aCwgbCsrKSB7CisgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBudW1CdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBpdGVtc1trICsgYl0gPSBjb2xCdWZmZXJzW2JdW2xdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIHdpZHRoLAorICAgICAgICBoZWlnaHQsCisgICAgICAgIGl0ZW1zCisgICAgICB9OworICAgIH07CisKKyAgICByZXR1cm4gVHJhbnNmb3JtOworICB9KCk7CisKKyAgdmFyIElycmV2ZXJzaWJsZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIElycmV2ZXJzaWJsZVRyYW5zZm9ybUNsb3N1cmUoKSB7CisgICAgZnVuY3Rpb24gSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCkgeworICAgICAgVHJhbnNmb3JtLmNhbGwodGhpcyk7CisgICAgfQorCisgICAgSXJyZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7CisKKyAgICBJcnJldmVyc2libGVUcmFuc2Zvcm0ucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGlycmV2ZXJzaWJsZVRyYW5zZm9ybUZpbHRlcih4LCBvZmZzZXQsIGxlbmd0aCkgeworICAgICAgdmFyIGxlbiA9IGxlbmd0aCA+PiAxOworICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDsKKyAgICAgIHZhciBqLCBuLCBjdXJyZW50LCBuZXh0OworICAgICAgdmFyIGFscGhhID0gLTEuNTg2MTM0MzQyMDU5OTI0OworICAgICAgdmFyIGJldGEgPSAtMC4wNTI5ODAxMTg1NzI5NjE7CisgICAgICB2YXIgZ2FtbWEgPSAwLjg4MjkxMTA3NTUzMDkzNDsKKyAgICAgIHZhciBkZWx0YSA9IDAuNDQzNTA2ODUyMDQzOTcxOworICAgICAgdmFyIEsgPSAxLjIzMDE3NDEwNDkxNDAwMTsKKyAgICAgIHZhciBLXyA9IDEgLyBLOworICAgICAgaiA9IG9mZnNldCAtIDM7CisKKyAgICAgIGZvciAobiA9IGxlbiArIDQ7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIHhbal0gKj0gS187CisgICAgICB9CisKKyAgICAgIGogPSBvZmZzZXQgLSAyOworICAgICAgY3VycmVudCA9IGRlbHRhICogeFtqIC0gMV07CisKKyAgICAgIGZvciAobiA9IGxlbiArIDM7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIG5leHQgPSBkZWx0YSAqIHhbaiArIDFdOworICAgICAgICB4W2pdID0gSyAqIHhbal0gLSBjdXJyZW50IC0gbmV4dDsKKworICAgICAgICBpZiAobi0tKSB7CisgICAgICAgICAgaiArPSAyOworICAgICAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiArIDFdOworICAgICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGogPSBvZmZzZXQgLSAxOworICAgICAgY3VycmVudCA9IGdhbW1hICogeFtqIC0gMV07CisKKyAgICAgIGZvciAobiA9IGxlbiArIDI7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIG5leHQgPSBnYW1tYSAqIHhbaiArIDFdOworICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OworCisgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgY3VycmVudCA9IGdhbW1hICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBqID0gb2Zmc2V0OworICAgICAgY3VycmVudCA9IGJldGEgKiB4W2ogLSAxXTsKKworICAgICAgZm9yIChuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgbmV4dCA9IGJldGEgKiB4W2ogKyAxXTsKKyAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKworICAgICAgICBpZiAobi0tKSB7CisgICAgICAgICAgaiArPSAyOworICAgICAgICAgIGN1cnJlbnQgPSBiZXRhICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobGVuICE9PSAwKSB7CisgICAgICAgIGogPSBvZmZzZXQgKyAxOworICAgICAgICBjdXJyZW50ID0gYWxwaGEgKiB4W2ogLSAxXTsKKworICAgICAgICBmb3IgKG4gPSBsZW47IG4tLTsgaiArPSAyKSB7CisgICAgICAgICAgbmV4dCA9IGFscGhhICogeFtqICsgMV07CisgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKworICAgICAgICAgIGlmIChuLS0pIHsKKyAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiArIDFdOworICAgICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIHJldHVybiBJcnJldmVyc2libGVUcmFuc2Zvcm07CisgIH0oKTsKKworICB2YXIgUmV2ZXJzaWJsZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm1DbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIFJldmVyc2libGVUcmFuc2Zvcm0oKSB7CisgICAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTsKKyAgICB9CisKKyAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSk7CisKKyAgICBSZXZlcnNpYmxlVHJhbnNmb3JtLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiByZXZlcnNpYmxlVHJhbnNmb3JtRmlsdGVyKHgsIG9mZnNldCwgbGVuZ3RoKSB7CisgICAgICB2YXIgbGVuID0gbGVuZ3RoID4+IDE7CisgICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwOworICAgICAgdmFyIGosIG47CisKKyAgICAgIGZvciAoaiA9IG9mZnNldCwgbiA9IGxlbiArIDE7IG4tLTsgaiArPSAyKSB7CisgICAgICAgIHhbal0gLT0geFtqIC0gMV0gKyB4W2ogKyAxXSArIDIgPj4gMjsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gb2Zmc2V0ICsgMSwgbiA9IGxlbjsgbi0tOyBqICs9IDIpIHsKKyAgICAgICAgeFtqXSArPSB4W2ogLSAxXSArIHhbaiArIDFdID4+IDE7CisgICAgICB9CisgICAgfTsKKworICAgIHJldHVybiBSZXZlcnNpYmxlVHJhbnNmb3JtOworICB9KCk7CisKKyAgcmV0dXJuIEpweEltYWdlOworfSgpOworCitleHBvcnRzLkpweEltYWdlID0gSnB4SW1hZ2U7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvanB4X3N0cmVhbS5qcyBiL2xpYi9jb3JlL2pweF9zdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxMDc1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL2pweF9zdHJlYW0uanMKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkpweFN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF9zdHJlYW0gPSByZXF1aXJlKCIuL3N0cmVhbS5qcyIpOworCit2YXIgX2pweCA9IHJlcXVpcmUoIi4vanB4LmpzIik7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK2NvbnN0IEpweFN0cmVhbSA9IGZ1bmN0aW9uIEpweFN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEpweFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBkaWN0LCBwYXJhbXMpIHsKKyAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CisgICAgdGhpcy5kaWN0ID0gZGljdDsKKyAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKworICAgIF9zdHJlYW0uRGVjb2RlU3RyZWFtLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpOworICB9CisKKyAgSnB4U3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoX3N0cmVhbS5EZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpweFN0cmVhbS5wcm90b3R5cGUsICJieXRlcyIsIHsKKyAgICBnZXQ6IGZ1bmN0aW9uIEpweFN0cmVhbV9ieXRlcygpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYnl0ZXMiLCB0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSk7CisgICAgfSwKKyAgICBjb25maWd1cmFibGU6IHRydWUKKyAgfSk7CisKKyAgSnB4U3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7fTsKKworICBKcHhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBqcHhJbWFnZSA9IG5ldyBfanB4LkpweEltYWdlKCk7CisgICAganB4SW1hZ2UucGFyc2UodGhpcy5ieXRlcyk7CisgICAgY29uc3Qgd2lkdGggPSBqcHhJbWFnZS53aWR0aDsKKyAgICBjb25zdCBoZWlnaHQgPSBqcHhJbWFnZS5oZWlnaHQ7CisgICAgY29uc3QgY29tcG9uZW50c0NvdW50ID0ganB4SW1hZ2UuY29tcG9uZW50c0NvdW50OworICAgIGNvbnN0IHRpbGVDb3VudCA9IGpweEltYWdlLnRpbGVzLmxlbmd0aDsKKworICAgIGlmICh0aWxlQ291bnQgPT09IDEpIHsKKyAgICAgIHRoaXMuYnVmZmVyID0ganB4SW1hZ2UudGlsZXNbMF0uaXRlbXM7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiBjb21wb25lbnRzQ291bnQpOworCisgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRpbGVDb3VudDsgaysrKSB7CisgICAgICAgIGNvbnN0IHRpbGVDb21wb25lbnRzID0ganB4SW1hZ2UudGlsZXNba107CisgICAgICAgIGNvbnN0IHRpbGVXaWR0aCA9IHRpbGVDb21wb25lbnRzLndpZHRoOworICAgICAgICBjb25zdCB0aWxlSGVpZ2h0ID0gdGlsZUNvbXBvbmVudHMuaGVpZ2h0OworICAgICAgICBjb25zdCB0aWxlTGVmdCA9IHRpbGVDb21wb25lbnRzLmxlZnQ7CisgICAgICAgIGNvbnN0IHRpbGVUb3AgPSB0aWxlQ29tcG9uZW50cy50b3A7CisgICAgICAgIGNvbnN0IHNyYyA9IHRpbGVDb21wb25lbnRzLml0ZW1zOworICAgICAgICBsZXQgc3JjUG9zaXRpb24gPSAwOworICAgICAgICBsZXQgZGF0YVBvc2l0aW9uID0gKHdpZHRoICogdGlsZVRvcCArIHRpbGVMZWZ0KSAqIGNvbXBvbmVudHNDb3VudDsKKyAgICAgICAgY29uc3QgaW1nUm93U2l6ZSA9IHdpZHRoICogY29tcG9uZW50c0NvdW50OworICAgICAgICBjb25zdCB0aWxlUm93U2l6ZSA9IHRpbGVXaWR0aCAqIGNvbXBvbmVudHNDb3VudDsKKworICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRpbGVIZWlnaHQ7IGorKykgeworICAgICAgICAgIGNvbnN0IHJvd0J5dGVzID0gc3JjLnN1YmFycmF5KHNyY1Bvc2l0aW9uLCBzcmNQb3NpdGlvbiArIHRpbGVSb3dTaXplKTsKKyAgICAgICAgICBkYXRhLnNldChyb3dCeXRlcywgZGF0YVBvc2l0aW9uKTsKKyAgICAgICAgICBzcmNQb3NpdGlvbiArPSB0aWxlUm93U2l6ZTsKKyAgICAgICAgICBkYXRhUG9zaXRpb24gKz0gaW1nUm93U2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7CisgICAgfQorCisgICAgdGhpcy5idWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7CisgICAgdGhpcy5lb2YgPSB0cnVlOworICB9OworCisgIHJldHVybiBKcHhTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuSnB4U3RyZWFtID0gSnB4U3RyZWFtOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL21ldHJpY3MuanMgYi9saWIvY29yZS9tZXRyaWNzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjY4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9tZXRyaWNzLmpzCkBAIC0wLDAgKzEsMjk2OSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0TWV0cmljcyA9IHZvaWQgMDsKKwordmFyIF9jb3JlX3V0aWxzID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIik7CisKK3ZhciBnZXRNZXRyaWNzID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgdC5Db3VyaWVyID0gNjAwOworICB0WyJDb3VyaWVyLUJvbGQiXSA9IDYwMDsKKyAgdFsiQ291cmllci1Cb2xkT2JsaXF1ZSJdID0gNjAwOworICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9IDYwMDsKKyAgdC5IZWx2ZXRpY2EgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNzg7CisgICAgdC5leGNsYW0gPSAyNzg7CisgICAgdC5xdW90ZWRibCA9IDM1NTsKKyAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CisgICAgdC5kb2xsYXIgPSA1NTY7CisgICAgdC5wZXJjZW50ID0gODg5OworICAgIHQuYW1wZXJzYW5kID0gNjY3OworICAgIHQucXVvdGVyaWdodCA9IDIyMjsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDM4OTsKKyAgICB0LnBsdXMgPSA1ODQ7CisgICAgdC5jb21tYSA9IDI3ODsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI3ODsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDU1NjsKKyAgICB0Lm9uZSA9IDU1NjsKKyAgICB0LnR3byA9IDU1NjsKKyAgICB0LnRocmVlID0gNTU2OworICAgIHQuZm91ciA9IDU1NjsKKyAgICB0LmZpdmUgPSA1NTY7CisgICAgdC5zaXggPSA1NTY7CisgICAgdC5zZXZlbiA9IDU1NjsKKyAgICB0LmVpZ2h0ID0gNTU2OworICAgIHQubmluZSA9IDU1NjsKKyAgICB0LmNvbG9uID0gMjc4OworICAgIHQuc2VtaWNvbG9uID0gMjc4OworICAgIHQubGVzcyA9IDU4NDsKKyAgICB0LmVxdWFsID0gNTg0OworICAgIHQuZ3JlYXRlciA9IDU4NDsKKyAgICB0LnF1ZXN0aW9uID0gNTU2OworICAgIHQuYXQgPSAxMDE1OworICAgIHQuQSA9IDY2NzsKKyAgICB0LkIgPSA2Njc7CisgICAgdC5DID0gNzIyOworICAgIHQuRCA9IDcyMjsKKyAgICB0LkUgPSA2Njc7CisgICAgdC5GID0gNjExOworICAgIHQuRyA9IDc3ODsKKyAgICB0LkggPSA3MjI7CisgICAgdC5JID0gMjc4OworICAgIHQuSiA9IDUwMDsKKyAgICB0LksgPSA2Njc7CisgICAgdC5MID0gNTU2OworICAgIHQuTSA9IDgzMzsKKyAgICB0Lk4gPSA3MjI7CisgICAgdC5PID0gNzc4OworICAgIHQuUCA9IDY2NzsKKyAgICB0LlEgPSA3Nzg7CisgICAgdC5SID0gNzIyOworICAgIHQuUyA9IDY2NzsKKyAgICB0LlQgPSA2MTE7CisgICAgdC5VID0gNzIyOworICAgIHQuViA9IDY2NzsKKyAgICB0LlcgPSA5NDQ7CisgICAgdC5YID0gNjY3OworICAgIHQuWSA9IDY2NzsKKyAgICB0LlogPSA2MTE7CisgICAgdC5icmFja2V0bGVmdCA9IDI3ODsKKyAgICB0LmJhY2tzbGFzaCA9IDI3ODsKKyAgICB0LmJyYWNrZXRyaWdodCA9IDI3ODsKKyAgICB0LmFzY2lpY2lyY3VtID0gNDY5OworICAgIHQudW5kZXJzY29yZSA9IDU1NjsKKyAgICB0LnF1b3RlbGVmdCA9IDIyMjsKKyAgICB0LmEgPSA1NTY7CisgICAgdC5iID0gNTU2OworICAgIHQuYyA9IDUwMDsKKyAgICB0LmQgPSA1NTY7CisgICAgdC5lID0gNTU2OworICAgIHQuZiA9IDI3ODsKKyAgICB0LmcgPSA1NTY7CisgICAgdC5oID0gNTU2OworICAgIHQuaSA9IDIyMjsKKyAgICB0LmogPSAyMjI7CisgICAgdC5rID0gNTAwOworICAgIHQubCA9IDIyMjsKKyAgICB0Lm0gPSA4MzM7CisgICAgdC5uID0gNTU2OworICAgIHQubyA9IDU1NjsKKyAgICB0LnAgPSA1NTY7CisgICAgdC5xID0gNTU2OworICAgIHQuciA9IDMzMzsKKyAgICB0LnMgPSA1MDA7CisgICAgdC50ID0gMjc4OworICAgIHQudSA9IDU1NjsKKyAgICB0LnYgPSA1MDA7CisgICAgdC53ID0gNzIyOworICAgIHQueCA9IDUwMDsKKyAgICB0LnkgPSA1MDA7CisgICAgdC56ID0gNTAwOworICAgIHQuYnJhY2VsZWZ0ID0gMzM0OworICAgIHQuYmFyID0gMjYwOworICAgIHQuYnJhY2VyaWdodCA9IDMzNDsKKyAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7CisgICAgdC5leGNsYW1kb3duID0gMzMzOworICAgIHQuY2VudCA9IDU1NjsKKyAgICB0LnN0ZXJsaW5nID0gNTU2OworICAgIHQuZnJhY3Rpb24gPSAxNjc7CisgICAgdC55ZW4gPSA1NTY7CisgICAgdC5mbG9yaW4gPSA1NTY7CisgICAgdC5zZWN0aW9uID0gNTU2OworICAgIHQuY3VycmVuY3kgPSA1NTY7CisgICAgdC5xdW90ZXNpbmdsZSA9IDE5MTsKKyAgICB0LnF1b3RlZGJsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7CisgICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOworICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CisgICAgdC5maSA9IDUwMDsKKyAgICB0LmZsID0gNTAwOworICAgIHQuZW5kYXNoID0gNTU2OworICAgIHQuZGFnZ2VyID0gNTU2OworICAgIHQuZGFnZ2VyZGJsID0gNTU2OworICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CisgICAgdC5wYXJhZ3JhcGggPSA1Mzc7CisgICAgdC5idWxsZXQgPSAzNTA7CisgICAgdC5xdW90ZXNpbmdsYmFzZSA9IDIyMjsKKyAgICB0LnF1b3RlZGJsYmFzZSA9IDMzMzsKKyAgICB0LnF1b3RlZGJscmlnaHQgPSAzMzM7CisgICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKKyAgICB0LmVsbGlwc2lzID0gMTAwMDsKKyAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKKyAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKKyAgICB0LmdyYXZlID0gMzMzOworICAgIHQuYWN1dGUgPSAzMzM7CisgICAgdC5jaXJjdW1mbGV4ID0gMzMzOworICAgIHQudGlsZGUgPSAzMzM7CisgICAgdC5tYWNyb24gPSAzMzM7CisgICAgdC5icmV2ZSA9IDMzMzsKKyAgICB0LmRvdGFjY2VudCA9IDMzMzsKKyAgICB0LmRpZXJlc2lzID0gMzMzOworICAgIHQucmluZyA9IDMzMzsKKyAgICB0LmNlZGlsbGEgPSAzMzM7CisgICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CisgICAgdC5vZ29uZWsgPSAzMzM7CisgICAgdC5jYXJvbiA9IDMzMzsKKyAgICB0LmVtZGFzaCA9IDEwMDA7CisgICAgdC5BRSA9IDEwMDA7CisgICAgdC5vcmRmZW1pbmluZSA9IDM3MDsKKyAgICB0LkxzbGFzaCA9IDU1NjsKKyAgICB0Lk9zbGFzaCA9IDc3ODsKKyAgICB0Lk9FID0gMTAwMDsKKyAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTsKKyAgICB0LmFlID0gODg5OworICAgIHQuZG90bGVzc2kgPSAyNzg7CisgICAgdC5sc2xhc2ggPSAyMjI7CisgICAgdC5vc2xhc2ggPSA2MTE7CisgICAgdC5vZSA9IDk0NDsKKyAgICB0Lmdlcm1hbmRibHMgPSA2MTE7CisgICAgdC5JZGllcmVzaXMgPSAyNzg7CisgICAgdC5lYWN1dGUgPSA1NTY7CisgICAgdC5hYnJldmUgPSA1NTY7CisgICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OworICAgIHQuZWNhcm9uID0gNTU2OworICAgIHQuWWRpZXJlc2lzID0gNjY3OworICAgIHQuZGl2aWRlID0gNTg0OworICAgIHQuWWFjdXRlID0gNjY3OworICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hYWN1dGUgPSA1NTY7CisgICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LnlhY3V0ZSA9IDUwMDsKKyAgICB0LnNjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0LmVjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuVXJpbmcgPSA3MjI7CisgICAgdC5VZGllcmVzaXMgPSA3MjI7CisgICAgdC5hb2dvbmVrID0gNTU2OworICAgIHQuVWFjdXRlID0gNzIyOworICAgIHQudW9nb25layA9IDU1NjsKKyAgICB0LkVkaWVyZXNpcyA9IDY2NzsKKyAgICB0LkRjcm9hdCA9IDcyMjsKKyAgICB0LmNvbW1hYWNjZW50ID0gMjUwOworICAgIHQuY29weXJpZ2h0ID0gNzM3OworICAgIHQuRW1hY3JvbiA9IDY2NzsKKyAgICB0LmNjYXJvbiA9IDUwMDsKKyAgICB0LmFyaW5nID0gNTU2OworICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOworICAgIHQubGFjdXRlID0gMjIyOworICAgIHQuYWdyYXZlID0gNTU2OworICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOworICAgIHQuQ2FjdXRlID0gNzIyOworICAgIHQuYXRpbGRlID0gNTU2OworICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKKyAgICB0LnNjYXJvbiA9IDUwMDsKKyAgICB0LnNjZWRpbGxhID0gNTAwOworICAgIHQuaWFjdXRlID0gMjc4OworICAgIHQubG96ZW5nZSA9IDQ3MTsKKyAgICB0LlJjYXJvbiA9IDcyMjsKKyAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKKyAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5BbWFjcm9uID0gNjY3OworICAgIHQucmNhcm9uID0gMzMzOworICAgIHQuY2NlZGlsbGEgPSA1MDA7CisgICAgdC5aZG90YWNjZW50ID0gNjExOworICAgIHQuVGhvcm4gPSA2Njc7CisgICAgdC5PbWFjcm9uID0gNzc4OworICAgIHQuUmFjdXRlID0gNzIyOworICAgIHQuU2FjdXRlID0gNjY3OworICAgIHQuZGNhcm9uID0gNjQzOworICAgIHQuVW1hY3JvbiA9IDcyMjsKKyAgICB0LnVyaW5nID0gNTU2OworICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMzsKKyAgICB0Lk9ncmF2ZSA9IDc3ODsKKyAgICB0LkFncmF2ZSA9IDY2NzsKKyAgICB0LkFicmV2ZSA9IDY2NzsKKyAgICB0Lm11bHRpcGx5ID0gNTg0OworICAgIHQudWFjdXRlID0gNTU2OworICAgIHQuVGNhcm9uID0gNjExOworICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CisgICAgdC55ZGllcmVzaXMgPSA1MDA7CisgICAgdC5OYWN1dGUgPSA3MjI7CisgICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKKyAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OworICAgIHQuYWRpZXJlc2lzID0gNTU2OworICAgIHQuZWRpZXJlc2lzID0gNTU2OworICAgIHQuY2FjdXRlID0gNTAwOworICAgIHQubmFjdXRlID0gNTU2OworICAgIHQudW1hY3JvbiA9IDU1NjsKKyAgICB0Lk5jYXJvbiA9IDcyMjsKKyAgICB0LklhY3V0ZSA9IDI3ODsKKyAgICB0LnBsdXNtaW51cyA9IDU4NDsKKyAgICB0LmJyb2tlbmJhciA9IDI2MDsKKyAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7CisgICAgdC5HYnJldmUgPSA3Nzg7CisgICAgdC5JZG90YWNjZW50ID0gMjc4OworICAgIHQuc3VtbWF0aW9uID0gNjAwOworICAgIHQuRWdyYXZlID0gNjY3OworICAgIHQucmFjdXRlID0gMzMzOworICAgIHQub21hY3JvbiA9IDU1NjsKKyAgICB0LlphY3V0ZSA9IDYxMTsKKyAgICB0LlpjYXJvbiA9IDYxMTsKKyAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKKyAgICB0LkV0aCA9IDcyMjsKKyAgICB0LkNjZWRpbGxhID0gNzIyOworICAgIHQubGNvbW1hYWNjZW50ID0gMjIyOworICAgIHQudGNhcm9uID0gMzE3OworICAgIHQuZW9nb25layA9IDU1NjsKKyAgICB0LlVvZ29uZWsgPSA3MjI7CisgICAgdC5BYWN1dGUgPSA2Njc7CisgICAgdC5BZGllcmVzaXMgPSA2Njc7CisgICAgdC5lZ3JhdmUgPSA1NTY7CisgICAgdC56YWN1dGUgPSA1MDA7CisgICAgdC5pb2dvbmVrID0gMjIyOworICAgIHQuT2FjdXRlID0gNzc4OworICAgIHQub2FjdXRlID0gNTU2OworICAgIHQuYW1hY3JvbiA9IDU1NjsKKyAgICB0LnNhY3V0ZSA9IDUwMDsKKyAgICB0LmlkaWVyZXNpcyA9IDI3ODsKKyAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OworICAgIHQuVWdyYXZlID0gNzIyOworICAgIHQuRGVsdGEgPSA2MTI7CisgICAgdC50aG9ybiA9IDU1NjsKKyAgICB0LnR3b3N1cGVyaW9yID0gMzMzOworICAgIHQuT2RpZXJlc2lzID0gNzc4OworICAgIHQubXUgPSA1NTY7CisgICAgdC5pZ3JhdmUgPSAyNzg7CisgICAgdC5vaHVuZ2FydW1sYXV0ID0gNTU2OworICAgIHQuRW9nb25layA9IDY2NzsKKyAgICB0LmRjcm9hdCA9IDU1NjsKKyAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7CisgICAgdC5TY2VkaWxsYSA9IDY2NzsKKyAgICB0LmxjYXJvbiA9IDI5OTsKKyAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LkxhY3V0ZSA9IDU1NjsKKyAgICB0LnRyYWRlbWFyayA9IDEwMDA7CisgICAgdC5lZG90YWNjZW50ID0gNTU2OworICAgIHQuSWdyYXZlID0gMjc4OworICAgIHQuSW1hY3JvbiA9IDI3ODsKKyAgICB0LkxjYXJvbiA9IDU1NjsKKyAgICB0Lm9uZWhhbGYgPSA4MzQ7CisgICAgdC5sZXNzZXF1YWwgPSA1NDk7CisgICAgdC5vY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0Lm50aWxkZSA9IDU1NjsKKyAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5FYWN1dGUgPSA2Njc7CisgICAgdC5lbWFjcm9uID0gNTU2OworICAgIHQuZ2JyZXZlID0gNTU2OworICAgIHQub25lcXVhcnRlciA9IDgzNDsKKyAgICB0LlNjYXJvbiA9IDY2NzsKKyAgICB0LlNjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5vZ3JhdmUgPSA1NTY7CisgICAgdC5DY2Fyb24gPSA3MjI7CisgICAgdC51Z3JhdmUgPSA1NTY7CisgICAgdC5yYWRpY2FsID0gNDUzOworICAgIHQuRGNhcm9uID0gNzIyOworICAgIHQucmNvbW1hYWNjZW50ID0gMzMzOworICAgIHQuTnRpbGRlID0gNzIyOworICAgIHQub3RpbGRlID0gNTU2OworICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OworICAgIHQuQXRpbGRlID0gNjY3OworICAgIHQuQW9nb25layA9IDY2NzsKKyAgICB0LkFyaW5nID0gNjY3OworICAgIHQuT3RpbGRlID0gNzc4OworICAgIHQuemRvdGFjY2VudCA9IDUwMDsKKyAgICB0LkVjYXJvbiA9IDY2NzsKKyAgICB0LklvZ29uZWsgPSAyNzg7CisgICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5taW51cyA9IDU4NDsKKyAgICB0LkljaXJjdW1mbGV4ID0gMjc4OworICAgIHQubmNhcm9uID0gNTU2OworICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQubG9naWNhbG5vdCA9IDU4NDsKKyAgICB0Lm9kaWVyZXNpcyA9IDU1NjsKKyAgICB0LnVkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lm5vdGVxdWFsID0gNTQ5OworICAgIHQuZ2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQuZXRoID0gNTU2OworICAgIHQuemNhcm9uID0gNTAwOworICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OworICAgIHQub25lc3VwZXJpb3IgPSAzMzM7CisgICAgdC5pbWFjcm9uID0gMjc4OworICAgIHQuRXVybyA9IDU1NjsKKyAgfSk7CisgIHRbIkhlbHZldGljYS1Cb2xkIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNzg7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC5xdW90ZWRibCA9IDQ3NDsKKyAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CisgICAgdC5kb2xsYXIgPSA1NTY7CisgICAgdC5wZXJjZW50ID0gODg5OworICAgIHQuYW1wZXJzYW5kID0gNzIyOworICAgIHQucXVvdGVyaWdodCA9IDI3ODsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDM4OTsKKyAgICB0LnBsdXMgPSA1ODQ7CisgICAgdC5jb21tYSA9IDI3ODsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI3ODsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDU1NjsKKyAgICB0Lm9uZSA9IDU1NjsKKyAgICB0LnR3byA9IDU1NjsKKyAgICB0LnRocmVlID0gNTU2OworICAgIHQuZm91ciA9IDU1NjsKKyAgICB0LmZpdmUgPSA1NTY7CisgICAgdC5zaXggPSA1NTY7CisgICAgdC5zZXZlbiA9IDU1NjsKKyAgICB0LmVpZ2h0ID0gNTU2OworICAgIHQubmluZSA9IDU1NjsKKyAgICB0LmNvbG9uID0gMzMzOworICAgIHQuc2VtaWNvbG9uID0gMzMzOworICAgIHQubGVzcyA9IDU4NDsKKyAgICB0LmVxdWFsID0gNTg0OworICAgIHQuZ3JlYXRlciA9IDU4NDsKKyAgICB0LnF1ZXN0aW9uID0gNjExOworICAgIHQuYXQgPSA5NzU7CisgICAgdC5BID0gNzIyOworICAgIHQuQiA9IDcyMjsKKyAgICB0LkMgPSA3MjI7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzc4OworICAgIHQuSCA9IDcyMjsKKyAgICB0LkkgPSAyNzg7CisgICAgdC5KID0gNTU2OworICAgIHQuSyA9IDcyMjsKKyAgICB0LkwgPSA2MTE7CisgICAgdC5NID0gODMzOworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3Nzg7CisgICAgdC5QID0gNjY3OworICAgIHQuUSA9IDc3ODsKKyAgICB0LlIgPSA3MjI7CisgICAgdC5TID0gNjY3OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDk0NDsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjY3OworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOworICAgIHQuYXNjaWljaXJjdW0gPSA1ODQ7CisgICAgdC51bmRlcnNjb3JlID0gNTU2OworICAgIHQucXVvdGVsZWZ0ID0gMjc4OworICAgIHQuYSA9IDU1NjsKKyAgICB0LmIgPSA2MTE7CisgICAgdC5jID0gNTU2OworICAgIHQuZCA9IDYxMTsKKyAgICB0LmUgPSA1NTY7CisgICAgdC5mID0gMzMzOworICAgIHQuZyA9IDYxMTsKKyAgICB0LmggPSA2MTE7CisgICAgdC5pID0gMjc4OworICAgIHQuaiA9IDI3ODsKKyAgICB0LmsgPSA1NTY7CisgICAgdC5sID0gMjc4OworICAgIHQubSA9IDg4OTsKKyAgICB0Lm4gPSA2MTE7CisgICAgdC5vID0gNjExOworICAgIHQucCA9IDYxMTsKKyAgICB0LnEgPSA2MTE7CisgICAgdC5yID0gMzg5OworICAgIHQucyA9IDU1NjsKKyAgICB0LnQgPSAzMzM7CisgICAgdC51ID0gNjExOworICAgIHQudiA9IDU1NjsKKyAgICB0LncgPSA3Nzg7CisgICAgdC54ID0gNTU2OworICAgIHQueSA9IDU1NjsKKyAgICB0LnogPSA1MDA7CisgICAgdC5icmFjZWxlZnQgPSAzODk7CisgICAgdC5iYXIgPSAyODA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzg5OworICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CisgICAgdC5jZW50ID0gNTU2OworICAgIHQuc3RlcmxpbmcgPSA1NTY7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDU1NjsKKyAgICB0LmZsb3JpbiA9IDU1NjsKKyAgICB0LnNlY3Rpb24gPSA1NTY7CisgICAgdC5jdXJyZW5jeSA9IDU1NjsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMjM4OworICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNjExOworICAgIHQuZmwgPSA2MTE7CisgICAgdC5lbmRhc2ggPSA1NTY7CisgICAgdC5kYWdnZXIgPSA1NTY7CisgICAgdC5kYWdnZXJkYmwgPSA1NTY7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKKyAgICB0LnBhcmFncmFwaCA9IDU1NjsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjc4OworICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOworICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNjExOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gMTAwMDsKKyAgICB0Lm9yZGZlbWluaW5lID0gMzcwOworICAgIHQuTHNsYXNoID0gNjExOworICAgIHQuT3NsYXNoID0gNzc4OworICAgIHQuT0UgPSAxMDAwOworICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OworICAgIHQuYWUgPSA4ODk7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDYxMTsKKyAgICB0Lm9lID0gOTQ0OworICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKKyAgICB0LklkaWVyZXNpcyA9IDI3ODsKKyAgICB0LmVhY3V0ZSA9IDU1NjsKKyAgICB0LmFicmV2ZSA9IDU1NjsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA2MTE7CisgICAgdC5lY2Fyb24gPSA1NTY7CisgICAgdC5ZZGllcmVzaXMgPSA2Njc7CisgICAgdC5kaXZpZGUgPSA1ODQ7CisgICAgdC5ZYWN1dGUgPSA2Njc7CisgICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LmFhY3V0ZSA9IDU1NjsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTU2OworICAgIHQuc2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1NTY7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNjExOworICAgIHQuRWRpZXJlc2lzID0gNjY3OworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3Mzc7CisgICAgdC5FbWFjcm9uID0gNjY3OworICAgIHQuY2Nhcm9uID0gNTU2OworICAgIHQuYXJpbmcgPSA1NTY7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA1NTY7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA3MjI7CisgICAgdC5hdGlsZGUgPSA1NTY7CisgICAgdC5FZG90YWNjZW50ID0gNjY3OworICAgIHQuc2Nhcm9uID0gNTU2OworICAgIHQuc2NlZGlsbGEgPSA1NTY7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDk0OworICAgIHQuUmNhcm9uID0gNzIyOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OworICAgIHQudWNpcmN1bWZsZXggPSA2MTE7CisgICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LkFtYWNyb24gPSA3MjI7CisgICAgdC5yY2Fyb24gPSAzODk7CisgICAgdC5jY2VkaWxsYSA9IDU1NjsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDY2NzsKKyAgICB0Lk9tYWNyb24gPSA3Nzg7CisgICAgdC5SYWN1dGUgPSA3MjI7CisgICAgdC5TYWN1dGUgPSA2Njc7CisgICAgdC5kY2Fyb24gPSA3NDM7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA2MTE7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOworICAgIHQuT2dyYXZlID0gNzc4OworICAgIHQuQWdyYXZlID0gNzIyOworICAgIHQuQWJyZXZlID0gNzIyOworICAgIHQubXVsdGlwbHkgPSA1ODQ7CisgICAgdC51YWN1dGUgPSA2MTE7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKKyAgICB0LnlkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hZGllcmVzaXMgPSA1NTY7CisgICAgdC5lZGllcmVzaXMgPSA1NTY7CisgICAgdC5jYWN1dGUgPSA1NTY7CisgICAgdC5uYWN1dGUgPSA2MTE7CisgICAgdC51bWFjcm9uID0gNjExOworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMjc4OworICAgIHQucGx1c21pbnVzID0gNTg0OworICAgIHQuYnJva2VuYmFyID0gMjgwOworICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKKyAgICB0LkdicmV2ZSA9IDc3ODsKKyAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2Njc7CisgICAgdC5yYWN1dGUgPSAzODk7CisgICAgdC5vbWFjcm9uID0gNjExOworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA3MjI7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzODk7CisgICAgdC5lb2dvbmVrID0gNTU2OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDcyMjsKKyAgICB0LkFkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmVncmF2ZSA9IDU1NjsKKyAgICB0LnphY3V0ZSA9IDUwMDsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3Nzg7CisgICAgdC5vYWN1dGUgPSA2MTE7CisgICAgdC5hbWFjcm9uID0gNTU2OworICAgIHQuc2FjdXRlID0gNTU2OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNjExOworICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZGllcmVzaXMgPSA3Nzg7CisgICAgdC5tdSA9IDYxMTsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7CisgICAgdC5Fb2dvbmVrID0gNjY3OworICAgIHQuZGNyb2F0ID0gNjExOworICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKKyAgICB0LlNjZWRpbGxhID0gNjY3OworICAgIHQubGNhcm9uID0gNDAwOworICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGFjdXRlID0gNjExOworICAgIHQudHJhZGVtYXJrID0gMTAwMDsKKyAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5JZ3JhdmUgPSAyNzg7CisgICAgdC5JbWFjcm9uID0gMjc4OworICAgIHQuTGNhcm9uID0gNjExOworICAgIHQub25laGFsZiA9IDgzNDsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0Lm9jaXJjdW1mbGV4ID0gNjExOworICAgIHQubnRpbGRlID0gNjExOworICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LkVhY3V0ZSA9IDY2NzsKKyAgICB0LmVtYWNyb24gPSA1NTY7CisgICAgdC5nYnJldmUgPSA2MTE7CisgICAgdC5vbmVxdWFydGVyID0gODM0OworICAgIHQuU2Nhcm9uID0gNjY3OworICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0Lm9ncmF2ZSA9IDYxMTsKKyAgICB0LkNjYXJvbiA9IDcyMjsKKyAgICB0LnVncmF2ZSA9IDYxMTsKKyAgICB0LnJhZGljYWwgPSA1NDk7CisgICAgdC5EY2Fyb24gPSA3MjI7CisgICAgdC5yY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5OdGlsZGUgPSA3MjI7CisgICAgdC5vdGlsZGUgPSA2MTE7CisgICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5BdGlsZGUgPSA3MjI7CisgICAgdC5Bb2dvbmVrID0gNzIyOworICAgIHQuQXJpbmcgPSA3MjI7CisgICAgdC5PdGlsZGUgPSA3Nzg7CisgICAgdC56ZG90YWNjZW50ID0gNTAwOworICAgIHQuRWNhcm9uID0gNjY3OworICAgIHQuSW9nb25layA9IDI3ODsKKyAgICB0Lmtjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lm1pbnVzID0gNTg0OworICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5uY2Fyb24gPSA2MTE7CisgICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CisgICAgdC5sb2dpY2Fsbm90ID0gNTg0OworICAgIHQub2RpZXJlc2lzID0gNjExOworICAgIHQudWRpZXJlc2lzID0gNjExOworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5nY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5ldGggPSA2MTE7CisgICAgdC56Y2Fyb24gPSA1MDA7CisgICAgdC5uY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKKyAgICB0LmltYWNyb24gPSAyNzg7CisgICAgdC5FdXJvID0gNTU2OworICB9KTsKKyAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNzg7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC5xdW90ZWRibCA9IDQ3NDsKKyAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CisgICAgdC5kb2xsYXIgPSA1NTY7CisgICAgdC5wZXJjZW50ID0gODg5OworICAgIHQuYW1wZXJzYW5kID0gNzIyOworICAgIHQucXVvdGVyaWdodCA9IDI3ODsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDM4OTsKKyAgICB0LnBsdXMgPSA1ODQ7CisgICAgdC5jb21tYSA9IDI3ODsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI3ODsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDU1NjsKKyAgICB0Lm9uZSA9IDU1NjsKKyAgICB0LnR3byA9IDU1NjsKKyAgICB0LnRocmVlID0gNTU2OworICAgIHQuZm91ciA9IDU1NjsKKyAgICB0LmZpdmUgPSA1NTY7CisgICAgdC5zaXggPSA1NTY7CisgICAgdC5zZXZlbiA9IDU1NjsKKyAgICB0LmVpZ2h0ID0gNTU2OworICAgIHQubmluZSA9IDU1NjsKKyAgICB0LmNvbG9uID0gMzMzOworICAgIHQuc2VtaWNvbG9uID0gMzMzOworICAgIHQubGVzcyA9IDU4NDsKKyAgICB0LmVxdWFsID0gNTg0OworICAgIHQuZ3JlYXRlciA9IDU4NDsKKyAgICB0LnF1ZXN0aW9uID0gNjExOworICAgIHQuYXQgPSA5NzU7CisgICAgdC5BID0gNzIyOworICAgIHQuQiA9IDcyMjsKKyAgICB0LkMgPSA3MjI7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzc4OworICAgIHQuSCA9IDcyMjsKKyAgICB0LkkgPSAyNzg7CisgICAgdC5KID0gNTU2OworICAgIHQuSyA9IDcyMjsKKyAgICB0LkwgPSA2MTE7CisgICAgdC5NID0gODMzOworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3Nzg7CisgICAgdC5QID0gNjY3OworICAgIHQuUSA9IDc3ODsKKyAgICB0LlIgPSA3MjI7CisgICAgdC5TID0gNjY3OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDk0NDsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjY3OworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOworICAgIHQuYXNjaWljaXJjdW0gPSA1ODQ7CisgICAgdC51bmRlcnNjb3JlID0gNTU2OworICAgIHQucXVvdGVsZWZ0ID0gMjc4OworICAgIHQuYSA9IDU1NjsKKyAgICB0LmIgPSA2MTE7CisgICAgdC5jID0gNTU2OworICAgIHQuZCA9IDYxMTsKKyAgICB0LmUgPSA1NTY7CisgICAgdC5mID0gMzMzOworICAgIHQuZyA9IDYxMTsKKyAgICB0LmggPSA2MTE7CisgICAgdC5pID0gMjc4OworICAgIHQuaiA9IDI3ODsKKyAgICB0LmsgPSA1NTY7CisgICAgdC5sID0gMjc4OworICAgIHQubSA9IDg4OTsKKyAgICB0Lm4gPSA2MTE7CisgICAgdC5vID0gNjExOworICAgIHQucCA9IDYxMTsKKyAgICB0LnEgPSA2MTE7CisgICAgdC5yID0gMzg5OworICAgIHQucyA9IDU1NjsKKyAgICB0LnQgPSAzMzM7CisgICAgdC51ID0gNjExOworICAgIHQudiA9IDU1NjsKKyAgICB0LncgPSA3Nzg7CisgICAgdC54ID0gNTU2OworICAgIHQueSA9IDU1NjsKKyAgICB0LnogPSA1MDA7CisgICAgdC5icmFjZWxlZnQgPSAzODk7CisgICAgdC5iYXIgPSAyODA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzg5OworICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CisgICAgdC5jZW50ID0gNTU2OworICAgIHQuc3RlcmxpbmcgPSA1NTY7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDU1NjsKKyAgICB0LmZsb3JpbiA9IDU1NjsKKyAgICB0LnNlY3Rpb24gPSA1NTY7CisgICAgdC5jdXJyZW5jeSA9IDU1NjsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMjM4OworICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNjExOworICAgIHQuZmwgPSA2MTE7CisgICAgdC5lbmRhc2ggPSA1NTY7CisgICAgdC5kYWdnZXIgPSA1NTY7CisgICAgdC5kYWdnZXJkYmwgPSA1NTY7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKKyAgICB0LnBhcmFncmFwaCA9IDU1NjsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjc4OworICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOworICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNjExOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gMTAwMDsKKyAgICB0Lm9yZGZlbWluaW5lID0gMzcwOworICAgIHQuTHNsYXNoID0gNjExOworICAgIHQuT3NsYXNoID0gNzc4OworICAgIHQuT0UgPSAxMDAwOworICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OworICAgIHQuYWUgPSA4ODk7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDYxMTsKKyAgICB0Lm9lID0gOTQ0OworICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKKyAgICB0LklkaWVyZXNpcyA9IDI3ODsKKyAgICB0LmVhY3V0ZSA9IDU1NjsKKyAgICB0LmFicmV2ZSA9IDU1NjsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA2MTE7CisgICAgdC5lY2Fyb24gPSA1NTY7CisgICAgdC5ZZGllcmVzaXMgPSA2Njc7CisgICAgdC5kaXZpZGUgPSA1ODQ7CisgICAgdC5ZYWN1dGUgPSA2Njc7CisgICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LmFhY3V0ZSA9IDU1NjsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTU2OworICAgIHQuc2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1NTY7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNjExOworICAgIHQuRWRpZXJlc2lzID0gNjY3OworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3Mzc7CisgICAgdC5FbWFjcm9uID0gNjY3OworICAgIHQuY2Nhcm9uID0gNTU2OworICAgIHQuYXJpbmcgPSA1NTY7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA1NTY7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA3MjI7CisgICAgdC5hdGlsZGUgPSA1NTY7CisgICAgdC5FZG90YWNjZW50ID0gNjY3OworICAgIHQuc2Nhcm9uID0gNTU2OworICAgIHQuc2NlZGlsbGEgPSA1NTY7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDk0OworICAgIHQuUmNhcm9uID0gNzIyOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OworICAgIHQudWNpcmN1bWZsZXggPSA2MTE7CisgICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LkFtYWNyb24gPSA3MjI7CisgICAgdC5yY2Fyb24gPSAzODk7CisgICAgdC5jY2VkaWxsYSA9IDU1NjsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDY2NzsKKyAgICB0Lk9tYWNyb24gPSA3Nzg7CisgICAgdC5SYWN1dGUgPSA3MjI7CisgICAgdC5TYWN1dGUgPSA2Njc7CisgICAgdC5kY2Fyb24gPSA3NDM7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA2MTE7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOworICAgIHQuT2dyYXZlID0gNzc4OworICAgIHQuQWdyYXZlID0gNzIyOworICAgIHQuQWJyZXZlID0gNzIyOworICAgIHQubXVsdGlwbHkgPSA1ODQ7CisgICAgdC51YWN1dGUgPSA2MTE7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKKyAgICB0LnlkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hZGllcmVzaXMgPSA1NTY7CisgICAgdC5lZGllcmVzaXMgPSA1NTY7CisgICAgdC5jYWN1dGUgPSA1NTY7CisgICAgdC5uYWN1dGUgPSA2MTE7CisgICAgdC51bWFjcm9uID0gNjExOworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMjc4OworICAgIHQucGx1c21pbnVzID0gNTg0OworICAgIHQuYnJva2VuYmFyID0gMjgwOworICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKKyAgICB0LkdicmV2ZSA9IDc3ODsKKyAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2Njc7CisgICAgdC5yYWN1dGUgPSAzODk7CisgICAgdC5vbWFjcm9uID0gNjExOworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA3MjI7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzODk7CisgICAgdC5lb2dvbmVrID0gNTU2OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDcyMjsKKyAgICB0LkFkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmVncmF2ZSA9IDU1NjsKKyAgICB0LnphY3V0ZSA9IDUwMDsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3Nzg7CisgICAgdC5vYWN1dGUgPSA2MTE7CisgICAgdC5hbWFjcm9uID0gNTU2OworICAgIHQuc2FjdXRlID0gNTU2OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNjExOworICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZGllcmVzaXMgPSA3Nzg7CisgICAgdC5tdSA9IDYxMTsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7CisgICAgdC5Fb2dvbmVrID0gNjY3OworICAgIHQuZGNyb2F0ID0gNjExOworICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKKyAgICB0LlNjZWRpbGxhID0gNjY3OworICAgIHQubGNhcm9uID0gNDAwOworICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGFjdXRlID0gNjExOworICAgIHQudHJhZGVtYXJrID0gMTAwMDsKKyAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5JZ3JhdmUgPSAyNzg7CisgICAgdC5JbWFjcm9uID0gMjc4OworICAgIHQuTGNhcm9uID0gNjExOworICAgIHQub25laGFsZiA9IDgzNDsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0Lm9jaXJjdW1mbGV4ID0gNjExOworICAgIHQubnRpbGRlID0gNjExOworICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LkVhY3V0ZSA9IDY2NzsKKyAgICB0LmVtYWNyb24gPSA1NTY7CisgICAgdC5nYnJldmUgPSA2MTE7CisgICAgdC5vbmVxdWFydGVyID0gODM0OworICAgIHQuU2Nhcm9uID0gNjY3OworICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0Lm9ncmF2ZSA9IDYxMTsKKyAgICB0LkNjYXJvbiA9IDcyMjsKKyAgICB0LnVncmF2ZSA9IDYxMTsKKyAgICB0LnJhZGljYWwgPSA1NDk7CisgICAgdC5EY2Fyb24gPSA3MjI7CisgICAgdC5yY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5OdGlsZGUgPSA3MjI7CisgICAgdC5vdGlsZGUgPSA2MTE7CisgICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5BdGlsZGUgPSA3MjI7CisgICAgdC5Bb2dvbmVrID0gNzIyOworICAgIHQuQXJpbmcgPSA3MjI7CisgICAgdC5PdGlsZGUgPSA3Nzg7CisgICAgdC56ZG90YWNjZW50ID0gNTAwOworICAgIHQuRWNhcm9uID0gNjY3OworICAgIHQuSW9nb25layA9IDI3ODsKKyAgICB0Lmtjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lm1pbnVzID0gNTg0OworICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5uY2Fyb24gPSA2MTE7CisgICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CisgICAgdC5sb2dpY2Fsbm90ID0gNTg0OworICAgIHQub2RpZXJlc2lzID0gNjExOworICAgIHQudWRpZXJlc2lzID0gNjExOworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5nY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5ldGggPSA2MTE7CisgICAgdC56Y2Fyb24gPSA1MDA7CisgICAgdC5uY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKKyAgICB0LmltYWNyb24gPSAyNzg7CisgICAgdC5FdXJvID0gNTU2OworICB9KTsKKyAgdFsiSGVsdmV0aWNhLU9ibGlxdWUiXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI3ODsKKyAgICB0LmV4Y2xhbSA9IDI3ODsKKyAgICB0LnF1b3RlZGJsID0gMzU1OworICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKKyAgICB0LmRvbGxhciA9IDU1NjsKKyAgICB0LnBlcmNlbnQgPSA4ODk7CisgICAgdC5hbXBlcnNhbmQgPSA2Njc7CisgICAgdC5xdW90ZXJpZ2h0ID0gMjIyOworICAgIHQucGFyZW5sZWZ0ID0gMzMzOworICAgIHQucGFyZW5yaWdodCA9IDMzMzsKKyAgICB0LmFzdGVyaXNrID0gMzg5OworICAgIHQucGx1cyA9IDU4NDsKKyAgICB0LmNvbW1hID0gMjc4OworICAgIHQuaHlwaGVuID0gMzMzOworICAgIHQucGVyaW9kID0gMjc4OworICAgIHQuc2xhc2ggPSAyNzg7CisgICAgdC56ZXJvID0gNTU2OworICAgIHQub25lID0gNTU2OworICAgIHQudHdvID0gNTU2OworICAgIHQudGhyZWUgPSA1NTY7CisgICAgdC5mb3VyID0gNTU2OworICAgIHQuZml2ZSA9IDU1NjsKKyAgICB0LnNpeCA9IDU1NjsKKyAgICB0LnNldmVuID0gNTU2OworICAgIHQuZWlnaHQgPSA1NTY7CisgICAgdC5uaW5lID0gNTU2OworICAgIHQuY29sb24gPSAyNzg7CisgICAgdC5zZW1pY29sb24gPSAyNzg7CisgICAgdC5sZXNzID0gNTg0OworICAgIHQuZXF1YWwgPSA1ODQ7CisgICAgdC5ncmVhdGVyID0gNTg0OworICAgIHQucXVlc3Rpb24gPSA1NTY7CisgICAgdC5hdCA9IDEwMTU7CisgICAgdC5BID0gNjY3OworICAgIHQuQiA9IDY2NzsKKyAgICB0LkMgPSA3MjI7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2MTE7CisgICAgdC5HID0gNzc4OworICAgIHQuSCA9IDcyMjsKKyAgICB0LkkgPSAyNzg7CisgICAgdC5KID0gNTAwOworICAgIHQuSyA9IDY2NzsKKyAgICB0LkwgPSA1NTY7CisgICAgdC5NID0gODMzOworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3Nzg7CisgICAgdC5QID0gNjY3OworICAgIHQuUSA9IDc3ODsKKyAgICB0LlIgPSA3MjI7CisgICAgdC5TID0gNjY3OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDk0NDsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjY3OworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4OworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMjc4OworICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7CisgICAgdC51bmRlcnNjb3JlID0gNTU2OworICAgIHQucXVvdGVsZWZ0ID0gMjIyOworICAgIHQuYSA9IDU1NjsKKyAgICB0LmIgPSA1NTY7CisgICAgdC5jID0gNTAwOworICAgIHQuZCA9IDU1NjsKKyAgICB0LmUgPSA1NTY7CisgICAgdC5mID0gMjc4OworICAgIHQuZyA9IDU1NjsKKyAgICB0LmggPSA1NTY7CisgICAgdC5pID0gMjIyOworICAgIHQuaiA9IDIyMjsKKyAgICB0LmsgPSA1MDA7CisgICAgdC5sID0gMjIyOworICAgIHQubSA9IDgzMzsKKyAgICB0Lm4gPSA1NTY7CisgICAgdC5vID0gNTU2OworICAgIHQucCA9IDU1NjsKKyAgICB0LnEgPSA1NTY7CisgICAgdC5yID0gMzMzOworICAgIHQucyA9IDUwMDsKKyAgICB0LnQgPSAyNzg7CisgICAgdC51ID0gNTU2OworICAgIHQudiA9IDUwMDsKKyAgICB0LncgPSA3MjI7CisgICAgdC54ID0gNTAwOworICAgIHQueSA9IDUwMDsKKyAgICB0LnogPSA1MDA7CisgICAgdC5icmFjZWxlZnQgPSAzMzQ7CisgICAgdC5iYXIgPSAyNjA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzM0OworICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CisgICAgdC5jZW50ID0gNTU2OworICAgIHQuc3RlcmxpbmcgPSA1NTY7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDU1NjsKKyAgICB0LmZsb3JpbiA9IDU1NjsKKyAgICB0LnNlY3Rpb24gPSA1NTY7CisgICAgdC5jdXJyZW5jeSA9IDU1NjsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMTkxOworICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNTAwOworICAgIHQuZmwgPSA1MDA7CisgICAgdC5lbmRhc2ggPSA1NTY7CisgICAgdC5kYWdnZXIgPSA1NTY7CisgICAgdC5kYWdnZXJkYmwgPSA1NTY7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKKyAgICB0LnBhcmFncmFwaCA9IDUzNzsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyOworICAgIHQucXVvdGVkYmxiYXNlID0gMzMzOworICAgIHQucXVvdGVkYmxyaWdodCA9IDMzMzsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNjExOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gMTAwMDsKKyAgICB0Lm9yZGZlbWluaW5lID0gMzcwOworICAgIHQuTHNsYXNoID0gNTU2OworICAgIHQuT3NsYXNoID0gNzc4OworICAgIHQuT0UgPSAxMDAwOworICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OworICAgIHQuYWUgPSA4ODk7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDIyMjsKKyAgICB0Lm9zbGFzaCA9IDYxMTsKKyAgICB0Lm9lID0gOTQ0OworICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKKyAgICB0LklkaWVyZXNpcyA9IDI3ODsKKyAgICB0LmVhY3V0ZSA9IDU1NjsKKyAgICB0LmFicmV2ZSA9IDU1NjsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CisgICAgdC5lY2Fyb24gPSA1NTY7CisgICAgdC5ZZGllcmVzaXMgPSA2Njc7CisgICAgdC5kaXZpZGUgPSA1ODQ7CisgICAgdC5ZYWN1dGUgPSA2Njc7CisgICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFhY3V0ZSA9IDU1NjsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTAwOworICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1NTY7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNTU2OworICAgIHQuRWRpZXJlc2lzID0gNjY3OworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3Mzc7CisgICAgdC5FbWFjcm9uID0gNjY3OworICAgIHQuY2Nhcm9uID0gNTAwOworICAgIHQuYXJpbmcgPSA1NTY7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyMjI7CisgICAgdC5hZ3JhdmUgPSA1NTY7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA3MjI7CisgICAgdC5hdGlsZGUgPSA1NTY7CisgICAgdC5FZG90YWNjZW50ID0gNjY3OworICAgIHQuc2Nhcm9uID0gNTAwOworICAgIHQuc2NlZGlsbGEgPSA1MDA7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDcxOworICAgIHQuUmNhcm9uID0gNzIyOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OworICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CisgICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LkFtYWNyb24gPSA2Njc7CisgICAgdC5yY2Fyb24gPSAzMzM7CisgICAgdC5jY2VkaWxsYSA9IDUwMDsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDY2NzsKKyAgICB0Lk9tYWNyb24gPSA3Nzg7CisgICAgdC5SYWN1dGUgPSA3MjI7CisgICAgdC5TYWN1dGUgPSA2Njc7CisgICAgdC5kY2Fyb24gPSA2NDM7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA1NTY7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOworICAgIHQuT2dyYXZlID0gNzc4OworICAgIHQuQWdyYXZlID0gNjY3OworICAgIHQuQWJyZXZlID0gNjY3OworICAgIHQubXVsdGlwbHkgPSA1ODQ7CisgICAgdC51YWN1dGUgPSA1NTY7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjsKKyAgICB0LnlkaWVyZXNpcyA9IDUwMDsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hZGllcmVzaXMgPSA1NTY7CisgICAgdC5lZGllcmVzaXMgPSA1NTY7CisgICAgdC5jYWN1dGUgPSA1MDA7CisgICAgdC5uYWN1dGUgPSA1NTY7CisgICAgdC51bWFjcm9uID0gNTU2OworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMjc4OworICAgIHQucGx1c21pbnVzID0gNTg0OworICAgIHQuYnJva2VuYmFyID0gMjYwOworICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKKyAgICB0LkdicmV2ZSA9IDc3ODsKKyAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2Njc7CisgICAgdC5yYWN1dGUgPSAzMzM7CisgICAgdC5vbWFjcm9uID0gNTU2OworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA3MjI7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7CisgICAgdC50Y2Fyb24gPSAzMTc7CisgICAgdC5lb2dvbmVrID0gNTU2OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDY2NzsKKyAgICB0LkFkaWVyZXNpcyA9IDY2NzsKKyAgICB0LmVncmF2ZSA9IDU1NjsKKyAgICB0LnphY3V0ZSA9IDUwMDsKKyAgICB0LmlvZ29uZWsgPSAyMjI7CisgICAgdC5PYWN1dGUgPSA3Nzg7CisgICAgdC5vYWN1dGUgPSA1NTY7CisgICAgdC5hbWFjcm9uID0gNTU2OworICAgIHQuc2FjdXRlID0gNTAwOworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNTU2OworICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CisgICAgdC5PZGllcmVzaXMgPSA3Nzg7CisgICAgdC5tdSA9IDU1NjsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1NTY7CisgICAgdC5Fb2dvbmVrID0gNjY3OworICAgIHQuZGNyb2F0ID0gNTU2OworICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKKyAgICB0LlNjZWRpbGxhID0gNjY3OworICAgIHQubGNhcm9uID0gMjk5OworICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGFjdXRlID0gNTU2OworICAgIHQudHJhZGVtYXJrID0gMTAwMDsKKyAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5JZ3JhdmUgPSAyNzg7CisgICAgdC5JbWFjcm9uID0gMjc4OworICAgIHQuTGNhcm9uID0gNTU2OworICAgIHQub25laGFsZiA9IDgzNDsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0Lm9jaXJjdW1mbGV4ID0gNTU2OworICAgIHQubnRpbGRlID0gNTU2OworICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKKyAgICB0LkVhY3V0ZSA9IDY2NzsKKyAgICB0LmVtYWNyb24gPSA1NTY7CisgICAgdC5nYnJldmUgPSA1NTY7CisgICAgdC5vbmVxdWFydGVyID0gODM0OworICAgIHQuU2Nhcm9uID0gNjY3OworICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKKyAgICB0LmRlZ3JlZSA9IDQwMDsKKyAgICB0Lm9ncmF2ZSA9IDU1NjsKKyAgICB0LkNjYXJvbiA9IDcyMjsKKyAgICB0LnVncmF2ZSA9IDU1NjsKKyAgICB0LnJhZGljYWwgPSA0NTM7CisgICAgdC5EY2Fyb24gPSA3MjI7CisgICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7CisgICAgdC5OdGlsZGUgPSA3MjI7CisgICAgdC5vdGlsZGUgPSA1NTY7CisgICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5BdGlsZGUgPSA2Njc7CisgICAgdC5Bb2dvbmVrID0gNjY3OworICAgIHQuQXJpbmcgPSA2Njc7CisgICAgdC5PdGlsZGUgPSA3Nzg7CisgICAgdC56ZG90YWNjZW50ID0gNTAwOworICAgIHQuRWNhcm9uID0gNjY3OworICAgIHQuSW9nb25layA9IDI3ODsKKyAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lm1pbnVzID0gNTg0OworICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5uY2Fyb24gPSA1NTY7CisgICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC5sb2dpY2Fsbm90ID0gNTg0OworICAgIHQub2RpZXJlc2lzID0gNTU2OworICAgIHQudWRpZXJlc2lzID0gNTU2OworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5ldGggPSA1NTY7CisgICAgdC56Y2Fyb24gPSA1MDA7CisgICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKKyAgICB0LmltYWNyb24gPSAyNzg7CisgICAgdC5FdXJvID0gNTU2OworICB9KTsKKyAgdC5TeW1ib2wgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNTA7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC51bml2ZXJzYWwgPSA3MTM7CisgICAgdC5udW1iZXJzaWduID0gNTAwOworICAgIHQuZXhpc3RlbnRpYWwgPSA1NDk7CisgICAgdC5wZXJjZW50ID0gODMzOworICAgIHQuYW1wZXJzYW5kID0gNzc4OworICAgIHQuc3VjaHRoYXQgPSA0Mzk7CisgICAgdC5wYXJlbmxlZnQgPSAzMzM7CisgICAgdC5wYXJlbnJpZ2h0ID0gMzMzOworICAgIHQuYXN0ZXJpc2ttYXRoID0gNTAwOworICAgIHQucGx1cyA9IDU0OTsKKyAgICB0LmNvbW1hID0gMjUwOworICAgIHQubWludXMgPSA1NDk7CisgICAgdC5wZXJpb2QgPSAyNTA7CisgICAgdC5zbGFzaCA9IDI3ODsKKyAgICB0Lnplcm8gPSA1MDA7CisgICAgdC5vbmUgPSA1MDA7CisgICAgdC50d28gPSA1MDA7CisgICAgdC50aHJlZSA9IDUwMDsKKyAgICB0LmZvdXIgPSA1MDA7CisgICAgdC5maXZlID0gNTAwOworICAgIHQuc2l4ID0gNTAwOworICAgIHQuc2V2ZW4gPSA1MDA7CisgICAgdC5laWdodCA9IDUwMDsKKyAgICB0Lm5pbmUgPSA1MDA7CisgICAgdC5jb2xvbiA9IDI3ODsKKyAgICB0LnNlbWljb2xvbiA9IDI3ODsKKyAgICB0Lmxlc3MgPSA1NDk7CisgICAgdC5lcXVhbCA9IDU0OTsKKyAgICB0LmdyZWF0ZXIgPSA1NDk7CisgICAgdC5xdWVzdGlvbiA9IDQ0NDsKKyAgICB0LmNvbmdydWVudCA9IDU0OTsKKyAgICB0LkFscGhhID0gNzIyOworICAgIHQuQmV0YSA9IDY2NzsKKyAgICB0LkNoaSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQuRXBzaWxvbiA9IDYxMTsKKyAgICB0LlBoaSA9IDc2MzsKKyAgICB0LkdhbW1hID0gNjAzOworICAgIHQuRXRhID0gNzIyOworICAgIHQuSW90YSA9IDMzMzsKKyAgICB0LnRoZXRhMSA9IDYzMTsKKyAgICB0LkthcHBhID0gNzIyOworICAgIHQuTGFtYmRhID0gNjg2OworICAgIHQuTXUgPSA4ODk7CisgICAgdC5OdSA9IDcyMjsKKyAgICB0Lk9taWNyb24gPSA3MjI7CisgICAgdC5QaSA9IDc2ODsKKyAgICB0LlRoZXRhID0gNzQxOworICAgIHQuUmhvID0gNTU2OworICAgIHQuU2lnbWEgPSA1OTI7CisgICAgdC5UYXUgPSA2MTE7CisgICAgdC5VcHNpbG9uID0gNjkwOworICAgIHQuc2lnbWExID0gNDM5OworICAgIHQuT21lZ2EgPSA3Njg7CisgICAgdC5YaSA9IDY0NTsKKyAgICB0LlBzaSA9IDc5NTsKKyAgICB0LlpldGEgPSA2MTE7CisgICAgdC5icmFja2V0bGVmdCA9IDMzMzsKKyAgICB0LnRoZXJlZm9yZSA9IDg2MzsKKyAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKKyAgICB0LnBlcnBlbmRpY3VsYXIgPSA2NTg7CisgICAgdC51bmRlcnNjb3JlID0gNTAwOworICAgIHQucmFkaWNhbGV4ID0gNTAwOworICAgIHQuYWxwaGEgPSA2MzE7CisgICAgdC5iZXRhID0gNTQ5OworICAgIHQuY2hpID0gNTQ5OworICAgIHQuZGVsdGEgPSA0OTQ7CisgICAgdC5lcHNpbG9uID0gNDM5OworICAgIHQucGhpID0gNTIxOworICAgIHQuZ2FtbWEgPSA0MTE7CisgICAgdC5ldGEgPSA2MDM7CisgICAgdC5pb3RhID0gMzI5OworICAgIHQucGhpMSA9IDYwMzsKKyAgICB0LmthcHBhID0gNTQ5OworICAgIHQubGFtYmRhID0gNTQ5OworICAgIHQubXUgPSA1NzY7CisgICAgdC5udSA9IDUyMTsKKyAgICB0Lm9taWNyb24gPSA1NDk7CisgICAgdC5waSA9IDU0OTsKKyAgICB0LnRoZXRhID0gNTIxOworICAgIHQucmhvID0gNTQ5OworICAgIHQuc2lnbWEgPSA2MDM7CisgICAgdC50YXUgPSA0Mzk7CisgICAgdC51cHNpbG9uID0gNTc2OworICAgIHQub21lZ2ExID0gNzEzOworICAgIHQub21lZ2EgPSA2ODY7CisgICAgdC54aSA9IDQ5MzsKKyAgICB0LnBzaSA9IDY4NjsKKyAgICB0LnpldGEgPSA0OTQ7CisgICAgdC5icmFjZWxlZnQgPSA0ODA7CisgICAgdC5iYXIgPSAyMDA7CisgICAgdC5icmFjZXJpZ2h0ID0gNDgwOworICAgIHQuc2ltaWxhciA9IDU0OTsKKyAgICB0LkV1cm8gPSA3NTA7CisgICAgdC5VcHNpbG9uMSA9IDYyMDsKKyAgICB0Lm1pbnV0ZSA9IDI0NzsKKyAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQuaW5maW5pdHkgPSA3MTM7CisgICAgdC5mbG9yaW4gPSA1MDA7CisgICAgdC5jbHViID0gNzUzOworICAgIHQuZGlhbW9uZCA9IDc1MzsKKyAgICB0LmhlYXJ0ID0gNzUzOworICAgIHQuc3BhZGUgPSA3NTM7CisgICAgdC5hcnJvd2JvdGggPSAxMDQyOworICAgIHQuYXJyb3dsZWZ0ID0gOTg3OworICAgIHQuYXJyb3d1cCA9IDYwMzsKKyAgICB0LmFycm93cmlnaHQgPSA5ODc7CisgICAgdC5hcnJvd2Rvd24gPSA2MDM7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5wbHVzbWludXMgPSA1NDk7CisgICAgdC5zZWNvbmQgPSA0MTE7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5tdWx0aXBseSA9IDU0OTsKKyAgICB0LnByb3BvcnRpb25hbCA9IDcxMzsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDk0OworICAgIHQuYnVsbGV0ID0gNDYwOworICAgIHQuZGl2aWRlID0gNTQ5OworICAgIHQubm90ZXF1YWwgPSA1NDk7CisgICAgdC5lcXVpdmFsZW5jZSA9IDU0OTsKKyAgICB0LmFwcHJveGVxdWFsID0gNTQ5OworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQuYXJyb3d2ZXJ0ZXggPSA2MDM7CisgICAgdC5hcnJvd2hvcml6ZXggPSAxMDAwOworICAgIHQuY2FycmlhZ2VyZXR1cm4gPSA2NTg7CisgICAgdC5hbGVwaCA9IDgyMzsKKyAgICB0LklmcmFrdHVyID0gNjg2OworICAgIHQuUmZyYWt0dXIgPSA3OTU7CisgICAgdC53ZWllcnN0cmFzcyA9IDk4NzsKKyAgICB0LmNpcmNsZW11bHRpcGx5ID0gNzY4OworICAgIHQuY2lyY2xlcGx1cyA9IDc2ODsKKyAgICB0LmVtcHR5c2V0ID0gODIzOworICAgIHQuaW50ZXJzZWN0aW9uID0gNzY4OworICAgIHQudW5pb24gPSA3Njg7CisgICAgdC5wcm9wZXJzdXBlcnNldCA9IDcxMzsKKyAgICB0LnJlZmxleHN1cGVyc2V0ID0gNzEzOworICAgIHQubm90c3Vic2V0ID0gNzEzOworICAgIHQucHJvcGVyc3Vic2V0ID0gNzEzOworICAgIHQucmVmbGV4c3Vic2V0ID0gNzEzOworICAgIHQuZWxlbWVudCA9IDcxMzsKKyAgICB0Lm5vdGVsZW1lbnQgPSA3MTM7CisgICAgdC5hbmdsZSA9IDc2ODsKKyAgICB0LmdyYWRpZW50ID0gNzEzOworICAgIHQucmVnaXN0ZXJzZXJpZiA9IDc5MDsKKyAgICB0LmNvcHlyaWdodHNlcmlmID0gNzkwOworICAgIHQudHJhZGVtYXJrc2VyaWYgPSA4OTA7CisgICAgdC5wcm9kdWN0ID0gODIzOworICAgIHQucmFkaWNhbCA9IDU0OTsKKyAgICB0LmRvdG1hdGggPSAyNTA7CisgICAgdC5sb2dpY2Fsbm90ID0gNzEzOworICAgIHQubG9naWNhbGFuZCA9IDYwMzsKKyAgICB0LmxvZ2ljYWxvciA9IDYwMzsKKyAgICB0LmFycm93ZGJsYm90aCA9IDEwNDI7CisgICAgdC5hcnJvd2RibGxlZnQgPSA5ODc7CisgICAgdC5hcnJvd2RibHVwID0gNjAzOworICAgIHQuYXJyb3dkYmxyaWdodCA9IDk4NzsKKyAgICB0LmFycm93ZGJsZG93biA9IDYwMzsKKyAgICB0LmxvemVuZ2UgPSA0OTQ7CisgICAgdC5hbmdsZWxlZnQgPSAzMjk7CisgICAgdC5yZWdpc3RlcnNhbnMgPSA3OTA7CisgICAgdC5jb3B5cmlnaHRzYW5zID0gNzkwOworICAgIHQudHJhZGVtYXJrc2FucyA9IDc4NjsKKyAgICB0LnN1bW1hdGlvbiA9IDcxMzsKKyAgICB0LnBhcmVubGVmdHRwID0gMzg0OworICAgIHQucGFyZW5sZWZ0ZXggPSAzODQ7CisgICAgdC5wYXJlbmxlZnRidCA9IDM4NDsKKyAgICB0LmJyYWNrZXRsZWZ0dHAgPSAzODQ7CisgICAgdC5icmFja2V0bGVmdGV4ID0gMzg0OworICAgIHQuYnJhY2tldGxlZnRidCA9IDM4NDsKKyAgICB0LmJyYWNlbGVmdHRwID0gNDk0OworICAgIHQuYnJhY2VsZWZ0bWlkID0gNDk0OworICAgIHQuYnJhY2VsZWZ0YnQgPSA0OTQ7CisgICAgdC5icmFjZWV4ID0gNDk0OworICAgIHQuYW5nbGVyaWdodCA9IDMyOTsKKyAgICB0LmludGVncmFsID0gMjc0OworICAgIHQuaW50ZWdyYWx0cCA9IDY4NjsKKyAgICB0LmludGVncmFsZXggPSA2ODY7CisgICAgdC5pbnRlZ3JhbGJ0ID0gNjg2OworICAgIHQucGFyZW5yaWdodHRwID0gMzg0OworICAgIHQucGFyZW5yaWdodGV4ID0gMzg0OworICAgIHQucGFyZW5yaWdodGJ0ID0gMzg0OworICAgIHQuYnJhY2tldHJpZ2h0dHAgPSAzODQ7CisgICAgdC5icmFja2V0cmlnaHRleCA9IDM4NDsKKyAgICB0LmJyYWNrZXRyaWdodGJ0ID0gMzg0OworICAgIHQuYnJhY2VyaWdodHRwID0gNDk0OworICAgIHQuYnJhY2VyaWdodG1pZCA9IDQ5NDsKKyAgICB0LmJyYWNlcmlnaHRidCA9IDQ5NDsKKyAgICB0LmFwcGxlID0gNzkwOworICB9KTsKKyAgdFsiVGltZXMtUm9tYW4iXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI1MDsKKyAgICB0LmV4Y2xhbSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsID0gNDA4OworICAgIHQubnVtYmVyc2lnbiA9IDUwMDsKKyAgICB0LmRvbGxhciA9IDUwMDsKKyAgICB0LnBlcmNlbnQgPSA4MzM7CisgICAgdC5hbXBlcnNhbmQgPSA3Nzg7CisgICAgdC5xdW90ZXJpZ2h0ID0gMzMzOworICAgIHQucGFyZW5sZWZ0ID0gMzMzOworICAgIHQucGFyZW5yaWdodCA9IDMzMzsKKyAgICB0LmFzdGVyaXNrID0gNTAwOworICAgIHQucGx1cyA9IDU2NDsKKyAgICB0LmNvbW1hID0gMjUwOworICAgIHQuaHlwaGVuID0gMzMzOworICAgIHQucGVyaW9kID0gMjUwOworICAgIHQuc2xhc2ggPSAyNzg7CisgICAgdC56ZXJvID0gNTAwOworICAgIHQub25lID0gNTAwOworICAgIHQudHdvID0gNTAwOworICAgIHQudGhyZWUgPSA1MDA7CisgICAgdC5mb3VyID0gNTAwOworICAgIHQuZml2ZSA9IDUwMDsKKyAgICB0LnNpeCA9IDUwMDsKKyAgICB0LnNldmVuID0gNTAwOworICAgIHQuZWlnaHQgPSA1MDA7CisgICAgdC5uaW5lID0gNTAwOworICAgIHQuY29sb24gPSAyNzg7CisgICAgdC5zZW1pY29sb24gPSAyNzg7CisgICAgdC5sZXNzID0gNTY0OworICAgIHQuZXF1YWwgPSA1NjQ7CisgICAgdC5ncmVhdGVyID0gNTY0OworICAgIHQucXVlc3Rpb24gPSA0NDQ7CisgICAgdC5hdCA9IDkyMTsKKyAgICB0LkEgPSA3MjI7CisgICAgdC5CID0gNjY3OworICAgIHQuQyA9IDY2NzsKKyAgICB0LkQgPSA3MjI7CisgICAgdC5FID0gNjExOworICAgIHQuRiA9IDU1NjsKKyAgICB0LkcgPSA3MjI7CisgICAgdC5IID0gNzIyOworICAgIHQuSSA9IDMzMzsKKyAgICB0LkogPSAzODk7CisgICAgdC5LID0gNzIyOworICAgIHQuTCA9IDYxMTsKKyAgICB0Lk0gPSA4ODk7CisgICAgdC5OID0gNzIyOworICAgIHQuTyA9IDcyMjsKKyAgICB0LlAgPSA1NTY7CisgICAgdC5RID0gNzIyOworICAgIHQuUiA9IDY2NzsKKyAgICB0LlMgPSA1NTY7CisgICAgdC5UID0gNjExOworICAgIHQuVSA9IDcyMjsKKyAgICB0LlYgPSA3MjI7CisgICAgdC5XID0gOTQ0OworICAgIHQuWCA9IDcyMjsKKyAgICB0LlkgPSA3MjI7CisgICAgdC5aID0gNjExOworICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CisgICAgdC5iYWNrc2xhc2ggPSAyNzg7CisgICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CisgICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKKyAgICB0LnVuZGVyc2NvcmUgPSA1MDA7CisgICAgdC5xdW90ZWxlZnQgPSAzMzM7CisgICAgdC5hID0gNDQ0OworICAgIHQuYiA9IDUwMDsKKyAgICB0LmMgPSA0NDQ7CisgICAgdC5kID0gNTAwOworICAgIHQuZSA9IDQ0NDsKKyAgICB0LmYgPSAzMzM7CisgICAgdC5nID0gNTAwOworICAgIHQuaCA9IDUwMDsKKyAgICB0LmkgPSAyNzg7CisgICAgdC5qID0gMjc4OworICAgIHQuayA9IDUwMDsKKyAgICB0LmwgPSAyNzg7CisgICAgdC5tID0gNzc4OworICAgIHQubiA9IDUwMDsKKyAgICB0Lm8gPSA1MDA7CisgICAgdC5wID0gNTAwOworICAgIHQucSA9IDUwMDsKKyAgICB0LnIgPSAzMzM7CisgICAgdC5zID0gMzg5OworICAgIHQudCA9IDI3ODsKKyAgICB0LnUgPSA1MDA7CisgICAgdC52ID0gNTAwOworICAgIHQudyA9IDcyMjsKKyAgICB0LnggPSA1MDA7CisgICAgdC55ID0gNTAwOworICAgIHQueiA9IDQ0NDsKKyAgICB0LmJyYWNlbGVmdCA9IDQ4MDsKKyAgICB0LmJhciA9IDIwMDsKKyAgICB0LmJyYWNlcmlnaHQgPSA0ODA7CisgICAgdC5hc2NpaXRpbGRlID0gNTQxOworICAgIHQuZXhjbGFtZG93biA9IDMzMzsKKyAgICB0LmNlbnQgPSA1MDA7CisgICAgdC5zdGVybGluZyA9IDUwMDsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQueWVuID0gNTAwOworICAgIHQuZmxvcmluID0gNTAwOworICAgIHQuc2VjdGlvbiA9IDUwMDsKKyAgICB0LmN1cnJlbmN5ID0gNTAwOworICAgIHQucXVvdGVzaW5nbGUgPSAxODA7CisgICAgdC5xdW90ZWRibGxlZnQgPSA0NDQ7CisgICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwOworICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOworICAgIHQuZmkgPSA1NTY7CisgICAgdC5mbCA9IDU1NjsKKyAgICB0LmVuZGFzaCA9IDUwMDsKKyAgICB0LmRhZ2dlciA9IDUwMDsKKyAgICB0LmRhZ2dlcmRibCA9IDUwMDsKKyAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOworICAgIHQucGFyYWdyYXBoID0gNDUzOworICAgIHQuYnVsbGV0ID0gMzUwOworICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CisgICAgdC5xdW90ZWRibGJhc2UgPSA0NDQ7CisgICAgdC5xdW90ZWRibHJpZ2h0ID0gNDQ0OworICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA0NDQ7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSAxMDAwOworICAgIHQuQUUgPSA4ODk7CisgICAgdC5vcmRmZW1pbmluZSA9IDI3NjsKKyAgICB0LkxzbGFzaCA9IDYxMTsKKyAgICB0Lk9zbGFzaCA9IDcyMjsKKyAgICB0Lk9FID0gODg5OworICAgIHQub3JkbWFzY3VsaW5lID0gMzEwOworICAgIHQuYWUgPSA2Njc7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDUwMDsKKyAgICB0Lm9lID0gNzIyOworICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKKyAgICB0LklkaWVyZXNpcyA9IDMzMzsKKyAgICB0LmVhY3V0ZSA9IDQ0NDsKKyAgICB0LmFicmV2ZSA9IDQ0NDsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5lY2Fyb24gPSA0NDQ7CisgICAgdC5ZZGllcmVzaXMgPSA3MjI7CisgICAgdC5kaXZpZGUgPSA1NjQ7CisgICAgdC5ZYWN1dGUgPSA3MjI7CisgICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LmFhY3V0ZSA9IDQ0NDsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNTAwOworICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OworICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA0NDQ7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNTAwOworICAgIHQuRWRpZXJlc2lzID0gNjExOworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3NjA7CisgICAgdC5FbWFjcm9uID0gNjExOworICAgIHQuY2Nhcm9uID0gNDQ0OworICAgIHQuYXJpbmcgPSA0NDQ7CisgICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA0NDQ7CisgICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CisgICAgdC5DYWN1dGUgPSA2Njc7CisgICAgdC5hdGlsZGUgPSA0NDQ7CisgICAgdC5FZG90YWNjZW50ID0gNjExOworICAgIHQuc2Nhcm9uID0gMzg5OworICAgIHQuc2NlZGlsbGEgPSAzODk7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDcxOworICAgIHQuUmNhcm9uID0gNjY3OworICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CisgICAgdC5hY2lyY3VtZmxleCA9IDQ0NDsKKyAgICB0LkFtYWNyb24gPSA3MjI7CisgICAgdC5yY2Fyb24gPSAzMzM7CisgICAgdC5jY2VkaWxsYSA9IDQ0NDsKKyAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CisgICAgdC5UaG9ybiA9IDU1NjsKKyAgICB0Lk9tYWNyb24gPSA3MjI7CisgICAgdC5SYWN1dGUgPSA2Njc7CisgICAgdC5TYWN1dGUgPSA1NTY7CisgICAgdC5kY2Fyb24gPSA1ODg7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA1MDA7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOworICAgIHQuT2dyYXZlID0gNzIyOworICAgIHQuQWdyYXZlID0gNzIyOworICAgIHQuQWJyZXZlID0gNzIyOworICAgIHQubXVsdGlwbHkgPSA1NjQ7CisgICAgdC51YWN1dGUgPSA1MDA7CisgICAgdC5UY2Fyb24gPSA2MTE7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjsKKyAgICB0LnlkaWVyZXNpcyA9IDUwMDsKKyAgICB0Lk5hY3V0ZSA9IDcyMjsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CisgICAgdC5hZGllcmVzaXMgPSA0NDQ7CisgICAgdC5lZGllcmVzaXMgPSA0NDQ7CisgICAgdC5jYWN1dGUgPSA0NDQ7CisgICAgdC5uYWN1dGUgPSA1MDA7CisgICAgdC51bWFjcm9uID0gNTAwOworICAgIHQuTmNhcm9uID0gNzIyOworICAgIHQuSWFjdXRlID0gMzMzOworICAgIHQucGx1c21pbnVzID0gNTY0OworICAgIHQuYnJva2VuYmFyID0gMjAwOworICAgIHQucmVnaXN0ZXJlZCA9IDc2MDsKKyAgICB0LkdicmV2ZSA9IDcyMjsKKyAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2MTE7CisgICAgdC5yYWN1dGUgPSAzMzM7CisgICAgdC5vbWFjcm9uID0gNTAwOworICAgIHQuWmFjdXRlID0gNjExOworICAgIHQuWmNhcm9uID0gNjExOworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA2Njc7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzMjY7CisgICAgdC5lb2dvbmVrID0gNDQ0OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDcyMjsKKyAgICB0LkFkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmVncmF2ZSA9IDQ0NDsKKyAgICB0LnphY3V0ZSA9IDQ0NDsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3MjI7CisgICAgdC5vYWN1dGUgPSA1MDA7CisgICAgdC5hbWFjcm9uID0gNDQ0OworICAgIHQuc2FjdXRlID0gMzg5OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNTAwOworICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZGllcmVzaXMgPSA3MjI7CisgICAgdC5tdSA9IDUwMDsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5Fb2dvbmVrID0gNjExOworICAgIHQuZGNyb2F0ID0gNTAwOworICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKKyAgICB0LlNjZWRpbGxhID0gNTU2OworICAgIHQubGNhcm9uID0gMzQ0OworICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQuTGFjdXRlID0gNjExOworICAgIHQudHJhZGVtYXJrID0gOTgwOworICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKKyAgICB0LklncmF2ZSA9IDMzMzsKKyAgICB0LkltYWNyb24gPSAzMzM7CisgICAgdC5MY2Fyb24gPSA2MTE7CisgICAgdC5vbmVoYWxmID0gNzUwOworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CisgICAgdC5udGlsZGUgPSA1MDA7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjExOworICAgIHQuZW1hY3JvbiA9IDQ0NDsKKyAgICB0LmdicmV2ZSA9IDUwMDsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CisgICAgdC5TY2Fyb24gPSA1NTY7CisgICAgdC5TY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNTAwOworICAgIHQuQ2Nhcm9uID0gNjY3OworICAgIHQudWdyYXZlID0gNTAwOworICAgIHQucmFkaWNhbCA9IDQ1MzsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKKyAgICB0Lk50aWxkZSA9IDcyMjsKKyAgICB0Lm90aWxkZSA9IDUwMDsKKyAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0LkF0aWxkZSA9IDcyMjsKKyAgICB0LkFvZ29uZWsgPSA3MjI7CisgICAgdC5BcmluZyA9IDcyMjsKKyAgICB0Lk90aWxkZSA9IDcyMjsKKyAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CisgICAgdC5FY2Fyb24gPSA2MTE7CisgICAgdC5Jb2dvbmVrID0gMzMzOworICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQubWludXMgPSA1NjQ7CisgICAgdC5JY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0Lm5jYXJvbiA9IDUwMDsKKyAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LmxvZ2ljYWxub3QgPSA1NjQ7CisgICAgdC5vZGllcmVzaXMgPSA1MDA7CisgICAgdC51ZGllcmVzaXMgPSA1MDA7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0LmV0aCA9IDUwMDsKKyAgICB0LnpjYXJvbiA9IDQ0NDsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzAwOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1MDA7CisgIH0pOworICB0WyJUaW1lcy1Cb2xkIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNTA7CisgICAgdC5leGNsYW0gPSAzMzM7CisgICAgdC5xdW90ZWRibCA9IDU1NTsKKyAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CisgICAgdC5kb2xsYXIgPSA1MDA7CisgICAgdC5wZXJjZW50ID0gMTAwMDsKKyAgICB0LmFtcGVyc2FuZCA9IDgzMzsKKyAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CisgICAgdC5wYXJlbmxlZnQgPSAzMzM7CisgICAgdC5wYXJlbnJpZ2h0ID0gMzMzOworICAgIHQuYXN0ZXJpc2sgPSA1MDA7CisgICAgdC5wbHVzID0gNTcwOworICAgIHQuY29tbWEgPSAyNTA7CisgICAgdC5oeXBoZW4gPSAzMzM7CisgICAgdC5wZXJpb2QgPSAyNTA7CisgICAgdC5zbGFzaCA9IDI3ODsKKyAgICB0Lnplcm8gPSA1MDA7CisgICAgdC5vbmUgPSA1MDA7CisgICAgdC50d28gPSA1MDA7CisgICAgdC50aHJlZSA9IDUwMDsKKyAgICB0LmZvdXIgPSA1MDA7CisgICAgdC5maXZlID0gNTAwOworICAgIHQuc2l4ID0gNTAwOworICAgIHQuc2V2ZW4gPSA1MDA7CisgICAgdC5laWdodCA9IDUwMDsKKyAgICB0Lm5pbmUgPSA1MDA7CisgICAgdC5jb2xvbiA9IDMzMzsKKyAgICB0LnNlbWljb2xvbiA9IDMzMzsKKyAgICB0Lmxlc3MgPSA1NzA7CisgICAgdC5lcXVhbCA9IDU3MDsKKyAgICB0LmdyZWF0ZXIgPSA1NzA7CisgICAgdC5xdWVzdGlvbiA9IDUwMDsKKyAgICB0LmF0ID0gOTMwOworICAgIHQuQSA9IDcyMjsKKyAgICB0LkIgPSA2Njc7CisgICAgdC5DID0gNzIyOworICAgIHQuRCA9IDcyMjsKKyAgICB0LkUgPSA2Njc7CisgICAgdC5GID0gNjExOworICAgIHQuRyA9IDc3ODsKKyAgICB0LkggPSA3Nzg7CisgICAgdC5JID0gMzg5OworICAgIHQuSiA9IDUwMDsKKyAgICB0LksgPSA3Nzg7CisgICAgdC5MID0gNjY3OworICAgIHQuTSA9IDk0NDsKKyAgICB0Lk4gPSA3MjI7CisgICAgdC5PID0gNzc4OworICAgIHQuUCA9IDYxMTsKKyAgICB0LlEgPSA3Nzg7CisgICAgdC5SID0gNzIyOworICAgIHQuUyA9IDU1NjsKKyAgICB0LlQgPSA2Njc7CisgICAgdC5VID0gNzIyOworICAgIHQuViA9IDcyMjsKKyAgICB0LlcgPSAxMDAwOworICAgIHQuWCA9IDcyMjsKKyAgICB0LlkgPSA3MjI7CisgICAgdC5aID0gNjY3OworICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CisgICAgdC5iYWNrc2xhc2ggPSAyNzg7CisgICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CisgICAgdC5hc2NpaWNpcmN1bSA9IDU4MTsKKyAgICB0LnVuZGVyc2NvcmUgPSA1MDA7CisgICAgdC5xdW90ZWxlZnQgPSAzMzM7CisgICAgdC5hID0gNTAwOworICAgIHQuYiA9IDU1NjsKKyAgICB0LmMgPSA0NDQ7CisgICAgdC5kID0gNTU2OworICAgIHQuZSA9IDQ0NDsKKyAgICB0LmYgPSAzMzM7CisgICAgdC5nID0gNTAwOworICAgIHQuaCA9IDU1NjsKKyAgICB0LmkgPSAyNzg7CisgICAgdC5qID0gMzMzOworICAgIHQuayA9IDU1NjsKKyAgICB0LmwgPSAyNzg7CisgICAgdC5tID0gODMzOworICAgIHQubiA9IDU1NjsKKyAgICB0Lm8gPSA1MDA7CisgICAgdC5wID0gNTU2OworICAgIHQucSA9IDU1NjsKKyAgICB0LnIgPSA0NDQ7CisgICAgdC5zID0gMzg5OworICAgIHQudCA9IDMzMzsKKyAgICB0LnUgPSA1NTY7CisgICAgdC52ID0gNTAwOworICAgIHQudyA9IDcyMjsKKyAgICB0LnggPSA1MDA7CisgICAgdC55ID0gNTAwOworICAgIHQueiA9IDQ0NDsKKyAgICB0LmJyYWNlbGVmdCA9IDM5NDsKKyAgICB0LmJhciA9IDIyMDsKKyAgICB0LmJyYWNlcmlnaHQgPSAzOTQ7CisgICAgdC5hc2NpaXRpbGRlID0gNTIwOworICAgIHQuZXhjbGFtZG93biA9IDMzMzsKKyAgICB0LmNlbnQgPSA1MDA7CisgICAgdC5zdGVybGluZyA9IDUwMDsKKyAgICB0LmZyYWN0aW9uID0gMTY3OworICAgIHQueWVuID0gNTAwOworICAgIHQuZmxvcmluID0gNTAwOworICAgIHQuc2VjdGlvbiA9IDUwMDsKKyAgICB0LmN1cnJlbmN5ID0gNTAwOworICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CisgICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CisgICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwOworICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKKyAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOworICAgIHQuZmkgPSA1NTY7CisgICAgdC5mbCA9IDU1NjsKKyAgICB0LmVuZGFzaCA9IDUwMDsKKyAgICB0LmRhZ2dlciA9IDUwMDsKKyAgICB0LmRhZ2dlcmRibCA9IDUwMDsKKyAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOworICAgIHQucGFyYWdyYXBoID0gNTQwOworICAgIHQuYnVsbGV0ID0gMzUwOworICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CisgICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7CisgICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CisgICAgdC5lbGxpcHNpcyA9IDEwMDA7CisgICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CisgICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7CisgICAgdC5ncmF2ZSA9IDMzMzsKKyAgICB0LmFjdXRlID0gMzMzOworICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0LnRpbGRlID0gMzMzOworICAgIHQubWFjcm9uID0gMzMzOworICAgIHQuYnJldmUgPSAzMzM7CisgICAgdC5kb3RhY2NlbnQgPSAzMzM7CisgICAgdC5kaWVyZXNpcyA9IDMzMzsKKyAgICB0LnJpbmcgPSAzMzM7CisgICAgdC5jZWRpbGxhID0gMzMzOworICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOworICAgIHQub2dvbmVrID0gMzMzOworICAgIHQuY2Fyb24gPSAzMzM7CisgICAgdC5lbWRhc2ggPSAxMDAwOworICAgIHQuQUUgPSAxMDAwOworICAgIHQub3JkZmVtaW5pbmUgPSAzMDA7CisgICAgdC5Mc2xhc2ggPSA2Njc7CisgICAgdC5Pc2xhc2ggPSA3Nzg7CisgICAgdC5PRSA9IDEwMDA7CisgICAgdC5vcmRtYXNjdWxpbmUgPSAzMzA7CisgICAgdC5hZSA9IDcyMjsKKyAgICB0LmRvdGxlc3NpID0gMjc4OworICAgIHQubHNsYXNoID0gMjc4OworICAgIHQub3NsYXNoID0gNTAwOworICAgIHQub2UgPSA3MjI7CisgICAgdC5nZXJtYW5kYmxzID0gNTU2OworICAgIHQuSWRpZXJlc2lzID0gMzg5OworICAgIHQuZWFjdXRlID0gNDQ0OworICAgIHQuYWJyZXZlID0gNTAwOworICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjsKKyAgICB0LmVjYXJvbiA9IDQ0NDsKKyAgICB0LllkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmRpdmlkZSA9IDU3MDsKKyAgICB0LllhY3V0ZSA9IDcyMjsKKyAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOworICAgIHQuYWFjdXRlID0gNTAwOworICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CisgICAgdC55YWN1dGUgPSA1MDA7CisgICAgdC5zY29tbWFhY2NlbnQgPSAzODk7CisgICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKKyAgICB0LlVyaW5nID0gNzIyOworICAgIHQuVWRpZXJlc2lzID0gNzIyOworICAgIHQuYW9nb25layA9IDUwMDsKKyAgICB0LlVhY3V0ZSA9IDcyMjsKKyAgICB0LnVvZ29uZWsgPSA1NTY7CisgICAgdC5FZGllcmVzaXMgPSA2Njc7CisgICAgdC5EY3JvYXQgPSA3MjI7CisgICAgdC5jb21tYWFjY2VudCA9IDI1MDsKKyAgICB0LmNvcHlyaWdodCA9IDc0NzsKKyAgICB0LkVtYWNyb24gPSA2Njc7CisgICAgdC5jY2Fyb24gPSA0NDQ7CisgICAgdC5hcmluZyA9IDUwMDsKKyAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKKyAgICB0LmxhY3V0ZSA9IDI3ODsKKyAgICB0LmFncmF2ZSA9IDUwMDsKKyAgICB0LlRjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LkNhY3V0ZSA9IDcyMjsKKyAgICB0LmF0aWxkZSA9IDUwMDsKKyAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CisgICAgdC5zY2Fyb24gPSAzODk7CisgICAgdC5zY2VkaWxsYSA9IDM4OTsKKyAgICB0LmlhY3V0ZSA9IDI3ODsKKyAgICB0LmxvemVuZ2UgPSA0OTQ7CisgICAgdC5SY2Fyb24gPSA3MjI7CisgICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CisgICAgdC51Y2lyY3VtZmxleCA9IDU1NjsKKyAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOworICAgIHQuQW1hY3JvbiA9IDcyMjsKKyAgICB0LnJjYXJvbiA9IDQ0NDsKKyAgICB0LmNjZWRpbGxhID0gNDQ0OworICAgIHQuWmRvdGFjY2VudCA9IDY2NzsKKyAgICB0LlRob3JuID0gNjExOworICAgIHQuT21hY3JvbiA9IDc3ODsKKyAgICB0LlJhY3V0ZSA9IDcyMjsKKyAgICB0LlNhY3V0ZSA9IDU1NjsKKyAgICB0LmRjYXJvbiA9IDY3MjsKKyAgICB0LlVtYWNyb24gPSA3MjI7CisgICAgdC51cmluZyA9IDU1NjsKKyAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZ3JhdmUgPSA3Nzg7CisgICAgdC5BZ3JhdmUgPSA3MjI7CisgICAgdC5BYnJldmUgPSA3MjI7CisgICAgdC5tdWx0aXBseSA9IDU3MDsKKyAgICB0LnVhY3V0ZSA9IDU1NjsKKyAgICB0LlRjYXJvbiA9IDY2NzsKKyAgICB0LnBhcnRpYWxkaWZmID0gNDk0OworICAgIHQueWRpZXJlc2lzID0gNTAwOworICAgIHQuTmFjdXRlID0gNzIyOworICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CisgICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKKyAgICB0LmFkaWVyZXNpcyA9IDUwMDsKKyAgICB0LmVkaWVyZXNpcyA9IDQ0NDsKKyAgICB0LmNhY3V0ZSA9IDQ0NDsKKyAgICB0Lm5hY3V0ZSA9IDU1NjsKKyAgICB0LnVtYWNyb24gPSA1NTY7CisgICAgdC5OY2Fyb24gPSA3MjI7CisgICAgdC5JYWN1dGUgPSAzODk7CisgICAgdC5wbHVzbWludXMgPSA1NzA7CisgICAgdC5icm9rZW5iYXIgPSAyMjA7CisgICAgdC5yZWdpc3RlcmVkID0gNzQ3OworICAgIHQuR2JyZXZlID0gNzc4OworICAgIHQuSWRvdGFjY2VudCA9IDM4OTsKKyAgICB0LnN1bW1hdGlvbiA9IDYwMDsKKyAgICB0LkVncmF2ZSA9IDY2NzsKKyAgICB0LnJhY3V0ZSA9IDQ0NDsKKyAgICB0Lm9tYWNyb24gPSA1MDA7CisgICAgdC5aYWN1dGUgPSA2Njc7CisgICAgdC5aY2Fyb24gPSA2Njc7CisgICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CisgICAgdC5FdGggPSA3MjI7CisgICAgdC5DY2VkaWxsYSA9IDcyMjsKKyAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LnRjYXJvbiA9IDQxNjsKKyAgICB0LmVvZ29uZWsgPSA0NDQ7CisgICAgdC5Vb2dvbmVrID0gNzIyOworICAgIHQuQWFjdXRlID0gNzIyOworICAgIHQuQWRpZXJlc2lzID0gNzIyOworICAgIHQuZWdyYXZlID0gNDQ0OworICAgIHQuemFjdXRlID0gNDQ0OworICAgIHQuaW9nb25layA9IDI3ODsKKyAgICB0Lk9hY3V0ZSA9IDc3ODsKKyAgICB0Lm9hY3V0ZSA9IDUwMDsKKyAgICB0LmFtYWNyb24gPSA1MDA7CisgICAgdC5zYWN1dGUgPSAzODk7CisgICAgdC5pZGllcmVzaXMgPSAyNzg7CisgICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKKyAgICB0LlVncmF2ZSA9IDcyMjsKKyAgICB0LkRlbHRhID0gNjEyOworICAgIHQudGhvcm4gPSA1NTY7CisgICAgdC50d29zdXBlcmlvciA9IDMwMDsKKyAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKKyAgICB0Lm11ID0gNTU2OworICAgIHQuaWdyYXZlID0gMjc4OworICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDsKKyAgICB0LkVvZ29uZWsgPSA2Njc7CisgICAgdC5kY3JvYXQgPSA1NTY7CisgICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwOworICAgIHQuU2NlZGlsbGEgPSA1NTY7CisgICAgdC5sY2Fyb24gPSAzOTQ7CisgICAgdC5LY29tbWFhY2NlbnQgPSA3Nzg7CisgICAgdC5MYWN1dGUgPSA2Njc7CisgICAgdC50cmFkZW1hcmsgPSAxMDAwOworICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKKyAgICB0LklncmF2ZSA9IDM4OTsKKyAgICB0LkltYWNyb24gPSAzODk7CisgICAgdC5MY2Fyb24gPSA2Njc7CisgICAgdC5vbmVoYWxmID0gNzUwOworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CisgICAgdC5udGlsZGUgPSA1NTY7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjY3OworICAgIHQuZW1hY3JvbiA9IDQ0NDsKKyAgICB0LmdicmV2ZSA9IDUwMDsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CisgICAgdC5TY2Fyb24gPSA1NTY7CisgICAgdC5TY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNTAwOworICAgIHQuQ2Nhcm9uID0gNzIyOworICAgIHQudWdyYXZlID0gNTU2OworICAgIHQucmFkaWNhbCA9IDU0OTsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDQ0NDsKKyAgICB0Lk50aWxkZSA9IDcyMjsKKyAgICB0Lm90aWxkZSA9IDUwMDsKKyAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LkF0aWxkZSA9IDcyMjsKKyAgICB0LkFvZ29uZWsgPSA3MjI7CisgICAgdC5BcmluZyA9IDcyMjsKKyAgICB0Lk90aWxkZSA9IDc3ODsKKyAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CisgICAgdC5FY2Fyb24gPSA2Njc7CisgICAgdC5Jb2dvbmVrID0gMzg5OworICAgIHQua2NvbW1hYWNjZW50ID0gNTU2OworICAgIHQubWludXMgPSA1NzA7CisgICAgdC5JY2lyY3VtZmxleCA9IDM4OTsKKyAgICB0Lm5jYXJvbiA9IDU1NjsKKyAgICB0LnRjb21tYWFjY2VudCA9IDMzMzsKKyAgICB0LmxvZ2ljYWxub3QgPSA1NzA7CisgICAgdC5vZGllcmVzaXMgPSA1MDA7CisgICAgdC51ZGllcmVzaXMgPSA1NTY7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0LmV0aCA9IDUwMDsKKyAgICB0LnpjYXJvbiA9IDQ0NDsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzAwOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1MDA7CisgIH0pOworICB0WyJUaW1lcy1Cb2xkSXRhbGljIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICAgIHQuc3BhY2UgPSAyNTA7CisgICAgdC5leGNsYW0gPSAzODk7CisgICAgdC5xdW90ZWRibCA9IDU1NTsKKyAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CisgICAgdC5kb2xsYXIgPSA1MDA7CisgICAgdC5wZXJjZW50ID0gODMzOworICAgIHQuYW1wZXJzYW5kID0gNzc4OworICAgIHQucXVvdGVyaWdodCA9IDMzMzsKKyAgICB0LnBhcmVubGVmdCA9IDMzMzsKKyAgICB0LnBhcmVucmlnaHQgPSAzMzM7CisgICAgdC5hc3RlcmlzayA9IDUwMDsKKyAgICB0LnBsdXMgPSA1NzA7CisgICAgdC5jb21tYSA9IDI1MDsKKyAgICB0Lmh5cGhlbiA9IDMzMzsKKyAgICB0LnBlcmlvZCA9IDI1MDsKKyAgICB0LnNsYXNoID0gMjc4OworICAgIHQuemVybyA9IDUwMDsKKyAgICB0Lm9uZSA9IDUwMDsKKyAgICB0LnR3byA9IDUwMDsKKyAgICB0LnRocmVlID0gNTAwOworICAgIHQuZm91ciA9IDUwMDsKKyAgICB0LmZpdmUgPSA1MDA7CisgICAgdC5zaXggPSA1MDA7CisgICAgdC5zZXZlbiA9IDUwMDsKKyAgICB0LmVpZ2h0ID0gNTAwOworICAgIHQubmluZSA9IDUwMDsKKyAgICB0LmNvbG9uID0gMzMzOworICAgIHQuc2VtaWNvbG9uID0gMzMzOworICAgIHQubGVzcyA9IDU3MDsKKyAgICB0LmVxdWFsID0gNTcwOworICAgIHQuZ3JlYXRlciA9IDU3MDsKKyAgICB0LnF1ZXN0aW9uID0gNTAwOworICAgIHQuYXQgPSA4MzI7CisgICAgdC5BID0gNjY3OworICAgIHQuQiA9IDY2NzsKKyAgICB0LkMgPSA2Njc7CisgICAgdC5EID0gNzIyOworICAgIHQuRSA9IDY2NzsKKyAgICB0LkYgPSA2Njc7CisgICAgdC5HID0gNzIyOworICAgIHQuSCA9IDc3ODsKKyAgICB0LkkgPSAzODk7CisgICAgdC5KID0gNTAwOworICAgIHQuSyA9IDY2NzsKKyAgICB0LkwgPSA2MTE7CisgICAgdC5NID0gODg5OworICAgIHQuTiA9IDcyMjsKKyAgICB0Lk8gPSA3MjI7CisgICAgdC5QID0gNjExOworICAgIHQuUSA9IDcyMjsKKyAgICB0LlIgPSA2Njc7CisgICAgdC5TID0gNTU2OworICAgIHQuVCA9IDYxMTsKKyAgICB0LlUgPSA3MjI7CisgICAgdC5WID0gNjY3OworICAgIHQuVyA9IDg4OTsKKyAgICB0LlggPSA2Njc7CisgICAgdC5ZID0gNjExOworICAgIHQuWiA9IDYxMTsKKyAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOworICAgIHQuYmFja3NsYXNoID0gMjc4OworICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOworICAgIHQuYXNjaWljaXJjdW0gPSA1NzA7CisgICAgdC51bmRlcnNjb3JlID0gNTAwOworICAgIHQucXVvdGVsZWZ0ID0gMzMzOworICAgIHQuYSA9IDUwMDsKKyAgICB0LmIgPSA1MDA7CisgICAgdC5jID0gNDQ0OworICAgIHQuZCA9IDUwMDsKKyAgICB0LmUgPSA0NDQ7CisgICAgdC5mID0gMzMzOworICAgIHQuZyA9IDUwMDsKKyAgICB0LmggPSA1NTY7CisgICAgdC5pID0gMjc4OworICAgIHQuaiA9IDI3ODsKKyAgICB0LmsgPSA1MDA7CisgICAgdC5sID0gMjc4OworICAgIHQubSA9IDc3ODsKKyAgICB0Lm4gPSA1NTY7CisgICAgdC5vID0gNTAwOworICAgIHQucCA9IDUwMDsKKyAgICB0LnEgPSA1MDA7CisgICAgdC5yID0gMzg5OworICAgIHQucyA9IDM4OTsKKyAgICB0LnQgPSAyNzg7CisgICAgdC51ID0gNTU2OworICAgIHQudiA9IDQ0NDsKKyAgICB0LncgPSA2Njc7CisgICAgdC54ID0gNTAwOworICAgIHQueSA9IDQ0NDsKKyAgICB0LnogPSAzODk7CisgICAgdC5icmFjZWxlZnQgPSAzNDg7CisgICAgdC5iYXIgPSAyMjA7CisgICAgdC5icmFjZXJpZ2h0ID0gMzQ4OworICAgIHQuYXNjaWl0aWxkZSA9IDU3MDsKKyAgICB0LmV4Y2xhbWRvd24gPSAzODk7CisgICAgdC5jZW50ID0gNTAwOworICAgIHQuc3RlcmxpbmcgPSA1MDA7CisgICAgdC5mcmFjdGlvbiA9IDE2NzsKKyAgICB0LnllbiA9IDUwMDsKKyAgICB0LmZsb3JpbiA9IDUwMDsKKyAgICB0LnNlY3Rpb24gPSA1MDA7CisgICAgdC5jdXJyZW5jeSA9IDUwMDsKKyAgICB0LnF1b3Rlc2luZ2xlID0gMjc4OworICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwOworICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKKyAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CisgICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKKyAgICB0LmZpID0gNTU2OworICAgIHQuZmwgPSA1NTY7CisgICAgdC5lbmRhc2ggPSA1MDA7CisgICAgdC5kYWdnZXIgPSA1MDA7CisgICAgdC5kYWdnZXJkYmwgPSA1MDA7CisgICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI1MDsKKyAgICB0LnBhcmFncmFwaCA9IDUwMDsKKyAgICB0LmJ1bGxldCA9IDM1MDsKKyAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMzMzOworICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOworICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKKyAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTAwOworICAgIHQuZWxsaXBzaXMgPSAxMDAwOworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNTAwOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gMTAwMDsKKyAgICB0LkFFID0gOTQ0OworICAgIHQub3JkZmVtaW5pbmUgPSAyNjY7CisgICAgdC5Mc2xhc2ggPSA2MTE7CisgICAgdC5Pc2xhc2ggPSA3MjI7CisgICAgdC5PRSA9IDk0NDsKKyAgICB0Lm9yZG1hc2N1bGluZSA9IDMwMDsKKyAgICB0LmFlID0gNzIyOworICAgIHQuZG90bGVzc2kgPSAyNzg7CisgICAgdC5sc2xhc2ggPSAyNzg7CisgICAgdC5vc2xhc2ggPSA1MDA7CisgICAgdC5vZSA9IDcyMjsKKyAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CisgICAgdC5JZGllcmVzaXMgPSAzODk7CisgICAgdC5lYWN1dGUgPSA0NDQ7CisgICAgdC5hYnJldmUgPSA1MDA7CisgICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OworICAgIHQuZWNhcm9uID0gNDQ0OworICAgIHQuWWRpZXJlc2lzID0gNjExOworICAgIHQuZGl2aWRlID0gNTcwOworICAgIHQuWWFjdXRlID0gNjExOworICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CisgICAgdC5hYWN1dGUgPSA1MDA7CisgICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKKyAgICB0LnlhY3V0ZSA9IDQ0NDsKKyAgICB0LnNjb21tYWFjY2VudCA9IDM4OTsKKyAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0OworICAgIHQuVXJpbmcgPSA3MjI7CisgICAgdC5VZGllcmVzaXMgPSA3MjI7CisgICAgdC5hb2dvbmVrID0gNTAwOworICAgIHQuVWFjdXRlID0gNzIyOworICAgIHQudW9nb25layA9IDU1NjsKKyAgICB0LkVkaWVyZXNpcyA9IDY2NzsKKyAgICB0LkRjcm9hdCA9IDcyMjsKKyAgICB0LmNvbW1hYWNjZW50ID0gMjUwOworICAgIHQuY29weXJpZ2h0ID0gNzQ3OworICAgIHQuRW1hY3JvbiA9IDY2NzsKKyAgICB0LmNjYXJvbiA9IDQ0NDsKKyAgICB0LmFyaW5nID0gNTAwOworICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOworICAgIHQubGFjdXRlID0gMjc4OworICAgIHQuYWdyYXZlID0gNTAwOworICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOworICAgIHQuQ2FjdXRlID0gNjY3OworICAgIHQuYXRpbGRlID0gNTAwOworICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKKyAgICB0LnNjYXJvbiA9IDM4OTsKKyAgICB0LnNjZWRpbGxhID0gMzg5OworICAgIHQuaWFjdXRlID0gMjc4OworICAgIHQubG96ZW5nZSA9IDQ5NDsKKyAgICB0LlJjYXJvbiA9IDY2NzsKKyAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKKyAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OworICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7CisgICAgdC5BbWFjcm9uID0gNjY3OworICAgIHQucmNhcm9uID0gMzg5OworICAgIHQuY2NlZGlsbGEgPSA0NDQ7CisgICAgdC5aZG90YWNjZW50ID0gNjExOworICAgIHQuVGhvcm4gPSA2MTE7CisgICAgdC5PbWFjcm9uID0gNzIyOworICAgIHQuUmFjdXRlID0gNjY3OworICAgIHQuU2FjdXRlID0gNTU2OworICAgIHQuZGNhcm9uID0gNjA4OworICAgIHQuVW1hY3JvbiA9IDcyMjsKKyAgICB0LnVyaW5nID0gNTU2OworICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDsKKyAgICB0Lk9ncmF2ZSA9IDcyMjsKKyAgICB0LkFncmF2ZSA9IDY2NzsKKyAgICB0LkFicmV2ZSA9IDY2NzsKKyAgICB0Lm11bHRpcGx5ID0gNTcwOworICAgIHQudWFjdXRlID0gNTU2OworICAgIHQuVGNhcm9uID0gNjExOworICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7CisgICAgdC55ZGllcmVzaXMgPSA0NDQ7CisgICAgdC5OYWN1dGUgPSA3MjI7CisgICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKKyAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OworICAgIHQuYWRpZXJlc2lzID0gNTAwOworICAgIHQuZWRpZXJlc2lzID0gNDQ0OworICAgIHQuY2FjdXRlID0gNDQ0OworICAgIHQubmFjdXRlID0gNTU2OworICAgIHQudW1hY3JvbiA9IDU1NjsKKyAgICB0Lk5jYXJvbiA9IDcyMjsKKyAgICB0LklhY3V0ZSA9IDM4OTsKKyAgICB0LnBsdXNtaW51cyA9IDU3MDsKKyAgICB0LmJyb2tlbmJhciA9IDIyMDsKKyAgICB0LnJlZ2lzdGVyZWQgPSA3NDc7CisgICAgdC5HYnJldmUgPSA3MjI7CisgICAgdC5JZG90YWNjZW50ID0gMzg5OworICAgIHQuc3VtbWF0aW9uID0gNjAwOworICAgIHQuRWdyYXZlID0gNjY3OworICAgIHQucmFjdXRlID0gMzg5OworICAgIHQub21hY3JvbiA9IDUwMDsKKyAgICB0LlphY3V0ZSA9IDYxMTsKKyAgICB0LlpjYXJvbiA9IDYxMTsKKyAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKKyAgICB0LkV0aCA9IDcyMjsKKyAgICB0LkNjZWRpbGxhID0gNjY3OworICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQudGNhcm9uID0gMzY2OworICAgIHQuZW9nb25layA9IDQ0NDsKKyAgICB0LlVvZ29uZWsgPSA3MjI7CisgICAgdC5BYWN1dGUgPSA2Njc7CisgICAgdC5BZGllcmVzaXMgPSA2Njc7CisgICAgdC5lZ3JhdmUgPSA0NDQ7CisgICAgdC56YWN1dGUgPSAzODk7CisgICAgdC5pb2dvbmVrID0gMjc4OworICAgIHQuT2FjdXRlID0gNzIyOworICAgIHQub2FjdXRlID0gNTAwOworICAgIHQuYW1hY3JvbiA9IDUwMDsKKyAgICB0LnNhY3V0ZSA9IDM4OTsKKyAgICB0LmlkaWVyZXNpcyA9IDI3ODsKKyAgICB0Lk9jaXJjdW1mbGV4ID0gNzIyOworICAgIHQuVWdyYXZlID0gNzIyOworICAgIHQuRGVsdGEgPSA2MTI7CisgICAgdC50aG9ybiA9IDUwMDsKKyAgICB0LnR3b3N1cGVyaW9yID0gMzAwOworICAgIHQuT2RpZXJlc2lzID0gNzIyOworICAgIHQubXUgPSA1NzY7CisgICAgdC5pZ3JhdmUgPSAyNzg7CisgICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOworICAgIHQuRW9nb25layA9IDY2NzsKKyAgICB0LmRjcm9hdCA9IDUwMDsKKyAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CisgICAgdC5TY2VkaWxsYSA9IDU1NjsKKyAgICB0LmxjYXJvbiA9IDM4MjsKKyAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKKyAgICB0LkxhY3V0ZSA9IDYxMTsKKyAgICB0LnRyYWRlbWFyayA9IDEwMDA7CisgICAgdC5lZG90YWNjZW50ID0gNDQ0OworICAgIHQuSWdyYXZlID0gMzg5OworICAgIHQuSW1hY3JvbiA9IDM4OTsKKyAgICB0LkxjYXJvbiA9IDYxMTsKKyAgICB0Lm9uZWhhbGYgPSA3NTA7CisgICAgdC5sZXNzZXF1YWwgPSA1NDk7CisgICAgdC5vY2lyY3VtZmxleCA9IDUwMDsKKyAgICB0Lm50aWxkZSA9IDU1NjsKKyAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5FYWN1dGUgPSA2Njc7CisgICAgdC5lbWFjcm9uID0gNDQ0OworICAgIHQuZ2JyZXZlID0gNTAwOworICAgIHQub25lcXVhcnRlciA9IDc1MDsKKyAgICB0LlNjYXJvbiA9IDU1NjsKKyAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3MjI7CisgICAgdC5kZWdyZWUgPSA0MDA7CisgICAgdC5vZ3JhdmUgPSA1MDA7CisgICAgdC5DY2Fyb24gPSA2Njc7CisgICAgdC51Z3JhdmUgPSA1NTY7CisgICAgdC5yYWRpY2FsID0gNTQ5OworICAgIHQuRGNhcm9uID0gNzIyOworICAgIHQucmNvbW1hYWNjZW50ID0gMzg5OworICAgIHQuTnRpbGRlID0gNzIyOworICAgIHQub3RpbGRlID0gNTAwOworICAgIHQuUmNvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOworICAgIHQuQXRpbGRlID0gNjY3OworICAgIHQuQW9nb25layA9IDY2NzsKKyAgICB0LkFyaW5nID0gNjY3OworICAgIHQuT3RpbGRlID0gNzIyOworICAgIHQuemRvdGFjY2VudCA9IDM4OTsKKyAgICB0LkVjYXJvbiA9IDY2NzsKKyAgICB0LklvZ29uZWsgPSAzODk7CisgICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5taW51cyA9IDYwNjsKKyAgICB0LkljaXJjdW1mbGV4ID0gMzg5OworICAgIHQubmNhcm9uID0gNTU2OworICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OworICAgIHQubG9naWNhbG5vdCA9IDYwNjsKKyAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKKyAgICB0LnVkaWVyZXNpcyA9IDU1NjsKKyAgICB0Lm5vdGVxdWFsID0gNTQ5OworICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOworICAgIHQuZXRoID0gNTAwOworICAgIHQuemNhcm9uID0gMzg5OworICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OworICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CisgICAgdC5pbWFjcm9uID0gMjc4OworICAgIHQuRXVybyA9IDUwMDsKKyAgfSk7CisgIHRbIlRpbWVzLUl0YWxpYyJdID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgICB0LnNwYWNlID0gMjUwOworICAgIHQuZXhjbGFtID0gMzMzOworICAgIHQucXVvdGVkYmwgPSA0MjA7CisgICAgdC5udW1iZXJzaWduID0gNTAwOworICAgIHQuZG9sbGFyID0gNTAwOworICAgIHQucGVyY2VudCA9IDgzMzsKKyAgICB0LmFtcGVyc2FuZCA9IDc3ODsKKyAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CisgICAgdC5wYXJlbmxlZnQgPSAzMzM7CisgICAgdC5wYXJlbnJpZ2h0ID0gMzMzOworICAgIHQuYXN0ZXJpc2sgPSA1MDA7CisgICAgdC5wbHVzID0gNjc1OworICAgIHQuY29tbWEgPSAyNTA7CisgICAgdC5oeXBoZW4gPSAzMzM7CisgICAgdC5wZXJpb2QgPSAyNTA7CisgICAgdC5zbGFzaCA9IDI3ODsKKyAgICB0Lnplcm8gPSA1MDA7CisgICAgdC5vbmUgPSA1MDA7CisgICAgdC50d28gPSA1MDA7CisgICAgdC50aHJlZSA9IDUwMDsKKyAgICB0LmZvdXIgPSA1MDA7CisgICAgdC5maXZlID0gNTAwOworICAgIHQuc2l4ID0gNTAwOworICAgIHQuc2V2ZW4gPSA1MDA7CisgICAgdC5laWdodCA9IDUwMDsKKyAgICB0Lm5pbmUgPSA1MDA7CisgICAgdC5jb2xvbiA9IDMzMzsKKyAgICB0LnNlbWljb2xvbiA9IDMzMzsKKyAgICB0Lmxlc3MgPSA2NzU7CisgICAgdC5lcXVhbCA9IDY3NTsKKyAgICB0LmdyZWF0ZXIgPSA2NzU7CisgICAgdC5xdWVzdGlvbiA9IDUwMDsKKyAgICB0LmF0ID0gOTIwOworICAgIHQuQSA9IDYxMTsKKyAgICB0LkIgPSA2MTE7CisgICAgdC5DID0gNjY3OworICAgIHQuRCA9IDcyMjsKKyAgICB0LkUgPSA2MTE7CisgICAgdC5GID0gNjExOworICAgIHQuRyA9IDcyMjsKKyAgICB0LkggPSA3MjI7CisgICAgdC5JID0gMzMzOworICAgIHQuSiA9IDQ0NDsKKyAgICB0LksgPSA2Njc7CisgICAgdC5MID0gNTU2OworICAgIHQuTSA9IDgzMzsKKyAgICB0Lk4gPSA2Njc7CisgICAgdC5PID0gNzIyOworICAgIHQuUCA9IDYxMTsKKyAgICB0LlEgPSA3MjI7CisgICAgdC5SID0gNjExOworICAgIHQuUyA9IDUwMDsKKyAgICB0LlQgPSA1NTY7CisgICAgdC5VID0gNzIyOworICAgIHQuViA9IDYxMTsKKyAgICB0LlcgPSA4MzM7CisgICAgdC5YID0gNjExOworICAgIHQuWSA9IDU1NjsKKyAgICB0LlogPSA1NTY7CisgICAgdC5icmFja2V0bGVmdCA9IDM4OTsKKyAgICB0LmJhY2tzbGFzaCA9IDI3ODsKKyAgICB0LmJyYWNrZXRyaWdodCA9IDM4OTsKKyAgICB0LmFzY2lpY2lyY3VtID0gNDIyOworICAgIHQudW5kZXJzY29yZSA9IDUwMDsKKyAgICB0LnF1b3RlbGVmdCA9IDMzMzsKKyAgICB0LmEgPSA1MDA7CisgICAgdC5iID0gNTAwOworICAgIHQuYyA9IDQ0NDsKKyAgICB0LmQgPSA1MDA7CisgICAgdC5lID0gNDQ0OworICAgIHQuZiA9IDI3ODsKKyAgICB0LmcgPSA1MDA7CisgICAgdC5oID0gNTAwOworICAgIHQuaSA9IDI3ODsKKyAgICB0LmogPSAyNzg7CisgICAgdC5rID0gNDQ0OworICAgIHQubCA9IDI3ODsKKyAgICB0Lm0gPSA3MjI7CisgICAgdC5uID0gNTAwOworICAgIHQubyA9IDUwMDsKKyAgICB0LnAgPSA1MDA7CisgICAgdC5xID0gNTAwOworICAgIHQuciA9IDM4OTsKKyAgICB0LnMgPSAzODk7CisgICAgdC50ID0gMjc4OworICAgIHQudSA9IDUwMDsKKyAgICB0LnYgPSA0NDQ7CisgICAgdC53ID0gNjY3OworICAgIHQueCA9IDQ0NDsKKyAgICB0LnkgPSA0NDQ7CisgICAgdC56ID0gMzg5OworICAgIHQuYnJhY2VsZWZ0ID0gNDAwOworICAgIHQuYmFyID0gMjc1OworICAgIHQuYnJhY2VyaWdodCA9IDQwMDsKKyAgICB0LmFzY2lpdGlsZGUgPSA1NDE7CisgICAgdC5leGNsYW1kb3duID0gMzg5OworICAgIHQuY2VudCA9IDUwMDsKKyAgICB0LnN0ZXJsaW5nID0gNTAwOworICAgIHQuZnJhY3Rpb24gPSAxNjc7CisgICAgdC55ZW4gPSA1MDA7CisgICAgdC5mbG9yaW4gPSA1MDA7CisgICAgdC5zZWN0aW9uID0gNTAwOworICAgIHQuY3VycmVuY3kgPSA1MDA7CisgICAgdC5xdW90ZXNpbmdsZSA9IDIxNDsKKyAgICB0LnF1b3RlZGJsbGVmdCA9IDU1NjsKKyAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CisgICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOworICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CisgICAgdC5maSA9IDUwMDsKKyAgICB0LmZsID0gNTAwOworICAgIHQuZW5kYXNoID0gNTAwOworICAgIHQuZGFnZ2VyID0gNTAwOworICAgIHQuZGFnZ2VyZGJsID0gNTAwOworICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CisgICAgdC5wYXJhZ3JhcGggPSA1MjM7CisgICAgdC5idWxsZXQgPSAzNTA7CisgICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKKyAgICB0LnF1b3RlZGJsYmFzZSA9IDU1NjsKKyAgICB0LnF1b3RlZGJscmlnaHQgPSA1NTY7CisgICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKKyAgICB0LmVsbGlwc2lzID0gODg5OworICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOworICAgIHQucXVlc3Rpb25kb3duID0gNTAwOworICAgIHQuZ3JhdmUgPSAzMzM7CisgICAgdC5hY3V0ZSA9IDMzMzsKKyAgICB0LmNpcmN1bWZsZXggPSAzMzM7CisgICAgdC50aWxkZSA9IDMzMzsKKyAgICB0Lm1hY3JvbiA9IDMzMzsKKyAgICB0LmJyZXZlID0gMzMzOworICAgIHQuZG90YWNjZW50ID0gMzMzOworICAgIHQuZGllcmVzaXMgPSAzMzM7CisgICAgdC5yaW5nID0gMzMzOworICAgIHQuY2VkaWxsYSA9IDMzMzsKKyAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKKyAgICB0Lm9nb25layA9IDMzMzsKKyAgICB0LmNhcm9uID0gMzMzOworICAgIHQuZW1kYXNoID0gODg5OworICAgIHQuQUUgPSA4ODk7CisgICAgdC5vcmRmZW1pbmluZSA9IDI3NjsKKyAgICB0LkxzbGFzaCA9IDU1NjsKKyAgICB0Lk9zbGFzaCA9IDcyMjsKKyAgICB0Lk9FID0gOTQ0OworICAgIHQub3JkbWFzY3VsaW5lID0gMzEwOworICAgIHQuYWUgPSA2Njc7CisgICAgdC5kb3RsZXNzaSA9IDI3ODsKKyAgICB0LmxzbGFzaCA9IDI3ODsKKyAgICB0Lm9zbGFzaCA9IDUwMDsKKyAgICB0Lm9lID0gNjY3OworICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKKyAgICB0LklkaWVyZXNpcyA9IDMzMzsKKyAgICB0LmVhY3V0ZSA9IDQ0NDsKKyAgICB0LmFicmV2ZSA9IDUwMDsKKyAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5lY2Fyb24gPSA0NDQ7CisgICAgdC5ZZGllcmVzaXMgPSA1NTY7CisgICAgdC5kaXZpZGUgPSA2NzU7CisgICAgdC5ZYWN1dGUgPSA1NTY7CisgICAgdC5BY2lyY3VtZmxleCA9IDYxMTsKKyAgICB0LmFhY3V0ZSA9IDUwMDsKKyAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOworICAgIHQueWFjdXRlID0gNDQ0OworICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OworICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CisgICAgdC5VcmluZyA9IDcyMjsKKyAgICB0LlVkaWVyZXNpcyA9IDcyMjsKKyAgICB0LmFvZ29uZWsgPSA1MDA7CisgICAgdC5VYWN1dGUgPSA3MjI7CisgICAgdC51b2dvbmVrID0gNTAwOworICAgIHQuRWRpZXJlc2lzID0gNjExOworICAgIHQuRGNyb2F0ID0gNzIyOworICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CisgICAgdC5jb3B5cmlnaHQgPSA3NjA7CisgICAgdC5FbWFjcm9uID0gNjExOworICAgIHQuY2Nhcm9uID0gNDQ0OworICAgIHQuYXJpbmcgPSA1MDA7CisgICAgdC5OY29tbWFhY2NlbnQgPSA2Njc7CisgICAgdC5sYWN1dGUgPSAyNzg7CisgICAgdC5hZ3JhdmUgPSA1MDA7CisgICAgdC5UY29tbWFhY2NlbnQgPSA1NTY7CisgICAgdC5DYWN1dGUgPSA2Njc7CisgICAgdC5hdGlsZGUgPSA1MDA7CisgICAgdC5FZG90YWNjZW50ID0gNjExOworICAgIHQuc2Nhcm9uID0gMzg5OworICAgIHQuc2NlZGlsbGEgPSAzODk7CisgICAgdC5pYWN1dGUgPSAyNzg7CisgICAgdC5sb3plbmdlID0gNDcxOworICAgIHQuUmNhcm9uID0gNjExOworICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOworICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CisgICAgdC5hY2lyY3VtZmxleCA9IDUwMDsKKyAgICB0LkFtYWNyb24gPSA2MTE7CisgICAgdC5yY2Fyb24gPSAzODk7CisgICAgdC5jY2VkaWxsYSA9IDQ0NDsKKyAgICB0Llpkb3RhY2NlbnQgPSA1NTY7CisgICAgdC5UaG9ybiA9IDYxMTsKKyAgICB0Lk9tYWNyb24gPSA3MjI7CisgICAgdC5SYWN1dGUgPSA2MTE7CisgICAgdC5TYWN1dGUgPSA1MDA7CisgICAgdC5kY2Fyb24gPSA1NDQ7CisgICAgdC5VbWFjcm9uID0gNzIyOworICAgIHQudXJpbmcgPSA1MDA7CisgICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOworICAgIHQuT2dyYXZlID0gNzIyOworICAgIHQuQWdyYXZlID0gNjExOworICAgIHQuQWJyZXZlID0gNjExOworICAgIHQubXVsdGlwbHkgPSA2NzU7CisgICAgdC51YWN1dGUgPSA1MDA7CisgICAgdC5UY2Fyb24gPSA1NTY7CisgICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjsKKyAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKKyAgICB0Lk5hY3V0ZSA9IDY2NzsKKyAgICB0LmljaXJjdW1mbGV4ID0gMjc4OworICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CisgICAgdC5hZGllcmVzaXMgPSA1MDA7CisgICAgdC5lZGllcmVzaXMgPSA0NDQ7CisgICAgdC5jYWN1dGUgPSA0NDQ7CisgICAgdC5uYWN1dGUgPSA1MDA7CisgICAgdC51bWFjcm9uID0gNTAwOworICAgIHQuTmNhcm9uID0gNjY3OworICAgIHQuSWFjdXRlID0gMzMzOworICAgIHQucGx1c21pbnVzID0gNjc1OworICAgIHQuYnJva2VuYmFyID0gMjc1OworICAgIHQucmVnaXN0ZXJlZCA9IDc2MDsKKyAgICB0LkdicmV2ZSA9IDcyMjsKKyAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CisgICAgdC5zdW1tYXRpb24gPSA2MDA7CisgICAgdC5FZ3JhdmUgPSA2MTE7CisgICAgdC5yYWN1dGUgPSAzODk7CisgICAgdC5vbWFjcm9uID0gNTAwOworICAgIHQuWmFjdXRlID0gNTU2OworICAgIHQuWmNhcm9uID0gNTU2OworICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OworICAgIHQuRXRoID0gNzIyOworICAgIHQuQ2NlZGlsbGEgPSA2Njc7CisgICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CisgICAgdC50Y2Fyb24gPSAzMDA7CisgICAgdC5lb2dvbmVrID0gNDQ0OworICAgIHQuVW9nb25layA9IDcyMjsKKyAgICB0LkFhY3V0ZSA9IDYxMTsKKyAgICB0LkFkaWVyZXNpcyA9IDYxMTsKKyAgICB0LmVncmF2ZSA9IDQ0NDsKKyAgICB0LnphY3V0ZSA9IDM4OTsKKyAgICB0LmlvZ29uZWsgPSAyNzg7CisgICAgdC5PYWN1dGUgPSA3MjI7CisgICAgdC5vYWN1dGUgPSA1MDA7CisgICAgdC5hbWFjcm9uID0gNTAwOworICAgIHQuc2FjdXRlID0gMzg5OworICAgIHQuaWRpZXJlc2lzID0gMjc4OworICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CisgICAgdC5VZ3JhdmUgPSA3MjI7CisgICAgdC5EZWx0YSA9IDYxMjsKKyAgICB0LnRob3JuID0gNTAwOworICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CisgICAgdC5PZGllcmVzaXMgPSA3MjI7CisgICAgdC5tdSA9IDUwMDsKKyAgICB0LmlncmF2ZSA9IDI3ODsKKyAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CisgICAgdC5Fb2dvbmVrID0gNjExOworICAgIHQuZGNyb2F0ID0gNTAwOworICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKKyAgICB0LlNjZWRpbGxhID0gNTAwOworICAgIHQubGNhcm9uID0gMzAwOworICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OworICAgIHQuTGFjdXRlID0gNTU2OworICAgIHQudHJhZGVtYXJrID0gOTgwOworICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKKyAgICB0LklncmF2ZSA9IDMzMzsKKyAgICB0LkltYWNyb24gPSAzMzM7CisgICAgdC5MY2Fyb24gPSA2MTE7CisgICAgdC5vbmVoYWxmID0gNzUwOworICAgIHQubGVzc2VxdWFsID0gNTQ5OworICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CisgICAgdC5udGlsZGUgPSA1MDA7CisgICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuRWFjdXRlID0gNjExOworICAgIHQuZW1hY3JvbiA9IDQ0NDsKKyAgICB0LmdicmV2ZSA9IDUwMDsKKyAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CisgICAgdC5TY2Fyb24gPSA1MDA7CisgICAgdC5TY29tbWFhY2NlbnQgPSA1MDA7CisgICAgdC5PaHVuZ2FydW1sYXV0ID0gNzIyOworICAgIHQuZGVncmVlID0gNDAwOworICAgIHQub2dyYXZlID0gNTAwOworICAgIHQuQ2Nhcm9uID0gNjY3OworICAgIHQudWdyYXZlID0gNTAwOworICAgIHQucmFkaWNhbCA9IDQ1MzsKKyAgICB0LkRjYXJvbiA9IDcyMjsKKyAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKKyAgICB0Lk50aWxkZSA9IDY2NzsKKyAgICB0Lm90aWxkZSA9IDUwMDsKKyAgICB0LlJjb21tYWFjY2VudCA9IDYxMTsKKyAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjsKKyAgICB0LkF0aWxkZSA9IDYxMTsKKyAgICB0LkFvZ29uZWsgPSA2MTE7CisgICAgdC5BcmluZyA9IDYxMTsKKyAgICB0Lk90aWxkZSA9IDcyMjsKKyAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CisgICAgdC5FY2Fyb24gPSA2MTE7CisgICAgdC5Jb2dvbmVrID0gMzMzOworICAgIHQua2NvbW1hYWNjZW50ID0gNDQ0OworICAgIHQubWludXMgPSA2NzU7CisgICAgdC5JY2lyY3VtZmxleCA9IDMzMzsKKyAgICB0Lm5jYXJvbiA9IDUwMDsKKyAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKKyAgICB0LmxvZ2ljYWxub3QgPSA2NzU7CisgICAgdC5vZGllcmVzaXMgPSA1MDA7CisgICAgdC51ZGllcmVzaXMgPSA1MDA7CisgICAgdC5ub3RlcXVhbCA9IDU0OTsKKyAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKKyAgICB0LmV0aCA9IDUwMDsKKyAgICB0LnpjYXJvbiA9IDM4OTsKKyAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKKyAgICB0Lm9uZXN1cGVyaW9yID0gMzAwOworICAgIHQuaW1hY3JvbiA9IDI3ODsKKyAgICB0LkV1cm8gPSA1MDA7CisgIH0pOworICB0LlphcGZEaW5nYmF0cyA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgICAgdC5zcGFjZSA9IDI3ODsKKyAgICB0LmExID0gOTc0OworICAgIHQuYTIgPSA5NjE7CisgICAgdC5hMjAyID0gOTc0OworICAgIHQuYTMgPSA5ODA7CisgICAgdC5hNCA9IDcxOTsKKyAgICB0LmE1ID0gNzg5OworICAgIHQuYTExOSA9IDc5MDsKKyAgICB0LmExMTggPSA3OTE7CisgICAgdC5hMTE3ID0gNjkwOworICAgIHQuYTExID0gOTYwOworICAgIHQuYTEyID0gOTM5OworICAgIHQuYTEzID0gNTQ5OworICAgIHQuYTE0ID0gODU1OworICAgIHQuYTE1ID0gOTExOworICAgIHQuYTE2ID0gOTMzOworICAgIHQuYTEwNSA9IDkxMTsKKyAgICB0LmExNyA9IDk0NTsKKyAgICB0LmExOCA9IDk3NDsKKyAgICB0LmExOSA9IDc1NTsKKyAgICB0LmEyMCA9IDg0NjsKKyAgICB0LmEyMSA9IDc2MjsKKyAgICB0LmEyMiA9IDc2MTsKKyAgICB0LmEyMyA9IDU3MTsKKyAgICB0LmEyNCA9IDY3NzsKKyAgICB0LmEyNSA9IDc2MzsKKyAgICB0LmEyNiA9IDc2MDsKKyAgICB0LmEyNyA9IDc1OTsKKyAgICB0LmEyOCA9IDc1NDsKKyAgICB0LmE2ID0gNDk0OworICAgIHQuYTcgPSA1NTI7CisgICAgdC5hOCA9IDUzNzsKKyAgICB0LmE5ID0gNTc3OworICAgIHQuYTEwID0gNjkyOworICAgIHQuYTI5ID0gNzg2OworICAgIHQuYTMwID0gNzg4OworICAgIHQuYTMxID0gNzg4OworICAgIHQuYTMyID0gNzkwOworICAgIHQuYTMzID0gNzkzOworICAgIHQuYTM0ID0gNzk0OworICAgIHQuYTM1ID0gODE2OworICAgIHQuYTM2ID0gODIzOworICAgIHQuYTM3ID0gNzg5OworICAgIHQuYTM4ID0gODQxOworICAgIHQuYTM5ID0gODIzOworICAgIHQuYTQwID0gODMzOworICAgIHQuYTQxID0gODE2OworICAgIHQuYTQyID0gODMxOworICAgIHQuYTQzID0gOTIzOworICAgIHQuYTQ0ID0gNzQ0OworICAgIHQuYTQ1ID0gNzIzOworICAgIHQuYTQ2ID0gNzQ5OworICAgIHQuYTQ3ID0gNzkwOworICAgIHQuYTQ4ID0gNzkyOworICAgIHQuYTQ5ID0gNjk1OworICAgIHQuYTUwID0gNzc2OworICAgIHQuYTUxID0gNzY4OworICAgIHQuYTUyID0gNzkyOworICAgIHQuYTUzID0gNzU5OworICAgIHQuYTU0ID0gNzA3OworICAgIHQuYTU1ID0gNzA4OworICAgIHQuYTU2ID0gNjgyOworICAgIHQuYTU3ID0gNzAxOworICAgIHQuYTU4ID0gODI2OworICAgIHQuYTU5ID0gODE1OworICAgIHQuYTYwID0gNzg5OworICAgIHQuYTYxID0gNzg5OworICAgIHQuYTYyID0gNzA3OworICAgIHQuYTYzID0gNjg3OworICAgIHQuYTY0ID0gNjk2OworICAgIHQuYTY1ID0gNjg5OworICAgIHQuYTY2ID0gNzg2OworICAgIHQuYTY3ID0gNzg3OworICAgIHQuYTY4ID0gNzEzOworICAgIHQuYTY5ID0gNzkxOworICAgIHQuYTcwID0gNzg1OworICAgIHQuYTcxID0gNzkxOworICAgIHQuYTcyID0gODczOworICAgIHQuYTczID0gNzYxOworICAgIHQuYTc0ID0gNzYyOworICAgIHQuYTIwMyA9IDc2MjsKKyAgICB0LmE3NSA9IDc1OTsKKyAgICB0LmEyMDQgPSA3NTk7CisgICAgdC5hNzYgPSA4OTI7CisgICAgdC5hNzcgPSA4OTI7CisgICAgdC5hNzggPSA3ODg7CisgICAgdC5hNzkgPSA3ODQ7CisgICAgdC5hODEgPSA0Mzg7CisgICAgdC5hODIgPSAxMzg7CisgICAgdC5hODMgPSAyNzc7CisgICAgdC5hODQgPSA0MTU7CisgICAgdC5hOTcgPSAzOTI7CisgICAgdC5hOTggPSAzOTI7CisgICAgdC5hOTkgPSA2Njg7CisgICAgdC5hMTAwID0gNjY4OworICAgIHQuYTg5ID0gMzkwOworICAgIHQuYTkwID0gMzkwOworICAgIHQuYTkzID0gMzE3OworICAgIHQuYTk0ID0gMzE3OworICAgIHQuYTkxID0gMjc2OworICAgIHQuYTkyID0gMjc2OworICAgIHQuYTIwNSA9IDUwOTsKKyAgICB0LmE4NSA9IDUwOTsKKyAgICB0LmEyMDYgPSA0MTA7CisgICAgdC5hODYgPSA0MTA7CisgICAgdC5hODcgPSAyMzQ7CisgICAgdC5hODggPSAyMzQ7CisgICAgdC5hOTUgPSAzMzQ7CisgICAgdC5hOTYgPSAzMzQ7CisgICAgdC5hMTAxID0gNzMyOworICAgIHQuYTEwMiA9IDU0NDsKKyAgICB0LmExMDMgPSA1NDQ7CisgICAgdC5hMTA0ID0gOTEwOworICAgIHQuYTEwNiA9IDY2NzsKKyAgICB0LmExMDcgPSA3NjA7CisgICAgdC5hMTA4ID0gNzYwOworICAgIHQuYTExMiA9IDc3NjsKKyAgICB0LmExMTEgPSA1OTU7CisgICAgdC5hMTEwID0gNjk0OworICAgIHQuYTEwOSA9IDYyNjsKKyAgICB0LmExMjAgPSA3ODg7CisgICAgdC5hMTIxID0gNzg4OworICAgIHQuYTEyMiA9IDc4ODsKKyAgICB0LmExMjMgPSA3ODg7CisgICAgdC5hMTI0ID0gNzg4OworICAgIHQuYTEyNSA9IDc4ODsKKyAgICB0LmExMjYgPSA3ODg7CisgICAgdC5hMTI3ID0gNzg4OworICAgIHQuYTEyOCA9IDc4ODsKKyAgICB0LmExMjkgPSA3ODg7CisgICAgdC5hMTMwID0gNzg4OworICAgIHQuYTEzMSA9IDc4ODsKKyAgICB0LmExMzIgPSA3ODg7CisgICAgdC5hMTMzID0gNzg4OworICAgIHQuYTEzNCA9IDc4ODsKKyAgICB0LmExMzUgPSA3ODg7CisgICAgdC5hMTM2ID0gNzg4OworICAgIHQuYTEzNyA9IDc4ODsKKyAgICB0LmExMzggPSA3ODg7CisgICAgdC5hMTM5ID0gNzg4OworICAgIHQuYTE0MCA9IDc4ODsKKyAgICB0LmExNDEgPSA3ODg7CisgICAgdC5hMTQyID0gNzg4OworICAgIHQuYTE0MyA9IDc4ODsKKyAgICB0LmExNDQgPSA3ODg7CisgICAgdC5hMTQ1ID0gNzg4OworICAgIHQuYTE0NiA9IDc4ODsKKyAgICB0LmExNDcgPSA3ODg7CisgICAgdC5hMTQ4ID0gNzg4OworICAgIHQuYTE0OSA9IDc4ODsKKyAgICB0LmExNTAgPSA3ODg7CisgICAgdC5hMTUxID0gNzg4OworICAgIHQuYTE1MiA9IDc4ODsKKyAgICB0LmExNTMgPSA3ODg7CisgICAgdC5hMTU0ID0gNzg4OworICAgIHQuYTE1NSA9IDc4ODsKKyAgICB0LmExNTYgPSA3ODg7CisgICAgdC5hMTU3ID0gNzg4OworICAgIHQuYTE1OCA9IDc4ODsKKyAgICB0LmExNTkgPSA3ODg7CisgICAgdC5hMTYwID0gODk0OworICAgIHQuYTE2MSA9IDgzODsKKyAgICB0LmExNjMgPSAxMDE2OworICAgIHQuYTE2NCA9IDQ1ODsKKyAgICB0LmExOTYgPSA3NDg7CisgICAgdC5hMTY1ID0gOTI0OworICAgIHQuYTE5MiA9IDc0ODsKKyAgICB0LmExNjYgPSA5MTg7CisgICAgdC5hMTY3ID0gOTI3OworICAgIHQuYTE2OCA9IDkyODsKKyAgICB0LmExNjkgPSA5Mjg7CisgICAgdC5hMTcwID0gODM0OworICAgIHQuYTE3MSA9IDg3MzsKKyAgICB0LmExNzIgPSA4Mjg7CisgICAgdC5hMTczID0gOTI0OworICAgIHQuYTE2MiA9IDkyNDsKKyAgICB0LmExNzQgPSA5MTc7CisgICAgdC5hMTc1ID0gOTMwOworICAgIHQuYTE3NiA9IDkzMTsKKyAgICB0LmExNzcgPSA0NjM7CisgICAgdC5hMTc4ID0gODgzOworICAgIHQuYTE3OSA9IDgzNjsKKyAgICB0LmExOTMgPSA4MzY7CisgICAgdC5hMTgwID0gODY3OworICAgIHQuYTE5OSA9IDg2NzsKKyAgICB0LmExODEgPSA2OTY7CisgICAgdC5hMjAwID0gNjk2OworICAgIHQuYTE4MiA9IDg3NDsKKyAgICB0LmEyMDEgPSA4NzQ7CisgICAgdC5hMTgzID0gNzYwOworICAgIHQuYTE4NCA9IDk0NjsKKyAgICB0LmExOTcgPSA3NzE7CisgICAgdC5hMTg1ID0gODY1OworICAgIHQuYTE5NCA9IDc3MTsKKyAgICB0LmExOTggPSA4ODg7CisgICAgdC5hMTg2ID0gOTY3OworICAgIHQuYTE5NSA9IDg4ODsKKyAgICB0LmExODcgPSA4MzE7CisgICAgdC5hMTg4ID0gODczOworICAgIHQuYTE4OSA9IDkyNzsKKyAgICB0LmExOTAgPSA5NzA7CisgICAgdC5hMTkxID0gOTE4OworICB9KTsKK30pOworZXhwb3J0cy5nZXRNZXRyaWNzID0gZ2V0TWV0cmljczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9tdXJtdXJoYXNoMy5qcyBiL2xpYi9jb3JlL211cm11cmhhc2gzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTgzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9tdXJtdXJoYXNoMy5qcwpAQCAtMCwwICsxLDE0MSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuTXVybXVySGFzaDNfNjQgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK2NvbnN0IFNFRUQgPSAweGMzZDJlMWYwOworY29uc3QgTUFTS19ISUdIID0gMHhmZmZmMDAwMDsKK2NvbnN0IE1BU0tfTE9XID0gMHhmZmZmOworCitjbGFzcyBNdXJtdXJIYXNoM182NCB7CisgIGNvbnN0cnVjdG9yKHNlZWQpIHsKKyAgICB0aGlzLmgxID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDsKKyAgICB0aGlzLmgyID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDsKKyAgfQorCisgIHVwZGF0ZShpbnB1dCkgeworICAgIGxldCBkYXRhLCBsZW5ndGg7CisKKyAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShpbnB1dCkpIHsKKyAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTsKKyAgICAgIGxlbmd0aCA9IDA7CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlucHV0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29uc3QgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSk7CisKKyAgICAgICAgaWYgKGNvZGUgPD0gMHhmZikgeworICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGUgPj4+IDg7CisgICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlICYgMHhmZjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKGlucHV0KSkgeworICAgICAgZGF0YSA9IGlucHV0OworICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIGRhdGEgZm9ybWF0IGluIE11cm11ckhhc2gzXzY0X3VwZGF0ZS4gIiArICJJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LiIpOworICAgIH0KKworICAgIGNvbnN0IGJsb2NrQ291bnRzID0gbGVuZ3RoID4+IDI7CisgICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDsKKyAgICBjb25zdCBkYXRhVWludDMyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyLCAwLCBibG9ja0NvdW50cyk7CisgICAgbGV0IGsxID0gMCwKKyAgICAgICAgazIgPSAwOworICAgIGxldCBoMSA9IHRoaXMuaDEsCisgICAgICAgIGgyID0gdGhpcy5oMjsKKyAgICBjb25zdCBDMSA9IDB4Y2M5ZTJkNTEsCisgICAgICAgICAgQzIgPSAweDFiODczNTkzOworICAgIGNvbnN0IEMxX0xPVyA9IEMxICYgTUFTS19MT1csCisgICAgICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVzsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykgeworICAgICAgaWYgKGkgJiAxKSB7CisgICAgICAgIGsxID0gZGF0YVVpbnQzMltpXTsKKyAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKKyAgICAgICAgazEgPSBrMSA8PCAxNSB8IGsxID4+PiAxNzsKKyAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVzsKKyAgICAgICAgaDEgXj0gazE7CisgICAgICAgIGgxID0gaDEgPDwgMTMgfCBoMSA+Pj4gMTk7CisgICAgICAgIGgxID0gaDEgKiA1ICsgMHhlNjU0NmI2NDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGsyID0gZGF0YVVpbnQzMltpXTsKKyAgICAgICAgazIgPSBrMiAqIEMxICYgTUFTS19ISUdIIHwgazIgKiBDMV9MT1cgJiBNQVNLX0xPVzsKKyAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNzsKKyAgICAgICAgazIgPSBrMiAqIEMyICYgTUFTS19ISUdIIHwgazIgKiBDMl9MT1cgJiBNQVNLX0xPVzsKKyAgICAgICAgaDIgXj0gazI7CisgICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7CisgICAgICAgIGgyID0gaDIgKiA1ICsgMHhlNjU0NmI2NDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBrMSA9IDA7CisKKyAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAyXSA8PCAxNjsKKworICAgICAgY2FzZSAyOgorICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDRdOworICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XOworICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OworICAgICAgICBrMSA9IGsxICogQzIgJiBNQVNLX0hJR0ggfCBrMSAqIEMyX0xPVyAmIE1BU0tfTE9XOworCisgICAgICAgIGlmIChibG9ja0NvdW50cyAmIDEpIHsKKyAgICAgICAgICBoMSBePSBrMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoMiBePSBrMTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgdGhpcy5oMSA9IGgxOworICAgIHRoaXMuaDIgPSBoMjsKKyAgfQorCisgIGhleGRpZ2VzdCgpIHsKKyAgICBsZXQgaDEgPSB0aGlzLmgxLAorICAgICAgICBoMiA9IHRoaXMuaDI7CisgICAgaDEgXj0gaDIgPj4+IDE7CisgICAgaDEgPSBoMSAqIDB4ZWQ1NThjY2QgJiBNQVNLX0hJR0ggfCBoMSAqIDB4OGNjZCAmIE1BU0tfTE9XOworICAgIGgyID0gaDIgKiAweGZmNTFhZmQ3ICYgTUFTS19ISUdIIHwgKChoMiA8PCAxNiB8IGgxID4+PiAxNikgKiAweGFmZDdlZDU1ICYgTUFTS19ISUdIKSA+Pj4gMTY7CisgICAgaDEgXj0gaDIgPj4+IDE7CisgICAgaDEgPSBoMSAqIDB4MWE4NWVjNTMgJiBNQVNLX0hJR0ggfCBoMSAqIDB4ZWM1MyAmIE1BU0tfTE9XOworICAgIGgyID0gaDIgKiAweGM0Y2ViOWZlICYgTUFTS19ISUdIIHwgKChoMiA8PCAxNiB8IGgxID4+PiAxNikgKiAweGI5ZmUxYTg1ICYgTUFTS19ISUdIKSA+Pj4gMTY7CisgICAgaDEgXj0gaDIgPj4+IDE7CisgICAgY29uc3QgaGV4MSA9IChoMSA+Pj4gMCkudG9TdHJpbmcoMTYpLAorICAgICAgICAgIGhleDIgPSAoaDIgPj4+IDApLnRvU3RyaW5nKDE2KTsKKyAgICByZXR1cm4gaGV4MS5wYWRTdGFydCg4LCAiMCIpICsgaGV4Mi5wYWRTdGFydCg4LCAiMCIpOworICB9CisKK30KKworZXhwb3J0cy5NdXJtdXJIYXNoM182NCA9IE11cm11ckhhc2gzXzY0OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL29iai5qcyBiL2xpYi9jb3JlL29iai5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzJkZmMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvb2JqLmpzCkBAIC0wLDAgKzEsMjQ5NCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRmlsZVNwZWMgPSBleHBvcnRzLlhSZWYgPSBleHBvcnRzLk9iamVjdExvYWRlciA9IGV4cG9ydHMuQ2F0YWxvZyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfcGFyc2VyID0gcmVxdWlyZSgiLi9wYXJzZXIuanMiKTsKKwordmFyIF9jb3JlX3V0aWxzID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIik7CisKK3ZhciBfY3J5cHRvID0gcmVxdWlyZSgiLi9jcnlwdG8uanMiKTsKKwordmFyIF9jb2xvcnNwYWNlID0gcmVxdWlyZSgiLi9jb2xvcnNwYWNlLmpzIik7CisKK3ZhciBfaW1hZ2VfdXRpbHMgPSByZXF1aXJlKCIuL2ltYWdlX3V0aWxzLmpzIik7CisKK2Z1bmN0aW9uIGZldGNoRGVzdGluYXRpb24oZGVzdCkgeworICByZXR1cm4gKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGVzdCkgPyBkZXN0LmdldCgiRCIpIDogZGVzdDsKK30KKworY2xhc3MgQ2F0YWxvZyB7CisgIGNvbnN0cnVjdG9yKHBkZk1hbmFnZXIsIHhyZWYpIHsKKyAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOworICAgIHRoaXMueHJlZiA9IHhyZWY7CisgICAgdGhpcy5fY2F0RGljdCA9IHhyZWYuZ2V0Q2F0YWxvZ09iaigpOworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh0aGlzLl9jYXREaWN0KSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJDYXRhbG9nIG9iamVjdCBpcyBub3QgYSBkaWN0aW9uYXJ5LiIpOworICAgIH0KKworICAgIHRoaXMuZm9udENhY2hlID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldENhY2hlKCk7CisgICAgdGhpcy5idWlsdEluQ01hcENhY2hlID0gbmV3IE1hcCgpOworICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuR2xvYmFsSW1hZ2VDYWNoZSgpOworICAgIHRoaXMucGFnZUtpZHNDb3VudENhY2hlID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldENhY2hlKCk7CisgIH0KKworICBnZXQgdmVyc2lvbigpIHsKKyAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fY2F0RGljdC5nZXQoIlZlcnNpb24iKTsKKworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodmVyc2lvbikpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidmVyc2lvbiIsIG51bGwpOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidmVyc2lvbiIsIHZlcnNpb24ubmFtZSk7CisgIH0KKworICBnZXQgY29sbGVjdGlvbigpIHsKKyAgICBsZXQgY29sbGVjdGlvbiA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIkNvbGxlY3Rpb24iKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaikgJiYgb2JqLnNpemUgPiAwKSB7CisgICAgICAgIGNvbGxlY3Rpb24gPSBvYmo7CisgICAgICB9CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorCisgICAgICAoMCwgX3V0aWwuaW5mbykoIkNhbm5vdCBmZXRjaCBDb2xsZWN0aW9uIGVudHJ5OyBhc3N1bWluZyBubyBjb2xsZWN0aW9uIGlzIHByZXNlbnQuIik7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjb2xsZWN0aW9uIiwgY29sbGVjdGlvbik7CisgIH0KKworICBnZXQgYWNyb0Zvcm0oKSB7CisgICAgbGV0IGFjcm9Gb3JtID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQWNyb0Zvcm0iKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaikgJiYgb2JqLnNpemUgPiAwKSB7CisgICAgICAgIGFjcm9Gb3JtID0gb2JqOworICAgICAgfQorICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKCJDYW5ub3QgZmV0Y2ggQWNyb0Zvcm0gZW50cnk7IGFzc3VtaW5nIG5vIGZvcm1zIGFyZSBwcmVzZW50LiIpOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYWNyb0Zvcm0iLCBhY3JvRm9ybSk7CisgIH0KKworICBnZXQgbWV0YWRhdGEoKSB7CisgICAgY29uc3Qgc3RyZWFtUmVmID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoIk1ldGFkYXRhIik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1JlZikoc3RyZWFtUmVmKSkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJtZXRhZGF0YSIsIG51bGwpOworICAgIH0KKworICAgIGNvbnN0IHN1cHByZXNzRW5jcnlwdGlvbiA9ICEodGhpcy54cmVmLmVuY3J5cHQgJiYgdGhpcy54cmVmLmVuY3J5cHQuZW5jcnlwdE1ldGFkYXRhKTsKKyAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnhyZWYuZmV0Y2goc3RyZWFtUmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOworICAgIGxldCBtZXRhZGF0YTsKKworICAgIGlmIChzdHJlYW0gJiYgKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoc3RyZWFtLmRpY3QpKSB7CisgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLmRpY3QuZ2V0KCJUeXBlIik7CisgICAgICBjb25zdCBzdWJ0eXBlID0gc3RyZWFtLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh0eXBlLCAiTWV0YWRhdGEiKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShzdWJ0eXBlLCAiWE1MIikpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBtZXRhZGF0YSA9ICgwLCBfdXRpbC5zdHJpbmdUb1VURjhTdHJpbmcpKCgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShzdHJlYW0uZ2V0Qnl0ZXMoKSkpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIlNraXBwaW5nIGludmFsaWQgbWV0YWRhdGEuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm1ldGFkYXRhIiwgbWV0YWRhdGEpOworICB9CisKKyAgZ2V0IHRvcGxldmVsUGFnZXNEaWN0KCkgeworICAgIGNvbnN0IHBhZ2VzT2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VzIik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHBhZ2VzT2JqKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHRvcC1sZXZlbCBwYWdlcyBkaWN0aW9uYXJ5LiIpOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidG9wbGV2ZWxQYWdlc0RpY3QiLCBwYWdlc09iaik7CisgIH0KKworICBnZXQgZG9jdW1lbnRPdXRsaW5lKCkgeworICAgIGxldCBvYmogPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIG9iaiA9IHRoaXMuX3JlYWREb2N1bWVudE91dGxpbmUoKTsKKyAgICB9IGNhdGNoIChleCkgeworICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgZXg7CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5hYmxlIHRvIHJlYWQgZG9jdW1lbnQgb3V0bGluZS4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRvY3VtZW50T3V0bGluZSIsIG9iaik7CisgIH0KKworICBfcmVhZERvY3VtZW50T3V0bGluZSgpIHsKKyAgICBsZXQgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaikpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIG9iaiA9IG9iai5nZXRSYXcoIkZpcnN0Iik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1JlZikob2JqKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3Qgcm9vdCA9IHsKKyAgICAgIGl0ZW1zOiBbXQorICAgIH07CisgICAgY29uc3QgcXVldWUgPSBbeworICAgICAgb2JqLAorICAgICAgcGFyZW50OiByb290CisgICAgfV07CisgICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOworICAgIHByb2Nlc3NlZC5wdXQob2JqKTsKKyAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmLAorICAgICAgICAgIGJsYWNrQ29sb3IgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7CisKKyAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgeworICAgICAgY29uc3QgaSA9IHF1ZXVlLnNoaWZ0KCk7CisgICAgICBjb25zdCBvdXRsaW5lRGljdCA9IHhyZWYuZmV0Y2hJZlJlZihpLm9iaik7CisKKyAgICAgIGlmIChvdXRsaW5lRGljdCA9PT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFvdXRsaW5lRGljdC5oYXMoIlRpdGxlIikpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIG91dGxpbmUgaXRlbSBlbmNvdW50ZXJlZC4iKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZGF0YSA9IHsKKyAgICAgICAgdXJsOiBudWxsLAorICAgICAgICBkZXN0OiBudWxsCisgICAgICB9OworICAgICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKKyAgICAgICAgZGVzdERpY3Q6IG91dGxpbmVEaWN0LAorICAgICAgICByZXN1bHRPYmo6IGRhdGEsCisgICAgICAgIGRvY0Jhc2VVcmw6IHRoaXMucGRmTWFuYWdlci5kb2NCYXNlVXJsCisgICAgICB9KTsKKyAgICAgIGNvbnN0IHRpdGxlID0gb3V0bGluZURpY3QuZ2V0KCJUaXRsZSIpOworICAgICAgY29uc3QgZmxhZ3MgPSBvdXRsaW5lRGljdC5nZXQoIkYiKSB8fCAwOworICAgICAgY29uc3QgY29sb3IgPSBvdXRsaW5lRGljdC5nZXRBcnJheSgiQyIpOworICAgICAgY29uc3QgY291bnQgPSBvdXRsaW5lRGljdC5nZXQoIkNvdW50Iik7CisgICAgICBsZXQgcmdiQ29sb3IgPSBibGFja0NvbG9yOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2xvcikgJiYgY29sb3IubGVuZ3RoID09PSAzICYmIChjb2xvclswXSAhPT0gMCB8fCBjb2xvclsxXSAhPT0gMCB8fCBjb2xvclsyXSAhPT0gMCkpIHsKKyAgICAgICAgcmdiQ29sb3IgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihjb2xvciwgMCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG91dGxpbmVJdGVtID0geworICAgICAgICBkZXN0OiBkYXRhLmRlc3QsCisgICAgICAgIHVybDogZGF0YS51cmwsCisgICAgICAgIHVuc2FmZVVybDogZGF0YS51bnNhZmVVcmwsCisgICAgICAgIG5ld1dpbmRvdzogZGF0YS5uZXdXaW5kb3csCisgICAgICAgIHRpdGxlOiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHRpdGxlKSwKKyAgICAgICAgY29sb3I6IHJnYkNvbG9yLAorICAgICAgICBjb3VudDogTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgPyBjb3VudCA6IHVuZGVmaW5lZCwKKyAgICAgICAgYm9sZDogISEoZmxhZ3MgJiAyKSwKKyAgICAgICAgaXRhbGljOiAhIShmbGFncyAmIDEpLAorICAgICAgICBpdGVtczogW10KKyAgICAgIH07CisgICAgICBpLnBhcmVudC5pdGVtcy5wdXNoKG91dGxpbmVJdGVtKTsKKyAgICAgIG9iaiA9IG91dGxpbmVEaWN0LmdldFJhdygiRmlyc3QiKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikob2JqKSAmJiAhcHJvY2Vzc2VkLmhhcyhvYmopKSB7CisgICAgICAgIHF1ZXVlLnB1c2goeworICAgICAgICAgIG9iaiwKKyAgICAgICAgICBwYXJlbnQ6IG91dGxpbmVJdGVtCisgICAgICAgIH0pOworICAgICAgICBwcm9jZXNzZWQucHV0KG9iaik7CisgICAgICB9CisKKyAgICAgIG9iaiA9IG91dGxpbmVEaWN0LmdldFJhdygiTmV4dCIpOworCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKShvYmopICYmICFwcm9jZXNzZWQuaGFzKG9iaikpIHsKKyAgICAgICAgcXVldWUucHVzaCh7CisgICAgICAgICAgb2JqLAorICAgICAgICAgIHBhcmVudDogaS5wYXJlbnQKKyAgICAgICAgfSk7CisgICAgICAgIHByb2Nlc3NlZC5wdXQob2JqKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcm9vdC5pdGVtcy5sZW5ndGggPiAwID8gcm9vdC5pdGVtcyA6IG51bGw7CisgIH0KKworICBnZXQgcGVybWlzc2lvbnMoKSB7CisgICAgbGV0IHBlcm1pc3Npb25zID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBwZXJtaXNzaW9ucyA9IHRoaXMuX3JlYWRQZXJtaXNzaW9ucygpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmFibGUgdG8gcmVhZCBwZXJtaXNzaW9ucy4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInBlcm1pc3Npb25zIiwgcGVybWlzc2lvbnMpOworICB9CisKKyAgX3JlYWRQZXJtaXNzaW9ucygpIHsKKyAgICBjb25zdCBlbmNyeXB0ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJFbmNyeXB0Iik7CisKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGVuY3J5cHQpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBsZXQgZmxhZ3MgPSBlbmNyeXB0LmdldCgiUCIpOworCisgICAgaWYgKCEoMCwgX3V0aWwuaXNOdW0pKGZsYWdzKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgZmxhZ3MgKz0gMiAqKiAzMjsKKyAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFtdOworCisgICAgZm9yIChjb25zdCBrZXkgaW4gX3V0aWwuUGVybWlzc2lvbkZsYWcpIHsKKyAgICAgIGNvbnN0IHZhbHVlID0gX3V0aWwuUGVybWlzc2lvbkZsYWdba2V5XTsKKworICAgICAgaWYgKGZsYWdzICYgdmFsdWUpIHsKKyAgICAgICAgcGVybWlzc2lvbnMucHVzaCh2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBlcm1pc3Npb25zOworICB9CisKKyAgZ2V0IG9wdGlvbmFsQ29udGVudENvbmZpZygpIHsKKyAgICBsZXQgY29uZmlnID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fY2F0RGljdC5nZXQoIk9DUHJvcGVydGllcyIpOworCisgICAgICBpZiAoIXByb3BlcnRpZXMpIHsKKyAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBudWxsKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IHByb3BlcnRpZXMuZ2V0KCJEIik7CisKKyAgICAgIGlmICghZGVmYXVsdENvbmZpZykgeworICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIG51bGwpOworICAgICAgfQorCisgICAgICBjb25zdCBncm91cHNEYXRhID0gcHJvcGVydGllcy5nZXQoIk9DR3MiKTsKKworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdyb3Vwc0RhdGEpKSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGdyb3VwcyA9IFtdOworICAgICAgY29uc3QgZ3JvdXBSZWZzID0gW107CisKKyAgICAgIGZvciAoY29uc3QgZ3JvdXBSZWYgb2YgZ3JvdXBzRGF0YSkgeworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1JlZikoZ3JvdXBSZWYpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBncm91cFJlZnMucHVzaChncm91cFJlZik7CisgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZ3JvdXBSZWYpOworICAgICAgICBncm91cHMucHVzaCh7CisgICAgICAgICAgaWQ6IGdyb3VwUmVmLnRvU3RyaW5nKCksCisgICAgICAgICAgbmFtZTogKDAsIF91dGlsLmlzU3RyaW5nKShncm91cC5nZXQoIk5hbWUiKSkgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGdyb3VwLmdldCgiTmFtZSIpKSA6IG51bGwsCisgICAgICAgICAgaW50ZW50OiAoMCwgX3V0aWwuaXNTdHJpbmcpKGdyb3VwLmdldCgiSW50ZW50IikpID8gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShncm91cC5nZXQoIkludGVudCIpKSA6IG51bGwKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGNvbmZpZyA9IHRoaXMuX3JlYWRPcHRpb25hbENvbnRlbnRDb25maWcoZGVmYXVsdENvbmZpZywgZ3JvdXBSZWZzKTsKKyAgICAgIGNvbmZpZy5ncm91cHMgPSBncm91cHM7CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorCisgICAgICAoMCwgX3V0aWwud2FybikoYFVuYWJsZSB0byByZWFkIG9wdGlvbmFsIGNvbnRlbnQgY29uZmlnOiAke2V4fWApOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgY29uZmlnKTsKKyAgfQorCisgIF9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKGNvbmZpZywgY29udGVudEdyb3VwUmVmcykgeworICAgIGZ1bmN0aW9uIHBhcnNlT25PZmYocmVmcykgeworICAgICAgY29uc3Qgb25QYXJzZWQgPSBbXTsKKworICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVmcykpIHsKKyAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWZzKSB7CisgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKHZhbHVlKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGNvbnRlbnRHcm91cFJlZnMuaW5jbHVkZXModmFsdWUpKSB7CisgICAgICAgICAgICBvblBhcnNlZC5wdXNoKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gb25QYXJzZWQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gcGFyc2VPcmRlcihyZWZzLCBuZXN0ZWRMZXZlbHMgPSAwKSB7CisgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVmcykpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG9yZGVyID0gW107CisKKyAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVmcykgeworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmKSh2YWx1ZSkgJiYgY29udGVudEdyb3VwUmVmcy5pbmNsdWRlcyh2YWx1ZSkpIHsKKyAgICAgICAgICBwYXJzZWRPcmRlclJlZnMucHV0KHZhbHVlKTsKKyAgICAgICAgICBvcmRlci5wdXNoKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU5lc3RlZE9yZGVyKHZhbHVlLCBuZXN0ZWRMZXZlbHMpOworCisgICAgICAgIGlmIChuZXN0ZWRPcmRlcikgeworICAgICAgICAgIG9yZGVyLnB1c2gobmVzdGVkT3JkZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChuZXN0ZWRMZXZlbHMgPiAwKSB7CisgICAgICAgIHJldHVybiBvcmRlcjsKKyAgICAgIH0KKworICAgICAgY29uc3QgaGlkZGVuR3JvdXBzID0gW107CisKKyAgICAgIGZvciAoY29uc3QgZ3JvdXBSZWYgb2YgY29udGVudEdyb3VwUmVmcykgeworICAgICAgICBpZiAocGFyc2VkT3JkZXJSZWZzLmhhcyhncm91cFJlZikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGhpZGRlbkdyb3Vwcy5wdXNoKGdyb3VwUmVmLnRvU3RyaW5nKCkpOworICAgICAgfQorCisgICAgICBpZiAoaGlkZGVuR3JvdXBzLmxlbmd0aCkgeworICAgICAgICBvcmRlci5wdXNoKHsKKyAgICAgICAgICBuYW1lOiBudWxsLAorICAgICAgICAgIG9yZGVyOiBoaWRkZW5Hcm91cHMKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvcmRlcjsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBwYXJzZU5lc3RlZE9yZGVyKHJlZiwgbmVzdGVkTGV2ZWxzKSB7CisgICAgICBpZiAoKytuZXN0ZWRMZXZlbHMgPiBNQVhfTkVTVEVEX0xFVkVMUykgeworICAgICAgICAoMCwgX3V0aWwud2FybikoInBhcnNlTmVzdGVkT3JkZXIgLSByZWFjaGVkIE1BWF9ORVNURURfTEVWRUxTLiIpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgY29uc3QgdmFsdWUgPSB4cmVmLmZldGNoSWZSZWYocmVmKTsKKworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgY29uc3QgbmVzdGVkTmFtZSA9IHhyZWYuZmV0Y2hJZlJlZih2YWx1ZVswXSk7CisKKyAgICAgIGlmICh0eXBlb2YgbmVzdGVkTmFtZSAhPT0gInN0cmluZyIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG5lc3RlZE9yZGVyID0gcGFyc2VPcmRlcih2YWx1ZS5zbGljZSgxKSwgbmVzdGVkTGV2ZWxzKTsKKworICAgICAgaWYgKCFuZXN0ZWRPcmRlciB8fCAhbmVzdGVkT3JkZXIubGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICByZXR1cm4geworICAgICAgICBuYW1lOiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKG5lc3RlZE5hbWUpLAorICAgICAgICBvcmRlcjogbmVzdGVkT3JkZXIKKyAgICAgIH07CisgICAgfQorCisgICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKKyAgICAgICAgICBwYXJzZWRPcmRlclJlZnMgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCksCisgICAgICAgICAgTUFYX05FU1RFRF9MRVZFTFMgPSAxMDsKKyAgICByZXR1cm4geworICAgICAgbmFtZTogKDAsIF91dGlsLmlzU3RyaW5nKShjb25maWcuZ2V0KCJOYW1lIikpID8gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShjb25maWcuZ2V0KCJOYW1lIikpIDogbnVsbCwKKyAgICAgIGNyZWF0b3I6ICgwLCBfdXRpbC5pc1N0cmluZykoY29uZmlnLmdldCgiQ3JlYXRvciIpKSA/ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoY29uZmlnLmdldCgiQ3JlYXRvciIpKSA6IG51bGwsCisgICAgICBiYXNlU3RhdGU6ICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpKSA/IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpLm5hbWUgOiBudWxsLAorICAgICAgb246IHBhcnNlT25PZmYoY29uZmlnLmdldCgiT04iKSksCisgICAgICBvZmY6IHBhcnNlT25PZmYoY29uZmlnLmdldCgiT0ZGIikpLAorICAgICAgb3JkZXI6IHBhcnNlT3JkZXIoY29uZmlnLmdldCgiT3JkZXIiKSksCisgICAgICBncm91cHM6IG51bGwKKyAgICB9OworICB9CisKKyAgZ2V0IG51bVBhZ2VzKCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMudG9wbGV2ZWxQYWdlc0RpY3QuZ2V0KCJDb3VudCIpOworCisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm51bVBhZ2VzIiwgb2JqKTsKKyAgfQorCisgIGdldCBkZXN0aW5hdGlvbnMoKSB7CisgICAgY29uc3Qgb2JqID0gdGhpcy5fcmVhZERlc3RzKCksCisgICAgICAgICAgZGVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVUcmVlKSB7CisgICAgICBjb25zdCBuYW1lcyA9IG9iai5nZXRBbGwoKTsKKworICAgICAgZm9yIChjb25zdCBuYW1lIGluIG5hbWVzKSB7CisgICAgICAgIGRlc3RzW25hbWVdID0gZmV0Y2hEZXN0aW5hdGlvbihuYW1lc1tuYW1lXSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CisgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICBkZXN0c1trZXldID0gZmV0Y2hEZXN0aW5hdGlvbih2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZGVzdGluYXRpb25zIiwgZGVzdHMpOworICB9CisKKyAgZ2V0RGVzdGluYXRpb24oZGVzdGluYXRpb25JZCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX3JlYWREZXN0cygpOworCisgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVUcmVlIHx8IG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKKyAgICAgIHJldHVybiBmZXRjaERlc3RpbmF0aW9uKG9iai5nZXQoZGVzdGluYXRpb25JZCkgfHwgbnVsbCk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBfcmVhZERlc3RzKCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOworCisgICAgaWYgKG9iaiAmJiBvYmouaGFzKCJEZXN0cyIpKSB7CisgICAgICByZXR1cm4gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIkRlc3RzIiksIHRoaXMueHJlZik7CisgICAgfSBlbHNlIGlmICh0aGlzLl9jYXREaWN0LmhhcygiRGVzdHMiKSkgeworICAgICAgcmV0dXJuIHRoaXMuX2NhdERpY3QuZ2V0KCJEZXN0cyIpOworICAgIH0KKworICAgIHJldHVybiB1bmRlZmluZWQ7CisgIH0KKworICBnZXQgcGFnZUxhYmVscygpIHsKKyAgICBsZXQgb2JqID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBvYmogPSB0aGlzLl9yZWFkUGFnZUxhYmVscygpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmFibGUgdG8gcmVhZCBwYWdlIGxhYmVscy4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInBhZ2VMYWJlbHMiLCBvYmopOworICB9CisKKyAgX3JlYWRQYWdlTGFiZWxzKCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlTGFiZWxzIik7CisKKyAgICBpZiAoIW9iaikgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgcGFnZUxhYmVscyA9IG5ldyBBcnJheSh0aGlzLm51bVBhZ2VzKTsKKyAgICBsZXQgc3R5bGUgPSBudWxsLAorICAgICAgICBwcmVmaXggPSAiIjsKKyAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUob2JqLCB0aGlzLnhyZWYpOworICAgIGNvbnN0IG51bXMgPSBudW1iZXJUcmVlLmdldEFsbCgpOworICAgIGxldCBjdXJyZW50TGFiZWwgPSAiIiwKKyAgICAgICAgY3VycmVudEluZGV4ID0gMTsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMubnVtUGFnZXM7IGkgPCBpaTsgaSsrKSB7CisgICAgICBpZiAoaSBpbiBudW1zKSB7CisgICAgICAgIGNvbnN0IGxhYmVsRGljdCA9IG51bXNbaV07CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShsYWJlbERpY3QpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJQYWdlTGFiZWwgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJUeXBlIikgJiYgISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGxhYmVsRGljdC5nZXQoIlR5cGUiKSwgIlBhZ2VMYWJlbCIpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHR5cGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFiZWxEaWN0LmhhcygiUyIpKSB7CisgICAgICAgICAgY29uc3QgcyA9IGxhYmVsRGljdC5nZXQoIlMiKTsKKworICAgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkocykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBzdHlsZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHlsZSA9IHMubmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHlsZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFiZWxEaWN0LmhhcygiUCIpKSB7CisgICAgICAgICAgY29uc3QgcCA9IGxhYmVsRGljdC5nZXQoIlAiKTsKKworICAgICAgICAgIGlmICghKDAsIF91dGlsLmlzU3RyaW5nKShwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcmVmaXggPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByZWZpeCA9ICIiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlN0IikpIHsKKyAgICAgICAgICBjb25zdCBzdCA9IGxhYmVsRGljdC5nZXQoIlN0Iik7CisKKyAgICAgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKHN0KSAmJiBzdCA+PSAxKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHN0YXJ0IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGN1cnJlbnRJbmRleCA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3dpdGNoIChzdHlsZSkgeworICAgICAgICBjYXNlICJEIjoKKyAgICAgICAgICBjdXJyZW50TGFiZWwgPSBjdXJyZW50SW5kZXg7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiUiI6CisgICAgICAgIGNhc2UgInIiOgorICAgICAgICAgIGN1cnJlbnRMYWJlbCA9ICgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKGN1cnJlbnRJbmRleCwgc3R5bGUgPT09ICJyIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiQSI6CisgICAgICAgIGNhc2UgImEiOgorICAgICAgICAgIGNvbnN0IExJTUlUID0gMjY7CisgICAgICAgICAgY29uc3QgQV9VUFBFUl9DQVNFID0gMHg0MSwKKyAgICAgICAgICAgICAgICBBX0xPV0VSX0NBU0UgPSAweDYxOworICAgICAgICAgIGNvbnN0IGJhc2VDaGFyQ29kZSA9IHN0eWxlID09PSAiYSIgPyBBX0xPV0VSX0NBU0UgOiBBX1VQUEVSX0NBU0U7CisgICAgICAgICAgY29uc3QgbGV0dGVySW5kZXggPSBjdXJyZW50SW5kZXggLSAxOworICAgICAgICAgIGNvbnN0IGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYmFzZUNoYXJDb2RlICsgbGV0dGVySW5kZXggJSBMSU1JVCk7CisgICAgICAgICAgY29uc3QgY2hhckJ1ZiA9IFtdOworCisgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gbGV0dGVySW5kZXggLyBMSU1JVCB8IDA7IGogPD0gamo7IGorKykgeworICAgICAgICAgICAgY2hhckJ1Zi5wdXNoKGNoYXJhY3Rlcik7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudExhYmVsID0gY2hhckJ1Zi5qb2luKCIiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChzdHlsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIHN0eWxlICIke3N0eWxlfSIgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuYCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudExhYmVsID0gIiI7CisgICAgICB9CisKKyAgICAgIHBhZ2VMYWJlbHNbaV0gPSBwcmVmaXggKyBjdXJyZW50TGFiZWw7CisgICAgICBjdXJyZW50SW5kZXgrKzsKKyAgICB9CisKKyAgICByZXR1cm4gcGFnZUxhYmVsczsKKyAgfQorCisgIGdldCBwYWdlTGF5b3V0KCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlTGF5b3V0Iik7CisKKyAgICBsZXQgcGFnZUxheW91dCA9ICIiOworCisgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG9iaikpIHsKKyAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKKyAgICAgICAgY2FzZSAiU2luZ2xlUGFnZSI6CisgICAgICAgIGNhc2UgIk9uZUNvbHVtbiI6CisgICAgICAgIGNhc2UgIlR3b0NvbHVtbkxlZnQiOgorICAgICAgICBjYXNlICJUd29Db2x1bW5SaWdodCI6CisgICAgICAgIGNhc2UgIlR3b1BhZ2VMZWZ0IjoKKyAgICAgICAgY2FzZSAiVHdvUGFnZVJpZ2h0IjoKKyAgICAgICAgICBwYWdlTGF5b3V0ID0gb2JqLm5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJwYWdlTGF5b3V0IiwgcGFnZUxheW91dCk7CisgIH0KKworICBnZXQgcGFnZU1vZGUoKSB7CisgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VNb2RlIik7CisKKyAgICBsZXQgcGFnZU1vZGUgPSAiVXNlTm9uZSI7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkob2JqKSkgeworICAgICAgc3dpdGNoIChvYmoubmFtZSkgeworICAgICAgICBjYXNlICJVc2VOb25lIjoKKyAgICAgICAgY2FzZSAiVXNlT3V0bGluZXMiOgorICAgICAgICBjYXNlICJVc2VUaHVtYnMiOgorICAgICAgICBjYXNlICJGdWxsU2NyZWVuIjoKKyAgICAgICAgY2FzZSAiVXNlT0MiOgorICAgICAgICBjYXNlICJVc2VBdHRhY2htZW50cyI6CisgICAgICAgICAgcGFnZU1vZGUgPSBvYmoubmFtZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInBhZ2VNb2RlIiwgcGFnZU1vZGUpOworICB9CisKKyAgZ2V0IHZpZXdlclByZWZlcmVuY2VzKCkgeworICAgIGNvbnN0IFZpZXdlclByZWZlcmVuY2VzVmFsaWRhdG9ycyA9IHsKKyAgICAgIEhpZGVUb29sYmFyOiBfdXRpbC5pc0Jvb2wsCisgICAgICBIaWRlTWVudWJhcjogX3V0aWwuaXNCb29sLAorICAgICAgSGlkZVdpbmRvd1VJOiBfdXRpbC5pc0Jvb2wsCisgICAgICBGaXRXaW5kb3c6IF91dGlsLmlzQm9vbCwKKyAgICAgIENlbnRlcldpbmRvdzogX3V0aWwuaXNCb29sLAorICAgICAgRGlzcGxheURvY1RpdGxlOiBfdXRpbC5pc0Jvb2wsCisgICAgICBOb25GdWxsU2NyZWVuUGFnZU1vZGU6IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgIERpcmVjdGlvbjogX3ByaW1pdGl2ZXMuaXNOYW1lLAorICAgICAgVmlld0FyZWE6IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgIFZpZXdDbGlwOiBfcHJpbWl0aXZlcy5pc05hbWUsCisgICAgICBQcmludEFyZWE6IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgIFByaW50Q2xpcDogX3ByaW1pdGl2ZXMuaXNOYW1lLAorICAgICAgUHJpbnRTY2FsaW5nOiBfcHJpbWl0aXZlcy5pc05hbWUsCisgICAgICBEdXBsZXg6IF9wcmltaXRpdmVzLmlzTmFtZSwKKyAgICAgIFBpY2tUcmF5QnlQREZTaXplOiBfdXRpbC5pc0Jvb2wsCisgICAgICBQcmludFBhZ2VSYW5nZTogQXJyYXkuaXNBcnJheSwKKyAgICAgIE51bUNvcGllczogTnVtYmVyLmlzSW50ZWdlcgorICAgIH07CisKKyAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiVmlld2VyUHJlZmVyZW5jZXMiKTsKKworICAgIGxldCBwcmVmcyA9IG51bGw7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob2JqKSkgeworICAgICAgZm9yIChjb25zdCBrZXkgaW4gVmlld2VyUHJlZmVyZW5jZXNWYWxpZGF0b3JzKSB7CisgICAgICAgIGlmICghb2JqLmhhcyhrZXkpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB2YWx1ZSA9IG9iai5nZXQoa2V5KTsKKworICAgICAgICBpZiAoIVZpZXdlclByZWZlcmVuY2VzVmFsaWRhdG9yc1trZXldKHZhbHVlKSkgeworICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgQmFkIHZhbHVlIGluIFZpZXdlclByZWZlcmVuY2VzIGZvciAiJHtrZXl9Ii5gKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBwcmVmVmFsdWU7CisKKyAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICBjYXNlICJOb25GdWxsU2NyZWVuUGFnZU1vZGUiOgorICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CisgICAgICAgICAgICAgIGNhc2UgIlVzZU5vbmUiOgorICAgICAgICAgICAgICBjYXNlICJVc2VPdXRsaW5lcyI6CisgICAgICAgICAgICAgIGNhc2UgIlVzZVRodW1icyI6CisgICAgICAgICAgICAgIGNhc2UgIlVzZU9DIjoKKyAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIlVzZU5vbmUiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkRpcmVjdGlvbiI6CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKKyAgICAgICAgICAgICAgY2FzZSAiTDJSIjoKKyAgICAgICAgICAgICAgY2FzZSAiUjJMIjoKKyAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIkwyUiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiVmlld0FyZWEiOgorICAgICAgICAgIGNhc2UgIlZpZXdDbGlwIjoKKyAgICAgICAgICBjYXNlICJQcmludEFyZWEiOgorICAgICAgICAgIGNhc2UgIlByaW50Q2xpcCI6CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKKyAgICAgICAgICAgICAgY2FzZSAiTWVkaWFCb3giOgorICAgICAgICAgICAgICBjYXNlICJDcm9wQm94IjoKKyAgICAgICAgICAgICAgY2FzZSAiQmxlZWRCb3giOgorICAgICAgICAgICAgICBjYXNlICJUcmltQm94IjoKKyAgICAgICAgICAgICAgY2FzZSAiQXJ0Qm94IjoKKyAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIkNyb3BCb3giOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlByaW50U2NhbGluZyI6CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKKyAgICAgICAgICAgICAgY2FzZSAiTm9uZSI6CisgICAgICAgICAgICAgIGNhc2UgIkFwcERlZmF1bHQiOgorICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiQXBwRGVmYXVsdCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiRHVwbGV4IjoKKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgeworICAgICAgICAgICAgICBjYXNlICJTaW1wbGV4IjoKKyAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcFNob3J0RWRnZSI6CisgICAgICAgICAgICAgIGNhc2UgIkR1cGxleEZsaXBMb25nRWRnZSI6CisgICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJOb25lIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJQcmludFBhZ2VSYW5nZSI6CisgICAgICAgICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggJSAyICE9PSAwKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsdWUuZXZlcnkoKHBhZ2UsIGksIGFycikgPT4geworICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID4gMCAmJiAoaSA9PT0gMCB8fCBwYWdlID49IGFycltpIC0gMV0pICYmIHBhZ2UgPD0gdGhpcy5udW1QYWdlczsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoaXNWYWxpZCkgeworICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJOdW1Db3BpZXMiOgorICAgICAgICAgICAgaWYgKHZhbHVlID4gMCkgeworICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImJvb2xlYW4iKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgdmlld2VyUHJlZmVyZW5jZXMgLSBleHBlY3RlZCBhIGJvb2xlYW4gdmFsdWUgZm9yOiAke2tleX1gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlZlZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBpZiAoIXByZWZzKSB7CisgICAgICAgICAgICBwcmVmcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHJlZnNba2V5XSA9IHByZWZWYWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoYEJhZCB2YWx1ZSBpbiBWaWV3ZXJQcmVmZXJlbmNlcyBmb3IgIiR7a2V5fSIuYCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInZpZXdlclByZWZlcmVuY2VzIiwgcHJlZnMpOworICB9CisKKyAgZ2V0IG9wZW5BY3Rpb24oKSB7CisgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTsKKworICAgIGxldCBvcGVuQWN0aW9uID0gbnVsbDsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopKSB7CisgICAgICBjb25zdCBkZXN0RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CisgICAgICBkZXN0RGljdC5zZXQoIkEiLCBvYmopOworICAgICAgY29uc3QgcmVzdWx0T2JqID0geworICAgICAgICB1cmw6IG51bGwsCisgICAgICAgIGRlc3Q6IG51bGwsCisgICAgICAgIGFjdGlvbjogbnVsbAorICAgICAgfTsKKyAgICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7CisgICAgICAgIGRlc3REaWN0LAorICAgICAgICByZXN1bHRPYmoKKyAgICAgIH0pOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRPYmouZGVzdCkpIHsKKyAgICAgICAgaWYgKCFvcGVuQWN0aW9uKSB7CisgICAgICAgICAgb3BlbkFjdGlvbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBvcGVuQWN0aW9uLmRlc3QgPSByZXN1bHRPYmouZGVzdDsKKyAgICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqLmFjdGlvbikgeworICAgICAgICBpZiAoIW9wZW5BY3Rpb24pIHsKKyAgICAgICAgICBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIG9wZW5BY3Rpb24uYWN0aW9uID0gcmVzdWx0T2JqLmFjdGlvbjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgeworICAgICAgaWYgKCFvcGVuQWN0aW9uKSB7CisgICAgICAgIG9wZW5BY3Rpb24gPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgfQorCisgICAgICBvcGVuQWN0aW9uLmRlc3QgPSBvYmo7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJvcGVuQWN0aW9uIiwgb3BlbkFjdGlvbik7CisgIH0KKworICBnZXQgYXR0YWNobWVudHMoKSB7CisgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CisKKyAgICBsZXQgYXR0YWNobWVudHMgPSBudWxsOworCisgICAgaWYgKG9iaiAmJiBvYmouaGFzKCJFbWJlZGRlZEZpbGVzIikpIHsKKyAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIkVtYmVkZGVkRmlsZXMiKSwgdGhpcy54cmVmKTsKKyAgICAgIGNvbnN0IG5hbWVzID0gbmFtZVRyZWUuZ2V0QWxsKCk7CisKKyAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lcykgeworICAgICAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3BlYyhuYW1lc1tuYW1lXSwgdGhpcy54cmVmKTsKKworICAgICAgICBpZiAoIWF0dGFjaG1lbnRzKSB7CisgICAgICAgICAgYXR0YWNobWVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgYXR0YWNobWVudHNbKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShuYW1lKV0gPSBmcy5zZXJpYWxpemFibGU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJhdHRhY2htZW50cyIsIGF0dGFjaG1lbnRzKTsKKyAgfQorCisgIGdldCBqYXZhU2NyaXB0KCkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOworCisgICAgbGV0IGphdmFTY3JpcHQgPSBudWxsOworCisgICAgZnVuY3Rpb24gYXBwZW5kSWZKYXZhU2NyaXB0RGljdChqc0RpY3QpIHsKKyAgICAgIGNvbnN0IHR5cGUgPSBqc0RpY3QuZ2V0KCJTIik7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSwgIkphdmFTY3JpcHQiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGxldCBqcyA9IGpzRGljdC5nZXQoIkpTIik7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGpzKSkgeworICAgICAgICBqcyA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShqcy5nZXRCeXRlcygpKTsKKyAgICAgIH0gZWxzZSBpZiAoISgwLCBfdXRpbC5pc1N0cmluZykoanMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCFqYXZhU2NyaXB0KSB7CisgICAgICAgIGphdmFTY3JpcHQgPSBbXTsKKyAgICAgIH0KKworICAgICAgamF2YVNjcmlwdC5wdXNoKCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoanMpKTsKKyAgICB9CisKKyAgICBpZiAob2JqICYmIG9iai5oYXMoIkphdmFTY3JpcHQiKSkgeworICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiSmF2YVNjcmlwdCIpLCB0aGlzLnhyZWYpOworICAgICAgY29uc3QgbmFtZXMgPSBuYW1lVHJlZS5nZXRBbGwoKTsKKworICAgICAgZm9yIChjb25zdCBuYW1lIGluIG5hbWVzKSB7CisgICAgICAgIGNvbnN0IGpzRGljdCA9IG5hbWVzW25hbWVdOworCisgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShqc0RpY3QpKSB7CisgICAgICAgICAgYXBwZW5kSWZKYXZhU2NyaXB0RGljdChqc0RpY3QpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgb3BlbkFjdGlvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIik7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkob3BlbkFjdGlvbikgJiYgKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkob3BlbkFjdGlvbi5nZXQoIlMiKSwgIkphdmFTY3JpcHQiKSkgeworICAgICAgYXBwZW5kSWZKYXZhU2NyaXB0RGljdChvcGVuQWN0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImphdmFTY3JpcHQiLCBqYXZhU2NyaXB0KTsKKyAgfQorCisgIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikgeworICAgIGNvbnN0IHByb21pc2VzID0gW107CisgICAgdGhpcy5mb250Q2FjaGUuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSkgeworICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odHJhbnNsYXRlZEZvbnRzID0+IHsKKyAgICAgIGZvciAoY29uc3QgdHJhbnNsYXRlZEZvbnQgb2YgdHJhbnNsYXRlZEZvbnRzKSB7CisgICAgICAgIGlmICh0cmFuc2xhdGVkRm9udC5sb2FkZWROYW1lID09PSBpZCkgeworICAgICAgICAgIHRyYW5zbGF0ZWRGb250LmZhbGxiYWNrKGhhbmRsZXIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICB9CisKKyAgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CisgICAgKDAsIF9wcmltaXRpdmVzLmNsZWFyUHJpbWl0aXZlQ2FjaGVzKSgpOworICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5jbGVhcihtYW51YWxseVRyaWdnZXJlZCk7CisgICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTsKKyAgICBjb25zdCBwcm9taXNlcyA9IFtdOworICAgIHRoaXMuZm9udENhY2hlLmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UpIHsKKyAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZSk7CisgICAgfSk7CisgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKHRyYW5zbGF0ZWRGb250cyA9PiB7CisgICAgICBmb3IgKGNvbnN0IHsKKyAgICAgICAgZGljdAorICAgICAgfSBvZiB0cmFuc2xhdGVkRm9udHMpIHsKKyAgICAgICAgZGVsZXRlIGRpY3QudHJhbnNsYXRlZDsKKyAgICAgIH0KKworICAgICAgdGhpcy5mb250Q2FjaGUuY2xlYXIoKTsKKyAgICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZS5jbGVhcigpOworICAgIH0pOworICB9CisKKyAgZ2V0UGFnZURpY3QocGFnZUluZGV4KSB7CisgICAgY29uc3QgY2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICBjb25zdCBub2Rlc1RvVmlzaXQgPSBbdGhpcy5fY2F0RGljdC5nZXRSYXcoIlBhZ2VzIildOworICAgIGNvbnN0IHZpc2l0ZWROb2RlcyA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKTsKKyAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmLAorICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZSA9IHRoaXMucGFnZUtpZHNDb3VudENhY2hlOworICAgIGxldCBjb3VudCwKKyAgICAgICAgY3VycmVudFBhZ2VJbmRleCA9IDA7CisKKyAgICBmdW5jdGlvbiBuZXh0KCkgeworICAgICAgd2hpbGUgKG5vZGVzVG9WaXNpdC5sZW5ndGgpIHsKKyAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlc1RvVmlzaXQucG9wKCk7CisKKyAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikoY3VycmVudE5vZGUpKSB7CisgICAgICAgICAgY291bnQgPSBwYWdlS2lkc0NvdW50Q2FjaGUuZ2V0KGN1cnJlbnROb2RlKTsKKworICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgY3VycmVudFBhZ2VJbmRleCArIGNvdW50IDwgcGFnZUluZGV4KSB7CisgICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4ICs9IGNvdW50OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7CisgICAgICAgICAgICBjYXBhYmlsaXR5LnJlamVjdChuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhZ2VzIHRyZWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlLiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2aXNpdGVkTm9kZXMucHV0KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICB4cmVmLmZldGNoQXN5bmMoY3VycmVudE5vZGUpLnRoZW4oZnVuY3Rpb24gKG9iaikgeworICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG9iaiwgIlBhZ2UiKSB8fCAoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopICYmICFvYmouaGFzKCJLaWRzIikpIHsKKyAgICAgICAgICAgICAgaWYgKHBhZ2VJbmRleCA9PT0gY3VycmVudFBhZ2VJbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSAmJiAhcGFnZUtpZHNDb3VudENhY2hlLmhhcyhjdXJyZW50Tm9kZSkpIHsKKyAgICAgICAgICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQoY3VycmVudE5vZGUsIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZShbb2JqLCBjdXJyZW50Tm9kZV0pOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXgrKzsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKG9iaik7CisgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgfSwgY2FwYWJpbGl0eS5yZWplY3QpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoY3VycmVudE5vZGUpKSB7CisgICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3QobmV3IF91dGlsLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkIHJlZmVyZW5jZSBwb2ludHMgdG8gd3JvbmcgdHlwZSBvZiBvYmplY3QuIikpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ID0gY3VycmVudE5vZGUuZ2V0KCJDb3VudCIpOworCisgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGNvdW50KSAmJiBjb3VudCA+PSAwKSB7CisgICAgICAgICAgY29uc3Qgb2JqSWQgPSBjdXJyZW50Tm9kZS5vYmpJZDsKKworICAgICAgICAgIGlmIChvYmpJZCAmJiAhcGFnZUtpZHNDb3VudENhY2hlLmhhcyhvYmpJZCkpIHsKKyAgICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQob2JqSWQsIGNvdW50KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCArIGNvdW50IDw9IHBhZ2VJbmRleCkgeworICAgICAgICAgICAgY3VycmVudFBhZ2VJbmRleCArPSBjb3VudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXQoIktpZHMiKTsKKworICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2lkcykpIHsKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoY3VycmVudE5vZGUuZ2V0KCJUeXBlIiksICJQYWdlIikgfHwgIWN1cnJlbnROb2RlLmhhcygiVHlwZSIpICYmIGN1cnJlbnROb2RlLmhhcygiQ29udGVudHMiKSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggPT09IHBhZ2VJbmRleCkgeworICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoW2N1cnJlbnROb2RlLCBudWxsXSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VycmVudFBhZ2VJbmRleCsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3QobmV3IF91dGlsLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGxldCBsYXN0ID0ga2lkcy5sZW5ndGggLSAxOyBsYXN0ID49IDA7IGxhc3QtLSkgeworICAgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKGtpZHNbbGFzdF0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihgUGFnZSBpbmRleCAke3BhZ2VJbmRleH0gbm90IGZvdW5kLmApKTsKKyAgICB9CisKKyAgICBuZXh0KCk7CisgICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIGdldFBhZ2VJbmRleChwYWdlUmVmKSB7CisgICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKKworICAgIGZ1bmN0aW9uIHBhZ2VzQmVmb3JlUmVmKGtpZFJlZikgeworICAgICAgbGV0IHRvdGFsID0gMCwKKyAgICAgICAgICBwYXJlbnRSZWY7CisgICAgICByZXR1cm4geHJlZi5mZXRjaEFzeW5jKGtpZFJlZikudGhlbihmdW5jdGlvbiAobm9kZSkgeworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzUmVmc0VxdWFsKShraWRSZWYsIHBhZ2VSZWYpICYmICEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShub2RlLCAiUGFnZSIpICYmICEoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9kZSkgJiYgIW5vZGUuaGFzKCJUeXBlIikgJiYgbm9kZS5oYXMoIkNvbnRlbnRzIikpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJUaGUgcmVmZXJlbmNlIGRvZXMgbm90IHBvaW50IHRvIGEgL1BhZ2UgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbm9kZSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShub2RlKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmVudFJlZiA9IG5vZGUuZ2V0UmF3KCJQYXJlbnQiKTsKKyAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXN5bmMoIlBhcmVudCIpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAocGFyZW50KSB7CisgICAgICAgIGlmICghcGFyZW50KSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHBhcmVudCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhcmVudCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QXN5bmMoIktpZHMiKTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGtpZHMpIHsKKyAgICAgICAgaWYgKCFraWRzKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBraWRQcm9taXNlcyA9IFtdOworICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBraWRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBjb25zdCBraWQgPSBraWRzW2ldOworCisgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKGtpZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiS2lkIG11c3QgYmUgYSByZWZlcmVuY2UuIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZnNFcXVhbCkoa2lkLCBraWRSZWYpKSB7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBraWRQcm9taXNlcy5wdXNoKHhyZWYuZmV0Y2hBc3luYyhraWQpLnRoZW4oZnVuY3Rpb24gKG9iaikgeworICAgICAgICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiS2lkIG5vZGUgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvYmouaGFzKCJDb3VudCIpKSB7CisgICAgICAgICAgICAgIHRvdGFsICs9IG9iai5nZXQoIkNvdW50Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIktpZCByZWZlcmVuY2Ugbm90IGZvdW5kIGluIHBhcmVudCdzIGtpZHMuIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoa2lkUHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgIHJldHVybiBbdG90YWwsIHBhcmVudFJlZl07CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorCisgICAgbGV0IHRvdGFsID0gMDsKKworICAgIGZ1bmN0aW9uIG5leHQocmVmKSB7CisgICAgICByZXR1cm4gcGFnZXNCZWZvcmVSZWYocmVmKS50aGVuKGZ1bmN0aW9uIChhcmdzKSB7CisgICAgICAgIGlmICghYXJncykgeworICAgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFtjb3VudCwgcGFyZW50UmVmXSA9IGFyZ3M7CisgICAgICAgIHRvdGFsICs9IGNvdW50OworICAgICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpOworICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIG5leHQocGFnZVJlZik7CisgIH0KKworICBzdGF0aWMgcGFyc2VEZXN0RGljdGlvbmFyeShwYXJhbXMpIHsKKyAgICBmdW5jdGlvbiBhZGREZWZhdWx0UHJvdG9jb2xUb1VybCh1cmwpIHsKKyAgICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aCgid3d3LiIpID8gYGh0dHA6Ly8ke3VybH1gIDogdXJsOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRyeUNvbnZlcnRVcmxFbmNvZGluZyh1cmwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9VVEY4U3RyaW5nKSh1cmwpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICByZXR1cm4gdXJsOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGRlc3REaWN0ID0gcGFyYW1zLmRlc3REaWN0OworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkZXN0RGljdCkpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCByZXN1bHRPYmogPSBwYXJhbXMucmVzdWx0T2JqOworCisgICAgaWYgKHR5cGVvZiByZXN1bHRPYmogIT09ICJvYmplY3QiKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IGByZXN1bHRPYmpgIG11c3QgYmUgYW4gb2JqZWN0LiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGRvY0Jhc2VVcmwgPSBwYXJhbXMuZG9jQmFzZVVybCB8fCBudWxsOworICAgIGxldCBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkEiKSwKKyAgICAgICAgdXJsLAorICAgICAgICBkZXN0OworCisgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShhY3Rpb24pICYmIGRlc3REaWN0LmhhcygiRGVzdCIpKSB7CisgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKKyAgICB9CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoYWN0aW9uKSkgeworICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbi5nZXQoIlMiKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShhY3Rpb25UeXBlKSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IEludmFsaWQgdHlwZSBpbiBBY3Rpb24gZGljdGlvbmFyeS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBhY3Rpb25OYW1lID0gYWN0aW9uVHlwZS5uYW1lOworCisgICAgICBzd2l0Y2ggKGFjdGlvbk5hbWUpIHsKKyAgICAgICAgY2FzZSAiVVJJIjoKKyAgICAgICAgICB1cmwgPSBhY3Rpb24uZ2V0KCJVUkkiKTsKKworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh1cmwpKSB7CisgICAgICAgICAgICB1cmwgPSAiLyIgKyB1cmwubmFtZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykodXJsKSkgeworICAgICAgICAgICAgdXJsID0gYWRkRGVmYXVsdFByb3RvY29sVG9VcmwodXJsKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJHb1RvIjoKKyAgICAgICAgICBkZXN0ID0gYWN0aW9uLmdldCgiRCIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIkxhdW5jaCI6CisgICAgICAgIGNhc2UgIkdvVG9SIjoKKyAgICAgICAgICBjb25zdCB1cmxEaWN0ID0gYWN0aW9uLmdldCgiRiIpOworCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHVybERpY3QpKSB7CisgICAgICAgICAgICB1cmwgPSB1cmxEaWN0LmdldCgiRiIpIHx8IG51bGw7CisgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKHVybERpY3QpKSB7CisgICAgICAgICAgICB1cmwgPSB1cmxEaWN0OworICAgICAgICAgIH0KKworICAgICAgICAgIGxldCByZW1vdGVEZXN0ID0gYWN0aW9uLmdldCgiRCIpOworCisgICAgICAgICAgaWYgKHJlbW90ZURlc3QpIHsKKyAgICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShyZW1vdGVEZXN0KSkgeworICAgICAgICAgICAgICByZW1vdGVEZXN0ID0gcmVtb3RlRGVzdC5uYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKSh1cmwpKSB7CisgICAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSB1cmwuc3BsaXQoIiMiKVswXTsKKworICAgICAgICAgICAgICBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShyZW1vdGVEZXN0KSkgeworICAgICAgICAgICAgICAgIHVybCA9IGJhc2VVcmwgKyAiIyIgKyByZW1vdGVEZXN0OworICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVtb3RlRGVzdCkpIHsKKyAgICAgICAgICAgICAgICB1cmwgPSBiYXNlVXJsICsgIiMiICsgSlNPTi5zdHJpbmdpZnkocmVtb3RlRGVzdCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSBhY3Rpb24uZ2V0KCJOZXdXaW5kb3ciKTsKKworICAgICAgICAgIGlmICgoMCwgX3V0aWwuaXNCb29sKShuZXdXaW5kb3cpKSB7CisgICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0gbmV3V2luZG93OworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIk5hbWVkIjoKKyAgICAgICAgICBjb25zdCBuYW1lZEFjdGlvbiA9IGFjdGlvbi5nZXQoIk4iKTsKKworICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShuYW1lZEFjdGlvbikpIHsKKyAgICAgICAgICAgIHJlc3VsdE9iai5hY3Rpb24gPSBuYW1lZEFjdGlvbi5uYW1lOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIkphdmFTY3JpcHQiOgorICAgICAgICAgIGNvbnN0IGpzQWN0aW9uID0gYWN0aW9uLmdldCgiSlMiKTsKKyAgICAgICAgICBsZXQganM7CisKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShqc0FjdGlvbikpIHsKKyAgICAgICAgICAgIGpzID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGpzQWN0aW9uLmdldEJ5dGVzKCkpOworICAgICAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzU3RyaW5nKShqc0FjdGlvbikpIHsKKyAgICAgICAgICAgIGpzID0ganNBY3Rpb247CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGpzKSB7CisgICAgICAgICAgICBjb25zdCBVUkxfT1BFTl9NRVRIT0RTID0gWyJhcHAubGF1bmNoVVJMIiwgIndpbmRvdy5vcGVuIl07CisgICAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoIl5cXHMqKCIgKyBVUkxfT1BFTl9NRVRIT0RTLmpvaW4oInwiKS5zcGxpdCgiLiIpLmpvaW4oIlxcLiIpICsgIilcXCgoPzonfFwiKShbXidcIl0qKSg/Oid8XCIpKD86LFxccyooXFx3KylcXCl8XFwpKSIsICJpIik7CisgICAgICAgICAgICBjb25zdCBqc1VybCA9IHJlZ2V4LmV4ZWMoKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShqcykpOworCisgICAgICAgICAgICBpZiAoanNVcmwgJiYganNVcmxbMl0pIHsKKyAgICAgICAgICAgICAgdXJsID0ganNVcmxbMl07CisKKyAgICAgICAgICAgICAgaWYgKGpzVXJsWzNdID09PSAidHJ1ZSIgJiYganNVcmxbMV0gPT09ICJhcHAubGF1bmNoVVJMIikgeworICAgICAgICAgICAgICAgIHJlc3VsdE9iai5uZXdXaW5kb3cgPSB0cnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBwYXJzZURlc3REaWN0aW9uYXJ5OiB1bnN1cHBvcnRlZCBhY3Rpb24gdHlwZSAiJHthY3Rpb25OYW1lfSIuYCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChkZXN0RGljdC5oYXMoIkRlc3QiKSkgeworICAgICAgZGVzdCA9IGRlc3REaWN0LmdldCgiRGVzdCIpOworICAgIH0KKworICAgIGlmICgoMCwgX3V0aWwuaXNTdHJpbmcpKHVybCkpIHsKKyAgICAgIHVybCA9IHRyeUNvbnZlcnRVcmxFbmNvZGluZyh1cmwpOworICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSAoMCwgX3V0aWwuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodXJsLCBkb2NCYXNlVXJsKTsKKworICAgICAgaWYgKGFic29sdXRlVXJsKSB7CisgICAgICAgIHJlc3VsdE9iai51cmwgPSBhYnNvbHV0ZVVybC5ocmVmOworICAgICAgfQorCisgICAgICByZXN1bHRPYmoudW5zYWZlVXJsID0gdXJsOworICAgIH0KKworICAgIGlmIChkZXN0KSB7CisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZGVzdCkpIHsKKyAgICAgICAgZGVzdCA9IGRlc3QubmFtZTsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykoZGVzdCkgfHwgQXJyYXkuaXNBcnJheShkZXN0KSkgeworICAgICAgICByZXN1bHRPYmouZGVzdCA9IGRlc3Q7CisgICAgICB9CisgICAgfQorICB9CisKK30KKworZXhwb3J0cy5DYXRhbG9nID0gQ2F0YWxvZzsKKwordmFyIFhSZWYgPSBmdW5jdGlvbiBYUmVmQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gWFJlZihzdHJlYW0sIHBkZk1hbmFnZXIpIHsKKyAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOworICAgIHRoaXMuZW50cmllcyA9IFtdOworICAgIHRoaXMueHJlZnN0bXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHRoaXMuX2NhY2hlTWFwID0gbmV3IE1hcCgpOworICAgIHRoaXMuc3RhdHMgPSB7CisgICAgICBzdHJlYW1UeXBlczogT2JqZWN0LmNyZWF0ZShudWxsKSwKKyAgICAgIGZvbnRUeXBlczogT2JqZWN0LmNyZWF0ZShudWxsKQorICAgIH07CisgICAgdGhpcy5fbmV3UmVmTnVtID0gbnVsbDsKKyAgfQorCisgIFhSZWYucHJvdG90eXBlID0geworICAgIGdldE5ld1JlZjogZnVuY3Rpb24gWFJlZl9nZXROZXdSZWYoKSB7CisgICAgICBpZiAodGhpcy5fbmV3UmVmTnVtID09PSBudWxsKSB7CisgICAgICAgIHRoaXMuX25ld1JlZk51bSA9IHRoaXMuZW50cmllcy5sZW5ndGg7CisgICAgICB9CisKKyAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5SZWYuZ2V0KHRoaXMuX25ld1JlZk51bSsrLCAwKTsKKyAgICB9LAorICAgIHJlc2V0TmV3UmVmOiBmdW5jdGlvbiBYUmVmX3Jlc2V0TmV3UmVmKCkgeworICAgICAgdGhpcy5fbmV3UmVmTnVtID0gbnVsbDsKKyAgICB9LAorICAgIHNldFN0YXJ0WFJlZjogZnVuY3Rpb24gWFJlZl9zZXRTdGFydFhSZWYoc3RhcnRYUmVmKSB7CisgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlID0gW3N0YXJ0WFJlZl07CisgICAgfSwKKyAgICBwYXJzZTogZnVuY3Rpb24gWFJlZl9wYXJzZShyZWNvdmVyeU1vZGUpIHsKKyAgICAgIHZhciB0cmFpbGVyRGljdDsKKworICAgICAgaWYgKCFyZWNvdmVyeU1vZGUpIHsKKyAgICAgICAgdHJhaWxlckRpY3QgPSB0aGlzLnJlYWRYUmVmKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIkluZGV4aW5nIGFsbCBQREYgb2JqZWN0cyIpOworICAgICAgICB0cmFpbGVyRGljdCA9IHRoaXMuaW5kZXhPYmplY3RzKCk7CisgICAgICB9CisKKyAgICAgIHRyYWlsZXJEaWN0LmFzc2lnblhyZWYodGhpcyk7CisgICAgICB0aGlzLnRyYWlsZXIgPSB0cmFpbGVyRGljdDsKKyAgICAgIGxldCBlbmNyeXB0OworCisgICAgICB0cnkgeworICAgICAgICBlbmNyeXB0ID0gdHJhaWxlckRpY3QuZ2V0KCJFbmNyeXB0Iik7CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiRW5jcnlwdCIgcmVmZXJlbmNlOiAiJHtleH0iLmApOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZW5jcnlwdCkpIHsKKyAgICAgICAgdmFyIGlkcyA9IHRyYWlsZXJEaWN0LmdldCgiSUQiKTsKKyAgICAgICAgdmFyIGZpbGVJZCA9IGlkcyAmJiBpZHMubGVuZ3RoID8gaWRzWzBdIDogIiI7CisgICAgICAgIGVuY3J5cHQuc3VwcHJlc3NFbmNyeXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5lbmNyeXB0ID0gbmV3IF9jcnlwdG8uQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShlbmNyeXB0LCBmaWxlSWQsIHRoaXMucGRmTWFuYWdlci5wYXNzd29yZCk7CisgICAgICB9CisKKyAgICAgIGxldCByb290OworCisgICAgICB0cnkgeworICAgICAgICByb290ID0gdHJhaWxlckRpY3QuZ2V0KCJSb290Iik7CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiUm9vdCIgcmVmZXJlbmNlOiAiJHtleH0iLmApOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkocm9vdCkgJiYgcm9vdC5oYXMoIlBhZ2VzIikpIHsKKyAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcmVjb3ZlcnlNb2RlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLlhSZWZQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIHJvb3QgcmVmZXJlbmNlIik7CisgICAgICB9CisgICAgfSwKKyAgICBwcm9jZXNzWFJlZlRhYmxlOiBmdW5jdGlvbiBYUmVmX3Byb2Nlc3NYUmVmVGFibGUocGFyc2VyKSB7CisgICAgICBpZiAoISgidGFibGVTdGF0ZSIgaW4gdGhpcykpIHsKKyAgICAgICAgdGhpcy50YWJsZVN0YXRlID0geworICAgICAgICAgIGVudHJ5TnVtOiAwLAorICAgICAgICAgIHN0cmVhbVBvczogcGFyc2VyLmxleGVyLnN0cmVhbS5wb3MsCisgICAgICAgICAgcGFyc2VyQnVmMTogcGFyc2VyLmJ1ZjEsCisgICAgICAgICAgcGFyc2VyQnVmMjogcGFyc2VyLmJ1ZjIKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgdmFyIG9iaiA9IHRoaXMucmVhZFhSZWZUYWJsZShwYXJzZXIpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAidHJhaWxlciIpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgZmluZCB0cmFpbGVyIGRpY3Rpb25hcnkiKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGljdCkgJiYgZGljdC5kaWN0KSB7CisgICAgICAgIGRpY3QgPSBkaWN0LmRpY3Q7CisgICAgICB9CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGljdCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBwYXJzZSB0cmFpbGVyIGRpY3Rpb25hcnkiKTsKKyAgICAgIH0KKworICAgICAgZGVsZXRlIHRoaXMudGFibGVTdGF0ZTsKKyAgICAgIHJldHVybiBkaWN0OworICAgIH0sCisgICAgcmVhZFhSZWZUYWJsZTogZnVuY3Rpb24gWFJlZl9yZWFkWFJlZlRhYmxlKHBhcnNlcikgeworICAgICAgdmFyIHN0cmVhbSA9IHBhcnNlci5sZXhlci5zdHJlYW07CisgICAgICB2YXIgdGFibGVTdGF0ZSA9IHRoaXMudGFibGVTdGF0ZTsKKyAgICAgIHN0cmVhbS5wb3MgPSB0YWJsZVN0YXRlLnN0cmVhbVBvczsKKyAgICAgIHBhcnNlci5idWYxID0gdGFibGVTdGF0ZS5wYXJzZXJCdWYxOworICAgICAgcGFyc2VyLmJ1ZjIgPSB0YWJsZVN0YXRlLnBhcnNlckJ1ZjI7CisgICAgICB2YXIgb2JqOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoISgiZmlyc3RFbnRyeU51bSIgaW4gdGFibGVTdGF0ZSkgfHwgISgiZW50cnlDb3VudCIgaW4gdGFibGVTdGF0ZSkpIHsKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmogPSBwYXJzZXIuZ2V0T2JqKCksICJ0cmFpbGVyIikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHRhYmxlU3RhdGUuZmlyc3RFbnRyeU51bSA9IG9iajsKKyAgICAgICAgICB0YWJsZVN0YXRlLmVudHJ5Q291bnQgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZmlyc3QgPSB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW07CisgICAgICAgIHZhciBjb3VudCA9IHRhYmxlU3RhdGUuZW50cnlDb3VudDsKKworICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNvdW50KSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiB3cm9uZyB0eXBlcyBpbiBzdWJzZWN0aW9uIGhlYWRlciIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh2YXIgaSA9IHRhYmxlU3RhdGUuZW50cnlOdW07IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgdGFibGVTdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOworICAgICAgICAgIHRhYmxlU3RhdGUuZW50cnlOdW0gPSBpOworICAgICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMSA9IHBhcnNlci5idWYxOworICAgICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyOworICAgICAgICAgIHZhciBlbnRyeSA9IHt9OworICAgICAgICAgIGVudHJ5Lm9mZnNldCA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgICAgICBlbnRyeS5nZW4gPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgICAgICAgdmFyIHR5cGUgPSBwYXJzZXIuZ2V0T2JqKCk7CisKKyAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkNtZCkgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlLmNtZCkgeworICAgICAgICAgICAgICBjYXNlICJmIjoKKyAgICAgICAgICAgICAgICBlbnRyeS5mcmVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICJuIjoKKyAgICAgICAgICAgICAgICBlbnRyeS51bmNvbXByZXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihlbnRyeS5vZmZzZXQpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGVudHJ5LmdlbikgfHwgIShlbnRyeS5mcmVlIHx8IGVudHJ5LnVuY29tcHJlc3NlZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBlbnRyeSBpbiBYUmVmIHN1YnNlY3Rpb246ICR7Zmlyc3R9LCAke2NvdW50fWApOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpID09PSAwICYmIGVudHJ5LmZyZWUgJiYgZmlyc3QgPT09IDEpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tpICsgZmlyc3RdKSB7CisgICAgICAgICAgICB0aGlzLmVudHJpZXNbaSArIGZpcnN0XSA9IGVudHJ5OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRhYmxlU3RhdGUuZW50cnlOdW0gPSAwOworICAgICAgICB0YWJsZVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CisgICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMSA9IHBhcnNlci5idWYxOworICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjIgPSBwYXJzZXIuYnVmMjsKKyAgICAgICAgZGVsZXRlIHRhYmxlU3RhdGUuZmlyc3RFbnRyeU51bTsKKyAgICAgICAgZGVsZXRlIHRhYmxlU3RhdGUuZW50cnlDb3VudDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuZW50cmllc1swXSAmJiAhdGhpcy5lbnRyaWVzWzBdLmZyZWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0Iik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvYmo7CisgICAgfSwKKyAgICBwcm9jZXNzWFJlZlN0cmVhbTogZnVuY3Rpb24gWFJlZl9wcm9jZXNzWFJlZlN0cmVhbShzdHJlYW0pIHsKKyAgICAgIGlmICghKCJzdHJlYW1TdGF0ZSIgaW4gdGhpcykpIHsKKyAgICAgICAgdmFyIHN0cmVhbVBhcmFtZXRlcnMgPSBzdHJlYW0uZGljdDsKKyAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSBzdHJlYW1QYXJhbWV0ZXJzLmdldCgiVyIpOworICAgICAgICB2YXIgcmFuZ2UgPSBzdHJlYW1QYXJhbWV0ZXJzLmdldCgiSW5kZXgiKTsKKworICAgICAgICBpZiAoIXJhbmdlKSB7CisgICAgICAgICAgcmFuZ2UgPSBbMCwgc3RyZWFtUGFyYW1ldGVycy5nZXQoIlNpemUiKV07CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN0cmVhbVN0YXRlID0geworICAgICAgICAgIGVudHJ5UmFuZ2VzOiByYW5nZSwKKyAgICAgICAgICBieXRlV2lkdGhzLAorICAgICAgICAgIGVudHJ5TnVtOiAwLAorICAgICAgICAgIHN0cmVhbVBvczogc3RyZWFtLnBvcworICAgICAgICB9OworICAgICAgfQorCisgICAgICB0aGlzLnJlYWRYUmVmU3RyZWFtKHN0cmVhbSk7CisgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TdGF0ZTsKKyAgICAgIHJldHVybiBzdHJlYW0uZGljdDsKKyAgICB9LAorICAgIHJlYWRYUmVmU3RyZWFtOiBmdW5jdGlvbiBYUmVmX3JlYWRYUmVmU3RyZWFtKHN0cmVhbSkgeworICAgICAgdmFyIGksIGo7CisgICAgICB2YXIgc3RyZWFtU3RhdGUgPSB0aGlzLnN0cmVhbVN0YXRlOworICAgICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXRlLnN0cmVhbVBvczsKKyAgICAgIHZhciBieXRlV2lkdGhzID0gc3RyZWFtU3RhdGUuYnl0ZVdpZHRoczsKKyAgICAgIHZhciB0eXBlRmllbGRXaWR0aCA9IGJ5dGVXaWR0aHNbMF07CisgICAgICB2YXIgb2Zmc2V0RmllbGRXaWR0aCA9IGJ5dGVXaWR0aHNbMV07CisgICAgICB2YXIgZ2VuZXJhdGlvbkZpZWxkV2lkdGggPSBieXRlV2lkdGhzWzJdOworICAgICAgdmFyIGVudHJ5UmFuZ2VzID0gc3RyZWFtU3RhdGUuZW50cnlSYW5nZXM7CisKKyAgICAgIHdoaWxlIChlbnRyeVJhbmdlcy5sZW5ndGggPiAwKSB7CisgICAgICAgIHZhciBmaXJzdCA9IGVudHJ5UmFuZ2VzWzBdOworICAgICAgICB2YXIgbiA9IGVudHJ5UmFuZ2VzWzFdOworCisgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIobikpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiByYW5nZSBmaWVsZHM6ICR7Zmlyc3R9LCAke259YCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodHlwZUZpZWxkV2lkdGgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG9mZnNldEZpZWxkV2lkdGgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGdlbmVyYXRpb25GaWVsZFdpZHRoKSkgeworICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIGVudHJ5IGZpZWxkcyBsZW5ndGg6ICR7Zmlyc3R9LCAke259YCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSBzdHJlYW1TdGF0ZS5lbnRyeU51bTsgaSA8IG47ICsraSkgeworICAgICAgICAgIHN0cmVhbVN0YXRlLmVudHJ5TnVtID0gaTsKKyAgICAgICAgICBzdHJlYW1TdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOworICAgICAgICAgIHZhciB0eXBlID0gMCwKKyAgICAgICAgICAgICAgb2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgZ2VuZXJhdGlvbiA9IDA7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdHlwZUZpZWxkV2lkdGg7ICsraikgeworICAgICAgICAgICAgdHlwZSA9IHR5cGUgPDwgOCB8IHN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHR5cGVGaWVsZFdpZHRoID09PSAwKSB7CisgICAgICAgICAgICB0eXBlID0gMTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2Zmc2V0RmllbGRXaWR0aDsgKytqKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPDwgOCB8IHN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlbmVyYXRpb25GaWVsZFdpZHRoOyArK2opIHsKKyAgICAgICAgICAgIGdlbmVyYXRpb24gPSBnZW5lcmF0aW9uIDw8IDggfCBzdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBlbnRyeSA9IHt9OworICAgICAgICAgIGVudHJ5Lm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICBlbnRyeS5nZW4gPSBnZW5lcmF0aW9uOworCisgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIGVudHJ5LmZyZWUgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICBlbnRyeS51bmNvbXByZXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIFhSZWYgZW50cnkgdHlwZTogJHt0eXBlfWApOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghdGhpcy5lbnRyaWVzW2ZpcnN0ICsgaV0pIHsKKyAgICAgICAgICAgIHRoaXMuZW50cmllc1tmaXJzdCArIGldID0gZW50cnk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RyZWFtU3RhdGUuZW50cnlOdW0gPSAwOworICAgICAgICBzdHJlYW1TdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOworICAgICAgICBlbnRyeVJhbmdlcy5zcGxpY2UoMCwgMik7CisgICAgICB9CisgICAgfSwKKyAgICBpbmRleE9iamVjdHM6IGZ1bmN0aW9uIFhSZWZfaW5kZXhPYmplY3RzKCkgeworICAgICAgdmFyIFRBQiA9IDB4OSwKKyAgICAgICAgICBMRiA9IDB4YSwKKyAgICAgICAgICBDUiA9IDB4ZCwKKyAgICAgICAgICBTUEFDRSA9IDB4MjA7CisgICAgICB2YXIgUEVSQ0VOVCA9IDB4MjUsCisgICAgICAgICAgTFQgPSAweDNjOworCisgICAgICBmdW5jdGlvbiByZWFkVG9rZW4oZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgIHZhciB0b2tlbiA9ICIiLAorICAgICAgICAgICAgY2ggPSBkYXRhW29mZnNldF07CisKKyAgICAgICAgd2hpbGUgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgY2ggIT09IExUKSB7CisgICAgICAgICAgaWYgKCsrb2Zmc2V0ID49IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0b2tlbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKyAgICAgICAgICBjaCA9IGRhdGFbb2Zmc2V0XTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc2tpcFVudGlsKGRhdGEsIG9mZnNldCwgd2hhdCkgeworICAgICAgICB2YXIgbGVuZ3RoID0gd2hhdC5sZW5ndGgsCisgICAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgICAgIHZhciBza2lwcGVkID0gMDsKKworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YUxlbmd0aCkgeworICAgICAgICAgIHZhciBpID0gMDsKKworICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGRhdGFbb2Zmc2V0ICsgaV0gPT09IHdoYXRbaV0pIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgIHNraXBwZWQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBza2lwcGVkOworICAgICAgfQorCisgICAgICB2YXIgb2JqUmVnRXhwID0gL14oXGQrKVxzKyhcZCspXHMrb2JqXGIvOworICAgICAgY29uc3QgZW5kb2JqUmVnRXhwID0gL1xiZW5kb2JqW1xiXHNdJC87CisgICAgICBjb25zdCBuZXN0ZWRPYmpSZWdFeHAgPSAvXHMrKFxkK1xzK1xkK1xzK29ialtcYlxzPF0pJC87CisgICAgICBjb25zdCBDSEVDS19DT05URU5UX0xFTkdUSCA9IDI1OworICAgICAgdmFyIHRyYWlsZXJCeXRlcyA9IG5ldyBVaW50OEFycmF5KFsxMTYsIDExNCwgOTcsIDEwNSwgMTA4LCAxMDEsIDExNF0pOworICAgICAgdmFyIHN0YXJ0eHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExNSwgMTE2LCA5NywgMTE0LCAxMTYsIDEyMCwgMTE0LCAxMDEsIDEwMl0pOworICAgICAgY29uc3Qgb2JqQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTExLCA5OCwgMTA2XSk7CisgICAgICB2YXIgeHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzQ3LCA4OCwgODIsIDEwMSwgMTAyXSk7CisgICAgICB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDsKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKKyAgICAgIHN0cmVhbS5wb3MgPSAwOworICAgICAgdmFyIGJ1ZmZlciA9IHN0cmVhbS5nZXRCeXRlcygpOworICAgICAgdmFyIHBvc2l0aW9uID0gc3RyZWFtLnN0YXJ0LAorICAgICAgICAgIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7CisgICAgICB2YXIgdHJhaWxlcnMgPSBbXSwKKyAgICAgICAgICB4cmVmU3RtcyA9IFtdOworCisgICAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGNoID0gYnVmZmVyW3Bvc2l0aW9uXTsKKworICAgICAgICBpZiAoY2ggPT09IFRBQiB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSIHx8IGNoID09PSBTUEFDRSkgeworICAgICAgICAgICsrcG9zaXRpb247CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2ggPT09IFBFUkNFTlQpIHsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICArK3Bvc2l0aW9uOworCisgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaCA9IGJ1ZmZlcltwb3NpdGlvbl07CisgICAgICAgICAgfSB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUik7CisKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0b2tlbiA9IHJlYWRUb2tlbihidWZmZXIsIHBvc2l0aW9uKTsKKyAgICAgICAgdmFyIG07CisKKyAgICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoInhyZWYiKSAmJiAodG9rZW4ubGVuZ3RoID09PSA0IHx8IC9ccy8udGVzdCh0b2tlbls0XSkpKSB7CisgICAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHRyYWlsZXJCeXRlcyk7CisgICAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7CisgICAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHN0YXJ0eHJlZkJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChtID0gb2JqUmVnRXhwLmV4ZWModG9rZW4pKSB7CisgICAgICAgICAgY29uc3QgbnVtID0gbVsxXSB8IDAsCisgICAgICAgICAgICAgICAgZ2VuID0gbVsyXSB8IDA7CisKKyAgICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tudW1dIHx8IHRoaXMuZW50cmllc1tudW1dLmdlbiA9PT0gZ2VuKSB7CisgICAgICAgICAgICB0aGlzLmVudHJpZXNbbnVtXSA9IHsKKyAgICAgICAgICAgICAgb2Zmc2V0OiBwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCwKKyAgICAgICAgICAgICAgZ2VuLAorICAgICAgICAgICAgICB1bmNvbXByZXNzZWQ6IHRydWUKKyAgICAgICAgICAgIH07CisgICAgICAgICAgfQorCisgICAgICAgICAgbGV0IGNvbnRlbnRMZW5ndGgsCisgICAgICAgICAgICAgIHN0YXJ0UG9zID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGg7CisKKyAgICAgICAgICB3aGlsZSAoc3RhcnRQb3MgPCBidWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICBjb25zdCBlbmRQb3MgPSBzdGFydFBvcyArIHNraXBVbnRpbChidWZmZXIsIHN0YXJ0UG9zLCBvYmpCeXRlcykgKyA0OworICAgICAgICAgICAgY29udGVudExlbmd0aCA9IGVuZFBvcyAtIHBvc2l0aW9uOworICAgICAgICAgICAgY29uc3QgY2hlY2tQb3MgPSBNYXRoLm1heChlbmRQb3MgLSBDSEVDS19DT05URU5UX0xFTkdUSCwgc3RhcnRQb3MpOworICAgICAgICAgICAgY29uc3QgdG9rZW5TdHIgPSAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoYnVmZmVyLnN1YmFycmF5KGNoZWNrUG9zLCBlbmRQb3MpKTsKKworICAgICAgICAgICAgaWYgKGVuZG9ialJlZ0V4cC50ZXN0KHRva2VuU3RyKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNvbnN0IG9ialRva2VuID0gbmVzdGVkT2JqUmVnRXhwLmV4ZWModG9rZW5TdHIpOworCisgICAgICAgICAgICAgIGlmIChvYmpUb2tlbiAmJiBvYmpUb2tlblsxXSkgeworICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgnaW5kZXhPYmplY3RzOiBGb3VuZCBuZXcgIm9iaiIgaW5zaWRlIG9mIGFub3RoZXIgIm9iaiIsICcgKyAnY2F1c2VkIGJ5IG1pc3NpbmcgImVuZG9iaiIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7CisgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCAtPSBvYmpUb2tlblsxXS5sZW5ndGg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhcnRQb3MgPSBlbmRQb3M7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgY29udGVudCA9IGJ1ZmZlci5zdWJhcnJheShwb3NpdGlvbiwgcG9zaXRpb24gKyBjb250ZW50TGVuZ3RoKTsKKyAgICAgICAgICB2YXIgeHJlZlRhZ09mZnNldCA9IHNraXBVbnRpbChjb250ZW50LCAwLCB4cmVmQnl0ZXMpOworCisgICAgICAgICAgaWYgKHhyZWZUYWdPZmZzZXQgPCBjb250ZW50TGVuZ3RoICYmIGNvbnRlbnRbeHJlZlRhZ09mZnNldCArIDVdIDwgNjQpIHsKKyAgICAgICAgICAgIHhyZWZTdG1zLnB1c2gocG9zaXRpb24gLSBzdHJlYW0uc3RhcnQpOworICAgICAgICAgICAgdGhpcy54cmVmc3Rtc1twb3NpdGlvbiAtIHN0cmVhbS5zdGFydF0gPSAxOworICAgICAgICAgIH0KKworICAgICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CisgICAgICAgIH0gZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgidHJhaWxlciIpICYmICh0b2tlbi5sZW5ndGggPT09IDcgfHwgL1xzLy50ZXN0KHRva2VuWzddKSkpIHsKKyAgICAgICAgICB0cmFpbGVycy5wdXNoKHBvc2l0aW9uKTsKKyAgICAgICAgICBwb3NpdGlvbiArPSBza2lwVW50aWwoYnVmZmVyLCBwb3NpdGlvbiwgc3RhcnR4cmVmQnl0ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBvc2l0aW9uICs9IHRva2VuLmxlbmd0aCArIDE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIGksIGlpOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHhyZWZTdG1zLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKHhyZWZTdG1zW2ldKTsKKyAgICAgICAgdGhpcy5yZWFkWFJlZih0cnVlKTsKKyAgICAgIH0KKworICAgICAgbGV0IHRyYWlsZXJEaWN0OworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IHRyYWlsZXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgc3RyZWFtLnBvcyA9IHRyYWlsZXJzW2ldOworICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoeworICAgICAgICAgIGxleGVyOiBuZXcgX3BhcnNlci5MZXhlcihzdHJlYW0pLAorICAgICAgICAgIHhyZWY6IHRoaXMsCisgICAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlLAorICAgICAgICAgIHJlY292ZXJ5TW9kZTogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgICAgdmFyIG9iaiA9IHBhcnNlci5nZXRPYmooKTsKKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAidHJhaWxlciIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBkaWN0ID0gcGFyc2VyLmdldE9iaigpOworCisgICAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGljdCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCByb290RGljdDsKKworICAgICAgICB0cnkgeworICAgICAgICAgIHJvb3REaWN0ID0gZGljdC5nZXQoIlJvb3QiKTsKKyAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHJvb3REaWN0KSB8fCAhcm9vdERpY3QuaGFzKCJQYWdlcyIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGljdC5oYXMoIklEIikpIHsKKyAgICAgICAgICByZXR1cm4gZGljdDsKKyAgICAgICAgfQorCisgICAgICAgIHRyYWlsZXJEaWN0ID0gZGljdDsKKyAgICAgIH0KKworICAgICAgaWYgKHRyYWlsZXJEaWN0KSB7CisgICAgICAgIHJldHVybiB0cmFpbGVyRGljdDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IF91dGlsLkludmFsaWRQREZFeGNlcHRpb24oIkludmFsaWQgUERGIHN0cnVjdHVyZS4iKTsKKyAgICB9LAorICAgIHJlYWRYUmVmOiBmdW5jdGlvbiBYUmVmX3JlYWRYUmVmKHJlY292ZXJ5TW9kZSkgeworICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtOworICAgICAgY29uc3Qgc3RhcnRYUmVmUGFyc2VkQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAodGhpcy5zdGFydFhSZWZRdWV1ZS5sZW5ndGgpIHsKKyAgICAgICAgICB2YXIgc3RhcnRYUmVmID0gdGhpcy5zdGFydFhSZWZRdWV1ZVswXTsKKworICAgICAgICAgIGlmIChzdGFydFhSZWZQYXJzZWRDYWNoZVtzdGFydFhSZWZdKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoInJlYWRYUmVmIC0gc2tpcHBpbmcgWFJlZiB0YWJsZSBzaW5jZSBpdCB3YXMgYWxyZWFkeSBwYXJzZWQuIik7CisgICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdGFydFhSZWZQYXJzZWRDYWNoZVtzdGFydFhSZWZdID0gdHJ1ZTsKKyAgICAgICAgICBzdHJlYW0ucG9zID0gc3RhcnRYUmVmICsgc3RyZWFtLnN0YXJ0OworICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfcGFyc2VyLlBhcnNlcih7CisgICAgICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHhyZWY6IHRoaXMsCisgICAgICAgICAgICBhbGxvd1N0cmVhbXM6IHRydWUKKyAgICAgICAgICB9KTsKKyAgICAgICAgICB2YXIgb2JqID0gcGFyc2VyLmdldE9iaigpOworICAgICAgICAgIHZhciBkaWN0OworCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqLCAieHJlZiIpKSB7CisgICAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlRhYmxlKHBhcnNlcik7CisKKyAgICAgICAgICAgIGlmICghdGhpcy50b3BEaWN0KSB7CisgICAgICAgICAgICAgIHRoaXMudG9wRGljdCA9IGRpY3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9iaiA9IGRpY3QuZ2V0KCJYUmVmU3RtIik7CisKKyAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKKyAgICAgICAgICAgICAgdmFyIHBvcyA9IG9iajsKKworICAgICAgICAgICAgICBpZiAoIShwb3MgaW4gdGhpcy54cmVmc3RtcykpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnhyZWZzdG1zW3Bvc10gPSAxOworICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChwb3MpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKKyAgICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZXIuZ2V0T2JqKCkpIHx8ICEoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKHBhcnNlci5nZXRPYmooKSwgIm9iaiIpIHx8ICEoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKG9iaiA9IHBhcnNlci5nZXRPYmooKSkpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgc3RyZWFtIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRpY3QgPSB0aGlzLnByb2Nlc3NYUmVmU3RyZWFtKG9iaik7CisKKyAgICAgICAgICAgIGlmICghdGhpcy50b3BEaWN0KSB7CisgICAgICAgICAgICAgIHRoaXMudG9wRGljdCA9IGRpY3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGljdCkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkZhaWxlZCB0byByZWFkIFhSZWYgc3RyZWFtIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSBoZWFkZXIiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBvYmogPSBkaWN0LmdldCgiUHJldiIpOworCisgICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSkgeworICAgICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKG9iaik7CisgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKG9iaikpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChvYmoubnVtKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy50b3BEaWN0OworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiKHdoaWxlIHJlYWRpbmcgWFJlZik6ICIgKyBlKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlY292ZXJ5TW9kZSkgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZlBhcnNlRXhjZXB0aW9uKCk7CisgICAgfSwKKyAgICBnZXRFbnRyeTogZnVuY3Rpb24gWFJlZl9nZXRFbnRyeShpKSB7CisgICAgICB2YXIgeHJlZkVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldOworCisgICAgICBpZiAoeHJlZkVudHJ5ICYmICF4cmVmRW50cnkuZnJlZSAmJiB4cmVmRW50cnkub2Zmc2V0KSB7CisgICAgICAgIHJldHVybiB4cmVmRW50cnk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisgICAgZmV0Y2hJZlJlZjogZnVuY3Rpb24gWFJlZl9mZXRjaElmUmVmKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKSB7CisgICAgICBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZldGNoKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG9iajsKKyAgICB9LAorICAgIGZldGNoOiBmdW5jdGlvbiBYUmVmX2ZldGNoKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKSB7CisgICAgICBpZiAoIShyZWYgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigicmVmIG9iamVjdCBpcyBub3QgYSByZWZlcmVuY2UiKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgbnVtID0gcmVmLm51bTsKKworICAgICAgY29uc3QgY2FjaGVFbnRyeSA9IHRoaXMuX2NhY2hlTWFwLmdldChudW0pOworCisgICAgICBpZiAoY2FjaGVFbnRyeSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGlmIChjYWNoZUVudHJ5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCAmJiAhY2FjaGVFbnRyeS5vYmpJZCkgeworICAgICAgICAgIGNhY2hlRW50cnkub2JqSWQgPSByZWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjYWNoZUVudHJ5OworICAgICAgfQorCisgICAgICBsZXQgeHJlZkVudHJ5ID0gdGhpcy5nZXRFbnRyeShudW0pOworCisgICAgICBpZiAoeHJlZkVudHJ5ID09PSBudWxsKSB7CisgICAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIHhyZWZFbnRyeSk7CisKKyAgICAgICAgcmV0dXJuIHhyZWZFbnRyeTsKKyAgICAgIH0KKworICAgICAgaWYgKHhyZWZFbnRyeS51bmNvbXByZXNzZWQpIHsKKyAgICAgICAgeHJlZkVudHJ5ID0gdGhpcy5mZXRjaFVuY29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHhyZWZFbnRyeSA9IHRoaXMuZmV0Y2hDb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pOworICAgICAgfQorCisgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoeHJlZkVudHJ5KSkgeworICAgICAgICB4cmVmRW50cnkub2JqSWQgPSByZWYudG9TdHJpbmcoKTsKKyAgICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh4cmVmRW50cnkpKSB7CisgICAgICAgIHhyZWZFbnRyeS5kaWN0Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB4cmVmRW50cnk7CisgICAgfSwKKworICAgIGZldGNoVW5jb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZSkgeworICAgICAgdmFyIGdlbiA9IHJlZi5nZW47CisgICAgICB2YXIgbnVtID0gcmVmLm51bTsKKworICAgICAgaWYgKHhyZWZFbnRyeS5nZW4gIT09IGdlbikgeworICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZkVudHJ5RXhjZXB0aW9uKGBJbmNvbnNpc3RlbnQgZ2VuZXJhdGlvbiBpbiBYUmVmOiAke3JlZn1gKTsKKyAgICAgIH0KKworICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0oeHJlZkVudHJ5Lm9mZnNldCArIHRoaXMuc3RyZWFtLnN0YXJ0KTsKKyAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfcGFyc2VyLlBhcnNlcih7CisgICAgICAgIGxleGVyOiBuZXcgX3BhcnNlci5MZXhlcihzdHJlYW0pLAorICAgICAgICB4cmVmOiB0aGlzLAorICAgICAgICBhbGxvd1N0cmVhbXM6IHRydWUKKyAgICAgIH0pOworICAgICAgdmFyIG9iajEgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgICB2YXIgb2JqMiA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgIHZhciBvYmozID0gcGFyc2VyLmdldE9iaigpOworCisgICAgICBpZiAob2JqMSAhPT0gbnVtIHx8IG9iajIgIT09IGdlbiB8fCAhKG9iajMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQpKSB7CisgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTsKKyAgICAgIH0KKworICAgICAgaWYgKG9iajMuY21kICE9PSAib2JqIikgeworICAgICAgICBpZiAob2JqMy5jbWQuc3RhcnRzV2l0aCgib2JqIikpIHsKKyAgICAgICAgICBudW0gPSBwYXJzZUludChvYmozLmNtZC5zdWJzdHJpbmcoMyksIDEwKTsKKworICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudW07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLlhSZWZFbnRyeUV4Y2VwdGlvbihgQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5lbmNyeXB0ICYmICFzdXBwcmVzc0VuY3J5cHRpb24pIHsKKyAgICAgICAgeHJlZkVudHJ5ID0gcGFyc2VyLmdldE9iaih0aGlzLmVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKG51bSwgZ2VuKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB4cmVmRW50cnkgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgICB9CisKKyAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKSh4cmVmRW50cnkpKSB7CisgICAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIHhyZWZFbnRyeSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB4cmVmRW50cnk7CisgICAgfSwKKworICAgIGZldGNoQ29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKKyAgICAgIGNvbnN0IHRhYmxlT2Zmc2V0ID0geHJlZkVudHJ5Lm9mZnNldDsKKyAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuZmV0Y2goX3ByaW1pdGl2ZXMuUmVmLmdldCh0YWJsZU9mZnNldCwgMCkpOworCisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkoc3RyZWFtKSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoImJhZCBPYmpTdG0gc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGZpcnN0ID0gc3RyZWFtLmRpY3QuZ2V0KCJGaXJzdCIpOworICAgICAgY29uc3QgbiA9IHN0cmVhbS5kaWN0LmdldCgiTiIpOworCisgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBmaXJzdCBhbmQgbiBwYXJhbWV0ZXJzIGZvciBPYmpTdG0gc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfcGFyc2VyLlBhcnNlcih7CisgICAgICAgIGxleGVyOiBuZXcgX3BhcnNlci5MZXhlcihzdHJlYW0pLAorICAgICAgICB4cmVmOiB0aGlzLAorICAgICAgICBhbGxvd1N0cmVhbXM6IHRydWUKKyAgICAgIH0pOworICAgICAgY29uc3QgbnVtcyA9IG5ldyBBcnJheShuKTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgY29uc3QgbnVtID0gcGFyc2VyLmdldE9iaigpOworCisgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihudW0pKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBpbnZhbGlkIG9iamVjdCBudW1iZXIgaW4gdGhlIE9ialN0bSBzdHJlYW06ICR7bnVtfWApOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpOworCisgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvZmZzZXQpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBpbnZhbGlkIG9iamVjdCBvZmZzZXQgaW4gdGhlIE9ialN0bSBzdHJlYW06ICR7b2Zmc2V0fWApOworICAgICAgICB9CisKKyAgICAgICAgbnVtc1tpXSA9IG51bTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBBcnJheShuKTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgY29uc3Qgb2JqID0gcGFyc2VyLmdldE9iaigpOworICAgICAgICBlbnRyaWVzW2ldID0gb2JqOworCisgICAgICAgIGlmIChwYXJzZXIuYnVmMSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkNtZCAmJiBwYXJzZXIuYnVmMS5jbWQgPT09ICJlbmRvYmoiKSB7CisgICAgICAgICAgcGFyc2VyLnNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShvYmopKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBudW0gPSBudW1zW2ldLAorICAgICAgICAgICAgICBlbnRyeSA9IHRoaXMuZW50cmllc1tudW1dOworCisgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5vZmZzZXQgPT09IHRhYmxlT2Zmc2V0ICYmIGVudHJ5LmdlbiA9PT0gaSkgeworICAgICAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIG9iaik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeHJlZkVudHJ5ID0gZW50cmllc1t4cmVmRW50cnkuZ2VuXTsKKworICAgICAgaWYgKHhyZWZFbnRyeSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24oYEJhZCAoY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogJHtyZWZ9YCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB4cmVmRW50cnk7CisgICAgfSwKKworICAgIGFzeW5jIGZldGNoSWZSZWZBc3luYyhvYmosIHN1cHByZXNzRW5jcnlwdGlvbikgeworICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgeworICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEFzeW5jKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG9iajsKKyAgICB9LAorCisgICAgYXN5bmMgZmV0Y2hBc3luYyhyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2gocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikpIHsKKyAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgICAgIGF3YWl0IHRoaXMucGRmTWFuYWdlci5yZXF1ZXN0UmFuZ2UoZXguYmVnaW4sIGV4LmVuZCk7CisgICAgICAgIHJldHVybiB0aGlzLmZldGNoQXN5bmMocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOworICAgICAgfQorICAgIH0sCisKKyAgICBnZXRDYXRhbG9nT2JqOiBmdW5jdGlvbiBYUmVmX2dldENhdGFsb2dPYmooKSB7CisgICAgICByZXR1cm4gdGhpcy5yb290OworICAgIH0KKyAgfTsKKyAgcmV0dXJuIFhSZWY7Cit9KCk7CisKK2V4cG9ydHMuWFJlZiA9IFhSZWY7CisKK2NsYXNzIE5hbWVPck51bWJlclRyZWUgeworICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmLCB0eXBlKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IE5hbWVPck51bWJlclRyZWUpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIE5hbWVPck51bWJlclRyZWUuIik7CisgICAgfQorCisgICAgdGhpcy5yb290ID0gcm9vdDsKKyAgICB0aGlzLnhyZWYgPSB4cmVmOworICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICB9CisKKyAgZ2V0QWxsKCkgeworICAgIGNvbnN0IGRpY3QgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgaWYgKCF0aGlzLnJvb3QpIHsKKyAgICAgIHJldHVybiBkaWN0OworICAgIH0KKworICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CisgICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOworICAgIHByb2Nlc3NlZC5wdXQodGhpcy5yb290KTsKKyAgICBjb25zdCBxdWV1ZSA9IFt0aGlzLnJvb3RdOworCisgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgIGNvbnN0IG9iaiA9IHhyZWYuZmV0Y2hJZlJlZihxdWV1ZS5zaGlmdCgpKTsKKworICAgICAgaWYgKCEoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShvYmopKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAob2JqLmhhcygiS2lkcyIpKSB7CisgICAgICAgIGNvbnN0IGtpZHMgPSBvYmouZ2V0KCJLaWRzIik7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0ga2lkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgY29uc3Qga2lkID0ga2lkc1tpXTsKKworICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGtpZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgRHVwbGljYXRlIGVudHJ5IGluICIke3RoaXMuX3R5cGV9IiB0cmVlLmApOworICAgICAgICAgIH0KKworICAgICAgICAgIHF1ZXVlLnB1c2goa2lkKTsKKyAgICAgICAgICBwcm9jZXNzZWQucHV0KGtpZCk7CisgICAgICAgIH0KKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZW50cmllcyA9IG9iai5nZXQodGhpcy5fdHlwZSk7CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJpZXMpKSB7CisgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGVudHJpZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgeworICAgICAgICAgIGRpY3RbeHJlZi5mZXRjaElmUmVmKGVudHJpZXNbaV0pXSA9IHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW2kgKyAxXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGljdDsKKyAgfQorCisgIGdldChrZXkpIHsKKyAgICBpZiAoIXRoaXMucm9vdCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKKyAgICBsZXQga2lkc09yRW50cmllcyA9IHhyZWYuZmV0Y2hJZlJlZih0aGlzLnJvb3QpOworICAgIGxldCBsb29wQ291bnQgPSAwOworICAgIGNvbnN0IE1BWF9MRVZFTFMgPSAxMDsKKworICAgIHdoaWxlIChraWRzT3JFbnRyaWVzLmhhcygiS2lkcyIpKSB7CisgICAgICBpZiAoKytsb29wQ291bnQgPiBNQVhfTEVWRUxTKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgU2VhcmNoIGRlcHRoIGxpbWl0IHJlYWNoZWQgZm9yICIke3RoaXMuX3R5cGV9IiB0cmVlLmApOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgY29uc3Qga2lkcyA9IGtpZHNPckVudHJpZXMuZ2V0KCJLaWRzIik7CisKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgbGV0IGwgPSAwLAorICAgICAgICAgIHIgPSBraWRzLmxlbmd0aCAtIDE7CisKKyAgICAgIHdoaWxlIChsIDw9IHIpIHsKKyAgICAgICAgY29uc3QgbSA9IGwgKyByID4+IDE7CisgICAgICAgIGNvbnN0IGtpZCA9IHhyZWYuZmV0Y2hJZlJlZihraWRzW21dKTsKKyAgICAgICAgY29uc3QgbGltaXRzID0ga2lkLmdldCgiTGltaXRzIik7CisKKyAgICAgICAgaWYgKGtleSA8IHhyZWYuZmV0Y2hJZlJlZihsaW1pdHNbMF0pKSB7CisgICAgICAgICAgciA9IG0gLSAxOworICAgICAgICB9IGVsc2UgaWYgKGtleSA+IHhyZWYuZmV0Y2hJZlJlZihsaW1pdHNbMV0pKSB7CisgICAgICAgICAgbCA9IG0gKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGtpZHNPckVudHJpZXMgPSB4cmVmLmZldGNoSWZSZWYoa2lkc1ttXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGwgPiByKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGVudHJpZXMgPSBraWRzT3JFbnRyaWVzLmdldCh0aGlzLl90eXBlKTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJpZXMpKSB7CisgICAgICBsZXQgbCA9IDAsCisgICAgICAgICAgciA9IGVudHJpZXMubGVuZ3RoIC0gMjsKKworICAgICAgd2hpbGUgKGwgPD0gcikgeworICAgICAgICBjb25zdCB0bXAgPSBsICsgciA+PiAxLAorICAgICAgICAgICAgICBtID0gdG1wICsgKHRtcCAmIDEpOworICAgICAgICBjb25zdCBjdXJyZW50S2V5ID0geHJlZi5mZXRjaElmUmVmKGVudHJpZXNbbV0pOworCisgICAgICAgIGlmIChrZXkgPCBjdXJyZW50S2V5KSB7CisgICAgICAgICAgciA9IG0gLSAyOworICAgICAgICB9IGVsc2UgaWYgKGtleSA+IGN1cnJlbnRLZXkpIHsKKyAgICAgICAgICBsID0gbSArIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW20gKyAxXSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLmluZm8pKGBGYWxsaW5nIGJhY2sgdG8gYW4gZXhoYXVzdGl2ZSBzZWFyY2gsIGZvciBrZXkgIiR7a2V5fSIsIGAgKyBgaW4gIiR7dGhpcy5fdHlwZX0iIHRyZWUuYCk7CisKKyAgICAgIGZvciAobGV0IG0gPSAwLCBtbSA9IGVudHJpZXMubGVuZ3RoOyBtIDwgbW07IG0gKz0gMikgeworICAgICAgICBjb25zdCBjdXJyZW50S2V5ID0geHJlZi5mZXRjaElmUmVmKGVudHJpZXNbbV0pOworCisgICAgICAgIGlmIChjdXJyZW50S2V5ID09PSBrZXkpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFRoZSAiJHtrZXl9IiBrZXkgd2FzIGZvdW5kIGF0IGFuIGluY29ycmVjdCwgYCArIGBpLmUuIG91dC1vZi1vcmRlciwgcG9zaXRpb24gaW4gIiR7dGhpcy5fdHlwZX0iIHRyZWUuYCk7CisgICAgICAgICAgcmV0dXJuIHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW20gKyAxXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCit9CisKK2NsYXNzIE5hbWVUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZSB7CisgIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYpIHsKKyAgICBzdXBlcihyb290LCB4cmVmLCAiTmFtZXMiKTsKKyAgfQorCit9CisKK2NsYXNzIE51bWJlclRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVlIHsKKyAgY29uc3RydWN0b3Iocm9vdCwgeHJlZikgeworICAgIHN1cGVyKHJvb3QsIHhyZWYsICJOdW1zIik7CisgIH0KKworfQorCit2YXIgRmlsZVNwZWMgPSBmdW5jdGlvbiBGaWxlU3BlY0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEZpbGVTcGVjKHJvb3QsIHhyZWYpIHsKKyAgICBpZiAoIXJvb3QgfHwgISgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKHJvb3QpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLnJvb3QgPSByb290OworCisgICAgaWYgKHJvb3QuaGFzKCJGUyIpKSB7CisgICAgICB0aGlzLmZzID0gcm9vdC5nZXQoIkZTIik7CisgICAgfQorCisgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHJvb3QuaGFzKCJEZXNjIikgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHJvb3QuZ2V0KCJEZXNjIikpIDogIiI7CisKKyAgICBpZiAocm9vdC5oYXMoIlJGIikpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiUmVsYXRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgdGhpcy5jb250ZW50QXZhaWxhYmxlID0gdHJ1ZTsKKworICAgIGlmICghcm9vdC5oYXMoIkVGIikpIHsKKyAgICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgKDAsIF91dGlsLndhcm4pKCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBpY2tQbGF0Zm9ybUl0ZW0oZGljdCkgeworICAgIGlmIChkaWN0LmhhcygiVUYiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJVRiIpOworICAgIH0gZWxzZSBpZiAoZGljdC5oYXMoIkYiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJGIik7CisgICAgfSBlbHNlIGlmIChkaWN0LmhhcygiVW5peCIpKSB7CisgICAgICByZXR1cm4gZGljdC5nZXQoIlVuaXgiKTsKKyAgICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJNYWMiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJNYWMiKTsKKyAgICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJET1MiKSkgeworICAgICAgcmV0dXJuIGRpY3QuZ2V0KCJET1MiKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEZpbGVTcGVjLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgZmlsZW5hbWUoKSB7CisgICAgICBpZiAoIXRoaXMuX2ZpbGVuYW1lICYmIHRoaXMucm9vdCkgeworICAgICAgICB2YXIgZmlsZW5hbWUgPSBwaWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdCkgfHwgInVubmFtZWQiOworICAgICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoZmlsZW5hbWUpLnJlcGxhY2UoL1xcXFwvZywgIlxcIikucmVwbGFjZSgvXFxcLy9nLCAiLyIpLnJlcGxhY2UoL1xcL2csICIvIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTsKKyAgICB9LAorCisgICAgZ2V0IGNvbnRlbnQoKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudEF2YWlsYWJsZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRSZWYgJiYgdGhpcy5yb290KSB7CisgICAgICAgIHRoaXMuY29udGVudFJlZiA9IHBpY2tQbGF0Zm9ybUl0ZW0odGhpcy5yb290LmdldCgiRUYiKSk7CisgICAgICB9CisKKyAgICAgIHZhciBjb250ZW50ID0gbnVsbDsKKworICAgICAgaWYgKHRoaXMuY29udGVudFJlZikgeworICAgICAgICB2YXIgeHJlZiA9IHRoaXMueHJlZjsKKyAgICAgICAgdmFyIGZpbGVPYmogPSB4cmVmLmZldGNoSWZSZWYodGhpcy5jb250ZW50UmVmKTsKKworICAgICAgICBpZiAoZmlsZU9iaiAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKGZpbGVPYmopKSB7CisgICAgICAgICAgY29udGVudCA9IGZpbGVPYmouZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkVtYmVkZGVkIGZpbGUgc3BlY2lmaWNhdGlvbiBwb2ludHMgdG8gbm9uLWV4aXN0aW5nL2ludmFsaWQgIiArICJjb250ZW50Iik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50Iik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjb250ZW50OworICAgIH0sCisKKyAgICBnZXQgc2VyaWFsaXphYmxlKCkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsCisgICAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudAorICAgICAgfTsKKyAgICB9CisKKyAgfTsKKyAgcmV0dXJuIEZpbGVTcGVjOworfSgpOworCitleHBvcnRzLkZpbGVTcGVjID0gRmlsZVNwZWM7CisKK2NvbnN0IE9iamVjdExvYWRlciA9IGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gbWF5SGF2ZUNoaWxkcmVuKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmIHx8IHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSB8fCAoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKHZhbHVlKTsKKyAgfQorCisgIGZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUsIG5vZGVzVG9WaXNpdCkgeworICAgIGlmIChub2RlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgeworICAgICAgbm9kZSA9IG5vZGUuZ2V0UmF3VmFsdWVzKCk7CisgICAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKG5vZGUpKSB7CisgICAgICBub2RlID0gbm9kZS5kaWN0LmdldFJhd1ZhbHVlcygpOworICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkobm9kZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IHJhd1ZhbHVlIG9mIG5vZGUpIHsKKyAgICAgIGlmIChtYXlIYXZlQ2hpbGRyZW4ocmF3VmFsdWUpKSB7CisgICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKHJhd1ZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBPYmplY3RMb2FkZXIoZGljdCwga2V5cywgeHJlZikgeworICAgIHRoaXMuZGljdCA9IGRpY3Q7CisgICAgdGhpcy5rZXlzID0ga2V5czsKKyAgICB0aGlzLnhyZWYgPSB4cmVmOworICAgIHRoaXMucmVmU2V0ID0gbnVsbDsKKyAgfQorCisgIE9iamVjdExvYWRlci5wcm90b3R5cGUgPSB7CisgICAgYXN5bmMgbG9hZCgpIHsKKyAgICAgIGlmICghdGhpcy54cmVmLnN0cmVhbS5hbGxDaHVua3NMb2FkZWQgfHwgdGhpcy54cmVmLnN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSkgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICBjb25zdCB7CisgICAgICAgIGtleXMsCisgICAgICAgIGRpY3QKKyAgICAgIH0gPSB0aGlzOworICAgICAgdGhpcy5yZWZTZXQgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CisgICAgICBjb25zdCBub2Rlc1RvVmlzaXQgPSBbXTsKKworICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0ga2V5cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gZGljdC5nZXRSYXcoa2V5c1tpXSk7CisKKyAgICAgICAgaWYgKHJhd1ZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChyYXdWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX3dhbGsobm9kZXNUb1Zpc2l0KTsKKyAgICB9LAorCisgICAgYXN5bmMgX3dhbGsobm9kZXNUb1Zpc2l0KSB7CisgICAgICBjb25zdCBub2Rlc1RvUmV2aXNpdCA9IFtdOworICAgICAgY29uc3QgcGVuZGluZ1JlcXVlc3RzID0gW107CisKKyAgICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CisgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9WaXNpdC5wb3AoKTsKKworICAgICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgICBpZiAodGhpcy5yZWZTZXQuaGFzKGN1cnJlbnROb2RlKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMucmVmU2V0LnB1dChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHRoaXMueHJlZi5mZXRjaChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub2Rlc1RvUmV2aXNpdC5wdXNoKGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKKyAgICAgICAgICAgICAgYmVnaW46IGV4LmJlZ2luLAorICAgICAgICAgICAgICBlbmQ6IGV4LmVuZAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlLmdldEJhc2VTdHJlYW1zKSB7CisgICAgICAgICAgY29uc3QgYmFzZVN0cmVhbXMgPSBjdXJyZW50Tm9kZS5nZXRCYXNlU3RyZWFtcygpOworICAgICAgICAgIGxldCBmb3VuZE1pc3NpbmdEYXRhID0gZmFsc2U7CisKKyAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBiYXNlU3RyZWFtcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBiYXNlU3RyZWFtc1tpXTsKKworICAgICAgICAgICAgaWYgKHN0cmVhbS5hbGxDaHVua3NMb2FkZWQgJiYgIXN0cmVhbS5hbGxDaHVua3NMb2FkZWQoKSkgeworICAgICAgICAgICAgICBmb3VuZE1pc3NpbmdEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RzLnB1c2goeworICAgICAgICAgICAgICAgIGJlZ2luOiBzdHJlYW0uc3RhcnQsCisgICAgICAgICAgICAgICAgZW5kOiBzdHJlYW0uZW5kCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChmb3VuZE1pc3NpbmdEYXRhKSB7CisgICAgICAgICAgICBub2Rlc1RvUmV2aXNpdC5wdXNoKGN1cnJlbnROb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhZGRDaGlsZHJlbihjdXJyZW50Tm9kZSwgbm9kZXNUb1Zpc2l0KTsKKyAgICAgIH0KKworICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0cy5sZW5ndGgpIHsKKyAgICAgICAgYXdhaXQgdGhpcy54cmVmLnN0cmVhbS5tYW5hZ2VyLnJlcXVlc3RSYW5nZXMocGVuZGluZ1JlcXVlc3RzKTsKKworICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBub2Rlc1RvUmV2aXNpdC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzVG9SZXZpc2l0W2ldOworCisgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKKyAgICAgICAgICAgIHRoaXMucmVmU2V0LnJlbW92ZShub2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5fd2Fsayhub2Rlc1RvUmV2aXNpdCk7CisgICAgICB9CisKKyAgICAgIHRoaXMucmVmU2V0ID0gbnVsbDsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgIH07CisgIHJldHVybiBPYmplY3RMb2FkZXI7Cit9KCk7CisKK2V4cG9ydHMuT2JqZWN0TG9hZGVyID0gT2JqZWN0TG9hZGVyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL29wZXJhdG9yX2xpc3QuanMgYi9saWIvY29yZS9vcGVyYXRvcl9saXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZGIzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9vcGVyYXRvcl9saXN0LmpzCkBAIC0wLDAgKzEsNjc5IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5PcGVyYXRvckxpc3QgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBRdWV1ZU9wdGltaXplciA9IGZ1bmN0aW9uIFF1ZXVlT3B0aW1pemVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gYWRkU3RhdGUocGFyZW50U3RhdGUsIHBhdHRlcm4sIGNoZWNrRm4sIGl0ZXJhdGVGbiwgcHJvY2Vzc0ZuKSB7CisgICAgdmFyIHN0YXRlID0gcGFyZW50U3RhdGU7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXR0ZXJuLmxlbmd0aCAtIDE7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgaXRlbSA9IHBhdHRlcm5baV07CisgICAgICBzdGF0ZSA9IHN0YXRlW2l0ZW1dIHx8IChzdGF0ZVtpdGVtXSA9IFtdKTsKKyAgICB9CisKKyAgICBzdGF0ZVtwYXR0ZXJuW3BhdHRlcm4ubGVuZ3RoIC0gMV1dID0geworICAgICAgY2hlY2tGbiwKKyAgICAgIGl0ZXJhdGVGbiwKKyAgICAgIHByb2Nlc3NGbgorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBoYW5kbGVQYWludFNvbGlkQ29sb3JJbWFnZU1hc2soaUZpcnN0U2F2ZSwgY291bnQsIGZuQXJyYXksIGFyZ3NBcnJheSkgeworICAgIHZhciBpRmlyc3RQSU1YTyA9IGlGaXJzdFNhdmUgKyAyOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICB2YXIgYXJnID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPICsgNCAqIGldOworICAgICAgdmFyIGltYWdlTWFzayA9IGFyZy5sZW5ndGggPT09IDEgJiYgYXJnWzBdOworCisgICAgICBpZiAoaW1hZ2VNYXNrICYmIGltYWdlTWFzay53aWR0aCA9PT0gMSAmJiBpbWFnZU1hc2suaGVpZ2h0ID09PSAxICYmICghaW1hZ2VNYXNrLmRhdGEubGVuZ3RoIHx8IGltYWdlTWFzay5kYXRhLmxlbmd0aCA9PT0gMSAmJiBpbWFnZU1hc2suZGF0YVswXSA9PT0gMCkpIHsKKyAgICAgICAgZm5BcnJheVtpRmlyc3RQSU1YTyArIDQgKiBpXSA9IF91dGlsLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2s7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQgLSBpOworICB9CisKKyAgdmFyIEluaXRpYWxTdGF0ZSA9IFtdOworICBhZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtfdXRpbC5PUFMuc2F2ZSwgX3V0aWwuT1BTLnRyYW5zZm9ybSwgX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0LCBfdXRpbC5PUFMucmVzdG9yZV0sIG51bGwsIGZ1bmN0aW9uIGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHsKKyAgICB2YXIgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheTsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOworICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKKworICAgIHN3aXRjaCAocG9zKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2F2ZTsKKworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnRyYW5zZm9ybTsKKworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OworCisgICAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMucmVzdG9yZTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOworICB9LCBmdW5jdGlvbiBmb3VuZElubGluZUltYWdlR3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAxMDsKKyAgICB2YXIgTUFYX0lNQUdFU19JTl9JTkxJTkVfSU1BR0VTX0JMT0NLID0gMjAwOworICAgIHZhciBNQVhfV0lEVEggPSAxMDAwOworICAgIHZhciBJTUFHRV9QQURESU5HID0gMTsKKyAgICB2YXIgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKKyAgICAgICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CisgICAgdmFyIGN1cnIgPSBjb250ZXh0LmlDdXJyOworICAgIHZhciBpRmlyc3RTYXZlID0gY3VyciAtIDM7CisgICAgdmFyIGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOworICAgIHZhciBpRmlyc3RQSUlYTyA9IGN1cnIgLSAxOworICAgIHZhciBjb3VudCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgLSBpRmlyc3RTYXZlKSAvIDQpLCBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0spOworCisgICAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9JTkxJTkVfSU1BR0VTX0JMT0NLKSB7CisgICAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0U2F2ZSkgJSA0OworICAgIH0KKworICAgIHZhciBtYXhYID0gMDsKKyAgICB2YXIgbWFwID0gW10sCisgICAgICAgIG1heExpbmVIZWlnaHQgPSAwOworICAgIHZhciBjdXJyZW50WCA9IElNQUdFX1BBRERJTkcsCisgICAgICAgIGN1cnJlbnRZID0gSU1BR0VfUEFERElORzsKKyAgICB2YXIgcTsKKworICAgIGZvciAocSA9IDA7IHEgPCBjb3VudDsgcSsrKSB7CisgICAgICB2YXIgdHJhbnNmb3JtID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybSArIChxIDw8IDIpXTsKKyAgICAgIHZhciBpbWcgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF07CisKKyAgICAgIGlmIChjdXJyZW50WCArIGltZy53aWR0aCA+IE1BWF9XSURUSCkgeworICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpOworICAgICAgICBjdXJyZW50WSArPSBtYXhMaW5lSGVpZ2h0ICsgMiAqIElNQUdFX1BBRERJTkc7CisgICAgICAgIGN1cnJlbnRYID0gMDsKKyAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7CisgICAgICB9CisKKyAgICAgIG1hcC5wdXNoKHsKKyAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICB4OiBjdXJyZW50WCwKKyAgICAgICAgeTogY3VycmVudFksCisgICAgICAgIHc6IGltZy53aWR0aCwKKyAgICAgICAgaDogaW1nLmhlaWdodAorICAgICAgfSk7CisgICAgICBjdXJyZW50WCArPSBpbWcud2lkdGggKyAyICogSU1BR0VfUEFERElORzsKKyAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBpbWcuaGVpZ2h0KTsKKyAgICB9CisKKyAgICB2YXIgaW1nV2lkdGggPSBNYXRoLm1heChtYXhYLCBjdXJyZW50WCkgKyBJTUFHRV9QQURESU5HOworICAgIHZhciBpbWdIZWlnaHQgPSBjdXJyZW50WSArIG1heExpbmVIZWlnaHQgKyBJTUFHRV9QQURESU5HOworICAgIHZhciBpbWdEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGltZ1dpZHRoICogaW1nSGVpZ2h0ICogNCk7CisgICAgdmFyIGltZ1Jvd1NpemUgPSBpbWdXaWR0aCA8PCAyOworCisgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKKyAgICAgIHZhciBkYXRhID0gYXJnc0FycmF5W2lGaXJzdFBJSVhPICsgKHEgPDwgMildWzBdLmRhdGE7CisgICAgICB2YXIgcm93U2l6ZSA9IG1hcFtxXS53IDw8IDI7CisgICAgICB2YXIgZGF0YU9mZnNldCA9IDA7CisgICAgICB2YXIgb2Zmc2V0ID0gbWFwW3FdLnggKyBtYXBbcV0ueSAqIGltZ1dpZHRoIDw8IDI7CisgICAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KDAsIHJvd1NpemUpLCBvZmZzZXQgLSBpbWdSb3dTaXplKTsKKworICAgICAgZm9yICh2YXIgayA9IDAsIGtrID0gbWFwW3FdLmg7IGsgPCBrazsgaysrKSB7CisgICAgICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoZGF0YU9mZnNldCwgZGF0YU9mZnNldCArIHJvd1NpemUpLCBvZmZzZXQpOworICAgICAgICBkYXRhT2Zmc2V0ICs9IHJvd1NpemU7CisgICAgICAgIG9mZnNldCArPSBpbWdSb3dTaXplOworICAgICAgfQorCisgICAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KGRhdGFPZmZzZXQgLSByb3dTaXplLCBkYXRhT2Zmc2V0KSwgb2Zmc2V0KTsKKworICAgICAgd2hpbGUgKG9mZnNldCA+PSAwKSB7CisgICAgICAgIGRhdGFbb2Zmc2V0IC0gNF0gPSBkYXRhW29mZnNldF07CisgICAgICAgIGRhdGFbb2Zmc2V0IC0gM10gPSBkYXRhW29mZnNldCArIDFdOworICAgICAgICBkYXRhW29mZnNldCAtIDJdID0gZGF0YVtvZmZzZXQgKyAyXTsKKyAgICAgICAgZGF0YVtvZmZzZXQgLSAxXSA9IGRhdGFbb2Zmc2V0ICsgM107CisgICAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZV0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSA0XTsKKyAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMV0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAzXTsKKyAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMl0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAyXTsKKyAgICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgM10gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAxXTsKKyAgICAgICAgb2Zmc2V0IC09IGltZ1Jvd1NpemU7CisgICAgICB9CisgICAgfQorCisgICAgZm5BcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cCk7CisgICAgYXJnc0FycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIFt7CisgICAgICB3aWR0aDogaW1nV2lkdGgsCisgICAgICBoZWlnaHQ6IGltZ0hlaWdodCwKKyAgICAgIGtpbmQ6IF91dGlsLkltYWdlS2luZC5SR0JBXzMyQlBQLAorICAgICAgZGF0YTogaW1nRGF0YQorICAgIH0sIG1hcF0pOworICAgIHJldHVybiBpRmlyc3RTYXZlICsgMTsKKyAgfSk7CisgIGFkZFN0YXRlKEluaXRpYWxTdGF0ZSwgW191dGlsLk9QUy5zYXZlLCBfdXRpbC5PUFMudHJhbnNmb3JtLCBfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBfdXRpbC5PUFMucmVzdG9yZV0sIG51bGwsIGZ1bmN0aW9uIGl0ZXJhdGVJbWFnZU1hc2tHcm91cChjb250ZXh0LCBpKSB7CisgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXk7CisgICAgdmFyIGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gMzsKKyAgICB2YXIgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CisKKyAgICBzd2l0Y2ggKHBvcykgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnNhdmU7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy50cmFuc2Zvcm07CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5yZXN0b3JlOworICAgIH0KKworICAgIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZUltYWdlTWFza0dyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOworICB9LCBmdW5jdGlvbiBmb3VuZEltYWdlTWFza0dyb3VwKGNvbnRleHQsIGkpIHsKKyAgICB2YXIgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwOworICAgIHZhciBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTAwOworICAgIHZhciBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDAwOworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgY3VyciA9IGNvbnRleHQuaUN1cnI7CisgICAgdmFyIGlGaXJzdFNhdmUgPSBjdXJyIC0gMzsKKyAgICB2YXIgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CisgICAgdmFyIGlGaXJzdFBJTVhPID0gY3VyciAtIDE7CisgICAgdmFyIGNvdW50ID0gTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCk7CisgICAgY291bnQgPSBoYW5kbGVQYWludFNvbGlkQ29sb3JJbWFnZU1hc2soaUZpcnN0U2F2ZSwgY291bnQsIGZuQXJyYXksIGFyZ3NBcnJheSk7CisKKyAgICBpZiAoY291bnQgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7CisgICAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0U2F2ZSkgJSA0OworICAgIH0KKworICAgIHZhciBxOworICAgIHZhciBpc1NhbWVJbWFnZSA9IGZhbHNlOworICAgIHZhciBpVHJhbnNmb3JtLCB0cmFuc2Zvcm1BcmdzOworICAgIHZhciBmaXJzdFBJTVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSU1YT11bMF07CisgICAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF0sCisgICAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmcxID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMV0sCisgICAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmcyID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMl0sCisgICAgICAgICAgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CisKKyAgICBpZiAoZmlyc3RUcmFuc2Zvcm1BcmcxID09PSBmaXJzdFRyYW5zZm9ybUFyZzIpIHsKKyAgICAgIGlzU2FtZUltYWdlID0gdHJ1ZTsKKyAgICAgIGlUcmFuc2Zvcm0gPSBpRmlyc3RUcmFuc2Zvcm0gKyA0OworICAgICAgdmFyIGlQSU1YTyA9IGlGaXJzdFBJTVhPICsgNDsKKworICAgICAgZm9yIChxID0gMTsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCwgaVBJTVhPICs9IDQpIHsKKyAgICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKKworICAgICAgICBpZiAoYXJnc0FycmF5W2lQSU1YT11bMF0gIT09IGZpcnN0UElNWE9BcmcwIHx8IHRyYW5zZm9ybUFyZ3NbMF0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMCB8fCB0cmFuc2Zvcm1BcmdzWzFdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzEgfHwgdHJhbnNmb3JtQXJnc1syXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcyIHx8IHRyYW5zZm9ybUFyZ3NbM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnMykgeworICAgICAgICAgIGlmIChxIDwgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSykgeworICAgICAgICAgICAgaXNTYW1lSW1hZ2UgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY291bnQgPSBxOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzU2FtZUltYWdlKSB7CisgICAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOworICAgICAgdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTsKKyAgICAgIGlUcmFuc2Zvcm0gPSBpRmlyc3RUcmFuc2Zvcm07CisKKyAgICAgIGZvciAocSA9IDA7IHEgPCBjb3VudDsgcSsrLCBpVHJhbnNmb3JtICs9IDQpIHsKKyAgICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKKyAgICAgICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdOworICAgICAgICBwb3NpdGlvbnNbKHEgPDwgMSkgKyAxXSA9IHRyYW5zZm9ybUFyZ3NbNV07CisgICAgICB9CisKKyAgICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCk7CisgICAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ZpcnN0UElNWE9BcmcwLCBmaXJzdFRyYW5zZm9ybUFyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMSwgZmlyc3RUcmFuc2Zvcm1BcmcyLCBmaXJzdFRyYW5zZm9ybUFyZzMsIHBvc2l0aW9uc10pOworICAgIH0gZWxzZSB7CisgICAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTsKKyAgICAgIHZhciBpbWFnZXMgPSBbXTsKKworICAgICAgZm9yIChxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKKyAgICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm0gKyAocSA8PCAyKV07CisgICAgICAgIHZhciBtYXNrUGFyYW1zID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPICsgKHEgPDwgMildWzBdOworICAgICAgICBpbWFnZXMucHVzaCh7CisgICAgICAgICAgZGF0YTogbWFza1BhcmFtcy5kYXRhLAorICAgICAgICAgIHdpZHRoOiBtYXNrUGFyYW1zLndpZHRoLAorICAgICAgICAgIGhlaWdodDogbWFza1BhcmFtcy5oZWlnaHQsCisgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1BcmdzCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3RHcm91cCk7CisgICAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ltYWdlc10pOworICAgIH0KKworICAgIHJldHVybiBpRmlyc3RTYXZlICsgMTsKKyAgfSk7CisgIGFkZFN0YXRlKEluaXRpYWxTdGF0ZSwgW191dGlsLk9QUy5zYXZlLCBfdXRpbC5PUFMudHJhbnNmb3JtLCBfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QsIF91dGlsLk9QUy5yZXN0b3JlXSwgZnVuY3Rpb24gKGNvbnRleHQpIHsKKyAgICB2YXIgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CisgICAgdmFyIGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyOworICAgIHJldHVybiBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSA9PT0gMCAmJiBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSA9PT0gMDsKKyAgfSwgZnVuY3Rpb24gaXRlcmF0ZUltYWdlR3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOworICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKKworICAgIHN3aXRjaCAocG9zKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2F2ZTsKKworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLnRyYW5zZm9ybSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBpRmlyc3RUcmFuc2Zvcm0gPSBjb250ZXh0LmlDdXJyIC0gMjsKKyAgICAgICAgdmFyIGZpcnN0VHJhbnNmb3JtQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzBdOworICAgICAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CisKKyAgICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcwIHx8IGFyZ3NBcnJheVtpXVsxXSAhPT0gMCB8fCBhcmdzQXJyYXlbaV1bMl0gIT09IDAgfHwgYXJnc0FycmF5W2ldWzNdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzMpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0KSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGlGaXJzdFBJWE8gPSBjb250ZXh0LmlDdXJyIC0gMTsKKyAgICAgICAgdmFyIGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07CisKKyAgICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RQSVhPQXJnMCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMucmVzdG9yZTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOworICB9LCBmdW5jdGlvbiAoY29udGV4dCwgaSkgeworICAgIHZhciBNSU5fSU1BR0VTX0lOX0JMT0NLID0gMzsKKyAgICB2YXIgTUFYX0lNQUdFU19JTl9CTE9DSyA9IDEwMDA7CisgICAgdmFyIGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OworICAgIHZhciBjdXJyID0gY29udGV4dC5pQ3VycjsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOworICAgIHZhciBpRmlyc3RUcmFuc2Zvcm0gPSBjdXJyIC0gMjsKKyAgICB2YXIgaUZpcnN0UElYTyA9IGN1cnIgLSAxOworICAgIHZhciBmaXJzdFBJWE9BcmcwID0gYXJnc0FycmF5W2lGaXJzdFBJWE9dWzBdOworICAgIHZhciBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXTsKKyAgICB2YXIgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CisgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCksIE1BWF9JTUFHRVNfSU5fQkxPQ0spOworCisgICAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9CTE9DSykgeworICAgICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKKyAgICB9CisKKyAgICB2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOworICAgIHZhciBpVHJhbnNmb3JtID0gaUZpcnN0VHJhbnNmb3JtOworCisgICAgZm9yICh2YXIgcSA9IDA7IHEgPCBjb3VudDsgcSsrLCBpVHJhbnNmb3JtICs9IDQpIHsKKyAgICAgIHZhciB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOworICAgICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdOworICAgICAgcG9zaXRpb25zWyhxIDw8IDEpICsgMV0gPSB0cmFuc2Zvcm1BcmdzWzVdOworICAgIH0KKworICAgIHZhciBhcmdzID0gW2ZpcnN0UElYT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmczLCBwb3NpdGlvbnNdOworICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KTsKKyAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgYXJncyk7CisgICAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOworICB9KTsKKyAgYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbX3V0aWwuT1BTLmJlZ2luVGV4dCwgX3V0aWwuT1BTLnNldEZvbnQsIF91dGlsLk9QUy5zZXRUZXh0TWF0cml4LCBfdXRpbC5PUFMuc2hvd1RleHQsIF91dGlsLk9QUy5lbmRUZXh0XSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZVNob3dUZXh0R3JvdXAoY29udGV4dCwgaSkgeworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSA0OworICAgIHZhciBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNTsKKworICAgIHN3aXRjaCAocG9zKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuYmVnaW5UZXh0OworCisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2V0Rm9udDsKKworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnNldFRleHRNYXRyaXg7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IF91dGlsLk9QUy5zaG93VGV4dCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBpRmlyc3RTZXRGb250ID0gY29udGV4dC5pQ3VyciAtIDM7CisgICAgICAgIHZhciBmaXJzdFNldEZvbnRBcmcwID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzBdOworICAgICAgICB2YXIgZmlyc3RTZXRGb250QXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVsxXTsKKworICAgICAgICBpZiAoYXJnc0FycmF5W2ldWzBdICE9PSBmaXJzdFNldEZvbnRBcmcwIHx8IGFyZ3NBcnJheVtpXVsxXSAhPT0gZmlyc3RTZXRGb250QXJnMSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBjYXNlIDQ6CisgICAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuZW5kVGV4dDsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVTaG93VGV4dEdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOworICB9LCBmdW5jdGlvbiAoY29udGV4dCwgaSkgeworICAgIHZhciBNSU5fQ0hBUlNfSU5fQkxPQ0sgPSAzOworICAgIHZhciBNQVhfQ0hBUlNfSU5fQkxPQ0sgPSAxMDAwOworICAgIHZhciBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAorICAgICAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKKyAgICB2YXIgY3VyciA9IGNvbnRleHQuaUN1cnI7CisgICAgdmFyIGlGaXJzdEJlZ2luVGV4dCA9IGN1cnIgLSA0OworICAgIHZhciBpRmlyc3RTZXRGb250ID0gY3VyciAtIDM7CisgICAgdmFyIGlGaXJzdFNldFRleHRNYXRyaXggPSBjdXJyIC0gMjsKKyAgICB2YXIgaUZpcnN0U2hvd1RleHQgPSBjdXJyIC0gMTsKKyAgICB2YXIgaUZpcnN0RW5kVGV4dCA9IGN1cnI7CisgICAgdmFyIGZpcnN0U2V0Rm9udEFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMF07CisgICAgdmFyIGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07CisgICAgdmFyIGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdEJlZ2luVGV4dCkgLyA1KSwgTUFYX0NIQVJTX0lOX0JMT0NLKTsKKworICAgIGlmIChjb3VudCA8IE1JTl9DSEFSU19JTl9CTE9DSykgeworICAgICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdEJlZ2luVGV4dCkgJSA1OworICAgIH0KKworICAgIHZhciBpRmlyc3QgPSBpRmlyc3RCZWdpblRleHQ7CisKKyAgICBpZiAoaUZpcnN0QmVnaW5UZXh0ID49IDQgJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XSA9PT0gZm5BcnJheVtpRmlyc3RTZXRGb250XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDNdID09PSBmbkFycmF5W2lGaXJzdFNldFRleHRNYXRyaXhdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMl0gPT09IGZuQXJyYXlbaUZpcnN0U2hvd1RleHRdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMV0gPT09IGZuQXJyYXlbaUZpcnN0RW5kVGV4dF0gJiYgYXJnc0FycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdWzBdID09PSBmaXJzdFNldEZvbnRBcmcwICYmIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVsxXSA9PT0gZmlyc3RTZXRGb250QXJnMSkgeworICAgICAgY291bnQrKzsKKyAgICAgIGlGaXJzdCAtPSA1OworICAgIH0KKworICAgIHZhciBpRW5kVGV4dCA9IGlGaXJzdCArIDQ7CisKKyAgICBmb3IgKHZhciBxID0gMTsgcSA8IGNvdW50OyBxKyspIHsKKyAgICAgIGZuQXJyYXkuc3BsaWNlKGlFbmRUZXh0LCAzKTsKKyAgICAgIGFyZ3NBcnJheS5zcGxpY2UoaUVuZFRleHQsIDMpOworICAgICAgaUVuZFRleHQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gaUVuZFRleHQgKyAxOworICB9KTsKKworICBmdW5jdGlvbiBRdWV1ZU9wdGltaXplcihxdWV1ZSkgeworICAgIHRoaXMucXVldWUgPSBxdWV1ZTsKKyAgICB0aGlzLnN0YXRlID0gbnVsbDsKKyAgICB0aGlzLmNvbnRleHQgPSB7CisgICAgICBpQ3VycjogMCwKKyAgICAgIGZuQXJyYXk6IHF1ZXVlLmZuQXJyYXksCisgICAgICBhcmdzQXJyYXk6IHF1ZXVlLmFyZ3NBcnJheQorICAgIH07CisgICAgdGhpcy5tYXRjaCA9IG51bGw7CisgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gMDsKKyAgfQorCisgIFF1ZXVlT3B0aW1pemVyLnByb3RvdHlwZSA9IHsKKyAgICBfb3B0aW1pemUoKSB7CisgICAgICBjb25zdCBmbkFycmF5ID0gdGhpcy5xdWV1ZS5mbkFycmF5OworICAgICAgbGV0IGkgPSB0aGlzLmxhc3RQcm9jZXNzZWQsCisgICAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKKyAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7CisgICAgICBsZXQgbWF0Y2ggPSB0aGlzLm1hdGNoOworCisgICAgICBpZiAoIXN0YXRlICYmICFtYXRjaCAmJiBpICsgMSA9PT0gaWkgJiYgIUluaXRpYWxTdGF0ZVtmbkFycmF5W2ldXSkgeworICAgICAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSBpaTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0OworCisgICAgICB3aGlsZSAoaSA8IGlpKSB7CisgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgIGNvbnN0IGl0ZXJhdGUgPSAoMCwgbWF0Y2guaXRlcmF0ZUZuKShjb250ZXh0LCBpKTsKKworICAgICAgICAgIGlmIChpdGVyYXRlKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpID0gKDAsIG1hdGNoLnByb2Nlc3NGbikoY29udGV4dCwgaSArIDEpOworICAgICAgICAgIGlpID0gZm5BcnJheS5sZW5ndGg7CisgICAgICAgICAgbWF0Y2ggPSBudWxsOworICAgICAgICAgIHN0YXRlID0gbnVsbDsKKworICAgICAgICAgIGlmIChpID49IGlpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZSA9IChzdGF0ZSB8fCBJbml0aWFsU3RhdGUpW2ZuQXJyYXlbaV1dOworCisgICAgICAgIGlmICghc3RhdGUgfHwgQXJyYXkuaXNBcnJheShzdGF0ZSkpIHsKKyAgICAgICAgICBpKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0LmlDdXJyID0gaTsKKyAgICAgICAgaSsrOworCisgICAgICAgIGlmIChzdGF0ZS5jaGVja0ZuICYmICEoMCwgc3RhdGUuY2hlY2tGbikoY29udGV4dCkpIHsKKyAgICAgICAgICBzdGF0ZSA9IG51bGw7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtYXRjaCA9IHN0YXRlOworICAgICAgICBzdGF0ZSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaDsKKyAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGk7CisgICAgfSwKKworICAgIHB1c2goZm4sIGFyZ3MpIHsKKyAgICAgIHRoaXMucXVldWUuZm5BcnJheS5wdXNoKGZuKTsKKyAgICAgIHRoaXMucXVldWUuYXJnc0FycmF5LnB1c2goYXJncyk7CisKKyAgICAgIHRoaXMuX29wdGltaXplKCk7CisgICAgfSwKKworICAgIGZsdXNoKCkgeworICAgICAgd2hpbGUgKHRoaXMubWF0Y2gpIHsKKyAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDsKKyAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gKDAsIHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsIGxlbmd0aCk7CisgICAgICAgIHRoaXMubWF0Y2ggPSBudWxsOworICAgICAgICB0aGlzLnN0YXRlID0gbnVsbDsKKworICAgICAgICB0aGlzLl9vcHRpbWl6ZSgpOworICAgICAgfQorICAgIH0sCisKKyAgICByZXNldCgpIHsKKyAgICAgIHRoaXMuc3RhdGUgPSBudWxsOworICAgICAgdGhpcy5tYXRjaCA9IG51bGw7CisgICAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSAwOworICAgIH0KKworICB9OworICByZXR1cm4gUXVldWVPcHRpbWl6ZXI7Cit9KCk7CisKK3ZhciBOdWxsT3B0aW1pemVyID0gZnVuY3Rpb24gTnVsbE9wdGltaXplckNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIE51bGxPcHRpbWl6ZXIocXVldWUpIHsKKyAgICB0aGlzLnF1ZXVlID0gcXVldWU7CisgIH0KKworICBOdWxsT3B0aW1pemVyLnByb3RvdHlwZSA9IHsKKyAgICBwdXNoKGZuLCBhcmdzKSB7CisgICAgICB0aGlzLnF1ZXVlLmZuQXJyYXkucHVzaChmbik7CisgICAgICB0aGlzLnF1ZXVlLmFyZ3NBcnJheS5wdXNoKGFyZ3MpOworICAgIH0sCisKKyAgICBmbHVzaCgpIHt9LAorCisgICAgcmVzZXQoKSB7fQorCisgIH07CisgIHJldHVybiBOdWxsT3B0aW1pemVyOworfSgpOworCit2YXIgT3BlcmF0b3JMaXN0ID0gZnVuY3Rpb24gT3BlcmF0b3JMaXN0Q2xvc3VyZSgpIHsKKyAgdmFyIENIVU5LX1NJWkUgPSAxMDAwOworICB2YXIgQ0hVTktfU0laRV9BQk9VVCA9IENIVU5LX1NJWkUgLSA1OworCisgIGZ1bmN0aW9uIE9wZXJhdG9yTGlzdChpbnRlbnQsIHN0cmVhbVNpbmspIHsKKyAgICB0aGlzLl9zdHJlYW1TaW5rID0gc3RyZWFtU2luazsKKyAgICB0aGlzLmZuQXJyYXkgPSBbXTsKKyAgICB0aGlzLmFyZ3NBcnJheSA9IFtdOworCisgICAgaWYgKHN0cmVhbVNpbmsgJiYgaW50ZW50ICE9PSAib3BsaXN0IikgeworICAgICAgdGhpcy5vcHRpbWl6ZXIgPSBuZXcgUXVldWVPcHRpbWl6ZXIodGhpcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMub3B0aW1pemVyID0gbmV3IE51bGxPcHRpbWl6ZXIodGhpcyk7CisgICAgfQorCisgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBuZXcgU2V0KCk7CisgICAgdGhpcy5fdG90YWxMZW5ndGggPSAwOworICAgIHRoaXMud2VpZ2h0ID0gMDsKKyAgICB0aGlzLl9yZXNvbHZlZCA9IHN0cmVhbVNpbmsgPyBudWxsIDogUHJvbWlzZS5yZXNvbHZlKCk7CisgIH0KKworICBPcGVyYXRvckxpc3QucHJvdG90eXBlID0geworICAgIGdldCBsZW5ndGgoKSB7CisgICAgICByZXR1cm4gdGhpcy5hcmdzQXJyYXkubGVuZ3RoOworICAgIH0sCisKKyAgICBnZXQgcmVhZHkoKSB7CisgICAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZWQgfHwgdGhpcy5fc3RyZWFtU2luay5yZWFkeTsKKyAgICB9LAorCisgICAgZ2V0IHRvdGFsTGVuZ3RoKCkgeworICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsTGVuZ3RoICsgdGhpcy5sZW5ndGg7CisgICAgfSwKKworICAgIGFkZE9wKGZuLCBhcmdzKSB7CisgICAgICB0aGlzLm9wdGltaXplci5wdXNoKGZuLCBhcmdzKTsKKyAgICAgIHRoaXMud2VpZ2h0Kys7CisKKyAgICAgIGlmICh0aGlzLl9zdHJlYW1TaW5rKSB7CisgICAgICAgIGlmICh0aGlzLndlaWdodCA+PSBDSFVOS19TSVpFKSB7CisgICAgICAgICAgdGhpcy5mbHVzaCgpOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2VpZ2h0ID49IENIVU5LX1NJWkVfQUJPVVQgJiYgKGZuID09PSBfdXRpbC5PUFMucmVzdG9yZSB8fCBmbiA9PT0gX3V0aWwuT1BTLmVuZFRleHQpKSB7CisgICAgICAgICAgdGhpcy5mbHVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIGFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSkgeworICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTsKKyAgICAgIHRoaXMuYWRkT3AoX3V0aWwuT1BTLmRlcGVuZGVuY3ksIFtkZXBlbmRlbmN5XSk7CisgICAgfSwKKworICAgIGFkZERlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXMpIHsKKyAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBkZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgdGhpcy5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgICAgfQorICAgIH0sCisKKyAgICBhZGRPcExpc3Qob3BMaXN0KSB7CisgICAgICBpZiAoIShvcExpc3QgaW5zdGFuY2VvZiBPcGVyYXRvckxpc3QpKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgnYWRkT3BMaXN0IC0gaWdub3JpbmcgaW52YWxpZCAib3BMaXN0IiBwYXJhbWV0ZXIuJyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9wTGlzdC5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBvcExpc3QubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB0aGlzLmFkZE9wKG9wTGlzdC5mbkFycmF5W2ldLCBvcExpc3QuYXJnc0FycmF5W2ldKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgZ2V0SVIoKSB7CisgICAgICByZXR1cm4geworICAgICAgICBmbkFycmF5OiB0aGlzLmZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksCisgICAgICAgIGxlbmd0aDogdGhpcy5sZW5ndGgKKyAgICAgIH07CisgICAgfSwKKworICAgIGdldCBfdHJhbnNmZXJzKCkgeworICAgICAgY29uc3QgdHJhbnNmZXJzID0gW107CisgICAgICBjb25zdCB7CisgICAgICAgIGZuQXJyYXksCisgICAgICAgIGFyZ3NBcnJheSwKKyAgICAgICAgbGVuZ3RoCisgICAgICB9ID0gdGhpczsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBzd2l0Y2ggKGZuQXJyYXlbaV0pIHsKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdDoKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOgorICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDoKKyAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NBcnJheVtpXVswXTsKKyAgICAgICAgICAgIDsKKworICAgICAgICAgICAgaWYgKCFhcmcuY2FjaGVkKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVycy5wdXNoKGFyZy5kYXRhLmJ1ZmZlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cmFuc2ZlcnM7CisgICAgfSwKKworICAgIGZsdXNoKGxhc3RDaHVuayA9IGZhbHNlKSB7CisgICAgICB0aGlzLm9wdGltaXplci5mbHVzaCgpOworICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CisgICAgICB0aGlzLl90b3RhbExlbmd0aCArPSBsZW5ndGg7CisKKyAgICAgIHRoaXMuX3N0cmVhbVNpbmsuZW5xdWV1ZSh7CisgICAgICAgIGZuQXJyYXk6IHRoaXMuZm5BcnJheSwKKyAgICAgICAgYXJnc0FycmF5OiB0aGlzLmFyZ3NBcnJheSwKKyAgICAgICAgbGFzdENodW5rLAorICAgICAgICBsZW5ndGgKKyAgICAgIH0sIDEsIHRoaXMuX3RyYW5zZmVycyk7CisKKyAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7CisgICAgICB0aGlzLmZuQXJyYXkubGVuZ3RoID0gMDsKKyAgICAgIHRoaXMuYXJnc0FycmF5Lmxlbmd0aCA9IDA7CisgICAgICB0aGlzLndlaWdodCA9IDA7CisgICAgICB0aGlzLm9wdGltaXplci5yZXNldCgpOworICAgIH0KKworICB9OworICByZXR1cm4gT3BlcmF0b3JMaXN0OworfSgpOworCitleHBvcnRzLk9wZXJhdG9yTGlzdCA9IE9wZXJhdG9yTGlzdDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9wYXJzZXIuanMgYi9saWIvY29yZS9wYXJzZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlYjEzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL3BhcnNlci5qcwpAQCAtMCwwICsxLDEzNTkgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBhcnNlciA9IGV4cG9ydHMuTGluZWFyaXphdGlvbiA9IGV4cG9ydHMuTGV4ZXIgPSB2b2lkIDA7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi9zdHJlYW0uanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfY29yZV91dGlscyA9IHJlcXVpcmUoIi4vY29yZV91dGlscy5qcyIpOworCit2YXIgX2NjaXR0X3N0cmVhbSA9IHJlcXVpcmUoIi4vY2NpdHRfc3RyZWFtLmpzIik7CisKK3ZhciBfamJpZzJfc3RyZWFtID0gcmVxdWlyZSgiLi9qYmlnMl9zdHJlYW0uanMiKTsKKwordmFyIF9qcGVnX3N0cmVhbSA9IHJlcXVpcmUoIi4vanBlZ19zdHJlYW0uanMiKTsKKwordmFyIF9qcHhfc3RyZWFtID0gcmVxdWlyZSgiLi9qcHhfc3RyZWFtLmpzIik7CisKK2NvbnN0IE1BWF9MRU5HVEhfVE9fQ0FDSEUgPSAxMDAwOworY29uc3QgTUFYX0FETEVSMzJfTEVOR1RIID0gNTU1MjsKKworZnVuY3Rpb24gY29tcHV0ZUFkbGVyMzIoYnl0ZXMpIHsKKyAgY29uc3QgYnl0ZXNMZW5ndGggPSBieXRlcy5sZW5ndGg7CisgIGxldCBhID0gMSwKKyAgICAgIGIgPSAwOworCisgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXNMZW5ndGg7ICsraSkgeworICAgIGEgKz0gYnl0ZXNbaV0gJiAweGZmOworICAgIGIgKz0gYTsKKyAgfQorCisgIHJldHVybiBiICUgNjU1MjEgPDwgMTYgfCBhICUgNjU1MjE7Cit9CisKK2NsYXNzIFBhcnNlciB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBsZXhlciwKKyAgICB4cmVmLAorICAgIGFsbG93U3RyZWFtcyA9IGZhbHNlLAorICAgIHJlY292ZXJ5TW9kZSA9IGZhbHNlCisgIH0pIHsKKyAgICB0aGlzLmxleGVyID0gbGV4ZXI7CisgICAgdGhpcy54cmVmID0geHJlZjsKKyAgICB0aGlzLmFsbG93U3RyZWFtcyA9IGFsbG93U3RyZWFtczsKKyAgICB0aGlzLnJlY292ZXJ5TW9kZSA9IHJlY292ZXJ5TW9kZTsKKyAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIHRoaXMucmVmaWxsKCk7CisgIH0KKworICByZWZpbGwoKSB7CisgICAgdGhpcy5idWYxID0gdGhpcy5sZXhlci5nZXRPYmooKTsKKyAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOworICB9CisKKyAgc2hpZnQoKSB7CisgICAgaWYgKHRoaXMuYnVmMiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkNtZCAmJiB0aGlzLmJ1ZjIuY21kID09PSAiSUQiKSB7CisgICAgICB0aGlzLmJ1ZjEgPSB0aGlzLmJ1ZjI7CisgICAgICB0aGlzLmJ1ZjIgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmJ1ZjEgPSB0aGlzLmJ1ZjI7CisgICAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOworICAgIH0KKyAgfQorCisgIHRyeVNoaWZ0KCkgeworICAgIHRyeSB7CisgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBnZXRPYmooY2lwaGVyVHJhbnNmb3JtID0gbnVsbCkgeworICAgIGNvbnN0IGJ1ZjEgPSB0aGlzLmJ1ZjE7CisgICAgdGhpcy5zaGlmdCgpOworCisgICAgaWYgKGJ1ZjEgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQpIHsKKyAgICAgIHN3aXRjaCAoYnVmMS5jbWQpIHsKKyAgICAgICAgY2FzZSAiQkkiOgorICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VJbmxpbmVJbWFnZShjaXBoZXJUcmFuc2Zvcm0pOworCisgICAgICAgIGNhc2UgIlsiOgorICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107CisKKyAgICAgICAgICB3aGlsZSAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYxLCAiXSIpICYmICEoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgICAgIGFycmF5LnB1c2godGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikodGhpcy5idWYxKSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnJlY292ZXJ5TW9kZSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkVuZCBvZiBmaWxlIGluc2lkZSBhcnJheSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5zaGlmdCgpOworICAgICAgICAgIHJldHVybiBhcnJheTsKKworICAgICAgICBjYXNlICI8PCI6CisgICAgICAgICAgY29uc3QgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CisKKyAgICAgICAgICB3aGlsZSAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYxLCAiPj4iKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRU9GKSh0aGlzLmJ1ZjEpKSB7CisgICAgICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJNYWxmb3JtZWQgZGljdGlvbmFyeToga2V5IG11c3QgYmUgYSBuYW1lIG9iamVjdCIpOworICAgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1ZjEubmFtZTsKKyAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKKworICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0VPRikodGhpcy5idWYxKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzRU9GKSh0aGlzLmJ1ZjEpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMucmVjb3ZlcnlNb2RlKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiRW5kIG9mIGZpbGUgaW5zaWRlIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRpY3Q7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYyLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmFsbG93U3RyZWFtcyA/IHRoaXMubWFrZVN0cmVhbShkaWN0LCBjaXBoZXJUcmFuc2Zvcm0pIDogZGljdDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgICAgcmV0dXJuIGRpY3Q7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gYnVmMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihidWYxKSkgeworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodGhpcy5idWYxKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKHRoaXMuYnVmMiwgIlIiKSkgeworICAgICAgICBjb25zdCByZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KGJ1ZjEsIHRoaXMuYnVmMSk7CisKKyAgICAgICAgdGhpcy5zaGlmdCgpOworICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgIHJldHVybiByZWY7CisgICAgICB9CisKKyAgICAgIHJldHVybiBidWYxOworICAgIH0KKworICAgIGlmICh0eXBlb2YgYnVmMSA9PT0gInN0cmluZyIpIHsKKyAgICAgIGlmIChjaXBoZXJUcmFuc2Zvcm0pIHsKKyAgICAgICAgcmV0dXJuIGNpcGhlclRyYW5zZm9ybS5kZWNyeXB0U3RyaW5nKGJ1ZjEpOworICAgICAgfQorCisgICAgICByZXR1cm4gYnVmMTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmMTsKKyAgfQorCisgIGZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSkgeworICAgIGNvbnN0IEUgPSAweDQ1LAorICAgICAgICAgIEkgPSAweDQ5LAorICAgICAgICAgIFNQQUNFID0gMHgyMCwKKyAgICAgICAgICBMRiA9IDB4YSwKKyAgICAgICAgICBDUiA9IDB4ZCwKKyAgICAgICAgICBOVUwgPSAweDA7CisgICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyLAorICAgICAgICAgIHN0YXJ0UG9zID0gc3RyZWFtLnBvcywKKyAgICAgICAgICBuID0gMTA7CisgICAgbGV0IHN0YXRlID0gMCwKKyAgICAgICAgY2gsCisgICAgICAgIG1heWJlRUlQb3M7CisKKyAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgIT09IC0xKSB7CisgICAgICBpZiAoc3RhdGUgPT09IDApIHsKKyAgICAgICAgc3RhdGUgPSBjaCA9PT0gRSA/IDEgOiAwOworICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gMSkgeworICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShzdGF0ZSA9PT0gMiwgImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kIC0gaW52YWxpZCBzdGF0ZS4iKTsKKworICAgICAgICBpZiAoY2ggPT09IFNQQUNFIHx8IGNoID09PSBMRiB8fCBjaCA9PT0gQ1IpIHsKKyAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgICBjb25zdCBmb2xsb3dpbmdCeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMobik7CisKKyAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmb2xsb3dpbmdCeXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgICBjaCA9IGZvbGxvd2luZ0J5dGVzW2ldOworCisgICAgICAgICAgICBpZiAoY2ggPT09IE5VTCAmJiBmb2xsb3dpbmdCeXRlc1tpICsgMV0gIT09IE5VTCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkgeworICAgICAgICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdGF0ZSAhPT0gMikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxleGVyLmtub3duQ29tbWFuZHMpIHsKKyAgICAgICAgICAgIGNvbnN0IG5leHRPYmogPSBsZXhlci5wZWVrT2JqKCk7CisKKyAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kICYmICFsZXhlci5rbm93bkNvbW1hbmRzW25leHRPYmouY21kXSkgeworICAgICAgICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQgLSBgbGV4ZXIua25vd25Db21tYW5kc2AgaXMgdW5kZWZpbmVkLiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChjaCA9PT0gLTEpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6ICIgKyAiUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aG91dCBmaW5kaW5nIGEgdmFsaWQgRUkgbWFya2VyIik7CisKKyAgICAgIGlmIChtYXliZUVJUG9zKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgnLi4uIHRyeWluZyB0byByZWNvdmVyIGJ5IHVzaW5nIHRoZSBsYXN0ICJFSSIgb2NjdXJyZW5jZS4nKTsKKyAgICAgICAgc3RyZWFtLnNraXAoLShzdHJlYW0ucG9zIC0gbWF5YmVFSVBvcykpOworICAgICAgfQorICAgIH0KKworICAgIGxldCBlbmRPZmZzZXQgPSA0OworICAgIHN0cmVhbS5za2lwKC1lbmRPZmZzZXQpOworICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CisgICAgc3RyZWFtLnNraXAoZW5kT2Zmc2V0KTsKKworICAgIGlmICghKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CisgICAgICBlbmRPZmZzZXQtLTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtLnBvcyAtIGVuZE9mZnNldCAtIHN0YXJ0UG9zOworICB9CisKKyAgZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKKyAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3M7CisgICAgbGV0IGZvdW5kRU9JID0gZmFsc2UsCisgICAgICAgIGIsCisgICAgICAgIG1hcmtlckxlbmd0aDsKKworICAgIHdoaWxlICgoYiA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgaWYgKGIgIT09IDB4ZmYpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoc3RyZWFtLmdldEJ5dGUoKSkgeworICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweGZmOgorICAgICAgICAgIHN0cmVhbS5za2lwKC0xKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4ZDk6CisgICAgICAgICAgZm91bmRFT0kgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHhjMDoKKyAgICAgICAgY2FzZSAweGMxOgorICAgICAgICBjYXNlIDB4YzI6CisgICAgICAgIGNhc2UgMHhjMzoKKyAgICAgICAgY2FzZSAweGM1OgorICAgICAgICBjYXNlIDB4YzY6CisgICAgICAgIGNhc2UgMHhjNzoKKyAgICAgICAgY2FzZSAweGM5OgorICAgICAgICBjYXNlIDB4Y2E6CisgICAgICAgIGNhc2UgMHhjYjoKKyAgICAgICAgY2FzZSAweGNkOgorICAgICAgICBjYXNlIDB4Y2U6CisgICAgICAgIGNhc2UgMHhjZjoKKyAgICAgICAgY2FzZSAweGM0OgorICAgICAgICBjYXNlIDB4Y2M6CisgICAgICAgIGNhc2UgMHhkYToKKyAgICAgICAgY2FzZSAweGRiOgorICAgICAgICBjYXNlIDB4ZGM6CisgICAgICAgIGNhc2UgMHhkZDoKKyAgICAgICAgY2FzZSAweGRlOgorICAgICAgICBjYXNlIDB4ZGY6CisgICAgICAgIGNhc2UgMHhlMDoKKyAgICAgICAgY2FzZSAweGUxOgorICAgICAgICBjYXNlIDB4ZTI6CisgICAgICAgIGNhc2UgMHhlMzoKKyAgICAgICAgY2FzZSAweGU0OgorICAgICAgICBjYXNlIDB4ZTU6CisgICAgICAgIGNhc2UgMHhlNjoKKyAgICAgICAgY2FzZSAweGU3OgorICAgICAgICBjYXNlIDB4ZTg6CisgICAgICAgIGNhc2UgMHhlOToKKyAgICAgICAgY2FzZSAweGVhOgorICAgICAgICBjYXNlIDB4ZWI6CisgICAgICAgIGNhc2UgMHhlYzoKKyAgICAgICAgY2FzZSAweGVkOgorICAgICAgICBjYXNlIDB4ZWU6CisgICAgICAgIGNhc2UgMHhlZjoKKyAgICAgICAgY2FzZSAweGZlOgorICAgICAgICAgIG1hcmtlckxlbmd0aCA9IHN0cmVhbS5nZXRVaW50MTYoKTsKKworICAgICAgICAgIGlmIChtYXJrZXJMZW5ndGggPiAyKSB7CisgICAgICAgICAgICBzdHJlYW0uc2tpcChtYXJrZXJMZW5ndGggLSAyKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyZWFtLnNraXAoLTIpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZm91bmRFT0kpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zOworCisgICAgaWYgKGIgPT09IC0xKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBEQ1REZWNvZGUgaW1hZ2Ugc3RyZWFtOiAiICsgIkVPSSBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTsKKyAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOworICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKKyAgICB9CisKKyAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pOworICAgIHJldHVybiBsZW5ndGg7CisgIH0KKworICBmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKKyAgICBjb25zdCBUSUxERSA9IDB4N2UsCisgICAgICAgICAgR1QgPSAweDNlOworICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKKyAgICBsZXQgY2g7CisKKyAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgIT09IC0xKSB7CisgICAgICBpZiAoY2ggPT09IFRJTERFKSB7CisgICAgICAgIGNvbnN0IHRpbGRlUG9zID0gc3RyZWFtLnBvczsKKyAgICAgICAgY2ggPSBzdHJlYW0ucGVla0J5dGUoKTsKKworICAgICAgICB3aGlsZSAoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CisgICAgICAgICAgc3RyZWFtLnNraXAoKTsKKyAgICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoID09PSBHVCkgeworICAgICAgICAgIHN0cmVhbS5za2lwKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHRpbGRlUG9zKSB7CisgICAgICAgICAgY29uc3QgbWF5YmVFSSA9IHN0cmVhbS5wZWVrQnl0ZXMoMik7CisKKyAgICAgICAgICBpZiAobWF5YmVFSVswXSA9PT0gMHg0NSAmJiBtYXliZUVJWzFdID09PSAweDQ5KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CisKKyAgICBpZiAoY2ggPT09IC0xKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CisgICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKKyAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CisgICAgfQorCisgICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKKyAgICByZXR1cm4gbGVuZ3RoOworICB9CisKKyAgZmluZEFTQ0lJSGV4RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSkgeworICAgIGNvbnN0IEdUID0gMHgzZTsKKyAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3M7CisgICAgbGV0IGNoOworCisgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgeworICAgICAgaWYgKGNoID09PSBHVCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CisKKyAgICBpZiAoY2ggPT09IC0xKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOworICAgICAgc3RyZWFtLnNraXAoLWxlbmd0aCk7CisgICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgIH0KKworICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7CisgICAgcmV0dXJuIGxlbmd0aDsKKyAgfQorCisgIGlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pIHsKKyAgICBjb25zdCBFID0gMHg0NSwKKyAgICAgICAgICBJID0gMHg0OTsKKyAgICBsZXQgc3RhdGUgPSAwLAorICAgICAgICBjaDsKKworICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKKyAgICAgIGlmIChzdGF0ZSA9PT0gMCkgeworICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CisgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAxKSB7CisgICAgICAgIHN0YXRlID0gY2ggPT09IEkgPyAyIDogMDsKKyAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgbWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSkgeworICAgIGNvbnN0IGxleGVyID0gdGhpcy5sZXhlcjsKKyAgICBjb25zdCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CisgICAgY29uc3QgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CisgICAgbGV0IGRpY3RMZW5ndGg7CisKKyAgICB3aGlsZSAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYxLCAiSUQiKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRU9GKSh0aGlzLmJ1ZjEpKSB7CisgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJEaWN0aW9uYXJ5IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTsKKyAgICAgIH0KKworICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CisgICAgICB0aGlzLnNoaWZ0KCk7CisKKyAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNFT0YpKHRoaXMuYnVmMSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRpY3Quc2V0KGtleSwgdGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7CisgICAgfQorCisgICAgaWYgKGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3MgIT09IC0xKSB7CisgICAgICBkaWN0TGVuZ3RoID0gc3RyZWFtLnBvcyAtIGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7CisgICAgfQorCisgICAgY29uc3QgZmlsdGVyID0gZGljdC5nZXQoIkZpbHRlciIsICJGIik7CisgICAgbGV0IGZpbHRlck5hbWU7CisKKyAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmlsdGVyKSkgeworICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOworICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7CisgICAgICBjb25zdCBmaWx0ZXJaZXJvID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmlsdGVyWzBdKTsKKworICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpbHRlclplcm8pKSB7CisgICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXJaZXJvLm5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOworICAgIGxldCBsZW5ndGg7CisKKyAgICBpZiAoZmlsdGVyTmFtZSA9PT0gIkRDVERlY29kZSIgfHwgZmlsdGVyTmFtZSA9PT0gIkRDVCIpIHsKKyAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgIH0gZWxzZSBpZiAoZmlsdGVyTmFtZSA9PT0gIkFTQ0lJODVEZWNvZGUiIHx8IGZpbHRlck5hbWUgPT09ICJBODUiKSB7CisgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CisgICAgfSBlbHNlIGlmIChmaWx0ZXJOYW1lID09PSAiQVNDSUlIZXhEZWNvZGUiIHx8IGZpbHRlck5hbWUgPT09ICJBSHgiKSB7CisgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOworICAgIH0gZWxzZSB7CisgICAgICBsZW5ndGggPSB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CisgICAgfQorCisgICAgbGV0IGltYWdlU3RyZWFtID0gc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MsIGxlbmd0aCwgZGljdCk7CisgICAgbGV0IGNhY2hlS2V5OworCisgICAgaWYgKGxlbmd0aCA8IE1BWF9MRU5HVEhfVE9fQ0FDSEUgJiYgZGljdExlbmd0aCA8IE1BWF9BRExFUjMyX0xFTkdUSCkgeworICAgICAgY29uc3QgaW1hZ2VCeXRlcyA9IGltYWdlU3RyZWFtLmdldEJ5dGVzKCk7CisgICAgICBpbWFnZVN0cmVhbS5yZXNldCgpOworICAgICAgY29uc3QgaW5pdGlhbFN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CisgICAgICBzdHJlYW0ucG9zID0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvczsKKyAgICAgIGNvbnN0IGRpY3RCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcyhkaWN0TGVuZ3RoKTsKKyAgICAgIHN0cmVhbS5wb3MgPSBpbml0aWFsU3RyZWFtUG9zOworICAgICAgY2FjaGVLZXkgPSBjb21wdXRlQWRsZXIzMihpbWFnZUJ5dGVzKSArICJfIiArIGNvbXB1dGVBZGxlcjMyKGRpY3RCeXRlcyk7CisgICAgICBjb25zdCBjYWNoZUVudHJ5ID0gdGhpcy5pbWFnZUNhY2hlW2NhY2hlS2V5XTsKKworICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkgeworICAgICAgICB0aGlzLmJ1ZjIgPSBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJFSSIpOworICAgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICAgIGNhY2hlRW50cnkucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIGNhY2hlRW50cnk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgeworICAgICAgaW1hZ2VTdHJlYW0gPSBjaXBoZXJUcmFuc2Zvcm0uY3JlYXRlU3RyZWFtKGltYWdlU3RyZWFtLCBsZW5ndGgpOworICAgIH0KKworICAgIGltYWdlU3RyZWFtID0gdGhpcy5maWx0ZXIoaW1hZ2VTdHJlYW0sIGRpY3QsIGxlbmd0aCk7CisgICAgaW1hZ2VTdHJlYW0uZGljdCA9IGRpY3Q7CisKKyAgICBpZiAoY2FjaGVLZXkgIT09IHVuZGVmaW5lZCkgeworICAgICAgaW1hZ2VTdHJlYW0uY2FjaGVLZXkgPSBgaW5saW5lXyR7bGVuZ3RofV8ke2NhY2hlS2V5fWA7CisgICAgICB0aGlzLmltYWdlQ2FjaGVbY2FjaGVLZXldID0gaW1hZ2VTdHJlYW07CisgICAgfQorCisgICAgdGhpcy5idWYyID0gX3ByaW1pdGl2ZXMuQ21kLmdldCgiRUkiKTsKKyAgICB0aGlzLnNoaWZ0KCk7CisgICAgcmV0dXJuIGltYWdlU3RyZWFtOworICB9CisKKyAgX2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MsIHNpZ25hdHVyZSkgeworICAgIGNvbnN0IHsKKyAgICAgIHN0cmVhbQorICAgIH0gPSB0aGlzLmxleGVyOworICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvczsKKyAgICBjb25zdCBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7CisgICAgY29uc3Qgc2lnbmF0dXJlTGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aDsKKworICAgIHdoaWxlIChzdHJlYW0ucG9zIDwgc3RyZWFtLmVuZCkgeworICAgICAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhTQ0FOX0JMT0NLX0xFTkdUSCk7CisgICAgICBjb25zdCBzY2FuTGVuZ3RoID0gc2NhbkJ5dGVzLmxlbmd0aCAtIHNpZ25hdHVyZUxlbmd0aDsKKworICAgICAgaWYgKHNjYW5MZW5ndGggPD0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbGV0IHBvcyA9IDA7CisKKyAgICAgIHdoaWxlIChwb3MgPCBzY2FuTGVuZ3RoKSB7CisgICAgICAgIGxldCBqID0gMDsKKworICAgICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zICsgal0gPT09IHNpZ25hdHVyZVtqXSkgeworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqID49IHNpZ25hdHVyZUxlbmd0aCkgeworICAgICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zOworICAgICAgICAgIHJldHVybiBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CisgICAgICAgIH0KKworICAgICAgICBwb3MrKzsKKyAgICAgIH0KKworICAgICAgc3RyZWFtLnBvcyArPSBzY2FuTGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKSB7CisgICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyOworICAgIGxldCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CisgICAgbGV4ZXIuc2tpcFRvTmV4dExpbmUoKTsKKyAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3MgLSAxOworICAgIGxldCBsZW5ndGggPSBkaWN0LmdldCgiTGVuZ3RoIik7CisKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkgeworICAgICAgKDAsIF91dGlsLmluZm8pKGBCYWQgbGVuZ3RoICIke2xlbmd0aH0iIGluIHN0cmVhbWApOworICAgICAgbGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3MgKyBsZW5ndGg7CisgICAgbGV4ZXIubmV4dENoYXIoKTsKKworICAgIGlmICh0aGlzLnRyeVNoaWZ0KCkgJiYgKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjIsICJlbmRzdHJlYW0iKSkgeworICAgICAgdGhpcy5zaGlmdCgpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBFTkRTVFJFQU1fU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NkUsIDB4NjQsIDB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NkRdKTsKKworICAgICAgbGV0IGFjdHVhbExlbmd0aCA9IHRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MsIEVORFNUUkVBTV9TSUdOQVRVUkUpOworCisgICAgICBpZiAoYWN0dWFsTGVuZ3RoIDwgMCkgeworICAgICAgICBjb25zdCBNQVhfVFJVTkNBVElPTiA9IDE7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gTUFYX1RSVU5DQVRJT047IGkrKykgeworICAgICAgICAgIGNvbnN0IGVuZCA9IEVORFNUUkVBTV9TSUdOQVRVUkUubGVuZ3RoIC0gaTsKKyAgICAgICAgICBjb25zdCBUUlVOQ0FURURfU0lHTkFUVVJFID0gRU5EU1RSRUFNX1NJR05BVFVSRS5zbGljZSgwLCBlbmQpOworCisgICAgICAgICAgY29uc3QgbWF5YmVMZW5ndGggPSB0aGlzLl9maW5kU3RyZWFtTGVuZ3RoKHN0YXJ0UG9zLCBUUlVOQ0FURURfU0lHTkFUVVJFKTsKKworICAgICAgICAgIGlmIChtYXliZUxlbmd0aCA+PSAwKSB7CisgICAgICAgICAgICBjb25zdCBsYXN0Qnl0ZSA9IHN0cmVhbS5wZWVrQnl0ZXMoZW5kICsgMSlbZW5kXTsKKworICAgICAgICAgICAgaWYgKCEoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShsYXN0Qnl0ZSkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgRm91bmQgIiR7KDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKFRSVU5DQVRFRF9TSUdOQVRVUkUpfSIgd2hlbiBgICsgInNlYXJjaGluZyBmb3IgZW5kc3RyZWFtIGNvbW1hbmQuIik7CisgICAgICAgICAgICBhY3R1YWxMZW5ndGggPSBtYXliZUxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhY3R1YWxMZW5ndGggPCAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNaXNzaW5nIGVuZHN0cmVhbSBjb21tYW5kLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxlbmd0aCA9IGFjdHVhbExlbmd0aDsKKyAgICAgIGxleGVyLm5leHRDaGFyKCk7CisgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgICB0aGlzLnNoaWZ0KCk7CisgICAgfQorCisgICAgdGhpcy5zaGlmdCgpOworICAgIHN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOworCisgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgeworICAgICAgc3RyZWFtID0gY2lwaGVyVHJhbnNmb3JtLmNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCk7CisgICAgfQorCisgICAgc3RyZWFtID0gdGhpcy5maWx0ZXIoc3RyZWFtLCBkaWN0LCBsZW5ndGgpOworICAgIHN0cmVhbS5kaWN0ID0gZGljdDsKKyAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKSB7CisgICAgbGV0IGZpbHRlciA9IGRpY3QuZ2V0KCJGaWx0ZXIiLCAiRiIpOworICAgIGxldCBwYXJhbXMgPSBkaWN0LmdldCgiRGVjb2RlUGFybXMiLCAiRFAiKTsKKworICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShmaWx0ZXIpKSB7CisgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiL0RlY29kZVBhcm1zIHNob3VsZCBub3QgY29udGFpbiBhbiBBcnJheSwgIiArICJ3aGVuIC9GaWx0ZXIgY29udGFpbnMgYSBOYW1lLiIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIGxlbmd0aCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBsZXQgbWF5YmVMZW5ndGggPSBsZW5ndGg7CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7CisgICAgICBjb25zdCBmaWx0ZXJBcnJheSA9IGZpbHRlcjsKKyAgICAgIGNvbnN0IHBhcmFtc0FycmF5ID0gcGFyYW1zOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmaWx0ZXJBcnJheS5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIGZpbHRlciA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZpbHRlckFycmF5W2ldKTsKKworICAgICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGZpbHRlcikpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEJhZCBmaWx0ZXIgbmFtZSAiJHtmaWx0ZXJ9ImApOworICAgICAgICB9CisKKyAgICAgICAgcGFyYW1zID0gbnVsbDsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXNBcnJheSkgJiYgaSBpbiBwYXJhbXNBcnJheSkgeworICAgICAgICAgIHBhcmFtcyA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHBhcmFtc0FycmF5W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmVhbSA9IHRoaXMubWFrZUZpbHRlcihzdHJlYW0sIGZpbHRlci5uYW1lLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKKyAgICAgICAgbWF5YmVMZW5ndGggPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHJlYW07CisgIH0KKworICBtYWtlRmlsdGVyKHN0cmVhbSwgbmFtZSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgeworICAgIGlmIChtYXliZUxlbmd0aCA9PT0gMCkgeworICAgICAgKDAsIF91dGlsLndhcm4pKGBFbXB0eSAiJHtuYW1lfSIgc3RyZWFtLmApOworICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLk51bGxTdHJlYW0oKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgY29uc3QgeHJlZlN0cmVhbVN0YXRzID0gdGhpcy54cmVmLnN0YXRzLnN0cmVhbVR5cGVzOworCisgICAgICBpZiAobmFtZSA9PT0gIkZsYXRlRGVjb2RlIiB8fCBuYW1lID09PSAiRmwiKSB7CisgICAgICAgIHhyZWZTdHJlYW1TdGF0c1tfdXRpbC5TdHJlYW1UeXBlLkZMQVRFXSA9IHRydWU7CisKKyAgICAgICAgaWYgKHBhcmFtcykgeworICAgICAgICAgIHJldHVybiBuZXcgX3N0cmVhbS5QcmVkaWN0b3JTdHJlYW0obmV3IF9zdHJlYW0uRmxhdGVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCksIG1heWJlTGVuZ3RoLCBwYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLkZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkxaV0RlY29kZSIgfHwgbmFtZSA9PT0gIkxaVyIpIHsKKyAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuTFpXXSA9IHRydWU7CisgICAgICAgIGxldCBlYXJseUNoYW5nZSA9IDE7CisKKyAgICAgICAgaWYgKHBhcmFtcykgeworICAgICAgICAgIGlmIChwYXJhbXMuaGFzKCJFYXJseUNoYW5nZSIpKSB7CisgICAgICAgICAgICBlYXJseUNoYW5nZSA9IHBhcmFtcy5nZXQoIkVhcmx5Q2hhbmdlIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLlByZWRpY3RvclN0cmVhbShuZXcgX3N0cmVhbS5MWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgX3N0cmVhbS5MWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkRDVERlY29kZSIgfHwgbmFtZSA9PT0gIkRDVCIpIHsKKyAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuRENUXSA9IHRydWU7CisgICAgICAgIHJldHVybiBuZXcgX2pwZWdfc3RyZWFtLkpwZWdTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgc3RyZWFtLmRpY3QsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIGlmIChuYW1lID09PSAiSlBYRGVjb2RlIiB8fCBuYW1lID09PSAiSlBYIikgeworICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5KUFhdID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBfanB4X3N0cmVhbS5KcHhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgc3RyZWFtLmRpY3QsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIGlmIChuYW1lID09PSAiQVNDSUk4NURlY29kZSIgfHwgbmFtZSA9PT0gIkE4NSIpIHsKKyAgICAgICAgeHJlZlN0cmVhbVN0YXRzW191dGlsLlN0cmVhbVR5cGUuQTg1XSA9IHRydWU7CisgICAgICAgIHJldHVybiBuZXcgX3N0cmVhbS5Bc2NpaTg1U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkFTQ0lJSGV4RGVjb2RlIiB8fCBuYW1lID09PSAiQUh4IikgeworICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5BSFhdID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLkFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkNDSVRURmF4RGVjb2RlIiB8fCBuYW1lID09PSAiQ0NGIikgeworICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5DQ0ZdID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBfY2NpdHRfc3RyZWFtLkNDSVRURmF4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIGlmIChuYW1lID09PSAiUnVuTGVuZ3RoRGVjb2RlIiB8fCBuYW1lID09PSAiUkwiKSB7CisgICAgICAgIHhyZWZTdHJlYW1TdGF0c1tfdXRpbC5TdHJlYW1UeXBlLlJMWF0gPSB0cnVlOworICAgICAgICByZXR1cm4gbmV3IF9zdHJlYW0uUnVuTGVuZ3RoU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PT0gIkpCSUcyRGVjb2RlIikgeworICAgICAgICB4cmVmU3RyZWFtU3RhdHNbX3V0aWwuU3RyZWFtVHlwZS5KQklHXSA9IHRydWU7CisgICAgICAgIHJldHVybiBuZXcgX2piaWcyX3N0cmVhbS5KYmlnMlN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBzdHJlYW0uZGljdCwgcGFyYW1zKTsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBGaWx0ZXIgIiR7bmFtZX0iIGlzIG5vdCBzdXBwb3J0ZWQuYCk7CisgICAgICByZXR1cm4gc3RyZWFtOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBJbnZhbGlkIHN0cmVhbTogIiR7ZXh9ImApOworICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLk51bGxTdHJlYW0oKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLlBhcnNlciA9IFBhcnNlcjsKK2NvbnN0IHNwZWNpYWxDaGFycyA9IFsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKKworZnVuY3Rpb24gdG9IZXhEaWdpdChjaCkgeworICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB7CisgICAgcmV0dXJuIGNoICYgMHgwZjsKKyAgfQorCisgIGlmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSB7CisgICAgcmV0dXJuIChjaCAmIDB4MGYpICsgOTsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworY2xhc3MgTGV4ZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0sIGtub3duQ29tbWFuZHMgPSBudWxsKSB7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5uZXh0Q2hhcigpOworICAgIHRoaXMuc3RyQnVmID0gW107CisgICAgdGhpcy5rbm93bkNvbW1hbmRzID0ga25vd25Db21tYW5kczsKKyAgICB0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID0gMDsKKyAgICB0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3MgPSAtMTsKKyAgfQorCisgIG5leHRDaGFyKCkgeworICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICB9CisKKyAgcGVla0NoYXIoKSB7CisgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBlZWtCeXRlKCk7CisgIH0KKworICBnZXROdW1iZXIoKSB7CisgICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKKyAgICBsZXQgZU5vdGF0aW9uID0gZmFsc2U7CisgICAgbGV0IGRpdmlkZUJ5ID0gMDsKKyAgICBsZXQgc2lnbiA9IDA7CisKKyAgICBpZiAoY2ggPT09IDB4MmQpIHsKKyAgICAgIHNpZ24gPSAtMTsKKyAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgICBpZiAoY2ggPT09IDB4MmQpIHsKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyYikgeworICAgICAgc2lnbiA9IDE7CisgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICB9CisKKyAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICB9IHdoaWxlIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCk7CisgICAgfQorCisgICAgaWYgKGNoID09PSAweDJlKSB7CisgICAgICBkaXZpZGVCeSA9IDEwOworICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgfQorCisgICAgaWYgKGNoIDwgMHgzMCB8fCBjaCA+IDB4MzkpIHsKKyAgICAgIGlmIChkaXZpZGVCeSA9PT0gMTAgJiYgc2lnbiA9PT0gMCAmJiAoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpIHx8IGNoID09PSAtMSkpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJMZXhlci5nZXROdW1iZXIgLSB0cmVhdGluZyBhIHNpbmdsZSBkZWNpbWFsIHBvaW50IGFzIHplcm8uIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgbnVtYmVyOiAke1N0cmluZy5mcm9tQ2hhckNvZGUoY2gpfSAoY2hhckNvZGUgJHtjaH0pYCk7CisgICAgfQorCisgICAgc2lnbiA9IHNpZ24gfHwgMTsKKyAgICBsZXQgYmFzZVZhbHVlID0gY2ggLSAweDMwOworICAgIGxldCBwb3dlclZhbHVlID0gMDsKKyAgICBsZXQgcG93ZXJWYWx1ZVNpZ24gPSAxOworCisgICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgeworICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkgeworICAgICAgICBjb25zdCBjdXJyZW50RGlnaXQgPSBjaCAtIDB4MzA7CisKKyAgICAgICAgaWYgKGVOb3RhdGlvbikgeworICAgICAgICAgIHBvd2VyVmFsdWUgPSBwb3dlclZhbHVlICogMTAgKyBjdXJyZW50RGlnaXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CisgICAgICAgICAgICBkaXZpZGVCeSAqPSAxMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBiYXNlVmFsdWUgPSBiYXNlVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyZSkgeworICAgICAgICBpZiAoZGl2aWRlQnkgPT09IDApIHsKKyAgICAgICAgICBkaXZpZGVCeSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MmQpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJCYWRseSBmb3JtYXR0ZWQgbnVtYmVyOiBtaW51cyBzaWduIGluIHRoZSBtaWRkbGUiKTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NDUgfHwgY2ggPT09IDB4NjUpIHsKKyAgICAgICAgY2ggPSB0aGlzLnBlZWtDaGFyKCk7CisKKyAgICAgICAgaWYgKGNoID09PSAweDJiIHx8IGNoID09PSAweDJkKSB7CisgICAgICAgICAgcG93ZXJWYWx1ZVNpZ24gPSBjaCA9PT0gMHgyZCA/IC0xIDogMTsKKyAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPCAweDMwIHx8IGNoID4gMHgzOSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZU5vdGF0aW9uID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChkaXZpZGVCeSAhPT0gMCkgeworICAgICAgYmFzZVZhbHVlIC89IGRpdmlkZUJ5OworICAgIH0KKworICAgIGlmIChlTm90YXRpb24pIHsKKyAgICAgIGJhc2VWYWx1ZSAqPSAxMCAqKiAocG93ZXJWYWx1ZVNpZ24gKiBwb3dlclZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2lnbiAqIGJhc2VWYWx1ZTsKKyAgfQorCisgIGdldFN0cmluZygpIHsKKyAgICBsZXQgbnVtUGFyZW4gPSAxOworICAgIGxldCBkb25lID0gZmFsc2U7CisgICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CisgICAgc3RyQnVmLmxlbmd0aCA9IDA7CisgICAgbGV0IGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGxldCBjaGFyQnVmZmVyZWQgPSBmYWxzZTsKKworICAgICAgc3dpdGNoIChjaCB8IDApIHsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4Mjg6CisgICAgICAgICAgKytudW1QYXJlbjsKKyAgICAgICAgICBzdHJCdWYucHVzaCgiKCIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgyOToKKyAgICAgICAgICBpZiAoLS1udW1QYXJlbiA9PT0gMCkgeworICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIpIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDVjOgorICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7CisgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDZlOgorICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXG4iKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHg3MjoKKyAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxyIik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4NzQ6CisgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcdCIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDYyOgorICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXGIiKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHg2NjoKKyAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxmIik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4NWM6CisgICAgICAgICAgICBjYXNlIDB4Mjg6CisgICAgICAgICAgICBjYXNlIDB4Mjk6CisgICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHgzMDoKKyAgICAgICAgICAgIGNhc2UgMHgzMToKKyAgICAgICAgICAgIGNhc2UgMHgzMjoKKyAgICAgICAgICAgIGNhc2UgMHgzMzoKKyAgICAgICAgICAgIGNhc2UgMHgzNDoKKyAgICAgICAgICAgIGNhc2UgMHgzNToKKyAgICAgICAgICAgIGNhc2UgMHgzNjoKKyAgICAgICAgICAgIGNhc2UgMHgzNzoKKyAgICAgICAgICAgICAgbGV0IHggPSBjaCAmIDB4MGY7CisgICAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgICBjaGFyQnVmZmVyZWQgPSB0cnVlOworCisgICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKKyAgICAgICAgICAgICAgICB4ID0gKHggPDwgMykgKyAoY2ggJiAweDBmKTsKKyAgICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKKyAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgeCA9ICh4IDw8IDMpICsgKGNoICYgMHgwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh4KSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4MGQ6CisgICAgICAgICAgICAgIGlmICh0aGlzLnBlZWtDaGFyKCkgPT09IDB4MGEpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDBhOgorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICghY2hhckJ1ZmZlcmVkKSB7CisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHJCdWYuam9pbigiIik7CisgIH0KKworICBnZXROYW1lKCkgeworICAgIGxldCBjaCwgcHJldmlvdXNDaDsKKyAgICBjb25zdCBzdHJCdWYgPSB0aGlzLnN0ckJ1ZjsKKyAgICBzdHJCdWYubGVuZ3RoID0gMDsKKworICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgIXNwZWNpYWxDaGFyc1tjaF0pIHsKKyAgICAgIGlmIChjaCA9PT0gMHgyMykgeworICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICBpZiAoc3BlY2lhbENoYXJzW2NoXSkgeworICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTGV4ZXJfZ2V0TmFtZTogIiArICJOVU1CRVIgU0lHTiAoIykgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgaGV4YWRlY2ltYWwgbnVtYmVyLiIpOworICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB4ID0gdG9IZXhEaWdpdChjaCk7CisKKyAgICAgICAgaWYgKHggIT09IC0xKSB7CisgICAgICAgICAgcHJldmlvdXNDaCA9IGNoOworICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgIGNvbnN0IHgyID0gdG9IZXhEaWdpdChjaCk7CisKKyAgICAgICAgICBpZiAoeDIgPT09IC0xKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYExleGVyX2dldE5hbWU6IElsbGVnYWwgZGlnaXQgKCR7U3RyaW5nLmZyb21DaGFyQ29kZShjaCl9KSBgICsgImluIGhleGFkZWNpbWFsIG51bWJlci4iKTsKKyAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIiwgU3RyaW5nLmZyb21DaGFyQ29kZShwcmV2aW91c0NoKSk7CisKKyAgICAgICAgICAgIGlmIChzcGVjaWFsQ2hhcnNbY2hdKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHggPDwgNCB8IHgyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RyQnVmLnB1c2goIiMiLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RyQnVmLmxlbmd0aCA+IDEyNykgeworICAgICAgKDAsIF91dGlsLndhcm4pKGBOYW1lIHRva2VuIGlzIGxvbmdlciB0aGFuIGFsbG93ZWQgYnkgdGhlIHNwZWM6ICR7c3RyQnVmLmxlbmd0aH1gKTsKKyAgICB9CisKKyAgICByZXR1cm4gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoc3RyQnVmLmpvaW4oIiIpKTsKKyAgfQorCisgIF9oZXhTdHJpbmdXYXJuKGNoKSB7CisgICAgY29uc3QgTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4gPSA1OworCisgICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4rKyA9PT0gTUFYX0hFWF9TVFJJTkdfTlVNX1dBUk4pIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKSgiZ2V0SGV4U3RyaW5nIC0gaWdub3JpbmcgYWRkaXRpb25hbCBpbnZhbGlkIGNoYXJhY3RlcnMuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4gPiBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgICgwLCBfdXRpbC53YXJuKShgZ2V0SGV4U3RyaW5nIC0gaWdub3JpbmcgaW52YWxpZCBjaGFyYWN0ZXI6ICR7Y2h9YCk7CisgIH0KKworICBnZXRIZXhTdHJpbmcoKSB7CisgICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CisgICAgc3RyQnVmLmxlbmd0aCA9IDA7CisgICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKKyAgICBsZXQgaXNGaXJzdEhleCA9IHRydWU7CisgICAgbGV0IGZpcnN0RGlnaXQsIHNlY29uZERpZ2l0OworICAgIHRoaXMuX2hleFN0cmluZ051bVdhcm4gPSAwOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnRlcm1pbmF0ZWQgaGV4IHN0cmluZyIpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4M2UpIHsKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAoc3BlY2lhbENoYXJzW2NoXSA9PT0gMSkgeworICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNGaXJzdEhleCkgeworICAgICAgICAgIGZpcnN0RGlnaXQgPSB0b0hleERpZ2l0KGNoKTsKKworICAgICAgICAgIGlmIChmaXJzdERpZ2l0ID09PSAtMSkgeworICAgICAgICAgICAgdGhpcy5faGV4U3RyaW5nV2FybihjaCk7CisKKyAgICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlY29uZERpZ2l0ID0gdG9IZXhEaWdpdChjaCk7CisKKyAgICAgICAgICBpZiAoc2Vjb25kRGlnaXQgPT09IC0xKSB7CisgICAgICAgICAgICB0aGlzLl9oZXhTdHJpbmdXYXJuKGNoKTsKKworICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGZpcnN0RGlnaXQgPDwgNCB8IHNlY29uZERpZ2l0KSk7CisgICAgICAgIH0KKworICAgICAgICBpc0ZpcnN0SGV4ID0gIWlzRmlyc3RIZXg7CisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHJCdWYuam9pbigiIik7CisgIH0KKworICBnZXRPYmooKSB7CisgICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKKyAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkVPRjsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbW1lbnQpIHsKKyAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CisgICAgICAgICAgY29tbWVudCA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CisgICAgICAgIGNvbW1lbnQgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdICE9PSAxKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNoIHwgMCkgeworICAgICAgY2FzZSAweDMwOgorICAgICAgY2FzZSAweDMxOgorICAgICAgY2FzZSAweDMyOgorICAgICAgY2FzZSAweDMzOgorICAgICAgY2FzZSAweDM0OgorICAgICAgY2FzZSAweDM1OgorICAgICAgY2FzZSAweDM2OgorICAgICAgY2FzZSAweDM3OgorICAgICAgY2FzZSAweDM4OgorICAgICAgY2FzZSAweDM5OgorICAgICAgY2FzZSAweDJiOgorICAgICAgY2FzZSAweDJkOgorICAgICAgY2FzZSAweDJlOgorICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTsKKworICAgICAgY2FzZSAweDI4OgorICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoKTsKKworICAgICAgY2FzZSAweDJmOgorICAgICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCk7CisKKyAgICAgIGNhc2UgMHg1YjoKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgiWyIpOworCisgICAgICBjYXNlIDB4NWQ6CisgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIl0iKTsKKworICAgICAgY2FzZSAweDNjOgorICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICBpZiAoY2ggPT09IDB4M2MpIHsKKyAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIjw8Iik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5nZXRIZXhTdHJpbmcoKTsKKworICAgICAgY2FzZSAweDNlOgorICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKworICAgICAgICBpZiAoY2ggPT09IDB4M2UpIHsKKyAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIj4+Iik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgiPiIpOworCisgICAgICBjYXNlIDB4N2I6CisgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoInsiKTsKKworICAgICAgY2FzZSAweDdkOgorICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJ9Iik7CisKKyAgICAgIGNhc2UgMHgyOToKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYElsbGVnYWwgY2hhcmFjdGVyOiAke2NofWApOworICAgIH0KKworICAgIGxldCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKyAgICBjb25zdCBrbm93bkNvbW1hbmRzID0gdGhpcy5rbm93bkNvbW1hbmRzOworICAgIGxldCBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHMgJiYga25vd25Db21tYW5kc1tzdHJdICE9PSB1bmRlZmluZWQ7CisKKyAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmICFzcGVjaWFsQ2hhcnNbY2hdKSB7CisgICAgICBjb25zdCBwb3NzaWJsZUNvbW1hbmQgPSBzdHIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKKworICAgICAgaWYgKGtub3duQ29tbWFuZEZvdW5kICYmIGtub3duQ29tbWFuZHNbcG9zc2libGVDb21tYW5kXSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTI4KSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHtzdHIubGVuZ3RofWApOworICAgICAgfQorCisgICAgICBzdHIgPSBwb3NzaWJsZUNvbW1hbmQ7CisgICAgICBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHMgJiYga25vd25Db21tYW5kc1tzdHJdICE9PSB1bmRlZmluZWQ7CisgICAgfQorCisgICAgaWYgKHN0ciA9PT0gInRydWUiKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoc3RyID09PSAiZmFsc2UiKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0ciA9PT0gIm51bGwiKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAoc3RyID09PSAiQkkiKSB7CisgICAgICB0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3MgPSB0aGlzLnN0cmVhbS5wb3M7CisgICAgfQorCisgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoc3RyKTsKKyAgfQorCisgIHBlZWtPYmooKSB7CisgICAgY29uc3Qgc3RyZWFtUG9zID0gdGhpcy5zdHJlYW0ucG9zLAorICAgICAgICAgIGN1cnJlbnRDaGFyID0gdGhpcy5jdXJyZW50Q2hhciwKKyAgICAgICAgICBiZWdpbklubGluZUltYWdlUG9zID0gdGhpcy5iZWdpbklubGluZUltYWdlUG9zOworICAgIGxldCBuZXh0T2JqOworCisgICAgdHJ5IHsKKyAgICAgIG5leHRPYmogPSB0aGlzLmdldE9iaigpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgeworICAgICAgICB0aHJvdyBleDsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBwZWVrT2JqOiAke2V4fWApOworICAgIH0KKworICAgIHRoaXMuc3RyZWFtLnBvcyA9IHN0cmVhbVBvczsKKyAgICB0aGlzLmN1cnJlbnRDaGFyID0gY3VycmVudENoYXI7CisgICAgdGhpcy5iZWdpbklubGluZUltYWdlUG9zID0gYmVnaW5JbmxpbmVJbWFnZVBvczsKKyAgICByZXR1cm4gbmV4dE9iajsKKyAgfQorCisgIHNraXBUb05leHRMaW5lKCkgeworICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CisKKyAgICB3aGlsZSAoY2ggPj0gMCkgeworICAgICAgaWYgKGNoID09PSAweDBkKSB7CisgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworCisgICAgICAgIGlmIChjaCA9PT0gMHgwYSkgeworICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgwYSkgeworICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLkxleGVyID0gTGV4ZXI7CisKK2NsYXNzIExpbmVhcml6YXRpb24geworICBzdGF0aWMgY3JlYXRlKHN0cmVhbSkgeworICAgIGZ1bmN0aW9uIGdldEludChsaW5EaWN0LCBuYW1lLCBhbGxvd1plcm9WYWx1ZSA9IGZhbHNlKSB7CisgICAgICBjb25zdCBvYmogPSBsaW5EaWN0LmdldChuYW1lKTsKKworICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSAmJiAoYWxsb3daZXJvVmFsdWUgPyBvYmogPj0gMCA6IG9iaiA+IDApKSB7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICIke25hbWV9IiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gYCArICJkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gZ2V0SGludHMobGluRGljdCkgeworICAgICAgY29uc3QgaGludHMgPSBsaW5EaWN0LmdldCgiSCIpOworICAgICAgbGV0IGhpbnRzTGVuZ3RoOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShoaW50cykgJiYgKChoaW50c0xlbmd0aCA9IGhpbnRzLmxlbmd0aCkgPT09IDIgfHwgaGludHNMZW5ndGggPT09IDQpKSB7CisgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBoaW50c0xlbmd0aDsgaW5kZXgrKykgeworICAgICAgICAgIGNvbnN0IGhpbnQgPSBoaW50c1tpbmRleF07CisKKyAgICAgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKGhpbnQpICYmIGhpbnQgPiAwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIaW50ICgke2luZGV4fSkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmApOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoaW50czsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKTsKKyAgICB9CisKKyAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHsKKyAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKKyAgICAgIHhyZWY6IG51bGwKKyAgICB9KTsKKyAgICBjb25zdCBvYmoxID0gcGFyc2VyLmdldE9iaigpOworICAgIGNvbnN0IG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CisgICAgY29uc3Qgb2JqMyA9IHBhcnNlci5nZXRPYmooKTsKKyAgICBjb25zdCBsaW5EaWN0ID0gcGFyc2VyLmdldE9iaigpOworICAgIGxldCBvYmosIGxlbmd0aDsKKworICAgIGlmICghKE51bWJlci5pc0ludGVnZXIob2JqMSkgJiYgTnVtYmVyLmlzSW50ZWdlcihvYmoyKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iajMsICJvYmoiKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShsaW5EaWN0KSAmJiAoMCwgX3V0aWwuaXNOdW0pKG9iaiA9IGxpbkRpY3QuZ2V0KCJMaW5lYXJpemVkIikpICYmIG9iaiA+IDApKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgaWYgKChsZW5ndGggPSBnZXRJbnQobGluRGljdCwgIkwiKSkgIT09IHN0cmVhbS5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignVGhlICJMIiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSAnICsgImRvZXMgbm90IGVxdWFsIHRoZSBzdHJlYW0gbGVuZ3RoLiIpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBsZW5ndGgsCisgICAgICBoaW50czogZ2V0SGludHMobGluRGljdCksCisgICAgICBvYmplY3ROdW1iZXJGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJPIiksCisgICAgICBlbmRGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJFIiksCisgICAgICBudW1QYWdlczogZ2V0SW50KGxpbkRpY3QsICJOIiksCisgICAgICBtYWluWFJlZkVudHJpZXNPZmZzZXQ6IGdldEludChsaW5EaWN0LCAiVCIpLAorICAgICAgcGFnZUZpcnN0OiBsaW5EaWN0LmhhcygiUCIpID8gZ2V0SW50KGxpbkRpY3QsICJQIiwgdHJ1ZSkgOiAwCisgICAgfTsKKyAgfQorCit9CisKK2V4cG9ydHMuTGluZWFyaXphdGlvbiA9IExpbmVhcml6YXRpb247ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvcGF0dGVybi5qcyBiL2xpYi9jb3JlL3BhdHRlcm4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkNWRlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL3BhdHRlcm4uanMKQEAgLTAsMCArMSw5NjcgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmdldFRpbGluZ1BhdHRlcm5JUiA9IGdldFRpbGluZ1BhdHRlcm5JUjsKK2V4cG9ydHMuUGF0dGVybiA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9jb2xvcnNwYWNlID0gcmVxdWlyZSgiLi9jb2xvcnNwYWNlLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4vcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX2NvcmVfdXRpbHMgPSByZXF1aXJlKCIuL2NvcmVfdXRpbHMuanMiKTsKKwordmFyIFNoYWRpbmdUeXBlID0geworICBGVU5DVElPTl9CQVNFRDogMSwKKyAgQVhJQUw6IDIsCisgIFJBRElBTDogMywKKyAgRlJFRV9GT1JNX01FU0g6IDQsCisgIExBVFRJQ0VfRk9STV9NRVNIOiA1LAorICBDT09OU19QQVRDSF9NRVNIOiA2LAorICBURU5TT1JfUEFUQ0hfTUVTSDogNworfTsKKwordmFyIFBhdHRlcm4gPSBmdW5jdGlvbiBQYXR0ZXJuQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gUGF0dGVybigpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgUGF0dGVybiBjb25zdHJ1Y3RvciIpOworICB9CisKKyAgUGF0dGVybi5wcm90b3R5cGUgPSB7CisgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gUGF0dGVybl9nZXRQYXR0ZXJuKGN0eCkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShgU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm4uZ2V0U3R5bGU6ICR7Y3R4fWApOworICAgIH0KKyAgfTsKKworICBQYXR0ZXJuLnBhcnNlU2hhZGluZyA9IGZ1bmN0aW9uIChzaGFkaW5nLCBtYXRyaXgsIHhyZWYsIHJlcywgaGFuZGxlciwgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIHZhciBkaWN0ID0gKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShzaGFkaW5nKSA/IHNoYWRpbmcuZGljdCA6IHNoYWRpbmc7CisgICAgdmFyIHR5cGUgPSBkaWN0LmdldCgiU2hhZGluZ1R5cGUiKTsKKworICAgIHRyeSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5BWElBTDoKKyAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5SQURJQUw6CisgICAgICAgICAgcmV0dXJuIG5ldyBTaGFkaW5ncy5SYWRpYWxBeGlhbChkaWN0LCBtYXRyaXgsIHhyZWYsIHJlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisKKyAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5GUkVFX0ZPUk1fTUVTSDoKKyAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5MQVRUSUNFX0ZPUk1fTUVTSDoKKyAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5DT09OU19QQVRDSF9NRVNIOgorICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLlRFTlNPUl9QQVRDSF9NRVNIOgorICAgICAgICAgIHJldHVybiBuZXcgU2hhZGluZ3MuTWVzaChzaGFkaW5nLCBtYXRyaXgsIHhyZWYsIHJlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVuc3VwcG9ydGVkIFNoYWRpbmdUeXBlOiAiICsgdHlwZSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorCisgICAgICBoYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgZmVhdHVyZUlkOiBfdXRpbC5VTlNVUFBPUlRFRF9GRUFUVVJFUy5zaGFkaW5nUGF0dGVybgorICAgICAgfSk7CisgICAgICAoMCwgX3V0aWwud2FybikoZXgpOworICAgICAgcmV0dXJuIG5ldyBTaGFkaW5ncy5EdW1teSgpOworICAgIH0KKyAgfTsKKworICByZXR1cm4gUGF0dGVybjsKK30oKTsKKworZXhwb3J0cy5QYXR0ZXJuID0gUGF0dGVybjsKK3ZhciBTaGFkaW5ncyA9IHt9OworU2hhZGluZ3MuU01BTExfTlVNQkVSID0gMWUtNjsKKworU2hhZGluZ3MuUmFkaWFsQXhpYWwgPSBmdW5jdGlvbiBSYWRpYWxBeGlhbENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFJhZGlhbEF4aWFsKGRpY3QsIG1hdHJpeCwgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CisgICAgdGhpcy5tYXRyaXggPSBtYXRyaXg7CisgICAgdGhpcy5jb29yZHNBcnIgPSBkaWN0LmdldEFycmF5KCJDb29yZHMiKTsKKyAgICB0aGlzLnNoYWRpbmdUeXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CisgICAgdGhpcy50eXBlID0gIlBhdHRlcm4iOworCisgICAgY29uc3QgY3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKKyAgICAgIGNzOiBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpIHx8IGRpY3QuZ2V0UmF3KCJDUyIpLAorICAgICAgeHJlZiwKKyAgICAgIHJlc291cmNlcywKKyAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgfSk7CisKKyAgICB0aGlzLmNzID0gY3M7CisgICAgY29uc3QgYmJveCA9IGRpY3QuZ2V0QXJyYXkoIkJCb3giKTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7CisgICAgICB0aGlzLmJib3ggPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuYmJveCA9IG51bGw7CisgICAgfQorCisgICAgdmFyIHQwID0gMC4wLAorICAgICAgICB0MSA9IDEuMDsKKworICAgIGlmIChkaWN0LmhhcygiRG9tYWluIikpIHsKKyAgICAgIHZhciBkb21haW5BcnIgPSBkaWN0LmdldEFycmF5KCJEb21haW4iKTsKKyAgICAgIHQwID0gZG9tYWluQXJyWzBdOworICAgICAgdDEgPSBkb21haW5BcnJbMV07CisgICAgfQorCisgICAgdmFyIGV4dGVuZFN0YXJ0ID0gZmFsc2UsCisgICAgICAgIGV4dGVuZEVuZCA9IGZhbHNlOworCisgICAgaWYgKGRpY3QuaGFzKCJFeHRlbmQiKSkgeworICAgICAgdmFyIGV4dGVuZEFyciA9IGRpY3QuZ2V0QXJyYXkoIkV4dGVuZCIpOworICAgICAgZXh0ZW5kU3RhcnQgPSBleHRlbmRBcnJbMF07CisgICAgICBleHRlbmRFbmQgPSBleHRlbmRBcnJbMV07CisgICAgfQorCisgICAgaWYgKHRoaXMuc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCAmJiAoIWV4dGVuZFN0YXJ0IHx8ICFleHRlbmRFbmQpKSB7CisgICAgICB2YXIgeDEgPSB0aGlzLmNvb3Jkc0FyclswXTsKKyAgICAgIHZhciB5MSA9IHRoaXMuY29vcmRzQXJyWzFdOworICAgICAgdmFyIHIxID0gdGhpcy5jb29yZHNBcnJbMl07CisgICAgICB2YXIgeDIgPSB0aGlzLmNvb3Jkc0FyclszXTsKKyAgICAgIHZhciB5MiA9IHRoaXMuY29vcmRzQXJyWzRdOworICAgICAgdmFyIHIyID0gdGhpcy5jb29yZHNBcnJbNV07CisgICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoKHgxIC0geDIpICogKHgxIC0geDIpICsgKHkxIC0geTIpICogKHkxIC0geTIpKTsKKworICAgICAgaWYgKHIxIDw9IHIyICsgZGlzdGFuY2UgJiYgcjIgPD0gcjEgKyBkaXN0YW5jZSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmV4dGVuZFN0YXJ0ID0gZXh0ZW5kU3RhcnQ7CisgICAgdGhpcy5leHRlbmRFbmQgPSBleHRlbmRFbmQ7CisgICAgdmFyIGZuT2JqID0gZGljdC5nZXRSYXcoIkZ1bmN0aW9uIik7CisgICAgdmFyIGZuID0gcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZUZyb21BcnJheShmbk9iaik7CisgICAgY29uc3QgTlVNQkVSX09GX1NBTVBMRVMgPSAxMDsKKyAgICBjb25zdCBzdGVwID0gKHQxIC0gdDApIC8gTlVNQkVSX09GX1NBTVBMRVM7CisgICAgdmFyIGNvbG9yU3RvcHMgPSB0aGlzLmNvbG9yU3RvcHMgPSBbXTsKKworICAgIGlmICh0MCA+PSB0MSB8fCBzdGVwIDw9IDApIHsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiQmFkIHNoYWRpbmcgZG9tYWluLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBjb2xvciA9IG5ldyBGbG9hdDMyQXJyYXkoY3MubnVtQ29tcHMpLAorICAgICAgICByYXRpbyA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CisgICAgdmFyIHJnYkNvbG9yOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gTlVNQkVSX09GX1NBTVBMRVM7IGkrKykgeworICAgICAgcmF0aW9bMF0gPSB0MCArIGkgKiBzdGVwOworICAgICAgZm4ocmF0aW8sIDAsIGNvbG9yLCAwKTsKKyAgICAgIHJnYkNvbG9yID0gY3MuZ2V0UmdiKGNvbG9yLCAwKTsKKworICAgICAgdmFyIGNzc0NvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKHJnYkNvbG9yWzBdLCByZ2JDb2xvclsxXSwgcmdiQ29sb3JbMl0pOworCisgICAgICBjb2xvclN0b3BzLnB1c2goW2kgLyBOVU1CRVJfT0ZfU0FNUExFUywgY3NzQ29sb3JdKTsKKyAgICB9CisKKyAgICB2YXIgYmFja2dyb3VuZCA9ICJ0cmFuc3BhcmVudCI7CisKKyAgICBpZiAoZGljdC5oYXMoIkJhY2tncm91bmQiKSkgeworICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoZGljdC5nZXQoIkJhY2tncm91bmQiKSwgMCk7CisgICAgICBiYWNrZ3JvdW5kID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKHJnYkNvbG9yWzBdLCByZ2JDb2xvclsxXSwgcmdiQ29sb3JbMl0pOworICAgIH0KKworICAgIGlmICghZXh0ZW5kU3RhcnQpIHsKKyAgICAgIGNvbG9yU3RvcHMudW5zaGlmdChbMCwgYmFja2dyb3VuZF0pOworICAgICAgY29sb3JTdG9wc1sxXVswXSArPSBTaGFkaW5ncy5TTUFMTF9OVU1CRVI7CisgICAgfQorCisgICAgaWYgKCFleHRlbmRFbmQpIHsKKyAgICAgIGNvbG9yU3RvcHNbY29sb3JTdG9wcy5sZW5ndGggLSAxXVswXSAtPSBTaGFkaW5ncy5TTUFMTF9OVU1CRVI7CisgICAgICBjb2xvclN0b3BzLnB1c2goWzEsIGJhY2tncm91bmRdKTsKKyAgICB9CisKKyAgICB0aGlzLmNvbG9yU3RvcHMgPSBjb2xvclN0b3BzOworICB9CisKKyAgUmFkaWFsQXhpYWwucHJvdG90eXBlID0geworICAgIGdldElSOiBmdW5jdGlvbiBSYWRpYWxBeGlhbF9nZXRJUigpIHsKKyAgICAgIHZhciBjb29yZHNBcnIgPSB0aGlzLmNvb3Jkc0FycjsKKyAgICAgIHZhciBzaGFkaW5nVHlwZSA9IHRoaXMuc2hhZGluZ1R5cGU7CisgICAgICB2YXIgdHlwZSwgcDAsIHAxLCByMCwgcjE7CisKKyAgICAgIGlmIChzaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuQVhJQUwpIHsKKyAgICAgICAgcDAgPSBbY29vcmRzQXJyWzBdLCBjb29yZHNBcnJbMV1dOworICAgICAgICBwMSA9IFtjb29yZHNBcnJbMl0sIGNvb3Jkc0FyclszXV07CisgICAgICAgIHIwID0gbnVsbDsKKyAgICAgICAgcjEgPSBudWxsOworICAgICAgICB0eXBlID0gImF4aWFsIjsKKyAgICAgIH0gZWxzZSBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkgeworICAgICAgICBwMCA9IFtjb29yZHNBcnJbMF0sIGNvb3Jkc0FyclsxXV07CisgICAgICAgIHAxID0gW2Nvb3Jkc0FyclszXSwgY29vcmRzQXJyWzRdXTsKKyAgICAgICAgcjAgPSBjb29yZHNBcnJbMl07CisgICAgICAgIHIxID0gY29vcmRzQXJyWzVdOworICAgICAgICB0eXBlID0gInJhZGlhbCI7CisgICAgICB9IGVsc2UgeworICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKGBnZXRQYXR0ZXJuIHR5cGUgdW5rbm93bjogJHtzaGFkaW5nVHlwZX1gKTsKKyAgICAgIH0KKworICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4OworCisgICAgICBpZiAobWF0cml4KSB7CisgICAgICAgIHAwID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShwMCwgbWF0cml4KTsKKyAgICAgICAgcDEgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKHAxLCBtYXRyaXgpOworCisgICAgICAgIGlmIChzaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMKSB7CisgICAgICAgICAgdmFyIHNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtYXRyaXgpOworCisgICAgICAgICAgcjAgKj0gc2NhbGVbMF07CisgICAgICAgICAgcjEgKj0gc2NhbGVbMV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIFsiUmFkaWFsQXhpYWwiLCB0eXBlLCB0aGlzLmJib3gsIHRoaXMuY29sb3JTdG9wcywgcDAsIHAxLCByMCwgcjFdOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIFJhZGlhbEF4aWFsOworfSgpOworCitTaGFkaW5ncy5NZXNoID0gZnVuY3Rpb24gTWVzaENsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXIoc3RyZWFtLCBjb250ZXh0KSB7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB0aGlzLmJ1ZmZlciA9IDA7CisgICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOworICAgIHZhciBudW1Db21wcyA9IGNvbnRleHQubnVtQ29tcHM7CisgICAgdGhpcy50bXBDb21wc0J1ZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtQ29tcHMpOworICAgIHZhciBjc051bUNvbXBzID0gY29udGV4dC5jb2xvclNwYWNlLm51bUNvbXBzOworICAgIHRoaXMudG1wQ3NDb21wc0J1ZiA9IGNvbnRleHQuY29sb3JGbiA/IG5ldyBGbG9hdDMyQXJyYXkoY3NOdW1Db21wcykgOiB0aGlzLnRtcENvbXBzQnVmOworICB9CisKKyAgTWVzaFN0cmVhbVJlYWRlci5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGhhc0RhdGEoKSB7CisgICAgICBpZiAodGhpcy5zdHJlYW0uZW5kKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5wb3MgPCB0aGlzLnN0cmVhbS5lbmQ7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmJ1ZmZlckxlbmd0aCA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHZhciBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKKworICAgICAgaWYgKG5leHRCeXRlIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVmZmVyID0gbmV4dEJ5dGU7CisgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDg7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCisgICAgcmVhZEJpdHM6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZEJpdHMobikgeworICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOworICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworCisgICAgICBpZiAobiA9PT0gMzIpIHsKKyAgICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIHJldHVybiAodGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDI0IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDE2IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDggfCB0aGlzLnN0cmVhbS5nZXRCeXRlKCkpID4+PiAwOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDI0IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDE2IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDggfCB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CisgICAgICAgIHZhciBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKKyAgICAgICAgdGhpcy5idWZmZXIgPSBuZXh0Qnl0ZSAmICgxIDw8IGJ1ZmZlckxlbmd0aCkgLSAxOworICAgICAgICByZXR1cm4gKGJ1ZmZlciA8PCA4IC0gYnVmZmVyTGVuZ3RoIHwgKG5leHRCeXRlICYgMHhmZikgPj4gYnVmZmVyTGVuZ3RoKSA+Pj4gMDsKKyAgICAgIH0KKworICAgICAgaWYgKG4gPT09IDggJiYgYnVmZmVyTGVuZ3RoID09PSAwKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChidWZmZXJMZW5ndGggPCBuKSB7CisgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCA4IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOworICAgICAgICBidWZmZXJMZW5ndGggKz0gODsKKyAgICAgIH0KKworICAgICAgYnVmZmVyTGVuZ3RoIC09IG47CisgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyICYgKDEgPDwgYnVmZmVyTGVuZ3RoKSAtIDE7CisgICAgICByZXR1cm4gYnVmZmVyID4+IGJ1ZmZlckxlbmd0aDsKKyAgICB9LAorICAgIGFsaWduOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX2FsaWduKCkgeworICAgICAgdGhpcy5idWZmZXIgPSAwOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOworICAgIH0sCisgICAgcmVhZEZsYWc6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZEZsYWcoKSB7CisgICAgICByZXR1cm4gdGhpcy5yZWFkQml0cyh0aGlzLmNvbnRleHQuYml0c1BlckZsYWcpOworICAgIH0sCisgICAgcmVhZENvb3JkaW5hdGU6IGZ1bmN0aW9uIE1lc2hTdHJlYW1SZWFkZXJfcmVhZENvb3JkaW5hdGUoKSB7CisgICAgICB2YXIgYml0c1BlckNvb3JkaW5hdGUgPSB0aGlzLmNvbnRleHQuYml0c1BlckNvb3JkaW5hdGU7CisgICAgICB2YXIgeGkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTsKKyAgICAgIHZhciB5aSA9IHRoaXMucmVhZEJpdHMoYml0c1BlckNvb3JkaW5hdGUpOworICAgICAgdmFyIGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7CisgICAgICB2YXIgc2NhbGUgPSBiaXRzUGVyQ29vcmRpbmF0ZSA8IDMyID8gMSAvICgoMSA8PCBiaXRzUGVyQ29vcmRpbmF0ZSkgLSAxKSA6IDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7CisgICAgICByZXR1cm4gW3hpICogc2NhbGUgKiAoZGVjb2RlWzFdIC0gZGVjb2RlWzBdKSArIGRlY29kZVswXSwgeWkgKiBzY2FsZSAqIChkZWNvZGVbM10gLSBkZWNvZGVbMl0pICsgZGVjb2RlWzJdXTsKKyAgICB9LAorICAgIHJlYWRDb21wb25lbnRzOiBmdW5jdGlvbiBNZXNoU3RyZWFtUmVhZGVyX3JlYWRDb21wb25lbnRzKCkgeworICAgICAgdmFyIG51bUNvbXBzID0gdGhpcy5jb250ZXh0Lm51bUNvbXBzOworICAgICAgdmFyIGJpdHNQZXJDb21wb25lbnQgPSB0aGlzLmNvbnRleHQuYml0c1BlckNvbXBvbmVudDsKKyAgICAgIHZhciBzY2FsZSA9IGJpdHNQZXJDb21wb25lbnQgPCAzMiA/IDEgLyAoKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxKSA6IDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7CisgICAgICB2YXIgZGVjb2RlID0gdGhpcy5jb250ZXh0LmRlY29kZTsKKyAgICAgIHZhciBjb21wb25lbnRzID0gdGhpcy50bXBDb21wc0J1ZjsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSA0OyBpIDwgbnVtQ29tcHM7IGkrKywgaiArPSAyKSB7CisgICAgICAgIHZhciBjaSA9IHRoaXMucmVhZEJpdHMoYml0c1BlckNvbXBvbmVudCk7CisgICAgICAgIGNvbXBvbmVudHNbaV0gPSBjaSAqIHNjYWxlICogKGRlY29kZVtqICsgMV0gLSBkZWNvZGVbal0pICsgZGVjb2RlW2pdOworICAgICAgfQorCisgICAgICB2YXIgY29sb3IgPSB0aGlzLnRtcENzQ29tcHNCdWY7CisKKyAgICAgIGlmICh0aGlzLmNvbnRleHQuY29sb3JGbikgeworICAgICAgICB0aGlzLmNvbnRleHQuY29sb3JGbihjb21wb25lbnRzLCAwLCBjb2xvciwgMCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29sb3JTcGFjZS5nZXRSZ2IoY29sb3IsIDApOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBkZWNvZGVUeXBlNFNoYWRpbmcobWVzaCwgcmVhZGVyKSB7CisgICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzOworICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9yczsKKyAgICB2YXIgb3BlcmF0b3JzID0gW107CisgICAgdmFyIHBzID0gW107CisgICAgdmFyIHZlcnRpY2VzTGVmdCA9IDA7CisKKyAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKKyAgICAgIHZhciBmID0gcmVhZGVyLnJlYWRGbGFnKCk7CisgICAgICB2YXIgY29vcmQgPSByZWFkZXIucmVhZENvb3JkaW5hdGUoKTsKKyAgICAgIHZhciBjb2xvciA9IHJlYWRlci5yZWFkQ29tcG9uZW50cygpOworCisgICAgICBpZiAodmVydGljZXNMZWZ0ID09PSAwKSB7CisgICAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDIpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU0IGZsYWciKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZikgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHBzLnB1c2gocHNbcHMubGVuZ3RoIC0gMl0sIHBzW3BzLmxlbmd0aCAtIDFdKTsKKyAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHBzLnB1c2gocHNbcHMubGVuZ3RoIC0gM10sIHBzW3BzLmxlbmd0aCAtIDFdKTsKKyAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG9wZXJhdG9ycy5wdXNoKGYpOworICAgICAgfQorCisgICAgICBwcy5wdXNoKGNvb3Jkcy5sZW5ndGgpOworICAgICAgY29vcmRzLnB1c2goY29vcmQpOworICAgICAgY29sb3JzLnB1c2goY29sb3IpOworICAgICAgdmVydGljZXNMZWZ0LS07CisgICAgICByZWFkZXIuYWxpZ24oKTsKKyAgICB9CisKKyAgICBtZXNoLmZpZ3VyZXMucHVzaCh7CisgICAgICB0eXBlOiAidHJpYW5nbGVzIiwKKyAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAorICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShwcykKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVR5cGU1U2hhZGluZyhtZXNoLCByZWFkZXIsIHZlcnRpY2VzUGVyUm93KSB7CisgICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzOworICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9yczsKKyAgICB2YXIgcHMgPSBbXTsKKworICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkgeworICAgICAgdmFyIGNvb3JkID0gcmVhZGVyLnJlYWRDb29yZGluYXRlKCk7CisgICAgICB2YXIgY29sb3IgPSByZWFkZXIucmVhZENvbXBvbmVudHMoKTsKKyAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CisgICAgICBjb29yZHMucHVzaChjb29yZCk7CisgICAgICBjb2xvcnMucHVzaChjb2xvcik7CisgICAgfQorCisgICAgbWVzaC5maWd1cmVzLnB1c2goeworICAgICAgdHlwZTogImxhdHRpY2UiLAorICAgICAgY29vcmRzOiBuZXcgSW50MzJBcnJheShwcyksCisgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KHBzKSwKKyAgICAgIHZlcnRpY2VzUGVyUm93CisgICAgfSk7CisgIH0KKworICB2YXIgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQgPSAzOworICB2YXIgTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQgPSAyMDsKKyAgdmFyIFRSSUFOR0xFX0RFTlNJVFkgPSAyMDsKKworICB2YXIgZ2V0QiA9IGZ1bmN0aW9uIGdldEJDbG9zdXJlKCkgeworICAgIGZ1bmN0aW9uIGJ1aWxkQihjb3VudCkgeworICAgICAgdmFyIGx1dCA9IFtdOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgIHZhciB0ID0gaSAvIGNvdW50LAorICAgICAgICAgICAgdF8gPSAxIC0gdDsKKyAgICAgICAgbHV0LnB1c2gobmV3IEZsb2F0MzJBcnJheShbdF8gKiB0XyAqIHRfLCAzICogdCAqIHRfICogdF8sIDMgKiB0ICogdCAqIHRfLCB0ICogdCAqIHRdKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBsdXQ7CisgICAgfQorCisgICAgdmFyIGNhY2hlID0gW107CisgICAgcmV0dXJuIGZ1bmN0aW9uIGdldEIoY291bnQpIHsKKyAgICAgIGlmICghY2FjaGVbY291bnRdKSB7CisgICAgICAgIGNhY2hlW2NvdW50XSA9IGJ1aWxkQihjb3VudCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjYWNoZVtjb3VudF07CisgICAgfTsKKyAgfSgpOworCisgIGZ1bmN0aW9uIGJ1aWxkRmlndXJlRnJvbVBhdGNoKG1lc2gsIGluZGV4KSB7CisgICAgdmFyIGZpZ3VyZSA9IG1lc2guZmlndXJlc1tpbmRleF07CisgICAgKDAsIF91dGlsLmFzc2VydCkoZmlndXJlLnR5cGUgPT09ICJwYXRjaCIsICJVbmV4cGVjdGVkIHBhdGNoIG1lc2ggZmlndXJlIik7CisgICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzLAorICAgICAgICBjb2xvcnMgPSBtZXNoLmNvbG9yczsKKyAgICB2YXIgcGkgPSBmaWd1cmUuY29vcmRzOworICAgIHZhciBjaSA9IGZpZ3VyZS5jb2xvcnM7CisgICAgdmFyIGZpZ3VyZU1pblggPSBNYXRoLm1pbihjb29yZHNbcGlbMF1dWzBdLCBjb29yZHNbcGlbM11dWzBdLCBjb29yZHNbcGlbMTJdXVswXSwgY29vcmRzW3BpWzE1XV1bMF0pOworICAgIHZhciBmaWd1cmVNaW5ZID0gTWF0aC5taW4oY29vcmRzW3BpWzBdXVsxXSwgY29vcmRzW3BpWzNdXVsxXSwgY29vcmRzW3BpWzEyXV1bMV0sIGNvb3Jkc1twaVsxNV1dWzFdKTsKKyAgICB2YXIgZmlndXJlTWF4WCA9IE1hdGgubWF4KGNvb3Jkc1twaVswXV1bMF0sIGNvb3Jkc1twaVszXV1bMF0sIGNvb3Jkc1twaVsxMl1dWzBdLCBjb29yZHNbcGlbMTVdXVswXSk7CisgICAgdmFyIGZpZ3VyZU1heFkgPSBNYXRoLm1heChjb29yZHNbcGlbMF1dWzFdLCBjb29yZHNbcGlbM11dWzFdLCBjb29yZHNbcGlbMTJdXVsxXSwgY29vcmRzW3BpWzE1XV1bMV0pOworICAgIHZhciBzcGxpdFhCeSA9IE1hdGguY2VpbCgoZmlndXJlTWF4WCAtIGZpZ3VyZU1pblgpICogVFJJQU5HTEVfREVOU0lUWSAvIChtZXNoLmJvdW5kc1syXSAtIG1lc2guYm91bmRzWzBdKSk7CisgICAgc3BsaXRYQnkgPSBNYXRoLm1heChNSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgTWF0aC5taW4oTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIHNwbGl0WEJ5KSk7CisgICAgdmFyIHNwbGl0WUJ5ID0gTWF0aC5jZWlsKChmaWd1cmVNYXhZIC0gZmlndXJlTWluWSkgKiBUUklBTkdMRV9ERU5TSVRZIC8gKG1lc2guYm91bmRzWzNdIC0gbWVzaC5ib3VuZHNbMV0pKTsKKyAgICBzcGxpdFlCeSA9IE1hdGgubWF4KE1JTl9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULCBNYXRoLm1pbihNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgc3BsaXRZQnkpKTsKKyAgICB2YXIgdmVydGljZXNQZXJSb3cgPSBzcGxpdFhCeSArIDE7CisgICAgdmFyIGZpZ3VyZUNvb3JkcyA9IG5ldyBJbnQzMkFycmF5KChzcGxpdFlCeSArIDEpICogdmVydGljZXNQZXJSb3cpOworICAgIHZhciBmaWd1cmVDb2xvcnMgPSBuZXcgSW50MzJBcnJheSgoc3BsaXRZQnkgKyAxKSAqIHZlcnRpY2VzUGVyUm93KTsKKyAgICB2YXIgayA9IDA7CisgICAgdmFyIGNsID0gbmV3IFVpbnQ4QXJyYXkoMyksCisgICAgICAgIGNyID0gbmV3IFVpbnQ4QXJyYXkoMyk7CisgICAgdmFyIGMwID0gY29sb3JzW2NpWzBdXSwKKyAgICAgICAgYzEgPSBjb2xvcnNbY2lbMV1dLAorICAgICAgICBjMiA9IGNvbG9yc1tjaVsyXV0sCisgICAgICAgIGMzID0gY29sb3JzW2NpWzNdXTsKKyAgICB2YXIgYlJvdyA9IGdldEIoc3BsaXRZQnkpLAorICAgICAgICBiQ29sID0gZ2V0QihzcGxpdFhCeSk7CisKKyAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPD0gc3BsaXRZQnk7IHJvdysrKSB7CisgICAgICBjbFswXSA9IChjMFswXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlswXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CisgICAgICBjbFsxXSA9IChjMFsxXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlsxXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CisgICAgICBjbFsyXSA9IChjMFsyXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlsyXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CisgICAgICBjclswXSA9IChjMVswXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1swXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CisgICAgICBjclsxXSA9IChjMVsxXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1sxXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CisgICAgICBjclsyXSA9IChjMVsyXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1syXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CisKKyAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8PSBzcGxpdFhCeTsgY29sKyssIGsrKykgeworICAgICAgICBpZiAoKHJvdyA9PT0gMCB8fCByb3cgPT09IHNwbGl0WUJ5KSAmJiAoY29sID09PSAwIHx8IGNvbCA9PT0gc3BsaXRYQnkpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgeCA9IDAsCisgICAgICAgICAgICB5ID0gMDsKKyAgICAgICAgdmFyIHEgPSAwOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IDM7IGkrKykgeworICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDw9IDM7IGorKywgcSsrKSB7CisgICAgICAgICAgICB2YXIgbSA9IGJSb3dbcm93XVtpXSAqIGJDb2xbY29sXVtqXTsKKyAgICAgICAgICAgIHggKz0gY29vcmRzW3BpW3FdXVswXSAqIG07CisgICAgICAgICAgICB5ICs9IGNvb3Jkc1twaVtxXV1bMV0gKiBtOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpZ3VyZUNvb3Jkc1trXSA9IGNvb3Jkcy5sZW5ndGg7CisgICAgICAgIGNvb3Jkcy5wdXNoKFt4LCB5XSk7CisgICAgICAgIGZpZ3VyZUNvbG9yc1trXSA9IGNvbG9ycy5sZW5ndGg7CisgICAgICAgIHZhciBuZXdDb2xvciA9IG5ldyBVaW50OEFycmF5KDMpOworICAgICAgICBuZXdDb2xvclswXSA9IChjbFswXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclswXSAqIGNvbCkgLyBzcGxpdFhCeSB8IDA7CisgICAgICAgIG5ld0NvbG9yWzFdID0gKGNsWzFdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzFdICogY29sKSAvIHNwbGl0WEJ5IHwgMDsKKyAgICAgICAgbmV3Q29sb3JbMl0gPSAoY2xbMl0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMl0gKiBjb2wpIC8gc3BsaXRYQnkgfCAwOworICAgICAgICBjb2xvcnMucHVzaChuZXdDb2xvcik7CisgICAgICB9CisgICAgfQorCisgICAgZmlndXJlQ29vcmRzWzBdID0gcGlbMF07CisgICAgZmlndXJlQ29sb3JzWzBdID0gY2lbMF07CisgICAgZmlndXJlQ29vcmRzW3NwbGl0WEJ5XSA9IHBpWzNdOworICAgIGZpZ3VyZUNvbG9yc1tzcGxpdFhCeV0gPSBjaVsxXTsKKyAgICBmaWd1cmVDb29yZHNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeV0gPSBwaVsxMl07CisgICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gY2lbMl07CisgICAgZmlndXJlQ29vcmRzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnkgKyBzcGxpdFhCeV0gPSBwaVsxNV07CisgICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnkgKyBzcGxpdFhCeV0gPSBjaVszXTsKKyAgICBtZXNoLmZpZ3VyZXNbaW5kZXhdID0geworICAgICAgdHlwZTogImxhdHRpY2UiLAorICAgICAgY29vcmRzOiBmaWd1cmVDb29yZHMsCisgICAgICBjb2xvcnM6IGZpZ3VyZUNvbG9ycywKKyAgICAgIHZlcnRpY2VzUGVyUm93CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY29kZVR5cGU2U2hhZGluZyhtZXNoLCByZWFkZXIpIHsKKyAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHM7CisgICAgdmFyIGNvbG9ycyA9IG1lc2guY29sb3JzOworICAgIHZhciBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKKyAgICB2YXIgY3MgPSBuZXcgSW50MzJBcnJheSg0KTsKKworICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkgeworICAgICAgdmFyIGYgPSByZWFkZXIucmVhZEZsYWcoKTsKKworICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMykpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU2IGZsYWciKTsKKyAgICAgIH0KKworICAgICAgdmFyIGksIGlpOworICAgICAgdmFyIHBpID0gY29vcmRzLmxlbmd0aDsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSBmICE9PSAwID8gOCA6IDEyOyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7CisgICAgICB9CisKKyAgICAgIHZhciBjaSA9IGNvbG9ycy5sZW5ndGg7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb2xvcnMucHVzaChyZWFkZXIucmVhZENvbXBvbmVudHMoKSk7CisgICAgICB9CisKKyAgICAgIHZhciB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgICBzd2l0Y2ggKGYpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHBzWzEyXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyA1OworICAgICAgICAgIHBzWzE1XSA9IHBpICsgNjsKKyAgICAgICAgICBwc1s4XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CisgICAgICAgICAgcHNbNF0gPSBwaSArIDE7CisgICAgICAgICAgcHNbN10gPSBwaSArIDg7CisgICAgICAgICAgcHNbMF0gPSBwaTsKKyAgICAgICAgICBwc1sxXSA9IHBpICsgMTE7CisgICAgICAgICAgcHNbMl0gPSBwaSArIDEwOworICAgICAgICAgIHBzWzNdID0gcGkgKyA5OworICAgICAgICAgIGNzWzJdID0gY2kgKyAxOworICAgICAgICAgIGNzWzNdID0gY2kgKyAyOworICAgICAgICAgIGNzWzBdID0gY2k7CisgICAgICAgICAgY3NbMV0gPSBjaSArIDM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHRtcDEgPSBwc1sxMl07CisgICAgICAgICAgdG1wMiA9IHBzWzEzXTsKKyAgICAgICAgICB0bXAzID0gcHNbMTRdOworICAgICAgICAgIHRtcDQgPSBwc1sxNV07CisgICAgICAgICAgcHNbMTJdID0gdG1wNDsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyAxOworICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1s4XSA9IHRtcDM7CisgICAgICAgICAgcHNbMTFdID0gcGkgKyAzOworICAgICAgICAgIHBzWzRdID0gdG1wMjsKKyAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKKyAgICAgICAgICBwc1swXSA9IHRtcDE7CisgICAgICAgICAgcHNbMV0gPSBwaSArIDc7CisgICAgICAgICAgcHNbMl0gPSBwaSArIDY7CisgICAgICAgICAgcHNbM10gPSBwaSArIDU7CisgICAgICAgICAgdG1wMSA9IGNzWzJdOworICAgICAgICAgIHRtcDIgPSBjc1szXTsKKyAgICAgICAgICBjc1syXSA9IHRtcDI7CisgICAgICAgICAgY3NbM10gPSBjaTsKKyAgICAgICAgICBjc1swXSA9IHRtcDE7CisgICAgICAgICAgY3NbMV0gPSBjaSArIDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIHRtcDEgPSBwc1sxNV07CisgICAgICAgICAgdG1wMiA9IHBzWzExXTsKKyAgICAgICAgICBwc1sxMl0gPSBwc1szXTsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyAxOworICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1s4XSA9IHBzWzddOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHRtcDI7CisgICAgICAgICAgcHNbN10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMF0gPSB0bXAxOworICAgICAgICAgIHBzWzFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzJdID0gcGkgKyA2OworICAgICAgICAgIHBzWzNdID0gcGkgKyA1OworICAgICAgICAgIHRtcDEgPSBjc1szXTsKKyAgICAgICAgICBjc1syXSA9IGNzWzFdOworICAgICAgICAgIGNzWzNdID0gY2k7CisgICAgICAgICAgY3NbMF0gPSB0bXAxOworICAgICAgICAgIGNzWzFdID0gY2kgKyAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBwc1sxMl0gPSBwc1swXTsKKyAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CisgICAgICAgICAgcHNbMTRdID0gcGkgKyAxOworICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKKyAgICAgICAgICBwc1s4XSA9IHBzWzFdOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHBzWzJdOworICAgICAgICAgIHBzWzddID0gcGkgKyA0OworICAgICAgICAgIHBzWzBdID0gcHNbM107CisgICAgICAgICAgcHNbMV0gPSBwaSArIDc7CisgICAgICAgICAgcHNbMl0gPSBwaSArIDY7CisgICAgICAgICAgcHNbM10gPSBwaSArIDU7CisgICAgICAgICAgY3NbMl0gPSBjc1swXTsKKyAgICAgICAgICBjc1szXSA9IGNpOworICAgICAgICAgIGNzWzBdID0gY3NbMV07CisgICAgICAgICAgY3NbMV0gPSBjaSArIDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHBzWzVdID0gY29vcmRzLmxlbmd0aDsKKyAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMF1dWzBdIC0gY29vcmRzW3BzWzE1XV1bMF0gKyA2ICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMV1dWzBdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMF0gKyBjb29yZHNbcHNbM11dWzBdKSArIDMgKiAoY29vcmRzW3BzWzEzXV1bMF0gKyBjb29yZHNbcHNbN11dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMF1dWzFdIC0gY29vcmRzW3BzWzE1XV1bMV0gKyA2ICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMV1dWzFdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMV0gKyBjb29yZHNbcHNbM11dWzFdKSArIDMgKiAoY29vcmRzW3BzWzEzXV1bMV0gKyBjb29yZHNbcHNbN11dWzFdKSkgLyA5XSk7CisgICAgICBwc1s2XSA9IGNvb3Jkcy5sZW5ndGg7CisgICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzNdXVswXSAtIGNvb3Jkc1twc1sxMl1dWzBdICsgNiAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzddXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzNdXVsxXSAtIGNvb3Jkc1twc1sxMl1dWzFdICsgNiAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzddXVsxXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMV0gKyBjb29yZHNbcHNbMTVdXVsxXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkpIC8gOV0pOworICAgICAgcHNbOV0gPSBjb29yZHMubGVuZ3RoOworICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1sxMl1dWzBdIC0gY29vcmRzW3BzWzNdXVswXSArIDYgKiAoY29vcmRzW3BzWzhdXVswXSArIGNvb3Jkc1twc1sxM11dWzBdKSAtIDIgKiAoY29vcmRzW3BzWzBdXVswXSArIGNvb3Jkc1twc1sxNV1dWzBdKSArIDMgKiAoY29vcmRzW3BzWzExXV1bMF0gKyBjb29yZHNbcHNbMV1dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMTJdXVsxXSAtIGNvb3Jkc1twc1szXV1bMV0gKyA2ICogKGNvb3Jkc1twc1s4XV1bMV0gKyBjb29yZHNbcHNbMTNdXVsxXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMV0gKyBjb29yZHNbcHNbMTVdXVsxXSkgKyAzICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzFdXVsxXSkpIC8gOV0pOworICAgICAgcHNbMTBdID0gY29vcmRzLmxlbmd0aDsKKyAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMTVdXVswXSAtIGNvb3Jkc1twc1swXV1bMF0gKyA2ICogKGNvb3Jkc1twc1sxMV1dWzBdICsgY29vcmRzW3BzWzE0XV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICsgMyAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzhdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzE1XV1bMV0gLSBjb29yZHNbcHNbMF1dWzFdICsgNiAqIChjb29yZHNbcHNbMTFdXVsxXSArIGNvb3Jkc1twc1sxNF1dWzFdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMV0gKyBjb29yZHNbcHNbM11dWzFdKSArIDMgKiAoY29vcmRzW3BzWzJdXVsxXSArIGNvb3Jkc1twc1s4XV1bMV0pKSAvIDldKTsKKyAgICAgIG1lc2guZmlndXJlcy5wdXNoKHsKKyAgICAgICAgdHlwZTogInBhdGNoIiwKKyAgICAgICAgY29vcmRzOiBuZXcgSW50MzJBcnJheShwcyksCisgICAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkoY3MpCisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkZWNvZGVUeXBlN1NoYWRpbmcobWVzaCwgcmVhZGVyKSB7CisgICAgdmFyIGNvb3JkcyA9IG1lc2guY29vcmRzOworICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9yczsKKyAgICB2YXIgcHMgPSBuZXcgSW50MzJBcnJheSgxNik7CisgICAgdmFyIGNzID0gbmV3IEludDMyQXJyYXkoNCk7CisKKyAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKKyAgICAgIHZhciBmID0gcmVhZGVyLnJlYWRGbGFnKCk7CisKKyAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNyBmbGFnIik7CisgICAgICB9CisKKyAgICAgIHZhciBpLCBpaTsKKyAgICAgIHZhciBwaSA9IGNvb3Jkcy5sZW5ndGg7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gZiAhPT0gMCA/IDEyIDogMTY7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvb3Jkcy5wdXNoKHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNpID0gY29sb3JzLmxlbmd0aDsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSBmICE9PSAwID8gMiA6IDQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTsKKyAgICAgIH0KKworICAgICAgdmFyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisKKyAgICAgIHN3aXRjaCAoZikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgcHNbMTJdID0gcGkgKyAzOworICAgICAgICAgIHBzWzEzXSA9IHBpICsgNDsKKyAgICAgICAgICBwc1sxNF0gPSBwaSArIDU7CisgICAgICAgICAgcHNbMTVdID0gcGkgKyA2OworICAgICAgICAgIHBzWzhdID0gcGkgKyAyOworICAgICAgICAgIHBzWzldID0gcGkgKyAxMzsKKyAgICAgICAgICBwc1sxMF0gPSBwaSArIDE0OworICAgICAgICAgIHBzWzExXSA9IHBpICsgNzsKKyAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1s1XSA9IHBpICsgMTI7CisgICAgICAgICAgcHNbNl0gPSBwaSArIDE1OworICAgICAgICAgIHBzWzddID0gcGkgKyA4OworICAgICAgICAgIHBzWzBdID0gcGk7CisgICAgICAgICAgcHNbMV0gPSBwaSArIDExOworICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKKyAgICAgICAgICBwc1szXSA9IHBpICsgOTsKKyAgICAgICAgICBjc1syXSA9IGNpICsgMTsKKyAgICAgICAgICBjc1szXSA9IGNpICsgMjsKKyAgICAgICAgICBjc1swXSA9IGNpOworICAgICAgICAgIGNzWzFdID0gY2kgKyAzOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICB0bXAxID0gcHNbMTJdOworICAgICAgICAgIHRtcDIgPSBwc1sxM107CisgICAgICAgICAgdG1wMyA9IHBzWzE0XTsKKyAgICAgICAgICB0bXA0ID0gcHNbMTVdOworICAgICAgICAgIHBzWzEyXSA9IHRtcDQ7CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSB0bXAzOworICAgICAgICAgIHBzWzldID0gcGkgKyA5OworICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTA7CisgICAgICAgICAgcHNbMTFdID0gcGkgKyAzOworICAgICAgICAgIHBzWzRdID0gdG1wMjsKKyAgICAgICAgICBwc1s1XSA9IHBpICsgODsKKyAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CisgICAgICAgICAgcHNbN10gPSBwaSArIDQ7CisgICAgICAgICAgcHNbMF0gPSB0bXAxOworICAgICAgICAgIHBzWzFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzJdID0gcGkgKyA2OworICAgICAgICAgIHBzWzNdID0gcGkgKyA1OworICAgICAgICAgIHRtcDEgPSBjc1syXTsKKyAgICAgICAgICB0bXAyID0gY3NbM107CisgICAgICAgICAgY3NbMl0gPSB0bXAyOworICAgICAgICAgIGNzWzNdID0gY2k7CisgICAgICAgICAgY3NbMF0gPSB0bXAxOworICAgICAgICAgIGNzWzFdID0gY2kgKyAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICB0bXAxID0gcHNbMTVdOworICAgICAgICAgIHRtcDIgPSBwc1sxMV07CisgICAgICAgICAgcHNbMTJdID0gcHNbM107CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSBwc1s3XTsKKyAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKKyAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHRtcDI7CisgICAgICAgICAgcHNbNV0gPSBwaSArIDg7CisgICAgICAgICAgcHNbNl0gPSBwaSArIDExOworICAgICAgICAgIHBzWzddID0gcGkgKyA0OworICAgICAgICAgIHBzWzBdID0gdG1wMTsKKyAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKKyAgICAgICAgICBwc1syXSA9IHBpICsgNjsKKyAgICAgICAgICBwc1szXSA9IHBpICsgNTsKKyAgICAgICAgICB0bXAxID0gY3NbM107CisgICAgICAgICAgY3NbMl0gPSBjc1sxXTsKKyAgICAgICAgICBjc1szXSA9IGNpOworICAgICAgICAgIGNzWzBdID0gdG1wMTsKKyAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgcHNbMTJdID0gcHNbMF07CisgICAgICAgICAgcHNbMTNdID0gcGkgKyAwOworICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKKyAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CisgICAgICAgICAgcHNbOF0gPSBwc1sxXTsKKyAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKKyAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOworICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKKyAgICAgICAgICBwc1s0XSA9IHBzWzJdOworICAgICAgICAgIHBzWzVdID0gcGkgKyA4OworICAgICAgICAgIHBzWzZdID0gcGkgKyAxMTsKKyAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKKyAgICAgICAgICBwc1swXSA9IHBzWzNdOworICAgICAgICAgIHBzWzFdID0gcGkgKyA3OworICAgICAgICAgIHBzWzJdID0gcGkgKyA2OworICAgICAgICAgIHBzWzNdID0gcGkgKyA1OworICAgICAgICAgIGNzWzJdID0gY3NbMF07CisgICAgICAgICAgY3NbM10gPSBjaTsKKyAgICAgICAgICBjc1swXSA9IGNzWzFdOworICAgICAgICAgIGNzWzFdID0gY2kgKyAxOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBtZXNoLmZpZ3VyZXMucHVzaCh7CisgICAgICAgIHR5cGU6ICJwYXRjaCIsCisgICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAorICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlQm91bmRzKG1lc2gpIHsKKyAgICB2YXIgbWluWCA9IG1lc2guY29vcmRzWzBdWzBdLAorICAgICAgICBtaW5ZID0gbWVzaC5jb29yZHNbMF1bMV0sCisgICAgICAgIG1heFggPSBtaW5YLAorICAgICAgICBtYXhZID0gbWluWTsKKworICAgIGZvciAodmFyIGkgPSAxLCBpaSA9IG1lc2guY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciB4ID0gbWVzaC5jb29yZHNbaV1bMF0sCisgICAgICAgICAgeSA9IG1lc2guY29vcmRzW2ldWzFdOworICAgICAgbWluWCA9IG1pblggPiB4ID8geCA6IG1pblg7CisgICAgICBtaW5ZID0gbWluWSA+IHkgPyB5IDogbWluWTsKKyAgICAgIG1heFggPSBtYXhYIDwgeCA/IHggOiBtYXhYOworICAgICAgbWF4WSA9IG1heFkgPCB5ID8geSA6IG1heFk7CisgICAgfQorCisgICAgbWVzaC5ib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07CisgIH0KKworICBmdW5jdGlvbiBwYWNrRGF0YShtZXNoKSB7CisgICAgdmFyIGksIGlpLCBqLCBqajsKKyAgICB2YXIgY29vcmRzID0gbWVzaC5jb29yZHM7CisgICAgdmFyIGNvb3Jkc1BhY2tlZCA9IG5ldyBGbG9hdDMyQXJyYXkoY29vcmRzLmxlbmd0aCAqIDIpOworCisgICAgZm9yIChpID0gMCwgaiA9IDAsIGlpID0gY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciB4eSA9IGNvb3Jkc1tpXTsKKyAgICAgIGNvb3Jkc1BhY2tlZFtqKytdID0geHlbMF07CisgICAgICBjb29yZHNQYWNrZWRbaisrXSA9IHh5WzFdOworICAgIH0KKworICAgIG1lc2guY29vcmRzID0gY29vcmRzUGFja2VkOworICAgIHZhciBjb2xvcnMgPSBtZXNoLmNvbG9yczsKKyAgICB2YXIgY29sb3JzUGFja2VkID0gbmV3IFVpbnQ4QXJyYXkoY29sb3JzLmxlbmd0aCAqIDMpOworCisgICAgZm9yIChpID0gMCwgaiA9IDAsIGlpID0gY29sb3JzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjID0gY29sb3JzW2ldOworICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzBdOworICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzFdOworICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzJdOworICAgIH0KKworICAgIG1lc2guY29sb3JzID0gY29sb3JzUGFja2VkOworICAgIHZhciBmaWd1cmVzID0gbWVzaC5maWd1cmVzOworCisgICAgZm9yIChpID0gMCwgaWkgPSBmaWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBmaWd1cmUgPSBmaWd1cmVzW2ldLAorICAgICAgICAgIHBzID0gZmlndXJlLmNvb3JkcywKKyAgICAgICAgICBjcyA9IGZpZ3VyZS5jb2xvcnM7CisKKyAgICAgIGZvciAoaiA9IDAsIGpqID0gcHMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICBwc1tqXSAqPSAyOworICAgICAgICBjc1tqXSAqPSAzOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIE1lc2goc3RyZWFtLCBtYXRyaXgsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgeworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShzdHJlYW0pKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1lc2ggZGF0YSBpcyBub3QgYSBzdHJlYW0iKTsKKyAgICB9CisKKyAgICB2YXIgZGljdCA9IHN0cmVhbS5kaWN0OworICAgIHRoaXMubWF0cml4ID0gbWF0cml4OworICAgIHRoaXMuc2hhZGluZ1R5cGUgPSBkaWN0LmdldCgiU2hhZGluZ1R5cGUiKTsKKyAgICB0aGlzLnR5cGUgPSAiUGF0dGVybiI7CisgICAgY29uc3QgYmJveCA9IGRpY3QuZ2V0QXJyYXkoIkJCb3giKTsKKworICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7CisgICAgICB0aGlzLmJib3ggPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QoYmJveCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuYmJveCA9IG51bGw7CisgICAgfQorCisgICAgY29uc3QgY3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKKyAgICAgIGNzOiBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpIHx8IGRpY3QuZ2V0UmF3KCJDUyIpLAorICAgICAgeHJlZiwKKyAgICAgIHJlc291cmNlcywKKyAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCisgICAgfSk7CisKKyAgICB0aGlzLmNzID0gY3M7CisgICAgdGhpcy5iYWNrZ3JvdW5kID0gZGljdC5oYXMoIkJhY2tncm91bmQiKSA/IGNzLmdldFJnYihkaWN0LmdldCgiQmFja2dyb3VuZCIpLCAwKSA6IG51bGw7CisgICAgdmFyIGZuT2JqID0gZGljdC5nZXRSYXcoIkZ1bmN0aW9uIik7CisgICAgdmFyIGZuID0gZm5PYmogPyBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlRnJvbUFycmF5KGZuT2JqKSA6IG51bGw7CisgICAgdGhpcy5jb29yZHMgPSBbXTsKKyAgICB0aGlzLmNvbG9ycyA9IFtdOworICAgIHRoaXMuZmlndXJlcyA9IFtdOworICAgIHZhciBkZWNvZGVDb250ZXh0ID0geworICAgICAgYml0c1BlckNvb3JkaW5hdGU6IGRpY3QuZ2V0KCJCaXRzUGVyQ29vcmRpbmF0ZSIpLAorICAgICAgYml0c1BlckNvbXBvbmVudDogZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSwKKyAgICAgIGJpdHNQZXJGbGFnOiBkaWN0LmdldCgiQml0c1BlckZsYWciKSwKKyAgICAgIGRlY29kZTogZGljdC5nZXRBcnJheSgiRGVjb2RlIiksCisgICAgICBjb2xvckZuOiBmbiwKKyAgICAgIGNvbG9yU3BhY2U6IGNzLAorICAgICAgbnVtQ29tcHM6IGZuID8gMSA6IGNzLm51bUNvbXBzCisgICAgfTsKKyAgICB2YXIgcmVhZGVyID0gbmV3IE1lc2hTdHJlYW1SZWFkZXIoc3RyZWFtLCBkZWNvZGVDb250ZXh0KTsKKyAgICB2YXIgcGF0Y2hNZXNoID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKHRoaXMuc2hhZGluZ1R5cGUpIHsKKyAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6CisgICAgICAgIGRlY29kZVR5cGU0U2hhZGluZyh0aGlzLCByZWFkZXIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTaGFkaW5nVHlwZS5MQVRUSUNFX0ZPUk1fTUVTSDoKKyAgICAgICAgdmFyIHZlcnRpY2VzUGVyUm93ID0gZGljdC5nZXQoIlZlcnRpY2VzUGVyUm93IikgfCAwOworCisgICAgICAgIGlmICh2ZXJ0aWNlc1BlclJvdyA8IDIpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgVmVydGljZXNQZXJSb3ciKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlY29kZVR5cGU1U2hhZGluZyh0aGlzLCByZWFkZXIsIHZlcnRpY2VzUGVyUm93KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDoKKyAgICAgICAgZGVjb2RlVHlwZTZTaGFkaW5nKHRoaXMsIHJlYWRlcik7CisgICAgICAgIHBhdGNoTWVzaCA9IHRydWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNoYWRpbmdUeXBlLlRFTlNPUl9QQVRDSF9NRVNIOgorICAgICAgICBkZWNvZGVUeXBlN1NoYWRpbmcodGhpcywgcmVhZGVyKTsKKyAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlVuc3VwcG9ydGVkIG1lc2ggdHlwZS4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBhdGNoTWVzaCkgeworICAgICAgdXBkYXRlQm91bmRzKHRoaXMpOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLmZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBidWlsZEZpZ3VyZUZyb21QYXRjaCh0aGlzLCBpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB1cGRhdGVCb3VuZHModGhpcyk7CisgICAgcGFja0RhdGEodGhpcyk7CisgIH0KKworICBNZXNoLnByb3RvdHlwZSA9IHsKKyAgICBnZXRJUjogZnVuY3Rpb24gTWVzaF9nZXRJUigpIHsKKyAgICAgIHJldHVybiBbIk1lc2giLCB0aGlzLnNoYWRpbmdUeXBlLCB0aGlzLmNvb3JkcywgdGhpcy5jb2xvcnMsIHRoaXMuZmlndXJlcywgdGhpcy5ib3VuZHMsIHRoaXMubWF0cml4LCB0aGlzLmJib3gsIHRoaXMuYmFja2dyb3VuZF07CisgICAgfQorICB9OworICByZXR1cm4gTWVzaDsKK30oKTsKKworU2hhZGluZ3MuRHVtbXkgPSBmdW5jdGlvbiBEdW1teUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIER1bW15KCkgeworICAgIHRoaXMudHlwZSA9ICJQYXR0ZXJuIjsKKyAgfQorCisgIER1bW15LnByb3RvdHlwZSA9IHsKKyAgICBnZXRJUjogZnVuY3Rpb24gRHVtbXlfZ2V0SVIoKSB7CisgICAgICByZXR1cm4gWyJEdW1teSJdOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIER1bW15OworfSgpOworCitmdW5jdGlvbiBnZXRUaWxpbmdQYXR0ZXJuSVIob3BlcmF0b3JMaXN0LCBkaWN0LCBhcmdzKSB7CisgIGNvbnN0IG1hdHJpeCA9IGRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpOworCisgIGNvbnN0IGJib3ggPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QoZGljdC5nZXRBcnJheSgiQkJveCIpKTsKKworICBjb25zdCB4c3RlcCA9IGRpY3QuZ2V0KCJYU3RlcCIpOworICBjb25zdCB5c3RlcCA9IGRpY3QuZ2V0KCJZU3RlcCIpOworICBjb25zdCBwYWludFR5cGUgPSBkaWN0LmdldCgiUGFpbnRUeXBlIik7CisgIGNvbnN0IHRpbGluZ1R5cGUgPSBkaWN0LmdldCgiVGlsaW5nVHlwZSIpOworCisgIGlmIChiYm94WzJdIC0gYmJveFswXSA9PT0gMCB8fCBiYm94WzNdIC0gYmJveFsxXSA9PT0gMCkgeworICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBnZXRUaWxpbmdQYXR0ZXJuSVIgL0JCb3ggYXJyYXk6IFske2Jib3h9XS5gKTsKKyAgfQorCisgIHJldHVybiBbIlRpbGluZ1BhdHRlcm4iLCBhcmdzLCBvcGVyYXRvckxpc3QsIG1hdHJpeCwgYmJveCwgeHN0ZXAsIHlzdGVwLCBwYWludFR5cGUsIHRpbGluZ1R5cGVdOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL3BkZl9tYW5hZ2VyLmpzIGIvbGliL2NvcmUvcGRmX21hbmFnZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyZmFkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL3BkZl9tYW5hZ2VyLmpzCkBAIC0wLDAgKzEsMjIyIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5OZXR3b3JrUGRmTWFuYWdlciA9IGV4cG9ydHMuTG9jYWxQZGZNYW5hZ2VyID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX2NodW5rZWRfc3RyZWFtID0gcmVxdWlyZSgiLi9jaHVua2VkX3N0cmVhbS5qcyIpOworCit2YXIgX2NvcmVfdXRpbHMgPSByZXF1aXJlKCIuL2NvcmVfdXRpbHMuanMiKTsKKwordmFyIF9kb2N1bWVudCA9IHJlcXVpcmUoIi4vZG9jdW1lbnQuanMiKTsKKwordmFyIF9zdHJlYW0gPSByZXF1aXJlKCIuL3N0cmVhbS5qcyIpOworCitjbGFzcyBCYXNlUGRmTWFuYWdlciB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlUGRmTWFuYWdlcikgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZVBkZk1hbmFnZXIuIik7CisgICAgfQorICB9CisKKyAgZ2V0IGRvY0lkKCkgeworICAgIHJldHVybiB0aGlzLl9kb2NJZDsKKyAgfQorCisgIGdldCBwYXNzd29yZCgpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmQ7CisgIH0KKworICBnZXQgZG9jQmFzZVVybCgpIHsKKyAgICBsZXQgZG9jQmFzZVVybCA9IG51bGw7CisKKyAgICBpZiAodGhpcy5fZG9jQmFzZVVybCkgeworICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSAoMCwgX3V0aWwuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodGhpcy5fZG9jQmFzZVVybCk7CisKKyAgICAgIGlmIChhYnNvbHV0ZVVybCkgeworICAgICAgICBkb2NCYXNlVXJsID0gYWJzb2x1dGVVcmwuaHJlZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKShgSW52YWxpZCBhYnNvbHV0ZSBkb2NCYXNlVXJsOiAiJHt0aGlzLl9kb2NCYXNlVXJsfSIuYCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJkb2NCYXNlVXJsIiwgZG9jQmFzZVVybCk7CisgIH0KKworICBvbkxvYWRlZFN0cmVhbSgpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYG9uTG9hZGVkU3RyZWFtYCBjYWxsZWQiKTsKKyAgfQorCisgIGVuc3VyZURvYyhwcm9wLCBhcmdzKSB7CisgICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQsIHByb3AsIGFyZ3MpOworICB9CisKKyAgZW5zdXJlWFJlZihwcm9wLCBhcmdzKSB7CisgICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQueHJlZiwgcHJvcCwgYXJncyk7CisgIH0KKworICBlbnN1cmVDYXRhbG9nKHByb3AsIGFyZ3MpIHsKKyAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC5jYXRhbG9nLCBwcm9wLCBhcmdzKTsKKyAgfQorCisgIGdldFBhZ2UocGFnZUluZGV4KSB7CisgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShwYWdlSW5kZXgpOworICB9CisKKyAgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CisgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKTsKKyAgfQorCisgIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgeworICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQpOworICB9CisKKyAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWQiKTsKKyAgfQorCisgIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0UmFuZ2VgIGNhbGxlZCIpOworICB9CisKKyAgcmVxdWVzdExvYWRlZFN0cmVhbSgpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHJlcXVlc3RMb2FkZWRTdHJlYW1gIGNhbGxlZCIpOworICB9CisKKyAgc2VuZFByb2dyZXNzaXZlRGF0YShjaHVuaykgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkIik7CisgIH0KKworICB1cGRhdGVQYXNzd29yZChwYXNzd29yZCkgeworICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7CisgIH0KKworICB0ZXJtaW5hdGUocmVhc29uKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGB0ZXJtaW5hdGVgIGNhbGxlZCIpOworICB9CisKK30KKworY2xhc3MgTG9jYWxQZGZNYW5hZ2VyIGV4dGVuZHMgQmFzZVBkZk1hbmFnZXIgeworICBjb25zdHJ1Y3Rvcihkb2NJZCwgZGF0YSwgcGFzc3dvcmQsIGV2YWx1YXRvck9wdGlvbnMsIGRvY0Jhc2VVcmwpIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMuX2RvY0lkID0gZG9jSWQ7CisgICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB0aGlzLl9kb2NCYXNlVXJsID0gZG9jQmFzZVVybDsKKyAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBldmFsdWF0b3JPcHRpb25zOworICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmVhbShkYXRhKTsKKyAgICB0aGlzLnBkZkRvY3VtZW50ID0gbmV3IF9kb2N1bWVudC5QREZEb2N1bWVudCh0aGlzLCBzdHJlYW0pOworICAgIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoc3RyZWFtKTsKKyAgfQorCisgIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHsKKyAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTsKKworICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CisgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOworICB9CisKKyAgcmVxdWVzdExvYWRlZFN0cmVhbSgpIHt9CisKKyAgb25Mb2FkZWRTdHJlYW0oKSB7CisgICAgcmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2U7CisgIH0KKworICB0ZXJtaW5hdGUocmVhc29uKSB7fQorCit9CisKK2V4cG9ydHMuTG9jYWxQZGZNYW5hZ2VyID0gTG9jYWxQZGZNYW5hZ2VyOworCitjbGFzcyBOZXR3b3JrUGRmTWFuYWdlciBleHRlbmRzIEJhc2VQZGZNYW5hZ2VyIHsKKyAgY29uc3RydWN0b3IoZG9jSWQsIHBkZk5ldHdvcmtTdHJlYW0sIGFyZ3MsIGV2YWx1YXRvck9wdGlvbnMsIGRvY0Jhc2VVcmwpIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMuX2RvY0lkID0gZG9jSWQ7CisgICAgdGhpcy5fcGFzc3dvcmQgPSBhcmdzLnBhc3N3b3JkOworICAgIHRoaXMuX2RvY0Jhc2VVcmwgPSBkb2NCYXNlVXJsOworICAgIHRoaXMubXNnSGFuZGxlciA9IGFyZ3MubXNnSGFuZGxlcjsKKyAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBldmFsdWF0b3JPcHRpb25zOworICAgIHRoaXMuc3RyZWFtTWFuYWdlciA9IG5ldyBfY2h1bmtlZF9zdHJlYW0uQ2h1bmtlZFN0cmVhbU1hbmFnZXIocGRmTmV0d29ya1N0cmVhbSwgeworICAgICAgbXNnSGFuZGxlcjogYXJncy5tc2dIYW5kbGVyLAorICAgICAgbGVuZ3RoOiBhcmdzLmxlbmd0aCwKKyAgICAgIGRpc2FibGVBdXRvRmV0Y2g6IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaCwKKyAgICAgIHJhbmdlQ2h1bmtTaXplOiBhcmdzLnJhbmdlQ2h1bmtTaXplCisgICAgfSk7CisgICAgdGhpcy5wZGZEb2N1bWVudCA9IG5ldyBfZG9jdW1lbnQuUERGRG9jdW1lbnQodGhpcywgdGhpcy5zdHJlYW1NYW5hZ2VyLmdldFN0cmVhbSgpKTsKKyAgfQorCisgIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHsKKyAgICB0cnkgeworICAgICAgY29uc3QgdmFsdWUgPSBvYmpbcHJvcF07CisKKyAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KG9iaiwgYXJncyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9IGNhdGNoIChleCkgeworICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikpIHsKKyAgICAgICAgdGhyb3cgZXg7CisgICAgICB9CisKKyAgICAgIGF3YWl0IHRoaXMucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpOworICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlKG9iaiwgcHJvcCwgYXJncyk7CisgICAgfQorICB9CisKKyAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKKyAgICByZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKTsKKyAgfQorCisgIHJlcXVlc3RMb2FkZWRTdHJlYW0oKSB7CisgICAgdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RBbGxDaHVua3MoKTsKKyAgfQorCisgIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHsKKyAgICB0aGlzLnN0cmVhbU1hbmFnZXIub25SZWNlaXZlRGF0YSh7CisgICAgICBjaHVuaworICAgIH0pOworICB9CisKKyAgb25Mb2FkZWRTdHJlYW0oKSB7CisgICAgcmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpOworICB9CisKKyAgdGVybWluYXRlKHJlYXNvbikgeworICAgIHRoaXMuc3RyZWFtTWFuYWdlci5hYm9ydChyZWFzb24pOworICB9CisKK30KKworZXhwb3J0cy5OZXR3b3JrUGRmTWFuYWdlciA9IE5ldHdvcmtQZGZNYW5hZ2VyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL3ByaW1pdGl2ZXMuanMgYi9saWIvY29yZS9wcmltaXRpdmVzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZWZmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9wcmltaXRpdmVzLmpzCkBAIC0wLDAgKzEsMzkyIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5jbGVhclByaW1pdGl2ZUNhY2hlcyA9IGNsZWFyUHJpbWl0aXZlQ2FjaGVzOworZXhwb3J0cy5pc0VPRiA9IGlzRU9GOworZXhwb3J0cy5pc0NtZCA9IGlzQ21kOworZXhwb3J0cy5pc0RpY3QgPSBpc0RpY3Q7CitleHBvcnRzLmlzTmFtZSA9IGlzTmFtZTsKK2V4cG9ydHMuaXNSZWYgPSBpc1JlZjsKK2V4cG9ydHMuaXNSZWZzRXF1YWwgPSBpc1JlZnNFcXVhbDsKK2V4cG9ydHMuaXNTdHJlYW0gPSBpc1N0cmVhbTsKK2V4cG9ydHMuUmVmU2V0Q2FjaGUgPSBleHBvcnRzLlJlZlNldCA9IGV4cG9ydHMuUmVmID0gZXhwb3J0cy5OYW1lID0gZXhwb3J0cy5EaWN0ID0gZXhwb3J0cy5DbWQgPSBleHBvcnRzLkVPRiA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIEVPRiA9IHt9OworZXhwb3J0cy5FT0YgPSBFT0Y7CisKK3ZhciBOYW1lID0gZnVuY3Rpb24gTmFtZUNsb3N1cmUoKSB7CisgIGxldCBuYW1lQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgIGZ1bmN0aW9uIE5hbWUobmFtZSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgIH0KKworICBOYW1lLnByb3RvdHlwZSA9IHt9OworCisgIE5hbWUuZ2V0ID0gZnVuY3Rpb24gTmFtZV9nZXQobmFtZSkgeworICAgIHZhciBuYW1lVmFsdWUgPSBuYW1lQ2FjaGVbbmFtZV07CisgICAgcmV0dXJuIG5hbWVWYWx1ZSA/IG5hbWVWYWx1ZSA6IG5hbWVDYWNoZVtuYW1lXSA9IG5ldyBOYW1lKG5hbWUpOworICB9OworCisgIE5hbWUuX2NsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7CisgICAgbmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfTsKKworICByZXR1cm4gTmFtZTsKK30oKTsKKworZXhwb3J0cy5OYW1lID0gTmFtZTsKKwordmFyIENtZCA9IGZ1bmN0aW9uIENtZENsb3N1cmUoKSB7CisgIGxldCBjbWRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgZnVuY3Rpb24gQ21kKGNtZCkgeworICAgIHRoaXMuY21kID0gY21kOworICB9CisKKyAgQ21kLnByb3RvdHlwZSA9IHt9OworCisgIENtZC5nZXQgPSBmdW5jdGlvbiBDbWRfZ2V0KGNtZCkgeworICAgIHZhciBjbWRWYWx1ZSA9IGNtZENhY2hlW2NtZF07CisgICAgcmV0dXJuIGNtZFZhbHVlID8gY21kVmFsdWUgOiBjbWRDYWNoZVtjbWRdID0gbmV3IENtZChjbWQpOworICB9OworCisgIENtZC5fY2xlYXJDYWNoZSA9IGZ1bmN0aW9uICgpIHsKKyAgICBjbWRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH07CisKKyAgcmV0dXJuIENtZDsKK30oKTsKKworZXhwb3J0cy5DbWQgPSBDbWQ7CisKK3ZhciBEaWN0ID0gZnVuY3Rpb24gRGljdENsb3N1cmUoKSB7CisgIHZhciBub25TZXJpYWxpemFibGUgPSBmdW5jdGlvbiBub25TZXJpYWxpemFibGVDbG9zdXJlKCkgeworICAgIHJldHVybiBub25TZXJpYWxpemFibGU7CisgIH07CisKKyAgZnVuY3Rpb24gRGljdCh4cmVmKSB7CisgICAgdGhpcy5fbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLnhyZWYgPSB4cmVmOworICAgIHRoaXMub2JqSWQgPSBudWxsOworICAgIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2U7CisgICAgdGhpcy5fX25vblNlcmlhbGl6YWJsZV9fID0gbm9uU2VyaWFsaXphYmxlOworICB9CisKKyAgRGljdC5wcm90b3R5cGUgPSB7CisgICAgYXNzaWduWHJlZjogZnVuY3Rpb24gRGljdF9hc3NpZ25YcmVmKG5ld1hyZWYpIHsKKyAgICAgIHRoaXMueHJlZiA9IG5ld1hyZWY7CisgICAgfSwKKworICAgIGdldCBzaXplKCkgeworICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21hcCkubGVuZ3RoOworICAgIH0sCisKKyAgICBnZXQoa2V5MSwga2V5Miwga2V5MykgeworICAgICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwW2tleTFdOworCisgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrZXkyICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5Ml07CisKKyAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5M107CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgeworICAgICAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9LAorCisgICAgYXN5bmMgZ2V0QXN5bmMoa2V5MSwga2V5Miwga2V5MykgeworICAgICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwW2tleTFdOworCisgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrZXkyICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5Ml07CisKKyAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5M107CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgeworICAgICAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoQXN5bmModmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0sCisKKyAgICBnZXRBcnJheShrZXkxLCBrZXkyLCBrZXkzKSB7CisgICAgICBsZXQgdmFsdWUgPSB0aGlzLmdldChrZXkxLCBrZXkyLCBrZXkzKTsKKworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCAhdGhpcy54cmVmKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKworICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgpOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB2YWx1ZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGlmICghKHZhbHVlW2ldIGluc3RhbmNlb2YgUmVmKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWVbaV0gPSB0aGlzLnhyZWYuZmV0Y2godmFsdWVbaV0sIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0sCisKKyAgICBnZXRSYXc6IGZ1bmN0aW9uIERpY3RfZ2V0UmF3KGtleSkgeworICAgICAgcmV0dXJuIHRoaXMuX21hcFtrZXldOworICAgIH0sCisgICAgZ2V0S2V5czogZnVuY3Rpb24gRGljdF9nZXRLZXlzKCkgeworICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21hcCk7CisgICAgfSwKKyAgICBnZXRSYXdWYWx1ZXM6IGZ1bmN0aW9uIERpY3RfZ2V0UmF3VmFsdWVzKCkgeworICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fbWFwKTsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24gRGljdF9zZXQoa2V5LCB2YWx1ZSkgeworICAgICAgdGhpcy5fbWFwW2tleV0gPSB2YWx1ZTsKKyAgICB9LAorICAgIGhhczogZnVuY3Rpb24gRGljdF9oYXMoa2V5KSB7CisgICAgICByZXR1cm4gdGhpcy5fbWFwW2tleV0gIT09IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIGZvckVhY2g6IGZ1bmN0aW9uIERpY3RfZm9yRWFjaChjYWxsYmFjaykgeworICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuX21hcCkgeworICAgICAgICBjYWxsYmFjayhrZXksIHRoaXMuZ2V0KGtleSkpOworICAgICAgfQorICAgIH0KKyAgfTsKKyAgRGljdC5lbXB0eSA9IG5ldyBEaWN0KG51bGwpOworCisgIERpY3QubWVyZ2UgPSBmdW5jdGlvbiAoeworICAgIHhyZWYsCisgICAgZGljdEFycmF5LAorICAgIG1lcmdlU3ViRGljdHMgPSBmYWxzZQorICB9KSB7CisgICAgY29uc3QgbWVyZ2VkRGljdCA9IG5ldyBEaWN0KHhyZWYpOworCisgICAgaWYgKCFtZXJnZVN1YkRpY3RzKSB7CisgICAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgZGljdEFycmF5KSB7CisgICAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGljdC5fbWFwKSkgeworICAgICAgICAgIGlmIChtZXJnZWREaWN0Ll9tYXBba2V5XSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBtZXJnZWREaWN0Ll9tYXBba2V5XSA9IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gbWVyZ2VkRGljdC5zaXplID4gMCA/IG1lcmdlZERpY3QgOiBEaWN0LmVtcHR5OworICAgIH0KKworICAgIGNvbnN0IHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7CisKKyAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgZGljdEFycmF5KSB7CisgICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRpY3QuX21hcCkpIHsKKyAgICAgICAgbGV0IHByb3BlcnR5ID0gcHJvcGVydGllcy5nZXQoa2V5KTsKKworICAgICAgICBpZiAocHJvcGVydHkgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIHByb3BlcnR5ID0gW107CisgICAgICAgICAgcHJvcGVydGllcy5zZXQoa2V5LCBwcm9wZXJ0eSk7CisgICAgICAgIH0KKworICAgICAgICBwcm9wZXJ0eS5wdXNoKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZXNdIG9mIHByb3BlcnRpZXMpIHsKKyAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxIHx8ICEodmFsdWVzWzBdIGluc3RhbmNlb2YgRGljdCkpIHsKKyAgICAgICAgbWVyZ2VkRGljdC5fbWFwW25hbWVdID0gdmFsdWVzWzBdOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgY29uc3Qgc3ViRGljdCA9IG5ldyBEaWN0KHhyZWYpOworCisgICAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgdmFsdWVzKSB7CisgICAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGljdC5fbWFwKSkgeworICAgICAgICAgIGlmIChzdWJEaWN0Ll9tYXBba2V5XSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBzdWJEaWN0Ll9tYXBba2V5XSA9IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc3ViRGljdC5zaXplID4gMCkgeworICAgICAgICBtZXJnZWREaWN0Ll9tYXBbbmFtZV0gPSBzdWJEaWN0OworICAgICAgfQorICAgIH0KKworICAgIHByb3BlcnRpZXMuY2xlYXIoKTsKKyAgICByZXR1cm4gbWVyZ2VkRGljdC5zaXplID4gMCA/IG1lcmdlZERpY3QgOiBEaWN0LmVtcHR5OworICB9OworCisgIHJldHVybiBEaWN0OworfSgpOworCitleHBvcnRzLkRpY3QgPSBEaWN0OworCit2YXIgUmVmID0gZnVuY3Rpb24gUmVmQ2xvc3VyZSgpIHsKKyAgbGV0IHJlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICBmdW5jdGlvbiBSZWYobnVtLCBnZW4pIHsKKyAgICB0aGlzLm51bSA9IG51bTsKKyAgICB0aGlzLmdlbiA9IGdlbjsKKyAgfQorCisgIFJlZi5wcm90b3R5cGUgPSB7CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIFJlZl90b1N0cmluZygpIHsKKyAgICAgIGlmICh0aGlzLmdlbiA9PT0gMCkgeworICAgICAgICByZXR1cm4gYCR7dGhpcy5udW19UmA7CisgICAgICB9CisKKyAgICAgIHJldHVybiBgJHt0aGlzLm51bX1SJHt0aGlzLmdlbn1gOworICAgIH0KKyAgfTsKKworICBSZWYuZ2V0ID0gZnVuY3Rpb24gKG51bSwgZ2VuKSB7CisgICAgY29uc3Qga2V5ID0gZ2VuID09PSAwID8gYCR7bnVtfVJgIDogYCR7bnVtfVIke2dlbn1gOworICAgIGNvbnN0IHJlZlZhbHVlID0gcmVmQ2FjaGVba2V5XTsKKyAgICByZXR1cm4gcmVmVmFsdWUgPyByZWZWYWx1ZSA6IHJlZkNhY2hlW2tleV0gPSBuZXcgUmVmKG51bSwgZ2VuKTsKKyAgfTsKKworICBSZWYuX2NsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7CisgICAgcmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9OworCisgIHJldHVybiBSZWY7Cit9KCk7CisKK2V4cG9ydHMuUmVmID0gUmVmOworCitjbGFzcyBSZWZTZXQgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLl9zZXQgPSBuZXcgU2V0KCk7CisgIH0KKworICBoYXMocmVmKSB7CisgICAgcmV0dXJuIHRoaXMuX3NldC5oYXMocmVmLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHV0KHJlZikgeworICAgIHRoaXMuX3NldC5hZGQocmVmLnRvU3RyaW5nKCkpOworICB9CisKKyAgcmVtb3ZlKHJlZikgeworICAgIHRoaXMuX3NldC5kZWxldGUocmVmLnRvU3RyaW5nKCkpOworICB9CisKK30KKworZXhwb3J0cy5SZWZTZXQgPSBSZWZTZXQ7CisKK2NsYXNzIFJlZlNldENhY2hlIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOworICB9CisKKyAgZ2V0IHNpemUoKSB7CisgICAgcmV0dXJuIHRoaXMuX21hcC5zaXplOworICB9CisKKyAgZ2V0KHJlZikgeworICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KHJlZi50b1N0cmluZygpKTsKKyAgfQorCisgIGhhcyhyZWYpIHsKKyAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhyZWYudG9TdHJpbmcoKSk7CisgIH0KKworICBwdXQocmVmLCBvYmopIHsKKyAgICB0aGlzLl9tYXAuc2V0KHJlZi50b1N0cmluZygpLCBvYmopOworICB9CisKKyAgcHV0QWxpYXMocmVmLCBhbGlhc1JlZikgeworICAgIHRoaXMuX21hcC5zZXQocmVmLnRvU3RyaW5nKCksIHRoaXMuZ2V0KGFsaWFzUmVmKSk7CisgIH0KKworICBmb3JFYWNoKGNhbGxiYWNrKSB7CisgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLl9tYXAudmFsdWVzKCkpIHsKKyAgICAgIGNhbGxiYWNrKHZhbHVlKTsKKyAgICB9CisgIH0KKworICBjbGVhcigpIHsKKyAgICB0aGlzLl9tYXAuY2xlYXIoKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUmVmU2V0Q2FjaGUgPSBSZWZTZXRDYWNoZTsKKworZnVuY3Rpb24gaXNFT0YodikgeworICByZXR1cm4gdiA9PT0gRU9GOworfQorCitmdW5jdGlvbiBpc05hbWUodiwgbmFtZSkgeworICByZXR1cm4gdiBpbnN0YW5jZW9mIE5hbWUgJiYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB2Lm5hbWUgPT09IG5hbWUpOworfQorCitmdW5jdGlvbiBpc0NtZCh2LCBjbWQpIHsKKyAgcmV0dXJuIHYgaW5zdGFuY2VvZiBDbWQgJiYgKGNtZCA9PT0gdW5kZWZpbmVkIHx8IHYuY21kID09PSBjbWQpOworfQorCitmdW5jdGlvbiBpc0RpY3QodiwgdHlwZSkgeworICByZXR1cm4gdiBpbnN0YW5jZW9mIERpY3QgJiYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCBpc05hbWUodi5nZXQoIlR5cGUiKSwgdHlwZSkpOworfQorCitmdW5jdGlvbiBpc1JlZih2KSB7CisgIHJldHVybiB2IGluc3RhbmNlb2YgUmVmOworfQorCitmdW5jdGlvbiBpc1JlZnNFcXVhbCh2MSwgdjIpIHsKKyAgcmV0dXJuIHYxLm51bSA9PT0gdjIubnVtICYmIHYxLmdlbiA9PT0gdjIuZ2VuOworfQorCitmdW5jdGlvbiBpc1N0cmVhbSh2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gIm9iamVjdCIgJiYgdiAhPT0gbnVsbCAmJiB2LmdldEJ5dGVzICE9PSB1bmRlZmluZWQ7Cit9CisKK2Z1bmN0aW9uIGNsZWFyUHJpbWl0aXZlQ2FjaGVzKCkgeworICBDbWQuX2NsZWFyQ2FjaGUoKTsKKworICBOYW1lLl9jbGVhckNhY2hlKCk7CisKKyAgUmVmLl9jbGVhckNhY2hlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvcHNfcGFyc2VyLmpzIGIvbGliL2NvcmUvcHNfcGFyc2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzI3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9wc19wYXJzZXIuanMKQEAgLTAsMCArMSwyNjkgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBvc3RTY3JpcHRQYXJzZXIgPSBleHBvcnRzLlBvc3RTY3JpcHRMZXhlciA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfY29yZV91dGlscyA9IHJlcXVpcmUoIi4vY29yZV91dGlscy5qcyIpOworCitjbGFzcyBQb3N0U2NyaXB0UGFyc2VyIHsKKyAgY29uc3RydWN0b3IobGV4ZXIpIHsKKyAgICB0aGlzLmxleGVyID0gbGV4ZXI7CisgICAgdGhpcy5vcGVyYXRvcnMgPSBbXTsKKyAgICB0aGlzLnRva2VuID0gbnVsbDsKKyAgICB0aGlzLnByZXYgPSBudWxsOworICB9CisKKyAgbmV4dFRva2VuKCkgeworICAgIHRoaXMucHJldiA9IHRoaXMudG9rZW47CisgICAgdGhpcy50b2tlbiA9IHRoaXMubGV4ZXIuZ2V0VG9rZW4oKTsKKyAgfQorCisgIGFjY2VwdCh0eXBlKSB7CisgICAgaWYgKHRoaXMudG9rZW4udHlwZSA9PT0gdHlwZSkgeworICAgICAgdGhpcy5uZXh0VG9rZW4oKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGV4cGVjdCh0eXBlKSB7CisgICAgaWYgKHRoaXMuYWNjZXB0KHR5cGUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVuZXhwZWN0ZWQgc3ltYm9sOiBmb3VuZCAke3RoaXMudG9rZW4udHlwZX0gZXhwZWN0ZWQgJHt0eXBlfS5gKTsKKyAgfQorCisgIHBhcnNlKCkgeworICAgIHRoaXMubmV4dFRva2VuKCk7CisgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFKTsKKyAgICB0aGlzLnBhcnNlQmxvY2soKTsKKyAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOworICAgIHJldHVybiB0aGlzLm9wZXJhdG9yczsKKyAgfQorCisgIHBhcnNlQmxvY2soKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5OVU1CRVIpKSB7CisgICAgICAgIHRoaXMub3BlcmF0b3JzLnB1c2godGhpcy5wcmV2LnZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IpKSB7CisgICAgICAgIHRoaXMub3BlcmF0b3JzLnB1c2godGhpcy5wcmV2LnZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFKSkgeworICAgICAgICB0aGlzLnBhcnNlQ29uZGl0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgcGFyc2VDb25kaXRpb24oKSB7CisgICAgY29uc3QgY29uZGl0aW9uTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CisgICAgdGhpcy5vcGVyYXRvcnMucHVzaChudWxsLCBudWxsKTsKKyAgICB0aGlzLnBhcnNlQmxvY2soKTsKKyAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOworCisgICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLklGKSkgeworICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb25dID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOworICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb24gKyAxXSA9ICJqeiI7CisgICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7CisgICAgICBjb25zdCBqdW1wTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CisgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsIG51bGwpOworICAgICAgY29uc3QgZW5kT2ZUcnVlID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOworICAgICAgdGhpcy5wYXJzZUJsb2NrKCk7CisgICAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOworICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFKTsKKyAgICAgIHRoaXMub3BlcmF0b3JzW2p1bXBMb2NhdGlvbl0gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CisgICAgICB0aGlzLm9wZXJhdG9yc1tqdW1wTG9jYXRpb24gKyAxXSA9ICJqIjsKKyAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IGVuZE9mVHJ1ZTsKKyAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSAianoiOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBTIEZ1bmN0aW9uOiBlcnJvciBwYXJzaW5nIGNvbmRpdGlvbmFsLiIpOworICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuUG9zdFNjcmlwdFBhcnNlciA9IFBvc3RTY3JpcHRQYXJzZXI7Citjb25zdCBQb3N0U2NyaXB0VG9rZW5UeXBlcyA9IHsKKyAgTEJSQUNFOiAwLAorICBSQlJBQ0U6IDEsCisgIE5VTUJFUjogMiwKKyAgT1BFUkFUT1I6IDMsCisgIElGOiA0LAorICBJRkVMU0U6IDUKK307CisKK2NvbnN0IFBvc3RTY3JpcHRUb2tlbiA9IGZ1bmN0aW9uIFBvc3RTY3JpcHRUb2tlbkNsb3N1cmUoKSB7CisgIGNvbnN0IG9wQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgIGNsYXNzIFBvc3RTY3JpcHRUb2tlbiB7CisgICAgY29uc3RydWN0b3IodHlwZSwgdmFsdWUpIHsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgc3RhdGljIGdldE9wZXJhdG9yKG9wKSB7CisgICAgICBjb25zdCBvcFZhbHVlID0gb3BDYWNoZVtvcF07CisKKyAgICAgIGlmIChvcFZhbHVlKSB7CisgICAgICAgIHJldHVybiBvcFZhbHVlOworICAgICAgfQorCisgICAgICByZXR1cm4gb3BDYWNoZVtvcF0gPSBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLk9QRVJBVE9SLCBvcCk7CisgICAgfQorCisgICAgc3RhdGljIGdldCBMQlJBQ0UoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIkxCUkFDRSIsIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFLCAieyIpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZ2V0IFJCUkFDRSgpIHsKKyAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiUkJSQUNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UsICJ9IikpOworICAgIH0KKworICAgIHN0YXRpYyBnZXQgSUYoKSB7CisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIklGIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRiwgIklGIikpOworICAgIH0KKworICAgIHN0YXRpYyBnZXQgSUZFTFNFKCkgeworICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJJRkVMU0UiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLklGRUxTRSwgIklGRUxTRSIpKTsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiBQb3N0U2NyaXB0VG9rZW47Cit9KCk7CisKK2NsYXNzIFBvc3RTY3JpcHRMZXhlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSkgeworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICB0aGlzLnN0ckJ1ZiA9IFtdOworICB9CisKKyAgbmV4dENoYXIoKSB7CisgICAgcmV0dXJuIHRoaXMuY3VycmVudENoYXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CisgIH0KKworICBnZXRUb2tlbigpIHsKKyAgICBsZXQgY29tbWVudCA9IGZhbHNlOworICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGNoIDwgMCkgeworICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuRU9GOworICAgICAgfQorCisgICAgICBpZiAoY29tbWVudCkgeworICAgICAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKKyAgICAgICAgICBjb21tZW50ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjUpIHsKKyAgICAgICAgY29tbWVudCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKCEoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjaCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOworICAgIH0KKworICAgIHN3aXRjaCAoY2ggfCAwKSB7CisgICAgICBjYXNlIDB4MzA6CisgICAgICBjYXNlIDB4MzE6CisgICAgICBjYXNlIDB4MzI6CisgICAgICBjYXNlIDB4MzM6CisgICAgICBjYXNlIDB4MzQ6CisgICAgICBjYXNlIDB4MzU6CisgICAgICBjYXNlIDB4MzY6CisgICAgICBjYXNlIDB4Mzc6CisgICAgICBjYXNlIDB4Mzg6CisgICAgICBjYXNlIDB4Mzk6CisgICAgICBjYXNlIDB4MmI6CisgICAgICBjYXNlIDB4MmQ6CisgICAgICBjYXNlIDB4MmU6CisgICAgICAgIHJldHVybiBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLk5VTUJFUiwgdGhpcy5nZXROdW1iZXIoKSk7CisKKyAgICAgIGNhc2UgMHg3YjoKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTsKKworICAgICAgY2FzZSAweDdkOgorICAgICAgICB0aGlzLm5leHRDaGFyKCk7CisgICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uUkJSQUNFOworICAgIH0KKworICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOworICAgIHN0ckJ1Zi5sZW5ndGggPSAwOworICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOworCisgICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDVhIHx8IGNoID49IDB4NjEgJiYgY2ggPD0gMHg3YSkpIHsKKyAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICB9CisKKyAgICBjb25zdCBzdHIgPSBzdHJCdWYuam9pbigiIik7CisKKyAgICBzd2l0Y2ggKHN0ci50b0xvd2VyQ2FzZSgpKSB7CisgICAgICBjYXNlICJpZiI6CisgICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7CisKKyAgICAgIGNhc2UgImlmZWxzZSI6CisgICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUZFTFNFOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLmdldE9wZXJhdG9yKHN0cik7CisgICAgfQorICB9CisKKyAgZ2V0TnVtYmVyKCkgeworICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CisgICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CisgICAgc3RyQnVmLmxlbmd0aCA9IDA7CisgICAgc3RyQnVmWzBdID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisKKyAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwKSB7CisgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8IGNoID09PSAweDJkIHx8IGNoID09PSAweDJlKSB7CisgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChzdHJCdWYuam9pbigiIikpOworCisgICAgaWYgKGlzTmFOKHZhbHVlKSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIGZsb2F0aW5nIHBvaW50IG51bWJlcjogJHt2YWx1ZX1gKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworfQorCitleHBvcnRzLlBvc3RTY3JpcHRMZXhlciA9IFBvc3RTY3JpcHRMZXhlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9zdGFuZGFyZF9mb250cy5qcyBiL2xpYi9jb3JlL3N0YW5kYXJkX2ZvbnRzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MzJjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS9zdGFuZGFyZF9mb250cy5qcwpAQCAtMCwwICsxLDc1OSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpID0gZXhwb3J0cy5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSBleHBvcnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGV4cG9ydHMuZ2V0U3ltYm9sc0ZvbnRzID0gZXhwb3J0cy5nZXRTZXJpZkZvbnRzID0gZXhwb3J0cy5nZXROb25TdGRGb250TWFwID0gZXhwb3J0cy5nZXRTdGRGb250TWFwID0gdm9pZCAwOworCit2YXIgX2NvcmVfdXRpbHMgPSByZXF1aXJlKCIuL2NvcmVfdXRpbHMuanMiKTsKKworY29uc3QgZ2V0U3RkRm9udE1hcCA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CisgIHQuQXJpYWxOYXJyb3cgPSAiSGVsdmV0aWNhIjsKKyAgdFsiQXJpYWxOYXJyb3ctQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQXJpYWxOYXJyb3ctQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkFyaWFsTmFycm93LUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdC5BcmlhbEJsYWNrID0gIkhlbHZldGljYSI7CisgIHRbIkFyaWFsQmxhY2stQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQXJpYWxCbGFjay1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKKyAgdFsiQXJpYWxCbGFjay1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CisgIHRbIkFyaWFsLUJsYWNrIl0gPSAiSGVsdmV0aWNhIjsKKyAgdFsiQXJpYWwtQmxhY2stQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQXJpYWwtQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CisgIHRbIkFyaWFsLUJsYWNrLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdC5BcmlhbCA9ICJIZWx2ZXRpY2EiOworICB0WyJBcmlhbC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJBcmlhbC1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKKyAgdFsiQXJpYWwtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJBcmlhbC1Cb2xkTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CisgIHRbIkFyaWFsLUl0YWxpY01UIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0LkFyaWFsTVQgPSAiSGVsdmV0aWNhIjsKKyAgdFsiQ291cmllci1Cb2xkIl0gPSAiQ291cmllci1Cb2xkIjsKKyAgdFsiQ291cmllci1Cb2xkSXRhbGljIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CisgIHRbIkNvdXJpZXItSXRhbGljIl0gPSAiQ291cmllci1PYmxpcXVlIjsKKyAgdC5Db3VyaWVyTmV3ID0gIkNvdXJpZXIiOworICB0WyJDb3VyaWVyTmV3LUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOworICB0WyJDb3VyaWVyTmV3LUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKKyAgdFsiQ291cmllck5ldy1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOworICB0WyJDb3VyaWVyTmV3UFMtQm9sZEl0YWxpY01UIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CisgIHRbIkNvdXJpZXJOZXdQUy1Cb2xkTVQiXSA9ICJDb3VyaWVyLUJvbGQiOworICB0WyJDb3VyaWVyTmV3UFMtSXRhbGljTVQiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOworICB0LkNvdXJpZXJOZXdQU01UID0gIkNvdXJpZXIiOworICB0LkhlbHZldGljYSA9ICJIZWx2ZXRpY2EiOworICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJIZWx2ZXRpY2EtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOworICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdFsiU3ltYm9sLUJvbGQiXSA9ICJTeW1ib2wiOworICB0WyJTeW1ib2wtQm9sZEl0YWxpYyJdID0gIlN5bWJvbCI7CisgIHRbIlN5bWJvbC1JdGFsaWMiXSA9ICJTeW1ib2wiOworICB0LlRpbWVzTmV3Um9tYW4gPSAiVGltZXMtUm9tYW4iOworICB0WyJUaW1lc05ld1JvbWFuLUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKKyAgdFsiVGltZXNOZXdSb21hbi1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CisgIHRbIlRpbWVzTmV3Um9tYW4tSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKKyAgdC5UaW1lc05ld1JvbWFuUFMgPSAiVGltZXMtUm9tYW4iOworICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZCJdID0gIlRpbWVzLUJvbGQiOworICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOworICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpY01UIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CisgIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkTVQiXSA9ICJUaW1lcy1Cb2xkIjsKKyAgdFsiVGltZXNOZXdSb21hblBTLUl0YWxpYyJdID0gIlRpbWVzLUl0YWxpYyI7CisgIHRbIlRpbWVzTmV3Um9tYW5QUy1JdGFsaWNNVCJdID0gIlRpbWVzLUl0YWxpYyI7CisgIHQuVGltZXNOZXdSb21hblBTTVQgPSAiVGltZXMtUm9tYW4iOworICB0WyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CisgIHRbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGRJdGFsaWMiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKKyAgdFsiVGltZXNOZXdSb21hblBTTVQtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKK30pOworZXhwb3J0cy5nZXRTdGRGb250TWFwID0gZ2V0U3RkRm9udE1hcDsKK2NvbnN0IGdldE5vblN0ZEZvbnRNYXAgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0LkNhbGlicmkgPSAiSGVsdmV0aWNhIjsKKyAgdFsiQ2FsaWJyaS1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOworICB0WyJDYWxpYnJpLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOworICB0WyJDYWxpYnJpLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKKyAgdC5DZW50dXJ5R290aGljID0gIkhlbHZldGljYSI7CisgIHRbIkNlbnR1cnlHb3RoaWMtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiQ2VudHVyeUdvdGhpYy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKKyAgdFsiQ2VudHVyeUdvdGhpYy1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CisgIHQuQ29taWNTYW5zTVMgPSAiQ29taWMgU2FucyBNUyI7CisgIHRbIkNvbWljU2Fuc01TLUJvbGQiXSA9ICJDb21pYyBTYW5zIE1TLUJvbGQiOworICB0WyJDb21pY1NhbnNNUy1Cb2xkSXRhbGljIl0gPSAiQ29taWMgU2FucyBNUy1Cb2xkSXRhbGljIjsKKyAgdFsiQ29taWNTYW5zTVMtSXRhbGljIl0gPSAiQ29taWMgU2FucyBNUy1JdGFsaWMiOworICB0Lkx1Y2lkYUNvbnNvbGUgPSAiQ291cmllciI7CisgIHRbIkx1Y2lkYUNvbnNvbGUtQm9sZCJdID0gIkNvdXJpZXItQm9sZCI7CisgIHRbIkx1Y2lkYUNvbnNvbGUtQm9sZEl0YWxpYyJdID0gIkNvdXJpZXItQm9sZE9ibGlxdWUiOworICB0WyJMdWNpZGFDb25zb2xlLUl0YWxpYyJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CisgIHRbIkx1Y2lkYVNhbnMtRGVtaSJdID0gIkhlbHZldGljYS1Cb2xkIjsKKyAgdFsiTVMtR290aGljIl0gPSAiTVMgR290aGljIjsKKyAgdFsiTVMtR290aGljLUJvbGQiXSA9ICJNUyBHb3RoaWMtQm9sZCI7CisgIHRbIk1TLUdvdGhpYy1Cb2xkSXRhbGljIl0gPSAiTVMgR290aGljLUJvbGRJdGFsaWMiOworICB0WyJNUy1Hb3RoaWMtSXRhbGljIl0gPSAiTVMgR290aGljLUl0YWxpYyI7CisgIHRbIk1TLU1pbmNobyJdID0gIk1TIE1pbmNobyI7CisgIHRbIk1TLU1pbmNoby1Cb2xkIl0gPSAiTVMgTWluY2hvLUJvbGQiOworICB0WyJNUy1NaW5jaG8tQm9sZEl0YWxpYyJdID0gIk1TIE1pbmNoby1Cb2xkSXRhbGljIjsKKyAgdFsiTVMtTWluY2hvLUl0YWxpYyJdID0gIk1TIE1pbmNoby1JdGFsaWMiOworICB0WyJNUy1QR290aGljIl0gPSAiTVMgUEdvdGhpYyI7CisgIHRbIk1TLVBHb3RoaWMtQm9sZCJdID0gIk1TIFBHb3RoaWMtQm9sZCI7CisgIHRbIk1TLVBHb3RoaWMtQm9sZEl0YWxpYyJdID0gIk1TIFBHb3RoaWMtQm9sZEl0YWxpYyI7CisgIHRbIk1TLVBHb3RoaWMtSXRhbGljIl0gPSAiTVMgUEdvdGhpYy1JdGFsaWMiOworICB0WyJNUy1QTWluY2hvIl0gPSAiTVMgUE1pbmNobyI7CisgIHRbIk1TLVBNaW5jaG8tQm9sZCJdID0gIk1TIFBNaW5jaG8tQm9sZCI7CisgIHRbIk1TLVBNaW5jaG8tQm9sZEl0YWxpYyJdID0gIk1TIFBNaW5jaG8tQm9sZEl0YWxpYyI7CisgIHRbIk1TLVBNaW5jaG8tSXRhbGljIl0gPSAiTVMgUE1pbmNoby1JdGFsaWMiOworICB0Lk51cHRpYWxTY3JpcHQgPSAiVGltZXMtSXRhbGljIjsKKyAgdC5TZWdvZVVJU3ltYm9sID0gIkhlbHZldGljYSI7CisgIHQuV2luZ2RpbmdzID0gIlphcGZEaW5nYmF0cyI7CisgIHRbIldpbmdkaW5ncy1SZWd1bGFyIl0gPSAiWmFwZkRpbmdiYXRzIjsKK30pOworZXhwb3J0cy5nZXROb25TdGRGb250TWFwID0gZ2V0Tm9uU3RkRm9udE1hcDsKK2NvbnN0IGdldFNlcmlmRm9udHMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0WyJBZG9iZSBKZW5zb24iXSA9IHRydWU7CisgIHRbIkFkb2JlIFRleHQiXSA9IHRydWU7CisgIHQuQWxiZXJ0dXMgPSB0cnVlOworICB0LkFsZHVzID0gdHJ1ZTsKKyAgdC5BbGV4YW5kcmlhID0gdHJ1ZTsKKyAgdC5BbGdlcmlhbiA9IHRydWU7CisgIHRbIkFtZXJpY2FuIFR5cGV3cml0ZXIiXSA9IHRydWU7CisgIHQuQW50aXF1YSA9IHRydWU7CisgIHQuQXBleCA9IHRydWU7CisgIHQuQXJubyA9IHRydWU7CisgIHQuQXN0ZXIgPSB0cnVlOworICB0LkF1cm9yYSA9IHRydWU7CisgIHQuQmFza2VydmlsbGUgPSB0cnVlOworICB0LkJlbGwgPSB0cnVlOworICB0LkJlbWJvID0gdHJ1ZTsKKyAgdFsiQmVtYm8gU2Nob29sYm9vayJdID0gdHJ1ZTsKKyAgdC5CZW5ndWlhdCA9IHRydWU7CisgIHRbIkJlcmtlbGV5IE9sZCBTdHlsZSJdID0gdHJ1ZTsKKyAgdFsiQmVybmhhcmQgTW9kZXJuIl0gPSB0cnVlOworICB0WyJCZXJ0aG9sZCBDaXR5Il0gPSB0cnVlOworICB0LkJvZG9uaSA9IHRydWU7CisgIHRbIkJhdWVyIEJvZG9uaSJdID0gdHJ1ZTsKKyAgdFsiQm9vayBBbnRpcXVhIl0gPSB0cnVlOworICB0LkJvb2ttYW4gPSB0cnVlOworICB0WyJCb3JkZWF1eCBSb21hbiJdID0gdHJ1ZTsKKyAgdFsiQ2FsaWZvcm5pYW4gRkIiXSA9IHRydWU7CisgIHQuQ2FsaXN0byA9IHRydWU7CisgIHQuQ2FsdmVydCA9IHRydWU7CisgIHQuQ2FwaXRhbHMgPSB0cnVlOworICB0LkNhbWJyaWEgPSB0cnVlOworICB0LkNhcnRpZXIgPSB0cnVlOworICB0LkNhc2xvbiA9IHRydWU7CisgIHQuQ2F0dWxsID0gdHJ1ZTsKKyAgdC5DZW50YXVyID0gdHJ1ZTsKKyAgdFsiQ2VudHVyeSBPbGQgU3R5bGUiXSA9IHRydWU7CisgIHRbIkNlbnR1cnkgU2Nob29sYm9vayJdID0gdHJ1ZTsKKyAgdC5DaGFwYXJyYWwgPSB0cnVlOworICB0WyJDaGFyaXMgU0lMIl0gPSB0cnVlOworICB0LkNoZWx0ZW5oYW0gPSB0cnVlOworICB0WyJDaG9sbGEgU2xhYiJdID0gdHJ1ZTsKKyAgdC5DbGFyZW5kb24gPSB0cnVlOworICB0LkNsZWFyZmFjZSA9IHRydWU7CisgIHQuQ29jaGluID0gdHJ1ZTsKKyAgdC5Db2xvbm5hID0gdHJ1ZTsKKyAgdFsiQ29tcHV0ZXIgTW9kZXJuIl0gPSB0cnVlOworICB0WyJDb25jcmV0ZSBSb21hbiJdID0gdHJ1ZTsKKyAgdC5Db25zdGFudGlhID0gdHJ1ZTsKKyAgdFsiQ29vcGVyIEJsYWNrIl0gPSB0cnVlOworICB0LkNvcm9uYSA9IHRydWU7CisgIHQuRWNvdHlwZSA9IHRydWU7CisgIHQuRWd5cHRpZW5uZSA9IHRydWU7CisgIHQuRWxlcGhhbnQgPSB0cnVlOworICB0LkV4Y2Vsc2lvciA9IHRydWU7CisgIHQuRmFpcmZpZWxkID0gdHJ1ZTsKKyAgdFsiRkYgU2NhbGEiXSA9IHRydWU7CisgIHQuRm9sa2FyZCA9IHRydWU7CisgIHQuRm9vdGxpZ2h0ID0gdHJ1ZTsKKyAgdC5GcmVlU2VyaWYgPSB0cnVlOworICB0WyJGcml6IFF1YWRyYXRhIl0gPSB0cnVlOworICB0LkdhcmFtb25kID0gdHJ1ZTsKKyAgdC5HZW50aXVtID0gdHJ1ZTsKKyAgdC5HZW9yZ2lhID0gdHJ1ZTsKKyAgdC5HbG91Y2VzdGVyID0gdHJ1ZTsKKyAgdFsiR291ZHkgT2xkIFN0eWxlIl0gPSB0cnVlOworICB0WyJHb3VkeSBTY2hvb2xib29rIl0gPSB0cnVlOworICB0WyJHb3VkeSBQcm8gRm9udCJdID0gdHJ1ZTsKKyAgdC5HcmFuam9uID0gdHJ1ZTsKKyAgdFsiR3VhcmRpYW4gRWd5cHRpYW4iXSA9IHRydWU7CisgIHQuSGVhdGhlciA9IHRydWU7CisgIHQuSGVyY3VsZXMgPSB0cnVlOworICB0WyJIaWdoIFRvd2VyIFRleHQiXSA9IHRydWU7CisgIHQuSGlyb3NoaWdlID0gdHJ1ZTsKKyAgdFsiSG9lZmxlciBUZXh0Il0gPSB0cnVlOworICB0WyJIdW1hbmEgU2VyaWYiXSA9IHRydWU7CisgIHQuSW1wcmludCA9IHRydWU7CisgIHRbIklvbmljIE5vLiA1Il0gPSB0cnVlOworICB0LkphbnNvbiA9IHRydWU7CisgIHQuSm9hbm5hID0gdHJ1ZTsKKyAgdC5Lb3Jpbm5hID0gdHJ1ZTsKKyAgdC5MZXhpY29uID0gdHJ1ZTsKKyAgdFsiTGliZXJhdGlvbiBTZXJpZiJdID0gdHJ1ZTsKKyAgdFsiTGludXggTGliZXJ0aW5lIl0gPSB0cnVlOworICB0LkxpdGVyYXR1cm5heWEgPSB0cnVlOworICB0Lkx1Y2lkYSA9IHRydWU7CisgIHRbIkx1Y2lkYSBCcmlnaHQiXSA9IHRydWU7CisgIHQuTWVsaW9yID0gdHJ1ZTsKKyAgdC5NZW1waGlzID0gdHJ1ZTsKKyAgdC5NaWxsZXIgPSB0cnVlOworICB0Lk1pbmlvbiA9IHRydWU7CisgIHQuTW9kZXJuID0gdHJ1ZTsKKyAgdFsiTW9uYSBMaXNhIl0gPSB0cnVlOworICB0WyJNcnMgRWF2ZXMiXSA9IHRydWU7CisgIHRbIk1TIFNlcmlmIl0gPSB0cnVlOworICB0WyJNdXNlbyBTbGFiIl0gPSB0cnVlOworICB0WyJOZXcgWW9yayJdID0gdHJ1ZTsKKyAgdFsiTmltYnVzIFJvbWFuIl0gPSB0cnVlOworICB0WyJOUFMgUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CisgIHQuTnVwdGlhbFNjcmlwdCA9IHRydWU7CisgIHQuUGFsYXRpbm8gPSB0cnVlOworICB0LlBlcnBldHVhID0gdHJ1ZTsKKyAgdC5QbGFudGluID0gdHJ1ZTsKKyAgdFsiUGxhbnRpbiBTY2hvb2xib29rIl0gPSB0cnVlOworICB0LlBsYXliaWxsID0gdHJ1ZTsKKyAgdFsiUG9vciBSaWNoYXJkIl0gPSB0cnVlOworICB0WyJSYXdsaW5zb24gUm9hZHdheSJdID0gdHJ1ZTsKKyAgdC5SZW5hdWx0ID0gdHJ1ZTsKKyAgdC5SZXF1aWVtID0gdHJ1ZTsKKyAgdC5Sb2Nrd2VsbCA9IHRydWU7CisgIHQuUm9tYW4gPSB0cnVlOworICB0WyJSb3RpcyBTZXJpZiJdID0gdHJ1ZTsKKyAgdC5TYWJvbiA9IHRydWU7CisgIHQuU2NhbGEgPSB0cnVlOworICB0LlNlYWd1bGwgPSB0cnVlOworICB0LlNpc3RpbmEgPSB0cnVlOworICB0LlNvdXZlbmlyID0gdHJ1ZTsKKyAgdC5TVElYID0gdHJ1ZTsKKyAgdFsiU3RvbmUgSW5mb3JtYWwiXSA9IHRydWU7CisgIHRbIlN0b25lIFNlcmlmIl0gPSB0cnVlOworICB0LlN5bGZhZW4gPSB0cnVlOworICB0LlRpbWVzID0gdHJ1ZTsKKyAgdC5UcmFqYW4gPSB0cnVlOworICB0WyJUcmluaXTDqSJdID0gdHJ1ZTsKKyAgdFsiVHJ1bXAgTWVkaWFldmFsIl0gPSB0cnVlOworICB0LlV0b3BpYSA9IHRydWU7CisgIHRbIlZhbGUgVHlwZSJdID0gdHJ1ZTsKKyAgdFsiQml0c3RyZWFtIFZlcmEiXSA9IHRydWU7CisgIHRbIlZlcmEgU2VyaWYiXSA9IHRydWU7CisgIHQuVmVyc2FpbGxlcyA9IHRydWU7CisgIHQuV2FudGVkID0gdHJ1ZTsKKyAgdC5XZWlzcyA9IHRydWU7CisgIHRbIldpZGUgTGF0aW4iXSA9IHRydWU7CisgIHQuV2luZHNvciA9IHRydWU7CisgIHQuWElUUyA9IHRydWU7Cit9KTsKK2V4cG9ydHMuZ2V0U2VyaWZGb250cyA9IGdldFNlcmlmRm9udHM7Citjb25zdCBnZXRTeW1ib2xzRm9udHMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0LkRpbmdiYXRzID0gdHJ1ZTsKKyAgdC5TeW1ib2wgPSB0cnVlOworICB0LlphcGZEaW5nYmF0cyA9IHRydWU7Cit9KTsKK2V4cG9ydHMuZ2V0U3ltYm9sc0ZvbnRzID0gZ2V0U3ltYm9sc0ZvbnRzOworY29uc3QgZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgdFsyXSA9IDEwOworICB0WzNdID0gMzI7CisgIHRbNF0gPSAzMzsKKyAgdFs1XSA9IDM0OworICB0WzZdID0gMzU7CisgIHRbN10gPSAzNjsKKyAgdFs4XSA9IDM3OworICB0WzldID0gMzg7CisgIHRbMTBdID0gMzk7CisgIHRbMTFdID0gNDA7CisgIHRbMTJdID0gNDE7CisgIHRbMTNdID0gNDI7CisgIHRbMTRdID0gNDM7CisgIHRbMTVdID0gNDQ7CisgIHRbMTZdID0gNDU7CisgIHRbMTddID0gNDY7CisgIHRbMThdID0gNDc7CisgIHRbMTldID0gNDg7CisgIHRbMjBdID0gNDk7CisgIHRbMjFdID0gNTA7CisgIHRbMjJdID0gNTE7CisgIHRbMjNdID0gNTI7CisgIHRbMjRdID0gNTM7CisgIHRbMjVdID0gNTQ7CisgIHRbMjZdID0gNTU7CisgIHRbMjddID0gNTY7CisgIHRbMjhdID0gNTc7CisgIHRbMjldID0gNTg7CisgIHRbMzBdID0gODk0OworICB0WzMxXSA9IDYwOworICB0WzMyXSA9IDYxOworICB0WzMzXSA9IDYyOworICB0WzM0XSA9IDYzOworICB0WzM1XSA9IDY0OworICB0WzM2XSA9IDY1OworICB0WzM3XSA9IDY2OworICB0WzM4XSA9IDY3OworICB0WzM5XSA9IDY4OworICB0WzQwXSA9IDY5OworICB0WzQxXSA9IDcwOworICB0WzQyXSA9IDcxOworICB0WzQzXSA9IDcyOworICB0WzQ0XSA9IDczOworICB0WzQ1XSA9IDc0OworICB0WzQ2XSA9IDc1OworICB0WzQ3XSA9IDc2OworICB0WzQ4XSA9IDc3OworICB0WzQ5XSA9IDc4OworICB0WzUwXSA9IDc5OworICB0WzUxXSA9IDgwOworICB0WzUyXSA9IDgxOworICB0WzUzXSA9IDgyOworICB0WzU0XSA9IDgzOworICB0WzU1XSA9IDg0OworICB0WzU2XSA9IDg1OworICB0WzU3XSA9IDg2OworICB0WzU4XSA9IDg3OworICB0WzU5XSA9IDg4OworICB0WzYwXSA9IDg5OworICB0WzYxXSA9IDkwOworICB0WzYyXSA9IDkxOworICB0WzYzXSA9IDkyOworICB0WzY0XSA9IDkzOworICB0WzY1XSA9IDk0OworICB0WzY2XSA9IDk1OworICB0WzY3XSA9IDk2OworICB0WzY4XSA9IDk3OworICB0WzY5XSA9IDk4OworICB0WzcwXSA9IDk5OworICB0WzcxXSA9IDEwMDsKKyAgdFs3Ml0gPSAxMDE7CisgIHRbNzNdID0gMTAyOworICB0Wzc0XSA9IDEwMzsKKyAgdFs3NV0gPSAxMDQ7CisgIHRbNzZdID0gMTA1OworICB0Wzc3XSA9IDEwNjsKKyAgdFs3OF0gPSAxMDc7CisgIHRbNzldID0gMTA4OworICB0WzgwXSA9IDEwOTsKKyAgdFs4MV0gPSAxMTA7CisgIHRbODJdID0gMTExOworICB0WzgzXSA9IDExMjsKKyAgdFs4NF0gPSAxMTM7CisgIHRbODVdID0gMTE0OworICB0Wzg2XSA9IDExNTsKKyAgdFs4N10gPSAxMTY7CisgIHRbODhdID0gMTE3OworICB0Wzg5XSA9IDExODsKKyAgdFs5MF0gPSAxMTk7CisgIHRbOTFdID0gMTIwOworICB0WzkyXSA9IDEyMTsKKyAgdFs5M10gPSAxMjI7CisgIHRbOTRdID0gMTIzOworICB0Wzk1XSA9IDEyNDsKKyAgdFs5Nl0gPSAxMjU7CisgIHRbOTddID0gMTI2OworICB0Wzk4XSA9IDE5NjsKKyAgdFs5OV0gPSAxOTc7CisgIHRbMTAwXSA9IDE5OTsKKyAgdFsxMDFdID0gMjAxOworICB0WzEwMl0gPSAyMDk7CisgIHRbMTAzXSA9IDIxNDsKKyAgdFsxMDRdID0gMjIwOworICB0WzEwNV0gPSAyMjU7CisgIHRbMTA2XSA9IDIyNDsKKyAgdFsxMDddID0gMjI2OworICB0WzEwOF0gPSAyMjg7CisgIHRbMTA5XSA9IDIyNzsKKyAgdFsxMTBdID0gMjI5OworICB0WzExMV0gPSAyMzE7CisgIHRbMTEyXSA9IDIzMzsKKyAgdFsxMTNdID0gMjMyOworICB0WzExNF0gPSAyMzQ7CisgIHRbMTE1XSA9IDIzNTsKKyAgdFsxMTZdID0gMjM3OworICB0WzExN10gPSAyMzY7CisgIHRbMTE4XSA9IDIzODsKKyAgdFsxMTldID0gMjM5OworICB0WzEyMF0gPSAyNDE7CisgIHRbMTIxXSA9IDI0MzsKKyAgdFsxMjJdID0gMjQyOworICB0WzEyM10gPSAyNDQ7CisgIHRbMTI0XSA9IDI0NjsKKyAgdFsxMjVdID0gMjQ1OworICB0WzEyNl0gPSAyNTA7CisgIHRbMTI3XSA9IDI0OTsKKyAgdFsxMjhdID0gMjUxOworICB0WzEyOV0gPSAyNTI7CisgIHRbMTMwXSA9IDgyMjQ7CisgIHRbMTMxXSA9IDE3NjsKKyAgdFsxMzJdID0gMTYyOworICB0WzEzM10gPSAxNjM7CisgIHRbMTM0XSA9IDE2NzsKKyAgdFsxMzVdID0gODIyNjsKKyAgdFsxMzZdID0gMTgyOworICB0WzEzN10gPSAyMjM7CisgIHRbMTM4XSA9IDE3NDsKKyAgdFsxMzldID0gMTY5OworICB0WzE0MF0gPSA4NDgyOworICB0WzE0MV0gPSAxODA7CisgIHRbMTQyXSA9IDE2ODsKKyAgdFsxNDNdID0gODgwMDsKKyAgdFsxNDRdID0gMTk4OworICB0WzE0NV0gPSAyMTY7CisgIHRbMTQ2XSA9IDg3MzQ7CisgIHRbMTQ3XSA9IDE3NzsKKyAgdFsxNDhdID0gODgwNDsKKyAgdFsxNDldID0gODgwNTsKKyAgdFsxNTBdID0gMTY1OworICB0WzE1MV0gPSAxODE7CisgIHRbMTUyXSA9IDg3MDY7CisgIHRbMTUzXSA9IDg3MjE7CisgIHRbMTU0XSA9IDg3MTk7CisgIHRbMTU2XSA9IDg3NDc7CisgIHRbMTU3XSA9IDE3MDsKKyAgdFsxNThdID0gMTg2OworICB0WzE1OV0gPSA4NDg2OworICB0WzE2MF0gPSAyMzA7CisgIHRbMTYxXSA9IDI0ODsKKyAgdFsxNjJdID0gMTkxOworICB0WzE2M10gPSAxNjE7CisgIHRbMTY0XSA9IDE3MjsKKyAgdFsxNjVdID0gODczMDsKKyAgdFsxNjZdID0gNDAyOworICB0WzE2N10gPSA4Nzc2OworICB0WzE2OF0gPSA4NzEwOworICB0WzE2OV0gPSAxNzE7CisgIHRbMTcwXSA9IDE4NzsKKyAgdFsxNzFdID0gODIzMDsKKyAgdFsyMTBdID0gMjE4OworICB0WzIyM10gPSA3MTE7CisgIHRbMjI0XSA9IDMyMTsKKyAgdFsyMjVdID0gMzIyOworICB0WzIyN10gPSAzNTM7CisgIHRbMjI5XSA9IDM4MjsKKyAgdFsyMzRdID0gMjUzOworICB0WzI1Ml0gPSAyNjM7CisgIHRbMjUzXSA9IDI2ODsKKyAgdFsyNTRdID0gMjY5OworICB0WzI1OF0gPSAyNTg7CisgIHRbMjYwXSA9IDI2MDsKKyAgdFsyNjFdID0gMjYxOworICB0WzI2NV0gPSAyODA7CisgIHRbMjY2XSA9IDI4MTsKKyAgdFsyNjhdID0gMjgzOworICB0WzI2OV0gPSAzMTM7CisgIHRbMjc1XSA9IDMyMzsKKyAgdFsyNzZdID0gMzI0OworICB0WzI3OF0gPSAzMjg7CisgIHRbMjg0XSA9IDM0NTsKKyAgdFsyODVdID0gMzQ2OworICB0WzI4Nl0gPSAzNDc7CisgIHRbMjkyXSA9IDM2NzsKKyAgdFsyOTVdID0gMzc3OworICB0WzI5Nl0gPSAzNzg7CisgIHRbMjk4XSA9IDM4MDsKKyAgdFszMDVdID0gOTYzOworICB0WzMwNl0gPSA5NjQ7CisgIHRbMzA3XSA9IDk2NjsKKyAgdFszMDhdID0gODIxNTsKKyAgdFszMDldID0gODI1MjsKKyAgdFszMTBdID0gODMxOTsKKyAgdFszMTFdID0gODM1OTsKKyAgdFszMTJdID0gODU5MjsKKyAgdFszMTNdID0gODU5MzsKKyAgdFszMzddID0gOTU1MjsKKyAgdFs0OTNdID0gMTAzOTsKKyAgdFs0OTRdID0gMTA0MDsKKyAgdFs3MDVdID0gMTUyNDsKKyAgdFs3MDZdID0gODM2MjsKKyAgdFs3MTBdID0gNjQyODg7CisgIHRbNzExXSA9IDY0Mjk4OworICB0Wzc1OV0gPSAxNjE3OworICB0Wzc2MV0gPSAxNzc2OworICB0Wzc2M10gPSAxNzc4OworICB0Wzc3NV0gPSAxNjUyOworICB0Wzc3N10gPSAxNzY0OworICB0Wzc3OF0gPSAxNzgwOworICB0Wzc3OV0gPSAxNzgxOworICB0Wzc4MF0gPSAxNzgyOworICB0Wzc4Ml0gPSA3NzE7CisgIHRbNzgzXSA9IDY0NzI2OworICB0Wzc4Nl0gPSA4MzYzOworICB0Wzc4OF0gPSA4NTMyOworICB0Wzc5MF0gPSA3Njg7CisgIHRbNzkxXSA9IDc2OTsKKyAgdFs3OTJdID0gNzY4OworICB0Wzc5NV0gPSA4MDM7CisgIHRbNzk3XSA9IDY0MzM2OworICB0Wzc5OF0gPSA2NDMzNzsKKyAgdFs3OTldID0gNjQzNDI7CisgIHRbODAwXSA9IDY0MzQzOworICB0WzgwMV0gPSA2NDM0NDsKKyAgdFs4MDJdID0gNjQzNDU7CisgIHRbODAzXSA9IDY0MzYyOworICB0WzgwNF0gPSA2NDM2MzsKKyAgdFs4MDVdID0gNjQzNjQ7CisgIHRbMjQyNF0gPSA3ODIxOworICB0WzI0MjVdID0gNzgyMjsKKyAgdFsyNDI2XSA9IDc4MjM7CisgIHRbMjQyN10gPSA3ODI0OworICB0WzI0MjhdID0gNzgyNTsKKyAgdFsyNDI5XSA9IDc4MjY7CisgIHRbMjQzMF0gPSA3ODI3OworICB0WzI0MzNdID0gNzY4MjsKKyAgdFsyNjc4XSA9IDgwNDU7CisgIHRbMjY3OV0gPSA4MDQ2OworICB0WzI4MzBdID0gMTU1MjsKKyAgdFsyODM4XSA9IDY4NjsKKyAgdFsyODQwXSA9IDc1MTsKKyAgdFsyODQyXSA9IDc1MzsKKyAgdFsyODQzXSA9IDc1NDsKKyAgdFsyODQ0XSA9IDc1NTsKKyAgdFsyODQ2XSA9IDc1NzsKKyAgdFsyODU2XSA9IDc2NzsKKyAgdFsyODU3XSA9IDg0ODsKKyAgdFsyODU4XSA9IDg0OTsKKyAgdFsyODYyXSA9IDg1MzsKKyAgdFsyODYzXSA9IDg1NDsKKyAgdFsyODY0XSA9IDg1NTsKKyAgdFsyODY1XSA9IDg2MTsKKyAgdFsyODY2XSA9IDg2MjsKKyAgdFsyOTA2XSA9IDc0NjA7CisgIHRbMjkwOF0gPSA3NDYyOworICB0WzI5MDldID0gNzQ2MzsKKyAgdFsyOTEwXSA9IDc0NjQ7CisgIHRbMjkxMl0gPSA3NDY2OworICB0WzI5MTNdID0gNzQ2NzsKKyAgdFsyOTE0XSA9IDc0Njg7CisgIHRbMjkxNl0gPSA3NDcwOworICB0WzI5MTddID0gNzQ3MTsKKyAgdFsyOTE4XSA9IDc0NzI7CisgIHRbMjkyMF0gPSA3NDc0OworICB0WzI5MjFdID0gNzQ3NTsKKyAgdFsyOTIyXSA9IDc0NzY7CisgIHRbMjkyNF0gPSA3NDc4OworICB0WzI5MjVdID0gNzQ3OTsKKyAgdFsyOTI2XSA9IDc0ODA7CisgIHRbMjkyOF0gPSA3NDgyOworICB0WzI5MjldID0gNzQ4MzsKKyAgdFsyOTMwXSA9IDc0ODQ7CisgIHRbMjkzMl0gPSA3NDg2OworICB0WzI5MzNdID0gNzQ4NzsKKyAgdFsyOTM0XSA9IDc0ODg7CisgIHRbMjkzNl0gPSA3NDkwOworICB0WzI5MzddID0gNzQ5MTsKKyAgdFsyOTM4XSA9IDc0OTI7CisgIHRbMjk0MF0gPSA3NDk0OworICB0WzI5NDFdID0gNzQ5NTsKKyAgdFsyOTQyXSA9IDc0OTY7CisgIHRbMjk0NF0gPSA3NDk4OworICB0WzI5NDZdID0gNzUwMDsKKyAgdFsyOTQ4XSA9IDc1MDI7CisgIHRbMjk1MF0gPSA3NTA0OworICB0WzI5NTFdID0gNzUwNTsKKyAgdFsyOTUyXSA9IDc1MDY7CisgIHRbMjk1NF0gPSA3NTA4OworICB0WzI5NTVdID0gNzUwOTsKKyAgdFsyOTU2XSA9IDc1MTA7CisgIHRbMjk1OF0gPSA3NTEyOworICB0WzI5NTldID0gNzUxMzsKKyAgdFsyOTYwXSA9IDc1MTQ7CisgIHRbMjk2Ml0gPSA3NTE2OworICB0WzI5NjNdID0gNzUxNzsKKyAgdFsyOTY0XSA9IDc1MTg7CisgIHRbMjk2Nl0gPSA3NTIwOworICB0WzI5NjddID0gNzUyMTsKKyAgdFsyOTY4XSA9IDc1MjI7CisgIHRbMjk3MF0gPSA3NTI0OworICB0WzI5NzFdID0gNzUyNTsKKyAgdFsyOTcyXSA9IDc1MjY7CisgIHRbMjk3NF0gPSA3NTI4OworICB0WzI5NzVdID0gNzUyOTsKKyAgdFsyOTc2XSA9IDc1MzA7CisgIHRbMjk3OF0gPSAxNTM3OworICB0WzI5NzldID0gMTUzODsKKyAgdFsyOTgwXSA9IDE1Mzk7CisgIHRbMjk4Ml0gPSAxNTQ5OworICB0WzI5ODNdID0gMTU1MTsKKyAgdFsyOTg0XSA9IDE1NTI7CisgIHRbMjk4Nl0gPSAxNTU0OworICB0WzI5ODddID0gMTU1NTsKKyAgdFsyOTg4XSA9IDE1NTY7CisgIHRbMjk5MF0gPSAxNjIzOworICB0WzI5OTFdID0gMTYyNDsKKyAgdFsyOTk1XSA9IDE3NzU7CisgIHRbMjk5OV0gPSAxNzkxOworICB0WzMwMDJdID0gNjQyOTA7CisgIHRbMzAwM10gPSA2NDI5MTsKKyAgdFszMDA0XSA9IDY0MjkyOworICB0WzMwMDZdID0gNjQyOTQ7CisgIHRbMzAwN10gPSA2NDI5NTsKKyAgdFszMDA4XSA9IDY0Mjk2OworICB0WzMwMTFdID0gMTkwMDsKKyAgdFszMDE0XSA9IDgyMjM7CisgIHRbMzAxNV0gPSA4MjQ0OworICB0WzMwMTddID0gNzUzMjsKKyAgdFszMDE4XSA9IDc1MzM7CisgIHRbMzAxOV0gPSA3NTM0OworICB0WzMwNzVdID0gNzU5MDsKKyAgdFszMDc2XSA9IDc1OTE7CisgIHRbMzA3OV0gPSA3NTk0OworICB0WzMwODBdID0gNzU5NTsKKyAgdFszMDgzXSA9IDc1OTg7CisgIHRbMzA4NF0gPSA3NTk5OworICB0WzMwODddID0gNzYwMjsKKyAgdFszMDg4XSA9IDc2MDM7CisgIHRbMzA5MV0gPSA3NjA2OworICB0WzMwOTJdID0gNzYwNzsKKyAgdFszMDk1XSA9IDc2MTA7CisgIHRbMzA5Nl0gPSA3NjExOworICB0WzMwOTldID0gNzYxNDsKKyAgdFszMTAwXSA9IDc2MTU7CisgIHRbMzEwM10gPSA3NjE4OworICB0WzMxMDRdID0gNzYxOTsKKyAgdFszMTA3XSA9IDgzMzc7CisgIHRbMzEwOF0gPSA4MzM4OworICB0WzMxMTZdID0gMTg4NDsKKyAgdFszMTE5XSA9IDE4ODU7CisgIHRbMzEyMF0gPSAxODg1OworICB0WzMxMjNdID0gMTg4NjsKKyAgdFszMTI0XSA9IDE4ODY7CisgIHRbMzEyN10gPSAxODg3OworICB0WzMxMjhdID0gMTg4NzsKKyAgdFszMTMxXSA9IDE4ODg7CisgIHRbMzEzMl0gPSAxODg4OworICB0WzMxMzVdID0gMTg4OTsKKyAgdFszMTM2XSA9IDE4ODk7CisgIHRbMzEzOV0gPSAxODkwOworICB0WzMxNDBdID0gMTg5MDsKKyAgdFszMTQzXSA9IDE4OTE7CisgIHRbMzE0NF0gPSAxODkxOworICB0WzMxNDddID0gMTg5MjsKKyAgdFszMTQ4XSA9IDE4OTI7CisgIHRbMzE1M10gPSA1ODA7CisgIHRbMzE1NF0gPSA1ODE7CisgIHRbMzE1N10gPSA1ODQ7CisgIHRbMzE1OF0gPSA1ODU7CisgIHRbMzE2MV0gPSA1ODg7CisgIHRbMzE2Ml0gPSA1ODk7CisgIHRbMzE2NV0gPSA4OTE7CisgIHRbMzE2Nl0gPSA4OTI7CisgIHRbMzE2OV0gPSAxMjc0OworICB0WzMxNzBdID0gMTI3NTsKKyAgdFszMTczXSA9IDEyNzg7CisgIHRbMzE3NF0gPSAxMjc5OworICB0WzMxODFdID0gNzYyMjsKKyAgdFszMTgyXSA9IDc2MjM7CisgIHRbMzI4Ml0gPSAxMTc5OTsKKyAgdFszMzE2XSA9IDU3ODsKKyAgdFszMzc5XSA9IDQyNzg1OworICB0WzMzOTNdID0gMTE1OTsKKyAgdFszNDE2XSA9IDgzNzc7Cit9KTsKK2V4cG9ydHMuZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzID0gZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzOworY29uc3QgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKKyAgdFsyMjddID0gMzIyOworICB0WzI2NF0gPSAyNjE7CisgIHRbMjkxXSA9IDM0NjsKK30pOworZXhwb3J0cy5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2sgPSBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2s7Citjb25zdCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgeworICB0WzFdID0gMzI7CisgIHRbNF0gPSA2NTsKKyAgdFsxN10gPSA2NjsKKyAgdFsxOF0gPSA2NzsKKyAgdFsyNF0gPSA2ODsKKyAgdFsyOF0gPSA2OTsKKyAgdFszOF0gPSA3MDsKKyAgdFszOV0gPSA3MTsKKyAgdFs0NF0gPSA3MjsKKyAgdFs0N10gPSA3MzsKKyAgdFs1OF0gPSA3NDsKKyAgdFs2MF0gPSA3NTsKKyAgdFs2Ml0gPSA3NjsKKyAgdFs2OF0gPSA3NzsKKyAgdFs2OV0gPSA3ODsKKyAgdFs3NV0gPSA3OTsKKyAgdFs4N10gPSA4MDsKKyAgdFs4OV0gPSA4MTsKKyAgdFs5MF0gPSA4MjsKKyAgdFs5NF0gPSA4MzsKKyAgdFsxMDBdID0gODQ7CisgIHRbMTA0XSA9IDg1OworICB0WzExNV0gPSA4NjsKKyAgdFsxMTZdID0gODc7CisgIHRbMTIxXSA9IDg4OworICB0WzEyMl0gPSA4OTsKKyAgdFsxMjddID0gOTA7CisgIHRbMjU4XSA9IDk3OworICB0WzI2OF0gPSAyNjE7CisgIHRbMjcxXSA9IDk4OworICB0WzI3Ml0gPSA5OTsKKyAgdFsyNzNdID0gMjYzOworICB0WzI4Ml0gPSAxMDA7CisgIHRbMjg2XSA9IDEwMTsKKyAgdFsyOTVdID0gMjgxOworICB0WzI5Nl0gPSAxMDI7CisgIHRbMzM2XSA9IDEwMzsKKyAgdFszNDZdID0gMTA0OworICB0WzM0OV0gPSAxMDU7CisgIHRbMzYxXSA9IDEwNjsKKyAgdFszNjRdID0gMTA3OworICB0WzM2N10gPSAxMDg7CisgIHRbMzcxXSA9IDMyMjsKKyAgdFszNzNdID0gMTA5OworICB0WzM3NF0gPSAxMTA7CisgIHRbMzgxXSA9IDExMTsKKyAgdFszODNdID0gMjQzOworICB0WzM5M10gPSAxMTI7CisgIHRbMzk1XSA9IDExMzsKKyAgdFszOTZdID0gMTE0OworICB0WzQwMF0gPSAxMTU7CisgIHRbNDAxXSA9IDM0NzsKKyAgdFs0MTBdID0gMTE2OworICB0WzQzN10gPSAxMTc7CisgIHRbNDQ4XSA9IDExODsKKyAgdFs0NDldID0gMTE5OworICB0WzQ1NF0gPSAxMjA7CisgIHRbNDU1XSA9IDEyMTsKKyAgdFs0NjBdID0gMTIyOworICB0WzQ2M10gPSAzODA7CisgIHRbODUzXSA9IDQ0OworICB0Wzg1NV0gPSA1ODsKKyAgdFs4NTZdID0gNDY7CisgIHRbODc2XSA9IDQ3OworICB0Wzg3OF0gPSA0NTsKKyAgdFs4ODJdID0gNDU7CisgIHRbODk0XSA9IDQwOworICB0Wzg5NV0gPSA0MTsKKyAgdFs4OTZdID0gOTE7CisgIHRbODk3XSA9IDkzOworICB0WzkyM10gPSA2NDsKKyAgdFsxMDA0XSA9IDQ4OworICB0WzEwMDVdID0gNDk7CisgIHRbMTAwNl0gPSA1MDsKKyAgdFsxMDA3XSA9IDUxOworICB0WzEwMDhdID0gNTI7CisgIHRbMTAwOV0gPSA1MzsKKyAgdFsxMDEwXSA9IDU0OworICB0WzEwMTFdID0gNTU7CisgIHRbMTAxMl0gPSA1NjsKKyAgdFsxMDEzXSA9IDU3OworICB0WzEwODFdID0gMzc7CisgIHRbMTA4NV0gPSA0MzsKKyAgdFsxMDg2XSA9IDQ1OworfSk7CitleHBvcnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSA9IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS9zdHJlYW0uanMgYi9saWIvY29yZS9zdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1MmE1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL3N0cmVhbS5qcwpAQCAtMCwwICsxLDEzMTcgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkxaV1N0cmVhbSA9IGV4cG9ydHMuU3RyaW5nU3RyZWFtID0gZXhwb3J0cy5TdHJlYW1zU2VxdWVuY2VTdHJlYW0gPSBleHBvcnRzLlN0cmVhbSA9IGV4cG9ydHMuUnVuTGVuZ3RoU3RyZWFtID0gZXhwb3J0cy5QcmVkaWN0b3JTdHJlYW0gPSBleHBvcnRzLk51bGxTdHJlYW0gPSBleHBvcnRzLkZsYXRlU3RyZWFtID0gZXhwb3J0cy5EZWNvZGVTdHJlYW0gPSBleHBvcnRzLkRlY3J5cHRTdHJlYW0gPSBleHBvcnRzLkFzY2lpSGV4U3RyZWFtID0gZXhwb3J0cy5Bc2NpaTg1U3RyZWFtID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuL3ByaW1pdGl2ZXMuanMiKTsKKwordmFyIF9jb3JlX3V0aWxzID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIik7CisKK3ZhciBTdHJlYW0gPSBmdW5jdGlvbiBTdHJlYW1DbG9zdXJlKCkgeworICBmdW5jdGlvbiBTdHJlYW0oYXJyYXlCdWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpIHsKKyAgICB0aGlzLmJ5dGVzID0gYXJyYXlCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gYXJyYXlCdWZmZXIgOiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7CisgICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IDA7CisgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0OworICAgIHRoaXMuZW5kID0gc3RhcnQgKyBsZW5ndGggfHwgdGhpcy5ieXRlcy5sZW5ndGg7CisgICAgdGhpcy5kaWN0ID0gZGljdDsKKyAgfQorCisgIFN0cmVhbS5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGxlbmd0aCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7CisgICAgfSwKKworICAgIGdldCBpc0VtcHR5KCkgeworICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwOworICAgIH0sCisKKyAgICBnZXRCeXRlOiBmdW5jdGlvbiBTdHJlYW1fZ2V0Qnl0ZSgpIHsKKyAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmVuZCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdOworICAgIH0sCisgICAgZ2V0VWludDE2OiBmdW5jdGlvbiBTdHJlYW1fZ2V0VWludDE2KCkgeworICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTsKKworICAgICAgaWYgKGIwID09PSAtMSB8fCBiMSA9PT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7CisgICAgfSwKKyAgICBnZXRJbnQzMjogZnVuY3Rpb24gU3RyZWFtX2dldEludDMyKCkgeworICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMiA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIzID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKKyAgICB9LAorCisgICAgZ2V0Qnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkgeworICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlczsKKyAgICAgIHZhciBwb3MgPSB0aGlzLnBvczsKKyAgICAgIHZhciBzdHJFbmQgPSB0aGlzLmVuZDsKKworICAgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgY29uc3Qgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIHN0ckVuZCk7CisgICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7CisgICAgICB9CisKKyAgICAgIHZhciBlbmQgPSBwb3MgKyBsZW5ndGg7CisKKyAgICAgIGlmIChlbmQgPiBzdHJFbmQpIHsKKyAgICAgICAgZW5kID0gc3RyRW5kOworICAgICAgfQorCisgICAgICB0aGlzLnBvcyA9IGVuZDsKKyAgICAgIGNvbnN0IHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpOworICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTsKKyAgICB9LAorCisgICAgcGVla0J5dGU6IGZ1bmN0aW9uIFN0cmVhbV9wZWVrQnl0ZSgpIHsKKyAgICAgIHZhciBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7CisKKyAgICAgIGlmIChwZWVrZWRCeXRlICE9PSAtMSkgeworICAgICAgICB0aGlzLnBvcy0tOworICAgICAgfQorCisgICAgICByZXR1cm4gcGVla2VkQnl0ZTsKKyAgICB9LAorCisgICAgcGVla0J5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkID0gZmFsc2UpIHsKKyAgICAgIHZhciBieXRlcyA9IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQpOworICAgICAgdGhpcy5wb3MgLT0gYnl0ZXMubGVuZ3RoOworICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0sCisKKyAgICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgeworICAgICAgaWYgKGJlZ2luIDwgMCkgeworICAgICAgICBiZWdpbiA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChlbmQgPiB0aGlzLmVuZCkgeworICAgICAgICBlbmQgPSB0aGlzLmVuZDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCk7CisgICAgfSwKKworICAgIHNraXA6IGZ1bmN0aW9uIFN0cmVhbV9za2lwKG4pIHsKKyAgICAgIGlmICghbikgeworICAgICAgICBuID0gMTsKKyAgICAgIH0KKworICAgICAgdGhpcy5wb3MgKz0gbjsKKyAgICB9LAorICAgIHJlc2V0OiBmdW5jdGlvbiBTdHJlYW1fcmVzZXQoKSB7CisgICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CisgICAgfSwKKyAgICBtb3ZlU3RhcnQ6IGZ1bmN0aW9uIFN0cmVhbV9tb3ZlU3RhcnQoKSB7CisgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5wb3M7CisgICAgfSwKKyAgICBtYWtlU3ViU3RyZWFtOiBmdW5jdGlvbiBTdHJlYW1fbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0KSB7CisgICAgICByZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ5dGVzLmJ1ZmZlciwgc3RhcnQsIGxlbmd0aCwgZGljdCk7CisgICAgfQorICB9OworICByZXR1cm4gU3RyZWFtOworfSgpOworCitleHBvcnRzLlN0cmVhbSA9IFN0cmVhbTsKKwordmFyIFN0cmluZ1N0cmVhbSA9IGZ1bmN0aW9uIFN0cmluZ1N0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIFN0cmluZ1N0cmVhbShzdHIpIHsKKyAgICBjb25zdCBieXRlcyA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShzdHIpOworICAgIFN0cmVhbS5jYWxsKHRoaXMsIGJ5dGVzKTsKKyAgfQorCisgIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUgPSBTdHJlYW0ucHJvdG90eXBlOworICByZXR1cm4gU3RyaW5nU3RyZWFtOworfSgpOworCitleHBvcnRzLlN0cmluZ1N0cmVhbSA9IFN0cmluZ1N0cmVhbTsKKwordmFyIERlY29kZVN0cmVhbSA9IGZ1bmN0aW9uIERlY29kZVN0cmVhbUNsb3N1cmUoKSB7CisgIHZhciBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApOworCisgIGZ1bmN0aW9uIERlY29kZVN0cmVhbShtYXliZU1pbkJ1ZmZlckxlbmd0aCkgeworICAgIHRoaXMuX3Jhd01pbkJ1ZmZlckxlbmd0aCA9IG1heWJlTWluQnVmZmVyTGVuZ3RoIHx8IDA7CisgICAgdGhpcy5wb3MgPSAwOworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKKyAgICB0aGlzLmVvZiA9IGZhbHNlOworICAgIHRoaXMuYnVmZmVyID0gZW1wdHlCdWZmZXI7CisgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggPSA1MTI7CisKKyAgICBpZiAobWF5YmVNaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgIHdoaWxlICh0aGlzLm1pbkJ1ZmZlckxlbmd0aCA8IG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CisgICAgICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoICo9IDI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgaXNFbXB0eSgpIHsKKyAgICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPT09IDApIHsKKyAgICAgICAgdGhpcy5yZWFkQmxvY2soKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwOworICAgIH0sCisKKyAgICBlbnN1cmVCdWZmZXI6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9lbnN1cmVCdWZmZXIocmVxdWVzdGVkKSB7CisgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CisKKyAgICAgIGlmIChyZXF1ZXN0ZWQgPD0gYnVmZmVyLmJ5dGVMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgIH0KKworICAgICAgdmFyIHNpemUgPSB0aGlzLm1pbkJ1ZmZlckxlbmd0aDsKKworICAgICAgd2hpbGUgKHNpemUgPCByZXF1ZXN0ZWQpIHsKKyAgICAgICAgc2l6ZSAqPSAyOworICAgICAgfQorCisgICAgICB2YXIgYnVmZmVyMiA9IG5ldyBVaW50OEFycmF5KHNpemUpOworICAgICAgYnVmZmVyMi5zZXQoYnVmZmVyKTsKKyAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjI7CisgICAgfSwKKyAgICBnZXRCeXRlOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0Qnl0ZSgpIHsKKyAgICAgIHZhciBwb3MgPSB0aGlzLnBvczsKKworICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IHBvcykgeworICAgICAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJlYWRCbG9jaygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107CisgICAgfSwKKyAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9nZXRVaW50MTYoKSB7CisgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpOworCisgICAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTsKKyAgICB9LAorICAgIGdldEludDMyOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0SW50MzIoKSB7CisgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpOworICAgICAgdmFyIGIyID0gdGhpcy5nZXRCeXRlKCk7CisgICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTsKKyAgICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOworICAgIH0sCisKKyAgICBnZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCA9IGZhbHNlKSB7CisgICAgICB2YXIgZW5kLAorICAgICAgICAgIHBvcyA9IHRoaXMucG9zOworCisgICAgICBpZiAobGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbmd0aCk7CisgICAgICAgIGVuZCA9IHBvcyArIGxlbmd0aDsKKworICAgICAgICB3aGlsZSAoIXRoaXMuZW9mICYmIHRoaXMuYnVmZmVyTGVuZ3RoIDwgZW5kKSB7CisgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKworICAgICAgICBpZiAoZW5kID4gYnVmRW5kKSB7CisgICAgICAgICAgZW5kID0gYnVmRW5kOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKSB7CisgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIGVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgICAgfQorCisgICAgICB0aGlzLnBvcyA9IGVuZDsKKyAgICAgIGNvbnN0IHN1YmFycmF5ID0gdGhpcy5idWZmZXIuc3ViYXJyYXkocG9zLCBlbmQpOworICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCAmJiAhKHN1YmFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpID8gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN1YmFycmF5KSA6IHN1YmFycmF5OworICAgIH0sCisKKyAgICBwZWVrQnl0ZTogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3BlZWtCeXRlKCkgeworICAgICAgdmFyIHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTsKKworICAgICAgaWYgKHBlZWtlZEJ5dGUgIT09IC0xKSB7CisgICAgICAgIHRoaXMucG9zLS07CisgICAgICB9CisKKyAgICAgIHJldHVybiBwZWVrZWRCeXRlOworICAgIH0sCisKKyAgICBwZWVrQnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQgPSBmYWxzZSkgeworICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7CisgICAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7CisgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfSwKKworICAgIG1ha2VTdWJTdHJlYW06IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9tYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QpIHsKKyAgICAgIHZhciBlbmQgPSBzdGFydCArIGxlbmd0aDsKKworICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IGVuZCAmJiAhdGhpcy5lb2YpIHsKKyAgICAgICAgdGhpcy5yZWFkQmxvY2soKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpOworICAgIH0sCisKKyAgICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgeworICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIERlY29kZVN0cmVhbS5nZXRCeXRlUmFuZ2UiKTsKKyAgICB9LAorCisgICAgc2tpcDogZnVuY3Rpb24gRGVjb2RlU3RyZWFtX3NraXAobikgeworICAgICAgaWYgKCFuKSB7CisgICAgICAgIG4gPSAxOworICAgICAgfQorCisgICAgICB0aGlzLnBvcyArPSBuOworICAgIH0sCisgICAgcmVzZXQ6IGZ1bmN0aW9uIERlY29kZVN0cmVhbV9yZXNldCgpIHsKKyAgICAgIHRoaXMucG9zID0gMDsKKyAgICB9LAorICAgIGdldEJhc2VTdHJlYW1zOiBmdW5jdGlvbiBEZWNvZGVTdHJlYW1fZ2V0QmFzZVN0cmVhbXMoKSB7CisgICAgICBpZiAodGhpcy5zdHIgJiYgdGhpcy5zdHIuZ2V0QmFzZVN0cmVhbXMpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RyLmdldEJhc2VTdHJlYW1zKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBbXTsKKyAgICB9CisgIH07CisgIHJldHVybiBEZWNvZGVTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuRGVjb2RlU3RyZWFtID0gRGVjb2RlU3RyZWFtOworCit2YXIgU3RyZWFtc1NlcXVlbmNlU3RyZWFtID0gZnVuY3Rpb24gU3RyZWFtc1NlcXVlbmNlU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gU3RyZWFtc1NlcXVlbmNlU3RyZWFtKHN0cmVhbXMpIHsKKyAgICB0aGlzLnN0cmVhbXMgPSBzdHJlYW1zOworICAgIGxldCBtYXliZUxlbmd0aCA9IDA7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHJlYW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IHN0cmVhbSA9IHN0cmVhbXNbaV07CisKKyAgICAgIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEZWNvZGVTdHJlYW0pIHsKKyAgICAgICAgbWF5YmVMZW5ndGggKz0gc3RyZWFtLl9yYXdNaW5CdWZmZXJMZW5ndGg7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXliZUxlbmd0aCArPSBzdHJlYW0ubGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gc3RyZWFtU2VxdWVuY2VTdHJlYW1SZWFkQmxvY2soKSB7CisgICAgdmFyIHN0cmVhbXMgPSB0aGlzLnN0cmVhbXM7CisKKyAgICBpZiAoc3RyZWFtcy5sZW5ndGggPT09IDApIHsKKyAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpOworICAgIHZhciBjaHVuayA9IHN0cmVhbS5nZXRCeXRlcygpOworICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKyAgICB2YXIgbmV3TGVuZ3RoID0gYnVmZmVyTGVuZ3RoICsgY2h1bmsubGVuZ3RoOworICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihuZXdMZW5ndGgpOworICAgIGJ1ZmZlci5zZXQoY2h1bmssIGJ1ZmZlckxlbmd0aCk7CisgICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CisgIH07CisKKyAgU3RyZWFtc1NlcXVlbmNlU3RyZWFtLnByb3RvdHlwZS5nZXRCYXNlU3RyZWFtcyA9IGZ1bmN0aW9uIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbV9nZXRCYXNlU3RyZWFtcygpIHsKKyAgICB2YXIgYmFzZVN0cmVhbXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuc3RyZWFtcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW1zW2ldOworCisgICAgICBpZiAoc3RyZWFtLmdldEJhc2VTdHJlYW1zKSB7CisgICAgICAgIGJhc2VTdHJlYW1zLnB1c2goLi4uc3RyZWFtLmdldEJhc2VTdHJlYW1zKCkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiYXNlU3RyZWFtczsKKyAgfTsKKworICByZXR1cm4gU3RyZWFtc1NlcXVlbmNlU3RyZWFtOworfSgpOworCitleHBvcnRzLlN0cmVhbXNTZXF1ZW5jZVN0cmVhbSA9IFN0cmVhbXNTZXF1ZW5jZVN0cmVhbTsKKwordmFyIEZsYXRlU3RyZWFtID0gZnVuY3Rpb24gRmxhdGVTdHJlYW1DbG9zdXJlKCkgeworICB2YXIgY29kZUxlbkNvZGVNYXAgPSBuZXcgSW50MzJBcnJheShbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV0pOworICB2YXIgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoWzB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsIDB4MTAwMGIsIDB4MTAwMGQsIDB4MTAwMGYsIDB4MTAwMTEsIDB4MjAwMTMsIDB4MjAwMTcsIDB4MjAwMWIsIDB4MjAwMWYsIDB4MzAwMjMsIDB4MzAwMmIsIDB4MzAwMzMsIDB4MzAwM2IsIDB4NDAwNDMsIDB4NDAwNTMsIDB4NDAwNjMsIDB4NDAwNzMsIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJdKTsKKyAgdmFyIGRpc3REZWNvZGUgPSBuZXcgSW50MzJBcnJheShbMHgwMDAwMSwgMHgwMDAwMiwgMHgwMDAwMywgMHgwMDAwNCwgMHgxMDAwNSwgMHgxMDAwNywgMHgyMDAwOSwgMHgyMDAwZCwgMHgzMDAxMSwgMHgzMDAxOSwgMHg0MDAyMSwgMHg0MDAzMSwgMHg1MDA0MSwgMHg1MDA2MSwgMHg2MDA4MSwgMHg2MDBjMSwgMHg3MDEwMSwgMHg3MDE4MSwgMHg4MDIwMSwgMHg4MDMwMSwgMHg5MDQwMSwgMHg5MDYwMSwgMHhhMDgwMSwgMHhhMGMwMSwgMHhiMTAwMSwgMHhiMTgwMSwgMHhjMjAwMSwgMHhjMzAwMSwgMHhkNDAwMSwgMHhkNjAwMV0pOworICB2YXIgZml4ZWRMaXRDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFsweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMwLCAweDcwMTA4LCAweDgwMDYwLCAweDgwMDIwLCAweDkwMGEwLCAweDgwMDAwLCAweDgwMDgwLCAweDgwMDQwLCAweDkwMGUwLCAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkwLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQwLCAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIwLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYwLCAweDcwMTAyLCAweDgwMDU0LCAweDgwMDE0LCAweDgwMTFjLCAweDcwMTEyLCAweDgwMDc0LCAweDgwMDM0LCAweDkwMGM4LCAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE4LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU4LCAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk4LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ4LCAweDcwMTBlLCAweDgwMDZjLCAweDgwMDJjLCAweDkwMGI4LCAweDgwMDBjLCAweDgwMDhjLCAweDgwMDRjLCAweDkwMGY4LCAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM0LCAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE0LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU0LCAweDcwMTA1LCAweDgwMDVhLCAweDgwMDFhLCAweDkwMDk0LCAweDcwMTE1LCAweDgwMDdhLCAweDgwMDNhLCAweDkwMGQ0LCAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI0LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY0LCAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNjLCAweDcwMTBiLCAweDgwMDY2LCAweDgwMDI2LCAweDkwMGFjLCAweDgwMDA2LCAweDgwMDg2LCAweDgwMDQ2LCAweDkwMGVjLCAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDljLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRjLCAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJjLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZjLCAweDcwMTAwLCAweDgwMDUxLCAweDgwMDExLCAweDgwMTE5LCAweDcwMTEwLCAweDgwMDcxLCAweDgwMDMxLCAweDkwMGMyLCAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEyLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUyLCAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkyLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQyLCAweDcwMTBjLCAweDgwMDY5LCAweDgwMDI5LCAweDkwMGIyLCAweDgwMDA5LCAweDgwMDg5LCAweDgwMDQ5LCAweDkwMGYyLCAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNhLCAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFhLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGVhLCAweDcwMTA2LCAweDgwMDVkLCAweDgwMDFkLCAweDkwMDlhLCAweDcwMTE2LCAweDgwMDdkLCAweDgwMDNkLCAweDkwMGRhLCAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJhLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZhLCAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM2LCAweDcwMTA5LCAweDgwMDYzLCAweDgwMDIzLCAweDkwMGE2LCAweDgwMDAzLCAweDgwMDgzLCAweDgwMDQzLCAweDkwMGU2LCAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk2LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ2LCAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI2LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY2LCAweDcwMTAzLCAweDgwMDU3LCAweDgwMDE3LCAweDgwMTFmLCAweDcwMTEzLCAweDgwMDc3LCAweDgwMDM3LCAweDkwMGNlLCAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFlLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVlLCAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDllLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRlLCAweDcwMTBmLCAweDgwMDZmLCAweDgwMDJmLCAweDkwMGJlLCAweDgwMDBmLCAweDgwMDhmLCAweDgwMDRmLCAweDkwMGZlLCAweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMxLCAweDcwMTA4LCAweDgwMDYwLCAweDgwMDIwLCAweDkwMGExLCAweDgwMDAwLCAweDgwMDgwLCAweDgwMDQwLCAweDkwMGUxLCAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkxLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQxLCAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIxLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYxLCAweDcwMTAyLCAweDgwMDU0LCAweDgwMDE0LCAweDgwMTFjLCAweDcwMTEyLCAweDgwMDc0LCAweDgwMDM0LCAweDkwMGM5LCAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE5LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU5LCAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk5LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ5LCAweDcwMTBlLCAweDgwMDZjLCAweDgwMDJjLCAweDkwMGI5LCAweDgwMDBjLCAweDgwMDhjLCAweDgwMDRjLCAweDkwMGY5LCAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM1LCAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE1LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU1LCAweDcwMTA1LCAweDgwMDVhLCAweDgwMDFhLCAweDkwMDk1LCAweDcwMTE1LCAweDgwMDdhLCAweDgwMDNhLCAweDkwMGQ1LCAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI1LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY1LCAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNkLCAweDcwMTBiLCAweDgwMDY2LCAweDgwMDI2LCAweDkwMGFkLCAweDgwMDA2LCAweDgwMDg2LCAweDgwMDQ2LCAweDkwMGVkLCAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDlkLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRkLCAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJkLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZkLCAweDcwMTAwLCAweDgwMDUxLCAweDgwMDExLCAweDgwMTE5LCAweDcwMTEwLCAweDgwMDcxLCAweDgwMDMxLCAweDkwMGMzLCAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEzLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUzLCAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkzLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQzLCAweDcwMTBjLCAweDgwMDY5LCAweDgwMDI5LCAweDkwMGIzLCAweDgwMDA5LCAweDgwMDg5LCAweDgwMDQ5LCAweDkwMGYzLCAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNiLCAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFiLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGViLCAweDcwMTA2LCAweDgwMDVkLCAweDgwMDFkLCAweDkwMDliLCAweDcwMTE2LCAweDgwMDdkLCAweDgwMDNkLCAweDkwMGRiLCAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJiLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZiLCAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM3LCAweDcwMTA5LCAweDgwMDYzLCAweDgwMDIzLCAweDkwMGE3LCAweDgwMDAzLCAweDgwMDgzLCAweDgwMDQzLCAweDkwMGU3LCAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk3LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ3LCAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI3LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY3LCAweDcwMTAzLCAweDgwMDU3LCAweDgwMDE3LCAweDgwMTFmLCAweDcwMTEzLCAweDgwMDc3LCAweDgwMDM3LCAweDkwMGNmLCAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFmLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVmLCAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDlmLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRmLCAweDcwMTBmLCAweDgwMDZmLCAweDgwMDJmLCAweDkwMGJmLCAweDgwMDBmLCAweDgwMDhmLCAweDgwMDRmLCAweDkwMGZmXSksIDldOworICB2YXIgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYywgMHg1MDAwMiwgMHg1MDAxMiwgMHg1MDAwYSwgMHg1MDAxYSwgMHg1MDAwNiwgMHg1MDAxNiwgMHg1MDAwZSwgMHgwMDAwMCwgMHg1MDAwMSwgMHg1MDAxMSwgMHg1MDAwOSwgMHg1MDAxOSwgMHg1MDAwNSwgMHg1MDAxNSwgMHg1MDAwZCwgMHg1MDAxZCwgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMF0pLCA1XTsKKworICBmdW5jdGlvbiBGbGF0ZVN0cmVhbShzdHIsIG1heWJlTGVuZ3RoKSB7CisgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CisgICAgdmFyIGNtZiA9IHN0ci5nZXRCeXRlKCk7CisgICAgdmFyIGZsZyA9IHN0ci5nZXRCeXRlKCk7CisKKyAgICBpZiAoY21mID09PSAtMSB8fCBmbGcgPT09IC0xKSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTsKKyAgICB9CisKKyAgICBpZiAoKGNtZiAmIDB4MGYpICE9PSAweDA4KSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTsKKyAgICB9CisKKyAgICBpZiAoKChjbWYgPDwgOCkgKyBmbGcpICUgMzEgIT09IDApIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CisgICAgfQorCisgICAgaWYgKGZsZyAmIDB4MjApIHsKKyAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CisgICAgfQorCisgICAgdGhpcy5jb2RlU2l6ZSA9IDA7CisgICAgdGhpcy5jb2RlQnVmID0gMDsKKyAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKERlY29kZVN0cmVhbS5wcm90b3R5cGUpOworCisgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRCaXRzID0gZnVuY3Rpb24gRmxhdGVTdHJlYW1fZ2V0Qml0cyhiaXRzKSB7CisgICAgdmFyIHN0ciA9IHRoaXMuc3RyOworICAgIHZhciBjb2RlU2l6ZSA9IHRoaXMuY29kZVNpemU7CisgICAgdmFyIGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7CisgICAgdmFyIGI7CisKKyAgICB3aGlsZSAoY29kZVNpemUgPCBiaXRzKSB7CisgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTsKKyAgICAgIGNvZGVTaXplICs9IDg7CisgICAgfQorCisgICAgYiA9IGNvZGVCdWYgJiAoMSA8PCBiaXRzKSAtIDE7CisgICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBiaXRzOworICAgIHRoaXMuY29kZVNpemUgPSBjb2RlU2l6ZSAtPSBiaXRzOworICAgIHJldHVybiBiOworICB9OworCisgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRDb2RlID0gZnVuY3Rpb24gRmxhdGVTdHJlYW1fZ2V0Q29kZSh0YWJsZSkgeworICAgIHZhciBzdHIgPSB0aGlzLnN0cjsKKyAgICB2YXIgY29kZXMgPSB0YWJsZVswXTsKKyAgICB2YXIgbWF4TGVuID0gdGFibGVbMV07CisgICAgdmFyIGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTsKKyAgICB2YXIgY29kZUJ1ZiA9IHRoaXMuY29kZUJ1ZjsKKyAgICB2YXIgYjsKKworICAgIHdoaWxlIChjb2RlU2l6ZSA8IG1heExlbikgeworICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7CisgICAgICBjb2RlU2l6ZSArPSA4OworICAgIH0KKworICAgIHZhciBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgxIDw8IG1heExlbikgLSAxXTsKKyAgICB2YXIgY29kZUxlbiA9IGNvZGUgPj4gMTY7CisgICAgdmFyIGNvZGVWYWwgPSBjb2RlICYgMHhmZmZmOworCisgICAgaWYgKGNvZGVMZW4gPCAxIHx8IGNvZGVTaXplIDwgY29kZUxlbikgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7CisgICAgfQorCisgICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBjb2RlTGVuOworICAgIHRoaXMuY29kZVNpemUgPSBjb2RlU2l6ZSAtIGNvZGVMZW47CisgICAgcmV0dXJuIGNvZGVWYWw7CisgIH07CisKKyAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdlbmVyYXRlSHVmZm1hblRhYmxlID0gZnVuY3Rpb24gZmxhdGVTdHJlYW1HZW5lcmF0ZUh1ZmZtYW5UYWJsZShsZW5ndGhzKSB7CisgICAgdmFyIG4gPSBsZW5ndGhzLmxlbmd0aDsKKyAgICB2YXIgbWF4TGVuID0gMDsKKyAgICB2YXIgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgIGlmIChsZW5ndGhzW2ldID4gbWF4TGVuKSB7CisgICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07CisgICAgICB9CisgICAgfQorCisgICAgdmFyIHNpemUgPSAxIDw8IG1heExlbjsKKyAgICB2YXIgY29kZXMgPSBuZXcgSW50MzJBcnJheShzaXplKTsKKworICAgIGZvciAodmFyIGxlbiA9IDEsIGNvZGUgPSAwLCBza2lwID0gMjsgbGVuIDw9IG1heExlbjsgKytsZW4sIGNvZGUgPDw9IDEsIHNraXAgPDw9IDEpIHsKKyAgICAgIGZvciAodmFyIHZhbCA9IDA7IHZhbCA8IG47ICsrdmFsKSB7CisgICAgICAgIGlmIChsZW5ndGhzW3ZhbF0gPT09IGxlbikgeworICAgICAgICAgIHZhciBjb2RlMiA9IDA7CisgICAgICAgICAgdmFyIHQgPSBjb2RlOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICBjb2RlMiA9IGNvZGUyIDw8IDEgfCB0ICYgMTsKKyAgICAgICAgICAgIHQgPj49IDE7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChpID0gY29kZTI7IGkgPCBzaXplOyBpICs9IHNraXApIHsKKyAgICAgICAgICAgIGNvZGVzW2ldID0gbGVuIDw8IDE2IHwgdmFsOworICAgICAgICAgIH0KKworICAgICAgICAgICsrY29kZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBbY29kZXMsIG1heExlbl07CisgIH07CisKKyAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIEZsYXRlU3RyZWFtX3JlYWRCbG9jaygpIHsKKyAgICB2YXIgYnVmZmVyLCBsZW47CisgICAgdmFyIHN0ciA9IHRoaXMuc3RyOworICAgIHZhciBoZHIgPSB0aGlzLmdldEJpdHMoMyk7CisKKyAgICBpZiAoaGRyICYgMSkgeworICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgIH0KKworICAgIGhkciA+Pj0gMTsKKworICAgIGlmIChoZHIgPT09IDApIHsKKyAgICAgIHZhciBiOworCisgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICB2YXIgYmxvY2tMZW4gPSBiOworCisgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKKyAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOworICAgICAgfQorCisgICAgICBibG9ja0xlbiB8PSBiIDw8IDg7CisKKyAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIHZhciBjaGVjayA9IGI7CisKKyAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgeworICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIGNoZWNrIHw9IGIgPDwgODsKKworICAgICAgaWYgKGNoZWNrICE9PSAofmJsb2NrTGVuICYgMHhmZmZmKSAmJiAoYmxvY2tMZW4gIT09IDAgfHwgY2hlY2sgIT09IDApKSB7CisgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIHVuY29tcHJlc3NlZCBibG9jayBsZW5ndGggaW4gZmxhdGUgc3RyZWFtIik7CisgICAgICB9CisKKyAgICAgIHRoaXMuY29kZUJ1ZiA9IDA7CisgICAgICB0aGlzLmNvZGVTaXplID0gMDsKKyAgICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgZW5kID0gYnVmZmVyTGVuZ3RoICsgYmxvY2tMZW47CisgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihlbmQpOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmQ7CisKKyAgICAgIGlmIChibG9ja0xlbiA9PT0gMCkgeworICAgICAgICBpZiAoc3RyLnBlZWtCeXRlKCkgPT09IC0xKSB7CisgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBibG9jayA9IHN0ci5nZXRCeXRlcyhibG9ja0xlbik7CisgICAgICAgIGJ1ZmZlci5zZXQoYmxvY2ssIGJ1ZmZlckxlbmd0aCk7CisKKyAgICAgICAgaWYgKGJsb2NrLmxlbmd0aCA8IGJsb2NrTGVuKSB7CisgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbGl0Q29kZVRhYmxlOworICAgIHZhciBkaXN0Q29kZVRhYmxlOworCisgICAgaWYgKGhkciA9PT0gMSkgeworICAgICAgbGl0Q29kZVRhYmxlID0gZml4ZWRMaXRDb2RlVGFiOworICAgICAgZGlzdENvZGVUYWJsZSA9IGZpeGVkRGlzdENvZGVUYWI7CisgICAgfSBlbHNlIGlmIChoZHIgPT09IDIpIHsKKyAgICAgIHZhciBudW1MaXRDb2RlcyA9IHRoaXMuZ2V0Qml0cyg1KSArIDI1NzsKKyAgICAgIHZhciBudW1EaXN0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAxOworICAgICAgdmFyIG51bUNvZGVMZW5Db2RlcyA9IHRoaXMuZ2V0Qml0cyg0KSArIDQ7CisgICAgICB2YXIgY29kZUxlbkNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbkNvZGVNYXAubGVuZ3RoKTsKKyAgICAgIHZhciBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29kZUxlbkNvZGVzOyArK2kpIHsKKyAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNvZGVMZW5Db2RlVGFiID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuQ29kZUxlbmd0aHMpOworICAgICAgbGVuID0gMDsKKyAgICAgIGkgPSAwOworICAgICAgdmFyIGNvZGVzID0gbnVtTGl0Q29kZXMgKyBudW1EaXN0Q29kZXM7CisgICAgICB2YXIgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2Rlcyk7CisgICAgICB2YXIgYml0c0xlbmd0aCwgYml0c09mZnNldCwgd2hhdDsKKworICAgICAgd2hpbGUgKGkgPCBjb2RlcykgeworICAgICAgICB2YXIgY29kZSA9IHRoaXMuZ2V0Q29kZShjb2RlTGVuQ29kZVRhYik7CisKKyAgICAgICAgaWYgKGNvZGUgPT09IDE2KSB7CisgICAgICAgICAgYml0c0xlbmd0aCA9IDI7CisgICAgICAgICAgYml0c09mZnNldCA9IDM7CisgICAgICAgICAgd2hhdCA9IGxlbjsKKyAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAxNykgeworICAgICAgICAgIGJpdHNMZW5ndGggPSAzOworICAgICAgICAgIGJpdHNPZmZzZXQgPSAzOworICAgICAgICAgIHdoYXQgPSBsZW4gPSAwOworICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDE4KSB7CisgICAgICAgICAgYml0c0xlbmd0aCA9IDc7CisgICAgICAgICAgYml0c09mZnNldCA9IDExOworICAgICAgICAgIHdoYXQgPSBsZW4gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSBsZW4gPSBjb2RlOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJlcGVhdExlbmd0aCA9IHRoaXMuZ2V0Qml0cyhiaXRzTGVuZ3RoKSArIGJpdHNPZmZzZXQ7CisKKyAgICAgICAgd2hpbGUgKHJlcGVhdExlbmd0aC0tID4gMCkgeworICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSB3aGF0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxpdENvZGVUYWJsZSA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMuc3ViYXJyYXkoMCwgbnVtTGl0Q29kZXMpKTsKKyAgICAgIGRpc3RDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcykpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVua25vd24gYmxvY2sgdHlwZSBpbiBmbGF0ZSBzdHJlYW0iKTsKKyAgICB9CisKKyAgICBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKKyAgICB2YXIgbGltaXQgPSBidWZmZXIgPyBidWZmZXIubGVuZ3RoIDogMDsKKyAgICB2YXIgcG9zID0gdGhpcy5idWZmZXJMZW5ndGg7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIGNvZGUxID0gdGhpcy5nZXRDb2RlKGxpdENvZGVUYWJsZSk7CisKKyAgICAgIGlmIChjb2RlMSA8IDI1NikgeworICAgICAgICBpZiAocG9zICsgMSA+PSBsaW1pdCkgeworICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIDEpOworICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlcltwb3MrK10gPSBjb2RlMTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjb2RlMSA9PT0gMjU2KSB7CisgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gcG9zOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvZGUxIC09IDI1NzsKKyAgICAgIGNvZGUxID0gbGVuZ3RoRGVjb2RlW2NvZGUxXTsKKyAgICAgIHZhciBjb2RlMiA9IGNvZGUxID4+IDE2OworCisgICAgICBpZiAoY29kZTIgPiAwKSB7CisgICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTsKKyAgICAgIH0KKworICAgICAgbGVuID0gKGNvZGUxICYgMHhmZmZmKSArIGNvZGUyOworICAgICAgY29kZTEgPSB0aGlzLmdldENvZGUoZGlzdENvZGVUYWJsZSk7CisgICAgICBjb2RlMSA9IGRpc3REZWNvZGVbY29kZTFdOworICAgICAgY29kZTIgPSBjb2RlMSA+PiAxNjsKKworICAgICAgaWYgKGNvZGUyID4gMCkgeworICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7CisgICAgICB9CisKKyAgICAgIHZhciBkaXN0ID0gKGNvZGUxICYgMHhmZmZmKSArIGNvZGUyOworCisgICAgICBpZiAocG9zICsgbGVuID49IGxpbWl0KSB7CisgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbik7CisgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBsZW47ICsraywgKytwb3MpIHsKKyAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gZGlzdF07CisgICAgICB9CisgICAgfQorICB9OworCisgIHJldHVybiBGbGF0ZVN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5GbGF0ZVN0cmVhbSA9IEZsYXRlU3RyZWFtOworCit2YXIgUHJlZGljdG9yU3RyZWFtID0gZnVuY3Rpb24gUHJlZGljdG9yU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gUHJlZGljdG9yU3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgsIHBhcmFtcykgeworICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzRGljdCkocGFyYW1zKSkgeworICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICB2YXIgcHJlZGljdG9yID0gdGhpcy5wcmVkaWN0b3IgPSBwYXJhbXMuZ2V0KCJQcmVkaWN0b3IiKSB8fCAxOworCisgICAgaWYgKHByZWRpY3RvciA8PSAxKSB7CisgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIGlmIChwcmVkaWN0b3IgIT09IDIgJiYgKHByZWRpY3RvciA8IDEwIHx8IHByZWRpY3RvciA+IDE1KSkgeworICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICR7cHJlZGljdG9yfWApOworICAgIH0KKworICAgIGlmIChwcmVkaWN0b3IgPT09IDIpIHsKKyAgICAgIHRoaXMucmVhZEJsb2NrID0gdGhpcy5yZWFkQmxvY2tUaWZmOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnJlYWRCbG9jayA9IHRoaXMucmVhZEJsb2NrUG5nOworICAgIH0KKworICAgIHRoaXMuc3RyID0gc3RyOworICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OworICAgIHZhciBjb2xvcnMgPSB0aGlzLmNvbG9ycyA9IHBhcmFtcy5nZXQoIkNvbG9ycyIpIHx8IDE7CisgICAgdmFyIGJpdHMgPSB0aGlzLmJpdHMgPSBwYXJhbXMuZ2V0KCJCaXRzUGVyQ29tcG9uZW50IikgfHwgODsKKyAgICB2YXIgY29sdW1ucyA9IHRoaXMuY29sdW1ucyA9IHBhcmFtcy5nZXQoIkNvbHVtbnMiKSB8fCAxOworICAgIHRoaXMucGl4Qnl0ZXMgPSBjb2xvcnMgKiBiaXRzICsgNyA+PiAzOworICAgIHRoaXMucm93Qnl0ZXMgPSBjb2x1bW5zICogY29sb3JzICogYml0cyArIDcgPj4gMzsKKyAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBQcmVkaWN0b3JTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKworICBQcmVkaWN0b3JTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9ja1RpZmYgPSBmdW5jdGlvbiBwcmVkaWN0b3JTdHJlYW1SZWFkQmxvY2tUaWZmKCkgeworICAgIHZhciByb3dCeXRlcyA9IHRoaXMucm93Qnl0ZXM7CisgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyByb3dCeXRlcyk7CisgICAgdmFyIGJpdHMgPSB0aGlzLmJpdHM7CisgICAgdmFyIGNvbG9ycyA9IHRoaXMuY29sb3JzOworICAgIHZhciByYXdCeXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKHJvd0J5dGVzKTsKKyAgICB0aGlzLmVvZiA9ICFyYXdCeXRlcy5sZW5ndGg7CisKKyAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaW5idWYgPSAwLAorICAgICAgICBvdXRidWYgPSAwOworICAgIHZhciBpbmJpdHMgPSAwLAorICAgICAgICBvdXRiaXRzID0gMDsKKyAgICB2YXIgcG9zID0gYnVmZmVyTGVuZ3RoOworICAgIHZhciBpOworCisgICAgaWYgKGJpdHMgPT09IDEgJiYgY29sb3JzID09PSAxKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Qnl0ZXM7ICsraSkgeworICAgICAgICB2YXIgYyA9IHJhd0J5dGVzW2ldIF4gaW5idWY7CisgICAgICAgIGMgXj0gYyA+PiAxOworICAgICAgICBjIF49IGMgPj4gMjsKKyAgICAgICAgYyBePSBjID4+IDQ7CisgICAgICAgIGluYnVmID0gKGMgJiAxKSA8PCA3OworICAgICAgICBidWZmZXJbcG9zKytdID0gYzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJpdHMgPT09IDgpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcnM7ICsraSkgeworICAgICAgICBidWZmZXJbcG9zKytdID0gcmF3Qnl0ZXNbaV07CisgICAgICB9CisKKyAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkgeworICAgICAgICBidWZmZXJbcG9zXSA9IGJ1ZmZlcltwb3MgLSBjb2xvcnNdICsgcmF3Qnl0ZXNbaV07CisgICAgICAgIHBvcysrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYml0cyA9PT0gMTYpIHsKKyAgICAgIHZhciBieXRlc1BlclBpeGVsID0gY29sb3JzICogMjsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzUGVyUGl4ZWw7ICsraSkgeworICAgICAgICBidWZmZXJbcG9zKytdID0gcmF3Qnl0ZXNbaV07CisgICAgICB9CisKKyAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7IGkgKz0gMikgeworICAgICAgICB2YXIgc3VtID0gKChyYXdCeXRlc1tpXSAmIDB4ZmYpIDw8IDgpICsgKHJhd0J5dGVzW2kgKyAxXSAmIDB4ZmYpICsgKChidWZmZXJbcG9zIC0gYnl0ZXNQZXJQaXhlbF0gJiAweGZmKSA8PCA4KSArIChidWZmZXJbcG9zIC0gYnl0ZXNQZXJQaXhlbCArIDFdICYgMHhmZik7CisgICAgICAgIGJ1ZmZlcltwb3MrK10gPSBzdW0gPj4gOCAmIDB4ZmY7CisgICAgICAgIGJ1ZmZlcltwb3MrK10gPSBzdW0gJiAweGZmOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgY29tcEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoY29sb3JzICsgMSk7CisgICAgICB2YXIgYml0TWFzayA9ICgxIDw8IGJpdHMpIC0gMTsKKyAgICAgIHZhciBqID0gMCwKKyAgICAgICAgICBrID0gYnVmZmVyTGVuZ3RoOworICAgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2x1bW5zOyArK2kpIHsKKyAgICAgICAgZm9yICh2YXIga2sgPSAwOyBrayA8IGNvbG9yczsgKytraykgeworICAgICAgICAgIGlmIChpbmJpdHMgPCBiaXRzKSB7CisgICAgICAgICAgICBpbmJ1ZiA9IGluYnVmIDw8IDggfCByYXdCeXRlc1tqKytdICYgMHhmZjsKKyAgICAgICAgICAgIGluYml0cyArPSA4OworICAgICAgICAgIH0KKworICAgICAgICAgIGNvbXBBcnJheVtra10gPSBjb21wQXJyYXlba2tdICsgKGluYnVmID4+IGluYml0cyAtIGJpdHMpICYgYml0TWFzazsKKyAgICAgICAgICBpbmJpdHMgLT0gYml0czsKKyAgICAgICAgICBvdXRidWYgPSBvdXRidWYgPDwgYml0cyB8IGNvbXBBcnJheVtra107CisgICAgICAgICAgb3V0Yml0cyArPSBiaXRzOworCisgICAgICAgICAgaWYgKG91dGJpdHMgPj0gOCkgeworICAgICAgICAgICAgYnVmZmVyW2srK10gPSBvdXRidWYgPj4gb3V0Yml0cyAtIDggJiAweGZmOworICAgICAgICAgICAgb3V0Yml0cyAtPSA4OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAob3V0Yml0cyA+IDApIHsKKyAgICAgICAgYnVmZmVyW2srK10gPSAob3V0YnVmIDw8IDggLSBvdXRiaXRzKSArIChpbmJ1ZiAmICgxIDw8IDggLSBvdXRiaXRzKSAtIDEpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IHJvd0J5dGVzOworICB9OworCisgIFByZWRpY3RvclN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrUG5nID0gZnVuY3Rpb24gcHJlZGljdG9yU3RyZWFtUmVhZEJsb2NrUG5nKCkgeworICAgIHZhciByb3dCeXRlcyA9IHRoaXMucm93Qnl0ZXM7CisgICAgdmFyIHBpeEJ5dGVzID0gdGhpcy5waXhCeXRlczsKKyAgICB2YXIgcHJlZGljdG9yID0gdGhpcy5zdHIuZ2V0Qnl0ZSgpOworICAgIHZhciByYXdCeXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKHJvd0J5dGVzKTsKKyAgICB0aGlzLmVvZiA9ICFyYXdCeXRlcy5sZW5ndGg7CisKKyAgICBpZiAodGhpcy5lb2YpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CisgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIHJvd0J5dGVzKTsKKyAgICB2YXIgcHJldlJvdyA9IGJ1ZmZlci5zdWJhcnJheShidWZmZXJMZW5ndGggLSByb3dCeXRlcywgYnVmZmVyTGVuZ3RoKTsKKworICAgIGlmIChwcmV2Um93Lmxlbmd0aCA9PT0gMCkgeworICAgICAgcHJldlJvdyA9IG5ldyBVaW50OEFycmF5KHJvd0J5dGVzKTsKKyAgICB9CisKKyAgICB2YXIgaSwKKyAgICAgICAgaiA9IGJ1ZmZlckxlbmd0aCwKKyAgICAgICAgdXAsCisgICAgICAgIGM7CisKKyAgICBzd2l0Y2ggKHByZWRpY3RvcikgeworICAgICAgY2FzZSAwOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Qnl0ZXM7ICsraSkgeworICAgICAgICAgIGJ1ZmZlcltqKytdID0gcmF3Qnl0ZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4Qnl0ZXM7ICsraSkgeworICAgICAgICAgIGJ1ZmZlcltqKytdID0gcmF3Qnl0ZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKKyAgICAgICAgICBidWZmZXJbal0gPSBidWZmZXJbaiAtIHBpeEJ5dGVzXSArIHJhd0J5dGVzW2ldICYgMHhmZjsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAyOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Qnl0ZXM7ICsraSkgeworICAgICAgICAgIGJ1ZmZlcltqKytdID0gcHJldlJvd1tpXSArIHJhd0J5dGVzW2ldICYgMHhmZjsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CisgICAgICAgICAgYnVmZmVyW2orK10gPSAocHJldlJvd1tpXSA+PiAxKSArIHJhd0J5dGVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CisgICAgICAgICAgYnVmZmVyW2pdID0gKHByZXZSb3dbaV0gKyBidWZmZXJbaiAtIHBpeEJ5dGVzXSA+PiAxKSArIHJhd0J5dGVzW2ldICYgMHhmZjsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4Qnl0ZXM7ICsraSkgeworICAgICAgICAgIHVwID0gcHJldlJvd1tpXTsKKyAgICAgICAgICBjID0gcmF3Qnl0ZXNbaV07CisgICAgICAgICAgYnVmZmVyW2orK10gPSB1cCArIGM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKKyAgICAgICAgICB1cCA9IHByZXZSb3dbaV07CisgICAgICAgICAgdmFyIHVwTGVmdCA9IHByZXZSb3dbaSAtIHBpeEJ5dGVzXTsKKyAgICAgICAgICB2YXIgbGVmdCA9IGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdOworICAgICAgICAgIHZhciBwID0gbGVmdCArIHVwIC0gdXBMZWZ0OworICAgICAgICAgIHZhciBwYSA9IHAgLSBsZWZ0OworCisgICAgICAgICAgaWYgKHBhIDwgMCkgeworICAgICAgICAgICAgcGEgPSAtcGE7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIHBiID0gcCAtIHVwOworCisgICAgICAgICAgaWYgKHBiIDwgMCkgeworICAgICAgICAgICAgcGIgPSAtcGI7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIHBjID0gcCAtIHVwTGVmdDsKKworICAgICAgICAgIGlmIChwYyA8IDApIHsKKyAgICAgICAgICAgIHBjID0gLXBjOworICAgICAgICAgIH0KKworICAgICAgICAgIGMgPSByYXdCeXRlc1tpXTsKKworICAgICAgICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykgeworICAgICAgICAgICAgYnVmZmVyW2orK10gPSBsZWZ0ICsgYzsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBiIDw9IHBjKSB7CisgICAgICAgICAgICBidWZmZXJbaisrXSA9IHVwICsgYzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyW2orK10gPSB1cExlZnQgKyBjOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHByZWRpY3RvcjogJHtwcmVkaWN0b3J9YCk7CisgICAgfQorCisgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gcm93Qnl0ZXM7CisgIH07CisKKyAgcmV0dXJuIFByZWRpY3RvclN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5QcmVkaWN0b3JTdHJlYW0gPSBQcmVkaWN0b3JTdHJlYW07CisKK3ZhciBEZWNyeXB0U3RyZWFtID0gZnVuY3Rpb24gRGVjcnlwdFN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIERlY3J5cHRTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCwgZGVjcnlwdCkgeworICAgIHRoaXMuc3RyID0gc3RyOworICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OworICAgIHRoaXMuZGVjcnlwdCA9IGRlY3J5cHQ7CisgICAgdGhpcy5uZXh0Q2h1bmsgPSBudWxsOworICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICB2YXIgY2h1bmtTaXplID0gNTEyOworICBEZWNyeXB0U3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisKKyAgRGVjcnlwdFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gRGVjcnlwdFN0cmVhbV9yZWFkQmxvY2soKSB7CisgICAgdmFyIGNodW5rOworCisgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHsKKyAgICAgIGNodW5rID0gdGhpcy5uZXh0Q2h1bms7CisgICAgfSBlbHNlIHsKKyAgICAgIGNodW5rID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoY2h1bmtTaXplKTsKKyAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmICghY2h1bmsgfHwgY2h1bmsubGVuZ3RoID09PSAwKSB7CisgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5uZXh0Q2h1bmsgPSB0aGlzLnN0ci5nZXRCeXRlcyhjaHVua1NpemUpOworICAgIHZhciBoYXNNb3JlRGF0YSA9IHRoaXMubmV4dENodW5rICYmIHRoaXMubmV4dENodW5rLmxlbmd0aCA+IDA7CisgICAgdmFyIGRlY3J5cHQgPSB0aGlzLmRlY3J5cHQ7CisgICAgY2h1bmsgPSBkZWNyeXB0KGNodW5rLCAhaGFzTW9yZURhdGEpOworICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKyAgICB2YXIgaSwKKyAgICAgICAgbiA9IGNodW5rLmxlbmd0aDsKKyAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gY2h1bmtbaV07CisgICAgfQorCisgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgIH07CisKKyAgcmV0dXJuIERlY3J5cHRTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuRGVjcnlwdFN0cmVhbSA9IERlY3J5cHRTdHJlYW07CisKK3ZhciBBc2NpaTg1U3RyZWFtID0gZnVuY3Rpb24gQXNjaWk4NVN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEFzY2lpODVTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCkgeworICAgIHRoaXMuc3RyID0gc3RyOworICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OworICAgIHRoaXMuaW5wdXQgPSBuZXcgVWludDhBcnJheSg1KTsKKworICAgIGlmIChtYXliZUxlbmd0aCkgeworICAgICAgbWF5YmVMZW5ndGggPSAwLjggKiBtYXliZUxlbmd0aDsKKyAgICB9CisKKyAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBBc2NpaTg1U3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisKKyAgQXNjaWk4NVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gQXNjaWk4NVN0cmVhbV9yZWFkQmxvY2soKSB7CisgICAgdmFyIFRJTERBX0NIQVIgPSAweDdlOworICAgIHZhciBaX0xPV0VSX0NIQVIgPSAweDdhOworICAgIHZhciBFT0YgPSAtMTsKKyAgICB2YXIgc3RyID0gdGhpcy5zdHI7CisgICAgdmFyIGMgPSBzdHIuZ2V0Qnl0ZSgpOworCisgICAgd2hpbGUgKCgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGMpKSB7CisgICAgICBjID0gc3RyLmdldEJ5dGUoKTsKKyAgICB9CisKKyAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHsKKyAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGgsCisgICAgICAgIGJ1ZmZlcjsKKyAgICB2YXIgaTsKKworICAgIGlmIChjID09PSBaX0xPV0VSX0NIQVIpIHsKKyAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIDQpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGggKyBpXSA9IDA7CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IDQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQ7CisgICAgICBpbnB1dFswXSA9IGM7CisKKyAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CisKKyAgICAgICAgd2hpbGUgKCgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGMpKSB7CisgICAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnB1dFtpXSA9IGM7CisKKyAgICAgICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgaSAtIDEpOworICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gaSAtIDE7CisKKyAgICAgIGlmIChpIDwgNSkgeworICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkgeworICAgICAgICAgIGlucHV0W2ldID0gMHgyMSArIDg0OworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgfQorCisgICAgICB2YXIgdCA9IDA7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgdCA9IHQgKiA4NSArIChpbnB1dFtpXSAtIDB4MjEpOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAzOyBpID49IDA7IC0taSkgeworICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjsKKyAgICAgICAgdCA+Pj0gODsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgcmV0dXJuIEFzY2lpODVTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuQXNjaWk4NVN0cmVhbSA9IEFzY2lpODVTdHJlYW07CisKK3ZhciBBc2NpaUhleFN0cmVhbSA9IGZ1bmN0aW9uIEFzY2lpSGV4U3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW0oc3RyLCBtYXliZUxlbmd0aCkgeworICAgIHRoaXMuc3RyID0gc3RyOworICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OworICAgIHRoaXMuZmlyc3REaWdpdCA9IC0xOworCisgICAgaWYgKG1heWJlTGVuZ3RoKSB7CisgICAgICBtYXliZUxlbmd0aCA9IDAuNSAqIG1heWJlTGVuZ3RoOworICAgIH0KKworICAgIERlY29kZVN0cmVhbS5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKTsKKyAgfQorCisgIEFzY2lpSGV4U3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSk7CisKKyAgQXNjaWlIZXhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIEFzY2lpSGV4U3RyZWFtX3JlYWRCbG9jaygpIHsKKyAgICB2YXIgVVBTVFJFQU1fQkxPQ0tfU0laRSA9IDgwMDA7CisgICAgdmFyIGJ5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoVVBTVFJFQU1fQkxPQ0tfU0laRSk7CisKKyAgICBpZiAoIWJ5dGVzLmxlbmd0aCkgeworICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBtYXhEZWNvZGVMZW5ndGggPSBieXRlcy5sZW5ndGggKyAxID4+IDE7CisgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgbWF4RGVjb2RlTGVuZ3RoKTsKKyAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CisgICAgdmFyIGZpcnN0RGlnaXQgPSB0aGlzLmZpcnN0RGlnaXQ7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgY2ggPSBieXRlc1tpXSwKKyAgICAgICAgICBkaWdpdDsKKworICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkgeworICAgICAgICBkaWdpdCA9IGNoICYgMHgwZjsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDQ2IHx8IGNoID49IDB4NjEgJiYgY2ggPD0gMHg2NikgeworICAgICAgICBkaWdpdCA9IChjaCAmIDB4MGYpICsgOTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4M2UpIHsKKyAgICAgICAgdGhpcy5lb2YgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoZmlyc3REaWdpdCA8IDApIHsKKyAgICAgICAgZmlyc3REaWdpdCA9IGRpZ2l0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGZpcnN0RGlnaXQgPDwgNCB8IGRpZ2l0OworICAgICAgICBmaXJzdERpZ2l0ID0gLTE7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpcnN0RGlnaXQgPj0gMCAmJiB0aGlzLmVvZikgeworICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGZpcnN0RGlnaXQgPDwgNDsKKyAgICAgIGZpcnN0RGlnaXQgPSAtMTsKKyAgICB9CisKKyAgICB0aGlzLmZpcnN0RGlnaXQgPSBmaXJzdERpZ2l0OworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICB9OworCisgIHJldHVybiBBc2NpaUhleFN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5Bc2NpaUhleFN0cmVhbSA9IEFzY2lpSGV4U3RyZWFtOworCit2YXIgUnVuTGVuZ3RoU3RyZWFtID0gZnVuY3Rpb24gUnVuTGVuZ3RoU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gUnVuTGVuZ3RoU3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgpIHsKKyAgICB0aGlzLnN0ciA9IHN0cjsKKyAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKKyAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBSdW5MZW5ndGhTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKworICBSdW5MZW5ndGhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIFJ1bkxlbmd0aFN0cmVhbV9yZWFkQmxvY2soKSB7CisgICAgdmFyIHJlcGVhdEhlYWRlciA9IHRoaXMuc3RyLmdldEJ5dGVzKDIpOworCisgICAgaWYgKCFyZXBlYXRIZWFkZXIgfHwgcmVwZWF0SGVhZGVyLmxlbmd0aCA8IDIgfHwgcmVwZWF0SGVhZGVyWzBdID09PSAxMjgpIHsKKyAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgYnVmZmVyOworICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKKyAgICB2YXIgbiA9IHJlcGVhdEhlYWRlclswXTsKKworICAgIGlmIChuIDwgMTI4KSB7CisgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7CisgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gcmVwZWF0SGVhZGVyWzFdOworCisgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuc3RyLmdldEJ5dGVzKG4pOworICAgICAgICBidWZmZXIuc2V0KHNvdXJjZSwgYnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyTGVuZ3RoICs9IG47CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG4gPSAyNTcgLSBuOworICAgICAgdmFyIGIgPSByZXBlYXRIZWFkZXJbMV07CisgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBiOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICB9OworCisgIHJldHVybiBSdW5MZW5ndGhTdHJlYW07Cit9KCk7CisKK2V4cG9ydHMuUnVuTGVuZ3RoU3RyZWFtID0gUnVuTGVuZ3RoU3RyZWFtOworCit2YXIgTFpXU3RyZWFtID0gZnVuY3Rpb24gTFpXU3RyZWFtQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gTFpXU3RyZWFtKHN0ciwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKSB7CisgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CisgICAgdGhpcy5jYWNoZWREYXRhID0gMDsKKyAgICB0aGlzLmJpdHNDYWNoZWQgPSAwOworICAgIHZhciBtYXhMendEaWN0aW9uYXJ5U2l6ZSA9IDQwOTY7CisgICAgdmFyIGx6d1N0YXRlID0geworICAgICAgZWFybHlDaGFuZ2UsCisgICAgICBjb2RlTGVuZ3RoOiA5LAorICAgICAgbmV4dENvZGU6IDI1OCwKKyAgICAgIGRpY3Rpb25hcnlWYWx1ZXM6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSwKKyAgICAgIGRpY3Rpb25hcnlMZW5ndGhzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAorICAgICAgZGljdGlvbmFyeVByZXZDb2RlczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSwKKyAgICAgIGN1cnJlbnRTZXF1ZW5jZTogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAorICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoOiAwCisgICAgfTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgIGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXNbaV0gPSBpOworICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHNbaV0gPSAxOworICAgIH0KKworICAgIHRoaXMubHp3U3RhdGUgPSBsendTdGF0ZTsKKyAgICBEZWNvZGVTdHJlYW0uY2FsbCh0aGlzLCBtYXliZUxlbmd0aCk7CisgIH0KKworICBMWldTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShEZWNvZGVTdHJlYW0ucHJvdG90eXBlKTsKKworICBMWldTdHJlYW0ucHJvdG90eXBlLnJlYWRCaXRzID0gZnVuY3Rpb24gTFpXU3RyZWFtX3JlYWRCaXRzKG4pIHsKKyAgICB2YXIgYml0c0NhY2hlZCA9IHRoaXMuYml0c0NhY2hlZDsKKyAgICB2YXIgY2FjaGVkRGF0YSA9IHRoaXMuY2FjaGVkRGF0YTsKKworICAgIHdoaWxlIChiaXRzQ2FjaGVkIDwgbikgeworICAgICAgdmFyIGMgPSB0aGlzLnN0ci5nZXRCeXRlKCk7CisKKyAgICAgIGlmIChjID09PSAtMSkgeworICAgICAgICB0aGlzLmVvZiA9IHRydWU7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBjYWNoZWREYXRhID0gY2FjaGVkRGF0YSA8PCA4IHwgYzsKKyAgICAgIGJpdHNDYWNoZWQgKz0gODsKKyAgICB9CisKKyAgICB0aGlzLmJpdHNDYWNoZWQgPSBiaXRzQ2FjaGVkIC09IG47CisgICAgdGhpcy5jYWNoZWREYXRhID0gY2FjaGVkRGF0YTsKKyAgICB0aGlzLmxhc3RDb2RlID0gbnVsbDsKKyAgICByZXR1cm4gY2FjaGVkRGF0YSA+Pj4gYml0c0NhY2hlZCAmICgxIDw8IG4pIC0gMTsKKyAgfTsKKworICBMWldTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uIExaV1N0cmVhbV9yZWFkQmxvY2soKSB7CisgICAgdmFyIGJsb2NrU2l6ZSA9IDUxMjsKKyAgICB2YXIgZXN0aW1hdGVkRGVjb2RlZFNpemUgPSBibG9ja1NpemUgKiAyLAorICAgICAgICBkZWNvZGVkU2l6ZURlbHRhID0gYmxvY2tTaXplOworICAgIHZhciBpLCBqLCBxOworICAgIHZhciBsendTdGF0ZSA9IHRoaXMubHp3U3RhdGU7CisKKyAgICBpZiAoIWx6d1N0YXRlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGVhcmx5Q2hhbmdlID0gbHp3U3RhdGUuZWFybHlDaGFuZ2U7CisgICAgdmFyIG5leHRDb2RlID0gbHp3U3RhdGUubmV4dENvZGU7CisgICAgdmFyIGRpY3Rpb25hcnlWYWx1ZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzOworICAgIHZhciBkaWN0aW9uYXJ5TGVuZ3RocyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzOworICAgIHZhciBkaWN0aW9uYXJ5UHJldkNvZGVzID0gbHp3U3RhdGUuZGljdGlvbmFyeVByZXZDb2RlczsKKyAgICB2YXIgY29kZUxlbmd0aCA9IGx6d1N0YXRlLmNvZGVMZW5ndGg7CisgICAgdmFyIHByZXZDb2RlID0gbHp3U3RhdGUucHJldkNvZGU7CisgICAgdmFyIGN1cnJlbnRTZXF1ZW5jZSA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZTsKKyAgICB2YXIgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoOworICAgIHZhciBkZWNvZGVkTGVuZ3RoID0gMDsKKyAgICB2YXIgY3VycmVudEJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOworICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIGVzdGltYXRlZERlY29kZWRTaXplKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgeworICAgICAgdmFyIGNvZGUgPSB0aGlzLnJlYWRCaXRzKGNvZGVMZW5ndGgpOworICAgICAgdmFyIGhhc1ByZXYgPSBjdXJyZW50U2VxdWVuY2VMZW5ndGggPiAwOworCisgICAgICBpZiAoY29kZSA8IDI1NikgeworICAgICAgICBjdXJyZW50U2VxdWVuY2VbMF0gPSBjb2RlOworICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAxOworICAgICAgfSBlbHNlIGlmIChjb2RlID49IDI1OCkgeworICAgICAgICBpZiAoY29kZSA8IG5leHRDb2RlKSB7CisgICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gZGljdGlvbmFyeUxlbmd0aHNbY29kZV07CisKKyAgICAgICAgICBmb3IgKGogPSBjdXJyZW50U2VxdWVuY2VMZW5ndGggLSAxLCBxID0gY29kZTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtqXSA9IGRpY3Rpb25hcnlWYWx1ZXNbcV07CisgICAgICAgICAgICBxID0gZGljdGlvbmFyeVByZXZDb2Rlc1txXTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VycmVudFNlcXVlbmNlW2N1cnJlbnRTZXF1ZW5jZUxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAyNTYpIHsKKyAgICAgICAgY29kZUxlbmd0aCA9IDk7CisgICAgICAgIG5leHRDb2RlID0gMjU4OworICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKKyAgICAgICAgZGVsZXRlIHRoaXMubHp3U3RhdGU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoaGFzUHJldikgeworICAgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzW25leHRDb2RlXSA9IHByZXZDb2RlOworICAgICAgICBkaWN0aW9uYXJ5TGVuZ3Roc1tuZXh0Q29kZV0gPSBkaWN0aW9uYXJ5TGVuZ3Roc1twcmV2Q29kZV0gKyAxOworICAgICAgICBkaWN0aW9uYXJ5VmFsdWVzW25leHRDb2RlXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTsKKyAgICAgICAgbmV4dENvZGUrKzsKKyAgICAgICAgY29kZUxlbmd0aCA9IG5leHRDb2RlICsgZWFybHlDaGFuZ2UgJiBuZXh0Q29kZSArIGVhcmx5Q2hhbmdlIC0gMSA/IGNvZGVMZW5ndGggOiBNYXRoLm1pbihNYXRoLmxvZyhuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAvIDAuNjkzMTQ3MTgwNTU5OTQ1MyArIDEsIDEyKSB8IDA7CisgICAgICB9CisKKyAgICAgIHByZXZDb2RlID0gY29kZTsKKyAgICAgIGRlY29kZWRMZW5ndGggKz0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOworCisgICAgICBpZiAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBlc3RpbWF0ZWREZWNvZGVkU2l6ZSArPSBkZWNvZGVkU2l6ZURlbHRhOworICAgICAgICB9IHdoaWxlIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpOworCisgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOworICAgICAgfQorCisgICAgICBmb3IgKGogPSAwOyBqIDwgY3VycmVudFNlcXVlbmNlTGVuZ3RoOyBqKyspIHsKKyAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2Vbal07CisgICAgICB9CisgICAgfQorCisgICAgbHp3U3RhdGUubmV4dENvZGUgPSBuZXh0Q29kZTsKKyAgICBsendTdGF0ZS5jb2RlTGVuZ3RoID0gY29kZUxlbmd0aDsKKyAgICBsendTdGF0ZS5wcmV2Q29kZSA9IHByZXZDb2RlOworICAgIGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDsKKyAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGN1cnJlbnRCdWZmZXJMZW5ndGg7CisgIH07CisKKyAgcmV0dXJuIExaV1N0cmVhbTsKK30oKTsKKworZXhwb3J0cy5MWldTdHJlYW0gPSBMWldTdHJlYW07CisKK3ZhciBOdWxsU3RyZWFtID0gZnVuY3Rpb24gTnVsbFN0cmVhbUNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIE51bGxTdHJlYW0oKSB7CisgICAgU3RyZWFtLmNhbGwodGhpcywgbmV3IFVpbnQ4QXJyYXkoMCkpOworICB9CisKKyAgTnVsbFN0cmVhbS5wcm90b3R5cGUgPSBTdHJlYW0ucHJvdG90eXBlOworICByZXR1cm4gTnVsbFN0cmVhbTsKK30oKTsKKworZXhwb3J0cy5OdWxsU3RyZWFtID0gTnVsbFN0cmVhbTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS90eXBlMV9wYXJzZXIuanMgYi9saWIvY29yZS90eXBlMV9wYXJzZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YjliYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL3R5cGUxX3BhcnNlci5qcwpAQCAtMCwwICsxLDcyOCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuVHlwZTFQYXJzZXIgPSB2b2lkIDA7CisKK3ZhciBfZW5jb2RpbmdzID0gcmVxdWlyZSgiLi9lbmNvZGluZ3MuanMiKTsKKwordmFyIF9jb3JlX3V0aWxzID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi9zdHJlYW0uanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIEhJTlRJTkdfRU5BQkxFRCA9IGZhbHNlOworCit2YXIgVHlwZTFDaGFyU3RyaW5nID0gZnVuY3Rpb24gVHlwZTFDaGFyU3RyaW5nQ2xvc3VyZSgpIHsKKyAgdmFyIENPTU1BTkRfTUFQID0geworICAgIGhzdGVtOiBbMV0sCisgICAgdnN0ZW06IFszXSwKKyAgICB2bW92ZXRvOiBbNF0sCisgICAgcmxpbmV0bzogWzVdLAorICAgIGhsaW5ldG86IFs2XSwKKyAgICB2bGluZXRvOiBbN10sCisgICAgcnJjdXJ2ZXRvOiBbOF0sCisgICAgY2FsbHN1YnI6IFsxMF0sCisgICAgZmxleDogWzEyLCAzNV0sCisgICAgZHJvcDogWzEyLCAxOF0sCisgICAgZW5kY2hhcjogWzE0XSwKKyAgICBybW92ZXRvOiBbMjFdLAorICAgIGhtb3ZldG86IFsyMl0sCisgICAgdmhjdXJ2ZXRvOiBbMzBdLAorICAgIGh2Y3VydmV0bzogWzMxXQorICB9OworCisgIGZ1bmN0aW9uIFR5cGUxQ2hhclN0cmluZygpIHsKKyAgICB0aGlzLndpZHRoID0gMDsKKyAgICB0aGlzLmxzYiA9IDA7CisgICAgdGhpcy5mbGV4aW5nID0gZmFsc2U7CisgICAgdGhpcy5vdXRwdXQgPSBbXTsKKyAgICB0aGlzLnN0YWNrID0gW107CisgIH0KKworICBUeXBlMUNoYXJTdHJpbmcucHJvdG90eXBlID0geworICAgIGNvbnZlcnQ6IGZ1bmN0aW9uIFR5cGUxQ2hhclN0cmluZ19jb252ZXJ0KGVuY29kZWQsIHN1YnJzLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CisgICAgICB2YXIgY291bnQgPSBlbmNvZGVkLmxlbmd0aDsKKyAgICAgIHZhciBlcnJvciA9IGZhbHNlOworICAgICAgdmFyIHd4LCBzYngsIHN1YnJOdW1iZXI7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB2YXIgdmFsdWUgPSBlbmNvZGVkW2ldOworCisgICAgICAgIGlmICh2YWx1ZSA8IDMyKSB7CisgICAgICAgICAgaWYgKHZhbHVlID09PSAxMikgeworICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgKyBlbmNvZGVkWysraV07CisgICAgICAgICAgfQorCisgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICBpZiAoIUhJTlRJTkdfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBkeSA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKDAsIGR5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bW92ZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnJsaW5ldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAuaGxpbmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bGluZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDYsIENPTU1BTkRfTUFQLnJyY3VydmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdWJyTnVtYmVyID0gdGhpcy5zdGFjay5wb3AoKTsKKworICAgICAgICAgICAgICBpZiAoIXN1YnJzW3N1YnJOdW1iZXJdKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmNvbnZlcnQoc3VicnNbc3Vick51bWJlcl0sIHN1YnJzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHd4ID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7CisgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDsKKyAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngpOworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaG1vdmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICB0aGlzLm91dHB1dC5wdXNoKENPTU1BTkRfTUFQLmVuZGNoYXJbMF0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnJtb3ZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCgwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC5obW92ZXRvKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC52aGN1cnZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDQsIENPTU1BTkRfTUFQLmh2Y3VydmV0byk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDA6CisgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMToKKyAgICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAudnN0ZW0pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAyOgorICAgICAgICAgICAgICBpZiAoIUhJTlRJTkdfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDY6CisgICAgICAgICAgICAgIGlmIChzZWFjQW5hbHlzaXNFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXNiID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDVdOworICAgICAgICAgICAgICAgIHRoaXMuc2VhYyA9IHRoaXMuc3RhY2suc3BsaWNlKC00LCA0KTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlYWNbMF0gKz0gdGhpcy5sc2IgLSBhc2I7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDAsIENPTU1BTkRfTUFQLmVuZGNoYXIpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5lbmRjaGFyKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDc6CisgICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDQpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB3eCA9IHRoaXMuc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgIHZhciBzYnkgPSB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICBzYnggPSB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB0aGlzLmxzYiA9IHNieDsKKyAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IHd4OworICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2god3gsIHNieCwgc2J5KTsKKyAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDMsIENPTU1BTkRfTUFQLnJtb3ZldG8pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxMjoKKyAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHZhciBudW0yID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgdmFyIG51bTEgPSB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2gobnVtMSAvIG51bTIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNjoKKyAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHN1YnJOdW1iZXIgPSB0aGlzLnN0YWNrLnBvcCgpOworICAgICAgICAgICAgICB2YXIgbnVtQXJncyA9IHRoaXMuc3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgICAgaWYgKHN1YnJOdW1iZXIgPT09IDAgJiYgbnVtQXJncyA9PT0gMykgeworICAgICAgICAgICAgICAgIHZhciBmbGV4QXJncyA9IHRoaXMuc3RhY2suc3BsaWNlKHRoaXMuc3RhY2subGVuZ3RoIC0gMTcsIDE3KTsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZmxleEFyZ3NbMl0gKyBmbGV4QXJnc1swXSwgZmxleEFyZ3NbM10gKyBmbGV4QXJnc1sxXSwgZmxleEFyZ3NbNF0sIGZsZXhBcmdzWzVdLCBmbGV4QXJnc1s2XSwgZmxleEFyZ3NbN10sIGZsZXhBcmdzWzhdLCBmbGV4QXJnc1s5XSwgZmxleEFyZ3NbMTBdLCBmbGV4QXJnc1sxMV0sIGZsZXhBcmdzWzEyXSwgZmxleEFyZ3NbMTNdLCBmbGV4QXJnc1sxNF0pOworICAgICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxMywgQ09NTUFORF9NQVAuZmxleCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgdGhpcy5mbGV4aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGZsZXhBcmdzWzE1XSwgZmxleEFyZ3NbMTZdKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJyTnVtYmVyID09PSAxICYmIG51bUFyZ3MgPT09IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSB0cnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMTc6CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDMzOgorICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoJ1Vua25vd24gdHlwZSAxIGNoYXJzdHJpbmcgY29tbWFuZCBvZiAiJyArIHZhbHVlICsgJyInKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAyNDYpIHsKKyAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC0gMTM5OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1MCkgeworICAgICAgICAgIHZhbHVlID0gKHZhbHVlIC0gMjQ3KSAqIDI1NiArIGVuY29kZWRbKytpXSArIDEwODsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAyNTQpIHsKKyAgICAgICAgICB2YWx1ZSA9IC0oKHZhbHVlIC0gMjUxKSAqIDI1NikgLSBlbmNvZGVkWysraV0gLSAxMDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFsdWUgPSAoZW5jb2RlZFsrK2ldICYgMHhmZikgPDwgMjQgfCAoZW5jb2RlZFsrK2ldICYgMHhmZikgPDwgMTYgfCAoZW5jb2RlZFsrK2ldICYgMHhmZikgPDwgOCB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAwOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGVycm9yOworICAgIH0sCisKKyAgICBleGVjdXRlQ29tbWFuZChob3dNYW55QXJncywgY29tbWFuZCwga2VlcFN0YWNrKSB7CisgICAgICB2YXIgc3RhY2tMZW5ndGggPSB0aGlzLnN0YWNrLmxlbmd0aDsKKworICAgICAgaWYgKGhvd01hbnlBcmdzID4gc3RhY2tMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHZhciBzdGFydCA9IHN0YWNrTGVuZ3RoIC0gaG93TWFueUFyZ3M7CisKKyAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IHN0YWNrTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5zdGFja1tpXTsKKworICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKKyAgICAgICAgICB0aGlzLm91dHB1dC5wdXNoKDI4LCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YWx1ZSA9IDY1NTM2ICogdmFsdWUgfCAwOworICAgICAgICAgIHRoaXMub3V0cHV0LnB1c2goMjU1LCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5vdXRwdXQucHVzaC5hcHBseSh0aGlzLm91dHB1dCwgY29tbWFuZCk7CisKKyAgICAgIGlmIChrZWVwU3RhY2spIHsKKyAgICAgICAgdGhpcy5zdGFjay5zcGxpY2Uoc3RhcnQsIGhvd01hbnlBcmdzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc3RhY2subGVuZ3RoID0gMDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB9OworICByZXR1cm4gVHlwZTFDaGFyU3RyaW5nOworfSgpOworCit2YXIgVHlwZTFQYXJzZXIgPSBmdW5jdGlvbiBUeXBlMVBhcnNlckNsb3N1cmUoKSB7CisgIHZhciBFRVhFQ19FTkNSWVBUX0tFWSA9IDU1NjY1OworICB2YXIgQ0hBUl9TVFJTX0VOQ1JZUFRfS0VZID0gNDMzMDsKKworICBmdW5jdGlvbiBpc0hleERpZ2l0KGNvZGUpIHsKKyAgICByZXR1cm4gY29kZSA+PSA0OCAmJiBjb2RlIDw9IDU3IHx8IGNvZGUgPj0gNjUgJiYgY29kZSA8PSA3MCB8fCBjb2RlID49IDk3ICYmIGNvZGUgPD0gMTAyOworICB9CisKKyAgZnVuY3Rpb24gZGVjcnlwdChkYXRhLCBrZXksIGRpc2NhcmROdW1iZXIpIHsKKyAgICBpZiAoZGlzY2FyZE51bWJlciA+PSBkYXRhLmxlbmd0aCkgeworICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOworICAgIH0KKworICAgIHZhciByID0ga2V5IHwgMCwKKyAgICAgICAgYzEgPSA1Mjg0NSwKKyAgICAgICAgYzIgPSAyMjcxOSwKKyAgICAgICAgaSwKKyAgICAgICAgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkaXNjYXJkTnVtYmVyOyBpKyspIHsKKyAgICAgIHIgPSAoZGF0YVtpXSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CisgICAgfQorCisgICAgdmFyIGNvdW50ID0gZGF0YS5sZW5ndGggLSBkaXNjYXJkTnVtYmVyOworICAgIHZhciBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShjb3VudCk7CisKKyAgICBmb3IgKGkgPSBkaXNjYXJkTnVtYmVyLCBqID0gMDsgaiA8IGNvdW50OyBpKyssIGorKykgeworICAgICAgdmFyIHZhbHVlID0gZGF0YVtpXTsKKyAgICAgIGRlY3J5cHRlZFtqXSA9IHZhbHVlIF4gciA+PiA4OworICAgICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CisgICAgfQorCisgICAgcmV0dXJuIGRlY3J5cHRlZDsKKyAgfQorCisgIGZ1bmN0aW9uIGRlY3J5cHRBc2NpaShkYXRhLCBrZXksIGRpc2NhcmROdW1iZXIpIHsKKyAgICB2YXIgciA9IGtleSB8IDAsCisgICAgICAgIGMxID0gNTI4NDUsCisgICAgICAgIGMyID0gMjI3MTk7CisgICAgdmFyIGNvdW50ID0gZGF0YS5sZW5ndGgsCisgICAgICAgIG1heWJlTGVuZ3RoID0gY291bnQgPj4+IDE7CisgICAgdmFyIGRlY3J5cHRlZCA9IG5ldyBVaW50OEFycmF5KG1heWJlTGVuZ3RoKTsKKyAgICB2YXIgaSwgajsKKworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgdmFyIGRpZ2l0MSA9IGRhdGFbaV07CisKKyAgICAgIGlmICghaXNIZXhEaWdpdChkaWdpdDEpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpKys7CisgICAgICB2YXIgZGlnaXQyOworCisgICAgICB3aGlsZSAoaSA8IGNvdW50ICYmICFpc0hleERpZ2l0KGRpZ2l0MiA9IGRhdGFbaV0pKSB7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPCBjb3VudCkgeworICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZUludChTdHJpbmcuZnJvbUNoYXJDb2RlKGRpZ2l0MSwgZGlnaXQyKSwgMTYpOworICAgICAgICBkZWNyeXB0ZWRbaisrXSA9IHZhbHVlIF4gciA+PiA4OworICAgICAgICByID0gKHZhbHVlICsgcikgKiBjMSArIGMyICYgKDEgPDwgMTYpIC0gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGVjcnlwdGVkLnNsaWNlKGRpc2NhcmROdW1iZXIsIGopOworICB9CisKKyAgZnVuY3Rpb24gaXNTcGVjaWFsKGMpIHsKKyAgICByZXR1cm4gYyA9PT0gMHgyZiB8fCBjID09PSAweDViIHx8IGMgPT09IDB4NWQgfHwgYyA9PT0gMHg3YiB8fCBjID09PSAweDdkIHx8IGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOTsKKyAgfQorCisgIGZ1bmN0aW9uIFR5cGUxUGFyc2VyKHN0cmVhbSwgZW5jcnlwdGVkLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CisgICAgaWYgKGVuY3J5cHRlZCkgeworICAgICAgdmFyIGRhdGEgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKKyAgICAgIHZhciBpc0JpbmFyeSA9ICEoKGlzSGV4RGlnaXQoZGF0YVswXSkgfHwgKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoZGF0YVswXSkpICYmIGlzSGV4RGlnaXQoZGF0YVsxXSkgJiYgaXNIZXhEaWdpdChkYXRhWzJdKSAmJiBpc0hleERpZ2l0KGRhdGFbM10pICYmIGlzSGV4RGlnaXQoZGF0YVs0XSkgJiYgaXNIZXhEaWdpdChkYXRhWzVdKSAmJiBpc0hleERpZ2l0KGRhdGFbNl0pICYmIGlzSGV4RGlnaXQoZGF0YVs3XSkpOworICAgICAgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyZWFtKGlzQmluYXJ5ID8gZGVjcnlwdChkYXRhLCBFRVhFQ19FTkNSWVBUX0tFWSwgNCkgOiBkZWNyeXB0QXNjaWkoZGF0YSwgRUVYRUNfRU5DUllQVF9LRVksIDQpKTsKKyAgICB9CisKKyAgICB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQgPSAhIXNlYWNBbmFseXNpc0VuYWJsZWQ7CisgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5uZXh0Q2hhcigpOworICB9CisKKyAgVHlwZTFQYXJzZXIucHJvdG90eXBlID0geworICAgIHJlYWROdW1iZXJBcnJheTogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZE51bWJlckFycmF5KCkgeworICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09ICJdIiB8fCB0b2tlbiA9PT0gIn0iKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhcnJheS5wdXNoKHBhcnNlRmxvYXQodG9rZW4gfHwgMCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gYXJyYXk7CisgICAgfSwKKyAgICByZWFkTnVtYmVyOiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkTnVtYmVyKCkgeworICAgICAgdmFyIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodG9rZW4gfHwgMCk7CisgICAgfSwKKyAgICByZWFkSW50OiBmdW5jdGlvbiBUeXBlMVBhcnNlcl9yZWFkSW50KCkgeworICAgICAgdmFyIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworICAgICAgcmV0dXJuIHBhcnNlSW50KHRva2VuIHx8IDAsIDEwKSB8IDA7CisgICAgfSwKKyAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZEJvb2xlYW4oKSB7CisgICAgICB2YXIgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CisgICAgICByZXR1cm4gdG9rZW4gPT09ICJ0cnVlIiA/IDEgOiAwOworICAgIH0sCisgICAgbmV4dENoYXI6IGZ1bmN0aW9uIFR5cGUxX25leHRDaGFyKCkgeworICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENoYXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CisgICAgfSwKKyAgICBnZXRUb2tlbjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfZ2V0VG9rZW4oKSB7CisgICAgICB2YXIgY29tbWVudCA9IGZhbHNlOworICAgICAgdmFyIGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKGNoID09PSAtMSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbW1lbnQpIHsKKyAgICAgICAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKKyAgICAgICAgICAgIGNvbW1lbnQgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjUpIHsKKyAgICAgICAgICBjb21tZW50ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGlzU3BlY2lhbChjaCkpIHsKKyAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CisgICAgICB9CisKKyAgICAgIHZhciB0b2tlbiA9ICIiOworCisgICAgICBkbyB7CisgICAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOworICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKKyAgICAgIH0gd2hpbGUgKGNoID49IDAgJiYgISgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGNoKSAmJiAhaXNTcGVjaWFsKGNoKSk7CisKKyAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9LAorICAgIHJlYWRDaGFyU3RyaW5nczogZnVuY3Rpb24gVHlwZTFQYXJzZXJfcmVhZENoYXJTdHJpbmdzKGJ5dGVzLCBsZW5JVikgeworICAgICAgaWYgKGxlbklWID09PSAtMSkgeworICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkZWNyeXB0KGJ5dGVzLCBDSEFSX1NUUlNfRU5DUllQVF9LRVksIGxlbklWKTsKKyAgICB9LAorICAgIGV4dHJhY3RGb250UHJvZ3JhbTogZnVuY3Rpb24gVHlwZTFQYXJzZXJfZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpIHsKKyAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKKyAgICAgIHZhciBzdWJycyA9IFtdLAorICAgICAgICAgIGNoYXJzdHJpbmdzID0gW107CisgICAgICB2YXIgcHJpdmF0ZURhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgcHJpdmF0ZURhdGEubGVuSVYgPSA0OworICAgICAgdmFyIHByb2dyYW0gPSB7CisgICAgICAgIHN1YnJzOiBbXSwKKyAgICAgICAgY2hhcnN0cmluZ3M6IFtdLAorICAgICAgICBwcm9wZXJ0aWVzOiB7CisgICAgICAgICAgcHJpdmF0ZURhdGEKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIHZhciB0b2tlbiwgbGVuZ3RoLCBkYXRhLCBsZW5JViwgZW5jb2RlZDsKKworICAgICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKKyAgICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgICBjYXNlICJDaGFyU3RyaW5ncyI6CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gImVuZCIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOworICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKKyAgICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CisgICAgICAgICAgICAgIGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CisgICAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgICAgICAgaWYgKHRva2VuID09PSAibm9hY2Nlc3MiKSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2hhcnN0cmluZ3MucHVzaCh7CisgICAgICAgICAgICAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgZW5jb2RlZAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJTdWJycyI6CisgICAgICAgICAgICB0aGlzLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICAgICAgd2hpbGUgKHRoaXMuZ2V0VG9rZW4oKSA9PT0gImR1cCIpIHsKKyAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5yZWFkSW50KCk7CisgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgZGF0YSA9IGxlbmd0aCA+IDAgPyBzdHJlYW0uZ2V0Qnl0ZXMobGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KDApOworICAgICAgICAgICAgICBsZW5JViA9IHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjsKKyAgICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMucmVhZENoYXJTdHJpbmdzKGRhdGEsIGxlbklWKTsKKyAgICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOworICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICAgICAgICBpZiAodG9rZW4gPT09ICJub2FjY2VzcyIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdWJyc1tpbmRleF0gPSBlbmNvZGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkJsdWVWYWx1ZXMiOgorICAgICAgICAgIGNhc2UgIk90aGVyQmx1ZXMiOgorICAgICAgICAgIGNhc2UgIkZhbWlseUJsdWVzIjoKKyAgICAgICAgICBjYXNlICJGYW1pbHlPdGhlckJsdWVzIjoKKyAgICAgICAgICAgIHZhciBibHVlQXJyYXkgPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOworCisgICAgICAgICAgICBpZiAoYmx1ZUFycmF5Lmxlbmd0aCA+IDAgJiYgYmx1ZUFycmF5Lmxlbmd0aCAlIDIgPT09IDAgJiYgSElOVElOR19FTkFCTEVEKSB7CisgICAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSBibHVlQXJyYXk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiU3RlbVNuYXBIIjoKKyAgICAgICAgICBjYXNlICJTdGVtU25hcFYiOgorICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlckFycmF5KCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIlN0ZEhXIjoKKyAgICAgICAgICBjYXNlICJTdGRWVyI6CisgICAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKVswXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQmx1ZVNoaWZ0IjoKKyAgICAgICAgICBjYXNlICJsZW5JViI6CisgICAgICAgICAgY2FzZSAiQmx1ZUZ1enoiOgorICAgICAgICAgIGNhc2UgIkJsdWVTY2FsZSI6CisgICAgICAgICAgY2FzZSAiTGFuZ3VhZ2VHcm91cCI6CisgICAgICAgICAgY2FzZSAiRXhwYW5zaW9uRmFjdG9yIjoKKyAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiRm9yY2VCb2xkIjoKKyAgICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWRCb29sZWFuKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGdseXBoID0gY2hhcnN0cmluZ3NbaV0uZ2x5cGg7CisgICAgICAgIGVuY29kZWQgPSBjaGFyc3RyaW5nc1tpXS5lbmNvZGVkOworICAgICAgICB2YXIgY2hhclN0cmluZyA9IG5ldyBUeXBlMUNoYXJTdHJpbmcoKTsKKyAgICAgICAgdmFyIGVycm9yID0gY2hhclN0cmluZy5jb252ZXJ0KGVuY29kZWQsIHN1YnJzLCB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQpOworICAgICAgICB2YXIgb3V0cHV0ID0gY2hhclN0cmluZy5vdXRwdXQ7CisKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgb3V0cHV0ID0gWzE0XTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXJTdHJpbmdPYmplY3QgPSB7CisgICAgICAgICAgZ2x5cGhOYW1lOiBnbHlwaCwKKyAgICAgICAgICBjaGFyc3RyaW5nOiBvdXRwdXQsCisgICAgICAgICAgd2lkdGg6IGNoYXJTdHJpbmcud2lkdGgsCisgICAgICAgICAgbHNiOiBjaGFyU3RyaW5nLmxzYiwKKyAgICAgICAgICBzZWFjOiBjaGFyU3RyaW5nLnNlYWMKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoZ2x5cGggPT09ICIubm90ZGVmIikgeworICAgICAgICAgIHByb2dyYW0uY2hhcnN0cmluZ3MudW5zaGlmdChjaGFyU3RyaW5nT2JqZWN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcm9ncmFtLmNoYXJzdHJpbmdzLnB1c2goY2hhclN0cmluZ09iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKKyAgICAgICAgICBjb25zdCBpbmRleCA9IHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nLmluZGV4T2YoZ2x5cGgpOworCisgICAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgcHJvcGVydGllcy53aWR0aHNbaW5kZXhdID09PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gcHJvcGVydGllcy5maXJzdENoYXIgJiYgaW5kZXggPD0gcHJvcGVydGllcy5sYXN0Q2hhcikgeworICAgICAgICAgICAgcHJvcGVydGllcy53aWR0aHNbaW5kZXhdID0gY2hhclN0cmluZy53aWR0aDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHByb2dyYW07CisgICAgfSwKKyAgICBleHRyYWN0Rm9udEhlYWRlcjogZnVuY3Rpb24gVHlwZTFQYXJzZXJfZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcykgeworICAgICAgdmFyIHRva2VuOworCisgICAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5nZXRUb2tlbigpKSAhPT0gbnVsbCkgeworICAgICAgICBpZiAodG9rZW4gIT09ICIvIikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CisKKyAgICAgICAgc3dpdGNoICh0b2tlbikgeworICAgICAgICAgIGNhc2UgIkZvbnRNYXRyaXgiOgorICAgICAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMucmVhZE51bWJlckFycmF5KCk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmZvbnRNYXRyaXggPSBtYXRyaXg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkVuY29kaW5nIjoKKyAgICAgICAgICAgIHZhciBlbmNvZGluZ0FyZyA9IHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgIHZhciBlbmNvZGluZzsKKworICAgICAgICAgICAgaWYgKCEvXlxkKyQvLnRlc3QoZW5jb2RpbmdBcmcpKSB7CisgICAgICAgICAgICAgIGVuY29kaW5nID0gKDAsIF9lbmNvZGluZ3MuZ2V0RW5jb2RpbmcpKGVuY29kaW5nQXJnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVuY29kaW5nID0gW107CisgICAgICAgICAgICAgIHZhciBzaXplID0gcGFyc2VJbnQoZW5jb2RpbmdBcmcsIDEwKSB8IDA7CisgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKworICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9PSAiZHVwIiAmJiB0b2tlbiAhPT0gImRlZiIpIHsKKyAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOworCisgICAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gImRlZiIpIHsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMucmVhZEludCgpOworICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7CisgICAgICAgICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gZ2x5cGg7CisgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkZvbnRCQm94IjoKKyAgICAgICAgICAgIHZhciBmb250QkJveCA9IHRoaXMucmVhZE51bWJlckFycmF5KCk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudCA9IE1hdGgubWF4KGZvbnRCQm94WzNdLCBmb250QkJveFsxXSk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmRlc2NlbnQgPSBNYXRoLm1pbihmb250QkJveFsxXSwgZm9udEJCb3hbM10pOworICAgICAgICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisgIHJldHVybiBUeXBlMVBhcnNlcjsKK30oKTsKKworZXhwb3J0cy5UeXBlMVBhcnNlciA9IFR5cGUxUGFyc2VyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL3VuaWNvZGUuanMgYi9saWIvY29yZS91bmljb2RlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2Q1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29yZS91bmljb2RlLmpzCkBAIC0wLDAgKzEsMTg5OSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgZ2V0TG9va3VwVGFibGVGYWN0b3J5ID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIikuZ2V0TG9va3VwVGFibGVGYWN0b3J5OworCit2YXIgZ2V0U3BlY2lhbFBVQVN5bWJvbHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKKyAgdFs2MzcyMV0gPSAweDAwYTk7CisgIHRbNjMxOTNdID0gMHgwMGE5OworICB0WzYzNzIwXSA9IDB4MDBhZTsKKyAgdFs2MzE5NF0gPSAweDAwYWU7CisgIHRbNjM3MjJdID0gMHgyMTIyOworICB0WzYzMTk1XSA9IDB4MjEyMjsKKyAgdFs2MzcyOV0gPSAweDIzYTc7CisgIHRbNjM3MzBdID0gMHgyM2E4OworICB0WzYzNzMxXSA9IDB4MjNhOTsKKyAgdFs2Mzc0MF0gPSAweDIzYWI7CisgIHRbNjM3NDFdID0gMHgyM2FjOworICB0WzYzNzQyXSA9IDB4MjNhZDsKKyAgdFs2MzcyNl0gPSAweDIzYTE7CisgIHRbNjM3MjddID0gMHgyM2EyOworICB0WzYzNzI4XSA9IDB4MjNhMzsKKyAgdFs2MzczN10gPSAweDIzYTQ7CisgIHRbNjM3MzhdID0gMHgyM2E1OworICB0WzYzNzM5XSA9IDB4MjNhNjsKKyAgdFs2MzcyM10gPSAweDIzOWI7CisgIHRbNjM3MjRdID0gMHgyMzljOworICB0WzYzNzI1XSA9IDB4MjM5ZDsKKyAgdFs2MzczNF0gPSAweDIzOWU7CisgIHRbNjM3MzVdID0gMHgyMzlmOworICB0WzYzNzM2XSA9IDB4MjNhMDsKK30pOworCitmdW5jdGlvbiBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhjb2RlKSB7CisgIGlmIChjb2RlID49IDB4ZmZmMCAmJiBjb2RlIDw9IDB4ZmZmZikgeworICAgIHJldHVybiAwOworICB9IGVsc2UgaWYgKGNvZGUgPj0gMHhmNjAwICYmIGNvZGUgPD0gMHhmOGZmKSB7CisgICAgcmV0dXJuIGdldFNwZWNpYWxQVUFTeW1ib2xzKClbY29kZV0gfHwgY29kZTsKKyAgfSBlbHNlIGlmIChjb2RlID09PSAweDAwYWQpIHsKKyAgICByZXR1cm4gMHgwMDJkOworICB9CisKKyAgcmV0dXJuIGNvZGU7Cit9CisKK2Z1bmN0aW9uIGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CisgIHZhciB1bmljb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtuYW1lXTsKKworICBpZiAodW5pY29kZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIHVuaWNvZGU7CisgIH0KKworICBpZiAoIW5hbWUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAobmFtZVswXSA9PT0gInUiKSB7CisgICAgdmFyIG5hbWVMZW4gPSBuYW1lLmxlbmd0aCwKKyAgICAgICAgaGV4U3RyOworCisgICAgaWYgKG5hbWVMZW4gPT09IDcgJiYgbmFtZVsxXSA9PT0gIm4iICYmIG5hbWVbMl0gPT09ICJpIikgeworICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMyk7CisgICAgfSBlbHNlIGlmIChuYW1lTGVuID49IDUgJiYgbmFtZUxlbiA8PSA3KSB7CisgICAgICBoZXhTdHIgPSBuYW1lLnN1YnN0cmluZygxKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChoZXhTdHIgPT09IGhleFN0ci50b1VwcGVyQ2FzZSgpKSB7CisgICAgICB1bmljb2RlID0gcGFyc2VJbnQoaGV4U3RyLCAxNik7CisKKyAgICAgIGlmICh1bmljb2RlID49IDApIHsKKyAgICAgICAgcmV0dXJuIHVuaWNvZGU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIC0xOworfQorCit2YXIgVW5pY29kZVJhbmdlcyA9IFt7CisgIGJlZ2luOiAweDAwMDAsCisgIGVuZDogMHgwMDdmCit9LCB7CisgIGJlZ2luOiAweDAwODAsCisgIGVuZDogMHgwMGZmCit9LCB7CisgIGJlZ2luOiAweDAxMDAsCisgIGVuZDogMHgwMTdmCit9LCB7CisgIGJlZ2luOiAweDAxODAsCisgIGVuZDogMHgwMjRmCit9LCB7CisgIGJlZ2luOiAweDAyNTAsCisgIGVuZDogMHgwMmFmCit9LCB7CisgIGJlZ2luOiAweDAyYjAsCisgIGVuZDogMHgwMmZmCit9LCB7CisgIGJlZ2luOiAweDAzMDAsCisgIGVuZDogMHgwMzZmCit9LCB7CisgIGJlZ2luOiAweDAzNzAsCisgIGVuZDogMHgwM2ZmCit9LCB7CisgIGJlZ2luOiAweDJjODAsCisgIGVuZDogMHgyY2ZmCit9LCB7CisgIGJlZ2luOiAweDA0MDAsCisgIGVuZDogMHgwNGZmCit9LCB7CisgIGJlZ2luOiAweDA1MzAsCisgIGVuZDogMHgwNThmCit9LCB7CisgIGJlZ2luOiAweDA1OTAsCisgIGVuZDogMHgwNWZmCit9LCB7CisgIGJlZ2luOiAweGE1MDAsCisgIGVuZDogMHhhNjNmCit9LCB7CisgIGJlZ2luOiAweDA2MDAsCisgIGVuZDogMHgwNmZmCit9LCB7CisgIGJlZ2luOiAweDA3YzAsCisgIGVuZDogMHgwN2ZmCit9LCB7CisgIGJlZ2luOiAweDA5MDAsCisgIGVuZDogMHgwOTdmCit9LCB7CisgIGJlZ2luOiAweDA5ODAsCisgIGVuZDogMHgwOWZmCit9LCB7CisgIGJlZ2luOiAweDBhMDAsCisgIGVuZDogMHgwYTdmCit9LCB7CisgIGJlZ2luOiAweDBhODAsCisgIGVuZDogMHgwYWZmCit9LCB7CisgIGJlZ2luOiAweDBiMDAsCisgIGVuZDogMHgwYjdmCit9LCB7CisgIGJlZ2luOiAweDBiODAsCisgIGVuZDogMHgwYmZmCit9LCB7CisgIGJlZ2luOiAweDBjMDAsCisgIGVuZDogMHgwYzdmCit9LCB7CisgIGJlZ2luOiAweDBjODAsCisgIGVuZDogMHgwY2ZmCit9LCB7CisgIGJlZ2luOiAweDBkMDAsCisgIGVuZDogMHgwZDdmCit9LCB7CisgIGJlZ2luOiAweDBlMDAsCisgIGVuZDogMHgwZTdmCit9LCB7CisgIGJlZ2luOiAweDBlODAsCisgIGVuZDogMHgwZWZmCit9LCB7CisgIGJlZ2luOiAweDEwYTAsCisgIGVuZDogMHgxMGZmCit9LCB7CisgIGJlZ2luOiAweDFiMDAsCisgIGVuZDogMHgxYjdmCit9LCB7CisgIGJlZ2luOiAweDExMDAsCisgIGVuZDogMHgxMWZmCit9LCB7CisgIGJlZ2luOiAweDFlMDAsCisgIGVuZDogMHgxZWZmCit9LCB7CisgIGJlZ2luOiAweDFmMDAsCisgIGVuZDogMHgxZmZmCit9LCB7CisgIGJlZ2luOiAweDIwMDAsCisgIGVuZDogMHgyMDZmCit9LCB7CisgIGJlZ2luOiAweDIwNzAsCisgIGVuZDogMHgyMDlmCit9LCB7CisgIGJlZ2luOiAweDIwYTAsCisgIGVuZDogMHgyMGNmCit9LCB7CisgIGJlZ2luOiAweDIwZDAsCisgIGVuZDogMHgyMGZmCit9LCB7CisgIGJlZ2luOiAweDIxMDAsCisgIGVuZDogMHgyMTRmCit9LCB7CisgIGJlZ2luOiAweDIxNTAsCisgIGVuZDogMHgyMThmCit9LCB7CisgIGJlZ2luOiAweDIxOTAsCisgIGVuZDogMHgyMWZmCit9LCB7CisgIGJlZ2luOiAweDIyMDAsCisgIGVuZDogMHgyMmZmCit9LCB7CisgIGJlZ2luOiAweDIzMDAsCisgIGVuZDogMHgyM2ZmCit9LCB7CisgIGJlZ2luOiAweDI0MDAsCisgIGVuZDogMHgyNDNmCit9LCB7CisgIGJlZ2luOiAweDI0NDAsCisgIGVuZDogMHgyNDVmCit9LCB7CisgIGJlZ2luOiAweDI0NjAsCisgIGVuZDogMHgyNGZmCit9LCB7CisgIGJlZ2luOiAweDI1MDAsCisgIGVuZDogMHgyNTdmCit9LCB7CisgIGJlZ2luOiAweDI1ODAsCisgIGVuZDogMHgyNTlmCit9LCB7CisgIGJlZ2luOiAweDI1YTAsCisgIGVuZDogMHgyNWZmCit9LCB7CisgIGJlZ2luOiAweDI2MDAsCisgIGVuZDogMHgyNmZmCit9LCB7CisgIGJlZ2luOiAweDI3MDAsCisgIGVuZDogMHgyN2JmCit9LCB7CisgIGJlZ2luOiAweDMwMDAsCisgIGVuZDogMHgzMDNmCit9LCB7CisgIGJlZ2luOiAweDMwNDAsCisgIGVuZDogMHgzMDlmCit9LCB7CisgIGJlZ2luOiAweDMwYTAsCisgIGVuZDogMHgzMGZmCit9LCB7CisgIGJlZ2luOiAweDMxMDAsCisgIGVuZDogMHgzMTJmCit9LCB7CisgIGJlZ2luOiAweDMxMzAsCisgIGVuZDogMHgzMThmCit9LCB7CisgIGJlZ2luOiAweGE4NDAsCisgIGVuZDogMHhhODdmCit9LCB7CisgIGJlZ2luOiAweDMyMDAsCisgIGVuZDogMHgzMmZmCit9LCB7CisgIGJlZ2luOiAweDMzMDAsCisgIGVuZDogMHgzM2ZmCit9LCB7CisgIGJlZ2luOiAweGFjMDAsCisgIGVuZDogMHhkN2FmCit9LCB7CisgIGJlZ2luOiAweGQ4MDAsCisgIGVuZDogMHhkZmZmCit9LCB7CisgIGJlZ2luOiAweDEwOTAwLAorICBlbmQ6IDB4MTA5MWYKK30sIHsKKyAgYmVnaW46IDB4NGUwMCwKKyAgZW5kOiAweDlmZmYKK30sIHsKKyAgYmVnaW46IDB4ZTAwMCwKKyAgZW5kOiAweGY4ZmYKK30sIHsKKyAgYmVnaW46IDB4MzFjMCwKKyAgZW5kOiAweDMxZWYKK30sIHsKKyAgYmVnaW46IDB4ZmIwMCwKKyAgZW5kOiAweGZiNGYKK30sIHsKKyAgYmVnaW46IDB4ZmI1MCwKKyAgZW5kOiAweGZkZmYKK30sIHsKKyAgYmVnaW46IDB4ZmUyMCwKKyAgZW5kOiAweGZlMmYKK30sIHsKKyAgYmVnaW46IDB4ZmUxMCwKKyAgZW5kOiAweGZlMWYKK30sIHsKKyAgYmVnaW46IDB4ZmU1MCwKKyAgZW5kOiAweGZlNmYKK30sIHsKKyAgYmVnaW46IDB4ZmU3MCwKKyAgZW5kOiAweGZlZmYKK30sIHsKKyAgYmVnaW46IDB4ZmYwMCwKKyAgZW5kOiAweGZmZWYKK30sIHsKKyAgYmVnaW46IDB4ZmZmMCwKKyAgZW5kOiAweGZmZmYKK30sIHsKKyAgYmVnaW46IDB4MGYwMCwKKyAgZW5kOiAweDBmZmYKK30sIHsKKyAgYmVnaW46IDB4MDcwMCwKKyAgZW5kOiAweDA3NGYKK30sIHsKKyAgYmVnaW46IDB4MDc4MCwKKyAgZW5kOiAweDA3YmYKK30sIHsKKyAgYmVnaW46IDB4MGQ4MCwKKyAgZW5kOiAweDBkZmYKK30sIHsKKyAgYmVnaW46IDB4MTAwMCwKKyAgZW5kOiAweDEwOWYKK30sIHsKKyAgYmVnaW46IDB4MTIwMCwKKyAgZW5kOiAweDEzN2YKK30sIHsKKyAgYmVnaW46IDB4MTNhMCwKKyAgZW5kOiAweDEzZmYKK30sIHsKKyAgYmVnaW46IDB4MTQwMCwKKyAgZW5kOiAweDE2N2YKK30sIHsKKyAgYmVnaW46IDB4MTY4MCwKKyAgZW5kOiAweDE2OWYKK30sIHsKKyAgYmVnaW46IDB4MTZhMCwKKyAgZW5kOiAweDE2ZmYKK30sIHsKKyAgYmVnaW46IDB4MTc4MCwKKyAgZW5kOiAweDE3ZmYKK30sIHsKKyAgYmVnaW46IDB4MTgwMCwKKyAgZW5kOiAweDE4YWYKK30sIHsKKyAgYmVnaW46IDB4MjgwMCwKKyAgZW5kOiAweDI4ZmYKK30sIHsKKyAgYmVnaW46IDB4YTAwMCwKKyAgZW5kOiAweGE0OGYKK30sIHsKKyAgYmVnaW46IDB4MTcwMCwKKyAgZW5kOiAweDE3MWYKK30sIHsKKyAgYmVnaW46IDB4MTAzMDAsCisgIGVuZDogMHgxMDMyZgorfSwgeworICBiZWdpbjogMHgxMDMzMCwKKyAgZW5kOiAweDEwMzRmCit9LCB7CisgIGJlZ2luOiAweDEwNDAwLAorICBlbmQ6IDB4MTA0NGYKK30sIHsKKyAgYmVnaW46IDB4MWQwMDAsCisgIGVuZDogMHgxZDBmZgorfSwgeworICBiZWdpbjogMHgxZDQwMCwKKyAgZW5kOiAweDFkN2ZmCit9LCB7CisgIGJlZ2luOiAweGZmMDAwLAorICBlbmQ6IDB4ZmZmZmQKK30sIHsKKyAgYmVnaW46IDB4ZmUwMCwKKyAgZW5kOiAweGZlMGYKK30sIHsKKyAgYmVnaW46IDB4ZTAwMDAsCisgIGVuZDogMHhlMDA3ZgorfSwgeworICBiZWdpbjogMHgxOTAwLAorICBlbmQ6IDB4MTk0ZgorfSwgeworICBiZWdpbjogMHgxOTUwLAorICBlbmQ6IDB4MTk3ZgorfSwgeworICBiZWdpbjogMHgxOTgwLAorICBlbmQ6IDB4MTlkZgorfSwgeworICBiZWdpbjogMHgxYTAwLAorICBlbmQ6IDB4MWExZgorfSwgeworICBiZWdpbjogMHgyYzAwLAorICBlbmQ6IDB4MmM1ZgorfSwgeworICBiZWdpbjogMHgyZDMwLAorICBlbmQ6IDB4MmQ3ZgorfSwgeworICBiZWdpbjogMHg0ZGMwLAorICBlbmQ6IDB4NGRmZgorfSwgeworICBiZWdpbjogMHhhODAwLAorICBlbmQ6IDB4YTgyZgorfSwgeworICBiZWdpbjogMHgxMDAwMCwKKyAgZW5kOiAweDEwMDdmCit9LCB7CisgIGJlZ2luOiAweDEwMTQwLAorICBlbmQ6IDB4MTAxOGYKK30sIHsKKyAgYmVnaW46IDB4MTAzODAsCisgIGVuZDogMHgxMDM5ZgorfSwgeworICBiZWdpbjogMHgxMDNhMCwKKyAgZW5kOiAweDEwM2RmCit9LCB7CisgIGJlZ2luOiAweDEwNDUwLAorICBlbmQ6IDB4MTA0N2YKK30sIHsKKyAgYmVnaW46IDB4MTA0ODAsCisgIGVuZDogMHgxMDRhZgorfSwgeworICBiZWdpbjogMHgxMDgwMCwKKyAgZW5kOiAweDEwODNmCit9LCB7CisgIGJlZ2luOiAweDEwYTAwLAorICBlbmQ6IDB4MTBhNWYKK30sIHsKKyAgYmVnaW46IDB4MWQzMDAsCisgIGVuZDogMHgxZDM1ZgorfSwgeworICBiZWdpbjogMHgxMjAwMCwKKyAgZW5kOiAweDEyM2ZmCit9LCB7CisgIGJlZ2luOiAweDFkMzYwLAorICBlbmQ6IDB4MWQzN2YKK30sIHsKKyAgYmVnaW46IDB4MWI4MCwKKyAgZW5kOiAweDFiYmYKK30sIHsKKyAgYmVnaW46IDB4MWMwMCwKKyAgZW5kOiAweDFjNGYKK30sIHsKKyAgYmVnaW46IDB4MWM1MCwKKyAgZW5kOiAweDFjN2YKK30sIHsKKyAgYmVnaW46IDB4YTg4MCwKKyAgZW5kOiAweGE4ZGYKK30sIHsKKyAgYmVnaW46IDB4YTkwMCwKKyAgZW5kOiAweGE5MmYKK30sIHsKKyAgYmVnaW46IDB4YTkzMCwKKyAgZW5kOiAweGE5NWYKK30sIHsKKyAgYmVnaW46IDB4YWEwMCwKKyAgZW5kOiAweGFhNWYKK30sIHsKKyAgYmVnaW46IDB4MTAxOTAsCisgIGVuZDogMHgxMDFjZgorfSwgeworICBiZWdpbjogMHgxMDFkMCwKKyAgZW5kOiAweDEwMWZmCit9LCB7CisgIGJlZ2luOiAweDEwMmEwLAorICBlbmQ6IDB4MTAyZGYKK30sIHsKKyAgYmVnaW46IDB4MWYwMzAsCisgIGVuZDogMHgxZjA5ZgorfV07CisKK2Z1bmN0aW9uIGdldFVuaWNvZGVSYW5nZUZvcih2YWx1ZSkgeworICBmb3IgKHZhciBpID0gMCwgaWkgPSBVbmljb2RlUmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICB2YXIgcmFuZ2UgPSBVbmljb2RlUmFuZ2VzW2ldOworCisgICAgaWYgKHZhbHVlID49IHJhbmdlLmJlZ2luICYmIHZhbHVlIDwgcmFuZ2UuZW5kKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKworICByZXR1cm4gLTE7Cit9CisKK2Z1bmN0aW9uIGlzUlRMUmFuZ2VGb3IodmFsdWUpIHsKKyAgdmFyIHJhbmdlID0gVW5pY29kZVJhbmdlc1sxM107CisKKyAgaWYgKHZhbHVlID49IHJhbmdlLmJlZ2luICYmIHZhbHVlIDwgcmFuZ2UuZW5kKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByYW5nZSA9IFVuaWNvZGVSYW5nZXNbMTFdOworCisgIGlmICh2YWx1ZSA+PSByYW5nZS5iZWdpbiAmJiB2YWx1ZSA8IHJhbmdlLmVuZCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2YXIgZ2V0Tm9ybWFsaXplZFVuaWNvZGVzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CisgIHRbIlx1MDBBOCJdID0gIlx1MDAyMFx1MDMwOCI7CisgIHRbIlx1MDBBRiJdID0gIlx1MDAyMFx1MDMwNCI7CisgIHRbIlx1MDBCNCJdID0gIlx1MDAyMFx1MDMwMSI7CisgIHRbIlx1MDBCNSJdID0gIlx1MDNCQyI7CisgIHRbIlx1MDBCOCJdID0gIlx1MDAyMFx1MDMyNyI7CisgIHRbIlx1MDEzMiJdID0gIlx1MDA0OVx1MDA0QSI7CisgIHRbIlx1MDEzMyJdID0gIlx1MDA2OVx1MDA2QSI7CisgIHRbIlx1MDEzRiJdID0gIlx1MDA0Q1x1MDBCNyI7CisgIHRbIlx1MDE0MCJdID0gIlx1MDA2Q1x1MDBCNyI7CisgIHRbIlx1MDE0OSJdID0gIlx1MDJCQ1x1MDA2RSI7CisgIHRbIlx1MDE3RiJdID0gIlx1MDA3MyI7CisgIHRbIlx1MDFDNCJdID0gIlx1MDA0NFx1MDE3RCI7CisgIHRbIlx1MDFDNSJdID0gIlx1MDA0NFx1MDE3RSI7CisgIHRbIlx1MDFDNiJdID0gIlx1MDA2NFx1MDE3RSI7CisgIHRbIlx1MDFDNyJdID0gIlx1MDA0Q1x1MDA0QSI7CisgIHRbIlx1MDFDOCJdID0gIlx1MDA0Q1x1MDA2QSI7CisgIHRbIlx1MDFDOSJdID0gIlx1MDA2Q1x1MDA2QSI7CisgIHRbIlx1MDFDQSJdID0gIlx1MDA0RVx1MDA0QSI7CisgIHRbIlx1MDFDQiJdID0gIlx1MDA0RVx1MDA2QSI7CisgIHRbIlx1MDFDQyJdID0gIlx1MDA2RVx1MDA2QSI7CisgIHRbIlx1MDFGMSJdID0gIlx1MDA0NFx1MDA1QSI7CisgIHRbIlx1MDFGMiJdID0gIlx1MDA0NFx1MDA3QSI7CisgIHRbIlx1MDFGMyJdID0gIlx1MDA2NFx1MDA3QSI7CisgIHRbIlx1MDJEOCJdID0gIlx1MDAyMFx1MDMwNiI7CisgIHRbIlx1MDJEOSJdID0gIlx1MDAyMFx1MDMwNyI7CisgIHRbIlx1MDJEQSJdID0gIlx1MDAyMFx1MDMwQSI7CisgIHRbIlx1MDJEQiJdID0gIlx1MDAyMFx1MDMyOCI7CisgIHRbIlx1MDJEQyJdID0gIlx1MDAyMFx1MDMwMyI7CisgIHRbIlx1MDJERCJdID0gIlx1MDAyMFx1MDMwQiI7CisgIHRbIlx1MDM3QSJdID0gIlx1MDAyMFx1MDM0NSI7CisgIHRbIlx1MDM4NCJdID0gIlx1MDAyMFx1MDMwMSI7CisgIHRbIlx1MDNEMCJdID0gIlx1MDNCMiI7CisgIHRbIlx1MDNEMSJdID0gIlx1MDNCOCI7CisgIHRbIlx1MDNEMiJdID0gIlx1MDNBNSI7CisgIHRbIlx1MDNENSJdID0gIlx1MDNDNiI7CisgIHRbIlx1MDNENiJdID0gIlx1MDNDMCI7CisgIHRbIlx1MDNGMCJdID0gIlx1MDNCQSI7CisgIHRbIlx1MDNGMSJdID0gIlx1MDNDMSI7CisgIHRbIlx1MDNGMiJdID0gIlx1MDNDMiI7CisgIHRbIlx1MDNGNCJdID0gIlx1MDM5OCI7CisgIHRbIlx1MDNGNSJdID0gIlx1MDNCNSI7CisgIHRbIlx1MDNGOSJdID0gIlx1MDNBMyI7CisgIHRbIlx1MDU4NyJdID0gIlx1MDU2NVx1MDU4MiI7CisgIHRbIlx1MDY3NSJdID0gIlx1MDYyN1x1MDY3NCI7CisgIHRbIlx1MDY3NiJdID0gIlx1MDY0OFx1MDY3NCI7CisgIHRbIlx1MDY3NyJdID0gIlx1MDZDN1x1MDY3NCI7CisgIHRbIlx1MDY3OCJdID0gIlx1MDY0QVx1MDY3NCI7CisgIHRbIlx1MEUzMyJdID0gIlx1MEU0RFx1MEUzMiI7CisgIHRbIlx1MEVCMyJdID0gIlx1MEVDRFx1MEVCMiI7CisgIHRbIlx1MEVEQyJdID0gIlx1MEVBQlx1MEU5OSI7CisgIHRbIlx1MEVERCJdID0gIlx1MEVBQlx1MEVBMSI7CisgIHRbIlx1MEY3NyJdID0gIlx1MEZCMlx1MEY4MSI7CisgIHRbIlx1MEY3OSJdID0gIlx1MEZCM1x1MEY4MSI7CisgIHRbIlx1MUU5QSJdID0gIlx1MDA2MVx1MDJCRSI7CisgIHRbIlx1MUZCRCJdID0gIlx1MDAyMFx1MDMxMyI7CisgIHRbIlx1MUZCRiJdID0gIlx1MDAyMFx1MDMxMyI7CisgIHRbIlx1MUZDMCJdID0gIlx1MDAyMFx1MDM0MiI7CisgIHRbIlx1MUZGRSJdID0gIlx1MDAyMFx1MDMxNCI7CisgIHRbIlx1MjAwMiJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjAwMyJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjAwNCJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjAwNSJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjAwNiJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjAwOCJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjAwOSJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjAwQSJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjAxNyJdID0gIlx1MDAyMFx1MDMzMyI7CisgIHRbIlx1MjAyNCJdID0gIlx1MDAyRSI7CisgIHRbIlx1MjAyNSJdID0gIlx1MDAyRVx1MDAyRSI7CisgIHRbIlx1MjAyNiJdID0gIlx1MDAyRVx1MDAyRVx1MDAyRSI7CisgIHRbIlx1MjAzMyJdID0gIlx1MjAzMlx1MjAzMiI7CisgIHRbIlx1MjAzNCJdID0gIlx1MjAzMlx1MjAzMlx1MjAzMiI7CisgIHRbIlx1MjAzNiJdID0gIlx1MjAzNVx1MjAzNSI7CisgIHRbIlx1MjAzNyJdID0gIlx1MjAzNVx1MjAzNVx1MjAzNSI7CisgIHRbIlx1MjAzQyJdID0gIlx1MDAyMVx1MDAyMSI7CisgIHRbIlx1MjAzRSJdID0gIlx1MDAyMFx1MDMwNSI7CisgIHRbIlx1MjA0NyJdID0gIlx1MDAzRlx1MDAzRiI7CisgIHRbIlx1MjA0OCJdID0gIlx1MDAzRlx1MDAyMSI7CisgIHRbIlx1MjA0OSJdID0gIlx1MDAyMVx1MDAzRiI7CisgIHRbIlx1MjA1NyJdID0gIlx1MjAzMlx1MjAzMlx1MjAzMlx1MjAzMiI7CisgIHRbIlx1MjA1RiJdID0gIlx1MDAyMCI7CisgIHRbIlx1MjBBOCJdID0gIlx1MDA1Mlx1MDA3MyI7CisgIHRbIlx1MjEwMCJdID0gIlx1MDA2MVx1MDAyRlx1MDA2MyI7CisgIHRbIlx1MjEwMSJdID0gIlx1MDA2MVx1MDAyRlx1MDA3MyI7CisgIHRbIlx1MjEwMyJdID0gIlx1MDBCMFx1MDA0MyI7CisgIHRbIlx1MjEwNSJdID0gIlx1MDA2M1x1MDAyRlx1MDA2RiI7CisgIHRbIlx1MjEwNiJdID0gIlx1MDA2M1x1MDAyRlx1MDA3NSI7CisgIHRbIlx1MjEwNyJdID0gIlx1MDE5MCI7CisgIHRbIlx1MjEwOSJdID0gIlx1MDBCMFx1MDA0NiI7CisgIHRbIlx1MjExNiJdID0gIlx1MDA0RVx1MDA2RiI7CisgIHRbIlx1MjEyMSJdID0gIlx1MDA1NFx1MDA0NVx1MDA0QyI7CisgIHRbIlx1MjEzNSJdID0gIlx1MDVEMCI7CisgIHRbIlx1MjEzNiJdID0gIlx1MDVEMSI7CisgIHRbIlx1MjEzNyJdID0gIlx1MDVEMiI7CisgIHRbIlx1MjEzOCJdID0gIlx1MDVEMyI7CisgIHRbIlx1MjEzQiJdID0gIlx1MDA0Nlx1MDA0MVx1MDA1OCI7CisgIHRbIlx1MjE2MCJdID0gIlx1MDA0OSI7CisgIHRbIlx1MjE2MSJdID0gIlx1MDA0OVx1MDA0OSI7CisgIHRbIlx1MjE2MiJdID0gIlx1MDA0OVx1MDA0OVx1MDA0OSI7CisgIHRbIlx1MjE2MyJdID0gIlx1MDA0OVx1MDA1NiI7CisgIHRbIlx1MjE2NCJdID0gIlx1MDA1NiI7CisgIHRbIlx1MjE2NSJdID0gIlx1MDA1Nlx1MDA0OSI7CisgIHRbIlx1MjE2NiJdID0gIlx1MDA1Nlx1MDA0OVx1MDA0OSI7CisgIHRbIlx1MjE2NyJdID0gIlx1MDA1Nlx1MDA0OVx1MDA0OVx1MDA0OSI7CisgIHRbIlx1MjE2OCJdID0gIlx1MDA0OVx1MDA1OCI7CisgIHRbIlx1MjE2OSJdID0gIlx1MDA1OCI7CisgIHRbIlx1MjE2QSJdID0gIlx1MDA1OFx1MDA0OSI7CisgIHRbIlx1MjE2QiJdID0gIlx1MDA1OFx1MDA0OVx1MDA0OSI7CisgIHRbIlx1MjE2QyJdID0gIlx1MDA0QyI7CisgIHRbIlx1MjE2RCJdID0gIlx1MDA0MyI7CisgIHRbIlx1MjE2RSJdID0gIlx1MDA0NCI7CisgIHRbIlx1MjE2RiJdID0gIlx1MDA0RCI7CisgIHRbIlx1MjE3MCJdID0gIlx1MDA2OSI7CisgIHRbIlx1MjE3MSJdID0gIlx1MDA2OVx1MDA2OSI7CisgIHRbIlx1MjE3MiJdID0gIlx1MDA2OVx1MDA2OVx1MDA2OSI7CisgIHRbIlx1MjE3MyJdID0gIlx1MDA2OVx1MDA3NiI7CisgIHRbIlx1MjE3NCJdID0gIlx1MDA3NiI7CisgIHRbIlx1MjE3NSJdID0gIlx1MDA3Nlx1MDA2OSI7CisgIHRbIlx1MjE3NiJdID0gIlx1MDA3Nlx1MDA2OVx1MDA2OSI7CisgIHRbIlx1MjE3NyJdID0gIlx1MDA3Nlx1MDA2OVx1MDA2OVx1MDA2OSI7CisgIHRbIlx1MjE3OCJdID0gIlx1MDA2OVx1MDA3OCI7CisgIHRbIlx1MjE3OSJdID0gIlx1MDA3OCI7CisgIHRbIlx1MjE3QSJdID0gIlx1MDA3OFx1MDA2OSI7CisgIHRbIlx1MjE3QiJdID0gIlx1MDA3OFx1MDA2OVx1MDA2OSI7CisgIHRbIlx1MjE3QyJdID0gIlx1MDA2QyI7CisgIHRbIlx1MjE3RCJdID0gIlx1MDA2MyI7CisgIHRbIlx1MjE3RSJdID0gIlx1MDA2NCI7CisgIHRbIlx1MjE3RiJdID0gIlx1MDA2RCI7CisgIHRbIlx1MjIyQyJdID0gIlx1MjIyQlx1MjIyQiI7CisgIHRbIlx1MjIyRCJdID0gIlx1MjIyQlx1MjIyQlx1MjIyQiI7CisgIHRbIlx1MjIyRiJdID0gIlx1MjIyRVx1MjIyRSI7CisgIHRbIlx1MjIzMCJdID0gIlx1MjIyRVx1MjIyRVx1MjIyRSI7CisgIHRbIlx1MjQ3NCJdID0gIlx1MDAyOFx1MDAzMVx1MDAyOSI7CisgIHRbIlx1MjQ3NSJdID0gIlx1MDAyOFx1MDAzMlx1MDAyOSI7CisgIHRbIlx1MjQ3NiJdID0gIlx1MDAyOFx1MDAzM1x1MDAyOSI7CisgIHRbIlx1MjQ3NyJdID0gIlx1MDAyOFx1MDAzNFx1MDAyOSI7CisgIHRbIlx1MjQ3OCJdID0gIlx1MDAyOFx1MDAzNVx1MDAyOSI7CisgIHRbIlx1MjQ3OSJdID0gIlx1MDAyOFx1MDAzNlx1MDAyOSI7CisgIHRbIlx1MjQ3QSJdID0gIlx1MDAyOFx1MDAzN1x1MDAyOSI7CisgIHRbIlx1MjQ3QiJdID0gIlx1MDAyOFx1MDAzOFx1MDAyOSI7CisgIHRbIlx1MjQ3QyJdID0gIlx1MDAyOFx1MDAzOVx1MDAyOSI7CisgIHRbIlx1MjQ3RCJdID0gIlx1MDAyOFx1MDAzMVx1MDAzMFx1MDAyOSI7CisgIHRbIlx1MjQ3RSJdID0gIlx1MDAyOFx1MDAzMVx1MDAzMVx1MDAyOSI7CisgIHRbIlx1MjQ3RiJdID0gIlx1MDAyOFx1MDAzMVx1MDAzMlx1MDAyOSI7CisgIHRbIlx1MjQ4MCJdID0gIlx1MDAyOFx1MDAzMVx1MDAzM1x1MDAyOSI7CisgIHRbIlx1MjQ4MSJdID0gIlx1MDAyOFx1MDAzMVx1MDAzNFx1MDAyOSI7CisgIHRbIlx1MjQ4MiJdID0gIlx1MDAyOFx1MDAzMVx1MDAzNVx1MDAyOSI7CisgIHRbIlx1MjQ4MyJdID0gIlx1MDAyOFx1MDAzMVx1MDAzNlx1MDAyOSI7CisgIHRbIlx1MjQ4NCJdID0gIlx1MDAyOFx1MDAzMVx1MDAzN1x1MDAyOSI7CisgIHRbIlx1MjQ4NSJdID0gIlx1MDAyOFx1MDAzMVx1MDAzOFx1MDAyOSI7CisgIHRbIlx1MjQ4NiJdID0gIlx1MDAyOFx1MDAzMVx1MDAzOVx1MDAyOSI7CisgIHRbIlx1MjQ4NyJdID0gIlx1MDAyOFx1MDAzMlx1MDAzMFx1MDAyOSI7CisgIHRbIlx1MjQ4OCJdID0gIlx1MDAzMVx1MDAyRSI7CisgIHRbIlx1MjQ4OSJdID0gIlx1MDAzMlx1MDAyRSI7CisgIHRbIlx1MjQ4QSJdID0gIlx1MDAzM1x1MDAyRSI7CisgIHRbIlx1MjQ4QiJdID0gIlx1MDAzNFx1MDAyRSI7CisgIHRbIlx1MjQ4QyJdID0gIlx1MDAzNVx1MDAyRSI7CisgIHRbIlx1MjQ4RCJdID0gIlx1MDAzNlx1MDAyRSI7CisgIHRbIlx1MjQ4RSJdID0gIlx1MDAzN1x1MDAyRSI7CisgIHRbIlx1MjQ4RiJdID0gIlx1MDAzOFx1MDAyRSI7CisgIHRbIlx1MjQ5MCJdID0gIlx1MDAzOVx1MDAyRSI7CisgIHRbIlx1MjQ5MSJdID0gIlx1MDAzMVx1MDAzMFx1MDAyRSI7CisgIHRbIlx1MjQ5MiJdID0gIlx1MDAzMVx1MDAzMVx1MDAyRSI7CisgIHRbIlx1MjQ5MyJdID0gIlx1MDAzMVx1MDAzMlx1MDAyRSI7CisgIHRbIlx1MjQ5NCJdID0gIlx1MDAzMVx1MDAzM1x1MDAyRSI7CisgIHRbIlx1MjQ5NSJdID0gIlx1MDAzMVx1MDAzNFx1MDAyRSI7CisgIHRbIlx1MjQ5NiJdID0gIlx1MDAzMVx1MDAzNVx1MDAyRSI7CisgIHRbIlx1MjQ5NyJdID0gIlx1MDAzMVx1MDAzNlx1MDAyRSI7CisgIHRbIlx1MjQ5OCJdID0gIlx1MDAzMVx1MDAzN1x1MDAyRSI7CisgIHRbIlx1MjQ5OSJdID0gIlx1MDAzMVx1MDAzOFx1MDAyRSI7CisgIHRbIlx1MjQ5QSJdID0gIlx1MDAzMVx1MDAzOVx1MDAyRSI7CisgIHRbIlx1MjQ5QiJdID0gIlx1MDAzMlx1MDAzMFx1MDAyRSI7CisgIHRbIlx1MjQ5QyJdID0gIlx1MDAyOFx1MDA2MVx1MDAyOSI7CisgIHRbIlx1MjQ5RCJdID0gIlx1MDAyOFx1MDA2Mlx1MDAyOSI7CisgIHRbIlx1MjQ5RSJdID0gIlx1MDAyOFx1MDA2M1x1MDAyOSI7CisgIHRbIlx1MjQ5RiJdID0gIlx1MDAyOFx1MDA2NFx1MDAyOSI7CisgIHRbIlx1MjRBMCJdID0gIlx1MDAyOFx1MDA2NVx1MDAyOSI7CisgIHRbIlx1MjRBMSJdID0gIlx1MDAyOFx1MDA2Nlx1MDAyOSI7CisgIHRbIlx1MjRBMiJdID0gIlx1MDAyOFx1MDA2N1x1MDAyOSI7CisgIHRbIlx1MjRBMyJdID0gIlx1MDAyOFx1MDA2OFx1MDAyOSI7CisgIHRbIlx1MjRBNCJdID0gIlx1MDAyOFx1MDA2OVx1MDAyOSI7CisgIHRbIlx1MjRBNSJdID0gIlx1MDAyOFx1MDA2QVx1MDAyOSI7CisgIHRbIlx1MjRBNiJdID0gIlx1MDAyOFx1MDA2Qlx1MDAyOSI7CisgIHRbIlx1MjRBNyJdID0gIlx1MDAyOFx1MDA2Q1x1MDAyOSI7CisgIHRbIlx1MjRBOCJdID0gIlx1MDAyOFx1MDA2RFx1MDAyOSI7CisgIHRbIlx1MjRBOSJdID0gIlx1MDAyOFx1MDA2RVx1MDAyOSI7CisgIHRbIlx1MjRBQSJdID0gIlx1MDAyOFx1MDA2Rlx1MDAyOSI7CisgIHRbIlx1MjRBQiJdID0gIlx1MDAyOFx1MDA3MFx1MDAyOSI7CisgIHRbIlx1MjRBQyJdID0gIlx1MDAyOFx1MDA3MVx1MDAyOSI7CisgIHRbIlx1MjRBRCJdID0gIlx1MDAyOFx1MDA3Mlx1MDAyOSI7CisgIHRbIlx1MjRBRSJdID0gIlx1MDAyOFx1MDA3M1x1MDAyOSI7CisgIHRbIlx1MjRBRiJdID0gIlx1MDAyOFx1MDA3NFx1MDAyOSI7CisgIHRbIlx1MjRCMCJdID0gIlx1MDAyOFx1MDA3NVx1MDAyOSI7CisgIHRbIlx1MjRCMSJdID0gIlx1MDAyOFx1MDA3Nlx1MDAyOSI7CisgIHRbIlx1MjRCMiJdID0gIlx1MDAyOFx1MDA3N1x1MDAyOSI7CisgIHRbIlx1MjRCMyJdID0gIlx1MDAyOFx1MDA3OFx1MDAyOSI7CisgIHRbIlx1MjRCNCJdID0gIlx1MDAyOFx1MDA3OVx1MDAyOSI7CisgIHRbIlx1MjRCNSJdID0gIlx1MDAyOFx1MDA3QVx1MDAyOSI7CisgIHRbIlx1MkEwQyJdID0gIlx1MjIyQlx1MjIyQlx1MjIyQlx1MjIyQiI7CisgIHRbIlx1MkE3NCJdID0gIlx1MDAzQVx1MDAzQVx1MDAzRCI7CisgIHRbIlx1MkE3NSJdID0gIlx1MDAzRFx1MDAzRCI7CisgIHRbIlx1MkE3NiJdID0gIlx1MDAzRFx1MDAzRFx1MDAzRCI7CisgIHRbIlx1MkU5RiJdID0gIlx1NkJDRCI7CisgIHRbIlx1MkVGMyJdID0gIlx1OUY5RiI7CisgIHRbIlx1MkYwMCJdID0gIlx1NEUwMCI7CisgIHRbIlx1MkYwMSJdID0gIlx1NEUyOCI7CisgIHRbIlx1MkYwMiJdID0gIlx1NEUzNiI7CisgIHRbIlx1MkYwMyJdID0gIlx1NEUzRiI7CisgIHRbIlx1MkYwNCJdID0gIlx1NEU1OSI7CisgIHRbIlx1MkYwNSJdID0gIlx1NEU4NSI7CisgIHRbIlx1MkYwNiJdID0gIlx1NEU4QyI7CisgIHRbIlx1MkYwNyJdID0gIlx1NEVBMCI7CisgIHRbIlx1MkYwOCJdID0gIlx1NEVCQSI7CisgIHRbIlx1MkYwOSJdID0gIlx1NTEzRiI7CisgIHRbIlx1MkYwQSJdID0gIlx1NTE2NSI7CisgIHRbIlx1MkYwQiJdID0gIlx1NTE2QiI7CisgIHRbIlx1MkYwQyJdID0gIlx1NTE4MiI7CisgIHRbIlx1MkYwRCJdID0gIlx1NTE5NiI7CisgIHRbIlx1MkYwRSJdID0gIlx1NTFBQiI7CisgIHRbIlx1MkYwRiJdID0gIlx1NTFFMCI7CisgIHRbIlx1MkYxMCJdID0gIlx1NTFGNSI7CisgIHRbIlx1MkYxMSJdID0gIlx1NTIwMCI7CisgIHRbIlx1MkYxMiJdID0gIlx1NTI5QiI7CisgIHRbIlx1MkYxMyJdID0gIlx1NTJGOSI7CisgIHRbIlx1MkYxNCJdID0gIlx1NTMxNSI7CisgIHRbIlx1MkYxNSJdID0gIlx1NTMxQSI7CisgIHRbIlx1MkYxNiJdID0gIlx1NTMzOCI7CisgIHRbIlx1MkYxNyJdID0gIlx1NTM0MSI7CisgIHRbIlx1MkYxOCJdID0gIlx1NTM1QyI7CisgIHRbIlx1MkYxOSJdID0gIlx1NTM2OSI7CisgIHRbIlx1MkYxQSJdID0gIlx1NTM4MiI7CisgIHRbIlx1MkYxQiJdID0gIlx1NTNCNiI7CisgIHRbIlx1MkYxQyJdID0gIlx1NTNDOCI7CisgIHRbIlx1MkYxRCJdID0gIlx1NTNFMyI7CisgIHRbIlx1MkYxRSJdID0gIlx1NTZENyI7CisgIHRbIlx1MkYxRiJdID0gIlx1NTcxRiI7CisgIHRbIlx1MkYyMCJdID0gIlx1NThFQiI7CisgIHRbIlx1MkYyMSJdID0gIlx1NTkwMiI7CisgIHRbIlx1MkYyMiJdID0gIlx1NTkwQSI7CisgIHRbIlx1MkYyMyJdID0gIlx1NTkxNSI7CisgIHRbIlx1MkYyNCJdID0gIlx1NTkyNyI7CisgIHRbIlx1MkYyNSJdID0gIlx1NTk3MyI7CisgIHRbIlx1MkYyNiJdID0gIlx1NUI1MCI7CisgIHRbIlx1MkYyNyJdID0gIlx1NUI4MCI7CisgIHRbIlx1MkYyOCJdID0gIlx1NUJGOCI7CisgIHRbIlx1MkYyOSJdID0gIlx1NUMwRiI7CisgIHRbIlx1MkYyQSJdID0gIlx1NUMyMiI7CisgIHRbIlx1MkYyQiJdID0gIlx1NUMzOCI7CisgIHRbIlx1MkYyQyJdID0gIlx1NUM2RSI7CisgIHRbIlx1MkYyRCJdID0gIlx1NUM3MSI7CisgIHRbIlx1MkYyRSJdID0gIlx1NUREQiI7CisgIHRbIlx1MkYyRiJdID0gIlx1NURFNSI7CisgIHRbIlx1MkYzMCJdID0gIlx1NURGMSI7CisgIHRbIlx1MkYzMSJdID0gIlx1NURGRSI7CisgIHRbIlx1MkYzMiJdID0gIlx1NUU3MiI7CisgIHRbIlx1MkYzMyJdID0gIlx1NUU3QSI7CisgIHRbIlx1MkYzNCJdID0gIlx1NUU3RiI7CisgIHRbIlx1MkYzNSJdID0gIlx1NUVGNCI7CisgIHRbIlx1MkYzNiJdID0gIlx1NUVGRSI7CisgIHRbIlx1MkYzNyJdID0gIlx1NUYwQiI7CisgIHRbIlx1MkYzOCJdID0gIlx1NUYxMyI7CisgIHRbIlx1MkYzOSJdID0gIlx1NUY1MCI7CisgIHRbIlx1MkYzQSJdID0gIlx1NUY2MSI7CisgIHRbIlx1MkYzQiJdID0gIlx1NUY3MyI7CisgIHRbIlx1MkYzQyJdID0gIlx1NUZDMyI7CisgIHRbIlx1MkYzRCJdID0gIlx1NjIwOCI7CisgIHRbIlx1MkYzRSJdID0gIlx1NjIzNiI7CisgIHRbIlx1MkYzRiJdID0gIlx1NjI0QiI7CisgIHRbIlx1MkY0MCJdID0gIlx1NjUyRiI7CisgIHRbIlx1MkY0MSJdID0gIlx1NjUzNCI7CisgIHRbIlx1MkY0MiJdID0gIlx1NjU4NyI7CisgIHRbIlx1MkY0MyJdID0gIlx1NjU5NyI7CisgIHRbIlx1MkY0NCJdID0gIlx1NjVBNCI7CisgIHRbIlx1MkY0NSJdID0gIlx1NjVCOSI7CisgIHRbIlx1MkY0NiJdID0gIlx1NjVFMCI7CisgIHRbIlx1MkY0NyJdID0gIlx1NjVFNSI7CisgIHRbIlx1MkY0OCJdID0gIlx1NjZGMCI7CisgIHRbIlx1MkY0OSJdID0gIlx1NjcwOCI7CisgIHRbIlx1MkY0QSJdID0gIlx1NjcyOCI7CisgIHRbIlx1MkY0QiJdID0gIlx1NkIyMCI7CisgIHRbIlx1MkY0QyJdID0gIlx1NkI2MiI7CisgIHRbIlx1MkY0RCJdID0gIlx1NkI3OSI7CisgIHRbIlx1MkY0RSJdID0gIlx1NkJCMyI7CisgIHRbIlx1MkY0RiJdID0gIlx1NkJDQiI7CisgIHRbIlx1MkY1MCJdID0gIlx1NkJENCI7CisgIHRbIlx1MkY1MSJdID0gIlx1NkJEQiI7CisgIHRbIlx1MkY1MiJdID0gIlx1NkMwRiI7CisgIHRbIlx1MkY1MyJdID0gIlx1NkMxNCI7CisgIHRbIlx1MkY1NCJdID0gIlx1NkMzNCI7CisgIHRbIlx1MkY1NSJdID0gIlx1NzA2QiI7CisgIHRbIlx1MkY1NiJdID0gIlx1NzIyQSI7CisgIHRbIlx1MkY1NyJdID0gIlx1NzIzNiI7CisgIHRbIlx1MkY1OCJdID0gIlx1NzIzQiI7CisgIHRbIlx1MkY1OSJdID0gIlx1NzIzRiI7CisgIHRbIlx1MkY1QSJdID0gIlx1NzI0NyI7CisgIHRbIlx1MkY1QiJdID0gIlx1NzI1OSI7CisgIHRbIlx1MkY1QyJdID0gIlx1NzI1QiI7CisgIHRbIlx1MkY1RCJdID0gIlx1NzJBQyI7CisgIHRbIlx1MkY1RSJdID0gIlx1NzM4NCI7CisgIHRbIlx1MkY1RiJdID0gIlx1NzM4OSI7CisgIHRbIlx1MkY2MCJdID0gIlx1NzREQyI7CisgIHRbIlx1MkY2MSJdID0gIlx1NzRFNiI7CisgIHRbIlx1MkY2MiJdID0gIlx1NzUxOCI7CisgIHRbIlx1MkY2MyJdID0gIlx1NzUxRiI7CisgIHRbIlx1MkY2NCJdID0gIlx1NzUyOCI7CisgIHRbIlx1MkY2NSJdID0gIlx1NzUzMCI7CisgIHRbIlx1MkY2NiJdID0gIlx1NzU4QiI7CisgIHRbIlx1MkY2NyJdID0gIlx1NzU5MiI7CisgIHRbIlx1MkY2OCJdID0gIlx1NzY3NiI7CisgIHRbIlx1MkY2OSJdID0gIlx1NzY3RCI7CisgIHRbIlx1MkY2QSJdID0gIlx1NzZBRSI7CisgIHRbIlx1MkY2QiJdID0gIlx1NzZCRiI7CisgIHRbIlx1MkY2QyJdID0gIlx1NzZFRSI7CisgIHRbIlx1MkY2RCJdID0gIlx1NzdEQiI7CisgIHRbIlx1MkY2RSJdID0gIlx1NzdFMiI7CisgIHRbIlx1MkY2RiJdID0gIlx1NzdGMyI7CisgIHRbIlx1MkY3MCJdID0gIlx1NzkzQSI7CisgIHRbIlx1MkY3MSJdID0gIlx1NzlCOCI7CisgIHRbIlx1MkY3MiJdID0gIlx1NzlCRSI7CisgIHRbIlx1MkY3MyJdID0gIlx1N0E3NCI7CisgIHRbIlx1MkY3NCJdID0gIlx1N0FDQiI7CisgIHRbIlx1MkY3NSJdID0gIlx1N0FGOSI7CisgIHRbIlx1MkY3NiJdID0gIlx1N0M3MyI7CisgIHRbIlx1MkY3NyJdID0gIlx1N0NGOCI7CisgIHRbIlx1MkY3OCJdID0gIlx1N0YzNiI7CisgIHRbIlx1MkY3OSJdID0gIlx1N0Y1MSI7CisgIHRbIlx1MkY3QSJdID0gIlx1N0Y4QSI7CisgIHRbIlx1MkY3QiJdID0gIlx1N0ZCRCI7CisgIHRbIlx1MkY3QyJdID0gIlx1ODAwMSI7CisgIHRbIlx1MkY3RCJdID0gIlx1ODAwQyI7CisgIHRbIlx1MkY3RSJdID0gIlx1ODAxMiI7CisgIHRbIlx1MkY3RiJdID0gIlx1ODAzMyI7CisgIHRbIlx1MkY4MCJdID0gIlx1ODA3RiI7CisgIHRbIlx1MkY4MSJdID0gIlx1ODA4OSI7CisgIHRbIlx1MkY4MiJdID0gIlx1ODFFMyI7CisgIHRbIlx1MkY4MyJdID0gIlx1ODFFQSI7CisgIHRbIlx1MkY4NCJdID0gIlx1ODFGMyI7CisgIHRbIlx1MkY4NSJdID0gIlx1ODFGQyI7CisgIHRbIlx1MkY4NiJdID0gIlx1ODIwQyI7CisgIHRbIlx1MkY4NyJdID0gIlx1ODIxQiI7CisgIHRbIlx1MkY4OCJdID0gIlx1ODIxRiI7CisgIHRbIlx1MkY4OSJdID0gIlx1ODI2RSI7CisgIHRbIlx1MkY4QSJdID0gIlx1ODI3MiI7CisgIHRbIlx1MkY4QiJdID0gIlx1ODI3OCI7CisgIHRbIlx1MkY4QyJdID0gIlx1ODY0RCI7CisgIHRbIlx1MkY4RCJdID0gIlx1ODY2QiI7CisgIHRbIlx1MkY4RSJdID0gIlx1ODg0MCI7CisgIHRbIlx1MkY4RiJdID0gIlx1ODg0QyI7CisgIHRbIlx1MkY5MCJdID0gIlx1ODg2MyI7CisgIHRbIlx1MkY5MSJdID0gIlx1ODk3RSI7CisgIHRbIlx1MkY5MiJdID0gIlx1ODk4QiI7CisgIHRbIlx1MkY5MyJdID0gIlx1ODlEMiI7CisgIHRbIlx1MkY5NCJdID0gIlx1OEEwMCI7CisgIHRbIlx1MkY5NSJdID0gIlx1OEMzNyI7CisgIHRbIlx1MkY5NiJdID0gIlx1OEM0NiI7CisgIHRbIlx1MkY5NyJdID0gIlx1OEM1NSI7CisgIHRbIlx1MkY5OCJdID0gIlx1OEM3OCI7CisgIHRbIlx1MkY5OSJdID0gIlx1OEM5RCI7CisgIHRbIlx1MkY5QSJdID0gIlx1OEQ2NCI7CisgIHRbIlx1MkY5QiJdID0gIlx1OEQ3MCI7CisgIHRbIlx1MkY5QyJdID0gIlx1OERCMyI7CisgIHRbIlx1MkY5RCJdID0gIlx1OEVBQiI7CisgIHRbIlx1MkY5RSJdID0gIlx1OEVDQSI7CisgIHRbIlx1MkY5RiJdID0gIlx1OEY5QiI7CisgIHRbIlx1MkZBMCJdID0gIlx1OEZCMCI7CisgIHRbIlx1MkZBMSJdID0gIlx1OEZCNSI7CisgIHRbIlx1MkZBMiJdID0gIlx1OTA5MSI7CisgIHRbIlx1MkZBMyJdID0gIlx1OTE0OSI7CisgIHRbIlx1MkZBNCJdID0gIlx1OTFDNiI7CisgIHRbIlx1MkZBNSJdID0gIlx1OTFDQyI7CisgIHRbIlx1MkZBNiJdID0gIlx1OTFEMSI7CisgIHRbIlx1MkZBNyJdID0gIlx1OTU3NyI7CisgIHRbIlx1MkZBOCJdID0gIlx1OTU4MCI7CisgIHRbIlx1MkZBOSJdID0gIlx1OTYxQyI7CisgIHRbIlx1MkZBQSJdID0gIlx1OTZCNiI7CisgIHRbIlx1MkZBQiJdID0gIlx1OTZCOSI7CisgIHRbIlx1MkZBQyJdID0gIlx1OTZFOCI7CisgIHRbIlx1MkZBRCJdID0gIlx1OTc1MSI7CisgIHRbIlx1MkZBRSJdID0gIlx1OTc1RSI7CisgIHRbIlx1MkZBRiJdID0gIlx1OTc2MiI7CisgIHRbIlx1MkZCMCJdID0gIlx1OTc2OSI7CisgIHRbIlx1MkZCMSJdID0gIlx1OTdDQiI7CisgIHRbIlx1MkZCMiJdID0gIlx1OTdFRCI7CisgIHRbIlx1MkZCMyJdID0gIlx1OTdGMyI7CisgIHRbIlx1MkZCNCJdID0gIlx1OTgwMSI7CisgIHRbIlx1MkZCNSJdID0gIlx1OThBOCI7CisgIHRbIlx1MkZCNiJdID0gIlx1OThEQiI7CisgIHRbIlx1MkZCNyJdID0gIlx1OThERiI7CisgIHRbIlx1MkZCOCJdID0gIlx1OTk5NiI7CisgIHRbIlx1MkZCOSJdID0gIlx1OTk5OSI7CisgIHRbIlx1MkZCQSJdID0gIlx1OTlBQyI7CisgIHRbIlx1MkZCQiJdID0gIlx1OUFBOCI7CisgIHRbIlx1MkZCQyJdID0gIlx1OUFEOCI7CisgIHRbIlx1MkZCRCJdID0gIlx1OUFERiI7CisgIHRbIlx1MkZCRSJdID0gIlx1OUIyNSI7CisgIHRbIlx1MkZCRiJdID0gIlx1OUIyRiI7CisgIHRbIlx1MkZDMCJdID0gIlx1OUIzMiI7CisgIHRbIlx1MkZDMSJdID0gIlx1OUIzQyI7CisgIHRbIlx1MkZDMiJdID0gIlx1OUI1QSI7CisgIHRbIlx1MkZDMyJdID0gIlx1OUNFNSI7CisgIHRbIlx1MkZDNCJdID0gIlx1OUU3NSI7CisgIHRbIlx1MkZDNSJdID0gIlx1OUU3RiI7CisgIHRbIlx1MkZDNiJdID0gIlx1OUVBNSI7CisgIHRbIlx1MkZDNyJdID0gIlx1OUVCQiI7CisgIHRbIlx1MkZDOCJdID0gIlx1OUVDMyI7CisgIHRbIlx1MkZDOSJdID0gIlx1OUVDRCI7CisgIHRbIlx1MkZDQSJdID0gIlx1OUVEMSI7CisgIHRbIlx1MkZDQiJdID0gIlx1OUVGOSI7CisgIHRbIlx1MkZDQyJdID0gIlx1OUVGRCI7CisgIHRbIlx1MkZDRCJdID0gIlx1OUYwRSI7CisgIHRbIlx1MkZDRSJdID0gIlx1OUYxMyI7CisgIHRbIlx1MkZDRiJdID0gIlx1OUYyMCI7CisgIHRbIlx1MkZEMCJdID0gIlx1OUYzQiI7CisgIHRbIlx1MkZEMSJdID0gIlx1OUY0QSI7CisgIHRbIlx1MkZEMiJdID0gIlx1OUY1MiI7CisgIHRbIlx1MkZEMyJdID0gIlx1OUY4RCI7CisgIHRbIlx1MkZENCJdID0gIlx1OUY5QyI7CisgIHRbIlx1MkZENSJdID0gIlx1OUZBMCI7CisgIHRbIlx1MzAzNiJdID0gIlx1MzAxMiI7CisgIHRbIlx1MzAzOCJdID0gIlx1NTM0MSI7CisgIHRbIlx1MzAzOSJdID0gIlx1NTM0NCI7CisgIHRbIlx1MzAzQSJdID0gIlx1NTM0NSI7CisgIHRbIlx1MzA5QiJdID0gIlx1MDAyMFx1MzA5OSI7CisgIHRbIlx1MzA5QyJdID0gIlx1MDAyMFx1MzA5QSI7CisgIHRbIlx1MzEzMSJdID0gIlx1MTEwMCI7CisgIHRbIlx1MzEzMiJdID0gIlx1MTEwMSI7CisgIHRbIlx1MzEzMyJdID0gIlx1MTFBQSI7CisgIHRbIlx1MzEzNCJdID0gIlx1MTEwMiI7CisgIHRbIlx1MzEzNSJdID0gIlx1MTFBQyI7CisgIHRbIlx1MzEzNiJdID0gIlx1MTFBRCI7CisgIHRbIlx1MzEzNyJdID0gIlx1MTEwMyI7CisgIHRbIlx1MzEzOCJdID0gIlx1MTEwNCI7CisgIHRbIlx1MzEzOSJdID0gIlx1MTEwNSI7CisgIHRbIlx1MzEzQSJdID0gIlx1MTFCMCI7CisgIHRbIlx1MzEzQiJdID0gIlx1MTFCMSI7CisgIHRbIlx1MzEzQyJdID0gIlx1MTFCMiI7CisgIHRbIlx1MzEzRCJdID0gIlx1MTFCMyI7CisgIHRbIlx1MzEzRSJdID0gIlx1MTFCNCI7CisgIHRbIlx1MzEzRiJdID0gIlx1MTFCNSI7CisgIHRbIlx1MzE0MCJdID0gIlx1MTExQSI7CisgIHRbIlx1MzE0MSJdID0gIlx1MTEwNiI7CisgIHRbIlx1MzE0MiJdID0gIlx1MTEwNyI7CisgIHRbIlx1MzE0MyJdID0gIlx1MTEwOCI7CisgIHRbIlx1MzE0NCJdID0gIlx1MTEyMSI7CisgIHRbIlx1MzE0NSJdID0gIlx1MTEwOSI7CisgIHRbIlx1MzE0NiJdID0gIlx1MTEwQSI7CisgIHRbIlx1MzE0NyJdID0gIlx1MTEwQiI7CisgIHRbIlx1MzE0OCJdID0gIlx1MTEwQyI7CisgIHRbIlx1MzE0OSJdID0gIlx1MTEwRCI7CisgIHRbIlx1MzE0QSJdID0gIlx1MTEwRSI7CisgIHRbIlx1MzE0QiJdID0gIlx1MTEwRiI7CisgIHRbIlx1MzE0QyJdID0gIlx1MTExMCI7CisgIHRbIlx1MzE0RCJdID0gIlx1MTExMSI7CisgIHRbIlx1MzE0RSJdID0gIlx1MTExMiI7CisgIHRbIlx1MzE0RiJdID0gIlx1MTE2MSI7CisgIHRbIlx1MzE1MCJdID0gIlx1MTE2MiI7CisgIHRbIlx1MzE1MSJdID0gIlx1MTE2MyI7CisgIHRbIlx1MzE1MiJdID0gIlx1MTE2NCI7CisgIHRbIlx1MzE1MyJdID0gIlx1MTE2NSI7CisgIHRbIlx1MzE1NCJdID0gIlx1MTE2NiI7CisgIHRbIlx1MzE1NSJdID0gIlx1MTE2NyI7CisgIHRbIlx1MzE1NiJdID0gIlx1MTE2OCI7CisgIHRbIlx1MzE1NyJdID0gIlx1MTE2OSI7CisgIHRbIlx1MzE1OCJdID0gIlx1MTE2QSI7CisgIHRbIlx1MzE1OSJdID0gIlx1MTE2QiI7CisgIHRbIlx1MzE1QSJdID0gIlx1MTE2QyI7CisgIHRbIlx1MzE1QiJdID0gIlx1MTE2RCI7CisgIHRbIlx1MzE1QyJdID0gIlx1MTE2RSI7CisgIHRbIlx1MzE1RCJdID0gIlx1MTE2RiI7CisgIHRbIlx1MzE1RSJdID0gIlx1MTE3MCI7CisgIHRbIlx1MzE1RiJdID0gIlx1MTE3MSI7CisgIHRbIlx1MzE2MCJdID0gIlx1MTE3MiI7CisgIHRbIlx1MzE2MSJdID0gIlx1MTE3MyI7CisgIHRbIlx1MzE2MiJdID0gIlx1MTE3NCI7CisgIHRbIlx1MzE2MyJdID0gIlx1MTE3NSI7CisgIHRbIlx1MzE2NCJdID0gIlx1MTE2MCI7CisgIHRbIlx1MzE2NSJdID0gIlx1MTExNCI7CisgIHRbIlx1MzE2NiJdID0gIlx1MTExNSI7CisgIHRbIlx1MzE2NyJdID0gIlx1MTFDNyI7CisgIHRbIlx1MzE2OCJdID0gIlx1MTFDOCI7CisgIHRbIlx1MzE2OSJdID0gIlx1MTFDQyI7CisgIHRbIlx1MzE2QSJdID0gIlx1MTFDRSI7CisgIHRbIlx1MzE2QiJdID0gIlx1MTFEMyI7CisgIHRbIlx1MzE2QyJdID0gIlx1MTFENyI7CisgIHRbIlx1MzE2RCJdID0gIlx1MTFEOSI7CisgIHRbIlx1MzE2RSJdID0gIlx1MTExQyI7CisgIHRbIlx1MzE2RiJdID0gIlx1MTFERCI7CisgIHRbIlx1MzE3MCJdID0gIlx1MTFERiI7CisgIHRbIlx1MzE3MSJdID0gIlx1MTExRCI7CisgIHRbIlx1MzE3MiJdID0gIlx1MTExRSI7CisgIHRbIlx1MzE3MyJdID0gIlx1MTEyMCI7CisgIHRbIlx1MzE3NCJdID0gIlx1MTEyMiI7CisgIHRbIlx1MzE3NSJdID0gIlx1MTEyMyI7CisgIHRbIlx1MzE3NiJdID0gIlx1MTEyNyI7CisgIHRbIlx1MzE3NyJdID0gIlx1MTEyOSI7CisgIHRbIlx1MzE3OCJdID0gIlx1MTEyQiI7CisgIHRbIlx1MzE3OSJdID0gIlx1MTEyQyI7CisgIHRbIlx1MzE3QSJdID0gIlx1MTEyRCI7CisgIHRbIlx1MzE3QiJdID0gIlx1MTEyRSI7CisgIHRbIlx1MzE3QyJdID0gIlx1MTEyRiI7CisgIHRbIlx1MzE3RCJdID0gIlx1MTEzMiI7CisgIHRbIlx1MzE3RSJdID0gIlx1MTEzNiI7CisgIHRbIlx1MzE3RiJdID0gIlx1MTE0MCI7CisgIHRbIlx1MzE4MCJdID0gIlx1MTE0NyI7CisgIHRbIlx1MzE4MSJdID0gIlx1MTE0QyI7CisgIHRbIlx1MzE4MiJdID0gIlx1MTFGMSI7CisgIHRbIlx1MzE4MyJdID0gIlx1MTFGMiI7CisgIHRbIlx1MzE4NCJdID0gIlx1MTE1NyI7CisgIHRbIlx1MzE4NSJdID0gIlx1MTE1OCI7CisgIHRbIlx1MzE4NiJdID0gIlx1MTE1OSI7CisgIHRbIlx1MzE4NyJdID0gIlx1MTE4NCI7CisgIHRbIlx1MzE4OCJdID0gIlx1MTE4NSI7CisgIHRbIlx1MzE4OSJdID0gIlx1MTE4OCI7CisgIHRbIlx1MzE4QSJdID0gIlx1MTE5MSI7CisgIHRbIlx1MzE4QiJdID0gIlx1MTE5MiI7CisgIHRbIlx1MzE4QyJdID0gIlx1MTE5NCI7CisgIHRbIlx1MzE4RCJdID0gIlx1MTE5RSI7CisgIHRbIlx1MzE4RSJdID0gIlx1MTFBMSI7CisgIHRbIlx1MzIwMCJdID0gIlx1MDAyOFx1MTEwMFx1MDAyOSI7CisgIHRbIlx1MzIwMSJdID0gIlx1MDAyOFx1MTEwMlx1MDAyOSI7CisgIHRbIlx1MzIwMiJdID0gIlx1MDAyOFx1MTEwM1x1MDAyOSI7CisgIHRbIlx1MzIwMyJdID0gIlx1MDAyOFx1MTEwNVx1MDAyOSI7CisgIHRbIlx1MzIwNCJdID0gIlx1MDAyOFx1MTEwNlx1MDAyOSI7CisgIHRbIlx1MzIwNSJdID0gIlx1MDAyOFx1MTEwN1x1MDAyOSI7CisgIHRbIlx1MzIwNiJdID0gIlx1MDAyOFx1MTEwOVx1MDAyOSI7CisgIHRbIlx1MzIwNyJdID0gIlx1MDAyOFx1MTEwQlx1MDAyOSI7CisgIHRbIlx1MzIwOCJdID0gIlx1MDAyOFx1MTEwQ1x1MDAyOSI7CisgIHRbIlx1MzIwOSJdID0gIlx1MDAyOFx1MTEwRVx1MDAyOSI7CisgIHRbIlx1MzIwQSJdID0gIlx1MDAyOFx1MTEwRlx1MDAyOSI7CisgIHRbIlx1MzIwQiJdID0gIlx1MDAyOFx1MTExMFx1MDAyOSI7CisgIHRbIlx1MzIwQyJdID0gIlx1MDAyOFx1MTExMVx1MDAyOSI7CisgIHRbIlx1MzIwRCJdID0gIlx1MDAyOFx1MTExMlx1MDAyOSI7CisgIHRbIlx1MzIwRSJdID0gIlx1MDAyOFx1MTEwMFx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIwRiJdID0gIlx1MDAyOFx1MTEwMlx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxMCJdID0gIlx1MDAyOFx1MTEwM1x1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxMSJdID0gIlx1MDAyOFx1MTEwNVx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxMiJdID0gIlx1MDAyOFx1MTEwNlx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxMyJdID0gIlx1MDAyOFx1MTEwN1x1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxNCJdID0gIlx1MDAyOFx1MTEwOVx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxNSJdID0gIlx1MDAyOFx1MTEwQlx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxNiJdID0gIlx1MDAyOFx1MTEwQ1x1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxNyJdID0gIlx1MDAyOFx1MTEwRVx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxOCJdID0gIlx1MDAyOFx1MTEwRlx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxOSJdID0gIlx1MDAyOFx1MTExMFx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxQSJdID0gIlx1MDAyOFx1MTExMVx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxQiJdID0gIlx1MDAyOFx1MTExMlx1MTE2MVx1MDAyOSI7CisgIHRbIlx1MzIxQyJdID0gIlx1MDAyOFx1MTEwQ1x1MTE2RVx1MDAyOSI7CisgIHRbIlx1MzIxRCJdID0gIlx1MDAyOFx1MTEwQlx1MTE2OVx1MTEwQ1x1MTE2NVx1MTFBQlx1MDAyOSI7CisgIHRbIlx1MzIxRSJdID0gIlx1MDAyOFx1MTEwQlx1MTE2OVx1MTExMlx1MTE2RVx1MDAyOSI7CisgIHRbIlx1MzIyMCJdID0gIlx1MDAyOFx1NEUwMFx1MDAyOSI7CisgIHRbIlx1MzIyMSJdID0gIlx1MDAyOFx1NEU4Q1x1MDAyOSI7CisgIHRbIlx1MzIyMiJdID0gIlx1MDAyOFx1NEUwOVx1MDAyOSI7CisgIHRbIlx1MzIyMyJdID0gIlx1MDAyOFx1NTZEQlx1MDAyOSI7CisgIHRbIlx1MzIyNCJdID0gIlx1MDAyOFx1NEU5NFx1MDAyOSI7CisgIHRbIlx1MzIyNSJdID0gIlx1MDAyOFx1NTE2RFx1MDAyOSI7CisgIHRbIlx1MzIyNiJdID0gIlx1MDAyOFx1NEUwM1x1MDAyOSI7CisgIHRbIlx1MzIyNyJdID0gIlx1MDAyOFx1NTE2Qlx1MDAyOSI7CisgIHRbIlx1MzIyOCJdID0gIlx1MDAyOFx1NEU1RFx1MDAyOSI7CisgIHRbIlx1MzIyOSJdID0gIlx1MDAyOFx1NTM0MVx1MDAyOSI7CisgIHRbIlx1MzIyQSJdID0gIlx1MDAyOFx1NjcwOFx1MDAyOSI7CisgIHRbIlx1MzIyQiJdID0gIlx1MDAyOFx1NzA2Qlx1MDAyOSI7CisgIHRbIlx1MzIyQyJdID0gIlx1MDAyOFx1NkMzNFx1MDAyOSI7CisgIHRbIlx1MzIyRCJdID0gIlx1MDAyOFx1NjcyOFx1MDAyOSI7CisgIHRbIlx1MzIyRSJdID0gIlx1MDAyOFx1OTFEMVx1MDAyOSI7CisgIHRbIlx1MzIyRiJdID0gIlx1MDAyOFx1NTcxRlx1MDAyOSI7CisgIHRbIlx1MzIzMCJdID0gIlx1MDAyOFx1NjVFNVx1MDAyOSI7CisgIHRbIlx1MzIzMSJdID0gIlx1MDAyOFx1NjgyQVx1MDAyOSI7CisgIHRbIlx1MzIzMiJdID0gIlx1MDAyOFx1NjcwOVx1MDAyOSI7CisgIHRbIlx1MzIzMyJdID0gIlx1MDAyOFx1NzkzRVx1MDAyOSI7CisgIHRbIlx1MzIzNCJdID0gIlx1MDAyOFx1NTQwRFx1MDAyOSI7CisgIHRbIlx1MzIzNSJdID0gIlx1MDAyOFx1NzI3OVx1MDAyOSI7CisgIHRbIlx1MzIzNiJdID0gIlx1MDAyOFx1OENBMVx1MDAyOSI7CisgIHRbIlx1MzIzNyJdID0gIlx1MDAyOFx1Nzk1RFx1MDAyOSI7CisgIHRbIlx1MzIzOCJdID0gIlx1MDAyOFx1NTJCNFx1MDAyOSI7CisgIHRbIlx1MzIzOSJdID0gIlx1MDAyOFx1NEVFM1x1MDAyOSI7CisgIHRbIlx1MzIzQSJdID0gIlx1MDAyOFx1NTQ3Q1x1MDAyOSI7CisgIHRbIlx1MzIzQiJdID0gIlx1MDAyOFx1NUI2Nlx1MDAyOSI7CisgIHRbIlx1MzIzQyJdID0gIlx1MDAyOFx1NzZFM1x1MDAyOSI7CisgIHRbIlx1MzIzRCJdID0gIlx1MDAyOFx1NEYwMVx1MDAyOSI7CisgIHRbIlx1MzIzRSJdID0gIlx1MDAyOFx1OENDN1x1MDAyOSI7CisgIHRbIlx1MzIzRiJdID0gIlx1MDAyOFx1NTM1NFx1MDAyOSI7CisgIHRbIlx1MzI0MCJdID0gIlx1MDAyOFx1Nzk2RFx1MDAyOSI7CisgIHRbIlx1MzI0MSJdID0gIlx1MDAyOFx1NEYxMVx1MDAyOSI7CisgIHRbIlx1MzI0MiJdID0gIlx1MDAyOFx1ODFFQVx1MDAyOSI7CisgIHRbIlx1MzI0MyJdID0gIlx1MDAyOFx1ODFGM1x1MDAyOSI7CisgIHRbIlx1MzJDMCJdID0gIlx1MDAzMVx1NjcwOCI7CisgIHRbIlx1MzJDMSJdID0gIlx1MDAzMlx1NjcwOCI7CisgIHRbIlx1MzJDMiJdID0gIlx1MDAzM1x1NjcwOCI7CisgIHRbIlx1MzJDMyJdID0gIlx1MDAzNFx1NjcwOCI7CisgIHRbIlx1MzJDNCJdID0gIlx1MDAzNVx1NjcwOCI7CisgIHRbIlx1MzJDNSJdID0gIlx1MDAzNlx1NjcwOCI7CisgIHRbIlx1MzJDNiJdID0gIlx1MDAzN1x1NjcwOCI7CisgIHRbIlx1MzJDNyJdID0gIlx1MDAzOFx1NjcwOCI7CisgIHRbIlx1MzJDOCJdID0gIlx1MDAzOVx1NjcwOCI7CisgIHRbIlx1MzJDOSJdID0gIlx1MDAzMVx1MDAzMFx1NjcwOCI7CisgIHRbIlx1MzJDQSJdID0gIlx1MDAzMVx1MDAzMVx1NjcwOCI7CisgIHRbIlx1MzJDQiJdID0gIlx1MDAzMVx1MDAzMlx1NjcwOCI7CisgIHRbIlx1MzM1OCJdID0gIlx1MDAzMFx1NzBCOSI7CisgIHRbIlx1MzM1OSJdID0gIlx1MDAzMVx1NzBCOSI7CisgIHRbIlx1MzM1QSJdID0gIlx1MDAzMlx1NzBCOSI7CisgIHRbIlx1MzM1QiJdID0gIlx1MDAzM1x1NzBCOSI7CisgIHRbIlx1MzM1QyJdID0gIlx1MDAzNFx1NzBCOSI7CisgIHRbIlx1MzM1RCJdID0gIlx1MDAzNVx1NzBCOSI7CisgIHRbIlx1MzM1RSJdID0gIlx1MDAzNlx1NzBCOSI7CisgIHRbIlx1MzM1RiJdID0gIlx1MDAzN1x1NzBCOSI7CisgIHRbIlx1MzM2MCJdID0gIlx1MDAzOFx1NzBCOSI7CisgIHRbIlx1MzM2MSJdID0gIlx1MDAzOVx1NzBCOSI7CisgIHRbIlx1MzM2MiJdID0gIlx1MDAzMVx1MDAzMFx1NzBCOSI7CisgIHRbIlx1MzM2MyJdID0gIlx1MDAzMVx1MDAzMVx1NzBCOSI7CisgIHRbIlx1MzM2NCJdID0gIlx1MDAzMVx1MDAzMlx1NzBCOSI7CisgIHRbIlx1MzM2NSJdID0gIlx1MDAzMVx1MDAzM1x1NzBCOSI7CisgIHRbIlx1MzM2NiJdID0gIlx1MDAzMVx1MDAzNFx1NzBCOSI7CisgIHRbIlx1MzM2NyJdID0gIlx1MDAzMVx1MDAzNVx1NzBCOSI7CisgIHRbIlx1MzM2OCJdID0gIlx1MDAzMVx1MDAzNlx1NzBCOSI7CisgIHRbIlx1MzM2OSJdID0gIlx1MDAzMVx1MDAzN1x1NzBCOSI7CisgIHRbIlx1MzM2QSJdID0gIlx1MDAzMVx1MDAzOFx1NzBCOSI7CisgIHRbIlx1MzM2QiJdID0gIlx1MDAzMVx1MDAzOVx1NzBCOSI7CisgIHRbIlx1MzM2QyJdID0gIlx1MDAzMlx1MDAzMFx1NzBCOSI7CisgIHRbIlx1MzM2RCJdID0gIlx1MDAzMlx1MDAzMVx1NzBCOSI7CisgIHRbIlx1MzM2RSJdID0gIlx1MDAzMlx1MDAzMlx1NzBCOSI7CisgIHRbIlx1MzM2RiJdID0gIlx1MDAzMlx1MDAzM1x1NzBCOSI7CisgIHRbIlx1MzM3MCJdID0gIlx1MDAzMlx1MDAzNFx1NzBCOSI7CisgIHRbIlx1MzNFMCJdID0gIlx1MDAzMVx1NjVFNSI7CisgIHRbIlx1MzNFMSJdID0gIlx1MDAzMlx1NjVFNSI7CisgIHRbIlx1MzNFMiJdID0gIlx1MDAzM1x1NjVFNSI7CisgIHRbIlx1MzNFMyJdID0gIlx1MDAzNFx1NjVFNSI7CisgIHRbIlx1MzNFNCJdID0gIlx1MDAzNVx1NjVFNSI7CisgIHRbIlx1MzNFNSJdID0gIlx1MDAzNlx1NjVFNSI7CisgIHRbIlx1MzNFNiJdID0gIlx1MDAzN1x1NjVFNSI7CisgIHRbIlx1MzNFNyJdID0gIlx1MDAzOFx1NjVFNSI7CisgIHRbIlx1MzNFOCJdID0gIlx1MDAzOVx1NjVFNSI7CisgIHRbIlx1MzNFOSJdID0gIlx1MDAzMVx1MDAzMFx1NjVFNSI7CisgIHRbIlx1MzNFQSJdID0gIlx1MDAzMVx1MDAzMVx1NjVFNSI7CisgIHRbIlx1MzNFQiJdID0gIlx1MDAzMVx1MDAzMlx1NjVFNSI7CisgIHRbIlx1MzNFQyJdID0gIlx1MDAzMVx1MDAzM1x1NjVFNSI7CisgIHRbIlx1MzNFRCJdID0gIlx1MDAzMVx1MDAzNFx1NjVFNSI7CisgIHRbIlx1MzNFRSJdID0gIlx1MDAzMVx1MDAzNVx1NjVFNSI7CisgIHRbIlx1MzNFRiJdID0gIlx1MDAzMVx1MDAzNlx1NjVFNSI7CisgIHRbIlx1MzNGMCJdID0gIlx1MDAzMVx1MDAzN1x1NjVFNSI7CisgIHRbIlx1MzNGMSJdID0gIlx1MDAzMVx1MDAzOFx1NjVFNSI7CisgIHRbIlx1MzNGMiJdID0gIlx1MDAzMVx1MDAzOVx1NjVFNSI7CisgIHRbIlx1MzNGMyJdID0gIlx1MDAzMlx1MDAzMFx1NjVFNSI7CisgIHRbIlx1MzNGNCJdID0gIlx1MDAzMlx1MDAzMVx1NjVFNSI7CisgIHRbIlx1MzNGNSJdID0gIlx1MDAzMlx1MDAzMlx1NjVFNSI7CisgIHRbIlx1MzNGNiJdID0gIlx1MDAzMlx1MDAzM1x1NjVFNSI7CisgIHRbIlx1MzNGNyJdID0gIlx1MDAzMlx1MDAzNFx1NjVFNSI7CisgIHRbIlx1MzNGOCJdID0gIlx1MDAzMlx1MDAzNVx1NjVFNSI7CisgIHRbIlx1MzNGOSJdID0gIlx1MDAzMlx1MDAzNlx1NjVFNSI7CisgIHRbIlx1MzNGQSJdID0gIlx1MDAzMlx1MDAzN1x1NjVFNSI7CisgIHRbIlx1MzNGQiJdID0gIlx1MDAzMlx1MDAzOFx1NjVFNSI7CisgIHRbIlx1MzNGQyJdID0gIlx1MDAzMlx1MDAzOVx1NjVFNSI7CisgIHRbIlx1MzNGRCJdID0gIlx1MDAzM1x1MDAzMFx1NjVFNSI7CisgIHRbIlx1MzNGRSJdID0gIlx1MDAzM1x1MDAzMVx1NjVFNSI7CisgIHRbIlx1RkIwMCJdID0gIlx1MDA2Nlx1MDA2NiI7CisgIHRbIlx1RkIwMSJdID0gIlx1MDA2Nlx1MDA2OSI7CisgIHRbIlx1RkIwMiJdID0gIlx1MDA2Nlx1MDA2QyI7CisgIHRbIlx1RkIwMyJdID0gIlx1MDA2Nlx1MDA2Nlx1MDA2OSI7CisgIHRbIlx1RkIwNCJdID0gIlx1MDA2Nlx1MDA2Nlx1MDA2QyI7CisgIHRbIlx1RkIwNSJdID0gIlx1MDE3Rlx1MDA3NCI7CisgIHRbIlx1RkIwNiJdID0gIlx1MDA3M1x1MDA3NCI7CisgIHRbIlx1RkIxMyJdID0gIlx1MDU3NFx1MDU3NiI7CisgIHRbIlx1RkIxNCJdID0gIlx1MDU3NFx1MDU2NSI7CisgIHRbIlx1RkIxNSJdID0gIlx1MDU3NFx1MDU2QiI7CisgIHRbIlx1RkIxNiJdID0gIlx1MDU3RVx1MDU3NiI7CisgIHRbIlx1RkIxNyJdID0gIlx1MDU3NFx1MDU2RCI7CisgIHRbIlx1RkI0RiJdID0gIlx1MDVEMFx1MDVEQyI7CisgIHRbIlx1RkI1MCJdID0gIlx1MDY3MSI7CisgIHRbIlx1RkI1MSJdID0gIlx1MDY3MSI7CisgIHRbIlx1RkI1MiJdID0gIlx1MDY3QiI7CisgIHRbIlx1RkI1MyJdID0gIlx1MDY3QiI7CisgIHRbIlx1RkI1NCJdID0gIlx1MDY3QiI7CisgIHRbIlx1RkI1NSJdID0gIlx1MDY3QiI7CisgIHRbIlx1RkI1NiJdID0gIlx1MDY3RSI7CisgIHRbIlx1RkI1NyJdID0gIlx1MDY3RSI7CisgIHRbIlx1RkI1OCJdID0gIlx1MDY3RSI7CisgIHRbIlx1RkI1OSJdID0gIlx1MDY3RSI7CisgIHRbIlx1RkI1QSJdID0gIlx1MDY4MCI7CisgIHRbIlx1RkI1QiJdID0gIlx1MDY4MCI7CisgIHRbIlx1RkI1QyJdID0gIlx1MDY4MCI7CisgIHRbIlx1RkI1RCJdID0gIlx1MDY4MCI7CisgIHRbIlx1RkI1RSJdID0gIlx1MDY3QSI7CisgIHRbIlx1RkI1RiJdID0gIlx1MDY3QSI7CisgIHRbIlx1RkI2MCJdID0gIlx1MDY3QSI7CisgIHRbIlx1RkI2MSJdID0gIlx1MDY3QSI7CisgIHRbIlx1RkI2MiJdID0gIlx1MDY3RiI7CisgIHRbIlx1RkI2MyJdID0gIlx1MDY3RiI7CisgIHRbIlx1RkI2NCJdID0gIlx1MDY3RiI7CisgIHRbIlx1RkI2NSJdID0gIlx1MDY3RiI7CisgIHRbIlx1RkI2NiJdID0gIlx1MDY3OSI7CisgIHRbIlx1RkI2NyJdID0gIlx1MDY3OSI7CisgIHRbIlx1RkI2OCJdID0gIlx1MDY3OSI7CisgIHRbIlx1RkI2OSJdID0gIlx1MDY3OSI7CisgIHRbIlx1RkI2QSJdID0gIlx1MDZBNCI7CisgIHRbIlx1RkI2QiJdID0gIlx1MDZBNCI7CisgIHRbIlx1RkI2QyJdID0gIlx1MDZBNCI7CisgIHRbIlx1RkI2RCJdID0gIlx1MDZBNCI7CisgIHRbIlx1RkI2RSJdID0gIlx1MDZBNiI7CisgIHRbIlx1RkI2RiJdID0gIlx1MDZBNiI7CisgIHRbIlx1RkI3MCJdID0gIlx1MDZBNiI7CisgIHRbIlx1RkI3MSJdID0gIlx1MDZBNiI7CisgIHRbIlx1RkI3MiJdID0gIlx1MDY4NCI7CisgIHRbIlx1RkI3MyJdID0gIlx1MDY4NCI7CisgIHRbIlx1RkI3NCJdID0gIlx1MDY4NCI7CisgIHRbIlx1RkI3NSJdID0gIlx1MDY4NCI7CisgIHRbIlx1RkI3NiJdID0gIlx1MDY4MyI7CisgIHRbIlx1RkI3NyJdID0gIlx1MDY4MyI7CisgIHRbIlx1RkI3OCJdID0gIlx1MDY4MyI7CisgIHRbIlx1RkI3OSJdID0gIlx1MDY4MyI7CisgIHRbIlx1RkI3QSJdID0gIlx1MDY4NiI7CisgIHRbIlx1RkI3QiJdID0gIlx1MDY4NiI7CisgIHRbIlx1RkI3QyJdID0gIlx1MDY4NiI7CisgIHRbIlx1RkI3RCJdID0gIlx1MDY4NiI7CisgIHRbIlx1RkI3RSJdID0gIlx1MDY4NyI7CisgIHRbIlx1RkI3RiJdID0gIlx1MDY4NyI7CisgIHRbIlx1RkI4MCJdID0gIlx1MDY4NyI7CisgIHRbIlx1RkI4MSJdID0gIlx1MDY4NyI7CisgIHRbIlx1RkI4MiJdID0gIlx1MDY4RCI7CisgIHRbIlx1RkI4MyJdID0gIlx1MDY4RCI7CisgIHRbIlx1RkI4NCJdID0gIlx1MDY4QyI7CisgIHRbIlx1RkI4NSJdID0gIlx1MDY4QyI7CisgIHRbIlx1RkI4NiJdID0gIlx1MDY4RSI7CisgIHRbIlx1RkI4NyJdID0gIlx1MDY4RSI7CisgIHRbIlx1RkI4OCJdID0gIlx1MDY4OCI7CisgIHRbIlx1RkI4OSJdID0gIlx1MDY4OCI7CisgIHRbIlx1RkI4QSJdID0gIlx1MDY5OCI7CisgIHRbIlx1RkI4QiJdID0gIlx1MDY5OCI7CisgIHRbIlx1RkI4QyJdID0gIlx1MDY5MSI7CisgIHRbIlx1RkI4RCJdID0gIlx1MDY5MSI7CisgIHRbIlx1RkI4RSJdID0gIlx1MDZBOSI7CisgIHRbIlx1RkI4RiJdID0gIlx1MDZBOSI7CisgIHRbIlx1RkI5MCJdID0gIlx1MDZBOSI7CisgIHRbIlx1RkI5MSJdID0gIlx1MDZBOSI7CisgIHRbIlx1RkI5MiJdID0gIlx1MDZBRiI7CisgIHRbIlx1RkI5MyJdID0gIlx1MDZBRiI7CisgIHRbIlx1RkI5NCJdID0gIlx1MDZBRiI7CisgIHRbIlx1RkI5NSJdID0gIlx1MDZBRiI7CisgIHRbIlx1RkI5NiJdID0gIlx1MDZCMyI7CisgIHRbIlx1RkI5NyJdID0gIlx1MDZCMyI7CisgIHRbIlx1RkI5OCJdID0gIlx1MDZCMyI7CisgIHRbIlx1RkI5OSJdID0gIlx1MDZCMyI7CisgIHRbIlx1RkI5QSJdID0gIlx1MDZCMSI7CisgIHRbIlx1RkI5QiJdID0gIlx1MDZCMSI7CisgIHRbIlx1RkI5QyJdID0gIlx1MDZCMSI7CisgIHRbIlx1RkI5RCJdID0gIlx1MDZCMSI7CisgIHRbIlx1RkI5RSJdID0gIlx1MDZCQSI7CisgIHRbIlx1RkI5RiJdID0gIlx1MDZCQSI7CisgIHRbIlx1RkJBMCJdID0gIlx1MDZCQiI7CisgIHRbIlx1RkJBMSJdID0gIlx1MDZCQiI7CisgIHRbIlx1RkJBMiJdID0gIlx1MDZCQiI7CisgIHRbIlx1RkJBMyJdID0gIlx1MDZCQiI7CisgIHRbIlx1RkJBNCJdID0gIlx1MDZDMCI7CisgIHRbIlx1RkJBNSJdID0gIlx1MDZDMCI7CisgIHRbIlx1RkJBNiJdID0gIlx1MDZDMSI7CisgIHRbIlx1RkJBNyJdID0gIlx1MDZDMSI7CisgIHRbIlx1RkJBOCJdID0gIlx1MDZDMSI7CisgIHRbIlx1RkJBOSJdID0gIlx1MDZDMSI7CisgIHRbIlx1RkJBQSJdID0gIlx1MDZCRSI7CisgIHRbIlx1RkJBQiJdID0gIlx1MDZCRSI7CisgIHRbIlx1RkJBQyJdID0gIlx1MDZCRSI7CisgIHRbIlx1RkJBRCJdID0gIlx1MDZCRSI7CisgIHRbIlx1RkJBRSJdID0gIlx1MDZEMiI7CisgIHRbIlx1RkJBRiJdID0gIlx1MDZEMiI7CisgIHRbIlx1RkJCMCJdID0gIlx1MDZEMyI7CisgIHRbIlx1RkJCMSJdID0gIlx1MDZEMyI7CisgIHRbIlx1RkJEMyJdID0gIlx1MDZBRCI7CisgIHRbIlx1RkJENCJdID0gIlx1MDZBRCI7CisgIHRbIlx1RkJENSJdID0gIlx1MDZBRCI7CisgIHRbIlx1RkJENiJdID0gIlx1MDZBRCI7CisgIHRbIlx1RkJENyJdID0gIlx1MDZDNyI7CisgIHRbIlx1RkJEOCJdID0gIlx1MDZDNyI7CisgIHRbIlx1RkJEOSJdID0gIlx1MDZDNiI7CisgIHRbIlx1RkJEQSJdID0gIlx1MDZDNiI7CisgIHRbIlx1RkJEQiJdID0gIlx1MDZDOCI7CisgIHRbIlx1RkJEQyJdID0gIlx1MDZDOCI7CisgIHRbIlx1RkJERCJdID0gIlx1MDY3NyI7CisgIHRbIlx1RkJERSJdID0gIlx1MDZDQiI7CisgIHRbIlx1RkJERiJdID0gIlx1MDZDQiI7CisgIHRbIlx1RkJFMCJdID0gIlx1MDZDNSI7CisgIHRbIlx1RkJFMSJdID0gIlx1MDZDNSI7CisgIHRbIlx1RkJFMiJdID0gIlx1MDZDOSI7CisgIHRbIlx1RkJFMyJdID0gIlx1MDZDOSI7CisgIHRbIlx1RkJFNCJdID0gIlx1MDZEMCI7CisgIHRbIlx1RkJFNSJdID0gIlx1MDZEMCI7CisgIHRbIlx1RkJFNiJdID0gIlx1MDZEMCI7CisgIHRbIlx1RkJFNyJdID0gIlx1MDZEMCI7CisgIHRbIlx1RkJFOCJdID0gIlx1MDY0OSI7CisgIHRbIlx1RkJFOSJdID0gIlx1MDY0OSI7CisgIHRbIlx1RkJFQSJdID0gIlx1MDYyNlx1MDYyNyI7CisgIHRbIlx1RkJFQiJdID0gIlx1MDYyNlx1MDYyNyI7CisgIHRbIlx1RkJFQyJdID0gIlx1MDYyNlx1MDZENSI7CisgIHRbIlx1RkJFRCJdID0gIlx1MDYyNlx1MDZENSI7CisgIHRbIlx1RkJFRSJdID0gIlx1MDYyNlx1MDY0OCI7CisgIHRbIlx1RkJFRiJdID0gIlx1MDYyNlx1MDY0OCI7CisgIHRbIlx1RkJGMCJdID0gIlx1MDYyNlx1MDZDNyI7CisgIHRbIlx1RkJGMSJdID0gIlx1MDYyNlx1MDZDNyI7CisgIHRbIlx1RkJGMiJdID0gIlx1MDYyNlx1MDZDNiI7CisgIHRbIlx1RkJGMyJdID0gIlx1MDYyNlx1MDZDNiI7CisgIHRbIlx1RkJGNCJdID0gIlx1MDYyNlx1MDZDOCI7CisgIHRbIlx1RkJGNSJdID0gIlx1MDYyNlx1MDZDOCI7CisgIHRbIlx1RkJGNiJdID0gIlx1MDYyNlx1MDZEMCI7CisgIHRbIlx1RkJGNyJdID0gIlx1MDYyNlx1MDZEMCI7CisgIHRbIlx1RkJGOCJdID0gIlx1MDYyNlx1MDZEMCI7CisgIHRbIlx1RkJGOSJdID0gIlx1MDYyNlx1MDY0OSI7CisgIHRbIlx1RkJGQSJdID0gIlx1MDYyNlx1MDY0OSI7CisgIHRbIlx1RkJGQiJdID0gIlx1MDYyNlx1MDY0OSI7CisgIHRbIlx1RkJGQyJdID0gIlx1MDZDQyI7CisgIHRbIlx1RkJGRCJdID0gIlx1MDZDQyI7CisgIHRbIlx1RkJGRSJdID0gIlx1MDZDQyI7CisgIHRbIlx1RkJGRiJdID0gIlx1MDZDQyI7CisgIHRbIlx1RkMwMCJdID0gIlx1MDYyNlx1MDYyQyI7CisgIHRbIlx1RkMwMSJdID0gIlx1MDYyNlx1MDYyRCI7CisgIHRbIlx1RkMwMiJdID0gIlx1MDYyNlx1MDY0NSI7CisgIHRbIlx1RkMwMyJdID0gIlx1MDYyNlx1MDY0OSI7CisgIHRbIlx1RkMwNCJdID0gIlx1MDYyNlx1MDY0QSI7CisgIHRbIlx1RkMwNSJdID0gIlx1MDYyOFx1MDYyQyI7CisgIHRbIlx1RkMwNiJdID0gIlx1MDYyOFx1MDYyRCI7CisgIHRbIlx1RkMwNyJdID0gIlx1MDYyOFx1MDYyRSI7CisgIHRbIlx1RkMwOCJdID0gIlx1MDYyOFx1MDY0NSI7CisgIHRbIlx1RkMwOSJdID0gIlx1MDYyOFx1MDY0OSI7CisgIHRbIlx1RkMwQSJdID0gIlx1MDYyOFx1MDY0QSI7CisgIHRbIlx1RkMwQiJdID0gIlx1MDYyQVx1MDYyQyI7CisgIHRbIlx1RkMwQyJdID0gIlx1MDYyQVx1MDYyRCI7CisgIHRbIlx1RkMwRCJdID0gIlx1MDYyQVx1MDYyRSI7CisgIHRbIlx1RkMwRSJdID0gIlx1MDYyQVx1MDY0NSI7CisgIHRbIlx1RkMwRiJdID0gIlx1MDYyQVx1MDY0OSI7CisgIHRbIlx1RkMxMCJdID0gIlx1MDYyQVx1MDY0QSI7CisgIHRbIlx1RkMxMSJdID0gIlx1MDYyQlx1MDYyQyI7CisgIHRbIlx1RkMxMiJdID0gIlx1MDYyQlx1MDY0NSI7CisgIHRbIlx1RkMxMyJdID0gIlx1MDYyQlx1MDY0OSI7CisgIHRbIlx1RkMxNCJdID0gIlx1MDYyQlx1MDY0QSI7CisgIHRbIlx1RkMxNSJdID0gIlx1MDYyQ1x1MDYyRCI7CisgIHRbIlx1RkMxNiJdID0gIlx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkMxNyJdID0gIlx1MDYyRFx1MDYyQyI7CisgIHRbIlx1RkMxOCJdID0gIlx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkMxOSJdID0gIlx1MDYyRVx1MDYyQyI7CisgIHRbIlx1RkMxQSJdID0gIlx1MDYyRVx1MDYyRCI7CisgIHRbIlx1RkMxQiJdID0gIlx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkMxQyJdID0gIlx1MDYzM1x1MDYyQyI7CisgIHRbIlx1RkMxRCJdID0gIlx1MDYzM1x1MDYyRCI7CisgIHRbIlx1RkMxRSJdID0gIlx1MDYzM1x1MDYyRSI7CisgIHRbIlx1RkMxRiJdID0gIlx1MDYzM1x1MDY0NSI7CisgIHRbIlx1RkMyMCJdID0gIlx1MDYzNVx1MDYyRCI7CisgIHRbIlx1RkMyMSJdID0gIlx1MDYzNVx1MDY0NSI7CisgIHRbIlx1RkMyMiJdID0gIlx1MDYzNlx1MDYyQyI7CisgIHRbIlx1RkMyMyJdID0gIlx1MDYzNlx1MDYyRCI7CisgIHRbIlx1RkMyNCJdID0gIlx1MDYzNlx1MDYyRSI7CisgIHRbIlx1RkMyNSJdID0gIlx1MDYzNlx1MDY0NSI7CisgIHRbIlx1RkMyNiJdID0gIlx1MDYzN1x1MDYyRCI7CisgIHRbIlx1RkMyNyJdID0gIlx1MDYzN1x1MDY0NSI7CisgIHRbIlx1RkMyOCJdID0gIlx1MDYzOFx1MDY0NSI7CisgIHRbIlx1RkMyOSJdID0gIlx1MDYzOVx1MDYyQyI7CisgIHRbIlx1RkMyQSJdID0gIlx1MDYzOVx1MDY0NSI7CisgIHRbIlx1RkMyQiJdID0gIlx1MDYzQVx1MDYyQyI7CisgIHRbIlx1RkMyQyJdID0gIlx1MDYzQVx1MDY0NSI7CisgIHRbIlx1RkMyRCJdID0gIlx1MDY0MVx1MDYyQyI7CisgIHRbIlx1RkMyRSJdID0gIlx1MDY0MVx1MDYyRCI7CisgIHRbIlx1RkMyRiJdID0gIlx1MDY0MVx1MDYyRSI7CisgIHRbIlx1RkMzMCJdID0gIlx1MDY0MVx1MDY0NSI7CisgIHRbIlx1RkMzMSJdID0gIlx1MDY0MVx1MDY0OSI7CisgIHRbIlx1RkMzMiJdID0gIlx1MDY0MVx1MDY0QSI7CisgIHRbIlx1RkMzMyJdID0gIlx1MDY0Mlx1MDYyRCI7CisgIHRbIlx1RkMzNCJdID0gIlx1MDY0Mlx1MDY0NSI7CisgIHRbIlx1RkMzNSJdID0gIlx1MDY0Mlx1MDY0OSI7CisgIHRbIlx1RkMzNiJdID0gIlx1MDY0Mlx1MDY0QSI7CisgIHRbIlx1RkMzNyJdID0gIlx1MDY0M1x1MDYyNyI7CisgIHRbIlx1RkMzOCJdID0gIlx1MDY0M1x1MDYyQyI7CisgIHRbIlx1RkMzOSJdID0gIlx1MDY0M1x1MDYyRCI7CisgIHRbIlx1RkMzQSJdID0gIlx1MDY0M1x1MDYyRSI7CisgIHRbIlx1RkMzQiJdID0gIlx1MDY0M1x1MDY0NCI7CisgIHRbIlx1RkMzQyJdID0gIlx1MDY0M1x1MDY0NSI7CisgIHRbIlx1RkMzRCJdID0gIlx1MDY0M1x1MDY0OSI7CisgIHRbIlx1RkMzRSJdID0gIlx1MDY0M1x1MDY0QSI7CisgIHRbIlx1RkMzRiJdID0gIlx1MDY0NFx1MDYyQyI7CisgIHRbIlx1RkM0MCJdID0gIlx1MDY0NFx1MDYyRCI7CisgIHRbIlx1RkM0MSJdID0gIlx1MDY0NFx1MDYyRSI7CisgIHRbIlx1RkM0MiJdID0gIlx1MDY0NFx1MDY0NSI7CisgIHRbIlx1RkM0MyJdID0gIlx1MDY0NFx1MDY0OSI7CisgIHRbIlx1RkM0NCJdID0gIlx1MDY0NFx1MDY0QSI7CisgIHRbIlx1RkM0NSJdID0gIlx1MDY0NVx1MDYyQyI7CisgIHRbIlx1RkM0NiJdID0gIlx1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkM0NyJdID0gIlx1MDY0NVx1MDYyRSI7CisgIHRbIlx1RkM0OCJdID0gIlx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkM0OSJdID0gIlx1MDY0NVx1MDY0OSI7CisgIHRbIlx1RkM0QSJdID0gIlx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkM0QiJdID0gIlx1MDY0Nlx1MDYyQyI7CisgIHRbIlx1RkM0QyJdID0gIlx1MDY0Nlx1MDYyRCI7CisgIHRbIlx1RkM0RCJdID0gIlx1MDY0Nlx1MDYyRSI7CisgIHRbIlx1RkM0RSJdID0gIlx1MDY0Nlx1MDY0NSI7CisgIHRbIlx1RkM0RiJdID0gIlx1MDY0Nlx1MDY0OSI7CisgIHRbIlx1RkM1MCJdID0gIlx1MDY0Nlx1MDY0QSI7CisgIHRbIlx1RkM1MSJdID0gIlx1MDY0N1x1MDYyQyI7CisgIHRbIlx1RkM1MiJdID0gIlx1MDY0N1x1MDY0NSI7CisgIHRbIlx1RkM1MyJdID0gIlx1MDY0N1x1MDY0OSI7CisgIHRbIlx1RkM1NCJdID0gIlx1MDY0N1x1MDY0QSI7CisgIHRbIlx1RkM1NSJdID0gIlx1MDY0QVx1MDYyQyI7CisgIHRbIlx1RkM1NiJdID0gIlx1MDY0QVx1MDYyRCI7CisgIHRbIlx1RkM1NyJdID0gIlx1MDY0QVx1MDYyRSI7CisgIHRbIlx1RkM1OCJdID0gIlx1MDY0QVx1MDY0NSI7CisgIHRbIlx1RkM1OSJdID0gIlx1MDY0QVx1MDY0OSI7CisgIHRbIlx1RkM1QSJdID0gIlx1MDY0QVx1MDY0QSI7CisgIHRbIlx1RkM1QiJdID0gIlx1MDYzMFx1MDY3MCI7CisgIHRbIlx1RkM1QyJdID0gIlx1MDYzMVx1MDY3MCI7CisgIHRbIlx1RkM1RCJdID0gIlx1MDY0OVx1MDY3MCI7CisgIHRbIlx1RkM1RSJdID0gIlx1MDAyMFx1MDY0Q1x1MDY1MSI7CisgIHRbIlx1RkM1RiJdID0gIlx1MDAyMFx1MDY0RFx1MDY1MSI7CisgIHRbIlx1RkM2MCJdID0gIlx1MDAyMFx1MDY0RVx1MDY1MSI7CisgIHRbIlx1RkM2MSJdID0gIlx1MDAyMFx1MDY0Rlx1MDY1MSI7CisgIHRbIlx1RkM2MiJdID0gIlx1MDAyMFx1MDY1MFx1MDY1MSI7CisgIHRbIlx1RkM2MyJdID0gIlx1MDAyMFx1MDY1MVx1MDY3MCI7CisgIHRbIlx1RkM2NCJdID0gIlx1MDYyNlx1MDYzMSI7CisgIHRbIlx1RkM2NSJdID0gIlx1MDYyNlx1MDYzMiI7CisgIHRbIlx1RkM2NiJdID0gIlx1MDYyNlx1MDY0NSI7CisgIHRbIlx1RkM2NyJdID0gIlx1MDYyNlx1MDY0NiI7CisgIHRbIlx1RkM2OCJdID0gIlx1MDYyNlx1MDY0OSI7CisgIHRbIlx1RkM2OSJdID0gIlx1MDYyNlx1MDY0QSI7CisgIHRbIlx1RkM2QSJdID0gIlx1MDYyOFx1MDYzMSI7CisgIHRbIlx1RkM2QiJdID0gIlx1MDYyOFx1MDYzMiI7CisgIHRbIlx1RkM2QyJdID0gIlx1MDYyOFx1MDY0NSI7CisgIHRbIlx1RkM2RCJdID0gIlx1MDYyOFx1MDY0NiI7CisgIHRbIlx1RkM2RSJdID0gIlx1MDYyOFx1MDY0OSI7CisgIHRbIlx1RkM2RiJdID0gIlx1MDYyOFx1MDY0QSI7CisgIHRbIlx1RkM3MCJdID0gIlx1MDYyQVx1MDYzMSI7CisgIHRbIlx1RkM3MSJdID0gIlx1MDYyQVx1MDYzMiI7CisgIHRbIlx1RkM3MiJdID0gIlx1MDYyQVx1MDY0NSI7CisgIHRbIlx1RkM3MyJdID0gIlx1MDYyQVx1MDY0NiI7CisgIHRbIlx1RkM3NCJdID0gIlx1MDYyQVx1MDY0OSI7CisgIHRbIlx1RkM3NSJdID0gIlx1MDYyQVx1MDY0QSI7CisgIHRbIlx1RkM3NiJdID0gIlx1MDYyQlx1MDYzMSI7CisgIHRbIlx1RkM3NyJdID0gIlx1MDYyQlx1MDYzMiI7CisgIHRbIlx1RkM3OCJdID0gIlx1MDYyQlx1MDY0NSI7CisgIHRbIlx1RkM3OSJdID0gIlx1MDYyQlx1MDY0NiI7CisgIHRbIlx1RkM3QSJdID0gIlx1MDYyQlx1MDY0OSI7CisgIHRbIlx1RkM3QiJdID0gIlx1MDYyQlx1MDY0QSI7CisgIHRbIlx1RkM3QyJdID0gIlx1MDY0MVx1MDY0OSI7CisgIHRbIlx1RkM3RCJdID0gIlx1MDY0MVx1MDY0QSI7CisgIHRbIlx1RkM3RSJdID0gIlx1MDY0Mlx1MDY0OSI7CisgIHRbIlx1RkM3RiJdID0gIlx1MDY0Mlx1MDY0QSI7CisgIHRbIlx1RkM4MCJdID0gIlx1MDY0M1x1MDYyNyI7CisgIHRbIlx1RkM4MSJdID0gIlx1MDY0M1x1MDY0NCI7CisgIHRbIlx1RkM4MiJdID0gIlx1MDY0M1x1MDY0NSI7CisgIHRbIlx1RkM4MyJdID0gIlx1MDY0M1x1MDY0OSI7CisgIHRbIlx1RkM4NCJdID0gIlx1MDY0M1x1MDY0QSI7CisgIHRbIlx1RkM4NSJdID0gIlx1MDY0NFx1MDY0NSI7CisgIHRbIlx1RkM4NiJdID0gIlx1MDY0NFx1MDY0OSI7CisgIHRbIlx1RkM4NyJdID0gIlx1MDY0NFx1MDY0QSI7CisgIHRbIlx1RkM4OCJdID0gIlx1MDY0NVx1MDYyNyI7CisgIHRbIlx1RkM4OSJdID0gIlx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkM4QSJdID0gIlx1MDY0Nlx1MDYzMSI7CisgIHRbIlx1RkM4QiJdID0gIlx1MDY0Nlx1MDYzMiI7CisgIHRbIlx1RkM4QyJdID0gIlx1MDY0Nlx1MDY0NSI7CisgIHRbIlx1RkM4RCJdID0gIlx1MDY0Nlx1MDY0NiI7CisgIHRbIlx1RkM4RSJdID0gIlx1MDY0Nlx1MDY0OSI7CisgIHRbIlx1RkM4RiJdID0gIlx1MDY0Nlx1MDY0QSI7CisgIHRbIlx1RkM5MCJdID0gIlx1MDY0OVx1MDY3MCI7CisgIHRbIlx1RkM5MSJdID0gIlx1MDY0QVx1MDYzMSI7CisgIHRbIlx1RkM5MiJdID0gIlx1MDY0QVx1MDYzMiI7CisgIHRbIlx1RkM5MyJdID0gIlx1MDY0QVx1MDY0NSI7CisgIHRbIlx1RkM5NCJdID0gIlx1MDY0QVx1MDY0NiI7CisgIHRbIlx1RkM5NSJdID0gIlx1MDY0QVx1MDY0OSI7CisgIHRbIlx1RkM5NiJdID0gIlx1MDY0QVx1MDY0QSI7CisgIHRbIlx1RkM5NyJdID0gIlx1MDYyNlx1MDYyQyI7CisgIHRbIlx1RkM5OCJdID0gIlx1MDYyNlx1MDYyRCI7CisgIHRbIlx1RkM5OSJdID0gIlx1MDYyNlx1MDYyRSI7CisgIHRbIlx1RkM5QSJdID0gIlx1MDYyNlx1MDY0NSI7CisgIHRbIlx1RkM5QiJdID0gIlx1MDYyNlx1MDY0NyI7CisgIHRbIlx1RkM5QyJdID0gIlx1MDYyOFx1MDYyQyI7CisgIHRbIlx1RkM5RCJdID0gIlx1MDYyOFx1MDYyRCI7CisgIHRbIlx1RkM5RSJdID0gIlx1MDYyOFx1MDYyRSI7CisgIHRbIlx1RkM5RiJdID0gIlx1MDYyOFx1MDY0NSI7CisgIHRbIlx1RkNBMCJdID0gIlx1MDYyOFx1MDY0NyI7CisgIHRbIlx1RkNBMSJdID0gIlx1MDYyQVx1MDYyQyI7CisgIHRbIlx1RkNBMiJdID0gIlx1MDYyQVx1MDYyRCI7CisgIHRbIlx1RkNBMyJdID0gIlx1MDYyQVx1MDYyRSI7CisgIHRbIlx1RkNBNCJdID0gIlx1MDYyQVx1MDY0NSI7CisgIHRbIlx1RkNBNSJdID0gIlx1MDYyQVx1MDY0NyI7CisgIHRbIlx1RkNBNiJdID0gIlx1MDYyQlx1MDY0NSI7CisgIHRbIlx1RkNBNyJdID0gIlx1MDYyQ1x1MDYyRCI7CisgIHRbIlx1RkNBOCJdID0gIlx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkNBOSJdID0gIlx1MDYyRFx1MDYyQyI7CisgIHRbIlx1RkNBQSJdID0gIlx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkNBQiJdID0gIlx1MDYyRVx1MDYyQyI7CisgIHRbIlx1RkNBQyJdID0gIlx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkNBRCJdID0gIlx1MDYzM1x1MDYyQyI7CisgIHRbIlx1RkNBRSJdID0gIlx1MDYzM1x1MDYyRCI7CisgIHRbIlx1RkNBRiJdID0gIlx1MDYzM1x1MDYyRSI7CisgIHRbIlx1RkNCMCJdID0gIlx1MDYzM1x1MDY0NSI7CisgIHRbIlx1RkNCMSJdID0gIlx1MDYzNVx1MDYyRCI7CisgIHRbIlx1RkNCMiJdID0gIlx1MDYzNVx1MDYyRSI7CisgIHRbIlx1RkNCMyJdID0gIlx1MDYzNVx1MDY0NSI7CisgIHRbIlx1RkNCNCJdID0gIlx1MDYzNlx1MDYyQyI7CisgIHRbIlx1RkNCNSJdID0gIlx1MDYzNlx1MDYyRCI7CisgIHRbIlx1RkNCNiJdID0gIlx1MDYzNlx1MDYyRSI7CisgIHRbIlx1RkNCNyJdID0gIlx1MDYzNlx1MDY0NSI7CisgIHRbIlx1RkNCOCJdID0gIlx1MDYzN1x1MDYyRCI7CisgIHRbIlx1RkNCOSJdID0gIlx1MDYzOFx1MDY0NSI7CisgIHRbIlx1RkNCQSJdID0gIlx1MDYzOVx1MDYyQyI7CisgIHRbIlx1RkNCQiJdID0gIlx1MDYzOVx1MDY0NSI7CisgIHRbIlx1RkNCQyJdID0gIlx1MDYzQVx1MDYyQyI7CisgIHRbIlx1RkNCRCJdID0gIlx1MDYzQVx1MDY0NSI7CisgIHRbIlx1RkNCRSJdID0gIlx1MDY0MVx1MDYyQyI7CisgIHRbIlx1RkNCRiJdID0gIlx1MDY0MVx1MDYyRCI7CisgIHRbIlx1RkNDMCJdID0gIlx1MDY0MVx1MDYyRSI7CisgIHRbIlx1RkNDMSJdID0gIlx1MDY0MVx1MDY0NSI7CisgIHRbIlx1RkNDMiJdID0gIlx1MDY0Mlx1MDYyRCI7CisgIHRbIlx1RkNDMyJdID0gIlx1MDY0Mlx1MDY0NSI7CisgIHRbIlx1RkNDNCJdID0gIlx1MDY0M1x1MDYyQyI7CisgIHRbIlx1RkNDNSJdID0gIlx1MDY0M1x1MDYyRCI7CisgIHRbIlx1RkNDNiJdID0gIlx1MDY0M1x1MDYyRSI7CisgIHRbIlx1RkNDNyJdID0gIlx1MDY0M1x1MDY0NCI7CisgIHRbIlx1RkNDOCJdID0gIlx1MDY0M1x1MDY0NSI7CisgIHRbIlx1RkNDOSJdID0gIlx1MDY0NFx1MDYyQyI7CisgIHRbIlx1RkNDQSJdID0gIlx1MDY0NFx1MDYyRCI7CisgIHRbIlx1RkNDQiJdID0gIlx1MDY0NFx1MDYyRSI7CisgIHRbIlx1RkNDQyJdID0gIlx1MDY0NFx1MDY0NSI7CisgIHRbIlx1RkNDRCJdID0gIlx1MDY0NFx1MDY0NyI7CisgIHRbIlx1RkNDRSJdID0gIlx1MDY0NVx1MDYyQyI7CisgIHRbIlx1RkNDRiJdID0gIlx1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkNEMCJdID0gIlx1MDY0NVx1MDYyRSI7CisgIHRbIlx1RkNEMSJdID0gIlx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkNEMiJdID0gIlx1MDY0Nlx1MDYyQyI7CisgIHRbIlx1RkNEMyJdID0gIlx1MDY0Nlx1MDYyRCI7CisgIHRbIlx1RkNENCJdID0gIlx1MDY0Nlx1MDYyRSI7CisgIHRbIlx1RkNENSJdID0gIlx1MDY0Nlx1MDY0NSI7CisgIHRbIlx1RkNENiJdID0gIlx1MDY0Nlx1MDY0NyI7CisgIHRbIlx1RkNENyJdID0gIlx1MDY0N1x1MDYyQyI7CisgIHRbIlx1RkNEOCJdID0gIlx1MDY0N1x1MDY0NSI7CisgIHRbIlx1RkNEOSJdID0gIlx1MDY0N1x1MDY3MCI7CisgIHRbIlx1RkNEQSJdID0gIlx1MDY0QVx1MDYyQyI7CisgIHRbIlx1RkNEQiJdID0gIlx1MDY0QVx1MDYyRCI7CisgIHRbIlx1RkNEQyJdID0gIlx1MDY0QVx1MDYyRSI7CisgIHRbIlx1RkNERCJdID0gIlx1MDY0QVx1MDY0NSI7CisgIHRbIlx1RkNERSJdID0gIlx1MDY0QVx1MDY0NyI7CisgIHRbIlx1RkNERiJdID0gIlx1MDYyNlx1MDY0NSI7CisgIHRbIlx1RkNFMCJdID0gIlx1MDYyNlx1MDY0NyI7CisgIHRbIlx1RkNFMSJdID0gIlx1MDYyOFx1MDY0NSI7CisgIHRbIlx1RkNFMiJdID0gIlx1MDYyOFx1MDY0NyI7CisgIHRbIlx1RkNFMyJdID0gIlx1MDYyQVx1MDY0NSI7CisgIHRbIlx1RkNFNCJdID0gIlx1MDYyQVx1MDY0NyI7CisgIHRbIlx1RkNFNSJdID0gIlx1MDYyQlx1MDY0NSI7CisgIHRbIlx1RkNFNiJdID0gIlx1MDYyQlx1MDY0NyI7CisgIHRbIlx1RkNFNyJdID0gIlx1MDYzM1x1MDY0NSI7CisgIHRbIlx1RkNFOCJdID0gIlx1MDYzM1x1MDY0NyI7CisgIHRbIlx1RkNFOSJdID0gIlx1MDYzNFx1MDY0NSI7CisgIHRbIlx1RkNFQSJdID0gIlx1MDYzNFx1MDY0NyI7CisgIHRbIlx1RkNFQiJdID0gIlx1MDY0M1x1MDY0NCI7CisgIHRbIlx1RkNFQyJdID0gIlx1MDY0M1x1MDY0NSI7CisgIHRbIlx1RkNFRCJdID0gIlx1MDY0NFx1MDY0NSI7CisgIHRbIlx1RkNFRSJdID0gIlx1MDY0Nlx1MDY0NSI7CisgIHRbIlx1RkNFRiJdID0gIlx1MDY0Nlx1MDY0NyI7CisgIHRbIlx1RkNGMCJdID0gIlx1MDY0QVx1MDY0NSI7CisgIHRbIlx1RkNGMSJdID0gIlx1MDY0QVx1MDY0NyI7CisgIHRbIlx1RkNGMiJdID0gIlx1MDY0MFx1MDY0RVx1MDY1MSI7CisgIHRbIlx1RkNGMyJdID0gIlx1MDY0MFx1MDY0Rlx1MDY1MSI7CisgIHRbIlx1RkNGNCJdID0gIlx1MDY0MFx1MDY1MFx1MDY1MSI7CisgIHRbIlx1RkNGNSJdID0gIlx1MDYzN1x1MDY0OSI7CisgIHRbIlx1RkNGNiJdID0gIlx1MDYzN1x1MDY0QSI7CisgIHRbIlx1RkNGNyJdID0gIlx1MDYzOVx1MDY0OSI7CisgIHRbIlx1RkNGOCJdID0gIlx1MDYzOVx1MDY0QSI7CisgIHRbIlx1RkNGOSJdID0gIlx1MDYzQVx1MDY0OSI7CisgIHRbIlx1RkNGQSJdID0gIlx1MDYzQVx1MDY0QSI7CisgIHRbIlx1RkNGQiJdID0gIlx1MDYzM1x1MDY0OSI7CisgIHRbIlx1RkNGQyJdID0gIlx1MDYzM1x1MDY0QSI7CisgIHRbIlx1RkNGRCJdID0gIlx1MDYzNFx1MDY0OSI7CisgIHRbIlx1RkNGRSJdID0gIlx1MDYzNFx1MDY0QSI7CisgIHRbIlx1RkNGRiJdID0gIlx1MDYyRFx1MDY0OSI7CisgIHRbIlx1RkQwMCJdID0gIlx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkQwMSJdID0gIlx1MDYyQ1x1MDY0OSI7CisgIHRbIlx1RkQwMiJdID0gIlx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkQwMyJdID0gIlx1MDYyRVx1MDY0OSI7CisgIHRbIlx1RkQwNCJdID0gIlx1MDYyRVx1MDY0QSI7CisgIHRbIlx1RkQwNSJdID0gIlx1MDYzNVx1MDY0OSI7CisgIHRbIlx1RkQwNiJdID0gIlx1MDYzNVx1MDY0QSI7CisgIHRbIlx1RkQwNyJdID0gIlx1MDYzNlx1MDY0OSI7CisgIHRbIlx1RkQwOCJdID0gIlx1MDYzNlx1MDY0QSI7CisgIHRbIlx1RkQwOSJdID0gIlx1MDYzNFx1MDYyQyI7CisgIHRbIlx1RkQwQSJdID0gIlx1MDYzNFx1MDYyRCI7CisgIHRbIlx1RkQwQiJdID0gIlx1MDYzNFx1MDYyRSI7CisgIHRbIlx1RkQwQyJdID0gIlx1MDYzNFx1MDY0NSI7CisgIHRbIlx1RkQwRCJdID0gIlx1MDYzNFx1MDYzMSI7CisgIHRbIlx1RkQwRSJdID0gIlx1MDYzM1x1MDYzMSI7CisgIHRbIlx1RkQwRiJdID0gIlx1MDYzNVx1MDYzMSI7CisgIHRbIlx1RkQxMCJdID0gIlx1MDYzNlx1MDYzMSI7CisgIHRbIlx1RkQxMSJdID0gIlx1MDYzN1x1MDY0OSI7CisgIHRbIlx1RkQxMiJdID0gIlx1MDYzN1x1MDY0QSI7CisgIHRbIlx1RkQxMyJdID0gIlx1MDYzOVx1MDY0OSI7CisgIHRbIlx1RkQxNCJdID0gIlx1MDYzOVx1MDY0QSI7CisgIHRbIlx1RkQxNSJdID0gIlx1MDYzQVx1MDY0OSI7CisgIHRbIlx1RkQxNiJdID0gIlx1MDYzQVx1MDY0QSI7CisgIHRbIlx1RkQxNyJdID0gIlx1MDYzM1x1MDY0OSI7CisgIHRbIlx1RkQxOCJdID0gIlx1MDYzM1x1MDY0QSI7CisgIHRbIlx1RkQxOSJdID0gIlx1MDYzNFx1MDY0OSI7CisgIHRbIlx1RkQxQSJdID0gIlx1MDYzNFx1MDY0QSI7CisgIHRbIlx1RkQxQiJdID0gIlx1MDYyRFx1MDY0OSI7CisgIHRbIlx1RkQxQyJdID0gIlx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkQxRCJdID0gIlx1MDYyQ1x1MDY0OSI7CisgIHRbIlx1RkQxRSJdID0gIlx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkQxRiJdID0gIlx1MDYyRVx1MDY0OSI7CisgIHRbIlx1RkQyMCJdID0gIlx1MDYyRVx1MDY0QSI7CisgIHRbIlx1RkQyMSJdID0gIlx1MDYzNVx1MDY0OSI7CisgIHRbIlx1RkQyMiJdID0gIlx1MDYzNVx1MDY0QSI7CisgIHRbIlx1RkQyMyJdID0gIlx1MDYzNlx1MDY0OSI7CisgIHRbIlx1RkQyNCJdID0gIlx1MDYzNlx1MDY0QSI7CisgIHRbIlx1RkQyNSJdID0gIlx1MDYzNFx1MDYyQyI7CisgIHRbIlx1RkQyNiJdID0gIlx1MDYzNFx1MDYyRCI7CisgIHRbIlx1RkQyNyJdID0gIlx1MDYzNFx1MDYyRSI7CisgIHRbIlx1RkQyOCJdID0gIlx1MDYzNFx1MDY0NSI7CisgIHRbIlx1RkQyOSJdID0gIlx1MDYzNFx1MDYzMSI7CisgIHRbIlx1RkQyQSJdID0gIlx1MDYzM1x1MDYzMSI7CisgIHRbIlx1RkQyQiJdID0gIlx1MDYzNVx1MDYzMSI7CisgIHRbIlx1RkQyQyJdID0gIlx1MDYzNlx1MDYzMSI7CisgIHRbIlx1RkQyRCJdID0gIlx1MDYzNFx1MDYyQyI7CisgIHRbIlx1RkQyRSJdID0gIlx1MDYzNFx1MDYyRCI7CisgIHRbIlx1RkQyRiJdID0gIlx1MDYzNFx1MDYyRSI7CisgIHRbIlx1RkQzMCJdID0gIlx1MDYzNFx1MDY0NSI7CisgIHRbIlx1RkQzMSJdID0gIlx1MDYzM1x1MDY0NyI7CisgIHRbIlx1RkQzMiJdID0gIlx1MDYzNFx1MDY0NyI7CisgIHRbIlx1RkQzMyJdID0gIlx1MDYzN1x1MDY0NSI7CisgIHRbIlx1RkQzNCJdID0gIlx1MDYzM1x1MDYyQyI7CisgIHRbIlx1RkQzNSJdID0gIlx1MDYzM1x1MDYyRCI7CisgIHRbIlx1RkQzNiJdID0gIlx1MDYzM1x1MDYyRSI7CisgIHRbIlx1RkQzNyJdID0gIlx1MDYzNFx1MDYyQyI7CisgIHRbIlx1RkQzOCJdID0gIlx1MDYzNFx1MDYyRCI7CisgIHRbIlx1RkQzOSJdID0gIlx1MDYzNFx1MDYyRSI7CisgIHRbIlx1RkQzQSJdID0gIlx1MDYzN1x1MDY0NSI7CisgIHRbIlx1RkQzQiJdID0gIlx1MDYzOFx1MDY0NSI7CisgIHRbIlx1RkQzQyJdID0gIlx1MDYyN1x1MDY0QiI7CisgIHRbIlx1RkQzRCJdID0gIlx1MDYyN1x1MDY0QiI7CisgIHRbIlx1RkQ1MCJdID0gIlx1MDYyQVx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkQ1MSJdID0gIlx1MDYyQVx1MDYyRFx1MDYyQyI7CisgIHRbIlx1RkQ1MiJdID0gIlx1MDYyQVx1MDYyRFx1MDYyQyI7CisgIHRbIlx1RkQ1MyJdID0gIlx1MDYyQVx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkQ1NCJdID0gIlx1MDYyQVx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkQ1NSJdID0gIlx1MDYyQVx1MDY0NVx1MDYyQyI7CisgIHRbIlx1RkQ1NiJdID0gIlx1MDYyQVx1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ1NyJdID0gIlx1MDYyQVx1MDY0NVx1MDYyRSI7CisgIHRbIlx1RkQ1OCJdID0gIlx1MDYyQ1x1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ1OSJdID0gIlx1MDYyQ1x1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ1QSJdID0gIlx1MDYyRFx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkQ1QiJdID0gIlx1MDYyRFx1MDY0NVx1MDY0OSI7CisgIHRbIlx1RkQ1QyJdID0gIlx1MDYzM1x1MDYyRFx1MDYyQyI7CisgIHRbIlx1RkQ1RCJdID0gIlx1MDYzM1x1MDYyQ1x1MDYyRCI7CisgIHRbIlx1RkQ1RSJdID0gIlx1MDYzM1x1MDYyQ1x1MDY0OSI7CisgIHRbIlx1RkQ1RiJdID0gIlx1MDYzM1x1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ2MCJdID0gIlx1MDYzM1x1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ2MSJdID0gIlx1MDYzM1x1MDY0NVx1MDYyQyI7CisgIHRbIlx1RkQ2MiJdID0gIlx1MDYzM1x1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ2MyJdID0gIlx1MDYzM1x1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ2NCJdID0gIlx1MDYzNVx1MDYyRFx1MDYyRCI7CisgIHRbIlx1RkQ2NSJdID0gIlx1MDYzNVx1MDYyRFx1MDYyRCI7CisgIHRbIlx1RkQ2NiJdID0gIlx1MDYzNVx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ2NyJdID0gIlx1MDYzNFx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkQ2OCJdID0gIlx1MDYzNFx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkQ2OSJdID0gIlx1MDYzNFx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkQ2QSJdID0gIlx1MDYzNFx1MDY0NVx1MDYyRSI7CisgIHRbIlx1RkQ2QiJdID0gIlx1MDYzNFx1MDY0NVx1MDYyRSI7CisgIHRbIlx1RkQ2QyJdID0gIlx1MDYzNFx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ2RCJdID0gIlx1MDYzNFx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ2RSJdID0gIlx1MDYzNlx1MDYyRFx1MDY0OSI7CisgIHRbIlx1RkQ2RiJdID0gIlx1MDYzNlx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkQ3MCJdID0gIlx1MDYzNlx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkQ3MSJdID0gIlx1MDYzN1x1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ3MiJdID0gIlx1MDYzN1x1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ3MyJdID0gIlx1MDYzN1x1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ3NCJdID0gIlx1MDYzN1x1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkQ3NSJdID0gIlx1MDYzOVx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkQ3NiJdID0gIlx1MDYzOVx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ3NyJdID0gIlx1MDYzOVx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ3OCJdID0gIlx1MDYzOVx1MDY0NVx1MDY0OSI7CisgIHRbIlx1RkQ3OSJdID0gIlx1MDYzQVx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ3QSJdID0gIlx1MDYzQVx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkQ3QiJdID0gIlx1MDYzQVx1MDY0NVx1MDY0OSI7CisgIHRbIlx1RkQ3QyJdID0gIlx1MDY0MVx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkQ3RCJdID0gIlx1MDY0MVx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkQ3RSJdID0gIlx1MDY0Mlx1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ3RiJdID0gIlx1MDY0Mlx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ4MCJdID0gIlx1MDY0NFx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkQ4MSJdID0gIlx1MDY0NFx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkQ4MiJdID0gIlx1MDY0NFx1MDYyRFx1MDY0OSI7CisgIHRbIlx1RkQ4MyJdID0gIlx1MDY0NFx1MDYyQ1x1MDYyQyI7CisgIHRbIlx1RkQ4NCJdID0gIlx1MDY0NFx1MDYyQ1x1MDYyQyI7CisgIHRbIlx1RkQ4NSJdID0gIlx1MDY0NFx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkQ4NiJdID0gIlx1MDY0NFx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkQ4NyJdID0gIlx1MDY0NFx1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ4OCJdID0gIlx1MDY0NFx1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkQ4OSJdID0gIlx1MDY0NVx1MDYyRFx1MDYyQyI7CisgIHRbIlx1RkQ4QSJdID0gIlx1MDY0NVx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkQ4QiJdID0gIlx1MDY0NVx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkQ4QyJdID0gIlx1MDY0NVx1MDYyQ1x1MDYyRCI7CisgIHRbIlx1RkQ4RCJdID0gIlx1MDY0NVx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkQ4RSJdID0gIlx1MDY0NVx1MDYyRVx1MDYyQyI7CisgIHRbIlx1RkQ4RiJdID0gIlx1MDY0NVx1MDYyRVx1MDY0NSI7CisgIHRbIlx1RkQ5MiJdID0gIlx1MDY0NVx1MDYyQ1x1MDYyRSI7CisgIHRbIlx1RkQ5MyJdID0gIlx1MDY0N1x1MDY0NVx1MDYyQyI7CisgIHRbIlx1RkQ5NCJdID0gIlx1MDY0N1x1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ5NSJdID0gIlx1MDY0Nlx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkQ5NiJdID0gIlx1MDY0Nlx1MDYyRFx1MDY0OSI7CisgIHRbIlx1RkQ5NyJdID0gIlx1MDY0Nlx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkQ5OCJdID0gIlx1MDY0Nlx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkQ5OSJdID0gIlx1MDY0Nlx1MDYyQ1x1MDY0OSI7CisgIHRbIlx1RkQ5QSJdID0gIlx1MDY0Nlx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkQ5QiJdID0gIlx1MDY0Nlx1MDY0NVx1MDY0OSI7CisgIHRbIlx1RkQ5QyJdID0gIlx1MDY0QVx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ5RCJdID0gIlx1MDY0QVx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkQ5RSJdID0gIlx1MDYyOFx1MDYyRVx1MDY0QSI7CisgIHRbIlx1RkQ5RiJdID0gIlx1MDYyQVx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkRBMCJdID0gIlx1MDYyQVx1MDYyQ1x1MDY0OSI7CisgIHRbIlx1RkRBMSJdID0gIlx1MDYyQVx1MDYyRVx1MDY0QSI7CisgIHRbIlx1RkRBMiJdID0gIlx1MDYyQVx1MDYyRVx1MDY0OSI7CisgIHRbIlx1RkRBMyJdID0gIlx1MDYyQVx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRBNCJdID0gIlx1MDYyQVx1MDY0NVx1MDY0OSI7CisgIHRbIlx1RkRBNSJdID0gIlx1MDYyQ1x1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRBNiJdID0gIlx1MDYyQ1x1MDYyRFx1MDY0OSI7CisgIHRbIlx1RkRBNyJdID0gIlx1MDYyQ1x1MDY0NVx1MDY0OSI7CisgIHRbIlx1RkRBOCJdID0gIlx1MDYzM1x1MDYyRVx1MDY0OSI7CisgIHRbIlx1RkRBOSJdID0gIlx1MDYzNVx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkRBQSJdID0gIlx1MDYzNFx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkRBQiJdID0gIlx1MDYzNlx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkRBQyJdID0gIlx1MDY0NFx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkRBRCJdID0gIlx1MDY0NFx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRBRSJdID0gIlx1MDY0QVx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkRBRiJdID0gIlx1MDY0QVx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkRCMCJdID0gIlx1MDY0QVx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRCMSJdID0gIlx1MDY0NVx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRCMiJdID0gIlx1MDY0Mlx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRCMyJdID0gIlx1MDY0Nlx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkRCNCJdID0gIlx1MDY0Mlx1MDY0NVx1MDYyRCI7CisgIHRbIlx1RkRCNSJdID0gIlx1MDY0NFx1MDYyRFx1MDY0NSI7CisgIHRbIlx1RkRCNiJdID0gIlx1MDYzOVx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRCNyJdID0gIlx1MDY0M1x1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRCOCJdID0gIlx1MDY0Nlx1MDYyQ1x1MDYyRCI7CisgIHRbIlx1RkRCOSJdID0gIlx1MDY0NVx1MDYyRVx1MDY0QSI7CisgIHRbIlx1RkRCQSJdID0gIlx1MDY0NFx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkRCQiJdID0gIlx1MDY0M1x1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkRCQyJdID0gIlx1MDY0NFx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkRCRCJdID0gIlx1MDY0Nlx1MDYyQ1x1MDYyRCI7CisgIHRbIlx1RkRCRSJdID0gIlx1MDYyQ1x1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkRCRiJdID0gIlx1MDYyRFx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkRDMCJdID0gIlx1MDY0NVx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkRDMSJdID0gIlx1MDY0MVx1MDY0NVx1MDY0QSI7CisgIHRbIlx1RkRDMiJdID0gIlx1MDYyOFx1MDYyRFx1MDY0QSI7CisgIHRbIlx1RkRDMyJdID0gIlx1MDY0M1x1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkRDNCJdID0gIlx1MDYzOVx1MDYyQ1x1MDY0NSI7CisgIHRbIlx1RkRDNSJdID0gIlx1MDYzNVx1MDY0NVx1MDY0NSI7CisgIHRbIlx1RkRDNiJdID0gIlx1MDYzM1x1MDYyRVx1MDY0QSI7CisgIHRbIlx1RkRDNyJdID0gIlx1MDY0Nlx1MDYyQ1x1MDY0QSI7CisgIHRbIlx1RkU0OSJdID0gIlx1MjAzRSI7CisgIHRbIlx1RkU0QSJdID0gIlx1MjAzRSI7CisgIHRbIlx1RkU0QiJdID0gIlx1MjAzRSI7CisgIHRbIlx1RkU0QyJdID0gIlx1MjAzRSI7CisgIHRbIlx1RkU0RCJdID0gIlx1MDA1RiI7CisgIHRbIlx1RkU0RSJdID0gIlx1MDA1RiI7CisgIHRbIlx1RkU0RiJdID0gIlx1MDA1RiI7CisgIHRbIlx1RkU4MCJdID0gIlx1MDYyMSI7CisgIHRbIlx1RkU4MSJdID0gIlx1MDYyMiI7CisgIHRbIlx1RkU4MiJdID0gIlx1MDYyMiI7CisgIHRbIlx1RkU4MyJdID0gIlx1MDYyMyI7CisgIHRbIlx1RkU4NCJdID0gIlx1MDYyMyI7CisgIHRbIlx1RkU4NSJdID0gIlx1MDYyNCI7CisgIHRbIlx1RkU4NiJdID0gIlx1MDYyNCI7CisgIHRbIlx1RkU4NyJdID0gIlx1MDYyNSI7CisgIHRbIlx1RkU4OCJdID0gIlx1MDYyNSI7CisgIHRbIlx1RkU4OSJdID0gIlx1MDYyNiI7CisgIHRbIlx1RkU4QSJdID0gIlx1MDYyNiI7CisgIHRbIlx1RkU4QiJdID0gIlx1MDYyNiI7CisgIHRbIlx1RkU4QyJdID0gIlx1MDYyNiI7CisgIHRbIlx1RkU4RCJdID0gIlx1MDYyNyI7CisgIHRbIlx1RkU4RSJdID0gIlx1MDYyNyI7CisgIHRbIlx1RkU4RiJdID0gIlx1MDYyOCI7CisgIHRbIlx1RkU5MCJdID0gIlx1MDYyOCI7CisgIHRbIlx1RkU5MSJdID0gIlx1MDYyOCI7CisgIHRbIlx1RkU5MiJdID0gIlx1MDYyOCI7CisgIHRbIlx1RkU5MyJdID0gIlx1MDYyOSI7CisgIHRbIlx1RkU5NCJdID0gIlx1MDYyOSI7CisgIHRbIlx1RkU5NSJdID0gIlx1MDYyQSI7CisgIHRbIlx1RkU5NiJdID0gIlx1MDYyQSI7CisgIHRbIlx1RkU5NyJdID0gIlx1MDYyQSI7CisgIHRbIlx1RkU5OCJdID0gIlx1MDYyQSI7CisgIHRbIlx1RkU5OSJdID0gIlx1MDYyQiI7CisgIHRbIlx1RkU5QSJdID0gIlx1MDYyQiI7CisgIHRbIlx1RkU5QiJdID0gIlx1MDYyQiI7CisgIHRbIlx1RkU5QyJdID0gIlx1MDYyQiI7CisgIHRbIlx1RkU5RCJdID0gIlx1MDYyQyI7CisgIHRbIlx1RkU5RSJdID0gIlx1MDYyQyI7CisgIHRbIlx1RkU5RiJdID0gIlx1MDYyQyI7CisgIHRbIlx1RkVBMCJdID0gIlx1MDYyQyI7CisgIHRbIlx1RkVBMSJdID0gIlx1MDYyRCI7CisgIHRbIlx1RkVBMiJdID0gIlx1MDYyRCI7CisgIHRbIlx1RkVBMyJdID0gIlx1MDYyRCI7CisgIHRbIlx1RkVBNCJdID0gIlx1MDYyRCI7CisgIHRbIlx1RkVBNSJdID0gIlx1MDYyRSI7CisgIHRbIlx1RkVBNiJdID0gIlx1MDYyRSI7CisgIHRbIlx1RkVBNyJdID0gIlx1MDYyRSI7CisgIHRbIlx1RkVBOCJdID0gIlx1MDYyRSI7CisgIHRbIlx1RkVBOSJdID0gIlx1MDYyRiI7CisgIHRbIlx1RkVBQSJdID0gIlx1MDYyRiI7CisgIHRbIlx1RkVBQiJdID0gIlx1MDYzMCI7CisgIHRbIlx1RkVBQyJdID0gIlx1MDYzMCI7CisgIHRbIlx1RkVBRCJdID0gIlx1MDYzMSI7CisgIHRbIlx1RkVBRSJdID0gIlx1MDYzMSI7CisgIHRbIlx1RkVBRiJdID0gIlx1MDYzMiI7CisgIHRbIlx1RkVCMCJdID0gIlx1MDYzMiI7CisgIHRbIlx1RkVCMSJdID0gIlx1MDYzMyI7CisgIHRbIlx1RkVCMiJdID0gIlx1MDYzMyI7CisgIHRbIlx1RkVCMyJdID0gIlx1MDYzMyI7CisgIHRbIlx1RkVCNCJdID0gIlx1MDYzMyI7CisgIHRbIlx1RkVCNSJdID0gIlx1MDYzNCI7CisgIHRbIlx1RkVCNiJdID0gIlx1MDYzNCI7CisgIHRbIlx1RkVCNyJdID0gIlx1MDYzNCI7CisgIHRbIlx1RkVCOCJdID0gIlx1MDYzNCI7CisgIHRbIlx1RkVCOSJdID0gIlx1MDYzNSI7CisgIHRbIlx1RkVCQSJdID0gIlx1MDYzNSI7CisgIHRbIlx1RkVCQiJdID0gIlx1MDYzNSI7CisgIHRbIlx1RkVCQyJdID0gIlx1MDYzNSI7CisgIHRbIlx1RkVCRCJdID0gIlx1MDYzNiI7CisgIHRbIlx1RkVCRSJdID0gIlx1MDYzNiI7CisgIHRbIlx1RkVCRiJdID0gIlx1MDYzNiI7CisgIHRbIlx1RkVDMCJdID0gIlx1MDYzNiI7CisgIHRbIlx1RkVDMSJdID0gIlx1MDYzNyI7CisgIHRbIlx1RkVDMiJdID0gIlx1MDYzNyI7CisgIHRbIlx1RkVDMyJdID0gIlx1MDYzNyI7CisgIHRbIlx1RkVDNCJdID0gIlx1MDYzNyI7CisgIHRbIlx1RkVDNSJdID0gIlx1MDYzOCI7CisgIHRbIlx1RkVDNiJdID0gIlx1MDYzOCI7CisgIHRbIlx1RkVDNyJdID0gIlx1MDYzOCI7CisgIHRbIlx1RkVDOCJdID0gIlx1MDYzOCI7CisgIHRbIlx1RkVDOSJdID0gIlx1MDYzOSI7CisgIHRbIlx1RkVDQSJdID0gIlx1MDYzOSI7CisgIHRbIlx1RkVDQiJdID0gIlx1MDYzOSI7CisgIHRbIlx1RkVDQyJdID0gIlx1MDYzOSI7CisgIHRbIlx1RkVDRCJdID0gIlx1MDYzQSI7CisgIHRbIlx1RkVDRSJdID0gIlx1MDYzQSI7CisgIHRbIlx1RkVDRiJdID0gIlx1MDYzQSI7CisgIHRbIlx1RkVEMCJdID0gIlx1MDYzQSI7CisgIHRbIlx1RkVEMSJdID0gIlx1MDY0MSI7CisgIHRbIlx1RkVEMiJdID0gIlx1MDY0MSI7CisgIHRbIlx1RkVEMyJdID0gIlx1MDY0MSI7CisgIHRbIlx1RkVENCJdID0gIlx1MDY0MSI7CisgIHRbIlx1RkVENSJdID0gIlx1MDY0MiI7CisgIHRbIlx1RkVENiJdID0gIlx1MDY0MiI7CisgIHRbIlx1RkVENyJdID0gIlx1MDY0MiI7CisgIHRbIlx1RkVEOCJdID0gIlx1MDY0MiI7CisgIHRbIlx1RkVEOSJdID0gIlx1MDY0MyI7CisgIHRbIlx1RkVEQSJdID0gIlx1MDY0MyI7CisgIHRbIlx1RkVEQiJdID0gIlx1MDY0MyI7CisgIHRbIlx1RkVEQyJdID0gIlx1MDY0MyI7CisgIHRbIlx1RkVERCJdID0gIlx1MDY0NCI7CisgIHRbIlx1RkVERSJdID0gIlx1MDY0NCI7CisgIHRbIlx1RkVERiJdID0gIlx1MDY0NCI7CisgIHRbIlx1RkVFMCJdID0gIlx1MDY0NCI7CisgIHRbIlx1RkVFMSJdID0gIlx1MDY0NSI7CisgIHRbIlx1RkVFMiJdID0gIlx1MDY0NSI7CisgIHRbIlx1RkVFMyJdID0gIlx1MDY0NSI7CisgIHRbIlx1RkVFNCJdID0gIlx1MDY0NSI7CisgIHRbIlx1RkVFNSJdID0gIlx1MDY0NiI7CisgIHRbIlx1RkVFNiJdID0gIlx1MDY0NiI7CisgIHRbIlx1RkVFNyJdID0gIlx1MDY0NiI7CisgIHRbIlx1RkVFOCJdID0gIlx1MDY0NiI7CisgIHRbIlx1RkVFOSJdID0gIlx1MDY0NyI7CisgIHRbIlx1RkVFQSJdID0gIlx1MDY0NyI7CisgIHRbIlx1RkVFQiJdID0gIlx1MDY0NyI7CisgIHRbIlx1RkVFQyJdID0gIlx1MDY0NyI7CisgIHRbIlx1RkVFRCJdID0gIlx1MDY0OCI7CisgIHRbIlx1RkVFRSJdID0gIlx1MDY0OCI7CisgIHRbIlx1RkVFRiJdID0gIlx1MDY0OSI7CisgIHRbIlx1RkVGMCJdID0gIlx1MDY0OSI7CisgIHRbIlx1RkVGMSJdID0gIlx1MDY0QSI7CisgIHRbIlx1RkVGMiJdID0gIlx1MDY0QSI7CisgIHRbIlx1RkVGMyJdID0gIlx1MDY0QSI7CisgIHRbIlx1RkVGNCJdID0gIlx1MDY0QSI7CisgIHRbIlx1RkVGNSJdID0gIlx1MDY0NFx1MDYyMiI7CisgIHRbIlx1RkVGNiJdID0gIlx1MDY0NFx1MDYyMiI7CisgIHRbIlx1RkVGNyJdID0gIlx1MDY0NFx1MDYyMyI7CisgIHRbIlx1RkVGOCJdID0gIlx1MDY0NFx1MDYyMyI7CisgIHRbIlx1RkVGOSJdID0gIlx1MDY0NFx1MDYyNSI7CisgIHRbIlx1RkVGQSJdID0gIlx1MDY0NFx1MDYyNSI7CisgIHRbIlx1RkVGQiJdID0gIlx1MDY0NFx1MDYyNyI7CisgIHRbIlx1RkVGQyJdID0gIlx1MDY0NFx1MDYyNyI7Cit9KTsKKworZnVuY3Rpb24gcmV2ZXJzZUlmUnRsKGNoYXJzKSB7CisgIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDsKKworICBpZiAoY2hhcnNMZW5ndGggPD0gMSB8fCAhaXNSVExSYW5nZUZvcihjaGFycy5jaGFyQ29kZUF0KDApKSkgeworICAgIHJldHVybiBjaGFyczsKKyAgfQorCisgIHZhciBzID0gIiI7CisKKyAgZm9yICh2YXIgaWkgPSBjaGFyc0xlbmd0aCAtIDE7IGlpID49IDA7IGlpLS0pIHsKKyAgICBzICs9IGNoYXJzW2lpXTsKKyAgfQorCisgIHJldHVybiBzOworfQorCitleHBvcnRzLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzID0gbWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXM7CitleHBvcnRzLnJldmVyc2VJZlJ0bCA9IHJldmVyc2VJZlJ0bDsKK2V4cG9ydHMuZ2V0VW5pY29kZVJhbmdlRm9yID0gZ2V0VW5pY29kZVJhbmdlRm9yOworZXhwb3J0cy5nZXROb3JtYWxpemVkVW5pY29kZXMgPSBnZXROb3JtYWxpemVkVW5pY29kZXM7CitleHBvcnRzLmdldFVuaWNvZGVGb3JHbHlwaCA9IGdldFVuaWNvZGVGb3JHbHlwaDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29yZS93b3JrZXIuanMgYi9saWIvY29yZS93b3JrZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjZjdkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL3dvcmtlci5qcwpAQCAtMCwwICsxLDYyMyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBleHBvcnRzLldvcmtlclRhc2sgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4vcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX3BkZl9tYW5hZ2VyID0gcmVxdWlyZSgiLi9wZGZfbWFuYWdlci5qcyIpOworCit2YXIgX3dyaXRlciA9IHJlcXVpcmUoIi4vd3JpdGVyLmpzIik7CisKK3ZhciBfaXNfbm9kZSA9IHJlcXVpcmUoIi4uL3NoYXJlZC9pc19ub2RlLmpzIik7CisKK3ZhciBfbWVzc2FnZV9oYW5kbGVyID0gcmVxdWlyZSgiLi4vc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qcyIpOworCit2YXIgX3dvcmtlcl9zdHJlYW0gPSByZXF1aXJlKCIuL3dvcmtlcl9zdHJlYW0uanMiKTsKKwordmFyIF9jb3JlX3V0aWxzID0gcmVxdWlyZSgiLi9jb3JlX3V0aWxzLmpzIik7CisKK2NsYXNzIFdvcmtlclRhc2sgeworICBjb25zdHJ1Y3RvcihuYW1lKSB7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB0aGlzLnRlcm1pbmF0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9jYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICB9CisKKyAgZ2V0IGZpbmlzaGVkKCkgeworICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBmaW5pc2goKSB7CisgICAgdGhpcy5fY2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgIH0KKworICB0ZXJtaW5hdGUoKSB7CisgICAgdGhpcy50ZXJtaW5hdGVkID0gdHJ1ZTsKKyAgfQorCisgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKSB7CisgICAgaWYgKHRoaXMudGVybWluYXRlZCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgdGFzayB3YXMgdGVybWluYXRlZCIpOworICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuV29ya2VyVGFzayA9IFdvcmtlclRhc2s7CisKK2NsYXNzIFdvcmtlck1lc3NhZ2VIYW5kbGVyIHsKKyAgc3RhdGljIHNldHVwKGhhbmRsZXIsIHBvcnQpIHsKKyAgICB2YXIgdGVzdE1lc3NhZ2VQcm9jZXNzZWQgPSBmYWxzZTsKKyAgICBoYW5kbGVyLm9uKCJ0ZXN0IiwgZnVuY3Rpb24gd3BoU2V0dXBUZXN0KGRhdGEpIHsKKyAgICAgIGlmICh0ZXN0TWVzc2FnZVByb2Nlc3NlZCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gdHJ1ZTsKKworICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7CisgICAgICAgIGhhbmRsZXIuc2VuZCgidGVzdCIsIG51bGwpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IHN1cHBvcnRUcmFuc2ZlcnMgPSBkYXRhWzBdID09PSAyNTU7CisgICAgICBoYW5kbGVyLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gc3VwcG9ydFRyYW5zZmVyczsKKyAgICAgIGhhbmRsZXIuc2VuZCgidGVzdCIsIHsKKyAgICAgICAgc3VwcG9ydFRyYW5zZmVycworICAgICAgfSk7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiY29uZmlndXJlIiwgZnVuY3Rpb24gd3BoQ29uZmlndXJlKGRhdGEpIHsKKyAgICAgICgwLCBfdXRpbC5zZXRWZXJib3NpdHlMZXZlbCkoZGF0YS52ZXJib3NpdHkpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldERvY1JlcXVlc3QiLCBmdW5jdGlvbiB3cGhTZXR1cERvYyhkYXRhKSB7CisgICAgICByZXR1cm4gV29ya2VyTWVzc2FnZUhhbmRsZXIuY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGRhdGEsIHBvcnQpOworICAgIH0pOworICB9CisKKyAgc3RhdGljIGNyZWF0ZURvY3VtZW50SGFuZGxlcihkb2NQYXJhbXMsIHBvcnQpIHsKKyAgICB2YXIgcGRmTWFuYWdlcjsKKyAgICB2YXIgdGVybWluYXRlZCA9IGZhbHNlOworICAgIHZhciBjYW5jZWxYSFJzID0gbnVsbDsKKyAgICB2YXIgV29ya2VyVGFza3MgPSBbXTsKKyAgICBjb25zdCB2ZXJib3NpdHkgPSAoMCwgX3V0aWwuZ2V0VmVyYm9zaXR5TGV2ZWwpKCk7CisgICAgY29uc3QgYXBpVmVyc2lvbiA9IGRvY1BhcmFtcy5hcGlWZXJzaW9uOworICAgIGNvbnN0IHdvcmtlclZlcnNpb24gPSAnMi42LjM0Nyc7CisKKyAgICBpZiAoYXBpVmVyc2lvbiAhPT0gd29ya2VyVmVyc2lvbikgeworICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQVBJIHZlcnNpb24gIiR7YXBpVmVyc2lvbn0iIGRvZXMgbm90IG1hdGNoIGAgKyBgdGhlIFdvcmtlciB2ZXJzaW9uICIke3dvcmtlclZlcnNpb259Ii5gKTsKKyAgICB9CisKKyAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdOworCisgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBbXSkgeworICAgICAgZW51bWVyYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7CisgICAgfQorCisgICAgaWYgKGVudW1lcmFibGVQcm9wZXJ0aWVzLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYEFycmF5LnByb3RvdHlwZWAgY29udGFpbnMgdW5leHBlY3RlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXM6ICIgKyBlbnVtZXJhYmxlUHJvcGVydGllcy5qb2luKCIsICIpICsgIjsgdGh1cyBicmVha2luZyBlLmcuIGBmb3IuLi5pbmAgaXRlcmF0aW9uIG9mIGBBcnJheWBzLiIpOworICAgIH0KKworICAgIGlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICJ1bmRlZmluZWQiIHx8IHR5cGVvZiBQcm9taXNlLmFsbFNldHRsZWQgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBicm93c2VyL2Vudmlyb25tZW50IGxhY2tzIG5hdGl2ZSBzdXBwb3J0IGZvciBjcml0aWNhbCAiICsgImZ1bmN0aW9uYWxpdHkgdXNlZCBieSB0aGUgUERGLmpzIGxpYnJhcnkgKGUuZy4gIiArICJgUmVhZGFibGVTdHJlYW1gIGFuZC9vciBgUHJvbWlzZS5hbGxTZXR0bGVkYCk7ICIgKyAicGxlYXNlIHVzZSBhbiBFUzUtY29tcGF0aWJsZSBidWlsZCBpbnN0ZWFkLiIpOworICAgIH0KKworICAgIHZhciBkb2NJZCA9IGRvY1BhcmFtcy5kb2NJZDsKKyAgICB2YXIgZG9jQmFzZVVybCA9IGRvY1BhcmFtcy5kb2NCYXNlVXJsOworICAgIHZhciB3b3JrZXJIYW5kbGVyTmFtZSA9IGRvY1BhcmFtcy5kb2NJZCArICJfd29ya2VyIjsKKyAgICB2YXIgaGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKHdvcmtlckhhbmRsZXJOYW1lLCBkb2NJZCwgcG9ydCk7CisgICAgaGFuZGxlci5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IGRvY1BhcmFtcy5wb3N0TWVzc2FnZVRyYW5zZmVyczsKKworICAgIGZ1bmN0aW9uIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKSB7CisgICAgICBpZiAodGVybWluYXRlZCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHN0YXJ0V29ya2VyVGFzayh0YXNrKSB7CisgICAgICBXb3JrZXJUYXNrcy5wdXNoKHRhc2spOworICAgIH0KKworICAgIGZ1bmN0aW9uIGZpbmlzaFdvcmtlclRhc2sodGFzaykgeworICAgICAgdGFzay5maW5pc2goKTsKKyAgICAgIHZhciBpID0gV29ya2VyVGFza3MuaW5kZXhPZih0YXNrKTsKKyAgICAgIFdvcmtlclRhc2tzLnNwbGljZShpLCAxKTsKKyAgICB9CisKKyAgICBhc3luYyBmdW5jdGlvbiBsb2FkRG9jdW1lbnQocmVjb3ZlcnlNb2RlKSB7CisgICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tIZWFkZXIiKTsKKyAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJwYXJzZVN0YXJ0WFJlZiIpOworICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoInBhcnNlIiwgW3JlY292ZXJ5TW9kZV0pOworCisgICAgICBpZiAoIXJlY292ZXJ5TW9kZSkgeworICAgICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tGaXJzdFBhZ2UiKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgW251bVBhZ2VzLCBmaW5nZXJwcmludF0gPSBhd2FpdCBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmVEb2MoIm51bVBhZ2VzIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJmaW5nZXJwcmludCIpXSk7CisgICAgICByZXR1cm4geworICAgICAgICBudW1QYWdlcywKKyAgICAgICAgZmluZ2VycHJpbnQKKyAgICAgIH07CisgICAgfQorCisgICAgZnVuY3Rpb24gZ2V0UGRmTWFuYWdlcihkYXRhLCBldmFsdWF0b3JPcHRpb25zKSB7CisgICAgICB2YXIgcGRmTWFuYWdlckNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICBsZXQgbmV3UGRmTWFuYWdlcjsKKyAgICAgIHZhciBzb3VyY2UgPSBkYXRhLnNvdXJjZTsKKworICAgICAgaWYgKHNvdXJjZS5kYXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgbmV3UGRmTWFuYWdlciA9IG5ldyBfcGRmX21hbmFnZXIuTG9jYWxQZGZNYW5hZ2VyKGRvY0lkLCBzb3VyY2UuZGF0YSwgc291cmNlLnBhc3N3b3JkLCBldmFsdWF0b3JPcHRpb25zLCBkb2NCYXNlVXJsKTsKKyAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOworICAgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGRmTWFuYWdlckNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIH0KKworICAgICAgdmFyIHBkZlN0cmVhbSwKKyAgICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgcGRmU3RyZWFtID0gbmV3IF93b3JrZXJfc3RyZWFtLlBERldvcmtlclN0cmVhbShoYW5kbGVyKTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChleCk7CisgICAgICAgIHJldHVybiBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgfQorCisgICAgICB2YXIgZnVsbFJlcXVlc3QgPSBwZGZTdHJlYW0uZ2V0RnVsbFJlYWRlcigpOworICAgICAgZnVsbFJlcXVlc3QuaGVhZGVyc1JlYWR5LnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoIWZ1bGxSZXF1ZXN0LmlzUmFuZ2VTdXBwb3J0ZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGlzYWJsZUF1dG9GZXRjaCA9IHNvdXJjZS5kaXNhYmxlQXV0b0ZldGNoIHx8IGZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkOworICAgICAgICBuZXdQZGZNYW5hZ2VyID0gbmV3IF9wZGZfbWFuYWdlci5OZXR3b3JrUGRmTWFuYWdlcihkb2NJZCwgcGRmU3RyZWFtLCB7CisgICAgICAgICAgbXNnSGFuZGxlcjogaGFuZGxlciwKKyAgICAgICAgICBwYXNzd29yZDogc291cmNlLnBhc3N3b3JkLAorICAgICAgICAgIGxlbmd0aDogZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCwKKyAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoLAorICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiBzb3VyY2UucmFuZ2VDaHVua1NpemUKKyAgICAgICAgfSwgZXZhbHVhdG9yT3B0aW9ucywgZG9jQmFzZVVybCk7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRDaHVua3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEoY2FjaGVkQ2h1bmtzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhY2hlZENodW5rcyA9IFtdOworICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOworICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDsKKyAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CisgICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOworICAgICAgfSk7CisgICAgICB2YXIgbG9hZGVkID0gMDsKKworICAgICAgdmFyIGZsdXNoQ2h1bmtzID0gZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgcGRmRmlsZSA9ICgwLCBfdXRpbC5hcnJheXNUb0J5dGVzKShjYWNoZWRDaHVua3MpOworCisgICAgICAgIGlmIChzb3VyY2UubGVuZ3RoICYmIHBkZkZpbGUubGVuZ3RoICE9PSBzb3VyY2UubGVuZ3RoKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgbmV3UGRmTWFuYWdlciA9IG5ldyBfcGRmX21hbmFnZXIuTG9jYWxQZGZNYW5hZ2VyKGRvY0lkLCBwZGZGaWxlLCBzb3VyY2UucGFzc3dvcmQsIGV2YWx1YXRvck9wdGlvbnMsIGRvY0Jhc2VVcmwpOworICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlc29sdmUobmV3UGRmTWFuYWdlcik7CisgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhY2hlZENodW5rcyA9IFtdOworICAgICAgfTsKKworICAgICAgdmFyIHJlYWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgICAgICB2YXIgcmVhZENodW5rID0gZnVuY3Rpb24gKHsKKyAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICBkb25lCisgICAgICAgIH0pIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOworCisgICAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgICBpZiAoIW5ld1BkZk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBmbHVzaENodW5rcygpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9hZGVkICs9ICgwLCBfdXRpbC5hcnJheUJ5dGVMZW5ndGgpKHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKCFmdWxsUmVxdWVzdC5pc1N0cmVhbWluZ1N1cHBvcnRlZCkgeworICAgICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY1Byb2dyZXNzIiwgeworICAgICAgICAgICAgICAgIGxvYWRlZCwKKyAgICAgICAgICAgICAgICB0b3RhbDogTWF0aC5tYXgobG9hZGVkLCBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoIHx8IDApCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmV3UGRmTWFuYWdlcikgeworICAgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY2FjaGVkQ2h1bmtzLnB1c2godmFsdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CisgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgcmVqZWN0KGUpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CisgICAgICB9KTsKKyAgICAgIHJlYWRQcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7CisgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChlKTsKKyAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CisgICAgICB9KTsKKworICAgICAgY2FuY2VsWEhScyA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgcGRmU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbik7CisgICAgICB9OworCisgICAgICByZXR1cm4gcGRmTWFuYWdlckNhcGFiaWxpdHkucHJvbWlzZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzZXR1cERvYyhkYXRhKSB7CisgICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoZG9jKSB7CisgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKyAgICAgICAgaGFuZGxlci5zZW5kKCJHZXREb2MiLCB7CisgICAgICAgICAgcGRmSW5mbzogZG9jCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBvbkZhaWx1cmUoZXgpIHsKKyAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOworCisgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKSB7CisgICAgICAgICAgdmFyIHRhc2sgPSBuZXcgV29ya2VyVGFzayhgUGFzc3dvcmRFeGNlcHRpb246IHJlc3BvbnNlICR7ZXguY29kZX1gKTsKKyAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CisgICAgICAgICAgaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlBhc3N3b3JkUmVxdWVzdCIsIGV4KS50aGVuKGZ1bmN0aW9uICh7CisgICAgICAgICAgICBwYXNzd29yZAorICAgICAgICAgIH0pIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisgICAgICAgICAgICBwZGZNYW5hZ2VyLnVwZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgICAgICAgICAgIHBkZk1hbmFnZXJSZWFkeSgpOworICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisgICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIGV4KTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIF91dGlsLkludmFsaWRQREZFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKSB7CisgICAgICAgICAgaGFuZGxlci5zZW5kKCJEb2NFeGNlcHRpb24iLCBleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGFuZGxlci5zZW5kKCJEb2NFeGNlcHRpb24iLCBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBwZGZNYW5hZ2VyUmVhZHkoKSB7CisgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKyAgICAgICAgbG9hZERvY3VtZW50KGZhbHNlKS50aGVuKG9uU3VjY2VzcywgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKworICAgICAgICAgIGlmICghKHJlYXNvbiBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLlhSZWZQYXJzZUV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIG9uRmFpbHVyZShyZWFzb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpOworICAgICAgICAgIHBkZk1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKyAgICAgICAgICAgIGxvYWREb2N1bWVudCh0cnVlKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsdXJlKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKKyAgICAgIHZhciBldmFsdWF0b3JPcHRpb25zID0geworICAgICAgICBtYXhJbWFnZVNpemU6IGRhdGEubWF4SW1hZ2VTaXplLAorICAgICAgICBkaXNhYmxlRm9udEZhY2U6IGRhdGEuZGlzYWJsZUZvbnRGYWNlLAorICAgICAgICBpZ25vcmVFcnJvcnM6IGRhdGEuaWdub3JlRXJyb3JzLAorICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IGRhdGEuaXNFdmFsU3VwcG9ydGVkLAorICAgICAgICBmb250RXh0cmFQcm9wZXJ0aWVzOiBkYXRhLmZvbnRFeHRyYVByb3BlcnRpZXMKKyAgICAgIH07CisgICAgICBnZXRQZGZNYW5hZ2VyKGRhdGEsIGV2YWx1YXRvck9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKG5ld1BkZk1hbmFnZXIpIHsKKyAgICAgICAgaWYgKHRlcm1pbmF0ZWQpIHsKKyAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHBkZk1hbmFnZXIgPSBuZXdQZGZNYW5hZ2VyOworICAgICAgICBwZGZNYW5hZ2VyLm9uTG9hZGVkU3RyZWFtKCkudGhlbihmdW5jdGlvbiAoc3RyZWFtKSB7CisgICAgICAgICAgaGFuZGxlci5zZW5kKCJEYXRhTG9hZGVkIiwgeworICAgICAgICAgICAgbGVuZ3RoOiBzdHJlYW0uYnl0ZXMuYnl0ZUxlbmd0aAorICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0pLnRoZW4ocGRmTWFuYWdlclJlYWR5LCBvbkZhaWx1cmUpOworICAgIH0KKworICAgIGhhbmRsZXIub24oIkdldFBhZ2UiLCBmdW5jdGlvbiB3cGhTZXR1cEdldFBhZ2UoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShkYXRhLnBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgeworICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3BkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJyb3RhdGUiKSwgcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInJlZiIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAidXNlclVuaXQiKSwgcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInZpZXciKV0pLnRoZW4oZnVuY3Rpb24gKFtyb3RhdGUsIHJlZiwgdXNlclVuaXQsIHZpZXddKSB7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHJvdGF0ZSwKKyAgICAgICAgICAgIHJlZiwKKyAgICAgICAgICAgIHVzZXJVbml0LAorICAgICAgICAgICAgdmlldworICAgICAgICAgIH07CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0UGFnZUluZGV4IiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlSW5kZXgoeworICAgICAgcmVmCisgICAgfSkgeworICAgICAgY29uc3QgcGFnZVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQocmVmLm51bSwgcmVmLmdlbik7CisKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0RGVzdGluYXRpb25zIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXREZXN0aW5hdGlvbnMoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZGVzdGluYXRpb25zIik7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0RGVzdGluYXRpb24iLCBmdW5jdGlvbiB3cGhTZXR1cEdldERlc3RpbmF0aW9uKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldERlc3RpbmF0aW9uIiwgW2RhdGEuaWRdKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRQYWdlTGFiZWxzIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlTGFiZWxzKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYWJlbHMiKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRQYWdlTGF5b3V0IiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRQYWdlTGF5b3V0KGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYXlvdXQiKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRQYWdlTW9kZSIsIGZ1bmN0aW9uIHdwaFNldHVwR2V0UGFnZU1vZGUoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygicGFnZU1vZGUiKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXRWaWV3ZXJQcmVmZXJlbmNlcyIsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJ2aWV3ZXJQcmVmZXJlbmNlcyIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldE9wZW5BY3Rpb24iLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygib3BlbkFjdGlvbiIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldEF0dGFjaG1lbnRzIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRBdHRhY2htZW50cyhkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhdHRhY2htZW50cyIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldEphdmFTY3JpcHQiLCBmdW5jdGlvbiB3cGhTZXR1cEdldEphdmFTY3JpcHQoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiamF2YVNjcmlwdCIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldE91dGxpbmUiLCBmdW5jdGlvbiB3cGhTZXR1cEdldE91dGxpbmUoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZG9jdW1lbnRPdXRsaW5lIik7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnIiwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm9wdGlvbmFsQ29udGVudENvbmZpZyIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldFBlcm1pc3Npb25zIiwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBlcm1pc3Npb25zIik7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0TWV0YWRhdGEiLCBmdW5jdGlvbiB3cGhTZXR1cEdldE1ldGFkYXRhKGRhdGEpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmVEb2MoImRvY3VtZW50SW5mbyIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm1ldGFkYXRhIildKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJHZXREYXRhIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXREYXRhKGRhdGEpIHsKKyAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpOworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIub25Mb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uIChzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKKyAgICAgIH0pOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldFN0YXRzIiwgZnVuY3Rpb24gd3BoU2V0dXBHZXRTdGF0cyhkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVYUmVmKCJzdGF0cyIpOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkdldEFubm90YXRpb25zIiwgZnVuY3Rpb24gKHsKKyAgICAgIHBhZ2VJbmRleCwKKyAgICAgIGludGVudAorICAgIH0pIHsKKyAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICAgIHJldHVybiBwYWdlLmdldEFubm90YXRpb25zRGF0YShpbnRlbnQpOworICAgICAgfSk7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiU2F2ZURvY3VtZW50IiwgZnVuY3Rpb24gKHsKKyAgICAgIG51bVBhZ2VzLAorICAgICAgYW5ub3RhdGlvblN0b3JhZ2UsCisgICAgICBmaWxlbmFtZQorICAgIH0pIHsKKyAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpOworICAgICAgY29uc3QgcHJvbWlzZXMgPSBbcGRmTWFuYWdlci5vbkxvYWRlZFN0cmVhbSgpXTsKKyAgICAgIGNvbnN0IGRvY3VtZW50ID0gcGRmTWFuYWdlci5wZGZEb2N1bWVudDsKKworICAgICAgZm9yIChsZXQgcGFnZUluZGV4ID0gMDsgcGFnZUluZGV4IDwgbnVtUGFnZXM7IHBhZ2VJbmRleCsrKSB7CisgICAgICAgIHByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgeworICAgICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgU2F2ZTogcGFnZSAke3BhZ2VJbmRleH1gKTsKKyAgICAgICAgICByZXR1cm4gcGFnZS5zYXZlKGhhbmRsZXIsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICAgICAgfSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKFtzdHJlYW0sIC4uLnJlZnNdKSA9PiB7CisgICAgICAgIGxldCBuZXdSZWZzID0gW107CisKKyAgICAgICAgZm9yIChjb25zdCByZWYgb2YgcmVmcykgeworICAgICAgICAgIG5ld1JlZnMgPSByZWYuZmlsdGVyKHggPT4geCAhPT0gbnVsbCkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgbmV3UmVmcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3UmVmcy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICByZXR1cm4gc3RyZWFtLmJ5dGVzOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgeHJlZiA9IGRvY3VtZW50LnhyZWY7CisgICAgICAgIGxldCBuZXdYcmVmSW5mbyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgICAgaWYgKHhyZWYudHJhaWxlcikgeworICAgICAgICAgIGNvbnN0IF9pbmZvID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgICAgIGNvbnN0IHhyZWZJbmZvID0geHJlZi50cmFpbGVyLmdldCgiSW5mbyIpIHx8IG51bGw7CisKKyAgICAgICAgICBpZiAoeHJlZkluZm8pIHsKKyAgICAgICAgICAgIHhyZWZJbmZvLmZvckVhY2goKGtleSwgdmFsdWUpID0+IHsKKyAgICAgICAgICAgICAgaWYgKCgwLCBfdXRpbC5pc1N0cmluZykoa2V5KSAmJiAoMCwgX3V0aWwuaXNTdHJpbmcpKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIF9pbmZvW2tleV0gPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHZhbHVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgbmV3WHJlZkluZm8gPSB7CisgICAgICAgICAgICByb290UmVmOiB4cmVmLnRyYWlsZXIuZ2V0UmF3KCJSb290IikgfHwgbnVsbCwKKyAgICAgICAgICAgIGVuY3J5cHQ6IHhyZWYudHJhaWxlci5nZXRSYXcoIkVuY3J5cHQiKSB8fCBudWxsLAorICAgICAgICAgICAgbmV3UmVmOiB4cmVmLmdldE5ld1JlZigpLAorICAgICAgICAgICAgaW5mb1JlZjogeHJlZi50cmFpbGVyLmdldFJhdygiSW5mbyIpIHx8IG51bGwsCisgICAgICAgICAgICBpbmZvOiBfaW5mbywKKyAgICAgICAgICAgIGZpbGVJZHM6IHhyZWYudHJhaWxlci5nZXRSYXcoIklEIikgfHwgbnVsbCwKKyAgICAgICAgICAgIHN0YXJ0WFJlZjogZG9jdW1lbnQuc3RhcnRYUmVmLAorICAgICAgICAgICAgZmlsZW5hbWUKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgeHJlZi5yZXNldE5ld1JlZigpOworICAgICAgICByZXR1cm4gKDAsIF93cml0ZXIuaW5jcmVtZW50YWxVcGRhdGUpKHN0cmVhbS5ieXRlcywgbmV3WHJlZkluZm8sIG5ld1JlZnMpOworICAgICAgfSk7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiR2V0T3BlcmF0b3JMaXN0IiwgZnVuY3Rpb24gd3BoU2V0dXBSZW5kZXJQYWdlKGRhdGEsIHNpbmspIHsKKyAgICAgIHZhciBwYWdlSW5kZXggPSBkYXRhLnBhZ2VJbmRleDsKKyAgICAgIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKKyAgICAgICAgdmFyIHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0T3BlcmF0b3JMaXN0OiBwYWdlICR7cGFnZUluZGV4fWApOworICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CisgICAgICAgIGNvbnN0IHN0YXJ0ID0gdmVyYm9zaXR5ID49IF91dGlsLlZlcmJvc2l0eUxldmVsLklORk9TID8gRGF0ZS5ub3coKSA6IDA7CisgICAgICAgIHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgICBoYW5kbGVyLAorICAgICAgICAgIHNpbmssCisgICAgICAgICAgdGFzaywKKyAgICAgICAgICBpbnRlbnQ6IGRhdGEuaW50ZW50LAorICAgICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IGRhdGEucmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogZGF0YS5hbm5vdGF0aW9uU3RvcmFnZQorICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChvcGVyYXRvckxpc3RJbmZvKSB7CisgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKKworICAgICAgICAgIGlmIChzdGFydCkgeworICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBwYWdlPSR7cGFnZUluZGV4ICsgMX0gLSBnZXRPcGVyYXRvckxpc3Q6IHRpbWU9YCArIGAke0RhdGUubm93KCkgLSBzdGFydH1tcywgbGVuPSR7b3BlcmF0b3JMaXN0SW5mby5sZW5ndGh9YCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKKworICAgICAgICAgIGlmICh0YXNrLnRlcm1pbmF0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBoYW5kbGVyLnNlbmQoIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHsKKyAgICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JPcGVyYXRvckxpc3QKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfSwgdGhpcyk7CisgICAgaGFuZGxlci5vbigiR2V0VGV4dENvbnRlbnQiLCBmdW5jdGlvbiB3cGhFeHRyYWN0VGV4dChkYXRhLCBzaW5rKSB7CisgICAgICB2YXIgcGFnZUluZGV4ID0gZGF0YS5wYWdlSW5kZXg7CisKKyAgICAgIHNpbmsub25QdWxsID0gZnVuY3Rpb24gKGRlc2lyZWRTaXplKSB7fTsKKworICAgICAgc2luay5vbkNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHt9OworCisgICAgICBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICAgIHZhciB0YXNrID0gbmV3IFdvcmtlclRhc2soIkdldFRleHRDb250ZW50OiBwYWdlICIgKyBwYWdlSW5kZXgpOworICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CisgICAgICAgIGNvbnN0IHN0YXJ0ID0gdmVyYm9zaXR5ID49IF91dGlsLlZlcmJvc2l0eUxldmVsLklORk9TID8gRGF0ZS5ub3coKSA6IDA7CisgICAgICAgIHBhZ2UuZXh0cmFjdFRleHRDb250ZW50KHsKKyAgICAgICAgICBoYW5kbGVyLAorICAgICAgICAgIHRhc2ssCisgICAgICAgICAgc2luaywKKyAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiBkYXRhLm5vcm1hbGl6ZVdoaXRlc3BhY2UsCisgICAgICAgICAgY29tYmluZVRleHRJdGVtczogZGF0YS5jb21iaW5lVGV4dEl0ZW1zCisgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisKKyAgICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgcGFnZT0ke3BhZ2VJbmRleCArIDF9IC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9YCArIGAke0RhdGUubm93KCkgLSBzdGFydH1tc2ApOworICAgICAgICAgIH0KKworICAgICAgICAgIHNpbmsuY2xvc2UoKTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CisKKyAgICAgICAgICBpZiAodGFzay50ZXJtaW5hdGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgc2luay5lcnJvcihyZWFzb24pOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGhhbmRsZXIub24oIkZvbnRGYWxsYmFjayIsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICByZXR1cm4gcGRmTWFuYWdlci5mb250RmFsbGJhY2soZGF0YS5pZCwgaGFuZGxlcik7CisgICAgfSk7CisgICAgaGFuZGxlci5vbigiQ2xlYW51cCIsIGZ1bmN0aW9uIHdwaENsZWFudXAoZGF0YSkgeworICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuY2xlYW51cCh0cnVlKTsKKyAgICB9KTsKKyAgICBoYW5kbGVyLm9uKCJUZXJtaW5hdGUiLCBmdW5jdGlvbiB3cGhUZXJtaW5hdGUoZGF0YSkgeworICAgICAgdGVybWluYXRlZCA9IHRydWU7CisgICAgICBjb25zdCB3YWl0T24gPSBbXTsKKworICAgICAgaWYgKHBkZk1hbmFnZXIpIHsKKyAgICAgICAgcGRmTWFuYWdlci50ZXJtaW5hdGUobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOworICAgICAgICBjb25zdCBjbGVhbnVwUHJvbWlzZSA9IHBkZk1hbmFnZXIuY2xlYW51cCgpOworICAgICAgICB3YWl0T24ucHVzaChjbGVhbnVwUHJvbWlzZSk7CisgICAgICAgIHBkZk1hbmFnZXIgPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKDAsIF9wcmltaXRpdmVzLmNsZWFyUHJpbWl0aXZlQ2FjaGVzKSgpOworICAgICAgfQorCisgICAgICBpZiAoY2FuY2VsWEhScykgeworICAgICAgICBjYW5jZWxYSFJzKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTsKKyAgICAgIH0KKworICAgICAgV29ya2VyVGFza3MuZm9yRWFjaChmdW5jdGlvbiAodGFzaykgeworICAgICAgICB3YWl0T24ucHVzaCh0YXNrLmZpbmlzaGVkKTsKKyAgICAgICAgdGFzay50ZXJtaW5hdGUoKTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHdhaXRPbikudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGhhbmRsZXIuZGVzdHJveSgpOworICAgICAgICBoYW5kbGVyID0gbnVsbDsKKyAgICAgIH0pOworICAgIH0pOworICAgIGhhbmRsZXIub24oIlJlYWR5IiwgZnVuY3Rpb24gd3BoUmVhZHkoZGF0YSkgeworICAgICAgc2V0dXBEb2MoZG9jUGFyYW1zKTsKKyAgICAgIGRvY1BhcmFtcyA9IG51bGw7CisgICAgfSk7CisgICAgcmV0dXJuIHdvcmtlckhhbmRsZXJOYW1lOworICB9CisKKyAgc3RhdGljIGluaXRpYWxpemVGcm9tUG9ydChwb3J0KSB7CisgICAgdmFyIGhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcigid29ya2VyIiwgIm1haW4iLCBwb3J0KTsKKyAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cChoYW5kbGVyLCBwb3J0KTsKKyAgICBoYW5kbGVyLnNlbmQoInJlYWR5IiwgbnVsbCk7CisgIH0KKworfQorCitleHBvcnRzLldvcmtlck1lc3NhZ2VIYW5kbGVyID0gV29ya2VyTWVzc2FnZUhhbmRsZXI7CisKK2Z1bmN0aW9uIGlzTWVzc2FnZVBvcnQobWF5YmVQb3J0KSB7CisgIHJldHVybiB0eXBlb2YgbWF5YmVQb3J0LnBvc3RNZXNzYWdlID09PSAiZnVuY3Rpb24iICYmICJvbm1lc3NhZ2UiIGluIG1heWJlUG9ydDsKK30KKworaWYgKHR5cGVvZiB3aW5kb3cgPT09ICJ1bmRlZmluZWQiICYmICFfaXNfbm9kZS5pc05vZGVKUyAmJiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgJiYgaXNNZXNzYWdlUG9ydChzZWxmKSkgeworICBXb3JrZXJNZXNzYWdlSGFuZGxlci5pbml0aWFsaXplRnJvbVBvcnQoc2VsZik7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvcmUvd29ya2VyX3N0cmVhbS5qcyBiL2xpYi9jb3JlL3dvcmtlcl9zdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmNTVkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb3JlL3dvcmtlcl9zdHJlYW0uanMKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERldvcmtlclN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKworY2xhc3MgUERGV29ya2VyU3RyZWFtIHsKKyAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgeworICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOworICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDsKKyAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107CisgIH0KKworICBnZXRGdWxsUmVhZGVyKCkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERldvcmtlclN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERldvcmtlclN0cmVhbVJlYWRlcih0aGlzLl9tc2dIYW5kbGVyKTsKKyAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7CisgIH0KKworICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CisgICAgY29uc3QgcmVhZGVyID0gbmV3IFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyKGJlZ2luLCBlbmQsIHRoaXMuX21zZ0hhbmRsZXIpOworCisgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7CisKKyAgICByZXR1cm4gcmVhZGVyOworICB9CisKKyAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7CisgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7CisgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisKKyAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKTsKKworICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmVhZGVyKSB7CisgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLlBERldvcmtlclN0cmVhbSA9IFBERldvcmtlclN0cmVhbTsKKworY2xhc3MgUERGV29ya2VyU3RyZWFtUmVhZGVyIHsKKyAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgeworICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7CisgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGZhbHNlOworICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJlYWRlciIpOworCisgICAgdGhpcy5fcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CisgICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlJlYWRlckhlYWRlcnNSZWFkeSIpLnRoZW4oZGF0YSA9PiB7CisgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGRhdGEuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZGF0YS5pc1JhbmdlU3VwcG9ydGVkOworICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGRhdGEuY29udGVudExlbmd0aDsKKyAgICB9KTsKKyAgfQorCisgIGdldCBoZWFkZXJzUmVhZHkoKSB7CisgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTsKKyAgfQorCisgIGdldCBjb250ZW50TGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoOworICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgfQorCisgIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBjb25zdCB7CisgICAgICB2YWx1ZSwKKyAgICAgIGRvbmUKKyAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTsKKworICAgIGlmIChkb25lKSB7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9OworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICB2YWx1ZTogdmFsdWUuYnVmZmVyLAorICAgICAgZG9uZTogZmFsc2UKKyAgICB9OworICB9CisKKyAgY2FuY2VsKHJlYXNvbikgeworICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgfQorCit9CisKK2NsYXNzIFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyIHsKKyAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCwgbXNnSGFuZGxlcikgeworICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisKKyAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJhbmdlUmVhZGVyIiwgeworICAgICAgYmVnaW4sCisgICAgICBlbmQKKyAgICB9KTsKKworICAgIHRoaXMuX3JlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOworICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGFzeW5jIHJlYWQoKSB7CisgICAgY29uc3QgeworICAgICAgdmFsdWUsCisgICAgICBkb25lCisgICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7CisKKyAgICBpZiAoZG9uZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfTsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgdmFsdWU6IHZhbHVlLmJ1ZmZlciwKKyAgICAgIGRvbmU6IGZhbHNlCisgICAgfTsKKyAgfQorCisgIGNhbmNlbChyZWFzb24pIHsKKyAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb3JlL3dyaXRlci5qcyBiL2xpYi9jb3JlL3dyaXRlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQzZTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmUvd3JpdGVyLmpzCkBAIC0wLDAgKzEsMjQyIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy53cml0ZURpY3QgPSB3cml0ZURpY3Q7CitleHBvcnRzLmluY3JlbWVudGFsVXBkYXRlID0gaW5jcmVtZW50YWxVcGRhdGU7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4vcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX2NyeXB0byA9IHJlcXVpcmUoIi4vY3J5cHRvLmpzIik7CisKK2Z1bmN0aW9uIHdyaXRlRGljdChkaWN0LCBidWZmZXIsIHRyYW5zZm9ybSkgeworICBidWZmZXIucHVzaCgiPDwiKTsKKworICBmb3IgKGNvbnN0IGtleSBvZiBkaWN0LmdldEtleXMoKSkgeworICAgIGJ1ZmZlci5wdXNoKGAgLyR7a2V5fSBgKTsKKyAgICB3cml0ZVZhbHVlKGRpY3QuZ2V0UmF3KGtleSksIGJ1ZmZlciwgdHJhbnNmb3JtKTsKKyAgfQorCisgIGJ1ZmZlci5wdXNoKCI+PiIpOworfQorCitmdW5jdGlvbiB3cml0ZVN0cmVhbShzdHJlYW0sIGJ1ZmZlciwgdHJhbnNmb3JtKSB7CisgIHdyaXRlRGljdChzdHJlYW0uZGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pOworICBidWZmZXIucHVzaCgiIHN0cmVhbVxuIik7CisgIGxldCBzdHJpbmcgPSAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoc3RyZWFtLmdldEJ5dGVzKCkpOworCisgIGlmICh0cmFuc2Zvcm0gIT09IG51bGwpIHsKKyAgICBzdHJpbmcgPSB0cmFuc2Zvcm0uZW5jcnlwdFN0cmluZyhzdHJpbmcpOworICB9CisKKyAgYnVmZmVyLnB1c2goc3RyaW5nKTsKKyAgYnVmZmVyLnB1c2goIlxuZW5kc3RyZWFtXG4iKTsKK30KKworZnVuY3Rpb24gd3JpdGVBcnJheShhcnJheSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKKyAgYnVmZmVyLnB1c2goIlsiKTsKKyAgbGV0IGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGNvbnN0IHZhbCBvZiBhcnJheSkgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGJ1ZmZlci5wdXNoKCIgIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorCisgICAgd3JpdGVWYWx1ZSh2YWwsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKKyAgfQorCisgIGJ1ZmZlci5wdXNoKCJdIik7Cit9CisKK2Z1bmN0aW9uIG51bWJlclRvU3RyaW5nKHZhbHVlKSB7CisgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkgeworICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICB9CisKKyAgY29uc3Qgcm91bmRlZFZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMCk7CisKKyAgaWYgKHJvdW5kZWRWYWx1ZSAlIDEwMCA9PT0gMCkgeworICAgIHJldHVybiAocm91bmRlZFZhbHVlIC8gMTAwKS50b1N0cmluZygpOworICB9CisKKyAgaWYgKHJvdW5kZWRWYWx1ZSAlIDEwID09PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoMSk7CisgIH0KKworICByZXR1cm4gdmFsdWUudG9GaXhlZCgyKTsKK30KKworZnVuY3Rpb24gd3JpdGVWYWx1ZSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKKyAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHZhbHVlKSkgeworICAgIGJ1ZmZlci5wdXNoKGAvJHt2YWx1ZS5uYW1lfWApOworICB9IGVsc2UgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZikodmFsdWUpKSB7CisgICAgYnVmZmVyLnB1c2goYCR7dmFsdWUubnVtfSAke3ZhbHVlLmdlbn0gUmApOworICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CisgICAgd3JpdGVBcnJheSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pOworICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIpIHsKKyAgICBpZiAodHJhbnNmb3JtICE9PSBudWxsKSB7CisgICAgICB2YWx1ZSA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHZhbHVlKTsKKyAgICB9CisKKyAgICBidWZmZXIucHVzaChgKCR7KDAsIF91dGlsLmVzY2FwZVN0cmluZykodmFsdWUpfSlgKTsKKyAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICJudW1iZXIiKSB7CisgICAgYnVmZmVyLnB1c2gobnVtYmVyVG9TdHJpbmcodmFsdWUpKTsKKyAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KSh2YWx1ZSkpIHsKKyAgICB3cml0ZURpY3QodmFsdWUsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKKyAgfSBlbHNlIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNTdHJlYW0pKHZhbHVlKSkgeworICAgIHdyaXRlU3RyZWFtKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CisgIH0KK30KKworZnVuY3Rpb24gd3JpdGVJbnQobnVtYmVyLCBzaXplLCBvZmZzZXQsIGJ1ZmZlcikgeworICBmb3IgKGxldCBpID0gc2l6ZSArIG9mZnNldCAtIDE7IGkgPiBvZmZzZXQgLSAxOyBpLS0pIHsKKyAgICBidWZmZXJbaV0gPSBudW1iZXIgJiAweGZmOworICAgIG51bWJlciA+Pj0gODsKKyAgfQorCisgIHJldHVybiBvZmZzZXQgKyBzaXplOworfQorCitmdW5jdGlvbiB3cml0ZVN0cmluZyhzdHJpbmcsIG9mZnNldCwgYnVmZmVyKSB7CisgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4ZmY7CisgIH0KK30KKworZnVuY3Rpb24gY29tcHV0ZU1ENShmaWxlc2l6ZSwgeHJlZkluZm8pIHsKKyAgY29uc3QgdGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApOworICBjb25zdCBmaWxlbmFtZSA9IHhyZWZJbmZvLmZpbGVuYW1lIHx8ICIiOworICBjb25zdCBtZDVCdWZmZXIgPSBbdGltZS50b1N0cmluZygpLCBmaWxlbmFtZSwgZmlsZXNpemUudG9TdHJpbmcoKV07CisgIGxldCBtZDVCdWZmZXJMZW4gPSBtZDVCdWZmZXIucmVkdWNlKChhLCBzdHIpID0+IGEgKyBzdHIubGVuZ3RoLCAwKTsKKworICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoeHJlZkluZm8uaW5mbykpIHsKKyAgICBtZDVCdWZmZXIucHVzaCh2YWx1ZSk7CisgICAgbWQ1QnVmZmVyTGVuICs9IHZhbHVlLmxlbmd0aDsKKyAgfQorCisgIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkobWQ1QnVmZmVyTGVuKTsKKyAgbGV0IG9mZnNldCA9IDA7CisKKyAgZm9yIChjb25zdCBzdHIgb2YgbWQ1QnVmZmVyKSB7CisgICAgd3JpdGVTdHJpbmcoc3RyLCBvZmZzZXQsIGFycmF5KTsKKyAgICBvZmZzZXQgKz0gc3RyLmxlbmd0aDsKKyAgfQorCisgIHJldHVybiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoKDAsIF9jcnlwdG8uY2FsY3VsYXRlTUQ1KShhcnJheSkpOworfQorCitmdW5jdGlvbiBpbmNyZW1lbnRhbFVwZGF0ZShvcmlnaW5hbERhdGEsIHhyZWZJbmZvLCBuZXdSZWZzKSB7CisgIGNvbnN0IG5ld1hyZWYgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChudWxsKTsKKyAgY29uc3QgcmVmRm9yWHJlZlRhYmxlID0geHJlZkluZm8ubmV3UmVmOworICBsZXQgYnVmZmVyLCBiYXNlT2Zmc2V0OworICBjb25zdCBsYXN0Qnl0ZSA9IG9yaWdpbmFsRGF0YVtvcmlnaW5hbERhdGEubGVuZ3RoIC0gMV07CisKKyAgaWYgKGxhc3RCeXRlID09PSAweDBhIHx8IGxhc3RCeXRlID09PSAweDBkKSB7CisgICAgYnVmZmVyID0gW107CisgICAgYmFzZU9mZnNldCA9IG9yaWdpbmFsRGF0YS5sZW5ndGg7CisgIH0gZWxzZSB7CisgICAgYnVmZmVyID0gWyJcbiJdOworICAgIGJhc2VPZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoICsgMTsKKyAgfQorCisgIG5ld1hyZWYuc2V0KCJTaXplIiwgcmVmRm9yWHJlZlRhYmxlLm51bSArIDEpOworICBuZXdYcmVmLnNldCgiUHJldiIsIHhyZWZJbmZvLnN0YXJ0WFJlZik7CisgIG5ld1hyZWYuc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlhSZWYiKSk7CisKKyAgaWYgKHhyZWZJbmZvLnJvb3RSZWYgIT09IG51bGwpIHsKKyAgICBuZXdYcmVmLnNldCgiUm9vdCIsIHhyZWZJbmZvLnJvb3RSZWYpOworICB9CisKKyAgaWYgKHhyZWZJbmZvLmluZm9SZWYgIT09IG51bGwpIHsKKyAgICBuZXdYcmVmLnNldCgiSW5mbyIsIHhyZWZJbmZvLmluZm9SZWYpOworICB9CisKKyAgaWYgKHhyZWZJbmZvLmVuY3J5cHQgIT09IG51bGwpIHsKKyAgICBuZXdYcmVmLnNldCgiRW5jcnlwdCIsIHhyZWZJbmZvLmVuY3J5cHQpOworICB9CisKKyAgbmV3UmVmcy5wdXNoKHsKKyAgICByZWY6IHJlZkZvclhyZWZUYWJsZSwKKyAgICBkYXRhOiAiIgorICB9KTsKKyAgbmV3UmVmcyA9IG5ld1JlZnMuc29ydCgoYSwgYikgPT4geworICAgIHJldHVybiBhLnJlZi5udW0gLSBiLnJlZi5udW07CisgIH0pOworICBjb25zdCB4cmVmVGFibGVEYXRhID0gW1swLCAxLCAweGZmZmZdXTsKKyAgY29uc3QgaW5kZXhlcyA9IFswLCAxXTsKKyAgbGV0IG1heE9mZnNldCA9IDA7CisKKyAgZm9yIChjb25zdCB7CisgICAgcmVmLAorICAgIGRhdGEKKyAgfSBvZiBuZXdSZWZzKSB7CisgICAgbWF4T2Zmc2V0ID0gTWF0aC5tYXgobWF4T2Zmc2V0LCBiYXNlT2Zmc2V0KTsKKyAgICB4cmVmVGFibGVEYXRhLnB1c2goWzEsIGJhc2VPZmZzZXQsIE1hdGgubWluKHJlZi5nZW4sIDB4ZmZmZildKTsKKyAgICBiYXNlT2Zmc2V0ICs9IGRhdGEubGVuZ3RoOworICAgIGluZGV4ZXMucHVzaChyZWYubnVtKTsKKyAgICBpbmRleGVzLnB1c2goMSk7CisgICAgYnVmZmVyLnB1c2goZGF0YSk7CisgIH0KKworICBuZXdYcmVmLnNldCgiSW5kZXgiLCBpbmRleGVzKTsKKworICBpZiAoeHJlZkluZm8uZmlsZUlkcy5sZW5ndGggIT09IDApIHsKKyAgICBjb25zdCBtZDUgPSBjb21wdXRlTUQ1KGJhc2VPZmZzZXQsIHhyZWZJbmZvKTsKKyAgICBuZXdYcmVmLnNldCgiSUQiLCBbeHJlZkluZm8uZmlsZUlkc1swXSwgbWQ1XSk7CisgIH0KKworICBjb25zdCBvZmZzZXRTaXplID0gTWF0aC5jZWlsKE1hdGgubG9nMihtYXhPZmZzZXQpIC8gOCk7CisgIGNvbnN0IHNpemVzID0gWzEsIG9mZnNldFNpemUsIDJdOworICBjb25zdCBzdHJ1Y3RTaXplID0gc2l6ZXNbMF0gKyBzaXplc1sxXSArIHNpemVzWzJdOworICBjb25zdCB0YWJsZUxlbmd0aCA9IHN0cnVjdFNpemUgKiB4cmVmVGFibGVEYXRhLmxlbmd0aDsKKyAgbmV3WHJlZi5zZXQoIlciLCBzaXplcyk7CisgIG5ld1hyZWYuc2V0KCJMZW5ndGgiLCB0YWJsZUxlbmd0aCk7CisgIGJ1ZmZlci5wdXNoKGAke3JlZkZvclhyZWZUYWJsZS5udW19ICR7cmVmRm9yWHJlZlRhYmxlLmdlbn0gb2JqXG5gKTsKKyAgd3JpdGVEaWN0KG5ld1hyZWYsIGJ1ZmZlciwgbnVsbCk7CisgIGJ1ZmZlci5wdXNoKCIgc3RyZWFtXG4iKTsKKyAgY29uc3QgYnVmZmVyTGVuID0gYnVmZmVyLnJlZHVjZSgoYSwgc3RyKSA9PiBhICsgc3RyLmxlbmd0aCwgMCk7CisgIGNvbnN0IGZvb3RlciA9IGBcbmVuZHN0cmVhbVxuZW5kb2JqXG5zdGFydHhyZWZcbiR7YmFzZU9mZnNldH1cbiUlRU9GXG5gOworICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KG9yaWdpbmFsRGF0YS5sZW5ndGggKyBidWZmZXJMZW4gKyB0YWJsZUxlbmd0aCArIGZvb3Rlci5sZW5ndGgpOworICBhcnJheS5zZXQob3JpZ2luYWxEYXRhKTsKKyAgbGV0IG9mZnNldCA9IG9yaWdpbmFsRGF0YS5sZW5ndGg7CisKKyAgZm9yIChjb25zdCBzdHIgb2YgYnVmZmVyKSB7CisgICAgd3JpdGVTdHJpbmcoc3RyLCBvZmZzZXQsIGFycmF5KTsKKyAgICBvZmZzZXQgKz0gc3RyLmxlbmd0aDsKKyAgfQorCisgIGZvciAoY29uc3QgW3R5cGUsIG9iak9mZnNldCwgZ2VuXSBvZiB4cmVmVGFibGVEYXRhKSB7CisgICAgb2Zmc2V0ID0gd3JpdGVJbnQodHlwZSwgc2l6ZXNbMF0sIG9mZnNldCwgYXJyYXkpOworICAgIG9mZnNldCA9IHdyaXRlSW50KG9iak9mZnNldCwgc2l6ZXNbMV0sIG9mZnNldCwgYXJyYXkpOworICAgIG9mZnNldCA9IHdyaXRlSW50KGdlbiwgc2l6ZXNbMl0sIG9mZnNldCwgYXJyYXkpOworICB9CisKKyAgd3JpdGVTdHJpbmcoZm9vdGVyLCBvZmZzZXQsIGFycmF5KTsKKyAgcmV0dXJuIGFycmF5OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kaXNwbGF5L2Fubm90YXRpb25fbGF5ZXIuanMgYi9saWIvZGlzcGxheS9hbm5vdGF0aW9uX2xheWVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Mzc4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGlzcGxheS9hbm5vdGF0aW9uX2xheWVyLmpzCkBAIC0wLDAgKzEsMTA5MiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQW5ub3RhdGlvbkxheWVyID0gdm9pZCAwOworCit2YXIgX2Rpc3BsYXlfdXRpbHMgPSByZXF1aXJlKCIuL2Rpc3BsYXlfdXRpbHMuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9hbm5vdGF0aW9uX3N0b3JhZ2UgPSByZXF1aXJlKCIuL2Fubm90YXRpb25fc3RvcmFnZS5qcyIpOworCitjbGFzcyBBbm5vdGF0aW9uRWxlbWVudEZhY3RvcnkgeworICBzdGF0aWMgY3JlYXRlKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBzdWJ0eXBlID0gcGFyYW1ldGVycy5kYXRhLmFubm90YXRpb25UeXBlOworCisgICAgc3dpdGNoIChzdWJ0eXBlKSB7CisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkxJTks6CisgICAgICAgIHJldHVybiBuZXcgTGlua0Fubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlRFWFQ6CisgICAgICAgIHJldHVybiBuZXcgVGV4dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVDoKKyAgICAgICAgY29uc3QgZmllbGRUeXBlID0gcGFyYW1ldGVycy5kYXRhLmZpZWxkVHlwZTsKKworICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgIGNhc2UgIlR4IjoKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICAgICAgY2FzZSAiQnRuIjoKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmRhdGEucmFkaW9CdXR0b24pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLmRhdGEuY2hlY2tCb3gpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgICAgIGNhc2UgIkNoIjoKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlBPUFVQOgorICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuRlJFRVRFWFQ6CisgICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5FOgorICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TUVVBUkU6CisgICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOgorICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlBPTFlMSU5FOgorICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuQ0FSRVQ6CisgICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5JTks6CisgICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9MWUdPTjoKKyAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuSElHSExJR0hUOgorICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlVOREVSTElORToKKyAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TUVVJR0dMWToKKyAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlNUUklLRU9VVDoKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTsKKworICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TVEFNUDoKKyAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpOworCisgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UOgorICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7CisgICAgfQorICB9CisKK30KKworY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUgPSBmYWxzZSwgaWdub3JlQm9yZGVyID0gZmFsc2UpIHsKKyAgICB0aGlzLmlzUmVuZGVyYWJsZSA9IGlzUmVuZGVyYWJsZTsKKyAgICB0aGlzLmRhdGEgPSBwYXJhbWV0ZXJzLmRhdGE7CisgICAgdGhpcy5sYXllciA9IHBhcmFtZXRlcnMubGF5ZXI7CisgICAgdGhpcy5wYWdlID0gcGFyYW1ldGVycy5wYWdlOworICAgIHRoaXMudmlld3BvcnQgPSBwYXJhbWV0ZXJzLnZpZXdwb3J0OworICAgIHRoaXMubGlua1NlcnZpY2UgPSBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlOworICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gcGFyYW1ldGVycy5kb3dubG9hZE1hbmFnZXI7CisgICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBwYXJhbWV0ZXJzLmltYWdlUmVzb3VyY2VzUGF0aDsKKyAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPSBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXM7CisgICAgdGhpcy5zdmdGYWN0b3J5ID0gcGFyYW1ldGVycy5zdmdGYWN0b3J5OworICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlOworCisgICAgaWYgKGlzUmVuZGVyYWJsZSkgeworICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLl9jcmVhdGVDb250YWluZXIoaWdub3JlQm9yZGVyKTsKKyAgICB9CisgIH0KKworICBfY3JlYXRlQ29udGFpbmVyKGlnbm9yZUJvcmRlciA9IGZhbHNlKSB7CisgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSwKKyAgICAgICAgICBwYWdlID0gdGhpcy5wYWdlLAorICAgICAgICAgIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydDsKKyAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWN0aW9uIik7CisgICAgbGV0IHdpZHRoID0gZGF0YS5yZWN0WzJdIC0gZGF0YS5yZWN0WzBdOworICAgIGxldCBoZWlnaHQgPSBkYXRhLnJlY3RbM10gLSBkYXRhLnJlY3RbMV07CisgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgiZGF0YS1hbm5vdGF0aW9uLWlkIiwgZGF0YS5pZCk7CisKKyAgICBjb25zdCByZWN0ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KFtkYXRhLnJlY3RbMF0sIHBhZ2Uudmlld1szXSAtIGRhdGEucmVjdFsxXSArIHBhZ2Uudmlld1sxXSwgZGF0YS5yZWN0WzJdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbM10gKyBwYWdlLnZpZXdbMV1dKTsKKworICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSBgbWF0cml4KCR7dmlld3BvcnQudHJhbnNmb3JtLmpvaW4oIiwiKX0pYDsKKyAgICBjb250YWluZXIuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gYC0ke3JlY3RbMF19cHggLSR7cmVjdFsxXX1weGA7CisKKyAgICBpZiAoIWlnbm9yZUJvcmRlciAmJiBkYXRhLmJvcmRlclN0eWxlLndpZHRoID4gMCkgeworICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlcldpZHRoID0gYCR7ZGF0YS5ib3JkZXJTdHlsZS53aWR0aH1weGA7CisKKyAgICAgIGlmIChkYXRhLmJvcmRlclN0eWxlLnN0eWxlICE9PSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORSkgeworICAgICAgICB3aWR0aCA9IHdpZHRoIC0gMiAqIGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7CisgICAgICAgIGhlaWdodCA9IGhlaWdodCAtIDIgKiBkYXRhLmJvcmRlclN0eWxlLndpZHRoOworICAgICAgfQorCisgICAgICBjb25zdCBob3Jpem9udGFsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS5ob3Jpem9udGFsQ29ybmVyUmFkaXVzOworICAgICAgY29uc3QgdmVydGljYWxSYWRpdXMgPSBkYXRhLmJvcmRlclN0eWxlLnZlcnRpY2FsQ29ybmVyUmFkaXVzOworCisgICAgICBpZiAoaG9yaXpvbnRhbFJhZGl1cyA+IDAgfHwgdmVydGljYWxSYWRpdXMgPiAwKSB7CisgICAgICAgIGNvbnN0IHJhZGl1cyA9IGAke2hvcml6b250YWxSYWRpdXN9cHggLyAke3ZlcnRpY2FsUmFkaXVzfXB4YDsKKyAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclJhZGl1cyA9IHJhZGl1czsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChkYXRhLmJvcmRlclN0eWxlLnN0eWxlKSB7CisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDoKKyAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyU3R5bGUgPSAic29saWQiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ6CisgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclN0eWxlID0gImRhc2hlZCI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ6CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogYmV2ZWxlZCIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDoKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBpbnNldCIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU6CisgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlckJvdHRvbVN0eWxlID0gInNvbGlkIjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5jb2xvcikgeworICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyQ29sb3IgPSBfdXRpbC5VdGlsLm1ha2VDc3NSZ2IoZGF0YS5jb2xvclswXSB8IDAsIGRhdGEuY29sb3JbMV0gfCAwLCBkYXRhLmNvbG9yWzJdIHwgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyV2lkdGggPSAwOworICAgICAgfQorICAgIH0KKworICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7cmVjdFswXX1weGA7CisgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IGAke3JlY3RbMV19cHhgOworICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDsKKyAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDsKKyAgICByZXR1cm4gY29udGFpbmVyOworICB9CisKKyAgX2NyZWF0ZVBvcHVwKGNvbnRhaW5lciwgdHJpZ2dlciwgZGF0YSkgeworICAgIGlmICghdHJpZ2dlcikgeworICAgICAgdHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgdHJpZ2dlci5zdHlsZS5oZWlnaHQgPSBjb250YWluZXIuc3R5bGUuaGVpZ2h0OworICAgICAgdHJpZ2dlci5zdHlsZS53aWR0aCA9IGNvbnRhaW5lci5zdHlsZS53aWR0aDsKKyAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0cmlnZ2VyKTsKKyAgICB9CisKKyAgICBjb25zdCBwb3B1cEVsZW1lbnQgPSBuZXcgUG9wdXBFbGVtZW50KHsKKyAgICAgIGNvbnRhaW5lciwKKyAgICAgIHRyaWdnZXIsCisgICAgICBjb2xvcjogZGF0YS5jb2xvciwKKyAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLAorICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogZGF0YS5tb2RpZmljYXRpb25EYXRlLAorICAgICAgY29udGVudHM6IGRhdGEuY29udGVudHMsCisgICAgICBoaWRlV3JhcHBlcjogdHJ1ZQorICAgIH0pOworICAgIGNvbnN0IHBvcHVwID0gcG9wdXBFbGVtZW50LnJlbmRlcigpOworICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBjb250YWluZXIuc3R5bGUud2lkdGg7CisgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHBvcHVwKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYEFubm90YXRpb25FbGVtZW50LnJlbmRlcmAgY2FsbGVkIik7CisgIH0KKworfQorCitjbGFzcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEudXJsIHx8IHBhcmFtZXRlcnMuZGF0YS5kZXN0IHx8IHBhcmFtZXRlcnMuZGF0YS5hY3Rpb24pOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImxpbmtBbm5vdGF0aW9uIjsKKyAgICBjb25zdCB7CisgICAgICBkYXRhLAorICAgICAgbGlua1NlcnZpY2UKKyAgICB9ID0gdGhpczsKKyAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOworCisgICAgaWYgKGRhdGEudXJsKSB7CisgICAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuYWRkTGlua0F0dHJpYnV0ZXMpKGxpbmssIHsKKyAgICAgICAgdXJsOiBkYXRhLnVybCwKKyAgICAgICAgdGFyZ2V0OiBkYXRhLm5ld1dpbmRvdyA/IF9kaXNwbGF5X3V0aWxzLkxpbmtUYXJnZXQuQkxBTksgOiBsaW5rU2VydmljZS5leHRlcm5hbExpbmtUYXJnZXQsCisgICAgICAgIHJlbDogbGlua1NlcnZpY2UuZXh0ZXJuYWxMaW5rUmVsLAorICAgICAgICBlbmFibGVkOiBsaW5rU2VydmljZS5leHRlcm5hbExpbmtFbmFibGVkCisgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKGRhdGEuYWN0aW9uKSB7CisgICAgICB0aGlzLl9iaW5kTmFtZWRBY3Rpb24obGluaywgZGF0YS5hY3Rpb24pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9iaW5kTGluayhsaW5rLCBkYXRhLmRlc3QpOworICAgIH0KKworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmspOworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCisgIF9iaW5kTGluayhsaW5rLCBkZXN0aW5hdGlvbikgeworICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0RGVzdGluYXRpb25IYXNoKGRlc3RpbmF0aW9uKTsKKworICAgIGxpbmsub25jbGljayA9ICgpID0+IHsKKyAgICAgIGlmIChkZXN0aW5hdGlvbikgeworICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLm5hdmlnYXRlVG8oZGVzdGluYXRpb24pOworICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKworICAgIGlmIChkZXN0aW5hdGlvbikgeworICAgICAgbGluay5jbGFzc05hbWUgPSAiaW50ZXJuYWxMaW5rIjsKKyAgICB9CisgIH0KKworICBfYmluZE5hbWVkQWN0aW9uKGxpbmssIGFjdGlvbikgeworICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKCIiKTsKKworICAgIGxpbmsub25jbGljayA9ICgpID0+IHsKKyAgICAgIHRoaXMubGlua1NlcnZpY2UuZXhlY3V0ZU5hbWVkQWN0aW9uKGFjdGlvbik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKworICAgIGxpbmsuY2xhc3NOYW1lID0gImludGVybmFsTGluayI7CisgIH0KKworfQorCitjbGFzcyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAidGV4dEFubm90YXRpb24iOworICAgIGNvbnN0IGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CisgICAgaW1hZ2Uuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0OworICAgIGltYWdlLnN0eWxlLndpZHRoID0gdGhpcy5jb250YWluZXIuc3R5bGUud2lkdGg7CisgICAgaW1hZ2Uuc3JjID0gdGhpcy5pbWFnZVJlc291cmNlc1BhdGggKyAiYW5ub3RhdGlvbi0iICsgdGhpcy5kYXRhLm5hbWUudG9Mb3dlckNhc2UoKSArICIuc3ZnIjsKKyAgICBpbWFnZS5hbHQgPSAiW3t7dHlwZX19IEFubm90YXRpb25dIjsKKyAgICBpbWFnZS5kYXRhc2V0LmwxMG5JZCA9ICJ0ZXh0X2Fubm90YXRpb25fdHlwZSI7CisgICAgaW1hZ2UuZGF0YXNldC5sMTBuQXJncyA9IEpTT04uc3RyaW5naWZ5KHsKKyAgICAgIHR5cGU6IHRoaXMuZGF0YS5uYW1lCisgICAgfSk7CisKKyAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIGltYWdlLCB0aGlzLmRhdGEpOworICAgIH0KKworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGltYWdlKTsKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgcmVuZGVyKCkgeworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9IHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyB8fCAhcGFyYW1ldGVycy5kYXRhLmhhc0FwcGVhcmFuY2UgJiYgISFwYXJhbWV0ZXJzLmRhdGEuZmllbGRWYWx1ZTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIGNvbnN0IFRFWFRfQUxJR05NRU5UID0gWyJsZWZ0IiwgImNlbnRlciIsICJyaWdodCJdOworICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlOworICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhLmlkOworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJ0ZXh0V2lkZ2V0QW5ub3RhdGlvbiI7CisgICAgbGV0IGVsZW1lbnQgPSBudWxsOworCisgICAgaWYgKHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcykgeworICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBzdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoaWQsIHRoaXMuZGF0YS5maWVsZFZhbHVlKTsKKworICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKKyAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7CisgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOworICAgICAgICBlbGVtZW50LnR5cGUgPSAidGV4dCI7CisgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHRleHRDb250ZW50KTsKKyAgICAgIH0KKworICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCBldmVudC50YXJnZXQudmFsdWUpOworICAgICAgfSk7CisgICAgICBlbGVtZW50LmRpc2FibGVkID0gdGhpcy5kYXRhLnJlYWRPbmx5OworICAgICAgZWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTsKKworICAgICAgaWYgKHRoaXMuZGF0YS5tYXhMZW4gIT09IG51bGwpIHsKKyAgICAgICAgZWxlbWVudC5tYXhMZW5ndGggPSB0aGlzLmRhdGEubWF4TGVuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHsKKyAgICAgICAgY29uc3QgZmllbGRXaWR0aCA9IHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF07CisgICAgICAgIGNvbnN0IGNvbWJXaWR0aCA9IGZpZWxkV2lkdGggLyB0aGlzLmRhdGEubWF4TGVuOworICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoImNvbWIiKTsKKyAgICAgICAgZWxlbWVudC5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gYGNhbGMoJHtjb21iV2lkdGh9cHggLSAxY2gpYDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuZGF0YS5maWVsZFZhbHVlOworICAgICAgZWxlbWVudC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gIm1pZGRsZSI7CisgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAidGFibGUtY2VsbCI7CisgICAgICBsZXQgZm9udCA9IG51bGw7CisKKyAgICAgIGlmICh0aGlzLmRhdGEuZm9udFJlZk5hbWUgJiYgdGhpcy5wYWdlLmNvbW1vbk9ianMuaGFzKHRoaXMuZGF0YS5mb250UmVmTmFtZSkpIHsKKyAgICAgICAgZm9udCA9IHRoaXMucGFnZS5jb21tb25PYmpzLmdldCh0aGlzLmRhdGEuZm9udFJlZk5hbWUpOworICAgICAgfQorCisgICAgICB0aGlzLl9zZXRUZXh0U3R5bGUoZWxlbWVudCwgZm9udCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ICE9PSBudWxsKSB7CisgICAgICBlbGVtZW50LnN0eWxlLnRleHRBbGlnbiA9IFRFWFRfQUxJR05NRU5UW3RoaXMuZGF0YS50ZXh0QWxpZ25tZW50XTsKKyAgICB9CisKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTsKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworICBfc2V0VGV4dFN0eWxlKGVsZW1lbnQsIGZvbnQpIHsKKyAgICBjb25zdCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7CisgICAgc3R5bGUuZm9udFNpemUgPSBgJHt0aGlzLmRhdGEuZm9udFNpemV9cHhgOworICAgIHN0eWxlLmRpcmVjdGlvbiA9IHRoaXMuZGF0YS5mb250RGlyZWN0aW9uIDwgMCA/ICJydGwiIDogImx0ciI7CisKKyAgICBpZiAoIWZvbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZXQgYm9sZCA9ICJub3JtYWwiOworCisgICAgaWYgKGZvbnQuYmxhY2spIHsKKyAgICAgIGJvbGQgPSAiOTAwIjsKKyAgICB9IGVsc2UgaWYgKGZvbnQuYm9sZCkgeworICAgICAgYm9sZCA9ICJib2xkIjsKKyAgICB9CisKKyAgICBzdHlsZS5mb250V2VpZ2h0ID0gYm9sZDsKKyAgICBzdHlsZS5mb250U3R5bGUgPSBmb250Lml0YWxpYyA/ICJpdGFsaWMiIDogIm5vcm1hbCI7CisgICAgY29uc3QgZm9udEZhbWlseSA9IGZvbnQubG9hZGVkTmFtZSA/IGAiJHtmb250LmxvYWRlZE5hbWV9IiwgYCA6ICIiOworICAgIGNvbnN0IGZhbGxiYWNrTmFtZSA9IGZvbnQuZmFsbGJhY2tOYW1lIHx8ICJIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiOworICAgIHN0eWxlLmZvbnRGYW1pbHkgPSBmb250RmFtaWx5ICsgZmFsbGJhY2tOYW1lOworICB9CisKK30KKworY2xhc3MgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7CisgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICBjb25zdCBpZCA9IGRhdGEuaWQ7CisgICAgY29uc3QgdmFsdWUgPSBzdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoaWQsIGRhdGEuZmllbGRWYWx1ZSAmJiBkYXRhLmZpZWxkVmFsdWUgIT09ICJPZmYiKTsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBjaGVja0JveCI7CisgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAgZWxlbWVudC5kaXNhYmxlZCA9IGRhdGEucmVhZE9ubHk7CisgICAgZWxlbWVudC50eXBlID0gImNoZWNrYm94IjsKKyAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lOworCisgICAgaWYgKHZhbHVlKSB7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIHRydWUpOworICAgIH0KKworICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCBldmVudC50YXJnZXQuY2hlY2tlZCk7CisgICAgfSk7CisgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHN1cGVyKHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImJ1dHRvbldpZGdldEFubm90YXRpb24gcmFkaW9CdXR0b24iOworICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlOworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgY29uc3QgaWQgPSBkYXRhLmlkOworICAgIGNvbnN0IHZhbHVlID0gc3RvcmFnZS5nZXRPckNyZWF0ZVZhbHVlKGlkLCBkYXRhLmZpZWxkVmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWUpOworICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOworICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5OworICAgIGVsZW1lbnQudHlwZSA9ICJyYWRpbyI7CisgICAgZWxlbWVudC5uYW1lID0gZGF0YS5maWVsZE5hbWU7CisKKyAgICBpZiAodmFsdWUpIHsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwgdHJ1ZSk7CisgICAgfQorCisgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgIGNvbnN0IG5hbWUgPSBldmVudC50YXJnZXQubmFtZTsKKworICAgICAgZm9yIChjb25zdCByYWRpbyBvZiBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKSkgeworICAgICAgICBpZiAocmFkaW8gIT09IGV2ZW50LnRhcmdldCkgeworICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUocmFkaW8ucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5ub3RhdGlvbi1pZCIpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwgZXZlbnQudGFyZ2V0LmNoZWNrZWQpOworICAgIH0pOworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpOworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIExpbmtBbm5vdGF0aW9uRWxlbWVudCB7CisgIHJlbmRlcigpIHsKKyAgICBjb25zdCBjb250YWluZXIgPSBzdXBlci5yZW5kZXIoKTsKKyAgICBjb250YWluZXIuY2xhc3NOYW1lID0gImJ1dHRvbldpZGdldEFubm90YXRpb24gcHVzaEJ1dHRvbiI7CisgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgc3VwZXIocGFyYW1ldGVycywgcGFyYW1ldGVycy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAiY2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiI7CisgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7CisgICAgY29uc3QgaWQgPSB0aGlzLmRhdGEuaWQ7CisgICAgc3RvcmFnZS5nZXRPckNyZWF0ZVZhbHVlKGlkLCB0aGlzLmRhdGEuZmllbGRWYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5kYXRhLmZpZWxkVmFsdWVbMF0gOiBudWxsKTsKKyAgICBjb25zdCBzZWxlY3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CisgICAgc2VsZWN0RWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGF0YS5yZWFkT25seTsKKyAgICBzZWxlY3RFbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lOworCisgICAgaWYgKCF0aGlzLmRhdGEuY29tYm8pIHsKKyAgICAgIHNlbGVjdEVsZW1lbnQuc2l6ZSA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDsKKworICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aVNlbGVjdCkgeworICAgICAgICBzZWxlY3RFbGVtZW50Lm11bHRpcGxlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLmRhdGEub3B0aW9ucykgeworICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOworICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbi5kaXNwbGF5VmFsdWU7CisgICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gb3B0aW9uLmV4cG9ydFZhbHVlOworCisgICAgICBpZiAodGhpcy5kYXRhLmZpZWxkVmFsdWUuaW5jbHVkZXMob3B0aW9uLmV4cG9ydFZhbHVlKSkgeworICAgICAgICBvcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb25FbGVtZW50KTsKKyAgICB9CisKKyAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICBjb25zdCBvcHRpb25zID0gZXZlbnQudGFyZ2V0Lm9wdGlvbnM7CisgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0aW9ucy5zZWxlY3RlZEluZGV4XS52YWx1ZTsKKyAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHZhbHVlKTsKKyAgICB9KTsKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChzZWxlY3RFbGVtZW50KTsKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBQb3B1cEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICBjb25zdCBJR05PUkVfVFlQRVMgPSBbIkxpbmUiLCAiU3F1YXJlIiwgIkNpcmNsZSIsICJQb2x5TGluZSIsICJQb2x5Z29uIiwgIkluayJdOworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJwb3B1cEFubm90YXRpb24iOworCisgICAgaWYgKElHTk9SRV9UWVBFUy5pbmNsdWRlcyh0aGlzLmRhdGEucGFyZW50VHlwZSkpIHsKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisKKyAgICBjb25zdCBzZWxlY3RvciA9IGBbZGF0YS1hbm5vdGF0aW9uLWlkPSIke3RoaXMuZGF0YS5wYXJlbnRJZH0iXWA7CisgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMubGF5ZXIucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CisKKyAgICBpZiAoIXBhcmVudEVsZW1lbnQpIHsKKyAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgICB9CisKKyAgICBjb25zdCBwb3B1cCA9IG5ldyBQb3B1cEVsZW1lbnQoeworICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lciwKKyAgICAgIHRyaWdnZXI6IHBhcmVudEVsZW1lbnQsCisgICAgICBjb2xvcjogdGhpcy5kYXRhLmNvbG9yLAorICAgICAgdGl0bGU6IHRoaXMuZGF0YS50aXRsZSwKKyAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlLAorICAgICAgY29udGVudHM6IHRoaXMuZGF0YS5jb250ZW50cworICAgIH0pOworICAgIGNvbnN0IHBhcmVudExlZnQgPSBwYXJzZUZsb2F0KHBhcmVudEVsZW1lbnQuc3R5bGUubGVmdCk7CisgICAgY29uc3QgcGFyZW50V2lkdGggPSBwYXJzZUZsb2F0KHBhcmVudEVsZW1lbnQuc3R5bGUud2lkdGgpOworICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGAtJHtwYXJlbnRMZWZ0ICsgcGFyZW50V2lkdGh9cHggLSR7cGFyZW50RWxlbWVudC5zdHlsZS50b3B9YDsKKyAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7cGFyZW50TGVmdCArIHBhcmVudFdpZHRofXB4YDsKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChwb3B1cC5yZW5kZXIoKSk7CisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgUG9wdXBFbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIHRoaXMuY29udGFpbmVyID0gcGFyYW1ldGVycy5jb250YWluZXI7CisgICAgdGhpcy50cmlnZ2VyID0gcGFyYW1ldGVycy50cmlnZ2VyOworICAgIHRoaXMuY29sb3IgPSBwYXJhbWV0ZXJzLmNvbG9yOworICAgIHRoaXMudGl0bGUgPSBwYXJhbWV0ZXJzLnRpdGxlOworICAgIHRoaXMubW9kaWZpY2F0aW9uRGF0ZSA9IHBhcmFtZXRlcnMubW9kaWZpY2F0aW9uRGF0ZTsKKyAgICB0aGlzLmNvbnRlbnRzID0gcGFyYW1ldGVycy5jb250ZW50czsKKyAgICB0aGlzLmhpZGVXcmFwcGVyID0gcGFyYW1ldGVycy5oaWRlV3JhcHBlciB8fCBmYWxzZTsKKyAgICB0aGlzLnBpbm5lZCA9IGZhbHNlOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIGNvbnN0IEJBQ0tHUk9VTkRfRU5MSUdIVCA9IDAuNzsKKyAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgd3JhcHBlci5jbGFzc05hbWUgPSAicG9wdXBXcmFwcGVyIjsKKyAgICB0aGlzLmhpZGVFbGVtZW50ID0gdGhpcy5oaWRlV3JhcHBlciA/IHdyYXBwZXIgOiB0aGlzLmNvbnRhaW5lcjsKKyAgICB0aGlzLmhpZGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgdHJ1ZSk7CisgICAgY29uc3QgcG9wdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICBwb3B1cC5jbGFzc05hbWUgPSAicG9wdXAiOworICAgIGNvbnN0IGNvbG9yID0gdGhpcy5jb2xvcjsKKworICAgIGlmIChjb2xvcikgeworICAgICAgY29uc3QgciA9IEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjb2xvclswXSkgKyBjb2xvclswXTsKKyAgICAgIGNvbnN0IGcgPSBCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gY29sb3JbMV0pICsgY29sb3JbMV07CisgICAgICBjb25zdCBiID0gQkFDS0dST1VORF9FTkxJR0hUICogKDI1NSAtIGNvbG9yWzJdKSArIGNvbG9yWzJdOworICAgICAgcG9wdXAuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKHIgfCAwLCBnIHwgMCwgYiB8IDApOworICAgIH0KKworICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaDEiKTsKKyAgICB0aXRsZS50ZXh0Q29udGVudCA9IHRoaXMudGl0bGU7CisgICAgcG9wdXAuYXBwZW5kQ2hpbGQodGl0bGUpOworCisgICAgY29uc3QgZGF0ZU9iamVjdCA9IF9kaXNwbGF5X3V0aWxzLlBERkRhdGVTdHJpbmcudG9EYXRlT2JqZWN0KHRoaXMubW9kaWZpY2F0aW9uRGF0ZSk7CisKKyAgICBpZiAoZGF0ZU9iamVjdCkgeworICAgICAgY29uc3QgbW9kaWZpY2F0aW9uRGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKyAgICAgIG1vZGlmaWNhdGlvbkRhdGUudGV4dENvbnRlbnQgPSAie3tkYXRlfX0sIHt7dGltZX19IjsKKyAgICAgIG1vZGlmaWNhdGlvbkRhdGUuZGF0YXNldC5sMTBuSWQgPSAiYW5ub3RhdGlvbl9kYXRlX3N0cmluZyI7CisgICAgICBtb2RpZmljYXRpb25EYXRlLmRhdGFzZXQubDEwbkFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7CisgICAgICAgIGRhdGU6IGRhdGVPYmplY3QudG9Mb2NhbGVEYXRlU3RyaW5nKCksCisgICAgICAgIHRpbWU6IGRhdGVPYmplY3QudG9Mb2NhbGVUaW1lU3RyaW5nKCkKKyAgICAgIH0pOworICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQobW9kaWZpY2F0aW9uRGF0ZSk7CisgICAgfQorCisgICAgY29uc3QgY29udGVudHMgPSB0aGlzLl9mb3JtYXRDb250ZW50cyh0aGlzLmNvbnRlbnRzKTsKKworICAgIHBvcHVwLmFwcGVuZENoaWxkKGNvbnRlbnRzKTsKKyAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLl90b2dnbGUuYmluZCh0aGlzKSk7CisgICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIHRoaXMuX3Nob3cuYmluZCh0aGlzLCBmYWxzZSkpOworICAgIHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIHRoaXMuX2hpZGUuYmluZCh0aGlzLCBmYWxzZSkpOworICAgIHBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5faGlkZS5iaW5kKHRoaXMsIHRydWUpKTsKKyAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHBvcHVwKTsKKyAgICByZXR1cm4gd3JhcHBlcjsKKyAgfQorCisgIF9mb3JtYXRDb250ZW50cyhjb250ZW50cykgeworICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7CisgICAgY29uc3QgbGluZXMgPSBjb250ZW50cy5zcGxpdCgvKD86XHJcbj98XG4pLyk7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07CisgICAgICBwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpKTsKKworICAgICAgaWYgKGkgPCBpaSAtIDEpIHsKKyAgICAgICAgcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcDsKKyAgfQorCisgIF90b2dnbGUoKSB7CisgICAgaWYgKHRoaXMucGlubmVkKSB7CisgICAgICB0aGlzLl9oaWRlKHRydWUpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9zaG93KHRydWUpOworICAgIH0KKyAgfQorCisgIF9zaG93KHBpbiA9IGZhbHNlKSB7CisgICAgaWYgKHBpbikgeworICAgICAgdGhpcy5waW5uZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmICh0aGlzLmhpZGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiaGlkZGVuIikpIHsKKyAgICAgIHRoaXMuaGlkZUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKTsKKyAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCArPSAxOworICAgIH0KKyAgfQorCisgIF9oaWRlKHVucGluID0gdHJ1ZSkgeworICAgIGlmICh1bnBpbikgeworICAgICAgdGhpcy5waW5uZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuaGlkZUVsZW1lbnQuaGFzQXR0cmlidXRlKCJoaWRkZW4iKSAmJiAhdGhpcy5waW5uZWQpIHsKKyAgICAgIHRoaXMuaGlkZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCB0cnVlKTsKKyAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCAtPSAxOworICAgIH0KKyAgfQorCit9CisKK2NsYXNzIEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAiZnJlZVRleHRBbm5vdGF0aW9uIjsKKworICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7CisgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAibGluZUFubm90YXRpb24iOworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07CisgICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdOworICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7CisgICAgY29uc3QgbGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6bGluZSIpOworICAgIGxpbmUuc2V0QXR0cmlidXRlKCJ4MSIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzBdKTsKKyAgICBsaW5lLnNldEF0dHJpYnV0ZSgieTEiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1sxXSk7CisgICAgbGluZS5zZXRBdHRyaWJ1dGUoIngyIiwgZGF0YS5yZWN0WzJdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMl0pOworICAgIGxpbmUuc2V0QXR0cmlidXRlKCJ5MiIsIGRhdGEucmVjdFszXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzNdKTsKKyAgICBsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTsKKyAgICBsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgInRyYW5zcGFyZW50Iik7CisgICAgc3ZnLmFwcGVuZENoaWxkKGxpbmUpOworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpOworCisgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIGxpbmUsIGRhdGEpOworCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAic3F1YXJlQW5ub3RhdGlvbiI7CisgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICBjb25zdCB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTsKKyAgICBjb25zdCBoZWlnaHQgPSBkYXRhLnJlY3RbM10gLSBkYXRhLnJlY3RbMV07CisgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICBjb25zdCBib3JkZXJXaWR0aCA9IGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7CisgICAgY29uc3Qgc3F1YXJlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7CisgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgieCIsIGJvcmRlcldpZHRoIC8gMik7CisgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgieSIsIGJvcmRlcldpZHRoIC8gMik7CisgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgid2lkdGgiLCB3aWR0aCAtIGJvcmRlcldpZHRoKTsKKyAgICBzcXVhcmUuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoZWlnaHQgLSBib3JkZXJXaWR0aCk7CisgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgYm9yZGVyV2lkdGggfHwgMSk7CisgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgInRyYW5zcGFyZW50Iik7CisgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJub25lIik7CisgICAgc3ZnLmFwcGVuZENoaWxkKHNxdWFyZSk7CisgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7CisKKyAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgc3F1YXJlLCBkYXRhKTsKKworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImNpcmNsZUFubm90YXRpb24iOworICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CisgICAgY29uc3Qgd2lkdGggPSBkYXRhLnJlY3RbMl0gLSBkYXRhLnJlY3RbMF07CisgICAgY29uc3QgaGVpZ2h0ID0gZGF0YS5yZWN0WzNdIC0gZGF0YS5yZWN0WzFdOworICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7CisgICAgY29uc3QgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoOworICAgIGNvbnN0IGNpcmNsZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZWxsaXBzZSIpOworICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoImN4Iiwgd2lkdGggLyAyKTsKKyAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCJjeSIsIGhlaWdodCAvIDIpOworICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoInJ4Iiwgd2lkdGggLyAyIC0gYm9yZGVyV2lkdGggLyAyKTsKKyAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCJyeSIsIGhlaWdodCAvIDIgLSBib3JkZXJXaWR0aCAvIDIpOworICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsIGJvcmRlcldpZHRoIHx8IDEpOworICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsICJ0cmFuc3BhcmVudCIpOworICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOworICAgIHN2Zy5hcHBlbmRDaGlsZChjaXJjbGUpOworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpOworCisgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIGNpcmNsZSwgZGF0YSk7CisKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSAicG9seWxpbmVBbm5vdGF0aW9uIjsKKyAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gInN2Zzpwb2x5bGluZSI7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy5jb250YWluZXJDbGFzc05hbWU7CisgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICBjb25zdCB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTsKKyAgICBjb25zdCBoZWlnaHQgPSBkYXRhLnJlY3RbM10gLSBkYXRhLnJlY3RbMV07CisgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICBsZXQgcG9pbnRzID0gW107CisKKyAgICBmb3IgKGNvbnN0IGNvb3JkaW5hdGUgb2YgZGF0YS52ZXJ0aWNlcykgeworICAgICAgY29uc3QgeCA9IGNvb3JkaW5hdGUueCAtIGRhdGEucmVjdFswXTsKKyAgICAgIGNvbnN0IHkgPSBkYXRhLnJlY3RbM10gLSBjb29yZGluYXRlLnk7CisgICAgICBwb2ludHMucHVzaCh4ICsgIiwiICsgeSk7CisgICAgfQorCisgICAgcG9pbnRzID0gcG9pbnRzLmpvaW4oIiAiKTsKKyAgICBjb25zdCBwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpOworICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZSgicG9pbnRzIiwgcG9pbnRzKTsKKyAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7CisgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2UiLCAidHJhbnNwYXJlbnQiKTsKKyAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOworICAgIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZSk7CisgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7CisKKyAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgcG9seWxpbmUsIGRhdGEpOworCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgUG9seWdvbkFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9ICJwb2x5Z29uQW5ub3RhdGlvbiI7CisgICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9ICJzdmc6cG9seWdvbiI7CisgIH0KKworfQorCitjbGFzcyBDYXJldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImNhcmV0QW5ub3RhdGlvbiI7CisKKyAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgSW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9ICJpbmtBbm5vdGF0aW9uIjsKKyAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gInN2Zzpwb2x5bGluZSI7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy5jb250YWluZXJDbGFzc05hbWU7CisgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICBjb25zdCB3aWR0aCA9IGRhdGEucmVjdFsyXSAtIGRhdGEucmVjdFswXTsKKyAgICBjb25zdCBoZWlnaHQgPSBkYXRhLnJlY3RbM10gLSBkYXRhLnJlY3RbMV07CisgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTsKKworICAgIGZvciAoY29uc3QgaW5rTGlzdCBvZiBkYXRhLmlua0xpc3RzKSB7CisgICAgICBsZXQgcG9pbnRzID0gW107CisKKyAgICAgIGZvciAoY29uc3QgY29vcmRpbmF0ZSBvZiBpbmtMaXN0KSB7CisgICAgICAgIGNvbnN0IHggPSBjb29yZGluYXRlLnggLSBkYXRhLnJlY3RbMF07CisgICAgICAgIGNvbnN0IHkgPSBkYXRhLnJlY3RbM10gLSBjb29yZGluYXRlLnk7CisgICAgICAgIHBvaW50cy5wdXNoKGAke3h9LCR7eX1gKTsKKyAgICAgIH0KKworICAgICAgcG9pbnRzID0gcG9pbnRzLmpvaW4oIiAiKTsKKyAgICAgIGNvbnN0IHBvbHlsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7CisgICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoInBvaW50cyIsIHBvaW50cyk7CisgICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7CisgICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsICJ0cmFuc3BhcmVudCIpOworICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKCJmaWxsIiwgIm5vbmUiKTsKKworICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIHBvbHlsaW5lLCBkYXRhKTsKKworICAgICAgc3ZnLmFwcGVuZENoaWxkKHBvbHlsaW5lKTsKKyAgICB9CisKKyAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTsKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJoaWdobGlnaHRBbm5vdGF0aW9uIjsKKworICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7CisgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJ1bmRlcmxpbmVBbm5vdGF0aW9uIjsKKworICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7CisgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0aGlzLmNvbnRhaW5lciwgbnVsbCwgdGhpcy5kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgIH0KKworfQorCitjbGFzcyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQgeworICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZSB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHMpOworICAgIHN1cGVyKHBhcmFtZXRlcnMsIGlzUmVuZGVyYWJsZSwgdHJ1ZSk7CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gInNxdWlnZ2x5QW5ub3RhdGlvbiI7CisKKyAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50cyk7CisgICAgc3VwZXIocGFyYW1ldGVycywgaXNSZW5kZXJhYmxlLCB0cnVlKTsKKyAgfQorCisgIHJlbmRlcigpIHsKKyAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAic3RyaWtlb3V0QW5ub3RhdGlvbiI7CisKKyAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkgeworICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodGhpcy5jb250YWluZXIsIG51bGwsIHRoaXMuZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICB9CisKK30KKworY2xhc3MgU3RhbXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHsKKyAgY29uc3RydWN0b3IocGFyYW1ldGVycykgeworICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGUgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzKTsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCBpc1JlbmRlcmFibGUsIHRydWUpOworICB9CisKKyAgcmVuZGVyKCkgeworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICJzdGFtcEFubm90YXRpb24iOworCisgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHsKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCBudWxsLCB0aGlzLmRhdGEpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCit9CisKK2NsYXNzIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7CisgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKKyAgICBzdXBlcihwYXJhbWV0ZXJzLCB0cnVlKTsKKyAgICBjb25zdCB7CisgICAgICBmaWxlbmFtZSwKKyAgICAgIGNvbnRlbnQKKyAgICB9ID0gdGhpcy5kYXRhLmZpbGU7CisgICAgdGhpcy5maWxlbmFtZSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRGaWxlbmFtZUZyb21VcmwpKGZpbGVuYW1lKTsKKyAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50OworCisgICAgaWYgKHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpIHsKKyAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMuZGlzcGF0Y2goImZpbGVhdHRhY2htZW50YW5ub3RhdGlvbiIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICBpZDogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShmaWxlbmFtZSksCisgICAgICAgIGZpbGVuYW1lLAorICAgICAgICBjb250ZW50CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICByZW5kZXIoKSB7CisgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gImZpbGVBdHRhY2htZW50QW5ub3RhdGlvbiI7CisgICAgY29uc3QgdHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRyaWdnZXIuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0OworICAgIHRyaWdnZXIuc3R5bGUud2lkdGggPSB0aGlzLmNvbnRhaW5lci5zdHlsZS53aWR0aDsKKyAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgdGhpcy5fZG93bmxvYWQuYmluZCh0aGlzKSk7CisKKyAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCAmJiAodGhpcy5kYXRhLnRpdGxlIHx8IHRoaXMuZGF0YS5jb250ZW50cykpIHsKKyAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHRoaXMuY29udGFpbmVyLCB0cmlnZ2VyLCB0aGlzLmRhdGEpOworICAgIH0KKworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRyaWdnZXIpOworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKKyAgfQorCisgIF9kb3dubG9hZCgpIHsKKyAgICBpZiAoIXRoaXMuZG93bmxvYWRNYW5hZ2VyKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoIkRvd25sb2FkIGNhbm5vdCBiZSBzdGFydGVkIGR1ZSB0byB1bmF2YWlsYWJsZSBkb3dubG9hZCBtYW5hZ2VyIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5kb3dubG9hZE1hbmFnZXIuZG93bmxvYWREYXRhKHRoaXMuY29udGVudCwgdGhpcy5maWxlbmFtZSwgIiIpOworICB9CisKK30KKworY2xhc3MgQW5ub3RhdGlvbkxheWVyIHsKKyAgc3RhdGljIHJlbmRlcihwYXJhbWV0ZXJzKSB7CisgICAgY29uc3Qgc29ydGVkQW5ub3RhdGlvbnMgPSBbXSwKKyAgICAgICAgICBwb3B1cEFubm90YXRpb25zID0gW107CisKKyAgICBmb3IgKGNvbnN0IGRhdGEgb2YgcGFyYW1ldGVycy5hbm5vdGF0aW9ucykgeworICAgICAgaWYgKCFkYXRhKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5hbm5vdGF0aW9uVHlwZSA9PT0gX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9QVVApIHsKKyAgICAgICAgcG9wdXBBbm5vdGF0aW9ucy5wdXNoKGRhdGEpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgc29ydGVkQW5ub3RhdGlvbnMucHVzaChkYXRhKTsKKyAgICB9CisKKyAgICBpZiAocG9wdXBBbm5vdGF0aW9ucy5sZW5ndGgpIHsKKyAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goLi4ucG9wdXBBbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBkYXRhIG9mIHNvcnRlZEFubm90YXRpb25zKSB7CisgICAgICBjb25zdCBlbGVtZW50ID0gQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5LmNyZWF0ZSh7CisgICAgICAgIGRhdGEsCisgICAgICAgIGxheWVyOiBwYXJhbWV0ZXJzLmRpdiwKKyAgICAgICAgcGFnZTogcGFyYW1ldGVycy5wYWdlLAorICAgICAgICB2aWV3cG9ydDogcGFyYW1ldGVycy52aWV3cG9ydCwKKyAgICAgICAgbGlua1NlcnZpY2U6IHBhcmFtZXRlcnMubGlua1NlcnZpY2UsCisgICAgICAgIGRvd25sb2FkTWFuYWdlcjogcGFyYW1ldGVycy5kb3dubG9hZE1hbmFnZXIsCisgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogcGFyYW1ldGVycy5pbWFnZVJlc291cmNlc1BhdGggfHwgIiIsCisgICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHR5cGVvZiBwYXJhbWV0ZXJzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPT09ICJib29sZWFuIiA/IHBhcmFtZXRlcnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA6IHRydWUsCisgICAgICAgIHN2Z0ZhY3Rvcnk6IG5ldyBfZGlzcGxheV91dGlscy5ET01TVkdGYWN0b3J5KCksCisgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlIHx8IG5ldyBfYW5ub3RhdGlvbl9zdG9yYWdlLkFubm90YXRpb25TdG9yYWdlKCkKKyAgICAgIH0pOworCisgICAgICBpZiAoZWxlbWVudC5pc1JlbmRlcmFibGUpIHsKKyAgICAgICAgcGFyYW1ldGVycy5kaXYuYXBwZW5kQ2hpbGQoZWxlbWVudC5yZW5kZXIoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIHVwZGF0ZShwYXJhbWV0ZXJzKSB7CisgICAgZm9yIChjb25zdCBkYXRhIG9mIHBhcmFtZXRlcnMuYW5ub3RhdGlvbnMpIHsKKyAgICAgIGNvbnN0IGVsZW1lbnQgPSBwYXJhbWV0ZXJzLmRpdi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hbm5vdGF0aW9uLWlkPSIke2RhdGEuaWR9Il1gKTsKKworICAgICAgaWYgKGVsZW1lbnQpIHsKKyAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgbWF0cml4KCR7cGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbigiLCIpfSlgOworICAgICAgfQorICAgIH0KKworICAgIHBhcmFtZXRlcnMuZGl2LnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIik7CisgIH0KKworfQorCitleHBvcnRzLkFubm90YXRpb25MYXllciA9IEFubm90YXRpb25MYXllcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS9hbm5vdGF0aW9uX3N0b3JhZ2UuanMgYi9saWIvZGlzcGxheS9hbm5vdGF0aW9uX3N0b3JhZ2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNDcxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kaXNwbGF5L2Fubm90YXRpb25fc3RvcmFnZS5qcwpAQCAtMCwwICsxLDg5IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Bbm5vdGF0aW9uU3RvcmFnZSA9IHZvaWQgMDsKKworY2xhc3MgQW5ub3RhdGlvblN0b3JhZ2UgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLl9zdG9yYWdlID0gbmV3IE1hcCgpOworICAgIHRoaXMuX21vZGlmaWVkID0gZmFsc2U7CisgICAgdGhpcy5vblNldE1vZGlmaWVkID0gbnVsbDsKKyAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCA9IG51bGw7CisgIH0KKworICBnZXRPckNyZWF0ZVZhbHVlKGtleSwgZGVmYXVsdFZhbHVlKSB7CisgICAgaWYgKHRoaXMuX3N0b3JhZ2UuaGFzKGtleSkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldChrZXkpOworICAgIH0KKworICAgIHRoaXMuX3N0b3JhZ2Uuc2V0KGtleSwgZGVmYXVsdFZhbHVlKTsKKworICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgIH0KKworICBzZXRWYWx1ZShrZXksIHZhbHVlKSB7CisgICAgaWYgKHRoaXMuX3N0b3JhZ2UuZ2V0KGtleSkgIT09IHZhbHVlKSB7CisgICAgICB0aGlzLl9zZXRNb2RpZmllZCgpOworICAgIH0KKworICAgIHRoaXMuX3N0b3JhZ2Uuc2V0KGtleSwgdmFsdWUpOworICB9CisKKyAgZ2V0QWxsKCkgeworICAgIGlmICh0aGlzLl9zdG9yYWdlLnNpemUgPT09IDApIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fc3RvcmFnZSk7CisgIH0KKworICBnZXQgc2l6ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5zaXplOworICB9CisKKyAgX3NldE1vZGlmaWVkKCkgeworICAgIGlmICghdGhpcy5fbW9kaWZpZWQpIHsKKyAgICAgIHRoaXMuX21vZGlmaWVkID0gdHJ1ZTsKKworICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uU2V0TW9kaWZpZWQgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgdGhpcy5vblNldE1vZGlmaWVkKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmVzZXRNb2RpZmllZCgpIHsKKyAgICBpZiAodGhpcy5fbW9kaWZpZWQpIHsKKyAgICAgIHRoaXMuX21vZGlmaWVkID0gZmFsc2U7CisKKyAgICAgIGlmICh0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgdGhpcy5vblJlc2V0TW9kaWZpZWQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLkFubm90YXRpb25TdG9yYWdlID0gQW5ub3RhdGlvblN0b3JhZ2U7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2Rpc3BsYXkvYXBpLmpzIGIvbGliL2Rpc3BsYXkvYXBpLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNGJjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGlzcGxheS9hcGkuanMKQEAgLTAsMCArMSwyMTg0IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXREb2N1bWVudCA9IGdldERvY3VtZW50OworZXhwb3J0cy5zZXRQREZOZXR3b3JrU3RyZWFtRmFjdG9yeSA9IHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5OworZXhwb3J0cy5idWlsZCA9IGV4cG9ydHMudmVyc2lvbiA9IGV4cG9ydHMuUERGUGFnZVByb3h5ID0gZXhwb3J0cy5QREZEb2N1bWVudFByb3h5ID0gZXhwb3J0cy5QREZXb3JrZXIgPSBleHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydCA9IGV4cG9ydHMuTG9vcGJhY2tQb3J0ID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX2Rpc3BsYXlfdXRpbHMgPSByZXF1aXJlKCIuL2Rpc3BsYXlfdXRpbHMuanMiKTsKKwordmFyIF9mb250X2xvYWRlciA9IHJlcXVpcmUoIi4vZm9udF9sb2FkZXIuanMiKTsKKwordmFyIF9ub2RlX3V0aWxzID0gcmVxdWlyZSgiLi9ub2RlX3V0aWxzLmpzIik7CisKK3ZhciBfYW5ub3RhdGlvbl9zdG9yYWdlID0gcmVxdWlyZSgiLi9hbm5vdGF0aW9uX3N0b3JhZ2UuanMiKTsKKwordmFyIF9hcGlfY29tcGF0aWJpbGl0eSA9IHJlcXVpcmUoIi4vYXBpX2NvbXBhdGliaWxpdHkuanMiKTsKKwordmFyIF9jYW52YXMgPSByZXF1aXJlKCIuL2NhbnZhcy5qcyIpOworCit2YXIgX3dvcmtlcl9vcHRpb25zID0gcmVxdWlyZSgiLi93b3JrZXJfb3B0aW9ucy5qcyIpOworCit2YXIgX2lzX25vZGUgPSByZXF1aXJlKCIuLi9zaGFyZWQvaXNfbm9kZS5qcyIpOworCit2YXIgX21lc3NhZ2VfaGFuZGxlciA9IHJlcXVpcmUoIi4uL3NoYXJlZC9tZXNzYWdlX2hhbmRsZXIuanMiKTsKKwordmFyIF9tZXRhZGF0YSA9IHJlcXVpcmUoIi4vbWV0YWRhdGEuanMiKTsKKwordmFyIF9vcHRpb25hbF9jb250ZW50X2NvbmZpZyA9IHJlcXVpcmUoIi4vb3B0aW9uYWxfY29udGVudF9jb25maWcuanMiKTsKKwordmFyIF90cmFuc3BvcnRfc3RyZWFtID0gcmVxdWlyZSgiLi90cmFuc3BvcnRfc3RyZWFtLmpzIik7CisKK3ZhciBfd2ViZ2wgPSByZXF1aXJlKCIuL3dlYmdsLmpzIik7CisKK2NvbnN0IERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRSA9IDY1NTM2OworY29uc3QgUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUID0gMTAwOworY29uc3QgRGVmYXVsdENhbnZhc0ZhY3RvcnkgPSBfaXNfbm9kZS5pc05vZGVKUyA/IF9ub2RlX3V0aWxzLk5vZGVDYW52YXNGYWN0b3J5IDogX2Rpc3BsYXlfdXRpbHMuRE9NQ2FudmFzRmFjdG9yeTsKK2NvbnN0IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSA9IF9pc19ub2RlLmlzTm9kZUpTID8gX25vZGVfdXRpbHMuTm9kZUNNYXBSZWFkZXJGYWN0b3J5IDogX2Rpc3BsYXlfdXRpbHMuRE9NQ01hcFJlYWRlckZhY3Rvcnk7CitsZXQgY3JlYXRlUERGTmV0d29ya1N0cmVhbTsKKworZnVuY3Rpb24gc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkocGRmTmV0d29ya1N0cmVhbUZhY3RvcnkpIHsKKyAgY3JlYXRlUERGTmV0d29ya1N0cmVhbSA9IHBkZk5ldHdvcmtTdHJlYW1GYWN0b3J5OworfQorCitmdW5jdGlvbiBnZXREb2N1bWVudChzcmMpIHsKKyAgY29uc3QgdGFzayA9IG5ldyBQREZEb2N1bWVudExvYWRpbmdUYXNrKCk7CisgIGxldCBzb3VyY2U7CisKKyAgaWYgKHR5cGVvZiBzcmMgPT09ICJzdHJpbmciKSB7CisgICAgc291cmNlID0geworICAgICAgdXJsOiBzcmMKKyAgICB9OworICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShzcmMpKSB7CisgICAgc291cmNlID0geworICAgICAgZGF0YTogc3JjCisgICAgfTsKKyAgfSBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQpIHsKKyAgICBzb3VyY2UgPSB7CisgICAgICByYW5nZTogc3JjCisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBpZiAodHlwZW9mIHNyYyAhPT0gIm9iamVjdCIpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgaW4gZ2V0RG9jdW1lbnQsICIgKyAibmVlZCBlaXRoZXIgVWludDhBcnJheSwgc3RyaW5nIG9yIGEgcGFyYW1ldGVyIG9iamVjdCIpOworICAgIH0KKworICAgIGlmICghc3JjLnVybCAmJiAhc3JjLmRhdGEgJiYgIXNyYy5yYW5nZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciBvYmplY3Q6IG5lZWQgZWl0aGVyIC5kYXRhLCAucmFuZ2Ugb3IgLnVybCIpOworICAgIH0KKworICAgIHNvdXJjZSA9IHNyYzsKKyAgfQorCisgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIGxldCByYW5nZVRyYW5zcG9ydCA9IG51bGwsCisgICAgICB3b3JrZXIgPSBudWxsOworCisgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkgeworICAgIGlmIChrZXkgPT09ICJ1cmwiICYmIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBwYXJhbXNba2V5XSA9IG5ldyBVUkwoc291cmNlW2tleV0sIHdpbmRvdy5sb2NhdGlvbikuaHJlZjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSBpZiAoa2V5ID09PSAicmFuZ2UiKSB7CisgICAgICByYW5nZVRyYW5zcG9ydCA9IHNvdXJjZVtrZXldOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChrZXkgPT09ICJ3b3JrZXIiKSB7CisgICAgICB3b3JrZXIgPSBzb3VyY2Vba2V5XTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSBpZiAoa2V5ID09PSAiZGF0YSIgJiYgIShzb3VyY2Vba2V5XSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7CisgICAgICBjb25zdCBwZGZCeXRlcyA9IHNvdXJjZVtrZXldOworCisgICAgICBpZiAodHlwZW9mIHBkZkJ5dGVzID09PSAic3RyaW5nIikgeworICAgICAgICBwYXJhbXNba2V5XSA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShwZGZCeXRlcyk7CisgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwZGZCeXRlcyA9PT0gIm9iamVjdCIgJiYgcGRmQnl0ZXMgIT09IG51bGwgJiYgIWlzTmFOKHBkZkJ5dGVzLmxlbmd0aCkpIHsKKyAgICAgICAgcGFyYW1zW2tleV0gPSBuZXcgVWludDhBcnJheShwZGZCeXRlcyk7CisgICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShwZGZCeXRlcykpIHsKKyAgICAgICAgcGFyYW1zW2tleV0gPSBuZXcgVWludDhBcnJheShwZGZCeXRlcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgUERGIGJpbmFyeSBkYXRhOiBlaXRoZXIgdHlwZWQgYXJyYXksICIgKyAic3RyaW5nIG9yIGFycmF5LWxpa2Ugb2JqZWN0IGlzIGV4cGVjdGVkIGluIHRoZSAiICsgImRhdGEgcHJvcGVydHkuIik7CisgICAgICB9CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHBhcmFtc1trZXldID0gc291cmNlW2tleV07CisgIH0KKworICBwYXJhbXMucmFuZ2VDaHVua1NpemUgPSBwYXJhbXMucmFuZ2VDaHVua1NpemUgfHwgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFOworICBwYXJhbXMuQ01hcFJlYWRlckZhY3RvcnkgPSBwYXJhbXMuQ01hcFJlYWRlckZhY3RvcnkgfHwgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5OworICBwYXJhbXMuaWdub3JlRXJyb3JzID0gcGFyYW1zLnN0b3BBdEVycm9ycyAhPT0gdHJ1ZTsKKyAgcGFyYW1zLmZvbnRFeHRyYVByb3BlcnRpZXMgPSBwYXJhbXMuZm9udEV4dHJhUHJvcGVydGllcyA9PT0gdHJ1ZTsKKyAgcGFyYW1zLnBkZkJ1ZyA9IHBhcmFtcy5wZGZCdWcgPT09IHRydWU7CisKKyAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcmFtcy5tYXhJbWFnZVNpemUpKSB7CisgICAgcGFyYW1zLm1heEltYWdlU2l6ZSA9IC0xOworICB9CisKKyAgaWYgKHR5cGVvZiBwYXJhbXMuaXNFdmFsU3VwcG9ydGVkICE9PSAiYm9vbGVhbiIpIHsKKyAgICBwYXJhbXMuaXNFdmFsU3VwcG9ydGVkID0gdHJ1ZTsKKyAgfQorCisgIGlmICh0eXBlb2YgcGFyYW1zLmRpc2FibGVGb250RmFjZSAhPT0gImJvb2xlYW4iKSB7CisgICAgcGFyYW1zLmRpc2FibGVGb250RmFjZSA9IF9hcGlfY29tcGF0aWJpbGl0eS5hcGlDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVGb250RmFjZSB8fCBmYWxzZTsKKyAgfQorCisgIGlmICh0eXBlb2YgcGFyYW1zLm93bmVyRG9jdW1lbnQgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgcGFyYW1zLm93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50OworICB9CisKKyAgaWYgKHR5cGVvZiBwYXJhbXMuZGlzYWJsZVJhbmdlICE9PSAiYm9vbGVhbiIpIHsKKyAgICBwYXJhbXMuZGlzYWJsZVJhbmdlID0gZmFsc2U7CisgIH0KKworICBpZiAodHlwZW9mIHBhcmFtcy5kaXNhYmxlU3RyZWFtICE9PSAiYm9vbGVhbiIpIHsKKyAgICBwYXJhbXMuZGlzYWJsZVN0cmVhbSA9IGZhbHNlOworICB9CisKKyAgaWYgKHR5cGVvZiBwYXJhbXMuZGlzYWJsZUF1dG9GZXRjaCAhPT0gImJvb2xlYW4iKSB7CisgICAgcGFyYW1zLmRpc2FibGVBdXRvRmV0Y2ggPSBmYWxzZTsKKyAgfQorCisgICgwLCBfdXRpbC5zZXRWZXJib3NpdHlMZXZlbCkocGFyYW1zLnZlcmJvc2l0eSk7CisKKyAgaWYgKCF3b3JrZXIpIHsKKyAgICBjb25zdCB3b3JrZXJQYXJhbXMgPSB7CisgICAgICB2ZXJib3NpdHk6IHBhcmFtcy52ZXJib3NpdHksCisgICAgICBwb3J0OiBfd29ya2VyX29wdGlvbnMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0CisgICAgfTsKKyAgICB3b3JrZXIgPSB3b3JrZXJQYXJhbXMucG9ydCA/IFBERldvcmtlci5mcm9tUG9ydCh3b3JrZXJQYXJhbXMpIDogbmV3IFBERldvcmtlcih3b3JrZXJQYXJhbXMpOworICAgIHRhc2suX3dvcmtlciA9IHdvcmtlcjsKKyAgfQorCisgIGNvbnN0IGRvY0lkID0gdGFzay5kb2NJZDsKKyAgd29ya2VyLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgaWYgKHRhc2suZGVzdHJveWVkKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkxvYWRpbmcgYWJvcnRlZCIpOworICAgIH0KKworICAgIGNvbnN0IHdvcmtlcklkUHJvbWlzZSA9IF9mZXRjaERvY3VtZW50KHdvcmtlciwgcGFyYW1zLCByYW5nZVRyYW5zcG9ydCwgZG9jSWQpOworCisgICAgY29uc3QgbmV0d29ya1N0cmVhbVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgbGV0IG5ldHdvcmtTdHJlYW07CisKKyAgICAgIGlmIChyYW5nZVRyYW5zcG9ydCkgeworICAgICAgICBuZXR3b3JrU3RyZWFtID0gbmV3IF90cmFuc3BvcnRfc3RyZWFtLlBERkRhdGFUcmFuc3BvcnRTdHJlYW0oeworICAgICAgICAgIGxlbmd0aDogcGFyYW1zLmxlbmd0aCwKKyAgICAgICAgICBpbml0aWFsRGF0YTogcGFyYW1zLmluaXRpYWxEYXRhLAorICAgICAgICAgIHByb2dyZXNzaXZlRG9uZTogcGFyYW1zLnByb2dyZXNzaXZlRG9uZSwKKyAgICAgICAgICBkaXNhYmxlUmFuZ2U6IHBhcmFtcy5kaXNhYmxlUmFuZ2UsCisgICAgICAgICAgZGlzYWJsZVN0cmVhbTogcGFyYW1zLmRpc2FibGVTdHJlYW0KKyAgICAgICAgfSwgcmFuZ2VUcmFuc3BvcnQpOworICAgICAgfSBlbHNlIGlmICghcGFyYW1zLmRhdGEpIHsKKyAgICAgICAgbmV0d29ya1N0cmVhbSA9IGNyZWF0ZVBERk5ldHdvcmtTdHJlYW0oeworICAgICAgICAgIHVybDogcGFyYW1zLnVybCwKKyAgICAgICAgICBsZW5ndGg6IHBhcmFtcy5sZW5ndGgsCisgICAgICAgICAgaHR0cEhlYWRlcnM6IHBhcmFtcy5odHRwSGVhZGVycywKKyAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHBhcmFtcy53aXRoQ3JlZGVudGlhbHMsCisgICAgICAgICAgcmFuZ2VDaHVua1NpemU6IHBhcmFtcy5yYW5nZUNodW5rU2l6ZSwKKyAgICAgICAgICBkaXNhYmxlUmFuZ2U6IHBhcmFtcy5kaXNhYmxlUmFuZ2UsCisgICAgICAgICAgZGlzYWJsZVN0cmVhbTogcGFyYW1zLmRpc2FibGVTdHJlYW0KKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHJlc29sdmUobmV0d29ya1N0cmVhbSk7CisgICAgfSk7CisgICAgcmV0dXJuIFByb21pc2UuYWxsKFt3b3JrZXJJZFByb21pc2UsIG5ldHdvcmtTdHJlYW1Qcm9taXNlXSkudGhlbihmdW5jdGlvbiAoW3dvcmtlcklkLCBuZXR3b3JrU3RyZWFtXSkgeworICAgICAgaWYgKHRhc2suZGVzdHJveWVkKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiTG9hZGluZyBhYm9ydGVkIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoZG9jSWQsIHdvcmtlcklkLCB3b3JrZXIucG9ydCk7CisgICAgICBtZXNzYWdlSGFuZGxlci5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IHdvcmtlci5wb3N0TWVzc2FnZVRyYW5zZmVyczsKKyAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBXb3JrZXJUcmFuc3BvcnQobWVzc2FnZUhhbmRsZXIsIHRhc2ssIG5ldHdvcmtTdHJlYW0sIHBhcmFtcyk7CisgICAgICB0YXNrLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKCJSZWFkeSIsIG51bGwpOworICAgIH0pOworICB9KS5jYXRjaCh0YXNrLl9jYXBhYmlsaXR5LnJlamVjdCk7CisgIHJldHVybiB0YXNrOworfQorCitmdW5jdGlvbiBfZmV0Y2hEb2N1bWVudCh3b3JrZXIsIHNvdXJjZSwgcGRmRGF0YVJhbmdlVHJhbnNwb3J0LCBkb2NJZCkgeworICBpZiAod29ya2VyLmRlc3Ryb3llZCkgeworICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIikpOworICB9CisKKyAgaWYgKHBkZkRhdGFSYW5nZVRyYW5zcG9ydCkgeworICAgIHNvdXJjZS5sZW5ndGggPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQubGVuZ3RoOworICAgIHNvdXJjZS5pbml0aWFsRGF0YSA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5pbml0aWFsRGF0YTsKKyAgICBzb3VyY2UucHJvZ3Jlc3NpdmVEb25lID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnByb2dyZXNzaXZlRG9uZTsKKyAgfQorCisgIHJldHVybiB3b3JrZXIubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREb2NSZXF1ZXN0IiwgeworICAgIGRvY0lkLAorICAgIGFwaVZlcnNpb246ICcyLjYuMzQ3JywKKyAgICBzb3VyY2U6IHsKKyAgICAgIGRhdGE6IHNvdXJjZS5kYXRhLAorICAgICAgdXJsOiBzb3VyY2UudXJsLAorICAgICAgcGFzc3dvcmQ6IHNvdXJjZS5wYXNzd29yZCwKKyAgICAgIGRpc2FibGVBdXRvRmV0Y2g6IHNvdXJjZS5kaXNhYmxlQXV0b0ZldGNoLAorICAgICAgcmFuZ2VDaHVua1NpemU6IHNvdXJjZS5yYW5nZUNodW5rU2l6ZSwKKyAgICAgIGxlbmd0aDogc291cmNlLmxlbmd0aAorICAgIH0sCisgICAgbWF4SW1hZ2VTaXplOiBzb3VyY2UubWF4SW1hZ2VTaXplLAorICAgIGRpc2FibGVGb250RmFjZTogc291cmNlLmRpc2FibGVGb250RmFjZSwKKyAgICBwb3N0TWVzc2FnZVRyYW5zZmVyczogd29ya2VyLnBvc3RNZXNzYWdlVHJhbnNmZXJzLAorICAgIGRvY0Jhc2VVcmw6IHNvdXJjZS5kb2NCYXNlVXJsLAorICAgIGlnbm9yZUVycm9yczogc291cmNlLmlnbm9yZUVycm9ycywKKyAgICBpc0V2YWxTdXBwb3J0ZWQ6IHNvdXJjZS5pc0V2YWxTdXBwb3J0ZWQsCisgICAgZm9udEV4dHJhUHJvcGVydGllczogc291cmNlLmZvbnRFeHRyYVByb3BlcnRpZXMKKyAgfSkudGhlbihmdW5jdGlvbiAod29ya2VySWQpIHsKKyAgICBpZiAod29ya2VyLmRlc3Ryb3llZCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpOworICAgIH0KKworICAgIHJldHVybiB3b3JrZXJJZDsKKyAgfSk7Cit9CisKK2NvbnN0IFBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSBmdW5jdGlvbiBQREZEb2N1bWVudExvYWRpbmdUYXNrQ2xvc3VyZSgpIHsKKyAgbGV0IG5leHREb2N1bWVudElkID0gMDsKKworICBjbGFzcyBQREZEb2N1bWVudExvYWRpbmdUYXNrIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgIHRoaXMuX2NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsOworICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDsKKyAgICAgIHRoaXMuZG9jSWQgPSAiZCIgKyBuZXh0RG9jdW1lbnRJZCsrOworICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMub25QYXNzd29yZCA9IG51bGw7CisgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICAgICAgdGhpcy5vblVuc3VwcG9ydGVkRmVhdHVyZSA9IG51bGw7CisgICAgfQorCisgICAgZ2V0IHByb21pc2UoKSB7CisgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0KKworICAgIGRlc3Ryb3koKSB7CisgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7CisgICAgICBjb25zdCB0cmFuc3BvcnREZXN0cm95ZWQgPSAhdGhpcy5fdHJhbnNwb3J0ID8gUHJvbWlzZS5yZXNvbHZlKCkgOiB0aGlzLl90cmFuc3BvcnQuZGVzdHJveSgpOworICAgICAgcmV0dXJuIHRyYW5zcG9ydERlc3Ryb3llZC50aGVuKCgpID0+IHsKKyAgICAgICAgdGhpcy5fdHJhbnNwb3J0ID0gbnVsbDsKKworICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7CisgICAgICAgICAgdGhpcy5fd29ya2VyLmRlc3Ryb3koKTsKKworICAgICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworICB9CisKKyAgcmV0dXJuIFBERkRvY3VtZW50TG9hZGluZ1Rhc2s7Cit9KCk7CisKK2NsYXNzIFBERkRhdGFSYW5nZVRyYW5zcG9ydCB7CisgIGNvbnN0cnVjdG9yKGxlbmd0aCwgaW5pdGlhbERhdGEsIHByb2dyZXNzaXZlRG9uZSA9IGZhbHNlKSB7CisgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgdGhpcy5pbml0aWFsRGF0YSA9IGluaXRpYWxEYXRhOworICAgIHRoaXMucHJvZ3Jlc3NpdmVEb25lID0gcHJvZ3Jlc3NpdmVEb25lOworICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107CisgICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXTsKKyAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTsKKyAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTsKKyAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgIH0KKworICBhZGRSYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSB7CisgICAgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7CisgIH0KKworICBhZGRQcm9ncmVzc0xpc3RlbmVyKGxpc3RlbmVyKSB7CisgICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7CisgIH0KKworICBhZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihsaXN0ZW5lcikgeworICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgfQorCisgIGFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKGxpc3RlbmVyKSB7CisgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOworICB9CisKKyAgb25EYXRhUmFuZ2UoYmVnaW4sIGNodW5rKSB7CisgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9yYW5nZUxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIoYmVnaW4sIGNodW5rKTsKKyAgICB9CisgIH0KKworICBvbkRhdGFQcm9ncmVzcyhsb2FkZWQsIHRvdGFsKSB7CisgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7CisgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzKSB7CisgICAgICAgIGxpc3RlbmVyKGxvYWRlZCwgdG90YWwpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgb25EYXRhUHJvZ3Jlc3NpdmVSZWFkKGNodW5rKSB7CisgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7CisgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycykgeworICAgICAgICBsaXN0ZW5lcihjaHVuayk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7CisgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7CisgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycykgeworICAgICAgICBsaXN0ZW5lcigpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgdHJhbnNwb3J0UmVhZHkoKSB7CisgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgfQorCisgIHJlcXVlc3REYXRhUmFuZ2UoYmVnaW4sIGVuZCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBQREZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZSIpOworICB9CisKKyAgYWJvcnQoKSB7fQorCit9CisKK2V4cG9ydHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0ID0gUERGRGF0YVJhbmdlVHJhbnNwb3J0OworCitjbGFzcyBQREZEb2N1bWVudFByb3h5IHsKKyAgY29uc3RydWN0b3IocGRmSW5mbywgdHJhbnNwb3J0KSB7CisgICAgdGhpcy5fcGRmSW5mbyA9IHBkZkluZm87CisgICAgdGhpcy5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICB9CisKKyAgZ2V0IGFubm90YXRpb25TdG9yYWdlKCkgeworICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYW5ub3RhdGlvblN0b3JhZ2UiLCBuZXcgX2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSgpKTsKKyAgfQorCisgIGdldCBudW1QYWdlcygpIHsKKyAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5udW1QYWdlczsKKyAgfQorCisgIGdldCBmaW5nZXJwcmludCgpIHsKKyAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5maW5nZXJwcmludDsKKyAgfQorCisgIGdldFBhZ2UocGFnZU51bWJlcikgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZShwYWdlTnVtYmVyKTsKKyAgfQorCisgIGdldFBhZ2VJbmRleChyZWYpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VJbmRleChyZWYpOworICB9CisKKyAgZ2V0RGVzdGluYXRpb25zKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCk7CisgIH0KKworICBnZXREZXN0aW5hdGlvbihpZCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb24oaWQpOworICB9CisKKyAgZ2V0UGFnZUxhYmVscygpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKTsKKyAgfQorCisgIGdldFBhZ2VMYXlvdXQoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTGF5b3V0KCk7CisgIH0KKworICBnZXRQYWdlTW9kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VNb2RlKCk7CisgIH0KKworICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFZpZXdlclByZWZlcmVuY2VzKCk7CisgIH0KKworICBnZXRPcGVuQWN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3BlbkFjdGlvbigpOworICB9CisKKyAgZ2V0QXR0YWNobWVudHMoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBdHRhY2htZW50cygpOworICB9CisKKyAgZ2V0SmF2YVNjcmlwdCgpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEphdmFTY3JpcHQoKTsKKyAgfQorCisgIGdldE91dGxpbmUoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPdXRsaW5lKCk7CisgIH0KKworICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTsKKyAgfQorCisgIGdldFBlcm1pc3Npb25zKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTsKKyAgfQorCisgIGdldE1ldGFkYXRhKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0TWV0YWRhdGEoKTsKKyAgfQorCisgIGdldERhdGEoKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7CisgIH0KKworICBnZXREb3dubG9hZEluZm8oKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBnZXRTdGF0cygpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFN0YXRzKCk7CisgIH0KKworICBjbGVhbnVwKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc3RhcnRDbGVhbnVwKCk7CisgIH0KKworICBkZXN0cm95KCkgeworICAgIHJldHVybiB0aGlzLmxvYWRpbmdUYXNrLmRlc3Ryb3koKTsKKyAgfQorCisgIGdldCBsb2FkaW5nUGFyYW1zKCkgeworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1BhcmFtczsKKyAgfQorCisgIGdldCBsb2FkaW5nVGFzaygpIHsKKyAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdUYXNrOworICB9CisKKyAgc2F2ZURvY3VtZW50KGFubm90YXRpb25TdG9yYWdlKSB7CisgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zYXZlRG9jdW1lbnQoYW5ub3RhdGlvblN0b3JhZ2UpOworICB9CisKK30KKworZXhwb3J0cy5QREZEb2N1bWVudFByb3h5ID0gUERGRG9jdW1lbnRQcm94eTsKKworY2xhc3MgUERGUGFnZVByb3h5IHsKKyAgY29uc3RydWN0b3IocGFnZUluZGV4LCBwYWdlSW5mbywgdHJhbnNwb3J0LCBvd25lckRvY3VtZW50LCBwZGZCdWcgPSBmYWxzZSkgeworICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDsKKyAgICB0aGlzLl9wYWdlSW5mbyA9IHBhZ2VJbmZvOworICAgIHRoaXMuX293bmVyRG9jdW1lbnQgPSBvd25lckRvY3VtZW50OworICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB0aGlzLl9zdGF0cyA9IHBkZkJ1ZyA/IG5ldyBfZGlzcGxheV91dGlscy5TdGF0VGltZXIoKSA6IG51bGw7CisgICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnOworICAgIHRoaXMuY29tbW9uT2JqcyA9IHRyYW5zcG9ydC5jb21tb25PYmpzOworICAgIHRoaXMub2JqcyA9IG5ldyBQREZPYmplY3RzKCk7CisgICAgdGhpcy5jbGVhbnVwQWZ0ZXJSZW5kZXIgPSBmYWxzZTsKKyAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gZmFsc2U7CisgICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpOworICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7CisgIH0KKworICBnZXQgcGFnZU51bWJlcigpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZUluZGV4ICsgMTsKKyAgfQorCisgIGdldCByb3RhdGUoKSB7CisgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJvdGF0ZTsKKyAgfQorCisgIGdldCByZWYoKSB7CisgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZjsKKyAgfQorCisgIGdldCB1c2VyVW5pdCgpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8udXNlclVuaXQ7CisgIH0KKworICBnZXQgdmlldygpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8udmlldzsKKyAgfQorCisgIGdldFZpZXdwb3J0KHsKKyAgICBzY2FsZSwKKyAgICByb3RhdGlvbiA9IHRoaXMucm90YXRlLAorICAgIG9mZnNldFggPSAwLAorICAgIG9mZnNldFkgPSAwLAorICAgIGRvbnRGbGlwID0gZmFsc2UKKyAgfSA9IHt9KSB7CisgICAgcmV0dXJuIG5ldyBfZGlzcGxheV91dGlscy5QYWdlVmlld3BvcnQoeworICAgICAgdmlld0JveDogdGhpcy52aWV3LAorICAgICAgc2NhbGUsCisgICAgICByb3RhdGlvbiwKKyAgICAgIG9mZnNldFgsCisgICAgICBvZmZzZXRZLAorICAgICAgZG9udEZsaXAKKyAgICB9KTsKKyAgfQorCisgIGdldEFubm90YXRpb25zKHsKKyAgICBpbnRlbnQgPSBudWxsCisgIH0gPSB7fSkgeworICAgIGlmICghdGhpcy5hbm5vdGF0aW9uc1Byb21pc2UgfHwgdGhpcy5hbm5vdGF0aW9uc0ludGVudCAhPT0gaW50ZW50KSB7CisgICAgICB0aGlzLmFubm90YXRpb25zUHJvbWlzZSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyh0aGlzLl9wYWdlSW5kZXgsIGludGVudCk7CisgICAgICB0aGlzLmFubm90YXRpb25zSW50ZW50ID0gaW50ZW50OworICAgIH0KKworICAgIHJldHVybiB0aGlzLmFubm90YXRpb25zUHJvbWlzZTsKKyAgfQorCisgIHJlbmRlcih7CisgICAgY2FudmFzQ29udGV4dCwKKyAgICB2aWV3cG9ydCwKKyAgICBpbnRlbnQgPSAiZGlzcGxheSIsCisgICAgZW5hYmxlV2ViR0wgPSBmYWxzZSwKKyAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gZmFsc2UsCisgICAgdHJhbnNmb3JtID0gbnVsbCwKKyAgICBpbWFnZUxheWVyID0gbnVsbCwKKyAgICBjYW52YXNGYWN0b3J5ID0gbnVsbCwKKyAgICBiYWNrZ3JvdW5kID0gbnVsbCwKKyAgICBhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsCisgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGwKKyAgfSkgeworICAgIGlmICh0aGlzLl9zdGF0cykgeworICAgICAgdGhpcy5fc3RhdHMudGltZSgiT3ZlcmFsbCIpOworICAgIH0KKworICAgIGNvbnN0IHJlbmRlcmluZ0ludGVudCA9IGludGVudCA9PT0gInByaW50IiA/ICJwcmludCIgOiAiZGlzcGxheSI7CisgICAgdGhpcy5wZW5kaW5nQ2xlYW51cCA9IGZhbHNlOworCisgICAgaWYgKCFvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7CisgICAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpOworICAgIH0KKworICAgIGxldCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQocmVuZGVyaW5nSW50ZW50KTsKKworICAgIGlmICghaW50ZW50U3RhdGUpIHsKKyAgICAgIGludGVudFN0YXRlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChyZW5kZXJpbmdJbnRlbnQsIGludGVudFN0YXRlKTsKKyAgICB9CisKKyAgICBpZiAoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkgeworICAgICAgY2xlYXJUaW1lb3V0KGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpOworICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7CisgICAgfQorCisgICAgY29uc3QgY2FudmFzRmFjdG9yeUluc3RhbmNlID0gY2FudmFzRmFjdG9yeSB8fCBuZXcgRGVmYXVsdENhbnZhc0ZhY3RvcnkoeworICAgICAgb3duZXJEb2N1bWVudDogdGhpcy5fb3duZXJEb2N1bWVudAorICAgIH0pOworICAgIGNvbnN0IHdlYkdMQ29udGV4dCA9IG5ldyBfd2ViZ2wuV2ViR0xDb250ZXh0KHsKKyAgICAgIGVuYWJsZTogZW5hYmxlV2ViR0wKKyAgICB9KTsKKworICAgIGlmICghaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkgeworICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHsKKyAgICAgICAgZm5BcnJheTogW10sCisgICAgICAgIGFyZ3NBcnJheTogW10sCisgICAgICAgIGxhc3RDaHVuazogZmFsc2UKKyAgICAgIH07CisKKyAgICAgIGlmICh0aGlzLl9zdGF0cykgeworICAgICAgICB0aGlzLl9zdGF0cy50aW1lKCJQYWdlIFJlcXVlc3QiKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdCh7CisgICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LAorICAgICAgICBpbnRlbnQ6IHJlbmRlcmluZ0ludGVudCwKKyAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9PT0gdHJ1ZSwKKyAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IGFubm90YXRpb25TdG9yYWdlICYmIGFubm90YXRpb25TdG9yYWdlLmdldEFsbCgpIHx8IG51bGwKKyAgICAgIH0pOworICAgIH0KKworICAgIGNvbnN0IGNvbXBsZXRlID0gZXJyb3IgPT4geworICAgICAgY29uc3QgaSA9IGludGVudFN0YXRlLnJlbmRlclRhc2tzLmluZGV4T2YoaW50ZXJuYWxSZW5kZXJUYXNrKTsKKworICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5zcGxpY2UoaSwgMSk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmNsZWFudXBBZnRlclJlbmRlciB8fCByZW5kZXJpbmdJbnRlbnQgPT09ICJwcmludCIpIHsKKyAgICAgICAgdGhpcy5wZW5kaW5nQ2xlYW51cCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHRoaXMuX3RyeUNsZWFudXAoKTsKKworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnJlamVjdChlcnJvcik7CisKKyAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3QoeworICAgICAgICAgIGludGVudFN0YXRlLAorICAgICAgICAgIHJlYXNvbjogZXJyb3IKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9zdGF0cykgeworICAgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKCJSZW5kZXJpbmciKTsKKworICAgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKCJPdmVyYWxsIik7CisgICAgICB9CisgICAgfTsKKworICAgIGNvbnN0IGludGVybmFsUmVuZGVyVGFzayA9IG5ldyBJbnRlcm5hbFJlbmRlclRhc2soeworICAgICAgY2FsbGJhY2s6IGNvbXBsZXRlLAorICAgICAgcGFyYW1zOiB7CisgICAgICAgIGNhbnZhc0NvbnRleHQsCisgICAgICAgIHZpZXdwb3J0LAorICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgIGltYWdlTGF5ZXIsCisgICAgICAgIGJhY2tncm91bmQKKyAgICAgIH0sCisgICAgICBvYmpzOiB0aGlzLm9ianMsCisgICAgICBjb21tb25PYmpzOiB0aGlzLmNvbW1vbk9ianMsCisgICAgICBvcGVyYXRvckxpc3Q6IGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCwKKyAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LAorICAgICAgY2FudmFzRmFjdG9yeTogY2FudmFzRmFjdG9yeUluc3RhbmNlLAorICAgICAgd2ViR0xDb250ZXh0LAorICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiByZW5kZXJpbmdJbnRlbnQgIT09ICJwcmludCIsCisgICAgICBwZGZCdWc6IHRoaXMuX3BkZkJ1ZworICAgIH0pOworCisgICAgaWYgKCFpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykgeworICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MgPSBbXTsKKyAgICB9CisKKyAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5wdXNoKGludGVybmFsUmVuZGVyVGFzayk7CisgICAgY29uc3QgcmVuZGVyVGFzayA9IGludGVybmFsUmVuZGVyVGFzay50YXNrOworICAgIFByb21pc2UuYWxsKFtpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2UsIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2VdKS50aGVuKChbdHJhbnNwYXJlbmN5LCBvcHRpb25hbENvbnRlbnRDb25maWddKSA9PiB7CisgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xlYW51cCkgeworICAgICAgICBjb21wbGV0ZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9zdGF0cykgeworICAgICAgICB0aGlzLl9zdGF0cy50aW1lKCJSZW5kZXJpbmciKTsKKyAgICAgIH0KKworICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmluaXRpYWxpemVHcmFwaGljcyh7CisgICAgICAgIHRyYW5zcGFyZW5jeSwKKyAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnCisgICAgICB9KTsKKyAgICAgIGludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkKCk7CisgICAgfSkuY2F0Y2goY29tcGxldGUpOworICAgIHJldHVybiByZW5kZXJUYXNrOworICB9CisKKyAgZ2V0T3BlcmF0b3JMaXN0KCkgeworICAgIGZ1bmN0aW9uIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7CisgICAgICBpZiAoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykgeworICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCk7CisgICAgICAgIGNvbnN0IGkgPSBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5pbmRleE9mKG9wTGlzdFRhc2spOworCisgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5zcGxpY2UoaSwgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCByZW5kZXJpbmdJbnRlbnQgPSAib3BsaXN0IjsKKworICAgIGxldCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQocmVuZGVyaW5nSW50ZW50KTsKKworICAgIGlmICghaW50ZW50U3RhdGUpIHsKKyAgICAgIGludGVudFN0YXRlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChyZW5kZXJpbmdJbnRlbnQsIGludGVudFN0YXRlKTsKKyAgICB9CisKKyAgICBsZXQgb3BMaXN0VGFzazsKKworICAgIGlmICghaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHsKKyAgICAgIG9wTGlzdFRhc2sgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICAgICAgb3BMaXN0VGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkID0gb3BlcmF0b3JMaXN0Q2hhbmdlZDsKKyAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MgPSBbXTsKKyAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLnB1c2gob3BMaXN0VGFzayk7CisgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7CisgICAgICAgIGZuQXJyYXk6IFtdLAorICAgICAgICBhcmdzQXJyYXk6IFtdLAorICAgICAgICBsYXN0Q2h1bms6IGZhbHNlCisgICAgICB9OworCisgICAgICBpZiAodGhpcy5fc3RhdHMpIHsKKyAgICAgICAgdGhpcy5fc3RhdHMudGltZSgiUGFnZSBSZXF1ZXN0Iik7CisgICAgICB9CisKKyAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3QoeworICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCwKKyAgICAgICAgaW50ZW50OiByZW5kZXJpbmdJbnRlbnQKKyAgICAgIH0pOworICAgIH0KKworICAgIHJldHVybiBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgc3RyZWFtVGV4dENvbnRlbnQoeworICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UgPSBmYWxzZSwKKyAgICBkaXNhYmxlQ29tYmluZVRleHRJdGVtcyA9IGZhbHNlCisgIH0gPSB7fSkgeworICAgIGNvbnN0IFRFWFRfQ09OVEVOVF9DSFVOS19TSVpFID0gMTAwOworICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFRleHRDb250ZW50IiwgeworICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsCisgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiBub3JtYWxpemVXaGl0ZXNwYWNlID09PSB0cnVlLAorICAgICAgY29tYmluZVRleHRJdGVtczogZGlzYWJsZUNvbWJpbmVUZXh0SXRlbXMgIT09IHRydWUKKyAgICB9LCB7CisgICAgICBoaWdoV2F0ZXJNYXJrOiBURVhUX0NPTlRFTlRfQ0hVTktfU0laRSwKKworICAgICAgc2l6ZSh0ZXh0Q29udGVudCkgeworICAgICAgICByZXR1cm4gdGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoOworICAgICAgfQorCisgICAgfSk7CisgIH0KKworICBnZXRUZXh0Q29udGVudChwYXJhbXMgPSB7fSkgeworICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5zdHJlYW1UZXh0Q29udGVudChwYXJhbXMpOworICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICBmdW5jdGlvbiBwdW1wKCkgeworICAgICAgICByZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHsKKyAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICBkb25lCisgICAgICAgIH0pIHsKKyAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgcmVzb2x2ZSh0ZXh0Q29udGVudCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgT2JqZWN0LmFzc2lnbih0ZXh0Q29udGVudC5zdHlsZXMsIHZhbHVlLnN0eWxlcyk7CisgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCguLi52YWx1ZS5pdGVtcyk7CisgICAgICAgICAgcHVtcCgpOworICAgICAgICB9LCByZWplY3QpOworICAgICAgfQorCisgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTsKKyAgICAgIGNvbnN0IHRleHRDb250ZW50ID0geworICAgICAgICBpdGVtczogW10sCisgICAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKQorICAgICAgfTsKKyAgICAgIHB1bXAoKTsKKyAgICB9KTsKKyAgfQorCisgIF9kZXN0cm95KCkgeworICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKKyAgICB0aGlzLl90cmFuc3BvcnQucGFnZUNhY2hlW3RoaXMuX3BhZ2VJbmRleF0gPSBudWxsOworICAgIGNvbnN0IHdhaXRPbiA9IFtdOworCisgICAgZm9yIChjb25zdCBbaW50ZW50LCBpbnRlbnRTdGF0ZV0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSB7CisgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7CisgICAgICAgIGludGVudFN0YXRlLAorICAgICAgICByZWFzb246IG5ldyBFcnJvcigiUGFnZSB3YXMgZGVzdHJveWVkLiIpLAorICAgICAgICBmb3JjZTogdHJ1ZQorICAgICAgfSk7CisKKyAgICAgIGlmIChpbnRlbnQgPT09ICJvcGxpc3QiKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykgeworICAgICAgICB3YWl0T24ucHVzaChpbnRlcm5hbFJlbmRlclRhc2suY29tcGxldGVkKTsKKyAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbCgpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMub2Jqcy5jbGVhcigpOworICAgIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlID0gbnVsbDsKKyAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gZmFsc2U7CisgICAgcmV0dXJuIFByb21pc2UuYWxsKHdhaXRPbik7CisgIH0KKworICBjbGVhbnVwKHJlc2V0U3RhdHMgPSBmYWxzZSkgeworICAgIHRoaXMucGVuZGluZ0NsZWFudXAgPSB0cnVlOworICAgIHJldHVybiB0aGlzLl90cnlDbGVhbnVwKHJlc2V0U3RhdHMpOworICB9CisKKyAgX3RyeUNsZWFudXAocmVzZXRTdGF0cyA9IGZhbHNlKSB7CisgICAgaWYgKCF0aGlzLnBlbmRpbmdDbGVhbnVwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChjb25zdCB7CisgICAgICByZW5kZXJUYXNrcywKKyAgICAgIG9wZXJhdG9yTGlzdAorICAgIH0gb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKSB7CisgICAgICBpZiAocmVuZGVyVGFza3MubGVuZ3RoICE9PSAwIHx8ICFvcGVyYXRvckxpc3QubGFzdENodW5rKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuY2xlYXIoKTsKKworICAgIHRoaXMub2Jqcy5jbGVhcigpOworICAgIHRoaXMuYW5ub3RhdGlvbnNQcm9taXNlID0gbnVsbDsKKworICAgIGlmIChyZXNldFN0YXRzICYmIHRoaXMuX3N0YXRzKSB7CisgICAgICB0aGlzLl9zdGF0cyA9IG5ldyBfZGlzcGxheV91dGlscy5TdGF0VGltZXIoKTsKKyAgICB9CisKKyAgICB0aGlzLnBlbmRpbmdDbGVhbnVwID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBfc3RhcnRSZW5kZXJQYWdlKHRyYW5zcGFyZW5jeSwgaW50ZW50KSB7CisgICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGludGVudCk7CisKKyAgICBpZiAoIWludGVudFN0YXRlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX3N0YXRzKSB7CisgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKCJQYWdlIFJlcXVlc3QiKTsKKyAgICB9CisKKyAgICBpZiAoaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkgeworICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKHRyYW5zcGFyZW5jeSk7CisgICAgfQorICB9CisKKyAgX3JlbmRlclBhZ2VDaHVuayhvcGVyYXRvckxpc3RDaHVuaywgaW50ZW50U3RhdGUpIHsKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcGVyYXRvckxpc3RDaHVuay5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuZm5BcnJheS5wdXNoKG9wZXJhdG9yTGlzdENodW5rLmZuQXJyYXlbaV0pOworICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5wdXNoKG9wZXJhdG9yTGlzdENodW5rLmFyZ3NBcnJheVtpXSk7CisgICAgfQorCisgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayA9IG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuazsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZW50U3RhdGUucmVuZGVyVGFza3MubGVuZ3RoOyBpKyspIHsKKyAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzW2ldLm9wZXJhdG9yTGlzdENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBpZiAob3BlcmF0b3JMaXN0Q2h1bmsubGFzdENodW5rKSB7CisgICAgICB0aGlzLl90cnlDbGVhbnVwKCk7CisgICAgfQorICB9CisKKyAgX3B1bXBPcGVyYXRvckxpc3QoYXJncykgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKGFyZ3MuaW50ZW50LCAnUERGUGFnZVByb3h5Ll9wdW1wT3BlcmF0b3JMaXN0OiBFeHBlY3RlZCAiaW50ZW50IiBhcmd1bWVudC4nKTsKKworICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRPcGVyYXRvckxpc3QiLCBhcmdzKTsKKworICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOworCisgICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGFyZ3MuaW50ZW50KTsKKworICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IHJlYWRlcjsKKworICAgIGNvbnN0IHB1bXAgPSAoKSA9PiB7CisgICAgICByZWFkZXIucmVhZCgpLnRoZW4oKHsKKyAgICAgICAgdmFsdWUsCisgICAgICAgIGRvbmUKKyAgICAgIH0pID0+IHsKKyAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fcmVuZGVyUGFnZUNodW5rKHZhbHVlLCBpbnRlbnRTdGF0ZSk7CisKKyAgICAgICAgcHVtcCgpOworICAgICAgfSwgcmVhc29uID0+IHsKKyAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDsKKworICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QpIHsKKyAgICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gdHJ1ZTsKKworICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZW50U3RhdGUucmVuZGVyVGFza3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzW2ldLm9wZXJhdG9yTGlzdENoYW5nZWQoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLl90cnlDbGVhbnVwKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkgeworICAgICAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CisgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHsKKyAgICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyByZWFzb247CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH07CisKKyAgICBwdW1wKCk7CisgIH0KKworICBfYWJvcnRPcGVyYXRvckxpc3QoeworICAgIGludGVudFN0YXRlLAorICAgIHJlYXNvbiwKKyAgICBmb3JjZSA9IGZhbHNlCisgIH0pIHsKKyAgICAoMCwgX3V0aWwuYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgcmVhc29uID09PSAib2JqZWN0IiAmJiByZWFzb24gIT09IG51bGwsICdQREZQYWdlUHJveHkuX2Fib3J0T3BlcmF0b3JMaXN0OiBFeHBlY3RlZCAicmVhc29uIiBhcmd1bWVudC4nKTsKKworICAgIGlmICghaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFmb3JjZSkgeworICAgICAgaWYgKGludGVudFN0YXRlLnJlbmRlclRhc2tzLmxlbmd0aCAhPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfZGlzcGxheV91dGlscy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pIHsKKyAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgICAgIGludGVudFN0YXRlLAorICAgICAgICAgICAgcmVhc29uLAorICAgICAgICAgICAgZm9yY2U6IHRydWUKKyAgICAgICAgICB9KTsKKworICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsOworICAgICAgICB9LCBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyLmNhbmNlbChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24ocmVhc29uICYmIHJlYXNvbi5tZXNzYWdlKSk7CisgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDsKKworICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChjb25zdCBbaW50ZW50LCBjdXJJbnRlbnRTdGF0ZV0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSB7CisgICAgICBpZiAoY3VySW50ZW50U3RhdGUgPT09IGludGVudFN0YXRlKSB7CisgICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUoaW50ZW50KTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmNsZWFudXAoKTsKKyAgfQorCisgIGdldCBzdGF0cygpIHsKKyAgICByZXR1cm4gdGhpcy5fc3RhdHM7CisgIH0KKworfQorCitleHBvcnRzLlBERlBhZ2VQcm94eSA9IFBERlBhZ2VQcm94eTsKKworY2xhc3MgTG9vcGJhY2tQb3J0IHsKKyAgY29uc3RydWN0b3IoZGVmZXIgPSB0cnVlKSB7CisgICAgdGhpcy5fbGlzdGVuZXJzID0gW107CisgICAgdGhpcy5fZGVmZXIgPSBkZWZlcjsKKyAgICB0aGlzLl9kZWZlcnJlZCA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOworICB9CisKKyAgcG9zdE1lc3NhZ2Uob2JqLCB0cmFuc2ZlcnMpIHsKKyAgICBmdW5jdGlvbiBjbG9uZVZhbHVlKHZhbHVlKSB7CisgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAib2JqZWN0IiB8fCB2YWx1ZSA9PT0gbnVsbCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlmIChjbG9uZWQuaGFzKHZhbHVlKSkgeworICAgICAgICByZXR1cm4gY2xvbmVkLmdldCh2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIGxldCBidWZmZXIsIHJlc3VsdDsKKworICAgICAgaWYgKChidWZmZXIgPSB2YWx1ZS5idWZmZXIpICYmICgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShidWZmZXIpKSB7CisgICAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZSA9IHRyYW5zZmVycyAmJiB0cmFuc2ZlcnMuaW5jbHVkZXMoYnVmZmVyKTsKKworICAgICAgICBpZiAodHJhbnNmZXJhYmxlKSB7CisgICAgICAgICAgcmVzdWx0ID0gbmV3IHZhbHVlLmNvbnN0cnVjdG9yKGJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0ID0gbmV3IHZhbHVlLmNvbnN0cnVjdG9yKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsb25lZC5zZXQodmFsdWUsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHJlc3VsdCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTsKKyAgICAgIGNsb25lZC5zZXQodmFsdWUsIHJlc3VsdCk7CisKKyAgICAgIGZvciAoY29uc3QgaSBpbiB2YWx1ZSkgeworICAgICAgICBsZXQgZGVzYywKKyAgICAgICAgICAgIHAgPSB2YWx1ZTsKKworICAgICAgICB3aGlsZSAoIShkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwLCBpKSkpIHsKKyAgICAgICAgICBwID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGVvZiBkZXNjLnZhbHVlID09PSAidW5kZWZpbmVkIikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGVvZiBkZXNjLnZhbHVlID09PSAiZnVuY3Rpb24iKSB7CisgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5ICYmIHZhbHVlLmhhc093blByb3BlcnR5KGkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExvb3BiYWNrUG9ydC5wb3N0TWVzc2FnZSAtIGNhbm5vdCBjbG9uZTogJHt2YWx1ZVtpXX1gKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdFtpXSA9IGNsb25lVmFsdWUoZGVzYy52YWx1ZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKCF0aGlzLl9kZWZlcikgeworICAgICAgdGhpcy5fbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4geworICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIHsKKyAgICAgICAgICBkYXRhOiBvYmoKKyAgICAgICAgfSk7CisgICAgICB9KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNsb25lZCA9IG5ldyBXZWFrTWFwKCk7CisgICAgY29uc3QgZSA9IHsKKyAgICAgIGRhdGE6IGNsb25lVmFsdWUob2JqKQorICAgIH07CisKKyAgICB0aGlzLl9kZWZlcnJlZC50aGVuKCgpID0+IHsKKyAgICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHsKKyAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBlKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikgeworICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgfQorCisgIHJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpIHsKKyAgICBjb25zdCBpID0gdGhpcy5fbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpOworCisgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpLCAxKTsKKyAgfQorCisgIHRlcm1pbmF0ZSgpIHsKKyAgICB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID0gMDsKKyAgfQorCit9CisKK2V4cG9ydHMuTG9vcGJhY2tQb3J0ID0gTG9vcGJhY2tQb3J0OworCitjb25zdCBQREZXb3JrZXIgPSBmdW5jdGlvbiBQREZXb3JrZXJDbG9zdXJlKCkgeworICBjb25zdCBwZGZXb3JrZXJQb3J0cyA9IG5ldyBXZWFrTWFwKCk7CisgIGxldCBpc1dvcmtlckRpc2FibGVkID0gZmFsc2U7CisgIGxldCBmYWxsYmFja1dvcmtlclNyYzsKKyAgbGV0IG5leHRGYWtlV29ya2VySWQgPSAwOworICBsZXQgZmFrZVdvcmtlckNhcGFiaWxpdHk7CisKKyAgaWYgKF9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiByZXF1aXJlID09PSAiZnVuY3Rpb24iKSB7CisgICAgaXNXb3JrZXJEaXNhYmxlZCA9IHRydWU7CisgICAgZmFsbGJhY2tXb3JrZXJTcmMgPSAiLi4vcGRmLndvcmtlci5qcyI7CisgIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAib2JqZWN0IiAmJiAiY3VycmVudFNjcmlwdCIgaW4gZG9jdW1lbnQpIHsKKyAgICBjb25zdCBwZGZqc0ZpbGVQYXRoID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzsKKworICAgIGlmIChwZGZqc0ZpbGVQYXRoKSB7CisgICAgICBmYWxsYmFja1dvcmtlclNyYyA9IHBkZmpzRmlsZVBhdGgucmVwbGFjZSgvKFwuKD86bWluXC4pP2pzKShcPy4qKT8kL2ksICIud29ya2VyJDEkMiIpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGdldFdvcmtlclNyYygpIHsKKyAgICBpZiAoX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKSB7CisgICAgICByZXR1cm4gX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjOworICAgIH0KKworICAgIGlmICh0eXBlb2YgZmFsbGJhY2tXb3JrZXJTcmMgIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBpZiAoIV9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgICgwLCBfZGlzcGxheV91dGlscy5kZXByZWNhdGVkKSgnTm8gIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjIiBzcGVjaWZpZWQuJyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxsYmFja1dvcmtlclNyYzsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ05vICJHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyIgc3BlY2lmaWVkLicpOworICB9CisKKyAgZnVuY3Rpb24gZ2V0TWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCkgeworICAgIGxldCBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI7CisKKyAgICB0cnkgeworICAgICAgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyID0gZ2xvYmFsVGhpcy5wZGZqc1dvcmtlciAmJiBnbG9iYWxUaGlzLnBkZmpzV29ya2VyLldvcmtlck1lc3NhZ2VIYW5kbGVyOworICAgIH0gY2F0Y2ggKGV4KSB7fQorCisgICAgcmV0dXJuIG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlciB8fCBudWxsOworICB9CisKKyAgZnVuY3Rpb24gc2V0dXBGYWtlV29ya2VyR2xvYmFsKCkgeworICAgIGlmIChmYWtlV29ya2VyQ2FwYWJpbGl0eSkgeworICAgICAgcmV0dXJuIGZha2VXb3JrZXJDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfQorCisgICAgZmFrZVdvcmtlckNhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICBjb25zdCBsb2FkZXIgPSBhc3luYyBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBnZXRNYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKTsKKworICAgICAgaWYgKG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcikgeworICAgICAgICByZXR1cm4gbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyOworICAgICAgfQorCisgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgY29uc3Qgd29ya2VyID0gZXZhbCgicmVxdWlyZSIpKGdldFdvcmtlclNyYygpKTsKKyAgICAgICAgcmV0dXJuIHdvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjsKKyAgICAgIH0KKworICAgICAgYXdhaXQgKDAsIF9kaXNwbGF5X3V0aWxzLmxvYWRTY3JpcHQpKGdldFdvcmtlclNyYygpKTsKKyAgICAgIHJldHVybiB3aW5kb3cucGRmanNXb3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7CisgICAgfTsKKworICAgIGxvYWRlcigpLnRoZW4oZmFrZVdvcmtlckNhcGFiaWxpdHkucmVzb2x2ZSwgZmFrZVdvcmtlckNhcGFiaWxpdHkucmVqZWN0KTsKKyAgICByZXR1cm4gZmFrZVdvcmtlckNhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUNETldyYXBwZXIodXJsKSB7CisgICAgY29uc3Qgd3JhcHBlciA9ICJpbXBvcnRTY3JpcHRzKCciICsgdXJsICsgIicpOyI7CisgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3dyYXBwZXJdKSk7CisgIH0KKworICBjbGFzcyBQREZXb3JrZXIgeworICAgIGNvbnN0cnVjdG9yKHsKKyAgICAgIG5hbWUgPSBudWxsLAorICAgICAgcG9ydCA9IG51bGwsCisgICAgICB2ZXJib3NpdHkgPSAoMCwgX3V0aWwuZ2V0VmVyYm9zaXR5TGV2ZWwpKCkKKyAgICB9ID0ge30pIHsKKyAgICAgIGlmIChwb3J0ICYmIHBkZldvcmtlclBvcnRzLmhhcyhwb3J0KSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBQREZXb3JrZXIgcGVyIHBvcnQiKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7CisgICAgICB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gdHJ1ZTsKKyAgICAgIHRoaXMudmVyYm9zaXR5ID0gdmVyYm9zaXR5OworICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgdGhpcy5fcG9ydCA9IG51bGw7CisgICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsOworICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsOworCisgICAgICBpZiAocG9ydCkgeworICAgICAgICBwZGZXb3JrZXJQb3J0cy5zZXQocG9ydCwgdGhpcyk7CisKKyAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIGdldCBwcm9taXNlKCkgeworICAgICAgcmV0dXJuIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0KKworICAgIGdldCBwb3J0KCkgeworICAgICAgcmV0dXJuIHRoaXMuX3BvcnQ7CisgICAgfQorCisgICAgZ2V0IG1lc3NhZ2VIYW5kbGVyKCkgeworICAgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VIYW5kbGVyOworICAgIH0KKworICAgIF9pbml0aWFsaXplRnJvbVBvcnQocG9ydCkgeworICAgICAgdGhpcy5fcG9ydCA9IHBvcnQ7CisgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJtYWluIiwgIndvcmtlciIsIHBvcnQpOworCisgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5vbigicmVhZHkiLCBmdW5jdGlvbiAoKSB7fSk7CisKKyAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgfQorCisgICAgX2luaXRpYWxpemUoKSB7CisgICAgICBpZiAodHlwZW9mIFdvcmtlciAhPT0gInVuZGVmaW5lZCIgJiYgIWlzV29ya2VyRGlzYWJsZWQgJiYgIWdldE1haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpKSB7CisgICAgICAgIGxldCB3b3JrZXJTcmMgPSBnZXRXb3JrZXJTcmMoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGlmICghKDAsIF91dGlsLmlzU2FtZU9yaWdpbikod2luZG93LmxvY2F0aW9uLmhyZWYsIHdvcmtlclNyYykpIHsKKyAgICAgICAgICAgIHdvcmtlclNyYyA9IGNyZWF0ZUNETldyYXBwZXIobmV3IFVSTCh3b3JrZXJTcmMsIHdpbmRvdy5sb2NhdGlvbikuaHJlZik7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJTcmMpOworICAgICAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIm1haW4iLCAid29ya2VyIiwgd29ya2VyKTsKKworICAgICAgICAgIGNvbnN0IHRlcm1pbmF0ZUVhcmx5ID0gKCkgPT4geworICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIiwgb25Xb3JrZXJFcnJvcik7CisgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7CisgICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7CisKKyAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworCisgICAgICAgICAgY29uc3Qgb25Xb3JrZXJFcnJvciA9ICgpID0+IHsKKyAgICAgICAgICAgIGlmICghdGhpcy5fd2ViV29ya2VyKSB7CisgICAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKworICAgICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIG9uV29ya2VyRXJyb3IpOworICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJ0ZXN0IiwgZGF0YSA9PiB7CisgICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBvbldvcmtlckVycm9yKTsKKworICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7CisgICAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjsKKyAgICAgICAgICAgICAgdGhpcy5fcG9ydCA9IHdvcmtlcjsKKyAgICAgICAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gd29ya2VyOworCisgICAgICAgICAgICAgIGlmICghZGF0YS5zdXBwb3J0VHJhbnNmZXJzKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZVRyYW5zZmVycyA9IGZhbHNlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTsKKworICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKCJjb25maWd1cmUiLCB7CisgICAgICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpOworCisgICAgICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJyZWFkeSIsIGRhdGEgPT4geworICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIiwgb25Xb3JrZXJFcnJvcik7CisKKyAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHNlbmRUZXN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworCisgICAgICAgICAgY29uc3Qgc2VuZFRlc3QgPSAoKSA9PiB7CisgICAgICAgICAgICBjb25zdCB0ZXN0T2JqID0gbmV3IFVpbnQ4QXJyYXkoW3RoaXMucG9zdE1lc3NhZ2VUcmFuc2ZlcnMgPyAyNTUgOiAwXSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoInRlc3QiLCB0ZXN0T2JqLCBbdGVzdE9iai5idWZmZXJdKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQ2Fubm90IHVzZSBwb3N0TWVzc2FnZSB0cmFuc2ZlcnMuIik7CisgICAgICAgICAgICAgIHRlc3RPYmpbMF0gPSAwOworICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKCJ0ZXN0IiwgdGVzdE9iaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKworICAgICAgICAgIHNlbmRUZXN0KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpOworICAgIH0KKworICAgIF9zZXR1cEZha2VXb3JrZXIoKSB7CisgICAgICBpZiAoIWlzV29ya2VyRGlzYWJsZWQpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJTZXR0aW5nIHVwIGZha2Ugd29ya2VyLiIpOworICAgICAgICBpc1dvcmtlckRpc2FibGVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgc2V0dXBGYWtlV29ya2VyR2xvYmFsKCkudGhlbihXb3JrZXJNZXNzYWdlSGFuZGxlciA9PiB7CisgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpKTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHBvcnQgPSBuZXcgTG9vcGJhY2tQb3J0KCk7CisgICAgICAgIHRoaXMuX3BvcnQgPSBwb3J0OworICAgICAgICBjb25zdCBpZCA9ICJmYWtlIiArIG5leHRGYWtlV29ya2VySWQrKzsKKyAgICAgICAgY29uc3Qgd29ya2VySGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKGlkICsgIl93b3JrZXIiLCBpZCwgcG9ydCk7CisgICAgICAgIFdvcmtlck1lc3NhZ2VIYW5kbGVyLnNldHVwKHdvcmtlckhhbmRsZXIsIHBvcnQpOworICAgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKGlkLCBpZCArICJfd29ya2VyIiwgcG9ydCk7CisgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7CisKKyAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTsKKworICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKCJjb25maWd1cmUiLCB7CisgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eQorICAgICAgICB9KTsKKyAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKGBTZXR0aW5nIHVwIGZha2Ugd29ya2VyIGZhaWxlZDogIiR7cmVhc29uLm1lc3NhZ2V9Ii5gKSk7CisgICAgICB9KTsKKyAgICB9CisKKyAgICBkZXN0cm95KCkgeworICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlOworCisgICAgICBpZiAodGhpcy5fd2ViV29ya2VyKSB7CisgICAgICAgIHRoaXMuX3dlYldvcmtlci50ZXJtaW5hdGUoKTsKKworICAgICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsOworICAgICAgfQorCisgICAgICBwZGZXb3JrZXJQb3J0cy5kZWxldGUodGhpcy5fcG9ydCk7CisgICAgICB0aGlzLl9wb3J0ID0gbnVsbDsKKworICAgICAgaWYgKHRoaXMuX21lc3NhZ2VIYW5kbGVyKSB7CisgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTsKKworICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZyb21Qb3J0KHBhcmFtcykgeworICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy5wb3J0KSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiUERGV29ya2VyLmZyb21Qb3J0IC0gaW52YWxpZCBtZXRob2Qgc2lnbmF0dXJlLiIpOworICAgICAgfQorCisgICAgICBpZiAocGRmV29ya2VyUG9ydHMuaGFzKHBhcmFtcy5wb3J0KSkgeworICAgICAgICByZXR1cm4gcGRmV29ya2VyUG9ydHMuZ2V0KHBhcmFtcy5wb3J0KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBQREZXb3JrZXIocGFyYW1zKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZ2V0V29ya2VyU3JjKCkgeworICAgICAgcmV0dXJuIGdldFdvcmtlclNyYygpOworICAgIH0KKworICB9CisKKyAgcmV0dXJuIFBERldvcmtlcjsKK30oKTsKKworZXhwb3J0cy5QREZXb3JrZXIgPSBQREZXb3JrZXI7CisKK2NsYXNzIFdvcmtlclRyYW5zcG9ydCB7CisgIGNvbnN0cnVjdG9yKG1lc3NhZ2VIYW5kbGVyLCBsb2FkaW5nVGFzaywgbmV0d29ya1N0cmVhbSwgcGFyYW1zKSB7CisgICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyOworICAgIHRoaXMubG9hZGluZ1Rhc2sgPSBsb2FkaW5nVGFzazsKKyAgICB0aGlzLmNvbW1vbk9ianMgPSBuZXcgUERGT2JqZWN0cygpOworICAgIHRoaXMuZm9udExvYWRlciA9IG5ldyBfZm9udF9sb2FkZXIuRm9udExvYWRlcih7CisgICAgICBkb2NJZDogbG9hZGluZ1Rhc2suZG9jSWQsCisgICAgICBvblVuc3VwcG9ydGVkRmVhdHVyZTogdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUuYmluZCh0aGlzKSwKKyAgICAgIG93bmVyRG9jdW1lbnQ6IHBhcmFtcy5vd25lckRvY3VtZW50CisgICAgfSk7CisgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zOworICAgIHRoaXMuQ01hcFJlYWRlckZhY3RvcnkgPSBuZXcgcGFyYW1zLkNNYXBSZWFkZXJGYWN0b3J5KHsKKyAgICAgIGJhc2VVcmw6IHBhcmFtcy5jTWFwVXJsLAorICAgICAgaXNDb21wcmVzc2VkOiBwYXJhbXMuY01hcFBhY2tlZAorICAgIH0pOworICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7CisgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG51bGw7CisgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5ID0gbnVsbDsKKyAgICB0aGlzLl9uZXR3b3JrU3RyZWFtID0gbmV0d29ya1N0cmVhbTsKKyAgICB0aGlzLl9mdWxsUmVhZGVyID0gbnVsbDsKKyAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBudWxsOworICAgIHRoaXMucGFnZUNhY2hlID0gW107CisgICAgdGhpcy5wYWdlUHJvbWlzZXMgPSBbXTsKKyAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVyKCk7CisgIH0KKworICBkZXN0cm95KCkgeworICAgIGlmICh0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5KSB7CisgICAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0KKworICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKKyAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgaWYgKHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSkgeworICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoIldvcmtlciB3YXMgZGVzdHJveWVkIGR1cmluZyBvblBhc3N3b3JkIGNhbGxiYWNrIikpOworICAgIH0KKworICAgIGNvbnN0IHdhaXRPbiA9IFtdOworICAgIHRoaXMucGFnZUNhY2hlLmZvckVhY2goZnVuY3Rpb24gKHBhZ2UpIHsKKyAgICAgIGlmIChwYWdlKSB7CisgICAgICAgIHdhaXRPbi5wdXNoKHBhZ2UuX2Rlc3Ryb3koKSk7CisgICAgICB9CisgICAgfSk7CisgICAgdGhpcy5wYWdlQ2FjaGUubGVuZ3RoID0gMDsKKyAgICB0aGlzLnBhZ2VQcm9taXNlcy5sZW5ndGggPSAwOworICAgIGNvbnN0IHRlcm1pbmF0ZWQgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiVGVybWluYXRlIiwgbnVsbCk7CisgICAgd2FpdE9uLnB1c2godGVybWluYXRlZCk7CisgICAgUHJvbWlzZS5hbGwod2FpdE9uKS50aGVuKCgpID0+IHsKKyAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpOworCisgICAgICBpZiAodGhpcy5fbmV0d29ya1N0cmVhbSkgeworICAgICAgICB0aGlzLl9uZXR3b3JrU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7CisgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBudWxsOworICAgICAgfQorCisgICAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICB9LCB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlamVjdCk7CisgICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIHNldHVwTWVzc2FnZUhhbmRsZXIoKSB7CisgICAgY29uc3QgeworICAgICAgbWVzc2FnZUhhbmRsZXIsCisgICAgICBsb2FkaW5nVGFzaworICAgIH0gPSB0aGlzOworICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJHZXRSZWFkZXIiLCAoZGF0YSwgc2luaykgPT4geworICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5fbmV0d29ya1N0cmVhbSwgIkdldFJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuIik7CisgICAgICB0aGlzLl9mdWxsUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyKCk7CisKKyAgICAgIHRoaXMuX2Z1bGxSZWFkZXIub25Qcm9ncmVzcyA9IGV2dCA9PiB7CisgICAgICAgIHRoaXMuX2xhc3RQcm9ncmVzcyA9IHsKKyAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsCisgICAgICAgICAgdG90YWw6IGV2dC50b3RhbAorICAgICAgICB9OworICAgICAgfTsKKworICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7CisgICAgICAgIHRoaXMuX2Z1bGxSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHsKKyAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICBkb25lCisgICAgICAgIH0pIHsKKyAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh2YWx1ZSksICJHZXRSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci4iKTsKKyAgICAgICAgICBzaW5rLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpLCAxLCBbdmFsdWVdKTsKKyAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CisgICAgICAgIH0pOworICAgICAgfTsKKworICAgICAgc2luay5vbkNhbmNlbCA9IHJlYXNvbiA9PiB7CisgICAgICAgIHRoaXMuX2Z1bGxSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisKKyAgICAgICAgc2luay5yZWFkeS5jYXRjaChyZWFkeVJlYXNvbiA9PiB7CisgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247CisgICAgICAgIH0pOworICAgICAgfTsKKyAgICB9KTsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigiUmVhZGVySGVhZGVyc1JlYWR5IiwgZGF0YSA9PiB7CisgICAgICBjb25zdCBoZWFkZXJzQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIGNvbnN0IGZ1bGxSZWFkZXIgPSB0aGlzLl9mdWxsUmVhZGVyOworICAgICAgZnVsbFJlYWRlci5oZWFkZXJzUmVhZHkudGhlbigoKSA9PiB7CisgICAgICAgIGlmICghZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCB8fCAhZnVsbFJlYWRlci5pc1JhbmdlU3VwcG9ydGVkKSB7CisgICAgICAgICAgaWYgKHRoaXMuX2xhc3RQcm9ncmVzcyAmJiBsb2FkaW5nVGFzay5vblByb2dyZXNzKSB7CisgICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzKHRoaXMuX2xhc3RQcm9ncmVzcyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZnVsbFJlYWRlci5vblByb2dyZXNzID0gZXZ0ID0+IHsKKyAgICAgICAgICAgIGlmIChsb2FkaW5nVGFzay5vblByb2dyZXNzKSB7CisgICAgICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3MoeworICAgICAgICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCwKKyAgICAgICAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBoZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICBpc1N0cmVhbWluZ1N1cHBvcnRlZDogZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCwKKyAgICAgICAgICBpc1JhbmdlU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQsCisgICAgICAgICAgY29udGVudExlbmd0aDogZnVsbFJlYWRlci5jb250ZW50TGVuZ3RoCisgICAgICAgIH0pOworICAgICAgfSwgaGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTsKKyAgICAgIHJldHVybiBoZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0pOworICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJHZXRSYW5nZVJlYWRlciIsIChkYXRhLCBzaW5rKSA9PiB7CisgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCAiR2V0UmFuZ2VSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLiIpOworCisgICAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMuX25ldHdvcmtTdHJlYW0uZ2V0UmFuZ2VSZWFkZXIoZGF0YS5iZWdpbiwgZGF0YS5lbmQpOworCisgICAgICBpZiAoIXJhbmdlUmVhZGVyKSB7CisgICAgICAgIHNpbmsuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBzaW5rLm9uUHVsbCA9ICgpID0+IHsKKyAgICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHsKKyAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICBkb25lCisgICAgICAgIH0pIHsKKyAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh2YWx1ZSksICJHZXRSYW5nZVJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLiIpOworICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pOworICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4geworICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKKyAgICAgICAgfSk7CisgICAgICB9OworCisgICAgICBzaW5rLm9uQ2FuY2VsID0gcmVhc29uID0+IHsKKyAgICAgICAgcmFuZ2VSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgICAgIHNpbmsucmVhZHkuY2F0Y2gocmVhZHlSZWFzb24gPT4geworICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uOworICAgICAgICB9KTsKKyAgICAgIH07CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIkdldERvYyIsICh7CisgICAgICBwZGZJbmZvCisgICAgfSkgPT4geworICAgICAgdGhpcy5fbnVtUGFnZXMgPSBwZGZJbmZvLm51bVBhZ2VzOworCisgICAgICBsb2FkaW5nVGFzay5fY2FwYWJpbGl0eS5yZXNvbHZlKG5ldyBQREZEb2N1bWVudFByb3h5KHBkZkluZm8sIHRoaXMpKTsKKyAgICB9KTsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigiRG9jRXhjZXB0aW9uIiwgZnVuY3Rpb24gKGV4KSB7CisgICAgICBsZXQgcmVhc29uOworCisgICAgICBzd2l0Y2ggKGV4Lm5hbWUpIHsKKyAgICAgICAgY2FzZSAiUGFzc3dvcmRFeGNlcHRpb24iOgorICAgICAgICAgIHJlYXNvbiA9IG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5jb2RlKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJJbnZhbGlkUERGRXhjZXB0aW9uIjoKKyAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuSW52YWxpZFBERkV4Y2VwdGlvbihleC5tZXNzYWdlKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJNaXNzaW5nUERGRXhjZXB0aW9uIjoKKyAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihleC5tZXNzYWdlKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iOgorICAgICAgICAgIHJlYXNvbiA9IG5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguc3RhdHVzKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJVbmtub3duRXJyb3JFeGNlcHRpb24iOgorICAgICAgICAgIHJlYXNvbiA9IG5ldyBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguZGV0YWlscyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICghKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSkgeworICAgICAgICBjb25zdCBtc2cgPSAiRG9jRXhjZXB0aW9uIC0gZXhwZWN0ZWQgYSB2YWxpZCBFcnJvci4iOworICAgICAgICAoMCwgX3V0aWwud2FybikobXNnKTsKKyAgICAgIH0KKworICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIlBhc3N3b3JkUmVxdWVzdCIsIGV4Y2VwdGlvbiA9PiB7CisgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICAgIGlmIChsb2FkaW5nVGFzay5vblBhc3N3b3JkKSB7CisgICAgICAgIGNvbnN0IHVwZGF0ZVBhc3N3b3JkID0gcGFzc3dvcmQgPT4geworICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICAgIHBhc3N3b3JkCisgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBsb2FkaW5nVGFzay5vblBhc3N3b3JkKHVwZGF0ZVBhc3N3b3JkLCBleGNlcHRpb24uY29kZSk7CisgICAgICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChleCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QobmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlLCBleGNlcHRpb24uY29kZSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIkRhdGFMb2FkZWQiLCBkYXRhID0+IHsKKyAgICAgIGlmIChsb2FkaW5nVGFzay5vblByb2dyZXNzKSB7CisgICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3MoeworICAgICAgICAgIGxvYWRlZDogZGF0YS5sZW5ndGgsCisgICAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucmVzb2x2ZShkYXRhKTsKKyAgICB9KTsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigiU3RhcnRSZW5kZXJQYWdlIiwgZGF0YSA9PiB7CisgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBwYWdlID0gdGhpcy5wYWdlQ2FjaGVbZGF0YS5wYWdlSW5kZXhdOworCisgICAgICBwYWdlLl9zdGFydFJlbmRlclBhZ2UoZGF0YS50cmFuc3BhcmVuY3ksIGRhdGEuaW50ZW50KTsKKyAgICB9KTsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigiY29tbW9ub2JqIiwgZGF0YSA9PiB7CisgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBbaWQsIHR5cGUsIGV4cG9ydGVkRGF0YV0gPSBkYXRhOworCisgICAgICBpZiAodGhpcy5jb21tb25PYmpzLmhhcyhpZCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSAiRm9udCI6CisgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5fcGFyYW1zOworCisgICAgICAgICAgaWYgKCJlcnJvciIgaW4gZXhwb3J0ZWREYXRhKSB7CisgICAgICAgICAgICBjb25zdCBleHBvcnRlZEVycm9yID0gZXhwb3J0ZWREYXRhLmVycm9yOworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiAke2V4cG9ydGVkRXJyb3J9YCk7CisgICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWRFcnJvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsZXQgZm9udFJlZ2lzdHJ5ID0gbnVsbDsKKworICAgICAgICAgIGlmIChwYXJhbXMucGRmQnVnICYmIGdsb2JhbFRoaXMuRm9udEluc3BlY3RvciAmJiBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IuZW5hYmxlZCkgeworICAgICAgICAgICAgZm9udFJlZ2lzdHJ5ID0geworICAgICAgICAgICAgICByZWdpc3RlckZvbnQoZm9udCwgdXJsKSB7CisgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmZvbnRBZGRlZChmb250LCB1cmwpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgZm9udCA9IG5ldyBfZm9udF9sb2FkZXIuRm9udEZhY2VPYmplY3QoZXhwb3J0ZWREYXRhLCB7CisgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHBhcmFtcy5pc0V2YWxTdXBwb3J0ZWQsCisgICAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IHBhcmFtcy5kaXNhYmxlRm9udEZhY2UsCisgICAgICAgICAgICBpZ25vcmVFcnJvcnM6IHBhcmFtcy5pZ25vcmVFcnJvcnMsCisgICAgICAgICAgICBvblVuc3VwcG9ydGVkRmVhdHVyZTogdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUuYmluZCh0aGlzKSwKKyAgICAgICAgICAgIGZvbnRSZWdpc3RyeQorICAgICAgICAgIH0pOworICAgICAgICAgIHRoaXMuZm9udExvYWRlci5iaW5kKGZvbnQpLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJGb250RmFsbGJhY2siLCB7CisgICAgICAgICAgICAgIGlkCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KS5maW5hbGx5KCgpID0+IHsKKyAgICAgICAgICAgIGlmICghcGFyYW1zLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5kYXRhKSB7CisgICAgICAgICAgICAgIGZvbnQuZGF0YSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBmb250KTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJGb250UGF0aCI6CisgICAgICAgIGNhc2UgIkltYWdlIjoKKyAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWREYXRhKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR290IHVua25vd24gY29tbW9uIG9iamVjdCB0eXBlICR7dHlwZX1gKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigib2JqIiwgZGF0YSA9PiB7CisgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgY29uc3QgW2lkLCBwYWdlSW5kZXgsIHR5cGUsIGltYWdlRGF0YV0gPSBkYXRhOworICAgICAgY29uc3QgcGFnZVByb3h5ID0gdGhpcy5wYWdlQ2FjaGVbcGFnZUluZGV4XTsKKworICAgICAgaWYgKHBhZ2VQcm94eS5vYmpzLmhhcyhpZCkpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgIkltYWdlIjoKKyAgICAgICAgICBwYWdlUHJveHkub2Jqcy5yZXNvbHZlKGlkLCBpbWFnZURhdGEpOworICAgICAgICAgIGNvbnN0IE1BWF9JTUFHRV9TSVpFX1RPX1NUT1JFID0gODAwMDAwMDsKKworICAgICAgICAgIGlmIChpbWFnZURhdGEgJiYgImRhdGEiIGluIGltYWdlRGF0YSAmJiBpbWFnZURhdGEuZGF0YS5sZW5ndGggPiBNQVhfSU1BR0VfU0laRV9UT19TVE9SRSkgeworICAgICAgICAgICAgcGFnZVByb3h5LmNsZWFudXBBZnRlclJlbmRlciA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIG9iamVjdCB0eXBlICR7dHlwZX1gKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9KTsKKyAgICBtZXNzYWdlSGFuZGxlci5vbigiRG9jUHJvZ3Jlc3MiLCBkYXRhID0+IHsKKyAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChsb2FkaW5nVGFzay5vblByb2dyZXNzKSB7CisgICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3MoeworICAgICAgICAgIGxvYWRlZDogZGF0YS5sb2FkZWQsCisgICAgICAgICAgdG90YWw6IGRhdGEudG90YWwKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSk7CisgICAgbWVzc2FnZUhhbmRsZXIub24oIlVuc3VwcG9ydGVkRmVhdHVyZSIsIHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlLmJpbmQodGhpcykpOworICAgIG1lc3NhZ2VIYW5kbGVyLm9uKCJGZXRjaEJ1aWx0SW5DTWFwIiwgKGRhdGEsIHNpbmspID0+IHsKKyAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICBzaW5rLmVycm9yKG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgbGV0IGZldGNoZWQgPSBmYWxzZTsKKworICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7CisgICAgICAgIGlmIChmZXRjaGVkKSB7CisgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZldGNoZWQgPSB0cnVlOworICAgICAgICB0aGlzLkNNYXBSZWFkZXJGYWN0b3J5LmZldGNoKGRhdGEpLnRoZW4oZnVuY3Rpb24gKGJ1aWx0SW5DTWFwKSB7CisgICAgICAgICAgc2luay5lbnF1ZXVlKGJ1aWx0SW5DTWFwLCAxLCBbYnVpbHRJbkNNYXAuY01hcERhdGEuYnVmZmVyXSk7CisgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CisgICAgICAgIH0pOworICAgICAgfTsKKyAgICB9KTsKKyAgfQorCisgIF9vblVuc3VwcG9ydGVkRmVhdHVyZSh7CisgICAgZmVhdHVyZUlkCisgIH0pIHsKKyAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5sb2FkaW5nVGFzay5vblVuc3VwcG9ydGVkRmVhdHVyZSkgeworICAgICAgdGhpcy5sb2FkaW5nVGFzay5vblVuc3VwcG9ydGVkRmVhdHVyZShmZWF0dXJlSWQpOworICAgIH0KKyAgfQorCisgIGdldERhdGEoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREYXRhIiwgbnVsbCk7CisgIH0KKworICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHsKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikgfHwgcGFnZU51bWJlciA8PSAwIHx8IHBhZ2VOdW1iZXIgPiB0aGlzLl9udW1QYWdlcykgeworICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiSW52YWxpZCBwYWdlIHJlcXVlc3QiKSk7CisgICAgfQorCisgICAgY29uc3QgcGFnZUluZGV4ID0gcGFnZU51bWJlciAtIDE7CisKKyAgICBpZiAocGFnZUluZGV4IGluIHRoaXMucGFnZVByb21pc2VzKSB7CisgICAgICByZXR1cm4gdGhpcy5wYWdlUHJvbWlzZXNbcGFnZUluZGV4XTsKKyAgICB9CisKKyAgICBjb25zdCBwcm9taXNlID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2UiLCB7CisgICAgICBwYWdlSW5kZXgKKyAgICB9KS50aGVuKHBhZ2VJbmZvID0+IHsKKyAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRyYW5zcG9ydCBkZXN0cm95ZWQiKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgcGFnZSA9IG5ldyBQREZQYWdlUHJveHkocGFnZUluZGV4LCBwYWdlSW5mbywgdGhpcywgdGhpcy5fcGFyYW1zLm93bmVyRG9jdW1lbnQsIHRoaXMuX3BhcmFtcy5wZGZCdWcpOworICAgICAgdGhpcy5wYWdlQ2FjaGVbcGFnZUluZGV4XSA9IHBhZ2U7CisgICAgICByZXR1cm4gcGFnZTsKKyAgICB9KTsKKyAgICB0aGlzLnBhZ2VQcm9taXNlc1twYWdlSW5kZXhdID0gcHJvbWlzZTsKKyAgICByZXR1cm4gcHJvbWlzZTsKKyAgfQorCisgIGdldFBhZ2VJbmRleChyZWYpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2VJbmRleCIsIHsKKyAgICAgIHJlZgorICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IocmVhc29uKSk7CisgICAgfSk7CisgIH0KKworICBnZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgsIGludGVudCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0QW5ub3RhdGlvbnMiLCB7CisgICAgICBwYWdlSW5kZXgsCisgICAgICBpbnRlbnQKKyAgICB9KTsKKyAgfQorCisgIHNhdmVEb2N1bWVudChhbm5vdGF0aW9uU3RvcmFnZSkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiU2F2ZURvY3VtZW50IiwgeworICAgICAgbnVtUGFnZXM6IHRoaXMuX251bVBhZ2VzLAorICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IGFubm90YXRpb25TdG9yYWdlICYmIGFubm90YXRpb25TdG9yYWdlLmdldEFsbCgpIHx8IG51bGwsCisgICAgICBmaWxlbmFtZTogdGhpcy5fZnVsbFJlYWRlciA/IHRoaXMuX2Z1bGxSZWFkZXIuZmlsZW5hbWUgOiBudWxsCisgICAgfSkuZmluYWxseSgoKSA9PiB7CisgICAgICBpZiAoYW5ub3RhdGlvblN0b3JhZ2UpIHsKKyAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgZ2V0RGVzdGluYXRpb25zKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0RGVzdGluYXRpb25zIiwgbnVsbCk7CisgIH0KKworICBnZXREZXN0aW5hdGlvbihpZCkgeworICAgIGlmICh0eXBlb2YgaWQgIT09ICJzdHJpbmciKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJJbnZhbGlkIGRlc3RpbmF0aW9uIHJlcXVlc3QuIikpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0RGVzdGluYXRpb24iLCB7CisgICAgICBpZAorICAgIH0pOworICB9CisKKyAgZ2V0UGFnZUxhYmVscygpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2VMYWJlbHMiLCBudWxsKTsKKyAgfQorCisgIGdldFBhZ2VMYXlvdXQoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlTGF5b3V0IiwgbnVsbCk7CisgIH0KKworICBnZXRQYWdlTW9kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2VNb2RlIiwgbnVsbCk7CisgIH0KKworICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFZpZXdlclByZWZlcmVuY2VzIiwgbnVsbCk7CisgIH0KKworICBnZXRPcGVuQWN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0T3BlbkFjdGlvbiIsIG51bGwpOworICB9CisKKyAgZ2V0QXR0YWNobWVudHMoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRBdHRhY2htZW50cyIsIG51bGwpOworICB9CisKKyAgZ2V0SmF2YVNjcmlwdCgpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldEphdmFTY3JpcHQiLCBudWxsKTsKKyAgfQorCisgIGdldE91dGxpbmUoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRPdXRsaW5lIiwgbnVsbCk7CisgIH0KKworICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRPcHRpb25hbENvbnRlbnRDb25maWciLCBudWxsKS50aGVuKHJlc3VsdHMgPT4geworICAgICAgcmV0dXJuIG5ldyBfb3B0aW9uYWxfY29udGVudF9jb25maWcuT3B0aW9uYWxDb250ZW50Q29uZmlnKHJlc3VsdHMpOworICAgIH0pOworICB9CisKKyAgZ2V0UGVybWlzc2lvbnMoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQZXJtaXNzaW9ucyIsIG51bGwpOworICB9CisKKyAgZ2V0TWV0YWRhdGEoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRNZXRhZGF0YSIsIG51bGwpLnRoZW4ocmVzdWx0cyA9PiB7CisgICAgICByZXR1cm4geworICAgICAgICBpbmZvOiByZXN1bHRzWzBdLAorICAgICAgICBtZXRhZGF0YTogcmVzdWx0c1sxXSA/IG5ldyBfbWV0YWRhdGEuTWV0YWRhdGEocmVzdWx0c1sxXSkgOiBudWxsLAorICAgICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogdGhpcy5fZnVsbFJlYWRlciA/IHRoaXMuX2Z1bGxSZWFkZXIuZmlsZW5hbWUgOiBudWxsCisgICAgICB9OworICAgIH0pOworICB9CisKKyAgZ2V0U3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRTdGF0cyIsIG51bGwpOworICB9CisKKyAgc3RhcnRDbGVhbnVwKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiQ2xlYW51cCIsIG51bGwpLnRoZW4oKCkgPT4geworICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5wYWdlQ2FjaGUubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5wYWdlQ2FjaGVbaV07CisKKyAgICAgICAgaWYgKHBhZ2UpIHsKKyAgICAgICAgICBjb25zdCBjbGVhbnVwU3VjY2Vzc2Z1bCA9IHBhZ2UuY2xlYW51cCgpOworCisgICAgICAgICAgaWYgKCFjbGVhbnVwU3VjY2Vzc2Z1bCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdGFydENsZWFudXA6IFBhZ2UgJHtpICsgMX0gaXMgY3VycmVudGx5IHJlbmRlcmluZy5gKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7CisgICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTsKKyAgICB9KTsKKyAgfQorCisgIGdldCBsb2FkaW5nUGFyYW1zKCkgeworICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcmFtczsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImxvYWRpbmdQYXJhbXMiLCB7CisgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBwYXJhbXMuZGlzYWJsZUF1dG9GZXRjaCwKKyAgICAgIGRpc2FibGVGb250RmFjZTogcGFyYW1zLmRpc2FibGVGb250RmFjZQorICAgIH0pOworICB9CisKK30KKworY2xhc3MgUERGT2JqZWN0cyB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuX29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9CisKKyAgX2Vuc3VyZU9iaihvYmpJZCkgeworICAgIGlmICh0aGlzLl9vYmpzW29iaklkXSkgeworICAgICAgcmV0dXJuIHRoaXMuX29ianNbb2JqSWRdOworICAgIH0KKworICAgIHJldHVybiB0aGlzLl9vYmpzW29iaklkXSA9IHsKKyAgICAgIGNhcGFiaWxpdHk6ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSwKKyAgICAgIGRhdGE6IG51bGwsCisgICAgICByZXNvbHZlZDogZmFsc2UKKyAgICB9OworICB9CisKKyAgZ2V0KG9iaklkLCBjYWxsYmFjayA9IG51bGwpIHsKKyAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgIHRoaXMuX2Vuc3VyZU9iaihvYmpJZCkuY2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oY2FsbGJhY2spOworCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCBvYmogPSB0aGlzLl9vYmpzW29iaklkXTsKKworICAgIGlmICghb2JqIHx8ICFvYmoucmVzb2x2ZWQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdGluZyBvYmplY3QgdGhhdCBpc24ndCByZXNvbHZlZCB5ZXQgJHtvYmpJZH0uYCk7CisgICAgfQorCisgICAgcmV0dXJuIG9iai5kYXRhOworICB9CisKKyAgaGFzKG9iaklkKSB7CisgICAgY29uc3Qgb2JqID0gdGhpcy5fb2Jqc1tvYmpJZF07CisgICAgcmV0dXJuIG9iaiA/IG9iai5yZXNvbHZlZCA6IGZhbHNlOworICB9CisKKyAgcmVzb2x2ZShvYmpJZCwgZGF0YSkgeworICAgIGNvbnN0IG9iaiA9IHRoaXMuX2Vuc3VyZU9iaihvYmpJZCk7CisKKyAgICBvYmoucmVzb2x2ZWQgPSB0cnVlOworICAgIG9iai5kYXRhID0gZGF0YTsKKyAgICBvYmouY2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEpOworICB9CisKKyAgY2xlYXIoKSB7CisgICAgdGhpcy5fb2JqcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworfQorCitjbGFzcyBSZW5kZXJUYXNrIHsKKyAgY29uc3RydWN0b3IoaW50ZXJuYWxSZW5kZXJUYXNrKSB7CisgICAgdGhpcy5faW50ZXJuYWxSZW5kZXJUYXNrID0gaW50ZXJuYWxSZW5kZXJUYXNrOworICAgIHRoaXMub25Db250aW51ZSA9IG51bGw7CisgIH0KKworICBnZXQgcHJvbWlzZSgpIHsKKyAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIGNhbmNlbCgpIHsKKyAgICB0aGlzLl9pbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKCk7CisgIH0KKworfQorCitjb25zdCBJbnRlcm5hbFJlbmRlclRhc2sgPSBmdW5jdGlvbiBJbnRlcm5hbFJlbmRlclRhc2tDbG9zdXJlKCkgeworICBjb25zdCBjYW52YXNJblJlbmRlcmluZyA9IG5ldyBXZWFrU2V0KCk7CisKKyAgY2xhc3MgSW50ZXJuYWxSZW5kZXJUYXNrIHsKKyAgICBjb25zdHJ1Y3Rvcih7CisgICAgICBjYWxsYmFjaywKKyAgICAgIHBhcmFtcywKKyAgICAgIG9ianMsCisgICAgICBjb21tb25PYmpzLAorICAgICAgb3BlcmF0b3JMaXN0LAorICAgICAgcGFnZUluZGV4LAorICAgICAgY2FudmFzRmFjdG9yeSwKKyAgICAgIHdlYkdMQ29udGV4dCwKKyAgICAgIHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZhbHNlLAorICAgICAgcGRmQnVnID0gZmFsc2UKKyAgICB9KSB7CisgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgIHRoaXMub2JqcyA9IG9ianM7CisgICAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzOworICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSBudWxsOworICAgICAgdGhpcy5vcGVyYXRvckxpc3QgPSBvcGVyYXRvckxpc3Q7CisgICAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7CisgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5OworICAgICAgdGhpcy53ZWJHTENvbnRleHQgPSB3ZWJHTENvbnRleHQ7CisgICAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7CisgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gbnVsbDsKKyAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9IGZhbHNlOworICAgICAgdGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSB0cnVlICYmIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiOworICAgICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMuY2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHRoaXMudGFzayA9IG5ldyBSZW5kZXJUYXNrKHRoaXMpOworICAgICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7CisgICAgICB0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCA9IHRoaXMuX3NjaGVkdWxlTmV4dC5iaW5kKHRoaXMpOworICAgICAgdGhpcy5fbmV4dEJvdW5kID0gdGhpcy5fbmV4dC5iaW5kKHRoaXMpOworICAgICAgdGhpcy5fY2FudmFzID0gcGFyYW1zLmNhbnZhc0NvbnRleHQuY2FudmFzOworICAgIH0KKworICAgIGdldCBjb21wbGV0ZWQoKSB7CisgICAgICByZXR1cm4gdGhpcy5jYXBhYmlsaXR5LnByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge30pOworICAgIH0KKworICAgIGluaXRpYWxpemVHcmFwaGljcyh7CisgICAgICB0cmFuc3BhcmVuY3kgPSBmYWxzZSwKKyAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZworICAgIH0pIHsKKyAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9jYW52YXMpIHsKKyAgICAgICAgaWYgKGNhbnZhc0luUmVuZGVyaW5nLmhhcyh0aGlzLl9jYW52YXMpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXNlIHRoZSBzYW1lIGNhbnZhcyBkdXJpbmcgbXVsdGlwbGUgcmVuZGVyKCkgb3BlcmF0aW9ucy4gIiArICJVc2UgZGlmZmVyZW50IGNhbnZhcyBvciBlbnN1cmUgcHJldmlvdXMgb3BlcmF0aW9ucyB3ZXJlICIgKyAiY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhbnZhc0luUmVuZGVyaW5nLmFkZCh0aGlzLl9jYW52YXMpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fcGRmQnVnICYmIGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIgJiYgZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5lbmFibGVkKSB7CisgICAgICAgIHRoaXMuc3RlcHBlciA9IGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIuY3JlYXRlKHRoaXMuX3BhZ2VJbmRleCk7CisgICAgICAgIHRoaXMuc3RlcHBlci5pbml0KHRoaXMub3BlcmF0b3JMaXN0KTsKKyAgICAgICAgdGhpcy5zdGVwcGVyLm5leHRCcmVha1BvaW50ID0gdGhpcy5zdGVwcGVyLmdldE5leHRCcmVha1BvaW50KCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgY2FudmFzQ29udGV4dCwKKyAgICAgICAgdmlld3BvcnQsCisgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgaW1hZ2VMYXllciwKKyAgICAgICAgYmFja2dyb3VuZAorICAgICAgfSA9IHRoaXMucGFyYW1zOworICAgICAgdGhpcy5nZnggPSBuZXcgX2NhbnZhcy5DYW52YXNHcmFwaGljcyhjYW52YXNDb250ZXh0LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLndlYkdMQ29udGV4dCwgaW1hZ2VMYXllciwgb3B0aW9uYWxDb250ZW50Q29uZmlnKTsKKyAgICAgIHRoaXMuZ2Z4LmJlZ2luRHJhd2luZyh7CisgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgdmlld3BvcnQsCisgICAgICAgIHRyYW5zcGFyZW5jeSwKKyAgICAgICAgYmFja2dyb3VuZAorICAgICAgfSk7CisgICAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IDA7CisgICAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSB0cnVlOworCisgICAgICBpZiAodGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2spIHsKKyAgICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2soKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjYW5jZWwoZXJyb3IgPSBudWxsKSB7CisgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTsKKworICAgICAgaWYgKHRoaXMuZ2Z4KSB7CisgICAgICAgIHRoaXMuZ2Z4LmVuZERyYXdpbmcoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2NhbnZhcykgeworICAgICAgICBjYW52YXNJblJlbmRlcmluZy5kZWxldGUodGhpcy5fY2FudmFzKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jYWxsYmFjayhlcnJvciB8fCBuZXcgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKGBSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICR7dGhpcy5fcGFnZUluZGV4ICsgMX1gLCAiY2FudmFzIikpOworICAgIH0KKworICAgIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7CisgICAgICBpZiAoIXRoaXMuZ3JhcGhpY3NSZWFkeSkgeworICAgICAgICBpZiAoIXRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrKSB7CisgICAgICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSB0aGlzLl9jb250aW51ZUJvdW5kOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5zdGVwcGVyKSB7CisgICAgICAgIHRoaXMuc3RlcHBlci51cGRhdGVPcGVyYXRvckxpc3QodGhpcy5vcGVyYXRvckxpc3QpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5ydW5uaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fY29udGludWUoKTsKKyAgICB9CisKKyAgICBfY29udGludWUoKSB7CisgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlOworCisgICAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodGhpcy50YXNrLm9uQ29udGludWUpIHsKKyAgICAgICAgdGhpcy50YXNrLm9uQ29udGludWUodGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fc2NoZWR1bGVOZXh0KCk7CisgICAgICB9CisgICAgfQorCisgICAgX3NjaGVkdWxlTmV4dCgpIHsKKyAgICAgIGlmICh0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHsKKyAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CisgICAgICAgICAgdGhpcy5fbmV4dEJvdW5kKCkuY2F0Y2godGhpcy5jYW5jZWwuYmluZCh0aGlzKSk7CisgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbih0aGlzLl9uZXh0Qm91bmQpLmNhdGNoKHRoaXMuY2FuY2VsLmJpbmQodGhpcykpOworICAgICAgfQorICAgIH0KKworICAgIGFzeW5jIF9uZXh0KCkgeworICAgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSB0aGlzLmdmeC5leGVjdXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0LCB0aGlzLm9wZXJhdG9yTGlzdElkeCwgdGhpcy5fY29udGludWVCb3VuZCwgdGhpcy5zdGVwcGVyKTsKKworICAgICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0SWR4ID09PSB0aGlzLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkubGVuZ3RoKSB7CisgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOworCisgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHsKKyAgICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKCk7CisKKyAgICAgICAgICBpZiAodGhpcy5fY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXNJblJlbmRlcmluZy5kZWxldGUodGhpcy5fY2FudmFzKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIHJldHVybiBJbnRlcm5hbFJlbmRlclRhc2s7Cit9KCk7CisKK2NvbnN0IHZlcnNpb24gPSAnMi42LjM0Nyc7CitleHBvcnRzLnZlcnNpb24gPSB2ZXJzaW9uOworY29uc3QgYnVpbGQgPSAnM2JlOWM2NWYnOworZXhwb3J0cy5idWlsZCA9IGJ1aWxkOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kaXNwbGF5L2FwaV9jb21wYXRpYmlsaXR5LmpzIGIvbGliL2Rpc3BsYXkvYXBpX2NvbXBhdGliaWxpdHkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1YjgwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kaXNwbGF5L2FwaV9jb21wYXRpYmlsaXR5LmpzCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmFwaUNvbXBhdGliaWxpdHlQYXJhbXMgPSB2b2lkIDA7CisKK3ZhciBfaXNfbm9kZSA9IHJlcXVpcmUoIi4uL3NoYXJlZC9pc19ub2RlLmpzIik7CisKK2NvbnN0IGNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworeworICAoZnVuY3Rpb24gY2hlY2tGb250RmFjZSgpIHsKKyAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTsKKyAgICB9CisgIH0pKCk7Cit9Citjb25zdCBhcGlDb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmZyZWV6ZShjb21wYXRpYmlsaXR5UGFyYW1zKTsKK2V4cG9ydHMuYXBpQ29tcGF0aWJpbGl0eVBhcmFtcyA9IGFwaUNvbXBhdGliaWxpdHlQYXJhbXM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2Rpc3BsYXkvY2FudmFzLmpzIGIvbGliL2Rpc3BsYXkvY2FudmFzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNThkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGlzcGxheS9jYW52YXMuanMKQEAgLTAsMCArMSwyMjMwIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5DYW52YXNHcmFwaGljcyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9wYXR0ZXJuX2hlbHBlciA9IHJlcXVpcmUoIi4vcGF0dGVybl9oZWxwZXIuanMiKTsKKwordmFyIE1JTl9GT05UX1NJWkUgPSAxNjsKK3ZhciBNQVhfRk9OVF9TSVpFID0gMTAwOwordmFyIE1BWF9HUk9VUF9TSVpFID0gNDA5NjsKK3ZhciBNSU5fV0lEVEhfRkFDVE9SID0gMC42NTsKK3ZhciBDT01QSUxFX1RZUEUzX0dMWVBIUyA9IHRydWU7Cit2YXIgTUFYX1NJWkVfVE9fQ09NUElMRSA9IDEwMDA7Cit2YXIgRlVMTF9DSFVOS19IRUlHSFQgPSAxNjsKKworZnVuY3Rpb24gYWRkQ29udGV4dEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSB7CisgIGlmICghY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0pIHsKKyAgICBjdHguX29yaWdpbmFsU2F2ZSA9IGN0eC5zYXZlOworICAgIGN0eC5fb3JpZ2luYWxSZXN0b3JlID0gY3R4LnJlc3RvcmU7CisgICAgY3R4Ll9vcmlnaW5hbFJvdGF0ZSA9IGN0eC5yb3RhdGU7CisgICAgY3R4Ll9vcmlnaW5hbFNjYWxlID0gY3R4LnNjYWxlOworICAgIGN0eC5fb3JpZ2luYWxUcmFuc2xhdGUgPSBjdHgudHJhbnNsYXRlOworICAgIGN0eC5fb3JpZ2luYWxUcmFuc2Zvcm0gPSBjdHgudHJhbnNmb3JtOworICAgIGN0eC5fb3JpZ2luYWxTZXRUcmFuc2Zvcm0gPSBjdHguc2V0VHJhbnNmb3JtOworICAgIGN0eC5fdHJhbnNmb3JtTWF0cml4ID0gY3R4Ll90cmFuc2Zvcm1NYXRyaXggfHwgWzEsIDAsIDAsIDEsIDAsIDBdOworICAgIGN0eC5fdHJhbnNmb3JtU3RhY2sgPSBbXTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCAibW96Q3VycmVudFRyYW5zZm9ybSIsIHsKKyAgICAgIGdldDogZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCAibW96Q3VycmVudFRyYW5zZm9ybUludmVyc2UiLCB7CisgICAgICBnZXQ6IGZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKCkgeworICAgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgICAgdmFyIGEgPSBtWzBdLAorICAgICAgICAgICAgYiA9IG1bMV0sCisgICAgICAgICAgICBjID0gbVsyXSwKKyAgICAgICAgICAgIGQgPSBtWzNdLAorICAgICAgICAgICAgZSA9IG1bNF0sCisgICAgICAgICAgICBmID0gbVs1XTsKKyAgICAgICAgdmFyIGFkX2JjID0gYSAqIGQgLSBiICogYzsKKyAgICAgICAgdmFyIGJjX2FkID0gYiAqIGMgLSBhICogZDsKKyAgICAgICAgcmV0dXJuIFtkIC8gYWRfYmMsIGIgLyBiY19hZCwgYyAvIGJjX2FkLCBhIC8gYWRfYmMsIChkICogZSAtIGMgKiBmKSAvIGJjX2FkLCAoYiAqIGUgLSBhICogZikgLyBhZF9iY107CisgICAgICB9CisgICAgfSk7CisKKyAgICBjdHguc2F2ZSA9IGZ1bmN0aW9uIGN0eFNhdmUoKSB7CisgICAgICB2YXIgb2xkID0gdGhpcy5fdHJhbnNmb3JtTWF0cml4OworCisgICAgICB0aGlzLl90cmFuc2Zvcm1TdGFjay5wdXNoKG9sZCk7CisKKyAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IG9sZC5zbGljZSgwLCA2KTsKKworICAgICAgdGhpcy5fb3JpZ2luYWxTYXZlKCk7CisgICAgfTsKKworICAgIGN0eC5yZXN0b3JlID0gZnVuY3Rpb24gY3R4UmVzdG9yZSgpIHsKKyAgICAgIHZhciBwcmV2ID0gdGhpcy5fdHJhbnNmb3JtU3RhY2sucG9wKCk7CisKKyAgICAgIGlmIChwcmV2KSB7CisgICAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IHByZXY7CisKKyAgICAgICAgdGhpcy5fb3JpZ2luYWxSZXN0b3JlKCk7CisgICAgICB9CisgICAgfTsKKworICAgIGN0eC50cmFuc2xhdGUgPSBmdW5jdGlvbiBjdHhUcmFuc2xhdGUoeCwgeSkgeworICAgICAgdmFyIG0gPSB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7CisgICAgICBtWzRdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07CisgICAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07CisKKyAgICAgIHRoaXMuX29yaWdpbmFsVHJhbnNsYXRlKHgsIHkpOworICAgIH07CisKKyAgICBjdHguc2NhbGUgPSBmdW5jdGlvbiBjdHhTY2FsZSh4LCB5KSB7CisgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgIG1bMF0gPSBtWzBdICogeDsKKyAgICAgIG1bMV0gPSBtWzFdICogeDsKKyAgICAgIG1bMl0gPSBtWzJdICogeTsKKyAgICAgIG1bM10gPSBtWzNdICogeTsKKworICAgICAgdGhpcy5fb3JpZ2luYWxTY2FsZSh4LCB5KTsKKyAgICB9OworCisgICAgY3R4LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7CisgICAgICB2YXIgbSA9IHRoaXMuX3RyYW5zZm9ybU1hdHJpeDsKKyAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IFttWzBdICogYSArIG1bMl0gKiBiLCBtWzFdICogYSArIG1bM10gKiBiLCBtWzBdICogYyArIG1bMl0gKiBkLCBtWzFdICogYyArIG1bM10gKiBkLCBtWzBdICogZSArIG1bMl0gKiBmICsgbVs0XSwgbVsxXSAqIGUgKyBtWzNdICogZiArIG1bNV1dOworCisgICAgICBjdHguX29yaWdpbmFsVHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpOworICAgIH07CisKKyAgICBjdHguc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4U2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHsKKyAgICAgIHRoaXMuX3RyYW5zZm9ybU1hdHJpeCA9IFthLCBiLCBjLCBkLCBlLCBmXTsKKworICAgICAgY3R4Ll9vcmlnaW5hbFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTsKKyAgICB9OworCisgICAgY3R4LnJvdGF0ZSA9IGZ1bmN0aW9uIGN0eFJvdGF0ZShhbmdsZSkgeworICAgICAgdmFyIGNvc1ZhbHVlID0gTWF0aC5jb3MoYW5nbGUpOworICAgICAgdmFyIHNpblZhbHVlID0gTWF0aC5zaW4oYW5nbGUpOworICAgICAgdmFyIG0gPSB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7CisgICAgICB0aGlzLl90cmFuc2Zvcm1NYXRyaXggPSBbbVswXSAqIGNvc1ZhbHVlICsgbVsyXSAqIHNpblZhbHVlLCBtWzFdICogY29zVmFsdWUgKyBtWzNdICogc2luVmFsdWUsIG1bMF0gKiAtc2luVmFsdWUgKyBtWzJdICogY29zVmFsdWUsIG1bMV0gKiAtc2luVmFsdWUgKyBtWzNdICogY29zVmFsdWUsIG1bNF0sIG1bNV1dOworCisgICAgICB0aGlzLl9vcmlnaW5hbFJvdGF0ZShhbmdsZSk7CisgICAgfTsKKyAgfQorfQorCit2YXIgQ2FjaGVkQ2FudmFzZXMgPSBmdW5jdGlvbiBDYWNoZWRDYW52YXNlc0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIENhY2hlZENhbnZhc2VzKGNhbnZhc0ZhY3RvcnkpIHsKKyAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5OworICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9CisKKyAgQ2FjaGVkQ2FudmFzZXMucHJvdG90eXBlID0geworICAgIGdldENhbnZhczogZnVuY3Rpb24gQ2FjaGVkQ2FudmFzZXNfZ2V0Q2FudmFzKGlkLCB3aWR0aCwgaGVpZ2h0LCB0cmFja1RyYW5zZm9ybSkgeworICAgICAgdmFyIGNhbnZhc0VudHJ5OworCisgICAgICBpZiAodGhpcy5jYWNoZVtpZF0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdOworICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkucmVzZXQoY2FudmFzRW50cnksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjYW52YXNFbnRyeS5jb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbnZhc0VudHJ5ID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgdGhpcy5jYWNoZVtpZF0gPSBjYW52YXNFbnRyeTsKKyAgICAgIH0KKworICAgICAgaWYgKHRyYWNrVHJhbnNmb3JtKSB7CisgICAgICAgIGFkZENvbnRleHRDdXJyZW50VHJhbnNmb3JtKGNhbnZhc0VudHJ5LmNvbnRleHQpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2FudmFzRW50cnk7CisgICAgfSwKKworICAgIGNsZWFyKCkgeworICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5jYWNoZSkgeworICAgICAgICB2YXIgY2FudmFzRW50cnkgPSB0aGlzLmNhY2hlW2lkXTsKKyAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5LmRlc3Ryb3koY2FudmFzRW50cnkpOworICAgICAgICBkZWxldGUgdGhpcy5jYWNoZVtpZF07CisgICAgICB9CisgICAgfQorCisgIH07CisgIHJldHVybiBDYWNoZWRDYW52YXNlczsKK30oKTsKKworZnVuY3Rpb24gY29tcGlsZVR5cGUzR2x5cGgoaW1nRGF0YSkgeworICB2YXIgUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCA9IDEwMDA7CisgIHZhciB3aWR0aCA9IGltZ0RhdGEud2lkdGgsCisgICAgICBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgdmFyIGksCisgICAgICBqLAorICAgICAgajAsCisgICAgICB3aWR0aDEgPSB3aWR0aCArIDE7CisgIHZhciBwb2ludHMgPSBuZXcgVWludDhBcnJheSh3aWR0aDEgKiAoaGVpZ2h0ICsgMSkpOworICB2YXIgUE9JTlRfVFlQRVMgPSBuZXcgVWludDhBcnJheShbMCwgMiwgNCwgMCwgMSwgMCwgNSwgNCwgOCwgMTAsIDAsIDgsIDAsIDIsIDEsIDBdKTsKKyAgdmFyIGxpbmVTaXplID0gd2lkdGggKyA3ICYgfjcsCisgICAgICBkYXRhMCA9IGltZ0RhdGEuZGF0YTsKKyAgdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShsaW5lU2l6ZSAqIGhlaWdodCksCisgICAgICBwb3MgPSAwLAorICAgICAgaWk7CisKKyAgZm9yIChpID0gMCwgaWkgPSBkYXRhMC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgdmFyIG1hc2sgPSAxMjgsCisgICAgICAgIGVsZW0gPSBkYXRhMFtpXTsKKworICAgIHdoaWxlIChtYXNrID4gMCkgeworICAgICAgZGF0YVtwb3MrK10gPSBlbGVtICYgbWFzayA/IDAgOiAyNTU7CisgICAgICBtYXNrID4+PSAxOworICAgIH0KKyAgfQorCisgIHZhciBjb3VudCA9IDA7CisgIHBvcyA9IDA7CisKKyAgaWYgKGRhdGFbcG9zXSAhPT0gMCkgeworICAgIHBvaW50c1swXSA9IDE7CisgICAgKytjb3VudDsKKyAgfQorCisgIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7CisgICAgaWYgKGRhdGFbcG9zXSAhPT0gZGF0YVtwb3MgKyAxXSkgeworICAgICAgcG9pbnRzW2pdID0gZGF0YVtwb3NdID8gMiA6IDE7CisgICAgICArK2NvdW50OworICAgIH0KKworICAgIHBvcysrOworICB9CisKKyAgaWYgKGRhdGFbcG9zXSAhPT0gMCkgeworICAgIHBvaW50c1tqXSA9IDI7CisgICAgKytjb3VudDsKKyAgfQorCisgIGZvciAoaSA9IDE7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIHBvcyA9IGkgKiBsaW5lU2l6ZTsKKyAgICBqMCA9IGkgKiB3aWR0aDE7CisKKyAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkgeworICAgICAgcG9pbnRzW2owXSA9IGRhdGFbcG9zXSA/IDEgOiA4OworICAgICAgKytjb3VudDsKKyAgICB9CisKKyAgICB2YXIgc3VtID0gKGRhdGFbcG9zXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplXSA/IDggOiAwKTsKKworICAgIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBzdW0gPSAoc3VtID4+IDIpICsgKGRhdGFbcG9zICsgMV0gPyA0IDogMCkgKyAoZGF0YVtwb3MgLSBsaW5lU2l6ZSArIDFdID8gOCA6IDApOworCisgICAgICBpZiAoUE9JTlRfVFlQRVNbc3VtXSkgeworICAgICAgICBwb2ludHNbajAgKyBqXSA9IFBPSU5UX1RZUEVTW3N1bV07CisgICAgICAgICsrY291bnQ7CisgICAgICB9CisKKyAgICAgIHBvcysrOworICAgIH0KKworICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7CisgICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDIgOiA0OworICAgICAgKytjb3VudDsKKyAgICB9CisKKyAgICBpZiAoY291bnQgPiBQT0lOVF9UT19QUk9DRVNTX0xJTUlUKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwb3MgPSBsaW5lU2l6ZSAqIChoZWlnaHQgLSAxKTsKKyAgajAgPSBpICogd2lkdGgxOworCisgIGlmIChkYXRhW3Bvc10gIT09IDApIHsKKyAgICBwb2ludHNbajBdID0gODsKKyAgICArK2NvdW50OworICB9CisKKyAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICBpZiAoZGF0YVtwb3NdICE9PSBkYXRhW3BvcyArIDFdKSB7CisgICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDQgOiA4OworICAgICAgKytjb3VudDsKKyAgICB9CisKKyAgICBwb3MrKzsKKyAgfQorCisgIGlmIChkYXRhW3Bvc10gIT09IDApIHsKKyAgICBwb2ludHNbajAgKyBqXSA9IDQ7CisgICAgKytjb3VudDsKKyAgfQorCisgIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHZhciBzdGVwcyA9IG5ldyBJbnQzMkFycmF5KFswLCB3aWR0aDEsIC0xLCAwLCAtd2lkdGgxLCAwLCAwLCAwLCAxXSk7CisgIHZhciBvdXRsaW5lcyA9IFtdOworCisgIGZvciAoaSA9IDA7IGNvdW50ICYmIGkgPD0gaGVpZ2h0OyBpKyspIHsKKyAgICB2YXIgcCA9IGkgKiB3aWR0aDE7CisgICAgdmFyIGVuZCA9IHAgKyB3aWR0aDsKKworICAgIHdoaWxlIChwIDwgZW5kICYmICFwb2ludHNbcF0pIHsKKyAgICAgIHArKzsKKyAgICB9CisKKyAgICBpZiAocCA9PT0gZW5kKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB2YXIgY29vcmRzID0gW3AgJSB3aWR0aDEsIGldOworICAgIHZhciB0eXBlID0gcG9pbnRzW3BdLAorICAgICAgICBwMCA9IHAsCisgICAgICAgIHBwOworCisgICAgZG8geworICAgICAgdmFyIHN0ZXAgPSBzdGVwc1t0eXBlXTsKKworICAgICAgZG8geworICAgICAgICBwICs9IHN0ZXA7CisgICAgICB9IHdoaWxlICghcG9pbnRzW3BdKTsKKworICAgICAgcHAgPSBwb2ludHNbcF07CisKKyAgICAgIGlmIChwcCAhPT0gNSAmJiBwcCAhPT0gMTApIHsKKyAgICAgICAgdHlwZSA9IHBwOworICAgICAgICBwb2ludHNbcF0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9IHBwICYgMHgzMyAqIHR5cGUgPj4gNDsKKyAgICAgICAgcG9pbnRzW3BdICY9IHR5cGUgPj4gMiB8IHR5cGUgPDwgMjsKKyAgICAgIH0KKworICAgICAgY29vcmRzLnB1c2gocCAlIHdpZHRoMSk7CisgICAgICBjb29yZHMucHVzaChwIC8gd2lkdGgxIHwgMCk7CisKKyAgICAgIGlmICghcG9pbnRzW3BdKSB7CisgICAgICAgIC0tY291bnQ7CisgICAgICB9CisgICAgfSB3aGlsZSAocDAgIT09IHApOworCisgICAgb3V0bGluZXMucHVzaChjb29yZHMpOworICAgIC0taTsKKyAgfQorCisgIHZhciBkcmF3T3V0bGluZSA9IGZ1bmN0aW9uIChjKSB7CisgICAgYy5zYXZlKCk7CisgICAgYy5zY2FsZSgxIC8gd2lkdGgsIC0xIC8gaGVpZ2h0KTsKKyAgICBjLnRyYW5zbGF0ZSgwLCAtaGVpZ2h0KTsKKyAgICBjLmJlZ2luUGF0aCgpOworCisgICAgZm9yIChsZXQgayA9IDAsIGtrID0gb3V0bGluZXMubGVuZ3RoOyBrIDwga2s7IGsrKykgeworICAgICAgdmFyIG8gPSBvdXRsaW5lc1trXTsKKyAgICAgIGMubW92ZVRvKG9bMF0sIG9bMV0pOworCisgICAgICBmb3IgKGxldCBsID0gMiwgbGwgPSBvLmxlbmd0aDsgbCA8IGxsOyBsICs9IDIpIHsKKyAgICAgICAgYy5saW5lVG8ob1tsXSwgb1tsICsgMV0pOworICAgICAgfQorICAgIH0KKworICAgIGMuZmlsbCgpOworICAgIGMuYmVnaW5QYXRoKCk7CisgICAgYy5yZXN0b3JlKCk7CisgIH07CisKKyAgcmV0dXJuIGRyYXdPdXRsaW5lOworfQorCit2YXIgQ2FudmFzRXh0cmFTdGF0ZSA9IGZ1bmN0aW9uIENhbnZhc0V4dHJhU3RhdGVDbG9zdXJlKCkgeworICBmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlKCkgeworICAgIHRoaXMuYWxwaGFJc1NoYXBlID0gZmFsc2U7CisgICAgdGhpcy5mb250U2l6ZSA9IDA7CisgICAgdGhpcy5mb250U2l6ZVNjYWxlID0gMTsKKyAgICB0aGlzLnRleHRNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7CisgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxOworICAgIHRoaXMuZm9udE1hdHJpeCA9IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgIHRoaXMubGVhZGluZyA9IDA7CisgICAgdGhpcy54ID0gMDsKKyAgICB0aGlzLnkgPSAwOworICAgIHRoaXMubGluZVggPSAwOworICAgIHRoaXMubGluZVkgPSAwOworICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwOworICAgIHRoaXMud29yZFNwYWNpbmcgPSAwOworICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7CisgICAgdGhpcy50ZXh0UmVuZGVyaW5nTW9kZSA9IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7CisgICAgdGhpcy50ZXh0UmlzZSA9IDA7CisgICAgdGhpcy5maWxsQ29sb3IgPSAiIzAwMDAwMCI7CisgICAgdGhpcy5zdHJva2VDb2xvciA9ICIjMDAwMDAwIjsKKyAgICB0aGlzLnBhdHRlcm5GaWxsID0gZmFsc2U7CisgICAgdGhpcy5maWxsQWxwaGEgPSAxOworICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxOworICAgIHRoaXMubGluZVdpZHRoID0gMTsKKyAgICB0aGlzLmFjdGl2ZVNNYXNrID0gbnVsbDsKKyAgICB0aGlzLnJlc3VtZVNNYXNrQ3R4ID0gbnVsbDsKKyAgICB0aGlzLnRyYW5zZmVyTWFwcyA9IG51bGw7CisgIH0KKworICBDYW52YXNFeHRyYVN0YXRlLnByb3RvdHlwZSA9IHsKKyAgICBjbG9uZTogZnVuY3Rpb24gQ2FudmFzRXh0cmFTdGF0ZV9jbG9uZSgpIHsKKyAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpOworICAgIH0sCisgICAgc2V0Q3VycmVudFBvaW50OiBmdW5jdGlvbiBDYW52YXNFeHRyYVN0YXRlX3NldEN1cnJlbnRQb2ludCh4LCB5KSB7CisgICAgICB0aGlzLnggPSB4OworICAgICAgdGhpcy55ID0geTsKKyAgICB9CisgIH07CisgIHJldHVybiBDYW52YXNFeHRyYVN0YXRlOworfSgpOworCit2YXIgQ2FudmFzR3JhcGhpY3MgPSBmdW5jdGlvbiBDYW52YXNHcmFwaGljc0Nsb3N1cmUoKSB7CisgIHZhciBFWEVDVVRJT05fVElNRSA9IDE1OworICB2YXIgRVhFQ1VUSU9OX1NURVBTID0gMTA7CisKKyAgZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3MoY2FudmFzQ3R4LCBjb21tb25PYmpzLCBvYmpzLCBjYW52YXNGYWN0b3J5LCB3ZWJHTENvbnRleHQsIGltYWdlTGF5ZXIsIG9wdGlvbmFsQ29udGVudENvbmZpZykgeworICAgIHRoaXMuY3R4ID0gY2FudmFzQ3R4OworICAgIHRoaXMuY3VycmVudCA9IG5ldyBDYW52YXNFeHRyYVN0YXRlKCk7CisgICAgdGhpcy5zdGF0ZVN0YWNrID0gW107CisgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7CisgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7CisgICAgdGhpcy5yZXMgPSBudWxsOworICAgIHRoaXMueG9ianMgPSBudWxsOworICAgIHRoaXMuY29tbW9uT2JqcyA9IGNvbW1vbk9ianM7CisgICAgdGhpcy5vYmpzID0gb2JqczsKKyAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5OworICAgIHRoaXMud2ViR0xDb250ZXh0ID0gd2ViR0xDb250ZXh0OworICAgIHRoaXMuaW1hZ2VMYXllciA9IGltYWdlTGF5ZXI7CisgICAgdGhpcy5ncm91cFN0YWNrID0gW107CisgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBudWxsOworICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IG51bGw7CisgICAgdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sgPSBbXTsKKyAgICB0aGlzLmdyb3VwTGV2ZWwgPSAwOworICAgIHRoaXMuc21hc2tTdGFjayA9IFtdOworICAgIHRoaXMuc21hc2tDb3VudGVyID0gMDsKKyAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7CisgICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRydWU7CisgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sgPSBbXTsKKyAgICB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZyA9IG9wdGlvbmFsQ29udGVudENvbmZpZzsKKyAgICB0aGlzLmNhY2hlZENhbnZhc2VzID0gbmV3IENhY2hlZENhbnZhc2VzKHRoaXMuY2FudmFzRmFjdG9yeSk7CisKKyAgICBpZiAoY2FudmFzQ3R4KSB7CisgICAgICBhZGRDb250ZXh0Q3VycmVudFRyYW5zZm9ybShjYW52YXNDdHgpOworICAgIH0KKworICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsOworICB9CisKKyAgZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VEYXRhKGN0eCwgaW1nRGF0YSwgdHJhbnNmZXJNYXBzID0gbnVsbCkgeworICAgIGlmICh0eXBlb2YgSW1hZ2VEYXRhICE9PSAidW5kZWZpbmVkIiAmJiBpbWdEYXRhIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7CisgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltZ0RhdGEsIDAsIDApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCwKKyAgICAgICAgd2lkdGggPSBpbWdEYXRhLndpZHRoOworICAgIHZhciBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICB2YXIgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7CisgICAgdmFyIHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxOworICAgIHZhciBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7CisgICAgdmFyIHNyY1BvcyA9IDAsCisgICAgICAgIGRlc3RQb3M7CisgICAgdmFyIHNyYyA9IGltZ0RhdGEuZGF0YTsKKyAgICB2YXIgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhOworICAgIHZhciBpLCBqLCB0aGlzQ2h1bmtIZWlnaHQsIGVsZW1zSW5UaGlzQ2h1bms7CisgICAgbGV0IHRyYW5zZmVyTWFwUmVkLCB0cmFuc2Zlck1hcEdyZWVuLCB0cmFuc2Zlck1hcEJsdWUsIHRyYW5zZmVyTWFwR3JheTsKKworICAgIGlmICh0cmFuc2Zlck1hcHMpIHsKKyAgICAgIHN3aXRjaCAodHJhbnNmZXJNYXBzLmxlbmd0aCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgdHJhbnNmZXJNYXBSZWQgPSB0cmFuc2Zlck1hcHNbMF07CisgICAgICAgICAgdHJhbnNmZXJNYXBHcmVlbiA9IHRyYW5zZmVyTWFwc1swXTsKKyAgICAgICAgICB0cmFuc2Zlck1hcEJsdWUgPSB0cmFuc2Zlck1hcHNbMF07CisgICAgICAgICAgdHJhbnNmZXJNYXBHcmF5ID0gdHJhbnNmZXJNYXBzWzBdOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICB0cmFuc2Zlck1hcFJlZCA9IHRyYW5zZmVyTWFwc1swXTsKKyAgICAgICAgICB0cmFuc2Zlck1hcEdyZWVuID0gdHJhbnNmZXJNYXBzWzFdOworICAgICAgICAgIHRyYW5zZmVyTWFwQmx1ZSA9IHRyYW5zZmVyTWFwc1syXTsKKyAgICAgICAgICB0cmFuc2Zlck1hcEdyYXkgPSB0cmFuc2Zlck1hcHNbM107CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGltZ0RhdGEua2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7CisgICAgICB2YXIgc3JjTGVuZ3RoID0gc3JjLmJ5dGVMZW5ndGg7CisgICAgICB2YXIgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyLCAwLCBkZXN0LmJ5dGVMZW5ndGggPj4gMik7CisgICAgICB2YXIgZGVzdDMyRGF0YUxlbmd0aCA9IGRlc3QzMi5sZW5ndGg7CisgICAgICB2YXIgZnVsbFNyY0RpZmYgPSB3aWR0aCArIDcgPj4gMzsKKyAgICAgIHZhciB3aGl0ZSA9IDB4ZmZmZmZmZmY7CisgICAgICB2YXIgYmxhY2sgPSBfdXRpbC5Jc0xpdHRsZUVuZGlhbkNhY2hlZC52YWx1ZSA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmOworCisgICAgICBpZiAodHJhbnNmZXJNYXBHcmF5KSB7CisgICAgICAgIGlmICh0cmFuc2Zlck1hcEdyYXlbMF0gPT09IDB4ZmYgJiYgdHJhbnNmZXJNYXBHcmF5WzB4ZmZdID09PSAwKSB7CisgICAgICAgICAgW3doaXRlLCBibGFja10gPSBbYmxhY2ssIHdoaXRlXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykgeworICAgICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBpIDwgZnVsbENodW5rcyA/IEZVTExfQ0hVTktfSEVJR0hUIDogcGFydGlhbENodW5rSGVpZ2h0OworICAgICAgICBkZXN0UG9zID0gMDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGhpc0NodW5rSGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICB2YXIgc3JjRGlmZiA9IHNyY0xlbmd0aCAtIHNyY1BvczsKKyAgICAgICAgICBsZXQgayA9IDA7CisgICAgICAgICAgdmFyIGtFbmQgPSBzcmNEaWZmID4gZnVsbFNyY0RpZmYgPyB3aWR0aCA6IHNyY0RpZmYgKiA4IC0gNzsKKyAgICAgICAgICB2YXIga0VuZFVucm9sbGVkID0ga0VuZCAmIH43OworICAgICAgICAgIHZhciBtYXNrID0gMDsKKyAgICAgICAgICB2YXIgc3JjQnl0ZSA9IDA7CisKKyAgICAgICAgICBmb3IgKDsgayA8IGtFbmRVbnJvbGxlZDsgayArPSA4KSB7CisgICAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEyOCA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA2NCA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAzMiA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxNiA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA4ID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDQgPyB3aGl0ZSA6IGJsYWNrOworICAgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMiA/IHdoaXRlIDogYmxhY2s7CisgICAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxID8gd2hpdGUgOiBibGFjazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKDsgayA8IGtFbmQ7IGsrKykgeworICAgICAgICAgICAgaWYgKG1hc2sgPT09IDApIHsKKyAgICAgICAgICAgICAgc3JjQnl0ZSA9IHNyY1tzcmNQb3MrK107CisgICAgICAgICAgICAgIG1hc2sgPSAxMjg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIG1hc2sgPyB3aGl0ZSA6IGJsYWNrOworICAgICAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoZGVzdFBvcyA8IGRlc3QzMkRhdGFMZW5ndGgpIHsKKyAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLlJHQkFfMzJCUFApIHsKKyAgICAgIGNvbnN0IGhhc1RyYW5zZmVyTWFwcyA9ICEhKHRyYW5zZmVyTWFwUmVkIHx8IHRyYW5zZmVyTWFwR3JlZW4gfHwgdHJhbnNmZXJNYXBCbHVlKTsKKyAgICAgIGogPSAwOworICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogRlVMTF9DSFVOS19IRUlHSFQgKiA0OworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZnVsbENodW5rczsgaSsrKSB7CisgICAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNQb3MsIHNyY1BvcyArIGVsZW1zSW5UaGlzQ2h1bmspKTsKKyAgICAgICAgc3JjUG9zICs9IGVsZW1zSW5UaGlzQ2h1bms7CisKKyAgICAgICAgaWYgKGhhc1RyYW5zZmVyTWFwcykgeworICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZWxlbXNJblRoaXNDaHVuazsgayArPSA0KSB7CisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBSZWQpIHsKKyAgICAgICAgICAgICAgZGVzdFtrICsgMF0gPSB0cmFuc2Zlck1hcFJlZFtkZXN0W2sgKyAwXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEdyZWVuKSB7CisgICAgICAgICAgICAgIGRlc3RbayArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W2sgKyAxXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEJsdWUpIHsKKyAgICAgICAgICAgICAgZGVzdFtrICsgMl0gPSB0cmFuc2Zlck1hcEJsdWVbZGVzdFtrICsgMl1dOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTsKKyAgICAgICAgaiArPSBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPCB0b3RhbENodW5rcykgeworICAgICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiBwYXJ0aWFsQ2h1bmtIZWlnaHQgKiA0OworICAgICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7CisKKyAgICAgICAgaWYgKGhhc1RyYW5zZmVyTWFwcykgeworICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZWxlbXNJblRoaXNDaHVuazsgayArPSA0KSB7CisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBSZWQpIHsKKyAgICAgICAgICAgICAgZGVzdFtrICsgMF0gPSB0cmFuc2Zlck1hcFJlZFtkZXN0W2sgKyAwXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEdyZWVuKSB7CisgICAgICAgICAgICAgIGRlc3RbayArIDFdID0gdHJhbnNmZXJNYXBHcmVlbltkZXN0W2sgKyAxXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zlck1hcEJsdWUpIHsKKyAgICAgICAgICAgICAgZGVzdFtrICsgMl0gPSB0cmFuc2Zlck1hcEJsdWVbZGVzdFtrICsgMl1dOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUCkgeworICAgICAgY29uc3QgaGFzVHJhbnNmZXJNYXBzID0gISEodHJhbnNmZXJNYXBSZWQgfHwgdHJhbnNmZXJNYXBHcmVlbiB8fCB0cmFuc2Zlck1hcEJsdWUpOworICAgICAgdGhpc0NodW5rSGVpZ2h0ID0gRlVMTF9DSFVOS19IRUlHSFQ7CisgICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiB0aGlzQ2h1bmtIZWlnaHQ7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7CisgICAgICAgIGlmIChpID49IGZ1bGxDaHVua3MpIHsKKyAgICAgICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQ7CisgICAgICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogdGhpc0NodW5rSGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgZGVzdFBvcyA9IDA7CisKKyAgICAgICAgZm9yIChqID0gZWxlbXNJblRoaXNDaHVuazsgai0tOykgeworICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107CisgICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTsKKyAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdOworICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IDI1NTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXNUcmFuc2Zlck1hcHMpIHsKKyAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGRlc3RQb3M7IGsgKz0gNCkgeworICAgICAgICAgICAgaWYgKHRyYW5zZmVyTWFwUmVkKSB7CisgICAgICAgICAgICAgIGRlc3RbayArIDBdID0gdHJhbnNmZXJNYXBSZWRbZGVzdFtrICsgMF1dOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBHcmVlbikgeworICAgICAgICAgICAgICBkZXN0W2sgKyAxXSA9IHRyYW5zZmVyTWFwR3JlZW5bZGVzdFtrICsgMV1dOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhbnNmZXJNYXBCbHVlKSB7CisgICAgICAgICAgICAgIGRlc3RbayArIDJdID0gdHJhbnNmZXJNYXBCbHVlW2Rlc3RbayArIDJdXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWQgaW1hZ2Uga2luZDogJHtpbWdEYXRhLmtpbmR9YCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VNYXNrKGN0eCwgaW1nRGF0YSkgeworICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCwKKyAgICAgICAgd2lkdGggPSBpbWdEYXRhLndpZHRoOworICAgIHZhciBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDsKKyAgICB2YXIgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7CisgICAgdmFyIHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxOworICAgIHZhciBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7CisgICAgdmFyIHNyY1BvcyA9IDA7CisgICAgdmFyIHNyYyA9IGltZ0RhdGEuZGF0YTsKKyAgICB2YXIgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7CisgICAgICB2YXIgdGhpc0NodW5rSGVpZ2h0ID0gaSA8IGZ1bGxDaHVua3MgPyBGVUxMX0NIVU5LX0hFSUdIVCA6IHBhcnRpYWxDaHVua0hlaWdodDsKKyAgICAgIHZhciBkZXN0UG9zID0gMzsKKworICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzQ2h1bmtIZWlnaHQ7IGorKykgeworICAgICAgICB2YXIgbWFzayA9IDA7CisKKyAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB3aWR0aDsgaysrKSB7CisgICAgICAgICAgaWYgKCFtYXNrKSB7CisgICAgICAgICAgICB2YXIgZWxlbSA9IHNyY1tzcmNQb3MrK107CisgICAgICAgICAgICBtYXNrID0gMTI4OworICAgICAgICAgIH0KKworICAgICAgICAgIGRlc3RbZGVzdFBvc10gPSBlbGVtICYgbWFzayA/IDAgOiAyNTU7CisgICAgICAgICAgZGVzdFBvcyArPSA0OworICAgICAgICAgIG1hc2sgPj49IDE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY29weUN0eFN0YXRlKHNvdXJjZUN0eCwgZGVzdEN0eCkgeworICAgIHZhciBwcm9wZXJ0aWVzID0gWyJzdHJva2VTdHlsZSIsICJmaWxsU3R5bGUiLCAiZmlsbFJ1bGUiLCAiZ2xvYmFsQWxwaGEiLCAibGluZVdpZHRoIiwgImxpbmVDYXAiLCAibGluZUpvaW4iLCAibWl0ZXJMaW1pdCIsICJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCAiZm9udCJdOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcHJvcGVydGllcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldOworCisgICAgICBpZiAoc291cmNlQ3R4W3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGRlc3RDdHhbcHJvcGVydHldID0gc291cmNlQ3R4W3Byb3BlcnR5XTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc291cmNlQ3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGRlc3RDdHguc2V0TGluZURhc2goc291cmNlQ3R4LmdldExpbmVEYXNoKCkpOworICAgICAgZGVzdEN0eC5saW5lRGFzaE9mZnNldCA9IHNvdXJjZUN0eC5saW5lRGFzaE9mZnNldDsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiByZXNldEN0eFRvRGVmYXVsdChjdHgpIHsKKyAgICBjdHguc3Ryb2tlU3R5bGUgPSAiIzAwMDAwMCI7CisgICAgY3R4LmZpbGxTdHlsZSA9ICIjMDAwMDAwIjsKKyAgICBjdHguZmlsbFJ1bGUgPSAibm9uemVybyI7CisgICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKKyAgICBjdHgubGluZVdpZHRoID0gMTsKKyAgICBjdHgubGluZUNhcCA9ICJidXR0IjsKKyAgICBjdHgubGluZUpvaW4gPSAibWl0ZXIiOworICAgIGN0eC5taXRlckxpbWl0ID0gMTA7CisgICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2Utb3ZlciI7CisgICAgY3R4LmZvbnQgPSAiMTBweCBzYW5zLXNlcmlmIjsKKworICAgIGlmIChjdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkgeworICAgICAgY3R4LnNldExpbmVEYXNoKFtdKTsKKyAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IDA7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY29tcG9zZVNNYXNrQmFja2Ryb3AoYnl0ZXMsIHIwLCBnMCwgYjApIHsKKyAgICB2YXIgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworCisgICAgZm9yICh2YXIgaSA9IDM7IGkgPCBsZW5ndGg7IGkgKz0gNCkgeworICAgICAgdmFyIGFscGhhID0gYnl0ZXNbaV07CisKKyAgICAgIGlmIChhbHBoYSA9PT0gMCkgeworICAgICAgICBieXRlc1tpIC0gM10gPSByMDsKKyAgICAgICAgYnl0ZXNbaSAtIDJdID0gZzA7CisgICAgICAgIGJ5dGVzW2kgLSAxXSA9IGIwOworICAgICAgfSBlbHNlIGlmIChhbHBoYSA8IDI1NSkgeworICAgICAgICB2YXIgYWxwaGFfID0gMjU1IC0gYWxwaGE7CisgICAgICAgIGJ5dGVzW2kgLSAzXSA9IGJ5dGVzW2kgLSAzXSAqIGFscGhhICsgcjAgKiBhbHBoYV8gPj4gODsKKyAgICAgICAgYnl0ZXNbaSAtIDJdID0gYnl0ZXNbaSAtIDJdICogYWxwaGEgKyBnMCAqIGFscGhhXyA+PiA4OworICAgICAgICBieXRlc1tpIC0gMV0gPSBieXRlc1tpIC0gMV0gKiBhbHBoYSArIGIwICogYWxwaGFfID4+IDg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY29tcG9zZVNNYXNrQWxwaGEobWFza0RhdGEsIGxheWVyRGF0YSwgdHJhbnNmZXJNYXApIHsKKyAgICB2YXIgbGVuZ3RoID0gbWFza0RhdGEubGVuZ3RoOworICAgIHZhciBzY2FsZSA9IDEgLyAyNTU7CisKKyAgICBmb3IgKHZhciBpID0gMzsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CisgICAgICB2YXIgYWxwaGEgPSB0cmFuc2Zlck1hcCA/IHRyYW5zZmVyTWFwW21hc2tEYXRhW2ldXSA6IG1hc2tEYXRhW2ldOworICAgICAgbGF5ZXJEYXRhW2ldID0gbGF5ZXJEYXRhW2ldICogYWxwaGEgKiBzY2FsZSB8IDA7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY29tcG9zZVNNYXNrTHVtaW5vc2l0eShtYXNrRGF0YSwgbGF5ZXJEYXRhLCB0cmFuc2Zlck1hcCkgeworICAgIHZhciBsZW5ndGggPSBtYXNrRGF0YS5sZW5ndGg7CisKKyAgICBmb3IgKHZhciBpID0gMzsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CisgICAgICB2YXIgeSA9IG1hc2tEYXRhW2kgLSAzXSAqIDc3ICsgbWFza0RhdGFbaSAtIDJdICogMTUyICsgbWFza0RhdGFbaSAtIDFdICogMjg7CisgICAgICBsYXllckRhdGFbaV0gPSB0cmFuc2Zlck1hcCA/IGxheWVyRGF0YVtpXSAqIHRyYW5zZmVyTWFwW3kgPj4gOF0gPj4gOCA6IGxheWVyRGF0YVtpXSAqIHkgPj4gMTY7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZ2VuZXJpY0NvbXBvc2VTTWFzayhtYXNrQ3R4LCBsYXllckN0eCwgd2lkdGgsIGhlaWdodCwgc3VidHlwZSwgYmFja2Ryb3AsIHRyYW5zZmVyTWFwKSB7CisgICAgdmFyIGhhc0JhY2tkcm9wID0gISFiYWNrZHJvcDsKKyAgICB2YXIgcjAgPSBoYXNCYWNrZHJvcCA/IGJhY2tkcm9wWzBdIDogMDsKKyAgICB2YXIgZzAgPSBoYXNCYWNrZHJvcCA/IGJhY2tkcm9wWzFdIDogMDsKKyAgICB2YXIgYjAgPSBoYXNCYWNrZHJvcCA/IGJhY2tkcm9wWzJdIDogMDsKKyAgICB2YXIgY29tcG9zZUZuOworCisgICAgaWYgKHN1YnR5cGUgPT09ICJMdW1pbm9zaXR5IikgeworICAgICAgY29tcG9zZUZuID0gY29tcG9zZVNNYXNrTHVtaW5vc2l0eTsKKyAgICB9IGVsc2UgeworICAgICAgY29tcG9zZUZuID0gY29tcG9zZVNNYXNrQWxwaGE7CisgICAgfQorCisgICAgdmFyIFBJWEVMU19UT19QUk9DRVNTID0gMTA0ODU3NjsKKyAgICB2YXIgY2h1bmtTaXplID0gTWF0aC5taW4oaGVpZ2h0LCBNYXRoLmNlaWwoUElYRUxTX1RPX1BST0NFU1MgLyB3aWR0aCkpOworCisgICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKz0gY2h1bmtTaXplKSB7CisgICAgICB2YXIgY2h1bmtIZWlnaHQgPSBNYXRoLm1pbihjaHVua1NpemUsIGhlaWdodCAtIHJvdyk7CisgICAgICB2YXIgbWFza0RhdGEgPSBtYXNrQ3R4LmdldEltYWdlRGF0YSgwLCByb3csIHdpZHRoLCBjaHVua0hlaWdodCk7CisgICAgICB2YXIgbGF5ZXJEYXRhID0gbGF5ZXJDdHguZ2V0SW1hZ2VEYXRhKDAsIHJvdywgd2lkdGgsIGNodW5rSGVpZ2h0KTsKKworICAgICAgaWYgKGhhc0JhY2tkcm9wKSB7CisgICAgICAgIGNvbXBvc2VTTWFza0JhY2tkcm9wKG1hc2tEYXRhLmRhdGEsIHIwLCBnMCwgYjApOworICAgICAgfQorCisgICAgICBjb21wb3NlRm4obWFza0RhdGEuZGF0YSwgbGF5ZXJEYXRhLmRhdGEsIHRyYW5zZmVyTWFwKTsKKyAgICAgIG1hc2tDdHgucHV0SW1hZ2VEYXRhKGxheWVyRGF0YSwgMCwgcm93KTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb21wb3NlU01hc2soY3R4LCBzbWFzaywgbGF5ZXJDdHgsIHdlYkdMQ29udGV4dCkgeworICAgIHZhciBtYXNrID0gc21hc2suY2FudmFzOworICAgIHZhciBtYXNrQ3R4ID0gc21hc2suY29udGV4dDsKKyAgICBjdHguc2V0VHJhbnNmb3JtKHNtYXNrLnNjYWxlWCwgMCwgMCwgc21hc2suc2NhbGVZLCBzbWFzay5vZmZzZXRYLCBzbWFzay5vZmZzZXRZKTsKKyAgICB2YXIgYmFja2Ryb3AgPSBzbWFzay5iYWNrZHJvcCB8fCBudWxsOworCisgICAgaWYgKCFzbWFzay50cmFuc2Zlck1hcCAmJiB3ZWJHTENvbnRleHQuaXNFbmFibGVkKSB7CisgICAgICBjb25zdCBjb21wb3NlZCA9IHdlYkdMQ29udGV4dC5jb21wb3NlU01hc2soeworICAgICAgICBsYXllcjogbGF5ZXJDdHguY2FudmFzLAorICAgICAgICBtYXNrLAorICAgICAgICBwcm9wZXJ0aWVzOiB7CisgICAgICAgICAgc3VidHlwZTogc21hc2suc3VidHlwZSwKKyAgICAgICAgICBiYWNrZHJvcAorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgICBjdHguZHJhd0ltYWdlKGNvbXBvc2VkLCBzbWFzay5vZmZzZXRYLCBzbWFzay5vZmZzZXRZKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnZW5lcmljQ29tcG9zZVNNYXNrKG1hc2tDdHgsIGxheWVyQ3R4LCBtYXNrLndpZHRoLCBtYXNrLmhlaWdodCwgc21hc2suc3VidHlwZSwgYmFja2Ryb3AsIHNtYXNrLnRyYW5zZmVyTWFwKTsKKyAgICBjdHguZHJhd0ltYWdlKG1hc2ssIDAsIDApOworICB9CisKKyAgdmFyIExJTkVfQ0FQX1NUWUxFUyA9IFsiYnV0dCIsICJyb3VuZCIsICJzcXVhcmUiXTsKKyAgdmFyIExJTkVfSk9JTl9TVFlMRVMgPSBbIm1pdGVyIiwgInJvdW5kIiwgImJldmVsIl07CisgIHZhciBOT1JNQUxfQ0xJUCA9IHt9OworICB2YXIgRU9fQ0xJUCA9IHt9OworICBDYW52YXNHcmFwaGljcy5wcm90b3R5cGUgPSB7CisgICAgYmVnaW5EcmF3aW5nKHsKKyAgICAgIHRyYW5zZm9ybSwKKyAgICAgIHZpZXdwb3J0LAorICAgICAgdHJhbnNwYXJlbmN5ID0gZmFsc2UsCisgICAgICBiYWNrZ3JvdW5kID0gbnVsbAorICAgIH0pIHsKKyAgICAgIHZhciB3aWR0aCA9IHRoaXMuY3R4LmNhbnZhcy53aWR0aDsKKyAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0OworICAgICAgdGhpcy5jdHguc2F2ZSgpOworICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZCB8fCAicmdiKDI1NSwgMjU1LCAyNTUpIjsKKyAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgdGhpcy5jdHgucmVzdG9yZSgpOworCisgICAgICBpZiAodHJhbnNwYXJlbmN5KSB7CisgICAgICAgIHZhciB0cmFuc3BhcmVudENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJ0cmFuc3BhcmVudCIsIHdpZHRoLCBoZWlnaHQsIHRydWUpOworICAgICAgICB0aGlzLmNvbXBvc2l0ZUN0eCA9IHRoaXMuY3R4OworICAgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gdHJhbnNwYXJlbnRDYW52YXMuY2FudmFzOworICAgICAgICB0aGlzLmN0eCA9IHRyYW5zcGFyZW50Q2FudmFzLmNvbnRleHQ7CisgICAgICAgIHRoaXMuY3R4LnNhdmUoKTsKKyAgICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCB0aGlzLmNvbXBvc2l0ZUN0eC5tb3pDdXJyZW50VHJhbnNmb3JtKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jdHguc2F2ZSgpOworICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpOworCisgICAgICBpZiAodHJhbnNmb3JtKSB7CisgICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgdHJhbnNmb3JtKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCB2aWV3cG9ydC50cmFuc2Zvcm0pOworICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gdGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybS5zbGljZSgpOworCisgICAgICBpZiAodGhpcy5pbWFnZUxheWVyKSB7CisgICAgICAgIHRoaXMuaW1hZ2VMYXllci5iZWdpbkxheW91dCgpOworICAgICAgfQorICAgIH0sCisKKyAgICBleGVjdXRlT3BlcmF0b3JMaXN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCwgZXhlY3V0aW9uU3RhcnRJZHgsIGNvbnRpbnVlQ2FsbGJhY2ssIHN0ZXBwZXIpIHsKKyAgICAgIHZhciBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5OworICAgICAgdmFyIGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTsKKyAgICAgIHZhciBpID0gZXhlY3V0aW9uU3RhcnRJZHggfHwgMDsKKyAgICAgIHZhciBhcmdzQXJyYXlMZW4gPSBhcmdzQXJyYXkubGVuZ3RoOworCisgICAgICBpZiAoYXJnc0FycmF5TGVuID09PSBpKSB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorCisgICAgICB2YXIgY2h1bmtPcGVyYXRpb25zID0gYXJnc0FycmF5TGVuIC0gaSA+IEVYRUNVVElPTl9TVEVQUyAmJiB0eXBlb2YgY29udGludWVDYWxsYmFjayA9PT0gImZ1bmN0aW9uIjsKKyAgICAgIHZhciBlbmRUaW1lID0gY2h1bmtPcGVyYXRpb25zID8gRGF0ZS5ub3coKSArIEVYRUNVVElPTl9USU1FIDogMDsKKyAgICAgIHZhciBzdGVwcyA9IDA7CisgICAgICB2YXIgY29tbW9uT2JqcyA9IHRoaXMuY29tbW9uT2JqczsKKyAgICAgIHZhciBvYmpzID0gdGhpcy5vYmpzOworICAgICAgdmFyIGZuSWQ7CisKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChzdGVwcGVyICE9PSB1bmRlZmluZWQgJiYgaSA9PT0gc3RlcHBlci5uZXh0QnJlYWtQb2ludCkgeworICAgICAgICAgIHN0ZXBwZXIuYnJlYWtJdChpLCBjb250aW51ZUNhbGxiYWNrKTsKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorCisgICAgICAgIGZuSWQgPSBmbkFycmF5W2ldOworCisgICAgICAgIGlmIChmbklkICE9PSBfdXRpbC5PUFMuZGVwZW5kZW5jeSkgeworICAgICAgICAgIHRoaXNbZm5JZF0uYXBwbHkodGhpcywgYXJnc0FycmF5W2ldKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGNvbnN0IGRlcE9iaklkIG9mIGFyZ3NBcnJheVtpXSkgeworICAgICAgICAgICAgY29uc3Qgb2Jqc1Bvb2wgPSBkZXBPYmpJZC5zdGFydHNXaXRoKCJnXyIpID8gY29tbW9uT2JqcyA6IG9ianM7CisKKyAgICAgICAgICAgIGlmICghb2Jqc1Bvb2wuaGFzKGRlcE9iaklkKSkgeworICAgICAgICAgICAgICBvYmpzUG9vbC5nZXQoZGVwT2JqSWQsIGNvbnRpbnVlQ2FsbGJhY2spOworICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpKys7CisKKyAgICAgICAgaWYgKGkgPT09IGFyZ3NBcnJheUxlbikgeworICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNodW5rT3BlcmF0aW9ucyAmJiArK3N0ZXBzID4gRVhFQ1VUSU9OX1NURVBTKSB7CisgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBlbmRUaW1lKSB7CisgICAgICAgICAgICBjb250aW51ZUNhbGxiYWNrKCk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdGVwcyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIGVuZERyYXdpbmc6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZERyYXdpbmcoKSB7CisgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrICE9PSBudWxsKSB7CisgICAgICAgIHRoaXMuZW5kU01hc2tHcm91cCgpOworICAgICAgfQorCisgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7CisKKyAgICAgIGlmICh0aGlzLnRyYW5zcGFyZW50Q2FudmFzKSB7CisgICAgICAgIHRoaXMuY3R4ID0gdGhpcy5jb21wb3NpdGVDdHg7CisgICAgICAgIHRoaXMuY3R4LnNhdmUoKTsKKyAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApOworICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy50cmFuc3BhcmVudENhbnZhcywgMCwgMCk7CisgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTsKKyAgICAgICAgdGhpcy50cmFuc3BhcmVudENhbnZhcyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuY2xlYXIoKTsKKyAgICAgIHRoaXMud2ViR0xDb250ZXh0LmNsZWFyKCk7CisKKyAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHsKKyAgICAgICAgdGhpcy5pbWFnZUxheWVyLmVuZExheW91dCgpOworICAgICAgfQorICAgIH0sCisgICAgc2V0TGluZVdpZHRoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRMaW5lV2lkdGgod2lkdGgpIHsKKyAgICAgIHRoaXMuY3VycmVudC5saW5lV2lkdGggPSB3aWR0aDsKKyAgICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IHdpZHRoOworICAgIH0sCisgICAgc2V0TGluZUNhcDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGluZUNhcChzdHlsZSkgeworICAgICAgdGhpcy5jdHgubGluZUNhcCA9IExJTkVfQ0FQX1NUWUxFU1tzdHlsZV07CisgICAgfSwKKyAgICBzZXRMaW5lSm9pbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGluZUpvaW4oc3R5bGUpIHsKKyAgICAgIHRoaXMuY3R4LmxpbmVKb2luID0gTElORV9KT0lOX1NUWUxFU1tzdHlsZV07CisgICAgfSwKKyAgICBzZXRNaXRlckxpbWl0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRNaXRlckxpbWl0KGxpbWl0KSB7CisgICAgICB0aGlzLmN0eC5taXRlckxpbWl0ID0gbGltaXQ7CisgICAgfSwKKyAgICBzZXREYXNoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXREYXNoKGRhc2hBcnJheSwgZGFzaFBoYXNlKSB7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisKKyAgICAgIGlmIChjdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkgeworICAgICAgICBjdHguc2V0TGluZURhc2goZGFzaEFycmF5KTsKKyAgICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gZGFzaFBoYXNlOworICAgICAgfQorICAgIH0sCisKKyAgICBzZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KSB7fSwKKworICAgIHNldEZsYXRuZXNzKGZsYXRuZXNzKSB7fSwKKworICAgIHNldEdTdGF0ZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0R1N0YXRlKHN0YXRlcykgeworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3RhdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIHN0YXRlID0gc3RhdGVzW2ldOworICAgICAgICB2YXIga2V5ID0gc3RhdGVbMF07CisgICAgICAgIHZhciB2YWx1ZSA9IHN0YXRlWzFdOworCisgICAgICAgIHN3aXRjaCAoa2V5KSB7CisgICAgICAgICAgY2FzZSAiTFciOgorICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgodmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJMQyI6CisgICAgICAgICAgICB0aGlzLnNldExpbmVDYXAodmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJMSiI6CisgICAgICAgICAgICB0aGlzLnNldExpbmVKb2luKHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiTUwiOgorICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiRCI6CisgICAgICAgICAgICB0aGlzLnNldERhc2godmFsdWVbMF0sIHZhbHVlWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiUkkiOgorICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQodmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJGTCI6CisgICAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiRm9udCI6CisgICAgICAgICAgICB0aGlzLnNldEZvbnQodmFsdWVbMF0sIHZhbHVlWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAiQ0EiOgorICAgICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhID0gc3RhdGVbMV07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgImNhIjoKKyAgICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPSBzdGF0ZVsxXTsKKyAgICAgICAgICAgIHRoaXMuY3R4Lmdsb2JhbEFscGhhID0gc3RhdGVbMV07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkJNIjoKKyAgICAgICAgICAgIHRoaXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJTTWFzayI6CisgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSB7CisgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoID4gMCAmJiB0aGlzLnN0YXRlU3RhY2tbdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCAtIDFdLmFjdGl2ZVNNYXNrID09PSB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2spIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN1c3BlbmRTTWFza0dyb3VwKCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5lbmRTTWFza0dyb3VwKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gdmFsdWUgPyB0aGlzLnRlbXBTTWFzayA6IG51bGw7CisKKyAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2spIHsKKyAgICAgICAgICAgICAgdGhpcy5iZWdpblNNYXNrR3JvdXAoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJUUiI6CisgICAgICAgICAgICB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIGJlZ2luU01hc2tHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5TTWFza0dyb3VwKCkgeworICAgICAgdmFyIGFjdGl2ZVNNYXNrID0gdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrOworICAgICAgdmFyIGRyYXduV2lkdGggPSBhY3RpdmVTTWFzay5jYW52YXMud2lkdGg7CisgICAgICB2YXIgZHJhd25IZWlnaHQgPSBhY3RpdmVTTWFzay5jYW52YXMuaGVpZ2h0OworICAgICAgdmFyIGNhY2hlSWQgPSAic21hc2tHcm91cEF0IiArIHRoaXMuZ3JvdXBMZXZlbDsKKyAgICAgIHZhciBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoY2FjaGVJZCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQsIHRydWUpOworICAgICAgdmFyIGN1cnJlbnRDdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciBjdXJyZW50VHJhbnNmb3JtID0gY3VycmVudEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworICAgICAgdGhpcy5jdHguc2F2ZSgpOworICAgICAgdmFyIGdyb3VwQ3R4ID0gc2NyYXRjaENhbnZhcy5jb250ZXh0OworICAgICAgZ3JvdXBDdHguc2NhbGUoMSAvIGFjdGl2ZVNNYXNrLnNjYWxlWCwgMSAvIGFjdGl2ZVNNYXNrLnNjYWxlWSk7CisgICAgICBncm91cEN0eC50cmFuc2xhdGUoLWFjdGl2ZVNNYXNrLm9mZnNldFgsIC1hY3RpdmVTTWFzay5vZmZzZXRZKTsKKyAgICAgIGdyb3VwQ3R4LnRyYW5zZm9ybS5hcHBseShncm91cEN0eCwgY3VycmVudFRyYW5zZm9ybSk7CisgICAgICBhY3RpdmVTTWFzay5zdGFydFRyYW5zZm9ybUludmVyc2UgPSBncm91cEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTsKKyAgICAgIGNvcHlDdHhTdGF0ZShjdXJyZW50Q3R4LCBncm91cEN0eCk7CisgICAgICB0aGlzLmN0eCA9IGdyb3VwQ3R4OworICAgICAgdGhpcy5zZXRHU3RhdGUoW1siQk0iLCAic291cmNlLW92ZXIiXSwgWyJjYSIsIDFdLCBbIkNBIiwgMV1dKTsKKyAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGN1cnJlbnRDdHgpOworICAgICAgdGhpcy5ncm91cExldmVsKys7CisgICAgfSwKKyAgICBzdXNwZW5kU01hc2tHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kU01hc2tHcm91cCgpIHsKKyAgICAgIHZhciBncm91cEN0eCA9IHRoaXMuY3R4OworICAgICAgdGhpcy5ncm91cExldmVsLS07CisgICAgICB0aGlzLmN0eCA9IHRoaXMuZ3JvdXBTdGFjay5wb3AoKTsKKyAgICAgIGNvbXBvc2VTTWFzayh0aGlzLmN0eCwgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLCBncm91cEN0eCwgdGhpcy53ZWJHTENvbnRleHQpOworICAgICAgdGhpcy5jdHgucmVzdG9yZSgpOworICAgICAgdGhpcy5jdHguc2F2ZSgpOworICAgICAgY29weUN0eFN0YXRlKGdyb3VwQ3R4LCB0aGlzLmN0eCk7CisgICAgICB0aGlzLmN1cnJlbnQucmVzdW1lU01hc2tDdHggPSBncm91cEN0eDsKKworICAgICAgdmFyIGRlbHRhVHJhbnNmb3JtID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLnN0YXJ0VHJhbnNmb3JtSW52ZXJzZSwgZ3JvdXBDdHgubW96Q3VycmVudFRyYW5zZm9ybSk7CisKKyAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseSh0aGlzLmN0eCwgZGVsdGFUcmFuc2Zvcm0pOworICAgICAgZ3JvdXBDdHguc2F2ZSgpOworICAgICAgZ3JvdXBDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApOworICAgICAgZ3JvdXBDdHguY2xlYXJSZWN0KDAsIDAsIGdyb3VwQ3R4LmNhbnZhcy53aWR0aCwgZ3JvdXBDdHguY2FudmFzLmhlaWdodCk7CisgICAgICBncm91cEN0eC5yZXN0b3JlKCk7CisgICAgfSwKKyAgICByZXN1bWVTTWFza0dyb3VwOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRTTWFza0dyb3VwKCkgeworICAgICAgdmFyIGdyb3VwQ3R4ID0gdGhpcy5jdXJyZW50LnJlc3VtZVNNYXNrQ3R4OworICAgICAgdmFyIGN1cnJlbnRDdHggPSB0aGlzLmN0eDsKKyAgICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7CisgICAgICB0aGlzLmdyb3VwU3RhY2sucHVzaChjdXJyZW50Q3R4KTsKKyAgICAgIHRoaXMuZ3JvdXBMZXZlbCsrOworICAgIH0sCisgICAgZW5kU01hc2tHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kU01hc2tHcm91cCgpIHsKKyAgICAgIHZhciBncm91cEN0eCA9IHRoaXMuY3R4OworICAgICAgdGhpcy5ncm91cExldmVsLS07CisgICAgICB0aGlzLmN0eCA9IHRoaXMuZ3JvdXBTdGFjay5wb3AoKTsKKyAgICAgIGNvbXBvc2VTTWFzayh0aGlzLmN0eCwgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrLCBncm91cEN0eCwgdGhpcy53ZWJHTENvbnRleHQpOworICAgICAgdGhpcy5jdHgucmVzdG9yZSgpOworICAgICAgY29weUN0eFN0YXRlKGdyb3VwQ3R4LCB0aGlzLmN0eCk7CisKKyAgICAgIHZhciBkZWx0YVRyYW5zZm9ybSA9IF91dGlsLlV0aWwudHJhbnNmb3JtKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzay5zdGFydFRyYW5zZm9ybUludmVyc2UsIGdyb3VwQ3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHkodGhpcy5jdHgsIGRlbHRhVHJhbnNmb3JtKTsKKyAgICB9LAorICAgIHNhdmU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NhdmUoKSB7CisgICAgICB0aGlzLmN0eC5zYXZlKCk7CisgICAgICB2YXIgb2xkID0gdGhpcy5jdXJyZW50OworICAgICAgdGhpcy5zdGF0ZVN0YWNrLnB1c2gob2xkKTsKKyAgICAgIHRoaXMuY3VycmVudCA9IG9sZC5jbG9uZSgpOworICAgICAgdGhpcy5jdXJyZW50LnJlc3VtZVNNYXNrQ3R4ID0gbnVsbDsKKyAgICB9LAorICAgIHJlc3RvcmU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3Jlc3RvcmUoKSB7CisgICAgICBpZiAodGhpcy5jdXJyZW50LnJlc3VtZVNNYXNrQ3R4KSB7CisgICAgICAgIHRoaXMucmVzdW1lU01hc2tHcm91cCgpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrICE9PSBudWxsICYmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoID09PSAwIHx8IHRoaXMuc3RhdGVTdGFja1t0aGlzLnN0YXRlU3RhY2subGVuZ3RoIC0gMV0uYWN0aXZlU01hc2sgIT09IHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykpIHsKKyAgICAgICAgdGhpcy5lbmRTTWFza0dyb3VwKCk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoICE9PSAwKSB7CisgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuc3RhdGVTdGFjay5wb3AoKTsKKyAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpOworICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDsKKyAgICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7CisgICAgICB9CisgICAgfSwKKyAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3RyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7CisgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7CisgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDsKKyAgICB9LAorICAgIGNvbnN0cnVjdFBhdGg6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2NvbnN0cnVjdFBhdGgob3BzLCBhcmdzKSB7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgIHZhciB4ID0gY3VycmVudC54LAorICAgICAgICAgIHkgPSBjdXJyZW50Lnk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gMCwgaWkgPSBvcHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG9wc1tpXSB8IDApIHsKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5yZWN0YW5nbGU6CisgICAgICAgICAgICB4ID0gYXJnc1tqKytdOworICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIHZhciB3aWR0aCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIHZhciBoZWlnaHQgPSBhcmdzW2orK107CisKKyAgICAgICAgICAgIGlmICh3aWR0aCA9PT0gMCAmJiBjdHgubGluZVdpZHRoIDwgdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpIHsKKyAgICAgICAgICAgICAgd2lkdGggPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhlaWdodCA9PT0gMCAmJiBjdHgubGluZVdpZHRoIDwgdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpIHsKKyAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB4dyA9IHggKyB3aWR0aDsKKyAgICAgICAgICAgIHZhciB5aCA9IHkgKyBoZWlnaHQ7CisgICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpOworICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeSk7CisgICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5aCk7CisgICAgICAgICAgICBjdHgubGluZVRvKHgsIHloKTsKKyAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSk7CisgICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1vdmVUbzoKKyAgICAgICAgICAgIHggPSBhcmdzW2orK107CisgICAgICAgICAgICB5ID0gYXJnc1tqKytdOworICAgICAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubGluZVRvOgorICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2orK107CisgICAgICAgICAgICBjdHgubGluZVRvKHgsIHkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jdXJ2ZVRvOgorICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDRdOworICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDVdOworICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgeCwgeSk7CisgICAgICAgICAgICBqICs9IDY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8yOgorICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oeCwgeSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSk7CisgICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07CisgICAgICAgICAgICB5ID0gYXJnc1tqICsgM107CisgICAgICAgICAgICBqICs9IDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8zOgorICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDJdOworICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDNdOworICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oYXJnc1tqXSwgYXJnc1tqICsgMV0sIHgsIHksIHgsIHkpOworICAgICAgICAgICAgaiArPSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVBhdGg6CisgICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjdXJyZW50LnNldEN1cnJlbnRQb2ludCh4LCB5KTsKKyAgICB9LAorICAgIGNsb3NlUGF0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xvc2VQYXRoKCkgeworICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7CisgICAgfSwKKyAgICBzdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3N0cm9rZShjb25zdW1lUGF0aCkgeworICAgICAgY29uc3VtZVBhdGggPSB0eXBlb2YgY29uc3VtZVBhdGggIT09ICJ1bmRlZmluZWQiID8gY29uc3VtZVBhdGggOiB0cnVlOworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIHN0cm9rZUNvbG9yID0gdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yOworICAgICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhOworCisgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICBpZiAoc3Ryb2tlQ29sb3IgJiYgc3Ryb2tlQ29sb3IuaGFzT3duUHJvcGVydHkoInR5cGUiKSAmJiBzdHJva2VDb2xvci50eXBlID09PSAiUGF0dGVybiIpIHsKKyAgICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworCisgICAgICAgICAgY29uc3Qgc2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRyYW5zZm9ybSlbMF07CisKKyAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcyk7CisgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IE1hdGgubWF4KHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpICogTUlOX1dJRFRIX0ZBQ1RPUiwgdGhpcy5jdXJyZW50LmxpbmVXaWR0aCAqIHNjYWxlKTsKKyAgICAgICAgICBjdHguc3Ryb2tlKCk7CisgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdHgubGluZVdpZHRoID0gTWF0aC5tYXgodGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkgKiBNSU5fV0lEVEhfRkFDVE9SLCB0aGlzLmN1cnJlbnQubGluZVdpZHRoKTsKKyAgICAgICAgICBjdHguc3Ryb2tlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNvbnN1bWVQYXRoKSB7CisgICAgICAgIHRoaXMuY29uc3VtZVBhdGgoKTsKKyAgICAgIH0KKworICAgICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5jdXJyZW50LmZpbGxBbHBoYTsKKyAgICB9LAorICAgIGNsb3NlU3Ryb2tlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbG9zZVN0cm9rZSgpIHsKKyAgICAgIHRoaXMuY2xvc2VQYXRoKCk7CisgICAgICB0aGlzLnN0cm9rZSgpOworICAgIH0sCisgICAgZmlsbDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZmlsbChjb25zdW1lUGF0aCkgeworICAgICAgY29uc3VtZVBhdGggPSB0eXBlb2YgY29uc3VtZVBhdGggIT09ICJ1bmRlZmluZWQiID8gY29uc3VtZVBhdGggOiB0cnVlOworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7CisgICAgICB2YXIgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDsKKyAgICAgIHZhciBuZWVkUmVzdG9yZSA9IGZhbHNlOworCisgICAgICBpZiAoaXNQYXR0ZXJuRmlsbCkgeworICAgICAgICBjdHguc2F2ZSgpOworCisgICAgICAgIGlmICh0aGlzLmJhc2VUcmFuc2Zvcm0pIHsKKyAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtLmFwcGx5KGN0eCwgdGhpcy5iYXNlVHJhbnNmb3JtKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMpOworICAgICAgICBuZWVkUmVzdG9yZSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIGlmICh0aGlzLnBlbmRpbmdFT0ZpbGwpIHsKKyAgICAgICAgICBjdHguZmlsbCgiZXZlbm9kZCIpOworICAgICAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGN0eC5maWxsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKG5lZWRSZXN0b3JlKSB7CisgICAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICB9CisKKyAgICAgIGlmIChjb25zdW1lUGF0aCkgeworICAgICAgICB0aGlzLmNvbnN1bWVQYXRoKCk7CisgICAgICB9CisgICAgfSwKKyAgICBlb0ZpbGw6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VvRmlsbCgpIHsKKyAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7CisgICAgICB0aGlzLmZpbGwoKTsKKyAgICB9LAorICAgIGZpbGxTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2ZpbGxTdHJva2UoKSB7CisgICAgICB0aGlzLmZpbGwoZmFsc2UpOworICAgICAgdGhpcy5zdHJva2UoZmFsc2UpOworICAgICAgdGhpcy5jb25zdW1lUGF0aCgpOworICAgIH0sCisgICAgZW9GaWxsU3Ryb2tlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lb0ZpbGxTdHJva2UoKSB7CisgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlOworICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7CisgICAgfSwKKyAgICBjbG9zZUZpbGxTdHJva2U6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2Nsb3NlRmlsbFN0cm9rZSgpIHsKKyAgICAgIHRoaXMuY2xvc2VQYXRoKCk7CisgICAgICB0aGlzLmZpbGxTdHJva2UoKTsKKyAgICB9LAorICAgIGNsb3NlRU9GaWxsU3Ryb2tlOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jbG9zZUVPRmlsbFN0cm9rZSgpIHsKKyAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7CisgICAgICB0aGlzLmNsb3NlUGF0aCgpOworICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7CisgICAgfSwKKyAgICBlbmRQYXRoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRQYXRoKCkgeworICAgICAgdGhpcy5jb25zdW1lUGF0aCgpOworICAgIH0sCisgICAgY2xpcDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfY2xpcCgpIHsKKyAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBOT1JNQUxfQ0xJUDsKKyAgICB9LAorICAgIGVvQ2xpcDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW9DbGlwKCkgeworICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IEVPX0NMSVA7CisgICAgfSwKKyAgICBiZWdpblRleHQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luVGV4dCgpIHsKKyAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYOworICAgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IDE7CisgICAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7CisgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7CisgICAgfSwKKyAgICBlbmRUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRUZXh0KCkgeworICAgICAgdmFyIHBhdGhzID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzOworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworCisgICAgICBpZiAocGF0aHMgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBjdHguYmVnaW5QYXRoKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY3R4LnNhdmUoKTsKKyAgICAgIGN0eC5iZWdpblBhdGgoKTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgcGF0aCA9IHBhdGhzW2ldOworICAgICAgICBjdHguc2V0VHJhbnNmb3JtLmFwcGx5KGN0eCwgcGF0aC50cmFuc2Zvcm0pOworICAgICAgICBjdHgudHJhbnNsYXRlKHBhdGgueCwgcGF0aC55KTsKKyAgICAgICAgcGF0aC5hZGRUb1BhdGgoY3R4LCBwYXRoLmZvbnRTaXplKTsKKyAgICAgIH0KKworICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIGN0eC5jbGlwKCk7CisgICAgICBjdHguYmVnaW5QYXRoKCk7CisgICAgICBkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzOworICAgIH0sCisgICAgc2V0Q2hhclNwYWNpbmc6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJTcGFjaW5nKHNwYWNpbmcpIHsKKyAgICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IHNwYWNpbmc7CisgICAgfSwKKyAgICBzZXRXb3JkU3BhY2luZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0V29yZFNwYWNpbmcoc3BhY2luZykgeworICAgICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gc3BhY2luZzsKKyAgICB9LAorICAgIHNldEhTY2FsZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0SFNjYWxlKHNjYWxlKSB7CisgICAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHNjYWxlIC8gMTAwOworICAgIH0sCisgICAgc2V0TGVhZGluZzogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGVhZGluZyhsZWFkaW5nKSB7CisgICAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC1sZWFkaW5nOworICAgIH0sCisgICAgc2V0Rm9udDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Rm9udChmb250UmVmTmFtZSwgc2l6ZSkgeworICAgICAgdmFyIGZvbnRPYmogPSB0aGlzLmNvbW1vbk9ianMuZ2V0KGZvbnRSZWZOYW1lKTsKKyAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworCisgICAgICBpZiAoIWZvbnRPYmopIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBmaW5kIGZvbnQgZm9yICR7Zm9udFJlZk5hbWV9YCk7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQuZm9udE1hdHJpeCA9IGZvbnRPYmouZm9udE1hdHJpeCA/IGZvbnRPYmouZm9udE1hdHJpeCA6IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworCisgICAgICBpZiAoY3VycmVudC5mb250TWF0cml4WzBdID09PSAwIHx8IGN1cnJlbnQuZm9udE1hdHJpeFszXSA9PT0gMCkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgZm9udCBtYXRyaXggZm9yIGZvbnQgIiArIGZvbnRSZWZOYW1lKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIHNpemUgPSAtc2l6ZTsKKyAgICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAxOworICAgICAgfQorCisgICAgICB0aGlzLmN1cnJlbnQuZm9udCA9IGZvbnRPYmo7CisgICAgICB0aGlzLmN1cnJlbnQuZm9udFNpemUgPSBzaXplOworCisgICAgICBpZiAoZm9udE9iai5pc1R5cGUzRm9udCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBuYW1lID0gZm9udE9iai5sb2FkZWROYW1lIHx8ICJzYW5zLXNlcmlmIjsKKyAgICAgIGxldCBib2xkID0gIm5vcm1hbCI7CisKKyAgICAgIGlmIChmb250T2JqLmJsYWNrKSB7CisgICAgICAgIGJvbGQgPSAiOTAwIjsKKyAgICAgIH0gZWxzZSBpZiAoZm9udE9iai5ib2xkKSB7CisgICAgICAgIGJvbGQgPSAiYm9sZCI7CisgICAgICB9CisKKyAgICAgIHZhciBpdGFsaWMgPSBmb250T2JqLml0YWxpYyA/ICJpdGFsaWMiIDogIm5vcm1hbCI7CisgICAgICB2YXIgdHlwZWZhY2UgPSBgIiR7bmFtZX0iLCAke2ZvbnRPYmouZmFsbGJhY2tOYW1lfWA7CisgICAgICBsZXQgYnJvd3NlckZvbnRTaXplID0gc2l6ZTsKKworICAgICAgaWYgKHNpemUgPCBNSU5fRk9OVF9TSVpFKSB7CisgICAgICAgIGJyb3dzZXJGb250U2l6ZSA9IE1JTl9GT05UX1NJWkU7CisgICAgICB9IGVsc2UgaWYgKHNpemUgPiBNQVhfRk9OVF9TSVpFKSB7CisgICAgICAgIGJyb3dzZXJGb250U2l6ZSA9IE1BWF9GT05UX1NJWkU7CisgICAgICB9CisKKyAgICAgIHRoaXMuY3VycmVudC5mb250U2l6ZVNjYWxlID0gc2l6ZSAvIGJyb3dzZXJGb250U2l6ZTsKKyAgICAgIHRoaXMuY3R4LmZvbnQgPSBgJHtpdGFsaWN9ICR7Ym9sZH0gJHticm93c2VyRm9udFNpemV9cHggJHt0eXBlZmFjZX1gOworICAgIH0sCisgICAgc2V0VGV4dFJlbmRlcmluZ01vZGU6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFRleHRSZW5kZXJpbmdNb2RlKG1vZGUpIHsKKyAgICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IG1vZGU7CisgICAgfSwKKyAgICBzZXRUZXh0UmlzZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0VGV4dFJpc2UocmlzZSkgeworICAgICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gcmlzZTsKKyAgICB9LAorICAgIG1vdmVUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19tb3ZlVGV4dCh4LCB5KSB7CisgICAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCArPSB4OworICAgICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgKz0geTsKKyAgICB9LAorICAgIHNldExlYWRpbmdNb3ZlVGV4dDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0TGVhZGluZ01vdmVUZXh0KHgsIHkpIHsKKyAgICAgIHRoaXMuc2V0TGVhZGluZygteSk7CisgICAgICB0aGlzLm1vdmVUZXh0KHgsIHkpOworICAgIH0sCisgICAgc2V0VGV4dE1hdHJpeDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0VGV4dE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKSB7CisgICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeCA9IFthLCBiLCBjLCBkLCBlLCBmXTsKKyAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7CisgICAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7CisgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7CisgICAgfSwKKyAgICBuZXh0TGluZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfbmV4dExpbmUoKSB7CisgICAgICB0aGlzLm1vdmVUZXh0KDAsIHRoaXMuY3VycmVudC5sZWFkaW5nKTsKKyAgICB9LAorCisgICAgcGFpbnRDaGFyKGNoYXJhY3RlciwgeCwgeSwgcGF0dGVyblRyYW5zZm9ybSkgeworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICB2YXIgZm9udCA9IGN1cnJlbnQuZm9udDsKKyAgICAgIHZhciB0ZXh0UmVuZGVyaW5nTW9kZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGU7CisgICAgICB2YXIgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplIC8gY3VycmVudC5mb250U2l6ZVNjYWxlOworICAgICAgdmFyIGZpbGxTdHJva2VNb2RlID0gdGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLOworICAgICAgdmFyIGlzQWRkVG9QYXRoU2V0ID0gISEodGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTsKKyAgICAgIGNvbnN0IHBhdHRlcm5GaWxsID0gY3VycmVudC5wYXR0ZXJuRmlsbCAmJiAhZm9udC5taXNzaW5nRmlsZTsKKyAgICAgIHZhciBhZGRUb1BhdGg7CisKKyAgICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBpc0FkZFRvUGF0aFNldCB8fCBwYXR0ZXJuRmlsbCkgeworICAgICAgICBhZGRUb1BhdGggPSBmb250LmdldFBhdGhHZW5lcmF0b3IodGhpcy5jb21tb25PYmpzLCBjaGFyYWN0ZXIpOworICAgICAgfQorCisgICAgICBpZiAoZm9udC5kaXNhYmxlRm9udEZhY2UgfHwgcGF0dGVybkZpbGwpIHsKKyAgICAgICAgY3R4LnNhdmUoKTsKKyAgICAgICAgY3R4LnRyYW5zbGF0ZSh4LCB5KTsKKyAgICAgICAgY3R4LmJlZ2luUGF0aCgpOworICAgICAgICBhZGRUb1BhdGgoY3R4LCBmb250U2l6ZSk7CisKKyAgICAgICAgaWYgKHBhdHRlcm5UcmFuc2Zvcm0pIHsKKyAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtLmFwcGx5KGN0eCwgcGF0dGVyblRyYW5zZm9ybSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7CisgICAgICAgICAgY3R4LmZpbGwoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkgeworICAgICAgICAgIGN0eC5zdHJva2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7CisgICAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3RlciwgeCwgeSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHsKKyAgICAgICAgICBjdHguc3Ryb2tlVGV4dChjaGFyYWN0ZXIsIHgsIHkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChpc0FkZFRvUGF0aFNldCkgeworICAgICAgICB2YXIgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHMgfHwgKHRoaXMucGVuZGluZ1RleHRQYXRocyA9IFtdKTsKKyAgICAgICAgcGF0aHMucHVzaCh7CisgICAgICAgICAgdHJhbnNmb3JtOiBjdHgubW96Q3VycmVudFRyYW5zZm9ybSwKKyAgICAgICAgICB4LAorICAgICAgICAgIHksCisgICAgICAgICAgZm9udFNpemUsCisgICAgICAgICAgYWRkVG9QYXRoCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICBnZXQgaXNGb250U3VicGl4ZWxBQUVuYWJsZWQoKSB7CisgICAgICBjb25zdCB7CisgICAgICAgIGNvbnRleHQ6IGN0eAorICAgICAgfSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCIsIDEwLCAxMCk7CisgICAgICBjdHguc2NhbGUoMS41LCAxKTsKKyAgICAgIGN0eC5maWxsVGV4dCgiSSIsIDAsIDEwKTsKKyAgICAgIHZhciBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMCwgMTApLmRhdGE7CisgICAgICB2YXIgZW5hYmxlZCA9IGZhbHNlOworCisgICAgICBmb3IgKHZhciBpID0gMzsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHsKKyAgICAgICAgaWYgKGRhdGFbaV0gPiAwICYmIGRhdGFbaV0gPCAyNTUpIHsKKyAgICAgICAgICBlbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzRm9udFN1YnBpeGVsQUFFbmFibGVkIiwgZW5hYmxlZCk7CisgICAgfSwKKworICAgIHNob3dUZXh0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zaG93VGV4dChnbHlwaHMpIHsKKyAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgdmFyIGZvbnQgPSBjdXJyZW50LmZvbnQ7CisKKyAgICAgIGlmIChmb250LmlzVHlwZTNGb250KSB7CisgICAgICAgIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQoZ2x5cGhzKTsKKyAgICAgIH0KKworICAgICAgdmFyIGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTsKKworICAgICAgaWYgKGZvbnRTaXplID09PSAwKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlOworICAgICAgdmFyIGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZzsKKyAgICAgIHZhciB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7CisgICAgICB2YXIgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjsKKyAgICAgIHZhciB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjsKKyAgICAgIHZhciBnbHlwaHNMZW5ndGggPSBnbHlwaHMubGVuZ3RoOworICAgICAgdmFyIHZlcnRpY2FsID0gZm9udC52ZXJ0aWNhbDsKKyAgICAgIHZhciBzcGFjaW5nRGlyID0gdmVydGljYWwgPyAxIDogLTE7CisgICAgICB2YXIgZGVmYXVsdFZNZXRyaWNzID0gZm9udC5kZWZhdWx0Vk1ldHJpY3M7CisgICAgICB2YXIgd2lkdGhBZHZhbmNlU2NhbGUgPSBmb250U2l6ZSAqIGN1cnJlbnQuZm9udE1hdHJpeFswXTsKKyAgICAgIHZhciBzaW1wbGVGaWxsVGV4dCA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIWZvbnQuZGlzYWJsZUZvbnRGYWNlICYmICFjdXJyZW50LnBhdHRlcm5GaWxsOworICAgICAgY3R4LnNhdmUoKTsKKyAgICAgIGxldCBwYXR0ZXJuVHJhbnNmb3JtOworCisgICAgICBpZiAoY3VycmVudC5wYXR0ZXJuRmlsbCkgeworICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICBjb25zdCBwYXR0ZXJuID0gY3VycmVudC5maWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMpOworICAgICAgICBwYXR0ZXJuVHJhbnNmb3JtID0gY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm07CisgICAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICAgIGN0eC5maWxsU3R5bGUgPSBwYXR0ZXJuOworICAgICAgfQorCisgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgY3VycmVudC50ZXh0TWF0cml4KTsKKyAgICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkgKyBjdXJyZW50LnRleHRSaXNlKTsKKworICAgICAgaWYgKGZvbnREaXJlY3Rpb24gPiAwKSB7CisgICAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAtMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgMSk7CisgICAgICB9CisKKyAgICAgIHZhciBsaW5lV2lkdGggPSBjdXJyZW50LmxpbmVXaWR0aDsKKyAgICAgIHZhciBzY2FsZSA9IGN1cnJlbnQudGV4dE1hdHJpeFNjYWxlOworCisgICAgICBpZiAoc2NhbGUgPT09IDAgfHwgbGluZVdpZHRoID09PSAwKSB7CisgICAgICAgIHZhciBmaWxsU3Ryb2tlTW9kZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLOworCisgICAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkgeworICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsOworICAgICAgICAgIGxpbmVXaWR0aCA9IHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpICogTUlOX1dJRFRIX0ZBQ1RPUjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGluZVdpZHRoIC89IHNjYWxlOworICAgICAgfQorCisgICAgICBpZiAoZm9udFNpemVTY2FsZSAhPT0gMS4wKSB7CisgICAgICAgIGN0eC5zY2FsZShmb250U2l6ZVNjYWxlLCBmb250U2l6ZVNjYWxlKTsKKyAgICAgICAgbGluZVdpZHRoIC89IGZvbnRTaXplU2NhbGU7CisgICAgICB9CisKKyAgICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7CisgICAgICB2YXIgeCA9IDAsCisgICAgICAgICAgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGdseXBoc0xlbmd0aDsgKytpKSB7CisgICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpXTsKKworICAgICAgICBpZiAoKDAsIF91dGlsLmlzTnVtKShnbHlwaCkpIHsKKyAgICAgICAgICB4ICs9IHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplIC8gMTAwMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZXN0b3JlTmVlZGVkID0gZmFsc2U7CisgICAgICAgIHZhciBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7CisgICAgICAgIHZhciBjaGFyYWN0ZXIgPSBnbHlwaC5mb250Q2hhcjsKKyAgICAgICAgdmFyIGFjY2VudCA9IGdseXBoLmFjY2VudDsKKyAgICAgICAgdmFyIHNjYWxlZFgsIHNjYWxlZFksIHNjYWxlZEFjY2VudFgsIHNjYWxlZEFjY2VudFk7CisgICAgICAgIHZhciB3aWR0aCA9IGdseXBoLndpZHRoOworCisgICAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICAgIHZhciB2bWV0cmljLCB2eCwgdnk7CisgICAgICAgICAgdm1ldHJpYyA9IGdseXBoLnZtZXRyaWMgfHwgZGVmYXVsdFZNZXRyaWNzOworICAgICAgICAgIHZ4ID0gZ2x5cGgudm1ldHJpYyA/IHZtZXRyaWNbMV0gOiB3aWR0aCAqIDAuNTsKKyAgICAgICAgICB2eCA9IC12eCAqIHdpZHRoQWR2YW5jZVNjYWxlOworICAgICAgICAgIHZ5ID0gdm1ldHJpY1syXSAqIHdpZHRoQWR2YW5jZVNjYWxlOworICAgICAgICAgIHdpZHRoID0gdm1ldHJpYyA/IC12bWV0cmljWzBdIDogd2lkdGg7CisgICAgICAgICAgc2NhbGVkWCA9IHZ4IC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICBzY2FsZWRZID0gKHggKyB2eSkgLyBmb250U2l6ZVNjYWxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNjYWxlZFggPSB4IC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICBzY2FsZWRZID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb250LnJlbWVhc3VyZSAmJiB3aWR0aCA+IDApIHsKKyAgICAgICAgICB2YXIgbWVhc3VyZWRXaWR0aCA9IGN0eC5tZWFzdXJlVGV4dChjaGFyYWN0ZXIpLndpZHRoICogMTAwMCAvIGZvbnRTaXplICogZm9udFNpemVTY2FsZTsKKworICAgICAgICAgIGlmICh3aWR0aCA8IG1lYXN1cmVkV2lkdGggJiYgdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCkgeworICAgICAgICAgICAgdmFyIGNoYXJhY3RlclNjYWxlWCA9IHdpZHRoIC8gbWVhc3VyZWRXaWR0aDsKKyAgICAgICAgICAgIHJlc3RvcmVOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgY3R4LnNhdmUoKTsKKyAgICAgICAgICAgIGN0eC5zY2FsZShjaGFyYWN0ZXJTY2FsZVgsIDEpOworICAgICAgICAgICAgc2NhbGVkWCAvPSBjaGFyYWN0ZXJTY2FsZVg7CisgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aCAhPT0gbWVhc3VyZWRXaWR0aCkgeworICAgICAgICAgICAgc2NhbGVkWCArPSAod2lkdGggLSBtZWFzdXJlZFdpZHRoKSAvIDIwMDAgKiBmb250U2l6ZSAvIGZvbnRTaXplU2NhbGU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUgJiYgKGdseXBoLmlzSW5Gb250IHx8IGZvbnQubWlzc2luZ0ZpbGUpKSB7CisgICAgICAgICAgaWYgKHNpbXBsZUZpbGxUZXh0ICYmICFhY2NlbnQpIHsKKyAgICAgICAgICAgIGN0eC5maWxsVGV4dChjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnBhaW50Q2hhcihjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFksIHBhdHRlcm5UcmFuc2Zvcm0pOworCisgICAgICAgICAgICBpZiAoYWNjZW50KSB7CisgICAgICAgICAgICAgIHNjYWxlZEFjY2VudFggPSBzY2FsZWRYICsgZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LnggLyBmb250U2l6ZVNjYWxlOworICAgICAgICAgICAgICBzY2FsZWRBY2NlbnRZID0gc2NhbGVkWSAtIGZvbnRTaXplICogYWNjZW50Lm9mZnNldC55IC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICAgICAgdGhpcy5wYWludENoYXIoYWNjZW50LmZvbnRDaGFyLCBzY2FsZWRBY2NlbnRYLCBzY2FsZWRBY2NlbnRZLCBwYXR0ZXJuVHJhbnNmb3JtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgY2hhcldpZHRoOworCisgICAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICAgIGNoYXJXaWR0aCA9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgLSBzcGFjaW5nICogZm9udERpcmVjdGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICB4ICs9IGNoYXJXaWR0aDsKKworICAgICAgICBpZiAocmVzdG9yZU5lZWRlZCkgeworICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHZlcnRpY2FsKSB7CisgICAgICAgIGN1cnJlbnQueSAtPSB4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3VycmVudC54ICs9IHggKiB0ZXh0SFNjYWxlOworICAgICAgfQorCisgICAgICBjdHgucmVzdG9yZSgpOworICAgIH0sCisgICAgc2hvd1R5cGUzVGV4dDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2hvd1R5cGUzVGV4dChnbHlwaHMpIHsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgdmFyIGZvbnQgPSBjdXJyZW50LmZvbnQ7CisgICAgICB2YXIgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplOworICAgICAgdmFyIGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247CisgICAgICB2YXIgc3BhY2luZ0RpciA9IGZvbnQudmVydGljYWwgPyAxIDogLTE7CisgICAgICB2YXIgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nOworICAgICAgdmFyIHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZzsKKyAgICAgIHZhciB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjsKKyAgICAgIHZhciBmb250TWF0cml4ID0gY3VycmVudC5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgdmFyIGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7CisgICAgICB2YXIgaXNUZXh0SW52aXNpYmxlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuSU5WSVNJQkxFOworICAgICAgdmFyIGksIGdseXBoLCB3aWR0aCwgc3BhY2luZ0xlbmd0aDsKKworICAgICAgaWYgKGlzVGV4dEludmlzaWJsZSB8fCBmb250U2l6ZSA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsOworICAgICAgY3R4LnNhdmUoKTsKKyAgICAgIGN0eC50cmFuc2Zvcm0uYXBwbHkoY3R4LCBjdXJyZW50LnRleHRNYXRyaXgpOworICAgICAgY3R4LnRyYW5zbGF0ZShjdXJyZW50LngsIGN1cnJlbnQueSk7CisgICAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgZm9udERpcmVjdGlvbik7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkgeworICAgICAgICBnbHlwaCA9IGdseXBoc1tpXTsKKworICAgICAgICBpZiAoKDAsIF91dGlsLmlzTnVtKShnbHlwaCkpIHsKKyAgICAgICAgICBzcGFjaW5nTGVuZ3RoID0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwOworICAgICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZShzcGFjaW5nTGVuZ3RoLCAwKTsKKyAgICAgICAgICBjdXJyZW50LnggKz0gc3BhY2luZ0xlbmd0aCAqIHRleHRIU2NhbGU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nOworICAgICAgICB2YXIgb3BlcmF0b3JMaXN0ID0gZm9udC5jaGFyUHJvY09wZXJhdG9yTGlzdFtnbHlwaC5vcGVyYXRvckxpc3RJZF07CisKKyAgICAgICAgaWYgKCFvcGVyYXRvckxpc3QpIHsKKyAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFR5cGUzIGNoYXJhY3RlciAiJHtnbHlwaC5vcGVyYXRvckxpc3RJZH0iIGlzIG5vdCBhdmFpbGFibGUuYCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gZ2x5cGg7CisgICAgICAgICAgdGhpcy5zYXZlKCk7CisgICAgICAgICAgY3R4LnNjYWxlKGZvbnRTaXplLCBmb250U2l6ZSk7CisgICAgICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIGZvbnRNYXRyaXgpOworICAgICAgICAgIHRoaXMuZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QpOworICAgICAgICAgIHRoaXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRyYW5zZm9ybWVkID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbZ2x5cGgud2lkdGgsIDBdLCBmb250TWF0cml4KTsKKworICAgICAgICB3aWR0aCA9IHRyYW5zZm9ybWVkWzBdICogZm9udFNpemUgKyBzcGFjaW5nOworICAgICAgICBjdHgudHJhbnNsYXRlKHdpZHRoLCAwKTsKKyAgICAgICAgY3VycmVudC54ICs9IHdpZHRoICogdGV4dEhTY2FsZTsKKyAgICAgIH0KKworICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDsKKyAgICB9LAorICAgIHNldENoYXJXaWR0aDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0Q2hhcldpZHRoKHhXaWR0aCwgeVdpZHRoKSB7fSwKKyAgICBzZXRDaGFyV2lkdGhBbmRCb3VuZHM6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldENoYXJXaWR0aEFuZEJvdW5kcyh4V2lkdGgsIHlXaWR0aCwgbGx4LCBsbHksIHVyeCwgdXJ5KSB7CisgICAgICB0aGlzLmN0eC5yZWN0KGxseCwgbGx5LCB1cnggLSBsbHgsIHVyeSAtIGxseSk7CisgICAgICB0aGlzLmNsaXAoKTsKKyAgICAgIHRoaXMuZW5kUGF0aCgpOworICAgIH0sCisgICAgZ2V0Q29sb3JOX1BhdHRlcm46IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2dldENvbG9yTl9QYXR0ZXJuKElSKSB7CisgICAgICB2YXIgcGF0dGVybjsKKworICAgICAgaWYgKElSWzBdID09PSAiVGlsaW5nUGF0dGVybiIpIHsKKyAgICAgICAgdmFyIGNvbG9yID0gSVJbMV07CisgICAgICAgIHZhciBiYXNlVHJhbnNmb3JtID0gdGhpcy5iYXNlVHJhbnNmb3JtIHx8IHRoaXMuY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm0uc2xpY2UoKTsKKyAgICAgICAgdmFyIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IHsKKyAgICAgICAgICBjcmVhdGVDYW52YXNHcmFwaGljczogY3R4ID0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FudmFzR3JhcGhpY3MoY3R4LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLndlYkdMQ29udGV4dCk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBwYXR0ZXJuID0gbmV3IF9wYXR0ZXJuX2hlbHBlci5UaWxpbmdQYXR0ZXJuKElSLCBjb2xvciwgdGhpcy5jdHgsIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSwgYmFzZVRyYW5zZm9ybSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXR0ZXJuID0gKDAsIF9wYXR0ZXJuX2hlbHBlci5nZXRTaGFkaW5nUGF0dGVybkZyb21JUikoSVIpOworICAgICAgfQorCisgICAgICByZXR1cm4gcGF0dGVybjsKKyAgICB9LAorICAgIHNldFN0cm9rZUNvbG9yTjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0U3Ryb2tlQ29sb3JOKCkgeworICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gdGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpOworICAgIH0sCisgICAgc2V0RmlsbENvbG9yTjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3Nfc2V0RmlsbENvbG9yTigpIHsKKyAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7CisgICAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSB0cnVlOworICAgIH0sCisgICAgc2V0U3Ryb2tlUkdCQ29sb3I6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NldFN0cm9rZVJHQkNvbG9yKHIsIGcsIGIpIHsKKyAgICAgIHZhciBjb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyLCBnLCBiKTsKKworICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjsKKyAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IGNvbG9yOworICAgIH0sCisgICAgc2V0RmlsbFJHQkNvbG9yOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19zZXRGaWxsUkdCQ29sb3IociwgZywgYikgeworICAgICAgdmFyIGNvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKHIsIGcsIGIpOworCisgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvcjsKKyAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBjb2xvcjsKKyAgICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IGZhbHNlOworICAgIH0sCisgICAgc2hhZGluZ0ZpbGw6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3NoYWRpbmdGaWxsKHBhdHRlcm5JUikgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdGhpcy5zYXZlKCk7CisgICAgICB2YXIgcGF0dGVybiA9ICgwLCBfcGF0dGVybl9oZWxwZXIuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIpKHBhdHRlcm5JUik7CisgICAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybi5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgdHJ1ZSk7CisgICAgICB2YXIgaW52ID0gY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlOworCisgICAgICBpZiAoaW52KSB7CisgICAgICAgIHZhciBjYW52YXMgPSBjdHguY2FudmFzOworICAgICAgICB2YXIgd2lkdGggPSBjYW52YXMud2lkdGg7CisgICAgICAgIHZhciBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0OworCisgICAgICAgIHZhciBibCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBpbnYpOworCisgICAgICAgIHZhciBiciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIGhlaWdodF0sIGludik7CisKKyAgICAgICAgdmFyIHVsID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIDBdLCBpbnYpOworCisgICAgICAgIHZhciB1ciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCBoZWlnaHRdLCBpbnYpOworCisgICAgICAgIHZhciB4MCA9IE1hdGgubWluKGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTsKKyAgICAgICAgdmFyIHkwID0gTWF0aC5taW4oYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pOworICAgICAgICB2YXIgeDEgPSBNYXRoLm1heChibFswXSwgYnJbMF0sIHVsWzBdLCB1clswXSk7CisgICAgICAgIHZhciB5MSA9IE1hdGgubWF4KGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTsKKyAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoeDAsIHkwLCB4MSAtIHgwLCB5MSAtIHkwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KC0xZTEwLCAtMWUxMCwgMmUxMCwgMmUxMCk7CisgICAgICB9CisKKyAgICAgIHRoaXMucmVzdG9yZSgpOworICAgIH0sCisgICAgYmVnaW5JbmxpbmVJbWFnZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5JbmxpbmVJbWFnZSgpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlIik7CisgICAgfSwKKyAgICBiZWdpbkltYWdlRGF0YTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5JbWFnZURhdGEoKSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbWFnZURhdGEiKTsKKyAgICB9LAorICAgIHBhaW50Rm9ybVhPYmplY3RCZWdpbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5zYXZlKCk7CisgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wdXNoKHRoaXMuYmFzZVRyYW5zZm9ybSk7CisKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdHJpeCkgJiYgbWF0cml4Lmxlbmd0aCA9PT0gNikgeworICAgICAgICB0aGlzLnRyYW5zZm9ybS5hcHBseSh0aGlzLCBtYXRyaXgpOworICAgICAgfQorCisgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworCisgICAgICBpZiAoYmJveCkgeworICAgICAgICB2YXIgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTsKKyAgICAgICAgdmFyIGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdOworICAgICAgICB0aGlzLmN0eC5yZWN0KGJib3hbMF0sIGJib3hbMV0sIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB0aGlzLmNsaXAoKTsKKyAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICB9CisgICAgfSwKKyAgICBwYWludEZvcm1YT2JqZWN0RW5kOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEZvcm1YT2JqZWN0RW5kKCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wb3AoKTsKKyAgICB9LAorICAgIGJlZ2luR3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luR3JvdXAoZ3JvdXApIHsKKyAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuc2F2ZSgpOworICAgICAgdmFyIGN1cnJlbnRDdHggPSB0aGlzLmN0eDsKKworICAgICAgaWYgKCFncm91cC5pc29sYXRlZCkgeworICAgICAgICAoMCwgX3V0aWwuaW5mbykoIlRPRE86IFN1cHBvcnQgbm9uLWlzb2xhdGVkIGdyb3Vwcy4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdyb3VwLmtub2Nrb3V0KSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiS25vY2tvdXQgZ3JvdXBzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICB9CisKKyAgICAgIHZhciBjdXJyZW50VHJhbnNmb3JtID0gY3VycmVudEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworCisgICAgICBpZiAoZ3JvdXAubWF0cml4KSB7CisgICAgICAgIGN1cnJlbnRDdHgudHJhbnNmb3JtLmFwcGx5KGN1cnJlbnRDdHgsIGdyb3VwLm1hdHJpeCk7CisgICAgICB9CisKKyAgICAgIGlmICghZ3JvdXAuYmJveCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJvdW5kaW5nIGJveCBpcyByZXF1aXJlZC4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGJvdW5kcyA9IF91dGlsLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZ3JvdXAuYmJveCwgY3VycmVudEN0eC5tb3pDdXJyZW50VHJhbnNmb3JtKTsKKworICAgICAgdmFyIGNhbnZhc0JvdW5kcyA9IFswLCAwLCBjdXJyZW50Q3R4LmNhbnZhcy53aWR0aCwgY3VycmVudEN0eC5jYW52YXMuaGVpZ2h0XTsKKyAgICAgIGJvdW5kcyA9IF91dGlsLlV0aWwuaW50ZXJzZWN0KGJvdW5kcywgY2FudmFzQm91bmRzKSB8fCBbMCwgMCwgMCwgMF07CisgICAgICB2YXIgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTsKKyAgICAgIHZhciBvZmZzZXRZID0gTWF0aC5mbG9vcihib3VuZHNbMV0pOworICAgICAgdmFyIGRyYXduV2lkdGggPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFgsIDEpOworICAgICAgdmFyIGRyYXduSGVpZ2h0ID0gTWF0aC5tYXgoTWF0aC5jZWlsKGJvdW5kc1szXSkgLSBvZmZzZXRZLCAxKTsKKyAgICAgIHZhciBzY2FsZVggPSAxLAorICAgICAgICAgIHNjYWxlWSA9IDE7CisKKyAgICAgIGlmIChkcmF3bldpZHRoID4gTUFYX0dST1VQX1NJWkUpIHsKKyAgICAgICAgc2NhbGVYID0gZHJhd25XaWR0aCAvIE1BWF9HUk9VUF9TSVpFOworICAgICAgICBkcmF3bldpZHRoID0gTUFYX0dST1VQX1NJWkU7CisgICAgICB9CisKKyAgICAgIGlmIChkcmF3bkhlaWdodCA+IE1BWF9HUk9VUF9TSVpFKSB7CisgICAgICAgIHNjYWxlWSA9IGRyYXduSGVpZ2h0IC8gTUFYX0dST1VQX1NJWkU7CisgICAgICAgIGRyYXduSGVpZ2h0ID0gTUFYX0dST1VQX1NJWkU7CisgICAgICB9CisKKyAgICAgIHZhciBjYWNoZUlkID0gImdyb3VwQXQiICsgdGhpcy5ncm91cExldmVsOworCisgICAgICBpZiAoZ3JvdXAuc21hc2spIHsKKyAgICAgICAgY2FjaGVJZCArPSAiX3NtYXNrXyIgKyB0aGlzLnNtYXNrQ291bnRlcisrICUgMjsKKyAgICAgIH0KKworICAgICAgdmFyIHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhjYWNoZUlkLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCwgdHJ1ZSk7CisgICAgICB2YXIgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7CisgICAgICBncm91cEN0eC5zY2FsZSgxIC8gc2NhbGVYLCAxIC8gc2NhbGVZKTsKKyAgICAgIGdyb3VwQ3R4LnRyYW5zbGF0ZSgtb2Zmc2V0WCwgLW9mZnNldFkpOworICAgICAgZ3JvdXBDdHgudHJhbnNmb3JtLmFwcGx5KGdyb3VwQ3R4LCBjdXJyZW50VHJhbnNmb3JtKTsKKworICAgICAgaWYgKGdyb3VwLnNtYXNrKSB7CisgICAgICAgIHRoaXMuc21hc2tTdGFjay5wdXNoKHsKKyAgICAgICAgICBjYW52YXM6IHNjcmF0Y2hDYW52YXMuY2FudmFzLAorICAgICAgICAgIGNvbnRleHQ6IGdyb3VwQ3R4LAorICAgICAgICAgIG9mZnNldFgsCisgICAgICAgICAgb2Zmc2V0WSwKKyAgICAgICAgICBzY2FsZVgsCisgICAgICAgICAgc2NhbGVZLAorICAgICAgICAgIHN1YnR5cGU6IGdyb3VwLnNtYXNrLnN1YnR5cGUsCisgICAgICAgICAgYmFja2Ryb3A6IGdyb3VwLnNtYXNrLmJhY2tkcm9wLAorICAgICAgICAgIHRyYW5zZmVyTWFwOiBncm91cC5zbWFzay50cmFuc2Zlck1hcCB8fCBudWxsLAorICAgICAgICAgIHN0YXJ0VHJhbnNmb3JtSW52ZXJzZTogbnVsbAorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnRDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApOworICAgICAgICBjdXJyZW50Q3R4LnRyYW5zbGF0ZShvZmZzZXRYLCBvZmZzZXRZKTsKKyAgICAgICAgY3VycmVudEN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7CisgICAgICB9CisKKyAgICAgIGNvcHlDdHhTdGF0ZShjdXJyZW50Q3R4LCBncm91cEN0eCk7CisgICAgICB0aGlzLmN0eCA9IGdyb3VwQ3R4OworICAgICAgdGhpcy5zZXRHU3RhdGUoW1siQk0iLCAic291cmNlLW92ZXIiXSwgWyJjYSIsIDFdLCBbIkNBIiwgMV1dKTsKKyAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGN1cnJlbnRDdHgpOworICAgICAgdGhpcy5ncm91cExldmVsKys7CisgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSBudWxsOworICAgIH0sCisgICAgZW5kR3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEdyb3VwKGdyb3VwKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLmdyb3VwTGV2ZWwtLTsKKyAgICAgIHZhciBncm91cEN0eCA9IHRoaXMuY3R4OworICAgICAgdGhpcy5jdHggPSB0aGlzLmdyb3VwU3RhY2sucG9wKCk7CisKKyAgICAgIGlmICh0aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCkgeworICAgICAgICB0aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuY3R4Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoZ3JvdXAuc21hc2spIHsKKyAgICAgICAgdGhpcy50ZW1wU01hc2sgPSB0aGlzLnNtYXNrU3RhY2sucG9wKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UoZ3JvdXBDdHguY2FudmFzLCAwLCAwKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgfSwKKyAgICBiZWdpbkFubm90YXRpb25zOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19iZWdpbkFubm90YXRpb25zKCkgeworICAgICAgdGhpcy5zYXZlKCk7CisKKyAgICAgIGlmICh0aGlzLmJhc2VUcmFuc2Zvcm0pIHsKKyAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtLmFwcGx5KHRoaXMuY3R4LCB0aGlzLmJhc2VUcmFuc2Zvcm0pOworICAgICAgfQorICAgIH0sCisgICAgZW5kQW5ub3RhdGlvbnM6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZEFubm90YXRpb25zKCkgeworICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgfSwKKyAgICBiZWdpbkFubm90YXRpb246IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luQW5ub3RhdGlvbihyZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCkgeworICAgICAgdGhpcy5zYXZlKCk7CisgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7CisgICAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSgpOworCisgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWN0KSAmJiByZWN0Lmxlbmd0aCA9PT0gNCkgeworICAgICAgICB2YXIgd2lkdGggPSByZWN0WzJdIC0gcmVjdFswXTsKKyAgICAgICAgdmFyIGhlaWdodCA9IHJlY3RbM10gLSByZWN0WzFdOworICAgICAgICB0aGlzLmN0eC5yZWN0KHJlY3RbMF0sIHJlY3RbMV0sIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB0aGlzLmNsaXAoKTsKKyAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMudHJhbnNmb3JtLmFwcGx5KHRoaXMsIHRyYW5zZm9ybSk7CisgICAgICB0aGlzLnRyYW5zZm9ybS5hcHBseSh0aGlzLCBtYXRyaXgpOworICAgIH0sCisgICAgZW5kQW5ub3RhdGlvbjogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfZW5kQW5ub3RhdGlvbigpIHsKKyAgICAgIHRoaXMucmVzdG9yZSgpOworICAgIH0sCisgICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlTWFza1hPYmplY3QoaW1nKSB7CisgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB2YXIgd2lkdGggPSBpbWcud2lkdGgsCisgICAgICAgICAgaGVpZ2h0ID0gaW1nLmhlaWdodDsKKyAgICAgIHZhciBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yOworICAgICAgdmFyIGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7CisgICAgICB2YXIgZ2x5cGggPSB0aGlzLnByb2Nlc3NpbmdUeXBlMzsKKworICAgICAgaWYgKENPTVBJTEVfVFlQRTNfR0xZUEhTICYmIGdseXBoICYmIGdseXBoLmNvbXBpbGVkID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgaWYgKHdpZHRoIDw9IE1BWF9TSVpFX1RPX0NPTVBJTEUgJiYgaGVpZ2h0IDw9IE1BWF9TSVpFX1RPX0NPTVBJTEUpIHsKKyAgICAgICAgICBnbHlwaC5jb21waWxlZCA9IGNvbXBpbGVUeXBlM0dseXBoKHsKKyAgICAgICAgICAgIGRhdGE6IGltZy5kYXRhLAorICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnbHlwaC5jb21waWxlZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGdseXBoICYmIGdseXBoLmNvbXBpbGVkKSB7CisgICAgICAgIGdseXBoLmNvbXBpbGVkKGN0eCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygibWFza0NhbnZhcyIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgdmFyIG1hc2tDdHggPSBtYXNrQ2FudmFzLmNvbnRleHQ7CisgICAgICBtYXNrQ3R4LnNhdmUoKTsKKyAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ3R4LCBpbWcpOworICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAic291cmNlLWluIjsKKyAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMpIDogZmlsbENvbG9yOworICAgICAgbWFza0N0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIG1hc2tDdHgucmVzdG9yZSgpOworICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChtYXNrQ2FudmFzLmNhbnZhcyk7CisgICAgfSwKKworICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdChpbWdEYXRhLCBzY2FsZVgsIHNrZXdYID0gMCwgc2tld1kgPSAwLCBzY2FsZVksIHBvc2l0aW9ucykgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aDsKKyAgICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgICAgIHZhciBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yOworICAgICAgdmFyIGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7CisgICAgICB2YXIgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtYXNrQ2FudmFzIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICB2YXIgbWFza0N0eCA9IG1hc2tDYW52YXMuY29udGV4dDsKKyAgICAgIG1hc2tDdHguc2F2ZSgpOworICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDdHgsIGltZ0RhdGEpOworICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAic291cmNlLWluIjsKKyAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMpIDogZmlsbENvbG9yOworICAgICAgbWFza0N0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIG1hc2tDdHgucmVzdG9yZSgpOworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgeworICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICBjdHgudHJhbnNmb3JtKHNjYWxlWCwgc2tld1gsIHNrZXdZLCBzY2FsZVksIHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXSk7CisgICAgICAgIGN0eC5zY2FsZSgxLCAtMSk7CisgICAgICAgIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcy5jYW52YXMsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxLCAxKTsKKyAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwKGltYWdlcykgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGN0eCA9IHRoaXMuY3R4OworICAgICAgdmFyIGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7CisgICAgICB2YXIgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW1hZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGltYWdlID0gaW1hZ2VzW2ldOworICAgICAgICB2YXIgd2lkdGggPSBpbWFnZS53aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCA9IGltYWdlLmhlaWdodDsKKyAgICAgICAgdmFyIG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygibWFza0NhbnZhcyIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB2YXIgbWFza0N0eCA9IG1hc2tDYW52YXMuY29udGV4dDsKKyAgICAgICAgbWFza0N0eC5zYXZlKCk7CisgICAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ3R4LCBpbWFnZSk7CisgICAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNvdXJjZS1pbiI7CisgICAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMpIDogZmlsbENvbG9yOworICAgICAgICBtYXNrQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBtYXNrQ3R4LnJlc3RvcmUoKTsKKyAgICAgICAgY3R4LnNhdmUoKTsKKyAgICAgICAgY3R4LnRyYW5zZm9ybS5hcHBseShjdHgsIGltYWdlLnRyYW5zZm9ybSk7CisgICAgICAgIGN0eC5zY2FsZSgxLCAtMSk7CisgICAgICAgIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcy5jYW52YXMsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxLCAxKTsKKyAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIH0KKyAgICB9LAorICAgIHBhaW50SW1hZ2VYT2JqZWN0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlWE9iamVjdChvYmpJZCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgaW1nRGF0YSA9IG9iaklkLnN0YXJ0c1dpdGgoImdfIikgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KG9iaklkKSA6IHRoaXMub2Jqcy5nZXQob2JqSWQpOworCisgICAgICBpZiAoIWltZ0RhdGEpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKTsKKyAgICB9LAorICAgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19wYWludEltYWdlWE9iamVjdFJlcGVhdChvYmpJZCwgc2NhbGVYLCBzY2FsZVksIHBvc2l0aW9ucykgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgaW1nRGF0YSA9IG9iaklkLnN0YXJ0c1dpdGgoImdfIikgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KG9iaklkKSA6IHRoaXMub2Jqcy5nZXQob2JqSWQpOworCisgICAgICBpZiAoIWltZ0RhdGEpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHdpZHRoID0gaW1nRGF0YS53aWR0aDsKKyAgICAgIHZhciBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgICAgIHZhciBtYXAgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgICAgbWFwLnB1c2goeworICAgICAgICAgIHRyYW5zZm9ybTogW3NjYWxlWCwgMCwgMCwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV1dLAorICAgICAgICAgIHg6IDAsCisgICAgICAgICAgeTogMCwKKyAgICAgICAgICB3OiB3aWR0aCwKKyAgICAgICAgICBoOiBoZWlnaHQKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cChpbWdEYXRhLCBtYXApOworICAgIH0sCisgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX3BhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpIHsKKyAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgICB2YXIgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7CisgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CisgICAgICB0aGlzLnNhdmUoKTsKKyAgICAgIGN0eC5zY2FsZSgxIC8gd2lkdGgsIC0xIC8gaGVpZ2h0KTsKKyAgICAgIHZhciBjdXJyZW50VHJhbnNmb3JtID0gY3R4Lm1vekN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlOworICAgICAgdmFyIGEgPSBjdXJyZW50VHJhbnNmb3JtWzBdLAorICAgICAgICAgIGIgPSBjdXJyZW50VHJhbnNmb3JtWzFdOworICAgICAgdmFyIHdpZHRoU2NhbGUgPSBNYXRoLm1heChNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksIDEpOworICAgICAgdmFyIGMgPSBjdXJyZW50VHJhbnNmb3JtWzJdLAorICAgICAgICAgIGQgPSBjdXJyZW50VHJhbnNmb3JtWzNdOworICAgICAgdmFyIGhlaWdodFNjYWxlID0gTWF0aC5tYXgoTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpLCAxKTsKKyAgICAgIHZhciBpbWdUb1BhaW50LCB0bXBDYW52YXM7CisKKyAgICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgPT09ICJmdW5jdGlvbiIgJiYgaW1nRGF0YSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8ICFpbWdEYXRhLmRhdGEpIHsKKyAgICAgICAgaW1nVG9QYWludCA9IGltZ0RhdGE7CisgICAgICB9IGVsc2UgeworICAgICAgICB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygiaW5saW5lSW1hZ2UiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0OworICAgICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhLCB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzKTsKKyAgICAgICAgaW1nVG9QYWludCA9IHRtcENhbnZhcy5jYW52YXM7CisgICAgICB9CisKKyAgICAgIHZhciBwYWludFdpZHRoID0gd2lkdGgsCisgICAgICAgICAgcGFpbnRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICB2YXIgdG1wQ2FudmFzSWQgPSAicHJlc2NhbGUxIjsKKworICAgICAgd2hpbGUgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxIHx8IGhlaWdodFNjYWxlID4gMiAmJiBwYWludEhlaWdodCA+IDEpIHsKKyAgICAgICAgdmFyIG5ld1dpZHRoID0gcGFpbnRXaWR0aCwKKyAgICAgICAgICAgIG5ld0hlaWdodCA9IHBhaW50SGVpZ2h0OworCisgICAgICAgIGlmICh3aWR0aFNjYWxlID4gMiAmJiBwYWludFdpZHRoID4gMSkgeworICAgICAgICAgIG5ld1dpZHRoID0gTWF0aC5jZWlsKHBhaW50V2lkdGggLyAyKTsKKyAgICAgICAgICB3aWR0aFNjYWxlIC89IHBhaW50V2lkdGggLyBuZXdXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKSB7CisgICAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5jZWlsKHBhaW50SGVpZ2h0IC8gMik7CisgICAgICAgICAgaGVpZ2h0U2NhbGUgLz0gcGFpbnRIZWlnaHQgLyBuZXdIZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyh0bXBDYW52YXNJZCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7CisgICAgICAgIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0OworICAgICAgICB0bXBDdHguY2xlYXJSZWN0KDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpOworICAgICAgICB0bXBDdHguZHJhd0ltYWdlKGltZ1RvUGFpbnQsIDAsIDAsIHBhaW50V2lkdGgsIHBhaW50SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKKyAgICAgICAgaW1nVG9QYWludCA9IHRtcENhbnZhcy5jYW52YXM7CisgICAgICAgIHBhaW50V2lkdGggPSBuZXdXaWR0aDsKKyAgICAgICAgcGFpbnRIZWlnaHQgPSBuZXdIZWlnaHQ7CisgICAgICAgIHRtcENhbnZhc0lkID0gdG1wQ2FudmFzSWQgPT09ICJwcmVzY2FsZTEiID8gInByZXNjYWxlMiIgOiAicHJlc2NhbGUxIjsKKyAgICAgIH0KKworICAgICAgY3R4LmRyYXdJbWFnZShpbWdUb1BhaW50LCAwLCAwLCBwYWludFdpZHRoLCBwYWludEhlaWdodCwgMCwgLWhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgIGlmICh0aGlzLmltYWdlTGF5ZXIpIHsKKyAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRDYW52YXNQb3NpdGlvbigwLCAtaGVpZ2h0KTsKKyAgICAgICAgdGhpcy5pbWFnZUxheWVyLmFwcGVuZEltYWdlKHsKKyAgICAgICAgICBpbWdEYXRhLAorICAgICAgICAgIGxlZnQ6IHBvc2l0aW9uWzBdLAorICAgICAgICAgIHRvcDogcG9zaXRpb25bMV0sCisgICAgICAgICAgd2lkdGg6IHdpZHRoIC8gY3VycmVudFRyYW5zZm9ybVswXSwKKyAgICAgICAgICBoZWlnaHQ6IGhlaWdodCAvIGN1cnJlbnRUcmFuc2Zvcm1bM10KKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHRoaXMucmVzdG9yZSgpOworICAgIH0sCisgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cChpbWdEYXRhLCBtYXApIHsKKyAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgIHZhciB3ID0gaW1nRGF0YS53aWR0aDsKKyAgICAgIHZhciBoID0gaW1nRGF0YS5oZWlnaHQ7CisgICAgICB2YXIgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoImlubGluZUltYWdlIiwgdywgaCk7CisgICAgICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7CisgICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhLCB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbWFwLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgdmFyIGVudHJ5ID0gbWFwW2ldOworICAgICAgICBjdHguc2F2ZSgpOworICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgZW50cnkudHJhbnNmb3JtKTsKKyAgICAgICAgY3R4LnNjYWxlKDEsIC0xKTsKKyAgICAgICAgY3R4LmRyYXdJbWFnZSh0bXBDYW52YXMuY2FudmFzLCBlbnRyeS54LCBlbnRyeS55LCBlbnRyeS53LCBlbnRyeS5oLCAwLCAtMSwgMSwgMSk7CisKKyAgICAgICAgaWYgKHRoaXMuaW1hZ2VMYXllcikgeworICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuZ2V0Q2FudmFzUG9zaXRpb24oZW50cnkueCwgZW50cnkueSk7CisgICAgICAgICAgdGhpcy5pbWFnZUxheWVyLmFwcGVuZEltYWdlKHsKKyAgICAgICAgICAgIGltZ0RhdGEsCisgICAgICAgICAgICBsZWZ0OiBwb3NpdGlvblswXSwKKyAgICAgICAgICAgIHRvcDogcG9zaXRpb25bMV0sCisgICAgICAgICAgICB3aWR0aDogdywKKyAgICAgICAgICAgIGhlaWdodDogaAorICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIH0KKyAgICB9LAorICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzazogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCkgeworICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7CisgICAgfSwKKyAgICBtYXJrUG9pbnQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX21hcmtQb2ludCh0YWcpIHt9LAorICAgIG1hcmtQb2ludFByb3BzOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19tYXJrUG9pbnRQcm9wcyh0YWcsIHByb3BlcnRpZXMpIHt9LAorICAgIGJlZ2luTWFya2VkQ29udGVudDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5NYXJrZWRDb250ZW50KHRhZykgeworICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7CisgICAgICAgIHZpc2libGU6IHRydWUKKyAgICAgIH0pOworICAgIH0sCisgICAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2JlZ2luTWFya2VkQ29udGVudFByb3BzKHRhZywgcHJvcGVydGllcykgeworICAgICAgaWYgKHRhZyA9PT0gIk9DIikgeworICAgICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHsKKyAgICAgICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZy5pc1Zpc2libGUocHJvcGVydGllcykKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHsKKyAgICAgICAgICB2aXNpYmxlOiB0cnVlCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdGhpcy5pc0NvbnRlbnRWaXNpYmxlKCk7CisgICAgfSwKKyAgICBlbmRNYXJrZWRDb250ZW50OiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19lbmRNYXJrZWRDb250ZW50KCkgeworICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucG9wKCk7CisgICAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdGhpcy5pc0NvbnRlbnRWaXNpYmxlKCk7CisgICAgfSwKKyAgICBiZWdpbkNvbXBhdDogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfYmVnaW5Db21wYXQoKSB7fSwKKyAgICBlbmRDb21wYXQ6IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2VuZENvbXBhdCgpIHt9LAorICAgIGNvbnN1bWVQYXRoOiBmdW5jdGlvbiBDYW52YXNHcmFwaGljc19jb25zdW1lUGF0aCgpIHsKKyAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKworICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHsKKyAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXAgPT09IEVPX0NMSVApIHsKKyAgICAgICAgICBjdHguY2xpcCgiZXZlbm9kZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGN0eC5jbGlwKCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgY3R4LmJlZ2luUGF0aCgpOworICAgIH0sCisKKyAgICBnZXRTaW5nbGVQaXhlbFdpZHRoKHNjYWxlKSB7CisgICAgICBpZiAodGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9PT0gbnVsbCkgeworICAgICAgICBjb25zdCBpbnZlcnNlID0gdGhpcy5jdHgubW96Q3VycmVudFRyYW5zZm9ybUludmVyc2U7CisgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBNYXRoLnNxcnQoTWF0aC5tYXgoaW52ZXJzZVswXSAqIGludmVyc2VbMF0gKyBpbnZlcnNlWzFdICogaW52ZXJzZVsxXSwgaW52ZXJzZVsyXSAqIGludmVyc2VbMl0gKyBpbnZlcnNlWzNdICogaW52ZXJzZVszXSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aDsKKyAgICB9LAorCisgICAgZ2V0Q2FudmFzUG9zaXRpb246IGZ1bmN0aW9uIENhbnZhc0dyYXBoaWNzX2dldENhbnZhc1Bvc2l0aW9uKHgsIHkpIHsKKyAgICAgIHZhciB0cmFuc2Zvcm0gPSB0aGlzLmN0eC5tb3pDdXJyZW50VHJhbnNmb3JtOworICAgICAgcmV0dXJuIFt0cmFuc2Zvcm1bMF0gKiB4ICsgdHJhbnNmb3JtWzJdICogeSArIHRyYW5zZm9ybVs0XSwgdHJhbnNmb3JtWzFdICogeCArIHRyYW5zZm9ybVszXSAqIHkgKyB0cmFuc2Zvcm1bNV1dOworICAgIH0sCisgICAgaXNDb250ZW50VmlzaWJsZTogZnVuY3Rpb24gQ2FudmFzR3JhcGhpY3NfaXNDb250ZW50VmlzaWJsZSgpIHsKKyAgICAgIGZvciAobGV0IGkgPSB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAoIXRoaXMubWFya2VkQ29udGVudFN0YWNrW2ldLnZpc2libGUpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9OworCisgIGZvciAodmFyIG9wIGluIF91dGlsLk9QUykgeworICAgIENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtfdXRpbC5PUFNbb3BdXSA9IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtvcF07CisgIH0KKworICByZXR1cm4gQ2FudmFzR3JhcGhpY3M7Cit9KCk7CisKK2V4cG9ydHMuQ2FudmFzR3JhcGhpY3MgPSBDYW52YXNHcmFwaGljczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS9jb250ZW50X2Rpc3Bvc2l0aW9uLmpzIGIvbGliL2Rpc3BsYXkvY29udGVudF9kaXNwb3NpdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JjZTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvY29udGVudF9kaXNwb3NpdGlvbi5qcwpAQCAtMCwwICsxLDIwMyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyID0gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyOworCitmdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIoY29udGVudERpc3Bvc2l0aW9uKSB7CisgIGxldCBuZWVkc0VuY29kaW5nRml4dXAgPSB0cnVlOworICBsZXQgdG1wID0gdG9QYXJhbVJlZ0V4cCgiZmlsZW5hbWVcXCoiLCAiaSIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTsKKworICBpZiAodG1wKSB7CisgICAgdG1wID0gdG1wWzFdOworICAgIGxldCBmaWxlbmFtZSA9IHJmYzI2MTZ1bnF1b3RlKHRtcCk7CisgICAgZmlsZW5hbWUgPSB1bmVzY2FwZShmaWxlbmFtZSk7CisgICAgZmlsZW5hbWUgPSByZmM1OTg3ZGVjb2RlKGZpbGVuYW1lKTsKKyAgICBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUoZmlsZW5hbWUpOworICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTsKKyAgfQorCisgIHRtcCA9IHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb24pOworCisgIGlmICh0bXApIHsKKyAgICBjb25zdCBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUodG1wKTsKKyAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7CisgIH0KKworICB0bXAgPSB0b1BhcmFtUmVnRXhwKCJmaWxlbmFtZSIsICJpIikuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pOworCisgIGlmICh0bXApIHsKKyAgICB0bXAgPSB0bXBbMV07CisgICAgbGV0IGZpbGVuYW1lID0gcmZjMjYxNnVucXVvdGUodG1wKTsKKyAgICBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUoZmlsZW5hbWUpOworICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIHRvUGFyYW1SZWdFeHAoYXR0cmlidXRlUGF0dGVybiwgZmxhZ3MpIHsKKyAgICByZXR1cm4gbmV3IFJlZ0V4cCgiKD86Xnw7KVxccyoiICsgYXR0cmlidXRlUGF0dGVybiArICJcXHMqPVxccyoiICsgIigiICsgJ1teIjtcXHNdW147XFxzXSonICsgInwiICsgJyIoPzpbXiJcXFxcXXxcXFxcIj8pKyI/JyArICIpIiwgZmxhZ3MpOworICB9CisKKyAgZnVuY3Rpb24gdGV4dGRlY29kZShlbmNvZGluZywgdmFsdWUpIHsKKyAgICBpZiAoZW5jb2RpbmcpIHsKKyAgICAgIGlmICghL15bXHgwMC1ceEZGXSskLy50ZXN0KHZhbHVlKSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcsIHsKKyAgICAgICAgICBmYXRhbDogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgICAgY29uc3QgYnl0ZXMgPSBBcnJheS5mcm9tKHZhbHVlLCBmdW5jdGlvbiAoY2gpIHsKKyAgICAgICAgICByZXR1cm4gY2guY2hhckNvZGVBdCgwKSAmIDB4ZmY7CisgICAgICAgIH0pOworICAgICAgICB2YWx1ZSA9IGRlY29kZXIuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7CisgICAgICAgIG5lZWRzRW5jb2RpbmdGaXh1cCA9IGZhbHNlOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBpZiAoL151dGYtPzgkL2kudGVzdChlbmNvZGluZykpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHZhbHVlKSk7CisgICAgICAgICAgICBuZWVkc0VuY29kaW5nRml4dXAgPSBmYWxzZTsKKyAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBmdW5jdGlvbiBmaXh1cEVuY29kaW5nKHZhbHVlKSB7CisgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCAmJiAvW1x4ODAtXHhmZl0vLnRlc3QodmFsdWUpKSB7CisgICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoInV0Zi04IiwgdmFsdWUpOworCisgICAgICBpZiAobmVlZHNFbmNvZGluZ0ZpeHVwKSB7CisgICAgICAgIHZhbHVlID0gdGV4dGRlY29kZSgiaXNvLTg4NTktMSIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBmdW5jdGlvbiByZmMyMjMxZ2V0cGFyYW0oY29udGVudERpc3Bvc2l0aW9uU3RyKSB7CisgICAgY29uc3QgbWF0Y2hlcyA9IFtdOworICAgIGxldCBtYXRjaDsKKyAgICBjb25zdCBpdGVyID0gdG9QYXJhbVJlZ0V4cCgiZmlsZW5hbWVcXCooKD8hMFxcZClcXGQrKShcXCo/KSIsICJpZyIpOworCisgICAgd2hpbGUgKChtYXRjaCA9IGl0ZXIuZXhlYyhjb250ZW50RGlzcG9zaXRpb25TdHIpKSAhPT0gbnVsbCkgeworICAgICAgbGV0IFssIG4sIHF1b3QsIHBhcnRdID0gbWF0Y2g7CisgICAgICBuID0gcGFyc2VJbnQobiwgMTApOworCisgICAgICBpZiAobiBpbiBtYXRjaGVzKSB7CisgICAgICAgIGlmIChuID09PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgbWF0Y2hlc1tuXSA9IFtxdW90LCBwYXJ0XTsKKyAgICB9CisKKyAgICBjb25zdCBwYXJ0cyA9IFtdOworCisgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBtYXRjaGVzLmxlbmd0aDsgKytuKSB7CisgICAgICBpZiAoIShuIGluIG1hdGNoZXMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBsZXQgW3F1b3QsIHBhcnRdID0gbWF0Y2hlc1tuXTsKKyAgICAgIHBhcnQgPSByZmMyNjE2dW5xdW90ZShwYXJ0KTsKKworICAgICAgaWYgKHF1b3QpIHsKKyAgICAgICAgcGFydCA9IHVuZXNjYXBlKHBhcnQpOworCisgICAgICAgIGlmIChuID09PSAwKSB7CisgICAgICAgICAgcGFydCA9IHJmYzU5ODdkZWNvZGUocGFydCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcGFydHMucHVzaChwYXJ0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcGFydHMuam9pbigiIik7CisgIH0KKworICBmdW5jdGlvbiByZmMyNjE2dW5xdW90ZSh2YWx1ZSkgeworICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCciJykpIHsKKyAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc2xpY2UoMSkuc3BsaXQoJ1xcIicpOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgIGNvbnN0IHF1b3RpbmRleCA9IHBhcnRzW2ldLmluZGV4T2YoJyInKTsKKworICAgICAgICBpZiAocXVvdGluZGV4ICE9PSAtMSkgeworICAgICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0uc2xpY2UoMCwgcXVvdGluZGV4KTsKKyAgICAgICAgICBwYXJ0cy5sZW5ndGggPSBpICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0ucmVwbGFjZSgvXFwoLikvZywgIiQxIik7CisgICAgICB9CisKKyAgICAgIHZhbHVlID0gcGFydHMuam9pbignIicpOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIHJmYzU5ODdkZWNvZGUoZXh0dmFsdWUpIHsKKyAgICBjb25zdCBlbmNvZGluZ2VuZCA9IGV4dHZhbHVlLmluZGV4T2YoIiciKTsKKworICAgIGlmIChlbmNvZGluZ2VuZCA9PT0gLTEpIHsKKyAgICAgIHJldHVybiBleHR2YWx1ZTsKKyAgICB9CisKKyAgICBjb25zdCBlbmNvZGluZyA9IGV4dHZhbHVlLnNsaWNlKDAsIGVuY29kaW5nZW5kKTsKKyAgICBjb25zdCBsYW5ndmFsdWUgPSBleHR2YWx1ZS5zbGljZShlbmNvZGluZ2VuZCArIDEpOworICAgIGNvbnN0IHZhbHVlID0gbGFuZ3ZhbHVlLnJlcGxhY2UoL15bXiddKicvLCAiIik7CisgICAgcmV0dXJuIHRleHRkZWNvZGUoZW5jb2RpbmcsIHZhbHVlKTsKKyAgfQorCisgIGZ1bmN0aW9uIHJmYzIwNDdkZWNvZGUodmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoIj0/IikgfHwgL1tceDAwLVx4MTlceDgwLVx4ZmZdLy50ZXN0KHZhbHVlKSkgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC89XD8oW1x3LV0qKVw/KFtRcUJiXSlcPygoPzpbXj9dfFw/KD8hPSkpKilcPz0vZywgZnVuY3Rpb24gKG1hdGNoZXMsIGNoYXJzZXQsIGVuY29kaW5nLCB0ZXh0KSB7CisgICAgICBpZiAoZW5jb2RpbmcgPT09ICJxIiB8fCBlbmNvZGluZyA9PT0gIlEiKSB7CisgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL18vZywgIiAiKTsKKyAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPShbMC05YS1mQS1GXXsyfSkvZywgZnVuY3Rpb24gKG1hdGNoLCBoZXgpIHsKKyAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgdGV4dCA9IGF0b2IodGV4dCk7CisgICAgICB9IGNhdGNoIChlKSB7fQorCisgICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTsKKyAgICB9KTsKKyAgfQorCisgIHJldHVybiAiIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzIGIvbGliL2Rpc3BsYXkvZGlzcGxheV91dGlscy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE3NGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvZGlzcGxheV91dGlscy5qcwpAQCAtMCwwICsxLDU1MiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuYWRkTGlua0F0dHJpYnV0ZXMgPSBhZGRMaW5rQXR0cmlidXRlczsKK2V4cG9ydHMuZ2V0RmlsZW5hbWVGcm9tVXJsID0gZ2V0RmlsZW5hbWVGcm9tVXJsOworZXhwb3J0cy5pc0ZldGNoU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZDsKK2V4cG9ydHMuaXNWYWxpZEZldGNoVXJsID0gaXNWYWxpZEZldGNoVXJsOworZXhwb3J0cy5sb2FkU2NyaXB0ID0gbG9hZFNjcmlwdDsKK2V4cG9ydHMuZGVwcmVjYXRlZCA9IGRlcHJlY2F0ZWQ7CitleHBvcnRzLlBERkRhdGVTdHJpbmcgPSBleHBvcnRzLlN0YXRUaW1lciA9IGV4cG9ydHMuRE9NU1ZHRmFjdG9yeSA9IGV4cG9ydHMuRE9NQ01hcFJlYWRlckZhY3RvcnkgPSBleHBvcnRzLkJhc2VDTWFwUmVhZGVyRmFjdG9yeSA9IGV4cG9ydHMuRE9NQ2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuQmFzZUNhbnZhc0ZhY3RvcnkgPSBleHBvcnRzLkRFRkFVTFRfTElOS19SRUwgPSBleHBvcnRzLkxpbmtUYXJnZXQgPSBleHBvcnRzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiA9IGV4cG9ydHMuUGFnZVZpZXdwb3J0ID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCitjb25zdCBERUZBVUxUX0xJTktfUkVMID0gIm5vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3ciOworZXhwb3J0cy5ERUZBVUxUX0xJTktfUkVMID0gREVGQVVMVF9MSU5LX1JFTDsKK2NvbnN0IFNWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CisKK2NsYXNzIEJhc2VDYW52YXNGYWN0b3J5IHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDYW52YXNGYWN0b3J5KSB7CisgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ2FudmFzRmFjdG9yeS4iKTsKKyAgICB9CisgIH0KKworICBjcmVhdGUod2lkdGgsIGhlaWdodCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlYCBjYWxsZWQuIik7CisgIH0KKworICByZXNldChjYW52YXNBbmRDb250ZXh0LCB3aWR0aCwgaGVpZ2h0KSB7CisgICAgaWYgKCFjYW52YXNBbmRDb250ZXh0LmNhbnZhcykgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW52YXMgaXMgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FudmFzIHNpemUiKTsKKyAgICB9CisKKyAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoOworICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IGhlaWdodDsKKyAgfQorCisgIGRlc3Ryb3koY2FudmFzQW5kQ29udGV4dCkgeworICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy53aWR0aCA9IDA7CisgICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gMDsKKyAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcyA9IG51bGw7CisgICAgY2FudmFzQW5kQ29udGV4dC5jb250ZXh0ID0gbnVsbDsKKyAgfQorCit9CisKK2V4cG9ydHMuQmFzZUNhbnZhc0ZhY3RvcnkgPSBCYXNlQ2FudmFzRmFjdG9yeTsKKworY2xhc3MgRE9NQ2FudmFzRmFjdG9yeSBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHsKKyAgY29uc3RydWN0b3IoeworICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50CisgIH0gPSB7fSkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50OworICB9CisKKyAgY3JlYXRlKHdpZHRoLCBoZWlnaHQpIHsKKyAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIik7CisgICAgfQorCisgICAgY29uc3QgY2FudmFzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CisKKyAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CisgICAgY2FudmFzLndpZHRoID0gd2lkdGg7CisgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4geworICAgICAgY2FudmFzLAorICAgICAgY29udGV4dAorICAgIH07CisgIH0KKworfQorCitleHBvcnRzLkRPTUNhbnZhc0ZhY3RvcnkgPSBET01DYW52YXNGYWN0b3J5OworCitjbGFzcyBCYXNlQ01hcFJlYWRlckZhY3RvcnkgeworICBjb25zdHJ1Y3Rvcih7CisgICAgYmFzZVVybCA9IG51bGwsCisgICAgaXNDb21wcmVzc2VkID0gZmFsc2UKKyAgfSkgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ01hcFJlYWRlckZhY3RvcnkpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS4iKTsKKyAgICB9CisKKyAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsOworICAgIHRoaXMuaXNDb21wcmVzc2VkID0gaXNDb21wcmVzc2VkOworICB9CisKKyAgYXN5bmMgZmV0Y2goeworICAgIG5hbWUKKyAgfSkgeworICAgIGlmICghdGhpcy5iYXNlVXJsKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwICJiYXNlVXJsIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgKyAndGhlICJjTWFwVXJsIiBhbmQgImNNYXBQYWNrZWQiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nKTsKKyAgICB9CisKKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQ01hcCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLiIpOworICAgIH0KKworICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybCArIG5hbWUgKyAodGhpcy5pc0NvbXByZXNzZWQgPyAiLmJjbWFwIiA6ICIiKTsKKyAgICBjb25zdCBjb21wcmVzc2lvblR5cGUgPSB0aGlzLmlzQ29tcHJlc3NlZCA/IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZIDogX3V0aWwuQ01hcENvbXByZXNzaW9uVHlwZS5OT05FOworICAgIHJldHVybiB0aGlzLl9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkICR7dGhpcy5pc0NvbXByZXNzZWQgPyAiYmluYXJ5ICIgOiAiIn1DTWFwIGF0OiAke3VybH1gKTsKKyAgICB9KTsKKyAgfQorCisgIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC4iKTsKKyAgfQorCit9CisKK2V4cG9ydHMuQmFzZUNNYXBSZWFkZXJGYWN0b3J5ID0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5OworCitjbGFzcyBET01DTWFwUmVhZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7CisgIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHsKKyAgICBpZiAoaXNGZXRjaFN1cHBvcnRlZCgpICYmIGlzVmFsaWRGZXRjaFVybCh1cmwsIGRvY3VtZW50LmJhc2VVUkkpKSB7CisgICAgICByZXR1cm4gZmV0Y2godXJsKS50aGVuKGFzeW5jIHJlc3BvbnNlID0+IHsKKyAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBjTWFwRGF0YTsKKworICAgICAgICBpZiAodGhpcy5pc0NvbXByZXNzZWQpIHsKKyAgICAgICAgICBjTWFwRGF0YSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNNYXBEYXRhID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgIGNNYXBEYXRhLAorICAgICAgICAgIGNvbXByZXNzaW9uVHlwZQorICAgICAgICB9OworICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKKyAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgICAgIHJlcXVlc3Qub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKKworICAgICAgaWYgKHRoaXMuaXNDb21wcmVzc2VkKSB7CisgICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gImFycmF5YnVmZmVyIjsKKyAgICAgIH0KKworICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7CisgICAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCB8fCByZXF1ZXN0LnN0YXR1cyA9PT0gMCkgeworICAgICAgICAgIGxldCBjTWFwRGF0YTsKKworICAgICAgICAgIGlmICh0aGlzLmlzQ29tcHJlc3NlZCAmJiByZXF1ZXN0LnJlc3BvbnNlKSB7CisgICAgICAgICAgICBjTWFwRGF0YSA9IG5ldyBVaW50OEFycmF5KHJlcXVlc3QucmVzcG9uc2UpOworICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNDb21wcmVzc2VkICYmIHJlcXVlc3QucmVzcG9uc2VUZXh0KSB7CisgICAgICAgICAgICBjTWFwRGF0YSA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGNNYXBEYXRhKSB7CisgICAgICAgICAgICByZXNvbHZlKHsKKyAgICAgICAgICAgICAgY01hcERhdGEsCisgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXF1ZXN0LnN0YXR1c1RleHQpKTsKKyAgICAgIH07CisKKyAgICAgIHJlcXVlc3Quc2VuZChudWxsKTsKKyAgICB9KTsKKyAgfQorCit9CisKK2V4cG9ydHMuRE9NQ01hcFJlYWRlckZhY3RvcnkgPSBET01DTWFwUmVhZGVyRmFjdG9yeTsKKworY2xhc3MgRE9NU1ZHRmFjdG9yeSB7CisgIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7CisgICAgKDAsIF91dGlsLmFzc2VydCkod2lkdGggPiAwICYmIGhlaWdodCA+IDAsICJJbnZhbGlkIFNWRyBkaW1lbnNpb25zIik7CisgICAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgInN2ZzpzdmciKTsKKyAgICBzdmcuc2V0QXR0cmlidXRlKCJ2ZXJzaW9uIiwgIjEuMSIpOworICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGggKyAicHgiKTsKKyAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoZWlnaHQgKyAicHgiKTsKKyAgICBzdmcuc2V0QXR0cmlidXRlKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwgIm5vbmUiKTsKKyAgICBzdmcuc2V0QXR0cmlidXRlKCJ2aWV3Qm94IiwgIjAgMCAiICsgd2lkdGggKyAiICIgKyBoZWlnaHQpOworICAgIHJldHVybiBzdmc7CisgIH0KKworICBjcmVhdGVFbGVtZW50KHR5cGUpIHsKKyAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0eXBlb2YgdHlwZSA9PT0gInN0cmluZyIsICJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGUiKTsKKyAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgdHlwZSk7CisgIH0KKworfQorCitleHBvcnRzLkRPTVNWR0ZhY3RvcnkgPSBET01TVkdGYWN0b3J5OworCitjbGFzcyBQYWdlVmlld3BvcnQgeworICBjb25zdHJ1Y3Rvcih7CisgICAgdmlld0JveCwKKyAgICBzY2FsZSwKKyAgICByb3RhdGlvbiwKKyAgICBvZmZzZXRYID0gMCwKKyAgICBvZmZzZXRZID0gMCwKKyAgICBkb250RmxpcCA9IGZhbHNlCisgIH0pIHsKKyAgICB0aGlzLnZpZXdCb3ggPSB2aWV3Qm94OworICAgIHRoaXMuc2NhbGUgPSBzY2FsZTsKKyAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247CisgICAgdGhpcy5vZmZzZXRYID0gb2Zmc2V0WDsKKyAgICB0aGlzLm9mZnNldFkgPSBvZmZzZXRZOworICAgIGNvbnN0IGNlbnRlclggPSAodmlld0JveFsyXSArIHZpZXdCb3hbMF0pIC8gMjsKKyAgICBjb25zdCBjZW50ZXJZID0gKHZpZXdCb3hbM10gKyB2aWV3Qm94WzFdKSAvIDI7CisgICAgbGV0IHJvdGF0ZUEsIHJvdGF0ZUIsIHJvdGF0ZUMsIHJvdGF0ZUQ7CisgICAgcm90YXRpb24gPSByb3RhdGlvbiAlIDM2MDsKKyAgICByb3RhdGlvbiA9IHJvdGF0aW9uIDwgMCA/IHJvdGF0aW9uICsgMzYwIDogcm90YXRpb247CisKKyAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CisgICAgICBjYXNlIDE4MDoKKyAgICAgICAgcm90YXRlQSA9IC0xOworICAgICAgICByb3RhdGVCID0gMDsKKyAgICAgICAgcm90YXRlQyA9IDA7CisgICAgICAgIHJvdGF0ZUQgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA5MDoKKyAgICAgICAgcm90YXRlQSA9IDA7CisgICAgICAgIHJvdGF0ZUIgPSAxOworICAgICAgICByb3RhdGVDID0gMTsKKyAgICAgICAgcm90YXRlRCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI3MDoKKyAgICAgICAgcm90YXRlQSA9IDA7CisgICAgICAgIHJvdGF0ZUIgPSAtMTsKKyAgICAgICAgcm90YXRlQyA9IC0xOworICAgICAgICByb3RhdGVEID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcm90YXRlQSA9IDE7CisgICAgICAgIHJvdGF0ZUIgPSAwOworICAgICAgICByb3RhdGVDID0gMDsKKyAgICAgICAgcm90YXRlRCA9IC0xOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLiIpOworICAgIH0KKworICAgIGlmIChkb250RmxpcCkgeworICAgICAgcm90YXRlQyA9IC1yb3RhdGVDOworICAgICAgcm90YXRlRCA9IC1yb3RhdGVEOworICAgIH0KKworICAgIGxldCBvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZOworICAgIGxldCB3aWR0aCwgaGVpZ2h0OworCisgICAgaWYgKHJvdGF0ZUEgPT09IDApIHsKKyAgICAgIG9mZnNldENhbnZhc1ggPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFg7CisgICAgICBvZmZzZXRDYW52YXNZID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRZOworICAgICAgd2lkdGggPSBNYXRoLmFicyh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTsKKyAgICAgIGhlaWdodCA9IE1hdGguYWJzKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlOworICAgIH0gZWxzZSB7CisgICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRYOworICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclkgLSB2aWV3Qm94WzFdKSAqIHNjYWxlICsgb2Zmc2V0WTsKKyAgICAgIHdpZHRoID0gTWF0aC5hYnModmlld0JveFsyXSAtIHZpZXdCb3hbMF0pICogc2NhbGU7CisgICAgICBoZWlnaHQgPSBNYXRoLmFicyh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTsKKyAgICB9CisKKyAgICB0aGlzLnRyYW5zZm9ybSA9IFtyb3RhdGVBICogc2NhbGUsIHJvdGF0ZUIgKiBzY2FsZSwgcm90YXRlQyAqIHNjYWxlLCByb3RhdGVEICogc2NhbGUsIG9mZnNldENhbnZhc1ggLSByb3RhdGVBICogc2NhbGUgKiBjZW50ZXJYIC0gcm90YXRlQyAqIHNjYWxlICogY2VudGVyWSwgb2Zmc2V0Q2FudmFzWSAtIHJvdGF0ZUIgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVEICogc2NhbGUgKiBjZW50ZXJZXTsKKyAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgIH0KKworICBjbG9uZSh7CisgICAgc2NhbGUgPSB0aGlzLnNjYWxlLAorICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbiwKKyAgICBvZmZzZXRYID0gdGhpcy5vZmZzZXRYLAorICAgIG9mZnNldFkgPSB0aGlzLm9mZnNldFksCisgICAgZG9udEZsaXAgPSBmYWxzZQorICB9ID0ge30pIHsKKyAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7CisgICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSwKKyAgICAgIHNjYWxlLAorICAgICAgcm90YXRpb24sCisgICAgICBvZmZzZXRYLAorICAgICAgb2Zmc2V0WSwKKyAgICAgIGRvbnRGbGlwCisgICAgfSk7CisgIH0KKworICBjb252ZXJ0VG9WaWV3cG9ydFBvaW50KHgsIHkpIHsKKyAgICByZXR1cm4gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTsKKyAgfQorCisgIGNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlKHJlY3QpIHsKKyAgICBjb25zdCB0b3BMZWZ0ID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFswXSwgcmVjdFsxXV0sIHRoaXMudHJhbnNmb3JtKTsKKworICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFsyXSwgcmVjdFszXV0sIHRoaXMudHJhbnNmb3JtKTsKKworICAgIHJldHVybiBbdG9wTGVmdFswXSwgdG9wTGVmdFsxXSwgYm90dG9tUmlnaHRbMF0sIGJvdHRvbVJpZ2h0WzFdXTsKKyAgfQorCisgIGNvbnZlcnRUb1BkZlBvaW50KHgsIHkpIHsKKyAgICByZXR1cm4gX3V0aWwuVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7CisgIH0KKworfQorCitleHBvcnRzLlBhZ2VWaWV3cG9ydCA9IFBhZ2VWaWV3cG9ydDsKKworY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7CisgIGNvbnN0cnVjdG9yKG1zZywgdHlwZSkgeworICAgIHN1cGVyKG1zZyk7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCit9CisKK2V4cG9ydHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uOworY29uc3QgTGlua1RhcmdldCA9IHsKKyAgTk9ORTogMCwKKyAgU0VMRjogMSwKKyAgQkxBTks6IDIsCisgIFBBUkVOVDogMywKKyAgVE9QOiA0Cit9OworZXhwb3J0cy5MaW5rVGFyZ2V0ID0gTGlua1RhcmdldDsKKworZnVuY3Rpb24gYWRkTGlua0F0dHJpYnV0ZXMobGluaywgeworICB1cmwsCisgIHRhcmdldCwKKyAgcmVsLAorICBlbmFibGVkID0gdHJ1ZQorfSA9IHt9KSB7CisgICgwLCBfdXRpbC5hc3NlcnQpKHVybCAmJiB0eXBlb2YgdXJsID09PSAic3RyaW5nIiwgJ2FkZExpbmtBdHRyaWJ1dGVzOiBBIHZhbGlkICJ1cmwiIHBhcmFtZXRlciBtdXN0IHByb3ZpZGVkLicpOworICBjb25zdCB1cmxOdWxsUmVtb3ZlZCA9ICgwLCBfdXRpbC5yZW1vdmVOdWxsQ2hhcmFjdGVycykodXJsKTsKKworICBpZiAoZW5hYmxlZCkgeworICAgIGxpbmsuaHJlZiA9IGxpbmsudGl0bGUgPSB1cmxOdWxsUmVtb3ZlZDsKKyAgfSBlbHNlIHsKKyAgICBsaW5rLmhyZWYgPSAiIjsKKyAgICBsaW5rLnRpdGxlID0gYERpc2FibGVkOiAke3VybE51bGxSZW1vdmVkfWA7CisKKyAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyAgfQorCisgIGxldCB0YXJnZXRTdHIgPSAiIjsKKworICBzd2l0Y2ggKHRhcmdldCkgeworICAgIGNhc2UgTGlua1RhcmdldC5OT05FOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExpbmtUYXJnZXQuU0VMRjoKKyAgICAgIHRhcmdldFN0ciA9ICJfc2VsZiI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTGlua1RhcmdldC5CTEFOSzoKKyAgICAgIHRhcmdldFN0ciA9ICJfYmxhbmsiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExpbmtUYXJnZXQuUEFSRU5UOgorICAgICAgdGFyZ2V0U3RyID0gIl9wYXJlbnQiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExpbmtUYXJnZXQuVE9QOgorICAgICAgdGFyZ2V0U3RyID0gIl90b3AiOworICAgICAgYnJlYWs7CisgIH0KKworICBsaW5rLnRhcmdldCA9IHRhcmdldFN0cjsKKyAgbGluay5yZWwgPSB0eXBlb2YgcmVsID09PSAic3RyaW5nIiA/IHJlbCA6IERFRkFVTFRfTElOS19SRUw7Cit9CisKK2Z1bmN0aW9uIGdldEZpbGVuYW1lRnJvbVVybCh1cmwpIHsKKyAgY29uc3QgYW5jaG9yID0gdXJsLmluZGV4T2YoIiMiKTsKKyAgY29uc3QgcXVlcnkgPSB1cmwuaW5kZXhPZigiPyIpOworICBjb25zdCBlbmQgPSBNYXRoLm1pbihhbmNob3IgPiAwID8gYW5jaG9yIDogdXJsLmxlbmd0aCwgcXVlcnkgPiAwID8gcXVlcnkgOiB1cmwubGVuZ3RoKTsKKyAgcmV0dXJuIHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCIvIiwgZW5kKSArIDEsIGVuZCk7Cit9CisKK2NsYXNzIFN0YXRUaW1lciB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuc3RhcnRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy50aW1lcyA9IFtdOworICB9CisKKyAgdGltZShuYW1lKSB7CisgICAgaWYgKG5hbWUgaW4gdGhpcy5zdGFydGVkKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoYFRpbWVyIGlzIGFscmVhZHkgcnVubmluZyBmb3IgJHtuYW1lfWApOworICAgIH0KKworICAgIHRoaXMuc3RhcnRlZFtuYW1lXSA9IERhdGUubm93KCk7CisgIH0KKworICB0aW1lRW5kKG5hbWUpIHsKKyAgICBpZiAoIShuYW1lIGluIHRoaXMuc3RhcnRlZCkpIHsKKyAgICAgICgwLCBfdXRpbC53YXJuKShgVGltZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZm9yICR7bmFtZX1gKTsKKyAgICB9CisKKyAgICB0aGlzLnRpbWVzLnB1c2goeworICAgICAgbmFtZSwKKyAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbbmFtZV0sCisgICAgICBlbmQ6IERhdGUubm93KCkKKyAgICB9KTsKKyAgICBkZWxldGUgdGhpcy5zdGFydGVkW25hbWVdOworICB9CisKKyAgdG9TdHJpbmcoKSB7CisgICAgY29uc3Qgb3V0QnVmID0gW107CisgICAgbGV0IGxvbmdlc3QgPSAwOworCisgICAgZm9yIChjb25zdCB0aW1lIG9mIHRoaXMudGltZXMpIHsKKyAgICAgIGNvbnN0IG5hbWUgPSB0aW1lLm5hbWU7CisKKyAgICAgIGlmIChuYW1lLmxlbmd0aCA+IGxvbmdlc3QpIHsKKyAgICAgICAgbG9uZ2VzdCA9IG5hbWUubGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgdGltZSBvZiB0aGlzLnRpbWVzKSB7CisgICAgICBjb25zdCBkdXJhdGlvbiA9IHRpbWUuZW5kIC0gdGltZS5zdGFydDsKKyAgICAgIG91dEJ1Zi5wdXNoKGAke3RpbWUubmFtZS5wYWRFbmQobG9uZ2VzdCl9ICR7ZHVyYXRpb259bXNcbmApOworICAgIH0KKworICAgIHJldHVybiBvdXRCdWYuam9pbigiIik7CisgIH0KKworfQorCitleHBvcnRzLlN0YXRUaW1lciA9IFN0YXRUaW1lcjsKKworZnVuY3Rpb24gaXNGZXRjaFN1cHBvcnRlZCgpIHsKKyAgcmV0dXJuIHR5cGVvZiBmZXRjaCAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIFJlc3BvbnNlICE9PSAidW5kZWZpbmVkIiAmJiAiYm9keSIgaW4gUmVzcG9uc2UucHJvdG90eXBlICYmIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPT0gInVuZGVmaW5lZCI7Cit9CisKK2Z1bmN0aW9uIGlzVmFsaWRGZXRjaFVybCh1cmwsIGJhc2VVcmwpIHsKKyAgdHJ5IHsKKyAgICBjb25zdCB7CisgICAgICBwcm90b2NvbAorICAgIH0gPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpOworICAgIHJldHVybiBwcm90b2NvbCA9PT0gImh0dHA6IiB8fCBwcm90b2NvbCA9PT0gImh0dHBzOiI7CisgIH0gY2F0Y2ggKGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Z1bmN0aW9uIGxvYWRTY3JpcHQoc3JjKSB7CisgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CisgICAgc2NyaXB0LnNyYyA9IHNyYzsKKyAgICBzY3JpcHQub25sb2FkID0gcmVzb2x2ZTsKKworICAgIHNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkgeworICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGxvYWQgc2NyaXB0IGF0OiAke3NjcmlwdC5zcmN9YCkpOworICAgIH07CisKKyAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHNjcmlwdCk7CisgIH0pOworfQorCitmdW5jdGlvbiBkZXByZWNhdGVkKGRldGFpbHMpIHsKKyAgY29uc29sZS5sb2coIkRlcHJlY2F0ZWQgQVBJIHVzYWdlOiAiICsgZGV0YWlscyk7Cit9CisKK2xldCBwZGZEYXRlU3RyaW5nUmVnZXg7CisKK2NsYXNzIFBERkRhdGVTdHJpbmcgeworICBzdGF0aWMgdG9EYXRlT2JqZWN0KGlucHV0KSB7CisgICAgaWYgKCFpbnB1dCB8fCAhKDAsIF91dGlsLmlzU3RyaW5nKShpbnB1dCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGlmICghcGRmRGF0ZVN0cmluZ1JlZ2V4KSB7CisgICAgICBwZGZEYXRlU3RyaW5nUmVnZXggPSBuZXcgUmVnRXhwKCJeRDoiICsgIihcXGR7NH0pIiArICIoXFxkezJ9KT8iICsgIihcXGR7Mn0pPyIgKyAiKFxcZHsyfSk/IiArICIoXFxkezJ9KT8iICsgIihcXGR7Mn0pPyIgKyAiKFtafCt8LV0pPyIgKyAiKFxcZHsyfSk/IiArICInPyIgKyAiKFxcZHsyfSk/IiArICInPyIpOworICAgIH0KKworICAgIGNvbnN0IG1hdGNoZXMgPSBwZGZEYXRlU3RyaW5nUmVnZXguZXhlYyhpbnB1dCk7CisKKyAgICBpZiAoIW1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7CisgICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApOworICAgIG1vbnRoID0gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiA/IG1vbnRoIC0gMSA6IDA7CisgICAgbGV0IGRheSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDEwKTsKKyAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxOworICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApOworICAgIGhvdXIgPSBob3VyID49IDAgJiYgaG91ciA8PSAyMyA/IGhvdXIgOiAwOworICAgIGxldCBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7CisgICAgbWludXRlID0gbWludXRlID49IDAgJiYgbWludXRlIDw9IDU5ID8gbWludXRlIDogMDsKKyAgICBsZXQgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hlc1s2XSwgMTApOworICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7CisgICAgY29uc3QgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCAiWiI7CisgICAgbGV0IG9mZnNldEhvdXIgPSBwYXJzZUludChtYXRjaGVzWzhdLCAxMCk7CisgICAgb2Zmc2V0SG91ciA9IG9mZnNldEhvdXIgPj0gMCAmJiBvZmZzZXRIb3VyIDw9IDIzID8gb2Zmc2V0SG91ciA6IDA7CisgICAgbGV0IG9mZnNldE1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbOV0sIDEwKSB8fCAwOworICAgIG9mZnNldE1pbnV0ZSA9IG9mZnNldE1pbnV0ZSA+PSAwICYmIG9mZnNldE1pbnV0ZSA8PSA1OSA/IG9mZnNldE1pbnV0ZSA6IDA7CisKKyAgICBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSAiLSIpIHsKKyAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjsKKyAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7CisgICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09ICIrIikgeworICAgICAgaG91ciAtPSBvZmZzZXRIb3VyOworICAgICAgbWludXRlIC09IG9mZnNldE1pbnV0ZTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGRGF0ZVN0cmluZyA9IFBERkRhdGVTdHJpbmc7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzIGIvbGliL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTZiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGlzcGxheS9mZXRjaF9zdHJlYW0uanMKQEAgLTAsMCArMSwzMDkgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERkZldGNoU3RyZWFtID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX25ldHdvcmtfdXRpbHMgPSByZXF1aXJlKCIuL25ldHdvcmtfdXRpbHMuanMiKTsKKworOworCitmdW5jdGlvbiBjcmVhdGVGZXRjaE9wdGlvbnMoaGVhZGVycywgd2l0aENyZWRlbnRpYWxzLCBhYm9ydENvbnRyb2xsZXIpIHsKKyAgcmV0dXJuIHsKKyAgICBtZXRob2Q6ICJHRVQiLAorICAgIGhlYWRlcnMsCisgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIgJiYgYWJvcnRDb250cm9sbGVyLnNpZ25hbCwKKyAgICBtb2RlOiAiY29ycyIsCisgICAgY3JlZGVudGlhbHM6IHdpdGhDcmVkZW50aWFscyA/ICJpbmNsdWRlIiA6ICJzYW1lLW9yaWdpbiIsCisgICAgcmVkaXJlY3Q6ICJmb2xsb3ciCisgIH07Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUhlYWRlcnMoaHR0cEhlYWRlcnMpIHsKKyAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7CisKKyAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBodHRwSGVhZGVycykgeworICAgIGNvbnN0IHZhbHVlID0gaHR0cEhlYWRlcnNbcHJvcGVydHldOworCisgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGhlYWRlcnMuYXBwZW5kKHByb3BlcnR5LCB2YWx1ZSk7CisgIH0KKworICByZXR1cm4gaGVhZGVyczsKK30KKworY2xhc3MgUERGRmV0Y2hTdHJlYW0geworICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHsKKyAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3Qoc291cmNlLnVybCk7CisgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTsKKyAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7CisgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOworICB9CisKKyAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7CisgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID8gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2xvYWRlZCA6IDA7CisgIH0KKworICBnZXRGdWxsUmVhZGVyKCkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERkZldGNoU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SZWFkZXIodGhpcyk7CisgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOworICB9CisKKyAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkgeworICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTsKKworICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpOworCisgICAgcmV0dXJuIHJlYWRlcjsKKyAgfQorCisgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikgeworICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgeworICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfQorCisgICAgY29uc3QgcmVhZGVycyA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCk7CisKKyAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikgeworICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5QREZGZXRjaFN0cmVhbSA9IFBERkZldGNoU3RyZWFtOworCitjbGFzcyBQREZGZXRjaFN0cmVhbVJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSkgeworICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLl9yZWFkZXIgPSBudWxsOworICAgIHRoaXMuX2xvYWRlZCA9IDA7CisgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsOworICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7CisgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTsKKyAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKyAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlOworICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplOworCisgICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7CisgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlOworICAgIH0KKworICAgIGlmICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAidW5kZWZpbmVkIikgeworICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOworICAgIH0KKworICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtOworICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTsKKyAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpOworICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7CisgICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAgIGlmICghKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHJlc3BvbnNlLnN0YXR1cykpIHsKKyAgICAgICAgdGhyb3cgKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHJlc3BvbnNlLnN0YXR1cywgdXJsKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTsKKworICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4geworICAgICAgICByZXR1cm4gcmVzcG9uc2UuaGVhZGVycy5nZXQobmFtZSk7CisgICAgICB9OworCisgICAgICBjb25zdCB7CisgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cywKKyAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoCisgICAgICB9ID0gKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7CisgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyLAorICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsCisgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSwKKyAgICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2UKKyAgICAgIH0pOworICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0czsKKyAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgdGhpcy5fY29udGVudExlbmd0aDsKKyAgICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGdldFJlc3BvbnNlSGVhZGVyKTsKKworICAgICAgaWYgKCF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7CisgICAgICAgIHRoaXMuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiU3RyZWFtaW5nIGlzIGRpc2FibGVkLiIpKTsKKyAgICAgIH0KKyAgICB9KS5jYXRjaCh0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QpOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgIH0KKworICBnZXQgaGVhZGVyc1JlYWR5KCkgeworICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgZ2V0IGZpbGVuYW1lKCkgeworICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTsKKyAgfQorCisgIGdldCBjb250ZW50TGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoOworICB9CisKKyAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7CisgIH0KKworICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBhd2FpdCB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlOworICAgIGNvbnN0IHsKKyAgICAgIHZhbHVlLAorICAgICAgZG9uZQorICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpOworCisgICAgaWYgKGRvbmUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlLAorICAgICAgICBkb25lCisgICAgICB9OworICAgIH0KKworICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoOworCisgICAgaWYgKHRoaXMub25Qcm9ncmVzcykgeworICAgICAgdGhpcy5vblByb2dyZXNzKHsKKyAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsCisgICAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoCisgICAgICB9KTsKKyAgICB9CisKKyAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh2YWx1ZSkuYnVmZmVyOworICAgIHJldHVybiB7CisgICAgICB2YWx1ZTogYnVmZmVyLAorICAgICAgZG9uZTogZmFsc2UKKyAgICB9OworICB9CisKKyAgY2FuY2VsKHJlYXNvbikgeworICAgIGlmICh0aGlzLl9yZWFkZXIpIHsKKyAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fYWJvcnRDb250cm9sbGVyKSB7CisgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTsKKyAgICB9CisgIH0KKworfQorCitjbGFzcyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyIHsKKyAgY29uc3RydWN0b3Ioc3RyZWFtLCBiZWdpbiwgZW5kKSB7CisgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtOworICAgIHRoaXMuX3JlYWRlciA9IG51bGw7CisgICAgdGhpcy5fbG9hZGVkID0gMDsKKyAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlOworICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7CisgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07CisKKyAgICBpZiAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKKyAgICB9CisKKyAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpOworCisgICAgdGhpcy5faGVhZGVycy5hcHBlbmQoIlJhbmdlIiwgYGJ5dGVzPSR7YmVnaW59LSR7ZW5kIC0gMX1gKTsKKworICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7CisgICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAgIGlmICghKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHJlc3BvbnNlLnN0YXR1cykpIHsKKyAgICAgICAgdGhyb3cgKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHJlc3BvbnNlLnN0YXR1cywgdXJsKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICB0aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpOworICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5uYW1lID09PSAiQWJvcnRFcnJvciIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aHJvdyByZWFzb247CisgICAgfSk7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKyAgfQorCisgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgIH0KKworICBhc3luYyByZWFkKCkgeworICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgY29uc3QgeworICAgICAgdmFsdWUsCisgICAgICBkb25lCisgICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7CisKKyAgICBpZiAoZG9uZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWUsCisgICAgICAgIGRvbmUKKyAgICAgIH07CisgICAgfQorCisgICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CisKKyAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7CisgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZAorICAgICAgfSk7CisgICAgfQorCisgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpLmJ1ZmZlcjsKKyAgICByZXR1cm4geworICAgICAgdmFsdWU6IGJ1ZmZlciwKKyAgICAgIGRvbmU6IGZhbHNlCisgICAgfTsKKyAgfQorCisgIGNhbmNlbChyZWFzb24pIHsKKyAgICBpZiAodGhpcy5fcmVhZGVyKSB7CisgICAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfQorCisgICAgaWYgKHRoaXMuX2Fib3J0Q29udHJvbGxlcikgeworICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7CisgICAgfQorICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS9mb250X2xvYWRlci5qcyBiL2xpYi9kaXNwbGF5L2ZvbnRfbG9hZGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzE4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGlzcGxheS9mb250X2xvYWRlci5qcwpAQCAtMCwwICsxLDQxMyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRm9udExvYWRlciA9IGV4cG9ydHMuRm9udEZhY2VPYmplY3QgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK2NsYXNzIEJhc2VGb250TG9hZGVyIHsKKyAgY29uc3RydWN0b3IoeworICAgIGRvY0lkLAorICAgIG9uVW5zdXBwb3J0ZWRGZWF0dXJlLAorICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50CisgIH0pIHsKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUZvbnRMb2FkZXIpIHsKKyAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGb250TG9hZGVyLiIpOworICAgIH0KKworICAgIHRoaXMuZG9jSWQgPSBkb2NJZDsKKyAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSA9IG9uVW5zdXBwb3J0ZWRGZWF0dXJlOworICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDsKKyAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcyA9IFtdOworICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDsKKyAgfQorCisgIGFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKSB7CisgICAgdGhpcy5uYXRpdmVGb250RmFjZXMucHVzaChuYXRpdmVGb250RmFjZSk7CisKKyAgICB0aGlzLl9kb2N1bWVudC5mb250cy5hZGQobmF0aXZlRm9udEZhY2UpOworICB9CisKKyAgaW5zZXJ0UnVsZShydWxlKSB7CisgICAgbGV0IHN0eWxlRWxlbWVudCA9IHRoaXMuc3R5bGVFbGVtZW50OworCisgICAgaWYgKCFzdHlsZUVsZW1lbnQpIHsKKyAgICAgIHN0eWxlRWxlbWVudCA9IHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKKyAgICAgIHN0eWxlRWxlbWVudC5pZCA9IGBQREZKU19GT05UX1NUWUxFX1RBR18ke3RoaXMuZG9jSWR9YDsKKworICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsKKyAgICB9CisKKyAgICBjb25zdCBzdHlsZVNoZWV0ID0gc3R5bGVFbGVtZW50LnNoZWV0OworICAgIHN0eWxlU2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7CisgIH0KKworICBjbGVhcigpIHsKKyAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5mb3JFYWNoKG5hdGl2ZUZvbnRGYWNlID0+IHsKKyAgICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7CisgICAgfSk7CisgICAgdGhpcy5uYXRpdmVGb250RmFjZXMubGVuZ3RoID0gMDsKKworICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkgeworICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7CisgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7CisgICAgfQorICB9CisKKyAgYXN5bmMgYmluZChmb250KSB7CisgICAgaWYgKGZvbnQuYXR0YWNoZWQgfHwgZm9udC5taXNzaW5nRmlsZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvbnQuYXR0YWNoZWQgPSB0cnVlOworCisgICAgaWYgKHRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCkgeworICAgICAgY29uc3QgbmF0aXZlRm9udEZhY2UgPSBmb250LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7CisKKyAgICAgIGlmIChuYXRpdmVGb250RmFjZSkgeworICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGF3YWl0IG5hdGl2ZUZvbnRGYWNlLmxvYWRlZDsKKyAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICB0aGlzLl9vblVuc3VwcG9ydGVkRmVhdHVyZSh7CisgICAgICAgICAgICBmZWF0dXJlSWQ6IF91dGlsLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmVycm9yRm9udExvYWROYXRpdmUKKyAgICAgICAgICB9KTsKKworICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgRmFpbGVkIHRvIGxvYWQgZm9udCAnJHtuYXRpdmVGb250RmFjZS5mYW1pbHl9JzogJyR7ZXh9Jy5gKTsKKyAgICAgICAgICBmb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7CisgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHJ1bGUgPSBmb250LmNyZWF0ZUZvbnRGYWNlUnVsZSgpOworCisgICAgaWYgKHJ1bGUpIHsKKyAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTsKKworICAgICAgaWYgKHRoaXMuaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsKKyAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHJlc29sdmUpOworCisgICAgICAgIHRoaXMuX3ByZXBhcmVGb250TG9hZEV2ZW50KFtydWxlXSwgW2ZvbnRdLCByZXF1ZXN0KTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIF9xdWV1ZUxvYWRpbmdDYWxsYmFjayhjYWxsYmFjaykgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrYC4iKTsKKyAgfQorCisgIGdldCBpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKCkgeworICAgIGNvbnN0IHN1cHBvcnRlZCA9IHR5cGVvZiB0aGlzLl9kb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgISF0aGlzLl9kb2N1bWVudC5mb250czsKKyAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQiLCBzdXBwb3J0ZWQpOworICB9CisKKyAgZ2V0IGlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRgLiIpOworICB9CisKKyAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7CisgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfbG9hZFRlc3RGb250YC4iKTsKKyAgfQorCisgIF9wcmVwYXJlRm9udExvYWRFdmVudChydWxlcywgZm9udHNUb0xvYWQsIHJlcXVlc3QpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYF9wcmVwYXJlRm9udExvYWRFdmVudGAuIik7CisgIH0KKworfQorCitsZXQgRm9udExvYWRlcjsKK2V4cG9ydHMuRm9udExvYWRlciA9IEZvbnRMb2FkZXI7Cit7CisgIGV4cG9ydHMuRm9udExvYWRlciA9IEZvbnRMb2FkZXIgPSBjbGFzcyBHZW5lcmljRm9udExvYWRlciBleHRlbmRzIEJhc2VGb250TG9hZGVyIHsKKyAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKKyAgICAgIHN1cGVyKHBhcmFtcyk7CisgICAgICB0aGlzLmxvYWRpbmdDb250ZXh0ID0geworICAgICAgICByZXF1ZXN0czogW10sCisgICAgICAgIG5leHRSZXF1ZXN0SWQ6IDAKKyAgICAgIH07CisgICAgICB0aGlzLmxvYWRUZXN0Rm9udElkID0gMDsKKyAgICB9CisKKyAgICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7CisgICAgICBsZXQgc3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAidW5kZWZpbmVkIikgeworICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgbSA9IC9Nb3ppbGxhXC81LjAuKj9ydjooXGQrKS4qPyBHZWNrby8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KTsKKworICAgICAgICBpZiAobSAmJiBtWzFdID49IDE0KSB7CisgICAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkIiwgc3VwcG9ydGVkKTsKKyAgICB9CisKKyAgICBfcXVldWVMb2FkaW5nQ2FsbGJhY2soY2FsbGJhY2spIHsKKyAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlUmVxdWVzdCgpIHsKKyAgICAgICAgKDAsIF91dGlsLmFzc2VydCkoIXJlcXVlc3QuZG9uZSwgImNvbXBsZXRlUmVxdWVzdCgpIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UuIik7CisgICAgICAgIHJlcXVlc3QuZG9uZSA9IHRydWU7CisKKyAgICAgICAgd2hpbGUgKGNvbnRleHQucmVxdWVzdHMubGVuZ3RoID4gMCAmJiBjb250ZXh0LnJlcXVlc3RzWzBdLmRvbmUpIHsKKyAgICAgICAgICBjb25zdCBvdGhlclJlcXVlc3QgPSBjb250ZXh0LnJlcXVlc3RzLnNoaWZ0KCk7CisgICAgICAgICAgc2V0VGltZW91dChvdGhlclJlcXVlc3QuY2FsbGJhY2ssIDApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmxvYWRpbmdDb250ZXh0OworICAgICAgY29uc3QgcmVxdWVzdCA9IHsKKyAgICAgICAgaWQ6IGBwZGZqcy1mb250LWxvYWRpbmctJHtjb250ZXh0Lm5leHRSZXF1ZXN0SWQrK31gLAorICAgICAgICBkb25lOiBmYWxzZSwKKyAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlUmVxdWVzdCwKKyAgICAgICAgY2FsbGJhY2sKKyAgICAgIH07CisgICAgICBjb250ZXh0LnJlcXVlc3RzLnB1c2gocmVxdWVzdCk7CisgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICB9CisKKyAgICBnZXQgX2xvYWRUZXN0Rm9udCgpIHsKKyAgICAgIGNvbnN0IGdldExvYWRUZXN0Rm9udCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGF0b2IoIlQxUlVUd0FMQUlBQUF3QXdRMFpHSURIdFpnNEFBQU9ZQUFBQWdVWkdWRTFsa3pad0FBQUVIQUFBQUJ4SFJFVkdBQlFBIiArICJGUUFBQkRnQUFBQWVUMU12TWxZTll3a0FBQUVnQUFBQVlHTnRZWEFCRFFMVUFBQUNOQUFBQVVKb1pXRmsveFZGRFFBQSIgKyAiQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0EiICsgIkFBQUdibUZ0WlZqbWRINEFBQUdBQUFBQXNYQnZjM1QvaGdBekFBQURlQUFBQUNBQUFRQUFBQUVBQUxaUkZzUmZEenoxIiArICJBQXNENkFBQUFBRE9CT1RMQUFBQUFNNEtIRHdBQUFBQUErZ0RJUUFBQUFnQUFnQUFBQUFBQUFBQkFBQURJUUFBQUZvRCIgKyAiNkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ00iICsgIkFvb0N2QUFBQWVBQU1RRUNBQUFDQUFZSkFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBRkJtUldRQXdBQXVBQzREIiArICJJUDg0QUZvRElRQUFBQUFBQVFBQUFBQUFBQUFBQUNBQUlBQUJBQUFBRGdDdUFBRUFBQUFBQUFBQUFRQUFBQUVBQUFBQSIgKyAiQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUEiICsgIkFRQUFBQUVBQUFBQUFBWUFBUUFBQUFNQUFRUUpBQUFBQWdBQkFBTUFBUVFKQUFFQUFnQUJBQU1BQVFRSkFBSUFBZ0FCIiArICJBQU1BQVFRSkFBTUFBZ0FCQUFNQUFRUUpBQVFBQWdBQkFBTUFBUVFKQUFVQUFnQUJBQU1BQVFRSkFBWUFBZ0FCV0FCWSIgKyAiQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUEiICsgIkFDNy8vLy9UQUFFQUFBQUFBQUFCQmdBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIiArICJBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIgKyAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiICsgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIiArICJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIgKyAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUEiICsgIkFBQUJBQVFFQUFFQkFRSllBQUVCQVNINER3RDRHd0hFQXZnY0EvZ1hCSXdNQVl1TCtuejV0UVhrRDVqM0NCTG5FUUFDIiArICJBUUVCSVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlBQUFCQVFBQUR3QUNBUUVFRS90MyIgKyAiRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGoiICsgIkZRQUFBQURPQk9RcEFBRUFBQUFBQUFBQURBQVVBQVFBQUFBQkFBQUFBZ0FCQUFBQUFBQUFBQUFENkFBQUFBQUFBQT09Iik7CisgICAgICB9OworCisgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIl9sb2FkVGVzdEZvbnQiLCBnZXRMb2FkVGVzdEZvbnQoKSk7CisgICAgfQorCisgICAgX3ByZXBhcmVGb250TG9hZEV2ZW50KHJ1bGVzLCBmb250cywgcmVxdWVzdCkgeworICAgICAgZnVuY3Rpb24gaW50MzIoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0KSA8PCAyNCB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAxKSA8PCAxNiB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAyKSA8PCA4IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDMpICYgMHhmZjsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc3BsaWNlU3RyaW5nKHMsIG9mZnNldCwgcmVtb3ZlLCBpbnNlcnQpIHsKKyAgICAgICAgY29uc3QgY2h1bmsxID0gcy5zdWJzdHJpbmcoMCwgb2Zmc2V0KTsKKyAgICAgICAgY29uc3QgY2h1bmsyID0gcy5zdWJzdHJpbmcob2Zmc2V0ICsgcmVtb3ZlKTsKKyAgICAgICAgcmV0dXJuIGNodW5rMSArIGluc2VydCArIGNodW5rMjsKKyAgICAgIH0KKworICAgICAgbGV0IGksIGlpOworCisgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKKworICAgICAgY2FudmFzLndpZHRoID0gMTsKKyAgICAgIGNhbnZhcy5oZWlnaHQgPSAxOworICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CisgICAgICBsZXQgY2FsbGVkID0gMDsKKworICAgICAgZnVuY3Rpb24gaXNGb250UmVhZHkobmFtZSwgY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGVkKys7CisKKyAgICAgICAgaWYgKGNhbGxlZCA+IDMwKSB7CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJMb2FkIHRlc3QgZm9udCBuZXZlciBsb2FkZWQuIik7CisgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjdHguZm9udCA9ICIzMHB4ICIgKyBuYW1lOworICAgICAgICBjdHguZmlsbFRleHQoIi4iLCAwLCAyMCk7CisgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7CisKKyAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhWzNdID4gMCkgeworICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2V0VGltZW91dChpc0ZvbnRSZWFkeS5iaW5kKG51bGwsIG5hbWUsIGNhbGxiYWNrKSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGxvYWRUZXN0Rm9udElkID0gYGx0JHtEYXRlLm5vdygpfSR7dGhpcy5sb2FkVGVzdEZvbnRJZCsrfWA7CisgICAgICBsZXQgZGF0YSA9IHRoaXMuX2xvYWRUZXN0Rm9udDsKKyAgICAgIGNvbnN0IENPTU1FTlRfT0ZGU0VUID0gOTc2OworICAgICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDT01NRU5UX09GRlNFVCwgbG9hZFRlc3RGb250SWQubGVuZ3RoLCBsb2FkVGVzdEZvbnRJZCk7CisgICAgICBjb25zdCBDRkZfQ0hFQ0tTVU1fT0ZGU0VUID0gMTY7CisgICAgICBjb25zdCBYWFhYX1ZBTFVFID0gMHg1ODU4NTg1ODsKKyAgICAgIGxldCBjaGVja3N1bSA9IGludDMyKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQpOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IGxvYWRUZXN0Rm9udElkLmxlbmd0aCAtIDM7IGkgPCBpaTsgaSArPSA0KSB7CisgICAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQsIGkpIHwgMDsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPCBsb2FkVGVzdEZvbnRJZC5sZW5ndGgpIHsKKyAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSAtIFhYWFhfVkFMVUUgKyBpbnQzMihsb2FkVGVzdEZvbnRJZCArICJYWFgiLCBpKSB8IDA7CisgICAgICB9CisKKyAgICAgIGRhdGEgPSBzcGxpY2VTdHJpbmcoZGF0YSwgQ0ZGX0NIRUNLU1VNX09GRlNFVCwgNCwgKDAsIF91dGlsLnN0cmluZzMyKShjaGVja3N1bSkpOworICAgICAgY29uc3QgdXJsID0gYHVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCR7YnRvYShkYXRhKX0pO2A7CisgICAgICBjb25zdCBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OiIke2xvYWRUZXN0Rm9udElkfSI7c3JjOiR7dXJsfX1gOworICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpOworICAgICAgY29uc3QgbmFtZXMgPSBbXTsKKworICAgICAgZm9yIChpID0gMCwgaWkgPSBmb250cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIG5hbWVzLnB1c2goZm9udHNbaV0ubG9hZGVkTmFtZSk7CisgICAgICB9CisKKyAgICAgIG5hbWVzLnB1c2gobG9hZFRlc3RGb250SWQpOworCisgICAgICBjb25zdCBkaXYgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworICAgICAgZGl2LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKKyAgICAgIGRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5oZWlnaHQgPSAiMTBweCI7CisgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworICAgICAgZGl2LnN0eWxlLnRvcCA9IGRpdi5zdHlsZS5sZWZ0ID0gIjBweCI7CisKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICBjb25zdCBzcGFuID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworCisgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSAiSGkiOworICAgICAgICBzcGFuLnN0eWxlLmZvbnRGYW1pbHkgPSBuYW1lc1tpXTsKKyAgICAgICAgZGl2LmFwcGVuZENoaWxkKHNwYW4pOworICAgICAgfQorCisgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7CisKKyAgICAgIGlzRm9udFJlYWR5KGxvYWRUZXN0Rm9udElkLCAoKSA9PiB7CisgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGl2KTsKKworICAgICAgICByZXF1ZXN0LmNvbXBsZXRlKCk7CisgICAgICB9KTsKKyAgICB9CisKKyAgfTsKK30KKworY2xhc3MgRm9udEZhY2VPYmplY3QgeworICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVkRGF0YSwgeworICAgIGlzRXZhbFN1cHBvcnRlZCA9IHRydWUsCisgICAgZGlzYWJsZUZvbnRGYWNlID0gZmFsc2UsCisgICAgaWdub3JlRXJyb3JzID0gZmFsc2UsCisgICAgb25VbnN1cHBvcnRlZEZlYXR1cmUgPSBudWxsLAorICAgIGZvbnRSZWdpc3RyeSA9IG51bGwKKyAgfSkgeworICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgZm9yIChjb25zdCBpIGluIHRyYW5zbGF0ZWREYXRhKSB7CisgICAgICB0aGlzW2ldID0gdHJhbnNsYXRlZERhdGFbaV07CisgICAgfQorCisgICAgdGhpcy5pc0V2YWxTdXBwb3J0ZWQgPSBpc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlOworICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gZGlzYWJsZUZvbnRGYWNlID09PSB0cnVlOworICAgIHRoaXMuaWdub3JlRXJyb3JzID0gaWdub3JlRXJyb3JzID09PSB0cnVlOworICAgIHRoaXMuX29uVW5zdXBwb3J0ZWRGZWF0dXJlID0gb25VbnN1cHBvcnRlZEZlYXR1cmU7CisgICAgdGhpcy5mb250UmVnaXN0cnkgPSBmb250UmVnaXN0cnk7CisgIH0KKworICBjcmVhdGVOYXRpdmVGb250RmFjZSgpIHsKKyAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgbmF0aXZlRm9udEZhY2UgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTsKKworICAgIGlmICh0aGlzLmZvbnRSZWdpc3RyeSkgeworICAgICAgdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMpOworICAgIH0KKworICAgIHJldHVybiBuYXRpdmVGb250RmFjZTsKKyAgfQorCisgIGNyZWF0ZUZvbnRGYWNlUnVsZSgpIHsKKyAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgY29uc3QgZGF0YSA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTsKKyAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6JHt0aGlzLm1pbWV0eXBlfTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDsKKyAgICBjb25zdCBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OiIke3RoaXMubG9hZGVkTmFtZX0iO3NyYzoke3VybH19YDsKKworICAgIGlmICh0aGlzLmZvbnRSZWdpc3RyeSkgeworICAgICAgdGhpcy5mb250UmVnaXN0cnkucmVnaXN0ZXJGb250KHRoaXMsIHVybCk7CisgICAgfQorCisgICAgcmV0dXJuIHJ1bGU7CisgIH0KKworICBnZXRQYXRoR2VuZXJhdG9yKG9ianMsIGNoYXJhY3RlcikgeworICAgIGlmICh0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gIT09IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXTsKKyAgICB9CisKKyAgICBsZXQgY21kcywgY3VycmVudDsKKworICAgIHRyeSB7CisgICAgICBjbWRzID0gb2Jqcy5nZXQodGhpcy5sb2FkZWROYW1lICsgIl9wYXRoXyIgKyBjaGFyYWN0ZXIpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBpZiAoIXRoaXMuaWdub3JlRXJyb3JzKSB7CisgICAgICAgIHRocm93IGV4OworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUpIHsKKyAgICAgICAgdGhpcy5fb25VbnN1cHBvcnRlZEZlYXR1cmUoeworICAgICAgICAgIGZlYXR1cmVJZDogX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVMuZXJyb3JGb250R2V0UGF0aAorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRQYXRoR2VuZXJhdG9yIC0gaWdub3JpbmcgY2hhcmFjdGVyOiAiJHtleH0iLmApOworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSA9IGZ1bmN0aW9uIChjLCBzaXplKSB7fTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5pc0V2YWxTdXBwb3J0ZWQgJiYgX3V0aWwuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkLnZhbHVlKSB7CisgICAgICBsZXQgYXJncywKKyAgICAgICAgICBqcyA9ICIiOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjbWRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY3VycmVudCA9IGNtZHNbaV07CisKKyAgICAgICAgaWYgKGN1cnJlbnQuYXJncyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgYXJncyA9IGN1cnJlbnQuYXJncy5qb2luKCIsIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXJncyA9ICIiOworICAgICAgICB9CisKKyAgICAgICAganMgKz0gImMuIiArIGN1cnJlbnQuY21kICsgIigiICsgYXJncyArICIpO1xuIjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSA9IG5ldyBGdW5jdGlvbigiYyIsICJzaXplIiwganMpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkgeworICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY21kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGN1cnJlbnQgPSBjbWRzW2ldOworCisgICAgICAgIGlmIChjdXJyZW50LmNtZCA9PT0gInNjYWxlIikgeworICAgICAgICAgIGN1cnJlbnQuYXJncyA9IFtzaXplLCAtc2l6ZV07CisgICAgICAgIH0KKworICAgICAgICBjW2N1cnJlbnQuY21kXS5hcHBseShjLCBjdXJyZW50LmFyZ3MpOworICAgICAgfQorICAgIH07CisgIH0KKworfQorCitleHBvcnRzLkZvbnRGYWNlT2JqZWN0ID0gRm9udEZhY2VPYmplY3Q7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2Rpc3BsYXkvbWV0YWRhdGEuanMgYi9saWIvZGlzcGxheS9tZXRhZGF0YS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA3MmRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvbWV0YWRhdGEuanMKQEAgLTAsMCArMSwxMzcgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk1ldGFkYXRhID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX3htbF9wYXJzZXIgPSByZXF1aXJlKCIuL3htbF9wYXJzZXIuanMiKTsKKworY2xhc3MgTWV0YWRhdGEgeworICBjb25zdHJ1Y3RvcihkYXRhKSB7CisgICAgKDAsIF91dGlsLmFzc2VydCkodHlwZW9mIGRhdGEgPT09ICJzdHJpbmciLCAiTWV0YWRhdGE6IGlucHV0IGlzIG5vdCBhIHN0cmluZyIpOworICAgIGRhdGEgPSB0aGlzLl9yZXBhaXIoZGF0YSk7CisgICAgY29uc3QgcGFyc2VyID0gbmV3IF94bWxfcGFyc2VyLlNpbXBsZVhNTFBhcnNlcigpOworICAgIGNvbnN0IHhtbERvY3VtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICB0aGlzLl9tZXRhZGF0YU1hcCA9IG5ldyBNYXAoKTsKKworICAgIGlmICh4bWxEb2N1bWVudCkgeworICAgICAgdGhpcy5fcGFyc2UoeG1sRG9jdW1lbnQpOworICAgIH0KKyAgfQorCisgIF9yZXBhaXIoZGF0YSkgeworICAgIHJldHVybiBkYXRhLnJlcGxhY2UoL15bXjxdKy8sICIiKS5yZXBsYWNlKC8+XFwzNzZcXDM3NyhbXjxdKykvZywgZnVuY3Rpb24gKGFsbCwgY29kZXMpIHsKKyAgICAgIGNvbnN0IGJ5dGVzID0gY29kZXMucmVwbGFjZSgvXFwoWzAtM10pKFswLTddKShbMC03XSkvZywgZnVuY3Rpb24gKGNvZGUsIGQxLCBkMiwgZDMpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZDEgKiA2NCArIGQyICogOCArIGQzICogMSk7CisgICAgICB9KS5yZXBsYWNlKC8mKGFtcHxhcG9zfGd0fGx0fHF1b3QpOy9nLCBmdW5jdGlvbiAoc3RyLCBuYW1lKSB7CisgICAgICAgIHN3aXRjaCAobmFtZSkgeworICAgICAgICAgIGNhc2UgImFtcCI6CisgICAgICAgICAgICByZXR1cm4gIiYiOworCisgICAgICAgICAgY2FzZSAiYXBvcyI6CisgICAgICAgICAgICByZXR1cm4gIiciOworCisgICAgICAgICAgY2FzZSAiZ3QiOgorICAgICAgICAgICAgcmV0dXJuICI+IjsKKworICAgICAgICAgIGNhc2UgImx0IjoKKyAgICAgICAgICAgIHJldHVybiAiPCI7CisKKyAgICAgICAgICBjYXNlICJxdW90IjoKKyAgICAgICAgICAgIHJldHVybiAnIic7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYF9yZXBhaXI6ICR7bmFtZX0gaXNuJ3QgZGVmaW5lZC5gKTsKKyAgICAgIH0pOworICAgICAgbGV0IGNoYXJzID0gIiI7CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKKyAgICAgICAgY29uc3QgY29kZSA9IGJ5dGVzLmNoYXJDb2RlQXQoaSkgKiAyNTYgKyBieXRlcy5jaGFyQ29kZUF0KGkgKyAxKTsKKworICAgICAgICBpZiAoY29kZSA+PSAzMiAmJiBjb2RlIDwgMTI3ICYmIGNvZGUgIT09IDYwICYmIGNvZGUgIT09IDYyICYmIGNvZGUgIT09IDM4KSB7CisgICAgICAgICAgY2hhcnMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjaGFycyArPSAiJiN4IiArICgweDEwMDAwICsgY29kZSkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKSArICI7IjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gIj4iICsgY2hhcnM7CisgICAgfSk7CisgIH0KKworICBfcGFyc2UoeG1sRG9jdW1lbnQpIHsKKyAgICBsZXQgcmRmID0geG1sRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCisgICAgaWYgKHJkZi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAicmRmOnJkZiIpIHsKKyAgICAgIHJkZiA9IHJkZi5maXJzdENoaWxkOworCisgICAgICB3aGlsZSAocmRmICYmIHJkZi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAicmRmOnJkZiIpIHsKKyAgICAgICAgcmRmID0gcmRmLm5leHRTaWJsaW5nOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IG5vZGVOYW1lID0gcmRmID8gcmRmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsOworCisgICAgaWYgKCFyZGYgfHwgbm9kZU5hbWUgIT09ICJyZGY6cmRmIiB8fCAhcmRmLmhhc0NoaWxkTm9kZXMoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNoaWxkcmVuID0gcmRmLmNoaWxkTm9kZXM7CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBjb25zdCBkZXNjID0gY2hpbGRyZW5baV07CisKKyAgICAgIGlmIChkZXNjLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJyZGY6ZGVzY3JpcHRpb24iKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKGxldCBqID0gMCwgamogPSBkZXNjLmNoaWxkTm9kZXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICBpZiAoZGVzYy5jaGlsZE5vZGVzW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICIjdGV4dCIpIHsKKyAgICAgICAgICBjb25zdCBlbnRyeSA9IGRlc2MuY2hpbGROb2Rlc1tqXTsKKyAgICAgICAgICBjb25zdCBuYW1lID0gZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKworICAgICAgICAgIHRoaXMuX21ldGFkYXRhTWFwLnNldChuYW1lLCBlbnRyeS50ZXh0Q29udGVudC50cmltKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgZ2V0KG5hbWUpIHsKKyAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFNYXAuaGFzKG5hbWUpID8gdGhpcy5fbWV0YWRhdGFNYXAuZ2V0KG5hbWUpIDogbnVsbDsKKyAgfQorCisgIGdldEFsbCgpIHsKKyAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX21ldGFkYXRhTWFwKTsKKyAgfQorCisgIGhhcyhuYW1lKSB7CisgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhTWFwLmhhcyhuYW1lKTsKKyAgfQorCit9CisKK2V4cG9ydHMuTWV0YWRhdGEgPSBNZXRhZGF0YTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS9uZXR3b3JrLmpzIGIvbGliL2Rpc3BsYXkvbmV0d29yay5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMxZTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvbmV0d29yay5qcwpAQCAtMCwwICsxLDU1OCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGTmV0d29ya1N0cmVhbSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9uZXR3b3JrX3V0aWxzID0gcmVxdWlyZSgiLi9uZXR3b3JrX3V0aWxzLmpzIik7CisKKzsKK2NvbnN0IE9LX1JFU1BPTlNFID0gMjAwOworY29uc3QgUEFSVElBTF9DT05URU5UX1JFU1BPTlNFID0gMjA2OworCitmdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih4aHIpIHsKKyAgY29uc3QgZGF0YSA9IHhoci5yZXNwb25zZTsKKworICBpZiAodHlwZW9mIGRhdGEgIT09ICJzdHJpbmciKSB7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBjb25zdCBhcnJheSA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkYXRhKTsKKyAgcmV0dXJuIGFycmF5LmJ1ZmZlcjsKK30KKworY2xhc3MgTmV0d29ya01hbmFnZXIgeworICBjb25zdHJ1Y3Rvcih1cmwsIGFyZ3MpIHsKKyAgICB0aGlzLnVybCA9IHVybDsKKyAgICBhcmdzID0gYXJncyB8fCB7fTsKKyAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3QodXJsKTsKKyAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgYXJncy5odHRwSGVhZGVycyB8fCB7fTsKKyAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGFyZ3Mud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlOworCisgICAgdGhpcy5nZXRYaHIgPSBhcmdzLmdldFhociB8fCBmdW5jdGlvbiBOZXR3b3JrTWFuYWdlcl9nZXRYaHIoKSB7CisgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgICAgfTsKKworICAgIHRoaXMuY3VyclhocklkID0gMDsKKyAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCwgbGlzdGVuZXJzKSB7CisgICAgY29uc3QgYXJncyA9IHsKKyAgICAgIGJlZ2luLAorICAgICAgZW5kCisgICAgfTsKKworICAgIGZvciAoY29uc3QgcHJvcCBpbiBsaXN0ZW5lcnMpIHsKKyAgICAgIGFyZ3NbcHJvcF0gPSBsaXN0ZW5lcnNbcHJvcF07CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMucmVxdWVzdChhcmdzKTsKKyAgfQorCisgIHJlcXVlc3RGdWxsKGxpc3RlbmVycykgeworICAgIHJldHVybiB0aGlzLnJlcXVlc3QobGlzdGVuZXJzKTsKKyAgfQorCisgIHJlcXVlc3QoYXJncykgeworICAgIGNvbnN0IHhociA9IHRoaXMuZ2V0WGhyKCk7CisgICAgY29uc3QgeGhySWQgPSB0aGlzLmN1cnJYaHJJZCsrOworICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdID0geworICAgICAgeGhyCisgICAgfTsKKyAgICB4aHIub3BlbigiR0VUIiwgdGhpcy51cmwpOworICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFsczsKKworICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5odHRwSGVhZGVycykgeworICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmh0dHBIZWFkZXJzW3Byb3BlcnR5XTsKKworICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKHByb3BlcnR5LCB2YWx1ZSk7CisgICAgfQorCisgICAgaWYgKHRoaXMuaXNIdHRwICYmICJiZWdpbiIgaW4gYXJncyAmJiAiZW5kIiBpbiBhcmdzKSB7CisgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiUmFuZ2UiLCBgYnl0ZXM9JHthcmdzLmJlZ2lufS0ke2FyZ3MuZW5kIC0gMX1gKTsKKyAgICAgIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFOworICAgIH0gZWxzZSB7CisgICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9IE9LX1JFU1BPTlNFOworICAgIH0KKworICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOworCisgICAgaWYgKGFyZ3Mub25FcnJvcikgeworICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZ0KSB7CisgICAgICAgIGFyZ3Mub25FcnJvcih4aHIuc3RhdHVzKTsKKyAgICAgIH07CisgICAgfQorCisgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMsIHhocklkKTsKKyAgICB4aHIub25wcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMsIHhocklkKTsKKyAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCA9IGFyZ3Mub25IZWFkZXJzUmVjZWl2ZWQ7CisgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lID0gYXJncy5vbkRvbmU7CisgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvciA9IGFyZ3Mub25FcnJvcjsKKyAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzID0gYXJncy5vblByb2dyZXNzOworICAgIHhoci5zZW5kKG51bGwpOworICAgIHJldHVybiB4aHJJZDsKKyAgfQorCisgIG9uUHJvZ3Jlc3MoeGhySWQsIGV2dCkgeworICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdOworCisgICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzKSB7CisgICAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzKGV2dCk7CisgICAgfQorICB9CisKKyAgb25TdGF0ZUNoYW5nZSh4aHJJZCwgZXZ0KSB7CisgICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07CisKKyAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgeGhyID0gcGVuZGluZ1JlcXVlc3QueGhyOworCisgICAgaWYgKHhoci5yZWFkeVN0YXRlID49IDIgJiYgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQpIHsKKyAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkKCk7CisgICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQ7CisgICAgfQorCisgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCEoeGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTsKKworICAgIGlmICh4aHIuc3RhdHVzID09PSAwICYmIHRoaXMuaXNIdHRwKSB7CisgICAgICBpZiAocGVuZGluZ1JlcXVlc3Qub25FcnJvcikgeworICAgICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yKHhoci5zdGF0dXMpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgeGhyU3RhdHVzID0geGhyLnN0YXR1cyB8fCBPS19SRVNQT05TRTsKKyAgICBjb25zdCBva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ID0geGhyU3RhdHVzID09PSBPS19SRVNQT05TRSAmJiBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9PT0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFOworCisgICAgaWYgKCFva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ICYmIHhoclN0YXR1cyAhPT0gcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMpIHsKKyAgICAgIGlmIChwZW5kaW5nUmVxdWVzdC5vbkVycm9yKSB7CisgICAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IoeGhyLnN0YXR1cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaHVuayA9IGdldEFycmF5QnVmZmVyKHhocik7CisKKyAgICBpZiAoeGhyU3RhdHVzID09PSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UpIHsKKyAgICAgIGNvbnN0IHJhbmdlSGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVJhbmdlIik7CisgICAgICBjb25zdCBtYXRjaGVzID0gL2J5dGVzIChcZCspLShcZCspXC8oXGQrKS8uZXhlYyhyYW5nZUhlYWRlcik7CisgICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoeworICAgICAgICBiZWdpbjogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLAorICAgICAgICBjaHVuaworICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChjaHVuaykgeworICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHsKKyAgICAgICAgYmVnaW46IDAsCisgICAgICAgIGNodW5rCisgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IpIHsKKyAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IoeGhyLnN0YXR1cyk7CisgICAgfQorICB9CisKKyAgZ2V0UmVxdWVzdFhocih4aHJJZCkgeworICAgIHJldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0ueGhyOworICB9CisKKyAgaXNQZW5kaW5nUmVxdWVzdCh4aHJJZCkgeworICAgIHJldHVybiB4aHJJZCBpbiB0aGlzLnBlbmRpbmdSZXF1ZXN0czsKKyAgfQorCisgIGFib3J0UmVxdWVzdCh4aHJJZCkgeworICAgIGNvbnN0IHhociA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7CisgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTsKKyAgICB4aHIuYWJvcnQoKTsKKyAgfQorCit9CisKK2NsYXNzIFBERk5ldHdvcmtTdHJlYW0geworICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHsKKyAgICB0aGlzLl9zb3VyY2UgPSBzb3VyY2U7CisgICAgdGhpcy5fbWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcihzb3VyY2UudXJsLCB7CisgICAgICBodHRwSGVhZGVyczogc291cmNlLmh0dHBIZWFkZXJzLAorICAgICAgd2l0aENyZWRlbnRpYWxzOiBzb3VyY2Uud2l0aENyZWRlbnRpYWxzCisgICAgfSk7CisgICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7CisgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsOworICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTsKKyAgfQorCisgIF9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZChyZWFkZXIpIHsKKyAgICBjb25zdCBpID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5pbmRleE9mKHJlYWRlcik7CisKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNwbGljZShpLCAxKTsKKyAgICB9CisgIH0KKworICBnZXRGdWxsUmVhZGVyKCkgeworICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERk5ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTsKKyAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgdGhpcy5fc291cmNlKTsKKyAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7CisgIH0KKworICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CisgICAgY29uc3QgcmVhZGVyID0gbmV3IFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgYmVnaW4sIGVuZCk7CisgICAgcmVhZGVyLm9uQ2xvc2VkID0gdGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTsKKworICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpOworCisgICAgcmV0dXJuIHJlYWRlcjsKKyAgfQorCisgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikgeworICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgeworICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfQorCisgICAgY29uc3QgcmVhZGVycyA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCk7CisKKyAgICByZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJlYWRlcikgeworICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pOworICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5QREZOZXR3b3JrU3RyZWFtID0gUERGTmV0d29ya1N0cmVhbTsKKworY2xhc3MgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyIHsKKyAgY29uc3RydWN0b3IobWFuYWdlciwgc291cmNlKSB7CisgICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7CisgICAgY29uc3QgYXJncyA9IHsKKyAgICAgIG9uSGVhZGVyc1JlY2VpdmVkOiB0aGlzLl9vbkhlYWRlcnNSZWNlaXZlZC5iaW5kKHRoaXMpLAorICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSwKKyAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSwKKyAgICAgIG9uUHJvZ3Jlc3M6IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKQorICAgIH07CisgICAgdGhpcy5fdXJsID0gc291cmNlLnVybDsKKyAgICB0aGlzLl9mdWxsUmVxdWVzdElkID0gbWFuYWdlci5yZXF1ZXN0RnVsbChhcmdzKTsKKyAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7CisgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CisgICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7CisKKyAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHsKKyAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHRydWU7CisgICAgfQorCisgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7CisgICAgdGhpcy5fY2FjaGVkQ2h1bmtzID0gW107CisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKyAgICB0aGlzLl9kb25lID0gZmFsc2U7CisgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsOworICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CisgIH0KKworICBfb25IZWFkZXJzUmVjZWl2ZWQoKSB7CisgICAgY29uc3QgZnVsbFJlcXVlc3RYaHJJZCA9IHRoaXMuX2Z1bGxSZXF1ZXN0SWQ7CisKKyAgICBjb25zdCBmdWxsUmVxdWVzdFhociA9IHRoaXMuX21hbmFnZXIuZ2V0UmVxdWVzdFhocihmdWxsUmVxdWVzdFhocklkKTsKKworICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiB7CisgICAgICByZXR1cm4gZnVsbFJlcXVlc3RYaHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7CisgICAgfTsKKworICAgIGNvbnN0IHsKKyAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cywKKyAgICAgIHN1Z2dlc3RlZExlbmd0aAorICAgIH0gPSAoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHsKKyAgICAgIGdldFJlc3BvbnNlSGVhZGVyLAorICAgICAgaXNIdHRwOiB0aGlzLl9tYW5hZ2VyLmlzSHR0cCwKKyAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSwKKyAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlCisgICAgfSk7CisKKyAgICBpZiAoYWxsb3dSYW5nZVJlcXVlc3RzKSB7CisgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7CisgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpOworCisgICAgaWYgKHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHsKKyAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KGZ1bGxSZXF1ZXN0WGhySWQpOworICAgIH0KKworICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICB9CisKKyAgX29uRG9uZShhcmdzKSB7CisgICAgaWYgKGFyZ3MpIHsKKyAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7CisgICAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTsKKworICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICB2YWx1ZTogYXJncy5jaHVuaywKKyAgICAgICAgICBkb25lOiBmYWxzZQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX2NhY2hlZENodW5rcy5wdXNoKGFyZ3MuY2h1bmspOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuX2RvbmUgPSB0cnVlOworCisgICAgaWYgKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPiAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHsKKyAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgIH0KKworICBfb25FcnJvcihzdGF0dXMpIHsKKyAgICBjb25zdCB1cmwgPSB0aGlzLl91cmw7CisgICAgY29uc3QgZXhjZXB0aW9uID0gKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHN0YXR1cywgdXJsKTsKKyAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGV4Y2VwdGlvbjsKKworICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KGV4Y2VwdGlvbik7CisKKyAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KGV4Y2VwdGlvbik7CisgICAgfSk7CisKKyAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworICAgIHRoaXMuX2NhY2hlZENodW5rcyA9IFtdOworICB9CisKKyAgX29uUHJvZ3Jlc3MoZGF0YSkgeworICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHsKKyAgICAgIHRoaXMub25Qcm9ncmVzcyh7CisgICAgICAgIGxvYWRlZDogZGF0YS5sb2FkZWQsCisgICAgICAgIHRvdGFsOiBkYXRhLmxlbmd0aENvbXB1dGFibGUgPyBkYXRhLnRvdGFsIDogdGhpcy5fY29udGVudExlbmd0aAorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgZ2V0IGZpbGVuYW1lKCkgeworICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTsKKyAgfQorCisgIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOworICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgfQorCisgIGdldCBjb250ZW50TGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoOworICB9CisKKyAgZ2V0IGhlYWRlcnNSZWFkeSgpIHsKKyAgICByZXR1cm4gdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHsKKyAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yOworICAgIH0KKworICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkgeworICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jYWNoZWRDaHVua3Muc2hpZnQoKTsKKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IGNodW5rLAorICAgICAgICBkb25lOiBmYWxzZQorICAgICAgfTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fZG9uZSkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfTsKKyAgICB9CisKKyAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKworICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpOworCisgICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7CisgIH0KKworICBjYW5jZWwocmVhc29uKSB7CisgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOworCisgICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHsKKyAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisKKyAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpKSB7CisgICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKTsKKyAgICB9CisKKyAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7CisgIH0KKworfQorCitjbGFzcyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyIHsKKyAgY29uc3RydWN0b3IobWFuYWdlciwgYmVnaW4sIGVuZCkgeworICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyOworICAgIGNvbnN0IGFyZ3MgPSB7CisgICAgICBvbkRvbmU6IHRoaXMuX29uRG9uZS5iaW5kKHRoaXMpLAorICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpCisgICAgfTsKKyAgICB0aGlzLl9yZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBhcmdzKTsKKyAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDsKKyAgICB0aGlzLl9kb25lID0gZmFsc2U7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKyAgICB0aGlzLm9uQ2xvc2VkID0gbnVsbDsKKyAgfQorCisgIF9jbG9zZSgpIHsKKyAgICBpZiAodGhpcy5vbkNsb3NlZCkgeworICAgICAgdGhpcy5vbkNsb3NlZCh0aGlzKTsKKyAgICB9CisgIH0KKworICBfb25Eb25lKGRhdGEpIHsKKyAgICBjb25zdCBjaHVuayA9IGRhdGEuY2h1bms7CisKKyAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkgeworICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpOworCisgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgdmFsdWU6IGNodW5rLAorICAgICAgICBkb25lOiBmYWxzZQorICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7CisgICAgfQorCisgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKworICAgIHRoaXMuX2Nsb3NlKCk7CisgIH0KKworICBfb25Qcm9ncmVzcyhldnQpIHsKKyAgICBpZiAoIXRoaXMuaXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5vblByb2dyZXNzKSB7CisgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBhc3luYyByZWFkKCkgeworICAgIGlmICh0aGlzLl9xdWV1ZWRDaHVuayAhPT0gbnVsbCkgeworICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVuazsKKyAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlOiBjaHVuaywKKyAgICAgICAgZG9uZTogZmFsc2UKKyAgICAgIH07CisgICAgfQorCisgICAgaWYgKHRoaXMuX2RvbmUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH07CisgICAgfQorCisgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTsKKworICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgY2FuY2VsKHJlYXNvbikgeworICAgIHRoaXMuX2RvbmUgPSB0cnVlOworCisgICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHsKKyAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisKKyAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCkpIHsKKyAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCk7CisgICAgfQorCisgICAgdGhpcy5fY2xvc2UoKTsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2Rpc3BsYXkvbmV0d29ya191dGlscy5qcyBiL2xpYi9kaXNwbGF5L25ldHdvcmtfdXRpbHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiZDM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kaXNwbGF5L25ldHdvcmtfdXRpbHMuanMKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IgPSBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yOworZXhwb3J0cy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyID0gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcjsKK2V4cG9ydHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMgPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllczsKK2V4cG9ydHMudmFsaWRhdGVSZXNwb25zZVN0YXR1cyA9IHZhbGlkYXRlUmVzcG9uc2VTdGF0dXM7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfY29udGVudF9kaXNwb3NpdGlvbiA9IHJlcXVpcmUoIi4vY29udGVudF9kaXNwb3NpdGlvbi5qcyIpOworCitmdW5jdGlvbiB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7CisgIGdldFJlc3BvbnNlSGVhZGVyLAorICBpc0h0dHAsCisgIHJhbmdlQ2h1bmtTaXplLAorICBkaXNhYmxlUmFuZ2UKK30pIHsKKyAgKDAsIF91dGlsLmFzc2VydCkocmFuZ2VDaHVua1NpemUgPiAwLCAiUmFuZ2UgY2h1bmsgc2l6ZSBtdXN0IGJlIGxhcmdlciB0aGFuIHplcm8iKTsKKyAgY29uc3QgcmV0dXJuVmFsdWVzID0geworICAgIGFsbG93UmFuZ2VSZXF1ZXN0czogZmFsc2UsCisgICAgc3VnZ2VzdGVkTGVuZ3RoOiB1bmRlZmluZWQKKyAgfTsKKyAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiksIDEwKTsKKworICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkgeworICAgIHJldHVybiByZXR1cm5WYWx1ZXM7CisgIH0KKworICByZXR1cm5WYWx1ZXMuc3VnZ2VzdGVkTGVuZ3RoID0gbGVuZ3RoOworCisgIGlmIChsZW5ndGggPD0gMiAqIHJhbmdlQ2h1bmtTaXplKSB7CisgICAgcmV0dXJuIHJldHVyblZhbHVlczsKKyAgfQorCisgIGlmIChkaXNhYmxlUmFuZ2UgfHwgIWlzSHR0cCkgeworICAgIHJldHVybiByZXR1cm5WYWx1ZXM7CisgIH0KKworICBpZiAoZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSAhPT0gImJ5dGVzIikgeworICAgIHJldHVybiByZXR1cm5WYWx1ZXM7CisgIH0KKworICBjb25zdCBjb250ZW50RW5jb2RpbmcgPSBnZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpIHx8ICJpZGVudGl0eSI7CisKKyAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPT0gImlkZW50aXR5IikgeworICAgIHJldHVybiByZXR1cm5WYWx1ZXM7CisgIH0KKworICByZXR1cm5WYWx1ZXMuYWxsb3dSYW5nZVJlcXVlc3RzID0gdHJ1ZTsKKyAgcmV0dXJuIHJldHVyblZhbHVlczsKK30KKworZnVuY3Rpb24gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcikgeworICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSBnZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbiIpOworCisgIGlmIChjb250ZW50RGlzcG9zaXRpb24pIHsKKyAgICBsZXQgZmlsZW5hbWUgPSAoMCwgX2NvbnRlbnRfZGlzcG9zaXRpb24uZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKShjb250ZW50RGlzcG9zaXRpb24pOworCisgICAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKCIlIikpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbGVuYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7fQorICAgIH0KKworICAgIGlmICgvXC5wZGYkL2kudGVzdChmaWxlbmFtZSkpIHsKKyAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbnVsbDsKK30KKworZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihzdGF0dXMsIHVybCkgeworICBpZiAoc3RhdHVzID09PSA0MDQgfHwgc3RhdHVzID09PSAwICYmIHVybC5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CisgICAgcmV0dXJuIG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKCdNaXNzaW5nIFBERiAiJyArIHVybCArICciLicpOworICB9CisKKyAgcmV0dXJuIG5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlICgiICsgc3RhdHVzICsgJykgd2hpbGUgcmV0cmlldmluZyBQREYgIicgKyB1cmwgKyAnIi4nLCBzdGF0dXMpOworfQorCitmdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDY7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2Rpc3BsYXkvbm9kZV9zdHJlYW0uanMgYi9saWIvZGlzcGxheS9ub2RlX3N0cmVhbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTZjMTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvbm9kZV9zdHJlYW0uanMKQEAgLTAsMCArMSw0ODQgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERk5vZGVTdHJlYW0gPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfbmV0d29ya191dGlscyA9IHJlcXVpcmUoIi4vbmV0d29ya191dGlscy5qcyIpOworCis7CisKK2NvbnN0IGZzID0gcmVxdWlyZSgiZnMiKTsKKworY29uc3QgaHR0cCA9IHJlcXVpcmUoImh0dHAiKTsKKworY29uc3QgaHR0cHMgPSByZXF1aXJlKCJodHRwcyIpOworCitjb25zdCB1cmwgPSByZXF1aXJlKCJ1cmwiKTsKKworY29uc3QgZmlsZVVyaVJlZ2V4ID0gL15maWxlOlwvXC9cL1thLXpBLVpdOlwvLzsKKworZnVuY3Rpb24gcGFyc2VVcmwoc291cmNlVXJsKSB7CisgIGNvbnN0IHBhcnNlZFVybCA9IHVybC5wYXJzZShzb3VyY2VVcmwpOworCisgIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICJmaWxlOiIgfHwgcGFyc2VkVXJsLmhvc3QpIHsKKyAgICByZXR1cm4gcGFyc2VkVXJsOworICB9CisKKyAgaWYgKC9eW2Etel06Wy9cXF0vaS50ZXN0KHNvdXJjZVVybCkpIHsKKyAgICByZXR1cm4gdXJsLnBhcnNlKGBmaWxlOi8vLyR7c291cmNlVXJsfWApOworICB9CisKKyAgaWYgKCFwYXJzZWRVcmwuaG9zdCkgeworICAgIHBhcnNlZFVybC5wcm90b2NvbCA9ICJmaWxlOiI7CisgIH0KKworICByZXR1cm4gcGFyc2VkVXJsOworfQorCitjbGFzcyBQREZOb2RlU3RyZWFtIHsKKyAgY29uc3RydWN0b3Ioc291cmNlKSB7CisgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgdGhpcy51cmwgPSBwYXJzZVVybChzb3VyY2UudXJsKTsKKyAgICB0aGlzLmlzSHR0cCA9IHRoaXMudXJsLnByb3RvY29sID09PSAiaHR0cDoiIHx8IHRoaXMudXJsLnByb3RvY29sID09PSAiaHR0cHM6IjsKKyAgICB0aGlzLmlzRnNVcmwgPSB0aGlzLnVybC5wcm90b2NvbCA9PT0gImZpbGU6IjsKKyAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgc291cmNlLmh0dHBIZWFkZXJzIHx8IHt9OworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDsKKyAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107CisgIH0KKworICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPyB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5fbG9hZGVkIDogMDsKKyAgfQorCisgIGdldEZ1bGxSZWFkZXIoKSB7CisgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCAiUERGTm9kZVN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcykgOiBuZXcgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodGhpcyk7CisgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOworICB9CisKKyAgZ2V0UmFuZ2VSZWFkZXIoc3RhcnQsIGVuZCkgeworICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMuaXNGc1VybCA/IG5ldyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKSA6IG5ldyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgc3RhcnQsIGVuZCk7CisKKyAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmFuZ2VSZWFkZXIpOworCisgICAgcmV0dXJuIHJhbmdlUmVhZGVyOworICB9CisKKyAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7CisgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7CisgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisKKyAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKTsKKworICAgIHJlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocmVhZGVyKSB7CisgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLlBERk5vZGVTdHJlYW0gPSBQREZOb2RlU3RyZWFtOworCitjbGFzcyBCYXNlRnVsbFJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSkgeworICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7CisgICAgdGhpcy5fZG9uZSA9IGZhbHNlOworICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7CisgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CisgICAgdGhpcy5fbG9hZGVkID0gMDsKKyAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7CisgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTsKKyAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTsKKworICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkgeworICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTsKKyAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7CisgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsOworICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICB9CisKKyAgZ2V0IGhlYWRlcnNSZWFkeSgpIHsKKyAgICByZXR1cm4gdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIGdldCBmaWxlbmFtZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7CisgIH0KKworICBnZXQgY29udGVudExlbmd0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDsKKyAgfQorCisgIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOworICB9CisKKyAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgfQorCisgIGFzeW5jIHJlYWQoKSB7CisgICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTsKKworICAgIGlmICh0aGlzLl9kb25lKSB7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9OworICAgIH0KKworICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7CisgICAgfQorCisgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7CisKKyAgICBpZiAoY2h1bmsgPT09IG51bGwpIHsKKyAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgcmV0dXJuIHRoaXMucmVhZCgpOworICAgIH0KKworICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5sZW5ndGg7CisKKyAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7CisgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeworICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCwKKyAgICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGgKKyAgICAgIH0pOworICAgIH0KKworICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7CisgICAgcmV0dXJuIHsKKyAgICAgIHZhbHVlOiBidWZmZXIsCisgICAgICBkb25lOiBmYWxzZQorICAgIH07CisgIH0KKworICBjYW5jZWwocmVhc29uKSB7CisgICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0cmVhbSkgeworICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTsKKyAgfQorCisgIF9lcnJvcihyZWFzb24pIHsKKyAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjsKKworICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgfQorCisgIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkgeworICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07CisgICAgcmVhZGFibGVTdHJlYW0ub24oInJlYWRhYmxlIiwgKCkgPT4geworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIH0pOworICAgIHJlYWRhYmxlU3RyZWFtLm9uKCJlbmQiLCAoKSA9PiB7CisgICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7CisgICAgICB0aGlzLl9kb25lID0gdHJ1ZTsKKworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIH0pOworICAgIHJlYWRhYmxlU3RyZWFtLm9uKCJlcnJvciIsIHJlYXNvbiA9PiB7CisgICAgICB0aGlzLl9lcnJvcihyZWFzb24pOworICAgIH0pOworCisgICAgaWYgKCF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7CisgICAgICB0aGlzLl9lcnJvcihuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oInN0cmVhbWluZyBpcyBkaXNhYmxlZCIpKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHsKKyAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpOworICAgIH0KKyAgfQorCit9CisKK2NsYXNzIEJhc2VSYW5nZVJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSkgeworICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7CisgICAgdGhpcy5fZG9uZSA9IGZhbHNlOworICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICAgIHRoaXMuX2xvYWRlZCA9IDA7CisgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsOworICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7CisgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07CisgIH0KKworICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlOworCisgICAgaWYgKHRoaXMuX2RvbmUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH07CisgICAgfQorCisgICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7CisgICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjsKKyAgICB9CisKKyAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTsKKworICAgIGlmIChjaHVuayA9PT0gbnVsbCkgeworICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICByZXR1cm4gdGhpcy5yZWFkKCk7CisgICAgfQorCisgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDsKKworICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHsKKyAgICAgIHRoaXMub25Qcm9ncmVzcyh7CisgICAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkCisgICAgICB9KTsKKyAgICB9CisKKyAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShjaHVuaykuYnVmZmVyOworICAgIHJldHVybiB7CisgICAgICB2YWx1ZTogYnVmZmVyLAorICAgICAgZG9uZTogZmFsc2UKKyAgICB9OworICB9CisKKyAgY2FuY2VsKHJlYXNvbikgeworICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHsKKyAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHJlYXNvbik7CisgIH0KKworICBfZXJyb3IocmVhc29uKSB7CisgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247CisKKyAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgIH0KKworICBfc2V0UmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHsKKyAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtOworICAgIHJlYWRhYmxlU3RyZWFtLm9uKCJyZWFkYWJsZSIsICgpID0+IHsKKyAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICB9KTsKKyAgICByZWFkYWJsZVN0cmVhbS5vbigiZW5kIiwgKCkgPT4geworICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpOworICAgICAgdGhpcy5fZG9uZSA9IHRydWU7CisKKyAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICB9KTsKKyAgICByZWFkYWJsZVN0cmVhbS5vbigiZXJyb3IiLCByZWFzb24gPT4geworICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTsKKyAgICB9KTsKKworICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgeworICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7CisgICAgfQorICB9CisKK30KKworZnVuY3Rpb24gY3JlYXRlUmVxdWVzdE9wdGlvbnMocGFyc2VkVXJsLCBoZWFkZXJzKSB7CisgIHJldHVybiB7CisgICAgcHJvdG9jb2w6IHBhcnNlZFVybC5wcm90b2NvbCwKKyAgICBhdXRoOiBwYXJzZWRVcmwuYXV0aCwKKyAgICBob3N0OiBwYXJzZWRVcmwuaG9zdG5hbWUsCisgICAgcG9ydDogcGFyc2VkVXJsLnBvcnQsCisgICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsCisgICAgbWV0aG9kOiAiR0VUIiwKKyAgICBoZWFkZXJzCisgIH07Cit9CisKK2NsYXNzIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0pIHsKKyAgICBzdXBlcihzdHJlYW0pOworCisgICAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSByZXNwb25zZSA9PiB7CisgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7CisgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGICIke3RoaXMuX3VybH0iLmApOworICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yOworCisgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTsKKworICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmhlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXTsKKyAgICAgIH07CisKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLAorICAgICAgICBzdWdnZXN0ZWRMZW5ndGgKKyAgICAgIH0gPSAoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHsKKyAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsCisgICAgICAgIGlzSHR0cDogc3RyZWFtLmlzSHR0cCwKKyAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLAorICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZQorICAgICAgfSk7CisgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gYWxsb3dSYW5nZVJlcXVlc3RzOworICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoOworICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpOworICAgIH07CisKKyAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDsKKworICAgIGlmICh0aGlzLl91cmwucHJvdG9jb2wgPT09ICJodHRwOiIpIHsKKyAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCBzdHJlYW0uaHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpOworICAgIH0KKworICAgIHRoaXMuX3JlcXVlc3Qub24oImVycm9yIiwgcmVhc29uID0+IHsKKyAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uOworCisgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTsKKyAgICB9KTsKKworICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7CisgIH0KKworfQorCitjbGFzcyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0sIHN0YXJ0LCBlbmQpIHsKKyAgICBzdXBlcihzdHJlYW0pOworICAgIHRoaXMuX2h0dHBIZWFkZXJzID0ge307CisKKyAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHN0cmVhbS5odHRwSGVhZGVycykgeworICAgICAgY29uc3QgdmFsdWUgPSBzdHJlYW0uaHR0cEhlYWRlcnNbcHJvcGVydHldOworCisgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAidW5kZWZpbmVkIikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5faHR0cEhlYWRlcnNbcHJvcGVydHldID0gdmFsdWU7CisgICAgfQorCisgICAgdGhpcy5faHR0cEhlYWRlcnMuUmFuZ2UgPSBgYnl0ZXM9JHtzdGFydH0tJHtlbmQgLSAxfWA7CisKKyAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHJlc3BvbnNlID0+IHsKKyAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHsKKyAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgIiR7dGhpcy5fdXJsfSIuYCk7CisgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0ocmVzcG9uc2UpOworICAgIH07CisKKyAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDsKKworICAgIGlmICh0aGlzLl91cmwucHJvdG9jb2wgPT09ICJodHRwOiIpIHsKKyAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTsKKyAgICB9CisKKyAgICB0aGlzLl9yZXF1ZXN0Lm9uKCJlcnJvciIsIHJlYXNvbiA9PiB7CisgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjsKKyAgICB9KTsKKworICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7CisgIH0KKworfQorCitjbGFzcyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0pIHsKKyAgICBzdXBlcihzdHJlYW0pOworICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuX3VybC5wYXRoKTsKKworICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHsKKyAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cLy8sICIiKTsKKyAgICB9CisKKyAgICBmcy5sc3RhdChwYXRoLCAoZXJyb3IsIHN0YXQpID0+IHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gIkVOT0VOVCIpIHsKKyAgICAgICAgICBlcnJvciA9IG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiAiJHtwYXRofSIuYCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yOworCisgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3RhdC5zaXplOworCisgICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgpKTsKKworICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIH0pOworICB9CisKK30KKworY2xhc3MgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0sIHN0YXJ0LCBlbmQpIHsKKyAgICBzdXBlcihzdHJlYW0pOworICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuX3VybC5wYXRoKTsKKworICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHsKKyAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cLy8sICIiKTsKKyAgICB9CisKKyAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgsIHsKKyAgICAgIHN0YXJ0LAorICAgICAgZW5kOiBlbmQgLSAxCisgICAgfSkpOworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS9ub2RlX3V0aWxzLmpzIGIvbGliL2Rpc3BsYXkvbm9kZV91dGlscy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODI1MzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvbm9kZV91dGlscy5qcwpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgPSBleHBvcnRzLk5vZGVDYW52YXNGYWN0b3J5ID0gdm9pZCAwOworCit2YXIgX2Rpc3BsYXlfdXRpbHMgPSByZXF1aXJlKCIuL2Rpc3BsYXlfdXRpbHMuanMiKTsKKwordmFyIF9pc19ub2RlID0gcmVxdWlyZSgiLi4vc2hhcmVkL2lzX25vZGUuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKworbGV0IE5vZGVDYW52YXNGYWN0b3J5ID0gY2xhc3MgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJOb3QgaW1wbGVtZW50ZWQ6IE5vZGVDYW52YXNGYWN0b3J5Iik7CisgIH0KKworfTsKK2V4cG9ydHMuTm9kZUNhbnZhc0ZhY3RvcnkgPSBOb2RlQ2FudmFzRmFjdG9yeTsKK2xldCBOb2RlQ01hcFJlYWRlckZhY3RvcnkgPSBjbGFzcyB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIk5vdCBpbXBsZW1lbnRlZDogTm9kZUNNYXBSZWFkZXJGYWN0b3J5Iik7CisgIH0KKworfTsKK2V4cG9ydHMuTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gTm9kZUNNYXBSZWFkZXJGYWN0b3J5OworCitpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgZXhwb3J0cy5Ob2RlQ2FudmFzRmFjdG9yeSA9IE5vZGVDYW52YXNGYWN0b3J5ID0gY2xhc3MgZXh0ZW5kcyBfZGlzcGxheV91dGlscy5CYXNlQ2FudmFzRmFjdG9yeSB7CisgICAgY3JlYXRlKHdpZHRoLCBoZWlnaHQpIHsKKyAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjYW52YXMgc2l6ZSIpOworICAgICAgfQorCisgICAgICBjb25zdCBDYW52YXMgPSByZXF1aXJlKCJjYW52YXMiKTsKKworICAgICAgY29uc3QgY2FudmFzID0gQ2FudmFzLmNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIGNhbnZhcywKKyAgICAgICAgY29udGV4dDogY2FudmFzLmdldENvbnRleHQoIjJkIikKKyAgICAgIH07CisgICAgfQorCisgIH07CisgIGV4cG9ydHMuTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gY2xhc3MgZXh0ZW5kcyBfZGlzcGxheV91dGlscy5CYXNlQ01hcFJlYWRlckZhY3RvcnkgeworICAgIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHsKKyAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgICAgIGNvbnN0IGZzID0gcmVxdWlyZSgiZnMiKTsKKworICAgICAgICBmcy5yZWFkRmlsZSh1cmwsIChlcnJvciwgZGF0YSkgPT4geworICAgICAgICAgIGlmIChlcnJvciB8fCAhZGF0YSkgeworICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvcikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHJlc29sdmUoeworICAgICAgICAgICAgY01hcERhdGE6IG5ldyBVaW50OEFycmF5KGRhdGEpLAorICAgICAgICAgICAgY29tcHJlc3Npb25UeXBlCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorCisgIH07Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2Rpc3BsYXkvb3B0aW9uYWxfY29udGVudF9jb25maWcuanMgYi9saWIvZGlzcGxheS9vcHRpb25hbF9jb250ZW50X2NvbmZpZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjJlNGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvb3B0aW9uYWxfY29udGVudF9jb25maWcuanMKQEAgLTAsMCArMSwxODQgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKworY2xhc3MgT3B0aW9uYWxDb250ZW50R3JvdXAgeworICBjb25zdHJ1Y3RvcihuYW1lLCBpbnRlbnQpIHsKKyAgICB0aGlzLnZpc2libGUgPSB0cnVlOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5pbnRlbnQgPSBpbnRlbnQ7CisgIH0KKworfQorCitjbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcgeworICBjb25zdHJ1Y3RvcihkYXRhKSB7CisgICAgdGhpcy5uYW1lID0gbnVsbDsKKyAgICB0aGlzLmNyZWF0b3IgPSBudWxsOworICAgIHRoaXMuX29yZGVyID0gbnVsbDsKKyAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwKCk7CisKKyAgICBpZiAoZGF0YSA9PT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTsKKyAgICB0aGlzLmNyZWF0b3IgPSBkYXRhLmNyZWF0b3I7CisgICAgdGhpcy5fb3JkZXIgPSBkYXRhLm9yZGVyOworCisgICAgZm9yIChjb25zdCBncm91cCBvZiBkYXRhLmdyb3VwcykgeworICAgICAgdGhpcy5fZ3JvdXBzLnNldChncm91cC5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwLm5hbWUsIGdyb3VwLmludGVudCkpOworICAgIH0KKworICAgIGlmIChkYXRhLmJhc2VTdGF0ZSA9PT0gIk9GRiIpIHsKKyAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fZ3JvdXBzKSB7CisgICAgICAgIGdyb3VwLnZpc2libGUgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IG9uIG9mIGRhdGEub24pIHsKKyAgICAgIHRoaXMuX2dyb3Vwcy5nZXQob24pLnZpc2libGUgPSB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3Qgb2ZmIG9mIGRhdGEub2ZmKSB7CisgICAgICB0aGlzLl9ncm91cHMuZ2V0KG9mZikudmlzaWJsZSA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIGlzVmlzaWJsZShncm91cCkgeworICAgIGlmIChncm91cC50eXBlID09PSAiT0NHIikgeworICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwLmlkKSkgeworICAgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2dyb3VwLmlkfWApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXAuaWQpLnZpc2libGU7CisgICAgfSBlbHNlIGlmIChncm91cC50eXBlID09PSAiT0NNRCIpIHsKKyAgICAgIGlmIChncm91cC5leHByZXNzaW9uKSB7CisgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVmlzaWJpbGl0eSBleHByZXNzaW9uIG5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgfQorCisgICAgICBpZiAoIWdyb3VwLnBvbGljeSB8fCBncm91cC5wb2xpY3kgPT09ICJBbnlPbiIpIHsKKyAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHsKKyAgICAgICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoaWQpKSB7CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRoaXMuX2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSAiQWxsT24iKSB7CisgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7CisgICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmdldChpZCkudmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09ICJBbnlPZmYiKSB7CisgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7CisgICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmdldChpZCkudmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09ICJBbGxPZmYiKSB7CisgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7CisgICAgICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGlkKSkgeworICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgICgwLCBfdXRpbC53YXJuKShgVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSAke2dyb3VwLnBvbGljeX0uYCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAoMCwgX3V0aWwud2FybikoYFVua25vd24gZ3JvdXAgdHlwZSAke2dyb3VwLnR5cGV9LmApOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc2V0VmlzaWJpbGl0eShpZCwgdmlzaWJsZSA9IHRydWUpIHsKKyAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoaWQpKSB7CisgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX2dyb3Vwcy5nZXQoaWQpLnZpc2libGUgPSAhIXZpc2libGU7CisgIH0KKworICBnZXRPcmRlcigpIHsKKyAgICBpZiAoIXRoaXMuX2dyb3Vwcy5zaXplKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fb3JkZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLl9vcmRlci5zbGljZSgpOworICAgIH0KKworICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2dyb3Vwcy5rZXlzKCkpOworICB9CisKKyAgZ2V0R3JvdXBzKCkgeworICAgIGlmICghdGhpcy5fZ3JvdXBzLnNpemUpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fZ3JvdXBzKTsKKyAgfQorCisgIGdldEdyb3VwKGlkKSB7CisgICAgcmV0dXJuIHRoaXMuX2dyb3Vwcy5nZXQoaWQpIHx8IG51bGw7CisgIH0KKworfQorCitleHBvcnRzLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IE9wdGlvbmFsQ29udGVudENvbmZpZzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS9wYXR0ZXJuX2hlbHBlci5qcyBiL2xpYi9kaXNwbGF5L3BhdHRlcm5faGVscGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmQ4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGlzcGxheS9wYXR0ZXJuX2hlbHBlci5qcwpAQCAtMCwwICsxLDQ5NiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIgPSBnZXRTaGFkaW5nUGF0dGVybkZyb21JUjsKK2V4cG9ydHMuVGlsaW5nUGF0dGVybiA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIFNoYWRpbmdJUnMgPSB7fTsKKworZnVuY3Rpb24gYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpIHsKKyAgaWYgKCFiYm94IHx8IHR5cGVvZiBQYXRoMkQgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTsKKyAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07CisgIGNvbnN0IHJlZ2lvbiA9IG5ldyBQYXRoMkQoKTsKKyAgcmVnaW9uLnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7CisgIGN0eC5jbGlwKHJlZ2lvbik7Cit9CisKK1NoYWRpbmdJUnMuUmFkaWFsQXhpYWwgPSB7CisgIGZyb21JUjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZnJvbUlSKHJhdykgeworICAgIHZhciB0eXBlID0gcmF3WzFdOworICAgIHZhciBiYm94ID0gcmF3WzJdOworICAgIHZhciBjb2xvclN0b3BzID0gcmF3WzNdOworICAgIHZhciBwMCA9IHJhd1s0XTsKKyAgICB2YXIgcDEgPSByYXdbNV07CisgICAgdmFyIHIwID0gcmF3WzZdOworICAgIHZhciByMSA9IHJhd1s3XTsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gUmFkaWFsQXhpYWxfZ2V0UGF0dGVybihjdHgpIHsKKyAgICAgICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpOworICAgICAgICB2YXIgZ3JhZDsKKworICAgICAgICBpZiAodHlwZSA9PT0gImF4aWFsIikgeworICAgICAgICAgIGdyYWQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQocDBbMF0sIHAwWzFdLCBwMVswXSwgcDFbMV0pOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJyYWRpYWwiKSB7CisgICAgICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudChwMFswXSwgcDBbMV0sIHIwLCBwMVswXSwgcDFbMV0sIHIxKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNvbG9yU3RvcHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgICAgIHZhciBjID0gY29sb3JTdG9wc1tpXTsKKyAgICAgICAgICBncmFkLmFkZENvbG9yU3RvcChjWzBdLCBjWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBncmFkOworICAgICAgfQorICAgIH07CisgIH0KK307CisKK3ZhciBjcmVhdGVNZXNoQ2FudmFzID0gZnVuY3Rpb24gY3JlYXRlTWVzaENhbnZhc0Nsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwMSwgcDIsIHAzLCBjMSwgYzIsIGMzKSB7CisgICAgdmFyIGNvb3JkcyA9IGNvbnRleHQuY29vcmRzLAorICAgICAgICBjb2xvcnMgPSBjb250ZXh0LmNvbG9yczsKKyAgICB2YXIgYnl0ZXMgPSBkYXRhLmRhdGEsCisgICAgICAgIHJvd1NpemUgPSBkYXRhLndpZHRoICogNDsKKyAgICB2YXIgdG1wOworCisgICAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHsKKyAgICAgIHRtcCA9IHAxOworICAgICAgcDEgPSBwMjsKKyAgICAgIHAyID0gdG1wOworICAgICAgdG1wID0gYzE7CisgICAgICBjMSA9IGMyOworICAgICAgYzIgPSB0bXA7CisgICAgfQorCisgICAgaWYgKGNvb3Jkc1twMiArIDFdID4gY29vcmRzW3AzICsgMV0pIHsKKyAgICAgIHRtcCA9IHAyOworICAgICAgcDIgPSBwMzsKKyAgICAgIHAzID0gdG1wOworICAgICAgdG1wID0gYzI7CisgICAgICBjMiA9IGMzOworICAgICAgYzMgPSB0bXA7CisgICAgfQorCisgICAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHsKKyAgICAgIHRtcCA9IHAxOworICAgICAgcDEgPSBwMjsKKyAgICAgIHAyID0gdG1wOworICAgICAgdG1wID0gYzE7CisgICAgICBjMSA9IGMyOworICAgICAgYzIgPSB0bXA7CisgICAgfQorCisgICAgdmFyIHgxID0gKGNvb3Jkc1twMV0gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7CisgICAgdmFyIHkxID0gKGNvb3Jkc1twMSArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZOworICAgIHZhciB4MiA9IChjb29yZHNbcDJdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYOworICAgIHZhciB5MiA9IChjb29yZHNbcDIgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTsKKyAgICB2YXIgeDMgPSAoY29vcmRzW3AzXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDsKKyAgICB2YXIgeTMgPSAoY29vcmRzW3AzICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7CisKKyAgICBpZiAoeTEgPj0geTMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgYzFyID0gY29sb3JzW2MxXSwKKyAgICAgICAgYzFnID0gY29sb3JzW2MxICsgMV0sCisgICAgICAgIGMxYiA9IGNvbG9yc1tjMSArIDJdOworICAgIHZhciBjMnIgPSBjb2xvcnNbYzJdLAorICAgICAgICBjMmcgPSBjb2xvcnNbYzIgKyAxXSwKKyAgICAgICAgYzJiID0gY29sb3JzW2MyICsgMl07CisgICAgdmFyIGMzciA9IGNvbG9yc1tjM10sCisgICAgICAgIGMzZyA9IGNvbG9yc1tjMyArIDFdLAorICAgICAgICBjM2IgPSBjb2xvcnNbYzMgKyAyXTsKKyAgICB2YXIgbWluWSA9IE1hdGgucm91bmQoeTEpLAorICAgICAgICBtYXhZID0gTWF0aC5yb3VuZCh5Myk7CisgICAgdmFyIHhhLCBjYXIsIGNhZywgY2FiOworICAgIHZhciB4YiwgY2JyLCBjYmcsIGNiYjsKKworICAgIGZvciAodmFyIHkgPSBtaW5ZOyB5IDw9IG1heFk7IHkrKykgeworICAgICAgaWYgKHkgPCB5MikgeworICAgICAgICBsZXQgazsKKworICAgICAgICBpZiAoeSA8IHkxKSB7CisgICAgICAgICAgayA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoeTEgPT09IHkyKSB7CisgICAgICAgICAgayA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgayA9ICh5MSAtIHkpIC8gKHkxIC0geTIpOworICAgICAgICB9CisKKyAgICAgICAgeGEgPSB4MSAtICh4MSAtIHgyKSAqIGs7CisgICAgICAgIGNhciA9IGMxciAtIChjMXIgLSBjMnIpICogazsKKyAgICAgICAgY2FnID0gYzFnIC0gKGMxZyAtIGMyZykgKiBrOworICAgICAgICBjYWIgPSBjMWIgLSAoYzFiIC0gYzJiKSAqIGs7CisgICAgICB9IGVsc2UgeworICAgICAgICBsZXQgazsKKworICAgICAgICBpZiAoeSA+IHkzKSB7CisgICAgICAgICAgayA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoeTIgPT09IHkzKSB7CisgICAgICAgICAgayA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgayA9ICh5MiAtIHkpIC8gKHkyIC0geTMpOworICAgICAgICB9CisKKyAgICAgICAgeGEgPSB4MiAtICh4MiAtIHgzKSAqIGs7CisgICAgICAgIGNhciA9IGMyciAtIChjMnIgLSBjM3IpICogazsKKyAgICAgICAgY2FnID0gYzJnIC0gKGMyZyAtIGMzZykgKiBrOworICAgICAgICBjYWIgPSBjMmIgLSAoYzJiIC0gYzNiKSAqIGs7CisgICAgICB9CisKKyAgICAgIGxldCBrOworCisgICAgICBpZiAoeSA8IHkxKSB7CisgICAgICAgIGsgPSAwOworICAgICAgfSBlbHNlIGlmICh5ID4geTMpIHsKKyAgICAgICAgayA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBrID0gKHkxIC0geSkgLyAoeTEgLSB5Myk7CisgICAgICB9CisKKyAgICAgIHhiID0geDEgLSAoeDEgLSB4MykgKiBrOworICAgICAgY2JyID0gYzFyIC0gKGMxciAtIGMzcikgKiBrOworICAgICAgY2JnID0gYzFnIC0gKGMxZyAtIGMzZykgKiBrOworICAgICAgY2JiID0gYzFiIC0gKGMxYiAtIGMzYikgKiBrOworICAgICAgdmFyIHgxXyA9IE1hdGgucm91bmQoTWF0aC5taW4oeGEsIHhiKSk7CisgICAgICB2YXIgeDJfID0gTWF0aC5yb3VuZChNYXRoLm1heCh4YSwgeGIpKTsKKyAgICAgIHZhciBqID0gcm93U2l6ZSAqIHkgKyB4MV8gKiA0OworCisgICAgICBmb3IgKHZhciB4ID0geDFfOyB4IDw9IHgyXzsgeCsrKSB7CisgICAgICAgIGsgPSAoeGEgLSB4KSAvICh4YSAtIHhiKTsKKworICAgICAgICBpZiAoayA8IDApIHsKKyAgICAgICAgICBrID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChrID4gMSkgeworICAgICAgICAgIGsgPSAxOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZXNbaisrXSA9IGNhciAtIChjYXIgLSBjYnIpICogayB8IDA7CisgICAgICAgIGJ5dGVzW2orK10gPSBjYWcgLSAoY2FnIC0gY2JnKSAqIGsgfCAwOworICAgICAgICBieXRlc1tqKytdID0gY2FiIC0gKGNhYiAtIGNiYikgKiBrIHwgMDsKKyAgICAgICAgYnl0ZXNbaisrXSA9IDI1NTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZSwgY29udGV4dCkgeworICAgIHZhciBwcyA9IGZpZ3VyZS5jb29yZHM7CisgICAgdmFyIGNzID0gZmlndXJlLmNvbG9yczsKKyAgICB2YXIgaSwgaWk7CisKKyAgICBzd2l0Y2ggKGZpZ3VyZS50eXBlKSB7CisgICAgICBjYXNlICJsYXR0aWNlIjoKKyAgICAgICAgdmFyIHZlcnRpY2VzUGVyUm93ID0gZmlndXJlLnZlcnRpY2VzUGVyUm93OworICAgICAgICB2YXIgcm93cyA9IE1hdGguZmxvb3IocHMubGVuZ3RoIC8gdmVydGljZXNQZXJSb3cpIC0gMTsKKyAgICAgICAgdmFyIGNvbHMgPSB2ZXJ0aWNlc1BlclJvdyAtIDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykgeworICAgICAgICAgIHZhciBxID0gaSAqIHZlcnRpY2VzUGVyUm93OworCisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb2xzOyBqKyssIHErKykgeworICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3FdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3FdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pOworICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJ0cmlhbmdsZXMiOgorICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHBzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHsKKyAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbaV0sIHBzW2kgKyAxXSwgcHNbaSArIDJdLCBjc1tpXSwgY3NbaSArIDFdLCBjc1tpICsgMl0pOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBmaWd1cmUiKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjcmVhdGVNZXNoQ2FudmFzKGJvdW5kcywgY29tYmluZXNTY2FsZSwgY29vcmRzLCBjb2xvcnMsIGZpZ3VyZXMsIGJhY2tncm91bmRDb2xvciwgY2FjaGVkQ2FudmFzZXMsIHdlYkdMQ29udGV4dCkgeworICAgIHZhciBFWFBFQ1RFRF9TQ0FMRSA9IDEuMTsKKyAgICB2YXIgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7CisgICAgdmFyIEJPUkRFUl9TSVpFID0gMjsKKyAgICB2YXIgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTsKKyAgICB2YXIgb2Zmc2V0WSA9IE1hdGguZmxvb3IoYm91bmRzWzFdKTsKKyAgICB2YXIgYm91bmRzV2lkdGggPSBNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFg7CisgICAgdmFyIGJvdW5kc0hlaWdodCA9IE1hdGguY2VpbChib3VuZHNbM10pIC0gb2Zmc2V0WTsKKyAgICB2YXIgd2lkdGggPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzV2lkdGggKiBjb21iaW5lc1NjYWxlWzBdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7CisgICAgdmFyIGhlaWdodCA9IE1hdGgubWluKE1hdGguY2VpbChNYXRoLmFicyhib3VuZHNIZWlnaHQgKiBjb21iaW5lc1NjYWxlWzFdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7CisgICAgdmFyIHNjYWxlWCA9IGJvdW5kc1dpZHRoIC8gd2lkdGg7CisgICAgdmFyIHNjYWxlWSA9IGJvdW5kc0hlaWdodCAvIGhlaWdodDsKKyAgICB2YXIgY29udGV4dCA9IHsKKyAgICAgIGNvb3JkcywKKyAgICAgIGNvbG9ycywKKyAgICAgIG9mZnNldFg6IC1vZmZzZXRYLAorICAgICAgb2Zmc2V0WTogLW9mZnNldFksCisgICAgICBzY2FsZVg6IDEgLyBzY2FsZVgsCisgICAgICBzY2FsZVk6IDEgLyBzY2FsZVkKKyAgICB9OworICAgIHZhciBwYWRkZWRXaWR0aCA9IHdpZHRoICsgQk9SREVSX1NJWkUgKiAyOworICAgIHZhciBwYWRkZWRIZWlnaHQgPSBoZWlnaHQgKyBCT1JERVJfU0laRSAqIDI7CisgICAgdmFyIGNhbnZhcywgdG1wQ2FudmFzLCBpLCBpaTsKKworICAgIGlmICh3ZWJHTENvbnRleHQuaXNFbmFibGVkKSB7CisgICAgICBjYW52YXMgPSB3ZWJHTENvbnRleHQuZHJhd0ZpZ3VyZXMoeworICAgICAgICB3aWR0aCwKKyAgICAgICAgaGVpZ2h0LAorICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsCisgICAgICAgIGZpZ3VyZXMsCisgICAgICAgIGNvbnRleHQKKyAgICAgIH0pOworICAgICAgdG1wQ2FudmFzID0gY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtZXNoIiwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgZmFsc2UpOworICAgICAgdG1wQ2FudmFzLmNvbnRleHQuZHJhd0ltYWdlKGNhbnZhcywgQk9SREVSX1NJWkUsIEJPUkRFUl9TSVpFKTsKKyAgICAgIGNhbnZhcyA9IHRtcENhbnZhcy5jYW52YXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcENhbnZhcyA9IGNhY2hlZENhbnZhc2VzLmdldENhbnZhcygibWVzaCIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQsIGZhbHNlKTsKKyAgICAgIHZhciB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDsKKyAgICAgIHZhciBkYXRhID0gdG1wQ3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikgeworICAgICAgICB2YXIgYnl0ZXMgPSBkYXRhLmRhdGE7CisKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7CisgICAgICAgICAgYnl0ZXNbaV0gPSBiYWNrZ3JvdW5kQ29sb3JbMF07CisgICAgICAgICAgYnl0ZXNbaSArIDFdID0gYmFja2dyb3VuZENvbG9yWzFdOworICAgICAgICAgIGJ5dGVzW2kgKyAyXSA9IGJhY2tncm91bmRDb2xvclsyXTsKKyAgICAgICAgICBieXRlc1tpICsgM10gPSAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IGZpZ3VyZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmVzW2ldLCBjb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgdG1wQ3R4LnB1dEltYWdlRGF0YShkYXRhLCBCT1JERVJfU0laRSwgQk9SREVSX1NJWkUpOworICAgICAgY2FudmFzID0gdG1wQ2FudmFzLmNhbnZhczsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgY2FudmFzLAorICAgICAgb2Zmc2V0WDogb2Zmc2V0WCAtIEJPUkRFUl9TSVpFICogc2NhbGVYLAorICAgICAgb2Zmc2V0WTogb2Zmc2V0WSAtIEJPUkRFUl9TSVpFICogc2NhbGVZLAorICAgICAgc2NhbGVYLAorICAgICAgc2NhbGVZCisgICAgfTsKKyAgfQorCisgIHJldHVybiBjcmVhdGVNZXNoQ2FudmFzOworfSgpOworCitTaGFkaW5nSVJzLk1lc2ggPSB7CisgIGZyb21JUjogZnVuY3Rpb24gTWVzaF9mcm9tSVIocmF3KSB7CisgICAgdmFyIGNvb3JkcyA9IHJhd1syXTsKKyAgICB2YXIgY29sb3JzID0gcmF3WzNdOworICAgIHZhciBmaWd1cmVzID0gcmF3WzRdOworICAgIHZhciBib3VuZHMgPSByYXdbNV07CisgICAgdmFyIG1hdHJpeCA9IHJhd1s2XTsKKyAgICB2YXIgYmJveCA9IHJhd1s3XTsKKyAgICB2YXIgYmFja2dyb3VuZCA9IHJhd1s4XTsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gTWVzaF9nZXRQYXR0ZXJuKGN0eCwgb3duZXIsIHNoYWRpbmdGaWxsKSB7CisgICAgICAgIGFwcGx5Qm91bmRpbmdCb3goY3R4LCBiYm94KTsKKyAgICAgICAgdmFyIHNjYWxlOworCisgICAgICAgIGlmIChzaGFkaW5nRmlsbCkgeworICAgICAgICAgIHNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShjdHgubW96Q3VycmVudFRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG93bmVyLmJhc2VUcmFuc2Zvcm0pOworCisgICAgICAgICAgaWYgKG1hdHJpeCkgeworICAgICAgICAgICAgdmFyIG1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtYXRyaXgpOworCisgICAgICAgICAgICBzY2FsZSA9IFtzY2FsZVswXSAqIG1hdHJpeFNjYWxlWzBdLCBzY2FsZVsxXSAqIG1hdHJpeFNjYWxlWzFdXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IGNyZWF0ZU1lc2hDYW52YXMoYm91bmRzLCBzY2FsZSwgY29vcmRzLCBjb2xvcnMsIGZpZ3VyZXMsIHNoYWRpbmdGaWxsID8gbnVsbCA6IGJhY2tncm91bmQsIG93bmVyLmNhY2hlZENhbnZhc2VzLCBvd25lci53ZWJHTENvbnRleHQpOworCisgICAgICAgIGlmICghc2hhZGluZ0ZpbGwpIHsKKyAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtLmFwcGx5KGN0eCwgb3duZXIuYmFzZVRyYW5zZm9ybSk7CisKKyAgICAgICAgICBpZiAobWF0cml4KSB7CisgICAgICAgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgbWF0cml4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjdHgudHJhbnNsYXRlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZKTsKKyAgICAgICAgY3R4LnNjYWxlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7CisgICAgICAgIHJldHVybiBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgIm5vLXJlcGVhdCIpOworICAgICAgfQorICAgIH07CisgIH0KK307CitTaGFkaW5nSVJzLkR1bW15ID0geworICBmcm9tSVI6IGZ1bmN0aW9uIER1bW15X2Zyb21JUigpIHsKKyAgICByZXR1cm4geworICAgICAgdHlwZTogIlBhdHRlcm4iLAorICAgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gRHVtbXlfZnJvbUlSX2dldFBhdHRlcm4oKSB7CisgICAgICAgIHJldHVybiAiaG90cGluayI7CisgICAgICB9CisgICAgfTsKKyAgfQorfTsKKworZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm5Gcm9tSVIocmF3KSB7CisgIHZhciBzaGFkaW5nSVIgPSBTaGFkaW5nSVJzW3Jhd1swXV07CisKKyAgaWYgKCFzaGFkaW5nSVIpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSVIgdHlwZTogJHtyYXdbMF19YCk7CisgIH0KKworICByZXR1cm4gc2hhZGluZ0lSLmZyb21JUihyYXcpOworfQorCit2YXIgVGlsaW5nUGF0dGVybiA9IGZ1bmN0aW9uIFRpbGluZ1BhdHRlcm5DbG9zdXJlKCkgeworICB2YXIgUGFpbnRUeXBlID0geworICAgIENPTE9SRUQ6IDEsCisgICAgVU5DT0xPUkVEOiAyCisgIH07CisgIHZhciBNQVhfUEFUVEVSTl9TSVpFID0gMzAwMDsKKworICBmdW5jdGlvbiBUaWxpbmdQYXR0ZXJuKElSLCBjb2xvciwgY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pIHsKKyAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IElSWzJdOworICAgIHRoaXMubWF0cml4ID0gSVJbM10gfHwgWzEsIDAsIDAsIDEsIDAsIDBdOworICAgIHRoaXMuYmJveCA9IElSWzRdOworICAgIHRoaXMueHN0ZXAgPSBJUls1XTsKKyAgICB0aGlzLnlzdGVwID0gSVJbNl07CisgICAgdGhpcy5wYWludFR5cGUgPSBJUls3XTsKKyAgICB0aGlzLnRpbGluZ1R5cGUgPSBJUls4XTsKKyAgICB0aGlzLmNvbG9yID0gY29sb3I7CisgICAgdGhpcy5jYW52YXNHcmFwaGljc0ZhY3RvcnkgPSBjYW52YXNHcmFwaGljc0ZhY3Rvcnk7CisgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gYmFzZVRyYW5zZm9ybTsKKyAgICB0aGlzLnR5cGUgPSAiUGF0dGVybiI7CisgICAgdGhpcy5jdHggPSBjdHg7CisgIH0KKworICBUaWxpbmdQYXR0ZXJuLnByb3RvdHlwZSA9IHsKKyAgICBjcmVhdGVQYXR0ZXJuQ2FudmFzOiBmdW5jdGlvbiBUaWxpblBhdHRlcm5fY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcikgeworICAgICAgdmFyIG9wZXJhdG9yTGlzdCA9IHRoaXMub3BlcmF0b3JMaXN0OworICAgICAgdmFyIGJib3ggPSB0aGlzLmJib3g7CisgICAgICB2YXIgeHN0ZXAgPSB0aGlzLnhzdGVwOworICAgICAgdmFyIHlzdGVwID0gdGhpcy55c3RlcDsKKyAgICAgIHZhciBwYWludFR5cGUgPSB0aGlzLnBhaW50VHlwZTsKKyAgICAgIHZhciB0aWxpbmdUeXBlID0gdGhpcy50aWxpbmdUeXBlOworICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcjsKKyAgICAgIHZhciBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTsKKyAgICAgICgwLCBfdXRpbC5pbmZvKSgiVGlsaW5nVHlwZTogIiArIHRpbGluZ1R5cGUpOworICAgICAgdmFyIHgwID0gYmJveFswXSwKKyAgICAgICAgICB5MCA9IGJib3hbMV0sCisgICAgICAgICAgeDEgPSBiYm94WzJdLAorICAgICAgICAgIHkxID0gYmJveFszXTsKKworICAgICAgdmFyIG1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7CisKKyAgICAgIHZhciBjdXJNYXRyaXhTY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5iYXNlVHJhbnNmb3JtKTsKKworICAgICAgdmFyIGNvbWJpbmVkU2NhbGUgPSBbbWF0cml4U2NhbGVbMF0gKiBjdXJNYXRyaXhTY2FsZVswXSwgbWF0cml4U2NhbGVbMV0gKiBjdXJNYXRyaXhTY2FsZVsxXV07CisgICAgICB2YXIgZGlteCA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKHhzdGVwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIGNvbWJpbmVkU2NhbGVbMF0pOworICAgICAgdmFyIGRpbXkgPSB0aGlzLmdldFNpemVBbmRTY2FsZSh5c3RlcCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCwgY29tYmluZWRTY2FsZVsxXSk7CisgICAgICB2YXIgdG1wQ2FudmFzID0gb3duZXIuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJwYXR0ZXJuIiwgZGlteC5zaXplLCBkaW15LnNpemUsIHRydWUpOworICAgICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0OworICAgICAgdmFyIGdyYXBoaWNzID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5LmNyZWF0ZUNhbnZhc0dyYXBoaWNzKHRtcEN0eCk7CisgICAgICBncmFwaGljcy5ncm91cExldmVsID0gb3duZXIuZ3JvdXBMZXZlbDsKKyAgICAgIHRoaXMuc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKTsKKyAgICAgIGdyYXBoaWNzLnRyYW5zZm9ybShkaW14LnNjYWxlLCAwLCAwLCBkaW15LnNjYWxlLCAwLCAwKTsKKyAgICAgIGdyYXBoaWNzLnRyYW5zZm9ybSgxLCAwLCAwLCAxLCAteDAsIC15MCk7CisgICAgICB0aGlzLmNsaXBCYm94KGdyYXBoaWNzLCBiYm94LCB4MCwgeTAsIHgxLCB5MSk7CisgICAgICBncmFwaGljcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7CisgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oMSwgMCwgMCwgMSwgeDAsIHkwKTsKKyAgICAgIHRoaXMuY3R4LnNjYWxlKDEgLyBkaW14LnNjYWxlLCAxIC8gZGlteS5zY2FsZSk7CisgICAgICByZXR1cm4gdG1wQ2FudmFzLmNhbnZhczsKKyAgICB9LAorICAgIGdldFNpemVBbmRTY2FsZTogZnVuY3Rpb24gVGlsaW5nUGF0dGVybl9nZXRTaXplQW5kU2NhbGUoc3RlcCwgcmVhbE91dHB1dFNpemUsIHNjYWxlKSB7CisgICAgICBzdGVwID0gTWF0aC5hYnMoc3RlcCk7CisgICAgICB2YXIgbWF4U2l6ZSA9IE1hdGgubWF4KE1BWF9QQVRURVJOX1NJWkUsIHJlYWxPdXRwdXRTaXplKTsKKyAgICAgIHZhciBzaXplID0gTWF0aC5jZWlsKHN0ZXAgKiBzY2FsZSk7CisKKyAgICAgIGlmIChzaXplID49IG1heFNpemUpIHsKKyAgICAgICAgc2l6ZSA9IG1heFNpemU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzY2FsZSA9IHNpemUgLyBzdGVwOworICAgICAgfQorCisgICAgICByZXR1cm4geworICAgICAgICBzY2FsZSwKKyAgICAgICAgc2l6ZQorICAgICAgfTsKKyAgICB9LAorICAgIGNsaXBCYm94OiBmdW5jdGlvbiBjbGlwQmJveChncmFwaGljcywgYmJveCwgeDAsIHkwLCB4MSwgeTEpIHsKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGJib3gpICYmIGJib3gubGVuZ3RoID09PSA0KSB7CisgICAgICAgIHZhciBiYm94V2lkdGggPSB4MSAtIHgwOworICAgICAgICB2YXIgYmJveEhlaWdodCA9IHkxIC0geTA7CisgICAgICAgIGdyYXBoaWNzLmN0eC5yZWN0KHgwLCB5MCwgYmJveFdpZHRoLCBiYm94SGVpZ2h0KTsKKyAgICAgICAgZ3JhcGhpY3MuY2xpcCgpOworICAgICAgICBncmFwaGljcy5lbmRQYXRoKCk7CisgICAgICB9CisgICAgfSwKKyAgICBzZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQ6IGZ1bmN0aW9uIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChncmFwaGljcywgcGFpbnRUeXBlLCBjb2xvcikgeworICAgICAgY29uc3QgY29udGV4dCA9IGdyYXBoaWNzLmN0eCwKKyAgICAgICAgICAgIGN1cnJlbnQgPSBncmFwaGljcy5jdXJyZW50OworCisgICAgICBzd2l0Y2ggKHBhaW50VHlwZSkgeworICAgICAgICBjYXNlIFBhaW50VHlwZS5DT0xPUkVEOgorICAgICAgICAgIHZhciBjdHggPSB0aGlzLmN0eDsKKyAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGN0eC5maWxsU3R5bGU7CisgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGN0eC5zdHJva2VTdHlsZTsKKyAgICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGN0eC5maWxsU3R5bGU7CisgICAgICAgICAgY3VycmVudC5zdHJva2VDb2xvciA9IGN0eC5zdHJva2VTdHlsZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBhaW50VHlwZS5VTkNPTE9SRUQ6CisgICAgICAgICAgdmFyIGNzc0NvbG9yID0gX3V0aWwuVXRpbC5tYWtlQ3NzUmdiKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pOworCisgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjc3NDb2xvcjsKKyAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY3NzQ29sb3I7CisgICAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjc3NDb2xvcjsKKyAgICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHBhaW50IHR5cGU6ICR7cGFpbnRUeXBlfWApOworICAgICAgfQorICAgIH0sCisgICAgZ2V0UGF0dGVybjogZnVuY3Rpb24gVGlsaW5nUGF0dGVybl9nZXRQYXR0ZXJuKGN0eCwgb3duZXIpIHsKKyAgICAgIGN0eCA9IHRoaXMuY3R4OworICAgICAgY3R4LnNldFRyYW5zZm9ybS5hcHBseShjdHgsIHRoaXMuYmFzZVRyYW5zZm9ybSk7CisgICAgICBjdHgudHJhbnNmb3JtLmFwcGx5KGN0eCwgdGhpcy5tYXRyaXgpOworICAgICAgdmFyIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMgPSB0aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMob3duZXIpOworICAgICAgcmV0dXJuIGN0eC5jcmVhdGVQYXR0ZXJuKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMsICJyZXBlYXQiKTsKKyAgICB9CisgIH07CisgIHJldHVybiBUaWxpbmdQYXR0ZXJuOworfSgpOworCitleHBvcnRzLlRpbGluZ1BhdHRlcm4gPSBUaWxpbmdQYXR0ZXJuOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kaXNwbGF5L3N2Zy5qcyBiL2xpYi9kaXNwbGF5L3N2Zy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzkzOWNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvc3ZnLmpzCkBAIC0wLDAgKzEsMTU0MSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuU1ZHR3JhcGhpY3MgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IHJlcXVpcmUoIi4vZGlzcGxheV91dGlscy5qcyIpOworCit2YXIgX2lzX25vZGUgPSByZXF1aXJlKCIuLi9zaGFyZWQvaXNfbm9kZS5qcyIpOworCitsZXQgU1ZHR3JhcGhpY3MgPSBmdW5jdGlvbiAoKSB7CisgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBTVkdHcmFwaGljcyIpOworfTsKKworZXhwb3J0cy5TVkdHcmFwaGljcyA9IFNWR0dyYXBoaWNzOworeworICBjb25zdCBTVkdfREVGQVVMVFMgPSB7CisgICAgZm9udFN0eWxlOiAibm9ybWFsIiwKKyAgICBmb250V2VpZ2h0OiAibm9ybWFsIiwKKyAgICBmaWxsQ29sb3I6ICIjMDAwMDAwIgorICB9OworICBjb25zdCBYTUxfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKKyAgY29uc3QgWExJTktfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI7CisgIGNvbnN0IExJTkVfQ0FQX1NUWUxFUyA9IFsiYnV0dCIsICJyb3VuZCIsICJzcXVhcmUiXTsKKyAgY29uc3QgTElORV9KT0lOX1NUWUxFUyA9IFsibWl0ZXIiLCAicm91bmQiLCAiYmV2ZWwiXTsKKworICBjb25zdCBjb252ZXJ0SW1nRGF0YVRvUG5nID0gZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IFBOR19IRUFERVIgPSBuZXcgVWludDhBcnJheShbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV0pOworICAgIGNvbnN0IENIVU5LX1dSQVBQRVJfU0laRSA9IDEyOworICAgIGNvbnN0IGNyY1RhYmxlID0gbmV3IEludDMyQXJyYXkoMjU2KTsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIGxldCBjID0gaTsKKworICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCA4OyBoKyspIHsKKyAgICAgICAgaWYgKGMgJiAxKSB7CisgICAgICAgICAgYyA9IDB4ZWRiODgzMjAgXiBjID4+IDEgJiAweDdmZmZmZmZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGMgPSBjID4+IDEgJiAweDdmZmZmZmZmOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNyY1RhYmxlW2ldID0gYzsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjcmMzMihkYXRhLCBzdGFydCwgZW5kKSB7CisgICAgICBsZXQgY3JjID0gLTE7CisKKyAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGEgPSAoY3JjIF4gZGF0YVtpXSkgJiAweGZmOworICAgICAgICBjb25zdCBiID0gY3JjVGFibGVbYV07CisgICAgICAgIGNyYyA9IGNyYyA+Pj4gOCBeIGI7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjcmMgXiAtMTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB3cml0ZVBuZ0NodW5rKHR5cGUsIGJvZHksIGRhdGEsIG9mZnNldCkgeworICAgICAgbGV0IHAgPSBvZmZzZXQ7CisgICAgICBjb25zdCBsZW4gPSBib2R5Lmxlbmd0aDsKKyAgICAgIGRhdGFbcF0gPSBsZW4gPj4gMjQgJiAweGZmOworICAgICAgZGF0YVtwICsgMV0gPSBsZW4gPj4gMTYgJiAweGZmOworICAgICAgZGF0YVtwICsgMl0gPSBsZW4gPj4gOCAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAzXSA9IGxlbiAmIDB4ZmY7CisgICAgICBwICs9IDQ7CisgICAgICBkYXRhW3BdID0gdHlwZS5jaGFyQ29kZUF0KDApICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDFdID0gdHlwZS5jaGFyQ29kZUF0KDEpICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDJdID0gdHlwZS5jaGFyQ29kZUF0KDIpICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDNdID0gdHlwZS5jaGFyQ29kZUF0KDMpICYgMHhmZjsKKyAgICAgIHAgKz0gNDsKKyAgICAgIGRhdGEuc2V0KGJvZHksIHApOworICAgICAgcCArPSBib2R5Lmxlbmd0aDsKKyAgICAgIGNvbnN0IGNyYyA9IGNyYzMyKGRhdGEsIG9mZnNldCArIDQsIHApOworICAgICAgZGF0YVtwXSA9IGNyYyA+PiAyNCAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAxXSA9IGNyYyA+PiAxNiAmIDB4ZmY7CisgICAgICBkYXRhW3AgKyAyXSA9IGNyYyA+PiA4ICYgMHhmZjsKKyAgICAgIGRhdGFbcCArIDNdID0gY3JjICYgMHhmZjsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBhZGxlcjMyKGRhdGEsIHN0YXJ0LCBlbmQpIHsKKyAgICAgIGxldCBhID0gMTsKKyAgICAgIGxldCBiID0gMDsKKworICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKKyAgICAgICAgYSA9IChhICsgKGRhdGFbaV0gJiAweGZmKSkgJSA2NTUyMTsKKyAgICAgICAgYiA9IChiICsgYSkgJSA2NTUyMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGIgPDwgMTYgfCBhOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlZmxhdGVTeW5jKGxpdGVyYWxzKSB7CisgICAgICBpZiAoIV9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgIHJldHVybiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZChsaXRlcmFscyk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGxldCBpbnB1dDsKKworICAgICAgICBpZiAocGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSA+PSA4KSB7CisgICAgICAgICAgaW5wdXQgPSBsaXRlcmFsczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnB1dCA9IEJ1ZmZlci5mcm9tKGxpdGVyYWxzKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG91dHB1dCA9IHJlcXVpcmUoInpsaWIiKS5kZWZsYXRlU3luYyhpbnB1dCwgeworICAgICAgICAgIGxldmVsOiA5CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBvdXRwdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gb3V0cHV0IDogbmV3IFVpbnQ4QXJyYXkob3V0cHV0KTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKCJOb3QgY29tcHJlc3NpbmcgUE5HIGJlY2F1c2UgemxpYi5kZWZsYXRlU3luYyBpcyB1bmF2YWlsYWJsZTogIiArIGUpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQobGl0ZXJhbHMpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlZmxhdGVTeW5jVW5jb21wcmVzc2VkKGxpdGVyYWxzKSB7CisgICAgICBsZXQgbGVuID0gbGl0ZXJhbHMubGVuZ3RoOworICAgICAgY29uc3QgbWF4QmxvY2tMZW5ndGggPSAweGZmZmY7CisgICAgICBjb25zdCBkZWZsYXRlQmxvY2tzID0gTWF0aC5jZWlsKGxlbiAvIG1heEJsb2NrTGVuZ3RoKTsKKyAgICAgIGNvbnN0IGlkYXQgPSBuZXcgVWludDhBcnJheSgyICsgbGVuICsgZGVmbGF0ZUJsb2NrcyAqIDUgKyA0KTsKKyAgICAgIGxldCBwaSA9IDA7CisgICAgICBpZGF0W3BpKytdID0gMHg3ODsKKyAgICAgIGlkYXRbcGkrK10gPSAweDljOworICAgICAgbGV0IHBvcyA9IDA7CisKKyAgICAgIHdoaWxlIChsZW4gPiBtYXhCbG9ja0xlbmd0aCkgeworICAgICAgICBpZGF0W3BpKytdID0gMHgwMDsKKyAgICAgICAgaWRhdFtwaSsrXSA9IDB4ZmY7CisgICAgICAgIGlkYXRbcGkrK10gPSAweGZmOworICAgICAgICBpZGF0W3BpKytdID0gMHgwMDsKKyAgICAgICAgaWRhdFtwaSsrXSA9IDB4MDA7CisgICAgICAgIGlkYXQuc2V0KGxpdGVyYWxzLnN1YmFycmF5KHBvcywgcG9zICsgbWF4QmxvY2tMZW5ndGgpLCBwaSk7CisgICAgICAgIHBpICs9IG1heEJsb2NrTGVuZ3RoOworICAgICAgICBwb3MgKz0gbWF4QmxvY2tMZW5ndGg7CisgICAgICAgIGxlbiAtPSBtYXhCbG9ja0xlbmd0aDsKKyAgICAgIH0KKworICAgICAgaWRhdFtwaSsrXSA9IDB4MDE7CisgICAgICBpZGF0W3BpKytdID0gbGVuICYgMHhmZjsKKyAgICAgIGlkYXRbcGkrK10gPSBsZW4gPj4gOCAmIDB4ZmY7CisgICAgICBpZGF0W3BpKytdID0gfmxlbiAmIDB4ZmZmZiAmIDB4ZmY7CisgICAgICBpZGF0W3BpKytdID0gKH5sZW4gJiAweGZmZmYpID4+IDggJiAweGZmOworICAgICAgaWRhdC5zZXQobGl0ZXJhbHMuc3ViYXJyYXkocG9zKSwgcGkpOworICAgICAgcGkgKz0gbGl0ZXJhbHMubGVuZ3RoIC0gcG9zOworICAgICAgY29uc3QgYWRsZXIgPSBhZGxlcjMyKGxpdGVyYWxzLCAwLCBsaXRlcmFscy5sZW5ndGgpOworICAgICAgaWRhdFtwaSsrXSA9IGFkbGVyID4+IDI0ICYgMHhmZjsKKyAgICAgIGlkYXRbcGkrK10gPSBhZGxlciA+PiAxNiAmIDB4ZmY7CisgICAgICBpZGF0W3BpKytdID0gYWRsZXIgPj4gOCAmIDB4ZmY7CisgICAgICBpZGF0W3BpKytdID0gYWRsZXIgJiAweGZmOworICAgICAgcmV0dXJuIGlkYXQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gZW5jb2RlKGltZ0RhdGEsIGtpbmQsIGZvcmNlRGF0YVNjaGVtYSwgaXNNYXNrKSB7CisgICAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgICAgIGxldCBiaXREZXB0aCwgY29sb3JUeXBlLCBsaW5lU2l6ZTsKKyAgICAgIGNvbnN0IGJ5dGVzID0gaW1nRGF0YS5kYXRhOworCisgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2FzZSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6CisgICAgICAgICAgY29sb3JUeXBlID0gMDsKKyAgICAgICAgICBiaXREZXB0aCA9IDE7CisgICAgICAgICAgbGluZVNpemUgPSB3aWR0aCArIDcgPj4gMzsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA6CisgICAgICAgICAgY29sb3JUeXBlID0gMjsKKyAgICAgICAgICBiaXREZXB0aCA9IDg7CisgICAgICAgICAgbGluZVNpemUgPSB3aWR0aCAqIDM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfdXRpbC5JbWFnZUtpbmQuUkdCQV8zMkJQUDoKKyAgICAgICAgICBjb2xvclR5cGUgPSA2OworICAgICAgICAgIGJpdERlcHRoID0gODsKKyAgICAgICAgICBsaW5lU2l6ZSA9IHdpZHRoICogNDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQiKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgbGl0ZXJhbHMgPSBuZXcgVWludDhBcnJheSgoMSArIGxpbmVTaXplKSAqIGhlaWdodCk7CisgICAgICBsZXQgb2Zmc2V0TGl0ZXJhbHMgPSAwLAorICAgICAgICAgIG9mZnNldEJ5dGVzID0gMDsKKworICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBsaXRlcmFsc1tvZmZzZXRMaXRlcmFscysrXSA9IDA7CisgICAgICAgIGxpdGVyYWxzLnNldChieXRlcy5zdWJhcnJheShvZmZzZXRCeXRlcywgb2Zmc2V0Qnl0ZXMgKyBsaW5lU2l6ZSksIG9mZnNldExpdGVyYWxzKTsKKyAgICAgICAgb2Zmc2V0Qnl0ZXMgKz0gbGluZVNpemU7CisgICAgICAgIG9mZnNldExpdGVyYWxzICs9IGxpbmVTaXplOworICAgICAgfQorCisgICAgICBpZiAoa2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQICYmIGlzTWFzaykgeworICAgICAgICBvZmZzZXRMaXRlcmFscyA9IDA7CisKKyAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgIG9mZnNldExpdGVyYWxzKys7CisKKyAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVTaXplOyBpKyspIHsKKyAgICAgICAgICAgIGxpdGVyYWxzW29mZnNldExpdGVyYWxzKytdIF49IDB4ZmY7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNvbnN0IGloZHIgPSBuZXcgVWludDhBcnJheShbd2lkdGggPj4gMjQgJiAweGZmLCB3aWR0aCA+PiAxNiAmIDB4ZmYsIHdpZHRoID4+IDggJiAweGZmLCB3aWR0aCAmIDB4ZmYsIGhlaWdodCA+PiAyNCAmIDB4ZmYsIGhlaWdodCA+PiAxNiAmIDB4ZmYsIGhlaWdodCA+PiA4ICYgMHhmZiwgaGVpZ2h0ICYgMHhmZiwgYml0RGVwdGgsIGNvbG9yVHlwZSwgMHgwMCwgMHgwMCwgMHgwMF0pOworICAgICAgY29uc3QgaWRhdCA9IGRlZmxhdGVTeW5jKGxpdGVyYWxzKTsKKyAgICAgIGNvbnN0IHBuZ0xlbmd0aCA9IFBOR19IRUFERVIubGVuZ3RoICsgQ0hVTktfV1JBUFBFUl9TSVpFICogMyArIGloZHIubGVuZ3RoICsgaWRhdC5sZW5ndGg7CisgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocG5nTGVuZ3RoKTsKKyAgICAgIGxldCBvZmZzZXQgPSAwOworICAgICAgZGF0YS5zZXQoUE5HX0hFQURFUiwgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCArPSBQTkdfSEVBREVSLmxlbmd0aDsKKyAgICAgIHdyaXRlUG5nQ2h1bmsoIklIRFIiLCBpaGRyLCBkYXRhLCBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IENIVU5LX1dSQVBQRVJfU0laRSArIGloZHIubGVuZ3RoOworICAgICAgd3JpdGVQbmdDaHVuaygiSURBVEEiLCBpZGF0LCBkYXRhLCBvZmZzZXQpOworICAgICAgb2Zmc2V0ICs9IENIVU5LX1dSQVBQRVJfU0laRSArIGlkYXQubGVuZ3RoOworICAgICAgd3JpdGVQbmdDaHVuaygiSUVORCIsIG5ldyBVaW50OEFycmF5KDApLCBkYXRhLCBvZmZzZXQpOworICAgICAgcmV0dXJuICgwLCBfdXRpbC5jcmVhdGVPYmplY3RVUkwpKGRhdGEsICJpbWFnZS9wbmciLCBmb3JjZURhdGFTY2hlbWEpOworICAgIH0KKworICAgIHJldHVybiBmdW5jdGlvbiBjb252ZXJ0SW1nRGF0YVRvUG5nKGltZ0RhdGEsIGZvcmNlRGF0YVNjaGVtYSwgaXNNYXNrKSB7CisgICAgICBjb25zdCBraW5kID0gaW1nRGF0YS5raW5kID09PSB1bmRlZmluZWQgPyBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgOiBpbWdEYXRhLmtpbmQ7CisgICAgICByZXR1cm4gZW5jb2RlKGltZ0RhdGEsIGtpbmQsIGZvcmNlRGF0YVNjaGVtYSwgaXNNYXNrKTsKKyAgICB9OworICB9KCk7CisKKyAgY2xhc3MgU1ZHRXh0cmFTdGF0ZSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxOworICAgICAgdGhpcy5mb250V2VpZ2h0ID0gU1ZHX0RFRkFVTFRTLmZvbnRXZWlnaHQ7CisgICAgICB0aGlzLmZvbnRTaXplID0gMDsKKyAgICAgIHRoaXMudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDsKKyAgICAgIHRoaXMuZm9udE1hdHJpeCA9IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOworICAgICAgdGhpcy5sZWFkaW5nID0gMDsKKyAgICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMOworICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxOworICAgICAgdGhpcy54ID0gMDsKKyAgICAgIHRoaXMueSA9IDA7CisgICAgICB0aGlzLmxpbmVYID0gMDsKKyAgICAgIHRoaXMubGluZVkgPSAwOworICAgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7CisgICAgICB0aGlzLndvcmRTcGFjaW5nID0gMDsKKyAgICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7CisgICAgICB0aGlzLnRleHRSaXNlID0gMDsKKyAgICAgIHRoaXMuZmlsbENvbG9yID0gU1ZHX0RFRkFVTFRTLmZpbGxDb2xvcjsKKyAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSAiIzAwMDAwMCI7CisgICAgICB0aGlzLmZpbGxBbHBoYSA9IDE7CisgICAgICB0aGlzLnN0cm9rZUFscGhhID0gMTsKKyAgICAgIHRoaXMubGluZVdpZHRoID0gMTsKKyAgICAgIHRoaXMubGluZUpvaW4gPSAiIjsKKyAgICAgIHRoaXMubGluZUNhcCA9ICIiOworICAgICAgdGhpcy5taXRlckxpbWl0ID0gMDsKKyAgICAgIHRoaXMuZGFzaEFycmF5ID0gW107CisgICAgICB0aGlzLmRhc2hQaGFzZSA9IDA7CisgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IFtdOworICAgICAgdGhpcy5hY3RpdmVDbGlwVXJsID0gbnVsbDsKKyAgICAgIHRoaXMuY2xpcEdyb3VwID0gbnVsbDsKKyAgICAgIHRoaXMubWFza0lkID0gIiI7CisgICAgfQorCisgICAgY2xvbmUoKSB7CisgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTsKKyAgICB9CisKKyAgICBzZXRDdXJyZW50UG9pbnQoeCwgeSkgeworICAgICAgdGhpcy54ID0geDsKKyAgICAgIHRoaXMueSA9IHk7CisgICAgfQorCisgIH0KKworICBmdW5jdGlvbiBvcExpc3RUb1RyZWUob3BMaXN0KSB7CisgICAgbGV0IG9wVHJlZSA9IFtdOworICAgIGNvbnN0IHRtcCA9IFtdOworCisgICAgZm9yIChjb25zdCBvcExpc3RFbGVtZW50IG9mIG9wTGlzdCkgeworICAgICAgaWYgKG9wTGlzdEVsZW1lbnQuZm4gPT09ICJzYXZlIikgeworICAgICAgICBvcFRyZWUucHVzaCh7CisgICAgICAgICAgZm5JZDogOTIsCisgICAgICAgICAgZm46ICJncm91cCIsCisgICAgICAgICAgaXRlbXM6IFtdCisgICAgICAgIH0pOworICAgICAgICB0bXAucHVzaChvcFRyZWUpOworICAgICAgICBvcFRyZWUgPSBvcFRyZWVbb3BUcmVlLmxlbmd0aCAtIDFdLml0ZW1zOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKG9wTGlzdEVsZW1lbnQuZm4gPT09ICJyZXN0b3JlIikgeworICAgICAgICBvcFRyZWUgPSB0bXAucG9wKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvcFRyZWUucHVzaChvcExpc3RFbGVtZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3BUcmVlOworICB9CisKKyAgZnVuY3Rpb24gcGYodmFsdWUpIHsKKyAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKKyAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgIH0KKworICAgIGNvbnN0IHMgPSB2YWx1ZS50b0ZpeGVkKDEwKTsKKyAgICBsZXQgaSA9IHMubGVuZ3RoIC0gMTsKKworICAgIGlmIChzW2ldICE9PSAiMCIpIHsKKyAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIGRvIHsKKyAgICAgIGktLTsKKyAgICB9IHdoaWxlIChzW2ldID09PSAiMCIpOworCisgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIHNbaV0gPT09ICIuIiA/IGkgOiBpICsgMSk7CisgIH0KKworICBmdW5jdGlvbiBwbShtKSB7CisgICAgaWYgKG1bNF0gPT09IDAgJiYgbVs1XSA9PT0gMCkgeworICAgICAgaWYgKG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCkgeworICAgICAgICBpZiAobVswXSA9PT0gMSAmJiBtWzNdID09PSAxKSB7CisgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGBzY2FsZSgke3BmKG1bMF0pfSAke3BmKG1bM10pfSlgOworICAgICAgfQorCisgICAgICBpZiAobVswXSA9PT0gbVszXSAmJiBtWzFdID09PSAtbVsyXSkgeworICAgICAgICBjb25zdCBhID0gTWF0aC5hY29zKG1bMF0pICogMTgwIC8gTWF0aC5QSTsKKyAgICAgICAgcmV0dXJuIGByb3RhdGUoJHtwZihhKX0pYDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1bMF0gPT09IDEgJiYgbVsxXSA9PT0gMCAmJiBtWzJdID09PSAwICYmIG1bM10gPT09IDEpIHsKKyAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtwZihtWzRdKX0gJHtwZihtWzVdKX0pYDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYG1hdHJpeCgke3BmKG1bMF0pfSAke3BmKG1bMV0pfSAke3BmKG1bMl0pfSAke3BmKG1bM10pfSAke3BmKG1bNF0pfSBgICsgYCR7cGYobVs1XSl9KWA7CisgIH0KKworICBsZXQgY2xpcENvdW50ID0gMDsKKyAgbGV0IG1hc2tDb3VudCA9IDA7CisgIGxldCBzaGFkaW5nQ291bnQgPSAwOworICBleHBvcnRzLlNWR0dyYXBoaWNzID0gU1ZHR3JhcGhpY3MgPSBjbGFzcyBTVkdHcmFwaGljcyB7CisgICAgY29uc3RydWN0b3IoY29tbW9uT2Jqcywgb2JqcywgZm9yY2VEYXRhU2NoZW1hID0gZmFsc2UpIHsKKyAgICAgIHRoaXMuc3ZnRmFjdG9yeSA9IG5ldyBfZGlzcGxheV91dGlscy5ET01TVkdGYWN0b3J5KCk7CisgICAgICB0aGlzLmN1cnJlbnQgPSBuZXcgU1ZHRXh0cmFTdGF0ZSgpOworICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7CisgICAgICB0aGlzLnRyYW5zZm9ybVN0YWNrID0gW107CisgICAgICB0aGlzLmV4dHJhU3RhY2sgPSBbXTsKKyAgICAgIHRoaXMuY29tbW9uT2JqcyA9IGNvbW1vbk9ianM7CisgICAgICB0aGlzLm9ianMgPSBvYmpzOworICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7CisgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTsKKyAgICAgIHRoaXMuZW1iZWRGb250cyA9IGZhbHNlOworICAgICAgdGhpcy5lbWJlZGRlZEZvbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIHRoaXMuY3NzU3R5bGUgPSBudWxsOworICAgICAgdGhpcy5mb3JjZURhdGFTY2hlbWEgPSAhIWZvcmNlRGF0YVNjaGVtYTsKKyAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nID0gW107CisKKyAgICAgIGZvciAoY29uc3Qgb3AgaW4gX3V0aWwuT1BTKSB7CisgICAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nW191dGlsLk9QU1tvcF1dID0gb3A7CisgICAgICB9CisgICAgfQorCisgICAgc2F2ZSgpIHsKKyAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7CisgICAgICBjb25zdCBvbGQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICB0aGlzLmV4dHJhU3RhY2sucHVzaChvbGQpOworICAgICAgdGhpcy5jdXJyZW50ID0gb2xkLmNsb25lKCk7CisgICAgfQorCisgICAgcmVzdG9yZSgpIHsKKyAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gdGhpcy50cmFuc2Zvcm1TdGFjay5wb3AoKTsKKyAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZXh0cmFTdGFjay5wb3AoKTsKKyAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsOworICAgICAgdGhpcy50Z3JwID0gbnVsbDsKKyAgICB9CisKKyAgICBncm91cChpdGVtcykgeworICAgICAgdGhpcy5zYXZlKCk7CisgICAgICB0aGlzLmV4ZWN1dGVPcFRyZWUoaXRlbXMpOworICAgICAgdGhpcy5yZXN0b3JlKCk7CisgICAgfQorCisgICAgbG9hZERlcGVuZGVuY2llcyhvcGVyYXRvckxpc3QpIHsKKyAgICAgIGNvbnN0IGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTsKKyAgICAgIGNvbnN0IGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLmRlcGVuZGVuY3kpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3Qgb2JqIG9mIGFyZ3NBcnJheVtpXSkgeworICAgICAgICAgIGNvbnN0IG9ianNQb29sID0gb2JqLnN0YXJ0c1dpdGgoImdfIikgPyB0aGlzLmNvbW1vbk9ianMgOiB0aGlzLm9ianM7CisgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4geworICAgICAgICAgICAgb2Jqc1Bvb2wuZ2V0KG9iaiwgcmVzb2x2ZSk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgdGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcy5wdXNoKHByb21pc2UpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzLmN1cnJlbnQuZGVwZW5kZW5jaWVzKTsKKyAgICB9CisKKyAgICB0cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikgeworICAgICAgY29uc3QgdHJhbnNmb3JtTWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdOworICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCwgdHJhbnNmb3JtTWF0cml4KTsKKyAgICAgIHRoaXMudGdycCA9IG51bGw7CisgICAgfQorCisgICAgZ2V0U1ZHKG9wZXJhdG9yTGlzdCwgdmlld3BvcnQpIHsKKyAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDsKKworICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9IHRoaXMuX2luaXRpYWxpemUodmlld3BvcnQpOworCisgICAgICByZXR1cm4gdGhpcy5sb2FkRGVwZW5kZW5jaWVzKG9wZXJhdG9yTGlzdCkudGhlbigoKSA9PiB7CisgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYOworICAgICAgICB0aGlzLmV4ZWN1dGVPcFRyZWUodGhpcy5jb252ZXJ0T3BMaXN0KG9wZXJhdG9yTGlzdCkpOworICAgICAgICByZXR1cm4gc3ZnRWxlbWVudDsKKyAgICAgIH0pOworICAgIH0KKworICAgIGNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSB7CisgICAgICBjb25zdCBvcGVyYXRvcklkTWFwcGluZyA9IHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nOworICAgICAgY29uc3QgYXJnc0FycmF5ID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheTsKKyAgICAgIGNvbnN0IGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTsKKyAgICAgIGNvbnN0IG9wTGlzdCA9IFtdOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgY29uc3QgZm5JZCA9IGZuQXJyYXlbaV07CisgICAgICAgIG9wTGlzdC5wdXNoKHsKKyAgICAgICAgICBmbklkLAorICAgICAgICAgIGZuOiBvcGVyYXRvcklkTWFwcGluZ1tmbklkXSwKKyAgICAgICAgICBhcmdzOiBhcmdzQXJyYXlbaV0KKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvcExpc3RUb1RyZWUob3BMaXN0KTsKKyAgICB9CisKKyAgICBleGVjdXRlT3BUcmVlKG9wVHJlZSkgeworICAgICAgZm9yIChjb25zdCBvcFRyZWVFbGVtZW50IG9mIG9wVHJlZSkgeworICAgICAgICBjb25zdCBmbiA9IG9wVHJlZUVsZW1lbnQuZm47CisgICAgICAgIGNvbnN0IGZuSWQgPSBvcFRyZWVFbGVtZW50LmZuSWQ7CisgICAgICAgIGNvbnN0IGFyZ3MgPSBvcFRyZWVFbGVtZW50LmFyZ3M7CisKKyAgICAgICAgc3dpdGNoIChmbklkIHwgMCkgeworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmJlZ2luVGV4dDoKKyAgICAgICAgICAgIHRoaXMuYmVnaW5UZXh0KCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmRlcGVuZGVuY3k6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExlYWRpbmc6CisgICAgICAgICAgICB0aGlzLnNldExlYWRpbmcoYXJncyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExlYWRpbmdNb3ZlVGV4dDoKKyAgICAgICAgICAgIHRoaXMuc2V0TGVhZGluZ01vdmVUZXh0KGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGb250OgorICAgICAgICAgICAgdGhpcy5zZXRGb250KGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93VGV4dDoKKyAgICAgICAgICAgIHRoaXMuc2hvd1RleHQoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNob3dTcGFjZWRUZXh0OgorICAgICAgICAgICAgdGhpcy5zaG93VGV4dChhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW5kVGV4dDoKKyAgICAgICAgICAgIHRoaXMuZW5kVGV4dCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5tb3ZlVGV4dDoKKyAgICAgICAgICAgIHRoaXMubW92ZVRleHQoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldENoYXJTcGFjaW5nOgorICAgICAgICAgICAgdGhpcy5zZXRDaGFyU3BhY2luZyhhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0V29yZFNwYWNpbmc6CisgICAgICAgICAgICB0aGlzLnNldFdvcmRTcGFjaW5nKGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRIU2NhbGU6CisgICAgICAgICAgICB0aGlzLnNldEhTY2FsZShhcmdzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0VGV4dE1hdHJpeDoKKyAgICAgICAgICAgIHRoaXMuc2V0VGV4dE1hdHJpeChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0VGV4dFJpc2U6CisgICAgICAgICAgICB0aGlzLnNldFRleHRSaXNlKGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZToKKyAgICAgICAgICAgIHRoaXMuc2V0VGV4dFJlbmRlcmluZ01vZGUoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExpbmVXaWR0aDoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZVdpZHRoKGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMaW5lSm9pbjoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4oYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExpbmVDYXA6CisgICAgICAgICAgICB0aGlzLnNldExpbmVDYXAoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldE1pdGVyTGltaXQ6CisgICAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjoKKyAgICAgICAgICAgIHRoaXMuc2V0RmlsbFJHQkNvbG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VSR0JDb2xvcjoKKyAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlUkdCQ29sb3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yTjoKKyAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlQ29sb3JOKGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3JOOgorICAgICAgICAgICAgdGhpcy5zZXRGaWxsQ29sb3JOKGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaGFkaW5nRmlsbDoKKyAgICAgICAgICAgIHRoaXMuc2hhZGluZ0ZpbGwoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldERhc2g6CisgICAgICAgICAgICB0aGlzLnNldERhc2goYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFJlbmRlcmluZ0ludGVudDoKKyAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGbGF0bmVzczoKKyAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3MoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEdTdGF0ZToKKyAgICAgICAgICAgIHRoaXMuc2V0R1N0YXRlKGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5maWxsOgorICAgICAgICAgICAgdGhpcy5maWxsKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVvRmlsbDoKKyAgICAgICAgICAgIHRoaXMuZW9GaWxsKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnN0cm9rZToKKyAgICAgICAgICAgIHRoaXMuc3Ryb2tlKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmZpbGxTdHJva2U6CisgICAgICAgICAgICB0aGlzLmZpbGxTdHJva2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW9GaWxsU3Ryb2tlOgorICAgICAgICAgICAgdGhpcy5lb0ZpbGxTdHJva2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY2xpcDoKKyAgICAgICAgICAgIHRoaXMuY2xpcCgibm9uemVybyIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lb0NsaXA6CisgICAgICAgICAgICB0aGlzLmNsaXAoImV2ZW5vZGQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOgorICAgICAgICAgICAgdGhpcy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3Q6CisgICAgICAgICAgICB0aGlzLnBhaW50SW1hZ2VYT2JqZWN0KGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdDoKKyAgICAgICAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoYXJnc1swXSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDoKKyAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZU1hc2tYT2JqZWN0KGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW46CisgICAgICAgICAgICB0aGlzLnBhaW50Rm9ybVhPYmplY3RCZWdpbihhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRGb3JtWE9iamVjdEVuZDoKKyAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEVuZCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVBhdGg6CisgICAgICAgICAgICB0aGlzLmNsb3NlUGF0aCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVN0cm9rZToKKyAgICAgICAgICAgIHRoaXMuY2xvc2VTdHJva2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY2xvc2VGaWxsU3Ryb2tlOgorICAgICAgICAgICAgdGhpcy5jbG9zZUZpbGxTdHJva2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY2xvc2VFT0ZpbGxTdHJva2U6CisgICAgICAgICAgICB0aGlzLmNsb3NlRU9GaWxsU3Ryb2tlKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lOgorICAgICAgICAgICAgdGhpcy5uZXh0TGluZSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy50cmFuc2Zvcm06CisgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY29uc3RydWN0UGF0aDoKKyAgICAgICAgICAgIHRoaXMuY29uc3RydWN0UGF0aChhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW5kUGF0aDoKKyAgICAgICAgICAgIHRoaXMuZW5kUGF0aCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDkyOgorICAgICAgICAgICAgdGhpcy5ncm91cChvcFRyZWVFbGVtZW50Lml0ZW1zKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgVW5pbXBsZW1lbnRlZCBvcGVyYXRvciAke2ZufWApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBzZXRXb3JkU3BhY2luZyh3b3JkU3BhY2luZykgeworICAgICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gd29yZFNwYWNpbmc7CisgICAgfQorCisgICAgc2V0Q2hhclNwYWNpbmcoY2hhclNwYWNpbmcpIHsKKyAgICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IGNoYXJTcGFjaW5nOworICAgIH0KKworICAgIG5leHRMaW5lKCkgeworICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7CisgICAgfQorCisgICAgc2V0VGV4dE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgY3VycmVudC50ZXh0TWF0cml4ID0gY3VycmVudC5saW5lTWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdOworICAgICAgY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7CisgICAgICBjdXJyZW50LnggPSBjdXJyZW50LmxpbmVYID0gMDsKKyAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgPSAwOworICAgICAgY3VycmVudC54Y29vcmRzID0gW107CisgICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTsKKyAgICAgIGN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7CisgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LWZhbWlseSIsIGN1cnJlbnQuZm9udEZhbWlseSk7CisgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LXNpemUiLCBgJHtwZihjdXJyZW50LmZvbnRTaXplKX1weGApOworICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsIHBmKC1jdXJyZW50LnkpKTsKKyAgICAgIGN1cnJlbnQudHh0RWxlbWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dGV4dCIpOworICAgICAgY3VycmVudC50eHRFbGVtZW50LmFwcGVuZENoaWxkKGN1cnJlbnQudHNwYW4pOworICAgIH0KKworICAgIGJlZ2luVGV4dCgpIHsKKyAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICBjdXJyZW50LnggPSBjdXJyZW50LmxpbmVYID0gMDsKKyAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgPSAwOworICAgICAgY3VycmVudC50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYOworICAgICAgY3VycmVudC5saW5lTWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYOworICAgICAgY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxOworICAgICAgY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTsKKyAgICAgIGN1cnJlbnQudHh0RWxlbWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dGV4dCIpOworICAgICAgY3VycmVudC50eHRncnAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTsKKyAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdOworICAgICAgY3VycmVudC55Y29vcmRzID0gW107CisgICAgfQorCisgICAgbW92ZVRleHQoeCwgeSkgeworICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgIGN1cnJlbnQueCA9IGN1cnJlbnQubGluZVggKz0geDsKKyAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgKz0geTsKKyAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdOworICAgICAgY3VycmVudC55Y29vcmRzID0gW107CisgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpOworICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZm9udC1mYW1pbHkiLCBjdXJyZW50LmZvbnRGYW1pbHkpOworICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZm9udC1zaXplIiwgYCR7cGYoY3VycmVudC5mb250U2l6ZSl9cHhgKTsKKyAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCBwZigtY3VycmVudC55KSk7CisgICAgfQorCisgICAgc2hvd1RleHQoZ2x5cGhzKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDsKKyAgICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTsKKworICAgICAgaWYgKGZvbnRTaXplID09PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgZm9udFNpemVTY2FsZSA9IGN1cnJlbnQuZm9udFNpemVTY2FsZTsKKyAgICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZzsKKyAgICAgIGNvbnN0IHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZzsKKyAgICAgIGNvbnN0IGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247CisgICAgICBjb25zdCB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjsKKyAgICAgIGNvbnN0IHZlcnRpY2FsID0gZm9udC52ZXJ0aWNhbDsKKyAgICAgIGNvbnN0IHNwYWNpbmdEaXIgPSB2ZXJ0aWNhbCA/IDEgOiAtMTsKKyAgICAgIGNvbnN0IGRlZmF1bHRWTWV0cmljcyA9IGZvbnQuZGVmYXVsdFZNZXRyaWNzOworICAgICAgY29uc3Qgd2lkdGhBZHZhbmNlU2NhbGUgPSBmb250U2l6ZSAqIGN1cnJlbnQuZm9udE1hdHJpeFswXTsKKyAgICAgIGxldCB4ID0gMDsKKworICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKKyAgICAgICAgaWYgKGdseXBoID09PSBudWxsKSB7CisgICAgICAgICAgeCArPSBmb250RGlyZWN0aW9uICogd29yZFNwYWNpbmc7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzTnVtKShnbHlwaCkpIHsKKyAgICAgICAgICB4ICs9IHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplIC8gMTAwMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZzsKKyAgICAgICAgY29uc3QgY2hhcmFjdGVyID0gZ2x5cGguZm9udENoYXI7CisgICAgICAgIGxldCBzY2FsZWRYLCBzY2FsZWRZOworICAgICAgICBsZXQgd2lkdGggPSBnbHlwaC53aWR0aDsKKworICAgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgICBsZXQgdng7CisgICAgICAgICAgY29uc3Qgdm1ldHJpYyA9IGdseXBoLnZtZXRyaWMgfHwgZGVmYXVsdFZNZXRyaWNzOworICAgICAgICAgIHZ4ID0gZ2x5cGgudm1ldHJpYyA/IHZtZXRyaWNbMV0gOiB3aWR0aCAqIDAuNTsKKyAgICAgICAgICB2eCA9IC12eCAqIHdpZHRoQWR2YW5jZVNjYWxlOworICAgICAgICAgIGNvbnN0IHZ5ID0gdm1ldHJpY1syXSAqIHdpZHRoQWR2YW5jZVNjYWxlOworICAgICAgICAgIHdpZHRoID0gdm1ldHJpYyA/IC12bWV0cmljWzBdIDogd2lkdGg7CisgICAgICAgICAgc2NhbGVkWCA9IHZ4IC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICBzY2FsZWRZID0gKHggKyB2eSkgLyBmb250U2l6ZVNjYWxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNjYWxlZFggPSB4IC8gZm9udFNpemVTY2FsZTsKKyAgICAgICAgICBzY2FsZWRZID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnbHlwaC5pc0luRm9udCB8fCBmb250Lm1pc3NpbmdGaWxlKSB7CisgICAgICAgICAgY3VycmVudC54Y29vcmRzLnB1c2goY3VycmVudC54ICsgc2NhbGVkWCk7CisKKyAgICAgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgICAgIGN1cnJlbnQueWNvb3Jkcy5wdXNoKC1jdXJyZW50LnkgKyBzY2FsZWRZKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjdXJyZW50LnRzcGFuLnRleHRDb250ZW50ICs9IGNoYXJhY3RlcjsKKyAgICAgICAgfSBlbHNlIHt9CisKKyAgICAgICAgbGV0IGNoYXJXaWR0aDsKKworICAgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlIC0gc3BhY2luZyAqIGZvbnREaXJlY3Rpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSArIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgeCArPSBjaGFyV2lkdGg7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCBjdXJyZW50Lnhjb29yZHMubWFwKHBmKS5qb2luKCIgIikpOworCisgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsIGN1cnJlbnQueWNvb3Jkcy5tYXAocGYpLmpvaW4oIiAiKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgcGYoLWN1cnJlbnQueSkpOworICAgICAgfQorCisgICAgICBpZiAodmVydGljYWwpIHsKKyAgICAgICAgY3VycmVudC55IC09IHg7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50LnggKz0geCAqIHRleHRIU2NhbGU7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZvbnQtZmFtaWx5IiwgY3VycmVudC5mb250RmFtaWx5KTsKKyAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgImZvbnQtc2l6ZSIsIGAke3BmKGN1cnJlbnQuZm9udFNpemUpfXB4YCk7CisKKyAgICAgIGlmIChjdXJyZW50LmZvbnRTdHlsZSAhPT0gU1ZHX0RFRkFVTFRTLmZvbnRTdHlsZSkgeworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LXN0eWxlIiwgY3VycmVudC5mb250U3R5bGUpOworICAgICAgfQorCisgICAgICBpZiAoY3VycmVudC5mb250V2VpZ2h0ICE9PSBTVkdfREVGQVVMVFMuZm9udFdlaWdodCkgeworICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmb250LXdlaWdodCIsIGN1cnJlbnQuZm9udFdlaWdodCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGZpbGxTdHJva2VNb2RlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7CisKKyAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQuZmlsbENvbG9yICE9PSBTVkdfREVGQVVMVFMuZmlsbENvbG9yKSB7CisgICAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbCIsIGN1cnJlbnQuZmlsbENvbG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50LmZpbGxBbHBoYSA8IDEpIHsKKyAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsLW9wYWNpdHkiLCBjdXJyZW50LmZpbGxBbHBoYSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEgpIHsKKyAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbCIsICJ0cmFuc3BhcmVudCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbCIsICJub25lIik7CisgICAgICB9CisKKyAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkgeworICAgICAgICBjb25zdCBsaW5lV2lkdGhTY2FsZSA9IDEgLyAoY3VycmVudC50ZXh0TWF0cml4U2NhbGUgfHwgMSk7CisKKyAgICAgICAgdGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhjdXJyZW50LnRzcGFuLCBsaW5lV2lkdGhTY2FsZSk7CisgICAgICB9CisKKyAgICAgIGxldCB0ZXh0TWF0cml4ID0gY3VycmVudC50ZXh0TWF0cml4OworCisgICAgICBpZiAoY3VycmVudC50ZXh0UmlzZSAhPT0gMCkgeworICAgICAgICB0ZXh0TWF0cml4ID0gdGV4dE1hdHJpeC5zbGljZSgpOworICAgICAgICB0ZXh0TWF0cml4WzVdICs9IGN1cnJlbnQudGV4dFJpc2U7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAidHJhbnNmb3JtIiwgYCR7cG0odGV4dE1hdHJpeCl9IHNjYWxlKCR7cGYodGV4dEhTY2FsZSl9LCAtMSlgKTsKKyAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTlMsICJ4bWw6c3BhY2UiLCAicHJlc2VydmUiKTsKKyAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5hcHBlbmRDaGlsZChjdXJyZW50LnRzcGFuKTsKKyAgICAgIGN1cnJlbnQudHh0Z3JwLmFwcGVuZENoaWxkKGN1cnJlbnQudHh0RWxlbWVudCk7CisKKyAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQoY3VycmVudC50eHRFbGVtZW50KTsKKyAgICB9CisKKyAgICBzZXRMZWFkaW5nTW92ZVRleHQoeCwgeSkgeworICAgICAgdGhpcy5zZXRMZWFkaW5nKC15KTsKKyAgICAgIHRoaXMubW92ZVRleHQoeCwgeSk7CisgICAgfQorCisgICAgYWRkRm9udFN0eWxlKGZvbnRPYmopIHsKKyAgICAgIGlmICghZm9udE9iai5kYXRhKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiYWRkRm9udFN0eWxlOiBObyBmb250IGRhdGEgYXZhaWxhYmxlLCAiICsgJ2Vuc3VyZSB0aGF0IHRoZSAiZm9udEV4dHJhUHJvcGVydGllcyIgQVBJIHBhcmFtZXRlciBpcyBzZXQuJyk7CisgICAgICB9CisKKyAgICAgIGlmICghdGhpcy5jc3NTdHlsZSkgeworICAgICAgICB0aGlzLmNzc1N0eWxlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpzdHlsZSIpOworICAgICAgICB0aGlzLmNzc1N0eWxlLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ0eXBlIiwgInRleHQvY3NzIik7CisgICAgICAgIHRoaXMuZGVmcy5hcHBlbmRDaGlsZCh0aGlzLmNzc1N0eWxlKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgdXJsID0gKDAsIF91dGlsLmNyZWF0ZU9iamVjdFVSTCkoZm9udE9iai5kYXRhLCBmb250T2JqLm1pbWV0eXBlLCB0aGlzLmZvcmNlRGF0YVNjaGVtYSk7CisgICAgICB0aGlzLmNzc1N0eWxlLnRleHRDb250ZW50ICs9IGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICIke2ZvbnRPYmoubG9hZGVkTmFtZX0iO2AgKyBgIHNyYzogdXJsKCR7dXJsfSk7IH1cbmA7CisgICAgfQorCisgICAgc2V0Rm9udChkZXRhaWxzKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgY29uc3QgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZGV0YWlsc1swXSk7CisgICAgICBsZXQgc2l6ZSA9IGRldGFpbHNbMV07CisgICAgICBjdXJyZW50LmZvbnQgPSBmb250T2JqOworCisgICAgICBpZiAodGhpcy5lbWJlZEZvbnRzICYmICFmb250T2JqLm1pc3NpbmdGaWxlICYmICF0aGlzLmVtYmVkZGVkRm9udHNbZm9udE9iai5sb2FkZWROYW1lXSkgeworICAgICAgICB0aGlzLmFkZEZvbnRTdHlsZShmb250T2JqKTsKKyAgICAgICAgdGhpcy5lbWJlZGRlZEZvbnRzW2ZvbnRPYmoubG9hZGVkTmFtZV0gPSBmb250T2JqOworICAgICAgfQorCisgICAgICBjdXJyZW50LmZvbnRNYXRyaXggPSBmb250T2JqLmZvbnRNYXRyaXggPyBmb250T2JqLmZvbnRNYXRyaXggOiBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWDsKKyAgICAgIGxldCBib2xkID0gIm5vcm1hbCI7CisKKyAgICAgIGlmIChmb250T2JqLmJsYWNrKSB7CisgICAgICAgIGJvbGQgPSAiOTAwIjsKKyAgICAgIH0gZWxzZSBpZiAoZm9udE9iai5ib2xkKSB7CisgICAgICAgIGJvbGQgPSAiYm9sZCI7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGl0YWxpYyA9IGZvbnRPYmouaXRhbGljID8gIml0YWxpYyIgOiAibm9ybWFsIjsKKworICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIHNpemUgPSAtc2l6ZTsKKyAgICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAxOworICAgICAgfQorCisgICAgICBjdXJyZW50LmZvbnRTaXplID0gc2l6ZTsKKyAgICAgIGN1cnJlbnQuZm9udEZhbWlseSA9IGZvbnRPYmoubG9hZGVkTmFtZTsKKyAgICAgIGN1cnJlbnQuZm9udFdlaWdodCA9IGJvbGQ7CisgICAgICBjdXJyZW50LmZvbnRTdHlsZSA9IGl0YWxpYzsKKyAgICAgIGN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7CisgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgcGYoLWN1cnJlbnQueSkpOworICAgICAgY3VycmVudC54Y29vcmRzID0gW107CisgICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTsKKyAgICB9CisKKyAgICBlbmRUZXh0KCkgeworICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKworICAgICAgaWYgKGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHICYmIGN1cnJlbnQudHh0RWxlbWVudCAmJiBjdXJyZW50LnR4dEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7CisgICAgICAgIGN1cnJlbnQuZWxlbWVudCA9IGN1cnJlbnQudHh0RWxlbWVudDsKKyAgICAgICAgdGhpcy5jbGlwKCJub256ZXJvIik7CisgICAgICAgIHRoaXMuZW5kUGF0aCgpOworICAgICAgfQorICAgIH0KKworICAgIHNldExpbmVXaWR0aCh3aWR0aCkgeworICAgICAgaWYgKHdpZHRoID4gMCkgeworICAgICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gd2lkdGg7CisgICAgICB9CisgICAgfQorCisgICAgc2V0TGluZUNhcChzdHlsZSkgeworICAgICAgdGhpcy5jdXJyZW50LmxpbmVDYXAgPSBMSU5FX0NBUF9TVFlMRVNbc3R5bGVdOworICAgIH0KKworICAgIHNldExpbmVKb2luKHN0eWxlKSB7CisgICAgICB0aGlzLmN1cnJlbnQubGluZUpvaW4gPSBMSU5FX0pPSU5fU1RZTEVTW3N0eWxlXTsKKyAgICB9CisKKyAgICBzZXRNaXRlckxpbWl0KGxpbWl0KSB7CisgICAgICB0aGlzLmN1cnJlbnQubWl0ZXJMaW1pdCA9IGxpbWl0OworICAgIH0KKworICAgIHNldFN0cm9rZUFscGhhKHN0cm9rZUFscGhhKSB7CisgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBzdHJva2VBbHBoYTsKKyAgICB9CisKKyAgICBzZXRTdHJva2VSR0JDb2xvcihyLCBnLCBiKSB7CisgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBfdXRpbC5VdGlsLm1ha2VDc3NSZ2IociwgZywgYik7CisgICAgfQorCisgICAgc2V0RmlsbEFscGhhKGZpbGxBbHBoYSkgeworICAgICAgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSA9IGZpbGxBbHBoYTsKKyAgICB9CisKKyAgICBzZXRGaWxsUkdCQ29sb3IociwgZywgYikgeworICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IF91dGlsLlV0aWwubWFrZUNzc1JnYihyLCBnLCBiKTsKKyAgICAgIHRoaXMuY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTsKKyAgICAgIHRoaXMuY3VycmVudC54Y29vcmRzID0gW107CisgICAgICB0aGlzLmN1cnJlbnQueWNvb3JkcyA9IFtdOworICAgIH0KKworICAgIHNldFN0cm9rZUNvbG9yTihhcmdzKSB7CisgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSB0aGlzLl9tYWtlQ29sb3JOX1BhdHRlcm4oYXJncyk7CisgICAgfQorCisgICAgc2V0RmlsbENvbG9yTihhcmdzKSB7CisgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpOworICAgIH0KKworICAgIHNoYWRpbmdGaWxsKGFyZ3MpIHsKKyAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy52aWV3cG9ydC53aWR0aDsKKyAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMudmlld3BvcnQuaGVpZ2h0OworCisgICAgICBjb25zdCBpbnYgPSBfdXRpbC5VdGlsLmludmVyc2VUcmFuc2Zvcm0odGhpcy50cmFuc2Zvcm1NYXRyaXgpOworCisgICAgICBjb25zdCBibCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBpbnYpOworCisgICAgICBjb25zdCBiciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIGhlaWdodF0sIGludik7CisKKyAgICAgIGNvbnN0IHVsID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIDBdLCBpbnYpOworCisgICAgICBjb25zdCB1ciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCBoZWlnaHRdLCBpbnYpOworCisgICAgICBjb25zdCB4MCA9IE1hdGgubWluKGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTsKKyAgICAgIGNvbnN0IHkwID0gTWF0aC5taW4oYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pOworICAgICAgY29uc3QgeDEgPSBNYXRoLm1heChibFswXSwgYnJbMF0sIHVsWzBdLCB1clswXSk7CisgICAgICBjb25zdCB5MSA9IE1hdGgubWF4KGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTsKKyAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCB4MCk7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgeTApOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAid2lkdGgiLCB4MSAtIHgwKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImhlaWdodCIsIHkxIC0geTApOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbCIsIHRoaXMuX21ha2VTaGFkaW5nUGF0dGVybihhcmdzKSk7CisKKyAgICAgIGlmICh0aGlzLmN1cnJlbnQuZmlsbEFscGhhIDwgMSkgeworICAgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsLW9wYWNpdHkiLCB0aGlzLmN1cnJlbnQuZmlsbEFscGhhKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChyZWN0KTsKKyAgICB9CisKKyAgICBfbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpIHsKKyAgICAgIGlmIChhcmdzWzBdID09PSAiVGlsaW5nUGF0dGVybiIpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VUaWxpbmdQYXR0ZXJuKGFyZ3MpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5fbWFrZVNoYWRpbmdQYXR0ZXJuKGFyZ3MpOworICAgIH0KKworICAgIF9tYWtlVGlsaW5nUGF0dGVybihhcmdzKSB7CisgICAgICBjb25zdCBjb2xvciA9IGFyZ3NbMV07CisgICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBhcmdzWzJdOworICAgICAgY29uc3QgbWF0cml4ID0gYXJnc1szXSB8fCBfdXRpbC5JREVOVElUWV9NQVRSSVg7CisgICAgICBjb25zdCBbeDAsIHkwLCB4MSwgeTFdID0gYXJnc1s0XTsKKyAgICAgIGNvbnN0IHhzdGVwID0gYXJnc1s1XTsKKyAgICAgIGNvbnN0IHlzdGVwID0gYXJnc1s2XTsKKyAgICAgIGNvbnN0IHBhaW50VHlwZSA9IGFyZ3NbN107CisgICAgICBjb25zdCB0aWxpbmdJZCA9IGBzaGFkaW5nJHtzaGFkaW5nQ291bnQrK31gOworCisgICAgICBjb25zdCBbdHgwLCB0eTBdID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbeDAsIHkwXSwgbWF0cml4KTsKKworICAgICAgY29uc3QgW3R4MSwgdHkxXSA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gxLCB5MV0sIG1hdHJpeCk7CisKKyAgICAgIGNvbnN0IFt4c2NhbGUsIHlzY2FsZV0gPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG1hdHJpeCk7CisKKyAgICAgIGNvbnN0IHR4c3RlcCA9IHhzdGVwICogeHNjYWxlOworICAgICAgY29uc3QgdHlzdGVwID0geXN0ZXAgKiB5c2NhbGU7CisgICAgICBjb25zdCB0aWxpbmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnBhdHRlcm4iKTsKKyAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaWQiLCB0aWxpbmdJZCk7CisgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgInBhdHRlcm5Vbml0cyIsICJ1c2VyU3BhY2VPblVzZSIpOworICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ3aWR0aCIsIHR4c3RlcCk7CisgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgImhlaWdodCIsIHR5c3RlcCk7CisgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCBgJHt0eDB9YCk7CisgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCBgJHt0eTB9YCk7CisgICAgICBjb25zdCBzdmcgPSB0aGlzLnN2ZzsKKyAgICAgIGNvbnN0IHRyYW5zZm9ybU1hdHJpeCA9IHRoaXMudHJhbnNmb3JtTWF0cml4OworICAgICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjsKKyAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yOworICAgICAgY29uc3QgYmJveCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodHgxIC0gdHgwLCB0eTEgLSB0eTApOworICAgICAgdGhpcy5zdmcgPSBiYm94OworICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBtYXRyaXg7CisKKyAgICAgIGlmIChwYWludFR5cGUgPT09IDIpIHsKKyAgICAgICAgY29uc3QgY3NzQ29sb3IgPSBfdXRpbC5VdGlsLm1ha2VDc3NSZ2IoLi4uY29sb3IpOworCisgICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBjc3NDb2xvcjsKKyAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7CisgICAgICB9CisKKyAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSk7CisgICAgICB0aGlzLnN2ZyA9IHN2ZzsKKyAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gdHJhbnNmb3JtTWF0cml4OworICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGZpbGxDb2xvcjsKKyAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHN0cm9rZUNvbG9yOworICAgICAgdGlsaW5nLmFwcGVuZENoaWxkKGJib3guY2hpbGROb2Rlc1swXSk7CisgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQodGlsaW5nKTsKKyAgICAgIHJldHVybiBgdXJsKCMke3RpbGluZ0lkfSlgOworICAgIH0KKworICAgIF9tYWtlU2hhZGluZ1BhdHRlcm4oYXJncykgeworICAgICAgc3dpdGNoIChhcmdzWzBdKSB7CisgICAgICAgIGNhc2UgIlJhZGlhbEF4aWFsIjoKKyAgICAgICAgICBjb25zdCBzaGFkaW5nSWQgPSBgc2hhZGluZyR7c2hhZGluZ0NvdW50Kyt9YDsKKyAgICAgICAgICBjb25zdCBjb2xvclN0b3BzID0gYXJnc1szXTsKKyAgICAgICAgICBsZXQgZ3JhZGllbnQ7CisKKyAgICAgICAgICBzd2l0Y2ggKGFyZ3NbMV0pIHsKKyAgICAgICAgICAgIGNhc2UgImF4aWFsIjoKKyAgICAgICAgICAgICAgY29uc3QgcG9pbnQwID0gYXJnc1s0XTsKKyAgICAgICAgICAgICAgY29uc3QgcG9pbnQxID0gYXJnc1s1XTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmxpbmVhckdyYWRpZW50Iik7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJpZCIsIHNoYWRpbmdJZCk7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJncmFkaWVudFVuaXRzIiwgInVzZXJTcGFjZU9uVXNlIik7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4MSIsIHBvaW50MFswXSk7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5MSIsIHBvaW50MFsxXSk7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4MiIsIHBvaW50MVswXSk7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5MiIsIHBvaW50MVsxXSk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJyYWRpYWwiOgorICAgICAgICAgICAgICBjb25zdCBmb2NhbFBvaW50ID0gYXJnc1s0XTsKKyAgICAgICAgICAgICAgY29uc3QgY2lyY2xlUG9pbnQgPSBhcmdzWzVdOworICAgICAgICAgICAgICBjb25zdCBmb2NhbFJhZGl1cyA9IGFyZ3NbNl07CisgICAgICAgICAgICAgIGNvbnN0IGNpcmNsZVJhZGl1cyA9IGFyZ3NbN107CisgICAgICAgICAgICAgIGdyYWRpZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyYWRpYWxHcmFkaWVudCIpOworICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaWQiLCBzaGFkaW5nSWQpOworICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZ3JhZGllbnRVbml0cyIsICJ1c2VyU3BhY2VPblVzZSIpOworICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiY3giLCBjaXJjbGVQb2ludFswXSk7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJjeSIsIGNpcmNsZVBvaW50WzFdKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInIiLCBjaXJjbGVSYWRpdXMpOworICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZngiLCBmb2NhbFBvaW50WzBdKTsKKyAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZ5IiwgZm9jYWxQb2ludFsxXSk7CisgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmciIsIGZvY2FsUmFkaXVzKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBSYWRpYWxBeGlhbCB0eXBlOiAke2FyZ3NbMV19YCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChjb25zdCBjb2xvclN0b3Agb2YgY29sb3JTdG9wcykgeworICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6c3RvcCIpOworICAgICAgICAgICAgc3RvcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAib2Zmc2V0IiwgY29sb3JTdG9wWzBdKTsKKyAgICAgICAgICAgIHN0b3Auc2V0QXR0cmlidXRlTlMobnVsbCwgInN0b3AtY29sb3IiLCBjb2xvclN0b3BbMV0pOworICAgICAgICAgICAgZ3JhZGllbnQuYXBwZW5kQ2hpbGQoc3RvcCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZENoaWxkKGdyYWRpZW50KTsKKyAgICAgICAgICByZXR1cm4gYHVybCgjJHtzaGFkaW5nSWR9KWA7CisKKyAgICAgICAgY2FzZSAiTWVzaCI6CisgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmltcGxlbWVudGVkIHBhdHRlcm4gTWVzaCIpOworICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGNhc2UgIkR1bW15IjoKKyAgICAgICAgICByZXR1cm4gImhvdHBpbmsiOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIElSIHR5cGU6ICR7YXJnc1swXX1gKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzZXREYXNoKGRhc2hBcnJheSwgZGFzaFBoYXNlKSB7CisgICAgICB0aGlzLmN1cnJlbnQuZGFzaEFycmF5ID0gZGFzaEFycmF5OworICAgICAgdGhpcy5jdXJyZW50LmRhc2hQaGFzZSA9IGRhc2hQaGFzZTsKKyAgICB9CisKKyAgICBjb25zdHJ1Y3RQYXRoKG9wcywgYXJncykgeworICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKyAgICAgIGxldCB4ID0gY3VycmVudC54LAorICAgICAgICAgIHkgPSBjdXJyZW50Lnk7CisgICAgICBsZXQgZCA9IFtdOworICAgICAgbGV0IGogPSAwOworCisgICAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykgeworICAgICAgICBzd2l0Y2ggKG9wIHwgMCkgeworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnJlY3RhbmdsZToKKyAgICAgICAgICAgIHggPSBhcmdzW2orK107CisgICAgICAgICAgICB5ID0gYXJnc1tqKytdOworICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBhcmdzW2orK107CisgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhcmdzW2orK107CisgICAgICAgICAgICBjb25zdCB4dyA9IHggKyB3aWR0aDsKKyAgICAgICAgICAgIGNvbnN0IHloID0geSArIGhlaWdodDsKKyAgICAgICAgICAgIGQucHVzaCgiTSIsIHBmKHgpLCBwZih5KSwgIkwiLCBwZih4dyksIHBmKHkpLCAiTCIsIHBmKHh3KSwgcGYoeWgpLCAiTCIsIHBmKHgpLCBwZih5aCksICJaIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1vdmVUbzoKKyAgICAgICAgICAgIHggPSBhcmdzW2orK107CisgICAgICAgICAgICB5ID0gYXJnc1tqKytdOworICAgICAgICAgICAgZC5wdXNoKCJNIiwgcGYoeCksIHBmKHkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubGluZVRvOgorICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTsKKyAgICAgICAgICAgIHkgPSBhcmdzW2orK107CisgICAgICAgICAgICBkLnB1c2goIkwiLCBwZih4KSwgcGYoeSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jdXJ2ZVRvOgorICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDRdOworICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDVdOworICAgICAgICAgICAgZC5wdXNoKCJDIiwgcGYoYXJnc1tqXSksIHBmKGFyZ3NbaiArIDFdKSwgcGYoYXJnc1tqICsgMl0pLCBwZihhcmdzW2ogKyAzXSksIHBmKHgpLCBwZih5KSk7CisgICAgICAgICAgICBqICs9IDY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8yOgorICAgICAgICAgICAgZC5wdXNoKCJDIiwgcGYoeCksIHBmKHkpLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZihhcmdzW2ogKyAyXSksIHBmKGFyZ3NbaiArIDNdKSk7CisgICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07CisgICAgICAgICAgICB5ID0gYXJnc1tqICsgM107CisgICAgICAgICAgICBqICs9IDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8zOgorICAgICAgICAgICAgeCA9IGFyZ3NbaiArIDJdOworICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDNdOworICAgICAgICAgICAgZC5wdXNoKCJDIiwgcGYoYXJnc1tqXSksIHBmKGFyZ3NbaiArIDFdKSwgcGYoeCksIHBmKHkpLCBwZih4KSwgcGYoeSkpOworICAgICAgICAgICAgaiArPSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVBhdGg6CisgICAgICAgICAgICBkLnB1c2goIloiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGQgPSBkLmpvaW4oIiAiKTsKKworICAgICAgaWYgKGN1cnJlbnQucGF0aCAmJiBvcHMubGVuZ3RoID4gMCAmJiBvcHNbMF0gIT09IF91dGlsLk9QUy5yZWN0YW5nbGUgJiYgb3BzWzBdICE9PSBfdXRpbC5PUFMubW92ZVRvKSB7CisgICAgICAgIGQgPSBjdXJyZW50LnBhdGguZ2V0QXR0cmlidXRlTlMobnVsbCwgImQiKSArIGQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50LnBhdGggPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnBhdGgiKTsKKworICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZENoaWxkKGN1cnJlbnQucGF0aCk7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZCIsIGQpOworICAgICAgY3VycmVudC5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgIm5vbmUiKTsKKyAgICAgIGN1cnJlbnQuZWxlbWVudCA9IGN1cnJlbnQucGF0aDsKKyAgICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpOworICAgIH0KKworICAgIGVuZFBhdGgoKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgY3VycmVudC5wYXRoID0gbnVsbDsKKworICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDbGlwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCFjdXJyZW50LmVsZW1lbnQpIHsKKyAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgY2xpcElkID0gYGNsaXBwYXRoJHtjbGlwQ291bnQrK31gOworICAgICAgY29uc3QgY2xpcFBhdGggPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmNsaXBQYXRoIik7CisgICAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaWQiLCBjbGlwSWQpOworICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgInRyYW5zZm9ybSIsIHBtKHRoaXMudHJhbnNmb3JtTWF0cml4KSk7CisgICAgICBjb25zdCBjbGlwRWxlbWVudCA9IGN1cnJlbnQuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7CisKKyAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwID09PSAiZXZlbm9kZCIpIHsKKyAgICAgICAgY2xpcEVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImNsaXAtcnVsZSIsICJldmVub2RkIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjbGlwRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiY2xpcC1ydWxlIiwgIm5vbnplcm8iKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7CisgICAgICBjbGlwUGF0aC5hcHBlbmRDaGlsZChjbGlwRWxlbWVudCk7CisgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQoY2xpcFBhdGgpOworCisgICAgICBpZiAoY3VycmVudC5hY3RpdmVDbGlwVXJsKSB7CisgICAgICAgIGN1cnJlbnQuY2xpcEdyb3VwID0gbnVsbDsKKyAgICAgICAgdGhpcy5leHRyYVN0YWNrLmZvckVhY2goZnVuY3Rpb24gKHByZXYpIHsKKyAgICAgICAgICBwcmV2LmNsaXBHcm91cCA9IG51bGw7CisgICAgICAgIH0pOworICAgICAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiY2xpcC1wYXRoIiwgY3VycmVudC5hY3RpdmVDbGlwVXJsKTsKKyAgICAgIH0KKworICAgICAgY3VycmVudC5hY3RpdmVDbGlwVXJsID0gYHVybCgjJHtjbGlwSWR9KWA7CisgICAgICB0aGlzLnRncnAgPSBudWxsOworICAgIH0KKworICAgIGNsaXAodHlwZSkgeworICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHR5cGU7CisgICAgfQorCisgICAgY2xvc2VQYXRoKCkgeworICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKworICAgICAgaWYgKGN1cnJlbnQucGF0aCkgeworICAgICAgICBjb25zdCBkID0gYCR7Y3VycmVudC5wYXRoLmdldEF0dHJpYnV0ZU5TKG51bGwsICJkIil9WmA7CisgICAgICAgIGN1cnJlbnQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZCIsIGQpOworICAgICAgfQorICAgIH0KKworICAgIHNldExlYWRpbmcobGVhZGluZykgeworICAgICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZzsKKyAgICB9CisKKyAgICBzZXRUZXh0UmlzZSh0ZXh0UmlzZSkgeworICAgICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gdGV4dFJpc2U7CisgICAgfQorCisgICAgc2V0VGV4dFJlbmRlcmluZ01vZGUodGV4dFJlbmRlcmluZ01vZGUpIHsKKyAgICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IHRleHRSZW5kZXJpbmdNb2RlOworICAgIH0KKworICAgIHNldEhTY2FsZShzY2FsZSkgeworICAgICAgdGhpcy5jdXJyZW50LnRleHRIU2NhbGUgPSBzY2FsZSAvIDEwMDsKKyAgICB9CisKKyAgICBzZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KSB7fQorCisgICAgc2V0RmxhdG5lc3MoZmxhdG5lc3MpIHt9CisKKyAgICBzZXRHU3RhdGUoc3RhdGVzKSB7CisgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzdGF0ZXMpIHsKKyAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICBjYXNlICJMVyI6CisgICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkxDIjoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkxKIjoKKyAgICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4odmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJNTCI6CisgICAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQodmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJEIjoKKyAgICAgICAgICAgIHRoaXMuc2V0RGFzaCh2YWx1ZVswXSwgdmFsdWVbMV0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJSSSI6CisgICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkZMIjoKKyAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3ModmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJGb250IjoKKyAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIkNBIjoKKyAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlQWxwaGEodmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICJjYSI6CisgICAgICAgICAgICB0aGlzLnNldEZpbGxBbHBoYSh2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFVuaW1wbGVtZW50ZWQgZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAke2tleX1gKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZmlsbCgpIHsKKyAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisKKyAgICAgIGlmIChjdXJyZW50LmVsZW1lbnQpIHsKKyAgICAgICAgY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgY3VycmVudC5maWxsQ29sb3IpOworICAgICAgICBjdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwtb3BhY2l0eSIsIGN1cnJlbnQuZmlsbEFscGhhKTsKKyAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICB9CisgICAgfQorCisgICAgc3Ryb2tlKCkgeworICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDsKKworICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudCkgeworICAgICAgICB0aGlzLl9zZXRTdHJva2VBdHRyaWJ1dGVzKGN1cnJlbnQuZWxlbWVudCk7CisKKyAgICAgICAgY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsIiwgIm5vbmUiKTsKKyAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICB9CisgICAgfQorCisgICAgX3NldFN0cm9rZUF0dHJpYnV0ZXMoZWxlbWVudCwgbGluZVdpZHRoU2NhbGUgPSAxKSB7CisgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50OworICAgICAgbGV0IGRhc2hBcnJheSA9IGN1cnJlbnQuZGFzaEFycmF5OworCisgICAgICBpZiAobGluZVdpZHRoU2NhbGUgIT09IDEgJiYgZGFzaEFycmF5Lmxlbmd0aCA+IDApIHsKKyAgICAgICAgZGFzaEFycmF5ID0gZGFzaEFycmF5Lm1hcChmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gbGluZVdpZHRoU2NhbGUgKiB2YWx1ZTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZSIsIGN1cnJlbnQuc3Ryb2tlQ29sb3IpOworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAic3Ryb2tlLW9wYWNpdHkiLCBjdXJyZW50LnN0cm9rZUFscGhhKTsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZS1taXRlcmxpbWl0IiwgcGYoY3VycmVudC5taXRlckxpbWl0KSk7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2UtbGluZWNhcCIsIGN1cnJlbnQubGluZUNhcCk7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2UtbGluZWpvaW4iLCBjdXJyZW50LmxpbmVKb2luKTsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZS13aWR0aCIsIHBmKGxpbmVXaWR0aFNjYWxlICogY3VycmVudC5saW5lV2lkdGgpICsgInB4Iik7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJzdHJva2UtZGFzaGFycmF5IiwgZGFzaEFycmF5Lm1hcChwZikuam9pbigiICIpKTsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgInN0cm9rZS1kYXNob2Zmc2V0IiwgcGYobGluZVdpZHRoU2NhbGUgKiBjdXJyZW50LmRhc2hQaGFzZSkgKyAicHgiKTsKKyAgICB9CisKKyAgICBlb0ZpbGwoKSB7CisgICAgICBpZiAodGhpcy5jdXJyZW50LmVsZW1lbnQpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwtcnVsZSIsICJldmVub2RkIik7CisgICAgICB9CisKKyAgICAgIHRoaXMuZmlsbCgpOworICAgIH0KKworICAgIGZpbGxTdHJva2UoKSB7CisgICAgICB0aGlzLnN0cm9rZSgpOworICAgICAgdGhpcy5maWxsKCk7CisgICAgfQorCisgICAgZW9GaWxsU3Ryb2tlKCkgeworICAgICAgaWYgKHRoaXMuY3VycmVudC5lbGVtZW50KSB7CisgICAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJmaWxsLXJ1bGUiLCAiZXZlbm9kZCIpOworICAgICAgfQorCisgICAgICB0aGlzLmZpbGxTdHJva2UoKTsKKyAgICB9CisKKyAgICBjbG9zZVN0cm9rZSgpIHsKKyAgICAgIHRoaXMuY2xvc2VQYXRoKCk7CisgICAgICB0aGlzLnN0cm9rZSgpOworICAgIH0KKworICAgIGNsb3NlRmlsbFN0cm9rZSgpIHsKKyAgICAgIHRoaXMuY2xvc2VQYXRoKCk7CisgICAgICB0aGlzLmZpbGxTdHJva2UoKTsKKyAgICB9CisKKyAgICBjbG9zZUVPRmlsbFN0cm9rZSgpIHsKKyAgICAgIHRoaXMuY2xvc2VQYXRoKCk7CisgICAgICB0aGlzLmVvRmlsbFN0cm9rZSgpOworICAgIH0KKworICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHsKKyAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCAiMCIpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsICIwIik7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ3aWR0aCIsICIxcHgiKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImhlaWdodCIsICIxcHgiKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImZpbGwiLCB0aGlzLmN1cnJlbnQuZmlsbENvbG9yKTsKKworICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChyZWN0KTsKKyAgICB9CisKKyAgICBwYWludEltYWdlWE9iamVjdChvYmpJZCkgeworICAgICAgY29uc3QgaW1nRGF0YSA9IG9iaklkLnN0YXJ0c1dpdGgoImdfIikgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KG9iaklkKSA6IHRoaXMub2Jqcy5nZXQob2JqSWQpOworCisgICAgICBpZiAoIWltZ0RhdGEpIHsKKyAgICAgICAgKDAsIF91dGlsLndhcm4pKGBEZXBlbmRlbnQgaW1hZ2Ugd2l0aCBvYmplY3QgSUQgJHtvYmpJZH0gaXMgbm90IHJlYWR5IHlldGApOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSk7CisgICAgfQorCisgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSwgbWFzaykgeworICAgICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoOworICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7CisgICAgICBjb25zdCBpbWdTcmMgPSBjb252ZXJ0SW1nRGF0YVRvUG5nKGltZ0RhdGEsIHRoaXMuZm9yY2VEYXRhU2NoZW1hLCAhIW1hc2spOworICAgICAgY29uc3QgY2xpcHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTsKKyAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ4IiwgIjAiKTsKKyAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgIjAiKTsKKyAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ3aWR0aCIsIHBmKHdpZHRoKSk7CisgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiaGVpZ2h0IiwgcGYoaGVpZ2h0KSk7CisgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGNsaXByZWN0OworICAgICAgdGhpcy5jbGlwKCJub256ZXJvIik7CisgICAgICBjb25zdCBpbWdFbCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6aW1hZ2UiKTsKKyAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKFhMSU5LX05TLCAieGxpbms6aHJlZiIsIGltZ1NyYyk7CisgICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieCIsICIwIik7CisgICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieSIsIHBmKC1oZWlnaHQpKTsKKyAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ3aWR0aCIsIHBmKHdpZHRoKSArICJweCIpOworICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgImhlaWdodCIsIHBmKGhlaWdodCkgKyAicHgiKTsKKyAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsICJ0cmFuc2Zvcm0iLCBgc2NhbGUoJHtwZigxIC8gd2lkdGgpfSAke3BmKC0xIC8gaGVpZ2h0KX0pYCk7CisKKyAgICAgIGlmIChtYXNrKSB7CisgICAgICAgIG1hc2suYXBwZW5kQ2hpbGQoaW1nRWwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmRDaGlsZChpbWdFbCk7CisgICAgICB9CisgICAgfQorCisgICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0KGltZ0RhdGEpIHsKKyAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7CisgICAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDsKKyAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGN1cnJlbnQuZmlsbENvbG9yOworICAgICAgY3VycmVudC5tYXNrSWQgPSBgbWFzayR7bWFza0NvdW50Kyt9YDsKKyAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOm1hc2siKTsKKyAgICAgIG1hc2suc2V0QXR0cmlidXRlTlMobnVsbCwgImlkIiwgY3VycmVudC5tYXNrSWQpOworICAgICAgY29uc3QgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAieCIsICIwIik7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJ5IiwgIjAiKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgcGYod2lkdGgpKTsKKyAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImhlaWdodCIsIHBmKGhlaWdodCkpOworICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiZmlsbCIsIGZpbGxDb2xvcik7CisgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsICJtYXNrIiwgYHVybCgjJHtjdXJyZW50Lm1hc2tJZH0pYCk7CisgICAgICB0aGlzLmRlZnMuYXBwZW5kQ2hpbGQobWFzayk7CisKKyAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kQ2hpbGQocmVjdCk7CisKKyAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSwgbWFzayk7CisgICAgfQorCisgICAgcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkgeworICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0cml4KSAmJiBtYXRyaXgubGVuZ3RoID09PSA2KSB7CisgICAgICAgIHRoaXMudHJhbnNmb3JtKG1hdHJpeFswXSwgbWF0cml4WzFdLCBtYXRyaXhbMl0sIG1hdHJpeFszXSwgbWF0cml4WzRdLCBtYXRyaXhbNV0pOworICAgICAgfQorCisgICAgICBpZiAoYmJveCkgeworICAgICAgICBjb25zdCB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdOworICAgICAgICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTsKKyAgICAgICAgY29uc3QgY2xpcHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTsKKyAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIngiLCBiYm94WzBdKTsKKyAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgInkiLCBiYm94WzFdKTsKKyAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIiwgcGYod2lkdGgpKTsKKyAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgImhlaWdodCIsIHBmKGhlaWdodCkpOworICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGNsaXByZWN0OworICAgICAgICB0aGlzLmNsaXAoIm5vbnplcm8iKTsKKyAgICAgICAgdGhpcy5lbmRQYXRoKCk7CisgICAgICB9CisgICAgfQorCisgICAgcGFpbnRGb3JtWE9iamVjdEVuZCgpIHt9CisKKyAgICBfaW5pdGlhbGl6ZSh2aWV3cG9ydCkgeworICAgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTsKKyAgICAgIGNvbnN0IGRlZmluaXRpb25zID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpkZWZzIik7CisgICAgICBzdmcuYXBwZW5kQ2hpbGQoZGVmaW5pdGlvbnMpOworICAgICAgdGhpcy5kZWZzID0gZGVmaW5pdGlvbnM7CisgICAgICBjb25zdCByb290R3JvdXAgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmciKTsKKyAgICAgIHJvb3RHcm91cC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAidHJhbnNmb3JtIiwgcG0odmlld3BvcnQudHJhbnNmb3JtKSk7CisgICAgICBzdmcuYXBwZW5kQ2hpbGQocm9vdEdyb3VwKTsKKyAgICAgIHRoaXMuc3ZnID0gcm9vdEdyb3VwOworICAgICAgcmV0dXJuIHN2ZzsKKyAgICB9CisKKyAgICBfZW5zdXJlQ2xpcEdyb3VwKCkgeworICAgICAgaWYgKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKSB7CisgICAgICAgIGNvbnN0IGNsaXBHcm91cCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZyIpOworICAgICAgICBjbGlwR3JvdXAuc2V0QXR0cmlidXRlTlMobnVsbCwgImNsaXAtcGF0aCIsIHRoaXMuY3VycmVudC5hY3RpdmVDbGlwVXJsKTsKKyAgICAgICAgdGhpcy5zdmcuYXBwZW5kQ2hpbGQoY2xpcEdyb3VwKTsKKyAgICAgICAgdGhpcy5jdXJyZW50LmNsaXBHcm91cCA9IGNsaXBHcm91cDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC5jbGlwR3JvdXA7CisgICAgfQorCisgICAgX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkgeworICAgICAgaWYgKCF0aGlzLnRncnApIHsKKyAgICAgICAgdGhpcy50Z3JwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpnIik7CisgICAgICAgIHRoaXMudGdycC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAidHJhbnNmb3JtIiwgcG0odGhpcy50cmFuc2Zvcm1NYXRyaXgpKTsKKworICAgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpIHsKKyAgICAgICAgICB0aGlzLl9lbnN1cmVDbGlwR3JvdXAoKS5hcHBlbmRDaGlsZCh0aGlzLnRncnApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuc3ZnLmFwcGVuZENoaWxkKHRoaXMudGdycCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMudGdycDsKKyAgICB9CisKKyAgfTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS90ZXh0X2xheWVyLmpzIGIvbGliL2Rpc3BsYXkvdGV4dF9sYXllci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjgxZDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvdGV4dF9sYXllci5qcwpAQCAtMCwwICsxLDcxMyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMucmVuZGVyVGV4dExheWVyID0gdm9pZCAwOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgcmVuZGVyVGV4dExheWVyID0gZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyQ2xvc3VyZSgpIHsKKyAgdmFyIE1BWF9URVhUX0RJVlNfVE9fUkVOREVSID0gMTAwMDAwOworICB2YXIgTm9uV2hpdGVzcGFjZVJlZ2V4cCA9IC9cUy87CisKKyAgZnVuY3Rpb24gaXNBbGxXaGl0ZXNwYWNlKHN0cikgeworICAgIHJldHVybiAhTm9uV2hpdGVzcGFjZVJlZ2V4cC50ZXN0KHN0cik7CisgIH0KKworICBmdW5jdGlvbiBhcHBlbmRUZXh0KHRhc2ssIGdlb20sIHN0eWxlcykgeworICAgIHZhciB0ZXh0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworICAgIHZhciB0ZXh0RGl2UHJvcGVydGllcyA9IHsKKyAgICAgIGFuZ2xlOiAwLAorICAgICAgY2FudmFzV2lkdGg6IDAsCisgICAgICBpc1doaXRlc3BhY2U6IGZhbHNlLAorICAgICAgb3JpZ2luYWxUcmFuc2Zvcm06IG51bGwsCisgICAgICBwYWRkaW5nQm90dG9tOiAwLAorICAgICAgcGFkZGluZ0xlZnQ6IDAsCisgICAgICBwYWRkaW5nUmlnaHQ6IDAsCisgICAgICBwYWRkaW5nVG9wOiAwLAorICAgICAgc2NhbGU6IDEKKyAgICB9OworCisgICAgdGFzay5fdGV4dERpdnMucHVzaCh0ZXh0RGl2KTsKKworICAgIGlmIChpc0FsbFdoaXRlc3BhY2UoZ2VvbS5zdHIpKSB7CisgICAgICB0ZXh0RGl2UHJvcGVydGllcy5pc1doaXRlc3BhY2UgPSB0cnVlOworCisgICAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHR4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGFzay5fdmlld3BvcnQudHJhbnNmb3JtLCBnZW9tLnRyYW5zZm9ybSk7CisKKyAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKHR4WzFdLCB0eFswXSk7CisgICAgdmFyIHN0eWxlID0gc3R5bGVzW2dlb20uZm9udE5hbWVdOworCisgICAgaWYgKHN0eWxlLnZlcnRpY2FsKSB7CisgICAgICBhbmdsZSArPSBNYXRoLlBJIC8gMjsKKyAgICB9CisKKyAgICB2YXIgZm9udEhlaWdodCA9IE1hdGguc3FydCh0eFsyXSAqIHR4WzJdICsgdHhbM10gKiB0eFszXSk7CisgICAgdmFyIGZvbnRBc2NlbnQgPSBmb250SGVpZ2h0OworCisgICAgaWYgKHN0eWxlLmFzY2VudCkgeworICAgICAgZm9udEFzY2VudCA9IHN0eWxlLmFzY2VudCAqIGZvbnRBc2NlbnQ7CisgICAgfSBlbHNlIGlmIChzdHlsZS5kZXNjZW50KSB7CisgICAgICBmb250QXNjZW50ID0gKDEgKyBzdHlsZS5kZXNjZW50KSAqIGZvbnRBc2NlbnQ7CisgICAgfQorCisgICAgbGV0IGxlZnQsIHRvcDsKKworICAgIGlmIChhbmdsZSA9PT0gMCkgeworICAgICAgbGVmdCA9IHR4WzRdOworICAgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50OworICAgIH0gZWxzZSB7CisgICAgICBsZWZ0ID0gdHhbNF0gKyBmb250QXNjZW50ICogTWF0aC5zaW4oYW5nbGUpOworICAgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50ICogTWF0aC5jb3MoYW5nbGUpOworICAgIH0KKworICAgIHRleHREaXYuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgOworICAgIHRleHREaXYuc3R5bGUudG9wID0gYCR7dG9wfXB4YDsKKyAgICB0ZXh0RGl2LnN0eWxlLmZvbnRTaXplID0gYCR7Zm9udEhlaWdodH1weGA7CisgICAgdGV4dERpdi5zdHlsZS5mb250RmFtaWx5ID0gc3R5bGUuZm9udEZhbWlseTsKKyAgICB0ZXh0RGl2LnRleHRDb250ZW50ID0gZ2VvbS5zdHI7CisKKyAgICBpZiAodGFzay5fZm9udEluc3BlY3RvckVuYWJsZWQpIHsKKyAgICAgIHRleHREaXYuZGF0YXNldC5mb250TmFtZSA9IGdlb20uZm9udE5hbWU7CisgICAgfQorCisgICAgaWYgKGFuZ2xlICE9PSAwKSB7CisgICAgICB0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSA9IGFuZ2xlICogKDE4MCAvIE1hdGguUEkpOworICAgIH0KKworICAgIGxldCBzaG91bGRTY2FsZVRleHQgPSBmYWxzZTsKKworICAgIGlmIChnZW9tLnN0ci5sZW5ndGggPiAxKSB7CisgICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoZ2VvbS50cmFuc2Zvcm1bMF0gIT09IGdlb20udHJhbnNmb3JtWzNdKSB7CisgICAgICBjb25zdCBhYnNTY2FsZVggPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVswXSksCisgICAgICAgICAgICBhYnNTY2FsZVkgPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVszXSk7CisKKyAgICAgIGlmIChhYnNTY2FsZVggIT09IGFic1NjYWxlWSAmJiBNYXRoLm1heChhYnNTY2FsZVgsIGFic1NjYWxlWSkgLyBNYXRoLm1pbihhYnNTY2FsZVgsIGFic1NjYWxlWSkgPiAxLjUpIHsKKyAgICAgICAgc2hvdWxkU2NhbGVUZXh0ID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvdWxkU2NhbGVUZXh0KSB7CisgICAgICBpZiAoc3R5bGUudmVydGljYWwpIHsKKyAgICAgICAgdGV4dERpdlByb3BlcnRpZXMuY2FudmFzV2lkdGggPSBnZW9tLmhlaWdodCAqIHRhc2suX3ZpZXdwb3J0LnNjYWxlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dERpdlByb3BlcnRpZXMuY2FudmFzV2lkdGggPSBnZW9tLndpZHRoICogdGFzay5fdmlld3BvcnQuc2NhbGU7CisgICAgICB9CisgICAgfQorCisgICAgdGFzay5fdGV4dERpdlByb3BlcnRpZXMuc2V0KHRleHREaXYsIHRleHREaXZQcm9wZXJ0aWVzKTsKKworICAgIGlmICh0YXNrLl90ZXh0Q29udGVudFN0cmVhbSkgeworICAgICAgdGFzay5fbGF5b3V0VGV4dCh0ZXh0RGl2KTsKKyAgICB9CisKKyAgICBpZiAodGFzay5fZW5oYW5jZVRleHRTZWxlY3Rpb24pIHsKKyAgICAgIHZhciBhbmdsZUNvcyA9IDEsCisgICAgICAgICAgYW5nbGVTaW4gPSAwOworCisgICAgICBpZiAoYW5nbGUgIT09IDApIHsKKyAgICAgICAgYW5nbGVDb3MgPSBNYXRoLmNvcyhhbmdsZSk7CisgICAgICAgIGFuZ2xlU2luID0gTWF0aC5zaW4oYW5nbGUpOworICAgICAgfQorCisgICAgICB2YXIgZGl2V2lkdGggPSAoc3R5bGUudmVydGljYWwgPyBnZW9tLmhlaWdodCA6IGdlb20ud2lkdGgpICogdGFzay5fdmlld3BvcnQuc2NhbGU7CisgICAgICB2YXIgZGl2SGVpZ2h0ID0gZm9udEhlaWdodDsKKyAgICAgIHZhciBtLCBiOworCisgICAgICBpZiAoYW5nbGUgIT09IDApIHsKKyAgICAgICAgbSA9IFthbmdsZUNvcywgYW5nbGVTaW4sIC1hbmdsZVNpbiwgYW5nbGVDb3MsIGxlZnQsIHRvcF07CisgICAgICAgIGIgPSBfdXRpbC5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCBkaXZXaWR0aCwgZGl2SGVpZ2h0XSwgbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiID0gW2xlZnQsIHRvcCwgbGVmdCArIGRpdldpZHRoLCB0b3AgKyBkaXZIZWlnaHRdOworICAgICAgfQorCisgICAgICB0YXNrLl9ib3VuZHMucHVzaCh7CisgICAgICAgIGxlZnQ6IGJbMF0sCisgICAgICAgIHRvcDogYlsxXSwKKyAgICAgICAgcmlnaHQ6IGJbMl0sCisgICAgICAgIGJvdHRvbTogYlszXSwKKyAgICAgICAgZGl2OiB0ZXh0RGl2LAorICAgICAgICBzaXplOiBbZGl2V2lkdGgsIGRpdkhlaWdodF0sCisgICAgICAgIG0KKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJlbmRlcih0YXNrKSB7CisgICAgaWYgKHRhc2suX2NhbmNlbGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHRleHREaXZzID0gdGFzay5fdGV4dERpdnM7CisgICAgdmFyIGNhcGFiaWxpdHkgPSB0YXNrLl9jYXBhYmlsaXR5OworICAgIHZhciB0ZXh0RGl2c0xlbmd0aCA9IHRleHREaXZzLmxlbmd0aDsKKworICAgIGlmICh0ZXh0RGl2c0xlbmd0aCA+IE1BWF9URVhUX0RJVlNfVE9fUkVOREVSKSB7CisgICAgICB0YXNrLl9yZW5kZXJpbmdEb25lID0gdHJ1ZTsKKyAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGFzay5fdGV4dENvbnRlbnRTdHJlYW0pIHsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dERpdnNMZW5ndGg7IGkrKykgeworICAgICAgICB0YXNrLl9sYXlvdXRUZXh0KHRleHREaXZzW2ldKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YXNrLl9yZW5kZXJpbmdEb25lID0gdHJ1ZTsKKyAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbmRQb3NpdGl2ZU1pbih0cywgb2Zmc2V0LCBjb3VudCkgeworICAgIGxldCByZXN1bHQgPSAwOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBjb25zdCB0ID0gdHNbb2Zmc2V0KytdOworCisgICAgICBpZiAodCA+IDApIHsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gTWF0aC5taW4odCwgcmVzdWx0KSA6IHQ7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGV4cGFuZCh0YXNrKSB7CisgICAgdmFyIGJvdW5kcyA9IHRhc2suX2JvdW5kczsKKyAgICB2YXIgdmlld3BvcnQgPSB0YXNrLl92aWV3cG9ydDsKKyAgICB2YXIgZXhwYW5kZWQgPSBleHBhbmRCb3VuZHModmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCwgYm91bmRzKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwYW5kZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBkaXYgPSBib3VuZHNbaV0uZGl2OworCisgICAgICB2YXIgZGl2UHJvcGVydGllcyA9IHRhc2suX3RleHREaXZQcm9wZXJ0aWVzLmdldChkaXYpOworCisgICAgICBpZiAoZGl2UHJvcGVydGllcy5hbmdsZSA9PT0gMCkgeworICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdMZWZ0ID0gYm91bmRzW2ldLmxlZnQgLSBleHBhbmRlZFtpXS5sZWZ0OworICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdUb3AgPSBib3VuZHNbaV0udG9wIC0gZXhwYW5kZWRbaV0udG9wOworICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdSaWdodCA9IGV4cGFuZGVkW2ldLnJpZ2h0IC0gYm91bmRzW2ldLnJpZ2h0OworICAgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdCb3R0b20gPSBleHBhbmRlZFtpXS5ib3R0b20gLSBib3VuZHNbaV0uYm90dG9tOworCisgICAgICAgIHRhc2suX3RleHREaXZQcm9wZXJ0aWVzLnNldChkaXYsIGRpdlByb3BlcnRpZXMpOworCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgZSA9IGV4cGFuZGVkW2ldLAorICAgICAgICAgIGIgPSBib3VuZHNbaV07CisgICAgICB2YXIgbSA9IGIubSwKKyAgICAgICAgICBjID0gbVswXSwKKyAgICAgICAgICBzID0gbVsxXTsKKyAgICAgIHZhciBwb2ludHMgPSBbWzAsIDBdLCBbMCwgYi5zaXplWzFdXSwgW2Iuc2l6ZVswXSwgMF0sIGIuc2l6ZV07CisgICAgICB2YXIgdHMgPSBuZXcgRmxvYXQ2NEFycmF5KDY0KTsKKyAgICAgIHBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwLCBqKSB7CisgICAgICAgIHZhciB0ID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShwLCBtKTsKKworICAgICAgICB0c1tqICsgMF0gPSBjICYmIChlLmxlZnQgLSB0WzBdKSAvIGM7CisgICAgICAgIHRzW2ogKyA0XSA9IHMgJiYgKGUudG9wIC0gdFsxXSkgLyBzOworICAgICAgICB0c1tqICsgOF0gPSBjICYmIChlLnJpZ2h0IC0gdFswXSkgLyBjOworICAgICAgICB0c1tqICsgMTJdID0gcyAmJiAoZS5ib3R0b20gLSB0WzFdKSAvIHM7CisgICAgICAgIHRzW2ogKyAxNl0gPSBzICYmIChlLmxlZnQgLSB0WzBdKSAvIC1zOworICAgICAgICB0c1tqICsgMjBdID0gYyAmJiAoZS50b3AgLSB0WzFdKSAvIGM7CisgICAgICAgIHRzW2ogKyAyNF0gPSBzICYmIChlLnJpZ2h0IC0gdFswXSkgLyAtczsKKyAgICAgICAgdHNbaiArIDI4XSA9IGMgJiYgKGUuYm90dG9tIC0gdFsxXSkgLyBjOworICAgICAgICB0c1tqICsgMzJdID0gYyAmJiAoZS5sZWZ0IC0gdFswXSkgLyAtYzsKKyAgICAgICAgdHNbaiArIDM2XSA9IHMgJiYgKGUudG9wIC0gdFsxXSkgLyAtczsKKyAgICAgICAgdHNbaiArIDQwXSA9IGMgJiYgKGUucmlnaHQgLSB0WzBdKSAvIC1jOworICAgICAgICB0c1tqICsgNDRdID0gcyAmJiAoZS5ib3R0b20gLSB0WzFdKSAvIC1zOworICAgICAgICB0c1tqICsgNDhdID0gcyAmJiAoZS5sZWZ0IC0gdFswXSkgLyBzOworICAgICAgICB0c1tqICsgNTJdID0gYyAmJiAoZS50b3AgLSB0WzFdKSAvIC1jOworICAgICAgICB0c1tqICsgNTZdID0gcyAmJiAoZS5yaWdodCAtIHRbMF0pIC8gczsKKyAgICAgICAgdHNbaiArIDYwXSA9IGMgJiYgKGUuYm90dG9tIC0gdFsxXSkgLyAtYzsKKyAgICAgIH0pOworICAgICAgdmFyIGJveFNjYWxlID0gMSArIE1hdGgubWluKE1hdGguYWJzKGMpLCBNYXRoLmFicyhzKSk7CisgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdMZWZ0ID0gZmluZFBvc2l0aXZlTWluKHRzLCAzMiwgMTYpIC8gYm94U2NhbGU7CisgICAgICBkaXZQcm9wZXJ0aWVzLnBhZGRpbmdUb3AgPSBmaW5kUG9zaXRpdmVNaW4odHMsIDQ4LCAxNikgLyBib3hTY2FsZTsKKyAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ1JpZ2h0ID0gZmluZFBvc2l0aXZlTWluKHRzLCAwLCAxNikgLyBib3hTY2FsZTsKKyAgICAgIGRpdlByb3BlcnRpZXMucGFkZGluZ0JvdHRvbSA9IGZpbmRQb3NpdGl2ZU1pbih0cywgMTYsIDE2KSAvIGJveFNjYWxlOworCisgICAgICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQoZGl2LCBkaXZQcm9wZXJ0aWVzKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBleHBhbmRCb3VuZHMod2lkdGgsIGhlaWdodCwgYm94ZXMpIHsKKyAgICB2YXIgYm91bmRzID0gYm94ZXMubWFwKGZ1bmN0aW9uIChib3gsIGkpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHgxOiBib3gubGVmdCwKKyAgICAgICAgeTE6IGJveC50b3AsCisgICAgICAgIHgyOiBib3gucmlnaHQsCisgICAgICAgIHkyOiBib3guYm90dG9tLAorICAgICAgICBpbmRleDogaSwKKyAgICAgICAgeDFOZXc6IHVuZGVmaW5lZCwKKyAgICAgICAgeDJOZXc6IHVuZGVmaW5lZAorICAgICAgfTsKKyAgICB9KTsKKyAgICBleHBhbmRCb3VuZHNMVFIod2lkdGgsIGJvdW5kcyk7CisgICAgdmFyIGV4cGFuZGVkID0gbmV3IEFycmF5KGJveGVzLmxlbmd0aCk7CisgICAgYm91bmRzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKKyAgICAgIHZhciBpID0gYi5pbmRleDsKKyAgICAgIGV4cGFuZGVkW2ldID0geworICAgICAgICBsZWZ0OiBiLngxTmV3LAorICAgICAgICB0b3A6IDAsCisgICAgICAgIHJpZ2h0OiBiLngyTmV3LAorICAgICAgICBib3R0b206IDAKKyAgICAgIH07CisgICAgfSk7CisgICAgYm94ZXMubWFwKGZ1bmN0aW9uIChib3gsIGkpIHsKKyAgICAgIHZhciBlID0gZXhwYW5kZWRbaV0sCisgICAgICAgICAgYiA9IGJvdW5kc1tpXTsKKyAgICAgIGIueDEgPSBib3gudG9wOworICAgICAgYi55MSA9IHdpZHRoIC0gZS5yaWdodDsKKyAgICAgIGIueDIgPSBib3guYm90dG9tOworICAgICAgYi55MiA9IHdpZHRoIC0gZS5sZWZ0OworICAgICAgYi5pbmRleCA9IGk7CisgICAgICBiLngxTmV3ID0gdW5kZWZpbmVkOworICAgICAgYi54Mk5ldyA9IHVuZGVmaW5lZDsKKyAgICB9KTsKKyAgICBleHBhbmRCb3VuZHNMVFIoaGVpZ2h0LCBib3VuZHMpOworICAgIGJvdW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7CisgICAgICB2YXIgaSA9IGIuaW5kZXg7CisgICAgICBleHBhbmRlZFtpXS50b3AgPSBiLngxTmV3OworICAgICAgZXhwYW5kZWRbaV0uYm90dG9tID0gYi54Mk5ldzsKKyAgICB9KTsKKyAgICByZXR1cm4gZXhwYW5kZWQ7CisgIH0KKworICBmdW5jdGlvbiBleHBhbmRCb3VuZHNMVFIod2lkdGgsIGJvdW5kcykgeworICAgIGJvdW5kcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICByZXR1cm4gYS54MSAtIGIueDEgfHwgYS5pbmRleCAtIGIuaW5kZXg7CisgICAgfSk7CisgICAgdmFyIGZha2VCb3VuZGFyeSA9IHsKKyAgICAgIHgxOiAtSW5maW5pdHksCisgICAgICB5MTogLUluZmluaXR5LAorICAgICAgeDI6IDAsCisgICAgICB5MjogSW5maW5pdHksCisgICAgICBpbmRleDogLTEsCisgICAgICB4MU5ldzogMCwKKyAgICAgIHgyTmV3OiAwCisgICAgfTsKKyAgICB2YXIgaG9yaXpvbiA9IFt7CisgICAgICBzdGFydDogLUluZmluaXR5LAorICAgICAgZW5kOiBJbmZpbml0eSwKKyAgICAgIGJvdW5kYXJ5OiBmYWtlQm91bmRhcnkKKyAgICB9XTsKKyAgICBib3VuZHMuZm9yRWFjaChmdW5jdGlvbiAoYm91bmRhcnkpIHsKKyAgICAgIHZhciBpID0gMDsKKworICAgICAgd2hpbGUgKGkgPCBob3Jpem9uLmxlbmd0aCAmJiBob3Jpem9uW2ldLmVuZCA8PSBib3VuZGFyeS55MSkgeworICAgICAgICBpKys7CisgICAgICB9CisKKyAgICAgIHZhciBqID0gaG9yaXpvbi5sZW5ndGggLSAxOworCisgICAgICB3aGlsZSAoaiA+PSAwICYmIGhvcml6b25bal0uc3RhcnQgPj0gYm91bmRhcnkueTIpIHsKKyAgICAgICAgai0tOworICAgICAgfQorCisgICAgICB2YXIgaG9yaXpvblBhcnQsIGFmZmVjdGVkQm91bmRhcnk7CisgICAgICB2YXIgcSwKKyAgICAgICAgICBrLAorICAgICAgICAgIG1heFhOZXcgPSAtSW5maW5pdHk7CisKKyAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7CisgICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTsKKyAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5OworICAgICAgICB2YXIgeE5ldzsKKworICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54MiA+IGJvdW5kYXJ5LngxKSB7CisgICAgICAgICAgeE5ldyA9IGFmZmVjdGVkQm91bmRhcnkuaW5kZXggPiBib3VuZGFyeS5pbmRleCA/IGFmZmVjdGVkQm91bmRhcnkueDFOZXcgOiBib3VuZGFyeS54MTsKKyAgICAgICAgfSBlbHNlIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB4TmV3ID0gKGFmZmVjdGVkQm91bmRhcnkueDIgKyBib3VuZGFyeS54MSkgLyAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHhOZXcgPSBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHhOZXcgPiBtYXhYTmV3KSB7CisgICAgICAgICAgbWF4WE5ldyA9IHhOZXc7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYm91bmRhcnkueDFOZXcgPSBtYXhYTmV3OworCisgICAgICBmb3IgKHEgPSBpOyBxIDw9IGo7IHErKykgeworICAgICAgICBob3Jpem9uUGFydCA9IGhvcml6b25bcV07CisgICAgICAgIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTsKKworICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkueDIgPiBib3VuZGFyeS54MSkgeworICAgICAgICAgICAgaWYgKGFmZmVjdGVkQm91bmRhcnkuaW5kZXggPiBib3VuZGFyeS5pbmRleCkgeworICAgICAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gYWZmZWN0ZWRCb3VuZGFyeS54MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IG1heFhOZXc7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGFmZmVjdGVkQm91bmRhcnkueDJOZXcgPiBtYXhYTmV3KSB7CisgICAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IE1hdGgubWF4KG1heFhOZXcsIGFmZmVjdGVkQm91bmRhcnkueDIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBjaGFuZ2VkSG9yaXpvbiA9IFtdLAorICAgICAgICAgIGxhc3RCb3VuZGFyeSA9IG51bGw7CisKKyAgICAgIGZvciAocSA9IGk7IHEgPD0gajsgcSsrKSB7CisgICAgICAgIGhvcml6b25QYXJ0ID0gaG9yaXpvbltxXTsKKyAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeSA9IGhvcml6b25QYXJ0LmJvdW5kYXJ5OworICAgICAgICB2YXIgdXNlQm91bmRhcnkgPSBhZmZlY3RlZEJvdW5kYXJ5LngyID4gYm91bmRhcnkueDIgPyBhZmZlY3RlZEJvdW5kYXJ5IDogYm91bmRhcnk7CisKKyAgICAgICAgaWYgKGxhc3RCb3VuZGFyeSA9PT0gdXNlQm91bmRhcnkpIHsKKyAgICAgICAgICBjaGFuZ2VkSG9yaXpvbltjaGFuZ2VkSG9yaXpvbi5sZW5ndGggLSAxXS5lbmQgPSBob3Jpem9uUGFydC5lbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2hhbmdlZEhvcml6b24ucHVzaCh7CisgICAgICAgICAgICBzdGFydDogaG9yaXpvblBhcnQuc3RhcnQsCisgICAgICAgICAgICBlbmQ6IGhvcml6b25QYXJ0LmVuZCwKKyAgICAgICAgICAgIGJvdW5kYXJ5OiB1c2VCb3VuZGFyeQorICAgICAgICAgIH0pOworICAgICAgICAgIGxhc3RCb3VuZGFyeSA9IHVzZUJvdW5kYXJ5OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChob3Jpem9uW2ldLnN0YXJ0IDwgYm91bmRhcnkueTEpIHsKKyAgICAgICAgY2hhbmdlZEhvcml6b25bMF0uc3RhcnQgPSBib3VuZGFyeS55MTsKKyAgICAgICAgY2hhbmdlZEhvcml6b24udW5zaGlmdCh7CisgICAgICAgICAgc3RhcnQ6IGhvcml6b25baV0uc3RhcnQsCisgICAgICAgICAgZW5kOiBib3VuZGFyeS55MSwKKyAgICAgICAgICBib3VuZGFyeTogaG9yaXpvbltpXS5ib3VuZGFyeQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgaWYgKGJvdW5kYXJ5LnkyIDwgaG9yaXpvbltqXS5lbmQpIHsKKyAgICAgICAgY2hhbmdlZEhvcml6b25bY2hhbmdlZEhvcml6b24ubGVuZ3RoIC0gMV0uZW5kID0gYm91bmRhcnkueTI7CisgICAgICAgIGNoYW5nZWRIb3Jpem9uLnB1c2goeworICAgICAgICAgIHN0YXJ0OiBib3VuZGFyeS55MiwKKyAgICAgICAgICBlbmQ6IGhvcml6b25bal0uZW5kLAorICAgICAgICAgIGJvdW5kYXJ5OiBob3Jpem9uW2pdLmJvdW5kYXJ5CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBmb3IgKHEgPSBpOyBxIDw9IGo7IHErKykgeworICAgICAgICBob3Jpem9uUGFydCA9IGhvcml6b25bcV07CisgICAgICAgIGFmZmVjdGVkQm91bmRhcnkgPSBob3Jpem9uUGFydC5ib3VuZGFyeTsKKworICAgICAgICBpZiAoYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdXNlZCA9IGZhbHNlOworCisgICAgICAgIGZvciAoayA9IGkgLSAxOyAhdXNlZCAmJiBrID49IDAgJiYgaG9yaXpvbltrXS5zdGFydCA+PSBhZmZlY3RlZEJvdW5kYXJ5LnkxOyBrLS0pIHsKKyAgICAgICAgICB1c2VkID0gaG9yaXpvbltrXS5ib3VuZGFyeSA9PT0gYWZmZWN0ZWRCb3VuZGFyeTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoayA9IGogKyAxOyAhdXNlZCAmJiBrIDwgaG9yaXpvbi5sZW5ndGggJiYgaG9yaXpvbltrXS5lbmQgPD0gYWZmZWN0ZWRCb3VuZGFyeS55MjsgaysrKSB7CisgICAgICAgICAgdXNlZCA9IGhvcml6b25ba10uYm91bmRhcnkgPT09IGFmZmVjdGVkQm91bmRhcnk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGsgPSAwOyAhdXNlZCAmJiBrIDwgY2hhbmdlZEhvcml6b24ubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICB1c2VkID0gY2hhbmdlZEhvcml6b25ba10uYm91bmRhcnkgPT09IGFmZmVjdGVkQm91bmRhcnk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXVzZWQpIHsKKyAgICAgICAgICBhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID0gbWF4WE5ldzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGhvcml6b24sIFtpLCBqIC0gaSArIDFdLmNvbmNhdChjaGFuZ2VkSG9yaXpvbikpOworICAgIH0pOworICAgIGhvcml6b24uZm9yRWFjaChmdW5jdGlvbiAoaG9yaXpvblBhcnQpIHsKKyAgICAgIHZhciBhZmZlY3RlZEJvdW5kYXJ5ID0gaG9yaXpvblBhcnQuYm91bmRhcnk7CisKKyAgICAgIGlmIChhZmZlY3RlZEJvdW5kYXJ5LngyTmV3ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgYWZmZWN0ZWRCb3VuZGFyeS54Mk5ldyA9IE1hdGgubWF4KHdpZHRoLCBhZmZlY3RlZEJvdW5kYXJ5LngyKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIFRleHRMYXllclJlbmRlclRhc2soeworICAgIHRleHRDb250ZW50LAorICAgIHRleHRDb250ZW50U3RyZWFtLAorICAgIGNvbnRhaW5lciwKKyAgICB2aWV3cG9ydCwKKyAgICB0ZXh0RGl2cywKKyAgICB0ZXh0Q29udGVudEl0ZW1zU3RyLAorICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uCisgIH0pIHsKKyAgICB0aGlzLl90ZXh0Q29udGVudCA9IHRleHRDb250ZW50OworICAgIHRoaXMuX3RleHRDb250ZW50U3RyZWFtID0gdGV4dENvbnRlbnRTdHJlYW07CisgICAgdGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyOworICAgIHRoaXMuX2RvY3VtZW50ID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQ7CisgICAgdGhpcy5fdmlld3BvcnQgPSB2aWV3cG9ydDsKKyAgICB0aGlzLl90ZXh0RGl2cyA9IHRleHREaXZzIHx8IFtdOworICAgIHRoaXMuX3RleHRDb250ZW50SXRlbXNTdHIgPSB0ZXh0Q29udGVudEl0ZW1zU3RyIHx8IFtdOworICAgIHRoaXMuX2VuaGFuY2VUZXh0U2VsZWN0aW9uID0gISFlbmhhbmNlVGV4dFNlbGVjdGlvbjsKKyAgICB0aGlzLl9mb250SW5zcGVjdG9yRW5hYmxlZCA9ICEhKGdsb2JhbFRoaXMuRm9udEluc3BlY3RvciAmJiBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IuZW5hYmxlZCk7CisgICAgdGhpcy5fcmVhZGVyID0gbnVsbDsKKyAgICB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRTaXplID0gbnVsbDsKKyAgICB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRGYW1pbHkgPSBudWxsOworICAgIHRoaXMuX2xheW91dFRleHRDdHggPSBudWxsOworICAgIHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTsKKyAgICB0aGlzLl9yZW5kZXJpbmdEb25lID0gZmFsc2U7CisgICAgdGhpcy5fY2FuY2VsZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9jYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuX3JlbmRlclRpbWVyID0gbnVsbDsKKyAgICB0aGlzLl9ib3VuZHMgPSBbXTsKKworICAgIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZS5maW5hbGx5KCgpID0+IHsKKyAgICAgIGlmICh0aGlzLl9sYXlvdXRUZXh0Q3R4KSB7CisgICAgICAgIHRoaXMuX2xheW91dFRleHRDdHguY2FudmFzLndpZHRoID0gMDsKKyAgICAgICAgdGhpcy5fbGF5b3V0VGV4dEN0eC5jYW52YXMuaGVpZ2h0ID0gMDsKKyAgICAgICAgdGhpcy5fbGF5b3V0VGV4dEN0eCA9IG51bGw7CisgICAgICB9CisgICAgfSkuY2F0Y2goKCkgPT4ge30pOworICB9CisKKyAgVGV4dExheWVyUmVuZGVyVGFzay5wcm90b3R5cGUgPSB7CisgICAgZ2V0IHByb21pc2UoKSB7CisgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0sCisKKyAgICBjYW5jZWw6IGZ1bmN0aW9uIFRleHRMYXllcl9jYW5jZWwoKSB7CisgICAgICB0aGlzLl9jYW5jZWxlZCA9IHRydWU7CisKKyAgICAgIGlmICh0aGlzLl9yZWFkZXIpIHsKKyAgICAgICAgdGhpcy5fcmVhZGVyLmNhbmNlbChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC4iKSk7CisKKyAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3JlbmRlclRpbWVyICE9PSBudWxsKSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZW5kZXJUaW1lcik7CisgICAgICAgIHRoaXMuX3JlbmRlclRpbWVyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdGhpcy5fY2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuIikpOworICAgIH0sCisKKyAgICBfcHJvY2Vzc0l0ZW1zKGl0ZW1zLCBzdHlsZUNhY2hlKSB7CisgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKGl0ZW1zW2ldLnN0cik7CisKKyAgICAgICAgYXBwZW5kVGV4dCh0aGlzLCBpdGVtc1tpXSwgc3R5bGVDYWNoZSk7CisgICAgICB9CisgICAgfSwKKworICAgIF9sYXlvdXRUZXh0KHRleHREaXYpIHsKKyAgICAgIGNvbnN0IHRleHREaXZQcm9wZXJ0aWVzID0gdGhpcy5fdGV4dERpdlByb3BlcnRpZXMuZ2V0KHRleHREaXYpOworCisgICAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuaXNXaGl0ZXNwYWNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgbGV0IHRyYW5zZm9ybSA9ICIiOworCisgICAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuY2FudmFzV2lkdGggIT09IDApIHsKKyAgICAgICAgY29uc3QgeworICAgICAgICAgIGZvbnRTaXplLAorICAgICAgICAgIGZvbnRGYW1pbHkKKyAgICAgICAgfSA9IHRleHREaXYuc3R5bGU7CisKKyAgICAgICAgaWYgKGZvbnRTaXplICE9PSB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRTaXplIHx8IGZvbnRGYW1pbHkgIT09IHRoaXMuX2xheW91dFRleHRMYXN0Rm9udEZhbWlseSkgeworICAgICAgICAgIHRoaXMuX2xheW91dFRleHRDdHguZm9udCA9IGAke2ZvbnRTaXplfSAke2ZvbnRGYW1pbHl9YDsKKyAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0TGFzdEZvbnRTaXplID0gZm9udFNpemU7CisgICAgICAgICAgdGhpcy5fbGF5b3V0VGV4dExhc3RGb250RmFtaWx5ID0gZm9udEZhbWlseTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHsKKyAgICAgICAgICB3aWR0aAorICAgICAgICB9ID0gdGhpcy5fbGF5b3V0VGV4dEN0eC5tZWFzdXJlVGV4dCh0ZXh0RGl2LnRleHRDb250ZW50KTsKKworICAgICAgICBpZiAod2lkdGggPiAwKSB7CisgICAgICAgICAgdGV4dERpdlByb3BlcnRpZXMuc2NhbGUgPSB0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCAvIHdpZHRoOworICAgICAgICAgIHRyYW5zZm9ybSA9IGBzY2FsZVgoJHt0ZXh0RGl2UHJvcGVydGllcy5zY2FsZX0pYDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuYW5nbGUgIT09IDApIHsKKyAgICAgICAgdHJhbnNmb3JtID0gYHJvdGF0ZSgke3RleHREaXZQcm9wZXJ0aWVzLmFuZ2xlfWRlZykgJHt0cmFuc2Zvcm19YDsKKyAgICAgIH0KKworICAgICAgaWYgKHRyYW5zZm9ybS5sZW5ndGggPiAwKSB7CisgICAgICAgIGlmICh0aGlzLl9lbmhhbmNlVGV4dFNlbGVjdGlvbikgeworICAgICAgICAgIHRleHREaXZQcm9wZXJ0aWVzLm9yaWdpbmFsVHJhbnNmb3JtID0gdHJhbnNmb3JtOworICAgICAgICB9CisKKyAgICAgICAgdGV4dERpdi5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07CisgICAgICB9CisKKyAgICAgIHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLnNldCh0ZXh0RGl2LCB0ZXh0RGl2UHJvcGVydGllcyk7CisKKyAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0ZXh0RGl2KTsKKyAgICB9LAorCisgICAgX3JlbmRlcjogZnVuY3Rpb24gVGV4dExheWVyX3JlbmRlcih0aW1lb3V0KSB7CisgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgbGV0IHN0eWxlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKKworICAgICAgY2FudmFzLm1vek9wYXF1ZSA9IHRydWU7CisgICAgICB0aGlzLl9sYXlvdXRUZXh0Q3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgeworICAgICAgICBhbHBoYTogZmFsc2UKKyAgICAgIH0pOworCisgICAgICBpZiAodGhpcy5fdGV4dENvbnRlbnQpIHsKKyAgICAgICAgY29uc3QgdGV4dEl0ZW1zID0gdGhpcy5fdGV4dENvbnRlbnQuaXRlbXM7CisgICAgICAgIGNvbnN0IHRleHRTdHlsZXMgPSB0aGlzLl90ZXh0Q29udGVudC5zdHlsZXM7CisKKyAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKHRleHRJdGVtcywgdGV4dFN0eWxlcyk7CisKKyAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RleHRDb250ZW50U3RyZWFtKSB7CisgICAgICAgIGNvbnN0IHB1bXAgPSAoKSA9PiB7CisgICAgICAgICAgdGhpcy5fcmVhZGVyLnJlYWQoKS50aGVuKCh7CisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICB9KSA9PiB7CisgICAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlQ2FjaGUsIHZhbHVlLnN0eWxlcyk7CisKKyAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NJdGVtcyh2YWx1ZS5pdGVtcywgc3R5bGVDYWNoZSk7CisKKyAgICAgICAgICAgIHB1bXAoKTsKKyAgICAgICAgICB9LCBjYXBhYmlsaXR5LnJlamVjdCk7CisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5fcmVhZGVyID0gdGhpcy5fdGV4dENvbnRlbnRTdHJlYW0uZ2V0UmVhZGVyKCk7CisgICAgICAgIHB1bXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVpdGhlciAidGV4dENvbnRlbnQiIG5vciAidGV4dENvbnRlbnRTdHJlYW0iJyArICIgcGFyYW1ldGVycyBzcGVjaWZpZWQuIik7CisgICAgICB9CisKKyAgICAgIGNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgICAgc3R5bGVDYWNoZSA9IG51bGw7CisKKyAgICAgICAgaWYgKCF0aW1lb3V0KSB7CisgICAgICAgICAgcmVuZGVyKHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuX3JlbmRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CisgICAgICAgICAgICByZW5kZXIodGhpcyk7CisgICAgICAgICAgICB0aGlzLl9yZW5kZXJUaW1lciA9IG51bGw7CisgICAgICAgICAgfSwgdGltZW91dCk7CisgICAgICAgIH0KKyAgICAgIH0sIHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KTsKKyAgICB9LAorICAgIGV4cGFuZFRleHREaXZzOiBmdW5jdGlvbiBUZXh0TGF5ZXJfZXhwYW5kVGV4dERpdnMoZXhwYW5kRGl2cykgeworICAgICAgaWYgKCF0aGlzLl9lbmhhbmNlVGV4dFNlbGVjdGlvbiB8fCAhdGhpcy5fcmVuZGVyaW5nRG9uZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9ib3VuZHMgIT09IG51bGwpIHsKKyAgICAgICAgZXhwYW5kKHRoaXMpOworICAgICAgICB0aGlzLl9ib3VuZHMgPSBudWxsOworICAgICAgfQorCisgICAgICBjb25zdCB0cmFuc2Zvcm1CdWYgPSBbXSwKKyAgICAgICAgICAgIHBhZGRpbmdCdWYgPSBbXTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5fdGV4dERpdnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBjb25zdCBkaXYgPSB0aGlzLl90ZXh0RGl2c1tpXTsKKworICAgICAgICBjb25zdCBkaXZQcm9wcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldChkaXYpOworCisgICAgICAgIGlmIChkaXZQcm9wcy5pc1doaXRlc3BhY2UpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHBhbmREaXZzKSB7CisgICAgICAgICAgdHJhbnNmb3JtQnVmLmxlbmd0aCA9IDA7CisgICAgICAgICAgcGFkZGluZ0J1Zi5sZW5ndGggPSAwOworCisgICAgICAgICAgaWYgKGRpdlByb3BzLm9yaWdpbmFsVHJhbnNmb3JtKSB7CisgICAgICAgICAgICB0cmFuc2Zvcm1CdWYucHVzaChkaXZQcm9wcy5vcmlnaW5hbFRyYW5zZm9ybSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRpdlByb3BzLnBhZGRpbmdUb3AgPiAwKSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goYCR7ZGl2UHJvcHMucGFkZGluZ1RvcH1weGApOworICAgICAgICAgICAgdHJhbnNmb3JtQnVmLnB1c2goYHRyYW5zbGF0ZVkoJHstZGl2UHJvcHMucGFkZGluZ1RvcH1weClgKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKDApOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkaXZQcm9wcy5wYWRkaW5nUmlnaHQgPiAwKSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goYCR7ZGl2UHJvcHMucGFkZGluZ1JpZ2h0IC8gZGl2UHJvcHMuc2NhbGV9cHhgKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKDApOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkaXZQcm9wcy5wYWRkaW5nQm90dG9tID4gMCkgeworICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKGAke2RpdlByb3BzLnBhZGRpbmdCb3R0b219cHhgKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFkZGluZ0J1Zi5wdXNoKDApOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkaXZQcm9wcy5wYWRkaW5nTGVmdCA+IDApIHsKKyAgICAgICAgICAgIHBhZGRpbmdCdWYucHVzaChgJHtkaXZQcm9wcy5wYWRkaW5nTGVmdCAvIGRpdlByb3BzLnNjYWxlfXB4YCk7CisgICAgICAgICAgICB0cmFuc2Zvcm1CdWYucHVzaChgdHJhbnNsYXRlWCgkey1kaXZQcm9wcy5wYWRkaW5nTGVmdCAvIGRpdlByb3BzLnNjYWxlfXB4KWApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWRkaW5nQnVmLnB1c2goMCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGl2LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nQnVmLmpvaW4oIiAiKTsKKworICAgICAgICAgIGlmICh0cmFuc2Zvcm1CdWYubGVuZ3RoKSB7CisgICAgICAgICAgICBkaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtQnVmLmpvaW4oIiAiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGl2LnN0eWxlLnBhZGRpbmcgPSBudWxsOworICAgICAgICAgIGRpdi5zdHlsZS50cmFuc2Zvcm0gPSBkaXZQcm9wcy5vcmlnaW5hbFRyYW5zZm9ybTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXIocmVuZGVyUGFyYW1ldGVycykgeworICAgIHZhciB0YXNrID0gbmV3IFRleHRMYXllclJlbmRlclRhc2soeworICAgICAgdGV4dENvbnRlbnQ6IHJlbmRlclBhcmFtZXRlcnMudGV4dENvbnRlbnQsCisgICAgICB0ZXh0Q29udGVudFN0cmVhbTogcmVuZGVyUGFyYW1ldGVycy50ZXh0Q29udGVudFN0cmVhbSwKKyAgICAgIGNvbnRhaW5lcjogcmVuZGVyUGFyYW1ldGVycy5jb250YWluZXIsCisgICAgICB2aWV3cG9ydDogcmVuZGVyUGFyYW1ldGVycy52aWV3cG9ydCwKKyAgICAgIHRleHREaXZzOiByZW5kZXJQYXJhbWV0ZXJzLnRleHREaXZzLAorICAgICAgdGV4dENvbnRlbnRJdGVtc1N0cjogcmVuZGVyUGFyYW1ldGVycy50ZXh0Q29udGVudEl0ZW1zU3RyLAorICAgICAgZW5oYW5jZVRleHRTZWxlY3Rpb246IHJlbmRlclBhcmFtZXRlcnMuZW5oYW5jZVRleHRTZWxlY3Rpb24KKyAgICB9KTsKKworICAgIHRhc2suX3JlbmRlcihyZW5kZXJQYXJhbWV0ZXJzLnRpbWVvdXQpOworCisgICAgcmV0dXJuIHRhc2s7CisgIH0KKworICByZXR1cm4gcmVuZGVyVGV4dExheWVyOworfSgpOworCitleHBvcnRzLnJlbmRlclRleHRMYXllciA9IHJlbmRlclRleHRMYXllcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS90cmFuc3BvcnRfc3RyZWFtLmpzIGIvbGliL2Rpc3BsYXkvdHJhbnNwb3J0X3N0cmVhbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNlNTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvdHJhbnNwb3J0X3N0cmVhbS5qcwpAQCAtMCwwICsxLDM3MCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKworY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbSB7CisgIGNvbnN0cnVjdG9yKHBhcmFtcywgcGRmRGF0YVJhbmdlVHJhbnNwb3J0KSB7CisgICAgKDAsIF91dGlsLmFzc2VydCkocGRmRGF0YVJhbmdlVHJhbnNwb3J0LCAnUERGRGF0YVRyYW5zcG9ydFN0cmVhbSAtIG1pc3NpbmcgcmVxdWlyZWQgInBkZkRhdGFSYW5nZVRyYW5zcG9ydCIgYXJndW1lbnQuJyk7CisgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gW107CisgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gcGFyYW1zLnByb2dyZXNzaXZlRG9uZSB8fCBmYWxzZTsKKyAgICBjb25zdCBpbml0aWFsRGF0YSA9IHBhcmFtcy5pbml0aWFsRGF0YTsKKworICAgIGlmIChpbml0aWFsRGF0YSAmJiBpbml0aWFsRGF0YS5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShpbml0aWFsRGF0YSkuYnVmZmVyOworCisgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChidWZmZXIpOworICAgIH0KKworICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydCA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydDsKKyAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFwYXJhbXMuZGlzYWJsZVN0cmVhbTsKKyAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXBhcmFtcy5kaXNhYmxlUmFuZ2U7CisgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHBhcmFtcy5sZW5ndGg7CisgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsOworICAgIHRoaXMuX3JhbmdlUmVhZGVycyA9IFtdOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFJhbmdlTGlzdGVuZXIoKGJlZ2luLCBjaHVuaykgPT4geworICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7CisgICAgICAgIGJlZ2luLAorICAgICAgICBjaHVuaworICAgICAgfSk7CisgICAgfSk7CisKKyAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NMaXN0ZW5lcigobG9hZGVkLCB0b3RhbCkgPT4geworICAgICAgdGhpcy5fb25Qcm9ncmVzcyh7CisgICAgICAgIGxvYWRlZCwKKyAgICAgICAgdG90YWwKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGNodW5rID0+IHsKKyAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoeworICAgICAgICBjaHVuaworICAgICAgfSk7CisgICAgfSk7CisKKyAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIoKCkgPT4geworICAgICAgdGhpcy5fb25Qcm9ncmVzc2l2ZURvbmUoKTsKKyAgICB9KTsKKworICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpOworICB9CisKKyAgX29uUmVjZWl2ZURhdGEoYXJncykgeworICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGFyZ3MuY2h1bmspLmJ1ZmZlcjsKKworICAgIGlmIChhcmdzLmJlZ2luID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgeworICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5fZW5xdWV1ZShidWZmZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goYnVmZmVyKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgZm91bmQgPSB0aGlzLl9yYW5nZVJlYWRlcnMuc29tZShmdW5jdGlvbiAocmFuZ2VSZWFkZXIpIHsKKyAgICAgICAgaWYgKHJhbmdlUmVhZGVyLl9iZWdpbiAhPT0gYXJncy5iZWdpbikgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJhbmdlUmVhZGVyLl9lbnF1ZXVlKGJ1ZmZlcik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9KTsKKworICAgICAgKDAsIF91dGlsLmFzc2VydCkoZm91bmQsICJfb25SZWNlaXZlRGF0YSAtIG5vIGBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXJgIGluc3RhbmNlIGZvdW5kLiIpOworICAgIH0KKyAgfQorCisgIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9sb2FkZWQgOiAwOworICB9CisKKyAgX29uUHJvZ3Jlc3MoZXZ0KSB7CisgICAgaWYgKGV2dC50b3RhbCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBjb25zdCBmaXJzdFJlYWRlciA9IHRoaXMuX3JhbmdlUmVhZGVyc1swXTsKKworICAgICAgaWYgKGZpcnN0UmVhZGVyICYmIGZpcnN0UmVhZGVyLm9uUHJvZ3Jlc3MpIHsKKyAgICAgICAgZmlyc3RSZWFkZXIub25Qcm9ncmVzcyh7CisgICAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBmdWxsUmVhZGVyID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7CisKKyAgICAgIGlmIChmdWxsUmVhZGVyICYmIGZ1bGxSZWFkZXIub25Qcm9ncmVzcykgeworICAgICAgICBmdWxsUmVhZGVyLm9uUHJvZ3Jlc3MoeworICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCwKKyAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIF9vblByb2dyZXNzaXZlRG9uZSgpIHsKKyAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHsKKyAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLnByb2dyZXNzaXZlRG9uZSgpOworICAgIH0KKworICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHRydWU7CisgIH0KKworICBfcmVtb3ZlUmFuZ2VSZWFkZXIocmVhZGVyKSB7CisgICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVhZGVycy5pbmRleE9mKHJlYWRlcik7CisKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICB0aGlzLl9yYW5nZVJlYWRlcnMuc3BsaWNlKGksIDEpOworICAgIH0KKyAgfQorCisgIGdldEZ1bGxSZWFkZXIoKSB7CisgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCAiUERGRGF0YVRyYW5zcG9ydFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgIGNvbnN0IHF1ZXVlZENodW5rcyA9IHRoaXMuX3F1ZXVlZENodW5rczsKKyAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBudWxsOworICAgIHJldHVybiBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcih0aGlzLCBxdWV1ZWRDaHVua3MsIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSk7CisgIH0KKworICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CisgICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgYmVnaW4sIGVuZCk7CisKKyAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZShiZWdpbiwgZW5kKTsKKworICAgIHRoaXMuX3JhbmdlUmVhZGVycy5wdXNoKHJlYWRlcik7CisKKyAgICByZXR1cm4gcmVhZGVyOworICB9CisKKyAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7CisgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7CisgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwocmVhc29uKTsKKyAgICB9CisKKyAgICBjb25zdCByZWFkZXJzID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNsaWNlKDApOworCisgICAgcmVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChyYW5nZVJlYWRlcikgeworICAgICAgcmFuZ2VSZWFkZXIuY2FuY2VsKHJlYXNvbik7CisgICAgfSk7CisKKyAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWJvcnQoKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IFBERkRhdGFUcmFuc3BvcnRTdHJlYW07CisKK2NsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIgeworICBjb25zdHJ1Y3RvcihzdHJlYW0sIHF1ZXVlZENodW5rcywgcHJvZ3Jlc3NpdmVEb25lID0gZmFsc2UpIHsKKyAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07CisgICAgdGhpcy5fZG9uZSA9IHByb2dyZXNzaXZlRG9uZSB8fCBmYWxzZTsKKyAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7CisgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gcXVldWVkQ2h1bmtzIHx8IFtdOworICAgIHRoaXMuX2xvYWRlZCA9IDA7CisKKyAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHRoaXMuX3F1ZXVlZENodW5rcykgeworICAgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmJ5dGVMZW5ndGg7CisgICAgfQorCisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKyAgICB0aGlzLl9oZWFkZXJzUmVhZHkgPSBQcm9taXNlLnJlc29sdmUoKTsKKyAgICBzdHJlYW0uX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpczsKKyAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOworICB9CisKKyAgX2VucXVldWUoY2h1bmspIHsKKyAgICBpZiAodGhpcy5fZG9uZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7CisgICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7CisKKyAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICB2YWx1ZTogY2h1bmssCisgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goY2h1bmspOworICAgIH0KKworICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoOworICB9CisKKyAgZ2V0IGhlYWRlcnNSZWFkeSgpIHsKKyAgICByZXR1cm4gdGhpcy5faGVhZGVyc1JlYWR5OworICB9CisKKyAgZ2V0IGZpbGVuYW1lKCkgeworICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTsKKyAgfQorCisgIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkgeworICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzUmFuZ2VTdXBwb3J0ZWQ7CisgIH0KKworICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX3N0cmVhbS5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgIH0KKworICBnZXQgY29udGVudExlbmd0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RoOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmtzLmxlbmd0aCA+IDApIHsKKyAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bmtzLnNoaWZ0KCk7CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlOiBjaHVuaywKKyAgICAgICAgZG9uZTogZmFsc2UKKyAgICAgIH07CisgICAgfQorCisgICAgaWYgKHRoaXMuX2RvbmUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICAgIGRvbmU6IHRydWUKKyAgICAgIH07CisgICAgfQorCisgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTsKKworICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgY2FuY2VsKHJlYXNvbikgeworICAgIHRoaXMuX2RvbmUgPSB0cnVlOworCisgICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdENhcGFiaWxpdHkpIHsKKyAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3JlcXVlc3RzID0gW107CisgIH0KKworICBwcm9ncmVzc2l2ZURvbmUoKSB7CisgICAgaWYgKHRoaXMuX2RvbmUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9kb25lID0gdHJ1ZTsKKyAgfQorCit9CisKK2NsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciB7CisgIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkgeworICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTsKKyAgICB0aGlzLl9iZWdpbiA9IGJlZ2luOworICAgIHRoaXMuX2VuZCA9IGVuZDsKKyAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7CisgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKyAgICB0aGlzLl9kb25lID0gZmFsc2U7CisgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKKyAgfQorCisgIF9lbnF1ZXVlKGNodW5rKSB7CisgICAgaWYgKHRoaXMuX2RvbmUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID09PSAwKSB7CisgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IGNodW5rOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCByZXF1ZXN0c0NhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpOworCisgICAgICByZXF1ZXN0c0NhcGFiaWxpdHkucmVzb2x2ZSh7CisgICAgICAgIHZhbHVlOiBjaHVuaywKKyAgICAgICAgZG9uZTogZmFsc2UKKyAgICAgIH0pOworCisgICAgICB0aGlzLl9yZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0Q2FwYWJpbGl0eSkgeworICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICAgIGRvbmU6IHRydWUKKyAgICAgICAgfSk7CisgICAgICB9KTsKKworICAgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTsKKyAgICB9CisKKyAgICB0aGlzLl9kb25lID0gdHJ1ZTsKKworICAgIHRoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyk7CisgIH0KKworICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYXN5bmMgcmVhZCgpIHsKKyAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmspIHsKKyAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7CisgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogY2h1bmssCisgICAgICAgIGRvbmU6IGZhbHNlCisgICAgICB9OworICAgIH0KKworICAgIGlmICh0aGlzLl9kb25lKSB7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAorICAgICAgICBkb25lOiB0cnVlCisgICAgICB9OworICAgIH0KKworICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7CisKKyAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTsKKyAgfQorCisgIGNhbmNlbChyZWFzb24pIHsKKyAgICB0aGlzLl9kb25lID0gdHJ1ZTsKKworICAgIHRoaXMuX3JlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3RDYXBhYmlsaXR5KSB7CisgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHsKKyAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKKyAgICAgICAgZG9uZTogdHJ1ZQorICAgICAgfSk7CisgICAgfSk7CisKKyAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdOworCisgICAgdGhpcy5fc3RyZWFtLl9yZW1vdmVSYW5nZVJlYWRlcih0aGlzKTsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2Rpc3BsYXkvd2ViZ2wuanMgYi9saWIvZGlzcGxheS93ZWJnbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZiMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvd2ViZ2wuanMKQEAgLTAsMCArMSw0NjIgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLldlYkdMQ29udGV4dCA9IHZvaWQgMDsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vc2hhcmVkL3V0aWwuanMiKTsKKworY2xhc3MgV2ViR0xDb250ZXh0IHsKKyAgY29uc3RydWN0b3IoeworICAgIGVuYWJsZSA9IGZhbHNlCisgIH0pIHsKKyAgICB0aGlzLl9lbmFibGVkID0gZW5hYmxlID09PSB0cnVlOworICB9CisKKyAgZ2V0IGlzRW5hYmxlZCgpIHsKKyAgICBsZXQgZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQ7CisKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgZW5hYmxlZCA9IFdlYkdMVXRpbHMudHJ5SW5pdEdMKCk7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJpc0VuYWJsZWQiLCBlbmFibGVkKTsKKyAgfQorCisgIGNvbXBvc2VTTWFzayh7CisgICAgbGF5ZXIsCisgICAgbWFzaywKKyAgICBwcm9wZXJ0aWVzCisgIH0pIHsKKyAgICByZXR1cm4gV2ViR0xVdGlscy5jb21wb3NlU01hc2sobGF5ZXIsIG1hc2ssIHByb3BlcnRpZXMpOworICB9CisKKyAgZHJhd0ZpZ3VyZXMoeworICAgIHdpZHRoLAorICAgIGhlaWdodCwKKyAgICBiYWNrZ3JvdW5kQ29sb3IsCisgICAgZmlndXJlcywKKyAgICBjb250ZXh0CisgIH0pIHsKKyAgICByZXR1cm4gV2ViR0xVdGlscy5kcmF3RmlndXJlcyh3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kQ29sb3IsIGZpZ3VyZXMsIGNvbnRleHQpOworICB9CisKKyAgY2xlYXIoKSB7CisgICAgV2ViR0xVdGlscy5jbGVhbnVwKCk7CisgIH0KKworfQorCitleHBvcnRzLldlYkdMQ29udGV4dCA9IFdlYkdMQ29udGV4dDsKKwordmFyIFdlYkdMVXRpbHMgPSBmdW5jdGlvbiBXZWJHTFV0aWxzQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gbG9hZFNoYWRlcihnbCwgY29kZSwgc2hhZGVyVHlwZSkgeworICAgIHZhciBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7CisgICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgY29kZSk7CisgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgIHZhciBjb21waWxlZCA9IGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKTsKKworICAgIGlmICghY29tcGlsZWQpIHsKKyAgICAgIHZhciBlcnJvck1zZyA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiRXJyb3IgZHVyaW5nIHNoYWRlciBjb21waWxhdGlvbjogIiArIGVycm9yTXNnKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hhZGVyOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCBjb2RlKSB7CisgICAgcmV0dXJuIGxvYWRTaGFkZXIoZ2wsIGNvZGUsIGdsLlZFUlRFWF9TSEFERVIpOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRTaGFkZXIoZ2wsIGNvZGUpIHsKKyAgICByZXR1cm4gbG9hZFNoYWRlcihnbCwgY29kZSwgZ2wuRlJBR01FTlRfU0hBREVSKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oZ2wsIHNoYWRlcnMpIHsKKyAgICB2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHNoYWRlcnMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHNoYWRlcnNbaV0pOworICAgIH0KKworICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOworICAgIHZhciBsaW5rZWQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKTsKKworICAgIGlmICghbGlua2VkKSB7CisgICAgICB2YXIgZXJyb3JNc2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKTsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiRXJyb3IgZHVyaW5nIHByb2dyYW0gbGlua2luZzogIiArIGVycm9yTXNnKTsKKyAgICB9CisKKyAgICByZXR1cm4gcHJvZ3JhbTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGltYWdlLCB0ZXh0dXJlSWQpIHsKKyAgICBnbC5hY3RpdmVUZXh0dXJlKHRleHR1cmVJZCk7CisgICAgdmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CisgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7CisgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7CisgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOworICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTsKKyAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlKTsKKyAgICByZXR1cm4gdGV4dHVyZTsKKyAgfQorCisgIHZhciBjdXJyZW50R0wsIGN1cnJlbnRDYW52YXM7CisKKyAgZnVuY3Rpb24gZ2VuZXJhdGVHTCgpIHsKKyAgICBpZiAoY3VycmVudEdMKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY3VycmVudENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworICAgIGN1cnJlbnRHTCA9IGN1cnJlbnRDYW52YXMuZ2V0Q29udGV4dCgid2ViZ2wiLCB7CisgICAgICBwcmVtdWx0aXBsaWVkYWxwaGE6IGZhbHNlCisgICAgfSk7CisgIH0KKworICB2YXIgc21hc2tWZXJ0ZXhTaGFkZXJDb2RlID0gIlwKKyAgYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGF0dHJpYnV0ZSB2ZWMyIGFfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlYzIgY2xpcFNwYWNlID0gKGFfcG9zaXRpb24gLyB1X3Jlc29sdXRpb24pICogMi4wIC0gMS4wOyAgIFwKKyAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoY2xpcFNwYWNlICogdmVjMigxLCAtMSksIDAsIDEpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICB2YXIgc21hc2tGcmFnbWVudFNoYWRlckNvZGUgPSAiXAorICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuaWZvcm0gdmVjNCB1X2JhY2tkcm9wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlmb3JtIGludCB1X3N1YnR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuaWZvcm0gc2FtcGxlcjJEIHVfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIG1haW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ZWM0IGltYWdlQ29sb3IgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdl90ZXhDb29yZCk7ICAgICAgICAgICBcCisgICAgdmVjNCBtYXNrQ29sb3IgPSB0ZXh0dXJlMkQodV9tYXNrLCB2X3RleENvb3JkKTsgICAgICAgICAgICAgXAorICAgIGlmICh1X2JhY2tkcm9wLmEgPiAwLjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hc2tDb2xvci5yZ2IgPSBtYXNrQ29sb3IucmdiICogbWFza0NvbG9yLmEgKyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdV9iYWNrZHJvcC5yZ2IgKiAoMS4wIC0gbWFza0NvbG9yLmEpOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbG9hdCBsdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHVfc3VidHlwZSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbHVtID0gbWFza0NvbG9yLmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBsdW0gPSBtYXNrQ29sb3IuciAqIDAuMyArIG1hc2tDb2xvci5nICogMC41OSArICAgICAgICAgICAgXAorICAgICAgICAgICAgbWFza0NvbG9yLmIgKiAwLjExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW1hZ2VDb2xvci5hICo9IGx1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGltYWdlQ29sb3IucmdiICo9IGltYWdlQ29sb3IuYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnbF9GcmFnQ29sb3IgPSBpbWFnZUNvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgdmFyIHNtYXNrQ2FjaGUgPSBudWxsOworCisgIGZ1bmN0aW9uIGluaXRTbWFza0dMKCkgeworICAgIHZhciBjYW52YXMsIGdsOworICAgIGdlbmVyYXRlR0woKTsKKyAgICBjYW52YXMgPSBjdXJyZW50Q2FudmFzOworICAgIGN1cnJlbnRDYW52YXMgPSBudWxsOworICAgIGdsID0gY3VycmVudEdMOworICAgIGN1cnJlbnRHTCA9IG51bGw7CisgICAgdmFyIHZlcnRleFNoYWRlciA9IGNyZWF0ZVZlcnRleFNoYWRlcihnbCwgc21hc2tWZXJ0ZXhTaGFkZXJDb2RlKTsKKyAgICB2YXIgZnJhZ21lbnRTaGFkZXIgPSBjcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgc21hc2tGcmFnbWVudFNoYWRlckNvZGUpOworICAgIHZhciBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnbCwgW3ZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXJdKTsKKyAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOworICAgIHZhciBjYWNoZSA9IHt9OworICAgIGNhY2hlLmdsID0gZ2w7CisgICAgY2FjaGUuY2FudmFzID0gY2FudmFzOworICAgIGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9yZXNvbHV0aW9uIik7CisgICAgY2FjaGUucG9zaXRpb25Mb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX3Bvc2l0aW9uIik7CisgICAgY2FjaGUuYmFja2Ryb3BMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZHJvcCIpOworICAgIGNhY2hlLnN1YnR5cGVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9zdWJ0eXBlIik7CisgICAgdmFyIHRleENvb3JkTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV90ZXhDb29yZCIpOworICAgIHZhciB0ZXhMYXllckxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2ltYWdlIik7CisgICAgdmFyIHRleE1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9tYXNrIik7CisgICAgdmFyIHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRleENvb3JkQnVmZmVyKTsKKyAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjAsIDEuMCwgMC4wLCAxLjAsIDEuMCwgMC4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CisgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGV4Q29vcmRMb2NhdGlvbik7CisgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZExvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOworICAgIGdsLnVuaWZvcm0xaSh0ZXhMYXllckxvY2F0aW9uLCAwKTsKKyAgICBnbC51bmlmb3JtMWkodGV4TWFza0xvY2F0aW9uLCAxKTsKKyAgICBzbWFza0NhY2hlID0gY2FjaGU7CisgIH0KKworICBmdW5jdGlvbiBjb21wb3NlU01hc2sobGF5ZXIsIG1hc2ssIHByb3BlcnRpZXMpIHsKKyAgICB2YXIgd2lkdGggPSBsYXllci53aWR0aCwKKyAgICAgICAgaGVpZ2h0ID0gbGF5ZXIuaGVpZ2h0OworCisgICAgaWYgKCFzbWFza0NhY2hlKSB7CisgICAgICBpbml0U21hc2tHTCgpOworICAgIH0KKworICAgIHZhciBjYWNoZSA9IHNtYXNrQ2FjaGUsCisgICAgICAgIGNhbnZhcyA9IGNhY2hlLmNhbnZhcywKKyAgICAgICAgZ2wgPSBjYWNoZS5nbDsKKyAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKKyAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCk7CisgICAgZ2wudW5pZm9ybTJmKGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBpZiAocHJvcGVydGllcy5iYWNrZHJvcCkgeworICAgICAgZ2wudW5pZm9ybTRmKGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiwgcHJvcGVydGllcy5iYWNrZHJvcFswXSwgcHJvcGVydGllcy5iYWNrZHJvcFsxXSwgcHJvcGVydGllcy5iYWNrZHJvcFsyXSwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdsLnVuaWZvcm00ZihjYWNoZS5yZXNvbHV0aW9uTG9jYXRpb24sIDAsIDAsIDAsIDApOworICAgIH0KKworICAgIGdsLnVuaWZvcm0xaShjYWNoZS5zdWJ0eXBlTG9jYXRpb24sIHByb3BlcnRpZXMuc3VidHlwZSA9PT0gIkx1bWlub3NpdHkiID8gMSA6IDApOworICAgIHZhciB0ZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgbGF5ZXIsIGdsLlRFWFRVUkUwKTsKKyAgICB2YXIgbWFza1RleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBtYXNrLCBnbC5URVhUVVJFMSk7CisgICAgdmFyIGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOworICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpOworICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCB3aWR0aCwgMCwgMCwgaGVpZ2h0LCAwLCBoZWlnaHQsIHdpZHRoLCAwLCB3aWR0aCwgaGVpZ2h0XSksIGdsLlNUQVRJQ19EUkFXKTsKKyAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjYWNoZS5wb3NpdGlvbkxvY2F0aW9uKTsKKyAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNhY2hlLnBvc2l0aW9uTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7CisgICAgZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKKyAgICBnbC5lbmFibGUoZ2wuQkxFTkQpOworICAgIGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOworICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVTLCAwLCA2KTsKKyAgICBnbC5mbHVzaCgpOworICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7CisgICAgZ2wuZGVsZXRlVGV4dHVyZShtYXNrVGV4dHVyZSk7CisgICAgZ2wuZGVsZXRlQnVmZmVyKGJ1ZmZlcik7CisgICAgcmV0dXJuIGNhbnZhczsKKyAgfQorCisgIHZhciBmaWd1cmVzVmVydGV4U2hhZGVyQ29kZSA9ICJcCisgIGF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhdHRyaWJ1dGUgdmVjMyBhX2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlmb3JtIHZlYzIgdV9zY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5pZm9ybSB2ZWMyIHVfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2YXJ5aW5nIHZlYzQgdl9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgbWFpbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlYzIgcG9zaXRpb24gPSAoYV9wb3NpdGlvbiArIHVfb2Zmc2V0KSAqIHVfc2NhbGU7ICAgICAgICAgIFwKKyAgICB2ZWMyIGNsaXBTcGFjZSA9IChwb3NpdGlvbiAvIHVfcmVzb2x1dGlvbikgKiAyLjAgLSAxLjA7ICAgICBcCisgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNsaXBTcGFjZSAqIHZlYzIoMSwgLTEpLCAwLCAxKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2X2NvbG9yID0gdmVjNChhX2NvbG9yIC8gMjU1LjAsIDEuMCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgdmFyIGZpZ3VyZXNGcmFnbWVudFNoYWRlckNvZGUgPSAiXAorICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZhcnlpbmcgdmVjNCB2X2NvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisgIHZhciBmaWd1cmVzQ2FjaGUgPSBudWxsOworCisgIGZ1bmN0aW9uIGluaXRGaWd1cmVzR0woKSB7CisgICAgdmFyIGNhbnZhcywgZ2w7CisgICAgZ2VuZXJhdGVHTCgpOworICAgIGNhbnZhcyA9IGN1cnJlbnRDYW52YXM7CisgICAgY3VycmVudENhbnZhcyA9IG51bGw7CisgICAgZ2wgPSBjdXJyZW50R0w7CisgICAgY3VycmVudEdMID0gbnVsbDsKKyAgICB2YXIgdmVydGV4U2hhZGVyID0gY3JlYXRlVmVydGV4U2hhZGVyKGdsLCBmaWd1cmVzVmVydGV4U2hhZGVyQ29kZSk7CisgICAgdmFyIGZyYWdtZW50U2hhZGVyID0gY3JlYXRlRnJhZ21lbnRTaGFkZXIoZ2wsIGZpZ3VyZXNGcmFnbWVudFNoYWRlckNvZGUpOworICAgIHZhciBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnbCwgW3ZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXJdKTsKKyAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOworICAgIHZhciBjYWNoZSA9IHt9OworICAgIGNhY2hlLmdsID0gZ2w7CisgICAgY2FjaGUuY2FudmFzID0gY2FudmFzOworICAgIGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9yZXNvbHV0aW9uIik7CisgICAgY2FjaGUuc2NhbGVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9zY2FsZSIpOworICAgIGNhY2hlLm9mZnNldExvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X29mZnNldCIpOworICAgIGNhY2hlLnBvc2l0aW9uTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9wb3NpdGlvbiIpOworICAgIGNhY2hlLmNvbG9yTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9jb2xvciIpOworICAgIGZpZ3VyZXNDYWNoZSA9IGNhY2hlOworICB9CisKKyAgZnVuY3Rpb24gZHJhd0ZpZ3VyZXMod2lkdGgsIGhlaWdodCwgYmFja2dyb3VuZENvbG9yLCBmaWd1cmVzLCBjb250ZXh0KSB7CisgICAgaWYgKCFmaWd1cmVzQ2FjaGUpIHsKKyAgICAgIGluaXRGaWd1cmVzR0woKTsKKyAgICB9CisKKyAgICB2YXIgY2FjaGUgPSBmaWd1cmVzQ2FjaGUsCisgICAgICAgIGNhbnZhcyA9IGNhY2hlLmNhbnZhcywKKyAgICAgICAgZ2wgPSBjYWNoZS5nbDsKKyAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKKyAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCk7CisgICAgZ2wudW5pZm9ybTJmKGNhY2hlLnJlc29sdXRpb25Mb2NhdGlvbiwgd2lkdGgsIGhlaWdodCk7CisgICAgdmFyIGNvdW50ID0gMDsKKyAgICB2YXIgaSwgaWksIHJvd3M7CisKKyAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgc3dpdGNoIChmaWd1cmVzW2ldLnR5cGUpIHsKKyAgICAgICAgY2FzZSAibGF0dGljZSI6CisgICAgICAgICAgcm93cyA9IGZpZ3VyZXNbaV0uY29vcmRzLmxlbmd0aCAvIGZpZ3VyZXNbaV0udmVydGljZXNQZXJSb3cgfCAwOworICAgICAgICAgIGNvdW50ICs9IChyb3dzIC0gMSkgKiAoZmlndXJlc1tpXS52ZXJ0aWNlc1BlclJvdyAtIDEpICogNjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJ0cmlhbmdsZXMiOgorICAgICAgICAgIGNvdW50ICs9IGZpZ3VyZXNbaV0uY29vcmRzLmxlbmd0aDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOworICAgIHZhciBjb2xvcnMgPSBuZXcgVWludDhBcnJheShjb3VudCAqIDMpOworICAgIHZhciBjb29yZHNNYXAgPSBjb250ZXh0LmNvb3JkcywKKyAgICAgICAgY29sb3JzTWFwID0gY29udGV4dC5jb2xvcnM7CisgICAgdmFyIHBJbmRleCA9IDAsCisgICAgICAgIGNJbmRleCA9IDA7CisKKyAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgdmFyIGZpZ3VyZSA9IGZpZ3VyZXNbaV0sCisgICAgICAgICAgcHMgPSBmaWd1cmUuY29vcmRzLAorICAgICAgICAgIGNzID0gZmlndXJlLmNvbG9yczsKKworICAgICAgc3dpdGNoIChmaWd1cmUudHlwZSkgeworICAgICAgICBjYXNlICJsYXR0aWNlIjoKKyAgICAgICAgICB2YXIgY29scyA9IGZpZ3VyZS52ZXJ0aWNlc1BlclJvdzsKKyAgICAgICAgICByb3dzID0gcHMubGVuZ3RoIC8gY29scyB8IDA7CisKKyAgICAgICAgICBmb3IgKHZhciByb3cgPSAxOyByb3cgPCByb3dzOyByb3crKykgeworICAgICAgICAgICAgdmFyIG9mZnNldCA9IHJvdyAqIGNvbHMgKyAxOworCisgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSAxOyBjb2wgPCBjb2xzOyBjb2wrKywgb2Zmc2V0KyspIHsKKyAgICAgICAgICAgICAgY29vcmRzW3BJbmRleF0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gY29scyAtIDFdXTsKKyAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDFdID0gY29vcmRzTWFwW3BzW29mZnNldCAtIGNvbHMgLSAxXSArIDFdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMl0gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gY29sc11dOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgM10gPSBjb29yZHNNYXBbcHNbb2Zmc2V0IC0gY29sc10gKyAxXTsKKyAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDRdID0gY29vcmRzTWFwW3BzW29mZnNldCAtIDFdXTsKKyAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDVdID0gY29vcmRzTWFwW3BzW29mZnNldCAtIDFdICsgMV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXhdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIGNvbHMgLSAxXV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAxXSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSBjb2xzIC0gMV0gKyAxXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDJdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIGNvbHMgLSAxXSArIDJdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgM10gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29sc11dOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgNF0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gY29sc10gKyAxXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDVdID0gY29sb3JzTWFwW2NzW29mZnNldCAtIGNvbHNdICsgMl07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA2XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSAxXV07CisgICAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyA3XSA9IGNvbG9yc01hcFtjc1tvZmZzZXQgLSAxXSArIDFdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgOF0gPSBjb2xvcnNNYXBbY3Nbb2Zmc2V0IC0gMV0gKyAyXTsKKyAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDZdID0gY29vcmRzW3BJbmRleCArIDJdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgN10gPSBjb29yZHNbcEluZGV4ICsgM107CisgICAgICAgICAgICAgIGNvb3Jkc1twSW5kZXggKyA4XSA9IGNvb3Jkc1twSW5kZXggKyA0XTsKKyAgICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDldID0gY29vcmRzW3BJbmRleCArIDVdOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMTBdID0gY29vcmRzTWFwW3BzW29mZnNldF1dOworICAgICAgICAgICAgICBjb29yZHNbcEluZGV4ICsgMTFdID0gY29vcmRzTWFwW3BzW29mZnNldF0gKyAxXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDldID0gY29sb3JzW2NJbmRleCArIDNdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTBdID0gY29sb3JzW2NJbmRleCArIDRdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTFdID0gY29sb3JzW2NJbmRleCArIDVdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTJdID0gY29sb3JzW2NJbmRleCArIDZdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTNdID0gY29sb3JzW2NJbmRleCArIDddOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTRdID0gY29sb3JzW2NJbmRleCArIDhdOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTVdID0gY29sb3JzTWFwW2NzW29mZnNldF1dOworICAgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMTZdID0gY29sb3JzTWFwW2NzW29mZnNldF0gKyAxXTsKKyAgICAgICAgICAgICAgY29sb3JzW2NJbmRleCArIDE3XSA9IGNvbG9yc01hcFtjc1tvZmZzZXRdICsgMl07CisgICAgICAgICAgICAgIHBJbmRleCArPSAxMjsKKyAgICAgICAgICAgICAgY0luZGV4ICs9IDE4OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRyaWFuZ2xlcyI6CisgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gcHMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgY29vcmRzW3BJbmRleF0gPSBjb29yZHNNYXBbcHNbal1dOworICAgICAgICAgICAgY29vcmRzW3BJbmRleCArIDFdID0gY29vcmRzTWFwW3BzW2pdICsgMV07CisgICAgICAgICAgICBjb2xvcnNbY0luZGV4XSA9IGNvbG9yc01hcFtjc1tqXV07CisgICAgICAgICAgICBjb2xvcnNbY0luZGV4ICsgMV0gPSBjb2xvcnNNYXBbY3Nbal0gKyAxXTsKKyAgICAgICAgICAgIGNvbG9yc1tjSW5kZXggKyAyXSA9IGNvbG9yc01hcFtjc1tqXSArIDJdOworICAgICAgICAgICAgcEluZGV4ICs9IDI7CisgICAgICAgICAgICBjSW5kZXggKz0gMzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7CisgICAgICBnbC5jbGVhckNvbG9yKGJhY2tncm91bmRDb2xvclswXSAvIDI1NSwgYmFja2dyb3VuZENvbG9yWzFdIC8gMjU1LCBiYWNrZ3JvdW5kQ29sb3JbMl0gLyAyNTUsIDEuMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7CisgICAgfQorCisgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgdmFyIGNvb3Jkc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOworICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBjb29yZHNCdWZmZXIpOworICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBjb29yZHMsIGdsLlNUQVRJQ19EUkFXKTsKKyAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjYWNoZS5wb3NpdGlvbkxvY2F0aW9uKTsKKyAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNhY2hlLnBvc2l0aW9uTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7CisgICAgdmFyIGNvbG9yc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOworICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBjb2xvcnNCdWZmZXIpOworICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBjb2xvcnMsIGdsLlNUQVRJQ19EUkFXKTsKKyAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjYWNoZS5jb2xvckxvY2F0aW9uKTsKKyAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNhY2hlLmNvbG9yTG9jYXRpb24sIDMsIGdsLlVOU0lHTkVEX0JZVEUsIGZhbHNlLCAwLCAwKTsKKyAgICBnbC51bmlmb3JtMmYoY2FjaGUuc2NhbGVMb2NhdGlvbiwgY29udGV4dC5zY2FsZVgsIGNvbnRleHQuc2NhbGVZKTsKKyAgICBnbC51bmlmb3JtMmYoY2FjaGUub2Zmc2V0TG9jYXRpb24sIGNvbnRleHQub2Zmc2V0WCwgY29udGV4dC5vZmZzZXRZKTsKKyAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFUywgMCwgY291bnQpOworICAgIGdsLmZsdXNoKCk7CisgICAgZ2wuZGVsZXRlQnVmZmVyKGNvb3Jkc0J1ZmZlcik7CisgICAgZ2wuZGVsZXRlQnVmZmVyKGNvbG9yc0J1ZmZlcik7CisgICAgcmV0dXJuIGNhbnZhczsKKyAgfQorCisgIHJldHVybiB7CisgICAgdHJ5SW5pdEdMKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgZ2VuZXJhdGVHTCgpOworICAgICAgICByZXR1cm4gISFjdXJyZW50R0w7CisgICAgICB9IGNhdGNoIChleCkge30KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICBjb21wb3NlU01hc2ssCisgICAgZHJhd0ZpZ3VyZXMsCisKKyAgICBjbGVhbnVwKCkgeworICAgICAgaWYgKHNtYXNrQ2FjaGUgJiYgc21hc2tDYWNoZS5jYW52YXMpIHsKKyAgICAgICAgc21hc2tDYWNoZS5jYW52YXMud2lkdGggPSAwOworICAgICAgICBzbWFza0NhY2hlLmNhbnZhcy5oZWlnaHQgPSAwOworICAgICAgfQorCisgICAgICBpZiAoZmlndXJlc0NhY2hlICYmIGZpZ3VyZXNDYWNoZS5jYW52YXMpIHsKKyAgICAgICAgZmlndXJlc0NhY2hlLmNhbnZhcy53aWR0aCA9IDA7CisgICAgICAgIGZpZ3VyZXNDYWNoZS5jYW52YXMuaGVpZ2h0ID0gMDsKKyAgICAgIH0KKworICAgICAgc21hc2tDYWNoZSA9IG51bGw7CisgICAgICBmaWd1cmVzQ2FjaGUgPSBudWxsOworICAgIH0KKworICB9OworfSgpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kaXNwbGF5L3dvcmtlcl9vcHRpb25zLmpzIGIvbGliL2Rpc3BsYXkvd29ya2VyX29wdGlvbnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiOWMzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kaXNwbGF5L3dvcmtlcl9vcHRpb25zLmpzCkBAIC0wLDAgKzEsMzEgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkdsb2JhbFdvcmtlck9wdGlvbnMgPSB2b2lkIDA7Citjb25zdCBHbG9iYWxXb3JrZXJPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKK2V4cG9ydHMuR2xvYmFsV29ya2VyT3B0aW9ucyA9IEdsb2JhbFdvcmtlck9wdGlvbnM7CitHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnQgPSBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnQ7CitHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9IEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID09PSB1bmRlZmluZWQgPyAiIiA6IEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kaXNwbGF5L3htbF9wYXJzZXIuanMgYi9saWIvZGlzcGxheS94bWxfcGFyc2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTg5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGlzcGxheS94bWxfcGFyc2VyLmpzCkBAIC0wLDAgKzEsNDU4IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5TaW1wbGVYTUxQYXJzZXIgPSB2b2lkIDA7Citjb25zdCBYTUxQYXJzZXJFcnJvckNvZGUgPSB7CisgIE5vRXJyb3I6IDAsCisgIEVuZE9mRG9jdW1lbnQ6IC0xLAorICBVbnRlcm1pbmF0ZWRDZGF0OiAtMiwKKyAgVW50ZXJtaW5hdGVkWG1sRGVjbGFyYXRpb246IC0zLAorICBVbnRlcm1pbmF0ZWREb2N0eXBlRGVjbGFyYXRpb246IC00LAorICBVbnRlcm1pbmF0ZWRDb21tZW50OiAtNSwKKyAgTWFsZm9ybWVkRWxlbWVudDogLTYsCisgIE91dE9mTWVtb3J5OiAtNywKKyAgVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6IC04LAorICBVbnRlcm1pbmF0ZWRFbGVtZW50OiAtOSwKKyAgRWxlbWVudE5ldmVyQmVndW46IC0xMAorfTsKKworZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKHMsIGluZGV4KSB7CisgIGNvbnN0IGNoID0gc1tpbmRleF07CisgIHJldHVybiBjaCA9PT0gIiAiIHx8IGNoID09PSAiXG4iIHx8IGNoID09PSAiXHIiIHx8IGNoID09PSAiXHQiOworfQorCitmdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcocykgeworICBmb3IgKGxldCBpID0gMCwgaWkgPSBzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICBpZiAoIWlzV2hpdGVzcGFjZShzLCBpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBYTUxQYXJzZXJCYXNlIHsKKyAgX3Jlc29sdmVFbnRpdGllcyhzKSB7CisgICAgcmV0dXJuIHMucmVwbGFjZSgvJihbXjtdKyk7L2csIChhbGwsIGVudGl0eSkgPT4geworICAgICAgaWYgKGVudGl0eS5zdWJzdHJpbmcoMCwgMikgPT09ICIjeCIpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygyKSwgMTYpKTsKKyAgICAgIH0gZWxzZSBpZiAoZW50aXR5LnN1YnN0cmluZygwLCAxKSA9PT0gIiMiKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGVudGl0eS5zdWJzdHJpbmcoMSksIDEwKSk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZW50aXR5KSB7CisgICAgICAgIGNhc2UgImx0IjoKKyAgICAgICAgICByZXR1cm4gIjwiOworCisgICAgICAgIGNhc2UgImd0IjoKKyAgICAgICAgICByZXR1cm4gIj4iOworCisgICAgICAgIGNhc2UgImFtcCI6CisgICAgICAgICAgcmV0dXJuICImIjsKKworICAgICAgICBjYXNlICJxdW90IjoKKyAgICAgICAgICByZXR1cm4gJyInOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5vblJlc29sdmVFbnRpdHkoZW50aXR5KTsKKyAgICB9KTsKKyAgfQorCisgIF9wYXJzZUNvbnRlbnQocywgc3RhcnQpIHsKKyAgICBjb25zdCBhdHRyaWJ1dGVzID0gW107CisgICAgbGV0IHBvcyA9IHN0YXJ0OworCisgICAgZnVuY3Rpb24gc2tpcFdzKCkgeworICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7CisgICAgICAgICsrcG9zOworICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIpIHsKKyAgICAgICsrcG9zOworICAgIH0KKworICAgIGNvbnN0IG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKKyAgICBza2lwV3MoKTsKKworICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICIvIiAmJiBzW3Bvc10gIT09ICI/IikgeworICAgICAgc2tpcFdzKCk7CisgICAgICBsZXQgYXR0ck5hbWUgPSAiIiwKKyAgICAgICAgICBhdHRyVmFsdWUgPSAiIjsKKworICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI9IikgeworICAgICAgICBhdHRyTmFtZSArPSBzW3Bvc107CisgICAgICAgICsrcG9zOworICAgICAgfQorCisgICAgICBza2lwV3MoKTsKKworICAgICAgaWYgKHNbcG9zXSAhPT0gIj0iKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICArK3BvczsKKyAgICAgIHNraXBXcygpOworICAgICAgY29uc3QgYXR0ckVuZENoYXIgPSBzW3Bvc107CisKKyAgICAgIGlmIChhdHRyRW5kQ2hhciAhPT0gJyInICYmIGF0dHJFbmRDaGFyICE9PSAiJyIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGF0dHJFbmRJbmRleCA9IHMuaW5kZXhPZihhdHRyRW5kQ2hhciwgKytwb3MpOworCisgICAgICBpZiAoYXR0ckVuZEluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgYXR0clZhbHVlID0gcy5zdWJzdHJpbmcocG9zLCBhdHRyRW5kSW5kZXgpOworICAgICAgYXR0cmlidXRlcy5wdXNoKHsKKyAgICAgICAgbmFtZTogYXR0ck5hbWUsCisgICAgICAgIHZhbHVlOiB0aGlzLl9yZXNvbHZlRW50aXRpZXMoYXR0clZhbHVlKQorICAgICAgfSk7CisgICAgICBwb3MgPSBhdHRyRW5kSW5kZXggKyAxOworICAgICAgc2tpcFdzKCk7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIG5hbWUsCisgICAgICBhdHRyaWJ1dGVzLAorICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydAorICAgIH07CisgIH0KKworICBfcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocywgc3RhcnQpIHsKKyAgICBsZXQgcG9zID0gc3RhcnQ7CisKKyAgICBmdW5jdGlvbiBza2lwV3MoKSB7CisgICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlKHMsIHBvcykpIHsKKyAgICAgICAgKytwb3M7CisgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICIvIikgeworICAgICAgKytwb3M7CisgICAgfQorCisgICAgY29uc3QgbmFtZSA9IHMuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpOworICAgIHNraXBXcygpOworICAgIGNvbnN0IGF0dHJTdGFydCA9IHBvczsKKworICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAoc1twb3NdICE9PSAiPyIgfHwgc1twb3MgKyAxXSAhPT0gIj4iKSkgeworICAgICAgKytwb3M7CisgICAgfQorCisgICAgY29uc3QgdmFsdWUgPSBzLnN1YnN0cmluZyhhdHRyU3RhcnQsIHBvcyk7CisgICAgcmV0dXJuIHsKKyAgICAgIG5hbWUsCisgICAgICB2YWx1ZSwKKyAgICAgIHBhcnNlZDogcG9zIC0gc3RhcnQKKyAgICB9OworICB9CisKKyAgcGFyc2VYbWwocykgeworICAgIGxldCBpID0gMDsKKworICAgIHdoaWxlIChpIDwgcy5sZW5ndGgpIHsKKyAgICAgIGNvbnN0IGNoID0gc1tpXTsKKyAgICAgIGxldCBqID0gaTsKKworICAgICAgaWYgKGNoID09PSAiPCIpIHsKKyAgICAgICAgKytqOworICAgICAgICBjb25zdCBjaDIgPSBzW2pdOworICAgICAgICBsZXQgcTsKKworICAgICAgICBzd2l0Y2ggKGNoMikgeworICAgICAgICAgIGNhc2UgIi8iOgorICAgICAgICAgICAgKytqOworICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGopOworCisgICAgICAgICAgICBpZiAocSA8IDApIHsKKyAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRFbGVtZW50KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLm9uRW5kRWxlbWVudChzLnN1YnN0cmluZyhqLCBxKSk7CisgICAgICAgICAgICBqID0gcSArIDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIj8iOgorICAgICAgICAgICAgKytqOworCisgICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIGopOworCisgICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIHBpLnBhcnNlZCwgaiArIHBpLnBhcnNlZCArIDIpICE9PSAiPz4iKSB7CisgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkWG1sRGVjbGFyYXRpb24pOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMub25QaShwaS5uYW1lLCBwaS52YWx1ZSk7CisgICAgICAgICAgICBqICs9IHBpLnBhcnNlZCArIDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgIiEiOgorICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgMykgPT09ICItLSIpIHsKKyAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiLS0+IiwgaiArIDMpOworCisgICAgICAgICAgICAgIGlmIChxIDwgMCkgeworICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkQ29tbWVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhpcy5vbkNvbW1lbnQocy5zdWJzdHJpbmcoaiArIDMsIHEpKTsKKyAgICAgICAgICAgICAgaiA9IHEgKyAzOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDgpID09PSAiW0NEQVRBWyIpIHsKKyAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiXV0+IiwgaiArIDgpOworCisgICAgICAgICAgICAgIGlmIChxIDwgMCkgeworICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkQ2RhdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgdGhpcy5vbkNkYXRhKHMuc3Vic3RyaW5nKGogKyA4LCBxKSk7CisgICAgICAgICAgICAgIGogPSBxICsgMzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gIkRPQ1RZUEUiKSB7CisgICAgICAgICAgICAgIGNvbnN0IHEyID0gcy5pbmRleE9mKCJbIiwgaiArIDgpOworICAgICAgICAgICAgICBsZXQgY29tcGxleERvY3R5cGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGogKyA4KTsKKworICAgICAgICAgICAgICBpZiAocSA8IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHEyID4gMCAmJiBxID4gcTIpIHsKKyAgICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCJdPiIsIGogKyA4KTsKKworICAgICAgICAgICAgICAgIGlmIChxIDwgMCkgeworICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWREb2N0eXBlRGVjbGFyYXRpb24pOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbXBsZXhEb2N0eXBlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvbnN0IGRvY3R5cGVDb250ZW50ID0gcy5zdWJzdHJpbmcoaiArIDgsIHEgKyAoY29tcGxleERvY3R5cGUgPyAxIDogMCkpOworICAgICAgICAgICAgICB0aGlzLm9uRG9jdHlwZShkb2N0eXBlQ29udGVudCk7CisgICAgICAgICAgICAgIGogPSBxICsgKGNvbXBsZXhEb2N0eXBlID8gMiA6IDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5NYWxmb3JtZWRFbGVtZW50KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fcGFyc2VDb250ZW50KHMsIGopOworCisgICAgICAgICAgICBpZiAoY29udGVudCA9PT0gbnVsbCkgeworICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLk1hbGZvcm1lZEVsZW1lbnQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIGNvbnRlbnQucGFyc2VkLCBqICsgY29udGVudC5wYXJzZWQgKyAyKSA9PT0gIi8+IikgeworICAgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMuc3Vic3RyaW5nKGogKyBjb250ZW50LnBhcnNlZCwgaiArIGNvbnRlbnQucGFyc2VkICsgMSkgIT09ICI+IikgeworICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMub25CZWdpbkVsZW1lbnQoY29udGVudC5uYW1lLCBjb250ZW50LmF0dHJpYnV0ZXMsIGlzQ2xvc2VkKTsKKyAgICAgICAgICAgIGogKz0gY29udGVudC5wYXJzZWQgKyAoaXNDbG9zZWQgPyAyIDogMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGogPCBzLmxlbmd0aCAmJiBzW2pdICE9PSAiPCIpIHsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB0ZXh0ID0gcy5zdWJzdHJpbmcoaSwgaik7CisgICAgICAgIHRoaXMub25UZXh0KHRoaXMuX3Jlc29sdmVFbnRpdGllcyh0ZXh0KSk7CisgICAgICB9CisKKyAgICAgIGkgPSBqOworICAgIH0KKyAgfQorCisgIG9uUmVzb2x2ZUVudGl0eShuYW1lKSB7CisgICAgcmV0dXJuIGAmJHtuYW1lfTtgOworICB9CisKKyAgb25QaShuYW1lLCB2YWx1ZSkge30KKworICBvbkNvbW1lbnQodGV4dCkge30KKworICBvbkNkYXRhKHRleHQpIHt9CisKKyAgb25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KSB7fQorCisgIG9uVGV4dCh0ZXh0KSB7fQorCisgIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHt9CisKKyAgb25FbmRFbGVtZW50KG5hbWUpIHt9CisKKyAgb25FcnJvcihjb2RlKSB7fQorCit9CisKK2NsYXNzIFNpbXBsZURPTU5vZGUgeworICBjb25zdHJ1Y3Rvcihub2RlTmFtZSwgbm9kZVZhbHVlKSB7CisgICAgdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lOworICAgIHRoaXMubm9kZVZhbHVlID0gbm9kZVZhbHVlOworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicGFyZW50Tm9kZSIsIHsKKyAgICAgIHZhbHVlOiBudWxsLAorICAgICAgd3JpdGFibGU6IHRydWUKKyAgICB9KTsKKyAgfQorCisgIGdldCBmaXJzdENoaWxkKCkgeworICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXMgJiYgdGhpcy5jaGlsZE5vZGVzWzBdOworICB9CisKKyAgZ2V0IG5leHRTaWJsaW5nKCkgeworICAgIGNvbnN0IGNoaWxkTm9kZXMgPSB0aGlzLnBhcmVudE5vZGUuY2hpbGROb2RlczsKKworICAgIGlmICghY2hpbGROb2RlcykgeworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBjb25zdCBpbmRleCA9IGNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTsKKworICAgIGlmIChpbmRleCA9PT0gLTEpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgcmV0dXJuIGNoaWxkTm9kZXNbaW5kZXggKyAxXTsKKyAgfQorCisgIGdldCB0ZXh0Q29udGVudCgpIHsKKyAgICBpZiAoIXRoaXMuY2hpbGROb2RlcykgeworICAgICAgcmV0dXJuIHRoaXMubm9kZVZhbHVlIHx8ICIiOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXMubWFwKGZ1bmN0aW9uIChjaGlsZCkgeworICAgICAgcmV0dXJuIGNoaWxkLnRleHRDb250ZW50OworICAgIH0pLmpvaW4oIiIpOworICB9CisKKyAgaGFzQ2hpbGROb2RlcygpIHsKKyAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVzICYmIHRoaXMuY2hpbGROb2Rlcy5sZW5ndGggPiAwOworICB9CisKK30KKworY2xhc3MgU2ltcGxlWE1MUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyQmFzZSB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gbnVsbDsKKyAgICB0aGlzLl9zdGFjayA9IG51bGw7CisgICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CisgIH0KKworICBwYXJzZUZyb21TdHJpbmcoZGF0YSkgeworICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IFtdOworICAgIHRoaXMuX3N0YWNrID0gW107CisgICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CisgICAgdGhpcy5wYXJzZVhtbChkYXRhKTsKKworICAgIGlmICh0aGlzLl9lcnJvckNvZGUgIT09IFhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yKSB7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIGNvbnN0IFtkb2N1bWVudEVsZW1lbnRdID0gdGhpcy5fY3VycmVudEZyYWdtZW50OworCisgICAgaWYgKCFkb2N1bWVudEVsZW1lbnQpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIGRvY3VtZW50RWxlbWVudAorICAgIH07CisgIH0KKworICBvblJlc29sdmVFbnRpdHkobmFtZSkgeworICAgIHN3aXRjaCAobmFtZSkgeworICAgICAgY2FzZSAiYXBvcyI6CisgICAgICAgIHJldHVybiAiJyI7CisgICAgfQorCisgICAgcmV0dXJuIHN1cGVyLm9uUmVzb2x2ZUVudGl0eShuYW1lKTsKKyAgfQorCisgIG9uVGV4dCh0ZXh0KSB7CisgICAgaWYgKGlzV2hpdGVzcGFjZVN0cmluZyh0ZXh0KSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG5vZGUgPSBuZXcgU2ltcGxlRE9NTm9kZSgiI3RleHQiLCB0ZXh0KTsKKworICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG5vZGUpOworICB9CisKKyAgb25DZGF0YSh0ZXh0KSB7CisgICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOworCisgICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CisgIH0KKworICBvbkJlZ2luRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCBpc0VtcHR5KSB7CisgICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKG5hbWUpOworICAgIG5vZGUuY2hpbGROb2RlcyA9IFtdOworCisgICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CisKKyAgICBpZiAoaXNFbXB0eSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudEZyYWdtZW50KTsKKworICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG5vZGUuY2hpbGROb2RlczsKKyAgfQorCisgIG9uRW5kRWxlbWVudChuYW1lKSB7CisgICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gdGhpcy5fc3RhY2sucG9wKCkgfHwgW107CisgICAgY29uc3QgbGFzdEVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RnJhZ21lbnRbdGhpcy5fY3VycmVudEZyYWdtZW50Lmxlbmd0aCAtIDFdOworCisgICAgaWYgKCFsYXN0RWxlbWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxhc3RFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgbGFzdEVsZW1lbnQuY2hpbGROb2Rlc1tpXS5wYXJlbnROb2RlID0gbGFzdEVsZW1lbnQ7CisgICAgfQorICB9CisKKyAgb25FcnJvcihjb2RlKSB7CisgICAgdGhpcy5fZXJyb3JDb2RlID0gY29kZTsKKyAgfQorCit9CisKK2V4cG9ydHMuU2ltcGxlWE1MUGFyc2VyID0gU2ltcGxlWE1MUGFyc2VyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9leGFtcGxlcy9ub2RlL2RvbXN0dWJzLmpzIGIvbGliL2V4YW1wbGVzL25vZGUvZG9tc3R1YnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNjU1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9leGFtcGxlcy9ub2RlL2RvbXN0dWJzLmpzCkBAIC0wLDAgKzEsMzAyIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHhtbEVuY29kZShzKSB7CisgIHZhciBpID0gMCwKKyAgICAgIGNoOworICBzID0gU3RyaW5nKHMpOworCisgIHdoaWxlIChpIDwgcy5sZW5ndGggJiYgKGNoID0gc1tpXSkgIT09ICImIiAmJiBjaCAhPT0gIjwiICYmIGNoICE9PSAnIicgJiYgY2ggIT09ICJcbiIgJiYgY2ggIT09ICJcciIgJiYgY2ggIT09ICJcdCIpIHsKKyAgICBpKys7CisgIH0KKworICBpZiAoaSA+PSBzLmxlbmd0aCkgeworICAgIHJldHVybiBzOworICB9CisKKyAgdmFyIGJ1ZiA9IHMuc3Vic3RyaW5nKDAsIGkpOworCisgIHdoaWxlIChpIDwgcy5sZW5ndGgpIHsKKyAgICBjaCA9IHNbaSsrXTsKKworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgIiYiOgorICAgICAgICBidWYgKz0gIiZhbXA7IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIjwiOgorICAgICAgICBidWYgKz0gIiZsdDsiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnIic6CisgICAgICAgIGJ1ZiArPSAiJnF1b3Q7IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIlxuIjoKKyAgICAgICAgYnVmICs9ICImI3hBOyI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJcciI6CisgICAgICAgIGJ1ZiArPSAiJiN4RDsiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiXHQiOgorICAgICAgICBidWYgKz0gIiYjeDk7IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJ1ZiArPSBjaDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworZnVuY3Rpb24gRE9NRWxlbWVudChuYW1lKSB7CisgIHRoaXMubm9kZU5hbWUgPSBuYW1lOworICB0aGlzLmNoaWxkTm9kZXMgPSBbXTsKKyAgdGhpcy5hdHRyaWJ1dGVzID0ge307CisgIHRoaXMudGV4dENvbnRlbnQgPSAiIjsKKworICBpZiAobmFtZSA9PT0gInN0eWxlIikgeworICAgIHRoaXMuc2hlZXQgPSB7CisgICAgICBjc3NSdWxlczogW10sCisgICAgICBpbnNlcnRSdWxlOiBmdW5jdGlvbiAocnVsZSkgeworICAgICAgICB0aGlzLmNzc1J1bGVzLnB1c2gocnVsZSk7CisgICAgICB9CisgICAgfTsKKyAgfQorfQorCitET01FbGVtZW50LnByb3RvdHlwZSA9IHsKKyAgZ2V0QXR0cmlidXRlOiBmdW5jdGlvbiBET01FbGVtZW50X2dldEF0dHJpYnV0ZShuYW1lKSB7CisgICAgaWYgKG5hbWUgaW4gdGhpcy5hdHRyaWJ1dGVzKSB7CisgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW25hbWVdOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9LAorICBnZXRBdHRyaWJ1dGVOUzogZnVuY3Rpb24gRE9NRWxlbWVudF9nZXRBdHRyaWJ1dGVOUyhOUywgbmFtZSkgeworICAgIGlmIChuYW1lIGluIHRoaXMuYXR0cmlidXRlcykgeworICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1tuYW1lXTsKKyAgICB9CisKKyAgICBpZiAoTlMpIHsKKyAgICAgIHZhciBzdWZmaXggPSAiOiIgKyBuYW1lOworCisgICAgICBmb3IgKHZhciBmdWxsTmFtZSBpbiB0aGlzLmF0dHJpYnV0ZXMpIHsKKyAgICAgICAgaWYgKGZ1bGxOYW1lLnNsaWNlKC1zdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4KSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1tmdWxsTmFtZV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfSwKKyAgc2V0QXR0cmlidXRlOiBmdW5jdGlvbiBET01FbGVtZW50X3NldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkgeworICAgIHZhbHVlID0gdmFsdWUgfHwgIiI7CisgICAgdmFsdWUgPSB4bWxFbmNvZGUodmFsdWUpOworICAgIHRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlOworICB9LAorICBzZXRBdHRyaWJ1dGVOUzogZnVuY3Rpb24gRE9NRWxlbWVudF9zZXRBdHRyaWJ1dGVOUyhOUywgbmFtZSwgdmFsdWUpIHsKKyAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgIH0sCisgIGFwcGVuZENoaWxkOiBmdW5jdGlvbiBET01FbGVtZW50X2FwcGVuZENoaWxkKGVsZW1lbnQpIHsKKyAgICB2YXIgY2hpbGROb2RlcyA9IHRoaXMuY2hpbGROb2RlczsKKworICAgIGlmICghY2hpbGROb2Rlcy5pbmNsdWRlcyhlbGVtZW50KSkgeworICAgICAgY2hpbGROb2Rlcy5wdXNoKGVsZW1lbnQpOworICAgIH0KKyAgfSwKKyAgaGFzQ2hpbGROb2RlczogZnVuY3Rpb24gRE9NRWxlbWVudF9oYXNDaGlsZE5vZGVzKCkgeworICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoICE9PSAwOworICB9LAorICBjbG9uZU5vZGU6IGZ1bmN0aW9uIERPTUVsZW1lbnRfY2xvbmVOb2RlKCkgeworICAgIHZhciBuZXdOb2RlID0gbmV3IERPTUVsZW1lbnQodGhpcy5ub2RlTmFtZSk7CisgICAgbmV3Tm9kZS5jaGlsZE5vZGVzID0gdGhpcy5jaGlsZE5vZGVzOworICAgIG5ld05vZGUuYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlczsKKyAgICBuZXdOb2RlLnRleHRDb250ZW50ID0gdGhpcy50ZXh0Q29udGVudDsKKyAgICByZXR1cm4gbmV3Tm9kZTsKKyAgfSwKKyAgdG9TdHJpbmc6IGZ1bmN0aW9uIERPTUVsZW1lbnRfdG9TdHJpbmcoKSB7CisgICAgdmFyIGJ1ZiA9IFtdOworICAgIHZhciBzZXJpYWxpemVyID0gdGhpcy5nZXRTZXJpYWxpemVyKCk7CisgICAgdmFyIGNodW5rOworCisgICAgd2hpbGUgKChjaHVuayA9IHNlcmlhbGl6ZXIuZ2V0TmV4dCgpKSAhPT0gbnVsbCkgeworICAgICAgYnVmLnB1c2goY2h1bmspOworICAgIH0KKworICAgIHJldHVybiBidWYuam9pbigiIik7CisgIH0sCisgIGdldFNlcmlhbGl6ZXI6IGZ1bmN0aW9uIERPTUVsZW1lbnRfZ2V0U2VyaWFsaXplcigpIHsKKyAgICByZXR1cm4gbmV3IERPTUVsZW1lbnRTZXJpYWxpemVyKHRoaXMpOworICB9Cit9OworCitmdW5jdGlvbiBET01FbGVtZW50U2VyaWFsaXplcihub2RlKSB7CisgIHRoaXMuX25vZGUgPSBub2RlOworICB0aGlzLl9zdGF0ZSA9IDA7CisgIHRoaXMuX2xvb3BJbmRleCA9IDA7CisgIHRoaXMuX2F0dHJpYnV0ZUtleXMgPSBudWxsOworICB0aGlzLl9jaGlsZFNlcmlhbGl6ZXIgPSBudWxsOworfQorCitET01FbGVtZW50U2VyaWFsaXplci5wcm90b3R5cGUgPSB7CisgIGdldE5leHQ6IGZ1bmN0aW9uIERPTUVsZW1lbnRTZXJpYWxpemVyX2dldE5leHQoKSB7CisgICAgdmFyIG5vZGUgPSB0aGlzLl9ub2RlOworCisgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkgeworICAgICAgY2FzZSAwOgorICAgICAgICArK3RoaXMuX3N0YXRlOworICAgICAgICByZXR1cm4gIjwiICsgbm9kZS5ub2RlTmFtZTsKKworICAgICAgY2FzZSAxOgorICAgICAgICArK3RoaXMuX3N0YXRlOworCisgICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAic3ZnOnN2ZyIpIHsKKyAgICAgICAgICByZXR1cm4gJyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayInICsgJyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIic7CisgICAgICAgIH0KKworICAgICAgY2FzZSAyOgorICAgICAgICArK3RoaXMuX3N0YXRlOworICAgICAgICB0aGlzLl9sb29wSW5kZXggPSAwOworICAgICAgICB0aGlzLl9hdHRyaWJ1dGVLZXlzID0gT2JqZWN0LmtleXMobm9kZS5hdHRyaWJ1dGVzKTsKKworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAodGhpcy5fbG9vcEluZGV4IDwgdGhpcy5fYXR0cmlidXRlS2V5cy5sZW5ndGgpIHsKKyAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuX2F0dHJpYnV0ZUtleXNbdGhpcy5fbG9vcEluZGV4KytdOworICAgICAgICAgIHJldHVybiAiICIgKyBuYW1lICsgJz0iJyArIHhtbEVuY29kZShub2RlLmF0dHJpYnV0ZXNbbmFtZV0pICsgJyInOworICAgICAgICB9CisKKyAgICAgICAgKyt0aGlzLl9zdGF0ZTsKKyAgICAgICAgcmV0dXJuICI+IjsKKworICAgICAgY2FzZSA0OgorICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gInN2Zzp0c3BhbiIgfHwgbm9kZS5ub2RlTmFtZSA9PT0gInN2ZzpzdHlsZSIpIHsKKyAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDY7CisgICAgICAgICAgcmV0dXJuIHhtbEVuY29kZShub2RlLnRleHRDb250ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgICsrdGhpcy5fc3RhdGU7CisgICAgICAgIHRoaXMuX2xvb3BJbmRleCA9IDA7CisKKyAgICAgIGNhc2UgNToKKyAgICAgICAgdmFyIHZhbHVlOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgdmFsdWUgPSB0aGlzLl9jaGlsZFNlcmlhbGl6ZXIgJiYgdGhpcy5fY2hpbGRTZXJpYWxpemVyLmdldE5leHQoKTsKKworICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBuZXh0Q2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbdGhpcy5fbG9vcEluZGV4KytdOworCisgICAgICAgICAgaWYgKG5leHRDaGlsZCkgeworICAgICAgICAgICAgdGhpcy5fY2hpbGRTZXJpYWxpemVyID0gbmV3IERPTUVsZW1lbnRTZXJpYWxpemVyKG5leHRDaGlsZCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuX2NoaWxkU2VyaWFsaXplciA9IG51bGw7CisgICAgICAgICAgICArK3RoaXMuX3N0YXRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgKyt0aGlzLl9zdGF0ZTsKKyAgICAgICAgcmV0dXJuICI8LyIgKyBub2RlLm5vZGVOYW1lICsgIj4iOworCisgICAgICBjYXNlIDc6CisgICAgICAgIHJldHVybiBudWxsOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc2VyaWFsaXphdGlvbiBzdGF0ZTogIiArIHRoaXMuX3N0YXRlKTsKKyAgICB9CisgIH0KK307Citjb25zdCBkb2N1bWVudCA9IHsKKyAgY2hpbGROb2RlczogW10sCisKKyAgZ2V0IGN1cnJlbnRTY3JpcHQoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIHNyYzogIiIKKyAgICB9OworICB9LAorCisgIGdldCBkb2N1bWVudEVsZW1lbnQoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgY3JlYXRlRWxlbWVudE5TOiBmdW5jdGlvbiAoTlMsIGVsZW1lbnQpIHsKKyAgICB2YXIgZWxPYmplY3QgPSBuZXcgRE9NRWxlbWVudChlbGVtZW50KTsKKyAgICByZXR1cm4gZWxPYmplY3Q7CisgIH0sCisgIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7CisgICAgcmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLCBlbGVtZW50KTsKKyAgfSwKKyAgZ2V0RWxlbWVudHNCeVRhZ05hbWU6IGZ1bmN0aW9uIChlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQgPT09ICJoZWFkIikgeworICAgICAgcmV0dXJuIFt0aGlzLmhlYWQgfHwgKHRoaXMuaGVhZCA9IG5ldyBET01FbGVtZW50KCJoZWFkIikpXTsKKyAgICB9CisKKyAgICByZXR1cm4gW107CisgIH0KK307CisKK2Z1bmN0aW9uIEltYWdlKCkgeworICB0aGlzLl9zcmMgPSBudWxsOworICB0aGlzLm9ubG9hZCA9IG51bGw7Cit9CisKK0ltYWdlLnByb3RvdHlwZSA9IHsKKyAgZ2V0IHNyYygpIHsKKyAgICByZXR1cm4gdGhpcy5fc3JjOworICB9LAorCisgIHNldCBzcmModmFsdWUpIHsKKyAgICB0aGlzLl9zcmMgPSB2YWx1ZTsKKworICAgIGlmICh0aGlzLm9ubG9hZCkgeworICAgICAgdGhpcy5vbmxvYWQoKTsKKyAgICB9CisgIH0KKworfTsKK2V4cG9ydHMuZG9jdW1lbnQgPSBkb2N1bWVudDsKK2V4cG9ydHMuSW1hZ2UgPSBJbWFnZTsKK3ZhciBleHBvcnRlZF9zeW1ib2xzID0gT2JqZWN0LmtleXMoZXhwb3J0cyk7CisKK2V4cG9ydHMuc2V0U3R1YnMgPSBmdW5jdGlvbiAobmFtZXNwYWNlKSB7CisgIGV4cG9ydGVkX3N5bWJvbHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CisgICAgY29uc29sZS5hc3NlcnQoIShrZXkgaW4gbmFtZXNwYWNlKSwgInByb3BlcnR5IHNob3VsZCBub3QgYmUgc2V0OiAiICsga2V5KTsKKyAgICBuYW1lc3BhY2Vba2V5XSA9IGV4cG9ydHNba2V5XTsKKyAgfSk7Cit9OworCitleHBvcnRzLnVuc2V0U3R1YnMgPSBmdW5jdGlvbiAobmFtZXNwYWNlKSB7CisgIGV4cG9ydGVkX3N5bWJvbHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CisgICAgY29uc29sZS5hc3NlcnQoa2V5IGluIG5hbWVzcGFjZSwgInByb3BlcnR5IHNob3VsZCBiZSBzZXQ6ICIgKyBrZXkpOworICAgIGRlbGV0ZSBuYW1lc3BhY2Vba2V5XTsKKyAgfSk7Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9wZGYuanMgYi9saWIvcGRmLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjhlMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGRmLmpzCkBAIC0wLDAgKzEsMjY2IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJhZGRMaW5rQXR0cmlidXRlcyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLmFkZExpbmtBdHRyaWJ1dGVzOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiZ2V0RmlsZW5hbWVGcm9tVXJsIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuZ2V0RmlsZW5hbWVGcm9tVXJsOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiTGlua1RhcmdldCIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLkxpbmtUYXJnZXQ7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJsb2FkU2NyaXB0IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMubG9hZFNjcmlwdDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERkRhdGVTdHJpbmciLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfZGlzcGxheV91dGlscy5QREZEYXRlU3RyaW5nOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiYnVpbGQiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfYXBpLmJ1aWxkOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiZ2V0RG9jdW1lbnQiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfYXBpLmdldERvY3VtZW50OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiTG9vcGJhY2tQb3J0IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2FwaS5Mb29wYmFja1BvcnQ7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZEYXRhUmFuZ2VUcmFuc3BvcnQiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfYXBpLlBERkRhdGFSYW5nZVRyYW5zcG9ydDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERldvcmtlciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9hcGkuUERGV29ya2VyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAidmVyc2lvbiIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9hcGkudmVyc2lvbjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkNNYXBDb21wcmVzc2lvblR5cGUiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5DTWFwQ29tcHJlc3Npb25UeXBlOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiY3JlYXRlT2JqZWN0VVJMIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuY3JlYXRlT2JqZWN0VVJMOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eTsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiSW52YWxpZFBERkV4Y2VwdGlvbiIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLkludmFsaWRQREZFeGNlcHRpb247CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJNaXNzaW5nUERGRXhjZXB0aW9uIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIk9QUyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLk9QUzsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBhc3N3b3JkUmVzcG9uc2VzIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuUGFzc3dvcmRSZXNwb25zZXM7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQZXJtaXNzaW9uRmxhZyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLlBlcm1pc3Npb25GbGFnOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAicmVtb3ZlTnVsbENoYXJhY3RlcnMiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdXRpbC5yZW1vdmVOdWxsQ2hhcmFjdGVyczsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgInNoYWRvdyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLnNoYWRvdzsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlVOU1VQUE9SVEVEX0ZFQVRVUkVTIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuVU5TVVBQT1JURURfRkVBVFVSRVM7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJVdGlsIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuVXRpbDsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlZlcmJvc2l0eUxldmVsIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3V0aWwuVmVyYm9zaXR5TGV2ZWw7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJBbm5vdGF0aW9uTGF5ZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfYW5ub3RhdGlvbl9sYXllci5Bbm5vdGF0aW9uTGF5ZXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJhcGlDb21wYXRpYmlsaXR5UGFyYW1zIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2FwaV9jb21wYXRpYmlsaXR5LmFwaUNvbXBhdGliaWxpdHlQYXJhbXM7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJHbG9iYWxXb3JrZXJPcHRpb25zIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnM7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJyZW5kZXJUZXh0TGF5ZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdGV4dF9sYXllci5yZW5kZXJUZXh0TGF5ZXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJTVkdHcmFwaGljcyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9zdmcuU1ZHR3JhcGhpY3M7CisgIH0KK30pOworCit2YXIgX2Rpc3BsYXlfdXRpbHMgPSByZXF1aXJlKCIuL2Rpc3BsYXkvZGlzcGxheV91dGlscy5qcyIpOworCit2YXIgX2FwaSA9IHJlcXVpcmUoIi4vZGlzcGxheS9hcGkuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX2Fubm90YXRpb25fbGF5ZXIgPSByZXF1aXJlKCIuL2Rpc3BsYXkvYW5ub3RhdGlvbl9sYXllci5qcyIpOworCit2YXIgX2FwaV9jb21wYXRpYmlsaXR5ID0gcmVxdWlyZSgiLi9kaXNwbGF5L2FwaV9jb21wYXRpYmlsaXR5LmpzIik7CisKK3ZhciBfd29ya2VyX29wdGlvbnMgPSByZXF1aXJlKCIuL2Rpc3BsYXkvd29ya2VyX29wdGlvbnMuanMiKTsKKwordmFyIF90ZXh0X2xheWVyID0gcmVxdWlyZSgiLi9kaXNwbGF5L3RleHRfbGF5ZXIuanMiKTsKKwordmFyIF9zdmcgPSByZXF1aXJlKCIuL2Rpc3BsYXkvc3ZnLmpzIik7CisKK2NvbnN0IHBkZmpzVmVyc2lvbiA9ICcyLjYuMzQ3JzsKK2NvbnN0IHBkZmpzQnVpbGQgPSAnM2JlOWM2NWYnOworeworICBjb25zdCB7CisgICAgaXNOb2RlSlMKKyAgfSA9IHJlcXVpcmUoIi4vc2hhcmVkL2lzX25vZGUuanMiKTsKKworICBpZiAoaXNOb2RlSlMpIHsKKyAgICBjb25zdCBQREZOb2RlU3RyZWFtID0gcmVxdWlyZSgiLi9kaXNwbGF5L25vZGVfc3RyZWFtLmpzIikuUERGTm9kZVN0cmVhbTsKKworICAgICgwLCBfYXBpLnNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KShwYXJhbXMgPT4geworICAgICAgcmV0dXJuIG5ldyBQREZOb2RlU3RyZWFtKHBhcmFtcyk7CisgICAgfSk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgUERGTmV0d29ya1N0cmVhbSA9IHJlcXVpcmUoIi4vZGlzcGxheS9uZXR3b3JrLmpzIikuUERGTmV0d29ya1N0cmVhbTsKKworICAgIGxldCBQREZGZXRjaFN0cmVhbTsKKworICAgIGlmICgoMCwgX2Rpc3BsYXlfdXRpbHMuaXNGZXRjaFN1cHBvcnRlZCkoKSkgeworICAgICAgUERGRmV0Y2hTdHJlYW0gPSByZXF1aXJlKCIuL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzIikuUERGRmV0Y2hTdHJlYW07CisgICAgfQorCisgICAgKDAsIF9hcGkuc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkpKHBhcmFtcyA9PiB7CisgICAgICBpZiAoUERGRmV0Y2hTdHJlYW0gJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkocGFyYW1zLnVybCkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQREZGZXRjaFN0cmVhbShwYXJhbXMpOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3IFBERk5ldHdvcmtTdHJlYW0ocGFyYW1zKTsKKyAgICB9KTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9wZGYud29ya2VyLmpzIGIvbGliL3BkZi53b3JrZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyMzdlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZGYud29ya2VyLmpzCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIldvcmtlck1lc3NhZ2VIYW5kbGVyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjsKKyAgfQorfSk7CisKK3ZhciBfd29ya2VyID0gcmVxdWlyZSgiLi9jb3JlL3dvcmtlci5qcyIpOworCitjb25zdCBwZGZqc1ZlcnNpb24gPSAnMi42LjM0Nyc7Citjb25zdCBwZGZqc0J1aWxkID0gJzNiZTljNjVmJzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvc2hhcmVkL2NvbXBhdGliaWxpdHkuanMgYi9saWIvc2hhcmVkL2NvbXBhdGliaWxpdHkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjYzYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zaGFyZWQvY29tcGF0aWJpbGl0eS5qcwpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfaXNfbm9kZSA9IHJlcXVpcmUoIi4vaXNfbm9kZS5qcyIpOworCis7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3NoYXJlZC9pc19ub2RlLmpzIGIvbGliL3NoYXJlZC9pc19ub2RlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzg0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc2hhcmVkL2lzX25vZGUuanMKQEAgLTAsMCArMSwyOSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuaXNOb2RlSlMgPSB2b2lkIDA7Citjb25zdCBpc05vZGVKUyA9IHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJiBwcm9jZXNzICsgIiIgPT09ICJbb2JqZWN0IHByb2Nlc3NdIiAmJiAhcHJvY2Vzcy52ZXJzaW9ucy5udyAmJiAhKHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gJiYgcHJvY2Vzcy50eXBlICYmIHByb2Nlc3MudHlwZSAhPT0gImJyb3dzZXIiKTsKK2V4cG9ydHMuaXNOb2RlSlMgPSBpc05vZGVKUzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qcyBiL2xpYi9zaGFyZWQvbWVzc2FnZV9oYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjUzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qcwpAQCAtMCwwICsxLDUxNiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuTWVzc2FnZUhhbmRsZXIgPSB2b2lkIDA7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4vdXRpbC5qcyIpOworCitjb25zdCBDYWxsYmFja0tpbmQgPSB7CisgIFVOS05PV046IDAsCisgIERBVEE6IDEsCisgIEVSUk9SOiAyCit9OworY29uc3QgU3RyZWFtS2luZCA9IHsKKyAgVU5LTk9XTjogMCwKKyAgQ0FOQ0VMOiAxLAorICBDQU5DRUxfQ09NUExFVEU6IDIsCisgIENMT1NFOiAzLAorICBFTlFVRVVFOiA0LAorICBFUlJPUjogNSwKKyAgUFVMTDogNiwKKyAgUFVMTF9DT01QTEVURTogNywKKyAgU1RBUlRfQ09NUExFVEU6IDgKK307CisKK2Z1bmN0aW9uIHdyYXBSZWFzb24ocmVhc29uKSB7CisgIGlmICh0eXBlb2YgcmVhc29uICE9PSAib2JqZWN0IiB8fCByZWFzb24gPT09IG51bGwpIHsKKyAgICByZXR1cm4gcmVhc29uOworICB9CisKKyAgc3dpdGNoIChyZWFzb24ubmFtZSkgeworICAgIGNhc2UgIkFib3J0RXhjZXB0aW9uIjoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpOworCisgICAgY2FzZSAiTWlzc2luZ1BERkV4Y2VwdGlvbiI6CisgICAgICByZXR1cm4gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpOworCisgICAgY2FzZSAiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uc3RhdHVzKTsKKworICAgIGNhc2UgIlVua25vd25FcnJvckV4Y2VwdGlvbiI6CisgICAgICByZXR1cm4gbmV3IF91dGlsLlVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmRldGFpbHMpOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24udG9TdHJpbmcoKSk7CisgIH0KK30KKworY2xhc3MgTWVzc2FnZUhhbmRsZXIgeworICBjb25zdHJ1Y3Rvcihzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBjb21PYmopIHsKKyAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lOworICAgIHRoaXMudGFyZ2V0TmFtZSA9IHRhcmdldE5hbWU7CisgICAgdGhpcy5jb21PYmogPSBjb21PYmo7CisgICAgdGhpcy5jYWxsYmFja0lkID0gMTsKKyAgICB0aGlzLnN0cmVhbUlkID0gMTsKKyAgICB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzID0gdHJ1ZTsKKyAgICB0aGlzLnN0cmVhbVNpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBldmVudCA9PiB7CisgICAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTsKKworICAgICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gdGhpcy5zb3VyY2VOYW1lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGRhdGEuc3RyZWFtKSB7CisgICAgICAgIHRoaXMuX3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKKyAgICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDsKKyAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07CisKKyAgICAgICAgaWYgKCFjYXBhYmlsaXR5KSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayAke2NhbGxiYWNrSWR9YCk7CisgICAgICAgIH0KKworICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKKworICAgICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHsKKyAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuRVJST1IpIHsKKyAgICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTsKKworICAgICAgaWYgKCFhY3Rpb24pIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTsKKyAgICAgIH0KKworICAgICAgaWYgKGRhdGEuY2FsbGJhY2tJZCkgeworICAgICAgICBjb25zdCBjYlNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CisgICAgICAgIGNvbnN0IGNiVGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTsKKyAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEpKTsKKyAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWU6IGNiVGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuREFUQSwKKyAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCwKKyAgICAgICAgICAgIGRhdGE6IHJlc3VsdAorICAgICAgICAgIH0pOworICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWU6IGNiVGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuRVJST1IsCisgICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsCisgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5zdHJlYW1JZCkgeworICAgICAgICB0aGlzLl9jcmVhdGVTdHJlYW1TaW5rKGRhdGEpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgYWN0aW9uKGRhdGEuZGF0YSk7CisgICAgfTsKKworICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpOworICB9CisKKyAgb24oYWN0aW9uTmFtZSwgaGFuZGxlcikgeworICAgIGNvbnN0IGFoID0gdGhpcy5hY3Rpb25IYW5kbGVyOworCisgICAgaWYgKGFoW2FjdGlvbk5hbWVdKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIiR7YWN0aW9uTmFtZX0iYCk7CisgICAgfQorCisgICAgYWhbYWN0aW9uTmFtZV0gPSBoYW5kbGVyOworICB9CisKKyAgc2VuZChhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHsKKyAgICB0aGlzLl9wb3N0TWVzc2FnZSh7CisgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsCisgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsCisgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCisgICAgICBkYXRhCisgICAgfSwgdHJhbnNmZXJzKTsKKyAgfQorCisgIHNlbmRXaXRoUHJvbWlzZShhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHsKKyAgICBjb25zdCBjYWxsYmFja0lkID0gdGhpcy5jYWxsYmFja0lkKys7CisgICAgY29uc3QgY2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdID0gY2FwYWJpbGl0eTsKKworICAgIHRyeSB7CisgICAgICB0aGlzLl9wb3N0TWVzc2FnZSh7CisgICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKKyAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAorICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCisgICAgICAgIGNhbGxiYWNrSWQsCisgICAgICAgIGRhdGEKKyAgICAgIH0sIHRyYW5zZmVycyk7CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGNhcGFiaWxpdHkucmVqZWN0KGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgc2VuZFdpdGhTdHJlYW0oYWN0aW9uTmFtZSwgZGF0YSwgcXVldWVpbmdTdHJhdGVneSwgdHJhbnNmZXJzKSB7CisgICAgY29uc3Qgc3RyZWFtSWQgPSB0aGlzLnN0cmVhbUlkKys7CisgICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTsKKyAgICBjb25zdCB0YXJnZXROYW1lID0gdGhpcy50YXJnZXROYW1lOworICAgIGNvbnN0IGNvbU9iaiA9IHRoaXMuY29tT2JqOworICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oeworICAgICAgc3RhcnQ6IGNvbnRyb2xsZXIgPT4geworICAgICAgICBjb25zdCBzdGFydENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdID0geworICAgICAgICAgIGNvbnRyb2xsZXIsCisgICAgICAgICAgc3RhcnRDYWxsOiBzdGFydENhcGFiaWxpdHksCisgICAgICAgICAgcHVsbENhbGw6IG51bGwsCisgICAgICAgICAgY2FuY2VsQ2FsbDogbnVsbCwKKyAgICAgICAgICBpc0Nsb3NlZDogZmFsc2UKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLl9wb3N0TWVzc2FnZSh7CisgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKKyAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICBkYXRhLAorICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplCisgICAgICAgIH0sIHRyYW5zZmVycyk7CisKKyAgICAgICAgcmV0dXJuIHN0YXJ0Q2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgfSwKKyAgICAgIHB1bGw6IGNvbnRyb2xsZXIgPT4geworICAgICAgICBjb25zdCBwdWxsQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwgPSBwdWxsQ2FwYWJpbGl0eTsKKyAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTEwsCisgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemUKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwdWxsQ2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgfSwKKyAgICAgIGNhbmNlbDogcmVhc29uID0+IHsKKyAgICAgICAgKDAsIF91dGlsLmFzc2VydCkocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsICJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CisgICAgICAgIGNvbnN0IGNhbmNlbENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5OworICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7CisgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsCisgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7CisgICAgICB9CisgICAgfSwgcXVldWVpbmdTdHJhdGVneSk7CisgIH0KKworICBfY3JlYXRlU3RyZWFtU2luayhkYXRhKSB7CisgICAgY29uc3Qgc2VsZiA9IHRoaXM7CisgICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTsKKyAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQ7CisgICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTsKKyAgICBjb25zdCB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lOworICAgIGNvbnN0IGNvbU9iaiA9IHRoaXMuY29tT2JqOworICAgIGNvbnN0IHN0cmVhbVNpbmsgPSB7CisgICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7CisgICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTsKKyAgICAgICAgdGhpcy5kZXNpcmVkU2l6ZSAtPSBzaXplOworCisgICAgICAgIGlmIChsYXN0RGVzaXJlZFNpemUgPiAwICYmIHRoaXMuZGVzaXJlZFNpemUgPD0gMCkgeworICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgICAgICAgdGhpcy5yZWFkeSA9IHRoaXMuc2lua0NhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYuX3Bvc3RNZXNzYWdlKHsKKyAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVOUVVFVUUsCisgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgY2h1bmsKKyAgICAgICAgfSwgdHJhbnNmZXJzKTsKKyAgICAgIH0sCisKKyAgICAgIGNsb3NlKCkgeworICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlOworICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsCisgICAgICAgICAgc3RyZWFtSWQKKyAgICAgICAgfSk7CisgICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKKyAgICAgIH0sCisKKyAgICAgIGVycm9yKHJlYXNvbikgeworICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgImVycm9yIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvbiIpOworCisgICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7CisgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FUlJPUiwKKyAgICAgICAgICBzdHJlYW1JZCwKKyAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQorICAgICAgICB9KTsKKyAgICAgIH0sCisKKyAgICAgIHNpbmtDYXBhYmlsaXR5OiAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCksCisgICAgICBvblB1bGw6IG51bGwsCisgICAgICBvbkNhbmNlbDogbnVsbCwKKyAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSwKKyAgICAgIGRlc2lyZWRTaXplOiBkYXRhLmRlc2lyZWRTaXplLAorICAgICAgcmVhZHk6IG51bGwKKyAgICB9OworICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgIHN0cmVhbVNpbmsucmVhZHkgPSBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7CisgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rOworICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEsIHN0cmVhbVNpbmspKTsKKyAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSwKKyAgICAgICAgc3RyZWFtSWQsCisgICAgICAgIHN1Y2Nlc3M6IHRydWUKKyAgICAgIH0pOworICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSwKKyAgICAgICAgc3RyZWFtSWQsCisgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorCisgIF9wcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7CisgICAgY29uc3Qgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkOworICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CisgICAgY29uc3QgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTsKKyAgICBjb25zdCBjb21PYmogPSB0aGlzLmNvbU9iajsKKworICAgIHN3aXRjaCAoZGF0YS5zdHJlYW0pIHsKKyAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURToKKyAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgeworICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnN0YXJ0Q2FsbC5yZXNvbHZlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEU6CisgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKKyAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbC5yZXNvbHZlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTDoKKyAgICAgICAgaWYgKCF0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSkgeworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAorICAgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgICBzdWNjZXNzOiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0uZGVzaXJlZFNpemUgPD0gMCAmJiBkYXRhLmRlc2lyZWRTaXplID4gMCkgeworICAgICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLmRlc2lyZWRTaXplID0gZGF0YS5kZXNpcmVkU2l6ZTsKKyAgICAgICAgY29uc3QgeworICAgICAgICAgIG9uUHVsbAorICAgICAgICB9ID0gdGhpcy5zdHJlYW1TaW5rc1tkYXRhLnN0cmVhbUlkXTsKKyAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgICAgICByZXNvbHZlKG9uUHVsbCAmJiBvblB1bGwoKSk7CisgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgICBzb3VyY2VOYW1lLAorICAgICAgICAgICAgdGFyZ2V0TmFtZSwKKyAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAorICAgICAgICAgICAgc3RyZWFtSWQsCisgICAgICAgICAgICBzdWNjZXNzOiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgc291cmNlTmFtZSwKKyAgICAgICAgICAgIHRhcmdldE5hbWUsCisgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKKyAgICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFN0cmVhbUtpbmQuRU5RVUVVRToKKyAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sICJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CisKKyAgICAgICAgaWYgKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jb250cm9sbGVyLmVucXVldWUoZGF0YS5jaHVuayk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0xPU0U6CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLCAiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTsKKworICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5jbG9zZSgpOworCisgICAgICAgIHRoaXMuX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpOworCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6CisgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLCAiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTsKKyAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY29udHJvbGxlci5lcnJvcih3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisKKyAgICAgICAgdGhpcy5fZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1JZCk7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEU6CisgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKKyAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsLnJlc29sdmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9kZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUlkKTsKKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTDoKKyAgICAgICAgaWYgKCF0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgeworICAgICAgICAgIG9uQ2FuY2VsCisgICAgICAgIH0gPSB0aGlzLnN0cmVhbVNpbmtzW2RhdGEuc3RyZWFtSWRdOworICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgICAgIHJlc29sdmUob25DYW5jZWwgJiYgb25DYW5jZWwod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpKTsKKyAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSwKKyAgICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQorICAgICAgICAgIH0pOworICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIHNvdXJjZU5hbWUsCisgICAgICAgICAgICB0YXJnZXROYW1lLAorICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSwKKyAgICAgICAgICAgIHN0cmVhbUlkLAorICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLnNpbmtDYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CisgICAgICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHN0cmVhbSBjYXNlIik7CisgICAgfQorICB9CisKKyAgYXN5bmMgX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtSWQpIHsKKyAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnN0YXJ0Q2FsbCwgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwsIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGxdLm1hcChmdW5jdGlvbiAoY2FwYWJpbGl0eSkgeworICAgICAgcmV0dXJuIGNhcGFiaWxpdHkgJiYgY2FwYWJpbGl0eS5wcm9taXNlOworICAgIH0pKTsKKyAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07CisgIH0KKworICBfcG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJzKSB7CisgICAgaWYgKHRyYW5zZmVycyAmJiB0aGlzLnBvc3RNZXNzYWdlVHJhbnNmZXJzKSB7CisgICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2ZlcnMpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZShtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICBkZXN0cm95KCkgeworICAgIHRoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7CisgIH0KKworfQorCitleHBvcnRzLk1lc3NhZ2VIYW5kbGVyID0gTWVzc2FnZUhhbmRsZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3NoYXJlZC91dGlsLmpzIGIvbGliL3NoYXJlZC91dGlsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzc2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc2hhcmVkL3V0aWwuanMKQEAgLTAsMCArMSw4NDYgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmFycmF5Qnl0ZUxlbmd0aCA9IGFycmF5Qnl0ZUxlbmd0aDsKK2V4cG9ydHMuYXJyYXlzVG9CeXRlcyA9IGFycmF5c1RvQnl0ZXM7CitleHBvcnRzLmFzc2VydCA9IGFzc2VydDsKK2V4cG9ydHMuYnl0ZXNUb1N0cmluZyA9IGJ5dGVzVG9TdHJpbmc7CitleHBvcnRzLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHk7CitleHBvcnRzLmVzY2FwZVN0cmluZyA9IGVzY2FwZVN0cmluZzsKK2V4cG9ydHMuZ2V0TW9kaWZpY2F0aW9uRGF0ZSA9IGdldE1vZGlmaWNhdGlvbkRhdGU7CitleHBvcnRzLmdldFZlcmJvc2l0eUxldmVsID0gZ2V0VmVyYm9zaXR5TGV2ZWw7CitleHBvcnRzLmluZm8gPSBpbmZvOworZXhwb3J0cy5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjsKK2V4cG9ydHMuaXNBcnJheUVxdWFsID0gaXNBcnJheUVxdWFsOworZXhwb3J0cy5pc0Jvb2wgPSBpc0Jvb2w7CitleHBvcnRzLmlzTnVtID0gaXNOdW07CitleHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7CitleHBvcnRzLmlzU2FtZU9yaWdpbiA9IGlzU2FtZU9yaWdpbjsKK2V4cG9ydHMuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCA9IGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw7CitleHBvcnRzLnJlbW92ZU51bGxDaGFyYWN0ZXJzID0gcmVtb3ZlTnVsbENoYXJhY3RlcnM7CitleHBvcnRzLnNldFZlcmJvc2l0eUxldmVsID0gc2V0VmVyYm9zaXR5TGV2ZWw7CitleHBvcnRzLnNoYWRvdyA9IHNoYWRvdzsKK2V4cG9ydHMuc3RyaW5nMzIgPSBzdHJpbmczMjsKK2V4cG9ydHMuc3RyaW5nVG9CeXRlcyA9IHN0cmluZ1RvQnl0ZXM7CitleHBvcnRzLnN0cmluZ1RvUERGU3RyaW5nID0gc3RyaW5nVG9QREZTdHJpbmc7CitleHBvcnRzLnN0cmluZ1RvVVRGOFN0cmluZyA9IHN0cmluZ1RvVVRGOFN0cmluZzsKK2V4cG9ydHMudXRmOFN0cmluZ1RvU3RyaW5nID0gdXRmOFN0cmluZ1RvU3RyaW5nOworZXhwb3J0cy53YXJuID0gd2FybjsKK2V4cG9ydHMudW5yZWFjaGFibGUgPSB1bnJlYWNoYWJsZTsKK2V4cG9ydHMuSXNFdmFsU3VwcG9ydGVkQ2FjaGVkID0gZXhwb3J0cy5Jc0xpdHRsZUVuZGlhbkNhY2hlZCA9IGV4cG9ydHMuY3JlYXRlT2JqZWN0VVJMID0gZXhwb3J0cy5Gb3JtYXRFcnJvciA9IGV4cG9ydHMuVXRpbCA9IGV4cG9ydHMuVW5rbm93bkVycm9yRXhjZXB0aW9uID0gZXhwb3J0cy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gZXhwb3J0cy5TdHJlYW1UeXBlID0gZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IGV4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBleHBvcnRzLlBhc3N3b3JkRXhjZXB0aW9uID0gZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gZXhwb3J0cy5JbnZhbGlkUERGRXhjZXB0aW9uID0gZXhwb3J0cy5BYm9ydEV4Y2VwdGlvbiA9IGV4cG9ydHMuQ01hcENvbXByZXNzaW9uVHlwZSA9IGV4cG9ydHMuSW1hZ2VLaW5kID0gZXhwb3J0cy5Gb250VHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblR5cGUgPSBleHBvcnRzLkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblJldmlld1N0YXRlID0gZXhwb3J0cy5Bbm5vdGF0aW9uUmVwbHlUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBleHBvcnRzLkFubm90YXRpb25GbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmllbGRGbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gZXhwb3J0cy5VTlNVUFBPUlRFRF9GRUFUVVJFUyA9IGV4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBleHBvcnRzLk9QUyA9IGV4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gZXhwb3J0cy5GT05UX0lERU5USVRZX01BVFJJWCA9IGV4cG9ydHMuQmFzZUV4Y2VwdGlvbiA9IHZvaWQgMDsKKworcmVxdWlyZSgiLi9jb21wYXRpYmlsaXR5LmpzIik7CisKK2NvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKK2V4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gSURFTlRJVFlfTUFUUklYOworY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTsKK2V4cG9ydHMuRk9OVF9JREVOVElUWV9NQVRSSVggPSBGT05UX0lERU5USVRZX01BVFJJWDsKK2NvbnN0IFBlcm1pc3Npb25GbGFnID0geworICBQUklOVDogMHgwNCwKKyAgTU9ESUZZX0NPTlRFTlRTOiAweDA4LAorICBDT1BZOiAweDEwLAorICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsCisgIEZJTExfSU5URVJBQ1RJVkVfRk9STVM6IDB4MTAwLAorICBDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOiAweDIwMCwKKyAgQVNTRU1CTEU6IDB4NDAwLAorICBQUklOVF9ISUdIX1FVQUxJVFk6IDB4ODAwCit9OworZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IFBlcm1pc3Npb25GbGFnOworY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7CisgIEZJTEw6IDAsCisgIFNUUk9LRTogMSwKKyAgRklMTF9TVFJPS0U6IDIsCisgIElOVklTSUJMRTogMywKKyAgRklMTF9BRERfVE9fUEFUSDogNCwKKyAgU1RST0tFX0FERF9UT19QQVRIOiA1LAorICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNiwKKyAgQUREX1RPX1BBVEg6IDcsCisgIEZJTExfU1RST0tFX01BU0s6IDMsCisgIEFERF9UT19QQVRIX0ZMQUc6IDQKK307CitleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGU7Citjb25zdCBJbWFnZUtpbmQgPSB7CisgIEdSQVlTQ0FMRV8xQlBQOiAxLAorICBSR0JfMjRCUFA6IDIsCisgIFJHQkFfMzJCUFA6IDMKK307CitleHBvcnRzLkltYWdlS2luZCA9IEltYWdlS2luZDsKK2NvbnN0IEFubm90YXRpb25UeXBlID0geworICBURVhUOiAxLAorICBMSU5LOiAyLAorICBGUkVFVEVYVDogMywKKyAgTElORTogNCwKKyAgU1FVQVJFOiA1LAorICBDSVJDTEU6IDYsCisgIFBPTFlHT046IDcsCisgIFBPTFlMSU5FOiA4LAorICBISUdITElHSFQ6IDksCisgIFVOREVSTElORTogMTAsCisgIFNRVUlHR0xZOiAxMSwKKyAgU1RSSUtFT1VUOiAxMiwKKyAgU1RBTVA6IDEzLAorICBDQVJFVDogMTQsCisgIElOSzogMTUsCisgIFBPUFVQOiAxNiwKKyAgRklMRUFUVEFDSE1FTlQ6IDE3LAorICBTT1VORDogMTgsCisgIE1PVklFOiAxOSwKKyAgV0lER0VUOiAyMCwKKyAgU0NSRUVOOiAyMSwKKyAgUFJJTlRFUk1BUks6IDIyLAorICBUUkFQTkVUOiAyMywKKyAgV0FURVJNQVJLOiAyNCwKKyAgVEhSRUVEOiAyNSwKKyAgUkVEQUNUOiAyNgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZTsKK2NvbnN0IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHsKKyAgTUFSS0VEOiAiTWFya2VkIiwKKyAgUkVWSUVXOiAiUmV2aWV3IgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0gQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlOworY29uc3QgQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0geworICBNQVJLRUQ6ICJNYXJrZWQiLAorICBVTk1BUktFRDogIlVubWFya2VkIgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0gQW5ub3RhdGlvbk1hcmtlZFN0YXRlOworY29uc3QgQW5ub3RhdGlvblJldmlld1N0YXRlID0geworICBBQ0NFUFRFRDogIkFjY2VwdGVkIiwKKyAgUkVKRUNURUQ6ICJSZWplY3RlZCIsCisgIENBTkNFTExFRDogIkNhbmNlbGxlZCIsCisgIENPTVBMRVRFRDogIkNvbXBsZXRlZCIsCisgIE5PTkU6ICJOb25lIgorfTsKK2V4cG9ydHMuQW5ub3RhdGlvblJldmlld1N0YXRlID0gQW5ub3RhdGlvblJldmlld1N0YXRlOworY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHsKKyAgR1JPVVA6ICJHcm91cCIsCisgIFJFUExZOiAiUiIKK307CitleHBvcnRzLkFubm90YXRpb25SZXBseVR5cGUgPSBBbm5vdGF0aW9uUmVwbHlUeXBlOworY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7CisgIElOVklTSUJMRTogMHgwMSwKKyAgSElEREVOOiAweDAyLAorICBQUklOVDogMHgwNCwKKyAgTk9aT09NOiAweDA4LAorICBOT1JPVEFURTogMHgxMCwKKyAgTk9WSUVXOiAweDIwLAorICBSRUFET05MWTogMHg0MCwKKyAgTE9DS0VEOiAweDgwLAorICBUT0dHTEVOT1ZJRVc6IDB4MTAwLAorICBMT0NLRURDT05URU5UUzogMHgyMDAKK307CitleHBvcnRzLkFubm90YXRpb25GbGFnID0gQW5ub3RhdGlvbkZsYWc7Citjb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0geworICBSRUFET05MWTogMHgwMDAwMDAxLAorICBSRVFVSVJFRDogMHgwMDAwMDAyLAorICBOT0VYUE9SVDogMHgwMDAwMDA0LAorICBNVUxUSUxJTkU6IDB4MDAwMTAwMCwKKyAgUEFTU1dPUkQ6IDB4MDAwMjAwMCwKKyAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLAorICBSQURJTzogMHgwMDA4MDAwLAorICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsCisgIENPTUJPOiAweDAwMjAwMDAsCisgIEVESVQ6IDB4MDA0MDAwMCwKKyAgU09SVDogMHgwMDgwMDAwLAorICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsCisgIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsCisgIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLAorICBET05PVFNDUk9MTDogMHgwODAwMDAwLAorICBDT01COiAweDEwMDAwMDAsCisgIFJJQ0hURVhUOiAweDIwMDAwMDAsCisgIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsCisgIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDAKK307CitleHBvcnRzLkFubm90YXRpb25GaWVsZEZsYWcgPSBBbm5vdGF0aW9uRmllbGRGbGFnOworY29uc3QgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IHsKKyAgU09MSUQ6IDEsCisgIERBU0hFRDogMiwKKyAgQkVWRUxFRDogMywKKyAgSU5TRVQ6IDQsCisgIFVOREVSTElORTogNQorfTsKK2V4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU7Citjb25zdCBTdHJlYW1UeXBlID0geworICBVTktOT1dOOiAiVU5LTk9XTiIsCisgIEZMQVRFOiAiRkxBVEUiLAorICBMWlc6ICJMWlciLAorICBEQ1Q6ICJEQ1QiLAorICBKUFg6ICJKUFgiLAorICBKQklHOiAiSkJJRyIsCisgIEE4NTogIkE4NSIsCisgIEFIWDogIkFIWCIsCisgIENDRjogIkNDRiIsCisgIFJMWDogIlJMWCIKK307CitleHBvcnRzLlN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOworY29uc3QgRm9udFR5cGUgPSB7CisgIFVOS05PV046ICJVTktOT1dOIiwKKyAgVFlQRTE6ICJUWVBFMSIsCisgIFRZUEUxQzogIlRZUEUxQyIsCisgIENJREZPTlRUWVBFMDogIkNJREZPTlRUWVBFMCIsCisgIENJREZPTlRUWVBFMEM6ICJDSURGT05UVFlQRTBDIiwKKyAgVFJVRVRZUEU6ICJUUlVFVFlQRSIsCisgIENJREZPTlRUWVBFMjogIkNJREZPTlRUWVBFMiIsCisgIFRZUEUzOiAiVFlQRTMiLAorICBPUEVOVFlQRTogIk9QRU5UWVBFIiwKKyAgVFlQRTA6ICJUWVBFMCIsCisgIE1NVFlQRTE6ICJNTVRZUEUxIgorfTsKK2V4cG9ydHMuRm9udFR5cGUgPSBGb250VHlwZTsKK2NvbnN0IFZlcmJvc2l0eUxldmVsID0geworICBFUlJPUlM6IDAsCisgIFdBUk5JTkdTOiAxLAorICBJTkZPUzogNQorfTsKK2V4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBWZXJib3NpdHlMZXZlbDsKK2NvbnN0IENNYXBDb21wcmVzc2lvblR5cGUgPSB7CisgIE5PTkU6IDAsCisgIEJJTkFSWTogMSwKKyAgU1RSRUFNOiAyCit9OworZXhwb3J0cy5DTWFwQ29tcHJlc3Npb25UeXBlID0gQ01hcENvbXByZXNzaW9uVHlwZTsKK2NvbnN0IE9QUyA9IHsKKyAgZGVwZW5kZW5jeTogMSwKKyAgc2V0TGluZVdpZHRoOiAyLAorICBzZXRMaW5lQ2FwOiAzLAorICBzZXRMaW5lSm9pbjogNCwKKyAgc2V0TWl0ZXJMaW1pdDogNSwKKyAgc2V0RGFzaDogNiwKKyAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LAorICBzZXRGbGF0bmVzczogOCwKKyAgc2V0R1N0YXRlOiA5LAorICBzYXZlOiAxMCwKKyAgcmVzdG9yZTogMTEsCisgIHRyYW5zZm9ybTogMTIsCisgIG1vdmVUbzogMTMsCisgIGxpbmVUbzogMTQsCisgIGN1cnZlVG86IDE1LAorICBjdXJ2ZVRvMjogMTYsCisgIGN1cnZlVG8zOiAxNywKKyAgY2xvc2VQYXRoOiAxOCwKKyAgcmVjdGFuZ2xlOiAxOSwKKyAgc3Ryb2tlOiAyMCwKKyAgY2xvc2VTdHJva2U6IDIxLAorICBmaWxsOiAyMiwKKyAgZW9GaWxsOiAyMywKKyAgZmlsbFN0cm9rZTogMjQsCisgIGVvRmlsbFN0cm9rZTogMjUsCisgIGNsb3NlRmlsbFN0cm9rZTogMjYsCisgIGNsb3NlRU9GaWxsU3Ryb2tlOiAyNywKKyAgZW5kUGF0aDogMjgsCisgIGNsaXA6IDI5LAorICBlb0NsaXA6IDMwLAorICBiZWdpblRleHQ6IDMxLAorICBlbmRUZXh0OiAzMiwKKyAgc2V0Q2hhclNwYWNpbmc6IDMzLAorICBzZXRXb3JkU3BhY2luZzogMzQsCisgIHNldEhTY2FsZTogMzUsCisgIHNldExlYWRpbmc6IDM2LAorICBzZXRGb250OiAzNywKKyAgc2V0VGV4dFJlbmRlcmluZ01vZGU6IDM4LAorICBzZXRUZXh0UmlzZTogMzksCisgIG1vdmVUZXh0OiA0MCwKKyAgc2V0TGVhZGluZ01vdmVUZXh0OiA0MSwKKyAgc2V0VGV4dE1hdHJpeDogNDIsCisgIG5leHRMaW5lOiA0MywKKyAgc2hvd1RleHQ6IDQ0LAorICBzaG93U3BhY2VkVGV4dDogNDUsCisgIG5leHRMaW5lU2hvd1RleHQ6IDQ2LAorICBuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDogNDcsCisgIHNldENoYXJXaWR0aDogNDgsCisgIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksCisgIHNldFN0cm9rZUNvbG9yU3BhY2U6IDUwLAorICBzZXRGaWxsQ29sb3JTcGFjZTogNTEsCisgIHNldFN0cm9rZUNvbG9yOiA1MiwKKyAgc2V0U3Ryb2tlQ29sb3JOOiA1MywKKyAgc2V0RmlsbENvbG9yOiA1NCwKKyAgc2V0RmlsbENvbG9yTjogNTUsCisgIHNldFN0cm9rZUdyYXk6IDU2LAorICBzZXRGaWxsR3JheTogNTcsCisgIHNldFN0cm9rZVJHQkNvbG9yOiA1OCwKKyAgc2V0RmlsbFJHQkNvbG9yOiA1OSwKKyAgc2V0U3Ryb2tlQ01ZS0NvbG9yOiA2MCwKKyAgc2V0RmlsbENNWUtDb2xvcjogNjEsCisgIHNoYWRpbmdGaWxsOiA2MiwKKyAgYmVnaW5JbmxpbmVJbWFnZTogNjMsCisgIGJlZ2luSW1hZ2VEYXRhOiA2NCwKKyAgZW5kSW5saW5lSW1hZ2U6IDY1LAorICBwYWludFhPYmplY3Q6IDY2LAorICBtYXJrUG9pbnQ6IDY3LAorICBtYXJrUG9pbnRQcm9wczogNjgsCisgIGJlZ2luTWFya2VkQ29udGVudDogNjksCisgIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCwKKyAgZW5kTWFya2VkQ29udGVudDogNzEsCisgIGJlZ2luQ29tcGF0OiA3MiwKKyAgZW5kQ29tcGF0OiA3MywKKyAgcGFpbnRGb3JtWE9iamVjdEJlZ2luOiA3NCwKKyAgcGFpbnRGb3JtWE9iamVjdEVuZDogNzUsCisgIGJlZ2luR3JvdXA6IDc2LAorICBlbmRHcm91cDogNzcsCisgIGJlZ2luQW5ub3RhdGlvbnM6IDc4LAorICBlbmRBbm5vdGF0aW9uczogNzksCisgIGJlZ2luQW5ub3RhdGlvbjogODAsCisgIGVuZEFubm90YXRpb246IDgxLAorICBwYWludEpwZWdYT2JqZWN0OiA4MiwKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiA4MywKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LAorICBwYWludEltYWdlWE9iamVjdDogODUsCisgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiA4NiwKKyAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsCisgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiA4OCwKKyAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0OiA4OSwKKyAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCwKKyAgY29uc3RydWN0UGF0aDogOTEKK307CitleHBvcnRzLk9QUyA9IE9QUzsKK2NvbnN0IFVOU1VQUE9SVEVEX0ZFQVRVUkVTID0geworICB1bmtub3duOiAidW5rbm93biIsCisgIGZvcm1zOiAiZm9ybXMiLAorICBqYXZhU2NyaXB0OiAiamF2YVNjcmlwdCIsCisgIHNtYXNrOiAic21hc2siLAorICBzaGFkaW5nUGF0dGVybjogInNoYWRpbmdQYXR0ZXJuIiwKKyAgZm9udDogImZvbnQiLAorICBlcnJvclRpbGluZ1BhdHRlcm46ICJlcnJvclRpbGluZ1BhdHRlcm4iLAorICBlcnJvckV4dEdTdGF0ZTogImVycm9yRXh0R1N0YXRlIiwKKyAgZXJyb3JYT2JqZWN0OiAiZXJyb3JYT2JqZWN0IiwKKyAgZXJyb3JGb250TG9hZFR5cGUzOiAiZXJyb3JGb250TG9hZFR5cGUzIiwKKyAgZXJyb3JGb250U3RhdGU6ICJlcnJvckZvbnRTdGF0ZSIsCisgIGVycm9yRm9udE1pc3Npbmc6ICJlcnJvckZvbnRNaXNzaW5nIiwKKyAgZXJyb3JGb250VHJhbnNsYXRlOiAiZXJyb3JGb250VHJhbnNsYXRlIiwKKyAgZXJyb3JDb2xvclNwYWNlOiAiZXJyb3JDb2xvclNwYWNlIiwKKyAgZXJyb3JPcGVyYXRvckxpc3Q6ICJlcnJvck9wZXJhdG9yTGlzdCIsCisgIGVycm9yRm9udFRvVW5pY29kZTogImVycm9yRm9udFRvVW5pY29kZSIsCisgIGVycm9yRm9udExvYWROYXRpdmU6ICJlcnJvckZvbnRMb2FkTmF0aXZlIiwKKyAgZXJyb3JGb250R2V0UGF0aDogImVycm9yRm9udEdldFBhdGgiLAorICBlcnJvck1hcmtlZENvbnRlbnQ6ICJlcnJvck1hcmtlZENvbnRlbnQiCit9OworZXhwb3J0cy5VTlNVUFBPUlRFRF9GRUFUVVJFUyA9IFVOU1VQUE9SVEVEX0ZFQVRVUkVTOworY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7CisgIE5FRURfUEFTU1dPUkQ6IDEsCisgIElOQ09SUkVDVF9QQVNTV09SRDogMgorfTsKK2V4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBQYXNzd29yZFJlc3BvbnNlczsKK2xldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUzsKKworZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHsKKyAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7CisgICAgdmVyYm9zaXR5ID0gbGV2ZWw7CisgIH0KK30KKworZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7CisgIHJldHVybiB2ZXJib3NpdHk7Cit9CisKK2Z1bmN0aW9uIGluZm8obXNnKSB7CisgIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MpIHsKKyAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7CisgIH0KK30KKworZnVuY3Rpb24gd2Fybihtc2cpIHsKKyAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykgeworICAgIGNvbnNvbGUubG9nKGBXYXJuaW5nOiAke21zZ31gKTsKKyAgfQorfQorCitmdW5jdGlvbiB1bnJlYWNoYWJsZShtc2cpIHsKKyAgdGhyb3cgbmV3IEVycm9yKG1zZyk7Cit9CisKK2Z1bmN0aW9uIGFzc2VydChjb25kLCBtc2cpIHsKKyAgaWYgKCFjb25kKSB7CisgICAgdW5yZWFjaGFibGUobXNnKTsKKyAgfQorfQorCitmdW5jdGlvbiBpc1NhbWVPcmlnaW4oYmFzZVVybCwgb3RoZXJVcmwpIHsKKyAgbGV0IGJhc2U7CisKKyAgdHJ5IHsKKyAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTsKKworICAgIGlmICghYmFzZS5vcmlnaW4gfHwgYmFzZS5vcmlnaW4gPT09ICJudWxsIikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBjYXRjaCAoZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IG90aGVyID0gbmV3IFVSTChvdGhlclVybCwgYmFzZSk7CisgIHJldHVybiBiYXNlLm9yaWdpbiA9PT0gb3RoZXIub3JpZ2luOworfQorCitmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkgeworICBpZiAoIXVybCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN3aXRjaCAodXJsLnByb3RvY29sKSB7CisgICAgY2FzZSAiaHR0cDoiOgorICAgIGNhc2UgImh0dHBzOiI6CisgICAgY2FzZSAiZnRwOiI6CisgICAgY2FzZSAibWFpbHRvOiI6CisgICAgY2FzZSAidGVsOiI6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwpIHsKKyAgaWYgKCF1cmwpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHRyeSB7CisgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpOworCisgICAgaWYgKF9pc1ZhbGlkUHJvdG9jb2woYWJzb2x1dGVVcmwpKSB7CisgICAgICByZXR1cm4gYWJzb2x1dGVVcmw7CisgICAgfQorICB9IGNhdGNoIChleCkge30KKworICByZXR1cm4gbnVsbDsKK30KKworZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUpIHsKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgeworICAgIHZhbHVlLAorICAgIGVudW1lcmFibGU6IHRydWUsCisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIHdyaXRhYmxlOiBmYWxzZQorICB9KTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitjb25zdCBCYXNlRXhjZXB0aW9uID0gZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKSB7CisgIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSkgeworICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7CisgICAgICB1bnJlYWNoYWJsZSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi4iKTsKKyAgICB9CisKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgfQorCisgIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7CisgIEJhc2VFeGNlcHRpb24uY29uc3RydWN0b3IgPSBCYXNlRXhjZXB0aW9uOworICByZXR1cm4gQmFzZUV4Y2VwdGlvbjsKK30oKTsKKworZXhwb3J0cy5CYXNlRXhjZXB0aW9uID0gQmFzZUV4Y2VwdGlvbjsKKworY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnLCBjb2RlKSB7CisgICAgc3VwZXIobXNnKTsKKyAgICB0aGlzLmNvZGUgPSBjb2RlOworICB9CisKK30KKworZXhwb3J0cy5QYXNzd29yZEV4Y2VwdGlvbiA9IFBhc3N3b3JkRXhjZXB0aW9uOworCitjbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKKyAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7CisgICAgc3VwZXIobXNnKTsKKyAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzOworICB9CisKK30KKworZXhwb3J0cy5Vbmtub3duRXJyb3JFeGNlcHRpb24gPSBVbmtub3duRXJyb3JFeGNlcHRpb247CisKK2NsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IEludmFsaWRQREZFeGNlcHRpb247CisKK2NsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IE1pc3NpbmdQREZFeGNlcHRpb247CisKK2NsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24geworICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykgeworICAgIHN1cGVyKG1zZyk7CisgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgIH0KKworfQorCitleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjsKKworY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuRm9ybWF0RXJyb3IgPSBGb3JtYXRFcnJvcjsKKworY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHt9CisKK2V4cG9ydHMuQWJvcnRFeGNlcHRpb24gPSBBYm9ydEV4Y2VwdGlvbjsKK2NvbnN0IE51bGxDaGFyYWN0ZXJzUmVnRXhwID0gL1x4MDAvZzsKKworZnVuY3Rpb24gcmVtb3ZlTnVsbENoYXJhY3RlcnMoc3RyKSB7CisgIGlmICh0eXBlb2Ygc3RyICE9PSAic3RyaW5nIikgeworICAgIHdhcm4oIlRoZSBhcmd1bWVudCBmb3IgcmVtb3ZlTnVsbENoYXJhY3RlcnMgbXVzdCBiZSBhIHN0cmluZy4iKTsKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgcmV0dXJuIHN0ci5yZXBsYWNlKE51bGxDaGFyYWN0ZXJzUmVnRXhwLCAiIik7Cit9CisKK2Z1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHsKKyAgYXNzZXJ0KGJ5dGVzICE9PSBudWxsICYmIHR5cGVvZiBieXRlcyA9PT0gIm9iamVjdCIgJiYgYnl0ZXMubGVuZ3RoICE9PSB1bmRlZmluZWQsICJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7CisgIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgY29uc3QgTUFYX0FSR1VNRU5UX0NPVU5UID0gODE5MjsKKworICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7CisgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpOworICB9CisKKyAgY29uc3Qgc3RyQnVmID0gW107CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7CisgICAgY29uc3QgY2h1bmtFbmQgPSBNYXRoLm1pbihpICsgTUFYX0FSR1VNRU5UX0NPVU5ULCBsZW5ndGgpOworICAgIGNvbnN0IGNodW5rID0gYnl0ZXMuc3ViYXJyYXkoaSwgY2h1bmtFbmQpOworICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKKyAgfQorCisgIHJldHVybiBzdHJCdWYuam9pbigiIik7Cit9CisKK2Z1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7CisgIGFzc2VydCh0eXBlb2Ygc3RyID09PSAic3RyaW5nIiwgIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTsKKyAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDsKKyAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOworCisgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBieXRlc1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZjsKKyAgfQorCisgIHJldHVybiBieXRlczsKK30KKworZnVuY3Rpb24gYXJyYXlCeXRlTGVuZ3RoKGFycikgeworICBpZiAoYXJyLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJuIGFyci5sZW5ndGg7CisgIH0KKworICBhc3NlcnQoYXJyLmJ5dGVMZW5ndGggIT09IHVuZGVmaW5lZCwgImFycmF5Qnl0ZUxlbmd0aCAtIGludmFsaWQgYXJndW1lbnQuIik7CisgIHJldHVybiBhcnIuYnl0ZUxlbmd0aDsKK30KKworZnVuY3Rpb24gYXJyYXlzVG9CeXRlcyhhcnIpIHsKKyAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDsKKworICBpZiAobGVuZ3RoID09PSAxICYmIGFyclswXSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKKyAgICByZXR1cm4gYXJyWzBdOworICB9CisKKyAgbGV0IHJlc3VsdExlbmd0aCA9IDA7CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgIHJlc3VsdExlbmd0aCArPSBhcnJheUJ5dGVMZW5ndGgoYXJyW2ldKTsKKyAgfQorCisgIGxldCBwb3MgPSAwOworICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0TGVuZ3RoKTsKKworICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgbGV0IGl0ZW0gPSBhcnJbaV07CisKKyAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHsKKyAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gInN0cmluZyIpIHsKKyAgICAgICAgaXRlbSA9IHN0cmluZ1RvQnl0ZXMoaXRlbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpdGVtID0gbmV3IFVpbnQ4QXJyYXkoaXRlbSk7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgaXRlbUxlbmd0aCA9IGl0ZW0uYnl0ZUxlbmd0aDsKKyAgICBkYXRhLnNldChpdGVtLCBwb3MpOworICAgIHBvcyArPSBpdGVtTGVuZ3RoOworICB9CisKKyAgcmV0dXJuIGRhdGE7Cit9CisKK2Z1bmN0aW9uIHN0cmluZzMyKHZhbHVlKSB7CisgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKK30KKworZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7CisgIGNvbnN0IGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTsKKyAgYnVmZmVyOFswXSA9IDE7CisgIGNvbnN0IHZpZXczMiA9IG5ldyBVaW50MzJBcnJheShidWZmZXI4LmJ1ZmZlciwgMCwgMSk7CisgIHJldHVybiB2aWV3MzJbMF0gPT09IDE7Cit9CisKK2NvbnN0IElzTGl0dGxlRW5kaWFuQ2FjaGVkID0geworICBnZXQgdmFsdWUoKSB7CisgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmFsdWUiLCBpc0xpdHRsZUVuZGlhbigpKTsKKyAgfQorCit9OworZXhwb3J0cy5Jc0xpdHRsZUVuZGlhbkNhY2hlZCA9IElzTGl0dGxlRW5kaWFuQ2FjaGVkOworCitmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7CisgIHRyeSB7CisgICAgbmV3IEZ1bmN0aW9uKCIiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitjb25zdCBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSB7CisgIGdldCB2YWx1ZSgpIHsKKyAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2YWx1ZSIsIGlzRXZhbFN1cHBvcnRlZCgpKTsKKyAgfQorCit9OworZXhwb3J0cy5Jc0V2YWxTdXBwb3J0ZWRDYWNoZWQgPSBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQ7Citjb25zdCByZ2JCdWYgPSBbInJnYigiLCAwLCAiLCIsIDAsICIsIiwgMCwgIikiXTsKKworY2xhc3MgVXRpbCB7CisgIHN0YXRpYyBtYWtlQ3NzUmdiKHIsIGcsIGIpIHsKKyAgICByZ2JCdWZbMV0gPSByOworICAgIHJnYkJ1ZlszXSA9IGc7CisgICAgcmdiQnVmWzVdID0gYjsKKyAgICByZXR1cm4gcmdiQnVmLmpvaW4oIiIpOworICB9CisKKyAgc3RhdGljIHRyYW5zZm9ybShtMSwgbTIpIHsKKyAgICByZXR1cm4gW20xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLCBtMVsxXSAqIG0yWzBdICsgbTFbM10gKiBtMlsxXSwgbTFbMF0gKiBtMlsyXSArIG0xWzJdICogbTJbM10sIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLCBtMVswXSAqIG0yWzRdICsgbTFbMl0gKiBtMls1XSArIG0xWzRdLCBtMVsxXSAqIG0yWzRdICsgbTFbM10gKiBtMls1XSArIG0xWzVdXTsKKyAgfQorCisgIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7CisgICAgY29uc3QgeHQgPSBwWzBdICogbVswXSArIHBbMV0gKiBtWzJdICsgbVs0XTsKKyAgICBjb25zdCB5dCA9IHBbMF0gKiBtWzFdICsgcFsxXSAqIG1bM10gKyBtWzVdOworICAgIHJldHVybiBbeHQsIHl0XTsKKyAgfQorCisgIHN0YXRpYyBhcHBseUludmVyc2VUcmFuc2Zvcm0ocCwgbSkgeworICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOworICAgIGNvbnN0IHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7CisgICAgY29uc3QgeXQgPSAoLXBbMF0gKiBtWzFdICsgcFsxXSAqIG1bMF0gKyBtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQ7CisgICAgcmV0dXJuIFt4dCwgeXRdOworICB9CisKKyAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHsKKyAgICBjb25zdCBwMSA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0ociwgbSk7CisgICAgY29uc3QgcDIgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHIuc2xpY2UoMiwgNCksIG0pOworICAgIGNvbnN0IHAzID0gVXRpbC5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pOworICAgIGNvbnN0IHA0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbclsyXSwgclsxXV0sIG0pOworICAgIHJldHVybiBbTWF0aC5taW4ocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1pbihwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5tYXgocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pXTsKKyAgfQorCisgIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHsKKyAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTsKKyAgICByZXR1cm4gW21bM10gLyBkLCAtbVsxXSAvIGQsIC1tWzJdIC8gZCwgbVswXSAvIGQsIChtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQsIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGRdOworICB9CisKKyAgc3RhdGljIGFwcGx5M2RUcmFuc2Zvcm0obSwgdikgeworICAgIHJldHVybiBbbVswXSAqIHZbMF0gKyBtWzFdICogdlsxXSArIG1bMl0gKiB2WzJdLCBtWzNdICogdlswXSArIG1bNF0gKiB2WzFdICsgbVs1XSAqIHZbMl0sIG1bNl0gKiB2WzBdICsgbVs3XSAqIHZbMV0gKyBtWzhdICogdlsyXV07CisgIH0KKworICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkgeworICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTsKKyAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07CisgICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdOworICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTsKKyAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107CisgICAgY29uc3QgZmlyc3QgPSAoYSArIGQpIC8gMjsKKyAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqIChhICsgZCkgLSA0ICogKGEgKiBkIC0gYyAqIGIpKSAvIDI7CisgICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxOworICAgIGNvbnN0IHN5ID0gZmlyc3QgLSBzZWNvbmQgfHwgMTsKKyAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldOworICB9CisKKyAgc3RhdGljIG5vcm1hbGl6ZVJlY3QocmVjdCkgeworICAgIGNvbnN0IHIgPSByZWN0LnNsaWNlKDApOworCisgICAgaWYgKHJlY3RbMF0gPiByZWN0WzJdKSB7CisgICAgICByWzBdID0gcmVjdFsyXTsKKyAgICAgIHJbMl0gPSByZWN0WzBdOworICAgIH0KKworICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkgeworICAgICAgclsxXSA9IHJlY3RbM107CisgICAgICByWzNdID0gcmVjdFsxXTsKKyAgICB9CisKKyAgICByZXR1cm4gcjsKKyAgfQorCisgIHN0YXRpYyBpbnRlcnNlY3QocmVjdDEsIHJlY3QyKSB7CisgICAgZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7CisgICAgICByZXR1cm4gYSAtIGI7CisgICAgfQorCisgICAgY29uc3Qgb3JkZXJlZFggPSBbcmVjdDFbMF0sIHJlY3QxWzJdLCByZWN0MlswXSwgcmVjdDJbMl1dLnNvcnQoY29tcGFyZSk7CisgICAgY29uc3Qgb3JkZXJlZFkgPSBbcmVjdDFbMV0sIHJlY3QxWzNdLCByZWN0MlsxXSwgcmVjdDJbM11dLnNvcnQoY29tcGFyZSk7CisgICAgY29uc3QgcmVzdWx0ID0gW107CisgICAgcmVjdDEgPSBVdGlsLm5vcm1hbGl6ZVJlY3QocmVjdDEpOworICAgIHJlY3QyID0gVXRpbC5ub3JtYWxpemVSZWN0KHJlY3QyKTsKKworICAgIGlmIChvcmRlcmVkWFswXSA9PT0gcmVjdDFbMF0gJiYgb3JkZXJlZFhbMV0gPT09IHJlY3QyWzBdIHx8IG9yZGVyZWRYWzBdID09PSByZWN0MlswXSAmJiBvcmRlcmVkWFsxXSA9PT0gcmVjdDFbMF0pIHsKKyAgICAgIHJlc3VsdFswXSA9IG9yZGVyZWRYWzFdOworICAgICAgcmVzdWx0WzJdID0gb3JkZXJlZFhbMl07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGlmIChvcmRlcmVkWVswXSA9PT0gcmVjdDFbMV0gJiYgb3JkZXJlZFlbMV0gPT09IHJlY3QyWzFdIHx8IG9yZGVyZWRZWzBdID09PSByZWN0MlsxXSAmJiBvcmRlcmVkWVsxXSA9PT0gcmVjdDFbMV0pIHsKKyAgICAgIHJlc3VsdFsxXSA9IG9yZGVyZWRZWzFdOworICAgICAgcmVzdWx0WzNdID0gb3JkZXJlZFlbMl07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworfQorCitleHBvcnRzLlV0aWwgPSBVdGlsOworY29uc3QgUERGU3RyaW5nVHJhbnNsYXRlVGFibGUgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyRDgsIDB4MkM3LCAweDJDNiwgMHgyRDksIDB4MkRELCAweDJEQiwgMHgyREEsIDB4MkRDLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDIwMjIsIDB4MjAyMCwgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDE5MiwgMHgyMDQ0LCAweDIwMzksIDB4MjAzQSwgMHgyMjEyLCAweDIwMzAsIDB4MjAxRSwgMHgyMDFDLCAweDIwMUQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUEsIDB4MjEyMiwgMHhGQjAxLCAweEZCMDIsIDB4MTQxLCAweDE1MiwgMHgxNjAsIDB4MTc4LCAweDE3RCwgMHgxMzEsIDB4MTQyLCAweDE1MywgMHgxNjEsIDB4MTdFLCAwLCAweDIwQUNdOworCitmdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhzdHIpIHsKKyAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aCwKKyAgICAgICAgc3RyQnVmID0gW107CisKKyAgaWYgKHN0clswXSA9PT0gIlx4RkUiICYmIHN0clsxXSA9PT0gIlx4RkYiKSB7CisgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikgeworICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShzdHIuY2hhckNvZGVBdChpKSA8PCA4IHwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0clswXSA9PT0gIlx4RkYiICYmIHN0clsxXSA9PT0gIlx4RkUiKSB7CisgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW5ndGg7IGkgKz0gMikgeworICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShzdHIuY2hhckNvZGVBdChpICsgMSkgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkpKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChpKV07CisgICAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHJCdWYuam9pbigiIik7Cit9CisKK2Z1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHsKKyAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW1woXClcXF0pL2csICJcXCQxIik7Cit9CisKK2Z1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhzdHIpIHsKKyAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7Cit9CisKK2Z1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhzdHIpIHsKKyAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsKK30KKworZnVuY3Rpb24gaXNCb29sKHYpIHsKKyAgcmV0dXJuIHR5cGVvZiB2ID09PSAiYm9vbGVhbiI7Cit9CisKK2Z1bmN0aW9uIGlzTnVtKHYpIHsKKyAgcmV0dXJuIHR5cGVvZiB2ID09PSAibnVtYmVyIjsKK30KKworZnVuY3Rpb24gaXNTdHJpbmcodikgeworICByZXR1cm4gdHlwZW9mIHYgPT09ICJzdHJpbmciOworfQorCitmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHYpIHsKKyAgcmV0dXJuIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9PSBudWxsICYmIHYuYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkOworfQorCitmdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikgeworICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIGFycjEuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7CisgICAgcmV0dXJuIGVsZW1lbnQgPT09IGFycjJbaW5kZXhdOworICB9KTsKK30KKworZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZShkYXRlID0gbmV3IERhdGUoRGF0ZS5ub3coKSkpIHsKKyAgY29uc3QgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCAoZGF0ZS5nZXRVVENEYXRlKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpXTsKKyAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKK30KKworZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKSB7CisgIGNvbnN0IGNhcGFiaWxpdHkgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICBsZXQgaXNTZXR0bGVkID0gZmFsc2U7CisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYXBhYmlsaXR5LCAic2V0dGxlZCIsIHsKKyAgICBnZXQoKSB7CisgICAgICByZXR1cm4gaXNTZXR0bGVkOworICAgIH0KKworICB9KTsKKyAgY2FwYWJpbGl0eS5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgIGNhcGFiaWxpdHkucmVzb2x2ZSA9IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICBpc1NldHRsZWQgPSB0cnVlOworICAgICAgcmVzb2x2ZShkYXRhKTsKKyAgICB9OworCisgICAgY2FwYWJpbGl0eS5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBpc1NldHRsZWQgPSB0cnVlOworICAgICAgcmVqZWN0KHJlYXNvbik7CisgICAgfTsKKyAgfSk7CisgIHJldHVybiBjYXBhYmlsaXR5OworfQorCitjb25zdCBjcmVhdGVPYmplY3RVUkwgPSBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkxDbG9zdXJlKCkgeworICBjb25zdCBkaWdpdHMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iOworICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGRhdGEsIGNvbnRlbnRUeXBlLCBmb3JjZURhdGFTY2hlbWEgPSBmYWxzZSkgeworICAgIGlmICghZm9yY2VEYXRhU2NoZW1hICYmIFVSTC5jcmVhdGVPYmplY3RVUkwpIHsKKyAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsKKyAgICAgICAgdHlwZTogY29udGVudFR5cGUKKyAgICAgIH0pOworICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CisgICAgfQorCisgICAgbGV0IGJ1ZmZlciA9IGBkYXRhOiR7Y29udGVudFR5cGV9O2Jhc2U2NCxgOworCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7CisgICAgICBjb25zdCBiMSA9IGRhdGFbaV0gJiAweGZmOworICAgICAgY29uc3QgYjIgPSBkYXRhW2kgKyAxXSAmIDB4ZmY7CisgICAgICBjb25zdCBiMyA9IGRhdGFbaSArIDJdICYgMHhmZjsKKyAgICAgIGNvbnN0IGQxID0gYjEgPj4gMiwKKyAgICAgICAgICAgIGQyID0gKGIxICYgMykgPDwgNCB8IGIyID4+IDQ7CisgICAgICBjb25zdCBkMyA9IGkgKyAxIDwgaWkgPyAoYjIgJiAweGYpIDw8IDIgfCBiMyA+PiA2IDogNjQ7CisgICAgICBjb25zdCBkNCA9IGkgKyAyIDwgaWkgPyBiMyAmIDB4M2YgOiA2NDsKKyAgICAgIGJ1ZmZlciArPSBkaWdpdHNbZDFdICsgZGlnaXRzW2QyXSArIGRpZ2l0c1tkM10gKyBkaWdpdHNbZDRdOworICAgIH0KKworICAgIHJldHVybiBidWZmZXI7CisgIH07Cit9KCk7CisKK2V4cG9ydHMuY3JlYXRlT2JqZWN0VVJMID0gY3JlYXRlT2JqZWN0VVJMOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvYW5ub3RhdGlvbl9zcGVjLmpzIGIvbGliL3Rlc3QvdW5pdC9hbm5vdGF0aW9uX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5MGI4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvYW5ub3RhdGlvbl9zcGVjLmpzCkBAIC0wLDAgKzEsMjcwOCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX2Fubm90YXRpb24gPSByZXF1aXJlKCIuLi8uLi9jb3JlL2Fubm90YXRpb24uanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF90ZXN0X3V0aWxzID0gcmVxdWlyZSgiLi90ZXN0X3V0aWxzLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX3BhcnNlciA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvcGFyc2VyLmpzIik7CisKK3ZhciBfZXZhbHVhdG9yID0gcmVxdWlyZSgiLi4vLi4vY29yZS9ldmFsdWF0b3IuanMiKTsKKwordmFyIF9zdHJlYW0gPSByZXF1aXJlKCIuLi8uLi9jb3JlL3N0cmVhbS5qcyIpOworCit2YXIgX3dvcmtlciA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvd29ya2VyLmpzIik7CisKK2Rlc2NyaWJlKCJhbm5vdGF0aW9uIiwgZnVuY3Rpb24gKCkgeworICBjbGFzcyBQREZNYW5hZ2VyTW9jayB7CisgICAgY29uc3RydWN0b3IocGFyYW1zKSB7CisgICAgICB0aGlzLmRvY0Jhc2VVcmwgPSBwYXJhbXMuZG9jQmFzZVVybCB8fCBudWxsOworICAgICAgdGhpcy5wZGZEb2N1bWVudCA9IHsKKyAgICAgICAgY2F0YWxvZzogeworICAgICAgICAgIGFjcm9Gb3JtOiBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpCisgICAgICAgIH0KKyAgICAgIH07CisgICAgfQorCisgICAgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgeworICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW3Byb3BdOworCisgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgICByZXNvbHZlKHZhbHVlLmFwcGx5KG9iaiwgYXJncykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc29sdmUodmFsdWUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisKKyAgICBlbnN1cmVDYXRhbG9nKHByb3AsIGFyZ3MpIHsKKyAgICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LmNhdGFsb2csIHByb3AsIGFyZ3MpOworICAgIH0KKworICB9CisKKyAgZnVuY3Rpb24gSGFuZGxlck1vY2soKSB7CisgICAgdGhpcy5pbnB1dHMgPSBbXTsKKyAgfQorCisgIEhhbmRsZXJNb2NrLnByb3RvdHlwZSA9IHsKKyAgICBzZW5kKG5hbWUsIGRhdGEpIHsKKyAgICAgIHRoaXMuaW5wdXRzLnB1c2goeworICAgICAgICBuYW1lLAorICAgICAgICBkYXRhCisgICAgICB9KTsKKyAgICB9CisKKyAgfTsKKyAgbGV0IHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrLCBwYXJ0aWFsRXZhbHVhdG9yOworICBiZWZvcmVBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICBwZGZNYW5hZ2VyTW9jayA9IG5ldyBQREZNYW5hZ2VyTW9jayh7CisgICAgICBkb2NCYXNlVXJsOiBudWxsCisgICAgfSk7CisgICAgaWRGYWN0b3J5TW9jayA9ICgwLCBfdGVzdF91dGlscy5jcmVhdGVJZEZhY3RvcnkpKDApOworICAgIHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgX2V2YWx1YXRvci5QYXJ0aWFsRXZhbHVhdG9yKHsKKyAgICAgIHhyZWY6IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jaygpLAorICAgICAgaGFuZGxlcjogbmV3IEhhbmRsZXJNb2NrKCksCisgICAgICBwYWdlSW5kZXg6IDAsCisgICAgICBpZEZhY3Rvcnk6ICgwLCBfdGVzdF91dGlscy5jcmVhdGVJZEZhY3RvcnkpKDApLAorICAgICAgZm9udENhY2hlOiBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKQorICAgIH0pOworICAgIGRvbmUoKTsKKyAgfSk7CisgIGFmdGVyQWxsKGZ1bmN0aW9uICgpIHsKKyAgICBwZGZNYW5hZ2VyTW9jayA9IG51bGw7CisgICAgaWRGYWN0b3J5TW9jayA9IG51bGw7CisgICAgcGFydGlhbEV2YWx1YXRvciA9IG51bGw7CisgIH0pOworICBkZXNjcmliZSgiQW5ub3RhdGlvbkZhY3RvcnkiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBnZXQgaWQgZm9yIGFubm90YXRpb24iLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxpbmsiKSk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEwLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGFubm90YXRpb25SZWYsCisgICAgICAgIGRhdGE6IGFubm90YXRpb25EaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBhbm5vdGF0aW9uUmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLkxJTkspOworICAgICAgICBleHBlY3QoZGF0YS5pZCkudG9FcXVhbCgiMTBSIik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUsIGFuZCBnZXQgZmFsbGJhY2sgSURzIGZvciwgYW5ub3RhdGlvbnMgdGhhdCBhcmUgbm90ICIgKyAiaW5kaXJlY3Qgb2JqZWN0cyAoaXNzdWUgNzU2OSkiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxpbmsiKSk7CisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKCk7CisgICAgICBjb25zdCBpZEZhY3RvcnkgPSAoMCwgX3Rlc3RfdXRpbHMuY3JlYXRlSWRGYWN0b3J5KSgwKTsKKworICAgICAgY29uc3QgYW5ub3RhdGlvbjEgPSBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYW5ub3RhdGlvbkRpY3QsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnkpLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuaWQpLnRvRXF1YWwoImFubm90X3AwXzEiKTsKKyAgICAgIH0pOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uMiA9IF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBhbm5vdGF0aW9uRGljdCwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeSkudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLkxJTkspOworICAgICAgICBleHBlY3QoZGF0YS5pZCkudG9FcXVhbCgiYW5ub3RfcDBfMiIpOworICAgICAgfSk7CisKKyAgICAgIFByb21pc2UuYWxsKFthbm5vdGF0aW9uMSwgYW5ub3RhdGlvbjJdKS50aGVuKGRvbmUsIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUgbWlzc2luZyAvU3VidHlwZSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJnZXRRdWFkUG9pbnRzIiwgZnVuY3Rpb24gKCkgeworICAgIGxldCBkaWN0LCByZWN0OworICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgcmVjdCA9IFtdOworICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7CisgICAgICBkaWN0ID0gbnVsbDsKKyAgICAgIHJlY3QgPSBudWxsOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaWdub3JlIG1pc3NpbmcgcXVhZHBvaW50cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX2Fubm90YXRpb24uZ2V0UXVhZFBvaW50cykoZGljdCwgcmVjdCkpLnRvRXF1YWwobnVsbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBpZ25vcmUgbm9uLWFycmF5IHZhbHVlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGRpY3Quc2V0KCJRdWFkUG9pbnRzIiwgImZvbyIpOworICAgICAgZXhwZWN0KCgwLCBfYW5ub3RhdGlvbi5nZXRRdWFkUG9pbnRzKShkaWN0LCByZWN0KSkudG9FcXVhbChudWxsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGlnbm9yZSBhcnJheXMgd2hlcmUgdGhlIGxlbmd0aCBpcyBub3QgYSBtdWx0aXBsZSBvZiBlaWdodCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGRpY3Quc2V0KCJRdWFkUG9pbnRzIiwgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSk7CisgICAgICBleHBlY3QoKDAsIF9hbm5vdGF0aW9uLmdldFF1YWRQb2ludHMpKGRpY3QsIHJlY3QpKS50b0VxdWFsKG51bGwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaWdub3JlIHF1YWRwb2ludHMgaWYgb25lIGNvb3JkaW5hdGUgbGllcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUiLCBmdW5jdGlvbiAoKSB7CisgICAgICByZWN0ID0gWzEwLCAxMCwgMjAsIDIwXTsKKyAgICAgIGNvbnN0IGlucHV0cyA9IFtbMTEsIDExLCAxMiwgMTIsIDksIDEzLCAxNCwgMTRdLCBbMTEsIDExLCAxMiwgMTIsIDEzLCA5LCAxNCwgMTRdLCBbMTEsIDExLCAxMiwgMTIsIDIxLCAxMywgMTQsIDE0XSwgWzExLCAxMSwgMTIsIDEyLCAxMywgMjEsIDE0LCAxNF1dOworCisgICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykgeworICAgICAgICBkaWN0LnNldCgiUXVhZFBvaW50cyIsIGlucHV0KTsKKyAgICAgICAgZXhwZWN0KCgwLCBfYW5ub3RhdGlvbi5nZXRRdWFkUG9pbnRzKShkaWN0LCByZWN0KSkudG9FcXVhbChudWxsKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHByb2Nlc3MgdmFsaWQgcXVhZHBvaW50cyBhcnJheXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICByZWN0ID0gWzEwLCAxMCwgMjAsIDIwXTsKKyAgICAgIGRpY3Quc2V0KCJRdWFkUG9pbnRzIiwgWzExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4XSk7CisgICAgICBleHBlY3QoKDAsIF9hbm5vdGF0aW9uLmdldFF1YWRQb2ludHMpKGRpY3QsIHJlY3QpKS50b0VxdWFsKFtbeworICAgICAgICB4OiAxMSwKKyAgICAgICAgeTogMTEKKyAgICAgIH0sIHsKKyAgICAgICAgeDogMTIsCisgICAgICAgIHk6IDEyCisgICAgICB9LCB7CisgICAgICAgIHg6IDEzLAorICAgICAgICB5OiAxMworICAgICAgfSwgeworICAgICAgICB4OiAxNCwKKyAgICAgICAgeTogMTQKKyAgICAgIH1dLCBbeworICAgICAgICB4OiAxNSwKKyAgICAgICAgeTogMTUKKyAgICAgIH0sIHsKKyAgICAgICAgeDogMTYsCisgICAgICAgIHk6IDE2CisgICAgICB9LCB7CisgICAgICAgIHg6IDE3LAorICAgICAgICB5OiAxNworICAgICAgfSwgeworICAgICAgICB4OiAxOCwKKyAgICAgICAgeTogMTgKKyAgICAgIH1dXSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiQW5ub3RhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBsZXQgZGljdCwgcmVmOworICAgIGJlZm9yZUFsbChmdW5jdGlvbiAoZG9uZSkgeworICAgICAgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICByZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEsIDApOworICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGFmdGVyQWxsKGZ1bmN0aW9uICgpIHsKKyAgICAgIGRpY3QgPSByZWYgPSBudWxsOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IGFuZCBnZXQgdmFsaWQgY29udGVudHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb24oeworICAgICAgICBkaWN0LAorICAgICAgICByZWYKKyAgICAgIH0pOworICAgICAgYW5ub3RhdGlvbi5zZXRDb250ZW50cygiRm9vIGJhciBiYXoiKTsKKyAgICAgIGV4cGVjdChhbm5vdGF0aW9uLmNvbnRlbnRzKS50b0VxdWFsKCJGb28gYmFyIGJheiIpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IHNldCBhbmQgZ2V0IGludmFsaWQgY29udGVudHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb24oeworICAgICAgICBkaWN0LAorICAgICAgICByZWYKKyAgICAgIH0pOworICAgICAgYW5ub3RhdGlvbi5zZXRDb250ZW50cyh1bmRlZmluZWQpOworICAgICAgZXhwZWN0KGFubm90YXRpb24uY29udGVudHMpLnRvRXF1YWwoIiIpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IGFuZCBnZXQgYSB2YWxpZCBtb2RpZmljYXRpb24gZGF0ZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGFubm90YXRpb24gPSBuZXcgX2Fubm90YXRpb24uQW5ub3RhdGlvbih7CisgICAgICAgIGRpY3QsCisgICAgICAgIHJlZgorICAgICAgfSk7CisgICAgICBhbm5vdGF0aW9uLnNldE1vZGlmaWNhdGlvbkRhdGUoIkQ6MjAxOTA0MjIiKTsKKyAgICAgIGV4cGVjdChhbm5vdGF0aW9uLm1vZGlmaWNhdGlvbkRhdGUpLnRvRXF1YWwoIkQ6MjAxOTA0MjIiKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIG5vdCBzZXQgYW5kIGdldCBhbiBpbnZhbGlkIG1vZGlmaWNhdGlvbiBkYXRlIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uKHsKKyAgICAgICAgZGljdCwKKyAgICAgICAgcmVmCisgICAgICB9KTsKKyAgICAgIGFubm90YXRpb24uc2V0TW9kaWZpY2F0aW9uRGF0ZSh1bmRlZmluZWQpOworICAgICAgZXhwZWN0KGFubm90YXRpb24ubW9kaWZpY2F0aW9uRGF0ZSkudG9FcXVhbChudWxsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHNldCBhbmQgZ2V0IGZsYWdzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uKHsKKyAgICAgICAgZGljdCwKKyAgICAgICAgcmVmCisgICAgICB9KTsKKyAgICAgIGFubm90YXRpb24uc2V0RmxhZ3MoMTMpOworICAgICAgZXhwZWN0KGFubm90YXRpb24uaGFzRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KGFubm90YXRpb24uaGFzRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmxhZy5OT1pPT00pKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KGFubm90YXRpb24uaGFzRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmxhZy5QUklOVCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoYW5ub3RhdGlvbi5oYXNGbGFnKF91dGlsLkFubm90YXRpb25GbGFnLlJFQURPTkxZKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBiZSB2aWV3YWJsZSBhbmQgbm90IHByaW50YWJsZSBieSBkZWZhdWx0IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uKHsKKyAgICAgICAgZGljdCwKKyAgICAgICAgcmVmCisgICAgICB9KTsKKyAgICAgIGV4cGVjdChhbm5vdGF0aW9uLnZpZXdhYmxlKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KGFubm90YXRpb24ucHJpbnRhYmxlKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHNldCBhbmQgZ2V0IGEgdmFsaWQgcmVjdGFuZ2xlIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uKHsKKyAgICAgICAgZGljdCwKKyAgICAgICAgcmVmCisgICAgICB9KTsKKyAgICAgIGFubm90YXRpb24uc2V0UmVjdGFuZ2xlKFsxMTcsIDY5NCwgMTY0LjI5OCwgNzIwXSk7CisgICAgICBleHBlY3QoYW5ub3RhdGlvbi5yZWN0YW5nbGUpLnRvRXF1YWwoWzExNywgNjk0LCAxNjQuMjk4LCA3MjBdKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIG5vdCBzZXQgYW5kIGdldCBhbiBpbnZhbGlkIHJlY3RhbmdsZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGFubm90YXRpb24gPSBuZXcgX2Fubm90YXRpb24uQW5ub3RhdGlvbih7CisgICAgICAgIGRpY3QsCisgICAgICAgIHJlZgorICAgICAgfSk7CisgICAgICBhbm5vdGF0aW9uLnNldFJlY3RhbmdsZShbMTE3LCA2OTQsIDE2NC4yOThdKTsKKyAgICAgIGV4cGVjdChhbm5vdGF0aW9uLnJlY3RhbmdsZSkudG9FcXVhbChbMCwgMCwgMCwgMF0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVqZWN0IGEgY29sb3IgaWYgaXQgaXMgbm90IGFuIGFycmF5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uKHsKKyAgICAgICAgZGljdCwKKyAgICAgICAgcmVmCisgICAgICB9KTsKKyAgICAgIGFubm90YXRpb24uc2V0Q29sb3IoInJlZCIpOworICAgICAgZXhwZWN0KGFubm90YXRpb24uY29sb3IpLnRvRXF1YWwobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFswLCAwLCAwXSkpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IGFuZCBnZXQgYSB0cmFuc3BhcmVudCBjb2xvciIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGFubm90YXRpb24gPSBuZXcgX2Fubm90YXRpb24uQW5ub3RhdGlvbih7CisgICAgICAgIGRpY3QsCisgICAgICAgIHJlZgorICAgICAgfSk7CisgICAgICBhbm5vdGF0aW9uLnNldENvbG9yKFtdKTsKKyAgICAgIGV4cGVjdChhbm5vdGF0aW9uLmNvbG9yKS50b0VxdWFsKG51bGwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IGFuZCBnZXQgYSBncmF5c2NhbGUgY29sb3IiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb24oeworICAgICAgICBkaWN0LAorICAgICAgICByZWYKKyAgICAgIH0pOworICAgICAgYW5ub3RhdGlvbi5zZXRDb2xvcihbMC40XSk7CisgICAgICBleHBlY3QoYW5ub3RhdGlvbi5jb2xvcikudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzEwMiwgMTAyLCAxMDJdKSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBzZXQgYW5kIGdldCBhbiBSR0IgY29sb3IiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb24oeworICAgICAgICBkaWN0LAorICAgICAgICByZWYKKyAgICAgIH0pOworICAgICAgYW5ub3RhdGlvbi5zZXRDb2xvcihbMCwgMCwgMV0pOworICAgICAgZXhwZWN0KGFubm90YXRpb24uY29sb3IpLnRvRXF1YWwobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFswLCAwLCAyNTVdKSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBzZXQgYW5kIGdldCBhIENNWUsgY29sb3IiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb24oeworICAgICAgICBkaWN0LAorICAgICAgICByZWYKKyAgICAgIH0pOworICAgICAgYW5ub3RhdGlvbi5zZXRDb2xvcihbMC4xLCAwLjkyLCAwLjg0LCAwLjAyXSk7CisgICAgICBleHBlY3QoYW5ub3RhdGlvbi5jb2xvcikudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzIzNCwgNTksIDQ4XSkpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IHNldCBhbmQgZ2V0IGFuIGludmFsaWQgY29sb3IiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb24oeworICAgICAgICBkaWN0LAorICAgICAgICByZWYKKyAgICAgIH0pOworICAgICAgYW5ub3RhdGlvbi5zZXRDb2xvcihbMC40LCAwLjZdKTsKKyAgICAgIGV4cGVjdChhbm5vdGF0aW9uLmNvbG9yKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMCwgMCwgMF0pKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJBbm5vdGF0aW9uQm9yZGVyU3R5bGUiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBzZXQgYW5kIGdldCBhIHZhbGlkIHdpZHRoIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYm9yZGVyU3R5bGUgPSBuZXcgX2Fubm90YXRpb24uQW5ub3RhdGlvbkJvcmRlclN0eWxlKCk7CisgICAgICBib3JkZXJTdHlsZS5zZXRXaWR0aCgzKTsKKyAgICAgIGV4cGVjdChib3JkZXJTdHlsZS53aWR0aCkudG9FcXVhbCgzKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIG5vdCBzZXQgYW5kIGdldCBhbiBpbnZhbGlkIHdpZHRoIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYm9yZGVyU3R5bGUgPSBuZXcgX2Fubm90YXRpb24uQW5ub3RhdGlvbkJvcmRlclN0eWxlKCk7CisgICAgICBib3JkZXJTdHlsZS5zZXRXaWR0aCgidGhyZWUiKTsKKyAgICAgIGV4cGVjdChib3JkZXJTdHlsZS53aWR0aCkudG9FcXVhbCgxKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHNldCB0aGUgd2lkdGggdG8gemVybywgd2hlbiB0aGUgaW5wdXQgaXMgYSBgTmFtZWAgKGlzc3VlIDEwMzg1KSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGJvcmRlclN0eWxlWmVybyA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTsKKyAgICAgIGJvcmRlclN0eWxlWmVyby5zZXRXaWR0aChfcHJpbWl0aXZlcy5OYW1lLmdldCgiMCIpKTsKKyAgICAgIGNvbnN0IGJvcmRlclN0eWxlRml2ZSA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTsKKyAgICAgIGJvcmRlclN0eWxlRml2ZS5zZXRXaWR0aChfcHJpbWl0aXZlcy5OYW1lLmdldCgiNSIpKTsKKyAgICAgIGV4cGVjdChib3JkZXJTdHlsZVplcm8ud2lkdGgpLnRvRXF1YWwoMCk7CisgICAgICBleHBlY3QoYm9yZGVyU3R5bGVGaXZlLndpZHRoKS50b0VxdWFsKDApOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IGFuZCBnZXQgYSB2YWxpZCBzdHlsZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGJvcmRlclN0eWxlID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb25Cb3JkZXJTdHlsZSgpOworICAgICAgYm9yZGVyU3R5bGUuc2V0U3R5bGUoX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkQiKSk7CisgICAgICBleHBlY3QoYm9yZGVyU3R5bGUuc3R5bGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IHNldCBhbmQgZ2V0IGFuIGludmFsaWQgc3R5bGUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBib3JkZXJTdHlsZSA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTsKKyAgICAgIGJvcmRlclN0eWxlLnNldFN0eWxlKCJEYXNoZWQiKTsKKyAgICAgIGV4cGVjdChib3JkZXJTdHlsZS5zdHlsZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHNldCBhbmQgZ2V0IGEgdmFsaWQgZGFzaCBhcnJheSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGJvcmRlclN0eWxlID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb25Cb3JkZXJTdHlsZSgpOworICAgICAgYm9yZGVyU3R5bGUuc2V0RGFzaEFycmF5KFsxLCAyLCAzXSk7CisgICAgICBleHBlY3QoYm9yZGVyU3R5bGUuZGFzaEFycmF5KS50b0VxdWFsKFsxLCAyLCAzXSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBub3Qgc2V0IGFuZCBnZXQgYW4gaW52YWxpZCBkYXNoIGFycmF5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYm9yZGVyU3R5bGUgPSBuZXcgX2Fubm90YXRpb24uQW5ub3RhdGlvbkJvcmRlclN0eWxlKCk7CisgICAgICBib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoWzAsIDBdKTsKKyAgICAgIGV4cGVjdChib3JkZXJTdHlsZS5kYXNoQXJyYXkpLnRvRXF1YWwoWzNdKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHNldCBhbmQgZ2V0IGEgdmFsaWQgaG9yaXpvbnRhbCBjb3JuZXIgcmFkaXVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYm9yZGVyU3R5bGUgPSBuZXcgX2Fubm90YXRpb24uQW5ub3RhdGlvbkJvcmRlclN0eWxlKCk7CisgICAgICBib3JkZXJTdHlsZS5zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKDMpOworICAgICAgZXhwZWN0KGJvcmRlclN0eWxlLmhvcml6b250YWxDb3JuZXJSYWRpdXMpLnRvRXF1YWwoMyk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBub3Qgc2V0IGFuZCBnZXQgYW4gaW52YWxpZCBob3Jpem9udGFsIGNvcm5lciByYWRpdXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBib3JkZXJTdHlsZSA9IG5ldyBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTsKKyAgICAgIGJvcmRlclN0eWxlLnNldEhvcml6b250YWxDb3JuZXJSYWRpdXMoInRocmVlIik7CisgICAgICBleHBlY3QoYm9yZGVyU3R5bGUuaG9yaXpvbnRhbENvcm5lclJhZGl1cykudG9FcXVhbCgwKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHNldCBhbmQgZ2V0IGEgdmFsaWQgdmVydGljYWwgY29ybmVyIHJhZGl1cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGJvcmRlclN0eWxlID0gbmV3IF9hbm5vdGF0aW9uLkFubm90YXRpb25Cb3JkZXJTdHlsZSgpOworICAgICAgYm9yZGVyU3R5bGUuc2V0VmVydGljYWxDb3JuZXJSYWRpdXMoMyk7CisgICAgICBleHBlY3QoYm9yZGVyU3R5bGUudmVydGljYWxDb3JuZXJSYWRpdXMpLnRvRXF1YWwoMyk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBub3Qgc2V0IGFuZCBnZXQgYW4gaW52YWxpZCB2ZXJ0aWNhbCBjb3JuZXIgcmFkaXVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgYm9yZGVyU3R5bGUgPSBuZXcgX2Fubm90YXRpb24uQW5ub3RhdGlvbkJvcmRlclN0eWxlKCk7CisgICAgICBib3JkZXJTdHlsZS5zZXRWZXJ0aWNhbENvcm5lclJhZGl1cygidGhyZWUiKTsKKyAgICAgIGV4cGVjdChib3JkZXJTdHlsZS52ZXJ0aWNhbENvcm5lclJhZGl1cykudG9FcXVhbCgwKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJNYXJrdXBBbm5vdGF0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgIGxldCBkaWN0LCByZWY7CisgICAgYmVmb3JlQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBkaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMSwgMCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJBbGwoZnVuY3Rpb24gKCkgeworICAgICAgZGljdCA9IHJlZiA9IG51bGw7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBzZXQgYW5kIGdldCBhIHZhbGlkIGNyZWF0aW9uIGRhdGUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBtYXJrdXBBbm5vdGF0aW9uID0gbmV3IF9hbm5vdGF0aW9uLk1hcmt1cEFubm90YXRpb24oeworICAgICAgICBkaWN0LAorICAgICAgICByZWYKKyAgICAgIH0pOworICAgICAgbWFya3VwQW5ub3RhdGlvbi5zZXRDcmVhdGlvbkRhdGUoIkQ6MjAxOTA0MjIiKTsKKyAgICAgIGV4cGVjdChtYXJrdXBBbm5vdGF0aW9uLmNyZWF0aW9uRGF0ZSkudG9FcXVhbCgiRDoyMDE5MDQyMiIpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IHNldCBhbmQgZ2V0IGFuIGludmFsaWQgY3JlYXRpb24gZGF0ZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IG1hcmt1cEFubm90YXRpb24gPSBuZXcgX2Fubm90YXRpb24uTWFya3VwQW5ub3RhdGlvbih7CisgICAgICAgIGRpY3QsCisgICAgICAgIHJlZgorICAgICAgfSk7CisgICAgICBtYXJrdXBBbm5vdGF0aW9uLnNldENyZWF0aW9uRGF0ZSh1bmRlZmluZWQpOworICAgICAgZXhwZWN0KG1hcmt1cEFubm90YXRpb24uY3JlYXRpb25EYXRlKS50b0VxdWFsKG51bGwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IHBhcnNlIElSVC9SVCB3aGVuIG5vdCBkZWZpbmVkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgZGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVGV4dCIpKTsKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmLAorICAgICAgICBkYXRhOiBkaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCByZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuaW5SZXBseVRvKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGV4cGVjdChkYXRhLnJlcGx5VHlwZSkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFyc2UgSVJUIGFuZCBzZXQgZGVmYXVsdCBSVCB3aGVuIG5vdCBkZWZpbmVkLiIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg4MTksIDApOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVGV4dCIpKTsKKworICAgICAgY29uc3QgcmVwbHlSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDgyMCwgMCk7CisKKyAgICAgIGNvbnN0IHJlcGx5RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICByZXBseURpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgcmVwbHlEaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJUZXh0IikpOworICAgICAgcmVwbHlEaWN0LnNldCgiSVJUIiwgYW5ub3RhdGlvblJlZik7CisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH0sIHsKKyAgICAgICAgcmVmOiByZXBseVJlZiwKKyAgICAgICAgZGF0YTogcmVwbHlEaWN0CisgICAgICB9XSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5hc3NpZ25YcmVmKHhyZWYpOworICAgICAgcmVwbHlEaWN0LmFzc2lnblhyZWYoeHJlZik7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCByZXBseVJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5pblJlcGx5VG8pLnRvRXF1YWwoYW5ub3RhdGlvblJlZi50b1N0cmluZygpKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucmVwbHlUeXBlKS50b0VxdWFsKCJSIik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBwYXJzZSBJUlQvUlQgZm9yIGEgZ3JvdXAgdHlwZSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg4MTksIDApOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVGV4dCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiVCIsICJQYXJlbnRUaXRsZSIpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJDb250ZW50cyIsICJQYXJlbnRUZXh0Iik7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIkNyZWF0aW9uRGF0ZSIsICJEOjIwMTgwNDIzIik7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIk0iLCAiRDoyMDE5MDQyMyIpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJDIiwgWzAsIDAsIDFdKTsKKworICAgICAgY29uc3QgcG9wdXBSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDgyMCwgMCk7CisKKyAgICAgIGNvbnN0IHBvcHVwRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBwb3B1cERpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgcG9wdXBEaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJQb3B1cCIpKTsKKyAgICAgIHBvcHVwRGljdC5zZXQoIlBhcmVudCIsIGFubm90YXRpb25SZWYpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJQb3B1cCIsIHBvcHVwUmVmKTsKKworICAgICAgY29uc3QgcmVwbHlSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDgyMSwgMCk7CisKKyAgICAgIGNvbnN0IHJlcGx5RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICByZXBseURpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgcmVwbHlEaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJUZXh0IikpOworICAgICAgcmVwbHlEaWN0LnNldCgiSVJUIiwgYW5ub3RhdGlvblJlZik7CisgICAgICByZXBseURpY3Quc2V0KCJSVCIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJHcm91cCIpKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIlQiLCAiUmVwbHlUaXRsZSIpOworICAgICAgcmVwbHlEaWN0LnNldCgiQ29udGVudHMiLCAiUmVwbHlUZXh0Iik7CisgICAgICByZXBseURpY3Quc2V0KCJDcmVhdGlvbkRhdGUiLCAiRDoyMDE4MDUyMyIpOworICAgICAgcmVwbHlEaWN0LnNldCgiTSIsICJEOjIwMTkwNTIzIik7CisgICAgICByZXBseURpY3Quc2V0KCJDIiwgWzAuNF0pOworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGFubm90YXRpb25SZWYsCisgICAgICAgIGRhdGE6IGFubm90YXRpb25EaWN0CisgICAgICB9LCB7CisgICAgICAgIHJlZjogcG9wdXBSZWYsCisgICAgICAgIGRhdGE6IHBvcHVwRGljdAorICAgICAgfSwgeworICAgICAgICByZWY6IHJlcGx5UmVmLAorICAgICAgICBkYXRhOiByZXBseURpY3QKKyAgICAgIH1dKTsKKyAgICAgIGFubm90YXRpb25EaWN0LmFzc2lnblhyZWYoeHJlZik7CisgICAgICBwb3B1cERpY3QuYXNzaWduWHJlZih4cmVmKTsKKyAgICAgIHJlcGx5RGljdC5hc3NpZ25YcmVmKHhyZWYpOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgcmVwbHlSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuaW5SZXBseVRvKS50b0VxdWFsKGFubm90YXRpb25SZWYudG9TdHJpbmcoKSk7CisgICAgICAgIGV4cGVjdChkYXRhLnJlcGx5VHlwZSkudG9FcXVhbCgiR3JvdXAiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudGl0bGUpLnRvRXF1YWwoIlBhcmVudFRpdGxlIik7CisgICAgICAgIGV4cGVjdChkYXRhLmNvbnRlbnRzKS50b0VxdWFsKCJQYXJlbnRUZXh0Iik7CisgICAgICAgIGV4cGVjdChkYXRhLmNyZWF0aW9uRGF0ZSkudG9FcXVhbCgiRDoyMDE4MDQyMyIpOworICAgICAgICBleHBlY3QoZGF0YS5tb2RpZmljYXRpb25EYXRlKS50b0VxdWFsKCJEOjIwMTkwNDIzIik7CisgICAgICAgIGV4cGVjdChkYXRhLmNvbG9yKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMCwgMCwgMjU1XSkpOworICAgICAgICBleHBlY3QoZGF0YS5oYXNQb3B1cCkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHBhcnNlIElSVC9SVCBmb3IgYSByZXBseSB0eXBlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDgxOSwgMCk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJUZXh0IikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJUIiwgIlBhcmVudFRpdGxlIik7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIkNvbnRlbnRzIiwgIlBhcmVudFRleHQiKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiQ3JlYXRpb25EYXRlIiwgIkQ6MjAxODA0MjMiKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiTSIsICJEOjIwMTkwNDIzIik7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIkMiLCBbMCwgMCwgMV0pOworCisgICAgICBjb25zdCBwb3B1cFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoODIwLCAwKTsKKworICAgICAgY29uc3QgcG9wdXBEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHBvcHVwRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBwb3B1cERpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlBvcHVwIikpOworICAgICAgcG9wdXBEaWN0LnNldCgiUGFyZW50IiwgYW5ub3RhdGlvblJlZik7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlBvcHVwIiwgcG9wdXBSZWYpOworCisgICAgICBjb25zdCByZXBseVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoODIxLCAwKTsKKworICAgICAgY29uc3QgcmVwbHlEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICByZXBseURpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlRleHQiKSk7CisgICAgICByZXBseURpY3Quc2V0KCJJUlQiLCBhbm5vdGF0aW9uUmVmKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIlJUIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlIiKSk7CisgICAgICByZXBseURpY3Quc2V0KCJUIiwgIlJlcGx5VGl0bGUiKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIkNvbnRlbnRzIiwgIlJlcGx5VGV4dCIpOworICAgICAgcmVwbHlEaWN0LnNldCgiQ3JlYXRpb25EYXRlIiwgIkQ6MjAxODA1MjMiKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIk0iLCAiRDoyMDE5MDUyMyIpOworICAgICAgcmVwbHlEaWN0LnNldCgiQyIsIFswLjRdKTsKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBhbm5vdGF0aW9uUmVmLAorICAgICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAorICAgICAgfSwgeworICAgICAgICByZWY6IHBvcHVwUmVmLAorICAgICAgICBkYXRhOiBwb3B1cERpY3QKKyAgICAgIH0sIHsKKyAgICAgICAgcmVmOiByZXBseVJlZiwKKyAgICAgICAgZGF0YTogcmVwbHlEaWN0CisgICAgICB9XSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5hc3NpZ25YcmVmKHhyZWYpOworICAgICAgcG9wdXBEaWN0LmFzc2lnblhyZWYoeHJlZik7CisgICAgICByZXBseURpY3QuYXNzaWduWHJlZih4cmVmKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHJlcGx5UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmluUmVwbHlUbykudG9FcXVhbChhbm5vdGF0aW9uUmVmLnRvU3RyaW5nKCkpOworICAgICAgICBleHBlY3QoZGF0YS5yZXBseVR5cGUpLnRvRXF1YWwoIlIiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudGl0bGUpLnRvRXF1YWwoIlJlcGx5VGl0bGUiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuY29udGVudHMpLnRvRXF1YWwoIlJlcGx5VGV4dCIpOworICAgICAgICBleHBlY3QoZGF0YS5jcmVhdGlvbkRhdGUpLnRvRXF1YWwoIkQ6MjAxODA1MjMiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEubW9kaWZpY2F0aW9uRGF0ZSkudG9FcXVhbCgiRDoyMDE5MDUyMyIpOworICAgICAgICBleHBlY3QoZGF0YS5jb2xvcikudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzEwMiwgMTAyLCAxMDJdKSk7CisgICAgICAgIGV4cGVjdChkYXRhLmhhc1BvcHVwKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJUZXh0QW5ub3RhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIG5vdCBwYXJzZSBzdGF0ZSBtb2RlbCBhbmQgc3RhdGUgd2hlbiBub3QgZGVmaW5lZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg4MTksIDApOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVGV4dCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiQ29udGVudHMiLCAiVGVzdFRleHQiKTsKKworICAgICAgY29uc3QgcmVwbHlSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDgyMCwgMCk7CisKKyAgICAgIGNvbnN0IHJlcGx5RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICByZXBseURpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgcmVwbHlEaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJUZXh0IikpOworICAgICAgcmVwbHlEaWN0LnNldCgiSVJUIiwgYW5ub3RhdGlvblJlZik7CisgICAgICByZXBseURpY3Quc2V0KCJSVCIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJSIikpOworICAgICAgcmVwbHlEaWN0LnNldCgiQ29udGVudHMiLCAiUmVwbHlUZXh0Iik7CisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH0sIHsKKyAgICAgICAgcmVmOiByZXBseVJlZiwKKyAgICAgICAgZGF0YTogcmVwbHlEaWN0CisgICAgICB9XSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5hc3NpZ25YcmVmKHhyZWYpOworICAgICAgcmVwbHlEaWN0LmFzc2lnblhyZWYoeHJlZik7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCByZXBseVJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5zdGF0ZU1vZGVsKS50b0JlTnVsbCgpOworICAgICAgICBleHBlY3QoZGF0YS5zdGF0ZSkudG9CZU51bGwoKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNvcnJlY3RseSBwYXJzZSBzdGF0ZSBtb2RlbCBhbmQgc3RhdGUgd2hlbiBkZWZpbmVkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDgxOSwgMCk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJUZXh0IikpOworCisgICAgICBjb25zdCByZXBseVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoODIwLCAwKTsKKworICAgICAgY29uc3QgcmVwbHlEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICByZXBseURpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlRleHQiKSk7CisgICAgICByZXBseURpY3Quc2V0KCJJUlQiLCBhbm5vdGF0aW9uUmVmKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIlJUIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlIiKSk7CisgICAgICByZXBseURpY3Quc2V0KCJTdGF0ZU1vZGVsIiwgIlJldmlldyIpOworICAgICAgcmVwbHlEaWN0LnNldCgiU3RhdGUiLCAiUmVqZWN0ZWQiKTsKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBhbm5vdGF0aW9uUmVmLAorICAgICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAorICAgICAgfSwgeworICAgICAgICByZWY6IHJlcGx5UmVmLAorICAgICAgICBkYXRhOiByZXBseURpY3QKKyAgICAgIH1dKTsKKyAgICAgIGFubm90YXRpb25EaWN0LmFzc2lnblhyZWYoeHJlZik7CisgICAgICByZXBseURpY3QuYXNzaWduWHJlZih4cmVmKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHJlcGx5UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLnN0YXRlTW9kZWwpLnRvRXF1YWwoIlJldmlldyIpOworICAgICAgICBleHBlY3QoZGF0YS5zdGF0ZSkudG9FcXVhbCgiUmVqZWN0ZWQiKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJMaW5rQW5ub3RhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGNvcnJlY3RseSBwYXJzZSBhIFVSSSBhY3Rpb24iLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYWN0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBY3Rpb24iKSk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiUyIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJVUkkiKSk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiVVJJIiwgImh0dHA6Ly93d3cuY3Rhbi5vcmcvdGV4LWFyY2hpdmUvaW5mby9sc2hvcnQiKTsKKyAgICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJMaW5rIikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJBIiwgYWN0aW9uRGljdCk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDgyMCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBhbm5vdGF0aW9uUmVmLAorICAgICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYW5ub3RhdGlvblJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudXJsKS50b0VxdWFsKCJodHRwOi8vd3d3LmN0YW4ub3JnL3RleC1hcmNoaXZlL2luZm8vbHNob3J0Iik7CisgICAgICAgIGV4cGVjdChkYXRhLnVuc2FmZVVybCkudG9FcXVhbCgiaHR0cDovL3d3dy5jdGFuLm9yZy90ZXgtYXJjaGl2ZS9pbmZvL2xzaG9ydCIpOworICAgICAgICBleHBlY3QoZGF0YS5kZXN0KS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBjb3JyZWN0bHkgcGFyc2UgYSBVUkkgYWN0aW9uLCB3aGVyZSB0aGUgVVJJIGVudHJ5ICIgKyAiaXMgbWlzc2luZyBhIHByb3RvY29sIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFjdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYWN0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQWN0aW9uIikpOworICAgICAgYWN0aW9uRGljdC5zZXQoIlMiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVVJJIikpOworICAgICAgYWN0aW9uRGljdC5zZXQoIlVSSSIsICJ3d3cuaG1yYy5nb3YudWsiKTsKKyAgICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJMaW5rIikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJBIiwgYWN0aW9uRGljdCk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDM1MywgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBhbm5vdGF0aW9uUmVmLAorICAgICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYW5ub3RhdGlvblJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudXJsKS50b0VxdWFsKCJodHRwOi8vd3d3LmhtcmMuZ292LnVrLyIpOworICAgICAgICBleHBlY3QoZGF0YS51bnNhZmVVcmwpLnRvRXF1YWwoImh0dHA6Ly93d3cuaG1yYy5nb3YudWsiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuZGVzdCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IHBhcnNlIGEgVVJJIGFjdGlvbiwgd2hlcmUgdGhlIFVSSSBlbnRyeSAiICsgImhhcyBhbiBpbmNvcnJlY3QgZW5jb2RpbmcgKGJ1ZyAxMTIyMjgwKSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBhY3Rpb25TdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjw8XG4iICsgIi9UeXBlIC9BY3Rpb25cbiIgKyAiL1MgL1VSSVxuIiArICIvVVJJIChodHRwOi8vd3d3LmV4YW1wbGUuY29tL1xcMzAzXFwyNzRcXDMwM1xcMjY2XFwzMDNcXDI0NClcbiIgKyAiPj5cbiIpOworICAgICAgY29uc3QgcGFyc2VyID0gbmV3IF9wYXJzZXIuUGFyc2VyKHsKKyAgICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKGFjdGlvblN0cmVhbSksCisgICAgICAgIHhyZWY6IG51bGwKKyAgICAgIH0pOworICAgICAgY29uc3QgYWN0aW9uRGljdCA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJMaW5rIikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJBIiwgYWN0aW9uRGljdCk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDgsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLnVybCkudG9FcXVhbChuZXcgVVJMKCgwLCBfdXRpbC5zdHJpbmdUb1VURjhTdHJpbmcpKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL1x4QzNceEJDXHhDM1x4QjZceEMzXHhBNCIpKS5ocmVmKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudW5zYWZlVXJsKS50b0VxdWFsKCgwLCBfdXRpbC5zdHJpbmdUb1VURjhTdHJpbmcpKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL1x4QzNceEJDXHhDM1x4QjZceEMzXHhBNCIpKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuZGVzdCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IHBhcnNlIGEgR29UbyBhY3Rpb24iLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYWN0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBY3Rpb24iKSk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiUyIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJHb1RvIikpOworICAgICAgYWN0aW9uRGljdC5zZXQoIkQiLCAicGFnZS4xNTciKTsKKyAgICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJMaW5rIikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJBIiwgYWN0aW9uRGljdCk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDc5OCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBhbm5vdGF0aW9uUmVmLAorICAgICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYW5ub3RhdGlvblJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudXJsKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGV4cGVjdChkYXRhLnVuc2FmZVVybCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QoZGF0YS5kZXN0KS50b0VxdWFsKCJwYWdlLjE1NyIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IHBhcnNlIGEgR29Ub1IgYWN0aW9uLCB3aGVyZSB0aGUgRmlsZVNwZWMgZW50cnkgIiArICJpcyBhIHN0cmluZyBjb250YWluaW5nIGEgcmVsYXRpdmUgVVJMIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFjdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYWN0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQWN0aW9uIikpOworICAgICAgYWN0aW9uRGljdC5zZXQoIlMiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiR29Ub1IiKSk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiRiIsICIuLi8uLi8wMDEzLzAwMTM0Ni8xMzQ2ODVFLnBkZiIpOworICAgICAgYWN0aW9uRGljdC5zZXQoIkQiLCAiNC4zIik7CisgICAgICBhY3Rpb25EaWN0LnNldCgiTmV3V2luZG93IiwgdHJ1ZSk7CisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiTGluayIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiQSIsIGFjdGlvbkRpY3QpOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg0ODksIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLnVybCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QoZGF0YS51bnNhZmVVcmwpLnRvRXF1YWwoIi4uLy4uLzAwMTMvMDAxMzQ2LzEzNDY4NUUucGRmIzQuMyIpOworICAgICAgICBleHBlY3QoZGF0YS5kZXN0KS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGV4cGVjdChkYXRhLm5ld1dpbmRvdykudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNvcnJlY3RseSBwYXJzZSBhIEdvVG9SIGFjdGlvbiwgY29udGFpbmluZyBhIHJlbGF0aXZlIFVSTCwgIiArICd3aXRoIHRoZSAiZG9jQmFzZVVybCIgcGFyYW1ldGVyIHNwZWNpZmllZCcsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBhY3Rpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFjdGlvbiIpKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJTIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkdvVG9SIikpOworICAgICAgYWN0aW9uRGljdC5zZXQoIkYiLCAiLi4vLi4vMDAxMy8wMDEzNDYvMTM0Njg1RS5wZGYiKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJEIiwgIjQuMyIpOworICAgICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxpbmsiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIkEiLCBhY3Rpb25EaWN0KTsKKworICAgICAgY29uc3QgYW5ub3RhdGlvblJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoNDg5LCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGFubm90YXRpb25SZWYsCisgICAgICAgIGRhdGE6IGFubm90YXRpb25EaWN0CisgICAgICB9XSk7CisgICAgICBjb25zdCBwZGZNYW5hZ2VyID0gbmV3IFBERk1hbmFnZXJNb2NrKHsKKyAgICAgICAgZG9jQmFzZVVybDogImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9wZGZzL3F3ZXJ0eS5wZGYiCisgICAgICB9KTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXIsIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudXJsKS50b0VxdWFsKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLzAwMTMvMDAxMzQ2LzEzNDY4NUUucGRmIzQuMyIpOworICAgICAgICBleHBlY3QoZGF0YS51bnNhZmVVcmwpLnRvRXF1YWwoIi4uLy4uLzAwMTMvMDAxMzQ2LzEzNDY4NUUucGRmIzQuMyIpOworICAgICAgICBleHBlY3QoZGF0YS5kZXN0KS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBjb3JyZWN0bHkgcGFyc2UgYSBHb1RvUiBhY3Rpb24sIHdpdGggbmFtZWQgZGVzdGluYXRpb24iLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYWN0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBY3Rpb24iKSk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiUyIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJHb1RvUiIpKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJGIiwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC5wZGYiKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJEIiwgIjE1Iik7CisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiTGluayIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiQSIsIGFjdGlvbkRpY3QpOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg0OTUsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLnVybCkudG9FcXVhbCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0LnBkZiMxNSIpOworICAgICAgICBleHBlY3QoZGF0YS51bnNhZmVVcmwpLnRvRXF1YWwoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC5wZGYjMTUiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuZGVzdCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QoZGF0YS5uZXdXaW5kb3cpLnRvQmVGYWxzeSgpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IHBhcnNlIGEgR29Ub1IgYWN0aW9uLCB3aXRoIGV4cGxpY2l0IGRlc3RpbmF0aW9uIGFycmF5IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFjdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYWN0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQWN0aW9uIikpOworICAgICAgYWN0aW9uRGljdC5zZXQoIlMiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiR29Ub1IiKSk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiRiIsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QucGRmIik7CisgICAgICBhY3Rpb25EaWN0LnNldCgiRCIsIFsxNCwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlhZWiIpLCBudWxsLCAyOTguMDQzLCBudWxsXSk7CisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiTGluayIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiQSIsIGFjdGlvbkRpY3QpOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg0ODksIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLnVybCkudG9FcXVhbChuZXcgVVJMKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QucGRmIyIgKyAnWzE0LHsibmFtZSI6IlhZWiJ9LG51bGwsMjk4LjA0MyxudWxsXScpLmhyZWYpOworICAgICAgICBleHBlY3QoZGF0YS51bnNhZmVVcmwpLnRvRXF1YWwoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC5wZGYjIiArICdbMTQseyJuYW1lIjoiWFlaIn0sbnVsbCwyOTguMDQzLG51bGxdJyk7CisgICAgICAgIGV4cGVjdChkYXRhLmRlc3QpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZXhwZWN0KGRhdGEubmV3V2luZG93KS50b0JlRmFsc3koKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNvcnJlY3RseSBwYXJzZSBhIExhdW5jaCBhY3Rpb24sIHdoZXJlIHRoZSBGaWxlU3BlYyBkaWN0ICIgKyAnY29udGFpbnMgYSByZWxhdGl2ZSBVUkwsIHdpdGggdGhlICJkb2NCYXNlVXJsIiBwYXJhbWV0ZXIgc3BlY2lmaWVkJywgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGZpbGVTcGVjRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBmaWxlU3BlY0RpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZpbGVTcGVjIikpOworICAgICAgZmlsZVNwZWNEaWN0LnNldCgiRiIsICJQYXJ0IElJL1BhcnQgSUkucGRmIik7CisgICAgICBmaWxlU3BlY0RpY3Quc2V0KCJVRiIsICJQYXJ0IElJL1BhcnQgSUkucGRmIik7CisgICAgICBjb25zdCBhY3Rpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFjdGlvbiIpKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJTIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxhdW5jaCIpKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJGIiwgZmlsZVNwZWNEaWN0KTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJOZXdXaW5kb3ciLCB0cnVlKTsKKyAgICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJMaW5rIikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJBIiwgYWN0aW9uRGljdCk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDg4LCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGFubm90YXRpb25SZWYsCisgICAgICAgIGRhdGE6IGFubm90YXRpb25EaWN0CisgICAgICB9XSk7CisgICAgICBjb25zdCBwZGZNYW5hZ2VyID0gbmV3IFBERk1hbmFnZXJNb2NrKHsKKyAgICAgICAgZG9jQmFzZVVybDogImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9wZGZzL3F3ZXJ0eS5wZGYiCisgICAgICB9KTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXIsIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudXJsKS50b0VxdWFsKG5ldyBVUkwoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9wZGZzL1BhcnQgSUkvUGFydCBJSS5wZGYiKS5ocmVmKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudW5zYWZlVXJsKS50b0VxdWFsKCJQYXJ0IElJL1BhcnQgSUkucGRmIik7CisgICAgICAgIGV4cGVjdChkYXRhLmRlc3QpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZXhwZWN0KGRhdGEubmV3V2luZG93KS50b0VxdWFsKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVjb3ZlciB2YWxpZCBVUkxzIGZyb20gSmF2YVNjcmlwdCBhY3Rpb25zIGhhdmluZyBjZXJ0YWluICIgKyAid2hpdGUtbGlzdGVkIGZvcm1hdHMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgZnVuY3Rpb24gY2hlY2tKc0FjdGlvbihwYXJhbXMpIHsKKyAgICAgICAgY29uc3QganNFbnRyeSA9IHBhcmFtcy5qc0VudHJ5OworICAgICAgICBjb25zdCBleHBlY3RlZFVybCA9IHBhcmFtcy5leHBlY3RlZFVybDsKKyAgICAgICAgY29uc3QgZXhwZWN0ZWRVbnNhZmVVcmwgPSBwYXJhbXMuZXhwZWN0ZWRVbnNhZmVVcmw7CisgICAgICAgIGNvbnN0IGV4cGVjdGVkTmV3V2luZG93ID0gcGFyYW1zLmV4cGVjdGVkTmV3V2luZG93OworICAgICAgICBjb25zdCBhY3Rpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgICAgYWN0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQWN0aW9uIikpOworICAgICAgICBhY3Rpb25EaWN0LnNldCgiUyIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJKYXZhU2NyaXB0IikpOworICAgICAgICBhY3Rpb25EaWN0LnNldCgiSlMiLCBqc0VudHJ5KTsKKyAgICAgICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJMaW5rIikpOworICAgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIkEiLCBhY3Rpb25EaWN0KTsKKworICAgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg0NiwgMCk7CisKKyAgICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAorICAgICAgICB9XSk7CisgICAgICAgIHJldHVybiBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYW5ub3RhdGlvblJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgICBkYXRhCisgICAgICAgIH0pID0+IHsKKyAgICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LKTsKKyAgICAgICAgICBleHBlY3QoZGF0YS51cmwpLnRvRXF1YWwoZXhwZWN0ZWRVcmwpOworICAgICAgICAgIGV4cGVjdChkYXRhLnVuc2FmZVVybCkudG9FcXVhbChleHBlY3RlZFVuc2FmZVVybCk7CisgICAgICAgICAgZXhwZWN0KGRhdGEuZGVzdCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICAgIGV4cGVjdChkYXRhLm5ld1dpbmRvdykudG9FcXVhbChleHBlY3RlZE5ld1dpbmRvdyk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBjb25zdCBhbm5vdGF0aW9uMSA9IGNoZWNrSnNBY3Rpb24oeworICAgICAgICBqc0VudHJ5OiAnZnVuY3Rpb24gc29tZUZ1bigpIHsgcmV0dXJuICJxd2VydHkiOyB9IHNvbWVGdW4oKTsnLAorICAgICAgICBleHBlY3RlZFVybDogdW5kZWZpbmVkLAorICAgICAgICBleHBlY3RlZFVuc2FmZVVybDogdW5kZWZpbmVkLAorICAgICAgICBleHBlY3RlZE5ld1dpbmRvdzogdW5kZWZpbmVkCisgICAgICB9KTsKKyAgICAgIGNvbnN0IGFubm90YXRpb24yID0gY2hlY2tKc0FjdGlvbih7CisgICAgICAgIGpzRW50cnk6ICJ3aW5kb3cub3BlbignaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0LnBkZicpIiwKKyAgICAgICAgZXhwZWN0ZWRVcmw6IG5ldyBVUkwoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC5wZGYiKS5ocmVmLAorICAgICAgICBleHBlY3RlZFVuc2FmZVVybDogImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC5wZGYiLAorICAgICAgICBleHBlY3RlZE5ld1dpbmRvdzogdW5kZWZpbmVkCisgICAgICB9KTsKKyAgICAgIGNvbnN0IGFubm90YXRpb24zID0gY2hlY2tKc0FjdGlvbih7CisgICAgICAgIGpzRW50cnk6IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgnYXBwLmxhdW5jaFVSTCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0LnBkZiIsIHRydWUpJyksCisgICAgICAgIGV4cGVjdGVkVXJsOiBuZXcgVVJMKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QucGRmIikuaHJlZiwKKyAgICAgICAgZXhwZWN0ZWRVbnNhZmVVcmw6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QucGRmIiwKKyAgICAgICAgZXhwZWN0ZWROZXdXaW5kb3c6IHRydWUKKyAgICAgIH0pOworICAgICAgUHJvbWlzZS5hbGwoW2Fubm90YXRpb24xLCBhbm5vdGF0aW9uMiwgYW5ub3RhdGlvbjNdKS50aGVuKGRvbmUsIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBjb3JyZWN0bHkgcGFyc2UgYSBOYW1lZCBhY3Rpb24iLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYWN0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBY3Rpb24iKSk7CisgICAgICBhY3Rpb25EaWN0LnNldCgiUyIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJOYW1lZCIpKTsKKyAgICAgIGFjdGlvbkRpY3Quc2V0KCJOIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkdvVG9QYWdlIikpOworICAgICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxpbmsiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIkEiLCBhY3Rpb25EaWN0KTsKKworICAgICAgY29uc3QgYW5ub3RhdGlvblJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTIsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLnVybCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QoZGF0YS51bnNhZmVVcmwpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuYWN0aW9uKS50b0VxdWFsKCJHb1RvUGFnZSIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IHBhcnNlIGEgc2ltcGxlIERlc3QiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxpbmsiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIkRlc3QiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiTEkwIikpOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg1ODMsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLnVybCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QoZGF0YS51bnNhZmVVcmwpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuZGVzdCkudG9FcXVhbCgiTEkwIik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBjb3JyZWN0bHkgcGFyc2UgYSBzaW1wbGUgRGVzdCwgd2l0aCBleHBsaWNpdCBkZXN0aW5hdGlvbiBhcnJheSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiTGluayIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiRGVzdCIsIFtfcHJpbWl0aXZlcy5SZWYuZ2V0KDE3LCAwKSwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlhZWiIpLCAwLCA4NDEuODksIG51bGxdKTsKKworICAgICAgY29uc3QgYW5ub3RhdGlvblJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTAsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLnVybCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QoZGF0YS51bnNhZmVVcmwpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuZGVzdCkudG9FcXVhbChbeworICAgICAgICAgIG51bTogMTcsCisgICAgICAgICAgZ2VuOiAwCisgICAgICAgIH0sIHsKKyAgICAgICAgICBuYW1lOiAiWFlaIgorICAgICAgICB9LCAwLCA4NDEuODksIG51bGxdKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNvcnJlY3RseSBwYXJzZSBhIERlc3QsIHdoaWNoIHZpb2xhdGVzIHRoZSBzcGVjaWZpY2F0aW9uICIgKyAiYnkgY29udGFpbmluZyBhIGRpY3Rpb25hcnkiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgZGVzdERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZGVzdERpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFjdGlvbiIpKTsKKyAgICAgIGRlc3REaWN0LnNldCgiUyIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJHb1RvIikpOworICAgICAgZGVzdERpY3Quc2V0KCJEIiwgInBhZ2UuMTU3Iik7CisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiTGluayIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiRGVzdCIsIGRlc3REaWN0KTsKKworICAgICAgY29uc3QgYW5ub3RhdGlvblJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoNzk4LCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGFubm90YXRpb25SZWYsCisgICAgICAgIGRhdGE6IGFubm90YXRpb25EaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBhbm5vdGF0aW9uUmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLkxJTkspOworICAgICAgICBleHBlY3QoZGF0YS51cmwpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudW5zYWZlVXJsKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGV4cGVjdChkYXRhLmRlc3QpLnRvRXF1YWwoInBhZ2UuMTU3Iik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBub3Qgc2V0IHF1YWRwb2ludHMgaWYgbm90IGRlZmluZWQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxpbmsiKSk7CisKKyAgICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyMSwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBhbm5vdGF0aW9uUmVmLAorICAgICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYW5ub3RhdGlvblJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucXVhZFBvaW50cykudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IHF1YWRwb2ludHMgaWYgZGVmaW5lZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBhbm5vdGF0aW9uRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiTGluayIpKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiUmVjdCIsIFsxMCwgMTAsIDIwLCAyMF0pOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJRdWFkUG9pbnRzIiwgWzExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNF0pOworCisgICAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGFubm90YXRpb25SZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLnF1YWRQb2ludHMpLnRvRXF1YWwoW1t7CisgICAgICAgICAgeDogMTEsCisgICAgICAgICAgeTogMTEKKyAgICAgICAgfSwgeworICAgICAgICAgIHg6IDEyLAorICAgICAgICAgIHk6IDEyCisgICAgICAgIH0sIHsKKyAgICAgICAgICB4OiAxMywKKyAgICAgICAgICB5OiAxMworICAgICAgICB9LCB7CisgICAgICAgICAgeDogMTQsCisgICAgICAgICAgeTogMTQKKyAgICAgICAgfV1dKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJXaWRnZXRBbm5vdGF0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgIGxldCB3aWRnZXREaWN0OworICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHdpZGdldERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgd2lkZ2V0RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICB3aWRnZXREaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJXaWRnZXQiKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIHdpZGdldERpY3QgPSBudWxsOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIHVua25vd24gZmllbGQgbmFtZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3Qgd2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgyMCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiB3aWRnZXRSZWYsCisgICAgICAgIGRhdGE6IHdpZGdldERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQpOworICAgICAgICBleHBlY3QoZGF0YS5maWVsZE5hbWUpLnRvRXF1YWwoIiIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29uc3RydWN0IHRoZSBmaWVsZCBuYW1lIHdoZW4gdGhlcmUgYXJlIG5vIGFuY2VzdG9ycyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB3aWRnZXREaWN0LnNldCgiVCIsICJmb28iKTsKKworICAgICAgY29uc3Qgd2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgyMSwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiB3aWRnZXRSZWYsCisgICAgICAgIGRhdGE6IHdpZGdldERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQpOworICAgICAgICBleHBlY3QoZGF0YS5maWVsZE5hbWUpLnRvRXF1YWwoImZvbyIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29uc3RydWN0IHRoZSBmaWVsZCBuYW1lIHdoZW4gdGhlcmUgYXJlIGFuY2VzdG9ycyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBmaXJzdFBhcmVudCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBmaXJzdFBhcmVudC5zZXQoIlQiLCAiZm9vIik7CisgICAgICBjb25zdCBzZWNvbmRQYXJlbnQgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgc2Vjb25kUGFyZW50LnNldCgiUGFyZW50IiwgZmlyc3RQYXJlbnQpOworICAgICAgc2Vjb25kUGFyZW50LnNldCgiVCIsICJiYXIiKTsKKyAgICAgIHdpZGdldERpY3Quc2V0KCJQYXJlbnQiLCBzZWNvbmRQYXJlbnQpOworICAgICAgd2lkZ2V0RGljdC5zZXQoIlQiLCAiYmF6Iik7CisKKyAgICAgIGNvbnN0IHdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMjIsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogd2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiB3aWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCB3aWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuZmllbGROYW1lKS50b0VxdWFsKCJmb28uYmFyLmJheiIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29uc3RydWN0IHRoZSBmaWVsZCBuYW1lIGlmIGEgcGFyZW50IGlzIG5vdCBhIGRpY3Rpb25hcnkgIiArICIoaXNzdWUgODE0MykiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgcGFyZW50RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBwYXJlbnREaWN0LnNldCgiUGFyZW50IiwgbnVsbCk7CisgICAgICBwYXJlbnREaWN0LnNldCgiVCIsICJmb28iKTsKKyAgICAgIHdpZGdldERpY3Quc2V0KCJQYXJlbnQiLCBwYXJlbnREaWN0KTsKKyAgICAgIHdpZGdldERpY3Quc2V0KCJUIiwgImJhciIpOworCisgICAgICBjb25zdCB3aWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDIyLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogd2lkZ2V0RGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgd2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVCk7CisgICAgICAgIGV4cGVjdChkYXRhLmZpZWxkTmFtZSkudG9FcXVhbCgiZm9vLmJhciIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlRleHRXaWRnZXRBbm5vdGF0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgIGxldCB0ZXh0V2lkZ2V0RGljdCwgZm9udFJlZk9iajsKKyAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB0ZXh0V2lkZ2V0RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiV2lkZ2V0IikpOworICAgICAgdGV4dFdpZGdldERpY3Quc2V0KCJGVCIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJUeCIpKTsKKyAgICAgIGNvbnN0IGhlbHZEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGhlbHZEaWN0LnNldCgiQmFzZUZvbnQiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSGVsdmV0aWNhIikpOworICAgICAgaGVsdkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZvbnQiKSk7CisgICAgICBoZWx2RGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVHlwZTEiKSk7CisKKyAgICAgIGNvbnN0IGZvbnRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDMxNCwgMCk7CisKKyAgICAgIGZvbnRSZWZPYmogPSB7CisgICAgICAgIHJlZjogZm9udFJlZiwKKyAgICAgICAgZGF0YTogaGVsdkRpY3QKKyAgICAgIH07CisgICAgICBjb25zdCByZXNvdXJjZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgY29uc3QgZm9udERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZm9udERpY3Quc2V0KCJIZWx2IiwgZm9udFJlZik7CisgICAgICByZXNvdXJjZURpY3Quc2V0KCJGb250IiwgZm9udERpY3QpOworICAgICAgdGV4dFdpZGdldERpY3Quc2V0KCJEQSIsICIvSGVsdiA1IFRmIik7CisgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIkRSIiwgcmVzb3VyY2VEaWN0KTsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiUmVjdCIsIFswLCAwLCAzMiwgMTBdKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkgeworICAgICAgdGV4dFdpZGdldERpY3QgPSBmb250UmVmT2JqID0gbnVsbDsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSB1bmtub3duIHRleHQgYWxpZ25tZW50LCBtYXhpbXVtIGxlbmd0aCBhbmQgZmxhZ3MiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgdGV4dFdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTI0LCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHRleHRXaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IHRleHRXaWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCB0ZXh0V2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVCk7CisgICAgICAgIGV4cGVjdChkYXRhLnRleHRBbGlnbm1lbnQpLnRvRXF1YWwobnVsbCk7CisgICAgICAgIGV4cGVjdChkYXRhLm1heExlbikudG9FcXVhbChudWxsKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucmVhZE9ubHkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBleHBlY3QoZGF0YS5tdWx0aUxpbmUpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBleHBlY3QoZGF0YS5jb21iKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIG5vdCBzZXQgaW52YWxpZCB0ZXh0IGFsaWdubWVudCwgbWF4aW11bSBsZW5ndGggYW5kIGZsYWdzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiUSIsICJjZW50ZXIiKTsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiTWF4TGVuIiwgImZpdmUiKTsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiRmYiLCAicmVhZG9ubHkiKTsKKworICAgICAgY29uc3QgdGV4dFdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoNDMsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogdGV4dFdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogdGV4dFdpZGdldERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHRleHRXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEudGV4dEFsaWdubWVudCkudG9FcXVhbChudWxsKTsKKyAgICAgICAgZXhwZWN0KGRhdGEubWF4TGVuKS50b0VxdWFsKG51bGwpOworICAgICAgICBleHBlY3QoZGF0YS5yZWFkT25seSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChkYXRhLm11bHRpTGluZSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChkYXRhLmNvbWIpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IHZhbGlkIHRleHQgYWxpZ25tZW50LCBtYXhpbXVtIGxlbmd0aCBhbmQgZmxhZ3MiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdGV4dFdpZGdldERpY3Quc2V0KCJRIiwgMSk7CisgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIk1heExlbiIsIDIwKTsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiRmYiLCBfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlJFQURPTkxZICsgX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpOworCisgICAgICBjb25zdCB0ZXh0V2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg4NCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiB0ZXh0V2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiB0ZXh0V2lkZ2V0RGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgdGV4dFdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQpOworICAgICAgICBleHBlY3QoZGF0YS50ZXh0QWxpZ25tZW50KS50b0VxdWFsKDEpOworICAgICAgICBleHBlY3QoZGF0YS5tYXhMZW4pLnRvRXF1YWwoMjApOworICAgICAgICBleHBlY3QoZGF0YS5yZWFkT25seSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGRhdGEubXVsdGlMaW5lKS50b0VxdWFsKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVqZWN0IGNvbWIgZmllbGRzIHdpdGhvdXQgYSBtYXhpbXVtIGxlbmd0aCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIkZmIiwgX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKTsKKworICAgICAgY29uc3QgdGV4dFdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoNDYsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogdGV4dFdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogdGV4dFdpZGdldERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHRleHRXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuY29tYikudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBhY2NlcHQgY29tYiBmaWVsZHMgd2l0aCBhIG1heGltdW0gbGVuZ3RoIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiTWF4TGVuIiwgMjApOworICAgICAgdGV4dFdpZGdldERpY3Quc2V0KCJGZiIsIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuQ09NQik7CisKKyAgICAgIGNvbnN0IHRleHRXaWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDQ2LCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHRleHRXaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IHRleHRXaWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCB0ZXh0V2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVCk7CisgICAgICAgIGV4cGVjdChkYXRhLmNvbWIpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBvbmx5IGFjY2VwdCBjb21iIGZpZWxkcyB3aGVuIHRoZSBmbGFncyBhcmUgdmFsaWQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgaW52YWxpZEZpZWxkRmxhZ3MgPSBbX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUsIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQsIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuRklMRVNFTEVDVF07CisgICAgICBsZXQgZmxhZ3MgPSBfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLkNPTUIgKyBfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSArIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQgKyBfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLkZJTEVTRUxFQ1Q7CisgICAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOworCisgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbnZhbGlkRmllbGRGbGFncy5sZW5ndGg7IGkgPD0gaWk7IGkrKykgeworICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIk1heExlbiIsIDIwKTsKKyAgICAgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIkZmIiwgZmxhZ3MpOworCisgICAgICAgICAgY29uc3QgdGV4dFdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoOTMsIDApOworCisgICAgICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICAgICAgcmVmOiB0ZXh0V2lkZ2V0UmVmLAorICAgICAgICAgICAgZGF0YTogdGV4dFdpZGdldERpY3QKKyAgICAgICAgICB9XSk7CisgICAgICAgICAgcmV0dXJuIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCB0ZXh0V2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICAgICAgZGF0YQorICAgICAgICAgIH0pID0+IHsKKyAgICAgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVCk7CisgICAgICAgICAgICBjb25zdCB2YWxpZCA9IGludmFsaWRGaWVsZEZsYWdzLmxlbmd0aCA9PT0gMDsKKyAgICAgICAgICAgIGV4cGVjdChkYXRhLmNvbWIpLnRvRXF1YWwodmFsaWQpOworCisgICAgICAgICAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgICAgICAgIGZsYWdzIC09IGludmFsaWRGaWVsZEZsYWdzLnBvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcHJvbWlzZS50aGVuKGRvbmUsIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZW5kZXIgcmVndWxhciB0ZXh0IGZvciBwcmludGluZyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCB0ZXh0V2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgyNzEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogdGV4dFdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogdGV4dFdpZGdldERpY3QKKyAgICAgIH0sIGZvbnRSZWZPYmpdKTsKKyAgICAgIGNvbnN0IHRhc2sgPSBuZXcgX3dvcmtlci5Xb3JrZXJUYXNrKCJ0ZXN0IHByaW50Iik7CisgICAgICBwYXJ0aWFsRXZhbHVhdG9yLnhyZWYgPSB4cmVmOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgdGV4dFdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oYW5ub3RhdGlvbiA9PiB7CisgICAgICAgIGNvbnN0IGlkID0gYW5ub3RhdGlvbi5kYXRhLmlkOworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVtpZF0gPSAidGVzdFxccHJpbnQiOworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5fZ2V0QXBwZWFyYW5jZShwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisgICAgICB9LCBkb25lLmZhaWwpLnRoZW4oYXBwZWFyYW5jZSA9PiB7CisgICAgICAgIGV4cGVjdChhcHBlYXJhbmNlKS50b0VxdWFsKCIvVHggQk1DIHEgQlQgL0hlbHYgNSBUZiAxIDAgMCAxIDAgMCBUbSIgKyAiIDIuMDAgMi4wMCBUZCAodGVzdFxcXFxwcmludCkgVGogRVQgUSBFTUMiKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHJlbmRlciBhdXRvLXNpemVkIHRleHQgZm9yIHByaW50aW5nIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiREEiLCAiL0hlbHYgMCBUZiIpOworCisgICAgICBjb25zdCB0ZXh0V2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgyNzEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogdGV4dFdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogdGV4dFdpZGdldERpY3QKKyAgICAgIH0sIGZvbnRSZWZPYmpdKTsKKyAgICAgIGNvbnN0IHRhc2sgPSBuZXcgX3dvcmtlci5Xb3JrZXJUYXNrKCJ0ZXN0IHByaW50Iik7CisgICAgICBwYXJ0aWFsRXZhbHVhdG9yLnhyZWYgPSB4cmVmOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgdGV4dFdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oYW5ub3RhdGlvbiA9PiB7CisgICAgICAgIGNvbnN0IGlkID0gYW5ub3RhdGlvbi5kYXRhLmlkOworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVtpZF0gPSAidGVzdCAocHJpbnQpIjsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb24uX2dldEFwcGVhcmFuY2UocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGFwcGVhcmFuY2UgPT4geworICAgICAgICBleHBlY3QoYXBwZWFyYW5jZSkudG9FcXVhbCgiL1R4IEJNQyBxIEJUIC9IZWx2IDExIFRmIDEgMCAwIDEgMCAwIFRtIiArICIgMi4wMCAyLjAwIFRkICh0ZXN0IFxcKHByaW50XFwpKSBUaiBFVCBRIEVNQyIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IHJlbmRlciBhIHBhc3N3b3JkIGZvciBwcmludGluZyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIkZmIiwgX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCk7CisKKyAgICAgIGNvbnN0IHRleHRXaWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDI3MSwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiB0ZXh0V2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiB0ZXh0V2lkZ2V0RGljdAorICAgICAgfSwgZm9udFJlZk9ial0pOworICAgICAgY29uc3QgdGFzayA9IG5ldyBfd29ya2VyLldvcmtlclRhc2soInRlc3QgcHJpbnQiKTsKKyAgICAgIHBhcnRpYWxFdmFsdWF0b3IueHJlZiA9IHhyZWY7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCB0ZXh0V2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbihhbm5vdGF0aW9uID0+IHsKKyAgICAgICAgY29uc3QgaWQgPSBhbm5vdGF0aW9uLmRhdGEuaWQ7CisgICAgICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0ge307CisgICAgICAgIGFubm90YXRpb25TdG9yYWdlW2lkXSA9ICJteXBhc3N3b3JkIjsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb24uX2dldEFwcGVhcmFuY2UocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGFwcGVhcmFuY2UgPT4geworICAgICAgICBleHBlY3QoYXBwZWFyYW5jZSkudG9FcXVhbChudWxsKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHJlbmRlciBtdWx0aWxpbmUgdGV4dCBmb3IgcHJpbnRpbmciLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdGV4dFdpZGdldERpY3Quc2V0KCJGZiIsIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuTVVMVElMSU5FKTsKKworICAgICAgY29uc3QgdGV4dFdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMjcxLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHRleHRXaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IHRleHRXaWRnZXREaWN0CisgICAgICB9LCBmb250UmVmT2JqXSk7CisgICAgICBjb25zdCB0YXNrID0gbmV3IF93b3JrZXIuV29ya2VyVGFzaygidGVzdCBwcmludCIpOworICAgICAgcGFydGlhbEV2YWx1YXRvci54cmVmID0geHJlZjsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHRleHRXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKGFubm90YXRpb24gPT4geworICAgICAgICBjb25zdCBpZCA9IGFubm90YXRpb24uZGF0YS5pZDsKKyAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSB7fTsKKyAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VbaWRdID0gImEgYWEgYWFhIGFhYWEgYWFhYWEgYWFhYWFhICIgKyAicG5ldW1vbm91bHRyYW1pY3Jvc2NvcGljc2lsaWNvdm9sY2Fub2Nvbmlvc2lzIjsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb24uX2dldEFwcGVhcmFuY2UocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGFwcGVhcmFuY2UgPT4geworICAgICAgICBleHBlY3QoYXBwZWFyYW5jZSkudG9FcXVhbCgiL1R4IEJNQyBxIEJUIC9IZWx2IDUgVGYgMSAwIDAgMSAwIDEwIFRtICIgKyAiMi4wMCAtNS4wMCBUZCAoYSBhYSBhYWEgKSBUalxuIiArICIwLjAwIC01LjAwIFRkIChhYWFhIGFhYWFhICkgVGpcbiIgKyAiMC4wMCAtNS4wMCBUZCAoYWFhYWFhICkgVGpcbiIgKyAiMC4wMCAtNS4wMCBUZCAocG5ldW1vbm91bHRyKSBUalxuIiArICIwLjAwIC01LjAwIFRkIChhbWljcm9zY29waSkgVGpcbiIgKyAiMC4wMCAtNS4wMCBUZCAoY3NpbGljb3ZvbGNhKSBUalxuIiArICIwLjAwIC01LjAwIFRkIChub2Nvbmlvc2lzKSBUaiBFVCBRIEVNQyIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVuZGVyIG11bHRpbGluZSB0ZXh0IHdpdGggdmFyaW91cyBFT0wgZm9yIHByaW50aW5nIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiRmYiLCBfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7CisgICAgICB0ZXh0V2lkZ2V0RGljdC5zZXQoIlJlY3QiLCBbMCwgMCwgMTI4LCAxMF0pOworCisgICAgICBjb25zdCB0ZXh0V2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgyNzEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogdGV4dFdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogdGV4dFdpZGdldERpY3QKKyAgICAgIH0sIGZvbnRSZWZPYmpdKTsKKyAgICAgIGNvbnN0IHRhc2sgPSBuZXcgX3dvcmtlci5Xb3JrZXJUYXNrKCJ0ZXN0IHByaW50Iik7CisgICAgICBwYXJ0aWFsRXZhbHVhdG9yLnhyZWYgPSB4cmVmOworICAgICAgY29uc3QgZXhwZWN0ZWRBcHBlYXJhbmNlID0gIi9UeCBCTUMgcSBCVCAvSGVsdiA1IFRmIDEgMCAwIDEgMCAxMCBUbSAiICsgIjIuMDAgLTUuMDAgVGQgIiArICIoTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4pIFRqXG4iICsgIjAuMDAgLTUuMDAgVGQgIiArICIoQWxpcXVhbSB2aXRhZSBmZWxpcyBhYyBsZWN0dXMgYmliZW5kdW0gdWx0cmljaWVzIHF1aXMgbm9uKSBUalxuIiArICIwLjAwIC01LjAwIFRkICIgKyAiKCBkaWFtLikgVGpcbiIgKyAiMC4wMCAtNS4wMCBUZCAiICsgIihNb3JiaSBpZCBwb3J0dGl0b3IgcXVhbSwgYSBpYWN1bGlzIGR1aS4pIFRqXG4iICsgIjAuMDAgLTUuMDAgVGQgIiArICIoUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cyBldCBuZXR1cyApIFRqXG4iICsgIjAuMDAgLTUuMDAgVGQgIiArICIoZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLikgVGpcbiIgKyAiMC4wMCAtNS4wMCBUZCAoKSBUalxuIiArICIwLjAwIC01LjAwIFRkICgpIFRqXG4iICsgIjAuMDAgLTUuMDAgVGQgIiArICIoTnVsbGEgY29uc2VjdGV0dXIsIGxpZ3VsYSBpbiB0aW5jaWR1bnQgcGxhY2VyYXQsIHZlbGl0ICkgVGpcbiIgKyAiMC4wMCAtNS4wMCBUZCAiICsgIihhdWd1ZSBjb25zZWN0ZXR1ciBvcmNpLCBzZWQgbWF0dGlzIGxpYmVybyBudW5jIHV0IG1hc3NhLikgVGpcbiIgKyAiMC4wMCAtNS4wMCBUZCAiICsgIihFdGlhbSBmYWNpbGlzaXMgdGVtcHVzIGludGVyZHVtLikgVGogRVQgUSBFTUMiOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgdGV4dFdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oYW5ub3RhdGlvbiA9PiB7CisgICAgICAgIGNvbnN0IGlkID0gYW5ub3RhdGlvbi5kYXRhLmlkOworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVtpZF0gPSAiTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC5cciIgKyAiQWxpcXVhbSB2aXRhZSBmZWxpcyBhYyBsZWN0dXMgYmliZW5kdW0gdWx0cmljaWVzIHF1aXMgbm9uIGRpYW0uXG4iICsgIk1vcmJpIGlkIHBvcnR0aXRvciBxdWFtLCBhIGlhY3VsaXMgZHVpLlxyXG4iICsgIlBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgIiArICJuZXR1cyBldCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycGlzIGVnZXN0YXMuXG5cclxuXHIiICsgIk51bGxhIGNvbnNlY3RldHVyLCBsaWd1bGEgaW4gdGluY2lkdW50IHBsYWNlcmF0LCAiICsgInZlbGl0IGF1Z3VlIGNvbnNlY3RldHVyIG9yY2ksIHNlZCBtYXR0aXMgbGliZXJvIG51bmMgdXQgbWFzc2EuXHIiICsgIkV0aWFtIGZhY2lsaXNpcyB0ZW1wdXMgaW50ZXJkdW0uIjsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb24uX2dldEFwcGVhcmFuY2UocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGFwcGVhcmFuY2UgPT4geworICAgICAgICBleHBlY3QoYXBwZWFyYW5jZSkudG9FcXVhbChleHBlY3RlZEFwcGVhcmFuY2UpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVuZGVyIGNvbWIgZm9yIHByaW50aW5nIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHRleHRXaWRnZXREaWN0LnNldCgiRmYiLCBfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLkNPTUIpOworICAgICAgdGV4dFdpZGdldERpY3Quc2V0KCJNYXhMZW4iLCA0KTsKKworICAgICAgY29uc3QgdGV4dFdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMjcxLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHRleHRXaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IHRleHRXaWRnZXREaWN0CisgICAgICB9LCBmb250UmVmT2JqXSk7CisgICAgICBjb25zdCB0YXNrID0gbmV3IF93b3JrZXIuV29ya2VyVGFzaygidGVzdCBwcmludCIpOworICAgICAgcGFydGlhbEV2YWx1YXRvci54cmVmID0geHJlZjsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHRleHRXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKGFubm90YXRpb24gPT4geworICAgICAgICBjb25zdCBpZCA9IGFubm90YXRpb24uZGF0YS5pZDsKKyAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSB7fTsKKyAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VbaWRdID0gImFhKGFhKWFcXCI7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLl9nZXRBcHBlYXJhbmNlKHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICAgIH0sIGRvbmUuZmFpbCkudGhlbihhcHBlYXJhbmNlID0+IHsKKyAgICAgICAgZXhwZWN0KGFwcGVhcmFuY2UpLnRvRXF1YWwoIi9UeCBCTUMgcSBCVCAvSGVsdiA1IFRmIDEgMCAwIDEgMiAyIFRtIiArICIgKGEpIFRqIDguMDAgMCBUZCAoYSkgVGogOC4wMCAwIFRkIChcXCgpIFRqIiArICIgOC4wMCAwIFRkIChhKSBUaiA4LjAwIDAgVGQgKGEpIFRqIiArICIgOC4wMCAwIFRkIChcXCkpIFRqIDguMDAgMCBUZCAoYSkgVGoiICsgIiA4LjAwIDAgVGQgKFxcXFwpIFRqIEVUIFEgRU1DIik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBzYXZlIHRleHQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgdGV4dFdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTIzLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHRleHRXaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IHRleHRXaWRnZXREaWN0CisgICAgICB9XSk7CisgICAgICBwYXJ0aWFsRXZhbHVhdG9yLnhyZWYgPSB4cmVmOworICAgICAgY29uc3QgdGFzayA9IG5ldyBfd29ya2VyLldvcmtlclRhc2soInRlc3Qgc2F2ZSIpOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgdGV4dFdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oYW5ub3RhdGlvbiA9PiB7CisgICAgICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0ge307CisgICAgICAgIGFubm90YXRpb25TdG9yYWdlW2Fubm90YXRpb24uZGF0YS5pZF0gPSAiaGVsbG8gd29ybGQiOworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5zYXZlKHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICAgIH0sIGRvbmUuZmFpbCkudGhlbihkYXRhID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEubGVuZ3RoKS50b0VxdWFsKDIpOworICAgICAgICBjb25zdCBbb2xkRGF0YSwgbmV3RGF0YV0gPSBkYXRhOworICAgICAgICBleHBlY3Qob2xkRGF0YS5yZWYpLnRvRXF1YWwoX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjMsIDApKTsKKyAgICAgICAgZXhwZWN0KG5ld0RhdGEucmVmKS50b0VxdWFsKF9wcmltaXRpdmVzLlJlZi5nZXQoMSwgMCkpOworICAgICAgICBvbGREYXRhLmRhdGEgPSBvbGREYXRhLmRhdGEucmVwbGFjZSgvXChEOlswLTldK1wpLywgIihkYXRlKSIpOworICAgICAgICBleHBlY3Qob2xkRGF0YS5kYXRhKS50b0VxdWFsKCIxMjMgMCBvYmpcbiIgKyAiPDwgL1R5cGUgL0Fubm90IC9TdWJ0eXBlIC9XaWRnZXQgL0ZUIC9UeCAvREEgKC9IZWx2IDUgVGYpIC9EUiAiICsgIjw8IC9Gb250IDw8IC9IZWx2IDMxNCAwIFI+Pj4+IC9SZWN0IFswIDAgMzIgMTBdICIgKyAiL1YgKGhlbGxvIHdvcmxkKSAvQVAgPDwgL04gMSAwIFI+PiAvTSAoZGF0ZSk+PlxuZW5kb2JqXG4iKTsKKyAgICAgICAgZXhwZWN0KG5ld0RhdGEuZGF0YSkudG9FcXVhbCgiMSAwIG9ialxuPDwgL0xlbmd0aCA3NyAvU3VidHlwZSAvRm9ybSAvUmVzb3VyY2VzICIgKyAiPDwgL0ZvbnQgPDwgL0hlbHYgMzE0IDAgUj4+Pj4gL0JCb3ggWzAgMCAzMiAxMF0+PiBzdHJlYW1cbiIgKyAiL1R4IEJNQyBxIEJUIC9IZWx2IDUgVGYgMSAwIDAgMSAwIDAgVG0gMi4wMCAyLjAwIFRkIChoZWxsbyB3b3JsZCkgVGogIiArICJFVCBRIEVNQ1xuZW5kc3RyZWFtXG5lbmRvYmpcbiIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkJ1dHRvbldpZGdldEFubm90YXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgbGV0IGJ1dHRvbldpZGdldERpY3Q7CisgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoZG9uZSkgeworICAgICAgYnV0dG9uV2lkZ2V0RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBidXR0b25XaWRnZXREaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIldpZGdldCIpKTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJGVCIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJCdG4iKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIGJ1dHRvbldpZGdldERpY3QgPSBudWxsOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIGNoZWNrYm94ZXMgd2l0aCBleHBvcnQgdmFsdWUiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIlYiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiMSIpKTsKKyAgICAgIGNvbnN0IGFwcGVhcmFuY2VTdGF0ZXNEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIG5vcm1hbEFwcGVhcmFuY2VEaWN0LnNldCgiT2ZmIiwgMCk7CisgICAgICBub3JtYWxBcHBlYXJhbmNlRGljdC5zZXQoIkNoZWNrZWQiLCAxKTsKKyAgICAgIGFwcGVhcmFuY2VTdGF0ZXNEaWN0LnNldCgiTiIsIG5vcm1hbEFwcGVhcmFuY2VEaWN0KTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJBUCIsIGFwcGVhcmFuY2VTdGF0ZXNEaWN0KTsKKworICAgICAgY29uc3QgYnV0dG9uV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjQsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYnV0dG9uV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBidXR0b25XaWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBidXR0b25XaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuY2hlY2tCb3gpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChkYXRhLmZpZWxkVmFsdWUpLnRvRXF1YWwoIjEiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucmFkaW9CdXR0b24pLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBleHBlY3QoZGF0YS5leHBvcnRWYWx1ZSkudG9FcXVhbCgiQ2hlY2tlZCIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIGNoZWNrYm94ZXMgd2l0aG91dCBleHBvcnQgdmFsdWUiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIlYiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiMSIpKTsKKworICAgICAgY29uc3QgYnV0dG9uV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjQsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYnV0dG9uV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBidXR0b25XaWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBidXR0b25XaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuY2hlY2tCb3gpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChkYXRhLmZpZWxkVmFsdWUpLnRvRXF1YWwoIjEiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucmFkaW9CdXR0b24pLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIGNoZWNrYm94ZXMgd2l0aG91dCAvT2ZmIGFwcGVhcmFuY2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIlYiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiMSIpKTsKKyAgICAgIGNvbnN0IGFwcGVhcmFuY2VTdGF0ZXNEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIG5vcm1hbEFwcGVhcmFuY2VEaWN0LnNldCgiQ2hlY2tlZCIsIDEpOworICAgICAgYXBwZWFyYW5jZVN0YXRlc0RpY3Quc2V0KCJOIiwgbm9ybWFsQXBwZWFyYW5jZURpY3QpOworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIkFQIiwgYXBwZWFyYW5jZVN0YXRlc0RpY3QpOworCisgICAgICBjb25zdCBidXR0b25XaWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyNCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBidXR0b25XaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IGJ1dHRvbldpZGdldERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGJ1dHRvbldpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQpOworICAgICAgICBleHBlY3QoZGF0YS5jaGVja0JveCkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuZmllbGRWYWx1ZSkudG9FcXVhbCgiMSIpOworICAgICAgICBleHBlY3QoZGF0YS5yYWRpb0J1dHRvbikudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChkYXRhLmV4cG9ydFZhbHVlKS50b0VxdWFsKCJDaGVja2VkIik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZW5kZXIgY2hlY2tib3hlcyBmb3IgcHJpbnRpbmciLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlc0RpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgY29uc3QgY2hlY2tlZEFwcGVhcmFuY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IGNoZWNrZWRTdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjAuMSAwLjIgMC4zIHJnIik7CisgICAgICBjaGVja2VkU3RyZWFtLmRpY3QgPSBjaGVja2VkQXBwZWFyYW5jZURpY3Q7CisgICAgICBjb25zdCB1bmNoZWNrZWRTdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjAuMyAwLjIgMC4xIHJnIik7CisgICAgICB1bmNoZWNrZWRTdHJlYW0uZGljdCA9IHVuY2hlY2tlZEFwcGVhcmFuY2VEaWN0OworICAgICAgY2hlY2tlZEFwcGVhcmFuY2VEaWN0LnNldCgiQkJveCIsIFswLCAwLCA4LCA4XSk7CisgICAgICBjaGVja2VkQXBwZWFyYW5jZURpY3Quc2V0KCJGb3JtVHlwZSIsIDEpOworICAgICAgY2hlY2tlZEFwcGVhcmFuY2VEaWN0LnNldCgiTWF0cml4IiwgWzEsIDAsIDAsIDEsIDAsIDBdKTsKKyAgICAgIG5vcm1hbEFwcGVhcmFuY2VEaWN0LnNldCgiQ2hlY2tlZCIsIGNoZWNrZWRTdHJlYW0pOworICAgICAgbm9ybWFsQXBwZWFyYW5jZURpY3Quc2V0KCJPZmYiLCB1bmNoZWNrZWRTdHJlYW0pOworICAgICAgYXBwZWFyYW5jZVN0YXRlc0RpY3Quc2V0KCJOIiwgbm9ybWFsQXBwZWFyYW5jZURpY3QpOworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIkFQIiwgYXBwZWFyYW5jZVN0YXRlc0RpY3QpOworCisgICAgICBjb25zdCBidXR0b25XaWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyNCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBidXR0b25XaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IGJ1dHRvbldpZGdldERpY3QKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHRhc2sgPSBuZXcgX3dvcmtlci5Xb3JrZXJUYXNrKCJ0ZXN0IHByaW50Iik7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBidXR0b25XaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKGFubm90YXRpb24gPT4geworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVthbm5vdGF0aW9uLmRhdGEuaWRdID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFthbm5vdGF0aW9uLCBhbm5vdGF0aW9uLmdldE9wZXJhdG9yTGlzdChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBmYWxzZSwgYW5ub3RhdGlvblN0b3JhZ2UpXSk7CisgICAgICB9LCBkb25lLmZhaWwpLnRoZW4oKFthbm5vdGF0aW9uLCBvcExpc3RdKSA9PiB7CisgICAgICAgIGV4cGVjdChvcExpc3QuYXJnc0FycmF5Lmxlbmd0aCkudG9FcXVhbCgzKTsKKyAgICAgICAgZXhwZWN0KG9wTGlzdC5mbkFycmF5KS50b0VxdWFsKFtfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9uLCBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yLCBfdXRpbC5PUFMuZW5kQW5ub3RhdGlvbl0pOworICAgICAgICBleHBlY3Qob3BMaXN0LmFyZ3NBcnJheVsxXSkudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzI2LCA1MSwgNzZdKSk7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGFubm90YXRpb24gPT4geworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVthbm5vdGF0aW9uLmRhdGEuaWRdID0gZmFsc2U7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLmdldE9wZXJhdG9yTGlzdChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBmYWxzZSwgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKG9wTGlzdCA9PiB7CisgICAgICAgIGV4cGVjdChvcExpc3QuYXJnc0FycmF5Lmxlbmd0aCkudG9FcXVhbCgzKTsKKyAgICAgICAgZXhwZWN0KG9wTGlzdC5mbkFycmF5KS50b0VxdWFsKFtfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9uLCBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yLCBfdXRpbC5PUFMuZW5kQW5ub3RhdGlvbl0pOworICAgICAgICBleHBlY3Qob3BMaXN0LmFyZ3NBcnJheVsxXSkudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzc2LCA1MSwgMjZdKSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBzYXZlIGNoZWNrYm94ZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlc0RpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgbm9ybWFsQXBwZWFyYW5jZURpY3Quc2V0KCJDaGVja2VkIiwgX3ByaW1pdGl2ZXMuUmVmLmdldCgzMTQsIDApKTsKKyAgICAgIG5vcm1hbEFwcGVhcmFuY2VEaWN0LnNldCgiT2ZmIiwgX3ByaW1pdGl2ZXMuUmVmLmdldCgyNzEsIDApKTsKKyAgICAgIGFwcGVhcmFuY2VTdGF0ZXNEaWN0LnNldCgiTiIsIG5vcm1hbEFwcGVhcmFuY2VEaWN0KTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJBUCIsIGFwcGVhcmFuY2VTdGF0ZXNEaWN0KTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJWIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIk9mZiIpKTsKKworICAgICAgY29uc3QgYnV0dG9uV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjMsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYnV0dG9uV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBidXR0b25XaWRnZXREaWN0CisgICAgICB9XSk7CisgICAgICBwYXJ0aWFsRXZhbHVhdG9yLnhyZWYgPSB4cmVmOworICAgICAgY29uc3QgdGFzayA9IG5ldyBfd29ya2VyLldvcmtlclRhc2soInRlc3Qgc2F2ZSIpOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYnV0dG9uV2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbihhbm5vdGF0aW9uID0+IHsKKyAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSB7fTsKKyAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VbYW5ub3RhdGlvbi5kYXRhLmlkXSA9IHRydWU7CisgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbYW5ub3RhdGlvbiwgYW5ub3RhdGlvbi5zYXZlKHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKV0pOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKChbYW5ub3RhdGlvbiwgW29sZERhdGFdXSkgPT4geworICAgICAgICBvbGREYXRhLmRhdGEgPSBvbGREYXRhLmRhdGEucmVwbGFjZSgvXChEOlswLTldK1wpLywgIihkYXRlKSIpOworICAgICAgICBleHBlY3Qob2xkRGF0YS5yZWYpLnRvRXF1YWwoX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjMsIDApKTsKKyAgICAgICAgZXhwZWN0KG9sZERhdGEuZGF0YSkudG9FcXVhbCgiMTIzIDAgb2JqXG4iICsgIjw8IC9UeXBlIC9Bbm5vdCAvU3VidHlwZSAvV2lkZ2V0IC9GVCAvQnRuICIgKyAiL0FQIDw8IC9OIDw8IC9DaGVja2VkIDMxNCAwIFIgL09mZiAyNzEgMCBSPj4+PiAiICsgIi9WIC9DaGVja2VkIC9BUyAvQ2hlY2tlZCAvTSAoZGF0ZSk+PlxuZW5kb2JqXG4iKTsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb247CisgICAgICB9LCBkb25lLmZhaWwpLnRoZW4oYW5ub3RhdGlvbiA9PiB7CisgICAgICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0ge307CisgICAgICAgIGFubm90YXRpb25TdG9yYWdlW2Fubm90YXRpb24uZGF0YS5pZF0gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb24uc2F2ZShwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSk7CisgICAgICB9LCBkb25lLmZhaWwpLnRoZW4oZGF0YSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhKS50b0VxdWFsKG51bGwpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIHJhZGlvIGJ1dHRvbnMgd2l0aCBhIGZpZWxkIHZhbHVlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IHBhcmVudERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgcGFyZW50RGljdC5zZXQoIlYiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiMSIpKTsKKyAgICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgbm9ybWFsQXBwZWFyYW5jZVN0YXRlRGljdC5zZXQoIjIiLCBudWxsKTsKKyAgICAgIGNvbnN0IGFwcGVhcmFuY2VTdGF0ZXNEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFwcGVhcmFuY2VTdGF0ZXNEaWN0LnNldCgiTiIsIG5vcm1hbEFwcGVhcmFuY2VTdGF0ZURpY3QpOworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIkZmIiwgX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5SQURJTyk7CisgICAgICBidXR0b25XaWRnZXREaWN0LnNldCgiUGFyZW50IiwgcGFyZW50RGljdCk7CisgICAgICBidXR0b25XaWRnZXREaWN0LnNldCgiQVAiLCBhcHBlYXJhbmNlU3RhdGVzRGljdCk7CisKKyAgICAgIGNvbnN0IGJ1dHRvbldpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTI0LCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGJ1dHRvbldpZGdldFJlZiwKKyAgICAgICAgZGF0YTogYnV0dG9uV2lkZ2V0RGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYnV0dG9uV2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVCk7CisgICAgICAgIGV4cGVjdChkYXRhLmNoZWNrQm94KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucmFkaW9CdXR0b24pLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChkYXRhLmZpZWxkVmFsdWUpLnRvRXF1YWwoIjEiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuYnV0dG9uVmFsdWUpLnRvRXF1YWwoIjIiKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSByYWRpbyBidXR0b25zIHdpdGhvdXQgYSBmaWVsZCB2YWx1ZSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBub3JtYWxBcHBlYXJhbmNlU3RhdGVEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIG5vcm1hbEFwcGVhcmFuY2VTdGF0ZURpY3Quc2V0KCIyIiwgbnVsbCk7CisgICAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhcHBlYXJhbmNlU3RhdGVzRGljdC5zZXQoIk4iLCBub3JtYWxBcHBlYXJhbmNlU3RhdGVEaWN0KTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJGZiIsIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pOworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIkFQIiwgYXBwZWFyYW5jZVN0YXRlc0RpY3QpOworCisgICAgICBjb25zdCBidXR0b25XaWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyNCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBidXR0b25XaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IGJ1dHRvbldpZGdldERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGJ1dHRvbldpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQpOworICAgICAgICBleHBlY3QoZGF0YS5jaGVja0JveCkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChkYXRhLnJhZGlvQnV0dG9uKS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QoZGF0YS5maWVsZFZhbHVlKS50b0VxdWFsKG51bGwpOworICAgICAgICBleHBlY3QoZGF0YS5idXR0b25WYWx1ZSkudG9FcXVhbCgiMiIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVuZGVyIHJhZGlvIGJ1dHRvbnMgZm9yIHByaW50aW5nIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFwcGVhcmFuY2VTdGF0ZXNEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IGNoZWNrZWRBcHBlYXJhbmNlRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCB1bmNoZWNrZWRBcHBlYXJhbmNlRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCBjaGVja2VkU3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIwLjEgMC4yIDAuMyByZyIpOworICAgICAgY2hlY2tlZFN0cmVhbS5kaWN0ID0gY2hlY2tlZEFwcGVhcmFuY2VEaWN0OworICAgICAgY29uc3QgdW5jaGVja2VkU3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIwLjMgMC4yIDAuMSByZyIpOworICAgICAgdW5jaGVja2VkU3RyZWFtLmRpY3QgPSB1bmNoZWNrZWRBcHBlYXJhbmNlRGljdDsKKyAgICAgIGNoZWNrZWRBcHBlYXJhbmNlRGljdC5zZXQoIkJCb3giLCBbMCwgMCwgOCwgOF0pOworICAgICAgY2hlY2tlZEFwcGVhcmFuY2VEaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKKyAgICAgIGNoZWNrZWRBcHBlYXJhbmNlRGljdC5zZXQoIk1hdHJpeCIsIFsxLCAwLCAwLCAxLCAwLCAwXSk7CisgICAgICBub3JtYWxBcHBlYXJhbmNlRGljdC5zZXQoIkNoZWNrZWQiLCBjaGVja2VkU3RyZWFtKTsKKyAgICAgIG5vcm1hbEFwcGVhcmFuY2VEaWN0LnNldCgiT2ZmIiwgdW5jaGVja2VkU3RyZWFtKTsKKyAgICAgIGFwcGVhcmFuY2VTdGF0ZXNEaWN0LnNldCgiTiIsIG5vcm1hbEFwcGVhcmFuY2VEaWN0KTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJGZiIsIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pOworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIkFQIiwgYXBwZWFyYW5jZVN0YXRlc0RpY3QpOworCisgICAgICBjb25zdCBidXR0b25XaWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyNCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBidXR0b25XaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IGJ1dHRvbldpZGdldERpY3QKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHRhc2sgPSBuZXcgX3dvcmtlci5Xb3JrZXJUYXNrKCJ0ZXN0IHByaW50Iik7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBidXR0b25XaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKGFubm90YXRpb24gPT4geworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVthbm5vdGF0aW9uLmRhdGEuaWRdID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFthbm5vdGF0aW9uLCBhbm5vdGF0aW9uLmdldE9wZXJhdG9yTGlzdChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBmYWxzZSwgYW5ub3RhdGlvblN0b3JhZ2UpXSk7CisgICAgICB9LCBkb25lLmZhaWwpLnRoZW4oKFthbm5vdGF0aW9uLCBvcExpc3RdKSA9PiB7CisgICAgICAgIGV4cGVjdChvcExpc3QuYXJnc0FycmF5Lmxlbmd0aCkudG9FcXVhbCgzKTsKKyAgICAgICAgZXhwZWN0KG9wTGlzdC5mbkFycmF5KS50b0VxdWFsKFtfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9uLCBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yLCBfdXRpbC5PUFMuZW5kQW5ub3RhdGlvbl0pOworICAgICAgICBleHBlY3Qob3BMaXN0LmFyZ3NBcnJheVsxXSkudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzI2LCA1MSwgNzZdKSk7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGFubm90YXRpb24gPT4geworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVthbm5vdGF0aW9uLmRhdGEuaWRdID0gZmFsc2U7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLmdldE9wZXJhdG9yTGlzdChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBmYWxzZSwgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKG9wTGlzdCA9PiB7CisgICAgICAgIGV4cGVjdChvcExpc3QuYXJnc0FycmF5Lmxlbmd0aCkudG9FcXVhbCgzKTsKKyAgICAgICAgZXhwZWN0KG9wTGlzdC5mbkFycmF5KS50b0VxdWFsKFtfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9uLCBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yLCBfdXRpbC5PUFMuZW5kQW5ub3RhdGlvbl0pOworICAgICAgICBleHBlY3Qob3BMaXN0LmFyZ3NBcnJheVsxXSkudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzc2LCA1MSwgMjZdKSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBzYXZlIHJhZGlvIGJ1dHRvbnMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlc0RpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgbm9ybWFsQXBwZWFyYW5jZURpY3Quc2V0KCJDaGVja2VkIiwgX3ByaW1pdGl2ZXMuUmVmLmdldCgzMTQsIDApKTsKKyAgICAgIG5vcm1hbEFwcGVhcmFuY2VEaWN0LnNldCgiT2ZmIiwgX3ByaW1pdGl2ZXMuUmVmLmdldCgyNzEsIDApKTsKKyAgICAgIGFwcGVhcmFuY2VTdGF0ZXNEaWN0LnNldCgiTiIsIG5vcm1hbEFwcGVhcmFuY2VEaWN0KTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJGZiIsIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pOworICAgICAgYnV0dG9uV2lkZ2V0RGljdC5zZXQoIkFQIiwgYXBwZWFyYW5jZVN0YXRlc0RpY3QpOworCisgICAgICBjb25zdCBidXR0b25XaWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyMywgMCk7CisKKyAgICAgIGNvbnN0IHBhcmVudFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoNDU2LCAwKTsKKworICAgICAgY29uc3QgcGFyZW50RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBwYXJlbnREaWN0LnNldCgiViIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJPZmYiKSk7CisgICAgICBwYXJlbnREaWN0LnNldCgiS2lkcyIsIFtidXR0b25XaWRnZXRSZWZdKTsKKyAgICAgIGJ1dHRvbldpZGdldERpY3Quc2V0KCJQYXJlbnQiLCBwYXJlbnRSZWYpOworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGJ1dHRvbldpZGdldFJlZiwKKyAgICAgICAgZGF0YTogYnV0dG9uV2lkZ2V0RGljdAorICAgICAgfSwgeworICAgICAgICByZWY6IHBhcmVudFJlZiwKKyAgICAgICAgZGF0YTogcGFyZW50RGljdAorICAgICAgfV0pOworICAgICAgcGFyZW50RGljdC54cmVmID0geHJlZjsKKyAgICAgIGJ1dHRvbldpZGdldERpY3QueHJlZiA9IHhyZWY7CisgICAgICBwYXJ0aWFsRXZhbHVhdG9yLnhyZWYgPSB4cmVmOworICAgICAgY29uc3QgdGFzayA9IG5ldyBfd29ya2VyLldvcmtlclRhc2soInRlc3Qgc2F2ZSIpOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgYnV0dG9uV2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbihhbm5vdGF0aW9uID0+IHsKKyAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSB7fTsKKyAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VbYW5ub3RhdGlvbi5kYXRhLmlkXSA9IHRydWU7CisgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbYW5ub3RhdGlvbiwgYW5ub3RhdGlvbi5zYXZlKHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKV0pOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKChbYW5ub3RhdGlvbiwgZGF0YV0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEubGVuZ3RoKS50b0VxdWFsKDIpOworICAgICAgICBjb25zdCBbcmFkaW9EYXRhLCBwYXJlbnREYXRhXSA9IGRhdGE7CisgICAgICAgIHJhZGlvRGF0YS5kYXRhID0gcmFkaW9EYXRhLmRhdGEucmVwbGFjZSgvXChEOlswLTldK1wpLywgIihkYXRlKSIpOworICAgICAgICBleHBlY3QocmFkaW9EYXRhLnJlZikudG9FcXVhbChfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyMywgMCkpOworICAgICAgICBleHBlY3QocmFkaW9EYXRhLmRhdGEpLnRvRXF1YWwoIjEyMyAwIG9ialxuIiArICI8PCAvVHlwZSAvQW5ub3QgL1N1YnR5cGUgL1dpZGdldCAvRlQgL0J0biAvRmYgMzI3NjggIiArICIvQVAgPDwgL04gPDwgL0NoZWNrZWQgMzE0IDAgUiAvT2ZmIDI3MSAwIFI+Pj4+ICIgKyAiL1BhcmVudCA0NTYgMCBSIC9BUyAvQ2hlY2tlZCAvTSAoZGF0ZSk+PlxuZW5kb2JqXG4iKTsKKyAgICAgICAgZXhwZWN0KHBhcmVudERhdGEucmVmKS50b0VxdWFsKF9wcmltaXRpdmVzLlJlZi5nZXQoNDU2LCAwKSk7CisgICAgICAgIGV4cGVjdChwYXJlbnREYXRhLmRhdGEpLnRvRXF1YWwoIjQ1NiAwIG9ialxuPDwgL1YgL0NoZWNrZWQgL0tpZHMgWzEyMyAwIFJdPj5cbmVuZG9ialxuIik7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGFubm90YXRpb24gPT4geworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVthbm5vdGF0aW9uLmRhdGEuaWRdID0gZmFsc2U7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnNhdmUocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGRhdGEgPT4geworICAgICAgICBleHBlY3QoZGF0YSkudG9FcXVhbChudWxsKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJDaG9pY2VXaWRnZXRBbm5vdGF0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgIGxldCBjaG9pY2VXaWRnZXREaWN0LCBmb250UmVmT2JqOworICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNob2ljZVdpZGdldERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgY2hvaWNlV2lkZ2V0RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBjaG9pY2VXaWRnZXREaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJXaWRnZXQiKSk7CisgICAgICBjaG9pY2VXaWRnZXREaWN0LnNldCgiRlQiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQ2giKSk7CisgICAgICBjb25zdCBoZWx2RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBoZWx2RGljdC5zZXQoIkJhc2VGb250IiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkhlbHZldGljYSIpKTsKKyAgICAgIGhlbHZEaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb250IikpOworICAgICAgaGVsdkRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlR5cGUxIikpOworCisgICAgICBjb25zdCBmb250UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgzMTQsIDApOworCisgICAgICBmb250UmVmT2JqID0geworICAgICAgICByZWY6IGZvbnRSZWYsCisgICAgICAgIGRhdGE6IGhlbHZEaWN0CisgICAgICB9OworICAgICAgY29uc3QgcmVzb3VyY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IGZvbnREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGZvbnREaWN0LnNldCgiSGVsdiIsIGZvbnRSZWYpOworICAgICAgcmVzb3VyY2VEaWN0LnNldCgiRm9udCIsIGZvbnREaWN0KTsKKyAgICAgIGNob2ljZVdpZGdldERpY3Quc2V0KCJEQSIsICIvSGVsdiA1IFRmIik7CisgICAgICBjaG9pY2VXaWRnZXREaWN0LnNldCgiRFIiLCByZXNvdXJjZURpY3QpOworICAgICAgY2hvaWNlV2lkZ2V0RGljdC5zZXQoIlJlY3QiLCBbMCwgMCwgMzIsIDEwXSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIGNob2ljZVdpZGdldERpY3QgPSBmb250UmVmT2JqID0gbnVsbDsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSBtaXNzaW5nIG9wdGlvbiBhcnJheXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgY2hvaWNlV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjIsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogY2hvaWNlV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBjaG9pY2VXaWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBjaG9pY2VXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEub3B0aW9ucykudG9FcXVhbChbXSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUgb3B0aW9uIGFycmF5cyB3aXRoIGFycmF5IGVsZW1lbnRzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IG9wdGlvbkJhclJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMjAsIDApOworCisgICAgICBjb25zdCBvcHRpb25CYXJTdHIgPSAiQmFyIjsKKworICAgICAgY29uc3Qgb3B0aW9uT25lUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCk7CisKKyAgICAgIGNvbnN0IG9wdGlvbk9uZUFyciA9IFsiYmFyX2V4cG9ydCIsIG9wdGlvbkJhclJlZl07CisgICAgICBjb25zdCBvcHRpb25zID0gW1siZm9vX2V4cG9ydCIsICJGb28iXSwgb3B0aW9uT25lUmVmXTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkID0gW3sKKyAgICAgICAgZXhwb3J0VmFsdWU6ICJmb29fZXhwb3J0IiwKKyAgICAgICAgZGlzcGxheVZhbHVlOiAiRm9vIgorICAgICAgfSwgeworICAgICAgICBleHBvcnRWYWx1ZTogImJhcl9leHBvcnQiLAorICAgICAgICBkaXNwbGF5VmFsdWU6ICJCYXIiCisgICAgICB9XTsKKyAgICAgIGNob2ljZVdpZGdldERpY3Quc2V0KCJPcHQiLCBvcHRpb25zKTsKKworICAgICAgY29uc3QgY2hvaWNlV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjMsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogY2hvaWNlV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBjaG9pY2VXaWRnZXREaWN0CisgICAgICB9LCB7CisgICAgICAgIHJlZjogb3B0aW9uQmFyUmVmLAorICAgICAgICBkYXRhOiBvcHRpb25CYXJTdHIKKyAgICAgIH0sIHsKKyAgICAgICAgcmVmOiBvcHRpb25PbmVSZWYsCisgICAgICAgIGRhdGE6IG9wdGlvbk9uZUFycgorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgY2hvaWNlV2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVCk7CisgICAgICAgIGV4cGVjdChkYXRhLm9wdGlvbnMpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIG9wdGlvbiBhcnJheXMgd2l0aCBzdHJpbmcgZWxlbWVudHMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3Qgb3B0aW9uQmFyUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCk7CisKKyAgICAgIGNvbnN0IG9wdGlvbkJhclN0ciA9ICJCYXIiOworICAgICAgY29uc3Qgb3B0aW9ucyA9IFsiRm9vIiwgb3B0aW9uQmFyUmVmXTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkID0gW3sKKyAgICAgICAgZXhwb3J0VmFsdWU6ICJGb28iLAorICAgICAgICBkaXNwbGF5VmFsdWU6ICJGb28iCisgICAgICB9LCB7CisgICAgICAgIGV4cG9ydFZhbHVlOiAiQmFyIiwKKyAgICAgICAgZGlzcGxheVZhbHVlOiAiQmFyIgorICAgICAgfV07CisgICAgICBjaG9pY2VXaWRnZXREaWN0LnNldCgiT3B0Iiwgb3B0aW9ucyk7CisKKyAgICAgIGNvbnN0IGNob2ljZVdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoOTgxLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGNob2ljZVdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogY2hvaWNlV2lkZ2V0RGljdAorICAgICAgfSwgeworICAgICAgICByZWY6IG9wdGlvbkJhclJlZiwKKyAgICAgICAgZGF0YTogb3B0aW9uQmFyU3RyCisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBjaG9pY2VXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEub3B0aW9ucykudG9FcXVhbChleHBlY3RlZCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUgaW5oZXJpdGVkIG9wdGlvbiBhcnJheXMgKGlzc3VlIDgwOTQpIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IG9wdGlvbnMgPSBbWyJWYWx1ZTEiLCAiRGVzY3JpcHRpb24xIl0sIFsiVmFsdWUyIiwgIkRlc2NyaXB0aW9uMiJdXTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkID0gW3sKKyAgICAgICAgZXhwb3J0VmFsdWU6ICJWYWx1ZTEiLAorICAgICAgICBkaXNwbGF5VmFsdWU6ICJEZXNjcmlwdGlvbjEiCisgICAgICB9LCB7CisgICAgICAgIGV4cG9ydFZhbHVlOiAiVmFsdWUyIiwKKyAgICAgICAgZGlzcGxheVZhbHVlOiAiRGVzY3JpcHRpb24yIgorICAgICAgfV07CisgICAgICBjb25zdCBwYXJlbnREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHBhcmVudERpY3Quc2V0KCJPcHQiLCBvcHRpb25zKTsKKyAgICAgIGNob2ljZVdpZGdldERpY3Quc2V0KCJQYXJlbnQiLCBwYXJlbnREaWN0KTsKKworICAgICAgY29uc3QgY2hvaWNlV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjMsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogY2hvaWNlV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBjaG9pY2VXaWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBjaG9pY2VXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEub3B0aW9ucykudG9FcXVhbChleHBlY3RlZCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBkZWNvZGUgZm9ybSB2YWx1ZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgZW5jb2RlZFN0cmluZyA9ICJceEZFXHhGRlx4MDBGXHgwMG9ceDAwbyI7CisgICAgICBjb25zdCBkZWNvZGVkU3RyaW5nID0gIkZvbyI7CisgICAgICBjaG9pY2VXaWRnZXREaWN0LnNldCgiT3B0IiwgW2VuY29kZWRTdHJpbmddKTsKKyAgICAgIGNob2ljZVdpZGdldERpY3Quc2V0KCJWIiwgZW5jb2RlZFN0cmluZyk7CisKKyAgICAgIGNvbnN0IGNob2ljZVdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoOTg0LCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGNob2ljZVdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogY2hvaWNlV2lkZ2V0RGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgY2hvaWNlV2lkZ2V0UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVCk7CisgICAgICAgIGV4cGVjdChkYXRhLmZpZWxkVmFsdWUpLnRvRXF1YWwoW2RlY29kZWRTdHJpbmddKTsKKyAgICAgICAgZXhwZWN0KGRhdGEub3B0aW9ucykudG9FcXVhbChbeworICAgICAgICAgIGV4cG9ydFZhbHVlOiBkZWNvZGVkU3RyaW5nLAorICAgICAgICAgIGRpc3BsYXlWYWx1ZTogZGVjb2RlZFN0cmluZworICAgICAgICB9XSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBjb252ZXJ0IHRoZSBmaWVsZCB2YWx1ZSB0byBhbiBhcnJheSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBpbnB1dHMgPSBbbnVsbCwgIkZvbyIsIFsiRm9vIiwgIkJhciJdXTsKKyAgICAgIGNvbnN0IG91dHB1dHMgPSBbW10sIFsiRm9vIl0sIFsiRm9vIiwgIkJhciJdXTsKKyAgICAgIGxldCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlucHV0cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgICAgIGNob2ljZVdpZGdldERpY3Quc2V0KCJWIiwgaW5wdXRzW2ldKTsKKworICAgICAgICAgIGNvbnN0IGNob2ljZVdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoOTY4LCAwKTsKKworICAgICAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgICAgIHJlZjogY2hvaWNlV2lkZ2V0UmVmLAorICAgICAgICAgICAgZGF0YTogY2hvaWNlV2lkZ2V0RGljdAorICAgICAgICAgIH1dKTsKKyAgICAgICAgICByZXR1cm4gX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGNob2ljZVdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgICAgIGRhdGEKKyAgICAgICAgICB9KSA9PiB7CisgICAgICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQpOworICAgICAgICAgICAgZXhwZWN0KGRhdGEuZmllbGRWYWx1ZSkudG9FcXVhbChvdXRwdXRzW2ldKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHByb21pc2UudGhlbihkb25lLCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIHVua25vd24gZmxhZ3MiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgY2hvaWNlV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxNjYsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogY2hvaWNlV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBjaG9pY2VXaWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBjaG9pY2VXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucmVhZE9ubHkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBleHBlY3QoZGF0YS5jb21ibykudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChkYXRhLm11bHRpU2VsZWN0KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIG5vdCBzZXQgaW52YWxpZCBmbGFncyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjaG9pY2VXaWRnZXREaWN0LnNldCgiRmYiLCAicmVhZG9ubHkiKTsKKworICAgICAgY29uc3QgY2hvaWNlV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxNjUsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogY2hvaWNlV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBjaG9pY2VXaWRnZXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBjaG9pY2VXaWRnZXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucmVhZE9ubHkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBleHBlY3QoZGF0YS5jb21ibykudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChkYXRhLm11bHRpU2VsZWN0KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHNldCB2YWxpZCBmbGFncyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjaG9pY2VXaWRnZXREaWN0LnNldCgiRmYiLCBfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlJFQURPTkxZICsgX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CTyArIF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuTVVMVElTRUxFQ1QpOworCisgICAgICBjb25zdCBjaG9pY2VXaWRnZXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDUxMiwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBjaG9pY2VXaWRnZXRSZWYsCisgICAgICAgIGRhdGE6IGNob2ljZVdpZGdldERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGNob2ljZVdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5XSURHRVQpOworICAgICAgICBleHBlY3QoZGF0YS5yZWFkT25seSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuY29tYm8pLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChkYXRhLm11bHRpU2VsZWN0KS50b0VxdWFsKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVuZGVyIGNob2ljZSBmb3IgcHJpbnRpbmciLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgY2hvaWNlV2lkZ2V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgyNzEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogY2hvaWNlV2lkZ2V0UmVmLAorICAgICAgICBkYXRhOiBjaG9pY2VXaWRnZXREaWN0CisgICAgICB9LCBmb250UmVmT2JqXSk7CisgICAgICBjb25zdCB0YXNrID0gbmV3IF93b3JrZXIuV29ya2VyVGFzaygidGVzdCBwcmludCIpOworICAgICAgcGFydGlhbEV2YWx1YXRvci54cmVmID0geHJlZjsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGNob2ljZVdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oYW5ub3RhdGlvbiA9PiB7CisgICAgICAgIGNvbnN0IGlkID0gYW5ub3RhdGlvbi5kYXRhLmlkOworICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHt9OworICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVtpZF0gPSAiYSB2YWx1ZSI7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLl9nZXRBcHBlYXJhbmNlKHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKKyAgICAgIH0sIGRvbmUuZmFpbCkudGhlbihhcHBlYXJhbmNlID0+IHsKKyAgICAgICAgZXhwZWN0KGFwcGVhcmFuY2UpLnRvRXF1YWwoIi9UeCBCTUMgcSBCVCAvSGVsdiA1IFRmIDEgMCAwIDEgMCAwIFRtIiArICIgMi4wMCAyLjAwIFRkIChhIHZhbHVlKSBUaiBFVCBRIEVNQyIpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2F2ZSBjaG9pY2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY2hvaWNlV2lkZ2V0RGljdC5zZXQoIk9wdCIsIFsiQSIsICJCIiwgIkMiXSk7CisgICAgICBjaG9pY2VXaWRnZXREaWN0LnNldCgiViIsICJBIik7CisKKyAgICAgIGNvbnN0IGNob2ljZVdpZGdldFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTIzLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGNob2ljZVdpZGdldFJlZiwKKyAgICAgICAgZGF0YTogY2hvaWNlV2lkZ2V0RGljdAorICAgICAgfV0pOworICAgICAgcGFydGlhbEV2YWx1YXRvci54cmVmID0geHJlZjsKKyAgICAgIGNvbnN0IHRhc2sgPSBuZXcgX3dvcmtlci5Xb3JrZXJUYXNrKCJ0ZXN0IHNhdmUiKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGNob2ljZVdpZGdldFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oYW5ub3RhdGlvbiA9PiB7CisgICAgICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0ge307CisgICAgICAgIGFubm90YXRpb25TdG9yYWdlW2Fubm90YXRpb24uZGF0YS5pZF0gPSAiQyI7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnNhdmUocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpOworICAgICAgfSwgZG9uZS5mYWlsKS50aGVuKGRhdGEgPT4geworICAgICAgICBleHBlY3QoZGF0YS5sZW5ndGgpLnRvRXF1YWwoMik7CisgICAgICAgIGNvbnN0IFtvbGREYXRhLCBuZXdEYXRhXSA9IGRhdGE7CisgICAgICAgIGV4cGVjdChvbGREYXRhLnJlZikudG9FcXVhbChfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyMywgMCkpOworICAgICAgICBleHBlY3QobmV3RGF0YS5yZWYpLnRvRXF1YWwoX3ByaW1pdGl2ZXMuUmVmLmdldCgxLCAwKSk7CisgICAgICAgIG9sZERhdGEuZGF0YSA9IG9sZERhdGEuZGF0YS5yZXBsYWNlKC9cKEQ6WzAtOV0rXCkvLCAiKGRhdGUpIik7CisgICAgICAgIGV4cGVjdChvbGREYXRhLmRhdGEpLnRvRXF1YWwoIjEyMyAwIG9ialxuIiArICI8PCAvVHlwZSAvQW5ub3QgL1N1YnR5cGUgL1dpZGdldCAvRlQgL0NoIC9EQSAoL0hlbHYgNSBUZikgL0RSICIgKyAiPDwgL0ZvbnQgPDwgL0hlbHYgMzE0IDAgUj4+Pj4gIiArICIvUmVjdCBbMCAwIDMyIDEwXSAvT3B0IFsoQSkgKEIpIChDKV0gL1YgKEMpICIgKyAiL0FQIDw8IC9OIDEgMCBSPj4gL00gKGRhdGUpPj5cbmVuZG9ialxuIik7CisgICAgICAgIGV4cGVjdChuZXdEYXRhLmRhdGEpLnRvRXF1YWwoIjEgMCBvYmpcbiIgKyAiPDwgL0xlbmd0aCA2NyAvU3VidHlwZSAvRm9ybSAvUmVzb3VyY2VzIDw8IC9Gb250IDw8IC9IZWx2IDMxNCAwIFI+Pj4+ICIgKyAiL0JCb3ggWzAgMCAzMiAxMF0+PiBzdHJlYW1cbiIgKyAiL1R4IEJNQyBxIEJUIC9IZWx2IDUgVGYgMSAwIDAgMSAwIDAgVG0gMi4wMCAyLjAwIFRkIChDKSBUaiBFVCBRIEVNQ1xuIiArICJlbmRzdHJlYW1cbmVuZG9ialxuIik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiTGluZUFubm90YXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBzZXQgdGhlIGxpbmUgY29vcmRpbmF0ZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgbGluZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgbGluZURpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgbGluZURpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxpbmUiKSk7CisgICAgICBsaW5lRGljdC5zZXQoIkwiLCBbMSwgMiwgMywgNF0pOworCisgICAgICBjb25zdCBsaW5lUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjIsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogbGluZVJlZiwKKyAgICAgICAgZGF0YTogbGluZURpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGxpbmVSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuTElORSk7CisgICAgICAgIGV4cGVjdChkYXRhLmxpbmVDb29yZGluYXRlcykudG9FcXVhbChbMSwgMiwgMywgNF0pOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkZpbGVBdHRhY2htZW50QW5ub3RhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGNvcnJlY3RseSBwYXJzZSBhIGZpbGUgYXR0YWNobWVudCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBmaWxlU3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCI8PFxuIiArICIvVHlwZSAvRW1iZWRkZWRGaWxlXG4iICsgIi9TdWJ0eXBlIC90ZXh0IzJGcGxhaW5cbiIgKyAiPj5cbiIgKyAic3RyZWFtXG4iICsgIlRlc3QgYXR0YWNobWVudCIgKyAiZW5kc3RyZWFtXG4iKTsKKyAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfcGFyc2VyLlBhcnNlcih7CisgICAgICAgIGxleGVyOiBuZXcgX3BhcnNlci5MZXhlcihmaWxlU3RyZWFtKSwKKyAgICAgICAgeHJlZjogbnVsbCwKKyAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCisgICAgICB9KTsKKworICAgICAgY29uc3QgZmlsZVN0cmVhbVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTgsIDApOworCisgICAgICBjb25zdCBmaWxlU3RyZWFtRGljdCA9IHBhcnNlci5nZXRPYmooKTsKKyAgICAgIGNvbnN0IGVtYmVkZGVkRmlsZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZW1iZWRkZWRGaWxlRGljdC5zZXQoIkYiLCBmaWxlU3RyZWFtUmVmKTsKKworICAgICAgY29uc3QgZmlsZVNwZWNSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDE5LCAwKTsKKworICAgICAgY29uc3QgZmlsZVNwZWNEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGZpbGVTcGVjRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRmlsZXNwZWMiKSk7CisgICAgICBmaWxlU3BlY0RpY3Quc2V0KCJEZXNjIiwgIiIpOworICAgICAgZmlsZVNwZWNEaWN0LnNldCgiRUYiLCBlbWJlZGRlZEZpbGVEaWN0KTsKKyAgICAgIGZpbGVTcGVjRGljdC5zZXQoIlVGIiwgIlRlc3QudHh0Iik7CisKKyAgICAgIGNvbnN0IGZpbGVBdHRhY2htZW50UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgyMCwgMCk7CisKKyAgICAgIGNvbnN0IGZpbGVBdHRhY2htZW50RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBmaWxlQXR0YWNobWVudERpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgZmlsZUF0dGFjaG1lbnREaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGaWxlQXR0YWNobWVudCIpKTsKKyAgICAgIGZpbGVBdHRhY2htZW50RGljdC5zZXQoIkZTIiwgZmlsZVNwZWNSZWYpOworICAgICAgZmlsZUF0dGFjaG1lbnREaWN0LnNldCgiVCIsICJUb3BpYyIpOworICAgICAgZmlsZUF0dGFjaG1lbnREaWN0LnNldCgiQ29udGVudHMiLCAiVGVzdC50eHQiKTsKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBmaWxlU3RyZWFtUmVmLAorICAgICAgICBkYXRhOiBmaWxlU3RyZWFtRGljdAorICAgICAgfSwgeworICAgICAgICByZWY6IGZpbGVTcGVjUmVmLAorICAgICAgICBkYXRhOiBmaWxlU3BlY0RpY3QKKyAgICAgIH0sIHsKKyAgICAgICAgcmVmOiBmaWxlQXR0YWNobWVudFJlZiwKKyAgICAgICAgZGF0YTogZmlsZUF0dGFjaG1lbnREaWN0CisgICAgICB9XSk7CisgICAgICBlbWJlZGRlZEZpbGVEaWN0LmFzc2lnblhyZWYoeHJlZik7CisgICAgICBmaWxlU3BlY0RpY3QuYXNzaWduWHJlZih4cmVmKTsKKyAgICAgIGZpbGVBdHRhY2htZW50RGljdC5hc3NpZ25YcmVmKHhyZWYpOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgZmlsZUF0dGFjaG1lbnRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQpOworICAgICAgICBleHBlY3QoZGF0YS5maWxlLmZpbGVuYW1lKS50b0VxdWFsKCJUZXN0LnR4dCIpOworICAgICAgICBleHBlY3QoZGF0YS5maWxlLmNvbnRlbnQpLnRvRXF1YWwoKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKCJUZXN0IGF0dGFjaG1lbnQiKSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiUG9wdXBBbm5vdGF0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gaXRzIHBhcmVudCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBwYXJlbnREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHBhcmVudERpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgcGFyZW50RGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVGV4dCIpKTsKKyAgICAgIHBhcmVudERpY3Quc2V0KCJNIiwgIkQ6MjAxOTA0MjMiKTsKKyAgICAgIHBhcmVudERpY3Quc2V0KCJDIiwgWzAsIDAsIDFdKTsKKyAgICAgIGNvbnN0IHBvcHVwRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBwb3B1cERpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgcG9wdXBEaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJQb3B1cCIpKTsKKyAgICAgIHBvcHVwRGljdC5zZXQoIlBhcmVudCIsIHBhcmVudERpY3QpOworCisgICAgICBjb25zdCBwb3B1cFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTMsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogcG9wdXBSZWYsCisgICAgICAgIGRhdGE6IHBvcHVwRGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgcG9wdXBSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEsCisgICAgICAgIHZpZXdhYmxlCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLlBPUFVQKTsKKyAgICAgICAgZXhwZWN0KGRhdGEubW9kaWZpY2F0aW9uRGF0ZSkudG9FcXVhbCgiRDoyMDE5MDQyMyIpOworICAgICAgICBleHBlY3QoZGF0YS5jb2xvcikudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzAsIDAsIDI1NV0pKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSBtaXNzaW5nIHBhcmVudCBwcm9wZXJ0aWVzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IHBhcmVudERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgcGFyZW50RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBwYXJlbnREaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJUZXh0IikpOworICAgICAgY29uc3QgcG9wdXBEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHBvcHVwRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBwb3B1cERpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlBvcHVwIikpOworICAgICAgcG9wdXBEaWN0LnNldCgiUGFyZW50IiwgcGFyZW50RGljdCk7CisKKyAgICAgIGNvbnN0IHBvcHVwUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMywgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBwb3B1cFJlZiwKKyAgICAgICAgZGF0YTogcG9wdXBEaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBwb3B1cFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YSwKKyAgICAgICAgdmlld2FibGUKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9QVVApOworICAgICAgICBleHBlY3QoZGF0YS5tb2RpZmljYXRpb25EYXRlKS50b0VxdWFsKG51bGwpOworICAgICAgICBleHBlY3QoZGF0YS5jb2xvcikudG9FcXVhbChudWxsKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGluaGVyaXQgdGhlIHBhcmVudCBmbGFncyB3aGVuIHRoZSBQb3B1cCBpcyBub3Qgdmlld2FibGUsICIgKyAiYnV0IHRoZSBwYXJlbnQgaXMgKFBSIDczNTIpIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IHBhcmVudERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgcGFyZW50RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBwYXJlbnREaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJUZXh0IikpOworICAgICAgcGFyZW50RGljdC5zZXQoIkYiLCAyOCk7CisgICAgICBjb25zdCBwb3B1cERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgcG9wdXBEaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIHBvcHVwRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiUG9wdXAiKSk7CisgICAgICBwb3B1cERpY3Quc2V0KCJGIiwgMjUpOworICAgICAgcG9wdXBEaWN0LnNldCgiUGFyZW50IiwgcGFyZW50RGljdCk7CisKKyAgICAgIGNvbnN0IHBvcHVwUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMywgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBwb3B1cFJlZiwKKyAgICAgICAgZGF0YTogcG9wdXBEaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBwb3B1cFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YSwKKyAgICAgICAgdmlld2FibGUKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9QVVApOworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uRmxhZ3MpLnRvRXF1YWwoMjUpOworICAgICAgICBleHBlY3Qodmlld2FibGUpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBjb3JyZWN0bHkgaW5oZXJpdCBDb250ZW50cyBmcm9tIGdyb3VwLW1hc3RlciBhbm5vdGF0aW9uICIgKyAiaWYgcGFyZW50IGhhcyBSZXBseVR5cGUgPT0gR3JvdXAiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYW5ub3RhdGlvblJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoODE5LCAwKTsKKworICAgICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlRleHQiKSk7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIlQiLCAiQ29ycmVjdCBUaXRsZSIpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJDb250ZW50cyIsICJDb3JyZWN0IFRleHQiKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiTSIsICJEOjIwMTkwNDIzIik7CisgICAgICBhbm5vdGF0aW9uRGljdC5zZXQoIkMiLCBbMCwgMCwgMV0pOworCisgICAgICBjb25zdCByZXBseVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoODIwLCAwKTsKKworICAgICAgY29uc3QgcmVwbHlEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICByZXBseURpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlRleHQiKSk7CisgICAgICByZXBseURpY3Quc2V0KCJJUlQiLCBhbm5vdGF0aW9uUmVmKTsKKyAgICAgIHJlcGx5RGljdC5zZXQoIlJUIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkdyb3VwIikpOworICAgICAgcmVwbHlEaWN0LnNldCgiVCIsICJSZXBseSBUaXRsZSIpOworICAgICAgcmVwbHlEaWN0LnNldCgiQ29udGVudHMiLCAiUmVwbHkgVGV4dCIpOworICAgICAgcmVwbHlEaWN0LnNldCgiTSIsICJEOjIwMTkwNTIzIik7CisgICAgICByZXBseURpY3Quc2V0KCJDIiwgWzAuNF0pOworCisgICAgICBjb25zdCBwb3B1cFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoODIxLCAwKTsKKworICAgICAgY29uc3QgcG9wdXBEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHBvcHVwRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBwb3B1cERpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlBvcHVwIikpOworICAgICAgcG9wdXBEaWN0LnNldCgiVCIsICJXcm9uZyBUaXRsZSIpOworICAgICAgcG9wdXBEaWN0LnNldCgiQ29udGVudHMiLCAiV3JvbmcgVGV4dCIpOworICAgICAgcG9wdXBEaWN0LnNldCgiUGFyZW50IiwgcmVwbHlSZWYpOworICAgICAgcG9wdXBEaWN0LnNldCgiTSIsICJEOjIwMTkwNjIzIik7CisgICAgICBwb3B1cERpY3Quc2V0KCJDIiwgWzAuOF0pOworICAgICAgcmVwbHlEaWN0LnNldCgiUG9wdXAiLCBwb3B1cFJlZik7CisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogYW5ub3RhdGlvblJlZiwKKyAgICAgICAgZGF0YTogYW5ub3RhdGlvbkRpY3QKKyAgICAgIH0sIHsKKyAgICAgICAgcmVmOiByZXBseVJlZiwKKyAgICAgICAgZGF0YTogcmVwbHlEaWN0CisgICAgICB9LCB7CisgICAgICAgIHJlZjogcG9wdXBSZWYsCisgICAgICAgIGRhdGE6IHBvcHVwRGljdAorICAgICAgfV0pOworICAgICAgYW5ub3RhdGlvbkRpY3QuYXNzaWduWHJlZih4cmVmKTsKKyAgICAgIHBvcHVwRGljdC5hc3NpZ25YcmVmKHhyZWYpOworICAgICAgcmVwbHlEaWN0LmFzc2lnblhyZWYoeHJlZik7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBwb3B1cFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS50aXRsZSkudG9FcXVhbCgiQ29ycmVjdCBUaXRsZSIpOworICAgICAgICBleHBlY3QoZGF0YS5jb250ZW50cykudG9FcXVhbCgiQ29ycmVjdCBUZXh0Iik7CisgICAgICAgIGV4cGVjdChkYXRhLm1vZGlmaWNhdGlvbkRhdGUpLnRvRXF1YWwoIkQ6MjAxOTA0MjMiKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuY29sb3IpLnRvRXF1YWwobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFswLCAwLCAyNTVdKSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiSW5rQW5ub3RhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSBhIHNpbmdsZSBpbmsgbGlzdCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBpbmtEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGlua0RpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgaW5rRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSW5rIikpOworICAgICAgaW5rRGljdC5zZXQoIklua0xpc3QiLCBbWzEsIDEsIDEsIDIsIDIsIDIsIDMsIDNdXSk7CisKKyAgICAgIGNvbnN0IGlua1JlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTQyLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGlua1JlZiwKKyAgICAgICAgZGF0YTogaW5rRGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgaW5rUmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLklOSyk7CisgICAgICAgIGV4cGVjdChkYXRhLmlua0xpc3RzLmxlbmd0aCkudG9FcXVhbCgxKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuaW5rTGlzdHNbMF0pLnRvRXF1YWwoW3sKKyAgICAgICAgICB4OiAxLAorICAgICAgICAgIHk6IDEKKyAgICAgICAgfSwgeworICAgICAgICAgIHg6IDEsCisgICAgICAgICAgeTogMgorICAgICAgICB9LCB7CisgICAgICAgICAgeDogMiwKKyAgICAgICAgICB5OiAyCisgICAgICAgIH0sIHsKKyAgICAgICAgICB4OiAzLAorICAgICAgICAgIHk6IDMKKyAgICAgICAgfV0pOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIG11bHRpcGxlIGluayBsaXN0cyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBpbmtEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGlua0RpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgaW5rRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSW5rIikpOworICAgICAgaW5rRGljdC5zZXQoIklua0xpc3QiLCBbWzEsIDEsIDEsIDJdLCBbMywgMywgNCwgNV1dKTsKKworICAgICAgY29uc3QgaW5rUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxNDMsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogaW5rUmVmLAorICAgICAgICBkYXRhOiBpbmtEaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBpbmtSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuSU5LKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuaW5rTGlzdHMubGVuZ3RoKS50b0VxdWFsKDIpOworICAgICAgICBleHBlY3QoZGF0YS5pbmtMaXN0c1swXSkudG9FcXVhbChbeworICAgICAgICAgIHg6IDEsCisgICAgICAgICAgeTogMQorICAgICAgICB9LCB7CisgICAgICAgICAgeDogMSwKKyAgICAgICAgICB5OiAyCisgICAgICAgIH1dKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuaW5rTGlzdHNbMV0pLnRvRXF1YWwoW3sKKyAgICAgICAgICB4OiAzLAorICAgICAgICAgIHk6IDMKKyAgICAgICAgfSwgeworICAgICAgICAgIHg6IDQsCisgICAgICAgICAgeTogNQorICAgICAgICB9XSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiSGlnaHRsaWdodEFubm90YXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBub3Qgc2V0IHF1YWRwb2ludHMgaWYgbm90IGRlZmluZWQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgaGlnaGxpZ2h0RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBoaWdobGlnaHREaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIGhpZ2hsaWdodERpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkhpZ2hsaWdodCIpKTsKKworICAgICAgY29uc3QgaGlnaGxpZ2h0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogaGlnaGxpZ2h0UmVmLAorICAgICAgICBkYXRhOiBoaWdobGlnaHREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBoaWdobGlnaHRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuSElHSExJR0hUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucXVhZFBvaW50cykudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IHF1YWRwb2ludHMgaWYgZGVmaW5lZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBoaWdobGlnaHREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGhpZ2hsaWdodERpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgaGlnaGxpZ2h0RGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSGlnaGxpZ2h0IikpOworICAgICAgaGlnaGxpZ2h0RGljdC5zZXQoIlJlY3QiLCBbMTAsIDEwLCAyMCwgMjBdKTsKKyAgICAgIGhpZ2hsaWdodERpY3Quc2V0KCJRdWFkUG9pbnRzIiwgWzExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNF0pOworCisgICAgICBjb25zdCBoaWdobGlnaHRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyMSwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBoaWdobGlnaHRSZWYsCisgICAgICAgIGRhdGE6IGhpZ2hsaWdodERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIGhpZ2hsaWdodFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5ISUdITElHSFQpOworICAgICAgICBleHBlY3QoZGF0YS5xdWFkUG9pbnRzKS50b0VxdWFsKFtbeworICAgICAgICAgIHg6IDExLAorICAgICAgICAgIHk6IDExCisgICAgICAgIH0sIHsKKyAgICAgICAgICB4OiAxMiwKKyAgICAgICAgICB5OiAxMgorICAgICAgICB9LCB7CisgICAgICAgICAgeDogMTMsCisgICAgICAgICAgeTogMTMKKyAgICAgICAgfSwgeworICAgICAgICAgIHg6IDE0LAorICAgICAgICAgIHk6IDE0CisgICAgICAgIH1dXSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiVW5kZXJsaW5lQW5ub3RhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIG5vdCBzZXQgcXVhZHBvaW50cyBpZiBub3QgZGVmaW5lZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCB1bmRlcmxpbmVEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHVuZGVybGluZURpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgdW5kZXJsaW5lRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVW5kZXJsaW5lIikpOworCisgICAgICBjb25zdCB1bmRlcmxpbmVSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyMSwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiB1bmRlcmxpbmVSZWYsCisgICAgICAgIGRhdGE6IHVuZGVybGluZURpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHVuZGVybGluZVJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkUpOworICAgICAgICBleHBlY3QoZGF0YS5xdWFkUG9pbnRzKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBzZXQgcXVhZHBvaW50cyBpZiBkZWZpbmVkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IHVuZGVybGluZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgdW5kZXJsaW5lRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICB1bmRlcmxpbmVEaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJVbmRlcmxpbmUiKSk7CisgICAgICB1bmRlcmxpbmVEaWN0LnNldCgiUmVjdCIsIFsxMCwgMTAsIDIwLCAyMF0pOworICAgICAgdW5kZXJsaW5lRGljdC5zZXQoIlF1YWRQb2ludHMiLCBbMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0XSk7CisKKyAgICAgIGNvbnN0IHVuZGVybGluZVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTIxLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHVuZGVybGluZVJlZiwKKyAgICAgICAgZGF0YTogdW5kZXJsaW5lRGljdAorICAgICAgfV0pOworCisgICAgICBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgdW5kZXJsaW5lUmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLlVOREVSTElORSk7CisgICAgICAgIGV4cGVjdChkYXRhLnF1YWRQb2ludHMpLnRvRXF1YWwoW1t7CisgICAgICAgICAgeDogMTEsCisgICAgICAgICAgeTogMTEKKyAgICAgICAgfSwgeworICAgICAgICAgIHg6IDEyLAorICAgICAgICAgIHk6IDEyCisgICAgICAgIH0sIHsKKyAgICAgICAgICB4OiAxMywKKyAgICAgICAgICB5OiAxMworICAgICAgICB9LCB7CisgICAgICAgICAgeDogMTQsCisgICAgICAgICAgeTogMTQKKyAgICAgICAgfV1dKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJTcXVpZ2dseUFubm90YXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBub3Qgc2V0IHF1YWRwb2ludHMgaWYgbm90IGRlZmluZWQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3Qgc3F1aWdnbHlEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHNxdWlnZ2x5RGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CisgICAgICBzcXVpZ2dseURpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlNxdWlnZ2x5IikpOworCisgICAgICBjb25zdCBzcXVpZ2dseVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTIxLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHNxdWlnZ2x5UmVmLAorICAgICAgICBkYXRhOiBzcXVpZ2dseURpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHNxdWlnZ2x5UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLlNRVUlHR0xZKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucXVhZFBvaW50cykudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IHF1YWRwb2ludHMgaWYgZGVmaW5lZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBzcXVpZ2dseURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgc3F1aWdnbHlEaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIHNxdWlnZ2x5RGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiU3F1aWdnbHkiKSk7CisgICAgICBzcXVpZ2dseURpY3Quc2V0KCJSZWN0IiwgWzEwLCAxMCwgMjAsIDIwXSk7CisgICAgICBzcXVpZ2dseURpY3Quc2V0KCJRdWFkUG9pbnRzIiwgWzExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNF0pOworCisgICAgICBjb25zdCBzcXVpZ2dseVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTIxLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHNxdWlnZ2x5UmVmLAorICAgICAgICBkYXRhOiBzcXVpZ2dseURpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHNxdWlnZ2x5UmVmLCBwZGZNYW5hZ2VyTW9jaywgaWRGYWN0b3J5TW9jaykudGhlbigoeworICAgICAgICBkYXRhCisgICAgICB9KSA9PiB7CisgICAgICAgIGV4cGVjdChkYXRhLmFubm90YXRpb25UeXBlKS50b0VxdWFsKF91dGlsLkFubm90YXRpb25UeXBlLlNRVUlHR0xZKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucXVhZFBvaW50cykudG9FcXVhbChbW3sKKyAgICAgICAgICB4OiAxMSwKKyAgICAgICAgICB5OiAxMQorICAgICAgICB9LCB7CisgICAgICAgICAgeDogMTIsCisgICAgICAgICAgeTogMTIKKyAgICAgICAgfSwgeworICAgICAgICAgIHg6IDEzLAorICAgICAgICAgIHk6IDEzCisgICAgICAgIH0sIHsKKyAgICAgICAgICB4OiAxNCwKKyAgICAgICAgICB5OiAxNAorICAgICAgICB9XV0pOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlN0cmlrZU91dEFubm90YXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBub3Qgc2V0IHF1YWRwb2ludHMgaWYgbm90IGRlZmluZWQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3Qgc3RyaWtlT3V0RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBzdHJpa2VPdXREaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKKyAgICAgIHN0cmlrZU91dERpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlN0cmlrZU91dCIpKTsKKworICAgICAgY29uc3Qgc3RyaWtlT3V0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMjEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogc3RyaWtlT3V0UmVmLAorICAgICAgICBkYXRhOiBzdHJpa2VPdXREaWN0CisgICAgICB9XSk7CisKKyAgICAgIF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh4cmVmLCBzdHJpa2VPdXRSZWYsIHBkZk1hbmFnZXJNb2NrLCBpZEZhY3RvcnlNb2NrKS50aGVuKCh7CisgICAgICAgIGRhdGEKKyAgICAgIH0pID0+IHsKKyAgICAgICAgZXhwZWN0KGRhdGEuYW5ub3RhdGlvblR5cGUpLnRvRXF1YWwoX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUKTsKKyAgICAgICAgZXhwZWN0KGRhdGEucXVhZFBvaW50cykudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2V0IHF1YWRwb2ludHMgaWYgZGVmaW5lZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBzdHJpa2VPdXREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHN0cmlrZU91dERpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFubm90IikpOworICAgICAgc3RyaWtlT3V0RGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiU3RyaWtlT3V0IikpOworICAgICAgc3RyaWtlT3V0RGljdC5zZXQoIlJlY3QiLCBbMTAsIDEwLCAyMCwgMjBdKTsKKyAgICAgIHN0cmlrZU91dERpY3Quc2V0KCJRdWFkUG9pbnRzIiwgWzExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNF0pOworCisgICAgICBjb25zdCBzdHJpa2VPdXRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEyMSwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBzdHJpa2VPdXRSZWYsCisgICAgICAgIGRhdGE6IHN0cmlrZU91dERpY3QKKyAgICAgIH1dKTsKKworICAgICAgX2Fubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHhyZWYsIHN0cmlrZU91dFJlZiwgcGRmTWFuYWdlck1vY2ssIGlkRmFjdG9yeU1vY2spLnRoZW4oKHsKKyAgICAgICAgZGF0YQorICAgICAgfSkgPT4geworICAgICAgICBleHBlY3QoZGF0YS5hbm5vdGF0aW9uVHlwZSkudG9FcXVhbChfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQpOworICAgICAgICBleHBlY3QoZGF0YS5xdWFkUG9pbnRzKS50b0VxdWFsKFtbeworICAgICAgICAgIHg6IDExLAorICAgICAgICAgIHk6IDExCisgICAgICAgIH0sIHsKKyAgICAgICAgICB4OiAxMiwKKyAgICAgICAgICB5OiAxMgorICAgICAgICB9LCB7CisgICAgICAgICAgeDogMTMsCisgICAgICAgICAgeTogMTMKKyAgICAgICAgfSwgeworICAgICAgICAgIHg6IDE0LAorICAgICAgICAgIHk6IDE0CisgICAgICAgIH1dXSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9hbm5vdGF0aW9uX3N0b3JhZ2Vfc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvYW5ub3RhdGlvbl9zdG9yYWdlX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3Zjk2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvYW5ub3RhdGlvbl9zdG9yYWdlX3NwZWMuanMKQEAgLTAsMCArMSw4MyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX2Fubm90YXRpb25fc3RvcmFnZSA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvYW5ub3RhdGlvbl9zdG9yYWdlLmpzIik7CisKK2Rlc2NyaWJlKCJBbm5vdGF0aW9uU3RvcmFnZSIsIGZ1bmN0aW9uICgpIHsKKyAgZGVzY3JpYmUoIkdldE9yQ3JlYXRlVmFsdWUiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBnZXQgYW5kIHNldCBhIG5ldyB2YWx1ZSBpbiB0aGUgYW5ub3RhdGlvbiBzdG9yYWdlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0gbmV3IF9hbm5vdGF0aW9uX3N0b3JhZ2UuQW5ub3RhdGlvblN0b3JhZ2UoKTsKKyAgICAgIGxldCB2YWx1ZSA9IGFubm90YXRpb25TdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoIjEyM0EiLCAiaGVsbG8gd29ybGQiKTsKKyAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCgiaGVsbG8gd29ybGQiKTsKKyAgICAgIHZhbHVlID0gYW5ub3RhdGlvblN0b3JhZ2UuZ2V0T3JDcmVhdGVWYWx1ZSgiMTIzQSIsICJhbiBvdGhlciBzdHJpbmciKTsKKyAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCgiaGVsbG8gd29ybGQiKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJTZXRWYWx1ZSIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIHNldCBhIG5ldyB2YWx1ZSBpbiB0aGUgYW5ub3RhdGlvbiBzdG9yYWdlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0gbmV3IF9hbm5vdGF0aW9uX3N0b3JhZ2UuQW5ub3RhdGlvblN0b3JhZ2UoKTsKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKCIxMjNBIiwgImFuIG90aGVyIHN0cmluZyIpOworICAgICAgY29uc3QgdmFsdWUgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXRBbGwoKVsiMTIzQSJdOworICAgICAgZXhwZWN0KHZhbHVlKS50b0VxdWFsKCJhbiBvdGhlciBzdHJpbmciKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNhbGwgb25TZXRNb2RpZmllZCgpIGlmIHZhbHVlIGlzIGNoYW5nZWQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSBuZXcgX2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSgpOworICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworCisgICAgICBjb25zdCBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgIH07CisKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLm9uU2V0TW9kaWZpZWQgPSBjYWxsYmFjazsKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoImFzZGYiLCAib3JpZ2luYWwiKTsKKyAgICAgIGV4cGVjdChjYWxsZWQpLnRvQmUoZmFsc2UpOworICAgICAgYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUoImFzZGYiLCAib3JpZ2luYWwiKTsKKyAgICAgIGV4cGVjdChjYWxsZWQpLnRvQmUoZmFsc2UpOworICAgICAgYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUoImFzZGYiLCAibW9kaWZpZWQiKTsKKyAgICAgIGV4cGVjdChjYWxsZWQpLnRvQmUodHJ1ZSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiUmVzZXRNb2RpZmllZCIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGNhbGwgb25SZXNldE1vZGlmaWVkKCkgaWYgc2V0IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0gbmV3IF9hbm5vdGF0aW9uX3N0b3JhZ2UuQW5ub3RhdGlvblN0b3JhZ2UoKTsKKyAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKworICAgICAgY29uc3QgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICB9OworCisgICAgICBhbm5vdGF0aW9uU3RvcmFnZS5vblJlc2V0TW9kaWZpZWQgPSBjYWxsYmFjazsKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLmdldE9yQ3JlYXRlVmFsdWUoImFzZGYiLCAib3JpZ2luYWwiKTsKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKCJhc2RmIiwgIm9yaWdpbmFsIik7CisgICAgICBhbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7CisgICAgICBleHBlY3QoY2FsbGVkKS50b0JlKGZhbHNlKTsKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKCJhc2RmIiwgIm1vZGlmaWVkIik7CisgICAgICBhbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7CisgICAgICBleHBlY3QoY2FsbGVkKS50b0JlKHRydWUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvYXBpX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2FwaV9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOWRiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L2FwaV9zcGVjLmpzCkBAIC0wLDAgKzEsMTY5MyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3Rlc3RfdXRpbHMgPSByZXF1aXJlKCIuL3Rlc3RfdXRpbHMuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9kaXNwbGF5X3V0aWxzID0gcmVxdWlyZSgiLi4vLi4vZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzIik7CisKK3ZhciBfYXBpID0gcmVxdWlyZSgiLi4vLi4vZGlzcGxheS9hcGkuanMiKTsKKwordmFyIF91aV91dGlscyA9IHJlcXVpcmUoIi4uLy4uL3dlYi91aV91dGlscy5qcyIpOworCit2YXIgX2ltYWdlX3V0aWxzID0gcmVxdWlyZSgiLi4vLi4vY29yZS9pbWFnZV91dGlscy5qcyIpOworCit2YXIgX3dvcmtlcl9vcHRpb25zID0gcmVxdWlyZSgiLi4vLi4vZGlzcGxheS93b3JrZXJfb3B0aW9ucy5qcyIpOworCit2YXIgX2lzX25vZGUgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvaXNfbm9kZS5qcyIpOworCit2YXIgX21ldGFkYXRhID0gcmVxdWlyZSgiLi4vLi4vZGlzcGxheS9tZXRhZGF0YS5qcyIpOworCit2YXIgX25vZGVfdXRpbHMgPSByZXF1aXJlKCIuLi8uLi9kaXNwbGF5L25vZGVfdXRpbHMuanMiKTsKKworZGVzY3JpYmUoImFwaSIsIGZ1bmN0aW9uICgpIHsKKyAgY29uc3QgYmFzaWNBcGlGaWxlTmFtZSA9ICJiYXNpY2FwaS5wZGYiOworICBjb25zdCBiYXNpY0FwaUZpbGVMZW5ndGggPSAxMDU3Nzk7CisgIGNvbnN0IGJhc2ljQXBpR2V0RG9jdW1lbnRQYXJhbXMgPSAoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoYmFzaWNBcGlGaWxlTmFtZSk7CisgIGxldCBDYW52YXNGYWN0b3J5OworICBiZWZvcmVBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgIENhbnZhc0ZhY3RvcnkgPSBuZXcgX25vZGVfdXRpbHMuTm9kZUNhbnZhc0ZhY3RvcnkoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ2FudmFzRmFjdG9yeSA9IG5ldyBfZGlzcGxheV91dGlscy5ET01DYW52YXNGYWN0b3J5KCk7CisgICAgfQorCisgICAgZG9uZSgpOworICB9KTsKKyAgYWZ0ZXJBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICBDYW52YXNGYWN0b3J5ID0gbnVsbDsKKyAgICBkb25lKCk7CisgIH0pOworCisgIGZ1bmN0aW9uIHdhaXRTb21lKGNhbGxiYWNrKSB7CisgICAgdmFyIFdBSVRfVElNRU9VVCA9IDEwOworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgY2FsbGJhY2soKTsKKyAgICB9LCBXQUlUX1RJTUVPVVQpOworICB9CisKKyAgZGVzY3JpYmUoImdldERvY3VtZW50IiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJjcmVhdGVzIHBkZiBkb2MgZnJvbSBVUkwiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKGJhc2ljQXBpR2V0RG9jdW1lbnRQYXJhbXMpOworICAgICAgdmFyIHByb2dyZXNzUmVwb3J0ZWRDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworCisgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzID0gZnVuY3Rpb24gKHByb2dyZXNzRGF0YSkgeworICAgICAgICBpZiAoIXByb2dyZXNzUmVwb3J0ZWRDYXBhYmlsaXR5LnNldHRsZWQpIHsKKyAgICAgICAgICBwcm9ncmVzc1JlcG9ydGVkQ2FwYWJpbGl0eS5yZXNvbHZlKHByb2dyZXNzRGF0YSk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIHZhciBwcm9taXNlcyA9IFtwcm9ncmVzc1JlcG9ydGVkQ2FwYWJpbGl0eS5wcm9taXNlLCBsb2FkaW5nVGFzay5wcm9taXNlXTsKKyAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIGV4cGVjdChkYXRhWzBdLmxvYWRlZCAvIGRhdGFbMF0udG90YWwgPj0gMCkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGRhdGFbMV0gaW5zdGFuY2VvZiBfYXBpLlBERkRvY3VtZW50UHJveHkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChsb2FkaW5nVGFzaykudG9FcXVhbChkYXRhWzFdLmxvYWRpbmdUYXNrKTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJjcmVhdGVzIHBkZiBkb2MgZnJvbSBVUkwgYW5kIGFib3J0cyBiZWZvcmUgd29ya2VyIGluaXRpYWxpemVkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KShiYXNpY0FwaUdldERvY3VtZW50UGFyYW1zKTsKKyAgICAgIGNvbnN0IGRlc3Ryb3llZCA9IGxvYWRpbmdUYXNrLmRlc3Ryb3koKTsKKyAgICAgIGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGRvbmUuZmFpbCgic2hhbGwgZmFpbCBsb2FkaW5nIik7CisgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGV4cGVjdCh0cnVlKS50b0VxdWFsKHRydWUpOworICAgICAgICBkZXN0cm95ZWQudGhlbihkb25lKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJjcmVhdGVzIHBkZiBkb2MgZnJvbSBVUkwgYW5kIGFib3J0cyBsb2FkaW5nIGFmdGVyIHdvcmtlciBpbml0aWFsaXplZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoYmFzaWNBcGlHZXREb2N1bWVudFBhcmFtcyk7CisKKyAgICAgIHZhciBkZXN0cm95ZWQgPSBsb2FkaW5nVGFzay5fd29ya2VyLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBsb2FkaW5nVGFzay5kZXN0cm95KCk7CisgICAgICB9KTsKKworICAgICAgZGVzdHJveWVkLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KHRydWUpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImNyZWF0ZXMgcGRmIGRvYyBmcm9tIHR5cGVkIGFycmF5IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGxldCB0eXBlZEFycmF5UGRmUHJvbWlzZTsKKworICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgIHR5cGVkQXJyYXlQZGZQcm9taXNlID0gX3Rlc3RfdXRpbHMuTm9kZUZpbGVSZWFkZXJGYWN0b3J5LmZldGNoKHsKKyAgICAgICAgICBwYXRoOiBfdGVzdF91dGlscy5URVNUX1BERlNfUEFUSC5ub2RlICsgYmFzaWNBcGlGaWxlTmFtZQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGVkQXJyYXlQZGZQcm9taXNlID0gX3Rlc3RfdXRpbHMuRE9NRmlsZVJlYWRlckZhY3RvcnkuZmV0Y2goeworICAgICAgICAgIHBhdGg6IF90ZXN0X3V0aWxzLlRFU1RfUERGU19QQVRILmRvbSArIGJhc2ljQXBpRmlsZU5hbWUKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHR5cGVkQXJyYXlQZGZQcm9taXNlLnRoZW4odHlwZWRBcnJheVBkZiA9PiB7CisgICAgICAgIGV4cGVjdCh0eXBlZEFycmF5UGRmLmxlbmd0aCkudG9FcXVhbChiYXNpY0FwaUZpbGVMZW5ndGgpOworICAgICAgICBjb25zdCBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSh0eXBlZEFycmF5UGRmKTsKKyAgICAgICAgY29uc3QgcHJvZ3Jlc3NSZXBvcnRlZENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcyA9IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRlZENhcGFiaWxpdHkucmVzb2x2ZShkYXRhKTsKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2xvYWRpbmdUYXNrLnByb21pc2UsIHByb2dyZXNzUmVwb3J0ZWRDYXBhYmlsaXR5LnByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgZXhwZWN0KGRhdGFbMF0gaW5zdGFuY2VvZiBfYXBpLlBERkRvY3VtZW50UHJveHkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgICAgZXhwZWN0KGRhdGFbMV0ubG9hZGVkIC8gZGF0YVsxXS50b3RhbCkudG9FcXVhbCgxKTsKKyAgICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgICAgfSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJjcmVhdGVzIHBkZiBkb2MgZnJvbSBpbnZhbGlkIFBERiBmaWxlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoImJ1ZzEwMjAyMjYucGRmIikpOworICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZG9uZS5mYWlsKCJzaGFsbCBmYWlsIGxvYWRpbmciKTsKKyAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgZXhwZWN0KHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkludmFsaWRQREZFeGNlcHRpb24pLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChyZWFzb24ubWVzc2FnZSkudG9FcXVhbCgiSW52YWxpZCBQREYgc3RydWN0dXJlLiIpOworICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJjcmVhdGVzIHBkZiBkb2MgZnJvbSBub24tZXhpc3RlbnQgVVJMIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoIm5vbi1leGlzdGVudC5wZGYiKSk7CisgICAgICBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICAgIGRvbmUuZmFpbCgic2hhbGwgZmFpbCBsb2FkaW5nIik7CisgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsKKyAgICAgICAgZXhwZWN0KGVycm9yIGluc3RhbmNlb2YgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgiY3JlYXRlcyBwZGYgZG9jIGZyb20gUERGIGZpbGUgcHJvdGVjdGVkIHdpdGggdXNlciBhbmQgb3duZXIgcGFzc3dvcmQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgicHI2NTMxXzEucGRmIikpOworICAgICAgdmFyIHBhc3N3b3JkTmVlZGVkQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHZhciBwYXNzd29yZEluY29ycmVjdENhcGFiaWxpdHkgPSAoMCwgX3V0aWwuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICAgIGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQgPSBmdW5jdGlvbiAodXBkYXRlUGFzc3dvcmQsIHJlYXNvbikgeworICAgICAgICBpZiAocmVhc29uID09PSBfdXRpbC5QYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEICYmICFwYXNzd29yZE5lZWRlZENhcGFiaWxpdHkuc2V0dGxlZCkgeworICAgICAgICAgIHBhc3N3b3JkTmVlZGVkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICAgICAgdXBkYXRlUGFzc3dvcmQoInF3ZXJ0eSIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFzb24gPT09IF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCAmJiAhcGFzc3dvcmRJbmNvcnJlY3RDYXBhYmlsaXR5LnNldHRsZWQpIHsKKyAgICAgICAgICBwYXNzd29yZEluY29ycmVjdENhcGFiaWxpdHkucmVzb2x2ZSgpOworICAgICAgICAgIHVwZGF0ZVBhc3N3b3JkKCJhc2RmYXNkZiIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cGVjdChmYWxzZSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIH07CisKKyAgICAgIHZhciBwcm9taXNlcyA9IFtwYXNzd29yZE5lZWRlZENhcGFiaWxpdHkucHJvbWlzZSwgcGFzc3dvcmRJbmNvcnJlY3RDYXBhYmlsaXR5LnByb21pc2UsIGxvYWRpbmdUYXNrLnByb21pc2VdOworICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KGRhdGFbMl0gaW5zdGFuY2VvZiBfYXBpLlBERkRvY3VtZW50UHJveHkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiY3JlYXRlcyBwZGYgZG9jIGZyb20gUERGIGZpbGUgcHJvdGVjdGVkIHdpdGggb25seSBhIHVzZXIgcGFzc3dvcmQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGZpbGVuYW1lID0gInByNjUzMV8yLnBkZiI7CisgICAgICB2YXIgcGFzc3dvcmROZWVkZWRMb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoZmlsZW5hbWUsIHsKKyAgICAgICAgcGFzc3dvcmQ6ICIiCisgICAgICB9KSk7CisgICAgICB2YXIgcmVzdWx0MSA9IHBhc3N3b3JkTmVlZGVkTG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZG9uZS5mYWlsKCJzaGFsbCBmYWlsIHdpdGggbm8gcGFzc3dvcmQiKTsKKyAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigibG9hZGluZ1Rhc2sgc2hvdWxkIGJlIHJlamVjdGVkIikpOworICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KGRhdGEgaW5zdGFuY2VvZiBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuY29kZSkudG9FcXVhbChfdXRpbC5QYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTsKKyAgICAgICAgcmV0dXJuIHBhc3N3b3JkTmVlZGVkTG9hZGluZ1Rhc2suZGVzdHJveSgpOworICAgICAgfSk7CisgICAgICB2YXIgcGFzc3dvcmRJbmNvcnJlY3RMb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoZmlsZW5hbWUsIHsKKyAgICAgICAgcGFzc3dvcmQ6ICJxd2VydHkiCisgICAgICB9KSk7CisgICAgICB2YXIgcmVzdWx0MiA9IHBhc3N3b3JkSW5jb3JyZWN0TG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZG9uZS5mYWlsKCJzaGFsbCBmYWlsIHdpdGggd3JvbmcgcGFzc3dvcmQiKTsKKyAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigibG9hZGluZ1Rhc2sgc2hvdWxkIGJlIHJlamVjdGVkIikpOworICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KGRhdGEgaW5zdGFuY2VvZiBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGRhdGEuY29kZSkudG9FcXVhbChfdXRpbC5QYXNzd29yZFJlc3BvbnNlcy5JTkNPUlJFQ1RfUEFTU1dPUkQpOworICAgICAgICByZXR1cm4gcGFzc3dvcmRJbmNvcnJlY3RMb2FkaW5nVGFzay5kZXN0cm95KCk7CisgICAgICB9KTsKKyAgICAgIHZhciBwYXNzd29yZEFjY2VwdGVkTG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKGZpbGVuYW1lLCB7CisgICAgICAgIHBhc3N3b3JkOiAiYXNkZmFzZGYiCisgICAgICB9KSk7CisgICAgICB2YXIgcmVzdWx0MyA9IHBhc3N3b3JkQWNjZXB0ZWRMb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KGRhdGEgaW5zdGFuY2VvZiBfYXBpLlBERkRvY3VtZW50UHJveHkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIHJldHVybiBwYXNzd29yZEFjY2VwdGVkTG9hZGluZ1Rhc2suZGVzdHJveSgpOworICAgICAgfSk7CisgICAgICBQcm9taXNlLmFsbChbcmVzdWx0MSwgcmVzdWx0MiwgcmVzdWx0M10pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJjcmVhdGVzIHBkZiBkb2MgZnJvbSBwYXNzd29yZCBwcm90ZWN0ZWQgUERGIGZpbGUgYW5kIGFib3J0cy90aHJvd3MgIiArICJpbiB0aGUgb25QYXNzd29yZCBjYWxsYmFjayAoaXNzdWUgNzgwNikiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGZpbGVuYW1lID0gImlzc3VlMzM3MS5wZGYiOworICAgICAgdmFyIHBhc3N3b3JkTmVlZGVkTG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKGZpbGVuYW1lKSk7CisgICAgICB2YXIgcGFzc3dvcmRJbmNvcnJlY3RMb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoZmlsZW5hbWUsIHsKKyAgICAgICAgcGFzc3dvcmQ6ICJxd2VydHkiCisgICAgICB9KSk7CisgICAgICBsZXQgcGFzc3dvcmROZWVkZWREZXN0cm95ZWQ7CisKKyAgICAgIHBhc3N3b3JkTmVlZGVkTG9hZGluZ1Rhc2sub25QYXNzd29yZCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgcmVhc29uKSB7CisgICAgICAgIGlmIChyZWFzb24gPT09IF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkQpIHsKKyAgICAgICAgICBwYXNzd29yZE5lZWRlZERlc3Ryb3llZCA9IHBhc3N3b3JkTmVlZGVkTG9hZGluZ1Rhc2suZGVzdHJveSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cGVjdChmYWxzZSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIH07CisKKyAgICAgIHZhciByZXN1bHQxID0gcGFzc3dvcmROZWVkZWRMb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBkb25lLmZhaWwoInNoYWxsIGZhaWwgc2luY2UgdGhlIGxvYWRpbmdUYXNrIHNob3VsZCBiZSBkZXN0cm95ZWQiKTsKKyAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigibG9hZGluZ1Rhc2sgc2hvdWxkIGJlIHJlamVjdGVkIikpOworICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBleHBlY3QocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24pLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChyZWFzb24uY29kZSkudG9FcXVhbChfdXRpbC5QYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTsKKyAgICAgICAgcmV0dXJuIHBhc3N3b3JkTmVlZGVkRGVzdHJveWVkOworICAgICAgfSk7CisKKyAgICAgIHBhc3N3b3JkSW5jb3JyZWN0TG9hZGluZ1Rhc2sub25QYXNzd29yZCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgcmVhc29uKSB7CisgICAgICAgIGlmIChyZWFzb24gPT09IF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW5jb3JyZWN0IHBhc3N3b3JkIik7CisgICAgICAgIH0KKworICAgICAgICBleHBlY3QoZmFsc2UpLnRvRXF1YWwodHJ1ZSk7CisgICAgICB9OworCisgICAgICB2YXIgcmVzdWx0MiA9IHBhc3N3b3JkSW5jb3JyZWN0TG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZG9uZS5mYWlsKCJzaGFsbCBmYWlsIHNpbmNlIHRoZSBvblBhc3N3b3JkIGNhbGxiYWNrIHNob3VsZCB0aHJvdyIpOworICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJsb2FkaW5nVGFzayBzaG91bGQgYmUgcmVqZWN0ZWQiKSk7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGV4cGVjdChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KHJlYXNvbi5jb2RlKS50b0VxdWFsKF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCk7CisgICAgICAgIHJldHVybiBwYXNzd29yZEluY29ycmVjdExvYWRpbmdUYXNrLmRlc3Ryb3koKTsKKyAgICAgIH0pOworICAgICAgUHJvbWlzZS5hbGwoW3Jlc3VsdDEsIHJlc3VsdDJdKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiY3JlYXRlcyBwZGYgZG9jIGZyb20gZW1wdHkgdHlwZWQgYXJyYXkiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkobmV3IFVpbnQ4QXJyYXkoMCkpOworICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZG9uZS5mYWlsKCJzaGFsbCBub3Qgb3BlbiBlbXB0eSBmaWxlIik7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGV4cGVjdChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKTsKKyAgICAgICAgZXhwZWN0KHJlYXNvbi5tZXNzYWdlKS50b0VxdWFsKCJUaGUgUERGIGZpbGUgaXMgZW1wdHksIGkuZS4gaXRzIHNpemUgaXMgemVybyBieXRlcy4iKTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJQREZXb3JrZXIiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoIndvcmtlciBjcmVhdGVkIG9yIGRlc3Ryb3llZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgcGVuZGluZygiV29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gTm9kZS5qcy4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIHdvcmtlciA9IG5ldyBfYXBpLlBERldvcmtlcih7CisgICAgICAgIG5hbWU6ICJ0ZXN0MSIKKyAgICAgIH0pOworICAgICAgd29ya2VyLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGV4cGVjdCh3b3JrZXIubmFtZSkudG9FcXVhbCgidGVzdDEiKTsKKyAgICAgICAgZXhwZWN0KCEhd29ya2VyLnBvcnQpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdCh3b3JrZXIuZGVzdHJveWVkKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KCEhd29ya2VyLl93ZWJXb3JrZXIpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdCh3b3JrZXIucG9ydCA9PT0gd29ya2VyLl93ZWJXb3JrZXIpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIHdvcmtlci5kZXN0cm95KCk7CisgICAgICAgIGV4cGVjdCghIXdvcmtlci5wb3J0KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KHdvcmtlci5kZXN0cm95ZWQpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoIndvcmtlciBjcmVhdGVkIG9yIGRlc3Ryb3llZCBieSBnZXREb2N1bWVudCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgcGVuZGluZygiV29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gTm9kZS5qcy4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKGJhc2ljQXBpR2V0RG9jdW1lbnRQYXJhbXMpOworICAgICAgdmFyIHdvcmtlcjsKKyAgICAgIGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHdvcmtlciA9IGxvYWRpbmdUYXNrLl93b3JrZXI7CisgICAgICAgIGV4cGVjdCghIXdvcmtlcikudG9FcXVhbCh0cnVlKTsKKyAgICAgIH0pOworICAgICAgdmFyIGRlc3Ryb3lQcm9taXNlID0gbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRpbmdUYXNrLmRlc3Ryb3koKTsKKyAgICAgIH0pOworICAgICAgZGVzdHJveVByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBkZXN0cm95ZWRXb3JrZXIgPSBsb2FkaW5nVGFzay5fd29ya2VyOworICAgICAgICBleHBlY3QoISFkZXN0cm95ZWRXb3JrZXIpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBleHBlY3Qod29ya2VyLmRlc3Ryb3llZCkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgid29ya2VyIGNyZWF0ZWQgYW5kIGNhbiBiZSB1c2VkIGluIGdldERvY3VtZW50IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGlmIChfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICBwZW5kaW5nKCJXb3JrZXIgaXMgbm90IHN1cHBvcnRlZCBpbiBOb2RlLmpzLiIpOworICAgICAgfQorCisgICAgICB2YXIgd29ya2VyID0gbmV3IF9hcGkuUERGV29ya2VyKHsKKyAgICAgICAgbmFtZTogInRlc3QxIgorICAgICAgfSk7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKGJhc2ljQXBpRmlsZU5hbWUsIHsKKyAgICAgICAgd29ya2VyCisgICAgICB9KSk7CisgICAgICBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgZG9jV29ya2VyID0gbG9hZGluZ1Rhc2suX3dvcmtlcjsKKyAgICAgICAgZXhwZWN0KCEhZG9jV29ya2VyKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgdmFyIG1lc3NhZ2VIYW5kbGVyUG9ydCA9IGxvYWRpbmdUYXNrLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuY29tT2JqOworICAgICAgICBleHBlY3QobWVzc2FnZUhhbmRsZXJQb3J0ID09PSB3b3JrZXIucG9ydCkudG9FcXVhbCh0cnVlKTsKKyAgICAgIH0pOworICAgICAgdmFyIGRlc3Ryb3lQcm9taXNlID0gbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRpbmdUYXNrLmRlc3Ryb3koKTsKKyAgICAgIH0pOworICAgICAgZGVzdHJveVByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGV4cGVjdCh3b3JrZXIuZGVzdHJveWVkKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgd29ya2VyLmRlc3Ryb3koKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiY3JlYXRlcyBtb3JlIHRoYW4gb25lIHdvcmtlciIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgcGVuZGluZygiV29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gTm9kZS5qcy4iKTsKKyAgICAgIH0KKworICAgICAgdmFyIHdvcmtlcjEgPSBuZXcgX2FwaS5QREZXb3JrZXIoeworICAgICAgICBuYW1lOiAidGVzdDEiCisgICAgICB9KTsKKyAgICAgIHZhciB3b3JrZXIyID0gbmV3IF9hcGkuUERGV29ya2VyKHsKKyAgICAgICAgbmFtZTogInRlc3QyIgorICAgICAgfSk7CisgICAgICB2YXIgd29ya2VyMyA9IG5ldyBfYXBpLlBERldvcmtlcih7CisgICAgICAgIG5hbWU6ICJ0ZXN0MyIKKyAgICAgIH0pOworICAgICAgdmFyIHJlYWR5ID0gUHJvbWlzZS5hbGwoW3dvcmtlcjEucHJvbWlzZSwgd29ya2VyMi5wcm9taXNlLCB3b3JrZXIzLnByb21pc2VdKTsKKyAgICAgIHJlYWR5LnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBleHBlY3Qod29ya2VyMS5wb3J0ICE9PSB3b3JrZXIyLnBvcnQgJiYgd29ya2VyMS5wb3J0ICE9PSB3b3JrZXIzLnBvcnQgJiYgd29ya2VyMi5wb3J0ICE9PSB3b3JrZXIzLnBvcnQpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIHdvcmtlcjEuZGVzdHJveSgpOworICAgICAgICB3b3JrZXIyLmRlc3Ryb3koKTsKKyAgICAgICAgd29ya2VyMy5kZXN0cm95KCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgY3VycmVudCB3b3JrZXJTcmMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgcGVuZGluZygiV29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gTm9kZS5qcy4iKTsKKyAgICAgIH0KKworICAgICAgY29uc3Qgd29ya2VyU3JjID0gX2FwaS5QREZXb3JrZXIuZ2V0V29ya2VyU3JjKCk7CisKKyAgICAgIGV4cGVjdCh0eXBlb2Ygd29ya2VyU3JjKS50b0VxdWFsKCJzdHJpbmciKTsKKyAgICAgIGV4cGVjdCh3b3JrZXJTcmMpLnRvRXF1YWwoX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJQREZEb2N1bWVudCIsIGZ1bmN0aW9uICgpIHsKKyAgICBsZXQgcGRmTG9hZGluZ1Rhc2ssIHBkZkRvY3VtZW50OworICAgIGJlZm9yZUFsbChmdW5jdGlvbiAoZG9uZSkgeworICAgICAgcGRmTG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoYmFzaWNBcGlHZXREb2N1bWVudFBhcmFtcyk7CisgICAgICBwZGZMb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgcGRmRG9jdW1lbnQgPSBkYXRhOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBhZnRlckFsbChmdW5jdGlvbiAoZG9uZSkgeworICAgICAgcGRmTG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgfSk7CisgICAgaXQoImdldHMgbnVtYmVyIG9mIHBhZ2VzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KHBkZkRvY3VtZW50Lm51bVBhZ2VzKS50b0VxdWFsKDMpOworICAgIH0pOworICAgIGl0KCJnZXRzIGZpbmdlcnByaW50IiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KHBkZkRvY3VtZW50LmZpbmdlcnByaW50KS50b0VxdWFsKCJlYThiMzU5MTlkNjI3OWEzNjllODM1YmRlNzc4NjExYiIpOworICAgIH0pOworICAgIGl0KCJnZXRzIHBhZ2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHByb21pc2UgPSBwZGZEb2N1bWVudC5nZXRQYWdlKDEpOworICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIGV4cGVjdChkYXRhIGluc3RhbmNlb2YgX2FwaS5QREZQYWdlUHJveHkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChkYXRhLnBhZ2VOdW1iZXIpLnRvRXF1YWwoMSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgbm9uLWV4aXN0ZW50IHBhZ2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIG91dE9mUmFuZ2VQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0UGFnZSgxMDApOworICAgICAgdmFyIG5vbkludGVnZXJQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0UGFnZSgyLjUpOworICAgICAgdmFyIG5vbk51bWJlclByb21pc2UgPSBwZGZEb2N1bWVudC5nZXRQYWdlKCIxIik7CisgICAgICBvdXRPZlJhbmdlUHJvbWlzZSA9IG91dE9mUmFuZ2VQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInNoYWxsIGZhaWwgZm9yIG91dC1vZi1yYW5nZSBwYWdlTnVtYmVyIHBhcmFtZXRlciIpOworICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBleHBlY3QocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpLnRvRXF1YWwodHJ1ZSk7CisgICAgICB9KTsKKyAgICAgIG5vbkludGVnZXJQcm9taXNlID0gbm9uSW50ZWdlclByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigic2hhbGwgZmFpbCBmb3Igbm9uLWludGVnZXIgcGFnZU51bWJlciBwYXJhbWV0ZXIiKTsKKyAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgZXhwZWN0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKS50b0VxdWFsKHRydWUpOworICAgICAgfSk7CisgICAgICBub25OdW1iZXJQcm9taXNlID0gbm9uTnVtYmVyUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJzaGFsbCBmYWlsIGZvciBub24tbnVtYmVyIHBhZ2VOdW1iZXIgcGFyYW1ldGVyIik7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGV4cGVjdChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikudG9FcXVhbCh0cnVlKTsKKyAgICAgIH0pOworICAgICAgUHJvbWlzZS5hbGwoW291dE9mUmFuZ2VQcm9taXNlLCBub25JbnRlZ2VyUHJvbWlzZSwgbm9uTnVtYmVyUHJvbWlzZV0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIHBhZ2UsIGZyb20gL1BhZ2VzIHRyZWUgd2l0aCBjaXJjdWxhciByZWZlcmVuY2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJQYWdlcy10cmVlLXJlZnMucGRmIikpOworICAgICAgY29uc3QgcGFnZTEgPSBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2UoMSkudGhlbihmdW5jdGlvbiAocGRmUGFnZSkgeworICAgICAgICAgIGV4cGVjdChwZGZQYWdlIGluc3RhbmNlb2YgX2FwaS5QREZQYWdlUHJveHkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgICAgZXhwZWN0KHBkZlBhZ2UucmVmKS50b0VxdWFsKHsKKyAgICAgICAgICAgIG51bTogNiwKKyAgICAgICAgICAgIGdlbjogMAorICAgICAgICAgIH0pOworICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJzaGFsbCBub3QgZmFpbCBmb3IgdmFsaWQgcGFnZSIpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgY29uc3QgcGFnZTIgPSBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2UoMikudGhlbihmdW5jdGlvbiAocGRmUGFnZSkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigic2hhbGwgZmFpbCBmb3IgaW52YWxpZCBwYWdlIik7CisgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBleHBlY3QocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgICAgZXhwZWN0KHJlYXNvbi5tZXNzYWdlKS50b0VxdWFsKCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIFByb21pc2UuYWxsKFtwYWdlMSwgcGFnZTJdKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIHBhZ2UgaW5kZXgiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHJlZiA9IHsKKyAgICAgICAgbnVtOiAxNywKKyAgICAgICAgZ2VuOiAwCisgICAgICB9OworICAgICAgdmFyIHByb21pc2UgPSBwZGZEb2N1bWVudC5nZXRQYWdlSW5kZXgocmVmKTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocGFnZUluZGV4KSB7CisgICAgICAgIGV4cGVjdChwYWdlSW5kZXgpLnRvRXF1YWwoMSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgaW52YWxpZCBwYWdlIGluZGV4IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciByZWYgPSB7CisgICAgICAgIG51bTogMywKKyAgICAgICAgZ2VuOiAwCisgICAgICB9OworICAgICAgdmFyIHByb21pc2UgPSBwZGZEb2N1bWVudC5nZXRQYWdlSW5kZXgocmVmKTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGRvbmUuZmFpbCgic2hhbGwgZmFpbCBmb3IgaW52YWxpZCBwYWdlIHJlZmVyZW5jZS4iKTsKKyAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgZXhwZWN0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKS50b0VxdWFsKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBkZXN0aW5hdGlvbnMsIGZyb20gL0Rlc3RzIGRpY3Rpb25hcnkiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHByb21pc2UgPSBwZGZEb2N1bWVudC5nZXREZXN0aW5hdGlvbnMoKTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBleHBlY3QoZGF0YSkudG9FcXVhbCh7CisgICAgICAgICAgY2hhcHRlcjE6IFt7CisgICAgICAgICAgICBnZW46IDAsCisgICAgICAgICAgICBudW06IDE3CisgICAgICAgICAgfSwgeworICAgICAgICAgICAgbmFtZTogIlhZWiIKKyAgICAgICAgICB9LCAwLCA4NDEuODksIG51bGxdCisgICAgICAgIH0pOworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIGEgZGVzdGluYXRpb24sIGZyb20gL0Rlc3RzIGRpY3Rpb25hcnkiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHByb21pc2UgPSBwZGZEb2N1bWVudC5nZXREZXN0aW5hdGlvbigiY2hhcHRlcjEiKTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBleHBlY3QoZGF0YSkudG9FcXVhbChbeworICAgICAgICAgIGdlbjogMCwKKyAgICAgICAgICBudW06IDE3CisgICAgICAgIH0sIHsKKyAgICAgICAgICBuYW1lOiAiWFlaIgorICAgICAgICB9LCAwLCA4NDEuODksIG51bGxdKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBhIG5vbi1leGlzdGVudCBkZXN0aW5hdGlvbiwgZnJvbSAvRGVzdHMgZGljdGlvbmFyeSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgcHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldERlc3RpbmF0aW9uKCJub24tZXhpc3RlbnQtbmFtZWQtZGVzdGluYXRpb24iKTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBleHBlY3QoZGF0YSkudG9FcXVhbChudWxsKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBkZXN0aW5hdGlvbnMsIGZyb20gL05hbWVzIChOYW1lVHJlZSkgZGljdGlvbmFyeSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJpc3N1ZTYyMDQucGRmIikpOworICAgICAgdmFyIHByb21pc2UgPSBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldERlc3RpbmF0aW9ucygpOworICAgICAgfSk7CisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRlc3RpbmF0aW9ucykgeworICAgICAgICBleHBlY3QoZGVzdGluYXRpb25zKS50b0VxdWFsKHsKKyAgICAgICAgICAiUGFnZS4xIjogW3sKKyAgICAgICAgICAgIG51bTogMSwKKyAgICAgICAgICAgIGdlbjogMAorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgIG5hbWU6ICJYWVoiCisgICAgICAgICAgfSwgMCwgMzc1LCBudWxsXSwKKyAgICAgICAgICAiUGFnZS4yIjogW3sKKyAgICAgICAgICAgIG51bTogNiwKKyAgICAgICAgICAgIGdlbjogMAorICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgIG5hbWU6ICJYWVoiCisgICAgICAgICAgfSwgMCwgMzc1LCBudWxsXQorICAgICAgICB9KTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIGEgZGVzdGluYXRpb24sIGZyb20gL05hbWVzIChOYW1lVHJlZSkgZGljdGlvbmFyeSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJpc3N1ZTYyMDQucGRmIikpOworICAgICAgdmFyIHByb21pc2UgPSBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldERlc3RpbmF0aW9uKCJQYWdlLjEiKTsKKyAgICAgIH0pOworICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkZXN0aW5hdGlvbikgeworICAgICAgICBleHBlY3QoZGVzdGluYXRpb24pLnRvRXF1YWwoW3sKKyAgICAgICAgICBudW06IDEsCisgICAgICAgICAgZ2VuOiAwCisgICAgICAgIH0sIHsKKyAgICAgICAgICBuYW1lOiAiWFlaIgorICAgICAgICB9LCAwLCAzNzUsIG51bGxdKTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIGEgbm9uLWV4aXN0ZW50IGRlc3RpbmF0aW9uLCBmcm9tIC9OYW1lcyAoTmFtZVRyZWUpIGRpY3Rpb25hcnkiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiaXNzdWU2MjA0LnBkZiIpKTsKKyAgICAgIHZhciBwcm9taXNlID0gbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwZGZEb2MpIHsKKyAgICAgICAgcmV0dXJuIHBkZkRvYy5nZXREZXN0aW5hdGlvbigibm9uLWV4aXN0ZW50LW5hbWVkLWRlc3RpbmF0aW9uIik7CisgICAgICB9KTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZGVzdGluYXRpb24pIHsKKyAgICAgICAgZXhwZWN0KGRlc3RpbmF0aW9uKS50b0VxdWFsKG51bGwpOworICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgbm9uLXN0cmluZyBkZXN0aW5hdGlvbiIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBsZXQgbnVtYmVyUHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldERlc3RpbmF0aW9uKDQuMyk7CisgICAgICBsZXQgYm9vbGVhblByb21pc2UgPSBwZGZEb2N1bWVudC5nZXREZXN0aW5hdGlvbih0cnVlKTsKKyAgICAgIGxldCBhcnJheVByb21pc2UgPSBwZGZEb2N1bWVudC5nZXREZXN0aW5hdGlvbihbeworICAgICAgICBudW06IDE3LAorICAgICAgICBnZW46IDAKKyAgICAgIH0sIHsKKyAgICAgICAgbmFtZTogIlhZWiIKKyAgICAgIH0sIDAsIDg0MS44OSwgbnVsbF0pOworICAgICAgbnVtYmVyUHJvbWlzZSA9IG51bWJlclByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigic2hhbGwgZmFpbCBmb3Igbm9uLXN0cmluZyBkZXN0aW5hdGlvbi4iKTsKKyAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgZXhwZWN0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKS50b0VxdWFsKHRydWUpOworICAgICAgfSk7CisgICAgICBib29sZWFuUHJvbWlzZSA9IGJvb2xlYW5Qcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInNoYWxsIGZhaWwgZm9yIG5vbi1zdHJpbmcgZGVzdGluYXRpb24uIik7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGV4cGVjdChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikudG9FcXVhbCh0cnVlKTsKKyAgICAgIH0pOworICAgICAgYXJyYXlQcm9taXNlID0gYXJyYXlQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInNoYWxsIGZhaWwgZm9yIG5vbi1zdHJpbmcgZGVzdGluYXRpb24uIik7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGV4cGVjdChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikudG9FcXVhbCh0cnVlKTsKKyAgICAgIH0pOworICAgICAgUHJvbWlzZS5hbGwoW251bWJlclByb21pc2UsIGJvb2xlYW5Qcm9taXNlLCBhcnJheVByb21pc2VdKS50aGVuKGRvbmUsIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgbm9uLWV4aXN0ZW50IHBhZ2UgbGFiZWxzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBwcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0UGFnZUxhYmVscygpOworICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIGV4cGVjdChkYXRhKS50b0VxdWFsKG51bGwpOworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIHBhZ2UgbGFiZWxzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBsb2FkaW5nVGFzazAgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJidWc3OTM2MzIucGRmIikpOworICAgICAgdmFyIHByb21pc2UwID0gbG9hZGluZ1Rhc2swLnByb21pc2UudGhlbihmdW5jdGlvbiAocGRmRG9jKSB7CisgICAgICAgIHJldHVybiBwZGZEb2MuZ2V0UGFnZUxhYmVscygpOworICAgICAgfSk7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sxID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiaXNzdWUxNDUzLnBkZiIpKTsKKyAgICAgIHZhciBwcm9taXNlMSA9IGxvYWRpbmdUYXNrMS5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2VMYWJlbHMoKTsKKyAgICAgIH0pOworICAgICAgdmFyIGxvYWRpbmdUYXNrMiA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoInJvdGF0aW9uLnBkZiIpKTsKKyAgICAgIHZhciBwcm9taXNlMiA9IGxvYWRpbmdUYXNrMi5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2VMYWJlbHMoKTsKKyAgICAgIH0pOworICAgICAgdmFyIGxvYWRpbmdUYXNrMyA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoImJhZC1QYWdlTGFiZWxzLnBkZiIpKTsKKyAgICAgIHZhciBwcm9taXNlMyA9IGxvYWRpbmdUYXNrMy5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2VMYWJlbHMoKTsKKyAgICAgIH0pOworICAgICAgUHJvbWlzZS5hbGwoW3Byb21pc2UwLCBwcm9taXNlMSwgcHJvbWlzZTIsIHByb21pc2UzXSkudGhlbihmdW5jdGlvbiAocGFnZUxhYmVscykgeworICAgICAgICBleHBlY3QocGFnZUxhYmVsc1swXSkudG9FcXVhbChbImkiLCAiaWkiLCAiaWlpIiwgIjEiXSk7CisgICAgICAgIGV4cGVjdChwYWdlTGFiZWxzWzFdKS50b0VxdWFsKFsiRnJvbnQgUGFnZTEiXSk7CisgICAgICAgIGV4cGVjdChwYWdlTGFiZWxzWzJdKS50b0VxdWFsKFsiMSIsICIyIl0pOworICAgICAgICBleHBlY3QocGFnZUxhYmVsc1szXSkudG9FcXVhbChbIlgzIl0pOworICAgICAgICBQcm9taXNlLmFsbChbbG9hZGluZ1Rhc2swLmRlc3Ryb3koKSwgbG9hZGluZ1Rhc2sxLmRlc3Ryb3koKSwgbG9hZGluZ1Rhc2syLmRlc3Ryb3koKSwgbG9hZGluZ1Rhc2szLmRlc3Ryb3koKV0pLnRoZW4oZG9uZSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIGRlZmF1bHQgcGFnZSBsYXlvdXQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgidHJhY2Vtb25rZXkucGRmIikpOworICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwZGZEb2MpIHsKKyAgICAgICAgcmV0dXJuIHBkZkRvYy5nZXRQYWdlTGF5b3V0KCk7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChtb2RlKSB7CisgICAgICAgIGV4cGVjdChtb2RlKS50b0VxdWFsKCIiKTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIG5vbi1kZWZhdWx0IHBhZ2UgbGF5b3V0IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHBkZkRvY3VtZW50LmdldFBhZ2VMYXlvdXQoKS50aGVuKGZ1bmN0aW9uIChtb2RlKSB7CisgICAgICAgIGV4cGVjdChtb2RlKS50b0VxdWFsKCJTaW5nbGVQYWdlIik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgZGVmYXVsdCBwYWdlIG1vZGUiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgidHJhY2Vtb25rZXkucGRmIikpOworICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwZGZEb2MpIHsKKyAgICAgICAgcmV0dXJuIHBkZkRvYy5nZXRQYWdlTW9kZSgpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAobW9kZSkgeworICAgICAgICBleHBlY3QobW9kZSkudG9FcXVhbCgiVXNlTm9uZSIpOworICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgbm9uLWRlZmF1bHQgcGFnZSBtb2RlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHBkZkRvY3VtZW50LmdldFBhZ2VNb2RlKCkudGhlbihmdW5jdGlvbiAobW9kZSkgeworICAgICAgICBleHBlY3QobW9kZSkudG9FcXVhbCgiVXNlT3V0bGluZXMiKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBkZWZhdWx0IHZpZXdlciBwcmVmZXJlbmNlcyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJ0cmFjZW1vbmtleS5wZGYiKSk7CisgICAgICBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFZpZXdlclByZWZlcmVuY2VzKCk7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChwcmVmcykgeworICAgICAgICBleHBlY3QocHJlZnMpLnRvRXF1YWwobnVsbCk7CisgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBub24tZGVmYXVsdCB2aWV3ZXIgcHJlZmVyZW5jZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgcGRmRG9jdW1lbnQuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKS50aGVuKGZ1bmN0aW9uIChwcmVmcykgeworICAgICAgICBleHBlY3QocHJlZnMpLnRvRXF1YWwoeworICAgICAgICAgIERpcmVjdGlvbjogIkwyUiIKKyAgICAgICAgfSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgZGVmYXVsdCBvcGVuIGFjdGlvbiIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJ0cmFjZW1vbmtleS5wZGYiKSk7CisgICAgICBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldE9wZW5BY3Rpb24oKTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKG9wZW5BY3Rpb24pIHsKKyAgICAgICAgZXhwZWN0KG9wZW5BY3Rpb24pLnRvRXF1YWwobnVsbCk7CisgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBub24tZGVmYXVsdCBvcGVuIGFjdGlvbiAod2l0aCBkZXN0aW5hdGlvbikiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgcGRmRG9jdW1lbnQuZ2V0T3BlbkFjdGlvbigpLnRoZW4oZnVuY3Rpb24gKG9wZW5BY3Rpb24pIHsKKyAgICAgICAgZXhwZWN0KG9wZW5BY3Rpb24uZGVzdCkudG9FcXVhbChbeworICAgICAgICAgIG51bTogMTUsCisgICAgICAgICAgZ2VuOiAwCisgICAgICAgIH0sIHsKKyAgICAgICAgICBuYW1lOiAiRml0SCIKKyAgICAgICAgfSwgbnVsbF0pOworICAgICAgICBleHBlY3Qob3BlbkFjdGlvbi5hY3Rpb24pLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBub24tZGVmYXVsdCBvcGVuIGFjdGlvbiAod2l0aCBQcmludCBhY3Rpb24pIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGxvYWRpbmdUYXNrMSA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoImJ1ZzEwMDEwODAucGRmIikpOworICAgICAgY29uc3QgbG9hZGluZ1Rhc2syID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiaXNzdWUxMTQ0Ml9yZWR1Y2VkLnBkZiIpKTsKKyAgICAgIGNvbnN0IHByb21pc2UxID0gbG9hZGluZ1Rhc2sxLnByb21pc2UudGhlbihmdW5jdGlvbiAocGRmRG9jKSB7CisgICAgICAgIHJldHVybiBwZGZEb2MuZ2V0T3BlbkFjdGlvbigpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAob3BlbkFjdGlvbikgeworICAgICAgICBleHBlY3Qob3BlbkFjdGlvbi5kZXN0KS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGV4cGVjdChvcGVuQWN0aW9uLmFjdGlvbikudG9FcXVhbCgiUHJpbnQiKTsKKyAgICAgICAgcmV0dXJuIGxvYWRpbmdUYXNrMS5kZXN0cm95KCk7CisgICAgICB9KTsKKyAgICAgIGNvbnN0IHByb21pc2UyID0gbG9hZGluZ1Rhc2syLnByb21pc2UudGhlbihmdW5jdGlvbiAocGRmRG9jKSB7CisgICAgICAgIHJldHVybiBwZGZEb2MuZ2V0T3BlbkFjdGlvbigpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAob3BlbkFjdGlvbikgeworICAgICAgICBleHBlY3Qob3BlbkFjdGlvbi5kZXN0KS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGV4cGVjdChvcGVuQWN0aW9uLmFjdGlvbikudG9FcXVhbCgiUHJpbnQiKTsKKyAgICAgICAgcmV0dXJuIGxvYWRpbmdUYXNrMi5kZXN0cm95KCk7CisgICAgICB9KTsKKyAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlMSwgcHJvbWlzZTJdKS50aGVuKGRvbmUsIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgbm9uLWV4aXN0ZW50IGF0dGFjaG1lbnRzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBwcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0QXR0YWNobWVudHMoKTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBleHBlY3QoZGF0YSkudG9FcXVhbChudWxsKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBhdHRhY2htZW50cyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJhdHRhY2htZW50LnBkZiIpKTsKKyAgICAgIHZhciBwcm9taXNlID0gbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwZGZEb2MpIHsKKyAgICAgICAgcmV0dXJuIHBkZkRvYy5nZXRBdHRhY2htZW50cygpOworICAgICAgfSk7CisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgdmFyIGF0dGFjaG1lbnQgPSBkYXRhWyJmb28udHh0Il07CisgICAgICAgIGV4cGVjdChhdHRhY2htZW50LmZpbGVuYW1lKS50b0VxdWFsKCJmb28udHh0Iik7CisgICAgICAgIGV4cGVjdChhdHRhY2htZW50LmNvbnRlbnQpLnRvRXF1YWwobmV3IFVpbnQ4QXJyYXkoWzk4LCA5NywgMTE0LCAzMiwgOTgsIDk3LCAxMjIsIDMyLCAxMF0pKTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIGphdmFzY3JpcHQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHByb21pc2UgPSBwZGZEb2N1bWVudC5nZXRKYXZhU2NyaXB0KCk7CisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KGRhdGEpLnRvRXF1YWwobnVsbCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgamF2YXNjcmlwdCB3aXRoIHByaW50aW5nIGluc3RydWN0aW9ucyAoSlMgYWN0aW9uKSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJpc3N1ZTYxMDYucGRmIikpOworICAgICAgdmFyIHByb21pc2UgPSBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldEphdmFTY3JpcHQoKTsKKyAgICAgIH0pOworICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIGV4cGVjdChkYXRhKS50b0VxdWFsKFsidGhpcy5wcmludCh7YlVJOnRydWUsYlNpbGVudDpmYWxzZSxiU2hyaW5rVG9GaXQ6dHJ1ZX0pOyJdKTsKKyAgICAgICAgZXhwZWN0KGRhdGFbMF0pLnRvTWF0Y2goX3VpX3V0aWxzLkF1dG9QcmludFJlZ0V4cCk7CisgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBub24tZXhpc3RlbnQgb3V0bGluZSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJ0cmFjZW1vbmtleS5wZGYiKSk7CisgICAgICB2YXIgcHJvbWlzZSA9IGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAocGRmRG9jKSB7CisgICAgICAgIHJldHVybiBwZGZEb2MuZ2V0T3V0bGluZSgpOworICAgICAgfSk7CisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKG91dGxpbmUpIHsKKyAgICAgICAgZXhwZWN0KG91dGxpbmUpLnRvRXF1YWwobnVsbCk7CisgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBvdXRsaW5lIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBwcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0T3V0bGluZSgpOworICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChvdXRsaW5lKSB7CisgICAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KG91dGxpbmUpKS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3Qob3V0bGluZS5sZW5ndGgpLnRvRXF1YWwoMik7CisgICAgICAgIHZhciBvdXRsaW5lSXRlbSA9IG91dGxpbmVbMV07CisgICAgICAgIGV4cGVjdChvdXRsaW5lSXRlbS50aXRsZSkudG9FcXVhbCgiQ2hhcHRlciAxIik7CisgICAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KG91dGxpbmVJdGVtLmRlc3QpKS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3Qob3V0bGluZUl0ZW0udXJsKS50b0VxdWFsKG51bGwpOworICAgICAgICBleHBlY3Qob3V0bGluZUl0ZW0udW5zYWZlVXJsKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGV4cGVjdChvdXRsaW5lSXRlbS5uZXdXaW5kb3cpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgICAgZXhwZWN0KG91dGxpbmVJdGVtLmJvbGQpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChvdXRsaW5lSXRlbS5pdGFsaWMpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICBleHBlY3Qob3V0bGluZUl0ZW0uY29sb3IpLnRvRXF1YWwobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFswLCA2NCwgMTI4XSkpOworICAgICAgICBleHBlY3Qob3V0bGluZUl0ZW0uaXRlbXMubGVuZ3RoKS50b0VxdWFsKDEpOworICAgICAgICBleHBlY3Qob3V0bGluZUl0ZW0uaXRlbXNbMF0udGl0bGUpLnRvRXF1YWwoIlBhcmFncmFwaCAxLjEiKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBvdXRsaW5lIGNvbnRhaW5pbmcgYSB1cmwiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiaXNzdWUzMjE0LnBkZiIpKTsKKyAgICAgIGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAocGRmRG9jKSB7CisgICAgICAgIHBkZkRvYy5nZXRPdXRsaW5lKCkudGhlbihmdW5jdGlvbiAob3V0bGluZSkgeworICAgICAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KG91dGxpbmUpKS50b0VxdWFsKHRydWUpOworICAgICAgICAgIGV4cGVjdChvdXRsaW5lLmxlbmd0aCkudG9FcXVhbCg1KTsKKyAgICAgICAgICB2YXIgb3V0bGluZUl0ZW1Ud28gPSBvdXRsaW5lWzJdOworICAgICAgICAgIGV4cGVjdCh0eXBlb2Ygb3V0bGluZUl0ZW1Ud28udGl0bGUpLnRvRXF1YWwoInN0cmluZyIpOworICAgICAgICAgIGV4cGVjdChvdXRsaW5lSXRlbVR3by5kZXN0KS50b0VxdWFsKG51bGwpOworICAgICAgICAgIGV4cGVjdChvdXRsaW5lSXRlbVR3by51cmwpLnRvRXF1YWwoImh0dHA6Ly9nb29nbGUuY29tLyIpOworICAgICAgICAgIGV4cGVjdChvdXRsaW5lSXRlbVR3by51bnNhZmVVcmwpLnRvRXF1YWwoImh0dHA6Ly9nb29nbGUuY29tIik7CisgICAgICAgICAgZXhwZWN0KG91dGxpbmVJdGVtVHdvLm5ld1dpbmRvdykudG9CZVVuZGVmaW5lZCgpOworICAgICAgICAgIHZhciBvdXRsaW5lSXRlbU9uZSA9IG91dGxpbmVbMV07CisgICAgICAgICAgZXhwZWN0KG91dGxpbmVJdGVtT25lLmJvbGQpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICAgIGV4cGVjdChvdXRsaW5lSXRlbU9uZS5pdGFsaWMpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgICAgZXhwZWN0KG91dGxpbmVJdGVtT25lLmNvbG9yKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMCwgMCwgMF0pKTsKKyAgICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgICAgfSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIG5vbi1leGlzdGVudCBwZXJtaXNzaW9ucyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBwZGZEb2N1bWVudC5nZXRQZXJtaXNzaW9ucygpLnRoZW4oZnVuY3Rpb24gKHBlcm1pc3Npb25zKSB7CisgICAgICAgIGV4cGVjdChwZXJtaXNzaW9ucykudG9FcXVhbChudWxsKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBwZXJtaXNzaW9ucyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBsb2FkaW5nVGFzazAgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJpc3N1ZTk5NzItMS5wZGYiKSk7CisgICAgICBjb25zdCBwcm9taXNlMCA9IGxvYWRpbmdUYXNrMC5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBlcm1pc3Npb25zKCk7CisgICAgICB9KTsKKyAgICAgIGNvbnN0IGxvYWRpbmdUYXNrMSA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoImlzc3VlOTk3Mi0yLnBkZiIpKTsKKyAgICAgIGNvbnN0IHByb21pc2UxID0gbG9hZGluZ1Rhc2sxLnByb21pc2UudGhlbihmdW5jdGlvbiAocGRmRG9jKSB7CisgICAgICAgIHJldHVybiBwZGZEb2MuZ2V0UGVybWlzc2lvbnMoKTsKKyAgICAgIH0pOworICAgICAgY29uc3QgbG9hZGluZ1Rhc2syID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiaXNzdWU5OTcyLTMucGRmIikpOworICAgICAgY29uc3QgcHJvbWlzZTIgPSBsb2FkaW5nVGFzazIucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwZGZEb2MpIHsKKyAgICAgICAgcmV0dXJuIHBkZkRvYy5nZXRQZXJtaXNzaW9ucygpOworICAgICAgfSk7CisgICAgICBjb25zdCB0b3RhbFBlcm1pc3Npb25Db3VudCA9IE9iamVjdC5rZXlzKF91dGlsLlBlcm1pc3Npb25GbGFnKS5sZW5ndGg7CisgICAgICBQcm9taXNlLmFsbChbcHJvbWlzZTAsIHByb21pc2UxLCBwcm9taXNlMl0pLnRoZW4oZnVuY3Rpb24gKHBlcm1pc3Npb25zKSB7CisgICAgICAgIGV4cGVjdChwZXJtaXNzaW9uc1swXS5sZW5ndGgpLnRvRXF1YWwodG90YWxQZXJtaXNzaW9uQ291bnQgLSAxKTsKKyAgICAgICAgZXhwZWN0KHBlcm1pc3Npb25zWzBdLmluY2x1ZGVzKF91dGlsLlBlcm1pc3Npb25GbGFnLk1PRElGWV9DT05URU5UUykpLnRvQmVGYWxzeSgpOworICAgICAgICBleHBlY3QocGVybWlzc2lvbnNbMV0ubGVuZ3RoKS50b0VxdWFsKHRvdGFsUGVybWlzc2lvbkNvdW50IC0gMik7CisgICAgICAgIGV4cGVjdChwZXJtaXNzaW9uc1sxXS5pbmNsdWRlcyhfdXRpbC5QZXJtaXNzaW9uRmxhZy5QUklOVCkpLnRvQmVGYWxzeSgpOworICAgICAgICBleHBlY3QocGVybWlzc2lvbnNbMV0uaW5jbHVkZXMoX3V0aWwuUGVybWlzc2lvbkZsYWcuUFJJTlRfSElHSF9RVUFMSVRZKSkudG9CZUZhbHN5KCk7CisgICAgICAgIGV4cGVjdChwZXJtaXNzaW9uc1syXS5sZW5ndGgpLnRvRXF1YWwodG90YWxQZXJtaXNzaW9uQ291bnQgLSAxKTsKKyAgICAgICAgZXhwZWN0KHBlcm1pc3Npb25zWzJdLmluY2x1ZGVzKF91dGlsLlBlcm1pc3Npb25GbGFnLkNPUFkpKS50b0JlRmFsc3koKTsKKyAgICAgICAgUHJvbWlzZS5hbGwoW2xvYWRpbmdUYXNrMC5kZXN0cm95KCksIGxvYWRpbmdUYXNrMS5kZXN0cm95KCksIGxvYWRpbmdUYXNrMi5kZXN0cm95KCldKS50aGVuKGRvbmUpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBtZXRhZGF0YSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgcHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldE1ldGFkYXRhKCk7CisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHsKKyAgICAgICAgaW5mbywKKyAgICAgICAgbWV0YWRhdGEsCisgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lCisgICAgICB9KSB7CisgICAgICAgIGV4cGVjdChpbmZvLlRpdGxlKS50b0VxdWFsKCJCYXNpYyBBUEkgVGVzdCIpOworICAgICAgICBleHBlY3QoaW5mby5DdXN0b20pLnRvRXF1YWwodW5kZWZpbmVkKTsKKyAgICAgICAgZXhwZWN0KGluZm8uUERGRm9ybWF0VmVyc2lvbikudG9FcXVhbCgiMS43Iik7CisgICAgICAgIGV4cGVjdChpbmZvLklzTGluZWFyaXplZCkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChpbmZvLklzQWNyb0Zvcm1QcmVzZW50KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KGluZm8uSXNYRkFQcmVzZW50KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KGluZm8uSXNDb2xsZWN0aW9uUHJlc2VudCkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChtZXRhZGF0YSBpbnN0YW5jZW9mIF9tZXRhZGF0YS5NZXRhZGF0YSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KG1ldGFkYXRhLmdldCgiZGM6dGl0bGUiKSkudG9FcXVhbCgiQmFzaWMgQVBJIFRlc3QiKTsKKyAgICAgICAgZXhwZWN0KGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKS50b0VxdWFsKG51bGwpOworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIG1ldGFkYXRhLCB3aXRoIGN1c3RvbSBpbmZvIGRpY3QgZW50cmllcyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJ0cmFjZW1vbmtleS5wZGYiKSk7CisgICAgICBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldE1ldGFkYXRhKCk7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uICh7CisgICAgICAgIGluZm8sCisgICAgICAgIG1ldGFkYXRhLAorICAgICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZQorICAgICAgfSkgeworICAgICAgICBleHBlY3QoaW5mby5DcmVhdG9yKS50b0VxdWFsKCJUZVgiKTsKKyAgICAgICAgZXhwZWN0KGluZm8uUHJvZHVjZXIpLnRvRXF1YWwoInBkZmVUZVgtMS4yMWEiKTsKKyAgICAgICAgZXhwZWN0KGluZm8uQ3JlYXRpb25EYXRlKS50b0VxdWFsKCJEOjIwMDkwNDAxMTYzOTI1LTA3JzAwJyIpOworICAgICAgICBjb25zdCBjdXN0b20gPSBpbmZvLkN1c3RvbTsKKyAgICAgICAgZXhwZWN0KHR5cGVvZiBjdXN0b20gPT09ICJvYmplY3QiICYmIGN1c3RvbSAhPT0gbnVsbCkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGN1c3RvbVsiUFRFWC5GdWxsYmFubmVyIl0pLnRvRXF1YWwoIlRoaXMgaXMgcGRmZVRlWCwgIiArICJWZXJzaW9uIDMuMTQxNTkyLTEuMjFhLTIuMiAoV2ViMkMgNy41LjQpIGtwYXRoc2VhIHZlcnNpb24gMy41LjYiKTsKKyAgICAgICAgZXhwZWN0KGluZm8uUERGRm9ybWF0VmVyc2lvbikudG9FcXVhbCgiMS40Iik7CisgICAgICAgIGV4cGVjdChpbmZvLklzTGluZWFyaXplZCkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChpbmZvLklzQWNyb0Zvcm1QcmVzZW50KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KGluZm8uSXNYRkFQcmVzZW50KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KGluZm8uSXNDb2xsZWN0aW9uUHJlc2VudCkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChtZXRhZGF0YSkudG9FcXVhbChudWxsKTsKKyAgICAgICAgZXhwZWN0KGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKS50b0VxdWFsKG51bGwpOworICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgbWV0YWRhdGEsIHdpdGggbWlzc2luZyBQREYgaGVhZGVyIChidWcgMTYwNjU2NikiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJidWcxNjA2NTY2LnBkZiIpKTsKKyAgICAgIGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAocGRmRG9jKSB7CisgICAgICAgIHJldHVybiBwZGZEb2MuZ2V0TWV0YWRhdGEoKTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHsKKyAgICAgICAgaW5mbywKKyAgICAgICAgbWV0YWRhdGEsCisgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lCisgICAgICB9KSB7CisgICAgICAgIGV4cGVjdChpbmZvLlBERkZvcm1hdFZlcnNpb24pLnRvRXF1YWwobnVsbCk7CisgICAgICAgIGV4cGVjdChpbmZvLklzTGluZWFyaXplZCkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChpbmZvLklzQWNyb0Zvcm1QcmVzZW50KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KGluZm8uSXNYRkFQcmVzZW50KS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgZXhwZWN0KGluZm8uSXNDb2xsZWN0aW9uUHJlc2VudCkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChtZXRhZGF0YSkudG9FcXVhbChudWxsKTsKKyAgICAgICAgZXhwZWN0KGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKS50b0VxdWFsKG51bGwpOworICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgZGF0YSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgcHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldERhdGEoKTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBleHBlY3QoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChkYXRhLmxlbmd0aCkudG9FcXVhbChiYXNpY0FwaUZpbGVMZW5ndGgpOworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIGRvd25sb2FkIGluZm8iLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHByb21pc2UgPSBwZGZEb2N1bWVudC5nZXREb3dubG9hZEluZm8oKTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBleHBlY3QoZGF0YSkudG9FcXVhbCh7CisgICAgICAgICAgbGVuZ3RoOiBiYXNpY0FwaUZpbGVMZW5ndGgKKyAgICAgICAgfSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgZG9jdW1lbnQgc3RhdHMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHByb21pc2UgPSBwZGZEb2N1bWVudC5nZXRTdGF0cygpOworICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChzdGF0cykgeworICAgICAgICBleHBlY3Qoc3RhdHMpLnRvRXF1YWwoeworICAgICAgICAgIHN0cmVhbVR5cGVzOiB7fSwKKyAgICAgICAgICBmb250VHlwZXM6IHt9CisgICAgICAgIH0pOworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJjbGVhbnMgdXAgZG9jdW1lbnQgcmVzb3VyY2VzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IHByb21pc2UgPSBwZGZEb2N1bWVudC5jbGVhbnVwKCk7CisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBleHBlY3QodHJ1ZSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiY2hlY2tzIHRoYXQgZmluZ2VycHJpbnRzIGFyZSB1bmlxdWUiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgbG9hZGluZ1Rhc2sxID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiaXNzdWU0NDM2ci5wZGYiKSk7CisgICAgICBjb25zdCBsb2FkaW5nVGFzazIgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJpc3N1ZTQ1NzUucGRmIikpOworICAgICAgUHJvbWlzZS5hbGwoW2xvYWRpbmdUYXNrMS5wcm9taXNlLCBsb2FkaW5nVGFzazIucHJvbWlzZV0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgY29uc3QgZmluZ2VycHJpbnQxID0gZGF0YVswXS5maW5nZXJwcmludDsKKyAgICAgICAgY29uc3QgZmluZ2VycHJpbnQyID0gZGF0YVsxXS5maW5nZXJwcmludDsKKyAgICAgICAgZXhwZWN0KGZpbmdlcnByaW50MSkubm90LnRvRXF1YWwoZmluZ2VycHJpbnQyKTsKKyAgICAgICAgZXhwZWN0KGZpbmdlcnByaW50MSkudG9FcXVhbCgiMmY2OTVhODNkNmU3NTUzYzI0ZmMwOGI3YWM2OTcxMmQiKTsKKyAgICAgICAgZXhwZWN0KGZpbmdlcnByaW50MikudG9FcXVhbCgiMDRjNzEyNmIzNGE0NmI2ZDRkNmU3YTFlZmY3ZWRjYjYiKTsKKyAgICAgICAgUHJvbWlzZS5hbGwoW2xvYWRpbmdUYXNrMS5kZXN0cm95KCksIGxvYWRpbmdUYXNrMi5kZXN0cm95KCldKS50aGVuKGRvbmUpOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBkZXNjcmliZSgiQ3Jvc3Mtb3JpZ2luIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGxvYWRpbmdUYXNrOworCisgICAgICBmdW5jdGlvbiBfY2hlY2tDYW5Mb2FkKGV4cGVjdFN1Y2Nlc3MsIGZpbGVuYW1lLCBvcHRpb25zKSB7CisgICAgICAgIGlmIChfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICAgIHBlbmRpbmcoIkNhbm5vdCBzaW11bGF0ZSBjcm9zcy1vcmlnaW4gcmVxdWVzdHMgaW4gTm9kZS5qcyIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHBhcmFtcyA9ICgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKShmaWxlbmFtZSwgb3B0aW9ucyk7CisgICAgICAgIHZhciB1cmwgPSBuZXcgVVJMKHBhcmFtcy51cmwpOworCisgICAgICAgIGlmICh1cmwuaG9zdG5hbWUgPT09ICJsb2NhbGhvc3QiKSB7CisgICAgICAgICAgdXJsLmhvc3RuYW1lID0gIjEyNy4wLjAuMSI7CisgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnVybC5ob3N0bmFtZSA9PT0gIjEyNy4wLjAuMSIpIHsKKyAgICAgICAgICB1cmwuaG9zdG5hbWUgPSAibG9jYWxob3N0IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwZW5kaW5nKCJDYW4gb25seSBydW4gY3Jvc3Mtb3JpZ2luIHRlc3Qgb24gbG9jYWxob3N0ISIpOworICAgICAgICB9CisKKyAgICAgICAgcGFyYW1zLnVybCA9IHVybC5ocmVmOworICAgICAgICBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KShwYXJhbXMpOworICAgICAgICByZXR1cm4gbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwZGYpIHsKKyAgICAgICAgICByZXR1cm4gcGRmLmRlc3Ryb3koKTsKKyAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgZXhwZWN0KGV4cGVjdFN1Y2Nlc3MpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgeworICAgICAgICAgIGlmIChleHBlY3RTdWNjZXNzKSB7CisgICAgICAgICAgICBleHBlY3QoZXJyb3IpLnRvRXF1YWwoIlRoZXJlIHNob3VsZCBub3QgYmUgYW55IGVycm9yIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgZXhwZWN0KGV4cGVjdFN1Y2Nlc3MpLnRvRXF1YWwoZmFsc2UpOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gdGVzdENhbkxvYWQoZmlsZW5hbWUsIG9wdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIF9jaGVja0NhbkxvYWQodHJ1ZSwgZmlsZW5hbWUsIG9wdGlvbnMpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiB0ZXN0Q2Fubm90TG9hZChmaWxlbmFtZSwgb3B0aW9ucykgeworICAgICAgICByZXR1cm4gX2NoZWNrQ2FuTG9hZChmYWxzZSwgZmlsZW5hbWUsIG9wdGlvbnMpOworICAgICAgfQorCisgICAgICBhZnRlckVhY2goZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgaWYgKGxvYWRpbmdUYXNrICYmICFsb2FkaW5nVGFzay5kZXN0cm95ZWQpIHsKKyAgICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgaXQoInNlcnZlciBkaXNhbGxvd3MgY29ycyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICAgIHRlc3RDYW5ub3RMb2FkKCJiYXNpY2FwaS5wZGYiKS50aGVuKGRvbmUpOworICAgICAgfSk7CisgICAgICBpdCgic2VydmVyIGFsbG93cyBjb3JzIHdpdGhvdXQgY3JlZGVudGlhbHMsIGRlZmF1bHQgd2l0aENyZWRlbnRpYWxzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgdGVzdENhbkxvYWQoImJhc2ljYXBpLnBkZj9jb3JzPXdpdGhvdXRDcmVkZW50aWFscyIpLnRoZW4oZG9uZSk7CisgICAgICB9KTsKKyAgICAgIGl0KCJzZXJ2ZXIgYWxsb3dzIGNvcnMgd2l0aG91dCBjcmVkZW50aWFscywgYW5kIHdpdGhDcmVkZW50aWFscz1mYWxzZSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICAgIHRlc3RDYW5Mb2FkKCJiYXNpY2FwaS5wZGY/Y29ycz13aXRob3V0Q3JlZGVudGlhbHMiLCB7CisgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZQorICAgICAgICB9KS50aGVuKGRvbmUpOworICAgICAgfSk7CisgICAgICBpdCgic2VydmVyIGFsbG93cyBjb3JzIHdpdGhvdXQgY3JlZGVudGlhbHMsIGJ1dCB3aXRoQ3JlZGVudGlhbHM9dHJ1ZSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICAgIHRlc3RDYW5ub3RMb2FkKCJiYXNpY2FwaS5wZGY/Y29ycz13aXRob3V0Q3JlZGVudGlhbHMiLCB7CisgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlCisgICAgICAgIH0pLnRoZW4oZG9uZSk7CisgICAgICB9KTsKKyAgICAgIGl0KCJzZXJ2ZXIgYWxsb3dzIGNvcnMgd2l0aCBjcmVkZW50aWFscywgYW5kIHdpdGhDcmVkZW50aWFscz10cnVlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgdGVzdENhbkxvYWQoImJhc2ljYXBpLnBkZj9jb3JzPXdpdGhDcmVkZW50aWFscyIsIHsKKyAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUKKyAgICAgICAgfSkudGhlbihkb25lKTsKKyAgICAgIH0pOworICAgICAgaXQoInNlcnZlciBhbGxvd3MgY29ycyB3aXRoIGNyZWRlbnRpYWxzLCBhbmQgd2l0aENyZWRlbnRpYWxzPWZhbHNlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgdGVzdENhbkxvYWQoImJhc2ljYXBpLnBkZj9jb3JzPXdpdGhDcmVkZW50aWFscyIsIHsKKyAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlCisgICAgICAgIH0pLnRoZW4oZG9uZSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJQYWdlIiwgZnVuY3Rpb24gKCkgeworICAgIGxldCBwZGZMb2FkaW5nVGFzaywgcGRmRG9jdW1lbnQsIHBhZ2U7CisgICAgYmVmb3JlQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBwZGZMb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KShiYXNpY0FwaUdldERvY3VtZW50UGFyYW1zKTsKKyAgICAgIHBkZkxvYWRpbmdUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAoZG9jKSB7CisgICAgICAgIHBkZkRvY3VtZW50ID0gZG9jOworICAgICAgICBwZGZEb2N1bWVudC5nZXRQYWdlKDEpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICBwYWdlID0gZGF0YTsKKyAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBhZnRlckFsbChmdW5jdGlvbiAoZG9uZSkgeworICAgICAgcGRmTG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgfSk7CisgICAgaXQoImdldHMgcGFnZSBudW1iZXIiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QocGFnZS5wYWdlTnVtYmVyKS50b0VxdWFsKDEpOworICAgIH0pOworICAgIGl0KCJnZXRzIHJvdGF0ZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChwYWdlLnJvdGF0ZSkudG9FcXVhbCgwKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyByZWYiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QocGFnZS5yZWYpLnRvRXF1YWwoeworICAgICAgICBudW06IDE1LAorICAgICAgICBnZW46IDAKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJnZXRzIHVzZXJVbml0IiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KHBhZ2UudXNlclVuaXQpLnRvRXF1YWwoMS4wKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyB2aWV3IiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KHBhZ2UudmlldykudG9FcXVhbChbMCwgMCwgNTk1LjI4LCA4NDEuODldKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyB2aWV3LCB3aXRoIGVtcHR5L2ludmFsaWQgYm91bmRpbmcgYm94ZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3Qgdmlld0xvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiYm91bmRpbmdCb3hfaW52YWxpZC5wZGYiKSk7CisgICAgICB2aWV3TG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKHBkZkRvYyA9PiB7CisgICAgICAgIGNvbnN0IG51bVBhZ2VzID0gcGRmRG9jLm51bVBhZ2VzOworICAgICAgICBleHBlY3QobnVtUGFnZXMpLnRvRXF1YWwoMyk7CisgICAgICAgIGNvbnN0IHZpZXdQcm9taXNlcyA9IFtdOworCisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFnZXM7IGkrKykgeworICAgICAgICAgIHZpZXdQcm9taXNlc1tpXSA9IHBkZkRvYy5nZXRQYWdlKGkgKyAxKS50aGVuKHBkZlBhZ2UgPT4geworICAgICAgICAgICAgcmV0dXJuIHBkZlBhZ2UudmlldzsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIFByb21pc2UuYWxsKHZpZXdQcm9taXNlcykudGhlbigoW3BhZ2UxLCBwYWdlMiwgcGFnZTNdKSA9PiB7CisgICAgICAgICAgZXhwZWN0KHBhZ2UxKS50b0VxdWFsKFswLCAwLCA2MTIsIDc5Ml0pOworICAgICAgICAgIGV4cGVjdChwYWdlMikudG9FcXVhbChbMCwgMCwgODAwLCA2MDBdKTsKKyAgICAgICAgICBleHBlY3QocGFnZTMpLnRvRXF1YWwoWzAsIDAsIDYwMCwgODAwXSk7CisgICAgICAgICAgdmlld0xvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgICB9KTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgdmlld3BvcnQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgICAgc2NhbGU6IDEuNSwKKyAgICAgICAgcm90YXRpb246IDkwCisgICAgICB9KTsKKyAgICAgIGV4cGVjdCh2aWV3cG9ydC52aWV3Qm94KS50b0VxdWFsKHBhZ2Uudmlldyk7CisgICAgICBleHBlY3Qodmlld3BvcnQuc2NhbGUpLnRvRXF1YWwoMS41KTsKKyAgICAgIGV4cGVjdCh2aWV3cG9ydC5yb3RhdGlvbikudG9FcXVhbCg5MCk7CisgICAgICBleHBlY3Qodmlld3BvcnQudHJhbnNmb3JtKS50b0VxdWFsKFswLCAxLjUsIDEuNSwgMCwgMCwgMF0pOworICAgICAgZXhwZWN0KHZpZXdwb3J0LndpZHRoKS50b0VxdWFsKDEyNjIuODM1KTsKKyAgICAgIGV4cGVjdCh2aWV3cG9ydC5oZWlnaHQpLnRvRXF1YWwoODkyLjkyKTsKKyAgICB9KTsKKyAgICBpdCgnZ2V0cyB2aWV3cG9ydCB3aXRoICJvZmZzZXRYL29mZnNldFkiIGFyZ3VtZW50cycsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgIHNjYWxlOiAxLAorICAgICAgICByb3RhdGlvbjogMCwKKyAgICAgICAgb2Zmc2V0WDogMTAwLAorICAgICAgICBvZmZzZXRZOiAtMTAwCisgICAgICB9KTsKKyAgICAgIGV4cGVjdCh2aWV3cG9ydC50cmFuc2Zvcm0pLnRvRXF1YWwoWzEsIDAsIDAsIC0xLCAxMDAsIDc0MS44OV0pOworICAgIH0pOworICAgIGl0KCdnZXRzIHZpZXdwb3J0IHJlc3BlY3RpbmcgImRvbnRGbGlwIiBhcmd1bWVudCcsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHNjYWxlID0gMSwKKyAgICAgICAgICAgIHJvdGF0aW9uID0gMDsKKyAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgIHNjYWxlLAorICAgICAgICByb3RhdGlvbgorICAgICAgfSk7CisgICAgICBjb25zdCBkb250RmxpcFZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgIHNjYWxlLAorICAgICAgICByb3RhdGlvbiwKKyAgICAgICAgZG9udEZsaXA6IHRydWUKKyAgICAgIH0pOworICAgICAgZXhwZWN0KGRvbnRGbGlwVmlld3BvcnQpLm5vdC50b0VxdWFsKHZpZXdwb3J0KTsKKyAgICAgIGV4cGVjdChkb250RmxpcFZpZXdwb3J0KS50b0VxdWFsKHZpZXdwb3J0LmNsb25lKHsKKyAgICAgICAgZG9udEZsaXA6IHRydWUKKyAgICAgIH0pKTsKKyAgICAgIGV4cGVjdCh2aWV3cG9ydC50cmFuc2Zvcm0pLnRvRXF1YWwoWzEsIDAsIDAsIC0xLCAwLCA4NDEuODldKTsKKyAgICAgIGV4cGVjdChkb250RmxpcFZpZXdwb3J0LnRyYW5zZm9ybSkudG9FcXVhbChbMSwgMCwgLTAsIDEsIDAsIDBdKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyB2aWV3cG9ydCB3aXRoIGludmFsaWQgcm90YXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoZnVuY3Rpb24gKCkgeworICAgICAgICBwYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgICAgICBzY2FsZTogMSwKKyAgICAgICAgICByb3RhdGlvbjogNDUKKyAgICAgICAgfSk7CisgICAgICB9KS50b1Rocm93KG5ldyBFcnJvcigiUGFnZVZpZXdwb3J0OiBJbnZhbGlkIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy4iKSk7CisgICAgfSk7CisgICAgaXQoImdldHMgYW5ub3RhdGlvbnMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGRlZmF1bHRQcm9taXNlID0gcGFnZS5nZXRBbm5vdGF0aW9ucygpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KGRhdGEubGVuZ3RoKS50b0VxdWFsKDQpOworICAgICAgfSk7CisgICAgICB2YXIgZGlzcGxheVByb21pc2UgPSBwYWdlLmdldEFubm90YXRpb25zKHsKKyAgICAgICAgaW50ZW50OiAiZGlzcGxheSIKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KGRhdGEubGVuZ3RoKS50b0VxdWFsKDQpOworICAgICAgfSk7CisgICAgICB2YXIgcHJpbnRQcm9taXNlID0gcGFnZS5nZXRBbm5vdGF0aW9ucyh7CisgICAgICAgIGludGVudDogInByaW50IgorICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBleHBlY3QoZGF0YS5sZW5ndGgpLnRvRXF1YWwoNCk7CisgICAgICB9KTsKKyAgICAgIFByb21pc2UuYWxsKFtkZWZhdWx0UHJvbWlzZSwgZGlzcGxheVByb21pc2UsIHByaW50UHJvbWlzZV0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIGFubm90YXRpb25zIGNvbnRhaW5pbmcgcmVsYXRpdmUgVVJMcyAoYnVnIDc2NjA4NikiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIGZpbGVuYW1lID0gImJ1Zzc2NjA4Ni5wZGYiOworICAgICAgdmFyIGRlZmF1bHRMb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoZmlsZW5hbWUpKTsKKyAgICAgIHZhciBkZWZhdWx0UHJvbWlzZSA9IGRlZmF1bHRMb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2UoMSkudGhlbihmdW5jdGlvbiAocGRmUGFnZSkgeworICAgICAgICAgIHJldHVybiBwZGZQYWdlLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICB2YXIgZG9jQmFzZVVybExvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKShmaWxlbmFtZSwgeworICAgICAgICBkb2NCYXNlVXJsOiAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L3BkZnMvcXdlcnR5LnBkZiIKKyAgICAgIH0pKTsKKyAgICAgIHZhciBkb2NCYXNlVXJsUHJvbWlzZSA9IGRvY0Jhc2VVcmxMb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2UoMSkudGhlbihmdW5jdGlvbiAocGRmUGFnZSkgeworICAgICAgICAgIHJldHVybiBwZGZQYWdlLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICB2YXIgaW52YWxpZERvY0Jhc2VVcmxMb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoZmlsZW5hbWUsIHsKKyAgICAgICAgZG9jQmFzZVVybDogInF3ZXJ0eS5wZGYiCisgICAgICB9KSk7CisgICAgICB2YXIgaW52YWxpZERvY0Jhc2VVcmxQcm9taXNlID0gaW52YWxpZERvY0Jhc2VVcmxMb2FkaW5nVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHBkZkRvYykgeworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2UoMSkudGhlbihmdW5jdGlvbiAocGRmUGFnZSkgeworICAgICAgICAgIHJldHVybiBwZGZQYWdlLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICBQcm9taXNlLmFsbChbZGVmYXVsdFByb21pc2UsIGRvY0Jhc2VVcmxQcm9taXNlLCBpbnZhbGlkRG9jQmFzZVVybFByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIHZhciBkZWZhdWx0QW5ub3RhdGlvbnMgPSBkYXRhWzBdOworICAgICAgICB2YXIgZG9jQmFzZVVybEFubm90YXRpb25zID0gZGF0YVsxXTsKKyAgICAgICAgdmFyIGludmFsaWREb2NCYXNlVXJsQW5ub3RhdGlvbnMgPSBkYXRhWzJdOworICAgICAgICBleHBlY3QoZGVmYXVsdEFubm90YXRpb25zWzBdLnVybCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QoZGVmYXVsdEFubm90YXRpb25zWzBdLnVuc2FmZVVybCkudG9FcXVhbCgiLi4vLi4vMDAyMS8wMDIxNTYvMjE1Njc1RS5wZGYjMTUiKTsKKyAgICAgICAgZXhwZWN0KGRvY0Jhc2VVcmxBbm5vdGF0aW9uc1swXS51cmwpLnRvRXF1YWwoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vMDAyMS8wMDIxNTYvMjE1Njc1RS5wZGYjMTUiKTsKKyAgICAgICAgZXhwZWN0KGRvY0Jhc2VVcmxBbm5vdGF0aW9uc1swXS51bnNhZmVVcmwpLnRvRXF1YWwoIi4uLy4uLzAwMjEvMDAyMTU2LzIxNTY3NUUucGRmIzE1Iik7CisgICAgICAgIGV4cGVjdChpbnZhbGlkRG9jQmFzZVVybEFubm90YXRpb25zWzBdLnVybCkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QoaW52YWxpZERvY0Jhc2VVcmxBbm5vdGF0aW9uc1swXS51bnNhZmVVcmwpLnRvRXF1YWwoIi4uLy4uLzAwMjEvMDAyMTU2LzIxNTY3NUUucGRmIzE1Iik7CisgICAgICAgIFByb21pc2UuYWxsKFtkZWZhdWx0TG9hZGluZ1Rhc2suZGVzdHJveSgpLCBkb2NCYXNlVXJsTG9hZGluZ1Rhc2suZGVzdHJveSgpLCBpbnZhbGlkRG9jQmFzZVVybExvYWRpbmdUYXNrLmRlc3Ryb3koKV0pLnRoZW4oZG9uZSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIHRleHQgY29udGVudCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgZGVmYXVsdFByb21pc2UgPSBwYWdlLmdldFRleHRDb250ZW50KCk7CisgICAgICB2YXIgcGFyYW1ldGVyc1Byb21pc2UgPSBwYWdlLmdldFRleHRDb250ZW50KHsKKyAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZTogdHJ1ZSwKKyAgICAgICAgZGlzYWJsZUNvbWJpbmVUZXh0SXRlbXM6IHRydWUKKyAgICAgIH0pOworICAgICAgdmFyIHByb21pc2VzID0gW2RlZmF1bHRQcm9taXNlLCBwYXJhbWV0ZXJzUHJvbWlzZV07CisgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBleHBlY3QoISFkYXRhWzBdLml0ZW1zKS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QoZGF0YVswXS5pdGVtcy5sZW5ndGgpLnRvRXF1YWwoNyk7CisgICAgICAgIGV4cGVjdCghIWRhdGFbMF0uc3R5bGVzKS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoZGF0YVswXSkpLnRvRXF1YWwoSlNPTi5zdHJpbmdpZnkoZGF0YVsxXSkpOworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIHRleHQgY29udGVudCwgd2l0aCBjb3JyZWN0IHByb3BlcnRpZXMgKGlzc3VlIDgyNzYpIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiaXNzdWU4Mjc2X3JlZHVjZWQucGRmIikpOworICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKHBkZkRvYyA9PiB7CisgICAgICAgIHBkZkRvYy5nZXRQYWdlKDEpLnRoZW4ocGRmUGFnZSA9PiB7CisgICAgICAgICAgcGRmUGFnZS5nZXRUZXh0Q29udGVudCgpLnRoZW4oKHsKKyAgICAgICAgICAgIGl0ZW1zLAorICAgICAgICAgICAgc3R5bGVzCisgICAgICAgICAgfSkgPT4geworICAgICAgICAgICAgZXhwZWN0KGl0ZW1zLmxlbmd0aCkudG9FcXVhbCgxKTsKKyAgICAgICAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhzdHlsZXMpKS50b0VxdWFsKFsiVGltZXMiXSk7CisgICAgICAgICAgICBleHBlY3QoaXRlbXNbMF0pLnRvRXF1YWwoeworICAgICAgICAgICAgICBkaXI6ICJsdHIiLAorICAgICAgICAgICAgICBmb250TmFtZTogIlRpbWVzIiwKKyAgICAgICAgICAgICAgaGVpZ2h0OiAxOCwKKyAgICAgICAgICAgICAgc3RyOiAiSXNzdWUgODI3NiIsCisgICAgICAgICAgICAgIHRyYW5zZm9ybTogWzE4LCAwLCAwLCAxOCwgNDQxLjgxLCA3MDguNDQ5OTk5OTk5OTk5OV0sCisgICAgICAgICAgICAgIHdpZHRoOiA3Ny40OQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBleHBlY3Qoc3R5bGVzLlRpbWVzKS50b0VxdWFsKHsKKyAgICAgICAgICAgICAgZm9udEZhbWlseTogInNlcmlmIiwKKyAgICAgICAgICAgICAgYXNjZW50OiBOYU4sCisgICAgICAgICAgICAgIGRlc2NlbnQ6IE5hTiwKKyAgICAgICAgICAgICAgdmVydGljYWw6IGZhbHNlCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgb3BlcmF0b3IgbGlzdCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgcHJvbWlzZSA9IHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KCk7CisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKG9wbGlzdCkgeworICAgICAgICBleHBlY3QoISFvcGxpc3QuZm5BcnJheSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KCEhb3BsaXN0LmFyZ3NBcnJheSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KG9wbGlzdC5sYXN0Q2h1bmspLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImdldHMgb3BlcmF0b3JMaXN0IHdpdGggSlBFRyBpbWFnZSAoaXNzdWUgNDg4OCkiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJjbXlranBlZy5wZGYiKSk7CisgICAgICBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4ocGRmRG9jID0+IHsKKyAgICAgICAgcGRmRG9jLmdldFBhZ2UoMSkudGhlbihwZGZQYWdlID0+IHsKKyAgICAgICAgICBwZGZQYWdlLmdldE9wZXJhdG9yTGlzdCgpLnRoZW4ob3BMaXN0ID0+IHsKKyAgICAgICAgICAgIGNvbnN0IGltZ0luZGV4ID0gb3BMaXN0LmZuQXJyYXkuaW5kZXhPZihfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QpOworICAgICAgICAgICAgY29uc3QgaW1nQXJncyA9IG9wTGlzdC5hcmdzQXJyYXlbaW1nSW5kZXhdOworICAgICAgICAgICAgY29uc3QgeworICAgICAgICAgICAgICBkYXRhCisgICAgICAgICAgICB9ID0gcGRmUGFnZS5vYmpzLmdldChpbWdBcmdzWzBdKTsKKyAgICAgICAgICAgIGV4cGVjdChkYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgICAgICBleHBlY3QoZGF0YS5sZW5ndGgpLnRvRXF1YWwoOTAwMDApOworICAgICAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBvcGVyYXRvckxpc3QsIGZyb20gY29ycnVwdCBQREYgZmlsZSAoaXNzdWUgODcwMiksICIgKyAid2l0aC93aXRob3V0IGBzdG9wQXRFcnJvcnNgIHNldCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBsb2FkaW5nVGFzazEgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJpc3N1ZTg3MDIucGRmIiwgeworICAgICAgICBzdG9wQXRFcnJvcnM6IGZhbHNlCisgICAgICB9KSk7CisgICAgICBjb25zdCBsb2FkaW5nVGFzazIgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJpc3N1ZTg3MDIucGRmIiwgeworICAgICAgICBzdG9wQXRFcnJvcnM6IHRydWUKKyAgICAgIH0pKTsKKyAgICAgIGNvbnN0IHJlc3VsdDEgPSBsb2FkaW5nVGFzazEucHJvbWlzZS50aGVuKHBkZkRvYyA9PiB7CisgICAgICAgIHJldHVybiBwZGZEb2MuZ2V0UGFnZSgxKS50aGVuKHBkZlBhZ2UgPT4geworICAgICAgICAgIHJldHVybiBwZGZQYWdlLmdldE9wZXJhdG9yTGlzdCgpLnRoZW4ob3BMaXN0ID0+IHsKKyAgICAgICAgICAgIGV4cGVjdChvcExpc3QuZm5BcnJheS5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxMDApOworICAgICAgICAgICAgZXhwZWN0KG9wTGlzdC5hcmdzQXJyYXkubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMTAwKTsKKyAgICAgICAgICAgIGV4cGVjdChvcExpc3QubGFzdENodW5rKS50b0VxdWFsKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIGxvYWRpbmdUYXNrMS5kZXN0cm95KCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICBjb25zdCByZXN1bHQyID0gbG9hZGluZ1Rhc2syLnByb21pc2UudGhlbihwZGZEb2MgPT4geworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2UoMSkudGhlbihwZGZQYWdlID0+IHsKKyAgICAgICAgICByZXR1cm4gcGRmUGFnZS5nZXRPcGVyYXRvckxpc3QoKS50aGVuKG9wTGlzdCA9PiB7CisgICAgICAgICAgICBleHBlY3Qob3BMaXN0LmZuQXJyYXkubGVuZ3RoKS50b0VxdWFsKDApOworICAgICAgICAgICAgZXhwZWN0KG9wTGlzdC5hcmdzQXJyYXkubGVuZ3RoKS50b0VxdWFsKDApOworICAgICAgICAgICAgZXhwZWN0KG9wTGlzdC5sYXN0Q2h1bmspLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gbG9hZGluZ1Rhc2syLmRlc3Ryb3koKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIFByb21pc2UuYWxsKFtyZXN1bHQxLCByZXN1bHQyXSkudGhlbihkb25lLCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIGRvY3VtZW50IHN0YXRzIGFmdGVyIHBhcnNpbmcgcGFnZSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgcHJvbWlzZSA9IHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBwZGZEb2N1bWVudC5nZXRTdGF0cygpOworICAgICAgfSk7CisgICAgICB2YXIgZXhwZWN0ZWRTdHJlYW1UeXBlcyA9IHt9OworICAgICAgZXhwZWN0ZWRTdHJlYW1UeXBlc1tfdXRpbC5TdHJlYW1UeXBlLkZMQVRFXSA9IHRydWU7CisgICAgICB2YXIgZXhwZWN0ZWRGb250VHlwZXMgPSB7fTsKKyAgICAgIGV4cGVjdGVkRm9udFR5cGVzW191dGlsLkZvbnRUeXBlLlRZUEUxXSA9IHRydWU7CisgICAgICBleHBlY3RlZEZvbnRUeXBlc1tfdXRpbC5Gb250VHlwZS5DSURGT05UVFlQRTJdID0gdHJ1ZTsKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoc3RhdHMpIHsKKyAgICAgICAgZXhwZWN0KHN0YXRzKS50b0VxdWFsKHsKKyAgICAgICAgICBzdHJlYW1UeXBlczogZXhwZWN0ZWRTdHJlYW1UeXBlcywKKyAgICAgICAgICBmb250VHlwZXM6IGV4cGVjdGVkRm9udFR5cGVzCisgICAgICAgIH0pOworICAgICAgICBkb25lKCk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIHBhZ2Ugc3RhdHMgYWZ0ZXIgcGFyc2luZyBwYWdlLCB3aXRob3V0IGBwZGZCdWdgIHNldCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBwYWdlLmdldE9wZXJhdG9yTGlzdCgpLnRoZW4ob3BMaXN0ID0+IHsKKyAgICAgICAgcmV0dXJuIHBhZ2Uuc3RhdHM7CisgICAgICB9KS50aGVuKHN0YXRzID0+IHsKKyAgICAgICAgZXhwZWN0KHN0YXRzKS50b0VxdWFsKG51bGwpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIHBhZ2Ugc3RhdHMgYWZ0ZXIgcGFyc2luZyBwYWdlLCB3aXRoIGBwZGZCdWdgIHNldCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoYmFzaWNBcGlGaWxlTmFtZSwgeworICAgICAgICBwZGZCdWc6IHRydWUKKyAgICAgIH0pKTsKKyAgICAgIGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihwZGZEb2MgPT4geworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2UoMSkudGhlbihwZGZQYWdlID0+IHsKKyAgICAgICAgICByZXR1cm4gcGRmUGFnZS5nZXRPcGVyYXRvckxpc3QoKS50aGVuKG9wTGlzdCA9PiB7CisgICAgICAgICAgICByZXR1cm4gcGRmUGFnZS5zdGF0czsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9KS50aGVuKHN0YXRzID0+IHsKKyAgICAgICAgZXhwZWN0KHN0YXRzIGluc3RhbmNlb2YgX2Rpc3BsYXlfdXRpbHMuU3RhdFRpbWVyKS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3Qoc3RhdHMudGltZXMubGVuZ3RoKS50b0VxdWFsKDEpOworICAgICAgICBjb25zdCBbc3RhdEVudHJ5XSA9IHN0YXRzLnRpbWVzOworICAgICAgICBleHBlY3Qoc3RhdEVudHJ5Lm5hbWUpLnRvRXF1YWwoIlBhZ2UgUmVxdWVzdCIpOworICAgICAgICBleHBlY3Qoc3RhdEVudHJ5LmVuZCAtIHN0YXRFbnRyeS5zdGFydCkudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCgwKTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJnZXRzIHBhZ2Ugc3RhdHMgYWZ0ZXIgcmVuZGVyaW5nIHBhZ2UsIHdpdGggYHBkZkJ1Z2Agc2V0IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKShiYXNpY0FwaUZpbGVOYW1lLCB7CisgICAgICAgIHBkZkJ1ZzogdHJ1ZQorICAgICAgfSkpOworICAgICAgbGV0IGNhbnZhc0FuZEN0eDsKKyAgICAgIGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihwZGZEb2MgPT4geworICAgICAgICByZXR1cm4gcGRmRG9jLmdldFBhZ2UoMSkudGhlbihwZGZQYWdlID0+IHsKKyAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHBkZlBhZ2UuZ2V0Vmlld3BvcnQoeworICAgICAgICAgICAgc2NhbGU6IDEKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBjYW52YXNBbmRDdHggPSBDYW52YXNGYWN0b3J5LmNyZWF0ZSh2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTsKKyAgICAgICAgICBjb25zdCByZW5kZXJUYXNrID0gcGRmUGFnZS5yZW5kZXIoeworICAgICAgICAgICAgY2FudmFzQ29udGV4dDogY2FudmFzQW5kQ3R4LmNvbnRleHQsCisgICAgICAgICAgICBjYW52YXNGYWN0b3J5OiBDYW52YXNGYWN0b3J5LAorICAgICAgICAgICAgdmlld3BvcnQKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm4gcmVuZGVyVGFzay5wcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgICAgICAgcmV0dXJuIHBkZlBhZ2Uuc3RhdHM7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfSkudGhlbihzdGF0cyA9PiB7CisgICAgICAgIGV4cGVjdChzdGF0cyBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KHN0YXRzLnRpbWVzLmxlbmd0aCkudG9FcXVhbCgzKTsKKyAgICAgICAgY29uc3QgW3N0YXRFbnRyeU9uZSwgc3RhdEVudHJ5VHdvLCBzdGF0RW50cnlUaHJlZV0gPSBzdGF0cy50aW1lczsKKyAgICAgICAgZXhwZWN0KHN0YXRFbnRyeU9uZS5uYW1lKS50b0VxdWFsKCJQYWdlIFJlcXVlc3QiKTsKKyAgICAgICAgZXhwZWN0KHN0YXRFbnRyeU9uZS5lbmQgLSBzdGF0RW50cnlPbmUuc3RhcnQpLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwoMCk7CisgICAgICAgIGV4cGVjdChzdGF0RW50cnlUd28ubmFtZSkudG9FcXVhbCgiUmVuZGVyaW5nIik7CisgICAgICAgIGV4cGVjdChzdGF0RW50cnlUd28uZW5kIC0gc3RhdEVudHJ5VHdvLnN0YXJ0KS50b0JlR3JlYXRlclRoYW4oMCk7CisgICAgICAgIGV4cGVjdChzdGF0RW50cnlUaHJlZS5uYW1lKS50b0VxdWFsKCJPdmVyYWxsIik7CisgICAgICAgIGV4cGVjdChzdGF0RW50cnlUaHJlZS5lbmQgLSBzdGF0RW50cnlUaHJlZS5zdGFydCkudG9CZUdyZWF0ZXJUaGFuKDApOworICAgICAgICBDYW52YXNGYWN0b3J5LmRlc3Ryb3koY2FudmFzQW5kQ3R4KTsKKyAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJjYW5jZWxzIHJlbmRlcmluZyBvZiBwYWdlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciB2aWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQoeworICAgICAgICBzY2FsZTogMQorICAgICAgfSk7CisgICAgICB2YXIgY2FudmFzQW5kQ3R4ID0gQ2FudmFzRmFjdG9yeS5jcmVhdGUodmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7CisgICAgICB2YXIgcmVuZGVyVGFzayA9IHBhZ2UucmVuZGVyKHsKKyAgICAgICAgY2FudmFzQ29udGV4dDogY2FudmFzQW5kQ3R4LmNvbnRleHQsCisgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IENhbnZhc0ZhY3RvcnksCisgICAgICAgIHZpZXdwb3J0CisgICAgICB9KTsKKyAgICAgIHJlbmRlclRhc2suY2FuY2VsKCk7CisgICAgICByZW5kZXJUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGRvbmUuZmFpbCgic2hhbGwgY2FuY2VsIHJlbmRlcmluZyIpOworICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICAgIGV4cGVjdChlcnJvciBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGVycm9yLm1lc3NhZ2UpLnRvRXF1YWwoIlJlbmRlcmluZyBjYW5jZWxsZWQsIHBhZ2UgMSIpOworICAgICAgICBleHBlY3QoZXJyb3IudHlwZSkudG9FcXVhbCgiY2FudmFzIik7CisgICAgICAgIENhbnZhc0ZhY3RvcnkuZGVzdHJveShjYW52YXNBbmRDdHgpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgicmUtcmVuZGVyIHBhZ2UsIHVzaW5nIHRoZSBzYW1lIGNhbnZhcywgYWZ0ZXIgY2FuY2VsbGluZyByZW5kZXJpbmciLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3Qgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgICAgc2NhbGU6IDEKKyAgICAgIH0pOworICAgICAgY29uc3QgY2FudmFzQW5kQ3R4ID0gQ2FudmFzRmFjdG9yeS5jcmVhdGUodmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7CisgICAgICBjb25zdCByZW5kZXJUYXNrID0gcGFnZS5yZW5kZXIoeworICAgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXNBbmRDdHguY29udGV4dCwKKyAgICAgICAgY2FudmFzRmFjdG9yeTogQ2FudmFzRmFjdG9yeSwKKyAgICAgICAgdmlld3BvcnQKKyAgICAgIH0pOworICAgICAgcmVuZGVyVGFzay5jYW5jZWwoKTsKKyAgICAgIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJzaGFsbCBjYW5jZWwgcmVuZGVyaW5nIik7CisgICAgICB9LCByZWFzb24gPT4geworICAgICAgICBleHBlY3QocmVhc29uIGluc3RhbmNlb2YgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKS50b0VxdWFsKHRydWUpOworICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgIGNvbnN0IHJlUmVuZGVyVGFzayA9IHBhZ2UucmVuZGVyKHsKKyAgICAgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXNBbmRDdHguY29udGV4dCwKKyAgICAgICAgICBjYW52YXNGYWN0b3J5OiBDYW52YXNGYWN0b3J5LAorICAgICAgICAgIHZpZXdwb3J0CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcmVSZW5kZXJUYXNrLnByb21pc2U7CisgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgQ2FudmFzRmFjdG9yeS5kZXN0cm95KGNhbnZhc0FuZEN0eCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoIm11bHRpcGxlIHJlbmRlcigpIG9uIHRoZSBzYW1lIGNhbnZhcyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7CisgICAgICB2YXIgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgICAgc2NhbGU6IDEKKyAgICAgIH0pOworICAgICAgdmFyIGNhbnZhc0FuZEN0eCA9IENhbnZhc0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOworICAgICAgdmFyIHJlbmRlclRhc2sxID0gcGFnZS5yZW5kZXIoeworICAgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXNBbmRDdHguY29udGV4dCwKKyAgICAgICAgY2FudmFzRmFjdG9yeTogQ2FudmFzRmFjdG9yeSwKKyAgICAgICAgdmlld3BvcnQsCisgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UKKyAgICAgIH0pOworICAgICAgdmFyIHJlbmRlclRhc2syID0gcGFnZS5yZW5kZXIoeworICAgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXNBbmRDdHguY29udGV4dCwKKyAgICAgICAgY2FudmFzRmFjdG9yeTogQ2FudmFzRmFjdG9yeSwKKyAgICAgICAgdmlld3BvcnQsCisgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UKKyAgICAgIH0pOworICAgICAgUHJvbWlzZS5hbGwoW3JlbmRlclRhc2sxLnByb21pc2UsIHJlbmRlclRhc2syLnByb21pc2UudGhlbigoKSA9PiB7CisgICAgICAgIGRvbmUuZmFpbCgic2hhbGwgZmFpbCByZW5kZXJpbmciKTsKKyAgICAgIH0sIHJlYXNvbiA9PiB7CisgICAgICAgIGV4cGVjdCgvbXVsdGlwbGUgcmVuZGVyXChcKS8udGVzdChyZWFzb24ubWVzc2FnZSkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICB9KV0pLnRoZW4oZG9uZSk7CisgICAgfSk7CisgICAgaXQoImNsZWFucyB1cCBkb2N1bWVudCByZXNvdXJjZXMgYWZ0ZXIgcmVuZGVyaW5nIG9mIHBhZ2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKGJhc2ljQXBpRmlsZU5hbWUpKTsKKyAgICAgIGxldCBjYW52YXNBbmRDdHg7CisgICAgICBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4ocGRmRG9jID0+IHsKKyAgICAgICAgcmV0dXJuIHBkZkRvYy5nZXRQYWdlKDEpLnRoZW4ocGRmUGFnZSA9PiB7CisgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBwZGZQYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgICAgICAgIHNjYWxlOiAxCisgICAgICAgICAgfSk7CisgICAgICAgICAgY2FudmFzQW5kQ3R4ID0gQ2FudmFzRmFjdG9yeS5jcmVhdGUodmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7CisgICAgICAgICAgY29uc3QgcmVuZGVyVGFzayA9IHBkZlBhZ2UucmVuZGVyKHsKKyAgICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGNhbnZhc0FuZEN0eC5jb250ZXh0LAorICAgICAgICAgICAgY2FudmFzRmFjdG9yeTogQ2FudmFzRmFjdG9yeSwKKyAgICAgICAgICAgIHZpZXdwb3J0CisgICAgICAgICAgfSk7CisgICAgICAgICAgcmV0dXJuIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgIHJldHVybiBwZGZEb2MuY2xlYW51cCgpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0pLnRoZW4oKCkgPT4geworICAgICAgICBleHBlY3QodHJ1ZSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgQ2FudmFzRmFjdG9yeS5kZXN0cm95KGNhbnZhc0FuZEN0eCk7CisgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgiY2xlYW5zIHVwIGRvY3VtZW50IHJlc291cmNlcyBkdXJpbmcgcmVuZGVyaW5nIG9mIHBhZ2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJ0cmFjZW1vbmtleS5wZGYiKSk7CisgICAgICBsZXQgY2FudmFzQW5kQ3R4OworICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKHBkZkRvYyA9PiB7CisgICAgICAgIHJldHVybiBwZGZEb2MuZ2V0UGFnZSgxKS50aGVuKHBkZlBhZ2UgPT4geworICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGRmUGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgICAgICBzY2FsZTogMQorICAgICAgICAgIH0pOworICAgICAgICAgIGNhbnZhc0FuZEN0eCA9IENhbnZhc0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOworICAgICAgICAgIGNvbnN0IHJlbmRlclRhc2sgPSBwZGZQYWdlLnJlbmRlcih7CisgICAgICAgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXNBbmRDdHguY29udGV4dCwKKyAgICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IENhbnZhc0ZhY3RvcnksCisgICAgICAgICAgICB2aWV3cG9ydAorICAgICAgICAgIH0pOworCisgICAgICAgICAgcmVuZGVyVGFzay5vbkNvbnRpbnVlID0gZnVuY3Rpb24gKGNvbnQpIHsKKyAgICAgICAgICAgIHdhaXRTb21lKGNvbnQpOworICAgICAgICAgIH07CisKKyAgICAgICAgICByZXR1cm4gcGRmRG9jLmNsZWFudXAoKS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigic2hhbGwgZmFpbCBjbGVhbnVwIik7CisgICAgICAgICAgfSwgcmVhc29uID0+IHsKKyAgICAgICAgICAgIGV4cGVjdChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgICAgIGV4cGVjdChyZWFzb24ubWVzc2FnZSkudG9FcXVhbCgic3RhcnRDbGVhbnVwOiBQYWdlIDEgaXMgY3VycmVudGx5IHJlbmRlcmluZy4iKTsKKyAgICAgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgIHJldHVybiByZW5kZXJUYXNrLnByb21pc2U7CisgICAgICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgICAgICBDYW52YXNGYWN0b3J5LmRlc3Ryb3koY2FudmFzQW5kQ3R4KTsKKyAgICAgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKS50aGVuKGRvbmUpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoImNhY2hlcyBpbWFnZSByZXNvdXJjZXMgYXQgdGhlIGRvY3VtZW50L3BhZ2UgbGV2ZWwgYXMgZXhwZWN0ZWQgKGlzc3VlIDExODc4KSIsIGFzeW5jIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCB7CisgICAgICAgIE5VTV9QQUdFU19USFJFU0hPTEQKKyAgICAgIH0gPSBfaW1hZ2VfdXRpbHMuR2xvYmFsSW1hZ2VDYWNoZSwKKyAgICAgICAgICAgIEVYUEVDVEVEX1dJRFRIID0gMjU1MCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0hFSUdIVCA9IDMzMDA7CisgICAgICBjb25zdCBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSgoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoImlzc3VlMTE4NzgucGRmIikpOworICAgICAgbGV0IGZpcnN0SW1nRGF0YSA9IG51bGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbnN0IHBkZkRvYyA9IGF3YWl0IGxvYWRpbmdUYXNrLnByb21pc2U7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gcGRmRG9jLm51bVBhZ2VzOyBpKyspIHsKKyAgICAgICAgICBjb25zdCBwZGZQYWdlID0gYXdhaXQgcGRmRG9jLmdldFBhZ2UoaSk7CisgICAgICAgICAgY29uc3Qgb3BMaXN0ID0gYXdhaXQgcGRmUGFnZS5nZXRPcGVyYXRvckxpc3QoKTsKKyAgICAgICAgICBjb25zdCB7CisgICAgICAgICAgICBjb21tb25PYmpzLAorICAgICAgICAgICAgb2JqcworICAgICAgICAgIH0gPSBwZGZQYWdlOworICAgICAgICAgIGNvbnN0IGltZ0luZGV4ID0gb3BMaXN0LmZuQXJyYXkuaW5kZXhPZihfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QpOworICAgICAgICAgIGNvbnN0IFtvYmpJZCwgd2lkdGgsIGhlaWdodF0gPSBvcExpc3QuYXJnc0FycmF5W2ltZ0luZGV4XTsKKworICAgICAgICAgIGlmIChpIDwgTlVNX1BBR0VTX1RIUkVTSE9MRCkgeworICAgICAgICAgICAgZXhwZWN0KG9iaklkKS50b0VxdWFsKGBpbWdfcCR7aSAtIDF9XzFgKTsKKyAgICAgICAgICAgIGV4cGVjdChvYmpzLmhhcyhvYmpJZCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgICAgICBleHBlY3QoY29tbW9uT2Jqcy5oYXMob2JqSWQpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhwZWN0KG9iaklkKS50b0VxdWFsKGBnXyR7bG9hZGluZ1Rhc2suZG9jSWR9X2ltZ19wJHtOVU1fUEFHRVNfVEhSRVNIT0xEIC0gMX1fMWApOworICAgICAgICAgICAgZXhwZWN0KG9ianMuaGFzKG9iaklkKSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgICAgICBleHBlY3QoY29tbW9uT2Jqcy5oYXMob2JqSWQpKS50b0VxdWFsKHRydWUpOworICAgICAgICAgIH0KKworICAgICAgICAgIGV4cGVjdCh3aWR0aCkudG9FcXVhbChFWFBFQ1RFRF9XSURUSCk7CisgICAgICAgICAgZXhwZWN0KGhlaWdodCkudG9FcXVhbChFWFBFQ1RFRF9IRUlHSFQpOworCisgICAgICAgICAgaWYgKGkgPT09IDEpIHsKKyAgICAgICAgICAgIGZpcnN0SW1nRGF0YSA9IG9ianMuZ2V0KG9iaklkKTsKKyAgICAgICAgICAgIGV4cGVjdChmaXJzdEltZ0RhdGEud2lkdGgpLnRvRXF1YWwoRVhQRUNURURfV0lEVEgpOworICAgICAgICAgICAgZXhwZWN0KGZpcnN0SW1nRGF0YS5oZWlnaHQpLnRvRXF1YWwoRVhQRUNURURfSEVJR0hUKTsKKyAgICAgICAgICAgIGV4cGVjdChmaXJzdEltZ0RhdGEua2luZCkudG9FcXVhbChfdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQKTsKKyAgICAgICAgICAgIGV4cGVjdChmaXJzdEltZ0RhdGEuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KS50b0VxdWFsKHRydWUpOworICAgICAgICAgICAgZXhwZWN0KGZpcnN0SW1nRGF0YS5kYXRhLmxlbmd0aCkudG9FcXVhbCgyNTI0NTAwMCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IG9ianNQb29sID0gaSA+PSBOVU1fUEFHRVNfVEhSRVNIT0xEID8gY29tbW9uT2JqcyA6IG9ianM7CisgICAgICAgICAgICBjb25zdCBjdXJyZW50SW1nRGF0YSA9IG9ianNQb29sLmdldChvYmpJZCk7CisgICAgICAgICAgICBleHBlY3QoY3VycmVudEltZ0RhdGEud2lkdGgpLnRvRXF1YWwoZmlyc3RJbWdEYXRhLndpZHRoKTsKKyAgICAgICAgICAgIGV4cGVjdChjdXJyZW50SW1nRGF0YS5oZWlnaHQpLnRvRXF1YWwoZmlyc3RJbWdEYXRhLmhlaWdodCk7CisgICAgICAgICAgICBleHBlY3QoY3VycmVudEltZ0RhdGEua2luZCkudG9FcXVhbChmaXJzdEltZ0RhdGEua2luZCk7CisgICAgICAgICAgICBleHBlY3QoY3VycmVudEltZ0RhdGEuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KS50b0VxdWFsKHRydWUpOworICAgICAgICAgICAgZXhwZWN0KGN1cnJlbnRJbWdEYXRhLmRhdGEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4geworICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZpcnN0SW1nRGF0YS5kYXRhW2luZGV4XTsKKyAgICAgICAgICAgIH0pKS50b0VxdWFsKHRydWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF3YWl0IGxvYWRpbmdUYXNrLmRlc3Ryb3koKTsKKyAgICAgICAgZmlyc3RJbWdEYXRhID0gbnVsbDsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgZG9uZS5mYWlsKGV4KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJNdWx0aXBsZSBgZ2V0RG9jdW1lbnRgIGluc3RhbmNlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgcGRmMSA9ICgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgidHJhY2Vtb25rZXkucGRmIik7CisgICAgdmFyIHBkZjIgPSAoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoIlRBTVJldmlldy5wZGYiKTsKKyAgICB2YXIgcGRmMyA9ICgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiaXNzdWU2MDY4LnBkZiIpOworICAgIHZhciBsb2FkaW5nVGFza3MgPSBbXTsKKworICAgIGFzeW5jIGZ1bmN0aW9uIHJlbmRlclBERihmaWxlbmFtZSkgeworICAgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoZmlsZW5hbWUpOworICAgICAgbG9hZGluZ1Rhc2tzLnB1c2gobG9hZGluZ1Rhc2spOworICAgICAgY29uc3QgcGRmID0gYXdhaXQgbG9hZGluZ1Rhc2sucHJvbWlzZTsKKyAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBwZGYuZ2V0UGFnZSgxKTsKKyAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgIHNjYWxlOiAxLjIKKyAgICAgIH0pOworICAgICAgY29uc3QgY2FudmFzQW5kQ3R4ID0gQ2FudmFzRmFjdG9yeS5jcmVhdGUodmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7CisgICAgICBjb25zdCByZW5kZXJUYXNrID0gcGFnZS5yZW5kZXIoeworICAgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXNBbmRDdHguY29udGV4dCwKKyAgICAgICAgY2FudmFzRmFjdG9yeTogQ2FudmFzRmFjdG9yeSwKKyAgICAgICAgdmlld3BvcnQKKyAgICAgIH0pOworICAgICAgYXdhaXQgcmVuZGVyVGFzay5wcm9taXNlOworICAgICAgY29uc3QgZGF0YSA9IGNhbnZhc0FuZEN0eC5jYW52YXMudG9EYXRhVVJMKCk7CisgICAgICBDYW52YXNGYWN0b3J5LmRlc3Ryb3koY2FudmFzQW5kQ3R4KTsKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgZGVzdHJveVByb21pc2VzID0gbG9hZGluZ1Rhc2tzLm1hcChmdW5jdGlvbiAobG9hZGluZ1Rhc2spIHsKKyAgICAgICAgcmV0dXJuIGxvYWRpbmdUYXNrLmRlc3Ryb3koKTsKKyAgICAgIH0pOworICAgICAgUHJvbWlzZS5hbGwoZGVzdHJveVByb21pc2VzKS50aGVuKGRvbmUpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IHJlbmRlciBQREZzIGluIHBhcmFsbGVsIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBiYXNlbGluZTEsIGJhc2VsaW5lMiwgYmFzZWxpbmUzOworICAgICAgdmFyIHByb21pc2VEb25lID0gcmVuZGVyUERGKHBkZjEpLnRoZW4oZnVuY3Rpb24gKGRhdGExKSB7CisgICAgICAgIGJhc2VsaW5lMSA9IGRhdGExOworICAgICAgICByZXR1cm4gcmVuZGVyUERGKHBkZjIpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YTIpIHsKKyAgICAgICAgYmFzZWxpbmUyID0gZGF0YTI7CisgICAgICAgIHJldHVybiByZW5kZXJQREYocGRmMyk7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhMykgeworICAgICAgICBiYXNlbGluZTMgPSBkYXRhMzsKKyAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtyZW5kZXJQREYocGRmMSksIHJlbmRlclBERihwZGYyKSwgcmVuZGVyUERGKHBkZjMpXSk7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhVXJscykgeworICAgICAgICBleHBlY3QoZGF0YVVybHNbMF0pLnRvRXF1YWwoYmFzZWxpbmUxKTsKKyAgICAgICAgZXhwZWN0KGRhdGFVcmxzWzFdKS50b0VxdWFsKGJhc2VsaW5lMik7CisgICAgICAgIGV4cGVjdChkYXRhVXJsc1syXSkudG9FcXVhbChiYXNlbGluZTMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0pOworICAgICAgcHJvbWlzZURvbmUudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiUERGRGF0YVJhbmdlVHJhbnNwb3J0IiwgZnVuY3Rpb24gKCkgeworICAgIGxldCBkYXRhUHJvbWlzZTsKKyAgICBiZWZvcmVBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGZpbGVOYW1lID0gInRyYWNlbW9ua2V5LnBkZiI7CisKKyAgICAgIGlmIChfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICBkYXRhUHJvbWlzZSA9IF90ZXN0X3V0aWxzLk5vZGVGaWxlUmVhZGVyRmFjdG9yeS5mZXRjaCh7CisgICAgICAgICAgcGF0aDogX3Rlc3RfdXRpbHMuVEVTVF9QREZTX1BBVEgubm9kZSArIGZpbGVOYW1lCisgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YVByb21pc2UgPSBfdGVzdF91dGlscy5ET01GaWxlUmVhZGVyRmFjdG9yeS5mZXRjaCh7CisgICAgICAgICAgcGF0aDogX3Rlc3RfdXRpbHMuVEVTVF9QREZTX1BBVEguZG9tICsgZmlsZU5hbWUKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBhZnRlckFsbChmdW5jdGlvbiAoKSB7CisgICAgICBkYXRhUHJvbWlzZSA9IG51bGw7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBmZXRjaCBkb2N1bWVudCBpbmZvIGFuZCBwYWdlIHVzaW5nIHJhbmdlcyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBpbml0aWFsRGF0YUxlbmd0aCA9IDQwMDA7CisgICAgICBsZXQgZmV0Y2hlcyA9IDAsCisgICAgICAgICAgbG9hZGluZ1Rhc2s7CisgICAgICBkYXRhUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIGNvbnN0IGluaXRpYWxEYXRhID0gZGF0YS5zdWJhcnJheSgwLCBpbml0aWFsRGF0YUxlbmd0aCk7CisgICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBfYXBpLlBERkRhdGFSYW5nZVRyYW5zcG9ydChkYXRhLmxlbmd0aCwgaW5pdGlhbERhdGEpOworCisgICAgICAgIHRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlID0gZnVuY3Rpb24gKGJlZ2luLCBlbmQpIHsKKyAgICAgICAgICBmZXRjaGVzKys7CisgICAgICAgICAgd2FpdFNvbWUoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdHJhbnNwb3J0Lm9uRGF0YVByb2dyZXNzKDQwMDApOworICAgICAgICAgICAgdHJhbnNwb3J0Lm9uRGF0YVJhbmdlKGJlZ2luLCBkYXRhLnN1YmFycmF5KGJlZ2luLCBlbmQpKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSh0cmFuc3BvcnQpOworICAgICAgICByZXR1cm4gbG9hZGluZ1Rhc2sucHJvbWlzZTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHBkZkRvY3VtZW50KSB7CisgICAgICAgIGV4cGVjdChwZGZEb2N1bWVudC5udW1QYWdlcykudG9FcXVhbCgxNCk7CisgICAgICAgIHJldHVybiBwZGZEb2N1bWVudC5nZXRQYWdlKDEwKTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHBkZlBhZ2UpIHsKKyAgICAgICAgZXhwZWN0KHBkZlBhZ2Uucm90YXRlKS50b0VxdWFsKDApOworICAgICAgICBleHBlY3QoZmV0Y2hlcykudG9CZUdyZWF0ZXJUaGFuKDIpOworICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBmZXRjaCBkb2N1bWVudCBpbmZvIGFuZCBwYWdlIHVzaW5nIHJhbmdlIGFuZCBzdHJlYW1pbmciLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgaW5pdGlhbERhdGFMZW5ndGggPSA0MDAwOworICAgICAgbGV0IGZldGNoZXMgPSAwLAorICAgICAgICAgIGxvYWRpbmdUYXNrOworICAgICAgZGF0YVByb21pc2UudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBjb25zdCBpbml0aWFsRGF0YSA9IGRhdGEuc3ViYXJyYXkoMCwgaW5pdGlhbERhdGFMZW5ndGgpOworICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgX2FwaS5QREZEYXRhUmFuZ2VUcmFuc3BvcnQoZGF0YS5sZW5ndGgsIGluaXRpYWxEYXRhKTsKKworICAgICAgICB0cmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZSA9IGZ1bmN0aW9uIChiZWdpbiwgZW5kKSB7CisgICAgICAgICAgZmV0Y2hlcysrOworCisgICAgICAgICAgaWYgKGZldGNoZXMgPT09IDEpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5vbkRhdGFQcm9ncmVzc2l2ZVJlYWQoZGF0YS5zdWJhcnJheShpbml0aWFsRGF0YUxlbmd0aCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIHdhaXRTb21lKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5vbkRhdGFSYW5nZShiZWdpbiwgZGF0YS5zdWJhcnJheShiZWdpbiwgZW5kKSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkodHJhbnNwb3J0KTsKKyAgICAgICAgcmV0dXJuIGxvYWRpbmdUYXNrLnByb21pc2U7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChwZGZEb2N1bWVudCkgeworICAgICAgICBleHBlY3QocGRmRG9jdW1lbnQubnVtUGFnZXMpLnRvRXF1YWwoMTQpOworICAgICAgICByZXR1cm4gcGRmRG9jdW1lbnQuZ2V0UGFnZSgxMCk7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uIChwZGZQYWdlKSB7CisgICAgICAgIGV4cGVjdChwZGZQYWdlLnJvdGF0ZSkudG9FcXVhbCgwKTsKKyAgICAgICAgZXhwZWN0KGZldGNoZXMpLnRvRXF1YWwoMSk7CisgICAgICAgIHdhaXRTb21lKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgICAgfSk7CisgICAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgZmV0Y2ggZG9jdW1lbnQgaW5mbyBhbmQgcGFnZSwgd2l0aG91dCByYW5nZSwgIiArICJ1c2luZyBjb21wbGV0ZSBpbml0aWFsRGF0YSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBsZXQgZmV0Y2hlcyA9IDAsCisgICAgICAgICAgbG9hZGluZ1Rhc2s7CisgICAgICBkYXRhUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBfYXBpLlBERkRhdGFSYW5nZVRyYW5zcG9ydChkYXRhLmxlbmd0aCwgZGF0YSwgdHJ1ZSk7CisKKyAgICAgICAgdHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2UgPSBmdW5jdGlvbiAoYmVnaW4sIGVuZCkgeworICAgICAgICAgIGZldGNoZXMrKzsKKyAgICAgICAgfTsKKworICAgICAgICBsb2FkaW5nVGFzayA9ICgwLCBfYXBpLmdldERvY3VtZW50KSh7CisgICAgICAgICAgZGlzYWJsZVJhbmdlOiB0cnVlLAorICAgICAgICAgIHJhbmdlOiB0cmFuc3BvcnQKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBsb2FkaW5nVGFzay5wcm9taXNlOworICAgICAgfSkudGhlbihmdW5jdGlvbiAocGRmRG9jdW1lbnQpIHsKKyAgICAgICAgZXhwZWN0KHBkZkRvY3VtZW50Lm51bVBhZ2VzKS50b0VxdWFsKDE0KTsKKyAgICAgICAgcmV0dXJuIHBkZkRvY3VtZW50LmdldFBhZ2UoMTApOworICAgICAgfSkudGhlbihmdW5jdGlvbiAocGRmUGFnZSkgeworICAgICAgICBleHBlY3QocGRmUGFnZS5yb3RhdGUpLnRvRXF1YWwoMCk7CisgICAgICAgIGV4cGVjdChmZXRjaGVzKS50b0VxdWFsKDApOworICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCkudGhlbihkb25lKTsKKyAgICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9iaWRpX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2JpZGlfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQ2ZDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9iaWRpX3NwZWMuanMKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX2JpZGkgPSByZXF1aXJlKCIuLi8uLi9jb3JlL2JpZGkuanMiKTsKKworZGVzY3JpYmUoImJpZGkiLCBmdW5jdGlvbiAoKSB7CisgIGl0KCJzaG91bGQgbWFyayB0ZXh0IGFzIFJUTCBpZiBtb3JlIHRoYW4gMzAlIG9mIHRleHQgaXMgUlRMIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciB0ZXN0ID0gIlx1MDY0NVx1MDYzNVx1MDYzMSBFZ3lwdCI7CisgICAgdmFyIHJlc3VsdCA9ICJFZ3lwdCBcdTA2MzFcdTA2MzVcdTA2NDUiOworICAgIHZhciBiaWRpVGV4dCA9ICgwLCBfYmlkaS5iaWRpKSh0ZXN0LCAtMSwgZmFsc2UpOworICAgIGV4cGVjdChiaWRpVGV4dC5zdHIpLnRvRXF1YWwocmVzdWx0KTsKKyAgICBleHBlY3QoYmlkaVRleHQuZGlyKS50b0VxdWFsKCJydGwiKTsKKyAgfSk7CisgIGl0KCJzaG91bGQgbWFyayB0ZXh0IGFzIExUUiBpZiBsZXNzIHRoYW4gMzAlIG9mIHRleHQgaXMgUlRMIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciB0ZXN0ID0gIkVneXB0IGlzIGtub3duIGFzIFx1MDY0NVx1MDYzNVx1MDYzMSBpbiBBcmFiaWMuIjsKKyAgICB2YXIgcmVzdWx0ID0gIkVneXB0IGlzIGtub3duIGFzIFx1MDYzMVx1MDYzNVx1MDY0NSBpbiBBcmFiaWMuIjsKKyAgICB2YXIgYmlkaVRleHQgPSAoMCwgX2JpZGkuYmlkaSkodGVzdCwgLTEsIGZhbHNlKTsKKyAgICBleHBlY3QoYmlkaVRleHQuc3RyKS50b0VxdWFsKHJlc3VsdCk7CisgICAgZXhwZWN0KGJpZGlUZXh0LmRpcikudG9FcXVhbCgibHRyIik7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9jZmZfcGFyc2VyX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2NmZl9wYXJzZXJfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQxMjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9jZmZfcGFyc2VyX3NwZWMuanMKQEAgLTAsMCArMSwzMjIgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF9jZmZfcGFyc2VyID0gcmVxdWlyZSgiLi4vLi4vY29yZS9jZmZfcGFyc2VyLmpzIik7CisKK3ZhciBfZm9udHMgPSByZXF1aXJlKCIuLi8uLi9jb3JlL2ZvbnRzLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi4vLi4vY29yZS9zdHJlYW0uanMiKTsKKworZGVzY3JpYmUoIkNGRlBhcnNlciIsIGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gY3JlYXRlV2l0aE51bGxQcm90byhvYmopIHsKKyAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgIGZvciAodmFyIGkgaW4gb2JqKSB7CisgICAgICByZXN1bHRbaV0gPSBvYmpbaV07CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHZhciBwcml2YXRlRGljdFN0dWIgPSB7CisgICAgZ2V0QnlOYW1lKG5hbWUpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB9OworICB2YXIgZm9udERhdGEsIHBhcnNlciwgY2ZmOworICBiZWZvcmVBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICB2YXIgZXhhbXBsZUZvbnQgPSAiMDEwMDA0MDEwMDAxMDEwMTEzNDE0MjQzNDQ0NTQ2MmIiICsgIjU0Njk2ZDY1NzMyZDUyNmY2ZDYxNmUwMDAxMDEwMTFmIiArICJmODFiMDBmODFjMDJmODFkMDNmODE5MDQxYzZmMDAwZCIgKyAiZmIzY2ZiNmVmYTdjZmExNjA1ZTkxMWI4ZjExMjAwMDMiICsgIjAxMDEwODEzMTgzMDMwMzEyZTMwMzAzNzU0Njk2ZDY1IiArICI3MzIwNTI2ZjZkNjE2ZTU0Njk2ZDY1NzMwMDAwMDAwMiIgKyAiMDEwMTAyMDMwZTBlN2Q5OWY5MmE5OWZiNzY5NWY3NzMiICsgIjhiMDZmNzlhOTNmYzdjOGMwNzdkOTlmODU2OTVmNzVlIiArICI5OTA4ZmI2ZThjZjg3MzkzZjcxMDhiMDlhNzBhZGYwYiIgKyAiZjc4ZTE0IjsKKyAgICB2YXIgZm9udEFyciA9IFtdOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZXhhbXBsZUZvbnQubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgeworICAgICAgdmFyIGhleCA9IGV4YW1wbGVGb250LnN1YnN0cmluZyhpLCBpICsgMik7CisgICAgICBmb250QXJyLnB1c2gocGFyc2VJbnQoaGV4LCAxNikpOworICAgIH0KKworICAgIGZvbnREYXRhID0gbmV3IF9zdHJlYW0uU3RyZWFtKGZvbnRBcnIpOworICAgIGRvbmUoKTsKKyAgfSk7CisgIGFmdGVyQWxsKGZ1bmN0aW9uICgpIHsKKyAgICBmb250RGF0YSA9IG51bGw7CisgIH0pOworICBiZWZvcmVFYWNoKGZ1bmN0aW9uIChkb25lKSB7CisgICAgcGFyc2VyID0gbmV3IF9jZmZfcGFyc2VyLkNGRlBhcnNlcihmb250RGF0YSwge30sIF9mb250cy5TRUFDX0FOQUxZU0lTX0VOQUJMRUQpOworICAgIGNmZiA9IHBhcnNlci5wYXJzZSgpOworICAgIGRvbmUoKTsKKyAgfSk7CisgIGFmdGVyRWFjaChmdW5jdGlvbiAoZG9uZSkgeworICAgIHBhcnNlciA9IGNmZiA9IG51bGw7CisgICAgZG9uZSgpOworICB9KTsKKyAgaXQoInBhcnNlcyBoZWFkZXIiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGhlYWRlciA9IGNmZi5oZWFkZXI7CisgICAgZXhwZWN0KGhlYWRlci5tYWpvcikudG9FcXVhbCgxKTsKKyAgICBleHBlY3QoaGVhZGVyLm1pbm9yKS50b0VxdWFsKDApOworICAgIGV4cGVjdChoZWFkZXIuaGRyU2l6ZSkudG9FcXVhbCg0KTsKKyAgICBleHBlY3QoaGVhZGVyLm9mZlNpemUpLnRvRXF1YWwoMSk7CisgIH0pOworICBpdCgicGFyc2VzIG5hbWUgaW5kZXgiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIG5hbWVzID0gY2ZmLm5hbWVzOworICAgIGV4cGVjdChuYW1lcy5sZW5ndGgpLnRvRXF1YWwoMSk7CisgICAgZXhwZWN0KG5hbWVzWzBdKS50b0VxdWFsKCJBQkNERUYrVGltZXMtUm9tYW4iKTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgc3RyaW5nIGluZGV4IiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBzdHJpbmdzID0gY2ZmLnN0cmluZ3M7CisgICAgZXhwZWN0KHN0cmluZ3MuY291bnQpLnRvRXF1YWwoMyk7CisgICAgZXhwZWN0KHN0cmluZ3MuZ2V0KDApKS50b0VxdWFsKCIubm90ZGVmIik7CisgICAgZXhwZWN0KHN0cmluZ3MuZ2V0KDM5MSkpLnRvRXF1YWwoIjAwMS4wMDciKTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgdG9wIGRpY3QiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHRvcERpY3QgPSBjZmYudG9wRGljdDsKKyAgICBleHBlY3QodG9wRGljdC5nZXRCeU5hbWUoInZlcnNpb24iKSkudG9FcXVhbCgzOTEpOworICAgIGV4cGVjdCh0b3BEaWN0LmdldEJ5TmFtZSgiRnVsbE5hbWUiKSkudG9FcXVhbCgzOTIpOworICAgIGV4cGVjdCh0b3BEaWN0LmdldEJ5TmFtZSgiRmFtaWx5TmFtZSIpKS50b0VxdWFsKDM5Myk7CisgICAgZXhwZWN0KHRvcERpY3QuZ2V0QnlOYW1lKCJXZWlnaHQiKSkudG9FcXVhbCgzODkpOworICAgIGV4cGVjdCh0b3BEaWN0LmdldEJ5TmFtZSgiVW5pcXVlSUQiKSkudG9FcXVhbCgyODQxNik7CisgICAgZXhwZWN0KHRvcERpY3QuZ2V0QnlOYW1lKCJGb250QkJveCIpKS50b0VxdWFsKFstMTY4LCAtMjE4LCAxMDAwLCA4OThdKTsKKyAgICBleHBlY3QodG9wRGljdC5nZXRCeU5hbWUoIkNoYXJTdHJpbmdzIikpLnRvRXF1YWwoOTQpOworICAgIGV4cGVjdCh0b3BEaWN0LmdldEJ5TmFtZSgiUHJpdmF0ZSIpKS50b0VxdWFsKFs0NSwgMTAyXSk7CisgIH0pOworICBpdCgicmVmdXNlcyB0byBhZGQgdG9wRGljdCBrZXkgd2l0aCBpbnZhbGlkIHZhbHVlIChidWcgMTA2ODQzMikiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHRvcERpY3QgPSBjZmYudG9wRGljdDsKKyAgICB2YXIgZGVmYXVsdFZhbHVlID0gdG9wRGljdC5nZXRCeU5hbWUoIlVuZGVybGluZVBvc2l0aW9uIik7CisgICAgdG9wRGljdC5zZXRCeUtleSgzMDc1LCBbTmFOXSk7CisgICAgZXhwZWN0KHRvcERpY3QuZ2V0QnlOYW1lKCJVbmRlcmxpbmVQb3NpdGlvbiIpKS50b0VxdWFsKGRlZmF1bHRWYWx1ZSk7CisgIH0pOworICBpdCgiaWdub3JlcyByZXNlcnZlZCBjb21tYW5kcyBpbiBwYXJzZURpY3QsIGFuZCByZWZ1c2VzIHRvIGFkZCBwcml2YXRlRGljdCAiICsgImtleXMgd2l0aCBpbnZhbGlkIHZhbHVlcyAoYnVnIDEzMDg1MzYpIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KFs2NCwgMzksIDMxLCAzMCwgMjUyLCAxMTQsIDEzNywgMTE1LCA3OSwgMzAsIDE5NywgMTE5LCAyLCA5OSwgMTI3LCA2XSk7CisgICAgcGFyc2VyLmJ5dGVzID0gYnl0ZXM7CisgICAgdmFyIHRvcERpY3QgPSBjZmYudG9wRGljdDsKKyAgICB0b3BEaWN0LnNldEJ5TmFtZSgiUHJpdmF0ZSIsIFtieXRlcy5sZW5ndGgsIDBdKTsKKworICAgIHZhciBwYXJzZVByaXZhdGVEaWN0ID0gZnVuY3Rpb24gKCkgeworICAgICAgcGFyc2VyLnBhcnNlUHJpdmF0ZURpY3QodG9wRGljdCk7CisgICAgfTsKKworICAgIGV4cGVjdChwYXJzZVByaXZhdGVEaWN0KS5ub3QudG9UaHJvdygpOworICAgIHZhciBwcml2YXRlRGljdCA9IHRvcERpY3QucHJpdmF0ZURpY3Q7CisgICAgZXhwZWN0KHByaXZhdGVEaWN0LmdldEJ5TmFtZSgiQmx1ZVZhbHVlcyIpKS50b0JlTnVsbCgpOworICB9KTsKKyAgaXQoInBhcnNlcyBhIENoYXJTdHJpbmcgaGF2aW5nIGNudHJtYXNrIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAxLCAwLCAzOCwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxLCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDMsIDIwLCAyMiwgMjIsIDE0XSk7CisgICAgcGFyc2VyLmJ5dGVzID0gYnl0ZXM7CisgICAgdmFyIGNoYXJTdHJpbmdzSW5kZXggPSBwYXJzZXIucGFyc2VJbmRleCgwKS5vYmo7CisgICAgdmFyIGNoYXJTdHJpbmdzID0gcGFyc2VyLnBhcnNlQ2hhclN0cmluZ3MoeworICAgICAgY2hhclN0cmluZ3M6IGNoYXJTdHJpbmdzSW5kZXgsCisgICAgICBwcml2YXRlRGljdDogcHJpdmF0ZURpY3RTdHViCisgICAgfSkuY2hhclN0cmluZ3M7CisgICAgZXhwZWN0KGNoYXJTdHJpbmdzLmNvdW50KS50b0VxdWFsKDEpOworICAgIGV4cGVjdChjaGFyU3RyaW5ncy5nZXQoMCkubGVuZ3RoKS50b0VxdWFsKDM4KTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgYSBDaGFyU3RyaW5nIGVuZGNoYXIgd2l0aCA0IGFyZ3Mgdy9zZWFjIGVuYWJsZWQiLCBmdW5jdGlvbiAoKSB7CisgICAgY29uc3QgY2ZmUGFyc2VyID0gbmV3IF9jZmZfcGFyc2VyLkNGRlBhcnNlcihmb250RGF0YSwge30sIHRydWUpOworICAgIGNmZlBhcnNlci5wYXJzZSgpOworICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAxLCAwLCAyMzcsIDI0NywgMjIsIDI0NywgNzIsIDIwNCwgMjQ3LCA4NiwgMTRdKTsKKyAgICBjZmZQYXJzZXIuYnl0ZXMgPSBieXRlczsKKyAgICB2YXIgY2hhclN0cmluZ3NJbmRleCA9IGNmZlBhcnNlci5wYXJzZUluZGV4KDApLm9iajsKKyAgICB2YXIgcmVzdWx0ID0gY2ZmUGFyc2VyLnBhcnNlQ2hhclN0cmluZ3MoeworICAgICAgY2hhclN0cmluZ3M6IGNoYXJTdHJpbmdzSW5kZXgsCisgICAgICBwcml2YXRlRGljdDogcHJpdmF0ZURpY3RTdHViCisgICAgfSk7CisgICAgZXhwZWN0KHJlc3VsdC5jaGFyU3RyaW5ncy5jb3VudCkudG9FcXVhbCgxKTsKKyAgICBleHBlY3QocmVzdWx0LmNoYXJTdHJpbmdzLmdldCgwKS5sZW5ndGgpLnRvRXF1YWwoMSk7CisgICAgZXhwZWN0KHJlc3VsdC5zZWFjcy5sZW5ndGgpLnRvRXF1YWwoMSk7CisgICAgZXhwZWN0KHJlc3VsdC5zZWFjc1swXS5sZW5ndGgpLnRvRXF1YWwoNCk7CisgICAgZXhwZWN0KHJlc3VsdC5zZWFjc1swXVswXSkudG9FcXVhbCgxMzApOworICAgIGV4cGVjdChyZXN1bHQuc2VhY3NbMF1bMV0pLnRvRXF1YWwoMTgwKTsKKyAgICBleHBlY3QocmVzdWx0LnNlYWNzWzBdWzJdKS50b0VxdWFsKDY1KTsKKyAgICBleHBlY3QocmVzdWx0LnNlYWNzWzBdWzNdKS50b0VxdWFsKDE5NCk7CisgIH0pOworICBpdCgicGFyc2VzIGEgQ2hhclN0cmluZyBlbmRjaGFyIHdpdGggNCBhcmdzIHcvc2VhYyBkaXNhYmxlZCIsIGZ1bmN0aW9uICgpIHsKKyAgICBjb25zdCBjZmZQYXJzZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKGZvbnREYXRhLCB7fSwgZmFsc2UpOworICAgIGNmZlBhcnNlci5wYXJzZSgpOworICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAxLCAwLCAyMzcsIDI0NywgMjIsIDI0NywgNzIsIDIwNCwgMjQ3LCA4NiwgMTRdKTsKKyAgICBjZmZQYXJzZXIuYnl0ZXMgPSBieXRlczsKKyAgICB2YXIgY2hhclN0cmluZ3NJbmRleCA9IGNmZlBhcnNlci5wYXJzZUluZGV4KDApLm9iajsKKyAgICB2YXIgcmVzdWx0ID0gY2ZmUGFyc2VyLnBhcnNlQ2hhclN0cmluZ3MoeworICAgICAgY2hhclN0cmluZ3M6IGNoYXJTdHJpbmdzSW5kZXgsCisgICAgICBwcml2YXRlRGljdDogcHJpdmF0ZURpY3RTdHViCisgICAgfSk7CisgICAgZXhwZWN0KHJlc3VsdC5jaGFyU3RyaW5ncy5jb3VudCkudG9FcXVhbCgxKTsKKyAgICBleHBlY3QocmVzdWx0LmNoYXJTdHJpbmdzLmdldCgwKS5sZW5ndGgpLnRvRXF1YWwoOSk7CisgICAgZXhwZWN0KHJlc3VsdC5zZWFjcy5sZW5ndGgpLnRvRXF1YWwoMCk7CisgIH0pOworICBpdCgicGFyc2VzIGEgQ2hhclN0cmluZyBlbmRjaGFyIG5vIGFyZ3MiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDEsIDEsIDAsIDE0XSk7CisgICAgcGFyc2VyLmJ5dGVzID0gYnl0ZXM7CisgICAgdmFyIGNoYXJTdHJpbmdzSW5kZXggPSBwYXJzZXIucGFyc2VJbmRleCgwKS5vYmo7CisgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5wYXJzZUNoYXJTdHJpbmdzKHsKKyAgICAgIGNoYXJTdHJpbmdzOiBjaGFyU3RyaW5nc0luZGV4LAorICAgICAgcHJpdmF0ZURpY3Q6IHByaXZhdGVEaWN0U3R1YgorICAgIH0pOworICAgIGV4cGVjdChyZXN1bHQuY2hhclN0cmluZ3MuY291bnQpLnRvRXF1YWwoMSk7CisgICAgZXhwZWN0KHJlc3VsdC5jaGFyU3RyaW5ncy5nZXQoMClbMF0pLnRvRXF1YWwoMTQpOworICAgIGV4cGVjdChyZXN1bHQuc2VhY3MubGVuZ3RoKS50b0VxdWFsKDApOworICB9KTsKKyAgaXQoInBhcnNlcyBwcmVkZWZpbmVkIGNoYXJzZXRzIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBjaGFyc2V0ID0gcGFyc2VyLnBhcnNlQ2hhcnNldHMoMCwgMCwgbnVsbCwgdHJ1ZSk7CisgICAgZXhwZWN0KGNoYXJzZXQucHJlZGVmaW5lZCkudG9FcXVhbCh0cnVlKTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgY2hhcnNldCBmb3JtYXQgMCIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMl0pOworICAgIHBhcnNlci5ieXRlcyA9IGJ5dGVzOworICAgIHZhciBjaGFyc2V0ID0gcGFyc2VyLnBhcnNlQ2hhcnNldHMoMywgMiwgbmV3IF9jZmZfcGFyc2VyLkNGRlN0cmluZ3MoKSwgZmFsc2UpOworICAgIGV4cGVjdChjaGFyc2V0LmNoYXJzZXRbMV0pLnRvRXF1YWwoImV4Y2xhbSIpOworICAgIGNoYXJzZXQgPSBwYXJzZXIucGFyc2VDaGFyc2V0cygzLCAyLCBuZXcgX2NmZl9wYXJzZXIuQ0ZGU3RyaW5ncygpLCB0cnVlKTsKKyAgICBleHBlY3QoY2hhcnNldC5jaGFyc2V0WzFdKS50b0VxdWFsKDIpOworICB9KTsKKyAgaXQoInBhcnNlcyBjaGFyc2V0IGZvcm1hdCAxIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KFsweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA4LCAweDAxXSk7CisgICAgcGFyc2VyLmJ5dGVzID0gYnl0ZXM7CisgICAgdmFyIGNoYXJzZXQgPSBwYXJzZXIucGFyc2VDaGFyc2V0cygzLCAyLCBuZXcgX2NmZl9wYXJzZXIuQ0ZGU3RyaW5ncygpLCBmYWxzZSk7CisgICAgZXhwZWN0KGNoYXJzZXQuY2hhcnNldCkudG9FcXVhbChbIi5ub3RkZWYiLCAicXVvdGVyaWdodCIsICJwYXJlbmxlZnQiXSk7CisgICAgY2hhcnNldCA9IHBhcnNlci5wYXJzZUNoYXJzZXRzKDMsIDIsIG5ldyBfY2ZmX3BhcnNlci5DRkZTdHJpbmdzKCksIHRydWUpOworICAgIGV4cGVjdChjaGFyc2V0LmNoYXJzZXQpLnRvRXF1YWwoWzAsIDgsIDldKTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgY2hhcnNldCBmb3JtYXQgMiIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMV0pOworICAgIHBhcnNlci5ieXRlcyA9IGJ5dGVzOworICAgIHZhciBjaGFyc2V0ID0gcGFyc2VyLnBhcnNlQ2hhcnNldHMoMywgMiwgbmV3IF9jZmZfcGFyc2VyLkNGRlN0cmluZ3MoKSwgZmFsc2UpOworICAgIGV4cGVjdChjaGFyc2V0LmNoYXJzZXQpLnRvRXF1YWwoWyIubm90ZGVmIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0Il0pOworICAgIGNoYXJzZXQgPSBwYXJzZXIucGFyc2VDaGFyc2V0cygzLCAyLCBuZXcgX2NmZl9wYXJzZXIuQ0ZGU3RyaW5ncygpLCB0cnVlKTsKKyAgICBleHBlY3QoY2hhcnNldC5jaGFyc2V0KS50b0VxdWFsKFswLCA4LCA5XSk7CisgIH0pOworICBpdCgicGFyc2VzIGVuY29kaW5nIGZvcm1hdCAwIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KFsweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDA4XSk7CisgICAgcGFyc2VyLmJ5dGVzID0gYnl0ZXM7CisgICAgdmFyIGVuY29kaW5nID0gcGFyc2VyLnBhcnNlRW5jb2RpbmcoMiwge30sIG5ldyBfY2ZmX3BhcnNlci5DRkZTdHJpbmdzKCksIG51bGwpOworICAgIGV4cGVjdChlbmNvZGluZy5lbmNvZGluZykudG9FcXVhbChjcmVhdGVXaXRoTnVsbFByb3RvKHsKKyAgICAgIDB4ODogMQorICAgIH0pKTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgZW5jb2RpbmcgZm9ybWF0IDEiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDcsIDB4MDFdKTsKKyAgICBwYXJzZXIuYnl0ZXMgPSBieXRlczsKKyAgICB2YXIgZW5jb2RpbmcgPSBwYXJzZXIucGFyc2VFbmNvZGluZygyLCB7fSwgbmV3IF9jZmZfcGFyc2VyLkNGRlN0cmluZ3MoKSwgbnVsbCk7CisgICAgZXhwZWN0KGVuY29kaW5nLmVuY29kaW5nKS50b0VxdWFsKGNyZWF0ZVdpdGhOdWxsUHJvdG8oeworICAgICAgMHg3OiAweDAxLAorICAgICAgMHgwODogMHgwMgorICAgIH0pKTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgZmRzZWxlY3QgZm9ybWF0IDAiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDB4MDAsIDB4MDFdKTsKKyAgICBwYXJzZXIuYnl0ZXMgPSBieXRlcy5zbGljZSgpOworICAgIHZhciBmZFNlbGVjdCA9IHBhcnNlci5wYXJzZUZEU2VsZWN0KDAsIDIpOworICAgIGV4cGVjdChmZFNlbGVjdC5mZFNlbGVjdCkudG9FcXVhbChbMCwgMV0pOworICAgIGV4cGVjdChmZFNlbGVjdC5mb3JtYXQpLnRvRXF1YWwoMCk7CisgIH0pOworICBpdCgicGFyc2VzIGZkc2VsZWN0IGZvcm1hdCAzIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KFsweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDA5LCAweDAwLCAweDAyLCAweDBhLCAweDAwLCAweDA0XSk7CisgICAgcGFyc2VyLmJ5dGVzID0gYnl0ZXMuc2xpY2UoKTsKKyAgICB2YXIgZmRTZWxlY3QgPSBwYXJzZXIucGFyc2VGRFNlbGVjdCgwLCA0KTsKKyAgICBleHBlY3QoZmRTZWxlY3QuZmRTZWxlY3QpLnRvRXF1YWwoWzksIDksIDB4YSwgMHhhXSk7CisgICAgZXhwZWN0KGZkU2VsZWN0LmZvcm1hdCkudG9FcXVhbCgzKTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgaW52YWxpZCBmZHNlbGVjdCBmb3JtYXQgMyAoYnVnIDExNDYxMDYpIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KFsweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDA5LCAweDAwLCAweDAyLCAweDBhLCAweDAwLCAweDA0XSk7CisgICAgcGFyc2VyLmJ5dGVzID0gYnl0ZXMuc2xpY2UoKTsKKyAgICB2YXIgZmRTZWxlY3QgPSBwYXJzZXIucGFyc2VGRFNlbGVjdCgwLCA0KTsKKyAgICBleHBlY3QoZmRTZWxlY3QuZmRTZWxlY3QpLnRvRXF1YWwoWzksIDksIDB4YSwgMHhhXSk7CisgICAgZXhwZWN0KGZkU2VsZWN0LmZvcm1hdCkudG9FcXVhbCgzKTsKKyAgfSk7Cit9KTsKK2Rlc2NyaWJlKCJDRkZDb21waWxlciIsIGZ1bmN0aW9uICgpIHsKKyAgZnVuY3Rpb24gdGVzdFBhcnNlcihieXRlcykgeworICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpOworICAgIHJldHVybiBuZXcgX2NmZl9wYXJzZXIuQ0ZGUGFyc2VyKHsKKyAgICAgIGdldEJ5dGVzOiAoKSA9PiB7CisgICAgICAgIHJldHVybiBieXRlczsKKyAgICAgIH0KKyAgICB9LCB7fSwgX2ZvbnRzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgIH0KKworICBpdCgiZW5jb2RlcyBpbnRlZ2VycyIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgYyA9IG5ldyBfY2ZmX3BhcnNlci5DRkZDb21waWxlcigpOworICAgIGV4cGVjdChjLmVuY29kZUludGVnZXIoMCkpLnRvRXF1YWwoWzB4OGJdKTsKKyAgICBleHBlY3QoYy5lbmNvZGVJbnRlZ2VyKDEwMCkpLnRvRXF1YWwoWzB4ZWZdKTsKKyAgICBleHBlY3QoYy5lbmNvZGVJbnRlZ2VyKC0xMDApKS50b0VxdWFsKFsweDI3XSk7CisgICAgZXhwZWN0KGMuZW5jb2RlSW50ZWdlcigxMDAwKSkudG9FcXVhbChbMHhmYSwgMHg3Y10pOworICAgIGV4cGVjdChjLmVuY29kZUludGVnZXIoLTEwMDApKS50b0VxdWFsKFsweGZlLCAweDdjXSk7CisgICAgZXhwZWN0KGMuZW5jb2RlSW50ZWdlcigxMDAwMCkpLnRvRXF1YWwoWzB4MWMsIDB4MjcsIDB4MTBdKTsKKyAgICBleHBlY3QoYy5lbmNvZGVJbnRlZ2VyKC0xMDAwMCkpLnRvRXF1YWwoWzB4MWMsIDB4ZDgsIDB4ZjBdKTsKKyAgICBleHBlY3QoYy5lbmNvZGVJbnRlZ2VyKDEwMDAwMCkpLnRvRXF1YWwoWzB4MWQsIDB4MDAsIDB4MDEsIDB4ODYsIDB4YTBdKTsKKyAgICBleHBlY3QoYy5lbmNvZGVJbnRlZ2VyKC0xMDAwMDApKS50b0VxdWFsKFsweDFkLCAweGZmLCAweGZlLCAweDc5LCAweDYwXSk7CisgIH0pOworICBpdCgiZW5jb2RlcyBmbG9hdHMiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGMgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIoKTsKKyAgICBleHBlY3QoYy5lbmNvZGVGbG9hdCgtMi4yNSkpLnRvRXF1YWwoWzB4MWUsIDB4ZTIsIDB4YTIsIDB4NWZdKTsKKyAgICBleHBlY3QoYy5lbmNvZGVGbG9hdCg1ZS0xMSkpLnRvRXF1YWwoWzB4MWUsIDB4NWMsIDB4MTEsIDB4ZmZdKTsKKyAgfSk7CisgIGl0KCJzYW5pdGl6ZXMgbmFtZSBpbmRleCIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgYyA9IG5ldyBfY2ZmX3BhcnNlci5DRkZDb21waWxlcigpOworICAgIHZhciBuYW1lSW5kZXhDb21waWxlZCA9IGMuY29tcGlsZU5hbWVJbmRleChbIlthIl0pOworICAgIHZhciBwYXJzZXIgPSB0ZXN0UGFyc2VyKG5hbWVJbmRleENvbXBpbGVkKTsKKyAgICB2YXIgbmFtZUluZGV4ID0gcGFyc2VyLnBhcnNlSW5kZXgoMCk7CisgICAgdmFyIG5hbWVzID0gcGFyc2VyLnBhcnNlTmFtZUluZGV4KG5hbWVJbmRleC5vYmopOworICAgIGV4cGVjdChuYW1lcykudG9FcXVhbChbIl9hIl0pOworICAgIHZhciBsb25nTmFtZSA9ICIiOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjk7IGkrKykgeworICAgICAgbG9uZ05hbWUgKz0gIl8iOworICAgIH0KKworICAgIG5hbWVJbmRleENvbXBpbGVkID0gYy5jb21waWxlTmFtZUluZGV4KFtsb25nTmFtZV0pOworICAgIHBhcnNlciA9IHRlc3RQYXJzZXIobmFtZUluZGV4Q29tcGlsZWQpOworICAgIG5hbWVJbmRleCA9IHBhcnNlci5wYXJzZUluZGV4KDApOworICAgIG5hbWVzID0gcGFyc2VyLnBhcnNlTmFtZUluZGV4KG5hbWVJbmRleC5vYmopOworICAgIGV4cGVjdChuYW1lc1swXS5sZW5ndGgpLnRvRXF1YWwoMTI3KTsKKyAgfSk7CisgIGl0KCJjb21waWxlcyBmZHNlbGVjdCBmb3JtYXQgMCIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgZmRTZWxlY3QgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGRkRTZWxlY3QoMCwgWzMsIDIsIDFdKTsKKyAgICB2YXIgYyA9IG5ldyBfY2ZmX3BhcnNlci5DRkZDb21waWxlcigpOworICAgIHZhciBvdXQgPSBjLmNvbXBpbGVGRFNlbGVjdChmZFNlbGVjdCk7CisgICAgZXhwZWN0KG91dCkudG9FcXVhbChbMCwgMywgMiwgMV0pOworICB9KTsKKyAgaXQoImNvbXBpbGVzIGZkc2VsZWN0IGZvcm1hdCAzIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBmZFNlbGVjdCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZGRFNlbGVjdCgzLCBbMCwgMCwgMSwgMV0pOworICAgIHZhciBjID0gbmV3IF9jZmZfcGFyc2VyLkNGRkNvbXBpbGVyKCk7CisgICAgdmFyIG91dCA9IGMuY29tcGlsZUZEU2VsZWN0KGZkU2VsZWN0KTsKKyAgICBleHBlY3Qob3V0KS50b0VxdWFsKFszLCAwLCAyLCAwLCAwLCAwLCAwLCAyLCAxLCAwLCA0XSk7CisgIH0pOworICBpdCgiY29tcGlsZXMgZmRzZWxlY3QgZm9ybWF0IDMsIHNpbmdsZSByYW5nZSIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgZmRTZWxlY3QgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGRkRTZWxlY3QoMywgWzAsIDBdKTsKKyAgICB2YXIgYyA9IG5ldyBfY2ZmX3BhcnNlci5DRkZDb21waWxlcigpOworICAgIHZhciBvdXQgPSBjLmNvbXBpbGVGRFNlbGVjdChmZFNlbGVjdCk7CisgICAgZXhwZWN0KG91dCkudG9FcXVhbChbMywgMCwgMSwgMCwgMCwgMCwgMCwgMl0pOworICB9KTsKKyAgaXQoImNvbXBpbGVzIGNoYXJzZXQgb2YgQ0lEIGZvbnQiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGNoYXJzZXQgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ2hhcnNldCgpOworICAgIHZhciBjID0gbmV3IF9jZmZfcGFyc2VyLkNGRkNvbXBpbGVyKCk7CisgICAgdmFyIG51bUdseXBocyA9IDc7CisgICAgdmFyIG91dCA9IGMuY29tcGlsZUNoYXJzZXQoY2hhcnNldCwgbnVtR2x5cGhzLCBuZXcgX2NmZl9wYXJzZXIuQ0ZGU3RyaW5ncygpLCB0cnVlKTsKKyAgICBleHBlY3Qob3V0KS50b0VxdWFsKFsyLCAwLCAwLCAwLCBudW1HbHlwaHMgLSAxXSk7CisgIH0pOworICBpdCgiY29tcGlsZXMgY2hhcnNldCBvZiBub24gQ0lEIGZvbnQiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGNoYXJzZXQgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ2hhcnNldChmYWxzZSwgMCwgWyJzcGFjZSIsICJleGNsYW0iXSk7CisgICAgdmFyIGMgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIoKTsKKyAgICB2YXIgbnVtR2x5cGhzID0gMzsKKyAgICB2YXIgb3V0ID0gYy5jb21waWxlQ2hhcnNldChjaGFyc2V0LCBudW1HbHlwaHMsIG5ldyBfY2ZmX3BhcnNlci5DRkZTdHJpbmdzKCksIGZhbHNlKTsKKyAgICBleHBlY3Qob3V0KS50b0VxdWFsKFswLCAwLCAxLCAwLCAyXSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9jbGl0ZXN0c19oZWxwZXIuanMgYi9saWIvdGVzdC91bml0L2NsaXRlc3RzX2hlbHBlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzFlZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9jbGl0ZXN0c19oZWxwZXIuanMKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX2lzX25vZGUgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvaXNfbm9kZS5qcyIpOworCit2YXIgX25vZGVfc3RyZWFtID0gcmVxdWlyZSgiLi4vLi4vZGlzcGxheS9ub2RlX3N0cmVhbS5qcyIpOworCit2YXIgX2FwaSA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvYXBpLmpzIik7CisKK2lmICghX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYGd1bHAgdW5pdHRlc3RjbGlgIGNvbW1hbmQgY2FuIG9ubHkgYmUgdXNlZCBpbiBOb2RlLmpzIGVudmlyb25tZW50cy4iKTsKK30KKworKDAsIF91dGlsLnNldFZlcmJvc2l0eUxldmVsKShfdXRpbC5WZXJib3NpdHlMZXZlbC5FUlJPUlMpOworKDAsIF9hcGkuc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkpKGZ1bmN0aW9uIChwYXJhbXMpIHsKKyAgcmV0dXJuIG5ldyBfbm9kZV9zdHJlYW0uUERGTm9kZVN0cmVhbShwYXJhbXMpOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9jbWFwX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2NtYXBfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI5NzVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9jbWFwX3NwZWMuanMKQEAgLTAsMCArMSwzNTcgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF9jbWFwID0gcmVxdWlyZSgiLi4vLi4vY29yZS9jbWFwLmpzIik7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvZGlzcGxheV91dGlscy5qcyIpOworCit2YXIgX2lzX25vZGUgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvaXNfbm9kZS5qcyIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuLi8uLi9jb3JlL3ByaW1pdGl2ZXMuanMiKTsKKwordmFyIF9ub2RlX3V0aWxzID0gcmVxdWlyZSgiLi4vLi4vZGlzcGxheS9ub2RlX3V0aWxzLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi4vLi4vY29yZS9zdHJlYW0uanMiKTsKKwordmFyIGNNYXBVcmwgPSB7CisgIGRvbTogIi4uLy4uL2V4dGVybmFsL2JjbWFwcy8iLAorICBub2RlOiAiLi9leHRlcm5hbC9iY21hcHMvIgorfTsKK3ZhciBjTWFwUGFja2VkID0gdHJ1ZTsKK2Rlc2NyaWJlKCJjbWFwIiwgZnVuY3Rpb24gKCkgeworICB2YXIgZmV0Y2hCdWlsdEluQ01hcDsKKyAgYmVmb3JlQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgdmFyIENNYXBSZWFkZXJGYWN0b3J5OworCisgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICBDTWFwUmVhZGVyRmFjdG9yeSA9IG5ldyBfbm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3RvcnkoeworICAgICAgICBiYXNlVXJsOiBjTWFwVXJsLm5vZGUsCisgICAgICAgIGlzQ29tcHJlc3NlZDogY01hcFBhY2tlZAorICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IF9kaXNwbGF5X3V0aWxzLkRPTUNNYXBSZWFkZXJGYWN0b3J5KHsKKyAgICAgICAgYmFzZVVybDogY01hcFVybC5kb20sCisgICAgICAgIGlzQ29tcHJlc3NlZDogY01hcFBhY2tlZAorICAgICAgfSk7CisgICAgfQorCisgICAgZmV0Y2hCdWlsdEluQ01hcCA9IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICByZXR1cm4gQ01hcFJlYWRlckZhY3RvcnkuZmV0Y2goeworICAgICAgICBuYW1lCisgICAgICB9KTsKKyAgICB9OworCisgICAgZG9uZSgpOworICB9KTsKKyAgYWZ0ZXJBbGwoZnVuY3Rpb24gKCkgeworICAgIGZldGNoQnVpbHRJbkNNYXAgPSBudWxsOworICB9KTsKKyAgaXQoInBhcnNlcyBiZWdpbmJmY2hhciIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgdmFyIHN0ciA9ICIyIGJlZ2luYmZjaGFyXG4iICsgIjwwMz4gPDAwPlxuIiArICI8MDQ+IDwwMT5cbiIgKyAiZW5kYmZjaGFyXG4iOworICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oc3RyKTsKKworICAgIHZhciBjbWFwUHJvbWlzZSA9IF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CisgICAgICBlbmNvZGluZzogc3RyZWFtCisgICAgfSk7CisKKyAgICBjbWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgwMykpLnRvRXF1YWwoU3RyaW5nLmZyb21DaGFyQ29kZSgweDAwKSk7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgwNCkpLnRvRXF1YWwoU3RyaW5nLmZyb21DaGFyQ29kZSgweDAxKSk7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgwNSkpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBkb25lLmZhaWwocmVhc29uKTsKKyAgICB9KTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgYmVnaW5iZnJhbmdlIHdpdGggcmFuZ2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHZhciBzdHIgPSAiMSBiZWdpbmJmcmFuZ2VcbiIgKyAiPDA2PiA8MEI+IDBcbiIgKyAiZW5kYmZyYW5nZVxuIjsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHN0cik7CisKKyAgICB2YXIgY21hcFByb21pc2UgPSBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgZW5jb2Rpbmc6IHN0cmVhbQorICAgIH0pOworCisgICAgY21hcFByb21pc2UudGhlbihmdW5jdGlvbiAoY21hcCkgeworICAgICAgZXhwZWN0KGNtYXAubG9va3VwKDB4MDUpKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgwNikpLnRvRXF1YWwoU3RyaW5nLmZyb21DaGFyQ29kZSgweDAwKSk7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgwYikpLnRvRXF1YWwoU3RyaW5nLmZyb21DaGFyQ29kZSgweDA1KSk7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgwYykpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBkb25lLmZhaWwocmVhc29uKTsKKyAgICB9KTsKKyAgfSk7CisgIGl0KCJwYXJzZXMgYmVnaW5iZnJhbmdlIHdpdGggYXJyYXkiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHZhciBzdHIgPSAiMSBiZWdpbmJmcmFuZ2VcbiIgKyAiPDBEPiA8MTI+IFsgMCAxIDIgMyA0IDUgXVxuIiArICJlbmRiZnJhbmdlXG4iOworICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oc3RyKTsKKworICAgIHZhciBjbWFwUHJvbWlzZSA9IF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CisgICAgICBlbmNvZGluZzogc3RyZWFtCisgICAgfSk7CisKKyAgICBjbWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgwYykpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgIGV4cGVjdChjbWFwLmxvb2t1cCgweDBkKSkudG9FcXVhbCgweDAwKTsKKyAgICAgIGV4cGVjdChjbWFwLmxvb2t1cCgweDEyKSkudG9FcXVhbCgweDA1KTsKKyAgICAgIGV4cGVjdChjbWFwLmxvb2t1cCgweDEzKSkudG9CZVVuZGVmaW5lZCgpOworICAgICAgZG9uZSgpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGRvbmUuZmFpbChyZWFzb24pOworICAgIH0pOworICB9KTsKKyAgaXQoInBhcnNlcyBiZWdpbmNpZGNoYXIiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHZhciBzdHIgPSAiMSBiZWdpbmNpZGNoYXJcbiIgKyAiPDE0PiAwXG4iICsgImVuZGNpZGNoYXJcbiI7CisgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShzdHIpOworCisgICAgdmFyIGNtYXBQcm9taXNlID0gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgIGVuY29kaW5nOiBzdHJlYW0KKyAgICB9KTsKKworICAgIGNtYXBQcm9taXNlLnRoZW4oZnVuY3Rpb24gKGNtYXApIHsKKyAgICAgIGV4cGVjdChjbWFwLmxvb2t1cCgweDE0KSkudG9FcXVhbCgweDAwKTsKKyAgICAgIGV4cGVjdChjbWFwLmxvb2t1cCgweDE1KSkudG9CZVVuZGVmaW5lZCgpOworICAgICAgZG9uZSgpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGRvbmUuZmFpbChyZWFzb24pOworICAgIH0pOworICB9KTsKKyAgaXQoInBhcnNlcyBiZWdpbmNpZHJhbmdlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICB2YXIgc3RyID0gIjEgYmVnaW5jaWRyYW5nZVxuIiArICI8MDAxNj4gPDAwMUI+ICAgMFxuIiArICJlbmRjaWRyYW5nZVxuIjsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHN0cik7CisKKyAgICB2YXIgY21hcFByb21pc2UgPSBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgZW5jb2Rpbmc6IHN0cmVhbQorICAgIH0pOworCisgICAgY21hcFByb21pc2UudGhlbihmdW5jdGlvbiAoY21hcCkgeworICAgICAgZXhwZWN0KGNtYXAubG9va3VwKDB4MTUpKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgxNikpLnRvRXF1YWwoMHgwMCk7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgxYikpLnRvRXF1YWwoMHgwNSk7CisgICAgICBleHBlY3QoY21hcC5sb29rdXAoMHgxYykpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBkb25lLmZhaWwocmVhc29uKTsKKyAgICB9KTsKKyAgfSk7CisgIGl0KCJkZWNvZGVzIGNvZGVzcGFjZSByYW5nZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHZhciBzdHIgPSAiMSBiZWdpbmNvZGVzcGFjZXJhbmdlXG4iICsgIjwwMT4gPDAyPlxuIiArICI8MDAwMDAwMDM+IDwwMDAwMDAwND5cbiIgKyAiZW5kY29kZXNwYWNlcmFuZ2VcbiI7CisgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShzdHIpOworCisgICAgdmFyIGNtYXBQcm9taXNlID0gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgIGVuY29kaW5nOiBzdHJlYW0KKyAgICB9KTsKKworICAgIGNtYXBQcm9taXNlLnRoZW4oZnVuY3Rpb24gKGNtYXApIHsKKyAgICAgIHZhciBjID0ge307CisgICAgICBjbWFwLnJlYWRDaGFyQ29kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDEpLCAwLCBjKTsKKyAgICAgIGV4cGVjdChjLmNoYXJjb2RlKS50b0VxdWFsKDEpOworICAgICAgZXhwZWN0KGMubGVuZ3RoKS50b0VxdWFsKDEpOworICAgICAgY21hcC5yZWFkQ2hhckNvZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgwLCAwLCAwLCAzKSwgMCwgYyk7CisgICAgICBleHBlY3QoYy5jaGFyY29kZSkudG9FcXVhbCgzKTsKKyAgICAgIGV4cGVjdChjLmxlbmd0aCkudG9FcXVhbCg0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBkb25lLmZhaWwocmVhc29uKTsKKyAgICB9KTsKKyAgfSk7CisgIGl0KCJkZWNvZGVzIDQgYnl0ZSBjb2Rlc3BhY2UgcmFuZ2VzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICB2YXIgc3RyID0gIjEgYmVnaW5jb2Rlc3BhY2VyYW5nZVxuIiArICI8OEVBMUExQTE+IDw4RUExRkVGRT5cbiIgKyAiZW5kY29kZXNwYWNlcmFuZ2VcbiI7CisgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShzdHIpOworCisgICAgdmFyIGNtYXBQcm9taXNlID0gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgIGVuY29kaW5nOiBzdHJlYW0KKyAgICB9KTsKKworICAgIGNtYXBQcm9taXNlLnRoZW4oZnVuY3Rpb24gKGNtYXApIHsKKyAgICAgIHZhciBjID0ge307CisgICAgICBjbWFwLnJlYWRDaGFyQ29kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDB4OGUsIDB4YTEsIDB4YTEsIDB4YTEpLCAwLCBjKTsKKyAgICAgIGV4cGVjdChjLmNoYXJjb2RlKS50b0VxdWFsKDB4OGVhMWExYTEpOworICAgICAgZXhwZWN0KGMubGVuZ3RoKS50b0VxdWFsKDQpOworICAgICAgZG9uZSgpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGRvbmUuZmFpbChyZWFzb24pOworICAgIH0pOworICB9KTsKKyAgaXQoInJlYWQgdXNlY21hcCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgdmFyIHN0ciA9ICIvQWRvYmUtSmFwYW4xLTEgdXNlY21hcFxuIjsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHN0cik7CisKKyAgICB2YXIgY21hcFByb21pc2UgPSBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgZW5jb2Rpbmc6IHN0cmVhbSwKKyAgICAgIGZldGNoQnVpbHRJbkNNYXAsCisgICAgICB1c2VDTWFwOiBudWxsCisgICAgfSk7CisKKyAgICBjbWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICBleHBlY3QoY21hcCBpbnN0YW5jZW9mIF9jbWFwLkNNYXApLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoY21hcC51c2VDTWFwKS5ub3QudG9CZU51bGwoKTsKKyAgICAgIGV4cGVjdChjbWFwLmJ1aWx0SW5DTWFwKS50b0JlRmFsc3koKTsKKyAgICAgIGV4cGVjdChjbWFwLmxlbmd0aCkudG9FcXVhbCgweDIwYTcpOworICAgICAgZXhwZWN0KGNtYXAuaXNJZGVudGl0eUNNYXApLnRvRXF1YWwoZmFsc2UpOworICAgICAgZG9uZSgpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGRvbmUuZmFpbChyZWFzb24pOworICAgIH0pOworICB9KTsKKyAgaXQoInBhcnNlcyBjbWFwbmFtZSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgdmFyIHN0ciA9ICIvQ01hcE5hbWUgL0lkZW50aXR5LUggZGVmXG4iOworICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oc3RyKTsKKworICAgIHZhciBjbWFwUHJvbWlzZSA9IF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CisgICAgICBlbmNvZGluZzogc3RyZWFtCisgICAgfSk7CisKKyAgICBjbWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICBleHBlY3QoY21hcC5uYW1lKS50b0VxdWFsKCJJZGVudGl0eS1IIik7CisgICAgICBkb25lKCk7CisgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgZG9uZS5mYWlsKHJlYXNvbik7CisgICAgfSk7CisgIH0pOworICBpdCgicGFyc2VzIHdtb2RlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICB2YXIgc3RyID0gIi9XTW9kZSAxIGRlZlxuIjsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHN0cik7CisKKyAgICB2YXIgY21hcFByb21pc2UgPSBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgZW5jb2Rpbmc6IHN0cmVhbQorICAgIH0pOworCisgICAgY21hcFByb21pc2UudGhlbihmdW5jdGlvbiAoY21hcCkgeworICAgICAgZXhwZWN0KGNtYXAudmVydGljYWwpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBkb25lKCk7CisgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgZG9uZS5mYWlsKHJlYXNvbik7CisgICAgfSk7CisgIH0pOworICBpdCgibG9hZHMgYnVpbHQgaW4gY21hcCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgdmFyIGNtYXBQcm9taXNlID0gX2NtYXAuQ01hcEZhY3RvcnkuY3JlYXRlKHsKKyAgICAgIGVuY29kaW5nOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQWRvYmUtSmFwYW4xLTEiKSwKKyAgICAgIGZldGNoQnVpbHRJbkNNYXAsCisgICAgICB1c2VDTWFwOiBudWxsCisgICAgfSk7CisKKyAgICBjbWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICBleHBlY3QoY21hcCBpbnN0YW5jZW9mIF9jbWFwLkNNYXApLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoY21hcC51c2VDTWFwKS50b0JlTnVsbCgpOworICAgICAgZXhwZWN0KGNtYXAuYnVpbHRJbkNNYXApLnRvQmVUcnV0aHkoKTsKKyAgICAgIGV4cGVjdChjbWFwLmxlbmd0aCkudG9FcXVhbCgweDIwYTcpOworICAgICAgZXhwZWN0KGNtYXAuaXNJZGVudGl0eUNNYXApLnRvRXF1YWwoZmFsc2UpOworICAgICAgZG9uZSgpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGRvbmUuZmFpbChyZWFzb24pOworICAgIH0pOworICB9KTsKKyAgaXQoImxvYWRzIGJ1aWx0IGluIGlkZW50aXR5IGNtYXAiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHZhciBjbWFwUHJvbWlzZSA9IF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CisgICAgICBlbmNvZGluZzogX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIklkZW50aXR5LUgiKSwKKyAgICAgIGZldGNoQnVpbHRJbkNNYXAsCisgICAgICB1c2VDTWFwOiBudWxsCisgICAgfSk7CisKKyAgICBjbWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChjbWFwKSB7CisgICAgICBleHBlY3QoY21hcCBpbnN0YW5jZW9mIF9jbWFwLklkZW50aXR5Q01hcCkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChjbWFwLnZlcnRpY2FsKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdChjbWFwLmxlbmd0aCkudG9FcXVhbCgweDEwMDAwKTsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBjbWFwLmlzSWRlbnRpdHlDTWFwOworICAgICAgfSkudG9UaHJvdyhuZXcgRXJyb3IoInNob3VsZCBub3QgYWNjZXNzIC5pc0lkZW50aXR5Q01hcCIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBkb25lLmZhaWwocmVhc29uKTsKKyAgICB9KTsKKyAgfSk7CisgIGl0KCJhdHRlbXB0cyB0byBsb2FkIGEgbm9uLWV4aXN0ZW50IGJ1aWx0LWluIENNYXAiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHZhciBjbWFwUHJvbWlzZSA9IF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CisgICAgICBlbmNvZGluZzogX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIm51bGwiKSwKKyAgICAgIGZldGNoQnVpbHRJbkNNYXAsCisgICAgICB1c2VDTWFwOiBudWxsCisgICAgfSk7CisKKyAgICBjbWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGRvbmUuZmFpbCgiTm8gQ01hcCBzaG91bGQgYmUgbG9hZGVkIik7CisgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgZXhwZWN0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KHJlYXNvbi5tZXNzYWdlKS50b0VxdWFsKCJVbmtub3duIENNYXAgbmFtZTogbnVsbCIpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgaXQoImF0dGVtcHRzIHRvIGxvYWQgYSBidWlsdC1pbiBDTWFwIHdpdGhvdXQgdGhlIG5lY2Vzc2FyeSBBUEkgcGFyYW1ldGVycyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgZnVuY3Rpb24gdG1wRmV0Y2hCdWlsdEluQ01hcChuYW1lKSB7CisgICAgICB2YXIgQ01hcFJlYWRlckZhY3RvcnkgPSBfaXNfbm9kZS5pc05vZGVKUyA/IG5ldyBfbm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3Rvcnkoe30pIDogbmV3IF9kaXNwbGF5X3V0aWxzLkRPTUNNYXBSZWFkZXJGYWN0b3J5KHt9KTsKKyAgICAgIHJldHVybiBDTWFwUmVhZGVyRmFjdG9yeS5mZXRjaCh7CisgICAgICAgIG5hbWUKKyAgICAgIH0pOworICAgIH0KKworICAgIHZhciBjbWFwUHJvbWlzZSA9IF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CisgICAgICBlbmNvZGluZzogX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFkb2JlLUphcGFuMS0xIiksCisgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0bXBGZXRjaEJ1aWx0SW5DTWFwLAorICAgICAgdXNlQ01hcDogbnVsbAorICAgIH0pOworCisgICAgY21hcFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICBkb25lLmZhaWwoIk5vIENNYXAgc2hvdWxkIGJlIGxvYWRlZCIpOworICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGV4cGVjdChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChyZWFzb24ubWVzc2FnZSkudG9FcXVhbCgnVGhlIENNYXAgImJhc2VVcmwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgJyArICd0aGUgImNNYXBVcmwiIGFuZCAiY01hcFBhY2tlZCIgQVBJIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLicpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgaXQoImF0dGVtcHRzIHRvIGxvYWQgYSBidWlsdC1pbiBDTWFwIHdpdGggaW5jb25zaXN0ZW50IEFQSSBwYXJhbWV0ZXJzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICBmdW5jdGlvbiB0bXBGZXRjaEJ1aWx0SW5DTWFwKG5hbWUpIHsKKyAgICAgIGxldCBDTWFwUmVhZGVyRmFjdG9yeTsKKworICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgIENNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IF9ub2RlX3V0aWxzLk5vZGVDTWFwUmVhZGVyRmFjdG9yeSh7CisgICAgICAgICAgYmFzZVVybDogY01hcFVybC5ub2RlLAorICAgICAgICAgIGlzQ29tcHJlc3NlZDogZmFsc2UKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDTWFwUmVhZGVyRmFjdG9yeSA9IG5ldyBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeSh7CisgICAgICAgICAgYmFzZVVybDogY01hcFVybC5kb20sCisgICAgICAgICAgaXNDb21wcmVzc2VkOiBmYWxzZQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIENNYXBSZWFkZXJGYWN0b3J5LmZldGNoKHsKKyAgICAgICAgbmFtZQorICAgICAgfSk7CisgICAgfQorCisgICAgY29uc3QgY21hcFByb21pc2UgPSBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoeworICAgICAgZW5jb2Rpbmc6IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBZG9iZS1KYXBhbjEtMSIpLAorICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdG1wRmV0Y2hCdWlsdEluQ01hcCwKKyAgICAgIHVzZUNNYXA6IG51bGwKKyAgICB9KTsKKworICAgIGNtYXBQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgZG9uZS5mYWlsKCJObyBDTWFwIHNob3VsZCBiZSBsb2FkZWQiKTsKKyAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBleHBlY3QocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBjb25zdCBtZXNzYWdlID0gcmVhc29uLm1lc3NhZ2U7CisgICAgICBleHBlY3QobWVzc2FnZS5zdGFydHNXaXRoKCJVbmFibGUgdG8gbG9hZCBDTWFwIGF0OiAiKSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChtZXNzYWdlLmVuZHNXaXRoKCIvZXh0ZXJuYWwvYmNtYXBzL0Fkb2JlLUphcGFuMS0xIikpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9jb2xvcnNwYWNlX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2NvbG9yc3BhY2Vfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODdlNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9jb2xvcnNwYWNlX3NwZWMuanMKQEAgLTAsMCArMSw1MzQgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi4vLi4vY29yZS9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi4vLi4vY29yZS9zdHJlYW0uanMiKTsKKwordmFyIF9jb2xvcnNwYWNlID0gcmVxdWlyZSgiLi4vLi4vY29yZS9jb2xvcnNwYWNlLmpzIik7CisKK3ZhciBfaW1hZ2VfdXRpbHMgPSByZXF1aXJlKCIuLi8uLi9jb3JlL2ltYWdlX3V0aWxzLmpzIik7CisKK3ZhciBfZnVuY3Rpb24gPSByZXF1aXJlKCIuLi8uLi9jb3JlL2Z1bmN0aW9uLmpzIik7CisKK3ZhciBfdGVzdF91dGlscyA9IHJlcXVpcmUoIi4vdGVzdF91dGlscy5qcyIpOworCitkZXNjcmliZSgiY29sb3JzcGFjZSIsIGZ1bmN0aW9uICgpIHsKKyAgZGVzY3JpYmUoIkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgYmUgdHJ1ZSBpZiBkZWNvZGUgaXMgbm90IGFuIGFycmF5IiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKCJzdHJpbmciLCAwKSkudG9CZVRydXRoeSgpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgYmUgdHJ1ZSBpZiBsZW5ndGggb2YgZGVjb2RlIGFycmF5IGlzIG5vdCBjb3JyZWN0IiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKFswXSwgMSkpLnRvQmVUcnV0aHkoKTsKKyAgICAgIGV4cGVjdChfY29sb3JzcGFjZS5Db2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShbMCwgMSwgMF0sIDEpKS50b0JlVHJ1dGh5KCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBiZSB0cnVlIGlmIGRlY29kZSBtYXAgbWF0Y2hlcyB0aGUgZGVmYXVsdCBkZWNvZGUgbWFwIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKFtdLCAwKSkudG9CZVRydXRoeSgpOworICAgICAgZXhwZWN0KF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKFswLCAwXSwgMSkpLnRvQmVGYWxzeSgpOworICAgICAgZXhwZWN0KF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKFswLCAxXSwgMSkpLnRvQmVUcnV0aHkoKTsKKyAgICAgIGV4cGVjdChfY29sb3JzcGFjZS5Db2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShbMCwgMSwgMCwgMSwgMCwgMV0sIDMpKS50b0JlVHJ1dGh5KCk7CisgICAgICBleHBlY3QoX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUoWzAsIDEsIDAsIDEsIDEsIDFdLCAzKSkudG9CZUZhbHN5KCk7CisgICAgICBleHBlY3QoX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUoWzAsIDEsIDAsIDEsIDAsIDEsIDAsIDFdLCA0KSkudG9CZVRydXRoeSgpOworICAgICAgZXhwZWN0KF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKFsxLCAwLCAwLCAxLCAwLCAxLCAwLCAxXSwgNCkpLnRvQmVGYWxzeSgpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkNvbG9yU3BhY2UgY2FjaGluZyIsIGZ1bmN0aW9uICgpIHsKKyAgICBsZXQgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBudWxsOworICAgIGJlZm9yZUFsbChmdW5jdGlvbiAoZG9uZSkgeworICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsQ29sb3JTcGFjZUNhY2hlKCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlID0gbnVsbDsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBpdCgiY2FjaGluZyBieSBOYW1lIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jaygpOworICAgICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IF9mdW5jdGlvbi5QREZGdW5jdGlvbkZhY3RvcnkoeworICAgICAgICB4cmVmCisgICAgICB9KTsKKworICAgICAgY29uc3QgY29sb3JTcGFjZTEgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKKyAgICAgICAgY3M6IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJQYXR0ZXJuIiksCisgICAgICAgIHhyZWYsCisgICAgICAgIHJlc291cmNlczogbnVsbCwKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSk7CisKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlMS5uYW1lKS50b0VxdWFsKCJQYXR0ZXJuIik7CisKKyAgICAgIGNvbnN0IGNvbG9yU3BhY2UyID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiUGF0dGVybiIpLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXM6IG51bGwsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgIH0pOworCisgICAgICBleHBlY3QoY29sb3JTcGFjZTIubmFtZSkudG9FcXVhbCgiUGF0dGVybiIpOworCisgICAgICBjb25zdCBjb2xvclNwYWNlTm9uQ2FjaGVkID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiUGF0dGVybiIpLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXM6IG51bGwsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlTm9uQ2FjaGVkLm5hbWUpLnRvRXF1YWwoIlBhdHRlcm4iKTsKKworICAgICAgY29uc3QgY29sb3JTcGFjZU90aGVyID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiUkdCIiksCisgICAgICAgIHhyZWYsCisgICAgICAgIHJlc291cmNlczogbnVsbCwKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSk7CisKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlT3RoZXIubmFtZSkudG9FcXVhbCgiRGV2aWNlUkdCIik7CisgICAgICBleHBlY3QoY29sb3JTcGFjZTEpLnRvQmUoY29sb3JTcGFjZTIpOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UxKS5ub3QudG9CZShjb2xvclNwYWNlTm9uQ2FjaGVkKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlMSkubm90LnRvQmUoY29sb3JTcGFjZU90aGVyKTsKKyAgICB9KTsKKyAgICBpdCgiY2FjaGluZyBieSBSZWYiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBwYXJhbXNDYWxHcmF5ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHBhcmFtc0NhbEdyYXkuc2V0KCJXaGl0ZVBvaW50IiwgWzEsIDEsIDFdKTsKKyAgICAgIHBhcmFtc0NhbEdyYXkuc2V0KCJCbGFja1BvaW50IiwgWzAsIDAsIDBdKTsKKyAgICAgIHBhcmFtc0NhbEdyYXkuc2V0KCJHYW1tYSIsIDIuMCk7CisgICAgICBjb25zdCBwYXJhbXNDYWxSR0IgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgcGFyYW1zQ2FsUkdCLnNldCgiV2hpdGVQb2ludCIsIFsxLCAxLCAxXSk7CisgICAgICBwYXJhbXNDYWxSR0Iuc2V0KCJCbGFja1BvaW50IiwgWzAsIDAsIDBdKTsKKyAgICAgIHBhcmFtc0NhbFJHQi5zZXQoIkdhbW1hIiwgWzEsIDEsIDFdKTsKKyAgICAgIHBhcmFtc0NhbFJHQi5zZXQoIk1hdHJpeCIsIFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXSk7CisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogX3ByaW1pdGl2ZXMuUmVmLmdldCg1MCwgMCksCisgICAgICAgIGRhdGE6IFtfcHJpbWl0aXZlcy5OYW1lLmdldCgiQ2FsR3JheSIpLCBwYXJhbXNDYWxHcmF5XQorICAgICAgfSwgeworICAgICAgICByZWY6IF9wcmltaXRpdmVzLlJlZi5nZXQoMTAwLCAwKSwKKyAgICAgICAgZGF0YTogW19wcmltaXRpdmVzLk5hbWUuZ2V0KCJDYWxSR0IiKSwgcGFyYW1zQ2FsUkdCXQorICAgICAgfV0pOworICAgICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IF9mdW5jdGlvbi5QREZGdW5jdGlvbkZhY3RvcnkoeworICAgICAgICB4cmVmCisgICAgICB9KTsKKworICAgICAgY29uc3QgY29sb3JTcGFjZTEgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKKyAgICAgICAgY3M6IF9wcmltaXRpdmVzLlJlZi5nZXQoNTAsIDApLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXM6IG51bGwsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKKyAgICAgIH0pOworCisgICAgICBleHBlY3QoY29sb3JTcGFjZTEubmFtZSkudG9FcXVhbCgiQ2FsR3JheSIpOworCisgICAgICBjb25zdCBjb2xvclNwYWNlMiA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2UoeworICAgICAgICBjczogX3ByaW1pdGl2ZXMuUmVmLmdldCg1MCwgMCksCisgICAgICAgIHhyZWYsCisgICAgICAgIHJlc291cmNlczogbnVsbCwKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSk7CisKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlMi5uYW1lKS50b0VxdWFsKCJDYWxHcmF5Iik7CisKKyAgICAgIGNvbnN0IGNvbG9yU3BhY2VOb25DYWNoZWQgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKKyAgICAgICAgY3M6IF9wcmltaXRpdmVzLlJlZi5nZXQoNTAsIDApLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXM6IG51bGwsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlTm9uQ2FjaGVkLm5hbWUpLnRvRXF1YWwoIkNhbEdyYXkiKTsKKworICAgICAgY29uc3QgY29sb3JTcGFjZU90aGVyID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzOiBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEwMCwgMCksCisgICAgICAgIHhyZWYsCisgICAgICAgIHJlc291cmNlczogbnVsbCwKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQorICAgICAgfSk7CisKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlT3RoZXIubmFtZSkudG9FcXVhbCgiQ2FsUkdCIik7CisgICAgICBleHBlY3QoY29sb3JTcGFjZTEpLnRvQmUoY29sb3JTcGFjZTIpOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UxKS5ub3QudG9CZShjb2xvclNwYWNlTm9uQ2FjaGVkKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlMSkubm90LnRvQmUoY29sb3JTcGFjZU90aGVyKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJEZXZpY2VHcmF5Q1MiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBjcyBpcyBhIE5hbWUgb2JqZWN0IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgY3MgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRGV2aWNlR3JheSIpOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCksCisgICAgICAgIGRhdGE6IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCkKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBuZXcgX2Z1bmN0aW9uLlBERkZ1bmN0aW9uRmFjdG9yeSh7CisgICAgICAgIHhyZWYKKyAgICAgIH0pOworCisgICAgICBjb25zdCBjb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IHRlc3RTcmMgPSBuZXcgVWludDhBcnJheShbMjcsIDEyNSwgMjUwLCAxMzFdKTsKKyAgICAgIGNvbnN0IHRlc3REZXN0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDQgKiA0ICogMyk7CisgICAgICBjb25zdCBleHBlY3RlZERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoWzI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDEyNSwgMTI1LCAxMjUsIDEyNSwgMTI1LCAxMjUsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDEyNSwgMTI1LCAxMjUsIDEyNSwgMTI1LCAxMjUsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTAsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTAsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMxLCAxMzFdKTsKKyAgICAgIGNvbG9yU3BhY2UuZmlsbFJnYih0ZXN0RGVzdCwgMiwgMiwgNCwgNCwgNCwgOCwgdGVzdFNyYywgMCk7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5nZXRSZ2IobmV3IEZsb2F0MzJBcnJheShbMC4xXSksIDApKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMjYsIDI2LCAyNl0pKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCgyLCAwKSkudG9FcXVhbCg2KTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmlzUGFzc3Rocm91Z2goOCkpLnRvQmVGYWxzeSgpOworICAgICAgZXhwZWN0KHRlc3REZXN0KS50b0VxdWFsKGV4cGVjdGVkRGVzdCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBjcyBpcyBhbiBpbmRpcmVjdCBvYmplY3QiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBjcyA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTAsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogY3MsCisgICAgICAgIGRhdGE6IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJEZXZpY2VHcmF5IikKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBuZXcgX2Z1bmN0aW9uLlBERkZ1bmN0aW9uRmFjdG9yeSh7CisgICAgICAgIHhyZWYKKyAgICAgIH0pOworCisgICAgICBjb25zdCBjb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IHRlc3RTcmMgPSBuZXcgVWludDhBcnJheShbMjcsIDEyNSwgMjUwLCAxMzFdKTsKKyAgICAgIGNvbnN0IHRlc3REZXN0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMgKiAzICogMyk7CisgICAgICBjb25zdCBleHBlY3RlZERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoWzI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDEyNSwgMTI1LCAxMjUsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDEyNSwgMTI1LCAxMjUsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTAsIDEzMSwgMTMxLCAxMzFdKTsKKyAgICAgIGNvbG9yU3BhY2UuZmlsbFJnYih0ZXN0RGVzdCwgMiwgMiwgMywgMywgMywgOCwgdGVzdFNyYywgMCk7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5nZXRSZ2IobmV3IEZsb2F0MzJBcnJheShbMC4yXSksIDApKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbNTEsIDUxLCA1MV0pKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCgzLCAxKSkudG9FcXVhbCgxMik7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5pc1Bhc3N0aHJvdWdoKDgpKS50b0JlRmFsc3koKTsKKyAgICAgIGV4cGVjdCh0ZXN0RGVzdCkudG9FcXVhbChleHBlY3RlZERlc3QpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkRldmljZVJnYkNTIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gY3MgaXMgYSBOYW1lIG9iamVjdCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGNzID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkRldmljZVJHQiIpOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCksCisgICAgICAgIGRhdGE6IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCkKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBuZXcgX2Z1bmN0aW9uLlBERkZ1bmN0aW9uRmFjdG9yeSh7CisgICAgICAgIHhyZWYKKyAgICAgIH0pOworCisgICAgICBjb25zdCBjb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IHRlc3RTcmMgPSBuZXcgVWludDhBcnJheShbMjcsIDEyNSwgMjUwLCAxMzEsIDEzOSwgMTQwLCAxMTEsIDI1LCAxOTgsIDIxLCAxNDcsIDI1NV0pOworICAgICAgY29uc3QgdGVzdERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoNCAqIDQgKiAzKTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkRGVzdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShbMjcsIDEyNSwgMjUwLCAyNywgMTI1LCAyNTAsIDEzMSwgMTM5LCAxNDAsIDEzMSwgMTM5LCAxNDAsIDI3LCAxMjUsIDI1MCwgMjcsIDEyNSwgMjUwLCAxMzEsIDEzOSwgMTQwLCAxMzEsIDEzOSwgMTQwLCAxMTEsIDI1LCAxOTgsIDExMSwgMjUsIDE5OCwgMjEsIDE0NywgMjU1LCAyMSwgMTQ3LCAyNTUsIDExMSwgMjUsIDE5OCwgMTExLCAyNSwgMTk4LCAyMSwgMTQ3LCAyNTUsIDIxLCAxNDcsIDI1NV0pOworICAgICAgY29sb3JTcGFjZS5maWxsUmdiKHRlc3REZXN0LCAyLCAyLCA0LCA0LCA0LCA4LCB0ZXN0U3JjLCAwKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldFJnYihuZXcgRmxvYXQzMkFycmF5KFswLjEsIDAuMiwgMC4zXSksIDApKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMjYsIDUxLCA3N10pKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCg0LCAwKSkudG9FcXVhbCg0KTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmlzUGFzc3Rocm91Z2goOCkpLnRvQmVUcnV0aHkoKTsKKyAgICAgIGV4cGVjdCh0ZXN0RGVzdCkudG9FcXVhbChleHBlY3RlZERlc3QpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gY3MgaXMgYW4gaW5kaXJlY3Qgb2JqZWN0IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgY3MgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEwLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGNzLAorICAgICAgICBkYXRhOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRGV2aWNlUkdCIikKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBuZXcgX2Z1bmN0aW9uLlBERkZ1bmN0aW9uRmFjdG9yeSh7CisgICAgICAgIHhyZWYKKyAgICAgIH0pOworCisgICAgICBjb25zdCBjb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IHRlc3RTcmMgPSBuZXcgVWludDhBcnJheShbMjcsIDEyNSwgMjUwLCAxMzEsIDEzOSwgMTQwLCAxMTEsIDI1LCAxOTgsIDIxLCAxNDcsIDI1NV0pOworICAgICAgY29uc3QgdGVzdERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyAqIDMgKiAzKTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkRGVzdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShbMjcsIDEyNSwgMjUwLCAyNywgMTI1LCAyNTAsIDEzMSwgMTM5LCAxNDAsIDI3LCAxMjUsIDI1MCwgMjcsIDEyNSwgMjUwLCAxMzEsIDEzOSwgMTQwLCAxMTEsIDI1LCAxOTgsIDExMSwgMjUsIDE5OCwgMjEsIDE0NywgMjU1XSk7CisgICAgICBjb2xvclNwYWNlLmZpbGxSZ2IodGVzdERlc3QsIDIsIDIsIDMsIDMsIDMsIDgsIHRlc3RTcmMsIDApOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UuZ2V0UmdiKG5ldyBGbG9hdDMyQXJyYXkoWzAuMSwgMC4yLCAwLjNdKSwgMCkpLnRvRXF1YWwobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFsyNiwgNTEsIDc3XSkpOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UuZ2V0T3V0cHV0TGVuZ3RoKDQsIDEpKS50b0VxdWFsKDUpOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UuaXNQYXNzdGhyb3VnaCg4KSkudG9CZVRydXRoeSgpOworICAgICAgZXhwZWN0KHRlc3REZXN0KS50b0VxdWFsKGV4cGVjdGVkRGVzdCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiRGV2aWNlQ215a0NTIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gY3MgaXMgYSBOYW1lIG9iamVjdCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGNzID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkRldmljZUNNWUsiKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IF9wcmltaXRpdmVzLlJlZi5nZXQoMTAsIDApLAorICAgICAgICBkYXRhOiBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpCisgICAgICB9XSk7CisgICAgICBjb25zdCByZXNvdXJjZXMgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IF9mdW5jdGlvbi5QREZGdW5jdGlvbkZhY3RvcnkoeworICAgICAgICB4cmVmCisgICAgICB9KTsKKworICAgICAgY29uc3QgY29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2UoeworICAgICAgICBjcywKKyAgICAgICAgeHJlZiwKKyAgICAgICAgcmVzb3VyY2VzLAorICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsQ29sb3JTcGFjZUNhY2hlKCkKKyAgICAgIH0pOworCisgICAgICBjb25zdCB0ZXN0U3JjID0gbmV3IFVpbnQ4QXJyYXkoWzI3LCAxMjUsIDI1MCwgMTI4LCAxMzEsIDEzOSwgMTQwLCA0NSwgMTExLCAyNSwgMTk4LCA3OCwgMjEsIDE0NywgMjU1LCA2OV0pOworICAgICAgY29uc3QgdGVzdERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoNCAqIDQgKiAzKTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkRGVzdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShbMTM1LCA4MSwgMTgsIDEzNSwgODEsIDE4LCAxMTQsIDEwMiwgOTcsIDExNCwgMTAyLCA5NywgMTM1LCA4MSwgMTgsIDEzNSwgODEsIDE4LCAxMTQsIDEwMiwgOTcsIDExNCwgMTAyLCA5NywgMTEyLCAxNDQsIDc1LCAxMTIsIDE0NCwgNzUsIDE4OCwgOTgsIDI3LCAxODgsIDk4LCAyNywgMTEyLCAxNDQsIDc1LCAxMTIsIDE0NCwgNzUsIDE4OCwgOTgsIDI3LCAxODgsIDk4LCAyN10pOworICAgICAgY29sb3JTcGFjZS5maWxsUmdiKHRlc3REZXN0LCAyLCAyLCA0LCA0LCA0LCA4LCB0ZXN0U3JjLCAwKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldFJnYihuZXcgRmxvYXQzMkFycmF5KFswLjEsIDAuMiwgMC4zLCAxXSksIDApKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMzIsIDI4LCAyMV0pKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCg0LCAwKSkudG9FcXVhbCgzKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmlzUGFzc3Rocm91Z2goOCkpLnRvQmVGYWxzeSgpOworICAgICAgZXhwZWN0KHRlc3REZXN0KS50b0VxdWFsKGV4cGVjdGVkRGVzdCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBjcyBpcyBhbiBpbmRpcmVjdCBvYmplY3QiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBjcyA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTAsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogY3MsCisgICAgICAgIGRhdGE6IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJEZXZpY2VDTVlLIikKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBuZXcgX2Z1bmN0aW9uLlBERkZ1bmN0aW9uRmFjdG9yeSh7CisgICAgICAgIHhyZWYKKyAgICAgIH0pOworCisgICAgICBjb25zdCBjb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IHRlc3RTcmMgPSBuZXcgVWludDhBcnJheShbMjcsIDEyNSwgMjUwLCAxMjgsIDEzMSwgMTM5LCAxNDAsIDQ1LCAxMTEsIDI1LCAxOTgsIDc4LCAyMSwgMTQ3LCAyNTUsIDY5XSk7CisgICAgICBjb25zdCB0ZXN0RGVzdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzICogMyAqIDMpOworICAgICAgY29uc3QgZXhwZWN0ZWREZXN0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFsxMzUsIDgxLCAxOCwgMTM1LCA4MSwgMTgsIDExNCwgMTAyLCA5NywgMTM1LCA4MSwgMTgsIDEzNSwgODEsIDE4LCAxMTQsIDEwMiwgOTcsIDExMiwgMTQ0LCA3NSwgMTEyLCAxNDQsIDc1LCAxODgsIDk4LCAyN10pOworICAgICAgY29sb3JTcGFjZS5maWxsUmdiKHRlc3REZXN0LCAyLCAyLCAzLCAzLCAzLCA4LCB0ZXN0U3JjLCAwKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldFJnYihuZXcgRmxvYXQzMkFycmF5KFswLjEsIDAuMiwgMC4zLCAxXSksIDApKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMzIsIDI4LCAyMV0pKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCg0LCAxKSkudG9FcXVhbCg0KTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmlzUGFzc3Rocm91Z2goOCkpLnRvQmVGYWxzeSgpOworICAgICAgZXhwZWN0KHRlc3REZXN0KS50b0VxdWFsKGV4cGVjdGVkRGVzdCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiQ2FsR3JheUNTIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gY3MgaXMgYW4gYXJyYXkiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgcGFyYW1zLnNldCgiV2hpdGVQb2ludCIsIFsxLCAxLCAxXSk7CisgICAgICBwYXJhbXMuc2V0KCJCbGFja1BvaW50IiwgWzAsIDAsIDBdKTsKKyAgICAgIHBhcmFtcy5zZXQoIkdhbW1hIiwgMi4wKTsKKyAgICAgIGNvbnN0IGNzID0gW19wcmltaXRpdmVzLk5hbWUuZ2V0KCJDYWxHcmF5IiksIHBhcmFtc107CisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCksCisgICAgICAgIGRhdGE6IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCkKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBuZXcgX2Z1bmN0aW9uLlBERkZ1bmN0aW9uRmFjdG9yeSh7CisgICAgICAgIHhyZWYKKyAgICAgIH0pOworCisgICAgICBjb25zdCBjb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IHRlc3RTcmMgPSBuZXcgVWludDhBcnJheShbMjcsIDEyNSwgMjUwLCAxMzFdKTsKKyAgICAgIGNvbnN0IHRlc3REZXN0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDQgKiA0ICogMyk7CisgICAgICBjb25zdCBleHBlY3RlZERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoWzI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDE0MywgMTQzLCAxNDMsIDE0MywgMTQzLCAxNDMsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDE0MywgMTQzLCAxNDMsIDE0MywgMTQzLCAxNDMsIDI1MSwgMjUxLCAyNTEsIDI1MSwgMjUxLCAyNTEsIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDI1MSwgMjUxLCAyNTEsIDI1MSwgMjUxLCAyNTEsIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDldKTsKKyAgICAgIGNvbG9yU3BhY2UuZmlsbFJnYih0ZXN0RGVzdCwgMiwgMiwgNCwgNCwgNCwgOCwgdGVzdFNyYywgMCk7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5nZXRSZ2IobmV3IEZsb2F0MzJBcnJheShbMS4wXSksIDApKS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMjU1LCAyNTUsIDI1NV0pKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCg0LCAwKSkudG9FcXVhbCgxMik7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5pc1Bhc3N0aHJvdWdoKDgpKS50b0JlRmFsc3koKTsKKyAgICAgIGV4cGVjdCh0ZXN0RGVzdCkudG9FcXVhbChleHBlY3RlZERlc3QpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkNhbFJHQkNTIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gY3MgaXMgYW4gYXJyYXkiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgcGFyYW1zLnNldCgiV2hpdGVQb2ludCIsIFsxLCAxLCAxXSk7CisgICAgICBwYXJhbXMuc2V0KCJCbGFja1BvaW50IiwgWzAsIDAsIDBdKTsKKyAgICAgIHBhcmFtcy5zZXQoIkdhbW1hIiwgWzEsIDEsIDFdKTsKKyAgICAgIHBhcmFtcy5zZXQoIk1hdHJpeCIsIFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXSk7CisgICAgICBjb25zdCBjcyA9IFtfcHJpbWl0aXZlcy5OYW1lLmdldCgiQ2FsUkdCIiksIHBhcmFtc107CisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCksCisgICAgICAgIGRhdGE6IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCkKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBjb25zdCBwZGZGdW5jdGlvbkZhY3RvcnkgPSBuZXcgX2Z1bmN0aW9uLlBERkZ1bmN0aW9uRmFjdG9yeSh7CisgICAgICAgIHhyZWYKKyAgICAgIH0pOworCisgICAgICBjb25zdCBjb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CisgICAgICAgIGNzLAorICAgICAgICB4cmVmLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKKyAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGU6IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IHRlc3RTcmMgPSBuZXcgVWludDhBcnJheShbMjcsIDEyNSwgMjUwLCAxMzEsIDEzOSwgMTQwLCAxMTEsIDI1LCAxOTgsIDIxLCAxNDcsIDI1NV0pOworICAgICAgY29uc3QgdGVzdERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyAqIDMgKiAzKTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkRGVzdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShbMCwgMjM4LCAyNTUsIDAsIDIzOCwgMjU1LCAxODUsIDE5NiwgMTk1LCAwLCAyMzgsIDI1NSwgMCwgMjM4LCAyNTUsIDE4NSwgMTk2LCAxOTUsIDIzNSwgMCwgMjQzLCAyMzUsIDAsIDI0MywgMCwgMjU1LCAyNTVdKTsKKyAgICAgIGNvbG9yU3BhY2UuZmlsbFJnYih0ZXN0RGVzdCwgMiwgMiwgMywgMywgMywgOCwgdGVzdFNyYywgMCk7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5nZXRSZ2IobmV3IEZsb2F0MzJBcnJheShbMC4xLCAwLjIsIDAuM10pLCAwKSkudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzAsIDE0NywgMTUxXSkpOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UuZ2V0T3V0cHV0TGVuZ3RoKDQsIDApKS50b0VxdWFsKDQpOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UuaXNQYXNzdGhyb3VnaCg4KSkudG9CZUZhbHN5KCk7CisgICAgICBleHBlY3QodGVzdERlc3QpLnRvRXF1YWwoZXhwZWN0ZWREZXN0KTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJMYWJDUyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSB0aGUgY2FzZSB3aGVuIGNzIGlzIGFuIGFycmF5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgcGFyYW1zID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHBhcmFtcy5zZXQoIldoaXRlUG9pbnQiLCBbMSwgMSwgMV0pOworICAgICAgcGFyYW1zLnNldCgiQmxhY2tQb2ludCIsIFswLCAwLCAwXSk7CisgICAgICBwYXJhbXMuc2V0KCJSYW5nZSIsIFstMTAwLCAxMDAsIC0xMDAsIDEwMF0pOworICAgICAgY29uc3QgY3MgPSBbX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkxhYiIpLCBwYXJhbXNdOworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IF9wcmltaXRpdmVzLlJlZi5nZXQoMTAsIDApLAorICAgICAgICBkYXRhOiBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpCisgICAgICB9XSk7CisgICAgICBjb25zdCByZXNvdXJjZXMgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IF9mdW5jdGlvbi5QREZGdW5jdGlvbkZhY3RvcnkoeworICAgICAgICB4cmVmCisgICAgICB9KTsKKworICAgICAgY29uc3QgY29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2UoeworICAgICAgICBjcywKKyAgICAgICAgeHJlZiwKKyAgICAgICAgcmVzb3VyY2VzLAorICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCisgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsQ29sb3JTcGFjZUNhY2hlKCkKKyAgICAgIH0pOworCisgICAgICBjb25zdCB0ZXN0U3JjID0gbmV3IFVpbnQ4QXJyYXkoWzI3LCAyNSwgNTAsIDMxLCAxOSwgNDAsIDExLCAyNSwgOTgsIDIxLCA0NywgNTVdKTsKKyAgICAgIGNvbnN0IHRlc3REZXN0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMgKiAzICogMyk7CisgICAgICBjb25zdCBleHBlY3RlZERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoWzAsIDQ5LCAxMDEsIDAsIDQ5LCAxMDEsIDAsIDUzLCAxMTcsIDAsIDQ5LCAxMDEsIDAsIDQ5LCAxMDEsIDAsIDUzLCAxMTcsIDAsIDQxLCA0MCwgMCwgNDEsIDQwLCAwLCA0MywgOTBdKTsKKyAgICAgIGNvbG9yU3BhY2UuZmlsbFJnYih0ZXN0RGVzdCwgMiwgMiwgMywgMywgMywgOCwgdGVzdFNyYywgMCk7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5nZXRSZ2IoWzU1LCAyNSwgMzVdLCAwKSkudG9FcXVhbChuZXcgVWludDhDbGFtcGVkQXJyYXkoWzE4OCwgMTAwLCA2MV0pKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCg0LCAwKSkudG9FcXVhbCg0KTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmlzUGFzc3Rocm91Z2goOCkpLnRvQmVGYWxzeSgpOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKFswLCAxXSkpLnRvQmVUcnV0aHkoKTsKKyAgICAgIGV4cGVjdCh0ZXN0RGVzdCkudG9FcXVhbChleHBlY3RlZERlc3QpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkluZGV4ZWRDUyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSB0aGUgY2FzZSB3aGVuIGNzIGlzIGFuIGFycmF5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgbG9va3VwID0gbmV3IF9zdHJlYW0uU3RyZWFtKG5ldyBVaW50OEFycmF5KFsyMywgMTU1LCAzNSwgMTQ3LCA2OSwgOTMsIDI1NSwgMTA5LCA3MF0pKTsKKyAgICAgIGNvbnN0IGNzID0gW19wcmltaXRpdmVzLk5hbWUuZ2V0KCJJbmRleGVkIiksIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJEZXZpY2VSR0IiKSwgMiwgbG9va3VwXTsKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEwLCAwKSwKKyAgICAgICAgZGF0YTogbmV3IF9wcmltaXRpdmVzLkRpY3QoKQorICAgICAgfV0pOworICAgICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IHBkZkZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBfZnVuY3Rpb24uUERGRnVuY3Rpb25GYWN0b3J5KHsKKyAgICAgICAgeHJlZgorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IGNvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKKyAgICAgICAgY3MsCisgICAgICAgIHhyZWYsCisgICAgICAgIHJlc291cmNlcywKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogbmV3IF9pbWFnZV91dGlscy5Mb2NhbENvbG9yU3BhY2VDYWNoZSgpCisgICAgICB9KTsKKworICAgICAgY29uc3QgdGVzdFNyYyA9IG5ldyBVaW50OEFycmF5KFsyLCAyLCAwLCAxXSk7CisgICAgICBjb25zdCB0ZXN0RGVzdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzICogMyAqIDMpOworICAgICAgY29uc3QgZXhwZWN0ZWREZXN0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFsyNTUsIDEwOSwgNzAsIDI1NSwgMTA5LCA3MCwgMjU1LCAxMDksIDcwLCAyNTUsIDEwOSwgNzAsIDI1NSwgMTA5LCA3MCwgMjU1LCAxMDksIDcwLCAyMywgMTU1LCAzNSwgMjMsIDE1NSwgMzUsIDE0NywgNjksIDkzXSk7CisgICAgICBjb2xvclNwYWNlLmZpbGxSZ2IodGVzdERlc3QsIDIsIDIsIDMsIDMsIDMsIDgsIHRlc3RTcmMsIDApOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UuZ2V0UmdiKFsyXSwgMCkpLnRvRXF1YWwobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFsyNTUsIDEwOSwgNzBdKSk7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5pc1Bhc3N0aHJvdWdoKDgpKS50b0JlRmFsc3koKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShbMCwgMV0sIDEpKS50b0JlVHJ1dGh5KCk7CisgICAgICBleHBlY3QodGVzdERlc3QpLnRvRXF1YWwoZXhwZWN0ZWREZXN0KTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJBbHRlcm5hdGVDUyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSB0aGUgY2FzZSB3aGVuIGNzIGlzIGFuIGFycmF5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgZm5EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGZuRGljdC5zZXQoIkZ1bmN0aW9uVHlwZSIsIDQpOworICAgICAgZm5EaWN0LnNldCgiRG9tYWluIiwgWzAuMCwgMS4wXSk7CisgICAgICBmbkRpY3Quc2V0KCJSYW5nZSIsIFswLjAsIDEuMCwgMC4wLCAxLjAsIDAuMCwgMS4wLCAwLjAsIDEuMF0pOworICAgICAgZm5EaWN0LnNldCgiTGVuZ3RoIiwgNTgpOworICAgICAgbGV0IGZuID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCJ7IGR1cCAwLjg0IG11bCAiICsgImV4Y2ggMC4wMCBleGNoICIgKyAiZHVwIDAuNDQgbXVsICIgKyAiZXhjaCAwLjIxIG11bCB9Iik7CisgICAgICBmbiA9IG5ldyBfc3RyZWFtLlN0cmVhbShmbi5ieXRlcywgMCwgNTgsIGZuRGljdCk7CisKKyAgICAgIGNvbnN0IGZuUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCk7CisKKyAgICAgIGNvbnN0IGNzID0gW19wcmltaXRpdmVzLk5hbWUuZ2V0KCJTZXBhcmF0aW9uIiksIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJMb2dvR3JlZW4iKSwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkRldmljZUNNWUsiKSwgZm5SZWZdOworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IGZuUmVmLAorICAgICAgICBkYXRhOiBmbgorICAgICAgfV0pOworICAgICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGNvbnN0IHBkZkZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBfZnVuY3Rpb24uUERGRnVuY3Rpb25GYWN0b3J5KHsKKyAgICAgICAgeHJlZgorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IGNvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKKyAgICAgICAgY3MsCisgICAgICAgIHhyZWYsCisgICAgICAgIHJlc291cmNlcywKKyAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAorICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogbmV3IF9pbWFnZV91dGlscy5Mb2NhbENvbG9yU3BhY2VDYWNoZSgpCisgICAgICB9KTsKKworICAgICAgY29uc3QgdGVzdFNyYyA9IG5ldyBVaW50OEFycmF5KFsyNywgMjUsIDUwLCAzMV0pOworICAgICAgY29uc3QgdGVzdERlc3QgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyAqIDMgKiAzKTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkRGVzdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShbMjI2LCAyNDIsIDI0MSwgMjI2LCAyNDIsIDI0MSwgMjI5LCAyNDQsIDI0MiwgMjI2LCAyNDIsIDI0MSwgMjI2LCAyNDIsIDI0MSwgMjI5LCAyNDQsIDI0MiwgMjAzLCAyMzIsIDIyOSwgMjAzLCAyMzIsIDIyOSwgMjIyLCAyNDEsIDIzOF0pOworICAgICAgY29sb3JTcGFjZS5maWxsUmdiKHRlc3REZXN0LCAyLCAyLCAzLCAzLCAzLCA4LCB0ZXN0U3JjLCAwKTsKKyAgICAgIGV4cGVjdChjb2xvclNwYWNlLmdldFJnYihbMC4xXSwgMCkpLnRvRXF1YWwobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFsyMjgsIDI0MywgMjQyXSkpOworICAgICAgZXhwZWN0KGNvbG9yU3BhY2UuaXNQYXNzdGhyb3VnaCg4KSkudG9CZUZhbHN5KCk7CisgICAgICBleHBlY3QoY29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUoWzAsIDFdKSkudG9CZVRydXRoeSgpOworICAgICAgZXhwZWN0KHRlc3REZXN0KS50b0VxdWFsKGV4cGVjdGVkRGVzdCk7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9jb3JlX3V0aWxzX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2NvcmVfdXRpbHNfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRmYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9jb3JlX3V0aWxzX3NwZWMuanMKQEAgLTAsMCArMSwyMTEgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi4vLi4vY29yZS9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfY29yZV91dGlscyA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvY29yZV91dGlscy5qcyIpOworCit2YXIgX3Rlc3RfdXRpbHMgPSByZXF1aXJlKCIuL3Rlc3RfdXRpbHMuanMiKTsKKworZGVzY3JpYmUoImNvcmVfdXRpbHMiLCBmdW5jdGlvbiAoKSB7CisgIGRlc2NyaWJlKCJnZXRJbmhlcml0YWJsZVByb3BlcnR5IiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIG5vbi1kaWN0aW9uYXJ5IGFyZ3VtZW50cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgICBkaWN0OiBudWxsLAorICAgICAgICBrZXk6ICJmb28iCisgICAgICB9KSkudG9FcXVhbCh1bmRlZmluZWQpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICAgIGRpY3Q6IHVuZGVmaW5lZCwKKyAgICAgICAga2V5OiAiZm9vIgorICAgICAgfSkpLnRvRXF1YWwodW5kZWZpbmVkKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBkaWN0aW9uYXJpZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgcHJvcGVydHkiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBlbXB0eURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICAgIGRpY3Q6IGVtcHR5RGljdCwKKyAgICAgICAga2V5OiAiZm9vIgorICAgICAgfSkpLnRvRXF1YWwodW5kZWZpbmVkKTsKKyAgICAgIGNvbnN0IGZpbGxlZERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZmlsbGVkRGljdC5zZXQoImJhciIsICJiYXoiKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgICBkaWN0OiBmaWxsZWREaWN0LAorICAgICAgICBrZXk6ICJmb28iCisgICAgICB9KSkudG9FcXVhbCh1bmRlZmluZWQpOworICAgIH0pOworICAgIGl0KCJmZXRjaGVzIHRoZSBwcm9wZXJ0eSBpZiBpdCBpcyBub3QgaW5oZXJpdGVkIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgcmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmLAorICAgICAgICBkYXRhOiAicXV1eCIKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKKyAgICAgIGRpY3Quc2V0KCJmb28iLCAiYmFyIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgICAgZGljdCwKKyAgICAgICAga2V5OiAiZm9vIgorICAgICAgfSkpLnRvRXF1YWwoImJhciIpOworICAgICAgZGljdC5zZXQoImJheiIsIFsicXV4IiwgcmVmXSk7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgICAgZGljdCwKKyAgICAgICAga2V5OiAiYmF6IiwKKyAgICAgICAgZ2V0QXJyYXk6IHRydWUKKyAgICAgIH0pKS50b0VxdWFsKFsicXV4IiwgInF1dXgiXSk7CisgICAgfSk7CisgICAgaXQoImZldGNoZXMgdGhlIHByb3BlcnR5IGlmIGl0IGlzIGluaGVyaXRlZCBhbmQgcHJlc2VudCBvbiBvbmUgbGV2ZWwiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCByZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEwLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWYsCisgICAgICAgIGRhdGE6ICJxdXV4IgorICAgICAgfV0pOworICAgICAgY29uc3QgZmlyc3REaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CisgICAgICBjb25zdCBzZWNvbmREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CisgICAgICBmaXJzdERpY3Quc2V0KCJQYXJlbnQiLCBzZWNvbmREaWN0KTsKKyAgICAgIHNlY29uZERpY3Quc2V0KCJmb28iLCAiYmFyIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgICAgZGljdDogZmlyc3REaWN0LAorICAgICAgICBrZXk6ICJmb28iCisgICAgICB9KSkudG9FcXVhbCgiYmFyIik7CisgICAgICBzZWNvbmREaWN0LnNldCgiYmF6IiwgWyJxdXgiLCByZWZdKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgICBkaWN0OiBmaXJzdERpY3QsCisgICAgICAgIGtleTogImJheiIsCisgICAgICAgIGdldEFycmF5OiB0cnVlCisgICAgICB9KSkudG9FcXVhbChbInF1eCIsICJxdXV4Il0pOworICAgIH0pOworICAgIGl0KCJmZXRjaGVzIHRoZSBwcm9wZXJ0eSBpZiBpdCBpcyBpbmhlcml0ZWQgYW5kIHByZXNlbnQgb24gbXVsdGlwbGUgbGV2ZWxzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgcmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCk7CisKKyAgICAgIGNvbnN0IHhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmLAorICAgICAgICBkYXRhOiAicXV1eCIKKyAgICAgIH1dKTsKKyAgICAgIGNvbnN0IGZpcnN0RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOworICAgICAgY29uc3Qgc2Vjb25kRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOworICAgICAgZmlyc3REaWN0LnNldCgiUGFyZW50Iiwgc2Vjb25kRGljdCk7CisgICAgICBmaXJzdERpY3Quc2V0KCJmb28iLCAiYmFyMSIpOworICAgICAgc2Vjb25kRGljdC5zZXQoImZvbyIsICJiYXIyIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKKyAgICAgICAgZGljdDogZmlyc3REaWN0LAorICAgICAgICBrZXk6ICJmb28iCisgICAgICB9KSkudG9FcXVhbCgiYmFyMSIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICAgIGRpY3Q6IGZpcnN0RGljdCwKKyAgICAgICAga2V5OiAiZm9vIiwKKyAgICAgICAgZ2V0QXJyYXk6IGZhbHNlLAorICAgICAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQorICAgICAgfSkpLnRvRXF1YWwoWyJiYXIxIiwgImJhcjIiXSk7CisgICAgICBmaXJzdERpY3Quc2V0KCJiYXoiLCBbInF1eDEiLCByZWZdKTsKKyAgICAgIHNlY29uZERpY3Quc2V0KCJiYXoiLCBbInF1eDIiLCByZWZdKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoeworICAgICAgICBkaWN0OiBmaXJzdERpY3QsCisgICAgICAgIGtleTogImJheiIsCisgICAgICAgIGdldEFycmF5OiB0cnVlLAorICAgICAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQorICAgICAgfSkpLnRvRXF1YWwoW1sicXV4MSIsICJxdXV4Il0sIFsicXV4MiIsICJxdXV4Il1dKTsKKyAgICB9KTsKKyAgICBpdCgic3RvcHMgc2VhcmNoaW5nIHdoZW4gdGhlIGxvb3AgbGltaXQgaXMgcmVhY2hlZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgbGV0IGN1cnJlbnREaWN0ID0gZGljdDsKKyAgICAgIGxldCBwYXJlbnREaWN0ID0gbnVsbDsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNTA7IGkrKykgeworICAgICAgICBwYXJlbnREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgICAgY3VycmVudERpY3Quc2V0KCJQYXJlbnQiLCBwYXJlbnREaWN0KTsKKyAgICAgICAgY3VycmVudERpY3QgPSBwYXJlbnREaWN0OworICAgICAgfQorCisgICAgICBwYXJlbnREaWN0LnNldCgiZm9vIiwgImJhciIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICAgIGRpY3QsCisgICAgICAgIGtleTogImZvbyIKKyAgICAgIH0pKS50b0VxdWFsKHVuZGVmaW5lZCk7CisgICAgICBkaWN0LnNldCgiZm9vIiwgImJheiIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CisgICAgICAgIGRpY3QsCisgICAgICAgIGtleTogImZvbyIsCisgICAgICAgIGdldEFycmF5OiBmYWxzZSwKKyAgICAgICAgc3RvcFdoZW5Gb3VuZDogZmFsc2UKKyAgICAgIH0pKS50b0VxdWFsKFsiYmF6Il0pOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoInRvUm9tYW5OdW1lcmFscyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiaGFuZGxlcyBpbnZhbGlkIGFyZ3VtZW50cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgWyJmb28iLCAtMSwgMF0pIHsKKyAgICAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAoMCwgX2NvcmVfdXRpbHMudG9Sb21hbk51bWVyYWxzKShpbnB1dCk7CisgICAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJUaGUgbnVtYmVyIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIuIikpOworICAgICAgfQorICAgIH0pOworICAgIGl0KCJjb252ZXJ0cyBudW1iZXJzIHRvIHVwcGVyY2FzZSBSb21hbiBudW1lcmFscyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMudG9Sb21hbk51bWVyYWxzKSgxKSkudG9FcXVhbCgiSSIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKDYpKS50b0VxdWFsKCJWSSIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKDcpKS50b0VxdWFsKCJWSUkiKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMudG9Sb21hbk51bWVyYWxzKSg4KSkudG9FcXVhbCgiVklJSSIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKDEwKSkudG9FcXVhbCgiWCIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKDQwKSkudG9FcXVhbCgiWEwiKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMudG9Sb21hbk51bWVyYWxzKSgxMDApKS50b0VxdWFsKCJDIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLnRvUm9tYW5OdW1lcmFscykoNTAwKSkudG9FcXVhbCgiRCIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKDEwMDApKS50b0VxdWFsKCJNIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLnRvUm9tYW5OdW1lcmFscykoMjAxOSkpLnRvRXF1YWwoIk1NWElYIik7CisgICAgfSk7CisgICAgaXQoImNvbnZlcnRzIG51bWJlcnMgdG8gbG93ZXJjYXNlIFJvbWFuIG51bWVyYWxzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKDEsIHRydWUpKS50b0VxdWFsKCJpIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLnRvUm9tYW5OdW1lcmFscykoNiwgdHJ1ZSkpLnRvRXF1YWwoInZpIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLnRvUm9tYW5OdW1lcmFscykoNywgdHJ1ZSkpLnRvRXF1YWwoInZpaSIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKDgsIHRydWUpKS50b0VxdWFsKCJ2aWlpIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLnRvUm9tYW5OdW1lcmFscykoMTAsIHRydWUpKS50b0VxdWFsKCJ4Iik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLnRvUm9tYW5OdW1lcmFscykoNDAsIHRydWUpKS50b0VxdWFsKCJ4bCIpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy50b1JvbWFuTnVtZXJhbHMpKDEwMCwgdHJ1ZSkpLnRvRXF1YWwoImMiKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMudG9Sb21hbk51bWVyYWxzKSg1MDAsIHRydWUpKS50b0VxdWFsKCJkIik7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLnRvUm9tYW5OdW1lcmFscykoMTAwMCwgdHJ1ZSkpLnRvRXF1YWwoIm0iKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMudG9Sb21hbk51bWVyYWxzKSgyMDE5LCB0cnVlKSkudG9FcXVhbCgibW14aXgiKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJsb2cyIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIHZhbHVlcyBzbWFsbGVyIHRoYW4vZXF1YWwgdG8gemVybyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMubG9nMikoMCkpLnRvRXF1YWwoMCk7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmxvZzIpKC0xKSkudG9FcXVhbCgwKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyB2YWx1ZXMgbGFyZ2VyIHRoYW4gemVybyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMubG9nMikoMSkpLnRvRXF1YWwoMCk7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmxvZzIpKDIpKS50b0VxdWFsKDEpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy5sb2cyKSgzKSkudG9FcXVhbCgyKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMubG9nMikoMy4xNCkpLnRvRXF1YWwoMik7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiaXNXaGl0ZVNwYWNlIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIHNwYWNlIGNoYXJhY3RlcnMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoMHgyMCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoMHgwOSkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoMHgwZCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoMHgwYSkpLnRvRXF1YWwodHJ1ZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgbm9uLXNwYWNlIGNoYXJhY3RlcnMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoMHgwYikpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKG51bGwpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKSh1bmRlZmluZWQpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L2NyeXB0b19zcGVjLmpzIGIvbGliL3Rlc3QvdW5pdC9jcnlwdG9fc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRhMDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9jcnlwdG9fc3BlYy5qcwpAQCAtMCwwICsxLDU4NCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX2NyeXB0byA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvY3J5cHRvLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvdXRpbC5qcyIpOworCitkZXNjcmliZSgiY3J5cHRvIiwgZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBoZXgyYmluYXJ5KHMpIHsKKyAgICB2YXIgZGlnaXRzID0gIjAxMjM0NTY3ODlBQkNERUYiOworICAgIHMgPSBzLnRvVXBwZXJDYXNlKCk7CisgICAgdmFyIG4gPSBzLmxlbmd0aCA+PiAxLAorICAgICAgICBpLAorICAgICAgICBqOworICAgIHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShuKTsKKworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICB2YXIgZDEgPSBzLmNoYXJBdChqKyspOworICAgICAgdmFyIGQyID0gcy5jaGFyQXQoaisrKTsKKyAgICAgIHZhciB2YWx1ZSA9IGRpZ2l0cy5pbmRleE9mKGQxKSA8PCA0IHwgZGlnaXRzLmluZGV4T2YoZDIpOworICAgICAgcmVzdWx0W2ldID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGRlc2NyaWJlKCJjYWxjdWxhdGVNRDUiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBwYXNzIFJGQyAxMzIxIHRlc3QgIzEiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQ7CisgICAgICBpbnB1dCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSgiIik7CisgICAgICByZXN1bHQgPSAoMCwgX2NyeXB0by5jYWxjdWxhdGVNRDUpKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCJkNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZSIpOworICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBwYXNzIFJGQyAxMzIxIHRlc3QgIzIiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQ7CisgICAgICBpbnB1dCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSgiYSIpOworICAgICAgcmVzdWx0ID0gKDAsIF9jcnlwdG8uY2FsY3VsYXRlTUQ1KShpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKTsKKyAgICAgIGV4cGVjdGVkID0gaGV4MmJpbmFyeSgiMGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjEiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyBSRkMgMTMyMSB0ZXN0ICMzIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGlucHV0LCByZXN1bHQsIGV4cGVjdGVkOworICAgICAgaW5wdXQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoImFiYyIpOworICAgICAgcmVzdWx0ID0gKDAsIF9jcnlwdG8uY2FsY3VsYXRlTUQ1KShpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKTsKKyAgICAgIGV4cGVjdGVkID0gaGV4MmJpbmFyeSgiOTAwMTUwOTgzY2QyNGZiMGQ2OTYzZjdkMjhlMTdmNzIiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyBSRkMgMTMyMSB0ZXN0ICM0IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGlucHV0LCByZXN1bHQsIGV4cGVjdGVkOworICAgICAgaW5wdXQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoIm1lc3NhZ2UgZGlnZXN0Iik7CisgICAgICByZXN1bHQgPSAoMCwgX2NyeXB0by5jYWxjdWxhdGVNRDUpKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCJmOTZiNjk3ZDdjYjc5MzhkNTI1YTJmMzFhYWYxNjFkMCIpOworICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBwYXNzIFJGQyAxMzIxIHRlc3QgIzUiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQ7CisgICAgICBpbnB1dCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKTsKKyAgICAgIHJlc3VsdCA9ICgwLCBfY3J5cHRvLmNhbGN1bGF0ZU1ENSkoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoImMzZmNkM2Q3NjE5MmU0MDA3ZGZiNDk2Y2NhNjdlMTNiIik7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHBhc3MgUkZDIDEzMjEgdGVzdCAjNiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBpbnB1dCwgcmVzdWx0LCBleHBlY3RlZDsKKyAgICAgIGlucHV0ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIpOworICAgICAgcmVzdWx0ID0gKDAsIF9jcnlwdG8uY2FsY3VsYXRlTUQ1KShpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKTsKKyAgICAgIGV4cGVjdGVkID0gaGV4MmJpbmFyeSgiZDE3NGFiOThkMjc3ZDlmNWE1NjExYzJjOWY0MTlkOWYiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyBSRkMgMTMyMSB0ZXN0ICM3IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGlucHV0LCByZXN1bHQsIGV4cGVjdGVkOworICAgICAgaW5wdXQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3OCIgKyAiOTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKTsKKyAgICAgIHJlc3VsdCA9ICgwLCBfY3J5cHRvLmNhbGN1bGF0ZU1ENSkoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoIjU3ZWRmNGEyMmJlM2M5NTVhYzQ5ZGEyZTIxMDdiNjdhIik7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJBUkNGb3VyQ2lwaGVyIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcGFzcyB0ZXN0ICMxIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGtleSwgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQsIGNpcGhlcjsKKyAgICAgIGtleSA9IGhleDJiaW5hcnkoIjAxMjM0NTY3ODlhYmNkZWYiKTsKKyAgICAgIGlucHV0ID0gaGV4MmJpbmFyeSgiMDEyMzQ1Njc4OWFiY2RlZiIpOworICAgICAgY2lwaGVyID0gbmV3IF9jcnlwdG8uQVJDRm91ckNpcGhlcihrZXkpOworICAgICAgcmVzdWx0ID0gY2lwaGVyLmVuY3J5cHRCbG9jayhpbnB1dCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoIjc1Yjc4NzgwOTllMGM1OTYiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyB0ZXN0ICMyIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGtleSwgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQsIGNpcGhlcjsKKyAgICAgIGtleSA9IGhleDJiaW5hcnkoIjAxMjM0NTY3ODlhYmNkZWYiKTsKKyAgICAgIGlucHV0ID0gaGV4MmJpbmFyeSgiMDAwMDAwMDAwMDAwMDAwMCIpOworICAgICAgY2lwaGVyID0gbmV3IF9jcnlwdG8uQVJDRm91ckNpcGhlcihrZXkpOworICAgICAgcmVzdWx0ID0gY2lwaGVyLmVuY3J5cHRCbG9jayhpbnB1dCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoIjc0OTRjMmU3MTA0YjA4NzkiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyB0ZXN0ICMzIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGtleSwgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQsIGNpcGhlcjsKKyAgICAgIGtleSA9IGhleDJiaW5hcnkoIjAwMDAwMDAwMDAwMDAwMDAiKTsKKyAgICAgIGlucHV0ID0gaGV4MmJpbmFyeSgiMDAwMDAwMDAwMDAwMDAwMCIpOworICAgICAgY2lwaGVyID0gbmV3IF9jcnlwdG8uQVJDRm91ckNpcGhlcihrZXkpOworICAgICAgcmVzdWx0ID0gY2lwaGVyLmVuY3J5cHRCbG9jayhpbnB1dCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoImRlMTg4OTQxYTMzNzVkM2EiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyB0ZXN0ICM0IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGtleSwgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQsIGNpcGhlcjsKKyAgICAgIGtleSA9IGhleDJiaW5hcnkoImVmMDEyMzQ1Iik7CisgICAgICBpbnB1dCA9IGhleDJiaW5hcnkoIjAwMDAwMDAwMDAwMDAwMDAwMDAwIik7CisgICAgICBjaXBoZXIgPSBuZXcgX2NyeXB0by5BUkNGb3VyQ2lwaGVyKGtleSk7CisgICAgICByZXN1bHQgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGlucHV0KTsKKyAgICAgIGV4cGVjdGVkID0gaGV4MmJpbmFyeSgiZDZhMTQxYTdlYzNjMzhkZmJkNjEiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyB0ZXN0ICM1IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGtleSwgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQsIGNpcGhlcjsKKyAgICAgIGtleSA9IGhleDJiaW5hcnkoIjAxMjM0NTY3ODlhYmNkZWYiKTsKKyAgICAgIGlucHV0ID0gaGV4MmJpbmFyeSgiMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwIiArICIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMCIgKyAiMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAiICsgIjEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwIiArICIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMCIgKyAiMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAiICsgIjEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwIiArICIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMCIgKyAiMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAiICsgIjEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwIiArICIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMCIgKyAiMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAiICsgIjEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwIiArICIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMCIgKyAiMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAiICsgIjEwMTAxMDEwMTAxMDEwMTAxMDEwMSIpOworICAgICAgY2lwaGVyID0gbmV3IF9jcnlwdG8uQVJDRm91ckNpcGhlcihrZXkpOworICAgICAgcmVzdWx0ID0gY2lwaGVyLmVuY3J5cHRCbG9jayhpbnB1dCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoIjc1OTVjM2U2MTE0YTA5NzgwYzRhZDQ1MjMzOGUxZmZkOWExYmU5NDk4ZjgxM2Q3NiIgKyAiNTMzNDQ5YjY3NzhkY2FkOGM3OGE4ZDJiYTlhYzY2MDg1ZDBlNTNkNTljMjZjMmQxYzQ5MGMxZWJiZTBjZTY2ZDFiNmIiICsgIjFiMTNiNmI5MTliODQ3YzI1YTkxNDQ3YTk1ZTc1ZTRlZjE2Nzc5Y2RlOGJmMGE5NTg1MGUzMmFmOTY4OTQ0NGZkMzc3IiArICIxMDhmOThmZGNiZDRlNzI2NTY3NTAwOTkwYmNjN2UwY2EzYzRhYWEzMDRhMzg3ZDIwZjNiOGZiYmNkNDJhMWJkMzExZCIgKyAiN2E0MzAzZGRhNWFiMDc4ODk2YWU4MGMxOGIwYWY2NmRmZjMxOTYxNmViNzg0ZTQ5NWFkMmNlOTBkN2Y3NzJhODE3NDciICsgImI2NWY2MjA5M2IxZTBkYjllNWJhNTMyZmFmZWM0NzUwODMyM2U2NzEzMjdkZjk0NDQ0MzJjYjczNjdjZWM4MmY1ZDQ0IiArICJjMGQwMGI2N2Q2NTBhMDc1Y2Q0YjcwZGVkZDc3ZWI5YjEwMjMxYjZiNWI3NDEzNDczOTZkNjI4OTc0MjFkNDNkZjliNCIgKyAiMmU0NDZlMzU4ZTljMTFhOWIyMTg0ZWNiZWYwY2Q4ZTdhODc3ZWY5NjhmMTM5MGVjOWIzZDM1YTU1ODVjYjAwOTI5MGUiICsgIjJmY2RlN2I1ZWM2NmQ5MDg0YmU0NDA1NWE2MTlkOWRkN2ZjMzE2NmY5NDg3ZjdjYjI3MjkxMjQyNjQ0NTk5ODUxNGMxIiArICI1ZDUzYTE4Yzg2NGNlM2EyYjc1NTU3OTM5ODgxMjY1MjBlYWNmMmUzMDY2ZTIzMGM5MWJlZTRkZDUzMDRmNWZkMDQwNSIgKyAiYjM1YmQ5OWM3MzEzNWQzZDliYzMzNWVlMDQ5ZWY2OWIzODY3YmYyZDdiZDFlYWE1OTVkOGJmYzAwNjZmZjhkMzE1MDkiICsgImViMGM2Y2FhMDA2YzgwN2E2MjNlZjg0YzNkMzNjMTk1ZDIzZWUzMjBjNDBkZTA1NTgxNTdjODIyZDRiOGM1NjlkODQ5IiArICJhZWQ1OWQ0ZTBmZDdmMzc5NTg2YjRiN2ZmNjg0ZWQ2YTE4OWY3NDg2ZDQ5YjljNGJhZDliYTI0Yjk2YWJmOTI0MzcyYyIgKyAiOGE4ZmZmYjEwZDU1MzU0OTAwYTc3YTNkYjVmMjA1ZTFiOTlmY2Q4NjYwODYzYTE1OWFkNGFiZTQwZmE0ODkzNDE2M2QiICsgImRkZTU0MmE2NTg1NTQwZmQ2ODNjYmZkOGMwMGYxMjEyOWEyODRkZWFjYzRjZGVmZTU4YmU3MTM3NTQxYzA0NzEyNmM4IiArICJkNDllMjc1NWFiMTgxYWI3ZTk0MGIwYzAiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyB0ZXN0ICM2IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGtleSwgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQsIGNpcGhlcjsKKyAgICAgIGtleSA9IGhleDJiaW5hcnkoImZiMDI5ZTMwMzEzMjMzMzQiKTsKKyAgICAgIGlucHV0ID0gaGV4MmJpbmFyeSgiYWFhYTAzMDAwMDAwMDgwMDQ1MDAwMDRlNjYxYTAwMDA4MDExYmU2NDBhMDAwMTIyMGFmIiArICJmZmZmZjAwODkwMDg5MDAzYTAwMDA4MGE2MDExMDAwMDEwMDAwMDAwMDAwMDAyMDQ1NDM0NTRhNDU0ODQ1NDM0NjQzNCIgKyAiNTUwNDY0NTQ1NDk0NTQ2NDY0MzQzNDE0MzQxNDM0MTQzNDE0MzQxNDE0MTAwMDAyMDAwMDExYmQwYjYwNCIpOworICAgICAgY2lwaGVyID0gbmV3IF9jcnlwdG8uQVJDRm91ckNpcGhlcihrZXkpOworICAgICAgcmVzdWx0ID0gY2lwaGVyLmVuY3J5cHRCbG9jayhpbnB1dCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoImY2OWM1ODA2YmQ2Y2U4NDYyNmJjYmVmYjk0NzQ2NTBhYWQxZjc5MDliMGY2NGQ1ZiIgKyAiNThhNTAzYTI1OGI3ZWQyMmViMGVhNjQ5MzBkM2EwNTZhNTU3NDJmY2NlMTQxZDQ4NWY4YWE4MzZkZWExOGRmNDJjNTMiICsgIjgwODA1YWQwYzYxYTVkNmY1OGY0MTA0MGIyNGI3ZDFhNjkzODU2ZWQwZDQzOThlN2FlZTNiZjBlMmEyY2E4ZjciKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcGFzcyB0ZXN0ICM3IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGtleSwgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQsIGNpcGhlcjsKKyAgICAgIGtleSA9IGhleDJiaW5hcnkoIjAxMjM0NTY3ODlhYmNkZWYiKTsKKyAgICAgIGlucHV0ID0gaGV4MmJpbmFyeSgiMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2NzgiKTsKKyAgICAgIGNpcGhlciA9IG5ldyBfY3J5cHRvLkFSQ0ZvdXJDaXBoZXIoa2V5KTsKKyAgICAgIHJlc3VsdCA9IGNpcGhlci5lbmNyeXB0QmxvY2soaW5wdXQpOworICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCI2NmEwOTQ5ZjhhZjdkNjg5MWY3ZjgzMmJhODMzYzAwYzg5MmViZTMwMTQzY2UyODc0MDAxMWVjZiIpOworICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiY2FsY3VsYXRlU0hBMjU2IiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcHJvcGVybHkgaGFzaCBhYmMiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQ7CisgICAgICBpbnB1dCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSgiYWJjIik7CisgICAgICByZXN1bHQgPSAoMCwgX2NyeXB0by5jYWxjdWxhdGVTSEEyNTYpKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCJCQTc4MTZCRjhGMDFDRkVBNDE0MTQwREU1REFFMjIyM0IwMDM2MUEzOTYxNzdBOUNCNDEwRkY2MUYyMDAxNUFEIik7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHByb3Blcmx5IGhhc2ggYSBtdWx0aWJsb2NrIGlucHV0IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGlucHV0LCByZXN1bHQsIGV4cGVjdGVkOworICAgICAgaW5wdXQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIik7CisgICAgICByZXN1bHQgPSAoMCwgX2NyeXB0by5jYWxjdWxhdGVTSEEyNTYpKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCIyNDhENkE2MUQyMDYzOEI4RTVDMDI2OTMwQzNFNjAzOUEzM0NFNDU5NjRGRjIxNjdGNkVDRURENDE5REIwNkMxIik7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJjYWxjdWxhdGVTSEEzODQiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBwcm9wZXJseSBoYXNoIGFiYyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBpbnB1dCwgcmVzdWx0LCBleHBlY3RlZDsKKyAgICAgIGlucHV0ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKCJhYmMiKTsKKyAgICAgIHJlc3VsdCA9ICgwLCBfY3J5cHRvLmNhbGN1bGF0ZVNIQTM4NCkoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoIkNCMDA3NTNGNDVBMzVFOEJCNUEwM0Q2OTlBQzY1MDA3MjcyQzMyQUIwRURFRDE2MyIgKyAiMUE4QjYwNUE0M0ZGNUJFRDgwODYwNzJCQTFFN0NDMjM1OEJBRUNBMTM0QzgyNUE3Iik7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHByb3Blcmx5IGhhc2ggYSBtdWx0aWJsb2NrIGlucHV0IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGlucHV0LCByZXN1bHQsIGV4cGVjdGVkOworICAgICAgaW5wdXQgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpamtsbSIgKyAiZ2hpamtsbW5oaWprbG1ub2lqa2xtbm9wamtsbW5vcHFrbG1ub3Bxcmxtbm9wcXJzIiArICJtbm9wcXJzdG5vcHFyc3R1Iik7CisgICAgICByZXN1bHQgPSAoMCwgX2NyeXB0by5jYWxjdWxhdGVTSEEzODQpKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCIwOTMzMEMzM0Y3MTE0N0U4M0QxOTJGQzc4MkNEMUI0NzUzMTExQjE3M0IzQjA1RDIiICsgIjJGQTA4MDg2RTNCMEY3MTJGQ0M3QzcxQTU1N0UyREI5NjZDM0U5RkE5MTc0NjAzOSIpOworICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiY2FsY3VsYXRlU0hBNTEyIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcHJvcGVybHkgaGFzaCBhYmMiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQ7CisgICAgICBpbnB1dCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSgiYWJjIik7CisgICAgICByZXN1bHQgPSAoMCwgX2NyeXB0by5jYWxjdWxhdGVTSEE1MTIpKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCJEREFGMzVBMTkzNjE3QUJBQ0M0MTczNDlBRTIwNDEzMTEyRTZGQTRFODlBOTdFQTIiICsgIjBBOUVFRUU2NEI1NUQzOUEyMTkyOTkyQTI3NEZDMUE4MzZCQTNDMjNBM0ZFRUJCRCIgKyAiNDU0RDQ0MjM2NDNDRTgwRTJBOUFDOTRGQTU0Q0E0OUYiKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcHJvcGVybHkgaGFzaCBhIG11bHRpYmxvY2sgaW5wdXQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaW5wdXQsIHJlc3VsdCwgZXhwZWN0ZWQ7CisgICAgICBpbnB1dCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSgiYWJjZGVmZ2hiY2RlZmdoaWNkZWZnaGlqZGVmZ2hpamtlZmdoaWprbGZnaGlqa2xtIiArICJnaGlqa2xtbmhpamtsbW5vaWprbG1ub3Bqa2xtbm9wcWtsbW5vcHFybG1ub3BxcnMiICsgIm1ub3BxcnN0bm9wcXJzdHUiKTsKKyAgICAgIHJlc3VsdCA9ICgwLCBfY3J5cHRvLmNhbGN1bGF0ZVNIQTUxMikoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCk7CisgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoIjhFOTU5Qjc1REFFMzEzREE4Q0Y0RjcyODE0RkMxNDNGOEY3Nzc5QzZFQjlGN0ZBMSIgKyAiNzI5OUFFQURCNjg4OTAxODUwMUQyODlFNDkwMEY3RTQzMzFCOTlERUM0QjU0MzNBIiArICJDN0QzMjlFRUI2REQyNjU0NUU5NkU1NUI4NzRCRTkwOSIpOworICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiQUVTMTI4IiwgZnVuY3Rpb24gKCkgeworICAgIGRlc2NyaWJlKCJFbmNyeXB0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgICAgaXQoInNob3VsZCBiZSBhYmxlIHRvIGVuY3J5cHQgYSBibG9jayIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGlucHV0LCBrZXksIHJlc3VsdCwgZXhwZWN0ZWQsIGl2LCBjaXBoZXI7CisgICAgICAgIGlucHV0ID0gaGV4MmJpbmFyeSgiMDAxMTIyMzM0NDU1NjY3Nzg4OTlhYWJiY2NkZGVlZmYiKTsKKyAgICAgICAga2V5ID0gaGV4MmJpbmFyeSgiMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYiKTsKKyAgICAgICAgaXYgPSBoZXgyYmluYXJ5KCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIpOworICAgICAgICBjaXBoZXIgPSBuZXcgX2NyeXB0by5BRVMxMjhDaXBoZXIoa2V5KTsKKyAgICAgICAgcmVzdWx0ID0gY2lwaGVyLmVuY3J5cHQoaW5wdXQsIGl2KTsKKyAgICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCI2OWM0ZTBkODZhN2IwNDMwZDhjZGI3ODA3MGI0YzU1YSIpOworICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGRlc2NyaWJlKCJEZWNyeXB0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgICAgaXQoInNob3VsZCBiZSBhYmxlIHRvIGRlY3J5cHQgYSBibG9jayB3aXRoIElWIGluIHN0cmVhbSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGlucHV0LCBrZXksIHJlc3VsdCwgZXhwZWN0ZWQsIGNpcGhlcjsKKyAgICAgICAgaW5wdXQgPSBoZXgyYmluYXJ5KCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDY5YzRlMGQ4NmE3YjA0MzBkIiArICI4Y2RiNzgwNzBiNGM1NWEiKTsKKyAgICAgICAga2V5ID0gaGV4MmJpbmFyeSgiMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYiKTsKKyAgICAgICAgY2lwaGVyID0gbmV3IF9jcnlwdG8uQUVTMTI4Q2lwaGVyKGtleSk7CisgICAgICAgIHJlc3VsdCA9IGNpcGhlci5kZWNyeXB0QmxvY2soaW5wdXQpOworICAgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoIjAwMTEyMjMzNDQ1NTY2Nzc4ODk5YWFiYmNjZGRlZWZmIik7CisgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgICAgfSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiQUVTMjU2IiwgZnVuY3Rpb24gKCkgeworICAgIGRlc2NyaWJlKCJFbmNyeXB0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgICAgaXQoInNob3VsZCBiZSBhYmxlIHRvIGVuY3J5cHQgYSBibG9jayIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGlucHV0LCBrZXksIHJlc3VsdCwgZXhwZWN0ZWQsIGl2LCBjaXBoZXI7CisgICAgICAgIGlucHV0ID0gaGV4MmJpbmFyeSgiMDAxMTIyMzM0NDU1NjY3Nzg4OTlhYWJiY2NkZGVlZmYiKTsKKyAgICAgICAga2V5ID0gaGV4MmJpbmFyeSgiMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYxMDExMTIxMzE0MTUxNjE3MTgiICsgIjE5MWExYjFjMWQxZTFmIik7CisgICAgICAgIGl2ID0gaGV4MmJpbmFyeSgiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiKTsKKyAgICAgICAgY2lwaGVyID0gbmV3IF9jcnlwdG8uQUVTMjU2Q2lwaGVyKGtleSk7CisgICAgICAgIHJlc3VsdCA9IGNpcGhlci5lbmNyeXB0KGlucHV0LCBpdik7CisgICAgICAgIGV4cGVjdGVkID0gaGV4MmJpbmFyeSgiOGVhMmI3Y2E1MTY3NDViZmVhZmM0OTkwNGI0OTYwODkiKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBkZXNjcmliZSgiRGVjcnlwdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGl0KCJzaG91bGQgYmUgYWJsZSB0byBkZWNyeXB0IGEgYmxvY2sgd2l0aCBzcGVjaWZpZWQgaXYiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBpbnB1dCwga2V5LCByZXN1bHQsIGV4cGVjdGVkLCBjaXBoZXIsIGl2OworICAgICAgICBpbnB1dCA9IGhleDJiaW5hcnkoIjhlYTJiN2NhNTE2NzQ1YmZlYWZjNDk5MDRiNDk2MDg5Iik7CisgICAgICAgIGtleSA9IGhleDJiaW5hcnkoIjAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmMTAxMTEyMTMxNDE1MTYxNzE4IiArICIxOTFhMWIxYzFkMWUxZiIpOworICAgICAgICBpdiA9IGhleDJiaW5hcnkoIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIik7CisgICAgICAgIGNpcGhlciA9IG5ldyBfY3J5cHRvLkFFUzI1NkNpcGhlcihrZXkpOworICAgICAgICByZXN1bHQgPSBjaXBoZXIuZGVjcnlwdEJsb2NrKGlucHV0LCBmYWxzZSwgaXYpOworICAgICAgICBleHBlY3RlZCA9IGhleDJiaW5hcnkoIjAwMTEyMjMzNDQ1NTY2Nzc4ODk5YWFiYmNjZGRlZWZmIik7CisgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgICAgfSk7CisgICAgICBpdCgic2hvdWxkIGJlIGFibGUgdG8gZGVjcnlwdCBhIGJsb2NrIHdpdGggSVYgaW4gc3RyZWFtIiwgZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgaW5wdXQsIGtleSwgcmVzdWx0LCBleHBlY3RlZCwgY2lwaGVyOworICAgICAgICBpbnB1dCA9IGhleDJiaW5hcnkoIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOGVhMmI3Y2E1MTY3NDViZiIgKyAiZWFmYzQ5OTA0YjQ5NjA4OSIpOworICAgICAgICBrZXkgPSBoZXgyYmluYXJ5KCIwMDAxMDIwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZjEwMTExMjEzMTQxNTE2MTcxOCIgKyAiMTkxYTFiMWMxZDFlMWYiKTsKKyAgICAgICAgY2lwaGVyID0gbmV3IF9jcnlwdG8uQUVTMjU2Q2lwaGVyKGtleSk7CisgICAgICAgIHJlc3VsdCA9IGNpcGhlci5kZWNyeXB0QmxvY2soaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgZXhwZWN0ZWQgPSBoZXgyYmluYXJ5KCIwMDExMjIzMzQ0NTU2Njc3ODg5OWFhYmJjY2RkZWVmZiIpOworICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICAgIH0pOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlBERjE3QWxnb3JpdGhtIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IGNoZWNrIGEgdXNlciBrZXkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uLCB1c2VyUGFzc3dvcmQsIGFsZywgcmVzdWx0OworICAgICAgYWxnID0gbmV3IF9jcnlwdG8uUERGMTcoKTsKKyAgICAgIHBhc3N3b3JkID0gbmV3IFVpbnQ4QXJyYXkoWzExNywgMTE1LCAxMDEsIDExNF0pOworICAgICAgdXNlclZhbGlkYXRpb24gPSBuZXcgVWludDhBcnJheShbMTE3LCAxNjksIDQsIDMyLCAxNTksIDEwMSwgMjIsIDIyMF0pOworICAgICAgdXNlclBhc3N3b3JkID0gbmV3IFVpbnQ4QXJyYXkoWzEzMSwgMjQyLCAxNDMsIDE2MCwgODcsIDIsIDEzOCwgMTM0LCA3OSwgMjUzLCAxODksIDE3MywgMjI0LCA3MywgMTQ0LCAyNDEsIDE5MCwgODEsIDE5NywgMTUsIDI0OSwgMTA1LCAxNDUsIDE1MSwgMTUsIDE5NCwgNjUsIDMsIDEsIDEyNiwgMTg3LCAyMjFdKTsKKyAgICAgIHJlc3VsdCA9IGFsZy5jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb24sIHVzZXJQYXNzd29yZCk7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHRydWUpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IGNoZWNrIGFuIG93bmVyIGtleSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBwYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uLCBvd25lclBhc3N3b3JkLCBhbGcsIHJlc3VsdCwgdUJ5dGVzOworICAgICAgYWxnID0gbmV3IF9jcnlwdG8uUERGMTcoKTsKKyAgICAgIHBhc3N3b3JkID0gbmV3IFVpbnQ4QXJyYXkoWzExMSwgMTE5LCAxMTAsIDEwMSwgMTE0XSk7CisgICAgICBvd25lclZhbGlkYXRpb24gPSBuZXcgVWludDhBcnJheShbMjQzLCAxMTgsIDcxLCAxNTMsIDEyOCwgMTcsIDEwMSwgNjJdKTsKKyAgICAgIG93bmVyUGFzc3dvcmQgPSBuZXcgVWludDhBcnJheShbNjAsIDk4LCAxMzcsIDM1LCA1MSwgMTAxLCAyMDAsIDE1MiwgMjEwLCAxNzgsIDIyNiwgMjI4LCAxMzQsIDIwNSwgMTYzLCAyNCwgMjA0LCAxMjYsIDE3NywgMzYsIDEwNiwgNTAsIDM2LCAxMjUsIDIxMCwgMTcyLCAxNzEsIDEyMCwgMjIyLCAxMDgsIDEzOSwgMTE1XSk7CisgICAgICB1Qnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTMxLCAyNDIsIDE0MywgMTYwLCA4NywgMiwgMTM4LCAxMzQsIDc5LCAyNTMsIDE4OSwgMTczLCAyMjQsIDczLCAxNDQsIDI0MSwgMTkwLCA4MSwgMTk3LCAxNSwgMjQ5LCAxMDUsIDE0NSwgMTUxLCAxNSwgMTk0LCA2NSwgMywgMSwgMTI2LCAxODcsIDIyMSwgMTE3LCAxNjksIDQsIDMyLCAxNTksIDEwMSwgMjIsIDIyMCwgMTY4LCA5NCwgMjE1LCAxOTIsIDEwMCwgMzgsIDE4OCwgNDBdKTsKKyAgICAgIHJlc3VsdCA9IGFsZy5jaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvbiwgdUJ5dGVzLCBvd25lclBhc3N3b3JkKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwodHJ1ZSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBnZW5lcmF0ZSBhIGZpbGUgZW5jcnlwdGlvbiBrZXkgZnJvbSB0aGUgdXNlciBrZXkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcGFzc3dvcmQsIHVzZXJLZXlTYWx0LCBleHBlY3RlZCwgYWxnLCByZXN1bHQsIHVzZXJFbmNyeXB0aW9uOworICAgICAgYWxnID0gbmV3IF9jcnlwdG8uUERGMTcoKTsKKyAgICAgIHBhc3N3b3JkID0gbmV3IFVpbnQ4QXJyYXkoWzExNywgMTE1LCAxMDEsIDExNF0pOworICAgICAgdXNlcktleVNhbHQgPSBuZXcgVWludDhBcnJheShbMTY4LCA5NCwgMjE1LCAxOTIsIDEwMCwgMzgsIDE4OCwgNDBdKTsKKyAgICAgIHVzZXJFbmNyeXB0aW9uID0gbmV3IFVpbnQ4QXJyYXkoWzM1LCAxNTAsIDE5NSwgMTY5LCAyNDUsIDUxLCA1MSwgMjU1LCAxNTgsIDE1OCwgMzMsIDI0MiwgMjMxLCA3NSwgMTI1LCAxOTAsIDI1LCAxMjYsIDE3MiwgMTE0LCAxOTUsIDI0NCwgMTM3LCAyNDUsIDIzNCwgMTY1LCA0MiwgNzQsIDYwLCAzOCwgMTcsIDE3XSk7CisgICAgICByZXN1bHQgPSBhbGcuZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKTsKKyAgICAgIGV4cGVjdGVkID0gbmV3IFVpbnQ4QXJyYXkoWzYzLCAxMTQsIDEzNiwgMjA5LCA4NywgNjEsIDEyLCAzMCwgMjQ5LCAxLCAxODYsIDE0NCwgMjU0LCAyNDgsIDE2MywgMTUzLCAxNTEsIDUxLCAxMzMsIDEwLCA4MCwgMTUyLCAyMDYsIDE1LCA3MiwgMTg3LCAyMzEsIDMzLCAyMjQsIDIzOSwgMTMsIDIxM10pOworICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBnZW5lcmF0ZSBhIGZpbGUgZW5jcnlwdGlvbiBrZXkgZnJvbSB0aGUgb3duZXIga2V5IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHBhc3N3b3JkLCBvd25lcktleVNhbHQsIGV4cGVjdGVkLCBhbGcsIHJlc3VsdCwgb3duZXJFbmNyeXB0aW9uOworICAgICAgdmFyIHVCeXRlczsKKyAgICAgIGFsZyA9IG5ldyBfY3J5cHRvLlBERjE3KCk7CisgICAgICBwYXNzd29yZCA9IG5ldyBVaW50OEFycmF5KFsxMTEsIDExOSwgMTEwLCAxMDEsIDExNF0pOworICAgICAgb3duZXJLZXlTYWx0ID0gbmV3IFVpbnQ4QXJyYXkoWzIwMCwgMjQ1LCAyNDIsIDEyLCAyMTgsIDEyMywgMjQsIDEyMF0pOworICAgICAgb3duZXJFbmNyeXB0aW9uID0gbmV3IFVpbnQ4QXJyYXkoWzIxMywgMjAyLCAxNCwgMTg5LCAxMTAsIDc2LCA3MCwgMTkxLCA2LCAxOTUsIDEwLCAxOTAsIDE1NywgMTAwLCAxNDQsIDg1LCA4LCA2MiwgMTIzLCAxNzgsIDE1NiwgMjI5LCA1MCwgNDAsIDIyOSwgMjE2LCA1NCwgMjIyLCAzNCwgMzgsIDEwNiwgMjIzXSk7CisgICAgICB1Qnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTMxLCAyNDIsIDE0MywgMTYwLCA4NywgMiwgMTM4LCAxMzQsIDc5LCAyNTMsIDE4OSwgMTczLCAyMjQsIDczLCAxNDQsIDI0MSwgMTkwLCA4MSwgMTk3LCAxNSwgMjQ5LCAxMDUsIDE0NSwgMTUxLCAxNSwgMTk0LCA2NSwgMywgMSwgMTI2LCAxODcsIDIyMSwgMTE3LCAxNjksIDQsIDMyLCAxNTksIDEwMSwgMjIsIDIyMCwgMTY4LCA5NCwgMjE1LCAxOTIsIDEwMCwgMzgsIDE4OCwgNDBdKTsKKyAgICAgIHJlc3VsdCA9IGFsZy5nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIG93bmVyRW5jcnlwdGlvbik7CisgICAgICBleHBlY3RlZCA9IG5ldyBVaW50OEFycmF5KFs2MywgMTE0LCAxMzYsIDIwOSwgODcsIDYxLCAxMiwgMzAsIDI0OSwgMSwgMTg2LCAxNDQsIDI1NCwgMjQ4LCAxNjMsIDE1MywgMTUxLCA1MSwgMTMzLCAxMCwgODAsIDE1MiwgMjA2LCAxNSwgNzIsIDE4NywgMjMxLCAzMywgMjI0LCAyMzksIDEzLCAyMTNdKTsKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlBERjIwQWxnb3JpdGhtIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IGNoZWNrIGEgdXNlciBrZXkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uLCB1c2VyUGFzc3dvcmQsIGFsZywgcmVzdWx0OworICAgICAgYWxnID0gbmV3IF9jcnlwdG8uUERGMjAoKTsKKyAgICAgIHBhc3N3b3JkID0gbmV3IFVpbnQ4QXJyYXkoWzExNywgMTE1LCAxMDEsIDExNF0pOworICAgICAgdXNlclZhbGlkYXRpb24gPSBuZXcgVWludDhBcnJheShbODMsIDI0NSwgMTQ2LCAxMDEsIDE5OCwgMjQ3LCAzNCwgMTk4XSk7CisgICAgICB1c2VyUGFzc3dvcmQgPSBuZXcgVWludDhBcnJheShbOTQsIDIzMCwgMjA1LCA3NSwgMTY2LCA5OSwgMjUwLCA3NiwgMjE5LCAxMjgsIDE3LCA4NSwgNTcsIDE3LCAzMywgMTY0LCAxNTAsIDQ2LCAxMDMsIDE3NiwgMTYwLCAxNTYsIDE4NywgMjMzLCAxNjYsIDIyMywgMTYzLCAyNTMsIDE0NywgMjM1LCA5NSwgMTg0XSk7CisgICAgICByZXN1bHQgPSBhbGcuY2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uLCB1c2VyUGFzc3dvcmQpOworICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh0cnVlKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNvcnJlY3RseSBjaGVjayBhbiBvd25lciBrZXkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvbiwgb3duZXJQYXNzd29yZCwgYWxnLCByZXN1bHQsIHVCeXRlczsKKyAgICAgIGFsZyA9IG5ldyBfY3J5cHRvLlBERjIwKCk7CisgICAgICBwYXNzd29yZCA9IG5ldyBVaW50OEFycmF5KFsxMTEsIDExOSwgMTEwLCAxMDEsIDExNF0pOworICAgICAgb3duZXJWYWxpZGF0aW9uID0gbmV3IFVpbnQ4QXJyYXkoWzE0MiwgMjMyLCAxNjksIDIwOCwgMjAyLCAyMTQsIDUsIDE4NV0pOworICAgICAgb3duZXJQYXNzd29yZCA9IG5ldyBVaW50OEFycmF5KFs4OCwgMjMyLCA2MiwgNTQsIDI0NSwgMjYsIDI0NSwgMjA5LCAxMzcsIDEyMywgMjIxLCA3MiwgMTk5LCA0OSwgMzcsIDIxNywgMzEsIDc0LCAxMTUsIDE2NywgMTI3LCAxNTgsIDE3NiwgNzcsIDQ1LCAxNjMsIDg3LCA0NywgMzksIDkwLCAyMTcsIDE0MV0pOworICAgICAgdUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzk0LCAyMzAsIDIwNSwgNzUsIDE2NiwgOTksIDI1MCwgNzYsIDIxOSwgMTI4LCAxNywgODUsIDU3LCAxNywgMzMsIDE2NCwgMTUwLCA0NiwgMTAzLCAxNzYsIDE2MCwgMTU2LCAxODcsIDIzMywgMTY2LCAyMjMsIDE2MywgMjUzLCAxNDcsIDIzNSwgOTUsIDE4NCwgODMsIDI0NSwgMTQ2LCAxMDEsIDE5OCwgMjQ3LCAzNCwgMTk4LCAxOTEsIDExLCAxNiwgOTQsIDIzNywgMjE2LCAyMCwgMTc1XSk7CisgICAgICByZXN1bHQgPSBhbGcuY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb24sIHVCeXRlcywgb3duZXJQYXNzd29yZCk7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHRydWUpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgZ2VuZXJhdGUgYSBmaWxlIGVuY3J5cHRpb24ga2V5IGZyb20gdGhlIHVzZXIga2V5IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHBhc3N3b3JkLCB1c2VyS2V5U2FsdCwgZXhwZWN0ZWQsIGFsZywgcmVzdWx0LCB1c2VyRW5jcnlwdGlvbjsKKyAgICAgIGFsZyA9IG5ldyBfY3J5cHRvLlBERjIwKCk7CisgICAgICBwYXNzd29yZCA9IG5ldyBVaW50OEFycmF5KFsxMTcsIDExNSwgMTAxLCAxMTRdKTsKKyAgICAgIHVzZXJLZXlTYWx0ID0gbmV3IFVpbnQ4QXJyYXkoWzE5MSwgMTEsIDE2LCA5NCwgMjM3LCAyMTYsIDIwLCAxNzVdKTsKKyAgICAgIHVzZXJFbmNyeXB0aW9uID0gbmV3IFVpbnQ4QXJyYXkoWzEyMSwgMjA4LCAyLCAxODEsIDIzMCwgODksIDE1NiwgNjAsIDI1MywgMTQzLCAyMTIsIDI4LCA4NCwgMTgwLCAxOTYsIDE3NywgMTczLCAxMjgsIDIyMSwgMTA3LCA0NiwgMjAsIDk0LCAxODYsIDEzNSwgNTEsIDk1LCAyNCwgMjAsIDIyMywgMjU0LCAzNl0pOworICAgICAgcmVzdWx0ID0gYWxnLmdldFVzZXJLZXkocGFzc3dvcmQsIHVzZXJLZXlTYWx0LCB1c2VyRW5jcnlwdGlvbik7CisgICAgICBleHBlY3RlZCA9IG5ldyBVaW50OEFycmF5KFs0MiwgMjE4LCAyMTMsIDM5LCA3MywgOTEsIDcyLCA3OSwgNjcsIDM4LCAyNDgsIDEzMywgMTgsIDE4OSwgNjEsIDM0LCAxMDcsIDc5LCAyOSwgNTYsIDU5LCAxODEsIDIxMywgMTE4LCAxMTMsIDM0LCA2NSwgMjEwLCA4NywgMTc0LCAyMiwgMjM5XSk7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGdlbmVyYXRlIGEgZmlsZSBlbmNyeXB0aW9uIGtleSBmcm9tIHRoZSBvd25lciBrZXkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcGFzc3dvcmQsIG93bmVyS2V5U2FsdCwgZXhwZWN0ZWQsIGFsZywgcmVzdWx0LCBvd25lckVuY3J5cHRpb247CisgICAgICB2YXIgdUJ5dGVzOworICAgICAgYWxnID0gbmV3IF9jcnlwdG8uUERGMjAoKTsKKyAgICAgIHBhc3N3b3JkID0gbmV3IFVpbnQ4QXJyYXkoWzExMSwgMTE5LCAxMTAsIDEwMSwgMTE0XSk7CisgICAgICBvd25lcktleVNhbHQgPSBuZXcgVWludDhBcnJheShbMjksIDIwOCwgMTg1LCA0NiwgMTEsIDc2LCAxMzUsIDE0OV0pOworICAgICAgb3duZXJFbmNyeXB0aW9uID0gbmV3IFVpbnQ4QXJyYXkoWzIwOSwgNzMsIDIyNCwgNzcsIDEwMywgMTU1LCAyMDEsIDE4MSwgMTkwLCA2OCwgMjIzLCAyMCwgNjIsIDkwLCA1NiwgMjEwLCA1LCAyNDAsIDE3OCwgMTI4LCAyMzgsIDEyNCwgNjgsIDI1NCwgMjUzLCAyNDQsIDYyLCAxMDgsIDIwOCwgMTM1LCAxMCwgMjUxXSk7CisgICAgICB1Qnl0ZXMgPSBuZXcgVWludDhBcnJheShbOTQsIDIzMCwgMjA1LCA3NSwgMTY2LCA5OSwgMjUwLCA3NiwgMjE5LCAxMjgsIDE3LCA4NSwgNTcsIDE3LCAzMywgMTY0LCAxNTAsIDQ2LCAxMDMsIDE3NiwgMTYwLCAxNTYsIDE4NywgMjMzLCAxNjYsIDIyMywgMTYzLCAyNTMsIDE0NywgMjM1LCA5NSwgMTg0LCA4MywgMjQ1LCAxNDYsIDEwMSwgMTk4LCAyNDcsIDM0LCAxOTgsIDE5MSwgMTEsIDE2LCA5NCwgMjM3LCAyMTYsIDIwLCAxNzVdKTsKKyAgICAgIHJlc3VsdCA9IGFsZy5nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIG93bmVyRW5jcnlwdGlvbik7CisgICAgICBleHBlY3RlZCA9IG5ldyBVaW50OEFycmF5KFs0MiwgMjE4LCAyMTMsIDM5LCA3MywgOTEsIDcyLCA3OSwgNjcsIDM4LCAyNDgsIDEzMywgMTgsIDE4OSwgNjEsIDM0LCAxMDcsIDc5LCAyOSwgNTYsIDU5LCAxODEsIDIxMywgMTE4LCAxMTMsIDM0LCA2NSwgMjEwLCA4NywgMTc0LCAyMiwgMjM5XSk7CisgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKK2Rlc2NyaWJlKCJDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5IiwgZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBidWlsZERpY3QobWFwKSB7CisgICAgdmFyIGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworCisgICAgZm9yICh2YXIga2V5IGluIG1hcCkgeworICAgICAgZGljdC5zZXQoa2V5LCBtYXBba2V5XSk7CisgICAgfQorCisgICAgcmV0dXJuIGRpY3Q7CisgIH0KKworICBmdW5jdGlvbiBlbnN1cmVQYXNzd29yZENvcnJlY3QoZG9uZSwgZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgeworICAgIHRyeSB7CisgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBfY3J5cHRvLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkoZGljdCwgZmlsZUlkLCBwYXNzd29yZCk7CisgICAgICBleHBlY3QoImNyZWF0ZUNpcGhlclRyYW5zZm9ybSIgaW4gZmFjdG9yeSkudG9FcXVhbCh0cnVlKTsKKyAgICB9IGNhdGNoIChleCkgeworICAgICAgZG9uZS5mYWlsKCJQYXNzd29yZCBzaG91bGQgYmUgYWNjZXB0ZWQ6ICIgKyBleCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG9uZSgpOworICB9CisKKyAgZnVuY3Rpb24gZW5zdXJlUGFzc3dvcmROZWVkZWQoZG9uZSwgZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgeworICAgIHRyeSB7CisgICAgICBuZXcgX2NyeXB0by5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KGRpY3QsIGZpbGVJZCwgcGFzc3dvcmQpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBleHBlY3QoZXggaW5zdGFuY2VvZiBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbikudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChleC5jb2RlKS50b0VxdWFsKF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkQpOworICAgICAgZG9uZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRvbmUuZmFpbCgiUGFzc3dvcmQgc2hvdWxkIGJlIHJlamVjdGVkLiIpOworICB9CisKKyAgZnVuY3Rpb24gZW5zdXJlUGFzc3dvcmRJbmNvcnJlY3QoZG9uZSwgZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgeworICAgIHRyeSB7CisgICAgICBuZXcgX2NyeXB0by5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KGRpY3QsIGZpbGVJZCwgcGFzc3dvcmQpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBleHBlY3QoZXggaW5zdGFuY2VvZiBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbikudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChleC5jb2RlKS50b0VxdWFsKF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCk7CisgICAgICBkb25lKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG9uZS5mYWlsKCJQYXNzd29yZCBzaG91bGQgYmUgcmVqZWN0ZWQuIik7CisgIH0KKworICBmdW5jdGlvbiBlbnN1cmVFbmNyeXB0RGVjcnlwdElzSWRlbnRpdHkoZGljdCwgZmlsZUlkLCBwYXNzd29yZCwgc3RyaW5nKSB7CisgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBfY3J5cHRvLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkoZGljdCwgZmlsZUlkLCBwYXNzd29yZCk7CisgICAgY29uc3QgY2lwaGVyID0gZmFjdG9yeS5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oMTIzLCAwKTsKKyAgICBjb25zdCBlbmNyeXB0ZWQgPSBjaXBoZXIuZW5jcnlwdFN0cmluZyhzdHJpbmcpOworICAgIGNvbnN0IGRlY3J5cHRlZCA9IGNpcGhlci5kZWNyeXB0U3RyaW5nKGVuY3J5cHRlZCk7CisgICAgZXhwZWN0KHN0cmluZykudG9FcXVhbChkZWNyeXB0ZWQpOworICB9CisKKyAgdmFyIGZpbGVJZDEsIGZpbGVJZDIsIGRpY3QxLCBkaWN0MiwgZGljdDM7CisgIHZhciBhZXMyNTZEaWN0LCBhZXMyNTZJc29EaWN0LCBhZXMyNTZCbGFua0RpY3QsIGFlczI1Nklzb0JsYW5rRGljdDsKKyAgYmVmb3JlQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgZmlsZUlkMSA9IHVuZXNjYXBlKCIlRjYlQzYlQUYlMTclRjNyUiU4RFJNJTlBJTgwJUQxJUVGJURGJTE4Iik7CisgICAgZmlsZUlkMiA9IHVuZXNjYXBlKCIlM0NMXyUzQUQlOTYlQUZAJTlBJTlEJUIzJTNDeCUxQ3YlQUMiKTsKKyAgICBkaWN0MSA9IGJ1aWxkRGljdCh7CisgICAgICBGaWx0ZXI6IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJTdGFuZGFyZCIpLAorICAgICAgVjogMiwKKyAgICAgIExlbmd0aDogMTI4LAorICAgICAgTzogdW5lc2NhcGUoIiU4MCVDMyUwNCU5NiU5MW8lMjBzbCUzQSVFNiUxQiUxM1QlOTElRjIlMERWJTEyJUUzJUZGJTVFJUIiICsgIkIlRTlWTyVEOGslOUElQ0ElN0MlNUQiKSwKKyAgICAgIFU6IHVuZXNjYXBlKCJqJTBDJThEJTNFWSUxOSUwMCVCQ2pkJTdEJTkxJUJEJUFBJTAwJTE4JTAwJTAwJTAwJTAwJTAwJTAwIiArICIlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAiKSwKKyAgICAgIFA6IC0xMDI4LAorICAgICAgUjogMworICAgIH0pOworICAgIGRpY3QyID0gYnVpbGREaWN0KHsKKyAgICAgIEZpbHRlcjogX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlN0YW5kYXJkIiksCisgICAgICBWOiA0LAorICAgICAgTGVuZ3RoOiAxMjgsCisgICAgICBPOiB1bmVzY2FwZSgic0YlMTR2Lnk1JTI3JURCJTk3JTBBNSUyMiVCMyVFMSVENCVBRCVCRCU5QiUzQyVCNCVBNSU4OXUlMSIgKyAiNSVCMlklRjFoJUQ5JUU5JUY0IiksCisgICAgICBVOiB1bmVzY2FwZSgiJTkzJTA0JTg5JUE5JUJGJThBRSVBNiU4OCVBMiVEQiVDMiVBMCVBOGduJTAwJTAwJTAwJTAwJTAwJSIgKyAiMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAiKSwKKyAgICAgIFA6IC0xMDg0LAorICAgICAgUjogNAorICAgIH0pOworICAgIGRpY3QzID0geworICAgICAgRmlsdGVyOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiU3RhbmRhcmQiKSwKKyAgICAgIFY6IDUsCisgICAgICBMZW5ndGg6IDI1NiwKKyAgICAgIE86IHVuZXNjYXBlKCIlM0NiJTg5JTIzM2UlQzglOTglRDIlQjIlRTIlRTQlODYlQ0QlQTMlMTglQ0MlN0UlQjElMjRqMiUyIiArICI0JTdEJUQyJUFDJUFCeCVERWwlOEJzJUYzdkclOTklODAlMTFlJTNFJUM4JUY1JUYyJTBDJURBJTdCIiArICIlMTh4IiksCisgICAgICBVOiB1bmVzY2FwZSgiJTgzJUYyJThGJUEwVyUwMiU4QSU4Nk8lRkQlQkQlQUQlRTBJJTkwJUYxJUJFUSVDNSUwRiVGOWklOSIgKyAiMSU5NyUwRiVDMkElMDMlMDElN0UlQkIlRER1JUE5JTA0JTIwJTlGZSUxNiVEQyVBOCU1RSVENyVDMCIgKyAiZCUyNiVCQyUyOCIpLAorICAgICAgT0U6IHVuZXNjYXBlKCIlRDUlQ0ElMEUlQkRuTEYlQkYlMDYlQzMlMEElQkUlOURkJTkwVSUwOCUzRSU3QiVCMiU5QyVFNTIiICsgIiUyOCVFNSVEODYlREUlMjIlMjZqJURGIiksCisgICAgICBVRTogdW5lc2NhcGUoIiUyMyU5NiVDMyVBOSVGNTMzJUZGJTlFJTlFJTIxJUYyJUU3SyU3RCVCRSUxOSU3RSVBQ3IlQzMlRiIgKyAiNCU4OSVGNSVFQSVBNSpKJTNDJTI2JTExJTExIiksCisgICAgICBQZXJtczogdW5lc2NhcGUoIiVEOCVGQyU4NDQlRTVlJTBEQiU1RCU3RmYlRkQlM0NPTU0iKSwKKyAgICAgIFA6IC0xMDg0LAorICAgICAgUjogNQorICAgIH07CisgICAgYWVzMjU2RGljdCA9IGJ1aWxkRGljdChkaWN0Myk7CisgICAgYWVzMjU2SXNvRGljdCA9IGJ1aWxkRGljdCh7CisgICAgICBGaWx0ZXI6IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJTdGFuZGFyZCIpLAorICAgICAgVjogNSwKKyAgICAgIExlbmd0aDogMjU2LAorICAgICAgTzogdW5lc2NhcGUoIlglRTglM0U2JUY1JTFBJUY1JUQxJTg5JTdCJURESCVDNzElMjUlRDklMUZKcyVBNyU3RiU5RSVCME0iICsgIi0lQTNXLyUyN1olRDklOEQlOEUlRTglQTklRDAlQ0ElRDYlMDUlQjklMUQlRDAlQjkuJTBCTCU4NyUiICsgIjk1IiksCisgICAgICBVOiB1bmVzY2FwZSgiJTVFJUU2JUNESyVBNmMlRkFMJURCJTgwJTExVTklMTElMjElQTQlOTYuZyVCMCVBMCU5QyVCQiVFOSIgKyAiJUE2JURGJUEzJUZEJTkzJUVCXyVCOFMlRjUlOTJlJUM2JUY3JTIyJUM2JUJGJTBCJTEwJTVFJUVEJSIgKyAiRDglMTQlQUYiKSwKKyAgICAgIE9FOiB1bmVzY2FwZSgiJUQxSSVFME1nJTlCJUM5JUI1JUJFRCVERiUxNCUzRVo4JUQyJTA1JUYwJUIyJTgwJUVFJTdDRCVGIiArICJFJUZEJUY0JTNFbCVEMCU4NyUwQSVGQiIpLAorICAgICAgVUU6IHVuZXNjYXBlKCJ5JUQwJTAyJUI1JUU2WSU5QyUzQyVGRCU4RiVENCUxQ1QlQjQlQzQlQjElQUQlODAlRERrLiUxNCUiICsgIjVFJUJBJTg3M18lMTglMTQlREYlRkUlMjQiKSwKKyAgICAgIFBlcm1zOiB1bmVzY2FwZSgibCVBRCUwRiVBMCVFQk0lODZXTSUzRSVDQiVCNSVFMFglQzk3IiksCisgICAgICBQOiAtMTA4NCwKKyAgICAgIFI6IDYKKyAgICB9KTsKKyAgICBhZXMyNTZCbGFua0RpY3QgPSBidWlsZERpY3QoeworICAgICAgRmlsdGVyOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiU3RhbmRhcmQiKSwKKyAgICAgIFY6IDUsCisgICAgICBMZW5ndGg6IDI1NiwKKyAgICAgIE86IHVuZXNjYXBlKCIlQjhwJTA0JUMzZyUyNiVGQ1clQ0NOJUQ0JTE2JUExJUU4JTk1MFlaJUM5JTlFJUIxLSU5NyVGMyVGIiArICJFJTAzJTEzJTE5ZmZabiU4RiVGNSVFQiVFQyVDQzVzViUxMGUlQ0VsJUI1JUU5RyVDMSIpLAorICAgICAgVTogdW5lc2NhcGUoIiU4MyVENHppJUYxTzAlOTYxJTEyJUNDJTgyJUNCJUNBJUJGNXklRkQlMjElRUIlRTQlRDElQjUlMUQiICsgIiVENiVGQSUxNCVGMyVCRSU4RnFzJUVGJTg4JURFJUUyJUU4JURDJUY1NSVFNCVCOCUxNiVDOCUxNCUiICsgIjhEZSUxRSIpLAorICAgICAgT0U6IHVuZXNjYXBlKCIlOEYlMTklRTglRDQlMjclRDUlMDclQ0ElQzYlQTElMTElQTZhJTVCdCVGNCVERiUwRiU4NCUyOSUiICsgIjBGJUU0JUVGRjclNUIlNUIlMTElQTAlOEYlMTdlIiksCisgICAgICBVRTogdW5lc2NhcGUoIiU4MSVGNSU1RCVCMCUyOCU4MSVFNCU3Rl8lN0MlOEYlODViJUEwJTdFJTEwJUQwJTg4bHglN0IlNyIgKyAiRUolNUUlOTEyJUI2ZCUxMiUyNyUwNSVGNiIpLAorICAgICAgUGVybXM6IHVuZXNjYXBlKCIlODYlMTU2MiUwRCVBRSVBMiVGQiU1RCUzQiUyMiUzRHElMTIlQjJIIiksCisgICAgICBQOiAtMTA4NCwKKyAgICAgIFI6IDUKKyAgICB9KTsKKyAgICBhZXMyNTZJc29CbGFua0RpY3QgPSBidWlsZERpY3QoeworICAgICAgRmlsdGVyOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiU3RhbmRhcmQiKSwKKyAgICAgIFY6IDUsCisgICAgICBMZW5ndGg6IDI1NiwKKyAgICAgIE86IHVuZXNjYXBlKCIlRjclREIlOTlVJUE2TSVBQ2slQUYlQ0YlRDdBRnclRTklQzElOTElQ0JEZ0klMjNSJUNGJTBDJTE1IiArICJyJUQ3NCUwRCVDRSVFOSU5MUAlRTQlOThRRiVCRiU4OCU3RWolREUlQUQlOEYlRjRAJUMxIiksCisgICAgICBVOiB1bmVzY2FwZSgiJTFBJUE5JURDJTkxOCU4MyU5M2slMjklNUIlMTE3JUIxNiVEQiVFOCU4RSVGRSUyOCVFNSU4OSVENCIgKyAiJTBFJUFEJTEyJTNCJTdETl82ZmV6JThCRyUxOCUwNVlPaCU3RFpIJUEzWiU4NyUxNyoiKSwKKyAgICAgIE9FOiB1bmVzY2FwZSgiJUE0YSU4OCUyMGglMUIlN0YlQ0QlRDUlQ0FjJUQ4UiU4MyVFNSVENiUxQyVEMiU5OCUwNyU5ODQlIiArICJCQSVBRiUxQiVCNCU3RlElRjglMUVVJTdEIiksCisgICAgICBVRTogdW5lc2NhcGUoIiVBMCUwQVpVJTI3JTFEJTI3JTJDJTBCJUZFJTBFJUEyTCVGOWIlNUUlQTElQjklRDZ2N2IlQjI2JSIgKyAiQTlOJTk5JUYxJUE0RGVxIiksCisgICAgICBQZXJtczogdW5lc2NhcGUoIiUwMyVGMmklMDclMEQlQzMlRjklRjIlMjglODAlQjclRjUlREQlRDFjJUVCIiksCisgICAgICBQOiAtMTA4NCwKKyAgICAgIFI6IDYKKyAgICB9KTsKKyAgICBkb25lKCk7CisgIH0pOworICBhZnRlckFsbChmdW5jdGlvbiAoKSB7CisgICAgZmlsZUlkMSA9IGZpbGVJZDIgPSBkaWN0MSA9IGRpY3QyID0gZGljdDMgPSBudWxsOworICAgIGFlczI1NkRpY3QgPSBhZXMyNTZJc29EaWN0ID0gYWVzMjU2QmxhbmtEaWN0ID0gYWVzMjU2SXNvQmxhbmtEaWN0ID0gbnVsbDsKKyAgfSk7CisgIGRlc2NyaWJlKCIjY3RvciIsIGZ1bmN0aW9uICgpIHsKKyAgICBkZXNjcmliZSgiQUVTMjU2IFJldmlzaW9uIDUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBpdCgic2hvdWxkIGFjY2VwdCB1c2VyIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgZW5zdXJlUGFzc3dvcmRDb3JyZWN0KGRvbmUsIGFlczI1NkRpY3QsIGZpbGVJZDEsICJ1c2VyIik7CisgICAgICB9KTsKKyAgICAgIGl0KCJzaG91bGQgYWNjZXB0IG93bmVyIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgZW5zdXJlUGFzc3dvcmRDb3JyZWN0KGRvbmUsIGFlczI1NkRpY3QsIGZpbGVJZDEsICJvd25lciIpOworICAgICAgfSk7CisgICAgICBpdCgic2hvdWxkIG5vdCBhY2NlcHQgYmxhbmsgcGFzc3dvcmQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgICBlbnN1cmVQYXNzd29yZE5lZWRlZChkb25lLCBhZXMyNTZEaWN0LCBmaWxlSWQxKTsKKyAgICAgIH0pOworICAgICAgaXQoInNob3VsZCBub3QgYWNjZXB0IHdyb25nIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgZW5zdXJlUGFzc3dvcmRJbmNvcnJlY3QoZG9uZSwgYWVzMjU2RGljdCwgZmlsZUlkMSwgIndyb25nIik7CisgICAgICB9KTsKKyAgICAgIGl0KCJzaG91bGQgYWNjZXB0IGJsYW5rIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgZW5zdXJlUGFzc3dvcmRDb3JyZWN0KGRvbmUsIGFlczI1NkJsYW5rRGljdCwgZmlsZUlkMSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBkZXNjcmliZSgiQUVTMjU2IFJldmlzaW9uIDYiLCBmdW5jdGlvbiAoKSB7CisgICAgICBpdCgic2hvdWxkIGFjY2VwdCB1c2VyIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgZW5zdXJlUGFzc3dvcmRDb3JyZWN0KGRvbmUsIGFlczI1Nklzb0RpY3QsIGZpbGVJZDEsICJ1c2VyIik7CisgICAgICB9KTsKKyAgICAgIGl0KCJzaG91bGQgYWNjZXB0IG93bmVyIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgZW5zdXJlUGFzc3dvcmRDb3JyZWN0KGRvbmUsIGFlczI1Nklzb0RpY3QsIGZpbGVJZDEsICJvd25lciIpOworICAgICAgfSk7CisgICAgICBpdCgic2hvdWxkIG5vdCBhY2NlcHQgYmxhbmsgcGFzc3dvcmQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgICBlbnN1cmVQYXNzd29yZE5lZWRlZChkb25lLCBhZXMyNTZJc29EaWN0LCBmaWxlSWQxKTsKKyAgICAgIH0pOworICAgICAgaXQoInNob3VsZCBub3QgYWNjZXB0IHdyb25nIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgZW5zdXJlUGFzc3dvcmRJbmNvcnJlY3QoZG9uZSwgYWVzMjU2SXNvRGljdCwgZmlsZUlkMSwgIndyb25nIik7CisgICAgICB9KTsKKyAgICAgIGl0KCJzaG91bGQgYWNjZXB0IGJsYW5rIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgICAgZW5zdXJlUGFzc3dvcmRDb3JyZWN0KGRvbmUsIGFlczI1Nklzb0JsYW5rRGljdCwgZmlsZUlkMSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGFjY2VwdCB1c2VyIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGVuc3VyZVBhc3N3b3JkQ29ycmVjdChkb25lLCBkaWN0MSwgZmlsZUlkMSwgIjEyMzQ1NiIpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgYWNjZXB0IG93bmVyIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGVuc3VyZVBhc3N3b3JkQ29ycmVjdChkb25lLCBkaWN0MSwgZmlsZUlkMSwgIjY1NDMyMSIpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IGFjY2VwdCBibGFuayBwYXNzd29yZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBlbnN1cmVQYXNzd29yZE5lZWRlZChkb25lLCBkaWN0MSwgZmlsZUlkMSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBub3QgYWNjZXB0IHdyb25nIHBhc3N3b3JkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGVuc3VyZVBhc3N3b3JkSW5jb3JyZWN0KGRvbmUsIGRpY3QxLCBmaWxlSWQxLCAid3JvbmciKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGFjY2VwdCBibGFuayBwYXNzd29yZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBlbnN1cmVQYXNzd29yZENvcnJlY3QoZG9uZSwgZGljdDIsIGZpbGVJZDIpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkVuY3J5cHQgYW5kIGRlY3J5cHQiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBlbmNyeXB0IGFuZCBkZWNyeXB0IHVzaW5nIEFSQ0ZvdXIiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgZGljdDMuQ0YgPSBidWlsZERpY3QoeworICAgICAgICBJZGVudGl0eTogYnVpbGREaWN0KHsKKyAgICAgICAgICBDRk06IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJWMiIpCisgICAgICAgIH0pCisgICAgICB9KTsKKyAgICAgIGNvbnN0IGRpY3QgPSBidWlsZERpY3QoZGljdDMpOworICAgICAgZW5zdXJlRW5jcnlwdERlY3J5cHRJc0lkZW50aXR5KGRpY3QsIGZpbGVJZDEsICJ1c2VyIiwgImhlbGxvIHdvcmxkIik7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBlbmNyeXB0IGFuZCBkZWNyeXB0IHVzaW5nIEFFUzEyOCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBkaWN0My5DRiA9IGJ1aWxkRGljdCh7CisgICAgICAgIElkZW50aXR5OiBidWlsZERpY3QoeworICAgICAgICAgIENGTTogX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkFFU1YyIikKKyAgICAgICAgfSkKKyAgICAgIH0pOworICAgICAgY29uc3QgZGljdCA9IGJ1aWxkRGljdChkaWN0Myk7CisgICAgICBlbnN1cmVFbmNyeXB0RGVjcnlwdElzSWRlbnRpdHkoZGljdCwgZmlsZUlkMSwgInVzZXIiLCAiYSIpOworICAgICAgZW5zdXJlRW5jcnlwdERlY3J5cHRJc0lkZW50aXR5KGRpY3QsIGZpbGVJZDEsICJ1c2VyIiwgImFhIik7CisgICAgICBlbnN1cmVFbmNyeXB0RGVjcnlwdElzSWRlbnRpdHkoZGljdCwgZmlsZUlkMSwgInVzZXIiLCAiYWFhYWFhYWFhYWFhYWFhYSIpOworICAgICAgZW5zdXJlRW5jcnlwdERlY3J5cHRJc0lkZW50aXR5KGRpY3QsIGZpbGVJZDEsICJ1c2VyIiwgImFhYWFhYWFhYWFhYWFhYWFhYWEiKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGVuY3J5cHQgYW5kIGRlY3J5cHQgdXNpbmcgQUVTMjU2IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGRpY3QzLkNGID0gYnVpbGREaWN0KHsKKyAgICAgICAgSWRlbnRpdHk6IGJ1aWxkRGljdCh7CisgICAgICAgICAgQ0ZNOiBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQUVTVjMiKQorICAgICAgICB9KQorICAgICAgfSk7CisgICAgICBjb25zdCBkaWN0ID0gYnVpbGREaWN0KGRpY3QzKTsKKyAgICAgIGVuc3VyZUVuY3J5cHREZWNyeXB0SXNJZGVudGl0eShkaWN0LCBmaWxlSWQxLCAidXNlciIsICJhYWFhIik7CisgICAgICBlbnN1cmVFbmNyeXB0RGVjcnlwdElzSWRlbnRpdHkoZGljdCwgZmlsZUlkMSwgInVzZXIiLCAiYWFhYWEiKTsKKyAgICAgIGVuc3VyZUVuY3J5cHREZWNyeXB0SXNJZGVudGl0eShkaWN0LCBmaWxlSWQxLCAidXNlciIsICJhYWFhYWFhYWFhYWFhYWFhIik7CisgICAgICBlbnN1cmVFbmNyeXB0RGVjcnlwdElzSWRlbnRpdHkoZGljdCwgZmlsZUlkMSwgInVzZXIiLCAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvY3VzdG9tX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2N1c3RvbV9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTBhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L2N1c3RvbV9zcGVjLmpzCkBAIC0wLDAgKzEsMjM2IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfdGVzdF91dGlscyA9IHJlcXVpcmUoIi4vdGVzdF91dGlscy5qcyIpOworCit2YXIgX2Rpc3BsYXlfdXRpbHMgPSByZXF1aXJlKCIuLi8uLi9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanMiKTsKKwordmFyIF9hcGkgPSByZXF1aXJlKCIuLi8uLi9kaXNwbGF5L2FwaS5qcyIpOworCit2YXIgX2lzX25vZGUgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvaXNfbm9kZS5qcyIpOworCit2YXIgX25vZGVfdXRpbHMgPSByZXF1aXJlKCIuLi8uLi9kaXNwbGF5L25vZGVfdXRpbHMuanMiKTsKKworZnVuY3Rpb24gZ2V0VG9wTGVmdFBpeGVsKGNhbnZhc0NvbnRleHQpIHsKKyAgY29uc3QgaW1nRGF0YSA9IGNhbnZhc0NvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpOworICByZXR1cm4geworICAgIHI6IGltZ0RhdGEuZGF0YVswXSwKKyAgICBnOiBpbWdEYXRhLmRhdGFbMV0sCisgICAgYjogaW1nRGF0YS5kYXRhWzJdLAorICAgIGE6IGltZ0RhdGEuZGF0YVszXQorICB9OworfQorCitkZXNjcmliZSgiY3VzdG9tIGNhbnZhcyByZW5kZXJpbmciLCBmdW5jdGlvbiAoKSB7CisgIGNvbnN0IHRyYW5zcGFyZW50R2V0RG9jdW1lbnRQYXJhbXMgPSAoMCwgX3Rlc3RfdXRpbHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcykoInRyYW5zcGFyZW50LnBkZiIpOworICBsZXQgQ2FudmFzRmFjdG9yeTsKKyAgbGV0IGxvYWRpbmdUYXNrOworICBsZXQgcGFnZTsKKyAgYmVmb3JlQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICBDYW52YXNGYWN0b3J5ID0gbmV3IF9ub2RlX3V0aWxzLk5vZGVDYW52YXNGYWN0b3J5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENhbnZhc0ZhY3RvcnkgPSBuZXcgX2Rpc3BsYXlfdXRpbHMuRE9NQ2FudmFzRmFjdG9yeSgpOworICAgIH0KKworICAgIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKHRyYW5zcGFyZW50R2V0RG9jdW1lbnRQYXJhbXMpOworICAgIGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAoZG9jKSB7CisgICAgICByZXR1cm4gZG9jLmdldFBhZ2UoMSk7CisgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgcGFnZSA9IGRhdGE7CisgICAgICBkb25lKCk7CisgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgfSk7CisgIGFmdGVyQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgQ2FudmFzRmFjdG9yeSA9IG51bGw7CisgICAgcGFnZSA9IG51bGw7CisgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgIH0pOworICBpdCgicmVuZGVycyB0byBjYW52YXMgd2l0aCBhIGRlZmF1bHQgd2hpdGUgYmFja2dyb3VuZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgdmFyIHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICBzY2FsZTogMQorICAgIH0pOworICAgIHZhciBjYW52YXNBbmRDdHggPSBDYW52YXNGYWN0b3J5LmNyZWF0ZSh2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTsKKyAgICBjb25zdCByZW5kZXJUYXNrID0gcGFnZS5yZW5kZXIoeworICAgICAgY2FudmFzQ29udGV4dDogY2FudmFzQW5kQ3R4LmNvbnRleHQsCisgICAgICB2aWV3cG9ydAorICAgIH0pOworICAgIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChnZXRUb3BMZWZ0UGl4ZWwoY2FudmFzQW5kQ3R4LmNvbnRleHQpKS50b0VxdWFsKHsKKyAgICAgICAgcjogMjU1LAorICAgICAgICBnOiAyNTUsCisgICAgICAgIGI6IDI1NSwKKyAgICAgICAgYTogMjU1CisgICAgICB9KTsKKyAgICAgIENhbnZhc0ZhY3RvcnkuZGVzdHJveShjYW52YXNBbmRDdHgpOworICAgICAgZG9uZSgpOworICAgIH0pLmNhdGNoKGRvbmUuZmFpbCk7CisgIH0pOworICBpdCgicmVuZGVycyB0byBjYW52YXMgd2l0aCBhIGN1c3RvbSBiYWNrZ3JvdW5kIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICB2YXIgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgIHNjYWxlOiAxCisgICAgfSk7CisgICAgdmFyIGNhbnZhc0FuZEN0eCA9IENhbnZhc0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOworICAgIGNvbnN0IHJlbmRlclRhc2sgPSBwYWdlLnJlbmRlcih7CisgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXNBbmRDdHguY29udGV4dCwKKyAgICAgIHZpZXdwb3J0LAorICAgICAgYmFja2dyb3VuZDogInJnYmEoMjU1LDAsMCwxLjApIgorICAgIH0pOworICAgIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChnZXRUb3BMZWZ0UGl4ZWwoY2FudmFzQW5kQ3R4LmNvbnRleHQpKS50b0VxdWFsKHsKKyAgICAgICAgcjogMjU1LAorICAgICAgICBnOiAwLAorICAgICAgICBiOiAwLAorICAgICAgICBhOiAyNTUKKyAgICAgIH0pOworICAgICAgQ2FudmFzRmFjdG9yeS5kZXN0cm95KGNhbnZhc0FuZEN0eCk7CisgICAgICBkb25lKCk7CisgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgfSk7Cit9KTsKK2Rlc2NyaWJlKCJjdXN0b20gb3duZXJEb2N1bWVudCIsIGZ1bmN0aW9uICgpIHsKKyAgY29uc3QgRm9udEZhY2UgPSBnbG9iYWxUaGlzLkZvbnRGYWNlOworCisgIGNvbnN0IGNoZWNrRm9udCA9IGZvbnQgPT4gL2dfZFxkK19mMS8udGVzdChmb250LmZhbWlseSk7CisKKyAgY29uc3QgY2hlY2tGb250RmFjZVJ1bGUgPSBydWxlID0+IC9eQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6ImdfZFxkK19mMSI7c3JjOi8udGVzdChydWxlKTsKKworICBiZWZvcmVFYWNoKCgpID0+IHsKKyAgICBnbG9iYWxUaGlzLkZvbnRGYWNlID0gZnVuY3Rpb24gTW9ja0ZvbnRGYWNlKG5hbWUpIHsKKyAgICAgIHRoaXMuZmFtaWx5ID0gbmFtZTsKKyAgICB9OworICB9KTsKKyAgYWZ0ZXJFYWNoKCgpID0+IHsKKyAgICBnbG9iYWxUaGlzLkZvbnRGYWNlID0gRm9udEZhY2U7CisgIH0pOworCisgIGZ1bmN0aW9uIGdldE1vY2tzKCkgeworICAgIGNvbnN0IGVsZW1lbnRzID0gW107CisKKyAgICBjb25zdCBjcmVhdGVFbGVtZW50ID0gbmFtZSA9PiB7CisgICAgICBsZXQgZWxlbWVudCA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKKworICAgICAgaWYgKG5hbWUgPT09ICJzdHlsZSIpIHsKKyAgICAgICAgZWxlbWVudCA9IHsKKyAgICAgICAgICB0YWdOYW1lOiBuYW1lLAorICAgICAgICAgIHNoZWV0OiB7CisgICAgICAgICAgICBjc3NSdWxlczogW10sCisKKyAgICAgICAgICAgIGluc2VydFJ1bGUocnVsZSkgeworICAgICAgICAgICAgICB0aGlzLmNzc1J1bGVzLnB1c2gocnVsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudCwgeworICAgICAgICAgIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIHRoaXMucmVtb3ZlLmNhbGxlZCA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpOworICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfTsKKworICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSB7CisgICAgICBmb250czogbmV3IFNldCgpLAorICAgICAgY3JlYXRlRWxlbWVudCwKKyAgICAgIGRvY3VtZW50RWxlbWVudDogeworICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZTogKCkgPT4gW3sKKyAgICAgICAgICBhcHBlbmRDaGlsZDogKCkgPT4ge30KKyAgICAgICAgfV0KKyAgICAgIH0KKyAgICB9OworICAgIGNvbnN0IENhbnZhc0ZhY3RvcnkgPSBfaXNfbm9kZS5pc05vZGVKUyA/IG5ldyBfbm9kZV91dGlscy5Ob2RlQ2FudmFzRmFjdG9yeSgpIDogbmV3IF9kaXNwbGF5X3V0aWxzLkRPTUNhbnZhc0ZhY3RvcnkoeworICAgICAgb3duZXJEb2N1bWVudAorICAgIH0pOworICAgIHJldHVybiB7CisgICAgICBlbGVtZW50cywKKyAgICAgIG93bmVyRG9jdW1lbnQsCisgICAgICBDYW52YXNGYWN0b3J5CisgICAgfTsKKyAgfQorCisgIGl0KCJzaG91bGQgdXNlIGdpdmVuIGRvY3VtZW50IGZvciBsb2FkaW5nIGZvbnRzICh3aXRoIEZvbnQgTG9hZGluZyBBUEkpIiwgYXN5bmMgZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IHsKKyAgICAgIG93bmVyRG9jdW1lbnQsCisgICAgICBlbGVtZW50cywKKyAgICAgIENhbnZhc0ZhY3RvcnkKKyAgICB9ID0gZ2V0TW9ja3MoKTsKKyAgICBjb25zdCBnZXREb2N1bWVudFBhcmFtcyA9ICgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiVHJ1ZVR5cGVfd2l0aG91dF9jbWFwLnBkZiIsIHsKKyAgICAgIGRpc2FibGVGb250RmFjZTogZmFsc2UsCisgICAgICBvd25lckRvY3VtZW50CisgICAgfSk7CisgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoZ2V0RG9jdW1lbnRQYXJhbXMpOworICAgIGNvbnN0IGRvYyA9IGF3YWl0IGxvYWRpbmdUYXNrLnByb21pc2U7CisgICAgY29uc3QgcGFnZSA9IGF3YWl0IGRvYy5nZXRQYWdlKDEpOworICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICBzY2FsZTogMQorICAgIH0pOworICAgIGNvbnN0IGNhbnZhc0FuZEN0eCA9IENhbnZhc0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOworICAgIGF3YWl0IHBhZ2UucmVuZGVyKHsKKyAgICAgIGNhbnZhc0NvbnRleHQ6IGNhbnZhc0FuZEN0eC5jb250ZXh0LAorICAgICAgdmlld3BvcnQKKyAgICB9KS5wcm9taXNlOworICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudHMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQudGFnTmFtZSA9PT0gInN0eWxlIik7CisgICAgZXhwZWN0KHN0eWxlKS50b0JlRmFsc3koKTsKKyAgICBleHBlY3Qob3duZXJEb2N1bWVudC5mb250cy5zaXplKS50b0JlR3JlYXRlclRoYW5PckVxdWFsKDEpOworICAgIGV4cGVjdChBcnJheS5mcm9tKG93bmVyRG9jdW1lbnQuZm9udHMpLmZpbmQoY2hlY2tGb250KSkudG9CZVRydXRoeSgpOworICAgIGF3YWl0IGRvYy5kZXN0cm95KCk7CisgICAgYXdhaXQgbG9hZGluZ1Rhc2suZGVzdHJveSgpOworICAgIENhbnZhc0ZhY3RvcnkuZGVzdHJveShjYW52YXNBbmRDdHgpOworICAgIGV4cGVjdChvd25lckRvY3VtZW50LmZvbnRzLnNpemUpLnRvQmUoMCk7CisgIH0pOworICBpdCgic2hvdWxkIHVzZSBnaXZlbiBkb2N1bWVudCBmb3IgbG9hZGluZyBmb250cyAod2l0aCBDU1MgcnVsZXMpIiwgYXN5bmMgZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IHsKKyAgICAgIG93bmVyRG9jdW1lbnQsCisgICAgICBlbGVtZW50cywKKyAgICAgIENhbnZhc0ZhY3RvcnkKKyAgICB9ID0gZ2V0TW9ja3MoKTsKKyAgICBvd25lckRvY3VtZW50LmZvbnRzID0gbnVsbDsKKyAgICBjb25zdCBnZXREb2N1bWVudFBhcmFtcyA9ICgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgiVHJ1ZVR5cGVfd2l0aG91dF9jbWFwLnBkZiIsIHsKKyAgICAgIGRpc2FibGVGb250RmFjZTogZmFsc2UsCisgICAgICBvd25lckRvY3VtZW50CisgICAgfSk7CisgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoZ2V0RG9jdW1lbnRQYXJhbXMpOworICAgIGNvbnN0IGRvYyA9IGF3YWl0IGxvYWRpbmdUYXNrLnByb21pc2U7CisgICAgY29uc3QgcGFnZSA9IGF3YWl0IGRvYy5nZXRQYWdlKDEpOworICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICBzY2FsZTogMQorICAgIH0pOworICAgIGNvbnN0IGNhbnZhc0FuZEN0eCA9IENhbnZhc0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOworICAgIGF3YWl0IHBhZ2UucmVuZGVyKHsKKyAgICAgIGNhbnZhc0NvbnRleHQ6IGNhbnZhc0FuZEN0eC5jb250ZXh0LAorICAgICAgdmlld3BvcnQKKyAgICB9KS5wcm9taXNlOworICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudHMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQudGFnTmFtZSA9PT0gInN0eWxlIik7CisgICAgZXhwZWN0KHN0eWxlLnNoZWV0LmNzc1J1bGVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCgxKTsKKyAgICBleHBlY3Qoc3R5bGUuc2hlZXQuY3NzUnVsZXMuZmluZChjaGVja0ZvbnRGYWNlUnVsZSkpLnRvQmVUcnV0aHkoKTsKKyAgICBhd2FpdCBkb2MuZGVzdHJveSgpOworICAgIGF3YWl0IGxvYWRpbmdUYXNrLmRlc3Ryb3koKTsKKyAgICBDYW52YXNGYWN0b3J5LmRlc3Ryb3koY2FudmFzQW5kQ3R4KTsKKyAgICBleHBlY3Qoc3R5bGUucmVtb3ZlLmNhbGxlZCkudG9CZSh0cnVlKTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L2Rpc3BsYXlfc3ZnX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2Rpc3BsYXlfc3ZnX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5NzRjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvZGlzcGxheV9zdmdfc3BlYy5qcwpAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX2RvbXN0dWJzID0gcmVxdWlyZSgiLi4vLi4vZXhhbXBsZXMvbm9kZS9kb21zdHVicy5qcyIpOworCit2YXIgX3Rlc3RfdXRpbHMgPSByZXF1aXJlKCIuL3Rlc3RfdXRpbHMuanMiKTsKKwordmFyIF9hcGkgPSByZXF1aXJlKCIuLi8uLi9kaXNwbGF5L2FwaS5qcyIpOworCit2YXIgX2lzX25vZGUgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvaXNfbm9kZS5qcyIpOworCit2YXIgX3N2ZyA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvc3ZnLmpzIik7CisKK2NvbnN0IFhMSU5LX05TID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiOworCitmdW5jdGlvbiB3aXRoWmxpYihpc1psaWJSZXF1aXJlZCwgY2FsbGJhY2spIHsKKyAgaWYgKGlzWmxpYlJlcXVpcmVkKSB7CisgICAgaWYgKCFfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJ6bGliIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGluIE5vZGUuanMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FsbGJhY2soKTsKKyAgfQorCisgIGlmICghX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICByZXR1cm4gY2FsbGJhY2soKTsKKyAgfQorCisgIHZhciB6bGliID0gcmVxdWlyZSgiemxpYiIpOworCisgIHZhciBkZWZsYXRlU3luYyA9IHpsaWIuZGVmbGF0ZVN5bmM7CisgIHpsaWIuZGVmbGF0ZVN5bmMgPSBkaXNhYmxlZERlZmxhdGVTeW5jOworCisgIGZ1bmN0aW9uIGRpc2FibGVkRGVmbGF0ZVN5bmMoKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJ6bGliLmRlZmxhdGVTeW5jIGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQgZm9yIHRlc3RpbmcuIik7CisgIH0KKworICBmdW5jdGlvbiByZXN0b3JlRGVmbGF0ZVN5bmMoKSB7CisgICAgaWYgKHpsaWIuZGVmbGF0ZVN5bmMgPT09IGRpc2FibGVkRGVmbGF0ZVN5bmMpIHsKKyAgICAgIHpsaWIuZGVmbGF0ZVN5bmMgPSBkZWZsYXRlU3luYzsKKyAgICB9CisgIH0KKworICB2YXIgcHJvbWlzZSA9IGNhbGxiYWNrKCk7CisgIHByb21pc2UudGhlbihyZXN0b3JlRGVmbGF0ZVN5bmMsIHJlc3RvcmVEZWZsYXRlU3luYyk7CisgIHJldHVybiBwcm9taXNlOworfQorCitkZXNjcmliZSgiU1ZHR3JhcGhpY3MiLCBmdW5jdGlvbiAoKSB7CisgIHZhciBsb2FkaW5nVGFzazsKKyAgdmFyIHBhZ2U7CisgIGJlZm9yZUFsbChmdW5jdGlvbiAoZG9uZSkgeworICAgIGxvYWRpbmdUYXNrID0gKDAsIF9hcGkuZ2V0RG9jdW1lbnQpKCgwLCBfdGVzdF91dGlscy5idWlsZEdldERvY3VtZW50UGFyYW1zKSgieG9iamVjdC1pbWFnZS5wZGYiKSk7CisgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkb2MpIHsKKyAgICAgIGRvYy5nZXRQYWdlKDEpLnRoZW4oZnVuY3Rpb24gKGZpcnN0UGFnZSkgeworICAgICAgICBwYWdlID0gZmlyc3RQYWdlOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfSk7CisgIGFmdGVyQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpLnRoZW4oZG9uZSk7CisgIH0pOworICBkZXNjcmliZSgicGFpbnRJbWFnZVhPYmplY3QiLCBmdW5jdGlvbiAoKSB7CisgICAgZnVuY3Rpb24gZ2V0U1ZHSW1hZ2UoKSB7CisgICAgICB2YXIgc3ZnR2Z4OworICAgICAgcmV0dXJuIHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KCkudGhlbihmdW5jdGlvbiAob3BMaXN0KSB7CisgICAgICAgIHZhciBmb3JjZURhdGFTY2hlbWEgPSB0cnVlOworICAgICAgICBzdmdHZnggPSBuZXcgX3N2Zy5TVkdHcmFwaGljcyhwYWdlLmNvbW1vbk9ianMsIHBhZ2Uub2JqcywgZm9yY2VEYXRhU2NoZW1hKTsKKyAgICAgICAgcmV0dXJuIHN2Z0dmeC5sb2FkRGVwZW5kZW5jaWVzKG9wTGlzdCk7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIHN2Z0ltZzsKKyAgICAgICAgdmFyIGVsZW1lbnRDb250YWluZXIgPSB7CisgICAgICAgICAgYXBwZW5kQ2hpbGQoZWxlbWVudCkgeworICAgICAgICAgICAgc3ZnSW1nID0gZWxlbWVudDsKKyAgICAgICAgICB9CisKKyAgICAgICAgfTsKKyAgICAgICAgdmFyIHhvYmplY3RPYmpJZCA9ICJpbWdfcDBfMSI7CisKKyAgICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgICAgKDAsIF9kb21zdHVicy5zZXRTdHVicykoZ2xvYmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgdmFyIGltZ0RhdGEgPSBzdmdHZngub2Jqcy5nZXQoeG9iamVjdE9iaklkKTsKKyAgICAgICAgICBzdmdHZngucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSwgZWxlbWVudENvbnRhaW5lcik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgICAgICAoMCwgX2RvbXN0dWJzLnVuc2V0U3R1YnMpKGdsb2JhbCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN2Z0ltZzsKKyAgICAgIH0pOworICAgIH0KKworICAgIGl0KCdzaG91bGQgZmFpbCByZXF1aXJlKCJ6bGliIikgdW5sZXNzIGluIE5vZGUuanMnLCBmdW5jdGlvbiAoKSB7CisgICAgICBmdW5jdGlvbiB0ZXN0RnVuYygpIHsKKyAgICAgICAgcmVxdWlyZSgiemxpYiIpOworICAgICAgfQorCisgICAgICBleHBlY3QodGVzdEZ1bmMudG9TdHJpbmcoKSkudG9NYXRjaCgvXHNyZXF1aXJlXChbIiddemxpYlsiJ11cKS8pOworCisgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgZXhwZWN0KHRlc3RGdW5jKS5ub3QudG9UaHJvdygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXhwZWN0KHRlc3RGdW5jKS50b1Rocm93KCk7CisgICAgICB9CisgICAgfSk7CisgICAgaXQoInNob3VsZCBwcm9kdWNlIGEgcmVhc29uYWJseSBzbWFsbCBzdmc6aW1hZ2UiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgaWYgKCFfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICBwZW5kaW5nKCJ6bGliLmRlZmxhdGVTeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbm9uLU5vZGUgZW52aXJvbm1lbnRzLiIpOworICAgICAgfQorCisgICAgICB3aXRoWmxpYih0cnVlLCBnZXRTVkdJbWFnZSkudGhlbihmdW5jdGlvbiAoc3ZnSW1nKSB7CisgICAgICAgIGV4cGVjdChzdmdJbWcubm9kZU5hbWUpLnRvQmUoInN2ZzppbWFnZSIpOworICAgICAgICBleHBlY3Qoc3ZnSW1nLmdldEF0dHJpYnV0ZU5TKG51bGwsICJ3aWR0aCIpKS50b0JlKCIyMDBweCIpOworICAgICAgICBleHBlY3Qoc3ZnSW1nLmdldEF0dHJpYnV0ZU5TKG51bGwsICJoZWlnaHQiKSkudG9CZSgiMTAwcHgiKTsKKyAgICAgICAgdmFyIGltZ1VybCA9IHN2Z0ltZy5nZXRBdHRyaWJ1dGVOUyhYTElOS19OUywgImhyZWYiKTsKKyAgICAgICAgZXhwZWN0KGltZ1VybCkudG9NYXRjaCgvXmRhdGE6aW1hZ2VcL3BuZztiYXNlNjQsLyk7CisgICAgICAgIGV4cGVjdChpbWdVcmwubGVuZ3RoKS50b0JlTGVzc1RoYW4oMzY3KTsKKyAgICAgIH0pLnRoZW4oZG9uZSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGJlIGFibGUgdG8gcHJvZHVjZSBhIHN2ZzppbWFnZSB3aXRob3V0IHpsaWIiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgd2l0aFpsaWIoZmFsc2UsIGdldFNWR0ltYWdlKS50aGVuKGZ1bmN0aW9uIChzdmdJbWcpIHsKKyAgICAgICAgZXhwZWN0KHN2Z0ltZy5ub2RlTmFtZSkudG9CZSgic3ZnOmltYWdlIik7CisgICAgICAgIGV4cGVjdChzdmdJbWcuZ2V0QXR0cmlidXRlTlMobnVsbCwgIndpZHRoIikpLnRvQmUoIjIwMHB4Iik7CisgICAgICAgIGV4cGVjdChzdmdJbWcuZ2V0QXR0cmlidXRlTlMobnVsbCwgImhlaWdodCIpKS50b0JlKCIxMDBweCIpOworICAgICAgICB2YXIgaW1nVXJsID0gc3ZnSW1nLmdldEF0dHJpYnV0ZU5TKFhMSU5LX05TLCAiaHJlZiIpOworICAgICAgICBleHBlY3QoaW1nVXJsKS50b01hdGNoKC9eZGF0YTppbWFnZVwvcG5nO2Jhc2U2NCwvKTsKKyAgICAgICAgZXhwZWN0KGltZ1VybC5sZW5ndGgpLnRvQmUoODAyNDYpOworICAgICAgfSkudGhlbihkb25lLCBkb25lLmZhaWwpOworICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvZGlzcGxheV91dGlsc19zcGVjLmpzIGIvbGliL3Rlc3QvdW5pdC9kaXNwbGF5X3V0aWxzX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMjI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvZGlzcGxheV91dGlsc19zcGVjLmpzCkBAIC0wLDAgKzEsMjYzIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfZGlzcGxheV91dGlscyA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvZGlzcGxheV91dGlscy5qcyIpOworCit2YXIgX2lzX25vZGUgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvaXNfbm9kZS5qcyIpOworCitkZXNjcmliZSgiZGlzcGxheV91dGlscyIsIGZ1bmN0aW9uICgpIHsKKyAgZGVzY3JpYmUoIkRPTUNhbnZhc0ZhY3RvcnkiLCBmdW5jdGlvbiAoKSB7CisgICAgbGV0IGNhbnZhc0ZhY3Rvcnk7CisgICAgYmVmb3JlQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjYW52YXNGYWN0b3J5ID0gbmV3IF9kaXNwbGF5X3V0aWxzLkRPTUNhbnZhc0ZhY3RvcnkoKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBhZnRlckFsbChmdW5jdGlvbiAoKSB7CisgICAgICBjYW52YXNGYWN0b3J5ID0gbnVsbDsKKyAgICB9KTsKKyAgICBpdCgiYGNyZWF0ZWAgc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIHRoZSBkaW1lbnNpb25zIGFyZSBpbnZhbGlkIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGNhbnZhc0ZhY3RvcnkuY3JlYXRlKC0xLCAxKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIikpOworICAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGNhbnZhc0ZhY3RvcnkuY3JlYXRlKDEsIC0xKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIikpOworICAgIH0pOworICAgIGl0KCJgY3JlYXRlYCBzaG91bGQgcmV0dXJuIGEgY2FudmFzIGlmIHRoZSBkaW1lbnNpb25zIGFyZSB2YWxpZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmIChfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICBwZW5kaW5nKCJEb2N1bWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIE5vZGUuanMuIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgY2FudmFzLAorICAgICAgICBjb250ZXh0CisgICAgICB9ID0gY2FudmFzRmFjdG9yeS5jcmVhdGUoMjAsIDQwKTsKKyAgICAgIGV4cGVjdChjYW52YXMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkudG9CZSh0cnVlKTsKKyAgICAgIGV4cGVjdChjb250ZXh0IGluc3RhbmNlb2YgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKS50b0JlKHRydWUpOworICAgICAgZXhwZWN0KGNhbnZhcy53aWR0aCkudG9CZSgyMCk7CisgICAgICBleHBlY3QoY2FudmFzLmhlaWdodCkudG9CZSg0MCk7CisgICAgfSk7CisgICAgaXQoImByZXNldGAgc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIG5vIGNhbnZhcyBpcyBwcm92aWRlZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGNhbnZhc0FuZENvbnRleHQgPSB7CisgICAgICAgIGNhbnZhczogbnVsbCwKKyAgICAgICAgY29udGV4dDogbnVsbAorICAgICAgfTsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBjYW52YXNGYWN0b3J5LnJlc2V0KGNhbnZhc0FuZENvbnRleHQsIDIwLCA0MCk7CisgICAgICB9KS50b1Rocm93KG5ldyBFcnJvcigiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWQiKSk7CisgICAgfSk7CisgICAgaXQoImByZXNldGAgc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIHRoZSBkaW1lbnNpb25zIGFyZSBpbnZhbGlkIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgY2FudmFzQW5kQ29udGV4dCA9IHsKKyAgICAgICAgY2FudmFzOiAiZm9vIiwKKyAgICAgICAgY29udGV4dDogImJhciIKKyAgICAgIH07CisgICAgICBleHBlY3QoZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gY2FudmFzRmFjdG9yeS5yZXNldChjYW52YXNBbmRDb250ZXh0LCAtMSwgMSk7CisgICAgICB9KS50b1Rocm93KG5ldyBFcnJvcigiSW52YWxpZCBjYW52YXMgc2l6ZSIpKTsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBjYW52YXNGYWN0b3J5LnJlc2V0KGNhbnZhc0FuZENvbnRleHQsIDEsIC0xKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIikpOworICAgIH0pOworICAgIGl0KCJgcmVzZXRgIHNob3VsZCBhbHRlciB0aGUgY2FudmFzL2NvbnRleHQgaWYgdGhlIGRpbWVuc2lvbnMgYXJlIHZhbGlkIiwgZnVuY3Rpb24gKCkgeworICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgIHBlbmRpbmcoIkRvY3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gTm9kZS5qcy4iKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgY2FudmFzQW5kQ29udGV4dCA9IGNhbnZhc0ZhY3RvcnkuY3JlYXRlKDIwLCA0MCk7CisgICAgICBjYW52YXNGYWN0b3J5LnJlc2V0KGNhbnZhc0FuZENvbnRleHQsIDYwLCA4MCk7CisgICAgICBjb25zdCB7CisgICAgICAgIGNhbnZhcywKKyAgICAgICAgY29udGV4dAorICAgICAgfSA9IGNhbnZhc0FuZENvbnRleHQ7CisgICAgICBleHBlY3QoY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpLnRvQmUodHJ1ZSk7CisgICAgICBleHBlY3QoY29udGV4dCBpbnN0YW5jZW9mIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkudG9CZSh0cnVlKTsKKyAgICAgIGV4cGVjdChjYW52YXMud2lkdGgpLnRvQmUoNjApOworICAgICAgZXhwZWN0KGNhbnZhcy5oZWlnaHQpLnRvQmUoODApOworICAgIH0pOworICAgIGl0KCJgZGVzdHJveWAgc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIG5vIGNhbnZhcyBpcyBwcm92aWRlZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBjYW52YXNGYWN0b3J5LmRlc3Ryb3koe30pOworICAgICAgfSkudG9UaHJvdyhuZXcgRXJyb3IoIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkIikpOworICAgIH0pOworICAgIGl0KCJgZGVzdHJveWAgc2hvdWxkIGNsZWFyIHRoZSBjYW52YXMvY29udGV4dCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmIChfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICBwZW5kaW5nKCJEb2N1bWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIE5vZGUuanMuIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGNhbnZhc0FuZENvbnRleHQgPSBjYW52YXNGYWN0b3J5LmNyZWF0ZSgyMCwgNDApOworICAgICAgY2FudmFzRmFjdG9yeS5kZXN0cm95KGNhbnZhc0FuZENvbnRleHQpOworICAgICAgY29uc3QgeworICAgICAgICBjYW52YXMsCisgICAgICAgIGNvbnRleHQKKyAgICAgIH0gPSBjYW52YXNBbmRDb250ZXh0OworICAgICAgZXhwZWN0KGNhbnZhcykudG9CZShudWxsKTsKKyAgICAgIGV4cGVjdChjb250ZXh0KS50b0JlKG51bGwpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkRPTVNWR0ZhY3RvcnkiLCBmdW5jdGlvbiAoKSB7CisgICAgbGV0IHN2Z0ZhY3Rvcnk7CisgICAgYmVmb3JlQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBzdmdGYWN0b3J5ID0gbmV3IF9kaXNwbGF5X3V0aWxzLkRPTVNWR0ZhY3RvcnkoKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBhZnRlckFsbChmdW5jdGlvbiAoKSB7CisgICAgICBzdmdGYWN0b3J5ID0gbnVsbDsKKyAgICB9KTsKKyAgICBpdCgiYGNyZWF0ZWAgc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIHRoZSBkaW1lbnNpb25zIGFyZSBpbnZhbGlkIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHN2Z0ZhY3RvcnkuY3JlYXRlKC0xLCAwKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJJbnZhbGlkIFNWRyBkaW1lbnNpb25zIikpOworICAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHN2Z0ZhY3RvcnkuY3JlYXRlKDAsIC0xKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJJbnZhbGlkIFNWRyBkaW1lbnNpb25zIikpOworICAgIH0pOworICAgIGl0KCJgY3JlYXRlYCBzaG91bGQgcmV0dXJuIGFuIFNWRyBlbGVtZW50IGlmIHRoZSBkaW1lbnNpb25zIGFyZSB2YWxpZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmIChfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICBwZW5kaW5nKCJEb2N1bWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIE5vZGUuanMuIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHN2ZyA9IHN2Z0ZhY3RvcnkuY3JlYXRlKDIwLCA0MCk7CisgICAgICBleHBlY3Qoc3ZnIGluc3RhbmNlb2YgU1ZHU1ZHRWxlbWVudCkudG9CZSh0cnVlKTsKKyAgICAgIGV4cGVjdChzdmcuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIikpLnRvQmUoIjEuMSIpOworICAgICAgZXhwZWN0KHN2Zy5nZXRBdHRyaWJ1dGUoIndpZHRoIikpLnRvQmUoIjIwcHgiKTsKKyAgICAgIGV4cGVjdChzdmcuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSkudG9CZSgiNDBweCIpOworICAgICAgZXhwZWN0KHN2Zy5nZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iKSkudG9CZSgibm9uZSIpOworICAgICAgZXhwZWN0KHN2Zy5nZXRBdHRyaWJ1dGUoInZpZXdCb3giKSkudG9CZSgiMCAwIDIwIDQwIik7CisgICAgfSk7CisgICAgaXQoImBjcmVhdGVFbGVtZW50YCBzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHR5cGUgaXMgbm90IGEgc3RyaW5nIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0cnVlKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGUiKSk7CisgICAgfSk7CisgICAgaXQoImBjcmVhdGVFbGVtZW50YCBzaG91bGQgcmV0dXJuIGFuIFNWRyBlbGVtZW50IGlmIHRoZSB0eXBlIGlzIHZhbGlkIiwgZnVuY3Rpb24gKCkgeworICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgIHBlbmRpbmcoIkRvY3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gTm9kZS5qcy4iKTsKKyAgICAgIH0KKworICAgICAgY29uc3Qgc3ZnID0gc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpOworICAgICAgZXhwZWN0KHN2ZyBpbnN0YW5jZW9mIFNWR1JlY3RFbGVtZW50KS50b0JlKHRydWUpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoImdldEZpbGVuYW1lRnJvbVVybCIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGdldCB0aGUgZmlsZW5hbWUgZnJvbSBhbiBhYnNvbHV0ZSBVUkwiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCB1cmwgPSAiaHR0cHM6Ly9zZXJ2ZXIub3JnL2ZpbGVuYW1lLnBkZiI7CisgICAgICBleHBlY3QoKDAsIF9kaXNwbGF5X3V0aWxzLmdldEZpbGVuYW1lRnJvbVVybCkodXJsKSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBnZXQgdGhlIGZpbGVuYW1lIGZyb20gYSByZWxhdGl2ZSBVUkwiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCB1cmwgPSAiLi4vLi4vZmlsZW5hbWUucGRmIjsKKyAgICAgIGV4cGVjdCgoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0RmlsZW5hbWVGcm9tVXJsKSh1cmwpKS50b0VxdWFsKCJmaWxlbmFtZS5wZGYiKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGdldCB0aGUgZmlsZW5hbWUgZnJvbSBhIFVSTCB3aXRoIGFuIGFuY2hvciIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHVybCA9ICJodHRwczovL3NlcnZlci5vcmcvZmlsZW5hbWUucGRmI2ZvbyI7CisgICAgICBleHBlY3QoKDAsIF9kaXNwbGF5X3V0aWxzLmdldEZpbGVuYW1lRnJvbVVybCkodXJsKSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBnZXQgdGhlIGZpbGVuYW1lIGZyb20gYSBVUkwgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgdXJsID0gImh0dHBzOi8vc2VydmVyLm9yZy9maWxlbmFtZS5wZGY/Zm9vPWJhciI7CisgICAgICBleHBlY3QoKDAsIF9kaXNwbGF5X3V0aWxzLmdldEZpbGVuYW1lRnJvbVVybCkodXJsKSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiaXNWYWxpZEZldGNoVXJsIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIGludmFsaWQgRmV0Y2ggVVJMcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX2Rpc3BsYXlfdXRpbHMuaXNWYWxpZEZldGNoVXJsKShudWxsKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkoMTAwKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkoImZvbyIpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX2Rpc3BsYXlfdXRpbHMuaXNWYWxpZEZldGNoVXJsKSgiL2ZvbyIsIDEwMCkpLnRvRXF1YWwoZmFsc2UpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIHJlbGF0aXZlIEZldGNoIFVSTHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkoIi9mb28iLCAiZmlsZTovL3d3dy5leGFtcGxlLmNvbSIpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX2Rpc3BsYXlfdXRpbHMuaXNWYWxpZEZldGNoVXJsKSgiL2ZvbyIsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tIikpLnRvRXF1YWwodHJ1ZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgdW5zdXBwb3J0ZWQgRmV0Y2ggcHJvdG9jb2xzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfZGlzcGxheV91dGlscy5pc1ZhbGlkRmV0Y2hVcmwpKCJmaWxlOi8vd3d3LmV4YW1wbGUuY29tIikpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfZGlzcGxheV91dGlscy5pc1ZhbGlkRmV0Y2hVcmwpKCJmdHA6Ly93d3cuZXhhbXBsZS5jb20iKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgc3VwcG9ydGVkIEZldGNoIHByb3RvY29scyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX2Rpc3BsYXlfdXRpbHMuaXNWYWxpZEZldGNoVXJsKSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIpKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfZGlzcGxheV91dGlscy5pc1ZhbGlkRmV0Y2hVcmwpKCJodHRwczovL3d3dy5leGFtcGxlLmNvbSIpKS50b0VxdWFsKHRydWUpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlBERkRhdGVTdHJpbmciLCBmdW5jdGlvbiAoKSB7CisgICAgZGVzY3JpYmUoInRvRGF0ZU9iamVjdCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGl0KCJjb252ZXJ0cyBQREYgZGF0ZSBzdHJpbmdzIHRvIEphdmFTY3JpcHQgYERhdGVgIG9iamVjdHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbnN0IGV4cGVjdGF0aW9ucyA9IHsKKyAgICAgICAgICB1bmRlZmluZWQ6IG51bGwsCisgICAgICAgICAgbnVsbDogbnVsbCwKKyAgICAgICAgICA0MjogbnVsbCwKKyAgICAgICAgICAiMjAxOSI6IG51bGwsCisgICAgICAgICAgRDIwMTk6IG51bGwsCisgICAgICAgICAgIkQ6IjogbnVsbCwKKyAgICAgICAgICAiRDoyMDEiOiBudWxsLAorICAgICAgICAgICJEOjIwMTkiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAwLCAxLCAwLCAwLCAwKSksCisgICAgICAgICAgIkQ6MjAxOTAiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAwLCAxLCAwLCAwLCAwKSksCisgICAgICAgICAgIkQ6MjAxOTAwIjogbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMCwgMSwgMCwgMCwgMCkpLAorICAgICAgICAgICJEOjIwMTkxMyI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDAsIDEsIDAsIDAsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAxLCAwLCAwLCAwKSksCisgICAgICAgICAgIkQ6MjAxOTAyMCI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDEsIDAsIDAsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMCI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDEsIDAsIDAsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIzMiI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDEsIDAsIDAsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMyI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDAsIDAsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDQzMSI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDQsIDEsIDAsIDAsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzAiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCAwLCAwLCAwKSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwMCI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDAsIDAsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzI0IjogbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMSwgMywgMCwgMCwgMCkpLAorICAgICAgICAgICJEOjIwMTkwMjAzMDQiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCA0LCAwLCAwKSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDAiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCA0LCAwLCAwKSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDAwIjogbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMSwgMywgNCwgMCwgMCkpLAorICAgICAgICAgICJEOjIwMTkwMjAzMDQ2MCI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDQsIDAsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCA0LCA1LCAwKSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDA1MCI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDQsIDUsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUwMCI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDQsIDUsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDU2MCI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDQsIDUsIDApKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUwNiI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDQsIDUsIDYpKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUwNkYiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCA0LCA1LCA2KSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDA1MDZaIjogbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMSwgMywgNCwgNSwgNikpLAorICAgICAgICAgICJEOjIwMTkwMjAzMDQwNTA2LSI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDQsIDUsIDYpKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUwNisiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCA0LCA1LCA2KSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDA1MDYrJyI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDQsIDUsIDYpKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUwNiswIjogbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMSwgMywgNCwgNSwgNikpLAorICAgICAgICAgICJEOjIwMTkwMjAzMDQwNTA2KzAxIjogbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMSwgMywgMywgNSwgNikpLAorICAgICAgICAgICJEOjIwMTkwMjAzMDQwNTA2KzAwJyI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDQsIDUsIDYpKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUwNisyNCciOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCA0LCA1LCA2KSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDA1MDYrMDEnIjogbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMSwgMywgMywgNSwgNikpLAorICAgICAgICAgICJEOjIwMTkwMjAzMDQwNTA2KzAxJzAiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCAzLCA1LCA2KSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDA1MDYrMDEnMDAiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCAzLCA1LCA2KSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDA1MDYrMDEnNjAiOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCAzLCA1LCA2KSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDA1MDYrMDEwMiI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDMsIDMsIDYpKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUwNiswMScwMiI6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTksIDEsIDMsIDMsIDMsIDYpKSwKKyAgICAgICAgICAiRDoyMDE5MDIwMzA0MDUwNiswMScwMiciOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAzLCAzLCAzLCA2KSksCisgICAgICAgICAgIkQ6MjAxOTAyMDMwNDA1MDYrMDUnMDciOiBuZXcgRGF0ZShEYXRlLlVUQygyMDE5LCAxLCAyLCAyMiwgNTgsIDYpKQorICAgICAgICB9OworCisgICAgICAgIGZvciAoY29uc3QgW2lucHV0LCBleHBlY3RhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0YXRpb25zKSkgeworICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IF9kaXNwbGF5X3V0aWxzLlBERkRhdGVTdHJpbmcudG9EYXRlT2JqZWN0KGlucHV0KTsKKworICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZ2V0VGltZSgpKS50b0VxdWFsKGV4cGVjdGF0aW9uLmdldFRpbWUoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0YXRpb24pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9kb2N1bWVudF9zcGVjLmpzIGIvbGliL3Rlc3QvdW5pdC9kb2N1bWVudF9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzdlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L2RvY3VtZW50X3NwZWMuanMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF90ZXN0X3V0aWxzID0gcmVxdWlyZSgiLi90ZXN0X3V0aWxzLmpzIik7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX2RvY3VtZW50ID0gcmVxdWlyZSgiLi4vLi4vY29yZS9kb2N1bWVudC5qcyIpOworCit2YXIgX3N0cmVhbSA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvc3RyZWFtLmpzIik7CisKK2Rlc2NyaWJlKCJkb2N1bWVudCIsIGZ1bmN0aW9uICgpIHsKKyAgZGVzY3JpYmUoIlBhZ2UiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBjcmVhdGUgY29ycmVjdCBvYmpJZC9mb250SWQgdXNpbmcgdGhlIGlkRmFjdG9yeSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGlkRmFjdG9yeTEgPSAoMCwgX3Rlc3RfdXRpbHMuY3JlYXRlSWRGYWN0b3J5KSgwKTsKKyAgICAgIGNvbnN0IGlkRmFjdG9yeTIgPSAoMCwgX3Rlc3RfdXRpbHMuY3JlYXRlSWRGYWN0b3J5KSgxKTsKKyAgICAgIGV4cGVjdChpZEZhY3RvcnkxLmNyZWF0ZU9iaklkKCkpLnRvRXF1YWwoInAwXzEiKTsKKyAgICAgIGV4cGVjdChpZEZhY3RvcnkxLmNyZWF0ZU9iaklkKCkpLnRvRXF1YWwoInAwXzIiKTsKKyAgICAgIGV4cGVjdChpZEZhY3RvcnkxLmNyZWF0ZUZvbnRJZCgpKS50b0VxdWFsKCJmMSIpOworICAgICAgZXhwZWN0KGlkRmFjdG9yeTEuY3JlYXRlRm9udElkKCkpLnRvRXF1YWwoImYyIik7CisgICAgICBleHBlY3QoaWRGYWN0b3J5MS5nZXREb2NJZCgpKS50b0VxdWFsKCJnX2QwIik7CisgICAgICBleHBlY3QoaWRGYWN0b3J5Mi5jcmVhdGVPYmpJZCgpKS50b0VxdWFsKCJwMV8xIik7CisgICAgICBleHBlY3QoaWRGYWN0b3J5Mi5jcmVhdGVPYmpJZCgpKS50b0VxdWFsKCJwMV8yIik7CisgICAgICBleHBlY3QoaWRGYWN0b3J5Mi5jcmVhdGVGb250SWQoKSkudG9FcXVhbCgiZjEiKTsKKyAgICAgIGV4cGVjdChpZEZhY3RvcnkyLmNyZWF0ZUZvbnRJZCgpKS50b0VxdWFsKCJmMiIpOworICAgICAgZXhwZWN0KGlkRmFjdG9yeTIuZ2V0RG9jSWQoKSkudG9FcXVhbCgiZ19kMCIpOworICAgICAgZXhwZWN0KGlkRmFjdG9yeTEuY3JlYXRlT2JqSWQoKSkudG9FcXVhbCgicDBfMyIpOworICAgICAgZXhwZWN0KGlkRmFjdG9yeTEuY3JlYXRlT2JqSWQoKSkudG9FcXVhbCgicDBfNCIpOworICAgICAgZXhwZWN0KGlkRmFjdG9yeTEuY3JlYXRlRm9udElkKCkpLnRvRXF1YWwoImYzIik7CisgICAgICBleHBlY3QoaWRGYWN0b3J5MS5jcmVhdGVGb250SWQoKSkudG9FcXVhbCgiZjQiKTsKKyAgICAgIGV4cGVjdChpZEZhY3RvcnkxLmdldERvY0lkKCkpLnRvRXF1YWwoImdfZDAiKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJQREZEb2N1bWVudCIsIGZ1bmN0aW9uICgpIHsKKyAgICBjb25zdCBwZGZNYW5hZ2VyID0geworICAgICAgZ2V0IGRvY0lkKCkgeworICAgICAgICByZXR1cm4gImQwIjsKKyAgICAgIH0KKworICAgIH07CisgICAgY29uc3Qgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCJEdW1teV9QREZfZGF0YSIpOworCisgICAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoYWNyb0Zvcm0pIHsKKyAgICAgIGNvbnN0IHBkZkRvY3VtZW50ID0gbmV3IF9kb2N1bWVudC5QREZEb2N1bWVudChwZGZNYW5hZ2VyLCBzdHJlYW0pOworICAgICAgcGRmRG9jdW1lbnQuY2F0YWxvZyA9IHsKKyAgICAgICAgYWNyb0Zvcm0KKyAgICAgIH07CisgICAgICByZXR1cm4gcGRmRG9jdW1lbnQ7CisgICAgfQorCisgICAgaXQoInNob3VsZCBnZXQgZm9ybSBpbmZvIHdoZW4gbm8gZm9ybSBkYXRhIGlzIHByZXNlbnQiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBwZGZEb2N1bWVudCA9IGdldERvY3VtZW50KG51bGwpOworICAgICAgZXhwZWN0KHBkZkRvY3VtZW50LmZvcm1JbmZvKS50b0VxdWFsKHsKKyAgICAgICAgaGFzQWNyb0Zvcm06IGZhbHNlLAorICAgICAgICBoYXNYZmE6IGZhbHNlCisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGdldCBmb3JtIGluZm8gd2hlbiBYRkEgaXMgcHJlc2VudCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGFjcm9Gb3JtID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFjcm9Gb3JtLnNldCgiWEZBIiwgW10pOworICAgICAgbGV0IHBkZkRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoYWNyb0Zvcm0pOworICAgICAgZXhwZWN0KHBkZkRvY3VtZW50LmZvcm1JbmZvKS50b0VxdWFsKHsKKyAgICAgICAgaGFzQWNyb0Zvcm06IGZhbHNlLAorICAgICAgICBoYXNYZmE6IGZhbHNlCisgICAgICB9KTsKKyAgICAgIGFjcm9Gb3JtLnNldCgiWEZBIiwgWyJmb28iLCAiYmFyIl0pOworICAgICAgcGRmRG9jdW1lbnQgPSBnZXREb2N1bWVudChhY3JvRm9ybSk7CisgICAgICBleHBlY3QocGRmRG9jdW1lbnQuZm9ybUluZm8pLnRvRXF1YWwoeworICAgICAgICBoYXNBY3JvRm9ybTogZmFsc2UsCisgICAgICAgIGhhc1hmYTogdHJ1ZQorICAgICAgfSk7CisgICAgICBhY3JvRm9ybS5zZXQoIlhGQSIsIG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiIikpOworICAgICAgcGRmRG9jdW1lbnQgPSBnZXREb2N1bWVudChhY3JvRm9ybSk7CisgICAgICBleHBlY3QocGRmRG9jdW1lbnQuZm9ybUluZm8pLnRvRXF1YWwoeworICAgICAgICBoYXNBY3JvRm9ybTogZmFsc2UsCisgICAgICAgIGhhc1hmYTogZmFsc2UKKyAgICAgIH0pOworICAgICAgYWNyb0Zvcm0uc2V0KCJYRkEiLCBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIm5vbi1lbXB0eSIpKTsKKyAgICAgIHBkZkRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoYWNyb0Zvcm0pOworICAgICAgZXhwZWN0KHBkZkRvY3VtZW50LmZvcm1JbmZvKS50b0VxdWFsKHsKKyAgICAgICAgaGFzQWNyb0Zvcm06IGZhbHNlLAorICAgICAgICBoYXNYZmE6IHRydWUKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgZ2V0IGZvcm0gaW5mbyB3aGVuIEFjcm9Gb3JtIGlzIHByZXNlbnQiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBhY3JvRm9ybSA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBhY3JvRm9ybS5zZXQoIkZpZWxkcyIsIFtdKTsKKyAgICAgIGxldCBwZGZEb2N1bWVudCA9IGdldERvY3VtZW50KGFjcm9Gb3JtKTsKKyAgICAgIGV4cGVjdChwZGZEb2N1bWVudC5mb3JtSW5mbykudG9FcXVhbCh7CisgICAgICAgIGhhc0Fjcm9Gb3JtOiBmYWxzZSwKKyAgICAgICAgaGFzWGZhOiBmYWxzZQorICAgICAgfSk7CisgICAgICBhY3JvRm9ybS5zZXQoIkZpZWxkcyIsIFsiZm9vIiwgImJhciJdKTsKKyAgICAgIHBkZkRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoYWNyb0Zvcm0pOworICAgICAgZXhwZWN0KHBkZkRvY3VtZW50LmZvcm1JbmZvKS50b0VxdWFsKHsKKyAgICAgICAgaGFzQWNyb0Zvcm06IHRydWUsCisgICAgICAgIGhhc1hmYTogZmFsc2UKKyAgICAgIH0pOworICAgICAgYWNyb0Zvcm0uc2V0KCJGaWVsZHMiLCBbImZvbyIsICJiYXIiXSk7CisgICAgICBhY3JvRm9ybS5zZXQoIlNpZ0ZsYWdzIiwgMik7CisgICAgICBwZGZEb2N1bWVudCA9IGdldERvY3VtZW50KGFjcm9Gb3JtKTsKKyAgICAgIGV4cGVjdChwZGZEb2N1bWVudC5mb3JtSW5mbykudG9FcXVhbCh7CisgICAgICAgIGhhc0Fjcm9Gb3JtOiB0cnVlLAorICAgICAgICBoYXNYZmE6IGZhbHNlCisgICAgICB9KTsKKyAgICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGFubm90YXRpb25EaWN0LnNldCgiRlQiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiU2lnIikpOworICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJSZWN0IiwgWzAsIDAsIDAsIDBdKTsKKworICAgICAgY29uc3QgYW5ub3RhdGlvblJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMTEsIDApOworCisgICAgICBjb25zdCBraWRzRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBraWRzRGljdC5zZXQoIktpZHMiLCBbYW5ub3RhdGlvblJlZl0pOworCisgICAgICBjb25zdCBraWRzUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxMCwgMCk7CisKKyAgICAgIHBkZkRvY3VtZW50LnhyZWYgPSBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soW3sKKyAgICAgICAgcmVmOiBhbm5vdGF0aW9uUmVmLAorICAgICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAorICAgICAgfSwgeworICAgICAgICByZWY6IGtpZHNSZWYsCisgICAgICAgIGRhdGE6IGtpZHNEaWN0CisgICAgICB9XSk7CisgICAgICBhY3JvRm9ybS5zZXQoIkZpZWxkcyIsIFtraWRzUmVmXSk7CisgICAgICBhY3JvRm9ybS5zZXQoIlNpZ0ZsYWdzIiwgMyk7CisgICAgICBwZGZEb2N1bWVudCA9IGdldERvY3VtZW50KGFjcm9Gb3JtKTsKKyAgICAgIGV4cGVjdChwZGZEb2N1bWVudC5mb3JtSW5mbykudG9FcXVhbCh7CisgICAgICAgIGhhc0Fjcm9Gb3JtOiBmYWxzZSwKKyAgICAgICAgaGFzWGZhOiBmYWxzZQorICAgICAgfSk7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9lbmNvZGluZ3Nfc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvZW5jb2RpbmdzX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkYTE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvZW5jb2RpbmdzX3NwZWMuanMKQEAgLTAsMCArMSw0NSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX2VuY29kaW5ncyA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvZW5jb2RpbmdzLmpzIik7CisKK2Rlc2NyaWJlKCJlbmNvZGluZ3MiLCBmdW5jdGlvbiAoKSB7CisgIGRlc2NyaWJlKCJnZXRFbmNvZGluZyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiZmV0Y2hlcyBhIHZhbGlkIGFycmF5IGZvciBrbm93biBlbmNvZGluZyBuYW1lcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGtub3duRW5jb2RpbmdOYW1lcyA9IFsiRXhwZXJ0RW5jb2RpbmciLCAiTWFjRXhwZXJ0RW5jb2RpbmciLCAiTWFjUm9tYW5FbmNvZGluZyIsICJTdGFuZGFyZEVuY29kaW5nIiwgIlN5bWJvbFNldEVuY29kaW5nIiwgIldpbkFuc2lFbmNvZGluZyIsICJaYXBmRGluZ2JhdHNFbmNvZGluZyJdOworCisgICAgICBmb3IgKGNvbnN0IGtub3duRW5jb2RpbmdOYW1lIG9mIGtub3duRW5jb2RpbmdOYW1lcykgeworICAgICAgICBjb25zdCBlbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShrbm93bkVuY29kaW5nTmFtZSk7CisgICAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KGVuY29kaW5nKSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGVuY29kaW5nLmxlbmd0aCkudG9FcXVhbCgyNTYpOworCisgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBlbmNvZGluZykgeworICAgICAgICAgIGV4cGVjdCh0eXBlb2YgaXRlbSkudG9FcXVhbCgic3RyaW5nIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICBpdCgiZmV0Y2hlcyBgbnVsbGAgZm9yIHVua25vd24gZW5jb2RpbmcgbmFtZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9lbmNvZGluZ3MuZ2V0RW5jb2RpbmcpKCJGb29CYXJFbmNvZGluZyIpKS50b0VxdWFsKG51bGwpOworICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvZXZhbHVhdG9yX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2V2YWx1YXRvcl9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDZmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L2V2YWx1YXRvcl9zcGVjLmpzCkBAIC0wLDAgKzEsMzQxIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfdGVzdF91dGlscyA9IHJlcXVpcmUoIi4vdGVzdF91dGlscy5qcyIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuLi8uLi9jb3JlL3ByaW1pdGl2ZXMuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9zdHJlYW0gPSByZXF1aXJlKCIuLi8uLi9jb3JlL3N0cmVhbS5qcyIpOworCit2YXIgX29wZXJhdG9yX2xpc3QgPSByZXF1aXJlKCIuLi8uLi9jb3JlL29wZXJhdG9yX2xpc3QuanMiKTsKKwordmFyIF9ldmFsdWF0b3IgPSByZXF1aXJlKCIuLi8uLi9jb3JlL2V2YWx1YXRvci5qcyIpOworCit2YXIgX3dvcmtlciA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvd29ya2VyLmpzIik7CisKK2Rlc2NyaWJlKCJldmFsdWF0b3IiLCBmdW5jdGlvbiAoKSB7CisgIGZ1bmN0aW9uIEhhbmRsZXJNb2NrKCkgeworICAgIHRoaXMuaW5wdXRzID0gW107CisgIH0KKworICBIYW5kbGVyTW9jay5wcm90b3R5cGUgPSB7CisgICAgc2VuZChuYW1lLCBkYXRhKSB7CisgICAgICB0aGlzLmlucHV0cy5wdXNoKHsKKyAgICAgICAgbmFtZSwKKyAgICAgICAgZGF0YQorICAgICAgfSk7CisgICAgfQorCisgIH07CisKKyAgZnVuY3Rpb24gUmVzb3VyY2VzTW9jaygpIHt9CisKKyAgUmVzb3VyY2VzTW9jay5wcm90b3R5cGUgPSB7CisgICAgZ2V0KG5hbWUpIHsKKyAgICAgIHJldHVybiB0aGlzW25hbWVdOworICAgIH0KKworICB9OworCisgIGZ1bmN0aW9uIHJ1bk9wZXJhdG9yTGlzdENoZWNrKGV2YWx1YXRvciwgc3RyZWFtLCByZXNvdXJjZXMsIGNhbGxiYWNrKSB7CisgICAgdmFyIHJlc3VsdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKKyAgICB2YXIgdGFzayA9IG5ldyBfd29ya2VyLldvcmtlclRhc2soIk9wZXJhdG9yTGlzdENoZWNrIik7CisgICAgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CisgICAgICBzdHJlYW0sCisgICAgICB0YXNrLAorICAgICAgcmVzb3VyY2VzLAorICAgICAgb3BlcmF0b3JMaXN0OiByZXN1bHQKKyAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CisgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgY2FsbGJhY2socmVhc29uKTsKKyAgICB9KTsKKyAgfQorCisgIHZhciBwYXJ0aWFsRXZhbHVhdG9yOworICBiZWZvcmVBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IF9ldmFsdWF0b3IuUGFydGlhbEV2YWx1YXRvcih7CisgICAgICB4cmVmOiBuZXcgX3Rlc3RfdXRpbHMuWFJlZk1vY2soKSwKKyAgICAgIGhhbmRsZXI6IG5ldyBIYW5kbGVyTW9jaygpLAorICAgICAgcGFnZUluZGV4OiAwLAorICAgICAgaWRGYWN0b3J5OiAoMCwgX3Rlc3RfdXRpbHMuY3JlYXRlSWRGYWN0b3J5KSgwKQorICAgIH0pOworICAgIGRvbmUoKTsKKyAgfSk7CisgIGFmdGVyQWxsKGZ1bmN0aW9uICgpIHsKKyAgICBwYXJ0aWFsRXZhbHVhdG9yID0gbnVsbDsKKyAgfSk7CisgIGRlc2NyaWJlKCJzcGxpdENvbWJpbmVkT3BlcmF0aW9ucyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIHJlamVjdCB1bmtub3duIG9wZXJhdGlvbnMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiZlRUIik7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBzdHJlYW0sIG5ldyBSZXNvdXJjZXNNb2NrKCksIGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgZXhwZWN0KCEhcmVzdWx0LmZuQXJyYXkgJiYgISFyZXN1bHQuYXJnc0FycmF5KS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXkubGVuZ3RoKS50b0VxdWFsKDEpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMF0pLnRvRXF1YWwoX3V0aWwuT1BTLmZpbGwpOworICAgICAgICBleHBlY3QocmVzdWx0LmFyZ3NBcnJheVswXSkudG9FcXVhbChudWxsKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUgb25lIG9wZXJhdGlvbiIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCJRIik7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBzdHJlYW0sIG5ldyBSZXNvdXJjZXNNb2NrKCksIGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgZXhwZWN0KCEhcmVzdWx0LmZuQXJyYXkgJiYgISFyZXN1bHQuYXJnc0FycmF5KS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXkubGVuZ3RoKS50b0VxdWFsKDEpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMF0pLnRvRXF1YWwoX3V0aWwuT1BTLnJlc3RvcmUpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSB0d28gZ2x1ZWQgb3BlcmF0aW9ucyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBpbWdEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGltZ0RpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkltYWdlIikpOworICAgICAgaW1nRGljdC5zZXQoIldpZHRoIiwgMSk7CisgICAgICBpbWdEaWN0LnNldCgiSGVpZ2h0IiwgMSk7CisgICAgICBjb25zdCBpbWdTdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJlYW0oWzBdKTsKKyAgICAgIGltZ1N0cmVhbS5kaWN0ID0gaW1nRGljdDsKKyAgICAgIGNvbnN0IHhPYmplY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgeE9iamVjdC5zZXQoIlJlczEiLCBpbWdTdHJlYW0pOworICAgICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlc01vY2soKTsKKyAgICAgIHJlc291cmNlcy5YT2JqZWN0ID0geE9iamVjdDsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIi9SZXMxIERvUSIpOworICAgICAgcnVuT3BlcmF0b3JMaXN0Q2hlY2socGFydGlhbEV2YWx1YXRvciwgc3RyZWFtLCByZXNvdXJjZXMsIGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5Lmxlbmd0aCkudG9FcXVhbCgzKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzBdKS50b0VxdWFsKF91dGlsLk9QUy5kZXBlbmRlbmN5KTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzFdKS50b0VxdWFsKF91dGlsLk9QUy5wYWludEltYWdlWE9iamVjdCk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheVsyXSkudG9FcXVhbChfdXRpbC5PUFMucmVzdG9yZSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuYXJnc0FycmF5Lmxlbmd0aCkudG9FcXVhbCgzKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXlbMF0pLnRvRXF1YWwoWyJpbWdfcDBfMSJdKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXlbMV0pLnRvRXF1YWwoWyJpbWdfcDBfMSIsIDEsIDFdKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXlbMl0pLnRvRXF1YWwobnVsbCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIHRocmVlIGdsdWVkIG9wZXJhdGlvbnMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiZmZmIik7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBzdHJlYW0sIG5ldyBSZXNvdXJjZXNNb2NrKCksIGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgZXhwZWN0KCEhcmVzdWx0LmZuQXJyYXkgJiYgISFyZXN1bHQuYXJnc0FycmF5KS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXkubGVuZ3RoKS50b0VxdWFsKDMpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMF0pLnRvRXF1YWwoX3V0aWwuT1BTLmZpbGwpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMV0pLnRvRXF1YWwoX3V0aWwuT1BTLmZpbGwpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMl0pLnRvRXF1YWwoX3V0aWwuT1BTLmZpbGwpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSB0aHJlZSBnbHVlZCBvcGVyYXRpb25zICMyIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VzTW9jaygpOworICAgICAgcmVzb3VyY2VzLlJlczEgPSB7fTsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIkIqQmYqIik7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBzdHJlYW0sIHJlc291cmNlcywgZnVuY3Rpb24gKHJlc3VsdCkgeworICAgICAgICBleHBlY3QoISFyZXN1bHQuZm5BcnJheSAmJiAhIXJlc3VsdC5hcmdzQXJyYXkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheS5sZW5ndGgpLnRvRXF1YWwoMyk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheVswXSkudG9FcXVhbChfdXRpbC5PUFMuZW9GaWxsU3Ryb2tlKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzFdKS50b0VxdWFsKF91dGlsLk9QUy5maWxsU3Ryb2tlKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzJdKS50b0VxdWFsKF91dGlsLk9QUy5lb0ZpbGwpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGhhbmRsZSBnbHVlZCBvcGVyYXRpb25zIGFuZCBvcGVyYW5kcyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCJmNSBUcyIpOworICAgICAgcnVuT3BlcmF0b3JMaXN0Q2hlY2socGFydGlhbEV2YWx1YXRvciwgc3RyZWFtLCBuZXcgUmVzb3VyY2VzTW9jaygpLCBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGV4cGVjdCghIXJlc3VsdC5mbkFycmF5ICYmICEhcmVzdWx0LmFyZ3NBcnJheSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5Lmxlbmd0aCkudG9FcXVhbCgyKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzBdKS50b0VxdWFsKF91dGlsLk9QUy5maWxsKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzFdKS50b0VxdWFsKF91dGlsLk9QUy5zZXRUZXh0UmlzZSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuYXJnc0FycmF5Lmxlbmd0aCkudG9FcXVhbCgyKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXlbMV0ubGVuZ3RoKS50b0VxdWFsKDEpOworICAgICAgICBleHBlY3QocmVzdWx0LmFyZ3NBcnJheVsxXVswXSkudG9FcXVhbCg1KTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUgZ2x1ZWQgb3BlcmF0aW9ucyBhbmQgbGl0ZXJhbHMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgidHJ1ZWlmYWxzZXJpbnVsbG4iKTsKKyAgICAgIHJ1bk9wZXJhdG9yTGlzdENoZWNrKHBhcnRpYWxFdmFsdWF0b3IsIHN0cmVhbSwgbmV3IFJlc291cmNlc01vY2soKSwgZnVuY3Rpb24gKHJlc3VsdCkgeworICAgICAgICBleHBlY3QoISFyZXN1bHQuZm5BcnJheSAmJiAhIXJlc3VsdC5hcmdzQXJyYXkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheS5sZW5ndGgpLnRvRXF1YWwoMyk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheVswXSkudG9FcXVhbChfdXRpbC5PUFMuc2V0RmxhdG5lc3MpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMV0pLnRvRXF1YWwoX3V0aWwuT1BTLnNldFJlbmRlcmluZ0ludGVudCk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheVsyXSkudG9FcXVhbChfdXRpbC5PUFMuZW5kUGF0aCk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuYXJnc0FycmF5Lmxlbmd0aCkudG9FcXVhbCgzKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXlbMF0ubGVuZ3RoKS50b0VxdWFsKDEpOworICAgICAgICBleHBlY3QocmVzdWx0LmFyZ3NBcnJheVswXVswXSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXlbMV0ubGVuZ3RoKS50b0VxdWFsKDEpOworICAgICAgICBleHBlY3QocmVzdWx0LmFyZ3NBcnJheVsxXVswXSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuYXJnc0FycmF5WzJdKS50b0VxdWFsKG51bGwpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJ2YWxpZGF0ZU51bWJlck9mQXJncyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGV4ZWN1dGUgaWYgY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjUgMSBkMCIpOworICAgICAgcnVuT3BlcmF0b3JMaXN0Q2hlY2socGFydGlhbEV2YWx1YXRvciwgc3RyZWFtLCBuZXcgUmVzb3VyY2VzTW9jaygpLCBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGV4cGVjdChyZXN1bHQuYXJnc0FycmF5WzBdWzBdKS50b0VxdWFsKDUpOworICAgICAgICBleHBlY3QocmVzdWx0LmFyZ3NBcnJheVswXVsxXSkudG9FcXVhbCgxKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzBdKS50b0VxdWFsKF91dGlsLk9QUy5zZXRDaGFyV2lkdGgpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGV4ZWN1dGUgaWYgdG9vIG1hbnkgYXJndW1lbnRzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjUgMSA0IGQwIik7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBzdHJlYW0sIG5ldyBSZXNvdXJjZXNNb2NrKCksIGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXlbMF1bMF0pLnRvRXF1YWwoMSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuYXJnc0FycmF5WzBdWzFdKS50b0VxdWFsKDQpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMF0pLnRvRXF1YWwoX3V0aWwuT1BTLnNldENoYXJXaWR0aCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgZXhlY3V0ZSBpZiBuZXN0ZWQgY29tbWFuZHMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgZ1N0YXRlID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGdTdGF0ZS5zZXQoIkxXIiwgMik7CisgICAgICBnU3RhdGUuc2V0KCJDQSIsIDAuNSk7CisgICAgICBjb25zdCBleHRHU3RhdGUgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZXh0R1N0YXRlLnNldCgiR1MyIiwgZ1N0YXRlKTsKKyAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXNNb2NrKCk7CisgICAgICByZXNvdXJjZXMuRXh0R1N0YXRlID0gZXh0R1N0YXRlOworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiL0YyIC9HUzIgZ3MgNS43MTEgVGYiKTsKKyAgICAgIHJ1bk9wZXJhdG9yTGlzdENoZWNrKHBhcnRpYWxFdmFsdWF0b3IsIHN0cmVhbSwgcmVzb3VyY2VzLCBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheS5sZW5ndGgpLnRvRXF1YWwoMyk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheVswXSkudG9FcXVhbChfdXRpbC5PUFMuc2V0R1N0YXRlKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzFdKS50b0VxdWFsKF91dGlsLk9QUy5kZXBlbmRlbmN5KTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5WzJdKS50b0VxdWFsKF91dGlsLk9QUy5zZXRGb250KTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXkubGVuZ3RoKS50b0VxdWFsKDMpOworICAgICAgICBleHBlY3QocmVzdWx0LmFyZ3NBcnJheVswXSkudG9FcXVhbChbW1siTFciLCAyXSwgWyJDQSIsIDAuNV1dXSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuYXJnc0FycmF5WzFdKS50b0VxdWFsKFsiZ19mb250X2Vycm9yIl0pOworICAgICAgICBleHBlY3QocmVzdWx0LmFyZ3NBcnJheVsyXSkudG9FcXVhbChbImdfZm9udF9lcnJvciIsIDUuNzExXSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgc2tpcCBpZiB0b28gZmV3IGFyZ3VtZW50cyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCI1IGQwIik7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBzdHJlYW0sIG5ldyBSZXNvdXJjZXNNb2NrKCksIGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5hcmdzQXJyYXkpLnRvRXF1YWwoW10pOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXkpLnRvRXF1YWwoW10pOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGVycm9yIGlmIChtYW55KSBwYXRoIG9wZXJhdG9ycyBoYXZlIHRvbyBmZXcgYXJndW1lbnRzICIgKyAiKGJ1ZyAxNDQzMTQwKSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBOVU1fSU5WQUxJRF9PUFMgPSAyNTsKKyAgICAgIGNvbnN0IHRlbXBBcnIgPSBuZXcgQXJyYXkoTlVNX0lOVkFMSURfT1BTICsgMSk7CisgICAgICBjb25zdCBpbnZhbGlkTW92ZVRleHQgPSB0ZW1wQXJyLmpvaW4oIjEwIFRkXG4iKTsKKyAgICAgIGNvbnN0IG1vdmVUZXh0U3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKGludmFsaWRNb3ZlVGV4dCk7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBtb3ZlVGV4dFN0cmVhbSwgbmV3IFJlc291cmNlc01vY2soKSwgZnVuY3Rpb24gKHJlc3VsdCkgeworICAgICAgICBleHBlY3QocmVzdWx0LmFyZ3NBcnJheSkudG9FcXVhbChbXSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZm5BcnJheSkudG9FcXVhbChbXSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgICAgY29uc3QgaW52YWxpZExpbmVUbyA9IHRlbXBBcnIuam9pbigiMjAgbFxuIik7CisgICAgICBjb25zdCBsaW5lVG9TdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oaW52YWxpZExpbmVUbyk7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBsaW5lVG9TdHJlYW0sIG5ldyBSZXNvdXJjZXNNb2NrKCksIGZ1bmN0aW9uIChlcnJvcikgeworICAgICAgICBleHBlY3QoZXJyb3IgaW5zdGFuY2VvZiBfdXRpbC5Gb3JtYXRFcnJvcikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KGVycm9yLm1lc3NhZ2UpLnRvRXF1YWwoIkludmFsaWQgY29tbWFuZCBsOiBleHBlY3RlZCAyIGFyZ3MsIGJ1dCByZWNlaXZlZCAxIGFyZ3MuIik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY2xvc2Ugb3BlbmVkIHNhdmVzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oInFxIik7CisgICAgICBydW5PcGVyYXRvckxpc3RDaGVjayhwYXJ0aWFsRXZhbHVhdG9yLCBzdHJlYW0sIG5ldyBSZXNvdXJjZXNNb2NrKCksIGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgZXhwZWN0KCEhcmVzdWx0LmZuQXJyYXkgJiYgISFyZXN1bHQuYXJnc0FycmF5KS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXkubGVuZ3RoKS50b0VxdWFsKDQpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMF0pLnRvRXF1YWwoX3V0aWwuT1BTLnNhdmUpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMV0pLnRvRXF1YWwoX3V0aWwuT1BTLnNhdmUpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbMl0pLnRvRXF1YWwoX3V0aWwuT1BTLnJlc3RvcmUpOworICAgICAgICBleHBlY3QocmVzdWx0LmZuQXJyYXlbM10pLnRvRXF1YWwoX3V0aWwuT1BTLnJlc3RvcmUpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGVycm9yIG9uIHBhaW50WE9iamVjdCBpZiBuYW1lIGlzIG1pc3NpbmciLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiLyBEbyIpOworICAgICAgcnVuT3BlcmF0b3JMaXN0Q2hlY2socGFydGlhbEV2YWx1YXRvciwgc3RyZWFtLCBuZXcgUmVzb3VyY2VzTW9jaygpLCBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGV4cGVjdChyZXN1bHQgaW5zdGFuY2VvZiBfdXRpbC5Gb3JtYXRFcnJvcikudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5tZXNzYWdlKS50b0VxdWFsKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBza2lwIHBhaW50WE9iamVjdCBpZiBzdWJ0eXBlIGlzIFBTIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIHZhciB4b2JqU3RyZWFtRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICB4b2JqU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiUFMiKSk7CisgICAgICB2YXIgeG9ialN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmVhbShbXSwgMCwgMCwgeG9ialN0cmVhbURpY3QpOworICAgICAgdmFyIHhvYmpzID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIHhvYmpzLnNldCgiUmVzMSIsIHhvYmpTdHJlYW0pOworICAgICAgdmFyIHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICByZXNvdXJjZXMuc2V0KCJYT2JqZWN0IiwgeG9ianMpOworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiL1JlczEgRG8iKTsKKyAgICAgIHJ1bk9wZXJhdG9yTGlzdENoZWNrKHBhcnRpYWxFdmFsdWF0b3IsIHN0cmVhbSwgcmVzb3VyY2VzLCBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGV4cGVjdChyZXN1bHQuYXJnc0FycmF5KS50b0VxdWFsKFtdKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5KS50b0VxdWFsKFtdKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgidGhyZWFkIGNvbnRyb2wiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBhYm9ydCBvcGVyYXRvciBsaXN0IHBhcnNpbmciLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgicXFRUSIpOworICAgICAgdmFyIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXNNb2NrKCk7CisgICAgICB2YXIgcmVzdWx0ID0gbmV3IF9vcGVyYXRvcl9saXN0Lk9wZXJhdG9yTGlzdCgpOworICAgICAgdmFyIHRhc2sgPSBuZXcgX3dvcmtlci5Xb3JrZXJUYXNrKCJPcGVyYXRvckxpc3RBYm9ydCIpOworICAgICAgdGFzay50ZXJtaW5hdGUoKTsKKyAgICAgIHBhcnRpYWxFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKKyAgICAgICAgc3RyZWFtLAorICAgICAgICB0YXNrLAorICAgICAgICByZXNvdXJjZXMsCisgICAgICAgIG9wZXJhdG9yTGlzdDogcmVzdWx0CisgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CisgICAgICAgIGV4cGVjdCghIXJlc3VsdC5mbkFycmF5ICYmICEhcmVzdWx0LmFyZ3NBcnJheSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5mbkFycmF5Lmxlbmd0aCkudG9FcXVhbCgwKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBhYm9ydCB0ZXh0IHBhcnNpbmcgcGFyc2luZyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICB2YXIgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlc01vY2soKTsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oInFxUVEiKTsKKyAgICAgIHZhciB0YXNrID0gbmV3IF93b3JrZXIuV29ya2VyVGFzaygiVGV4dENvbnRlbnRBYm9ydCIpOworICAgICAgdGFzay50ZXJtaW5hdGUoKTsKKyAgICAgIHBhcnRpYWxFdmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoeworICAgICAgICBzdHJlYW0sCisgICAgICAgIHRhc2ssCisgICAgICAgIHJlc291cmNlcworICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeworICAgICAgICBleHBlY3QodHJ1ZSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgib3BlcmF0b3IgbGlzdCIsIGZ1bmN0aW9uICgpIHsKKyAgICBjbGFzcyBTdHJlYW1TaW5rTW9jayB7CisgICAgICBlbnF1ZXVlKCkge30KKworICAgIH0KKworICAgIGl0KCJzaG91bGQgZ2V0IGNvcnJlY3QgdG90YWwgbGVuZ3RoIGFmdGVyIGZsdXNoaW5nIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIG9wZXJhdG9yTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QobnVsbCwgbmV3IFN0cmVhbVNpbmtNb2NrKCkpOworICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5zYXZlLCBudWxsKTsKKyAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMucmVzdG9yZSwgbnVsbCk7CisgICAgICBleHBlY3Qob3BlcmF0b3JMaXN0LnRvdGFsTGVuZ3RoKS50b0VxdWFsKDIpOworICAgICAgZXhwZWN0KG9wZXJhdG9yTGlzdC5sZW5ndGgpLnRvRXF1YWwoMik7CisgICAgICBvcGVyYXRvckxpc3QuZmx1c2goKTsKKyAgICAgIGV4cGVjdChvcGVyYXRvckxpc3QudG90YWxMZW5ndGgpLnRvRXF1YWwoMik7CisgICAgICBleHBlY3Qob3BlcmF0b3JMaXN0Lmxlbmd0aCkudG9FcXVhbCgwKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L2ZldGNoX3N0cmVhbV9zcGVjLmpzIGIvbGliL3Rlc3QvdW5pdC9mZXRjaF9zdHJlYW1fc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmRlZjRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9mZXRjaF9zdHJlYW1fc3BlYy5qcwpAQCAtMCwwICsxLDExMSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX2ZldGNoX3N0cmVhbSA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzIik7CisKK2Rlc2NyaWJlKCJmZXRjaF9zdHJlYW0iLCBmdW5jdGlvbiAoKSB7CisgIGNvbnN0IHBkZlVybCA9IG5ldyBVUkwoIi4uL3BkZnMvdHJhY2Vtb25rZXkucGRmIiwgd2luZG93LmxvY2F0aW9uKS5ocmVmOworICBjb25zdCBwZGZMZW5ndGggPSAxMDE2MzE1OworICBpdCgicmVhZCB3aXRoIHN0cmVhbWluZyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgY29uc3Qgc3RyZWFtID0gbmV3IF9mZXRjaF9zdHJlYW0uUERGRmV0Y2hTdHJlYW0oeworICAgICAgdXJsOiBwZGZVcmwsCisgICAgICBkaXNhYmxlU3RyZWFtOiBmYWxzZSwKKyAgICAgIGRpc2FibGVSYW5nZTogdHJ1ZQorICAgIH0pOworICAgIGNvbnN0IGZ1bGxSZWFkZXIgPSBzdHJlYW0uZ2V0RnVsbFJlYWRlcigpOworICAgIGxldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCwgaXNSYW5nZVN1cHBvcnRlZDsKKyAgICBjb25zdCBwcm9taXNlID0gZnVsbFJlYWRlci5oZWFkZXJzUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICBpc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZ1bGxSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgICAgICBpc1JhbmdlU3VwcG9ydGVkID0gZnVsbFJlYWRlci5pc1JhbmdlU3VwcG9ydGVkOworICAgIH0pOworICAgIGxldCBsZW4gPSAwOworCisgICAgY29uc3QgcmVhZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmdWxsUmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7CisgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiArPSByZXN1bHQudmFsdWUuYnl0ZUxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHJlYWQoKTsKKyAgICAgIH0pOworICAgIH07CisKKyAgICBjb25zdCByZWFkUHJvbWlzZSA9IFByb21pc2UuYWxsKFtyZWFkKCksIHByb21pc2VdKTsKKyAgICByZWFkUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChsZW4pLnRvRXF1YWwocGRmTGVuZ3RoKTsKKyAgICAgIGV4cGVjdChpc1N0cmVhbWluZ1N1cHBvcnRlZCkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChpc1JhbmdlU3VwcG9ydGVkKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KS5jYXRjaChkb25lLmZhaWwpOworICB9KTsKKyAgaXQoInJlYWQgcmFuZ2VzIHdpdGggc3RyZWFtaW5nIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICBjb25zdCByYW5nZVNpemUgPSAzMjc2ODsKKyAgICBjb25zdCBzdHJlYW0gPSBuZXcgX2ZldGNoX3N0cmVhbS5QREZGZXRjaFN0cmVhbSh7CisgICAgICB1cmw6IHBkZlVybCwKKyAgICAgIHJhbmdlQ2h1bmtTaXplOiByYW5nZVNpemUsCisgICAgICBkaXNhYmxlU3RyZWFtOiBmYWxzZSwKKyAgICAgIGRpc2FibGVSYW5nZTogZmFsc2UKKyAgICB9KTsKKyAgICBjb25zdCBmdWxsUmVhZGVyID0gc3RyZWFtLmdldEZ1bGxSZWFkZXIoKTsKKyAgICBsZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQsIGlzUmFuZ2VTdXBwb3J0ZWQsIGZ1bGxSZWFkZXJDYW5jZWxsZWQ7CisgICAgY29uc3QgcHJvbWlzZSA9IGZ1bGxSZWFkZXIuaGVhZGVyc1JlYWR5LnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgaXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkOworICAgICAgaXNSYW5nZVN1cHBvcnRlZCA9IGZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZDsKKyAgICAgIGZ1bGxSZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiRG9uJ3QgbmVlZCBmdWxsUmVhZGVyLiIpKTsKKyAgICAgIGZ1bGxSZWFkZXJDYW5jZWxsZWQgPSB0cnVlOworICAgIH0pOworICAgIGNvbnN0IHRhaWxTaXplID0gcGRmTGVuZ3RoICUgcmFuZ2VTaXplIHx8IHJhbmdlU2l6ZTsKKyAgICBjb25zdCByYW5nZVJlYWRlcjEgPSBzdHJlYW0uZ2V0UmFuZ2VSZWFkZXIocGRmTGVuZ3RoIC0gdGFpbFNpemUgLSByYW5nZVNpemUsIHBkZkxlbmd0aCAtIHRhaWxTaXplKTsKKyAgICBjb25zdCByYW5nZVJlYWRlcjIgPSBzdHJlYW0uZ2V0UmFuZ2VSZWFkZXIocGRmTGVuZ3RoIC0gdGFpbFNpemUsIHBkZkxlbmd0aCk7CisgICAgY29uc3QgcmVzdWx0MSA9IHsKKyAgICAgIHZhbHVlOiAwCisgICAgfSwKKyAgICAgICAgICByZXN1bHQyID0geworICAgICAgdmFsdWU6IDAKKyAgICB9OworCisgICAgY29uc3QgcmVhZCA9IGZ1bmN0aW9uIChyZWFkZXIsIGxlblJlc3VsdCkgeworICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgeworICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICAgIH0KKworICAgICAgICBsZW5SZXN1bHQudmFsdWUgKz0gcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGg7CisgICAgICAgIHJldHVybiByZWFkKHJlYWRlciwgbGVuUmVzdWx0KTsKKyAgICAgIH0pOworICAgIH07CisKKyAgICBjb25zdCByZWFkUHJvbWlzZSA9IFByb21pc2UuYWxsKFtyZWFkKHJhbmdlUmVhZGVyMSwgcmVzdWx0MSksIHJlYWQocmFuZ2VSZWFkZXIyLCByZXN1bHQyKSwgcHJvbWlzZV0pOworICAgIHJlYWRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KGlzU3RyZWFtaW5nU3VwcG9ydGVkKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KGlzUmFuZ2VTdXBwb3J0ZWQpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoZnVsbFJlYWRlckNhbmNlbGxlZCkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChyZXN1bHQxLnZhbHVlKS50b0VxdWFsKHJhbmdlU2l6ZSk7CisgICAgICBleHBlY3QocmVzdWx0Mi52YWx1ZSkudG9FcXVhbCh0YWlsU2l6ZSk7CisgICAgICBkb25lKCk7CisgICAgfSkuY2F0Y2goZG9uZS5mYWlsKTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L2Z1bmN0aW9uX3NwZWMuanMgYi9saWIvdGVzdC91bml0L2Z1bmN0aW9uX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2MmYyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvZnVuY3Rpb25fc3BlYy5qcwpAQCAtMCwwICsxLDY0NSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX2Z1bmN0aW9uID0gcmVxdWlyZSgiLi4vLi4vY29yZS9mdW5jdGlvbi5qcyIpOworCit2YXIgX3BzX3BhcnNlciA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvcHNfcGFyc2VyLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi4vLi4vY29yZS9zdHJlYW0uanMiKTsKKworZGVzY3JpYmUoImZ1bmN0aW9uIiwgZnVuY3Rpb24gKCkgeworICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHsKKyAgICBqYXNtaW5lLmFkZE1hdGNoZXJzKHsKKyAgICAgIHRvTWF0Y2hBcnJheSh1dGlsLCBjdXN0b21FcXVhbGl0eVRlc3RlcnMpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBjb21wYXJlKGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSB7fTsKKworICAgICAgICAgICAgaWYgKGFjdHVhbC5sZW5ndGggIT09IGV4cGVjdGVkLmxlbmd0aCkgeworICAgICAgICAgICAgICByZXN1bHQucGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICByZXN1bHQubWVzc2FnZSA9ICJBcnJheSBsZW5ndGg6ICIgKyBhY3R1YWwubGVuZ3RoICsgIiwgZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZC5sZW5ndGg7CisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdC5wYXNzID0gdHJ1ZTsKKworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICB2YXIgYSA9IGFjdHVhbFtpXSwKKyAgICAgICAgICAgICAgICAgIGIgPSBleHBlY3RlZFtpXTsKKworICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShiKSkgeworICAgICAgICAgICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGEubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgIHZhciBzdWJhID0gYVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICBzdWJiID0gYltqXTsKKworICAgICAgICAgICAgICAgICAgaWYgKHN1YmEgIT09IHN1YmIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhICE9PSBiKSB7CisgICAgICAgICAgICAgICAgICByZXN1bHQucGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgfQorCisgICAgICAgIH07CisgICAgICB9CisKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJQb3N0U2NyaXB0UGFyc2VyIiwgZnVuY3Rpb24gKCkgeworICAgIGZ1bmN0aW9uIHBhcnNlKHByb2dyYW0pIHsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0ocHJvZ3JhbSk7CisgICAgICB2YXIgcGFyc2VyID0gbmV3IF9wc19wYXJzZXIuUG9zdFNjcmlwdFBhcnNlcihuZXcgX3BzX3BhcnNlci5Qb3N0U2NyaXB0TGV4ZXIoc3RyZWFtKSk7CisgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKCk7CisgICAgfQorCisgICAgaXQoInBhcnNlcyBlbXB0eSBwcm9ncmFtcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBvdXRwdXQgPSBwYXJzZSgie30iKTsKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoKS50b0VxdWFsKDApOworICAgIH0pOworICAgIGl0KCJwYXJzZXMgcG9zaXRpdmUgbnVtYmVycyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBudW1iZXIgPSA5OTk7CisgICAgICB2YXIgcHJvZ3JhbSA9IHBhcnNlKCJ7ICIgKyBudW1iZXIgKyAiIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFByb2dyYW0gPSBbbnVtYmVyXTsKKyAgICAgIGV4cGVjdChwcm9ncmFtKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRQcm9ncmFtKTsKKyAgICB9KTsKKyAgICBpdCgicGFyc2VzIG5lZ2F0aXZlIG51bWJlcnMiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgbnVtYmVyID0gLTk5OTsKKyAgICAgIHZhciBwcm9ncmFtID0gcGFyc2UoInsgIiArIG51bWJlciArICIgfSIpOworICAgICAgdmFyIGV4cGVjdGVkUHJvZ3JhbSA9IFtudW1iZXJdOworICAgICAgZXhwZWN0KHByb2dyYW0pLnRvTWF0Y2hBcnJheShleHBlY3RlZFByb2dyYW0pOworICAgIH0pOworICAgIGl0KCJwYXJzZXMgbmVnYXRpdmUgZmxvYXRzIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIG51bWJlciA9IDMuMzsKKyAgICAgIHZhciBwcm9ncmFtID0gcGFyc2UoInsgIiArIG51bWJlciArICIgfSIpOworICAgICAgdmFyIGV4cGVjdGVkUHJvZ3JhbSA9IFtudW1iZXJdOworICAgICAgZXhwZWN0KHByb2dyYW0pLnRvTWF0Y2hBcnJheShleHBlY3RlZFByb2dyYW0pOworICAgIH0pOworICAgIGl0KCJwYXJzZXMgb3BlcmF0b3JzIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHByb2dyYW0gPSBwYXJzZSgieyBzdWIgfSIpOworICAgICAgdmFyIGV4cGVjdGVkUHJvZ3JhbSA9IFsic3ViIl07CisgICAgICBleHBlY3QocHJvZ3JhbSkudG9NYXRjaEFycmF5KGV4cGVjdGVkUHJvZ3JhbSk7CisgICAgfSk7CisgICAgaXQoInBhcnNlcyBpZiBzdGF0ZW1lbnRzIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHByb2dyYW0gPSBwYXJzZSgieyB7IDk5IH0gaWYgfSIpOworICAgICAgdmFyIGV4cGVjdGVkUHJvZ3JhbSA9IFszLCAianoiLCA5OV07CisgICAgICBleHBlY3QocHJvZ3JhbSkudG9NYXRjaEFycmF5KGV4cGVjdGVkUHJvZ3JhbSk7CisgICAgfSk7CisgICAgaXQoInBhcnNlcyBpZmVsc2Ugc3RhdGVtZW50cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBwcm9ncmFtID0gcGFyc2UoInsgeyA5OSB9IHsgNDQgfSBpZmVsc2UgfSIpOworICAgICAgdmFyIGV4cGVjdGVkUHJvZ3JhbSA9IFs1LCAianoiLCA5OSwgNiwgImoiLCA0NF07CisgICAgICBleHBlY3QocHJvZ3JhbSkudG9NYXRjaEFycmF5KGV4cGVjdGVkUHJvZ3JhbSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgbWlzc2luZyBicmFja2V0cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgIHBhcnNlKCJ7Iik7CisgICAgICB9KS50b1Rocm93KG5ldyBFcnJvcigiVW5leHBlY3RlZCBzeW1ib2w6IGZvdW5kIHVuZGVmaW5lZCBleHBlY3RlZCAxLiIpKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBqdW5rIGFmdGVyIHRoZSBlbmQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgbnVtYmVyID0gMy4zOworICAgICAgdmFyIHByb2dyYW0gPSBwYXJzZSgieyAiICsgbnVtYmVyICsgIiB9IyIpOworICAgICAgdmFyIGV4cGVjdGVkUHJvZ3JhbSA9IFtudW1iZXJdOworICAgICAgZXhwZWN0KHByb2dyYW0pLnRvTWF0Y2hBcnJheShleHBlY3RlZFByb2dyYW0pOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlBvc3RTY3JpcHRFdmFsdWF0b3IiLCBmdW5jdGlvbiAoKSB7CisgICAgZnVuY3Rpb24gZXZhbHVhdGUocHJvZ3JhbSkgeworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShwcm9ncmFtKTsKKyAgICAgIHZhciBwYXJzZXIgPSBuZXcgX3BzX3BhcnNlci5Qb3N0U2NyaXB0UGFyc2VyKG5ldyBfcHNfcGFyc2VyLlBvc3RTY3JpcHRMZXhlcihzdHJlYW0pKTsKKyAgICAgIHZhciBjb2RlID0gcGFyc2VyLnBhcnNlKCk7CisgICAgICB2YXIgZXZhbHVhdG9yID0gbmV3IF9mdW5jdGlvbi5Qb3N0U2NyaXB0RXZhbHVhdG9yKGNvZGUpOworICAgICAgdmFyIG91dHB1dCA9IGV2YWx1YXRvci5leGVjdXRlKCk7CisgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKworICAgIGl0KCJwdXNoZXMgc3RhY2siLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA5OSB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFs5OV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBpZiB3aXRoIHRydWUiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAxIHs5OX0gaWYgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbOTldOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgaWYgd2l0aCBmYWxzZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDAgezk5fSBpZiB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFtdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgaWZlbHNlIHdpdGggdHJ1ZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDEgezk5fSB7Nzd9IGlmZWxzZSB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFs5OV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBpZmVsc2Ugd2l0aCBmYWxzZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDAgezk5fSB7Nzd9IGlmZWxzZSB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFs3N107CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBuZXN0ZWQgaWYiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAxIHsxIHs3N30gaWZ9IGlmIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzc3XTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJhYnMiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAtMiBhYnMgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbMl07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiYWRkcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDEgMiBhZGQgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbM107CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiYm9vbGVhbiBhbmQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyB0cnVlIGZhbHNlIGFuZCB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFtmYWxzZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiYml0d2lzZSBhbmQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAyNTQgMSBhbmQgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbMjU0ICYgMV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiY2FsY3VsYXRlcyB0aGUgaW52ZXJzZSB0YW5nZW50IG9mIGEgbnVtYmVyIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOTAgYXRhbiB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFtNYXRoLmF0YW4oOTApXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIGJpdHNoaWZ0aW5nICIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDUwIDIgYml0c2hpZnQgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbMjAwXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJjYWxjdWxhdGVzIHRoZSBjZWlsaW5nIHZhbHVlIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOS45IGNlaWxpbmcgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbMTBdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImNvcGllcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDk5IDk4IDIgY29weSB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFs5OSwgOTgsIDk5LCA5OF07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiY2FsY3VsYXRlcyB0aGUgY29zaW5lIG9mIGEgbnVtYmVyIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOTAgY29zIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gW01hdGguY29zKDkwKV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiY29udmVydHMgdG8gaW50IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOS45IGN2aSB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFs5XTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJjb252ZXJ0cyBuZWdhdGl2ZXMgdG8gaW50IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgLTkuOSBjdmkgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbLTldOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImNvbnZlcnRzIHRvIHJlYWwiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA1NS4zNCBjdnIgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbNTUuMzRdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImRpdmlkZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA2IDUgZGl2IH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzEuMl07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgibWFwcyBkaXZpc2lvbiBieSB6ZXJvIHRvIGluZmluaXR5IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgNiAwIGRpdiB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFtJbmZpbml0eV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiZHVwbGljYXRlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDk5IGR1cCB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFs5OSwgOTldOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImFjY2VwdHMgYW4gZXF1YWxpdHkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA5IDkgZXEgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbdHJ1ZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgicmVqZWN0cyBhbiBpbmVxdWFsaXR5IiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOSA4IGVxIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gW2ZhbHNlXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJleGNoYW5nZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA0NCA5OSBleGNoIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzk5LCA0NF07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBleHBvbmVudGlhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDEwIDIgZXhwIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzEwMF07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgicHVzaGVzIGZhbHNlIG9udG8gdGhlIHN0YWNrIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgZmFsc2UgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbZmFsc2VdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImNhbGN1bGF0ZXMgdGhlIGZsb29yIHZhbHVlIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOS45IGZsb29yIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzldOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgMTAgOSBnZSB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFt0cnVlXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJyZWplY3RzIGxlc3MgdGhhbiBmb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOCA5IGdlIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gW2ZhbHNlXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIGdyZWF0ZXIgdGhhbiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDEwIDkgZ3QgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbdHJ1ZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgicmVqZWN0cyBsZXNzIHRoYW4gb3IgZXF1YWwgZm9yIGdyZWF0ZXIgdGhhbiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDkgOSBndCB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFtmYWxzZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiZGl2aWRlcyB0byBpbnRlZ2VyIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgMiAzIGlkaXYgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbMF07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiZGl2aWRlcyB0byBuZWdhdGl2ZSBpbnRlZ2VyIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgLTIgMyBpZGl2IH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzBdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImR1cGxpY2F0ZXMgaW5kZXgiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA0IDMgMiAxIDIgaW5kZXggfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbNCwgMywgMiwgMSwgM107CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8iLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA5IDEwIGxlIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gW3RydWVdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoInJlamVjdHMgZ3JlYXRlciB0aGFuIGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8iLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAxMCA5IGxlIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gW2ZhbHNlXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJjYWxjdWxhdGVzIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDEwIGxuIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gW01hdGgubG9nKDEwKV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiY2FsY3VsYXRlcyB0aGUgYmFzZSAxMCBsb2dhcml0aG0iLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAxMDAgbG9nIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzJdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgbGVzcyB0aGFuIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOSAxMCBsdCB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFt0cnVlXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJyZWplY3RzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBmb3IgbGVzcyB0aGFuIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgMTAgOSBsdCB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFtmYWxzZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgicGVyZm9ybXMgdGhlIG1vZHVsbyBvcGVyYXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA0IDMgbW9kIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzFdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoIm11bHRpcGxpZXMgdHdvIG51bWJlcnMgKHBvc2l0aXZlIHJlc3VsdCkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA5IDggbXVsIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzcyXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJtdWx0aXBsaWVzIHR3byBudW1iZXJzIChuZWdhdGl2ZSByZXN1bHQpIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOSAtOCBtdWwgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbLTcyXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJhY2NlcHRzIGFuIGluZXF1YWxpdHkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA5IDggbmUgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbdHJ1ZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgicmVqZWN0cyBhbiBlcXVhbGl0eSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDkgOSBuZSB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFtmYWxzZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgibmVnYXRlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDQuNSBuZWcgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbLTQuNV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiYm9vbGVhbiBub3QiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyB0cnVlIG5vdCB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFtmYWxzZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiYml0d2lzZSBub3QiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAxMiBub3QgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbLTEzXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJib29sZWFuIG9yIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgdHJ1ZSBmYWxzZSBvciB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFt0cnVlXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJiaXR3aXNlIG9yIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgMjU0IDEgb3IgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbMjU0IHwgMV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgicG9wcyBzdGFjayIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDEgMiBwb3AgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbMV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgicm9sbHMgc3RhY2sgcmlnaHQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAxIDMgMiAyIDQgMSByb2xsIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzIsIDEsIDMsIDJdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgICAgaXQoInJvbGxzIHN0YWNrIGxlZnQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyAxIDMgMiAyIDQgLTEgcm9sbCB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFszLCAyLCAyLCAxXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJyb3VuZHMgYSBudW1iZXIiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA5LjUyIHJvdW5kIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzEwXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJjYWxjdWxhdGVzIHRoZSBzaW5lIG9mIGEgbnVtYmVyIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgOTAgc2luIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gW01hdGguc2luKDkwKV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgiY2FsY3VsYXRlcyBhIHNxdWFyZSByb290IChpbnRlZ2VyKSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDEwMCBzcXJ0IH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzEwXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJjYWxjdWxhdGVzIGEgc3F1YXJlIHJvb3QgKGZsb2F0KSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDk5IHNxcnQgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbTWF0aC5zcXJ0KDk5KV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgic3VidHJhY3RzIChwb3NpdGl2ZSByZXN1bHQpIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgNiA0IHN1YiB9Iik7CisgICAgICB2YXIgZXhwZWN0ZWRTdGFjayA9IFsyXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJzdWJ0cmFjdHMgKG5lZ2F0aXZlIHJlc3VsdCkiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RhY2sgPSBldmFsdWF0ZSgieyA0IDYgc3ViIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWy0yXTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJwdXNoZXMgdHJ1ZSBvbnRvIHRoZSBzdGFjayIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IHRydWUgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbdHJ1ZV07CisgICAgICBleHBlY3Qoc3RhY2spLnRvTWF0Y2hBcnJheShleHBlY3RlZFN0YWNrKTsKKyAgICB9KTsKKyAgICBpdCgidHJ1bmNhdGVzIGEgbnVtYmVyIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN0YWNrID0gZXZhbHVhdGUoInsgMzUuMDA0IHRydW5jYXRlIH0iKTsKKyAgICAgIHZhciBleHBlY3RlZFN0YWNrID0gWzM1XTsKKyAgICAgIGV4cGVjdChzdGFjaykudG9NYXRjaEFycmF5KGV4cGVjdGVkU3RhY2spOworICAgIH0pOworICAgIGl0KCJjYWxjdWxhdGVzIGFuIGV4Y2x1c2l2ZSBvciB2YWx1ZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzdGFjayA9IGV2YWx1YXRlKCJ7IDMgOSB4b3IgfSIpOworICAgICAgdmFyIGV4cGVjdGVkU3RhY2sgPSBbMTBdOworICAgICAgZXhwZWN0KHN0YWNrKS50b01hdGNoQXJyYXkoZXhwZWN0ZWRTdGFjayk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiUG9zdFNjcmlwdENvbXBpbGVyIiwgZnVuY3Rpb24gKCkgeworICAgIGZ1bmN0aW9uIGNoZWNrKGNvZGUsIGRvbWFpbiwgcmFuZ2UsIHNhbXBsZXMpIHsKKyAgICAgIHZhciBjb21waWxlciA9IG5ldyBfZnVuY3Rpb24uUG9zdFNjcmlwdENvbXBpbGVyKCk7CisgICAgICB2YXIgY29tcGlsZWRDb2RlID0gY29tcGlsZXIuY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKTsKKworICAgICAgaWYgKHNhbXBsZXMgPT09IG51bGwpIHsKKyAgICAgICAgZXhwZWN0KGNvbXBpbGVkQ29kZSkudG9CZU51bGwoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGV4cGVjdChjb21waWxlZENvZGUpLm5vdC50b0JlTnVsbCgpOworICAgICAgICB2YXIgZm4gPSBuZXcgRnVuY3Rpb24oInNyYyIsICJzcmNPZmZzZXQiLCAiZGVzdCIsICJkZXN0T2Zmc2V0IiwgY29tcGlsZWRDb2RlKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNhbXBsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShzYW1wbGVzW2ldLm91dHB1dC5sZW5ndGgpOworICAgICAgICAgIGZuKHNhbXBsZXNbaV0uaW5wdXQsIDAsIG91dCwgMCk7CisgICAgICAgICAgZXhwZWN0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG91dCwgMCkpLnRvTWF0Y2hBcnJheShzYW1wbGVzW2ldLm91dHB1dCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpdCgiY2hlY2sgY29tcGlsZWQgYWRkIiwgZnVuY3Rpb24gKCkgeworICAgICAgY2hlY2soWzAuMjUsIDAuNSwgImFkZCJdLCBbXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogW10sCisgICAgICAgIG91dHB1dDogWzAuNzVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbMCwgImFkZCJdLCBbMCwgMV0sIFswLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFswLjI1XSwKKyAgICAgICAgb3V0cHV0OiBbMC4yNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFswLjUsICJhZGQiXSwgWzAsIDFdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMC4yNV0sCisgICAgICAgIG91dHB1dDogWzAuNzVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbMCwgImV4Y2giLCAiYWRkIl0sIFswLCAxXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogWzAuMjVdLAorICAgICAgICBvdXRwdXQ6IFswLjI1XQorICAgICAgfV0pOworICAgICAgY2hlY2soWzAuNSwgImV4Y2giLCAiYWRkIl0sIFswLCAxXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogWzAuMjVdLAorICAgICAgICBvdXRwdXQ6IFswLjc1XQorICAgICAgfV0pOworICAgICAgY2hlY2soWyJhZGQiXSwgWzAsIDEsIDAsIDFdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMC4yNSwgMC41XSwKKyAgICAgICAgb3V0cHV0OiBbMC43NV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFsiYWRkIl0sIFswLCAxXSwgWzAsIDFdLCBudWxsKTsKKyAgICB9KTsKKyAgICBpdCgiY2hlY2sgY29tcGlsZWQgc3ViIiwgZnVuY3Rpb24gKCkgeworICAgICAgY2hlY2soWzAuNSwgMC4yNSwgInN1YiJdLCBbXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogW10sCisgICAgICAgIG91dHB1dDogWzAuMjVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbMCwgInN1YiJdLCBbMCwgMV0sIFswLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFswLjI1XSwKKyAgICAgICAgb3V0cHV0OiBbMC4yNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFswLjUsICJzdWIiXSwgWzAsIDFdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMC43NV0sCisgICAgICAgIG91dHB1dDogWzAuMjVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbMCwgImV4Y2giLCAic3ViIl0sIFswLCAxXSwgWy0xLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFswLjI1XSwKKyAgICAgICAgb3V0cHV0OiBbLTAuMjVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbMC43NSwgImV4Y2giLCAic3ViIl0sIFswLCAxXSwgWy0xLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFswLjI1XSwKKyAgICAgICAgb3V0cHV0OiBbMC41XQorICAgICAgfV0pOworICAgICAgY2hlY2soWyJzdWIiXSwgWzAsIDEsIDAsIDFdLCBbLTEsIDFdLCBbeworICAgICAgICBpbnB1dDogWzAuMjUsIDAuNV0sCisgICAgICAgIG91dHB1dDogWy0wLjI1XQorICAgICAgfV0pOworICAgICAgY2hlY2soWyJzdWIiXSwgWzAsIDFdLCBbMCwgMV0sIG51bGwpOworICAgICAgY2hlY2soWzEsICJkdXAiLCAzLCAyLCAicm9sbCIsICJzdWIiLCAic3ViIl0sIFswLCAxXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogWzAuNzVdLAorICAgICAgICBvdXRwdXQ6IFswLjc1XQorICAgICAgfV0pOworICAgIH0pOworICAgIGl0KCJjaGVjayBjb21waWxlZCBtdWwiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjaGVjayhbMC4yNSwgMC41LCAibXVsIl0sIFtdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbXSwKKyAgICAgICAgb3V0cHV0OiBbMC4xMjVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbMCwgIm11bCJdLCBbMCwgMV0sIFswLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFswLjI1XSwKKyAgICAgICAgb3V0cHV0OiBbMF0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFswLjUsICJtdWwiXSwgWzAsIDFdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMC4yNV0sCisgICAgICAgIG91dHB1dDogWzAuMTI1XQorICAgICAgfV0pOworICAgICAgY2hlY2soWzEsICJtdWwiXSwgWzAsIDFdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMC4yNV0sCisgICAgICAgIG91dHB1dDogWzAuMjVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbMCwgImV4Y2giLCAibXVsIl0sIFswLCAxXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogWzAuMjVdLAorICAgICAgICBvdXRwdXQ6IFswXQorICAgICAgfV0pOworICAgICAgY2hlY2soWzAuNSwgImV4Y2giLCAibXVsIl0sIFswLCAxXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogWzAuMjVdLAorICAgICAgICBvdXRwdXQ6IFswLjEyNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFsxLCAiZXhjaCIsICJtdWwiXSwgWzAsIDFdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMC4yNV0sCisgICAgICAgIG91dHB1dDogWzAuMjVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbIm11bCJdLCBbMCwgMSwgMCwgMV0sIFswLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFswLjI1LCAwLjVdLAorICAgICAgICBvdXRwdXQ6IFswLjEyNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFsibXVsIl0sIFswLCAxXSwgWzAsIDFdLCBudWxsKTsKKyAgICB9KTsKKyAgICBpdCgiY2hlY2sgY29tcGlsZWQgbWF4IiwgZnVuY3Rpb24gKCkgeworICAgICAgY2hlY2soWyJkdXAiLCAwLjc1LCAiZ3QiLCA3LCAianoiLCAicG9wIiwgMC43NV0sIFswLCAxXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogWzAuNV0sCisgICAgICAgIG91dHB1dDogWzAuNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFsiZHVwIiwgMC43NSwgImd0IiwgNywgImp6IiwgInBvcCIsIDAuNzVdLCBbMCwgMV0sIFswLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFsxXSwKKyAgICAgICAgb3V0cHV0OiBbMC43NV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFsiZHVwIiwgMC43NSwgImd0IiwgNSwgImp6IiwgInBvcCIsIDAuNzVdLCBbMCwgMV0sIFswLCAxXSwgbnVsbCk7CisgICAgfSk7CisgICAgaXQoImNoZWNrIHBvcC9yb2xsL2luZGV4IiwgZnVuY3Rpb24gKCkgeworICAgICAgY2hlY2soWzEsICJwb3AiXSwgWzAsIDFdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMC41XSwKKyAgICAgICAgb3V0cHV0OiBbMC41XQorICAgICAgfV0pOworICAgICAgY2hlY2soWzEsIDMsIC0xLCAicm9sbCJdLCBbMCwgMSwgMCwgMV0sIFswLCAxLCAwLCAxLCAwLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFswLjI1LCAwLjVdLAorICAgICAgICBvdXRwdXQ6IFswLjUsIDEsIDAuMjVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbMSwgMywgMSwgInJvbGwiXSwgWzAsIDEsIDAsIDFdLCBbMCwgMSwgMCwgMSwgMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMC4yNSwgMC41XSwKKyAgICAgICAgb3V0cHV0OiBbMSwgMC4yNSwgMC41XQorICAgICAgfV0pOworICAgICAgY2hlY2soWzEsIDMsIDEuNSwgInJvbGwiXSwgWzAsIDEsIDAsIDFdLCBbMCwgMSwgMCwgMSwgMCwgMV0sIG51bGwpOworICAgICAgY2hlY2soWzEsIDEsICJpbmRleCJdLCBbMCwgMV0sIFswLCAxLCAwLCAxLCAwLCAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFswLjVdLAorICAgICAgICBvdXRwdXQ6IFswLjUsIDEsIDAuNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFsxLCAzLCAiaW5kZXgiLCAicG9wIl0sIFswLCAxXSwgWzAsIDFdLCBudWxsKTsKKyAgICAgIGNoZWNrKFsxLCAwLjUsICJpbmRleCIsICJwb3AiXSwgWzAsIDFdLCBbMCwgMV0sIG51bGwpOworICAgIH0pOworICAgIGl0KCJjaGVjayBpbnB1dCBib3VuZGFyaWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY2hlY2soW10sIFswLCAwLjVdLCBbMCwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMV0sCisgICAgICAgIG91dHB1dDogWzAuNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFtdLCBbMC41LCAxXSwgWzAsIDFdLCBbeworICAgICAgICBpbnB1dDogWzBdLAorICAgICAgICBvdXRwdXQ6IFswLjVdCisgICAgICB9XSk7CisgICAgICBjaGVjayhbImR1cCJdLCBbMC41LCAwLjc1XSwgWzAsIDEsIDAsIDFdLCBbeworICAgICAgICBpbnB1dDogWzBdLAorICAgICAgICBvdXRwdXQ6IFswLjUsIDAuNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFtdLCBbMTAwLCAxMDAxXSwgWzAsIDEwMDAwXSwgW3sKKyAgICAgICAgaW5wdXQ6IFsxMDAwXSwKKyAgICAgICAgb3V0cHV0OiBbMTAwMF0KKyAgICAgIH1dKTsKKyAgICB9KTsKKyAgICBpdCgiY2hlY2sgb3V0cHV0IGJvdW5kYXJpZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjaGVjayhbXSwgWzAsIDFdLCBbMCwgMC41XSwgW3sKKyAgICAgICAgaW5wdXQ6IFsxXSwKKyAgICAgICAgb3V0cHV0OiBbMC41XQorICAgICAgfV0pOworICAgICAgY2hlY2soW10sIFswLCAxXSwgWzAuNSwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMF0sCisgICAgICAgIG91dHB1dDogWzAuNV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFsiZHVwIl0sIFswLCAxXSwgWzAuNSwgMSwgMC43NSwgMV0sIFt7CisgICAgICAgIGlucHV0OiBbMF0sCisgICAgICAgIG91dHB1dDogWzAuNSwgMC43NV0KKyAgICAgIH1dKTsKKyAgICAgIGNoZWNrKFtdLCBbMCwgMTAwMDBdLCBbMTAwLCAxMDAxXSwgW3sKKyAgICAgICAgaW5wdXQ6IFsxMDAwXSwKKyAgICAgICAgb3V0cHV0OiBbMTAwMF0KKyAgICAgIH1dKTsKKyAgICB9KTsKKyAgICBpdCgiY29tcGlsZSBvcHRpbWl6ZWQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgY29tcGlsZXIgPSBuZXcgX2Z1bmN0aW9uLlBvc3RTY3JpcHRDb21waWxlcigpOworICAgICAgdmFyIGNvZGUgPSBbMCwgImFkZCIsIDEsIDEsIDMsIC0xLCAicm9sbCIsICJzdWIiLCAic3ViIiwgMSwgIm11bCJdOworICAgICAgdmFyIGNvbXBpbGVkQ29kZSA9IGNvbXBpbGVyLmNvbXBpbGUoY29kZSwgWzAsIDFdLCBbMCwgMV0pOworICAgICAgZXhwZWN0KGNvbXBpbGVkQ29kZSkudG9FcXVhbCgiZGVzdFtkZXN0T2Zmc2V0ICsgMF0gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBzcmNbc3JjT2Zmc2V0ICsgMF0pKTsiKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L2phc21pbmUtYm9vdC5qcyBiL2xpYi90ZXN0L3VuaXQvamFzbWluZS1ib290LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTYxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L2phc21pbmUtYm9vdC5qcwpAQCAtMCwwICsxLDE1NSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitmdW5jdGlvbiBpbml0aWFsaXplUERGSlMoY2FsbGJhY2spIHsKKyAgUHJvbWlzZS5hbGwoWyJwZGZqcy9kaXNwbGF5L2FwaS5qcyIsICJwZGZqcy9kaXNwbGF5L3dvcmtlcl9vcHRpb25zLmpzIiwgInBkZmpzL2Rpc3BsYXkvbmV0d29yay5qcyIsICJwZGZqcy9kaXNwbGF5L2ZldGNoX3N0cmVhbS5qcyIsICJwZGZqcy9zaGFyZWQvaXNfbm9kZS5qcyIsICJwZGZqcy10ZXN0L3VuaXQvYW5ub3RhdGlvbl9zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9hbm5vdGF0aW9uX3N0b3JhZ2Vfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvYXBpX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L2JpZGlfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvY2ZmX3BhcnNlcl9zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9jbWFwX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L2NvbG9yc3BhY2Vfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvY29yZV91dGlsc19zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9jcnlwdG9fc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvY3VzdG9tX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L2Rpc3BsYXlfc3ZnX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L2Rpc3BsYXlfdXRpbHNfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvZG9jdW1lbnRfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvZW5jb2RpbmdzX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L2V2YWx1YXRvcl9zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9mdW5jdGlvbl9zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9mZXRjaF9zdHJlYW1fc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvbWVzc2FnZV9oYW5kbGVyX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L21ldGFkYXRhX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L211cm11cmhhc2gzX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L25ldHdvcmtfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvbmV0d29ya191dGlsc19zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9wYXJzZXJfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvcGRmX2ZpbmRfY29udHJvbGxlcl9zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9wZGZfZmluZF91dGlsc19zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9wZGZfaGlzdG9yeV9zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC9wcmltaXRpdmVzX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L3N0cmVhbV9zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC90eXBlMV9wYXJzZXJfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvdWlfdXRpbHNfc3BlYy5qcyIsICJwZGZqcy10ZXN0L3VuaXQvdW5pY29kZV9zcGVjLmpzIiwgInBkZmpzLXRlc3QvdW5pdC91dGlsX3NwZWMuanMiLCAicGRmanMtdGVzdC91bml0L3dyaXRlcl9zcGVjLmpzIl0ubWFwKGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7CisgICAgcmV0dXJuIFN5c3RlbUpTLmltcG9ydChtb2R1bGVOYW1lKTsKKyAgfSkpLnRoZW4oZnVuY3Rpb24gKG1vZHVsZXMpIHsKKyAgICBjb25zdCBkaXNwbGF5QXBpID0gbW9kdWxlc1swXTsKKyAgICBjb25zdCB7CisgICAgICBHbG9iYWxXb3JrZXJPcHRpb25zCisgICAgfSA9IG1vZHVsZXNbMV07CisgICAgY29uc3QgeworICAgICAgUERGTmV0d29ya1N0cmVhbQorICAgIH0gPSBtb2R1bGVzWzJdOworICAgIGNvbnN0IHsKKyAgICAgIFBERkZldGNoU3RyZWFtCisgICAgfSA9IG1vZHVsZXNbM107CisgICAgY29uc3QgeworICAgICAgaXNOb2RlSlMKKyAgICB9ID0gbW9kdWxlc1s0XTsKKworICAgIGlmIChpc05vZGVKUykgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYGd1bHAgdW5pdHRlc3RgIGNvbW1hbmQgY2Fubm90IGJlIHVzZWQgaW4gTm9kZS5qcyBlbnZpcm9ubWVudHMuIik7CisgICAgfQorCisgICAgaWYgKHR5cGVvZiBSZXNwb25zZSAhPT0gInVuZGVmaW5lZCIgJiYgImJvZHkiIGluIFJlc3BvbnNlLnByb3RvdHlwZSAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBkaXNwbGF5QXBpLnNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KGZ1bmN0aW9uIChwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQREZGZXRjaFN0cmVhbShwYXJhbXMpOworICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpc3BsYXlBcGkuc2V0UERGTmV0d29ya1N0cmVhbUZhY3RvcnkoZnVuY3Rpb24gKHBhcmFtcykgeworICAgICAgICByZXR1cm4gbmV3IFBERk5ldHdvcmtTdHJlYW0ocGFyYW1zKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gIi4uLy4uL2J1aWxkL2dlbmVyaWMvYnVpbGQvcGRmLndvcmtlci5qcyI7CisgICAgY2FsbGJhY2soKTsKKyAgfSk7Cit9CisKKyhmdW5jdGlvbiAoKSB7CisgIHdpbmRvdy5qYXNtaW5lID0gamFzbWluZVJlcXVpcmUuY29yZShqYXNtaW5lUmVxdWlyZSk7CisgIGphc21pbmVSZXF1aXJlLmh0bWwoamFzbWluZSk7CisgIHZhciBlbnYgPSBqYXNtaW5lLmdldEVudigpOworICB2YXIgamFzbWluZUludGVyZmFjZSA9IGphc21pbmVSZXF1aXJlLmludGVyZmFjZShqYXNtaW5lLCBlbnYpOworICBleHRlbmQod2luZG93LCBqYXNtaW5lSW50ZXJmYWNlKTsKKyAgdmFyIHF1ZXJ5U3RyaW5nID0gbmV3IGphc21pbmUuUXVlcnlTdHJpbmcoeworICAgIGdldFdpbmRvd0xvY2F0aW9uKCkgeworICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbjsKKyAgICB9CisKKyAgfSk7CisgIHZhciBjb25maWcgPSB7CisgICAgZmFpbEZhc3Q6IHF1ZXJ5U3RyaW5nLmdldFBhcmFtKCJmYWlsRmFzdCIpLAorICAgIG9uZUZhaWx1cmVQZXJTcGVjOiBxdWVyeVN0cmluZy5nZXRQYXJhbSgib25lRmFpbHVyZVBlclNwZWMiKSwKKyAgICBoaWRlRGlzYWJsZWQ6IHF1ZXJ5U3RyaW5nLmdldFBhcmFtKCJoaWRlRGlzYWJsZWQiKQorICB9OworICB2YXIgcmFuZG9tID0gcXVlcnlTdHJpbmcuZ2V0UGFyYW0oInJhbmRvbSIpOworCisgIGlmIChyYW5kb20gIT09IHVuZGVmaW5lZCAmJiByYW5kb20gIT09ICIiKSB7CisgICAgY29uZmlnLnJhbmRvbSA9IHJhbmRvbTsKKyAgfQorCisgIHZhciBzZWVkID0gcXVlcnlTdHJpbmcuZ2V0UGFyYW0oInNlZWQiKTsKKworICBpZiAoc2VlZCkgeworICAgIGNvbmZpZy5zZWVkID0gc2VlZDsKKyAgfQorCisgIHZhciBodG1sUmVwb3J0ZXIgPSBuZXcgamFzbWluZS5IdG1sUmVwb3J0ZXIoeworICAgIGVudiwKKworICAgIG5hdmlnYXRlV2l0aE5ld1BhcmFtKGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBxdWVyeVN0cmluZy5uYXZpZ2F0ZVdpdGhOZXdQYXJhbShrZXksIHZhbHVlKTsKKyAgICB9LAorCisgICAgYWRkVG9FeGlzdGluZ1F1ZXJ5U3RyaW5nKGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBxdWVyeVN0cmluZy5mdWxsU3RyaW5nV2l0aE5ld1BhcmFtKGtleSwgdmFsdWUpOworICAgIH0sCisKKyAgICBnZXRDb250YWluZXIoKSB7CisgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTsKKyAgICB9LAorCisgICAgY3JlYXRlRWxlbWVudCgpIHsKKyAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50LmFwcGx5KGRvY3VtZW50LCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICBjcmVhdGVUZXh0Tm9kZSgpIHsKKyAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZS5hcHBseShkb2N1bWVudCwgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgdGltZXI6IG5ldyBqYXNtaW5lLlRpbWVyKCkKKyAgfSk7CisgIGVudi5hZGRSZXBvcnRlcihodG1sUmVwb3J0ZXIpOworCisgIGlmIChxdWVyeVN0cmluZy5nZXRQYXJhbSgiYnJvd3NlciIpKSB7CisgICAgdmFyIHRlc3RSZXBvcnRlciA9IG5ldyBUZXN0UmVwb3J0ZXIocXVlcnlTdHJpbmcuZ2V0UGFyYW0oImJyb3dzZXIiKSk7CisgICAgZW52LmFkZFJlcG9ydGVyKHRlc3RSZXBvcnRlcik7CisgIH0KKworICB2YXIgc3BlY0ZpbHRlciA9IG5ldyBqYXNtaW5lLkh0bWxTcGVjRmlsdGVyKHsKKyAgICBmaWx0ZXJTdHJpbmcoKSB7CisgICAgICByZXR1cm4gcXVlcnlTdHJpbmcuZ2V0UGFyYW0oInNwZWMiKTsKKyAgICB9CisKKyAgfSk7CisKKyAgY29uZmlnLnNwZWNGaWx0ZXIgPSBmdW5jdGlvbiAoc3BlYykgeworICAgIHJldHVybiBzcGVjRmlsdGVyLm1hdGNoZXMoc3BlYy5nZXRGdWxsTmFtZSgpKTsKKyAgfTsKKworICBlbnYuY29uZmlndXJlKGNvbmZpZyk7CisgIGphc21pbmUuREVGQVVMVF9USU1FT1VUX0lOVEVSVkFMID0gMzAwMDA7CisgIHZhciBjdXJyZW50V2luZG93T25sb2FkID0gd2luZG93Lm9ubG9hZDsKKworICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24gKCkgeworICAgIGlmIChjdXJyZW50V2luZG93T25sb2FkKSB7CisgICAgICBjdXJyZW50V2luZG93T25sb2FkKCk7CisgICAgfQorCisgICAgaW5pdGlhbGl6ZVBERkpTKGZ1bmN0aW9uICgpIHsKKyAgICAgIGh0bWxSZXBvcnRlci5pbml0aWFsaXplKCk7CisgICAgICBlbnYuZXhlY3V0ZSgpOworICAgIH0pOworICB9OworCisgIGZ1bmN0aW9uIGV4dGVuZChkZXN0aW5hdGlvbiwgc291cmNlKSB7CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gc291cmNlKSB7CisgICAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldOworICAgIH0KKworICAgIHJldHVybiBkZXN0aW5hdGlvbjsKKyAgfQorfSkoKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L21lc3NhZ2VfaGFuZGxlcl9zcGVjLmpzIGIvbGliL3Rlc3QvdW5pdC9tZXNzYWdlX2hhbmRsZXJfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTkxMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9tZXNzYWdlX2hhbmRsZXJfc3BlYy5qcwpAQCAtMCwwICsxLDM2NSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX2FwaSA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvYXBpLmpzIik7CisKK3ZhciBfbWVzc2FnZV9oYW5kbGVyID0gcmVxdWlyZSgiLi4vLi4vc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qcyIpOworCitkZXNjcmliZSgibWVzc2FnZV9oYW5kbGVyIiwgZnVuY3Rpb24gKCkgeworICBmdW5jdGlvbiBzbGVlcCh0aWNrcykgeworICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKKyAgICAgIHJldHVybiB0aWNrcyAmJiBzbGVlcCh0aWNrcyAtIDEpOworICAgIH0pOworICB9CisKKyAgZGVzY3JpYmUoInNlbmRXaXRoU3RyZWFtIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcmV0dXJuIGEgUmVhZGFibGVTdHJlYW0iLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBwb3J0ID0gbmV3IF9hcGkuTG9vcGJhY2tQb3J0KCk7CisgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlcjEgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcigibWFpbiIsICJ3b3JrZXIiLCBwb3J0KTsKKyAgICAgIGNvbnN0IHJlYWRhYmxlID0gbWVzc2FnZUhhbmRsZXIxLnNlbmRXaXRoU3RyZWFtKCJmYWtlSGFuZGxlciIpOworICAgICAgZXhwZWN0KHR5cGVvZiByZWFkYWJsZSkudG9FcXVhbCgib2JqZWN0Iik7CisgICAgICBleHBlY3QodHlwZW9mIHJlYWRhYmxlLmdldFJlYWRlcikudG9FcXVhbCgiZnVuY3Rpb24iKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHJlYWQgdXNpbmcgYSByZWFkZXIiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgbGV0IGxvZyA9ICIiOworICAgICAgY29uc3QgcG9ydCA9IG5ldyBfYXBpLkxvb3BiYWNrUG9ydCgpOworICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIxID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIm1haW4iLCAid29ya2VyIiwgcG9ydCk7CisgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlcjIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcigid29ya2VyIiwgIm1haW4iLCBwb3J0KTsKKyAgICAgIG1lc3NhZ2VIYW5kbGVyMi5vbigiZmFrZUhhbmRsZXIiLCAoZGF0YSwgc2luaykgPT4geworICAgICAgICBzaW5rLm9uUHVsbCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBsb2cgKz0gInAiOworICAgICAgICB9OworCisgICAgICAgIHNpbmsub25DYW5jZWwgPSBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgICAgbG9nICs9ICJjIjsKKyAgICAgICAgfTsKKworICAgICAgICBzaW5rLnJlYWR5LnRoZW4oKCkgPT4geworICAgICAgICAgIHNpbmsuZW5xdWV1ZSgiaGkiKTsKKyAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKKyAgICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHNsZWVwKDUpOworICAgICAgfSk7CisgICAgICBjb25zdCByZWFkYWJsZSA9IG1lc3NhZ2VIYW5kbGVyMS5zZW5kV2l0aFN0cmVhbSgiZmFrZUhhbmRsZXIiLCB7fSwgeworICAgICAgICBoaWdoV2F0ZXJNYXJrOiAxLAorCisgICAgICAgIHNpemUoKSB7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgfSk7CisgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTsKKyAgICAgIHNsZWVwKDEwKS50aGVuKCgpID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiIik7CisgICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpOworICAgICAgfSkudGhlbihyZXN1bHQgPT4geworICAgICAgICBleHBlY3QobG9nKS50b0VxdWFsKCJwIik7CisgICAgICAgIGV4cGVjdChyZXN1bHQudmFsdWUpLnRvRXF1YWwoImhpIik7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZG9uZSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIHJldHVybiBzbGVlcCgxMCk7CisgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7CisgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7CisgICAgICAgIGV4cGVjdChyZXN1bHQudmFsdWUpLnRvRXF1YWwodW5kZWZpbmVkKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5kb25lKS50b0VxdWFsKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIG5vdCByZWFkIGFueSBkYXRhIHdoZW4gY2FuY2VsbGVkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGxldCBsb2cgPSAiIjsKKyAgICAgIGNvbnN0IHBvcnQgPSBuZXcgX2FwaS5Mb29wYmFja1BvcnQoKTsKKyAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyMiA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJ3b3JrZXIiLCAibWFpbiIsIHBvcnQpOworICAgICAgbWVzc2FnZUhhbmRsZXIyLm9uKCJmYWtlSGFuZGxlciIsIChkYXRhLCBzaW5rKSA9PiB7CisgICAgICAgIHNpbmsub25QdWxsID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgIGxvZyArPSAicCI7CisgICAgICAgIH07CisKKyAgICAgICAgc2luay5vbkNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBsb2cgKz0gImMiOworICAgICAgICB9OworCisgICAgICAgIGxvZyArPSAiMCI7CisgICAgICAgIHNpbmsucmVhZHkudGhlbigoKSA9PiB7CisgICAgICAgICAgbG9nICs9ICIxIjsKKyAgICAgICAgICBzaW5rLmVucXVldWUoWzEsIDIsIDMsIDRdLCA0KTsKKyAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKKyAgICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgICAgbG9nICs9ICIyIjsKKyAgICAgICAgICBzaW5rLmVucXVldWUoWzUsIDYsIDcsIDhdLCA0KTsKKyAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKKyAgICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgICAgbG9nICs9ICIzIjsKKyAgICAgICAgICBzaW5rLmNsb3NlKCk7CisgICAgICAgIH0sICgpID0+IHsKKyAgICAgICAgICBsb2cgKz0gIjQiOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIxID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIm1haW4iLCAid29ya2VyIiwgcG9ydCk7CisgICAgICBjb25zdCByZWFkYWJsZSA9IG1lc3NhZ2VIYW5kbGVyMS5zZW5kV2l0aFN0cmVhbSgiZmFrZUhhbmRsZXIiLCB7fSwgeworICAgICAgICBoaWdoV2F0ZXJNYXJrOiA0LAorCisgICAgICAgIHNpemUoYXJyKSB7CisgICAgICAgICAgcmV0dXJuIGFyci5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgfSk7CisgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTsKKyAgICAgIHNsZWVwKDEwKS50aGVuKCgpID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiMDEiKTsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7CisgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7CisgICAgICAgIGV4cGVjdChyZXN1bHQudmFsdWUpLnRvRXF1YWwoWzEsIDIsIDMsIDRdKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5kb25lKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHNsZWVwKDEwKTsKKyAgICAgIH0pLnRoZW4oKCkgPT4geworICAgICAgICBleHBlY3QobG9nKS50b0VxdWFsKCIwMXAyIik7CisgICAgICAgIHJldHVybiByZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigicmVhZGVyIGNhbmNlbGxlZC4iKSk7CisgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiMDFwMmM0Iik7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IHJlYWQgd2hlbiBlcnJvcmVkIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGxldCBsb2cgPSAiIjsKKyAgICAgIGNvbnN0IHBvcnQgPSBuZXcgX2FwaS5Mb29wYmFja1BvcnQoKTsKKyAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyMiA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJ3b3JrZXIiLCAibWFpbiIsIHBvcnQpOworICAgICAgbWVzc2FnZUhhbmRsZXIyLm9uKCJmYWtlSGFuZGxlciIsIChkYXRhLCBzaW5rKSA9PiB7CisgICAgICAgIHNpbmsub25QdWxsID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgIGxvZyArPSAicCI7CisgICAgICAgIH07CisKKyAgICAgICAgc2luay5vbkNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBsb2cgKz0gImMiOworICAgICAgICB9OworCisgICAgICAgIGxvZyArPSAiMCI7CisgICAgICAgIHNpbmsucmVhZHkudGhlbigoKSA9PiB7CisgICAgICAgICAgbG9nICs9ICIxIjsKKyAgICAgICAgICBzaW5rLmVucXVldWUoWzEsIDIsIDMsIDRdLCA0KTsKKyAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKKyAgICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgICAgbG9nICs9ICJlIjsKKyAgICAgICAgICBzaW5rLmVycm9yKG5ldyBFcnJvcigic2hvdWxkIG5vdCByZWFkIHdoZW4gZXJyb3JlZCIpKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyMSA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJtYWluIiwgIndvcmtlciIsIHBvcnQpOworICAgICAgY29uc3QgcmVhZGFibGUgPSBtZXNzYWdlSGFuZGxlcjEuc2VuZFdpdGhTdHJlYW0oImZha2VIYW5kbGVyIiwge30sIHsKKyAgICAgICAgaGlnaFdhdGVyTWFyazogNCwKKworICAgICAgICBzaXplKGFycikgeworICAgICAgICAgIHJldHVybiBhcnIubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgIH0pOworICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7CisgICAgICBzbGVlcCgxMCkudGhlbigoKSA9PiB7CisgICAgICAgIGV4cGVjdChsb2cpLnRvRXF1YWwoIjAxIik7CisgICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpOworICAgICAgfSkudGhlbihyZXN1bHQgPT4geworICAgICAgICBleHBlY3QocmVzdWx0LnZhbHVlKS50b0VxdWFsKFsxLCAyLCAzLCA0XSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZG9uZSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpOworICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiMDFwZSIpOworICAgICAgICBleHBlY3QocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QocmVhc29uLm1lc3NhZ2UpLnRvRXF1YWwoInNob3VsZCBub3QgcmVhZCB3aGVuIGVycm9yZWQiKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZWFkIGRhdGEgd2l0aCBibG9ja2luZyBwcm9taXNlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGxldCBsb2cgPSAiIjsKKyAgICAgIGNvbnN0IHBvcnQgPSBuZXcgX2FwaS5Mb29wYmFja1BvcnQoKTsKKyAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyMiA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJ3b3JrZXIiLCAibWFpbiIsIHBvcnQpOworICAgICAgbWVzc2FnZUhhbmRsZXIyLm9uKCJmYWtlSGFuZGxlciIsIChkYXRhLCBzaW5rKSA9PiB7CisgICAgICAgIHNpbmsub25QdWxsID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgIGxvZyArPSAicCI7CisgICAgICAgIH07CisKKyAgICAgICAgc2luay5vbkNhbmNlbCA9IGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgICBsb2cgKz0gImMiOworICAgICAgICB9OworCisgICAgICAgIGxvZyArPSAiMCI7CisgICAgICAgIHNpbmsucmVhZHkudGhlbigoKSA9PiB7CisgICAgICAgICAgbG9nICs9ICIxIjsKKyAgICAgICAgICBzaW5rLmVucXVldWUoWzEsIDIsIDMsIDRdLCA0KTsKKyAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKKyAgICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgICAgbG9nICs9ICIyIjsKKyAgICAgICAgICBzaW5rLmVucXVldWUoWzUsIDYsIDcsIDhdLCA0KTsKKyAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKKyAgICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgICAgc2luay5jbG9zZSgpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIxID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIm1haW4iLCAid29ya2VyIiwgcG9ydCk7CisgICAgICBjb25zdCByZWFkYWJsZSA9IG1lc3NhZ2VIYW5kbGVyMS5zZW5kV2l0aFN0cmVhbSgiZmFrZUhhbmRsZXIiLCB7fSwgeworICAgICAgICBoaWdoV2F0ZXJNYXJrOiA0LAorCisgICAgICAgIHNpemUoYXJyKSB7CisgICAgICAgICAgcmV0dXJuIGFyci5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgfSk7CisgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTsKKyAgICAgIHNsZWVwKDEwKS50aGVuKCgpID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiMDEiKTsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7CisgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7CisgICAgICAgIGV4cGVjdChyZXN1bHQudmFsdWUpLnRvRXF1YWwoWzEsIDIsIDMsIDRdKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5kb25lKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHNsZWVwKDEwKTsKKyAgICAgIH0pLnRoZW4oKCkgPT4geworICAgICAgICBleHBlY3QobG9nKS50b0VxdWFsKCIwMXAyIik7CisgICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpOworICAgICAgfSkudGhlbihyZXN1bHQgPT4geworICAgICAgICBleHBlY3QocmVzdWx0LnZhbHVlKS50b0VxdWFsKFs1LCA2LCA3LCA4XSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZG9uZSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIHJldHVybiBzbGVlcCgxMCk7CisgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiMDFwMnAiKTsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7CisgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7CisgICAgICAgIGV4cGVjdChyZXN1bHQudmFsdWUpLnRvRXF1YWwodW5kZWZpbmVkKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5kb25lKS50b0VxdWFsKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHJlYWQgZGF0YSB3aXRoIGJsb2NraW5nIHByb21pc2UgYW5kIGJ1ZmZlciB3aG9sZSBkYXRhIiArICIgaW50byBzdHJlYW0iLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgbGV0IGxvZyA9ICIiOworICAgICAgY29uc3QgcG9ydCA9IG5ldyBfYXBpLkxvb3BiYWNrUG9ydCgpOworICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIndvcmtlciIsICJtYWluIiwgcG9ydCk7CisgICAgICBtZXNzYWdlSGFuZGxlcjIub24oImZha2VIYW5kbGVyIiwgKGRhdGEsIHNpbmspID0+IHsKKyAgICAgICAgc2luay5vblB1bGwgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgbG9nICs9ICJwIjsKKyAgICAgICAgfTsKKworICAgICAgICBzaW5rLm9uQ2FuY2VsID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGxvZyArPSAiYyI7CisgICAgICAgIH07CisKKyAgICAgICAgbG9nICs9ICIwIjsKKyAgICAgICAgc2luay5yZWFkeS50aGVuKCgpID0+IHsKKyAgICAgICAgICBsb2cgKz0gIjEiOworICAgICAgICAgIHNpbmsuZW5xdWV1ZShbMSwgMiwgMywgNF0sIDQpOworICAgICAgICAgIHJldHVybiBzaW5rLnJlYWR5OworICAgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgICBsb2cgKz0gIjIiOworICAgICAgICAgIHNpbmsuZW5xdWV1ZShbNSwgNiwgNywgOF0sIDQpOworICAgICAgICAgIHJldHVybiBzaW5rLnJlYWR5OworICAgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgICBzaW5rLmNsb3NlKCk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc2xlZXAoMTApOworICAgICAgfSk7CisgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlcjEgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcigibWFpbiIsICJ3b3JrZXIiLCBwb3J0KTsKKyAgICAgIGNvbnN0IHJlYWRhYmxlID0gbWVzc2FnZUhhbmRsZXIxLnNlbmRXaXRoU3RyZWFtKCJmYWtlSGFuZGxlciIsIHt9LCB7CisgICAgICAgIGhpZ2hXYXRlck1hcms6IDgsCisKKyAgICAgICAgc2l6ZShhcnIpIHsKKyAgICAgICAgICByZXR1cm4gYXJyLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICB9KTsKKyAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpOworICAgICAgc2xlZXAoMTApLnRoZW4oKCkgPT4geworICAgICAgICBleHBlY3QobG9nKS50b0VxdWFsKCIwMTIiKTsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7CisgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7CisgICAgICAgIGV4cGVjdChyZXN1bHQudmFsdWUpLnRvRXF1YWwoWzEsIDIsIDMsIDRdKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5kb25lKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHNsZWVwKDEwKTsKKyAgICAgIH0pLnRoZW4oKCkgPT4geworICAgICAgICBleHBlY3QobG9nKS50b0VxdWFsKCIwMTJwIik7CisgICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpOworICAgICAgfSkudGhlbihyZXN1bHQgPT4geworICAgICAgICBleHBlY3QocmVzdWx0LnZhbHVlKS50b0VxdWFsKFs1LCA2LCA3LCA4XSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZG9uZSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIHJldHVybiBzbGVlcCgxMCk7CisgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiMDEycCIpOworICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKTsKKyAgICAgIH0pLnRoZW4ocmVzdWx0ID0+IHsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC52YWx1ZSkudG9FcXVhbCh1bmRlZmluZWQpOworICAgICAgICBleHBlY3QocmVzdWx0LmRvbmUpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaWdub3JlIGFueSBwdWxsIGFmdGVyIGNsb3NlIGlzIGNhbGxlZCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBsZXQgbG9nID0gIiI7CisgICAgICBjb25zdCBwb3J0ID0gbmV3IF9hcGkuTG9vcGJhY2tQb3J0KCk7CisgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIndvcmtlciIsICJtYWluIiwgcG9ydCk7CisgICAgICBtZXNzYWdlSGFuZGxlcjIub24oImZha2VIYW5kbGVyIiwgKGRhdGEsIHNpbmspID0+IHsKKyAgICAgICAgc2luay5vblB1bGwgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgbG9nICs9ICJwIjsKKyAgICAgICAgfTsKKworICAgICAgICBzaW5rLm9uQ2FuY2VsID0gZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIGxvZyArPSAiYyI7CisgICAgICAgIH07CisKKyAgICAgICAgbG9nICs9ICIwIjsKKyAgICAgICAgc2luay5yZWFkeS50aGVuKCgpID0+IHsKKyAgICAgICAgICBsb2cgKz0gIjEiOworICAgICAgICAgIHNpbmsuZW5xdWV1ZShbMSwgMiwgMywgNF0sIDQpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgICAgICBzaW5rLmNsb3NlKCk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlcjEgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcigibWFpbiIsICJ3b3JrZXIiLCBwb3J0KTsKKyAgICAgIGNvbnN0IHJlYWRhYmxlID0gbWVzc2FnZUhhbmRsZXIxLnNlbmRXaXRoU3RyZWFtKCJmYWtlSGFuZGxlciIsIHt9LCB7CisgICAgICAgIGhpZ2hXYXRlck1hcms6IDEwLAorCisgICAgICAgIHNpemUoYXJyKSB7CisgICAgICAgICAgcmV0dXJuIGFyci5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgfSk7CisgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTsKKyAgICAgIHNsZWVwKDEwKS50aGVuKCgpID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiMDEiKTsKKyAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7CisgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7CisgICAgICAgIH0pOworICAgICAgfSkudGhlbihyZXN1bHQgPT4geworICAgICAgICBleHBlY3QocmVzdWx0LnZhbHVlKS50b0VxdWFsKFsxLCAyLCAzLCA0XSk7CisgICAgICAgIGV4cGVjdChyZXN1bHQuZG9uZSkudG9FcXVhbChmYWxzZSk7CisgICAgICAgIHJldHVybiBzbGVlcCgxMCk7CisgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgZXhwZWN0KGxvZykudG9FcXVhbCgiMDEiKTsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7CisgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7CisgICAgICAgIGV4cGVjdChyZXN1bHQudmFsdWUpLnRvRXF1YWwodW5kZWZpbmVkKTsKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5kb25lKS50b0VxdWFsKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L21ldGFkYXRhX3NwZWMuanMgYi9saWIvdGVzdC91bml0L21ldGFkYXRhX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzNmQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvbWV0YWRhdGFfc3BlYy5qcwpAQCAtMCwwICsxLDExOCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3Rlc3RfdXRpbHMgPSByZXF1aXJlKCIuL3Rlc3RfdXRpbHMuanMiKTsKKwordmFyIF9tZXRhZGF0YSA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvbWV0YWRhdGEuanMiKTsKKworZGVzY3JpYmUoIm1ldGFkYXRhIiwgZnVuY3Rpb24gKCkgeworICBpdCgic2hvdWxkIGhhbmRsZSB2YWxpZCBtZXRhZGF0YSIsIGZ1bmN0aW9uICgpIHsKKyAgICBjb25zdCBkYXRhID0gIjx4OnhtcG1ldGEgeG1sbnM6eD0nYWRvYmU6bnM6bWV0YS8nPiIgKyAiPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4iICsgIjxyZGY6RGVzY3JpcHRpb24geG1sbnM6ZGM9J2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJz4iICsgJzxkYzp0aXRsZT48cmRmOkFsdD48cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPkZvbyBiYXIgYmF6PC9yZGY6bGk+JyArICI8L3JkZjpBbHQ+PC9kYzp0aXRsZT48L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+IjsKKyAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGEuTWV0YWRhdGEoZGF0YSk7CisgICAgZXhwZWN0KG1ldGFkYXRhLmhhcygiZGM6dGl0bGUiKSkudG9CZVRydXRoeSgpOworICAgIGV4cGVjdChtZXRhZGF0YS5oYXMoImRjOnF1eCIpKS50b0JlRmFsc3koKTsKKyAgICBleHBlY3QobWV0YWRhdGEuZ2V0KCJkYzp0aXRsZSIpKS50b0VxdWFsKCJGb28gYmFyIGJheiIpOworICAgIGV4cGVjdChtZXRhZGF0YS5nZXQoImRjOnF1eCIpKS50b0VxdWFsKG51bGwpOworICAgIGV4cGVjdChtZXRhZGF0YS5nZXRBbGwoKSkudG9FcXVhbCh7CisgICAgICAiZGM6dGl0bGUiOiAiRm9vIGJhciBiYXoiCisgICAgfSk7CisgIH0pOworICBpdCgic2hvdWxkIHJlcGFpciBhbmQgaGFuZGxlIGludmFsaWQgbWV0YWRhdGEiLCBmdW5jdGlvbiAoKSB7CisgICAgY29uc3QgZGF0YSA9ICI8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJz4iICsgIjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc+IiArICI8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyc+IiArICI8ZGM6dGl0bGU+XFwzNzZcXDM3N1xcMDAwUFxcMDAwRFxcMDAwRlxcMDAwJjwvZGM6dGl0bGU+IiArICI8L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+IjsKKyAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGEuTWV0YWRhdGEoZGF0YSk7CisgICAgZXhwZWN0KG1ldGFkYXRhLmhhcygiZGM6dGl0bGUiKSkudG9CZVRydXRoeSgpOworICAgIGV4cGVjdChtZXRhZGF0YS5oYXMoImRjOnF1eCIpKS50b0JlRmFsc3koKTsKKyAgICBleHBlY3QobWV0YWRhdGEuZ2V0KCJkYzp0aXRsZSIpKS50b0VxdWFsKCJQREYmIik7CisgICAgZXhwZWN0KG1ldGFkYXRhLmdldCgiZGM6cXV4IikpLnRvRXF1YWwobnVsbCk7CisgICAgZXhwZWN0KG1ldGFkYXRhLmdldEFsbCgpKS50b0VxdWFsKHsKKyAgICAgICJkYzp0aXRsZSI6ICJQREYmIgorICAgIH0pOworICB9KTsKKyAgaXQoInNob3VsZCByZXBhaXIgYW5kIGhhbmRsZSBpbnZhbGlkIG1ldGFkYXRhIChidWcgMTQyNDkzOCkiLCBmdW5jdGlvbiAoKSB7CisgICAgY29uc3QgZGF0YSA9ICI8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJyAiICsgIng6eG1wdGs9J1hNUCB0b29sa2l0IDIuOS4xLTEzLCBmcmFtZXdvcmsgMS42Jz4iICsgIjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIycgIiArICJ4bWxuczppWD0naHR0cDovL25zLmFkb2JlLmNvbS9pWC8xLjAvJz4iICsgIjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSc2MTY1MmZhNy1mYzFmLTExZGQtMDAwMC1jZTgxZDQxZjllY2YnICIgKyAieG1sbnM6cGRmPSdodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvJyAiICsgInBkZjpQcm9kdWNlcj0nR1BMIEdob3N0c2NyaXB0IDguNjMnLz4iICsgIjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSc2MTY1MmZhNy1mYzFmLTExZGQtMDAwMC1jZTgxZDQxZjllY2YnICIgKyAieG1sbnM6eGFwPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvJyAiICsgInhhcDpNb2RpZnlEYXRlPScyMDA5LTAyLTEzVDEyOjQyOjU0KzAxOjAwJyAiICsgInhhcDpDcmVhdGVEYXRlPScyMDA5LTAyLTEzVDEyOjQyOjU0KzAxOjAwJz4iICsgIjx4YXA6Q3JlYXRvclRvb2w+XFwzNzZcXDM3N1xcMDAwUFxcMDAwRFxcMDAwRlxcMDAwQ1xcMDAwclxcMDAwZVxcMDAwYSIgKyAiXFwwMDB0XFwwMDBvXFwwMDByXFwwMDAgXFwwMDBWXFwwMDBlXFwwMDByXFwwMDBzXFwwMDBpXFwwMDBvXFwwMDBuIiArICJcXDAwMCBcXDAwMDBcXDAwMC5cXDAwMDlcXDAwMC5cXDAwMDY8L3hhcDpDcmVhdG9yVG9vbD4iICsgIjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gIiArICJyZGY6YWJvdXQ9JzYxNjUyZmE3LWZjMWYtMTFkZC0wMDAwLWNlODFkNDFmOWVjZicgIiArICJ4bWxuczp4YXBNTT0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLycgIiArICJ4YXBNTTpEb2N1bWVudElEPSc2MTY1MmZhNy1mYzFmLTExZGQtMDAwMC1jZTgxZDQxZjllY2YnLz4iICsgIjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSc2MTY1MmZhNy1mYzFmLTExZGQtMDAwMC1jZTgxZDQxZjllY2YnICIgKyAieG1sbnM6ZGM9J2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJyAiICsgImRjOmZvcm1hdD0nYXBwbGljYXRpb24vcGRmJz48ZGM6dGl0bGU+PHJkZjpBbHQ+IiArICI8cmRmOmxpIHhtbDpsYW5nPSd4LWRlZmF1bHQnPlxcMzc2XFwzNzdcXDAwMExcXDAwMCZhcG9zO1xcMDAwT1xcMDAwZCIgKyAiXFwwMDBpXFwwMDBzXFwwMDBzXFwwMDBlXFwwMDBlXFwwMDAgXFwwMDB0XFwwMDBoXFwwMDBcXDM1MVxcMDAwbVxcMDAwYSIgKyAiXFwwMDB0XFwwMDBpXFwwMDBxXFwwMDB1XFwwMDBlXFwwMDAgXFwwMDBsXFwwMDBvXFwwMDBnXFwwMDBvXFwwMDAgIiArICJcXDAwME9cXDAwMGRcXDAwMGlcXDAwMHNcXDAwMHNcXDAwMFxcMzUxXFwwMDBcXDM1MVxcMDAwIFxcMDAwLVxcMDAwICIgKyAiXFwwMDBkXFwwMDBcXDM1MVxcMDAwY1xcMDAwZVxcMDAwbVxcMDAwYlxcMDAwclxcMDAwZVxcMDAwIFxcMDAwMlxcMDAwMCIgKyAiXFwwMDAwXFwwMDA4XFwwMDAuXFwwMDBwXFwwMDB1XFwwMDBiPC9yZGY6bGk+PC9yZGY6QWx0PjwvZGM6dGl0bGU+IiArICI8ZGM6Y3JlYXRvcj48cmRmOlNlcT48cmRmOmxpPlxcMzc2XFwzNzdcXDAwME9cXDAwMERcXDAwMElcXDAwMFMiICsgIjwvcmRmOmxpPjwvcmRmOlNlcT48L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPiIgKyAiPC94OnhtcG1ldGE+IjsKKyAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGEuTWV0YWRhdGEoZGF0YSk7CisgICAgZXhwZWN0KG1ldGFkYXRhLmhhcygiZGM6dGl0bGUiKSkudG9CZVRydXRoeSgpOworICAgIGV4cGVjdChtZXRhZGF0YS5oYXMoImRjOnF1eCIpKS50b0JlRmFsc3koKTsKKyAgICBleHBlY3QobWV0YWRhdGEuZ2V0KCJkYzp0aXRsZSIpKS50b0VxdWFsKCJMJ09kaXNzZWUgdGjDqW1hdGlxdWUgbG9nbyBPZGlzc8Opw6kgLSBkw6ljZW1icmUgMjAwOC5wdWIiKTsKKyAgICBleHBlY3QobWV0YWRhdGEuZ2V0KCJkYzpxdXgiKSkudG9FcXVhbChudWxsKTsKKyAgICBleHBlY3QobWV0YWRhdGEuZ2V0QWxsKCkpLnRvRXF1YWwoeworICAgICAgImRjOmNyZWF0b3IiOiAiT0RJUyIsCisgICAgICAiZGM6dGl0bGUiOiAiTCdPZGlzc2VlIHRow6ltYXRpcXVlIGxvZ28gT2Rpc3PDqcOpIC0gZMOpY2VtYnJlIDIwMDgucHViIiwKKyAgICAgICJ4YXA6Y3JlYXRvcnRvb2wiOiAiUERGQ3JlYXRvciBWZXJzaW9uIDAuOS42IgorICAgIH0pOworICB9KTsKKyAgaXQoInNob3VsZCBncmFjZWZ1bGx5IGhhbmRsZSBpbmNvbXBsZXRlIHRhZ3MgKGlzc3VlIDg4ODQpIiwgZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IGRhdGEgPSAnPD94cGFja2V0IGJlZ2luPSLDg8Kvw4LCu8OCwr8iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnICsgJzx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPicgKyAnPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4nICsgJzxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiJyArICd4bWxuczpwZGZ4PSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZngvMS4zLyI+JyArICI8L3JkZjpEZXNjcmlwdGlvbj4iICsgJzxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiJyArICd4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPicgKyAiPHhhcDpNb2RpZnlEYXRlPjIwMTAtMDMtMjVUMTE6MjA6MDktMDQ6MDA8L3hhcDpNb2RpZnlEYXRlPiIgKyAiPHhhcDpDcmVhdGVEYXRlPjIwMTAtMDMtMjVUMTE6MjA6MDktMDQ6MDA8L3hhcDpDcmVhdGVEYXRlPiIgKyAiPHhhcDpNZXRhZGF0YURhdGU+MjAxMC0wMy0yNVQxMToyMDowOS0wNDowMDwveGFwOk1ldGFkYXRhRGF0ZT4iICsgIjwvcmRmOkRlc2NyaXB0aW9uPiIgKyAnPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiInICsgJ3htbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+JyArICI8ZGM6Zm9ybWF0PmFwcGxpY2F0aW9uL3BkZjwvZGM6Zm9ybWF0PiIgKyAiPC9yZGY6RGVzY3JpcHRpb24+IiArICc8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIicgKyAneG1sbnM6cGRmYWlkPSJodHRwOi8vd3d3LmFpaW0ub3JnL3BkZmEvbnMvaWQvIj4nICsgIjxwZGZhaWQ6cGFydD4xPC9wZGZhaWQ6cGFydD4iICsgIjxwZGZhaWQ6Y29uZm9ybWFuY2U+QTwvcGRmYWlkOmNvbmZvcm1hbmNlPiIgKyAiPC9yZGY6RGVzY3JpcHRpb24+IiArICI8L3JkZjpSREY+IiArICI8L3g6eG1wbWV0YT4iICsgJzw/eHBhY2tldCBlbmQ9InciPz4nOworICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IF9tZXRhZGF0YS5NZXRhZGF0YShkYXRhKTsKKyAgICBleHBlY3QoKDAsIF90ZXN0X3V0aWxzLmlzRW1wdHlPYmopKG1ldGFkYXRhLmdldEFsbCgpKSkudG9FcXVhbCh0cnVlKTsKKyAgfSk7CisgIGl0KCdzaG91bGQgZ3JhY2VmdWxseSBoYW5kbGUgImp1bmsiIGJlZm9yZSB0aGUgYWN0dWFsIG1ldGFkYXRhIChpc3N1ZSAxMDM5NSknLCBmdW5jdGlvbiAoKSB7CisgICAgY29uc3QgZGF0YSA9ICfDr8K7wr88P3hwYWNrZXQgYmVnaW49IsOvwrvCvyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PicgKyAnPHg6eG1wbWV0YSB4OnhtcHRrPSJUYWxsQ29tcG9uZW50cyBQREZPYmplY3RzIDEuMCIgJyArICd4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+JyArICc8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPicgKyAnPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgJyArICd4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iPicgKyAiPHBkZjpQcm9kdWNlcj5QREZLaXQuTkVUIDQuMC4xMDIuMDwvcGRmOlByb2R1Y2VyPiIgKyAiPHBkZjpLZXl3b3Jkcz48L3BkZjpLZXl3b3Jkcz4iICsgIjxwZGY6UERGVmVyc2lvbj4xLjc8L3BkZjpQREZWZXJzaW9uPjwvcmRmOkRlc2NyaXB0aW9uPiIgKyAnPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgJyArICd4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPicgKyAiPHhhcDpDcmVhdGVEYXRlPjIwMTgtMTItMjdUMTM6NTA6MzYtMDg6MDA8L3hhcDpDcmVhdGVEYXRlPiIgKyAiPHhhcDpNb2RpZnlEYXRlPjIwMTgtMTItMjdUMTM6NTA6MzgtMDg6MDA8L3hhcDpNb2RpZnlEYXRlPiIgKyAiPHhhcDpDcmVhdG9yVG9vbD48L3hhcDpDcmVhdG9yVG9vbD4iICsgIjx4YXA6TWV0YWRhdGFEYXRlPjIwMTgtMTItMjdUMTM6NTA6MzgtMDg6MDA8L3hhcDpNZXRhZGF0YURhdGU+IiArICc8L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiAnICsgJ3htbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+JyArICI8ZGM6Y3JlYXRvcj48cmRmOlNlcT48cmRmOmxpPjwvcmRmOmxpPjwvcmRmOlNlcT48L2RjOmNyZWF0b3I+IiArICI8ZGM6c3ViamVjdD48cmRmOkJhZyAvPjwvZGM6c3ViamVjdD4iICsgJzxkYzpkZXNjcmlwdGlvbj48cmRmOkFsdD48cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPicgKyAiPC9yZGY6bGk+PC9yZGY6QWx0PjwvZGM6ZGVzY3JpcHRpb24+IiArICc8ZGM6dGl0bGU+PHJkZjpBbHQ+PHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij48L3JkZjpsaT4nICsgIjwvcmRmOkFsdD48L2RjOnRpdGxlPjxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+IiArICc8L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+PD94cGFja2V0IGVuZD0idyI/Pic7CisgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhLk1ldGFkYXRhKGRhdGEpOworICAgIGV4cGVjdChtZXRhZGF0YS5oYXMoImRjOnRpdGxlIikpLnRvQmVUcnV0aHkoKTsKKyAgICBleHBlY3QobWV0YWRhdGEuaGFzKCJkYzpxdXgiKSkudG9CZUZhbHN5KCk7CisgICAgZXhwZWN0KG1ldGFkYXRhLmdldCgiZGM6dGl0bGUiKSkudG9FcXVhbCgiIik7CisgICAgZXhwZWN0KG1ldGFkYXRhLmdldCgiZGM6cXV4IikpLnRvRXF1YWwobnVsbCk7CisgICAgZXhwZWN0KG1ldGFkYXRhLmdldEFsbCgpKS50b0VxdWFsKHsKKyAgICAgICJkYzpjcmVhdG9yIjogIiIsCisgICAgICAiZGM6ZGVzY3JpcHRpb24iOiAiIiwKKyAgICAgICJkYzpmb3JtYXQiOiAiYXBwbGljYXRpb24vcGRmIiwKKyAgICAgICJkYzpzdWJqZWN0IjogIiIsCisgICAgICAiZGM6dGl0bGUiOiAiIiwKKyAgICAgICJwZGY6a2V5d29yZHMiOiAiIiwKKyAgICAgICJwZGY6cGRmdmVyc2lvbiI6ICIxLjciLAorICAgICAgInBkZjpwcm9kdWNlciI6ICJQREZLaXQuTkVUIDQuMC4xMDIuMCIsCisgICAgICAieGFwOmNyZWF0ZWRhdGUiOiAiMjAxOC0xMi0yN1QxMzo1MDozNi0wODowMCIsCisgICAgICAieGFwOmNyZWF0b3J0b29sIjogIiIsCisgICAgICAieGFwOm1ldGFkYXRhZGF0ZSI6ICIyMDE4LTEyLTI3VDEzOjUwOjM4LTA4OjAwIiwKKyAgICAgICJ4YXA6bW9kaWZ5ZGF0ZSI6ICIyMDE4LTEyLTI3VDEzOjUwOjM4LTA4OjAwIgorICAgIH0pOworICB9KTsKKyAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaGFuZGxlIG1ldGFkYXRhIGNvbnRhaW5pbmcgIiZhcG9zIiAoaXNzdWUgMTA0MDcpJywgZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IGRhdGEgPSAiPHg6eG1wbWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLyc+IiArICI8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnPiIgKyAiPHJkZjpEZXNjcmlwdGlvbiB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nPiIgKyAiPGRjOnRpdGxlPjxyZGY6QWx0PiIgKyAnPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij4mYXBvcztGb28gYmFyIGJheiZhcG9zOzwvcmRmOmxpPicgKyAiPC9yZGY6QWx0PjwvZGM6dGl0bGU+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPjwveDp4bXBtZXRhPiI7CisgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhLk1ldGFkYXRhKGRhdGEpOworICAgIGV4cGVjdChtZXRhZGF0YS5oYXMoImRjOnRpdGxlIikpLnRvQmVUcnV0aHkoKTsKKyAgICBleHBlY3QobWV0YWRhdGEuaGFzKCJkYzpxdXgiKSkudG9CZUZhbHN5KCk7CisgICAgZXhwZWN0KG1ldGFkYXRhLmdldCgiZGM6dGl0bGUiKSkudG9FcXVhbCgiJ0ZvbyBiYXIgYmF6JyIpOworICAgIGV4cGVjdChtZXRhZGF0YS5nZXQoImRjOnF1eCIpKS50b0VxdWFsKG51bGwpOworICAgIGV4cGVjdChtZXRhZGF0YS5nZXRBbGwoKSkudG9FcXVhbCh7CisgICAgICAiZGM6dGl0bGUiOiAiJ0ZvbyBiYXIgYmF6JyIKKyAgICB9KTsKKyAgfSk7CisgIGl0KCJzaG91bGQgZ3JhY2VmdWxseSBoYW5kbGUgdW5iYWxhbmNlZCBlbmQgdGFncyAoaXNzdWUgMTA0MTApIiwgZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IGRhdGEgPSAnPD94cGFja2V0IGJlZ2luPSLDg8Kvw4LCu8OCwr8iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4nICsgJzxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+JyArICc8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiAnICsgJ3htbG5zOnBkZj0iaHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyI+JyArICI8cGRmOlByb2R1Y2VyPlNvZGEgUERGIDU8L3BkZjpQcm9kdWNlcj48L3JkZjpEZXNjcmlwdGlvbj4iICsgJzxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiICcgKyAneG1sbnM6eGFwPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4nICsgIjx4YXA6Q3JlYXRlRGF0ZT4yMDE4LTEwLTAyVDA4OjE0OjQ5LTA1OjAwPC94YXA6Q3JlYXRlRGF0ZT4iICsgIjx4YXA6Q3JlYXRvclRvb2w+U29kYSBQREYgNTwveGFwOkNyZWF0b3JUb29sPiIgKyAiPHhhcDpNZXRhZGF0YURhdGU+MjAxOC0xMC0wMlQwODoxNDo0OS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4gIiArICI8eGFwOk1vZGlmeURhdGU+MjAxOC0xMC0wMlQwODoxNDo0OS0wNTowMDwveGFwOk1vZGlmeURhdGU+IiArICc8L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiAnICsgJ3htbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIj4nICsgIjx4bXBNTTpEb2N1bWVudElEPnV1aWQ6MDAwMDAwMDAtMWM4NC0zY2Y5LTg5YmEtYmVmMGU3MjljODMxIiArICI8L3htcE1NOkRvY3VtZW50SUQ+PC9yZGY6RGVzY3JpcHRpb24+IiArICc8L3JkZjpSREY+PC94OnhtcG1ldGE+PD94cGFja2V0IGVuZD0idyI/Pic7CisgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhLk1ldGFkYXRhKGRhdGEpOworICAgIGV4cGVjdCgoMCwgX3Rlc3RfdXRpbHMuaXNFbXB0eU9iaikobWV0YWRhdGEuZ2V0QWxsKCkpKS50b0VxdWFsKHRydWUpOworICB9KTsKKyAgaXQoInNob3VsZCBub3QgYmUgdnVsbmVyYWJsZSB0byB0aGUgYmlsbGlvbiBsYXVnaHMgYXR0YWNrIiwgZnVuY3Rpb24gKCkgeworICAgIGNvbnN0IGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIj8+JyArICI8IURPQ1RZUEUgbG9seiBbIiArICcgIDwhRU5USVRZIGxvbCAibG9sIj4nICsgJyAgPCFFTlRJVFkgbG9sMSAiJmxvbDsmbG9sOyZsb2w7JmxvbDsmbG9sOyZsb2w7JmxvbDsmbG9sOyZsb2w7JmxvbDsiPicgKyAnICA8IUVOVElUWSBsb2wyICImbG9sMTsmbG9sMTsmbG9sMTsmbG9sMTsmbG9sMTsmbG9sMTsmbG9sMTsmbG9sMTsiPicgKyAnICA8IUVOVElUWSBsb2wzICImbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsiPicgKyAnICA8IUVOVElUWSBsb2w0ICImbG9sMzsmbG9sMzsmbG9sMzsmbG9sMzsmbG9sMzsmbG9sMzsmbG9sMzsmbG9sMzsiPicgKyAnICA8IUVOVElUWSBsb2w1ICImbG9sNDsmbG9sNDsmbG9sNDsmbG9sNDsmbG9sNDsmbG9sNDsmbG9sNDsmbG9sNDsiPicgKyAnICA8IUVOVElUWSBsb2w2ICImbG9sNTsmbG9sNTsmbG9sNTsmbG9sNTsmbG9sNTsmbG9sNTsmbG9sNTsmbG9sNTsiPicgKyAnICA8IUVOVElUWSBsb2w3ICImbG9sNjsmbG9sNjsmbG9sNjsmbG9sNjsmbG9sNjsmbG9sNjsmbG9sNjsmbG9sNjsiPicgKyAnICA8IUVOVElUWSBsb2w4ICImbG9sNzsmbG9sNzsmbG9sNzsmbG9sNzsmbG9sNzsmbG9sNzsmbG9sNzsmbG9sNzsiPicgKyAnICA8IUVOVElUWSBsb2w5ICImbG9sODsmbG9sODsmbG9sODsmbG9sODsmbG9sODsmbG9sODsmbG9sODsmbG9sODsiPicgKyAiXT4iICsgJzxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+JyArICcgIDxyZGY6RGVzY3JpcHRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4nICsgIiAgICA8ZGM6dGl0bGU+IiArICIgICAgICA8cmRmOkFsdD4iICsgJyAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij5hJmxvbDk7YjwvcmRmOmxpPicgKyAiICAgICAgPC9yZGY6QWx0PiIgKyAiICAgIDwvZGM6dGl0bGU+IiArICIgIDwvcmRmOkRlc2NyaXB0aW9uPiIgKyAiPC9yZGY6UkRGPiI7CisgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhLk1ldGFkYXRhKGRhdGEpOworICAgIGV4cGVjdChtZXRhZGF0YS5oYXMoImRjOnRpdGxlIikpLnRvQmVUcnV0aHkoKTsKKyAgICBleHBlY3QobWV0YWRhdGEuaGFzKCJkYzpxdXgiKSkudG9CZUZhbHN5KCk7CisgICAgZXhwZWN0KG1ldGFkYXRhLmdldCgiZGM6dGl0bGUiKSkudG9FcXVhbCgiYSZsb2w5O2IiKTsKKyAgICBleHBlY3QobWV0YWRhdGEuZ2V0KCJkYzpxdXgiKSkudG9FcXVhbChudWxsKTsKKyAgICBleHBlY3QobWV0YWRhdGEuZ2V0QWxsKCkpLnRvRXF1YWwoeworICAgICAgImRjOnRpdGxlIjogImEmbG9sOTtiIgorICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvbXVybXVyaGFzaDNfc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvbXVybXVyaGFzaDNfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDEzYjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9tdXJtdXJoYXNoM19zcGVjLmpzCkBAIC0wLDAgKzEsNzEgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF9tdXJtdXJoYXNoID0gcmVxdWlyZSgiLi4vLi4vY29yZS9tdXJtdXJoYXNoMy5qcyIpOworCitkZXNjcmliZSgiTXVybXVySGFzaDNfNjQiLCBmdW5jdGlvbiAoKSB7CisgIGl0KCJpbnN0YW50aWF0ZXMgd2l0aG91dCBzZWVkIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBoYXNoID0gbmV3IF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KCk7CisgICAgZXhwZWN0KGhhc2gpLnRvRXF1YWwoamFzbWluZS5hbnkoX211cm11cmhhc2guTXVybXVySGFzaDNfNjQpKTsKKyAgfSk7CisgIGl0KCJpbnN0YW50aWF0ZXMgd2l0aCBzZWVkIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBoYXNoID0gbmV3IF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KDEpOworICAgIGV4cGVjdChoYXNoKS50b0VxdWFsKGphc21pbmUuYW55KF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KSk7CisgIH0pOworICB2YXIgaGV4RGlnZXN0RXhwZWN0ZWQgPSAiZjYxY2ZkYmZkYWUwZjY1ZSI7CisgIHZhciBzb3VyY2VUZXh0ID0gInRlc3QiOworICB2YXIgc291cmNlQ2hhckNvZGVzID0gWzExNiwgMTAxLCAxMTUsIDExNl07CisgIGl0KCJjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaCBmcm9tIGEgc3RyaW5nIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBoYXNoID0gbmV3IF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KCk7CisgICAgaGFzaC51cGRhdGUoc291cmNlVGV4dCk7CisgICAgZXhwZWN0KGhhc2guaGV4ZGlnZXN0KCkpLnRvRXF1YWwoaGV4RGlnZXN0RXhwZWN0ZWQpOworICB9KTsKKyAgaXQoImNvcnJlY3RseSBnZW5lcmF0ZXMgYSBoYXNoIGZyb20gYSBVaW50OEFycmF5IiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBoYXNoID0gbmV3IF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KCk7CisgICAgaGFzaC51cGRhdGUobmV3IFVpbnQ4QXJyYXkoc291cmNlQ2hhckNvZGVzKSk7CisgICAgZXhwZWN0KGhhc2guaGV4ZGlnZXN0KCkpLnRvRXF1YWwoaGV4RGlnZXN0RXhwZWN0ZWQpOworICB9KTsKKyAgaXQoImNvcnJlY3RseSBnZW5lcmF0ZXMgYSBoYXNoIGZyb20gYSBVaW50MzJBcnJheSIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgaGFzaCA9IG5ldyBfbXVybXVyaGFzaC5NdXJtdXJIYXNoM182NCgpOworICAgIGhhc2gudXBkYXRlKG5ldyBVaW50MzJBcnJheShuZXcgVWludDhBcnJheShzb3VyY2VDaGFyQ29kZXMpLmJ1ZmZlcikpOworICAgIGV4cGVjdChoYXNoLmhleGRpZ2VzdCgpKS50b0VxdWFsKGhleERpZ2VzdEV4cGVjdGVkKTsKKyAgfSk7CisgIGl0KCJjaGFuZ2VzIHRoZSBoYXNoIGFmdGVyIHVwZGF0ZSB3aXRob3V0IHNlZWQiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGhhc2ggPSBuZXcgX211cm11cmhhc2guTXVybXVySGFzaDNfNjQoKTsKKyAgICB2YXIgaGV4ZGlnZXN0MSwgaGV4ZGlnZXN0MjsKKyAgICBoYXNoLnVwZGF0ZShzb3VyY2VUZXh0KTsKKyAgICBoZXhkaWdlc3QxID0gaGFzaC5oZXhkaWdlc3QoKTsKKyAgICBoYXNoLnVwZGF0ZShzb3VyY2VUZXh0KTsKKyAgICBoZXhkaWdlc3QyID0gaGFzaC5oZXhkaWdlc3QoKTsKKyAgICBleHBlY3QoaGV4ZGlnZXN0MSkubm90LnRvRXF1YWwoaGV4ZGlnZXN0Mik7CisgIH0pOworICBpdCgiY2hhbmdlcyB0aGUgaGFzaCBhZnRlciB1cGRhdGUgd2l0aCBzZWVkIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBoYXNoID0gbmV3IF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KDEpOworICAgIHZhciBoZXhkaWdlc3QxLCBoZXhkaWdlc3QyOworICAgIGhhc2gudXBkYXRlKHNvdXJjZVRleHQpOworICAgIGhleGRpZ2VzdDEgPSBoYXNoLmhleGRpZ2VzdCgpOworICAgIGhhc2gudXBkYXRlKHNvdXJjZVRleHQpOworICAgIGhleGRpZ2VzdDIgPSBoYXNoLmhleGRpZ2VzdCgpOworICAgIGV4cGVjdChoZXhkaWdlc3QxKS5ub3QudG9FcXVhbChoZXhkaWdlc3QyKTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L25ldHdvcmtfc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvbmV0d29ya19zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjM3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L25ldHdvcmtfc3BlYy5qcwpAQCAtMCwwICsxLDEyMCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX25ldHdvcmsgPSByZXF1aXJlKCIuLi8uLi9kaXNwbGF5L25ldHdvcmsuanMiKTsKKworZGVzY3JpYmUoIm5ldHdvcmsiLCBmdW5jdGlvbiAoKSB7CisgIHZhciBwZGYxID0gbmV3IFVSTCgiLi4vcGRmcy90cmFjZW1vbmtleS5wZGYiLCB3aW5kb3cubG9jYXRpb24pLmhyZWY7CisgIHZhciBwZGYxTGVuZ3RoID0gMTAxNjMxNTsKKyAgaXQoInJlYWQgd2l0aG91dCBzdHJlYW0gYW5kIHJhbmdlIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9uZXR3b3JrLlBERk5ldHdvcmtTdHJlYW0oeworICAgICAgdXJsOiBwZGYxLAorICAgICAgcmFuZ2VDaHVua1NpemU6IDY1NTM2LAorICAgICAgZGlzYWJsZVN0cmVhbTogdHJ1ZSwKKyAgICAgIGRpc2FibGVSYW5nZTogdHJ1ZQorICAgIH0pOworICAgIHZhciBmdWxsUmVhZGVyID0gc3RyZWFtLmdldEZ1bGxSZWFkZXIoKTsKKyAgICB2YXIgaXNTdHJlYW1pbmdTdXBwb3J0ZWQsIGlzUmFuZ2VTdXBwb3J0ZWQ7CisgICAgdmFyIHByb21pc2UgPSBmdWxsUmVhZGVyLmhlYWRlcnNSZWFkeS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGlzU3RyZWFtaW5nU3VwcG9ydGVkID0gZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgICAgIGlzUmFuZ2VTdXBwb3J0ZWQgPSBmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQ7CisgICAgfSk7CisgICAgdmFyIGxlbiA9IDAsCisgICAgICAgIGNvdW50ID0gMDsKKworICAgIHZhciByZWFkID0gZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGZ1bGxSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHsKKyAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgbGVuICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoOworICAgICAgICByZXR1cm4gcmVhZCgpOworICAgICAgfSk7CisgICAgfTsKKworICAgIHZhciByZWFkUHJvbWlzZSA9IFByb21pc2UuYWxsKFtyZWFkKCksIHByb21pc2VdKTsKKyAgICByZWFkUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICBleHBlY3QobGVuKS50b0VxdWFsKHBkZjFMZW5ndGgpOworICAgICAgZXhwZWN0KGNvdW50KS50b0VxdWFsKDEpOworICAgICAgZXhwZWN0KGlzU3RyZWFtaW5nU3VwcG9ydGVkKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdChpc1JhbmdlU3VwcG9ydGVkKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICBkb25lLmZhaWwocmVhc29uKTsKKyAgICB9KTsKKyAgfSk7CisgIGl0KCJyZWFkIGN1c3RvbSByYW5nZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHZhciByYW5nZVNpemUgPSAzMjc2ODsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9uZXR3b3JrLlBERk5ldHdvcmtTdHJlYW0oeworICAgICAgdXJsOiBwZGYxLAorICAgICAgbGVuZ3RoOiBwZGYxTGVuZ3RoLAorICAgICAgcmFuZ2VDaHVua1NpemU6IHJhbmdlU2l6ZSwKKyAgICAgIGRpc2FibGVTdHJlYW06IHRydWUsCisgICAgICBkaXNhYmxlUmFuZ2U6IGZhbHNlCisgICAgfSk7CisgICAgdmFyIGZ1bGxSZWFkZXIgPSBzdHJlYW0uZ2V0RnVsbFJlYWRlcigpOworICAgIHZhciBpc1N0cmVhbWluZ1N1cHBvcnRlZCwgaXNSYW5nZVN1cHBvcnRlZCwgZnVsbFJlYWRlckNhbmNlbGxlZDsKKyAgICB2YXIgcHJvbWlzZSA9IGZ1bGxSZWFkZXIuaGVhZGVyc1JlYWR5LnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgaXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkOworICAgICAgaXNSYW5nZVN1cHBvcnRlZCA9IGZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZDsKKyAgICAgIGZ1bGxSZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiRG9uJ3QgbmVlZCBmdWxsUmVhZGVyLiIpKTsKKyAgICAgIGZ1bGxSZWFkZXJDYW5jZWxsZWQgPSB0cnVlOworICAgIH0pOworICAgIHZhciB0YWlsU2l6ZSA9IHBkZjFMZW5ndGggJSByYW5nZVNpemUgfHwgcmFuZ2VTaXplOworICAgIHZhciByYW5nZTFSZWFkZXIgPSBzdHJlYW0uZ2V0UmFuZ2VSZWFkZXIocGRmMUxlbmd0aCAtIHRhaWxTaXplIC0gcmFuZ2VTaXplLCBwZGYxTGVuZ3RoIC0gdGFpbFNpemUpOworICAgIHZhciByYW5nZTJSZWFkZXIgPSBzdHJlYW0uZ2V0UmFuZ2VSZWFkZXIocGRmMUxlbmd0aCAtIHRhaWxTaXplLCBwZGYxTGVuZ3RoKTsKKyAgICB2YXIgcmVzdWx0MSA9IHsKKyAgICAgIHZhbHVlOiAwCisgICAgfSwKKyAgICAgICAgcmVzdWx0MiA9IHsKKyAgICAgIHZhbHVlOiAwCisgICAgfTsKKworICAgIHZhciByZWFkID0gZnVuY3Rpb24gKHJlYWRlciwgbGVuUmVzdWx0KSB7CisgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7CisgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAgfQorCisgICAgICAgIGxlblJlc3VsdC52YWx1ZSArPSByZXN1bHQudmFsdWUuYnl0ZUxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHJlYWQocmVhZGVyLCBsZW5SZXN1bHQpOworICAgICAgfSk7CisgICAgfTsKKworICAgIHZhciByZWFkUHJvbWlzZXMgPSBQcm9taXNlLmFsbChbcmVhZChyYW5nZTFSZWFkZXIsIHJlc3VsdDEpLCByZWFkKHJhbmdlMlJlYWRlciwgcmVzdWx0MiksIHByb21pc2VdKTsKKyAgICByZWFkUHJvbWlzZXMudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QocmVzdWx0MS52YWx1ZSkudG9FcXVhbChyYW5nZVNpemUpOworICAgICAgZXhwZWN0KHJlc3VsdDIudmFsdWUpLnRvRXF1YWwodGFpbFNpemUpOworICAgICAgZXhwZWN0KGlzU3RyZWFtaW5nU3VwcG9ydGVkKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdChpc1JhbmdlU3VwcG9ydGVkKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KGZ1bGxSZWFkZXJDYW5jZWxsZWQpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBkb25lKCk7CisgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgZG9uZS5mYWlsKHJlYXNvbik7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9uZXR3b3JrX3V0aWxzX3NwZWMuanMgYi9saWIvdGVzdC91bml0L25ldHdvcmtfdXRpbHNfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzRiMTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9uZXR3b3JrX3V0aWxzX3NwZWMuanMKQEAgLTAsMCArMSwzNDkgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF9uZXR3b3JrX3V0aWxzID0gcmVxdWlyZSgiLi4vLi4vZGlzcGxheS9uZXR3b3JrX3V0aWxzLmpzIik7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uLy4uL3NoYXJlZC91dGlsLmpzIik7CisKK2Rlc2NyaWJlKCJuZXR3b3JrX3V0aWxzIiwgZnVuY3Rpb24gKCkgeworICBkZXNjcmliZSgidmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInJlamVjdHMgcmFuZ2UgY2h1bmsgc2l6ZXMgdGhhdCBhcmUgbm90IGxhcmdlciB0aGFuIHplcm8iLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoZnVuY3Rpb24gKCkgeworICAgICAgICAoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHsKKyAgICAgICAgICByYW5nZUNodW5rU2l6ZTogMAorICAgICAgICB9KTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJSYW5nZSBjaHVuayBzaXplIG11c3QgYmUgbGFyZ2VyIHRoYW4gemVybyIpKTsKKyAgICB9KTsKKyAgICBpdCgicmVqZWN0cyBkaXNhYmxlZCBvciBub24tSFRUUCByYW5nZSByZXF1ZXN0cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHsKKyAgICAgICAgZGlzYWJsZVJhbmdlOiB0cnVlLAorICAgICAgICBpc0h0dHA6IHRydWUsCisgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBoZWFkZXJOYW1lID0+IHsKKyAgICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtTGVuZ3RoIikgeworICAgICAgICAgICAgcmV0dXJuIDg7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGhlYWRlck5hbWU6ICR7aGVhZGVyTmFtZX1gKTsKKyAgICAgICAgfSwKKyAgICAgICAgcmFuZ2VDaHVua1NpemU6IDY0CisgICAgICB9KSkudG9FcXVhbCh7CisgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0czogZmFsc2UsCisgICAgICAgIHN1Z2dlc3RlZExlbmd0aDogOAorICAgICAgfSk7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7CisgICAgICAgIGRpc2FibGVSYW5nZTogZmFsc2UsCisgICAgICAgIGlzSHR0cDogZmFsc2UsCisgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBoZWFkZXJOYW1lID0+IHsKKyAgICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtTGVuZ3RoIikgeworICAgICAgICAgICAgcmV0dXJuIDg7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGhlYWRlck5hbWU6ICR7aGVhZGVyTmFtZX1gKTsKKyAgICAgICAgfSwKKyAgICAgICAgcmFuZ2VDaHVua1NpemU6IDY0CisgICAgICB9KSkudG9FcXVhbCh7CisgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0czogZmFsc2UsCisgICAgICAgIHN1Z2dlc3RlZExlbmd0aDogOAorICAgICAgfSk7CisgICAgfSk7CisgICAgaXQoInJlamVjdHMgaW52YWxpZCBBY2NlcHQtUmFuZ2VzIGhlYWRlciB2YWx1ZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7CisgICAgICAgIGRpc2FibGVSYW5nZTogZmFsc2UsCisgICAgICAgIGlzSHR0cDogdHJ1ZSwKKyAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGhlYWRlck5hbWUgPT4geworICAgICAgICAgIGlmIChoZWFkZXJOYW1lID09PSAiQWNjZXB0LVJhbmdlcyIpIHsKKyAgICAgICAgICAgIHJldHVybiAibm9uZSI7CisgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1MZW5ndGgiKSB7CisgICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaGVhZGVyTmFtZTogJHtoZWFkZXJOYW1lfWApOworICAgICAgICB9LAorICAgICAgICByYW5nZUNodW5rU2l6ZTogNjQKKyAgICAgIH0pKS50b0VxdWFsKHsKKyAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiBmYWxzZSwKKyAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiA4CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgicmVqZWN0cyBpbnZhbGlkIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyIHZhbHVlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHsKKyAgICAgICAgZGlzYWJsZVJhbmdlOiBmYWxzZSwKKyAgICAgICAgaXNIdHRwOiB0cnVlLAorICAgICAgICBnZXRSZXNwb25zZUhlYWRlcjogaGVhZGVyTmFtZSA9PiB7CisgICAgICAgICAgaWYgKGhlYWRlck5hbWUgPT09ICJBY2NlcHQtUmFuZ2VzIikgeworICAgICAgICAgICAgcmV0dXJuICJieXRlcyI7CisgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1FbmNvZGluZyIpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ3ppcCI7CisgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1MZW5ndGgiKSB7CisgICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaGVhZGVyTmFtZTogJHtoZWFkZXJOYW1lfWApOworICAgICAgICB9LAorICAgICAgICByYW5nZUNodW5rU2l6ZTogNjQKKyAgICAgIH0pKS50b0VxdWFsKHsKKyAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiBmYWxzZSwKKyAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiA4CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgicmVqZWN0cyBpbnZhbGlkIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB2YWx1ZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7CisgICAgICAgIGRpc2FibGVSYW5nZTogZmFsc2UsCisgICAgICAgIGlzSHR0cDogdHJ1ZSwKKyAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGhlYWRlck5hbWUgPT4geworICAgICAgICAgIGlmIChoZWFkZXJOYW1lID09PSAiQWNjZXB0LVJhbmdlcyIpIHsKKyAgICAgICAgICAgIHJldHVybiAiYnl0ZXMiOworICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRW5jb2RpbmciKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlck5hbWUgPT09ICJDb250ZW50LUxlbmd0aCIpIHsKKyAgICAgICAgICAgIHJldHVybiAiZWlnaHQiOworICAgICAgICAgIH0KKworICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICAgIH0sCisgICAgICAgIHJhbmdlQ2h1bmtTaXplOiA2NAorICAgICAgfSkpLnRvRXF1YWwoeworICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGZhbHNlLAorICAgICAgICBzdWdnZXN0ZWRMZW5ndGg6IHVuZGVmaW5lZAorICAgICAgfSk7CisgICAgfSk7CisgICAgaXQoInJlamVjdHMgZmlsZSBzaXplcyB0aGF0IGFyZSB0b28gc21hbGwgZm9yIHJhbmdlIHJlcXVlc3RzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoeworICAgICAgICBkaXNhYmxlUmFuZ2U6IGZhbHNlLAorICAgICAgICBpc0h0dHA6IHRydWUsCisgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBoZWFkZXJOYW1lID0+IHsKKyAgICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkFjY2VwdC1SYW5nZXMiKSB7CisgICAgICAgICAgICByZXR1cm4gImJ5dGVzIjsKKyAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlck5hbWUgPT09ICJDb250ZW50LUVuY29kaW5nIikgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1MZW5ndGgiKSB7CisgICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaGVhZGVyTmFtZTogJHtoZWFkZXJOYW1lfWApOworICAgICAgICB9LAorICAgICAgICByYW5nZUNodW5rU2l6ZTogNjQKKyAgICAgIH0pKS50b0VxdWFsKHsKKyAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiBmYWxzZSwKKyAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiA4CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgiYWNjZXB0cyBmaWxlIHNpemVzIGxhcmdlIGVub3VnaCBmb3IgcmFuZ2UgcmVxdWVzdHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7CisgICAgICAgIGRpc2FibGVSYW5nZTogZmFsc2UsCisgICAgICAgIGlzSHR0cDogdHJ1ZSwKKyAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGhlYWRlck5hbWUgPT4geworICAgICAgICAgIGlmIChoZWFkZXJOYW1lID09PSAiQWNjZXB0LVJhbmdlcyIpIHsKKyAgICAgICAgICAgIHJldHVybiAiYnl0ZXMiOworICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRW5jb2RpbmciKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlck5hbWUgPT09ICJDb250ZW50LUxlbmd0aCIpIHsKKyAgICAgICAgICAgIHJldHVybiA4MTkyOworICAgICAgICAgIH0KKworICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICAgIH0sCisgICAgICAgIHJhbmdlQ2h1bmtTaXplOiA2NAorICAgICAgfSkpLnRvRXF1YWwoeworICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IHRydWUsCisgICAgICAgIHN1Z2dlc3RlZExlbmd0aDogODE5MgorICAgICAgfSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlciIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgicmV0dXJucyBudWxsIHdoZW4gY29udGVudCBkaXNwb3NpdGlvbiBoZWFkZXIgaXMgYmxhbmsiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaGVhZGVyTmFtZTogJHtoZWFkZXJOYW1lfWApOworICAgICAgfSkpLnRvQmVOdWxsKCk7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9CZU51bGwoKTsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoaGVhZGVyTmFtZSA9PiB7CisgICAgICAgIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1EaXNwb3NpdGlvbiIpIHsKKyAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaGVhZGVyTmFtZTogJHtoZWFkZXJOYW1lfWApOworICAgICAgfSkpLnRvQmVOdWxsKCk7CisgICAgfSk7CisgICAgaXQoImdldHMgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHJlc3BvbnNlIGhlYWRlciIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoaGVhZGVyTmFtZSA9PiB7CisgICAgICAgIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1EaXNwb3NpdGlvbiIpIHsKKyAgICAgICAgICByZXR1cm4gImlubGluZSI7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaGVhZGVyTmFtZTogJHtoZWFkZXJOYW1lfWApOworICAgICAgfSkpLnRvQmVOdWxsKCk7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuICJhdHRhY2htZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9CZU51bGwoKTsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoaGVhZGVyTmFtZSA9PiB7CisgICAgICAgIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1EaXNwb3NpdGlvbiIpIHsKKyAgICAgICAgICByZXR1cm4gJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJmaWxlbmFtZS5wZGYiJzsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuICdhdHRhY2htZW50OyBmaWxlbmFtZT0iZmlsZW5hbWUucGRmIGFuZCBzcGFjZXMucGRmIic7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaGVhZGVyTmFtZTogJHtoZWFkZXJOYW1lfWApOworICAgICAgfSkpLnRvRXF1YWwoImZpbGVuYW1lLnBkZiBhbmQgc3BhY2VzLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShoZWFkZXJOYW1lID0+IHsKKyAgICAgICAgaWYgKGhlYWRlck5hbWUgPT09ICJDb250ZW50LURpc3Bvc2l0aW9uIikgeworICAgICAgICAgIHJldHVybiAnYXR0YWNobWVudDsgZmlsZW5hbWU9InRsO2RyLnBkZiInOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGhlYWRlck5hbWU6ICR7aGVhZGVyTmFtZX1gKTsKKyAgICAgIH0pKS50b0VxdWFsKCJ0bDtkci5wZGYiKTsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoaGVhZGVyTmFtZSA9PiB7CisgICAgICAgIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1EaXNwb3NpdGlvbiIpIHsKKyAgICAgICAgICByZXR1cm4gImF0dGFjaG1lbnQ7IGZpbGVuYW1lPWZpbGVuYW1lLnBkZiI7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaGVhZGVyTmFtZTogJHtoZWFkZXJOYW1lfWApOworICAgICAgfSkpLnRvRXF1YWwoImZpbGVuYW1lLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShoZWFkZXJOYW1lID0+IHsKKyAgICAgICAgaWYgKGhlYWRlck5hbWUgPT09ICJDb250ZW50LURpc3Bvc2l0aW9uIikgeworICAgICAgICAgIHJldHVybiAiYXR0YWNobWVudDsgZmlsZW5hbWU9ZmlsZW5hbWUucGRmIHNvbWVvdGhlcnBhcmFtIjsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJWU0JWI4JWFkJWU2JTk2JTg3LnBkZiInOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGhlYWRlck5hbWU6ICR7aGVhZGVyTmFtZX1gKTsKKyAgICAgIH0pKS50b0VxdWFsKCLkuK3mlocucGRmIik7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuICdhdHRhY2htZW50OyBmaWxlbmFtZT0iMTAwJS5wZGYiJzsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiMTAwJS5wZGYiKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgcmVzcG9uc2UgaGVhZGVyIChSRkMgNjI2NikiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuICJhdHRhY2htZW50OyBmaWxlbmFtZSo9ZmlsZW5hbWUucGRmIjsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuICJhdHRhY2htZW50OyBmaWxlbmFtZSo9JydmaWxlbmFtZS5wZGYiOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGhlYWRlck5hbWU6ICR7aGVhZGVyTmFtZX1gKTsKKyAgICAgIH0pKS50b0VxdWFsKCJmaWxlbmFtZS5wZGYiKTsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoaGVhZGVyTmFtZSA9PiB7CisgICAgICAgIGlmIChoZWFkZXJOYW1lID09PSAiQ29udGVudC1EaXNwb3NpdGlvbiIpIHsKKyAgICAgICAgICByZXR1cm4gImF0dGFjaG1lbnQ7IGZpbGVuYW1lKj11dGYtOCcnZmlsZW5hbWUucGRmIjsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuICJhdHRhY2htZW50OyBmaWxlbmFtZT1uby5wZGY7IGZpbGVuYW1lKj11dGYtOCcnZmlsZW5hbWUucGRmIjsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGhlYWRlck5hbWUgPT4geworICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gIkNvbnRlbnQtRGlzcG9zaXRpb24iKSB7CisgICAgICAgICAgcmV0dXJuICJhdHRhY2htZW50OyBmaWxlbmFtZSo9dXRmLTgnJ2ZpbGVuYW1lLnBkZjsgZmlsZW5hbWU9bm8ucGRmIjsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgfSk7CisgICAgaXQoImdldHMgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHJlc3BvbnNlIGhlYWRlciAoUkZDIDIyMzEpIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShoZWFkZXJOYW1lID0+IHsKKyAgICAgICAgaWYgKGhlYWRlck5hbWUgPT09ICJDb250ZW50LURpc3Bvc2l0aW9uIikgeworICAgICAgICAgIHJldHVybiAiYXR0YWNobWVudDsgZmlsZW5hbWUqMD1maWxlbmFtZTsgZmlsZW5hbWUqMT0ucGRmIjsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiZmlsZW5hbWUucGRmIik7CisgICAgfSk7CisgICAgaXQoIm9ubHkgZXh0cmFjdHMgZmlsZW5hbWUgd2l0aCBwZGYgZXh0ZW5zaW9uIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShoZWFkZXJOYW1lID0+IHsKKyAgICAgICAgaWYgKGhlYWRlck5hbWUgPT09ICJDb250ZW50LURpc3Bvc2l0aW9uIikgeworICAgICAgICAgIHJldHVybiAnYXR0YWNobWVudDsgZmlsZW5hbWU9ImZpbGVuYW1lLnBuZyInOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGhlYWRlck5hbWU6ICR7aGVhZGVyTmFtZX1gKTsKKyAgICAgIH0pKS50b0JlTnVsbCgpOworICAgIH0pOworICAgIGl0KCJleHRlbnNpb24gdmFsaWRhdGlvbiBpcyBjYXNlIGluc2Vuc2l0aXZlIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShoZWFkZXJOYW1lID0+IHsKKyAgICAgICAgaWYgKGhlYWRlck5hbWUgPT09ICJDb250ZW50LURpc3Bvc2l0aW9uIikgeworICAgICAgICAgIHJldHVybiAnZm9ybS1kYXRhOyBuYW1lPSJmaWVsZE5hbWUiOyBmaWxlbmFtZT0iZmlsZS5QZEYiJzsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBoZWFkZXJOYW1lOiAke2hlYWRlck5hbWV9YCk7CisgICAgICB9KSkudG9FcXVhbCgiZmlsZS5QZEYiKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIG1pc3NpbmcgUERGIGZpbGUgcmVzcG9uc2VzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSg0MDQsICJodHRwczovL2Zvby5jb20vYmFyLnBkZiIpKS50b0VxdWFsKG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKCdNaXNzaW5nIFBERiAiaHR0cHM6Ly9mb28uY29tL2Jhci5wZGYiLicpKTsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikoMCwgImZpbGU6Ly9mb28ucGRmIikpLnRvRXF1YWwobmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGICJmaWxlOi8vZm9vLnBkZiIuJykpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIHVuZXhwZWN0ZWQgcmVzcG9uc2VzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSgzMDIsICJodHRwczovL2Zvby5jb20vYmFyLnBkZiIpKS50b0VxdWFsKG5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlICgzMDIpIHdoaWxlIHJldHJpZXZpbmcgUERGICIgKyAnImh0dHBzOi8vZm9vLmNvbS9iYXIucGRmIi4nKSk7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKDAsICJodHRwczovL2Zvby5jb20vYmFyLnBkZiIpKS50b0VxdWFsKG5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlICgwKSB3aGlsZSByZXRyaWV2aW5nIFBERiAiICsgJyJodHRwczovL2Zvby5jb20vYmFyLnBkZiIuJykpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoInZhbGlkYXRlUmVzcG9uc2VTdGF0dXMiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoImFjY2VwdHMgdmFsaWQgcmVzcG9uc2Ugc3RhdHVzZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKDIwMCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKDIwNikpLnRvRXF1YWwodHJ1ZSk7CisgICAgfSk7CisgICAgaXQoInJlamVjdHMgaW52YWxpZCByZXNwb25zZSBzdGF0dXNlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSZXNwb25zZVN0YXR1cykoMzAyKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKDQwNCkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfbmV0d29ya191dGlscy52YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKShudWxsKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHVuZGVmaW5lZCkpLnRvRXF1YWwoZmFsc2UpOworICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvbm9kZV9zdHJlYW1fc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvbm9kZV9zdHJlYW1fc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU2YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC9ub2RlX3N0cmVhbV9zcGVjLmpzCkBAIC0wLDAgKzEsMjI5IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uLy4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfaXNfbm9kZSA9IHJlcXVpcmUoIi4uLy4uL3NoYXJlZC9pc19ub2RlLmpzIik7CisKK3ZhciBfbm9kZV9zdHJlYW0gPSByZXF1aXJlKCIuLi8uLi9kaXNwbGF5L25vZGVfc3RyZWFtLmpzIik7CisKK2lmICghX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgdGhyb3cgbmV3IEVycm9yKCdUaGUgIm5vZGVfc3RyZWFtIiB1bml0LXRlc3RzIGNhbiBvbmx5IGJlIHJ1biBpbiBOb2RlLmpzIGVudmlyb25tZW50cy4nKTsKK30KKworY29uc3QgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKKworY29uc3QgdXJsID0gcmVxdWlyZSgidXJsIik7CisKK2NvbnN0IGh0dHAgPSByZXF1aXJlKCJodHRwIik7CisKK2NvbnN0IGZzID0gcmVxdWlyZSgiZnMiKTsKKworZGVzY3JpYmUoIm5vZGVfc3RyZWFtIiwgZnVuY3Rpb24gKCkgeworICBsZXQgc2VydmVyID0gbnVsbDsKKyAgbGV0IHBvcnQgPSBudWxsOworICBjb25zdCBwZGYgPSB1cmwucGFyc2UoZW5jb2RlVVJJKCJmaWxlOi8vIiArIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAiLi90ZXN0L3BkZnMvdHJhY2Vtb25rZXkucGRmIikpKS5ocmVmOworICBjb25zdCBwZGZMZW5ndGggPSAxMDE2MzE1OworICBiZWZvcmVBbGwoZG9uZSA9PiB7CisgICAgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7CisgICAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuY3dkKCkgKyAiL3Rlc3QvcGRmcyIgKyByZXF1ZXN0LnVybDsKKyAgICAgIGZzLmxzdGF0KGZpbGVQYXRoLCAoZXJyb3IsIHN0YXQpID0+IHsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCk7CisgICAgICAgICAgcmVzcG9uc2UuZW5kKGBGaWxlICR7cmVxdWVzdC51cmx9IG5vdCBmb3VuZCFgKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVycy5yYW5nZSkgeworICAgICAgICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBzdGF0LnNpemU7CisgICAgICAgICAgY29uc3Qgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCk7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDIwMCwgeworICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9wZGYiLAorICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIjogY29udGVudExlbmd0aCwKKyAgICAgICAgICAgICJBY2NlcHQtUmFuZ2VzIjogImJ5dGVzIgorICAgICAgICAgIH0pOworICAgICAgICAgIHN0cmVhbS5waXBlKHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSByZXF1ZXN0LmhlYWRlcnMucmFuZ2Uuc3BsaXQoIj0iKVsxXS5zcGxpdCgiLSIpLm1hcCh4ID0+IHsKKyAgICAgICAgICAgIHJldHVybiBOdW1iZXIoeCk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgY29uc3Qgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCwgeworICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjA2LCB7CisgICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL3BkZiIKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBzdHJlYW0ucGlwZShyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0pLmxpc3RlbigwKTsKKyAgICBwb3J0ID0gc2VydmVyLmFkZHJlc3MoKS5wb3J0OworICAgIGRvbmUoKTsKKyAgfSk7CisgIGFmdGVyQWxsKGRvbmUgPT4geworICAgIHNlcnZlci5jbG9zZSgpOworICAgIGRvbmUoKTsKKyAgfSk7CisgIGl0KCJyZWFkIGJvdGggaHR0cChzKSBhbmQgZmlsZXN5c3RlbSBwZGYgZmlsZXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIGNvbnN0IHN0cmVhbTEgPSBuZXcgX25vZGVfc3RyZWFtLlBERk5vZGVTdHJlYW0oeworICAgICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke3BvcnR9L3RyYWNlbW9ua2V5LnBkZmAsCisgICAgICByYW5nZUNodW5rU2l6ZTogNjU1MzYsCisgICAgICBkaXNhYmxlU3RyZWFtOiB0cnVlLAorICAgICAgZGlzYWJsZVJhbmdlOiB0cnVlCisgICAgfSk7CisgICAgY29uc3Qgc3RyZWFtMiA9IG5ldyBfbm9kZV9zdHJlYW0uUERGTm9kZVN0cmVhbSh7CisgICAgICB1cmw6IHBkZiwKKyAgICAgIHJhbmdlQ2h1bmtTaXplOiA2NTUzNiwKKyAgICAgIGRpc2FibGVTdHJlYW06IHRydWUsCisgICAgICBkaXNhYmxlUmFuZ2U6IHRydWUKKyAgICB9KTsKKyAgICBjb25zdCBmdWxsUmVhZGVyMSA9IHN0cmVhbTEuZ2V0RnVsbFJlYWRlcigpOworICAgIGNvbnN0IGZ1bGxSZWFkZXIyID0gc3RyZWFtMi5nZXRGdWxsUmVhZGVyKCk7CisgICAgbGV0IGlzU3RyZWFtaW5nU3VwcG9ydGVkMSwgaXNSYW5nZVN1cHBvcnRlZDE7CisgICAgY29uc3QgcHJvbWlzZTEgPSBmdWxsUmVhZGVyMS5oZWFkZXJzUmVhZHkudGhlbigoKSA9PiB7CisgICAgICBpc1N0cmVhbWluZ1N1cHBvcnRlZDEgPSBmdWxsUmVhZGVyMS5pc1N0cmVhbWluZ1N1cHBvcnRlZDsKKyAgICAgIGlzUmFuZ2VTdXBwb3J0ZWQxID0gZnVsbFJlYWRlcjEuaXNSYW5nZVN1cHBvcnRlZDsKKyAgICB9KTsKKyAgICBsZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQyLCBpc1JhbmdlU3VwcG9ydGVkMjsKKyAgICBjb25zdCBwcm9taXNlMiA9IGZ1bGxSZWFkZXIyLmhlYWRlcnNSZWFkeS50aGVuKCgpID0+IHsKKyAgICAgIGlzU3RyZWFtaW5nU3VwcG9ydGVkMiA9IGZ1bGxSZWFkZXIyLmlzU3RyZWFtaW5nU3VwcG9ydGVkOworICAgICAgaXNSYW5nZVN1cHBvcnRlZDIgPSBmdWxsUmVhZGVyMi5pc1JhbmdlU3VwcG9ydGVkOworICAgIH0pOworICAgIGxldCBsZW4xID0gMCwKKyAgICAgICAgbGVuMiA9IDA7CisKKyAgICBjb25zdCByZWFkMSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmdWxsUmVhZGVyMS5yZWFkKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgeworICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICAgIH0KKworICAgICAgICBsZW4xICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoOworICAgICAgICByZXR1cm4gcmVhZDEoKTsKKyAgICAgIH0pOworICAgIH07CisKKyAgICBjb25zdCByZWFkMiA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmdWxsUmVhZGVyMi5yZWFkKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgeworICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICAgIH0KKworICAgICAgICBsZW4yICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoOworICAgICAgICByZXR1cm4gcmVhZDIoKTsKKyAgICAgIH0pOworICAgIH07CisKKyAgICBjb25zdCByZWFkUHJvbWlzZSA9IFByb21pc2UuYWxsKFtyZWFkMSgpLCByZWFkMigpLCBwcm9taXNlMSwgcHJvbWlzZTJdKTsKKyAgICByZWFkUHJvbWlzZS50aGVuKHJlc3VsdCA9PiB7CisgICAgICBleHBlY3QoaXNTdHJlYW1pbmdTdXBwb3J0ZWQxKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdChpc1JhbmdlU3VwcG9ydGVkMSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoaXNTdHJlYW1pbmdTdXBwb3J0ZWQyKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdChpc1JhbmdlU3VwcG9ydGVkMikudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QobGVuMSkudG9FcXVhbChwZGZMZW5ndGgpOworICAgICAgZXhwZWN0KGxlbjEpLnRvRXF1YWwobGVuMik7CisgICAgICBkb25lKCk7CisgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgIGRvbmUuZmFpbChyZWFzb24pOworICAgIH0pOworICB9KTsKKyAgaXQoInJlYWQgY3VzdG9tIHJhbmdlcyBmb3IgYm90aCBodHRwKHMpIGFuZCBmaWxlc3lzdGVtIHVybHMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIGNvbnN0IHJhbmdlU2l6ZSA9IDMyNzY4OworICAgIGNvbnN0IHN0cmVhbTEgPSBuZXcgX25vZGVfc3RyZWFtLlBERk5vZGVTdHJlYW0oeworICAgICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke3BvcnR9L3RyYWNlbW9ua2V5LnBkZmAsCisgICAgICBsZW5ndGg6IHBkZkxlbmd0aCwKKyAgICAgIHJhbmdlQ2h1bmtTaXplOiByYW5nZVNpemUsCisgICAgICBkaXNhYmxlU3RyZWFtOiB0cnVlLAorICAgICAgZGlzYWJsZVJhbmdlOiBmYWxzZQorICAgIH0pOworICAgIGNvbnN0IHN0cmVhbTIgPSBuZXcgX25vZGVfc3RyZWFtLlBERk5vZGVTdHJlYW0oeworICAgICAgdXJsOiBwZGYsCisgICAgICBsZW5ndGg6IHBkZkxlbmd0aCwKKyAgICAgIHJhbmdlQ2h1bmtTaXplOiByYW5nZVNpemUsCisgICAgICBkaXNhYmxlU3RyZWFtOiB0cnVlLAorICAgICAgZGlzYWJsZVJhbmdlOiBmYWxzZQorICAgIH0pOworICAgIGNvbnN0IGZ1bGxSZWFkZXIxID0gc3RyZWFtMS5nZXRGdWxsUmVhZGVyKCk7CisgICAgY29uc3QgZnVsbFJlYWRlcjIgPSBzdHJlYW0yLmdldEZ1bGxSZWFkZXIoKTsKKyAgICBsZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQxLCBpc1JhbmdlU3VwcG9ydGVkMSwgZnVsbFJlYWRlckNhbmNlbGxlZDE7CisgICAgbGV0IGlzU3RyZWFtaW5nU3VwcG9ydGVkMiwgaXNSYW5nZVN1cHBvcnRlZDIsIGZ1bGxSZWFkZXJDYW5jZWxsZWQyOworICAgIGNvbnN0IHByb21pc2UxID0gZnVsbFJlYWRlcjEuaGVhZGVyc1JlYWR5LnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgaXNTdHJlYW1pbmdTdXBwb3J0ZWQxID0gZnVsbFJlYWRlcjEuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CisgICAgICBpc1JhbmdlU3VwcG9ydGVkMSA9IGZ1bGxSZWFkZXIxLmlzUmFuZ2VTdXBwb3J0ZWQ7CisgICAgICBmdWxsUmVhZGVyMS5jYW5jZWwobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJEb24ndCBuZWVkIGZ1bGxSZWFkZXIxLiIpKTsKKyAgICAgIGZ1bGxSZWFkZXJDYW5jZWxsZWQxID0gdHJ1ZTsKKyAgICB9KTsKKyAgICBjb25zdCBwcm9taXNlMiA9IGZ1bGxSZWFkZXIyLmhlYWRlcnNSZWFkeS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGlzU3RyZWFtaW5nU3VwcG9ydGVkMiA9IGZ1bGxSZWFkZXIyLmlzU3RyZWFtaW5nU3VwcG9ydGVkOworICAgICAgaXNSYW5nZVN1cHBvcnRlZDIgPSBmdWxsUmVhZGVyMi5pc1JhbmdlU3VwcG9ydGVkOworICAgICAgZnVsbFJlYWRlcjIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiRG9uJ3QgbmVlZCBmdWxsUmVhZGVyMi4iKSk7CisgICAgICBmdWxsUmVhZGVyQ2FuY2VsbGVkMiA9IHRydWU7CisgICAgfSk7CisgICAgY29uc3QgdGFpbFNpemUgPSBwZGZMZW5ndGggJSByYW5nZVNpemUgfHwgcmFuZ2VTaXplOworICAgIGNvbnN0IHJhbmdlMTFSZWFkZXIgPSBzdHJlYW0xLmdldFJhbmdlUmVhZGVyKHBkZkxlbmd0aCAtIHRhaWxTaXplIC0gcmFuZ2VTaXplLCBwZGZMZW5ndGggLSB0YWlsU2l6ZSk7CisgICAgY29uc3QgcmFuZ2UxMlJlYWRlciA9IHN0cmVhbTEuZ2V0UmFuZ2VSZWFkZXIocGRmTGVuZ3RoIC0gdGFpbFNpemUsIHBkZkxlbmd0aCk7CisgICAgY29uc3QgcmFuZ2UyMVJlYWRlciA9IHN0cmVhbTIuZ2V0UmFuZ2VSZWFkZXIocGRmTGVuZ3RoIC0gdGFpbFNpemUgLSByYW5nZVNpemUsIHBkZkxlbmd0aCAtIHRhaWxTaXplKTsKKyAgICBjb25zdCByYW5nZTIyUmVhZGVyID0gc3RyZWFtMi5nZXRSYW5nZVJlYWRlcihwZGZMZW5ndGggLSB0YWlsU2l6ZSwgcGRmTGVuZ3RoKTsKKyAgICBjb25zdCByZXN1bHQxMSA9IHsKKyAgICAgIHZhbHVlOiAwCisgICAgfSwKKyAgICAgICAgICByZXN1bHQxMiA9IHsKKyAgICAgIHZhbHVlOiAwCisgICAgfTsKKyAgICBjb25zdCByZXN1bHQyMSA9IHsKKyAgICAgIHZhbHVlOiAwCisgICAgfSwKKyAgICAgICAgICByZXN1bHQyMiA9IHsKKyAgICAgIHZhbHVlOiAwCisgICAgfTsKKworICAgIGNvbnN0IHJlYWQgPSBmdW5jdGlvbiAocmVhZGVyLCBsZW5SZXN1bHQpIHsKKyAgICAgIHJldHVybiByZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHsKKyAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgbGVuUmVzdWx0LnZhbHVlICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoOworICAgICAgICByZXR1cm4gcmVhZChyZWFkZXIsIGxlblJlc3VsdCk7CisgICAgICB9KTsKKyAgICB9OworCisgICAgY29uc3QgcmVhZFByb21pc2VzID0gUHJvbWlzZS5hbGwoW3JlYWQocmFuZ2UxMVJlYWRlciwgcmVzdWx0MTEpLCByZWFkKHJhbmdlMTJSZWFkZXIsIHJlc3VsdDEyKSwgcmVhZChyYW5nZTIxUmVhZGVyLCByZXN1bHQyMSksIHJlYWQocmFuZ2UyMlJlYWRlciwgcmVzdWx0MjIpLCBwcm9taXNlMSwgcHJvbWlzZTJdKTsKKyAgICByZWFkUHJvbWlzZXMudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QocmVzdWx0MTEudmFsdWUpLnRvRXF1YWwocmFuZ2VTaXplKTsKKyAgICAgIGV4cGVjdChyZXN1bHQxMi52YWx1ZSkudG9FcXVhbCh0YWlsU2l6ZSk7CisgICAgICBleHBlY3QocmVzdWx0MjEudmFsdWUpLnRvRXF1YWwocmFuZ2VTaXplKTsKKyAgICAgIGV4cGVjdChyZXN1bHQyMi52YWx1ZSkudG9FcXVhbCh0YWlsU2l6ZSk7CisgICAgICBleHBlY3QoaXNTdHJlYW1pbmdTdXBwb3J0ZWQxKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdChpc1JhbmdlU3VwcG9ydGVkMSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChmdWxsUmVhZGVyQ2FuY2VsbGVkMSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdChpc1N0cmVhbWluZ1N1cHBvcnRlZDIpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KGlzUmFuZ2VTdXBwb3J0ZWQyKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KGZ1bGxSZWFkZXJDYW5jZWxsZWQyKS50b0VxdWFsKHRydWUpOworICAgICAgZG9uZSgpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIGRvbmUuZmFpbChyZWFzb24pOworICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvcGFyc2VyX3NwZWMuanMgYi9saWIvdGVzdC91bml0L3BhcnNlcl9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OWQ2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L3BhcnNlcl9zcGVjLmpzCkBAIC0wLDAgKzEsMjQwIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfcGFyc2VyID0gcmVxdWlyZSgiLi4vLi4vY29yZS9wYXJzZXIuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi4vLi4vY29yZS9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi4vLi4vY29yZS9zdHJlYW0uanMiKTsKKworZGVzY3JpYmUoInBhcnNlciIsIGZ1bmN0aW9uICgpIHsKKyAgZGVzY3JpYmUoIlBhcnNlciIsIGZ1bmN0aW9uICgpIHsKKyAgICBkZXNjcmliZSgiaW5saW5lU3RyZWFtU2tpcEVJIiwgZnVuY3Rpb24gKCkgeworICAgICAgaXQoInNob3VsZCBza2lwIG92ZXIgdGhlIEVJIG1hcmtlciBpZiBpdCBpcyBmb3VuZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nID0gInEgMSAwIDAgMSAwIDAgY20gQkkgL1cgMTAgL0ggMTAgL0JQQyAxICIgKyAiL0YgL0E4NSBJRCBhYmMxMjN+PiBFSSBRIjsKKyAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oc3RyaW5nKTsKKyAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IF9wYXJzZXIuUGFyc2VyKHsKKyAgICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoaW5wdXQpLAorICAgICAgICAgIHhyZWY6IG51bGwsCisgICAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCisgICAgICAgIH0pOworICAgICAgICBwYXJzZXIuaW5saW5lU3RyZWFtU2tpcEVJKGlucHV0KTsKKyAgICAgICAgZXhwZWN0KGlucHV0LnBvcykudG9FcXVhbChzdHJpbmcuaW5kZXhPZigiUSIpKTsKKyAgICAgICAgZXhwZWN0KGlucHV0LnBlZWtCeXRlKCkpLnRvRXF1YWwoMHg1MSk7CisgICAgICB9KTsKKyAgICAgIGl0KCJzaG91bGQgc2tpcCB0byB0aGUgZW5kIG9mIHN0cmVhbSBpZiB0aGUgRUkgbWFya2VyIGlzIG5vdCBmb3VuZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nID0gInEgMSAwIDAgMSAwIDAgY20gQkkgL1cgMTAgL0ggMTAgL0JQQyAxIC9GIC9BODUgSUQgYWJjMTIzfj4gUSI7CisgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHN0cmluZyk7CisgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfcGFyc2VyLlBhcnNlcih7CisgICAgICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKGlucHV0KSwKKyAgICAgICAgICB4cmVmOiBudWxsLAorICAgICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQorICAgICAgICB9KTsKKyAgICAgICAgcGFyc2VyLmlubGluZVN0cmVhbVNraXBFSShpbnB1dCk7CisgICAgICAgIGV4cGVjdChpbnB1dC5wb3MpLnRvRXF1YWwoc3RyaW5nLmxlbmd0aCk7CisgICAgICAgIGV4cGVjdChpbnB1dC5wZWVrQnl0ZSgpKS50b0VxdWFsKC0xKTsKKyAgICAgIH0pOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIkxleGVyIiwgZnVuY3Rpb24gKCkgeworICAgIGRlc2NyaWJlKCJuZXh0Q2hhciIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGl0KCJzaG91bGQgcmV0dXJuIGFuZCBzZXQgLTEgd2hlbiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIiIpOworICAgICAgICBjb25zdCBsZXhlciA9IG5ldyBfcGFyc2VyLkxleGVyKGlucHV0KTsKKyAgICAgICAgZXhwZWN0KGxleGVyLm5leHRDaGFyKCkpLnRvRXF1YWwoLTEpOworICAgICAgICBleHBlY3QobGV4ZXIuY3VycmVudENoYXIpLnRvRXF1YWwoLTEpOworICAgICAgfSk7CisgICAgICBpdCgic2hvdWxkIHJldHVybiBhbmQgc2V0IHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIxMjMiKTsKKyAgICAgICAgY29uc3QgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihpbnB1dCk7CisgICAgICAgIGV4cGVjdChsZXhlci5uZXh0Q2hhcigpKS50b0VxdWFsKDB4MzIpOworICAgICAgICBleHBlY3QobGV4ZXIuY3VycmVudENoYXIpLnRvRXF1YWwoMHgzMik7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBkZXNjcmliZSgicGVla0NoYXIiLCBmdW5jdGlvbiAoKSB7CisgICAgICBpdCgic2hvdWxkIG9ubHkgcmV0dXJuIC0xIHdoZW4gdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIiKTsKKyAgICAgICAgY29uc3QgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihpbnB1dCk7CisgICAgICAgIGV4cGVjdChsZXhlci5wZWVrQ2hhcigpKS50b0VxdWFsKC0xKTsKKyAgICAgICAgZXhwZWN0KGxleGVyLmN1cnJlbnRDaGFyKS50b0VxdWFsKC0xKTsKKyAgICAgIH0pOworICAgICAgaXQoInNob3VsZCBvbmx5IHJldHVybiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiMTIzIik7CisgICAgICAgIGNvbnN0IGxleGVyID0gbmV3IF9wYXJzZXIuTGV4ZXIoaW5wdXQpOworICAgICAgICBleHBlY3QobGV4ZXIucGVla0NoYXIoKSkudG9FcXVhbCgweDMyKTsKKyAgICAgICAgZXhwZWN0KGxleGVyLmN1cnJlbnRDaGFyKS50b0VxdWFsKDB4MzEpOworICAgICAgfSk7CisgICAgfSk7CisgICAgZGVzY3JpYmUoImdldE51bWJlciIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGl0KCJzaG91bGQgc3RvcCBwYXJzaW5nIG51bWJlcnMgYXQgdGhlIGVuZCBvZiBzdHJlYW0iLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIxMS4yMzQiKTsKKyAgICAgICAgY29uc3QgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihpbnB1dCk7CisgICAgICAgIGV4cGVjdChsZXhlci5nZXROdW1iZXIoKSkudG9FcXVhbCgxMS4yMzQpOworICAgICAgfSk7CisgICAgICBpdCgic2hvdWxkIHBhcnNlIFBvc3RTY3JpcHQgbnVtYmVycyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3QgbnVtYmVycyA9IFsiLS4wMDIiLCAiMzQuNSIsICItMy42MiIsICIxMjMuNmUxMCIsICIxRS01IiwgIi0xLiIsICIwLjAiLCAiMTIzIiwgIi05OCIsICI0MzQ0NSIsICIwIiwgIisxNyJdOworCisgICAgICAgIGZvciAoY29uc3QgbnVtYmVyIG9mIG51bWJlcnMpIHsKKyAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShudW1iZXIpOworICAgICAgICAgIGNvbnN0IGxleGVyID0gbmV3IF9wYXJzZXIuTGV4ZXIoaW5wdXQpOworICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGxleGVyLmdldE51bWJlcigpLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gcGFyc2VGbG9hdChudW1iZXIpOworCisgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gZXhwZWN0ZWQgJiYgTWF0aC5hYnMocmVzdWx0IC0gZXhwZWN0ZWQpIDwgMWUtMTUpIHsKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZ1enp5IG1hdGNoaW5nICIke3Jlc3VsdH0iIHdpdGggIiR7ZXhwZWN0ZWR9IiB0byBgICsgIndvcmstYXJvdW5kIHJvdW5kaW5nIGJ1Z3MgaW4gQ2hyb21pdW0gYnJvd3NlcnMuIik7CisgICAgICAgICAgICBleHBlY3QodHJ1ZSkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGl0KCJzaG91bGQgaWdub3JlIGRvdWJsZSBuZWdhdGl2ZSBiZWZvcmUgbnVtYmVyIiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiLS0yMDUuODgiKTsKKyAgICAgICAgY29uc3QgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihpbnB1dCk7CisgICAgICAgIGV4cGVjdChsZXhlci5nZXROdW1iZXIoKSkudG9FcXVhbCgtMjA1Ljg4KTsKKyAgICAgIH0pOworICAgICAgaXQoInNob3VsZCBpZ25vcmUgbWludXMgc2lnbnMgaW4gdGhlIG1pZGRsZSBvZiBudW1iZXIiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIyMDUtLS44OCIpOworICAgICAgICBjb25zdCBsZXhlciA9IG5ldyBfcGFyc2VyLkxleGVyKGlucHV0KTsKKyAgICAgICAgZXhwZWN0KGxleGVyLmdldE51bWJlcigpKS50b0VxdWFsKDIwNS44OCk7CisgICAgICB9KTsKKyAgICAgIGl0KCJzaG91bGQgaWdub3JlIGxpbmUtYnJlYWtzIGJldHdlZW4gb3BlcmF0b3IgYW5kIGRpZ2l0IGluIG51bWJlciIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3QgbWludXNJbnB1dCA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiLVxyXG4yMDUuODgiKTsKKyAgICAgICAgY29uc3QgbWludXNMZXhlciA9IG5ldyBfcGFyc2VyLkxleGVyKG1pbnVzSW5wdXQpOworICAgICAgICBleHBlY3QobWludXNMZXhlci5nZXROdW1iZXIoKSkudG9FcXVhbCgtMjA1Ljg4KTsKKyAgICAgICAgY29uc3QgcGx1c0lucHV0ID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIrXHJcbjIwNS44OCIpOworICAgICAgICBjb25zdCBwbHVzTGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihwbHVzSW5wdXQpOworICAgICAgICBleHBlY3QocGx1c0xleGVyLmdldE51bWJlcigpKS50b0VxdWFsKDIwNS44OCk7CisgICAgICB9KTsKKyAgICAgIGl0KCJzaG91bGQgdHJlYXQgYSBzaW5nbGUgZGVjaW1hbCBwb2ludCBhcyB6ZXJvIiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiLiIpOworICAgICAgICBjb25zdCBsZXhlciA9IG5ldyBfcGFyc2VyLkxleGVyKGlucHV0KTsKKyAgICAgICAgZXhwZWN0KGxleGVyLmdldE51bWJlcigpKS50b0VxdWFsKDApOworICAgICAgICBjb25zdCBudW1iZXJzID0gWyIuLiIsICItLiIsICIrLiIsICItXHJcbi4iLCAiK1xyXG4uIl07CisKKyAgICAgICAgZm9yIChjb25zdCBudW1iZXIgb2YgbnVtYmVycykgeworICAgICAgICAgIGNvbnN0IGludmFsaWRJbnB1dCA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShudW1iZXIpOworICAgICAgICAgIGNvbnN0IGludmFsaWRMZXhlciA9IG5ldyBfcGFyc2VyLkxleGVyKGludmFsaWRJbnB1dCk7CisgICAgICAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnZhbGlkTGV4ZXIuZ2V0TnVtYmVyKCk7CisgICAgICAgICAgfSkudG9UaHJvd0Vycm9yKF91dGlsLkZvcm1hdEVycm9yLCAvXkludmFsaWQgbnVtYmVyOlxzLyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgaXQoInNob3VsZCBoYW5kbGUgZ2x1ZWQgbnVtYmVycyBhbmQgb3BlcmF0b3JzIiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiMTIzRVQiKTsKKyAgICAgICAgY29uc3QgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihpbnB1dCk7CisgICAgICAgIGV4cGVjdChsZXhlci5nZXROdW1iZXIoKSkudG9FcXVhbCgxMjMpOworICAgICAgICBleHBlY3QobGV4ZXIuY3VycmVudENoYXIpLnRvRXF1YWwoMHg0NSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBkZXNjcmliZSgiZ2V0U3RyaW5nIiwgZnVuY3Rpb24gKCkgeworICAgICAgaXQoInNob3VsZCBzdG9wIHBhcnNpbmcgc3RyaW5ncyBhdCB0aGUgZW5kIG9mIHN0cmVhbSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIigxJDQpIik7CisKKyAgICAgICAgaW5wdXQuZ2V0Qnl0ZSA9IGZ1bmN0aW9uIChzdXBlcl9nZXRCeXRlKSB7CisgICAgICAgICAgY29uc3QgY2ggPSBzdXBlcl9nZXRCeXRlLmNhbGwoaW5wdXQpOworICAgICAgICAgIHJldHVybiBjaCA9PT0gMHgyNCA/IC0xIDogY2g7CisgICAgICAgIH0uYmluZChpbnB1dCwgaW5wdXQuZ2V0Qnl0ZSk7CisKKyAgICAgICAgY29uc3QgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihpbnB1dCk7CisgICAgICAgIGV4cGVjdChsZXhlci5nZXRTdHJpbmcoKSkudG9FcXVhbCgiMSIpOworICAgICAgfSk7CisgICAgICBpdCgic2hvdWxkIGlnbm9yZSBlc2NhcGVkIENSIGFuZCBMRiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIihcXDEwMVxcXHJcblxcMTAyXFxcclxcMTAzXFxcblxcMTA0KSIpOworICAgICAgICBjb25zdCBsZXhlciA9IG5ldyBfcGFyc2VyLkxleGVyKGlucHV0KTsKKyAgICAgICAgZXhwZWN0KGxleGVyLmdldFN0cmluZygpKS50b0VxdWFsKCJBQkNEIik7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBkZXNjcmliZSgiZ2V0SGV4U3RyaW5nIiwgZnVuY3Rpb24gKCkgeworICAgICAgaXQoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIG9uIGJhZCBpbnB1dCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjw3IDAgMiAxNSA1IDIgMiAyIDQgMyAyIDQ+Iik7CisgICAgICAgIGNvbnN0IGxleGVyID0gbmV3IF9wYXJzZXIuTGV4ZXIoaW5wdXQpOworICAgICAgICBleHBlY3QobGV4ZXIuZ2V0SGV4U3RyaW5nKCkpLnRvRXF1YWwoJ3AhVSIkMicpOworICAgICAgfSk7CisgICAgfSk7CisgICAgZGVzY3JpYmUoImdldE5hbWUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBpdCgic2hvdWxkIGhhbmRsZSBOYW1lcyB3aXRoIGludmFsaWQgdXNhZ2Ugb2YgTlVNQkVSIFNJR04gKCMpIiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb25zdCBpbnB1dE5hbWVzID0gWyIvIyA2ODAgMCBSIiwgIi8jQVF3ZXJ0eSIsICIvI0E8PC9CIl07CisgICAgICAgIGNvbnN0IGV4cGVjdGVkTmFtZXMgPSBbIiMiLCAiI0FRd2VydHkiLCAiI0EiXTsKKworICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbnB1dE5hbWVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShpbnB1dE5hbWVzW2ldKTsKKyAgICAgICAgICBjb25zdCBsZXhlciA9IG5ldyBfcGFyc2VyLkxleGVyKGlucHV0KTsKKyAgICAgICAgICBleHBlY3QobGV4ZXIuZ2V0TmFtZSgpKS50b0VxdWFsKF9wcmltaXRpdmVzLk5hbWUuZ2V0KGV4cGVjdGVkTmFtZXNbaV0pKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiTGluZWFyaXphdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIG5vdCBmaW5kIGEgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgc3RyZWFtMSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiMyAwIG9ialxuIiArICI8PFxuIiArICIvTGVuZ3RoIDQ2MjJcbiIgKyAiL0ZpbHRlciAvRmxhdGVEZWNvZGVcbiIgKyAiPj5cbiIgKyAiZW5kb2JqIik7CisgICAgICBleHBlY3QoX3BhcnNlci5MaW5lYXJpemF0aW9uLmNyZWF0ZShzdHJlYW0xKSkudG9FcXVhbChudWxsKTsKKyAgICAgIGNvbnN0IHN0cmVhbTIgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjEgMCBvYmpcbiIgKyAiPDxcbiIgKyAiL0xpbmVhcml6ZWQgMFxuIiArICI+PlxuIiArICJlbmRvYmoiKTsKKyAgICAgIGV4cGVjdChfcGFyc2VyLkxpbmVhcml6YXRpb24uY3JlYXRlKHN0cmVhbTIpKS50b0VxdWFsKG51bGwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgYWNjZXB0IGEgdmFsaWQgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIxMzEgMCBvYmpcbiIgKyAiPDxcbiIgKyAiL0xpbmVhcml6ZWQgMVxuIiArICIvTyAxMzNcbiIgKyAiL0ggWyAxMzg4IDg2MyBdXG4iICsgIi9MIDkwXG4iICsgIi9FIDQzNTczXG4iICsgIi9OIDE4XG4iICsgIi9UIDE5Mzg4M1xuIiArICI+PlxuIiArICJlbmRvYmoiKTsKKyAgICAgIGNvbnN0IGV4cGVjdGVkTGluZWFyaXphdGlvbkRpY3QgPSB7CisgICAgICAgIGxlbmd0aDogOTAsCisgICAgICAgIGhpbnRzOiBbMTM4OCwgODYzXSwKKyAgICAgICAgb2JqZWN0TnVtYmVyRmlyc3Q6IDEzMywKKyAgICAgICAgZW5kRmlyc3Q6IDQzNTczLAorICAgICAgICBudW1QYWdlczogMTgsCisgICAgICAgIG1haW5YUmVmRW50cmllc09mZnNldDogMTkzODgzLAorICAgICAgICBwYWdlRmlyc3Q6IDAKKyAgICAgIH07CisgICAgICBleHBlY3QoX3BhcnNlci5MaW5lYXJpemF0aW9uLmNyZWF0ZShzdHJlYW0pKS50b0VxdWFsKGV4cGVjdGVkTGluZWFyaXphdGlvbkRpY3QpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVqZWN0IGEgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IHdpdGggaW52YWxpZCAiICsgImludGVnZXIgcGFyYW1ldGVycyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHN0cmVhbTEgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjEgMCBvYmpcbiIgKyAiPDxcbiIgKyAiL0xpbmVhcml6ZWQgMVxuIiArICIvTyAxMzNcbiIgKyAiL0ggWyAxMzg4IDg2MyBdXG4iICsgIi9MIDE5NjYyMlxuIiArICIvRSA0MzU3M1xuIiArICIvTiAxOFxuIiArICIvVCAxOTM4ODNcbiIgKyAiPj5cbiIgKyAiZW5kb2JqIik7CisgICAgICBleHBlY3QoZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gX3BhcnNlci5MaW5lYXJpemF0aW9uLmNyZWF0ZShzdHJlYW0xKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCdUaGUgIkwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiAnICsgImRpY3Rpb25hcnkgZG9lcyBub3QgZXF1YWwgdGhlIHN0cmVhbSBsZW5ndGguIikpOworICAgICAgY29uc3Qgc3RyZWFtMiA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiMSAwIG9ialxuIiArICI8PFxuIiArICIvTGluZWFyaXplZCAxXG4iICsgIi9PIDEzM1xuIiArICIvSCBbIDEzODggODYzIF1cbiIgKyAiL0wgODRcbiIgKyAiL0UgMFxuIiArICIvTiAxOFxuIiArICIvVCAxOTM4ODNcbiIgKyAiPj5cbiIgKyAiZW5kb2JqIik7CisgICAgICBleHBlY3QoZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gX3BhcnNlci5MaW5lYXJpemF0aW9uLmNyZWF0ZShzdHJlYW0yKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCdUaGUgIkUiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuJykpOworICAgICAgY29uc3Qgc3RyZWFtMyA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiMSAwIG9ialxuIiArICI8PFxuIiArICIvTGluZWFyaXplZCAxXG4iICsgIi9PIC9hYmNcbiIgKyAiL0ggWyAxMzg4IDg2MyBdXG4iICsgIi9MIDg5XG4iICsgIi9FIDQzNTczXG4iICsgIi9OIDE4XG4iICsgIi9UIDE5Mzg4M1xuIiArICI+PlxuIiArICJlbmRvYmoiKTsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBfcGFyc2VyLkxpbmVhcml6YXRpb24uY3JlYXRlKHN0cmVhbTMpOworICAgICAgfSkudG9UaHJvdyhuZXcgRXJyb3IoJ1RoZSAiTyIgcGFyYW1ldGVyIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4nKSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZWplY3QgYSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgd2l0aCBpbnZhbGlkIGhpbnQgcGFyYW1ldGVycyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHN0cmVhbTEgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjEgMCBvYmpcbiIgKyAiPDxcbiIgKyAiL0xpbmVhcml6ZWQgMVxuIiArICIvTyAxMzNcbiIgKyAiL0ggMTM4OFxuIiArICIvTCA4MFxuIiArICIvRSA0MzU3M1xuIiArICIvTiAxOFxuIiArICIvVCAxOTM4ODNcbiIgKyAiPj5cbiIgKyAiZW5kb2JqIik7CisgICAgICBleHBlY3QoZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gX3BhcnNlci5MaW5lYXJpemF0aW9uLmNyZWF0ZShzdHJlYW0xKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKSk7CisgICAgICBjb25zdCBzdHJlYW0yID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIxIDAgb2JqXG4iICsgIjw8XG4iICsgIi9MaW5lYXJpemVkIDFcbiIgKyAiL08gMTMzXG4iICsgIi9IIFsgMTM4OCBdXG4iICsgIi9MIDg0XG4iICsgIi9FIDQzNTczXG4iICsgIi9OIDE4XG4iICsgIi9UIDE5Mzg4M1xuIiArICI+PlxuIiArICJlbmRvYmoiKTsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBfcGFyc2VyLkxpbmVhcml6YXRpb24uY3JlYXRlKHN0cmVhbTIpOworICAgICAgfSkudG9UaHJvdyhuZXcgRXJyb3IoIkhpbnQgYXJyYXkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpKTsKKyAgICAgIGNvbnN0IHN0cmVhbTMgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjEgMCBvYmpcbiIgKyAiPDxcbiIgKyAiL0xpbmVhcml6ZWQgMVxuIiArICIvTyAxMzNcbiIgKyAiL0ggWyAxMzg4IDg2MyAwIDIzNF1cbiIgKyAiL0wgOTNcbiIgKyAiL0UgNDM1NzNcbiIgKyAiL04gMThcbiIgKyAiL1QgMTkzODgzXG4iICsgIj4+XG4iICsgImVuZG9iaiIpOworICAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZXIuTGluZWFyaXphdGlvbi5jcmVhdGUoc3RyZWFtMyk7CisgICAgICB9KS50b1Rocm93KG5ldyBFcnJvcigiSGludCAoMikgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L3BkZl9maW5kX2NvbnRyb2xsZXJfc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvcGRmX2ZpbmRfY29udHJvbGxlcl9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MGMyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L3BkZl9maW5kX2NvbnRyb2xsZXJfc3BlYy5qcwpAQCAtMCwwICsxLDE5OSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3Rlc3RfdXRpbHMgPSByZXF1aXJlKCIuL3Rlc3RfdXRpbHMuanMiKTsKKwordmFyIF91aV91dGlscyA9IHJlcXVpcmUoIi4uLy4uL3dlYi91aV91dGlscy5qcyIpOworCit2YXIgX2FwaSA9IHJlcXVpcmUoIi4uLy4uL2Rpc3BsYXkvYXBpLmpzIik7CisKK3ZhciBfcGRmX2ZpbmRfY29udHJvbGxlciA9IHJlcXVpcmUoIi4uLy4uL3dlYi9wZGZfZmluZF9jb250cm9sbGVyLmpzIik7CisKK3ZhciBfcGRmX2xpbmtfc2VydmljZSA9IHJlcXVpcmUoIi4uLy4uL3dlYi9wZGZfbGlua19zZXJ2aWNlLmpzIik7CisKK2NsYXNzIE1vY2tMaW5rU2VydmljZSBleHRlbmRzIF9wZGZfbGlua19zZXJ2aWNlLlNpbXBsZUxpbmtTZXJ2aWNlIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLl9wYWdlID0gMTsKKyAgICB0aGlzLl9wZGZEb2N1bWVudCA9IG51bGw7CisgIH0KKworICBzZXREb2N1bWVudChwZGZEb2N1bWVudCkgeworICAgIHRoaXMuX3BkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7CisgIH0KKworICBnZXQgcGFnZXNDb3VudCgpIHsKKyAgICByZXR1cm4gdGhpcy5fcGRmRG9jdW1lbnQubnVtUGFnZXM7CisgIH0KKworICBnZXQgcGFnZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZTsKKyAgfQorCisgIHNldCBwYWdlKHZhbHVlKSB7CisgICAgdGhpcy5fcGFnZSA9IHZhbHVlOworICB9CisKK30KKworZGVzY3JpYmUoInBkZl9maW5kX2NvbnRyb2xsZXIiLCBmdW5jdGlvbiAoKSB7CisgIGxldCBldmVudEJ1czsKKyAgbGV0IHBkZkZpbmRDb250cm9sbGVyOworICBiZWZvcmVFYWNoKGZ1bmN0aW9uIChkb25lKSB7CisgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSAoMCwgX2FwaS5nZXREb2N1bWVudCkoKDAsIF90ZXN0X3V0aWxzLmJ1aWxkR2V0RG9jdW1lbnRQYXJhbXMpKCJ0cmFjZW1vbmtleS5wZGYiKSk7CisgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwZGZEb2N1bWVudCkgeworICAgICAgZXZlbnRCdXMgPSBuZXcgX3VpX3V0aWxzLkV2ZW50QnVzKCk7CisgICAgICBjb25zdCBsaW5rU2VydmljZSA9IG5ldyBNb2NrTGlua1NlcnZpY2UoKTsKKyAgICAgIGxpbmtTZXJ2aWNlLnNldERvY3VtZW50KHBkZkRvY3VtZW50KTsKKyAgICAgIHBkZkZpbmRDb250cm9sbGVyID0gbmV3IF9wZGZfZmluZF9jb250cm9sbGVyLlBERkZpbmRDb250cm9sbGVyKHsKKyAgICAgICAgbGlua1NlcnZpY2UsCisgICAgICAgIGV2ZW50QnVzCisgICAgICB9KTsKKyAgICAgIHBkZkZpbmRDb250cm9sbGVyLnNldERvY3VtZW50KHBkZkRvY3VtZW50KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7CisgICAgZXZlbnRCdXMgPSBudWxsOworICAgIHBkZkZpbmRDb250cm9sbGVyID0gbnVsbDsKKyAgfSk7CisKKyAgZnVuY3Rpb24gdGVzdFNlYXJjaCh7CisgICAgcGFyYW1ldGVycywKKyAgICBtYXRjaGVzUGVyUGFnZSwKKyAgICBzZWxlY3RlZE1hdGNoCisgIH0pIHsKKyAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgIHBkZkZpbmRDb250cm9sbGVyLmV4ZWN1dGVDb21tYW5kKCJmaW5kIiwgcGFyYW1ldGVycyk7CisgICAgICBsZXQgdG90YWxQYWdlcyA9IG1hdGNoZXNQZXJQYWdlLmxlbmd0aDsKKworICAgICAgZm9yIChsZXQgaSA9IHRvdGFsUGFnZXMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAobWF0Y2hlc1BlclBhZ2VbaV0gPiAwKSB7CisgICAgICAgICAgdG90YWxQYWdlcyA9IGkgKyAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNvbnN0IHRvdGFsTWF0Y2hlcyA9IG1hdGNoZXNQZXJQYWdlLnJlZHVjZSgoYSwgYikgPT4geworICAgICAgICByZXR1cm4gYSArIGI7CisgICAgICB9KTsKKyAgICAgIGV2ZW50QnVzLm9uKCJ1cGRhdGVmaW5kbWF0Y2hlc2NvdW50IiwgZnVuY3Rpb24gb25VcGRhdGVGaW5kTWF0Y2hlc0NvdW50KGV2dCkgeworICAgICAgICBpZiAocGRmRmluZENvbnRyb2xsZXIucGFnZU1hdGNoZXMubGVuZ3RoICE9PSB0b3RhbFBhZ2VzKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnRCdXMub2ZmKCJ1cGRhdGVmaW5kbWF0Y2hlc2NvdW50Iiwgb25VcGRhdGVGaW5kTWF0Y2hlc0NvdW50KTsKKyAgICAgICAgZXhwZWN0KGV2dC5tYXRjaGVzQ291bnQudG90YWwpLnRvQmUodG90YWxNYXRjaGVzKTsKKworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsUGFnZXM7IGkrKykgeworICAgICAgICAgIGV4cGVjdChwZGZGaW5kQ29udHJvbGxlci5wYWdlTWF0Y2hlc1tpXS5sZW5ndGgpLnRvRXF1YWwobWF0Y2hlc1BlclBhZ2VbaV0pOworICAgICAgICB9CisKKyAgICAgICAgZXhwZWN0KHBkZkZpbmRDb250cm9sbGVyLnNlbGVjdGVkLnBhZ2VJZHgpLnRvRXF1YWwoc2VsZWN0ZWRNYXRjaC5wYWdlSW5kZXgpOworICAgICAgICBleHBlY3QocGRmRmluZENvbnRyb2xsZXIuc2VsZWN0ZWQubWF0Y2hJZHgpLnRvRXF1YWwoc2VsZWN0ZWRNYXRjaC5tYXRjaEluZGV4KTsKKyAgICAgICAgcmVzb2x2ZSgpOworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworICBpdCgicGVyZm9ybXMgYSBub3JtYWwgc2VhcmNoIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICB0ZXN0U2VhcmNoKHsKKyAgICAgIHBhcmFtZXRlcnM6IHsKKyAgICAgICAgcXVlcnk6ICJEeW5hbWljIiwKKyAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsCisgICAgICAgIGVudGlyZVdvcmQ6IGZhbHNlLAorICAgICAgICBwaHJhc2VTZWFyY2g6IHRydWUsCisgICAgICAgIGZpbmRQcmV2aW91czogZmFsc2UKKyAgICAgIH0sCisgICAgICBtYXRjaGVzUGVyUGFnZTogWzExLCA1LCAwLCAzLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAzLCA0LCA0XSwKKyAgICAgIHNlbGVjdGVkTWF0Y2g6IHsKKyAgICAgICAgcGFnZUluZGV4OiAwLAorICAgICAgICBtYXRjaEluZGV4OiAwCisgICAgICB9CisgICAgfSkudGhlbihkb25lKTsKKyAgfSk7CisgIGl0KCJwZXJmb3JtcyBhIG5vcm1hbCBzZWFyY2ggYW5kIGZpbmRzIHRoZSBwcmV2aW91cyByZXN1bHQiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHRlc3RTZWFyY2goeworICAgICAgcGFyYW1ldGVyczogeworICAgICAgICBxdWVyeTogImNvbmZlcmVuY2UiLAorICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSwKKyAgICAgICAgZW50aXJlV29yZDogZmFsc2UsCisgICAgICAgIHBocmFzZVNlYXJjaDogdHJ1ZSwKKyAgICAgICAgZmluZFByZXZpb3VzOiB0cnVlCisgICAgICB9LAorICAgICAgbWF0Y2hlc1BlclBhZ2U6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA1XSwKKyAgICAgIHNlbGVjdGVkTWF0Y2g6IHsKKyAgICAgICAgcGFnZUluZGV4OiAxMywKKyAgICAgICAgbWF0Y2hJbmRleDogNAorICAgICAgfQorICAgIH0pLnRoZW4oZG9uZSk7CisgIH0pOworICBpdCgicGVyZm9ybXMgYSBjYXNlIHNlbnNpdGl2ZSBzZWFyY2giLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHRlc3RTZWFyY2goeworICAgICAgcGFyYW1ldGVyczogeworICAgICAgICBxdWVyeTogIkR5bmFtaWMiLAorICAgICAgICBjYXNlU2Vuc2l0aXZlOiB0cnVlLAorICAgICAgICBlbnRpcmVXb3JkOiBmYWxzZSwKKyAgICAgICAgcGhyYXNlU2VhcmNoOiB0cnVlLAorICAgICAgICBmaW5kUHJldmlvdXM6IGZhbHNlCisgICAgICB9LAorICAgICAgbWF0Y2hlc1BlclBhZ2U6IFszLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAzXSwKKyAgICAgIHNlbGVjdGVkTWF0Y2g6IHsKKyAgICAgICAgcGFnZUluZGV4OiAwLAorICAgICAgICBtYXRjaEluZGV4OiAwCisgICAgICB9CisgICAgfSkudGhlbihkb25lKTsKKyAgfSk7CisgIGl0KCJwZXJmb3JtcyBhbiBlbnRpcmUgd29yZCBzZWFyY2giLCBmdW5jdGlvbiAoZG9uZSkgeworICAgIHRlc3RTZWFyY2goeworICAgICAgcGFyYW1ldGVyczogeworICAgICAgICBxdWVyeTogIkdvdmVybm1lbnQiLAorICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSwKKyAgICAgICAgZW50aXJlV29yZDogdHJ1ZSwKKyAgICAgICAgcGhyYXNlU2VhcmNoOiB0cnVlLAorICAgICAgICBmaW5kUHJldmlvdXM6IGZhbHNlCisgICAgICB9LAorICAgICAgbWF0Y2hlc1BlclBhZ2U6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwXSwKKyAgICAgIHNlbGVjdGVkTWF0Y2g6IHsKKyAgICAgICAgcGFnZUluZGV4OiAxMiwKKyAgICAgICAgbWF0Y2hJbmRleDogMAorICAgICAgfQorICAgIH0pLnRoZW4oZG9uZSk7CisgIH0pOworICBpdCgicGVyZm9ybXMgYSBtdWx0aXBsZSB0ZXJtIChubyBwaHJhc2UpIHNlYXJjaCIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgdGVzdFNlYXJjaCh7CisgICAgICBwYXJhbWV0ZXJzOiB7CisgICAgICAgIHF1ZXJ5OiAiYWx0ZXJuYXRlIHNvbHV0aW9uIiwKKyAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsCisgICAgICAgIGVudGlyZVdvcmQ6IGZhbHNlLAorICAgICAgICBwaHJhc2VTZWFyY2g6IGZhbHNlLAorICAgICAgICBmaW5kUHJldmlvdXM6IGZhbHNlCisgICAgICB9LAorICAgICAgbWF0Y2hlc1BlclBhZ2U6IFswLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCA0LCAwLCAwLCAwLCAwLCAwXSwKKyAgICAgIHNlbGVjdGVkTWF0Y2g6IHsKKyAgICAgICAgcGFnZUluZGV4OiA1LAorICAgICAgICBtYXRjaEluZGV4OiAwCisgICAgICB9CisgICAgfSkudGhlbihkb25lKTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L3BkZl9maW5kX3V0aWxzX3NwZWMuanMgYi9saWIvdGVzdC91bml0L3BkZl9maW5kX3V0aWxzX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5YzFkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvcGRmX2ZpbmRfdXRpbHNfc3BlYy5qcwpAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfcGRmX2ZpbmRfdXRpbHMgPSByZXF1aXJlKCIuLi8uLi93ZWIvcGRmX2ZpbmRfdXRpbHMuanMiKTsKKworZGVzY3JpYmUoInBkZl9maW5kX3V0aWxzIiwgZnVuY3Rpb24gKCkgeworICBkZXNjcmliZSgiZ2V0Q2hhcmFjdGVyVHlwZSIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiZ2V0cyBleHBlY3RlZCBjaGFyYWN0ZXIgdHlwZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBjaGFyYWN0ZXJzID0geworICAgICAgICBBOiBfcGRmX2ZpbmRfdXRpbHMuQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVIsCisgICAgICAgIGE6IF9wZGZfZmluZF91dGlscy5DaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUiwKKyAgICAgICAgIjAiOiBfcGRmX2ZpbmRfdXRpbHMuQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVIsCisgICAgICAgICI1IjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuQUxQSEFfTEVUVEVSLAorICAgICAgICDDhDogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuQUxQSEFfTEVUVEVSLAorICAgICAgICDDpDogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuQUxQSEFfTEVUVEVSLAorICAgICAgICBfOiBfcGRmX2ZpbmRfdXRpbHMuQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVIsCisgICAgICAgICIgIjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuU1BBQ0UsCisgICAgICAgICJcdCI6IF9wZGZfZmluZF91dGlscy5DaGFyYWN0ZXJUeXBlLlNQQUNFLAorICAgICAgICAiXHIiOiBfcGRmX2ZpbmRfdXRpbHMuQ2hhcmFjdGVyVHlwZS5TUEFDRSwKKyAgICAgICAgIlxuIjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuU1BBQ0UsCisgICAgICAgICJceEEwIjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuU1BBQ0UsCisgICAgICAgICItIjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuUFVOQ1QsCisgICAgICAgICIsIjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuUFVOQ1QsCisgICAgICAgICIuIjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuUFVOQ1QsCisgICAgICAgICI7IjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuUFVOQ1QsCisgICAgICAgICI6IjogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuUFVOQ1QsCisgICAgICAgICJcdTIxMjIiOiBfcGRmX2ZpbmRfdXRpbHMuQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVIsCisgICAgICAgIOC4pTogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuVEhBSV9MRVRURVIsCisgICAgICAgIOSAgDogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuSEFOX0xFVFRFUiwKKyAgICAgICAg76WQOiBfcGRmX2ZpbmRfdXRpbHMuQ2hhcmFjdGVyVHlwZS5IQU5fTEVUVEVSLAorICAgICAgICDjg4A6IF9wZGZfZmluZF91dGlscy5DaGFyYWN0ZXJUeXBlLktBVEFLQU5BX0xFVFRFUiwKKyAgICAgICAg44GQOiBfcGRmX2ZpbmRfdXRpbHMuQ2hhcmFjdGVyVHlwZS5ISVJBR0FOQV9MRVRURVIsCisgICAgICAgIO++gDogX3BkZl9maW5kX3V0aWxzLkNoYXJhY3RlclR5cGUuSEFMRldJRFRIX0tBVEFLQU5BX0xFVFRFUgorICAgICAgfTsKKworICAgICAgZm9yIChjb25zdCBjaGFyYWN0ZXIgaW4gY2hhcmFjdGVycykgeworICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApOworICAgICAgICBjb25zdCB0eXBlID0gY2hhcmFjdGVyc1tjaGFyYWN0ZXJdOworICAgICAgICBleHBlY3QoKDAsIF9wZGZfZmluZF91dGlscy5nZXRDaGFyYWN0ZXJUeXBlKShjaGFyQ29kZSkpLnRvRXF1YWwodHlwZSk7CisgICAgICB9CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC9wZGZfaGlzdG9yeV9zcGVjLmpzIGIvbGliL3Rlc3QvdW5pdC9wZGZfaGlzdG9yeV9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODA2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L3BkZl9oaXN0b3J5X3NwZWMuanMKQEAgLTAsMCArMSw5NSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3BkZl9oaXN0b3J5ID0gcmVxdWlyZSgiLi4vLi4vd2ViL3BkZl9oaXN0b3J5LmpzIik7CisKK2Rlc2NyaWJlKCJwZGZfaGlzdG9yeSIsIGZ1bmN0aW9uICgpIHsKKyAgZGVzY3JpYmUoImlzRGVzdEhhc2hlc0VxdWFsIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcmVqZWN0IG5vbi1lcXVhbCBkZXN0aW5hdGlvbiBoYXNoZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9wZGZfaGlzdG9yeS5pc0Rlc3RIYXNoZXNFcXVhbCkobnVsbCwgInBhZ2UuMTU3IikpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfcGRmX2hpc3RvcnkuaXNEZXN0SGFzaGVzRXF1YWwpKCJ0aXRsZS4wIiwgInBhZ2UuMTU3IikpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfcGRmX2hpc3RvcnkuaXNEZXN0SGFzaGVzRXF1YWwpKCJwYWdlPTEmem9vbT1hdXRvIiwgInBhZ2UuMTU3IikpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfcGRmX2hpc3RvcnkuaXNEZXN0SGFzaGVzRXF1YWwpKCJuYW1lZGRlc3QtcGFnZS4xNTciLCAicGFnZS4xNTciKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF9wZGZfaGlzdG9yeS5pc0Rlc3RIYXNoZXNFcXVhbCkoInBhZ2UuMTU3IiwgIm5hbWVkZGVzdD1wYWdlLjE1NyIpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGNvbnN0IGRlc3RBcnJheVN0cmluZyA9IEpTT04uc3RyaW5naWZ5KFt7CisgICAgICAgIG51bTogMzc1NywKKyAgICAgICAgZ2VuOiAwCisgICAgICB9LCB7CisgICAgICAgIG5hbWU6ICJYWVoiCisgICAgICB9LCA5Mi45MTgsIDc0OC45NzIsIG51bGxdKTsKKyAgICAgIGV4cGVjdCgoMCwgX3BkZl9oaXN0b3J5LmlzRGVzdEhhc2hlc0VxdWFsKShkZXN0QXJyYXlTdHJpbmcsICJwYWdlLjE1NyIpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3BkZl9oaXN0b3J5LmlzRGVzdEhhc2hlc0VxdWFsKSgicGFnZS4xNTciLCBkZXN0QXJyYXlTdHJpbmcpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGFjY2VwdCBlcXVhbCBkZXN0aW5hdGlvbiBoYXNoZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9wZGZfaGlzdG9yeS5pc0Rlc3RIYXNoZXNFcXVhbCkoInBhZ2UuMTU3IiwgInBhZ2UuMTU3IikpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF9wZGZfaGlzdG9yeS5pc0Rlc3RIYXNoZXNFcXVhbCkoIm5hbWVkZGVzdD1wYWdlLjE1NyIsICJwYWdlLjE1NyIpKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfcGRmX2hpc3RvcnkuaXNEZXN0SGFzaGVzRXF1YWwpKCJuYW1lZGRlc3Q9cGFnZS4xNTcmem9vbT0xMDAiLCAicGFnZS4xNTciKSkudG9FcXVhbCh0cnVlKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJpc0Rlc3RBcnJheXNFcXVhbCIsIGZ1bmN0aW9uICgpIHsKKyAgICBjb25zdCBmaXJzdERlc3QgPSBbeworICAgICAgbnVtOiAxLAorICAgICAgZ2VuOiAwCisgICAgfSwgeworICAgICAgbmFtZTogIlhZWiIKKyAgICB9LCAwLCAzNzUsIG51bGxdOworICAgIGNvbnN0IHNlY29uZERlc3QgPSBbeworICAgICAgbnVtOiA1LAorICAgICAgZ2VuOiAwCisgICAgfSwgeworICAgICAgbmFtZTogIlhZWiIKKyAgICB9LCAwLCAzNzUsIG51bGxdOworICAgIGNvbnN0IHRoaXJkRGVzdCA9IFt7CisgICAgICBudW06IDEsCisgICAgICBnZW46IDAKKyAgICB9LCB7CisgICAgICBuYW1lOiAiWFlaIgorICAgIH0sIDc1MCwgMCwgbnVsbF07CisgICAgY29uc3QgZm91cnRoRGVzdCA9IFt7CisgICAgICBudW06IDEsCisgICAgICBnZW46IDAKKyAgICB9LCB7CisgICAgICBuYW1lOiAiWFlaIgorICAgIH0sIDAsIDM3NSwgMS4wXTsKKyAgICBjb25zdCBmaWZ0aERlc3QgPSBbeworICAgICAgZ2VuOiAwLAorICAgICAgbnVtOiAxCisgICAgfSwgeworICAgICAgbmFtZTogIlhZWiIKKyAgICB9LCAwLCAzNzUsIG51bGxdOworICAgIGl0KCJzaG91bGQgcmVqZWN0IG5vbi1lcXVhbCBkZXN0aW5hdGlvbiBhcnJheXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF9wZGZfaGlzdG9yeS5pc0Rlc3RBcnJheXNFcXVhbCkoZmlyc3REZXN0LCB1bmRlZmluZWQpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3BkZl9oaXN0b3J5LmlzRGVzdEFycmF5c0VxdWFsKShmaXJzdERlc3QsIFsxLCAyLCAzLCA0LCA1XSkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfcGRmX2hpc3RvcnkuaXNEZXN0QXJyYXlzRXF1YWwpKGZpcnN0RGVzdCwgc2Vjb25kRGVzdCkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfcGRmX2hpc3RvcnkuaXNEZXN0QXJyYXlzRXF1YWwpKGZpcnN0RGVzdCwgdGhpcmREZXN0KSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF9wZGZfaGlzdG9yeS5pc0Rlc3RBcnJheXNFcXVhbCkoZmlyc3REZXN0LCBmb3VydGhEZXN0KSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBhY2NlcHQgZXF1YWwgZGVzdGluYXRpb24gYXJyYXlzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfcGRmX2hpc3RvcnkuaXNEZXN0QXJyYXlzRXF1YWwpKGZpcnN0RGVzdCwgZmlyc3REZXN0KSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3BkZl9oaXN0b3J5LmlzRGVzdEFycmF5c0VxdWFsKShmaXJzdERlc3QsIGZpZnRoRGVzdCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBjb25zdCBmaXJzdERlc3RDb3B5ID0gZmlyc3REZXN0LnNsaWNlKCk7CisgICAgICBleHBlY3QoZmlyc3REZXN0KS5ub3QudG9CZShmaXJzdERlc3RDb3B5KTsKKyAgICAgIGV4cGVjdCgoMCwgX3BkZl9oaXN0b3J5LmlzRGVzdEFycmF5c0VxdWFsKShmaXJzdERlc3QsIGZpcnN0RGVzdENvcHkpKS50b0VxdWFsKHRydWUpOworICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvcHJpbWl0aXZlc19zcGVjLmpzIGIvbGliL3Rlc3QvdW5pdC9wcmltaXRpdmVzX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyMjVjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvcHJpbWl0aXZlc19zcGVjLmpzCkBAIC0wLDAgKzEsNTEyIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfcHJpbWl0aXZlcyA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvcHJpbWl0aXZlcy5qcyIpOworCit2YXIgX3N0cmVhbSA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvc3RyZWFtLmpzIik7CisKK3ZhciBfdGVzdF91dGlscyA9IHJlcXVpcmUoIi4vdGVzdF91dGlscy5qcyIpOworCitkZXNjcmliZSgicHJpbWl0aXZlcyIsIGZ1bmN0aW9uICgpIHsKKyAgZGVzY3JpYmUoIk5hbWUiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCByZXRhaW4gdGhlIGdpdmVuIG5hbWUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBnaXZlbk5hbWUgPSAiRm9udCI7CisKKyAgICAgIGNvbnN0IG5hbWUgPSBfcHJpbWl0aXZlcy5OYW1lLmdldChnaXZlbk5hbWUpOworCisgICAgICBleHBlY3QobmFtZS5uYW1lKS50b0VxdWFsKGdpdmVuTmFtZSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBjcmVhdGUgb25seSBvbmUgb2JqZWN0IGZvciBhIG5hbWUgYW5kIGNhY2hlIGl0IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgZmlyc3RGb250ID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZvbnQiKTsKKworICAgICAgY29uc3Qgc2Vjb25kRm9udCA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb250Iik7CisKKyAgICAgIGNvbnN0IGZpcnN0U3VidHlwZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJTdWJ0eXBlIik7CisKKyAgICAgIGNvbnN0IHNlY29uZFN1YnR5cGUgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiU3VidHlwZSIpOworCisgICAgICBleHBlY3QoZmlyc3RGb250KS50b0JlKHNlY29uZEZvbnQpOworICAgICAgZXhwZWN0KGZpcnN0U3VidHlwZSkudG9CZShzZWNvbmRTdWJ0eXBlKTsKKyAgICAgIGV4cGVjdChmaXJzdEZvbnQpLm5vdC50b0JlKGZpcnN0U3VidHlwZSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiQ21kIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcmV0YWluIHRoZSBnaXZlbiBjbWQgbmFtZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGdpdmVuQ21kID0gIkJUIjsKKworICAgICAgY29uc3QgY21kID0gX3ByaW1pdGl2ZXMuQ21kLmdldChnaXZlbkNtZCk7CisKKyAgICAgIGV4cGVjdChjbWQuY21kKS50b0VxdWFsKGdpdmVuQ21kKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNyZWF0ZSBvbmx5IG9uZSBvYmplY3QgZm9yIGEgY29tbWFuZCBhbmQgY2FjaGUgaXQiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBmaXJzdEJUID0gX3ByaW1pdGl2ZXMuQ21kLmdldCgiQlQiKTsKKworICAgICAgY29uc3Qgc2Vjb25kQlQgPSBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJCVCIpOworCisgICAgICBjb25zdCBmaXJzdEVUID0gX3ByaW1pdGl2ZXMuQ21kLmdldCgiRVQiKTsKKworICAgICAgY29uc3Qgc2Vjb25kRVQgPSBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJFVCIpOworCisgICAgICBleHBlY3QoZmlyc3RCVCkudG9CZShzZWNvbmRCVCk7CisgICAgICBleHBlY3QoZmlyc3RFVCkudG9CZShzZWNvbmRFVCk7CisgICAgICBleHBlY3QoZmlyc3RCVCkubm90LnRvQmUoZmlyc3RFVCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiRGljdCIsIGZ1bmN0aW9uICgpIHsKKyAgICBjb25zdCBjaGVja0ludmFsaWRIYXNWYWx1ZXMgPSBmdW5jdGlvbiAoZGljdCkgeworICAgICAgZXhwZWN0KGRpY3QuaGFzKCkpLnRvQmVGYWxzeSgpOworICAgICAgZXhwZWN0KGRpY3QuaGFzKCJQcmV2IikpLnRvQmVGYWxzeSgpOworICAgIH07CisKKyAgICBjb25zdCBjaGVja0ludmFsaWRLZXlWYWx1ZXMgPSBmdW5jdGlvbiAoZGljdCkgeworICAgICAgZXhwZWN0KGRpY3QuZ2V0KCkpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgIGV4cGVjdChkaWN0LmdldCgiUHJldiIpKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICBleHBlY3QoZGljdC5nZXQoIkRlY29kZSIsICJEIikpLnRvQmVVbmRlZmluZWQoKTsKKyAgICAgIGV4cGVjdChkaWN0LmdldCgiRm9udEZpbGUiLCAiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIpKS50b0JlVW5kZWZpbmVkKCk7CisgICAgfTsKKworICAgIGxldCBlbXB0eURpY3QsIGRpY3RXaXRoU2l6ZUtleSwgZGljdFdpdGhNYW55S2V5czsKKyAgICBjb25zdCBzdG9yZWRTaXplID0gNDI7CisgICAgY29uc3QgdGVzdEZvbnRGaWxlID0gImZpbGUxIjsKKyAgICBjb25zdCB0ZXN0Rm9udEZpbGUyID0gImZpbGUyIjsKKyAgICBjb25zdCB0ZXN0Rm9udEZpbGUzID0gImZpbGUzIjsKKyAgICBiZWZvcmVBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGVtcHR5RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBkaWN0V2l0aFNpemVLZXkgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZGljdFdpdGhTaXplS2V5LnNldCgiU2l6ZSIsIHN0b3JlZFNpemUpOworICAgICAgZGljdFdpdGhNYW55S2V5cyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBkaWN0V2l0aE1hbnlLZXlzLnNldCgiRm9udEZpbGUiLCB0ZXN0Rm9udEZpbGUpOworICAgICAgZGljdFdpdGhNYW55S2V5cy5zZXQoIkZvbnRGaWxlMiIsIHRlc3RGb250RmlsZTIpOworICAgICAgZGljdFdpdGhNYW55S2V5cy5zZXQoIkZvbnRGaWxlMyIsIHRlc3RGb250RmlsZTMpOworICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGFmdGVyQWxsKGZ1bmN0aW9uICgpIHsKKyAgICAgIGVtcHR5RGljdCA9IGRpY3RXaXRoU2l6ZUtleSA9IGRpY3RXaXRoTWFueUtleXMgPSBudWxsOworICAgIH0pOworICAgIGl0KCJzaG91bGQgYWxsb3cgYXNzaWduaW5nIGFuIFhSZWYgdGFibGUgYWZ0ZXIgY3JlYXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBkaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QobnVsbCk7CisgICAgICBleHBlY3QoZGljdC54cmVmKS50b0VxdWFsKG51bGwpOworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbXSk7CisgICAgICBkaWN0LmFzc2lnblhyZWYoeHJlZik7CisgICAgICBleHBlY3QoZGljdC54cmVmKS50b0VxdWFsKHhyZWYpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmV0dXJuIGNvcnJlY3Qgc2l6ZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChudWxsKTsKKyAgICAgIGV4cGVjdChkaWN0LnNpemUpLnRvRXF1YWwoMCk7CisgICAgICBkaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJQYWdlIikpOworICAgICAgZXhwZWN0KGRpY3Quc2l6ZSkudG9FcXVhbCgxKTsKKyAgICAgIGRpY3Quc2V0KCJDb250ZW50cyIsIF9wcmltaXRpdmVzLlJlZi5nZXQoMTAsIDApKTsKKyAgICAgIGV4cGVjdChkaWN0LnNpemUpLnRvRXF1YWwoMik7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZXR1cm4gaW52YWxpZCB2YWx1ZXMgZm9yIHVua25vd24ga2V5cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNoZWNrSW52YWxpZEhhc1ZhbHVlcyhlbXB0eURpY3QpOworICAgICAgY2hlY2tJbnZhbGlkS2V5VmFsdWVzKGVtcHR5RGljdCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZXR1cm4gY29ycmVjdCB2YWx1ZSBmb3Igc3RvcmVkIFNpemUga2V5IiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KGRpY3RXaXRoU2l6ZUtleS5oYXMoIlNpemUiKSkudG9CZVRydXRoeSgpOworICAgICAgZXhwZWN0KGRpY3RXaXRoU2l6ZUtleS5nZXQoIlNpemUiKSkudG9FcXVhbChzdG9yZWRTaXplKTsKKyAgICAgIGV4cGVjdChkaWN0V2l0aFNpemVLZXkuZ2V0KCJQcmV2IiwgIlNpemUiKSkudG9FcXVhbChzdG9yZWRTaXplKTsKKyAgICAgIGV4cGVjdChkaWN0V2l0aFNpemVLZXkuZ2V0KCJQcmV2IiwgIlJvb3QiLCAiU2l6ZSIpKS50b0VxdWFsKHN0b3JlZFNpemUpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmV0dXJuIGludmFsaWQgdmFsdWVzIGZvciB1bmtub3duIGtleXMgd2hlbiBTaXplIGtleSBpcyBzdG9yZWQiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjaGVja0ludmFsaWRIYXNWYWx1ZXMoZGljdFdpdGhTaXplS2V5KTsKKyAgICAgIGNoZWNrSW52YWxpZEtleVZhbHVlcyhkaWN0V2l0aFNpemVLZXkpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IGFjY2VwdCB0byBzZXQgYSBrZXkgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBkaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgIGRpY3Quc2V0KCJTaXplIik7CisgICAgICB9KS50b1Rocm93KG5ldyBFcnJvcignRGljdC5zZXQ6IFRoZSAidmFsdWUiIGNhbm5vdCBiZSB1bmRlZmluZWQuJykpOworICAgICAgZXhwZWN0KGRpY3QuaGFzKCJTaXplIikpLnRvQmVGYWxzeSgpOworICAgICAgY2hlY2tJbnZhbGlkS2V5VmFsdWVzKGRpY3QpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmV0dXJuIGNvcnJlY3QgdmFsdWVzIGZvciBtdWx0aXBsZSBzdG9yZWQga2V5cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChkaWN0V2l0aE1hbnlLZXlzLmhhcygiRm9udEZpbGUiKSkudG9CZVRydXRoeSgpOworICAgICAgZXhwZWN0KGRpY3RXaXRoTWFueUtleXMuaGFzKCJGb250RmlsZTIiKSkudG9CZVRydXRoeSgpOworICAgICAgZXhwZWN0KGRpY3RXaXRoTWFueUtleXMuaGFzKCJGb250RmlsZTMiKSkudG9CZVRydXRoeSgpOworICAgICAgZXhwZWN0KGRpY3RXaXRoTWFueUtleXMuZ2V0KCJGb250RmlsZTMiKSkudG9FcXVhbCh0ZXN0Rm9udEZpbGUzKTsKKyAgICAgIGV4cGVjdChkaWN0V2l0aE1hbnlLZXlzLmdldCgiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIpKS50b0VxdWFsKHRlc3RGb250RmlsZTIpOworICAgICAgZXhwZWN0KGRpY3RXaXRoTWFueUtleXMuZ2V0KCJGb250RmlsZSIsICJGb250RmlsZTIiLCAiRm9udEZpbGUzIikpLnRvRXF1YWwodGVzdEZvbnRGaWxlKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGFzeW5jaHJvbm91c2x5IGZldGNoIHVua25vd24ga2V5cyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBrZXlQcm9taXNlcyA9IFtkaWN0V2l0aE1hbnlLZXlzLmdldEFzeW5jKCJTaXplIiksIGRpY3RXaXRoU2l6ZUtleS5nZXRBc3luYygiRm9udEZpbGUiLCAiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIpXTsKKyAgICAgIFByb21pc2UuYWxsKGtleVByb21pc2VzKS50aGVuKGZ1bmN0aW9uICh2YWx1ZXMpIHsKKyAgICAgICAgZXhwZWN0KHZhbHVlc1swXSkudG9CZVVuZGVmaW5lZCgpOworICAgICAgICBleHBlY3QodmFsdWVzWzFdKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgZG9uZS5mYWlsKHJlYXNvbik7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGFzeW5jaHJvbm91c2x5IGZldGNoIGNvcnJlY3QgdmFsdWVzIGZvciBtdWx0aXBsZSBzdG9yZWQga2V5cyIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBrZXlQcm9taXNlcyA9IFtkaWN0V2l0aE1hbnlLZXlzLmdldEFzeW5jKCJGb250RmlsZTMiKSwgZGljdFdpdGhNYW55S2V5cy5nZXRBc3luYygiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIpLCBkaWN0V2l0aE1hbnlLZXlzLmdldEFzeW5jKCJGb250RmlsZSIsICJGb250RmlsZTIiLCAiRm9udEZpbGUzIildOworICAgICAgUHJvbWlzZS5hbGwoa2V5UHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKHZhbHVlcykgeworICAgICAgICBleHBlY3QodmFsdWVzWzBdKS50b0VxdWFsKHRlc3RGb250RmlsZTMpOworICAgICAgICBleHBlY3QodmFsdWVzWzFdKS50b0VxdWFsKHRlc3RGb250RmlsZTIpOworICAgICAgICBleHBlY3QodmFsdWVzWzJdKS50b0VxdWFsKHRlc3RGb250RmlsZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgZG9uZS5mYWlsKHJlYXNvbik7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNhbGxiYWNrIGZvciBlYWNoIHN0b3JlZCBrZXkiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBjYWxsYmFja1NweSA9IGphc21pbmUuY3JlYXRlU3B5KCJzcHkgb24gY2FsbGJhY2sgaW4gZGljdGlvbmFyeSIpOworICAgICAgZGljdFdpdGhNYW55S2V5cy5mb3JFYWNoKGNhbGxiYWNrU3B5KTsKKyAgICAgIGV4cGVjdChjYWxsYmFja1NweSkudG9IYXZlQmVlbkNhbGxlZCgpOworICAgICAgY29uc3QgY2FsbGJhY2tTcHlDYWxscyA9IGNhbGxiYWNrU3B5LmNhbGxzOworICAgICAgZXhwZWN0KGNhbGxiYWNrU3B5Q2FsbHMuYXJnc0ZvcigwKSkudG9FcXVhbChbIkZvbnRGaWxlIiwgdGVzdEZvbnRGaWxlXSk7CisgICAgICBleHBlY3QoY2FsbGJhY2tTcHlDYWxscy5hcmdzRm9yKDEpKS50b0VxdWFsKFsiRm9udEZpbGUyIiwgdGVzdEZvbnRGaWxlMl0pOworICAgICAgZXhwZWN0KGNhbGxiYWNrU3B5Q2FsbHMuYXJnc0ZvcigyKSkudG9FcXVhbChbIkZvbnRGaWxlMyIsIHRlc3RGb250RmlsZTNdKTsKKyAgICAgIGV4cGVjdChjYWxsYmFja1NweUNhbGxzLmNvdW50KCkpLnRvRXF1YWwoMyk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYW5kbGUga2V5cyBwb2ludGluZyB0byBpbmRpcmVjdCBvYmplY3RzLCBib3RoIHN5bmMgYW5kIGFzeW5jIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGZvbnRSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEsIDApOworCisgICAgICBjb25zdCB4cmVmID0gbmV3IF90ZXN0X3V0aWxzLlhSZWZNb2NrKFt7CisgICAgICAgIHJlZjogZm9udFJlZiwKKyAgICAgICAgZGF0YTogdGVzdEZvbnRGaWxlCisgICAgICB9XSk7CisgICAgICBjb25zdCBmb250RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOworICAgICAgZm9udERpY3Quc2V0KCJGb250RmlsZSIsIGZvbnRSZWYpOworICAgICAgZXhwZWN0KGZvbnREaWN0LmdldFJhdygiRm9udEZpbGUiKSkudG9FcXVhbChmb250UmVmKTsKKyAgICAgIGV4cGVjdChmb250RGljdC5nZXQoIkZvbnRGaWxlIiwgIkZvbnRGaWxlMiIsICJGb250RmlsZTMiKSkudG9FcXVhbCh0ZXN0Rm9udEZpbGUpOworICAgICAgZm9udERpY3QuZ2V0QXN5bmMoIkZvbnRGaWxlIiwgIkZvbnRGaWxlMiIsICJGb250RmlsZTMiKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwodGVzdEZvbnRGaWxlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBkb25lLmZhaWwocmVhc29uKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIGFycmF5cyBjb250YWluaW5nIGluZGlyZWN0IG9iamVjdHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBtaW5Db29yZFJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMSwgMCk7CisKKyAgICAgIGNvbnN0IG1heENvb3JkUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgyLCAwKTsKKworICAgICAgY29uc3QgbWluQ29vcmQgPSAwOworICAgICAgY29uc3QgbWF4Q29vcmQgPSAxOworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IG1pbkNvb3JkUmVmLAorICAgICAgICBkYXRhOiBtaW5Db29yZAorICAgICAgfSwgeworICAgICAgICByZWY6IG1heENvb3JkUmVmLAorICAgICAgICBkYXRhOiBtYXhDb29yZAorICAgICAgfV0pOworICAgICAgY29uc3QgeE9iamVjdERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKKyAgICAgIHhPYmplY3REaWN0LnNldCgiQkJveCIsIFttaW5Db29yZCwgbWF4Q29vcmQsIG1pbkNvb3JkUmVmLCBtYXhDb29yZFJlZl0pOworICAgICAgZXhwZWN0KHhPYmplY3REaWN0LmdldCgiQkJveCIpKS50b0VxdWFsKFttaW5Db29yZCwgbWF4Q29vcmQsIG1pbkNvb3JkUmVmLCBtYXhDb29yZFJlZl0pOworICAgICAgZXhwZWN0KHhPYmplY3REaWN0LmdldEFycmF5KCJCQm94IikpLnRvRXF1YWwoW21pbkNvb3JkLCBtYXhDb29yZCwgbWluQ29vcmQsIG1heENvb3JkXSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBnZXQgYWxsIGtleSBuYW1lcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGV4cGVjdGVkS2V5cyA9IFsiRm9udEZpbGUiLCAiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyJdOworICAgICAgY29uc3Qga2V5cyA9IGRpY3RXaXRoTWFueUtleXMuZ2V0S2V5cygpOworICAgICAgZXhwZWN0KGtleXMuc29ydCgpKS50b0VxdWFsKGV4cGVjdGVkS2V5cyk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBnZXQgYWxsIHJhdyB2YWx1ZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBleHBlY3RlZFJhd1ZhbHVlczEgPSBbdGVzdEZvbnRGaWxlLCB0ZXN0Rm9udEZpbGUyLCB0ZXN0Rm9udEZpbGUzXTsKKyAgICAgIGNvbnN0IHJhd1ZhbHVlczEgPSBkaWN0V2l0aE1hbnlLZXlzLmdldFJhd1ZhbHVlcygpOworICAgICAgZXhwZWN0KHJhd1ZhbHVlczEuc29ydCgpKS50b0VxdWFsKGV4cGVjdGVkUmF3VmFsdWVzMSk7CisKKyAgICAgIGNvbnN0IHR5cGVOYW1lID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlBhZ2UiKTsKKworICAgICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IF9wcmltaXRpdmVzLkRpY3QobnVsbCksCisgICAgICAgICAgICByZXNvdXJjZXNSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDUsIDApOworCisgICAgICBjb25zdCBjb250ZW50cyA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiZGF0YSIpLAorICAgICAgICAgICAgY29udGVudHNSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDEwLCAwKTsKKworICAgICAgY29uc3QgeHJlZiA9IG5ldyBfdGVzdF91dGlscy5YUmVmTW9jayhbeworICAgICAgICByZWY6IHJlc291cmNlc1JlZiwKKyAgICAgICAgZGF0YTogcmVzb3VyY2VzCisgICAgICB9LCB7CisgICAgICAgIHJlZjogY29udGVudHNSZWYsCisgICAgICAgIGRhdGE6IGNvbnRlbnRzCisgICAgICB9XSk7CisgICAgICBjb25zdCBkaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CisgICAgICBkaWN0LnNldCgiVHlwZSIsIHR5cGVOYW1lKTsKKyAgICAgIGRpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXNSZWYpOworICAgICAgZGljdC5zZXQoIkNvbnRlbnRzIiwgY29udGVudHNSZWYpOworICAgICAgY29uc3QgZXhwZWN0ZWRSYXdWYWx1ZXMyID0gW2NvbnRlbnRzUmVmLCByZXNvdXJjZXNSZWYsIHR5cGVOYW1lXTsKKyAgICAgIGNvbnN0IHJhd1ZhbHVlczIgPSBkaWN0LmdldFJhd1ZhbHVlcygpOworICAgICAgZXhwZWN0KHJhd1ZhbHVlczIuc29ydCgpKS50b0VxdWFsKGV4cGVjdGVkUmF3VmFsdWVzMik7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBjcmVhdGUgb25seSBvbmUgb2JqZWN0IGZvciBEaWN0LmVtcHR5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgZmlyc3REaWN0RW1wdHkgPSBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OworICAgICAgY29uc3Qgc2Vjb25kRGljdEVtcHR5ID0gX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKKyAgICAgIGV4cGVjdChmaXJzdERpY3RFbXB0eSkudG9CZShzZWNvbmREaWN0RW1wdHkpOworICAgICAgZXhwZWN0KGZpcnN0RGljdEVtcHR5KS5ub3QudG9CZShlbXB0eURpY3QpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY29ycmVjdGx5IG1lcmdlIGRpY3Rpb25hcmllcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGV4cGVjdGVkS2V5cyA9IFsiRm9udEZpbGUiLCAiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIsICJTaXplIl07CisgICAgICBjb25zdCBmb250RmlsZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZm9udEZpbGVEaWN0LnNldCgiRm9udEZpbGUiLCAiVHlwZTEgZm9udCBmaWxlIik7CisKKyAgICAgIGNvbnN0IG1lcmdlZERpY3QgPSBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKKyAgICAgICAgeHJlZjogbnVsbCwKKyAgICAgICAgZGljdEFycmF5OiBbZGljdFdpdGhNYW55S2V5cywgZGljdFdpdGhTaXplS2V5LCBmb250RmlsZURpY3RdCisgICAgICB9KTsKKworICAgICAgY29uc3QgbWVyZ2VkS2V5cyA9IG1lcmdlZERpY3QuZ2V0S2V5cygpOworICAgICAgZXhwZWN0KG1lcmdlZEtleXMuc29ydCgpKS50b0VxdWFsKGV4cGVjdGVkS2V5cyk7CisgICAgICBleHBlY3QobWVyZ2VkRGljdC5nZXQoIkZvbnRGaWxlIikpLnRvRXF1YWwodGVzdEZvbnRGaWxlKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNvcnJlY3RseSBtZXJnZSBzdWItZGljdGlvbmFyaWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgbG9jYWxGb250RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBsb2NhbEZvbnREaWN0LnNldCgiRjEiLCAiTG9jYWwgZm9udCBvbmUiKTsKKyAgICAgIGNvbnN0IGdsb2JhbEZvbnREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGdsb2JhbEZvbnREaWN0LnNldCgiRjEiLCAiR2xvYmFsIGZvbnQgb25lIik7CisgICAgICBnbG9iYWxGb250RGljdC5zZXQoIkYyIiwgIkdsb2JhbCBmb250IHR3byIpOworICAgICAgZ2xvYmFsRm9udERpY3Quc2V0KCJGMyIsICJHbG9iYWwgZm9udCB0aHJlZSIpOworICAgICAgY29uc3QgbG9jYWxEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoKTsKKyAgICAgIGxvY2FsRGljdC5zZXQoIkZvbnQiLCBsb2NhbEZvbnREaWN0KTsKKyAgICAgIGNvbnN0IGdsb2JhbERpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZ2xvYmFsRGljdC5zZXQoIkZvbnQiLCBnbG9iYWxGb250RGljdCk7CisKKyAgICAgIGNvbnN0IG1lcmdlZERpY3QgPSBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKKyAgICAgICAgeHJlZjogbnVsbCwKKyAgICAgICAgZGljdEFycmF5OiBbbG9jYWxEaWN0LCBnbG9iYWxEaWN0XQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IG1lcmdlZFN1YkRpY3QgPSBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKKyAgICAgICAgeHJlZjogbnVsbCwKKyAgICAgICAgZGljdEFycmF5OiBbbG9jYWxEaWN0LCBnbG9iYWxEaWN0XSwKKyAgICAgICAgbWVyZ2VTdWJEaWN0czogdHJ1ZQorICAgICAgfSk7CisKKyAgICAgIGNvbnN0IG1lcmdlZEZvbnREaWN0ID0gbWVyZ2VkRGljdC5nZXQoIkZvbnQiKTsKKyAgICAgIGNvbnN0IG1lcmdlZFN1YkZvbnREaWN0ID0gbWVyZ2VkU3ViRGljdC5nZXQoIkZvbnQiKTsKKyAgICAgIGV4cGVjdChtZXJnZWRGb250RGljdCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QobWVyZ2VkU3ViRm9udERpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KS50b0VxdWFsKHRydWUpOworICAgICAgY29uc3QgbWVyZ2VkRm9udERpY3RLZXlzID0gbWVyZ2VkRm9udERpY3QuZ2V0S2V5cygpOworICAgICAgY29uc3QgbWVyZ2VkU3ViRm9udERpY3RLZXlzID0gbWVyZ2VkU3ViRm9udERpY3QuZ2V0S2V5cygpOworICAgICAgZXhwZWN0KG1lcmdlZEZvbnREaWN0S2V5cykudG9FcXVhbChbIkYxIl0pOworICAgICAgZXhwZWN0KG1lcmdlZFN1YkZvbnREaWN0S2V5cykudG9FcXVhbChbIkYxIiwgIkYyIiwgIkYzIl0pOworICAgICAgY29uc3QgbWVyZ2VkRm9udERpY3RWYWx1ZXMgPSBtZXJnZWRGb250RGljdC5nZXRSYXdWYWx1ZXMoKTsKKyAgICAgIGNvbnN0IG1lcmdlZFN1YkZvbnREaWN0VmFsdWVzID0gbWVyZ2VkU3ViRm9udERpY3QuZ2V0UmF3VmFsdWVzKCk7CisgICAgICBleHBlY3QobWVyZ2VkRm9udERpY3RWYWx1ZXMpLnRvRXF1YWwoWyJMb2NhbCBmb250IG9uZSJdKTsKKyAgICAgIGV4cGVjdChtZXJnZWRTdWJGb250RGljdFZhbHVlcykudG9FcXVhbChbIkxvY2FsIGZvbnQgb25lIiwgIkdsb2JhbCBmb250IHR3byIsICJHbG9iYWwgZm9udCB0aHJlZSJdKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJSZWYiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBnZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBub25aZXJvUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg0LCAyKTsKKworICAgICAgZXhwZWN0KG5vblplcm9SZWYudG9TdHJpbmcoKSkudG9FcXVhbCgiNFIyIik7CisKKyAgICAgIGNvbnN0IHplcm9SZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDQsIDApOworCisgICAgICBleHBlY3QoemVyb1JlZi50b1N0cmluZygpKS50b0VxdWFsKCI0UiIpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmV0YWluIHRoZSBzdG9yZWQgdmFsdWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgc3RvcmVkTnVtID0gNDsKKyAgICAgIGNvbnN0IHN0b3JlZEdlbiA9IDI7CisKKyAgICAgIGNvbnN0IHJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoc3RvcmVkTnVtLCBzdG9yZWRHZW4pOworCisgICAgICBleHBlY3QocmVmLm51bSkudG9FcXVhbChzdG9yZWROdW0pOworICAgICAgZXhwZWN0KHJlZi5nZW4pLnRvRXF1YWwoc3RvcmVkR2VuKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGNyZWF0ZSBvbmx5IG9uZSBvYmplY3QgZm9yIGEgcmVmZXJlbmNlIGFuZCBjYWNoZSBpdCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGZpcnN0UmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg0LCAyKTsKKworICAgICAgY29uc3Qgc2Vjb25kUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg0LCAyKTsKKworICAgICAgY29uc3QgZmlyc3RPdGhlclJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoNSwgMik7CisKKyAgICAgIGNvbnN0IHNlY29uZE90aGVyUmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg1LCAyKTsKKworICAgICAgZXhwZWN0KGZpcnN0UmVmKS50b0JlKHNlY29uZFJlZik7CisgICAgICBleHBlY3QoZmlyc3RPdGhlclJlZikudG9CZShzZWNvbmRPdGhlclJlZik7CisgICAgICBleHBlY3QoZmlyc3RSZWYpLm5vdC50b0JlKGZpcnN0T3RoZXJSZWYpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlJlZlNldCIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGhhdmUgYSBzdG9yZWQgdmFsdWUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCByZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDQsIDIpOworCisgICAgICBjb25zdCByZWZzZXQgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CisgICAgICByZWZzZXQucHV0KHJlZik7CisgICAgICBleHBlY3QocmVmc2V0LmhhcyhyZWYpKS50b0JlVHJ1dGh5KCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBub3QgaGF2ZSBhbiB1bmtub3duIHZhbHVlIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgcmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg0LCAyKTsKKworICAgICAgY29uc3QgcmVmc2V0ID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOworICAgICAgZXhwZWN0KHJlZnNldC5oYXMocmVmKSkudG9CZUZhbHN5KCk7CisgICAgICByZWZzZXQucHV0KHJlZik7CisKKyAgICAgIGNvbnN0IGFub3RoZXJSZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KDIsIDQpOworCisgICAgICBleHBlY3QocmVmc2V0Lmhhcyhhbm90aGVyUmVmKSkudG9CZUZhbHN5KCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiUmVmU2V0Q2FjaGUiLCBmdW5jdGlvbiAoKSB7CisgICAgY29uc3QgcmVmMSA9IF9wcmltaXRpdmVzLlJlZi5nZXQoNCwgMik7CisKKyAgICBjb25zdCByZWYyID0gX3ByaW1pdGl2ZXMuUmVmLmdldCg1LCAyKTsKKworICAgIGNvbnN0IG9iajEgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiZm9vIik7CisKKyAgICBjb25zdCBvYmoyID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoImJhciIpOworCisgICAgbGV0IGNhY2hlOworICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNhY2hlID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldENhY2hlKCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIGNhY2hlID0gbnVsbDsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHB1dCwgaGF2ZSBhbmQgZ2V0IGEgdmFsdWUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjYWNoZS5wdXQocmVmMSwgb2JqMSk7CisgICAgICBleHBlY3QoY2FjaGUuaGFzKHJlZjEpKS50b0JlVHJ1dGh5KCk7CisgICAgICBleHBlY3QoY2FjaGUuaGFzKHJlZjIpKS50b0JlRmFsc3koKTsKKyAgICAgIGV4cGVjdChjYWNoZS5nZXQocmVmMSkpLnRvQmUob2JqMSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBwdXQsIGhhdmUgYW5kIGdldCBhIHZhbHVlIGJ5IGFsaWFzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY2FjaGUucHV0KHJlZjEsIG9iajEpOworICAgICAgY2FjaGUucHV0QWxpYXMocmVmMiwgcmVmMSk7CisgICAgICBleHBlY3QoY2FjaGUuaGFzKHJlZjEpKS50b0JlVHJ1dGh5KCk7CisgICAgICBleHBlY3QoY2FjaGUuaGFzKHJlZjIpKS50b0JlVHJ1dGh5KCk7CisgICAgICBleHBlY3QoY2FjaGUuZ2V0KHJlZjEpKS50b0JlKG9iajEpOworICAgICAgZXhwZWN0KGNhY2hlLmdldChyZWYyKSkudG9CZShvYmoxKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHJlcG9ydCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjYWNoZS5wdXQocmVmMSwgb2JqMSk7CisgICAgICBleHBlY3QoY2FjaGUuc2l6ZSkudG9FcXVhbCgxKTsKKyAgICAgIGNhY2hlLnB1dChyZWYyLCBvYmoyKTsKKyAgICAgIGV4cGVjdChjYWNoZS5zaXplKS50b0VxdWFsKDIpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgY2xlYXIgdGhlIGNhY2hlIiwgZnVuY3Rpb24gKCkgeworICAgICAgY2FjaGUucHV0KHJlZjEsIG9iajEpOworICAgICAgZXhwZWN0KGNhY2hlLnNpemUpLnRvRXF1YWwoMSk7CisgICAgICBjYWNoZS5jbGVhcigpOworICAgICAgZXhwZWN0KGNhY2hlLnNpemUpLnRvRXF1YWwoMCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBzdXBwb3J0IGl0ZXJhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNhY2hlLnB1dChyZWYxLCBvYmoxKTsKKyAgICAgIGNhY2hlLnB1dChyZWYyLCBvYmoyKTsKKyAgICAgIGNvbnN0IHZhbHVlcyA9IFtdOworICAgICAgY2FjaGUuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpOworICAgICAgfSk7CisgICAgICBleHBlY3QodmFsdWVzKS50b0VxdWFsKFtvYmoxLCBvYmoyXSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiaXNFT0YiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoImhhbmRsZXMgbm9uLUVPRiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IG5vbkVPRiA9ICJmb28iOworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc0VPRikobm9uRU9GKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgRU9GIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc0VPRikoX3ByaW1pdGl2ZXMuRU9GKSkudG9FcXVhbCh0cnVlKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJpc05hbWUiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoImhhbmRsZXMgbm9uLW5hbWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgbm9uTmFtZSA9IHt9OworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG5vbk5hbWUpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBuYW1lcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IG5hbWUgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRm9udCIpOworCisgICAgICBleHBlY3QoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkobmFtZSkpLnRvRXF1YWwodHJ1ZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgbmFtZXMgd2l0aCBuYW1lIGNoZWNrIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgbmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb250Iik7CisKKyAgICAgIGV4cGVjdCgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShuYW1lLCAiRm9udCIpKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKG5hbWUsICJTdWJ0eXBlIikpLnRvRXF1YWwoZmFsc2UpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoImlzQ21kIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIG5vbi1jb21tYW5kcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IG5vbkNtZCA9IHt9OworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkobm9uQ21kKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgY29tbWFuZHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBjbWQgPSBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJCVCIpOworCisgICAgICBleHBlY3QoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShjbWQpKS50b0VxdWFsKHRydWUpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIGNvbW1hbmRzIHdpdGggY21kIGNoZWNrIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgY21kID0gX3ByaW1pdGl2ZXMuQ21kLmdldCgiQlQiKTsKKworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkoY21kLCAiQlQiKSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKGNtZCwgIkVUIikpLnRvRXF1YWwoZmFsc2UpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoImlzRGljdCIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiaGFuZGxlcyBub24tZGljdGlvbmFyaWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgbm9uRGljdCA9IHt9OworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKG5vbkRpY3QpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBlbXB0eSBkaWN0aW9uYXJpZXMgd2l0aCB0eXBlIGNoZWNrIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgZGljdCA9IF9wcmltaXRpdmVzLkRpY3QuZW1wdHk7CisgICAgICBleHBlY3QoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGljdCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF9wcmltaXRpdmVzLmlzRGljdCkoZGljdCwgIlBhZ2UiKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgZGljdGlvbmFyaWVzIHdpdGggdHlwZSBjaGVjayIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOworICAgICAgZGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiUGFnZSIpKTsKKyAgICAgIGV4cGVjdCgoMCwgX3ByaW1pdGl2ZXMuaXNEaWN0KShkaWN0LCAiUGFnZSIpKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc0RpY3QpKGRpY3QsICJDb250ZW50cyIpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJpc1JlZiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiaGFuZGxlcyBub24tcmVmcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IG5vblJlZiA9IHt9OworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc1JlZikobm9uUmVmKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgcmVmcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMSwgMCk7CisKKyAgICAgIGV4cGVjdCgoMCwgX3ByaW1pdGl2ZXMuaXNSZWYpKHJlZikpLnRvRXF1YWwodHJ1ZSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiaXNSZWZzRXF1YWwiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBoYW5kbGUgUmVmcyBwb2ludGluZyB0byB0aGUgc2FtZSBvYmplY3QiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCByZWYxID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxLCAwKTsKKworICAgICAgY29uc3QgcmVmMiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMSwgMCk7CisKKyAgICAgIGV4cGVjdCgoMCwgX3ByaW1pdGl2ZXMuaXNSZWZzRXF1YWwpKHJlZjEsIHJlZjIpKS50b0VxdWFsKHRydWUpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgaGFuZGxlIFJlZnMgcG9pbnRpbmcgdG8gZGlmZmVyZW50IG9iamVjdHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCByZWYxID0gX3ByaW1pdGl2ZXMuUmVmLmdldCgxLCAwKTsKKworICAgICAgY29uc3QgcmVmMiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoMiwgMCk7CisKKyAgICAgIGV4cGVjdCgoMCwgX3ByaW1pdGl2ZXMuaXNSZWZzRXF1YWwpKHJlZjEsIHJlZjIpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJpc1N0cmVhbSIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiaGFuZGxlcyBub24tc3RyZWFtcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IG5vblN0cmVhbSA9IHt9OworICAgICAgZXhwZWN0KCgwLCBfcHJpbWl0aXZlcy5pc1N0cmVhbSkobm9uU3RyZWFtKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgc3RyZWFtcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiZm9vIik7CisgICAgICBleHBlY3QoKDAsIF9wcmltaXRpdmVzLmlzU3RyZWFtKShzdHJlYW0pKS50b0VxdWFsKHRydWUpOworICAgIH0pOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvc3RyZWFtX3NwZWMuanMgYi9saWIvdGVzdC91bml0L3N0cmVhbV9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxODg1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L3N0cmVhbV9zcGVjLmpzCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF9zdHJlYW0gPSByZXF1aXJlKCIuLi8uLi9jb3JlL3N0cmVhbS5qcyIpOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuLi8uLi9jb3JlL3ByaW1pdGl2ZXMuanMiKTsKKworZGVzY3JpYmUoInN0cmVhbSIsIGZ1bmN0aW9uICgpIHsKKyAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7CisgICAgamFzbWluZS5hZGRNYXRjaGVycyh7CisgICAgICB0b01hdGNoVHlwZWRBcnJheSh1dGlsLCBjdXN0b21FcXVhbGl0eVRlc3RlcnMpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBjb21wYXJlKGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSB7fTsKKworICAgICAgICAgICAgaWYgKGFjdHVhbC5sZW5ndGggIT09IGV4cGVjdGVkLmxlbmd0aCkgeworICAgICAgICAgICAgICByZXN1bHQucGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICByZXN1bHQubWVzc2FnZSA9ICJBcnJheSBsZW5ndGg6ICIgKyBhY3R1YWwubGVuZ3RoICsgIiwgZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZC5sZW5ndGg7CisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdC5wYXNzID0gdHJ1ZTsKKworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZXhwZWN0ZWQubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgICB2YXIgYSA9IGFjdHVhbFtpXSwKKyAgICAgICAgICAgICAgICAgIGIgPSBleHBlY3RlZFtpXTsKKworICAgICAgICAgICAgICBpZiAoYSAhPT0gYikgeworICAgICAgICAgICAgICAgIHJlc3VsdC5wYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICB9CisKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlByZWRpY3RvclN0cmVhbSIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGRlY29kZSBzaW1wbGUgcHJlZGljdG9yIGRhdGEiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CisgICAgICBkaWN0LnNldCgiUHJlZGljdG9yIiwgMTIpOworICAgICAgZGljdC5zZXQoIkNvbG9ycyIsIDEpOworICAgICAgZGljdC5zZXQoIkJpdHNQZXJDb21wb25lbnQiLCA4KTsKKyAgICAgIGRpY3Quc2V0KCJDb2x1bW5zIiwgMik7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgX3N0cmVhbS5TdHJlYW0obmV3IFVpbnQ4QXJyYXkoWzIsIDEwMCwgMywgMiwgMSwgMjU1LCAyLCAxLCAyNTVdKSwgMCwgOSwgZGljdCk7CisgICAgICB2YXIgcHJlZGljdG9yID0gbmV3IF9zdHJlYW0uUHJlZGljdG9yU3RyZWFtKGlucHV0LCA5LCBkaWN0KTsKKyAgICAgIHZhciByZXN1bHQgPSBwcmVkaWN0b3IuZ2V0Qnl0ZXMoNik7CisgICAgICBleHBlY3QocmVzdWx0KS50b01hdGNoVHlwZWRBcnJheShuZXcgVWludDhBcnJheShbMTAwLCAzLCAxMDEsIDIsIDEwMiwgMV0pKTsKKyAgICAgIHByZWRpY3Rvci5yZXNldCgpOworICAgICAgY29uc3QgY2xhbXBlZFJlc3VsdCA9IHByZWRpY3Rvci5nZXRCeXRlcyg2LCB0cnVlKTsKKyAgICAgIGV4cGVjdChjbGFtcGVkUmVzdWx0KS50b0VxdWFsKG5ldyBVaW50OENsYW1wZWRBcnJheShbMTAwLCAzLCAxMDEsIDIsIDEwMiwgMV0pKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L3Rlc3RfdXRpbHMuanMgYi9saWIvdGVzdC91bml0L3Rlc3RfdXRpbHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkZTZiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvdGVzdF91dGlscy5qcwpAQCAtMCwwICsxLDE3MCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuYnVpbGRHZXREb2N1bWVudFBhcmFtcyA9IGJ1aWxkR2V0RG9jdW1lbnRQYXJhbXM7CitleHBvcnRzLmNyZWF0ZUlkRmFjdG9yeSA9IGNyZWF0ZUlkRmFjdG9yeTsKK2V4cG9ydHMuaXNFbXB0eU9iaiA9IGlzRW1wdHlPYmo7CitleHBvcnRzLlRFU1RfUERGU19QQVRIID0gZXhwb3J0cy5YUmVmTW9jayA9IGV4cG9ydHMuTm9kZUZpbGVSZWFkZXJGYWN0b3J5ID0gZXhwb3J0cy5ET01GaWxlUmVhZGVyRmFjdG9yeSA9IHZvaWQgMDsKKwordmFyIF9wcmltaXRpdmVzID0gcmVxdWlyZSgiLi4vLi4vY29yZS9wcmltaXRpdmVzLmpzIik7CisKK3ZhciBfZG9jdW1lbnQgPSByZXF1aXJlKCIuLi8uLi9jb3JlL2RvY3VtZW50LmpzIik7CisKK3ZhciBfdXRpbCA9IHJlcXVpcmUoIi4uLy4uL3NoYXJlZC91dGlsLmpzIik7CisKK3ZhciBfaXNfbm9kZSA9IHJlcXVpcmUoIi4uLy4uL3NoYXJlZC9pc19ub2RlLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi4vLi4vY29yZS9zdHJlYW0uanMiKTsKKworY2xhc3MgRE9NRmlsZVJlYWRlckZhY3RvcnkgeworICBzdGF0aWMgYXN5bmMgZmV0Y2gocGFyYW1zKSB7CisgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChwYXJhbXMucGF0aCk7CisKKyAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpOworICB9CisKK30KKworZXhwb3J0cy5ET01GaWxlUmVhZGVyRmFjdG9yeSA9IERPTUZpbGVSZWFkZXJGYWN0b3J5OworCitjbGFzcyBOb2RlRmlsZVJlYWRlckZhY3RvcnkgeworICBzdGF0aWMgYXN5bmMgZmV0Y2gocGFyYW1zKSB7CisgICAgY29uc3QgZnMgPSByZXF1aXJlKCJmcyIpOworCisgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKKyAgICAgIGZzLnJlYWRGaWxlKHBhcmFtcy5wYXRoLCAoZXJyb3IsIGRhdGEpID0+IHsKKyAgICAgICAgaWYgKGVycm9yIHx8ICFkYXRhKSB7CisgICAgICAgICAgcmVqZWN0KGVycm9yIHx8IG5ldyBFcnJvcihgRW1wdHkgZmlsZSBmb3I6ICR7cGFyYW1zLnBhdGh9YCkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoZGF0YSkpOworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLk5vZGVGaWxlUmVhZGVyRmFjdG9yeSA9IE5vZGVGaWxlUmVhZGVyRmFjdG9yeTsKK2NvbnN0IFRFU1RfUERGU19QQVRIID0geworICBkb206ICIuLi9wZGZzLyIsCisgIG5vZGU6ICIuL3Rlc3QvcGRmcy8iCit9OworZXhwb3J0cy5URVNUX1BERlNfUEFUSCA9IFRFU1RfUERGU19QQVRIOworCitmdW5jdGlvbiBidWlsZEdldERvY3VtZW50UGFyYW1zKGZpbGVuYW1lLCBvcHRpb25zKSB7CisgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgcGFyYW1zLnVybCA9IFRFU1RfUERGU19QQVRILm5vZGUgKyBmaWxlbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBwYXJhbXMudXJsID0gbmV3IFVSTChURVNUX1BERlNfUEFUSC5kb20gKyBmaWxlbmFtZSwgd2luZG93LmxvY2F0aW9uKS5ocmVmOworICB9CisKKyAgZm9yIChjb25zdCBvcHRpb24gaW4gb3B0aW9ucykgeworICAgIHBhcmFtc1tvcHRpb25dID0gb3B0aW9uc1tvcHRpb25dOworICB9CisKKyAgcmV0dXJuIHBhcmFtczsKK30KKworY2xhc3MgWFJlZk1vY2sgeworICBjb25zdHJ1Y3RvcihhcnJheSkgeworICAgIHRoaXMuX21hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy5zdGF0cyA9IHsKKyAgICAgIHN0cmVhbVR5cGVzOiBPYmplY3QuY3JlYXRlKG51bGwpLAorICAgICAgZm9udFR5cGVzOiBPYmplY3QuY3JlYXRlKG51bGwpCisgICAgfTsKKyAgICB0aGlzLl9uZXdSZWZOdW0gPSBudWxsOworCisgICAgZm9yIChjb25zdCBrZXkgaW4gYXJyYXkpIHsKKyAgICAgIGNvbnN0IG9iaiA9IGFycmF5W2tleV07CisgICAgICB0aGlzLl9tYXBbb2JqLnJlZi50b1N0cmluZygpXSA9IG9iai5kYXRhOworICAgIH0KKyAgfQorCisgIGdldE5ld1JlZigpIHsKKyAgICBpZiAodGhpcy5fbmV3UmVmTnVtID09PSBudWxsKSB7CisgICAgICB0aGlzLl9uZXdSZWZOdW0gPSBPYmplY3Qua2V5cyh0aGlzLl9tYXApLmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gX3ByaW1pdGl2ZXMuUmVmLmdldCh0aGlzLl9uZXdSZWZOdW0rKywgMCk7CisgIH0KKworICByZXNldE5ld1JlZigpIHsKKyAgICB0aGlzLm5ld1JlZiA9IG51bGw7CisgIH0KKworICBmZXRjaChyZWYpIHsKKyAgICByZXR1cm4gdGhpcy5fbWFwW3JlZi50b1N0cmluZygpXTsKKyAgfQorCisgIGZldGNoQXN5bmMocmVmKSB7CisgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmZldGNoKHJlZikpOworICB9CisKKyAgZmV0Y2hJZlJlZihvYmopIHsKKyAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc1JlZikob2JqKSkgeworICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5mZXRjaChvYmopOworICB9CisKKyAgZmV0Y2hJZlJlZkFzeW5jKG9iaikgeworICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5mZXRjaElmUmVmKG9iaikpOworICB9CisKK30KKworZXhwb3J0cy5YUmVmTW9jayA9IFhSZWZNb2NrOworCitmdW5jdGlvbiBjcmVhdGVJZEZhY3RvcnkocGFnZUluZGV4KSB7CisgIGNvbnN0IHBkZk1hbmFnZXIgPSB7CisgICAgZ2V0IGRvY0lkKCkgeworICAgICAgcmV0dXJuICJkMCI7CisgICAgfQorCisgIH07CisgIGNvbnN0IHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiRHVtbXlfUERGX2RhdGEiKTsKKyAgY29uc3QgcGRmRG9jdW1lbnQgPSBuZXcgX2RvY3VtZW50LlBERkRvY3VtZW50KHBkZk1hbmFnZXIsIHN0cmVhbSk7CisgIGNvbnN0IHBhZ2UgPSBuZXcgX2RvY3VtZW50LlBhZ2UoeworICAgIHBkZk1hbmFnZXI6IHBkZkRvY3VtZW50LnBkZk1hbmFnZXIsCisgICAgeHJlZjogcGRmRG9jdW1lbnQueHJlZiwKKyAgICBwYWdlSW5kZXgsCisgICAgZ2xvYmFsSWRGYWN0b3J5OiBwZGZEb2N1bWVudC5fZ2xvYmFsSWRGYWN0b3J5CisgIH0pOworICByZXR1cm4gcGFnZS5fbG9jYWxJZEZhY3Rvcnk7Cit9CisKK2Z1bmN0aW9uIGlzRW1wdHlPYmoob2JqKSB7CisgICgwLCBfdXRpbC5hc3NlcnQpKHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmIG9iaiAhPT0gbnVsbCwgImlzRW1wdHlPYmogLSBpbnZhbGlkIGFyZ3VtZW50LiIpOworICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC90ZXN0cmVwb3J0ZXIuanMgYi9saWIvdGVzdC91bml0L3Rlc3RyZXBvcnRlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTk0MDUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC90ZXN0cmVwb3J0ZXIuanMKQEAgLTAsMCArMSwxMTMgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIFRlc3RSZXBvcnRlciA9IGZ1bmN0aW9uIChicm93c2VyKSB7CisgIGZ1bmN0aW9uIHNlbmQoYWN0aW9uLCBqc29uLCBjYikgeworICAgIHZhciByID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgICAgci5vcGVuKCJQT1NUIiwgYWN0aW9uLCB0cnVlKTsKKyAgICByLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIik7CisKKyAgICByLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIHNlbmRUYXNrUmVzdWx0T25yZWFkeXN0YXRlY2hhbmdlKGUpIHsKKyAgICAgIGlmIChyLnJlYWR5U3RhdGUgPT09IDQpIHsKKyAgICAgICAgaWYgKHIuc3RhdHVzICE9PSAyMDApIHsKKyAgICAgICAgICBzZW5kKGFjdGlvbiwganNvbiwgY2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChjYikgeworICAgICAgICAgICAgY2IoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAganNvbi5icm93c2VyID0gYnJvd3NlcjsKKyAgICByLnNlbmQoSlNPTi5zdHJpbmdpZnkoanNvbikpOworICB9CisKKyAgZnVuY3Rpb24gc2VuZEluZm8obWVzc2FnZSkgeworICAgIHNlbmQoIi9pbmZvIiwgeworICAgICAgbWVzc2FnZQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gc2VuZFJlc3VsdChzdGF0dXMsIGRlc2NyaXB0aW9uLCBlcnJvcikgeworICAgIHZhciBtZXNzYWdlID0geworICAgICAgc3RhdHVzLAorICAgICAgZGVzY3JpcHRpb24KKyAgICB9OworCisgICAgaWYgKHR5cGVvZiBlcnJvciAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IgPSBlcnJvcjsKKyAgICB9CisKKyAgICBzZW5kKCIvc3VibWl0X3Rhc2tfcmVzdWx0cyIsIG1lc3NhZ2UpOworICB9CisKKyAgZnVuY3Rpb24gc2VuZFF1aXRSZXF1ZXN0KCkgeworICAgIHNlbmQoYC90ZWxsTWVUb1F1aXQ/YnJvd3Nlcj0ke2VzY2FwZShicm93c2VyKX1gLCB7fSk7CisgIH0KKworICB0aGlzLm5vdyA9IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgIH07CisKKyAgdGhpcy5qYXNtaW5lU3RhcnRlZCA9IGZ1bmN0aW9uIChzdWl0ZUluZm8pIHsKKyAgICB0aGlzLnJ1bm5lclN0YXJ0VGltZSA9IHRoaXMubm93KCk7CisgICAgY29uc3QgdG90YWwgPSBzdWl0ZUluZm8udG90YWxTcGVjc0RlZmluZWQ7CisgICAgY29uc3Qgc2VlZCA9IHN1aXRlSW5mby5vcmRlci5zZWVkOworICAgIHNlbmRJbmZvKGBTdGFydGVkICR7dG90YWx9IHRlc3RzIGZvciAke2Jyb3dzZXJ9IHdpdGggc2VlZCAke3NlZWR9LmApOworICB9OworCisgIHRoaXMuc3VpdGVTdGFydGVkID0gZnVuY3Rpb24gKHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQuZmFpbGVkRXhwZWN0YXRpb25zLmxlbmd0aCA+IDApIHsKKyAgICAgIGxldCBmYWlsZWRNZXNzYWdlcyA9ICIiOworCisgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVzdWx0LmZhaWxlZEV4cGVjdGF0aW9ucykgeworICAgICAgICBmYWlsZWRNZXNzYWdlcyArPSBgJHtpdGVtLm1lc3NhZ2V9IGA7CisgICAgICB9CisKKyAgICAgIHNlbmRSZXN1bHQoIlRFU1QtVU5FWFBFQ1RFRC1GQUlMIiwgcmVzdWx0LmRlc2NyaXB0aW9uLCBmYWlsZWRNZXNzYWdlcyk7CisgICAgfQorICB9OworCisgIHRoaXMuc3BlY1N0YXJ0ZWQgPSBmdW5jdGlvbiAocmVzdWx0KSB7fTsKKworICB0aGlzLnNwZWNEb25lID0gZnVuY3Rpb24gKHJlc3VsdCkgeworICAgIGlmIChyZXN1bHQuZmFpbGVkRXhwZWN0YXRpb25zLmxlbmd0aCA9PT0gMCkgeworICAgICAgc2VuZFJlc3VsdCgiVEVTVC1QQVNTRUQiLCByZXN1bHQuZGVzY3JpcHRpb24pOworICAgIH0gZWxzZSB7CisgICAgICBsZXQgZmFpbGVkTWVzc2FnZXMgPSAiIjsKKworICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlc3VsdC5mYWlsZWRFeHBlY3RhdGlvbnMpIHsKKyAgICAgICAgZmFpbGVkTWVzc2FnZXMgKz0gYCR7aXRlbS5tZXNzYWdlfSBgOworICAgICAgfQorCisgICAgICBzZW5kUmVzdWx0KCJURVNULVVORVhQRUNURUQtRkFJTCIsIHJlc3VsdC5kZXNjcmlwdGlvbiwgZmFpbGVkTWVzc2FnZXMpOworICAgIH0KKyAgfTsKKworICB0aGlzLnN1aXRlRG9uZSA9IGZ1bmN0aW9uIChyZXN1bHQpIHt9OworCisgIHRoaXMuamFzbWluZURvbmUgPSBmdW5jdGlvbiAoKSB7CisgICAgc2V0VGltZW91dChzZW5kUXVpdFJlcXVlc3QsIDUwMCk7CisgIH07Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvdHlwZTFfcGFyc2VyX3NwZWMuanMgYi9saWIvdGVzdC91bml0L3R5cGUxX3BhcnNlcl9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTBhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L3R5cGUxX3BhcnNlcl9zcGVjLmpzCkBAIC0wLDAgKzEsMTA0IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfZm9udHMgPSByZXF1aXJlKCIuLi8uLi9jb3JlL2ZvbnRzLmpzIik7CisKK3ZhciBfc3RyZWFtID0gcmVxdWlyZSgiLi4vLi4vY29yZS9zdHJlYW0uanMiKTsKKwordmFyIF90eXBlMV9wYXJzZXIgPSByZXF1aXJlKCIuLi8uLi9jb3JlL3R5cGUxX3BhcnNlci5qcyIpOworCitkZXNjcmliZSgiVHlwZTFQYXJzZXIiLCBmdW5jdGlvbiAoKSB7CisgIGl0KCJzcGxpdHMgdG9rZW5zIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIi9CbHVlVmFsdWVzWy0xNyAwXW5vYWNjZXNzIGRlZiIpOworICAgIHZhciBwYXJzZXIgPSBuZXcgX3R5cGUxX3BhcnNlci5UeXBlMVBhcnNlcihzdHJlYW0sIGZhbHNlLCBfZm9udHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKKyAgICBleHBlY3QocGFyc2VyLmdldFRva2VuKCkpLnRvRXF1YWwoIi8iKTsKKyAgICBleHBlY3QocGFyc2VyLmdldFRva2VuKCkpLnRvRXF1YWwoIkJsdWVWYWx1ZXMiKTsKKyAgICBleHBlY3QocGFyc2VyLmdldFRva2VuKCkpLnRvRXF1YWwoIlsiKTsKKyAgICBleHBlY3QocGFyc2VyLmdldFRva2VuKCkpLnRvRXF1YWwoIi0xNyIpOworICAgIGV4cGVjdChwYXJzZXIuZ2V0VG9rZW4oKSkudG9FcXVhbCgiMCIpOworICAgIGV4cGVjdChwYXJzZXIuZ2V0VG9rZW4oKSkudG9FcXVhbCgiXSIpOworICAgIGV4cGVjdChwYXJzZXIuZ2V0VG9rZW4oKSkudG9FcXVhbCgibm9hY2Nlc3MiKTsKKyAgICBleHBlY3QocGFyc2VyLmdldFRva2VuKCkpLnRvRXF1YWwoImRlZiIpOworICAgIGV4cGVjdChwYXJzZXIuZ2V0VG9rZW4oKSkudG9FcXVhbChudWxsKTsKKyAgfSk7CisgIGl0KCJoYW5kbGVzIGdsdWVkIHRva2VucyIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCJkdXAvQ2hhclN0cmluZ3MiKTsKKyAgICB2YXIgcGFyc2VyID0gbmV3IF90eXBlMV9wYXJzZXIuVHlwZTFQYXJzZXIoc3RyZWFtLCBmYWxzZSwgX2ZvbnRzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgZXhwZWN0KHBhcnNlci5nZXRUb2tlbigpKS50b0VxdWFsKCJkdXAiKTsKKyAgICBleHBlY3QocGFyc2VyLmdldFRva2VuKCkpLnRvRXF1YWwoIi8iKTsKKyAgICBleHBlY3QocGFyc2VyLmdldFRva2VuKCkpLnRvRXF1YWwoIkNoYXJTdHJpbmdzIik7CisgIH0pOworICBpdCgiaWdub3JlcyB3aGl0ZXNwYWNlIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIlxuYWIgICBjXHQiKTsKKyAgICB2YXIgcGFyc2VyID0gbmV3IF90eXBlMV9wYXJzZXIuVHlwZTFQYXJzZXIoc3RyZWFtLCBmYWxzZSwgX2ZvbnRzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgZXhwZWN0KHBhcnNlci5nZXRUb2tlbigpKS50b0VxdWFsKCJhYiIpOworICAgIGV4cGVjdChwYXJzZXIuZ2V0VG9rZW4oKSkudG9FcXVhbCgiYyIpOworICB9KTsKKyAgaXQoInBhcnNlcyBudW1iZXJzIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIjEyMyIpOworICAgIHZhciBwYXJzZXIgPSBuZXcgX3R5cGUxX3BhcnNlci5UeXBlMVBhcnNlcihzdHJlYW0sIGZhbHNlLCBfZm9udHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKKyAgICBleHBlY3QocGFyc2VyLnJlYWROdW1iZXIoKSkudG9FcXVhbCgxMjMpOworICB9KTsKKyAgaXQoInBhcnNlcyBib29sZWFucyIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCJ0cnVlIGZhbHNlIik7CisgICAgdmFyIHBhcnNlciA9IG5ldyBfdHlwZTFfcGFyc2VyLlR5cGUxUGFyc2VyKHN0cmVhbSwgZmFsc2UsIF9mb250cy5TRUFDX0FOQUxZU0lTX0VOQUJMRUQpOworICAgIGV4cGVjdChwYXJzZXIucmVhZEJvb2xlYW4oKSkudG9FcXVhbCgxKTsKKyAgICBleHBlY3QocGFyc2VyLnJlYWRCb29sZWFuKCkpLnRvRXF1YWwoMCk7CisgIH0pOworICBpdCgicGFyc2VzIG51bWJlciBhcnJheXMiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiWzEgMl0iKTsKKyAgICB2YXIgcGFyc2VyID0gbmV3IF90eXBlMV9wYXJzZXIuVHlwZTFQYXJzZXIoc3RyZWFtLCBmYWxzZSwgX2ZvbnRzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgZXhwZWN0KHBhcnNlci5yZWFkTnVtYmVyQXJyYXkoKSkudG9FcXVhbChbMSwgMl0pOworICAgIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiWyAxIDIgXSIpOworICAgIHBhcnNlciA9IG5ldyBfdHlwZTFfcGFyc2VyLlR5cGUxUGFyc2VyKHN0cmVhbSwgZmFsc2UsIF9mb250cy5TRUFDX0FOQUxZU0lTX0VOQUJMRUQpOworICAgIGV4cGVjdChwYXJzZXIucmVhZE51bWJlckFycmF5KCkpLnRvRXF1YWwoWzEsIDJdKTsKKyAgfSk7CisgIGl0KCJza2lwcyBjb21tZW50cyIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIlIVBTLUFkb2JlRm9udC0xLjA6IENNU1kxMCAwMDMuMDAyXG4iICsgIiUlVGl0bGU6IENNU1kxMFxuIiArICIlVmVyc2lvbjogMDAzLjAwMlxuIiArICJGb250RGlyZWN0b3J5Iik7CisgICAgdmFyIHBhcnNlciA9IG5ldyBfdHlwZTFfcGFyc2VyLlR5cGUxUGFyc2VyKHN0cmVhbSwgZmFsc2UsIF9mb250cy5TRUFDX0FOQUxZU0lTX0VOQUJMRUQpOworICAgIGV4cGVjdChwYXJzZXIuZ2V0VG9rZW4oKSkudG9FcXVhbCgiRm9udERpcmVjdG9yeSIpOworICB9KTsKKyAgaXQoInBhcnNlcyBmb250IHByb2dyYW0iLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiL0V4cGFuc2lvbkZhY3RvciAgOTlcbiIgKyAiL1N1YnJzIDEgYXJyYXlcbiIgKyAiZHVwIDAgMSBSRCB4IG5vYWNjZXNzIHB1dFxuIiArICJlbmRcbiIgKyAiL0NoYXJTdHJpbmdzIDQ2IGRpY3QgZHVwIGJlZ2luXG4iICsgIi8ubm90ZGVmIDEgUkQgeCBORFxuIiArICJlbmQiKTsKKyAgICB2YXIgcGFyc2VyID0gbmV3IF90eXBlMV9wYXJzZXIuVHlwZTFQYXJzZXIoc3RyZWFtLCBmYWxzZSwgX2ZvbnRzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgdmFyIHByb2dyYW0gPSBwYXJzZXIuZXh0cmFjdEZvbnRQcm9ncmFtKHt9KTsKKyAgICBleHBlY3QocHJvZ3JhbS5jaGFyc3RyaW5ncy5sZW5ndGgpLnRvRXF1YWwoMSk7CisgICAgZXhwZWN0KHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YS5FeHBhbnNpb25GYWN0b3IpLnRvRXF1YWwoOTkpOworICB9KTsKKyAgaXQoInBhcnNlcyBmb250IGhlYWRlciBmb250IG1hdHJpeCIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKCIvRm9udE1hdHJpeCBbMC4wMDEgMCAwIDAuMDAxIDAgMCBdcmVhZG9ubHkgZGVmXG4iKTsKKyAgICB2YXIgcGFyc2VyID0gbmV3IF90eXBlMV9wYXJzZXIuVHlwZTFQYXJzZXIoc3RyZWFtLCBmYWxzZSwgX2ZvbnRzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgdmFyIHByb3BzID0ge307CisgICAgcGFyc2VyLmV4dHJhY3RGb250SGVhZGVyKHByb3BzKTsKKyAgICBleHBlY3QocHJvcHMuZm9udE1hdHJpeCkudG9FcXVhbChbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXSk7CisgIH0pOworICBpdCgicGFyc2VzIGZvbnQgaGVhZGVyIGVuY29kaW5nIiwgZnVuY3Rpb24gKCkgeworICAgIHZhciBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIi9FbmNvZGluZyAyNTYgYXJyYXlcbiIgKyAiMCAxIDI1NSB7MSBpbmRleCBleGNoIC8ubm90ZGVmIHB1dH0gZm9yXG4iICsgImR1cCAzMyAvYXJyb3dyaWdodCBwdXRcbiIgKyAicmVhZG9ubHkgZGVmXG4iKTsKKyAgICB2YXIgcGFyc2VyID0gbmV3IF90eXBlMV9wYXJzZXIuVHlwZTFQYXJzZXIoc3RyZWFtLCBmYWxzZSwgX2ZvbnRzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CisgICAgdmFyIHByb3BzID0geworICAgICAgb3ZlcnJpZGFibGVFbmNvZGluZzogdHJ1ZQorICAgIH07CisgICAgcGFyc2VyLmV4dHJhY3RGb250SGVhZGVyKHByb3BzKTsKKyAgICBleHBlY3QocHJvcHMuYnVpbHRJbkVuY29kaW5nWzMzXSkudG9FcXVhbCgiYXJyb3dyaWdodCIpOworICB9KTsKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi90ZXN0L3VuaXQvdWlfdXRpbHNfc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvdWlfdXRpbHNfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2VkZmQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC91aV91dGlsc19zcGVjLmpzCkBAIC0wLDAgKzEsNjU3IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuLi8uLi93ZWIvdWlfdXRpbHMuanMiKTsKKwordmFyIF91dGlsID0gcmVxdWlyZSgiLi4vLi4vc2hhcmVkL3V0aWwuanMiKTsKKwordmFyIF9pc19ub2RlID0gcmVxdWlyZSgiLi4vLi4vc2hhcmVkL2lzX25vZGUuanMiKTsKKworZGVzY3JpYmUoInVpX3V0aWxzIiwgZnVuY3Rpb24gKCkgeworICBkZXNjcmliZSgiYmluYXJ5IHNlYXJjaCIsIGZ1bmN0aW9uICgpIHsKKyAgICBmdW5jdGlvbiBpc1RydWUoYm9vbGVhbikgeworICAgICAgcmV0dXJuIGJvb2xlYW47CisgICAgfQorCisgICAgZnVuY3Rpb24gaXNHcmVhdGVyMyhudW1iZXIpIHsKKyAgICAgIHJldHVybiBudW1iZXIgPiAzOworICAgIH0KKworICAgIGl0KCJlbXB0eSBhcnJheSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmJpbmFyeVNlYXJjaEZpcnN0SXRlbSkoW10sIGlzVHJ1ZSkpLnRvRXF1YWwoMCk7CisgICAgfSk7CisgICAgaXQoInNpbmdsZSBib29sZWFuIGVudHJ5IiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuYmluYXJ5U2VhcmNoRmlyc3RJdGVtKShbZmFsc2VdLCBpc1RydWUpKS50b0VxdWFsKDEpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuYmluYXJ5U2VhcmNoRmlyc3RJdGVtKShbdHJ1ZV0sIGlzVHJ1ZSkpLnRvRXF1YWwoMCk7CisgICAgfSk7CisgICAgaXQoInRocmVlIGJvb2xlYW4gZW50cmllcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmJpbmFyeVNlYXJjaEZpcnN0SXRlbSkoW3RydWUsIHRydWUsIHRydWVdLCBpc1RydWUpKS50b0VxdWFsKDApOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuYmluYXJ5U2VhcmNoRmlyc3RJdGVtKShbZmFsc2UsIHRydWUsIHRydWVdLCBpc1RydWUpKS50b0VxdWFsKDEpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuYmluYXJ5U2VhcmNoRmlyc3RJdGVtKShbZmFsc2UsIGZhbHNlLCB0cnVlXSwgaXNUcnVlKSkudG9FcXVhbCgyKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmJpbmFyeVNlYXJjaEZpcnN0SXRlbSkoW2ZhbHNlLCBmYWxzZSwgZmFsc2VdLCBpc1RydWUpKS50b0VxdWFsKDMpOworICAgIH0pOworICAgIGl0KCJ0aHJlZSBudW1lcmljIGVudHJpZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5iaW5hcnlTZWFyY2hGaXJzdEl0ZW0pKFswLCAxLCAyXSwgaXNHcmVhdGVyMykpLnRvRXF1YWwoMyk7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5iaW5hcnlTZWFyY2hGaXJzdEl0ZW0pKFsyLCAzLCA0XSwgaXNHcmVhdGVyMykpLnRvRXF1YWwoMik7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5iaW5hcnlTZWFyY2hGaXJzdEl0ZW0pKFs0LCA1LCA2XSwgaXNHcmVhdGVyMykpLnRvRXF1YWwoMCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiZ2V0UERGRmlsZU5hbWVGcm9tVVJMIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJnZXRzIFBERiBmaWxlbmFtZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkoIi9wZGZzL2ZpbGUxLnBkZiIpKS50b0VxdWFsKCJmaWxlMS5wZGYiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vcGRmcy9maWxlMi5wZGYiKSkudG9FcXVhbCgiZmlsZTIucGRmIik7CisgICAgfSk7CisgICAgaXQoImdldHMgZmFsbGJhY2sgZmlsZW5hbWUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKCIvcGRmcy9maWxlMS50eHQiKSkudG9FcXVhbCgiZG9jdW1lbnQucGRmIik7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3BkZnMvZmlsZTIudHh0IikpLnRvRXF1YWwoImRvY3VtZW50LnBkZiIpOworICAgIH0pOworICAgIGl0KCJnZXRzIGN1c3RvbSBmYWxsYmFjayBmaWxlbmFtZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkoIi9wZGZzL2ZpbGUxLnR4dCIsICJxd2VydHkxLnBkZiIpKS50b0VxdWFsKCJxd2VydHkxLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wZGZzL2ZpbGUyLnR4dCIsICJxd2VydHkyLnBkZiIpKS50b0VxdWFsKCJxd2VydHkyLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiL3BkZnMvZmlsZTMudHh0IiwgIiIpKS50b0VxdWFsKCIiKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBmYWxsYmFjayBmaWxlbmFtZSB3aGVuIHVybCBpcyBub3QgYSBzdHJpbmciLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKG51bGwpKS50b0VxdWFsKCJkb2N1bWVudC5wZGYiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkobnVsbCwgImZpbGUucGRmIikpLnRvRXF1YWwoImZpbGUucGRmIik7CisgICAgfSk7CisgICAgaXQoImdldHMgUERGIGZpbGVuYW1lIGZyb20gVVJMIGNvbnRhaW5pbmcgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiICAgL3BkZnMvZmlsZTEucGRmICAgIikpLnRvRXF1YWwoImZpbGUxLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiICAgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wZGZzL2ZpbGUyLnBkZiAgICIpKS50b0VxdWFsKCJmaWxlMi5wZGYiKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBQREYgZmlsZW5hbWUgZnJvbSBxdWVyeSBzdHJpbmciLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKCIvcGRmcy9wZGZzLmh0bWw/bmFtZT1maWxlMS5wZGYiKSkudG9FcXVhbCgiZmlsZTEucGRmIik7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3BkZnMvcGRmLmh0bWw/ZmlsZTIucGRmIikpLnRvRXF1YWwoImZpbGUyLnBkZiIpOworICAgIH0pOworICAgIGl0KCJnZXRzIFBERiBmaWxlbmFtZSBmcm9tIGhhc2ggc3RyaW5nIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiL3BkZnMvcGRmcy5odG1sI25hbWU9ZmlsZTEucGRmIikpLnRvRXF1YWwoImZpbGUxLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wZGZzL3BkZi5odG1sI2ZpbGUyLnBkZiIpKS50b0VxdWFsKCJmaWxlMi5wZGYiKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBjb3JyZWN0IFBERiBmaWxlbmFtZSB3aGVuIG11bHRpcGxlIG9uZXMgYXJlIHByZXNlbnQiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKCIvcGRmcy9maWxlMS5wZGY/bmFtZT1maWxlLnBkZiIpKS50b0VxdWFsKCJmaWxlMS5wZGYiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vcGRmcy9maWxlMi5wZGYjZmlsZS5wZGYiKSkudG9FcXVhbCgiZmlsZTIucGRmIik7CisgICAgfSk7CisgICAgaXQoImdldHMgUERGIGZpbGVuYW1lIGZyb20gVVJJLWVuY29kZWQgZGF0YSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBlbmNvZGVkVXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3BkZnMvZmlsZTEucGRmIik7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKGVuY29kZWRVcmwpKS50b0VxdWFsKCJmaWxlMS5wZGYiKTsKKyAgICAgIHZhciBlbmNvZGVkVXJsV2l0aFF1ZXJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3BkZnMvZmlsZS50eHQ/ZmlsZTIucGRmIik7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKGVuY29kZWRVcmxXaXRoUXVlcnkpKS50b0VxdWFsKCJmaWxlMi5wZGYiKTsKKyAgICB9KTsKKyAgICBpdCgiZ2V0cyBQREYgZmlsZW5hbWUgZnJvbSBkYXRhIG1pc3Rha2VuIGZvciBVUkktZW5jb2RlZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkoIi9wZGZzLyVBQS5wZGYiKSkudG9FcXVhbCgiJUFBLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiL3BkZnMvJTJGLnBkZiIpKS50b0VxdWFsKCIlMkYucGRmIik7CisgICAgfSk7CisgICAgaXQoImdldHMgUERGIGZpbGVuYW1lIGZyb20gKHNvbWUpIHN0YW5kYXJkIHByb3RvY29scyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZmlsZTEucGRmIikpLnRvRXF1YWwoImZpbGUxLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vZmlsZTIucGRmIikpLnRvRXF1YWwoImZpbGUyLnBkZiIpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSgiZmlsZTovLy9wYXRoL3RvL2ZpbGVzL2ZpbGUzLnBkZiIpKS50b0VxdWFsKCJmaWxlMy5wZGYiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkoImZ0cDovL3d3dy5leGFtcGxlLmNvbS9maWxlNC5wZGYiKSkudG9FcXVhbCgiZmlsZTQucGRmIik7CisgICAgfSk7CisgICAgaXQoJ2dldHMgUERGIGZpbGVuYW1lIGZyb20gcXVlcnkgc3RyaW5nIGFwcGVuZGVkIHRvICJibG9iOiIgVVJMJywgZnVuY3Rpb24gKCkgeworICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7CisgICAgICAgIHBlbmRpbmcoIkJsb2IgaW4gbm90IHN1cHBvcnRlZCBpbiBOb2RlLmpzLiIpOworICAgICAgfQorCisgICAgICB2YXIgdHlwZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzLCA0LCA1XSk7CisgICAgICB2YXIgYmxvYlVybCA9ICgwLCBfdXRpbC5jcmVhdGVPYmplY3RVUkwpKHR5cGVkQXJyYXksICJhcHBsaWNhdGlvbi9wZGYiKTsKKyAgICAgIGV4cGVjdChibG9iVXJsLnN0YXJ0c1dpdGgoImJsb2I6IikpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKGJsb2JVcmwgKyAiP2ZpbGUucGRmIikpLnRvRXF1YWwoImZpbGUucGRmIik7CisgICAgfSk7CisgICAgaXQoJ2dldHMgZmFsbGJhY2sgZmlsZW5hbWUgZnJvbSBxdWVyeSBzdHJpbmcgYXBwZW5kZWQgdG8gImRhdGE6IiBVUkwnLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgdHlwZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzLCA0LCA1XSk7CisgICAgICB2YXIgZGF0YVVybCA9ICgwLCBfdXRpbC5jcmVhdGVPYmplY3RVUkwpKHR5cGVkQXJyYXksICJhcHBsaWNhdGlvbi9wZGYiLCB0cnVlKTsKKyAgICAgIGV4cGVjdChkYXRhVXJsLnN0YXJ0c1dpdGgoImRhdGE6IikpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKGRhdGFVcmwgKyAiP2ZpbGUxLnBkZiIpKS50b0VxdWFsKCJkb2N1bWVudC5wZGYiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkoIiAgICAgIiArIGRhdGFVcmwgKyAiP2ZpbGUyLnBkZiIpKS50b0VxdWFsKCJkb2N1bWVudC5wZGYiKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJFdmVudEJ1cyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiZGlzcGF0Y2ggZXZlbnQiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgZXZlbnRCdXMgPSBuZXcgX3VpX3V0aWxzLkV2ZW50QnVzKCk7CisgICAgICB2YXIgY291bnQgPSAwOworICAgICAgZXZlbnRCdXMub24oInRlc3QiLCBmdW5jdGlvbiAoZXZ0KSB7CisgICAgICAgIGV4cGVjdChldnQpLnRvRXF1YWwodW5kZWZpbmVkKTsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0pOworICAgICAgZXZlbnRCdXMuZGlzcGF0Y2goInRlc3QiKTsKKyAgICAgIGV4cGVjdChjb3VudCkudG9FcXVhbCgxKTsKKyAgICB9KTsKKyAgICBpdCgiZGlzcGF0Y2ggZXZlbnQgd2l0aCBhcmd1bWVudHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBldmVudEJ1cyA9IG5ldyBfdWlfdXRpbHMuRXZlbnRCdXMoKTsKKyAgICAgIGxldCBjb3VudCA9IDA7CisgICAgICBldmVudEJ1cy5vbigidGVzdCIsIGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgZXhwZWN0KGV2dCkudG9FcXVhbCh7CisgICAgICAgICAgYWJjOiAxMjMKKyAgICAgICAgfSk7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9KTsKKyAgICAgIGV2ZW50QnVzLmRpc3BhdGNoKCJ0ZXN0IiwgeworICAgICAgICBhYmM6IDEyMworICAgICAgfSk7CisgICAgICBleHBlY3QoY291bnQpLnRvRXF1YWwoMSk7CisgICAgfSk7CisgICAgaXQoImRpc3BhdGNoIGRpZmZlcmVudCBldmVudCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBldmVudEJ1cyA9IG5ldyBfdWlfdXRpbHMuRXZlbnRCdXMoKTsKKyAgICAgIHZhciBjb3VudCA9IDA7CisgICAgICBldmVudEJ1cy5vbigidGVzdCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0pOworICAgICAgZXZlbnRCdXMuZGlzcGF0Y2goIm5vdHRlc3QiKTsKKyAgICAgIGV4cGVjdChjb3VudCkudG9FcXVhbCgwKTsKKyAgICB9KTsKKyAgICBpdCgiZGlzcGF0Y2ggZXZlbnQgbXVsdGlwbGUgdGltZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgZXZlbnRCdXMgPSBuZXcgX3VpX3V0aWxzLkV2ZW50QnVzKCk7CisgICAgICB2YXIgY291bnQgPSAwOworICAgICAgZXZlbnRCdXMuZGlzcGF0Y2goInRlc3QiKTsKKyAgICAgIGV2ZW50QnVzLm9uKCJ0ZXN0IiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb3VudCsrOworICAgICAgfSk7CisgICAgICBldmVudEJ1cy5kaXNwYXRjaCgidGVzdCIpOworICAgICAgZXZlbnRCdXMuZGlzcGF0Y2goInRlc3QiKTsKKyAgICAgIGV4cGVjdChjb3VudCkudG9FcXVhbCgyKTsKKyAgICB9KTsKKyAgICBpdCgiZGlzcGF0Y2ggZXZlbnQgdG8gbXVsdGlwbGUgaGFuZGxlcnMiLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgZXZlbnRCdXMgPSBuZXcgX3VpX3V0aWxzLkV2ZW50QnVzKCk7CisgICAgICB2YXIgY291bnQgPSAwOworICAgICAgZXZlbnRCdXMub24oInRlc3QiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9KTsKKyAgICAgIGV2ZW50QnVzLm9uKCJ0ZXN0IiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb3VudCsrOworICAgICAgfSk7CisgICAgICBldmVudEJ1cy5kaXNwYXRjaCgidGVzdCIpOworICAgICAgZXhwZWN0KGNvdW50KS50b0VxdWFsKDIpOworICAgIH0pOworICAgIGl0KCJkaXNwYXRjaCB0byBkZXRhY2hlZCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBldmVudEJ1cyA9IG5ldyBfdWlfdXRpbHMuRXZlbnRCdXMoKTsKKyAgICAgIHZhciBjb3VudCA9IDA7CisKKyAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH07CisKKyAgICAgIGV2ZW50QnVzLm9uKCJ0ZXN0IiwgbGlzdGVuZXIpOworICAgICAgZXZlbnRCdXMuZGlzcGF0Y2goInRlc3QiKTsKKyAgICAgIGV2ZW50QnVzLm9mZigidGVzdCIsIGxpc3RlbmVyKTsKKyAgICAgIGV2ZW50QnVzLmRpc3BhdGNoKCJ0ZXN0Iik7CisgICAgICBleHBlY3QoY291bnQpLnRvRXF1YWwoMSk7CisgICAgfSk7CisgICAgaXQoImRpc3BhdGNoIHRvIHdyb25nIGRldGFjaGVkIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGV2ZW50QnVzID0gbmV3IF91aV91dGlscy5FdmVudEJ1cygpOworICAgICAgdmFyIGNvdW50ID0gMDsKKyAgICAgIGV2ZW50QnVzLm9uKCJ0ZXN0IiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb3VudCsrOworICAgICAgfSk7CisgICAgICBldmVudEJ1cy5kaXNwYXRjaCgidGVzdCIpOworICAgICAgZXZlbnRCdXMub2ZmKCJ0ZXN0IiwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb3VudCsrOworICAgICAgfSk7CisgICAgICBldmVudEJ1cy5kaXNwYXRjaCgidGVzdCIpOworICAgICAgZXhwZWN0KGNvdW50KS50b0VxdWFsKDIpOworICAgIH0pOworICAgIGl0KCJkaXNwYXRjaCB0byBkZXRhY2hlZCBkdXJpbmcgaGFuZGxpbmciLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgZXZlbnRCdXMgPSBuZXcgX3VpX3V0aWxzLkV2ZW50QnVzKCk7CisgICAgICB2YXIgY291bnQgPSAwOworCisgICAgICB2YXIgbGlzdGVuZXIxID0gZnVuY3Rpb24gKCkgeworICAgICAgICBldmVudEJ1cy5vZmYoInRlc3QiLCBsaXN0ZW5lcjIpOworICAgICAgICBjb3VudCsrOworICAgICAgfTsKKworICAgICAgdmFyIGxpc3RlbmVyMiA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZXZlbnRCdXMub2ZmKCJ0ZXN0IiwgbGlzdGVuZXIxKTsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH07CisKKyAgICAgIGV2ZW50QnVzLm9uKCJ0ZXN0IiwgbGlzdGVuZXIxKTsKKyAgICAgIGV2ZW50QnVzLm9uKCJ0ZXN0IiwgbGlzdGVuZXIyKTsKKyAgICAgIGV2ZW50QnVzLmRpc3BhdGNoKCJ0ZXN0Iik7CisgICAgICBldmVudEJ1cy5kaXNwYXRjaCgidGVzdCIpOworICAgICAgZXhwZWN0KGNvdW50KS50b0VxdWFsKDIpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IHJlLWRpc3BhdGNoIHRvIERPTSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgcGVuZGluZygiRG9jdW1lbnQgaW4gbm90IHN1cHBvcnRlZCBpbiBOb2RlLmpzLiIpOworICAgICAgfQorCisgICAgICBjb25zdCBldmVudEJ1cyA9IG5ldyBfdWlfdXRpbHMuRXZlbnRCdXMoKTsKKyAgICAgIGxldCBjb3VudCA9IDA7CisgICAgICBldmVudEJ1cy5vbigidGVzdCIsIGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgZXhwZWN0KGV2dCkudG9FcXVhbCh1bmRlZmluZWQpOworICAgICAgICBjb3VudCsrOworICAgICAgfSk7CisKKyAgICAgIGZ1bmN0aW9uIGRvbUV2ZW50TGlzdGVuZXIoKSB7CisgICAgICAgIGRvbmUuZmFpbCgic2hhbGwgbm90IGRpc3BhdGNoIERPTSBldmVudC4iKTsKKyAgICAgIH0KKworICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsIGRvbUV2ZW50TGlzdGVuZXIpOworICAgICAgZXZlbnRCdXMuZGlzcGF0Y2goInRlc3QiKTsKKyAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4geworICAgICAgICBleHBlY3QoY291bnQpLnRvRXF1YWwoMSk7CisgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLCBkb21FdmVudExpc3RlbmVyKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiaXNWYWxpZFJvdGF0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcmVqZWN0IG5vbi1pbnRlZ2VyIGFuZ2xlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmlzVmFsaWRSb3RhdGlvbikoKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5pc1ZhbGlkUm90YXRpb24pKG51bGwpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmlzVmFsaWRSb3RhdGlvbikoTmFOKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5pc1ZhbGlkUm90YXRpb24pKFs5MF0pKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmlzVmFsaWRSb3RhdGlvbikoIjkwIikpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuaXNWYWxpZFJvdGF0aW9uKSg5MC41KSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZWplY3Qgbm9uLW11bHRpcGxlIG9mIDkwIGRlZ3JlZSBhbmdsZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5pc1ZhbGlkUm90YXRpb24pKDQ1KSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5pc1ZhbGlkUm90YXRpb24pKC0xMjMpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGFjY2VwdCB2YWxpZCBhbmdsZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5pc1ZhbGlkUm90YXRpb24pKDApKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuaXNWYWxpZFJvdGF0aW9uKSg5MCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5pc1ZhbGlkUm90YXRpb24pKC0yNzApKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuaXNWYWxpZFJvdGF0aW9uKSg1NDApKS50b0VxdWFsKHRydWUpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoImlzUG9ydHJhaXRPcmllbnRhdGlvbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIGJlIHBvcnRyYWl0IG9yaWVudGF0aW9uIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuaXNQb3J0cmFpdE9yaWVudGF0aW9uKSh7CisgICAgICAgIHdpZHRoOiAyMDAsCisgICAgICAgIGhlaWdodDogNDAwCisgICAgICB9KSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmlzUG9ydHJhaXRPcmllbnRhdGlvbikoeworICAgICAgICB3aWR0aDogNTAwLAorICAgICAgICBoZWlnaHQ6IDUwMAorICAgICAgfSkpLnRvRXF1YWwodHJ1ZSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBiZSBsYW5kc2NhcGUgb3JpZW50YXRpb24iLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5pc1BvcnRyYWl0T3JpZW50YXRpb24pKHsKKyAgICAgICAgd2lkdGg6IDYwMCwKKyAgICAgICAgaGVpZ2h0OiAzMDAKKyAgICAgIH0pKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJ3YWl0T25FdmVudE9yVGltZW91dCIsIGZ1bmN0aW9uICgpIHsKKyAgICBsZXQgZXZlbnRCdXM7CisgICAgYmVmb3JlQWxsKGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBldmVudEJ1cyA9IG5ldyBfdWlfdXRpbHMuRXZlbnRCdXMoKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBhZnRlckFsbChmdW5jdGlvbiAoKSB7CisgICAgICBldmVudEJ1cyA9IG51bGw7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZWplY3QgaW52YWxpZCBwYXJhbWV0ZXJzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGludmFsaWRUYXJnZXQgPSAoMCwgX3VpX3V0aWxzLndhaXRPbkV2ZW50T3JUaW1lb3V0KSh7CisgICAgICAgIHRhcmdldDogIndpbmRvdyIsCisgICAgICAgIG5hbWU6ICJET01Db250ZW50TG9hZGVkIgorICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiU2hvdWxkIHJlamVjdCBpbnZhbGlkIHBhcmFtZXRlcnMuIik7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGV4cGVjdChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikudG9FcXVhbCh0cnVlKTsKKyAgICAgIH0pOworICAgICAgY29uc3QgaW52YWxpZE5hbWUgPSAoMCwgX3VpX3V0aWxzLndhaXRPbkV2ZW50T3JUaW1lb3V0KSh7CisgICAgICAgIHRhcmdldDogZXZlbnRCdXMsCisgICAgICAgIG5hbWU6ICIiCisgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTaG91bGQgcmVqZWN0IGludmFsaWQgcGFyYW1ldGVycy4iKTsKKyAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgZXhwZWN0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKS50b0VxdWFsKHRydWUpOworICAgICAgfSk7CisgICAgICBjb25zdCBpbnZhbGlkRGVsYXkgPSAoMCwgX3VpX3V0aWxzLndhaXRPbkV2ZW50T3JUaW1lb3V0KSh7CisgICAgICAgIHRhcmdldDogZXZlbnRCdXMsCisgICAgICAgIG5hbWU6ICJwYWdlcmVuZGVyZWQiLAorICAgICAgICBkZWxheTogLTEwMDAKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlNob3VsZCByZWplY3QgaW52YWxpZCBwYXJhbWV0ZXJzLiIpOworICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBleHBlY3QocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpLnRvRXF1YWwodHJ1ZSk7CisgICAgICB9KTsKKyAgICAgIFByb21pc2UuYWxsKFtpbnZhbGlkVGFyZ2V0LCBpbnZhbGlkTmFtZSwgaW52YWxpZERlbGF5XSkudGhlbihkb25lLCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVzb2x2ZSBvbiBldmVudCwgdXNpbmcgdGhlIERPTSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHsKKyAgICAgICAgcGVuZGluZygiRG9jdW1lbnQgaW4gbm90IHN1cHBvcnRlZCBpbiBOb2RlLmpzLiIpOworICAgICAgfQorCisgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKKyAgICAgIGNvbnN0IGJ1dHRvbkNsaWNrZWQgPSAoMCwgX3VpX3V0aWxzLndhaXRPbkV2ZW50T3JUaW1lb3V0KSh7CisgICAgICAgIHRhcmdldDogYnV0dG9uLAorICAgICAgICBuYW1lOiAiY2xpY2siLAorICAgICAgICBkZWxheTogMTAwMDAKKyAgICAgIH0pOworICAgICAgYnV0dG9uLmNsaWNrKCk7CisgICAgICBidXR0b25DbGlja2VkLnRoZW4oZnVuY3Rpb24gKHR5cGUpIHsKKyAgICAgICAgZXhwZWN0KHR5cGUpLnRvRXF1YWwoX3VpX3V0aWxzLldhaXRPblR5cGUuRVZFTlQpOworICAgICAgICBkb25lKCk7CisgICAgICB9LCBkb25lLmZhaWwpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmVzb2x2ZSBvbiB0aW1lb3V0LCB1c2luZyB0aGUgRE9NIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGlmIChfaXNfbm9kZS5pc05vZGVKUykgeworICAgICAgICBwZW5kaW5nKCJEb2N1bWVudCBpbiBub3Qgc3VwcG9ydGVkIGluIE5vZGUuanMuIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOworICAgICAgY29uc3QgYnV0dG9uQ2xpY2tlZCA9ICgwLCBfdWlfdXRpbHMud2FpdE9uRXZlbnRPclRpbWVvdXQpKHsKKyAgICAgICAgdGFyZ2V0OiBidXR0b24sCisgICAgICAgIG5hbWU6ICJjbGljayIsCisgICAgICAgIGRlbGF5OiAxMAorICAgICAgfSk7CisgICAgICBidXR0b25DbGlja2VkLnRoZW4oZnVuY3Rpb24gKHR5cGUpIHsKKyAgICAgICAgZXhwZWN0KHR5cGUpLnRvRXF1YWwoX3VpX3V0aWxzLldhaXRPblR5cGUuVElNRU9VVCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sIGRvbmUuZmFpbCk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZXNvbHZlIG9uIGV2ZW50LCB1c2luZyB0aGUgRXZlbnRCdXMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3QgcGFnZVJlbmRlcmVkID0gKDAsIF91aV91dGlscy53YWl0T25FdmVudE9yVGltZW91dCkoeworICAgICAgICB0YXJnZXQ6IGV2ZW50QnVzLAorICAgICAgICBuYW1lOiAicGFnZXJlbmRlcmVkIiwKKyAgICAgICAgZGVsYXk6IDEwMDAwCisgICAgICB9KTsKKyAgICAgIGV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlcmVuZGVyZWQiKTsKKyAgICAgIHBhZ2VSZW5kZXJlZC50aGVuKGZ1bmN0aW9uICh0eXBlKSB7CisgICAgICAgIGV4cGVjdCh0eXBlKS50b0VxdWFsKF91aV91dGlscy5XYWl0T25UeXBlLkVWRU5UKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHJlc29sdmUgb24gdGltZW91dCwgdXNpbmcgdGhlIEV2ZW50QnVzIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IHBhZ2VSZW5kZXJlZCA9ICgwLCBfdWlfdXRpbHMud2FpdE9uRXZlbnRPclRpbWVvdXQpKHsKKyAgICAgICAgdGFyZ2V0OiBldmVudEJ1cywKKyAgICAgICAgbmFtZTogInBhZ2VyZW5kZXJlZCIsCisgICAgICAgIGRlbGF5OiAxMAorICAgICAgfSk7CisgICAgICBwYWdlUmVuZGVyZWQudGhlbihmdW5jdGlvbiAodHlwZSkgeworICAgICAgICBleHBlY3QodHlwZSkudG9FcXVhbChfdWlfdXRpbHMuV2FpdE9uVHlwZS5USU1FT1VUKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJnZXRQYWdlU2l6ZUluY2hlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiZ2V0cyBwYWdlIHNpemUgKGluIGluY2hlcykiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBwYWdlID0geworICAgICAgICB2aWV3OiBbMCwgMCwgNTk1LjI4LCA4NDEuODldLAorICAgICAgICB1c2VyVW5pdDogMS4wLAorICAgICAgICByb3RhdGU6IDAKKyAgICAgIH07CisgICAgICBjb25zdCB7CisgICAgICAgIHdpZHRoLAorICAgICAgICBoZWlnaHQKKyAgICAgIH0gPSAoMCwgX3VpX3V0aWxzLmdldFBhZ2VTaXplSW5jaGVzKShwYWdlKTsKKyAgICAgIGV4cGVjdCgrd2lkdGgudG9QcmVjaXNpb24oMykpLnRvRXF1YWwoOC4yNyk7CisgICAgICBleHBlY3QoK2hlaWdodC50b1ByZWNpc2lvbig0KSkudG9FcXVhbCgxMS42OSk7CisgICAgfSk7CisgICAgaXQoImdldHMgcGFnZSBzaXplIChpbiBpbmNoZXMpLCBmb3Igbm9uLWRlZmF1bHQgL1JvdGF0ZSBlbnRyeSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHBkZlBhZ2UxID0geworICAgICAgICB2aWV3OiBbMCwgMCwgNjEyLCA3OTJdLAorICAgICAgICB1c2VyVW5pdDogMSwKKyAgICAgICAgcm90YXRlOiAwCisgICAgICB9OworICAgICAgY29uc3QgeworICAgICAgICB3aWR0aDogd2lkdGgxLAorICAgICAgICBoZWlnaHQ6IGhlaWdodDEKKyAgICAgIH0gPSAoMCwgX3VpX3V0aWxzLmdldFBhZ2VTaXplSW5jaGVzKShwZGZQYWdlMSk7CisgICAgICBleHBlY3Qod2lkdGgxKS50b0VxdWFsKDguNSk7CisgICAgICBleHBlY3QoaGVpZ2h0MSkudG9FcXVhbCgxMSk7CisgICAgICBjb25zdCBwZGZQYWdlMiA9IHsKKyAgICAgICAgdmlldzogWzAsIDAsIDYxMiwgNzkyXSwKKyAgICAgICAgdXNlclVuaXQ6IDEsCisgICAgICAgIHJvdGF0ZTogOTAKKyAgICAgIH07CisgICAgICBjb25zdCB7CisgICAgICAgIHdpZHRoOiB3aWR0aDIsCisgICAgICAgIGhlaWdodDogaGVpZ2h0MgorICAgICAgfSA9ICgwLCBfdWlfdXRpbHMuZ2V0UGFnZVNpemVJbmNoZXMpKHBkZlBhZ2UyKTsKKyAgICAgIGV4cGVjdCh3aWR0aDIpLnRvRXF1YWwoMTEpOworICAgICAgZXhwZWN0KGhlaWdodDIpLnRvRXF1YWwoOC41KTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJnZXRWaXNpYmxlRWxlbWVudHMiLCBmdW5jdGlvbiAoKSB7CisgICAgY29uc3QgQk9SREVSX1dJRFRIID0gOTsKKyAgICBjb25zdCBTUEFDSU5HID0gMiAqIEJPUkRFUl9XSURUSCAtIDc7CisKKyAgICBmdW5jdGlvbiBtYWtlUGFnZXMobGluZXMpIHsKKyAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOworICAgICAgbGV0IGxpbmVUb3AgPSAwLAorICAgICAgICAgIGlkID0gMDsKKworICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CisgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBsaW5lLnJlZHVjZShmdW5jdGlvbiAobWF4SGVpZ2h0LCBwYWlyKSB7CisgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KG1heEhlaWdodCwgcGFpclsxXSk7CisgICAgICAgIH0sIDApOworICAgICAgICBsZXQgb2Zmc2V0TGVmdCA9IC1CT1JERVJfV0lEVEg7CisKKyAgICAgICAgZm9yIChjb25zdCBbY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodF0gb2YgbGluZSkgeworICAgICAgICAgIGNvbnN0IG9mZnNldFRvcCA9IGxpbmVUb3AgKyAobGluZUhlaWdodCAtIGNsaWVudEhlaWdodCkgLyAyIC0gQk9SREVSX1dJRFRIOworICAgICAgICAgIGNvbnN0IGRpdiA9IHsKKyAgICAgICAgICAgIG9mZnNldExlZnQsCisgICAgICAgICAgICBvZmZzZXRUb3AsCisgICAgICAgICAgICBjbGllbnRXaWR0aCwKKyAgICAgICAgICAgIGNsaWVudEhlaWdodCwKKyAgICAgICAgICAgIGNsaWVudExlZnQ6IEJPUkRFUl9XSURUSCwKKyAgICAgICAgICAgIGNsaWVudFRvcDogQk9SREVSX1dJRFRICisgICAgICAgICAgfTsKKyAgICAgICAgICByZXN1bHQucHVzaCh7CisgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgIGRpdgorICAgICAgICAgIH0pOworICAgICAgICAgICsraWQ7CisgICAgICAgICAgb2Zmc2V0TGVmdCArPSBjbGllbnRXaWR0aCArIFNQQUNJTkc7CisgICAgICAgIH0KKworICAgICAgICBsaW5lVG9wICs9IGxpbmVIZWlnaHQgKyBTUEFDSU5HOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGZ1bmN0aW9uIHNsb3dHZXRWaXNpYmxlRWxlbWVudHMoc2Nyb2xsLCBwYWdlcykgeworICAgICAgY29uc3Qgdmlld3MgPSBbXTsKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgc2Nyb2xsTGVmdCwKKyAgICAgICAgc2Nyb2xsVG9wCisgICAgICB9ID0gc2Nyb2xsOworICAgICAgY29uc3Qgc2Nyb2xsUmlnaHQgPSBzY3JvbGxMZWZ0ICsgc2Nyb2xsLmNsaWVudFdpZHRoOworICAgICAgY29uc3Qgc2Nyb2xsQm90dG9tID0gc2Nyb2xsVG9wICsgc2Nyb2xsLmNsaWVudEhlaWdodDsKKworICAgICAgZm9yIChjb25zdCB2aWV3IG9mIHBhZ2VzKSB7CisgICAgICAgIGNvbnN0IHsKKyAgICAgICAgICBkaXYKKyAgICAgICAgfSA9IHZpZXc7CisgICAgICAgIGNvbnN0IHZpZXdMZWZ0ID0gZGl2Lm9mZnNldExlZnQgKyBkaXYuY2xpZW50TGVmdDsKKyAgICAgICAgY29uc3Qgdmlld1JpZ2h0ID0gdmlld0xlZnQgKyBkaXYuY2xpZW50V2lkdGg7CisgICAgICAgIGNvbnN0IHZpZXdUb3AgPSBkaXYub2Zmc2V0VG9wICsgZGl2LmNsaWVudFRvcDsKKyAgICAgICAgY29uc3Qgdmlld0JvdHRvbSA9IHZpZXdUb3AgKyBkaXYuY2xpZW50SGVpZ2h0OworCisgICAgICAgIGlmICh2aWV3TGVmdCA8IHNjcm9sbFJpZ2h0ICYmIHZpZXdSaWdodCA+IHNjcm9sbExlZnQgJiYgdmlld1RvcCA8IHNjcm9sbEJvdHRvbSAmJiB2aWV3Qm90dG9tID4gc2Nyb2xsVG9wKSB7CisgICAgICAgICAgY29uc3QgaGlkZGVuSGVpZ2h0ID0gTWF0aC5tYXgoMCwgc2Nyb2xsVG9wIC0gdmlld1RvcCkgKyBNYXRoLm1heCgwLCB2aWV3Qm90dG9tIC0gc2Nyb2xsQm90dG9tKTsKKyAgICAgICAgICBjb25zdCBoaWRkZW5XaWR0aCA9IE1hdGgubWF4KDAsIHNjcm9sbExlZnQgLSB2aWV3TGVmdCkgKyBNYXRoLm1heCgwLCB2aWV3UmlnaHQgLSBzY3JvbGxSaWdodCk7CisgICAgICAgICAgY29uc3QgdmlzaWJsZUFyZWEgPSAoZGl2LmNsaWVudEhlaWdodCAtIGhpZGRlbkhlaWdodCkgKiAoZGl2LmNsaWVudFdpZHRoIC0gaGlkZGVuV2lkdGgpOworICAgICAgICAgIGNvbnN0IHBlcmNlbnQgPSB2aXNpYmxlQXJlYSAqIDEwMCAvIGRpdi5jbGllbnRIZWlnaHQgLyBkaXYuY2xpZW50V2lkdGggfCAwOworICAgICAgICAgIHZpZXdzLnB1c2goeworICAgICAgICAgICAgaWQ6IHZpZXcuaWQsCisgICAgICAgICAgICB4OiB2aWV3TGVmdCwKKyAgICAgICAgICAgIHk6IHZpZXdUb3AsCisgICAgICAgICAgICB2aWV3LAorICAgICAgICAgICAgcGVyY2VudAorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIGZpcnN0OiB2aWV3c1swXSwKKyAgICAgICAgbGFzdDogdmlld3Nbdmlld3MubGVuZ3RoIC0gMV0sCisgICAgICAgIHZpZXdzCisgICAgICB9OworICAgIH0KKworICAgIGZ1bmN0aW9uIHNjcm9sbE92ZXJEb2N1bWVudChwYWdlcywgaG9yaXpvbnRhbGx5ID0gZmFsc2UpIHsKKyAgICAgIGNvbnN0IHNpemUgPSBwYWdlcy5yZWR1Y2UoZnVuY3Rpb24gKG1heCwgeworICAgICAgICBkaXYKKyAgICAgIH0pIHsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaG9yaXpvbnRhbGx5ID8gZGl2Lm9mZnNldExlZnQgKyBkaXYuY2xpZW50TGVmdCArIGRpdi5jbGllbnRXaWR0aCA6IGRpdi5vZmZzZXRUb3AgKyBkaXYuY2xpZW50VG9wICsgZGl2LmNsaWVudEhlaWdodCk7CisgICAgICB9LCAwKTsKKworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDcpIHsKKyAgICAgICAgZm9yIChsZXQgaiA9IGkgKyA1OyBqIDwgc2l6ZTsgaiArPSBqIC0gaSkgeworICAgICAgICAgIGNvbnN0IHNjcm9sbCA9IGhvcml6b250YWxseSA/IHsKKyAgICAgICAgICAgIHNjcm9sbFRvcDogMCwKKyAgICAgICAgICAgIHNjcm9sbExlZnQ6IGksCisgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IDEwMDAwLAorICAgICAgICAgICAgY2xpZW50V2lkdGg6IGogLSBpCisgICAgICAgICAgfSA6IHsKKyAgICAgICAgICAgIHNjcm9sbFRvcDogaSwKKyAgICAgICAgICAgIHNjcm9sbExlZnQ6IDAsCisgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IGogLSBpLAorICAgICAgICAgICAgY2xpZW50V2lkdGg6IDEwMDAwCisgICAgICAgICAgfTsKKyAgICAgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRWaXNpYmxlRWxlbWVudHMpKHNjcm9sbCwgcGFnZXMsIGZhbHNlLCBob3Jpem9udGFsbHkpKS50b0VxdWFsKHNsb3dHZXRWaXNpYmxlRWxlbWVudHMoc2Nyb2xsLCBwYWdlcykpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaXQoIndpdGggcGFnZXMgb2YgdmFyeWluZyBoZWlnaHQiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBwYWdlcyA9IG1ha2VQYWdlcyhbW1s1MCwgMjBdLCBbMjAsIDUwXV0sIFtbMzAsIDEyXSwgWzEyLCAzMF1dLCBbWzIwLCA1MF0sIFs1MCwgMjBdXSwgW1s1MCwgMjBdLCBbMjAsIDUwXV1dKTsKKyAgICAgIHNjcm9sbE92ZXJEb2N1bWVudChwYWdlcyk7CisgICAgfSk7CisgICAgaXQoIndpZGVzY3JlZW4gY2hhbGxlbmdlIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgcGFnZXMgPSBtYWtlUGFnZXMoW1tbMTAsIDUwXSwgWzEwLCA2MF0sIFsxMCwgNzBdLCBbMTAsIDgwXSwgWzEwLCA5MF1dLCBbWzEwLCA5MF0sIFsxMCwgODBdLCBbMTAsIDcwXSwgWzEwLCA2MF0sIFsxMCwgNTBdXSwgW1sxMCwgNTBdLCBbMTAsIDYwXSwgWzEwLCA3MF0sIFsxMCwgODBdLCBbMTAsIDkwXV1dKTsKKyAgICAgIHNjcm9sbE92ZXJEb2N1bWVudChwYWdlcyk7CisgICAgfSk7CisgICAgaXQoIndvcmtzIHdpdGggaG9yaXpvbnRhbCBzY3JvbGxpbmciLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBwYWdlcyA9IG1ha2VQYWdlcyhbW1sxMCwgNTBdLCBbMjAsIDIwXSwgWzMwLCAxMF1dXSk7CisgICAgICBzY3JvbGxPdmVyRG9jdW1lbnQocGFnZXMsIHRydWUpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIGBzb3J0QnlWaXNpYmlsaXR5YCBjb3JyZWN0bHkiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBzY3JvbGxFbCA9IHsKKyAgICAgICAgc2Nyb2xsVG9wOiA3NSwKKyAgICAgICAgc2Nyb2xsTGVmdDogMCwKKyAgICAgICAgY2xpZW50SGVpZ2h0OiA3NTAsCisgICAgICAgIGNsaWVudFdpZHRoOiAxNTAwCisgICAgICB9OworICAgICAgY29uc3Qgdmlld3MgPSBtYWtlUGFnZXMoW1tbMTAwLCAxNTBdXSwgW1sxMDAsIDE1MF1dLCBbWzEwMCwgMTUwXV1dKTsKKyAgICAgIGNvbnN0IHZpc2libGUgPSAoMCwgX3VpX3V0aWxzLmdldFZpc2libGVFbGVtZW50cykoc2Nyb2xsRWwsIHZpZXdzKTsKKyAgICAgIGNvbnN0IHZpc2libGVTb3J0ZWQgPSAoMCwgX3VpX3V0aWxzLmdldFZpc2libGVFbGVtZW50cykoc2Nyb2xsRWwsIHZpZXdzLCB0cnVlKTsKKyAgICAgIGNvbnN0IHZpZXdzT3JkZXIgPSBbXSwKKyAgICAgICAgICAgIHZpZXdzU29ydGVkT3JkZXIgPSBbXTsKKworICAgICAgZm9yIChjb25zdCB2aWV3IG9mIHZpc2libGUudmlld3MpIHsKKyAgICAgICAgdmlld3NPcmRlci5wdXNoKHZpZXcuaWQpOworICAgICAgfQorCisgICAgICBmb3IgKGNvbnN0IHZpZXcgb2YgdmlzaWJsZVNvcnRlZC52aWV3cykgeworICAgICAgICB2aWV3c1NvcnRlZE9yZGVyLnB1c2godmlldy5pZCk7CisgICAgICB9CisKKyAgICAgIGV4cGVjdCh2aWV3c09yZGVyKS50b0VxdWFsKFswLCAxLCAyXSk7CisgICAgICBleHBlY3Qodmlld3NTb3J0ZWRPcmRlcikudG9FcXVhbChbMSwgMiwgMF0pOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIHZpZXdzIGJlaW5nIGVtcHR5IiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgc2Nyb2xsRWwgPSB7CisgICAgICAgIHNjcm9sbFRvcDogMTAsCisgICAgICAgIHNjcm9sbExlZnQ6IDAsCisgICAgICAgIGNsaWVudEhlaWdodDogNzUwLAorICAgICAgICBjbGllbnRXaWR0aDogMTUwMAorICAgICAgfTsKKyAgICAgIGNvbnN0IHZpZXdzID0gW107CisgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5nZXRWaXNpYmxlRWxlbWVudHMpKHNjcm9sbEVsLCB2aWV3cykpLnRvRXF1YWwoeworICAgICAgICBmaXJzdDogdW5kZWZpbmVkLAorICAgICAgICBsYXN0OiB1bmRlZmluZWQsCisgICAgICAgIHZpZXdzOiBbXQorICAgICAgfSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgYWxsIHZpZXdzIGJlaW5nIGhpZGRlbiAod2l0aG91dCBlcnJvcnMpIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgc2Nyb2xsRWwgPSB7CisgICAgICAgIHNjcm9sbFRvcDogMTAwMDAwLAorICAgICAgICBzY3JvbGxMZWZ0OiAwLAorICAgICAgICBjbGllbnRIZWlnaHQ6IDc1MCwKKyAgICAgICAgY2xpZW50V2lkdGg6IDE1MDAKKyAgICAgIH07CisgICAgICBjb25zdCB2aWV3cyA9IG1ha2VQYWdlcyhbW1sxMDAsIDE1MF1dLCBbWzEwMCwgMTUwXV0sIFtbMTAwLCAxNTBdXV0pOworICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuZ2V0VmlzaWJsZUVsZW1lbnRzKShzY3JvbGxFbCwgdmlld3MpKS50b0VxdWFsKHsKKyAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCwKKyAgICAgICAgbGFzdDogdW5kZWZpbmVkLAorICAgICAgICB2aWV3czogW10KKyAgICAgIH0pOworICAgIH0pOworICAgIGRlc2NyaWJlKCJiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCB0YWxsUGFnZSA9IFsxMCwgNTBdOworICAgICAgY29uc3Qgc2hvcnRQYWdlID0gWzEwLCAxMF07CisgICAgICBjb25zdCB0b3AxID0gMjAgKyBTUEFDSU5HICsgNDA7CisgICAgICBjb25zdCB0b3AyID0gMjAgKyBTUEFDSU5HICsgMTA7CisgICAgICBpdCgiaGFuZGxlcyBjYXNlIDEiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbnN0IHBhZ2VzID0gbWFrZVBhZ2VzKFtbWzEwLCAyMF0sIFsxMCwgMjBdLCBbMTAsIDIwXSwgWzEwLCAyMF1dLCBbdGFsbFBhZ2UsIHNob3J0UGFnZSwgdGFsbFBhZ2UsIHNob3J0UGFnZV0sIFtbMTAsIDUwXSwgWzEwLCA1MF0sIFsxMCwgNTBdLCBbMTAsIDUwXV0sIFtbMTAsIDIwXSwgWzEwLCAyMF0sIFsxMCwgMjBdLCBbMTAsIDIwXV0sIFtbMTAsIDIwXV1dKTsKKyAgICAgICAgY29uc3QgYnNSZXN1bHQgPSA0OworICAgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5iYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMpKGJzUmVzdWx0LCBwYWdlcywgdG9wMSkpLnRvRXF1YWwoNCk7CisgICAgICB9KTsKKyAgICAgIGl0KCJoYW5kbGVzIGNhc2UgMiIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3QgcGFnZXMgPSBtYWtlUGFnZXMoW1tbMTAsIDIwXSwgWzEwLCAyMF0sIFsxMCwgMjBdLCBbMTAsIDIwXV0sIFt0YWxsUGFnZSwgc2hvcnRQYWdlLCB0YWxsUGFnZSwgdGFsbFBhZ2VdLCBbWzEwLCA1MF0sIFsxMCwgNTBdLCBbMTAsIDUwXSwgWzEwLCA1MF1dLCBbWzEwLCAyMF0sIFsxMCwgMjBdLCBbMTAsIDIwXSwgWzEwLCAyMF1dXSk7CisgICAgICAgIGNvbnN0IGJzUmVzdWx0ID0gNjsKKyAgICAgICAgZXhwZWN0KCgwLCBfdWlfdXRpbHMuYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzKShic1Jlc3VsdCwgcGFnZXMsIHRvcDEpKS50b0VxdWFsKDQpOworICAgICAgfSk7CisgICAgICBpdCgiaGFuZGxlcyBjYXNlIDMiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNvbnN0IHBhZ2VzID0gbWFrZVBhZ2VzKFtbWzEwLCAyMF0sIFsxMCwgMjBdLCBbMTAsIDIwXSwgWzEwLCAyMF1dLCBbdGFsbFBhZ2UsIHNob3J0UGFnZSwgdGFsbFBhZ2UsIHNob3J0UGFnZV0sIFtbMTAsIDUwXSwgWzEwLCA1MF0sIFsxMCwgNTBdLCBbMTAsIDUwXV0sIFtbMTAsIDIwXSwgWzEwLCAyMF0sIFsxMCwgMjBdLCBbMTAsIDIwXV1dKTsKKyAgICAgICAgY29uc3QgYnNSZXN1bHQgPSA4OworICAgICAgICBleHBlY3QoKDAsIF91aV91dGlscy5iYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMpKGJzUmVzdWx0LCBwYWdlcywgdG9wMSkpLnRvRXF1YWwoNCk7CisgICAgICB9KTsKKyAgICAgIGl0KCJoYW5kbGVzIGNhc2UgNCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29uc3QgcGFnZXMgPSBtYWtlUGFnZXMoW1tbMTAsIDIwXSwgWzEwLCAyMF0sIFsxMCwgMjBdLCBbMTAsIDIwXV0sIFt0YWxsUGFnZSwgc2hvcnRQYWdlLCB0YWxsUGFnZSwgc2hvcnRQYWdlXSwgW1sxMCwgNTBdLCBbMTAsIDUwXSwgWzEwLCA1MF0sIFsxMCwgNTBdXSwgW1sxMCwgMjBdLCBbMTAsIDIwXSwgWzEwLCAyMF0sIFsxMCwgMjBdXV0pOworICAgICAgICBjb25zdCBic1Jlc3VsdCA9IDQ7CisgICAgICAgIGV4cGVjdCgoMCwgX3VpX3V0aWxzLmJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cykoYnNSZXN1bHQsIHBhZ2VzLCB0b3AyKSkudG9FcXVhbCg0KTsKKyAgICAgIH0pOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIm1vdmVUb0VuZE9mQXJyYXkiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoIndvcmtzIG9uIGVtcHR5IGFycmF5cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGRhdGEgPSBbXTsKKyAgICAgICgwLCBfdWlfdXRpbHMubW92ZVRvRW5kT2ZBcnJheSkoZGF0YSwgZnVuY3Rpb24gKCkge30pOworICAgICAgZXhwZWN0KGRhdGEpLnRvRXF1YWwoW10pOworICAgIH0pOworICAgIGl0KCJ3b3JrcyB3aGVuIG1vdmluZyBldmVyeXRoaW5nIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgZGF0YSA9IFsxLCAyLCAzLCA0LCA1XTsKKyAgICAgICgwLCBfdWlfdXRpbHMubW92ZVRvRW5kT2ZBcnJheSkoZGF0YSwgZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0pOworICAgICAgZXhwZWN0KGRhdGEpLnRvRXF1YWwoWzEsIDIsIDMsIDQsIDVdKTsKKyAgICB9KTsKKyAgICBpdCgid29ya3Mgd2hlbiBtb3Zpbmcgc29tZSB0aGluZ3MiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBkYXRhID0gWzEsIDIsIDMsIDQsIDVdOworICAgICAgKDAsIF91aV91dGlscy5tb3ZlVG9FbmRPZkFycmF5KShkYXRhLCBmdW5jdGlvbiAoeCkgeworICAgICAgICByZXR1cm4geCAlIDIgPT09IDA7CisgICAgICB9KTsKKyAgICAgIGV4cGVjdChkYXRhKS50b0VxdWFsKFsxLCAzLCA1LCAyLCA0XSk7CisgICAgfSk7CisgICAgaXQoIndvcmtzIHdoZW4gbW92aW5nIG9uZSB0aGluZyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IGRhdGEgPSBbMSwgMiwgMywgNCwgNV07CisgICAgICAoMCwgX3VpX3V0aWxzLm1vdmVUb0VuZE9mQXJyYXkpKGRhdGEsIGZ1bmN0aW9uICh4KSB7CisgICAgICAgIHJldHVybiB4ID09PSAxOworICAgICAgfSk7CisgICAgICBleHBlY3QoZGF0YSkudG9FcXVhbChbMiwgMywgNCwgNSwgMV0pOworICAgIH0pOworICAgIGl0KCJ3b3JrcyB3aGVuIG1vdmluZyBub3RoaW5nIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgZGF0YSA9IFsxLCAyLCAzLCA0LCA1XTsKKyAgICAgICgwLCBfdWlfdXRpbHMubW92ZVRvRW5kT2ZBcnJheSkoZGF0YSwgZnVuY3Rpb24gKHgpIHsKKyAgICAgICAgcmV0dXJuIHggPT09IDA7CisgICAgICB9KTsKKyAgICAgIGV4cGVjdChkYXRhKS50b0VxdWFsKFsxLCAyLCAzLCA0LCA1XSk7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC91bmljb2RlX3NwZWMuanMgYi9saWIvdGVzdC91bml0L3VuaWNvZGVfc3BlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDkyYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3QvdW5pdC91bmljb2RlX3NwZWMuanMKQEAgLTAsMCArMSwxMjEgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIF9nbHlwaGxpc3QgPSByZXF1aXJlKCIuLi8uLi9jb3JlL2dseXBobGlzdC5qcyIpOworCit2YXIgX3VuaWNvZGUgPSByZXF1aXJlKCIuLi8uLi9jb3JlL3VuaWNvZGUuanMiKTsKKworZGVzY3JpYmUoInVuaWNvZGUiLCBmdW5jdGlvbiAoKSB7CisgIGRlc2NyaWJlKCJtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIG5vdCByZS1tYXAgbm9ybWFsIFVuaWNvZGUgdmFsdWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdW5pY29kZS5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcykoMHgwMDQxKSkudG9FcXVhbCgweDAwNDEpOworICAgICAgZXhwZWN0KCgwLCBfdW5pY29kZS5tYXBTcGVjaWFsVW5pY29kZVZhbHVlcykoMHhmYjAxKSkudG9FcXVhbCgweGZiMDEpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgcmUtbWFwIHNwZWNpYWwgVW5pY29kZSB2YWx1ZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91bmljb2RlLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKSgweGY4ZTkpKS50b0VxdWFsKDB4MDBhOSk7CisgICAgICBleHBlY3QoKDAsIF91bmljb2RlLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKSgweGZmZmYpKS50b0VxdWFsKDApOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoImdldFVuaWNvZGVGb3JHbHlwaCIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgc3RhbmRhcmRNYXAsIGRpbmdiYXRzTWFwOworICAgIGJlZm9yZUFsbChmdW5jdGlvbiAoZG9uZSkgeworICAgICAgc3RhbmRhcmRNYXAgPSAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOworICAgICAgZGluZ2JhdHNNYXAgPSAoMCwgX2dseXBobGlzdC5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGUpKCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJBbGwoZnVuY3Rpb24gKCkgeworICAgICAgc3RhbmRhcmRNYXAgPSBkaW5nYmF0c01hcCA9IG51bGw7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBnZXQgVW5pY29kZSB2YWx1ZXMgZm9yIHZhbGlkIGdseXBoIG5hbWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKCJBIiwgc3RhbmRhcmRNYXApKS50b0VxdWFsKDB4MDA0MSk7CisgICAgICBleHBlY3QoKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkoImExIiwgZGluZ2JhdHNNYXApKS50b0VxdWFsKDB4MjcwMSk7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZWNvdmVyIFVuaWNvZGUgdmFsdWVzIGZyb20gdW5pWFhYWC91WFhYWHtYWH0gZ2x5cGggbmFtZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkoInVuaTAwNDEiLCBzdGFuZGFyZE1hcCkpLnRvRXF1YWwoMHgwMDQxKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKSgidTAwNDEiLCBzdGFuZGFyZE1hcCkpLnRvRXF1YWwoMHgwMDQxKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKSgidW5pMjcwMSIsIGRpbmdiYXRzTWFwKSkudG9FcXVhbCgweDI3MDEpOworICAgICAgZXhwZWN0KCgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKCJ1MjcwMSIsIGRpbmdiYXRzTWFwKSkudG9FcXVhbCgweDI3MDEpOworICAgIH0pOworICAgIGl0KCJzaG91bGQgbm90IGdldCBVbmljb2RlIHZhbHVlcyBmb3IgaW52YWxpZCBnbHlwaCBuYW1lcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKSgiUXdlcnR5Iiwgc3RhbmRhcmRNYXApKS50b0VxdWFsKC0xKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKSgiUXdlcnR5IiwgZGluZ2JhdHNNYXApKS50b0VxdWFsKC0xKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJnZXRVbmljb2RlUmFuZ2VGb3IiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBnZXQgY29ycmVjdCBVbmljb2RlIHJhbmdlIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdW5pY29kZS5nZXRVbmljb2RlUmFuZ2VGb3IpKDB4MDA0MSkpLnRvRXF1YWwoMCk7CisgICAgICBleHBlY3QoKDAsIF91bmljb2RlLmdldFVuaWNvZGVSYW5nZUZvcikoMHhmYjAxKSkudG9FcXVhbCg2Mik7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBub3QgZ2V0IGEgVW5pY29kZSByYW5nZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZVJhbmdlRm9yKSgweDA1ZmYpKS50b0VxdWFsKC0xKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJnZXROb3JtYWxpemVkVW5pY29kZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIE5vcm1hbGl6ZWRVbmljb2RlczsKKyAgICBiZWZvcmVBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIE5vcm1hbGl6ZWRVbmljb2RlcyA9ICgwLCBfdW5pY29kZS5nZXROb3JtYWxpemVkVW5pY29kZXMpKCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJBbGwoZnVuY3Rpb24gKCkgeworICAgICAgTm9ybWFsaXplZFVuaWNvZGVzID0gbnVsbDsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGdldCBub3JtYWxpemVkIFVuaWNvZGUgdmFsdWVzIGZvciBsaWdhdHVyZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoTm9ybWFsaXplZFVuaWNvZGVzWyJcdUZCMDEiXSkudG9FcXVhbCgiZmkiKTsKKyAgICAgIGV4cGVjdChOb3JtYWxpemVkVW5pY29kZXNbIlx1MDY3NSJdKS50b0VxdWFsKCJcdTA2MjdcdTA2NzQiKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIG5vdCBub3JtYWxpemUgc3RhbmRhcmQgY2hhcmFjdGVycyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChOb3JtYWxpemVkVW5pY29kZXMuQSkudG9FcXVhbCh1bmRlZmluZWQpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoInJldmVyc2VJZlJ0bCIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgTm9ybWFsaXplZFVuaWNvZGVzOworCisgICAgZnVuY3Rpb24gZ2V0R2x5cGhVbmljb2RlKGNoYXIpIHsKKyAgICAgIGlmIChOb3JtYWxpemVkVW5pY29kZXNbY2hhcl0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXR1cm4gTm9ybWFsaXplZFVuaWNvZGVzW2NoYXJdOworICAgICAgfQorCisgICAgICByZXR1cm4gY2hhcjsKKyAgICB9CisKKyAgICBiZWZvcmVBbGwoZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIE5vcm1hbGl6ZWRVbmljb2RlcyA9ICgwLCBfdW5pY29kZS5nZXROb3JtYWxpemVkVW5pY29kZXMpKCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgYWZ0ZXJBbGwoZnVuY3Rpb24gKCkgeworICAgICAgTm9ybWFsaXplZFVuaWNvZGVzID0gbnVsbDsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIG5vdCByZXZlcnNlIExUUiBjaGFyYWN0ZXJzIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIEEgPSBnZXRHbHlwaFVuaWNvZGUoIkEiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VuaWNvZGUucmV2ZXJzZUlmUnRsKShBKSkudG9FcXVhbCgiQSIpOworICAgICAgdmFyIGZpID0gZ2V0R2x5cGhVbmljb2RlKCJcdUZCMDEiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VuaWNvZGUucmV2ZXJzZUlmUnRsKShmaSkpLnRvRXF1YWwoImZpIik7CisgICAgfSk7CisgICAgaXQoInNob3VsZCByZXZlcnNlIFJUTCBjaGFyYWN0ZXJzIiwgZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGhlQWxlZiA9IGdldEdseXBoVW5pY29kZSgiXHUwNUQwIik7CisgICAgICBleHBlY3QoKDAsIF91bmljb2RlLnJldmVyc2VJZlJ0bCkoaGVBbGVmKSkudG9FcXVhbCgiXHUwNUQwIik7CisgICAgICB2YXIgYXJBbGVmID0gZ2V0R2x5cGhVbmljb2RlKCJcdTA2NzUiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3VuaWNvZGUucmV2ZXJzZUlmUnRsKShhckFsZWYpKS50b0VxdWFsKCJcdTA2NzRcdTA2MjciKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdGVzdC91bml0L3V0aWxfc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvdXRpbF9zcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjNhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdGVzdC91bml0L3V0aWxfc3BlYy5qcwpAQCAtMCwwICsxLDI0MiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvdXRpbC5qcyIpOworCitkZXNjcmliZSgidXRpbCIsIGZ1bmN0aW9uICgpIHsKKyAgZGVzY3JpYmUoImJ5dGVzVG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoImhhbmRsZXMgbm9uLWFycmF5IGFyZ3VtZW50cyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7CisgICAgICAgICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShudWxsKTsKKyAgICAgIH0pLnRvVGhyb3cobmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIikpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIGFycmF5IGFyZ3VtZW50cyB3aXRoIGEgbGVuZ3RoIG5vdCBleGNlZWRpbmcgdGhlIG1heGltdW0iLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKG5ldyBVaW50OEFycmF5KFtdKSkpLnRvRXF1YWwoIiIpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShuZXcgVWludDhBcnJheShbMTAyLCAxMTEsIDExMV0pKSkudG9FcXVhbCgiZm9vIik7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgYXJyYXkgYXJndW1lbnRzIHdpdGggYSBsZW5ndGggZXhjZWVkaW5nIHRoZSBtYXhpbXVtIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgbGVuZ3RoID0gMTAwMDA7CisgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgYnl0ZXNbaV0gPSAiYSIuY2hhckNvZGVBdCgwKTsKKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RyaW5nID0gQXJyYXkobGVuZ3RoICsgMSkuam9pbigiYSIpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShieXRlcykpLnRvRXF1YWwoc3RyaW5nKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJpc0FycmF5QnVmZmVyIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIGFycmF5IGJ1ZmZlciB2YWx1ZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKG5ldyBBcnJheUJ1ZmZlcigwKSkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKG5ldyBVaW50OEFycmF5KDApKSkudG9FcXVhbCh0cnVlKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBub24tYXJyYXkgYnVmZmVyIHZhbHVlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuaXNBcnJheUJ1ZmZlcikoInRydWUiKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKDEpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuaXNBcnJheUJ1ZmZlcikobnVsbCkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh1bmRlZmluZWQpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJpc0Jvb2wiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoImhhbmRsZXMgYm9vbGVhbiB2YWx1ZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzQm9vbCkodHJ1ZSkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzQm9vbCkoZmFsc2UpKS50b0VxdWFsKHRydWUpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIG5vbi1ib29sZWFuIHZhbHVlcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuaXNCb29sKSgidHJ1ZSIpKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuaXNCb29sKSgiZmFsc2UiKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzQm9vbCkoMSkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc0Jvb2wpKDApKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuaXNCb29sKShudWxsKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzQm9vbCkodW5kZWZpbmVkKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgiaXNOdW0iLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoImhhbmRsZXMgbnVtZXJpYyB2YWx1ZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzTnVtKSgxKSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuaXNOdW0pKDApKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc051bSkoLTEpKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc051bSkoMTAwMDAwMDAwMDAwMDAwMDAwMCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzTnVtKSgxMi4zNCkpLnRvRXF1YWwodHJ1ZSk7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgbm9uLW51bWVyaWMgdmFsdWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc051bSkoInRydWUiKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzTnVtKSh0cnVlKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzTnVtKShudWxsKSkudG9FcXVhbChmYWxzZSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzTnVtKSh1bmRlZmluZWQpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJpc1N0cmluZyIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiaGFuZGxlcyBzdHJpbmcgdmFsdWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc1N0cmluZykoImZvbyIpKS50b0VxdWFsKHRydWUpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc1N0cmluZykoIiIpKS50b0VxdWFsKHRydWUpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIG5vbi1zdHJpbmcgdmFsdWVzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc1N0cmluZykodHJ1ZSkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc1N0cmluZykoMSkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc1N0cmluZykobnVsbCkpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc1N0cmluZykodW5kZWZpbmVkKSkudG9FcXVhbChmYWxzZSk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgic3RyaW5nMzIiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoImNvbnZlcnRzIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycyB0byBzdHJpbmdzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5zdHJpbmczMikoMHg3NDcyNzU2NSkpLnRvRXF1YWwoInRydWUiKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuc3RyaW5nMzIpKDB4NzQ3OTcwMzEpKS50b0VxdWFsKCJ0eXAxIik7CisgICAgICBleHBlY3QoKDAsIF91dGlsLnN0cmluZzMyKSgweDRmNTQ1NDRmKSkudG9FcXVhbCgiT1RUTyIpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoInN0cmluZ1RvQnl0ZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoImhhbmRsZXMgbm9uLXN0cmluZyBhcmd1bWVudHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoZnVuY3Rpb24gKCkgeworICAgICAgICAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykobnVsbCk7CisgICAgICB9KS50b1Rocm93KG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBzdHJpbmcgYXJndW1lbnRzIiwgZnVuY3Rpb24gKCkgeworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSgiIikpLnRvRXF1YWwobmV3IFVpbnQ4QXJyYXkoW10pKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoImZvbyIpKS50b0VxdWFsKG5ldyBVaW50OEFycmF5KFsxMDIsIDExMSwgMTExXSkpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoInN0cmluZ1RvUERGU3RyaW5nIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIElTTyBMYXRpbiAxIHN0cmluZ3MiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBzdHIgPSAiXHg4RHN0cmluZ1x4OEUiOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoc3RyKSkudG9FcXVhbCgiXHUyMDFDc3RyaW5nXHUyMDFEIik7CisgICAgfSk7CisgICAgaXQoImhhbmRsZXMgVVRGLTE2IGJpZy1lbmRpYW4gc3RyaW5ncyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHN0ciA9ICJceEZFXHhGRlx4MDBceDczXHgwMFx4NzRceDAwXHg3Mlx4MDBceDY5XHgwMFx4NkVceDAwXHg2NyI7CisgICAgICBleHBlY3QoKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShzdHIpKS50b0VxdWFsKCJzdHJpbmciKTsKKyAgICB9KTsKKyAgICBpdCgiaGFuZGxlcyBVVEYtMTYgbGl0dGxlLWVuZGlhbiBzdHJpbmdzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgc3RyID0gIlx4RkZceEZFXHg3M1x4MDBceDc0XHgwMFx4NzJceDAwXHg2OVx4MDBceDZFXHgwMFx4NjdceDAwIjsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHN0cikpLnRvRXF1YWwoInN0cmluZyIpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIGVtcHR5IHN0cmluZ3MiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBzdHIxID0gIiI7CisgICAgICBleHBlY3QoKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShzdHIxKSkudG9FcXVhbCgiIik7CisgICAgICBjb25zdCBzdHIyID0gIlx4RkVceEZGIjsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHN0cjIpKS50b0VxdWFsKCIiKTsKKyAgICAgIGNvbnN0IHN0cjMgPSAiXHhGRlx4RkUiOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoc3RyMykpLnRvRXF1YWwoIiIpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoInJlbW92ZU51bGxDaGFyYWN0ZXJzIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgbm90IG1vZGlmeSBzdHJpbmcgd2l0aG91dCBudWxsIGNoYXJhY3RlcnMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBzdHIgPSAic3RyaW5nIHdpdGhvdXQgbnVsbCBjaGFycyI7CisgICAgICBleHBlY3QoKDAsIF91dGlsLnJlbW92ZU51bGxDaGFyYWN0ZXJzKShzdHIpKS50b0VxdWFsKCJzdHJpbmcgd2l0aG91dCBudWxsIGNoYXJzIik7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBtb2RpZnkgc3RyaW5nIHdpdGggbnVsbCBjaGFyYWN0ZXJzIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3Qgc3RyID0gInN0cmluZ1x4MDBXaXRoXHgwME51bGxceDAwQ2hhcnMiOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5yZW1vdmVOdWxsQ2hhcmFjdGVycykoc3RyKSkudG9FcXVhbCgic3RyaW5nV2l0aE51bGxDaGFycyIpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlJlYWRhYmxlU3RyZWFtIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcmV0dXJuIGFuIE9iamVjdCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFJlYWRhYmxlU3RyZWFtKCk7CisgICAgICBleHBlY3QodHlwZW9mIHJlYWRhYmxlKS50b0VxdWFsKCJvYmplY3QiKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIGhhdmUgcHJvcGVydHkgZ2V0UmVhZGVyIiwgZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgUmVhZGFibGVTdHJlYW0oKTsKKyAgICAgIGV4cGVjdCh0eXBlb2YgcmVhZGFibGUuZ2V0UmVhZGVyKS50b0VxdWFsKCJmdW5jdGlvbiIpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoIlVSTCIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgic2hvdWxkIHJldHVybiBhbiBPYmplY3QiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCJodHRwczovL2V4YW1wbGUuY29tIik7CisgICAgICBleHBlY3QodHlwZW9mIHVybCkudG9FcXVhbCgib2JqZWN0Iik7CisgICAgfSk7CisgICAgaXQoInNob3VsZCBoYXZlIHByb3BlcnR5IGBocmVmYCIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoImh0dHBzOi8vZXhhbXBsZS5jb20iKTsKKyAgICAgIGV4cGVjdCh0eXBlb2YgdXJsLmhyZWYpLnRvRXF1YWwoInN0cmluZyIpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoImlzU2FtZU9yaWdpbiIsIGZ1bmN0aW9uICgpIHsKKyAgICBpdCgiaGFuZGxlcyBpbnZhbGlkIGJhc2UgVVJMcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuaXNTYW1lT3JpZ2luKSgiL2ZvbyIsICIvYmFyIikpLnRvRXF1YWwoZmFsc2UpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5pc1NhbWVPcmlnaW4pKCJibG9iOmZvbyIsICIvYmFyIikpLnRvRXF1YWwoZmFsc2UpOworICAgIH0pOworICAgIGl0KCJjb3JyZWN0bHkgY2hlY2tzIGlmIHRoZSBvcmlnaW4gb2YgYm90aCBVUkxzIG1hdGNoZXMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmlzU2FtZU9yaWdpbikoImh0dHBzOi8vd3d3Lm1vemlsbGEub3JnL2ZvbyIsICJodHRwczovL3d3dy5tb3ppbGxhLm9yZy9iYXIiKSkudG9FcXVhbCh0cnVlKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuaXNTYW1lT3JpZ2luKSgiaHR0cHM6Ly93d3cubW96aWxsYS5vcmcvZm9vIiwgImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2JhciIpKS50b0VxdWFsKGZhbHNlKTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJjcmVhdGVWYWxpZEFic29sdXRlVXJsIiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJoYW5kbGVzIGludmFsaWQgVVJMcyIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodW5kZWZpbmVkLCB1bmRlZmluZWQpKS50b0VxdWFsKG51bGwpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsKShudWxsLCBudWxsKSkudG9FcXVhbChudWxsKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkoIi9mb28iLCAiL2JhciIpKS50b0VxdWFsKG51bGwpOworICAgIH0pOworICAgIGl0KCJoYW5kbGVzIFVSTHMgdGhhdCBkbyBub3QgdXNlIGFuIGFsbG93ZWQgcHJvdG9jb2wiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKCJtYWduZXQ6P2ZvbyIsIG51bGwpKS50b0VxdWFsKG51bGwpOworICAgIH0pOworICAgIGl0KCJjb3JyZWN0bHkgY3JlYXRlcyBhIHZhbGlkIFVSTCBmb3IgYWxsb3dlZCBwcm90b2NvbHMiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKCJodHRwOi8vd3d3Lm1vemlsbGEub3JnL2ZvbyIsIG51bGwpKS50b0VxdWFsKG5ldyBVUkwoImh0dHA6Ly93d3cubW96aWxsYS5vcmcvZm9vIikpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSgiL2ZvbyIsICJodHRwOi8vd3d3Lm1vemlsbGEub3JnIikpLnRvRXF1YWwobmV3IFVSTCgiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9mb28iKSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKCJodHRwczovL3d3dy5tb3ppbGxhLm9yZy9mb28iLCBudWxsKSkudG9FcXVhbChuZXcgVVJMKCJodHRwczovL3d3dy5tb3ppbGxhLm9yZy9mb28iKSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKCIvZm9vIiwgImh0dHBzOi8vd3d3Lm1vemlsbGEub3JnIikpLnRvRXF1YWwobmV3IFVSTCgiaHR0cHM6Ly93d3cubW96aWxsYS5vcmcvZm9vIikpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSgiZnRwOi8vd3d3Lm1vemlsbGEub3JnL2ZvbyIsIG51bGwpKS50b0VxdWFsKG5ldyBVUkwoImZ0cDovL3d3dy5tb3ppbGxhLm9yZy9mb28iKSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKCIvZm9vIiwgImZ0cDovL3d3dy5tb3ppbGxhLm9yZyIpKS50b0VxdWFsKG5ldyBVUkwoImZ0cDovL3d3dy5tb3ppbGxhLm9yZy9mb28iKSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKCJtYWlsdG86Zm9vQGJhci5iYXoiLCBudWxsKSkudG9FcXVhbChuZXcgVVJMKCJtYWlsdG86Zm9vQGJhci5iYXoiKSk7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKCIvZm9vIiwgIm1haWx0bzpmb29AYmFyLmJheiIpKS50b0VxdWFsKG51bGwpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSgidGVsOiswMTIzNDU2Nzg5IiwgbnVsbCkpLnRvRXF1YWwobmV3IFVSTCgidGVsOiswMTIzNDU2Nzg5IikpOworICAgICAgZXhwZWN0KCgwLCBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSgiL2ZvbyIsICJ0ZWw6MDEyMzQ1Njc4OSIpKS50b0VxdWFsKG51bGwpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoImNyZWF0ZVByb21pc2VDYXBhYmlsaXR5IiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgcmVzb2x2ZSB3aXRoIGNvcnJlY3QgZGF0YSIsIGZ1bmN0aW9uIChkb25lKSB7CisgICAgICBjb25zdCBwcm9taXNlQ2FwYWJpbGl0eSA9ICgwLCBfdXRpbC5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIGV4cGVjdChwcm9taXNlQ2FwYWJpbGl0eS5zZXR0bGVkKS50b0VxdWFsKGZhbHNlKTsKKyAgICAgIHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUoeworICAgICAgICB0ZXN0OiAiYWJjIgorICAgICAgfSk7CisgICAgICBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZXhwZWN0KHByb21pc2VDYXBhYmlsaXR5LnNldHRsZWQpLnRvRXF1YWwodHJ1ZSk7CisgICAgICAgIGV4cGVjdChkYXRhKS50b0VxdWFsKHsKKyAgICAgICAgICB0ZXN0OiAiYWJjIgorICAgICAgICB9KTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwgZG9uZS5mYWlsKTsKKyAgICB9KTsKKyAgICBpdCgic2hvdWxkIHJlamVjdCB3aXRoIGNvcnJlY3QgcmVhc29uIiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IHByb21pc2VDYXBhYmlsaXR5ID0gKDAsIF91dGlsLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgZXhwZWN0KHByb21pc2VDYXBhYmlsaXR5LnNldHRsZWQpLnRvRXF1YWwoZmFsc2UpOworICAgICAgcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcigicmVhc29uIikpOworICAgICAgcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKGRvbmUuZmFpbCwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICBleHBlY3QocHJvbWlzZUNhcGFiaWxpdHkuc2V0dGxlZCkudG9FcXVhbCh0cnVlKTsKKyAgICAgICAgZXhwZWN0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKS50b0VxdWFsKHRydWUpOworICAgICAgICBleHBlY3QocmVhc29uLm1lc3NhZ2UpLnRvRXF1YWwoInJlYXNvbiIpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfSk7CisgIGRlc2NyaWJlKCJlc2NhcGVTdHJpbmciLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBlc2NhcGUgKCwgKSBhbmQgXFwiLCBmdW5jdGlvbiAoKSB7CisgICAgICBleHBlY3QoKDAsIF91dGlsLmVzY2FwZVN0cmluZykoIigoYVxcYSkpKGIoYlxcYiliKSIpKS50b0VxdWFsKCJcXChcXChhXFxcXGFcXClcXClcXChiXFwoYlxcXFxiXFwpYlxcKSIpOworICAgIH0pOworICB9KTsKKyAgZGVzY3JpYmUoImdldE1vZGlmaWNhdGlvbkRhdGUiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCBnZXQgYSBjb3JyZWN0bHkgZm9ybWF0dGVkIGRhdGUiLCBmdW5jdGlvbiAoKSB7CisgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoMzE0MSwgNSwgOSwgMiwgNiwgNTMpKTsKKyAgICAgIGV4cGVjdCgoMCwgX3V0aWwuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoZGF0ZSkpLnRvRXF1YWwoIjMxNDEwNjEwMDIwNjUzIik7CisgICAgfSk7CisgIH0pOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3Rlc3QvdW5pdC93cml0ZXJfc3BlYy5qcyBiL2xpYi90ZXN0L3VuaXQvd3JpdGVyX3NwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzNDUzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXN0L3VuaXQvd3JpdGVyX3NwZWMuanMKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCit2YXIgX3ByaW1pdGl2ZXMgPSByZXF1aXJlKCIuLi8uLi9jb3JlL3ByaW1pdGl2ZXMuanMiKTsKKwordmFyIF93cml0ZXIgPSByZXF1aXJlKCIuLi8uLi9jb3JlL3dyaXRlci5qcyIpOworCit2YXIgX3V0aWwgPSByZXF1aXJlKCIuLi8uLi9zaGFyZWQvdXRpbC5qcyIpOworCit2YXIgX3N0cmVhbSA9IHJlcXVpcmUoIi4uLy4uL2NvcmUvc3RyZWFtLmpzIik7CisKK2Rlc2NyaWJlKCJXcml0ZXIiLCBmdW5jdGlvbiAoKSB7CisgIGRlc2NyaWJlKCJJbmNyZW1lbnRhbCB1cGRhdGUiLCBmdW5jdGlvbiAoKSB7CisgICAgaXQoInNob3VsZCB1cGRhdGUgYSBmaWxlIHdpdGggbmV3IG9iamVjdHMiLCBmdW5jdGlvbiAoZG9uZSkgeworICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhID0gbmV3IFVpbnQ4QXJyYXkoKTsKKyAgICAgIGNvbnN0IG5ld1JlZnMgPSBbeworICAgICAgICByZWY6IF9wcmltaXRpdmVzLlJlZi5nZXQoMTIzLCAweDJkKSwKKyAgICAgICAgZGF0YTogImFiY1xuIgorICAgICAgfSwgeworICAgICAgICByZWY6IF9wcmltaXRpdmVzLlJlZi5nZXQoNDU2LCAweDRlKSwKKyAgICAgICAgZGF0YTogImRlZmdcbiIKKyAgICAgIH1dOworICAgICAgY29uc3QgeHJlZkluZm8gPSB7CisgICAgICAgIG5ld1JlZjogX3ByaW1pdGl2ZXMuUmVmLmdldCg3ODksIDApLAorICAgICAgICBzdGFydFhSZWY6IDMxNCwKKyAgICAgICAgZmlsZUlkczogWyJpZCIsICIiXSwKKyAgICAgICAgcm9vdFJlZjogbnVsbCwKKyAgICAgICAgaW5mb1JlZjogbnVsbCwKKyAgICAgICAgZW5jcnlwdDogbnVsbCwKKyAgICAgICAgZmlsZW5hbWU6ICJmb28ucGRmIiwKKyAgICAgICAgaW5mbzoge30KKyAgICAgIH07CisgICAgICBsZXQgZGF0YSA9ICgwLCBfd3JpdGVyLmluY3JlbWVudGFsVXBkYXRlKShvcmlnaW5hbERhdGEsIHhyZWZJbmZvLCBuZXdSZWZzKTsKKyAgICAgIGRhdGEgPSAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZGF0YSk7CisgICAgICBjb25zdCBleHBlY3RlZCA9ICJcbmFiY1xuIiArICJkZWZnXG4iICsgIjc4OSAwIG9ialxuIiArICI8PCAvU2l6ZSA3OTAgL1ByZXYgMzE0IC9UeXBlIC9YUmVmIC9JbmRleCBbMCAxIDEyMyAxIDQ1NiAxIDc4OSAxXSAiICsgIi9JRCBbKGlkKSAoXHgwMSNFZ1x4ODlceGFiXHhjZFx4ZWZceGZlXHhkY1x4YmFceDk4dlQyXHgxMCldICIgKyAiL1cgWzEgMSAyXSAvTGVuZ3RoIDE2Pj4gc3RyZWFtXG4iICsgIlx4MDBceDAxXHhmZlx4ZmYiICsgIlx4MDFceDAxXHgwMFx4MmQiICsgIlx4MDFceDA1XHgwMFx4NGUiICsgIlx4MDFceDBhXHgwMFx4MDBcbiIgKyAiZW5kc3RyZWFtXG4iICsgImVuZG9ialxuIiArICJzdGFydHhyZWZcbiIgKyAiMTBcbiIgKyAiJSVFT0ZcbiI7CisgICAgICBleHBlY3QoZGF0YSkudG9FcXVhbChleHBlY3RlZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBkZXNjcmliZSgid3JpdGVEaWN0IiwgZnVuY3Rpb24gKCkgeworICAgIGl0KCJzaG91bGQgd3JpdGUgYSBEaWN0IiwgZnVuY3Rpb24gKGRvbmUpIHsKKyAgICAgIGNvbnN0IGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChudWxsKTsKKyAgICAgIGRpY3Quc2V0KCJBIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkIiKSk7CisgICAgICBkaWN0LnNldCgiQiIsIF9wcmltaXRpdmVzLlJlZi5nZXQoMTIzLCA0NTYpKTsKKyAgICAgIGRpY3Quc2V0KCJDIiwgNzg5KTsKKyAgICAgIGRpY3Quc2V0KCJEIiwgImhlbGxvIHdvcmxkIik7CisgICAgICBkaWN0LnNldCgiRSIsICIoaGVsbG9cXHdvcmxkKSIpOworICAgICAgZGljdC5zZXQoIkYiLCBbMS4yMzAwMSwgNC41MDAwMSwgNl0pOworICAgICAgY29uc3QgZ2RpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChudWxsKTsKKyAgICAgIGdkaWN0LnNldCgiSCIsIDEyMy4wMDAwMSk7CisgICAgICBjb25zdCBzdHJpbmcgPSAiYSBzdHJlYW0iOworICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHN0cmluZyk7CisgICAgICBzdHJlYW0uZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KG51bGwpOworICAgICAgc3RyZWFtLmRpY3Quc2V0KCJMZW5ndGgiLCBzdHJpbmcubGVuZ3RoKTsKKyAgICAgIGdkaWN0LnNldCgiSSIsIHN0cmVhbSk7CisgICAgICBkaWN0LnNldCgiRyIsIGdkaWN0KTsKKyAgICAgIGNvbnN0IGJ1ZmZlciA9IFtdOworICAgICAgKDAsIF93cml0ZXIud3JpdGVEaWN0KShkaWN0LCBidWZmZXIsIG51bGwpOworICAgICAgY29uc3QgZXhwZWN0ZWQgPSAiPDwgL0EgL0IgL0IgMTIzIDQ1NiBSIC9DIDc4OSAvRCAoaGVsbG8gd29ybGQpICIgKyAiL0UgKFxcKGhlbGxvXFxcXHdvcmxkXFwpKSAvRiBbMS4yMyA0LjUgNl0gIiArICIvRyA8PCAvSCAxMjMgL0kgPDwgL0xlbmd0aCA4Pj4gc3RyZWFtXG4iICsgImEgc3RyZWFtXG4iICsgImVuZHN0cmVhbVxuPj4+PiI7CisgICAgICBleHBlY3QoYnVmZmVyLmpvaW4oIiIpKS50b0VxdWFsKGV4cGVjdGVkKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlci5qcyBiL2xpYi93ZWIvYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNzg5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlci5qcwpAQCAtMCwwICsxLDEzMCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRGVmYXVsdEFubm90YXRpb25MYXllckZhY3RvcnkgPSBleHBvcnRzLkFubm90YXRpb25MYXllckJ1aWxkZXIgPSB2b2lkIDA7CisKK3ZhciBfcGRmID0gcmVxdWlyZSgiLi4vcGRmIik7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK3ZhciBfcGRmX2xpbmtfc2VydmljZSA9IHJlcXVpcmUoIi4vcGRmX2xpbmtfc2VydmljZS5qcyIpOworCitjbGFzcyBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyIHsKKyAgY29uc3RydWN0b3IoeworICAgIHBhZ2VEaXYsCisgICAgcGRmUGFnZSwKKyAgICBsaW5rU2VydmljZSwKKyAgICBkb3dubG9hZE1hbmFnZXIsCisgICAgYW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsLAorICAgIGltYWdlUmVzb3VyY2VzUGF0aCA9ICIiLAorICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSB0cnVlLAorICAgIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4KKyAgfSkgeworICAgIHRoaXMucGFnZURpdiA9IHBhZ2VEaXY7CisgICAgdGhpcy5wZGZQYWdlID0gcGRmUGFnZTsKKyAgICB0aGlzLmxpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7CisgICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBkb3dubG9hZE1hbmFnZXI7CisgICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBpbWFnZVJlc291cmNlc1BhdGg7CisgICAgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gcmVuZGVySW50ZXJhY3RpdmVGb3JtczsKKyAgICB0aGlzLmwxMG4gPSBsMTBuOworICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSBhbm5vdGF0aW9uU3RvcmFnZTsKKyAgICB0aGlzLmRpdiA9IG51bGw7CisgICAgdGhpcy5fY2FuY2VsbGVkID0gZmFsc2U7CisgIH0KKworICByZW5kZXIodmlld3BvcnQsIGludGVudCA9ICJkaXNwbGF5IikgeworICAgIHJldHVybiB0aGlzLnBkZlBhZ2UuZ2V0QW5ub3RhdGlvbnMoeworICAgICAgaW50ZW50CisgICAgfSkudGhlbihhbm5vdGF0aW9ucyA9PiB7CisgICAgICBpZiAodGhpcy5fY2FuY2VsbGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7CisgICAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydC5jbG9uZSh7CisgICAgICAgICAgZG9udEZsaXA6IHRydWUKKyAgICAgICAgfSksCisgICAgICAgIGRpdjogdGhpcy5kaXYsCisgICAgICAgIGFubm90YXRpb25zLAorICAgICAgICBwYWdlOiB0aGlzLnBkZlBhZ2UsCisgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogdGhpcy5pbWFnZVJlc291cmNlc1BhdGgsCisgICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgICAgbGlua1NlcnZpY2U6IHRoaXMubGlua1NlcnZpY2UsCisgICAgICAgIGRvd25sb2FkTWFuYWdlcjogdGhpcy5kb3dubG9hZE1hbmFnZXIsCisgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiB0aGlzLmFubm90YXRpb25TdG9yYWdlCisgICAgICB9OworCisgICAgICBpZiAodGhpcy5kaXYpIHsKKyAgICAgICAgX3BkZi5Bbm5vdGF0aW9uTGF5ZXIudXBkYXRlKHBhcmFtZXRlcnMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgICAgdGhpcy5kaXYuY2xhc3NOYW1lID0gImFubm90YXRpb25MYXllciI7CisgICAgICAgIHRoaXMucGFnZURpdi5hcHBlbmRDaGlsZCh0aGlzLmRpdik7CisgICAgICAgIHBhcmFtZXRlcnMuZGl2ID0gdGhpcy5kaXY7CisKKyAgICAgICAgX3BkZi5Bbm5vdGF0aW9uTGF5ZXIucmVuZGVyKHBhcmFtZXRlcnMpOworCisgICAgICAgIHRoaXMubDEwbi50cmFuc2xhdGUodGhpcy5kaXYpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgY2FuY2VsKCkgeworICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7CisgIH0KKworICBoaWRlKCkgeworICAgIGlmICghdGhpcy5kaXYpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsICJ0cnVlIik7CisgIH0KKworfQorCitleHBvcnRzLkFubm90YXRpb25MYXllckJ1aWxkZXIgPSBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyOworCitjbGFzcyBEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSB7CisgIGNyZWF0ZUFubm90YXRpb25MYXllckJ1aWxkZXIocGFnZURpdiwgcGRmUGFnZSwgYW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsLCBpbWFnZVJlc291cmNlc1BhdGggPSAiIiwgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IHRydWUsIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4pIHsKKyAgICByZXR1cm4gbmV3IEFubm90YXRpb25MYXllckJ1aWxkZXIoeworICAgICAgcGFnZURpdiwKKyAgICAgIHBkZlBhZ2UsCisgICAgICBpbWFnZVJlc291cmNlc1BhdGgsCisgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgbGlua1NlcnZpY2U6IG5ldyBfcGRmX2xpbmtfc2VydmljZS5TaW1wbGVMaW5rU2VydmljZSgpLAorICAgICAgbDEwbiwKKyAgICAgIGFubm90YXRpb25TdG9yYWdlCisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLkRlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5ID0gRGVmYXVsdEFubm90YXRpb25MYXllckZhY3Rvcnk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9hcHAuanMgYi9saWIvd2ViL2FwcC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjBlMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9hcHAuanMKQEAgLTAsMCArMSwyNzE2IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZQcmludFNlcnZpY2VGYWN0b3J5ID0gZXhwb3J0cy5EZWZhdWx0RXh0ZXJuYWxTZXJ2aWNlcyA9IGV4cG9ydHMuUERGVmlld2VyQXBwbGljYXRpb24gPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK3ZhciBfYXBwX29wdGlvbnMgPSByZXF1aXJlKCIuL2FwcF9vcHRpb25zLmpzIik7CisKK3ZhciBfcGRmID0gcmVxdWlyZSgiLi4vcGRmIik7CisKK3ZhciBfcGRmX2N1cnNvcl90b29scyA9IHJlcXVpcmUoIi4vcGRmX2N1cnNvcl90b29scy5qcyIpOworCit2YXIgX3BkZl9yZW5kZXJpbmdfcXVldWUgPSByZXF1aXJlKCIuL3BkZl9yZW5kZXJpbmdfcXVldWUuanMiKTsKKwordmFyIF9wZGZfc2lkZWJhciA9IHJlcXVpcmUoIi4vcGRmX3NpZGViYXIuanMiKTsKKwordmFyIF9vdmVybGF5X21hbmFnZXIgPSByZXF1aXJlKCIuL292ZXJsYXlfbWFuYWdlci5qcyIpOworCit2YXIgX3Bhc3N3b3JkX3Byb21wdCA9IHJlcXVpcmUoIi4vcGFzc3dvcmRfcHJvbXB0LmpzIik7CisKK3ZhciBfcGRmX2F0dGFjaG1lbnRfdmlld2VyID0gcmVxdWlyZSgiLi9wZGZfYXR0YWNobWVudF92aWV3ZXIuanMiKTsKKwordmFyIF9wZGZfZG9jdW1lbnRfcHJvcGVydGllcyA9IHJlcXVpcmUoIi4vcGRmX2RvY3VtZW50X3Byb3BlcnRpZXMuanMiKTsKKwordmFyIF9wZGZfZmluZF9iYXIgPSByZXF1aXJlKCIuL3BkZl9maW5kX2Jhci5qcyIpOworCit2YXIgX3BkZl9maW5kX2NvbnRyb2xsZXIgPSByZXF1aXJlKCIuL3BkZl9maW5kX2NvbnRyb2xsZXIuanMiKTsKKwordmFyIF9wZGZfaGlzdG9yeSA9IHJlcXVpcmUoIi4vcGRmX2hpc3RvcnkuanMiKTsKKwordmFyIF9wZGZfbGF5ZXJfdmlld2VyID0gcmVxdWlyZSgiLi9wZGZfbGF5ZXJfdmlld2VyLmpzIik7CisKK3ZhciBfcGRmX2xpbmtfc2VydmljZSA9IHJlcXVpcmUoIi4vcGRmX2xpbmtfc2VydmljZS5qcyIpOworCit2YXIgX3BkZl9vdXRsaW5lX3ZpZXdlciA9IHJlcXVpcmUoIi4vcGRmX291dGxpbmVfdmlld2VyLmpzIik7CisKK3ZhciBfcGRmX3ByZXNlbnRhdGlvbl9tb2RlID0gcmVxdWlyZSgiLi9wZGZfcHJlc2VudGF0aW9uX21vZGUuanMiKTsKKwordmFyIF9wZGZfc2lkZWJhcl9yZXNpemVyID0gcmVxdWlyZSgiLi9wZGZfc2lkZWJhcl9yZXNpemVyLmpzIik7CisKK3ZhciBfcGRmX3RodW1ibmFpbF92aWV3ZXIgPSByZXF1aXJlKCIuL3BkZl90aHVtYm5haWxfdmlld2VyLmpzIik7CisKK3ZhciBfcGRmX3ZpZXdlciA9IHJlcXVpcmUoIi4vcGRmX3ZpZXdlci5qcyIpOworCit2YXIgX3NlY29uZGFyeV90b29sYmFyID0gcmVxdWlyZSgiLi9zZWNvbmRhcnlfdG9vbGJhci5qcyIpOworCit2YXIgX3Rvb2xiYXIgPSByZXF1aXJlKCIuL3Rvb2xiYXIuanMiKTsKKwordmFyIF92aWV3ZXJfY29tcGF0aWJpbGl0eSA9IHJlcXVpcmUoIi4vdmlld2VyX2NvbXBhdGliaWxpdHkuanMiKTsKKwordmFyIF92aWV3X2hpc3RvcnkgPSByZXF1aXJlKCIuL3ZpZXdfaGlzdG9yeS5qcyIpOworCitjb25zdCBERUZBVUxUX1NDQUxFX0RFTFRBID0gMS4xOworY29uc3QgRElTQUJMRV9BVVRPX0ZFVENIX0xPQURJTkdfQkFSX1RJTUVPVVQgPSA1MDAwOworY29uc3QgRk9SQ0VfUEFHRVNfTE9BREVEX1RJTUVPVVQgPSAxMDAwMDsKK2NvbnN0IFdIRUVMX1pPT01fRElTQUJMRURfVElNRU9VVCA9IDEwMDA7Citjb25zdCBFTkFCTEVfUEVSTUlTU0lPTlNfQ0xBU1MgPSAiZW5hYmxlUGVybWlzc2lvbnMiOworY29uc3QgVmlld09uTG9hZCA9IHsKKyAgVU5LTk9XTjogLTEsCisgIFBSRVZJT1VTOiAwLAorICBJTklUSUFMOiAxCit9OworY29uc3QgS05PV05fVkVSU0lPTlMgPSBbIjEuMCIsICIxLjEiLCAiMS4yIiwgIjEuMyIsICIxLjQiLCAiMS41IiwgIjEuNiIsICIxLjciLCAiMS44IiwgIjEuOSIsICIyLjAiLCAiMi4xIiwgIjIuMiIsICIyLjMiXTsKK2NvbnN0IEtOT1dOX0dFTkVSQVRPUlMgPSBbImFjcm9iYXQgZGlzdGlsbGVyIiwgImFjcm9iYXQgcGRmd3JpdGVyIiwgImFkb2JlIGxpdmVjeWNsZSIsICJhZG9iZSBwZGYgbGlicmFyeSIsICJhZG9iZSBwaG90b3Nob3AiLCAiZ2hvc3RzY3JpcHQiLCAidGNwZGYiLCAiY2Fpcm8iLCAiZHZpcGRmbSIsICJkdmlwcyIsICJwZGZ0ZXgiLCAicGRma2l0IiwgIml0ZXh0IiwgInByaW5jZSIsICJxdWFya3hwcmVzcyIsICJtYWMgb3MgeCIsICJtaWNyb3NvZnQiLCAib3Blbm9mZmljZSIsICJvcmFjbGUiLCAibHVyYWRvY3VtZW50IiwgInBkZi14Y2hhbmdlIiwgImFudGVubmEgaG91c2UiLCAiYXNwb3NlLmNlbGxzIiwgImZwZGYiXTsKKworY2xhc3MgRGVmYXVsdEV4dGVybmFsU2VydmljZXMgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbml0aWFsaXplIERlZmF1bHRFeHRlcm5hbFNlcnZpY2VzLiIpOworICB9CisKKyAgc3RhdGljIHVwZGF0ZUZpbmRDb250cm9sU3RhdGUoZGF0YSkge30KKworICBzdGF0aWMgdXBkYXRlRmluZE1hdGNoZXNDb3VudChkYXRhKSB7fQorCisgIHN0YXRpYyBpbml0UGFzc2l2ZUxvYWRpbmcoY2FsbGJhY2tzKSB7fQorCisgIHN0YXRpYyBmYWxsYmFjayhkYXRhLCBjYWxsYmFjaykge30KKworICBzdGF0aWMgcmVwb3J0VGVsZW1ldHJ5KGRhdGEpIHt9CisKKyAgc3RhdGljIGNyZWF0ZURvd25sb2FkTWFuYWdlcihvcHRpb25zKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IGNyZWF0ZURvd25sb2FkTWFuYWdlciIpOworICB9CisKKyAgc3RhdGljIGNyZWF0ZVByZWZlcmVuY2VzKCkgeworICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBjcmVhdGVQcmVmZXJlbmNlcyIpOworICB9CisKKyAgc3RhdGljIGNyZWF0ZUwxMG4ob3B0aW9ucykgeworICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBjcmVhdGVMMTBuIik7CisgIH0KKworICBzdGF0aWMgZ2V0IHN1cHBvcnRzSW50ZWdyYXRlZEZpbmQoKSB7CisgICAgcmV0dXJuICgwLCBfcGRmLnNoYWRvdykodGhpcywgInN1cHBvcnRzSW50ZWdyYXRlZEZpbmQiLCBmYWxzZSk7CisgIH0KKworICBzdGF0aWMgZ2V0IHN1cHBvcnRzRG9jdW1lbnRGb250cygpIHsKKyAgICByZXR1cm4gKDAsIF9wZGYuc2hhZG93KSh0aGlzLCAic3VwcG9ydHNEb2N1bWVudEZvbnRzIiwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgZ2V0IHN1cHBvcnRlZE1vdXNlV2hlZWxab29tTW9kaWZpZXJLZXlzKCkgeworICAgIHJldHVybiAoMCwgX3BkZi5zaGFkb3cpKHRoaXMsICJzdXBwb3J0ZWRNb3VzZVdoZWVsWm9vbU1vZGlmaWVyS2V5cyIsIHsKKyAgICAgIGN0cmxLZXk6IHRydWUsCisgICAgICBtZXRhS2V5OiB0cnVlCisgICAgfSk7CisgIH0KKworICBzdGF0aWMgZ2V0IGlzSW5BdXRvbWF0aW9uKCkgeworICAgIHJldHVybiAoMCwgX3BkZi5zaGFkb3cpKHRoaXMsICJpc0luQXV0b21hdGlvbiIsIGZhbHNlKTsKKyAgfQorCit9CisKK2V4cG9ydHMuRGVmYXVsdEV4dGVybmFsU2VydmljZXMgPSBEZWZhdWx0RXh0ZXJuYWxTZXJ2aWNlczsKK2NvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uID0geworICBpbml0aWFsQm9va21hcms6IGRvY3VtZW50LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpLAorICBfaW5pdGlhbGl6ZWRDYXBhYmlsaXR5OiAoMCwgX3BkZi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKSwKKyAgZmVsbGJhY2s6IGZhbHNlLAorICBhcHBDb25maWc6IG51bGwsCisgIHBkZkRvY3VtZW50OiBudWxsLAorICBwZGZMb2FkaW5nVGFzazogbnVsbCwKKyAgcHJpbnRTZXJ2aWNlOiBudWxsLAorICBwZGZWaWV3ZXI6IG51bGwsCisgIHBkZlRodW1ibmFpbFZpZXdlcjogbnVsbCwKKyAgcGRmUmVuZGVyaW5nUXVldWU6IG51bGwsCisgIHBkZlByZXNlbnRhdGlvbk1vZGU6IG51bGwsCisgIHBkZkRvY3VtZW50UHJvcGVydGllczogbnVsbCwKKyAgcGRmTGlua1NlcnZpY2U6IG51bGwsCisgIHBkZkhpc3Rvcnk6IG51bGwsCisgIHBkZlNpZGViYXI6IG51bGwsCisgIHBkZlNpZGViYXJSZXNpemVyOiBudWxsLAorICBwZGZPdXRsaW5lVmlld2VyOiBudWxsLAorICBwZGZBdHRhY2htZW50Vmlld2VyOiBudWxsLAorICBwZGZMYXllclZpZXdlcjogbnVsbCwKKyAgcGRmQ3Vyc29yVG9vbHM6IG51bGwsCisgIHN0b3JlOiBudWxsLAorICBkb3dubG9hZE1hbmFnZXI6IG51bGwsCisgIG92ZXJsYXlNYW5hZ2VyOiBudWxsLAorICBwcmVmZXJlbmNlczogbnVsbCwKKyAgdG9vbGJhcjogbnVsbCwKKyAgc2Vjb25kYXJ5VG9vbGJhcjogbnVsbCwKKyAgZXZlbnRCdXM6IG51bGwsCisgIGwxMG46IG51bGwsCisgIGlzSW5pdGlhbFZpZXdTZXQ6IGZhbHNlLAorICBkb3dubG9hZENvbXBsZXRlOiBmYWxzZSwKKyAgaXNWaWV3ZXJFbWJlZGRlZDogd2luZG93LnBhcmVudCAhPT0gd2luZG93LAorICB1cmw6ICIiLAorICBiYXNlVXJsOiAiIiwKKyAgZXh0ZXJuYWxTZXJ2aWNlczogRGVmYXVsdEV4dGVybmFsU2VydmljZXMsCisgIF9ib3VuZEV2ZW50czoge30sCisgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOiBudWxsLAorICB0cmlnZ2VyRGVsYXllZEZhbGxiYWNrOiBudWxsLAorICBfc2F2ZUluUHJvZ3Jlc3M6IGZhbHNlLAorICBfd2hlZWxVbnVzZWRUaWNrczogMCwKKworICBhc3luYyBpbml0aWFsaXplKGFwcENvbmZpZykgeworICAgIHRoaXMucHJlZmVyZW5jZXMgPSB0aGlzLmV4dGVybmFsU2VydmljZXMuY3JlYXRlUHJlZmVyZW5jZXMoKTsKKyAgICB0aGlzLmFwcENvbmZpZyA9IGFwcENvbmZpZzsKKyAgICBhd2FpdCB0aGlzLl9yZWFkUHJlZmVyZW5jZXMoKTsKKyAgICBhd2FpdCB0aGlzLl9wYXJzZUhhc2hQYXJhbWV0ZXJzKCk7CisgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZUwxMG4oKTsKKworICAgIGlmICh0aGlzLmlzVmlld2VyRW1iZWRkZWQgJiYgX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJleHRlcm5hbExpbmtUYXJnZXQiKSA9PT0gX3BkZi5MaW5rVGFyZ2V0Lk5PTkUpIHsKKyAgICAgIF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLnNldCgiZXh0ZXJuYWxMaW5rVGFyZ2V0IiwgX3BkZi5MaW5rVGFyZ2V0LlRPUCk7CisgICAgfQorCisgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZVZpZXdlckNvbXBvbmVudHMoKTsKKyAgICB0aGlzLmJpbmRFdmVudHMoKTsKKyAgICB0aGlzLmJpbmRXaW5kb3dFdmVudHMoKTsKKyAgICBjb25zdCBhcHBDb250YWluZXIgPSBhcHBDb25maWcuYXBwQ29udGFpbmVyIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICB0aGlzLmwxMG4udHJhbnNsYXRlKGFwcENvbnRhaW5lcikudGhlbigoKSA9PiB7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJsb2NhbGl6ZWQiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcworICAgICAgfSk7CisgICAgfSk7CisKKyAgICB0aGlzLl9pbml0aWFsaXplZENhcGFiaWxpdHkucmVzb2x2ZSgpOworICB9LAorCisgIGFzeW5jIF9yZWFkUHJlZmVyZW5jZXMoKSB7CisgICAgaWYgKF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLmdldCgiZGlzYWJsZVByZWZlcmVuY2VzIikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgY29uc3QgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZlcmVuY2VzLmdldEFsbCgpOworCisgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcHJlZnMpIHsKKyAgICAgICAgX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuc2V0KG5hbWUsIHByZWZzW25hbWVdKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChyZWFzb24pIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoYF9yZWFkUHJlZmVyZW5jZXM6ICIke3JlYXNvbi5tZXNzYWdlfSIuYCk7CisgICAgfQorICB9LAorCisgIGFzeW5jIF9wYXJzZUhhc2hQYXJhbWV0ZXJzKCkgeworICAgIGlmICghX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJwZGZCdWdFbmFibGVkIikpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgY29uc3QgaGFzaCA9IGRvY3VtZW50LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpOworCisgICAgaWYgKCFoYXNoKSB7CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIGNvbnN0IGhhc2hQYXJhbXMgPSAoMCwgX3VpX3V0aWxzLnBhcnNlUXVlcnlTdHJpbmcpKGhhc2gpLAorICAgICAgICAgIHdhaXRPbiA9IFtdOworCisgICAgaWYgKCJkaXNhYmxld29ya2VyIiBpbiBoYXNoUGFyYW1zICYmIGhhc2hQYXJhbXMuZGlzYWJsZXdvcmtlciA9PT0gInRydWUiKSB7CisgICAgICB3YWl0T24ucHVzaChsb2FkRmFrZVdvcmtlcigpKTsKKyAgICB9CisKKyAgICBpZiAoImRpc2FibGVyYW5nZSIgaW4gaGFzaFBhcmFtcykgeworICAgICAgX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuc2V0KCJkaXNhYmxlUmFuZ2UiLCBoYXNoUGFyYW1zLmRpc2FibGVyYW5nZSA9PT0gInRydWUiKTsKKyAgICB9CisKKyAgICBpZiAoImRpc2FibGVzdHJlYW0iIGluIGhhc2hQYXJhbXMpIHsKKyAgICAgIF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLnNldCgiZGlzYWJsZVN0cmVhbSIsIGhhc2hQYXJhbXMuZGlzYWJsZXN0cmVhbSA9PT0gInRydWUiKTsKKyAgICB9CisKKyAgICBpZiAoImRpc2FibGVhdXRvZmV0Y2giIGluIGhhc2hQYXJhbXMpIHsKKyAgICAgIF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLnNldCgiZGlzYWJsZUF1dG9GZXRjaCIsIGhhc2hQYXJhbXMuZGlzYWJsZWF1dG9mZXRjaCA9PT0gInRydWUiKTsKKyAgICB9CisKKyAgICBpZiAoImRpc2FibGVmb250ZmFjZSIgaW4gaGFzaFBhcmFtcykgeworICAgICAgX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuc2V0KCJkaXNhYmxlRm9udEZhY2UiLCBoYXNoUGFyYW1zLmRpc2FibGVmb250ZmFjZSA9PT0gInRydWUiKTsKKyAgICB9CisKKyAgICBpZiAoImRpc2FibGVoaXN0b3J5IiBpbiBoYXNoUGFyYW1zKSB7CisgICAgICBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5zZXQoImRpc2FibGVIaXN0b3J5IiwgaGFzaFBhcmFtcy5kaXNhYmxlaGlzdG9yeSA9PT0gInRydWUiKTsKKyAgICB9CisKKyAgICBpZiAoIndlYmdsIiBpbiBoYXNoUGFyYW1zKSB7CisgICAgICBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5zZXQoImVuYWJsZVdlYkdMIiwgaGFzaFBhcmFtcy53ZWJnbCA9PT0gInRydWUiKTsKKyAgICB9CisKKyAgICBpZiAoInZlcmJvc2l0eSIgaW4gaGFzaFBhcmFtcykgeworICAgICAgX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuc2V0KCJ2ZXJib3NpdHkiLCBoYXNoUGFyYW1zLnZlcmJvc2l0eSB8IDApOworICAgIH0KKworICAgIGlmICgidGV4dGxheWVyIiBpbiBoYXNoUGFyYW1zKSB7CisgICAgICBzd2l0Y2ggKGhhc2hQYXJhbXMudGV4dGxheWVyKSB7CisgICAgICAgIGNhc2UgIm9mZiI6CisgICAgICAgICAgX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuc2V0KCJ0ZXh0TGF5ZXJNb2RlIiwgX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRElTQUJMRSk7CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJ2aXNpYmxlIjoKKyAgICAgICAgY2FzZSAic2hhZG93IjoKKyAgICAgICAgY2FzZSAiaG92ZXIiOgorICAgICAgICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuYXBwQ29uZmlnLnZpZXdlckNvbnRhaW5lcjsKKyAgICAgICAgICB2aWV3ZXIuY2xhc3NMaXN0LmFkZCgidGV4dExheWVyLSIgKyBoYXNoUGFyYW1zLnRleHRsYXllcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCJwZGZidWciIGluIGhhc2hQYXJhbXMpIHsKKyAgICAgIF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLnNldCgicGRmQnVnIiwgdHJ1ZSk7CisKKyAgICAgIF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLnNldCgiZm9udEV4dHJhUHJvcGVydGllcyIsIHRydWUpOworCisgICAgICBjb25zdCBlbmFibGVkID0gaGFzaFBhcmFtcy5wZGZidWcuc3BsaXQoIiwiKTsKKyAgICAgIHdhaXRPbi5wdXNoKGxvYWRBbmRFbmFibGVQREZCdWcoZW5hYmxlZCkpOworICAgIH0KKworICAgIGlmICgibG9jYWxlIiBpbiBoYXNoUGFyYW1zKSB7CisgICAgICBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5zZXQoImxvY2FsZSIsIGhhc2hQYXJhbXMubG9jYWxlKTsKKyAgICB9CisKKyAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKS5jYXRjaChyZWFzb24gPT4geworICAgICAgY29uc29sZS5lcnJvcihgX3BhcnNlSGFzaFBhcmFtZXRlcnM6ICIke3JlYXNvbi5tZXNzYWdlfSIuYCk7CisgICAgfSk7CisgIH0sCisKKyAgYXN5bmMgX2luaXRpYWxpemVMMTBuKCkgeworICAgIHRoaXMubDEwbiA9IHRoaXMuZXh0ZXJuYWxTZXJ2aWNlcy5jcmVhdGVMMTBuKHsKKyAgICAgIGxvY2FsZTogX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJsb2NhbGUiKQorICAgIH0pOworICAgIGNvbnN0IGRpciA9IGF3YWl0IHRoaXMubDEwbi5nZXREaXJlY3Rpb24oKTsKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaHRtbCIpWzBdLmRpciA9IGRpcjsKKyAgfSwKKworICBhc3luYyBfaW5pdGlhbGl6ZVZpZXdlckNvbXBvbmVudHMoKSB7CisgICAgY29uc3QgYXBwQ29uZmlnID0gdGhpcy5hcHBDb25maWc7CisgICAgY29uc3QgZXZlbnRCdXMgPSBhcHBDb25maWcuZXZlbnRCdXMgfHwgbmV3IF91aV91dGlscy5FdmVudEJ1cyh7CisgICAgICBpc0luQXV0b21hdGlvbjogdGhpcy5leHRlcm5hbFNlcnZpY2VzLmlzSW5BdXRvbWF0aW9uCisgICAgfSk7CisgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOworICAgIHRoaXMub3ZlcmxheU1hbmFnZXIgPSBuZXcgX292ZXJsYXlfbWFuYWdlci5PdmVybGF5TWFuYWdlcigpOworICAgIGNvbnN0IHBkZlJlbmRlcmluZ1F1ZXVlID0gbmV3IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlBERlJlbmRlcmluZ1F1ZXVlKCk7CisgICAgcGRmUmVuZGVyaW5nUXVldWUub25JZGxlID0gdGhpcy5jbGVhbnVwLmJpbmQodGhpcyk7CisgICAgdGhpcy5wZGZSZW5kZXJpbmdRdWV1ZSA9IHBkZlJlbmRlcmluZ1F1ZXVlOworICAgIGNvbnN0IHBkZkxpbmtTZXJ2aWNlID0gbmV3IF9wZGZfbGlua19zZXJ2aWNlLlBERkxpbmtTZXJ2aWNlKHsKKyAgICAgIGV2ZW50QnVzLAorICAgICAgZXh0ZXJuYWxMaW5rVGFyZ2V0OiBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoImV4dGVybmFsTGlua1RhcmdldCIpLAorICAgICAgZXh0ZXJuYWxMaW5rUmVsOiBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoImV4dGVybmFsTGlua1JlbCIpLAorICAgICAgaWdub3JlRGVzdGluYXRpb25ab29tOiBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoImlnbm9yZURlc3RpbmF0aW9uWm9vbSIpCisgICAgfSk7CisgICAgdGhpcy5wZGZMaW5rU2VydmljZSA9IHBkZkxpbmtTZXJ2aWNlOworICAgIGNvbnN0IGRvd25sb2FkTWFuYWdlciA9IHRoaXMuZXh0ZXJuYWxTZXJ2aWNlcy5jcmVhdGVEb3dubG9hZE1hbmFnZXIoKTsKKyAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IGRvd25sb2FkTWFuYWdlcjsKKyAgICBjb25zdCBmaW5kQ29udHJvbGxlciA9IG5ldyBfcGRmX2ZpbmRfY29udHJvbGxlci5QREZGaW5kQ29udHJvbGxlcih7CisgICAgICBsaW5rU2VydmljZTogcGRmTGlua1NlcnZpY2UsCisgICAgICBldmVudEJ1cworICAgIH0pOworICAgIHRoaXMuZmluZENvbnRyb2xsZXIgPSBmaW5kQ29udHJvbGxlcjsKKyAgICBjb25zdCBjb250YWluZXIgPSBhcHBDb25maWcubWFpbkNvbnRhaW5lcjsKKyAgICBjb25zdCB2aWV3ZXIgPSBhcHBDb25maWcudmlld2VyQ29udGFpbmVyOworICAgIHRoaXMucGRmVmlld2VyID0gbmV3IF9wZGZfdmlld2VyLlBERlZpZXdlcih7CisgICAgICBjb250YWluZXIsCisgICAgICB2aWV3ZXIsCisgICAgICBldmVudEJ1cywKKyAgICAgIHJlbmRlcmluZ1F1ZXVlOiBwZGZSZW5kZXJpbmdRdWV1ZSwKKyAgICAgIGxpbmtTZXJ2aWNlOiBwZGZMaW5rU2VydmljZSwKKyAgICAgIGRvd25sb2FkTWFuYWdlciwKKyAgICAgIGZpbmRDb250cm9sbGVyLAorICAgICAgcmVuZGVyZXI6IF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLmdldCgicmVuZGVyZXIiKSwKKyAgICAgIGVuYWJsZVdlYkdMOiBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoImVuYWJsZVdlYkdMIiksCisgICAgICBsMTBuOiB0aGlzLmwxMG4sCisgICAgICB0ZXh0TGF5ZXJNb2RlOiBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoInRleHRMYXllck1vZGUiKSwKKyAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJpbWFnZVJlc291cmNlc1BhdGgiKSwKKyAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLmdldCgicmVuZGVySW50ZXJhY3RpdmVGb3JtcyIpLAorICAgICAgZW5hYmxlUHJpbnRBdXRvUm90YXRlOiBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoImVuYWJsZVByaW50QXV0b1JvdGF0ZSIpLAorICAgICAgdXNlT25seUNzc1pvb206IF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLmdldCgidXNlT25seUNzc1pvb20iKSwKKyAgICAgIG1heENhbnZhc1BpeGVsczogX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJtYXhDYW52YXNQaXhlbHMiKQorICAgIH0pOworICAgIHBkZlJlbmRlcmluZ1F1ZXVlLnNldFZpZXdlcih0aGlzLnBkZlZpZXdlcik7CisgICAgcGRmTGlua1NlcnZpY2Uuc2V0Vmlld2VyKHRoaXMucGRmVmlld2VyKTsKKyAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlciA9IG5ldyBfcGRmX3RodW1ibmFpbF92aWV3ZXIuUERGVGh1bWJuYWlsVmlld2VyKHsKKyAgICAgIGNvbnRhaW5lcjogYXBwQ29uZmlnLnNpZGViYXIudGh1bWJuYWlsVmlldywKKyAgICAgIGV2ZW50QnVzLAorICAgICAgcmVuZGVyaW5nUXVldWU6IHBkZlJlbmRlcmluZ1F1ZXVlLAorICAgICAgbGlua1NlcnZpY2U6IHBkZkxpbmtTZXJ2aWNlLAorICAgICAgbDEwbjogdGhpcy5sMTBuCisgICAgfSk7CisgICAgcGRmUmVuZGVyaW5nUXVldWUuc2V0VGh1bWJuYWlsVmlld2VyKHRoaXMucGRmVGh1bWJuYWlsVmlld2VyKTsKKyAgICB0aGlzLnBkZkhpc3RvcnkgPSBuZXcgX3BkZl9oaXN0b3J5LlBERkhpc3RvcnkoeworICAgICAgbGlua1NlcnZpY2U6IHBkZkxpbmtTZXJ2aWNlLAorICAgICAgZXZlbnRCdXMKKyAgICB9KTsKKyAgICBwZGZMaW5rU2VydmljZS5zZXRIaXN0b3J5KHRoaXMucGRmSGlzdG9yeSk7CisKKyAgICBpZiAoIXRoaXMuc3VwcG9ydHNJbnRlZ3JhdGVkRmluZCkgeworICAgICAgdGhpcy5maW5kQmFyID0gbmV3IF9wZGZfZmluZF9iYXIuUERGRmluZEJhcihhcHBDb25maWcuZmluZEJhciwgZXZlbnRCdXMsIHRoaXMubDEwbik7CisgICAgfQorCisgICAgdGhpcy5wZGZEb2N1bWVudFByb3BlcnRpZXMgPSBuZXcgX3BkZl9kb2N1bWVudF9wcm9wZXJ0aWVzLlBERkRvY3VtZW50UHJvcGVydGllcyhhcHBDb25maWcuZG9jdW1lbnRQcm9wZXJ0aWVzLCB0aGlzLm92ZXJsYXlNYW5hZ2VyLCBldmVudEJ1cywgdGhpcy5sMTBuKTsKKyAgICB0aGlzLnBkZkN1cnNvclRvb2xzID0gbmV3IF9wZGZfY3Vyc29yX3Rvb2xzLlBERkN1cnNvclRvb2xzKHsKKyAgICAgIGNvbnRhaW5lciwKKyAgICAgIGV2ZW50QnVzLAorICAgICAgY3Vyc29yVG9vbE9uTG9hZDogX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJjdXJzb3JUb29sT25Mb2FkIikKKyAgICB9KTsKKyAgICB0aGlzLnRvb2xiYXIgPSBuZXcgX3Rvb2xiYXIuVG9vbGJhcihhcHBDb25maWcudG9vbGJhciwgZXZlbnRCdXMsIHRoaXMubDEwbik7CisgICAgdGhpcy5zZWNvbmRhcnlUb29sYmFyID0gbmV3IF9zZWNvbmRhcnlfdG9vbGJhci5TZWNvbmRhcnlUb29sYmFyKGFwcENvbmZpZy5zZWNvbmRhcnlUb29sYmFyLCBjb250YWluZXIsIGV2ZW50QnVzKTsKKworICAgIGlmICh0aGlzLnN1cHBvcnRzRnVsbHNjcmVlbikgeworICAgICAgdGhpcy5wZGZQcmVzZW50YXRpb25Nb2RlID0gbmV3IF9wZGZfcHJlc2VudGF0aW9uX21vZGUuUERGUHJlc2VudGF0aW9uTW9kZSh7CisgICAgICAgIGNvbnRhaW5lciwKKyAgICAgICAgcGRmVmlld2VyOiB0aGlzLnBkZlZpZXdlciwKKyAgICAgICAgZXZlbnRCdXMsCisgICAgICAgIGNvbnRleHRNZW51SXRlbXM6IGFwcENvbmZpZy5mdWxsc2NyZWVuCisgICAgICB9KTsKKyAgICB9CisKKyAgICB0aGlzLnBhc3N3b3JkUHJvbXB0ID0gbmV3IF9wYXNzd29yZF9wcm9tcHQuUGFzc3dvcmRQcm9tcHQoYXBwQ29uZmlnLnBhc3N3b3JkT3ZlcmxheSwgdGhpcy5vdmVybGF5TWFuYWdlciwgdGhpcy5sMTBuKTsKKyAgICB0aGlzLnBkZk91dGxpbmVWaWV3ZXIgPSBuZXcgX3BkZl9vdXRsaW5lX3ZpZXdlci5QREZPdXRsaW5lVmlld2VyKHsKKyAgICAgIGNvbnRhaW5lcjogYXBwQ29uZmlnLnNpZGViYXIub3V0bGluZVZpZXcsCisgICAgICBldmVudEJ1cywKKyAgICAgIGxpbmtTZXJ2aWNlOiBwZGZMaW5rU2VydmljZQorICAgIH0pOworICAgIHRoaXMucGRmQXR0YWNobWVudFZpZXdlciA9IG5ldyBfcGRmX2F0dGFjaG1lbnRfdmlld2VyLlBERkF0dGFjaG1lbnRWaWV3ZXIoeworICAgICAgY29udGFpbmVyOiBhcHBDb25maWcuc2lkZWJhci5hdHRhY2htZW50c1ZpZXcsCisgICAgICBldmVudEJ1cywKKyAgICAgIGRvd25sb2FkTWFuYWdlcgorICAgIH0pOworICAgIHRoaXMucGRmTGF5ZXJWaWV3ZXIgPSBuZXcgX3BkZl9sYXllcl92aWV3ZXIuUERGTGF5ZXJWaWV3ZXIoeworICAgICAgY29udGFpbmVyOiBhcHBDb25maWcuc2lkZWJhci5sYXllcnNWaWV3LAorICAgICAgZXZlbnRCdXMsCisgICAgICBsMTBuOiB0aGlzLmwxMG4KKyAgICB9KTsKKyAgICB0aGlzLnBkZlNpZGViYXIgPSBuZXcgX3BkZl9zaWRlYmFyLlBERlNpZGViYXIoeworICAgICAgZWxlbWVudHM6IGFwcENvbmZpZy5zaWRlYmFyLAorICAgICAgcGRmVmlld2VyOiB0aGlzLnBkZlZpZXdlciwKKyAgICAgIHBkZlRodW1ibmFpbFZpZXdlcjogdGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIsCisgICAgICBldmVudEJ1cywKKyAgICAgIGwxMG46IHRoaXMubDEwbgorICAgIH0pOworICAgIHRoaXMucGRmU2lkZWJhci5vblRvZ2dsZWQgPSB0aGlzLmZvcmNlUmVuZGVyaW5nLmJpbmQodGhpcyk7CisgICAgdGhpcy5wZGZTaWRlYmFyUmVzaXplciA9IG5ldyBfcGRmX3NpZGViYXJfcmVzaXplci5QREZTaWRlYmFyUmVzaXplcihhcHBDb25maWcuc2lkZWJhclJlc2l6ZXIsIGV2ZW50QnVzLCB0aGlzLmwxMG4pOworICB9LAorCisgIHJ1bihjb25maWcpIHsKKyAgICB0aGlzLmluaXRpYWxpemUoY29uZmlnKS50aGVuKHdlYlZpZXdlckluaXRpYWxpemVkKTsKKyAgfSwKKworICBnZXQgaW5pdGlhbGl6ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkQ2FwYWJpbGl0eS5zZXR0bGVkOworICB9LAorCisgIGdldCBpbml0aWFsaXplZFByb21pc2UoKSB7CisgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkQ2FwYWJpbGl0eS5wcm9taXNlOworICB9LAorCisgIHpvb21Jbih0aWNrcykgeworICAgIGlmICh0aGlzLnBkZlZpZXdlci5pc0luUHJlc2VudGF0aW9uTW9kZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxldCBuZXdTY2FsZSA9IHRoaXMucGRmVmlld2VyLmN1cnJlbnRTY2FsZTsKKworICAgIGRvIHsKKyAgICAgIG5ld1NjYWxlID0gKG5ld1NjYWxlICogREVGQVVMVF9TQ0FMRV9ERUxUQSkudG9GaXhlZCgyKTsKKyAgICAgIG5ld1NjYWxlID0gTWF0aC5jZWlsKG5ld1NjYWxlICogMTApIC8gMTA7CisgICAgICBuZXdTY2FsZSA9IE1hdGgubWluKF91aV91dGlscy5NQVhfU0NBTEUsIG5ld1NjYWxlKTsKKyAgICB9IHdoaWxlICgtLXRpY2tzID4gMCAmJiBuZXdTY2FsZSA8IF91aV91dGlscy5NQVhfU0NBTEUpOworCisgICAgdGhpcy5wZGZWaWV3ZXIuY3VycmVudFNjYWxlVmFsdWUgPSBuZXdTY2FsZTsKKyAgfSwKKworICB6b29tT3V0KHRpY2tzKSB7CisgICAgaWYgKHRoaXMucGRmVmlld2VyLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IG5ld1NjYWxlID0gdGhpcy5wZGZWaWV3ZXIuY3VycmVudFNjYWxlOworCisgICAgZG8geworICAgICAgbmV3U2NhbGUgPSAobmV3U2NhbGUgLyBERUZBVUxUX1NDQUxFX0RFTFRBKS50b0ZpeGVkKDIpOworICAgICAgbmV3U2NhbGUgPSBNYXRoLmZsb29yKG5ld1NjYWxlICogMTApIC8gMTA7CisgICAgICBuZXdTY2FsZSA9IE1hdGgubWF4KF91aV91dGlscy5NSU5fU0NBTEUsIG5ld1NjYWxlKTsKKyAgICB9IHdoaWxlICgtLXRpY2tzID4gMCAmJiBuZXdTY2FsZSA+IF91aV91dGlscy5NSU5fU0NBTEUpOworCisgICAgdGhpcy5wZGZWaWV3ZXIuY3VycmVudFNjYWxlVmFsdWUgPSBuZXdTY2FsZTsKKyAgfSwKKworICB6b29tUmVzZXQoKSB7CisgICAgaWYgKHRoaXMucGRmVmlld2VyLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5wZGZWaWV3ZXIuY3VycmVudFNjYWxlVmFsdWUgPSBfdWlfdXRpbHMuREVGQVVMVF9TQ0FMRV9WQUxVRTsKKyAgfSwKKworICBnZXQgcGFnZXNDb3VudCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgOiAwOworICB9LAorCisgIGdldCBwYWdlKCkgeworICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlcjsKKyAgfSwKKworICBzZXQgcGFnZSh2YWwpIHsKKyAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciA9IHZhbDsKKyAgfSwKKworICBnZXQgcHJpbnRpbmcoKSB7CisgICAgcmV0dXJuICEhdGhpcy5wcmludFNlcnZpY2U7CisgIH0sCisKKyAgZ2V0IHN1cHBvcnRzUHJpbnRpbmcoKSB7CisgICAgcmV0dXJuIFBERlByaW50U2VydmljZUZhY3RvcnkuaW5zdGFuY2Uuc3VwcG9ydHNQcmludGluZzsKKyAgfSwKKworICBnZXQgc3VwcG9ydHNGdWxsc2NyZWVuKCkgeworICAgIGxldCBzdXBwb3J0OworICAgIGNvbnN0IGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICBzdXBwb3J0ID0gISEoZG9jLnJlcXVlc3RGdWxsc2NyZWVuIHx8IGRvYy5tb3pSZXF1ZXN0RnVsbFNjcmVlbiB8fCBkb2Mud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4gfHwgZG9jLm1zUmVxdWVzdEZ1bGxzY3JlZW4pOworCisgICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkID09PSBmYWxzZSB8fCBkb2N1bWVudC5tb3pGdWxsU2NyZWVuRW5hYmxlZCA9PT0gZmFsc2UgfHwgZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVuYWJsZWQgPT09IGZhbHNlIHx8IGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVuYWJsZWQgPT09IGZhbHNlKSB7CisgICAgICBzdXBwb3J0ID0gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICgwLCBfcGRmLnNoYWRvdykodGhpcywgInN1cHBvcnRzRnVsbHNjcmVlbiIsIHN1cHBvcnQpOworICB9LAorCisgIGdldCBzdXBwb3J0c0ludGVncmF0ZWRGaW5kKCkgeworICAgIHJldHVybiB0aGlzLmV4dGVybmFsU2VydmljZXMuc3VwcG9ydHNJbnRlZ3JhdGVkRmluZDsKKyAgfSwKKworICBnZXQgc3VwcG9ydHNEb2N1bWVudEZvbnRzKCkgeworICAgIHJldHVybiB0aGlzLmV4dGVybmFsU2VydmljZXMuc3VwcG9ydHNEb2N1bWVudEZvbnRzOworICB9LAorCisgIGdldCBsb2FkaW5nQmFyKCkgeworICAgIGNvbnN0IGJhciA9IG5ldyBfdWlfdXRpbHMuUHJvZ3Jlc3NCYXIoIiNsb2FkaW5nQmFyIik7CisgICAgcmV0dXJuICgwLCBfcGRmLnNoYWRvdykodGhpcywgImxvYWRpbmdCYXIiLCBiYXIpOworICB9LAorCisgIGdldCBzdXBwb3J0ZWRNb3VzZVdoZWVsWm9vbU1vZGlmaWVyS2V5cygpIHsKKyAgICByZXR1cm4gdGhpcy5leHRlcm5hbFNlcnZpY2VzLnN1cHBvcnRlZE1vdXNlV2hlZWxab29tTW9kaWZpZXJLZXlzOworICB9LAorCisgIGluaXRQYXNzaXZlTG9hZGluZygpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogaW5pdFBhc3NpdmVMb2FkaW5nIik7CisgIH0sCisKKyAgc2V0VGl0bGVVc2luZ1VybCh1cmwgPSAiIikgeworICAgIHRoaXMudXJsID0gdXJsOworICAgIHRoaXMuYmFzZVVybCA9IHVybC5zcGxpdCgiIyIpWzBdOworICAgIGxldCB0aXRsZSA9ICgwLCBfdWlfdXRpbHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMKSh1cmwsICIiKTsKKworICAgIGlmICghdGl0bGUpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRpdGxlID0gZGVjb2RlVVJJQ29tcG9uZW50KCgwLCBfcGRmLmdldEZpbGVuYW1lRnJvbVVybCkodXJsKSkgfHwgdXJsOworICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgdGl0bGUgPSB1cmw7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5zZXRUaXRsZSh0aXRsZSk7CisgIH0sCisKKyAgc2V0VGl0bGUodGl0bGUpIHsKKyAgICBpZiAodGhpcy5pc1ZpZXdlckVtYmVkZGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG9jdW1lbnQudGl0bGUgPSB0aXRsZTsKKyAgfSwKKworICBhc3luYyBjbG9zZSgpIHsKKyAgICBjb25zdCBlcnJvcldyYXBwZXIgPSB0aGlzLmFwcENvbmZpZy5lcnJvcldyYXBwZXIuY29udGFpbmVyOworICAgIGVycm9yV3JhcHBlci5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsICJ0cnVlIik7CisKKyAgICBpZiAoIXRoaXMucGRmTG9hZGluZ1Rhc2spIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmTG9hZGluZ1Rhc2suZGVzdHJveSgpOworICAgIHRoaXMucGRmTG9hZGluZ1Rhc2sgPSBudWxsOworCisgICAgaWYgKHRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSBudWxsOworICAgICAgdGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIuc2V0RG9jdW1lbnQobnVsbCk7CisgICAgICB0aGlzLnBkZlZpZXdlci5zZXREb2N1bWVudChudWxsKTsKKyAgICAgIHRoaXMucGRmTGlua1NlcnZpY2Uuc2V0RG9jdW1lbnQobnVsbCk7CisgICAgICB0aGlzLnBkZkRvY3VtZW50UHJvcGVydGllcy5zZXREb2N1bWVudChudWxsKTsKKyAgICB9CisKKyAgICB3ZWJWaWV3ZXJSZXNldFBlcm1pc3Npb25zKCk7CisgICAgdGhpcy5zdG9yZSA9IG51bGw7CisgICAgdGhpcy5pc0luaXRpYWxWaWV3U2V0ID0gZmFsc2U7CisgICAgdGhpcy5kb3dubG9hZENvbXBsZXRlID0gZmFsc2U7CisgICAgdGhpcy51cmwgPSAiIjsKKyAgICB0aGlzLmJhc2VVcmwgPSAiIjsKKyAgICB0aGlzLmNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gbnVsbDsKKyAgICB0aGlzLnRyaWdnZXJEZWxheWVkRmFsbGJhY2sgPSBudWxsOworICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7CisgICAgdGhpcy5wZGZTaWRlYmFyLnJlc2V0KCk7CisgICAgdGhpcy5wZGZPdXRsaW5lVmlld2VyLnJlc2V0KCk7CisgICAgdGhpcy5wZGZBdHRhY2htZW50Vmlld2VyLnJlc2V0KCk7CisgICAgdGhpcy5wZGZMYXllclZpZXdlci5yZXNldCgpOworCisgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkgeworICAgICAgdGhpcy5wZGZIaXN0b3J5LnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuZmluZEJhcikgeworICAgICAgdGhpcy5maW5kQmFyLnJlc2V0KCk7CisgICAgfQorCisgICAgdGhpcy50b29sYmFyLnJlc2V0KCk7CisgICAgdGhpcy5zZWNvbmRhcnlUb29sYmFyLnJlc2V0KCk7CisKKyAgICBpZiAodHlwZW9mIFBERkJ1ZyAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIFBERkJ1Zy5jbGVhbnVwKCk7CisgICAgfQorCisgICAgcmV0dXJuIHByb21pc2U7CisgIH0sCisKKyAgYXN5bmMgb3BlbihmaWxlLCBhcmdzKSB7CisgICAgaWYgKHRoaXMucGRmTG9hZGluZ1Rhc2spIHsKKyAgICAgIGF3YWl0IHRoaXMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBjb25zdCB3b3JrZXJQYXJhbWV0ZXJzID0gX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0QWxsKF9hcHBfb3B0aW9ucy5PcHRpb25LaW5kLldPUktFUik7CisKKyAgICBmb3IgKGNvbnN0IGtleSBpbiB3b3JrZXJQYXJhbWV0ZXJzKSB7CisgICAgICBfcGRmLkdsb2JhbFdvcmtlck9wdGlvbnNba2V5XSA9IHdvcmtlclBhcmFtZXRlcnNba2V5XTsKKyAgICB9CisKKyAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gInN0cmluZyIpIHsKKyAgICAgIHRoaXMuc2V0VGl0bGVVc2luZ1VybChmaWxlKTsKKyAgICAgIHBhcmFtZXRlcnMudXJsID0gZmlsZTsKKyAgICB9IGVsc2UgaWYgKGZpbGUgJiYgImJ5dGVMZW5ndGgiIGluIGZpbGUpIHsKKyAgICAgIHBhcmFtZXRlcnMuZGF0YSA9IGZpbGU7CisgICAgfSBlbHNlIGlmIChmaWxlLnVybCAmJiBmaWxlLm9yaWdpbmFsVXJsKSB7CisgICAgICB0aGlzLnNldFRpdGxlVXNpbmdVcmwoZmlsZS5vcmlnaW5hbFVybCk7CisgICAgICBwYXJhbWV0ZXJzLnVybCA9IGZpbGUudXJsOworICAgIH0KKworICAgIGNvbnN0IGFwaVBhcmFtZXRlcnMgPSBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXRBbGwoX2FwcF9vcHRpb25zLk9wdGlvbktpbmQuQVBJKTsKKworICAgIGZvciAoY29uc3Qga2V5IGluIGFwaVBhcmFtZXRlcnMpIHsKKyAgICAgIGxldCB2YWx1ZSA9IGFwaVBhcmFtZXRlcnNba2V5XTsKKworICAgICAgaWYgKGtleSA9PT0gImRvY0Jhc2VVcmwiICYmICF2YWx1ZSkge30KKworICAgICAgcGFyYW1ldGVyc1trZXldID0gdmFsdWU7CisgICAgfQorCisgICAgaWYgKGFyZ3MpIHsKKyAgICAgIGZvciAoY29uc3Qga2V5IGluIGFyZ3MpIHsKKyAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW2tleV07CisKKyAgICAgICAgaWYgKGtleSA9PT0gImxlbmd0aCIpIHsKKyAgICAgICAgICB0aGlzLnBkZkRvY3VtZW50UHJvcGVydGllcy5zZXRGaWxlU2l6ZSh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBsb2FkaW5nVGFzayA9ICgwLCBfcGRmLmdldERvY3VtZW50KShwYXJhbWV0ZXJzKTsKKyAgICB0aGlzLnBkZkxvYWRpbmdUYXNrID0gbG9hZGluZ1Rhc2s7CisKKyAgICBsb2FkaW5nVGFzay5vblBhc3N3b3JkID0gKHVwZGF0ZUNhbGxiYWNrLCByZWFzb24pID0+IHsKKyAgICAgIHRoaXMucGRmTGlua1NlcnZpY2UuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IGZhbHNlOworICAgICAgdGhpcy5wYXNzd29yZFByb21wdC5zZXRVcGRhdGVDYWxsYmFjayh1cGRhdGVDYWxsYmFjaywgcmVhc29uKTsKKyAgICAgIHRoaXMucGFzc3dvcmRQcm9tcHQub3BlbigpOworICAgIH07CisKKyAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzID0gKHsKKyAgICAgIGxvYWRlZCwKKyAgICAgIHRvdGFsCisgICAgfSkgPT4geworICAgICAgdGhpcy5wcm9ncmVzcyhsb2FkZWQgLyB0b3RhbCk7CisgICAgfTsKKworICAgIGxvYWRpbmdUYXNrLm9uVW5zdXBwb3J0ZWRGZWF0dXJlID0gdGhpcy5mYWxsYmFjay5iaW5kKHRoaXMpOworICAgIHJldHVybiBsb2FkaW5nVGFzay5wcm9taXNlLnRoZW4ocGRmRG9jdW1lbnQgPT4geworICAgICAgdGhpcy5sb2FkKHBkZkRvY3VtZW50KTsKKyAgICB9LCBleGNlcHRpb24gPT4geworICAgICAgaWYgKGxvYWRpbmdUYXNrICE9PSB0aGlzLnBkZkxvYWRpbmdUYXNrKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlcHRpb24gJiYgZXhjZXB0aW9uLm1lc3NhZ2U7CisgICAgICBsZXQgbG9hZGluZ0Vycm9yTWVzc2FnZTsKKworICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIF9wZGYuSW52YWxpZFBERkV4Y2VwdGlvbikgeworICAgICAgICBsb2FkaW5nRXJyb3JNZXNzYWdlID0gdGhpcy5sMTBuLmdldCgiaW52YWxpZF9maWxlX2Vycm9yIiwgbnVsbCwgIkludmFsaWQgb3IgY29ycnVwdGVkIFBERiBmaWxlLiIpOworICAgICAgfSBlbHNlIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBfcGRmLk1pc3NpbmdQREZFeGNlcHRpb24pIHsKKyAgICAgICAgbG9hZGluZ0Vycm9yTWVzc2FnZSA9IHRoaXMubDEwbi5nZXQoIm1pc3NpbmdfZmlsZV9lcnJvciIsIG51bGwsICJNaXNzaW5nIFBERiBmaWxlLiIpOworICAgICAgfSBlbHNlIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBfcGRmLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbikgeworICAgICAgICBsb2FkaW5nRXJyb3JNZXNzYWdlID0gdGhpcy5sMTBuLmdldCgidW5leHBlY3RlZF9yZXNwb25zZV9lcnJvciIsIG51bGwsICJVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZS4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvYWRpbmdFcnJvck1lc3NhZ2UgPSB0aGlzLmwxMG4uZ2V0KCJsb2FkaW5nX2Vycm9yIiwgbnVsbCwgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIFBERi4iKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGxvYWRpbmdFcnJvck1lc3NhZ2UudGhlbihtc2cgPT4geworICAgICAgICB0aGlzLmVycm9yKG1zZywgeworICAgICAgICAgIG1lc3NhZ2UKKyAgICAgICAgfSk7CisgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICAgIH0pOworICAgIH0pOworICB9LAorCisgIGRvd25sb2FkKHsKKyAgICBzb3VyY2VFdmVudFR5cGUgPSAiZG93bmxvYWQiCisgIH0gPSB7fSkgeworICAgIGZ1bmN0aW9uIGRvd25sb2FkQnlVcmwoKSB7CisgICAgICBkb3dubG9hZE1hbmFnZXIuZG93bmxvYWRVcmwodXJsLCBmaWxlbmFtZSk7CisgICAgfQorCisgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlVXJsOworICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSB8fCAoMCwgX3VpX3V0aWxzLmdldFBERkZpbGVOYW1lRnJvbVVSTCkodGhpcy51cmwpOworICAgIGNvbnN0IGRvd25sb2FkTWFuYWdlciA9IHRoaXMuZG93bmxvYWRNYW5hZ2VyOworCisgICAgZG93bmxvYWRNYW5hZ2VyLm9uZXJyb3IgPSBlcnIgPT4geworICAgICAgdGhpcy5lcnJvcihgUERGIGZhaWxlZCB0byBkb3dubG9hZDogJHtlcnJ9YCk7CisgICAgfTsKKworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCB8fCAhdGhpcy5kb3dubG9hZENvbXBsZXRlKSB7CisgICAgICBkb3dubG9hZEJ5VXJsKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5wZGZEb2N1bWVudC5nZXREYXRhKCkudGhlbihmdW5jdGlvbiAoZGF0YSkgeworICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgICB0eXBlOiAiYXBwbGljYXRpb24vcGRmIgorICAgICAgfSk7CisgICAgICBkb3dubG9hZE1hbmFnZXIuZG93bmxvYWQoYmxvYiwgdXJsLCBmaWxlbmFtZSwgc291cmNlRXZlbnRUeXBlKTsKKyAgICB9KS5jYXRjaChkb3dubG9hZEJ5VXJsKTsKKyAgfSwKKworICBzYXZlKHsKKyAgICBzb3VyY2VFdmVudFR5cGUgPSAiZG93bmxvYWQiCisgIH0gPSB7fSkgeworICAgIGlmICh0aGlzLl9zYXZlSW5Qcm9ncmVzcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybDsKKyAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgfHwgKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKHRoaXMudXJsKTsKKyAgICBjb25zdCBkb3dubG9hZE1hbmFnZXIgPSB0aGlzLmRvd25sb2FkTWFuYWdlcjsKKworICAgIGRvd25sb2FkTWFuYWdlci5vbmVycm9yID0gZXJyID0+IHsKKyAgICAgIHRoaXMuZXJyb3IoYFBERiBmYWlsZWQgdG8gYmUgc2F2ZWQ6ICR7ZXJyfWApOworICAgIH07CisKKyAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQgfHwgIXRoaXMuZG93bmxvYWRDb21wbGV0ZSkgeworICAgICAgdGhpcy5kb3dubG9hZCh7CisgICAgICAgIHNvdXJjZUV2ZW50VHlwZQorICAgICAgfSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSB0cnVlOworICAgIHRoaXMucGRmRG9jdW1lbnQuc2F2ZURvY3VtZW50KHRoaXMucGRmRG9jdW1lbnQuYW5ub3RhdGlvblN0b3JhZ2UpLnRoZW4oZGF0YSA9PiB7CisgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2RhdGFdLCB7CisgICAgICAgIHR5cGU6ICJhcHBsaWNhdGlvbi9wZGYiCisgICAgICB9KTsKKyAgICAgIGRvd25sb2FkTWFuYWdlci5kb3dubG9hZChibG9iLCB1cmwsIGZpbGVuYW1lLCBzb3VyY2VFdmVudFR5cGUpOworICAgIH0pLmNhdGNoKCgpID0+IHsKKyAgICAgIHRoaXMuZG93bmxvYWQoeworICAgICAgICBzb3VyY2VFdmVudFR5cGUKKyAgICAgIH0pOworICAgIH0pLmZpbmFsbHkoKCkgPT4geworICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICB9KTsKKyAgfSwKKworICBfZGVsYXllZEZhbGxiYWNrKGZlYXR1cmVJZCkgeworICAgIHRoaXMuZXh0ZXJuYWxTZXJ2aWNlcy5yZXBvcnRUZWxlbWV0cnkoeworICAgICAgdHlwZTogInVuc3VwcG9ydGVkRmVhdHVyZSIsCisgICAgICBmZWF0dXJlSWQKKyAgICB9KTsKKworICAgIGlmICghdGhpcy50cmlnZ2VyRGVsYXllZEZhbGxiYWNrKSB7CisgICAgICB0aGlzLnRyaWdnZXJEZWxheWVkRmFsbGJhY2sgPSAoKSA9PiB7CisgICAgICAgIHRoaXMuZmFsbGJhY2soZmVhdHVyZUlkKTsKKyAgICAgICAgdGhpcy50cmlnZ2VyRGVsYXllZEZhbGxiYWNrID0gbnVsbDsKKyAgICAgIH07CisgICAgfQorICB9LAorCisgIGZhbGxiYWNrKGZlYXR1cmVJZCkgeworICAgIHRoaXMuZXh0ZXJuYWxTZXJ2aWNlcy5yZXBvcnRUZWxlbWV0cnkoeworICAgICAgdHlwZTogInVuc3VwcG9ydGVkRmVhdHVyZSIsCisgICAgICBmZWF0dXJlSWQKKyAgICB9KTsKKworICAgIGlmICh0aGlzLmZlbGxiYWNrKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5mZWxsYmFjayA9IHRydWU7CisgICAgdGhpcy5leHRlcm5hbFNlcnZpY2VzLmZhbGxiYWNrKHsKKyAgICAgIGZlYXR1cmVJZCwKKyAgICAgIHVybDogdGhpcy5iYXNlVXJsCisgICAgfSwgZnVuY3Rpb24gcmVzcG9uc2UoZG93bmxvYWQpIHsKKyAgICAgIGlmICghZG93bmxvYWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5kb3dubG9hZCh7CisgICAgICAgIHNvdXJjZUV2ZW50VHlwZTogImRvd25sb2FkIgorICAgICAgfSk7CisgICAgfSk7CisgIH0sCisKKyAgZXJyb3IobWVzc2FnZSwgbW9yZUluZm8pIHsKKyAgICBjb25zdCBtb3JlSW5mb1RleHQgPSBbdGhpcy5sMTBuLmdldCgiZXJyb3JfdmVyc2lvbl9pbmZvIiwgeworICAgICAgdmVyc2lvbjogX3BkZi52ZXJzaW9uIHx8ICI/IiwKKyAgICAgIGJ1aWxkOiBfcGRmLmJ1aWxkIHx8ICI/IgorICAgIH0sICJQREYuanMgdnt7dmVyc2lvbn19IChidWlsZDoge3tidWlsZH19KSIpXTsKKworICAgIGlmIChtb3JlSW5mbykgeworICAgICAgbW9yZUluZm9UZXh0LnB1c2godGhpcy5sMTBuLmdldCgiZXJyb3JfbWVzc2FnZSIsIHsKKyAgICAgICAgbWVzc2FnZTogbW9yZUluZm8ubWVzc2FnZQorICAgICAgfSwgIk1lc3NhZ2U6IHt7bWVzc2FnZX19IikpOworCisgICAgICBpZiAobW9yZUluZm8uc3RhY2spIHsKKyAgICAgICAgbW9yZUluZm9UZXh0LnB1c2godGhpcy5sMTBuLmdldCgiZXJyb3Jfc3RhY2siLCB7CisgICAgICAgICAgc3RhY2s6IG1vcmVJbmZvLnN0YWNrCisgICAgICAgIH0sICJTdGFjazoge3tzdGFja319IikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1vcmVJbmZvLmZpbGVuYW1lKSB7CisgICAgICAgICAgbW9yZUluZm9UZXh0LnB1c2godGhpcy5sMTBuLmdldCgiZXJyb3JfZmlsZSIsIHsKKyAgICAgICAgICAgIGZpbGU6IG1vcmVJbmZvLmZpbGVuYW1lCisgICAgICAgICAgfSwgIkZpbGU6IHt7ZmlsZX19IikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vcmVJbmZvLmxpbmVOdW1iZXIpIHsKKyAgICAgICAgICBtb3JlSW5mb1RleHQucHVzaCh0aGlzLmwxMG4uZ2V0KCJlcnJvcl9saW5lIiwgeworICAgICAgICAgICAgbGluZTogbW9yZUluZm8ubGluZU51bWJlcgorICAgICAgICAgIH0sICJMaW5lOiB7e2xpbmV9fSIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGVycm9yV3JhcHBlckNvbmZpZyA9IHRoaXMuYXBwQ29uZmlnLmVycm9yV3JhcHBlcjsKKyAgICBjb25zdCBlcnJvcldyYXBwZXIgPSBlcnJvcldyYXBwZXJDb25maWcuY29udGFpbmVyOworICAgIGVycm9yV3JhcHBlci5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpOworICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yV3JhcHBlckNvbmZpZy5lcnJvck1lc3NhZ2U7CisgICAgZXJyb3JNZXNzYWdlLnRleHRDb250ZW50ID0gbWVzc2FnZTsKKyAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGVycm9yV3JhcHBlckNvbmZpZy5jbG9zZUJ1dHRvbjsKKworICAgIGNsb3NlQnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7CisgICAgICBlcnJvcldyYXBwZXIuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAidHJ1ZSIpOworICAgIH07CisKKyAgICBjb25zdCBlcnJvck1vcmVJbmZvID0gZXJyb3JXcmFwcGVyQ29uZmlnLmVycm9yTW9yZUluZm87CisgICAgY29uc3QgbW9yZUluZm9CdXR0b24gPSBlcnJvcldyYXBwZXJDb25maWcubW9yZUluZm9CdXR0b247CisgICAgY29uc3QgbGVzc0luZm9CdXR0b24gPSBlcnJvcldyYXBwZXJDb25maWcubGVzc0luZm9CdXR0b247CisKKyAgICBtb3JlSW5mb0J1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkgeworICAgICAgZXJyb3JNb3JlSW5mby5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpOworICAgICAgbW9yZUluZm9CdXR0b24uc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAidHJ1ZSIpOworICAgICAgbGVzc0luZm9CdXR0b24ucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKTsKKyAgICAgIGVycm9yTW9yZUluZm8uc3R5bGUuaGVpZ2h0ID0gZXJyb3JNb3JlSW5mby5zY3JvbGxIZWlnaHQgKyAicHgiOworICAgIH07CisKKyAgICBsZXNzSW5mb0J1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkgeworICAgICAgZXJyb3JNb3JlSW5mby5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsICJ0cnVlIik7CisgICAgICBtb3JlSW5mb0J1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpOworICAgICAgbGVzc0luZm9CdXR0b24uc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAidHJ1ZSIpOworICAgIH07CisKKyAgICBtb3JlSW5mb0J1dHRvbi5vbmNvbnRleHRtZW51ID0gX3VpX3V0aWxzLm5vQ29udGV4dE1lbnVIYW5kbGVyOworICAgIGxlc3NJbmZvQnV0dG9uLm9uY29udGV4dG1lbnUgPSBfdWlfdXRpbHMubm9Db250ZXh0TWVudUhhbmRsZXI7CisgICAgY2xvc2VCdXR0b24ub25jb250ZXh0bWVudSA9IF91aV91dGlscy5ub0NvbnRleHRNZW51SGFuZGxlcjsKKyAgICBtb3JlSW5mb0J1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpOworICAgIGxlc3NJbmZvQnV0dG9uLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgInRydWUiKTsKKyAgICBQcm9taXNlLmFsbChtb3JlSW5mb1RleHQpLnRoZW4ocGFydHMgPT4geworICAgICAgZXJyb3JNb3JlSW5mby52YWx1ZSA9IHBhcnRzLmpvaW4oIlxuIik7CisgICAgfSk7CisgIH0sCisKKyAgcHJvZ3Jlc3MobGV2ZWwpIHsKKyAgICBpZiAodGhpcy5kb3dubG9hZENvbXBsZXRlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgcGVyY2VudCA9IE1hdGgucm91bmQobGV2ZWwgKiAxMDApOworCisgICAgaWYgKHBlcmNlbnQgPiB0aGlzLmxvYWRpbmdCYXIucGVyY2VudCB8fCBpc05hTihwZXJjZW50KSkgeworICAgICAgdGhpcy5sb2FkaW5nQmFyLnBlcmNlbnQgPSBwZXJjZW50OworICAgICAgY29uc3QgZGlzYWJsZUF1dG9GZXRjaCA9IHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLnBkZkRvY3VtZW50LmxvYWRpbmdQYXJhbXMuZGlzYWJsZUF1dG9GZXRjaCA6IF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLmdldCgiZGlzYWJsZUF1dG9GZXRjaCIpOworCisgICAgICBpZiAoZGlzYWJsZUF1dG9GZXRjaCAmJiBwZXJjZW50KSB7CisgICAgICAgIGlmICh0aGlzLmRpc2FibGVBdXRvRmV0Y2hMb2FkaW5nQmFyVGltZW91dCkgeworICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRpc2FibGVBdXRvRmV0Y2hMb2FkaW5nQmFyVGltZW91dCk7CisgICAgICAgICAgdGhpcy5kaXNhYmxlQXV0b0ZldGNoTG9hZGluZ0JhclRpbWVvdXQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5sb2FkaW5nQmFyLnNob3coKTsKKyAgICAgICAgdGhpcy5kaXNhYmxlQXV0b0ZldGNoTG9hZGluZ0JhclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKKyAgICAgICAgICB0aGlzLmxvYWRpbmdCYXIuaGlkZSgpOworICAgICAgICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaExvYWRpbmdCYXJUaW1lb3V0ID0gbnVsbDsKKyAgICAgICAgfSwgRElTQUJMRV9BVVRPX0ZFVENIX0xPQURJTkdfQkFSX1RJTUVPVVQpOworICAgICAgfQorICAgIH0KKyAgfSwKKworICBsb2FkKHBkZkRvY3VtZW50KSB7CisgICAgdGhpcy5wZGZEb2N1bWVudCA9IHBkZkRvY3VtZW50OworICAgIHBkZkRvY3VtZW50LmdldERvd25sb2FkSW5mbygpLnRoZW4oKCkgPT4geworICAgICAgdGhpcy5kb3dubG9hZENvbXBsZXRlID0gdHJ1ZTsKKyAgICAgIHRoaXMubG9hZGluZ0Jhci5oaWRlKCk7CisgICAgICBmaXJzdFBhZ2VQcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJkb2N1bWVudGxvYWRlZCIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBjb25zdCBwYWdlTGF5b3V0UHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldFBhZ2VMYXlvdXQoKS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CisgICAgY29uc3QgcGFnZU1vZGVQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0UGFnZU1vZGUoKS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CisgICAgY29uc3Qgb3BlbkFjdGlvblByb21pc2UgPSBwZGZEb2N1bWVudC5nZXRPcGVuQWN0aW9uKCkuY2F0Y2goZnVuY3Rpb24gKCkge30pOworICAgIHRoaXMudG9vbGJhci5zZXRQYWdlc0NvdW50KHBkZkRvY3VtZW50Lm51bVBhZ2VzLCBmYWxzZSk7CisgICAgdGhpcy5zZWNvbmRhcnlUb29sYmFyLnNldFBhZ2VzQ291bnQocGRmRG9jdW1lbnQubnVtUGFnZXMpOworICAgIGxldCBiYXNlRG9jdW1lbnRVcmw7CisgICAgYmFzZURvY3VtZW50VXJsID0gbnVsbDsKKyAgICB0aGlzLnBkZkxpbmtTZXJ2aWNlLnNldERvY3VtZW50KHBkZkRvY3VtZW50LCBiYXNlRG9jdW1lbnRVcmwpOworICAgIHRoaXMucGRmRG9jdW1lbnRQcm9wZXJ0aWVzLnNldERvY3VtZW50KHBkZkRvY3VtZW50LCB0aGlzLnVybCk7CisgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSBwZGZEb2N1bWVudC5hbm5vdGF0aW9uU3RvcmFnZTsKKworICAgIGFubm90YXRpb25TdG9yYWdlLm9uU2V0TW9kaWZpZWQgPSBmdW5jdGlvbiAoKSB7CisgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIiwgYmVmb3JlVW5sb2FkKTsKKyAgICB9OworCisgICAgYW5ub3RhdGlvblN0b3JhZ2Uub25SZXNldE1vZGlmaWVkID0gZnVuY3Rpb24gKCkgeworICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsIGJlZm9yZVVubG9hZCk7CisgICAgfTsKKworICAgIGNvbnN0IHBkZlZpZXdlciA9IHRoaXMucGRmVmlld2VyOworICAgIHBkZlZpZXdlci5zZXREb2N1bWVudChwZGZEb2N1bWVudCk7CisgICAgY29uc3QgeworICAgICAgZmlyc3RQYWdlUHJvbWlzZSwKKyAgICAgIG9uZVBhZ2VSZW5kZXJlZCwKKyAgICAgIHBhZ2VzUHJvbWlzZQorICAgIH0gPSBwZGZWaWV3ZXI7CisgICAgY29uc3QgcGRmVGh1bWJuYWlsVmlld2VyID0gdGhpcy5wZGZUaHVtYm5haWxWaWV3ZXI7CisgICAgcGRmVGh1bWJuYWlsVmlld2VyLnNldERvY3VtZW50KHBkZkRvY3VtZW50KTsKKyAgICBjb25zdCBzdG9yZWRQcm9taXNlID0gKHRoaXMuc3RvcmUgPSBuZXcgX3ZpZXdfaGlzdG9yeS5WaWV3SGlzdG9yeShwZGZEb2N1bWVudC5maW5nZXJwcmludCkpLmdldE11bHRpcGxlKHsKKyAgICAgIHBhZ2U6IG51bGwsCisgICAgICB6b29tOiBfdWlfdXRpbHMuREVGQVVMVF9TQ0FMRV9WQUxVRSwKKyAgICAgIHNjcm9sbExlZnQ6ICIwIiwKKyAgICAgIHNjcm9sbFRvcDogIjAiLAorICAgICAgcm90YXRpb246IG51bGwsCisgICAgICBzaWRlYmFyVmlldzogX3BkZl9zaWRlYmFyLlNpZGViYXJWaWV3LlVOS05PV04sCisgICAgICBzY3JvbGxNb2RlOiBfdWlfdXRpbHMuU2Nyb2xsTW9kZS5VTktOT1dOLAorICAgICAgc3ByZWFkTW9kZTogX3VpX3V0aWxzLlNwcmVhZE1vZGUuVU5LTk9XTgorICAgIH0pLmNhdGNoKCgpID0+IHsKKyAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpOworICAgIH0pOworICAgIGZpcnN0UGFnZVByb21pc2UudGhlbihwZGZQYWdlID0+IHsKKyAgICAgIHRoaXMubG9hZGluZ0Jhci5zZXRXaWR0aCh0aGlzLmFwcENvbmZpZy52aWV3ZXJDb250YWluZXIpOworICAgICAgUHJvbWlzZS5hbGwoW191aV91dGlscy5hbmltYXRpb25TdGFydGVkLCBzdG9yZWRQcm9taXNlLCBwYWdlTGF5b3V0UHJvbWlzZSwgcGFnZU1vZGVQcm9taXNlLCBvcGVuQWN0aW9uUHJvbWlzZV0pLnRoZW4oYXN5bmMgKFt0aW1lU3RhbXAsIHN0b3JlZCwgcGFnZUxheW91dCwgcGFnZU1vZGUsIG9wZW5BY3Rpb25dKSA9PiB7CisgICAgICAgIGNvbnN0IHZpZXdPbkxvYWQgPSBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoInZpZXdPbkxvYWQiKTsKKworICAgICAgICB0aGlzLl9pbml0aWFsaXplUGRmSGlzdG9yeSh7CisgICAgICAgICAgZmluZ2VycHJpbnQ6IHBkZkRvY3VtZW50LmZpbmdlcnByaW50LAorICAgICAgICAgIHZpZXdPbkxvYWQsCisgICAgICAgICAgaW5pdGlhbERlc3Q6IG9wZW5BY3Rpb24gJiYgb3BlbkFjdGlvbi5kZXN0CisgICAgICAgIH0pOworCisgICAgICAgIGNvbnN0IGluaXRpYWxCb29rbWFyayA9IHRoaXMuaW5pdGlhbEJvb2ttYXJrOworCisgICAgICAgIGNvbnN0IHpvb20gPSBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoImRlZmF1bHRab29tVmFsdWUiKTsKKworICAgICAgICBsZXQgaGFzaCA9IHpvb20gPyBgem9vbT0ke3pvb219YCA6IG51bGw7CisgICAgICAgIGxldCByb3RhdGlvbiA9IG51bGw7CisKKyAgICAgICAgbGV0IHNpZGViYXJWaWV3ID0gX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJzaWRlYmFyVmlld09uTG9hZCIpOworCisgICAgICAgIGxldCBzY3JvbGxNb2RlID0gX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJzY3JvbGxNb2RlT25Mb2FkIik7CisKKyAgICAgICAgbGV0IHNwcmVhZE1vZGUgPSBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoInNwcmVhZE1vZGVPbkxvYWQiKTsKKworICAgICAgICBpZiAoc3RvcmVkLnBhZ2UgJiYgdmlld09uTG9hZCAhPT0gVmlld09uTG9hZC5JTklUSUFMKSB7CisgICAgICAgICAgaGFzaCA9IGBwYWdlPSR7c3RvcmVkLnBhZ2V9Jnpvb209JHt6b29tIHx8IHN0b3JlZC56b29tfSxgICsgYCR7c3RvcmVkLnNjcm9sbExlZnR9LCR7c3RvcmVkLnNjcm9sbFRvcH1gOworICAgICAgICAgIHJvdGF0aW9uID0gcGFyc2VJbnQoc3RvcmVkLnJvdGF0aW9uLCAxMCk7CisKKyAgICAgICAgICBpZiAoc2lkZWJhclZpZXcgPT09IF9wZGZfc2lkZWJhci5TaWRlYmFyVmlldy5VTktOT1dOKSB7CisgICAgICAgICAgICBzaWRlYmFyVmlldyA9IHN0b3JlZC5zaWRlYmFyVmlldyB8IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNjcm9sbE1vZGUgPT09IF91aV91dGlscy5TY3JvbGxNb2RlLlVOS05PV04pIHsKKyAgICAgICAgICAgIHNjcm9sbE1vZGUgPSBzdG9yZWQuc2Nyb2xsTW9kZSB8IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNwcmVhZE1vZGUgPT09IF91aV91dGlscy5TcHJlYWRNb2RlLlVOS05PV04pIHsKKyAgICAgICAgICAgIHNwcmVhZE1vZGUgPSBzdG9yZWQuc3ByZWFkTW9kZSB8IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhZ2VNb2RlICYmIHNpZGViYXJWaWV3ID09PSBfcGRmX3NpZGViYXIuU2lkZWJhclZpZXcuVU5LTk9XTikgeworICAgICAgICAgIHNpZGViYXJWaWV3ID0gYXBpUGFnZU1vZGVUb1NpZGViYXJWaWV3KHBhZ2VNb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWdlTGF5b3V0ICYmIHNwcmVhZE1vZGUgPT09IF91aV91dGlscy5TcHJlYWRNb2RlLlVOS05PV04pIHsKKyAgICAgICAgICBzcHJlYWRNb2RlID0gYXBpUGFnZUxheW91dFRvU3ByZWFkTW9kZShwYWdlTGF5b3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZpZXcoaGFzaCwgeworICAgICAgICAgIHJvdGF0aW9uLAorICAgICAgICAgIHNpZGViYXJWaWV3LAorICAgICAgICAgIHNjcm9sbE1vZGUsCisgICAgICAgICAgc3ByZWFkTW9kZQorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgiZG9jdW1lbnRpbml0IiwgeworICAgICAgICAgIHNvdXJjZTogdGhpcworICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXRoaXMuaXNWaWV3ZXJFbWJlZGRlZCkgeworICAgICAgICAgIHBkZlZpZXdlci5mb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVBlcm1pc3Npb25zKHBkZkRvY3VtZW50KTsKKworICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3BhZ2VzUHJvbWlzZSwgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7CisgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBGT1JDRV9QQUdFU19MT0FERURfVElNRU9VVCk7CisgICAgICAgIH0pXSk7CisKKyAgICAgICAgaWYgKCFpbml0aWFsQm9va21hcmsgJiYgIWhhc2gpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocGRmVmlld2VyLmhhc0VxdWFsUGFnZVNpemVzKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pbml0aWFsQm9va21hcmsgPSBpbml0aWFsQm9va21hcms7CisgICAgICAgIHBkZlZpZXdlci5jdXJyZW50U2NhbGVWYWx1ZSA9IHBkZlZpZXdlci5jdXJyZW50U2NhbGVWYWx1ZTsKKyAgICAgICAgdGhpcy5zZXRJbml0aWFsVmlldyhoYXNoKTsKKyAgICAgIH0pLmNhdGNoKCgpID0+IHsKKyAgICAgICAgdGhpcy5zZXRJbml0aWFsVmlldygpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIHBkZlZpZXdlci51cGRhdGUoKTsKKyAgICAgIH0pOworICAgIH0pOworICAgIHBhZ2VzUHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgIHRoaXMuX2luaXRpYWxpemVBdXRvUHJpbnQocGRmRG9jdW1lbnQsIG9wZW5BY3Rpb25Qcm9taXNlKTsKKyAgICB9KTsKKyAgICBvbmVQYWdlUmVuZGVyZWQudGhlbigoKSA9PiB7CisgICAgICBwZGZEb2N1bWVudC5nZXRPdXRsaW5lKCkudGhlbihvdXRsaW5lID0+IHsKKyAgICAgICAgdGhpcy5wZGZPdXRsaW5lVmlld2VyLnJlbmRlcih7CisgICAgICAgICAgb3V0bGluZQorICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgcGRmRG9jdW1lbnQuZ2V0QXR0YWNobWVudHMoKS50aGVuKGF0dGFjaG1lbnRzID0+IHsKKyAgICAgICAgdGhpcy5wZGZBdHRhY2htZW50Vmlld2VyLnJlbmRlcih7CisgICAgICAgICAgYXR0YWNobWVudHMKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIHBkZlZpZXdlci5vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlLnRoZW4ob3B0aW9uYWxDb250ZW50Q29uZmlnID0+IHsKKyAgICAgICAgdGhpcy5wZGZMYXllclZpZXdlci5yZW5kZXIoeworICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZywKKyAgICAgICAgICBwZGZEb2N1bWVudAorICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5faW5pdGlhbGl6ZVBhZ2VMYWJlbHMocGRmRG9jdW1lbnQpOworCisgICAgdGhpcy5faW5pdGlhbGl6ZU1ldGFkYXRhKHBkZkRvY3VtZW50KTsKKyAgfSwKKworICBhc3luYyBfaW5pdGlhbGl6ZUF1dG9QcmludChwZGZEb2N1bWVudCwgb3BlbkFjdGlvblByb21pc2UpIHsKKyAgICBjb25zdCBbb3BlbkFjdGlvbiwgamF2YVNjcmlwdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbb3BlbkFjdGlvblByb21pc2UsIHBkZkRvY3VtZW50LmdldEphdmFTY3JpcHQoKV0pOworCisgICAgaWYgKHBkZkRvY3VtZW50ICE9PSB0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IHRyaWdnZXJBdXRvUHJpbnQgPSBmYWxzZTsKKworICAgIGlmIChvcGVuQWN0aW9uICYmIG9wZW5BY3Rpb24uYWN0aW9uID09PSAiUHJpbnQiKSB7CisgICAgICB0cmlnZ2VyQXV0b1ByaW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoamF2YVNjcmlwdCkgeworICAgICAgamF2YVNjcmlwdC5zb21lKGpzID0+IHsKKyAgICAgICAgaWYgKCFqcykgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnNvbGUud2FybigiV2FybmluZzogSmF2YVNjcmlwdCBpcyBub3Qgc3VwcG9ydGVkIik7CisKKyAgICAgICAgdGhpcy5fZGVsYXllZEZhbGxiYWNrKF9wZGYuVU5TVVBQT1JURURfRkVBVFVSRVMuamF2YVNjcmlwdCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9KTsKKworICAgICAgaWYgKCF0cmlnZ2VyQXV0b1ByaW50KSB7CisgICAgICAgIGZvciAoY29uc3QganMgb2YgamF2YVNjcmlwdCkgeworICAgICAgICAgIGlmIChqcyAmJiBfdWlfdXRpbHMuQXV0b1ByaW50UmVnRXhwLnRlc3QoanMpKSB7CisgICAgICAgICAgICB0cmlnZ2VyQXV0b1ByaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICghdGhpcy5zdXBwb3J0c1ByaW50aW5nKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRyaWdnZXJBdXRvUHJpbnQpIHsKKyAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICB3aW5kb3cucHJpbnQoKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwKKworICBhc3luYyBfaW5pdGlhbGl6ZU1ldGFkYXRhKHBkZkRvY3VtZW50KSB7CisgICAgY29uc3QgeworICAgICAgaW5mbywKKyAgICAgIG1ldGFkYXRhLAorICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUKKyAgICB9ID0gYXdhaXQgcGRmRG9jdW1lbnQuZ2V0TWV0YWRhdGEoKTsKKworICAgIGlmIChwZGZEb2N1bWVudCAhPT0gdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuZG9jdW1lbnRJbmZvID0gaW5mbzsKKyAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOworICAgIGNvbnNvbGUubG9nKGBQREYgJHtwZGZEb2N1bWVudC5maW5nZXJwcmludH0gWyR7aW5mby5QREZGb3JtYXRWZXJzaW9ufSBgICsgYCR7KGluZm8uUHJvZHVjZXIgfHwgIi0iKS50cmltKCl9IC8gJHsoaW5mby5DcmVhdG9yIHx8ICItIikudHJpbSgpfV0gYCArIGAoUERGLmpzOiAke19wZGYudmVyc2lvbiB8fCAiLSJ9YCArIGAke3RoaXMucGRmVmlld2VyLmVuYWJsZVdlYkdMID8gIiBbV2ViR0xdIiA6ICIifSlgKTsKKyAgICBsZXQgcGRmVGl0bGU7CisgICAgY29uc3QgaW5mb1RpdGxlID0gaW5mbyAmJiBpbmZvLlRpdGxlOworCisgICAgaWYgKGluZm9UaXRsZSkgeworICAgICAgcGRmVGl0bGUgPSBpbmZvVGl0bGU7CisgICAgfQorCisgICAgY29uc3QgbWV0YWRhdGFUaXRsZSA9IG1ldGFkYXRhICYmIG1ldGFkYXRhLmdldCgiZGM6dGl0bGUiKTsKKworICAgIGlmIChtZXRhZGF0YVRpdGxlKSB7CisgICAgICBpZiAobWV0YWRhdGFUaXRsZSAhPT0gIlVudGl0bGVkIiAmJiAhL1tcdUZGRjAtXHVGRkZGXS9nLnRlc3QobWV0YWRhdGFUaXRsZSkpIHsKKyAgICAgICAgcGRmVGl0bGUgPSBtZXRhZGF0YVRpdGxlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwZGZUaXRsZSkgeworICAgICAgdGhpcy5zZXRUaXRsZShgJHtwZGZUaXRsZX0gLSAke2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lIHx8IGRvY3VtZW50LnRpdGxlfWApOworICAgIH0gZWxzZSBpZiAoY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUpIHsKKyAgICAgIHRoaXMuc2V0VGl0bGUoY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUpOworICAgIH0KKworICAgIGlmIChpbmZvLklzWEZBUHJlc2VudCAmJiAhaW5mby5Jc0Fjcm9Gb3JtUHJlc2VudCkgeworICAgICAgY29uc29sZS53YXJuKCJXYXJuaW5nOiBYRkEgaXMgbm90IHN1cHBvcnRlZCIpOworCisgICAgICB0aGlzLl9kZWxheWVkRmFsbGJhY2soX3BkZi5VTlNVUFBPUlRFRF9GRUFUVVJFUy5mb3Jtcyk7CisgICAgfSBlbHNlIGlmICgoaW5mby5Jc0Fjcm9Gb3JtUHJlc2VudCB8fCBpbmZvLklzWEZBUHJlc2VudCkgJiYgIXRoaXMucGRmVmlld2VyLnJlbmRlckludGVyYWN0aXZlRm9ybXMpIHsKKyAgICAgIGNvbnNvbGUud2FybigiV2FybmluZzogSW50ZXJhY3RpdmUgZm9ybSBzdXBwb3J0IGlzIG5vdCBlbmFibGVkIik7CisKKyAgICAgIHRoaXMuX2RlbGF5ZWRGYWxsYmFjayhfcGRmLlVOU1VQUE9SVEVEX0ZFQVRVUkVTLmZvcm1zKTsKKyAgICB9CisKKyAgICBsZXQgdmVyc2lvbklkID0gIm90aGVyIjsKKworICAgIGlmIChLTk9XTl9WRVJTSU9OUy5pbmNsdWRlcyhpbmZvLlBERkZvcm1hdFZlcnNpb24pKSB7CisgICAgICB2ZXJzaW9uSWQgPSBgdiR7aW5mby5QREZGb3JtYXRWZXJzaW9uLnJlcGxhY2UoIi4iLCAiXyIpfWA7CisgICAgfQorCisgICAgbGV0IGdlbmVyYXRvcklkID0gIm90aGVyIjsKKworICAgIGlmIChpbmZvLlByb2R1Y2VyKSB7CisgICAgICBjb25zdCBwcm9kdWNlciA9IGluZm8uUHJvZHVjZXIudG9Mb3dlckNhc2UoKTsKKyAgICAgIEtOT1dOX0dFTkVSQVRPUlMuc29tZShmdW5jdGlvbiAoZ2VuZXJhdG9yKSB7CisgICAgICAgIGlmICghcHJvZHVjZXIuaW5jbHVkZXMoZ2VuZXJhdG9yKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRvcklkID0gZ2VuZXJhdG9yLnJlcGxhY2UoL1sgLlwtXS9nLCAiXyIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0pOworICAgIH0KKworICAgIGxldCBmb3JtVHlwZSA9IG51bGw7CisKKyAgICBpZiAoaW5mby5Jc1hGQVByZXNlbnQpIHsKKyAgICAgIGZvcm1UeXBlID0gInhmYSI7CisgICAgfSBlbHNlIGlmIChpbmZvLklzQWNyb0Zvcm1QcmVzZW50KSB7CisgICAgICBmb3JtVHlwZSA9ICJhY3JvZm9ybSI7CisgICAgfQorCisgICAgdGhpcy5leHRlcm5hbFNlcnZpY2VzLnJlcG9ydFRlbGVtZXRyeSh7CisgICAgICB0eXBlOiAiZG9jdW1lbnRJbmZvIiwKKyAgICAgIHZlcnNpb246IHZlcnNpb25JZCwKKyAgICAgIGdlbmVyYXRvcjogZ2VuZXJhdG9ySWQsCisgICAgICBmb3JtVHlwZQorICAgIH0pOworICB9LAorCisgIGFzeW5jIF9pbml0aWFsaXplUGFnZUxhYmVscyhwZGZEb2N1bWVudCkgeworICAgIGNvbnN0IGxhYmVscyA9IGF3YWl0IHBkZkRvY3VtZW50LmdldFBhZ2VMYWJlbHMoKTsKKworICAgIGlmIChwZGZEb2N1bWVudCAhPT0gdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbGFiZWxzIHx8IF9hcHBfb3B0aW9ucy5BcHBPcHRpb25zLmdldCgiZGlzYWJsZVBhZ2VMYWJlbHMiKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG51bUxhYmVscyA9IGxhYmVscy5sZW5ndGg7CisKKyAgICBpZiAobnVtTGFiZWxzICE9PSB0aGlzLnBhZ2VzQ291bnQpIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoIlRoZSBudW1iZXIgb2YgUGFnZSBMYWJlbHMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgZG9jdW1lbnQuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IGkgPSAwOworCisgICAgd2hpbGUgKGkgPCBudW1MYWJlbHMgJiYgbGFiZWxzW2ldID09PSAoaSArIDEpLnRvU3RyaW5nKCkpIHsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICBpZiAoaSA9PT0gbnVtTGFiZWxzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgeworICAgICAgcGRmVmlld2VyLAorICAgICAgcGRmVGh1bWJuYWlsVmlld2VyLAorICAgICAgdG9vbGJhcgorICAgIH0gPSB0aGlzOworICAgIHBkZlZpZXdlci5zZXRQYWdlTGFiZWxzKGxhYmVscyk7CisgICAgcGRmVGh1bWJuYWlsVmlld2VyLnNldFBhZ2VMYWJlbHMobGFiZWxzKTsKKyAgICB0b29sYmFyLnNldFBhZ2VzQ291bnQobnVtTGFiZWxzLCB0cnVlKTsKKyAgICB0b29sYmFyLnNldFBhZ2VOdW1iZXIocGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyLCBwZGZWaWV3ZXIuY3VycmVudFBhZ2VMYWJlbCk7CisgIH0sCisKKyAgX2luaXRpYWxpemVQZGZIaXN0b3J5KHsKKyAgICBmaW5nZXJwcmludCwKKyAgICB2aWV3T25Mb2FkLAorICAgIGluaXRpYWxEZXN0ID0gbnVsbAorICB9KSB7CisgICAgaWYgKHRoaXMuaXNWaWV3ZXJFbWJlZGRlZCB8fCBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoImRpc2FibGVIaXN0b3J5IikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLnBkZkhpc3RvcnkuaW5pdGlhbGl6ZSh7CisgICAgICBmaW5nZXJwcmludCwKKyAgICAgIHJlc2V0SGlzdG9yeTogdmlld09uTG9hZCA9PT0gVmlld09uTG9hZC5JTklUSUFMLAorICAgICAgdXBkYXRlVXJsOiBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoImhpc3RvcnlVcGRhdGVVcmwiKQorICAgIH0pOworCisgICAgaWYgKHRoaXMucGRmSGlzdG9yeS5pbml0aWFsQm9va21hcmspIHsKKyAgICAgIHRoaXMuaW5pdGlhbEJvb2ttYXJrID0gdGhpcy5wZGZIaXN0b3J5LmluaXRpYWxCb29rbWFyazsKKyAgICAgIHRoaXMuaW5pdGlhbFJvdGF0aW9uID0gdGhpcy5wZGZIaXN0b3J5LmluaXRpYWxSb3RhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoaW5pdGlhbERlc3QgJiYgIXRoaXMuaW5pdGlhbEJvb2ttYXJrICYmIHZpZXdPbkxvYWQgPT09IFZpZXdPbkxvYWQuVU5LTk9XTikgeworICAgICAgdGhpcy5pbml0aWFsQm9va21hcmsgPSBKU09OLnN0cmluZ2lmeShpbml0aWFsRGVzdCk7CisgICAgICB0aGlzLnBkZkhpc3RvcnkucHVzaCh7CisgICAgICAgIGV4cGxpY2l0RGVzdDogaW5pdGlhbERlc3QsCisgICAgICAgIHBhZ2VOdW1iZXI6IG51bGwKKyAgICAgIH0pOworICAgIH0KKyAgfSwKKworICBhc3luYyBfaW5pdGlhbGl6ZVBlcm1pc3Npb25zKHBkZkRvY3VtZW50KSB7CisgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCBwZGZEb2N1bWVudC5nZXRQZXJtaXNzaW9ucygpOworCisgICAgaWYgKHBkZkRvY3VtZW50ICE9PSB0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFwZXJtaXNzaW9ucyB8fCAhX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJlbmFibGVQZXJtaXNzaW9ucyIpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFwZXJtaXNzaW9ucy5pbmNsdWRlcyhfcGRmLlBlcm1pc3Npb25GbGFnLkNPUFkpKSB7CisgICAgICB0aGlzLmFwcENvbmZpZy52aWV3ZXJDb250YWluZXIuY2xhc3NMaXN0LmFkZChFTkFCTEVfUEVSTUlTU0lPTlNfQ0xBU1MpOworICAgIH0KKyAgfSwKKworICBzZXRJbml0aWFsVmlldyhzdG9yZWRIYXNoLCB7CisgICAgcm90YXRpb24sCisgICAgc2lkZWJhclZpZXcsCisgICAgc2Nyb2xsTW9kZSwKKyAgICBzcHJlYWRNb2RlCisgIH0gPSB7fSkgeworICAgIGNvbnN0IHNldFJvdGF0aW9uID0gYW5nbGUgPT4geworICAgICAgaWYgKCgwLCBfdWlfdXRpbHMuaXNWYWxpZFJvdGF0aW9uKShhbmdsZSkpIHsKKyAgICAgICAgdGhpcy5wZGZWaWV3ZXIucGFnZXNSb3RhdGlvbiA9IGFuZ2xlOworICAgICAgfQorICAgIH07CisKKyAgICBjb25zdCBzZXRWaWV3ZXJNb2RlcyA9IChzY3JvbGwsIHNwcmVhZCkgPT4geworICAgICAgaWYgKCgwLCBfdWlfdXRpbHMuaXNWYWxpZFNjcm9sbE1vZGUpKHNjcm9sbCkpIHsKKyAgICAgICAgdGhpcy5wZGZWaWV3ZXIuc2Nyb2xsTW9kZSA9IHNjcm9sbDsKKyAgICAgIH0KKworICAgICAgaWYgKCgwLCBfdWlfdXRpbHMuaXNWYWxpZFNwcmVhZE1vZGUpKHNwcmVhZCkpIHsKKyAgICAgICAgdGhpcy5wZGZWaWV3ZXIuc3ByZWFkTW9kZSA9IHNwcmVhZDsKKyAgICAgIH0KKyAgICB9OworCisgICAgdGhpcy5pc0luaXRpYWxWaWV3U2V0ID0gdHJ1ZTsKKyAgICB0aGlzLnBkZlNpZGViYXIuc2V0SW5pdGlhbFZpZXcoc2lkZWJhclZpZXcpOworICAgIHNldFZpZXdlck1vZGVzKHNjcm9sbE1vZGUsIHNwcmVhZE1vZGUpOworCisgICAgaWYgKHRoaXMuaW5pdGlhbEJvb2ttYXJrKSB7CisgICAgICBzZXRSb3RhdGlvbih0aGlzLmluaXRpYWxSb3RhdGlvbik7CisgICAgICBkZWxldGUgdGhpcy5pbml0aWFsUm90YXRpb247CisgICAgICB0aGlzLnBkZkxpbmtTZXJ2aWNlLnNldEhhc2godGhpcy5pbml0aWFsQm9va21hcmspOworICAgICAgdGhpcy5pbml0aWFsQm9va21hcmsgPSBudWxsOworICAgIH0gZWxzZSBpZiAoc3RvcmVkSGFzaCkgeworICAgICAgc2V0Um90YXRpb24ocm90YXRpb24pOworICAgICAgdGhpcy5wZGZMaW5rU2VydmljZS5zZXRIYXNoKHN0b3JlZEhhc2gpOworICAgIH0KKworICAgIHRoaXMudG9vbGJhci5zZXRQYWdlTnVtYmVyKHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyLCB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZUxhYmVsKTsKKyAgICB0aGlzLnNlY29uZGFyeVRvb2xiYXIuc2V0UGFnZU51bWJlcih0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlcik7CisKKyAgICBpZiAoIXRoaXMucGRmVmlld2VyLmN1cnJlbnRTY2FsZVZhbHVlKSB7CisgICAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50U2NhbGVWYWx1ZSA9IF91aV91dGlscy5ERUZBVUxUX1NDQUxFX1ZBTFVFOworICAgIH0KKyAgfSwKKworICBjbGVhbnVwKCkgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMucGRmVmlld2VyLmNsZWFudXAoKTsKKyAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlci5jbGVhbnVwKCk7CisKKyAgICBpZiAodGhpcy5wZGZWaWV3ZXIucmVuZGVyZXIgIT09IF91aV91dGlscy5SZW5kZXJlclR5cGUuU1ZHKSB7CisgICAgICB0aGlzLnBkZkRvY3VtZW50LmNsZWFudXAoKTsKKyAgICB9CisgIH0sCisKKyAgZm9yY2VSZW5kZXJpbmcoKSB7CisgICAgdGhpcy5wZGZSZW5kZXJpbmdRdWV1ZS5wcmludGluZyA9IHRoaXMucHJpbnRpbmc7CisgICAgdGhpcy5wZGZSZW5kZXJpbmdRdWV1ZS5pc1RodW1ibmFpbFZpZXdFbmFibGVkID0gdGhpcy5wZGZTaWRlYmFyLmlzVGh1bWJuYWlsVmlld1Zpc2libGU7CisgICAgdGhpcy5wZGZSZW5kZXJpbmdRdWV1ZS5yZW5kZXJIaWdoZXN0UHJpb3JpdHkoKTsKKyAgfSwKKworICBiZWZvcmVQcmludCgpIHsKKyAgICBpZiAodGhpcy5wcmludFNlcnZpY2UpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuc3VwcG9ydHNQcmludGluZykgeworICAgICAgdGhpcy5sMTBuLmdldCgicHJpbnRpbmdfbm90X3N1cHBvcnRlZCIsIG51bGwsICJXYXJuaW5nOiBQcmludGluZyBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci4iKS50aGVuKHByaW50TWVzc2FnZSA9PiB7CisgICAgICAgIHRoaXMuZXJyb3IocHJpbnRNZXNzYWdlKTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGhpcy5wZGZWaWV3ZXIucGFnZVZpZXdzUmVhZHkpIHsKKyAgICAgIHRoaXMubDEwbi5nZXQoInByaW50aW5nX25vdF9yZWFkeSIsIG51bGwsICJXYXJuaW5nOiBUaGUgUERGIGlzIG5vdCBmdWxseSBsb2FkZWQgZm9yIHByaW50aW5nLiIpLnRoZW4obm90UmVhZHlNZXNzYWdlID0+IHsKKyAgICAgICAgd2luZG93LmFsZXJ0KG5vdFJlYWR5TWVzc2FnZSk7CisgICAgICB9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBwYWdlc092ZXJ2aWV3ID0gdGhpcy5wZGZWaWV3ZXIuZ2V0UGFnZXNPdmVydmlldygpOworICAgIGNvbnN0IHByaW50Q29udGFpbmVyID0gdGhpcy5hcHBDb25maWcucHJpbnRDb250YWluZXI7CisKKyAgICBjb25zdCBwcmludFJlc29sdXRpb24gPSBfYXBwX29wdGlvbnMuQXBwT3B0aW9ucy5nZXQoInByaW50UmVzb2x1dGlvbiIpOworCisgICAgY29uc3Qgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IHRoaXMucGRmVmlld2VyLm9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U7CisgICAgY29uc3QgcHJpbnRTZXJ2aWNlID0gUERGUHJpbnRTZXJ2aWNlRmFjdG9yeS5pbnN0YW5jZS5jcmVhdGVQcmludFNlcnZpY2UodGhpcy5wZGZEb2N1bWVudCwgcGFnZXNPdmVydmlldywgcHJpbnRDb250YWluZXIsIHByaW50UmVzb2x1dGlvbiwgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSwgdGhpcy5sMTBuKTsKKyAgICB0aGlzLnByaW50U2VydmljZSA9IHByaW50U2VydmljZTsKKyAgICB0aGlzLmZvcmNlUmVuZGVyaW5nKCk7CisgICAgcHJpbnRTZXJ2aWNlLmxheW91dCgpOworICAgIHRoaXMuZXh0ZXJuYWxTZXJ2aWNlcy5yZXBvcnRUZWxlbWV0cnkoeworICAgICAgdHlwZTogInByaW50IgorICAgIH0pOworICB9LAorCisgIGFmdGVyUHJpbnQoKSB7CisgICAgaWYgKHRoaXMucHJpbnRTZXJ2aWNlKSB7CisgICAgICB0aGlzLnByaW50U2VydmljZS5kZXN0cm95KCk7CisgICAgICB0aGlzLnByaW50U2VydmljZSA9IG51bGw7CisKKyAgICAgIGlmICh0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICAgIHRoaXMucGRmRG9jdW1lbnQuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuZm9yY2VSZW5kZXJpbmcoKTsKKyAgfSwKKworICByb3RhdGVQYWdlcyhkZWx0YSkgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG5ld1JvdGF0aW9uID0gKHRoaXMucGRmVmlld2VyLnBhZ2VzUm90YXRpb24gKyAzNjAgKyBkZWx0YSkgJSAzNjA7CisgICAgdGhpcy5wZGZWaWV3ZXIucGFnZXNSb3RhdGlvbiA9IG5ld1JvdGF0aW9uOworICB9LAorCisgIHJlcXVlc3RQcmVzZW50YXRpb25Nb2RlKCkgeworICAgIGlmICghdGhpcy5wZGZQcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5wZGZQcmVzZW50YXRpb25Nb2RlLnJlcXVlc3QoKTsKKyAgfSwKKworICBiaW5kRXZlbnRzKCkgeworICAgIGNvbnN0IHsKKyAgICAgIGV2ZW50QnVzLAorICAgICAgX2JvdW5kRXZlbnRzCisgICAgfSA9IHRoaXM7CisgICAgX2JvdW5kRXZlbnRzLmJlZm9yZVByaW50ID0gdGhpcy5iZWZvcmVQcmludC5iaW5kKHRoaXMpOworICAgIF9ib3VuZEV2ZW50cy5hZnRlclByaW50ID0gdGhpcy5hZnRlclByaW50LmJpbmQodGhpcyk7CisKKyAgICBldmVudEJ1cy5fb24oInJlc2l6ZSIsIHdlYlZpZXdlclJlc2l6ZSk7CisKKyAgICBldmVudEJ1cy5fb24oImhhc2hjaGFuZ2UiLCB3ZWJWaWV3ZXJIYXNoY2hhbmdlKTsKKworICAgIGV2ZW50QnVzLl9vbigiYmVmb3JlcHJpbnQiLCBfYm91bmRFdmVudHMuYmVmb3JlUHJpbnQpOworCisgICAgZXZlbnRCdXMuX29uKCJhZnRlcnByaW50IiwgX2JvdW5kRXZlbnRzLmFmdGVyUHJpbnQpOworCisgICAgZXZlbnRCdXMuX29uKCJwYWdlcmVuZGVyZWQiLCB3ZWJWaWV3ZXJQYWdlUmVuZGVyZWQpOworCisgICAgZXZlbnRCdXMuX29uKCJ1cGRhdGV2aWV3YXJlYSIsIHdlYlZpZXdlclVwZGF0ZVZpZXdhcmVhKTsKKworICAgIGV2ZW50QnVzLl9vbigicGFnZWNoYW5naW5nIiwgd2ViVmlld2VyUGFnZUNoYW5naW5nKTsKKworICAgIGV2ZW50QnVzLl9vbigic2NhbGVjaGFuZ2luZyIsIHdlYlZpZXdlclNjYWxlQ2hhbmdpbmcpOworCisgICAgZXZlbnRCdXMuX29uKCJyb3RhdGlvbmNoYW5naW5nIiwgd2ViVmlld2VyUm90YXRpb25DaGFuZ2luZyk7CisKKyAgICBldmVudEJ1cy5fb24oInNpZGViYXJ2aWV3Y2hhbmdlZCIsIHdlYlZpZXdlclNpZGViYXJWaWV3Q2hhbmdlZCk7CisKKyAgICBldmVudEJ1cy5fb24oInBhZ2Vtb2RlIiwgd2ViVmlld2VyUGFnZU1vZGUpOworCisgICAgZXZlbnRCdXMuX29uKCJuYW1lZGFjdGlvbiIsIHdlYlZpZXdlck5hbWVkQWN0aW9uKTsKKworICAgIGV2ZW50QnVzLl9vbigicHJlc2VudGF0aW9ubW9kZWNoYW5nZWQiLCB3ZWJWaWV3ZXJQcmVzZW50YXRpb25Nb2RlQ2hhbmdlZCk7CisKKyAgICBldmVudEJ1cy5fb24oInByZXNlbnRhdGlvbm1vZGUiLCB3ZWJWaWV3ZXJQcmVzZW50YXRpb25Nb2RlKTsKKworICAgIGV2ZW50QnVzLl9vbigicHJpbnQiLCB3ZWJWaWV3ZXJQcmludCk7CisKKyAgICBldmVudEJ1cy5fb24oImRvd25sb2FkIiwgd2ViVmlld2VyRG93bmxvYWQpOworCisgICAgZXZlbnRCdXMuX29uKCJzYXZlIiwgd2ViVmlld2VyU2F2ZSk7CisKKyAgICBldmVudEJ1cy5fb24oImZpcnN0cGFnZSIsIHdlYlZpZXdlckZpcnN0UGFnZSk7CisKKyAgICBldmVudEJ1cy5fb24oImxhc3RwYWdlIiwgd2ViVmlld2VyTGFzdFBhZ2UpOworCisgICAgZXZlbnRCdXMuX29uKCJuZXh0cGFnZSIsIHdlYlZpZXdlck5leHRQYWdlKTsKKworICAgIGV2ZW50QnVzLl9vbigicHJldmlvdXNwYWdlIiwgd2ViVmlld2VyUHJldmlvdXNQYWdlKTsKKworICAgIGV2ZW50QnVzLl9vbigiem9vbWluIiwgd2ViVmlld2VyWm9vbUluKTsKKworICAgIGV2ZW50QnVzLl9vbigiem9vbW91dCIsIHdlYlZpZXdlclpvb21PdXQpOworCisgICAgZXZlbnRCdXMuX29uKCJ6b29tcmVzZXQiLCB3ZWJWaWV3ZXJab29tUmVzZXQpOworCisgICAgZXZlbnRCdXMuX29uKCJwYWdlbnVtYmVyY2hhbmdlZCIsIHdlYlZpZXdlclBhZ2VOdW1iZXJDaGFuZ2VkKTsKKworICAgIGV2ZW50QnVzLl9vbigic2NhbGVjaGFuZ2VkIiwgd2ViVmlld2VyU2NhbGVDaGFuZ2VkKTsKKworICAgIGV2ZW50QnVzLl9vbigicm90YXRlY3ciLCB3ZWJWaWV3ZXJSb3RhdGVDdyk7CisKKyAgICBldmVudEJ1cy5fb24oInJvdGF0ZWNjdyIsIHdlYlZpZXdlclJvdGF0ZUNjdyk7CisKKyAgICBldmVudEJ1cy5fb24oIm9wdGlvbmFsY29udGVudGNvbmZpZyIsIHdlYlZpZXdlck9wdGlvbmFsQ29udGVudENvbmZpZyk7CisKKyAgICBldmVudEJ1cy5fb24oInN3aXRjaHNjcm9sbG1vZGUiLCB3ZWJWaWV3ZXJTd2l0Y2hTY3JvbGxNb2RlKTsKKworICAgIGV2ZW50QnVzLl9vbigic2Nyb2xsbW9kZWNoYW5nZWQiLCB3ZWJWaWV3ZXJTY3JvbGxNb2RlQ2hhbmdlZCk7CisKKyAgICBldmVudEJ1cy5fb24oInN3aXRjaHNwcmVhZG1vZGUiLCB3ZWJWaWV3ZXJTd2l0Y2hTcHJlYWRNb2RlKTsKKworICAgIGV2ZW50QnVzLl9vbigic3ByZWFkbW9kZWNoYW5nZWQiLCB3ZWJWaWV3ZXJTcHJlYWRNb2RlQ2hhbmdlZCk7CisKKyAgICBldmVudEJ1cy5fb24oImRvY3VtZW50cHJvcGVydGllcyIsIHdlYlZpZXdlckRvY3VtZW50UHJvcGVydGllcyk7CisKKyAgICBldmVudEJ1cy5fb24oImZpbmQiLCB3ZWJWaWV3ZXJGaW5kKTsKKworICAgIGV2ZW50QnVzLl9vbigiZmluZGZyb211cmxoYXNoIiwgd2ViVmlld2VyRmluZEZyb21VcmxIYXNoKTsKKworICAgIGV2ZW50QnVzLl9vbigidXBkYXRlZmluZG1hdGNoZXNjb3VudCIsIHdlYlZpZXdlclVwZGF0ZUZpbmRNYXRjaGVzQ291bnQpOworCisgICAgZXZlbnRCdXMuX29uKCJ1cGRhdGVmaW5kY29udHJvbHN0YXRlIiwgd2ViVmlld2VyVXBkYXRlRmluZENvbnRyb2xTdGF0ZSk7CisKKyAgICBldmVudEJ1cy5fb24oImZpbGVpbnB1dGNoYW5nZSIsIHdlYlZpZXdlckZpbGVJbnB1dENoYW5nZSk7CisKKyAgICBldmVudEJ1cy5fb24oIm9wZW5maWxlIiwgd2ViVmlld2VyT3BlbkZpbGUpOworICB9LAorCisgIGJpbmRXaW5kb3dFdmVudHMoKSB7CisgICAgY29uc3QgeworICAgICAgZXZlbnRCdXMsCisgICAgICBfYm91bmRFdmVudHMKKyAgICB9ID0gdGhpczsKKworICAgIF9ib3VuZEV2ZW50cy53aW5kb3dSZXNpemUgPSAoKSA9PiB7CisgICAgICBldmVudEJ1cy5kaXNwYXRjaCgicmVzaXplIiwgeworICAgICAgICBzb3VyY2U6IHdpbmRvdworICAgICAgfSk7CisgICAgfTsKKworICAgIF9ib3VuZEV2ZW50cy53aW5kb3dIYXNoQ2hhbmdlID0gKCkgPT4geworICAgICAgZXZlbnRCdXMuZGlzcGF0Y2goImhhc2hjaGFuZ2UiLCB7CisgICAgICAgIHNvdXJjZTogd2luZG93LAorICAgICAgICBoYXNoOiBkb2N1bWVudC5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKQorICAgICAgfSk7CisgICAgfTsKKworICAgIF9ib3VuZEV2ZW50cy53aW5kb3dCZWZvcmVQcmludCA9ICgpID0+IHsKKyAgICAgIGV2ZW50QnVzLmRpc3BhdGNoKCJiZWZvcmVwcmludCIsIHsKKyAgICAgICAgc291cmNlOiB3aW5kb3cKKyAgICAgIH0pOworICAgIH07CisKKyAgICBfYm91bmRFdmVudHMud2luZG93QWZ0ZXJQcmludCA9ICgpID0+IHsKKyAgICAgIGV2ZW50QnVzLmRpc3BhdGNoKCJhZnRlcnByaW50IiwgeworICAgICAgICBzb3VyY2U6IHdpbmRvdworICAgICAgfSk7CisgICAgfTsKKworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgd2ViVmlld2VyVmlzaWJpbGl0eUNoYW5nZSk7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIiwgd2ViVmlld2VyV2hlZWwsIHsKKyAgICAgIHBhc3NpdmU6IGZhbHNlCisgICAgfSk7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB3ZWJWaWV3ZXJUb3VjaFN0YXJ0LCB7CisgICAgICBwYXNzaXZlOiBmYWxzZQorICAgIH0pOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHdlYlZpZXdlckNsaWNrKTsKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHdlYlZpZXdlcktleURvd24pOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIHdlYlZpZXdlcktleVVwKTsKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgX2JvdW5kRXZlbnRzLndpbmRvd1Jlc2l6ZSk7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCBfYm91bmRFdmVudHMud2luZG93SGFzaENoYW5nZSk7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXByaW50IiwgX2JvdW5kRXZlbnRzLndpbmRvd0JlZm9yZVByaW50KTsKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYWZ0ZXJwcmludCIsIF9ib3VuZEV2ZW50cy53aW5kb3dBZnRlclByaW50KTsKKyAgfSwKKworICB1bmJpbmRFdmVudHMoKSB7CisgICAgY29uc3QgeworICAgICAgZXZlbnRCdXMsCisgICAgICBfYm91bmRFdmVudHMKKyAgICB9ID0gdGhpczsKKworICAgIGV2ZW50QnVzLl9vZmYoInJlc2l6ZSIsIHdlYlZpZXdlclJlc2l6ZSk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJoYXNoY2hhbmdlIiwgd2ViVmlld2VySGFzaGNoYW5nZSk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJiZWZvcmVwcmludCIsIF9ib3VuZEV2ZW50cy5iZWZvcmVQcmludCk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJhZnRlcnByaW50IiwgX2JvdW5kRXZlbnRzLmFmdGVyUHJpbnQpOworCisgICAgZXZlbnRCdXMuX29mZigicGFnZXJlbmRlcmVkIiwgd2ViVmlld2VyUGFnZVJlbmRlcmVkKTsKKworICAgIGV2ZW50QnVzLl9vZmYoInVwZGF0ZXZpZXdhcmVhIiwgd2ViVmlld2VyVXBkYXRlVmlld2FyZWEpOworCisgICAgZXZlbnRCdXMuX29mZigicGFnZWNoYW5naW5nIiwgd2ViVmlld2VyUGFnZUNoYW5naW5nKTsKKworICAgIGV2ZW50QnVzLl9vZmYoInNjYWxlY2hhbmdpbmciLCB3ZWJWaWV3ZXJTY2FsZUNoYW5naW5nKTsKKworICAgIGV2ZW50QnVzLl9vZmYoInJvdGF0aW9uY2hhbmdpbmciLCB3ZWJWaWV3ZXJSb3RhdGlvbkNoYW5naW5nKTsKKworICAgIGV2ZW50QnVzLl9vZmYoInNpZGViYXJ2aWV3Y2hhbmdlZCIsIHdlYlZpZXdlclNpZGViYXJWaWV3Q2hhbmdlZCk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJwYWdlbW9kZSIsIHdlYlZpZXdlclBhZ2VNb2RlKTsKKworICAgIGV2ZW50QnVzLl9vZmYoIm5hbWVkYWN0aW9uIiwgd2ViVmlld2VyTmFtZWRBY3Rpb24pOworCisgICAgZXZlbnRCdXMuX29mZigicHJlc2VudGF0aW9ubW9kZWNoYW5nZWQiLCB3ZWJWaWV3ZXJQcmVzZW50YXRpb25Nb2RlQ2hhbmdlZCk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJwcmVzZW50YXRpb25tb2RlIiwgd2ViVmlld2VyUHJlc2VudGF0aW9uTW9kZSk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJwcmludCIsIHdlYlZpZXdlclByaW50KTsKKworICAgIGV2ZW50QnVzLl9vZmYoImRvd25sb2FkIiwgd2ViVmlld2VyRG93bmxvYWQpOworCisgICAgZXZlbnRCdXMuX29mZigic2F2ZSIsIHdlYlZpZXdlclNhdmUpOworCisgICAgZXZlbnRCdXMuX29mZigiZmlyc3RwYWdlIiwgd2ViVmlld2VyRmlyc3RQYWdlKTsKKworICAgIGV2ZW50QnVzLl9vZmYoImxhc3RwYWdlIiwgd2ViVmlld2VyTGFzdFBhZ2UpOworCisgICAgZXZlbnRCdXMuX29mZigibmV4dHBhZ2UiLCB3ZWJWaWV3ZXJOZXh0UGFnZSk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJwcmV2aW91c3BhZ2UiLCB3ZWJWaWV3ZXJQcmV2aW91c1BhZ2UpOworCisgICAgZXZlbnRCdXMuX29mZigiem9vbWluIiwgd2ViVmlld2VyWm9vbUluKTsKKworICAgIGV2ZW50QnVzLl9vZmYoInpvb21vdXQiLCB3ZWJWaWV3ZXJab29tT3V0KTsKKworICAgIGV2ZW50QnVzLl9vZmYoInpvb21yZXNldCIsIHdlYlZpZXdlclpvb21SZXNldCk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJwYWdlbnVtYmVyY2hhbmdlZCIsIHdlYlZpZXdlclBhZ2VOdW1iZXJDaGFuZ2VkKTsKKworICAgIGV2ZW50QnVzLl9vZmYoInNjYWxlY2hhbmdlZCIsIHdlYlZpZXdlclNjYWxlQ2hhbmdlZCk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJyb3RhdGVjdyIsIHdlYlZpZXdlclJvdGF0ZUN3KTsKKworICAgIGV2ZW50QnVzLl9vZmYoInJvdGF0ZWNjdyIsIHdlYlZpZXdlclJvdGF0ZUNjdyk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJvcHRpb25hbGNvbnRlbnRjb25maWciLCB3ZWJWaWV3ZXJPcHRpb25hbENvbnRlbnRDb25maWcpOworCisgICAgZXZlbnRCdXMuX29mZigic3dpdGNoc2Nyb2xsbW9kZSIsIHdlYlZpZXdlclN3aXRjaFNjcm9sbE1vZGUpOworCisgICAgZXZlbnRCdXMuX29mZigic2Nyb2xsbW9kZWNoYW5nZWQiLCB3ZWJWaWV3ZXJTY3JvbGxNb2RlQ2hhbmdlZCk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJzd2l0Y2hzcHJlYWRtb2RlIiwgd2ViVmlld2VyU3dpdGNoU3ByZWFkTW9kZSk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJzcHJlYWRtb2RlY2hhbmdlZCIsIHdlYlZpZXdlclNwcmVhZE1vZGVDaGFuZ2VkKTsKKworICAgIGV2ZW50QnVzLl9vZmYoImRvY3VtZW50cHJvcGVydGllcyIsIHdlYlZpZXdlckRvY3VtZW50UHJvcGVydGllcyk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJmaW5kIiwgd2ViVmlld2VyRmluZCk7CisKKyAgICBldmVudEJ1cy5fb2ZmKCJmaW5kZnJvbXVybGhhc2giLCB3ZWJWaWV3ZXJGaW5kRnJvbVVybEhhc2gpOworCisgICAgZXZlbnRCdXMuX29mZigidXBkYXRlZmluZG1hdGNoZXNjb3VudCIsIHdlYlZpZXdlclVwZGF0ZUZpbmRNYXRjaGVzQ291bnQpOworCisgICAgZXZlbnRCdXMuX29mZigidXBkYXRlZmluZGNvbnRyb2xzdGF0ZSIsIHdlYlZpZXdlclVwZGF0ZUZpbmRDb250cm9sU3RhdGUpOworCisgICAgZXZlbnRCdXMuX29mZigiZmlsZWlucHV0Y2hhbmdlIiwgd2ViVmlld2VyRmlsZUlucHV0Q2hhbmdlKTsKKworICAgIGV2ZW50QnVzLl9vZmYoIm9wZW5maWxlIiwgd2ViVmlld2VyT3BlbkZpbGUpOworCisgICAgX2JvdW5kRXZlbnRzLmJlZm9yZVByaW50ID0gbnVsbDsKKyAgICBfYm91bmRFdmVudHMuYWZ0ZXJQcmludCA9IG51bGw7CisgIH0sCisKKyAgdW5iaW5kV2luZG93RXZlbnRzKCkgeworICAgIGNvbnN0IHsKKyAgICAgIF9ib3VuZEV2ZW50cworICAgIH0gPSB0aGlzOworICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgd2ViVmlld2VyVmlzaWJpbGl0eUNoYW5nZSk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIiwgd2ViVmlld2VyV2hlZWwsIHsKKyAgICAgIHBhc3NpdmU6IGZhbHNlCisgICAgfSk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB3ZWJWaWV3ZXJUb3VjaFN0YXJ0LCB7CisgICAgICBwYXNzaXZlOiBmYWxzZQorICAgIH0pOworICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIHdlYlZpZXdlckNsaWNrKTsKKyAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHdlYlZpZXdlcktleURvd24pOworICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsIHdlYlZpZXdlcktleVVwKTsKKyAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgX2JvdW5kRXZlbnRzLndpbmRvd1Jlc2l6ZSk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCBfYm91bmRFdmVudHMud2luZG93SGFzaENoYW5nZSk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJlZm9yZXByaW50IiwgX2JvdW5kRXZlbnRzLndpbmRvd0JlZm9yZVByaW50KTsKKyAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWZ0ZXJwcmludCIsIF9ib3VuZEV2ZW50cy53aW5kb3dBZnRlclByaW50KTsKKyAgICBfYm91bmRFdmVudHMud2luZG93UmVzaXplID0gbnVsbDsKKyAgICBfYm91bmRFdmVudHMud2luZG93SGFzaENoYW5nZSA9IG51bGw7CisgICAgX2JvdW5kRXZlbnRzLndpbmRvd0JlZm9yZVByaW50ID0gbnVsbDsKKyAgICBfYm91bmRFdmVudHMud2luZG93QWZ0ZXJQcmludCA9IG51bGw7CisgIH0sCisKKyAgYWNjdW11bGF0ZVdoZWVsVGlja3ModGlja3MpIHsKKyAgICBpZiAodGhpcy5fd2hlZWxVbnVzZWRUaWNrcyA+IDAgJiYgdGlja3MgPCAwIHx8IHRoaXMuX3doZWVsVW51c2VkVGlja3MgPCAwICYmIHRpY2tzID4gMCkgeworICAgICAgdGhpcy5fd2hlZWxVbnVzZWRUaWNrcyA9IDA7CisgICAgfQorCisgICAgdGhpcy5fd2hlZWxVbnVzZWRUaWNrcyArPSB0aWNrczsKKyAgICBjb25zdCB3aG9sZVRpY2tzID0gTWF0aC5zaWduKHRoaXMuX3doZWVsVW51c2VkVGlja3MpICogTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLl93aGVlbFVudXNlZFRpY2tzKSk7CisgICAgdGhpcy5fd2hlZWxVbnVzZWRUaWNrcyAtPSB3aG9sZVRpY2tzOworICAgIHJldHVybiB3aG9sZVRpY2tzOworICB9CisKK307CitleHBvcnRzLlBERlZpZXdlckFwcGxpY2F0aW9uID0gUERGVmlld2VyQXBwbGljYXRpb247CitsZXQgdmFsaWRhdGVGaWxlVVJMOworeworICBjb25zdCBIT1NURURfVklFV0VSX09SSUdJTlMgPSBbIm51bGwiLCAiaHR0cDovL21vemlsbGEuZ2l0aHViLmlvIiwgImh0dHBzOi8vbW96aWxsYS5naXRodWIuaW8iXTsKKworICB2YWxpZGF0ZUZpbGVVUkwgPSBmdW5jdGlvbiAoZmlsZSkgeworICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgY29uc3Qgdmlld2VyT3JpZ2luID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luIHx8ICJudWxsIjsKKworICAgICAgaWYgKEhPU1RFRF9WSUVXRVJfT1JJR0lOUy5pbmNsdWRlcyh2aWV3ZXJPcmlnaW4pKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgeworICAgICAgICBvcmlnaW4sCisgICAgICAgIHByb3RvY29sCisgICAgICB9ID0gbmV3IFVSTChmaWxlLCB3aW5kb3cubG9jYXRpb24uaHJlZik7CisKKyAgICAgIGlmIChvcmlnaW4gIT09IHZpZXdlck9yaWdpbiAmJiBwcm90b2NvbCAhPT0gImJsb2I6IikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImZpbGUgb3JpZ2luIGRvZXMgbm90IG1hdGNoIHZpZXdlcidzIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleCAmJiBleC5tZXNzYWdlOworICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ubDEwbi5nZXQoImxvYWRpbmdfZXJyb3IiLCBudWxsLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgUERGLiIpLnRoZW4obG9hZGluZ0Vycm9yTWVzc2FnZSA9PiB7CisgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmVycm9yKGxvYWRpbmdFcnJvck1lc3NhZ2UsIHsKKyAgICAgICAgICBtZXNzYWdlCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICB0aHJvdyBleDsKKyAgICB9CisgIH07Cit9CisKK2FzeW5jIGZ1bmN0aW9uIGxvYWRGYWtlV29ya2VyKCkgeworICBpZiAoIV9wZGYuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMpIHsKKyAgICBfcGRmLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJ3b3JrZXJTcmMiKTsKKyAgfQorCisgIHJldHVybiAoMCwgX3BkZi5sb2FkU2NyaXB0KShfcGRmLlBERldvcmtlci5nZXRXb3JrZXJTcmMoKSk7Cit9CisKK2Z1bmN0aW9uIGxvYWRBbmRFbmFibGVQREZCdWcoZW5hYmxlZFRhYnMpIHsKKyAgY29uc3QgYXBwQ29uZmlnID0gUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnOworICByZXR1cm4gKDAsIF9wZGYubG9hZFNjcmlwdCkoYXBwQ29uZmlnLmRlYnVnZ2VyU2NyaXB0UGF0aCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgUERGQnVnLmVuYWJsZShlbmFibGVkVGFicyk7CisgICAgUERGQnVnLmluaXQoeworICAgICAgT1BTOiBfcGRmLk9QUworICAgIH0sIGFwcENvbmZpZy5tYWluQ29udGFpbmVyKTsKKyAgfSk7Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlckluaXRpYWxpemVkKCkgeworICBjb25zdCBhcHBDb25maWcgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbi5hcHBDb25maWc7CisgIGxldCBmaWxlOworICBjb25zdCBxdWVyeVN0cmluZyA9IGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7CisgIGNvbnN0IHBhcmFtcyA9ICgwLCBfdWlfdXRpbHMucGFyc2VRdWVyeVN0cmluZykocXVlcnlTdHJpbmcpOworICBmaWxlID0gImZpbGUiIGluIHBhcmFtcyA/IHBhcmFtcy5maWxlIDogX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJkZWZhdWx0VXJsIik7CisgIHZhbGlkYXRlRmlsZVVSTChmaWxlKTsKKyAgY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgZmlsZUlucHV0LmlkID0gYXBwQ29uZmlnLm9wZW5GaWxlSW5wdXROYW1lOworICBmaWxlSW5wdXQuY2xhc3NOYW1lID0gImZpbGVJbnB1dCI7CisgIGZpbGVJbnB1dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAiZmlsZSIpOworICBmaWxlSW5wdXQub25jb250ZXh0bWVudSA9IF91aV91dGlscy5ub0NvbnRleHRNZW51SGFuZGxlcjsKKyAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOworCisgIGlmICghd2luZG93LkZpbGUgfHwgIXdpbmRvdy5GaWxlUmVhZGVyIHx8ICF3aW5kb3cuRmlsZUxpc3QgfHwgIXdpbmRvdy5CbG9iKSB7CisgICAgYXBwQ29uZmlnLnRvb2xiYXIub3BlbkZpbGUuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAidHJ1ZSIpOworICAgIGFwcENvbmZpZy5zZWNvbmRhcnlUb29sYmFyLm9wZW5GaWxlQnV0dG9uLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgInRydWUiKTsKKyAgfSBlbHNlIHsKKyAgICBmaWxlSW5wdXQudmFsdWUgPSBudWxsOworICB9CisKKyAgZmlsZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIChldnQpIHsKKyAgICBjb25zdCBmaWxlcyA9IGV2dC50YXJnZXQuZmlsZXM7CisKKyAgICBpZiAoIWZpbGVzIHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLmRpc3BhdGNoKCJmaWxlaW5wdXRjaGFuZ2UiLCB7CisgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICBmaWxlSW5wdXQ6IGV2dC50YXJnZXQKKyAgICB9KTsKKyAgfSk7CisgIGFwcENvbmZpZy5tYWluQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIiwgZnVuY3Rpb24gKGV2dCkgeworICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworICAgIGV2dC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICJtb3ZlIjsKKyAgfSk7CisgIGFwcENvbmZpZy5tYWluQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImRyb3AiLCBmdW5jdGlvbiAoZXZ0KSB7CisgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgICAgY29uc3QgZmlsZXMgPSBldnQuZGF0YVRyYW5zZmVyLmZpbGVzOworCisgICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5kaXNwYXRjaCgiZmlsZWlucHV0Y2hhbmdlIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgZmlsZUlucHV0OiBldnQuZGF0YVRyYW5zZmVyCisgICAgfSk7CisgIH0pOworCisgIGlmICghUERGVmlld2VyQXBwbGljYXRpb24uc3VwcG9ydHNEb2N1bWVudEZvbnRzKSB7CisgICAgX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuc2V0KCJkaXNhYmxlRm9udEZhY2UiLCB0cnVlKTsKKworICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmwxMG4uZ2V0KCJ3ZWJfZm9udHNfZGlzYWJsZWQiLCBudWxsLCAiV2ViIGZvbnRzIGFyZSBkaXNhYmxlZDogdW5hYmxlIHRvIHVzZSBlbWJlZGRlZCBQREYgZm9udHMuIikudGhlbihtc2cgPT4geworICAgICAgY29uc29sZS53YXJuKG1zZyk7CisgICAgfSk7CisgIH0KKworICBpZiAoIVBERlZpZXdlckFwcGxpY2F0aW9uLnN1cHBvcnRzUHJpbnRpbmcpIHsKKyAgICBhcHBDb25maWcudG9vbGJhci5wcmludC5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKTsKKyAgICBhcHBDb25maWcuc2Vjb25kYXJ5VG9vbGJhci5wcmludEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKTsKKyAgfQorCisgIGlmICghUERGVmlld2VyQXBwbGljYXRpb24uc3VwcG9ydHNGdWxsc2NyZWVuKSB7CisgICAgYXBwQ29uZmlnLnRvb2xiYXIucHJlc2VudGF0aW9uTW9kZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKTsKKyAgICBhcHBDb25maWcuc2Vjb25kYXJ5VG9vbGJhci5wcmVzZW50YXRpb25Nb2RlQnV0dG9uLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOworICB9CisKKyAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnN1cHBvcnRzSW50ZWdyYXRlZEZpbmQpIHsKKyAgICBhcHBDb25maWcudG9vbGJhci52aWV3RmluZC5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKTsKKyAgfQorCisgIGFwcENvbmZpZy5tYWluQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLCBmdW5jdGlvbiAoZXZ0KSB7CisgICAgaWYgKGV2dC50YXJnZXQgPT09IHRoaXMpIHsKKyAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLmRpc3BhdGNoKCJyZXNpemUiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcworICAgICAgfSk7CisgICAgfQorICB9LCB0cnVlKTsKKworICB0cnkgeworICAgIHdlYlZpZXdlck9wZW5GaWxlVmlhVVJMKGZpbGUpOworICB9IGNhdGNoIChyZWFzb24pIHsKKyAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5sMTBuLmdldCgibG9hZGluZ19lcnJvciIsIG51bGwsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBQREYuIikudGhlbihtc2cgPT4geworICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZXJyb3IobXNnLCByZWFzb24pOworICAgIH0pOworICB9Cit9CisKK2xldCB3ZWJWaWV3ZXJPcGVuRmlsZVZpYVVSTDsKK3sKKyAgd2ViVmlld2VyT3BlbkZpbGVWaWFVUkwgPSBmdW5jdGlvbiAoZmlsZSkgeworICAgIGlmIChmaWxlICYmIGZpbGUubGFzdEluZGV4T2YoImZpbGU6IiwgMCkgPT09IDApIHsKKyAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnNldFRpdGxlVXNpbmdVcmwoZmlsZSk7CisgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKworICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ub3BlbihuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpKTsKKyAgICAgIH07CisKKyAgICAgIHhoci5vcGVuKCJHRVQiLCBmaWxlKTsKKyAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOworICAgICAgeGhyLnNlbmQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmlsZSkgeworICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ub3BlbihmaWxlKTsKKyAgICB9CisgIH07Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclJlc2V0UGVybWlzc2lvbnMoKSB7CisgIGNvbnN0IHsKKyAgICBhcHBDb25maWcKKyAgfSA9IFBERlZpZXdlckFwcGxpY2F0aW9uOworCisgIGlmICghYXBwQ29uZmlnKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgYXBwQ29uZmlnLnZpZXdlckNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKEVOQUJMRV9QRVJNSVNTSU9OU19DTEFTUyk7Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclBhZ2VSZW5kZXJlZChldnQpIHsKKyAgY29uc3QgcGFnZU51bWJlciA9IGV2dC5wYWdlTnVtYmVyOworICBjb25zdCBwYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMTsKKyAgY29uc3QgcGFnZVZpZXcgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuZ2V0UGFnZVZpZXcocGFnZUluZGV4KTsKKworICBpZiAocGFnZU51bWJlciA9PT0gUERGVmlld2VyQXBwbGljYXRpb24ucGFnZSkgeworICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnRvb2xiYXIudXBkYXRlTG9hZGluZ0luZGljYXRvclN0YXRlKGZhbHNlKTsKKyAgfQorCisgIGlmICghcGFnZVZpZXcpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24ucGRmU2lkZWJhci5pc1RodW1ibmFpbFZpZXdWaXNpYmxlKSB7CisgICAgY29uc3QgdGh1bWJuYWlsVmlldyA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlRodW1ibmFpbFZpZXdlci5nZXRUaHVtYm5haWwocGFnZUluZGV4KTsKKyAgICB0aHVtYm5haWxWaWV3LnNldEltYWdlKHBhZ2VWaWV3KTsKKyAgfQorCisgIGlmICh0eXBlb2YgU3RhdHMgIT09ICJ1bmRlZmluZWQiICYmIFN0YXRzLmVuYWJsZWQgJiYgcGFnZVZpZXcuc3RhdHMpIHsKKyAgICBTdGF0cy5hZGQocGFnZU51bWJlciwgcGFnZVZpZXcuc3RhdHMpOworICB9CisKKyAgaWYgKHBhZ2VWaWV3LmVycm9yKSB7CisgICAgUERGVmlld2VyQXBwbGljYXRpb24ubDEwbi5nZXQoInJlbmRlcmluZ19lcnJvciIsIG51bGwsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZW5kZXJpbmcgdGhlIHBhZ2UuIikudGhlbihtc2cgPT4geworICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZXJyb3IobXNnLCBwYWdlVmlldy5lcnJvcik7CisgICAgfSk7CisgIH0KKworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5leHRlcm5hbFNlcnZpY2VzLnJlcG9ydFRlbGVtZXRyeSh7CisgICAgdHlwZTogInBhZ2VJbmZvIiwKKyAgICB0aW1lc3RhbXA6IGV2dC50aW1lc3RhbXAKKyAgfSk7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkRvY3VtZW50LmdldFN0YXRzKCkudGhlbihmdW5jdGlvbiAoc3RhdHMpIHsKKyAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5leHRlcm5hbFNlcnZpY2VzLnJlcG9ydFRlbGVtZXRyeSh7CisgICAgICB0eXBlOiAiZG9jdW1lbnRTdGF0cyIsCisgICAgICBzdGF0cworICAgIH0pOworICB9KTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyUGFnZU1vZGUoeworICBtb2RlCit9KSB7CisgIGxldCB2aWV3OworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgInRodW1icyI6CisgICAgICB2aWV3ID0gX3BkZl9zaWRlYmFyLlNpZGViYXJWaWV3LlRIVU1CUzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAiYm9va21hcmtzIjoKKyAgICBjYXNlICJvdXRsaW5lIjoKKyAgICAgIHZpZXcgPSBfcGRmX3NpZGViYXIuU2lkZWJhclZpZXcuT1VUTElORTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAiYXR0YWNobWVudHMiOgorICAgICAgdmlldyA9IF9wZGZfc2lkZWJhci5TaWRlYmFyVmlldy5BVFRBQ0hNRU5UUzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAibGF5ZXJzIjoKKyAgICAgIHZpZXcgPSBfcGRmX3NpZGViYXIuU2lkZWJhclZpZXcuTEFZRVJTOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJub25lIjoKKyAgICAgIHZpZXcgPSBfcGRmX3NpZGViYXIuU2lkZWJhclZpZXcuTk9ORTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgInBhZ2Vtb2RlIiBoYXNoIHBhcmFtZXRlcjogJyArIG1vZGUpOworICAgICAgcmV0dXJuOworICB9CisKKyAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmU2lkZWJhci5zd2l0Y2hWaWV3KHZpZXcsIHRydWUpOworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJOYW1lZEFjdGlvbihldnQpIHsKKyAgc3dpdGNoIChldnQuYWN0aW9uKSB7CisgICAgY2FzZSAiR29Ub1BhZ2UiOgorICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnLnRvb2xiYXIucGFnZU51bWJlci5zZWxlY3QoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAiRmluZCI6CisgICAgICBpZiAoIVBERlZpZXdlckFwcGxpY2F0aW9uLnN1cHBvcnRzSW50ZWdyYXRlZEZpbmQpIHsKKyAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZmluZEJhci50b2dnbGUoKTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJQcmludCI6CisgICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24uc3VwcG9ydHNQcmludGluZykgeworICAgICAgICB3ZWJWaWV3ZXJQcmludCgpOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgIlNhdmVBcyI6CisgICAgICB3ZWJWaWV3ZXJTYXZlKCk7CisgICAgICBicmVhazsKKyAgfQorfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJQcmVzZW50YXRpb25Nb2RlQ2hhbmdlZCh7CisgIGFjdGl2ZSwKKyAgc3dpdGNoSW5Qcm9ncmVzcworfSkgeworICBsZXQgc3RhdGUgPSBfdWlfdXRpbHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlLk5PUk1BTDsKKworICBpZiAoc3dpdGNoSW5Qcm9ncmVzcykgeworICAgIHN0YXRlID0gX3VpX3V0aWxzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZS5DSEFOR0lORzsKKyAgfSBlbHNlIGlmIChhY3RpdmUpIHsKKyAgICBzdGF0ZSA9IF91aV91dGlscy5QcmVzZW50YXRpb25Nb2RlU3RhdGUuRlVMTFNDUkVFTjsKKyAgfQorCisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5wcmVzZW50YXRpb25Nb2RlU3RhdGUgPSBzdGF0ZTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyU2lkZWJhclZpZXdDaGFuZ2VkKGV2dCkgeworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZSZW5kZXJpbmdRdWV1ZS5pc1RodW1ibmFpbFZpZXdFbmFibGVkID0gUERGVmlld2VyQXBwbGljYXRpb24ucGRmU2lkZWJhci5pc1RodW1ibmFpbFZpZXdWaXNpYmxlOworICBjb25zdCBzdG9yZSA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnN0b3JlOworCisgIGlmIChzdG9yZSAmJiBQREZWaWV3ZXJBcHBsaWNhdGlvbi5pc0luaXRpYWxWaWV3U2V0KSB7CisgICAgc3RvcmUuc2V0KCJzaWRlYmFyVmlldyIsIGV2dC52aWV3KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CisgIH0KK30KKworZnVuY3Rpb24gd2ViVmlld2VyVXBkYXRlVmlld2FyZWEoZXZ0KSB7CisgIGNvbnN0IGxvY2F0aW9uID0gZXZ0LmxvY2F0aW9uLAorICAgICAgICBzdG9yZSA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnN0b3JlOworCisgIGlmIChzdG9yZSAmJiBQREZWaWV3ZXJBcHBsaWNhdGlvbi5pc0luaXRpYWxWaWV3U2V0KSB7CisgICAgc3RvcmUuc2V0TXVsdGlwbGUoeworICAgICAgcGFnZTogbG9jYXRpb24ucGFnZU51bWJlciwKKyAgICAgIHpvb206IGxvY2F0aW9uLnNjYWxlLAorICAgICAgc2Nyb2xsTGVmdDogbG9jYXRpb24ubGVmdCwKKyAgICAgIHNjcm9sbFRvcDogbG9jYXRpb24udG9wLAorICAgICAgcm90YXRpb246IGxvY2F0aW9uLnJvdGF0aW9uCisgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOworICB9CisKKyAgY29uc3QgaHJlZiA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChsb2NhdGlvbi5wZGZPcGVuUGFyYW1zKTsKKyAgUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnLnRvb2xiYXIudmlld0Jvb2ttYXJrLmhyZWYgPSBocmVmOworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5hcHBDb25maWcuc2Vjb25kYXJ5VG9vbGJhci52aWV3Qm9va21hcmtCdXR0b24uaHJlZiA9IGhyZWY7CisgIGNvbnN0IGN1cnJlbnRQYWdlID0gUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLmdldFBhZ2VWaWV3KFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UgLSAxKTsKKyAgY29uc3QgbG9hZGluZyA9IGN1cnJlbnRQYWdlLnJlbmRlcmluZ1N0YXRlICE9PSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnRvb2xiYXIudXBkYXRlTG9hZGluZ0luZGljYXRvclN0YXRlKGxvYWRpbmcpOworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJTY3JvbGxNb2RlQ2hhbmdlZChldnQpIHsKKyAgY29uc3Qgc3RvcmUgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbi5zdG9yZTsKKworICBpZiAoc3RvcmUgJiYgUERGVmlld2VyQXBwbGljYXRpb24uaXNJbml0aWFsVmlld1NldCkgeworICAgIHN0b3JlLnNldCgic2Nyb2xsTW9kZSIsIGV2dC5tb2RlKS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CisgIH0KK30KKworZnVuY3Rpb24gd2ViVmlld2VyU3ByZWFkTW9kZUNoYW5nZWQoZXZ0KSB7CisgIGNvbnN0IHN0b3JlID0gUERGVmlld2VyQXBwbGljYXRpb24uc3RvcmU7CisKKyAgaWYgKHN0b3JlICYmIFBERlZpZXdlckFwcGxpY2F0aW9uLmlzSW5pdGlhbFZpZXdTZXQpIHsKKyAgICBzdG9yZS5zZXQoInNwcmVhZE1vZGUiLCBldnQubW9kZSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOworICB9Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclJlc2l6ZSgpIHsKKyAgY29uc3QgeworICAgIHBkZkRvY3VtZW50LAorICAgIHBkZlZpZXdlcgorICB9ID0gUERGVmlld2VyQXBwbGljYXRpb247CisKKyAgaWYgKCFwZGZEb2N1bWVudCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IGN1cnJlbnRTY2FsZVZhbHVlID0gcGRmVmlld2VyLmN1cnJlbnRTY2FsZVZhbHVlOworCisgIGlmIChjdXJyZW50U2NhbGVWYWx1ZSA9PT0gImF1dG8iIHx8IGN1cnJlbnRTY2FsZVZhbHVlID09PSAicGFnZS1maXQiIHx8IGN1cnJlbnRTY2FsZVZhbHVlID09PSAicGFnZS13aWR0aCIpIHsKKyAgICBwZGZWaWV3ZXIuY3VycmVudFNjYWxlVmFsdWUgPSBjdXJyZW50U2NhbGVWYWx1ZTsKKyAgfQorCisgIHBkZlZpZXdlci51cGRhdGUoKTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VySGFzaGNoYW5nZShldnQpIHsKKyAgY29uc3QgaGFzaCA9IGV2dC5oYXNoOworCisgIGlmICghaGFzaCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghUERGVmlld2VyQXBwbGljYXRpb24uaXNJbml0aWFsVmlld1NldCkgeworICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmluaXRpYWxCb29rbWFyayA9IGhhc2g7CisgIH0gZWxzZSBpZiAoIVBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkhpc3RvcnkucG9wU3RhdGVJblByb2dyZXNzKSB7CisgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmTGlua1NlcnZpY2Uuc2V0SGFzaChoYXNoKTsKKyAgfQorfQorCitsZXQgd2ViVmlld2VyRmlsZUlucHV0Q2hhbmdlLCB3ZWJWaWV3ZXJPcGVuRmlsZTsKK3sKKyAgd2ViVmlld2VyRmlsZUlucHV0Q2hhbmdlID0gZnVuY3Rpb24gKGV2dCkgeworICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIgJiYgUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgZmlsZSA9IGV2dC5maWxlSW5wdXQuZmlsZXNbMF07CisKKyAgICBpZiAoIV92aWV3ZXJfY29tcGF0aWJpbGl0eS52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVDcmVhdGVPYmplY3RVUkwpIHsKKyAgICAgIGxldCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpOworCisgICAgICBpZiAoZmlsZS5uYW1lKSB7CisgICAgICAgIHVybCA9IHsKKyAgICAgICAgICB1cmwsCisgICAgICAgICAgb3JpZ2luYWxVcmw6IGZpbGUubmFtZQorICAgICAgICB9OworICAgICAgfQorCisgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5vcGVuKHVybCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnNldFRpdGxlVXNpbmdVcmwoZmlsZS5uYW1lKTsKKyAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOworCisgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIHdlYlZpZXdlckNoYW5nZUZpbGVSZWFkZXJPbmxvYWQoZXZlbnQpIHsKKyAgICAgICAgY29uc3QgYnVmZmVyID0gZXZlbnQudGFyZ2V0LnJlc3VsdDsKKyAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ub3BlbihuZXcgVWludDhBcnJheShidWZmZXIpKTsKKyAgICAgIH07CisKKyAgICAgIGZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CisgICAgfQorCisgICAgY29uc3QgYXBwQ29uZmlnID0gUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnOworICAgIGFwcENvbmZpZy50b29sYmFyLnZpZXdCb29rbWFyay5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsICJ0cnVlIik7CisgICAgYXBwQ29uZmlnLnNlY29uZGFyeVRvb2xiYXIudmlld0Jvb2ttYXJrQnV0dG9uLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgInRydWUiKTsKKyAgICBhcHBDb25maWcudG9vbGJhci5kb3dubG9hZC5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsICJ0cnVlIik7CisgICAgYXBwQ29uZmlnLnNlY29uZGFyeVRvb2xiYXIuZG93bmxvYWRCdXR0b24uc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAidHJ1ZSIpOworICB9OworCisgIHdlYlZpZXdlck9wZW5GaWxlID0gZnVuY3Rpb24gKGV2dCkgeworICAgIGNvbnN0IG9wZW5GaWxlSW5wdXROYW1lID0gUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnLm9wZW5GaWxlSW5wdXROYW1lOworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wZW5GaWxlSW5wdXROYW1lKS5jbGljaygpOworICB9OworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJQcmVzZW50YXRpb25Nb2RlKCkgeworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5yZXF1ZXN0UHJlc2VudGF0aW9uTW9kZSgpOworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJQcmludCgpIHsKKyAgd2luZG93LnByaW50KCk7Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlckRvd25sb2FkT3JTYXZlKHNvdXJjZUV2ZW50VHlwZSkgeworICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24ucGRmRG9jdW1lbnQgJiYgUERGVmlld2VyQXBwbGljYXRpb24ucGRmRG9jdW1lbnQuYW5ub3RhdGlvblN0b3JhZ2Uuc2l6ZSA+IDApIHsKKyAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5zYXZlKHsKKyAgICAgIHNvdXJjZUV2ZW50VHlwZQorICAgIH0pOworICB9IGVsc2UgeworICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmRvd25sb2FkKHsKKyAgICAgIHNvdXJjZUV2ZW50VHlwZQorICAgIH0pOworICB9Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlckRvd25sb2FkKCkgeworICB3ZWJWaWV3ZXJEb3dubG9hZE9yU2F2ZSgiZG93bmxvYWQiKTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyU2F2ZSgpIHsKKyAgd2ViVmlld2VyRG93bmxvYWRPclNhdmUoInNhdmUiKTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyRmlyc3RQYWdlKCkgeworICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24ucGRmRG9jdW1lbnQpIHsKKyAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlID0gMTsKKyAgfQorfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJMYXN0UGFnZSgpIHsKKyAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkRvY3VtZW50KSB7CisgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGFnZSA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2VzQ291bnQ7CisgIH0KK30KKworZnVuY3Rpb24gd2ViVmlld2VyTmV4dFBhZ2UoKSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UrKzsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyUHJldmlvdXNQYWdlKCkgeworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlLS07Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclpvb21JbigpIHsKKyAgUERGVmlld2VyQXBwbGljYXRpb24uem9vbUluKCk7Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclpvb21PdXQoKSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnpvb21PdXQoKTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyWm9vbVJlc2V0KCkgeworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi56b29tUmVzZXQoKTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyUGFnZU51bWJlckNoYW5nZWQoZXZ0KSB7CisgIGNvbnN0IHBkZlZpZXdlciA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlcjsKKworICBpZiAoZXZ0LnZhbHVlICE9PSAiIikgeworICAgIHBkZlZpZXdlci5jdXJyZW50UGFnZUxhYmVsID0gZXZ0LnZhbHVlOworICB9CisKKyAgaWYgKGV2dC52YWx1ZSAhPT0gcGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyLnRvU3RyaW5nKCkgJiYgZXZ0LnZhbHVlICE9PSBwZGZWaWV3ZXIuY3VycmVudFBhZ2VMYWJlbCkgeworICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnRvb2xiYXIuc2V0UGFnZU51bWJlcihwZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXIsIHBkZlZpZXdlci5jdXJyZW50UGFnZUxhYmVsKTsKKyAgfQorfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJTY2FsZUNoYW5nZWQoZXZ0KSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5jdXJyZW50U2NhbGVWYWx1ZSA9IGV2dC52YWx1ZTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyUm90YXRlQ3coKSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnJvdGF0ZVBhZ2VzKDkwKTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyUm90YXRlQ2N3KCkgeworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5yb3RhdGVQYWdlcygtOTApOworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJPcHRpb25hbENvbnRlbnRDb25maWcoZXZ0KSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gZXZ0LnByb21pc2U7Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclN3aXRjaFNjcm9sbE1vZGUoZXZ0KSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5zY3JvbGxNb2RlID0gZXZ0Lm1vZGU7Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclN3aXRjaFNwcmVhZE1vZGUoZXZ0KSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5zcHJlYWRNb2RlID0gZXZ0Lm1vZGU7Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlckRvY3VtZW50UHJvcGVydGllcygpIHsKKyAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmRG9jdW1lbnRQcm9wZXJ0aWVzLm9wZW4oKTsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyRmluZChldnQpIHsKKyAgUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuZXhlY3V0ZUNvbW1hbmQoImZpbmQiICsgZXZ0LnR5cGUsIHsKKyAgICBxdWVyeTogZXZ0LnF1ZXJ5LAorICAgIHBocmFzZVNlYXJjaDogZXZ0LnBocmFzZVNlYXJjaCwKKyAgICBjYXNlU2Vuc2l0aXZlOiBldnQuY2FzZVNlbnNpdGl2ZSwKKyAgICBlbnRpcmVXb3JkOiBldnQuZW50aXJlV29yZCwKKyAgICBoaWdobGlnaHRBbGw6IGV2dC5oaWdobGlnaHRBbGwsCisgICAgZmluZFByZXZpb3VzOiBldnQuZmluZFByZXZpb3VzCisgIH0pOworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJGaW5kRnJvbVVybEhhc2goZXZ0KSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRDb250cm9sbGVyLmV4ZWN1dGVDb21tYW5kKCJmaW5kIiwgeworICAgIHF1ZXJ5OiBldnQucXVlcnksCisgICAgcGhyYXNlU2VhcmNoOiBldnQucGhyYXNlU2VhcmNoLAorICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLAorICAgIGVudGlyZVdvcmQ6IGZhbHNlLAorICAgIGhpZ2hsaWdodEFsbDogdHJ1ZSwKKyAgICBmaW5kUHJldmlvdXM6IGZhbHNlCisgIH0pOworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJVcGRhdGVGaW5kTWF0Y2hlc0NvdW50KHsKKyAgbWF0Y2hlc0NvdW50Cit9KSB7CisgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5zdXBwb3J0c0ludGVncmF0ZWRGaW5kKSB7CisgICAgUERGVmlld2VyQXBwbGljYXRpb24uZXh0ZXJuYWxTZXJ2aWNlcy51cGRhdGVGaW5kTWF0Y2hlc0NvdW50KG1hdGNoZXNDb3VudCk7CisgIH0gZWxzZSB7CisgICAgUERGVmlld2VyQXBwbGljYXRpb24uZmluZEJhci51cGRhdGVSZXN1bHRzQ291bnQobWF0Y2hlc0NvdW50KTsKKyAgfQorfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJVcGRhdGVGaW5kQ29udHJvbFN0YXRlKHsKKyAgc3RhdGUsCisgIHByZXZpb3VzLAorICBtYXRjaGVzQ291bnQsCisgIHJhd1F1ZXJ5Cit9KSB7CisgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5zdXBwb3J0c0ludGVncmF0ZWRGaW5kKSB7CisgICAgUERGVmlld2VyQXBwbGljYXRpb24uZXh0ZXJuYWxTZXJ2aWNlcy51cGRhdGVGaW5kQ29udHJvbFN0YXRlKHsKKyAgICAgIHJlc3VsdDogc3RhdGUsCisgICAgICBmaW5kUHJldmlvdXM6IHByZXZpb3VzLAorICAgICAgbWF0Y2hlc0NvdW50LAorICAgICAgcmF3UXVlcnkKKyAgICB9KTsKKyAgfSBlbHNlIHsKKyAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQmFyLnVwZGF0ZVVJU3RhdGUoc3RhdGUsIHByZXZpb3VzLCBtYXRjaGVzQ291bnQpOworICB9Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclNjYWxlQ2hhbmdpbmcoZXZ0KSB7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnRvb2xiYXIuc2V0UGFnZVNjYWxlKGV2dC5wcmVzZXRWYWx1ZSwgZXZ0LnNjYWxlKTsKKyAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLnVwZGF0ZSgpOworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJSb3RhdGlvbkNoYW5naW5nKGV2dCkgeworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZUaHVtYm5haWxWaWV3ZXIucGFnZXNSb3RhdGlvbiA9IGV2dC5wYWdlc1JvdGF0aW9uOworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5mb3JjZVJlbmRlcmluZygpOworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXIgPSBldnQucGFnZU51bWJlcjsKK30KKworZnVuY3Rpb24gd2ViVmlld2VyUGFnZUNoYW5naW5nKGV2dCkgeworICBjb25zdCBwYWdlID0gZXZ0LnBhZ2VOdW1iZXI7CisgIFBERlZpZXdlckFwcGxpY2F0aW9uLnRvb2xiYXIuc2V0UGFnZU51bWJlcihwYWdlLCBldnQucGFnZUxhYmVsIHx8IG51bGwpOworICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5zZWNvbmRhcnlUb29sYmFyLnNldFBhZ2VOdW1iZXIocGFnZSk7CisKKyAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlNpZGViYXIuaXNUaHVtYm5haWxWaWV3VmlzaWJsZSkgeworICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlRodW1ibmFpbFZpZXdlci5zY3JvbGxUaHVtYm5haWxJbnRvVmlldyhwYWdlKTsKKyAgfQorCisgIGlmICh0eXBlb2YgU3RhdHMgIT09ICJ1bmRlZmluZWQiICYmIFN0YXRzLmVuYWJsZWQpIHsKKyAgICBjb25zdCBwYWdlVmlldyA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5nZXRQYWdlVmlldyhwYWdlIC0gMSk7CisKKyAgICBpZiAocGFnZVZpZXcgJiYgcGFnZVZpZXcuc3RhdHMpIHsKKyAgICAgIFN0YXRzLmFkZChwYWdlLCBwYWdlVmlldy5zdGF0cyk7CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclZpc2liaWxpdHlDaGFuZ2UoZXZ0KSB7CisgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICJ2aXNpYmxlIikgeworICAgIHNldFpvb21EaXNhYmxlZFRpbWVvdXQoKTsKKyAgfQorfQorCitsZXQgem9vbURpc2FibGVkVGltZW91dCA9IG51bGw7CisKK2Z1bmN0aW9uIHNldFpvb21EaXNhYmxlZFRpbWVvdXQoKSB7CisgIGlmICh6b29tRGlzYWJsZWRUaW1lb3V0KSB7CisgICAgY2xlYXJUaW1lb3V0KHpvb21EaXNhYmxlZFRpbWVvdXQpOworICB9CisKKyAgem9vbURpc2FibGVkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgIHpvb21EaXNhYmxlZFRpbWVvdXQgPSBudWxsOworICB9LCBXSEVFTF9aT09NX0RJU0FCTEVEX1RJTUVPVVQpOworfQorCitmdW5jdGlvbiB3ZWJWaWV3ZXJXaGVlbChldnQpIHsKKyAgY29uc3QgeworICAgIHBkZlZpZXdlciwKKyAgICBzdXBwb3J0ZWRNb3VzZVdoZWVsWm9vbU1vZGlmaWVyS2V5cworICB9ID0gUERGVmlld2VyQXBwbGljYXRpb247CisKKyAgaWYgKHBkZlZpZXdlci5pc0luUHJlc2VudGF0aW9uTW9kZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChldnQuY3RybEtleSAmJiBzdXBwb3J0ZWRNb3VzZVdoZWVsWm9vbU1vZGlmaWVyS2V5cy5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5ICYmIHN1cHBvcnRlZE1vdXNlV2hlZWxab29tTW9kaWZpZXJLZXlzLm1ldGFLZXkpIHsKKyAgICBldnQucHJldmVudERlZmF1bHQoKTsKKworICAgIGlmICh6b29tRGlzYWJsZWRUaW1lb3V0IHx8IGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gImhpZGRlbiIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBwcmV2aW91c1NjYWxlID0gcGRmVmlld2VyLmN1cnJlbnRTY2FsZTsKKyAgICBjb25zdCBkZWx0YSA9ICgwLCBfdWlfdXRpbHMubm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbikoZXZ0KTsKKyAgICBsZXQgdGlja3MgPSAwOworCisgICAgaWYgKGV2dC5kZWx0YU1vZGUgPT09IFdoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUgfHwgZXZ0LmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfUEFHRSkgeworICAgICAgaWYgKE1hdGguYWJzKGRlbHRhKSA+PSAxKSB7CisgICAgICAgIHRpY2tzID0gTWF0aC5zaWduKGRlbHRhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRpY2tzID0gUERGVmlld2VyQXBwbGljYXRpb24uYWNjdW11bGF0ZVdoZWVsVGlja3MoZGVsdGEpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBQSVhFTFNfUEVSX0xJTkVfU0NBTEUgPSAzMDsKKyAgICAgIHRpY2tzID0gUERGVmlld2VyQXBwbGljYXRpb24uYWNjdW11bGF0ZVdoZWVsVGlja3MoZGVsdGEgLyBQSVhFTFNfUEVSX0xJTkVfU0NBTEUpOworICAgIH0KKworICAgIGlmICh0aWNrcyA8IDApIHsKKyAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnpvb21PdXQoLXRpY2tzKTsKKyAgICB9IGVsc2UgaWYgKHRpY2tzID4gMCkgeworICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uem9vbUluKHRpY2tzKTsKKyAgICB9CisKKyAgICBjb25zdCBjdXJyZW50U2NhbGUgPSBwZGZWaWV3ZXIuY3VycmVudFNjYWxlOworCisgICAgaWYgKHByZXZpb3VzU2NhbGUgIT09IGN1cnJlbnRTY2FsZSkgeworICAgICAgY29uc3Qgc2NhbGVDb3JyZWN0aW9uRmFjdG9yID0gY3VycmVudFNjYWxlIC8gcHJldmlvdXNTY2FsZSAtIDE7CisgICAgICBjb25zdCByZWN0ID0gcGRmVmlld2VyLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgICAgIGNvbnN0IGR4ID0gZXZ0LmNsaWVudFggLSByZWN0LmxlZnQ7CisgICAgICBjb25zdCBkeSA9IGV2dC5jbGllbnRZIC0gcmVjdC50b3A7CisgICAgICBwZGZWaWV3ZXIuY29udGFpbmVyLnNjcm9sbExlZnQgKz0gZHggKiBzY2FsZUNvcnJlY3Rpb25GYWN0b3I7CisgICAgICBwZGZWaWV3ZXIuY29udGFpbmVyLnNjcm9sbFRvcCArPSBkeSAqIHNjYWxlQ29ycmVjdGlvbkZhY3RvcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc2V0Wm9vbURpc2FibGVkVGltZW91dCgpOworICB9Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlclRvdWNoU3RhcnQoZXZ0KSB7CisgIGlmIChldnQudG91Y2hlcy5sZW5ndGggPiAxKSB7CisgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgIH0KK30KKworZnVuY3Rpb24gd2ViVmlld2VyQ2xpY2soZXZ0KSB7CisgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi50cmlnZ2VyRGVsYXllZEZhbGxiYWNrICYmIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5jb250YWluc0VsZW1lbnQoZXZ0LnRhcmdldCkpIHsKKyAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi50cmlnZ2VyRGVsYXllZEZhbGxiYWNrKCk7CisgIH0KKworICBpZiAoIVBERlZpZXdlckFwcGxpY2F0aW9uLnNlY29uZGFyeVRvb2xiYXIuaXNPcGVuKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgYXBwQ29uZmlnID0gUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnOworCisgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuY29udGFpbnNFbGVtZW50KGV2dC50YXJnZXQpIHx8IGFwcENvbmZpZy50b29sYmFyLmNvbnRhaW5lci5jb250YWlucyhldnQudGFyZ2V0KSAmJiBldnQudGFyZ2V0ICE9PSBhcHBDb25maWcuc2Vjb25kYXJ5VG9vbGJhci50b2dnbGVCdXR0b24pIHsKKyAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5zZWNvbmRhcnlUb29sYmFyLmNsb3NlKCk7CisgIH0KK30KKworZnVuY3Rpb24gd2ViVmlld2VyS2V5VXAoZXZ0KSB7CisgIGlmIChldnQua2V5Q29kZSA9PT0gOSkgeworICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi50cmlnZ2VyRGVsYXllZEZhbGxiYWNrKSB7CisgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi50cmlnZ2VyRGVsYXllZEZhbGxiYWNrKCk7CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIHdlYlZpZXdlcktleURvd24oZXZ0KSB7CisgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5vdmVybGF5TWFuYWdlci5hY3RpdmUpIHsKKyAgICByZXR1cm47CisgIH0KKworICBsZXQgaGFuZGxlZCA9IGZhbHNlLAorICAgICAgZW5zdXJlVmlld2VyRm9jdXNlZCA9IGZhbHNlOworICBjb25zdCBjbWQgPSAoZXZ0LmN0cmxLZXkgPyAxIDogMCkgfCAoZXZ0LmFsdEtleSA/IDIgOiAwKSB8IChldnQuc2hpZnRLZXkgPyA0IDogMCkgfCAoZXZ0Lm1ldGFLZXkgPyA4IDogMCk7CisgIGNvbnN0IHBkZlZpZXdlciA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlcjsKKyAgY29uc3QgaXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUgPSBwZGZWaWV3ZXIgJiYgcGRmVmlld2VyLmlzSW5QcmVzZW50YXRpb25Nb2RlOworCisgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSA4IHx8IGNtZCA9PT0gNSB8fCBjbWQgPT09IDEyKSB7CisgICAgc3dpdGNoIChldnQua2V5Q29kZSkgeworICAgICAgY2FzZSA3MDoKKyAgICAgICAgaWYgKCFQREZWaWV3ZXJBcHBsaWNhdGlvbi5zdXBwb3J0c0ludGVncmF0ZWRGaW5kKSB7CisgICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZmluZEJhci5vcGVuKCk7CisgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA3MToKKyAgICAgICAgaWYgKCFQREZWaWV3ZXJBcHBsaWNhdGlvbi5zdXBwb3J0c0ludGVncmF0ZWRGaW5kKSB7CisgICAgICAgICAgY29uc3QgZmluZFN0YXRlID0gUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuc3RhdGU7CisKKyAgICAgICAgICBpZiAoZmluZFN0YXRlKSB7CisgICAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQ29udHJvbGxlci5leGVjdXRlQ29tbWFuZCgiZmluZGFnYWluIiwgeworICAgICAgICAgICAgICBxdWVyeTogZmluZFN0YXRlLnF1ZXJ5LAorICAgICAgICAgICAgICBwaHJhc2VTZWFyY2g6IGZpbmRTdGF0ZS5waHJhc2VTZWFyY2gsCisgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGZpbmRTdGF0ZS5jYXNlU2Vuc2l0aXZlLAorICAgICAgICAgICAgICBlbnRpcmVXb3JkOiBmaW5kU3RhdGUuZW50aXJlV29yZCwKKyAgICAgICAgICAgICAgaGlnaGxpZ2h0QWxsOiBmaW5kU3RhdGUuaGlnaGxpZ2h0QWxsLAorICAgICAgICAgICAgICBmaW5kUHJldmlvdXM6IGNtZCA9PT0gNSB8fCBjbWQgPT09IDEyCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDYxOgorICAgICAgY2FzZSAxMDc6CisgICAgICBjYXNlIDE4NzoKKyAgICAgIGNhc2UgMTcxOgorICAgICAgICBpZiAoIWlzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uem9vbUluKCk7CisgICAgICAgIH0KKworICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTczOgorICAgICAgY2FzZSAxMDk6CisgICAgICBjYXNlIDE4OToKKyAgICAgICAgaWYgKCFpc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSkgeworICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnpvb21PdXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0ODoKKyAgICAgIGNhc2UgOTY6CisgICAgICAgIGlmICghaXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUpIHsKKyAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnpvb21SZXNldCgpOworICAgICAgICAgIH0pOworICAgICAgICAgIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM4OgorICAgICAgICBpZiAoaXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUgfHwgUERGVmlld2VyQXBwbGljYXRpb24ucGFnZSA+IDEpIHsKKyAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlID0gMTsKKyAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICBlbnN1cmVWaWV3ZXJGb2N1c2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQwOgorICAgICAgICBpZiAoaXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUgfHwgUERGVmlld2VyQXBwbGljYXRpb24ucGFnZSA8IFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2VzQ291bnQpIHsKKyAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlID0gUERGVmlld2VyQXBwbGljYXRpb24ucGFnZXNDb3VudDsKKyAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICBlbnN1cmVWaWV3ZXJGb2N1c2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGNvbnN0IHsKKyAgICBldmVudEJ1cworICB9ID0gUERGVmlld2VyQXBwbGljYXRpb247CisKKyAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDgpIHsKKyAgICBzd2l0Y2ggKGV2dC5rZXlDb2RlKSB7CisgICAgICBjYXNlIDgzOgorICAgICAgICBldmVudEJ1cy5kaXNwYXRjaCgiZG93bmxvYWQiLCB7CisgICAgICAgICAgc291cmNlOiB3aW5kb3cKKyAgICAgICAgfSk7CisgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA3OToKKyAgICAgICAgeworICAgICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoKCJvcGVuZmlsZSIsIHsKKyAgICAgICAgICAgIHNvdXJjZTogd2luZG93CisgICAgICAgICAgfSk7CisgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGNtZCA9PT0gMyB8fCBjbWQgPT09IDEwKSB7CisgICAgc3dpdGNoIChldnQua2V5Q29kZSkgeworICAgICAgY2FzZSA4MDoKKyAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucmVxdWVzdFByZXNlbnRhdGlvbk1vZGUoKTsKKyAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDcxOgorICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5hcHBDb25maWcudG9vbGJhci5wYWdlTnVtYmVyLnNlbGVjdCgpOworICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGhhbmRsZWQpIHsKKyAgICBpZiAoZW5zdXJlVmlld2VyRm9jdXNlZCAmJiAhaXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUpIHsKKyAgICAgIHBkZlZpZXdlci5mb2N1cygpOworICAgIH0KKworICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IGN1ckVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIjpmb2N1cyIpOworICBjb25zdCBjdXJFbGVtZW50VGFnTmFtZSA9IGN1ckVsZW1lbnQgJiYgY3VyRWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisKKyAgaWYgKGN1ckVsZW1lbnRUYWdOYW1lID09PSAiSU5QVVQiIHx8IGN1ckVsZW1lbnRUYWdOYW1lID09PSAiVEVYVEFSRUEiIHx8IGN1ckVsZW1lbnRUYWdOYW1lID09PSAiU0VMRUNUIiB8fCBjdXJFbGVtZW50ICYmIGN1ckVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHsKKyAgICBpZiAoZXZ0LmtleUNvZGUgIT09IDI3KSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaWYgKGNtZCA9PT0gMCkgeworICAgIGxldCB0dXJuUGFnZSA9IDAsCisgICAgICAgIHR1cm5Pbmx5SWZQYWdlRml0ID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGV2dC5rZXlDb2RlKSB7CisgICAgICBjYXNlIDM4OgorICAgICAgY2FzZSAzMzoKKyAgICAgICAgaWYgKHBkZlZpZXdlci5pc1ZlcnRpY2FsU2Nyb2xsYmFyRW5hYmxlZCkgeworICAgICAgICAgIHR1cm5Pbmx5SWZQYWdlRml0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHR1cm5QYWdlID0gLTE7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDg6CisgICAgICAgIGlmICghaXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUpIHsKKyAgICAgICAgICB0dXJuT25seUlmUGFnZUZpdCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0dXJuUGFnZSA9IC0xOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzNzoKKyAgICAgICAgaWYgKHBkZlZpZXdlci5pc0hvcml6b250YWxTY3JvbGxiYXJFbmFibGVkKSB7CisgICAgICAgICAgdHVybk9ubHlJZlBhZ2VGaXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgIGNhc2UgNzU6CisgICAgICBjYXNlIDgwOgorICAgICAgICB0dXJuUGFnZSA9IC0xOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAyNzoKKyAgICAgICAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnNlY29uZGFyeVRvb2xiYXIuaXNPcGVuKSB7CisgICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uc2Vjb25kYXJ5VG9vbGJhci5jbG9zZSgpOworICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFQREZWaWV3ZXJBcHBsaWNhdGlvbi5zdXBwb3J0c0ludGVncmF0ZWRGaW5kICYmIFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRCYXIub3BlbmVkKSB7CisgICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZmluZEJhci5jbG9zZSgpOworICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDA6CisgICAgICBjYXNlIDM0OgorICAgICAgICBpZiAocGRmVmlld2VyLmlzVmVydGljYWxTY3JvbGxiYXJFbmFibGVkKSB7CisgICAgICAgICAgdHVybk9ubHlJZlBhZ2VGaXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdHVyblBhZ2UgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxMzoKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIGlmICghaXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUpIHsKKyAgICAgICAgICB0dXJuT25seUlmUGFnZUZpdCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0dXJuUGFnZSA9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM5OgorICAgICAgICBpZiAocGRmVmlld2VyLmlzSG9yaXpvbnRhbFNjcm9sbGJhckVuYWJsZWQpIHsKKyAgICAgICAgICB0dXJuT25seUlmUGFnZUZpdCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgY2FzZSA3NDoKKyAgICAgIGNhc2UgNzg6CisgICAgICAgIHR1cm5QYWdlID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzY6CisgICAgICAgIGlmIChpc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSB8fCBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlID4gMSkgeworICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UgPSAxOworICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgIGVuc3VyZVZpZXdlckZvY3VzZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzU6CisgICAgICAgIGlmIChpc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSB8fCBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlIDwgUERGVmlld2VyQXBwbGljYXRpb24ucGFnZXNDb3VudCkgeworICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlc0NvdW50OworICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgIGVuc3VyZVZpZXdlckZvY3VzZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgODM6CisgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkN1cnNvclRvb2xzLnN3aXRjaFRvb2woX3BkZl9jdXJzb3JfdG9vbHMuQ3Vyc29yVG9vbC5TRUxFQ1QpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA3MjoKKyAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmQ3Vyc29yVG9vbHMuc3dpdGNoVG9vbChfcGRmX2N1cnNvcl90b29scy5DdXJzb3JUb29sLkhBTkQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA4MjoKKyAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucm90YXRlUGFnZXMoOTApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxMTU6CisgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlNpZGViYXIudG9nZ2xlKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0dXJuUGFnZSAhPT0gMCAmJiAoIXR1cm5Pbmx5SWZQYWdlRml0IHx8IHBkZlZpZXdlci5jdXJyZW50U2NhbGVWYWx1ZSA9PT0gInBhZ2UtZml0IikpIHsKKyAgICAgIGlmICh0dXJuUGFnZSA+IDApIHsKKyAgICAgICAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UgPCBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlc0NvdW50KSB7CisgICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGFnZSsrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24ucGFnZSA+IDEpIHsKKyAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wYWdlLS07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKGNtZCA9PT0gNCkgeworICAgIHN3aXRjaCAoZXZ0LmtleUNvZGUpIHsKKyAgICAgIGNhc2UgMTM6CisgICAgICBjYXNlIDMyOgorICAgICAgICBpZiAoIWlzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlICYmIHBkZlZpZXdlci5jdXJyZW50U2NhbGVWYWx1ZSAhPT0gInBhZ2UtZml0IikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UgPiAxKSB7CisgICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGFnZS0tOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDgyOgorICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5yb3RhdGVQYWdlcygtOTApOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIWhhbmRsZWQgJiYgIWlzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgaWYgKGV2dC5rZXlDb2RlID49IDMzICYmIGV2dC5rZXlDb2RlIDw9IDQwIHx8IGV2dC5rZXlDb2RlID09PSAzMiAmJiBjdXJFbGVtZW50VGFnTmFtZSAhPT0gIkJVVFRPTiIpIHsKKyAgICAgIGVuc3VyZVZpZXdlckZvY3VzZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChlbnN1cmVWaWV3ZXJGb2N1c2VkICYmICFwZGZWaWV3ZXIuY29udGFpbnNFbGVtZW50KGN1ckVsZW1lbnQpKSB7CisgICAgcGRmVmlld2VyLmZvY3VzKCk7CisgIH0KKworICBpZiAoaGFuZGxlZCkgeworICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworICB9Cit9CisKK2Z1bmN0aW9uIGJlZm9yZVVubG9hZChldnQpIHsKKyAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgIGV2dC5yZXR1cm5WYWx1ZSA9ICIiOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Z1bmN0aW9uIGFwaVBhZ2VMYXlvdXRUb1NwcmVhZE1vZGUobGF5b3V0KSB7CisgIHN3aXRjaCAobGF5b3V0KSB7CisgICAgY2FzZSAiU2luZ2xlUGFnZSI6CisgICAgY2FzZSAiT25lQ29sdW1uIjoKKyAgICAgIHJldHVybiBfdWlfdXRpbHMuU3ByZWFkTW9kZS5OT05FOworCisgICAgY2FzZSAiVHdvQ29sdW1uTGVmdCI6CisgICAgY2FzZSAiVHdvUGFnZUxlZnQiOgorICAgICAgcmV0dXJuIF91aV91dGlscy5TcHJlYWRNb2RlLk9ERDsKKworICAgIGNhc2UgIlR3b0NvbHVtblJpZ2h0IjoKKyAgICBjYXNlICJUd29QYWdlUmlnaHQiOgorICAgICAgcmV0dXJuIF91aV91dGlscy5TcHJlYWRNb2RlLkVWRU47CisgIH0KKworICByZXR1cm4gX3VpX3V0aWxzLlNwcmVhZE1vZGUuTk9ORTsKK30KKworZnVuY3Rpb24gYXBpUGFnZU1vZGVUb1NpZGViYXJWaWV3KG1vZGUpIHsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSAiVXNlTm9uZSI6CisgICAgICByZXR1cm4gX3BkZl9zaWRlYmFyLlNpZGViYXJWaWV3Lk5PTkU7CisKKyAgICBjYXNlICJVc2VUaHVtYnMiOgorICAgICAgcmV0dXJuIF9wZGZfc2lkZWJhci5TaWRlYmFyVmlldy5USFVNQlM7CisKKyAgICBjYXNlICJVc2VPdXRsaW5lcyI6CisgICAgICByZXR1cm4gX3BkZl9zaWRlYmFyLlNpZGViYXJWaWV3Lk9VVExJTkU7CisKKyAgICBjYXNlICJVc2VBdHRhY2htZW50cyI6CisgICAgICByZXR1cm4gX3BkZl9zaWRlYmFyLlNpZGViYXJWaWV3LkFUVEFDSE1FTlRTOworCisgICAgY2FzZSAiVXNlT0MiOgorICAgICAgcmV0dXJuIF9wZGZfc2lkZWJhci5TaWRlYmFyVmlldy5MQVlFUlM7CisgIH0KKworICByZXR1cm4gX3BkZl9zaWRlYmFyLlNpZGViYXJWaWV3Lk5PTkU7Cit9CisKK2NvbnN0IFBERlByaW50U2VydmljZUZhY3RvcnkgPSB7CisgIGluc3RhbmNlOiB7CisgICAgc3VwcG9ydHNQcmludGluZzogZmFsc2UsCisKKyAgICBjcmVhdGVQcmludFNlcnZpY2UoKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogY3JlYXRlUHJpbnRTZXJ2aWNlIik7CisgICAgfQorCisgIH0KK307CitleHBvcnRzLlBERlByaW50U2VydmljZUZhY3RvcnkgPSBQREZQcmludFNlcnZpY2VGYWN0b3J5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvYXBwX29wdGlvbnMuanMgYi9saWIvd2ViL2FwcF9vcHRpb25zLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYTRhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL2FwcF9vcHRpb25zLmpzCkBAIC0wLDAgKzEsMjU4IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5PcHRpb25LaW5kID0gZXhwb3J0cy5BcHBPcHRpb25zID0gdm9pZCAwOworCit2YXIgX3ZpZXdlcl9jb21wYXRpYmlsaXR5ID0gcmVxdWlyZSgiLi92aWV3ZXJfY29tcGF0aWJpbGl0eS5qcyIpOworCitjb25zdCBPcHRpb25LaW5kID0geworICBWSUVXRVI6IDB4MDIsCisgIEFQSTogMHgwNCwKKyAgV09SS0VSOiAweDA4LAorICBQUkVGRVJFTkNFOiAweDgwCit9OworZXhwb3J0cy5PcHRpb25LaW5kID0gT3B0aW9uS2luZDsKK2NvbnN0IGRlZmF1bHRPcHRpb25zID0geworICBjdXJzb3JUb29sT25Mb2FkOiB7CisgICAgdmFsdWU6IDAsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIgKyBPcHRpb25LaW5kLlBSRUZFUkVOQ0UKKyAgfSwKKyAgZGVmYXVsdFVybDogeworICAgIHZhbHVlOiAiY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIKKyAgfSwKKyAgZGVmYXVsdFpvb21WYWx1ZTogeworICAgIHZhbHVlOiAiIiwKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUiArIE9wdGlvbktpbmQuUFJFRkVSRU5DRQorICB9LAorICBkaXNhYmxlSGlzdG9yeTogeworICAgIHZhbHVlOiBmYWxzZSwKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUgorICB9LAorICBkaXNhYmxlUGFnZUxhYmVsczogeworICAgIHZhbHVlOiBmYWxzZSwKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUiArIE9wdGlvbktpbmQuUFJFRkVSRU5DRQorICB9LAorICBlbmFibGVQZXJtaXNzaW9uczogeworICAgIHZhbHVlOiBmYWxzZSwKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUiArIE9wdGlvbktpbmQuUFJFRkVSRU5DRQorICB9LAorICBlbmFibGVQcmludEF1dG9Sb3RhdGU6IHsKKyAgICB2YWx1ZTogZmFsc2UsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIgKyBPcHRpb25LaW5kLlBSRUZFUkVOQ0UKKyAgfSwKKyAgZW5hYmxlV2ViR0w6IHsKKyAgICB2YWx1ZTogZmFsc2UsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIgKyBPcHRpb25LaW5kLlBSRUZFUkVOQ0UKKyAgfSwKKyAgZXh0ZXJuYWxMaW5rUmVsOiB7CisgICAgdmFsdWU6ICJub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93IiwKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUgorICB9LAorICBleHRlcm5hbExpbmtUYXJnZXQ6IHsKKyAgICB2YWx1ZTogMCwKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUiArIE9wdGlvbktpbmQuUFJFRkVSRU5DRQorICB9LAorICBoaXN0b3J5VXBkYXRlVXJsOiB7CisgICAgdmFsdWU6IGZhbHNlLAorICAgIGtpbmQ6IE9wdGlvbktpbmQuVklFV0VSICsgT3B0aW9uS2luZC5QUkVGRVJFTkNFCisgIH0sCisgIGlnbm9yZURlc3RpbmF0aW9uWm9vbTogeworICAgIHZhbHVlOiBmYWxzZSwKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUiArIE9wdGlvbktpbmQuUFJFRkVSRU5DRQorICB9LAorICBpbWFnZVJlc291cmNlc1BhdGg6IHsKKyAgICB2YWx1ZTogIi4vaW1hZ2VzLyIsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIKKyAgfSwKKyAgbWF4Q2FudmFzUGl4ZWxzOiB7CisgICAgdmFsdWU6IDE2Nzc3MjE2LAorICAgIGNvbXBhdGliaWxpdHk6IF92aWV3ZXJfY29tcGF0aWJpbGl0eS52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLm1heENhbnZhc1BpeGVscywKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUgorICB9LAorICBwZGZCdWdFbmFibGVkOiB7CisgICAgdmFsdWU6IGZhbHNlLAorICAgIGtpbmQ6IE9wdGlvbktpbmQuVklFV0VSICsgT3B0aW9uS2luZC5QUkVGRVJFTkNFCisgIH0sCisgIHByaW50UmVzb2x1dGlvbjogeworICAgIHZhbHVlOiAxNTAsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIKKyAgfSwKKyAgcmVuZGVyZXI6IHsKKyAgICB2YWx1ZTogImNhbnZhcyIsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIgKyBPcHRpb25LaW5kLlBSRUZFUkVOQ0UKKyAgfSwKKyAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogeworICAgIHZhbHVlOiB0cnVlLAorICAgIGtpbmQ6IE9wdGlvbktpbmQuVklFV0VSICsgT3B0aW9uS2luZC5QUkVGRVJFTkNFCisgIH0sCisgIHNpZGViYXJWaWV3T25Mb2FkOiB7CisgICAgdmFsdWU6IC0xLAorICAgIGtpbmQ6IE9wdGlvbktpbmQuVklFV0VSICsgT3B0aW9uS2luZC5QUkVGRVJFTkNFCisgIH0sCisgIHNjcm9sbE1vZGVPbkxvYWQ6IHsKKyAgICB2YWx1ZTogLTEsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIgKyBPcHRpb25LaW5kLlBSRUZFUkVOQ0UKKyAgfSwKKyAgc3ByZWFkTW9kZU9uTG9hZDogeworICAgIHZhbHVlOiAtMSwKKyAgICBraW5kOiBPcHRpb25LaW5kLlZJRVdFUiArIE9wdGlvbktpbmQuUFJFRkVSRU5DRQorICB9LAorICB0ZXh0TGF5ZXJNb2RlOiB7CisgICAgdmFsdWU6IDEsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIgKyBPcHRpb25LaW5kLlBSRUZFUkVOQ0UKKyAgfSwKKyAgdXNlT25seUNzc1pvb206IHsKKyAgICB2YWx1ZTogZmFsc2UsCisgICAga2luZDogT3B0aW9uS2luZC5WSUVXRVIgKyBPcHRpb25LaW5kLlBSRUZFUkVOQ0UKKyAgfSwKKyAgdmlld09uTG9hZDogeworICAgIHZhbHVlOiAwLAorICAgIGtpbmQ6IE9wdGlvbktpbmQuVklFV0VSICsgT3B0aW9uS2luZC5QUkVGRVJFTkNFCisgIH0sCisgIGNNYXBQYWNrZWQ6IHsKKyAgICB2YWx1ZTogdHJ1ZSwKKyAgICBraW5kOiBPcHRpb25LaW5kLkFQSQorICB9LAorICBjTWFwVXJsOiB7CisgICAgdmFsdWU6ICIuLi93ZWIvY21hcHMvIiwKKyAgICBraW5kOiBPcHRpb25LaW5kLkFQSQorICB9LAorICBkaXNhYmxlQXV0b0ZldGNoOiB7CisgICAgdmFsdWU6IGZhbHNlLAorICAgIGtpbmQ6IE9wdGlvbktpbmQuQVBJICsgT3B0aW9uS2luZC5QUkVGRVJFTkNFCisgIH0sCisgIGRpc2FibGVGb250RmFjZTogeworICAgIHZhbHVlOiBmYWxzZSwKKyAgICBraW5kOiBPcHRpb25LaW5kLkFQSSArIE9wdGlvbktpbmQuUFJFRkVSRU5DRQorICB9LAorICBkaXNhYmxlUmFuZ2U6IHsKKyAgICB2YWx1ZTogZmFsc2UsCisgICAga2luZDogT3B0aW9uS2luZC5BUEkgKyBPcHRpb25LaW5kLlBSRUZFUkVOQ0UKKyAgfSwKKyAgZGlzYWJsZVN0cmVhbTogeworICAgIHZhbHVlOiBmYWxzZSwKKyAgICBraW5kOiBPcHRpb25LaW5kLkFQSSArIE9wdGlvbktpbmQuUFJFRkVSRU5DRQorICB9LAorICBkb2NCYXNlVXJsOiB7CisgICAgdmFsdWU6ICIiLAorICAgIGtpbmQ6IE9wdGlvbktpbmQuQVBJCisgIH0sCisgIGZvbnRFeHRyYVByb3BlcnRpZXM6IHsKKyAgICB2YWx1ZTogZmFsc2UsCisgICAga2luZDogT3B0aW9uS2luZC5BUEkKKyAgfSwKKyAgaXNFdmFsU3VwcG9ydGVkOiB7CisgICAgdmFsdWU6IHRydWUsCisgICAga2luZDogT3B0aW9uS2luZC5BUEkKKyAgfSwKKyAgbWF4SW1hZ2VTaXplOiB7CisgICAgdmFsdWU6IC0xLAorICAgIGtpbmQ6IE9wdGlvbktpbmQuQVBJCisgIH0sCisgIHBkZkJ1ZzogeworICAgIHZhbHVlOiBmYWxzZSwKKyAgICBraW5kOiBPcHRpb25LaW5kLkFQSQorICB9LAorICB2ZXJib3NpdHk6IHsKKyAgICB2YWx1ZTogMSwKKyAgICBraW5kOiBPcHRpb25LaW5kLkFQSQorICB9LAorICB3b3JrZXJQb3J0OiB7CisgICAgdmFsdWU6IG51bGwsCisgICAga2luZDogT3B0aW9uS2luZC5XT1JLRVIKKyAgfSwKKyAgd29ya2VyU3JjOiB7CisgICAgdmFsdWU6ICIuLi9idWlsZC9wZGYud29ya2VyLmpzIiwKKyAgICBraW5kOiBPcHRpb25LaW5kLldPUktFUgorICB9Cit9OworOworY29uc3QgdXNlck9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCitjbGFzcyBBcHBPcHRpb25zIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSBBcHBPcHRpb25zLiIpOworICB9CisKKyAgc3RhdGljIGdldChuYW1lKSB7CisgICAgY29uc3QgdXNlck9wdGlvbiA9IHVzZXJPcHRpb25zW25hbWVdOworCisgICAgaWYgKHVzZXJPcHRpb24gIT09IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIHVzZXJPcHRpb247CisgICAgfQorCisgICAgY29uc3QgZGVmYXVsdE9wdGlvbiA9IGRlZmF1bHRPcHRpb25zW25hbWVdOworCisgICAgaWYgKGRlZmF1bHRPcHRpb24gIT09IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIGRlZmF1bHRPcHRpb24uY29tcGF0aWJpbGl0eSB8fCBkZWZhdWx0T3B0aW9uLnZhbHVlOworICAgIH0KKworICAgIHJldHVybiB1bmRlZmluZWQ7CisgIH0KKworICBzdGF0aWMgZ2V0QWxsKGtpbmQgPSBudWxsKSB7CisgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZGVmYXVsdE9wdGlvbnMpIHsKKyAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb24gPSBkZWZhdWx0T3B0aW9uc1tuYW1lXTsKKworICAgICAgaWYgKGtpbmQpIHsKKyAgICAgICAgaWYgKChraW5kICYgZGVmYXVsdE9wdGlvbi5raW5kKSA9PT0gMCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtpbmQgPT09IE9wdGlvbktpbmQuUFJFRkVSRU5DRSkgeworICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVmYXVsdE9wdGlvbi52YWx1ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZVR5cGUgPSB0eXBlb2YgdmFsdWU7CisKKyAgICAgICAgICBpZiAodmFsdWVUeXBlID09PSAiYm9vbGVhbiIgfHwgdmFsdWVUeXBlID09PSAic3RyaW5nIiB8fCB2YWx1ZVR5cGUgPT09ICJudW1iZXIiICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CisgICAgICAgICAgICBvcHRpb25zW25hbWVdID0gdmFsdWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZSBmb3IgcHJlZmVyZW5jZTogJHtuYW1lfWApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNvbnN0IHVzZXJPcHRpb24gPSB1c2VyT3B0aW9uc1tuYW1lXTsKKyAgICAgIG9wdGlvbnNbbmFtZV0gPSB1c2VyT3B0aW9uICE9PSB1bmRlZmluZWQgPyB1c2VyT3B0aW9uIDogZGVmYXVsdE9wdGlvbi5jb21wYXRpYmlsaXR5IHx8IGRlZmF1bHRPcHRpb24udmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIG9wdGlvbnM7CisgIH0KKworICBzdGF0aWMgc2V0KG5hbWUsIHZhbHVlKSB7CisgICAgdXNlck9wdGlvbnNbbmFtZV0gPSB2YWx1ZTsKKyAgfQorCisgIHN0YXRpYyByZW1vdmUobmFtZSkgeworICAgIGRlbGV0ZSB1c2VyT3B0aW9uc1tuYW1lXTsKKyAgfQorCit9CisKK2V4cG9ydHMuQXBwT3B0aW9ucyA9IEFwcE9wdGlvbnM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9iYXNlX3RyZWVfdmlld2VyLmpzIGIvbGliL3dlYi9iYXNlX3RyZWVfdmlld2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YThlODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL2Jhc2VfdHJlZV92aWV3ZXIuanMKQEAgLTAsMCArMSwxMDAgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkJhc2VUcmVlVmlld2VyID0gdm9pZCAwOworCit2YXIgX3BkZiA9IHJlcXVpcmUoIi4uL3BkZiIpOworCitjbGFzcyBCYXNlVHJlZVZpZXdlciB7CisgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVRyZWVWaWV3ZXIpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGluaXRpYWxpemUgQmFzZVRyZWVWaWV3ZXIuIik7CisgICAgfQorCisgICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjsKKyAgICB0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1czsKKyAgICB0aGlzLnJlc2V0KCk7CisgIH0KKworICByZXNldCgpIHsKKyAgICB0aGlzLl9sYXN0VG9nZ2xlSXNTaG93ID0gdHJ1ZTsKKyAgICB0aGlzLmNvbnRhaW5lci50ZXh0Q29udGVudCA9ICIiOworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoInRyZWVXaXRoRGVlcE5lc3RpbmciKTsKKyAgfQorCisgIF9kaXNwYXRjaEV2ZW50KGNvdW50KSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IF9kaXNwYXRjaEV2ZW50Iik7CisgIH0KKworICBfYmluZExpbmsoZWxlbWVudCwgcGFyYW1zKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IF9iaW5kTGluayIpOworICB9CisKKyAgX25vcm1hbGl6ZVRleHRDb250ZW50KHN0cikgeworICAgIHJldHVybiAoMCwgX3BkZi5yZW1vdmVOdWxsQ2hhcmFjdGVycykoc3RyKSB8fCAiXHUyMDEzIjsKKyAgfQorCisgIF9hZGRUb2dnbGVCdXR0b24oZGl2LCBoaWRkZW4gPSBmYWxzZSkgeworICAgIGNvbnN0IHRvZ2dsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICB0b2dnbGVyLmNsYXNzTmFtZSA9ICJ0cmVlSXRlbVRvZ2dsZXIiOworCisgICAgaWYgKGhpZGRlbikgeworICAgICAgdG9nZ2xlci5jbGFzc0xpc3QuYWRkKCJ0cmVlSXRlbXNIaWRkZW4iKTsKKyAgICB9CisKKyAgICB0b2dnbGVyLm9uY2xpY2sgPSBldnQgPT4geworICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgdG9nZ2xlci5jbGFzc0xpc3QudG9nZ2xlKCJ0cmVlSXRlbXNIaWRkZW4iKTsKKworICAgICAgaWYgKGV2dC5zaGlmdEtleSkgeworICAgICAgICBjb25zdCBzaG91bGRTaG93QWxsID0gIXRvZ2dsZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0cmVlSXRlbXNIaWRkZW4iKTsKKworICAgICAgICB0aGlzLl90b2dnbGVUcmVlSXRlbShkaXYsIHNob3VsZFNob3dBbGwpOworICAgICAgfQorICAgIH07CisKKyAgICBkaXYuaW5zZXJ0QmVmb3JlKHRvZ2dsZXIsIGRpdi5maXJzdENoaWxkKTsKKyAgfQorCisgIF90b2dnbGVUcmVlSXRlbShyb290LCBzaG93ID0gZmFsc2UpIHsKKyAgICB0aGlzLl9sYXN0VG9nZ2xlSXNTaG93ID0gc2hvdzsKKworICAgIGZvciAoY29uc3QgdG9nZ2xlciBvZiByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi50cmVlSXRlbVRvZ2dsZXIiKSkgeworICAgICAgdG9nZ2xlci5jbGFzc0xpc3QudG9nZ2xlKCJ0cmVlSXRlbXNIaWRkZW4iLCAhc2hvdyk7CisgICAgfQorICB9CisKKyAgX3RvZ2dsZUFsbFRyZWVJdGVtcygpIHsKKyAgICB0aGlzLl90b2dnbGVUcmVlSXRlbSh0aGlzLmNvbnRhaW5lciwgIXRoaXMuX2xhc3RUb2dnbGVJc1Nob3cpOworICB9CisKKyAgcmVuZGVyKHBhcmFtcykgeworICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiByZW5kZXIiKTsKKyAgfQorCit9CisKK2V4cG9ydHMuQmFzZVRyZWVWaWV3ZXIgPSBCYXNlVHJlZVZpZXdlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL2Jhc2Vfdmlld2VyLmpzIGIvbGliL3dlYi9iYXNlX3ZpZXdlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RlMmExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9iYXNlX3ZpZXdlci5qcwpAQCAtMCwwICsxLDExODQgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkJhc2VWaWV3ZXIgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK3ZhciBfcGRmX3JlbmRlcmluZ19xdWV1ZSA9IHJlcXVpcmUoIi4vcGRmX3JlbmRlcmluZ19xdWV1ZS5qcyIpOworCit2YXIgX2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlciA9IHJlcXVpcmUoIi4vYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyLmpzIik7CisKK3ZhciBfcGRmID0gcmVxdWlyZSgiLi4vcGRmIik7CisKK3ZhciBfcGRmX3BhZ2VfdmlldyA9IHJlcXVpcmUoIi4vcGRmX3BhZ2Vfdmlldy5qcyIpOworCit2YXIgX3BkZl9saW5rX3NlcnZpY2UgPSByZXF1aXJlKCIuL3BkZl9saW5rX3NlcnZpY2UuanMiKTsKKwordmFyIF90ZXh0X2xheWVyX2J1aWxkZXIgPSByZXF1aXJlKCIuL3RleHRfbGF5ZXJfYnVpbGRlci5qcyIpOworCitjb25zdCBERUZBVUxUX0NBQ0hFX1NJWkUgPSAxMDsKKworZnVuY3Rpb24gUERGUGFnZVZpZXdCdWZmZXIoc2l6ZSkgeworICBjb25zdCBkYXRhID0gW107CisKKyAgdGhpcy5wdXNoID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgICBjb25zdCBpID0gZGF0YS5pbmRleE9mKHZpZXcpOworCisgICAgaWYgKGkgPj0gMCkgeworICAgICAgZGF0YS5zcGxpY2UoaSwgMSk7CisgICAgfQorCisgICAgZGF0YS5wdXNoKHZpZXcpOworCisgICAgaWYgKGRhdGEubGVuZ3RoID4gc2l6ZSkgeworICAgICAgZGF0YS5zaGlmdCgpLmRlc3Ryb3koKTsKKyAgICB9CisgIH07CisKKyAgdGhpcy5yZXNpemUgPSBmdW5jdGlvbiAobmV3U2l6ZSwgcGFnZXNUb0tlZXApIHsKKyAgICBzaXplID0gbmV3U2l6ZTsKKworICAgIGlmIChwYWdlc1RvS2VlcCkgeworICAgICAgY29uc3QgcGFnZUlkc1RvS2VlcCA9IG5ldyBTZXQoKTsKKworICAgICAgZm9yIChsZXQgaSA9IDAsIGlNYXggPSBwYWdlc1RvS2VlcC5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHsKKyAgICAgICAgcGFnZUlkc1RvS2VlcC5hZGQocGFnZXNUb0tlZXBbaV0uaWQpOworICAgICAgfQorCisgICAgICAoMCwgX3VpX3V0aWxzLm1vdmVUb0VuZE9mQXJyYXkpKGRhdGEsIGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICAgIHJldHVybiBwYWdlSWRzVG9LZWVwLmhhcyhwYWdlLmlkKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHdoaWxlIChkYXRhLmxlbmd0aCA+IHNpemUpIHsKKyAgICAgIGRhdGEuc2hpZnQoKS5kZXN0cm95KCk7CisgICAgfQorICB9OworfQorCitmdW5jdGlvbiBpc1NhbWVTY2FsZShvbGRTY2FsZSwgbmV3U2NhbGUpIHsKKyAgaWYgKG5ld1NjYWxlID09PSBvbGRTY2FsZSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKE1hdGguYWJzKG5ld1NjYWxlIC0gb2xkU2NhbGUpIDwgMWUtMTUpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgQmFzZVZpZXdlciB7CisgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVZpZXdlcikgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlVmlld2VyLiIpOworICAgIH0KKworICAgIHRoaXMuX25hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjsKKyAgICB0aGlzLnZpZXdlciA9IG9wdGlvbnMudmlld2VyIHx8IG9wdGlvbnMuY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkOworCisgICAgaWYgKCEodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRGl2RWxlbWVudCAmJiB0aGlzLnZpZXdlciBpbnN0YW5jZW9mIEhUTUxEaXZFbGVtZW50KSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGBjb250YWluZXJgIGFuZC9vciBgdmlld2VyYCBvcHRpb24uIik7CisgICAgfQorCisgICAgdGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7CisgICAgdGhpcy5saW5rU2VydmljZSA9IG9wdGlvbnMubGlua1NlcnZpY2UgfHwgbmV3IF9wZGZfbGlua19zZXJ2aWNlLlNpbXBsZUxpbmtTZXJ2aWNlKCk7CisgICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBvcHRpb25zLmRvd25sb2FkTWFuYWdlciB8fCBudWxsOworICAgIHRoaXMuZmluZENvbnRyb2xsZXIgPSBvcHRpb25zLmZpbmRDb250cm9sbGVyIHx8IG51bGw7CisgICAgdGhpcy5yZW1vdmVQYWdlQm9yZGVycyA9IG9wdGlvbnMucmVtb3ZlUGFnZUJvcmRlcnMgfHwgZmFsc2U7CisgICAgdGhpcy50ZXh0TGF5ZXJNb2RlID0gTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLnRleHRMYXllck1vZGUpID8gb3B0aW9ucy50ZXh0TGF5ZXJNb2RlIDogX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRU5BQkxFOworICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gb3B0aW9ucy5pbWFnZVJlc291cmNlc1BhdGggfHwgIiI7CisgICAgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gdHlwZW9mIG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9PT0gImJvb2xlYW4iID8gb3B0aW9ucy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIDogdHJ1ZTsKKyAgICB0aGlzLmVuYWJsZVByaW50QXV0b1JvdGF0ZSA9IG9wdGlvbnMuZW5hYmxlUHJpbnRBdXRvUm90YXRlIHx8IGZhbHNlOworICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zLnJlbmRlcmVyIHx8IF91aV91dGlscy5SZW5kZXJlclR5cGUuQ0FOVkFTOworICAgIHRoaXMuZW5hYmxlV2ViR0wgPSBvcHRpb25zLmVuYWJsZVdlYkdMIHx8IGZhbHNlOworICAgIHRoaXMudXNlT25seUNzc1pvb20gPSBvcHRpb25zLnVzZU9ubHlDc3Nab29tIHx8IGZhbHNlOworICAgIHRoaXMubWF4Q2FudmFzUGl4ZWxzID0gb3B0aW9ucy5tYXhDYW52YXNQaXhlbHM7CisgICAgdGhpcy5sMTBuID0gb3B0aW9ucy5sMTBuIHx8IF91aV91dGlscy5OdWxsTDEwbjsKKyAgICB0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSA9ICFvcHRpb25zLnJlbmRlcmluZ1F1ZXVlOworCisgICAgaWYgKHRoaXMuZGVmYXVsdFJlbmRlcmluZ1F1ZXVlKSB7CisgICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gbmV3IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlBERlJlbmRlcmluZ1F1ZXVlKCk7CisgICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlLnNldFZpZXdlcih0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZSA9IG9wdGlvbnMucmVuZGVyaW5nUXVldWU7CisgICAgfQorCisgICAgdGhpcy5zY3JvbGwgPSAoMCwgX3VpX3V0aWxzLndhdGNoU2Nyb2xsKSh0aGlzLmNvbnRhaW5lciwgdGhpcy5fc2Nyb2xsVXBkYXRlLmJpbmQodGhpcykpOworICAgIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID0gX3VpX3V0aWxzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZS5VTktOT1dOOworICAgIHRoaXMuX29uQmVmb3JlRHJhdyA9IHRoaXMuX29uQWZ0ZXJEcmF3ID0gbnVsbDsKKworICAgIHRoaXMuX3Jlc2V0VmlldygpOworCisgICAgaWYgKHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMpIHsKKyAgICAgIHRoaXMudmlld2VyLmNsYXNzTGlzdC5hZGQoInJlbW92ZVBhZ2VCb3JkZXJzIik7CisgICAgfQorCisgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJiYXNldmlld2VyaW5pdCIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzCisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorCisgIGdldCBwYWdlc0NvdW50KCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlcy5sZW5ndGg7CisgIH0KKworICBnZXRQYWdlVmlldyhpbmRleCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlc1tpbmRleF07CisgIH0KKworICBnZXQgcGFnZVZpZXdzUmVhZHkoKSB7CisgICAgaWYgKCF0aGlzLl9wYWdlc0NhcGFiaWxpdHkuc2V0dGxlZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0aGlzLl9wYWdlcy5ldmVyeShmdW5jdGlvbiAocGFnZVZpZXcpIHsKKyAgICAgIHJldHVybiBwYWdlVmlldyAmJiBwYWdlVmlldy5wZGZQYWdlOworICAgIH0pOworICB9CisKKyAgZ2V0IGN1cnJlbnRQYWdlTnVtYmVyKCkgeworICAgIHJldHVybiB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKyAgfQorCisgIHNldCBjdXJyZW50UGFnZU51bWJlcih2YWwpIHsKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsKSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhZ2UgbnVtYmVyLiIpOworICAgIH0KKworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIodmFsLCB0cnVlKSkgeworICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLl9uYW1lfS5jdXJyZW50UGFnZU51bWJlcjogIiR7dmFsfSIgaXMgbm90IGEgdmFsaWQgcGFnZS5gKTsKKyAgICB9CisgIH0KKworICBfc2V0Q3VycmVudFBhZ2VOdW1iZXIodmFsLCByZXNldEN1cnJlbnRQYWdlVmlldyA9IGZhbHNlKSB7CisgICAgaWYgKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID09PSB2YWwpIHsKKyAgICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykgeworICAgICAgICB0aGlzLl9yZXNldEN1cnJlbnRQYWdlVmlldygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoISgwIDwgdmFsICYmIHZhbCA8PSB0aGlzLnBhZ2VzQ291bnQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSB2YWw7CisgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgicGFnZWNoYW5naW5nIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZU51bWJlcjogdmFsLAorICAgICAgcGFnZUxhYmVsOiB0aGlzLl9wYWdlTGFiZWxzICYmIHRoaXMuX3BhZ2VMYWJlbHNbdmFsIC0gMV0KKyAgICB9KTsKKworICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykgeworICAgICAgdGhpcy5fcmVzZXRDdXJyZW50UGFnZVZpZXcoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGdldCBjdXJyZW50UGFnZUxhYmVsKCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlTGFiZWxzICYmIHRoaXMuX3BhZ2VMYWJlbHNbdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSAxXTsKKyAgfQorCisgIHNldCBjdXJyZW50UGFnZUxhYmVsKHZhbCkgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxldCBwYWdlID0gdmFsIHwgMDsKKworICAgIGlmICh0aGlzLl9wYWdlTGFiZWxzKSB7CisgICAgICBjb25zdCBpID0gdGhpcy5fcGFnZUxhYmVscy5pbmRleE9mKHZhbCk7CisKKyAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgcGFnZSA9IGkgKyAxOworICAgICAgfQorICAgIH0KKworICAgIGlmICghdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZSwgdHJ1ZSkpIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbmFtZX0uY3VycmVudFBhZ2VMYWJlbDogIiR7dmFsfSIgaXMgbm90IGEgdmFsaWQgcGFnZS5gKTsKKyAgICB9CisgIH0KKworICBnZXQgY3VycmVudFNjYWxlKCkgeworICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2NhbGUgIT09IF91aV91dGlscy5VTktOT1dOX1NDQUxFID8gdGhpcy5fY3VycmVudFNjYWxlIDogX3VpX3V0aWxzLkRFRkFVTFRfU0NBTEU7CisgIH0KKworICBzZXQgY3VycmVudFNjYWxlKHZhbCkgeworICAgIGlmIChpc05hTih2YWwpKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbnVtZXJpYyBzY2FsZS4iKTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9zZXRTY2FsZSh2YWwsIGZhbHNlKTsKKyAgfQorCisgIGdldCBjdXJyZW50U2NhbGVWYWx1ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fY3VycmVudFNjYWxlVmFsdWU7CisgIH0KKworICBzZXQgY3VycmVudFNjYWxlVmFsdWUodmFsKSB7CisgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fc2V0U2NhbGUodmFsLCBmYWxzZSk7CisgIH0KKworICBnZXQgcGFnZXNSb3RhdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZXNSb3RhdGlvbjsKKyAgfQorCisgIHNldCBwYWdlc1JvdGF0aW9uKHJvdGF0aW9uKSB7CisgICAgaWYgKCEoMCwgX3VpX3V0aWxzLmlzVmFsaWRSb3RhdGlvbikocm90YXRpb24pKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcGFnZXMgcm90YXRpb24gYW5nbGUuIik7CisgICAgfQorCisgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX3BhZ2VzUm90YXRpb24gPT09IHJvdGF0aW9uKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IHJvdGF0aW9uOworICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbaV07CisgICAgICBwYWdlVmlldy51cGRhdGUocGFnZVZpZXcuc2NhbGUsIHJvdGF0aW9uKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fY3VycmVudFNjYWxlVmFsdWUpIHsKKyAgICAgIHRoaXMuX3NldFNjYWxlKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJyb3RhdGlvbmNoYW5naW5nIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZXNSb3RhdGlvbjogcm90YXRpb24sCisgICAgICBwYWdlTnVtYmVyCisgICAgfSk7CisKKyAgICBpZiAodGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHsKKyAgICAgIHRoaXMudXBkYXRlKCk7CisgICAgfQorICB9CisKKyAgZ2V0IGZpcnN0UGFnZVByb21pc2UoKSB7CisgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UgOiBudWxsOworICB9CisKKyAgZ2V0IG9uZVBhZ2VSZW5kZXJlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHkucHJvbWlzZSA6IG51bGw7CisgIH0KKworICBnZXQgcGFnZXNQcm9taXNlKCkgeworICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5fcGFnZXNDYXBhYmlsaXR5LnByb21pc2UgOiBudWxsOworICB9CisKKyAgZ2V0IF92aWV3ZXJFbGVtZW50KCkgeworICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBfdmlld2VyRWxlbWVudCIpOworICB9CisKKyAgX29uZVBhZ2VSZW5kZXJlZE9yRm9yY2VGZXRjaCgpIHsKKyAgICBpZiAoIXRoaXMuY29udGFpbmVyLm9mZnNldFBhcmVudCB8fCB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKS52aWV3cy5sZW5ndGggPT09IDApIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHsKKyAgICBpZiAodGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgdGhpcy5fY2FuY2VsUmVuZGVyaW5nKCk7CisKKyAgICAgIHRoaXMuX3Jlc2V0VmlldygpOworCisgICAgICBpZiAodGhpcy5maW5kQ29udHJvbGxlcikgeworICAgICAgICB0aGlzLmZpbmRDb250cm9sbGVyLnNldERvY3VtZW50KG51bGwpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDsKKworICAgIGlmICghcGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBwYWdlc0NvdW50ID0gcGRmRG9jdW1lbnQubnVtUGFnZXM7CisgICAgY29uc3QgZmlyc3RQYWdlUHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldFBhZ2UoMSk7CisgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSBwZGZEb2N1bWVudC5hbm5vdGF0aW9uU3RvcmFnZTsKKyAgICBjb25zdCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7CisKKyAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInBhZ2VzbG9hZGVkIiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIHBhZ2VzQ291bnQKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fb25CZWZvcmVEcmF3ID0gZXZ0ID0+IHsKKyAgICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbZXZ0LnBhZ2VOdW1iZXIgLSAxXTsKKworICAgICAgaWYgKCFwYWdlVmlldykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2J1ZmZlci5wdXNoKHBhZ2VWaWV3KTsKKyAgICB9OworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInBhZ2VyZW5kZXIiLCB0aGlzLl9vbkJlZm9yZURyYXcpOworCisgICAgdGhpcy5fb25BZnRlckRyYXcgPSBldnQgPT4geworICAgICAgaWYgKGV2dC5jc3NUcmFuc2Zvcm0gfHwgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5zZXR0bGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgIHRoaXMuZXZlbnRCdXMuX29mZigicGFnZXJlbmRlcmVkIiwgdGhpcy5fb25BZnRlckRyYXcpOworCisgICAgICB0aGlzLl9vbkFmdGVyRHJhdyA9IG51bGw7CisgICAgfTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJwYWdlcmVuZGVyZWQiLCB0aGlzLl9vbkFmdGVyRHJhdyk7CisKKyAgICBmaXJzdFBhZ2VQcm9taXNlLnRoZW4oZmlyc3RQZGZQYWdlID0+IHsKKyAgICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucmVzb2x2ZShmaXJzdFBkZlBhZ2UpOworCisgICAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTsKKyAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5jdXJyZW50U2NhbGU7CisgICAgICBjb25zdCB2aWV3cG9ydCA9IGZpcnN0UGRmUGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgIHNjYWxlOiBzY2FsZSAqIF91aV91dGlscy5DU1NfVU5JVFMKKyAgICAgIH0pOworICAgICAgY29uc3QgdGV4dExheWVyRmFjdG9yeSA9IHRoaXMudGV4dExheWVyTW9kZSAhPT0gX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRElTQUJMRSA/IHRoaXMgOiBudWxsOworCisgICAgICBmb3IgKGxldCBwYWdlTnVtID0gMTsgcGFnZU51bSA8PSBwYWdlc0NvdW50OyArK3BhZ2VOdW0pIHsKKyAgICAgICAgY29uc3QgcGFnZVZpZXcgPSBuZXcgX3BkZl9wYWdlX3ZpZXcuUERGUGFnZVZpZXcoeworICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5fdmlld2VyRWxlbWVudCwKKyAgICAgICAgICBldmVudEJ1czogdGhpcy5ldmVudEJ1cywKKyAgICAgICAgICBpZDogcGFnZU51bSwKKyAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICBkZWZhdWx0Vmlld3BvcnQ6IHZpZXdwb3J0LmNsb25lKCksCisgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2UsCisgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSwKKyAgICAgICAgICByZW5kZXJpbmdRdWV1ZTogdGhpcy5yZW5kZXJpbmdRdWV1ZSwKKyAgICAgICAgICB0ZXh0TGF5ZXJGYWN0b3J5LAorICAgICAgICAgIHRleHRMYXllck1vZGU6IHRoaXMudGV4dExheWVyTW9kZSwKKyAgICAgICAgICBhbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OiB0aGlzLAorICAgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogdGhpcy5pbWFnZVJlc291cmNlc1BhdGgsCisgICAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLAorICAgICAgICAgIGVuYWJsZVdlYkdMOiB0aGlzLmVuYWJsZVdlYkdMLAorICAgICAgICAgIHVzZU9ubHlDc3Nab29tOiB0aGlzLnVzZU9ubHlDc3Nab29tLAorICAgICAgICAgIG1heENhbnZhc1BpeGVsczogdGhpcy5tYXhDYW52YXNQaXhlbHMsCisgICAgICAgICAgbDEwbjogdGhpcy5sMTBuCisgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX3BhZ2VzLnB1c2gocGFnZVZpZXcpOworICAgICAgfQorCisgICAgICBjb25zdCBmaXJzdFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbMF07CisKKyAgICAgIGlmIChmaXJzdFBhZ2VWaWV3KSB7CisgICAgICAgIGZpcnN0UGFnZVZpZXcuc2V0UGRmUGFnZShmaXJzdFBkZlBhZ2UpOworICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmNhY2hlUGFnZVJlZigxLCBmaXJzdFBkZlBhZ2UucmVmKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3NwcmVhZE1vZGUgIT09IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkUpIHsKKyAgICAgICAgdGhpcy5fdXBkYXRlU3ByZWFkTW9kZSgpOworICAgICAgfQorCisgICAgICB0aGlzLl9vbmVQYWdlUmVuZGVyZWRPckZvcmNlRmV0Y2goKS50aGVuKCgpID0+IHsKKyAgICAgICAgaWYgKHRoaXMuZmluZENvbnRyb2xsZXIpIHsKKyAgICAgICAgICB0aGlzLmZpbmRDb250cm9sbGVyLnNldERvY3VtZW50KHBkZkRvY3VtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwZGZEb2N1bWVudC5sb2FkaW5nUGFyYW1zLmRpc2FibGVBdXRvRmV0Y2ggfHwgcGFnZXNDb3VudCA+IDc1MDApIHsKKyAgICAgICAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbGV0IGdldFBhZ2VzTGVmdCA9IHBhZ2VzQ291bnQgLSAxOworCisgICAgICAgIGlmIChnZXRQYWdlc0xlZnQgPD0gMCkgeworICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGxldCBwYWdlTnVtID0gMjsgcGFnZU51bSA8PSBwYWdlc0NvdW50OyArK3BhZ2VOdW0pIHsKKyAgICAgICAgICBwZGZEb2N1bWVudC5nZXRQYWdlKHBhZ2VOdW0pLnRoZW4ocGRmUGFnZSA9PiB7CisgICAgICAgICAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3BhZ2VOdW0gLSAxXTsKKworICAgICAgICAgICAgaWYgKCFwYWdlVmlldy5wZGZQYWdlKSB7CisgICAgICAgICAgICAgIHBhZ2VWaWV3LnNldFBkZlBhZ2UocGRmUGFnZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuY2FjaGVQYWdlUmVmKHBhZ2VOdW0sIHBkZlBhZ2UucmVmKTsKKworICAgICAgICAgICAgaWYgKC0tZ2V0UGFnZXNMZWZ0ID09PSAwKSB7CisgICAgICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgcmVhc29uID0+IHsKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBnZXQgcGFnZSAke3BhZ2VOdW19IHRvIGluaXRpYWxpemUgdmlld2VyYCwgcmVhc29uKTsKKworICAgICAgICAgICAgaWYgKC0tZ2V0UGFnZXNMZWZ0ID09PSAwKSB7CisgICAgICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlc2luaXQiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcworICAgICAgfSk7CisKKyAgICAgIGlmICh0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSkgeworICAgICAgICB0aGlzLnVwZGF0ZSgpOworICAgICAgfQorICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSB2aWV3ZXIiLCByZWFzb24pOworICAgIH0pOworICB9CisKKyAgc2V0UGFnZUxhYmVscyhsYWJlbHMpIHsKKyAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWxhYmVscykgeworICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7CisgICAgfSBlbHNlIGlmICghKEFycmF5LmlzQXJyYXkobGFiZWxzKSAmJiB0aGlzLnBkZkRvY3VtZW50Lm51bVBhZ2VzID09PSBsYWJlbHMubGVuZ3RoKSkgeworICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7CisgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX25hbWV9LnNldFBhZ2VMYWJlbHM6IEludmFsaWQgcGFnZSBsYWJlbHMuYCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBsYWJlbHM7CisgICAgfQorCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1tpXTsKKyAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fcGFnZUxhYmVscyAmJiB0aGlzLl9wYWdlTGFiZWxzW2ldOworICAgICAgcGFnZVZpZXcuc2V0UGFnZUxhYmVsKGxhYmVsKTsKKyAgICB9CisgIH0KKworICBfcmVzZXRWaWV3KCkgeworICAgIHRoaXMuX3BhZ2VzID0gW107CisgICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSAxOworICAgIHRoaXMuX2N1cnJlbnRTY2FsZSA9IF91aV91dGlscy5VTktOT1dOX1NDQUxFOworICAgIHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlID0gbnVsbDsKKyAgICB0aGlzLl9wYWdlTGFiZWxzID0gbnVsbDsKKyAgICB0aGlzLl9idWZmZXIgPSBuZXcgUERGUGFnZVZpZXdCdWZmZXIoREVGQVVMVF9DQUNIRV9TSVpFKTsKKyAgICB0aGlzLl9sb2NhdGlvbiA9IG51bGw7CisgICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IDA7CisgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGw7CisgICAgdGhpcy5fcGFnZXNSZXF1ZXN0cyA9IG5ldyBXZWFrTWFwKCk7CisgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eSA9ICgwLCBfcGRmLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHkgPSAoMCwgX3BkZi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkgPSAoMCwgX3BkZi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICB0aGlzLl9zY3JvbGxNb2RlID0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuVkVSVElDQUw7CisgICAgdGhpcy5fc3ByZWFkTW9kZSA9IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkU7CisKKyAgICBpZiAodGhpcy5fb25CZWZvcmVEcmF3KSB7CisgICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoInBhZ2VyZW5kZXIiLCB0aGlzLl9vbkJlZm9yZURyYXcpOworCisgICAgICB0aGlzLl9vbkJlZm9yZURyYXcgPSBudWxsOworICAgIH0KKworICAgIGlmICh0aGlzLl9vbkFmdGVyRHJhdykgeworICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKCJwYWdlcmVuZGVyZWQiLCB0aGlzLl9vbkFmdGVyRHJhdyk7CisKKyAgICAgIHRoaXMuX29uQWZ0ZXJEcmF3ID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLnZpZXdlci50ZXh0Q29udGVudCA9ICIiOworCisgICAgdGhpcy5fdXBkYXRlU2Nyb2xsTW9kZSgpOworICB9CisKKyAgX3Njcm9sbFVwZGF0ZSgpIHsKKyAgICBpZiAodGhpcy5wYWdlc0NvdW50ID09PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy51cGRhdGUoKTsKKyAgfQorCisgIF9zY3JvbGxJbnRvVmlldyh7CisgICAgcGFnZURpdiwKKyAgICBwYWdlU3BvdCA9IG51bGwsCisgICAgcGFnZU51bWJlciA9IG51bGwKKyAgfSkgeworICAgICgwLCBfdWlfdXRpbHMuc2Nyb2xsSW50b1ZpZXcpKHBhZ2VEaXYsIHBhZ2VTcG90KTsKKyAgfQorCisgIF9zZXRTY2FsZVVwZGF0ZVBhZ2VzKG5ld1NjYWxlLCBuZXdWYWx1ZSwgbm9TY3JvbGwgPSBmYWxzZSwgcHJlc2V0ID0gZmFsc2UpIHsKKyAgICB0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSA9IG5ld1ZhbHVlLnRvU3RyaW5nKCk7CisKKyAgICBpZiAoaXNTYW1lU2NhbGUodGhpcy5fY3VycmVudFNjYWxlLCBuZXdTY2FsZSkpIHsKKyAgICAgIGlmIChwcmVzZXQpIHsKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgic2NhbGVjaGFuZ2luZyIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgc2NhbGU6IG5ld1NjYWxlLAorICAgICAgICAgIHByZXNldFZhbHVlOiBuZXdWYWx1ZQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHRoaXMuX3BhZ2VzW2ldLnVwZGF0ZShuZXdTY2FsZSk7CisgICAgfQorCisgICAgdGhpcy5fY3VycmVudFNjYWxlID0gbmV3U2NhbGU7CisKKyAgICBpZiAoIW5vU2Nyb2xsKSB7CisgICAgICBsZXQgcGFnZSA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyLAorICAgICAgICAgIGRlc3Q7CisKKyAgICAgIGlmICh0aGlzLl9sb2NhdGlvbiAmJiAhKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgdGhpcy5pc0NoYW5naW5nUHJlc2VudGF0aW9uTW9kZSkpIHsKKyAgICAgICAgcGFnZSA9IHRoaXMuX2xvY2F0aW9uLnBhZ2VOdW1iZXI7CisgICAgICAgIGRlc3QgPSBbbnVsbCwgeworICAgICAgICAgIG5hbWU6ICJYWVoiCisgICAgICAgIH0sIHRoaXMuX2xvY2F0aW9uLmxlZnQsIHRoaXMuX2xvY2F0aW9uLnRvcCwgbnVsbF07CisgICAgICB9CisKKyAgICAgIHRoaXMuc2Nyb2xsUGFnZUludG9WaWV3KHsKKyAgICAgICAgcGFnZU51bWJlcjogcGFnZSwKKyAgICAgICAgZGVzdEFycmF5OiBkZXN0LAorICAgICAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0OiB0cnVlCisgICAgICB9KTsKKyAgICB9CisKKyAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJzY2FsZWNoYW5naW5nIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgc2NhbGU6IG5ld1NjYWxlLAorICAgICAgcHJlc2V0VmFsdWU6IHByZXNldCA/IG5ld1ZhbHVlIDogdW5kZWZpbmVkCisgICAgfSk7CisKKyAgICBpZiAodGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHsKKyAgICAgIHRoaXMudXBkYXRlKCk7CisgICAgfQorICB9CisKKyAgX3NldFNjYWxlKHZhbHVlLCBub1Njcm9sbCA9IGZhbHNlKSB7CisgICAgbGV0IHNjYWxlID0gcGFyc2VGbG9hdCh2YWx1ZSk7CisKKyAgICBpZiAoc2NhbGUgPiAwKSB7CisgICAgICB0aGlzLl9zZXRTY2FsZVVwZGF0ZVBhZ2VzKHNjYWxlLCB2YWx1ZSwgbm9TY3JvbGwsIGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSB0aGlzLl9wYWdlc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdOworCisgICAgICBpZiAoIWN1cnJlbnRQYWdlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3Qgbm9QYWRkaW5nID0gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSB8fCB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzOworICAgICAgbGV0IGhQYWRkaW5nID0gbm9QYWRkaW5nID8gMCA6IF91aV91dGlscy5TQ1JPTExCQVJfUEFERElORzsKKyAgICAgIGxldCB2UGFkZGluZyA9IG5vUGFkZGluZyA/IDAgOiBfdWlfdXRpbHMuVkVSVElDQUxfUEFERElORzsKKworICAgICAgaWYgKCFub1BhZGRpbmcgJiYgdGhpcy5faXNTY3JvbGxNb2RlSG9yaXpvbnRhbCkgeworICAgICAgICBbaFBhZGRpbmcsIHZQYWRkaW5nXSA9IFt2UGFkZGluZywgaFBhZGRpbmddOworICAgICAgfQorCisgICAgICBjb25zdCBwYWdlV2lkdGhTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCAtIGhQYWRkaW5nKSAvIGN1cnJlbnRQYWdlLndpZHRoICogY3VycmVudFBhZ2Uuc2NhbGU7CisgICAgICBjb25zdCBwYWdlSGVpZ2h0U2NhbGUgPSAodGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdlBhZGRpbmcpIC8gY3VycmVudFBhZ2UuaGVpZ2h0ICogY3VycmVudFBhZ2Uuc2NhbGU7CisKKyAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgY2FzZSAicGFnZS1hY3R1YWwiOgorICAgICAgICAgIHNjYWxlID0gMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJwYWdlLXdpZHRoIjoKKyAgICAgICAgICBzY2FsZSA9IHBhZ2VXaWR0aFNjYWxlOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInBhZ2UtaGVpZ2h0IjoKKyAgICAgICAgICBzY2FsZSA9IHBhZ2VIZWlnaHRTY2FsZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJwYWdlLWZpdCI6CisgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihwYWdlV2lkdGhTY2FsZSwgcGFnZUhlaWdodFNjYWxlKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJhdXRvIjoKKyAgICAgICAgICBjb25zdCBob3Jpem9udGFsU2NhbGUgPSAoMCwgX3VpX3V0aWxzLmlzUG9ydHJhaXRPcmllbnRhdGlvbikoY3VycmVudFBhZ2UpID8gcGFnZVdpZHRoU2NhbGUgOiBNYXRoLm1pbihwYWdlSGVpZ2h0U2NhbGUsIHBhZ2VXaWR0aFNjYWxlKTsKKyAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKF91aV91dGlscy5NQVhfQVVUT19TQ0FMRSwgaG9yaXpvbnRhbFNjYWxlKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbmFtZX0uX3NldFNjYWxlOiAiJHt2YWx1ZX0iIGlzIGFuIHVua25vd24gem9vbSB2YWx1ZS5gKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX3NldFNjYWxlVXBkYXRlUGFnZXMoc2NhbGUsIHZhbHVlLCBub1Njcm9sbCwgdHJ1ZSk7CisgICAgfQorICB9CisKKyAgX3Jlc2V0Q3VycmVudFBhZ2VWaWV3KCkgeworICAgIGlmICh0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICB0aGlzLl9zZXRTY2FsZSh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdOworCisgICAgdGhpcy5fc2Nyb2xsSW50b1ZpZXcoeworICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2CisgICAgfSk7CisgIH0KKworICBzY3JvbGxQYWdlSW50b1ZpZXcoeworICAgIHBhZ2VOdW1iZXIsCisgICAgZGVzdEFycmF5ID0gbnVsbCwKKyAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0ID0gZmFsc2UsCisgICAgaWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2UKKyAgfSkgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHBhZ2VWaWV3ID0gTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSAmJiB0aGlzLl9wYWdlc1twYWdlTnVtYmVyIC0gMV07CisKKyAgICBpZiAoIXBhZ2VWaWV3KSB7CisgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX25hbWV9LnNjcm9sbFBhZ2VJbnRvVmlldzogYCArIGAiJHtwYWdlTnVtYmVyfSIgaXMgbm90IGEgdmFsaWQgcGFnZU51bWJlciBwYXJhbWV0ZXIuYCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgIWRlc3RBcnJheSkgeworICAgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlciwgdHJ1ZSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZXQgeCA9IDAsCisgICAgICAgIHkgPSAwOworICAgIGxldCB3aWR0aCA9IDAsCisgICAgICAgIGhlaWdodCA9IDAsCisgICAgICAgIHdpZHRoU2NhbGUsCisgICAgICAgIGhlaWdodFNjYWxlOworICAgIGNvbnN0IGNoYW5nZU9yaWVudGF0aW9uID0gcGFnZVZpZXcucm90YXRpb24gJSAxODAgIT09IDA7CisgICAgY29uc3QgcGFnZVdpZHRoID0gKGNoYW5nZU9yaWVudGF0aW9uID8gcGFnZVZpZXcuaGVpZ2h0IDogcGFnZVZpZXcud2lkdGgpIC8gcGFnZVZpZXcuc2NhbGUgLyBfdWlfdXRpbHMuQ1NTX1VOSVRTOworICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSAoY2hhbmdlT3JpZW50YXRpb24gPyBwYWdlVmlldy53aWR0aCA6IHBhZ2VWaWV3LmhlaWdodCkgLyBwYWdlVmlldy5zY2FsZSAvIF91aV91dGlscy5DU1NfVU5JVFM7CisgICAgbGV0IHNjYWxlID0gMDsKKworICAgIHN3aXRjaCAoZGVzdEFycmF5WzFdLm5hbWUpIHsKKyAgICAgIGNhc2UgIlhZWiI6CisgICAgICAgIHggPSBkZXN0QXJyYXlbMl07CisgICAgICAgIHkgPSBkZXN0QXJyYXlbM107CisgICAgICAgIHNjYWxlID0gZGVzdEFycmF5WzRdOworICAgICAgICB4ID0geCAhPT0gbnVsbCA/IHggOiAwOworICAgICAgICB5ID0geSAhPT0gbnVsbCA/IHkgOiBwYWdlSGVpZ2h0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiRml0IjoKKyAgICAgIGNhc2UgIkZpdEIiOgorICAgICAgICBzY2FsZSA9ICJwYWdlLWZpdCI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJGaXRIIjoKKyAgICAgIGNhc2UgIkZpdEJIIjoKKyAgICAgICAgeSA9IGRlc3RBcnJheVsyXTsKKyAgICAgICAgc2NhbGUgPSAicGFnZS13aWR0aCI7CisKKyAgICAgICAgaWYgKHkgPT09IG51bGwgJiYgdGhpcy5fbG9jYXRpb24pIHsKKyAgICAgICAgICB4ID0gdGhpcy5fbG9jYXRpb24ubGVmdDsKKyAgICAgICAgICB5ID0gdGhpcy5fbG9jYXRpb24udG9wOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIkZpdFYiOgorICAgICAgY2FzZSAiRml0QlYiOgorICAgICAgICB4ID0gZGVzdEFycmF5WzJdOworICAgICAgICB3aWR0aCA9IHBhZ2VXaWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gcGFnZUhlaWdodDsKKyAgICAgICAgc2NhbGUgPSAicGFnZS1oZWlnaHQiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiRml0UiI6CisgICAgICAgIHggPSBkZXN0QXJyYXlbMl07CisgICAgICAgIHkgPSBkZXN0QXJyYXlbM107CisgICAgICAgIHdpZHRoID0gZGVzdEFycmF5WzRdIC0geDsKKyAgICAgICAgaGVpZ2h0ID0gZGVzdEFycmF5WzVdIC0geTsKKyAgICAgICAgY29uc3QgaFBhZGRpbmcgPSB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzID8gMCA6IF91aV91dGlscy5TQ1JPTExCQVJfUEFERElORzsKKyAgICAgICAgY29uc3QgdlBhZGRpbmcgPSB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzID8gMCA6IF91aV91dGlscy5WRVJUSUNBTF9QQURESU5HOworICAgICAgICB3aWR0aFNjYWxlID0gKHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoIC0gaFBhZGRpbmcpIC8gd2lkdGggLyBfdWlfdXRpbHMuQ1NTX1VOSVRTOworICAgICAgICBoZWlnaHRTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgLSB2UGFkZGluZykgLyBoZWlnaHQgLyBfdWlfdXRpbHMuQ1NTX1VOSVRTOworICAgICAgICBzY2FsZSA9IE1hdGgubWluKE1hdGguYWJzKHdpZHRoU2NhbGUpLCBNYXRoLmFicyhoZWlnaHRTY2FsZSkpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLl9uYW1lfS5zY3JvbGxQYWdlSW50b1ZpZXc6IGAgKyBgIiR7ZGVzdEFycmF5WzFdLm5hbWV9IiBpcyBub3QgYSB2YWxpZCBkZXN0aW5hdGlvbiB0eXBlLmApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFpZ25vcmVEZXN0aW5hdGlvblpvb20pIHsKKyAgICAgIGlmIChzY2FsZSAmJiBzY2FsZSAhPT0gdGhpcy5fY3VycmVudFNjYWxlKSB7CisgICAgICAgIHRoaXMuY3VycmVudFNjYWxlVmFsdWUgPSBzY2FsZTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudFNjYWxlID09PSBfdWlfdXRpbHMuVU5LTk9XTl9TQ0FMRSkgeworICAgICAgICB0aGlzLmN1cnJlbnRTY2FsZVZhbHVlID0gX3VpX3V0aWxzLkRFRkFVTFRfU0NBTEVfVkFMVUU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNjYWxlID09PSAicGFnZS1maXQiICYmICFkZXN0QXJyYXlbNF0pIHsKKyAgICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHsKKyAgICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2LAorICAgICAgICBwYWdlTnVtYmVyCisgICAgICB9KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IFtwYWdlVmlldy52aWV3cG9ydC5jb252ZXJ0VG9WaWV3cG9ydFBvaW50KHgsIHkpLCBwYWdlVmlldy52aWV3cG9ydC5jb252ZXJ0VG9WaWV3cG9ydFBvaW50KHggKyB3aWR0aCwgeSArIGhlaWdodCldOworICAgIGxldCBsZWZ0ID0gTWF0aC5taW4oYm91bmRpbmdSZWN0WzBdWzBdLCBib3VuZGluZ1JlY3RbMV1bMF0pOworICAgIGxldCB0b3AgPSBNYXRoLm1pbihib3VuZGluZ1JlY3RbMF1bMV0sIGJvdW5kaW5nUmVjdFsxXVsxXSk7CisKKyAgICBpZiAoIWFsbG93TmVnYXRpdmVPZmZzZXQpIHsKKyAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCAwKTsKKyAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgMCk7CisgICAgfQorCisgICAgdGhpcy5fc2Nyb2xsSW50b1ZpZXcoeworICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2LAorICAgICAgcGFnZVNwb3Q6IHsKKyAgICAgICAgbGVmdCwKKyAgICAgICAgdG9wCisgICAgICB9LAorICAgICAgcGFnZU51bWJlcgorICAgIH0pOworICB9CisKKyAgX3VwZGF0ZUxvY2F0aW9uKGZpcnN0UGFnZSkgeworICAgIGNvbnN0IGN1cnJlbnRTY2FsZSA9IHRoaXMuX2N1cnJlbnRTY2FsZTsKKyAgICBjb25zdCBjdXJyZW50U2NhbGVWYWx1ZSA9IHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlOworICAgIGNvbnN0IG5vcm1hbGl6ZWRTY2FsZVZhbHVlID0gcGFyc2VGbG9hdChjdXJyZW50U2NhbGVWYWx1ZSkgPT09IGN1cnJlbnRTY2FsZSA/IE1hdGgucm91bmQoY3VycmVudFNjYWxlICogMTAwMDApIC8gMTAwIDogY3VycmVudFNjYWxlVmFsdWU7CisgICAgY29uc3QgcGFnZU51bWJlciA9IGZpcnN0UGFnZS5pZDsKKyAgICBsZXQgcGRmT3BlblBhcmFtcyA9ICIjcGFnZT0iICsgcGFnZU51bWJlcjsKKyAgICBwZGZPcGVuUGFyYW1zICs9ICImem9vbT0iICsgbm9ybWFsaXplZFNjYWxlVmFsdWU7CisgICAgY29uc3QgY3VycmVudFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbcGFnZU51bWJlciAtIDFdOworICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOworICAgIGNvbnN0IHRvcExlZnQgPSBjdXJyZW50UGFnZVZpZXcuZ2V0UGFnZVBvaW50KGNvbnRhaW5lci5zY3JvbGxMZWZ0IC0gZmlyc3RQYWdlLngsIGNvbnRhaW5lci5zY3JvbGxUb3AgLSBmaXJzdFBhZ2UueSk7CisgICAgY29uc3QgaW50TGVmdCA9IE1hdGgucm91bmQodG9wTGVmdFswXSk7CisgICAgY29uc3QgaW50VG9wID0gTWF0aC5yb3VuZCh0b3BMZWZ0WzFdKTsKKyAgICBwZGZPcGVuUGFyYW1zICs9ICIsIiArIGludExlZnQgKyAiLCIgKyBpbnRUb3A7CisgICAgdGhpcy5fbG9jYXRpb24gPSB7CisgICAgICBwYWdlTnVtYmVyLAorICAgICAgc2NhbGU6IG5vcm1hbGl6ZWRTY2FsZVZhbHVlLAorICAgICAgdG9wOiBpbnRUb3AsCisgICAgICBsZWZ0OiBpbnRMZWZ0LAorICAgICAgcm90YXRpb246IHRoaXMuX3BhZ2VzUm90YXRpb24sCisgICAgICBwZGZPcGVuUGFyYW1zCisgICAgfTsKKyAgfQorCisgIF91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IF91cGRhdGVIZWxwZXIiKTsKKyAgfQorCisgIHVwZGF0ZSgpIHsKKyAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCk7CisKKyAgICBjb25zdCB2aXNpYmxlUGFnZXMgPSB2aXNpYmxlLnZpZXdzLAorICAgICAgICAgIG51bVZpc2libGVQYWdlcyA9IHZpc2libGVQYWdlcy5sZW5ndGg7CisKKyAgICBpZiAobnVtVmlzaWJsZVBhZ2VzID09PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgbmV3Q2FjaGVTaXplID0gTWF0aC5tYXgoREVGQVVMVF9DQUNIRV9TSVpFLCAyICogbnVtVmlzaWJsZVBhZ2VzICsgMSk7CisKKyAgICB0aGlzLl9idWZmZXIucmVzaXplKG5ld0NhY2hlU2l6ZSwgdmlzaWJsZVBhZ2VzKTsKKworICAgIHRoaXMucmVuZGVyaW5nUXVldWUucmVuZGVySGlnaGVzdFByaW9yaXR5KHZpc2libGUpOworCisgICAgdGhpcy5fdXBkYXRlSGVscGVyKHZpc2libGVQYWdlcyk7CisKKyAgICB0aGlzLl91cGRhdGVMb2NhdGlvbih2aXNpYmxlLmZpcnN0KTsKKworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInVwZGF0ZXZpZXdhcmVhIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgbG9jYXRpb246IHRoaXMuX2xvY2F0aW9uCisgICAgfSk7CisgIH0KKworICBjb250YWluc0VsZW1lbnQoZWxlbWVudCkgeworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KTsKKyAgfQorCisgIGZvY3VzKCkgeworICAgIHRoaXMuY29udGFpbmVyLmZvY3VzKCk7CisgIH0KKworICBnZXQgX2lzU2Nyb2xsTW9kZUhvcml6b250YWwoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBmYWxzZSA6IHRoaXMuX3Njcm9sbE1vZGUgPT09IF91aV91dGlscy5TY3JvbGxNb2RlLkhPUklaT05UQUw7CisgIH0KKworICBnZXQgaXNJblByZXNlbnRhdGlvbk1vZGUoKSB7CisgICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID09PSBfdWlfdXRpbHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlLkZVTExTQ1JFRU47CisgIH0KKworICBnZXQgaXNDaGFuZ2luZ1ByZXNlbnRhdGlvbk1vZGUoKSB7CisgICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID09PSBfdWlfdXRpbHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlLkNIQU5HSU5HOworICB9CisKKyAgZ2V0IGlzSG9yaXpvbnRhbFNjcm9sbGJhckVuYWJsZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBmYWxzZSA6IHRoaXMuY29udGFpbmVyLnNjcm9sbFdpZHRoID4gdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGg7CisgIH0KKworICBnZXQgaXNWZXJ0aWNhbFNjcm9sbGJhckVuYWJsZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBmYWxzZSA6IHRoaXMuY29udGFpbmVyLnNjcm9sbEhlaWdodCA+IHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodDsKKyAgfQorCisgIF9nZXRDdXJyZW50VmlzaWJsZVBhZ2UoKSB7CisgICAgaWYgKCF0aGlzLnBhZ2VzQ291bnQpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZpZXdzOiBbXQorICAgICAgfTsKKyAgICB9CisKKyAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07CisgICAgY29uc3QgZWxlbWVudCA9IHBhZ2VWaWV3LmRpdjsKKyAgICBjb25zdCB2aWV3ID0geworICAgICAgaWQ6IHBhZ2VWaWV3LmlkLAorICAgICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0LAorICAgICAgeTogZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcCwKKyAgICAgIHZpZXc6IHBhZ2VWaWV3CisgICAgfTsKKyAgICByZXR1cm4geworICAgICAgZmlyc3Q6IHZpZXcsCisgICAgICBsYXN0OiB2aWV3LAorICAgICAgdmlld3M6IFt2aWV3XQorICAgIH07CisgIH0KKworICBfZ2V0VmlzaWJsZVBhZ2VzKCkgeworICAgIHJldHVybiAoMCwgX3VpX3V0aWxzLmdldFZpc2libGVFbGVtZW50cykodGhpcy5jb250YWluZXIsIHRoaXMuX3BhZ2VzLCB0cnVlLCB0aGlzLl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsKTsKKyAgfQorCisgIGlzUGFnZVZpc2libGUocGFnZU51bWJlcikgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChwYWdlTnVtYmVyIDwgMSB8fCBwYWdlTnVtYmVyID4gdGhpcy5wYWdlc0NvdW50KSB7CisgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX25hbWV9LmlzUGFnZVZpc2libGU6ICIke3BhZ2VOdW1iZXJ9IiBpcyBvdXQgb2YgYm91bmRzLmApOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKS52aWV3cy5zb21lKGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICByZXR1cm4gdmlldy5pZCA9PT0gcGFnZU51bWJlcjsKKyAgICB9KTsKKyAgfQorCisgIGNsZWFudXAoKSB7CisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgaWYgKHRoaXMuX3BhZ2VzW2ldICYmIHRoaXMuX3BhZ2VzW2ldLnJlbmRlcmluZ1N0YXRlICE9PSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQpIHsKKyAgICAgICAgdGhpcy5fcGFnZXNbaV0ucmVzZXQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfY2FuY2VsUmVuZGVyaW5nKCkgeworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGlmICh0aGlzLl9wYWdlc1tpXSkgeworICAgICAgICB0aGlzLl9wYWdlc1tpXS5jYW5jZWxSZW5kZXJpbmcoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfZW5zdXJlUGRmUGFnZUxvYWRlZChwYWdlVmlldykgeworICAgIGlmIChwYWdlVmlldy5wZGZQYWdlKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhZ2VWaWV3LnBkZlBhZ2UpOworICAgIH0KKworICAgIGlmICh0aGlzLl9wYWdlc1JlcXVlc3RzLmhhcyhwYWdlVmlldykpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlc1JlcXVlc3RzLmdldChwYWdlVmlldyk7CisgICAgfQorCisgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShwYWdlVmlldy5pZCkudGhlbihwZGZQYWdlID0+IHsKKyAgICAgIGlmICghcGFnZVZpZXcucGRmUGFnZSkgeworICAgICAgICBwYWdlVmlldy5zZXRQZGZQYWdlKHBkZlBhZ2UpOworICAgICAgfQorCisgICAgICB0aGlzLl9wYWdlc1JlcXVlc3RzLmRlbGV0ZShwYWdlVmlldyk7CisKKyAgICAgIHJldHVybiBwZGZQYWdlOworICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gZ2V0IHBhZ2UgZm9yIHBhZ2UgdmlldyIsIHJlYXNvbik7CisKKyAgICAgIHRoaXMuX3BhZ2VzUmVxdWVzdHMuZGVsZXRlKHBhZ2VWaWV3KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3BhZ2VzUmVxdWVzdHMuc2V0KHBhZ2VWaWV3LCBwcm9taXNlKTsKKworICAgIHJldHVybiBwcm9taXNlOworICB9CisKKyAgZm9yY2VSZW5kZXJpbmcoY3VycmVudGx5VmlzaWJsZVBhZ2VzKSB7CisgICAgY29uc3QgdmlzaWJsZVBhZ2VzID0gY3VycmVudGx5VmlzaWJsZVBhZ2VzIHx8IHRoaXMuX2dldFZpc2libGVQYWdlcygpOworCisgICAgY29uc3Qgc2Nyb2xsQWhlYWQgPSB0aGlzLl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsID8gdGhpcy5zY3JvbGwucmlnaHQgOiB0aGlzLnNjcm9sbC5kb3duOworICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5yZW5kZXJpbmdRdWV1ZS5nZXRIaWdoZXN0UHJpb3JpdHkodmlzaWJsZVBhZ2VzLCB0aGlzLl9wYWdlcywgc2Nyb2xsQWhlYWQpOworCisgICAgaWYgKHBhZ2VWaWV3KSB7CisgICAgICB0aGlzLl9lbnN1cmVQZGZQYWdlTG9hZGVkKHBhZ2VWaWV3KS50aGVuKCgpID0+IHsKKyAgICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZS5yZW5kZXJWaWV3KHBhZ2VWaWV3KTsKKyAgICAgIH0pOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjcmVhdGVUZXh0TGF5ZXJCdWlsZGVyKHRleHRMYXllckRpdiwgcGFnZUluZGV4LCB2aWV3cG9ydCwgZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBmYWxzZSwgZXZlbnRCdXMpIHsKKyAgICByZXR1cm4gbmV3IF90ZXh0X2xheWVyX2J1aWxkZXIuVGV4dExheWVyQnVpbGRlcih7CisgICAgICB0ZXh0TGF5ZXJEaXYsCisgICAgICBldmVudEJ1cywKKyAgICAgIHBhZ2VJbmRleCwKKyAgICAgIHZpZXdwb3J0LAorICAgICAgZmluZENvbnRyb2xsZXI6IHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBudWxsIDogdGhpcy5maW5kQ29udHJvbGxlciwKKyAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlID8gZmFsc2UgOiBlbmhhbmNlVGV4dFNlbGVjdGlvbgorICAgIH0pOworICB9CisKKyAgY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlcihwYWdlRGl2LCBwZGZQYWdlLCBhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsIGltYWdlUmVzb3VyY2VzUGF0aCA9ICIiLCByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gZmFsc2UsIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4pIHsKKyAgICByZXR1cm4gbmV3IF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIuQW5ub3RhdGlvbkxheWVyQnVpbGRlcih7CisgICAgICBwYWdlRGl2LAorICAgICAgcGRmUGFnZSwKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLAorICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoLAorICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgIGxpbmtTZXJ2aWNlOiB0aGlzLmxpbmtTZXJ2aWNlLAorICAgICAgZG93bmxvYWRNYW5hZ2VyOiB0aGlzLmRvd25sb2FkTWFuYWdlciwKKyAgICAgIGwxMG4KKyAgICB9KTsKKyAgfQorCisgIGdldCBoYXNFcXVhbFBhZ2VTaXplcygpIHsKKyAgICBjb25zdCBmaXJzdFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbMF07CisKKyAgICBmb3IgKGxldCBpID0gMSwgaWkgPSB0aGlzLl9wYWdlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW2ldOworCisgICAgICBpZiAocGFnZVZpZXcud2lkdGggIT09IGZpcnN0UGFnZVZpZXcud2lkdGggfHwgcGFnZVZpZXcuaGVpZ2h0ICE9PSBmaXJzdFBhZ2VWaWV3LmhlaWdodCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBnZXRQYWdlc092ZXJ2aWV3KCkgeworICAgIGNvbnN0IHBhZ2VzT3ZlcnZpZXcgPSB0aGlzLl9wYWdlcy5tYXAoZnVuY3Rpb24gKHBhZ2VWaWV3KSB7CisgICAgICBjb25zdCB2aWV3cG9ydCA9IHBhZ2VWaWV3LnBkZlBhZ2UuZ2V0Vmlld3BvcnQoeworICAgICAgICBzY2FsZTogMQorICAgICAgfSk7CisgICAgICByZXR1cm4geworICAgICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsCisgICAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LAorICAgICAgICByb3RhdGlvbjogdmlld3BvcnQucm90YXRpb24KKyAgICAgIH07CisgICAgfSk7CisKKyAgICBpZiAoIXRoaXMuZW5hYmxlUHJpbnRBdXRvUm90YXRlKSB7CisgICAgICByZXR1cm4gcGFnZXNPdmVydmlldzsKKyAgICB9CisKKyAgICByZXR1cm4gcGFnZXNPdmVydmlldy5tYXAoZnVuY3Rpb24gKHNpemUpIHsKKyAgICAgIGlmICgoMCwgX3VpX3V0aWxzLmlzUG9ydHJhaXRPcmllbnRhdGlvbikoc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICB9CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIHdpZHRoOiBzaXplLmhlaWdodCwKKyAgICAgICAgaGVpZ2h0OiBzaXplLndpZHRoLAorICAgICAgICByb3RhdGlvbjogKHNpemUucm90YXRpb24gKyA5MCkgJSAzNjAKKyAgICAgIH07CisgICAgfSk7CisgIH0KKworICBnZXQgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSgpIHsKKyAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CisgICAgfQorCisgICAgaWYgKCF0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7CisgICAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTsKKyAgfQorCisgIHNldCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKHByb21pc2UpIHsKKyAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlOiAke3Byb21pc2V9YCk7CisgICAgfQorCisgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCF0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IHByb21pc2U7CisKKyAgICBmb3IgKGNvbnN0IHBhZ2VWaWV3IG9mIHRoaXMuX3BhZ2VzKSB7CisgICAgICBwYWdlVmlldy51cGRhdGUocGFnZVZpZXcuc2NhbGUsIHBhZ2VWaWV3LnJvdGF0aW9uLCBwcm9taXNlKTsKKyAgICB9CisKKyAgICB0aGlzLnVwZGF0ZSgpOworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goIm9wdGlvbmFsY29udGVudGNvbmZpZ2NoYW5nZWQiLCB7CisgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICBwcm9taXNlCisgICAgfSk7CisgIH0KKworICBnZXQgc2Nyb2xsTW9kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fc2Nyb2xsTW9kZTsKKyAgfQorCisgIHNldCBzY3JvbGxNb2RlKG1vZGUpIHsKKyAgICBpZiAodGhpcy5fc2Nyb2xsTW9kZSA9PT0gbW9kZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghKDAsIF91aV91dGlscy5pc1ZhbGlkU2Nyb2xsTW9kZSkobW9kZSkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY3JvbGwgbW9kZTogJHttb2RlfWApOworICAgIH0KKworICAgIHRoaXMuX3Njcm9sbE1vZGUgPSBtb2RlOworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInNjcm9sbG1vZGVjaGFuZ2VkIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgbW9kZQorICAgIH0pOworCisgICAgdGhpcy5fdXBkYXRlU2Nyb2xsTW9kZSh0aGlzLl9jdXJyZW50UGFnZU51bWJlcik7CisgIH0KKworICBfdXBkYXRlU2Nyb2xsTW9kZShwYWdlTnVtYmVyID0gbnVsbCkgeworICAgIGNvbnN0IHNjcm9sbE1vZGUgPSB0aGlzLl9zY3JvbGxNb2RlLAorICAgICAgICAgIHZpZXdlciA9IHRoaXMudmlld2VyOworICAgIHZpZXdlci5jbGFzc0xpc3QudG9nZ2xlKCJzY3JvbGxIb3Jpem9udGFsIiwgc2Nyb2xsTW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuSE9SSVpPTlRBTCk7CisgICAgdmlld2VyLmNsYXNzTGlzdC50b2dnbGUoInNjcm9sbFdyYXBwZWQiLCBzY3JvbGxNb2RlID09PSBfdWlfdXRpbHMuU2Nyb2xsTW9kZS5XUkFQUEVEKTsKKworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCB8fCAhcGFnZU51bWJlcikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSAmJiBpc05hTih0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSkpIHsKKyAgICAgIHRoaXMuX3NldFNjYWxlKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyLCB0cnVlKTsKKworICAgIHRoaXMudXBkYXRlKCk7CisgIH0KKworICBnZXQgc3ByZWFkTW9kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fc3ByZWFkTW9kZTsKKyAgfQorCisgIHNldCBzcHJlYWRNb2RlKG1vZGUpIHsKKyAgICBpZiAodGhpcy5fc3ByZWFkTW9kZSA9PT0gbW9kZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghKDAsIF91aV91dGlscy5pc1ZhbGlkU3ByZWFkTW9kZSkobW9kZSkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcHJlYWQgbW9kZTogJHttb2RlfWApOworICAgIH0KKworICAgIHRoaXMuX3NwcmVhZE1vZGUgPSBtb2RlOworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInNwcmVhZG1vZGVjaGFuZ2VkIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgbW9kZQorICAgIH0pOworCisgICAgdGhpcy5fdXBkYXRlU3ByZWFkTW9kZSh0aGlzLl9jdXJyZW50UGFnZU51bWJlcik7CisgIH0KKworICBfdXBkYXRlU3ByZWFkTW9kZShwYWdlTnVtYmVyID0gbnVsbCkgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHZpZXdlciA9IHRoaXMudmlld2VyLAorICAgICAgICAgIHBhZ2VzID0gdGhpcy5fcGFnZXM7CisgICAgdmlld2VyLnRleHRDb250ZW50ID0gIiI7CisKKyAgICBpZiAodGhpcy5fc3ByZWFkTW9kZSA9PT0gX3VpX3V0aWxzLlNwcmVhZE1vZGUuTk9ORSkgeworICAgICAgZm9yIChsZXQgaSA9IDAsIGlNYXggPSBwYWdlcy5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHsKKyAgICAgICAgdmlld2VyLmFwcGVuZENoaWxkKHBhZ2VzW2ldLmRpdik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHBhcml0eSA9IHRoaXMuX3NwcmVhZE1vZGUgLSAxOworICAgICAgbGV0IHNwcmVhZCA9IG51bGw7CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpTWF4ID0gcGFnZXMubGVuZ3RoOyBpIDwgaU1heDsgKytpKSB7CisgICAgICAgIGlmIChzcHJlYWQgPT09IG51bGwpIHsKKyAgICAgICAgICBzcHJlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgICAgICBzcHJlYWQuY2xhc3NOYW1lID0gInNwcmVhZCI7CisgICAgICAgICAgdmlld2VyLmFwcGVuZENoaWxkKHNwcmVhZCk7CisgICAgICAgIH0gZWxzZSBpZiAoaSAlIDIgPT09IHBhcml0eSkgeworICAgICAgICAgIHNwcmVhZCA9IHNwcmVhZC5jbG9uZU5vZGUoZmFsc2UpOworICAgICAgICAgIHZpZXdlci5hcHBlbmRDaGlsZChzcHJlYWQpOworICAgICAgICB9CisKKyAgICAgICAgc3ByZWFkLmFwcGVuZENoaWxkKHBhZ2VzW2ldLmRpdik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFwYWdlTnVtYmVyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlciwgdHJ1ZSk7CisKKyAgICB0aGlzLnVwZGF0ZSgpOworICB9CisKK30KKworZXhwb3J0cy5CYXNlVmlld2VyID0gQmFzZVZpZXdlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL2Nocm9tZWNvbS5qcyBiL2xpYi93ZWIvY2hyb21lY29tLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDdiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL2Nocm9tZWNvbS5qcwpAQCAtMCwwICsxLDM5MiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQ2hyb21lQ29tID0gdm9pZCAwOworCit2YXIgX2FwcCA9IHJlcXVpcmUoIi4vYXBwLmpzIik7CisKK3ZhciBfYXBwX29wdGlvbnMgPSByZXF1aXJlKCIuL2FwcF9vcHRpb25zLmpzIik7CisKK3ZhciBfcHJlZmVyZW5jZXMgPSByZXF1aXJlKCIuL3ByZWZlcmVuY2VzLmpzIik7CisKK3ZhciBfZG93bmxvYWRfbWFuYWdlciA9IHJlcXVpcmUoIi4vZG93bmxvYWRfbWFuYWdlci5qcyIpOworCit2YXIgX2dlbmVyaWNsMTBuID0gcmVxdWlyZSgiLi9nZW5lcmljbDEwbi5qcyIpOworCit7CisgIHRocm93IG5ldyBFcnJvcignTW9kdWxlICJwZGZqcy13ZWIvY2hyb21lY29tIiBzaGFsbCBub3QgYmUgdXNlZCBvdXRzaWRlIENIUk9NRSBidWlsZC4nKTsKK30KK2NvbnN0IENocm9tZUNvbSA9IHsKKyAgcmVxdWVzdChhY3Rpb24sIGRhdGEsIGNhbGxiYWNrKSB7CisgICAgY29uc3QgbWVzc2FnZSA9IHsKKyAgICAgIGFjdGlvbiwKKyAgICAgIGRhdGEKKyAgICB9OworCisgICAgaWYgKCFjaHJvbWUucnVudGltZSkgeworICAgICAgY29uc29sZS5lcnJvcigiY2hyb21lLnJ1bnRpbWUgaXMgdW5kZWZpbmVkLiIpOworCisgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7CisgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZShtZXNzYWdlLCBjYWxsYmFjayk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0KKyAgfSwKKworICByZXNvbHZlUERGRmlsZShmaWxlLCBvdmVybGF5TWFuYWdlciwgY2FsbGJhY2spIHsKKyAgICBmaWxlID0gZmlsZS5yZXBsYWNlKC9eZHJpdmU6L2ksICJmaWxlc3lzdGVtOiIgKyBsb2NhdGlvbi5vcmlnaW4gKyAiL2V4dGVybmFsLyIpOworCisgICAgaWYgKC9eaHR0cHM/Oi8udGVzdChmaWxlKSkgeworICAgICAgc2V0UmVmZXJlcihmaWxlLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGNhbGxiYWNrKGZpbGUpOworICAgICAgfSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKC9eZmlsZT86Ly50ZXN0KGZpbGUpKSB7CisgICAgICBnZXRFbWJlZGRlck9yaWdpbihmdW5jdGlvbiAob3JpZ2luKSB7CisgICAgICAgIGlmIChvcmlnaW4gJiYgIS9eZmlsZTp8XmNocm9tZS1leHRlbnNpb246Ly50ZXN0KG9yaWdpbikpIHsKKyAgICAgICAgICBfYXBwLlBERlZpZXdlckFwcGxpY2F0aW9uLmVycm9yKCJCbG9ja2VkICIgKyBvcmlnaW4gKyAiIGZyb20gbG9hZGluZyAiICsgZmlsZSArICIuIFJlZnVzZWQgdG8gbG9hZCBhIGxvY2FsIGZpbGUgaW4gYSBub24tbG9jYWwgcGFnZSAiICsgImZvciBzZWN1cml0eSByZWFzb25zLiIpOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXNBbGxvd2VkRmlsZVNjaGVtZUFjY2VzcyhmdW5jdGlvbiAoaXNBbGxvd2VkQWNjZXNzKSB7CisgICAgICAgICAgaWYgKGlzQWxsb3dlZEFjY2VzcykgeworICAgICAgICAgICAgY2FsbGJhY2soZmlsZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcXVlc3RBY2Nlc3NUb0xvY2FsRmlsZShmaWxlLCBvdmVybGF5TWFuYWdlciwgY2FsbGJhY2spOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYWxsYmFjayhmaWxlKTsKKyAgfQorCit9OworZXhwb3J0cy5DaHJvbWVDb20gPSBDaHJvbWVDb207CisKK2Z1bmN0aW9uIGdldEVtYmVkZGVyT3JpZ2luKGNhbGxiYWNrKSB7CisgIGNvbnN0IG9yaWdpbiA9IHdpbmRvdyA9PT0gdG9wID8gbG9jYXRpb24ub3JpZ2luIDogbG9jYXRpb24uYW5jZXN0b3JPcmlnaW5zWzBdOworCisgIGlmIChvcmlnaW4gPT09ICJudWxsIikgeworICAgIGdldFBhcmVudE9yaWdpbihjYWxsYmFjayk7CisgIH0gZWxzZSB7CisgICAgY2FsbGJhY2sob3JpZ2luKTsKKyAgfQorfQorCitmdW5jdGlvbiBnZXRQYXJlbnRPcmlnaW4oY2FsbGJhY2spIHsKKyAgQ2hyb21lQ29tLnJlcXVlc3QoImdldFBhcmVudE9yaWdpbiIsIG51bGwsIGNhbGxiYWNrKTsKK30KKworZnVuY3Rpb24gaXNBbGxvd2VkRmlsZVNjaGVtZUFjY2VzcyhjYWxsYmFjaykgeworICBDaHJvbWVDb20ucmVxdWVzdCgiaXNBbGxvd2VkRmlsZVNjaGVtZUFjY2VzcyIsIG51bGwsIGNhbGxiYWNrKTsKK30KKworZnVuY3Rpb24gaXNSdW50aW1lQXZhaWxhYmxlKCkgeworICB0cnkgeworICAgIGlmIChjaHJvbWUucnVudGltZSAmJiBjaHJvbWUucnVudGltZS5nZXRNYW5pZmVzdCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0gY2F0Y2ggKGUpIHt9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitmdW5jdGlvbiByZWxvYWRJZlJ1bnRpbWVJc1VuYXZhaWxhYmxlKCkgeworICBpZiAoIWlzUnVudGltZUF2YWlsYWJsZSgpKSB7CisgICAgbG9jYXRpb24ucmVsb2FkKCk7CisgIH0KK30KKworbGV0IGNocm9tZUZpbGVBY2Nlc3NPdmVybGF5UHJvbWlzZTsKKworZnVuY3Rpb24gcmVxdWVzdEFjY2Vzc1RvTG9jYWxGaWxlKGZpbGVVcmwsIG92ZXJsYXlNYW5hZ2VyLCBjYWxsYmFjaykgeworICBsZXQgb25DbG9zZU92ZXJsYXkgPSBudWxsOworCisgIGlmICh0b3AgIT09IHdpbmRvdykgeworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsIHJlbG9hZElmUnVudGltZUlzVW5hdmFpbGFibGUpOworCisgICAgb25DbG9zZU92ZXJsYXkgPSBmdW5jdGlvbiAoKSB7CisgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCByZWxvYWRJZlJ1bnRpbWVJc1VuYXZhaWxhYmxlKTsKKyAgICAgIHJlbG9hZElmUnVudGltZUlzVW5hdmFpbGFibGUoKTsKKyAgICAgIG92ZXJsYXlNYW5hZ2VyLmNsb3NlKCJjaHJvbWVGaWxlQWNjZXNzT3ZlcmxheSIpOworICAgIH07CisgIH0KKworICBpZiAoIWNocm9tZUZpbGVBY2Nlc3NPdmVybGF5UHJvbWlzZSkgeworICAgIGNocm9tZUZpbGVBY2Nlc3NPdmVybGF5UHJvbWlzZSA9IG92ZXJsYXlNYW5hZ2VyLnJlZ2lzdGVyKCJjaHJvbWVGaWxlQWNjZXNzT3ZlcmxheSIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaHJvbWVGaWxlQWNjZXNzT3ZlcmxheSIpLCBvbkNsb3NlT3ZlcmxheSwgdHJ1ZSk7CisgIH0KKworICBjaHJvbWVGaWxlQWNjZXNzT3ZlcmxheVByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CisgICAgY29uc3QgaWNvblBhdGggPSBjaHJvbWUucnVudGltZS5nZXRNYW5pZmVzdCgpLmljb25zWzQ4XTsKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hyb21lLXBkZmpzLWxvZ28tYmciKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCIgKyBjaHJvbWUucnVudGltZS5nZXRVUkwoaWNvblBhdGgpICsgIikiOworICAgIGNvbnN0IGkxOG5GaWxlQWNjZXNzTGFiZWwgPSB7CisgICAgICAiYW0iOiAiXHUxMjA4XHUxMzRiXHUxMmVkXHUxMjBkIFx1MTJlOVx1MTJhMFx1MTIyZFx1MTJhNFx1MTIwZFx1MTJjZVx1MTI3ZCBcdTEyMThcdTEyZjNcdTEyMjhcdTEyM2IgXHUxMzRkXHUxMjQwXHUxMmY1IiwKKyAgICAgICJhciI6ICJcdTIwMGZcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDVcdTA2MjdcdTA2MmQgXHUwNjI4XHUwNjI3XHUwNjQ0XHUwNjJmXHUwNjJlXHUwNjQ4XHUwNjQ0IFx1MDYyNVx1MDY0NFx1MDY0OSBcdTA2MzlcdTA2NDZcdTA2MjdcdTA2NDhcdTA2NGFcdTA2NDYgVVJMIFx1MDY0NFx1MDY0NFx1MDY0NVx1MDY0NFx1MDY0MVx1MDYyN1x1MDYyYSIsCisgICAgICAiYmciOiAiXHUwNDE0XHUwNDMwIFx1MDQ0MVx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzVcdTA0NDhcdTA0MzggXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRhXHUwNDNmIFx1MDQzNFx1MDQzZSBVUkwgXHUwNDMwXHUwNDM0XHUwNDQwXHUwNDM1XHUwNDQxXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDJcdTA0MzUiLAorICAgICAgImJuIjogIlx1MDlhYlx1MDliZVx1MDk4N1x1MDliMiBVUkxcdTA5OTdcdTA5YzFcdTA5YjJcdTA5YmZcdTA5YTRcdTA5YzcgXHUwOTg1XHUwOWNkXHUwOWFmXHUwOWJlXHUwOTk1XHUwOWNkXHUwOWI4XHUwOWM3XHUwOWI4IFx1MDlhZVx1MDk5ZVx1MDljZFx1MDk5Y1x1MDljMVx1MDliMCBcdTA5OTVcdTA5YjBcdTA5YzFcdTA5YTgiLAorICAgICAgImNhIjogIlBlcm1ldCBsJ2FjY1x1MDBlOXMgYWxzIFVSTCBkZSBmaXR4ZXIiLAorICAgICAgImNzIjogIlVtb1x1MDE3ZW5pdCBwXHUwMTU5XHUwMGVkc3R1cCBrIGFkcmVzXHUwMGUxbSBVUkwgc291Ym9yXHUwMTZmIiwKKyAgICAgICJkYSI6ICJUaWxsYWQgYWRnYW5nIHRpbCB3ZWJhZHJlc3NlciBwXHUwMGU1IGZpbGVyIiwKKyAgICAgICJkZSI6ICJadWdyaWZmIGF1ZiBEYXRlaS1VUkxzIHp1bGFzc2VuIiwKKyAgICAgICJlbCI6ICJcdTAzOWRcdTAzYjEgXHUwM2I1XHUwM2MwXHUwM2I5XHUwM2M0XHUwM2MxXHUwM2FkXHUwM2MwXHUwM2I1XHUwM2M0XHUwM2IxXHUwM2I5IFx1MDNiNyBcdTAzYzBcdTAzYzFcdTAzY2NcdTAzYzNcdTAzYjJcdTAzYjFcdTAzYzNcdTAzYjcgXHUwM2MzXHUwM2I1IFx1MDNiNFx1MDNiOVx1MDNiNVx1MDNjNVx1MDNiOFx1MDNjZFx1MDNiZFx1MDNjM1x1MDNiNVx1MDNiOVx1MDNjMiBVUkwgXHUwM2IxXHUwM2MxXHUwM2M3XHUwM2I1XHUwM2FmXHUwM2M5XHUwM2JkIiwKKyAgICAgICJlbi1HQiI6ICJBbGxvdyBhY2Nlc3MgdG8gZmlsZSBVUkxzIiwKKyAgICAgICJlcyI6ICJQZXJtaXRpciBhY2Nlc28gYSBVUkwgZGUgYXJjaGl2byIsCisgICAgICAiZXMtNDE5IjogIlBlcm1pdGlyIGVsIGFjY2VzbyBhIGxhcyBVUkwgZGVsIGFyY2hpdm8iLAorICAgICAgImV0IjogIkx1YmEganV1cmRlcFx1MDBlNFx1MDBlNHMgZmFpbGlkZSBVUkwtaWRlbGUiLAorICAgICAgImZhIjogIlx1MjAwZlx1MDYyN1x1MDYyY1x1MDYyN1x1MDYzMlx1MDY0N1x1MDY1NCBcdTA2MmZcdTA2MzNcdTA2MmFcdTA2MzFcdTA2MzNcdTA2Y2MgXHUwNjI4XHUwNjQ3IFVSTCBcdTA2NDdcdTA2MjdcdTA2Y2MgXHUwNjQxXHUwNjI3XHUwNmNjXHUwNjQ0IiwKKyAgICAgICJmaSI6ICJTYWxsaSB0aWVkb3N0b2plbiBVUkwtb3NvaXR0ZWlkZW4ga1x1MDBlNHl0dFx1MDBmNiIsCisgICAgICAiZmlsIjogIlBheWFnYW4gYW5nIGFjY2VzcyBuYSBtYWctZmlsZSBuZyBtZ2EgVVJMIiwKKyAgICAgICJmciI6ICJBdXRvcmlzZXIgbCdhY2NcdTAwZThzIGF1eCBVUkwgZGUgZmljaGllciIsCisgICAgICAiZ3UiOiAiVVJMIFx1MGFhYlx1MGFiZVx1MGE4N1x1MGFiMiBcdTBhOTVcdTBhYjBcdTBhYjVcdTBhYmUgXHUwYThkXHUwYTk1XHUwYWNkXHUwYWI4XHUwYWM3XHUwYWI4XHUwYWE4XHUwYWMwIFx1MGFhZVx1MGE4Mlx1MGE5Y1x1MGFjMlx1MGFiMFx1MGFjMCBcdTBhODZcdTBhYWFcdTBhY2IiLAorICAgICAgImhpIjogIlx1MDkyYlx1MDkzY1x1MDkzZVx1MDkwN1x1MDkzMiBVUkwgXHUwOTI0XHUwOTE1IFx1MDkyYVx1MDkzOVx1MDk0MVx1MDkwMlx1MDkxYVx1MDkyOFx1MDk0NyBcdTA5MTVcdTA5NDAgXHUwOTA1XHUwOTI4XHUwOTQxXHUwOTJlXHUwOTI0XHUwOTNmIFx1MDkyNlx1MDk0N1x1MDkwMiIsCisgICAgICAiaHIiOiAiRG96dm9saSBwcmlzdHVwIFVSTC1vdmltYSBkYXRvdGVrZSIsCisgICAgICAiaHUiOiAiRlx1MDBlMWpsIFVSTC1la2hleiB2YWxcdTAwZjMgaG96elx1MDBlMWZcdTAwZTlyXHUwMGU5cyBlbmdlZFx1MDBlOWx5ZXpcdTAwZTlzZSIsCisgICAgICAiaWQiOiAiSXppbmthbiBha3NlcyBrZSBVUkwgZmlsZSIsCisgICAgICAiaXQiOiAiQ29uc2VudGkgbCdhY2Nlc3NvIGFnbGkgVVJMIGRlaSBmaWxlIiwKKyAgICAgICJpdyI6ICJcdTA1ZDBcdTA1ZTRcdTA1ZTlcdTA1ZTggXHUwNWQyXHUwNWQ5XHUwNWU5XHUwNWQ0IFx1MDVkY1x1MDVkYlx1MDVlYVx1MDVkNVx1MDVkMVx1MDVkNVx1MDVlYSBcdTA1ZDBcdTA1ZWFcdTA1ZThcdTA1ZDlcdTA1ZGQgXHUwNWU5XHUwNWRjIFx1MDVlN1x1MDVkMVx1MDVlNlx1MDVkOVx1MDVkZCIsCisgICAgICAiamEiOiAiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlIFVSTCBcdTMwNzhcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTMwOTJcdThhMzFcdTUzZWZcdTMwNTlcdTMwOGIiLAorICAgICAgImtuIjogIlVSTCBcdTBjOTdcdTBjYjNcdTBjYThcdTBjY2RcdTBjYThcdTBjYzEgXHUwY2FiXHUwY2M4XHUwY2IyXHUwY2NkXHUyMDBjXHUwYzk3XHUwY2IzXHUwY2JmXHUwYzk3XHUwY2M2IFx1MGNhYVx1MGNjZFx1MGNiMFx1MGNiNVx1MGNjN1x1MGNiNlx1MGNiZlx1MGNiOFx1MGNiMlx1MGNjMSBcdTBjODVcdTBjYThcdTBjYzFcdTBjYWVcdTBjYTRcdTBjYmZcdTBjYjhcdTBjYmYiLAorICAgICAgImtvIjogIlx1ZDMwY1x1Yzc3YyBVUkxcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU2MVx1YzEzOFx1YzJhNCBcdWQ1YzhcdWM2YTkiLAorICAgICAgImx0IjogIkxlaXN0aSBwYXNpZWt0aSBmYWlsbyBVUkwiLAorICAgICAgImx2IjogIkF0XHUwMTNjYXV0IHBpZWtcdTAxM2N1dmkgZmFpbGEgdmlldHJcdTAxMDFcdTAxN2VpZW0gVVJMIiwKKyAgICAgICJtbCI6ICJVUkwgXHUwZDE1XHUwZDMzXHUwZDRkXHUyMDBkXHUyMDBjIFx1MGQyYlx1MGQyZlx1MGQzMlx1MGQ0ZFx1MjAwZFx1MjAwYyBcdTBkMWFcdTBkNDZcdTBkMmZcdTBkNGRcdTBkMmZcdTBkNDFcdTBkMjhcdTBkNGRcdTBkMjhcdTBkMjRcdTBkM2ZcdTBkMjhcdTBkNGQgXHUwZDA2XHUwZDE1XHUwZDRkXHUyMDBkXHUwZDM4XHUwZDM4XHUwZDRkXHUwZDM4XHUwZDRkIFx1MGQwNVx1MGQyOFx1MGQ0MVx1MGQzNVx1MGQyNlx1MGQzZlx1MGQxNVx1MGQ0ZFx1MGQxNVx1MGQ0MVx1MGQxNSIsCisgICAgICAibXIiOiAiXHUwOTJiXHUwOTNlXHUwOTA3XHUwOTMyIFVSTCBcdTA5MmVcdTA5MjdcdTA5NGRcdTA5MmZcdTA5NDcgXHUwOTJhXHUwOTRkXHUwOTMwXHUwOTM1XHUwOTQ3XHUwOTM2XHUwOTNlXHUwOTM4IFx1MDkwNVx1MDkyOFx1MDk0MVx1MDkyZVx1MDkyNFx1MDk0MCBcdTA5MjZcdTA5NGRcdTA5MmZcdTA5M2UiLAorICAgICAgIm1zIjogIk1lbWJlbmFya2FuIGFrc2VzIGtlIFVSTCBmYWlsIiwKKyAgICAgICJubCI6ICJUb2VnYW5nIHRvdCBiZXN0YW5kLVVSTCdzIHRvZXN0YWFuIiwKKyAgICAgICJubyI6ICJUaWxsYXQgdGlsZ2FuZyB0aWwgZmlsbmV0dGFkcmVzc2VyIiwKKyAgICAgICJwbCI6ICJaZXp3YWxhaiBuYSBkb3N0XHUwMTE5cCBkbyBhZHJlc1x1MDBmM3cgVVJMIHBsaWtcdTAwZjN3IiwKKyAgICAgICJwdC1CUiI6ICJQZXJtaXRpciBhY2Vzc28gYW9zIFVSTHMgZG8gYXJxdWl2byIsCisgICAgICAicHQtUFQiOiAiUGVybWl0aXIgYWNlc3NvIGEgVVJMcyBkZSBmaWNoZWlybyIsCisgICAgICAicm8iOiAiUGVybWl0ZSBhY2Nlc3VsIGxhIGFkcmVzZWxlIFVSTCBkZSBmaVx1MDIxOWllcmUiLAorICAgICAgInJ1IjogIlx1MDQyMFx1MDQzMFx1MDQzN1x1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzZlx1MDQzZSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzBcdTA0M2MiLAorICAgICAgInNrIjogIlBvdm9saVx1MDE2NSBwclx1MDBlZHN0dXAgayB3ZWJvdlx1MDBmZG0gYWRyZXNcdTAwZTFtIHNcdTAwZmFib3J1IiwKKyAgICAgICJzbCI6ICJEb3ZvbGkgZG9zdG9wIGRvIFVSTC1qZXYgZGF0b3Rla2UiLAorICAgICAgInNyIjogIlx1MDQxNFx1MDQzZVx1MDQzN1x1MDQzMlx1MDQzZVx1MDQzYlx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2YgVVJMIFx1MDQzMFx1MDQzNFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQzMFx1MDQzY1x1MDQzMCBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAiLAorICAgICAgInN2IjogIlRpbGxcdTAwZTV0IFx1MDBlNXRrb21zdCB0aWxsIHdlYmJhZHJlc3NlciBpIGZpbGVuIiwKKyAgICAgICJzdyI6ICJSdWh1c3Uga3VmaWtpYSBVUkwgemEgZmFpbGkiLAorICAgICAgInRhIjogIlx1MGI5NVx1MGJjYlx1MGJhYVx1MGJjZFx1MGJhYVx1MGJjMSAgVVJMXHUwYjk1XHUwYmIzXHUwYmMxXHUwYjk1XHUwYmNkXHUwYjk1XHUwYmMxIFx1MGI4NVx1MGJhM1x1MGJjMVx1MGI5NVx1MGJiMlx1MGJjOCBcdTBiODVcdTBiYTlcdTBiYzFcdTBiYWVcdTBiYTRcdTBiYmYiLAorICAgICAgInRlIjogIlx1MGMyYlx1MGM0OFx1MGMzMlx1MGM0ZCBVUkxcdTBjMzJcdTBjMTVcdTBjNDEgXHUwYzJhXHUwYzRkXHUwYzMwXHUwYzNlXHUwYzJhXHUwYzRkXHUwYzI0XHUwYzNmXHUwYzI4XHUwYzNmIFx1MGMwNVx1MGMyOFx1MGM0MVx1MGMyZVx1MGMyNFx1MGMzZlx1MGMwMlx1MGMxYVx1MGM0MSIsCisgICAgICAidGgiOiAiXHUwZTJkXHUwZTE5XHUwZTM4XHUwZTBkXHUwZTMyXHUwZTE1XHUwZTQzXHUwZTJiXHUwZTQ5XHUwZTQwXHUwZTAyXHUwZTQ5XHUwZTMyXHUwZTE2XHUwZTM2XHUwZTA3XHUwZTQ0XHUwZTFmXHUwZTI1XHUwZTRjIFVSTCIsCisgICAgICAidHIiOiAiRG9zeWEgVVJMJ2xlcmluZSBlcmlcdTAxNWZpbWUgaXppbiB2ZXIiLAorICAgICAgInVrIjogIlx1MDQxZFx1MDQzMFx1MDQzNFx1MDQzMFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzOCBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2YgXHUwNDM0XHUwNDNlIFVSTC1cdTA0MzBcdTA0MzRcdTA0NDBcdTA0MzVcdTA0NDEgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDQzIiwKKyAgICAgICJ2aSI6ICJDaG8gcGhcdTAwZTlwIHRydXkgY1x1MWVhZHAgdlx1MDBlMG8gY1x1MDBlMWMgVVJMIGNcdTFlZTdhIHRcdTFlYzdwIiwKKyAgICAgICJ6aC1DTiI6ICJcdTUxNDFcdThiYjhcdThiYmZcdTk1ZWVcdTY1ODdcdTRlZjZcdTdmNTFcdTU3NDAiLAorICAgICAgInpoLVRXIjogIlx1NTE0MVx1OGEzMVx1NWI1OFx1NTNkNlx1NmE5NFx1Njg0OFx1N2RiMlx1NTc0MCIKKyAgICB9W2Nocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UgJiYgY2hyb21lLmkxOG4uZ2V0VUlMYW5ndWFnZSgpXTsKKworICAgIGlmIChpMThuRmlsZUFjY2Vzc0xhYmVsKSB7CisgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hyb21lLWZpbGUtYWNjZXNzLWxhYmVsIikudGV4dENvbnRlbnQgPSBpMThuRmlsZUFjY2Vzc0xhYmVsOworICAgIH0KKworICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hyb21lLWxpbmstdG8tZXh0ZW5zaW9ucy1wYWdlIik7CisgICAgbGluay5ocmVmID0gImNocm9tZTovL2V4dGVuc2lvbnMvP2lkPSIgKyBjaHJvbWUucnVudGltZS5pZDsKKworICAgIGxpbmsub25jbGljayA9IGZ1bmN0aW9uIChlKSB7CisgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICBDaHJvbWVDb20ucmVxdWVzdCgib3BlbkV4dGVuc2lvbnNQYWdlRm9yRmlsZUFjY2VzcyIsIHsKKyAgICAgICAgbmV3VGFiOiBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5IHx8IGUuYnV0dG9uID09PSAxIHx8IHdpbmRvdyAhPT0gdG9wCisgICAgICB9KTsKKyAgICB9OworCisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNocm9tZS11cmwtb2YtbG9jYWwtZmlsZSIpLnRleHRDb250ZW50ID0gZmlsZVVybDsKKworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaHJvbWUtZmlsZS1mYWxsYmFjayIpLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkgeworICAgICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXNbMF07CisKKyAgICAgIGlmIChmaWxlKSB7CisgICAgICAgIGNvbnN0IG9yaWdpbmFsRmlsZW5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsZVVybC5zcGxpdCgiLyIpLnBvcCgpKTsKKyAgICAgICAgbGV0IG9yaWdpbmFsVXJsID0gZmlsZVVybDsKKworICAgICAgICBpZiAob3JpZ2luYWxGaWxlbmFtZSAhPT0gZmlsZS5uYW1lKSB7CisgICAgICAgICAgY29uc3QgbXNnID0gIlRoZSBzZWxlY3RlZCBmaWxlIGRvZXMgbm90IG1hdGNoIHRoZSBvcmlnaW5hbCBmaWxlLiIgKyAiXG5PcmlnaW5hbDogIiArIG9yaWdpbmFsRmlsZW5hbWUgKyAiXG5TZWxlY3RlZDogIiArIGZpbGUubmFtZSArICJcbkRvIHlvdSB3YW50IHRvIG9wZW4gdGhlIHNlbGVjdGVkIGZpbGU/IjsKKworICAgICAgICAgIGlmICghY29uZmlybShtc2cpKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgb3JpZ2luYWxVcmwgPSAiZmlsZTovLy9mYWtlcGF0aC90by8iICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGUubmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBjYWxsYmFjayhVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpLCBmaWxlLnNpemUsIG9yaWdpbmFsVXJsKTsKKyAgICAgICAgb3ZlcmxheU1hbmFnZXIuY2xvc2UoImNocm9tZUZpbGVBY2Nlc3NPdmVybGF5Iik7CisgICAgICB9CisgICAgfTsKKworICAgIG92ZXJsYXlNYW5hZ2VyLm9wZW4oImNocm9tZUZpbGVBY2Nlc3NPdmVybGF5Iik7CisgIH0pOworfQorCitpZiAod2luZG93ID09PSB0b3ApIHsKKyAgYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwgZnVuY3Rpb24gKCkgeworICAgIGlmICghaXNSdW50aW1lQXZhaWxhYmxlKCkpIHsKKyAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJ1bmxvYWQtIiArIERhdGUubm93KCkgKyAiLSIgKyBkb2N1bWVudC5oaWRkZW4gKyAiLSIgKyBsb2NhdGlvbi5ocmVmLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5LnN0YXRlKSk7CisgICAgfQorICB9KTsKK30KKworbGV0IHBvcnQ7CisKK2Z1bmN0aW9uIHNldFJlZmVyZXIodXJsLCBjYWxsYmFjaykgeworICBpZiAoIXBvcnQpIHsKKyAgICBwb3J0ID0gY2hyb21lLnJ1bnRpbWUuY29ubmVjdCh7CisgICAgICBuYW1lOiAiY2hyb21lY29tLXJlZmVycmVyIgorICAgIH0pOworICB9CisKKyAgcG9ydC5vbkRpc2Nvbm5lY3QuYWRkTGlzdGVuZXIob25EaXNjb25uZWN0KTsKKyAgcG9ydC5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIob25NZXNzYWdlKTsKKyAgcG9ydC5wb3N0TWVzc2FnZSh7CisgICAgcmVmZXJlcjogd2luZG93Lmhpc3Rvcnkuc3RhdGUgJiYgd2luZG93Lmhpc3Rvcnkuc3RhdGUuY2hyb21lY29tU3RhdGUsCisgICAgcmVxdWVzdFVybDogdXJsCisgIH0pOworCisgIGZ1bmN0aW9uIG9uTWVzc2FnZShyZWZlcmVyKSB7CisgICAgaWYgKHJlZmVyZXIpIHsKKyAgICAgIGNvbnN0IHN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGUgfHwge307CisgICAgICBzdGF0ZS5jaHJvbWVjb21TdGF0ZSA9IHJlZmVyZXI7CisgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsICIiKTsKKyAgICB9CisKKyAgICBvbkNvbXBsZXRlZCgpOworICB9CisKKyAgZnVuY3Rpb24gb25EaXNjb25uZWN0KCkgeworICAgIHBvcnQgPSBudWxsOworICAgIGNhbGxiYWNrKCk7CisgIH0KKworICBmdW5jdGlvbiBvbkNvbXBsZXRlZCgpIHsKKyAgICBwb3J0Lm9uRGlzY29ubmVjdC5yZW1vdmVMaXN0ZW5lcihvbkRpc2Nvbm5lY3QpOworICAgIHBvcnQub25NZXNzYWdlLnJlbW92ZUxpc3RlbmVyKG9uTWVzc2FnZSk7CisgICAgY2FsbGJhY2soKTsKKyAgfQorfQorCitjb25zdCBzdG9yYWdlQXJlYSA9IGNocm9tZS5zdG9yYWdlLnN5bmMgfHwgY2hyb21lLnN0b3JhZ2UubG9jYWw7CisKK2NsYXNzIENocm9tZVByZWZlcmVuY2VzIGV4dGVuZHMgX3ByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlcyB7CisgIGFzeW5jIF93cml0ZVRvU3RvcmFnZShwcmVmT2JqKSB7CisgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4geworICAgICAgaWYgKHByZWZPYmogPT09IHRoaXMuZGVmYXVsdHMpIHsKKyAgICAgICAgY29uc3Qga2V5c1RvUmVtb3ZlID0gT2JqZWN0LmtleXModGhpcy5kZWZhdWx0cyk7CisgICAgICAgIHN0b3JhZ2VBcmVhLnJlbW92ZShrZXlzVG9SZW1vdmUsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXNvbHZlKCk7CisgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcmFnZUFyZWEuc2V0KHByZWZPYmosIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXNvbHZlKCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgYXN5bmMgX3JlYWRGcm9tU3RvcmFnZShwcmVmT2JqKSB7CisgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4geworICAgICAgY29uc3QgZ2V0UHJlZmVyZW5jZXMgPSBkZWZhdWx0UHJlZnMgPT4geworICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7CisgICAgICAgICAgZGVmYXVsdFByZWZzID0gdGhpcy5kZWZhdWx0czsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3JhZ2VBcmVhLmdldChkZWZhdWx0UHJlZnMsIGZ1bmN0aW9uIChyZWFkUHJlZnMpIHsKKyAgICAgICAgICByZXNvbHZlKHJlYWRQcmVmcyk7CisgICAgICAgIH0pOworICAgICAgfTsKKworICAgICAgaWYgKGNocm9tZS5zdG9yYWdlLm1hbmFnZWQpIHsKKyAgICAgICAgY29uc3QgZGVmYXVsdE1hbmFnZWRQcmVmcyA9IE9iamVjdC5hc3NpZ24oeworICAgICAgICAgIGVuYWJsZUhhbmRUb29sT25Mb2FkOiBmYWxzZSwKKyAgICAgICAgICBkaXNhYmxlVGV4dExheWVyOiBmYWxzZSwKKyAgICAgICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbjogZmFsc2UsCisgICAgICAgICAgc2hvd1ByZXZpb3VzVmlld09uTG9hZDogdHJ1ZSwKKyAgICAgICAgICBkaXNhYmxlUGFnZU1vZGU6IGZhbHNlCisgICAgICAgIH0sIHRoaXMuZGVmYXVsdHMpOworICAgICAgICBjaHJvbWUuc3RvcmFnZS5tYW5hZ2VkLmdldChkZWZhdWx0TWFuYWdlZFByZWZzLCBmdW5jdGlvbiAoaXRlbXMpIHsKKyAgICAgICAgICBpdGVtcyA9IGl0ZW1zIHx8IGRlZmF1bHRNYW5hZ2VkUHJlZnM7CisKKyAgICAgICAgICBpZiAoaXRlbXMuZW5hYmxlSGFuZFRvb2xPbkxvYWQgJiYgIWl0ZW1zLmN1cnNvclRvb2xPbkxvYWQpIHsKKyAgICAgICAgICAgIGl0ZW1zLmN1cnNvclRvb2xPbkxvYWQgPSAxOworICAgICAgICAgIH0KKworICAgICAgICAgIGRlbGV0ZSBpdGVtcy5lbmFibGVIYW5kVG9vbE9uTG9hZDsKKworICAgICAgICAgIGlmIChpdGVtcy50ZXh0TGF5ZXJNb2RlICE9PSAxKSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZGlzYWJsZVRleHRMYXllcikgeworICAgICAgICAgICAgICBpdGVtcy50ZXh0TGF5ZXJNb2RlID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbXMuZW5oYW5jZVRleHRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgaXRlbXMudGV4dExheWVyTW9kZSA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgZGVsZXRlIGl0ZW1zLmRpc2FibGVUZXh0TGF5ZXI7CisgICAgICAgICAgZGVsZXRlIGl0ZW1zLmVuaGFuY2VUZXh0U2VsZWN0aW9uOworCisgICAgICAgICAgaWYgKCFpdGVtcy5zaG93UHJldmlvdXNWaWV3T25Mb2FkICYmICFpdGVtcy52aWV3T25Mb2FkKSB7CisgICAgICAgICAgICBpdGVtcy52aWV3T25Mb2FkID0gMTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBkZWxldGUgaXRlbXMuc2hvd1ByZXZpb3VzVmlld09uTG9hZDsKKyAgICAgICAgICBkZWxldGUgaXRlbXMuZGlzYWJsZVBhZ2VNb2RlOworICAgICAgICAgIGdldFByZWZlcmVuY2VzKGl0ZW1zKTsKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZXRQcmVmZXJlbmNlcyh0aGlzLmRlZmF1bHRzKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCit9CisKK2NsYXNzIENocm9tZUV4dGVybmFsU2VydmljZXMgZXh0ZW5kcyBfYXBwLkRlZmF1bHRFeHRlcm5hbFNlcnZpY2VzIHsKKyAgc3RhdGljIGluaXRQYXNzaXZlTG9hZGluZyhjYWxsYmFja3MpIHsKKyAgICBDaHJvbWVDb20ucmVzb2x2ZVBERkZpbGUoX2FwcF9vcHRpb25zLkFwcE9wdGlvbnMuZ2V0KCJkZWZhdWx0VXJsIiksIF9hcHAuUERGVmlld2VyQXBwbGljYXRpb24ub3ZlcmxheU1hbmFnZXIsIGZ1bmN0aW9uICh1cmwsIGxlbmd0aCwgb3JpZ2luYWxVcmwpIHsKKyAgICAgIGNhbGxiYWNrcy5vbk9wZW5XaXRoVVJMKHVybCwgbGVuZ3RoLCBvcmlnaW5hbFVybCk7CisgICAgfSk7CisgIH0KKworICBzdGF0aWMgY3JlYXRlRG93bmxvYWRNYW5hZ2VyKG9wdGlvbnMpIHsKKyAgICByZXR1cm4gbmV3IF9kb3dubG9hZF9tYW5hZ2VyLkRvd25sb2FkTWFuYWdlcihvcHRpb25zKTsKKyAgfQorCisgIHN0YXRpYyBjcmVhdGVQcmVmZXJlbmNlcygpIHsKKyAgICByZXR1cm4gbmV3IENocm9tZVByZWZlcmVuY2VzKCk7CisgIH0KKworICBzdGF0aWMgY3JlYXRlTDEwbihvcHRpb25zKSB7CisgICAgcmV0dXJuIG5ldyBfZ2VuZXJpY2wxMG4uR2VuZXJpY0wxMG4obmF2aWdhdG9yLmxhbmd1YWdlKTsKKyAgfQorCit9CisKK19hcHAuUERGVmlld2VyQXBwbGljYXRpb24uZXh0ZXJuYWxTZXJ2aWNlcyA9IENocm9tZUV4dGVybmFsU2VydmljZXM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9kZWJ1Z2dlci5qcyBiL2xpYi93ZWIvZGVidWdnZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhMzY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvZGVidWdnZXIuanMKQEAgLTAsMCArMSw2NzAgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwordmFyIEZvbnRJbnNwZWN0b3IgPSBmdW5jdGlvbiBGb250SW5zcGVjdG9yQ2xvc3VyZSgpIHsKKyAgdmFyIGZvbnRzOworICB2YXIgYWN0aXZlID0gZmFsc2U7CisgIHZhciBmb250QXR0cmlidXRlID0gImRhdGEtZm9udC1uYW1lIjsKKworICBmdW5jdGlvbiByZW1vdmVTZWxlY3Rpb24oKSB7CisgICAgY29uc3QgZGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYHNwYW5bJHtmb250QXR0cmlidXRlfV1gKTsKKworICAgIGZvciAoY29uc3QgZGl2IG9mIGRpdnMpIHsKKyAgICAgIGRpdi5jbGFzc05hbWUgPSAiIjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiByZXNldFNlbGVjdGlvbigpIHsKKyAgICBjb25zdCBkaXZzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgc3Bhblske2ZvbnRBdHRyaWJ1dGV9XWApOworCisgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykgeworICAgICAgZGl2LmNsYXNzTmFtZSA9ICJkZWJ1Z2dlckhpZGVUZXh0IjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBzZWxlY3RGb250KGZvbnROYW1lLCBzaG93KSB7CisgICAgY29uc3QgZGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYHNwYW5bJHtmb250QXR0cmlidXRlfT0ke2ZvbnROYW1lfV1gKTsKKworICAgIGZvciAoY29uc3QgZGl2IG9mIGRpdnMpIHsKKyAgICAgIGRpdi5jbGFzc05hbWUgPSBzaG93ID8gImRlYnVnZ2VyU2hvd1RleHQiIDogImRlYnVnZ2VySGlkZVRleHQiOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHRleHRMYXllckNsaWNrKGUpIHsKKyAgICBpZiAoIWUudGFyZ2V0LmRhdGFzZXQuZm9udE5hbWUgfHwgZS50YXJnZXQudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAiU1BBTiIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZm9udE5hbWUgPSBlLnRhcmdldC5kYXRhc2V0LmZvbnROYW1lOworICAgIHZhciBzZWxlY3RzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdHMubGVuZ3RoOyArK2kpIHsKKyAgICAgIHZhciBzZWxlY3QgPSBzZWxlY3RzW2ldOworCisgICAgICBpZiAoc2VsZWN0LmRhdGFzZXQuZm9udE5hbWUgIT09IGZvbnROYW1lKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBzZWxlY3QuY2hlY2tlZCA9ICFzZWxlY3QuY2hlY2tlZDsKKyAgICAgIHNlbGVjdEZvbnQoZm9udE5hbWUsIHNlbGVjdC5jaGVja2VkKTsKKyAgICAgIHNlbGVjdC5zY3JvbGxJbnRvVmlldygpOworICAgIH0KKyAgfQorCisgIHJldHVybiB7CisgICAgaWQ6ICJGb250SW5zcGVjdG9yIiwKKyAgICBuYW1lOiAiRm9udCBJbnNwZWN0b3IiLAorICAgIHBhbmVsOiBudWxsLAorICAgIG1hbmFnZXI6IG51bGwsCisgICAgaW5pdDogZnVuY3Rpb24gaW5pdChwZGZqc0xpYikgeworICAgICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbDsKKyAgICAgIHZhciB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKKyAgICAgIHRtcC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHJlc2V0U2VsZWN0aW9uKTsKKyAgICAgIHRtcC50ZXh0Q29udGVudCA9ICJSZWZyZXNoIjsKKyAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHRtcCk7CisgICAgICBmb250cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQoZm9udHMpOworICAgIH0sCisgICAgY2xlYW51cDogZnVuY3Rpb24gY2xlYW51cCgpIHsKKyAgICAgIGZvbnRzLnRleHRDb250ZW50ID0gIiI7CisgICAgfSwKKyAgICBlbmFibGVkOiBmYWxzZSwKKworICAgIGdldCBhY3RpdmUoKSB7CisgICAgICByZXR1cm4gYWN0aXZlOworICAgIH0sCisKKyAgICBzZXQgYWN0aXZlKHZhbHVlKSB7CisgICAgICBhY3RpdmUgPSB2YWx1ZTsKKworICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGV4dExheWVyQ2xpY2ssIHRydWUpOworICAgICAgICByZXNldFNlbGVjdGlvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIHRleHRMYXllckNsaWNrLCB0cnVlKTsKKyAgICAgICAgcmVtb3ZlU2VsZWN0aW9uKCk7CisgICAgICB9CisgICAgfSwKKworICAgIGZvbnRBZGRlZDogZnVuY3Rpb24gZm9udEFkZGVkKGZvbnRPYmosIHVybCkgeworICAgICAgZnVuY3Rpb24gcHJvcGVydGllcyhvYmosIGxpc3QpIHsKKyAgICAgICAgdmFyIG1vcmVJbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOworICAgICAgICAgIHZhciB0ZDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOworICAgICAgICAgIHRkMS50ZXh0Q29udGVudCA9IGxpc3RbaV07CisgICAgICAgICAgdHIuYXBwZW5kQ2hpbGQodGQxKTsKKyAgICAgICAgICB2YXIgdGQyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKKyAgICAgICAgICB0ZDIudGV4dENvbnRlbnQgPSBvYmpbbGlzdFtpXV0udG9TdHJpbmcoKTsKKyAgICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZDIpOworICAgICAgICAgIG1vcmVJbmZvLmFwcGVuZENoaWxkKHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtb3JlSW5mbzsKKyAgICAgIH0KKworICAgICAgdmFyIG1vcmVJbmZvID0gcHJvcGVydGllcyhmb250T2JqLCBbIm5hbWUiLCAidHlwZSJdKTsKKyAgICAgIGNvbnN0IGZvbnROYW1lID0gZm9udE9iai5sb2FkZWROYW1lOworICAgICAgdmFyIGZvbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgIHZhciBuYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworICAgICAgbmFtZS50ZXh0Q29udGVudCA9IGZvbnROYW1lOworICAgICAgdmFyIGRvd25sb2FkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOworCisgICAgICBpZiAodXJsKSB7CisgICAgICAgIHVybCA9IC91cmxcKFsnIl0/KFteXCkiJ10rKS8uZXhlYyh1cmwpOworICAgICAgICBkb3dubG9hZC5ocmVmID0gdXJsWzFdOworICAgICAgfSBlbHNlIGlmIChmb250T2JqLmRhdGEpIHsKKyAgICAgICAgZG93bmxvYWQuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2ZvbnRPYmouZGF0YV0sIHsKKyAgICAgICAgICB0eXBlOiBmb250T2JqLm1pbWVUeXBlCisgICAgICAgIH0pKTsKKyAgICAgIH0KKworICAgICAgZG93bmxvYWQudGV4dENvbnRlbnQgPSAiRG93bmxvYWQiOworICAgICAgdmFyIGxvZ0l0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOworICAgICAgbG9nSXQuaHJlZiA9ICIiOworICAgICAgbG9nSXQudGV4dENvbnRlbnQgPSAiTG9nIjsKKyAgICAgIGxvZ0l0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgIGNvbnNvbGUubG9nKGZvbnRPYmopOworICAgICAgfSk7CisgICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOworICAgICAgc2VsZWN0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJjaGVja2JveCIpOworICAgICAgc2VsZWN0LmRhdGFzZXQuZm9udE5hbWUgPSBmb250TmFtZTsKKyAgICAgIHNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgc2VsZWN0Rm9udChmb250TmFtZSwgc2VsZWN0LmNoZWNrZWQpOworICAgICAgfSk7CisgICAgICBmb250LmFwcGVuZENoaWxkKHNlbGVjdCk7CisgICAgICBmb250LmFwcGVuZENoaWxkKG5hbWUpOworICAgICAgZm9udC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTsKKyAgICAgIGZvbnQuYXBwZW5kQ2hpbGQoZG93bmxvYWQpOworICAgICAgZm9udC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTsKKyAgICAgIGZvbnQuYXBwZW5kQ2hpbGQobG9nSXQpOworICAgICAgZm9udC5hcHBlbmRDaGlsZChtb3JlSW5mbyk7CisgICAgICBmb250cy5hcHBlbmRDaGlsZChmb250KTsKKyAgICAgIHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHsKKyAgICAgICAgICByZXNldFNlbGVjdGlvbigpOworICAgICAgICB9CisgICAgICB9LCAyMDAwKTsKKyAgICB9CisgIH07Cit9KCk7CisKK3ZhciBvcE1hcDsKKwordmFyIFN0ZXBwZXJNYW5hZ2VyID0gZnVuY3Rpb24gU3RlcHBlck1hbmFnZXJDbG9zdXJlKCkgeworICB2YXIgc3RlcHBlcnMgPSBbXTsKKyAgdmFyIHN0ZXBwZXJEaXYgPSBudWxsOworICB2YXIgc3RlcHBlckNvbnRyb2xzID0gbnVsbDsKKyAgdmFyIHN0ZXBwZXJDaG9vc2VyID0gbnVsbDsKKyAgdmFyIGJyZWFrUG9pbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgcmV0dXJuIHsKKyAgICBpZDogIlN0ZXBwZXIiLAorICAgIG5hbWU6ICJTdGVwcGVyIiwKKyAgICBwYW5lbDogbnVsbCwKKyAgICBtYW5hZ2VyOiBudWxsLAorICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQocGRmanNMaWIpIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIHN0ZXBwZXJDb250cm9scyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgc3RlcHBlckNob29zZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKKyAgICAgIHN0ZXBwZXJDaG9vc2VyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICBzZWxmLnNlbGVjdFN0ZXBwZXIodGhpcy52YWx1ZSk7CisgICAgICB9KTsKKyAgICAgIHN0ZXBwZXJDb250cm9scy5hcHBlbmRDaGlsZChzdGVwcGVyQ2hvb3Nlcik7CisgICAgICBzdGVwcGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICB0aGlzLnBhbmVsLmFwcGVuZENoaWxkKHN0ZXBwZXJDb250cm9scyk7CisgICAgICB0aGlzLnBhbmVsLmFwcGVuZENoaWxkKHN0ZXBwZXJEaXYpOworCisgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgicGRmanNCcmVha1BvaW50cyIpKSB7CisgICAgICAgIGJyZWFrUG9pbnRzID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJwZGZqc0JyZWFrUG9pbnRzIikpOworICAgICAgfQorCisgICAgICBvcE1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICAgIGZvciAodmFyIGtleSBpbiBwZGZqc0xpYi5PUFMpIHsKKyAgICAgICAgb3BNYXBbcGRmanNMaWIuT1BTW2tleV1dID0ga2V5OworICAgICAgfQorICAgIH0sCisgICAgY2xlYW51cDogZnVuY3Rpb24gY2xlYW51cCgpIHsKKyAgICAgIHN0ZXBwZXJDaG9vc2VyLnRleHRDb250ZW50ID0gIiI7CisgICAgICBzdGVwcGVyRGl2LnRleHRDb250ZW50ID0gIiI7CisgICAgICBzdGVwcGVycyA9IFtdOworICAgIH0sCisgICAgZW5hYmxlZDogZmFsc2UsCisgICAgYWN0aXZlOiBmYWxzZSwKKyAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZShwYWdlSW5kZXgpIHsKKyAgICAgIHZhciBkZWJ1ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgZGVidWcuaWQgPSAic3RlcHBlciIgKyBwYWdlSW5kZXg7CisgICAgICBkZWJ1Zy5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsIHRydWUpOworICAgICAgZGVidWcuY2xhc3NOYW1lID0gInN0ZXBwZXIiOworICAgICAgc3RlcHBlckRpdi5hcHBlbmRDaGlsZChkZWJ1Zyk7CisgICAgICB2YXIgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOworICAgICAgYi50ZXh0Q29udGVudCA9ICJQYWdlICIgKyAocGFnZUluZGV4ICsgMSk7CisgICAgICBiLnZhbHVlID0gcGFnZUluZGV4OworICAgICAgc3RlcHBlckNob29zZXIuYXBwZW5kQ2hpbGQoYik7CisgICAgICB2YXIgaW5pdEJyZWFrUG9pbnRzID0gYnJlYWtQb2ludHNbcGFnZUluZGV4XSB8fCBbXTsKKyAgICAgIHZhciBzdGVwcGVyID0gbmV3IFN0ZXBwZXIoZGVidWcsIHBhZ2VJbmRleCwgaW5pdEJyZWFrUG9pbnRzKTsKKyAgICAgIHN0ZXBwZXJzLnB1c2goc3RlcHBlcik7CisKKyAgICAgIGlmIChzdGVwcGVycy5sZW5ndGggPT09IDEpIHsKKyAgICAgICAgdGhpcy5zZWxlY3RTdGVwcGVyKHBhZ2VJbmRleCwgZmFsc2UpOworICAgICAgfQorCisgICAgICByZXR1cm4gc3RlcHBlcjsKKyAgICB9LAorICAgIHNlbGVjdFN0ZXBwZXI6IGZ1bmN0aW9uIHNlbGVjdFN0ZXBwZXIocGFnZUluZGV4LCBzZWxlY3RQYW5lbCkgeworICAgICAgdmFyIGk7CisgICAgICBwYWdlSW5kZXggPSBwYWdlSW5kZXggfCAwOworCisgICAgICBpZiAoc2VsZWN0UGFuZWwpIHsKKyAgICAgICAgdGhpcy5tYW5hZ2VyLnNlbGVjdFBhbmVsKHRoaXMpOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RlcHBlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgdmFyIHN0ZXBwZXIgPSBzdGVwcGVyc1tpXTsKKworICAgICAgICBpZiAoc3RlcHBlci5wYWdlSW5kZXggPT09IHBhZ2VJbmRleCkgeworICAgICAgICAgIHN0ZXBwZXIucGFuZWwucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGVwcGVyLnBhbmVsLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIG9wdGlvbnMgPSBzdGVwcGVyQ2hvb3Nlci5vcHRpb25zOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7ICsraSkgeworICAgICAgICB2YXIgb3B0aW9uID0gb3B0aW9uc1tpXTsKKyAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gKG9wdGlvbi52YWx1ZSB8IDApID09PSBwYWdlSW5kZXg7CisgICAgICB9CisgICAgfSwKKyAgICBzYXZlQnJlYWtQb2ludHM6IGZ1bmN0aW9uIHNhdmVCcmVha1BvaW50cyhwYWdlSW5kZXgsIGJwcykgeworICAgICAgYnJlYWtQb2ludHNbcGFnZUluZGV4XSA9IGJwczsKKyAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oInBkZmpzQnJlYWtQb2ludHMiLCBKU09OLnN0cmluZ2lmeShicmVha1BvaW50cykpOworICAgIH0KKyAgfTsKK30oKTsKKwordmFyIFN0ZXBwZXIgPSBmdW5jdGlvbiBTdGVwcGVyQ2xvc3VyZSgpIHsKKyAgZnVuY3Rpb24gYyh0YWcsIHRleHRDb250ZW50KSB7CisgICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CisKKyAgICBpZiAodGV4dENvbnRlbnQpIHsKKyAgICAgIGQudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDsKKyAgICB9CisKKyAgICByZXR1cm4gZDsKKyAgfQorCisgIGZ1bmN0aW9uIHNpbXBsaWZ5QXJncyhhcmdzKSB7CisgICAgaWYgKHR5cGVvZiBhcmdzID09PSAic3RyaW5nIikgeworICAgICAgdmFyIE1BWF9TVFJJTkdfTEVOR1RIID0gNzU7CisgICAgICByZXR1cm4gYXJncy5sZW5ndGggPD0gTUFYX1NUUklOR19MRU5HVEggPyBhcmdzIDogYXJncy5zdWJzdHJpbmcoMCwgTUFYX1NUUklOR19MRU5HVEgpICsgIi4uLiI7CisgICAgfQorCisgICAgaWYgKHR5cGVvZiBhcmdzICE9PSAib2JqZWN0IiB8fCBhcmdzID09PSBudWxsKSB7CisgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisKKyAgICBpZiAoImxlbmd0aCIgaW4gYXJncykgeworICAgICAgdmFyIHNpbXBsZUFyZ3MgPSBbXSwKKyAgICAgICAgICBpLAorICAgICAgICAgIGlpOworICAgICAgdmFyIE1BWF9JVEVNUyA9IDEwOworCisgICAgICBmb3IgKGkgPSAwLCBpaSA9IE1hdGgubWluKE1BWF9JVEVNUywgYXJncy5sZW5ndGgpOyBpIDwgaWk7IGkrKykgeworICAgICAgICBzaW1wbGVBcmdzLnB1c2goc2ltcGxpZnlBcmdzKGFyZ3NbaV0pKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPCBhcmdzLmxlbmd0aCkgeworICAgICAgICBzaW1wbGVBcmdzLnB1c2goIi4uLiIpOworICAgICAgfQorCisgICAgICByZXR1cm4gc2ltcGxlQXJnczsKKyAgICB9CisKKyAgICB2YXIgc2ltcGxlT2JqID0ge307CisKKyAgICBmb3IgKHZhciBrZXkgaW4gYXJncykgeworICAgICAgc2ltcGxlT2JqW2tleV0gPSBzaW1wbGlmeUFyZ3MoYXJnc1trZXldKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2ltcGxlT2JqOworICB9CisKKyAgZnVuY3Rpb24gU3RlcHBlcihwYW5lbCwgcGFnZUluZGV4LCBpbml0aWFsQnJlYWtQb2ludHMpIHsKKyAgICB0aGlzLnBhbmVsID0gcGFuZWw7CisgICAgdGhpcy5icmVha1BvaW50ID0gMDsKKyAgICB0aGlzLm5leHRCcmVha1BvaW50ID0gbnVsbDsKKyAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKKyAgICB0aGlzLmJyZWFrUG9pbnRzID0gaW5pdGlhbEJyZWFrUG9pbnRzOworICAgIHRoaXMuY3VycmVudElkeCA9IC0xOworICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gMDsKKyAgfQorCisgIFN0ZXBwZXIucHJvdG90eXBlID0geworICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQob3BlcmF0b3JMaXN0KSB7CisgICAgICB2YXIgcGFuZWwgPSB0aGlzLnBhbmVsOworICAgICAgdmFyIGNvbnRlbnQgPSBjKCJkaXYiLCAiYz1jb250aW51ZSwgcz1zdGVwIik7CisgICAgICB2YXIgdGFibGUgPSBjKCJ0YWJsZSIpOworICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh0YWJsZSk7CisgICAgICB0YWJsZS5jZWxsU3BhY2luZyA9IDA7CisgICAgICB2YXIgaGVhZGVyUm93ID0gYygidHIiKTsKKyAgICAgIHRhYmxlLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7CisgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoYygidGgiLCAiQnJlYWsiKSk7CisgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoYygidGgiLCAiSWR4IikpOworICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKGMoInRoIiwgImZuIikpOworICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKGMoInRoIiwgImFyZ3MiKSk7CisgICAgICBwYW5lbC5hcHBlbmRDaGlsZChjb250ZW50KTsKKyAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKKyAgICAgIHRoaXMudXBkYXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7CisgICAgfSwKKyAgICB1cGRhdGVPcGVyYXRvckxpc3Q6IGZ1bmN0aW9uIHVwZGF0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QpIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKworICAgICAgZnVuY3Rpb24gY2JveE9uQ2xpY2soKSB7CisgICAgICAgIHZhciB4ID0gK3RoaXMuZGF0YXNldC5pZHg7CisKKyAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCkgeworICAgICAgICAgIHNlbGYuYnJlYWtQb2ludHMucHVzaCh4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWxmLmJyZWFrUG9pbnRzLnNwbGljZShzZWxmLmJyZWFrUG9pbnRzLmluZGV4T2YoeCksIDEpOworICAgICAgICB9CisKKyAgICAgICAgU3RlcHBlck1hbmFnZXIuc2F2ZUJyZWFrUG9pbnRzKHNlbGYucGFnZUluZGV4LCBzZWxmLmJyZWFrUG9pbnRzKTsKKyAgICAgIH0KKworICAgICAgdmFyIE1BWF9PUEVSQVRPUlNfQ09VTlQgPSAxNTAwMDsKKworICAgICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0SWR4ID4gTUFYX09QRVJBVE9SU19DT1VOVCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBjaHVuayA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgIHZhciBvcGVyYXRvcnNUb0Rpc3BsYXkgPSBNYXRoLm1pbihNQVhfT1BFUkFUT1JTX0NPVU5ULCBvcGVyYXRvckxpc3QuZm5BcnJheS5sZW5ndGgpOworCisgICAgICBmb3IgKHZhciBpID0gdGhpcy5vcGVyYXRvckxpc3RJZHg7IGkgPCBvcGVyYXRvcnNUb0Rpc3BsYXk7IGkrKykgeworICAgICAgICB2YXIgbGluZSA9IGMoInRyIik7CisgICAgICAgIGxpbmUuY2xhc3NOYW1lID0gImxpbmUiOworICAgICAgICBsaW5lLmRhdGFzZXQuaWR4ID0gaTsKKyAgICAgICAgY2h1bmsuYXBwZW5kQ2hpbGQobGluZSk7CisgICAgICAgIHZhciBjaGVja2VkID0gdGhpcy5icmVha1BvaW50cy5pbmNsdWRlcyhpKTsKKyAgICAgICAgdmFyIGFyZ3MgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5W2ldIHx8IFtdOworICAgICAgICB2YXIgYnJlYWtDZWxsID0gYygidGQiKTsKKyAgICAgICAgdmFyIGNib3ggPSBjKCJpbnB1dCIpOworICAgICAgICBjYm94LnR5cGUgPSAiY2hlY2tib3giOworICAgICAgICBjYm94LmNsYXNzTmFtZSA9ICJwb2ludHMiOworICAgICAgICBjYm94LmNoZWNrZWQgPSBjaGVja2VkOworICAgICAgICBjYm94LmRhdGFzZXQuaWR4ID0gaTsKKyAgICAgICAgY2JveC5vbmNsaWNrID0gY2JveE9uQ2xpY2s7CisgICAgICAgIGJyZWFrQ2VsbC5hcHBlbmRDaGlsZChjYm94KTsKKyAgICAgICAgbGluZS5hcHBlbmRDaGlsZChicmVha0NlbGwpOworICAgICAgICBsaW5lLmFwcGVuZENoaWxkKGMoInRkIiwgaS50b1N0cmluZygpKSk7CisgICAgICAgIHZhciBmbiA9IG9wTWFwW29wZXJhdG9yTGlzdC5mbkFycmF5W2ldXTsKKyAgICAgICAgdmFyIGRlY0FyZ3MgPSBhcmdzOworCisgICAgICAgIGlmIChmbiA9PT0gInNob3dUZXh0IikgeworICAgICAgICAgIHZhciBnbHlwaHMgPSBhcmdzWzBdOworICAgICAgICAgIHZhciBuZXdBcmdzID0gW107CisgICAgICAgICAgdmFyIHN0ciA9IFtdOworCisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnbHlwaHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tqXTsKKworICAgICAgICAgICAgaWYgKHR5cGVvZiBnbHlwaCA9PT0gIm9iamVjdCIgJiYgZ2x5cGggIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgc3RyLnB1c2goZ2x5cGguZm9udENoYXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgbmV3QXJncy5wdXNoKHN0ci5qb2luKCIiKSk7CisgICAgICAgICAgICAgICAgc3RyID0gW107CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBuZXdBcmdzLnB1c2goZ2x5cGgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdHIubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbmV3QXJncy5wdXNoKHN0ci5qb2luKCIiKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGVjQXJncyA9IFtuZXdBcmdzXTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUuYXBwZW5kQ2hpbGQoYygidGQiLCBmbikpOworICAgICAgICBsaW5lLmFwcGVuZENoaWxkKGMoInRkIiwgSlNPTi5zdHJpbmdpZnkoc2ltcGxpZnlBcmdzKGRlY0FyZ3MpKSkpOworICAgICAgfQorCisgICAgICBpZiAob3BlcmF0b3JzVG9EaXNwbGF5IDwgb3BlcmF0b3JMaXN0LmZuQXJyYXkubGVuZ3RoKSB7CisgICAgICAgIGxpbmUgPSBjKCJ0ciIpOworICAgICAgICB2YXIgbGFzdENlbGwgPSBjKCJ0ZCIsICIuLi4iKTsKKyAgICAgICAgbGFzdENlbGwuY29sc3BhbiA9IDQ7CisgICAgICAgIGNodW5rLmFwcGVuZENoaWxkKGxhc3RDZWxsKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSBvcGVyYXRvckxpc3QuZm5BcnJheS5sZW5ndGg7CisgICAgICB0aGlzLnRhYmxlLmFwcGVuZENoaWxkKGNodW5rKTsKKyAgICB9LAorICAgIGdldE5leHRCcmVha1BvaW50OiBmdW5jdGlvbiBnZXROZXh0QnJlYWtQb2ludCgpIHsKKyAgICAgIHRoaXMuYnJlYWtQb2ludHMuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgICByZXR1cm4gYSAtIGI7CisgICAgICB9KTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJyZWFrUG9pbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmICh0aGlzLmJyZWFrUG9pbnRzW2ldID4gdGhpcy5jdXJyZW50SWR4KSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuYnJlYWtQb2ludHNbaV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBicmVha0l0OiBmdW5jdGlvbiBicmVha0l0KGlkeCwgY2FsbGJhY2spIHsKKyAgICAgIFN0ZXBwZXJNYW5hZ2VyLnNlbGVjdFN0ZXBwZXIodGhpcy5wYWdlSW5kZXgsIHRydWUpOworICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgdmFyIGRvbSA9IGRvY3VtZW50OworICAgICAgc2VsZi5jdXJyZW50SWR4ID0gaWR4OworCisgICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkgeworICAgICAgICBzd2l0Y2ggKGUua2V5Q29kZSkgeworICAgICAgICAgIGNhc2UgODM6CisgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHNlbGYubmV4dEJyZWFrUG9pbnQgPSBzZWxmLmN1cnJlbnRJZHggKyAxOworICAgICAgICAgICAgc2VsZi5nb1RvKC0xKTsKKyAgICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNjc6CisgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHZhciBicmVha1BvaW50ID0gc2VsZi5nZXROZXh0QnJlYWtQb2ludCgpOworICAgICAgICAgICAgc2VsZi5uZXh0QnJlYWtQb2ludCA9IGJyZWFrUG9pbnQ7CisgICAgICAgICAgICBzZWxmLmdvVG8oLTEpOworICAgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9OworCisgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGxpc3RlbmVyKTsKKyAgICAgIHNlbGYuZ29UbyhpZHgpOworICAgIH0sCisgICAgZ29UbzogZnVuY3Rpb24gZ29UbyhpZHgpIHsKKyAgICAgIHZhciBhbGxSb3dzID0gdGhpcy5wYW5lbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJsaW5lIik7CisKKyAgICAgIGZvciAodmFyIHggPSAwLCB4eCA9IGFsbFJvd3MubGVuZ3RoOyB4IDwgeHg7ICsreCkgeworICAgICAgICB2YXIgcm93ID0gYWxsUm93c1t4XTsKKworICAgICAgICBpZiAoKHJvdy5kYXRhc2V0LmlkeCB8IDApID09PSBpZHgpIHsKKyAgICAgICAgICByb3cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gInJnYigyNTEsMjUwLDIwNykiOworICAgICAgICAgIHJvdy5zY3JvbGxJbnRvVmlldygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJvdy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworICByZXR1cm4gU3RlcHBlcjsKK30oKTsKKwordmFyIFN0YXRzID0gZnVuY3Rpb24gU3RhdHMoKSB7CisgIHZhciBzdGF0cyA9IFtdOworCisgIGZ1bmN0aW9uIGNsZWFyKG5vZGUpIHsKKyAgICB3aGlsZSAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKKyAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5sYXN0Q2hpbGQpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGdldFN0YXRJbmRleChwYWdlTnVtYmVyKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3RhdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgaWYgKHN0YXRzW2ldLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHsKKyAgICBpZDogIlN0YXRzIiwKKyAgICBuYW1lOiAiU3RhdHMiLAorICAgIHBhbmVsOiBudWxsLAorICAgIG1hbmFnZXI6IG51bGwsCisKKyAgICBpbml0KHBkZmpzTGliKSB7fSwKKworICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgIGFjdGl2ZTogZmFsc2UsCisKKyAgICBhZGQocGFnZU51bWJlciwgc3RhdCkgeworICAgICAgaWYgKCFzdGF0KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHN0YXRzSW5kZXggPSBnZXRTdGF0SW5kZXgocGFnZU51bWJlcik7CisKKyAgICAgIGlmIChzdGF0c0luZGV4ICE9PSBmYWxzZSkgeworICAgICAgICBjb25zdCBiID0gc3RhdHNbc3RhdHNJbmRleF07CisgICAgICAgIHRoaXMucGFuZWwucmVtb3ZlQ2hpbGQoYi5kaXYpOworICAgICAgICBzdGF0cy5zcGxpY2Uoc3RhdHNJbmRleCwgMSk7CisgICAgICB9CisKKyAgICAgIHZhciB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICB3cmFwcGVyLmNsYXNzTmFtZSA9ICJzdGF0cyI7CisgICAgICB2YXIgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgIHRpdGxlLmNsYXNzTmFtZSA9ICJ0aXRsZSI7CisgICAgICB0aXRsZS50ZXh0Q29udGVudCA9ICJQYWdlOiAiICsgcGFnZU51bWJlcjsKKyAgICAgIHZhciBzdGF0c0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgc3RhdHNEaXYudGV4dENvbnRlbnQgPSBzdGF0LnRvU3RyaW5nKCk7CisgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHRpdGxlKTsKKyAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoc3RhdHNEaXYpOworICAgICAgc3RhdHMucHVzaCh7CisgICAgICAgIHBhZ2VOdW1iZXIsCisgICAgICAgIGRpdjogd3JhcHBlcgorICAgICAgfSk7CisgICAgICBzdGF0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICAgIHJldHVybiBhLnBhZ2VOdW1iZXIgLSBiLnBhZ2VOdW1iZXI7CisgICAgICB9KTsKKyAgICAgIGNsZWFyKHRoaXMucGFuZWwpOworCisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdGF0cy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHRoaXMucGFuZWwuYXBwZW5kQ2hpbGQoc3RhdHNbaV0uZGl2KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgY2xlYW51cCgpIHsKKyAgICAgIHN0YXRzID0gW107CisgICAgICBjbGVhcih0aGlzLnBhbmVsKTsKKyAgICB9CisKKyAgfTsKK30oKTsKKword2luZG93LlBERkJ1ZyA9IGZ1bmN0aW9uIFBERkJ1Z0Nsb3N1cmUoKSB7CisgIHZhciBwYW5lbFdpZHRoID0gMzAwOworICB2YXIgYnV0dG9ucyA9IFtdOworICB2YXIgYWN0aXZlUGFuZWwgPSBudWxsOworICByZXR1cm4geworICAgIHRvb2xzOiBbRm9udEluc3BlY3RvciwgU3RlcHBlck1hbmFnZXIsIFN0YXRzXSwKKworICAgIGVuYWJsZShpZHMpIHsKKyAgICAgIHZhciBhbGwgPSBmYWxzZSwKKyAgICAgICAgICB0b29scyA9IHRoaXMudG9vbHM7CisKKyAgICAgIGlmIChpZHMubGVuZ3RoID09PSAxICYmIGlkc1swXSA9PT0gImFsbCIpIHsKKyAgICAgICAgYWxsID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgeworICAgICAgICB2YXIgdG9vbCA9IHRvb2xzW2ldOworCisgICAgICAgIGlmIChhbGwgfHwgaWRzLmluY2x1ZGVzKHRvb2wuaWQpKSB7CisgICAgICAgICAgdG9vbC5lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIWFsbCkgeworICAgICAgICB0b29scy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICAgICAgdmFyIGluZGV4QSA9IGlkcy5pbmRleE9mKGEuaWQpOworICAgICAgICAgIGluZGV4QSA9IGluZGV4QSA8IDAgPyB0b29scy5sZW5ndGggOiBpbmRleEE7CisgICAgICAgICAgdmFyIGluZGV4QiA9IGlkcy5pbmRleE9mKGIuaWQpOworICAgICAgICAgIGluZGV4QiA9IGluZGV4QiA8IDAgPyB0b29scy5sZW5ndGggOiBpbmRleEI7CisgICAgICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIGluaXQocGRmanNMaWIsIGNvbnRhaW5lcikgeworICAgICAgdmFyIHVpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICB1aS5pZCA9ICJQREZCdWciOworICAgICAgdmFyIGNvbnRyb2xzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICBjb250cm9scy5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImNvbnRyb2xzIik7CisgICAgICB1aS5hcHBlbmRDaGlsZChjb250cm9scyk7CisgICAgICB2YXIgcGFuZWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICBwYW5lbHMuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJwYW5lbHMiKTsKKyAgICAgIHVpLmFwcGVuZENoaWxkKHBhbmVscyk7CisgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodWkpOworICAgICAgY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gcGFuZWxXaWR0aCArICJweCI7CisgICAgICB2YXIgdG9vbHMgPSB0aGlzLnRvb2xzOworICAgICAgdmFyIHNlbGYgPSB0aGlzOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvb2xzLmxlbmd0aDsgKytpKSB7CisgICAgICAgIHZhciB0b29sID0gdG9vbHNbaV07CisgICAgICAgIHZhciBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICB2YXIgcGFuZWxCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKKyAgICAgICAgcGFuZWxCdXR0b24udGV4dENvbnRlbnQgPSB0b29sLm5hbWU7CisgICAgICAgIHBhbmVsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKHNlbGVjdGVkKSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0UGFuZWwoc2VsZWN0ZWQpOworICAgICAgICAgIH07CisgICAgICAgIH0oaSkpOworICAgICAgICBjb250cm9scy5hcHBlbmRDaGlsZChwYW5lbEJ1dHRvbik7CisgICAgICAgIHBhbmVscy5hcHBlbmRDaGlsZChwYW5lbCk7CisgICAgICAgIHRvb2wucGFuZWwgPSBwYW5lbDsKKyAgICAgICAgdG9vbC5tYW5hZ2VyID0gdGhpczsKKworICAgICAgICBpZiAodG9vbC5lbmFibGVkKSB7CisgICAgICAgICAgdG9vbC5pbml0KHBkZmpzTGliKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYW5lbC50ZXh0Q29udGVudCA9IHRvb2wubmFtZSArICIgaXMgZGlzYWJsZWQuIFRvIGVuYWJsZSBhZGQgIiArICcgIicgKyB0b29sLmlkICsgJyIgdG8gdGhlIHBkZkJ1ZyBwYXJhbWV0ZXIgJyArICJhbmQgcmVmcmVzaCAoc2VwYXJhdGUgbXVsdGlwbGUgYnkgY29tbWFzKS4iOworICAgICAgICB9CisKKyAgICAgICAgYnV0dG9ucy5wdXNoKHBhbmVsQnV0dG9uKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5zZWxlY3RQYW5lbCgwKTsKKyAgICB9LAorCisgICAgY2xlYW51cCgpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMudG9vbHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBpZiAodGhpcy50b29sc1tpXS5lbmFibGVkKSB7CisgICAgICAgICAgdGhpcy50b29sc1tpXS5jbGVhbnVwKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgc2VsZWN0UGFuZWwoaW5kZXgpIHsKKyAgICAgIGlmICh0eXBlb2YgaW5kZXggIT09ICJudW1iZXIiKSB7CisgICAgICAgIGluZGV4ID0gdGhpcy50b29scy5pbmRleE9mKGluZGV4KTsKKyAgICAgIH0KKworICAgICAgaWYgKGluZGV4ID09PSBhY3RpdmVQYW5lbCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGFjdGl2ZVBhbmVsID0gaW5kZXg7CisgICAgICB2YXIgdG9vbHMgPSB0aGlzLnRvb2xzOworCisgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRvb2xzLmxlbmd0aDsgKytqKSB7CisgICAgICAgIGlmIChqID09PSBpbmRleCkgeworICAgICAgICAgIGJ1dHRvbnNbal0uc2V0QXR0cmlidXRlKCJjbGFzcyIsICJhY3RpdmUiKTsKKyAgICAgICAgICB0b29sc1tqXS5hY3RpdmUgPSB0cnVlOworICAgICAgICAgIHRvb2xzW2pdLnBhbmVsLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnV0dG9uc1tqXS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgIiIpOworICAgICAgICAgIHRvb2xzW2pdLmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgIHRvb2xzW2pdLnBhbmVsLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgInRydWUiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICB9OworfSgpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvZG93bmxvYWRfbWFuYWdlci5qcyBiL2xpYi93ZWIvZG93bmxvYWRfbWFuYWdlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2UwY2VlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9kb3dubG9hZF9tYW5hZ2VyLmpzCkBAIC0wLDAgKzEsOTUgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkRvd25sb2FkTWFuYWdlciA9IHZvaWQgMDsKKwordmFyIF9wZGYgPSByZXF1aXJlKCIuLi9wZGYiKTsKKwordmFyIF92aWV3ZXJfY29tcGF0aWJpbGl0eSA9IHJlcXVpcmUoIi4vdmlld2VyX2NvbXBhdGliaWxpdHkuanMiKTsKKworOworCitmdW5jdGlvbiBkb3dubG9hZChibG9iVXJsLCBmaWxlbmFtZSkgeworICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOworCisgIGlmICghYS5jbGljaykgeworICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWRNYW5hZ2VyOiAiYS5jbGljaygpIiBpcyBub3Qgc3VwcG9ydGVkLicpOworICB9CisKKyAgYS5ocmVmID0gYmxvYlVybDsKKyAgYS50YXJnZXQgPSAiX3BhcmVudCI7CisKKyAgaWYgKCJkb3dubG9hZCIgaW4gYSkgeworICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTsKKyAgfQorCisgIChkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoYSk7CisgIGEuY2xpY2soKTsKKyAgYS5yZW1vdmUoKTsKK30KKworY2xhc3MgRG93bmxvYWRNYW5hZ2VyIHsKKyAgZG93bmxvYWRVcmwodXJsLCBmaWxlbmFtZSkgeworICAgIGlmICghKDAsIF9wZGYuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodXJsLCAiaHR0cDovL2V4YW1wbGUuY29tIikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkb3dubG9hZCh1cmwgKyAiI3BkZmpzLmFjdGlvbj1kb3dubG9hZCIsIGZpbGVuYW1lKTsKKyAgfQorCisgIGRvd25sb2FkRGF0YShkYXRhLCBmaWxlbmFtZSwgY29udGVudFR5cGUpIHsKKyAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHsKKyAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgICB0eXBlOiBjb250ZW50VHlwZQorICAgICAgfSksIGZpbGVuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBibG9iVXJsID0gKDAsIF9wZGYuY3JlYXRlT2JqZWN0VVJMKShkYXRhLCBjb250ZW50VHlwZSwgX3ZpZXdlcl9jb21wYXRpYmlsaXR5LnZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUNyZWF0ZU9iamVjdFVSTCk7CisgICAgZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpOworICB9CisKKyAgZG93bmxvYWQoYmxvYiwgdXJsLCBmaWxlbmFtZSwgc291cmNlRXZlbnRUeXBlID0gImRvd25sb2FkIikgeworICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikgeworICAgICAgaWYgKCFuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBmaWxlbmFtZSkpIHsKKyAgICAgICAgdGhpcy5kb3dubG9hZFVybCh1cmwsIGZpbGVuYW1lKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChfdmlld2VyX2NvbXBhdGliaWxpdHkudmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcy5kaXNhYmxlQ3JlYXRlT2JqZWN0VVJMKSB7CisgICAgICB0aGlzLmRvd25sb2FkVXJsKHVybCwgZmlsZW5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOworICAgIGRvd25sb2FkKGJsb2JVcmwsIGZpbGVuYW1lKTsKKyAgfQorCit9CisKK2V4cG9ydHMuRG93bmxvYWRNYW5hZ2VyID0gRG93bmxvYWRNYW5hZ2VyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvZmlyZWZveF9wcmludF9zZXJ2aWNlLmpzIGIvbGliL3dlYi9maXJlZm94X3ByaW50X3NlcnZpY2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyN2Q2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvZmlyZWZveF9wcmludF9zZXJ2aWNlLmpzCkBAIC0wLDAgKzEsMTM5IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5GaXJlZm94UHJpbnRTZXJ2aWNlID0gRmlyZWZveFByaW50U2VydmljZTsKKwordmFyIF91aV91dGlscyA9IHJlcXVpcmUoIi4vdWlfdXRpbHMuanMiKTsKKwordmFyIF9hcHAgPSByZXF1aXJlKCIuL2FwcC5qcyIpOworCit2YXIgX3BkZiA9IHJlcXVpcmUoIi4uL3BkZiIpOworCitmdW5jdGlvbiBjb21wb3NlUGFnZShwZGZEb2N1bWVudCwgcGFnZU51bWJlciwgc2l6ZSwgcHJpbnRDb250YWluZXIsIHByaW50UmVzb2x1dGlvbiwgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSkgeworICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKKyAgY29uc3QgUFJJTlRfVU5JVFMgPSBwcmludFJlc29sdXRpb24gLyA3Mi4wOworICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHNpemUud2lkdGggKiBQUklOVF9VTklUUyk7CisgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKHNpemUuaGVpZ2h0ICogUFJJTlRfVU5JVFMpOworICBjYW52YXMuc3R5bGUud2lkdGggPSBNYXRoLmZsb29yKHNpemUud2lkdGggKiBfdWlfdXRpbHMuQ1NTX1VOSVRTKSArICJweCI7CisgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKHNpemUuaGVpZ2h0ICogX3VpX3V0aWxzLkNTU19VTklUUykgKyAicHgiOworICBjb25zdCBjYW52YXNXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgIGNhbnZhc1dyYXBwZXIuYXBwZW5kQ2hpbGQoY2FudmFzKTsKKyAgcHJpbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoY2FudmFzV3JhcHBlcik7CisgIGxldCBjdXJyZW50UmVuZGVyVGFzayA9IG51bGw7CisKKyAgY2FudmFzLm1velByaW50Q2FsbGJhY2sgPSBmdW5jdGlvbiAob2JqKSB7CisgICAgY29uc3QgY3R4ID0gb2JqLmNvbnRleHQ7CisgICAgY3R4LnNhdmUoKTsKKyAgICBjdHguZmlsbFN0eWxlID0gInJnYigyNTUsIDI1NSwgMjU1KSI7CisgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CisgICAgY3R4LnJlc3RvcmUoKTsKKyAgICBsZXQgdGhpc1JlbmRlclRhc2sgPSBudWxsOworICAgIHBkZkRvY3VtZW50LmdldFBhZ2UocGFnZU51bWJlcikudGhlbihmdW5jdGlvbiAocGRmUGFnZSkgeworICAgICAgaWYgKGN1cnJlbnRSZW5kZXJUYXNrKSB7CisgICAgICAgIGN1cnJlbnRSZW5kZXJUYXNrLmNhbmNlbCgpOworICAgICAgICBjdXJyZW50UmVuZGVyVGFzayA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7CisgICAgICAgIGNhbnZhc0NvbnRleHQ6IGN0eCwKKyAgICAgICAgdHJhbnNmb3JtOiBbUFJJTlRfVU5JVFMsIDAsIDAsIFBSSU5UX1VOSVRTLCAwLCAwXSwKKyAgICAgICAgdmlld3BvcnQ6IHBkZlBhZ2UuZ2V0Vmlld3BvcnQoeworICAgICAgICAgIHNjYWxlOiAxLAorICAgICAgICAgIHJvdGF0aW9uOiBzaXplLnJvdGF0aW9uCisgICAgICAgIH0pLAorICAgICAgICBpbnRlbnQ6ICJwcmludCIsCisgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBwZGZEb2N1bWVudC5hbm5vdGF0aW9uU3RvcmFnZSwKKyAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZQorICAgICAgfTsKKyAgICAgIGN1cnJlbnRSZW5kZXJUYXNrID0gdGhpc1JlbmRlclRhc2sgPSBwZGZQYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KTsKKyAgICAgIHJldHVybiB0aGlzUmVuZGVyVGFzay5wcm9taXNlOworICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgaWYgKGN1cnJlbnRSZW5kZXJUYXNrID09PSB0aGlzUmVuZGVyVGFzaykgeworICAgICAgICBjdXJyZW50UmVuZGVyVGFzayA9IG51bGw7CisgICAgICB9CisKKyAgICAgIG9iai5kb25lKCk7CisgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKKworICAgICAgaWYgKGN1cnJlbnRSZW5kZXJUYXNrID09PSB0aGlzUmVuZGVyVGFzaykgeworICAgICAgICBjdXJyZW50UmVuZGVyVGFzay5jYW5jZWwoKTsKKyAgICAgICAgY3VycmVudFJlbmRlclRhc2sgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoImFib3J0IiBpbiBvYmopIHsKKyAgICAgICAgb2JqLmFib3J0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvYmouZG9uZSgpOworICAgICAgfQorICAgIH0pOworICB9OworfQorCitmdW5jdGlvbiBGaXJlZm94UHJpbnRTZXJ2aWNlKHBkZkRvY3VtZW50LCBwYWdlc092ZXJ2aWV3LCBwcmludENvbnRhaW5lciwgcHJpbnRSZXNvbHV0aW9uLCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gbnVsbCkgeworICB0aGlzLnBkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7CisgIHRoaXMucGFnZXNPdmVydmlldyA9IHBhZ2VzT3ZlcnZpZXc7CisgIHRoaXMucHJpbnRDb250YWluZXIgPSBwcmludENvbnRhaW5lcjsKKyAgdGhpcy5fcHJpbnRSZXNvbHV0aW9uID0gcHJpbnRSZXNvbHV0aW9uIHx8IDE1MDsKKyAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgfHwgcGRmRG9jdW1lbnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7Cit9CisKK0ZpcmVmb3hQcmludFNlcnZpY2UucHJvdG90eXBlID0geworICBsYXlvdXQoKSB7CisgICAgY29uc3QgeworICAgICAgcGRmRG9jdW1lbnQsCisgICAgICBwYWdlc092ZXJ2aWV3LAorICAgICAgcHJpbnRDb250YWluZXIsCisgICAgICBfcHJpbnRSZXNvbHV0aW9uLAorICAgICAgX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UKKyAgICB9ID0gdGhpczsKKyAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSIpOworICAgIGJvZHkuc2V0QXR0cmlidXRlKCJkYXRhLXBkZmpzcHJpbnRpbmciLCB0cnVlKTsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBhZ2VzT3ZlcnZpZXcubGVuZ3RoOyBpIDwgaWk7ICsraSkgeworICAgICAgY29tcG9zZVBhZ2UocGRmRG9jdW1lbnQsIGkgKyAxLCBwYWdlc092ZXJ2aWV3W2ldLCBwcmludENvbnRhaW5lciwgX3ByaW50UmVzb2x1dGlvbiwgX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UpOworICAgIH0KKyAgfSwKKworICBkZXN0cm95KCkgeworICAgIHRoaXMucHJpbnRDb250YWluZXIudGV4dENvbnRlbnQgPSAiIjsKKyAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSIpOworICAgIGJvZHkucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXBkZmpzcHJpbnRpbmciKTsKKyAgfQorCit9OworX2FwcC5QREZQcmludFNlcnZpY2VGYWN0b3J5Lmluc3RhbmNlID0geworICBnZXQgc3VwcG9ydHNQcmludGluZygpIHsKKyAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKKyAgICBjb25zdCB2YWx1ZSA9ICgibW96UHJpbnRDYWxsYmFjayIgaW4gY2FudmFzKTsKKyAgICByZXR1cm4gKDAsIF9wZGYuc2hhZG93KSh0aGlzLCAic3VwcG9ydHNQcmludGluZyIsIHZhbHVlKTsKKyAgfSwKKworICBjcmVhdGVQcmludFNlcnZpY2UocGRmRG9jdW1lbnQsIHBhZ2VzT3ZlcnZpZXcsIHByaW50Q29udGFpbmVyLCBwcmludFJlc29sdXRpb24sIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UpIHsKKyAgICByZXR1cm4gbmV3IEZpcmVmb3hQcmludFNlcnZpY2UocGRmRG9jdW1lbnQsIHBhZ2VzT3ZlcnZpZXcsIHByaW50Q29udGFpbmVyLCBwcmludFJlc29sdXRpb24sIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UpOworICB9CisKK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9maXJlZm94Y29tLmpzIGIvbGliL3dlYi9maXJlZm94Y29tLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGFlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL2ZpcmVmb3hjb20uanMKQEAgLTAsMCArMSwzODkgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkZpcmVmb3hDb20gPSBleHBvcnRzLkRvd25sb2FkTWFuYWdlciA9IHZvaWQgMDsKKworcmVxdWlyZSgiLi4vZXh0ZW5zaW9ucy9maXJlZm94L3Rvb2xzL2wxMG4uanMiKTsKKwordmFyIF9hcHAgPSByZXF1aXJlKCIuL2FwcC5qcyIpOworCit2YXIgX3BkZiA9IHJlcXVpcmUoIi4uL3BkZiIpOworCit2YXIgX3ByZWZlcmVuY2VzID0gcmVxdWlyZSgiLi9wcmVmZXJlbmNlcy5qcyIpOworCit2YXIgX3VpX3V0aWxzID0gcmVxdWlyZSgiLi91aV91dGlscy5qcyIpOworCit7CisgIHRocm93IG5ldyBFcnJvcignTW9kdWxlICIuL2ZpcmVmb3hjb20uanMiIHNoYWxsIG5vdCBiZSB1c2VkIG91dHNpZGUgTU9aQ0VOVFJBTCBidWlsZHMuJyk7Cit9CisKK2NvbnN0IEZpcmVmb3hDb20gPSBmdW5jdGlvbiBGaXJlZm94Q29tQ2xvc3VyZSgpIHsKKyAgcmV0dXJuIHsKKyAgICByZXF1ZXN0U3luYyhhY3Rpb24sIGRhdGEpIHsKKyAgICAgIGNvbnN0IHJlcXVlc3QgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7CisgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVxdWVzdCk7CisgICAgICBjb25zdCBzZW5kZXIgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKTsKKyAgICAgIHNlbmRlci5pbml0Q3VzdG9tRXZlbnQoInBkZi5qcy5tZXNzYWdlIiwgdHJ1ZSwgZmFsc2UsIHsKKyAgICAgICAgYWN0aW9uLAorICAgICAgICBkYXRhLAorICAgICAgICBzeW5jOiB0cnVlCisgICAgICB9KTsKKyAgICAgIHJlcXVlc3QuZGlzcGF0Y2hFdmVudChzZW5kZXIpOworICAgICAgY29uc3QgcmVzcG9uc2UgPSBzZW5kZXIuZGV0YWlsLnJlc3BvbnNlOworICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKHJlcXVlc3QpOworICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0sCisKKyAgICByZXF1ZXN0KGFjdGlvbiwgZGF0YSwgY2FsbGJhY2spIHsKKyAgICAgIGNvbnN0IHJlcXVlc3QgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7CisKKyAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwZGYuanMucmVzcG9uc2UiLCBmdW5jdGlvbiBsaXN0ZW5lcihldmVudCkgeworICAgICAgICAgIGNvbnN0IG5vZGUgPSBldmVudC50YXJnZXQ7CisgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kZXRhaWwucmVzcG9uc2U7CisgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpOworICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBkZi5qcy5yZXNwb25zZSIsIGxpc3RlbmVyKTsKKyAgICAgICAgICByZXR1cm4gY2FsbGJhY2socmVzcG9uc2UpOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHJlcXVlc3QpOworICAgICAgY29uc3Qgc2VuZGVyID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50Iik7CisgICAgICBzZW5kZXIuaW5pdEN1c3RvbUV2ZW50KCJwZGYuanMubWVzc2FnZSIsIHRydWUsIGZhbHNlLCB7CisgICAgICAgIGFjdGlvbiwKKyAgICAgICAgZGF0YSwKKyAgICAgICAgc3luYzogZmFsc2UsCisgICAgICAgIHJlc3BvbnNlRXhwZWN0ZWQ6ICEhY2FsbGJhY2sKKyAgICAgIH0pOworICAgICAgcmV0dXJuIHJlcXVlc3QuZGlzcGF0Y2hFdmVudChzZW5kZXIpOworICAgIH0KKworICB9OworfSgpOworCitleHBvcnRzLkZpcmVmb3hDb20gPSBGaXJlZm94Q29tOworCitjbGFzcyBEb3dubG9hZE1hbmFnZXIgeworICBkb3dubG9hZFVybCh1cmwsIGZpbGVuYW1lKSB7CisgICAgRmlyZWZveENvbS5yZXF1ZXN0KCJkb3dubG9hZCIsIHsKKyAgICAgIG9yaWdpbmFsVXJsOiB1cmwsCisgICAgICBmaWxlbmFtZQorICAgIH0pOworICB9CisKKyAgZG93bmxvYWREYXRhKGRhdGEsIGZpbGVuYW1lLCBjb250ZW50VHlwZSkgeworICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgdHlwZTogY29udGVudFR5cGUKKyAgICB9KSk7CisKKyAgICBjb25zdCBvblJlc3BvbnNlID0gZXJyID0+IHsKKyAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7CisgICAgfTsKKworICAgIEZpcmVmb3hDb20ucmVxdWVzdCgiZG93bmxvYWQiLCB7CisgICAgICBibG9iVXJsLAorICAgICAgb3JpZ2luYWxVcmw6IGJsb2JVcmwsCisgICAgICBmaWxlbmFtZSwKKyAgICAgIGlzQXR0YWNobWVudDogdHJ1ZQorICAgIH0sIG9uUmVzcG9uc2UpOworICB9CisKKyAgZG93bmxvYWQoYmxvYiwgdXJsLCBmaWxlbmFtZSwgc291cmNlRXZlbnRUeXBlID0gImRvd25sb2FkIikgeworICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOworCisgICAgY29uc3Qgb25SZXNwb25zZSA9IGVyciA9PiB7CisgICAgICBpZiAoZXJyICYmIHRoaXMub25lcnJvcikgeworICAgICAgICB0aGlzLm9uZXJyb3IoZXJyKTsKKyAgICAgIH0KKworICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTsKKyAgICB9OworCisgICAgRmlyZWZveENvbS5yZXF1ZXN0KCJkb3dubG9hZCIsIHsKKyAgICAgIGJsb2JVcmwsCisgICAgICBvcmlnaW5hbFVybDogdXJsLAorICAgICAgZmlsZW5hbWUsCisgICAgICBzb3VyY2VFdmVudFR5cGUKKyAgICB9LCBvblJlc3BvbnNlKTsKKyAgfQorCit9CisKK2V4cG9ydHMuRG93bmxvYWRNYW5hZ2VyID0gRG93bmxvYWRNYW5hZ2VyOworCitjbGFzcyBGaXJlZm94UHJlZmVyZW5jZXMgZXh0ZW5kcyBfcHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VzIHsKKyAgYXN5bmMgX3dyaXRlVG9TdG9yYWdlKHByZWZPYmopIHsKKyAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgIEZpcmVmb3hDb20ucmVxdWVzdCgic2V0UHJlZmVyZW5jZXMiLCBwcmVmT2JqLCByZXNvbHZlKTsKKyAgICB9KTsKKyAgfQorCisgIGFzeW5jIF9yZWFkRnJvbVN0b3JhZ2UocHJlZk9iaikgeworICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeworICAgICAgRmlyZWZveENvbS5yZXF1ZXN0KCJnZXRQcmVmZXJlbmNlcyIsIHByZWZPYmosIGZ1bmN0aW9uIChwcmVmU3RyKSB7CisgICAgICAgIGNvbnN0IHJlYWRQcmVmcyA9IEpTT04ucGFyc2UocHJlZlN0cik7CisgICAgICAgIHJlc29sdmUocmVhZFByZWZzKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKK30KKworY2xhc3MgTW96TDEwbiB7CisgIGNvbnN0cnVjdG9yKG1vekwxMG4pIHsKKyAgICB0aGlzLm1vekwxMG4gPSBtb3pMMTBuOworICB9CisKKyAgYXN5bmMgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgcmV0dXJuIHRoaXMubW96TDEwbi5nZXRMYW5ndWFnZSgpOworICB9CisKKyAgYXN5bmMgZ2V0RGlyZWN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLm1vekwxMG4uZ2V0RGlyZWN0aW9uKCk7CisgIH0KKworICBhc3luYyBnZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKSB7CisgICAgcmV0dXJuIHRoaXMubW96TDEwbi5nZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKTsKKyAgfQorCisgIGFzeW5jIHRyYW5zbGF0ZShlbGVtZW50KSB7CisgICAgdGhpcy5tb3pMMTBuLnRyYW5zbGF0ZShlbGVtZW50KTsKKyAgfQorCit9CisKKyhmdW5jdGlvbiBsaXN0ZW5GaW5kRXZlbnRzKCkgeworICBjb25zdCBldmVudHMgPSBbImZpbmQiLCAiZmluZGFnYWluIiwgImZpbmRoaWdobGlnaHRhbGxjaGFuZ2UiLCAiZmluZGNhc2VzZW5zaXRpdml0eWNoYW5nZSIsICJmaW5kZW50aXJld29yZGNoYW5nZSIsICJmaW5kYmFyY2xvc2UiXTsKKworICBjb25zdCBoYW5kbGVFdmVudCA9IGZ1bmN0aW9uICh7CisgICAgdHlwZSwKKyAgICBkZXRhaWwKKyAgfSkgeworICAgIGlmICghX2FwcC5QREZWaWV3ZXJBcHBsaWNhdGlvbi5pbml0aWFsaXplZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0eXBlID09PSAiZmluZGJhcmNsb3NlIikgeworICAgICAgX2FwcC5QREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5kaXNwYXRjaCh0eXBlLCB7CisgICAgICAgIHNvdXJjZTogd2luZG93CisgICAgICB9KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9hcHAuUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMuZGlzcGF0Y2goImZpbmQiLCB7CisgICAgICBzb3VyY2U6IHdpbmRvdywKKyAgICAgIHR5cGU6IHR5cGUuc3Vic3RyaW5nKCJmaW5kIi5sZW5ndGgpLAorICAgICAgcXVlcnk6IGRldGFpbC5xdWVyeSwKKyAgICAgIHBocmFzZVNlYXJjaDogdHJ1ZSwKKyAgICAgIGNhc2VTZW5zaXRpdmU6ICEhZGV0YWlsLmNhc2VTZW5zaXRpdmUsCisgICAgICBlbnRpcmVXb3JkOiAhIWRldGFpbC5lbnRpcmVXb3JkLAorICAgICAgaGlnaGxpZ2h0QWxsOiAhIWRldGFpbC5oaWdobGlnaHRBbGwsCisgICAgICBmaW5kUHJldmlvdXM6ICEhZGV0YWlsLmZpbmRQcmV2aW91cworICAgIH0pOworICB9OworCisgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZUV2ZW50KTsKKyAgfQorfSkoKTsKKworKGZ1bmN0aW9uIGxpc3Rlblpvb21FdmVudHMoKSB7CisgIGNvbnN0IGV2ZW50cyA9IFsiem9vbWluIiwgInpvb21vdXQiLCAiem9vbXJlc2V0Il07CisKKyAgY29uc3QgaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAoeworICAgIHR5cGUsCisgICAgZGV0YWlsCisgIH0pIHsKKyAgICBpZiAoIV9hcHAuUERGVmlld2VyQXBwbGljYXRpb24uaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodHlwZSA9PT0gInpvb21yZXNldCIgJiYgX2FwcC5QREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuY3VycmVudFNjYWxlVmFsdWUgPT09IF91aV91dGlscy5ERUZBVUxUX1NDQUxFX1ZBTFVFKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgX2FwcC5QREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5kaXNwYXRjaCh0eXBlLCB7CisgICAgICBzb3VyY2U6IHdpbmRvdworICAgIH0pOworICB9OworCisgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZUV2ZW50KTsKKyAgfQorfSkoKTsKKworKGZ1bmN0aW9uIGxpc3RlblNhdmVFdmVudCgpIHsKKyAgY29uc3QgaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAoeworICAgIHR5cGUsCisgICAgZGV0YWlsCisgIH0pIHsKKyAgICBpZiAoIV9hcHAuUERGVmlld2VyQXBwbGljYXRpb24uaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfYXBwLlBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLmRpc3BhdGNoKHR5cGUsIHsKKyAgICAgIHNvdXJjZTogd2luZG93CisgICAgfSk7CisgIH07CisKKyAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNhdmUiLCBoYW5kbGVFdmVudCk7Cit9KSgpOworCitjbGFzcyBGaXJlZm94Q29tRGF0YVJhbmdlVHJhbnNwb3J0IGV4dGVuZHMgX3BkZi5QREZEYXRhUmFuZ2VUcmFuc3BvcnQgeworICByZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpIHsKKyAgICBGaXJlZm94Q29tLnJlcXVlc3QoInJlcXVlc3REYXRhUmFuZ2UiLCB7CisgICAgICBiZWdpbiwKKyAgICAgIGVuZAorICAgIH0pOworICB9CisKKyAgYWJvcnQoKSB7CisgICAgRmlyZWZveENvbS5yZXF1ZXN0U3luYygiYWJvcnRMb2FkaW5nIiwgbnVsbCk7CisgIH0KKworfQorCitjbGFzcyBGaXJlZm94RXh0ZXJuYWxTZXJ2aWNlcyBleHRlbmRzIF9hcHAuRGVmYXVsdEV4dGVybmFsU2VydmljZXMgeworICBzdGF0aWMgdXBkYXRlRmluZENvbnRyb2xTdGF0ZShkYXRhKSB7CisgICAgRmlyZWZveENvbS5yZXF1ZXN0KCJ1cGRhdGVGaW5kQ29udHJvbFN0YXRlIiwgZGF0YSk7CisgIH0KKworICBzdGF0aWMgdXBkYXRlRmluZE1hdGNoZXNDb3VudChkYXRhKSB7CisgICAgRmlyZWZveENvbS5yZXF1ZXN0KCJ1cGRhdGVGaW5kTWF0Y2hlc0NvdW50IiwgZGF0YSk7CisgIH0KKworICBzdGF0aWMgaW5pdFBhc3NpdmVMb2FkaW5nKGNhbGxiYWNrcykgeworICAgIGxldCBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQ7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBmdW5jdGlvbiB3aW5kb3dNZXNzYWdlKGUpIHsKKyAgICAgIGlmIChlLnNvdXJjZSAhPT0gbnVsbCkgeworICAgICAgICBjb25zb2xlLndhcm4oIlJlamVjdGVkIHVudHJ1c3RlZCBtZXNzYWdlIGZyb20gIiArIGUub3JpZ2luKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBjb25zdCBhcmdzID0gZS5kYXRhOworCisgICAgICBpZiAodHlwZW9mIGFyZ3MgIT09ICJvYmplY3QiIHx8ICEoInBkZmpzTG9hZEFjdGlvbiIgaW4gYXJncykpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGFyZ3MucGRmanNMb2FkQWN0aW9uKSB7CisgICAgICAgIGNhc2UgInN1cHBvcnRzUmFuZ2VkTG9hZGluZyI6CisgICAgICAgICAgcGRmRGF0YVJhbmdlVHJhbnNwb3J0ID0gbmV3IEZpcmVmb3hDb21EYXRhUmFuZ2VUcmFuc3BvcnQoYXJncy5sZW5ndGgsIGFyZ3MuZGF0YSwgYXJncy5kb25lKTsKKyAgICAgICAgICBjYWxsYmFja3Mub25PcGVuV2l0aFRyYW5zcG9ydChhcmdzLnBkZlVybCwgYXJncy5sZW5ndGgsIHBkZkRhdGFSYW5nZVRyYW5zcG9ydCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAicmFuZ2UiOgorICAgICAgICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5vbkRhdGFSYW5nZShhcmdzLmJlZ2luLCBhcmdzLmNodW5rKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJyYW5nZVByb2dyZXNzIjoKKyAgICAgICAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQub25EYXRhUHJvZ3Jlc3MoYXJncy5sb2FkZWQpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInByb2dyZXNzaXZlUmVhZCI6CisgICAgICAgICAgcGRmRGF0YVJhbmdlVHJhbnNwb3J0Lm9uRGF0YVByb2dyZXNzaXZlUmVhZChhcmdzLmNodW5rKTsKKyAgICAgICAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQub25EYXRhUHJvZ3Jlc3MoYXJncy5sb2FkZWQsIGFyZ3MudG90YWwpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInByb2dyZXNzaXZlRG9uZSI6CisgICAgICAgICAgaWYgKHBkZkRhdGFSYW5nZVRyYW5zcG9ydCkgeworICAgICAgICAgICAgcGRmRGF0YVJhbmdlVHJhbnNwb3J0Lm9uRGF0YVByb2dyZXNzaXZlRG9uZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInByb2dyZXNzIjoKKyAgICAgICAgICBjYWxsYmFja3Mub25Qcm9ncmVzcyhhcmdzLmxvYWRlZCwgYXJncy50b3RhbCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiY29tcGxldGUiOgorICAgICAgICAgIGlmICghYXJncy5kYXRhKSB7CisgICAgICAgICAgICBjYWxsYmFja3Mub25FcnJvcihhcmdzLmVycm9yQ29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjYWxsYmFja3Mub25PcGVuV2l0aERhdGEoYXJncy5kYXRhKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBGaXJlZm94Q29tLnJlcXVlc3RTeW5jKCJpbml0UGFzc2l2ZUxvYWRpbmciLCBudWxsKTsKKyAgfQorCisgIHN0YXRpYyBmYWxsYmFjayhkYXRhLCBjYWxsYmFjaykgeworICAgIEZpcmVmb3hDb20ucmVxdWVzdCgiZmFsbGJhY2siLCBkYXRhLCBjYWxsYmFjayk7CisgIH0KKworICBzdGF0aWMgcmVwb3J0VGVsZW1ldHJ5KGRhdGEpIHsKKyAgICBGaXJlZm94Q29tLnJlcXVlc3QoInJlcG9ydFRlbGVtZXRyeSIsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTsKKyAgfQorCisgIHN0YXRpYyBjcmVhdGVEb3dubG9hZE1hbmFnZXIob3B0aW9ucykgeworICAgIHJldHVybiBuZXcgRG93bmxvYWRNYW5hZ2VyKG9wdGlvbnMpOworICB9CisKKyAgc3RhdGljIGNyZWF0ZVByZWZlcmVuY2VzKCkgeworICAgIHJldHVybiBuZXcgRmlyZWZveFByZWZlcmVuY2VzKCk7CisgIH0KKworICBzdGF0aWMgY3JlYXRlTDEwbihvcHRpb25zKSB7CisgICAgY29uc3QgbW96TDEwbiA9IGRvY3VtZW50Lm1vekwxMG47CisgICAgcmV0dXJuIG5ldyBNb3pMMTBuKG1vekwxMG4pOworICB9CisKKyAgc3RhdGljIGdldCBzdXBwb3J0c0ludGVncmF0ZWRGaW5kKCkgeworICAgIGNvbnN0IHN1cHBvcnQgPSBGaXJlZm94Q29tLnJlcXVlc3RTeW5jKCJzdXBwb3J0c0ludGVncmF0ZWRGaW5kIik7CisgICAgcmV0dXJuICgwLCBfcGRmLnNoYWRvdykodGhpcywgInN1cHBvcnRzSW50ZWdyYXRlZEZpbmQiLCBzdXBwb3J0KTsKKyAgfQorCisgIHN0YXRpYyBnZXQgc3VwcG9ydHNEb2N1bWVudEZvbnRzKCkgeworICAgIGNvbnN0IHN1cHBvcnQgPSBGaXJlZm94Q29tLnJlcXVlc3RTeW5jKCJzdXBwb3J0c0RvY3VtZW50Rm9udHMiKTsKKyAgICByZXR1cm4gKDAsIF9wZGYuc2hhZG93KSh0aGlzLCAic3VwcG9ydHNEb2N1bWVudEZvbnRzIiwgc3VwcG9ydCk7CisgIH0KKworICBzdGF0aWMgZ2V0IHN1cHBvcnRlZE1vdXNlV2hlZWxab29tTW9kaWZpZXJLZXlzKCkgeworICAgIGNvbnN0IHN1cHBvcnQgPSBGaXJlZm94Q29tLnJlcXVlc3RTeW5jKCJzdXBwb3J0ZWRNb3VzZVdoZWVsWm9vbU1vZGlmaWVyS2V5cyIpOworICAgIHJldHVybiAoMCwgX3BkZi5zaGFkb3cpKHRoaXMsICJzdXBwb3J0ZWRNb3VzZVdoZWVsWm9vbU1vZGlmaWVyS2V5cyIsIHN1cHBvcnQpOworICB9CisKKyAgc3RhdGljIGdldCBpc0luQXV0b21hdGlvbigpIHsKKyAgICBjb25zdCBpc0luQXV0b21hdGlvbiA9IEZpcmVmb3hDb20ucmVxdWVzdFN5bmMoImlzSW5BdXRvbWF0aW9uIik7CisgICAgcmV0dXJuICgwLCBfcGRmLnNoYWRvdykodGhpcywgImlzSW5BdXRvbWF0aW9uIiwgaXNJbkF1dG9tYXRpb24pOworICB9CisKK30KKworX2FwcC5QREZWaWV3ZXJBcHBsaWNhdGlvbi5leHRlcm5hbFNlcnZpY2VzID0gRmlyZWZveEV4dGVybmFsU2VydmljZXM7Citkb2N1bWVudC5tb3pMMTBuLnNldEV4dGVybmFsTG9jYWxpemVyU2VydmljZXMoeworICBnZXRMb2NhbGUoKSB7CisgICAgcmV0dXJuIEZpcmVmb3hDb20ucmVxdWVzdFN5bmMoImdldExvY2FsZSIsIG51bGwpOworICB9LAorCisgIGdldFN0cmluZ3Moa2V5KSB7CisgICAgcmV0dXJuIEZpcmVmb3hDb20ucmVxdWVzdFN5bmMoImdldFN0cmluZ3MiLCBrZXkpOworICB9CisKK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvZ2VuZXJpY2NvbS5qcyBiL2xpYi93ZWIvZ2VuZXJpY2NvbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQ1YWE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9nZW5lcmljY29tLmpzCkBAIC0wLDAgKzEsNjkgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkdlbmVyaWNDb20gPSB2b2lkIDA7CisKK3ZhciBfYXBwID0gcmVxdWlyZSgiLi9hcHAuanMiKTsKKwordmFyIF9wcmVmZXJlbmNlcyA9IHJlcXVpcmUoIi4vcHJlZmVyZW5jZXMuanMiKTsKKwordmFyIF9kb3dubG9hZF9tYW5hZ2VyID0gcmVxdWlyZSgiLi9kb3dubG9hZF9tYW5hZ2VyLmpzIik7CisKK3ZhciBfZ2VuZXJpY2wxMG4gPSByZXF1aXJlKCIuL2dlbmVyaWNsMTBuLmpzIik7CisKKzsKK2NvbnN0IEdlbmVyaWNDb20gPSB7fTsKK2V4cG9ydHMuR2VuZXJpY0NvbSA9IEdlbmVyaWNDb207CisKK2NsYXNzIEdlbmVyaWNQcmVmZXJlbmNlcyBleHRlbmRzIF9wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZXMgeworICBhc3luYyBfd3JpdGVUb1N0b3JhZ2UocHJlZk9iaikgeworICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwZGZqcy5wcmVmZXJlbmNlcyIsIEpTT04uc3RyaW5naWZ5KHByZWZPYmopKTsKKyAgfQorCisgIGFzeW5jIF9yZWFkRnJvbVN0b3JhZ2UocHJlZk9iaikgeworICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwZGZqcy5wcmVmZXJlbmNlcyIpKTsKKyAgfQorCit9CisKK2NsYXNzIEdlbmVyaWNFeHRlcm5hbFNlcnZpY2VzIGV4dGVuZHMgX2FwcC5EZWZhdWx0RXh0ZXJuYWxTZXJ2aWNlcyB7CisgIHN0YXRpYyBjcmVhdGVEb3dubG9hZE1hbmFnZXIob3B0aW9ucykgeworICAgIHJldHVybiBuZXcgX2Rvd25sb2FkX21hbmFnZXIuRG93bmxvYWRNYW5hZ2VyKG9wdGlvbnMpOworICB9CisKKyAgc3RhdGljIGNyZWF0ZVByZWZlcmVuY2VzKCkgeworICAgIHJldHVybiBuZXcgR2VuZXJpY1ByZWZlcmVuY2VzKCk7CisgIH0KKworICBzdGF0aWMgY3JlYXRlTDEwbih7CisgICAgbG9jYWxlID0gImVuLVVTIgorICB9KSB7CisgICAgcmV0dXJuIG5ldyBfZ2VuZXJpY2wxMG4uR2VuZXJpY0wxMG4obG9jYWxlKTsKKyAgfQorCit9CisKK19hcHAuUERGVmlld2VyQXBwbGljYXRpb24uZXh0ZXJuYWxTZXJ2aWNlcyA9IEdlbmVyaWNFeHRlcm5hbFNlcnZpY2VzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvZ2VuZXJpY2wxMG4uanMgYi9saWIvd2ViL2dlbmVyaWNsMTBuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZWY4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL2dlbmVyaWNsMTBuLmpzCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkdlbmVyaWNMMTBuID0gdm9pZCAwOworCityZXF1aXJlKCIuLi9leHRlcm5hbC93ZWJMMTBuL2wxMG4uanMiKTsKKworY29uc3Qgd2ViTDEwbiA9IGRvY3VtZW50LndlYkwxMG47CisKK2NsYXNzIEdlbmVyaWNMMTBuIHsKKyAgY29uc3RydWN0b3IobGFuZykgeworICAgIHRoaXMuX2xhbmcgPSBsYW5nOworICAgIHRoaXMuX3JlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geworICAgICAgd2ViTDEwbi5zZXRMYW5ndWFnZShsYW5nLCAoKSA9PiB7CisgICAgICAgIHJlc29sdmUod2ViTDEwbik7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorCisgIGFzeW5jIGdldExhbmd1YWdlKCkgeworICAgIGNvbnN0IGwxMG4gPSBhd2FpdCB0aGlzLl9yZWFkeTsKKyAgICByZXR1cm4gbDEwbi5nZXRMYW5ndWFnZSgpOworICB9CisKKyAgYXN5bmMgZ2V0RGlyZWN0aW9uKCkgeworICAgIGNvbnN0IGwxMG4gPSBhd2FpdCB0aGlzLl9yZWFkeTsKKyAgICByZXR1cm4gbDEwbi5nZXREaXJlY3Rpb24oKTsKKyAgfQorCisgIGFzeW5jIGdldChwcm9wZXJ0eSwgYXJncywgZmFsbGJhY2spIHsKKyAgICBjb25zdCBsMTBuID0gYXdhaXQgdGhpcy5fcmVhZHk7CisgICAgcmV0dXJuIGwxMG4uZ2V0KHByb3BlcnR5LCBhcmdzLCBmYWxsYmFjayk7CisgIH0KKworICBhc3luYyB0cmFuc2xhdGUoZWxlbWVudCkgeworICAgIGNvbnN0IGwxMG4gPSBhd2FpdCB0aGlzLl9yZWFkeTsKKyAgICByZXR1cm4gbDEwbi50cmFuc2xhdGUoZWxlbWVudCk7CisgIH0KKworfQorCitleHBvcnRzLkdlbmVyaWNMMTBuID0gR2VuZXJpY0wxMG47ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9ncmFiX3RvX3Bhbi5qcyBiL2xpYi93ZWIvZ3JhYl90b19wYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyNzVmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvZ3JhYl90b19wYW4uanMKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkdyYWJUb1BhbiA9IEdyYWJUb1BhbjsKKworZnVuY3Rpb24gR3JhYlRvUGFuKG9wdGlvbnMpIHsKKyAgdGhpcy5lbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50OworICB0aGlzLmRvY3VtZW50ID0gb3B0aW9ucy5lbGVtZW50Lm93bmVyRG9jdW1lbnQ7CisKKyAgaWYgKHR5cGVvZiBvcHRpb25zLmlnbm9yZVRhcmdldCA9PT0gImZ1bmN0aW9uIikgeworICAgIHRoaXMuaWdub3JlVGFyZ2V0ID0gb3B0aW9ucy5pZ25vcmVUYXJnZXQ7CisgIH0KKworICB0aGlzLm9uQWN0aXZlQ2hhbmdlZCA9IG9wdGlvbnMub25BY3RpdmVDaGFuZ2VkOworICB0aGlzLmFjdGl2YXRlID0gdGhpcy5hY3RpdmF0ZS5iaW5kKHRoaXMpOworICB0aGlzLmRlYWN0aXZhdGUgPSB0aGlzLmRlYWN0aXZhdGUuYmluZCh0aGlzKTsKKyAgdGhpcy50b2dnbGUgPSB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpOworICB0aGlzLl9vbm1vdXNlZG93biA9IHRoaXMuX29ubW91c2Vkb3duLmJpbmQodGhpcyk7CisgIHRoaXMuX29ubW91c2Vtb3ZlID0gdGhpcy5fb25tb3VzZW1vdmUuYmluZCh0aGlzKTsKKyAgdGhpcy5fZW5kUGFuID0gdGhpcy5fZW5kUGFuLmJpbmQodGhpcyk7CisgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgb3ZlcmxheS5jbGFzc05hbWUgPSAiZ3JhYi10by1wYW4tZ3JhYmJpbmciOworfQorCitHcmFiVG9QYW4ucHJvdG90eXBlID0geworICBDU1NfQ0xBU1NfR1JBQjogImdyYWItdG8tcGFuLWdyYWIiLAorICBhY3RpdmF0ZTogZnVuY3Rpb24gR3JhYlRvUGFuX2FjdGl2YXRlKCkgeworICAgIGlmICghdGhpcy5hY3RpdmUpIHsKKyAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKKyAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLl9vbm1vdXNlZG93biwgdHJ1ZSk7CisgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLkNTU19DTEFTU19HUkFCKTsKKworICAgICAgaWYgKHRoaXMub25BY3RpdmVDaGFuZ2VkKSB7CisgICAgICAgIHRoaXMub25BY3RpdmVDaGFuZ2VkKHRydWUpOworICAgICAgfQorICAgIH0KKyAgfSwKKyAgZGVhY3RpdmF0ZTogZnVuY3Rpb24gR3JhYlRvUGFuX2RlYWN0aXZhdGUoKSB7CisgICAgaWYgKHRoaXMuYWN0aXZlKSB7CisgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOworICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIHRoaXMuX29ubW91c2Vkb3duLCB0cnVlKTsKKworICAgICAgdGhpcy5fZW5kUGFuKCk7CisKKyAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuQ1NTX0NMQVNTX0dSQUIpOworCisgICAgICBpZiAodGhpcy5vbkFjdGl2ZUNoYW5nZWQpIHsKKyAgICAgICAgdGhpcy5vbkFjdGl2ZUNoYW5nZWQoZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgfSwKKyAgdG9nZ2xlOiBmdW5jdGlvbiBHcmFiVG9QYW5fdG9nZ2xlKCkgeworICAgIGlmICh0aGlzLmFjdGl2ZSkgeworICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuYWN0aXZhdGUoKTsKKyAgICB9CisgIH0sCisgIGlnbm9yZVRhcmdldDogZnVuY3Rpb24gR3JhYlRvUGFuX2lnbm9yZVRhcmdldChub2RlKSB7CisgICAgcmV0dXJuIG5vZGVbbWF0Y2hlc1NlbGVjdG9yXSgiYVtocmVmXSwgYVtocmVmXSAqLCBpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbiwgYnV0dG9uICosIHNlbGVjdCwgb3B0aW9uIik7CisgIH0sCisgIF9vbm1vdXNlZG93bjogZnVuY3Rpb24gR3JhYlRvUGFuX19vbm1vdXNlZG93bihldmVudCkgeworICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgdGhpcy5pZ25vcmVUYXJnZXQoZXZlbnQudGFyZ2V0KSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChldmVudC5vcmlnaW5hbFRhcmdldCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgZXZlbnQub3JpZ2luYWxUYXJnZXQudGFnTmFtZTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuc2Nyb2xsTGVmdFN0YXJ0ID0gdGhpcy5lbGVtZW50LnNjcm9sbExlZnQ7CisgICAgdGhpcy5zY3JvbGxUb3BTdGFydCA9IHRoaXMuZWxlbWVudC5zY3JvbGxUb3A7CisgICAgdGhpcy5jbGllbnRYU3RhcnQgPSBldmVudC5jbGllbnRYOworICAgIHRoaXMuY2xpZW50WVN0YXJ0ID0gZXZlbnQuY2xpZW50WTsKKyAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuX29ubW91c2Vtb3ZlLCB0cnVlKTsKKyAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCB0aGlzLl9lbmRQYW4sIHRydWUpOworICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLl9lbmRQYW4sIHRydWUpOworICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgY29uc3QgZm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OworCisgICAgaWYgKGZvY3VzZWRFbGVtZW50ICYmICFmb2N1c2VkRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7CisgICAgICBmb2N1c2VkRWxlbWVudC5ibHVyKCk7CisgICAgfQorICB9LAorICBfb25tb3VzZW1vdmU6IGZ1bmN0aW9uIEdyYWJUb1Bhbl9fb25tb3VzZW1vdmUoZXZlbnQpIHsKKyAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgdGhpcy5fZW5kUGFuLCB0cnVlKTsKKworICAgIGlmIChpc0xlZnRNb3VzZVJlbGVhc2VkKGV2ZW50KSkgeworICAgICAgdGhpcy5fZW5kUGFuKCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB4RGlmZiA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmNsaWVudFhTdGFydDsKKyAgICBjb25zdCB5RGlmZiA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLmNsaWVudFlTdGFydDsKKyAgICBjb25zdCBzY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcFN0YXJ0IC0geURpZmY7CisgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsTGVmdFN0YXJ0IC0geERpZmY7CisKKyAgICBpZiAodGhpcy5lbGVtZW50LnNjcm9sbFRvKSB7CisgICAgICB0aGlzLmVsZW1lbnQuc2Nyb2xsVG8oeworICAgICAgICB0b3A6IHNjcm9sbFRvcCwKKyAgICAgICAgbGVmdDogc2Nyb2xsTGVmdCwKKyAgICAgICAgYmVoYXZpb3I6ICJpbnN0YW50IgorICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuZWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7CisgICAgICB0aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7CisgICAgfQorCisgICAgaWYgKCF0aGlzLm92ZXJsYXkucGFyZW50Tm9kZSkgeworICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXkpOworICAgIH0KKyAgfSwKKyAgX2VuZFBhbjogZnVuY3Rpb24gR3JhYlRvUGFuX19lbmRQYW4oKSB7CisgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHRoaXMuX2VuZFBhbiwgdHJ1ZSk7CisgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLl9vbm1vdXNlbW92ZSwgdHJ1ZSk7CisgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5fZW5kUGFuLCB0cnVlKTsKKyAgICB0aGlzLm92ZXJsYXkucmVtb3ZlKCk7CisgIH0KK307CitsZXQgbWF0Y2hlc1NlbGVjdG9yOworWyJ3ZWJraXRNIiwgIm1vek0iLCAibXNNIiwgIm9NIiwgIm0iXS5zb21lKGZ1bmN0aW9uIChwcmVmaXgpIHsKKyAgbGV0IG5hbWUgPSBwcmVmaXggKyAiYXRjaGVzIjsKKworICBpZiAobmFtZSBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKKyAgICBtYXRjaGVzU2VsZWN0b3IgPSBuYW1lOworICB9CisKKyAgbmFtZSArPSAiU2VsZWN0b3IiOworCisgIGlmIChuYW1lIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgeworICAgIG1hdGNoZXNTZWxlY3RvciA9IG5hbWU7CisgIH0KKworICByZXR1cm4gbWF0Y2hlc1NlbGVjdG9yOworfSk7Citjb25zdCBpc05vdElFb3JJc0lFMTBwbHVzID0gIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5OworY29uc3QgY2hyb21lID0gd2luZG93LmNocm9tZTsKK2NvbnN0IGlzQ2hyb21lMTVPck9wZXJhMTVwbHVzID0gY2hyb21lICYmIChjaHJvbWUud2Vic3RvcmUgfHwgY2hyb21lLmFwcCk7Citjb25zdCBpc1NhZmFyaTZwbHVzID0gL0FwcGxlLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpICYmIC9WZXJzaW9uXC8oWzYtOV1cZCp8WzEtNV1cZCspLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOworCitmdW5jdGlvbiBpc0xlZnRNb3VzZVJlbGVhc2VkKGV2ZW50KSB7CisgIGlmICgiYnV0dG9ucyIgaW4gZXZlbnQgJiYgaXNOb3RJRW9ySXNJRTEwcGx1cykgeworICAgIHJldHVybiAhKGV2ZW50LmJ1dHRvbnMgJiAxKTsKKyAgfQorCisgIGlmIChpc0Nocm9tZTE1T3JPcGVyYTE1cGx1cyB8fCBpc1NhZmFyaTZwbHVzKSB7CisgICAgcmV0dXJuIGV2ZW50LndoaWNoID09PSAwOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvaW50ZXJmYWNlcy5qcyBiL2xpYi93ZWIvaW50ZXJmYWNlcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjIzNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9pbnRlcmZhY2VzLmpzCkBAIC0wLDAgKzEsMTI1IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5JTDEwbiA9IGV4cG9ydHMuSVBERkFubm90YXRpb25MYXllckZhY3RvcnkgPSBleHBvcnRzLklQREZUZXh0TGF5ZXJGYWN0b3J5ID0gZXhwb3J0cy5JUmVuZGVyYWJsZVZpZXcgPSBleHBvcnRzLklQREZIaXN0b3J5ID0gZXhwb3J0cy5JUERGTGlua1NlcnZpY2UgPSB2b2lkIDA7CisKK2NsYXNzIElQREZMaW5rU2VydmljZSB7CisgIGdldCBwYWdlc0NvdW50KCkge30KKworICBnZXQgcGFnZSgpIHt9CisKKyAgc2V0IHBhZ2UodmFsdWUpIHt9CisKKyAgZ2V0IHJvdGF0aW9uKCkge30KKworICBzZXQgcm90YXRpb24odmFsdWUpIHt9CisKKyAgZ2V0IGV4dGVybmFsTGlua0VuYWJsZWQoKSB7fQorCisgIHNldCBleHRlcm5hbExpbmtFbmFibGVkKHZhbHVlKSB7fQorCisgIG5hdmlnYXRlVG8oZGVzdCkge30KKworICBnZXREZXN0aW5hdGlvbkhhc2goZGVzdCkge30KKworICBnZXRBbmNob3JVcmwoaGFzaCkge30KKworICBzZXRIYXNoKGhhc2gpIHt9CisKKyAgZXhlY3V0ZU5hbWVkQWN0aW9uKGFjdGlvbikge30KKworICBjYWNoZVBhZ2VSZWYocGFnZU51bSwgcGFnZVJlZikge30KKworICBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHt9CisKK30KKworZXhwb3J0cy5JUERGTGlua1NlcnZpY2UgPSBJUERGTGlua1NlcnZpY2U7CisKK2NsYXNzIElQREZIaXN0b3J5IHsKKyAgaW5pdGlhbGl6ZSh7CisgICAgZmluZ2VycHJpbnQsCisgICAgcmVzZXRIaXN0b3J5ID0gZmFsc2UsCisgICAgdXBkYXRlVXJsID0gZmFsc2UKKyAgfSkge30KKworICByZXNldCgpIHt9CisKKyAgcHVzaCh7CisgICAgbmFtZWREZXN0ID0gbnVsbCwKKyAgICBleHBsaWNpdERlc3QsCisgICAgcGFnZU51bWJlcgorICB9KSB7fQorCisgIHB1c2hDdXJyZW50UG9zaXRpb24oKSB7fQorCisgIGJhY2soKSB7fQorCisgIGZvcndhcmQoKSB7fQorCit9CisKK2V4cG9ydHMuSVBERkhpc3RvcnkgPSBJUERGSGlzdG9yeTsKKworY2xhc3MgSVJlbmRlcmFibGVWaWV3IHsKKyAgZ2V0IHJlbmRlcmluZ0lkKCkge30KKworICBnZXQgcmVuZGVyaW5nU3RhdGUoKSB7fQorCisgIGRyYXcoKSB7fQorCisgIHJlc3VtZSgpIHt9CisKK30KKworZXhwb3J0cy5JUmVuZGVyYWJsZVZpZXcgPSBJUmVuZGVyYWJsZVZpZXc7CisKK2NsYXNzIElQREZUZXh0TGF5ZXJGYWN0b3J5IHsKKyAgY3JlYXRlVGV4dExheWVyQnVpbGRlcih0ZXh0TGF5ZXJEaXYsIHBhZ2VJbmRleCwgdmlld3BvcnQsIGVuaGFuY2VUZXh0U2VsZWN0aW9uID0gZmFsc2UsIGV2ZW50QnVzKSB7fQorCit9CisKK2V4cG9ydHMuSVBERlRleHRMYXllckZhY3RvcnkgPSBJUERGVGV4dExheWVyRmFjdG9yeTsKKworY2xhc3MgSVBERkFubm90YXRpb25MYXllckZhY3RvcnkgeworICBjcmVhdGVBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKHBhZ2VEaXYsIHBkZlBhZ2UsIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCwgaW1hZ2VSZXNvdXJjZXNQYXRoID0gIiIsIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSB0cnVlLCBsMTBuID0gdW5kZWZpbmVkKSB7fQorCit9CisKK2V4cG9ydHMuSVBERkFubm90YXRpb25MYXllckZhY3RvcnkgPSBJUERGQW5ub3RhdGlvbkxheWVyRmFjdG9yeTsKKworY2xhc3MgSUwxMG4geworICBhc3luYyBnZXRMYW5ndWFnZSgpIHt9CisKKyAgYXN5bmMgZ2V0RGlyZWN0aW9uKCkge30KKworICBhc3luYyBnZXQoa2V5LCBhcmdzLCBmYWxsYmFjaykge30KKworICBhc3luYyB0cmFuc2xhdGUoZWxlbWVudCkge30KKworfQorCitleHBvcnRzLklMMTBuID0gSUwxMG47ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9vdmVybGF5X21hbmFnZXIuanMgYi9saWIvd2ViL292ZXJsYXlfbWFuYWdlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjZmODM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9vdmVybGF5X21hbmFnZXIuanMKQEAgLTAsMCArMSwxMjYgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLk92ZXJsYXlNYW5hZ2VyID0gdm9pZCAwOworCitjbGFzcyBPdmVybGF5TWFuYWdlciB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuX292ZXJsYXlzID0ge307CisgICAgdGhpcy5fYWN0aXZlID0gbnVsbDsKKyAgICB0aGlzLl9rZXlEb3duQm91bmQgPSB0aGlzLl9rZXlEb3duLmJpbmQodGhpcyk7CisgIH0KKworICBnZXQgYWN0aXZlKCkgeworICAgIHJldHVybiB0aGlzLl9hY3RpdmU7CisgIH0KKworICBhc3luYyByZWdpc3RlcihuYW1lLCBlbGVtZW50LCBjYWxsZXJDbG9zZU1ldGhvZCA9IG51bGwsIGNhbkZvcmNlQ2xvc2UgPSBmYWxzZSkgeworICAgIGxldCBjb250YWluZXI7CisKKyAgICBpZiAoIW5hbWUgfHwgIWVsZW1lbnQgfHwgIShjb250YWluZXIgPSBlbGVtZW50LnBhcmVudE5vZGUpKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBlbm91Z2ggcGFyYW1ldGVycy4iKTsKKyAgICB9IGVsc2UgaWYgKHRoaXMuX292ZXJsYXlzW25hbWVdKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBvdmVybGF5IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4iKTsKKyAgICB9CisKKyAgICB0aGlzLl9vdmVybGF5c1tuYW1lXSA9IHsKKyAgICAgIGVsZW1lbnQsCisgICAgICBjb250YWluZXIsCisgICAgICBjYWxsZXJDbG9zZU1ldGhvZCwKKyAgICAgIGNhbkZvcmNlQ2xvc2UKKyAgICB9OworICB9CisKKyAgYXN5bmMgdW5yZWdpc3RlcihuYW1lKSB7CisgICAgaWYgKCF0aGlzLl9vdmVybGF5c1tuYW1lXSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgb3ZlcmxheSBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICB9IGVsc2UgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gbmFtZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgb3ZlcmxheSBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSBpdCBpcyBhY3RpdmUuIik7CisgICAgfQorCisgICAgZGVsZXRlIHRoaXMuX292ZXJsYXlzW25hbWVdOworICB9CisKKyAgYXN5bmMgb3BlbihuYW1lKSB7CisgICAgaWYgKCF0aGlzLl9vdmVybGF5c1tuYW1lXSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgb3ZlcmxheSBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICB9IGVsc2UgaWYgKHRoaXMuX2FjdGl2ZSkgeworICAgICAgaWYgKHRoaXMuX292ZXJsYXlzW25hbWVdLmNhbkZvcmNlQ2xvc2UpIHsKKyAgICAgICAgdGhpcy5fY2xvc2VUaHJvdWdoQ2FsbGVyKCk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gbmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBvdmVybGF5IGlzIGFscmVhZHkgYWN0aXZlLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbm90aGVyIG92ZXJsYXkgaXMgY3VycmVudGx5IGFjdGl2ZS4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLl9hY3RpdmUgPSBuYW1lOworCisgICAgdGhpcy5fb3ZlcmxheXNbdGhpcy5fYWN0aXZlXS5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOworCisgICAgdGhpcy5fb3ZlcmxheXNbdGhpcy5fYWN0aXZlXS5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7CisKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMuX2tleURvd25Cb3VuZCk7CisgIH0KKworICBhc3luYyBjbG9zZShuYW1lKSB7CisgICAgaWYgKCF0aGlzLl9vdmVybGF5c1tuYW1lXSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgb3ZlcmxheSBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICB9IGVsc2UgaWYgKCF0aGlzLl9hY3RpdmUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIG92ZXJsYXkgaXMgY3VycmVudGx5IG5vdCBhY3RpdmUuIik7CisgICAgfSBlbHNlIGlmICh0aGlzLl9hY3RpdmUgIT09IG5hbWUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQW5vdGhlciBvdmVybGF5IGlzIGN1cnJlbnRseSBhY3RpdmUuIik7CisgICAgfQorCisgICAgdGhpcy5fb3ZlcmxheXNbdGhpcy5fYWN0aXZlXS5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7CisKKyAgICB0aGlzLl9vdmVybGF5c1t0aGlzLl9hY3RpdmVdLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7CisKKyAgICB0aGlzLl9hY3RpdmUgPSBudWxsOworICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5fa2V5RG93bkJvdW5kKTsKKyAgfQorCisgIF9rZXlEb3duKGV2dCkgeworICAgIGlmICh0aGlzLl9hY3RpdmUgJiYgZXZ0LmtleUNvZGUgPT09IDI3KSB7CisgICAgICB0aGlzLl9jbG9zZVRocm91Z2hDYWxsZXIoKTsKKworICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgICAgfQorICB9CisKKyAgX2Nsb3NlVGhyb3VnaENhbGxlcigpIHsKKyAgICBpZiAodGhpcy5fb3ZlcmxheXNbdGhpcy5fYWN0aXZlXS5jYWxsZXJDbG9zZU1ldGhvZCkgeworICAgICAgdGhpcy5fb3ZlcmxheXNbdGhpcy5fYWN0aXZlXS5jYWxsZXJDbG9zZU1ldGhvZCgpOworICAgIH0KKworICAgIGlmICh0aGlzLl9hY3RpdmUpIHsKKyAgICAgIHRoaXMuY2xvc2UodGhpcy5fYWN0aXZlKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLk92ZXJsYXlNYW5hZ2VyID0gT3ZlcmxheU1hbmFnZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9wYXNzd29yZF9wcm9tcHQuanMgYi9saWIvd2ViL3Bhc3N3b3JkX3Byb21wdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzA3ZDdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9wYXNzd29yZF9wcm9tcHQuanMKQEAgLTAsMCArMSw5NCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUGFzc3dvcmRQcm9tcHQgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK3ZhciBfcGRmID0gcmVxdWlyZSgiLi4vcGRmIik7CisKK2NsYXNzIFBhc3N3b3JkUHJvbXB0IHsKKyAgY29uc3RydWN0b3Iob3B0aW9ucywgb3ZlcmxheU1hbmFnZXIsIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4pIHsKKyAgICB0aGlzLm92ZXJsYXlOYW1lID0gb3B0aW9ucy5vdmVybGF5TmFtZTsKKyAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyOworICAgIHRoaXMubGFiZWwgPSBvcHRpb25zLmxhYmVsOworICAgIHRoaXMuaW5wdXQgPSBvcHRpb25zLmlucHV0OworICAgIHRoaXMuc3VibWl0QnV0dG9uID0gb3B0aW9ucy5zdWJtaXRCdXR0b247CisgICAgdGhpcy5jYW5jZWxCdXR0b24gPSBvcHRpb25zLmNhbmNlbEJ1dHRvbjsKKyAgICB0aGlzLm92ZXJsYXlNYW5hZ2VyID0gb3ZlcmxheU1hbmFnZXI7CisgICAgdGhpcy5sMTBuID0gbDEwbjsKKyAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrID0gbnVsbDsKKyAgICB0aGlzLnJlYXNvbiA9IG51bGw7CisgICAgdGhpcy5zdWJtaXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLnZlcmlmeS5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLmNhbmNlbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuY2xvc2UuYmluZCh0aGlzKSk7CisgICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CisgICAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeworICAgICAgICB0aGlzLnZlcmlmeSgpOworICAgICAgfQorICAgIH0pOworICAgIHRoaXMub3ZlcmxheU1hbmFnZXIucmVnaXN0ZXIodGhpcy5vdmVybGF5TmFtZSwgdGhpcy5jb250YWluZXIsIHRoaXMuY2xvc2UuYmluZCh0aGlzKSwgdHJ1ZSk7CisgIH0KKworICBvcGVuKCkgeworICAgIHRoaXMub3ZlcmxheU1hbmFnZXIub3Blbih0aGlzLm92ZXJsYXlOYW1lKS50aGVuKCgpID0+IHsKKyAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTsKKyAgICAgIGxldCBwcm9tcHRTdHJpbmc7CisKKyAgICAgIGlmICh0aGlzLnJlYXNvbiA9PT0gX3BkZi5QYXNzd29yZFJlc3BvbnNlcy5JTkNPUlJFQ1RfUEFTU1dPUkQpIHsKKyAgICAgICAgcHJvbXB0U3RyaW5nID0gdGhpcy5sMTBuLmdldCgicGFzc3dvcmRfaW52YWxpZCIsIG51bGwsICJJbnZhbGlkIHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvbXB0U3RyaW5nID0gdGhpcy5sMTBuLmdldCgicGFzc3dvcmRfbGFiZWwiLCBudWxsLCAiRW50ZXIgdGhlIHBhc3N3b3JkIHRvIG9wZW4gdGhpcyBQREYgZmlsZS4iKTsKKyAgICAgIH0KKworICAgICAgcHJvbXB0U3RyaW5nLnRoZW4obXNnID0+IHsKKyAgICAgICAgdGhpcy5sYWJlbC50ZXh0Q29udGVudCA9IG1zZzsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgY2xvc2UoKSB7CisgICAgdGhpcy5vdmVybGF5TWFuYWdlci5jbG9zZSh0aGlzLm92ZXJsYXlOYW1lKS50aGVuKCgpID0+IHsKKyAgICAgIHRoaXMuaW5wdXQudmFsdWUgPSAiIjsKKyAgICB9KTsKKyAgfQorCisgIHZlcmlmeSgpIHsKKyAgICBjb25zdCBwYXNzd29yZCA9IHRoaXMuaW5wdXQudmFsdWU7CisKKyAgICBpZiAocGFzc3dvcmQgJiYgcGFzc3dvcmQubGVuZ3RoID4gMCkgeworICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgdGhpcy51cGRhdGVDYWxsYmFjayhwYXNzd29yZCk7CisgICAgfQorICB9CisKKyAgc2V0VXBkYXRlQ2FsbGJhY2sodXBkYXRlQ2FsbGJhY2ssIHJlYXNvbikgeworICAgIHRoaXMudXBkYXRlQ2FsbGJhY2sgPSB1cGRhdGVDYWxsYmFjazsKKyAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjsKKyAgfQorCit9CisKK2V4cG9ydHMuUGFzc3dvcmRQcm9tcHQgPSBQYXNzd29yZFByb21wdDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9hdHRhY2htZW50X3ZpZXdlci5qcyBiL2xpYi93ZWIvcGRmX2F0dGFjaG1lbnRfdmlld2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTc1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3BkZl9hdHRhY2htZW50X3ZpZXdlci5qcwpAQCAtMCwwICsxLDIxMyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGQXR0YWNobWVudFZpZXdlciA9IHZvaWQgMDsKKwordmFyIF9wZGYgPSByZXF1aXJlKCIuLi9wZGYiKTsKKwordmFyIF9iYXNlX3RyZWVfdmlld2VyID0gcmVxdWlyZSgiLi9iYXNlX3RyZWVfdmlld2VyLmpzIik7CisKK3ZhciBfdmlld2VyX2NvbXBhdGliaWxpdHkgPSByZXF1aXJlKCIuL3ZpZXdlcl9jb21wYXRpYmlsaXR5LmpzIik7CisKK2NvbnN0IFBkZkZpbGVSZWdFeHAgPSAvXC5wZGYkL2k7CisKK2NsYXNzIFBERkF0dGFjaG1lbnRWaWV3ZXIgZXh0ZW5kcyBfYmFzZV90cmVlX3ZpZXdlci5CYXNlVHJlZVZpZXdlciB7CisgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKKyAgICBzdXBlcihvcHRpb25zKTsKKyAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IG9wdGlvbnMuZG93bmxvYWRNYW5hZ2VyOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oImZpbGVhdHRhY2htZW50YW5ub3RhdGlvbiIsIHRoaXMuX2FwcGVuZEF0dGFjaG1lbnQuYmluZCh0aGlzKSk7CisgIH0KKworICByZXNldChrZWVwUmVuZGVyZWRDYXBhYmlsaXR5ID0gZmFsc2UpIHsKKyAgICBzdXBlci5yZXNldCgpOworICAgIHRoaXMuX2F0dGFjaG1lbnRzID0gbnVsbDsKKworICAgIGlmICgha2VlcFJlbmRlcmVkQ2FwYWJpbGl0eSkgeworICAgICAgdGhpcy5fcmVuZGVyZWRDYXBhYmlsaXR5ID0gKDAsIF9wZGYuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuX3BlbmRpbmdEaXNwYXRjaEV2ZW50KSB7CisgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ0Rpc3BhdGNoRXZlbnQpOworICAgIH0KKworICAgIHRoaXMuX3BlbmRpbmdEaXNwYXRjaEV2ZW50ID0gbnVsbDsKKyAgfQorCisgIF9kaXNwYXRjaEV2ZW50KGF0dGFjaG1lbnRzQ291bnQpIHsKKyAgICB0aGlzLl9yZW5kZXJlZENhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgaWYgKHRoaXMuX3BlbmRpbmdEaXNwYXRjaEV2ZW50KSB7CisgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ0Rpc3BhdGNoRXZlbnQpOworICAgICAgdGhpcy5fcGVuZGluZ0Rpc3BhdGNoRXZlbnQgPSBudWxsOworICAgIH0KKworICAgIGlmIChhdHRhY2htZW50c0NvdW50ID09PSAwKSB7CisgICAgICB0aGlzLl9wZW5kaW5nRGlzcGF0Y2hFdmVudCA9IHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJhdHRhY2htZW50c2xvYWRlZCIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgYXR0YWNobWVudHNDb3VudDogMAorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5fcGVuZGluZ0Rpc3BhdGNoRXZlbnQgPSBudWxsOworICAgICAgfSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgiYXR0YWNobWVudHNsb2FkZWQiLCB7CisgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICBhdHRhY2htZW50c0NvdW50CisgICAgfSk7CisgIH0KKworICBfYmluZFBkZkxpbmsoZWxlbWVudCwgeworICAgIGNvbnRlbnQsCisgICAgZmlsZW5hbWUKKyAgfSkgeworICAgIGxldCBibG9iVXJsOworCisgICAgZWxlbWVudC5vbmNsaWNrID0gKCkgPT4geworICAgICAgaWYgKCFibG9iVXJsKSB7CisgICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtjb250ZW50XSwgeworICAgICAgICAgIHR5cGU6ICJhcHBsaWNhdGlvbi9wZGYiCisgICAgICAgIH0pKTsKKyAgICAgIH0KKworICAgICAgbGV0IHZpZXdlclVybDsKKyAgICAgIHZpZXdlclVybCA9ICI/ZmlsZT0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JVcmwgKyAiIyIgKyBmaWxlbmFtZSk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHdpbmRvdy5vcGVuKHZpZXdlclVybCk7CisgICAgICB9IGNhdGNoIChleCkgeworICAgICAgICBjb25zb2xlLmVycm9yKGBfYmluZFBkZkxpbms6ICR7ZXh9YCk7CisgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7CisgICAgICAgIGJsb2JVcmwgPSBudWxsOworICAgICAgICB0aGlzLmRvd25sb2FkTWFuYWdlci5kb3dubG9hZERhdGEoY29udGVudCwgZmlsZW5hbWUsICJhcHBsaWNhdGlvbi9wZGYiKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisgIH0KKworICBfYmluZExpbmsoZWxlbWVudCwgeworICAgIGNvbnRlbnQsCisgICAgZmlsZW5hbWUKKyAgfSkgeworICAgIGVsZW1lbnQub25jbGljayA9ICgpID0+IHsKKyAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gUGRmRmlsZVJlZ0V4cC50ZXN0KGZpbGVuYW1lKSA/ICJhcHBsaWNhdGlvbi9wZGYiIDogIiI7CisgICAgICB0aGlzLmRvd25sb2FkTWFuYWdlci5kb3dubG9hZERhdGEoY29udGVudCwgZmlsZW5hbWUsIGNvbnRlbnRUeXBlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworICB9CisKKyAgcmVuZGVyKHsKKyAgICBhdHRhY2htZW50cywKKyAgICBrZWVwUmVuZGVyZWRDYXBhYmlsaXR5ID0gZmFsc2UKKyAgfSkgeworICAgIGlmICh0aGlzLl9hdHRhY2htZW50cykgeworICAgICAgdGhpcy5yZXNldChrZWVwUmVuZGVyZWRDYXBhYmlsaXR5KTsKKyAgICB9CisKKyAgICB0aGlzLl9hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzIHx8IG51bGw7CisKKyAgICBpZiAoIWF0dGFjaG1lbnRzKSB7CisgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50KDApOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhhdHRhY2htZW50cykuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgcmV0dXJuIGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSk7CisgICAgfSk7CisgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgbGV0IGF0dGFjaG1lbnRzQ291bnQgPSAwOworCisgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7CisgICAgICBjb25zdCBpdGVtID0gYXR0YWNobWVudHNbbmFtZV07CisgICAgICBjb25zdCBmaWxlbmFtZSA9ICgwLCBfcGRmLmdldEZpbGVuYW1lRnJvbVVybCkoaXRlbS5maWxlbmFtZSk7CisgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgIGRpdi5jbGFzc05hbWUgPSAidHJlZUl0ZW0iOworICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKworICAgICAgaWYgKFBkZkZpbGVSZWdFeHAudGVzdChmaWxlbmFtZSkgJiYgIV92aWV3ZXJfY29tcGF0aWJpbGl0eS52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVDcmVhdGVPYmplY3RVUkwpIHsKKyAgICAgICAgdGhpcy5fYmluZFBkZkxpbmsoZWxlbWVudCwgeworICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0uY29udGVudCwKKyAgICAgICAgICBmaWxlbmFtZQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuX2JpbmRMaW5rKGVsZW1lbnQsIHsKKyAgICAgICAgICBjb250ZW50OiBpdGVtLmNvbnRlbnQsCisgICAgICAgICAgZmlsZW5hbWUKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLl9ub3JtYWxpemVUZXh0Q29udGVudChmaWxlbmFtZSk7CisgICAgICBkaXYuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChkaXYpOworICAgICAgYXR0YWNobWVudHNDb3VudCsrOworICAgIH0KKworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTsKKworICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoYXR0YWNobWVudHNDb3VudCk7CisgIH0KKworICBfYXBwZW5kQXR0YWNobWVudCh7CisgICAgaWQsCisgICAgZmlsZW5hbWUsCisgICAgY29udGVudAorICB9KSB7CisgICAgY29uc3QgcmVuZGVyZWRQcm9taXNlID0gdGhpcy5fcmVuZGVyZWRDYXBhYmlsaXR5LnByb21pc2U7CisgICAgcmVuZGVyZWRQcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgaWYgKHJlbmRlcmVkUHJvbWlzZSAhPT0gdGhpcy5fcmVuZGVyZWRDYXBhYmlsaXR5LnByb21pc2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBsZXQgYXR0YWNobWVudHMgPSB0aGlzLl9hdHRhY2htZW50czsKKworICAgICAgaWYgKCFhdHRhY2htZW50cykgeworICAgICAgICBhdHRhY2htZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gYXR0YWNobWVudHMpIHsKKyAgICAgICAgICBpZiAoaWQgPT09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYXR0YWNobWVudHNbaWRdID0geworICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgY29udGVudAorICAgICAgfTsKKyAgICAgIHRoaXMucmVuZGVyKHsKKyAgICAgICAgYXR0YWNobWVudHMsCisgICAgICAgIGtlZXBSZW5kZXJlZENhcGFiaWxpdHk6IHRydWUKKyAgICAgIH0pOworICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5QREZBdHRhY2htZW50Vmlld2VyID0gUERGQXR0YWNobWVudFZpZXdlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9jdXJzb3JfdG9vbHMuanMgYi9saWIvd2ViL3BkZl9jdXJzb3JfdG9vbHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjY2YwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvcGRmX2N1cnNvcl90b29scy5qcwpAQCAtMCwwICsxLDEzOSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGQ3Vyc29yVG9vbHMgPSBleHBvcnRzLkN1cnNvclRvb2wgPSB2b2lkIDA7CisKK3ZhciBfZ3JhYl90b19wYW4gPSByZXF1aXJlKCIuL2dyYWJfdG9fcGFuLmpzIik7CisKK2NvbnN0IEN1cnNvclRvb2wgPSB7CisgIFNFTEVDVDogMCwKKyAgSEFORDogMSwKKyAgWk9PTTogMgorfTsKK2V4cG9ydHMuQ3Vyc29yVG9vbCA9IEN1cnNvclRvb2w7CisKK2NsYXNzIFBERkN1cnNvclRvb2xzIHsKKyAgY29uc3RydWN0b3IoeworICAgIGNvbnRhaW5lciwKKyAgICBldmVudEJ1cywKKyAgICBjdXJzb3JUb29sT25Mb2FkID0gQ3Vyc29yVG9vbC5TRUxFQ1QKKyAgfSkgeworICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1czsKKyAgICB0aGlzLmFjdGl2ZSA9IEN1cnNvclRvb2wuU0VMRUNUOworICAgIHRoaXMuYWN0aXZlQmVmb3JlUHJlc2VudGF0aW9uTW9kZSA9IG51bGw7CisgICAgdGhpcy5oYW5kVG9vbCA9IG5ldyBfZ3JhYl90b19wYW4uR3JhYlRvUGFuKHsKKyAgICAgIGVsZW1lbnQ6IHRoaXMuY29udGFpbmVyCisgICAgfSk7CisKKyAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpOworCisgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CisgICAgICB0aGlzLnN3aXRjaFRvb2woY3Vyc29yVG9vbE9uTG9hZCk7CisgICAgfSk7CisgIH0KKworICBnZXQgYWN0aXZlVG9vbCgpIHsKKyAgICByZXR1cm4gdGhpcy5hY3RpdmU7CisgIH0KKworICBzd2l0Y2hUb29sKHRvb2wpIHsKKyAgICBpZiAodGhpcy5hY3RpdmVCZWZvcmVQcmVzZW50YXRpb25Nb2RlICE9PSBudWxsKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRvb2wgPT09IHRoaXMuYWN0aXZlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgZGlzYWJsZUFjdGl2ZVRvb2wgPSAoKSA9PiB7CisgICAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlKSB7CisgICAgICAgIGNhc2UgQ3Vyc29yVG9vbC5TRUxFQ1Q6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDdXJzb3JUb29sLkhBTkQ6CisgICAgICAgICAgdGhpcy5oYW5kVG9vbC5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDdXJzb3JUb29sLlpPT006CisgICAgICB9CisgICAgfTsKKworICAgIHN3aXRjaCAodG9vbCkgeworICAgICAgY2FzZSBDdXJzb3JUb29sLlNFTEVDVDoKKyAgICAgICAgZGlzYWJsZUFjdGl2ZVRvb2woKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ3Vyc29yVG9vbC5IQU5EOgorICAgICAgICBkaXNhYmxlQWN0aXZlVG9vbCgpOworICAgICAgICB0aGlzLmhhbmRUb29sLmFjdGl2YXRlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEN1cnNvclRvb2wuWk9PTToKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNvbnNvbGUuZXJyb3IoYHN3aXRjaFRvb2w6ICIke3Rvb2x9IiBpcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZS5gKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuYWN0aXZlID0gdG9vbDsKKworICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoKTsKKyAgfQorCisgIF9kaXNwYXRjaEV2ZW50KCkgeworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImN1cnNvcnRvb2xjaGFuZ2VkIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgdG9vbDogdGhpcy5hY3RpdmUKKyAgICB9KTsKKyAgfQorCisgIF9hZGRFdmVudExpc3RlbmVycygpIHsKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigic3dpdGNoY3Vyc29ydG9vbCIsIGV2dCA9PiB7CisgICAgICB0aGlzLnN3aXRjaFRvb2woZXZ0LnRvb2wpOworICAgIH0pOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkIiwgZXZ0ID0+IHsKKyAgICAgIGlmIChldnQuc3dpdGNoSW5Qcm9ncmVzcykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGxldCBwcmV2aW91c2x5QWN0aXZlOworCisgICAgICBpZiAoZXZ0LmFjdGl2ZSkgeworICAgICAgICBwcmV2aW91c2x5QWN0aXZlID0gdGhpcy5hY3RpdmU7CisgICAgICAgIHRoaXMuc3dpdGNoVG9vbChDdXJzb3JUb29sLlNFTEVDVCk7CisgICAgICAgIHRoaXMuYWN0aXZlQmVmb3JlUHJlc2VudGF0aW9uTW9kZSA9IHByZXZpb3VzbHlBY3RpdmU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmV2aW91c2x5QWN0aXZlID0gdGhpcy5hY3RpdmVCZWZvcmVQcmVzZW50YXRpb25Nb2RlOworICAgICAgICB0aGlzLmFjdGl2ZUJlZm9yZVByZXNlbnRhdGlvbk1vZGUgPSBudWxsOworICAgICAgICB0aGlzLnN3aXRjaFRvb2wocHJldmlvdXNseUFjdGl2ZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLlBERkN1cnNvclRvb2xzID0gUERGQ3Vyc29yVG9vbHM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9wZGZfZG9jdW1lbnRfcHJvcGVydGllcy5qcyBiL2xpYi93ZWIvcGRmX2RvY3VtZW50X3Byb3BlcnRpZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjMjdmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvcGRmX2RvY3VtZW50X3Byb3BlcnRpZXMuanMKQEAgLTAsMCArMSwzMTAgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERkRvY3VtZW50UHJvcGVydGllcyA9IHZvaWQgMDsKKwordmFyIF9wZGYgPSByZXF1aXJlKCIuLi9wZGYiKTsKKwordmFyIF91aV91dGlscyA9IHJlcXVpcmUoIi4vdWlfdXRpbHMuanMiKTsKKworY29uc3QgREVGQVVMVF9GSUVMRF9DT05URU5UID0gIi0iOworY29uc3QgTk9OX01FVFJJQ19MT0NBTEVTID0gWyJlbi11cyIsICJlbi1sciIsICJteSJdOworY29uc3QgVVNfUEFHRV9OQU1FUyA9IHsKKyAgIjguNXgxMSI6ICJMZXR0ZXIiLAorICAiOC41eDE0IjogIkxlZ2FsIgorfTsKK2NvbnN0IE1FVFJJQ19QQUdFX05BTUVTID0geworICAiMjk3eDQyMCI6ICJBMyIsCisgICIyMTB4Mjk3IjogIkE0IgorfTsKKworZnVuY3Rpb24gZ2V0UGFnZU5hbWUoc2l6ZSwgaXNQb3J0cmFpdCwgcGFnZU5hbWVzKSB7CisgIGNvbnN0IHdpZHRoID0gaXNQb3J0cmFpdCA/IHNpemUud2lkdGggOiBzaXplLmhlaWdodDsKKyAgY29uc3QgaGVpZ2h0ID0gaXNQb3J0cmFpdCA/IHNpemUuaGVpZ2h0IDogc2l6ZS53aWR0aDsKKyAgcmV0dXJuIHBhZ2VOYW1lc1tgJHt3aWR0aH14JHtoZWlnaHR9YF07Cit9CisKK2NsYXNzIFBERkRvY3VtZW50UHJvcGVydGllcyB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBvdmVybGF5TmFtZSwKKyAgICBmaWVsZHMsCisgICAgY29udGFpbmVyLAorICAgIGNsb3NlQnV0dG9uCisgIH0sIG92ZXJsYXlNYW5hZ2VyLCBldmVudEJ1cywgbDEwbiA9IF91aV91dGlscy5OdWxsTDEwbikgeworICAgIHRoaXMub3ZlcmxheU5hbWUgPSBvdmVybGF5TmFtZTsKKyAgICB0aGlzLmZpZWxkcyA9IGZpZWxkczsKKyAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICB0aGlzLm92ZXJsYXlNYW5hZ2VyID0gb3ZlcmxheU1hbmFnZXI7CisgICAgdGhpcy5sMTBuID0gbDEwbjsKKworICAgIHRoaXMuX3Jlc2V0KCk7CisKKyAgICBjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuY2xvc2UuYmluZCh0aGlzKSk7CisgICAgdGhpcy5vdmVybGF5TWFuYWdlci5yZWdpc3Rlcih0aGlzLm92ZXJsYXlOYW1lLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jbG9zZS5iaW5kKHRoaXMpKTsKKworICAgIGV2ZW50QnVzLl9vbigicGFnZWNoYW5naW5nIiwgZXZ0ID0+IHsKKyAgICAgIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID0gZXZ0LnBhZ2VOdW1iZXI7CisgICAgfSk7CisKKyAgICBldmVudEJ1cy5fb24oInJvdGF0aW9uY2hhbmdpbmciLCBldnQgPT4geworICAgICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IGV2dC5wYWdlc1JvdGF0aW9uOworICAgIH0pOworCisgICAgdGhpcy5faXNOb25NZXRyaWNMb2NhbGUgPSB0cnVlOworICAgIGwxMG4uZ2V0TGFuZ3VhZ2UoKS50aGVuKGxvY2FsZSA9PiB7CisgICAgICB0aGlzLl9pc05vbk1ldHJpY0xvY2FsZSA9IE5PTl9NRVRSSUNfTE9DQUxFUy5pbmNsdWRlcyhsb2NhbGUpOworICAgIH0pOworICB9CisKKyAgb3BlbigpIHsKKyAgICBjb25zdCBmcmVlemVGaWVsZERhdGEgPSBkYXRhID0+IHsKKyAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiZmllbGREYXRhIiwgeworICAgICAgICB2YWx1ZTogT2JqZWN0LmZyZWV6ZShkYXRhKSwKKyAgICAgICAgd3JpdGFibGU6IGZhbHNlLAorICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgICAgICBjb25maWd1cmFibGU6IHRydWUKKyAgICAgIH0pOworICAgIH07CisKKyAgICBQcm9taXNlLmFsbChbdGhpcy5vdmVybGF5TWFuYWdlci5vcGVuKHRoaXMub3ZlcmxheU5hbWUpLCB0aGlzLl9kYXRhQXZhaWxhYmxlQ2FwYWJpbGl0eS5wcm9taXNlXSkudGhlbigoKSA9PiB7CisgICAgICBjb25zdCBjdXJyZW50UGFnZU51bWJlciA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyOworICAgICAgY29uc3QgcGFnZXNSb3RhdGlvbiA9IHRoaXMuX3BhZ2VzUm90YXRpb247CisKKyAgICAgIGlmICh0aGlzLmZpZWxkRGF0YSAmJiBjdXJyZW50UGFnZU51bWJlciA9PT0gdGhpcy5maWVsZERhdGEuX2N1cnJlbnRQYWdlTnVtYmVyICYmIHBhZ2VzUm90YXRpb24gPT09IHRoaXMuZmllbGREYXRhLl9wYWdlc1JvdGF0aW9uKSB7CisgICAgICAgIHRoaXMuX3VwZGF0ZVVJKCk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLnBkZkRvY3VtZW50LmdldE1ldGFkYXRhKCkudGhlbigoeworICAgICAgICBpbmZvLAorICAgICAgICBtZXRhZGF0YSwKKyAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUKKyAgICAgIH0pID0+IHsKKyAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtpbmZvLCBtZXRhZGF0YSwgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgfHwgKDAsIF91aV91dGlscy5nZXRQREZGaWxlTmFtZUZyb21VUkwpKHRoaXMudXJsKSwgdGhpcy5fcGFyc2VGaWxlU2l6ZSh0aGlzLm1heWJlRmlsZVNpemUpLCB0aGlzLl9wYXJzZURhdGUoaW5mby5DcmVhdGlvbkRhdGUpLCB0aGlzLl9wYXJzZURhdGUoaW5mby5Nb2REYXRlKSwgdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKGN1cnJlbnRQYWdlTnVtYmVyKS50aGVuKHBkZlBhZ2UgPT4geworICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJzZVBhZ2VTaXplKCgwLCBfdWlfdXRpbHMuZ2V0UGFnZVNpemVJbmNoZXMpKHBkZlBhZ2UpLCBwYWdlc1JvdGF0aW9uKTsKKyAgICAgICAgfSksIHRoaXMuX3BhcnNlTGluZWFyaXphdGlvbihpbmZvLklzTGluZWFyaXplZCldKTsKKyAgICAgIH0pLnRoZW4oKFtpbmZvLCBtZXRhZGF0YSwgZmlsZU5hbWUsIGZpbGVTaXplLCBjcmVhdGlvbkRhdGUsIG1vZERhdGUsIHBhZ2VTaXplLCBpc0xpbmVhcml6ZWRdKSA9PiB7CisgICAgICAgIGZyZWV6ZUZpZWxkRGF0YSh7CisgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgZmlsZVNpemUsCisgICAgICAgICAgdGl0bGU6IGluZm8uVGl0bGUsCisgICAgICAgICAgYXV0aG9yOiBpbmZvLkF1dGhvciwKKyAgICAgICAgICBzdWJqZWN0OiBpbmZvLlN1YmplY3QsCisgICAgICAgICAga2V5d29yZHM6IGluZm8uS2V5d29yZHMsCisgICAgICAgICAgY3JlYXRpb25EYXRlLAorICAgICAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IG1vZERhdGUsCisgICAgICAgICAgY3JlYXRvcjogaW5mby5DcmVhdG9yLAorICAgICAgICAgIHByb2R1Y2VyOiBpbmZvLlByb2R1Y2VyLAorICAgICAgICAgIHZlcnNpb246IGluZm8uUERGRm9ybWF0VmVyc2lvbiwKKyAgICAgICAgICBwYWdlQ291bnQ6IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMsCisgICAgICAgICAgcGFnZVNpemUsCisgICAgICAgICAgbGluZWFyaXplZDogaXNMaW5lYXJpemVkLAorICAgICAgICAgIF9jdXJyZW50UGFnZU51bWJlcjogY3VycmVudFBhZ2VOdW1iZXIsCisgICAgICAgICAgX3BhZ2VzUm90YXRpb246IHBhZ2VzUm90YXRpb24KKyAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5fdXBkYXRlVUkoKTsKKworICAgICAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5nZXREb3dubG9hZEluZm8oKTsKKyAgICAgIH0pLnRoZW4oKHsKKyAgICAgICAgbGVuZ3RoCisgICAgICB9KSA9PiB7CisgICAgICAgIHRoaXMubWF5YmVGaWxlU2l6ZSA9IGxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlRmlsZVNpemUobGVuZ3RoKTsKKyAgICAgIH0pLnRoZW4oZmlsZVNpemUgPT4geworICAgICAgICBpZiAoZmlsZVNpemUgPT09IHRoaXMuZmllbGREYXRhLmZpbGVTaXplKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgZGF0YSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5maWVsZERhdGEpOworICAgICAgICBkYXRhLmZpbGVTaXplID0gZmlsZVNpemU7CisgICAgICAgIGZyZWV6ZUZpZWxkRGF0YShkYXRhKTsKKworICAgICAgICB0aGlzLl91cGRhdGVVSSgpOworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworICBjbG9zZSgpIHsKKyAgICB0aGlzLm92ZXJsYXlNYW5hZ2VyLmNsb3NlKHRoaXMub3ZlcmxheU5hbWUpOworICB9CisKKyAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQsIHVybCA9IG51bGwpIHsKKyAgICBpZiAodGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgdGhpcy5fcmVzZXQoKTsKKworICAgICAgdGhpcy5fdXBkYXRlVUkodHJ1ZSk7CisgICAgfQorCisgICAgaWYgKCFwZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDsKKyAgICB0aGlzLnVybCA9IHVybDsKKworICAgIHRoaXMuX2RhdGFBdmFpbGFibGVDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgfQorCisgIHNldEZpbGVTaXplKGZpbGVTaXplKSB7CisgICAgaWYgKE51bWJlci5pc0ludGVnZXIoZmlsZVNpemUpICYmIGZpbGVTaXplID4gMCkgeworICAgICAgdGhpcy5tYXliZUZpbGVTaXplID0gZmlsZVNpemU7CisgICAgfQorICB9CisKKyAgX3Jlc2V0KCkgeworICAgIHRoaXMucGRmRG9jdW1lbnQgPSBudWxsOworICAgIHRoaXMudXJsID0gbnVsbDsKKyAgICB0aGlzLm1heWJlRmlsZVNpemUgPSAwOworICAgIGRlbGV0ZSB0aGlzLmZpZWxkRGF0YTsKKyAgICB0aGlzLl9kYXRhQXZhaWxhYmxlQ2FwYWJpbGl0eSA9ICgwLCBfcGRmLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID0gMTsKKyAgICB0aGlzLl9wYWdlc1JvdGF0aW9uID0gMDsKKyAgfQorCisgIF91cGRhdGVVSShyZXNldCA9IGZhbHNlKSB7CisgICAgaWYgKHJlc2V0IHx8ICF0aGlzLmZpZWxkRGF0YSkgeworICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmZpZWxkcykgeworICAgICAgICB0aGlzLmZpZWxkc1tpZF0udGV4dENvbnRlbnQgPSBERUZBVUxUX0ZJRUxEX0NPTlRFTlQ7CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5vdmVybGF5TWFuYWdlci5hY3RpdmUgIT09IHRoaXMub3ZlcmxheU5hbWUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuZmllbGRzKSB7CisgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5maWVsZERhdGFbaWRdOworICAgICAgdGhpcy5maWVsZHNbaWRdLnRleHRDb250ZW50ID0gY29udGVudCB8fCBjb250ZW50ID09PSAwID8gY29udGVudCA6IERFRkFVTFRfRklFTERfQ09OVEVOVDsKKyAgICB9CisgIH0KKworICBhc3luYyBfcGFyc2VGaWxlU2l6ZShmaWxlU2l6ZSA9IDApIHsKKyAgICBjb25zdCBrYiA9IGZpbGVTaXplIC8gMTAyNDsKKworICAgIGlmICgha2IpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfSBlbHNlIGlmIChrYiA8IDEwMjQpIHsKKyAgICAgIHJldHVybiB0aGlzLmwxMG4uZ2V0KCJkb2N1bWVudF9wcm9wZXJ0aWVzX2tiIiwgeworICAgICAgICBzaXplX2tiOiAoK2tiLnRvUHJlY2lzaW9uKDMpKS50b0xvY2FsZVN0cmluZygpLAorICAgICAgICBzaXplX2I6IGZpbGVTaXplLnRvTG9jYWxlU3RyaW5nKCkKKyAgICAgIH0sICJ7e3NpemVfa2J9fSBLQiAoe3tzaXplX2J9fSBieXRlcykiKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5sMTBuLmdldCgiZG9jdW1lbnRfcHJvcGVydGllc19tYiIsIHsKKyAgICAgIHNpemVfbWI6ICgrKGtiIC8gMTAyNCkudG9QcmVjaXNpb24oMykpLnRvTG9jYWxlU3RyaW5nKCksCisgICAgICBzaXplX2I6IGZpbGVTaXplLnRvTG9jYWxlU3RyaW5nKCkKKyAgICB9LCAie3tzaXplX21ifX0gTUIgKHt7c2l6ZV9ifX0gYnl0ZXMpIik7CisgIH0KKworICBhc3luYyBfcGFyc2VQYWdlU2l6ZShwYWdlU2l6ZUluY2hlcywgcGFnZXNSb3RhdGlvbikgeworICAgIGlmICghcGFnZVNpemVJbmNoZXMpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgaWYgKHBhZ2VzUm90YXRpb24gJSAxODAgIT09IDApIHsKKyAgICAgIHBhZ2VTaXplSW5jaGVzID0geworICAgICAgICB3aWR0aDogcGFnZVNpemVJbmNoZXMuaGVpZ2h0LAorICAgICAgICBoZWlnaHQ6IHBhZ2VTaXplSW5jaGVzLndpZHRoCisgICAgICB9OworICAgIH0KKworICAgIGNvbnN0IGlzUG9ydHJhaXQgPSAoMCwgX3VpX3V0aWxzLmlzUG9ydHJhaXRPcmllbnRhdGlvbikocGFnZVNpemVJbmNoZXMpOworICAgIGxldCBzaXplSW5jaGVzID0geworICAgICAgd2lkdGg6IE1hdGgucm91bmQocGFnZVNpemVJbmNoZXMud2lkdGggKiAxMDApIC8gMTAwLAorICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHBhZ2VTaXplSW5jaGVzLmhlaWdodCAqIDEwMCkgLyAxMDAKKyAgICB9OworICAgIGxldCBzaXplTWlsbGltZXRlcnMgPSB7CisgICAgICB3aWR0aDogTWF0aC5yb3VuZChwYWdlU2l6ZUluY2hlcy53aWR0aCAqIDI1LjQgKiAxMCkgLyAxMCwKKyAgICAgIGhlaWdodDogTWF0aC5yb3VuZChwYWdlU2l6ZUluY2hlcy5oZWlnaHQgKiAyNS40ICogMTApIC8gMTAKKyAgICB9OworICAgIGxldCBwYWdlTmFtZSA9IG51bGw7CisgICAgbGV0IHJhd05hbWUgPSBnZXRQYWdlTmFtZShzaXplSW5jaGVzLCBpc1BvcnRyYWl0LCBVU19QQUdFX05BTUVTKSB8fCBnZXRQYWdlTmFtZShzaXplTWlsbGltZXRlcnMsIGlzUG9ydHJhaXQsIE1FVFJJQ19QQUdFX05BTUVTKTsKKworICAgIGlmICghcmF3TmFtZSAmJiAhKE51bWJlci5pc0ludGVnZXIoc2l6ZU1pbGxpbWV0ZXJzLndpZHRoKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHNpemVNaWxsaW1ldGVycy5oZWlnaHQpKSkgeworICAgICAgY29uc3QgZXhhY3RNaWxsaW1ldGVycyA9IHsKKyAgICAgICAgd2lkdGg6IHBhZ2VTaXplSW5jaGVzLndpZHRoICogMjUuNCwKKyAgICAgICAgaGVpZ2h0OiBwYWdlU2l6ZUluY2hlcy5oZWlnaHQgKiAyNS40CisgICAgICB9OworICAgICAgY29uc3QgaW50TWlsbGltZXRlcnMgPSB7CisgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKHNpemVNaWxsaW1ldGVycy53aWR0aCksCisgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZChzaXplTWlsbGltZXRlcnMuaGVpZ2h0KQorICAgICAgfTsKKworICAgICAgaWYgKE1hdGguYWJzKGV4YWN0TWlsbGltZXRlcnMud2lkdGggLSBpbnRNaWxsaW1ldGVycy53aWR0aCkgPCAwLjEgJiYgTWF0aC5hYnMoZXhhY3RNaWxsaW1ldGVycy5oZWlnaHQgLSBpbnRNaWxsaW1ldGVycy5oZWlnaHQpIDwgMC4xKSB7CisgICAgICAgIHJhd05hbWUgPSBnZXRQYWdlTmFtZShpbnRNaWxsaW1ldGVycywgaXNQb3J0cmFpdCwgTUVUUklDX1BBR0VfTkFNRVMpOworCisgICAgICAgIGlmIChyYXdOYW1lKSB7CisgICAgICAgICAgc2l6ZUluY2hlcyA9IHsKKyAgICAgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKGludE1pbGxpbWV0ZXJzLndpZHRoIC8gMjUuNCAqIDEwMCkgLyAxMDAsCisgICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQoaW50TWlsbGltZXRlcnMuaGVpZ2h0IC8gMjUuNCAqIDEwMCkgLyAxMDAKKyAgICAgICAgICB9OworICAgICAgICAgIHNpemVNaWxsaW1ldGVycyA9IGludE1pbGxpbWV0ZXJzOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJhd05hbWUpIHsKKyAgICAgIHBhZ2VOYW1lID0gdGhpcy5sMTBuLmdldCgiZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfbmFtZV8iICsgcmF3TmFtZS50b0xvd2VyQ2FzZSgpLCBudWxsLCByYXdOYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuX2lzTm9uTWV0cmljTG9jYWxlID8gc2l6ZUluY2hlcyA6IHNpemVNaWxsaW1ldGVycywgdGhpcy5sMTBuLmdldCgiZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfdW5pdF8iICsgKHRoaXMuX2lzTm9uTWV0cmljTG9jYWxlID8gImluY2hlcyIgOiAibWlsbGltZXRlcnMiKSwgbnVsbCwgdGhpcy5faXNOb25NZXRyaWNMb2NhbGUgPyAiaW4iIDogIm1tIiksIHBhZ2VOYW1lLCB0aGlzLmwxMG4uZ2V0KCJkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9vcmllbnRhdGlvbl8iICsgKGlzUG9ydHJhaXQgPyAicG9ydHJhaXQiIDogImxhbmRzY2FwZSIpLCBudWxsLCBpc1BvcnRyYWl0ID8gInBvcnRyYWl0IiA6ICJsYW5kc2NhcGUiKV0pLnRoZW4oKFt7CisgICAgICB3aWR0aCwKKyAgICAgIGhlaWdodAorICAgIH0sIHVuaXQsIG5hbWUsIG9yaWVudGF0aW9uXSkgPT4geworICAgICAgcmV0dXJuIHRoaXMubDEwbi5nZXQoImRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX2RpbWVuc2lvbl8iICsgKG5hbWUgPyAibmFtZV8iIDogIiIpICsgInN0cmluZyIsIHsKKyAgICAgICAgd2lkdGg6IHdpZHRoLnRvTG9jYWxlU3RyaW5nKCksCisgICAgICAgIGhlaWdodDogaGVpZ2h0LnRvTG9jYWxlU3RyaW5nKCksCisgICAgICAgIHVuaXQsCisgICAgICAgIG5hbWUsCisgICAgICAgIG9yaWVudGF0aW9uCisgICAgICB9LCAie3t3aWR0aH19IMOXIHt7aGVpZ2h0fX0ge3t1bml0fX0gKCIgKyAobmFtZSA/ICJ7e25hbWV9fSwgIiA6ICIiKSArICJ7e29yaWVudGF0aW9ufX0pIik7CisgICAgfSk7CisgIH0KKworICBhc3luYyBfcGFyc2VEYXRlKGlucHV0RGF0ZSkgeworICAgIGNvbnN0IGRhdGVPYmplY3QgPSBfcGRmLlBERkRhdGVTdHJpbmcudG9EYXRlT2JqZWN0KGlucHV0RGF0ZSk7CisKKyAgICBpZiAoIWRhdGVPYmplY3QpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMubDEwbi5nZXQoImRvY3VtZW50X3Byb3BlcnRpZXNfZGF0ZV9zdHJpbmciLCB7CisgICAgICBkYXRlOiBkYXRlT2JqZWN0LnRvTG9jYWxlRGF0ZVN0cmluZygpLAorICAgICAgdGltZTogZGF0ZU9iamVjdC50b0xvY2FsZVRpbWVTdHJpbmcoKQorICAgIH0sICJ7e2RhdGV9fSwge3t0aW1lfX0iKTsKKyAgfQorCisgIF9wYXJzZUxpbmVhcml6YXRpb24oaXNMaW5lYXJpemVkKSB7CisgICAgcmV0dXJuIHRoaXMubDEwbi5nZXQoImRvY3VtZW50X3Byb3BlcnRpZXNfbGluZWFyaXplZF8iICsgKGlzTGluZWFyaXplZCA/ICJ5ZXMiIDogIm5vIiksIG51bGwsIGlzTGluZWFyaXplZCA/ICJZZXMiIDogIk5vIik7CisgIH0KKworfQorCitleHBvcnRzLlBERkRvY3VtZW50UHJvcGVydGllcyA9IFBERkRvY3VtZW50UHJvcGVydGllczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9maW5kX2Jhci5qcyBiL2xpYi93ZWIvcGRmX2ZpbmRfYmFyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjMyODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3BkZl9maW5kX2Jhci5qcwpAQCAtMCwwICsxLDIyNiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGRmluZEJhciA9IHZvaWQgMDsKKwordmFyIF9wZGZfZmluZF9jb250cm9sbGVyID0gcmVxdWlyZSgiLi9wZGZfZmluZF9jb250cm9sbGVyLmpzIik7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK2NvbnN0IE1BVENIRVNfQ09VTlRfTElNSVQgPSAxMDAwOworCitjbGFzcyBQREZGaW5kQmFyIHsKKyAgY29uc3RydWN0b3Iob3B0aW9ucywgZXZlbnRCdXMsIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4pIHsKKyAgICB0aGlzLm9wZW5lZCA9IGZhbHNlOworICAgIHRoaXMuYmFyID0gb3B0aW9ucy5iYXIgfHwgbnVsbDsKKyAgICB0aGlzLnRvZ2dsZUJ1dHRvbiA9IG9wdGlvbnMudG9nZ2xlQnV0dG9uIHx8IG51bGw7CisgICAgdGhpcy5maW5kRmllbGQgPSBvcHRpb25zLmZpbmRGaWVsZCB8fCBudWxsOworICAgIHRoaXMuaGlnaGxpZ2h0QWxsID0gb3B0aW9ucy5oaWdobGlnaHRBbGxDaGVja2JveCB8fCBudWxsOworICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IG9wdGlvbnMuY2FzZVNlbnNpdGl2ZUNoZWNrYm94IHx8IG51bGw7CisgICAgdGhpcy5lbnRpcmVXb3JkID0gb3B0aW9ucy5lbnRpcmVXb3JkQ2hlY2tib3ggfHwgbnVsbDsKKyAgICB0aGlzLmZpbmRNc2cgPSBvcHRpb25zLmZpbmRNc2cgfHwgbnVsbDsKKyAgICB0aGlzLmZpbmRSZXN1bHRzQ291bnQgPSBvcHRpb25zLmZpbmRSZXN1bHRzQ291bnQgfHwgbnVsbDsKKyAgICB0aGlzLmZpbmRQcmV2aW91c0J1dHRvbiA9IG9wdGlvbnMuZmluZFByZXZpb3VzQnV0dG9uIHx8IG51bGw7CisgICAgdGhpcy5maW5kTmV4dEJ1dHRvbiA9IG9wdGlvbnMuZmluZE5leHRCdXR0b24gfHwgbnVsbDsKKyAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7CisgICAgdGhpcy5sMTBuID0gbDEwbjsKKyAgICB0aGlzLnRvZ2dsZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKKyAgICAgIHRoaXMudG9nZ2xlKCk7CisgICAgfSk7CisgICAgdGhpcy5maW5kRmllbGQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCAoKSA9PiB7CisgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoIiIpOworICAgIH0pOworICAgIHRoaXMuYmFyLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKKyAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgaWYgKGUudGFyZ2V0ID09PSB0aGlzLmZpbmRGaWVsZCkgeworICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCJhZ2FpbiIsIGUuc2hpZnRLZXkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0pOworICAgIHRoaXMuZmluZFByZXZpb3VzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geworICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCJhZ2FpbiIsIHRydWUpOworICAgIH0pOworICAgIHRoaXMuZmluZE5leHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CisgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoImFnYWluIiwgZmFsc2UpOworICAgIH0pOworICAgIHRoaXMuaGlnaGxpZ2h0QWxsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geworICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCJoaWdobGlnaHRhbGxjaGFuZ2UiKTsKKyAgICB9KTsKKyAgICB0aGlzLmNhc2VTZW5zaXRpdmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CisgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoImNhc2VzZW5zaXRpdml0eWNoYW5nZSIpOworICAgIH0pOworICAgIHRoaXMuZW50aXJlV29yZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKKyAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgiZW50aXJld29yZGNoYW5nZSIpOworICAgIH0pOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInJlc2l6ZSIsIHRoaXMuX2FkanVzdFdpZHRoLmJpbmQodGhpcykpOworICB9CisKKyAgcmVzZXQoKSB7CisgICAgdGhpcy51cGRhdGVVSVN0YXRlKCk7CisgIH0KKworICBkaXNwYXRjaEV2ZW50KHR5cGUsIGZpbmRQcmV2KSB7CisgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgiZmluZCIsIHsKKyAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgIHR5cGUsCisgICAgICBxdWVyeTogdGhpcy5maW5kRmllbGQudmFsdWUsCisgICAgICBwaHJhc2VTZWFyY2g6IHRydWUsCisgICAgICBjYXNlU2Vuc2l0aXZlOiB0aGlzLmNhc2VTZW5zaXRpdmUuY2hlY2tlZCwKKyAgICAgIGVudGlyZVdvcmQ6IHRoaXMuZW50aXJlV29yZC5jaGVja2VkLAorICAgICAgaGlnaGxpZ2h0QWxsOiB0aGlzLmhpZ2hsaWdodEFsbC5jaGVja2VkLAorICAgICAgZmluZFByZXZpb3VzOiBmaW5kUHJldgorICAgIH0pOworICB9CisKKyAgdXBkYXRlVUlTdGF0ZShzdGF0ZSwgcHJldmlvdXMsIG1hdGNoZXNDb3VudCkgeworICAgIGxldCBub3RGb3VuZCA9IGZhbHNlOworICAgIGxldCBmaW5kTXNnID0gIiI7CisgICAgbGV0IHN0YXR1cyA9ICIiOworCisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgY2FzZSBfcGRmX2ZpbmRfY29udHJvbGxlci5GaW5kU3RhdGUuRk9VTkQ6CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIF9wZGZfZmluZF9jb250cm9sbGVyLkZpbmRTdGF0ZS5QRU5ESU5HOgorICAgICAgICBzdGF0dXMgPSAicGVuZGluZyI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIF9wZGZfZmluZF9jb250cm9sbGVyLkZpbmRTdGF0ZS5OT1RfRk9VTkQ6CisgICAgICAgIGZpbmRNc2cgPSB0aGlzLmwxMG4uZ2V0KCJmaW5kX25vdF9mb3VuZCIsIG51bGwsICJQaHJhc2Ugbm90IGZvdW5kIik7CisgICAgICAgIG5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgX3BkZl9maW5kX2NvbnRyb2xsZXIuRmluZFN0YXRlLldSQVBQRUQ6CisgICAgICAgIGlmIChwcmV2aW91cykgeworICAgICAgICAgIGZpbmRNc2cgPSB0aGlzLmwxMG4uZ2V0KCJmaW5kX3JlYWNoZWRfdG9wIiwgbnVsbCwgIlJlYWNoZWQgdG9wIG9mIGRvY3VtZW50LCBjb250aW51ZWQgZnJvbSBib3R0b20iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaW5kTXNnID0gdGhpcy5sMTBuLmdldCgiZmluZF9yZWFjaGVkX2JvdHRvbSIsIG51bGwsICJSZWFjaGVkIGVuZCBvZiBkb2N1bWVudCwgY29udGludWVkIGZyb20gdG9wIik7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB0aGlzLmZpbmRGaWVsZC5jbGFzc0xpc3QudG9nZ2xlKCJub3RGb3VuZCIsIG5vdEZvdW5kKTsKKyAgICB0aGlzLmZpbmRGaWVsZC5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdHVzIiwgc3RhdHVzKTsKKyAgICBQcm9taXNlLnJlc29sdmUoZmluZE1zZykudGhlbihtc2cgPT4geworICAgICAgdGhpcy5maW5kTXNnLnRleHRDb250ZW50ID0gbXNnOworCisgICAgICB0aGlzLl9hZGp1c3RXaWR0aCgpOworICAgIH0pOworICAgIHRoaXMudXBkYXRlUmVzdWx0c0NvdW50KG1hdGNoZXNDb3VudCk7CisgIH0KKworICB1cGRhdGVSZXN1bHRzQ291bnQoeworICAgIGN1cnJlbnQgPSAwLAorICAgIHRvdGFsID0gMAorICB9ID0ge30pIHsKKyAgICBpZiAoIXRoaXMuZmluZFJlc3VsdHNDb3VudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGxpbWl0ID0gTUFUQ0hFU19DT1VOVF9MSU1JVDsKKyAgICBsZXQgbWF0Y2hlc0NvdW50TXNnID0gIiI7CisKKyAgICBpZiAodG90YWwgPiAwKSB7CisgICAgICBpZiAodG90YWwgPiBsaW1pdCkgeworICAgICAgICBtYXRjaGVzQ291bnRNc2cgPSB0aGlzLmwxMG4uZ2V0KCJmaW5kX21hdGNoX2NvdW50X2xpbWl0IiwgeworICAgICAgICAgIGxpbWl0CisgICAgICAgIH0sICJNb3JlIHRoYW4ge3tsaW1pdH19IG1hdGNoIiArIChsaW1pdCAhPT0gMSA/ICJlcyIgOiAiIikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0Y2hlc0NvdW50TXNnID0gdGhpcy5sMTBuLmdldCgiZmluZF9tYXRjaF9jb3VudCIsIHsKKyAgICAgICAgICBjdXJyZW50LAorICAgICAgICAgIHRvdGFsCisgICAgICAgIH0sICJ7e2N1cnJlbnR9fSBvZiB7e3RvdGFsfX0gbWF0Y2giICsgKHRvdGFsICE9PSAxID8gImVzIiA6ICIiKSk7CisgICAgICB9CisgICAgfQorCisgICAgUHJvbWlzZS5yZXNvbHZlKG1hdGNoZXNDb3VudE1zZykudGhlbihtc2cgPT4geworICAgICAgdGhpcy5maW5kUmVzdWx0c0NvdW50LnRleHRDb250ZW50ID0gbXNnOworICAgICAgdGhpcy5maW5kUmVzdWx0c0NvdW50LmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsICF0b3RhbCk7CisKKyAgICAgIHRoaXMuX2FkanVzdFdpZHRoKCk7CisgICAgfSk7CisgIH0KKworICBvcGVuKCkgeworICAgIGlmICghdGhpcy5vcGVuZWQpIHsKKyAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZTsKKyAgICAgIHRoaXMudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoInRvZ2dsZWQiKTsKKyAgICAgIHRoaXMuYmFyLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOworICAgIH0KKworICAgIHRoaXMuZmluZEZpZWxkLnNlbGVjdCgpOworICAgIHRoaXMuZmluZEZpZWxkLmZvY3VzKCk7CisKKyAgICB0aGlzLl9hZGp1c3RXaWR0aCgpOworICB9CisKKyAgY2xvc2UoKSB7CisgICAgaWYgKCF0aGlzLm9wZW5lZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMub3BlbmVkID0gZmFsc2U7CisgICAgdGhpcy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgidG9nZ2xlZCIpOworICAgIHRoaXMuYmFyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImZpbmRiYXJjbG9zZSIsIHsKKyAgICAgIHNvdXJjZTogdGhpcworICAgIH0pOworICB9CisKKyAgdG9nZ2xlKCkgeworICAgIGlmICh0aGlzLm9wZW5lZCkgeworICAgICAgdGhpcy5jbG9zZSgpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLm9wZW4oKTsKKyAgICB9CisgIH0KKworICBfYWRqdXN0V2lkdGgoKSB7CisgICAgaWYgKCF0aGlzLm9wZW5lZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuYmFyLmNsYXNzTGlzdC5yZW1vdmUoIndyYXBDb250YWluZXJzIik7CisgICAgY29uc3QgZmluZGJhckhlaWdodCA9IHRoaXMuYmFyLmNsaWVudEhlaWdodDsKKyAgICBjb25zdCBpbnB1dENvbnRhaW5lckhlaWdodCA9IHRoaXMuYmFyLmZpcnN0RWxlbWVudENoaWxkLmNsaWVudEhlaWdodDsKKworICAgIGlmIChmaW5kYmFySGVpZ2h0ID4gaW5wdXRDb250YWluZXJIZWlnaHQpIHsKKyAgICAgIHRoaXMuYmFyLmNsYXNzTGlzdC5hZGQoIndyYXBDb250YWluZXJzIik7CisgICAgfQorICB9CisKK30KKworZXhwb3J0cy5QREZGaW5kQmFyID0gUERGRmluZEJhcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9maW5kX2NvbnRyb2xsZXIuanMgYi9saWIvd2ViL3BkZl9maW5kX2NvbnRyb2xsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjOWFkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvcGRmX2ZpbmRfY29udHJvbGxlci5qcwpAQCAtMCwwICsxLDY5NyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGRmluZENvbnRyb2xsZXIgPSBleHBvcnRzLkZpbmRTdGF0ZSA9IHZvaWQgMDsKKwordmFyIF9wZGYgPSByZXF1aXJlKCIuLi9wZGYiKTsKKwordmFyIF9wZGZfZmluZF91dGlscyA9IHJlcXVpcmUoIi4vcGRmX2ZpbmRfdXRpbHMuanMiKTsKKwordmFyIF91aV91dGlscyA9IHJlcXVpcmUoIi4vdWlfdXRpbHMuanMiKTsKKworY29uc3QgRmluZFN0YXRlID0geworICBGT1VORDogMCwKKyAgTk9UX0ZPVU5EOiAxLAorICBXUkFQUEVEOiAyLAorICBQRU5ESU5HOiAzCit9OworZXhwb3J0cy5GaW5kU3RhdGUgPSBGaW5kU3RhdGU7Citjb25zdCBGSU5EX1RJTUVPVVQgPSAyNTA7Citjb25zdCBNQVRDSF9TQ1JPTExfT0ZGU0VUX1RPUCA9IC01MDsKK2NvbnN0IE1BVENIX1NDUk9MTF9PRkZTRVRfTEVGVCA9IC00MDA7Citjb25zdCBDSEFSQUNURVJTX1RPX05PUk1BTElaRSA9IHsKKyAgIlx1MjAxOCI6ICInIiwKKyAgIlx1MjAxOSI6ICInIiwKKyAgIlx1MjAxQSI6ICInIiwKKyAgIlx1MjAxQiI6ICInIiwKKyAgIlx1MjAxQyI6ICciJywKKyAgIlx1MjAxRCI6ICciJywKKyAgIlx1MjAxRSI6ICciJywKKyAgIlx1MjAxRiI6ICciJywKKyAgIlx1MDBCQyI6ICIxLzQiLAorICAiXHUwMEJEIjogIjEvMiIsCisgICJcdTAwQkUiOiAiMy80IgorfTsKK2xldCBub3JtYWxpemF0aW9uUmVnZXggPSBudWxsOworCitmdW5jdGlvbiBub3JtYWxpemUodGV4dCkgeworICBpZiAoIW5vcm1hbGl6YXRpb25SZWdleCkgeworICAgIGNvbnN0IHJlcGxhY2UgPSBPYmplY3Qua2V5cyhDSEFSQUNURVJTX1RPX05PUk1BTElaRSkuam9pbigiIik7CisgICAgbm9ybWFsaXphdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cChgWyR7cmVwbGFjZX1dYCwgImciKTsKKyAgfQorCisgIHJldHVybiB0ZXh0LnJlcGxhY2Uobm9ybWFsaXphdGlvblJlZ2V4LCBmdW5jdGlvbiAoY2gpIHsKKyAgICByZXR1cm4gQ0hBUkFDVEVSU19UT19OT1JNQUxJWkVbY2hdOworICB9KTsKK30KKworY2xhc3MgUERGRmluZENvbnRyb2xsZXIgeworICBjb25zdHJ1Y3Rvcih7CisgICAgbGlua1NlcnZpY2UsCisgICAgZXZlbnRCdXMKKyAgfSkgeworICAgIHRoaXMuX2xpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7CisgICAgdGhpcy5fZXZlbnRCdXMgPSBldmVudEJ1czsKKworICAgIHRoaXMuX3Jlc2V0KCk7CisKKyAgICBldmVudEJ1cy5fb24oImZpbmRiYXJjbG9zZSIsIHRoaXMuX29uRmluZEJhckNsb3NlLmJpbmQodGhpcykpOworICB9CisKKyAgZ2V0IGhpZ2hsaWdodE1hdGNoZXMoKSB7CisgICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXM7CisgIH0KKworICBnZXQgcGFnZU1hdGNoZXMoKSB7CisgICAgcmV0dXJuIHRoaXMuX3BhZ2VNYXRjaGVzOworICB9CisKKyAgZ2V0IHBhZ2VNYXRjaGVzTGVuZ3RoKCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlTWF0Y2hlc0xlbmd0aDsKKyAgfQorCisgIGdldCBzZWxlY3RlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7CisgIH0KKworICBnZXQgc3RhdGUoKSB7CisgICAgcmV0dXJuIHRoaXMuX3N0YXRlOworICB9CisKKyAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHsKKyAgICBpZiAodGhpcy5fcGRmRG9jdW1lbnQpIHsKKyAgICAgIHRoaXMuX3Jlc2V0KCk7CisgICAgfQorCisgICAgaWYgKCFwZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX3BkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7CisKKyAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnJlc29sdmUoKTsKKyAgfQorCisgIGV4ZWN1dGVDb21tYW5kKGNtZCwgc3RhdGUpIHsKKyAgICBpZiAoIXN0YXRlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgcGRmRG9jdW1lbnQgPSB0aGlzLl9wZGZEb2N1bWVudDsKKworICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gbnVsbCB8fCB0aGlzLl9zaG91bGREaXJ0eU1hdGNoKGNtZCwgc3RhdGUpKSB7CisgICAgICB0aGlzLl9kaXJ0eU1hdGNoID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlOworCisgICAgaWYgKGNtZCAhPT0gImZpbmRoaWdobGlnaHRhbGxjaGFuZ2UiKSB7CisgICAgICB0aGlzLl91cGRhdGVVSVN0YXRlKEZpbmRTdGF0ZS5QRU5ESU5HKTsKKyAgICB9CisKKyAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7CisgICAgICBpZiAoIXRoaXMuX3BkZkRvY3VtZW50IHx8IHBkZkRvY3VtZW50ICYmIHRoaXMuX3BkZkRvY3VtZW50ICE9PSBwZGZEb2N1bWVudCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2V4dHJhY3RUZXh0KCk7CisKKyAgICAgIGNvbnN0IGZpbmRiYXJDbG9zZWQgPSAhdGhpcy5faGlnaGxpZ2h0TWF0Y2hlczsKKyAgICAgIGNvbnN0IHBlbmRpbmdUaW1lb3V0ID0gISF0aGlzLl9maW5kVGltZW91dDsKKworICAgICAgaWYgKHRoaXMuX2ZpbmRUaW1lb3V0KSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5kVGltZW91dCk7CisgICAgICAgIHRoaXMuX2ZpbmRUaW1lb3V0ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGNtZCA9PT0gImZpbmQiKSB7CisgICAgICAgIHRoaXMuX2ZpbmRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CisgICAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7CisKKyAgICAgICAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7CisgICAgICAgIH0sIEZJTkRfVElNRU9VVCk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RpcnR5TWF0Y2gpIHsKKyAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7CisgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gImZpbmRhZ2FpbiIpIHsKKyAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7CisKKyAgICAgICAgaWYgKGZpbmRiYXJDbG9zZWQgJiYgdGhpcy5fc3RhdGUuaGlnaGxpZ2h0QWxsKSB7CisgICAgICAgICAgdGhpcy5fdXBkYXRlQWxsUGFnZXMoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjbWQgPT09ICJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlIikgeworICAgICAgICBpZiAocGVuZGluZ1RpbWVvdXQpIHsKKyAgICAgICAgICB0aGlzLl9uZXh0TWF0Y2goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLl9oaWdobGlnaHRNYXRjaGVzID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3VwZGF0ZUFsbFBhZ2VzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLl9uZXh0TWF0Y2goKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHNjcm9sbE1hdGNoSW50b1ZpZXcoeworICAgIGVsZW1lbnQgPSBudWxsLAorICAgIHBhZ2VJbmRleCA9IC0xLAorICAgIG1hdGNoSW5kZXggPSAtMQorICB9KSB7CisgICAgaWYgKCF0aGlzLl9zY3JvbGxNYXRjaGVzIHx8ICFlbGVtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChtYXRjaEluZGV4ID09PSAtMSB8fCBtYXRjaEluZGV4ICE9PSB0aGlzLl9zZWxlY3RlZC5tYXRjaElkeCkgeworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocGFnZUluZGV4ID09PSAtMSB8fCBwYWdlSW5kZXggIT09IHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHgpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9zY3JvbGxNYXRjaGVzID0gZmFsc2U7CisgICAgY29uc3Qgc3BvdCA9IHsKKyAgICAgIHRvcDogTUFUQ0hfU0NST0xMX09GRlNFVF9UT1AsCisgICAgICBsZWZ0OiBNQVRDSF9TQ1JPTExfT0ZGU0VUX0xFRlQKKyAgICB9OworICAgICgwLCBfdWlfdXRpbHMuc2Nyb2xsSW50b1ZpZXcpKGVsZW1lbnQsIHNwb3QsIHRydWUpOworICB9CisKKyAgX3Jlc2V0KCkgeworICAgIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXMgPSBmYWxzZTsKKyAgICB0aGlzLl9zY3JvbGxNYXRjaGVzID0gZmFsc2U7CisgICAgdGhpcy5fcGRmRG9jdW1lbnQgPSBudWxsOworICAgIHRoaXMuX3BhZ2VNYXRjaGVzID0gW107CisgICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGggPSBbXTsKKyAgICB0aGlzLl9zdGF0ZSA9IG51bGw7CisgICAgdGhpcy5fc2VsZWN0ZWQgPSB7CisgICAgICBwYWdlSWR4OiAtMSwKKyAgICAgIG1hdGNoSWR4OiAtMQorICAgIH07CisgICAgdGhpcy5fb2Zmc2V0ID0geworICAgICAgcGFnZUlkeDogbnVsbCwKKyAgICAgIG1hdGNoSWR4OiBudWxsLAorICAgICAgd3JhcHBlZDogZmFsc2UKKyAgICB9OworICAgIHRoaXMuX2V4dHJhY3RUZXh0UHJvbWlzZXMgPSBbXTsKKyAgICB0aGlzLl9wYWdlQ29udGVudHMgPSBbXTsKKyAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCA9IDA7CisgICAgdGhpcy5fcGFnZXNUb1NlYXJjaCA9IG51bGw7CisgICAgdGhpcy5fcGVuZGluZ0ZpbmRNYXRjaGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gbnVsbDsKKyAgICB0aGlzLl9kaXJ0eU1hdGNoID0gZmFsc2U7CisgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2ZpbmRUaW1lb3V0KTsKKyAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7CisgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eSA9ICgwLCBfcGRmLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICB9CisKKyAgZ2V0IF9xdWVyeSgpIHsKKyAgICBpZiAodGhpcy5fc3RhdGUucXVlcnkgIT09IHRoaXMuX3Jhd1F1ZXJ5KSB7CisgICAgICB0aGlzLl9yYXdRdWVyeSA9IHRoaXMuX3N0YXRlLnF1ZXJ5OworICAgICAgdGhpcy5fbm9ybWFsaXplZFF1ZXJ5ID0gbm9ybWFsaXplKHRoaXMuX3N0YXRlLnF1ZXJ5KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fbm9ybWFsaXplZFF1ZXJ5OworICB9CisKKyAgX3Nob3VsZERpcnR5TWF0Y2goY21kLCBzdGF0ZSkgeworICAgIGlmIChzdGF0ZS5xdWVyeSAhPT0gdGhpcy5fc3RhdGUucXVlcnkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICBjYXNlICJmaW5kYWdhaW4iOgorICAgICAgICBjb25zdCBwYWdlTnVtYmVyID0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCArIDE7CisgICAgICAgIGNvbnN0IGxpbmtTZXJ2aWNlID0gdGhpcy5fbGlua1NlcnZpY2U7CisKKyAgICAgICAgaWYgKHBhZ2VOdW1iZXIgPj0gMSAmJiBwYWdlTnVtYmVyIDw9IGxpbmtTZXJ2aWNlLnBhZ2VzQ291bnQgJiYgcGFnZU51bWJlciAhPT0gbGlua1NlcnZpY2UucGFnZSAmJiAhbGlua1NlcnZpY2UuaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBjYXNlICJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlIjoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgX3ByZXBhcmVNYXRjaGVzKG1hdGNoZXNXaXRoTGVuZ3RoLCBtYXRjaGVzLCBtYXRjaGVzTGVuZ3RoKSB7CisgICAgZnVuY3Rpb24gaXNTdWJUZXJtKGN1cnJlbnRJbmRleCkgeworICAgICAgY29uc3QgY3VycmVudEVsZW0gPSBtYXRjaGVzV2l0aExlbmd0aFtjdXJyZW50SW5kZXhdOworICAgICAgY29uc3QgbmV4dEVsZW0gPSBtYXRjaGVzV2l0aExlbmd0aFtjdXJyZW50SW5kZXggKyAxXTsKKworICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IG1hdGNoZXNXaXRoTGVuZ3RoLmxlbmd0aCAtIDEgJiYgY3VycmVudEVsZW0ubWF0Y2ggPT09IG5leHRFbGVtLm1hdGNoKSB7CisgICAgICAgIGN1cnJlbnRFbGVtLnNraXBwZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZm9yIChsZXQgaSA9IGN1cnJlbnRJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGNvbnN0IHByZXZFbGVtID0gbWF0Y2hlc1dpdGhMZW5ndGhbaV07CisKKyAgICAgICAgaWYgKHByZXZFbGVtLnNraXBwZWQpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmV2RWxlbS5tYXRjaCArIHByZXZFbGVtLm1hdGNoTGVuZ3RoIDwgY3VycmVudEVsZW0ubWF0Y2gpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmV2RWxlbS5tYXRjaCArIHByZXZFbGVtLm1hdGNoTGVuZ3RoID49IGN1cnJlbnRFbGVtLm1hdGNoICsgY3VycmVudEVsZW0ubWF0Y2hMZW5ndGgpIHsKKyAgICAgICAgICBjdXJyZW50RWxlbS5za2lwcGVkID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWF0Y2hlc1dpdGhMZW5ndGguc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgcmV0dXJuIGEubWF0Y2ggPT09IGIubWF0Y2ggPyBhLm1hdGNoTGVuZ3RoIC0gYi5tYXRjaExlbmd0aCA6IGEubWF0Y2ggLSBiLm1hdGNoOworICAgIH0pOworCisgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG1hdGNoZXNXaXRoTGVuZ3RoLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoaXNTdWJUZXJtKGkpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBtYXRjaGVzLnB1c2gobWF0Y2hlc1dpdGhMZW5ndGhbaV0ubWF0Y2gpOworICAgICAgbWF0Y2hlc0xlbmd0aC5wdXNoKG1hdGNoZXNXaXRoTGVuZ3RoW2ldLm1hdGNoTGVuZ3RoKTsKKyAgICB9CisgIH0KKworICBfaXNFbnRpcmVXb3JkKGNvbnRlbnQsIHN0YXJ0SWR4LCBsZW5ndGgpIHsKKyAgICBpZiAoc3RhcnRJZHggPiAwKSB7CisgICAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnQuY2hhckNvZGVBdChzdGFydElkeCk7CisgICAgICBjb25zdCBsaW1pdCA9IGNvbnRlbnQuY2hhckNvZGVBdChzdGFydElkeCAtIDEpOworCisgICAgICBpZiAoKDAsIF9wZGZfZmluZF91dGlscy5nZXRDaGFyYWN0ZXJUeXBlKShmaXJzdCkgPT09ICgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkobGltaXQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBlbmRJZHggPSBzdGFydElkeCArIGxlbmd0aCAtIDE7CisKKyAgICBpZiAoZW5kSWR4IDwgY29udGVudC5sZW5ndGggLSAxKSB7CisgICAgICBjb25zdCBsYXN0ID0gY29udGVudC5jaGFyQ29kZUF0KGVuZElkeCk7CisgICAgICBjb25zdCBsaW1pdCA9IGNvbnRlbnQuY2hhckNvZGVBdChlbmRJZHggKyAxKTsKKworICAgICAgaWYgKCgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkobGFzdCkgPT09ICgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkobGltaXQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIF9jYWxjdWxhdGVQaHJhc2VNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCkgeworICAgIGNvbnN0IG1hdGNoZXMgPSBbXTsKKyAgICBjb25zdCBxdWVyeUxlbiA9IHF1ZXJ5Lmxlbmd0aDsKKyAgICBsZXQgbWF0Y2hJZHggPSAtcXVlcnlMZW47CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgbWF0Y2hJZHggPSBwYWdlQ29udGVudC5pbmRleE9mKHF1ZXJ5LCBtYXRjaElkeCArIHF1ZXJ5TGVuKTsKKworICAgICAgaWYgKG1hdGNoSWR4ID09PSAtMSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGVudGlyZVdvcmQgJiYgIXRoaXMuX2lzRW50aXJlV29yZChwYWdlQ29udGVudCwgbWF0Y2hJZHgsIHF1ZXJ5TGVuKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoSWR4KTsKKyAgICB9CisKKyAgICB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSW5kZXhdID0gbWF0Y2hlczsKKyAgfQorCisgIF9jYWxjdWxhdGVXb3JkTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpIHsKKyAgICBjb25zdCBtYXRjaGVzV2l0aExlbmd0aCA9IFtdOworICAgIGNvbnN0IHF1ZXJ5QXJyYXkgPSBxdWVyeS5tYXRjaCgvXFMrL2cpOworCisgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHF1ZXJ5QXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGNvbnN0IHN1YnF1ZXJ5ID0gcXVlcnlBcnJheVtpXTsKKyAgICAgIGNvbnN0IHN1YnF1ZXJ5TGVuID0gc3VicXVlcnkubGVuZ3RoOworICAgICAgbGV0IG1hdGNoSWR4ID0gLXN1YnF1ZXJ5TGVuOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBtYXRjaElkeCA9IHBhZ2VDb250ZW50LmluZGV4T2Yoc3VicXVlcnksIG1hdGNoSWR4ICsgc3VicXVlcnlMZW4pOworCisgICAgICAgIGlmIChtYXRjaElkeCA9PT0gLTEpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnRpcmVXb3JkICYmICF0aGlzLl9pc0VudGlyZVdvcmQocGFnZUNvbnRlbnQsIG1hdGNoSWR4LCBzdWJxdWVyeUxlbikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoZXNXaXRoTGVuZ3RoLnB1c2goeworICAgICAgICAgIG1hdGNoOiBtYXRjaElkeCwKKyAgICAgICAgICBtYXRjaExlbmd0aDogc3VicXVlcnlMZW4sCisgICAgICAgICAgc2tpcHBlZDogZmFsc2UKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGhbcGFnZUluZGV4XSA9IFtdOworICAgIHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJbmRleF0gPSBbXTsKKworICAgIHRoaXMuX3ByZXBhcmVNYXRjaGVzKG1hdGNoZXNXaXRoTGVuZ3RoLCB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSW5kZXhdLCB0aGlzLl9wYWdlTWF0Y2hlc0xlbmd0aFtwYWdlSW5kZXhdKTsKKyAgfQorCisgIF9jYWxjdWxhdGVNYXRjaChwYWdlSW5kZXgpIHsKKyAgICBsZXQgcGFnZUNvbnRlbnQgPSB0aGlzLl9wYWdlQ29udGVudHNbcGFnZUluZGV4XTsKKyAgICBsZXQgcXVlcnkgPSB0aGlzLl9xdWVyeTsKKyAgICBjb25zdCB7CisgICAgICBjYXNlU2Vuc2l0aXZlLAorICAgICAgZW50aXJlV29yZCwKKyAgICAgIHBocmFzZVNlYXJjaAorICAgIH0gPSB0aGlzLl9zdGF0ZTsKKworICAgIGlmIChxdWVyeS5sZW5ndGggPT09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHsKKyAgICAgIHBhZ2VDb250ZW50ID0gcGFnZUNvbnRlbnQudG9Mb3dlckNhc2UoKTsKKyAgICAgIHF1ZXJ5ID0gcXVlcnkudG9Mb3dlckNhc2UoKTsKKyAgICB9CisKKyAgICBpZiAocGhyYXNlU2VhcmNoKSB7CisgICAgICB0aGlzLl9jYWxjdWxhdGVQaHJhc2VNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX2NhbGN1bGF0ZVdvcmRNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuX3N0YXRlLmhpZ2hsaWdodEFsbCkgeworICAgICAgdGhpcy5fdXBkYXRlUGFnZShwYWdlSW5kZXgpOworICAgIH0KKworICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4ID09PSBwYWdlSW5kZXgpIHsKKyAgICAgIHRoaXMuX3Jlc3VtZVBhZ2VJZHggPSBudWxsOworCisgICAgICB0aGlzLl9uZXh0UGFnZU1hdGNoKCk7CisgICAgfQorCisgICAgY29uc3QgcGFnZU1hdGNoZXNDb3VudCA9IHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJbmRleF0ubGVuZ3RoOworCisgICAgaWYgKHBhZ2VNYXRjaGVzQ291bnQgPiAwKSB7CisgICAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCArPSBwYWdlTWF0Y2hlc0NvdW50OworCisgICAgICB0aGlzLl91cGRhdGVVSVJlc3VsdHNDb3VudCgpOworICAgIH0KKyAgfQorCisgIF9leHRyYWN0VGV4dCgpIHsKKyAgICBpZiAodGhpcy5fZXh0cmFjdFRleHRQcm9taXNlcy5sZW5ndGggPiAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2VzQ291bnQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICBjb25zdCBleHRyYWN0VGV4dENhcGFiaWxpdHkgPSAoMCwgX3BkZi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICAgIHRoaXMuX2V4dHJhY3RUZXh0UHJvbWlzZXNbaV0gPSBleHRyYWN0VGV4dENhcGFiaWxpdHkucHJvbWlzZTsKKyAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgICByZXR1cm4gdGhpcy5fcGRmRG9jdW1lbnQuZ2V0UGFnZShpICsgMSkudGhlbihwZGZQYWdlID0+IHsKKyAgICAgICAgICByZXR1cm4gcGRmUGFnZS5nZXRUZXh0Q29udGVudCh7CisgICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgIH0pLnRoZW4odGV4dENvbnRlbnQgPT4geworICAgICAgICAgIGNvbnN0IHRleHRJdGVtcyA9IHRleHRDb250ZW50Lml0ZW1zOworICAgICAgICAgIGNvbnN0IHN0ckJ1ZiA9IFtdOworCisgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gdGV4dEl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKHRleHRJdGVtc1tqXS5zdHIpOworICAgICAgICAgIH0KKworICAgICAgICAgIHRoaXMuX3BhZ2VDb250ZW50c1tpXSA9IG5vcm1hbGl6ZShzdHJCdWYuam9pbigiIikpOworICAgICAgICAgIGV4dHJhY3RUZXh0Q2FwYWJpbGl0eS5yZXNvbHZlKGkpOworICAgICAgICB9LCByZWFzb24gPT4geworICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBnZXQgdGV4dCBjb250ZW50IGZvciBwYWdlICR7aSArIDF9YCwgcmVhc29uKTsKKyAgICAgICAgICB0aGlzLl9wYWdlQ29udGVudHNbaV0gPSAiIjsKKyAgICAgICAgICBleHRyYWN0VGV4dENhcGFiaWxpdHkucmVzb2x2ZShpKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBfdXBkYXRlUGFnZShpbmRleCkgeworICAgIGlmICh0aGlzLl9zY3JvbGxNYXRjaGVzICYmIHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggPT09IGluZGV4KSB7CisgICAgICB0aGlzLl9saW5rU2VydmljZS5wYWdlID0gaW5kZXggKyAxOworICAgIH0KKworICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKCJ1cGRhdGV0ZXh0bGF5ZXJtYXRjaGVzIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZUluZGV4OiBpbmRleAorICAgIH0pOworICB9CisKKyAgX3VwZGF0ZUFsbFBhZ2VzKCkgeworICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKCJ1cGRhdGV0ZXh0bGF5ZXJtYXRjaGVzIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZUluZGV4OiAtMQorICAgIH0pOworICB9CisKKyAgX25leHRNYXRjaCgpIHsKKyAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX3N0YXRlLmZpbmRQcmV2aW91czsKKyAgICBjb25zdCBjdXJyZW50UGFnZUluZGV4ID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZSAtIDE7CisgICAgY29uc3QgbnVtUGFnZXMgPSB0aGlzLl9saW5rU2VydmljZS5wYWdlc0NvdW50OworICAgIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXMgPSB0cnVlOworCisgICAgaWYgKHRoaXMuX2RpcnR5TWF0Y2gpIHsKKyAgICAgIHRoaXMuX2RpcnR5TWF0Y2ggPSBmYWxzZTsKKyAgICAgIHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggPSB0aGlzLl9zZWxlY3RlZC5tYXRjaElkeCA9IC0xOworICAgICAgdGhpcy5fb2Zmc2V0LnBhZ2VJZHggPSBjdXJyZW50UGFnZUluZGV4OworICAgICAgdGhpcy5fb2Zmc2V0Lm1hdGNoSWR4ID0gbnVsbDsKKyAgICAgIHRoaXMuX29mZnNldC53cmFwcGVkID0gZmFsc2U7CisgICAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gbnVsbDsKKyAgICAgIHRoaXMuX3BhZ2VNYXRjaGVzLmxlbmd0aCA9IDA7CisgICAgICB0aGlzLl9wYWdlTWF0Y2hlc0xlbmd0aC5sZW5ndGggPSAwOworICAgICAgdGhpcy5fbWF0Y2hlc0NvdW50VG90YWwgPSAwOworCisgICAgICB0aGlzLl91cGRhdGVBbGxQYWdlcygpOworCisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVBhZ2VzOyBpKyspIHsKKyAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlc1tpXSA9PT0gdHJ1ZSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fcGVuZGluZ0ZpbmRNYXRjaGVzW2ldID0gdHJ1ZTsKKworICAgICAgICB0aGlzLl9leHRyYWN0VGV4dFByb21pc2VzW2ldLnRoZW4ocGFnZUlkeCA9PiB7CisgICAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlc1twYWdlSWR4XTsKKworICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZU1hdGNoKHBhZ2VJZHgpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy5fcXVlcnkgPT09ICIiKSB7CisgICAgICB0aGlzLl91cGRhdGVVSVN0YXRlKEZpbmRTdGF0ZS5GT1VORCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fcmVzdW1lUGFnZUlkeCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuX29mZnNldDsKKyAgICB0aGlzLl9wYWdlc1RvU2VhcmNoID0gbnVtUGFnZXM7CisKKyAgICBpZiAob2Zmc2V0Lm1hdGNoSWR4ICE9PSBudWxsKSB7CisgICAgICBjb25zdCBudW1QYWdlTWF0Y2hlcyA9IHRoaXMuX3BhZ2VNYXRjaGVzW29mZnNldC5wYWdlSWR4XS5sZW5ndGg7CisKKyAgICAgIGlmICghcHJldmlvdXMgJiYgb2Zmc2V0Lm1hdGNoSWR4ICsgMSA8IG51bVBhZ2VNYXRjaGVzIHx8IHByZXZpb3VzICYmIG9mZnNldC5tYXRjaElkeCA+IDApIHsKKyAgICAgICAgb2Zmc2V0Lm1hdGNoSWR4ID0gcHJldmlvdXMgPyBvZmZzZXQubWF0Y2hJZHggLSAxIDogb2Zmc2V0Lm1hdGNoSWR4ICsgMTsKKworICAgICAgICB0aGlzLl91cGRhdGVNYXRjaCh0cnVlKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2FkdmFuY2VPZmZzZXRQYWdlKHByZXZpb3VzKTsKKyAgICB9CisKKyAgICB0aGlzLl9uZXh0UGFnZU1hdGNoKCk7CisgIH0KKworICBfbWF0Y2hlc1JlYWR5KG1hdGNoZXMpIHsKKyAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9vZmZzZXQ7CisgICAgY29uc3QgbnVtTWF0Y2hlcyA9IG1hdGNoZXMubGVuZ3RoOworICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fc3RhdGUuZmluZFByZXZpb3VzOworCisgICAgaWYgKG51bU1hdGNoZXMpIHsKKyAgICAgIG9mZnNldC5tYXRjaElkeCA9IHByZXZpb3VzID8gbnVtTWF0Y2hlcyAtIDEgOiAwOworCisgICAgICB0aGlzLl91cGRhdGVNYXRjaCh0cnVlKTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdGhpcy5fYWR2YW5jZU9mZnNldFBhZ2UocHJldmlvdXMpOworCisgICAgaWYgKG9mZnNldC53cmFwcGVkKSB7CisgICAgICBvZmZzZXQubWF0Y2hJZHggPSBudWxsOworCisgICAgICBpZiAodGhpcy5fcGFnZXNUb1NlYXJjaCA8IDApIHsKKyAgICAgICAgdGhpcy5fdXBkYXRlTWF0Y2goZmFsc2UpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIF9uZXh0UGFnZU1hdGNoKCkgeworICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4ICE9PSBudWxsKSB7CisgICAgICBjb25zb2xlLmVycm9yKCJUaGVyZSBjYW4gb25seSBiZSBvbmUgcGVuZGluZyBwYWdlLiIpOworICAgIH0KKworICAgIGxldCBtYXRjaGVzID0gbnVsbDsKKworICAgIGRvIHsKKyAgICAgIGNvbnN0IHBhZ2VJZHggPSB0aGlzLl9vZmZzZXQucGFnZUlkeDsKKyAgICAgIG1hdGNoZXMgPSB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSWR4XTsKKworICAgICAgaWYgKCFtYXRjaGVzKSB7CisgICAgICAgIHRoaXMuX3Jlc3VtZVBhZ2VJZHggPSBwYWdlSWR4OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IHdoaWxlICghdGhpcy5fbWF0Y2hlc1JlYWR5KG1hdGNoZXMpKTsKKyAgfQorCisgIF9hZHZhbmNlT2Zmc2V0UGFnZShwcmV2aW91cykgeworICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuX29mZnNldDsKKyAgICBjb25zdCBudW1QYWdlcyA9IHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2VzQ291bnQ7CisgICAgb2Zmc2V0LnBhZ2VJZHggPSBwcmV2aW91cyA/IG9mZnNldC5wYWdlSWR4IC0gMSA6IG9mZnNldC5wYWdlSWR4ICsgMTsKKyAgICBvZmZzZXQubWF0Y2hJZHggPSBudWxsOworICAgIHRoaXMuX3BhZ2VzVG9TZWFyY2gtLTsKKworICAgIGlmIChvZmZzZXQucGFnZUlkeCA+PSBudW1QYWdlcyB8fCBvZmZzZXQucGFnZUlkeCA8IDApIHsKKyAgICAgIG9mZnNldC5wYWdlSWR4ID0gcHJldmlvdXMgPyBudW1QYWdlcyAtIDEgOiAwOworICAgICAgb2Zmc2V0LndyYXBwZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIF91cGRhdGVNYXRjaChmb3VuZCA9IGZhbHNlKSB7CisgICAgbGV0IHN0YXRlID0gRmluZFN0YXRlLk5PVF9GT1VORDsKKyAgICBjb25zdCB3cmFwcGVkID0gdGhpcy5fb2Zmc2V0LndyYXBwZWQ7CisgICAgdGhpcy5fb2Zmc2V0LndyYXBwZWQgPSBmYWxzZTsKKworICAgIGlmIChmb3VuZCkgeworICAgICAgY29uc3QgcHJldmlvdXNQYWdlID0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeDsKKyAgICAgIHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggPSB0aGlzLl9vZmZzZXQucGFnZUlkeDsKKyAgICAgIHRoaXMuX3NlbGVjdGVkLm1hdGNoSWR4ID0gdGhpcy5fb2Zmc2V0Lm1hdGNoSWR4OworICAgICAgc3RhdGUgPSB3cmFwcGVkID8gRmluZFN0YXRlLldSQVBQRUQgOiBGaW5kU3RhdGUuRk9VTkQ7CisKKyAgICAgIGlmIChwcmV2aW91c1BhZ2UgIT09IC0xICYmIHByZXZpb3VzUGFnZSAhPT0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCkgeworICAgICAgICB0aGlzLl91cGRhdGVQYWdlKHByZXZpb3VzUGFnZSk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZShzdGF0ZSwgdGhpcy5fc3RhdGUuZmluZFByZXZpb3VzKTsKKworICAgIGlmICh0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ICE9PSAtMSkgeworICAgICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IHRydWU7CisKKyAgICAgIHRoaXMuX3VwZGF0ZVBhZ2UodGhpcy5fc2VsZWN0ZWQucGFnZUlkeCk7CisgICAgfQorICB9CisKKyAgX29uRmluZEJhckNsb3NlKGV2dCkgeworICAgIGNvbnN0IHBkZkRvY3VtZW50ID0gdGhpcy5fcGRmRG9jdW1lbnQ7CisKKyAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7CisgICAgICBpZiAoIXRoaXMuX3BkZkRvY3VtZW50IHx8IHBkZkRvY3VtZW50ICYmIHRoaXMuX3BkZkRvY3VtZW50ICE9PSBwZGZEb2N1bWVudCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9maW5kVGltZW91dCkgeworICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZmluZFRpbWVvdXQpOworICAgICAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4KSB7CisgICAgICAgIHRoaXMuX3Jlc3VtZVBhZ2VJZHggPSBudWxsOworICAgICAgICB0aGlzLl9kaXJ0eU1hdGNoID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZShGaW5kU3RhdGUuRk9VTkQpOworCisgICAgICB0aGlzLl9oaWdobGlnaHRNYXRjaGVzID0gZmFsc2U7CisKKyAgICAgIHRoaXMuX3VwZGF0ZUFsbFBhZ2VzKCk7CisgICAgfSk7CisgIH0KKworICBfcmVxdWVzdE1hdGNoZXNDb3VudCgpIHsKKyAgICBjb25zdCB7CisgICAgICBwYWdlSWR4LAorICAgICAgbWF0Y2hJZHgKKyAgICB9ID0gdGhpcy5fc2VsZWN0ZWQ7CisgICAgbGV0IGN1cnJlbnQgPSAwLAorICAgICAgICB0b3RhbCA9IHRoaXMuX21hdGNoZXNDb3VudFRvdGFsOworCisgICAgaWYgKG1hdGNoSWR4ICE9PSAtMSkgeworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlSWR4OyBpKyspIHsKKyAgICAgICAgY3VycmVudCArPSB0aGlzLl9wYWdlTWF0Y2hlc1tpXSAmJiB0aGlzLl9wYWdlTWF0Y2hlc1tpXS5sZW5ndGggfHwgMDsKKyAgICAgIH0KKworICAgICAgY3VycmVudCArPSBtYXRjaElkeCArIDE7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQgPCAxIHx8IGN1cnJlbnQgPiB0b3RhbCkgeworICAgICAgY3VycmVudCA9IHRvdGFsID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgY3VycmVudCwKKyAgICAgIHRvdGFsCisgICAgfTsKKyAgfQorCisgIF91cGRhdGVVSVJlc3VsdHNDb3VudCgpIHsKKyAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaCgidXBkYXRlZmluZG1hdGNoZXNjb3VudCIsIHsKKyAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgIG1hdGNoZXNDb3VudDogdGhpcy5fcmVxdWVzdE1hdGNoZXNDb3VudCgpCisgICAgfSk7CisgIH0KKworICBfdXBkYXRlVUlTdGF0ZShzdGF0ZSwgcHJldmlvdXMpIHsKKyAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaCgidXBkYXRlZmluZGNvbnRyb2xzdGF0ZSIsIHsKKyAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgIHN0YXRlLAorICAgICAgcHJldmlvdXMsCisgICAgICBtYXRjaGVzQ291bnQ6IHRoaXMuX3JlcXVlc3RNYXRjaGVzQ291bnQoKSwKKyAgICAgIHJhd1F1ZXJ5OiB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlLnF1ZXJ5IDogbnVsbAorICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5QREZGaW5kQ29udHJvbGxlciA9IFBERkZpbmRDb250cm9sbGVyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvcGRmX2ZpbmRfdXRpbHMuanMgYi9saWIvd2ViL3BkZl9maW5kX3V0aWxzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTBjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3BkZl9maW5kX3V0aWxzLmpzCkBAIC0wLDAgKzEsMTExIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRDaGFyYWN0ZXJUeXBlID0gZ2V0Q2hhcmFjdGVyVHlwZTsKK2V4cG9ydHMuQ2hhcmFjdGVyVHlwZSA9IHZvaWQgMDsKK2NvbnN0IENoYXJhY3RlclR5cGUgPSB7CisgIFNQQUNFOiAwLAorICBBTFBIQV9MRVRURVI6IDEsCisgIFBVTkNUOiAyLAorICBIQU5fTEVUVEVSOiAzLAorICBLQVRBS0FOQV9MRVRURVI6IDQsCisgIEhJUkFHQU5BX0xFVFRFUjogNSwKKyAgSEFMRldJRFRIX0tBVEFLQU5BX0xFVFRFUjogNiwKKyAgVEhBSV9MRVRURVI6IDcKK307CitleHBvcnRzLkNoYXJhY3RlclR5cGUgPSBDaGFyYWN0ZXJUeXBlOworCitmdW5jdGlvbiBpc0FscGhhYmV0aWNhbFNjcmlwdChjaGFyQ29kZSkgeworICByZXR1cm4gY2hhckNvZGUgPCAweDJlODA7Cit9CisKK2Z1bmN0aW9uIGlzQXNjaWkoY2hhckNvZGUpIHsKKyAgcmV0dXJuIChjaGFyQ29kZSAmIDB4ZmY4MCkgPT09IDA7Cit9CisKK2Z1bmN0aW9uIGlzQXNjaWlBbHBoYShjaGFyQ29kZSkgeworICByZXR1cm4gY2hhckNvZGUgPj0gMHg2MSAmJiBjaGFyQ29kZSA8PSAweDdhIHx8IGNoYXJDb2RlID49IDB4NDEgJiYgY2hhckNvZGUgPD0gMHg1YTsKK30KKworZnVuY3Rpb24gaXNBc2NpaURpZ2l0KGNoYXJDb2RlKSB7CisgIHJldHVybiBjaGFyQ29kZSA+PSAweDMwICYmIGNoYXJDb2RlIDw9IDB4Mzk7Cit9CisKK2Z1bmN0aW9uIGlzQXNjaWlTcGFjZShjaGFyQ29kZSkgeworICByZXR1cm4gY2hhckNvZGUgPT09IDB4MjAgfHwgY2hhckNvZGUgPT09IDB4MDkgfHwgY2hhckNvZGUgPT09IDB4MGQgfHwgY2hhckNvZGUgPT09IDB4MGE7Cit9CisKK2Z1bmN0aW9uIGlzSGFuKGNoYXJDb2RlKSB7CisgIHJldHVybiBjaGFyQ29kZSA+PSAweDM0MDAgJiYgY2hhckNvZGUgPD0gMHg5ZmZmIHx8IGNoYXJDb2RlID49IDB4ZjkwMCAmJiBjaGFyQ29kZSA8PSAweGZhZmY7Cit9CisKK2Z1bmN0aW9uIGlzS2F0YWthbmEoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlID49IDB4MzBhMCAmJiBjaGFyQ29kZSA8PSAweDMwZmY7Cit9CisKK2Z1bmN0aW9uIGlzSGlyYWdhbmEoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlID49IDB4MzA0MCAmJiBjaGFyQ29kZSA8PSAweDMwOWY7Cit9CisKK2Z1bmN0aW9uIGlzSGFsZndpZHRoS2F0YWthbmEoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlID49IDB4ZmY2MCAmJiBjaGFyQ29kZSA8PSAweGZmOWY7Cit9CisKK2Z1bmN0aW9uIGlzVGhhaShjaGFyQ29kZSkgeworICByZXR1cm4gKGNoYXJDb2RlICYgMHhmZjgwKSA9PT0gMHgwZTAwOworfQorCitmdW5jdGlvbiBnZXRDaGFyYWN0ZXJUeXBlKGNoYXJDb2RlKSB7CisgIGlmIChpc0FscGhhYmV0aWNhbFNjcmlwdChjaGFyQ29kZSkpIHsKKyAgICBpZiAoaXNBc2NpaShjaGFyQ29kZSkpIHsKKyAgICAgIGlmIChpc0FzY2lpU3BhY2UoY2hhckNvZGUpKSB7CisgICAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlNQQUNFOworICAgICAgfSBlbHNlIGlmIChpc0FzY2lpQWxwaGEoY2hhckNvZGUpIHx8IGlzQXNjaWlEaWdpdChjaGFyQ29kZSkgfHwgY2hhckNvZGUgPT09IDB4NWYpIHsKKyAgICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuQUxQSEFfTEVUVEVSOworICAgICAgfQorCisgICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5QVU5DVDsKKyAgICB9IGVsc2UgaWYgKGlzVGhhaShjaGFyQ29kZSkpIHsKKyAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlRIQUlfTEVUVEVSOworICAgIH0gZWxzZSBpZiAoY2hhckNvZGUgPT09IDB4YTApIHsKKyAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlNQQUNFOworICAgIH0KKworICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUjsKKyAgfQorCisgIGlmIChpc0hhbihjaGFyQ29kZSkpIHsKKyAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5IQU5fTEVUVEVSOworICB9IGVsc2UgaWYgKGlzS2F0YWthbmEoY2hhckNvZGUpKSB7CisgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuS0FUQUtBTkFfTEVUVEVSOworICB9IGVsc2UgaWYgKGlzSGlyYWdhbmEoY2hhckNvZGUpKSB7CisgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSElSQUdBTkFfTEVUVEVSOworICB9IGVsc2UgaWYgKGlzSGFsZndpZHRoS2F0YWthbmEoY2hhckNvZGUpKSB7CisgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSEFMRldJRFRIX0tBVEFLQU5BX0xFVFRFUjsKKyAgfQorCisgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9oaXN0b3J5LmpzIGIvbGliL3dlYi9wZGZfaGlzdG9yeS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQ3NzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9wZGZfaGlzdG9yeS5qcwpAQCAtMCwwICsxLDYwMyBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuaXNEZXN0SGFzaGVzRXF1YWwgPSBpc0Rlc3RIYXNoZXNFcXVhbDsKK2V4cG9ydHMuaXNEZXN0QXJyYXlzRXF1YWwgPSBpc0Rlc3RBcnJheXNFcXVhbDsKK2V4cG9ydHMuUERGSGlzdG9yeSA9IHZvaWQgMDsKKwordmFyIF91aV91dGlscyA9IHJlcXVpcmUoIi4vdWlfdXRpbHMuanMiKTsKKworY29uc3QgSEFTSF9DSEFOR0VfVElNRU9VVCA9IDEwMDA7Citjb25zdCBQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRCA9IDUwOworY29uc3QgVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVQgPSAxMDAwOworCitmdW5jdGlvbiBnZXRDdXJyZW50SGFzaCgpIHsKKyAgcmV0dXJuIGRvY3VtZW50LmxvY2F0aW9uLmhhc2g7Cit9CisKK2NsYXNzIFBERkhpc3RvcnkgeworICBjb25zdHJ1Y3Rvcih7CisgICAgbGlua1NlcnZpY2UsCisgICAgZXZlbnRCdXMKKyAgfSkgeworICAgIHRoaXMubGlua1NlcnZpY2UgPSBsaW5rU2VydmljZTsKKyAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7CisgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB0aGlzLl9maW5nZXJwcmludCA9ICIiOworICAgIHRoaXMucmVzZXQoKTsKKyAgICB0aGlzLl9ib3VuZEV2ZW50cyA9IG51bGw7CisgICAgdGhpcy5faXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUgPSBmYWxzZTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJwcmVzZW50YXRpb25tb2RlY2hhbmdlZCIsIGV2dCA9PiB7CisgICAgICB0aGlzLl9pc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSA9IGV2dC5hY3RpdmUgfHwgZXZ0LnN3aXRjaEluUHJvZ3Jlc3M7CisgICAgfSk7CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigicGFnZXNpbml0IiwgKCkgPT4geworICAgICAgdGhpcy5faXNQYWdlc0xvYWRlZCA9IGZhbHNlOworCisgICAgICBjb25zdCBvblBhZ2VzTG9hZGVkID0gZXZ0ID0+IHsKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKCJwYWdlc2xvYWRlZCIsIG9uUGFnZXNMb2FkZWQpOworCisgICAgICAgIHRoaXMuX2lzUGFnZXNMb2FkZWQgPSAhIWV2dC5wYWdlc0NvdW50OworICAgICAgfTsKKworICAgICAgdGhpcy5ldmVudEJ1cy5fb24oInBhZ2VzbG9hZGVkIiwgb25QYWdlc0xvYWRlZCk7CisgICAgfSk7CisgIH0KKworICBpbml0aWFsaXplKHsKKyAgICBmaW5nZXJwcmludCwKKyAgICByZXNldEhpc3RvcnkgPSBmYWxzZSwKKyAgICB1cGRhdGVVcmwgPSBmYWxzZQorICB9KSB7CisgICAgaWYgKCFmaW5nZXJwcmludCB8fCB0eXBlb2YgZmluZ2VycHJpbnQgIT09ICJzdHJpbmciKSB7CisgICAgICBjb25zb2xlLmVycm9yKCdQREZIaXN0b3J5LmluaXRpYWxpemU6IFRoZSAiZmluZ2VycHJpbnQiIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgeworICAgICAgdGhpcy5yZXNldCgpOworICAgIH0KKworICAgIGNvbnN0IHJlSW5pdGlhbGl6ZWQgPSB0aGlzLl9maW5nZXJwcmludCAhPT0gIiIgJiYgdGhpcy5fZmluZ2VycHJpbnQgIT09IGZpbmdlcnByaW50OworICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7CisgICAgdGhpcy5fdXBkYXRlVXJsID0gdXBkYXRlVXJsID09PSB0cnVlOworICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTsKKworICAgIHRoaXMuX2JpbmRFdmVudHMoKTsKKworICAgIGNvbnN0IHN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7CisgICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gZmFsc2U7CisgICAgdGhpcy5fYmxvY2tIYXNoQ2hhbmdlID0gMDsKKyAgICB0aGlzLl9jdXJyZW50SGFzaCA9IGdldEN1cnJlbnRIYXNoKCk7CisgICAgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzID0gMDsKKyAgICB0aGlzLl91aWQgPSB0aGlzLl9tYXhVaWQgPSAwOworICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0gbnVsbDsKKyAgICB0aGlzLl9wb3NpdGlvbiA9IG51bGw7CisKKyAgICBpZiAoIXRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSwgdHJ1ZSkgfHwgcmVzZXRIaXN0b3J5KSB7CisgICAgICBjb25zdCB7CisgICAgICAgIGhhc2gsCisgICAgICAgIHBhZ2UsCisgICAgICAgIHJvdGF0aW9uCisgICAgICB9ID0gdGhpcy5fcGFyc2VDdXJyZW50SGFzaCh0cnVlKTsKKworICAgICAgaWYgKCFoYXNoIHx8IHJlSW5pdGlhbGl6ZWQgfHwgcmVzZXRIaXN0b3J5KSB7CisgICAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShudWxsLCB0cnVlKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZSh7CisgICAgICAgIGhhc2gsCisgICAgICAgIHBhZ2UsCisgICAgICAgIHJvdGF0aW9uCisgICAgICB9LCB0cnVlKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gc3RhdGUuZGVzdGluYXRpb247CisKKyAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKGRlc3RpbmF0aW9uLCBzdGF0ZS51aWQsIHRydWUpOworCisgICAgaWYgKHRoaXMuX3VpZCA+IHRoaXMuX21heFVpZCkgeworICAgICAgdGhpcy5fbWF4VWlkID0gdGhpcy5fdWlkOworICAgIH0KKworICAgIGlmIChkZXN0aW5hdGlvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB0aGlzLl9pbml0aWFsUm90YXRpb24gPSBkZXN0aW5hdGlvbi5yb3RhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoZGVzdGluYXRpb24uZGVzdCkgeworICAgICAgdGhpcy5faW5pdGlhbEJvb2ttYXJrID0gSlNPTi5zdHJpbmdpZnkoZGVzdGluYXRpb24uZGVzdCk7CisgICAgICB0aGlzLl9kZXN0aW5hdGlvbi5wYWdlID0gbnVsbDsKKyAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmhhc2gpIHsKKyAgICAgIHRoaXMuX2luaXRpYWxCb29rbWFyayA9IGRlc3RpbmF0aW9uLmhhc2g7CisgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5wYWdlKSB7CisgICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBgcGFnZT0ke2Rlc3RpbmF0aW9uLnBhZ2V9YDsKKyAgICB9CisgIH0KKworICByZXNldCgpIHsKKyAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHsKKyAgICAgIHRoaXMuX3BhZ2VIaWRlKCk7CisKKyAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAgIHRoaXMuX3VuYmluZEV2ZW50cygpOworICAgIH0KKworICAgIGlmICh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpIHsKKyAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpOworICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBudWxsOworICAgIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IG51bGw7CisgIH0KKworICBwdXNoKHsKKyAgICBuYW1lZERlc3QgPSBudWxsLAorICAgIGV4cGxpY2l0RGVzdCwKKyAgICBwYWdlTnVtYmVyCisgIH0pIHsKKyAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG5hbWVkRGVzdCAmJiB0eXBlb2YgbmFtZWREZXN0ICE9PSAic3RyaW5nIikgeworICAgICAgY29uc29sZS5lcnJvcigiUERGSGlzdG9yeS5wdXNoOiAiICsgYCIke25hbWVkRGVzdH0iIGlzIG5vdCBhIHZhbGlkIG5hbWVkRGVzdCBwYXJhbWV0ZXIuYCk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShleHBsaWNpdERlc3QpKSB7CisgICAgICBjb25zb2xlLmVycm9yKCJQREZIaXN0b3J5LnB1c2g6ICIgKyBgIiR7ZXhwbGljaXREZXN0fSIgaXMgbm90IGEgdmFsaWQgZXhwbGljaXREZXN0IHBhcmFtZXRlci5gKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSAmJiBwYWdlTnVtYmVyID4gMCAmJiBwYWdlTnVtYmVyIDw9IHRoaXMubGlua1NlcnZpY2UucGFnZXNDb3VudCkpIHsKKyAgICAgIGlmIChwYWdlTnVtYmVyICE9PSBudWxsIHx8IHRoaXMuX2Rlc3RpbmF0aW9uKSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoIlBERkhpc3RvcnkucHVzaDogIiArIGAiJHtwYWdlTnVtYmVyfSIgaXMgbm90IGEgdmFsaWQgcGFnZU51bWJlciBwYXJhbWV0ZXIuYCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBoYXNoID0gbmFtZWREZXN0IHx8IEpTT04uc3RyaW5naWZ5KGV4cGxpY2l0RGVzdCk7CisKKyAgICBpZiAoIWhhc2gpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZXQgZm9yY2VSZXBsYWNlID0gZmFsc2U7CisKKyAgICBpZiAodGhpcy5fZGVzdGluYXRpb24gJiYgKGlzRGVzdEhhc2hlc0VxdWFsKHRoaXMuX2Rlc3RpbmF0aW9uLmhhc2gsIGhhc2gpIHx8IGlzRGVzdEFycmF5c0VxdWFsKHRoaXMuX2Rlc3RpbmF0aW9uLmRlc3QsIGV4cGxpY2l0RGVzdCkpKSB7CisgICAgICBpZiAodGhpcy5fZGVzdGluYXRpb24ucGFnZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGZvcmNlUmVwbGFjZSA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyAmJiAhZm9yY2VSZXBsYWNlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHsKKyAgICAgIGRlc3Q6IGV4cGxpY2l0RGVzdCwKKyAgICAgIGhhc2gsCisgICAgICBwYWdlOiBwYWdlTnVtYmVyLAorICAgICAgcm90YXRpb246IHRoaXMubGlua1NlcnZpY2Uucm90YXRpb24KKyAgICB9LCBmb3JjZVJlcGxhY2UpOworCisgICAgaWYgKCF0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHsKKyAgICAgIHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyA9IHRydWU7CisgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKKyAgICAgICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gZmFsc2U7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBwdXNoQ3VycmVudFBvc2l0aW9uKCkgeworICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpOworICB9CisKKyAgYmFjaygpIHsKKyAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkIHx8IHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7CisKKyAgICBpZiAodGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlKSAmJiBzdGF0ZS51aWQgPiAwKSB7CisgICAgICB3aW5kb3cuaGlzdG9yeS5iYWNrKCk7CisgICAgfQorICB9CisKKyAgZm9yd2FyZCgpIHsKKyAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkIHx8IHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7CisKKyAgICBpZiAodGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlKSAmJiBzdGF0ZS51aWQgPCB0aGlzLl9tYXhVaWQpIHsKKyAgICAgIHdpbmRvdy5oaXN0b3J5LmZvcndhcmQoKTsKKyAgICB9CisgIH0KKworICBnZXQgcG9wU3RhdGVJblByb2dyZXNzKCkgeworICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXplZCAmJiAodGhpcy5fcG9wU3RhdGVJblByb2dyZXNzIHx8IHRoaXMuX2Jsb2NrSGFzaENoYW5nZSA+IDApOworICB9CisKKyAgZ2V0IGluaXRpYWxCb29rbWFyaygpIHsKKyAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQgPyB0aGlzLl9pbml0aWFsQm9va21hcmsgOiBudWxsOworICB9CisKKyAgZ2V0IGluaXRpYWxSb3RhdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQgPyB0aGlzLl9pbml0aWFsUm90YXRpb24gOiBudWxsOworICB9CisKKyAgX3B1c2hPclJlcGxhY2VTdGF0ZShkZXN0aW5hdGlvbiwgZm9yY2VSZXBsYWNlID0gZmFsc2UpIHsKKyAgICBjb25zdCBzaG91bGRSZXBsYWNlID0gZm9yY2VSZXBsYWNlIHx8ICF0aGlzLl9kZXN0aW5hdGlvbjsKKyAgICBjb25zdCBuZXdTdGF0ZSA9IHsKKyAgICAgIGZpbmdlcnByaW50OiB0aGlzLl9maW5nZXJwcmludCwKKyAgICAgIHVpZDogc2hvdWxkUmVwbGFjZSA/IHRoaXMuX3VpZCA6IHRoaXMuX3VpZCArIDEsCisgICAgICBkZXN0aW5hdGlvbgorICAgIH07CisKKyAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKGRlc3RpbmF0aW9uLCBuZXdTdGF0ZS51aWQpOworCisgICAgbGV0IG5ld1VybDsKKworICAgIGlmICh0aGlzLl91cGRhdGVVcmwgJiYgZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24uaGFzaCkgeworICAgICAgY29uc3QgYmFzZVVybCA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuc3BsaXQoIiMiKVswXTsKKworICAgICAgaWYgKCFiYXNlVXJsLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSkgeworICAgICAgICBuZXdVcmwgPSBgJHtiYXNlVXJsfSMke2Rlc3RpbmF0aW9uLmhhc2h9YDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvdWxkUmVwbGFjZSkgeworICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG5ld1N0YXRlLCAiIiwgbmV3VXJsKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fbWF4VWlkID0gdGhpcy5fdWlkOworICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG5ld1N0YXRlLCAiIiwgbmV3VXJsKTsKKyAgICB9CisgIH0KKworICBfdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbih0ZW1wb3JhcnkgPSBmYWxzZSkgeworICAgIGlmICghdGhpcy5fcG9zaXRpb24pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZXQgcG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbjsKKworICAgIGlmICh0ZW1wb3JhcnkpIHsKKyAgICAgIHBvc2l0aW9uID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLl9wb3NpdGlvbik7CisgICAgICBwb3NpdGlvbi50ZW1wb3JhcnkgPSB0cnVlOworICAgIH0KKworICAgIGlmICghdGhpcy5fZGVzdGluYXRpb24pIHsKKyAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShwb3NpdGlvbik7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fZGVzdGluYXRpb24udGVtcG9yYXJ5KSB7CisgICAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUocG9zaXRpb24sIHRydWUpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2Rlc3RpbmF0aW9uLmhhc2ggPT09IHBvc2l0aW9uLmhhc2gpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgJiYgKFBPU0lUSU9OX1VQREFURURfVEhSRVNIT0xEIDw9IDAgfHwgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzIDw9IFBPU0lUSU9OX1VQREFURURfVEhSRVNIT0xEKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxldCBmb3JjZVJlcGxhY2UgPSBmYWxzZTsKKworICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5wYWdlID49IHBvc2l0aW9uLmZpcnN0ICYmIHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgPD0gcG9zaXRpb24ucGFnZSkgeworICAgICAgaWYgKHRoaXMuX2Rlc3RpbmF0aW9uLmRlc3QgfHwgIXRoaXMuX2Rlc3RpbmF0aW9uLmZpcnN0KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZm9yY2VSZXBsYWNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUocG9zaXRpb24sIGZvcmNlUmVwbGFjZSk7CisgIH0KKworICBfaXNWYWxpZFN0YXRlKHN0YXRlLCBjaGVja1JlbG9hZCA9IGZhbHNlKSB7CisgICAgaWYgKCFzdGF0ZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGF0ZS5maW5nZXJwcmludCAhPT0gdGhpcy5fZmluZ2VycHJpbnQpIHsKKyAgICAgIGlmIChjaGVja1JlbG9hZCkgeworICAgICAgICBpZiAodHlwZW9mIHN0YXRlLmZpbmdlcnByaW50ICE9PSAic3RyaW5nIiB8fCBzdGF0ZS5maW5nZXJwcmludC5sZW5ndGggIT09IHRoaXMuX2ZpbmdlcnByaW50Lmxlbmd0aCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFtwZXJmRW50cnldID0gcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgibmF2aWdhdGlvbiIpOworCisgICAgICAgIGlmICghcGVyZkVudHJ5IHx8IHBlcmZFbnRyeS50eXBlICE9PSAicmVsb2FkIikgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihzdGF0ZS51aWQpIHx8IHN0YXRlLnVpZCA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUuZGVzdGluYXRpb24gPT09IG51bGwgfHwgdHlwZW9mIHN0YXRlLmRlc3RpbmF0aW9uICE9PSAib2JqZWN0IikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgX3VwZGF0ZUludGVybmFsU3RhdGUoZGVzdGluYXRpb24sIHVpZCwgcmVtb3ZlVGVtcG9yYXJ5ID0gZmFsc2UpIHsKKyAgICBpZiAodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KSB7CisgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KTsKKyAgICAgIHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCA9IG51bGw7CisgICAgfQorCisgICAgaWYgKHJlbW92ZVRlbXBvcmFyeSAmJiBkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHsKKyAgICAgIGRlbGV0ZSBkZXN0aW5hdGlvbi50ZW1wb3Jhcnk7CisgICAgfQorCisgICAgdGhpcy5fZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKKyAgICB0aGlzLl91aWQgPSB1aWQ7CisgICAgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzID0gMDsKKyAgfQorCisgIF9wYXJzZUN1cnJlbnRIYXNoKGNoZWNrTmFtZWRkZXN0ID0gZmFsc2UpIHsKKyAgICBjb25zdCBoYXNoID0gdW5lc2NhcGUoZ2V0Q3VycmVudEhhc2goKSkuc3Vic3RyaW5nKDEpOworICAgIGNvbnN0IHBhcmFtcyA9ICgwLCBfdWlfdXRpbHMucGFyc2VRdWVyeVN0cmluZykoaGFzaCk7CisgICAgY29uc3QgbmFtZWRkZXN0ID0gcGFyYW1zLm5hbWVkZGVzdCB8fCAiIjsKKyAgICBsZXQgcGFnZSA9IHBhcmFtcy5wYWdlIHwgMDsKKworICAgIGlmICghKE51bWJlci5pc0ludGVnZXIocGFnZSkgJiYgcGFnZSA+IDAgJiYgcGFnZSA8PSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2VzQ291bnQpIHx8IGNoZWNrTmFtZWRkZXN0ICYmIG5hbWVkZGVzdC5sZW5ndGggPiAwKSB7CisgICAgICBwYWdlID0gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgaGFzaCwKKyAgICAgIHBhZ2UsCisgICAgICByb3RhdGlvbjogdGhpcy5saW5rU2VydmljZS5yb3RhdGlvbgorICAgIH07CisgIH0KKworICBfdXBkYXRlVmlld2FyZWEoeworICAgIGxvY2F0aW9uCisgIH0pIHsKKyAgICBpZiAodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KSB7CisgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KTsKKyAgICAgIHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCA9IG51bGw7CisgICAgfQorCisgICAgdGhpcy5fcG9zaXRpb24gPSB7CisgICAgICBoYXNoOiB0aGlzLl9pc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSA/IGBwYWdlPSR7bG9jYXRpb24ucGFnZU51bWJlcn1gIDogbG9jYXRpb24ucGRmT3BlblBhcmFtcy5zdWJzdHJpbmcoMSksCisgICAgICBwYWdlOiB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UsCisgICAgICBmaXJzdDogbG9jYXRpb24ucGFnZU51bWJlciwKKyAgICAgIHJvdGF0aW9uOiBsb2NhdGlvbi5yb3RhdGlvbgorICAgIH07CisKKyAgICBpZiAodGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKFBPU0lUSU9OX1VQREFURURfVEhSRVNIT0xEID4gMCAmJiB0aGlzLl9pc1BhZ2VzTG9hZGVkICYmIHRoaXMuX2Rlc3RpbmF0aW9uICYmICF0aGlzLl9kZXN0aW5hdGlvbi5wYWdlKSB7CisgICAgICB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMrKzsKKyAgICB9CisKKyAgICBpZiAoVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVQgPiAwKSB7CisgICAgICB0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKKyAgICAgICAgaWYgKCF0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHsKKyAgICAgICAgICB0aGlzLl90cnlQdXNoQ3VycmVudFBvc2l0aW9uKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDsKKyAgICAgIH0sIFVQREFURV9WSUVXQVJFQV9USU1FT1VUKTsKKyAgICB9CisgIH0KKworICBfcG9wU3RhdGUoeworICAgIHN0YXRlCisgIH0pIHsKKyAgICBjb25zdCBuZXdIYXNoID0gZ2V0Q3VycmVudEhhc2goKSwKKyAgICAgICAgICBoYXNoQ2hhbmdlZCA9IHRoaXMuX2N1cnJlbnRIYXNoICE9PSBuZXdIYXNoOworICAgIHRoaXMuX2N1cnJlbnRIYXNoID0gbmV3SGFzaDsKKworICAgIGlmICghc3RhdGUpIHsKKyAgICAgIHRoaXMuX3VpZCsrOworCisgICAgICBjb25zdCB7CisgICAgICAgIGhhc2gsCisgICAgICAgIHBhZ2UsCisgICAgICAgIHJvdGF0aW9uCisgICAgICB9ID0gdGhpcy5fcGFyc2VDdXJyZW50SGFzaCgpOworCisgICAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUoeworICAgICAgICBoYXNoLAorICAgICAgICBwYWdlLAorICAgICAgICByb3RhdGlvbgorICAgICAgfSwgdHJ1ZSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSB0cnVlOworCisgICAgaWYgKGhhc2hDaGFuZ2VkKSB7CisgICAgICB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UrKzsKKyAgICAgICgwLCBfdWlfdXRpbHMud2FpdE9uRXZlbnRPclRpbWVvdXQpKHsKKyAgICAgICAgdGFyZ2V0OiB3aW5kb3csCisgICAgICAgIG5hbWU6ICJoYXNoY2hhbmdlIiwKKyAgICAgICAgZGVsYXk6IEhBU0hfQ0hBTkdFX1RJTUVPVVQKKyAgICAgIH0pLnRoZW4oKCkgPT4geworICAgICAgICB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UtLTsKKyAgICAgIH0pOworICAgIH0KKworICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gc3RhdGUuZGVzdGluYXRpb247CisKKyAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKGRlc3RpbmF0aW9uLCBzdGF0ZS51aWQsIHRydWUpOworCisgICAgaWYgKHRoaXMuX3VpZCA+IHRoaXMuX21heFVpZCkgeworICAgICAgdGhpcy5fbWF4VWlkID0gdGhpcy5fdWlkOworICAgIH0KKworICAgIGlmICgoMCwgX3VpX3V0aWxzLmlzVmFsaWRSb3RhdGlvbikoZGVzdGluYXRpb24ucm90YXRpb24pKSB7CisgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnJvdGF0aW9uID0gZGVzdGluYXRpb24ucm90YXRpb247CisgICAgfQorCisgICAgaWYgKGRlc3RpbmF0aW9uLmRlc3QpIHsKKyAgICAgIHRoaXMubGlua1NlcnZpY2UubmF2aWdhdGVUbyhkZXN0aW5hdGlvbi5kZXN0KTsKKyAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmhhc2gpIHsKKyAgICAgIHRoaXMubGlua1NlcnZpY2Uuc2V0SGFzaChkZXN0aW5hdGlvbi5oYXNoKTsKKyAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLnBhZ2UpIHsKKyAgICAgIHRoaXMubGlua1NlcnZpY2UucGFnZSA9IGRlc3RpbmF0aW9uLnBhZ2U7CisgICAgfQorCisgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CisgICAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICB9KTsKKyAgfQorCisgIF9wYWdlSGlkZSgpIHsKKyAgICBpZiAoIXRoaXMuX2Rlc3RpbmF0aW9uIHx8IHRoaXMuX2Rlc3RpbmF0aW9uLnRlbXBvcmFyeSkgeworICAgICAgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpOworICAgIH0KKyAgfQorCisgIF9iaW5kRXZlbnRzKCkgeworICAgIGlmICh0aGlzLl9ib3VuZEV2ZW50cykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX2JvdW5kRXZlbnRzID0geworICAgICAgdXBkYXRlVmlld2FyZWE6IHRoaXMuX3VwZGF0ZVZpZXdhcmVhLmJpbmQodGhpcyksCisgICAgICBwb3BTdGF0ZTogdGhpcy5fcG9wU3RhdGUuYmluZCh0aGlzKSwKKyAgICAgIHBhZ2VIaWRlOiB0aGlzLl9wYWdlSGlkZS5iaW5kKHRoaXMpCisgICAgfTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJ1cGRhdGV2aWV3YXJlYSIsIHRoaXMuX2JvdW5kRXZlbnRzLnVwZGF0ZVZpZXdhcmVhKTsKKworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsIHRoaXMuX2JvdW5kRXZlbnRzLnBvcFN0YXRlKTsKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLCB0aGlzLl9ib3VuZEV2ZW50cy5wYWdlSGlkZSk7CisgIH0KKworICBfdW5iaW5kRXZlbnRzKCkgeworICAgIGlmICghdGhpcy5fYm91bmRFdmVudHMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vZmYoInVwZGF0ZXZpZXdhcmVhIiwgdGhpcy5fYm91bmRFdmVudHMudXBkYXRlVmlld2FyZWEpOworCisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIiwgdGhpcy5fYm91bmRFdmVudHMucG9wU3RhdGUpOworICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwYWdlaGlkZSIsIHRoaXMuX2JvdW5kRXZlbnRzLnBhZ2VIaWRlKTsKKyAgICB0aGlzLl9ib3VuZEV2ZW50cyA9IG51bGw7CisgIH0KKworfQorCitleHBvcnRzLlBERkhpc3RvcnkgPSBQREZIaXN0b3J5OworCitmdW5jdGlvbiBpc0Rlc3RIYXNoZXNFcXVhbChkZXN0SGFzaCwgcHVzaEhhc2gpIHsKKyAgaWYgKHR5cGVvZiBkZXN0SGFzaCAhPT0gInN0cmluZyIgfHwgdHlwZW9mIHB1c2hIYXNoICE9PSAic3RyaW5nIikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChkZXN0SGFzaCA9PT0gcHVzaEhhc2gpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IHsKKyAgICBuYW1lZGRlc3QKKyAgfSA9ICgwLCBfdWlfdXRpbHMucGFyc2VRdWVyeVN0cmluZykoZGVzdEhhc2gpOworCisgIGlmIChuYW1lZGRlc3QgPT09IHB1c2hIYXNoKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Z1bmN0aW9uIGlzRGVzdEFycmF5c0VxdWFsKGZpcnN0RGVzdCwgc2Vjb25kRGVzdCkgeworICBmdW5jdGlvbiBpc0VudHJ5RXF1YWwoZmlyc3QsIHNlY29uZCkgeworICAgIGlmICh0eXBlb2YgZmlyc3QgIT09IHR5cGVvZiBzZWNvbmQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShmaXJzdCkgfHwgQXJyYXkuaXNBcnJheShzZWNvbmQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpcnN0ICE9PSBudWxsICYmIHR5cGVvZiBmaXJzdCA9PT0gIm9iamVjdCIgJiYgc2Vjb25kICE9PSBudWxsKSB7CisgICAgICBpZiAoT2JqZWN0LmtleXMoZmlyc3QpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoc2Vjb25kKS5sZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaXJzdCkgeworICAgICAgICBpZiAoIWlzRW50cnlFcXVhbChmaXJzdFtrZXldLCBzZWNvbmRba2V5XSkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZpcnN0ID09PSBzZWNvbmQgfHwgTnVtYmVyLmlzTmFOKGZpcnN0KSAmJiBOdW1iZXIuaXNOYU4oc2Vjb25kKTsKKyAgfQorCisgIGlmICghKEFycmF5LmlzQXJyYXkoZmlyc3REZXN0KSAmJiBBcnJheS5pc0FycmF5KHNlY29uZERlc3QpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChmaXJzdERlc3QubGVuZ3RoICE9PSBzZWNvbmREZXN0Lmxlbmd0aCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZpcnN0RGVzdC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgaWYgKCFpc0VudHJ5RXF1YWwoZmlyc3REZXN0W2ldLCBzZWNvbmREZXN0W2ldKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvcGRmX2xheWVyX3ZpZXdlci5qcyBiL2xpYi93ZWIvcGRmX2xheWVyX3ZpZXdlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDdhODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9wZGZfbGF5ZXJfdmlld2VyLmpzCkBAIC0wLDAgKzEsMjA4IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZMYXllclZpZXdlciA9IHZvaWQgMDsKKwordmFyIF9iYXNlX3RyZWVfdmlld2VyID0gcmVxdWlyZSgiLi9iYXNlX3RyZWVfdmlld2VyLmpzIik7CisKK2NsYXNzIFBERkxheWVyVmlld2VyIGV4dGVuZHMgX2Jhc2VfdHJlZV92aWV3ZXIuQmFzZVRyZWVWaWV3ZXIgeworICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CisgICAgc3VwZXIob3B0aW9ucyk7CisgICAgdGhpcy5sMTBuID0gb3B0aW9ucy5sMTBuOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInJlc2V0bGF5ZXJzIiwgdGhpcy5fcmVzZXRMYXllcnMuYmluZCh0aGlzKSk7CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigidG9nZ2xlbGF5ZXJzdHJlZSIsIHRoaXMuX3RvZ2dsZUFsbFRyZWVJdGVtcy5iaW5kKHRoaXMpKTsKKyAgfQorCisgIHJlc2V0KCkgeworICAgIHN1cGVyLnJlc2V0KCk7CisgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnID0gbnVsbDsKKyAgICB0aGlzLl9wZGZEb2N1bWVudCA9IG51bGw7CisgIH0KKworICBfZGlzcGF0Y2hFdmVudChsYXllcnNDb3VudCkgeworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImxheWVyc2xvYWRlZCIsIHsKKyAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgIGxheWVyc0NvdW50CisgICAgfSk7CisgIH0KKworICBfYmluZExpbmsoZWxlbWVudCwgeworICAgIGdyb3VwSWQsCisgICAgaW5wdXQKKyAgfSkgeworICAgIGNvbnN0IHNldFZpc2liaWxpdHkgPSAoKSA9PiB7CisgICAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWcuc2V0VmlzaWJpbGl0eShncm91cElkLCBpbnB1dC5jaGVja2VkKTsKKworICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgib3B0aW9uYWxjb250ZW50Y29uZmlnIiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIHByb21pc2U6IFByb21pc2UucmVzb2x2ZSh0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWcpCisgICAgICB9KTsKKyAgICB9OworCisgICAgZWxlbWVudC5vbmNsaWNrID0gZXZ0ID0+IHsKKyAgICAgIGlmIChldnQudGFyZ2V0ID09PSBpbnB1dCkgeworICAgICAgICBzZXRWaXNpYmlsaXR5KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmIChldnQudGFyZ2V0ICE9PSBlbGVtZW50KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpbnB1dC5jaGVja2VkID0gIWlucHV0LmNoZWNrZWQ7CisgICAgICBzZXRWaXNpYmlsaXR5KCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyAgfQorCisgIGFzeW5jIF9zZXROZXN0ZWROYW1lKGVsZW1lbnQsIHsKKyAgICBuYW1lID0gbnVsbAorICB9KSB7CisgICAgaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgeworICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuX25vcm1hbGl6ZVRleHRDb250ZW50KG5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBhd2FpdCB0aGlzLmwxMG4uZ2V0KCJhZGRpdGlvbmFsX2xheWVycyIsIG51bGwsICJBZGRpdGlvbmFsIExheWVycyIpOworICAgIGVsZW1lbnQuc3R5bGUuZm9udFN0eWxlID0gIml0YWxpYyI7CisgIH0KKworICBfYWRkVG9nZ2xlQnV0dG9uKGRpdiwgeworICAgIG5hbWUgPSBudWxsCisgIH0pIHsKKyAgICBzdXBlci5fYWRkVG9nZ2xlQnV0dG9uKGRpdiwgbmFtZSA9PT0gbnVsbCk7CisgIH0KKworICBfdG9nZ2xlQWxsVHJlZUl0ZW1zKCkgeworICAgIGlmICghdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3VwZXIuX3RvZ2dsZUFsbFRyZWVJdGVtcygpOworICB9CisKKyAgcmVuZGVyKHsKKyAgICBvcHRpb25hbENvbnRlbnRDb25maWcsCisgICAgcGRmRG9jdW1lbnQKKyAgfSkgeworICAgIGlmICh0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWcpIHsKKyAgICAgIHRoaXMucmVzZXQoKTsKKyAgICB9CisKKyAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWcgPSBvcHRpb25hbENvbnRlbnRDb25maWcgfHwgbnVsbDsKKyAgICB0aGlzLl9wZGZEb2N1bWVudCA9IHBkZkRvY3VtZW50IHx8IG51bGw7CisgICAgY29uc3QgZ3JvdXBzID0gb3B0aW9uYWxDb250ZW50Q29uZmlnICYmIG9wdGlvbmFsQ29udGVudENvbmZpZy5nZXRPcmRlcigpOworCisgICAgaWYgKCFncm91cHMpIHsKKyAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoMCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKKyAgICAgICAgICBxdWV1ZSA9IFt7CisgICAgICBwYXJlbnQ6IGZyYWdtZW50LAorICAgICAgZ3JvdXBzCisgICAgfV07CisgICAgbGV0IGxheWVyc0NvdW50ID0gMCwKKyAgICAgICAgaGFzQW55TmVzdGluZyA9IGZhbHNlOworCisgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgIGNvbnN0IGxldmVsRGF0YSA9IHF1ZXVlLnNoaWZ0KCk7CisKKyAgICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBsZXZlbERhdGEuZ3JvdXBzKSB7CisgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICBkaXYuY2xhc3NOYW1lID0gInRyZWVJdGVtIjsKKyAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICAgICAgZGl2LmFwcGVuZENoaWxkKGVsZW1lbnQpOworCisgICAgICAgIGlmICh0eXBlb2YgZ3JvdXBJZCA9PT0gIm9iamVjdCIpIHsKKyAgICAgICAgICBoYXNBbnlOZXN0aW5nID0gdHJ1ZTsKKworICAgICAgICAgIHRoaXMuX2FkZFRvZ2dsZUJ1dHRvbihkaXYsIGdyb3VwSWQpOworCisgICAgICAgICAgdGhpcy5fc2V0TmVzdGVkTmFtZShlbGVtZW50LCBncm91cElkKTsKKworICAgICAgICAgIGNvbnN0IGl0ZW1zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgICAgaXRlbXNEaXYuY2xhc3NOYW1lID0gInRyZWVJdGVtcyI7CisgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGl0ZW1zRGl2KTsKKyAgICAgICAgICBxdWV1ZS5wdXNoKHsKKyAgICAgICAgICAgIHBhcmVudDogaXRlbXNEaXYsCisgICAgICAgICAgICBncm91cHM6IGdyb3VwSWQub3JkZXIKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBncm91cCA9IG9wdGlvbmFsQ29udGVudENvbmZpZy5nZXRHcm91cChncm91cElkKTsKKyAgICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisKKyAgICAgICAgICB0aGlzLl9iaW5kTGluayhlbGVtZW50LCB7CisgICAgICAgICAgICBncm91cElkLAorICAgICAgICAgICAgaW5wdXQKKyAgICAgICAgICB9KTsKKworICAgICAgICAgIGlucHV0LnR5cGUgPSAiY2hlY2tib3giOworICAgICAgICAgIGlucHV0LmlkID0gZ3JvdXBJZDsKKyAgICAgICAgICBpbnB1dC5jaGVja2VkID0gZ3JvdXAudmlzaWJsZTsKKyAgICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7CisgICAgICAgICAgbGFiZWwuc2V0QXR0cmlidXRlKCJmb3IiLCBncm91cElkKTsKKyAgICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHRoaXMuX25vcm1hbGl6ZVRleHRDb250ZW50KGdyb3VwLm5hbWUpOworICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoaW5wdXQpOworICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobGFiZWwpOworICAgICAgICAgIGxheWVyc0NvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBsZXZlbERhdGEucGFyZW50LmFwcGVuZENoaWxkKGRpdik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhhc0FueU5lc3RpbmcpIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoInRyZWVXaXRoRGVlcE5lc3RpbmciKTsKKyAgICAgIHRoaXMuX2xhc3RUb2dnbGVJc1Nob3cgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudHJlZUl0ZW1zSGlkZGVuIikubGVuZ3RoID09PSAwOworICAgIH0KKworICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTsKKworICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQobGF5ZXJzQ291bnQpOworICB9CisKKyAgYXN5bmMgX3Jlc2V0TGF5ZXJzKCkgeworICAgIGlmICghdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3Qgb3B0aW9uYWxDb250ZW50Q29uZmlnID0gYXdhaXQgdGhpcy5fcGRmRG9jdW1lbnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7CisgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgib3B0aW9uYWxjb250ZW50Y29uZmlnIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKG9wdGlvbmFsQ29udGVudENvbmZpZykKKyAgICB9KTsKKyAgICB0aGlzLnJlbmRlcih7CisgICAgICBvcHRpb25hbENvbnRlbnRDb25maWcsCisgICAgICBwZGZEb2N1bWVudDogdGhpcy5fcGRmRG9jdW1lbnQKKyAgICB9KTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGTGF5ZXJWaWV3ZXIgPSBQREZMYXllclZpZXdlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9saW5rX3NlcnZpY2UuanMgYi9saWIvd2ViL3BkZl9saW5rX3NlcnZpY2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzMzFhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvcGRmX2xpbmtfc2VydmljZS5qcwpAQCAtMCwwICsxLDQ1NCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuU2ltcGxlTGlua1NlcnZpY2UgPSBleHBvcnRzLlBERkxpbmtTZXJ2aWNlID0gdm9pZCAwOworCit2YXIgX3VpX3V0aWxzID0gcmVxdWlyZSgiLi91aV91dGlscy5qcyIpOworCitjbGFzcyBQREZMaW5rU2VydmljZSB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBldmVudEJ1cywKKyAgICBleHRlcm5hbExpbmtUYXJnZXQgPSBudWxsLAorICAgIGV4dGVybmFsTGlua1JlbCA9IG51bGwsCisgICAgZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWUsCisgICAgaWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2UKKyAgfSA9IHt9KSB7CisgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOworICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gZXh0ZXJuYWxMaW5rVGFyZ2V0OworICAgIHRoaXMuZXh0ZXJuYWxMaW5rUmVsID0gZXh0ZXJuYWxMaW5rUmVsOworICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IGV4dGVybmFsTGlua0VuYWJsZWQ7CisgICAgdGhpcy5faWdub3JlRGVzdGluYXRpb25ab29tID0gaWdub3JlRGVzdGluYXRpb25ab29tOworICAgIHRoaXMuYmFzZVVybCA9IG51bGw7CisgICAgdGhpcy5wZGZEb2N1bWVudCA9IG51bGw7CisgICAgdGhpcy5wZGZWaWV3ZXIgPSBudWxsOworICAgIHRoaXMucGRmSGlzdG9yeSA9IG51bGw7CisgICAgdGhpcy5fcGFnZXNSZWZDYWNoZSA9IG51bGw7CisgIH0KKworICBzZXREb2N1bWVudChwZGZEb2N1bWVudCwgYmFzZVVybCA9IG51bGwpIHsKKyAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsOworICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDsKKyAgICB0aGlzLl9wYWdlc1JlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfQorCisgIHNldFZpZXdlcihwZGZWaWV3ZXIpIHsKKyAgICB0aGlzLnBkZlZpZXdlciA9IHBkZlZpZXdlcjsKKyAgfQorCisgIHNldEhpc3RvcnkocGRmSGlzdG9yeSkgeworICAgIHRoaXMucGRmSGlzdG9yeSA9IHBkZkhpc3Rvcnk7CisgIH0KKworICBnZXQgcGFnZXNDb3VudCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgOiAwOworICB9CisKKyAgZ2V0IHBhZ2UoKSB7CisgICAgcmV0dXJuIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyOworICB9CisKKyAgc2V0IHBhZ2UodmFsdWUpIHsKKyAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciA9IHZhbHVlOworICB9CisKKyAgZ2V0IHJvdGF0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5wYWdlc1JvdGF0aW9uOworICB9CisKKyAgc2V0IHJvdGF0aW9uKHZhbHVlKSB7CisgICAgdGhpcy5wZGZWaWV3ZXIucGFnZXNSb3RhdGlvbiA9IHZhbHVlOworICB9CisKKyAgbmF2aWdhdGVUbyhkZXN0KSB7CisgICAgY29uc3QgZ29Ub0Rlc3RpbmF0aW9uID0gKHsKKyAgICAgIG5hbWVkRGVzdCwKKyAgICAgIGV4cGxpY2l0RGVzdAorICAgIH0pID0+IHsKKyAgICAgIGNvbnN0IGRlc3RSZWYgPSBleHBsaWNpdERlc3RbMF07CisgICAgICBsZXQgcGFnZU51bWJlcjsKKworICAgICAgaWYgKGRlc3RSZWYgaW5zdGFuY2VvZiBPYmplY3QpIHsKKyAgICAgICAgcGFnZU51bWJlciA9IHRoaXMuX2NhY2hlZFBhZ2VOdW1iZXIoZGVzdFJlZik7CisKKyAgICAgICAgaWYgKHBhZ2VOdW1iZXIgPT09IG51bGwpIHsKKyAgICAgICAgICB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2VJbmRleChkZXN0UmVmKS50aGVuKHBhZ2VJbmRleCA9PiB7CisgICAgICAgICAgICB0aGlzLmNhY2hlUGFnZVJlZihwYWdlSW5kZXggKyAxLCBkZXN0UmVmKTsKKyAgICAgICAgICAgIGdvVG9EZXN0aW5hdGlvbih7CisgICAgICAgICAgICAgIG5hbWVkRGVzdCwKKyAgICAgICAgICAgICAgZXhwbGljaXREZXN0CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7CisgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvOiAiJHtkZXN0UmVmfSIgaXMgbm90IGAgKyBgYSB2YWxpZCBwYWdlIHJlZmVyZW5jZSwgZm9yIGRlc3Q9IiR7ZGVzdH0iLmApOworICAgICAgICAgIH0pOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGRlc3RSZWYpKSB7CisgICAgICAgIHBhZ2VOdW1iZXIgPSBkZXN0UmVmICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoYFBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86ICIke2Rlc3RSZWZ9IiBpcyBub3QgYCArIGBhIHZhbGlkIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSwgZm9yIGRlc3Q9IiR7ZGVzdH0iLmApOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICghcGFnZU51bWJlciB8fCBwYWdlTnVtYmVyIDwgMSB8fCBwYWdlTnVtYmVyID4gdGhpcy5wYWdlc0NvdW50KSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoYFBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86ICIke3BhZ2VOdW1iZXJ9IiBpcyBub3QgYCArIGBhIHZhbGlkIHBhZ2UgbnVtYmVyLCBmb3IgZGVzdD0iJHtkZXN0fSIuYCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkgeworICAgICAgICB0aGlzLnBkZkhpc3RvcnkucHVzaEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICB0aGlzLnBkZkhpc3RvcnkucHVzaCh7CisgICAgICAgICAgbmFtZWREZXN0LAorICAgICAgICAgIGV4cGxpY2l0RGVzdCwKKyAgICAgICAgICBwYWdlTnVtYmVyCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoeworICAgICAgICBwYWdlTnVtYmVyLAorICAgICAgICBkZXN0QXJyYXk6IGV4cGxpY2l0RGVzdCwKKyAgICAgICAgaWdub3JlRGVzdGluYXRpb25ab29tOiB0aGlzLl9pZ25vcmVEZXN0aW5hdGlvblpvb20KKyAgICAgIH0pOworICAgIH07CisKKyAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgICBpZiAodHlwZW9mIGRlc3QgPT09ICJzdHJpbmciKSB7CisgICAgICAgIHRoaXMucGRmRG9jdW1lbnQuZ2V0RGVzdGluYXRpb24oZGVzdCkudGhlbihkZXN0QXJyYXkgPT4geworICAgICAgICAgIHJlc29sdmUoeworICAgICAgICAgICAgbmFtZWREZXN0OiBkZXN0LAorICAgICAgICAgICAgZXhwbGljaXREZXN0OiBkZXN0QXJyYXkKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcmVzb2x2ZSh7CisgICAgICAgIG5hbWVkRGVzdDogIiIsCisgICAgICAgIGV4cGxpY2l0RGVzdDogZGVzdAorICAgICAgfSk7CisgICAgfSkudGhlbihkYXRhID0+IHsKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhLmV4cGxpY2l0RGVzdCkpIHsKKyAgICAgICAgY29uc29sZS5lcnJvcihgUERGTGlua1NlcnZpY2UubmF2aWdhdGVUbzogIiR7ZGF0YS5leHBsaWNpdERlc3R9IiBpc2AgKyBgIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIGFycmF5LCBmb3IgZGVzdD0iJHtkZXN0fSIuYCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZ29Ub0Rlc3RpbmF0aW9uKGRhdGEpOworICAgIH0pOworICB9CisKKyAgZ2V0RGVzdGluYXRpb25IYXNoKGRlc3QpIHsKKyAgICBpZiAodHlwZW9mIGRlc3QgPT09ICJzdHJpbmciKSB7CisgICAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoIiMiICsgZXNjYXBlKGRlc3QpKTsKKyAgICB9CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShkZXN0KSkgeworICAgICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGVzdCk7CisgICAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoIiMiICsgZXNjYXBlKHN0cikpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmdldEFuY2hvclVybCgiIik7CisgIH0KKworICBnZXRBbmNob3JVcmwoYW5jaG9yKSB7CisgICAgcmV0dXJuICh0aGlzLmJhc2VVcmwgfHwgIiIpICsgYW5jaG9yOworICB9CisKKyAgc2V0SGFzaChoYXNoKSB7CisgICAgbGV0IHBhZ2VOdW1iZXIsIGRlc3Q7CisKKyAgICBpZiAoaGFzaC5pbmNsdWRlcygiPSIpKSB7CisgICAgICBjb25zdCBwYXJhbXMgPSAoMCwgX3VpX3V0aWxzLnBhcnNlUXVlcnlTdHJpbmcpKGhhc2gpOworCisgICAgICBpZiAoInNlYXJjaCIgaW4gcGFyYW1zKSB7CisgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImZpbmRmcm9tdXJsaGFzaCIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgcXVlcnk6IHBhcmFtcy5zZWFyY2gucmVwbGFjZSgvIi9nLCAiIiksCisgICAgICAgICAgcGhyYXNlU2VhcmNoOiBwYXJhbXMucGhyYXNlID09PSAidHJ1ZSIKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmICgicGFnZSIgaW4gcGFyYW1zKSB7CisgICAgICAgIHBhZ2VOdW1iZXIgPSBwYXJhbXMucGFnZSB8IDAgfHwgMTsKKyAgICAgIH0KKworICAgICAgaWYgKCJ6b29tIiBpbiBwYXJhbXMpIHsKKyAgICAgICAgY29uc3Qgem9vbUFyZ3MgPSBwYXJhbXMuem9vbS5zcGxpdCgiLCIpOworICAgICAgICBjb25zdCB6b29tQXJnID0gem9vbUFyZ3NbMF07CisgICAgICAgIGNvbnN0IHpvb21BcmdOdW1iZXIgPSBwYXJzZUZsb2F0KHpvb21BcmcpOworCisgICAgICAgIGlmICghem9vbUFyZy5pbmNsdWRlcygiRml0IikpIHsKKyAgICAgICAgICBkZXN0ID0gW251bGwsIHsKKyAgICAgICAgICAgIG5hbWU6ICJYWVoiCisgICAgICAgICAgfSwgem9vbUFyZ3MubGVuZ3RoID4gMSA/IHpvb21BcmdzWzFdIHwgMCA6IG51bGwsIHpvb21BcmdzLmxlbmd0aCA+IDIgPyB6b29tQXJnc1syXSB8IDAgOiBudWxsLCB6b29tQXJnTnVtYmVyID8gem9vbUFyZ051bWJlciAvIDEwMCA6IHpvb21BcmddOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICh6b29tQXJnID09PSAiRml0IiB8fCB6b29tQXJnID09PSAiRml0QiIpIHsKKyAgICAgICAgICAgIGRlc3QgPSBbbnVsbCwgeworICAgICAgICAgICAgICBuYW1lOiB6b29tQXJnCisgICAgICAgICAgICB9XTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHpvb21BcmcgPT09ICJGaXRIIiB8fCB6b29tQXJnID09PSAiRml0QkgiIHx8IHpvb21BcmcgPT09ICJGaXRWIiB8fCB6b29tQXJnID09PSAiRml0QlYiKSB7CisgICAgICAgICAgICBkZXN0ID0gW251bGwsIHsKKyAgICAgICAgICAgICAgbmFtZTogem9vbUFyZworICAgICAgICAgICAgfSwgem9vbUFyZ3MubGVuZ3RoID4gMSA/IHpvb21BcmdzWzFdIHwgMCA6IG51bGxdOworICAgICAgICAgIH0gZWxzZSBpZiAoem9vbUFyZyA9PT0gIkZpdFIiKSB7CisgICAgICAgICAgICBpZiAoem9vbUFyZ3MubGVuZ3RoICE9PSA1KSB7CisgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BERkxpbmtTZXJ2aWNlLnNldEhhc2g6IE5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgIkZpdFIiLicpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7CisgICAgICAgICAgICAgICAgbmFtZTogem9vbUFyZworICAgICAgICAgICAgICB9LCB6b29tQXJnc1sxXSB8IDAsIHpvb21BcmdzWzJdIHwgMCwgem9vbUFyZ3NbM10gfCAwLCB6b29tQXJnc1s0XSB8IDBdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQREZMaW5rU2VydmljZS5zZXRIYXNoOiAiJHt6b29tQXJnfSIgaXMgbm90IGAgKyAiYSB2YWxpZCB6b29tIHZhbHVlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZGVzdCkgeworICAgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoeworICAgICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXIgfHwgdGhpcy5wYWdlLAorICAgICAgICAgIGRlc3RBcnJheTogZGVzdCwKKyAgICAgICAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0OiB0cnVlCisgICAgICAgIH0pOworICAgICAgfSBlbHNlIGlmIChwYWdlTnVtYmVyKSB7CisgICAgICAgIHRoaXMucGFnZSA9IHBhZ2VOdW1iZXI7CisgICAgICB9CisKKyAgICAgIGlmICgicGFnZW1vZGUiIGluIHBhcmFtcykgeworICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlbW9kZSIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgbW9kZTogcGFyYW1zLnBhZ2Vtb2RlCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBpZiAoIm5hbWVkZGVzdCIgaW4gcGFyYW1zKSB7CisgICAgICAgIHRoaXMubmF2aWdhdGVUbyhwYXJhbXMubmFtZWRkZXN0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZGVzdCA9IHVuZXNjYXBlKGhhc2gpOworCisgICAgICB0cnkgeworICAgICAgICBkZXN0ID0gSlNPTi5wYXJzZShkZXN0KTsKKworICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkpIHsKKyAgICAgICAgICBkZXN0ID0gZGVzdC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChleCkge30KKworICAgICAgaWYgKHR5cGVvZiBkZXN0ID09PSAic3RyaW5nIiB8fCBpc1ZhbGlkRXhwbGljaXREZXN0aW5hdGlvbihkZXN0KSkgeworICAgICAgICB0aGlzLm5hdmlnYXRlVG8oZGVzdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc29sZS5lcnJvcihgUERGTGlua1NlcnZpY2Uuc2V0SGFzaDogIiR7dW5lc2NhcGUoaGFzaCl9IiBpcyBub3QgYCArICJhIHZhbGlkIGRlc3RpbmF0aW9uLiIpOworICAgIH0KKyAgfQorCisgIGV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pIHsKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgY2FzZSAiR29CYWNrIjoKKyAgICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkgeworICAgICAgICAgIHRoaXMucGRmSGlzdG9yeS5iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiR29Gb3J3YXJkIjoKKyAgICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkgeworICAgICAgICAgIHRoaXMucGRmSGlzdG9yeS5mb3J3YXJkKCk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiTmV4dFBhZ2UiOgorICAgICAgICBpZiAodGhpcy5wYWdlIDwgdGhpcy5wYWdlc0NvdW50KSB7CisgICAgICAgICAgdGhpcy5wYWdlKys7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiUHJldlBhZ2UiOgorICAgICAgICBpZiAodGhpcy5wYWdlID4gMSkgeworICAgICAgICAgIHRoaXMucGFnZS0tOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIkxhc3RQYWdlIjoKKyAgICAgICAgdGhpcy5wYWdlID0gdGhpcy5wYWdlc0NvdW50OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiRmlyc3RQYWdlIjoKKyAgICAgICAgdGhpcy5wYWdlID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goIm5hbWVkYWN0aW9uIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgYWN0aW9uCisgICAgfSk7CisgIH0KKworICBjYWNoZVBhZ2VSZWYocGFnZU51bSwgcGFnZVJlZikgeworICAgIGlmICghcGFnZVJlZikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHJlZlN0ciA9IHBhZ2VSZWYuZ2VuID09PSAwID8gYCR7cGFnZVJlZi5udW19UmAgOiBgJHtwYWdlUmVmLm51bX1SJHtwYWdlUmVmLmdlbn1gOworICAgIHRoaXMuX3BhZ2VzUmVmQ2FjaGVbcmVmU3RyXSA9IHBhZ2VOdW07CisgIH0KKworICBfY2FjaGVkUGFnZU51bWJlcihwYWdlUmVmKSB7CisgICAgY29uc3QgcmVmU3RyID0gcGFnZVJlZi5nZW4gPT09IDAgPyBgJHtwYWdlUmVmLm51bX1SYCA6IGAke3BhZ2VSZWYubnVtfVIke3BhZ2VSZWYuZ2VufWA7CisgICAgcmV0dXJuIHRoaXMuX3BhZ2VzUmVmQ2FjaGUgJiYgdGhpcy5fcGFnZXNSZWZDYWNoZVtyZWZTdHJdIHx8IG51bGw7CisgIH0KKworICBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZWaWV3ZXIuaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGTGlua1NlcnZpY2UgPSBQREZMaW5rU2VydmljZTsKKworZnVuY3Rpb24gaXNWYWxpZEV4cGxpY2l0RGVzdGluYXRpb24oZGVzdCkgeworICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBkZXN0TGVuZ3RoID0gZGVzdC5sZW5ndGg7CisKKyAgaWYgKGRlc3RMZW5ndGggPCAyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgcGFnZSA9IGRlc3RbMF07CisKKyAgaWYgKCEodHlwZW9mIHBhZ2UgPT09ICJvYmplY3QiICYmIE51bWJlci5pc0ludGVnZXIocGFnZS5udW0pICYmIE51bWJlci5pc0ludGVnZXIocGFnZS5nZW4pKSAmJiAhKE51bWJlci5pc0ludGVnZXIocGFnZSkgJiYgcGFnZSA+PSAwKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IHpvb20gPSBkZXN0WzFdOworCisgIGlmICghKHR5cGVvZiB6b29tID09PSAib2JqZWN0IiAmJiB0eXBlb2Ygem9vbS5uYW1lID09PSAic3RyaW5nIikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBsZXQgYWxsb3dOdWxsID0gdHJ1ZTsKKworICBzd2l0Y2ggKHpvb20ubmFtZSkgeworICAgIGNhc2UgIlhZWiI6CisgICAgICBpZiAoZGVzdExlbmd0aCAhPT0gNSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAiRml0IjoKKyAgICBjYXNlICJGaXRCIjoKKyAgICAgIHJldHVybiBkZXN0TGVuZ3RoID09PSAyOworCisgICAgY2FzZSAiRml0SCI6CisgICAgY2FzZSAiRml0QkgiOgorICAgIGNhc2UgIkZpdFYiOgorICAgIGNhc2UgIkZpdEJWIjoKKyAgICAgIGlmIChkZXN0TGVuZ3RoICE9PSAzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJGaXRSIjoKKyAgICAgIGlmIChkZXN0TGVuZ3RoICE9PSA2KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYWxsb3dOdWxsID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3IgKGxldCBpID0gMjsgaSA8IGRlc3RMZW5ndGg7IGkrKykgeworICAgIGNvbnN0IHBhcmFtID0gZGVzdFtpXTsKKworICAgIGlmICghKHR5cGVvZiBwYXJhbSA9PT0gIm51bWJlciIgfHwgYWxsb3dOdWxsICYmIHBhcmFtID09PSBudWxsKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBTaW1wbGVMaW5rU2VydmljZSB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gbnVsbDsKKyAgICB0aGlzLmV4dGVybmFsTGlua1JlbCA9IG51bGw7CisgICAgdGhpcy5leHRlcm5hbExpbmtFbmFibGVkID0gdHJ1ZTsKKyAgICB0aGlzLl9pZ25vcmVEZXN0aW5hdGlvblpvb20gPSBmYWxzZTsKKyAgfQorCisgIGdldCBwYWdlc0NvdW50KCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZ2V0IHBhZ2UoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzZXQgcGFnZSh2YWx1ZSkge30KKworICBnZXQgcm90YXRpb24oKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzZXQgcm90YXRpb24odmFsdWUpIHt9CisKKyAgbmF2aWdhdGVUbyhkZXN0KSB7fQorCisgIGdldERlc3RpbmF0aW9uSGFzaChkZXN0KSB7CisgICAgcmV0dXJuICIjIjsKKyAgfQorCisgIGdldEFuY2hvclVybChoYXNoKSB7CisgICAgcmV0dXJuICIjIjsKKyAgfQorCisgIHNldEhhc2goaGFzaCkge30KKworICBleGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKSB7fQorCisgIGNhY2hlUGFnZVJlZihwYWdlTnVtLCBwYWdlUmVmKSB7fQorCisgIGlzUGFnZVZpc2libGUocGFnZU51bWJlcikgeworICAgIHJldHVybiB0cnVlOworICB9CisKK30KKworZXhwb3J0cy5TaW1wbGVMaW5rU2VydmljZSA9IFNpbXBsZUxpbmtTZXJ2aWNlOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvcGRmX291dGxpbmVfdmlld2VyLmpzIGIvbGliL3dlYi9wZGZfb3V0bGluZV92aWV3ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwNGM0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvcGRmX291dGxpbmVfdmlld2VyLmpzCkBAIC0wLDAgKzEsMTgyIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZPdXRsaW5lVmlld2VyID0gdm9pZCAwOworCit2YXIgX3BkZiA9IHJlcXVpcmUoIi4uL3BkZiIpOworCit2YXIgX2Jhc2VfdHJlZV92aWV3ZXIgPSByZXF1aXJlKCIuL2Jhc2VfdHJlZV92aWV3ZXIuanMiKTsKKworY2xhc3MgUERGT3V0bGluZVZpZXdlciBleHRlbmRzIF9iYXNlX3RyZWVfdmlld2VyLkJhc2VUcmVlVmlld2VyIHsKKyAgY29uc3RydWN0b3Iob3B0aW9ucykgeworICAgIHN1cGVyKG9wdGlvbnMpOworICAgIHRoaXMubGlua1NlcnZpY2UgPSBvcHRpb25zLmxpbmtTZXJ2aWNlOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInRvZ2dsZW91dGxpbmV0cmVlIiwgdGhpcy5fdG9nZ2xlQWxsVHJlZUl0ZW1zLmJpbmQodGhpcykpOworICB9CisKKyAgcmVzZXQoKSB7CisgICAgc3VwZXIucmVzZXQoKTsKKyAgICB0aGlzLl9vdXRsaW5lID0gbnVsbDsKKyAgfQorCisgIF9kaXNwYXRjaEV2ZW50KG91dGxpbmVDb3VudCkgeworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goIm91dGxpbmVsb2FkZWQiLCB7CisgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICBvdXRsaW5lQ291bnQKKyAgICB9KTsKKyAgfQorCisgIF9iaW5kTGluayhlbGVtZW50LCB7CisgICAgdXJsLAorICAgIG5ld1dpbmRvdywKKyAgICBkZXN0CisgIH0pIHsKKyAgICBjb25zdCB7CisgICAgICBsaW5rU2VydmljZQorICAgIH0gPSB0aGlzOworCisgICAgaWYgKHVybCkgeworICAgICAgKDAsIF9wZGYuYWRkTGlua0F0dHJpYnV0ZXMpKGVsZW1lbnQsIHsKKyAgICAgICAgdXJsLAorICAgICAgICB0YXJnZXQ6IG5ld1dpbmRvdyA/IF9wZGYuTGlua1RhcmdldC5CTEFOSyA6IGxpbmtTZXJ2aWNlLmV4dGVybmFsTGlua1RhcmdldCwKKyAgICAgICAgcmVsOiBsaW5rU2VydmljZS5leHRlcm5hbExpbmtSZWwsCisgICAgICAgIGVuYWJsZWQ6IGxpbmtTZXJ2aWNlLmV4dGVybmFsTGlua0VuYWJsZWQKKyAgICAgIH0pOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVsZW1lbnQuaHJlZiA9IGxpbmtTZXJ2aWNlLmdldERlc3RpbmF0aW9uSGFzaChkZXN0KTsKKworICAgIGVsZW1lbnQub25jbGljayA9ICgpID0+IHsKKyAgICAgIGlmIChkZXN0KSB7CisgICAgICAgIGxpbmtTZXJ2aWNlLm5hdmlnYXRlVG8oZGVzdCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworICB9CisKKyAgX3NldFN0eWxlcyhlbGVtZW50LCB7CisgICAgYm9sZCwKKyAgICBpdGFsaWMKKyAgfSkgeworICAgIGlmIChib2xkKSB7CisgICAgICBlbGVtZW50LnN0eWxlLmZvbnRXZWlnaHQgPSAiYm9sZCI7CisgICAgfQorCisgICAgaWYgKGl0YWxpYykgeworICAgICAgZWxlbWVudC5zdHlsZS5mb250U3R5bGUgPSAiaXRhbGljIjsKKyAgICB9CisgIH0KKworICBfYWRkVG9nZ2xlQnV0dG9uKGRpdiwgeworICAgIGNvdW50LAorICAgIGl0ZW1zCisgIH0pIHsKKyAgICBjb25zdCBoaWRkZW4gPSBjb3VudCA8IDAgJiYgTWF0aC5hYnMoY291bnQpID09PSBpdGVtcy5sZW5ndGg7CisKKyAgICBzdXBlci5fYWRkVG9nZ2xlQnV0dG9uKGRpdiwgaGlkZGVuKTsKKyAgfQorCisgIF90b2dnbGVBbGxUcmVlSXRlbXMoKSB7CisgICAgaWYgKCF0aGlzLl9vdXRsaW5lKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3VwZXIuX3RvZ2dsZUFsbFRyZWVJdGVtcygpOworICB9CisKKyAgcmVuZGVyKHsKKyAgICBvdXRsaW5lCisgIH0pIHsKKyAgICBpZiAodGhpcy5fb3V0bGluZSkgeworICAgICAgdGhpcy5yZXNldCgpOworICAgIH0KKworICAgIHRoaXMuX291dGxpbmUgPSBvdXRsaW5lIHx8IG51bGw7CisKKyAgICBpZiAoIW91dGxpbmUpIHsKKyAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoMCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICBjb25zdCBxdWV1ZSA9IFt7CisgICAgICBwYXJlbnQ6IGZyYWdtZW50LAorICAgICAgaXRlbXM6IG91dGxpbmUKKyAgICB9XTsKKyAgICBsZXQgb3V0bGluZUNvdW50ID0gMCwKKyAgICAgICAgaGFzQW55TmVzdGluZyA9IGZhbHNlOworCisgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgIGNvbnN0IGxldmVsRGF0YSA9IHF1ZXVlLnNoaWZ0KCk7CisKKyAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsZXZlbERhdGEuaXRlbXMpIHsKKyAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgIGRpdi5jbGFzc05hbWUgPSAidHJlZUl0ZW0iOworICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOworCisgICAgICAgIHRoaXMuX2JpbmRMaW5rKGVsZW1lbnQsIGl0ZW0pOworCisgICAgICAgIHRoaXMuX3NldFN0eWxlcyhlbGVtZW50LCBpdGVtKTsKKworICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5fbm9ybWFsaXplVGV4dENvbnRlbnQoaXRlbS50aXRsZSk7CisgICAgICAgIGRpdi5hcHBlbmRDaGlsZChlbGVtZW50KTsKKworICAgICAgICBpZiAoaXRlbS5pdGVtcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgaGFzQW55TmVzdGluZyA9IHRydWU7CisKKyAgICAgICAgICB0aGlzLl9hZGRUb2dnbGVCdXR0b24oZGl2LCBpdGVtKTsKKworICAgICAgICAgIGNvbnN0IGl0ZW1zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgICAgaXRlbXNEaXYuY2xhc3NOYW1lID0gInRyZWVJdGVtcyI7CisgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGl0ZW1zRGl2KTsKKyAgICAgICAgICBxdWV1ZS5wdXNoKHsKKyAgICAgICAgICAgIHBhcmVudDogaXRlbXNEaXYsCisgICAgICAgICAgICBpdGVtczogaXRlbS5pdGVtcworICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgbGV2ZWxEYXRhLnBhcmVudC5hcHBlbmRDaGlsZChkaXYpOworICAgICAgICBvdXRsaW5lQ291bnQrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGFzQW55TmVzdGluZykgeworICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgidHJlZVdpdGhEZWVwTmVzdGluZyIpOworICAgICAgdGhpcy5fbGFzdFRvZ2dsZUlzU2hvdyA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50cmVlSXRlbXNIaWRkZW4iKS5sZW5ndGggPT09IDA7CisgICAgfQorCisgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpOworCisgICAgdGhpcy5fZGlzcGF0Y2hFdmVudChvdXRsaW5lQ291bnQpOworICB9CisKK30KKworZXhwb3J0cy5QREZPdXRsaW5lVmlld2VyID0gUERGT3V0bGluZVZpZXdlcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9wYWdlX3ZpZXcuanMgYi9saWIvd2ViL3BkZl9wYWdlX3ZpZXcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiMTVlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvcGRmX3BhZ2Vfdmlldy5qcwpAQCAtMCwwICsxLDYzNiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGUGFnZVZpZXcgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK3ZhciBfcGRmID0gcmVxdWlyZSgiLi4vcGRmIik7CisKK3ZhciBfcGRmX3JlbmRlcmluZ19xdWV1ZSA9IHJlcXVpcmUoIi4vcGRmX3JlbmRlcmluZ19xdWV1ZS5qcyIpOworCit2YXIgX3ZpZXdlcl9jb21wYXRpYmlsaXR5ID0gcmVxdWlyZSgiLi92aWV3ZXJfY29tcGF0aWJpbGl0eS5qcyIpOworCitjb25zdCBNQVhfQ0FOVkFTX1BJWEVMUyA9IF92aWV3ZXJfY29tcGF0aWJpbGl0eS52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLm1heENhbnZhc1BpeGVscyB8fCAxNjc3NzIxNjsKKworY2xhc3MgUERGUGFnZVZpZXcgeworICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CisgICAgY29uc3QgY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7CisgICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0gb3B0aW9ucy5kZWZhdWx0Vmlld3BvcnQ7CisgICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQ7CisgICAgdGhpcy5yZW5kZXJpbmdJZCA9ICJwYWdlIiArIHRoaXMuaWQ7CisgICAgdGhpcy5wZGZQYWdlID0gbnVsbDsKKyAgICB0aGlzLnBhZ2VMYWJlbCA9IG51bGw7CisgICAgdGhpcy5yb3RhdGlvbiA9IDA7CisgICAgdGhpcy5zY2FsZSA9IG9wdGlvbnMuc2NhbGUgfHwgX3VpX3V0aWxzLkRFRkFVTFRfU0NBTEU7CisgICAgdGhpcy52aWV3cG9ydCA9IGRlZmF1bHRWaWV3cG9ydDsKKyAgICB0aGlzLnBkZlBhZ2VSb3RhdGUgPSBkZWZhdWx0Vmlld3BvcnQucm90YXRpb247CisgICAgdGhpcy5fYW5ub3RhdGlvblN0b3JhZ2UgPSBvcHRpb25zLmFubm90YXRpb25TdG9yYWdlIHx8IG51bGw7CisgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG9wdGlvbnMub3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSB8fCBudWxsOworICAgIHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgPSBmYWxzZTsKKyAgICB0aGlzLnRleHRMYXllck1vZGUgPSBOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMudGV4dExheWVyTW9kZSkgPyBvcHRpb25zLnRleHRMYXllck1vZGUgOiBfdWlfdXRpbHMuVGV4dExheWVyTW9kZS5FTkFCTEU7CisgICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBvcHRpb25zLmltYWdlUmVzb3VyY2VzUGF0aCB8fCAiIjsKKyAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPSB0eXBlb2Ygb3B0aW9ucy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID09PSAiYm9vbGVhbiIgPyBvcHRpb25zLnJlbmRlckludGVyYWN0aXZlRm9ybXMgOiB0cnVlOworICAgIHRoaXMudXNlT25seUNzc1pvb20gPSBvcHRpb25zLnVzZU9ubHlDc3Nab29tIHx8IGZhbHNlOworICAgIHRoaXMubWF4Q2FudmFzUGl4ZWxzID0gb3B0aW9ucy5tYXhDYW52YXNQaXhlbHMgfHwgTUFYX0NBTlZBU19QSVhFTFM7CisgICAgdGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7CisgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZSA9IG9wdGlvbnMucmVuZGVyaW5nUXVldWU7CisgICAgdGhpcy50ZXh0TGF5ZXJGYWN0b3J5ID0gb3B0aW9ucy50ZXh0TGF5ZXJGYWN0b3J5OworICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyRmFjdG9yeSA9IG9wdGlvbnMuYW5ub3RhdGlvbkxheWVyRmFjdG9yeTsKKyAgICB0aGlzLnJlbmRlcmVyID0gb3B0aW9ucy5yZW5kZXJlciB8fCBfdWlfdXRpbHMuUmVuZGVyZXJUeXBlLkNBTlZBUzsKKyAgICB0aGlzLmVuYWJsZVdlYkdMID0gb3B0aW9ucy5lbmFibGVXZWJHTCB8fCBmYWxzZTsKKyAgICB0aGlzLmwxMG4gPSBvcHRpb25zLmwxMG4gfHwgX3VpX3V0aWxzLk51bGxMMTBuOworICAgIHRoaXMucGFpbnRUYXNrID0gbnVsbDsKKyAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcCA9IG5ldyBXZWFrTWFwKCk7CisgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5JTklUSUFMOworICAgIHRoaXMucmVzdW1lID0gbnVsbDsKKyAgICB0aGlzLmVycm9yID0gbnVsbDsKKyAgICB0aGlzLmFubm90YXRpb25MYXllciA9IG51bGw7CisgICAgdGhpcy50ZXh0TGF5ZXIgPSBudWxsOworICAgIHRoaXMuem9vbUxheWVyID0gbnVsbDsKKyAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICBkaXYuY2xhc3NOYW1lID0gInBhZ2UiOworICAgIGRpdi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC53aWR0aCkgKyAicHgiOworICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSArICJweCI7CisgICAgZGl2LnNldEF0dHJpYnV0ZSgiZGF0YS1wYWdlLW51bWJlciIsIHRoaXMuaWQpOworICAgIHRoaXMuZGl2ID0gZGl2OworICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpOworICB9CisKKyAgc2V0UGRmUGFnZShwZGZQYWdlKSB7CisgICAgdGhpcy5wZGZQYWdlID0gcGRmUGFnZTsKKyAgICB0aGlzLnBkZlBhZ2VSb3RhdGUgPSBwZGZQYWdlLnJvdGF0ZTsKKyAgICBjb25zdCB0b3RhbFJvdGF0aW9uID0gKHRoaXMucm90YXRpb24gKyB0aGlzLnBkZlBhZ2VSb3RhdGUpICUgMzYwOworICAgIHRoaXMudmlld3BvcnQgPSBwZGZQYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgIHNjYWxlOiB0aGlzLnNjYWxlICogX3VpX3V0aWxzLkNTU19VTklUUywKKyAgICAgIHJvdGF0aW9uOiB0b3RhbFJvdGF0aW9uCisgICAgfSk7CisgICAgdGhpcy5zdGF0cyA9IHBkZlBhZ2Uuc3RhdHM7CisgICAgdGhpcy5yZXNldCgpOworICB9CisKKyAgZGVzdHJveSgpIHsKKyAgICB0aGlzLnJlc2V0KCk7CisKKyAgICBpZiAodGhpcy5wZGZQYWdlKSB7CisgICAgICB0aGlzLnBkZlBhZ2UuY2xlYW51cCgpOworICAgIH0KKyAgfQorCisgIGFzeW5jIF9yZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKSB7CisgICAgbGV0IGVycm9yID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBhd2FpdCB0aGlzLmFubm90YXRpb25MYXllci5yZW5kZXIodGhpcy52aWV3cG9ydCwgImRpc3BsYXkiKTsKKyAgICB9IGNhdGNoIChleCkgeworICAgICAgZXJyb3IgPSBleDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgiYW5ub3RhdGlvbmxheWVycmVuZGVyZWQiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCwKKyAgICAgICAgZXJyb3IKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIF9yZXNldFpvb21MYXllcihyZW1vdmVGcm9tRE9NID0gZmFsc2UpIHsKKyAgICBpZiAoIXRoaXMuem9vbUxheWVyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3Qgem9vbUxheWVyQ2FudmFzID0gdGhpcy56b29tTGF5ZXIuZmlyc3RDaGlsZDsKKyAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcC5kZWxldGUoem9vbUxheWVyQ2FudmFzKTsKKyAgICB6b29tTGF5ZXJDYW52YXMud2lkdGggPSAwOworICAgIHpvb21MYXllckNhbnZhcy5oZWlnaHQgPSAwOworCisgICAgaWYgKHJlbW92ZUZyb21ET00pIHsKKyAgICAgIHRoaXMuem9vbUxheWVyLnJlbW92ZSgpOworICAgIH0KKworICAgIHRoaXMuem9vbUxheWVyID0gbnVsbDsKKyAgfQorCisgIHJlc2V0KGtlZXBab29tTGF5ZXIgPSBmYWxzZSwga2VlcEFubm90YXRpb25zID0gZmFsc2UpIHsKKyAgICB0aGlzLmNhbmNlbFJlbmRlcmluZyhrZWVwQW5ub3RhdGlvbnMpOworICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuSU5JVElBTDsKKyAgICBjb25zdCBkaXYgPSB0aGlzLmRpdjsKKyAgICBkaXYuc3R5bGUud2lkdGggPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQud2lkdGgpICsgInB4IjsKKyAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gTWF0aC5mbG9vcih0aGlzLnZpZXdwb3J0LmhlaWdodCkgKyAicHgiOworICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBkaXYuY2hpbGROb2RlczsKKyAgICBjb25zdCBjdXJyZW50Wm9vbUxheWVyTm9kZSA9IGtlZXBab29tTGF5ZXIgJiYgdGhpcy56b29tTGF5ZXIgfHwgbnVsbDsKKyAgICBjb25zdCBjdXJyZW50QW5ub3RhdGlvbk5vZGUgPSBrZWVwQW5ub3RhdGlvbnMgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2IHx8IG51bGw7CisKKyAgICBmb3IgKGxldCBpID0gY2hpbGROb2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgY29uc3Qgbm9kZSA9IGNoaWxkTm9kZXNbaV07CisKKyAgICAgIGlmIChjdXJyZW50Wm9vbUxheWVyTm9kZSA9PT0gbm9kZSB8fCBjdXJyZW50QW5ub3RhdGlvbk5vZGUgPT09IG5vZGUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGRpdi5yZW1vdmVDaGlsZChub2RlKTsKKyAgICB9CisKKyAgICBkaXYucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWxvYWRlZCIpOworCisgICAgaWYgKGN1cnJlbnRBbm5vdGF0aW9uTm9kZSkgeworICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuaGlkZSgpOworICAgIH0gZWxzZSBpZiAodGhpcy5hbm5vdGF0aW9uTGF5ZXIpIHsKKyAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyLmNhbmNlbCgpOworICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSBudWxsOworICAgIH0KKworICAgIGlmICghY3VycmVudFpvb21MYXllck5vZGUpIHsKKyAgICAgIGlmICh0aGlzLmNhbnZhcykgeworICAgICAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcC5kZWxldGUodGhpcy5jYW52YXMpOworICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IDA7CisgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IDA7CisgICAgICAgIGRlbGV0ZSB0aGlzLmNhbnZhczsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVzZXRab29tTGF5ZXIoKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5zdmcpIHsKKyAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLmRlbGV0ZSh0aGlzLnN2Zyk7CisgICAgICBkZWxldGUgdGhpcy5zdmc7CisgICAgfQorCisgICAgdGhpcy5sb2FkaW5nSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRoaXMubG9hZGluZ0ljb25EaXYuY2xhc3NOYW1lID0gImxvYWRpbmdJY29uIjsKKyAgICBkaXYuYXBwZW5kQ2hpbGQodGhpcy5sb2FkaW5nSWNvbkRpdik7CisgIH0KKworICB1cGRhdGUoc2NhbGUsIHJvdGF0aW9uLCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gbnVsbCkgeworICAgIHRoaXMuc2NhbGUgPSBzY2FsZSB8fCB0aGlzLnNjYWxlOworCisgICAgaWYgKHR5cGVvZiByb3RhdGlvbiAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIHRoaXMucm90YXRpb24gPSByb3RhdGlvbjsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpIHsKKyAgICAgIHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlOworICAgIH0KKworICAgIGNvbnN0IHRvdGFsUm90YXRpb24gPSAodGhpcy5yb3RhdGlvbiArIHRoaXMucGRmUGFnZVJvdGF0ZSkgJSAzNjA7CisgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMudmlld3BvcnQuY2xvbmUoeworICAgICAgc2NhbGU6IHRoaXMuc2NhbGUgKiBfdWlfdXRpbHMuQ1NTX1VOSVRTLAorICAgICAgcm90YXRpb246IHRvdGFsUm90YXRpb24KKyAgICB9KTsKKworICAgIGlmICh0aGlzLnN2ZykgeworICAgICAgdGhpcy5jc3NUcmFuc2Zvcm0odGhpcy5zdmcsIHRydWUpOworICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgicGFnZXJlbmRlcmVkIiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIHBhZ2VOdW1iZXI6IHRoaXMuaWQsCisgICAgICAgIGNzc1RyYW5zZm9ybTogdHJ1ZSwKKyAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKQorICAgICAgfSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IGlzU2NhbGluZ1Jlc3RyaWN0ZWQgPSBmYWxzZTsKKworICAgIGlmICh0aGlzLmNhbnZhcyAmJiB0aGlzLm1heENhbnZhc1BpeGVscyA+IDApIHsKKyAgICAgIGNvbnN0IG91dHB1dFNjYWxlID0gdGhpcy5vdXRwdXRTY2FsZTsKKworICAgICAgaWYgKChNYXRoLmZsb29yKHRoaXMudmlld3BvcnQud2lkdGgpICogb3V0cHV0U2NhbGUuc3ggfCAwKSAqIChNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSAqIG91dHB1dFNjYWxlLnN5IHwgMCkgPiB0aGlzLm1heENhbnZhc1BpeGVscykgeworICAgICAgICBpc1NjYWxpbmdSZXN0cmljdGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy5jYW52YXMpIHsKKyAgICAgIGlmICh0aGlzLnVzZU9ubHlDc3Nab29tIHx8IHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgJiYgaXNTY2FsaW5nUmVzdHJpY3RlZCkgeworICAgICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLmNhbnZhcywgdHJ1ZSk7CisgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInBhZ2VyZW5kZXJlZCIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCwKKyAgICAgICAgICBjc3NUcmFuc2Zvcm06IHRydWUsCisgICAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMuem9vbUxheWVyICYmICF0aGlzLmNhbnZhcy5oYXNBdHRyaWJ1dGUoImhpZGRlbiIpKSB7CisgICAgICAgIHRoaXMuem9vbUxheWVyID0gdGhpcy5jYW52YXMucGFyZW50Tm9kZTsKKyAgICAgICAgdGhpcy56b29tTGF5ZXIuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLnpvb21MYXllcikgeworICAgICAgdGhpcy5jc3NUcmFuc2Zvcm0odGhpcy56b29tTGF5ZXIuZmlyc3RDaGlsZCk7CisgICAgfQorCisgICAgdGhpcy5yZXNldCh0cnVlLCB0cnVlKTsKKyAgfQorCisgIGNhbmNlbFJlbmRlcmluZyhrZWVwQW5ub3RhdGlvbnMgPSBmYWxzZSkgeworICAgIGlmICh0aGlzLnBhaW50VGFzaykgeworICAgICAgdGhpcy5wYWludFRhc2suY2FuY2VsKCk7CisgICAgICB0aGlzLnBhaW50VGFzayA9IG51bGw7CisgICAgfQorCisgICAgdGhpcy5yZXN1bWUgPSBudWxsOworCisgICAgaWYgKHRoaXMudGV4dExheWVyKSB7CisgICAgICB0aGlzLnRleHRMYXllci5jYW5jZWwoKTsKKyAgICAgIHRoaXMudGV4dExheWVyID0gbnVsbDsKKyAgICB9CisKKyAgICBpZiAoIWtlZXBBbm5vdGF0aW9ucyAmJiB0aGlzLmFubm90YXRpb25MYXllcikgeworICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuY2FuY2VsKCk7CisgICAgICB0aGlzLmFubm90YXRpb25MYXllciA9IG51bGw7CisgICAgfQorICB9CisKKyAgY3NzVHJhbnNmb3JtKHRhcmdldCwgcmVkcmF3QW5ub3RhdGlvbnMgPSBmYWxzZSkgeworICAgIGNvbnN0IHdpZHRoID0gdGhpcy52aWV3cG9ydC53aWR0aDsKKyAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnZpZXdwb3J0LmhlaWdodDsKKyAgICBjb25zdCBkaXYgPSB0aGlzLmRpdjsKKyAgICB0YXJnZXQuc3R5bGUud2lkdGggPSB0YXJnZXQucGFyZW50Tm9kZS5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3Iod2lkdGgpICsgInB4IjsKKyAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gdGFyZ2V0LnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0ID0gZGl2LnN0eWxlLmhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0KSArICJweCI7CisgICAgY29uc3QgcmVsYXRpdmVSb3RhdGlvbiA9IHRoaXMudmlld3BvcnQucm90YXRpb24gLSB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcC5nZXQodGFyZ2V0KS5yb3RhdGlvbjsKKyAgICBjb25zdCBhYnNSb3RhdGlvbiA9IE1hdGguYWJzKHJlbGF0aXZlUm90YXRpb24pOworICAgIGxldCBzY2FsZVggPSAxLAorICAgICAgICBzY2FsZVkgPSAxOworCisgICAgaWYgKGFic1JvdGF0aW9uID09PSA5MCB8fCBhYnNSb3RhdGlvbiA9PT0gMjcwKSB7CisgICAgICBzY2FsZVggPSBoZWlnaHQgLyB3aWR0aDsKKyAgICAgIHNjYWxlWSA9IHdpZHRoIC8gaGVpZ2h0OworICAgIH0KKworICAgIGNvbnN0IGNzc1RyYW5zZm9ybSA9ICJyb3RhdGUoIiArIHJlbGF0aXZlUm90YXRpb24gKyAiZGVnKSAiICsgInNjYWxlKCIgKyBzY2FsZVggKyAiLCIgKyBzY2FsZVkgKyAiKSI7CisgICAgdGFyZ2V0LnN0eWxlLnRyYW5zZm9ybSA9IGNzc1RyYW5zZm9ybTsKKworICAgIGlmICh0aGlzLnRleHRMYXllcikgeworICAgICAgY29uc3QgdGV4dExheWVyVmlld3BvcnQgPSB0aGlzLnRleHRMYXllci52aWV3cG9ydDsKKyAgICAgIGNvbnN0IHRleHRSZWxhdGl2ZVJvdGF0aW9uID0gdGhpcy52aWV3cG9ydC5yb3RhdGlvbiAtIHRleHRMYXllclZpZXdwb3J0LnJvdGF0aW9uOworICAgICAgY29uc3QgdGV4dEFic1JvdGF0aW9uID0gTWF0aC5hYnModGV4dFJlbGF0aXZlUm90YXRpb24pOworICAgICAgbGV0IHNjYWxlID0gd2lkdGggLyB0ZXh0TGF5ZXJWaWV3cG9ydC53aWR0aDsKKworICAgICAgaWYgKHRleHRBYnNSb3RhdGlvbiA9PT0gOTAgfHwgdGV4dEFic1JvdGF0aW9uID09PSAyNzApIHsKKyAgICAgICAgc2NhbGUgPSB3aWR0aCAvIHRleHRMYXllclZpZXdwb3J0LmhlaWdodDsKKyAgICAgIH0KKworICAgICAgY29uc3QgdGV4dExheWVyRGl2ID0gdGhpcy50ZXh0TGF5ZXIudGV4dExheWVyRGl2OworICAgICAgbGV0IHRyYW5zWCwgdHJhbnNZOworCisgICAgICBzd2l0Y2ggKHRleHRBYnNSb3RhdGlvbikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgdHJhbnNYID0gdHJhbnNZID0gMDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDkwOgorICAgICAgICAgIHRyYW5zWCA9IDA7CisgICAgICAgICAgdHJhbnNZID0gIi0iICsgdGV4dExheWVyRGl2LnN0eWxlLmhlaWdodDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICB0cmFuc1ggPSAiLSIgKyB0ZXh0TGF5ZXJEaXYuc3R5bGUud2lkdGg7CisgICAgICAgICAgdHJhbnNZID0gIi0iICsgdGV4dExheWVyRGl2LnN0eWxlLmhlaWdodDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICB0cmFuc1ggPSAiLSIgKyB0ZXh0TGF5ZXJEaXYuc3R5bGUud2lkdGg7CisgICAgICAgICAgdHJhbnNZID0gMDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkJhZCByb3RhdGlvbiB2YWx1ZS4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdGV4dExheWVyRGl2LnN0eWxlLnRyYW5zZm9ybSA9ICJyb3RhdGUoIiArIHRleHRBYnNSb3RhdGlvbiArICJkZWcpICIgKyAic2NhbGUoIiArIHNjYWxlICsgIiwgIiArIHNjYWxlICsgIikgIiArICJ0cmFuc2xhdGUoIiArIHRyYW5zWCArICIsICIgKyB0cmFuc1kgKyAiKSI7CisgICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gIjAlIDAlIjsKKyAgICB9CisKKyAgICBpZiAocmVkcmF3QW5ub3RhdGlvbnMgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIpIHsKKyAgICAgIHRoaXMuX3JlbmRlckFubm90YXRpb25MYXllcigpOworICAgIH0KKyAgfQorCisgIGdldCB3aWR0aCgpIHsKKyAgICByZXR1cm4gdGhpcy52aWV3cG9ydC53aWR0aDsKKyAgfQorCisgIGdldCBoZWlnaHQoKSB7CisgICAgcmV0dXJuIHRoaXMudmlld3BvcnQuaGVpZ2h0OworICB9CisKKyAgZ2V0UGFnZVBvaW50KHgsIHkpIHsKKyAgICByZXR1cm4gdGhpcy52aWV3cG9ydC5jb252ZXJ0VG9QZGZQb2ludCh4LCB5KTsKKyAgfQorCisgIGRyYXcoKSB7CisgICAgaWYgKHRoaXMucmVuZGVyaW5nU3RhdGUgIT09IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5JTklUSUFMKSB7CisgICAgICBjb25zb2xlLmVycm9yKCJNdXN0IGJlIGluIG5ldyBzdGF0ZSBiZWZvcmUgZHJhd2luZyIpOworICAgICAgdGhpcy5yZXNldCgpOworICAgIH0KKworICAgIGNvbnN0IHsKKyAgICAgIGRpdiwKKyAgICAgIHBkZlBhZ2UKKyAgICB9ID0gdGhpczsKKworICAgIGlmICghcGRmUGFnZSkgeworICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDsKKworICAgICAgaWYgKHRoaXMubG9hZGluZ0ljb25EaXYpIHsKKyAgICAgICAgZGl2LnJlbW92ZUNoaWxkKHRoaXMubG9hZGluZ0ljb25EaXYpOworICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nSWNvbkRpdjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigicGRmUGFnZSBpcyBub3QgbG9hZGVkIikpOworICAgIH0KKworICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuUlVOTklORzsKKyAgICBjb25zdCBjYW52YXNXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgY2FudmFzV3JhcHBlci5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS53aWR0aDsKKyAgICBjYW52YXNXcmFwcGVyLnN0eWxlLmhlaWdodCA9IGRpdi5zdHlsZS5oZWlnaHQ7CisgICAgY2FudmFzV3JhcHBlci5jbGFzc0xpc3QuYWRkKCJjYW52YXNXcmFwcGVyIik7CisKKyAgICBpZiAodGhpcy5hbm5vdGF0aW9uTGF5ZXIgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2KSB7CisgICAgICBkaXYuaW5zZXJ0QmVmb3JlKGNhbnZhc1dyYXBwZXIsIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdik7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpdi5hcHBlbmRDaGlsZChjYW52YXNXcmFwcGVyKTsKKyAgICB9CisKKyAgICBsZXQgdGV4dExheWVyID0gbnVsbDsKKworICAgIGlmICh0aGlzLnRleHRMYXllck1vZGUgIT09IF91aV91dGlscy5UZXh0TGF5ZXJNb2RlLkRJU0FCTEUgJiYgdGhpcy50ZXh0TGF5ZXJGYWN0b3J5KSB7CisgICAgICBjb25zdCB0ZXh0TGF5ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgIHRleHRMYXllckRpdi5jbGFzc05hbWUgPSAidGV4dExheWVyIjsKKyAgICAgIHRleHRMYXllckRpdi5zdHlsZS53aWR0aCA9IGNhbnZhc1dyYXBwZXIuc3R5bGUud2lkdGg7CisgICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUuaGVpZ2h0ID0gY2FudmFzV3JhcHBlci5zdHlsZS5oZWlnaHQ7CisKKyAgICAgIGlmICh0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYpIHsKKyAgICAgICAgZGl2Lmluc2VydEJlZm9yZSh0ZXh0TGF5ZXJEaXYsIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdik7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGV4dExheWVyRGl2KTsKKyAgICAgIH0KKworICAgICAgdGV4dExheWVyID0gdGhpcy50ZXh0TGF5ZXJGYWN0b3J5LmNyZWF0ZVRleHRMYXllckJ1aWxkZXIodGV4dExheWVyRGl2LCB0aGlzLmlkIC0gMSwgdGhpcy52aWV3cG9ydCwgdGhpcy50ZXh0TGF5ZXJNb2RlID09PSBfdWlfdXRpbHMuVGV4dExheWVyTW9kZS5FTkFCTEVfRU5IQU5DRSwgdGhpcy5ldmVudEJ1cyk7CisgICAgfQorCisgICAgdGhpcy50ZXh0TGF5ZXIgPSB0ZXh0TGF5ZXI7CisgICAgbGV0IHJlbmRlckNvbnRpbnVlQ2FsbGJhY2sgPSBudWxsOworCisgICAgaWYgKHRoaXMucmVuZGVyaW5nUXVldWUpIHsKKyAgICAgIHJlbmRlckNvbnRpbnVlQ2FsbGJhY2sgPSBjb250ID0+IHsKKyAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmluZ1F1ZXVlLmlzSGlnaGVzdFByaW9yaXR5KHRoaXMpKSB7CisgICAgICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5QQVVTRUQ7CisKKyAgICAgICAgICB0aGlzLnJlc3VtZSA9ICgpID0+IHsKKyAgICAgICAgICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuUlVOTklORzsKKyAgICAgICAgICAgIGNvbnQoKTsKKyAgICAgICAgICB9OworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29udCgpOworICAgICAgfTsKKyAgICB9CisKKyAgICBjb25zdCBmaW5pc2hQYWludFRhc2sgPSBhc3luYyBlcnJvciA9PiB7CisgICAgICBpZiAocGFpbnRUYXNrID09PSB0aGlzLnBhaW50VGFzaykgeworICAgICAgICB0aGlzLnBhaW50VGFzayA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIF9wZGYuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKSB7CisgICAgICAgIHRoaXMuZXJyb3IgPSBudWxsOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ7CisKKyAgICAgIGlmICh0aGlzLmxvYWRpbmdJY29uRGl2KSB7CisgICAgICAgIGRpdi5yZW1vdmVDaGlsZCh0aGlzLmxvYWRpbmdJY29uRGl2KTsKKyAgICAgICAgZGVsZXRlIHRoaXMubG9hZGluZ0ljb25EaXY7CisgICAgICB9CisKKyAgICAgIHRoaXMuX3Jlc2V0Wm9vbUxheWVyKHRydWUpOworCisgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CisgICAgICB0aGlzLnN0YXRzID0gcGRmUGFnZS5zdGF0czsKKyAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInBhZ2VyZW5kZXJlZCIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkLAorICAgICAgICBjc3NUcmFuc2Zvcm06IGZhbHNlLAorICAgICAgICB0aW1lc3RhbXA6IHBlcmZvcm1hbmNlLm5vdygpCisgICAgICB9KTsKKworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgIHRocm93IGVycm9yOworICAgICAgfQorICAgIH07CisKKyAgICBjb25zdCBwYWludFRhc2sgPSB0aGlzLnJlbmRlcmVyID09PSBfdWlfdXRpbHMuUmVuZGVyZXJUeXBlLlNWRyA/IHRoaXMucGFpbnRPblN2ZyhjYW52YXNXcmFwcGVyKSA6IHRoaXMucGFpbnRPbkNhbnZhcyhjYW52YXNXcmFwcGVyKTsKKyAgICBwYWludFRhc2sub25SZW5kZXJDb250aW51ZSA9IHJlbmRlckNvbnRpbnVlQ2FsbGJhY2s7CisgICAgdGhpcy5wYWludFRhc2sgPSBwYWludFRhc2s7CisgICAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHBhaW50VGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGZpbmlzaFBhaW50VGFzayhudWxsKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKHRleHRMYXllcikgeworICAgICAgICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gcGRmUGFnZS5zdHJlYW1UZXh0Q29udGVudCh7CisgICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgICAgdGV4dExheWVyLnNldFRleHRDb250ZW50U3RyZWFtKHJlYWRhYmxlU3RyZWFtKTsKKyAgICAgICAgICB0ZXh0TGF5ZXIucmVuZGVyKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgIHJldHVybiBmaW5pc2hQYWludFRhc2socmVhc29uKTsKKyAgICB9KTsKKworICAgIGlmICh0aGlzLmFubm90YXRpb25MYXllckZhY3RvcnkpIHsKKyAgICAgIGlmICghdGhpcy5hbm5vdGF0aW9uTGF5ZXIpIHsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSB0aGlzLmFubm90YXRpb25MYXllckZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlcihkaXYsIHBkZlBhZ2UsIHRoaXMuX2Fubm90YXRpb25TdG9yYWdlLCB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCwgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLCB0aGlzLmwxMG4pOworICAgICAgfQorCisgICAgICB0aGlzLl9yZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKTsKKyAgICB9CisKKyAgICBkaXYuc2V0QXR0cmlidXRlKCJkYXRhLWxvYWRlZCIsIHRydWUpOworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInBhZ2VyZW5kZXIiLCB7CisgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkCisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7CisgIH0KKworICBwYWludE9uQ2FudmFzKGNhbnZhc1dyYXBwZXIpIHsKKyAgICBjb25zdCByZW5kZXJDYXBhYmlsaXR5ID0gKDAsIF9wZGYuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgY29uc3QgcmVzdWx0ID0geworICAgICAgcHJvbWlzZTogcmVuZGVyQ2FwYWJpbGl0eS5wcm9taXNlLAorCisgICAgICBvblJlbmRlckNvbnRpbnVlKGNvbnQpIHsKKyAgICAgICAgY29udCgpOworICAgICAgfSwKKworICAgICAgY2FuY2VsKCkgeworICAgICAgICByZW5kZXJUYXNrLmNhbmNlbCgpOworICAgICAgfQorCisgICAgfTsKKyAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQ7CisgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CisgICAgdGhpcy5sMTBuLmdldCgicGFnZV9jYW52YXMiLCB7CisgICAgICBwYWdlOiB0aGlzLmlkCisgICAgfSwgIlBhZ2Uge3twYWdlfX0iKS50aGVuKG1zZyA9PiB7CisgICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgbXNnKTsKKyAgICB9KTsKKyAgICBjYW52YXMuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAiaGlkZGVuIik7CisgICAgbGV0IGlzQ2FudmFzSGlkZGVuID0gdHJ1ZTsKKworICAgIGNvbnN0IHNob3dDYW52YXMgPSBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoaXNDYW52YXNIaWRkZW4pIHsKKyAgICAgICAgY2FudmFzLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIik7CisgICAgICAgIGlzQ2FudmFzSGlkZGVuID0gZmFsc2U7CisgICAgICB9CisgICAgfTsKKworICAgIGNhbnZhc1dyYXBwZXIuYXBwZW5kQ2hpbGQoY2FudmFzKTsKKyAgICB0aGlzLmNhbnZhcyA9IGNhbnZhczsKKyAgICBjYW52YXMubW96T3BhcXVlID0gdHJ1ZTsKKyAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CisgICAgICBhbHBoYTogZmFsc2UKKyAgICB9KTsKKyAgICBjb25zdCBvdXRwdXRTY2FsZSA9ICgwLCBfdWlfdXRpbHMuZ2V0T3V0cHV0U2NhbGUpKGN0eCk7CisgICAgdGhpcy5vdXRwdXRTY2FsZSA9IG91dHB1dFNjYWxlOworCisgICAgaWYgKHRoaXMudXNlT25seUNzc1pvb20pIHsKKyAgICAgIGNvbnN0IGFjdHVhbFNpemVWaWV3cG9ydCA9IHZpZXdwb3J0LmNsb25lKHsKKyAgICAgICAgc2NhbGU6IF91aV91dGlscy5DU1NfVU5JVFMKKyAgICAgIH0pOworICAgICAgb3V0cHV0U2NhbGUuc3ggKj0gYWN0dWFsU2l6ZVZpZXdwb3J0LndpZHRoIC8gdmlld3BvcnQud2lkdGg7CisgICAgICBvdXRwdXRTY2FsZS5zeSAqPSBhY3R1YWxTaXplVmlld3BvcnQuaGVpZ2h0IC8gdmlld3BvcnQuaGVpZ2h0OworICAgICAgb3V0cHV0U2NhbGUuc2NhbGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5tYXhDYW52YXNQaXhlbHMgPiAwKSB7CisgICAgICBjb25zdCBwaXhlbHNJblZpZXdwb3J0ID0gdmlld3BvcnQud2lkdGggKiB2aWV3cG9ydC5oZWlnaHQ7CisgICAgICBjb25zdCBtYXhTY2FsZSA9IE1hdGguc3FydCh0aGlzLm1heENhbnZhc1BpeGVscyAvIHBpeGVsc0luVmlld3BvcnQpOworCisgICAgICBpZiAob3V0cHV0U2NhbGUuc3ggPiBtYXhTY2FsZSB8fCBvdXRwdXRTY2FsZS5zeSA+IG1heFNjYWxlKSB7CisgICAgICAgIG91dHB1dFNjYWxlLnN4ID0gbWF4U2NhbGU7CisgICAgICAgIG91dHB1dFNjYWxlLnN5ID0gbWF4U2NhbGU7CisgICAgICAgIG91dHB1dFNjYWxlLnNjYWxlZCA9IHRydWU7CisgICAgICAgIHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5oYXNSZXN0cmljdGVkU2NhbGluZyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHNmeCA9ICgwLCBfdWlfdXRpbHMuYXBwcm94aW1hdGVGcmFjdGlvbikob3V0cHV0U2NhbGUuc3gpOworICAgIGNvbnN0IHNmeSA9ICgwLCBfdWlfdXRpbHMuYXBwcm94aW1hdGVGcmFjdGlvbikob3V0cHV0U2NhbGUuc3kpOworICAgIGNhbnZhcy53aWR0aCA9ICgwLCBfdWlfdXRpbHMucm91bmRUb0RpdmlkZSkodmlld3BvcnQud2lkdGggKiBvdXRwdXRTY2FsZS5zeCwgc2Z4WzBdKTsKKyAgICBjYW52YXMuaGVpZ2h0ID0gKDAsIF91aV91dGlscy5yb3VuZFRvRGl2aWRlKSh2aWV3cG9ydC5oZWlnaHQgKiBvdXRwdXRTY2FsZS5zeSwgc2Z5WzBdKTsKKyAgICBjYW52YXMuc3R5bGUud2lkdGggPSAoMCwgX3VpX3V0aWxzLnJvdW5kVG9EaXZpZGUpKHZpZXdwb3J0LndpZHRoLCBzZnhbMV0pICsgInB4IjsKKyAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gKDAsIF91aV91dGlscy5yb3VuZFRvRGl2aWRlKSh2aWV3cG9ydC5oZWlnaHQsIHNmeVsxXSkgKyAicHgiOworICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLnNldChjYW52YXMsIHZpZXdwb3J0KTsKKyAgICBjb25zdCB0cmFuc2Zvcm0gPSAhb3V0cHV0U2NhbGUuc2NhbGVkID8gbnVsbCA6IFtvdXRwdXRTY2FsZS5zeCwgMCwgMCwgb3V0cHV0U2NhbGUuc3ksIDAsIDBdOworICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7CisgICAgICBjYW52YXNDb250ZXh0OiBjdHgsCisgICAgICB0cmFuc2Zvcm0sCisgICAgICB2aWV3cG9ydDogdGhpcy52aWV3cG9ydCwKKyAgICAgIGVuYWJsZVdlYkdMOiB0aGlzLmVuYWJsZVdlYkdMLAorICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTogdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZQorICAgIH07CisgICAgY29uc3QgcmVuZGVyVGFzayA9IHRoaXMucGRmUGFnZS5yZW5kZXIocmVuZGVyQ29udGV4dCk7CisKKyAgICByZW5kZXJUYXNrLm9uQ29udGludWUgPSBmdW5jdGlvbiAoY29udCkgeworICAgICAgc2hvd0NhbnZhcygpOworCisgICAgICBpZiAocmVzdWx0Lm9uUmVuZGVyQ29udGludWUpIHsKKyAgICAgICAgcmVzdWx0Lm9uUmVuZGVyQ29udGludWUoY29udCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250KCk7CisgICAgICB9CisgICAgfTsKKworICAgIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIHNob3dDYW52YXMoKTsKKyAgICAgIHJlbmRlckNhcGFiaWxpdHkucmVzb2x2ZSh1bmRlZmluZWQpOworICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgeworICAgICAgc2hvd0NhbnZhcygpOworICAgICAgcmVuZGVyQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwYWludE9uU3ZnKHdyYXBwZXIpIHsKKyAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7CisKKyAgICBjb25zdCBlbnN1cmVOb3RDYW5jZWxsZWQgPSAoKSA9PiB7CisgICAgICBpZiAoY2FuY2VsbGVkKSB7CisgICAgICAgIHRocm93IG5ldyBfcGRmLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbihgUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSAke3RoaXMuaWR9YCwgInN2ZyIpOworICAgICAgfQorICAgIH07CisKKyAgICBjb25zdCBwZGZQYWdlID0gdGhpcy5wZGZQYWdlOworICAgIGNvbnN0IGFjdHVhbFNpemVWaWV3cG9ydCA9IHRoaXMudmlld3BvcnQuY2xvbmUoeworICAgICAgc2NhbGU6IF91aV91dGlscy5DU1NfVU5JVFMKKyAgICB9KTsKKyAgICBjb25zdCBwcm9taXNlID0gcGRmUGFnZS5nZXRPcGVyYXRvckxpc3QoKS50aGVuKG9wTGlzdCA9PiB7CisgICAgICBlbnN1cmVOb3RDYW5jZWxsZWQoKTsKKyAgICAgIGNvbnN0IHN2Z0dmeCA9IG5ldyBfcGRmLlNWR0dyYXBoaWNzKHBkZlBhZ2UuY29tbW9uT2JqcywgcGRmUGFnZS5vYmpzKTsKKyAgICAgIHJldHVybiBzdmdHZnguZ2V0U1ZHKG9wTGlzdCwgYWN0dWFsU2l6ZVZpZXdwb3J0KS50aGVuKHN2ZyA9PiB7CisgICAgICAgIGVuc3VyZU5vdENhbmNlbGxlZCgpOworICAgICAgICB0aGlzLnN2ZyA9IHN2ZzsKKyAgICAgICAgdGhpcy5wYWludGVkVmlld3BvcnRNYXAuc2V0KHN2ZywgYWN0dWFsU2l6ZVZpZXdwb3J0KTsKKyAgICAgICAgc3ZnLnN0eWxlLndpZHRoID0gd3JhcHBlci5zdHlsZS53aWR0aDsKKyAgICAgICAgc3ZnLnN0eWxlLmhlaWdodCA9IHdyYXBwZXIuc3R5bGUuaGVpZ2h0OworICAgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOworICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHN2Zyk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgICByZXR1cm4geworICAgICAgcHJvbWlzZSwKKworICAgICAgb25SZW5kZXJDb250aW51ZShjb250KSB7CisgICAgICAgIGNvbnQoKTsKKyAgICAgIH0sCisKKyAgICAgIGNhbmNlbCgpIHsKKyAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgIH07CisgIH0KKworICBzZXRQYWdlTGFiZWwobGFiZWwpIHsKKyAgICB0aGlzLnBhZ2VMYWJlbCA9IHR5cGVvZiBsYWJlbCA9PT0gInN0cmluZyIgPyBsYWJlbCA6IG51bGw7CisKKyAgICBpZiAodGhpcy5wYWdlTGFiZWwgIT09IG51bGwpIHsKKyAgICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZSgiZGF0YS1wYWdlLWxhYmVsIiwgdGhpcy5wYWdlTGFiZWwpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmRpdi5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtcGFnZS1sYWJlbCIpOworICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuUERGUGFnZVZpZXcgPSBQREZQYWdlVmlldzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9wcmVzZW50YXRpb25fbW9kZS5qcyBiL2xpYi93ZWIvcGRmX3ByZXNlbnRhdGlvbl9tb2RlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmVjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3BkZl9wcmVzZW50YXRpb25fbW9kZS5qcwpAQCAtMCwwICsxLDQyNCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGUHJlc2VudGF0aW9uTW9kZSA9IHZvaWQgMDsKKwordmFyIF91aV91dGlscyA9IHJlcXVpcmUoIi4vdWlfdXRpbHMuanMiKTsKKworY29uc3QgREVMQVlfQkVGT1JFX1JFU0VUVElOR19TV0lUQ0hfSU5fUFJPR1JFU1MgPSAxNTAwOworY29uc3QgREVMQVlfQkVGT1JFX0hJRElOR19DT05UUk9MUyA9IDMwMDA7Citjb25zdCBBQ1RJVkVfU0VMRUNUT1IgPSAicGRmUHJlc2VudGF0aW9uTW9kZSI7Citjb25zdCBDT05UUk9MU19TRUxFQ1RPUiA9ICJwZGZQcmVzZW50YXRpb25Nb2RlQ29udHJvbHMiOworY29uc3QgTU9VU0VfU0NST0xMX0NPT0xET1dOX1RJTUUgPSA1MDsKK2NvbnN0IFBBR0VfU1dJVENIX1RIUkVTSE9MRCA9IDAuMTsKK2NvbnN0IFNXSVBFX01JTl9ESVNUQU5DRV9USFJFU0hPTEQgPSA1MDsKK2NvbnN0IFNXSVBFX0FOR0xFX1RIUkVTSE9MRCA9IE1hdGguUEkgLyA2OworCitjbGFzcyBQREZQcmVzZW50YXRpb25Nb2RlIHsKKyAgY29uc3RydWN0b3IoeworICAgIGNvbnRhaW5lciwKKyAgICBwZGZWaWV3ZXIsCisgICAgZXZlbnRCdXMsCisgICAgY29udGV4dE1lbnVJdGVtcyA9IG51bGwKKyAgfSkgeworICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIHRoaXMucGRmVmlld2VyID0gcGRmVmlld2VyOworICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1czsKKyAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOworICAgIHRoaXMuYXJncyA9IG51bGw7CisgICAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTsKKyAgICB0aGlzLm1vdXNlU2Nyb2xsVGltZVN0YW1wID0gMDsKKyAgICB0aGlzLm1vdXNlU2Nyb2xsRGVsdGEgPSAwOworICAgIHRoaXMudG91Y2hTd2lwZVN0YXRlID0gbnVsbDsKKworICAgIGlmIChjb250ZXh0TWVudUl0ZW1zKSB7CisgICAgICBjb250ZXh0TWVudUl0ZW1zLmNvbnRleHRGaXJzdFBhZ2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CisgICAgICAgIHRoaXMuY29udGV4dE1lbnVPcGVuID0gZmFsc2U7CisgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImZpcnN0cGFnZSIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGNvbnRleHRNZW51SXRlbXMuY29udGV4dExhc3RQYWdlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geworICAgICAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlOworICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJsYXN0cGFnZSIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGNvbnRleHRNZW51SXRlbXMuY29udGV4dFBhZ2VSb3RhdGVDdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKKyAgICAgICAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTsKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgicm90YXRlY3ciLCB7CisgICAgICAgICAgc291cmNlOiB0aGlzCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICBjb250ZXh0TWVudUl0ZW1zLmNvbnRleHRQYWdlUm90YXRlQ2N3LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geworICAgICAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlOworICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJyb3RhdGVjY3ciLCB7CisgICAgICAgICAgc291cmNlOiB0aGlzCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorICB9CisKKyAgcmVxdWVzdCgpIHsKKyAgICBpZiAodGhpcy5zd2l0Y2hJblByb2dyZXNzIHx8IHRoaXMuYWN0aXZlIHx8ICF0aGlzLnBkZlZpZXdlci5wYWdlc0NvdW50KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhpcy5fYWRkRnVsbHNjcmVlbkNoYW5nZUxpc3RlbmVycygpOworCisgICAgdGhpcy5fc2V0U3dpdGNoSW5Qcm9ncmVzcygpOworCisgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoKTsKKworICAgIGlmICh0aGlzLmNvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbikgeworICAgICAgdGhpcy5jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4oKTsKKyAgICB9IGVsc2UgaWYgKHRoaXMuY29udGFpbmVyLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7CisgICAgICB0aGlzLmNvbnRhaW5lci5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpOworICAgIH0gZWxzZSBpZiAodGhpcy5jb250YWluZXIud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4pIHsKKyAgICAgIHRoaXMuY29udGFpbmVyLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKEVsZW1lbnQuQUxMT1dfS0VZQk9BUkRfSU5QVVQpOworICAgIH0gZWxzZSBpZiAodGhpcy5jb250YWluZXIubXNSZXF1ZXN0RnVsbHNjcmVlbikgeworICAgICAgdGhpcy5jb250YWluZXIubXNSZXF1ZXN0RnVsbHNjcmVlbigpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhpcy5hcmdzID0geworICAgICAgcGFnZTogdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXIsCisgICAgICBwcmV2aW91c1NjYWxlOiB0aGlzLnBkZlZpZXdlci5jdXJyZW50U2NhbGVWYWx1ZQorICAgIH07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBfbW91c2VXaGVlbChldnQpIHsKKyAgICBpZiAoIXRoaXMuYWN0aXZlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgICAgY29uc3QgZGVsdGEgPSAoMCwgX3VpX3V0aWxzLm5vcm1hbGl6ZVdoZWVsRXZlbnREZWx0YSkoZXZ0KTsKKyAgICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgIGNvbnN0IHN0b3JlZFRpbWUgPSB0aGlzLm1vdXNlU2Nyb2xsVGltZVN0YW1wOworCisgICAgaWYgKGN1cnJlbnRUaW1lID4gc3RvcmVkVGltZSAmJiBjdXJyZW50VGltZSAtIHN0b3JlZFRpbWUgPCBNT1VTRV9TQ1JPTExfQ09PTERPV05fVElNRSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLm1vdXNlU2Nyb2xsRGVsdGEgPiAwICYmIGRlbHRhIDwgMCB8fCB0aGlzLm1vdXNlU2Nyb2xsRGVsdGEgPCAwICYmIGRlbHRhID4gMCkgeworICAgICAgdGhpcy5fcmVzZXRNb3VzZVNjcm9sbFN0YXRlKCk7CisgICAgfQorCisgICAgdGhpcy5tb3VzZVNjcm9sbERlbHRhICs9IGRlbHRhOworCisgICAgaWYgKE1hdGguYWJzKHRoaXMubW91c2VTY3JvbGxEZWx0YSkgPj0gUEFHRV9TV0lUQ0hfVEhSRVNIT0xEKSB7CisgICAgICBjb25zdCB0b3RhbERlbHRhID0gdGhpcy5tb3VzZVNjcm9sbERlbHRhOworCisgICAgICB0aGlzLl9yZXNldE1vdXNlU2Nyb2xsU3RhdGUoKTsKKworICAgICAgY29uc3Qgc3VjY2VzcyA9IHRvdGFsRGVsdGEgPiAwID8gdGhpcy5fZ29Ub1ByZXZpb3VzUGFnZSgpIDogdGhpcy5fZ29Ub05leHRQYWdlKCk7CisKKyAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIHRoaXMubW91c2VTY3JvbGxUaW1lU3RhbXAgPSBjdXJyZW50VGltZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBnZXQgaXNGdWxsc2NyZWVuKCkgeworICAgIHJldHVybiAhIShkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC5tb3pGdWxsU2NyZWVuIHx8IGRvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbiB8fCBkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50KTsKKyAgfQorCisgIF9nb1RvUHJldmlvdXNQYWdlKCkgeworICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlcjsKKworICAgIGlmIChwYWdlIDw9IDEpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciA9IHBhZ2UgLSAxOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgX2dvVG9OZXh0UGFnZSgpIHsKKyAgICBjb25zdCBwYWdlID0gdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXI7CisKKyAgICBpZiAocGFnZSA+PSB0aGlzLnBkZlZpZXdlci5wYWdlc0NvdW50KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXIgPSBwYWdlICsgMTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIF9ub3RpZnlTdGF0ZUNoYW5nZSgpIHsKKyAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwcmVzZW50YXRpb25tb2RlY2hhbmdlZCIsIHsKKyAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmUsCisgICAgICBzd2l0Y2hJblByb2dyZXNzOiAhIXRoaXMuc3dpdGNoSW5Qcm9ncmVzcworICAgIH0pOworICB9CisKKyAgX3NldFN3aXRjaEluUHJvZ3Jlc3MoKSB7CisgICAgaWYgKHRoaXMuc3dpdGNoSW5Qcm9ncmVzcykgeworICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3dpdGNoSW5Qcm9ncmVzcyk7CisgICAgfQorCisgICAgdGhpcy5zd2l0Y2hJblByb2dyZXNzID0gc2V0VGltZW91dCgoKSA9PiB7CisgICAgICB0aGlzLl9yZW1vdmVGdWxsc2NyZWVuQ2hhbmdlTGlzdGVuZXJzKCk7CisKKyAgICAgIGRlbGV0ZSB0aGlzLnN3aXRjaEluUHJvZ3Jlc3M7CisKKyAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKCk7CisgICAgfSwgREVMQVlfQkVGT1JFX1JFU0VUVElOR19TV0lUQ0hfSU5fUFJPR1JFU1MpOworICB9CisKKyAgX3Jlc2V0U3dpdGNoSW5Qcm9ncmVzcygpIHsKKyAgICBpZiAodGhpcy5zd2l0Y2hJblByb2dyZXNzKSB7CisgICAgICBjbGVhclRpbWVvdXQodGhpcy5zd2l0Y2hJblByb2dyZXNzKTsKKyAgICAgIGRlbGV0ZSB0aGlzLnN3aXRjaEluUHJvZ3Jlc3M7CisgICAgfQorICB9CisKKyAgX2VudGVyKCkgeworICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKKworICAgIHRoaXMuX3Jlc2V0U3dpdGNoSW5Qcm9ncmVzcygpOworCisgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoKTsKKworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoQUNUSVZFX1NFTEVDVE9SKTsKKyAgICBzZXRUaW1lb3V0KCgpID0+IHsKKyAgICAgIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5hcmdzLnBhZ2U7CisgICAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50U2NhbGVWYWx1ZSA9ICJwYWdlLWZpdCI7CisgICAgfSwgMCk7CisKKyAgICB0aGlzLl9hZGRXaW5kb3dMaXN0ZW5lcnMoKTsKKworICAgIHRoaXMuX3Nob3dDb250cm9scygpOworCisgICAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTsKKyAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImNvbnRleHRtZW51IiwgInZpZXdlckNvbnRleHRNZW51Iik7CisgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOworICB9CisKKyAgX2V4aXQoKSB7CisgICAgY29uc3QgcGFnZSA9IHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyOworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoQUNUSVZFX1NFTEVDVE9SKTsKKyAgICBzZXRUaW1lb3V0KCgpID0+IHsKKyAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CisKKyAgICAgIHRoaXMuX3JlbW92ZUZ1bGxzY3JlZW5DaGFuZ2VMaXN0ZW5lcnMoKTsKKworICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoKTsKKworICAgICAgdGhpcy5wZGZWaWV3ZXIuY3VycmVudFNjYWxlVmFsdWUgPSB0aGlzLmFyZ3MucHJldmlvdXNTY2FsZTsKKyAgICAgIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyID0gcGFnZTsKKyAgICAgIHRoaXMuYXJncyA9IG51bGw7CisgICAgfSwgMCk7CisKKyAgICB0aGlzLl9yZW1vdmVXaW5kb3dMaXN0ZW5lcnMoKTsKKworICAgIHRoaXMuX2hpZGVDb250cm9scygpOworCisgICAgdGhpcy5fcmVzZXRNb3VzZVNjcm9sbFN0YXRlKCk7CisKKyAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoImNvbnRleHRtZW51Iik7CisgICAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTsKKyAgfQorCisgIF9tb3VzZURvd24oZXZ0KSB7CisgICAgaWYgKHRoaXMuY29udGV4dE1lbnVPcGVuKSB7CisgICAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlOworICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGV2dC5idXR0b24gPT09IDApIHsKKyAgICAgIGNvbnN0IGlzSW50ZXJuYWxMaW5rID0gZXZ0LnRhcmdldC5ocmVmICYmIGV2dC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJpbnRlcm5hbExpbmsiKTsKKworICAgICAgaWYgKCFpc0ludGVybmFsTGluaykgeworICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKKworICAgICAgICBpZiAoZXZ0LnNoaWZ0S2V5KSB7CisgICAgICAgICAgdGhpcy5fZ29Ub1ByZXZpb3VzUGFnZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuX2dvVG9OZXh0UGFnZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgX2NvbnRleHRNZW51KCkgeworICAgIHRoaXMuY29udGV4dE1lbnVPcGVuID0gdHJ1ZTsKKyAgfQorCisgIF9zaG93Q29udHJvbHMoKSB7CisgICAgaWYgKHRoaXMuY29udHJvbHNUaW1lb3V0KSB7CisgICAgICBjbGVhclRpbWVvdXQodGhpcy5jb250cm9sc1RpbWVvdXQpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKENPTlRST0xTX1NFTEVDVE9SKTsKKyAgICB9CisKKyAgICB0aGlzLmNvbnRyb2xzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geworICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShDT05UUk9MU19TRUxFQ1RPUik7CisgICAgICBkZWxldGUgdGhpcy5jb250cm9sc1RpbWVvdXQ7CisgICAgfSwgREVMQVlfQkVGT1JFX0hJRElOR19DT05UUk9MUyk7CisgIH0KKworICBfaGlkZUNvbnRyb2xzKCkgeworICAgIGlmICghdGhpcy5jb250cm9sc1RpbWVvdXQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjbGVhclRpbWVvdXQodGhpcy5jb250cm9sc1RpbWVvdXQpOworICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoQ09OVFJPTFNfU0VMRUNUT1IpOworICAgIGRlbGV0ZSB0aGlzLmNvbnRyb2xzVGltZW91dDsKKyAgfQorCisgIF9yZXNldE1vdXNlU2Nyb2xsU3RhdGUoKSB7CisgICAgdGhpcy5tb3VzZVNjcm9sbFRpbWVTdGFtcCA9IDA7CisgICAgdGhpcy5tb3VzZVNjcm9sbERlbHRhID0gMDsKKyAgfQorCisgIF90b3VjaFN3aXBlKGV2dCkgeworICAgIGlmICghdGhpcy5hY3RpdmUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZXZ0LnRvdWNoZXMubGVuZ3RoID4gMSkgeworICAgICAgdGhpcy50b3VjaFN3aXBlU3RhdGUgPSBudWxsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoZXZ0LnR5cGUpIHsKKyAgICAgIGNhc2UgInRvdWNoc3RhcnQiOgorICAgICAgICB0aGlzLnRvdWNoU3dpcGVTdGF0ZSA9IHsKKyAgICAgICAgICBzdGFydFg6IGV2dC50b3VjaGVzWzBdLnBhZ2VYLAorICAgICAgICAgIHN0YXJ0WTogZXZ0LnRvdWNoZXNbMF0ucGFnZVksCisgICAgICAgICAgZW5kWDogZXZ0LnRvdWNoZXNbMF0ucGFnZVgsCisgICAgICAgICAgZW5kWTogZXZ0LnRvdWNoZXNbMF0ucGFnZVkKKyAgICAgICAgfTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgInRvdWNobW92ZSI6CisgICAgICAgIGlmICh0aGlzLnRvdWNoU3dpcGVTdGF0ZSA9PT0gbnVsbCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudG91Y2hTd2lwZVN0YXRlLmVuZFggPSBldnQudG91Y2hlc1swXS5wYWdlWDsKKyAgICAgICAgdGhpcy50b3VjaFN3aXBlU3RhdGUuZW5kWSA9IGV2dC50b3VjaGVzWzBdLnBhZ2VZOworICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgInRvdWNoZW5kIjoKKyAgICAgICAgaWYgKHRoaXMudG91Y2hTd2lwZVN0YXRlID09PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbGV0IGRlbHRhID0gMDsKKyAgICAgICAgY29uc3QgZHggPSB0aGlzLnRvdWNoU3dpcGVTdGF0ZS5lbmRYIC0gdGhpcy50b3VjaFN3aXBlU3RhdGUuc3RhcnRYOworICAgICAgICBjb25zdCBkeSA9IHRoaXMudG91Y2hTd2lwZVN0YXRlLmVuZFkgLSB0aGlzLnRvdWNoU3dpcGVTdGF0ZS5zdGFydFk7CisgICAgICAgIGNvbnN0IGFic0FuZ2xlID0gTWF0aC5hYnMoTWF0aC5hdGFuMihkeSwgZHgpKTsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZHgpID4gU1dJUEVfTUlOX0RJU1RBTkNFX1RIUkVTSE9MRCAmJiAoYWJzQW5nbGUgPD0gU1dJUEVfQU5HTEVfVEhSRVNIT0xEIHx8IGFic0FuZ2xlID49IE1hdGguUEkgLSBTV0lQRV9BTkdMRV9USFJFU0hPTEQpKSB7CisgICAgICAgICAgZGVsdGEgPSBkeDsKKyAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhkeSkgPiBTV0lQRV9NSU5fRElTVEFOQ0VfVEhSRVNIT0xEICYmIE1hdGguYWJzKGFic0FuZ2xlIC0gTWF0aC5QSSAvIDIpIDw9IFNXSVBFX0FOR0xFX1RIUkVTSE9MRCkgeworICAgICAgICAgIGRlbHRhID0gZHk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgdGhpcy5fZ29Ub1ByZXZpb3VzUGFnZSgpOworICAgICAgICB9IGVsc2UgaWYgKGRlbHRhIDwgMCkgeworICAgICAgICAgIHRoaXMuX2dvVG9OZXh0UGFnZSgpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgX2FkZFdpbmRvd0xpc3RlbmVycygpIHsKKyAgICB0aGlzLnNob3dDb250cm9sc0JpbmQgPSB0aGlzLl9zaG93Q29udHJvbHMuYmluZCh0aGlzKTsKKyAgICB0aGlzLm1vdXNlRG93bkJpbmQgPSB0aGlzLl9tb3VzZURvd24uYmluZCh0aGlzKTsKKyAgICB0aGlzLm1vdXNlV2hlZWxCaW5kID0gdGhpcy5fbW91c2VXaGVlbC5iaW5kKHRoaXMpOworICAgIHRoaXMucmVzZXRNb3VzZVNjcm9sbFN0YXRlQmluZCA9IHRoaXMuX3Jlc2V0TW91c2VTY3JvbGxTdGF0ZS5iaW5kKHRoaXMpOworICAgIHRoaXMuY29udGV4dE1lbnVCaW5kID0gdGhpcy5fY29udGV4dE1lbnUuYmluZCh0aGlzKTsKKyAgICB0aGlzLnRvdWNoU3dpcGVCaW5kID0gdGhpcy5fdG91Y2hTd2lwZS5iaW5kKHRoaXMpOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLnNob3dDb250cm9sc0JpbmQpOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLm1vdXNlRG93bkJpbmQpOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsIHRoaXMubW91c2VXaGVlbEJpbmQsIHsKKyAgICAgIHBhc3NpdmU6IGZhbHNlCisgICAgfSk7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLnJlc2V0TW91c2VTY3JvbGxTdGF0ZUJpbmQpOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsIHRoaXMuY29udGV4dE1lbnVCaW5kKTsKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMudG91Y2hTd2lwZUJpbmQpOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLCB0aGlzLnRvdWNoU3dpcGVCaW5kKTsKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLnRvdWNoU3dpcGVCaW5kKTsKKyAgfQorCisgIF9yZW1vdmVXaW5kb3dMaXN0ZW5lcnMoKSB7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuc2hvd0NvbnRyb2xzQmluZCk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIHRoaXMubW91c2VEb3duQmluZCk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIiwgdGhpcy5tb3VzZVdoZWVsQmluZCwgeworICAgICAgcGFzc2l2ZTogZmFsc2UKKyAgICB9KTsKKyAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMucmVzZXRNb3VzZVNjcm9sbFN0YXRlQmluZCk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgdGhpcy5jb250ZXh0TWVudUJpbmQpOworICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy50b3VjaFN3aXBlQmluZCk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsIHRoaXMudG91Y2hTd2lwZUJpbmQpOworICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMudG91Y2hTd2lwZUJpbmQpOworICAgIGRlbGV0ZSB0aGlzLnNob3dDb250cm9sc0JpbmQ7CisgICAgZGVsZXRlIHRoaXMubW91c2VEb3duQmluZDsKKyAgICBkZWxldGUgdGhpcy5tb3VzZVdoZWVsQmluZDsKKyAgICBkZWxldGUgdGhpcy5yZXNldE1vdXNlU2Nyb2xsU3RhdGVCaW5kOworICAgIGRlbGV0ZSB0aGlzLmNvbnRleHRNZW51QmluZDsKKyAgICBkZWxldGUgdGhpcy50b3VjaFN3aXBlQmluZDsKKyAgfQorCisgIF9mdWxsc2NyZWVuQ2hhbmdlKCkgeworICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikgeworICAgICAgdGhpcy5fZW50ZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fZXhpdCgpOworICAgIH0KKyAgfQorCisgIF9hZGRGdWxsc2NyZWVuQ2hhbmdlTGlzdGVuZXJzKCkgeworICAgIHRoaXMuZnVsbHNjcmVlbkNoYW5nZUJpbmQgPSB0aGlzLl9mdWxsc2NyZWVuQ2hhbmdlLmJpbmQodGhpcyk7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCB0aGlzLmZ1bGxzY3JlZW5DaGFuZ2VCaW5kKTsKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW96ZnVsbHNjcmVlbmNoYW5nZSIsIHRoaXMuZnVsbHNjcmVlbkNoYW5nZUJpbmQpOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIiwgdGhpcy5mdWxsc2NyZWVuQ2hhbmdlQmluZCk7CisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIk1TRnVsbHNjcmVlbkNoYW5nZSIsIHRoaXMuZnVsbHNjcmVlbkNoYW5nZUJpbmQpOworICB9CisKKyAgX3JlbW92ZUZ1bGxzY3JlZW5DaGFuZ2VMaXN0ZW5lcnMoKSB7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCB0aGlzLmZ1bGxzY3JlZW5DaGFuZ2VCaW5kKTsKKyAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW96ZnVsbHNjcmVlbmNoYW5nZSIsIHRoaXMuZnVsbHNjcmVlbkNoYW5nZUJpbmQpOworICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIiwgdGhpcy5mdWxsc2NyZWVuQ2hhbmdlQmluZCk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIk1TRnVsbHNjcmVlbkNoYW5nZSIsIHRoaXMuZnVsbHNjcmVlbkNoYW5nZUJpbmQpOworICAgIGRlbGV0ZSB0aGlzLmZ1bGxzY3JlZW5DaGFuZ2VCaW5kOworICB9CisKK30KKworZXhwb3J0cy5QREZQcmVzZW50YXRpb25Nb2RlID0gUERGUHJlc2VudGF0aW9uTW9kZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9wcmludF9zZXJ2aWNlLmpzIGIvbGliL3dlYi9wZGZfcHJpbnRfc2VydmljZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzQ0ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9wZGZfcHJpbnRfc2VydmljZS5qcwpAQCAtMCwwICsxLDMxNiBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGUHJpbnRTZXJ2aWNlID0gUERGUHJpbnRTZXJ2aWNlOworCit2YXIgX3VpX3V0aWxzID0gcmVxdWlyZSgiLi91aV91dGlscy5qcyIpOworCit2YXIgX2FwcCA9IHJlcXVpcmUoIi4vYXBwLmpzIik7CisKK3ZhciBfdmlld2VyX2NvbXBhdGliaWxpdHkgPSByZXF1aXJlKCIuL3ZpZXdlcl9jb21wYXRpYmlsaXR5LmpzIik7CisKK2xldCBhY3RpdmVTZXJ2aWNlID0gbnVsbDsKK2xldCBvdmVybGF5TWFuYWdlciA9IG51bGw7CisKK2Z1bmN0aW9uIHJlbmRlclBhZ2UoYWN0aXZlU2VydmljZU9uRW50cnksIHBkZkRvY3VtZW50LCBwYWdlTnVtYmVyLCBzaXplLCBwcmludFJlc29sdXRpb24sIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UpIHsKKyAgY29uc3Qgc2NyYXRjaENhbnZhcyA9IGFjdGl2ZVNlcnZpY2Uuc2NyYXRjaENhbnZhczsKKyAgY29uc3QgUFJJTlRfVU5JVFMgPSBwcmludFJlc29sdXRpb24gLyA3Mi4wOworICBzY3JhdGNoQ2FudmFzLndpZHRoID0gTWF0aC5mbG9vcihzaXplLndpZHRoICogUFJJTlRfVU5JVFMpOworICBzY3JhdGNoQ2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3Ioc2l6ZS5oZWlnaHQgKiBQUklOVF9VTklUUyk7CisgIGNvbnN0IHdpZHRoID0gTWF0aC5mbG9vcihzaXplLndpZHRoICogX3VpX3V0aWxzLkNTU19VTklUUykgKyAicHgiOworICBjb25zdCBoZWlnaHQgPSBNYXRoLmZsb29yKHNpemUuaGVpZ2h0ICogX3VpX3V0aWxzLkNTU19VTklUUykgKyAicHgiOworICBjb25zdCBjdHggPSBzY3JhdGNoQ2FudmFzLmdldENvbnRleHQoIjJkIik7CisgIGN0eC5zYXZlKCk7CisgIGN0eC5maWxsU3R5bGUgPSAicmdiKDI1NSwgMjU1LCAyNTUpIjsKKyAgY3R4LmZpbGxSZWN0KDAsIDAsIHNjcmF0Y2hDYW52YXMud2lkdGgsIHNjcmF0Y2hDYW52YXMuaGVpZ2h0KTsKKyAgY3R4LnJlc3RvcmUoKTsKKyAgcmV0dXJuIHBkZkRvY3VtZW50LmdldFBhZ2UocGFnZU51bWJlcikudGhlbihmdW5jdGlvbiAocGRmUGFnZSkgeworICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7CisgICAgICBjYW52YXNDb250ZXh0OiBjdHgsCisgICAgICB0cmFuc2Zvcm06IFtQUklOVF9VTklUUywgMCwgMCwgUFJJTlRfVU5JVFMsIDAsIDBdLAorICAgICAgdmlld3BvcnQ6IHBkZlBhZ2UuZ2V0Vmlld3BvcnQoeworICAgICAgICBzY2FsZTogMSwKKyAgICAgICAgcm90YXRpb246IHNpemUucm90YXRpb24KKyAgICAgIH0pLAorICAgICAgaW50ZW50OiAicHJpbnQiLAorICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IHBkZkRvY3VtZW50LmFubm90YXRpb25TdG9yYWdlLAorICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZQorICAgIH07CisgICAgcmV0dXJuIHBkZlBhZ2UucmVuZGVyKHJlbmRlckNvbnRleHQpLnByb21pc2U7CisgIH0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB7CisgICAgICB3aWR0aCwKKyAgICAgIGhlaWdodAorICAgIH07CisgIH0pOworfQorCitmdW5jdGlvbiBQREZQcmludFNlcnZpY2UocGRmRG9jdW1lbnQsIHBhZ2VzT3ZlcnZpZXcsIHByaW50Q29udGFpbmVyLCBwcmludFJlc29sdXRpb24sIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBudWxsLCBsMTBuKSB7CisgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDsKKyAgdGhpcy5wYWdlc092ZXJ2aWV3ID0gcGFnZXNPdmVydmlldzsKKyAgdGhpcy5wcmludENvbnRhaW5lciA9IHByaW50Q29udGFpbmVyOworICB0aGlzLl9wcmludFJlc29sdXRpb24gPSBwcmludFJlc29sdXRpb24gfHwgMTUwOworICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSB8fCBwZGZEb2N1bWVudC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTsKKyAgdGhpcy5sMTBuID0gbDEwbiB8fCBfdWlfdXRpbHMuTnVsbEwxMG47CisgIHRoaXMuY3VycmVudFBhZ2UgPSAtMTsKKyAgdGhpcy5zY3JhdGNoQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7Cit9CisKK1BERlByaW50U2VydmljZS5wcm90b3R5cGUgPSB7CisgIGxheW91dCgpIHsKKyAgICB0aGlzLnRocm93SWZJbmFjdGl2ZSgpOworICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJib2R5Iik7CisgICAgYm9keS5zZXRBdHRyaWJ1dGUoImRhdGEtcGRmanNwcmludGluZyIsIHRydWUpOworICAgIGNvbnN0IGhhc0VxdWFsUGFnZVNpemVzID0gdGhpcy5wYWdlc092ZXJ2aWV3LmV2ZXJ5KGZ1bmN0aW9uIChzaXplKSB7CisgICAgICByZXR1cm4gc2l6ZS53aWR0aCA9PT0gdGhpcy5wYWdlc092ZXJ2aWV3WzBdLndpZHRoICYmIHNpemUuaGVpZ2h0ID09PSB0aGlzLnBhZ2VzT3ZlcnZpZXdbMF0uaGVpZ2h0OworICAgIH0sIHRoaXMpOworCisgICAgaWYgKCFoYXNFcXVhbFBhZ2VTaXplcykgeworICAgICAgY29uc29sZS53YXJuKCJOb3QgYWxsIHBhZ2VzIGhhdmUgdGhlIHNhbWUgc2l6ZS4gVGhlIHByaW50ZWQgIiArICJyZXN1bHQgbWF5IGJlIGluY29ycmVjdCEiKTsKKyAgICB9CisKKyAgICB0aGlzLnBhZ2VTdHlsZVNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKKyAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMucGFnZXNPdmVydmlld1swXTsKKyAgICB0aGlzLnBhZ2VTdHlsZVNoZWV0LnRleHRDb250ZW50ID0gIkBzdXBwb3J0cyAoKHNpemU6QTQpIGFuZCAoc2l6ZToxcHQgMXB0KSkgeyIgKyAiQHBhZ2UgeyBzaXplOiAiICsgcGFnZVNpemUud2lkdGggKyAicHQgIiArIHBhZ2VTaXplLmhlaWdodCArICJwdDt9IiArICJ9IjsKKyAgICBib2R5LmFwcGVuZENoaWxkKHRoaXMucGFnZVN0eWxlU2hlZXQpOworICB9LAorCisgIGRlc3Ryb3koKSB7CisgICAgaWYgKGFjdGl2ZVNlcnZpY2UgIT09IHRoaXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLnByaW50Q29udGFpbmVyLnRleHRDb250ZW50ID0gIiI7CisgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJvZHkiKTsKKyAgICBib2R5LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1wZGZqc3ByaW50aW5nIik7CisKKyAgICBpZiAodGhpcy5wYWdlU3R5bGVTaGVldCkgeworICAgICAgdGhpcy5wYWdlU3R5bGVTaGVldC5yZW1vdmUoKTsKKyAgICAgIHRoaXMucGFnZVN0eWxlU2hlZXQgPSBudWxsOworICAgIH0KKworICAgIHRoaXMuc2NyYXRjaENhbnZhcy53aWR0aCA9IHRoaXMuc2NyYXRjaENhbnZhcy5oZWlnaHQgPSAwOworICAgIHRoaXMuc2NyYXRjaENhbnZhcyA9IG51bGw7CisgICAgYWN0aXZlU2VydmljZSA9IG51bGw7CisgICAgZW5zdXJlT3ZlcmxheSgpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgaWYgKG92ZXJsYXlNYW5hZ2VyLmFjdGl2ZSAhPT0gInByaW50U2VydmljZU92ZXJsYXkiKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgb3ZlcmxheU1hbmFnZXIuY2xvc2UoInByaW50U2VydmljZU92ZXJsYXkiKTsKKyAgICB9KTsKKyAgfSwKKworICByZW5kZXJQYWdlcygpIHsKKyAgICBjb25zdCBwYWdlQ291bnQgPSB0aGlzLnBhZ2VzT3ZlcnZpZXcubGVuZ3RoOworCisgICAgY29uc3QgcmVuZGVyTmV4dFBhZ2UgPSAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgICB0aGlzLnRocm93SWZJbmFjdGl2ZSgpOworCisgICAgICBpZiAoKyt0aGlzLmN1cnJlbnRQYWdlID49IHBhZ2VDb3VudCkgeworICAgICAgICByZW5kZXJQcm9ncmVzcyhwYWdlQ291bnQsIHBhZ2VDb3VudCwgdGhpcy5sMTBuKTsKKyAgICAgICAgcmVzb2x2ZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jdXJyZW50UGFnZTsKKyAgICAgIHJlbmRlclByb2dyZXNzKGluZGV4LCBwYWdlQ291bnQsIHRoaXMubDEwbik7CisgICAgICByZW5kZXJQYWdlKHRoaXMsIHRoaXMucGRmRG9jdW1lbnQsIGluZGV4ICsgMSwgdGhpcy5wYWdlc092ZXJ2aWV3W2luZGV4XSwgdGhpcy5fcHJpbnRSZXNvbHV0aW9uLCB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKS50aGVuKHRoaXMudXNlUmVuZGVyZWRQYWdlLmJpbmQodGhpcykpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICByZW5kZXJOZXh0UGFnZShyZXNvbHZlLCByZWplY3QpOworICAgICAgfSwgcmVqZWN0KTsKKyAgICB9OworCisgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlbmRlck5leHRQYWdlKTsKKyAgfSwKKworICB1c2VSZW5kZXJlZFBhZ2UocHJpbnRJdGVtKSB7CisgICAgdGhpcy50aHJvd0lmSW5hY3RpdmUoKTsKKyAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKKyAgICBpbWcuc3R5bGUud2lkdGggPSBwcmludEl0ZW0ud2lkdGg7CisgICAgaW1nLnN0eWxlLmhlaWdodCA9IHByaW50SXRlbS5oZWlnaHQ7CisgICAgY29uc3Qgc2NyYXRjaENhbnZhcyA9IHRoaXMuc2NyYXRjaENhbnZhczsKKworICAgIGlmICgidG9CbG9iIiBpbiBzY3JhdGNoQ2FudmFzICYmICFfdmlld2VyX2NvbXBhdGliaWxpdHkudmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcy5kaXNhYmxlQ3JlYXRlT2JqZWN0VVJMKSB7CisgICAgICBzY3JhdGNoQ2FudmFzLnRvQmxvYihmdW5jdGlvbiAoYmxvYikgeworICAgICAgICBpbWcuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKKyAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICBpbWcuc3JjID0gc2NyYXRjaENhbnZhcy50b0RhdGFVUkwoKTsKKyAgICB9CisKKyAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbWcpOworICAgIHRoaXMucHJpbnRDb250YWluZXIuYXBwZW5kQ2hpbGQod3JhcHBlcik7CisgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIGltZy5vbmxvYWQgPSByZXNvbHZlOworICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7CisgICAgfSk7CisgIH0sCisKKyAgcGVyZm9ybVByaW50KCkgeworICAgIHRoaXMudGhyb3dJZkluYWN0aXZlKCk7CisgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4geworICAgICAgc2V0VGltZW91dCgoKSA9PiB7CisgICAgICAgIGlmICghdGhpcy5hY3RpdmUpIHsKKyAgICAgICAgICByZXNvbHZlKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnQuY2FsbCh3aW5kb3cpOworICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIDIwKTsKKyAgICAgIH0sIDApOworICAgIH0pOworICB9LAorCisgIGdldCBhY3RpdmUoKSB7CisgICAgcmV0dXJuIHRoaXMgPT09IGFjdGl2ZVNlcnZpY2U7CisgIH0sCisKKyAgdGhyb3dJZkluYWN0aXZlKCkgeworICAgIGlmICghdGhpcy5hY3RpdmUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiVGhpcyBwcmludCByZXF1ZXN0IHdhcyBjYW5jZWxsZWQgb3IgY29tcGxldGVkLiIpOworICAgIH0KKyAgfQorCit9OworY29uc3QgcHJpbnQgPSB3aW5kb3cucHJpbnQ7CisKK3dpbmRvdy5wcmludCA9IGZ1bmN0aW9uICgpIHsKKyAgaWYgKGFjdGl2ZVNlcnZpY2UpIHsKKyAgICBjb25zb2xlLndhcm4oIklnbm9yZWQgd2luZG93LnByaW50KCkgYmVjYXVzZSBvZiBhIHBlbmRpbmcgcHJpbnQgam9iLiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGVuc3VyZU92ZXJsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoYWN0aXZlU2VydmljZSkgeworICAgICAgb3ZlcmxheU1hbmFnZXIub3BlbigicHJpbnRTZXJ2aWNlT3ZlcmxheSIpOworICAgIH0KKyAgfSk7CisKKyAgdHJ5IHsKKyAgICBkaXNwYXRjaEV2ZW50KCJiZWZvcmVwcmludCIpOworICB9IGZpbmFsbHkgeworICAgIGlmICghYWN0aXZlU2VydmljZSkgeworICAgICAgY29uc29sZS5lcnJvcigiRXhwZWN0ZWQgcHJpbnQgc2VydmljZSB0byBiZSBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVuc3VyZU92ZXJsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKG92ZXJsYXlNYW5hZ2VyLmFjdGl2ZSA9PT0gInByaW50U2VydmljZU92ZXJsYXkiKSB7CisgICAgICAgICAgb3ZlcmxheU1hbmFnZXIuY2xvc2UoInByaW50U2VydmljZU92ZXJsYXkiKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYWN0aXZlU2VydmljZU9uRW50cnkgPSBhY3RpdmVTZXJ2aWNlOworICAgIGFjdGl2ZVNlcnZpY2UucmVuZGVyUGFnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBhY3RpdmVTZXJ2aWNlT25FbnRyeS5wZXJmb3JtUHJpbnQoKTsKKyAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoYWN0aXZlU2VydmljZU9uRW50cnkuYWN0aXZlKSB7CisgICAgICAgIGFib3J0KCk7CisgICAgICB9CisgICAgfSk7CisgIH0KK307CisKK2Z1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZXZlbnRUeXBlKSB7CisgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50Iik7CisgIGV2ZW50LmluaXRDdXN0b21FdmVudChldmVudFR5cGUsIGZhbHNlLCBmYWxzZSwgImN1c3RvbSIpOworICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7Cit9CisKK2Z1bmN0aW9uIGFib3J0KCkgeworICBpZiAoYWN0aXZlU2VydmljZSkgeworICAgIGFjdGl2ZVNlcnZpY2UuZGVzdHJveSgpOworICAgIGRpc3BhdGNoRXZlbnQoImFmdGVycHJpbnQiKTsKKyAgfQorfQorCitmdW5jdGlvbiByZW5kZXJQcm9ncmVzcyhpbmRleCwgdG90YWwsIGwxMG4pIHsKKyAgY29uc3QgcHJvZ3Jlc3NDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJpbnRTZXJ2aWNlT3ZlcmxheSIpOworICBjb25zdCBwcm9ncmVzcyA9IE1hdGgucm91bmQoMTAwICogaW5kZXggLyB0b3RhbCk7CisgIGNvbnN0IHByb2dyZXNzQmFyID0gcHJvZ3Jlc3NDb250YWluZXIucXVlcnlTZWxlY3RvcigicHJvZ3Jlc3MiKTsKKyAgY29uc3QgcHJvZ3Jlc3NQZXJjID0gcHJvZ3Jlc3NDb250YWluZXIucXVlcnlTZWxlY3RvcigiLnJlbGF0aXZlLXByb2dyZXNzIik7CisgIHByb2dyZXNzQmFyLnZhbHVlID0gcHJvZ3Jlc3M7CisgIGwxMG4uZ2V0KCJwcmludF9wcm9ncmVzc19wZXJjZW50IiwgeworICAgIHByb2dyZXNzCisgIH0sIHByb2dyZXNzICsgIiUiKS50aGVuKG1zZyA9PiB7CisgICAgcHJvZ3Jlc3NQZXJjLnRleHRDb250ZW50ID0gbXNnOworICB9KTsKK30KKword2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDgwICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5hbHRLZXkgJiYgKCFldmVudC5zaGlmdEtleSB8fCB3aW5kb3cuY2hyb21lIHx8IHdpbmRvdy5vcGVyYSkpIHsKKyAgICB3aW5kb3cucHJpbnQoKTsKKyAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCisgICAgaWYgKGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikgeworICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworICAgIH0KKyAgfQorfSwgdHJ1ZSk7CisKK2lmICgib25iZWZvcmVwcmludCIgaW4gd2luZG93KSB7CisgIGNvbnN0IHN0b3BQcm9wYWdhdGlvbklmTmVlZGVkID0gZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgaWYgKGV2ZW50LmRldGFpbCAhPT0gImN1c3RvbSIgJiYgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSB7CisgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKKyAgICB9CisgIH07CisKKyAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXByaW50Iiwgc3RvcFByb3BhZ2F0aW9uSWZOZWVkZWQpOworICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYWZ0ZXJwcmludCIsIHN0b3BQcm9wYWdhdGlvbklmTmVlZGVkKTsKK30KKworbGV0IG92ZXJsYXlQcm9taXNlOworCitmdW5jdGlvbiBlbnN1cmVPdmVybGF5KCkgeworICBpZiAoIW92ZXJsYXlQcm9taXNlKSB7CisgICAgb3ZlcmxheU1hbmFnZXIgPSBfYXBwLlBERlZpZXdlckFwcGxpY2F0aW9uLm92ZXJsYXlNYW5hZ2VyOworCisgICAgaWYgKCFvdmVybGF5TWFuYWdlcikgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgb3ZlcmxheSBtYW5hZ2VyIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuIik7CisgICAgfQorCisgICAgb3ZlcmxheVByb21pc2UgPSBvdmVybGF5TWFuYWdlci5yZWdpc3RlcigicHJpbnRTZXJ2aWNlT3ZlcmxheSIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcmludFNlcnZpY2VPdmVybGF5IiksIGFib3J0LCB0cnVlKTsKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJpbnRDYW5jZWwiKS5vbmNsaWNrID0gYWJvcnQ7CisgIH0KKworICByZXR1cm4gb3ZlcmxheVByb21pc2U7Cit9CisKK19hcHAuUERGUHJpbnRTZXJ2aWNlRmFjdG9yeS5pbnN0YW5jZSA9IHsKKyAgc3VwcG9ydHNQcmludGluZzogdHJ1ZSwKKworICBjcmVhdGVQcmludFNlcnZpY2UocGRmRG9jdW1lbnQsIHBhZ2VzT3ZlcnZpZXcsIHByaW50Q29udGFpbmVyLCBwcmludFJlc29sdXRpb24sIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UsIGwxMG4pIHsKKyAgICBpZiAoYWN0aXZlU2VydmljZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgcHJpbnQgc2VydmljZSBpcyBjcmVhdGVkIGFuZCBhY3RpdmUuIik7CisgICAgfQorCisgICAgYWN0aXZlU2VydmljZSA9IG5ldyBQREZQcmludFNlcnZpY2UocGRmRG9jdW1lbnQsIHBhZ2VzT3ZlcnZpZXcsIHByaW50Q29udGFpbmVyLCBwcmludFJlc29sdXRpb24sIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UsIGwxMG4pOworICAgIHJldHVybiBhY3RpdmVTZXJ2aWNlOworICB9CisKK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9wZGZfcmVuZGVyaW5nX3F1ZXVlLmpzIGIvbGliL3dlYi9wZGZfcmVuZGVyaW5nX3F1ZXVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODdlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3BkZl9yZW5kZXJpbmdfcXVldWUuanMKQEAgLTAsMCArMSwxNTEgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERlJlbmRlcmluZ1F1ZXVlID0gZXhwb3J0cy5SZW5kZXJpbmdTdGF0ZXMgPSB2b2lkIDA7Citjb25zdCBDTEVBTlVQX1RJTUVPVVQgPSAzMDAwMDsKK2NvbnN0IFJlbmRlcmluZ1N0YXRlcyA9IHsKKyAgSU5JVElBTDogMCwKKyAgUlVOTklORzogMSwKKyAgUEFVU0VEOiAyLAorICBGSU5JU0hFRDogMworfTsKK2V4cG9ydHMuUmVuZGVyaW5nU3RhdGVzID0gUmVuZGVyaW5nU3RhdGVzOworCitjbGFzcyBQREZSZW5kZXJpbmdRdWV1ZSB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMucGRmVmlld2VyID0gbnVsbDsKKyAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlciA9IG51bGw7CisgICAgdGhpcy5vbklkbGUgPSBudWxsOworICAgIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9IG51bGw7CisgICAgdGhpcy5pZGxlVGltZW91dCA9IG51bGw7CisgICAgdGhpcy5wcmludGluZyA9IGZhbHNlOworICAgIHRoaXMuaXNUaHVtYm5haWxWaWV3RW5hYmxlZCA9IGZhbHNlOworICB9CisKKyAgc2V0Vmlld2VyKHBkZlZpZXdlcikgeworICAgIHRoaXMucGRmVmlld2VyID0gcGRmVmlld2VyOworICB9CisKKyAgc2V0VGh1bWJuYWlsVmlld2VyKHBkZlRodW1ibmFpbFZpZXdlcikgeworICAgIHRoaXMucGRmVGh1bWJuYWlsVmlld2VyID0gcGRmVGh1bWJuYWlsVmlld2VyOworICB9CisKKyAgaXNIaWdoZXN0UHJpb3JpdHkodmlldykgeworICAgIHJldHVybiB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPT09IHZpZXcucmVuZGVyaW5nSWQ7CisgIH0KKworICByZW5kZXJIaWdoZXN0UHJpb3JpdHkoY3VycmVudGx5VmlzaWJsZVBhZ2VzKSB7CisgICAgaWYgKHRoaXMuaWRsZVRpbWVvdXQpIHsKKyAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KTsKKyAgICAgIHRoaXMuaWRsZVRpbWVvdXQgPSBudWxsOworICAgIH0KKworICAgIGlmICh0aGlzLnBkZlZpZXdlci5mb3JjZVJlbmRlcmluZyhjdXJyZW50bHlWaXNpYmxlUGFnZXMpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMucGRmVGh1bWJuYWlsVmlld2VyICYmIHRoaXMuaXNUaHVtYm5haWxWaWV3RW5hYmxlZCkgeworICAgICAgaWYgKHRoaXMucGRmVGh1bWJuYWlsVmlld2VyLmZvcmNlUmVuZGVyaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLnByaW50aW5nKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMub25JZGxlKSB7CisgICAgICB0aGlzLmlkbGVUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLm9uSWRsZS5iaW5kKHRoaXMpLCBDTEVBTlVQX1RJTUVPVVQpOworICAgIH0KKyAgfQorCisgIGdldEhpZ2hlc3RQcmlvcml0eSh2aXNpYmxlLCB2aWV3cywgc2Nyb2xsZWREb3duKSB7CisgICAgY29uc3QgdmlzaWJsZVZpZXdzID0gdmlzaWJsZS52aWV3czsKKyAgICBjb25zdCBudW1WaXNpYmxlID0gdmlzaWJsZVZpZXdzLmxlbmd0aDsKKworICAgIGlmIChudW1WaXNpYmxlID09PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVZpc2libGU7ICsraSkgeworICAgICAgY29uc3QgdmlldyA9IHZpc2libGVWaWV3c1tpXS52aWV3OworCisgICAgICBpZiAoIXRoaXMuaXNWaWV3RmluaXNoZWQodmlldykpIHsKKyAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNjcm9sbGVkRG93bikgeworICAgICAgY29uc3QgbmV4dFBhZ2VJbmRleCA9IHZpc2libGUubGFzdC5pZDsKKworICAgICAgaWYgKHZpZXdzW25leHRQYWdlSW5kZXhdICYmICF0aGlzLmlzVmlld0ZpbmlzaGVkKHZpZXdzW25leHRQYWdlSW5kZXhdKSkgeworICAgICAgICByZXR1cm4gdmlld3NbbmV4dFBhZ2VJbmRleF07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHByZXZpb3VzUGFnZUluZGV4ID0gdmlzaWJsZS5maXJzdC5pZCAtIDI7CisKKyAgICAgIGlmICh2aWV3c1twcmV2aW91c1BhZ2VJbmRleF0gJiYgIXRoaXMuaXNWaWV3RmluaXNoZWQodmlld3NbcHJldmlvdXNQYWdlSW5kZXhdKSkgeworICAgICAgICByZXR1cm4gdmlld3NbcHJldmlvdXNQYWdlSW5kZXhdOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgaXNWaWV3RmluaXNoZWQodmlldykgeworICAgIHJldHVybiB2aWV3LnJlbmRlcmluZ1N0YXRlID09PSBSZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ7CisgIH0KKworICByZW5kZXJWaWV3KHZpZXcpIHsKKyAgICBzd2l0Y2ggKHZpZXcucmVuZGVyaW5nU3RhdGUpIHsKKyAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOgorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLlBBVVNFRDoKKyAgICAgICAgdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID0gdmlldy5yZW5kZXJpbmdJZDsKKyAgICAgICAgdmlldy5yZXN1bWUoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLlJVTk5JTkc6CisgICAgICAgIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9IHZpZXcucmVuZGVyaW5nSWQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJlbmRlcmluZ1N0YXRlcy5JTklUSUFMOgorICAgICAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSB2aWV3LnJlbmRlcmluZ0lkOworICAgICAgICB2aWV3LmRyYXcoKS5maW5hbGx5KCgpID0+IHsKKyAgICAgICAgICB0aGlzLnJlbmRlckhpZ2hlc3RQcmlvcml0eSgpOworICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4geworICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHJlbmRlclZpZXc6ICIke3JlYXNvbn0iYCk7CisgICAgICAgIH0pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGUmVuZGVyaW5nUXVldWUgPSBQREZSZW5kZXJpbmdRdWV1ZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9zaWRlYmFyLmpzIGIvbGliL3dlYi9wZGZfc2lkZWJhci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDZmYTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9wZGZfc2lkZWJhci5qcwpAQCAtMCwwICsxLDQxOCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGU2lkZWJhciA9IGV4cG9ydHMuU2lkZWJhclZpZXcgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK3ZhciBfcGRmX3JlbmRlcmluZ19xdWV1ZSA9IHJlcXVpcmUoIi4vcGRmX3JlbmRlcmluZ19xdWV1ZS5qcyIpOworCitjb25zdCBVSV9OT1RJRklDQVRJT05fQ0xBU1MgPSAicGRmU2lkZWJhck5vdGlmaWNhdGlvbiI7Citjb25zdCBTaWRlYmFyVmlldyA9IHsKKyAgVU5LTk9XTjogLTEsCisgIE5PTkU6IDAsCisgIFRIVU1CUzogMSwKKyAgT1VUTElORTogMiwKKyAgQVRUQUNITUVOVFM6IDMsCisgIExBWUVSUzogNAorfTsKK2V4cG9ydHMuU2lkZWJhclZpZXcgPSBTaWRlYmFyVmlldzsKKworY2xhc3MgUERGU2lkZWJhciB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBlbGVtZW50cywKKyAgICBwZGZWaWV3ZXIsCisgICAgcGRmVGh1bWJuYWlsVmlld2VyLAorICAgIGV2ZW50QnVzLAorICAgIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4sCisgICAgZGlzYWJsZU5vdGlmaWNhdGlvbiA9IGZhbHNlCisgIH0pIHsKKyAgICB0aGlzLmlzT3BlbiA9IGZhbHNlOworICAgIHRoaXMuYWN0aXZlID0gU2lkZWJhclZpZXcuVEhVTUJTOworICAgIHRoaXMuaXNJbml0aWFsVmlld1NldCA9IGZhbHNlOworICAgIHRoaXMub25Ub2dnbGVkID0gbnVsbDsKKyAgICB0aGlzLnBkZlZpZXdlciA9IHBkZlZpZXdlcjsKKyAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlciA9IHBkZlRodW1ibmFpbFZpZXdlcjsKKyAgICB0aGlzLm91dGVyQ29udGFpbmVyID0gZWxlbWVudHMub3V0ZXJDb250YWluZXI7CisgICAgdGhpcy52aWV3ZXJDb250YWluZXIgPSBlbGVtZW50cy52aWV3ZXJDb250YWluZXI7CisgICAgdGhpcy50b2dnbGVCdXR0b24gPSBlbGVtZW50cy50b2dnbGVCdXR0b247CisgICAgdGhpcy50aHVtYm5haWxCdXR0b24gPSBlbGVtZW50cy50aHVtYm5haWxCdXR0b247CisgICAgdGhpcy5vdXRsaW5lQnV0dG9uID0gZWxlbWVudHMub3V0bGluZUJ1dHRvbjsKKyAgICB0aGlzLmF0dGFjaG1lbnRzQnV0dG9uID0gZWxlbWVudHMuYXR0YWNobWVudHNCdXR0b247CisgICAgdGhpcy5sYXllcnNCdXR0b24gPSBlbGVtZW50cy5sYXllcnNCdXR0b247CisgICAgdGhpcy50aHVtYm5haWxWaWV3ID0gZWxlbWVudHMudGh1bWJuYWlsVmlldzsKKyAgICB0aGlzLm91dGxpbmVWaWV3ID0gZWxlbWVudHMub3V0bGluZVZpZXc7CisgICAgdGhpcy5hdHRhY2htZW50c1ZpZXcgPSBlbGVtZW50cy5hdHRhY2htZW50c1ZpZXc7CisgICAgdGhpcy5sYXllcnNWaWV3ID0gZWxlbWVudHMubGF5ZXJzVmlldzsKKyAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7CisgICAgdGhpcy5sMTBuID0gbDEwbjsKKyAgICB0aGlzLl9kaXNhYmxlTm90aWZpY2F0aW9uID0gZGlzYWJsZU5vdGlmaWNhdGlvbjsKKworICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7CisgIH0KKworICByZXNldCgpIHsKKyAgICB0aGlzLmlzSW5pdGlhbFZpZXdTZXQgPSBmYWxzZTsKKworICAgIHRoaXMuX2hpZGVVSU5vdGlmaWNhdGlvbihudWxsKTsKKworICAgIHRoaXMuc3dpdGNoVmlldyhTaWRlYmFyVmlldy5USFVNQlMpOworICAgIHRoaXMub3V0bGluZUJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOworICAgIHRoaXMuYXR0YWNobWVudHNCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICB0aGlzLmxheWVyc0J1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOworICB9CisKKyAgZ2V0IHZpc2libGVWaWV3KCkgeworICAgIHJldHVybiB0aGlzLmlzT3BlbiA/IHRoaXMuYWN0aXZlIDogU2lkZWJhclZpZXcuTk9ORTsKKyAgfQorCisgIGdldCBpc1RodW1ibmFpbFZpZXdWaXNpYmxlKCkgeworICAgIHJldHVybiB0aGlzLmlzT3BlbiAmJiB0aGlzLmFjdGl2ZSA9PT0gU2lkZWJhclZpZXcuVEhVTUJTOworICB9CisKKyAgZ2V0IGlzT3V0bGluZVZpZXdWaXNpYmxlKCkgeworICAgIHJldHVybiB0aGlzLmlzT3BlbiAmJiB0aGlzLmFjdGl2ZSA9PT0gU2lkZWJhclZpZXcuT1VUTElORTsKKyAgfQorCisgIGdldCBpc0F0dGFjaG1lbnRzVmlld1Zpc2libGUoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNPcGVuICYmIHRoaXMuYWN0aXZlID09PSBTaWRlYmFyVmlldy5BVFRBQ0hNRU5UUzsKKyAgfQorCisgIGdldCBpc0xheWVyc1ZpZXdWaXNpYmxlKCkgeworICAgIHJldHVybiB0aGlzLmlzT3BlbiAmJiB0aGlzLmFjdGl2ZSA9PT0gU2lkZWJhclZpZXcuTEFZRVJTOworICB9CisKKyAgc2V0SW5pdGlhbFZpZXcodmlldyA9IFNpZGViYXJWaWV3Lk5PTkUpIHsKKyAgICBpZiAodGhpcy5pc0luaXRpYWxWaWV3U2V0KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5pc0luaXRpYWxWaWV3U2V0ID0gdHJ1ZTsKKworICAgIGlmICh2aWV3ID09PSBTaWRlYmFyVmlldy5OT05FIHx8IHZpZXcgPT09IFNpZGViYXJWaWV3LlVOS05PV04pIHsKKyAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGhpcy5fc3dpdGNoVmlldyh2aWV3LCB0cnVlKSkgeworICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudCgpOworICAgIH0KKyAgfQorCisgIHN3aXRjaFZpZXcodmlldywgZm9yY2VPcGVuID0gZmFsc2UpIHsKKyAgICB0aGlzLl9zd2l0Y2hWaWV3KHZpZXcsIGZvcmNlT3Blbik7CisgIH0KKworICBfc3dpdGNoVmlldyh2aWV3LCBmb3JjZU9wZW4gPSBmYWxzZSkgeworICAgIGNvbnN0IGlzVmlld0NoYW5nZWQgPSB2aWV3ICE9PSB0aGlzLmFjdGl2ZTsKKyAgICBsZXQgc2hvdWxkRm9yY2VSZW5kZXJpbmcgPSBmYWxzZTsKKworICAgIHN3aXRjaCAodmlldykgeworICAgICAgY2FzZSBTaWRlYmFyVmlldy5OT05FOgorICAgICAgICBpZiAodGhpcy5pc09wZW4pIHsKKyAgICAgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGNhc2UgU2lkZWJhclZpZXcuVEhVTUJTOgorICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgaXNWaWV3Q2hhbmdlZCkgeworICAgICAgICAgIHNob3VsZEZvcmNlUmVuZGVyaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNpZGViYXJWaWV3Lk9VVExJTkU6CisgICAgICAgIGlmICh0aGlzLm91dGxpbmVCdXR0b24uZGlzYWJsZWQpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTaWRlYmFyVmlldy5BVFRBQ0hNRU5UUzoKKyAgICAgICAgaWYgKHRoaXMuYXR0YWNobWVudHNCdXR0b24uZGlzYWJsZWQpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTaWRlYmFyVmlldy5MQVlFUlM6CisgICAgICAgIGlmICh0aGlzLmxheWVyc0J1dHRvbi5kaXNhYmxlZCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBjb25zb2xlLmVycm9yKGBQREZTaWRlYmFyLl9zd2l0Y2hWaWV3OiAiJHt2aWV3fSIgaXMgbm90IGEgdmFsaWQgdmlldy5gKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRoaXMuYWN0aXZlID0gdmlldzsKKyAgICB0aGlzLnRodW1ibmFpbEJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCJ0b2dnbGVkIiwgdmlldyA9PT0gU2lkZWJhclZpZXcuVEhVTUJTKTsKKyAgICB0aGlzLm91dGxpbmVCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgidG9nZ2xlZCIsIHZpZXcgPT09IFNpZGViYXJWaWV3Lk9VVExJTkUpOworICAgIHRoaXMuYXR0YWNobWVudHNCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgidG9nZ2xlZCIsIHZpZXcgPT09IFNpZGViYXJWaWV3LkFUVEFDSE1FTlRTKTsKKyAgICB0aGlzLmxheWVyc0J1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCJ0b2dnbGVkIiwgdmlldyA9PT0gU2lkZWJhclZpZXcuTEFZRVJTKTsKKyAgICB0aGlzLnRodW1ibmFpbFZpZXcuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdmlldyAhPT0gU2lkZWJhclZpZXcuVEhVTUJTKTsKKyAgICB0aGlzLm91dGxpbmVWaWV3LmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHZpZXcgIT09IFNpZGViYXJWaWV3Lk9VVExJTkUpOworICAgIHRoaXMuYXR0YWNobWVudHNWaWV3LmNsYXNzTGlzdC50b2dnbGUoImhpZGRlbiIsIHZpZXcgIT09IFNpZGViYXJWaWV3LkFUVEFDSE1FTlRTKTsKKyAgICB0aGlzLmxheWVyc1ZpZXcuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiwgdmlldyAhPT0gU2lkZWJhclZpZXcuTEFZRVJTKTsKKworICAgIGlmIChmb3JjZU9wZW4gJiYgIXRoaXMuaXNPcGVuKSB7CisgICAgICB0aGlzLm9wZW4oKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChzaG91bGRGb3JjZVJlbmRlcmluZykgeworICAgICAgdGhpcy5fdXBkYXRlVGh1bWJuYWlsVmlld2VyKCk7CisKKyAgICAgIHRoaXMuX2ZvcmNlUmVuZGVyaW5nKCk7CisgICAgfQorCisgICAgaWYgKGlzVmlld0NoYW5nZWQpIHsKKyAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoKTsKKyAgICB9CisKKyAgICB0aGlzLl9oaWRlVUlOb3RpZmljYXRpb24odGhpcy5hY3RpdmUpOworCisgICAgcmV0dXJuIGlzVmlld0NoYW5nZWQ7CisgIH0KKworICBvcGVuKCkgeworICAgIGlmICh0aGlzLmlzT3BlbikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTsKKyAgICB0aGlzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJ0b2dnbGVkIik7CisgICAgdGhpcy5vdXRlckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJzaWRlYmFyTW92aW5nIiwgInNpZGViYXJPcGVuIik7CisKKyAgICBpZiAodGhpcy5hY3RpdmUgPT09IFNpZGViYXJWaWV3LlRIVU1CUykgeworICAgICAgdGhpcy5fdXBkYXRlVGh1bWJuYWlsVmlld2VyKCk7CisgICAgfQorCisgICAgdGhpcy5fZm9yY2VSZW5kZXJpbmcoKTsKKworICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoKTsKKworICAgIHRoaXMuX2hpZGVVSU5vdGlmaWNhdGlvbih0aGlzLmFjdGl2ZSk7CisgIH0KKworICBjbG9zZSgpIHsKKyAgICBpZiAoIXRoaXMuaXNPcGVuKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5pc09wZW4gPSBmYWxzZTsKKyAgICB0aGlzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJ0b2dnbGVkIik7CisgICAgdGhpcy5vdXRlckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJzaWRlYmFyTW92aW5nIik7CisgICAgdGhpcy5vdXRlckNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJzaWRlYmFyT3BlbiIpOworCisgICAgdGhpcy5fZm9yY2VSZW5kZXJpbmcoKTsKKworICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoKTsKKyAgfQorCisgIHRvZ2dsZSgpIHsKKyAgICBpZiAodGhpcy5pc09wZW4pIHsKKyAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5vcGVuKCk7CisgICAgfQorICB9CisKKyAgX2Rpc3BhdGNoRXZlbnQoKSB7CisgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgic2lkZWJhcnZpZXdjaGFuZ2VkIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgdmlldzogdGhpcy52aXNpYmxlVmlldworICAgIH0pOworICB9CisKKyAgX2ZvcmNlUmVuZGVyaW5nKCkgeworICAgIGlmICh0aGlzLm9uVG9nZ2xlZCkgeworICAgICAgdGhpcy5vblRvZ2dsZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5wZGZWaWV3ZXIuZm9yY2VSZW5kZXJpbmcoKTsKKyAgICAgIHRoaXMucGRmVGh1bWJuYWlsVmlld2VyLmZvcmNlUmVuZGVyaW5nKCk7CisgICAgfQorICB9CisKKyAgX3VwZGF0ZVRodW1ibmFpbFZpZXdlcigpIHsKKyAgICBjb25zdCB7CisgICAgICBwZGZWaWV3ZXIsCisgICAgICBwZGZUaHVtYm5haWxWaWV3ZXIKKyAgICB9ID0gdGhpczsKKyAgICBjb25zdCBwYWdlc0NvdW50ID0gcGRmVmlld2VyLnBhZ2VzQ291bnQ7CisKKyAgICBmb3IgKGxldCBwYWdlSW5kZXggPSAwOyBwYWdlSW5kZXggPCBwYWdlc0NvdW50OyBwYWdlSW5kZXgrKykgeworICAgICAgY29uc3QgcGFnZVZpZXcgPSBwZGZWaWV3ZXIuZ2V0UGFnZVZpZXcocGFnZUluZGV4KTsKKworICAgICAgaWYgKHBhZ2VWaWV3ICYmIHBhZ2VWaWV3LnJlbmRlcmluZ1N0YXRlID09PSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQpIHsKKyAgICAgICAgY29uc3QgdGh1bWJuYWlsVmlldyA9IHBkZlRodW1ibmFpbFZpZXdlci5nZXRUaHVtYm5haWwocGFnZUluZGV4KTsKKyAgICAgICAgdGh1bWJuYWlsVmlldy5zZXRJbWFnZShwYWdlVmlldyk7CisgICAgICB9CisgICAgfQorCisgICAgcGRmVGh1bWJuYWlsVmlld2VyLnNjcm9sbFRodW1ibmFpbEludG9WaWV3KHBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlcik7CisgIH0KKworICBfc2hvd1VJTm90aWZpY2F0aW9uKHZpZXcpIHsKKyAgICBpZiAodGhpcy5fZGlzYWJsZU5vdGlmaWNhdGlvbikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMubDEwbi5nZXQoInRvZ2dsZV9zaWRlYmFyX25vdGlmaWNhdGlvbjIudGl0bGUiLCBudWxsLCAiVG9nZ2xlIFNpZGViYXIgKGRvY3VtZW50IGNvbnRhaW5zIG91dGxpbmUvYXR0YWNobWVudHMvbGF5ZXJzKSIpLnRoZW4obXNnID0+IHsKKyAgICAgIHRoaXMudG9nZ2xlQnV0dG9uLnRpdGxlID0gbXNnOworICAgIH0pOworCisgICAgaWYgKCF0aGlzLmlzT3BlbikgeworICAgICAgdGhpcy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LmFkZChVSV9OT1RJRklDQVRJT05fQ0xBU1MpOworICAgIH0gZWxzZSBpZiAodmlldyA9PT0gdGhpcy5hY3RpdmUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHZpZXcpIHsKKyAgICAgIGNhc2UgU2lkZWJhclZpZXcuT1VUTElORToKKyAgICAgICAgdGhpcy5vdXRsaW5lQnV0dG9uLmNsYXNzTGlzdC5hZGQoVUlfTk9USUZJQ0FUSU9OX0NMQVNTKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU2lkZWJhclZpZXcuQVRUQUNITUVOVFM6CisgICAgICAgIHRoaXMuYXR0YWNobWVudHNCdXR0b24uY2xhc3NMaXN0LmFkZChVSV9OT1RJRklDQVRJT05fQ0xBU1MpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTaWRlYmFyVmlldy5MQVlFUlM6CisgICAgICAgIHRoaXMubGF5ZXJzQnV0dG9uLmNsYXNzTGlzdC5hZGQoVUlfTk9USUZJQ0FUSU9OX0NMQVNTKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgX2hpZGVVSU5vdGlmaWNhdGlvbih2aWV3KSB7CisgICAgaWYgKHRoaXMuX2Rpc2FibGVOb3RpZmljYXRpb24pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCByZW1vdmVOb3RpZmljYXRpb24gPSBzaWRlYmFyVmlldyA9PiB7CisgICAgICBzd2l0Y2ggKHNpZGViYXJWaWV3KSB7CisgICAgICAgIGNhc2UgU2lkZWJhclZpZXcuT1VUTElORToKKyAgICAgICAgICB0aGlzLm91dGxpbmVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShVSV9OT1RJRklDQVRJT05fQ0xBU1MpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU2lkZWJhclZpZXcuQVRUQUNITUVOVFM6CisgICAgICAgICAgdGhpcy5hdHRhY2htZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFVJX05PVElGSUNBVElPTl9DTEFTUyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTaWRlYmFyVmlldy5MQVlFUlM6CisgICAgICAgICAgdGhpcy5sYXllcnNCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShVSV9OT1RJRklDQVRJT05fQ0xBU1MpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH07CisKKyAgICBpZiAoIXRoaXMuaXNPcGVuICYmIHZpZXcgIT09IG51bGwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFVJX05PVElGSUNBVElPTl9DTEFTUyk7CisKKyAgICBpZiAodmlldyAhPT0gbnVsbCkgeworICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKHZpZXcpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAodmlldyBpbiBTaWRlYmFyVmlldykgeworICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKFNpZGViYXJWaWV3W3ZpZXddKTsKKyAgICB9CisKKyAgICB0aGlzLmwxMG4uZ2V0KCJ0b2dnbGVfc2lkZWJhci50aXRsZSIsIG51bGwsICJUb2dnbGUgU2lkZWJhciIpLnRoZW4obXNnID0+IHsKKyAgICAgIHRoaXMudG9nZ2xlQnV0dG9uLnRpdGxlID0gbXNnOworICAgIH0pOworICB9CisKKyAgX2FkZEV2ZW50TGlzdGVuZXJzKCkgeworICAgIHRoaXMudmlld2VyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLCBldnQgPT4geworICAgICAgaWYgKGV2dC50YXJnZXQgPT09IHRoaXMudmlld2VyQ29udGFpbmVyKSB7CisgICAgICAgIHRoaXMub3V0ZXJDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgic2lkZWJhck1vdmluZyIpOworICAgICAgfQorICAgIH0pOworICAgIHRoaXMudG9nZ2xlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geworICAgICAgdGhpcy50b2dnbGUoKTsKKyAgICB9KTsKKyAgICB0aGlzLnRodW1ibmFpbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKKyAgICAgIHRoaXMuc3dpdGNoVmlldyhTaWRlYmFyVmlldy5USFVNQlMpOworICAgIH0pOworICAgIHRoaXMub3V0bGluZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKKyAgICAgIHRoaXMuc3dpdGNoVmlldyhTaWRlYmFyVmlldy5PVVRMSU5FKTsKKyAgICB9KTsKKyAgICB0aGlzLm91dGxpbmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCAoKSA9PiB7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJ0b2dnbGVvdXRsaW5ldHJlZSIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzCisgICAgICB9KTsKKyAgICB9KTsKKyAgICB0aGlzLmF0dGFjaG1lbnRzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geworICAgICAgdGhpcy5zd2l0Y2hWaWV3KFNpZGViYXJWaWV3LkFUVEFDSE1FTlRTKTsKKyAgICB9KTsKKyAgICB0aGlzLmxheWVyc0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKKyAgICAgIHRoaXMuc3dpdGNoVmlldyhTaWRlYmFyVmlldy5MQVlFUlMpOworICAgIH0pOworICAgIHRoaXMubGF5ZXJzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgKCkgPT4geworICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgicmVzZXRsYXllcnMiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcworICAgICAgfSk7CisgICAgfSk7CisKKyAgICBjb25zdCBvblRyZWVMb2FkZWQgPSAoY291bnQsIGJ1dHRvbiwgdmlldykgPT4geworICAgICAgYnV0dG9uLmRpc2FibGVkID0gIWNvdW50OworCisgICAgICBpZiAoY291bnQpIHsKKyAgICAgICAgdGhpcy5fc2hvd1VJTm90aWZpY2F0aW9uKHZpZXcpOworICAgICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZSA9PT0gdmlldykgeworICAgICAgICB0aGlzLnN3aXRjaFZpZXcoU2lkZWJhclZpZXcuVEhVTUJTKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oIm91dGxpbmVsb2FkZWQiLCBldnQgPT4geworICAgICAgb25UcmVlTG9hZGVkKGV2dC5vdXRsaW5lQ291bnQsIHRoaXMub3V0bGluZUJ1dHRvbiwgU2lkZWJhclZpZXcuT1VUTElORSk7CisgICAgfSk7CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigiYXR0YWNobWVudHNsb2FkZWQiLCBldnQgPT4geworICAgICAgb25UcmVlTG9hZGVkKGV2dC5hdHRhY2htZW50c0NvdW50LCB0aGlzLmF0dGFjaG1lbnRzQnV0dG9uLCBTaWRlYmFyVmlldy5BVFRBQ0hNRU5UUyk7CisgICAgfSk7CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigibGF5ZXJzbG9hZGVkIiwgZXZ0ID0+IHsKKyAgICAgIG9uVHJlZUxvYWRlZChldnQubGF5ZXJzQ291bnQsIHRoaXMubGF5ZXJzQnV0dG9uLCBTaWRlYmFyVmlldy5MQVlFUlMpOworICAgIH0pOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkIiwgZXZ0ID0+IHsKKyAgICAgIGlmICghZXZ0LmFjdGl2ZSAmJiAhZXZ0LnN3aXRjaEluUHJvZ3Jlc3MgJiYgdGhpcy5pc1RodW1ibmFpbFZpZXdWaXNpYmxlKSB7CisgICAgICAgIHRoaXMuX3VwZGF0ZVRodW1ibmFpbFZpZXdlcigpOworICAgICAgfQorICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5QREZTaWRlYmFyID0gUERGU2lkZWJhcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl9zaWRlYmFyX3Jlc2l6ZXIuanMgYi9saWIvd2ViL3BkZl9zaWRlYmFyX3Jlc2l6ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmNDgyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvcGRmX3NpZGViYXJfcmVzaXplci5qcwpAQCAtMCwwICsxLDE2NCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGU2lkZWJhclJlc2l6ZXIgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK2NvbnN0IFNJREVCQVJfV0lEVEhfVkFSID0gIi0tc2lkZWJhci13aWR0aCI7Citjb25zdCBTSURFQkFSX01JTl9XSURUSCA9IDIwMDsKK2NvbnN0IFNJREVCQVJfUkVTSVpJTkdfQ0xBU1MgPSAic2lkZWJhclJlc2l6aW5nIjsKKworY2xhc3MgUERGU2lkZWJhclJlc2l6ZXIgeworICBjb25zdHJ1Y3RvcihvcHRpb25zLCBldmVudEJ1cywgbDEwbiA9IF91aV91dGlscy5OdWxsTDEwbikgeworICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlOworICAgIHRoaXMuaXNSVEwgPSBmYWxzZTsKKyAgICB0aGlzLnNpZGViYXJPcGVuID0gZmFsc2U7CisgICAgdGhpcy5kb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisgICAgdGhpcy5fd2lkdGggPSBudWxsOworICAgIHRoaXMuX291dGVyQ29udGFpbmVyV2lkdGggPSBudWxsOworICAgIHRoaXMuX2JvdW5kRXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICB0aGlzLm91dGVyQ29udGFpbmVyID0gb3B0aW9ucy5vdXRlckNvbnRhaW5lcjsKKyAgICB0aGlzLnJlc2l6ZXIgPSBvcHRpb25zLnJlc2l6ZXI7CisgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOworICAgIHRoaXMubDEwbiA9IGwxMG47CisKKyAgICBpZiAodHlwZW9mIENTUyA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIENTUy5zdXBwb3J0cyAhPT0gImZ1bmN0aW9uIiB8fCAhQ1NTLnN1cHBvcnRzKFNJREVCQVJfV0lEVEhfVkFSLCBgY2FsYygtMSAqICR7U0lERUJBUl9NSU5fV0lEVEh9cHgpYCkpIHsKKyAgICAgIGNvbnNvbGUud2FybigiUERGU2lkZWJhclJlc2l6ZXI6ICIgKyAiVGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCByZXNpemluZyBvZiB0aGUgc2lkZWJhci4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmVuYWJsZWQgPSB0cnVlOworICAgIHRoaXMucmVzaXplci5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsKKyAgICB0aGlzLmwxMG4uZ2V0RGlyZWN0aW9uKCkudGhlbihkaXIgPT4geworICAgICAgdGhpcy5pc1JUTCA9IGRpciA9PT0gInJ0bCI7CisgICAgfSk7CisKKyAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpOworICB9CisKKyAgZ2V0IG91dGVyQ29udGFpbmVyV2lkdGgoKSB7CisgICAgaWYgKCF0aGlzLl9vdXRlckNvbnRhaW5lcldpZHRoKSB7CisgICAgICB0aGlzLl9vdXRlckNvbnRhaW5lcldpZHRoID0gdGhpcy5vdXRlckNvbnRhaW5lci5jbGllbnRXaWR0aDsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fb3V0ZXJDb250YWluZXJXaWR0aDsKKyAgfQorCisgIF91cGRhdGVXaWR0aCh3aWR0aCA9IDApIHsKKyAgICBpZiAoIXRoaXMuZW5hYmxlZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IG5ld1dpZHRoID0gKDAsIF91aV91dGlscy5jbGFtcCkod2lkdGgsIFNJREVCQVJfTUlOX1dJRFRILCBNYXRoLmZsb29yKHRoaXMub3V0ZXJDb250YWluZXJXaWR0aCAvIDIpKTsKKworICAgIGlmIChuZXdXaWR0aCA9PT0gdGhpcy5fd2lkdGgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aGlzLl93aWR0aCA9IG5ld1dpZHRoOworICAgIHRoaXMuZG9jLnN0eWxlLnNldFByb3BlcnR5KFNJREVCQVJfV0lEVEhfVkFSLCBgJHtuZXdXaWR0aH1weGApOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgX21vdXNlTW92ZShldnQpIHsKKyAgICBsZXQgd2lkdGggPSBldnQuY2xpZW50WDsKKworICAgIGlmICh0aGlzLmlzUlRMKSB7CisgICAgICB3aWR0aCA9IHRoaXMub3V0ZXJDb250YWluZXJXaWR0aCAtIHdpZHRoOworICAgIH0KKworICAgIHRoaXMuX3VwZGF0ZVdpZHRoKHdpZHRoKTsKKyAgfQorCisgIF9tb3VzZVVwKGV2dCkgeworICAgIHRoaXMub3V0ZXJDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShTSURFQkFSX1JFU0laSU5HX0NMQVNTKTsKKyAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJyZXNpemUiLCB7CisgICAgICBzb3VyY2U6IHRoaXMKKyAgICB9KTsKKyAgICBjb25zdCBfYm91bmRFdmVudHMgPSB0aGlzLl9ib3VuZEV2ZW50czsKKyAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgX2JvdW5kRXZlbnRzLm1vdXNlTW92ZSk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCBfYm91bmRFdmVudHMubW91c2VVcCk7CisgIH0KKworICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7CisgICAgaWYgKCF0aGlzLmVuYWJsZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBfYm91bmRFdmVudHMgPSB0aGlzLl9ib3VuZEV2ZW50czsKKyAgICBfYm91bmRFdmVudHMubW91c2VNb3ZlID0gdGhpcy5fbW91c2VNb3ZlLmJpbmQodGhpcyk7CisgICAgX2JvdW5kRXZlbnRzLm1vdXNlVXAgPSB0aGlzLl9tb3VzZVVwLmJpbmQodGhpcyk7CisgICAgdGhpcy5yZXNpemVyLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIGV2dCA9PiB7CisgICAgICBpZiAoZXZ0LmJ1dHRvbiAhPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMub3V0ZXJDb250YWluZXIuY2xhc3NMaXN0LmFkZChTSURFQkFSX1JFU0laSU5HX0NMQVNTKTsKKyAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBfYm91bmRFdmVudHMubW91c2VNb3ZlKTsKKyAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgX2JvdW5kRXZlbnRzLm1vdXNlVXApOworICAgIH0pOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInNpZGViYXJ2aWV3Y2hhbmdlZCIsIGV2dCA9PiB7CisgICAgICB0aGlzLnNpZGViYXJPcGVuID0gISEoZXZ0ICYmIGV2dC52aWV3KTsKKyAgICB9KTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJyZXNpemUiLCBldnQgPT4geworICAgICAgaWYgKCFldnQgfHwgZXZ0LnNvdXJjZSAhPT0gd2luZG93KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fb3V0ZXJDb250YWluZXJXaWR0aCA9IG51bGw7CisKKyAgICAgIGlmICghdGhpcy5fd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMuc2lkZWJhck9wZW4pIHsKKyAgICAgICAgdGhpcy5fdXBkYXRlV2lkdGgodGhpcy5fd2lkdGgpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5vdXRlckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFNJREVCQVJfUkVTSVpJTkdfQ0xBU1MpOworCisgICAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5fdXBkYXRlV2lkdGgodGhpcy5fd2lkdGgpOworCisgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKKyAgICAgICAgdGhpcy5vdXRlckNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFNJREVCQVJfUkVTSVpJTkdfQ0xBU1MpOworCisgICAgICAgIGlmICh1cGRhdGVkKSB7CisgICAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgicmVzaXplIiwgeworICAgICAgICAgICAgc291cmNlOiB0aGlzCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5QREZTaWRlYmFyUmVzaXplciA9IFBERlNpZGViYXJSZXNpemVyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvcGRmX3NpbmdsZV9wYWdlX3ZpZXdlci5qcyBiL2xpYi93ZWIvcGRmX3NpbmdsZV9wYWdlX3ZpZXdlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQzMzJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9wZGZfc2luZ2xlX3BhZ2Vfdmlld2VyLmpzCkBAIC0wLDAgKzEsMTM3IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZTaW5nbGVQYWdlVmlld2VyID0gdm9pZCAwOworCit2YXIgX2Jhc2Vfdmlld2VyID0gcmVxdWlyZSgiLi9iYXNlX3ZpZXdlci5qcyIpOworCit2YXIgX3BkZiA9IHJlcXVpcmUoIi4uL3BkZiIpOworCitjbGFzcyBQREZTaW5nbGVQYWdlVmlld2VyIGV4dGVuZHMgX2Jhc2Vfdmlld2VyLkJhc2VWaWV3ZXIgeworICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CisgICAgc3VwZXIob3B0aW9ucyk7CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigicGFnZXNpbml0IiwgZXZ0ID0+IHsKKyAgICAgIHRoaXMuX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpOworICAgIH0pOworICB9CisKKyAgZ2V0IF92aWV3ZXJFbGVtZW50KCkgeworICAgIHJldHVybiAoMCwgX3BkZi5zaGFkb3cpKHRoaXMsICJfdmlld2VyRWxlbWVudCIsIHRoaXMuX3NoYWRvd1ZpZXdlcik7CisgIH0KKworICBfcmVzZXRWaWV3KCkgeworICAgIHN1cGVyLl9yZXNldFZpZXcoKTsKKworICAgIHRoaXMuX3ByZXZpb3VzUGFnZU51bWJlciA9IDE7CisgICAgdGhpcy5fc2hhZG93Vmlld2VyID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworICAgIHRoaXMuX3VwZGF0ZVNjcm9sbERvd24gPSBudWxsOworICB9CisKKyAgX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpIHsKKyAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07CisgICAgY29uc3QgcHJldmlvdXNQYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX3ByZXZpb3VzUGFnZU51bWJlciAtIDFdOworICAgIGNvbnN0IHZpZXdlck5vZGVzID0gdGhpcy52aWV3ZXIuY2hpbGROb2RlczsKKworICAgIHN3aXRjaCAodmlld2VyTm9kZXMubGVuZ3RoKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHRoaXMudmlld2VyLmFwcGVuZENoaWxkKHBhZ2VWaWV3LmRpdik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDE6CisgICAgICAgIGlmICh2aWV3ZXJOb2Rlc1swXSAhPT0gcHJldmlvdXNQYWdlVmlldy5kaXYpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIl9lbnN1cmVQYWdlVmlld1Zpc2libGU6IFVuZXhwZWN0ZWQgcHJldmlvdXNseSB2aXNpYmxlIHBhZ2UuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFnZVZpZXcgPT09IHByZXZpb3VzUGFnZVZpZXcpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3NoYWRvd1ZpZXdlci5hcHBlbmRDaGlsZChwcmV2aW91c1BhZ2VWaWV3LmRpdik7CisKKyAgICAgICAgdGhpcy52aWV3ZXIuYXBwZW5kQ2hpbGQocGFnZVZpZXcuZGl2KTsKKyAgICAgICAgdGhpcy5jb250YWluZXIuc2Nyb2xsVG9wID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZTogT25seSBvbmUgcGFnZSBzaG91bGQgYmUgdmlzaWJsZSBhdCBhIHRpbWUuIik7CisgICAgfQorCisgICAgdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXI7CisgIH0KKworICBfc2Nyb2xsVXBkYXRlKCkgeworICAgIGlmICh0aGlzLl91cGRhdGVTY3JvbGxEb3duKSB7CisgICAgICB0aGlzLl91cGRhdGVTY3JvbGxEb3duKCk7CisgICAgfQorCisgICAgc3VwZXIuX3Njcm9sbFVwZGF0ZSgpOworICB9CisKKyAgX3Njcm9sbEludG9WaWV3KHsKKyAgICBwYWdlRGl2LAorICAgIHBhZ2VTcG90ID0gbnVsbCwKKyAgICBwYWdlTnVtYmVyID0gbnVsbAorICB9KSB7CisgICAgaWYgKHBhZ2VOdW1iZXIpIHsKKyAgICAgIHRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKHBhZ2VOdW1iZXIpOworICAgIH0KKworICAgIGNvbnN0IHNjcm9sbGVkRG93biA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID49IHRoaXMuX3ByZXZpb3VzUGFnZU51bWJlcjsKKworICAgIHRoaXMuX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpOworCisgICAgdGhpcy51cGRhdGUoKTsKKworICAgIHN1cGVyLl9zY3JvbGxJbnRvVmlldyh7CisgICAgICBwYWdlRGl2LAorICAgICAgcGFnZVNwb3QsCisgICAgICBwYWdlTnVtYmVyCisgICAgfSk7CisKKyAgICB0aGlzLl91cGRhdGVTY3JvbGxEb3duID0gKCkgPT4geworICAgICAgdGhpcy5zY3JvbGwuZG93biA9IHNjcm9sbGVkRG93bjsKKyAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbERvd24gPSBudWxsOworICAgIH07CisgIH0KKworICBfZ2V0VmlzaWJsZVBhZ2VzKCkgeworICAgIHJldHVybiB0aGlzLl9nZXRDdXJyZW50VmlzaWJsZVBhZ2UoKTsKKyAgfQorCisgIF91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKSB7fQorCisgIGdldCBfaXNTY3JvbGxNb2RlSG9yaXpvbnRhbCgpIHsKKyAgICByZXR1cm4gKDAsIF9wZGYuc2hhZG93KSh0aGlzLCAiX2lzU2Nyb2xsTW9kZUhvcml6b250YWwiLCBmYWxzZSk7CisgIH0KKworICBfdXBkYXRlU2Nyb2xsTW9kZSgpIHt9CisKKyAgX3VwZGF0ZVNwcmVhZE1vZGUoKSB7fQorCit9CisKK2V4cG9ydHMuUERGU2luZ2xlUGFnZVZpZXdlciA9IFBERlNpbmdsZVBhZ2VWaWV3ZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9wZGZfdGh1bWJuYWlsX3ZpZXcuanMgYi9saWIvd2ViL3BkZl90aHVtYm5haWxfdmlldy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZlMThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9wZGZfdGh1bWJuYWlsX3ZpZXcuanMKQEAgLTAsMCArMSw0MzggQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERlRodW1ibmFpbFZpZXcgPSB2b2lkIDA7CisKK3ZhciBfcGRmID0gcmVxdWlyZSgiLi4vcGRmIik7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK3ZhciBfcGRmX3JlbmRlcmluZ19xdWV1ZSA9IHJlcXVpcmUoIi4vcGRmX3JlbmRlcmluZ19xdWV1ZS5qcyIpOworCitjb25zdCBNQVhfTlVNX1NDQUxJTkdfU1RFUFMgPSAzOworY29uc3QgVEhVTUJOQUlMX0NBTlZBU19CT1JERVJfV0lEVEggPSAxOworY29uc3QgVEhVTUJOQUlMX1dJRFRIID0gOTg7CisKK2NvbnN0IFRlbXBJbWFnZUZhY3RvcnkgPSBmdW5jdGlvbiBUZW1wSW1hZ2VGYWN0b3J5Q2xvc3VyZSgpIHsKKyAgbGV0IHRlbXBDYW52YXNDYWNoZSA9IG51bGw7CisgIHJldHVybiB7CisgICAgZ2V0Q2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKKyAgICAgIGxldCB0ZW1wQ2FudmFzID0gdGVtcENhbnZhc0NhY2hlOworCisgICAgICBpZiAoIXRlbXBDYW52YXMpIHsKKyAgICAgICAgdGVtcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworICAgICAgICB0ZW1wQ2FudmFzQ2FjaGUgPSB0ZW1wQ2FudmFzOworICAgICAgfQorCisgICAgICB0ZW1wQ2FudmFzLndpZHRoID0gd2lkdGg7CisgICAgICB0ZW1wQ2FudmFzLmhlaWdodCA9IGhlaWdodDsKKyAgICAgIHRlbXBDYW52YXMubW96T3BhcXVlID0gdHJ1ZTsKKyAgICAgIGNvbnN0IGN0eCA9IHRlbXBDYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CisgICAgICAgIGFscGhhOiBmYWxzZQorICAgICAgfSk7CisgICAgICBjdHguc2F2ZSgpOworICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2IoMjU1LCAyNTUsIDI1NSkiOworICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgY3R4LnJlc3RvcmUoKTsKKyAgICAgIHJldHVybiB0ZW1wQ2FudmFzOworICAgIH0sCisKKyAgICBkZXN0cm95Q2FudmFzKCkgeworICAgICAgY29uc3QgdGVtcENhbnZhcyA9IHRlbXBDYW52YXNDYWNoZTsKKworICAgICAgaWYgKHRlbXBDYW52YXMpIHsKKyAgICAgICAgdGVtcENhbnZhcy53aWR0aCA9IDA7CisgICAgICAgIHRlbXBDYW52YXMuaGVpZ2h0ID0gMDsKKyAgICAgIH0KKworICAgICAgdGVtcENhbnZhc0NhY2hlID0gbnVsbDsKKyAgICB9CisKKyAgfTsKK30oKTsKKworY2xhc3MgUERGVGh1bWJuYWlsVmlldyB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBjb250YWluZXIsCisgICAgaWQsCisgICAgZGVmYXVsdFZpZXdwb3J0LAorICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UsCisgICAgbGlua1NlcnZpY2UsCisgICAgcmVuZGVyaW5nUXVldWUsCisgICAgY2hlY2tTZXRJbWFnZURpc2FibGVkLAorICAgIGRpc2FibGVDYW52YXNUb0ltYWdlQ29udmVyc2lvbiA9IGZhbHNlLAorICAgIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4KKyAgfSkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgICB0aGlzLnJlbmRlcmluZ0lkID0gInRodW1ibmFpbCIgKyBpZDsKKyAgICB0aGlzLnBhZ2VMYWJlbCA9IG51bGw7CisgICAgdGhpcy5wZGZQYWdlID0gbnVsbDsKKyAgICB0aGlzLnJvdGF0aW9uID0gMDsKKyAgICB0aGlzLnZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0OworICAgIHRoaXMucGRmUGFnZVJvdGF0ZSA9IGRlZmF1bHRWaWV3cG9ydC5yb3RhdGlvbjsKKyAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSB8fCBudWxsOworICAgIHRoaXMubGlua1NlcnZpY2UgPSBsaW5rU2VydmljZTsKKyAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gcmVuZGVyaW5nUXVldWU7CisgICAgdGhpcy5yZW5kZXJUYXNrID0gbnVsbDsKKyAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw7CisgICAgdGhpcy5yZXN1bWUgPSBudWxsOworCisgICAgdGhpcy5fY2hlY2tTZXRJbWFnZURpc2FibGVkID0gY2hlY2tTZXRJbWFnZURpc2FibGVkIHx8IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworCisgICAgdGhpcy5kaXNhYmxlQ2FudmFzVG9JbWFnZUNvbnZlcnNpb24gPSBkaXNhYmxlQ2FudmFzVG9JbWFnZUNvbnZlcnNpb247CisgICAgdGhpcy5wYWdlV2lkdGggPSB0aGlzLnZpZXdwb3J0LndpZHRoOworICAgIHRoaXMucGFnZUhlaWdodCA9IHRoaXMudmlld3BvcnQuaGVpZ2h0OworICAgIHRoaXMucGFnZVJhdGlvID0gdGhpcy5wYWdlV2lkdGggLyB0aGlzLnBhZ2VIZWlnaHQ7CisgICAgdGhpcy5jYW52YXNXaWR0aCA9IFRIVU1CTkFJTF9XSURUSDsKKyAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHRoaXMuY2FudmFzV2lkdGggLyB0aGlzLnBhZ2VSYXRpbyB8IDA7CisgICAgdGhpcy5zY2FsZSA9IHRoaXMuY2FudmFzV2lkdGggLyB0aGlzLnBhZ2VXaWR0aDsKKyAgICB0aGlzLmwxMG4gPSBsMTBuOworICAgIGNvbnN0IGFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICBhbmNob3IuaHJlZiA9IGxpbmtTZXJ2aWNlLmdldEFuY2hvclVybCgiI3BhZ2U9IiArIGlkKTsKKworICAgIHRoaXMuX3RodW1iUGFnZVRpdGxlLnRoZW4obXNnID0+IHsKKyAgICAgIGFuY2hvci50aXRsZSA9IG1zZzsKKyAgICB9KTsKKworICAgIGFuY2hvci5vbmNsaWNrID0gZnVuY3Rpb24gKCkgeworICAgICAgbGlua1NlcnZpY2UucGFnZSA9IGlkOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisKKyAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjsKKyAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICBkaXYuY2xhc3NOYW1lID0gInRodW1ibmFpbCI7CisgICAgZGl2LnNldEF0dHJpYnV0ZSgiZGF0YS1wYWdlLW51bWJlciIsIHRoaXMuaWQpOworICAgIHRoaXMuZGl2ID0gZGl2OworICAgIGNvbnN0IHJpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICByaW5nLmNsYXNzTmFtZSA9ICJ0aHVtYm5haWxTZWxlY3Rpb25SaW5nIjsKKyAgICBjb25zdCBib3JkZXJBZGp1c3RtZW50ID0gMiAqIFRIVU1CTkFJTF9DQU5WQVNfQk9SREVSX1dJRFRIOworICAgIHJpbmcuc3R5bGUud2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoICsgYm9yZGVyQWRqdXN0bWVudCArICJweCI7CisgICAgcmluZy5zdHlsZS5oZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodCArIGJvcmRlckFkanVzdG1lbnQgKyAicHgiOworICAgIHRoaXMucmluZyA9IHJpbmc7CisgICAgZGl2LmFwcGVuZENoaWxkKHJpbmcpOworICAgIGFuY2hvci5hcHBlbmRDaGlsZChkaXYpOworICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhbmNob3IpOworICB9CisKKyAgc2V0UGRmUGFnZShwZGZQYWdlKSB7CisgICAgdGhpcy5wZGZQYWdlID0gcGRmUGFnZTsKKyAgICB0aGlzLnBkZlBhZ2VSb3RhdGUgPSBwZGZQYWdlLnJvdGF0ZTsKKyAgICBjb25zdCB0b3RhbFJvdGF0aW9uID0gKHRoaXMucm90YXRpb24gKyB0aGlzLnBkZlBhZ2VSb3RhdGUpICUgMzYwOworICAgIHRoaXMudmlld3BvcnQgPSBwZGZQYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgIHNjYWxlOiAxLAorICAgICAgcm90YXRpb246IHRvdGFsUm90YXRpb24KKyAgICB9KTsKKyAgICB0aGlzLnJlc2V0KCk7CisgIH0KKworICByZXNldCgpIHsKKyAgICB0aGlzLmNhbmNlbFJlbmRlcmluZygpOworICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuSU5JVElBTDsKKyAgICB0aGlzLnBhZ2VXaWR0aCA9IHRoaXMudmlld3BvcnQud2lkdGg7CisgICAgdGhpcy5wYWdlSGVpZ2h0ID0gdGhpcy52aWV3cG9ydC5oZWlnaHQ7CisgICAgdGhpcy5wYWdlUmF0aW8gPSB0aGlzLnBhZ2VXaWR0aCAvIHRoaXMucGFnZUhlaWdodDsKKyAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHRoaXMuY2FudmFzV2lkdGggLyB0aGlzLnBhZ2VSYXRpbyB8IDA7CisgICAgdGhpcy5zY2FsZSA9IHRoaXMuY2FudmFzV2lkdGggLyB0aGlzLnBhZ2VXaWR0aDsKKyAgICB0aGlzLmRpdi5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbG9hZGVkIik7CisgICAgY29uc3QgcmluZyA9IHRoaXMucmluZzsKKyAgICBjb25zdCBjaGlsZE5vZGVzID0gcmluZy5jaGlsZE5vZGVzOworCisgICAgZm9yIChsZXQgaSA9IGNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIHJpbmcucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpXSk7CisgICAgfQorCisgICAgY29uc3QgYm9yZGVyQWRqdXN0bWVudCA9IDIgKiBUSFVNQk5BSUxfQ0FOVkFTX0JPUkRFUl9XSURUSDsKKyAgICByaW5nLnN0eWxlLndpZHRoID0gdGhpcy5jYW52YXNXaWR0aCArIGJvcmRlckFkanVzdG1lbnQgKyAicHgiOworICAgIHJpbmcuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQgKyBib3JkZXJBZGp1c3RtZW50ICsgInB4IjsKKworICAgIGlmICh0aGlzLmNhbnZhcykgeworICAgICAgdGhpcy5jYW52YXMud2lkdGggPSAwOworICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gMDsKKyAgICAgIGRlbGV0ZSB0aGlzLmNhbnZhczsKKyAgICB9CisKKyAgICBpZiAodGhpcy5pbWFnZSkgeworICAgICAgdGhpcy5pbWFnZS5yZW1vdmVBdHRyaWJ1dGUoInNyYyIpOworICAgICAgZGVsZXRlIHRoaXMuaW1hZ2U7CisgICAgfQorICB9CisKKyAgdXBkYXRlKHJvdGF0aW9uKSB7CisgICAgaWYgKHR5cGVvZiByb3RhdGlvbiAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgIHRoaXMucm90YXRpb24gPSByb3RhdGlvbjsKKyAgICB9CisKKyAgICBjb25zdCB0b3RhbFJvdGF0aW9uID0gKHRoaXMucm90YXRpb24gKyB0aGlzLnBkZlBhZ2VSb3RhdGUpICUgMzYwOworICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0LmNsb25lKHsKKyAgICAgIHNjYWxlOiAxLAorICAgICAgcm90YXRpb246IHRvdGFsUm90YXRpb24KKyAgICB9KTsKKyAgICB0aGlzLnJlc2V0KCk7CisgIH0KKworICBjYW5jZWxSZW5kZXJpbmcoKSB7CisgICAgaWYgKHRoaXMucmVuZGVyVGFzaykgeworICAgICAgdGhpcy5yZW5kZXJUYXNrLmNhbmNlbCgpOworICAgICAgdGhpcy5yZW5kZXJUYXNrID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLnJlc3VtZSA9IG51bGw7CisgIH0KKworICBfZ2V0UGFnZURyYXdDb250ZXh0KG5vQ3R4U2NhbGUgPSBmYWxzZSkgeworICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworICAgIHRoaXMuY2FudmFzID0gY2FudmFzOworICAgIGNhbnZhcy5tb3pPcGFxdWUgPSB0cnVlOworICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIsIHsKKyAgICAgIGFscGhhOiBmYWxzZQorICAgIH0pOworICAgIGNvbnN0IG91dHB1dFNjYWxlID0gKDAsIF91aV91dGlscy5nZXRPdXRwdXRTY2FsZSkoY3R4KTsKKyAgICBjYW52YXMud2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoICogb3V0cHV0U2NhbGUuc3ggfCAwOworICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodCAqIG91dHB1dFNjYWxlLnN5IHwgMDsKKyAgICBjYW52YXMuc3R5bGUud2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoICsgInB4IjsKKyAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQgKyAicHgiOworCisgICAgaWYgKCFub0N0eFNjYWxlICYmIG91dHB1dFNjYWxlLnNjYWxlZCkgeworICAgICAgY3R4LnNjYWxlKG91dHB1dFNjYWxlLnN4LCBvdXRwdXRTY2FsZS5zeSk7CisgICAgfQorCisgICAgcmV0dXJuIGN0eDsKKyAgfQorCisgIF9jb252ZXJ0Q2FudmFzVG9JbWFnZSgpIHsKKyAgICBpZiAoIXRoaXMuY2FudmFzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMucmVuZGVyaW5nU3RhdGUgIT09IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNsYXNzTmFtZSA9ICJ0aHVtYm5haWxJbWFnZSI7CisKKyAgICBpZiAodGhpcy5kaXNhYmxlQ2FudmFzVG9JbWFnZUNvbnZlcnNpb24pIHsKKyAgICAgIHRoaXMuY2FudmFzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKworICAgICAgdGhpcy5fdGh1bWJQYWdlQ2FudmFzLnRoZW4obXNnID0+IHsKKyAgICAgICAgdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgbXNnKTsKKyAgICAgIH0pOworCisgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoImRhdGEtbG9hZGVkIiwgdHJ1ZSk7CisgICAgICB0aGlzLnJpbmcuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CisgICAgaW1hZ2UuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworCisgICAgdGhpcy5fdGh1bWJQYWdlQ2FudmFzLnRoZW4obXNnID0+IHsKKyAgICAgIGltYWdlLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIG1zZyk7CisgICAgfSk7CisKKyAgICBpbWFnZS5zdHlsZS53aWR0aCA9IHRoaXMuY2FudmFzV2lkdGggKyAicHgiOworICAgIGltYWdlLnN0eWxlLmhlaWdodCA9IHRoaXMuY2FudmFzSGVpZ2h0ICsgInB4IjsKKyAgICBpbWFnZS5zcmMgPSB0aGlzLmNhbnZhcy50b0RhdGFVUkwoKTsKKyAgICB0aGlzLmltYWdlID0gaW1hZ2U7CisgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKCJkYXRhLWxvYWRlZCIsIHRydWUpOworICAgIHRoaXMucmluZy5hcHBlbmRDaGlsZChpbWFnZSk7CisgICAgdGhpcy5jYW52YXMud2lkdGggPSAwOworICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IDA7CisgICAgZGVsZXRlIHRoaXMuY2FudmFzOworICB9CisKKyAgZHJhdygpIHsKKyAgICBpZiAodGhpcy5yZW5kZXJpbmdTdGF0ZSAhPT0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLklOSVRJQUwpIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoIk11c3QgYmUgaW4gbmV3IHN0YXRlIGJlZm9yZSBkcmF3aW5nIik7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7CisgICAgfQorCisgICAgY29uc3QgeworICAgICAgcGRmUGFnZQorICAgIH0gPSB0aGlzOworCisgICAgaWYgKCFwZGZQYWdlKSB7CisgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOworICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigicGRmUGFnZSBpcyBub3QgbG9hZGVkIikpOworICAgIH0KKworICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuUlVOTklORzsKKyAgICBjb25zdCByZW5kZXJDYXBhYmlsaXR5ID0gKDAsIF9wZGYuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisKKyAgICBjb25zdCBmaW5pc2hSZW5kZXJUYXNrID0gZXJyb3IgPT4geworICAgICAgaWYgKHJlbmRlclRhc2sgPT09IHRoaXMucmVuZGVyVGFzaykgeworICAgICAgICB0aGlzLnJlbmRlclRhc2sgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBfcGRmLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikgeworICAgICAgICByZW5kZXJDYXBhYmlsaXR5LnJlc29sdmUodW5kZWZpbmVkKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOworCisgICAgICB0aGlzLl9jb252ZXJ0Q2FudmFzVG9JbWFnZSgpOworCisgICAgICBpZiAoIWVycm9yKSB7CisgICAgICAgIHJlbmRlckNhcGFiaWxpdHkucmVzb2x2ZSh1bmRlZmluZWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpOworICAgICAgfQorICAgIH07CisKKyAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRQYWdlRHJhd0NvbnRleHQoKTsKKworICAgIGNvbnN0IGRyYXdWaWV3cG9ydCA9IHRoaXMudmlld3BvcnQuY2xvbmUoeworICAgICAgc2NhbGU6IHRoaXMuc2NhbGUKKyAgICB9KTsKKworICAgIGNvbnN0IHJlbmRlckNvbnRpbnVlQ2FsbGJhY2sgPSBjb250ID0+IHsKKyAgICAgIGlmICghdGhpcy5yZW5kZXJpbmdRdWV1ZS5pc0hpZ2hlc3RQcmlvcml0eSh0aGlzKSkgeworICAgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLlBBVVNFRDsKKworICAgICAgICB0aGlzLnJlc3VtZSA9ICgpID0+IHsKKyAgICAgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLlJVTk5JTkc7CisgICAgICAgICAgY29udCgpOworICAgICAgICB9OworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29udCgpOworICAgIH07CisKKyAgICBjb25zdCByZW5kZXJDb250ZXh0ID0geworICAgICAgY2FudmFzQ29udGV4dDogY3R4LAorICAgICAgdmlld3BvcnQ6IGRyYXdWaWV3cG9ydCwKKyAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U6IHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UKKyAgICB9OworICAgIGNvbnN0IHJlbmRlclRhc2sgPSB0aGlzLnJlbmRlclRhc2sgPSBwZGZQYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KTsKKyAgICByZW5kZXJUYXNrLm9uQ29udGludWUgPSByZW5kZXJDb250aW51ZUNhbGxiYWNrOworICAgIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIGZpbmlzaFJlbmRlclRhc2sobnVsbCk7CisgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICBmaW5pc2hSZW5kZXJUYXNrKGVycm9yKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVuZGVyQ2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgc2V0SW1hZ2UocGFnZVZpZXcpIHsKKyAgICBpZiAodGhpcy5fY2hlY2tTZXRJbWFnZURpc2FibGVkKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5yZW5kZXJpbmdTdGF0ZSAhPT0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLklOSVRJQUwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBpbWcgPSBwYWdlVmlldy5jYW52YXM7CisKKyAgICBpZiAoIWltZykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGhpcy5wZGZQYWdlKSB7CisgICAgICB0aGlzLnNldFBkZlBhZ2UocGFnZVZpZXcucGRmUGFnZSk7CisgICAgfQorCisgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDsKKworICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldFBhZ2VEcmF3Q29udGV4dCh0cnVlKTsKKworICAgIGNvbnN0IGNhbnZhcyA9IGN0eC5jYW52YXM7CisKKyAgICBpZiAoaW1nLndpZHRoIDw9IDIgKiBjYW52YXMud2lkdGgpIHsKKyAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CisKKyAgICAgIHRoaXMuX2NvbnZlcnRDYW52YXNUb0ltYWdlKCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZXQgcmVkdWNlZFdpZHRoID0gY2FudmFzLndpZHRoIDw8IE1BWF9OVU1fU0NBTElOR19TVEVQUzsKKyAgICBsZXQgcmVkdWNlZEhlaWdodCA9IGNhbnZhcy5oZWlnaHQgPDwgTUFYX05VTV9TQ0FMSU5HX1NURVBTOworICAgIGNvbnN0IHJlZHVjZWRJbWFnZSA9IFRlbXBJbWFnZUZhY3RvcnkuZ2V0Q2FudmFzKHJlZHVjZWRXaWR0aCwgcmVkdWNlZEhlaWdodCk7CisgICAgY29uc3QgcmVkdWNlZEltYWdlQ3R4ID0gcmVkdWNlZEltYWdlLmdldENvbnRleHQoIjJkIik7CisKKyAgICB3aGlsZSAocmVkdWNlZFdpZHRoID4gaW1nLndpZHRoIHx8IHJlZHVjZWRIZWlnaHQgPiBpbWcuaGVpZ2h0KSB7CisgICAgICByZWR1Y2VkV2lkdGggPj49IDE7CisgICAgICByZWR1Y2VkSGVpZ2h0ID4+PSAxOworICAgIH0KKworICAgIHJlZHVjZWRJbWFnZUN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQsIDAsIDAsIHJlZHVjZWRXaWR0aCwgcmVkdWNlZEhlaWdodCk7CisKKyAgICB3aGlsZSAocmVkdWNlZFdpZHRoID4gMiAqIGNhbnZhcy53aWR0aCkgeworICAgICAgcmVkdWNlZEltYWdlQ3R4LmRyYXdJbWFnZShyZWR1Y2VkSW1hZ2UsIDAsIDAsIHJlZHVjZWRXaWR0aCwgcmVkdWNlZEhlaWdodCwgMCwgMCwgcmVkdWNlZFdpZHRoID4+IDEsIHJlZHVjZWRIZWlnaHQgPj4gMSk7CisgICAgICByZWR1Y2VkV2lkdGggPj49IDE7CisgICAgICByZWR1Y2VkSGVpZ2h0ID4+PSAxOworICAgIH0KKworICAgIGN0eC5kcmF3SW1hZ2UocmVkdWNlZEltYWdlLCAwLCAwLCByZWR1Y2VkV2lkdGgsIHJlZHVjZWRIZWlnaHQsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CisKKyAgICB0aGlzLl9jb252ZXJ0Q2FudmFzVG9JbWFnZSgpOworICB9CisKKyAgZ2V0IF90aHVtYlBhZ2VUaXRsZSgpIHsKKyAgICByZXR1cm4gdGhpcy5sMTBuLmdldCgidGh1bWJfcGFnZV90aXRsZSIsIHsKKyAgICAgIHBhZ2U6IHRoaXMucGFnZUxhYmVsID8/IHRoaXMuaWQKKyAgICB9LCAiUGFnZSB7e3BhZ2V9fSIpOworICB9CisKKyAgZ2V0IF90aHVtYlBhZ2VDYW52YXMoKSB7CisgICAgcmV0dXJuIHRoaXMubDEwbi5nZXQoInRodW1iX3BhZ2VfY2FudmFzIiwgeworICAgICAgcGFnZTogdGhpcy5wYWdlTGFiZWwgPz8gdGhpcy5pZAorICAgIH0sICJUaHVtYm5haWwgb2YgUGFnZSB7e3BhZ2V9fSIpOworICB9CisKKyAgc2V0UGFnZUxhYmVsKGxhYmVsKSB7CisgICAgdGhpcy5wYWdlTGFiZWwgPSB0eXBlb2YgbGFiZWwgPT09ICJzdHJpbmciID8gbGFiZWwgOiBudWxsOworCisgICAgdGhpcy5fdGh1bWJQYWdlVGl0bGUudGhlbihtc2cgPT4geworICAgICAgdGhpcy5hbmNob3IudGl0bGUgPSBtc2c7CisgICAgfSk7CisKKyAgICBpZiAodGhpcy5yZW5kZXJpbmdTdGF0ZSAhPT0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fdGh1bWJQYWdlQ2FudmFzLnRoZW4obXNnID0+IHsKKyAgICAgIGlmICh0aGlzLmltYWdlKSB7CisgICAgICAgIHRoaXMuaW1hZ2Uuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgbXNnKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNhYmxlQ2FudmFzVG9JbWFnZUNvbnZlcnNpb24gJiYgdGhpcy5jYW52YXMpIHsKKyAgICAgICAgdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgbXNnKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHN0YXRpYyBjbGVhbnVwKCkgeworICAgIFRlbXBJbWFnZUZhY3RvcnkuZGVzdHJveUNhbnZhcygpOworICB9CisKK30KKworZXhwb3J0cy5QREZUaHVtYm5haWxWaWV3ID0gUERGVGh1bWJuYWlsVmlldzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3BkZl90aHVtYm5haWxfdmlld2VyLmpzIGIvbGliL3dlYi9wZGZfdGh1bWJuYWlsX3ZpZXdlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2Q5MzQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3dlYi9wZGZfdGh1bWJuYWlsX3ZpZXdlci5qcwpAQCAtMCwwICsxLDI4OCBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGVGh1bWJuYWlsVmlld2VyID0gdm9pZCAwOworCit2YXIgX3VpX3V0aWxzID0gcmVxdWlyZSgiLi91aV91dGlscy5qcyIpOworCit2YXIgX3BkZl90aHVtYm5haWxfdmlldyA9IHJlcXVpcmUoIi4vcGRmX3RodW1ibmFpbF92aWV3LmpzIik7CisKK2NvbnN0IFRIVU1CTkFJTF9TQ1JPTExfTUFSR0lOID0gLTE5OworY29uc3QgVEhVTUJOQUlMX1NFTEVDVEVEX0NMQVNTID0gInNlbGVjdGVkIjsKKworY2xhc3MgUERGVGh1bWJuYWlsVmlld2VyIHsKKyAgY29uc3RydWN0b3IoeworICAgIGNvbnRhaW5lciwKKyAgICBldmVudEJ1cywKKyAgICBsaW5rU2VydmljZSwKKyAgICByZW5kZXJpbmdRdWV1ZSwKKyAgICBsMTBuID0gX3VpX3V0aWxzLk51bGxMMTBuCisgIH0pIHsKKyAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICB0aGlzLmxpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7CisgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZSA9IHJlbmRlcmluZ1F1ZXVlOworICAgIHRoaXMubDEwbiA9IGwxMG47CisgICAgdGhpcy5zY3JvbGwgPSAoMCwgX3VpX3V0aWxzLndhdGNoU2Nyb2xsKSh0aGlzLmNvbnRhaW5lciwgdGhpcy5fc2Nyb2xsVXBkYXRlZC5iaW5kKHRoaXMpKTsKKworICAgIHRoaXMuX3Jlc2V0VmlldygpOworCisgICAgZXZlbnRCdXMuX29uKCJvcHRpb25hbGNvbnRlbnRjb25maWdjaGFuZ2VkIiwgKCkgPT4geworICAgICAgdGhpcy5fc2V0SW1hZ2VEaXNhYmxlZCA9IHRydWU7CisgICAgfSk7CisgIH0KKworICBfc2Nyb2xsVXBkYXRlZCgpIHsKKyAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlLnJlbmRlckhpZ2hlc3RQcmlvcml0eSgpOworICB9CisKKyAgZ2V0VGh1bWJuYWlsKGluZGV4KSB7CisgICAgcmV0dXJuIHRoaXMuX3RodW1ibmFpbHNbaW5kZXhdOworICB9CisKKyAgX2dldFZpc2libGVUaHVtYnMoKSB7CisgICAgcmV0dXJuICgwLCBfdWlfdXRpbHMuZ2V0VmlzaWJsZUVsZW1lbnRzKSh0aGlzLmNvbnRhaW5lciwgdGhpcy5fdGh1bWJuYWlscyk7CisgIH0KKworICBzY3JvbGxUaHVtYm5haWxJbnRvVmlldyhwYWdlTnVtYmVyKSB7CisgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdGh1bWJuYWlsVmlldyA9IHRoaXMuX3RodW1ibmFpbHNbcGFnZU51bWJlciAtIDFdOworCisgICAgaWYgKCF0aHVtYm5haWxWaWV3KSB7CisgICAgICBjb25zb2xlLmVycm9yKCdzY3JvbGxUaHVtYm5haWxJbnRvVmlldzogSW52YWxpZCAicGFnZU51bWJlciIgcGFyYW1ldGVyLicpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwYWdlTnVtYmVyICE9PSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcikgeworICAgICAgY29uc3QgcHJldlRodW1ibmFpbFZpZXcgPSB0aGlzLl90aHVtYm5haWxzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07CisgICAgICBwcmV2VGh1bWJuYWlsVmlldy5kaXYuY2xhc3NMaXN0LnJlbW92ZShUSFVNQk5BSUxfU0VMRUNURURfQ0xBU1MpOworICAgICAgdGh1bWJuYWlsVmlldy5kaXYuY2xhc3NMaXN0LmFkZChUSFVNQk5BSUxfU0VMRUNURURfQ0xBU1MpOworICAgIH0KKworICAgIGNvbnN0IHZpc2libGVUaHVtYnMgPSB0aGlzLl9nZXRWaXNpYmxlVGh1bWJzKCk7CisKKyAgICBjb25zdCBudW1WaXNpYmxlVGh1bWJzID0gdmlzaWJsZVRodW1icy52aWV3cy5sZW5ndGg7CisKKyAgICBpZiAobnVtVmlzaWJsZVRodW1icyA+IDApIHsKKyAgICAgIGNvbnN0IGZpcnN0ID0gdmlzaWJsZVRodW1icy5maXJzdC5pZDsKKyAgICAgIGNvbnN0IGxhc3QgPSBudW1WaXNpYmxlVGh1bWJzID4gMSA/IHZpc2libGVUaHVtYnMubGFzdC5pZCA6IGZpcnN0OworICAgICAgbGV0IHNob3VsZFNjcm9sbCA9IGZhbHNlOworCisgICAgICBpZiAocGFnZU51bWJlciA8PSBmaXJzdCB8fCBwYWdlTnVtYmVyID49IGxhc3QpIHsKKyAgICAgICAgc2hvdWxkU2Nyb2xsID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpc2libGVUaHVtYnMudmlld3Muc29tZShmdW5jdGlvbiAodmlldykgeworICAgICAgICAgIGlmICh2aWV3LmlkICE9PSBwYWdlTnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2hvdWxkU2Nyb2xsID0gdmlldy5wZXJjZW50IDwgMTAwOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgaWYgKHNob3VsZFNjcm9sbCkgeworICAgICAgICAoMCwgX3VpX3V0aWxzLnNjcm9sbEludG9WaWV3KSh0aHVtYm5haWxWaWV3LmRpdiwgeworICAgICAgICAgIHRvcDogVEhVTUJOQUlMX1NDUk9MTF9NQVJHSU4KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSBwYWdlTnVtYmVyOworICB9CisKKyAgZ2V0IHBhZ2VzUm90YXRpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuX3BhZ2VzUm90YXRpb247CisgIH0KKworICBzZXQgcGFnZXNSb3RhdGlvbihyb3RhdGlvbikgeworICAgIGlmICghKDAsIF91aV91dGlscy5pc1ZhbGlkUm90YXRpb24pKHJvdGF0aW9uKSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHRodW1ibmFpbHMgcm90YXRpb24gYW5nbGUuIik7CisgICAgfQorCisgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX3BhZ2VzUm90YXRpb24gPT09IHJvdGF0aW9uKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IHJvdGF0aW9uOworCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fdGh1bWJuYWlscy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB0aGlzLl90aHVtYm5haWxzW2ldLnVwZGF0ZShyb3RhdGlvbik7CisgICAgfQorICB9CisKKyAgY2xlYW51cCgpIHsKKyAgICBfcGRmX3RodW1ibmFpbF92aWV3LlBERlRodW1ibmFpbFZpZXcuY2xlYW51cCgpOworICB9CisKKyAgX3Jlc2V0VmlldygpIHsKKyAgICB0aGlzLl90aHVtYm5haWxzID0gW107CisgICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSAxOworICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBudWxsOworICAgIHRoaXMuX3BhZ2VzUm90YXRpb24gPSAwOworICAgIHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBudWxsOworICAgIHRoaXMuX3BhZ2VzUmVxdWVzdHMgPSBuZXcgV2Vha01hcCgpOworICAgIHRoaXMuX3NldEltYWdlRGlzYWJsZWQgPSBmYWxzZTsKKyAgICB0aGlzLmNvbnRhaW5lci50ZXh0Q29udGVudCA9ICIiOworICB9CisKKyAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHsKKyAgICBpZiAodGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgdGhpcy5fY2FuY2VsUmVuZGVyaW5nKCk7CisKKyAgICAgIHRoaXMuX3Jlc2V0VmlldygpOworICAgIH0KKworICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDsKKworICAgIGlmICghcGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBmaXJzdFBhZ2VQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0UGFnZSgxKTsKKyAgICBjb25zdCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7CisgICAgZmlyc3RQYWdlUHJvbWlzZS50aGVuKGZpcnN0UGRmUGFnZSA9PiB7CisgICAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTsKKyAgICAgIGNvbnN0IHBhZ2VzQ291bnQgPSBwZGZEb2N1bWVudC5udW1QYWdlczsKKyAgICAgIGNvbnN0IHZpZXdwb3J0ID0gZmlyc3RQZGZQYWdlLmdldFZpZXdwb3J0KHsKKyAgICAgICAgc2NhbGU6IDEKKyAgICAgIH0pOworCisgICAgICBjb25zdCBjaGVja1NldEltYWdlRGlzYWJsZWQgPSAoKSA9PiB7CisgICAgICAgIHJldHVybiB0aGlzLl9zZXRJbWFnZURpc2FibGVkOworICAgICAgfTsKKworICAgICAgZm9yIChsZXQgcGFnZU51bSA9IDE7IHBhZ2VOdW0gPD0gcGFnZXNDb3VudDsgKytwYWdlTnVtKSB7CisgICAgICAgIGNvbnN0IHRodW1ibmFpbCA9IG5ldyBfcGRmX3RodW1ibmFpbF92aWV3LlBERlRodW1ibmFpbFZpZXcoeworICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIsCisgICAgICAgICAgaWQ6IHBhZ2VOdW0sCisgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiB2aWV3cG9ydC5jbG9uZSgpLAorICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UsCisgICAgICAgICAgbGlua1NlcnZpY2U6IHRoaXMubGlua1NlcnZpY2UsCisgICAgICAgICAgcmVuZGVyaW5nUXVldWU6IHRoaXMucmVuZGVyaW5nUXVldWUsCisgICAgICAgICAgY2hlY2tTZXRJbWFnZURpc2FibGVkLAorICAgICAgICAgIGRpc2FibGVDYW52YXNUb0ltYWdlQ29udmVyc2lvbjogZmFsc2UsCisgICAgICAgICAgbDEwbjogdGhpcy5sMTBuCisgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX3RodW1ibmFpbHMucHVzaCh0aHVtYm5haWwpOworICAgICAgfQorCisgICAgICBjb25zdCBmaXJzdFRodW1ibmFpbFZpZXcgPSB0aGlzLl90aHVtYm5haWxzWzBdOworCisgICAgICBpZiAoZmlyc3RUaHVtYm5haWxWaWV3KSB7CisgICAgICAgIGZpcnN0VGh1bWJuYWlsVmlldy5zZXRQZGZQYWdlKGZpcnN0UGRmUGFnZSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHRodW1ibmFpbFZpZXcgPSB0aGlzLl90aHVtYm5haWxzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07CisgICAgICB0aHVtYm5haWxWaWV3LmRpdi5jbGFzc0xpc3QuYWRkKFRIVU1CTkFJTF9TRUxFQ1RFRF9DTEFTUyk7CisgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIHRodW1ibmFpbCB2aWV3ZXIiLCByZWFzb24pOworICAgIH0pOworICB9CisKKyAgX2NhbmNlbFJlbmRlcmluZygpIHsKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLl90aHVtYm5haWxzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGlmICh0aGlzLl90aHVtYm5haWxzW2ldKSB7CisgICAgICAgIHRoaXMuX3RodW1ibmFpbHNbaV0uY2FuY2VsUmVuZGVyaW5nKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2V0UGFnZUxhYmVscyhsYWJlbHMpIHsKKyAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWxhYmVscykgeworICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7CisgICAgfSBlbHNlIGlmICghKEFycmF5LmlzQXJyYXkobGFiZWxzKSAmJiB0aGlzLnBkZkRvY3VtZW50Lm51bVBhZ2VzID09PSBsYWJlbHMubGVuZ3RoKSkgeworICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7CisgICAgICBjb25zb2xlLmVycm9yKCJQREZUaHVtYm5haWxWaWV3ZXJfc2V0UGFnZUxhYmVsczogSW52YWxpZCBwYWdlIGxhYmVscy4iKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IGxhYmVsczsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLl90aHVtYm5haWxzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fcGFnZUxhYmVscyAmJiB0aGlzLl9wYWdlTGFiZWxzW2ldOworCisgICAgICB0aGlzLl90aHVtYm5haWxzW2ldLnNldFBhZ2VMYWJlbChsYWJlbCk7CisgICAgfQorICB9CisKKyAgX2Vuc3VyZVBkZlBhZ2VMb2FkZWQodGh1bWJWaWV3KSB7CisgICAgaWYgKHRodW1iVmlldy5wZGZQYWdlKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRodW1iVmlldy5wZGZQYWdlKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fcGFnZXNSZXF1ZXN0cy5oYXModGh1bWJWaWV3KSkgeworICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzUmVxdWVzdHMuZ2V0KHRodW1iVmlldyk7CisgICAgfQorCisgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZSh0aHVtYlZpZXcuaWQpLnRoZW4ocGRmUGFnZSA9PiB7CisgICAgICBpZiAoIXRodW1iVmlldy5wZGZQYWdlKSB7CisgICAgICAgIHRodW1iVmlldy5zZXRQZGZQYWdlKHBkZlBhZ2UpOworICAgICAgfQorCisgICAgICB0aGlzLl9wYWdlc1JlcXVlc3RzLmRlbGV0ZSh0aHVtYlZpZXcpOworCisgICAgICByZXR1cm4gcGRmUGFnZTsKKyAgICB9KS5jYXRjaChyZWFzb24gPT4geworICAgICAgY29uc29sZS5lcnJvcigiVW5hYmxlIHRvIGdldCBwYWdlIGZvciB0aHVtYiB2aWV3IiwgcmVhc29uKTsKKworICAgICAgdGhpcy5fcGFnZXNSZXF1ZXN0cy5kZWxldGUodGh1bWJWaWV3KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3BhZ2VzUmVxdWVzdHMuc2V0KHRodW1iVmlldywgcHJvbWlzZSk7CisKKyAgICByZXR1cm4gcHJvbWlzZTsKKyAgfQorCisgIGZvcmNlUmVuZGVyaW5nKCkgeworICAgIGNvbnN0IHZpc2libGVUaHVtYnMgPSB0aGlzLl9nZXRWaXNpYmxlVGh1bWJzKCk7CisKKyAgICBjb25zdCB0aHVtYlZpZXcgPSB0aGlzLnJlbmRlcmluZ1F1ZXVlLmdldEhpZ2hlc3RQcmlvcml0eSh2aXNpYmxlVGh1bWJzLCB0aGlzLl90aHVtYm5haWxzLCB0aGlzLnNjcm9sbC5kb3duKTsKKworICAgIGlmICh0aHVtYlZpZXcpIHsKKyAgICAgIHRoaXMuX2Vuc3VyZVBkZlBhZ2VMb2FkZWQodGh1bWJWaWV3KS50aGVuKCgpID0+IHsKKyAgICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZS5yZW5kZXJWaWV3KHRodW1iVmlldyk7CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKK30KKworZXhwb3J0cy5QREZUaHVtYm5haWxWaWV3ZXIgPSBQREZUaHVtYm5haWxWaWV3ZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9wZGZfdmlld2VyLmNvbXBvbmVudC5qcyBiL2xpYi93ZWIvcGRmX3ZpZXdlci5jb21wb25lbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzYjZjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvcGRmX3ZpZXdlci5jb21wb25lbnQuanMKQEAgLTAsMCArMSwxNDcgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkFubm90YXRpb25MYXllckJ1aWxkZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyLkFubm90YXRpb25MYXllckJ1aWxkZXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIuRGVmYXVsdEFubm90YXRpb25MYXllckZhY3Rvcnk7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJEZWZhdWx0VGV4dExheWVyRmFjdG9yeSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF90ZXh0X2xheWVyX2J1aWxkZXIuRGVmYXVsdFRleHRMYXllckZhY3Rvcnk7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJUZXh0TGF5ZXJCdWlsZGVyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3RleHRfbGF5ZXJfYnVpbGRlci5UZXh0TGF5ZXJCdWlsZGVyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiRXZlbnRCdXMiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdWlfdXRpbHMuRXZlbnRCdXM7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJOdWxsTDEwbiIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91aV91dGlscy5OdWxsTDEwbjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlByb2dyZXNzQmFyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3VpX3V0aWxzLlByb2dyZXNzQmFyOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGTGlua1NlcnZpY2UiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfcGRmX2xpbmtfc2VydmljZS5QREZMaW5rU2VydmljZTsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlNpbXBsZUxpbmtTZXJ2aWNlIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3BkZl9saW5rX3NlcnZpY2UuU2ltcGxlTGlua1NlcnZpY2U7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJEb3dubG9hZE1hbmFnZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfZG93bmxvYWRfbWFuYWdlci5Eb3dubG9hZE1hbmFnZXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJHZW5lcmljTDEwbiIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9nZW5lcmljbDEwbi5HZW5lcmljTDEwbjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERkZpbmRDb250cm9sbGVyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3BkZl9maW5kX2NvbnRyb2xsZXIuUERGRmluZENvbnRyb2xsZXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZIaXN0b3J5IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3BkZl9oaXN0b3J5LlBERkhpc3Rvcnk7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZQYWdlVmlldyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9wZGZfcGFnZV92aWV3LlBERlBhZ2VWaWV3OworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGU2luZ2xlUGFnZVZpZXdlciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9wZGZfc2luZ2xlX3BhZ2Vfdmlld2VyLlBERlNpbmdsZVBhZ2VWaWV3ZXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZWaWV3ZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfcGRmX3ZpZXdlci5QREZWaWV3ZXI7CisgIH0KK30pOworCit2YXIgX2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlciA9IHJlcXVpcmUoIi4vYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyLmpzIik7CisKK3ZhciBfdGV4dF9sYXllcl9idWlsZGVyID0gcmVxdWlyZSgiLi90ZXh0X2xheWVyX2J1aWxkZXIuanMiKTsKKwordmFyIF91aV91dGlscyA9IHJlcXVpcmUoIi4vdWlfdXRpbHMuanMiKTsKKwordmFyIF9wZGZfbGlua19zZXJ2aWNlID0gcmVxdWlyZSgiLi9wZGZfbGlua19zZXJ2aWNlLmpzIik7CisKK3ZhciBfZG93bmxvYWRfbWFuYWdlciA9IHJlcXVpcmUoIi4vZG93bmxvYWRfbWFuYWdlci5qcyIpOworCit2YXIgX2dlbmVyaWNsMTBuID0gcmVxdWlyZSgiLi9nZW5lcmljbDEwbi5qcyIpOworCit2YXIgX3BkZl9maW5kX2NvbnRyb2xsZXIgPSByZXF1aXJlKCIuL3BkZl9maW5kX2NvbnRyb2xsZXIuanMiKTsKKwordmFyIF9wZGZfaGlzdG9yeSA9IHJlcXVpcmUoIi4vcGRmX2hpc3RvcnkuanMiKTsKKwordmFyIF9wZGZfcGFnZV92aWV3ID0gcmVxdWlyZSgiLi9wZGZfcGFnZV92aWV3LmpzIik7CisKK3ZhciBfcGRmX3NpbmdsZV9wYWdlX3ZpZXdlciA9IHJlcXVpcmUoIi4vcGRmX3NpbmdsZV9wYWdlX3ZpZXdlci5qcyIpOworCit2YXIgX3BkZl92aWV3ZXIgPSByZXF1aXJlKCIuL3BkZl92aWV3ZXIuanMiKTsKKworY29uc3QgcGRmanNWZXJzaW9uID0gJzIuNi4zNDcnOworY29uc3QgcGRmanNCdWlsZCA9ICczYmU5YzY1Zic7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9wZGZfdmlld2VyLmpzIGIvbGliL3dlYi9wZGZfdmlld2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDAyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3BkZl92aWV3ZXIuanMKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERlZpZXdlciA9IHZvaWQgMDsKKwordmFyIF9iYXNlX3ZpZXdlciA9IHJlcXVpcmUoIi4vYmFzZV92aWV3ZXIuanMiKTsKKwordmFyIF9wZGYgPSByZXF1aXJlKCIuLi9wZGYiKTsKKworY2xhc3MgUERGVmlld2VyIGV4dGVuZHMgX2Jhc2Vfdmlld2VyLkJhc2VWaWV3ZXIgeworICBnZXQgX3ZpZXdlckVsZW1lbnQoKSB7CisgICAgcmV0dXJuICgwLCBfcGRmLnNoYWRvdykodGhpcywgIl92aWV3ZXJFbGVtZW50IiwgdGhpcy52aWV3ZXIpOworICB9CisKKyAgX3Njcm9sbEludG9WaWV3KHsKKyAgICBwYWdlRGl2LAorICAgIHBhZ2VTcG90ID0gbnVsbCwKKyAgICBwYWdlTnVtYmVyID0gbnVsbAorICB9KSB7CisgICAgaWYgKCFwYWdlU3BvdCAmJiAhdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkgeworICAgICAgY29uc3QgbGVmdCA9IHBhZ2VEaXYub2Zmc2V0TGVmdCArIHBhZ2VEaXYuY2xpZW50TGVmdDsKKyAgICAgIGNvbnN0IHJpZ2h0ID0gbGVmdCArIHBhZ2VEaXYuY2xpZW50V2lkdGg7CisgICAgICBjb25zdCB7CisgICAgICAgIHNjcm9sbExlZnQsCisgICAgICAgIGNsaWVudFdpZHRoCisgICAgICB9ID0gdGhpcy5jb250YWluZXI7CisKKyAgICAgIGlmICh0aGlzLl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsIHx8IGxlZnQgPCBzY3JvbGxMZWZ0IHx8IHJpZ2h0ID4gc2Nyb2xsTGVmdCArIGNsaWVudFdpZHRoKSB7CisgICAgICAgIHBhZ2VTcG90ID0geworICAgICAgICAgIGxlZnQ6IDAsCisgICAgICAgICAgdG9wOiAwCisgICAgICAgIH07CisgICAgICB9CisgICAgfQorCisgICAgc3VwZXIuX3Njcm9sbEludG9WaWV3KHsKKyAgICAgIHBhZ2VEaXYsCisgICAgICBwYWdlU3BvdCwKKyAgICAgIHBhZ2VOdW1iZXIKKyAgICB9KTsKKyAgfQorCisgIF9nZXRWaXNpYmxlUGFnZXMoKSB7CisgICAgaWYgKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUpIHsKKyAgICAgIHJldHVybiB0aGlzLl9nZXRDdXJyZW50VmlzaWJsZVBhZ2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VwZXIuX2dldFZpc2libGVQYWdlcygpOworICB9CisKKyAgX3VwZGF0ZUhlbHBlcih2aXNpYmxlUGFnZXMpIHsKKyAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxldCBjdXJyZW50SWQgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKyAgICBsZXQgc3RpbGxGdWxseVZpc2libGUgPSBmYWxzZTsKKworICAgIGZvciAoY29uc3QgcGFnZSBvZiB2aXNpYmxlUGFnZXMpIHsKKyAgICAgIGlmIChwYWdlLnBlcmNlbnQgPCAxMDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChwYWdlLmlkID09PSBjdXJyZW50SWQpIHsKKyAgICAgICAgc3RpbGxGdWxseVZpc2libGUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN0aWxsRnVsbHlWaXNpYmxlKSB7CisgICAgICBjdXJyZW50SWQgPSB2aXNpYmxlUGFnZXNbMF0uaWQ7CisgICAgfQorCisgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIoY3VycmVudElkKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGVmlld2VyID0gUERGVmlld2VyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvcHJlZmVyZW5jZXMuanMgYi9saWIvd2ViL3ByZWZlcmVuY2VzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzY4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3ByZWZlcmVuY2VzLmpzCkBAIC0wLDAgKzEsMTY1IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5CYXNlUHJlZmVyZW5jZXMgPSB2b2lkIDA7CisKK3ZhciBfYXBwX29wdGlvbnMgPSByZXF1aXJlKCIuL2FwcF9vcHRpb25zLmpzIik7CisKK2xldCBkZWZhdWx0UHJlZmVyZW5jZXMgPSBudWxsOworCitmdW5jdGlvbiBnZXREZWZhdWx0UHJlZmVyZW5jZXMoKSB7CisgIGlmICghZGVmYXVsdFByZWZlcmVuY2VzKSB7CisgICAgZGVmYXVsdFByZWZlcmVuY2VzID0gUHJvbWlzZS5yZXNvbHZlKHsKKyAgICAgICJjdXJzb3JUb29sT25Mb2FkIjogMCwKKyAgICAgICJkZWZhdWx0Wm9vbVZhbHVlIjogIiIsCisgICAgICAiZGlzYWJsZVBhZ2VMYWJlbHMiOiBmYWxzZSwKKyAgICAgICJlbmFibGVQZXJtaXNzaW9ucyI6IGZhbHNlLAorICAgICAgImVuYWJsZVByaW50QXV0b1JvdGF0ZSI6IGZhbHNlLAorICAgICAgImVuYWJsZVdlYkdMIjogZmFsc2UsCisgICAgICAiZXh0ZXJuYWxMaW5rVGFyZ2V0IjogMCwKKyAgICAgICJoaXN0b3J5VXBkYXRlVXJsIjogZmFsc2UsCisgICAgICAiaWdub3JlRGVzdGluYXRpb25ab29tIjogZmFsc2UsCisgICAgICAicGRmQnVnRW5hYmxlZCI6IGZhbHNlLAorICAgICAgInJlbmRlcmVyIjogImNhbnZhcyIsCisgICAgICAicmVuZGVySW50ZXJhY3RpdmVGb3JtcyI6IHRydWUsCisgICAgICAic2lkZWJhclZpZXdPbkxvYWQiOiAtMSwKKyAgICAgICJzY3JvbGxNb2RlT25Mb2FkIjogLTEsCisgICAgICAic3ByZWFkTW9kZU9uTG9hZCI6IC0xLAorICAgICAgInRleHRMYXllck1vZGUiOiAxLAorICAgICAgInVzZU9ubHlDc3Nab29tIjogZmFsc2UsCisgICAgICAidmlld09uTG9hZCI6IDAsCisgICAgICAiZGlzYWJsZUF1dG9GZXRjaCI6IGZhbHNlLAorICAgICAgImRpc2FibGVGb250RmFjZSI6IGZhbHNlLAorICAgICAgImRpc2FibGVSYW5nZSI6IGZhbHNlLAorICAgICAgImRpc2FibGVTdHJlYW0iOiBmYWxzZQorICAgIH0pOworICB9CisKKyAgcmV0dXJuIGRlZmF1bHRQcmVmZXJlbmNlczsKK30KKworY2xhc3MgQmFzZVByZWZlcmVuY2VzIHsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VQcmVmZXJlbmNlcykgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlUHJlZmVyZW5jZXMuIik7CisgICAgfQorCisgICAgdGhpcy5wcmVmcyA9IG51bGw7CisgICAgdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlID0gZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCkudGhlbihkZWZhdWx0cyA9PiB7CisgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgImRlZmF1bHRzIiwgeworICAgICAgICB2YWx1ZTogT2JqZWN0LmZyZWV6ZShkZWZhdWx0cyksCisgICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKKyAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZQorICAgICAgfSk7CisgICAgICB0aGlzLnByZWZzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCBkZWZhdWx0cyk7CisgICAgICByZXR1cm4gdGhpcy5fcmVhZEZyb21TdG9yYWdlKGRlZmF1bHRzKTsKKyAgICB9KS50aGVuKHByZWZzID0+IHsKKyAgICAgIGlmICghcHJlZnMpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcHJlZnMpIHsKKyAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0c1tuYW1lXSwKKyAgICAgICAgICAgICAgcHJlZlZhbHVlID0gcHJlZnNbbmFtZV07CisKKyAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBwcmVmVmFsdWUgIT09IHR5cGVvZiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucHJlZnNbbmFtZV0gPSBwcmVmVmFsdWU7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBhc3luYyBfd3JpdGVUb1N0b3JhZ2UocHJlZk9iaikgeworICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBfd3JpdGVUb1N0b3JhZ2UiKTsKKyAgfQorCisgIGFzeW5jIF9yZWFkRnJvbVN0b3JhZ2UocHJlZk9iaikgeworICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBfcmVhZEZyb21TdG9yYWdlIik7CisgIH0KKworICBhc3luYyByZXNldCgpIHsKKyAgICBhd2FpdCB0aGlzLl9pbml0aWFsaXplZFByb21pc2U7CisgICAgdGhpcy5wcmVmcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5kZWZhdWx0cyk7CisgICAgcmV0dXJuIHRoaXMuX3dyaXRlVG9TdG9yYWdlKHRoaXMuZGVmYXVsdHMpOworICB9CisKKyAgYXN5bmMgc2V0KG5hbWUsIHZhbHVlKSB7CisgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlOworICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGVmYXVsdHNbbmFtZV07CisKKyAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgU2V0IHByZWZlcmVuY2U6ICIke25hbWV9IiBpcyB1bmRlZmluZWQuYCk7CisgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIlNldCBwcmVmZXJlbmNlOiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQuIik7CisgICAgfQorCisgICAgY29uc3QgdmFsdWVUeXBlID0gdHlwZW9mIHZhbHVlOworICAgIGNvbnN0IGRlZmF1bHRUeXBlID0gdHlwZW9mIGRlZmF1bHRWYWx1ZTsKKworICAgIGlmICh2YWx1ZVR5cGUgIT09IGRlZmF1bHRUeXBlKSB7CisgICAgICBpZiAodmFsdWVUeXBlID09PSAibnVtYmVyIiAmJiBkZWZhdWx0VHlwZSA9PT0gInN0cmluZyIpIHsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXQgcHJlZmVyZW5jZTogIiR7dmFsdWV9IiBpcyBhICR7dmFsdWVUeXBlfSwgYCArIGBleHBlY3RlZCBhICR7ZGVmYXVsdFR5cGV9LmApOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAodmFsdWVUeXBlID09PSAibnVtYmVyIiAmJiAhTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXQgcHJlZmVyZW5jZTogIiR7dmFsdWV9IiBtdXN0IGJlIGFuIGludGVnZXIuYCk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5wcmVmc1tuYW1lXSA9IHZhbHVlOworICAgIHJldHVybiB0aGlzLl93cml0ZVRvU3RvcmFnZSh0aGlzLnByZWZzKTsKKyAgfQorCisgIGFzeW5jIGdldChuYW1lKSB7CisgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlOworICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGVmYXVsdHNbbmFtZV07CisKKyAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgR2V0IHByZWZlcmVuY2U6ICIke25hbWV9IiBpcyB1bmRlZmluZWQuYCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHByZWZWYWx1ZSA9IHRoaXMucHJlZnNbbmFtZV07CisKKyAgICAgIGlmIChwcmVmVmFsdWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXR1cm4gcHJlZlZhbHVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgIH0KKworICBhc3luYyBnZXRBbGwoKSB7CisgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlOworICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZGVmYXVsdHMsIHRoaXMucHJlZnMpOworICB9CisKK30KKworZXhwb3J0cy5CYXNlUHJlZmVyZW5jZXMgPSBCYXNlUHJlZmVyZW5jZXM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi9zZWNvbmRhcnlfdG9vbGJhci5qcyBiL2xpYi93ZWIvc2Vjb25kYXJ5X3Rvb2xiYXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExMmQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvc2Vjb25kYXJ5X3Rvb2xiYXIuanMKQEAgLTAsMCArMSwzMzMgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlNlY29uZGFyeVRvb2xiYXIgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK3ZhciBfcGRmX2N1cnNvcl90b29scyA9IHJlcXVpcmUoIi4vcGRmX2N1cnNvcl90b29scy5qcyIpOworCit2YXIgX3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIgPSByZXF1aXJlKCIuL3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIuanMiKTsKKworY2xhc3MgU2Vjb25kYXJ5VG9vbGJhciB7CisgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIG1haW5Db250YWluZXIsIGV2ZW50QnVzKSB7CisgICAgdGhpcy50b29sYmFyID0gb3B0aW9ucy50b29sYmFyOworICAgIHRoaXMudG9nZ2xlQnV0dG9uID0gb3B0aW9ucy50b2dnbGVCdXR0b247CisgICAgdGhpcy50b29sYmFyQnV0dG9uQ29udGFpbmVyID0gb3B0aW9ucy50b29sYmFyQnV0dG9uQ29udGFpbmVyOworICAgIHRoaXMuYnV0dG9ucyA9IFt7CisgICAgICBlbGVtZW50OiBvcHRpb25zLnByZXNlbnRhdGlvbk1vZGVCdXR0b24sCisgICAgICBldmVudE5hbWU6ICJwcmVzZW50YXRpb25tb2RlIiwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5vcGVuRmlsZUJ1dHRvbiwKKyAgICAgIGV2ZW50TmFtZTogIm9wZW5maWxlIiwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5wcmludEJ1dHRvbiwKKyAgICAgIGV2ZW50TmFtZTogInByaW50IiwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5kb3dubG9hZEJ1dHRvbiwKKyAgICAgIGV2ZW50TmFtZTogImRvd25sb2FkIiwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy52aWV3Qm9va21hcmtCdXR0b24sCisgICAgICBldmVudE5hbWU6IG51bGwsCisgICAgICBjbG9zZTogdHJ1ZQorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMuZmlyc3RQYWdlQnV0dG9uLAorICAgICAgZXZlbnROYW1lOiAiZmlyc3RwYWdlIiwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5sYXN0UGFnZUJ1dHRvbiwKKyAgICAgIGV2ZW50TmFtZTogImxhc3RwYWdlIiwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5wYWdlUm90YXRlQ3dCdXR0b24sCisgICAgICBldmVudE5hbWU6ICJyb3RhdGVjdyIsCisgICAgICBjbG9zZTogZmFsc2UKKyAgICB9LCB7CisgICAgICBlbGVtZW50OiBvcHRpb25zLnBhZ2VSb3RhdGVDY3dCdXR0b24sCisgICAgICBldmVudE5hbWU6ICJyb3RhdGVjY3ciLAorICAgICAgY2xvc2U6IGZhbHNlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5jdXJzb3JTZWxlY3RUb29sQnV0dG9uLAorICAgICAgZXZlbnROYW1lOiAic3dpdGNoY3Vyc29ydG9vbCIsCisgICAgICBldmVudERldGFpbHM6IHsKKyAgICAgICAgdG9vbDogX3BkZl9jdXJzb3JfdG9vbHMuQ3Vyc29yVG9vbC5TRUxFQ1QKKyAgICAgIH0sCisgICAgICBjbG9zZTogdHJ1ZQorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMuY3Vyc29ySGFuZFRvb2xCdXR0b24sCisgICAgICBldmVudE5hbWU6ICJzd2l0Y2hjdXJzb3J0b29sIiwKKyAgICAgIGV2ZW50RGV0YWlsczogeworICAgICAgICB0b29sOiBfcGRmX2N1cnNvcl90b29scy5DdXJzb3JUb29sLkhBTkQKKyAgICAgIH0sCisgICAgICBjbG9zZTogdHJ1ZQorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMuc2Nyb2xsVmVydGljYWxCdXR0b24sCisgICAgICBldmVudE5hbWU6ICJzd2l0Y2hzY3JvbGxtb2RlIiwKKyAgICAgIGV2ZW50RGV0YWlsczogeworICAgICAgICBtb2RlOiBfdWlfdXRpbHMuU2Nyb2xsTW9kZS5WRVJUSUNBTAorICAgICAgfSwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5zY3JvbGxIb3Jpem9udGFsQnV0dG9uLAorICAgICAgZXZlbnROYW1lOiAic3dpdGNoc2Nyb2xsbW9kZSIsCisgICAgICBldmVudERldGFpbHM6IHsKKyAgICAgICAgbW9kZTogX3VpX3V0aWxzLlNjcm9sbE1vZGUuSE9SSVpPTlRBTAorICAgICAgfSwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5zY3JvbGxXcmFwcGVkQnV0dG9uLAorICAgICAgZXZlbnROYW1lOiAic3dpdGNoc2Nyb2xsbW9kZSIsCisgICAgICBldmVudERldGFpbHM6IHsKKyAgICAgICAgbW9kZTogX3VpX3V0aWxzLlNjcm9sbE1vZGUuV1JBUFBFRAorICAgICAgfSwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5zcHJlYWROb25lQnV0dG9uLAorICAgICAgZXZlbnROYW1lOiAic3dpdGNoc3ByZWFkbW9kZSIsCisgICAgICBldmVudERldGFpbHM6IHsKKyAgICAgICAgbW9kZTogX3VpX3V0aWxzLlNwcmVhZE1vZGUuTk9ORQorICAgICAgfSwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5zcHJlYWRPZGRCdXR0b24sCisgICAgICBldmVudE5hbWU6ICJzd2l0Y2hzcHJlYWRtb2RlIiwKKyAgICAgIGV2ZW50RGV0YWlsczogeworICAgICAgICBtb2RlOiBfdWlfdXRpbHMuU3ByZWFkTW9kZS5PREQKKyAgICAgIH0sCisgICAgICBjbG9zZTogdHJ1ZQorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMuc3ByZWFkRXZlbkJ1dHRvbiwKKyAgICAgIGV2ZW50TmFtZTogInN3aXRjaHNwcmVhZG1vZGUiLAorICAgICAgZXZlbnREZXRhaWxzOiB7CisgICAgICAgIG1vZGU6IF91aV91dGlscy5TcHJlYWRNb2RlLkVWRU4KKyAgICAgIH0sCisgICAgICBjbG9zZTogdHJ1ZQorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMuZG9jdW1lbnRQcm9wZXJ0aWVzQnV0dG9uLAorICAgICAgZXZlbnROYW1lOiAiZG9jdW1lbnRwcm9wZXJ0aWVzIiwKKyAgICAgIGNsb3NlOiB0cnVlCisgICAgfV07CisgICAgdGhpcy5pdGVtcyA9IHsKKyAgICAgIGZpcnN0UGFnZTogb3B0aW9ucy5maXJzdFBhZ2VCdXR0b24sCisgICAgICBsYXN0UGFnZTogb3B0aW9ucy5sYXN0UGFnZUJ1dHRvbiwKKyAgICAgIHBhZ2VSb3RhdGVDdzogb3B0aW9ucy5wYWdlUm90YXRlQ3dCdXR0b24sCisgICAgICBwYWdlUm90YXRlQ2N3OiBvcHRpb25zLnBhZ2VSb3RhdGVDY3dCdXR0b24KKyAgICB9OworICAgIHRoaXMubWFpbkNvbnRhaW5lciA9IG1haW5Db250YWluZXI7CisgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOworICAgIHRoaXMub3BlbmVkID0gZmFsc2U7CisgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBudWxsOworICAgIHRoaXMucHJldmlvdXNDb250YWluZXJIZWlnaHQgPSBudWxsOworICAgIHRoaXMucmVzZXQoKTsKKworICAgIHRoaXMuX2JpbmRDbGlja0xpc3RlbmVycygpOworCisgICAgdGhpcy5fYmluZEN1cnNvclRvb2xzTGlzdGVuZXIob3B0aW9ucyk7CisKKyAgICB0aGlzLl9iaW5kU2Nyb2xsTW9kZUxpc3RlbmVyKG9wdGlvbnMpOworCisgICAgdGhpcy5fYmluZFNwcmVhZE1vZGVMaXN0ZW5lcihvcHRpb25zKTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJyZXNpemUiLCB0aGlzLl9zZXRNYXhIZWlnaHQuYmluZCh0aGlzKSk7CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigiYmFzZXZpZXdlcmluaXQiLCBldnQgPT4geworICAgICAgaWYgKGV2dC5zb3VyY2UgaW5zdGFuY2VvZiBfcGRmX3NpbmdsZV9wYWdlX3ZpZXdlci5QREZTaW5nbGVQYWdlVmlld2VyKSB7CisgICAgICAgIHRoaXMudG9vbGJhckJ1dHRvbkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJoaWRkZW5TY3JvbGxNb2RlQnV0dG9ucyIsICJoaWRkZW5TcHJlYWRNb2RlQnV0dG9ucyIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy50b29sYmFyQnV0dG9uQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlblNjcm9sbE1vZGVCdXR0b25zIiwgImhpZGRlblNwcmVhZE1vZGVCdXR0b25zIik7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBnZXQgaXNPcGVuKCkgeworICAgIHJldHVybiB0aGlzLm9wZW5lZDsKKyAgfQorCisgIHNldFBhZ2VOdW1iZXIocGFnZU51bWJlcikgeworICAgIHRoaXMucGFnZU51bWJlciA9IHBhZ2VOdW1iZXI7CisKKyAgICB0aGlzLl91cGRhdGVVSVN0YXRlKCk7CisgIH0KKworICBzZXRQYWdlc0NvdW50KHBhZ2VzQ291bnQpIHsKKyAgICB0aGlzLnBhZ2VzQ291bnQgPSBwYWdlc0NvdW50OworCisgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZSgpOworICB9CisKKyAgcmVzZXQoKSB7CisgICAgdGhpcy5wYWdlTnVtYmVyID0gMDsKKyAgICB0aGlzLnBhZ2VzQ291bnQgPSAwOworCisgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZSgpOworCisgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgic2Vjb25kYXJ5dG9vbGJhcnJlc2V0IiwgeworICAgICAgc291cmNlOiB0aGlzCisgICAgfSk7CisgIH0KKworICBfdXBkYXRlVUlTdGF0ZSgpIHsKKyAgICB0aGlzLml0ZW1zLmZpcnN0UGFnZS5kaXNhYmxlZCA9IHRoaXMucGFnZU51bWJlciA8PSAxOworICAgIHRoaXMuaXRlbXMubGFzdFBhZ2UuZGlzYWJsZWQgPSB0aGlzLnBhZ2VOdW1iZXIgPj0gdGhpcy5wYWdlc0NvdW50OworICAgIHRoaXMuaXRlbXMucGFnZVJvdGF0ZUN3LmRpc2FibGVkID0gdGhpcy5wYWdlc0NvdW50ID09PSAwOworICAgIHRoaXMuaXRlbXMucGFnZVJvdGF0ZUNjdy5kaXNhYmxlZCA9IHRoaXMucGFnZXNDb3VudCA9PT0gMDsKKyAgfQorCisgIF9iaW5kQ2xpY2tMaXN0ZW5lcnMoKSB7CisgICAgdGhpcy50b2dnbGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpKTsKKworICAgIGZvciAoY29uc3QgeworICAgICAgZWxlbWVudCwKKyAgICAgIGV2ZW50TmFtZSwKKyAgICAgIGNsb3NlLAorICAgICAgZXZlbnREZXRhaWxzCisgICAgfSBvZiB0aGlzLmJ1dHRvbnMpIHsKKyAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBldnQgPT4geworICAgICAgICBpZiAoZXZlbnROYW1lICE9PSBudWxsKSB7CisgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHsKKyAgICAgICAgICAgIHNvdXJjZTogdGhpcworICAgICAgICAgIH07CisKKyAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGV2ZW50RGV0YWlscykgeworICAgICAgICAgICAgZGV0YWlsc1twcm9wZXJ0eV0gPSBldmVudERldGFpbHNbcHJvcGVydHldOworICAgICAgICAgIH0KKworICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goZXZlbnROYW1lLCBkZXRhaWxzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbG9zZSkgeworICAgICAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgX2JpbmRDdXJzb3JUb29sc0xpc3RlbmVyKGJ1dHRvbnMpIHsKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigiY3Vyc29ydG9vbGNoYW5nZWQiLCBmdW5jdGlvbiAoeworICAgICAgdG9vbAorICAgIH0pIHsKKyAgICAgIGJ1dHRvbnMuY3Vyc29yU2VsZWN0VG9vbEJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCJ0b2dnbGVkIiwgdG9vbCA9PT0gX3BkZl9jdXJzb3JfdG9vbHMuQ3Vyc29yVG9vbC5TRUxFQ1QpOworICAgICAgYnV0dG9ucy5jdXJzb3JIYW5kVG9vbEJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCJ0b2dnbGVkIiwgdG9vbCA9PT0gX3BkZl9jdXJzb3JfdG9vbHMuQ3Vyc29yVG9vbC5IQU5EKTsKKyAgICB9KTsKKyAgfQorCisgIF9iaW5kU2Nyb2xsTW9kZUxpc3RlbmVyKGJ1dHRvbnMpIHsKKyAgICBmdW5jdGlvbiBzY3JvbGxNb2RlQ2hhbmdlZCh7CisgICAgICBtb2RlCisgICAgfSkgeworICAgICAgYnV0dG9ucy5zY3JvbGxWZXJ0aWNhbEJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCJ0b2dnbGVkIiwgbW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuVkVSVElDQUwpOworICAgICAgYnV0dG9ucy5zY3JvbGxIb3Jpem9udGFsQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoInRvZ2dsZWQiLCBtb2RlID09PSBfdWlfdXRpbHMuU2Nyb2xsTW9kZS5IT1JJWk9OVEFMKTsKKyAgICAgIGJ1dHRvbnMuc2Nyb2xsV3JhcHBlZEJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCJ0b2dnbGVkIiwgbW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuV1JBUFBFRCk7CisgICAgICBjb25zdCBpc1Njcm9sbE1vZGVIb3Jpem9udGFsID0gbW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuSE9SSVpPTlRBTDsKKyAgICAgIGJ1dHRvbnMuc3ByZWFkTm9uZUJ1dHRvbi5kaXNhYmxlZCA9IGlzU2Nyb2xsTW9kZUhvcml6b250YWw7CisgICAgICBidXR0b25zLnNwcmVhZE9kZEJ1dHRvbi5kaXNhYmxlZCA9IGlzU2Nyb2xsTW9kZUhvcml6b250YWw7CisgICAgICBidXR0b25zLnNwcmVhZEV2ZW5CdXR0b24uZGlzYWJsZWQgPSBpc1Njcm9sbE1vZGVIb3Jpem9udGFsOworICAgIH0KKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJzY3JvbGxtb2RlY2hhbmdlZCIsIHNjcm9sbE1vZGVDaGFuZ2VkKTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJzZWNvbmRhcnl0b29sYmFycmVzZXQiLCBldnQgPT4geworICAgICAgaWYgKGV2dC5zb3VyY2UgPT09IHRoaXMpIHsKKyAgICAgICAgc2Nyb2xsTW9kZUNoYW5nZWQoeworICAgICAgICAgIG1vZGU6IF91aV91dGlscy5TY3JvbGxNb2RlLlZFUlRJQ0FMCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgX2JpbmRTcHJlYWRNb2RlTGlzdGVuZXIoYnV0dG9ucykgeworICAgIGZ1bmN0aW9uIHNwcmVhZE1vZGVDaGFuZ2VkKHsKKyAgICAgIG1vZGUKKyAgICB9KSB7CisgICAgICBidXR0b25zLnNwcmVhZE5vbmVCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgidG9nZ2xlZCIsIG1vZGUgPT09IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkUpOworICAgICAgYnV0dG9ucy5zcHJlYWRPZGRCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgidG9nZ2xlZCIsIG1vZGUgPT09IF91aV91dGlscy5TcHJlYWRNb2RlLk9ERCk7CisgICAgICBidXR0b25zLnNwcmVhZEV2ZW5CdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgidG9nZ2xlZCIsIG1vZGUgPT09IF91aV91dGlscy5TcHJlYWRNb2RlLkVWRU4pOworICAgIH0KKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJzcHJlYWRtb2RlY2hhbmdlZCIsIHNwcmVhZE1vZGVDaGFuZ2VkKTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJzZWNvbmRhcnl0b29sYmFycmVzZXQiLCBldnQgPT4geworICAgICAgaWYgKGV2dC5zb3VyY2UgPT09IHRoaXMpIHsKKyAgICAgICAgc3ByZWFkTW9kZUNoYW5nZWQoeworICAgICAgICAgIG1vZGU6IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkUKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBvcGVuKCkgeworICAgIGlmICh0aGlzLm9wZW5lZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMub3BlbmVkID0gdHJ1ZTsKKworICAgIHRoaXMuX3NldE1heEhlaWdodCgpOworCisgICAgdGhpcy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LmFkZCgidG9nZ2xlZCIpOworICAgIHRoaXMudG9vbGJhci5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsKKyAgfQorCisgIGNsb3NlKCkgeworICAgIGlmICghdGhpcy5vcGVuZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLm9wZW5lZCA9IGZhbHNlOworICAgIHRoaXMudG9vbGJhci5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKTsKKyAgICB0aGlzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJ0b2dnbGVkIik7CisgIH0KKworICB0b2dnbGUoKSB7CisgICAgaWYgKHRoaXMub3BlbmVkKSB7CisgICAgICB0aGlzLmNsb3NlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMub3BlbigpOworICAgIH0KKyAgfQorCisgIF9zZXRNYXhIZWlnaHQoKSB7CisgICAgaWYgKCF0aGlzLm9wZW5lZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5tYWluQ29udGFpbmVyLmNsaWVudEhlaWdodDsKKworICAgIGlmICh0aGlzLmNvbnRhaW5lckhlaWdodCA9PT0gdGhpcy5wcmV2aW91c0NvbnRhaW5lckhlaWdodCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMudG9vbGJhckJ1dHRvbkNvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBgJHt0aGlzLmNvbnRhaW5lckhlaWdodCAtIF91aV91dGlscy5TQ1JPTExCQVJfUEFERElOR31weGA7CisgICAgdGhpcy5wcmV2aW91c0NvbnRhaW5lckhlaWdodCA9IHRoaXMuY29udGFpbmVySGVpZ2h0OworICB9CisKK30KKworZXhwb3J0cy5TZWNvbmRhcnlUb29sYmFyID0gU2Vjb25kYXJ5VG9vbGJhcjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3RleHRfbGF5ZXJfYnVpbGRlci5qcyBiL2xpYi93ZWIvdGV4dF9sYXllcl9idWlsZGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODhhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3RleHRfbGF5ZXJfYnVpbGRlci5qcwpAQCAtMCwwICsxLDM5OSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRGVmYXVsdFRleHRMYXllckZhY3RvcnkgPSBleHBvcnRzLlRleHRMYXllckJ1aWxkZXIgPSB2b2lkIDA7CisKK3ZhciBfcGRmID0gcmVxdWlyZSgiLi4vcGRmIik7CisKK2NvbnN0IEVYUEFORF9ESVZTX1RJTUVPVVQgPSAzMDA7CisKK2NsYXNzIFRleHRMYXllckJ1aWxkZXIgeworICBjb25zdHJ1Y3Rvcih7CisgICAgdGV4dExheWVyRGl2LAorICAgIGV2ZW50QnVzLAorICAgIHBhZ2VJbmRleCwKKyAgICB2aWV3cG9ydCwKKyAgICBmaW5kQ29udHJvbGxlciA9IG51bGwsCisgICAgZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBmYWxzZQorICB9KSB7CisgICAgdGhpcy50ZXh0TGF5ZXJEaXYgPSB0ZXh0TGF5ZXJEaXY7CisgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOworICAgIHRoaXMudGV4dENvbnRlbnQgPSBudWxsOworICAgIHRoaXMudGV4dENvbnRlbnRJdGVtc1N0ciA9IFtdOworICAgIHRoaXMudGV4dENvbnRlbnRTdHJlYW0gPSBudWxsOworICAgIHRoaXMucmVuZGVyaW5nRG9uZSA9IGZhbHNlOworICAgIHRoaXMucGFnZUlkeCA9IHBhZ2VJbmRleDsKKyAgICB0aGlzLnBhZ2VOdW1iZXIgPSB0aGlzLnBhZ2VJZHggKyAxOworICAgIHRoaXMubWF0Y2hlcyA9IFtdOworICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDsKKyAgICB0aGlzLnRleHREaXZzID0gW107CisgICAgdGhpcy5maW5kQ29udHJvbGxlciA9IGZpbmRDb250cm9sbGVyOworICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzayA9IG51bGw7CisgICAgdGhpcy5lbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGVuaGFuY2VUZXh0U2VsZWN0aW9uOworICAgIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyA9IG51bGw7CisKKyAgICB0aGlzLl9iaW5kTW91c2UoKTsKKyAgfQorCisgIF9maW5pc2hSZW5kZXJpbmcoKSB7CisgICAgdGhpcy5yZW5kZXJpbmdEb25lID0gdHJ1ZTsKKworICAgIGlmICghdGhpcy5lbmhhbmNlVGV4dFNlbGVjdGlvbikgeworICAgICAgY29uc3QgZW5kT2ZDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICBlbmRPZkNvbnRlbnQuY2xhc3NOYW1lID0gImVuZE9mQ29udGVudCI7CisgICAgICB0aGlzLnRleHRMYXllckRpdi5hcHBlbmRDaGlsZChlbmRPZkNvbnRlbnQpOworICAgIH0KKworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInRleHRsYXllcnJlbmRlcmVkIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZU51bWJlcjogdGhpcy5wYWdlTnVtYmVyLAorICAgICAgbnVtVGV4dERpdnM6IHRoaXMudGV4dERpdnMubGVuZ3RoCisgICAgfSk7CisgIH0KKworICByZW5kZXIodGltZW91dCA9IDApIHsKKyAgICBpZiAoISh0aGlzLnRleHRDb250ZW50IHx8IHRoaXMudGV4dENvbnRlbnRTdHJlYW0pIHx8IHRoaXMucmVuZGVyaW5nRG9uZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuY2FuY2VsKCk7CisgICAgdGhpcy50ZXh0RGl2cyA9IFtdOworICAgIGNvbnN0IHRleHRMYXllckZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrID0gKDAsIF9wZGYucmVuZGVyVGV4dExheWVyKSh7CisgICAgICB0ZXh0Q29udGVudDogdGhpcy50ZXh0Q29udGVudCwKKyAgICAgIHRleHRDb250ZW50U3RyZWFtOiB0aGlzLnRleHRDb250ZW50U3RyZWFtLAorICAgICAgY29udGFpbmVyOiB0ZXh0TGF5ZXJGcmFnLAorICAgICAgdmlld3BvcnQ6IHRoaXMudmlld3BvcnQsCisgICAgICB0ZXh0RGl2czogdGhpcy50ZXh0RGl2cywKKyAgICAgIHRleHRDb250ZW50SXRlbXNTdHI6IHRoaXMudGV4dENvbnRlbnRJdGVtc1N0ciwKKyAgICAgIHRpbWVvdXQsCisgICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbjogdGhpcy5lbmhhbmNlVGV4dFNlbGVjdGlvbgorICAgIH0pOworICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5wcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgdGhpcy50ZXh0TGF5ZXJEaXYuYXBwZW5kQ2hpbGQodGV4dExheWVyRnJhZyk7CisKKyAgICAgIHRoaXMuX2ZpbmlzaFJlbmRlcmluZygpOworCisgICAgICB0aGlzLl91cGRhdGVNYXRjaGVzKCk7CisgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge30pOworCisgICAgaWYgKCF0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMpIHsKKyAgICAgIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyA9IGV2dCA9PiB7CisgICAgICAgIGlmIChldnQucGFnZUluZGV4ID09PSB0aGlzLnBhZ2VJZHggfHwgZXZ0LnBhZ2VJbmRleCA9PT0gLTEpIHsKKyAgICAgICAgICB0aGlzLl91cGRhdGVNYXRjaGVzKCk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIHRoaXMuZXZlbnRCdXMuX29uKCJ1cGRhdGV0ZXh0bGF5ZXJtYXRjaGVzIiwgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzKTsKKyAgICB9CisgIH0KKworICBjYW5jZWwoKSB7CisgICAgaWYgKHRoaXMudGV4dExheWVyUmVuZGVyVGFzaykgeworICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrLmNhbmNlbCgpOworICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrID0gbnVsbDsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzKSB7CisgICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoInVwZGF0ZXRleHRsYXllcm1hdGNoZXMiLCB0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMpOworCisgICAgICB0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHNldFRleHRDb250ZW50U3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7CisgICAgdGhpcy5jYW5jZWwoKTsKKyAgICB0aGlzLnRleHRDb250ZW50U3RyZWFtID0gcmVhZGFibGVTdHJlYW07CisgIH0KKworICBzZXRUZXh0Q29udGVudCh0ZXh0Q29udGVudCkgeworICAgIHRoaXMuY2FuY2VsKCk7CisgICAgdGhpcy50ZXh0Q29udGVudCA9IHRleHRDb250ZW50OworICB9CisKKyAgX2NvbnZlcnRNYXRjaGVzKG1hdGNoZXMsIG1hdGNoZXNMZW5ndGgpIHsKKyAgICBpZiAoIW1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBbXTsKKyAgICB9CisKKyAgICBjb25zdCB7CisgICAgICBmaW5kQ29udHJvbGxlciwKKyAgICAgIHRleHRDb250ZW50SXRlbXNTdHIKKyAgICB9ID0gdGhpczsKKyAgICBsZXQgaSA9IDAsCisgICAgICAgIGlJbmRleCA9IDA7CisgICAgY29uc3QgZW5kID0gdGV4dENvbnRlbnRJdGVtc1N0ci5sZW5ndGggLSAxOworICAgIGNvbnN0IHF1ZXJ5TGVuID0gZmluZENvbnRyb2xsZXIuc3RhdGUucXVlcnkubGVuZ3RoOworICAgIGNvbnN0IHJlc3VsdCA9IFtdOworCisgICAgZm9yIChsZXQgbSA9IDAsIG1tID0gbWF0Y2hlcy5sZW5ndGg7IG0gPCBtbTsgbSsrKSB7CisgICAgICBsZXQgbWF0Y2hJZHggPSBtYXRjaGVzW21dOworCisgICAgICB3aGlsZSAoaSAhPT0gZW5kICYmIG1hdGNoSWR4ID49IGlJbmRleCArIHRleHRDb250ZW50SXRlbXNTdHJbaV0ubGVuZ3RoKSB7CisgICAgICAgIGlJbmRleCArPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aDsKKyAgICAgICAgaSsrOworICAgICAgfQorCisgICAgICBpZiAoaSA9PT0gdGV4dENvbnRlbnRJdGVtc1N0ci5sZW5ndGgpIHsKKyAgICAgICAgY29uc29sZS5lcnJvcigiQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyBtYXBwaW5nIik7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG1hdGNoID0geworICAgICAgICBiZWdpbjogeworICAgICAgICAgIGRpdklkeDogaSwKKyAgICAgICAgICBvZmZzZXQ6IG1hdGNoSWR4IC0gaUluZGV4CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGlmIChtYXRjaGVzTGVuZ3RoKSB7CisgICAgICAgIG1hdGNoSWR4ICs9IG1hdGNoZXNMZW5ndGhbbV07CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXRjaElkeCArPSBxdWVyeUxlbjsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKGkgIT09IGVuZCAmJiBtYXRjaElkeCA+IGlJbmRleCArIHRleHRDb250ZW50SXRlbXNTdHJbaV0ubGVuZ3RoKSB7CisgICAgICAgIGlJbmRleCArPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aDsKKyAgICAgICAgaSsrOworICAgICAgfQorCisgICAgICBtYXRjaC5lbmQgPSB7CisgICAgICAgIGRpdklkeDogaSwKKyAgICAgICAgb2Zmc2V0OiBtYXRjaElkeCAtIGlJbmRleAorICAgICAgfTsKKyAgICAgIHJlc3VsdC5wdXNoKG1hdGNoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgX3JlbmRlck1hdGNoZXMobWF0Y2hlcykgeworICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHsKKyAgICAgIGZpbmRDb250cm9sbGVyLAorICAgICAgcGFnZUlkeCwKKyAgICAgIHRleHRDb250ZW50SXRlbXNTdHIsCisgICAgICB0ZXh0RGl2cworICAgIH0gPSB0aGlzOworICAgIGNvbnN0IGlzU2VsZWN0ZWRQYWdlID0gcGFnZUlkeCA9PT0gZmluZENvbnRyb2xsZXIuc2VsZWN0ZWQucGFnZUlkeDsKKyAgICBjb25zdCBzZWxlY3RlZE1hdGNoSWR4ID0gZmluZENvbnRyb2xsZXIuc2VsZWN0ZWQubWF0Y2hJZHg7CisgICAgY29uc3QgaGlnaGxpZ2h0QWxsID0gZmluZENvbnRyb2xsZXIuc3RhdGUuaGlnaGxpZ2h0QWxsOworICAgIGxldCBwcmV2RW5kID0gbnVsbDsKKyAgICBjb25zdCBpbmZpbml0eSA9IHsKKyAgICAgIGRpdklkeDogLTEsCisgICAgICBvZmZzZXQ6IHVuZGVmaW5lZAorICAgIH07CisKKyAgICBmdW5jdGlvbiBiZWdpblRleHQoYmVnaW4sIGNsYXNzTmFtZSkgeworICAgICAgY29uc3QgZGl2SWR4ID0gYmVnaW4uZGl2SWR4OworICAgICAgdGV4dERpdnNbZGl2SWR4XS50ZXh0Q29udGVudCA9ICIiOworICAgICAgYXBwZW5kVGV4dFRvRGl2KGRpdklkeCwgMCwgYmVnaW4ub2Zmc2V0LCBjbGFzc05hbWUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGFwcGVuZFRleHRUb0RpdihkaXZJZHgsIGZyb21PZmZzZXQsIHRvT2Zmc2V0LCBjbGFzc05hbWUpIHsKKyAgICAgIGNvbnN0IGRpdiA9IHRleHREaXZzW2RpdklkeF07CisgICAgICBjb25zdCBjb250ZW50ID0gdGV4dENvbnRlbnRJdGVtc1N0cltkaXZJZHhdLnN1YnN0cmluZyhmcm9tT2Zmc2V0LCB0b09mZnNldCk7CisgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCk7CisKKyAgICAgIGlmIChjbGFzc05hbWUpIHsKKyAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKyAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQobm9kZSk7CisgICAgICAgIGRpdi5hcHBlbmRDaGlsZChzcGFuKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7CisgICAgfQorCisgICAgbGV0IGkwID0gc2VsZWN0ZWRNYXRjaElkeCwKKyAgICAgICAgaTEgPSBpMCArIDE7CisKKyAgICBpZiAoaGlnaGxpZ2h0QWxsKSB7CisgICAgICBpMCA9IDA7CisgICAgICBpMSA9IG1hdGNoZXMubGVuZ3RoOworICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0ZWRQYWdlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChsZXQgaSA9IGkwOyBpIDwgaTE7IGkrKykgeworICAgICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldOworICAgICAgY29uc3QgYmVnaW4gPSBtYXRjaC5iZWdpbjsKKyAgICAgIGNvbnN0IGVuZCA9IG1hdGNoLmVuZDsKKyAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBpc1NlbGVjdGVkUGFnZSAmJiBpID09PSBzZWxlY3RlZE1hdGNoSWR4OworICAgICAgY29uc3QgaGlnaGxpZ2h0U3VmZml4ID0gaXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiI7CisKKyAgICAgIGlmIChpc1NlbGVjdGVkKSB7CisgICAgICAgIGZpbmRDb250cm9sbGVyLnNjcm9sbE1hdGNoSW50b1ZpZXcoeworICAgICAgICAgIGVsZW1lbnQ6IHRleHREaXZzW2JlZ2luLmRpdklkeF0sCisgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSWR4LAorICAgICAgICAgIG1hdGNoSW5kZXg6IHNlbGVjdGVkTWF0Y2hJZHgKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmICghcHJldkVuZCB8fCBiZWdpbi5kaXZJZHggIT09IHByZXZFbmQuZGl2SWR4KSB7CisgICAgICAgIGlmIChwcmV2RW5kICE9PSBudWxsKSB7CisgICAgICAgICAgYXBwZW5kVGV4dFRvRGl2KHByZXZFbmQuZGl2SWR4LCBwcmV2RW5kLm9mZnNldCwgaW5maW5pdHkub2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGJlZ2luVGV4dChiZWdpbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcHBlbmRUZXh0VG9EaXYocHJldkVuZC5kaXZJZHgsIHByZXZFbmQub2Zmc2V0LCBiZWdpbi5vZmZzZXQpOworICAgICAgfQorCisgICAgICBpZiAoYmVnaW4uZGl2SWR4ID09PSBlbmQuZGl2SWR4KSB7CisgICAgICAgIGFwcGVuZFRleHRUb0RpdihiZWdpbi5kaXZJZHgsIGJlZ2luLm9mZnNldCwgZW5kLm9mZnNldCwgImhpZ2hsaWdodCIgKyBoaWdobGlnaHRTdWZmaXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXBwZW5kVGV4dFRvRGl2KGJlZ2luLmRpdklkeCwgYmVnaW4ub2Zmc2V0LCBpbmZpbml0eS5vZmZzZXQsICJoaWdobGlnaHQgYmVnaW4iICsgaGlnaGxpZ2h0U3VmZml4KTsKKworICAgICAgICBmb3IgKGxldCBuMCA9IGJlZ2luLmRpdklkeCArIDEsIG4xID0gZW5kLmRpdklkeDsgbjAgPCBuMTsgbjArKykgeworICAgICAgICAgIHRleHREaXZzW24wXS5jbGFzc05hbWUgPSAiaGlnaGxpZ2h0IG1pZGRsZSIgKyBoaWdobGlnaHRTdWZmaXg7CisgICAgICAgIH0KKworICAgICAgICBiZWdpblRleHQoZW5kLCAiaGlnaGxpZ2h0IGVuZCIgKyBoaWdobGlnaHRTdWZmaXgpOworICAgICAgfQorCisgICAgICBwcmV2RW5kID0gZW5kOworICAgIH0KKworICAgIGlmIChwcmV2RW5kKSB7CisgICAgICBhcHBlbmRUZXh0VG9EaXYocHJldkVuZC5kaXZJZHgsIHByZXZFbmQub2Zmc2V0LCBpbmZpbml0eS5vZmZzZXQpOworICAgIH0KKyAgfQorCisgIF91cGRhdGVNYXRjaGVzKCkgeworICAgIGlmICghdGhpcy5yZW5kZXJpbmdEb25lKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgeworICAgICAgZmluZENvbnRyb2xsZXIsCisgICAgICBtYXRjaGVzLAorICAgICAgcGFnZUlkeCwKKyAgICAgIHRleHRDb250ZW50SXRlbXNTdHIsCisgICAgICB0ZXh0RGl2cworICAgIH0gPSB0aGlzOworICAgIGxldCBjbGVhcmVkVW50aWxEaXZJZHggPSAtMTsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG1hdGNoZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldOworICAgICAgY29uc3QgYmVnaW4gPSBNYXRoLm1heChjbGVhcmVkVW50aWxEaXZJZHgsIG1hdGNoLmJlZ2luLmRpdklkeCk7CisKKyAgICAgIGZvciAobGV0IG4gPSBiZWdpbiwgZW5kID0gbWF0Y2guZW5kLmRpdklkeDsgbiA8PSBlbmQ7IG4rKykgeworICAgICAgICBjb25zdCBkaXYgPSB0ZXh0RGl2c1tuXTsKKyAgICAgICAgZGl2LnRleHRDb250ZW50ID0gdGV4dENvbnRlbnRJdGVtc1N0cltuXTsKKyAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICIiOworICAgICAgfQorCisgICAgICBjbGVhcmVkVW50aWxEaXZJZHggPSBtYXRjaC5lbmQuZGl2SWR4ICsgMTsKKyAgICB9CisKKyAgICBpZiAoIWZpbmRDb250cm9sbGVyIHx8ICFmaW5kQ29udHJvbGxlci5oaWdobGlnaHRNYXRjaGVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgcGFnZU1hdGNoZXMgPSBmaW5kQ29udHJvbGxlci5wYWdlTWF0Y2hlc1twYWdlSWR4XSB8fCBudWxsOworICAgIGNvbnN0IHBhZ2VNYXRjaGVzTGVuZ3RoID0gZmluZENvbnRyb2xsZXIucGFnZU1hdGNoZXNMZW5ndGhbcGFnZUlkeF0gfHwgbnVsbDsKKyAgICB0aGlzLm1hdGNoZXMgPSB0aGlzLl9jb252ZXJ0TWF0Y2hlcyhwYWdlTWF0Y2hlcywgcGFnZU1hdGNoZXNMZW5ndGgpOworCisgICAgdGhpcy5fcmVuZGVyTWF0Y2hlcyh0aGlzLm1hdGNoZXMpOworICB9CisKKyAgX2JpbmRNb3VzZSgpIHsKKyAgICBjb25zdCBkaXYgPSB0aGlzLnRleHRMYXllckRpdjsKKyAgICBsZXQgZXhwYW5kRGl2c1RpbWVyID0gbnVsbDsKKyAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwgZXZ0ID0+IHsKKyAgICAgIGlmICh0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uICYmIHRoaXMudGV4dExheWVyUmVuZGVyVGFzaykgeworICAgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2suZXhwYW5kVGV4dERpdnModHJ1ZSk7CisKKyAgICAgICAgaWYgKGV4cGFuZERpdnNUaW1lcikgeworICAgICAgICAgIGNsZWFyVGltZW91dChleHBhbmREaXZzVGltZXIpOworICAgICAgICAgIGV4cGFuZERpdnNUaW1lciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IGVuZCA9IGRpdi5xdWVyeVNlbGVjdG9yKCIuZW5kT2ZDb250ZW50Iik7CisKKyAgICAgIGlmICghZW5kKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgbGV0IGFkanVzdFRvcCA9IGV2dC50YXJnZXQgIT09IGRpdjsKKyAgICAgIGFkanVzdFRvcCA9IGFkanVzdFRvcCAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbmQpLmdldFByb3BlcnR5VmFsdWUoIi1tb3otdXNlci1zZWxlY3QiKSAhPT0gIm5vbmUiOworCisgICAgICBpZiAoYWRqdXN0VG9wKSB7CisgICAgICAgIGNvbnN0IGRpdkJvdW5kcyA9IGRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgICAgICAgY29uc3QgciA9IE1hdGgubWF4KDAsIChldnQucGFnZVkgLSBkaXZCb3VuZHMudG9wKSAvIGRpdkJvdW5kcy5oZWlnaHQpOworICAgICAgICBlbmQuc3R5bGUudG9wID0gKHIgKiAxMDApLnRvRml4ZWQoMikgKyAiJSI7CisgICAgICB9CisKKyAgICAgIGVuZC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKTsKKyAgICB9KTsKKyAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsICgpID0+IHsKKyAgICAgIGlmICh0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uICYmIHRoaXMudGV4dExheWVyUmVuZGVyVGFzaykgeworICAgICAgICBleHBhbmREaXZzVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKKyAgICAgICAgICBpZiAodGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrKSB7CisgICAgICAgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2suZXhwYW5kVGV4dERpdnMoZmFsc2UpOworICAgICAgICAgIH0KKworICAgICAgICAgIGV4cGFuZERpdnNUaW1lciA9IG51bGw7CisgICAgICAgIH0sIEVYUEFORF9ESVZTX1RJTUVPVVQpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IGVuZCA9IGRpdi5xdWVyeVNlbGVjdG9yKCIuZW5kT2ZDb250ZW50Iik7CisKKyAgICAgIGlmICghZW5kKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZW5kLnN0eWxlLnRvcCA9ICIiOworICAgICAgZW5kLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpOworICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5UZXh0TGF5ZXJCdWlsZGVyID0gVGV4dExheWVyQnVpbGRlcjsKKworY2xhc3MgRGVmYXVsdFRleHRMYXllckZhY3RvcnkgeworICBjcmVhdGVUZXh0TGF5ZXJCdWlsZGVyKHRleHRMYXllckRpdiwgcGFnZUluZGV4LCB2aWV3cG9ydCwgZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBmYWxzZSwgZXZlbnRCdXMpIHsKKyAgICByZXR1cm4gbmV3IFRleHRMYXllckJ1aWxkZXIoeworICAgICAgdGV4dExheWVyRGl2LAorICAgICAgcGFnZUluZGV4LAorICAgICAgdmlld3BvcnQsCisgICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbiwKKyAgICAgIGV2ZW50QnVzCisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLkRlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5ID0gRGVmYXVsdFRleHRMYXllckZhY3Rvcnk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi90b29sYmFyLmpzIGIvbGliL3dlYi90b29sYmFyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2Q5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3Rvb2xiYXIuanMKQEAgLTAsMCArMSwyODUgQEAKKy8qKgorICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKgorICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlCisgKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlRvb2xiYXIgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSByZXF1aXJlKCIuL3VpX3V0aWxzLmpzIik7CisKK2NvbnN0IFBBR0VfTlVNQkVSX0xPQURJTkdfSU5ESUNBVE9SID0gInZpc2libGVQYWdlSXNMb2FkaW5nIjsKK2NvbnN0IFNDQUxFX1NFTEVDVF9DT05UQUlORVJfV0lEVEggPSAxNDA7Citjb25zdCBTQ0FMRV9TRUxFQ1RfV0lEVEggPSAxNjI7CisKK2NsYXNzIFRvb2xiYXIgeworICBjb25zdHJ1Y3RvcihvcHRpb25zLCBldmVudEJ1cywgbDEwbiA9IF91aV91dGlscy5OdWxsTDEwbikgeworICAgIHRoaXMudG9vbGJhciA9IG9wdGlvbnMuY29udGFpbmVyOworICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1czsKKyAgICB0aGlzLmwxMG4gPSBsMTBuOworICAgIHRoaXMuYnV0dG9ucyA9IFt7CisgICAgICBlbGVtZW50OiBvcHRpb25zLnByZXZpb3VzLAorICAgICAgZXZlbnROYW1lOiAicHJldmlvdXNwYWdlIgorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMubmV4dCwKKyAgICAgIGV2ZW50TmFtZTogIm5leHRwYWdlIgorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMuem9vbUluLAorICAgICAgZXZlbnROYW1lOiAiem9vbWluIgorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMuem9vbU91dCwKKyAgICAgIGV2ZW50TmFtZTogInpvb21vdXQiCisgICAgfSwgeworICAgICAgZWxlbWVudDogb3B0aW9ucy5vcGVuRmlsZSwKKyAgICAgIGV2ZW50TmFtZTogIm9wZW5maWxlIgorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMucHJpbnQsCisgICAgICBldmVudE5hbWU6ICJwcmludCIKKyAgICB9LCB7CisgICAgICBlbGVtZW50OiBvcHRpb25zLnByZXNlbnRhdGlvbk1vZGVCdXR0b24sCisgICAgICBldmVudE5hbWU6ICJwcmVzZW50YXRpb25tb2RlIgorICAgIH0sIHsKKyAgICAgIGVsZW1lbnQ6IG9wdGlvbnMuZG93bmxvYWQsCisgICAgICBldmVudE5hbWU6ICJkb3dubG9hZCIKKyAgICB9LCB7CisgICAgICBlbGVtZW50OiBvcHRpb25zLnZpZXdCb29rbWFyaywKKyAgICAgIGV2ZW50TmFtZTogbnVsbAorICAgIH1dOworICAgIHRoaXMuaXRlbXMgPSB7CisgICAgICBudW1QYWdlczogb3B0aW9ucy5udW1QYWdlcywKKyAgICAgIHBhZ2VOdW1iZXI6IG9wdGlvbnMucGFnZU51bWJlciwKKyAgICAgIHNjYWxlU2VsZWN0Q29udGFpbmVyOiBvcHRpb25zLnNjYWxlU2VsZWN0Q29udGFpbmVyLAorICAgICAgc2NhbGVTZWxlY3Q6IG9wdGlvbnMuc2NhbGVTZWxlY3QsCisgICAgICBjdXN0b21TY2FsZU9wdGlvbjogb3B0aW9ucy5jdXN0b21TY2FsZU9wdGlvbiwKKyAgICAgIHByZXZpb3VzOiBvcHRpb25zLnByZXZpb3VzLAorICAgICAgbmV4dDogb3B0aW9ucy5uZXh0LAorICAgICAgem9vbUluOiBvcHRpb25zLnpvb21JbiwKKyAgICAgIHpvb21PdXQ6IG9wdGlvbnMuem9vbU91dAorICAgIH07CisgICAgdGhpcy5fd2FzTG9jYWxpemVkID0gZmFsc2U7CisgICAgdGhpcy5yZXNldCgpOworCisgICAgdGhpcy5fYmluZExpc3RlbmVycygpOworICB9CisKKyAgc2V0UGFnZU51bWJlcihwYWdlTnVtYmVyLCBwYWdlTGFiZWwpIHsKKyAgICB0aGlzLnBhZ2VOdW1iZXIgPSBwYWdlTnVtYmVyOworICAgIHRoaXMucGFnZUxhYmVsID0gcGFnZUxhYmVsOworCisgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZShmYWxzZSk7CisgIH0KKworICBzZXRQYWdlc0NvdW50KHBhZ2VzQ291bnQsIGhhc1BhZ2VMYWJlbHMpIHsKKyAgICB0aGlzLnBhZ2VzQ291bnQgPSBwYWdlc0NvdW50OworICAgIHRoaXMuaGFzUGFnZUxhYmVscyA9IGhhc1BhZ2VMYWJlbHM7CisKKyAgICB0aGlzLl91cGRhdGVVSVN0YXRlKHRydWUpOworICB9CisKKyAgc2V0UGFnZVNjYWxlKHBhZ2VTY2FsZVZhbHVlLCBwYWdlU2NhbGUpIHsKKyAgICB0aGlzLnBhZ2VTY2FsZVZhbHVlID0gKHBhZ2VTY2FsZVZhbHVlIHx8IHBhZ2VTY2FsZSkudG9TdHJpbmcoKTsKKyAgICB0aGlzLnBhZ2VTY2FsZSA9IHBhZ2VTY2FsZTsKKworICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUoZmFsc2UpOworICB9CisKKyAgcmVzZXQoKSB7CisgICAgdGhpcy5wYWdlTnVtYmVyID0gMDsKKyAgICB0aGlzLnBhZ2VMYWJlbCA9IG51bGw7CisgICAgdGhpcy5oYXNQYWdlTGFiZWxzID0gZmFsc2U7CisgICAgdGhpcy5wYWdlc0NvdW50ID0gMDsKKyAgICB0aGlzLnBhZ2VTY2FsZVZhbHVlID0gX3VpX3V0aWxzLkRFRkFVTFRfU0NBTEVfVkFMVUU7CisgICAgdGhpcy5wYWdlU2NhbGUgPSBfdWlfdXRpbHMuREVGQVVMVF9TQ0FMRTsKKworICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUodHJ1ZSk7CisKKyAgICB0aGlzLnVwZGF0ZUxvYWRpbmdJbmRpY2F0b3JTdGF0ZSgpOworICB9CisKKyAgX2JpbmRMaXN0ZW5lcnMoKSB7CisgICAgY29uc3QgeworICAgICAgcGFnZU51bWJlciwKKyAgICAgIHNjYWxlU2VsZWN0CisgICAgfSA9IHRoaXMuaXRlbXM7CisgICAgY29uc3Qgc2VsZiA9IHRoaXM7CisKKyAgICBmb3IgKGNvbnN0IHsKKyAgICAgIGVsZW1lbnQsCisgICAgICBldmVudE5hbWUKKyAgICB9IG9mIHRoaXMuYnV0dG9ucykgeworICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGV2dCA9PiB7CisgICAgICAgIGlmIChldmVudE5hbWUgIT09IG51bGwpIHsKKyAgICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKGV2ZW50TmFtZSwgeworICAgICAgICAgICAgc291cmNlOiB0aGlzCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworICAgIHBhZ2VOdW1iZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnNlbGVjdCgpOworICAgIH0pOworICAgIHBhZ2VOdW1iZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgeworICAgICAgc2VsZi5ldmVudEJ1cy5kaXNwYXRjaCgicGFnZW51bWJlcmNoYW5nZWQiLCB7CisgICAgICAgIHNvdXJjZTogc2VsZiwKKyAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUKKyAgICAgIH0pOworICAgIH0pOworICAgIHNjYWxlU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLnZhbHVlID09PSAiY3VzdG9tIikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2goInNjYWxlY2hhbmdlZCIsIHsKKyAgICAgICAgc291cmNlOiBzZWxmLAorICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZQorICAgICAgfSk7CisgICAgfSk7CisgICAgc2NhbGVTZWxlY3Qub25jb250ZXh0bWVudSA9IF91aV91dGlscy5ub0NvbnRleHRNZW51SGFuZGxlcjsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJsb2NhbGl6ZWQiLCAoKSA9PiB7CisgICAgICB0aGlzLl93YXNMb2NhbGl6ZWQgPSB0cnVlOworCisgICAgICB0aGlzLl9hZGp1c3RTY2FsZVdpZHRoKCk7CisKKyAgICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUodHJ1ZSk7CisgICAgfSk7CisgIH0KKworICBfdXBkYXRlVUlTdGF0ZShyZXNldE51bVBhZ2VzID0gZmFsc2UpIHsKKyAgICBpZiAoIXRoaXMuX3dhc0xvY2FsaXplZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHsKKyAgICAgIHBhZ2VOdW1iZXIsCisgICAgICBwYWdlc0NvdW50LAorICAgICAgcGFnZVNjYWxlVmFsdWUsCisgICAgICBwYWdlU2NhbGUsCisgICAgICBpdGVtcworICAgIH0gPSB0aGlzOworCisgICAgaWYgKHJlc2V0TnVtUGFnZXMpIHsKKyAgICAgIGlmICh0aGlzLmhhc1BhZ2VMYWJlbHMpIHsKKyAgICAgICAgaXRlbXMucGFnZU51bWJlci50eXBlID0gInRleHQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaXRlbXMucGFnZU51bWJlci50eXBlID0gIm51bWJlciI7CisgICAgICAgIHRoaXMubDEwbi5nZXQoIm9mX3BhZ2VzIiwgeworICAgICAgICAgIHBhZ2VzQ291bnQKKyAgICAgICAgfSwgIm9mIHt7cGFnZXNDb3VudH19IikudGhlbihtc2cgPT4geworICAgICAgICAgIGl0ZW1zLm51bVBhZ2VzLnRleHRDb250ZW50ID0gbXNnOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgaXRlbXMucGFnZU51bWJlci5tYXggPSBwYWdlc0NvdW50OworICAgIH0KKworICAgIGlmICh0aGlzLmhhc1BhZ2VMYWJlbHMpIHsKKyAgICAgIGl0ZW1zLnBhZ2VOdW1iZXIudmFsdWUgPSB0aGlzLnBhZ2VMYWJlbDsKKyAgICAgIHRoaXMubDEwbi5nZXQoInBhZ2Vfb2ZfcGFnZXMiLCB7CisgICAgICAgIHBhZ2VOdW1iZXIsCisgICAgICAgIHBhZ2VzQ291bnQKKyAgICAgIH0sICIoe3twYWdlTnVtYmVyfX0gb2Yge3twYWdlc0NvdW50fX0pIikudGhlbihtc2cgPT4geworICAgICAgICBpdGVtcy5udW1QYWdlcy50ZXh0Q29udGVudCA9IG1zZzsKKyAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICBpdGVtcy5wYWdlTnVtYmVyLnZhbHVlID0gcGFnZU51bWJlcjsKKyAgICB9CisKKyAgICBpdGVtcy5wcmV2aW91cy5kaXNhYmxlZCA9IHBhZ2VOdW1iZXIgPD0gMTsKKyAgICBpdGVtcy5uZXh0LmRpc2FibGVkID0gcGFnZU51bWJlciA+PSBwYWdlc0NvdW50OworICAgIGl0ZW1zLnpvb21PdXQuZGlzYWJsZWQgPSBwYWdlU2NhbGUgPD0gX3VpX3V0aWxzLk1JTl9TQ0FMRTsKKyAgICBpdGVtcy56b29tSW4uZGlzYWJsZWQgPSBwYWdlU2NhbGUgPj0gX3VpX3V0aWxzLk1BWF9TQ0FMRTsKKyAgICBjb25zdCBjdXN0b21TY2FsZSA9IE1hdGgucm91bmQocGFnZVNjYWxlICogMTAwMDApIC8gMTAwOworICAgIHRoaXMubDEwbi5nZXQoInBhZ2Vfc2NhbGVfcGVyY2VudCIsIHsKKyAgICAgIHNjYWxlOiBjdXN0b21TY2FsZQorICAgIH0sICJ7e3NjYWxlfX0lIikudGhlbihtc2cgPT4geworICAgICAgbGV0IHByZWRlZmluZWRWYWx1ZUZvdW5kID0gZmFsc2U7CisKKyAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGl0ZW1zLnNjYWxlU2VsZWN0Lm9wdGlvbnMpIHsKKyAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSAhPT0gcGFnZVNjYWxlVmFsdWUpIHsKKyAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7CisgICAgICAgIHByZWRlZmluZWRWYWx1ZUZvdW5kID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFwcmVkZWZpbmVkVmFsdWVGb3VuZCkgeworICAgICAgICBpdGVtcy5jdXN0b21TY2FsZU9wdGlvbi50ZXh0Q29udGVudCA9IG1zZzsKKyAgICAgICAgaXRlbXMuY3VzdG9tU2NhbGVPcHRpb24uc2VsZWN0ZWQgPSB0cnVlOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgdXBkYXRlTG9hZGluZ0luZGljYXRvclN0YXRlKGxvYWRpbmcgPSBmYWxzZSkgeworICAgIGNvbnN0IHBhZ2VOdW1iZXJJbnB1dCA9IHRoaXMuaXRlbXMucGFnZU51bWJlcjsKKyAgICBwYWdlTnVtYmVySW5wdXQuY2xhc3NMaXN0LnRvZ2dsZShQQUdFX05VTUJFUl9MT0FESU5HX0lORElDQVRPUiwgbG9hZGluZyk7CisgIH0KKworICBhc3luYyBfYWRqdXN0U2NhbGVXaWR0aCgpIHsKKyAgICBjb25zdCB7CisgICAgICBpdGVtcywKKyAgICAgIGwxMG4KKyAgICB9ID0gdGhpczsKKyAgICBjb25zdCBwcmVkZWZpbmVkVmFsdWVzUHJvbWlzZSA9IFByb21pc2UuYWxsKFtsMTBuLmdldCgicGFnZV9zY2FsZV9hdXRvIiwgbnVsbCwgIkF1dG9tYXRpYyBab29tIiksIGwxMG4uZ2V0KCJwYWdlX3NjYWxlX2FjdHVhbCIsIG51bGwsICJBY3R1YWwgU2l6ZSIpLCBsMTBuLmdldCgicGFnZV9zY2FsZV9maXQiLCBudWxsLCAiUGFnZSBGaXQiKSwgbDEwbi5nZXQoInBhZ2Vfc2NhbGVfd2lkdGgiLCBudWxsLCAiUGFnZSBXaWR0aCIpXSk7CisgICAgbGV0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOworICAgIGNhbnZhcy5tb3pPcGFxdWUgPSB0cnVlOworICAgIGxldCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CisgICAgICBhbHBoYTogZmFsc2UKKyAgICB9KTsKKyAgICBhd2FpdCBfdWlfdXRpbHMuYW5pbWF0aW9uU3RhcnRlZDsKKyAgICBjb25zdCB7CisgICAgICBmb250U2l6ZSwKKyAgICAgIGZvbnRGYW1pbHkKKyAgICB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShpdGVtcy5zY2FsZVNlbGVjdCk7CisgICAgY3R4LmZvbnQgPSBgJHtmb250U2l6ZX0gJHtmb250RmFtaWx5fWA7CisgICAgbGV0IG1heFdpZHRoID0gMDsKKworICAgIGZvciAoY29uc3QgcHJlZGVmaW5lZFZhbHVlIG9mIGF3YWl0IHByZWRlZmluZWRWYWx1ZXNQcm9taXNlKSB7CisgICAgICBjb25zdCB7CisgICAgICAgIHdpZHRoCisgICAgICB9ID0gY3R4Lm1lYXN1cmVUZXh0KHByZWRlZmluZWRWYWx1ZSk7CisKKyAgICAgIGlmICh3aWR0aCA+IG1heFdpZHRoKSB7CisgICAgICAgIG1heFdpZHRoID0gd2lkdGg7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgb3ZlcmZsb3cgPSBTQ0FMRV9TRUxFQ1RfV0lEVEggLSBTQ0FMRV9TRUxFQ1RfQ09OVEFJTkVSX1dJRFRIOworICAgIG1heFdpZHRoICs9IDIgKiBvdmVyZmxvdzsKKworICAgIGlmIChtYXhXaWR0aCA+IFNDQUxFX1NFTEVDVF9DT05UQUlORVJfV0lEVEgpIHsKKyAgICAgIGl0ZW1zLnNjYWxlU2VsZWN0LnN0eWxlLndpZHRoID0gYCR7bWF4V2lkdGggKyBvdmVyZmxvd31weGA7CisgICAgICBpdGVtcy5zY2FsZVNlbGVjdENvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke21heFdpZHRofXB4YDsKKyAgICB9CisKKyAgICBjYW52YXMud2lkdGggPSAwOworICAgIGNhbnZhcy5oZWlnaHQgPSAwOworICAgIGNhbnZhcyA9IGN0eCA9IG51bGw7CisgIH0KKworfQorCitleHBvcnRzLlRvb2xiYXIgPSBUb29sYmFyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi93ZWIvdWlfdXRpbHMuanMgYi9saWIvd2ViL3VpX3V0aWxzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmFhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3VpX3V0aWxzLmpzCkBAIC0wLDAgKzEsNzU2IEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisidXNlIHN0cmljdCI7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5pc1ZhbGlkUm90YXRpb24gPSBpc1ZhbGlkUm90YXRpb247CitleHBvcnRzLmlzVmFsaWRTY3JvbGxNb2RlID0gaXNWYWxpZFNjcm9sbE1vZGU7CitleHBvcnRzLmlzVmFsaWRTcHJlYWRNb2RlID0gaXNWYWxpZFNwcmVhZE1vZGU7CitleHBvcnRzLmlzUG9ydHJhaXRPcmllbnRhdGlvbiA9IGlzUG9ydHJhaXRPcmllbnRhdGlvbjsKK2V4cG9ydHMuY2xhbXAgPSBjbGFtcDsKK2V4cG9ydHMuZ2V0UERGRmlsZU5hbWVGcm9tVVJMID0gZ2V0UERGRmlsZU5hbWVGcm9tVVJMOworZXhwb3J0cy5ub0NvbnRleHRNZW51SGFuZGxlciA9IG5vQ29udGV4dE1lbnVIYW5kbGVyOworZXhwb3J0cy5wYXJzZVF1ZXJ5U3RyaW5nID0gcGFyc2VRdWVyeVN0cmluZzsKK2V4cG9ydHMuYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzID0gYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzOworZXhwb3J0cy5nZXRWaXNpYmxlRWxlbWVudHMgPSBnZXRWaXNpYmxlRWxlbWVudHM7CitleHBvcnRzLnJvdW5kVG9EaXZpZGUgPSByb3VuZFRvRGl2aWRlOworZXhwb3J0cy5nZXRQYWdlU2l6ZUluY2hlcyA9IGdldFBhZ2VTaXplSW5jaGVzOworZXhwb3J0cy5hcHByb3hpbWF0ZUZyYWN0aW9uID0gYXBwcm94aW1hdGVGcmFjdGlvbjsKK2V4cG9ydHMuZ2V0T3V0cHV0U2NhbGUgPSBnZXRPdXRwdXRTY2FsZTsKK2V4cG9ydHMuc2Nyb2xsSW50b1ZpZXcgPSBzY3JvbGxJbnRvVmlldzsKK2V4cG9ydHMud2F0Y2hTY3JvbGwgPSB3YXRjaFNjcm9sbDsKK2V4cG9ydHMuYmluYXJ5U2VhcmNoRmlyc3RJdGVtID0gYmluYXJ5U2VhcmNoRmlyc3RJdGVtOworZXhwb3J0cy5ub3JtYWxpemVXaGVlbEV2ZW50RGlyZWN0aW9uID0gbm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbjsKK2V4cG9ydHMubm9ybWFsaXplV2hlZWxFdmVudERlbHRhID0gbm9ybWFsaXplV2hlZWxFdmVudERlbHRhOworZXhwb3J0cy53YWl0T25FdmVudE9yVGltZW91dCA9IHdhaXRPbkV2ZW50T3JUaW1lb3V0OworZXhwb3J0cy5tb3ZlVG9FbmRPZkFycmF5ID0gbW92ZVRvRW5kT2ZBcnJheTsKK2V4cG9ydHMuV2FpdE9uVHlwZSA9IGV4cG9ydHMuYW5pbWF0aW9uU3RhcnRlZCA9IGV4cG9ydHMuUHJvZ3Jlc3NCYXIgPSBleHBvcnRzLkV2ZW50QnVzID0gZXhwb3J0cy5OdWxsTDEwbiA9IGV4cG9ydHMuU3ByZWFkTW9kZSA9IGV4cG9ydHMuU2Nyb2xsTW9kZSA9IGV4cG9ydHMuVGV4dExheWVyTW9kZSA9IGV4cG9ydHMuUmVuZGVyZXJUeXBlID0gZXhwb3J0cy5QcmVzZW50YXRpb25Nb2RlU3RhdGUgPSBleHBvcnRzLlZFUlRJQ0FMX1BBRERJTkcgPSBleHBvcnRzLlNDUk9MTEJBUl9QQURESU5HID0gZXhwb3J0cy5NQVhfQVVUT19TQ0FMRSA9IGV4cG9ydHMuVU5LTk9XTl9TQ0FMRSA9IGV4cG9ydHMuTUFYX1NDQUxFID0gZXhwb3J0cy5NSU5fU0NBTEUgPSBleHBvcnRzLkRFRkFVTFRfU0NBTEUgPSBleHBvcnRzLkRFRkFVTFRfU0NBTEVfVkFMVUUgPSBleHBvcnRzLkNTU19VTklUUyA9IGV4cG9ydHMuQXV0b1ByaW50UmVnRXhwID0gdm9pZCAwOworY29uc3QgQ1NTX1VOSVRTID0gOTYuMCAvIDcyLjA7CitleHBvcnRzLkNTU19VTklUUyA9IENTU19VTklUUzsKK2NvbnN0IERFRkFVTFRfU0NBTEVfVkFMVUUgPSAiYXV0byI7CitleHBvcnRzLkRFRkFVTFRfU0NBTEVfVkFMVUUgPSBERUZBVUxUX1NDQUxFX1ZBTFVFOworY29uc3QgREVGQVVMVF9TQ0FMRSA9IDEuMDsKK2V4cG9ydHMuREVGQVVMVF9TQ0FMRSA9IERFRkFVTFRfU0NBTEU7Citjb25zdCBNSU5fU0NBTEUgPSAwLjE7CitleHBvcnRzLk1JTl9TQ0FMRSA9IE1JTl9TQ0FMRTsKK2NvbnN0IE1BWF9TQ0FMRSA9IDEwLjA7CitleHBvcnRzLk1BWF9TQ0FMRSA9IE1BWF9TQ0FMRTsKK2NvbnN0IFVOS05PV05fU0NBTEUgPSAwOworZXhwb3J0cy5VTktOT1dOX1NDQUxFID0gVU5LTk9XTl9TQ0FMRTsKK2NvbnN0IE1BWF9BVVRPX1NDQUxFID0gMS4yNTsKK2V4cG9ydHMuTUFYX0FVVE9fU0NBTEUgPSBNQVhfQVVUT19TQ0FMRTsKK2NvbnN0IFNDUk9MTEJBUl9QQURESU5HID0gNDA7CitleHBvcnRzLlNDUk9MTEJBUl9QQURESU5HID0gU0NST0xMQkFSX1BBRERJTkc7Citjb25zdCBWRVJUSUNBTF9QQURESU5HID0gNTsKK2V4cG9ydHMuVkVSVElDQUxfUEFERElORyA9IFZFUlRJQ0FMX1BBRERJTkc7Citjb25zdCBQcmVzZW50YXRpb25Nb2RlU3RhdGUgPSB7CisgIFVOS05PV046IDAsCisgIE5PUk1BTDogMSwKKyAgQ0hBTkdJTkc6IDIsCisgIEZVTExTQ1JFRU46IDMKK307CitleHBvcnRzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IFByZXNlbnRhdGlvbk1vZGVTdGF0ZTsKK2NvbnN0IFJlbmRlcmVyVHlwZSA9IHsKKyAgQ0FOVkFTOiAiY2FudmFzIiwKKyAgU1ZHOiAic3ZnIgorfTsKK2V4cG9ydHMuUmVuZGVyZXJUeXBlID0gUmVuZGVyZXJUeXBlOworY29uc3QgVGV4dExheWVyTW9kZSA9IHsKKyAgRElTQUJMRTogMCwKKyAgRU5BQkxFOiAxLAorICBFTkFCTEVfRU5IQU5DRTogMgorfTsKK2V4cG9ydHMuVGV4dExheWVyTW9kZSA9IFRleHRMYXllck1vZGU7Citjb25zdCBTY3JvbGxNb2RlID0geworICBVTktOT1dOOiAtMSwKKyAgVkVSVElDQUw6IDAsCisgIEhPUklaT05UQUw6IDEsCisgIFdSQVBQRUQ6IDIKK307CitleHBvcnRzLlNjcm9sbE1vZGUgPSBTY3JvbGxNb2RlOworY29uc3QgU3ByZWFkTW9kZSA9IHsKKyAgVU5LTk9XTjogLTEsCisgIE5PTkU6IDAsCisgIE9ERDogMSwKKyAgRVZFTjogMgorfTsKK2V4cG9ydHMuU3ByZWFkTW9kZSA9IFNwcmVhZE1vZGU7Citjb25zdCBBdXRvUHJpbnRSZWdFeHAgPSAvXGJwcmludFxzKlwoLzsKK2V4cG9ydHMuQXV0b1ByaW50UmVnRXhwID0gQXV0b1ByaW50UmVnRXhwOworCitmdW5jdGlvbiBmb3JtYXRMMTBuVmFsdWUodGV4dCwgYXJncykgeworICBpZiAoIWFyZ3MpIHsKKyAgICByZXR1cm4gdGV4dDsKKyAgfQorCisgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1x7XHtccyooXHcrKVxzKlx9XH0vZywgKGFsbCwgbmFtZSkgPT4geworICAgIHJldHVybiBuYW1lIGluIGFyZ3MgPyBhcmdzW25hbWVdIDogInt7IiArIG5hbWUgKyAifX0iOworICB9KTsKK30KKworY29uc3QgTnVsbEwxMG4gPSB7CisgIGFzeW5jIGdldExhbmd1YWdlKCkgeworICAgIHJldHVybiAiZW4tdXMiOworICB9LAorCisgIGFzeW5jIGdldERpcmVjdGlvbigpIHsKKyAgICByZXR1cm4gImx0ciI7CisgIH0sCisKKyAgYXN5bmMgZ2V0KHByb3BlcnR5LCBhcmdzLCBmYWxsYmFjaykgeworICAgIHJldHVybiBmb3JtYXRMMTBuVmFsdWUoZmFsbGJhY2ssIGFyZ3MpOworICB9LAorCisgIGFzeW5jIHRyYW5zbGF0ZShlbGVtZW50KSB7fQorCit9OworZXhwb3J0cy5OdWxsTDEwbiA9IE51bGxMMTBuOworCitmdW5jdGlvbiBnZXRPdXRwdXRTY2FsZShjdHgpIHsKKyAgY29uc3QgZGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7CisgIGNvbnN0IGJhY2tpbmdTdG9yZVJhdGlvID0gY3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY3R4Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY3R4Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY3R4LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMTsKKyAgY29uc3QgcGl4ZWxSYXRpbyA9IGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVSYXRpbzsKKyAgcmV0dXJuIHsKKyAgICBzeDogcGl4ZWxSYXRpbywKKyAgICBzeTogcGl4ZWxSYXRpbywKKyAgICBzY2FsZWQ6IHBpeGVsUmF0aW8gIT09IDEKKyAgfTsKK30KKworZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoZWxlbWVudCwgc3BvdCwgc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMgPSBmYWxzZSkgeworICBsZXQgcGFyZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisKKyAgaWYgKCFwYXJlbnQpIHsKKyAgICBjb25zb2xlLmVycm9yKCJvZmZzZXRQYXJlbnQgaXMgbm90IHNldCAtLSBjYW5ub3Qgc2Nyb2xsIik7CisgICAgcmV0dXJuOworICB9CisKKyAgbGV0IG9mZnNldFkgPSBlbGVtZW50Lm9mZnNldFRvcCArIGVsZW1lbnQuY2xpZW50VG9wOworICBsZXQgb2Zmc2V0WCA9IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDsKKworICB3aGlsZSAocGFyZW50LmNsaWVudEhlaWdodCA9PT0gcGFyZW50LnNjcm9sbEhlaWdodCAmJiBwYXJlbnQuY2xpZW50V2lkdGggPT09IHBhcmVudC5zY3JvbGxXaWR0aCB8fCBza2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyAmJiBnZXRDb21wdXRlZFN0eWxlKHBhcmVudCkub3ZlcmZsb3cgPT09ICJoaWRkZW4iKSB7CisgICAgaWYgKHBhcmVudC5kYXRhc2V0Ll9zY2FsZVkpIHsKKyAgICAgIG9mZnNldFkgLz0gcGFyZW50LmRhdGFzZXQuX3NjYWxlWTsKKyAgICAgIG9mZnNldFggLz0gcGFyZW50LmRhdGFzZXQuX3NjYWxlWDsKKyAgICB9CisKKyAgICBvZmZzZXRZICs9IHBhcmVudC5vZmZzZXRUb3A7CisgICAgb2Zmc2V0WCArPSBwYXJlbnQub2Zmc2V0TGVmdDsKKyAgICBwYXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50OworCisgICAgaWYgKCFwYXJlbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpZiAoc3BvdCkgeworICAgIGlmIChzcG90LnRvcCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBvZmZzZXRZICs9IHNwb3QudG9wOworICAgIH0KKworICAgIGlmIChzcG90LmxlZnQgIT09IHVuZGVmaW5lZCkgeworICAgICAgb2Zmc2V0WCArPSBzcG90LmxlZnQ7CisgICAgICBwYXJlbnQuc2Nyb2xsTGVmdCA9IG9mZnNldFg7CisgICAgfQorICB9CisKKyAgcGFyZW50LnNjcm9sbFRvcCA9IG9mZnNldFk7Cit9CisKK2Z1bmN0aW9uIHdhdGNoU2Nyb2xsKHZpZXdBcmVhRWxlbWVudCwgY2FsbGJhY2spIHsKKyAgY29uc3QgZGVib3VuY2VTY3JvbGwgPSBmdW5jdGlvbiAoZXZ0KSB7CisgICAgaWYgKHJBRikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gdmlld0FyZWFFbGVtZW50U2Nyb2xsZWQoKSB7CisgICAgICByQUYgPSBudWxsOworICAgICAgY29uc3QgY3VycmVudFggPSB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsTGVmdDsKKyAgICAgIGNvbnN0IGxhc3RYID0gc3RhdGUubGFzdFg7CisKKyAgICAgIGlmIChjdXJyZW50WCAhPT0gbGFzdFgpIHsKKyAgICAgICAgc3RhdGUucmlnaHQgPSBjdXJyZW50WCA+IGxhc3RYOworICAgICAgfQorCisgICAgICBzdGF0ZS5sYXN0WCA9IGN1cnJlbnRYOworICAgICAgY29uc3QgY3VycmVudFkgPSB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsVG9wOworICAgICAgY29uc3QgbGFzdFkgPSBzdGF0ZS5sYXN0WTsKKworICAgICAgaWYgKGN1cnJlbnRZICE9PSBsYXN0WSkgeworICAgICAgICBzdGF0ZS5kb3duID0gY3VycmVudFkgPiBsYXN0WTsKKyAgICAgIH0KKworICAgICAgc3RhdGUubGFzdFkgPSBjdXJyZW50WTsKKyAgICAgIGNhbGxiYWNrKHN0YXRlKTsKKyAgICB9KTsKKyAgfTsKKworICBjb25zdCBzdGF0ZSA9IHsKKyAgICByaWdodDogdHJ1ZSwKKyAgICBkb3duOiB0cnVlLAorICAgIGxhc3RYOiB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsTGVmdCwKKyAgICBsYXN0WTogdmlld0FyZWFFbGVtZW50LnNjcm9sbFRvcCwKKyAgICBfZXZlbnRIYW5kbGVyOiBkZWJvdW5jZVNjcm9sbAorICB9OworICBsZXQgckFGID0gbnVsbDsKKyAgdmlld0FyZWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGRlYm91bmNlU2Nyb2xsLCB0cnVlKTsKKyAgcmV0dXJuIHN0YXRlOworfQorCitmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KSB7CisgIGNvbnN0IHBhcnRzID0gcXVlcnkuc3BsaXQoIiYiKTsKKyAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKworICBmb3IgKGxldCBpID0gMCwgaWkgPSBwYXJ0cy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgY29uc3QgcGFyYW0gPSBwYXJ0c1tpXS5zcGxpdCgiPSIpOworICAgIGNvbnN0IGtleSA9IHBhcmFtWzBdLnRvTG93ZXJDYXNlKCk7CisgICAgY29uc3QgdmFsdWUgPSBwYXJhbS5sZW5ndGggPiAxID8gcGFyYW1bMV0gOiBudWxsOworICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQoa2V5KV0gPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpOworICB9CisKKyAgcmV0dXJuIHBhcmFtczsKK30KKworZnVuY3Rpb24gYmluYXJ5U2VhcmNoRmlyc3RJdGVtKGl0ZW1zLCBjb25kaXRpb24pIHsKKyAgbGV0IG1pbkluZGV4ID0gMDsKKyAgbGV0IG1heEluZGV4ID0gaXRlbXMubGVuZ3RoIC0gMTsKKworICBpZiAobWF4SW5kZXggPCAwIHx8ICFjb25kaXRpb24oaXRlbXNbbWF4SW5kZXhdKSkgeworICAgIHJldHVybiBpdGVtcy5sZW5ndGg7CisgIH0KKworICBpZiAoY29uZGl0aW9uKGl0ZW1zW21pbkluZGV4XSkpIHsKKyAgICByZXR1cm4gbWluSW5kZXg7CisgIH0KKworICB3aGlsZSAobWluSW5kZXggPCBtYXhJbmRleCkgeworICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IG1pbkluZGV4ICsgbWF4SW5kZXggPj4gMTsKKyAgICBjb25zdCBjdXJyZW50SXRlbSA9IGl0ZW1zW2N1cnJlbnRJbmRleF07CisKKyAgICBpZiAoY29uZGl0aW9uKGN1cnJlbnRJdGVtKSkgeworICAgICAgbWF4SW5kZXggPSBjdXJyZW50SW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgIG1pbkluZGV4ID0gY3VycmVudEluZGV4ICsgMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbWluSW5kZXg7Cit9CisKK2Z1bmN0aW9uIGFwcHJveGltYXRlRnJhY3Rpb24oeCkgeworICBpZiAoTWF0aC5mbG9vcih4KSA9PT0geCkgeworICAgIHJldHVybiBbeCwgMV07CisgIH0KKworICBjb25zdCB4aW52ID0gMSAvIHg7CisgIGNvbnN0IGxpbWl0ID0gODsKKworICBpZiAoeGludiA+IGxpbWl0KSB7CisgICAgcmV0dXJuIFsxLCBsaW1pdF07CisgIH0gZWxzZSBpZiAoTWF0aC5mbG9vcih4aW52KSA9PT0geGludikgeworICAgIHJldHVybiBbMSwgeGludl07CisgIH0KKworICBjb25zdCB4XyA9IHggPiAxID8geGludiA6IHg7CisgIGxldCBhID0gMCwKKyAgICAgIGIgPSAxLAorICAgICAgYyA9IDEsCisgICAgICBkID0gMTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnN0IHAgPSBhICsgYywKKyAgICAgICAgICBxID0gYiArIGQ7CisKKyAgICBpZiAocSA+IGxpbWl0KSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoeF8gPD0gcCAvIHEpIHsKKyAgICAgIGMgPSBwOworICAgICAgZCA9IHE7CisgICAgfSBlbHNlIHsKKyAgICAgIGEgPSBwOworICAgICAgYiA9IHE7CisgICAgfQorICB9CisKKyAgbGV0IHJlc3VsdDsKKworICBpZiAoeF8gLSBhIC8gYiA8IGMgLyBkIC0geF8pIHsKKyAgICByZXN1bHQgPSB4XyA9PT0geCA/IFthLCBiXSA6IFtiLCBhXTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSB4XyA9PT0geCA/IFtjLCBkXSA6IFtkLCBjXTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Z1bmN0aW9uIHJvdW5kVG9EaXZpZGUoeCwgZGl2KSB7CisgIGNvbnN0IHIgPSB4ICUgZGl2OworICByZXR1cm4gciA9PT0gMCA/IHggOiBNYXRoLnJvdW5kKHggLSByICsgZGl2KTsKK30KKworZnVuY3Rpb24gZ2V0UGFnZVNpemVJbmNoZXMoeworICB2aWV3LAorICB1c2VyVW5pdCwKKyAgcm90YXRlCit9KSB7CisgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSB2aWV3OworICBjb25zdCBjaGFuZ2VPcmllbnRhdGlvbiA9IHJvdGF0ZSAlIDE4MCAhPT0gMDsKKyAgY29uc3Qgd2lkdGggPSAoeDIgLSB4MSkgLyA3MiAqIHVzZXJVbml0OworICBjb25zdCBoZWlnaHQgPSAoeTIgLSB5MSkgLyA3MiAqIHVzZXJVbml0OworICByZXR1cm4geworICAgIHdpZHRoOiBjaGFuZ2VPcmllbnRhdGlvbiA/IGhlaWdodCA6IHdpZHRoLAorICAgIGhlaWdodDogY2hhbmdlT3JpZW50YXRpb24gPyB3aWR0aCA6IGhlaWdodAorICB9OworfQorCitmdW5jdGlvbiBiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMoaW5kZXgsIHZpZXdzLCB0b3ApIHsKKyAgaWYgKGluZGV4IDwgMikgeworICAgIHJldHVybiBpbmRleDsKKyAgfQorCisgIGxldCBlbHQgPSB2aWV3c1tpbmRleF0uZGl2OworICBsZXQgcGFnZVRvcCA9IGVsdC5vZmZzZXRUb3AgKyBlbHQuY2xpZW50VG9wOworCisgIGlmIChwYWdlVG9wID49IHRvcCkgeworICAgIGVsdCA9IHZpZXdzW2luZGV4IC0gMV0uZGl2OworICAgIHBhZ2VUb3AgPSBlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcDsKKyAgfQorCisgIGZvciAobGV0IGkgPSBpbmRleCAtIDI7IGkgPj0gMDsgLS1pKSB7CisgICAgZWx0ID0gdmlld3NbaV0uZGl2OworCisgICAgaWYgKGVsdC5vZmZzZXRUb3AgKyBlbHQuY2xpZW50VG9wICsgZWx0LmNsaWVudEhlaWdodCA8PSBwYWdlVG9wKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpbmRleCA9IGk7CisgIH0KKworICByZXR1cm4gaW5kZXg7Cit9CisKK2Z1bmN0aW9uIGdldFZpc2libGVFbGVtZW50cyhzY3JvbGxFbCwgdmlld3MsIHNvcnRCeVZpc2liaWxpdHkgPSBmYWxzZSwgaG9yaXpvbnRhbCA9IGZhbHNlKSB7CisgIGNvbnN0IHRvcCA9IHNjcm9sbEVsLnNjcm9sbFRvcCwKKyAgICAgICAgYm90dG9tID0gdG9wICsgc2Nyb2xsRWwuY2xpZW50SGVpZ2h0OworICBjb25zdCBsZWZ0ID0gc2Nyb2xsRWwuc2Nyb2xsTGVmdCwKKyAgICAgICAgcmlnaHQgPSBsZWZ0ICsgc2Nyb2xsRWwuY2xpZW50V2lkdGg7CisKKyAgZnVuY3Rpb24gaXNFbGVtZW50Qm90dG9tQWZ0ZXJWaWV3VG9wKHZpZXcpIHsKKyAgICBjb25zdCBlbGVtZW50ID0gdmlldy5kaXY7CisgICAgY29uc3QgZWxlbWVudEJvdHRvbSA9IGVsZW1lbnQub2Zmc2V0VG9wICsgZWxlbWVudC5jbGllbnRUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDsKKyAgICByZXR1cm4gZWxlbWVudEJvdHRvbSA+IHRvcDsKKyAgfQorCisgIGZ1bmN0aW9uIGlzRWxlbWVudFJpZ2h0QWZ0ZXJWaWV3TGVmdCh2aWV3KSB7CisgICAgY29uc3QgZWxlbWVudCA9IHZpZXcuZGl2OworICAgIGNvbnN0IGVsZW1lbnRSaWdodCA9IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgcmV0dXJuIGVsZW1lbnRSaWdodCA+IGxlZnQ7CisgIH0KKworICBjb25zdCB2aXNpYmxlID0gW10sCisgICAgICAgIG51bVZpZXdzID0gdmlld3MubGVuZ3RoOworICBsZXQgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA9IG51bVZpZXdzID09PSAwID8gMCA6IGJpbmFyeVNlYXJjaEZpcnN0SXRlbSh2aWV3cywgaG9yaXpvbnRhbCA/IGlzRWxlbWVudFJpZ2h0QWZ0ZXJWaWV3TGVmdCA6IGlzRWxlbWVudEJvdHRvbUFmdGVyVmlld1RvcCk7CisKKyAgaWYgKGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQgPiAwICYmIGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQgPCBudW1WaWV3cyAmJiAhaG9yaXpvbnRhbCkgeworICAgIGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQgPSBiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMoZmlyc3RWaXNpYmxlRWxlbWVudEluZCwgdmlld3MsIHRvcCk7CisgIH0KKworICBsZXQgbGFzdEVkZ2UgPSBob3Jpem9udGFsID8gcmlnaHQgOiAtMTsKKworICBmb3IgKGxldCBpID0gZmlyc3RWaXNpYmxlRWxlbWVudEluZDsgaSA8IG51bVZpZXdzOyBpKyspIHsKKyAgICBjb25zdCB2aWV3ID0gdmlld3NbaV0sCisgICAgICAgICAgZWxlbWVudCA9IHZpZXcuZGl2OworICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDsKKyAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcDsKKyAgICBjb25zdCB2aWV3V2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoLAorICAgICAgICAgIHZpZXdIZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDsKKyAgICBjb25zdCB2aWV3UmlnaHQgPSBjdXJyZW50V2lkdGggKyB2aWV3V2lkdGg7CisgICAgY29uc3Qgdmlld0JvdHRvbSA9IGN1cnJlbnRIZWlnaHQgKyB2aWV3SGVpZ2h0OworCisgICAgaWYgKGxhc3RFZGdlID09PSAtMSkgeworICAgICAgaWYgKHZpZXdCb3R0b20gPj0gYm90dG9tKSB7CisgICAgICAgIGxhc3RFZGdlID0gdmlld0JvdHRvbTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChob3Jpem9udGFsID8gY3VycmVudFdpZHRoIDogY3VycmVudEhlaWdodCkgPiBsYXN0RWRnZSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHZpZXdCb3R0b20gPD0gdG9wIHx8IGN1cnJlbnRIZWlnaHQgPj0gYm90dG9tIHx8IHZpZXdSaWdodCA8PSBsZWZ0IHx8IGN1cnJlbnRXaWR0aCA+PSByaWdodCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY29uc3QgaGlkZGVuSGVpZ2h0ID0gTWF0aC5tYXgoMCwgdG9wIC0gY3VycmVudEhlaWdodCkgKyBNYXRoLm1heCgwLCB2aWV3Qm90dG9tIC0gYm90dG9tKTsKKyAgICBjb25zdCBoaWRkZW5XaWR0aCA9IE1hdGgubWF4KDAsIGxlZnQgLSBjdXJyZW50V2lkdGgpICsgTWF0aC5tYXgoMCwgdmlld1JpZ2h0IC0gcmlnaHQpOworICAgIGNvbnN0IHBlcmNlbnQgPSAodmlld0hlaWdodCAtIGhpZGRlbkhlaWdodCkgKiAodmlld1dpZHRoIC0gaGlkZGVuV2lkdGgpICogMTAwIC8gdmlld0hlaWdodCAvIHZpZXdXaWR0aCB8IDA7CisgICAgdmlzaWJsZS5wdXNoKHsKKyAgICAgIGlkOiB2aWV3LmlkLAorICAgICAgeDogY3VycmVudFdpZHRoLAorICAgICAgeTogY3VycmVudEhlaWdodCwKKyAgICAgIHZpZXcsCisgICAgICBwZXJjZW50CisgICAgfSk7CisgIH0KKworICBjb25zdCBmaXJzdCA9IHZpc2libGVbMF0sCisgICAgICAgIGxhc3QgPSB2aXNpYmxlW3Zpc2libGUubGVuZ3RoIC0gMV07CisKKyAgaWYgKHNvcnRCeVZpc2liaWxpdHkpIHsKKyAgICB2aXNpYmxlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKKyAgICAgIGNvbnN0IHBjID0gYS5wZXJjZW50IC0gYi5wZXJjZW50OworCisgICAgICBpZiAoTWF0aC5hYnMocGMpID4gMC4wMDEpIHsKKyAgICAgICAgcmV0dXJuIC1wYzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkOworICAgIH0pOworICB9CisKKyAgcmV0dXJuIHsKKyAgICBmaXJzdCwKKyAgICBsYXN0LAorICAgIHZpZXdzOiB2aXNpYmxlCisgIH07Cit9CisKK2Z1bmN0aW9uIG5vQ29udGV4dE1lbnVIYW5kbGVyKGV2dCkgeworICBldnQucHJldmVudERlZmF1bHQoKTsKK30KKworZnVuY3Rpb24gaXNEYXRhU2NoZW1hKHVybCkgeworICBsZXQgaSA9IDA7CisgIGNvbnN0IGlpID0gdXJsLmxlbmd0aDsKKworICB3aGlsZSAoaSA8IGlpICYmIHVybFtpXS50cmltKCkgPT09ICIiKSB7CisgICAgaSsrOworICB9CisKKyAgcmV0dXJuIHVybC5zdWJzdHJpbmcoaSwgaSArIDUpLnRvTG93ZXJDYXNlKCkgPT09ICJkYXRhOiI7Cit9CisKK2Z1bmN0aW9uIGdldFBERkZpbGVOYW1lRnJvbVVSTCh1cmwsIGRlZmF1bHRGaWxlbmFtZSA9ICJkb2N1bWVudC5wZGYiKSB7CisgIGlmICh0eXBlb2YgdXJsICE9PSAic3RyaW5nIikgeworICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7CisgIH0KKworICBpZiAoaXNEYXRhU2NoZW1hKHVybCkpIHsKKyAgICBjb25zb2xlLndhcm4oImdldFBERkZpbGVOYW1lRnJvbVVSTDogIiArICdpZ25vcmluZyAiZGF0YToiIFVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nKTsKKyAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lOworICB9CisKKyAgY29uc3QgcmVVUkkgPSAvXig/Oig/OlteOl0rOik/XC9cL1teXC9dKyk/KFtePyNdKikoXD9bXiNdKik/KCMuKik/JC87CisgIGNvbnN0IHJlRmlsZW5hbWUgPSAvW15cLz8jPV0rXC5wZGZcYig/IS4qXC5wZGZcYikvaTsKKyAgY29uc3Qgc3BsaXRVUkkgPSByZVVSSS5leGVjKHVybCk7CisgIGxldCBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVsxXSkgfHwgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzJdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbM10pOworCisgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZSkgeworICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gc3VnZ2VzdGVkRmlsZW5hbWVbMF07CisKKyAgICBpZiAoc3VnZ2VzdGVkRmlsZW5hbWUuaW5jbHVkZXMoIiUiKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgc3VnZ2VzdGVkRmlsZW5hbWUgPSByZUZpbGVuYW1lLmV4ZWMoZGVjb2RlVVJJQ29tcG9uZW50KHN1Z2dlc3RlZEZpbGVuYW1lKSlbMF07CisgICAgICB9IGNhdGNoIChleCkge30KKyAgICB9CisgIH0KKworICByZXR1cm4gc3VnZ2VzdGVkRmlsZW5hbWUgfHwgZGVmYXVsdEZpbGVuYW1lOworfQorCitmdW5jdGlvbiBub3JtYWxpemVXaGVlbEV2ZW50RGlyZWN0aW9uKGV2dCkgeworICBsZXQgZGVsdGEgPSBNYXRoLnNxcnQoZXZ0LmRlbHRhWCAqIGV2dC5kZWx0YVggKyBldnQuZGVsdGFZICogZXZ0LmRlbHRhWSk7CisgIGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMihldnQuZGVsdGFZLCBldnQuZGVsdGFYKTsKKworICBpZiAoLTAuMjUgKiBNYXRoLlBJIDwgYW5nbGUgJiYgYW5nbGUgPCAwLjc1ICogTWF0aC5QSSkgeworICAgIGRlbHRhID0gLWRlbHRhOworICB9CisKKyAgcmV0dXJuIGRlbHRhOworfQorCitmdW5jdGlvbiBub3JtYWxpemVXaGVlbEV2ZW50RGVsdGEoZXZ0KSB7CisgIGxldCBkZWx0YSA9IG5vcm1hbGl6ZVdoZWVsRXZlbnREaXJlY3Rpb24oZXZ0KTsKKyAgY29uc3QgTU9VU0VfRE9NX0RFTFRBX1BJWEVMX01PREUgPSAwOworICBjb25zdCBNT1VTRV9ET01fREVMVEFfTElORV9NT0RFID0gMTsKKyAgY29uc3QgTU9VU0VfUElYRUxTX1BFUl9MSU5FID0gMzA7CisgIGNvbnN0IE1PVVNFX0xJTkVTX1BFUl9QQUdFID0gMzA7CisKKyAgaWYgKGV2dC5kZWx0YU1vZGUgPT09IE1PVVNFX0RPTV9ERUxUQV9QSVhFTF9NT0RFKSB7CisgICAgZGVsdGEgLz0gTU9VU0VfUElYRUxTX1BFUl9MSU5FICogTU9VU0VfTElORVNfUEVSX1BBR0U7CisgIH0gZWxzZSBpZiAoZXZ0LmRlbHRhTW9kZSA9PT0gTU9VU0VfRE9NX0RFTFRBX0xJTkVfTU9ERSkgeworICAgIGRlbHRhIC89IE1PVVNFX0xJTkVTX1BFUl9QQUdFOworICB9CisKKyAgcmV0dXJuIGRlbHRhOworfQorCitmdW5jdGlvbiBpc1ZhbGlkUm90YXRpb24oYW5nbGUpIHsKKyAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoYW5nbGUpICYmIGFuZ2xlICUgOTAgPT09IDA7Cit9CisKK2Z1bmN0aW9uIGlzVmFsaWRTY3JvbGxNb2RlKG1vZGUpIHsKKyAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobW9kZSkgJiYgT2JqZWN0LnZhbHVlcyhTY3JvbGxNb2RlKS5pbmNsdWRlcyhtb2RlKSAmJiBtb2RlICE9PSBTY3JvbGxNb2RlLlVOS05PV047Cit9CisKK2Z1bmN0aW9uIGlzVmFsaWRTcHJlYWRNb2RlKG1vZGUpIHsKKyAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobW9kZSkgJiYgT2JqZWN0LnZhbHVlcyhTcHJlYWRNb2RlKS5pbmNsdWRlcyhtb2RlKSAmJiBtb2RlICE9PSBTcHJlYWRNb2RlLlVOS05PV047Cit9CisKK2Z1bmN0aW9uIGlzUG9ydHJhaXRPcmllbnRhdGlvbihzaXplKSB7CisgIHJldHVybiBzaXplLndpZHRoIDw9IHNpemUuaGVpZ2h0OworfQorCitjb25zdCBXYWl0T25UeXBlID0geworICBFVkVOVDogImV2ZW50IiwKKyAgVElNRU9VVDogInRpbWVvdXQiCit9OworZXhwb3J0cy5XYWl0T25UeXBlID0gV2FpdE9uVHlwZTsKKworZnVuY3Rpb24gd2FpdE9uRXZlbnRPclRpbWVvdXQoeworICB0YXJnZXQsCisgIG5hbWUsCisgIGRlbGF5ID0gMAorfSkgeworICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeworICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiB8fCAhKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciKSB8fCAhKE51bWJlci5pc0ludGVnZXIoZGVsYXkpICYmIGRlbGF5ID49IDApKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIndhaXRPbkV2ZW50T3JUaW1lb3V0IC0gaW52YWxpZCBwYXJhbWV0ZXJzLiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGhhbmRsZXIodHlwZSkgeworICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50QnVzKSB7CisgICAgICAgIHRhcmdldC5fb2ZmKG5hbWUsIGV2ZW50SGFuZGxlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBldmVudEhhbmRsZXIpOworICAgICAgfQorCisgICAgICBpZiAodGltZW91dCkgeworICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7CisgICAgICB9CisKKyAgICAgIHJlc29sdmUodHlwZSk7CisgICAgfQorCisgICAgY29uc3QgZXZlbnRIYW5kbGVyID0gaGFuZGxlci5iaW5kKG51bGwsIFdhaXRPblR5cGUuRVZFTlQpOworCisgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50QnVzKSB7CisgICAgICB0YXJnZXQuX29uKG5hbWUsIGV2ZW50SGFuZGxlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50SGFuZGxlcik7CisgICAgfQorCisgICAgY29uc3QgdGltZW91dEhhbmRsZXIgPSBoYW5kbGVyLmJpbmQobnVsbCwgV2FpdE9uVHlwZS5USU1FT1VUKTsKKyAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCh0aW1lb3V0SGFuZGxlciwgZGVsYXkpOworICB9KTsKK30KKworY29uc3QgYW5pbWF0aW9uU3RhcnRlZCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSk7Cit9KTsKK2V4cG9ydHMuYW5pbWF0aW9uU3RhcnRlZCA9IGFuaW1hdGlvblN0YXJ0ZWQ7CisKK2Z1bmN0aW9uIGRpc3BhdGNoRE9NRXZlbnQoZXZlbnROYW1lLCBhcmdzID0gbnVsbCkgeworICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogZGlzcGF0Y2hET01FdmVudCIpOworfQorCitjbGFzcyBFdmVudEJ1cyB7CisgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKKyAgICB0aGlzLl9saXN0ZW5lcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworICB9CisKKyAgb24oZXZlbnROYW1lLCBsaXN0ZW5lcikgeworICAgIHRoaXMuX29uKGV2ZW50TmFtZSwgbGlzdGVuZXIsIHsKKyAgICAgIGV4dGVybmFsOiB0cnVlCisgICAgfSk7CisgIH0KKworICBvZmYoZXZlbnROYW1lLCBsaXN0ZW5lcikgeworICAgIHRoaXMuX29mZihldmVudE5hbWUsIGxpc3RlbmVyLCB7CisgICAgICBleHRlcm5hbDogdHJ1ZQorICAgIH0pOworICB9CisKKyAgZGlzcGF0Y2goZXZlbnROYW1lKSB7CisgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTsKKworICAgIGlmICghZXZlbnRMaXN0ZW5lcnMgfHwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgbGV0IGV4dGVybmFsTGlzdGVuZXJzOworICAgIGV2ZW50TGlzdGVuZXJzLnNsaWNlKDApLmZvckVhY2goZnVuY3Rpb24gKHsKKyAgICAgIGxpc3RlbmVyLAorICAgICAgZXh0ZXJuYWwKKyAgICB9KSB7CisgICAgICBpZiAoZXh0ZXJuYWwpIHsKKyAgICAgICAgaWYgKCFleHRlcm5hbExpc3RlbmVycykgeworICAgICAgICAgIGV4dGVybmFsTGlzdGVuZXJzID0gW107CisgICAgICAgIH0KKworICAgICAgICBleHRlcm5hbExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBsaXN0ZW5lci5hcHBseShudWxsLCBhcmdzKTsKKyAgICB9KTsKKworICAgIGlmIChleHRlcm5hbExpc3RlbmVycykgeworICAgICAgZXh0ZXJuYWxMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsKKyAgICAgICAgbGlzdGVuZXIuYXBwbHkobnVsbCwgYXJncyk7CisgICAgICB9KTsKKyAgICAgIGV4dGVybmFsTGlzdGVuZXJzID0gbnVsbDsKKyAgICB9CisgIH0KKworICBfb24oZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucyA9IG51bGwpIHsKKyAgICBsZXQgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTsKKworICAgIGlmICghZXZlbnRMaXN0ZW5lcnMpIHsKKyAgICAgIHRoaXMuX2xpc3RlbmVyc1tldmVudE5hbWVdID0gZXZlbnRMaXN0ZW5lcnMgPSBbXTsKKyAgICB9CisKKyAgICBldmVudExpc3RlbmVycy5wdXNoKHsKKyAgICAgIGxpc3RlbmVyLAorICAgICAgZXh0ZXJuYWw6IChvcHRpb25zICYmIG9wdGlvbnMuZXh0ZXJuYWwpID09PSB0cnVlCisgICAgfSk7CisgIH0KKworICBfb2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIsIG9wdGlvbnMgPSBudWxsKSB7CisgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTsKKworICAgIGlmICghZXZlbnRMaXN0ZW5lcnMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBldmVudExpc3RlbmVycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnNbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7CisgICAgICAgIGV2ZW50TGlzdGVuZXJzLnNwbGljZShpLCAxKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCit9CisKK2V4cG9ydHMuRXZlbnRCdXMgPSBFdmVudEJ1czsKKworZnVuY3Rpb24gY2xhbXAodiwgbWluLCBtYXgpIHsKKyAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHYsIG1pbiksIG1heCk7Cit9CisKK2NsYXNzIFByb2dyZXNzQmFyIHsKKyAgY29uc3RydWN0b3IoaWQsIHsKKyAgICBoZWlnaHQsCisgICAgd2lkdGgsCisgICAgdW5pdHMKKyAgfSA9IHt9KSB7CisgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKKyAgICB0aGlzLmRpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaWQgKyAiIC5wcm9ncmVzcyIpOworICAgIHRoaXMuYmFyID0gdGhpcy5kaXYucGFyZW50Tm9kZTsKKyAgICB0aGlzLmhlaWdodCA9IGhlaWdodCB8fCAxMDA7CisgICAgdGhpcy53aWR0aCA9IHdpZHRoIHx8IDEwMDsKKyAgICB0aGlzLnVuaXRzID0gdW5pdHMgfHwgIiUiOworICAgIHRoaXMuZGl2LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgdGhpcy51bml0czsKKyAgICB0aGlzLnBlcmNlbnQgPSAwOworICB9CisKKyAgX3VwZGF0ZUJhcigpIHsKKyAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkgeworICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZCgiaW5kZXRlcm1pbmF0ZSIpOworICAgICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgdGhpcy51bml0czsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmRpdi5jbGFzc0xpc3QucmVtb3ZlKCJpbmRldGVybWluYXRlIik7CisgICAgY29uc3QgcHJvZ3Jlc3NTaXplID0gdGhpcy53aWR0aCAqIHRoaXMuX3BlcmNlbnQgLyAxMDA7CisgICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSBwcm9ncmVzc1NpemUgKyB0aGlzLnVuaXRzOworICB9CisKKyAgZ2V0IHBlcmNlbnQoKSB7CisgICAgcmV0dXJuIHRoaXMuX3BlcmNlbnQ7CisgIH0KKworICBzZXQgcGVyY2VudCh2YWwpIHsKKyAgICB0aGlzLl9pbmRldGVybWluYXRlID0gaXNOYU4odmFsKTsKKyAgICB0aGlzLl9wZXJjZW50ID0gY2xhbXAodmFsLCAwLCAxMDApOworCisgICAgdGhpcy5fdXBkYXRlQmFyKCk7CisgIH0KKworICBzZXRXaWR0aCh2aWV3ZXIpIHsKKyAgICBpZiAoIXZpZXdlcikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNvbnRhaW5lciA9IHZpZXdlci5wYXJlbnROb2RlOworICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gY29udGFpbmVyLm9mZnNldFdpZHRoIC0gdmlld2VyLm9mZnNldFdpZHRoOworCisgICAgaWYgKHNjcm9sbGJhcldpZHRoID4gMCkgeworICAgICAgdGhpcy5iYXIuc3R5bGUud2lkdGggPSBgY2FsYygxMDAlIC0gJHtzY3JvbGxiYXJXaWR0aH1weClgOworICAgIH0KKyAgfQorCisgIGhpZGUoKSB7CisgICAgaWYgKCF0aGlzLnZpc2libGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLnZpc2libGUgPSBmYWxzZTsKKyAgICB0aGlzLmJhci5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKTsKKyAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImxvYWRpbmdJblByb2dyZXNzIik7CisgIH0KKworICBzaG93KCkgeworICAgIGlmICh0aGlzLnZpc2libGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLnZpc2libGUgPSB0cnVlOworICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibG9hZGluZ0luUHJvZ3Jlc3MiKTsKKyAgICB0aGlzLmJhci5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUHJvZ3Jlc3NCYXIgPSBQcm9ncmVzc0JhcjsKKworZnVuY3Rpb24gbW92ZVRvRW5kT2ZBcnJheShhcnIsIGNvbmRpdGlvbikgeworICBjb25zdCBtb3ZlZCA9IFtdLAorICAgICAgICBsZW4gPSBhcnIubGVuZ3RoOworICBsZXQgd3JpdGUgPSAwOworCisgIGZvciAobGV0IHJlYWQgPSAwOyByZWFkIDwgbGVuOyArK3JlYWQpIHsKKyAgICBpZiAoY29uZGl0aW9uKGFycltyZWFkXSkpIHsKKyAgICAgIG1vdmVkLnB1c2goYXJyW3JlYWRdKTsKKyAgICB9IGVsc2UgeworICAgICAgYXJyW3dyaXRlXSA9IGFycltyZWFkXTsKKyAgICAgICsrd3JpdGU7CisgICAgfQorICB9CisKKyAgZm9yIChsZXQgcmVhZCA9IDA7IHdyaXRlIDwgbGVuOyArK3JlYWQsICsrd3JpdGUpIHsKKyAgICBhcnJbd3JpdGVdID0gbW92ZWRbcmVhZF07CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvd2ViL3ZpZXdfaGlzdG9yeS5qcyBiL2xpYi93ZWIvdmlld19oaXN0b3J5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDQwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2ViL3ZpZXdfaGlzdG9yeS5qcwpAQCAtMCwwICsxLDExMSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuVmlld0hpc3RvcnkgPSB2b2lkIDA7Citjb25zdCBERUZBVUxUX1ZJRVdfSElTVE9SWV9DQUNIRV9TSVpFID0gMjA7CisKK2NsYXNzIFZpZXdIaXN0b3J5IHsKKyAgY29uc3RydWN0b3IoZmluZ2VycHJpbnQsIGNhY2hlU2l6ZSA9IERFRkFVTFRfVklFV19ISVNUT1JZX0NBQ0hFX1NJWkUpIHsKKyAgICB0aGlzLmZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7CisgICAgdGhpcy5jYWNoZVNpemUgPSBjYWNoZVNpemU7CisgICAgdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlID0gdGhpcy5fcmVhZEZyb21TdG9yYWdlKCkudGhlbihkYXRhYmFzZVN0ciA9PiB7CisgICAgICBjb25zdCBkYXRhYmFzZSA9IEpTT04ucGFyc2UoZGF0YWJhc2VTdHIgfHwgInt9Iik7CisgICAgICBsZXQgaW5kZXggPSAtMTsKKworICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGFiYXNlLmZpbGVzKSkgeworICAgICAgICBkYXRhYmFzZS5maWxlcyA9IFtdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGRhdGFiYXNlLmZpbGVzLmxlbmd0aCA+PSB0aGlzLmNhY2hlU2l6ZSkgeworICAgICAgICAgIGRhdGFiYXNlLmZpbGVzLnNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkYXRhYmFzZS5maWxlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgY29uc3QgYnJhbmNoID0gZGF0YWJhc2UuZmlsZXNbaV07CisKKyAgICAgICAgICBpZiAoYnJhbmNoLmZpbmdlcnByaW50ID09PSB0aGlzLmZpbmdlcnByaW50KSB7CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluZGV4ID09PSAtMSkgeworICAgICAgICBpbmRleCA9IGRhdGFiYXNlLmZpbGVzLnB1c2goeworICAgICAgICAgIGZpbmdlcnByaW50OiB0aGlzLmZpbmdlcnByaW50CisgICAgICAgIH0pIC0gMTsKKyAgICAgIH0KKworICAgICAgdGhpcy5maWxlID0gZGF0YWJhc2UuZmlsZXNbaW5kZXhdOworICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOworICAgIH0pOworICB9CisKKyAgYXN5bmMgX3dyaXRlVG9TdG9yYWdlKCkgeworICAgIGNvbnN0IGRhdGFiYXNlU3RyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhYmFzZSk7CisgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInBkZmpzLmhpc3RvcnkiLCBkYXRhYmFzZVN0cik7CisgIH0KKworICBhc3luYyBfcmVhZEZyb21TdG9yYWdlKCkgeworICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicGRmanMuaGlzdG9yeSIpOworICB9CisKKyAgYXN5bmMgc2V0KG5hbWUsIHZhbCkgeworICAgIGF3YWl0IHRoaXMuX2luaXRpYWxpemVkUHJvbWlzZTsKKyAgICB0aGlzLmZpbGVbbmFtZV0gPSB2YWw7CisgICAgcmV0dXJuIHRoaXMuX3dyaXRlVG9TdG9yYWdlKCk7CisgIH0KKworICBhc3luYyBzZXRNdWx0aXBsZShwcm9wZXJ0aWVzKSB7CisgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlOworCisgICAgZm9yIChjb25zdCBuYW1lIGluIHByb3BlcnRpZXMpIHsKKyAgICAgIHRoaXMuZmlsZVtuYW1lXSA9IHByb3BlcnRpZXNbbmFtZV07CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX3dyaXRlVG9TdG9yYWdlKCk7CisgIH0KKworICBhc3luYyBnZXQobmFtZSwgZGVmYXVsdFZhbHVlKSB7CisgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlOworICAgIGNvbnN0IHZhbCA9IHRoaXMuZmlsZVtuYW1lXTsKKyAgICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPyB2YWwgOiBkZWZhdWx0VmFsdWU7CisgIH0KKworICBhc3luYyBnZXRNdWx0aXBsZShwcm9wZXJ0aWVzKSB7CisgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlOworICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisKKyAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcHJvcGVydGllcykgeworICAgICAgY29uc3QgdmFsID0gdGhpcy5maWxlW25hbWVdOworICAgICAgdmFsdWVzW25hbWVdID0gdmFsICE9PSB1bmRlZmluZWQgPyB2YWwgOiBwcm9wZXJ0aWVzW25hbWVdOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZXM7CisgIH0KKworfQorCitleHBvcnRzLlZpZXdIaXN0b3J5ID0gVmlld0hpc3Rvcnk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3dlYi92aWV3ZXJfY29tcGF0aWJpbGl0eS5qcyBiL2xpYi93ZWIvdmlld2VyX2NvbXBhdGliaWxpdHkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1Zjg2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93ZWIvdmlld2VyX2NvbXBhdGliaWxpdHkuanMKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKKyAqIEphdmFzY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2UKKyAqLworInVzZSBzdHJpY3QiOworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMudmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcyA9IHZvaWQgMDsKK2NvbnN0IGNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworeworICBjb25zdCB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAidW5kZWZpbmVkIiAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICIiOworICBjb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICJ1bmRlZmluZWQiICYmIG5hdmlnYXRvci5wbGF0Zm9ybSB8fCAiIjsKKyAgY29uc3QgbWF4VG91Y2hQb2ludHMgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAidW5kZWZpbmVkIiAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgMTsKKyAgY29uc3QgaXNBbmRyb2lkID0gL0FuZHJvaWQvLnRlc3QodXNlckFnZW50KTsKKyAgY29uc3QgaXNJRSA9IC9UcmlkZW50Ly50ZXN0KHVzZXJBZ2VudCk7CisgIGNvbnN0IGlzSU9TID0gL1xiKGlQYWR8aVBob25lfGlQb2QpKD89OykvLnRlc3QodXNlckFnZW50KSB8fCBwbGF0Zm9ybSA9PT0gIk1hY0ludGVsIiAmJiBtYXhUb3VjaFBvaW50cyA+IDE7CisgIGNvbnN0IGlzSU9TQ2hyb21lID0gL0NyaU9TLy50ZXN0KHVzZXJBZ2VudCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrT25CbG9iU3VwcG9ydCgpIHsKKyAgICBpZiAoaXNJRSB8fCBpc0lPU0Nocm9tZSkgeworICAgICAgY29tcGF0aWJpbGl0eVBhcmFtcy5kaXNhYmxlQ3JlYXRlT2JqZWN0VVJMID0gdHJ1ZTsKKyAgICB9CisgIH0pKCk7CisKKyAgKGZ1bmN0aW9uIGNoZWNrQ2FudmFzU2l6ZUxpbWl0YXRpb24oKSB7CisgICAgaWYgKGlzSU9TIHx8IGlzQW5kcm9pZCkgeworICAgICAgY29tcGF0aWJpbGl0eVBhcmFtcy5tYXhDYW52YXNQaXhlbHMgPSA1MjQyODgwOworICAgIH0KKyAgfSkoKTsKK30KK2NvbnN0IHZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMgPSBPYmplY3QuZnJlZXplKGNvbXBhdGliaWxpdHlQYXJhbXMpOworZXhwb3J0cy52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zID0gdmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtczsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlLmpzb24gYi9wYWNrYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4YTAxYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UuanNvbgpAQCAtMCwwICsxLDI4IEBACit7CisgICJuYW1lIjogInBkZmpzLWRpc3QiLAorICAidmVyc2lvbiI6ICIyLjYuMzQ3IiwKKyAgIm1haW4iOiAiYnVpbGQvcGRmLmpzIiwKKyAgInR5cGVzIjogInR5cGVzL3BkZi5kLnRzIiwKKyAgImRlc2NyaXB0aW9uIjogIkdlbmVyaWMgYnVpbGQgb2YgTW96aWxsYSdzIFBERi5qcyBsaWJyYXJ5LiIsCisgICJrZXl3b3JkcyI6IFsKKyAgICAiTW96aWxsYSIsCisgICAgInBkZiIsCisgICAgInBkZi5qcyIKKyAgXSwKKyAgImhvbWVwYWdlIjogImh0dHA6Ly9tb3ppbGxhLmdpdGh1Yi5pby9wZGYuanMvIiwKKyAgImJ1Z3MiOiAiaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcGRmLmpzL2lzc3VlcyIsCisgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAiYnJvd3NlciI6IHsKKyAgICAiY2FudmFzIjogZmFsc2UsCisgICAgImZzIjogZmFsc2UsCisgICAgImh0dHAiOiBmYWxzZSwKKyAgICAiaHR0cHMiOiBmYWxzZSwKKyAgICAidXJsIjogZmFsc2UsCisgICAgInpsaWIiOiBmYWxzZQorICB9LAorICAiZm9ybWF0IjogImFtZCIsCisgICJyZXBvc2l0b3J5IjogeworICAgICJ0eXBlIjogImdpdCIsCisgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9wZGZqcy1kaXN0IgorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHlwZXMvZGlzcGxheS9hbm5vdGF0aW9uX2xheWVyLmQudHMgYi90eXBlcy9kaXNwbGF5L2Fubm90YXRpb25fbGF5ZXIuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWNlZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS9hbm5vdGF0aW9uX2xheWVyLmQudHMKQEAgLTAsMCArMSw2MSBAQAorZXhwb3J0IHR5cGUgQW5ub3RhdGlvbkVsZW1lbnRQYXJhbWV0ZXJzID0geworICAgIGRhdGE6IE9iamVjdDsKKyAgICBsYXllcjogSFRNTERpdkVsZW1lbnQ7CisgICAgcGFnZTogYW55OworICAgIHZpZXdwb3J0OiBhbnk7CisgICAgbGlua1NlcnZpY2U6IGFueTsKKyAgICBkb3dubG9hZE1hbmFnZXI6IGFueTsKKyAgICBhbm5vdGF0aW9uU3RvcmFnZT86IEFubm90YXRpb25TdG9yYWdlOworICAgIC8qKgorICAgICAqIC0gUGF0aCBmb3IgaW1hZ2UgcmVzb3VyY2VzLCBtYWlubHkKKyAgICAgKiBmb3IgYW5ub3RhdGlvbiBpY29ucy4gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC4KKyAgICAgKi8KKyAgICBpbWFnZVJlc291cmNlc1BhdGg/OiBzdHJpbmc7CisgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogYm9vbGVhbjsKKyAgICBzdmdGYWN0b3J5OiBPYmplY3Q7Cit9OworZXhwb3J0IHR5cGUgQW5ub3RhdGlvbkxheWVyUGFyYW1ldGVycyA9IHsKKyAgICB2aWV3cG9ydDogYW55OworICAgIGRpdjogSFRNTERpdkVsZW1lbnQ7CisgICAgYW5ub3RhdGlvbnM6IGFueVtdOworICAgIHBhZ2U6IGFueTsKKyAgICBsaW5rU2VydmljZTogYW55OworICAgIGRvd25sb2FkTWFuYWdlcjogYW55OworICAgIC8qKgorICAgICAqIC0gUGF0aCBmb3IgaW1hZ2UgcmVzb3VyY2VzLCBtYWlubHkKKyAgICAgKiBmb3IgYW5ub3RhdGlvbiBpY29ucy4gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC4KKyAgICAgKi8KKyAgICBpbWFnZVJlc291cmNlc1BhdGg/OiBzdHJpbmc7CisgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogYm9vbGVhbjsKK307CisvKioKKyAqIEB0eXBlZGVmIHtPYmplY3R9IEFubm90YXRpb25MYXllclBhcmFtZXRlcnMKKyAqIEBwcm9wZXJ0eSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydAorICogQHByb3BlcnR5IHtIVE1MRGl2RWxlbWVudH0gZGl2CisgKiBAcHJvcGVydHkge0FycmF5fSBhbm5vdGF0aW9ucworICogQHByb3BlcnR5IHtQREZQYWdlfSBwYWdlCisgKiBAcHJvcGVydHkge0lQREZMaW5rU2VydmljZX0gbGlua1NlcnZpY2UKKyAqIEBwcm9wZXJ0eSB7RG93bmxvYWRNYW5hZ2VyfSBkb3dubG9hZE1hbmFnZXIKKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW1hZ2VSZXNvdXJjZXNQYXRoXSAtIFBhdGggZm9yIGltYWdlIHJlc291cmNlcywgbWFpbmx5CisgKiAgIGZvciBhbm5vdGF0aW9uIGljb25zLiBJbmNsdWRlIHRyYWlsaW5nIHNsYXNoLgorICogQHByb3BlcnR5IHtib29sZWFufSByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zCisgKi8KK2V4cG9ydCBjbGFzcyBBbm5vdGF0aW9uTGF5ZXIgeworICAgIC8qKgorICAgICAqIFJlbmRlciBhIG5ldyBhbm5vdGF0aW9uIGxheWVyIHdpdGggYWxsIGFubm90YXRpb24gZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcHVibGljCisgICAgICogQHBhcmFtIHtBbm5vdGF0aW9uTGF5ZXJQYXJhbWV0ZXJzfSBwYXJhbWV0ZXJzCisgICAgICogQG1lbWJlcm9mIEFubm90YXRpb25MYXllcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgcmVuZGVyKHBhcmFtZXRlcnM6IEFubm90YXRpb25MYXllclBhcmFtZXRlcnMpOiB2b2lkOworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgYW5ub3RhdGlvbiBlbGVtZW50cyBvbiBleGlzdGluZyBhbm5vdGF0aW9uIGxheWVyLgorICAgICAqCisgICAgICogQHB1YmxpYworICAgICAqIEBwYXJhbSB7QW5ub3RhdGlvbkxheWVyUGFyYW1ldGVyc30gcGFyYW1ldGVycworICAgICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uTGF5ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZShwYXJhbWV0ZXJzOiBBbm5vdGF0aW9uTGF5ZXJQYXJhbWV0ZXJzKTogdm9pZDsKK30KK2ltcG9ydCB7IEFubm90YXRpb25TdG9yYWdlIH0gZnJvbSAiLi9hbm5vdGF0aW9uX3N0b3JhZ2UuanMiOwpkaWZmIC0tZ2l0IGEvdHlwZXMvZGlzcGxheS9hbm5vdGF0aW9uX3N0b3JhZ2UuZC50cyBiL3R5cGVzL2Rpc3BsYXkvYW5ub3RhdGlvbl9zdG9yYWdlLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4Y2RmZgotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVzL2Rpc3BsYXkvYW5ub3RhdGlvbl9zdG9yYWdlLmQudHMKQEAgLTAsMCArMSwzNiBAQAorLyoqCisgKiBLZXkvdmFsdWUgc3RvcmFnZSBmb3IgYW5ub3RhdGlvbiBkYXRhIGluIGZvcm1zLgorICovCitleHBvcnQgY2xhc3MgQW5ub3RhdGlvblN0b3JhZ2UgeworICAgIF9zdG9yYWdlOiBNYXA8YW55LCBhbnk+OworICAgIF9tb2RpZmllZDogYm9vbGVhbjsKKyAgICBvblNldE1vZGlmaWVkOiBhbnk7CisgICAgb25SZXNldE1vZGlmaWVkOiBhbnk7CisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgaWYgaXQgZXhpc3RzCisgICAgICogb3Igc3RvcmUgYW5kIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAqCisgICAgICogQHB1YmxpYworICAgICAqIEBtZW1iZXJvZiBBbm5vdGF0aW9uU3RvcmFnZQorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdFZhbHVlCisgICAgICogQHJldHVybnMge09iamVjdH0KKyAgICAgKi8KKyAgICBwdWJsaWMgZ2V0T3JDcmVhdGVWYWx1ZShrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBPYmplY3QpOiBPYmplY3Q7CisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkKKyAgICAgKgorICAgICAqIEBwdWJsaWMKKyAgICAgKiBAbWVtYmVyb2YgQW5ub3RhdGlvblN0b3JhZ2UKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5CisgICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogT2JqZWN0KTogdm9pZDsKKyAgICBnZXRBbGwoKTogYW55OworICAgIGdldCBzaXplKCk6IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHByaXZhdGUgX3NldE1vZGlmaWVkOworICAgIHJlc2V0TW9kaWZpZWQoKTogdm9pZDsKK30KZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvYXBpLmQudHMgYi90eXBlcy9kaXNwbGF5L2FwaS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjIyZTUKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlcy9kaXNwbGF5L2FwaS5kLnRzCkBAIC0wLDAgKzEsMTEwNyBAQAorZXhwb3J0IHR5cGUgVHlwZWRBcnJheSA9IEludDhBcnJheSB8IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSB8IEludDE2QXJyYXkgfCBVaW50MTZBcnJheSB8IEludDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IEZsb2F0MzJBcnJheSB8IEZsb2F0NjRBcnJheTsKKy8qKgorICogRG9jdW1lbnQgaW5pdGlhbGl6YXRpb24gLyBsb2FkaW5nIHBhcmFtZXRlcnMgb2JqZWN0LgorICovCitleHBvcnQgdHlwZSBEb2N1bWVudEluaXRQYXJhbWV0ZXJzID0geworICAgIC8qKgorICAgICAqIC0gVGhlIFVSTCBvZiB0aGUgUERGLgorICAgICAqLworICAgIHVybD86IHN0cmluZzsKKyAgICAvKioKKyAgICAgKiAtIEJpbmFyeSBQREYgZGF0YS4gVXNlCisgICAgICogdHlwZWQgYXJyYXlzIChVaW50OEFycmF5KSB0byBpbXByb3ZlIHRoZSBtZW1vcnkgdXNhZ2UuIElmIFBERiBkYXRhIGlzCisgICAgICogQkFTRTY0LWVuY29kZWQsIHVzZSBgYXRvYigpYCB0byBjb252ZXJ0IGl0IHRvIGEgYmluYXJ5IHN0cmluZyBmaXJzdC4KKyAgICAgKi8KKyAgICBkYXRhPzogVHlwZWRBcnJheSB8IEFycmF5PG51bWJlcj4gfCBzdHJpbmc7CisgICAgLyoqCisgICAgICogLSBCYXNpYyBhdXRoZW50aWNhdGlvbiBoZWFkZXJzLgorICAgICAqLworICAgIGh0dHBIZWFkZXJzPzogT2JqZWN0OworICAgIC8qKgorICAgICAqIC0gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90CisgICAgICogY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyBzaG91bGQgYmUgbWFkZSB1c2luZyBjcmVkZW50aWFscyBzdWNoCisgICAgICogYXMgY29va2llcyBvciBhdXRob3JpemF0aW9uIGhlYWRlcnMuIFRoZSBkZWZhdWx0IGlzIGBmYWxzZWAuCisgICAgICovCisgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiAtIEZvciBkZWNyeXB0aW5nIHBhc3N3b3JkLXByb3RlY3RlZCBQREZzLgorICAgICAqLworICAgIHBhc3N3b3JkPzogc3RyaW5nOworICAgIC8qKgorICAgICAqIC0gQSB0eXBlZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBwb3J0aW9uCisgICAgICogb3IgYWxsIG9mIHRoZSBwZGYgZGF0YS4gVXNlZCBieSB0aGUgZXh0ZW5zaW9uIHNpbmNlIHNvbWUgZGF0YSBpcyBhbHJlYWR5CisgICAgICogbG9hZGVkIGJlZm9yZSB0aGUgc3dpdGNoIHRvIHJhbmdlIHJlcXVlc3RzLgorICAgICAqLworICAgIGluaXRpYWxEYXRhPzogVHlwZWRBcnJheTsKKyAgICAvKioKKyAgICAgKiAtIFRoZSBQREYgZmlsZSBsZW5ndGguIEl0J3MgdXNlZCBmb3IgcHJvZ3Jlc3MKKyAgICAgKiByZXBvcnRzIGFuZCByYW5nZSByZXF1ZXN0cyBvcGVyYXRpb25zLgorICAgICAqLworICAgIGxlbmd0aD86IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIEFsbG93cyBmb3IgdXNpbmcgYSBjdXN0b20gcmFuZ2UKKyAgICAgKiB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcmFuZ2U/OiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQ7CisgICAgLyoqCisgICAgICogLSBTcGVjaWZ5IG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGZldGNoZWQKKyAgICAgKiBwZXIgcmFuZ2UgcmVxdWVzdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMge0BsaW5rIERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRX0uCisgICAgICovCisgICAgcmFuZ2VDaHVua1NpemU/OiBudW1iZXI7CisgICAgLyoqCisgICAgICogLSBUaGUgd29ya2VyIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBsb2FkaW5nIGFuZAorICAgICAqIHBhcnNpbmcgdGhlIFBERiBkYXRhLgorICAgICAqLworICAgIHdvcmtlcj86IGFueTsKKyAgICAvKioKKyAgICAgKiAtIENvbnRyb2xzIHRoZSBsb2dnaW5nIGxldmVsOyB0aGUgY29uc3RhbnRzCisgICAgICogZnJvbSB7QGxpbmsgVmVyYm9zaXR5TGV2ZWx9IHNob3VsZCBiZSB1c2VkLgorICAgICAqLworICAgIHZlcmJvc2l0eT86IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIFRoZSBiYXNlIFVSTCBvZiB0aGUgZG9jdW1lbnQsIHVzZWQgd2hlbgorICAgICAqIGF0dGVtcHRpbmcgdG8gcmVjb3ZlciB2YWxpZCBhYnNvbHV0ZSBVUkxzIGZvciBhbm5vdGF0aW9ucywgYW5kIG91dGxpbmUKKyAgICAgKiBpdGVtcywgdGhhdCAoaW5jb3JyZWN0bHkpIG9ubHkgc3BlY2lmeSByZWxhdGl2ZSBVUkxzLgorICAgICAqLworICAgIGRvY0Jhc2VVcmw/OiBzdHJpbmc7CisgICAgLyoqCisgICAgICogLSBUaGUgVVJMIHdoZXJlIHRoZSBwcmVkZWZpbmVkIEFkb2JlIENNYXBzIGFyZQorICAgICAqIGxvY2F0ZWQuIEluY2x1ZGUgdGhlIHRyYWlsaW5nIHNsYXNoLgorICAgICAqLworICAgIGNNYXBVcmw/OiBzdHJpbmc7CisgICAgLyoqCisgICAgICogLSBTcGVjaWZpZXMgaWYgdGhlIEFkb2JlIENNYXBzIGFyZSBiaW5hcnkKKyAgICAgKiBwYWNrZWQgb3Igbm90LgorICAgICAqLworICAgIGNNYXBQYWNrZWQ/OiBib29sZWFuOworICAgIC8qKgorICAgICAqIC0gVGhlIGZhY3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbgorICAgICAqIHJlYWRpbmcgYnVpbHQtaW4gQ01hcCBmaWxlcy4gUHJvdmlkaW5nIGEgY3VzdG9tIGZhY3RvcnkgaXMgdXNlZnVsIGZvcgorICAgICAqIGVudmlyb25tZW50cyB3aXRob3V0IEZldGNoIEFQSSBvciBgWE1MSHR0cFJlcXVlc3RgIHN1cHBvcnQsIHN1Y2ggYXMKKyAgICAgKiBOb2RlLmpzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7RE9NQ01hcFJlYWRlckZhY3Rvcnl9LgorICAgICAqLworICAgIENNYXBSZWFkZXJGYWN0b3J5PzogT2JqZWN0OworICAgIC8qKgorICAgICAqIC0gUmVqZWN0IGNlcnRhaW4gcHJvbWlzZXMsIGUuZy4KKyAgICAgKiBgZ2V0T3BlcmF0b3JMaXN0YCwgYGdldFRleHRDb250ZW50YCwgYW5kIGBSZW5kZXJUYXNrYCwgd2hlbiB0aGUgYXNzb2NpYXRlZAorICAgICAqIFBERiBkYXRhIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkLCBpbnN0ZWFkIG9mIGF0dGVtcHRpbmcgdG8gcmVjb3ZlcgorICAgICAqIHdoYXRldmVyIHBvc3NpYmxlIG9mIHRoZSBkYXRhLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICAgICAqLworICAgIHN0b3BBdEVycm9ycz86IGJvb2xlYW47CisgICAgLyoqCisgICAgICogLSBUaGUgbWF4aW11bSBhbGxvd2VkIGltYWdlIHNpemUgaW4gdG90YWwKKyAgICAgKiBwaXhlbHMsIGkuZS4gd2lkdGggKiBoZWlnaHQuIEltYWdlcyBhYm92ZSB0aGlzIHZhbHVlIHdpbGwgbm90IGJlIHJlbmRlcmVkLgorICAgICAqIFVzZSAtMSBmb3Igbm8gbGltaXQsIHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgbWF4SW1hZ2VTaXplPzogbnVtYmVyOworICAgIC8qKgorICAgICAqIC0gRGV0ZXJtaW5lcyBpZiB3ZSBjYW4gZXZhbHVhdGUgc3RyaW5ncworICAgICAqIGFzIEphdmFTY3JpcHQuIFByaW1hcmlseSB1c2VkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgZm9udCByZW5kZXJpbmcsIGFuZAorICAgICAqIHdoZW4gcGFyc2luZyBQREYgZnVuY3Rpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuCisgICAgICovCisgICAgaXNFdmFsU3VwcG9ydGVkPzogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiAtIEJ5IGRlZmF1bHQgZm9udHMgYXJlIGNvbnZlcnRlZCB0bworICAgICAqIE9wZW5UeXBlIGZvbnRzIGFuZCBsb2FkZWQgdmlhIGBAZm9udC1mYWNlYCBydWxlcy4gSWYgZGlzYWJsZWQsIGZvbnRzIHdpbGwKKyAgICAgKiBiZSByZW5kZXJlZCB1c2luZyBhIGJ1aWx0LWluIGZvbnQgcmVuZGVyZXIgdGhhdCBjb25zdHJ1Y3RzIHRoZSBnbHlwaHMgd2l0aAorICAgICAqIHByaW1pdGl2ZSBwYXRoIGNvbW1hbmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICAgICAqLworICAgIGRpc2FibGVGb250RmFjZT86IGJvb2xlYW47CisgICAgLyoqCisgICAgICogLSBJbmNsdWRlIGFkZGl0aW9uYWwgcHJvcGVydGllcywKKyAgICAgKiB3aGljaCBhcmUgdW51c2VkIGR1cmluZyByZW5kZXJpbmcgb2YgUERGIGRvY3VtZW50cywgd2hlbiBleHBvcnRpbmcgdGhlCisgICAgICogcGFyc2VkIGZvbnQgZGF0YSBmcm9tIHRoZSB3b3JrZXItdGhyZWFkLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZworICAgICAqIHB1cnBvc2VzIChhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLCBidXQgbm90ZSB0aGF0IGl0IHdpbGwgbGVhZCB0bworICAgICAqIGluY3JlYXNlZCBtZW1vcnkgdXNhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgICAgICovCisgICAgZm9udEV4dHJhUHJvcGVydGllcz86IGJvb2xlYW47CisgICAgLyoqCisgICAgICogLSBTcGVjaWZ5IGFuIGV4cGxpY2l0IGRvY3VtZW50CisgICAgICogY29udGV4dCB0byBjcmVhdGUgZWxlbWVudHMgd2l0aCBhbmQgdG8gbG9hZCByZXNvdXJjZXMsIHN1Y2ggYXMgZm9udHMsCisgICAgICogaW50by4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQuCisgICAgICovCisgICAgb3duZXJEb2N1bWVudD86IEhUTUxEb2N1bWVudDsKKyAgICAvKioKKyAgICAgKiAtIERpc2FibGUgcmFuZ2UgcmVxdWVzdCBsb2FkaW5nIG9mIFBERgorICAgICAqIGZpbGVzLiBXaGVuIGVuYWJsZWQsIGFuZCBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIHBhcnRpYWwgY29udGVudCByZXF1ZXN0cywKKyAgICAgKiB0aGVuIHRoZSBQREYgd2lsbCBiZSBmZXRjaGVkIGluIGNodW5rcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC4KKyAgICAgKi8KKyAgICBkaXNhYmxlUmFuZ2U/OiBib29sZWFuOworICAgIC8qKgorICAgICAqIC0gRGlzYWJsZSBzdHJlYW1pbmcgb2YgUERGIGZpbGUgZGF0YS4KKyAgICAgKiBCeSBkZWZhdWx0IFBERi5qcyBhdHRlbXB0cyB0byBsb2FkIFBERiBmaWxlcyBpbiBjaHVua3MuIFRoZSBkZWZhdWx0IHZhbHVlCisgICAgICogaXMgYGZhbHNlYC4KKyAgICAgKi8KKyAgICBkaXNhYmxlU3RyZWFtPzogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiAtIERpc2FibGUgcHJlLWZldGNoaW5nIG9mIFBERiBmaWxlCisgICAgICogZGF0YS4gV2hlbiByYW5nZSByZXF1ZXN0cyBhcmUgZW5hYmxlZCBQREYuanMgd2lsbCBhdXRvbWF0aWNhbGx5IGtlZXAKKyAgICAgKiBmZXRjaGluZyBtb3JlIGRhdGEgZXZlbiBpZiBpdCBpc24ndCBuZWVkZWQgdG8gZGlzcGxheSB0aGUgY3VycmVudCBwYWdlLgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBOT1RFOiBJdCBpcyBhbHNvIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHN0cmVhbWluZywgc2VlIGFib3ZlLCBpbiBvcmRlciBmb3IKKyAgICAgKiBkaXNhYmxpbmcgb2YgcHJlLWZldGNoaW5nIHRvIHdvcmsgY29ycmVjdGx5LgorICAgICAqLworICAgIGRpc2FibGVBdXRvRmV0Y2g/OiBib29sZWFuOworICAgIC8qKgorICAgICAqIC0gRW5hYmxlcyBzcGVjaWFsIGhvb2tzIGZvciBkZWJ1Z2dpbmcgUERGLmpzCisgICAgICogKHNlZSBgd2ViL2RlYnVnZ2VyLmpzYCkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgICAgICovCisgICAgcGRmQnVnPzogYm9vbGVhbjsKK307CitleHBvcnQgdHlwZSBQREZEb2N1bWVudFN0YXRzID0geworICAgIC8qKgorICAgICAqIC0gVXNlZCBzdHJlYW0gdHlwZXMgaW4gdGhlCisgICAgICogZG9jdW1lbnQgKGFuIGl0ZW0gaXMgc2V0IHRvIHRydWUgaWYgc3BlY2lmaWMgc3RyZWFtIElEIHdhcyB1c2VkIGluIHRoZQorICAgICAqIGRvY3VtZW50KS4KKyAgICAgKi8KKyAgICBzdHJlYW1UeXBlczogeworICAgICAgICBbeDogc3RyaW5nXTogYm9vbGVhbjsKKyAgICB9OworICAgIC8qKgorICAgICAqIC0gVXNlZCBmb250IHR5cGVzIGluIHRoZQorICAgICAqIGRvY3VtZW50IChhbiBpdGVtIGlzIHNldCB0byB0cnVlIGlmIHNwZWNpZmljIGZvbnQgSUQgd2FzIHVzZWQgaW4gdGhlCisgICAgICogZG9jdW1lbnQpLgorICAgICAqLworICAgIGZvbnRUeXBlczogeworICAgICAgICBbeDogc3RyaW5nXTogYm9vbGVhbjsKKyAgICB9OworfTsKK2V4cG9ydCB0eXBlIElQREZTdHJlYW1GYWN0b3J5ID0gRnVuY3Rpb247CisvKioKKyAqIFRoZSBsb2FkaW5nIHRhc2sgY29udHJvbHMgdGhlIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gbG9hZCBhIFBERiBkb2N1bWVudAorICogKHN1Y2ggYXMgbmV0d29yayByZXF1ZXN0cykgYW5kIHByb3ZpZGVzIGEgd2F5IHRvIGxpc3RlbiBmb3IgY29tcGxldGlvbiwKKyAqIGFmdGVyIHdoaWNoIGluZGl2aWR1YWwgcGFnZXMgY2FuIGJlIHJlbmRlcmVkLgorICovCitleHBvcnQgdHlwZSBQREZEb2N1bWVudExvYWRpbmdUYXNrID0geworICAgIC8qKgorICAgICAqIC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkb2N1bWVudCBsb2FkaW5nIHRhc2suCisgICAgICovCisgICAgZG9jSWQ6IHN0cmluZzsKKyAgICAvKioKKyAgICAgKiAtIFdoZXRoZXIgdGhlIGxvYWRpbmcgdGFzayBpcyBkZXN0cm95ZWQgb3Igbm90LgorICAgICAqLworICAgIGRlc3Ryb3llZDogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiAtIENhbGxiYWNrIHRvIHJlcXVlc3QgYSBwYXNzd29yZCBpZiBhIHdyb25nCisgICAgICogb3Igbm8gcGFzc3dvcmQgd2FzIHByb3ZpZGVkLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgdHdvIHBhcmFtZXRlcnM6IGEKKyAgICAgKiBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IHBhc3N3b3JkLCBhbmQgYSByZWFzb24gKHNlZQorICAgICAqIHtAbGluayBQYXNzd29yZFJlc3BvbnNlc30pLgorICAgICAqLworICAgIG9uUGFzc3dvcmQ/OiBGdW5jdGlvbjsKKyAgICAvKioKKyAgICAgKiAtIENhbGxiYWNrIHRvIGJlIGFibGUgdG8gbW9uaXRvciB0aGUKKyAgICAgKiBsb2FkaW5nIHByb2dyZXNzIG9mIHRoZSBQREYgZmlsZSAobmVjZXNzYXJ5IHRvIGltcGxlbWVudCBlLmcuIGEgbG9hZGluZworICAgICAqIGJhcikuIFRoZSBjYWxsYmFjayByZWNlaXZlcyBhbiB7T2JqZWN0fSB3aXRoIHRoZSBwcm9wZXJ0aWVzIGBsb2FkZWRgCisgICAgICogKHtudW1iZXJ9KSBhbmQgYHRvdGFsYCAoe251bWJlcn0pIHRoYXQgaW5kaWNhdGUgaG93IG1hbnkgYnl0ZXMgYXJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBvblByb2dyZXNzPzogRnVuY3Rpb247CisgICAgLyoqCisgICAgICogLSBDYWxsYmFjayBmb3Igd2hlbiBhbgorICAgICAqIHVuc3VwcG9ydGVkIGZlYXR1cmUgaXMgdXNlZCBpbiB0aGUgUERGIGRvY3VtZW50LiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYW4KKyAgICAgKiB7QGxpbmsgVU5TVVBQT1JURURfRkVBVFVSRVN9IGFyZ3VtZW50LgorICAgICAqLworICAgIG9uVW5zdXBwb3J0ZWRGZWF0dXJlPzogRnVuY3Rpb247CisgICAgLyoqCisgICAgICogLSBQcm9taXNlIGZvciBkb2N1bWVudCBsb2FkaW5nCisgICAgICogdGFzayBjb21wbGV0aW9uLgorICAgICAqLworICAgIHByb21pc2U6IFByb21pc2U8UERGRG9jdW1lbnRQcm94eT47CisgICAgLyoqCisgICAgICogLSBBYm9ydCBhbGwgbmV0d29yayByZXF1ZXN0cyBhbmQgZGVzdHJveQorICAgICAqIHRoZSB3b3JrZXIuIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkZXN0cnVjdGlvbiBpcworICAgICAqIGNvbXBsZXRlZC4KKyAgICAgKi8KKyAgICBkZXN0cm95OiBGdW5jdGlvbjsKK307CisvKioKKyAqIFBhZ2UgZ2V0Vmlld3BvcnQgcGFyYW1ldGVycy4KKyAqLworZXhwb3J0IHR5cGUgR2V0Vmlld3BvcnRQYXJhbWV0ZXJzID0geworICAgIC8qKgorICAgICAqIC0gVGhlIGRlc2lyZWQgc2NhbGUgb2YgdGhlIHZpZXdwb3J0LgorICAgICAqLworICAgIHNjYWxlOiBudW1iZXI7CisgICAgLyoqCisgICAgICogLSBUaGUgZGVzaXJlZCByb3RhdGlvbiwgaW4gZGVncmVlcywgb2YKKyAgICAgKiB0aGUgdmlld3BvcnQuIElmIG9taXR0ZWQgaXQgZGVmYXVsdHMgdG8gdGhlIHBhZ2Ugcm90YXRpb24uCisgICAgICovCisgICAgcm90YXRpb24/OiBudW1iZXI7CisgICAgLyoqCisgICAgICogLSBUaGUgaG9yaXpvbnRhbCwgaS5lLiB4LWF4aXMsIG9mZnNldC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMGAuCisgICAgICovCisgICAgb2Zmc2V0WD86IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIFRoZSB2ZXJ0aWNhbCwgaS5lLiB5LWF4aXMsIG9mZnNldC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMGAuCisgICAgICovCisgICAgb2Zmc2V0WT86IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIElmIHRydWUsIHRoZSB5LWF4aXMgd2lsbCBub3QgYmUKKyAgICAgKiBmbGlwcGVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICAgICAqLworICAgIGRvbnRGbGlwPzogYm9vbGVhbjsKK307CisvKioKKyAqIFBhZ2UgZ2V0VGV4dENvbnRlbnQgcGFyYW1ldGVycy4KKyAqLworZXhwb3J0IHR5cGUgZ2V0VGV4dENvbnRlbnRQYXJhbWV0ZXJzID0geworICAgIC8qKgorICAgICAqIC0gUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mCisgICAgICogd2hpdGVzcGFjZSB3aXRoIHN0YW5kYXJkIHNwYWNlcyAoMHgyMCkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgICAgICovCisgICAgbm9ybWFsaXplV2hpdGVzcGFjZTogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiAtIERvIG5vdCBhdHRlbXB0IHRvIGNvbWJpbmUKKyAgICAgKiBzYW1lIGxpbmUge0BsaW5rIFRleHRJdGVtfSdzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICAgICAqLworICAgIGRpc2FibGVDb21iaW5lVGV4dEl0ZW1zOiBib29sZWFuOworfTsKKy8qKgorICogUGFnZSB0ZXh0IGNvbnRlbnQuCisgKi8KK2V4cG9ydCB0eXBlIFRleHRDb250ZW50ID0geworICAgIC8qKgorICAgICAqIC0gQXJyYXkgb2Yge0BsaW5rIFRleHRJdGVtfSBvYmplY3RzLgorICAgICAqLworICAgIGl0ZW1zOiBBcnJheTxUZXh0SXRlbT47CisgICAgLyoqCisgICAgICogLSB7QGxpbmsgVGV4dFN0eWxlfSBvYmplY3RzLAorICAgICAqIGluZGV4ZWQgYnkgZm9udCBuYW1lLgorICAgICAqLworICAgIHN0eWxlczogeworICAgICAgICBbeDogc3RyaW5nXTogVGV4dFN0eWxlOworICAgIH07Cit9OworLyoqCisgKiBQYWdlIHRleHQgY29udGVudCBwYXJ0LgorICovCitleHBvcnQgdHlwZSBUZXh0SXRlbSA9IHsKKyAgICAvKioKKyAgICAgKiAtIFRleHQgY29udGVudC4KKyAgICAgKi8KKyAgICBzdHI6IHN0cmluZzsKKyAgICAvKioKKyAgICAgKiAtIFRleHQgZGlyZWN0aW9uOiAndHRiJywgJ2x0cicgb3IgJ3J0bCcuCisgICAgICovCisgICAgZGlyOiBzdHJpbmc7CisgICAgLyoqCisgICAgICogLSBUcmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICovCisgICAgdHJhbnNmb3JtOiBBcnJheTxhbnk+OworICAgIC8qKgorICAgICAqIC0gV2lkdGggaW4gZGV2aWNlIHNwYWNlLgorICAgICAqLworICAgIHdpZHRoOiBudW1iZXI7CisgICAgLyoqCisgICAgICogLSBIZWlnaHQgaW4gZGV2aWNlIHNwYWNlLgorICAgICAqLworICAgIGhlaWdodDogbnVtYmVyOworICAgIC8qKgorICAgICAqIC0gRm9udCBuYW1lIHVzZWQgYnkgUERGLmpzIGZvciBjb252ZXJ0ZWQgZm9udC4KKyAgICAgKi8KKyAgICBmb250TmFtZTogc3RyaW5nOworfTsKKy8qKgorICogVGV4dCBzdHlsZS4KKyAqLworZXhwb3J0IHR5cGUgVGV4dFN0eWxlID0geworICAgIC8qKgorICAgICAqIC0gRm9udCBhc2NlbnQuCisgICAgICovCisgICAgYXNjZW50OiBudW1iZXI7CisgICAgLyoqCisgICAgICogLSBGb250IGRlc2NlbnQuCisgICAgICovCisgICAgZGVzY2VudDogbnVtYmVyOworICAgIC8qKgorICAgICAqIC0gV2hldGhlciBvciBub3QgdGhlIHRleHQgaXMgaW4gdmVydGljYWwgbW9kZS4KKyAgICAgKi8KKyAgICB2ZXJ0aWNhbDogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiAtIFRoZSBwb3NzaWJsZSBmb250IGZhbWlseS4KKyAgICAgKi8KKyAgICBmb250RmFtaWx5OiBzdHJpbmc7Cit9OworLyoqCisgKiBQYWdlIGFubm90YXRpb24gcGFyYW1ldGVycy4KKyAqLworZXhwb3J0IHR5cGUgR2V0QW5ub3RhdGlvbnNQYXJhbWV0ZXJzID0geworICAgIC8qKgorICAgICAqIC0gRGV0ZXJtaW5lcyB0aGUgYW5ub3RhdGlvbnMgdGhhdCB3aWxsIGJlIGZldGNoZWQsCisgICAgICogY2FuIGJlIGVpdGhlciAnZGlzcGxheScgKHZpZXdhYmxlIGFubm90YXRpb25zKSBvciAncHJpbnQnIChwcmludGFibGUKKyAgICAgKiBhbm5vdGF0aW9ucykuIElmIHRoZSBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgYWxsIGFubm90YXRpb25zIGFyZSBmZXRjaGVkLgorICAgICAqLworICAgIGludGVudDogc3RyaW5nOworfTsKKy8qKgorICogUGFnZSByZW5kZXIgcGFyYW1ldGVycy4KKyAqLworZXhwb3J0IHR5cGUgUmVuZGVyUGFyYW1ldGVycyA9IHsKKyAgICAvKioKKyAgICAgKiAtIEEgMkQgY29udGV4dCBvZiBhIERPTSBDYW52YXMgb2JqZWN0LgorICAgICAqLworICAgIGNhbnZhc0NvbnRleHQ6IE9iamVjdDsKKyAgICAvKioKKyAgICAgKiAtIFJlbmRlcmluZyB2aWV3cG9ydCBvYnRhaW5lZCBieSBjYWxsaW5nCisgICAgICogdGhlIGBQREZQYWdlUHJveHkuZ2V0Vmlld3BvcnRgIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aWV3cG9ydDogUGFnZVZpZXdwb3J0OworICAgIC8qKgorICAgICAqIC0gUmVuZGVyaW5nIGludGVudCwgY2FuIGJlICdkaXNwbGF5JyBvciAncHJpbnQnLgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzICdkaXNwbGF5Jy4KKyAgICAgKi8KKyAgICBpbnRlbnQ/OiBzdHJpbmc7CisgICAgLyoqCisgICAgICogLSBFbmFibGVzIFdlYkdMIGFjY2VsZXJhdGVkIHJlbmRlcmluZyBmb3IKKyAgICAgKiBzb21lIG9wZXJhdGlvbnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgICAgICovCisgICAgZW5hYmxlV2ViR0w/OiBib29sZWFuOworICAgIC8qKgorICAgICAqIC0gV2hldGhlciBvciBub3QgaW50ZXJhY3RpdmUKKyAgICAgKiBmb3JtIGVsZW1lbnRzIGFyZSByZW5kZXJlZCBpbiB0aGUgZGlzcGxheSBsYXllci4gSWYgc28sIHdlIGRvIG5vdCByZW5kZXIKKyAgICAgKiB0aGVtIG9uIHRoZSBjYW52YXMgYXMgd2VsbC4KKyAgICAgKi8KKyAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zPzogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiAtIEFkZGl0aW9uYWwgdHJhbnNmb3JtLCBhcHBsaWVkIGp1c3QKKyAgICAgKiBiZWZvcmUgdmlld3BvcnQgdHJhbnNmb3JtLgorICAgICAqLworICAgIHRyYW5zZm9ybT86IEFycmF5PGFueT47CisgICAgLyoqCisgICAgICogLSBBbiBvYmplY3QgdGhhdCBoYXMgYGJlZ2luTGF5b3V0YCwKKyAgICAgKiBgZW5kTGF5b3V0YCBhbmQgYGFwcGVuZEltYWdlYCBmdW5jdGlvbnMuCisgICAgICovCisgICAgaW1hZ2VMYXllcj86IE9iamVjdDsKKyAgICAvKioKKyAgICAgKiAtIFRoZSBmYWN0b3J5IGluc3RhbmNlIHRoYXQgd2lsbCBiZSB1c2VkCisgICAgICogd2hlbiBjcmVhdGluZyBjYW52YXNlcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMge25ldyBET01DYW52YXNGYWN0b3J5KCl9LgorICAgICAqLworICAgIGNhbnZhc0ZhY3Rvcnk/OiBPYmplY3Q7CisgICAgLyoqCisgICAgICogLSBCYWNrZ3JvdW5kIHRvIHVzZSBmb3IgdGhlIGNhbnZhcy4KKyAgICAgKiBBbnkgdmFsaWQgYGNhbnZhcy5maWxsU3R5bGVgIGNhbiBiZSB1c2VkOiBhIGBET01TdHJpbmdgIHBhcnNlZCBhcyBDU1MKKyAgICAgKiA8Y29sb3I+IHZhbHVlLCBhIGBDYW52YXNHcmFkaWVudGAgb2JqZWN0IChhIGxpbmVhciBvciByYWRpYWwgZ3JhZGllbnQpIG9yCisgICAgICogYSBgQ2FudmFzUGF0dGVybmAgb2JqZWN0IChhIHJlcGV0aXRpdmUgaW1hZ2UpLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcworICAgICAqICdyZ2IoMjU1LDI1NSwyNTUpJy4KKyAgICAgKi8KKyAgICBiYWNrZ3JvdW5kPzogT2JqZWN0IHwgc3RyaW5nOworICAgIC8qKgorICAgICAqIC0gU3RvcmFnZSBmb3IgYW5ub3RhdGlvbgorICAgICAqIGRhdGEgaW4gZm9ybXMuCisgICAgICovCisgICAgYW5ub3RhdGlvblN0b3JhZ2U/OiBBbm5vdGF0aW9uU3RvcmFnZTsKKyAgICAvKioKKyAgICAgKiAtCisgICAgICogQSBwcm9taXNlIHRoYXQgc2hvdWxkIHJlc29sdmUgd2l0aCBhbiB7QGxpbmsgT3B0aW9uYWxDb250ZW50Q29uZmlnfQorICAgICAqIGNyZWF0ZWQgZnJvbSBgUERGRG9jdW1lbnRQcm94eS5nZXRPcHRpb25hbENvbnRlbnRDb25maWdgLiBJZiBgbnVsbGAsCisgICAgICogdGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBmZXRjaGVkIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5CisgICAgICogc3RhdGVzIHNldC4KKyAgICAgKi8KKyAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlPzogUHJvbWlzZTxPcHRpb25hbENvbnRlbnRDb25maWc+OworfTsKKy8qKgorICogUERGIHBhZ2Ugb3BlcmF0b3IgbGlzdC4KKyAqLworZXhwb3J0IHR5cGUgUERGT3BlcmF0b3JMaXN0ID0geworICAgIC8qKgorICAgICAqIC0gQXJyYXkgY29udGFpbmluZyB0aGUgb3BlcmF0b3IgZnVuY3Rpb25zLgorICAgICAqLworICAgIGZuQXJyYXk6IEFycmF5PG51bWJlcj47CisgICAgLyoqCisgICAgICogLSBBcnJheSBjb250YWluaW5nIHRoZSBhcmd1bWVudHMgb2YgdGhlCisgICAgICogZnVuY3Rpb25zLgorICAgICAqLworICAgIGFyZ3NBcnJheTogQXJyYXk8YW55PjsKK307CitleHBvcnQgdHlwZSBQREZXb3JrZXJQYXJhbWV0ZXJzID0geworICAgIC8qKgorICAgICAqIC0gVGhlIG5hbWUgb2YgdGhlIHdvcmtlci4KKyAgICAgKi8KKyAgICBuYW1lPzogc3RyaW5nOworICAgIC8qKgorICAgICAqIC0gVGhlIGB3b3JrZXJQb3J0YCBvYmplY3QuCisgICAgICovCisgICAgcG9ydD86IE9iamVjdDsKKyAgICAvKioKKyAgICAgKiAtIENvbnRyb2xzIHRoZSBsb2dnaW5nIGxldmVsOyB0aGUKKyAgICAgKiBjb25zdGFudHMgZnJvbSB7QGxpbmsgVmVyYm9zaXR5TGV2ZWx9IHNob3VsZCBiZSB1c2VkLgorICAgICAqLworICAgIHZlcmJvc2l0eT86IG51bWJlcjsKK307CisvKioKKyAqIEB0eXBlZGVmIHsgSW50OEFycmF5IHwgVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5IHwKKyAqICAgICAgICAgICAgSW50MTZBcnJheSB8IFVpbnQxNkFycmF5IHwKKyAqICAgICAgICAgICAgSW50MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgRmxvYXQzMkFycmF5IHwKKyAqICAgICAgICAgICAgRmxvYXQ2NEFycmF5CisgKiB9IFR5cGVkQXJyYXkKKyAqLworLyoqCisgKiBEb2N1bWVudCBpbml0aWFsaXphdGlvbiAvIGxvYWRpbmcgcGFyYW1ldGVycyBvYmplY3QuCisgKgorICogQHR5cGVkZWYge09iamVjdH0gRG9jdW1lbnRJbml0UGFyYW1ldGVycworICogQHByb3BlcnR5IHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCBvZiB0aGUgUERGLgorICogQHByb3BlcnR5IHtUeXBlZEFycmF5fEFycmF5PG51bWJlcj58c3RyaW5nfSBbZGF0YV0gLSBCaW5hcnkgUERGIGRhdGEuIFVzZQorICogICAgdHlwZWQgYXJyYXlzIChVaW50OEFycmF5KSB0byBpbXByb3ZlIHRoZSBtZW1vcnkgdXNhZ2UuIElmIFBERiBkYXRhIGlzCisgKiAgICBCQVNFNjQtZW5jb2RlZCwgdXNlIGBhdG9iKClgIHRvIGNvbnZlcnQgaXQgdG8gYSBiaW5hcnkgc3RyaW5nIGZpcnN0LgorICogQHByb3BlcnR5IHtPYmplY3R9IFtodHRwSGVhZGVyc10gLSBCYXNpYyBhdXRoZW50aWNhdGlvbiBoZWFkZXJzLgorICogQHByb3BlcnR5IHtib29sZWFufSBbd2l0aENyZWRlbnRpYWxzXSAtIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdAorICogICBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHNob3VsZCBiZSBtYWRlIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2gKKyAqICAgYXMgY29va2llcyBvciBhdXRob3JpemF0aW9uIGhlYWRlcnMuIFRoZSBkZWZhdWx0IGlzIGBmYWxzZWAuCisgKiBAcHJvcGVydHkge3N0cmluZ30gW3Bhc3N3b3JkXSAtIEZvciBkZWNyeXB0aW5nIHBhc3N3b3JkLXByb3RlY3RlZCBQREZzLgorICogQHByb3BlcnR5IHtUeXBlZEFycmF5fSBbaW5pdGlhbERhdGFdIC0gQSB0eXBlZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBwb3J0aW9uCisgKiAgIG9yIGFsbCBvZiB0aGUgcGRmIGRhdGEuIFVzZWQgYnkgdGhlIGV4dGVuc2lvbiBzaW5jZSBzb21lIGRhdGEgaXMgYWxyZWFkeQorICogICBsb2FkZWQgYmVmb3JlIHRoZSBzd2l0Y2ggdG8gcmFuZ2UgcmVxdWVzdHMuCisgKiBAcHJvcGVydHkge251bWJlcn0gW2xlbmd0aF0gLSBUaGUgUERGIGZpbGUgbGVuZ3RoLiBJdCdzIHVzZWQgZm9yIHByb2dyZXNzCisgKiAgIHJlcG9ydHMgYW5kIHJhbmdlIHJlcXVlc3RzIG9wZXJhdGlvbnMuCisgKiBAcHJvcGVydHkge1BERkRhdGFSYW5nZVRyYW5zcG9ydH0gW3JhbmdlXSAtIEFsbG93cyBmb3IgdXNpbmcgYSBjdXN0b20gcmFuZ2UKKyAqICAgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uLgorICogQHByb3BlcnR5IHtudW1iZXJ9IFtyYW5nZUNodW5rU2l6ZV0gLSBTcGVjaWZ5IG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGZldGNoZWQKKyAqICAgcGVyIHJhbmdlIHJlcXVlc3QuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAbGluayBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkV9LgorICogQHByb3BlcnR5IHtQREZXb3JrZXJ9IFt3b3JrZXJdIC0gVGhlIHdvcmtlciB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgbG9hZGluZyBhbmQKKyAqICAgcGFyc2luZyB0aGUgUERGIGRhdGEuCisgKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcmJvc2l0eV0gLSBDb250cm9scyB0aGUgbG9nZ2luZyBsZXZlbDsgdGhlIGNvbnN0YW50cworICogICBmcm9tIHtAbGluayBWZXJib3NpdHlMZXZlbH0gc2hvdWxkIGJlIHVzZWQuCisgKiBAcHJvcGVydHkge3N0cmluZ30gW2RvY0Jhc2VVcmxdIC0gVGhlIGJhc2UgVVJMIG9mIHRoZSBkb2N1bWVudCwgdXNlZCB3aGVuCisgKiAgIGF0dGVtcHRpbmcgdG8gcmVjb3ZlciB2YWxpZCBhYnNvbHV0ZSBVUkxzIGZvciBhbm5vdGF0aW9ucywgYW5kIG91dGxpbmUKKyAqICAgaXRlbXMsIHRoYXQgKGluY29ycmVjdGx5KSBvbmx5IHNwZWNpZnkgcmVsYXRpdmUgVVJMcy4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY01hcFVybF0gLSBUaGUgVVJMIHdoZXJlIHRoZSBwcmVkZWZpbmVkIEFkb2JlIENNYXBzIGFyZQorICogICBsb2NhdGVkLiBJbmNsdWRlIHRoZSB0cmFpbGluZyBzbGFzaC4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NNYXBQYWNrZWRdIC0gU3BlY2lmaWVzIGlmIHRoZSBBZG9iZSBDTWFwcyBhcmUgYmluYXJ5CisgKiAgIHBhY2tlZCBvciBub3QuCisgKiBAcHJvcGVydHkge09iamVjdH0gW0NNYXBSZWFkZXJGYWN0b3J5XSAtIFRoZSBmYWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4KKyAqICAgcmVhZGluZyBidWlsdC1pbiBDTWFwIGZpbGVzLiBQcm92aWRpbmcgYSBjdXN0b20gZmFjdG9yeSBpcyB1c2VmdWwgZm9yCisgKiAgIGVudmlyb25tZW50cyB3aXRob3V0IEZldGNoIEFQSSBvciBgWE1MSHR0cFJlcXVlc3RgIHN1cHBvcnQsIHN1Y2ggYXMKKyAqICAgTm9kZS5qcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMge0RPTUNNYXBSZWFkZXJGYWN0b3J5fS4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N0b3BBdEVycm9yc10gLSBSZWplY3QgY2VydGFpbiBwcm9taXNlcywgZS5nLgorICogICBgZ2V0T3BlcmF0b3JMaXN0YCwgYGdldFRleHRDb250ZW50YCwgYW5kIGBSZW5kZXJUYXNrYCwgd2hlbiB0aGUgYXNzb2NpYXRlZAorICogICBQREYgZGF0YSBjYW5ub3QgYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHRvIHJlY292ZXIKKyAqICAgd2hhdGV2ZXIgcG9zc2libGUgb2YgdGhlIGRhdGEuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgKiBAcHJvcGVydHkge251bWJlcn0gW21heEltYWdlU2l6ZV0gLSBUaGUgbWF4aW11bSBhbGxvd2VkIGltYWdlIHNpemUgaW4gdG90YWwKKyAqICAgcGl4ZWxzLCBpLmUuIHdpZHRoICogaGVpZ2h0LiBJbWFnZXMgYWJvdmUgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSByZW5kZXJlZC4KKyAqICAgVXNlIC0xIGZvciBubyBsaW1pdCwgd2hpY2ggaXMgYWxzbyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lzRXZhbFN1cHBvcnRlZF0gLSBEZXRlcm1pbmVzIGlmIHdlIGNhbiBldmFsdWF0ZSBzdHJpbmdzCisgKiAgIGFzIEphdmFTY3JpcHQuIFByaW1hcmlseSB1c2VkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgZm9udCByZW5kZXJpbmcsIGFuZAorICogICB3aGVuIHBhcnNpbmcgUERGIGZ1bmN0aW9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgLgorICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZUZvbnRGYWNlXSAtIEJ5IGRlZmF1bHQgZm9udHMgYXJlIGNvbnZlcnRlZCB0bworICogICBPcGVuVHlwZSBmb250cyBhbmQgbG9hZGVkIHZpYSBgQGZvbnQtZmFjZWAgcnVsZXMuIElmIGRpc2FibGVkLCBmb250cyB3aWxsCisgKiAgIGJlIHJlbmRlcmVkIHVzaW5nIGEgYnVpbHQtaW4gZm9udCByZW5kZXJlciB0aGF0IGNvbnN0cnVjdHMgdGhlIGdseXBocyB3aXRoCisgKiAgIHByaW1pdGl2ZSBwYXRoIGNvbW1hbmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICogQHByb3BlcnR5IHtib29sZWFufSBbZm9udEV4dHJhUHJvcGVydGllc10gLSBJbmNsdWRlIGFkZGl0aW9uYWwgcHJvcGVydGllcywKKyAqICAgd2hpY2ggYXJlIHVudXNlZCBkdXJpbmcgcmVuZGVyaW5nIG9mIFBERiBkb2N1bWVudHMsIHdoZW4gZXhwb3J0aW5nIHRoZQorICogICBwYXJzZWQgZm9udCBkYXRhIGZyb20gdGhlIHdvcmtlci10aHJlYWQuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisgKiAgIHB1cnBvc2VzIChhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLCBidXQgbm90ZSB0aGF0IGl0IHdpbGwgbGVhZCB0bworICogICBpbmNyZWFzZWQgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICogQHByb3BlcnR5IHtIVE1MRG9jdW1lbnR9IFtvd25lckRvY3VtZW50XSAtIFNwZWNpZnkgYW4gZXhwbGljaXQgZG9jdW1lbnQKKyAqICAgY29udGV4dCB0byBjcmVhdGUgZWxlbWVudHMgd2l0aCBhbmQgdG8gbG9hZCByZXNvdXJjZXMsIHN1Y2ggYXMgZm9udHMsCisgKiAgIGludG8uIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LgorICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZVJhbmdlXSAtIERpc2FibGUgcmFuZ2UgcmVxdWVzdCBsb2FkaW5nIG9mIFBERgorICogICBmaWxlcy4gV2hlbiBlbmFibGVkLCBhbmQgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBwYXJ0aWFsIGNvbnRlbnQgcmVxdWVzdHMsCisgKiAgIHRoZW4gdGhlIFBERiB3aWxsIGJlIGZldGNoZWQgaW4gY2h1bmtzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZVN0cmVhbV0gLSBEaXNhYmxlIHN0cmVhbWluZyBvZiBQREYgZmlsZSBkYXRhLgorICogICBCeSBkZWZhdWx0IFBERi5qcyBhdHRlbXB0cyB0byBsb2FkIFBERiBmaWxlcyBpbiBjaHVua3MuIFRoZSBkZWZhdWx0IHZhbHVlCisgKiAgIGlzIGBmYWxzZWAuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNhYmxlQXV0b0ZldGNoXSAtIERpc2FibGUgcHJlLWZldGNoaW5nIG9mIFBERiBmaWxlCisgKiAgIGRhdGEuIFdoZW4gcmFuZ2UgcmVxdWVzdHMgYXJlIGVuYWJsZWQgUERGLmpzIHdpbGwgYXV0b21hdGljYWxseSBrZWVwCisgKiAgIGZldGNoaW5nIG1vcmUgZGF0YSBldmVuIGlmIGl0IGlzbid0IG5lZWRlZCB0byBkaXNwbGF5IHRoZSBjdXJyZW50IHBhZ2UuCisgKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgKgorICogICBOT1RFOiBJdCBpcyBhbHNvIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHN0cmVhbWluZywgc2VlIGFib3ZlLCBpbiBvcmRlciBmb3IKKyAqICAgZGlzYWJsaW5nIG9mIHByZS1mZXRjaGluZyB0byB3b3JrIGNvcnJlY3RseS4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BkZkJ1Z10gLSBFbmFibGVzIHNwZWNpYWwgaG9va3MgZm9yIGRlYnVnZ2luZyBQREYuanMKKyAqICAgKHNlZSBgd2ViL2RlYnVnZ2VyLmpzYCkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgKi8KKy8qKgorICogQHR5cGVkZWYge09iamVjdH0gUERGRG9jdW1lbnRTdGF0cworICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBib29sZWFuPn0gc3RyZWFtVHlwZXMgLSBVc2VkIHN0cmVhbSB0eXBlcyBpbiB0aGUKKyAqICAgZG9jdW1lbnQgKGFuIGl0ZW0gaXMgc2V0IHRvIHRydWUgaWYgc3BlY2lmaWMgc3RyZWFtIElEIHdhcyB1c2VkIGluIHRoZQorICogICBkb2N1bWVudCkuCisgKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSBmb250VHlwZXMgLSBVc2VkIGZvbnQgdHlwZXMgaW4gdGhlCisgKiAgIGRvY3VtZW50IChhbiBpdGVtIGlzIHNldCB0byB0cnVlIGlmIHNwZWNpZmljIGZvbnQgSUQgd2FzIHVzZWQgaW4gdGhlCisgKiAgIGRvY3VtZW50KS4KKyAqLworLyoqCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBsb2FkaW5nIGEgUERGIGFuZCBpbnRlcmFjdGluZyB3aXRoIGl0LgorICoKKyAqIE5PVEU6IElmIGEgVVJMIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIFBERiBkYXRhIGEgc3RhbmRhcmQgRmV0Y2ggQVBJIGNhbGwgKG9yCisgKiBYSFIgYXMgZmFsbGJhY2spIGlzIHVzZWQsIHdoaWNoIG1lYW5zIGl0IG11c3QgZm9sbG93IHNhbWUgb3JpZ2luIHJ1bGVzLAorICogZS5nLiBubyBjcm9zcy1kb21haW4gcmVxdWVzdHMgd2l0aG91dCBDT1JTLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfFR5cGVkQXJyYXl8RG9jdW1lbnRJbml0UGFyYW1ldGVyc3xQREZEYXRhUmFuZ2VUcmFuc3BvcnR9IHNyYyAtCisgKiAgIENhbiBiZSBhIFVSTCB0byB3aGVyZSBhIFBERiBmaWxlIGlzIGxvY2F0ZWQsIGEgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpCisgKiAgIGFscmVhZHkgcG9wdWxhdGVkIHdpdGggZGF0YSBvciBwYXJhbWV0ZXIgb2JqZWN0LgorICogQHJldHVybnMge1BERkRvY3VtZW50TG9hZGluZ1Rhc2t9CisgKi8KK2V4cG9ydCBmdW5jdGlvbiBnZXREb2N1bWVudChzcmM6IHN0cmluZyB8IFR5cGVkQXJyYXkgfCBEb2N1bWVudEluaXRQYXJhbWV0ZXJzIHwgUERGRGF0YVJhbmdlVHJhbnNwb3J0KTogUERGRG9jdW1lbnRMb2FkaW5nVGFzazsKK2V4cG9ydCBjbGFzcyBMb29wYmFja1BvcnQgeworICAgIGNvbnN0cnVjdG9yKGRlZmVyPzogYm9vbGVhbik7CisgICAgX2xpc3RlbmVyczogYW55W107CisgICAgX2RlZmVyOiBib29sZWFuOworICAgIF9kZWZlcnJlZDogUHJvbWlzZTx1bmRlZmluZWQ+OworICAgIHBvc3RNZXNzYWdlKG9iajogYW55LCB0cmFuc2ZlcnM6IGFueSk6IHZvaWQ7CisgICAgYWRkRXZlbnRMaXN0ZW5lcihuYW1lOiBhbnksIGxpc3RlbmVyOiBhbnkpOiB2b2lkOworICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZTogYW55LCBsaXN0ZW5lcjogYW55KTogdm9pZDsKKyAgICB0ZXJtaW5hdGUoKTogdm9pZDsKK30KKy8qKgorICogQWJzdHJhY3QgY2xhc3MgdG8gc3VwcG9ydCByYW5nZSByZXF1ZXN0cyBmaWxlIGxvYWRpbmcuCisgKi8KK2V4cG9ydCBjbGFzcyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgeworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGgKKyAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGluaXRpYWxEYXRhCisgICAgICogQHBhcmFtIHtib29sZWFufSBbcHJvZ3Jlc3NpdmVEb25lXQorICAgICAqLworICAgIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyLCBpbml0aWFsRGF0YTogVWludDhBcnJheSwgcHJvZ3Jlc3NpdmVEb25lPzogYm9vbGVhbiB8IHVuZGVmaW5lZCk7CisgICAgbGVuZ3RoOiBudW1iZXI7CisgICAgaW5pdGlhbERhdGE6IFVpbnQ4QXJyYXk7CisgICAgcHJvZ3Jlc3NpdmVEb25lOiBib29sZWFuOworICAgIF9yYW5nZUxpc3RlbmVyczogYW55W107CisgICAgX3Byb2dyZXNzTGlzdGVuZXJzOiBhbnlbXTsKKyAgICBfcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzOiBhbnlbXTsKKyAgICBfcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzOiBhbnlbXTsKKyAgICBfcmVhZHlDYXBhYmlsaXR5OiBpbXBvcnQoIi4uL3NoYXJlZC91dGlsLmpzIikuUHJvbWlzZUNhcGFiaWxpdHk7CisgICAgYWRkUmFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjogYW55KTogdm9pZDsKKyAgICBhZGRQcm9ncmVzc0xpc3RlbmVyKGxpc3RlbmVyOiBhbnkpOiB2b2lkOworICAgIGFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGxpc3RlbmVyOiBhbnkpOiB2b2lkOworICAgIGFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKGxpc3RlbmVyOiBhbnkpOiB2b2lkOworICAgIG9uRGF0YVJhbmdlKGJlZ2luOiBhbnksIGNodW5rOiBhbnkpOiB2b2lkOworICAgIG9uRGF0YVByb2dyZXNzKGxvYWRlZDogYW55LCB0b3RhbDogYW55KTogdm9pZDsKKyAgICBvbkRhdGFQcm9ncmVzc2l2ZVJlYWQoY2h1bms6IGFueSk6IHZvaWQ7CisgICAgb25EYXRhUHJvZ3Jlc3NpdmVEb25lKCk6IHZvaWQ7CisgICAgdHJhbnNwb3J0UmVhZHkoKTogdm9pZDsKKyAgICByZXF1ZXN0RGF0YVJhbmdlKGJlZ2luOiBhbnksIGVuZDogYW55KTogdm9pZDsKKyAgICBhYm9ydCgpOiB2b2lkOworfQorLyoqCisgKiBAdHlwZWRlZiB7T2JqZWN0fSBQREZXb3JrZXJQYXJhbWV0ZXJzCisgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHdvcmtlci4KKyAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbcG9ydF0gLSBUaGUgYHdvcmtlclBvcnRgIG9iamVjdC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdmVyYm9zaXR5XSAtIENvbnRyb2xzIHRoZSBsb2dnaW5nIGxldmVsOyB0aGUKKyAqICAgY29uc3RhbnRzIGZyb20ge0BsaW5rIFZlcmJvc2l0eUxldmVsfSBzaG91bGQgYmUgdXNlZC4KKyAqLworLyoqIEB0eXBlIHthbnl9ICovCitleHBvcnQgY29uc3QgUERGV29ya2VyOiBhbnk7CisvKioKKyAqIFByb3h5IHRvIGEgYFBERkRvY3VtZW50YCBpbiB0aGUgd29ya2VyIHRocmVhZC4KKyAqLworZXhwb3J0IGNsYXNzIFBERkRvY3VtZW50UHJveHkgeworICAgIGNvbnN0cnVjdG9yKHBkZkluZm86IGFueSwgdHJhbnNwb3J0OiBhbnkpOworICAgIF9wZGZJbmZvOiBhbnk7CisgICAgX3RyYW5zcG9ydDogYW55OworICAgIC8qKgorICAgICAqIEB0eXBlIHtBbm5vdGF0aW9uU3RvcmFnZX0gU3RvcmFnZSBmb3IgYW5ub3RhdGlvbiBkYXRhIGluIGZvcm1zLgorICAgICAqLworICAgIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpOiBBbm5vdGF0aW9uU3RvcmFnZTsKKyAgICAvKioKKyAgICAgKiBAdHlwZSB7bnVtYmVyfSBUb3RhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIFBERiBmaWxlLgorICAgICAqLworICAgIGdldCBudW1QYWdlcygpOiBudW1iZXI7CisgICAgLyoqCisgICAgICogQHR5cGUge3N0cmluZ30gQSAobm90IGd1YXJhbnRlZWQgdG8gYmUpIHVuaXF1ZSBJRCB0byBpZGVudGlmeSBhIFBERi4KKyAgICAgKi8KKyAgICBnZXQgZmluZ2VycHJpbnQoKTogc3RyaW5nOworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlTnVtYmVyIC0gVGhlIHBhZ2UgbnVtYmVyIHRvIGdldC4gVGhlIGZpcnN0IHBhZ2UgaXMgMS4KKyAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQREZQYWdlUHJveHk+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoCisgICAgICogICBhIHtAbGluayBQREZQYWdlUHJveHl9IG9iamVjdC4KKyAgICAgKi8KKyAgICBnZXRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlcik6IFByb21pc2U8UERGUGFnZVByb3h5PjsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge3tudW06IG51bWJlciwgZ2VuOiBudW1iZXJ9fSByZWYgLSBUaGUgcGFnZSByZWZlcmVuY2UuIE11c3QgaGF2ZQorICAgICAqICAgdGhlIGBudW1gIGFuZCBgZ2VuYCBwcm9wZXJ0aWVzLgorICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHtudW06IG51bWJlciwgZ2VuOiBudW1iZXJ9Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQKKyAgICAgKiAgIHdpdGggdGhlIHBhZ2UgaW5kZXggKHN0YXJ0aW5nIGZyb20gemVybykgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogICByZWZlcmVuY2UuCisgICAgICovCisgICAgZ2V0UGFnZUluZGV4KHJlZjogeworICAgICAgICBudW06IG51bWJlcjsKKyAgICAgICAgZ2VuOiBudW1iZXI7CisgICAgfSk6IFByb21pc2U8eworICAgICAgICBudW06IG51bWJlcjsKKyAgICAgICAgZ2VuOiBudW1iZXI7CisgICAgfT47CisgICAgLyoqCisgICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0PHN0cmluZywgQXJyYXk8YW55Pj4+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZAorICAgICAqICAgd2l0aCBhIG1hcHBpbmcgZnJvbSBuYW1lZCBkZXN0aW5hdGlvbnMgdG8gcmVmZXJlbmNlcy4KKyAgICAgKgorICAgICAqIFRoaXMgY2FuIGJlIHNsb3cgZm9yIGxhcmdlIGRvY3VtZW50cy4gVXNlIGBnZXREZXN0aW5hdGlvbmAgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBnZXREZXN0aW5hdGlvbnMoKTogUHJvbWlzZTx7CisgICAgICAgIFt4OiBzdHJpbmddOiBBcnJheTxhbnk+OworICAgIH0+OworICAgIC8qKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBuYW1lZCBkZXN0aW5hdGlvbiB0byBnZXQuCisgICAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8YW55Pj59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYWxsCisgICAgICogICBpbmZvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gbmFtZWQgZGVzdGluYXRpb24uCisgICAgICovCisgICAgZ2V0RGVzdGluYXRpb24oaWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8YW55Pj47CisgICAgLyoqCisgICAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8c3RyaW5nPiB8IG51bGw+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoCisgICAgICogICBhbiB7QXJyYXl9IGNvbnRhaW5pbmcgdGhlIHBhZ2UgbGFiZWxzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgcGFnZQorICAgICAqICAgaW5kZXhlcywgb3IgYG51bGxgIHdoZW4gbm8gcGFnZSBsYWJlbHMgYXJlIHByZXNlbnQgaW4gdGhlIFBERiBmaWxlLgorICAgICAqLworICAgIGdldFBhZ2VMYWJlbHMoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+IHwgbnVsbD47CisgICAgLyoqCisgICAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhIHtzdHJpbmd9CisgICAgICogICBjb250YWluaW5nIHRoZSBwYWdlIGxheW91dCBuYW1lLgorICAgICAqLworICAgIGdldFBhZ2VMYXlvdXQoKTogUHJvbWlzZTxzdHJpbmc+OworICAgIC8qKgorICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSB7c3RyaW5nfQorICAgICAqICAgY29udGFpbmluZyB0aGUgcGFnZSBtb2RlIG5hbWUuCisgICAgICovCisgICAgZ2V0UGFnZU1vZGUoKTogUHJvbWlzZTxzdHJpbmc+OworICAgIC8qKgorICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdCB8IG51bGw+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuCisgICAgICogICB7T2JqZWN0fSBjb250YWluaW5nIHRoZSB2aWV3ZXIgcHJlZmVyZW5jZXMsIG9yIGBudWxsYCB3aGVuIG5vIHZpZXdlcgorICAgICAqICAgcHJlZmVyZW5jZXMgYXJlIHByZXNlbnQgaW4gdGhlIFBERiBmaWxlLgorICAgICAqLworICAgIGdldFZpZXdlclByZWZlcmVuY2VzKCk6IFByb21pc2U8T2JqZWN0IHwgbnVsbD47CisgICAgLyoqCisgICAgICogQHJldHVybnMge1Byb21pc2U8YW55IHwgbnVsbD59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4ge0FycmF5fQorICAgICAqICAgY29udGFpbmluZyB0aGUgZGVzdGluYXRpb24sIG9yIGBudWxsYCB3aGVuIG5vIG9wZW4gYWN0aW9uIGlzIHByZXNlbnQKKyAgICAgKiAgIGluIHRoZSBQREYuCisgICAgICovCisgICAgZ2V0T3BlbkFjdGlvbigpOiBQcm9taXNlPGFueSB8IG51bGw+OworICAgIC8qKgorICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSBsb29rdXAgdGFibGUKKyAgICAgKiAgIGZvciBtYXBwaW5nIG5hbWVkIGF0dGFjaG1lbnRzIHRvIHRoZWlyIGNvbnRlbnQuCisgICAgICovCisgICAgZ2V0QXR0YWNobWVudHMoKTogUHJvbWlzZTxhbnk+OworICAgIC8qKgorICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHN0cmluZz4gfCBudWxsPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aAorICAgICAqICAgYW4ge0FycmF5fSBvZiBhbGwgdGhlIEphdmFTY3JpcHQgc3RyaW5ncyBpbiB0aGUgbmFtZSB0cmVlLCBvciBgbnVsbGAKKyAgICAgKiAgIGlmIG5vIEphdmFTY3JpcHQgZXhpc3RzLgorICAgICAqLworICAgIGdldEphdmFTY3JpcHQoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+IHwgbnVsbD47CisgICAgLyoqCisgICAgICogQHR5cGVkZWYge09iamVjdH0gT3V0bGluZU5vZGUKKyAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGUKKyAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvbGQKKyAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGl0YWxpYworICAgICAqIEBwcm9wZXJ0eSB7VWludDhDbGFtcGVkQXJyYXl9IGNvbG9yIC0gVGhlIGNvbG9yIGluIFJHQiBmb3JtYXQgdG8gdXNlIGZvcgorICAgICAqICAgZGlzcGxheSBwdXJwb3Nlcy4KKyAgICAgKiBAcHJvcGVydHkge3N0cmluZyB8IEFycmF5PGFueT4gfCBudWxsfSBkZXN0CisgICAgICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSB1cmwKKyAgICAgKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gdW5zYWZlVXJsCisgICAgICogQHByb3BlcnR5IHtib29sZWFuIHwgdW5kZWZpbmVkfSBuZXdXaW5kb3cKKyAgICAgKiBAcHJvcGVydHkge251bWJlciB8IHVuZGVmaW5lZH0gY291bnQKKyAgICAgKiBAcHJvcGVydHkge0FycmF5PE91dGxpbmVOb2RlPn0gaXRlbXMKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxPdXRsaW5lTm9kZT4+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuCisgICAgICogICB7QXJyYXl9IHRoYXQgaXMgYSB0cmVlIG91dGxpbmUgKGlmIGl0IGhhcyBvbmUpIG9mIHRoZSBQREYgZmlsZS4KKyAgICAgKi8KKyAgICBnZXRPdXRsaW5lKCk6IFByb21pc2U8eworICAgICAgICB0aXRsZTogc3RyaW5nOworICAgICAgICBib2xkOiBib29sZWFuOworICAgICAgICBpdGFsaWM6IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiAtIFRoZSBjb2xvciBpbiBSR0IgZm9ybWF0IHRvIHVzZSBmb3IKKyAgICAgICAgICogZGlzcGxheSBwdXJwb3Nlcy4KKyAgICAgICAgICovCisgICAgICAgIGNvbG9yOiBVaW50OENsYW1wZWRBcnJheTsKKyAgICAgICAgZGVzdDogc3RyaW5nIHwgQXJyYXk8YW55PiB8IG51bGw7CisgICAgICAgIHVybDogc3RyaW5nIHwgbnVsbDsKKyAgICAgICAgdW5zYWZlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7CisgICAgICAgIG5ld1dpbmRvdzogYm9vbGVhbiB8IHVuZGVmaW5lZDsKKyAgICAgICAgY291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDsKKyAgICAgICAgaXRlbXM6IGFueVtdOworICAgIH1bXT47CisgICAgLyoqCisgICAgICogQHJldHVybnMge1Byb21pc2U8T3B0aW9uYWxDb250ZW50Q29uZmlnPn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aAorICAgICAqICAgYW4ge0BsaW5rIE9wdGlvbmFsQ29udGVudENvbmZpZ30gdGhhdCBjb250YWlucyBhbGwgdGhlIG9wdGlvbmFsIGNvbnRlbnQKKyAgICAgKiAgIGdyb3VwcyAoYXNzdW1pbmcgdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGFueSkuCisgICAgICovCisgICAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk6IFByb21pc2U8T3B0aW9uYWxDb250ZW50Q29uZmlnPjsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxudW1iZXI+IHwgbnVsbD59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGgKKyAgICAgKiAgIGFuIHtBcnJheX0gdGhhdCBjb250YWlucyB0aGUgcGVybWlzc2lvbiBmbGFncyBmb3IgdGhlIFBERiBkb2N1bWVudCwgb3IKKyAgICAgKiAgIGBudWxsYCB3aGVuIG5vIHBlcm1pc3Npb25zIGFyZSBwcmVzZW50IGluIHRoZSBQREYgZmlsZS4KKyAgICAgKi8KKyAgICBnZXRQZXJtaXNzaW9ucygpOiBQcm9taXNlPEFycmF5PG51bWJlcj4gfCBudWxsPjsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IGluZm86IE9iamVjdCwgbWV0YWRhdGE6IE1ldGFkYXRhIH0+fSBBIHByb21pc2UgdGhhdCBpcworICAgICAqICAgcmVzb2x2ZWQgd2l0aCBhbiB7T2JqZWN0fSB0aGF0IGhhcyBgaW5mb2AgYW5kIGBtZXRhZGF0YWAgcHJvcGVydGllcy4KKyAgICAgKiAgIGBpbmZvYCBpcyBhbiB7T2JqZWN0fSBmaWxsZWQgd2l0aCBhbnl0aGluZyBhdmFpbGFibGUgaW4gdGhlIGluZm9ybWF0aW9uCisgICAgICogICBkaWN0aW9uYXJ5IGFuZCBzaW1pbGFybHkgYG1ldGFkYXRhYCBpcyBhIHtNZXRhZGF0YX0gb2JqZWN0IHdpdGgKKyAgICAgKiAgIGluZm9ybWF0aW9uIGZyb20gdGhlIG1ldGFkYXRhIHNlY3Rpb24gb2YgdGhlIFBERi4KKyAgICAgKi8KKyAgICBnZXRNZXRhZGF0YSgpOiBQcm9taXNlPHsKKyAgICAgICAgaW5mbzogT2JqZWN0OworICAgICAgICBtZXRhZGF0YTogTWV0YWRhdGE7CisgICAgfT47CisgICAgLyoqCisgICAgICogQHJldHVybnMge1Byb21pc2U8VHlwZWRBcnJheT59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYQorICAgICAqICAge1R5cGVkQXJyYXl9IHRoYXQgaGFzIHRoZSByYXcgZGF0YSBmcm9tIHRoZSBQREYuCisgICAgICovCisgICAgZ2V0RGF0YSgpOiBQcm9taXNlPFR5cGVkQXJyYXk+OworICAgIC8qKgorICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHsgbGVuZ3RoOiBudW1iZXIgfT59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlCisgICAgICogICBkb2N1bWVudCdzIGRhdGEgaXMgbG9hZGVkLiBJdCBpcyByZXNvbHZlZCB3aXRoIGFuIHtPYmplY3R9IHRoYXQgY29udGFpbnMKKyAgICAgKiAgIHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eSB0aGF0IGluZGljYXRlcyBzaXplIG9mIHRoZSBQREYgZGF0YSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICBnZXREb3dubG9hZEluZm8oKTogUHJvbWlzZTx7CisgICAgICAgIGxlbmd0aDogbnVtYmVyOworICAgIH0+OworICAgIC8qKgorICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFBERkRvY3VtZW50U3RhdHM+fSBBIHByb21pc2UgdGhpcyBpcyByZXNvbHZlZCB3aXRoCisgICAgICogICBjdXJyZW50IHN0YXRpc3RpY3MgYWJvdXQgZG9jdW1lbnQgc3RydWN0dXJlcyAoc2VlCisgICAgICogICB7QGxpbmsgUERGRG9jdW1lbnRTdGF0c30pLgorICAgICAqLworICAgIGdldFN0YXRzKCk6IFByb21pc2U8UERGRG9jdW1lbnRTdGF0cz47CisgICAgLyoqCisgICAgICogQ2xlYW5zIHVwIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlIGRvY3VtZW50IG9uIGJvdGggdGhlIG1haW4gYW5kIHdvcmtlcgorICAgICAqIHRocmVhZHMuCisgICAgICoKKyAgICAgKiBOT1RFOiBEbyBub3QsIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gcmVuZGVyaW5nIGlzCisgICAgICogY3VycmVudGx5IG9uZ29pbmcgc2luY2UgdGhhdCBtYXkgbGVhZCB0byByZW5kZXJpbmcgZXJyb3JzLgorICAgICAqCisgICAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gY2xlYW4tdXAgaGFzIGZpbmlzaGVkLgorICAgICAqLworICAgIGNsZWFudXAoKTogUHJvbWlzZTxhbnk+OworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBjdXJyZW50IGRvY3VtZW50IGluc3RhbmNlIGFuZCB0ZXJtaW5hdGVzIHRoZSB3b3JrZXIuCisgICAgICovCisgICAgZGVzdHJveSgpOiBhbnk7CisgICAgLyoqCisgICAgICogQHR5cGUge0RvY3VtZW50SW5pdFBhcmFtZXRlcnN9IEEgc3Vic2V0IG9mIHRoZSBjdXJyZW50CisgICAgICogICB7RG9jdW1lbnRJbml0UGFyYW1ldGVyc30sIHdoaWNoIGFyZSBlaXRoZXIgbmVlZGVkIGluIHRoZSB2aWV3ZXIgYW5kL29yCisgICAgICogICB3aG9zZSBkZWZhdWx0IHZhbHVlcyBtYXkgYmUgYWZmZWN0ZWQgYnkgdGhlIGBhcGlDb21wYXRpYmlsaXR5UGFyYW1zYC4KKyAgICAgKi8KKyAgICBnZXQgbG9hZGluZ1BhcmFtcygpOiBEb2N1bWVudEluaXRQYXJhbWV0ZXJzOworICAgIC8qKgorICAgICAqIEB0eXBlIHtQREZEb2N1bWVudExvYWRpbmdUYXNrfSBUaGUgbG9hZGluZ1Rhc2sgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50LgorICAgICAqLworICAgIGdldCBsb2FkaW5nVGFzaygpOiBQREZEb2N1bWVudExvYWRpbmdUYXNrOworICAgIC8qKgorICAgICAqIEBwYXJhbSB7QW5ub3RhdGlvblN0b3JhZ2V9IGFubm90YXRpb25TdG9yYWdlIC0gU3RvcmFnZSBmb3IgYW5ub3RhdGlvbgorICAgICAqICAgZGF0YSBpbiBmb3Jtcy4KKyAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxVaW50OEFycmF5Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhCisgICAgICogICB7VWludDhBcnJheX0gY29udGFpbmluZyB0aGUgZnVsbCBkYXRhIG9mIHRoZSBzYXZlZCBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBzYXZlRG9jdW1lbnQoYW5ub3RhdGlvblN0b3JhZ2U6IEFubm90YXRpb25TdG9yYWdlKTogUHJvbWlzZTxVaW50OEFycmF5PjsKK30KKy8qKgorICogUGFnZSBnZXRWaWV3cG9ydCBwYXJhbWV0ZXJzLgorICoKKyAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFZpZXdwb3J0UGFyYW1ldGVycworICogQHByb3BlcnR5IHtudW1iZXJ9IHNjYWxlIC0gVGhlIGRlc2lyZWQgc2NhbGUgb2YgdGhlIHZpZXdwb3J0LgorICogQHByb3BlcnR5IHtudW1iZXJ9IFtyb3RhdGlvbl0gLSBUaGUgZGVzaXJlZCByb3RhdGlvbiwgaW4gZGVncmVlcywgb2YKKyAqICAgdGhlIHZpZXdwb3J0LiBJZiBvbWl0dGVkIGl0IGRlZmF1bHRzIHRvIHRoZSBwYWdlIHJvdGF0aW9uLgorICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRYXSAtIFRoZSBob3Jpem9udGFsLCBpLmUuIHgtYXhpcywgb2Zmc2V0LgorICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMGAuCisgKiBAcHJvcGVydHkge251bWJlcn0gW29mZnNldFldIC0gVGhlIHZlcnRpY2FsLCBpLmUuIHktYXhpcywgb2Zmc2V0LgorICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMGAuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkb250RmxpcF0gLSBJZiB0cnVlLCB0aGUgeS1heGlzIHdpbGwgbm90IGJlCisgKiAgIGZsaXBwZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgKi8KKy8qKgorICogUGFnZSBnZXRUZXh0Q29udGVudCBwYXJhbWV0ZXJzLgorICoKKyAqIEB0eXBlZGVmIHtPYmplY3R9IGdldFRleHRDb250ZW50UGFyYW1ldGVycworICogQHByb3BlcnR5IHtib29sZWFufSBub3JtYWxpemVXaGl0ZXNwYWNlIC0gUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mCisgKiAgIHdoaXRlc3BhY2Ugd2l0aCBzdGFuZGFyZCBzcGFjZXMgKDB4MjApLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICogQHByb3BlcnR5IHtib29sZWFufSBkaXNhYmxlQ29tYmluZVRleHRJdGVtcyAtIERvIG5vdCBhdHRlbXB0IHRvIGNvbWJpbmUKKyAqICAgc2FtZSBsaW5lIHtAbGluayBUZXh0SXRlbX0ncy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC4KKyAqLworLyoqCisgKiBQYWdlIHRleHQgY29udGVudC4KKyAqCisgKiBAdHlwZWRlZiB7T2JqZWN0fSBUZXh0Q29udGVudAorICogQHByb3BlcnR5IHtBcnJheTxUZXh0SXRlbT59IGl0ZW1zIC0gQXJyYXkgb2Yge0BsaW5rIFRleHRJdGVtfSBvYmplY3RzLgorICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBUZXh0U3R5bGU+fSBzdHlsZXMgLSB7QGxpbmsgVGV4dFN0eWxlfSBvYmplY3RzLAorICogICBpbmRleGVkIGJ5IGZvbnQgbmFtZS4KKyAqLworLyoqCisgKiBQYWdlIHRleHQgY29udGVudCBwYXJ0LgorICoKKyAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRJdGVtCisgKiBAcHJvcGVydHkge3N0cmluZ30gc3RyIC0gVGV4dCBjb250ZW50LgorICogQHByb3BlcnR5IHtzdHJpbmd9IGRpciAtIFRleHQgZGlyZWN0aW9uOiAndHRiJywgJ2x0cicgb3IgJ3J0bCcuCisgKiBAcHJvcGVydHkge0FycmF5PGFueT59IHRyYW5zZm9ybSAtIFRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIFdpZHRoIGluIGRldmljZSBzcGFjZS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBIZWlnaHQgaW4gZGV2aWNlIHNwYWNlLgorICogQHByb3BlcnR5IHtzdHJpbmd9IGZvbnROYW1lIC0gRm9udCBuYW1lIHVzZWQgYnkgUERGLmpzIGZvciBjb252ZXJ0ZWQgZm9udC4KKyAqLworLyoqCisgKiBUZXh0IHN0eWxlLgorICoKKyAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRTdHlsZQorICogQHByb3BlcnR5IHtudW1iZXJ9IGFzY2VudCAtIEZvbnQgYXNjZW50LgorICogQHByb3BlcnR5IHtudW1iZXJ9IGRlc2NlbnQgLSBGb250IGRlc2NlbnQuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IHZlcnRpY2FsIC0gV2hldGhlciBvciBub3QgdGhlIHRleHQgaXMgaW4gdmVydGljYWwgbW9kZS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb250RmFtaWx5IC0gVGhlIHBvc3NpYmxlIGZvbnQgZmFtaWx5LgorICovCisvKioKKyAqIFBhZ2UgYW5ub3RhdGlvbiBwYXJhbWV0ZXJzLgorICoKKyAqIEB0eXBlZGVmIHtPYmplY3R9IEdldEFubm90YXRpb25zUGFyYW1ldGVycworICogQHByb3BlcnR5IHtzdHJpbmd9IGludGVudCAtIERldGVybWluZXMgdGhlIGFubm90YXRpb25zIHRoYXQgd2lsbCBiZSBmZXRjaGVkLAorICogICBjYW4gYmUgZWl0aGVyICdkaXNwbGF5JyAodmlld2FibGUgYW5ub3RhdGlvbnMpIG9yICdwcmludCcgKHByaW50YWJsZQorICogICBhbm5vdGF0aW9ucykuIElmIHRoZSBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgYWxsIGFubm90YXRpb25zIGFyZSBmZXRjaGVkLgorICovCisvKioKKyAqIFBhZ2UgcmVuZGVyIHBhcmFtZXRlcnMuCisgKgorICogQHR5cGVkZWYge09iamVjdH0gUmVuZGVyUGFyYW1ldGVycworICogQHByb3BlcnR5IHtPYmplY3R9IGNhbnZhc0NvbnRleHQgLSBBIDJEIGNvbnRleHQgb2YgYSBET00gQ2FudmFzIG9iamVjdC4KKyAqIEBwcm9wZXJ0eSB7UGFnZVZpZXdwb3J0fSB2aWV3cG9ydCAtIFJlbmRlcmluZyB2aWV3cG9ydCBvYnRhaW5lZCBieSBjYWxsaW5nCisgKiAgIHRoZSBgUERGUGFnZVByb3h5LmdldFZpZXdwb3J0YCBtZXRob2QuCisgKiBAcHJvcGVydHkge3N0cmluZ30gW2ludGVudF0gLSBSZW5kZXJpbmcgaW50ZW50LCBjYW4gYmUgJ2Rpc3BsYXknIG9yICdwcmludCcuCisgKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzICdkaXNwbGF5Jy4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZVdlYkdMXSAtIEVuYWJsZXMgV2ViR0wgYWNjZWxlcmF0ZWQgcmVuZGVyaW5nIGZvcgorICogICBzb21lIG9wZXJhdGlvbnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZW5kZXJJbnRlcmFjdGl2ZUZvcm1zXSAtIFdoZXRoZXIgb3Igbm90IGludGVyYWN0aXZlCisgKiAgIGZvcm0gZWxlbWVudHMgYXJlIHJlbmRlcmVkIGluIHRoZSBkaXNwbGF5IGxheWVyLiBJZiBzbywgd2UgZG8gbm90IHJlbmRlcgorICogICB0aGVtIG9uIHRoZSBjYW52YXMgYXMgd2VsbC4KKyAqIEBwcm9wZXJ0eSB7QXJyYXk8YW55Pn0gW3RyYW5zZm9ybV0gLSBBZGRpdGlvbmFsIHRyYW5zZm9ybSwgYXBwbGllZCBqdXN0CisgKiAgIGJlZm9yZSB2aWV3cG9ydCB0cmFuc2Zvcm0uCisgKiBAcHJvcGVydHkge09iamVjdH0gW2ltYWdlTGF5ZXJdIC0gQW4gb2JqZWN0IHRoYXQgaGFzIGBiZWdpbkxheW91dGAsCisgKiAgIGBlbmRMYXlvdXRgIGFuZCBgYXBwZW5kSW1hZ2VgIGZ1bmN0aW9ucy4KKyAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbY2FudmFzRmFjdG9yeV0gLSBUaGUgZmFjdG9yeSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZAorICogICB3aGVuIGNyZWF0aW5nIGNhbnZhc2VzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7bmV3IERPTUNhbnZhc0ZhY3RvcnkoKX0uCisgKiBAcHJvcGVydHkge09iamVjdCB8IHN0cmluZ30gW2JhY2tncm91bmRdIC0gQmFja2dyb3VuZCB0byB1c2UgZm9yIHRoZSBjYW52YXMuCisgKiAgIEFueSB2YWxpZCBgY2FudmFzLmZpbGxTdHlsZWAgY2FuIGJlIHVzZWQ6IGEgYERPTVN0cmluZ2AgcGFyc2VkIGFzIENTUworICogICA8Y29sb3I+IHZhbHVlLCBhIGBDYW52YXNHcmFkaWVudGAgb2JqZWN0IChhIGxpbmVhciBvciByYWRpYWwgZ3JhZGllbnQpIG9yCisgKiAgIGEgYENhbnZhc1BhdHRlcm5gIG9iamVjdCAoYSByZXBldGl0aXZlIGltYWdlKS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAqICAgJ3JnYigyNTUsMjU1LDI1NSknLgorICogQHByb3BlcnR5IHtBbm5vdGF0aW9uU3RvcmFnZX0gW2Fubm90YXRpb25TdG9yYWdlXSAtIFN0b3JhZ2UgZm9yIGFubm90YXRpb24KKyAqICAgZGF0YSBpbiBmb3Jtcy4KKyAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxPcHRpb25hbENvbnRlbnRDb25maWc+fSBbb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZV0gLQorICogICBBIHByb21pc2UgdGhhdCBzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIHtAbGluayBPcHRpb25hbENvbnRlbnRDb25maWd9CisgKiAgIGNyZWF0ZWQgZnJvbSBgUERGRG9jdW1lbnRQcm94eS5nZXRPcHRpb25hbENvbnRlbnRDb25maWdgLiBJZiBgbnVsbGAsCisgKiAgIHRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZmV0Y2hlZCBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIGRlZmF1bHQgdmlzaWJpbGl0eQorICogICBzdGF0ZXMgc2V0LgorICovCisvKioKKyAqIFBERiBwYWdlIG9wZXJhdG9yIGxpc3QuCisgKgorICogQHR5cGVkZWYge09iamVjdH0gUERGT3BlcmF0b3JMaXN0CisgKiBAcHJvcGVydHkge0FycmF5PG51bWJlcj59IGZuQXJyYXkgLSBBcnJheSBjb250YWluaW5nIHRoZSBvcGVyYXRvciBmdW5jdGlvbnMuCisgKiBAcHJvcGVydHkge0FycmF5PGFueT59IGFyZ3NBcnJheSAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyBvZiB0aGUKKyAqICAgZnVuY3Rpb25zLgorICovCisvKioKKyAqIFByb3h5IHRvIGEgYFBERlBhZ2VgIGluIHRoZSB3b3JrZXIgdGhyZWFkLgorICovCitleHBvcnQgY2xhc3MgUERGUGFnZVByb3h5IHsKKyAgICBjb25zdHJ1Y3RvcihwYWdlSW5kZXg6IGFueSwgcGFnZUluZm86IGFueSwgdHJhbnNwb3J0OiBhbnksIG93bmVyRG9jdW1lbnQ6IGFueSwgcGRmQnVnPzogYm9vbGVhbik7CisgICAgX3BhZ2VJbmRleDogYW55OworICAgIF9wYWdlSW5mbzogYW55OworICAgIF9vd25lckRvY3VtZW50OiBhbnk7CisgICAgX3RyYW5zcG9ydDogYW55OworICAgIF9zdGF0czogU3RhdFRpbWVyIHwgbnVsbDsKKyAgICBfcGRmQnVnOiBib29sZWFuOworICAgIGNvbW1vbk9ianM6IGFueTsKKyAgICBvYmpzOiBQREZPYmplY3RzOworICAgIGNsZWFudXBBZnRlclJlbmRlcjogYm9vbGVhbjsKKyAgICBwZW5kaW5nQ2xlYW51cDogYm9vbGVhbjsKKyAgICBfaW50ZW50U3RhdGVzOiBNYXA8YW55LCBhbnk+OworICAgIGRlc3Ryb3llZDogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiBAdHlwZSB7bnVtYmVyfSBQYWdlIG51bWJlciBvZiB0aGUgcGFnZS4gRmlyc3QgcGFnZSBpcyAxLgorICAgICAqLworICAgIGdldCBwYWdlTnVtYmVyKCk6IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiBAdHlwZSB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGRlZ3JlZXMgdGhlIHBhZ2UgaXMgcm90YXRlZCBjbG9ja3dpc2UuCisgICAgICovCisgICAgZ2V0IHJvdGF0ZSgpOiBudW1iZXI7CisgICAgLyoqCisgICAgICogQHR5cGUge09iamVjdH0gVGhlIHJlZmVyZW5jZSB0aGF0IHBvaW50cyB0byB0aGlzIHBhZ2UuIEl0IGhhcyBgbnVtYCBhbmQKKyAgICAgKiAgIGBnZW5gIHByb3BlcnRpZXMuCisgICAgICovCisgICAgZ2V0IHJlZigpOiBPYmplY3Q7CisgICAgLyoqCisgICAgICogQHR5cGUge251bWJlcn0gVGhlIGRlZmF1bHQgc2l6ZSBvZiB1bml0cyBpbiAxLzcybmRzIG9mIGFuIGluY2guCisgICAgICovCisgICAgZ2V0IHVzZXJVbml0KCk6IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPn0gQW4gYXJyYXkgb2YgdGhlIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgUERGIHBhZ2UgaW4KKyAgICAgKiAgIHVzZXIgc3BhY2UgdW5pdHMgW3gxLCB5MSwgeDIsIHkyXS4KKyAgICAgKi8KKyAgICBnZXQgdmlldygpOiBudW1iZXJbXTsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge0dldFZpZXdwb3J0UGFyYW1ldGVyc30gcGFyYW1zIC0gVmlld3BvcnQgcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJucyB7UGFnZVZpZXdwb3J0fSBDb250YWlucyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBwcm9wZXJ0aWVzCisgICAgICogICBhbG9uZyB3aXRoIHRyYW5zZm9ybXMgcmVxdWlyZWQgZm9yIHJlbmRlcmluZy4KKyAgICAgKi8KKyAgICBnZXRWaWV3cG9ydCh7IHNjYWxlLCByb3RhdGlvbiwgb2Zmc2V0WCwgb2Zmc2V0WSwgZG9udEZsaXAsIH0/OiBHZXRWaWV3cG9ydFBhcmFtZXRlcnMpOiBQYWdlVmlld3BvcnQ7CisgICAgLyoqCisgICAgICogQHBhcmFtIHtHZXRBbm5vdGF0aW9uc1BhcmFtZXRlcnN9IHBhcmFtcyAtIEFubm90YXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxhbnk+Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbgorICAgICAqICAge0FycmF5fSBvZiB0aGUgYW5ub3RhdGlvbiBvYmplY3RzLgorICAgICAqLworICAgIGdldEFubm90YXRpb25zKHsgaW50ZW50IH0/OiBHZXRBbm5vdGF0aW9uc1BhcmFtZXRlcnMpOiBQcm9taXNlPEFycmF5PGFueT4+OworICAgIGFubm90YXRpb25zUHJvbWlzZTogYW55OworICAgIGFubm90YXRpb25zSW50ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7CisgICAgLyoqCisgICAgICogQmVnaW5zIHRoZSBwcm9jZXNzIG9mIHJlbmRlcmluZyBhIHBhZ2UgdG8gdGhlIGRlc2lyZWQgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7UmVuZGVyUGFyYW1ldGVyc30gcGFyYW1zIFBhZ2UgcmVuZGVyIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybnMge1JlbmRlclRhc2t9IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcHJvbWlzZSB0aGF0IGlzCisgICAgICogICByZXNvbHZlZCB3aGVuIHRoZSBwYWdlIGZpbmlzaGVzIHJlbmRlcmluZy4KKyAgICAgKi8KKyAgICByZW5kZXIoeyBjYW52YXNDb250ZXh0LCB2aWV3cG9ydCwgaW50ZW50LCBlbmFibGVXZWJHTCwgcmVuZGVySW50ZXJhY3RpdmVGb3JtcywgdHJhbnNmb3JtLCBpbWFnZUxheWVyLCBjYW52YXNGYWN0b3J5LCBiYWNrZ3JvdW5kLCBhbm5vdGF0aW9uU3RvcmFnZSwgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSwgfTogUmVuZGVyUGFyYW1ldGVycyk6IFJlbmRlclRhc2s7CisgICAgLyoqCisgICAgICogQHJldHVybnMge1Byb21pc2U8UERGT3BlcmF0b3JMaXN0Pn0gQSBwcm9taXNlIHJlc29sdmVkIHdpdGggYW4KKyAgICAgKiAgIHtAbGluayBQREZPcGVyYXRvckxpc3R9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgcGFnZSdzIG9wZXJhdG9yIGxpc3QuCisgICAgICovCisgICAgZ2V0T3BlcmF0b3JMaXN0KCk6IFByb21pc2U8UERGT3BlcmF0b3JMaXN0PjsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge2dldFRleHRDb250ZW50UGFyYW1ldGVyc30gcGFyYW1zIC0gZ2V0VGV4dENvbnRlbnQgcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJucyB7UmVhZGFibGVTdHJlYW19IFN0cmVhbSBmb3IgcmVhZGluZyB0ZXh0IGNvbnRlbnQgY2h1bmtzLgorICAgICAqLworICAgIHN0cmVhbVRleHRDb250ZW50KHsgbm9ybWFsaXplV2hpdGVzcGFjZSwgZGlzYWJsZUNvbWJpbmVUZXh0SXRlbXMsIH0/OiBnZXRUZXh0Q29udGVudFBhcmFtZXRlcnMpOiBSZWFkYWJsZVN0cmVhbTsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge2dldFRleHRDb250ZW50UGFyYW1ldGVyc30gcGFyYW1zIC0gZ2V0VGV4dENvbnRlbnQgcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUZXh0Q29udGVudD59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYQorICAgICAqICAge0BsaW5rIFRleHRDb250ZW50fSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwYWdlJ3MgdGV4dCBjb250ZW50LgorICAgICAqLworICAgIGdldFRleHRDb250ZW50KHBhcmFtcz86IGdldFRleHRDb250ZW50UGFyYW1ldGVycyk6IFByb21pc2U8VGV4dENvbnRlbnQ+OworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBwYWdlIG9iamVjdC4KKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHByaXZhdGUgX2Rlc3Ryb3k7CisgICAgLyoqCisgICAgICogQ2xlYW5zIHVwIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlIHBhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXNldFN0YXRzXSAtIFJlc2V0IHBhZ2Ugc3RhdHMsIGlmIGVuYWJsZWQuCisgICAgICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBJbmRpY2F0ZXMgaWYgY2xlYW4tdXAgd2FzIHN1Y2Nlc3NmdWxseSBydW4uCisgICAgICovCisgICAgY2xlYW51cChyZXNldFN0YXRzPzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW47CisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gY2xlYW4gdXAgaWYgcmVuZGVyaW5nIGlzIGluIGEgc3RhdGUgd2hlcmUgdGhhdCdzIHBvc3NpYmxlLgorICAgICAqIEBwcml2YXRlCisgICAgICovCisgICAgcHJpdmF0ZSBfdHJ5Q2xlYW51cDsKKyAgICAvKioKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHByaXZhdGUgX3N0YXJ0UmVuZGVyUGFnZTsKKyAgICAvKioKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHByaXZhdGUgX3JlbmRlclBhZ2VDaHVuazsKKyAgICAvKioKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHByaXZhdGUgX3B1bXBPcGVyYXRvckxpc3Q7CisgICAgLyoqCisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIF9hYm9ydE9wZXJhdG9yTGlzdDsKKyAgICAvKioKKyAgICAgKiBAdHlwZSB7T2JqZWN0fSBSZXR1cm5zIHBhZ2Ugc3RhdHMsIGlmIGVuYWJsZWQ7IHJldHVybnMgYG51bGxgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBnZXQgc3RhdHMoKTogT2JqZWN0OworfQorLyoqCisgKiBTZXRzIHRoZSBmdW5jdGlvbiB0aGF0IGluc3RhbnRpYXRlcyBhbiB7SVBERlN0cmVhbX0gYXMgYW4gYWx0ZXJuYXRpdmUgUERGCisgKiBkYXRhIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0ge0lQREZTdHJlYW1GYWN0b3J5fSBwZGZOZXR3b3JrU3RyZWFtRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGZ1bmN0aW9uCisgKiAgIHRoYXQgdGFrZXMgZG9jdW1lbnQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAoaW5jbHVkaW5nIGEgInVybCIpIGFuZAorICogICByZXR1cm5zIGEgcHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCB3aXRoIGFuIGluc3RhbmNlIG9mIHtJUERGU3RyZWFtfS4KKyAqIEBpZ25vcmUKKyAqLworZXhwb3J0IGZ1bmN0aW9uIHNldFBERk5ldHdvcmtTdHJlYW1GYWN0b3J5KHBkZk5ldHdvcmtTdHJlYW1GYWN0b3J5OiBJUERGU3RyZWFtRmFjdG9yeSk6IHZvaWQ7CisvKiogQHR5cGUge3N0cmluZ30gKi8KK2V4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmc7CisvKiogQHR5cGUge3N0cmluZ30gKi8KK2V4cG9ydCBjb25zdCBidWlsZDogc3RyaW5nOworaW1wb3J0IHsgUGFnZVZpZXdwb3J0IH0gZnJvbSAiLi9kaXNwbGF5X3V0aWxzLmpzIjsKK2ltcG9ydCB7IEFubm90YXRpb25TdG9yYWdlIH0gZnJvbSAiLi9hbm5vdGF0aW9uX3N0b3JhZ2UuanMiOworaW1wb3J0IHsgT3B0aW9uYWxDb250ZW50Q29uZmlnIH0gZnJvbSAiLi9vcHRpb25hbF9jb250ZW50X2NvbmZpZy5qcyI7CisvKioKKyAqIFRoZSBsb2FkaW5nIHRhc2sgY29udHJvbHMgdGhlIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gbG9hZCBhIFBERiBkb2N1bWVudAorICogKHN1Y2ggYXMgbmV0d29yayByZXF1ZXN0cykgYW5kIHByb3ZpZGVzIGEgd2F5IHRvIGxpc3RlbiBmb3IgY29tcGxldGlvbiwKKyAqIGFmdGVyIHdoaWNoIGluZGl2aWR1YWwgcGFnZXMgY2FuIGJlIHJlbmRlcmVkLgorICoKKyAqIEB0eXBlZGVmIHtPYmplY3R9IFBERkRvY3VtZW50TG9hZGluZ1Rhc2sKKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkb2NJZCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZG9jdW1lbnQgbG9hZGluZyB0YXNrLgorICogQHByb3BlcnR5IHtib29sZWFufSBkZXN0cm95ZWQgLSBXaGV0aGVyIHRoZSBsb2FkaW5nIHRhc2sgaXMgZGVzdHJveWVkIG9yIG5vdC4KKyAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IFtvblBhc3N3b3JkXSAtIENhbGxiYWNrIHRvIHJlcXVlc3QgYSBwYXNzd29yZCBpZiBhIHdyb25nCisgKiAgIG9yIG5vIHBhc3N3b3JkIHdhcyBwcm92aWRlZC4gVGhlIGNhbGxiYWNrIHJlY2VpdmVzIHR3byBwYXJhbWV0ZXJzOiBhCisgKiAgIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgcGFzc3dvcmQsIGFuZCBhIHJlYXNvbiAoc2VlCisgKiAgIHtAbGluayBQYXNzd29yZFJlc3BvbnNlc30pLgorICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW29uUHJvZ3Jlc3NdIC0gQ2FsbGJhY2sgdG8gYmUgYWJsZSB0byBtb25pdG9yIHRoZQorICogICBsb2FkaW5nIHByb2dyZXNzIG9mIHRoZSBQREYgZmlsZSAobmVjZXNzYXJ5IHRvIGltcGxlbWVudCBlLmcuIGEgbG9hZGluZworICogICBiYXIpLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYW4ge09iamVjdH0gd2l0aCB0aGUgcHJvcGVydGllcyBgbG9hZGVkYAorICogICAoe251bWJlcn0pIGFuZCBgdG90YWxgICh7bnVtYmVyfSkgdGhhdCBpbmRpY2F0ZSBob3cgbWFueSBieXRlcyBhcmUgbG9hZGVkLgorICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW29uVW5zdXBwb3J0ZWRGZWF0dXJlXSAtIENhbGxiYWNrIGZvciB3aGVuIGFuCisgKiAgIHVuc3VwcG9ydGVkIGZlYXR1cmUgaXMgdXNlZCBpbiB0aGUgUERGIGRvY3VtZW50LiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYW4KKyAqICAge0BsaW5rIFVOU1VQUE9SVEVEX0ZFQVRVUkVTfSBhcmd1bWVudC4KKyAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQREZEb2N1bWVudFByb3h5Pn0gcHJvbWlzZSAtIFByb21pc2UgZm9yIGRvY3VtZW50IGxvYWRpbmcKKyAqICAgdGFzayBjb21wbGV0aW9uLgorICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZGVzdHJveSAtIEFib3J0IGFsbCBuZXR3b3JrIHJlcXVlc3RzIGFuZCBkZXN0cm95CisgKiAgIHRoZSB3b3JrZXIuIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkZXN0cnVjdGlvbiBpcworICogICBjb21wbGV0ZWQuCisgKi8KKy8qKgorICogQHR5cGUge2FueX0KKyAqIEBpZ25vcmUKKyAqLworZGVjbGFyZSBjb25zdCBQREZEb2N1bWVudExvYWRpbmdUYXNrOiBhbnk7CitpbXBvcnQgeyBpbmZvIH0gZnJvbSAiLi4vc2hhcmVkL3V0aWwuanMiOworaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICIuL21ldGFkYXRhLmpzIjsKK2ltcG9ydCB7IFN0YXRUaW1lciB9IGZyb20gIi4vZGlzcGxheV91dGlscy5qcyI7CisvKioKKyAqIEEgUERGIGRvY3VtZW50IGFuZCBwYWdlIGlzIGJ1aWx0IG9mIG1hbnkgb2JqZWN0cy4gRS5nLiB0aGVyZSBhcmUgb2JqZWN0cyBmb3IKKyAqIGZvbnRzLCBpbWFnZXMsIHJlbmRlcmluZyBjb2RlLCBldGMuIFRoZXNlIG9iamVjdHMgbWF5IGdldCBwcm9jZXNzZWQgaW5zaWRlIG9mCisgKiBhIHdvcmtlci4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHNvbWUgYmFzaWMgbWV0aG9kcyB0byBtYW5hZ2UgdGhlc2Ugb2JqZWN0cy4KKyAqIEBpZ25vcmUKKyAqLworZGVjbGFyZSBjbGFzcyBQREZPYmplY3RzIHsKKyAgICBfb2JqczogYW55OworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhlcmUgaXMgYW4gb2JqZWN0IGRlZmluZWQgZm9yIGBvYmpJZGAuCisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIF9lbnN1cmVPYmo7CisgICAgLyoqCisgICAgICogSWYgY2FsbGVkICp3aXRob3V0KiBjYWxsYmFjaywgdGhpcyByZXR1cm5zIHRoZSBkYXRhIG9mIGBvYmpJZGAgYnV0IHRoZQorICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSByZXNvbHZlZC4gSWYgaXQgaXNuJ3QsIHRoaXMgbWV0aG9kIHRocm93cy4KKyAgICAgKgorICAgICAqIElmIGNhbGxlZCAqd2l0aCogYSBjYWxsYmFjaywgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoZSBkYXRhIG9mIHRoZQorICAgICAqIG9iamVjdCBvbmNlIHRoZSBvYmplY3QgaXMgcmVzb2x2ZWQuIFRoYXQgbWVhbnMsIGlmIHlvdSBjYWxsIHRoaXMgbWV0aG9kCisgICAgICogYW5kIHRoZSBvYmplY3QgaXMgYWxyZWFkeSByZXNvbHZlZCwgdGhlIGNhbGxiYWNrIGdldHMgY2FsbGVkIHJpZ2h0IGF3YXkuCisgICAgICovCisgICAgZ2V0KG9iaklkOiBhbnksIGNhbGxiYWNrPzogYW55KTogYW55OworICAgIGhhcyhvYmpJZDogYW55KTogYW55OworICAgIC8qKgorICAgICAqIFJlc29sdmVzIHRoZSBvYmplY3QgYG9iaklkYCB3aXRoIG9wdGlvbmFsIGBkYXRhYC4KKyAgICAgKi8KKyAgICByZXNvbHZlKG9iaklkOiBhbnksIGRhdGE6IGFueSk6IHZvaWQ7CisgICAgY2xlYXIoKTogdm9pZDsKK30KKy8qKgorICogQWxsb3dzIGNvbnRyb2xsaW5nIG9mIHRoZSByZW5kZXJpbmcgdGFza3MuCisgKi8KK2RlY2xhcmUgY2xhc3MgUmVuZGVyVGFzayB7CisgICAgY29uc3RydWN0b3IoaW50ZXJuYWxSZW5kZXJUYXNrOiBhbnkpOworICAgIF9pbnRlcm5hbFJlbmRlclRhc2s6IGFueTsKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgaW5jcmVtZW50YWwgcmVuZGVyaW5nIC0tIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZAorICAgICAqIGVhY2ggdGltZSB0aGUgcmVuZGVyaW5nIGlzIHBhdXNlZC4gIFRvIGNvbnRpbnVlIHJlbmRlcmluZyBjYWxsIHRoZQorICAgICAqIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjYWxsYmFjay4KKyAgICAgKiBAdHlwZSB7ZnVuY3Rpb259CisgICAgICovCisgICAgb25Db250aW51ZTogRnVuY3Rpb247CisgICAgLyoqCisgICAgICogUHJvbWlzZSBmb3IgcmVuZGVyaW5nIHRhc2sgY29tcGxldGlvbi4KKyAgICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPn0KKyAgICAgKi8KKyAgICBnZXQgcHJvbWlzZSgpOiBQcm9taXNlPHZvaWQ+OworICAgIC8qKgorICAgICAqIENhbmNlbHMgdGhlIHJlbmRlcmluZyB0YXNrLiBJZiB0aGUgdGFzayBpcyBjdXJyZW50bHkgcmVuZGVyaW5nIGl0IHdpbGwKKyAgICAgKiBub3QgYmUgY2FuY2VsbGVkIHVudGlsIGdyYXBoaWNzIHBhdXNlcyB3aXRoIGEgdGltZW91dC4gVGhlIHByb21pc2UgdGhhdAorICAgICAqIHRoaXMgb2JqZWN0IGV4dGVuZHMgd2lsbCBiZSByZWplY3RlZCB3aGVuIGNhbmNlbGxlZC4KKyAgICAgKi8KKyAgICBjYW5jZWwoKTogdm9pZDsKK30KK2V4cG9ydCB7fTsKZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvYXBpX2NvbXBhdGliaWxpdHkuZC50cyBiL3R5cGVzL2Rpc3BsYXkvYXBpX2NvbXBhdGliaWxpdHkuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjIxMDQzCi0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS9hcGlfY29tcGF0aWJpbGl0eS5kLnRzCkBAIC0wLDAgKzEgQEAKK2V4cG9ydCBjb25zdCBhcGlDb21wYXRpYmlsaXR5UGFyYW1zOiBhbnk7CmRpZmYgLS1naXQgYS90eXBlcy9kaXNwbGF5L2NhbnZhcy5kLnRzIGIvdHlwZXMvZGlzcGxheS9jYW52YXMuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTc0ZjRiCi0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS9jYW52YXMuZC50cwpAQCAtMCwwICsxLDQgQEAKKy8qKgorICogQHR5cGUge2FueX0KKyAqLworZXhwb3J0IHZhciBDYW52YXNHcmFwaGljczogYW55OwpkaWZmIC0tZ2l0IGEvdHlwZXMvZGlzcGxheS9jb250ZW50X2Rpc3Bvc2l0aW9uLmQudHMgYi90eXBlcy9kaXNwbGF5L2NvbnRlbnRfZGlzcG9zaXRpb24uZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU2MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS9jb250ZW50X2Rpc3Bvc2l0aW9uLmQudHMKQEAgLTAsMCArMSw3IEBACisvKioKKyAqIEV4dHJhY3QgZmlsZSBuYW1lIGZyb20gdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gSFRUUCByZXNwb25zZSBoZWFkZXIuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnREaXNwb3NpdGlvbgorICogQHJldHVybnMge3N0cmluZ30gRmlsZW5hbWUsIGlmIGZvdW5kIGluIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlci4KKyAqLworZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcihjb250ZW50RGlzcG9zaXRpb246IHN0cmluZyk6IHN0cmluZzsKZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvZGlzcGxheV91dGlscy5kLnRzIGIvdHlwZXMvZGlzcGxheS9kaXNwbGF5X3V0aWxzLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1MGM0NwotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVzL2Rpc3BsYXkvZGlzcGxheV91dGlscy5kLnRzCkBAIC0wLDAgKzEsMjQzIEBACitleHBvcnQgdHlwZSBFeHRlcm5hbExpbmtQYXJhbWV0ZXJzID0gYW55OworZXhwb3J0IHR5cGUgUGFnZVZpZXdwb3J0UGFyYW1ldGVycyA9IHsKKyAgICAvKioKKyAgICAgKiAtIFRoZSB4TWluLCB5TWluLCB4TWF4IGFuZAorICAgICAqIHlNYXggY29vcmRpbmF0ZXMuCisgICAgICovCisgICAgdmlld0JveDogQXJyYXk8bnVtYmVyPjsKKyAgICAvKioKKyAgICAgKiAtIFRoZSBzY2FsZSBvZiB0aGUgdmlld3BvcnQuCisgICAgICovCisgICAgc2NhbGU6IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIFRoZSByb3RhdGlvbiwgaW4gZGVncmVlcywgb2YgdGhlIHZpZXdwb3J0LgorICAgICAqLworICAgIHJvdGF0aW9uOiBudW1iZXI7CisgICAgLyoqCisgICAgICogLSBUaGUgaG9yaXpvbnRhbCwgaS5lLiB4LWF4aXMsIG9mZnNldC4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyBgMGAuCisgICAgICovCisgICAgb2Zmc2V0WD86IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIFRoZSB2ZXJ0aWNhbCwgaS5lLiB5LWF4aXMsIG9mZnNldC4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyBgMGAuCisgICAgICovCisgICAgb2Zmc2V0WT86IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIElmIHRydWUsIHRoZSB5LWF4aXMgd2lsbCBub3QgYmUgZmxpcHBlZC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgorICAgICAqLworICAgIGRvbnRGbGlwPzogYm9vbGVhbjsKK307CitleHBvcnQgdHlwZSBQYWdlVmlld3BvcnRDbG9uZVBhcmFtZXRlcnMgPSB7CisgICAgLyoqCisgICAgICogLSBUaGUgc2NhbGUsIG92ZXJyaWRpbmcgdGhlIG9uZSBpbiB0aGUgY2xvbmVkCisgICAgICogdmlld3BvcnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0aGlzLnNjYWxlYC4KKyAgICAgKi8KKyAgICBzY2FsZT86IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIFRoZSByb3RhdGlvbiwgaW4gZGVncmVlcywgb3ZlcnJpZGluZyB0aGUgb25lCisgICAgICogaW4gdGhlIGNsb25lZCB2aWV3cG9ydC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRoaXMucm90YXRpb25gLgorICAgICAqLworICAgIHJvdGF0aW9uPzogbnVtYmVyOworICAgIC8qKgorICAgICAqIC0gVGhlIGhvcml6b250YWwsIGkuZS4geC1heGlzLCBvZmZzZXQuCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRoaXMub2Zmc2V0WGAuCisgICAgICovCisgICAgb2Zmc2V0WD86IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiAtIFRoZSB2ZXJ0aWNhbCwgaS5lLiB5LWF4aXMsIG9mZnNldC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdGhpcy5vZmZzZXRZYC4KKyAgICAgKi8KKyAgICBvZmZzZXRZPzogbnVtYmVyOworICAgIC8qKgorICAgICAqIC0gSWYgdHJ1ZSwgdGhlIHgtYXhpcyB3aWxsIG5vdCBiZSBmbGlwcGVkLgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgICAgICovCisgICAgZG9udEZsaXA/OiBib29sZWFuOworfTsKKy8qKgorICogQHR5cGVkZWYge09iamVjdH0gUGFnZVZpZXdwb3J0UGFyYW1ldGVycworICogQHByb3BlcnR5IHtBcnJheTxudW1iZXI+fSB2aWV3Qm94IC0gVGhlIHhNaW4sIHlNaW4sIHhNYXggYW5kCisgKiAgIHlNYXggY29vcmRpbmF0ZXMuCisgKiBAcHJvcGVydHkge251bWJlcn0gc2NhbGUgLSBUaGUgc2NhbGUgb2YgdGhlIHZpZXdwb3J0LgorICogQHByb3BlcnR5IHtudW1iZXJ9IHJvdGF0aW9uIC0gVGhlIHJvdGF0aW9uLCBpbiBkZWdyZWVzLCBvZiB0aGUgdmlld3BvcnQuCisgKiBAcHJvcGVydHkge251bWJlcn0gW29mZnNldFhdIC0gVGhlIGhvcml6b250YWwsIGkuZS4geC1heGlzLCBvZmZzZXQuIFRoZQorICogICBkZWZhdWx0IHZhbHVlIGlzIGAwYC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0WV0gLSBUaGUgdmVydGljYWwsIGkuZS4geS1heGlzLCBvZmZzZXQuIFRoZQorICogICBkZWZhdWx0IHZhbHVlIGlzIGAwYC4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RvbnRGbGlwXSAtIElmIHRydWUsIHRoZSB5LWF4aXMgd2lsbCBub3QgYmUgZmxpcHBlZC4KKyAqICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC4KKyAqLworLyoqCisgKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWdlVmlld3BvcnRDbG9uZVBhcmFtZXRlcnMKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2NhbGVdIC0gVGhlIHNjYWxlLCBvdmVycmlkaW5nIHRoZSBvbmUgaW4gdGhlIGNsb25lZAorICogICB2aWV3cG9ydC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRoaXMuc2NhbGVgLgorICogQHByb3BlcnR5IHtudW1iZXJ9IFtyb3RhdGlvbl0gLSBUaGUgcm90YXRpb24sIGluIGRlZ3JlZXMsIG92ZXJyaWRpbmcgdGhlIG9uZQorICogICBpbiB0aGUgY2xvbmVkIHZpZXdwb3J0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdGhpcy5yb3RhdGlvbmAuCisgKiBAcHJvcGVydHkge251bWJlcn0gW29mZnNldFhdIC0gVGhlIGhvcml6b250YWwsIGkuZS4geC1heGlzLCBvZmZzZXQuCisgKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0aGlzLm9mZnNldFhgLgorICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRZXSAtIFRoZSB2ZXJ0aWNhbCwgaS5lLiB5LWF4aXMsIG9mZnNldC4KKyAqICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRoaXMub2Zmc2V0WWAuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkb250RmxpcF0gLSBJZiB0cnVlLCB0aGUgeC1heGlzIHdpbGwgbm90IGJlIGZsaXBwZWQuCisgKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuCisgKi8KKy8qKgorICogUERGIHBhZ2Ugdmlld3BvcnQgY3JlYXRlZCBiYXNlZCBvbiBzY2FsZSwgcm90YXRpb24gYW5kIG9mZnNldC4KKyAqLworZXhwb3J0IGNsYXNzIFBhZ2VWaWV3cG9ydCB7CisgICAgLyoqCisgICAgICogQHBhcmFtIHtQYWdlVmlld3BvcnRQYXJhbWV0ZXJzfQorICAgICAqLworICAgIGNvbnN0cnVjdG9yKHsgdmlld0JveCwgc2NhbGUsIHJvdGF0aW9uLCBvZmZzZXRYLCBvZmZzZXRZLCBkb250RmxpcCwgfTogUGFnZVZpZXdwb3J0UGFyYW1ldGVycyk7CisgICAgdmlld0JveDogbnVtYmVyW107CisgICAgc2NhbGU6IG51bWJlcjsKKyAgICByb3RhdGlvbjogbnVtYmVyOworICAgIG9mZnNldFg6IG51bWJlcjsKKyAgICBvZmZzZXRZOiBudW1iZXI7CisgICAgdHJhbnNmb3JtOiBudW1iZXJbXTsKKyAgICB3aWR0aDogbnVtYmVyOworICAgIGhlaWdodDogbnVtYmVyOworICAgIC8qKgorICAgICAqIENsb25lcyB2aWV3cG9ydCwgd2l0aCBvcHRpb25hbCBhZGRpdGlvbmFsIHByb3BlcnRpZXMuCisgICAgICogQHBhcmFtIHtQYWdlVmlld3BvcnRDbG9uZVBhcmFtZXRlcnN9IFtwYXJhbXNdCisgICAgICogQHJldHVybnMge1BhZ2VWaWV3cG9ydH0gQ2xvbmVkIHZpZXdwb3J0LgorICAgICAqLworICAgIGNsb25lKHsgc2NhbGUsIHJvdGF0aW9uLCBvZmZzZXRYLCBvZmZzZXRZLCBkb250RmxpcCwgfT86IFBhZ2VWaWV3cG9ydENsb25lUGFyYW1ldGVycyB8IHVuZGVmaW5lZCk6IFBhZ2VWaWV3cG9ydDsKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBQREYgcG9pbnQgdG8gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLiBGb3IgZXhhbXBsZXMsIHVzZWZ1bCBmb3IKKyAgICAgKiBjb252ZXJ0aW5nIFBERiBsb2NhdGlvbiBpbnRvIGNhbnZhcyBwaXhlbCBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4LWNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBjb250YWluaW5nIGB4YCBhbmQgYHlgIHByb3BlcnRpZXMgb2YgdGhlCisgICAgICogICBwb2ludCBpbiB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZSBzcGFjZS4KKyAgICAgKiBAc2VlIHtAbGluayBjb252ZXJ0VG9QZGZQb2ludH0KKyAgICAgKiBAc2VlIHtAbGluayBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZX0KKyAgICAgKi8KKyAgICBjb252ZXJ0VG9WaWV3cG9ydFBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyKTogT2JqZWN0OworICAgIC8qKgorICAgICAqIENvbnZlcnRzIFBERiByZWN0YW5nbGUgdG8gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IHJlY3QgLSBUaGUgeE1pbiwgeU1pbiwgeE1heCBhbmQgeU1heCBjb29yZGluYXRlcy4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IGNvbnRhaW5pbmcgY29ycmVzcG9uZGluZyBjb29yZGluYXRlcyBvZiB0aGUKKyAgICAgKiAgIHJlY3RhbmdsZSBpbiB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZSBzcGFjZS4KKyAgICAgKiBAc2VlIHtAbGluayBjb252ZXJ0VG9WaWV3cG9ydFBvaW50fQorICAgICAqLworICAgIGNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlKHJlY3Q6IGFueVtdKTogYW55W107CisgICAgLyoqCisgICAgICogQ29udmVydHMgdmlld3BvcnQgY29vcmRpbmF0ZXMgdG8gdGhlIFBERiBsb2NhdGlvbi4gRm9yIGV4YW1wbGVzLCB1c2VmdWwKKyAgICAgKiBmb3IgY29udmVydGluZyBjYW52YXMgcGl4ZWwgbG9jYXRpb24gaW50byBQREYgb25lLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUuCisgICAgICogQHJldHVybnMge09iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgYHhgIGFuZCBgeWAgcHJvcGVydGllcyBvZiB0aGUKKyAgICAgKiAgIHBvaW50IGluIHRoZSBQREYgY29vcmRpbmF0ZSBzcGFjZS4KKyAgICAgKiBAc2VlIHtAbGluayBjb252ZXJ0VG9WaWV3cG9ydFBvaW50fQorICAgICAqLworICAgIGNvbnZlcnRUb1BkZlBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyKTogT2JqZWN0OworfQorZGVjbGFyZSBjb25zdCBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb25fYmFzZTogYW55OworZXhwb3J0IGNsYXNzIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiBleHRlbmRzIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbl9iYXNlIHsKKyAgICBbeDogc3RyaW5nXTogYW55OworICAgIGNvbnN0cnVjdG9yKG1zZzogYW55LCB0eXBlOiBhbnkpOworICAgIHR5cGU6IGFueTsKK30KKy8qKgorICogQHR5cGVkZWYgRXh0ZXJuYWxMaW5rUGFyYW1ldGVycworICogQHR5cGVkZWYge09iamVjdH0gRXh0ZXJuYWxMaW5rUGFyYW1ldGVycworICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCAtIEFuIGFic29sdXRlIFVSTC4KKyAqIEBwcm9wZXJ0eSB7TGlua1RhcmdldH0gW3RhcmdldF0gLSBUaGUgbGluayB0YXJnZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgKiAgIGBMaW5rVGFyZ2V0Lk5PTkVgLgorICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZWxdIC0gVGhlIGxpbmsgcmVsYXRpb25zaGlwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcworICogICBgREVGQVVMVF9MSU5LX1JFTGAuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVkXSAtIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGVuYWJsZWQuIFRoZQorICogICBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgKi8KKy8qKgorICogQWRkcyB2YXJpb3VzIGF0dHJpYnV0ZXMgKGhyZWYsIHRpdGxlLCB0YXJnZXQsIHJlbCkgdG8gaHlwZXJsaW5rcy4KKyAqIEBwYXJhbSB7SFRNTExpbmtFbGVtZW50fSBsaW5rIC0gVGhlIGxpbmsgZWxlbWVudC4KKyAqIEBwYXJhbSB7RXh0ZXJuYWxMaW5rUGFyYW1ldGVyc30gcGFyYW1zCisgKi8KK2V4cG9ydCBmdW5jdGlvbiBhZGRMaW5rQXR0cmlidXRlcyhsaW5rOiBIVE1MTGlua0VsZW1lbnQsIHsgdXJsLCB0YXJnZXQsIHJlbCwgZW5hYmxlZCB9PzogYW55KTogdm9pZDsKKy8qKgorICogR2V0cyB0aGUgZmlsZSBuYW1lIGZyb20gYSBnaXZlbiBVUkwuCisgKiBAcGFyYW0ge3N0cmluZ30gdXJsCisgKi8KK2V4cG9ydCBmdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmc7CitleHBvcnQgbmFtZXNwYWNlIExpbmtUYXJnZXQgeworICAgIGV4cG9ydCBjb25zdCBOT05FOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFNFTEY6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgQkxBTks6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgUEFSRU5UOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFRPUDogbnVtYmVyOworfQorZXhwb3J0IGNvbnN0IERFRkFVTFRfTElOS19SRUw6ICJub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93IjsKK2V4cG9ydCBjbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7CisgICAgY3JlYXRlKHdpZHRoOiBhbnksIGhlaWdodDogYW55KTogdm9pZDsKKyAgICByZXNldChjYW52YXNBbmRDb250ZXh0OiBhbnksIHdpZHRoOiBhbnksIGhlaWdodDogYW55KTogdm9pZDsKKyAgICBkZXN0cm95KGNhbnZhc0FuZENvbnRleHQ6IGFueSk6IHZvaWQ7Cit9CitleHBvcnQgY2xhc3MgRE9NQ2FudmFzRmFjdG9yeSBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHsKKyAgICBjb25zdHJ1Y3Rvcih7IG93bmVyRG9jdW1lbnQgfT86IHsKKyAgICAgICAgb3duZXJEb2N1bWVudD86IERvY3VtZW50IHwgdW5kZWZpbmVkOworICAgIH0pOworICAgIF9kb2N1bWVudDogRG9jdW1lbnQ7Cit9CitleHBvcnQgY2xhc3MgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHsKKyAgICBjb25zdHJ1Y3Rvcih7IGJhc2VVcmwsIGlzQ29tcHJlc3NlZCB9OiB7CisgICAgICAgIGJhc2VVcmw/OiBhbnk7CisgICAgICAgIGlzQ29tcHJlc3NlZD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7CisgICAgfSk7CisgICAgYmFzZVVybDogYW55OworICAgIGlzQ29tcHJlc3NlZDogYm9vbGVhbjsKKyAgICBmZXRjaCh7IG5hbWUgfTogeworICAgICAgICBuYW1lOiBhbnk7CisgICAgfSk6IFByb21pc2U8YW55PjsKKyAgICAvKioKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHByaXZhdGUgX2ZldGNoRGF0YTsKK30KK2V4cG9ydCBjbGFzcyBET01DTWFwUmVhZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7CisgICAgY29uc3RydWN0b3IoeyBiYXNlVXJsLCBpc0NvbXByZXNzZWQgfTogeworICAgICAgICBiYXNlVXJsPzogYW55OworICAgICAgICBpc0NvbXByZXNzZWQ/OiBib29sZWFuIHwgdW5kZWZpbmVkOworICAgIH0pOworfQorZXhwb3J0IGNsYXNzIERPTVNWR0ZhY3RvcnkgeworICAgIGNyZWF0ZSh3aWR0aDogYW55LCBoZWlnaHQ6IGFueSk6IFNWR0VsZW1lbnQ7CisgICAgY3JlYXRlRWxlbWVudCh0eXBlOiBhbnkpOiBhbnk7Cit9CitleHBvcnQgY2xhc3MgU3RhdFRpbWVyIHsKKyAgICBzdGFydGVkOiBhbnk7CisgICAgdGltZXM6IGFueVtdOworICAgIHRpbWUobmFtZTogYW55KTogdm9pZDsKKyAgICB0aW1lRW5kKG5hbWU6IGFueSk6IHZvaWQ7CisgICAgdG9TdHJpbmcoKTogc3RyaW5nOworfQorZXhwb3J0IGZ1bmN0aW9uIGlzRmV0Y2hTdXBwb3J0ZWQoKTogYm9vbGVhbjsKK2V4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodXJsOiBhbnksIGJhc2VVcmw6IGFueSk6IGJvb2xlYW47CisvKioKKyAqIEBwYXJhbSB7c3RyaW5nfSBzcmMKKyAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fQorICovCitleHBvcnQgZnVuY3Rpb24gbG9hZFNjcmlwdChzcmM6IHN0cmluZyk6IFByb21pc2U8dm9pZD47CitleHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlZChkZXRhaWxzOiBhbnkpOiB2b2lkOworZXhwb3J0IGNsYXNzIFBERkRhdGVTdHJpbmcgeworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBQREYgZGF0ZSBzdHJpbmcgdG8gYSBKYXZhU2NyaXB0IGBEYXRlYCBvYmplY3QuCisgICAgICoKKyAgICAgKiBUaGUgUERGIGRhdGUgc3RyaW5nIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA3LjkuNCBvZiB0aGUgb2ZmaWNpYWwKKyAgICAgKiBQREYgMzIwMDAtMToyMDA4IHNwZWNpZmljYXRpb24uIEhvd2V2ZXIsIGluIHRoZSBQREYgMS43IHJlZmVyZW5jZSAoc2l4dGgKKyAgICAgKiBlZGl0aW9uKSBBZG9iZSBkZXNjcmliZXMgdGhlIHNhbWUgZm9ybWF0IGluY2x1ZGluZyBhIHRyYWlsaW5nIGFwb3N0cm9waGUuCisgICAgICogVGhpcyBzeW50YXggaW4gaW5jb3JyZWN0LCBidXQgQWRvYmUgQWNyb2JhdCBjcmVhdGVzIFBERiBmaWxlcyB0aGF0IGNvbnRhaW4KKyAgICAgKiB0aGVtLiBXZSBpZ25vcmUgYWxsIGFwb3N0cm9waGVzIGFzIHRoZXkgYXJlIG5vdCBuZWNlc3NhcnkgZm9yIGRhdGUgcGFyc2luZy4KKyAgICAgKgorICAgICAqIE1vcmVvdmVyLCBBZG9iZSBBY3JvYmF0IGRvZXNuJ3QgaGFuZGxlIGNoYW5naW5nIHRoZSBkYXRlIHRvIHVuaXZlcnNhbCB0aW1lCisgICAgICogYW5kIGRvZXNuJ3QgdXNlIHRoZSB1c2VyJ3MgdGltZSB6b25lIChlZmZlY3RpdmVseSBpZ25vcmluZyB0aGUgSEgnIGFuZCBtbScKKyAgICAgKiBwYXJ0cyBvZiB0aGUgZGF0ZSBzdHJpbmcpLgorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0CisgICAgICogQHJldHVybnMge0RhdGV8bnVsbH0KKyAgICAgKi8KKyAgICBzdGF0aWMgdG9EYXRlT2JqZWN0KGlucHV0OiBzdHJpbmcpOiBEYXRlIHwgbnVsbDsKK30KK2V4cG9ydCB7fTsKZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmQudHMgYi90eXBlcy9kaXNwbGF5L2ZldGNoX3N0cmVhbS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NjY3NTQKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlcy9kaXNwbGF5L2ZldGNoX3N0cmVhbS5kLnRzCkBAIC0wLDAgKzEsNjcgQEAKKy8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbX0gKi8KK2V4cG9ydCBjbGFzcyBQREZGZXRjaFN0cmVhbSB7CisgICAgY29uc3RydWN0b3Ioc291cmNlOiBhbnkpOworICAgIHNvdXJjZTogYW55OworICAgIGlzSHR0cDogYm9vbGVhbjsKKyAgICBodHRwSGVhZGVyczogYW55OworICAgIF9mdWxsUmVxdWVzdFJlYWRlcjogUERGRmV0Y2hTdHJlYW1SZWFkZXIgfCBudWxsOworICAgIF9yYW5nZVJlcXVlc3RSZWFkZXJzOiBhbnlbXTsKKyAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpOiBudW1iZXI7CisgICAgZ2V0RnVsbFJlYWRlcigpOiBQREZGZXRjaFN0cmVhbVJlYWRlcjsKKyAgICBnZXRSYW5nZVJlYWRlcihiZWdpbjogYW55LCBlbmQ6IGFueSk6IFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXIgfCBudWxsOworICAgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbjogYW55KTogdm9pZDsKK30KKy8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbVJlYWRlcn0gKi8KK2RlY2xhcmUgY2xhc3MgUERGRmV0Y2hTdHJlYW1SZWFkZXIgeworICAgIGNvbnN0cnVjdG9yKHN0cmVhbTogYW55KTsKKyAgICBfc3RyZWFtOiBhbnk7CisgICAgX3JlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+IHwgbnVsbDsKKyAgICBfbG9hZGVkOiBudW1iZXI7CisgICAgX2ZpbGVuYW1lOiBzdHJpbmcgfCBudWxsOworICAgIF93aXRoQ3JlZGVudGlhbHM6IGFueTsKKyAgICBfY29udGVudExlbmd0aDogYW55OworICAgIF9oZWFkZXJzQ2FwYWJpbGl0eTogaW1wb3J0KCIuLi9zaGFyZWQvdXRpbC5qcyIpLlByb21pc2VDYXBhYmlsaXR5OworICAgIF9kaXNhYmxlUmFuZ2U6IGFueTsKKyAgICBfcmFuZ2VDaHVua1NpemU6IGFueTsKKyAgICBfYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7CisgICAgX2lzU3RyZWFtaW5nU3VwcG9ydGVkOiBib29sZWFuOworICAgIF9pc1JhbmdlU3VwcG9ydGVkOiBib29sZWFuOworICAgIF9oZWFkZXJzOiBIZWFkZXJzOworICAgIG9uUHJvZ3Jlc3M6IGFueTsKKyAgICBnZXQgaGVhZGVyc1JlYWR5KCk6IFByb21pc2U8YW55PjsKKyAgICBnZXQgZmlsZW5hbWUoKTogc3RyaW5nIHwgbnVsbDsKKyAgICBnZXQgY29udGVudExlbmd0aCgpOiBhbnk7CisgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKTogYm9vbGVhbjsKKyAgICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKTogYm9vbGVhbjsKKyAgICByZWFkKCk6IFByb21pc2U8eworICAgICAgICB2YWx1ZTogVWludDhBcnJheSB8IHVuZGVmaW5lZDsKKyAgICAgICAgZG9uZTogdHJ1ZTsKKyAgICB9IHwgeworICAgICAgICB2YWx1ZTogQXJyYXlCdWZmZXJMaWtlOworICAgICAgICBkb25lOiBib29sZWFuOworICAgIH0+OworICAgIGNhbmNlbChyZWFzb246IGFueSk6IHZvaWQ7Cit9CisvKiogQGltcGxlbWVudHMge0lQREZTdHJlYW1SYW5nZVJlYWRlcn0gKi8KK2RlY2xhcmUgY2xhc3MgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlciB7CisgICAgY29uc3RydWN0b3Ioc3RyZWFtOiBhbnksIGJlZ2luOiBhbnksIGVuZDogYW55KTsKKyAgICBfc3RyZWFtOiBhbnk7CisgICAgX3JlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+IHwgbnVsbDsKKyAgICBfbG9hZGVkOiBudW1iZXI7CisgICAgX3dpdGhDcmVkZW50aWFsczogYW55OworICAgIF9yZWFkQ2FwYWJpbGl0eTogaW1wb3J0KCIuLi9zaGFyZWQvdXRpbC5qcyIpLlByb21pc2VDYXBhYmlsaXR5OworICAgIF9pc1N0cmVhbWluZ1N1cHBvcnRlZDogYm9vbGVhbjsKKyAgICBfYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7CisgICAgX2hlYWRlcnM6IEhlYWRlcnM7CisgICAgb25Qcm9ncmVzczogYW55OworICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpOiBib29sZWFuOworICAgIHJlYWQoKTogUHJvbWlzZTx7CisgICAgICAgIHZhbHVlOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkOworICAgICAgICBkb25lOiB0cnVlOworICAgIH0gfCB7CisgICAgICAgIHZhbHVlOiBBcnJheUJ1ZmZlckxpa2U7CisgICAgICAgIGRvbmU6IGJvb2xlYW47CisgICAgfT47CisgICAgY2FuY2VsKHJlYXNvbjogYW55KTogdm9pZDsKK30KK2V4cG9ydCB7fTsKZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvZm9udF9sb2FkZXIuZC50cyBiL3R5cGVzL2Rpc3BsYXkvZm9udF9sb2FkZXIuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGJiMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS9mb250X2xvYWRlci5kLnRzCkBAIC0wLDAgKzEsMTkgQEAKK2V4cG9ydCBjbGFzcyBGb250RmFjZU9iamVjdCB7CisgICAgY29uc3RydWN0b3IodHJhbnNsYXRlZERhdGE6IGFueSwgeyBpc0V2YWxTdXBwb3J0ZWQsIGRpc2FibGVGb250RmFjZSwgaWdub3JlRXJyb3JzLCBvblVuc3VwcG9ydGVkRmVhdHVyZSwgZm9udFJlZ2lzdHJ5LCB9OiB7CisgICAgICAgIGlzRXZhbFN1cHBvcnRlZD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7CisgICAgICAgIGRpc2FibGVGb250RmFjZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7CisgICAgICAgIGlnbm9yZUVycm9ycz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7CisgICAgICAgIG9uVW5zdXBwb3J0ZWRGZWF0dXJlPzogYW55OworICAgICAgICBmb250UmVnaXN0cnk/OiBhbnk7CisgICAgfSk7CisgICAgY29tcGlsZWRHbHlwaHM6IGFueTsKKyAgICBpc0V2YWxTdXBwb3J0ZWQ6IGJvb2xlYW47CisgICAgZGlzYWJsZUZvbnRGYWNlOiBib29sZWFuOworICAgIGlnbm9yZUVycm9yczogYm9vbGVhbjsKKyAgICBfb25VbnN1cHBvcnRlZEZlYXR1cmU6IGFueTsKKyAgICBmb250UmVnaXN0cnk6IGFueTsKKyAgICBjcmVhdGVOYXRpdmVGb250RmFjZSgpOiBhbnk7CisgICAgY3JlYXRlRm9udEZhY2VSdWxlKCk6IHN0cmluZyB8IG51bGw7CisgICAgZ2V0UGF0aEdlbmVyYXRvcihvYmpzOiBhbnksIGNoYXJhY3RlcjogYW55KTogYW55OworfQorZXhwb3J0IGxldCBGb250TG9hZGVyOiBhbnk7CmRpZmYgLS1naXQgYS90eXBlcy9kaXNwbGF5L21ldGFkYXRhLmQudHMgYi90eXBlcy9kaXNwbGF5L21ldGFkYXRhLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkOTY2MAotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVzL2Rpc3BsYXkvbWV0YWRhdGEuZC50cwpAQCAtMCwwICsxLDkgQEAKK2V4cG9ydCBjbGFzcyBNZXRhZGF0YSB7CisgICAgY29uc3RydWN0b3IoZGF0YTogYW55KTsKKyAgICBfbWV0YWRhdGFNYXA6IE1hcDxhbnksIGFueT47CisgICAgX3JlcGFpcihkYXRhOiBhbnkpOiBhbnk7CisgICAgX3BhcnNlKHhtbERvY3VtZW50OiBhbnkpOiB2b2lkOworICAgIGdldChuYW1lOiBhbnkpOiBhbnk7CisgICAgZ2V0QWxsKCk6IGFueTsKKyAgICBoYXMobmFtZTogYW55KTogYm9vbGVhbjsKK30KZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvbmV0d29yay5kLnRzIGIvdHlwZXMvZGlzcGxheS9uZXR3b3JrLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI2ODM1NQotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVzL2Rpc3BsYXkvbmV0d29yay5kLnRzCkBAIC0wLDAgKzEsODAgQEAKKy8qKiBAaW1wbGVtZW50cyB7SVBERlN0cmVhbX0gKi8KK2V4cG9ydCBjbGFzcyBQREZOZXR3b3JrU3RyZWFtIHsKKyAgICBjb25zdHJ1Y3Rvcihzb3VyY2U6IGFueSk7CisgICAgX3NvdXJjZTogYW55OworICAgIF9tYW5hZ2VyOiBOZXR3b3JrTWFuYWdlcjsKKyAgICBfcmFuZ2VDaHVua1NpemU6IGFueTsKKyAgICBfZnVsbFJlcXVlc3RSZWFkZXI6IFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlciB8IG51bGw7CisgICAgX3JhbmdlUmVxdWVzdFJlYWRlcnM6IGFueVtdOworICAgIF9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZChyZWFkZXI6IGFueSk6IHZvaWQ7CisgICAgZ2V0RnVsbFJlYWRlcigpOiBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXI7CisgICAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW46IGFueSwgZW5kOiBhbnkpOiBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyOworICAgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbjogYW55KTogdm9pZDsKK30KK2RlY2xhcmUgY2xhc3MgTmV0d29ya01hbmFnZXIgeworICAgIGNvbnN0cnVjdG9yKHVybDogYW55LCBhcmdzOiBhbnkpOworICAgIHVybDogYW55OworICAgIGlzSHR0cDogYm9vbGVhbjsKKyAgICBodHRwSGVhZGVyczogYW55OworICAgIHdpdGhDcmVkZW50aWFsczogYW55OworICAgIGdldFhocjogYW55OworICAgIGN1cnJYaHJJZDogbnVtYmVyOworICAgIHBlbmRpbmdSZXF1ZXN0czogYW55OworICAgIHJlcXVlc3RSYW5nZShiZWdpbjogYW55LCBlbmQ6IGFueSwgbGlzdGVuZXJzOiBhbnkpOiBudW1iZXI7CisgICAgcmVxdWVzdEZ1bGwobGlzdGVuZXJzOiBhbnkpOiBudW1iZXI7CisgICAgcmVxdWVzdChhcmdzOiBhbnkpOiBudW1iZXI7CisgICAgb25Qcm9ncmVzcyh4aHJJZDogYW55LCBldnQ6IGFueSk6IHZvaWQ7CisgICAgb25TdGF0ZUNoYW5nZSh4aHJJZDogYW55LCBldnQ6IGFueSk6IHZvaWQ7CisgICAgZ2V0UmVxdWVzdFhocih4aHJJZDogYW55KTogYW55OworICAgIGlzUGVuZGluZ1JlcXVlc3QoeGhySWQ6IGFueSk6IGJvb2xlYW47CisgICAgYWJvcnRSZXF1ZXN0KHhocklkOiBhbnkpOiB2b2lkOworfQorLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmVhZGVyfSAqLworZGVjbGFyZSBjbGFzcyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIgeworICAgIGNvbnN0cnVjdG9yKG1hbmFnZXI6IGFueSwgc291cmNlOiBhbnkpOworICAgIF9tYW5hZ2VyOiBhbnk7CisgICAgX3VybDogYW55OworICAgIF9mdWxsUmVxdWVzdElkOiBhbnk7CisgICAgX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHk6IGltcG9ydCgiLi4vc2hhcmVkL3V0aWwuanMiKS5Qcm9taXNlQ2FwYWJpbGl0eTsKKyAgICBfZGlzYWJsZVJhbmdlOiBhbnk7CisgICAgX2NvbnRlbnRMZW5ndGg6IGFueTsKKyAgICBfcmFuZ2VDaHVua1NpemU6IGFueTsKKyAgICBfaXNTdHJlYW1pbmdTdXBwb3J0ZWQ6IGJvb2xlYW47CisgICAgX2lzUmFuZ2VTdXBwb3J0ZWQ6IGJvb2xlYW47CisgICAgX2NhY2hlZENodW5rczogYW55W107CisgICAgX3JlcXVlc3RzOiBhbnlbXTsKKyAgICBfZG9uZTogYm9vbGVhbjsKKyAgICBfc3RvcmVkRXJyb3I6IGltcG9ydCgiLi4vc2hhcmVkL3V0aWwuanMiKS5NaXNzaW5nUERGRXhjZXB0aW9uIHwgaW1wb3J0KCIuLi9zaGFyZWQvdXRpbC5qcyIpLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiB8IHVuZGVmaW5lZDsKKyAgICBfZmlsZW5hbWU6IHN0cmluZyB8IG51bGw7CisgICAgb25Qcm9ncmVzczogYW55OworICAgIF9vbkhlYWRlcnNSZWNlaXZlZCgpOiB2b2lkOworICAgIF9vbkRvbmUoYXJnczogYW55KTogdm9pZDsKKyAgICBfb25FcnJvcihzdGF0dXM6IGFueSk6IHZvaWQ7CisgICAgX29uUHJvZ3Jlc3MoZGF0YTogYW55KTogdm9pZDsKKyAgICBnZXQgZmlsZW5hbWUoKTogc3RyaW5nIHwgbnVsbDsKKyAgICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpOiBib29sZWFuOworICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpOiBib29sZWFuOworICAgIGdldCBjb250ZW50TGVuZ3RoKCk6IGFueTsKKyAgICBnZXQgaGVhZGVyc1JlYWR5KCk6IFByb21pc2U8YW55PjsKKyAgICByZWFkKCk6IFByb21pc2U8YW55PjsKKyAgICBjYW5jZWwocmVhc29uOiBhbnkpOiB2b2lkOworICAgIF9mdWxsUmVxdWVzdFJlYWRlcjogYW55OworfQorLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmFuZ2VSZWFkZXJ9ICovCitkZWNsYXJlIGNsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIgeworICAgIGNvbnN0cnVjdG9yKG1hbmFnZXI6IGFueSwgYmVnaW46IGFueSwgZW5kOiBhbnkpOworICAgIF9tYW5hZ2VyOiBhbnk7CisgICAgX3JlcXVlc3RJZDogYW55OworICAgIF9yZXF1ZXN0czogYW55W107CisgICAgX3F1ZXVlZENodW5rOiBhbnk7CisgICAgX2RvbmU6IGJvb2xlYW47CisgICAgb25Qcm9ncmVzczogYW55OworICAgIG9uQ2xvc2VkOiBhbnk7CisgICAgX2Nsb3NlKCk6IHZvaWQ7CisgICAgX29uRG9uZShkYXRhOiBhbnkpOiB2b2lkOworICAgIF9vblByb2dyZXNzKGV2dDogYW55KTogdm9pZDsKKyAgICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKTogYm9vbGVhbjsKKyAgICByZWFkKCk6IFByb21pc2U8YW55PjsKKyAgICBjYW5jZWwocmVhc29uOiBhbnkpOiB2b2lkOworfQorZXhwb3J0IHt9OwpkaWZmIC0tZ2l0IGEvdHlwZXMvZGlzcGxheS9uZXR3b3JrX3V0aWxzLmQudHMgYi90eXBlcy9kaXNwbGF5L25ldHdvcmtfdXRpbHMuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FmZWFkCi0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS9uZXR3b3JrX3V0aWxzLmQudHMKQEAgLTAsMCArMSwxNCBAQAorZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzOiBhbnksIHVybDogYW55KTogTWlzc2luZ1BERkV4Y2VwdGlvbiB8IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjsKK2V4cG9ydCBmdW5jdGlvbiBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyOiBhbnkpOiBzdHJpbmcgfCBudWxsOworZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHsgZ2V0UmVzcG9uc2VIZWFkZXIsIGlzSHR0cCwgcmFuZ2VDaHVua1NpemUsIGRpc2FibGVSYW5nZSwgfTogeworICAgIGdldFJlc3BvbnNlSGVhZGVyOiBhbnk7CisgICAgaXNIdHRwOiBhbnk7CisgICAgcmFuZ2VDaHVua1NpemU6IGFueTsKKyAgICBkaXNhYmxlUmFuZ2U6IGFueTsKK30pOiB7CisgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiBib29sZWFuOworICAgIHN1Z2dlc3RlZExlbmd0aDogdW5kZWZpbmVkOworfTsKK2V4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHN0YXR1czogYW55KTogYm9vbGVhbjsKK2ltcG9ydCB7IE1pc3NpbmdQREZFeGNlcHRpb24gfSBmcm9tICIuLi9zaGFyZWQvdXRpbC5qcyI7CitpbXBvcnQgeyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gfSBmcm9tICIuLi9zaGFyZWQvdXRpbC5qcyI7CmRpZmYgLS1naXQgYS90eXBlcy9kaXNwbGF5L25vZGVfc3RyZWFtLmQudHMgYi90eXBlcy9kaXNwbGF5L25vZGVfc3RyZWFtLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjZTIwNwotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVzL2Rpc3BsYXkvbm9kZV9zdHJlYW0uZC50cwpAQCAtMCwwICsxLDcyIEBACitleHBvcnQgY2xhc3MgUERGTm9kZVN0cmVhbSB7CisgICAgY29uc3RydWN0b3Ioc291cmNlOiBhbnkpOworICAgIHNvdXJjZTogYW55OworICAgIHVybDogYW55OworICAgIGlzSHR0cDogYm9vbGVhbjsKKyAgICBpc0ZzVXJsOiBib29sZWFuOworICAgIGh0dHBIZWFkZXJzOiBhbnk7CisgICAgX2Z1bGxSZXF1ZXN0UmVhZGVyOiBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyIHwgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIgfCBudWxsOworICAgIF9yYW5nZVJlcXVlc3RSZWFkZXJzOiBhbnlbXTsKKyAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpOiBudW1iZXI7CisgICAgZ2V0RnVsbFJlYWRlcigpOiBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyIHwgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXI7CisgICAgZ2V0UmFuZ2VSZWFkZXIoc3RhcnQ6IGFueSwgZW5kOiBhbnkpOiBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlciB8IFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlciB8IG51bGw7CisgICAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uOiBhbnkpOiB2b2lkOworfQorZGVjbGFyZSBjbGFzcyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIgeworICAgIGNvbnN0cnVjdG9yKHN0cmVhbTogYW55KTsKK30KK2RlY2xhcmUgY2xhc3MgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7CisgICAgY29uc3RydWN0b3Ioc3RyZWFtOiBhbnkpOworICAgIF9yZXF1ZXN0OiBhbnk7Cit9CitkZWNsYXJlIGNsYXNzIFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVyIHsKKyAgICBjb25zdHJ1Y3RvcihzdHJlYW06IGFueSwgc3RhcnQ6IGFueSwgZW5kOiBhbnkpOworfQorZGVjbGFyZSBjbGFzcyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIgeworICAgIGNvbnN0cnVjdG9yKHN0cmVhbTogYW55LCBzdGFydDogYW55LCBlbmQ6IGFueSk7CisgICAgX2h0dHBIZWFkZXJzOiB7fTsKKyAgICBfcmVxdWVzdDogYW55OworfQorZGVjbGFyZSBjbGFzcyBCYXNlRnVsbFJlYWRlciB7CisgICAgY29uc3RydWN0b3Ioc3RyZWFtOiBhbnkpOworICAgIF91cmw6IGFueTsKKyAgICBfZG9uZTogYm9vbGVhbjsKKyAgICBfc3RvcmVkRXJyb3I6IGFueTsKKyAgICBvblByb2dyZXNzOiBhbnk7CisgICAgX2NvbnRlbnRMZW5ndGg6IGFueTsKKyAgICBfbG9hZGVkOiBudW1iZXI7CisgICAgX2ZpbGVuYW1lOiBhbnk7CisgICAgX2Rpc2FibGVSYW5nZTogYW55OworICAgIF9yYW5nZUNodW5rU2l6ZTogYW55OworICAgIF9pc1N0cmVhbWluZ1N1cHBvcnRlZDogYm9vbGVhbjsKKyAgICBfaXNSYW5nZVN1cHBvcnRlZDogYm9vbGVhbjsKKyAgICBfcmVhZGFibGVTdHJlYW06IGFueTsKKyAgICBfcmVhZENhcGFiaWxpdHk6IGltcG9ydCgiLi4vc2hhcmVkL3V0aWwuanMiKS5Qcm9taXNlQ2FwYWJpbGl0eTsKKyAgICBfaGVhZGVyc0NhcGFiaWxpdHk6IGltcG9ydCgiLi4vc2hhcmVkL3V0aWwuanMiKS5Qcm9taXNlQ2FwYWJpbGl0eTsKKyAgICBnZXQgaGVhZGVyc1JlYWR5KCk6IFByb21pc2U8YW55PjsKKyAgICBnZXQgZmlsZW5hbWUoKTogYW55OworICAgIGdldCBjb250ZW50TGVuZ3RoKCk6IGFueTsKKyAgICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpOiBib29sZWFuOworICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpOiBib29sZWFuOworICAgIHJlYWQoKTogYW55OworICAgIGNhbmNlbChyZWFzb246IGFueSk6IHZvaWQ7CisgICAgX2Vycm9yKHJlYXNvbjogYW55KTogdm9pZDsKKyAgICBfc2V0UmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW06IGFueSk6IHZvaWQ7Cit9CitkZWNsYXJlIGNsYXNzIEJhc2VSYW5nZVJlYWRlciB7CisgICAgY29uc3RydWN0b3Ioc3RyZWFtOiBhbnkpOworICAgIF91cmw6IGFueTsKKyAgICBfZG9uZTogYm9vbGVhbjsKKyAgICBfc3RvcmVkRXJyb3I6IGFueTsKKyAgICBvblByb2dyZXNzOiBhbnk7CisgICAgX2xvYWRlZDogbnVtYmVyOworICAgIF9yZWFkYWJsZVN0cmVhbTogYW55OworICAgIF9yZWFkQ2FwYWJpbGl0eTogaW1wb3J0KCIuLi9zaGFyZWQvdXRpbC5qcyIpLlByb21pc2VDYXBhYmlsaXR5OworICAgIF9pc1N0cmVhbWluZ1N1cHBvcnRlZDogYm9vbGVhbjsKKyAgICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKTogYm9vbGVhbjsKKyAgICByZWFkKCk6IGFueTsKKyAgICBjYW5jZWwocmVhc29uOiBhbnkpOiB2b2lkOworICAgIF9lcnJvcihyZWFzb246IGFueSk6IHZvaWQ7CisgICAgX3NldFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtOiBhbnkpOiB2b2lkOworfQorZXhwb3J0IHt9OwpkaWZmIC0tZ2l0IGEvdHlwZXMvZGlzcGxheS9ub2RlX3V0aWxzLmQudHMgYi90eXBlcy9kaXNwbGF5L25vZGVfdXRpbHMuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQyNDQxCi0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS9ub2RlX3V0aWxzLmQudHMKQEAgLTAsMCArMSw2IEBACitleHBvcnQgbGV0IE5vZGVDYW52YXNGYWN0b3J5OiB7CisgICAgbmV3ICgpOiB7fTsKK307CitleHBvcnQgbGV0IE5vZGVDTWFwUmVhZGVyRmFjdG9yeTogeworICAgIG5ldyAoKToge307Cit9OwpkaWZmIC0tZ2l0IGEvdHlwZXMvZGlzcGxheS9vcHRpb25hbF9jb250ZW50X2NvbmZpZy5kLnRzIGIvdHlwZXMvZGlzcGxheS9vcHRpb25hbF9jb250ZW50X2NvbmZpZy5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmODBmNDIKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlcy9kaXNwbGF5L29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLmQudHMKQEAgLTAsMCArMSwxMiBAQAorZXhwb3J0IGNsYXNzIE9wdGlvbmFsQ29udGVudENvbmZpZyB7CisgICAgY29uc3RydWN0b3IoZGF0YTogYW55KTsKKyAgICBuYW1lOiBhbnk7CisgICAgY3JlYXRvcjogYW55OworICAgIF9vcmRlcjogYW55OworICAgIF9ncm91cHM6IE1hcDxhbnksIGFueT47CisgICAgaXNWaXNpYmxlKGdyb3VwOiBhbnkpOiBhbnk7CisgICAgc2V0VmlzaWJpbGl0eShpZDogYW55LCB2aXNpYmxlPzogYm9vbGVhbik6IHZvaWQ7CisgICAgZ2V0T3JkZXIoKTogYW55OworICAgIGdldEdyb3VwcygpOiBhbnk7CisgICAgZ2V0R3JvdXAoaWQ6IGFueSk6IGFueTsKK30KZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvcGF0dGVybl9oZWxwZXIuZC50cyBiL3R5cGVzL2Rpc3BsYXkvcGF0dGVybl9oZWxwZXIuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg3NGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS9wYXR0ZXJuX2hlbHBlci5kLnRzCkBAIC0wLDAgKzEsNSBAQAorZXhwb3J0IGZ1bmN0aW9uIGdldFNoYWRpbmdQYXR0ZXJuRnJvbUlSKHJhdzogYW55KTogYW55OworLyoqCisgKiBAdHlwZSB7YW55fQorICovCitleHBvcnQgdmFyIFRpbGluZ1BhdHRlcm46IGFueTsKZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvc3ZnLmQudHMgYi90eXBlcy9kaXNwbGF5L3N2Zy5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDlkZmQKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlcy9kaXNwbGF5L3N2Zy5kLnRzCkBAIC0wLDAgKzEsMiBAQAorLyoqIEB0eXBlIHthbnl9ICovCitleHBvcnQgbGV0IFNWR0dyYXBoaWNzOiBhbnk7CmRpZmYgLS1naXQgYS90eXBlcy9kaXNwbGF5L3RleHRfbGF5ZXIuZC50cyBiL3R5cGVzL2Rpc3BsYXkvdGV4dF9sYXllci5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTJiNDYKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlcy9kaXNwbGF5L3RleHRfbGF5ZXIuZC50cwpAQCAtMCwwICsxLDgzIEBACisvKioKKyAqIFRleHQgbGF5ZXIgcmVuZGVyIHBhcmFtZXRlcnMuCisgKi8KK2V4cG9ydCB0eXBlIFRleHRMYXllclJlbmRlclBhcmFtZXRlcnMgPSB7CisgICAgLyoqCisgICAgICogLSBUZXh0IGNvbnRlbnQgdG8KKyAgICAgKiByZW5kZXIgKHRoZSBvYmplY3QgaXMgcmV0dXJuZWQgYnkgdGhlIHBhZ2UncyBgZ2V0VGV4dENvbnRlbnRgIG1ldGhvZCkuCisgICAgICovCisgICAgdGV4dENvbnRlbnQ/OiBpbXBvcnQoIi4vYXBpIikuVGV4dENvbnRlbnQ7CisgICAgLyoqCisgICAgICogLSBUZXh0IGNvbnRlbnQgc3RyZWFtIHRvCisgICAgICogcmVuZGVyICh0aGUgc3RyZWFtIGlzIHJldHVybmVkIGJ5IHRoZSBwYWdlJ3MgYHN0cmVhbVRleHRDb250ZW50YCBtZXRob2QpLgorICAgICAqLworICAgIHRleHRDb250ZW50U3RyZWFtPzogUmVhZGFibGVTdHJlYW07CisgICAgLyoqCisgICAgICogLSBIVE1MIGVsZW1lbnQgdGhhdCB3aWxsIGNvbnRhaW4gdGV4dCBydW5zLgorICAgICAqLworICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7CisgICAgLyoqCisgICAgICogLSBUaGUgdGFyZ2V0CisgICAgICogdmlld3BvcnQgdG8gcHJvcGVybHkgbGF5b3V0IHRoZSB0ZXh0IHJ1bnMuCisgICAgICovCisgICAgdmlld3BvcnQ6IGltcG9ydCgiLi9kaXNwbGF5X3V0aWxzIikuUGFnZVZpZXdwb3J0OworICAgIC8qKgorICAgICAqIC0gSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBjb3JyZXNwb25kCisgICAgICogdG8gdGhlIHRleHQgaXRlbXMgb2YgdGhlIHRleHRDb250ZW50IGlucHV0LiBUaGlzIGlzIG91dHB1dCBhbmQgc2hhbGwgYmUKKyAgICAgKiBpbml0aWFsbHkgYmUgc2V0IHRvIGVtcHR5IGFycmF5LgorICAgICAqLworICAgIHRleHREaXZzPzogQXJyYXk8SFRNTEVsZW1lbnQ+OworICAgIC8qKgorICAgICAqIC0gU3RyaW5ncyB0aGF0IGNvcnJlc3BvbmQgdG8KKyAgICAgKiB0aGUgYHN0cmAgcHJvcGVydHkgb2YgdGhlIHRleHQgaXRlbXMgb2YgdGV4dENvbnRlbnQgaW5wdXQuIFRoaXMgaXMgb3V0cHV0CisgICAgICogYW5kIHNoYWxsIGJlIGluaXRpYWxseSBiZSBzZXQgdG8gZW1wdHkgYXJyYXkuCisgICAgICovCisgICAgdGV4dENvbnRlbnRJdGVtc1N0cj86IEFycmF5PHN0cmluZz47CisgICAgLyoqCisgICAgICogLSBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHJlbmRlcmluZyBvZiB0aGUKKyAgICAgKiB0ZXh0IHJ1bnMgb2NjdXJzLgorICAgICAqLworICAgIHRpbWVvdXQ/OiBudW1iZXI7CisgICAgLyoqCisgICAgICogLSBXaGV0aGVyIHRvIHR1cm4gb24gdGhlIHRleHQKKyAgICAgKiBzZWxlY3Rpb24gZW5oYW5jZW1lbnQuCisgICAgICovCisgICAgZW5oYW5jZVRleHRTZWxlY3Rpb24/OiBib29sZWFuOworfTsKK2V4cG9ydCB0eXBlIFRleHRMYXllclJlbmRlclRhc2sgPSB7CisgICAgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjsKKyAgICBjYW5jZWw6ICgpID0+IHZvaWQ7CisgICAgZXhwYW5kVGV4dERpdnM6IChleHBhbmREaXZzOiBib29sZWFuKSA9PiB2b2lkOworfTsKKy8qKgorICogVGV4dCBsYXllciByZW5kZXIgcGFyYW1ldGVycy4KKyAqCisgKiBAdHlwZWRlZiB7T2JqZWN0fSBUZXh0TGF5ZXJSZW5kZXJQYXJhbWV0ZXJzCisgKiBAcHJvcGVydHkge2ltcG9ydCgiLi9hcGkiKS5UZXh0Q29udGVudH0gW3RleHRDb250ZW50XSAtIFRleHQgY29udGVudCB0bworICogICByZW5kZXIgKHRoZSBvYmplY3QgaXMgcmV0dXJuZWQgYnkgdGhlIHBhZ2UncyBgZ2V0VGV4dENvbnRlbnRgIG1ldGhvZCkuCisgKiBAcHJvcGVydHkge1JlYWRhYmxlU3RyZWFtfSBbdGV4dENvbnRlbnRTdHJlYW1dIC0gVGV4dCBjb250ZW50IHN0cmVhbSB0bworICogICByZW5kZXIgKHRoZSBzdHJlYW0gaXMgcmV0dXJuZWQgYnkgdGhlIHBhZ2UncyBgc3RyZWFtVGV4dENvbnRlbnRgIG1ldGhvZCkuCisgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBjb250YWluZXIgLSBIVE1MIGVsZW1lbnQgdGhhdCB3aWxsIGNvbnRhaW4gdGV4dCBydW5zLgorICogQHByb3BlcnR5IHtpbXBvcnQoIi4vZGlzcGxheV91dGlscyIpLlBhZ2VWaWV3cG9ydH0gdmlld3BvcnQgLSBUaGUgdGFyZ2V0CisgKiAgIHZpZXdwb3J0IHRvIHByb3Blcmx5IGxheW91dCB0aGUgdGV4dCBydW5zLgorICogQHByb3BlcnR5IHtBcnJheTxIVE1MRWxlbWVudD59IFt0ZXh0RGl2c10gLSBIVE1MIGVsZW1lbnRzIHRoYXQgYXJlIGNvcnJlc3BvbmQKKyAqICAgdG8gdGhlIHRleHQgaXRlbXMgb2YgdGhlIHRleHRDb250ZW50IGlucHV0LiBUaGlzIGlzIG91dHB1dCBhbmQgc2hhbGwgYmUKKyAqICAgaW5pdGlhbGx5IGJlIHNldCB0byBlbXB0eSBhcnJheS4KKyAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gW3RleHRDb250ZW50SXRlbXNTdHJdIC0gU3RyaW5ncyB0aGF0IGNvcnJlc3BvbmQgdG8KKyAqICAgIHRoZSBgc3RyYCBwcm9wZXJ0eSBvZiB0aGUgdGV4dCBpdGVtcyBvZiB0ZXh0Q29udGVudCBpbnB1dC4gVGhpcyBpcyBvdXRwdXQKKyAqICAgYW5kIHNoYWxsIGJlIGluaXRpYWxseSBiZSBzZXQgdG8gZW1wdHkgYXJyYXkuCisgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIC0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSByZW5kZXJpbmcgb2YgdGhlCisgKiAgIHRleHQgcnVucyBvY2N1cnMuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmhhbmNlVGV4dFNlbGVjdGlvbl0gLSBXaGV0aGVyIHRvIHR1cm4gb24gdGhlIHRleHQKKyAqICAgc2VsZWN0aW9uIGVuaGFuY2VtZW50LgorICovCisvKioKKyAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRMYXllclJlbmRlclRhc2sKKyAqIEBwcm9wZXJ0eSB7UHJvbWlzZTx2b2lkPn0gcHJvbWlzZQorICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjYW5jZWwKKyAqIEBwcm9wZXJ0eSB7KGV4cGFuZERpdnM6IGJvb2xlYW4pID0+IHZvaWR9IGV4cGFuZFRleHREaXZzCisgKi8KKy8qKgorICogQHR5cGUgeyhyZW5kZXJQYXJhbWV0ZXJzOiBUZXh0TGF5ZXJSZW5kZXJQYXJhbWV0ZXJzKSA9PiBUZXh0TGF5ZXJSZW5kZXJUYXNrfQorICovCitleHBvcnQgdmFyIHJlbmRlclRleHRMYXllcjogKHJlbmRlclBhcmFtZXRlcnM6IFRleHRMYXllclJlbmRlclBhcmFtZXRlcnMpID0+IFRleHRMYXllclJlbmRlclRhc2s7CmRpZmYgLS1naXQgYS90eXBlcy9kaXNwbGF5L3RyYW5zcG9ydF9zdHJlYW0uZC50cyBiL3R5cGVzL2Rpc3BsYXkvdHJhbnNwb3J0X3N0cmVhbS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNTg4MTQKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlcy9kaXNwbGF5L3RyYW5zcG9ydF9zdHJlYW0uZC50cwpAQCAtMCwwICsxLDU3IEBACisvKiogQGltcGxlbWVudHMge0lQREZTdHJlYW19ICovCitleHBvcnQgY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbSB7CisgICAgY29uc3RydWN0b3IocGFyYW1zOiBhbnksIHBkZkRhdGFSYW5nZVRyYW5zcG9ydDogYW55KTsKKyAgICBfcXVldWVkQ2h1bmtzOiBhbnlbXTsKKyAgICBfcHJvZ3Jlc3NpdmVEb25lOiBhbnk7CisgICAgX3BkZkRhdGFSYW5nZVRyYW5zcG9ydDogYW55OworICAgIF9pc1N0cmVhbWluZ1N1cHBvcnRlZDogYm9vbGVhbjsKKyAgICBfaXNSYW5nZVN1cHBvcnRlZDogYm9vbGVhbjsKKyAgICBfY29udGVudExlbmd0aDogYW55OworICAgIF9mdWxsUmVxdWVzdFJlYWRlcjogYW55OworICAgIF9yYW5nZVJlYWRlcnM6IGFueVtdOworICAgIF9vblJlY2VpdmVEYXRhKGFyZ3M6IGFueSk6IHZvaWQ7CisgICAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKTogYW55OworICAgIF9vblByb2dyZXNzKGV2dDogYW55KTogdm9pZDsKKyAgICBfb25Qcm9ncmVzc2l2ZURvbmUoKTogdm9pZDsKKyAgICBfcmVtb3ZlUmFuZ2VSZWFkZXIocmVhZGVyOiBhbnkpOiB2b2lkOworICAgIGdldEZ1bGxSZWFkZXIoKTogUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcjsKKyAgICBnZXRSYW5nZVJlYWRlcihiZWdpbjogYW55LCBlbmQ6IGFueSk6IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciB8IG51bGw7CisgICAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uOiBhbnkpOiB2b2lkOworfQorLyoqIEBpbXBsZW1lbnRzIHtJUERGU3RyZWFtUmVhZGVyfSAqLworZGVjbGFyZSBjbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyIHsKKyAgICBjb25zdHJ1Y3RvcihzdHJlYW06IGFueSwgcXVldWVkQ2h1bmtzOiBhbnksIHByb2dyZXNzaXZlRG9uZT86IGJvb2xlYW4pOworICAgIF9zdHJlYW06IGFueTsKKyAgICBfZG9uZTogYm9vbGVhbjsKKyAgICBfZmlsZW5hbWU6IGFueTsKKyAgICBfcXVldWVkQ2h1bmtzOiBhbnk7CisgICAgX2xvYWRlZDogbnVtYmVyOworICAgIF9yZXF1ZXN0czogYW55W107CisgICAgX2hlYWRlcnNSZWFkeTogUHJvbWlzZTx2b2lkPjsKKyAgICBvblByb2dyZXNzOiBhbnk7CisgICAgX2VucXVldWUoY2h1bms6IGFueSk6IHZvaWQ7CisgICAgZ2V0IGhlYWRlcnNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+OworICAgIGdldCBmaWxlbmFtZSgpOiBhbnk7CisgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKTogYW55OworICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpOiBhbnk7CisgICAgZ2V0IGNvbnRlbnRMZW5ndGgoKTogYW55OworICAgIHJlYWQoKTogUHJvbWlzZTxhbnk+OworICAgIGNhbmNlbChyZWFzb246IGFueSk6IHZvaWQ7CisgICAgcHJvZ3Jlc3NpdmVEb25lKCk6IHZvaWQ7Cit9CisvKiogQGltcGxlbWVudHMge0lQREZTdHJlYW1SYW5nZVJlYWRlcn0gKi8KK2RlY2xhcmUgY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyIHsKKyAgICBjb25zdHJ1Y3RvcihzdHJlYW06IGFueSwgYmVnaW46IGFueSwgZW5kOiBhbnkpOworICAgIF9zdHJlYW06IGFueTsKKyAgICBfYmVnaW46IGFueTsKKyAgICBfZW5kOiBhbnk7CisgICAgX3F1ZXVlZENodW5rOiBhbnk7CisgICAgX3JlcXVlc3RzOiBhbnlbXTsKKyAgICBfZG9uZTogYm9vbGVhbjsKKyAgICBvblByb2dyZXNzOiBhbnk7CisgICAgX2VucXVldWUoY2h1bms6IGFueSk6IHZvaWQ7CisgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCk6IGJvb2xlYW47CisgICAgcmVhZCgpOiBQcm9taXNlPGFueT47CisgICAgY2FuY2VsKHJlYXNvbjogYW55KTogdm9pZDsKK30KK2V4cG9ydCB7fTsKZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvd2ViZ2wuZC50cyBiL3R5cGVzL2Rpc3BsYXkvd2ViZ2wuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTAzNzUzCi0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS93ZWJnbC5kLnRzCkBAIC0wLDAgKzEsMjAgQEAKK2V4cG9ydCBjbGFzcyBXZWJHTENvbnRleHQgeworICAgIGNvbnN0cnVjdG9yKHsgZW5hYmxlIH06IHsKKyAgICAgICAgZW5hYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDsKKyAgICB9KTsKKyAgICBfZW5hYmxlZDogYm9vbGVhbjsKKyAgICBnZXQgaXNFbmFibGVkKCk6IGFueTsKKyAgICBjb21wb3NlU01hc2soeyBsYXllciwgbWFzaywgcHJvcGVydGllcyB9OiB7CisgICAgICAgIGxheWVyOiBhbnk7CisgICAgICAgIG1hc2s6IGFueTsKKyAgICAgICAgcHJvcGVydGllczogYW55OworICAgIH0pOiBhbnk7CisgICAgZHJhd0ZpZ3VyZXMoeyB3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kQ29sb3IsIGZpZ3VyZXMsIGNvbnRleHQgfTogeworICAgICAgICB3aWR0aDogYW55OworICAgICAgICBoZWlnaHQ6IGFueTsKKyAgICAgICAgYmFja2dyb3VuZENvbG9yOiBhbnk7CisgICAgICAgIGZpZ3VyZXM6IGFueTsKKyAgICAgICAgY29udGV4dDogYW55OworICAgIH0pOiBhbnk7CisgICAgY2xlYXIoKTogdm9pZDsKK30KZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkvd29ya2VyX29wdGlvbnMuZC50cyBiL3R5cGVzL2Rpc3BsYXkvd29ya2VyX29wdGlvbnMuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFhODU4Ci0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvZGlzcGxheS93b3JrZXJfb3B0aW9ucy5kLnRzCkBAIC0wLDAgKzEsMjcgQEAKK2V4cG9ydCB0eXBlIEdsb2JhbFdvcmtlck9wdGlvbnNUeXBlID0geworICAgIC8qKgorICAgICAqIC0gRGVmaW5lcyBnbG9iYWwgcG9ydCBmb3Igd29ya2VyCisgICAgICogcHJvY2Vzcy4gT3ZlcnJpZGVzIHRoZSBgd29ya2VyU3JjYCBvcHRpb24uCisgICAgICovCisgICAgd29ya2VyUG9ydDogV29ya2VyIHwgbnVsbDsKKyAgICAvKioKKyAgICAgKiAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggYW5kIGZpbGVuYW1lCisgICAgICogb2YgdGhlIHdvcmtlciBmaWxlLgorICAgICAqCisgICAgICogTk9URTogVGhlIGB3b3JrZXJTcmNgIG9wdGlvbiBzaG91bGQgYWx3YXlzIGJlIHNldCwgaW4gb3JkZXIgdG8gcHJldmVudCBhbnkKKyAgICAgKiBpc3N1ZXMgd2hlbiB1c2luZyB0aGUgUERGLmpzIGxpYnJhcnkuCisgICAgICovCisgICAgd29ya2VyU3JjOiBzdHJpbmc7Cit9OworLyoqCisgKiBAdHlwZWRlZiB7T2JqZWN0fSBHbG9iYWxXb3JrZXJPcHRpb25zVHlwZQorICogQHByb3BlcnR5IHtXb3JrZXIgfCBudWxsfSB3b3JrZXJQb3J0IC0gRGVmaW5lcyBnbG9iYWwgcG9ydCBmb3Igd29ya2VyCisgKiAgIHByb2Nlc3MuIE92ZXJyaWRlcyB0aGUgYHdvcmtlclNyY2Agb3B0aW9uLgorICogQHByb3BlcnR5IHtzdHJpbmd9IHdvcmtlclNyYyAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggYW5kIGZpbGVuYW1lCisgKiAgIG9mIHRoZSB3b3JrZXIgZmlsZS4KKyAqCisgKiAgIE5PVEU6IFRoZSBgd29ya2VyU3JjYCBvcHRpb24gc2hvdWxkIGFsd2F5cyBiZSBzZXQsIGluIG9yZGVyIHRvIHByZXZlbnQgYW55CisgKiAgICAgICAgIGlzc3VlcyB3aGVuIHVzaW5nIHRoZSBQREYuanMgbGlicmFyeS4KKyAqLworLyoqIEB0eXBlIHtHbG9iYWxXb3JrZXJPcHRpb25zVHlwZX0gKi8KK2V4cG9ydCBjb25zdCBHbG9iYWxXb3JrZXJPcHRpb25zOiBHbG9iYWxXb3JrZXJPcHRpb25zVHlwZTsKZGlmZiAtLWdpdCBhL3R5cGVzL2Rpc3BsYXkveG1sX3BhcnNlci5kLnRzIGIvdHlwZXMvZGlzcGxheS94bWxfcGFyc2VyLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2OTcxNgotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVzL2Rpc3BsYXkveG1sX3BhcnNlci5kLnRzCkBAIC0wLDAgKzEsMzUgQEAKK2V4cG9ydCBjbGFzcyBTaW1wbGVYTUxQYXJzZXIgZXh0ZW5kcyBYTUxQYXJzZXJCYXNlIHsKKyAgICBfY3VycmVudEZyYWdtZW50OiBhbnk7CisgICAgX3N0YWNrOiBhbnlbXSB8IG51bGw7CisgICAgX2Vycm9yQ29kZTogbnVtYmVyOworICAgIHBhcnNlRnJvbVN0cmluZyhkYXRhOiBhbnkpOiB7CisgICAgICAgIGRvY3VtZW50RWxlbWVudDogYW55OworICAgIH0gfCB1bmRlZmluZWQ7Cit9CitkZWNsYXJlIGNsYXNzIFhNTFBhcnNlckJhc2UgeworICAgIF9yZXNvbHZlRW50aXRpZXMoczogYW55KTogYW55OworICAgIF9wYXJzZUNvbnRlbnQoczogYW55LCBzdGFydDogYW55KTogeworICAgICAgICBuYW1lOiBhbnk7CisgICAgICAgIGF0dHJpYnV0ZXM6IHsKKyAgICAgICAgICAgIG5hbWU6IHN0cmluZzsKKyAgICAgICAgICAgIHZhbHVlOiBhbnk7CisgICAgICAgIH1bXTsKKyAgICAgICAgcGFyc2VkOiBudW1iZXI7CisgICAgfSB8IG51bGw7CisgICAgX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHM6IGFueSwgc3RhcnQ6IGFueSk6IHsKKyAgICAgICAgbmFtZTogYW55OworICAgICAgICB2YWx1ZTogYW55OworICAgICAgICBwYXJzZWQ6IG51bWJlcjsKKyAgICB9OworICAgIHBhcnNlWG1sKHM6IGFueSk6IHZvaWQ7CisgICAgb25SZXNvbHZlRW50aXR5KG5hbWU6IGFueSk6IHN0cmluZzsKKyAgICBvblBpKG5hbWU6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQ7CisgICAgb25Db21tZW50KHRleHQ6IGFueSk6IHZvaWQ7CisgICAgb25DZGF0YSh0ZXh0OiBhbnkpOiB2b2lkOworICAgIG9uRG9jdHlwZShkb2N0eXBlQ29udGVudDogYW55KTogdm9pZDsKKyAgICBvblRleHQodGV4dDogYW55KTogdm9pZDsKKyAgICBvbkJlZ2luRWxlbWVudChuYW1lOiBhbnksIGF0dHJpYnV0ZXM6IGFueSwgaXNFbXB0eTogYW55KTogdm9pZDsKKyAgICBvbkVuZEVsZW1lbnQobmFtZTogYW55KTogdm9pZDsKKyAgICBvbkVycm9yKGNvZGU6IGFueSk6IHZvaWQ7Cit9CitleHBvcnQge307CmRpZmYgLS1naXQgYS90eXBlcy9wZGYuZC50cyBiL3R5cGVzL3BkZi5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNGFkNGQKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlcy9wZGYuZC50cwpAQCAtMCwwICsxLDMzIEBACitpbXBvcnQgeyBhZGRMaW5rQXR0cmlidXRlcyB9IGZyb20gIi4vZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzIjsKK2ltcG9ydCB7IGdldEZpbGVuYW1lRnJvbVVybCB9IGZyb20gIi4vZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzIjsKK2ltcG9ydCB7IExpbmtUYXJnZXQgfSBmcm9tICIuL2Rpc3BsYXkvZGlzcGxheV91dGlscy5qcyI7CitpbXBvcnQgeyBsb2FkU2NyaXB0IH0gZnJvbSAiLi9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanMiOworaW1wb3J0IHsgUERGRGF0ZVN0cmluZyB9IGZyb20gIi4vZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzIjsKK2ltcG9ydCB7IFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiB9IGZyb20gIi4vZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzIjsKK2ltcG9ydCB7IGJ1aWxkIH0gZnJvbSAiLi9kaXNwbGF5L2FwaS5qcyI7CitpbXBvcnQgeyBnZXREb2N1bWVudCB9IGZyb20gIi4vZGlzcGxheS9hcGkuanMiOworaW1wb3J0IHsgTG9vcGJhY2tQb3J0IH0gZnJvbSAiLi9kaXNwbGF5L2FwaS5qcyI7CitpbXBvcnQgeyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgfSBmcm9tICIuL2Rpc3BsYXkvYXBpLmpzIjsKK2ltcG9ydCB7IFBERldvcmtlciB9IGZyb20gIi4vZGlzcGxheS9hcGkuanMiOworaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gIi4vZGlzcGxheS9hcGkuanMiOworaW1wb3J0IHsgQ01hcENvbXByZXNzaW9uVHlwZSB9IGZyb20gIi4vc2hhcmVkL3V0aWwuanMiOworaW1wb3J0IHsgY3JlYXRlT2JqZWN0VVJMIH0gZnJvbSAiLi9zaGFyZWQvdXRpbC5qcyI7CitpbXBvcnQgeyBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSB9IGZyb20gIi4vc2hhcmVkL3V0aWwuanMiOworaW1wb3J0IHsgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCB9IGZyb20gIi4vc2hhcmVkL3V0aWwuanMiOworaW1wb3J0IHsgSW52YWxpZFBERkV4Y2VwdGlvbiB9IGZyb20gIi4vc2hhcmVkL3V0aWwuanMiOworaW1wb3J0IHsgTWlzc2luZ1BERkV4Y2VwdGlvbiB9IGZyb20gIi4vc2hhcmVkL3V0aWwuanMiOworaW1wb3J0IHsgT1BTIH0gZnJvbSAiLi9zaGFyZWQvdXRpbC5qcyI7CitpbXBvcnQgeyBQYXNzd29yZFJlc3BvbnNlcyB9IGZyb20gIi4vc2hhcmVkL3V0aWwuanMiOworaW1wb3J0IHsgUGVybWlzc2lvbkZsYWcgfSBmcm9tICIuL3NoYXJlZC91dGlsLmpzIjsKK2ltcG9ydCB7IHJlbW92ZU51bGxDaGFyYWN0ZXJzIH0gZnJvbSAiLi9zaGFyZWQvdXRpbC5qcyI7CitpbXBvcnQgeyBzaGFkb3cgfSBmcm9tICIuL3NoYXJlZC91dGlsLmpzIjsKK2ltcG9ydCB7IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiB9IGZyb20gIi4vc2hhcmVkL3V0aWwuanMiOworaW1wb3J0IHsgVU5TVVBQT1JURURfRkVBVFVSRVMgfSBmcm9tICIuL3NoYXJlZC91dGlsLmpzIjsKK2ltcG9ydCB7IFV0aWwgfSBmcm9tICIuL3NoYXJlZC91dGlsLmpzIjsKK2ltcG9ydCB7IFZlcmJvc2l0eUxldmVsIH0gZnJvbSAiLi9zaGFyZWQvdXRpbC5qcyI7CitpbXBvcnQgeyBBbm5vdGF0aW9uTGF5ZXIgfSBmcm9tICIuL2Rpc3BsYXkvYW5ub3RhdGlvbl9sYXllci5qcyI7CitpbXBvcnQgeyBhcGlDb21wYXRpYmlsaXR5UGFyYW1zIH0gZnJvbSAiLi9kaXNwbGF5L2FwaV9jb21wYXRpYmlsaXR5LmpzIjsKK2ltcG9ydCB7IEdsb2JhbFdvcmtlck9wdGlvbnMgfSBmcm9tICIuL2Rpc3BsYXkvd29ya2VyX29wdGlvbnMuanMiOworaW1wb3J0IHsgcmVuZGVyVGV4dExheWVyIH0gZnJvbSAiLi9kaXNwbGF5L3RleHRfbGF5ZXIuanMiOworaW1wb3J0IHsgU1ZHR3JhcGhpY3MgfSBmcm9tICIuL2Rpc3BsYXkvc3ZnLmpzIjsKK2V4cG9ydCB7IGFkZExpbmtBdHRyaWJ1dGVzLCBnZXRGaWxlbmFtZUZyb21VcmwsIExpbmtUYXJnZXQsIGxvYWRTY3JpcHQsIFBERkRhdGVTdHJpbmcsIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiwgYnVpbGQsIGdldERvY3VtZW50LCBMb29wYmFja1BvcnQsIFBERkRhdGFSYW5nZVRyYW5zcG9ydCwgUERGV29ya2VyLCB2ZXJzaW9uLCBDTWFwQ29tcHJlc3Npb25UeXBlLCBjcmVhdGVPYmplY3RVUkwsIGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5LCBjcmVhdGVWYWxpZEFic29sdXRlVXJsLCBJbnZhbGlkUERGRXhjZXB0aW9uLCBNaXNzaW5nUERGRXhjZXB0aW9uLCBPUFMsIFBhc3N3b3JkUmVzcG9uc2VzLCBQZXJtaXNzaW9uRmxhZywgcmVtb3ZlTnVsbENoYXJhY3RlcnMsIHNoYWRvdywgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uLCBVTlNVUFBPUlRFRF9GRUFUVVJFUywgVXRpbCwgVmVyYm9zaXR5TGV2ZWwsIEFubm90YXRpb25MYXllciwgYXBpQ29tcGF0aWJpbGl0eVBhcmFtcywgR2xvYmFsV29ya2VyT3B0aW9ucywgcmVuZGVyVGV4dExheWVyLCBTVkdHcmFwaGljcyB9OwpkaWZmIC0tZ2l0IGEvdHlwZXMvc2hhcmVkL2NvbXBhdGliaWxpdHkuZC50cyBiL3R5cGVzL3NoYXJlZC9jb21wYXRpYmlsaXR5LmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwZmY1YwotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVzL3NoYXJlZC9jb21wYXRpYmlsaXR5LmQudHMKQEAgLTAsMCArMSBAQAorZXhwb3J0IHt9OwpkaWZmIC0tZ2l0IGEvdHlwZXMvc2hhcmVkL2lzX25vZGUuZC50cyBiL3R5cGVzL3NoYXJlZC9pc19ub2RlLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhZjBlMwotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVzL3NoYXJlZC9pc19ub2RlLmQudHMKQEAgLTAsMCArMSBAQAorZXhwb3J0IGNvbnN0IGlzTm9kZUpTOiBib29sZWFuOwpkaWZmIC0tZ2l0IGEvdHlwZXMvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5kLnRzIGIvdHlwZXMvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMmMzZjIKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlcy9zaGFyZWQvbWVzc2FnZV9oYW5kbGVyLmQudHMKQEAgLTAsMCArMSw2MiBAQAorZXhwb3J0IGNsYXNzIE1lc3NhZ2VIYW5kbGVyIHsKKyAgICBjb25zdHJ1Y3Rvcihzb3VyY2VOYW1lOiBhbnksIHRhcmdldE5hbWU6IGFueSwgY29tT2JqOiBhbnkpOworICAgIHNvdXJjZU5hbWU6IGFueTsKKyAgICB0YXJnZXROYW1lOiBhbnk7CisgICAgY29tT2JqOiBhbnk7CisgICAgY2FsbGJhY2tJZDogbnVtYmVyOworICAgIHN0cmVhbUlkOiBudW1iZXI7CisgICAgcG9zdE1lc3NhZ2VUcmFuc2ZlcnM6IGJvb2xlYW47CisgICAgc3RyZWFtU2lua3M6IGFueTsKKyAgICBzdHJlYW1Db250cm9sbGVyczogYW55OworICAgIGNhbGxiYWNrQ2FwYWJpbGl0aWVzOiBhbnk7CisgICAgYWN0aW9uSGFuZGxlcjogYW55OworICAgIF9vbkNvbU9iak9uTWVzc2FnZTogKGV2ZW50OiBhbnkpID0+IHZvaWQ7CisgICAgb24oYWN0aW9uTmFtZTogYW55LCBoYW5kbGVyOiBhbnkpOiB2b2lkOworICAgIC8qKgorICAgICAqIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY29tT2JqIHRvIGludm9rZSB0aGUgYWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGRhdGEuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gdG8gY2FsbC4KKyAgICAgKiBAcGFyYW0ge0pTT059IGRhdGEgLSBKU09OIGRhdGEgdG8gc2VuZC4KKyAgICAgKiBAcGFyYW0ge0FycmF5fSBbdHJhbnNmZXJzXSAtIExpc3Qgb2YgdHJhbnNmZXJzL0FycmF5QnVmZmVycy4KKyAgICAgKi8KKyAgICBzZW5kKGFjdGlvbk5hbWU6IHN0cmluZywgZGF0YTogSlNPTiwgdHJhbnNmZXJzPzogYW55W10gfCB1bmRlZmluZWQpOiB2b2lkOworICAgIC8qKgorICAgICAqIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY29tT2JqIHRvIGludm9rZSB0aGUgYWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGRhdGEuCisgICAgICogRXhwZWN0cyB0aGF0IHRoZSBvdGhlciBzaWRlIHdpbGwgY2FsbGJhY2sgd2l0aCB0aGUgcmVzcG9uc2UuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gdG8gY2FsbC4KKyAgICAgKiBAcGFyYW0ge0pTT059IGRhdGEgLSBKU09OIGRhdGEgdG8gc2VuZC4KKyAgICAgKiBAcGFyYW0ge0FycmF5fSBbdHJhbnNmZXJzXSAtIExpc3Qgb2YgdHJhbnNmZXJzL0FycmF5QnVmZmVycy4KKyAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0byBiZSByZXNvbHZlZCB3aXRoIHJlc3BvbnNlIGRhdGEuCisgICAgICovCisgICAgc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgZGF0YTogSlNPTiwgdHJhbnNmZXJzPzogYW55W10gfCB1bmRlZmluZWQpOiBQcm9taXNlPGFueT47CisgICAgLyoqCisgICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBjb21PYmogdG8gaW52b2tlIHRoZSBhY3Rpb24gd2l0aCB0aGUgc3VwcGxpZWQgZGF0YS4KKyAgICAgKiBFeHBlY3QgdGhhdCB0aGUgb3RoZXIgc2lkZSB3aWxsIGNhbGxiYWNrIHRvIHNpZ25hbCAnc3RhcnRfY29tcGxldGUnLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gQWN0aW9uIHRvIGNhbGwuCisgICAgICogQHBhcmFtIHtKU09OfSBkYXRhIC0gSlNPTiBkYXRhIHRvIHNlbmQuCisgICAgICogQHBhcmFtIHtPYmplY3R9IHF1ZXVlaW5nU3RyYXRlZ3kgLSBTdHJhdGVneSB0byBzaWduYWwgYmFja3ByZXNzdXJlIGJhc2VkIG9uCisgICAgICogICAgICAgICAgICAgICAgIGludGVybmFsIHF1ZXVlLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IFt0cmFuc2ZlcnNdIC0gTGlzdCBvZiB0cmFuc2ZlcnMvQXJyYXlCdWZmZXJzLgorICAgICAqIEByZXR1cm5zIHtSZWFkYWJsZVN0cmVhbX0gUmVhZGFibGVTdHJlYW0gdG8gcmVhZCBkYXRhIGluIGNodW5rcy4KKyAgICAgKi8KKyAgICBzZW5kV2l0aFN0cmVhbShhY3Rpb25OYW1lOiBzdHJpbmcsIGRhdGE6IEpTT04sIHF1ZXVlaW5nU3RyYXRlZ3k6IE9iamVjdCwgdHJhbnNmZXJzPzogYW55W10gfCB1bmRlZmluZWQpOiBSZWFkYWJsZVN0cmVhbTsKKyAgICAvKioKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHByaXZhdGUgX2NyZWF0ZVN0cmVhbVNpbms7CisgICAgLyoqCisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIF9wcm9jZXNzU3RyZWFtTWVzc2FnZTsKKyAgICAvKioKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHByaXZhdGUgX2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXI7CisgICAgLyoqCisgICAgICogU2VuZHMgcmF3IG1lc3NhZ2UgdG8gdGhlIGNvbU9iai4KKyAgICAgKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB0cmFuc2ZlcnMgTGlzdCBvZiB0cmFuc2ZlcnMvQXJyYXlCdWZmZXJzLCBvciB1bmRlZmluZWQuCisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIF9wb3N0TWVzc2FnZTsKKyAgICBkZXN0cm95KCk6IHZvaWQ7Cit9CmRpZmYgLS1naXQgYS90eXBlcy9zaGFyZWQvdXRpbC5kLnRzIGIvdHlwZXMvc2hhcmVkL3V0aWwuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjJhMDRmCi0tLSAvZGV2L251bGwKKysrIGIvdHlwZXMvc2hhcmVkL3V0aWwuZC50cwpAQCAtMCwwICsxLDQyMSBAQAorLyoqCisgKiBQcm9taXNlIENhcGFiaWxpdHkgb2JqZWN0LgorICovCitleHBvcnQgdHlwZSBQcm9taXNlQ2FwYWJpbGl0eSA9IHsKKyAgICAvKioKKyAgICAgKiAtIEEgUHJvbWlzZSBvYmplY3QuCisgICAgICovCisgICAgcHJvbWlzZTogUHJvbWlzZTxhbnk+OworICAgIC8qKgorICAgICAqIC0gSWYgdGhlIFByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkL3JlamVjdGVkLgorICAgICAqLworICAgIHNldHRsZWQ6IGJvb2xlYW47CisgICAgLyoqCisgICAgICogLSBGdWxmaWxscyB0aGUgUHJvbWlzZS4KKyAgICAgKi8KKyAgICByZXNvbHZlOiBGdW5jdGlvbjsKKyAgICAvKioKKyAgICAgKiAtIFJlamVjdHMgdGhlIFByb21pc2UuCisgICAgICovCisgICAgcmVqZWN0OiBGdW5jdGlvbjsKK307CisvKioKKyAqIEB0eXBlIHthbnl9CisgKi8KK2V4cG9ydCBjb25zdCBCYXNlRXhjZXB0aW9uOiBhbnk7CitleHBvcnQgY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVg6IG51bWJlcltdOworZXhwb3J0IGNvbnN0IElERU5USVRZX01BVFJJWDogbnVtYmVyW107CitleHBvcnQgbmFtZXNwYWNlIE9QUyB7CisgICAgZXhwb3J0IGNvbnN0IGRlcGVuZGVuY3k6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0TGluZVdpZHRoOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IHNldExpbmVDYXA6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0TGluZUpvaW46IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0TWl0ZXJMaW1pdDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXREYXNoOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IHNldFJlbmRlcmluZ0ludGVudDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRGbGF0bmVzczogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRHU3RhdGU6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2F2ZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCByZXN0b3JlOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IHRyYW5zZm9ybTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBtb3ZlVG86IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgbGluZVRvOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGN1cnZlVG86IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgY3VydmVUbzI6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgY3VydmVUbzM6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgY2xvc2VQYXRoOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IHJlY3RhbmdsZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzdHJva2U6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgY2xvc2VTdHJva2U6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgZmlsbDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBlb0ZpbGw6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgZmlsbFN0cm9rZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBlb0ZpbGxTdHJva2U6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgY2xvc2VGaWxsU3Ryb2tlOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGNsb3NlRU9GaWxsU3Ryb2tlOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGVuZFBhdGg6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgY2xpcDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBlb0NsaXA6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgYmVnaW5UZXh0OiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGVuZFRleHQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0Q2hhclNwYWNpbmc6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0V29yZFNwYWNpbmc6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0SFNjYWxlOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IHNldExlYWRpbmc6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0Rm9udDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRUZXh0UmVuZGVyaW5nTW9kZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRUZXh0UmlzZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBtb3ZlVGV4dDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRMZWFkaW5nTW92ZVRleHQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0VGV4dE1hdHJpeDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBuZXh0TGluZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzaG93VGV4dDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzaG93U3BhY2VkVGV4dDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBuZXh0TGluZVNob3dUZXh0OiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IHNldENoYXJXaWR0aDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRDaGFyV2lkdGhBbmRCb3VuZHM6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0U3Ryb2tlQ29sb3JTcGFjZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRGaWxsQ29sb3JTcGFjZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRTdHJva2VDb2xvcjogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRTdHJva2VDb2xvck46IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0RmlsbENvbG9yOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IHNldEZpbGxDb2xvck46IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0U3Ryb2tlR3JheTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRGaWxsR3JheTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRTdHJva2VSR0JDb2xvcjogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBzZXRGaWxsUkdCQ29sb3I6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2V0U3Ryb2tlQ01ZS0NvbG9yOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IHNldEZpbGxDTVlLQ29sb3I6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3Qgc2hhZGluZ0ZpbGw6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgYmVnaW5JbmxpbmVJbWFnZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBiZWdpbkltYWdlRGF0YTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBlbmRJbmxpbmVJbWFnZTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBwYWludFhPYmplY3Q6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgbWFya1BvaW50OiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IG1hcmtQb2ludFByb3BzOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGJlZ2luTWFya2VkQ29udGVudDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBlbmRNYXJrZWRDb250ZW50OiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGJlZ2luQ29tcGF0OiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGVuZENvbXBhdDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBwYWludEZvcm1YT2JqZWN0QmVnaW46IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgcGFpbnRGb3JtWE9iamVjdEVuZDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBiZWdpbkdyb3VwOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGVuZEdyb3VwOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGJlZ2luQW5ub3RhdGlvbnM6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgZW5kQW5ub3RhdGlvbnM6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgYmVnaW5Bbm5vdGF0aW9uOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGVuZEFubm90YXRpb246IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgcGFpbnRKcGVnWE9iamVjdDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBwYWludEltYWdlTWFza1hPYmplY3Q6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgcGFpbnRJbWFnZVhPYmplY3Q6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBwYWludEltYWdlWE9iamVjdFJlcGVhdDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IGNvbnN0cnVjdFBhdGg6IG51bWJlcjsKK30KK2V4cG9ydCBuYW1lc3BhY2UgVmVyYm9zaXR5TGV2ZWwgeworICAgIGV4cG9ydCBjb25zdCBFUlJPUlM6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgV0FSTklOR1M6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgSU5GT1M6IG51bWJlcjsKK30KK2V4cG9ydCBjb25zdCBVTlNVUFBPUlRFRF9GRUFUVVJFUzogeworICAgIC8qKiBAZGVwcmVjYXRlZCB1bnVzZWQgKi8KKyAgICB1bmtub3duOiBzdHJpbmc7CisgICAgZm9ybXM6IHN0cmluZzsKKyAgICBqYXZhU2NyaXB0OiBzdHJpbmc7CisgICAgc21hc2s6IHN0cmluZzsKKyAgICBzaGFkaW5nUGF0dGVybjogc3RyaW5nOworICAgIC8qKiBAZGVwcmVjYXRlZCB1bnVzZWQgKi8KKyAgICBmb250OiBzdHJpbmc7CisgICAgZXJyb3JUaWxpbmdQYXR0ZXJuOiBzdHJpbmc7CisgICAgZXJyb3JFeHRHU3RhdGU6IHN0cmluZzsKKyAgICBlcnJvclhPYmplY3Q6IHN0cmluZzsKKyAgICBlcnJvckZvbnRMb2FkVHlwZTM6IHN0cmluZzsKKyAgICBlcnJvckZvbnRTdGF0ZTogc3RyaW5nOworICAgIGVycm9yRm9udE1pc3Npbmc6IHN0cmluZzsKKyAgICBlcnJvckZvbnRUcmFuc2xhdGU6IHN0cmluZzsKKyAgICBlcnJvckNvbG9yU3BhY2U6IHN0cmluZzsKKyAgICBlcnJvck9wZXJhdG9yTGlzdDogc3RyaW5nOworICAgIGVycm9yRm9udFRvVW5pY29kZTogc3RyaW5nOworICAgIGVycm9yRm9udExvYWROYXRpdmU6IHN0cmluZzsKKyAgICBlcnJvckZvbnRHZXRQYXRoOiBzdHJpbmc7CisgICAgZXJyb3JNYXJrZWRDb250ZW50OiBzdHJpbmc7Cit9OworZXhwb3J0IG5hbWVzcGFjZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlIHsKKyAgICBleHBvcnQgY29uc3QgU09MSUQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgREFTSEVEOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IEJFVkVMRUQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgSU5TRVQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgVU5ERVJMSU5FOiBudW1iZXI7Cit9CitleHBvcnQgbmFtZXNwYWNlIEFubm90YXRpb25GaWVsZEZsYWcgeworICAgIGV4cG9ydCBjb25zdCBSRUFET05MWTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBSRVFVSVJFRDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBOT0VYUE9SVDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBNVUxUSUxJTkU6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgUEFTU1dPUkQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgTk9UT0dHTEVUT09GRjogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBSQURJTzogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBQVVNIQlVUVE9OOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IENPTUJPOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IEVESVQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgU09SVDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBGSUxFU0VMRUNUOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IE1VTFRJU0VMRUNUOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IERPTk9UU1BFTExDSEVDSzogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBET05PVFNDUk9MTDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBDT01COiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFJJQ0hURVhUOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFJBRElPU0lOVU5JU09OOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IENPTU1JVE9OU0VMQ0hBTkdFOiBudW1iZXI7Cit9CitleHBvcnQgbmFtZXNwYWNlIEFubm90YXRpb25GbGFnIHsKKyAgICBleHBvcnQgY29uc3QgSU5WSVNJQkxFOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IEhJRERFTjogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBQUklOVDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBOT1pPT006IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgTk9ST1RBVEU6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgTk9WSUVXOiBudW1iZXI7CisgICAgY29uc3QgUkVBRE9OTFlfMTogbnVtYmVyOworICAgIGV4cG9ydCB7IFJFQURPTkxZXzEgYXMgUkVBRE9OTFkgfTsKKyAgICBleHBvcnQgY29uc3QgTE9DS0VEOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFRPR0dMRU5PVklFVzogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBMT0NLRURDT05URU5UUzogbnVtYmVyOworfQorZXhwb3J0IG5hbWVzcGFjZSBBbm5vdGF0aW9uTWFya2VkU3RhdGUgeworICAgIGV4cG9ydCBjb25zdCBNQVJLRUQ6IHN0cmluZzsKKyAgICBleHBvcnQgY29uc3QgVU5NQVJLRUQ6IHN0cmluZzsKK30KK2V4cG9ydCBuYW1lc3BhY2UgQW5ub3RhdGlvblJlcGx5VHlwZSB7CisgICAgZXhwb3J0IGNvbnN0IEdST1VQOiBzdHJpbmc7CisgICAgZXhwb3J0IGNvbnN0IFJFUExZOiBzdHJpbmc7Cit9CitleHBvcnQgbmFtZXNwYWNlIEFubm90YXRpb25SZXZpZXdTdGF0ZSB7CisgICAgZXhwb3J0IGNvbnN0IEFDQ0VQVEVEOiBzdHJpbmc7CisgICAgZXhwb3J0IGNvbnN0IFJFSkVDVEVEOiBzdHJpbmc7CisgICAgZXhwb3J0IGNvbnN0IENBTkNFTExFRDogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBDT01QTEVURUQ6IHN0cmluZzsKKyAgICBleHBvcnQgY29uc3QgTk9ORTogc3RyaW5nOworfQorZXhwb3J0IG5hbWVzcGFjZSBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgeworICAgIGNvbnN0IE1BUktFRF8xOiBzdHJpbmc7CisgICAgZXhwb3J0IHsgTUFSS0VEXzEgYXMgTUFSS0VEIH07CisgICAgZXhwb3J0IGNvbnN0IFJFVklFVzogc3RyaW5nOworfQorZXhwb3J0IG5hbWVzcGFjZSBBbm5vdGF0aW9uVHlwZSB7CisgICAgZXhwb3J0IGNvbnN0IFRFWFQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgTElOSzogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBGUkVFVEVYVDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBMSU5FOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFNRVUFSRTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBDSVJDTEU6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgUE9MWUdPTjogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBQT0xZTElORTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBISUdITElHSFQ6IG51bWJlcjsKKyAgICBjb25zdCBVTkRFUkxJTkVfMTogbnVtYmVyOworICAgIGV4cG9ydCB7IFVOREVSTElORV8xIGFzIFVOREVSTElORSB9OworICAgIGV4cG9ydCBjb25zdCBTUVVJR0dMWTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBTVFJJS0VPVVQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgU1RBTVA6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgQ0FSRVQ6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgSU5LOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFBPUFVQOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IEZJTEVBVFRBQ0hNRU5UOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFNPVU5EOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IE1PVklFOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFdJREdFVDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBTQ1JFRU46IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgUFJJTlRFUk1BUks6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgVFJBUE5FVDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBXQVRFUk1BUks6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgVEhSRUVEOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFJFREFDVDogbnVtYmVyOworfQorZXhwb3J0IG5hbWVzcGFjZSBGb250VHlwZSB7CisgICAgZXhwb3J0IGNvbnN0IFVOS05PV046IHN0cmluZzsKKyAgICBleHBvcnQgY29uc3QgVFlQRTE6IHN0cmluZzsKKyAgICBleHBvcnQgY29uc3QgVFlQRTFDOiBzdHJpbmc7CisgICAgZXhwb3J0IGNvbnN0IENJREZPTlRUWVBFMDogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBDSURGT05UVFlQRTBDOiBzdHJpbmc7CisgICAgZXhwb3J0IGNvbnN0IFRSVUVUWVBFOiBzdHJpbmc7CisgICAgZXhwb3J0IGNvbnN0IENJREZPTlRUWVBFMjogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBUWVBFMzogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBPUEVOVFlQRTogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBUWVBFMDogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBNTVRZUEUxOiBzdHJpbmc7Cit9CitleHBvcnQgbmFtZXNwYWNlIEltYWdlS2luZCB7CisgICAgZXhwb3J0IGNvbnN0IEdSQVlTQ0FMRV8xQlBQOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFJHQl8yNEJQUDogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBSR0JBXzMyQlBQOiBudW1iZXI7Cit9CitleHBvcnQgbmFtZXNwYWNlIENNYXBDb21wcmVzc2lvblR5cGUgeworICAgIGNvbnN0IE5PTkVfMTogbnVtYmVyOworICAgIGV4cG9ydCB7IE5PTkVfMSBhcyBOT05FIH07CisgICAgZXhwb3J0IGNvbnN0IEJJTkFSWTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBTVFJFQU06IG51bWJlcjsKK30KK2RlY2xhcmUgY29uc3QgQWJvcnRFeGNlcHRpb25fYmFzZTogYW55OworLyoqCisgKiBFcnJvciB1c2VkIHRvIGluZGljYXRlIHRhc2sgY2FuY2VsbGF0aW9uLgorICovCitleHBvcnQgY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBBYm9ydEV4Y2VwdGlvbl9iYXNlIHsKKyAgICBbeDogc3RyaW5nXTogYW55OworfQorZGVjbGFyZSBjb25zdCBJbnZhbGlkUERGRXhjZXB0aW9uX2Jhc2U6IGFueTsKK2V4cG9ydCBjbGFzcyBJbnZhbGlkUERGRXhjZXB0aW9uIGV4dGVuZHMgSW52YWxpZFBERkV4Y2VwdGlvbl9iYXNlIHsKKyAgICBbeDogc3RyaW5nXTogYW55OworfQorZGVjbGFyZSBjb25zdCBNaXNzaW5nUERGRXhjZXB0aW9uX2Jhc2U6IGFueTsKK2V4cG9ydCBjbGFzcyBNaXNzaW5nUERGRXhjZXB0aW9uIGV4dGVuZHMgTWlzc2luZ1BERkV4Y2VwdGlvbl9iYXNlIHsKKyAgICBbeDogc3RyaW5nXTogYW55OworfQorZGVjbGFyZSBjb25zdCBQYXNzd29yZEV4Y2VwdGlvbl9iYXNlOiBhbnk7CitleHBvcnQgY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBQYXNzd29yZEV4Y2VwdGlvbl9iYXNlIHsKKyAgICBbeDogc3RyaW5nXTogYW55OworICAgIGNvbnN0cnVjdG9yKG1zZzogYW55LCBjb2RlOiBhbnkpOworICAgIGNvZGU6IGFueTsKK30KK2V4cG9ydCBuYW1lc3BhY2UgUGFzc3dvcmRSZXNwb25zZXMgeworICAgIGV4cG9ydCBjb25zdCBORUVEX1BBU1NXT1JEOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IElOQ09SUkVDVF9QQVNTV09SRDogbnVtYmVyOworfQorZXhwb3J0IG5hbWVzcGFjZSBQZXJtaXNzaW9uRmxhZyB7CisgICAgY29uc3QgUFJJTlRfMTogbnVtYmVyOworICAgIGV4cG9ydCB7IFBSSU5UXzEgYXMgUFJJTlQgfTsKKyAgICBleHBvcnQgY29uc3QgTU9ESUZZX0NPTlRFTlRTOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IENPUFk6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgTU9ESUZZX0FOTk9UQVRJT05TOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IEZJTExfSU5URVJBQ1RJVkVfRk9STVM6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgQ09QWV9GT1JfQUNDRVNTSUJJTElUWTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBBU1NFTUJMRTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBQUklOVF9ISUdIX1FVQUxJVFk6IG51bWJlcjsKK30KK2V4cG9ydCBuYW1lc3BhY2UgU3RyZWFtVHlwZSB7CisgICAgY29uc3QgVU5LTk9XTl8xOiBzdHJpbmc7CisgICAgZXhwb3J0IHsgVU5LTk9XTl8xIGFzIFVOS05PV04gfTsKKyAgICBleHBvcnQgY29uc3QgRkxBVEU6IHN0cmluZzsKKyAgICBleHBvcnQgY29uc3QgTFpXOiBzdHJpbmc7CisgICAgZXhwb3J0IGNvbnN0IERDVDogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBKUFg6IHN0cmluZzsKKyAgICBleHBvcnQgY29uc3QgSkJJRzogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBBODU6IHN0cmluZzsKKyAgICBleHBvcnQgY29uc3QgQUhYOiBzdHJpbmc7CisgICAgZXhwb3J0IGNvbnN0IENDRjogc3RyaW5nOworICAgIGV4cG9ydCBjb25zdCBSTFg6IHN0cmluZzsKK30KK2V4cG9ydCBuYW1lc3BhY2UgVGV4dFJlbmRlcmluZ01vZGUgeworICAgIGV4cG9ydCBjb25zdCBGSUxMOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IFNUUk9LRTogbnVtYmVyOworICAgIGV4cG9ydCBjb25zdCBGSUxMX1NUUk9LRTogbnVtYmVyOworICAgIGNvbnN0IElOVklTSUJMRV8xOiBudW1iZXI7CisgICAgZXhwb3J0IHsgSU5WSVNJQkxFXzEgYXMgSU5WSVNJQkxFIH07CisgICAgZXhwb3J0IGNvbnN0IEZJTExfQUREX1RPX1BBVEg6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgU1RST0tFX0FERF9UT19QQVRIOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IEZJTExfU1RST0tFX0FERF9UT19QQVRIOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IEFERF9UT19QQVRIOiBudW1iZXI7CisgICAgZXhwb3J0IGNvbnN0IEZJTExfU1RST0tFX01BU0s6IG51bWJlcjsKKyAgICBleHBvcnQgY29uc3QgQUREX1RPX1BBVEhfRkxBRzogbnVtYmVyOworfQorZGVjbGFyZSBjb25zdCBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25fYmFzZTogYW55OworZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbl9iYXNlIHsKKyAgICBbeDogc3RyaW5nXTogYW55OworICAgIGNvbnN0cnVjdG9yKG1zZzogYW55LCBzdGF0dXM6IGFueSk7CisgICAgc3RhdHVzOiBhbnk7Cit9CitkZWNsYXJlIGNvbnN0IFVua25vd25FcnJvckV4Y2VwdGlvbl9iYXNlOiBhbnk7CitleHBvcnQgY2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgVW5rbm93bkVycm9yRXhjZXB0aW9uX2Jhc2UgeworICAgIFt4OiBzdHJpbmddOiBhbnk7CisgICAgY29uc3RydWN0b3IobXNnOiBhbnksIGRldGFpbHM6IGFueSk7CisgICAgZGV0YWlsczogYW55OworfQorZXhwb3J0IGNsYXNzIFV0aWwgeworICAgIHN0YXRpYyBtYWtlQ3NzUmdiKHI6IGFueSwgZzogYW55LCBiOiBhbnkpOiBzdHJpbmc7CisgICAgc3RhdGljIHRyYW5zZm9ybShtMTogYW55LCBtMjogYW55KTogYW55W107CisgICAgc3RhdGljIGFwcGx5VHJhbnNmb3JtKHA6IGFueSwgbTogYW55KTogYW55W107CisgICAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwOiBhbnksIG06IGFueSk6IG51bWJlcltdOworICAgIHN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChyOiBhbnksIG06IGFueSk6IG51bWJlcltdOworICAgIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG06IGFueSk6IG51bWJlcltdOworICAgIHN0YXRpYyBhcHBseTNkVHJhbnNmb3JtKG06IGFueSwgdjogYW55KTogbnVtYmVyW107CisgICAgc3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG06IGFueSk6IG51bWJlcltdOworICAgIHN0YXRpYyBub3JtYWxpemVSZWN0KHJlY3Q6IGFueSk6IGFueTsKKyAgICBzdGF0aWMgaW50ZXJzZWN0KHJlY3QxOiBhbnksIHJlY3QyOiBhbnkpOiBhbnlbXSB8IG51bGw7Cit9CitkZWNsYXJlIGNvbnN0IEZvcm1hdEVycm9yX2Jhc2U6IGFueTsKKy8qKgorICogRXJyb3IgY2F1c2VkIGR1cmluZyBwYXJzaW5nIFBERiBkYXRhLgorICovCitleHBvcnQgY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBGb3JtYXRFcnJvcl9iYXNlIHsKKyAgICBbeDogc3RyaW5nXTogYW55OworfQorLyoqCisgKiBHZXRzIGxlbmd0aCBvZiB0aGUgYXJyYXkgKEFycmF5LCBVaW50OEFycmF5LCBvciBzdHJpbmcpIGluIGJ5dGVzLgorICogQHBhcmFtIHtBcnJheTxhbnk+fFVpbnQ4QXJyYXl8c3RyaW5nfSBhcnIKKyAqIEByZXR1cm5zIHtudW1iZXJ9CisgKi8KK2V4cG9ydCBmdW5jdGlvbiBhcnJheUJ5dGVMZW5ndGgoYXJyOiBBcnJheTxhbnk+IHwgVWludDhBcnJheSB8IHN0cmluZyk6IG51bWJlcjsKKy8qKgorICogQ29tYmluZXMgYXJyYXkgaXRlbXMgKGFycmF5cykgaW50byBzaW5nbGUgVWludDhBcnJheSBvYmplY3QuCisgKiBAcGFyYW0ge0FycmF5PEFycmF5PGFueT58VWludDhBcnJheXxzdHJpbmc+fSBhcnIgLSB0aGUgYXJyYXkgb2YgdGhlIGFycmF5cworICogICAoQXJyYXksIFVpbnQ4QXJyYXksIG9yIHN0cmluZykuCisgKiBAcmV0dXJucyB7VWludDhBcnJheX0KKyAqLworZXhwb3J0IGZ1bmN0aW9uIGFycmF5c1RvQnl0ZXMoYXJyOiBBcnJheTxBcnJheTxhbnk+IHwgVWludDhBcnJheSB8IHN0cmluZz4pOiBVaW50OEFycmF5OworZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kOiBhbnksIG1zZzogYW55KTogdm9pZDsKK2V4cG9ydCBmdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzOiBhbnkpOiBzdHJpbmc7CisvKioKKyAqIFByb21pc2UgQ2FwYWJpbGl0eSBvYmplY3QuCisgKgorICogQHR5cGVkZWYge09iamVjdH0gUHJvbWlzZUNhcGFiaWxpdHkKKyAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxhbnk+fSBwcm9taXNlIC0gQSBQcm9taXNlIG9iamVjdC4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2V0dGxlZCAtIElmIHRoZSBQcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC9yZWplY3RlZC4KKyAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHJlc29sdmUgLSBGdWxmaWxscyB0aGUgUHJvbWlzZS4KKyAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHJlamVjdCAtIFJlamVjdHMgdGhlIFByb21pc2UuCisgKi8KKy8qKgorICogQ3JlYXRlcyBhIHByb21pc2UgY2FwYWJpbGl0eSBvYmplY3QuCisgKiBAYWxpYXMgY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkKKyAqCisgKiBAcmV0dXJucyB7UHJvbWlzZUNhcGFiaWxpdHl9CisgKi8KK2V4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpOiBQcm9taXNlQ2FwYWJpbGl0eTsKK2V4cG9ydCBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwoZGF0YTogYW55LCBjb250ZW50VHlwZTogYW55LCBmb3JjZURhdGFTY2hlbWE/OiBib29sZWFuKTogc3RyaW5nOworZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHI6IGFueSk6IGFueTsKK2V4cG9ydCBmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGU/OiBEYXRlKTogc3RyaW5nOworZXhwb3J0IGZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCk6IG51bWJlcjsKK2V4cG9ydCBmdW5jdGlvbiBpbmZvKG1zZzogYW55KTogdm9pZDsKK2V4cG9ydCBmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHY6IGFueSk6IGJvb2xlYW47CitleHBvcnQgZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycjE6IGFueSwgYXJyMjogYW55KTogYW55OworZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbCh2OiBhbnkpOiBib29sZWFuOworZXhwb3J0IGZ1bmN0aW9uIGlzTnVtKHY6IGFueSk6IGJvb2xlYW47CitleHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodjogYW55KTogYm9vbGVhbjsKK2V4cG9ydCBmdW5jdGlvbiBpc1NhbWVPcmlnaW4oYmFzZVVybDogYW55LCBvdGhlclVybDogYW55KTogYm9vbGVhbjsKKy8qKgorICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgdmFsaWQgYWJzb2x1dGUgVVJMLgorICoKKyAqIEBwYXJhbSB7VVJMfHN0cmluZ30gdXJsIC0gQW4gYWJzb2x1dGUsIG9yIHJlbGF0aXZlLCBVUkwuCisgKiBAcGFyYW0ge1VSTHxzdHJpbmd9IGJhc2VVcmwgLSBBbiBhYnNvbHV0ZSBVUkwuCisgKiBAcmV0dXJucyBFaXRoZXIgYSB2YWxpZCB7VVJMfSwgb3IgYG51bGxgIG90aGVyd2lzZS4KKyAqLworZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwodXJsOiBVUkwgfCBzdHJpbmcsIGJhc2VVcmw6IFVSTCB8IHN0cmluZyk6IFVSTCB8IG51bGw7CitleHBvcnQgbmFtZXNwYWNlIElzTGl0dGxlRW5kaWFuQ2FjaGVkIHsgfQorZXhwb3J0IG5hbWVzcGFjZSBJc0V2YWxTdXBwb3J0ZWRDYWNoZWQgeyB9CisvKioKKyAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKKyAqLworZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU51bGxDaGFyYWN0ZXJzKHN0cjogc3RyaW5nKTogc3RyaW5nOworZXhwb3J0IGZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGxldmVsOiBhbnkpOiB2b2lkOworZXhwb3J0IGZ1bmN0aW9uIHNoYWRvdyhvYmo6IGFueSwgcHJvcDogYW55LCB2YWx1ZTogYW55KTogYW55OworZXhwb3J0IGZ1bmN0aW9uIHN0cmluZzMyKHZhbHVlOiBhbnkpOiBzdHJpbmc7CitleHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHI6IGFueSk6IFVpbnQ4QXJyYXk7CitleHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoc3RyOiBhbnkpOiBzdHJpbmc7CitleHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cjogYW55KTogc3RyaW5nOworZXhwb3J0IGZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhzdHI6IGFueSk6IHN0cmluZzsKK2V4cG9ydCBmdW5jdGlvbiB3YXJuKG1zZzogYW55KTogdm9pZDsKK2V4cG9ydCBmdW5jdGlvbiB1bnJlYWNoYWJsZShtc2c6IGFueSk6IHZvaWQ7CitleHBvcnQge307CmRpZmYgLS1naXQgYS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tY2hlY2suc3ZnIGIvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWNoZWNrLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNkMTZkCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWNoZWNrLnN2ZwpAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHdpZHRoPSI0MCIKKyAgIGhlaWdodD0iNDAiCisgICB2aWV3Qm94PSIwIDAgNDAgNDAiPgorICA8cGF0aAorICAgICBkPSJNIDEuNTAwNjcxNCwyMy41MzYyMjUgNi44OTI1ODc5LDE4Ljk5NDI0NCAxNC41ODU3MjEsMjYuMDM3OTM3IDM0LjAxOTY4Myw0LjU0MTA0NzkgMzguNDk5MzI5LDkuMjIzNTAzMiAxNC41ODU3MjEsMzUuNDU4OTUyIHoiCisgICAgIGlkPSJwYXRoNCIKKyAgICAgc3R5bGU9ImZpbGw6I2ZmZmYwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4yNTQwMjg1NjtzdHJva2Utb3BhY2l0eToxIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tY29tbWVudC5zdmcgYi93ZWIvaW1hZ2VzL2Fubm90YXRpb24tY29tbWVudC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmMWYxNwotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1jb21tZW50LnN2ZwpAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIGhlaWdodD0iNDAiCisgICB3aWR0aD0iNDAiCisgICB2aWV3Qm94PSIwIDAgNDAgNDAiPgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCisgICAgIHdpZHRoPSIzMy43NjAxNyIKKyAgICAgaGVpZ2h0PSIzMy43NjAxNyIKKyAgICAgeD0iMy4xMTk5MTUiCisgICAgIHk9IjMuMTE5OTE1IiAvPgorICA8cGF0aAorICAgICBkPSJtIDIwLjY3Nzk2Nyw4LjU0NDk5IGMgLTcuMzQyODAxLDAgLTEzLjI5NTI5Myw0Ljk1NDI5MyAtMTMuMjk1MjkzLDExLjA2NTc1MSAwLDIuMDg4NzkzIDAuMzY0NzE3MywzLjQ4NDM3NiAxLjU3NTUzOSw1LjE1MDU2MyBMIDYuMDI2NzQxOCwzMS40NTUwMSAxMy41NjA1OTUsMjkuMDExMTE3IGMgMi4yMjEyNjIsMS4zODc5NjIgNC4xMjU5MzIsMS42NjUzNzcgNy4xMTczNzIsMS42NjUzNzcgNy4zNDI4LDAgMTMuMjk1MjkxLC00Ljk1NDI5NSAxMy4yOTUyOTEsLTExLjA2NTc1MyAwLC02LjExMTQ1OCAtNS45NTI0OTEsLTExLjA2NTc1MSAtMTMuMjk1MjkxLC0xMS4wNjU3NTEgeiIKKyAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC45MzAzMTgzNjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1oZWxwLnN2ZyBiL3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1oZWxwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkzOGZlCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWhlbHAuc3ZnCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZworICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgd2lkdGg9IjQwIgorICAgaGVpZ2h0PSI0MCIKKyAgIHZpZXdCb3g9IjAgMCA0MCA0MCI+CisgIDxnCisgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTYwKSIKKyAgICAgaWQ9ImxheWVyMSI+CisgICAgPHJlY3QKKyAgICAgICB3aWR0aD0iMzYuNDYwOTUzIgorICAgICAgIGhlaWdodD0iMzQuODA1NjAzIgorICAgICAgIHg9IjEuNzY5NTIzNiIKKyAgICAgICB5PSI2Mi41OTcxOTgiCisgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmYwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4zMDgyNjc3MTtzdHJva2Utb3BhY2l0eToxIiAvPgorICAgIDxnCisgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44ODc2MzY3NywwLDAsMC44ODc2MzY3NywyLjI0NzI2NDYsOC45ODkwNTg0KSI+CisgICAgICA8cGF0aAorICAgICAgICAgZD0iTSAyMCw2NC41MjYzNDIgQyAxMS40NTQxMzUsNjQuNTI2MzQyIDQuNTI2MzQyMSw3MS40NTQxMzUgNC41MjYzNDIxLDgwIDQuNTI2MzQyMSw4OC41NDU4NjUgMTEuNDU0MTM1LDk1LjQ3MzY1OCAyMCw5NS40NzM2NTggMjguNTQ1ODY1LDk1LjQ3MzY1OCAzNS40NzM2NTgsODguNTQ1ODY1IDM1LjQ3MzY1OCw4MCAzNS40NzM2NTgsNzEuNDU0MTM1IDI4LjU0NTg2NSw2NC41MjYzNDIgMjAsNjQuNTI2MzQyIHogbSAtMC40MDg3MzgsOS40ODg1NjQgYyAzLjUyNzA3OSwwIDYuMzkzODMyLDIuODQwNjEgNi4zOTM4MzIsNi4zMzU0NDEgMCwzLjQ5NDgzMSAtMi44NjY3NTMsNi4zMzU0NDEgLTYuMzkzODMyLDYuMzM1NDQxIC0zLjUyNzA3OSwwIC02LjM5MzgzMiwtMi44NDA2MSAtNi4zOTM4MzIsLTYuMzM1NDQxIDAsLTMuNDk0ODMxIDIuODY2NzUzLC02LjMzNTQ0MSA2LjM5MzgzMiwtNi4zMzU0NDEgeiIKKyAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDI3Njg0NDU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KKyAgICAgIDxwYXRoCisgICAgICAgICBkPSJtIDcuMjMzNTIwOSw3MS44MTk5MzggNC45NzAyNTkxLDQuMTYxODIzIGMgLTEuNjc5OTU2LDIuNTgxNjA2IC0xLjQ0MzkzOSw2LjA2OTU5MiAwLjE1OTMyNSw4LjY3NzcyNSBsIC01LjEyNjMwNzEsMy40MjQ0NjMgYyAwLjY3NTE2LDEuMjMxNDUyIDMuMDE2NjQwMSwzLjU0NzY4NiA0LjIzMzE5NzEsNC4xOTQ3NTcgbCAzLjkwNzcyOCwtNC41NjcyNzcgYyAyLjU0MTk1MiwxLjQ1OTc1IDUuNzMwNjk0LDEuMzkyMTYxIDguNDM4NjgzLC0wLjEyNjE0IGwgMy40Njk1MTcsNi4xMDgzMzYgYyAxLjEyOTc3OSwtMC40NDM2NyA0Ljc0MjIzNCwtMy40NDk2MzMgNS40MTYzNTgsLTUuMDAzODU5IGwgLTUuNDYyMDQsLTQuNDE1NTQxIGMgMS40NDMxOSwtMi40MjQwOTggMS42NTExNzUsLTUuMjY3NTE1IDAuNTU3MzAzLC03Ljc0ODYyMyBsIDUuOTAzMTk1LC0zLjgzMzk1MSBDIDMzLjE0MjU3LDcxLjcwNDk5NiAzMC42MTYyMTcsNjkuMDE4NjA2IDI5LjAyOTUyLDY3Ljk5Mjk2IGwgLTQuMTE4ODEzLDQuOTgxNjc4IEMgMjIuNDExOTM0LDcxLjIwNTA5OSAxOC45MDA4NTMsNzAuOTM3NTM0IDE2LjA0MTMxOSw3Mi4zMjkxNiBsIC0zLjU5NTQwOCwtNS4zMjIwOTEgYyAtMS4zNDU5NjIsMC41Nzk0ODggLTQuMTI5Mzg4MSwyLjkyMTIzMyAtNS4yMTIzOTAxLDQuODEyODY5IHogbSA4LjEwMTAzMTEsMy40MjY2NzIgYyAyLjc1Mjg0LC0yLjQ0NjI2NiA2Ljc2OTE0OSwtMi4xNDQ2OTQgOS4wNDg5OTgsMC40MjA4NzQgMi4yNzk4NDgsMi41NjU1NyAyLjExMzkxOSw2LjU5NjkxOSAtMC42Mzg5MjQsOS4wNDMxODUgLTIuNzUyODQxLDIuNDQ2MjY3IC02Ljc3NTc1NCwyLjEzNzI2IC05LjA1NTYwNCwtMC40MjgzMDggLTIuMjc5ODUxLC0yLjU2NTU2OCAtMi4xMDczMTMsLTYuNTg5NDg1IDAuNjQ1NTMsLTkuMDM1NzUxIHoiCisgICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgorICAgIDwvZz4KKyAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS93ZWIvaW1hZ2VzL2Fubm90YXRpb24taW5zZXJ0LnN2ZyBiL3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1pbnNlcnQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWVmNjgKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvaW1hZ2VzL2Fubm90YXRpb24taW5zZXJ0LnN2ZwpAQCAtMCwwICsxLDEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHdpZHRoPSI2NCIKKyAgIGhlaWdodD0iNjQiCisgICB2aWV3Qm94PSIwIDAgNjQgNjQiPgorICA8cGF0aAorICAgICBkPSJNIDMyLjAwMzE0MywxLjQwNDQ2MDIgNTcuNDMyNzAxLDYyLjYzMjU3NyA2LjU2NzI5OTEsNjIuNjI3OTI0IHoiCisgICAgIHN0eWxlPSJmaWxsOiNmZmZmMDA7ZmlsbC1vcGFjaXR5OjAuOTQxMTc2NDc7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDA0OTMwMzg7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWtleS5zdmcgYi93ZWIvaW1hZ2VzL2Fubm90YXRpb24ta2V5LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA5ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLWtleS5zdmcKQEAgLTAsMCArMSwxMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB3aWR0aD0iNjQiCisgICBoZWlnaHQ9IjY0IgorICAgdmlld0JveD0iMCAwIDY0IDY0Ij4KKyAgPHBhdGgKKyAgICAgZD0iTSAyNS40NzA4NDMsOS40OTMzNzY2IEMgMjUuMzAyMTksMTIuMTQxODE4IDMwLjEzOTEwMSwxNC40NDU5NjkgMzQuNzA0ODMxLDEzLjUyOTE0NCA0MC42MjYzNSwxMi41NDE5OTUgNDEuMzk4ODMzLDcuMzg1NjQ5OCAzNS45NzUwNSw1Ljc3Nzg2MyAzMS40MDA5MjEsNC4xNTQ5MTU1IDI1LjE1NzY3NCw2LjU0NDU4OTIgMjUuNDcwODQzLDkuNDkzMzc2NiB6IE0gNC41MjQ2MjgyLDE3LjY1MjA1MSBDIDQuMDY4MjQ5LDExLjgzMjg3MyA5LjI3NDI5ODMsNS45MjcwNDA3IDE4LjQzNzM3OSwzLjA5NzcwODggMjkuNzUxOTExLC0wLjg3MTg1MTg0IDQ1LjQ5NTY2MywxLjQwMDgwMjIgNTMuNjAzOTUzLDcuMTEwNDAwOSBjIDkuMjc1NzY1LDYuMTg4OTIyMSA3LjE1ODEyOCwxNi4yMDc5NDIxIC0zLjE3MTA3NiwyMS41OTM5NTIxIC0xLjc4NDMxNiwxLjYzNTgxNSAtNi4zODAyMjIsMS4yMTQyMSAtNy4wNjgzNTEsMy4xODYxODYgLTEuMDQwMDMsMC45NzI0MjcgLTEuMjg4MDQ2LDIuMDUwMTU4IC0xLjIzMjg2NCwzLjE2ODIwMyAxLjAxNTExMSwyLjAwMDEwOCAtMy44MzE1NDgsMS42MzMyMTYgLTMuMjcwNTUzLDMuNzU5NTc0IDAuNTg5NDc3LDUuMjY0NTQ0IC0wLjE3OTI3NiwxMC41MzczOCAtMC4zNjI4NDIsMTUuODA2MjU3IC0wLjQ5MjAwNiwyLjE4NDk5OCAxLjE2MzQ1Niw0LjU3NDIzMiAtMC43MzQ4ODgsNi42MTA2NDIgLTIuNDgyOTE5LDIuMzI1MTg0IC03LjMwNjA0LDIuMTg5MTQzIC05LjE5MzQ5NywtMC4yNzQ3NjcgLTIuNzMzNjg4LC0xLjc0MDYyNiAtOC4yNTQ0NDcsLTMuNjE1MjU0IC02LjEwNDI0NywtNi4zMzk2MjYgMy40NjgxMTIsLTEuNzA4Njg2IC0yLjExNjE5NywtMy40NDk4OTcgMC40MzEyNDIsLTUuMDgwMjc0IDUuMDU4NDAyLC0xLjM5MjU2IC0yLjM5MzIxNSwtMi4zMDQzMTggLTAuMTQ2ODg5LC00LjMzNDY0NSAzLjA2OTE5OCwtMC45Nzc0MTUgMi4wNTY5ODYsLTIuNTE4MzUyIC0wLjIxOTEyMSwtMy41NDAzOTcgMS44NzY1NjcsLTEuODA3MTUxIDEuNDg0MTQ5LC00Ljg2ODkxOSAtMi41NjU0NTUsLTUuOTQyMjA1IDAuMTUwODY2LC0xLjgwNTQ3NCAyLjkwNTczNywtNC4xMzY4NzYgLTEuNjc5OTY3LC01LjIwNDkzIEMgMTAuMjYwOTAyLDI3Ljg4MjE2NyA0LjY4NzI2OTcsMjIuOTUwNDUgNC41MjQ1OTQ1LDE3LjY1MjA1MSB6IgorICAgICBpZD0icGF0aDYwNCIKKyAgICAgc3R5bGU9ImZpbGw6I2ZmZmYwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS43MjY2NTE3OTtzdHJva2Utb3BhY2l0eToxIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS93ZWIvaW1hZ2VzL2Fubm90YXRpb24tbmV3cGFyYWdyYXBoLnN2ZyBiL3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1uZXdwYXJhZ3JhcGguc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDI0OTcKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvaW1hZ2VzL2Fubm90YXRpb24tbmV3cGFyYWdyYXBoLnN2ZwpAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHdpZHRoPSI2NCIKKyAgIGhlaWdodD0iNjQiCisgICB2aWV3Qm94PSIwIDAgNjQgNjQiPgorICA8cGF0aAorICAgICBkPSJNIDMyLjAwMzE0MywxMC45MTMwNzIgNTcuNDMyNzAxLDUzLjA4NjkyOSA2LjU2NzI5OSw1My4wODM3MjMgeiIKKyAgICAgaWQ9InBhdGgyOTg1IgorICAgICBzdHlsZT0iZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eTowLjk0MTE3NjQ3O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjgzNDAzMDk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1ub2ljb24uc3ZnIGIvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLW5vaWNvbi5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3ZDEwOAotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9pbWFnZXMvYW5ub3RhdGlvbi1ub2ljb24uc3ZnCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB3aWR0aD0iNDAiCisgICBoZWlnaHQ9IjQwIgorICAgdmlld0JveD0iMCAwIDQwIDQwIj4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLW5vdGUuc3ZnIGIvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLW5vdGUuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTczNjUKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvaW1hZ2VzL2Fubm90YXRpb24tbm90ZS5zdmcKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB3aWR0aD0iNDAiCisgICBoZWlnaHQ9IjQwIgorICAgdmlld0JveD0iMCAwIDQwIDQwIj4KKyAgPHJlY3QKKyAgICAgd2lkdGg9IjM2LjA3NTQyOCIKKyAgICAgaGVpZ2h0PSIzMS4wOTY1ODIiCisgICAgIHg9IjEuOTYyMjg2IgorICAgICB5PSI0LjQ1MTcwODgiCisgICAgIGlkPSJyZWN0NCIKKyAgICAgc3R5bGU9ImZpbGw6I2ZmZmYwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4yMzAwNDI0NjtzdHJva2Utb3BhY2l0eToxIiAvPgorICA8cmVjdAorICAgICB3aWR0aD0iMjcuOTY4NTkiCisgICAgIGhlaWdodD0iMS41MDEyMTQ1IgorICAgICB4PSI2LjAxNTcwNDYiCisgICAgIHk9IjEwLjI4NSIKKyAgICAgaWQ9InJlY3Q2IgorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgorICA8cmVjdAorICAgICB3aWR0aD0iMjcuOTY4NTkiCisgICAgIGhlaWdodD0iMC44NTc4MzY4NCIKKyAgICAgeD0iNi4wMTU3MDU2IgorICAgICB5PSIyMy4yMTY4OSIKKyAgICAgaWQ9InJlY3Q4IgorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgorICA8cmVjdAorICAgICB3aWR0aD0iMjcuOTY4NTkiCisgICAgIGhlaWdodD0iMC44NTc4MzY4NCIKKyAgICAgeD0iNS44MTMwMzQ1IgorICAgICB5PSIyOC45NjQzOTQiCisgICAgIGlkPSJyZWN0MTAiCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CisgIDxyZWN0CisgICAgIHdpZHRoPSIyNy45Njg1OSIKKyAgICAgaGVpZ2h0PSIwLjg1NzgzNjg0IgorICAgICB4PSI2LjAxNTcwNDYiCisgICAgIHk9IjE3LjQyNjQ5MyIKKyAgICAgaWQ9InJlY3QxMiIKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLXBhcmFncmFwaC5zdmcgYi93ZWIvaW1hZ2VzL2Fubm90YXRpb24tcGFyYWdyYXBoLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU1MjEyCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL2ltYWdlcy9hbm5vdGF0aW9uLXBhcmFncmFwaC5zdmcKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB3aWR0aD0iNDAiCisgICBoZWlnaHQ9IjQwIgorICAgdmlld0JveD0iMCAwIDQwIDQwIj4KKyAgPHJlY3QKKyAgICAgd2lkdGg9IjMzLjc2MDE3IgorICAgICBoZWlnaHQ9IjMzLjc2MDE3IgorICAgICB4PSIzLjExOTkxNSIKKyAgICAgeT0iMy4xMTk5MTUiCisgICAgIHN0eWxlPSJmaWxsOiNmZmZmMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KKyAgPHBhdGgKKyAgICAgZD0ibSAxNy42OTI2NzgsMzQuNTAyMDYgMCwtMTYuMTgyMjI0IGMgLTEuOTMwNTE1LC0wLjEwMzIyNSAtMy40NTU4MjQsLTAuNzMwMzgzIC00LjU3NTkzLC0xLjg4MTQ3MyAtMS4xMjAxMSwtMS4xNTEwNjcgLTEuNjgwMTY0LC0yLjYxOTU5NiAtMS42ODAxNjQsLTQuNDA1NTkxIDAsLTEuOTkyNDM1IDAuNjIxOTk1LC0zLjU3OTY4NDkgMS44NjU5ODgsLTQuNzYxNzU1MyAxLjI0Mzk4OSwtMS4xODIwMjg4IDMuMDYzNTIsLTEuNzczMDUzNiA1LjQ1ODU5OCwtMS43NzMwNzY0IGwgOS44MDIyNDYsMCAwLDIuNjc4OTcxMSAtMi4yMjk4OTUsMCAwLDI2LjMyNTE0ODYgLTIuNjMyNTE1LDAgMCwtMjYuMzI1MTQ4NiAtMy40NTMyNCwwIDAsMjYuMzI1MTQ4NiB6IgorICAgICBzdHlsZT0iZm9udC1zaXplOjI5LjQyMDUxMTI1cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWFsaWduOnN0YXJ0O2xpbmUtaGVpZ2h0OjEyNSU7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wNzc5NTc1MTtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OkFyaWFsOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246QXJpYWwiIC8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3dlYi9pbWFnZXMvbG9hZGluZy1pY29uLmdpZiBiL3dlYi9pbWFnZXMvbG9hZGluZy1pY29uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzcyZWJiCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL2ltYWdlcy9sb2FkaW5nLWljb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3dlYi9pbWFnZXMvc2hhZG93LnBuZyBiL3dlYi9pbWFnZXMvc2hhZG93LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAwNjFhCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL2ltYWdlcy9zaGFkb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3dlYi9wZGZfdmlld2VyLmNzcyBiL3dlYi9wZGZfdmlld2VyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE0MTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BkZl92aWV3ZXIuY3NzCkBAIC0wLDAgKzEsNDA2IEBACisvKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisudGV4dExheWVyIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAwOworICB0b3A6IDA7CisgIHJpZ2h0OiAwOworICBib3R0b206IDA7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIG9wYWNpdHk6IDAuMjsKKyAgbGluZS1oZWlnaHQ6IDE7Cit9CisKKy50ZXh0TGF5ZXIgPiBzcGFuIHsKKyAgY29sb3I6IHRyYW5zcGFyZW50OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHdoaXRlLXNwYWNlOiBwcmU7CisgIGN1cnNvcjogdGV4dDsKKyAgdHJhbnNmb3JtLW9yaWdpbjogMCUgMCU7Cit9CisKKy50ZXh0TGF5ZXIgLmhpZ2hsaWdodCB7CisgIG1hcmdpbjogLTFweDsKKyAgcGFkZGluZzogMXB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE4MCwgMCwgMTcwLCAxKTsKKyAgYm9yZGVyLXJhZGl1czogNHB4OworfQorCisudGV4dExheWVyIC5oaWdobGlnaHQuYmVnaW4geworICBib3JkZXItcmFkaXVzOiA0cHggMHB4IDBweCA0cHg7Cit9CisKKy50ZXh0TGF5ZXIgLmhpZ2hsaWdodC5lbmQgeworICBib3JkZXItcmFkaXVzOiAwcHggNHB4IDRweCAwcHg7Cit9CisKKy50ZXh0TGF5ZXIgLmhpZ2hsaWdodC5taWRkbGUgeworICBib3JkZXItcmFkaXVzOiAwcHg7Cit9CisKKy50ZXh0TGF5ZXIgLmhpZ2hsaWdodC5zZWxlY3RlZCB7CisgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMTAwLCAwLCAxKTsKK30KKworLnRleHRMYXllciA6Oi1tb3otc2VsZWN0aW9uIHsKKyAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAyNTUsIDEpOworfQorCisudGV4dExheWVyIDo6c2VsZWN0aW9uIHsKKyAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAyNTUsIDEpOworfQorCisudGV4dExheWVyIC5lbmRPZkNvbnRlbnQgeworICBkaXNwbGF5OiBibG9jazsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAwcHg7CisgIHRvcDogMTAwJTsKKyAgcmlnaHQ6IDBweDsKKyAgYm90dG9tOiAwcHg7CisgIHotaW5kZXg6IC0xOworICBjdXJzb3I6IGRlZmF1bHQ7CisgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CisgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CisgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CisgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7Cit9CisKKy50ZXh0TGF5ZXIgLmVuZE9mQ29udGVudC5hY3RpdmUgeworICB0b3A6IDBweDsKK30KKworCisuYW5ub3RhdGlvbkxheWVyIHNlY3Rpb24geworICBwb3NpdGlvbjogYWJzb2x1dGU7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLmxpbmtBbm5vdGF0aW9uID4gYSwKKy5hbm5vdGF0aW9uTGF5ZXIgLmJ1dHRvbldpZGdldEFubm90YXRpb24ucHVzaEJ1dHRvbiA+IGEgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGZvbnQtc2l6ZTogMWVtOworICB0b3A6IDA7CisgIGxlZnQ6IDA7CisgIHdpZHRoOiAxMDAlOworICBoZWlnaHQ6IDEwMCU7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLmxpbmtBbm5vdGF0aW9uID4gYTpob3ZlciwKKy5hbm5vdGF0aW9uTGF5ZXIgLmJ1dHRvbldpZGdldEFubm90YXRpb24ucHVzaEJ1dHRvbiA+IGE6aG92ZXIgeworICBvcGFjaXR5OiAwLjI7CisgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDAsIDEpOworICBib3gtc2hhZG93OiAwcHggMnB4IDEwcHggcmdiYSgyNTUsIDI1NSwgMCwgMSk7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnRleHRBbm5vdGF0aW9uIGltZyB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgY3Vyc29yOiBwb2ludGVyOworfQorCisuYW5ub3RhdGlvbkxheWVyIC50ZXh0V2lkZ2V0QW5ub3RhdGlvbiBpbnB1dCwKKy5hbm5vdGF0aW9uTGF5ZXIgLnRleHRXaWRnZXRBbm5vdGF0aW9uIHRleHRhcmVhLAorLmFubm90YXRpb25MYXllciAuY2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiBzZWxlY3QsCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0LAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5yYWRpb0J1dHRvbiBpbnB1dCB7CisgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgNTQsIDI1NSwgMC4xMyk7CisgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICBmb250LXNpemU6IDlweDsKKyAgaGVpZ2h0OiAxMDAlOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDAgM3B4OworICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICB3aWR0aDogMTAwJTsKK30KKworLmFubm90YXRpb25MYXllciAuY2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiBzZWxlY3Qgb3B0aW9uIHsKKyAgcGFkZGluZzogMDsKK30KKworLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5yYWRpb0J1dHRvbiBpbnB1dCB7CisgIGJvcmRlci1yYWRpdXM6IDUwJTsKK30KKworLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gdGV4dGFyZWEgeworICBmb250OiBtZXNzYWdlLWJveDsKKyAgZm9udC1zaXplOiA5cHg7CisgIHJlc2l6ZTogbm9uZTsKK30KKworLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gaW5wdXRbZGlzYWJsZWRdLAorLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gdGV4dGFyZWFbZGlzYWJsZWRdLAorLmFubm90YXRpb25MYXllciAuY2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiBzZWxlY3RbZGlzYWJsZWRdLAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5jaGVja0JveCBpbnB1dFtkaXNhYmxlZF0sCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLnJhZGlvQnV0dG9uIGlucHV0W2Rpc2FibGVkXSB7CisgIGJhY2tncm91bmQ6IG5vbmU7CisgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OworICBjdXJzb3I6IG5vdC1hbGxvd2VkOworfQorCisuYW5ub3RhdGlvbkxheWVyIC50ZXh0V2lkZ2V0QW5ub3RhdGlvbiBpbnB1dDpob3ZlciwKKy5hbm5vdGF0aW9uTGF5ZXIgLnRleHRXaWRnZXRBbm5vdGF0aW9uIHRleHRhcmVhOmhvdmVyLAorLmFubm90YXRpb25MYXllciAuY2hvaWNlV2lkZ2V0QW5ub3RhdGlvbiBzZWxlY3Q6aG92ZXIsCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0OmhvdmVyLAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5yYWRpb0J1dHRvbiBpbnB1dDpob3ZlciB7CisgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMSk7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnRleHRXaWRnZXRBbm5vdGF0aW9uIGlucHV0OmZvY3VzLAorLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gdGV4dGFyZWE6Zm9jdXMsCisuYW5ub3RhdGlvbkxheWVyIC5jaG9pY2VXaWRnZXRBbm5vdGF0aW9uIHNlbGVjdDpmb2N1cyB7CisgIGJhY2tncm91bmQ6IG5vbmU7CisgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OworfQorCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0OmNoZWNrZWQ6YmVmb3JlLAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5jaGVja0JveCBpbnB1dDpjaGVja2VkOmFmdGVyLAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5yYWRpb0J1dHRvbiBpbnB1dDpjaGVja2VkOmJlZm9yZSB7CisgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMSk7CisgIGNvbnRlbnQ6ICIiOworICBkaXNwbGF5OiBibG9jazsKKyAgcG9zaXRpb246IGFic29sdXRlOworfQorCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0OmNoZWNrZWQ6YmVmb3JlLAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5jaGVja0JveCBpbnB1dDpjaGVja2VkOmFmdGVyIHsKKyAgaGVpZ2h0OiA4MCU7CisgIGxlZnQ6IDQ1JTsKKyAgd2lkdGg6IDFweDsKK30KKworLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5jaGVja0JveCBpbnB1dDpjaGVja2VkOmJlZm9yZSB7CisgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTsKK30KKworLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5jaGVja0JveCBpbnB1dDpjaGVja2VkOmFmdGVyIHsKKyAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsKK30KKworLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5yYWRpb0J1dHRvbiBpbnB1dDpjaGVja2VkOmJlZm9yZSB7CisgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgaGVpZ2h0OiA1MCU7CisgIGxlZnQ6IDMwJTsKKyAgdG9wOiAyMCU7CisgIHdpZHRoOiA1MCU7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnRleHRXaWRnZXRBbm5vdGF0aW9uIGlucHV0LmNvbWIgeworICBmb250LWZhbWlseTogbW9ub3NwYWNlOworICBwYWRkaW5nLWxlZnQ6IDJweDsKKyAgcGFkZGluZy1yaWdodDogMDsKK30KKworLmFubm90YXRpb25MYXllciAudGV4dFdpZGdldEFubm90YXRpb24gaW5wdXQuY29tYjpmb2N1cyB7CisgIC8qCisgICAqIExldHRlciBzcGFjaW5nIGlzIHBsYWNlZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiBlYWNoIGNoYXJhY3Rlci4gSGVuY2UsIHRoZQorICAgKiBsZXR0ZXIgc3BhY2luZyBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgbWF5IGJlIHBsYWNlZCBvdXRzaWRlIHRoZSB2aXNpYmxlCisgICAqIGFyZWEsIGNhdXNpbmcgaG9yaXpvbnRhbCBzY3JvbGxpbmcuIFdlIGF2b2lkIHRoaXMgYnkgZXh0ZW5kaW5nIHRoZSB3aWR0aAorICAgKiB3aGVuIHRoZSBlbGVtZW50IGhhcyBmb2N1cyBhbmQgcmV2ZXJ0IHRoaXMgd2hlbiBpdCBsb3NlcyBmb2N1cy4KKyAgICovCisgIHdpZHRoOiAxMTUlOworfQorCisuYW5ub3RhdGlvbkxheWVyIC5idXR0b25XaWRnZXRBbm5vdGF0aW9uLmNoZWNrQm94IGlucHV0LAorLmFubm90YXRpb25MYXllciAuYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbi5yYWRpb0J1dHRvbiBpbnB1dCB7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKKyAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOworICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CisgIHBhZGRpbmc6IDA7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnBvcHVwV3JhcHBlciB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgd2lkdGg6IDIwZW07Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnBvcHVwIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB6LWluZGV4OiAyMDA7CisgIG1heC13aWR0aDogMjBlbTsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMTUzLCAxKTsKKyAgYm94LXNoYWRvdzogMHB4IDJweCA1cHggcmdiYSgxMzYsIDEzNiwgMTM2LCAxKTsKKyAgYm9yZGVyLXJhZGl1czogMnB4OworICBwYWRkaW5nOiA2cHg7CisgIG1hcmdpbi1sZWZ0OiA1cHg7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgZm9udDogbWVzc2FnZS1ib3g7CisgIGZvbnQtc2l6ZTogOXB4OworICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLnBvcHVwID4gKiB7CisgIGZvbnQtc2l6ZTogOXB4OworfQorCisuYW5ub3RhdGlvbkxheWVyIC5wb3B1cCBoMSB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKK30KKworLmFubm90YXRpb25MYXllciAucG9wdXAgc3BhbiB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgbWFyZ2luLWxlZnQ6IDVweDsKK30KKworLmFubm90YXRpb25MYXllciAucG9wdXAgcCB7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDUxLCA1MSwgNTEsIDEpOworICBtYXJnaW4tdG9wOiAycHg7CisgIHBhZGRpbmctdG9wOiAycHg7Cit9CisKKy5hbm5vdGF0aW9uTGF5ZXIgLmhpZ2hsaWdodEFubm90YXRpb24sCisuYW5ub3RhdGlvbkxheWVyIC51bmRlcmxpbmVBbm5vdGF0aW9uLAorLmFubm90YXRpb25MYXllciAuc3F1aWdnbHlBbm5vdGF0aW9uLAorLmFubm90YXRpb25MYXllciAuc3RyaWtlb3V0QW5ub3RhdGlvbiwKKy5hbm5vdGF0aW9uTGF5ZXIgLmZyZWVUZXh0QW5ub3RhdGlvbiwKKy5hbm5vdGF0aW9uTGF5ZXIgLmxpbmVBbm5vdGF0aW9uIHN2ZyBsaW5lLAorLmFubm90YXRpb25MYXllciAuc3F1YXJlQW5ub3RhdGlvbiBzdmcgcmVjdCwKKy5hbm5vdGF0aW9uTGF5ZXIgLmNpcmNsZUFubm90YXRpb24gc3ZnIGVsbGlwc2UsCisuYW5ub3RhdGlvbkxheWVyIC5wb2x5bGluZUFubm90YXRpb24gc3ZnIHBvbHlsaW5lLAorLmFubm90YXRpb25MYXllciAucG9seWdvbkFubm90YXRpb24gc3ZnIHBvbHlnb24sCisuYW5ub3RhdGlvbkxheWVyIC5jYXJldEFubm90YXRpb24sCisuYW5ub3RhdGlvbkxheWVyIC5pbmtBbm5vdGF0aW9uIHN2ZyBwb2x5bGluZSwKKy5hbm5vdGF0aW9uTGF5ZXIgLnN0YW1wQW5ub3RhdGlvbiwKKy5hbm5vdGF0aW9uTGF5ZXIgLmZpbGVBdHRhY2htZW50QW5ub3RhdGlvbiB7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKworLnBkZlZpZXdlciAuY2FudmFzV3JhcHBlciB7CisgIG92ZXJmbG93OiBoaWRkZW47Cit9CisKKy5wZGZWaWV3ZXIgLnBhZ2UgeworICBkaXJlY3Rpb246IGx0cjsKKyAgd2lkdGg6IDgxNnB4OworICBoZWlnaHQ6IDEwNTZweDsKKyAgbWFyZ2luOiAxcHggYXV0byAtOHB4IGF1dG87CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgb3ZlcmZsb3c6IHZpc2libGU7CisgIGJvcmRlcjogOXB4IHNvbGlkIHRyYW5zcGFyZW50OworICBiYWNrZ3JvdW5kLWNsaXA6IGNvbnRlbnQtYm94OworICAtby1ib3JkZXItaW1hZ2U6IHVybChpbWFnZXMvc2hhZG93LnBuZykgOSA5IHJlcGVhdDsKKyAgICAgYm9yZGVyLWltYWdlOiB1cmwoaW1hZ2VzL3NoYWRvdy5wbmcpIDkgOSByZXBlYXQ7CisgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMSk7Cit9CisKKy5wZGZWaWV3ZXIucmVtb3ZlUGFnZUJvcmRlcnMgLnBhZ2UgeworICBtYXJnaW46IDBweCBhdXRvIDEwcHggYXV0bzsKKyAgYm9yZGVyOiBub25lOworfQorCisucGRmVmlld2VyLnNpbmdsZVBhZ2VWaWV3IHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworfQorCisucGRmVmlld2VyLnNpbmdsZVBhZ2VWaWV3IC5wYWdlIHsKKyAgbWFyZ2luOiAwOworICBib3JkZXI6IG5vbmU7Cit9CisKKy5wZGZWaWV3ZXIuc2Nyb2xsSG9yaXpvbnRhbCwKKy5wZGZWaWV3ZXIuc2Nyb2xsV3JhcHBlZCwKKy5zcHJlYWQgeworICBtYXJnaW4tbGVmdDogMy41cHg7CisgIG1hcmdpbi1yaWdodDogMy41cHg7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLnBkZlZpZXdlci5zY3JvbGxIb3Jpem9udGFsLAorLnNwcmVhZCB7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5wZGZWaWV3ZXIucmVtb3ZlUGFnZUJvcmRlcnMsCisucGRmVmlld2VyLnNjcm9sbEhvcml6b250YWwgLnNwcmVhZCwKKy5wZGZWaWV3ZXIuc2Nyb2xsV3JhcHBlZCAuc3ByZWFkIHsKKyAgbWFyZ2luLWxlZnQ6IDA7CisgIG1hcmdpbi1yaWdodDogMDsKK30KKworLnNwcmVhZCAucGFnZSwKKy5wZGZWaWV3ZXIuc2Nyb2xsSG9yaXpvbnRhbCAucGFnZSwKKy5wZGZWaWV3ZXIuc2Nyb2xsV3JhcHBlZCAucGFnZSwKKy5wZGZWaWV3ZXIuc2Nyb2xsSG9yaXpvbnRhbCAuc3ByZWFkLAorLnBkZlZpZXdlci5zY3JvbGxXcmFwcGVkIC5zcHJlYWQgeworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy5zcHJlYWQgLnBhZ2UsCisucGRmVmlld2VyLnNjcm9sbEhvcml6b250YWwgLnBhZ2UsCisucGRmVmlld2VyLnNjcm9sbFdyYXBwZWQgLnBhZ2UgeworICBtYXJnaW4tbGVmdDogLTMuNXB4OworICBtYXJnaW4tcmlnaHQ6IC0zLjVweDsKK30KKworLnBkZlZpZXdlci5yZW1vdmVQYWdlQm9yZGVycyAuc3ByZWFkIC5wYWdlLAorLnBkZlZpZXdlci5yZW1vdmVQYWdlQm9yZGVycy5zY3JvbGxIb3Jpem9udGFsIC5wYWdlLAorLnBkZlZpZXdlci5yZW1vdmVQYWdlQm9yZGVycy5zY3JvbGxXcmFwcGVkIC5wYWdlIHsKKyAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgbWFyZ2luLXJpZ2h0OiA1cHg7Cit9CisKKy5wZGZWaWV3ZXIgLnBhZ2UgY2FudmFzIHsKKyAgbWFyZ2luOiAwOworICBkaXNwbGF5OiBibG9jazsKK30KKworLnBkZlZpZXdlciAucGFnZSBjYW52YXNbaGlkZGVuXSB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKy5wZGZWaWV3ZXIgLnBhZ2UgLmxvYWRpbmdJY29uIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBkaXNwbGF5OiBibG9jazsKKyAgbGVmdDogMDsKKyAgdG9wOiAwOworICByaWdodDogMDsKKyAgYm90dG9tOiAwOworICBiYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9sb2FkaW5nLWljb24uZ2lmIikgY2VudGVyIG5vLXJlcGVhdDsKK30KKworLnBkZlByZXNlbnRhdGlvbk1vZGUgLnBkZlZpZXdlciB7CisgIG1hcmdpbi1sZWZ0OiAwOworICBtYXJnaW4tcmlnaHQ6IDA7Cit9CisKKy5wZGZQcmVzZW50YXRpb25Nb2RlIC5wZGZWaWV3ZXIgLnBhZ2UsCisucGRmUHJlc2VudGF0aW9uTW9kZSAucGRmVmlld2VyIC5zcHJlYWQgeworICBkaXNwbGF5OiBibG9jazsKK30KKworLnBkZlByZXNlbnRhdGlvbk1vZGUgLnBkZlZpZXdlciAucGFnZSwKKy5wZGZQcmVzZW50YXRpb25Nb2RlIC5wZGZWaWV3ZXIucmVtb3ZlUGFnZUJvcmRlcnMgLnBhZ2UgeworICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgbWFyZ2luLXJpZ2h0OiBhdXRvOworfQorCisucGRmUHJlc2VudGF0aW9uTW9kZTotbXMtZnVsbHNjcmVlbiAucGRmVmlld2VyIC5wYWdlIHsKKyAgbWFyZ2luLWJvdHRvbTogMTAwJSAhaW1wb3J0YW50OworfQorCisucGRmUHJlc2VudGF0aW9uTW9kZTotd2Via2l0LWZ1bGwtc2NyZWVuIC5wZGZWaWV3ZXIgLnBhZ2UgeworICBtYXJnaW4tYm90dG9tOiAxMDAlOworICBib3JkZXI6IDA7Cit9CisKKy5wZGZQcmVzZW50YXRpb25Nb2RlOi1tb3otZnVsbC1zY3JlZW4gLnBkZlZpZXdlciAucGFnZSB7CisgIG1hcmdpbi1ib3R0b206IDEwMCU7CisgIGJvcmRlcjogMDsKK30KKworLnBkZlByZXNlbnRhdGlvbk1vZGU6ZnVsbHNjcmVlbiAucGRmVmlld2VyIC5wYWdlIHsKKyAgbWFyZ2luLWJvdHRvbTogMTAwJTsKKyAgYm9yZGVyOiAwOworfQpkaWZmIC0tZ2l0IGEvd2ViL3BkZl92aWV3ZXIuanMgYi93ZWIvcGRmX3ZpZXdlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTE3YTVkCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BkZl92aWV3ZXIuanMKQEAgLTAsMCArMSw2NDQwIEBACisvKioKKyAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICoKKyAqIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQorICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQorICovCisKKyhmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7CisJaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKQorCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKKwllbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkKKwkJZGVmaW5lKCJwZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyIiwgW10sIGZhY3RvcnkpOworCWVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKQorCQlleHBvcnRzWyJwZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyIl0gPSBmYWN0b3J5KCk7CisJZWxzZQorCQlyb290WyJwZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyIl0gPSByb290LnBkZmpzVmlld2VyID0gZmFjdG9yeSgpOworfSkodGhpcywgZnVuY3Rpb24oKSB7CityZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcAorLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKKy8qKioqKiovIAl2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBUaGUgcmVxdWlyZSBmdW5jdGlvbgorLyoqKioqKi8gCWZ1bmN0aW9uIF9fd19wZGZqc19yZXF1aXJlX18obW9kdWxlSWQpIHsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQorLyoqKioqKi8gCQlpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkgeworLyoqKioqKi8gCQkJcmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7CisvKioqKioqLyAJCX0KKy8qKioqKiovIAkJLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSkKKy8qKioqKiovIAkJdmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0geworLyoqKioqKi8gCQkJaTogbW9kdWxlSWQsCisvKioqKioqLyAJCQlsOiBmYWxzZSwKKy8qKioqKiovIAkJCWV4cG9ydHM6IHt9CisvKioqKioqLyAJCX07CisvKioqKioqLworLyoqKioqKi8gCQkvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb24KKy8qKioqKiovIAkJbW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXyk7CisvKioqKioqLworLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCisvKioqKioqLyAJCW1vZHVsZS5sID0gdHJ1ZTsKKy8qKioqKiovCisvKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCisvKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsKKy8qKioqKiovIAl9CisvKioqKioqLworLyoqKioqKi8KKy8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQorLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ubSA9IG1vZHVsZXM7CisvKioqKioqLworLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7CisvKioqKioqLyAJCWlmKCFfX3dfcGRmanNfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHsKKy8qKioqKiovIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pOworLyoqKioqKi8gCQl9CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0cworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHsKKy8qKioqKiovIAkJaWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7CisvKioqKioqLyAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTsKKy8qKioqKiovIAkJfQorLyoqKioqKi8gCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOworLyoqKioqKi8gCX07CisvKioqKioqLworLyoqKioqKi8gCS8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdAorLyoqKioqKi8gCS8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdAorLyoqKioqKi8gCS8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBucworLyoqKioqKi8gCS8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdAorLyoqKioqKi8gCS8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmUKKy8qKioqKiovIAlfX3dfcGRmanNfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkgeworLyoqKioqKi8gCQlpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKHZhbHVlKTsKKy8qKioqKiovIAkJaWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTsKKy8qKioqKiovIAkJaWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTsKKy8qKioqKiovIAkJdmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKy8qKioqKiovIAkJX193X3BkZmpzX3JlcXVpcmVfXy5yKG5zKTsKKy8qKioqKiovIAkJT2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pOworLyoqKioqKi8gCQlpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dfcGRmanNfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7CisvKioqKioqLyAJCXJldHVybiBuczsKKy8qKioqKiovIAl9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlcworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkgeworLyoqKioqKi8gCQl2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8KKy8qKioqKiovIAkJCWZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6CisvKioqKioqLyAJCQlmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9OworLyoqKioqKi8gCQlfX3dfcGRmanNfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7CisvKioqKioqLyAJCXJldHVybiBnZXR0ZXI7CisvKioqKioqLyAJfTsKKy8qKioqKiovCisvKioqKioqLyAJLy8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsCisvKioqKioqLyAJX193X3BkZmpzX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9OworLyoqKioqKi8KKy8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXworLyoqKioqKi8gCV9fd19wZGZqc19yZXF1aXJlX18ucCA9ICIiOworLyoqKioqKi8KKy8qKioqKiovCisvKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCisvKioqKioqLyAJcmV0dXJuIF9fd19wZGZqc19yZXF1aXJlX18oX193X3BkZmpzX3JlcXVpcmVfXy5zID0gMCk7CisvKioqKioqLyB9KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiovIChbCisvKiAwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiQW5ub3RhdGlvbkxheWVyQnVpbGRlciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIuQW5ub3RhdGlvbkxheWVyQnVpbGRlcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkRlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlci5EZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeTsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkRlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3RleHRfbGF5ZXJfYnVpbGRlci5EZWZhdWx0VGV4dExheWVyRmFjdG9yeTsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlRleHRMYXllckJ1aWxkZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdGV4dF9sYXllcl9idWlsZGVyLlRleHRMYXllckJ1aWxkZXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJFdmVudEJ1cyIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF91aV91dGlscy5FdmVudEJ1czsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIk51bGxMMTBuIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3VpX3V0aWxzLk51bGxMMTBuOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUHJvZ3Jlc3NCYXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfdWlfdXRpbHMuUHJvZ3Jlc3NCYXI7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZMaW5rU2VydmljZSIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9wZGZfbGlua19zZXJ2aWNlLlBERkxpbmtTZXJ2aWNlOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiU2ltcGxlTGlua1NlcnZpY2UiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfcGRmX2xpbmtfc2VydmljZS5TaW1wbGVMaW5rU2VydmljZTsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkRvd25sb2FkTWFuYWdlciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9kb3dubG9hZF9tYW5hZ2VyLkRvd25sb2FkTWFuYWdlcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIkdlbmVyaWNMMTBuIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX2dlbmVyaWNsMTBuLkdlbmVyaWNMMTBuOworICB9Cit9KTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiUERGRmluZENvbnRyb2xsZXIiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfcGRmX2ZpbmRfY29udHJvbGxlci5QREZGaW5kQ29udHJvbGxlcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERkhpc3RvcnkiLCB7CisgIGVudW1lcmFibGU6IHRydWUsCisgIGdldDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBfcGRmX2hpc3RvcnkuUERGSGlzdG9yeTsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERlBhZ2VWaWV3IiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3BkZl9wYWdlX3ZpZXcuUERGUGFnZVZpZXc7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJQREZTaW5nbGVQYWdlVmlld2VyIiwgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gX3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIuUERGU2luZ2xlUGFnZVZpZXdlcjsKKyAgfQorfSk7CitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIlBERlZpZXdlciIsIHsKKyAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIF9wZGZfdmlld2VyLlBERlZpZXdlcjsKKyAgfQorfSk7CisKK3ZhciBfYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTsKKwordmFyIF90ZXh0X2xheWVyX2J1aWxkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCit2YXIgX3VpX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKKwordmFyIF9wZGZfbGlua19zZXJ2aWNlID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKKwordmFyIF9kb3dubG9hZF9tYW5hZ2VyID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTsKKwordmFyIF9nZW5lcmljbDEwbiA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CisKK3ZhciBfcGRmX2ZpbmRfY29udHJvbGxlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApOworCit2YXIgX3BkZl9oaXN0b3J5ID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7CisKK3ZhciBfcGRmX3BhZ2VfdmlldyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOworCit2YXIgX3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1KTsKKwordmFyIF9wZGZfdmlld2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygxNyk7CisKK2NvbnN0IHBkZmpzVmVyc2lvbiA9ICcyLjYuMzQ3JzsKK2NvbnN0IHBkZmpzQnVpbGQgPSAnM2JlOWM2NWYnOworCisvKioqLyB9KSwKKy8qIDEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5EZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSA9IGV4cG9ydHMuQW5ub3RhdGlvbkxheWVyQnVpbGRlciA9IHZvaWQgMDsKKwordmFyIF9wZGZqc0xpYiA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOworCit2YXIgX3BkZl9saW5rX3NlcnZpY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOworCitjbGFzcyBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyIHsKKyAgY29uc3RydWN0b3IoeworICAgIHBhZ2VEaXYsCisgICAgcGRmUGFnZSwKKyAgICBsaW5rU2VydmljZSwKKyAgICBkb3dubG9hZE1hbmFnZXIsCisgICAgYW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsLAorICAgIGltYWdlUmVzb3VyY2VzUGF0aCA9ICIiLAorICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSB0cnVlLAorICAgIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4KKyAgfSkgeworICAgIHRoaXMucGFnZURpdiA9IHBhZ2VEaXY7CisgICAgdGhpcy5wZGZQYWdlID0gcGRmUGFnZTsKKyAgICB0aGlzLmxpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7CisgICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBkb3dubG9hZE1hbmFnZXI7CisgICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBpbWFnZVJlc291cmNlc1BhdGg7CisgICAgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gcmVuZGVySW50ZXJhY3RpdmVGb3JtczsKKyAgICB0aGlzLmwxMG4gPSBsMTBuOworICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSBhbm5vdGF0aW9uU3RvcmFnZTsKKyAgICB0aGlzLmRpdiA9IG51bGw7CisgICAgdGhpcy5fY2FuY2VsbGVkID0gZmFsc2U7CisgIH0KKworICByZW5kZXIodmlld3BvcnQsIGludGVudCA9ICJkaXNwbGF5IikgeworICAgIHJldHVybiB0aGlzLnBkZlBhZ2UuZ2V0QW5ub3RhdGlvbnMoeworICAgICAgaW50ZW50CisgICAgfSkudGhlbihhbm5vdGF0aW9ucyA9PiB7CisgICAgICBpZiAodGhpcy5fY2FuY2VsbGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7CisgICAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydC5jbG9uZSh7CisgICAgICAgICAgZG9udEZsaXA6IHRydWUKKyAgICAgICAgfSksCisgICAgICAgIGRpdjogdGhpcy5kaXYsCisgICAgICAgIGFubm90YXRpb25zLAorICAgICAgICBwYWdlOiB0aGlzLnBkZlBhZ2UsCisgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogdGhpcy5pbWFnZVJlc291cmNlc1BhdGgsCisgICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgICAgbGlua1NlcnZpY2U6IHRoaXMubGlua1NlcnZpY2UsCisgICAgICAgIGRvd25sb2FkTWFuYWdlcjogdGhpcy5kb3dubG9hZE1hbmFnZXIsCisgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiB0aGlzLmFubm90YXRpb25TdG9yYWdlCisgICAgICB9OworCisgICAgICBpZiAodGhpcy5kaXYpIHsKKyAgICAgICAgX3BkZmpzTGliLkFubm90YXRpb25MYXllci51cGRhdGUocGFyYW1ldGVycyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICB0aGlzLmRpdi5jbGFzc05hbWUgPSAiYW5ub3RhdGlvbkxheWVyIjsKKyAgICAgICAgdGhpcy5wYWdlRGl2LmFwcGVuZENoaWxkKHRoaXMuZGl2KTsKKyAgICAgICAgcGFyYW1ldGVycy5kaXYgPSB0aGlzLmRpdjsKKworICAgICAgICBfcGRmanNMaWIuQW5ub3RhdGlvbkxheWVyLnJlbmRlcihwYXJhbWV0ZXJzKTsKKworICAgICAgICB0aGlzLmwxMG4udHJhbnNsYXRlKHRoaXMuZGl2KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIGNhbmNlbCgpIHsKKyAgICB0aGlzLl9jYW5jZWxsZWQgPSB0cnVlOworICB9CisKKyAgaGlkZSgpIHsKKyAgICBpZiAoIXRoaXMuZGl2KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAidHJ1ZSIpOworICB9CisKK30KKworZXhwb3J0cy5Bbm5vdGF0aW9uTGF5ZXJCdWlsZGVyID0gQW5ub3RhdGlvbkxheWVyQnVpbGRlcjsKKworY2xhc3MgRGVmYXVsdEFubm90YXRpb25MYXllckZhY3RvcnkgeworICBjcmVhdGVBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKHBhZ2VEaXYsIHBkZlBhZ2UsIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCwgaW1hZ2VSZXNvdXJjZXNQYXRoID0gIiIsIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSB0cnVlLCBsMTBuID0gX3VpX3V0aWxzLk51bGxMMTBuKSB7CisgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKHsKKyAgICAgIHBhZ2VEaXYsCisgICAgICBwZGZQYWdlLAorICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoLAorICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgIGxpbmtTZXJ2aWNlOiBuZXcgX3BkZl9saW5rX3NlcnZpY2UuU2ltcGxlTGlua1NlcnZpY2UoKSwKKyAgICAgIGwxMG4sCisgICAgICBhbm5vdGF0aW9uU3RvcmFnZQorICAgIH0pOworICB9CisKK30KKworZXhwb3J0cy5EZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSA9IERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OworCisvKioqLyB9KSwKKy8qIDIgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK2xldCBwZGZqc0xpYjsKKworaWYgKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHdpbmRvd1sicGRmanMtZGlzdC9idWlsZC9wZGYiXSkgeworICBwZGZqc0xpYiA9IHdpbmRvd1sicGRmanMtZGlzdC9idWlsZC9wZGYiXTsKK30gZWxzZSB7CisgIHBkZmpzTGliID0gcmVxdWlyZSgiLi4vYnVpbGQvcGRmLmpzIik7Cit9CisKK21vZHVsZS5leHBvcnRzID0gcGRmanNMaWI7CisKKy8qKiovIH0pLAorLyogMyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmlzVmFsaWRSb3RhdGlvbiA9IGlzVmFsaWRSb3RhdGlvbjsKK2V4cG9ydHMuaXNWYWxpZFNjcm9sbE1vZGUgPSBpc1ZhbGlkU2Nyb2xsTW9kZTsKK2V4cG9ydHMuaXNWYWxpZFNwcmVhZE1vZGUgPSBpc1ZhbGlkU3ByZWFkTW9kZTsKK2V4cG9ydHMuaXNQb3J0cmFpdE9yaWVudGF0aW9uID0gaXNQb3J0cmFpdE9yaWVudGF0aW9uOworZXhwb3J0cy5jbGFtcCA9IGNsYW1wOworZXhwb3J0cy5nZXRQREZGaWxlTmFtZUZyb21VUkwgPSBnZXRQREZGaWxlTmFtZUZyb21VUkw7CitleHBvcnRzLm5vQ29udGV4dE1lbnVIYW5kbGVyID0gbm9Db250ZXh0TWVudUhhbmRsZXI7CitleHBvcnRzLnBhcnNlUXVlcnlTdHJpbmcgPSBwYXJzZVF1ZXJ5U3RyaW5nOworZXhwb3J0cy5iYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMgPSBiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHM7CitleHBvcnRzLmdldFZpc2libGVFbGVtZW50cyA9IGdldFZpc2libGVFbGVtZW50czsKK2V4cG9ydHMucm91bmRUb0RpdmlkZSA9IHJvdW5kVG9EaXZpZGU7CitleHBvcnRzLmdldFBhZ2VTaXplSW5jaGVzID0gZ2V0UGFnZVNpemVJbmNoZXM7CitleHBvcnRzLmFwcHJveGltYXRlRnJhY3Rpb24gPSBhcHByb3hpbWF0ZUZyYWN0aW9uOworZXhwb3J0cy5nZXRPdXRwdXRTY2FsZSA9IGdldE91dHB1dFNjYWxlOworZXhwb3J0cy5zY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3OworZXhwb3J0cy53YXRjaFNjcm9sbCA9IHdhdGNoU2Nyb2xsOworZXhwb3J0cy5iaW5hcnlTZWFyY2hGaXJzdEl0ZW0gPSBiaW5hcnlTZWFyY2hGaXJzdEl0ZW07CitleHBvcnRzLm5vcm1hbGl6ZVdoZWVsRXZlbnREaXJlY3Rpb24gPSBub3JtYWxpemVXaGVlbEV2ZW50RGlyZWN0aW9uOworZXhwb3J0cy5ub3JtYWxpemVXaGVlbEV2ZW50RGVsdGEgPSBub3JtYWxpemVXaGVlbEV2ZW50RGVsdGE7CitleHBvcnRzLndhaXRPbkV2ZW50T3JUaW1lb3V0ID0gd2FpdE9uRXZlbnRPclRpbWVvdXQ7CitleHBvcnRzLm1vdmVUb0VuZE9mQXJyYXkgPSBtb3ZlVG9FbmRPZkFycmF5OworZXhwb3J0cy5XYWl0T25UeXBlID0gZXhwb3J0cy5hbmltYXRpb25TdGFydGVkID0gZXhwb3J0cy5Qcm9ncmVzc0JhciA9IGV4cG9ydHMuRXZlbnRCdXMgPSBleHBvcnRzLk51bGxMMTBuID0gZXhwb3J0cy5TcHJlYWRNb2RlID0gZXhwb3J0cy5TY3JvbGxNb2RlID0gZXhwb3J0cy5UZXh0TGF5ZXJNb2RlID0gZXhwb3J0cy5SZW5kZXJlclR5cGUgPSBleHBvcnRzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IGV4cG9ydHMuVkVSVElDQUxfUEFERElORyA9IGV4cG9ydHMuU0NST0xMQkFSX1BBRERJTkcgPSBleHBvcnRzLk1BWF9BVVRPX1NDQUxFID0gZXhwb3J0cy5VTktOT1dOX1NDQUxFID0gZXhwb3J0cy5NQVhfU0NBTEUgPSBleHBvcnRzLk1JTl9TQ0FMRSA9IGV4cG9ydHMuREVGQVVMVF9TQ0FMRSA9IGV4cG9ydHMuREVGQVVMVF9TQ0FMRV9WQUxVRSA9IGV4cG9ydHMuQ1NTX1VOSVRTID0gZXhwb3J0cy5BdXRvUHJpbnRSZWdFeHAgPSB2b2lkIDA7Citjb25zdCBDU1NfVU5JVFMgPSA5Ni4wIC8gNzIuMDsKK2V4cG9ydHMuQ1NTX1VOSVRTID0gQ1NTX1VOSVRTOworY29uc3QgREVGQVVMVF9TQ0FMRV9WQUxVRSA9ICJhdXRvIjsKK2V4cG9ydHMuREVGQVVMVF9TQ0FMRV9WQUxVRSA9IERFRkFVTFRfU0NBTEVfVkFMVUU7Citjb25zdCBERUZBVUxUX1NDQUxFID0gMS4wOworZXhwb3J0cy5ERUZBVUxUX1NDQUxFID0gREVGQVVMVF9TQ0FMRTsKK2NvbnN0IE1JTl9TQ0FMRSA9IDAuMTsKK2V4cG9ydHMuTUlOX1NDQUxFID0gTUlOX1NDQUxFOworY29uc3QgTUFYX1NDQUxFID0gMTAuMDsKK2V4cG9ydHMuTUFYX1NDQUxFID0gTUFYX1NDQUxFOworY29uc3QgVU5LTk9XTl9TQ0FMRSA9IDA7CitleHBvcnRzLlVOS05PV05fU0NBTEUgPSBVTktOT1dOX1NDQUxFOworY29uc3QgTUFYX0FVVE9fU0NBTEUgPSAxLjI1OworZXhwb3J0cy5NQVhfQVVUT19TQ0FMRSA9IE1BWF9BVVRPX1NDQUxFOworY29uc3QgU0NST0xMQkFSX1BBRERJTkcgPSA0MDsKK2V4cG9ydHMuU0NST0xMQkFSX1BBRERJTkcgPSBTQ1JPTExCQVJfUEFERElORzsKK2NvbnN0IFZFUlRJQ0FMX1BBRERJTkcgPSA1OworZXhwb3J0cy5WRVJUSUNBTF9QQURESU5HID0gVkVSVElDQUxfUEFERElORzsKK2NvbnN0IFByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IHsKKyAgVU5LTk9XTjogMCwKKyAgTk9STUFMOiAxLAorICBDSEFOR0lORzogMiwKKyAgRlVMTFNDUkVFTjogMworfTsKK2V4cG9ydHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlID0gUHJlc2VudGF0aW9uTW9kZVN0YXRlOworY29uc3QgUmVuZGVyZXJUeXBlID0geworICBDQU5WQVM6ICJjYW52YXMiLAorICBTVkc6ICJzdmciCit9OworZXhwb3J0cy5SZW5kZXJlclR5cGUgPSBSZW5kZXJlclR5cGU7Citjb25zdCBUZXh0TGF5ZXJNb2RlID0geworICBESVNBQkxFOiAwLAorICBFTkFCTEU6IDEsCisgIEVOQUJMRV9FTkhBTkNFOiAyCit9OworZXhwb3J0cy5UZXh0TGF5ZXJNb2RlID0gVGV4dExheWVyTW9kZTsKK2NvbnN0IFNjcm9sbE1vZGUgPSB7CisgIFVOS05PV046IC0xLAorICBWRVJUSUNBTDogMCwKKyAgSE9SSVpPTlRBTDogMSwKKyAgV1JBUFBFRDogMgorfTsKK2V4cG9ydHMuU2Nyb2xsTW9kZSA9IFNjcm9sbE1vZGU7Citjb25zdCBTcHJlYWRNb2RlID0geworICBVTktOT1dOOiAtMSwKKyAgTk9ORTogMCwKKyAgT0REOiAxLAorICBFVkVOOiAyCit9OworZXhwb3J0cy5TcHJlYWRNb2RlID0gU3ByZWFkTW9kZTsKK2NvbnN0IEF1dG9QcmludFJlZ0V4cCA9IC9cYnByaW50XHMqXCgvOworZXhwb3J0cy5BdXRvUHJpbnRSZWdFeHAgPSBBdXRvUHJpbnRSZWdFeHA7CisKK2Z1bmN0aW9uIGZvcm1hdEwxMG5WYWx1ZSh0ZXh0LCBhcmdzKSB7CisgIGlmICghYXJncykgeworICAgIHJldHVybiB0ZXh0OworICB9CisKKyAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHtce1xzKihcdyspXHMqXH1cfS9nLCAoYWxsLCBuYW1lKSA9PiB7CisgICAgcmV0dXJuIG5hbWUgaW4gYXJncyA/IGFyZ3NbbmFtZV0gOiAie3siICsgbmFtZSArICJ9fSI7CisgIH0pOworfQorCitjb25zdCBOdWxsTDEwbiA9IHsKKyAgYXN5bmMgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgcmV0dXJuICJlbi11cyI7CisgIH0sCisKKyAgYXN5bmMgZ2V0RGlyZWN0aW9uKCkgeworICAgIHJldHVybiAibHRyIjsKKyAgfSwKKworICBhc3luYyBnZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKSB7CisgICAgcmV0dXJuIGZvcm1hdEwxMG5WYWx1ZShmYWxsYmFjaywgYXJncyk7CisgIH0sCisKKyAgYXN5bmMgdHJhbnNsYXRlKGVsZW1lbnQpIHt9CisKK307CitleHBvcnRzLk51bGxMMTBuID0gTnVsbEwxMG47CisKK2Z1bmN0aW9uIGdldE91dHB1dFNjYWxlKGN0eCkgeworICBjb25zdCBkZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTsKKyAgY29uc3QgYmFja2luZ1N0b3JlUmF0aW8gPSBjdHgud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHgubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHgubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGN0eC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHguYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCAxOworICBjb25zdCBwaXhlbFJhdGlvID0gZGV2aWNlUGl4ZWxSYXRpbyAvIGJhY2tpbmdTdG9yZVJhdGlvOworICByZXR1cm4geworICAgIHN4OiBwaXhlbFJhdGlvLAorICAgIHN5OiBwaXhlbFJhdGlvLAorICAgIHNjYWxlZDogcGl4ZWxSYXRpbyAhPT0gMQorICB9OworfQorCitmdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhlbGVtZW50LCBzcG90LCBza2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyA9IGZhbHNlKSB7CisgIGxldCBwYXJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKworICBpZiAoIXBhcmVudCkgeworICAgIGNvbnNvbGUuZXJyb3IoIm9mZnNldFBhcmVudCBpcyBub3Qgc2V0IC0tIGNhbm5vdCBzY3JvbGwiKTsKKyAgICByZXR1cm47CisgIH0KKworICBsZXQgb2Zmc2V0WSA9IGVsZW1lbnQub2Zmc2V0VG9wICsgZWxlbWVudC5jbGllbnRUb3A7CisgIGxldCBvZmZzZXRYID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0OworCisgIHdoaWxlIChwYXJlbnQuY2xpZW50SGVpZ2h0ID09PSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ICYmIHBhcmVudC5jbGllbnRXaWR0aCA9PT0gcGFyZW50LnNjcm9sbFdpZHRoIHx8IHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzICYmIGdldENvbXB1dGVkU3R5bGUocGFyZW50KS5vdmVyZmxvdyA9PT0gImhpZGRlbiIpIHsKKyAgICBpZiAocGFyZW50LmRhdGFzZXQuX3NjYWxlWSkgeworICAgICAgb2Zmc2V0WSAvPSBwYXJlbnQuZGF0YXNldC5fc2NhbGVZOworICAgICAgb2Zmc2V0WCAvPSBwYXJlbnQuZGF0YXNldC5fc2NhbGVYOworICAgIH0KKworICAgIG9mZnNldFkgKz0gcGFyZW50Lm9mZnNldFRvcDsKKyAgICBvZmZzZXRYICs9IHBhcmVudC5vZmZzZXRMZWZ0OworICAgIHBhcmVudCA9IHBhcmVudC5vZmZzZXRQYXJlbnQ7CisKKyAgICBpZiAoIXBhcmVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlmIChzcG90KSB7CisgICAgaWYgKHNwb3QudG9wICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIG9mZnNldFkgKz0gc3BvdC50b3A7CisgICAgfQorCisgICAgaWYgKHNwb3QubGVmdCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBvZmZzZXRYICs9IHNwb3QubGVmdDsKKyAgICAgIHBhcmVudC5zY3JvbGxMZWZ0ID0gb2Zmc2V0WDsKKyAgICB9CisgIH0KKworICBwYXJlbnQuc2Nyb2xsVG9wID0gb2Zmc2V0WTsKK30KKworZnVuY3Rpb24gd2F0Y2hTY3JvbGwodmlld0FyZWFFbGVtZW50LCBjYWxsYmFjaykgeworICBjb25zdCBkZWJvdW5jZVNjcm9sbCA9IGZ1bmN0aW9uIChldnQpIHsKKyAgICBpZiAockFGKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgckFGID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiB2aWV3QXJlYUVsZW1lbnRTY3JvbGxlZCgpIHsKKyAgICAgIHJBRiA9IG51bGw7CisgICAgICBjb25zdCBjdXJyZW50WCA9IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxMZWZ0OworICAgICAgY29uc3QgbGFzdFggPSBzdGF0ZS5sYXN0WDsKKworICAgICAgaWYgKGN1cnJlbnRYICE9PSBsYXN0WCkgeworICAgICAgICBzdGF0ZS5yaWdodCA9IGN1cnJlbnRYID4gbGFzdFg7CisgICAgICB9CisKKyAgICAgIHN0YXRlLmxhc3RYID0gY3VycmVudFg7CisgICAgICBjb25zdCBjdXJyZW50WSA9IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxUb3A7CisgICAgICBjb25zdCBsYXN0WSA9IHN0YXRlLmxhc3RZOworCisgICAgICBpZiAoY3VycmVudFkgIT09IGxhc3RZKSB7CisgICAgICAgIHN0YXRlLmRvd24gPSBjdXJyZW50WSA+IGxhc3RZOworICAgICAgfQorCisgICAgICBzdGF0ZS5sYXN0WSA9IGN1cnJlbnRZOworICAgICAgY2FsbGJhY2soc3RhdGUpOworICAgIH0pOworICB9OworCisgIGNvbnN0IHN0YXRlID0geworICAgIHJpZ2h0OiB0cnVlLAorICAgIGRvd246IHRydWUsCisgICAgbGFzdFg6IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxMZWZ0LAorICAgIGxhc3RZOiB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsVG9wLAorICAgIF9ldmVudEhhbmRsZXI6IGRlYm91bmNlU2Nyb2xsCisgIH07CisgIGxldCByQUYgPSBudWxsOworICB2aWV3QXJlYUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZGVib3VuY2VTY3JvbGwsIHRydWUpOworICByZXR1cm4gc3RhdGU7Cit9CisKK2Z1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKKyAgY29uc3QgcGFydHMgPSBxdWVyeS5zcGxpdCgiJiIpOworICBjb25zdCBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOworCisgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBhcnRzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICBjb25zdCBwYXJhbSA9IHBhcnRzW2ldLnNwbGl0KCI9Iik7CisgICAgY29uc3Qga2V5ID0gcGFyYW1bMF0udG9Mb3dlckNhc2UoKTsKKyAgICBjb25zdCB2YWx1ZSA9IHBhcmFtLmxlbmd0aCA+IDEgPyBwYXJhbVsxXSA6IG51bGw7CisgICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChrZXkpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisgIH0KKworICByZXR1cm4gcGFyYW1zOworfQorCitmdW5jdGlvbiBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0oaXRlbXMsIGNvbmRpdGlvbikgeworICBsZXQgbWluSW5kZXggPSAwOworICBsZXQgbWF4SW5kZXggPSBpdGVtcy5sZW5ndGggLSAxOworCisgIGlmIChtYXhJbmRleCA8IDAgfHwgIWNvbmRpdGlvbihpdGVtc1ttYXhJbmRleF0pKSB7CisgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKKyAgfQorCisgIGlmIChjb25kaXRpb24oaXRlbXNbbWluSW5kZXhdKSkgeworICAgIHJldHVybiBtaW5JbmRleDsKKyAgfQorCisgIHdoaWxlIChtaW5JbmRleCA8IG1heEluZGV4KSB7CisgICAgY29uc3QgY3VycmVudEluZGV4ID0gbWluSW5kZXggKyBtYXhJbmRleCA+PiAxOworICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gaXRlbXNbY3VycmVudEluZGV4XTsKKworICAgIGlmIChjb25kaXRpb24oY3VycmVudEl0ZW0pKSB7CisgICAgICBtYXhJbmRleCA9IGN1cnJlbnRJbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgbWluSW5kZXggPSBjdXJyZW50SW5kZXggKyAxOworICAgIH0KKyAgfQorCisgIHJldHVybiBtaW5JbmRleDsKK30KKworZnVuY3Rpb24gYXBwcm94aW1hdGVGcmFjdGlvbih4KSB7CisgIGlmIChNYXRoLmZsb29yKHgpID09PSB4KSB7CisgICAgcmV0dXJuIFt4LCAxXTsKKyAgfQorCisgIGNvbnN0IHhpbnYgPSAxIC8geDsKKyAgY29uc3QgbGltaXQgPSA4OworCisgIGlmICh4aW52ID4gbGltaXQpIHsKKyAgICByZXR1cm4gWzEsIGxpbWl0XTsKKyAgfSBlbHNlIGlmIChNYXRoLmZsb29yKHhpbnYpID09PSB4aW52KSB7CisgICAgcmV0dXJuIFsxLCB4aW52XTsKKyAgfQorCisgIGNvbnN0IHhfID0geCA+IDEgPyB4aW52IDogeDsKKyAgbGV0IGEgPSAwLAorICAgICAgYiA9IDEsCisgICAgICBjID0gMSwKKyAgICAgIGQgPSAxOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgY29uc3QgcCA9IGEgKyBjLAorICAgICAgICAgIHEgPSBiICsgZDsKKworICAgIGlmIChxID4gbGltaXQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh4XyA8PSBwIC8gcSkgeworICAgICAgYyA9IHA7CisgICAgICBkID0gcTsKKyAgICB9IGVsc2UgeworICAgICAgYSA9IHA7CisgICAgICBiID0gcTsKKyAgICB9CisgIH0KKworICBsZXQgcmVzdWx0OworCisgIGlmICh4XyAtIGEgLyBiIDwgYyAvIGQgLSB4XykgeworICAgIHJlc3VsdCA9IHhfID09PSB4ID8gW2EsIGJdIDogW2IsIGFdOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IHhfID09PSB4ID8gW2MsIGRdIDogW2QsIGNdOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworZnVuY3Rpb24gcm91bmRUb0RpdmlkZSh4LCBkaXYpIHsKKyAgY29uc3QgciA9IHggJSBkaXY7CisgIHJldHVybiByID09PSAwID8geCA6IE1hdGgucm91bmQoeCAtIHIgKyBkaXYpOworfQorCitmdW5jdGlvbiBnZXRQYWdlU2l6ZUluY2hlcyh7CisgIHZpZXcsCisgIHVzZXJVbml0LAorICByb3RhdGUKK30pIHsKKyAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IHZpZXc7CisgIGNvbnN0IGNoYW5nZU9yaWVudGF0aW9uID0gcm90YXRlICUgMTgwICE9PSAwOworICBjb25zdCB3aWR0aCA9ICh4MiAtIHgxKSAvIDcyICogdXNlclVuaXQ7CisgIGNvbnN0IGhlaWdodCA9ICh5MiAtIHkxKSAvIDcyICogdXNlclVuaXQ7CisgIHJldHVybiB7CisgICAgd2lkdGg6IGNoYW5nZU9yaWVudGF0aW9uID8gaGVpZ2h0IDogd2lkdGgsCisgICAgaGVpZ2h0OiBjaGFuZ2VPcmllbnRhdGlvbiA/IHdpZHRoIDogaGVpZ2h0CisgIH07Cit9CisKK2Z1bmN0aW9uIGJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cyhpbmRleCwgdmlld3MsIHRvcCkgeworICBpZiAoaW5kZXggPCAyKSB7CisgICAgcmV0dXJuIGluZGV4OworICB9CisKKyAgbGV0IGVsdCA9IHZpZXdzW2luZGV4XS5kaXY7CisgIGxldCBwYWdlVG9wID0gZWx0Lm9mZnNldFRvcCArIGVsdC5jbGllbnRUb3A7CisKKyAgaWYgKHBhZ2VUb3AgPj0gdG9wKSB7CisgICAgZWx0ID0gdmlld3NbaW5kZXggLSAxXS5kaXY7CisgICAgcGFnZVRvcCA9IGVsdC5vZmZzZXRUb3AgKyBlbHQuY2xpZW50VG9wOworICB9CisKKyAgZm9yIChsZXQgaSA9IGluZGV4IC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICBlbHQgPSB2aWV3c1tpXS5kaXY7CisKKyAgICBpZiAoZWx0Lm9mZnNldFRvcCArIGVsdC5jbGllbnRUb3AgKyBlbHQuY2xpZW50SGVpZ2h0IDw9IHBhZ2VUb3ApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGluZGV4ID0gaTsKKyAgfQorCisgIHJldHVybiBpbmRleDsKK30KKworZnVuY3Rpb24gZ2V0VmlzaWJsZUVsZW1lbnRzKHNjcm9sbEVsLCB2aWV3cywgc29ydEJ5VmlzaWJpbGl0eSA9IGZhbHNlLCBob3Jpem9udGFsID0gZmFsc2UpIHsKKyAgY29uc3QgdG9wID0gc2Nyb2xsRWwuc2Nyb2xsVG9wLAorICAgICAgICBib3R0b20gPSB0b3AgKyBzY3JvbGxFbC5jbGllbnRIZWlnaHQ7CisgIGNvbnN0IGxlZnQgPSBzY3JvbGxFbC5zY3JvbGxMZWZ0LAorICAgICAgICByaWdodCA9IGxlZnQgKyBzY3JvbGxFbC5jbGllbnRXaWR0aDsKKworICBmdW5jdGlvbiBpc0VsZW1lbnRCb3R0b21BZnRlclZpZXdUb3AodmlldykgeworICAgIGNvbnN0IGVsZW1lbnQgPSB2aWV3LmRpdjsKKyAgICBjb25zdCBlbGVtZW50Qm90dG9tID0gZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0OworICAgIHJldHVybiBlbGVtZW50Qm90dG9tID4gdG9wOworICB9CisKKyAgZnVuY3Rpb24gaXNFbGVtZW50UmlnaHRBZnRlclZpZXdMZWZ0KHZpZXcpIHsKKyAgICBjb25zdCBlbGVtZW50ID0gdmlldy5kaXY7CisgICAgY29uc3QgZWxlbWVudFJpZ2h0ID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDsKKyAgICByZXR1cm4gZWxlbWVudFJpZ2h0ID4gbGVmdDsKKyAgfQorCisgIGNvbnN0IHZpc2libGUgPSBbXSwKKyAgICAgICAgbnVtVmlld3MgPSB2aWV3cy5sZW5ndGg7CisgIGxldCBmaXJzdFZpc2libGVFbGVtZW50SW5kID0gbnVtVmlld3MgPT09IDAgPyAwIDogYmluYXJ5U2VhcmNoRmlyc3RJdGVtKHZpZXdzLCBob3Jpem9udGFsID8gaXNFbGVtZW50UmlnaHRBZnRlclZpZXdMZWZ0IDogaXNFbGVtZW50Qm90dG9tQWZ0ZXJWaWV3VG9wKTsKKworICBpZiAoZmlyc3RWaXNpYmxlRWxlbWVudEluZCA+IDAgJiYgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA8IG51bVZpZXdzICYmICFob3Jpem9udGFsKSB7CisgICAgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA9IGJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cyhmaXJzdFZpc2libGVFbGVtZW50SW5kLCB2aWV3cywgdG9wKTsKKyAgfQorCisgIGxldCBsYXN0RWRnZSA9IGhvcml6b250YWwgPyByaWdodCA6IC0xOworCisgIGZvciAobGV0IGkgPSBmaXJzdFZpc2libGVFbGVtZW50SW5kOyBpIDwgbnVtVmlld3M7IGkrKykgeworICAgIGNvbnN0IHZpZXcgPSB2aWV3c1tpXSwKKyAgICAgICAgICBlbGVtZW50ID0gdmlldy5kaXY7CisgICAgY29uc3QgY3VycmVudFdpZHRoID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0OworICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldFRvcCArIGVsZW1lbnQuY2xpZW50VG9wOworICAgIGNvbnN0IHZpZXdXaWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGgsCisgICAgICAgICAgdmlld0hlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0OworICAgIGNvbnN0IHZpZXdSaWdodCA9IGN1cnJlbnRXaWR0aCArIHZpZXdXaWR0aDsKKyAgICBjb25zdCB2aWV3Qm90dG9tID0gY3VycmVudEhlaWdodCArIHZpZXdIZWlnaHQ7CisKKyAgICBpZiAobGFzdEVkZ2UgPT09IC0xKSB7CisgICAgICBpZiAodmlld0JvdHRvbSA+PSBib3R0b20pIHsKKyAgICAgICAgbGFzdEVkZ2UgPSB2aWV3Qm90dG9tOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoKGhvcml6b250YWwgPyBjdXJyZW50V2lkdGggOiBjdXJyZW50SGVpZ2h0KSA+IGxhc3RFZGdlKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodmlld0JvdHRvbSA8PSB0b3AgfHwgY3VycmVudEhlaWdodCA+PSBib3R0b20gfHwgdmlld1JpZ2h0IDw9IGxlZnQgfHwgY3VycmVudFdpZHRoID49IHJpZ2h0KSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjb25zdCBoaWRkZW5IZWlnaHQgPSBNYXRoLm1heCgwLCB0b3AgLSBjdXJyZW50SGVpZ2h0KSArIE1hdGgubWF4KDAsIHZpZXdCb3R0b20gLSBib3R0b20pOworICAgIGNvbnN0IGhpZGRlbldpZHRoID0gTWF0aC5tYXgoMCwgbGVmdCAtIGN1cnJlbnRXaWR0aCkgKyBNYXRoLm1heCgwLCB2aWV3UmlnaHQgLSByaWdodCk7CisgICAgY29uc3QgcGVyY2VudCA9ICh2aWV3SGVpZ2h0IC0gaGlkZGVuSGVpZ2h0KSAqICh2aWV3V2lkdGggLSBoaWRkZW5XaWR0aCkgKiAxMDAgLyB2aWV3SGVpZ2h0IC8gdmlld1dpZHRoIHwgMDsKKyAgICB2aXNpYmxlLnB1c2goeworICAgICAgaWQ6IHZpZXcuaWQsCisgICAgICB4OiBjdXJyZW50V2lkdGgsCisgICAgICB5OiBjdXJyZW50SGVpZ2h0LAorICAgICAgdmlldywKKyAgICAgIHBlcmNlbnQKKyAgICB9KTsKKyAgfQorCisgIGNvbnN0IGZpcnN0ID0gdmlzaWJsZVswXSwKKyAgICAgICAgbGFzdCA9IHZpc2libGVbdmlzaWJsZS5sZW5ndGggLSAxXTsKKworICBpZiAoc29ydEJ5VmlzaWJpbGl0eSkgeworICAgIHZpc2libGUuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgY29uc3QgcGMgPSBhLnBlcmNlbnQgLSBiLnBlcmNlbnQ7CisKKyAgICAgIGlmIChNYXRoLmFicyhwYykgPiAwLjAwMSkgeworICAgICAgICByZXR1cm4gLXBjOworICAgICAgfQorCisgICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7CisgICAgfSk7CisgIH0KKworICByZXR1cm4geworICAgIGZpcnN0LAorICAgIGxhc3QsCisgICAgdmlld3M6IHZpc2libGUKKyAgfTsKK30KKworZnVuY3Rpb24gbm9Db250ZXh0TWVudUhhbmRsZXIoZXZ0KSB7CisgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworfQorCitmdW5jdGlvbiBpc0RhdGFTY2hlbWEodXJsKSB7CisgIGxldCBpID0gMDsKKyAgY29uc3QgaWkgPSB1cmwubGVuZ3RoOworCisgIHdoaWxlIChpIDwgaWkgJiYgdXJsW2ldLnRyaW0oKSA9PT0gIiIpIHsKKyAgICBpKys7CisgIH0KKworICByZXR1cm4gdXJsLnN1YnN0cmluZyhpLCBpICsgNSkudG9Mb3dlckNhc2UoKSA9PT0gImRhdGE6IjsKK30KKworZnVuY3Rpb24gZ2V0UERGRmlsZU5hbWVGcm9tVVJMKHVybCwgZGVmYXVsdEZpbGVuYW1lID0gImRvY3VtZW50LnBkZiIpIHsKKyAgaWYgKHR5cGVvZiB1cmwgIT09ICJzdHJpbmciKSB7CisgICAgcmV0dXJuIGRlZmF1bHRGaWxlbmFtZTsKKyAgfQorCisgIGlmIChpc0RhdGFTY2hlbWEodXJsKSkgeworICAgIGNvbnNvbGUud2FybigiZ2V0UERGRmlsZU5hbWVGcm9tVVJMOiAiICsgJ2lnbm9yaW5nICJkYXRhOiIgVVJMIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLicpOworICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7CisgIH0KKworICBjb25zdCByZVVSSSA9IC9eKD86KD86W146XSs6KT9cL1wvW15cL10rKT8oW14/I10qKShcP1teI10qKT8oIy4qKT8kLzsKKyAgY29uc3QgcmVGaWxlbmFtZSA9IC9bXlwvPyM9XStcLnBkZlxiKD8hLipcLnBkZlxiKS9pOworICBjb25zdCBzcGxpdFVSSSA9IHJlVVJJLmV4ZWModXJsKTsKKyAgbGV0IHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzFdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMl0pIHx8IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVszXSk7CisKKyAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lKSB7CisgICAgc3VnZ2VzdGVkRmlsZW5hbWUgPSBzdWdnZXN0ZWRGaWxlbmFtZVswXTsKKworICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pbmNsdWRlcygiJSIpKSB7CisgICAgICB0cnkgeworICAgICAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhkZWNvZGVVUklDb21wb25lbnQoc3VnZ2VzdGVkRmlsZW5hbWUpKVswXTsKKyAgICAgIH0gY2F0Y2ggKGV4KSB7fQorICAgIH0KKyAgfQorCisgIHJldHVybiBzdWdnZXN0ZWRGaWxlbmFtZSB8fCBkZWZhdWx0RmlsZW5hbWU7Cit9CisKK2Z1bmN0aW9uIG5vcm1hbGl6ZVdoZWVsRXZlbnREaXJlY3Rpb24oZXZ0KSB7CisgIGxldCBkZWx0YSA9IE1hdGguc3FydChldnQuZGVsdGFYICogZXZ0LmRlbHRhWCArIGV2dC5kZWx0YVkgKiBldnQuZGVsdGFZKTsKKyAgY29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKGV2dC5kZWx0YVksIGV2dC5kZWx0YVgpOworCisgIGlmICgtMC4yNSAqIE1hdGguUEkgPCBhbmdsZSAmJiBhbmdsZSA8IDAuNzUgKiBNYXRoLlBJKSB7CisgICAgZGVsdGEgPSAtZGVsdGE7CisgIH0KKworICByZXR1cm4gZGVsdGE7Cit9CisKK2Z1bmN0aW9uIG5vcm1hbGl6ZVdoZWVsRXZlbnREZWx0YShldnQpIHsKKyAgbGV0IGRlbHRhID0gbm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbihldnQpOworICBjb25zdCBNT1VTRV9ET01fREVMVEFfUElYRUxfTU9ERSA9IDA7CisgIGNvbnN0IE1PVVNFX0RPTV9ERUxUQV9MSU5FX01PREUgPSAxOworICBjb25zdCBNT1VTRV9QSVhFTFNfUEVSX0xJTkUgPSAzMDsKKyAgY29uc3QgTU9VU0VfTElORVNfUEVSX1BBR0UgPSAzMDsKKworICBpZiAoZXZ0LmRlbHRhTW9kZSA9PT0gTU9VU0VfRE9NX0RFTFRBX1BJWEVMX01PREUpIHsKKyAgICBkZWx0YSAvPSBNT1VTRV9QSVhFTFNfUEVSX0xJTkUgKiBNT1VTRV9MSU5FU19QRVJfUEFHRTsKKyAgfSBlbHNlIGlmIChldnQuZGVsdGFNb2RlID09PSBNT1VTRV9ET01fREVMVEFfTElORV9NT0RFKSB7CisgICAgZGVsdGEgLz0gTU9VU0VfTElORVNfUEVSX1BBR0U7CisgIH0KKworICByZXR1cm4gZGVsdGE7Cit9CisKK2Z1bmN0aW9uIGlzVmFsaWRSb3RhdGlvbihhbmdsZSkgeworICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihhbmdsZSkgJiYgYW5nbGUgJSA5MCA9PT0gMDsKK30KKworZnVuY3Rpb24gaXNWYWxpZFNjcm9sbE1vZGUobW9kZSkgeworICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihtb2RlKSAmJiBPYmplY3QudmFsdWVzKFNjcm9sbE1vZGUpLmluY2x1ZGVzKG1vZGUpICYmIG1vZGUgIT09IFNjcm9sbE1vZGUuVU5LTk9XTjsKK30KKworZnVuY3Rpb24gaXNWYWxpZFNwcmVhZE1vZGUobW9kZSkgeworICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihtb2RlKSAmJiBPYmplY3QudmFsdWVzKFNwcmVhZE1vZGUpLmluY2x1ZGVzKG1vZGUpICYmIG1vZGUgIT09IFNwcmVhZE1vZGUuVU5LTk9XTjsKK30KKworZnVuY3Rpb24gaXNQb3J0cmFpdE9yaWVudGF0aW9uKHNpemUpIHsKKyAgcmV0dXJuIHNpemUud2lkdGggPD0gc2l6ZS5oZWlnaHQ7Cit9CisKK2NvbnN0IFdhaXRPblR5cGUgPSB7CisgIEVWRU5UOiAiZXZlbnQiLAorICBUSU1FT1VUOiAidGltZW91dCIKK307CitleHBvcnRzLldhaXRPblR5cGUgPSBXYWl0T25UeXBlOworCitmdW5jdGlvbiB3YWl0T25FdmVudE9yVGltZW91dCh7CisgIHRhcmdldCwKKyAgbmFtZSwKKyAgZGVsYXkgPSAwCit9KSB7CisgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICJvYmplY3QiIHx8ICEobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHx8ICEoTnVtYmVyLmlzSW50ZWdlcihkZWxheSkgJiYgZGVsYXkgPj0gMCkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigid2FpdE9uRXZlbnRPclRpbWVvdXQgLSBpbnZhbGlkIHBhcmFtZXRlcnMuIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gaGFuZGxlcih0eXBlKSB7CisgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRXZlbnRCdXMpIHsKKyAgICAgICAgdGFyZ2V0Ll9vZmYobmFtZSwgZXZlbnRIYW5kbGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50SGFuZGxlcik7CisgICAgICB9CisKKyAgICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTsKKyAgICAgIH0KKworICAgICAgcmVzb2x2ZSh0eXBlKTsKKyAgICB9CisKKyAgICBjb25zdCBldmVudEhhbmRsZXIgPSBoYW5kbGVyLmJpbmQobnVsbCwgV2FpdE9uVHlwZS5FVkVOVCk7CisKKyAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRXZlbnRCdXMpIHsKKyAgICAgIHRhcmdldC5fb24obmFtZSwgZXZlbnRIYW5kbGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRIYW5kbGVyKTsKKyAgICB9CisKKyAgICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGhhbmRsZXIuYmluZChudWxsLCBXYWl0T25UeXBlLlRJTUVPVVQpOworICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCBkZWxheSk7CisgIH0pOworfQorCitjb25zdCBhbmltYXRpb25TdGFydGVkID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKTsKK30pOworZXhwb3J0cy5hbmltYXRpb25TdGFydGVkID0gYW5pbWF0aW9uU3RhcnRlZDsKKworZnVuY3Rpb24gZGlzcGF0Y2hET01FdmVudChldmVudE5hbWUsIGFyZ3MgPSBudWxsKSB7CisgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBkaXNwYXRjaERPTUV2ZW50Iik7Cit9CisKK2NsYXNzIEV2ZW50QnVzIHsKKyAgY29uc3RydWN0b3Iob3B0aW9ucykgeworICAgIHRoaXMuX2xpc3RlbmVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgIH0KKworICBvbihldmVudE5hbWUsIGxpc3RlbmVyKSB7CisgICAgdGhpcy5fb24oZXZlbnROYW1lLCBsaXN0ZW5lciwgeworICAgICAgZXh0ZXJuYWw6IHRydWUKKyAgICB9KTsKKyAgfQorCisgIG9mZihldmVudE5hbWUsIGxpc3RlbmVyKSB7CisgICAgdGhpcy5fb2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIsIHsKKyAgICAgIGV4dGVybmFsOiB0cnVlCisgICAgfSk7CisgIH0KKworICBkaXNwYXRjaChldmVudE5hbWUpIHsKKyAgICBjb25zdCBldmVudExpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudE5hbWVdOworCisgICAgaWYgKCFldmVudExpc3RlbmVycyB8fCBldmVudExpc3RlbmVycy5sZW5ndGggPT09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKKyAgICBsZXQgZXh0ZXJuYWxMaXN0ZW5lcnM7CisgICAgZXZlbnRMaXN0ZW5lcnMuc2xpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAoeworICAgICAgbGlzdGVuZXIsCisgICAgICBleHRlcm5hbAorICAgIH0pIHsKKyAgICAgIGlmIChleHRlcm5hbCkgeworICAgICAgICBpZiAoIWV4dGVybmFsTGlzdGVuZXJzKSB7CisgICAgICAgICAgZXh0ZXJuYWxMaXN0ZW5lcnMgPSBbXTsKKyAgICAgICAgfQorCisgICAgICAgIGV4dGVybmFsTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGxpc3RlbmVyLmFwcGx5KG51bGwsIGFyZ3MpOworICAgIH0pOworCisgICAgaWYgKGV4dGVybmFsTGlzdGVuZXJzKSB7CisgICAgICBleHRlcm5hbExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lci5hcHBseShudWxsLCBhcmdzKTsKKyAgICAgIH0pOworICAgICAgZXh0ZXJuYWxMaXN0ZW5lcnMgPSBudWxsOworICAgIH0KKyAgfQorCisgIF9vbihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zID0gbnVsbCkgeworICAgIGxldCBldmVudExpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudE5hbWVdOworCisgICAgaWYgKCFldmVudExpc3RlbmVycykgeworICAgICAgdGhpcy5fbGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVycyA9IFtdOworICAgIH0KKworICAgIGV2ZW50TGlzdGVuZXJzLnB1c2goeworICAgICAgbGlzdGVuZXIsCisgICAgICBleHRlcm5hbDogKG9wdGlvbnMgJiYgb3B0aW9ucy5leHRlcm5hbCkgPT09IHRydWUKKyAgICB9KTsKKyAgfQorCisgIF9vZmYoZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucyA9IG51bGwpIHsKKyAgICBjb25zdCBldmVudExpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudE5hbWVdOworCisgICAgaWYgKCFldmVudExpc3RlbmVycykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGlmIChldmVudExpc3RlbmVyc1tpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKKyAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc3BsaWNlKGksIDEpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKK30KKworZXhwb3J0cy5FdmVudEJ1cyA9IEV2ZW50QnVzOworCitmdW5jdGlvbiBjbGFtcCh2LCBtaW4sIG1heCkgeworICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodiwgbWluKSwgbWF4KTsKK30KKworY2xhc3MgUHJvZ3Jlc3NCYXIgeworICBjb25zdHJ1Y3RvcihpZCwgeworICAgIGhlaWdodCwKKyAgICB3aWR0aCwKKyAgICB1bml0cworICB9ID0ge30pIHsKKyAgICB0aGlzLnZpc2libGUgPSB0cnVlOworICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpZCArICIgLnByb2dyZXNzIik7CisgICAgdGhpcy5iYXIgPSB0aGlzLmRpdi5wYXJlbnROb2RlOworICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0IHx8IDEwMDsKKyAgICB0aGlzLndpZHRoID0gd2lkdGggfHwgMTAwOworICAgIHRoaXMudW5pdHMgPSB1bml0cyB8fCAiJSI7CisgICAgdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyB0aGlzLnVuaXRzOworICAgIHRoaXMucGVyY2VudCA9IDA7CisgIH0KKworICBfdXBkYXRlQmFyKCkgeworICAgIGlmICh0aGlzLl9pbmRldGVybWluYXRlKSB7CisgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKCJpbmRldGVybWluYXRlIik7CisgICAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyB0aGlzLnVuaXRzOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5yZW1vdmUoImluZGV0ZXJtaW5hdGUiKTsKKyAgICBjb25zdCBwcm9ncmVzc1NpemUgPSB0aGlzLndpZHRoICogdGhpcy5fcGVyY2VudCAvIDEwMDsKKyAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IHByb2dyZXNzU2l6ZSArIHRoaXMudW5pdHM7CisgIH0KKworICBnZXQgcGVyY2VudCgpIHsKKyAgICByZXR1cm4gdGhpcy5fcGVyY2VudDsKKyAgfQorCisgIHNldCBwZXJjZW50KHZhbCkgeworICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBpc05hTih2YWwpOworICAgIHRoaXMuX3BlcmNlbnQgPSBjbGFtcCh2YWwsIDAsIDEwMCk7CisKKyAgICB0aGlzLl91cGRhdGVCYXIoKTsKKyAgfQorCisgIHNldFdpZHRoKHZpZXdlcikgeworICAgIGlmICghdmlld2VyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY29udGFpbmVyID0gdmlld2VyLnBhcmVudE5vZGU7CisgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGggLSB2aWV3ZXIub2Zmc2V0V2lkdGg7CisKKyAgICBpZiAoc2Nyb2xsYmFyV2lkdGggPiAwKSB7CisgICAgICB0aGlzLmJhci5zdHlsZS53aWR0aCA9IGBjYWxjKDEwMCUgLSAke3Njcm9sbGJhcldpZHRofXB4KWA7CisgICAgfQorICB9CisKKyAgaGlkZSgpIHsKKyAgICBpZiAoIXRoaXMudmlzaWJsZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOworICAgIHRoaXMuYmFyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOworICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgibG9hZGluZ0luUHJvZ3Jlc3MiKTsKKyAgfQorCisgIHNob3coKSB7CisgICAgaWYgKHRoaXMudmlzaWJsZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMudmlzaWJsZSA9IHRydWU7CisgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJsb2FkaW5nSW5Qcm9ncmVzcyIpOworICAgIHRoaXMuYmFyLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOworICB9CisKK30KKworZXhwb3J0cy5Qcm9ncmVzc0JhciA9IFByb2dyZXNzQmFyOworCitmdW5jdGlvbiBtb3ZlVG9FbmRPZkFycmF5KGFyciwgY29uZGl0aW9uKSB7CisgIGNvbnN0IG1vdmVkID0gW10sCisgICAgICAgIGxlbiA9IGFyci5sZW5ndGg7CisgIGxldCB3cml0ZSA9IDA7CisKKyAgZm9yIChsZXQgcmVhZCA9IDA7IHJlYWQgPCBsZW47ICsrcmVhZCkgeworICAgIGlmIChjb25kaXRpb24oYXJyW3JlYWRdKSkgeworICAgICAgbW92ZWQucHVzaChhcnJbcmVhZF0pOworICAgIH0gZWxzZSB7CisgICAgICBhcnJbd3JpdGVdID0gYXJyW3JlYWRdOworICAgICAgKyt3cml0ZTsKKyAgICB9CisgIH0KKworICBmb3IgKGxldCByZWFkID0gMDsgd3JpdGUgPCBsZW47ICsrcmVhZCwgKyt3cml0ZSkgeworICAgIGFyclt3cml0ZV0gPSBtb3ZlZFtyZWFkXTsKKyAgfQorfQorCisvKioqLyB9KSwKKy8qIDQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5TaW1wbGVMaW5rU2VydmljZSA9IGV4cG9ydHMuUERGTGlua1NlcnZpY2UgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOworCitjbGFzcyBQREZMaW5rU2VydmljZSB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBldmVudEJ1cywKKyAgICBleHRlcm5hbExpbmtUYXJnZXQgPSBudWxsLAorICAgIGV4dGVybmFsTGlua1JlbCA9IG51bGwsCisgICAgZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWUsCisgICAgaWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2UKKyAgfSA9IHt9KSB7CisgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOworICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gZXh0ZXJuYWxMaW5rVGFyZ2V0OworICAgIHRoaXMuZXh0ZXJuYWxMaW5rUmVsID0gZXh0ZXJuYWxMaW5rUmVsOworICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IGV4dGVybmFsTGlua0VuYWJsZWQ7CisgICAgdGhpcy5faWdub3JlRGVzdGluYXRpb25ab29tID0gaWdub3JlRGVzdGluYXRpb25ab29tOworICAgIHRoaXMuYmFzZVVybCA9IG51bGw7CisgICAgdGhpcy5wZGZEb2N1bWVudCA9IG51bGw7CisgICAgdGhpcy5wZGZWaWV3ZXIgPSBudWxsOworICAgIHRoaXMucGRmSGlzdG9yeSA9IG51bGw7CisgICAgdGhpcy5fcGFnZXNSZWZDYWNoZSA9IG51bGw7CisgIH0KKworICBzZXREb2N1bWVudChwZGZEb2N1bWVudCwgYmFzZVVybCA9IG51bGwpIHsKKyAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsOworICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDsKKyAgICB0aGlzLl9wYWdlc1JlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgfQorCisgIHNldFZpZXdlcihwZGZWaWV3ZXIpIHsKKyAgICB0aGlzLnBkZlZpZXdlciA9IHBkZlZpZXdlcjsKKyAgfQorCisgIHNldEhpc3RvcnkocGRmSGlzdG9yeSkgeworICAgIHRoaXMucGRmSGlzdG9yeSA9IHBkZkhpc3Rvcnk7CisgIH0KKworICBnZXQgcGFnZXNDb3VudCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgOiAwOworICB9CisKKyAgZ2V0IHBhZ2UoKSB7CisgICAgcmV0dXJuIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyOworICB9CisKKyAgc2V0IHBhZ2UodmFsdWUpIHsKKyAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciA9IHZhbHVlOworICB9CisKKyAgZ2V0IHJvdGF0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5wYWdlc1JvdGF0aW9uOworICB9CisKKyAgc2V0IHJvdGF0aW9uKHZhbHVlKSB7CisgICAgdGhpcy5wZGZWaWV3ZXIucGFnZXNSb3RhdGlvbiA9IHZhbHVlOworICB9CisKKyAgbmF2aWdhdGVUbyhkZXN0KSB7CisgICAgY29uc3QgZ29Ub0Rlc3RpbmF0aW9uID0gKHsKKyAgICAgIG5hbWVkRGVzdCwKKyAgICAgIGV4cGxpY2l0RGVzdAorICAgIH0pID0+IHsKKyAgICAgIGNvbnN0IGRlc3RSZWYgPSBleHBsaWNpdERlc3RbMF07CisgICAgICBsZXQgcGFnZU51bWJlcjsKKworICAgICAgaWYgKGRlc3RSZWYgaW5zdGFuY2VvZiBPYmplY3QpIHsKKyAgICAgICAgcGFnZU51bWJlciA9IHRoaXMuX2NhY2hlZFBhZ2VOdW1iZXIoZGVzdFJlZik7CisKKyAgICAgICAgaWYgKHBhZ2VOdW1iZXIgPT09IG51bGwpIHsKKyAgICAgICAgICB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2VJbmRleChkZXN0UmVmKS50aGVuKHBhZ2VJbmRleCA9PiB7CisgICAgICAgICAgICB0aGlzLmNhY2hlUGFnZVJlZihwYWdlSW5kZXggKyAxLCBkZXN0UmVmKTsKKyAgICAgICAgICAgIGdvVG9EZXN0aW5hdGlvbih7CisgICAgICAgICAgICAgIG5hbWVkRGVzdCwKKyAgICAgICAgICAgICAgZXhwbGljaXREZXN0CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7CisgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvOiAiJHtkZXN0UmVmfSIgaXMgbm90IGAgKyBgYSB2YWxpZCBwYWdlIHJlZmVyZW5jZSwgZm9yIGRlc3Q9IiR7ZGVzdH0iLmApOworICAgICAgICAgIH0pOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGRlc3RSZWYpKSB7CisgICAgICAgIHBhZ2VOdW1iZXIgPSBkZXN0UmVmICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoYFBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86ICIke2Rlc3RSZWZ9IiBpcyBub3QgYCArIGBhIHZhbGlkIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSwgZm9yIGRlc3Q9IiR7ZGVzdH0iLmApOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICghcGFnZU51bWJlciB8fCBwYWdlTnVtYmVyIDwgMSB8fCBwYWdlTnVtYmVyID4gdGhpcy5wYWdlc0NvdW50KSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoYFBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86ICIke3BhZ2VOdW1iZXJ9IiBpcyBub3QgYCArIGBhIHZhbGlkIHBhZ2UgbnVtYmVyLCBmb3IgZGVzdD0iJHtkZXN0fSIuYCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkgeworICAgICAgICB0aGlzLnBkZkhpc3RvcnkucHVzaEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICB0aGlzLnBkZkhpc3RvcnkucHVzaCh7CisgICAgICAgICAgbmFtZWREZXN0LAorICAgICAgICAgIGV4cGxpY2l0RGVzdCwKKyAgICAgICAgICBwYWdlTnVtYmVyCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoeworICAgICAgICBwYWdlTnVtYmVyLAorICAgICAgICBkZXN0QXJyYXk6IGV4cGxpY2l0RGVzdCwKKyAgICAgICAgaWdub3JlRGVzdGluYXRpb25ab29tOiB0aGlzLl9pZ25vcmVEZXN0aW5hdGlvblpvb20KKyAgICAgIH0pOworICAgIH07CisKKyAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgICBpZiAodHlwZW9mIGRlc3QgPT09ICJzdHJpbmciKSB7CisgICAgICAgIHRoaXMucGRmRG9jdW1lbnQuZ2V0RGVzdGluYXRpb24oZGVzdCkudGhlbihkZXN0QXJyYXkgPT4geworICAgICAgICAgIHJlc29sdmUoeworICAgICAgICAgICAgbmFtZWREZXN0OiBkZXN0LAorICAgICAgICAgICAgZXhwbGljaXREZXN0OiBkZXN0QXJyYXkKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcmVzb2x2ZSh7CisgICAgICAgIG5hbWVkRGVzdDogIiIsCisgICAgICAgIGV4cGxpY2l0RGVzdDogZGVzdAorICAgICAgfSk7CisgICAgfSkudGhlbihkYXRhID0+IHsKKyAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhLmV4cGxpY2l0RGVzdCkpIHsKKyAgICAgICAgY29uc29sZS5lcnJvcihgUERGTGlua1NlcnZpY2UubmF2aWdhdGVUbzogIiR7ZGF0YS5leHBsaWNpdERlc3R9IiBpc2AgKyBgIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIGFycmF5LCBmb3IgZGVzdD0iJHtkZXN0fSIuYCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZ29Ub0Rlc3RpbmF0aW9uKGRhdGEpOworICAgIH0pOworICB9CisKKyAgZ2V0RGVzdGluYXRpb25IYXNoKGRlc3QpIHsKKyAgICBpZiAodHlwZW9mIGRlc3QgPT09ICJzdHJpbmciKSB7CisgICAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoIiMiICsgZXNjYXBlKGRlc3QpKTsKKyAgICB9CisKKyAgICBpZiAoQXJyYXkuaXNBcnJheShkZXN0KSkgeworICAgICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGVzdCk7CisgICAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoIiMiICsgZXNjYXBlKHN0cikpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmdldEFuY2hvclVybCgiIik7CisgIH0KKworICBnZXRBbmNob3JVcmwoYW5jaG9yKSB7CisgICAgcmV0dXJuICh0aGlzLmJhc2VVcmwgfHwgIiIpICsgYW5jaG9yOworICB9CisKKyAgc2V0SGFzaChoYXNoKSB7CisgICAgbGV0IHBhZ2VOdW1iZXIsIGRlc3Q7CisKKyAgICBpZiAoaGFzaC5pbmNsdWRlcygiPSIpKSB7CisgICAgICBjb25zdCBwYXJhbXMgPSAoMCwgX3VpX3V0aWxzLnBhcnNlUXVlcnlTdHJpbmcpKGhhc2gpOworCisgICAgICBpZiAoInNlYXJjaCIgaW4gcGFyYW1zKSB7CisgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goImZpbmRmcm9tdXJsaGFzaCIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgcXVlcnk6IHBhcmFtcy5zZWFyY2gucmVwbGFjZSgvIi9nLCAiIiksCisgICAgICAgICAgcGhyYXNlU2VhcmNoOiBwYXJhbXMucGhyYXNlID09PSAidHJ1ZSIKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGlmICgicGFnZSIgaW4gcGFyYW1zKSB7CisgICAgICAgIHBhZ2VOdW1iZXIgPSBwYXJhbXMucGFnZSB8IDAgfHwgMTsKKyAgICAgIH0KKworICAgICAgaWYgKCJ6b29tIiBpbiBwYXJhbXMpIHsKKyAgICAgICAgY29uc3Qgem9vbUFyZ3MgPSBwYXJhbXMuem9vbS5zcGxpdCgiLCIpOworICAgICAgICBjb25zdCB6b29tQXJnID0gem9vbUFyZ3NbMF07CisgICAgICAgIGNvbnN0IHpvb21BcmdOdW1iZXIgPSBwYXJzZUZsb2F0KHpvb21BcmcpOworCisgICAgICAgIGlmICghem9vbUFyZy5pbmNsdWRlcygiRml0IikpIHsKKyAgICAgICAgICBkZXN0ID0gW251bGwsIHsKKyAgICAgICAgICAgIG5hbWU6ICJYWVoiCisgICAgICAgICAgfSwgem9vbUFyZ3MubGVuZ3RoID4gMSA/IHpvb21BcmdzWzFdIHwgMCA6IG51bGwsIHpvb21BcmdzLmxlbmd0aCA+IDIgPyB6b29tQXJnc1syXSB8IDAgOiBudWxsLCB6b29tQXJnTnVtYmVyID8gem9vbUFyZ051bWJlciAvIDEwMCA6IHpvb21BcmddOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICh6b29tQXJnID09PSAiRml0IiB8fCB6b29tQXJnID09PSAiRml0QiIpIHsKKyAgICAgICAgICAgIGRlc3QgPSBbbnVsbCwgeworICAgICAgICAgICAgICBuYW1lOiB6b29tQXJnCisgICAgICAgICAgICB9XTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHpvb21BcmcgPT09ICJGaXRIIiB8fCB6b29tQXJnID09PSAiRml0QkgiIHx8IHpvb21BcmcgPT09ICJGaXRWIiB8fCB6b29tQXJnID09PSAiRml0QlYiKSB7CisgICAgICAgICAgICBkZXN0ID0gW251bGwsIHsKKyAgICAgICAgICAgICAgbmFtZTogem9vbUFyZworICAgICAgICAgICAgfSwgem9vbUFyZ3MubGVuZ3RoID4gMSA/IHpvb21BcmdzWzFdIHwgMCA6IG51bGxdOworICAgICAgICAgIH0gZWxzZSBpZiAoem9vbUFyZyA9PT0gIkZpdFIiKSB7CisgICAgICAgICAgICBpZiAoem9vbUFyZ3MubGVuZ3RoICE9PSA1KSB7CisgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BERkxpbmtTZXJ2aWNlLnNldEhhc2g6IE5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgIkZpdFIiLicpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7CisgICAgICAgICAgICAgICAgbmFtZTogem9vbUFyZworICAgICAgICAgICAgICB9LCB6b29tQXJnc1sxXSB8IDAsIHpvb21BcmdzWzJdIHwgMCwgem9vbUFyZ3NbM10gfCAwLCB6b29tQXJnc1s0XSB8IDBdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQREZMaW5rU2VydmljZS5zZXRIYXNoOiAiJHt6b29tQXJnfSIgaXMgbm90IGAgKyAiYSB2YWxpZCB6b29tIHZhbHVlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZGVzdCkgeworICAgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoeworICAgICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXIgfHwgdGhpcy5wYWdlLAorICAgICAgICAgIGRlc3RBcnJheTogZGVzdCwKKyAgICAgICAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0OiB0cnVlCisgICAgICAgIH0pOworICAgICAgfSBlbHNlIGlmIChwYWdlTnVtYmVyKSB7CisgICAgICAgIHRoaXMucGFnZSA9IHBhZ2VOdW1iZXI7CisgICAgICB9CisKKyAgICAgIGlmICgicGFnZW1vZGUiIGluIHBhcmFtcykgeworICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlbW9kZSIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgbW9kZTogcGFyYW1zLnBhZ2Vtb2RlCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBpZiAoIm5hbWVkZGVzdCIgaW4gcGFyYW1zKSB7CisgICAgICAgIHRoaXMubmF2aWdhdGVUbyhwYXJhbXMubmFtZWRkZXN0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZGVzdCA9IHVuZXNjYXBlKGhhc2gpOworCisgICAgICB0cnkgeworICAgICAgICBkZXN0ID0gSlNPTi5wYXJzZShkZXN0KTsKKworICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkpIHsKKyAgICAgICAgICBkZXN0ID0gZGVzdC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChleCkge30KKworICAgICAgaWYgKHR5cGVvZiBkZXN0ID09PSAic3RyaW5nIiB8fCBpc1ZhbGlkRXhwbGljaXREZXN0aW5hdGlvbihkZXN0KSkgeworICAgICAgICB0aGlzLm5hdmlnYXRlVG8oZGVzdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc29sZS5lcnJvcihgUERGTGlua1NlcnZpY2Uuc2V0SGFzaDogIiR7dW5lc2NhcGUoaGFzaCl9IiBpcyBub3QgYCArICJhIHZhbGlkIGRlc3RpbmF0aW9uLiIpOworICAgIH0KKyAgfQorCisgIGV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pIHsKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgY2FzZSAiR29CYWNrIjoKKyAgICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkgeworICAgICAgICAgIHRoaXMucGRmSGlzdG9yeS5iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiR29Gb3J3YXJkIjoKKyAgICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkgeworICAgICAgICAgIHRoaXMucGRmSGlzdG9yeS5mb3J3YXJkKCk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiTmV4dFBhZ2UiOgorICAgICAgICBpZiAodGhpcy5wYWdlIDwgdGhpcy5wYWdlc0NvdW50KSB7CisgICAgICAgICAgdGhpcy5wYWdlKys7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiUHJldlBhZ2UiOgorICAgICAgICBpZiAodGhpcy5wYWdlID4gMSkgeworICAgICAgICAgIHRoaXMucGFnZS0tOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIkxhc3RQYWdlIjoKKyAgICAgICAgdGhpcy5wYWdlID0gdGhpcy5wYWdlc0NvdW50OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiRmlyc3RQYWdlIjoKKyAgICAgICAgdGhpcy5wYWdlID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goIm5hbWVkYWN0aW9uIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgYWN0aW9uCisgICAgfSk7CisgIH0KKworICBjYWNoZVBhZ2VSZWYocGFnZU51bSwgcGFnZVJlZikgeworICAgIGlmICghcGFnZVJlZikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHJlZlN0ciA9IHBhZ2VSZWYuZ2VuID09PSAwID8gYCR7cGFnZVJlZi5udW19UmAgOiBgJHtwYWdlUmVmLm51bX1SJHtwYWdlUmVmLmdlbn1gOworICAgIHRoaXMuX3BhZ2VzUmVmQ2FjaGVbcmVmU3RyXSA9IHBhZ2VOdW07CisgIH0KKworICBfY2FjaGVkUGFnZU51bWJlcihwYWdlUmVmKSB7CisgICAgY29uc3QgcmVmU3RyID0gcGFnZVJlZi5nZW4gPT09IDAgPyBgJHtwYWdlUmVmLm51bX1SYCA6IGAke3BhZ2VSZWYubnVtfVIke3BhZ2VSZWYuZ2VufWA7CisgICAgcmV0dXJuIHRoaXMuX3BhZ2VzUmVmQ2FjaGUgJiYgdGhpcy5fcGFnZXNSZWZDYWNoZVtyZWZTdHJdIHx8IG51bGw7CisgIH0KKworICBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZWaWV3ZXIuaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKTsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGTGlua1NlcnZpY2UgPSBQREZMaW5rU2VydmljZTsKKworZnVuY3Rpb24gaXNWYWxpZEV4cGxpY2l0RGVzdGluYXRpb24oZGVzdCkgeworICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBkZXN0TGVuZ3RoID0gZGVzdC5sZW5ndGg7CisKKyAgaWYgKGRlc3RMZW5ndGggPCAyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgcGFnZSA9IGRlc3RbMF07CisKKyAgaWYgKCEodHlwZW9mIHBhZ2UgPT09ICJvYmplY3QiICYmIE51bWJlci5pc0ludGVnZXIocGFnZS5udW0pICYmIE51bWJlci5pc0ludGVnZXIocGFnZS5nZW4pKSAmJiAhKE51bWJlci5pc0ludGVnZXIocGFnZSkgJiYgcGFnZSA+PSAwKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IHpvb20gPSBkZXN0WzFdOworCisgIGlmICghKHR5cGVvZiB6b29tID09PSAib2JqZWN0IiAmJiB0eXBlb2Ygem9vbS5uYW1lID09PSAic3RyaW5nIikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBsZXQgYWxsb3dOdWxsID0gdHJ1ZTsKKworICBzd2l0Y2ggKHpvb20ubmFtZSkgeworICAgIGNhc2UgIlhZWiI6CisgICAgICBpZiAoZGVzdExlbmd0aCAhPT0gNSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAiRml0IjoKKyAgICBjYXNlICJGaXRCIjoKKyAgICAgIHJldHVybiBkZXN0TGVuZ3RoID09PSAyOworCisgICAgY2FzZSAiRml0SCI6CisgICAgY2FzZSAiRml0QkgiOgorICAgIGNhc2UgIkZpdFYiOgorICAgIGNhc2UgIkZpdEJWIjoKKyAgICAgIGlmIChkZXN0TGVuZ3RoICE9PSAzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJGaXRSIjoKKyAgICAgIGlmIChkZXN0TGVuZ3RoICE9PSA2KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYWxsb3dOdWxsID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3IgKGxldCBpID0gMjsgaSA8IGRlc3RMZW5ndGg7IGkrKykgeworICAgIGNvbnN0IHBhcmFtID0gZGVzdFtpXTsKKworICAgIGlmICghKHR5cGVvZiBwYXJhbSA9PT0gIm51bWJlciIgfHwgYWxsb3dOdWxsICYmIHBhcmFtID09PSBudWxsKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBTaW1wbGVMaW5rU2VydmljZSB7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gbnVsbDsKKyAgICB0aGlzLmV4dGVybmFsTGlua1JlbCA9IG51bGw7CisgICAgdGhpcy5leHRlcm5hbExpbmtFbmFibGVkID0gdHJ1ZTsKKyAgICB0aGlzLl9pZ25vcmVEZXN0aW5hdGlvblpvb20gPSBmYWxzZTsKKyAgfQorCisgIGdldCBwYWdlc0NvdW50KCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgZ2V0IHBhZ2UoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzZXQgcGFnZSh2YWx1ZSkge30KKworICBnZXQgcm90YXRpb24oKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzZXQgcm90YXRpb24odmFsdWUpIHt9CisKKyAgbmF2aWdhdGVUbyhkZXN0KSB7fQorCisgIGdldERlc3RpbmF0aW9uSGFzaChkZXN0KSB7CisgICAgcmV0dXJuICIjIjsKKyAgfQorCisgIGdldEFuY2hvclVybChoYXNoKSB7CisgICAgcmV0dXJuICIjIjsKKyAgfQorCisgIHNldEhhc2goaGFzaCkge30KKworICBleGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKSB7fQorCisgIGNhY2hlUGFnZVJlZihwYWdlTnVtLCBwYWdlUmVmKSB7fQorCisgIGlzUGFnZVZpc2libGUocGFnZU51bWJlcikgeworICAgIHJldHVybiB0cnVlOworICB9CisKK30KKworZXhwb3J0cy5TaW1wbGVMaW5rU2VydmljZSA9IFNpbXBsZUxpbmtTZXJ2aWNlOworCisvKioqLyB9KSwKKy8qIDUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5EZWZhdWx0VGV4dExheWVyRmFjdG9yeSA9IGV4cG9ydHMuVGV4dExheWVyQnVpbGRlciA9IHZvaWQgMDsKKwordmFyIF9wZGZqc0xpYiA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK2NvbnN0IEVYUEFORF9ESVZTX1RJTUVPVVQgPSAzMDA7CisKK2NsYXNzIFRleHRMYXllckJ1aWxkZXIgeworICBjb25zdHJ1Y3Rvcih7CisgICAgdGV4dExheWVyRGl2LAorICAgIGV2ZW50QnVzLAorICAgIHBhZ2VJbmRleCwKKyAgICB2aWV3cG9ydCwKKyAgICBmaW5kQ29udHJvbGxlciA9IG51bGwsCisgICAgZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBmYWxzZQorICB9KSB7CisgICAgdGhpcy50ZXh0TGF5ZXJEaXYgPSB0ZXh0TGF5ZXJEaXY7CisgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOworICAgIHRoaXMudGV4dENvbnRlbnQgPSBudWxsOworICAgIHRoaXMudGV4dENvbnRlbnRJdGVtc1N0ciA9IFtdOworICAgIHRoaXMudGV4dENvbnRlbnRTdHJlYW0gPSBudWxsOworICAgIHRoaXMucmVuZGVyaW5nRG9uZSA9IGZhbHNlOworICAgIHRoaXMucGFnZUlkeCA9IHBhZ2VJbmRleDsKKyAgICB0aGlzLnBhZ2VOdW1iZXIgPSB0aGlzLnBhZ2VJZHggKyAxOworICAgIHRoaXMubWF0Y2hlcyA9IFtdOworICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDsKKyAgICB0aGlzLnRleHREaXZzID0gW107CisgICAgdGhpcy5maW5kQ29udHJvbGxlciA9IGZpbmRDb250cm9sbGVyOworICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzayA9IG51bGw7CisgICAgdGhpcy5lbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGVuaGFuY2VUZXh0U2VsZWN0aW9uOworICAgIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyA9IG51bGw7CisKKyAgICB0aGlzLl9iaW5kTW91c2UoKTsKKyAgfQorCisgIF9maW5pc2hSZW5kZXJpbmcoKSB7CisgICAgdGhpcy5yZW5kZXJpbmdEb25lID0gdHJ1ZTsKKworICAgIGlmICghdGhpcy5lbmhhbmNlVGV4dFNlbGVjdGlvbikgeworICAgICAgY29uc3QgZW5kT2ZDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICBlbmRPZkNvbnRlbnQuY2xhc3NOYW1lID0gImVuZE9mQ29udGVudCI7CisgICAgICB0aGlzLnRleHRMYXllckRpdi5hcHBlbmRDaGlsZChlbmRPZkNvbnRlbnQpOworICAgIH0KKworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInRleHRsYXllcnJlbmRlcmVkIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZU51bWJlcjogdGhpcy5wYWdlTnVtYmVyLAorICAgICAgbnVtVGV4dERpdnM6IHRoaXMudGV4dERpdnMubGVuZ3RoCisgICAgfSk7CisgIH0KKworICByZW5kZXIodGltZW91dCA9IDApIHsKKyAgICBpZiAoISh0aGlzLnRleHRDb250ZW50IHx8IHRoaXMudGV4dENvbnRlbnRTdHJlYW0pIHx8IHRoaXMucmVuZGVyaW5nRG9uZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuY2FuY2VsKCk7CisgICAgdGhpcy50ZXh0RGl2cyA9IFtdOworICAgIGNvbnN0IHRleHRMYXllckZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrID0gKDAsIF9wZGZqc0xpYi5yZW5kZXJUZXh0TGF5ZXIpKHsKKyAgICAgIHRleHRDb250ZW50OiB0aGlzLnRleHRDb250ZW50LAorICAgICAgdGV4dENvbnRlbnRTdHJlYW06IHRoaXMudGV4dENvbnRlbnRTdHJlYW0sCisgICAgICBjb250YWluZXI6IHRleHRMYXllckZyYWcsCisgICAgICB2aWV3cG9ydDogdGhpcy52aWV3cG9ydCwKKyAgICAgIHRleHREaXZzOiB0aGlzLnRleHREaXZzLAorICAgICAgdGV4dENvbnRlbnRJdGVtc1N0cjogdGhpcy50ZXh0Q29udGVudEl0ZW1zU3RyLAorICAgICAgdGltZW91dCwKKyAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiB0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uCisgICAgfSk7CisgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrLnByb21pc2UudGhlbigoKSA9PiB7CisgICAgICB0aGlzLnRleHRMYXllckRpdi5hcHBlbmRDaGlsZCh0ZXh0TGF5ZXJGcmFnKTsKKworICAgICAgdGhpcy5fZmluaXNoUmVuZGVyaW5nKCk7CisKKyAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoZXMoKTsKKyAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7fSk7CisKKyAgICBpZiAoIXRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcykgeworICAgICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzID0gZXZ0ID0+IHsKKyAgICAgICAgaWYgKGV2dC5wYWdlSW5kZXggPT09IHRoaXMucGFnZUlkeCB8fCBldnQucGFnZUluZGV4ID09PSAtMSkgeworICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoZXMoKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdGhpcy5ldmVudEJ1cy5fb24oInVwZGF0ZXRleHRsYXllcm1hdGNoZXMiLCB0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMpOworICAgIH0KKyAgfQorCisgIGNhbmNlbCgpIHsKKyAgICBpZiAodGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrKSB7CisgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2suY2FuY2VsKCk7CisgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2sgPSBudWxsOworICAgIH0KKworICAgIGlmICh0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMpIHsKKyAgICAgIHRoaXMuZXZlbnRCdXMuX29mZigidXBkYXRldGV4dGxheWVybWF0Y2hlcyIsIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyk7CisKKyAgICAgIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyA9IG51bGw7CisgICAgfQorICB9CisKKyAgc2V0VGV4dENvbnRlbnRTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHsKKyAgICB0aGlzLmNhbmNlbCgpOworICAgIHRoaXMudGV4dENvbnRlbnRTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTsKKyAgfQorCisgIHNldFRleHRDb250ZW50KHRleHRDb250ZW50KSB7CisgICAgdGhpcy5jYW5jZWwoKTsKKyAgICB0aGlzLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7CisgIH0KKworICBfY29udmVydE1hdGNoZXMobWF0Y2hlcywgbWF0Y2hlc0xlbmd0aCkgeworICAgIGlmICghbWF0Y2hlcykgeworICAgICAgcmV0dXJuIFtdOworICAgIH0KKworICAgIGNvbnN0IHsKKyAgICAgIGZpbmRDb250cm9sbGVyLAorICAgICAgdGV4dENvbnRlbnRJdGVtc1N0cgorICAgIH0gPSB0aGlzOworICAgIGxldCBpID0gMCwKKyAgICAgICAgaUluZGV4ID0gMDsKKyAgICBjb25zdCBlbmQgPSB0ZXh0Q29udGVudEl0ZW1zU3RyLmxlbmd0aCAtIDE7CisgICAgY29uc3QgcXVlcnlMZW4gPSBmaW5kQ29udHJvbGxlci5zdGF0ZS5xdWVyeS5sZW5ndGg7CisgICAgY29uc3QgcmVzdWx0ID0gW107CisKKyAgICBmb3IgKGxldCBtID0gMCwgbW0gPSBtYXRjaGVzLmxlbmd0aDsgbSA8IG1tOyBtKyspIHsKKyAgICAgIGxldCBtYXRjaElkeCA9IG1hdGNoZXNbbV07CisKKyAgICAgIHdoaWxlIChpICE9PSBlbmQgJiYgbWF0Y2hJZHggPj0gaUluZGV4ICsgdGV4dENvbnRlbnRJdGVtc1N0cltpXS5sZW5ndGgpIHsKKyAgICAgICAgaUluZGV4ICs9IHRleHRDb250ZW50SXRlbXNTdHJbaV0ubGVuZ3RoOworICAgICAgICBpKys7CisgICAgICB9CisKKyAgICAgIGlmIChpID09PSB0ZXh0Q29udGVudEl0ZW1zU3RyLmxlbmd0aCkgeworICAgICAgICBjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIG1hcHBpbmciKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgbWF0Y2ggPSB7CisgICAgICAgIGJlZ2luOiB7CisgICAgICAgICAgZGl2SWR4OiBpLAorICAgICAgICAgIG9mZnNldDogbWF0Y2hJZHggLSBpSW5kZXgKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgaWYgKG1hdGNoZXNMZW5ndGgpIHsKKyAgICAgICAgbWF0Y2hJZHggKz0gbWF0Y2hlc0xlbmd0aFttXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hdGNoSWR4ICs9IHF1ZXJ5TGVuOworICAgICAgfQorCisgICAgICB3aGlsZSAoaSAhPT0gZW5kICYmIG1hdGNoSWR4ID4gaUluZGV4ICsgdGV4dENvbnRlbnRJdGVtc1N0cltpXS5sZW5ndGgpIHsKKyAgICAgICAgaUluZGV4ICs9IHRleHRDb250ZW50SXRlbXNTdHJbaV0ubGVuZ3RoOworICAgICAgICBpKys7CisgICAgICB9CisKKyAgICAgIG1hdGNoLmVuZCA9IHsKKyAgICAgICAgZGl2SWR4OiBpLAorICAgICAgICBvZmZzZXQ6IG1hdGNoSWR4IC0gaUluZGV4CisgICAgICB9OworICAgICAgcmVzdWx0LnB1c2gobWF0Y2gpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBfcmVuZGVyTWF0Y2hlcyhtYXRjaGVzKSB7CisgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgeworICAgICAgZmluZENvbnRyb2xsZXIsCisgICAgICBwYWdlSWR4LAorICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ciwKKyAgICAgIHRleHREaXZzCisgICAgfSA9IHRoaXM7CisgICAgY29uc3QgaXNTZWxlY3RlZFBhZ2UgPSBwYWdlSWR4ID09PSBmaW5kQ29udHJvbGxlci5zZWxlY3RlZC5wYWdlSWR4OworICAgIGNvbnN0IHNlbGVjdGVkTWF0Y2hJZHggPSBmaW5kQ29udHJvbGxlci5zZWxlY3RlZC5tYXRjaElkeDsKKyAgICBjb25zdCBoaWdobGlnaHRBbGwgPSBmaW5kQ29udHJvbGxlci5zdGF0ZS5oaWdobGlnaHRBbGw7CisgICAgbGV0IHByZXZFbmQgPSBudWxsOworICAgIGNvbnN0IGluZmluaXR5ID0geworICAgICAgZGl2SWR4OiAtMSwKKyAgICAgIG9mZnNldDogdW5kZWZpbmVkCisgICAgfTsKKworICAgIGZ1bmN0aW9uIGJlZ2luVGV4dChiZWdpbiwgY2xhc3NOYW1lKSB7CisgICAgICBjb25zdCBkaXZJZHggPSBiZWdpbi5kaXZJZHg7CisgICAgICB0ZXh0RGl2c1tkaXZJZHhdLnRleHRDb250ZW50ID0gIiI7CisgICAgICBhcHBlbmRUZXh0VG9EaXYoZGl2SWR4LCAwLCBiZWdpbi5vZmZzZXQsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gYXBwZW5kVGV4dFRvRGl2KGRpdklkeCwgZnJvbU9mZnNldCwgdG9PZmZzZXQsIGNsYXNzTmFtZSkgeworICAgICAgY29uc3QgZGl2ID0gdGV4dERpdnNbZGl2SWR4XTsKKyAgICAgIGNvbnN0IGNvbnRlbnQgPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2RpdklkeF0uc3Vic3RyaW5nKGZyb21PZmZzZXQsIHRvT2Zmc2V0KTsKKyAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KTsKKworICAgICAgaWYgKGNsYXNzTmFtZSkgeworICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgICAgc3Bhbi5hcHBlbmRDaGlsZChub2RlKTsKKyAgICAgICAgZGl2LmFwcGVuZENoaWxkKHNwYW4pOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKTsKKyAgICB9CisKKyAgICBsZXQgaTAgPSBzZWxlY3RlZE1hdGNoSWR4LAorICAgICAgICBpMSA9IGkwICsgMTsKKworICAgIGlmIChoaWdobGlnaHRBbGwpIHsKKyAgICAgIGkwID0gMDsKKyAgICAgIGkxID0gbWF0Y2hlcy5sZW5ndGg7CisgICAgfSBlbHNlIGlmICghaXNTZWxlY3RlZFBhZ2UpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gaTA7IGkgPCBpMTsgaSsrKSB7CisgICAgICBjb25zdCBtYXRjaCA9IG1hdGNoZXNbaV07CisgICAgICBjb25zdCBiZWdpbiA9IG1hdGNoLmJlZ2luOworICAgICAgY29uc3QgZW5kID0gbWF0Y2guZW5kOworICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWRQYWdlICYmIGkgPT09IHNlbGVjdGVkTWF0Y2hJZHg7CisgICAgICBjb25zdCBoaWdobGlnaHRTdWZmaXggPSBpc1NlbGVjdGVkID8gIiBzZWxlY3RlZCIgOiAiIjsKKworICAgICAgaWYgKGlzU2VsZWN0ZWQpIHsKKyAgICAgICAgZmluZENvbnRyb2xsZXIuc2Nyb2xsTWF0Y2hJbnRvVmlldyh7CisgICAgICAgICAgZWxlbWVudDogdGV4dERpdnNbYmVnaW4uZGl2SWR4XSwKKyAgICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJZHgsCisgICAgICAgICAgbWF0Y2hJbmRleDogc2VsZWN0ZWRNYXRjaElkeAorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgaWYgKCFwcmV2RW5kIHx8IGJlZ2luLmRpdklkeCAhPT0gcHJldkVuZC5kaXZJZHgpIHsKKyAgICAgICAgaWYgKHByZXZFbmQgIT09IG51bGwpIHsKKyAgICAgICAgICBhcHBlbmRUZXh0VG9EaXYocHJldkVuZC5kaXZJZHgsIHByZXZFbmQub2Zmc2V0LCBpbmZpbml0eS5vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgYmVnaW5UZXh0KGJlZ2luKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFwcGVuZFRleHRUb0RpdihwcmV2RW5kLmRpdklkeCwgcHJldkVuZC5vZmZzZXQsIGJlZ2luLm9mZnNldCk7CisgICAgICB9CisKKyAgICAgIGlmIChiZWdpbi5kaXZJZHggPT09IGVuZC5kaXZJZHgpIHsKKyAgICAgICAgYXBwZW5kVGV4dFRvRGl2KGJlZ2luLmRpdklkeCwgYmVnaW4ub2Zmc2V0LCBlbmQub2Zmc2V0LCAiaGlnaGxpZ2h0IiArIGhpZ2hsaWdodFN1ZmZpeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcHBlbmRUZXh0VG9EaXYoYmVnaW4uZGl2SWR4LCBiZWdpbi5vZmZzZXQsIGluZmluaXR5Lm9mZnNldCwgImhpZ2hsaWdodCBiZWdpbiIgKyBoaWdobGlnaHRTdWZmaXgpOworCisgICAgICAgIGZvciAobGV0IG4wID0gYmVnaW4uZGl2SWR4ICsgMSwgbjEgPSBlbmQuZGl2SWR4OyBuMCA8IG4xOyBuMCsrKSB7CisgICAgICAgICAgdGV4dERpdnNbbjBdLmNsYXNzTmFtZSA9ICJoaWdobGlnaHQgbWlkZGxlIiArIGhpZ2hsaWdodFN1ZmZpeDsKKyAgICAgICAgfQorCisgICAgICAgIGJlZ2luVGV4dChlbmQsICJoaWdobGlnaHQgZW5kIiArIGhpZ2hsaWdodFN1ZmZpeCk7CisgICAgICB9CisKKyAgICAgIHByZXZFbmQgPSBlbmQ7CisgICAgfQorCisgICAgaWYgKHByZXZFbmQpIHsKKyAgICAgIGFwcGVuZFRleHRUb0RpdihwcmV2RW5kLmRpdklkeCwgcHJldkVuZC5vZmZzZXQsIGluZmluaXR5Lm9mZnNldCk7CisgICAgfQorICB9CisKKyAgX3VwZGF0ZU1hdGNoZXMoKSB7CisgICAgaWYgKCF0aGlzLnJlbmRlcmluZ0RvbmUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB7CisgICAgICBmaW5kQ29udHJvbGxlciwKKyAgICAgIG1hdGNoZXMsCisgICAgICBwYWdlSWR4LAorICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ciwKKyAgICAgIHRleHREaXZzCisgICAgfSA9IHRoaXM7CisgICAgbGV0IGNsZWFyZWRVbnRpbERpdklkeCA9IC0xOworCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbWF0Y2hlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICBjb25zdCBtYXRjaCA9IG1hdGNoZXNbaV07CisgICAgICBjb25zdCBiZWdpbiA9IE1hdGgubWF4KGNsZWFyZWRVbnRpbERpdklkeCwgbWF0Y2guYmVnaW4uZGl2SWR4KTsKKworICAgICAgZm9yIChsZXQgbiA9IGJlZ2luLCBlbmQgPSBtYXRjaC5lbmQuZGl2SWR4OyBuIDw9IGVuZDsgbisrKSB7CisgICAgICAgIGNvbnN0IGRpdiA9IHRleHREaXZzW25dOworICAgICAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudEl0ZW1zU3RyW25dOworICAgICAgICBkaXYuY2xhc3NOYW1lID0gIiI7CisgICAgICB9CisKKyAgICAgIGNsZWFyZWRVbnRpbERpdklkeCA9IG1hdGNoLmVuZC5kaXZJZHggKyAxOworICAgIH0KKworICAgIGlmICghZmluZENvbnRyb2xsZXIgfHwgIWZpbmRDb250cm9sbGVyLmhpZ2hsaWdodE1hdGNoZXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBwYWdlTWF0Y2hlcyA9IGZpbmRDb250cm9sbGVyLnBhZ2VNYXRjaGVzW3BhZ2VJZHhdIHx8IG51bGw7CisgICAgY29uc3QgcGFnZU1hdGNoZXNMZW5ndGggPSBmaW5kQ29udHJvbGxlci5wYWdlTWF0Y2hlc0xlbmd0aFtwYWdlSWR4XSB8fCBudWxsOworICAgIHRoaXMubWF0Y2hlcyA9IHRoaXMuX2NvbnZlcnRNYXRjaGVzKHBhZ2VNYXRjaGVzLCBwYWdlTWF0Y2hlc0xlbmd0aCk7CisKKyAgICB0aGlzLl9yZW5kZXJNYXRjaGVzKHRoaXMubWF0Y2hlcyk7CisgIH0KKworICBfYmluZE1vdXNlKCkgeworICAgIGNvbnN0IGRpdiA9IHRoaXMudGV4dExheWVyRGl2OworICAgIGxldCBleHBhbmREaXZzVGltZXIgPSBudWxsOworICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCBldnQgPT4geworICAgICAgaWYgKHRoaXMuZW5oYW5jZVRleHRTZWxlY3Rpb24gJiYgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrKSB7CisgICAgICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5leHBhbmRUZXh0RGl2cyh0cnVlKTsKKworICAgICAgICBpZiAoZXhwYW5kRGl2c1RpbWVyKSB7CisgICAgICAgICAgY2xlYXJUaW1lb3V0KGV4cGFuZERpdnNUaW1lcik7CisgICAgICAgICAgZXhwYW5kRGl2c1RpbWVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgZW5kID0gZGl2LnF1ZXJ5U2VsZWN0b3IoIi5lbmRPZkNvbnRlbnQiKTsKKworICAgICAgaWYgKCFlbmQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBsZXQgYWRqdXN0VG9wID0gZXZ0LnRhcmdldCAhPT0gZGl2OworICAgICAgYWRqdXN0VG9wID0gYWRqdXN0VG9wICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVuZCkuZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei11c2VyLXNlbGVjdCIpICE9PSAibm9uZSI7CisKKyAgICAgIGlmIChhZGp1c3RUb3ApIHsKKyAgICAgICAgY29uc3QgZGl2Qm91bmRzID0gZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOworICAgICAgICBjb25zdCByID0gTWF0aC5tYXgoMCwgKGV2dC5wYWdlWSAtIGRpdkJvdW5kcy50b3ApIC8gZGl2Qm91bmRzLmhlaWdodCk7CisgICAgICAgIGVuZC5zdHlsZS50b3AgPSAociAqIDEwMCkudG9GaXhlZCgyKSArICIlIjsKKyAgICAgIH0KKworICAgICAgZW5kLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOworICAgIH0pOworICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgKCkgPT4geworICAgICAgaWYgKHRoaXMuZW5oYW5jZVRleHRTZWxlY3Rpb24gJiYgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrKSB7CisgICAgICAgIGV4cGFuZERpdnNUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICAgIGlmICh0aGlzLnRleHRMYXllclJlbmRlclRhc2spIHsKKyAgICAgICAgICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5leHBhbmRUZXh0RGl2cyhmYWxzZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZXhwYW5kRGl2c1RpbWVyID0gbnVsbDsKKyAgICAgICAgfSwgRVhQQU5EX0RJVlNfVElNRU9VVCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3QgZW5kID0gZGl2LnF1ZXJ5U2VsZWN0b3IoIi5lbmRPZkNvbnRlbnQiKTsKKworICAgICAgaWYgKCFlbmQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBlbmQuc3R5bGUudG9wID0gIiI7CisgICAgICBlbmQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIik7CisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLlRleHRMYXllckJ1aWxkZXIgPSBUZXh0TGF5ZXJCdWlsZGVyOworCitjbGFzcyBEZWZhdWx0VGV4dExheWVyRmFjdG9yeSB7CisgIGNyZWF0ZVRleHRMYXllckJ1aWxkZXIodGV4dExheWVyRGl2LCBwYWdlSW5kZXgsIHZpZXdwb3J0LCBlbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGZhbHNlLCBldmVudEJ1cykgeworICAgIHJldHVybiBuZXcgVGV4dExheWVyQnVpbGRlcih7CisgICAgICB0ZXh0TGF5ZXJEaXYsCisgICAgICBwYWdlSW5kZXgsCisgICAgICB2aWV3cG9ydCwKKyAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uLAorICAgICAgZXZlbnRCdXMKKyAgICB9KTsKKyAgfQorCit9CisKK2V4cG9ydHMuRGVmYXVsdFRleHRMYXllckZhY3RvcnkgPSBEZWZhdWx0VGV4dExheWVyRmFjdG9yeTsKKworLyoqKi8gfSksCisvKiA2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuRG93bmxvYWRNYW5hZ2VyID0gdm9pZCAwOworCit2YXIgX3BkZmpzTGliID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKwordmFyIF92aWV3ZXJfY29tcGF0aWJpbGl0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7CisKKzsKKworZnVuY3Rpb24gZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpIHsKKyAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKworICBpZiAoIWEuY2xpY2spIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rvd25sb2FkTWFuYWdlcjogImEuY2xpY2soKSIgaXMgbm90IHN1cHBvcnRlZC4nKTsKKyAgfQorCisgIGEuaHJlZiA9IGJsb2JVcmw7CisgIGEudGFyZ2V0ID0gIl9wYXJlbnQiOworCisgIGlmICgiZG93bmxvYWQiIGluIGEpIHsKKyAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7CisgIH0KKworICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGEpOworICBhLmNsaWNrKCk7CisgIGEucmVtb3ZlKCk7Cit9CisKK2NsYXNzIERvd25sb2FkTWFuYWdlciB7CisgIGRvd25sb2FkVXJsKHVybCwgZmlsZW5hbWUpIHsKKyAgICBpZiAoISgwLCBfcGRmanNMaWIuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodXJsLCAiaHR0cDovL2V4YW1wbGUuY29tIikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkb3dubG9hZCh1cmwgKyAiI3BkZmpzLmFjdGlvbj1kb3dubG9hZCIsIGZpbGVuYW1lKTsKKyAgfQorCisgIGRvd25sb2FkRGF0YShkYXRhLCBmaWxlbmFtZSwgY29udGVudFR5cGUpIHsKKyAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHsKKyAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKG5ldyBCbG9iKFtkYXRhXSwgeworICAgICAgICB0eXBlOiBjb250ZW50VHlwZQorICAgICAgfSksIGZpbGVuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBibG9iVXJsID0gKDAsIF9wZGZqc0xpYi5jcmVhdGVPYmplY3RVUkwpKGRhdGEsIGNvbnRlbnRUeXBlLCBfdmlld2VyX2NvbXBhdGliaWxpdHkudmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcy5kaXNhYmxlQ3JlYXRlT2JqZWN0VVJMKTsKKyAgICBkb3dubG9hZChibG9iVXJsLCBmaWxlbmFtZSk7CisgIH0KKworICBkb3dubG9hZChibG9iLCB1cmwsIGZpbGVuYW1lLCBzb3VyY2VFdmVudFR5cGUgPSAiZG93bmxvYWQiKSB7CisgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7CisgICAgICBpZiAoIW5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKSkgeworICAgICAgICB0aGlzLmRvd25sb2FkVXJsKHVybCwgZmlsZW5hbWUpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKF92aWV3ZXJfY29tcGF0aWJpbGl0eS52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVDcmVhdGVPYmplY3RVUkwpIHsKKyAgICAgIHRoaXMuZG93bmxvYWRVcmwodXJsLCBmaWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CisgICAgZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpOworICB9CisKK30KKworZXhwb3J0cy5Eb3dubG9hZE1hbmFnZXIgPSBEb3dubG9hZE1hbmFnZXI7CisKKy8qKiovIH0pLAorLyogNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLnZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMgPSB2b2lkIDA7Citjb25zdCBjb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKK3sKKyAgY29uc3QgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gInVuZGVmaW5lZCIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAiIjsKKyAgY29uc3QgcGxhdGZvcm0gPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAidW5kZWZpbmVkIiAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gfHwgIiI7CisgIGNvbnN0IG1heFRvdWNoUG9pbnRzID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gInVuZGVmaW5lZCIgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IDE7CisgIGNvbnN0IGlzQW5kcm9pZCA9IC9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCk7CisgIGNvbnN0IGlzSUUgPSAvVHJpZGVudC8udGVzdCh1c2VyQWdlbnQpOworICBjb25zdCBpc0lPUyA9IC9cYihpUGFkfGlQaG9uZXxpUG9kKSg/PTspLy50ZXN0KHVzZXJBZ2VudCkgfHwgcGxhdGZvcm0gPT09ICJNYWNJbnRlbCIgJiYgbWF4VG91Y2hQb2ludHMgPiAxOworICBjb25zdCBpc0lPU0Nocm9tZSA9IC9DcmlPUy8udGVzdCh1c2VyQWdlbnQpOworCisgIChmdW5jdGlvbiBjaGVja09uQmxvYlN1cHBvcnQoKSB7CisgICAgaWYgKGlzSUUgfHwgaXNJT1NDaHJvbWUpIHsKKyAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUNyZWF0ZU9iamVjdFVSTCA9IHRydWU7CisgICAgfQorICB9KSgpOworCisgIChmdW5jdGlvbiBjaGVja0NhbnZhc1NpemVMaW1pdGF0aW9uKCkgeworICAgIGlmIChpc0lPUyB8fCBpc0FuZHJvaWQpIHsKKyAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMubWF4Q2FudmFzUGl4ZWxzID0gNTI0Mjg4MDsKKyAgICB9CisgIH0pKCk7Cit9Citjb25zdCB2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmZyZWV6ZShjb21wYXRpYmlsaXR5UGFyYW1zKTsKK2V4cG9ydHMudmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcyA9IHZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXM7CisKKy8qKiovIH0pLAorLyogOCAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLkdlbmVyaWNMMTBuID0gdm9pZCAwOworCitfX3dfcGRmanNfcmVxdWlyZV9fKDkpOworCitjb25zdCB3ZWJMMTBuID0gZG9jdW1lbnQud2ViTDEwbjsKKworY2xhc3MgR2VuZXJpY0wxMG4geworICBjb25zdHJ1Y3RvcihsYW5nKSB7CisgICAgdGhpcy5fbGFuZyA9IGxhbmc7CisgICAgdGhpcy5fcmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgICB3ZWJMMTBuLnNldExhbmd1YWdlKGxhbmcsICgpID0+IHsKKyAgICAgICAgcmVzb2x2ZSh3ZWJMMTBuKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgYXN5bmMgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgY29uc3QgbDEwbiA9IGF3YWl0IHRoaXMuX3JlYWR5OworICAgIHJldHVybiBsMTBuLmdldExhbmd1YWdlKCk7CisgIH0KKworICBhc3luYyBnZXREaXJlY3Rpb24oKSB7CisgICAgY29uc3QgbDEwbiA9IGF3YWl0IHRoaXMuX3JlYWR5OworICAgIHJldHVybiBsMTBuLmdldERpcmVjdGlvbigpOworICB9CisKKyAgYXN5bmMgZ2V0KHByb3BlcnR5LCBhcmdzLCBmYWxsYmFjaykgeworICAgIGNvbnN0IGwxMG4gPSBhd2FpdCB0aGlzLl9yZWFkeTsKKyAgICByZXR1cm4gbDEwbi5nZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKTsKKyAgfQorCisgIGFzeW5jIHRyYW5zbGF0ZShlbGVtZW50KSB7CisgICAgY29uc3QgbDEwbiA9IGF3YWl0IHRoaXMuX3JlYWR5OworICAgIHJldHVybiBsMTBuLnRyYW5zbGF0ZShlbGVtZW50KTsKKyAgfQorCit9CisKK2V4cG9ydHMuR2VuZXJpY0wxMG4gPSBHZW5lcmljTDEwbjsKKworLyoqKi8gfSksCisvKiA5ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitkb2N1bWVudC53ZWJMMTBuID0gZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkgeworICB2YXIgZ0wxMG5EYXRhID0ge307CisgIHZhciBnVGV4dERhdGEgPSAnJzsKKyAgdmFyIGdUZXh0UHJvcCA9ICd0ZXh0Q29udGVudCc7CisgIHZhciBnTGFuZ3VhZ2UgPSAnJzsKKyAgdmFyIGdNYWNyb3MgPSB7fTsKKyAgdmFyIGdSZWFkeVN0YXRlID0gJ2xvYWRpbmcnOworICB2YXIgZ0FzeW5jUmVzb3VyY2VMb2FkaW5nID0gdHJ1ZTsKKworICBmdW5jdGlvbiBnZXRMMTBuUmVzb3VyY2VMaW5rcygpIHsKKyAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1t0eXBlPSJhcHBsaWNhdGlvbi9sMTBuIl0nKTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldEwxMG5EaWN0aW9uYXJ5KCkgeworICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vbDEwbiJdJyk7CisgICAgcmV0dXJuIHNjcmlwdCA/IEpTT04ucGFyc2Uoc2NyaXB0LmlubmVySFRNTCkgOiBudWxsOworICB9CisKKyAgZnVuY3Rpb24gZ2V0VHJhbnNsYXRhYmxlQ2hpbGRyZW4oZWxlbWVudCkgeworICAgIHJldHVybiBlbGVtZW50ID8gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqW2RhdGEtbDEwbi1pZF0nKSA6IFtdOworICB9CisKKyAgZnVuY3Rpb24gZ2V0TDEwbkF0dHJpYnV0ZXMoZWxlbWVudCkgeworICAgIGlmICghZWxlbWVudCkgcmV0dXJuIHt9OworICAgIHZhciBsMTBuSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1sMTBuLWlkJyk7CisgICAgdmFyIGwxMG5BcmdzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbDEwbi1hcmdzJyk7CisgICAgdmFyIGFyZ3MgPSB7fTsKKworICAgIGlmIChsMTBuQXJncykgeworICAgICAgdHJ5IHsKKyAgICAgICAgYXJncyA9IEpTT04ucGFyc2UobDEwbkFyZ3MpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBjb25zb2xlLndhcm4oJ2NvdWxkIG5vdCBwYXJzZSBhcmd1bWVudHMgZm9yICMnICsgbDEwbklkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgaWQ6IGwxMG5JZCwKKyAgICAgIGFyZ3M6IGFyZ3MKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24geGhyTG9hZFRleHQodXJsLCBvblN1Y2Nlc3MsIG9uRmFpbHVyZSkgeworICAgIG9uU3VjY2VzcyA9IG9uU3VjY2VzcyB8fCBmdW5jdGlvbiBfb25TdWNjZXNzKGRhdGEpIHt9OworCisgICAgb25GYWlsdXJlID0gb25GYWlsdXJlIHx8IGZ1bmN0aW9uIF9vbkZhaWx1cmUoKSB7fTsKKworICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgICB4aHIub3BlbignR0VUJywgdXJsLCBnQXN5bmNSZXNvdXJjZUxvYWRpbmcpOworCisgICAgaWYgKHhoci5vdmVycmlkZU1pbWVUeXBlKSB7CisgICAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcpOworICAgIH0KKworICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT0gNCkgeworICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgeGhyLnN0YXR1cyA9PT0gMCkgeworICAgICAgICAgIG9uU3VjY2Vzcyh4aHIucmVzcG9uc2VUZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvbkZhaWx1cmUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICB4aHIub25lcnJvciA9IG9uRmFpbHVyZTsKKyAgICB4aHIub250aW1lb3V0ID0gb25GYWlsdXJlOworCisgICAgdHJ5IHsKKyAgICAgIHhoci5zZW5kKG51bGwpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIG9uRmFpbHVyZSgpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlUmVzb3VyY2UoaHJlZiwgbGFuZywgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHsKKyAgICB2YXIgYmFzZVVSTCA9IGhyZWYucmVwbGFjZSgvW15cL10qJC8sICcnKSB8fCAnLi8nOworCisgICAgZnVuY3Rpb24gZXZhbFN0cmluZyh0ZXh0KSB7CisgICAgICBpZiAodGV4dC5sYXN0SW5kZXhPZignXFwnKSA8IDApIHJldHVybiB0ZXh0OworICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxcXC9nLCAnXFwnKS5yZXBsYWNlKC9cXG4vZywgJ1xuJykucmVwbGFjZSgvXFxyL2csICdccicpLnJlcGxhY2UoL1xcdC9nLCAnXHQnKS5yZXBsYWNlKC9cXGIvZywgJ1xiJykucmVwbGFjZSgvXFxmL2csICdcZicpLnJlcGxhY2UoL1xcey9nLCAneycpLnJlcGxhY2UoL1xcfS9nLCAnfScpLnJlcGxhY2UoL1xcIi9nLCAnIicpLnJlcGxhY2UoL1xcJy9nLCAiJyIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHBhcnNlUHJvcGVydGllcyh0ZXh0LCBwYXJzZWRQcm9wZXJ0aWVzQ2FsbGJhY2spIHsKKyAgICAgIHZhciBkaWN0aW9uYXJ5ID0ge307CisgICAgICB2YXIgcmVCbGFuayA9IC9eXHMqfFxzKiQvOworICAgICAgdmFyIHJlQ29tbWVudCA9IC9eXHMqI3xeXHMqJC87CisgICAgICB2YXIgcmVTZWN0aW9uID0gL15ccypcWyguKilcXVxzKiQvOworICAgICAgdmFyIHJlSW1wb3J0ID0gL15ccypAaW1wb3J0XHMrdXJsXCgoLiopXClccyokL2k7CisgICAgICB2YXIgcmVTcGxpdCA9IC9eKFtePVxzXSopXHMqPVxzKiguKykkLzsKKworICAgICAgZnVuY3Rpb24gcGFyc2VSYXdMaW5lcyhyYXdUZXh0LCBleHRlbmRlZFN5bnRheCwgcGFyc2VkUmF3TGluZXNDYWxsYmFjaykgeworICAgICAgICB2YXIgZW50cmllcyA9IHJhd1RleHQucmVwbGFjZShyZUJsYW5rLCAnJykuc3BsaXQoL1tcclxuXSsvKTsKKyAgICAgICAgdmFyIGN1cnJlbnRMYW5nID0gJyonOworICAgICAgICB2YXIgZ2VuZXJpY0xhbmcgPSBsYW5nLnNwbGl0KCctJywgMSlbMF07CisgICAgICAgIHZhciBza2lwTGFuZyA9IGZhbHNlOworICAgICAgICB2YXIgbWF0Y2ggPSAnJzsKKworICAgICAgICBmdW5jdGlvbiBuZXh0RW50cnkoKSB7CisgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmICghZW50cmllcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgcGFyc2VkUmF3TGluZXNDYWxsYmFjaygpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBsaW5lID0gZW50cmllcy5zaGlmdCgpOworICAgICAgICAgICAgaWYgKHJlQ29tbWVudC50ZXN0KGxpbmUpKSBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGV4dGVuZGVkU3ludGF4KSB7CisgICAgICAgICAgICAgIG1hdGNoID0gcmVTZWN0aW9uLmV4ZWMobGluZSk7CisKKyAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgICAgICAgY3VycmVudExhbmcgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgIHNraXBMYW5nID0gY3VycmVudExhbmcgIT09ICcqJyAmJiBjdXJyZW50TGFuZyAhPT0gbGFuZyAmJiBjdXJyZW50TGFuZyAhPT0gZ2VuZXJpY0xhbmc7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcExhbmcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG1hdGNoID0gcmVJbXBvcnQuZXhlYyhsaW5lKTsKKworICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgICAgICBsb2FkSW1wb3J0KGJhc2VVUkwgKyBtYXRjaFsxXSwgbmV4dEVudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHRtcCA9IGxpbmUubWF0Y2gocmVTcGxpdCk7CisKKyAgICAgICAgICAgIGlmICh0bXAgJiYgdG1wLmxlbmd0aCA9PSAzKSB7CisgICAgICAgICAgICAgIGRpY3Rpb25hcnlbdG1wWzFdXSA9IGV2YWxTdHJpbmcodG1wWzJdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuZXh0RW50cnkoKTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gbG9hZEltcG9ydCh1cmwsIGNhbGxiYWNrKSB7CisgICAgICAgIHhockxvYWRUZXh0KHVybCwgZnVuY3Rpb24gKGNvbnRlbnQpIHsKKyAgICAgICAgICBwYXJzZVJhd0xpbmVzKGNvbnRlbnQsIGZhbHNlLCBjYWxsYmFjayk7CisgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBjb25zb2xlLndhcm4odXJsICsgJyBub3QgZm91bmQuJyk7CisgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHBhcnNlUmF3TGluZXModGV4dCwgdHJ1ZSwgZnVuY3Rpb24gKCkgeworICAgICAgICBwYXJzZWRQcm9wZXJ0aWVzQ2FsbGJhY2soZGljdGlvbmFyeSk7CisgICAgICB9KTsKKyAgICB9CisKKyAgICB4aHJMb2FkVGV4dChocmVmLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKKyAgICAgIGdUZXh0RGF0YSArPSByZXNwb25zZTsKKyAgICAgIHBhcnNlUHJvcGVydGllcyhyZXNwb25zZSwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKKyAgICAgICAgICB2YXIgaWQsCisgICAgICAgICAgICAgIHByb3AsCisgICAgICAgICAgICAgIGluZGV4ID0ga2V5Lmxhc3RJbmRleE9mKCcuJyk7CisKKyAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7CisgICAgICAgICAgICBpZCA9IGtleS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgcHJvcCA9IGtleS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWQgPSBrZXk7CisgICAgICAgICAgICBwcm9wID0gZ1RleHRQcm9wOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghZ0wxMG5EYXRhW2lkXSkgeworICAgICAgICAgICAgZ0wxMG5EYXRhW2lkXSA9IHt9OworICAgICAgICAgIH0KKworICAgICAgICAgIGdMMTBuRGF0YVtpZF1bcHJvcF0gPSBkYXRhW2tleV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VjY2Vzc0NhbGxiYWNrKSB7CisgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0sIGZhaWx1cmVDYWxsYmFjayk7CisgIH0KKworICBmdW5jdGlvbiBsb2FkTG9jYWxlKGxhbmcsIGNhbGxiYWNrKSB7CisgICAgaWYgKGxhbmcpIHsKKyAgICAgIGxhbmcgPSBsYW5nLnRvTG93ZXJDYXNlKCk7CisgICAgfQorCisgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiBfY2FsbGJhY2soKSB7fTsKKworICAgIGNsZWFyKCk7CisgICAgZ0xhbmd1YWdlID0gbGFuZzsKKyAgICB2YXIgbGFuZ0xpbmtzID0gZ2V0TDEwblJlc291cmNlTGlua3MoKTsKKyAgICB2YXIgbGFuZ0NvdW50ID0gbGFuZ0xpbmtzLmxlbmd0aDsKKworICAgIGlmIChsYW5nQ291bnQgPT09IDApIHsKKyAgICAgIHZhciBkaWN0ID0gZ2V0TDEwbkRpY3Rpb25hcnkoKTsKKworICAgICAgaWYgKGRpY3QgJiYgZGljdC5sb2NhbGVzICYmIGRpY3QuZGVmYXVsdF9sb2NhbGUpIHsKKyAgICAgICAgY29uc29sZS5sb2coJ3VzaW5nIHRoZSBlbWJlZGRlZCBKU09OIGRpcmVjdG9yeSwgZWFybHkgd2F5IG91dCcpOworICAgICAgICBnTDEwbkRhdGEgPSBkaWN0LmxvY2FsZXNbbGFuZ107CisKKyAgICAgICAgaWYgKCFnTDEwbkRhdGEpIHsKKyAgICAgICAgICB2YXIgZGVmYXVsdExvY2FsZSA9IGRpY3QuZGVmYXVsdF9sb2NhbGUudG9Mb3dlckNhc2UoKTsKKworICAgICAgICAgIGZvciAodmFyIGFueUNhc2VMYW5nIGluIGRpY3QubG9jYWxlcykgeworICAgICAgICAgICAgYW55Q2FzZUxhbmcgPSBhbnlDYXNlTGFuZy50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICBpZiAoYW55Q2FzZUxhbmcgPT09IGxhbmcpIHsKKyAgICAgICAgICAgICAgZ0wxMG5EYXRhID0gZGljdC5sb2NhbGVzW2xhbmddOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYW55Q2FzZUxhbmcgPT09IGRlZmF1bHRMb2NhbGUpIHsKKyAgICAgICAgICAgICAgZ0wxMG5EYXRhID0gZGljdC5sb2NhbGVzW2RlZmF1bHRMb2NhbGVdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zb2xlLmxvZygnbm8gcmVzb3VyY2UgdG8gbG9hZCwgZWFybHkgd2F5IG91dCcpOworICAgICAgfQorCisgICAgICBnUmVhZHlTdGF0ZSA9ICdjb21wbGV0ZSc7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG9uUmVzb3VyY2VMb2FkZWQgPSBudWxsOworICAgIHZhciBnUmVzb3VyY2VDb3VudCA9IDA7CisKKyAgICBvblJlc291cmNlTG9hZGVkID0gZnVuY3Rpb24gKCkgeworICAgICAgZ1Jlc291cmNlQ291bnQrKzsKKworICAgICAgaWYgKGdSZXNvdXJjZUNvdW50ID49IGxhbmdDb3VudCkgeworICAgICAgICBjYWxsYmFjaygpOworICAgICAgICBnUmVhZHlTdGF0ZSA9ICdjb21wbGV0ZSc7CisgICAgICB9CisgICAgfTsKKworICAgIGZ1bmN0aW9uIEwxMG5SZXNvdXJjZUxpbmsobGluaykgeworICAgICAgdmFyIGhyZWYgPSBsaW5rLmhyZWY7CisKKyAgICAgIHRoaXMubG9hZCA9IGZ1bmN0aW9uIChsYW5nLCBjYWxsYmFjaykgeworICAgICAgICBwYXJzZVJlc291cmNlKGhyZWYsIGxhbmcsIGNhbGxiYWNrLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgY29uc29sZS53YXJuKGhyZWYgKyAnIG5vdCBmb3VuZC4nKTsKKyAgICAgICAgICBjb25zb2xlLndhcm4oJyInICsgbGFuZyArICciIHJlc291cmNlIG5vdCBmb3VuZCcpOworICAgICAgICAgIGdMYW5ndWFnZSA9ICcnOworICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIH0pOworICAgICAgfTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhbmdDb3VudDsgaSsrKSB7CisgICAgICB2YXIgcmVzb3VyY2UgPSBuZXcgTDEwblJlc291cmNlTGluayhsYW5nTGlua3NbaV0pOworICAgICAgcmVzb3VyY2UubG9hZChsYW5nLCBvblJlc291cmNlTG9hZGVkKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjbGVhcigpIHsKKyAgICBnTDEwbkRhdGEgPSB7fTsKKyAgICBnVGV4dERhdGEgPSAnJzsKKyAgICBnTGFuZ3VhZ2UgPSAnJzsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFBsdXJhbFJ1bGVzKGxhbmcpIHsKKyAgICB2YXIgbG9jYWxlczJydWxlcyA9IHsKKyAgICAgICdhZic6IDMsCisgICAgICAnYWsnOiA0LAorICAgICAgJ2FtJzogNCwKKyAgICAgICdhcic6IDEsCisgICAgICAnYXNhJzogMywKKyAgICAgICdheic6IDAsCisgICAgICAnYmUnOiAxMSwKKyAgICAgICdiZW0nOiAzLAorICAgICAgJ2Jleic6IDMsCisgICAgICAnYmcnOiAzLAorICAgICAgJ2JoJzogNCwKKyAgICAgICdibSc6IDAsCisgICAgICAnYm4nOiAzLAorICAgICAgJ2JvJzogMCwKKyAgICAgICdicic6IDIwLAorICAgICAgJ2JyeCc6IDMsCisgICAgICAnYnMnOiAxMSwKKyAgICAgICdjYSc6IDMsCisgICAgICAnY2dnJzogMywKKyAgICAgICdjaHInOiAzLAorICAgICAgJ2NzJzogMTIsCisgICAgICAnY3knOiAxNywKKyAgICAgICdkYSc6IDMsCisgICAgICAnZGUnOiAzLAorICAgICAgJ2R2JzogMywKKyAgICAgICdkeic6IDAsCisgICAgICAnZWUnOiAzLAorICAgICAgJ2VsJzogMywKKyAgICAgICdlbic6IDMsCisgICAgICAnZW8nOiAzLAorICAgICAgJ2VzJzogMywKKyAgICAgICdldCc6IDMsCisgICAgICAnZXUnOiAzLAorICAgICAgJ2ZhJzogMCwKKyAgICAgICdmZic6IDUsCisgICAgICAnZmknOiAzLAorICAgICAgJ2ZpbCc6IDQsCisgICAgICAnZm8nOiAzLAorICAgICAgJ2ZyJzogNSwKKyAgICAgICdmdXInOiAzLAorICAgICAgJ2Z5JzogMywKKyAgICAgICdnYSc6IDgsCisgICAgICAnZ2QnOiAyNCwKKyAgICAgICdnbCc6IDMsCisgICAgICAnZ3N3JzogMywKKyAgICAgICdndSc6IDMsCisgICAgICAnZ3V3JzogNCwKKyAgICAgICdndic6IDIzLAorICAgICAgJ2hhJzogMywKKyAgICAgICdoYXcnOiAzLAorICAgICAgJ2hlJzogMiwKKyAgICAgICdoaSc6IDQsCisgICAgICAnaHInOiAxMSwKKyAgICAgICdodSc6IDAsCisgICAgICAnaWQnOiAwLAorICAgICAgJ2lnJzogMCwKKyAgICAgICdpaSc6IDAsCisgICAgICAnaXMnOiAzLAorICAgICAgJ2l0JzogMywKKyAgICAgICdpdSc6IDcsCisgICAgICAnamEnOiAwLAorICAgICAgJ2ptYyc6IDMsCisgICAgICAnanYnOiAwLAorICAgICAgJ2thJzogMCwKKyAgICAgICdrYWInOiA1LAorICAgICAgJ2thaic6IDMsCisgICAgICAna2NnJzogMywKKyAgICAgICdrZGUnOiAwLAorICAgICAgJ2tlYSc6IDAsCisgICAgICAna2snOiAzLAorICAgICAgJ2tsJzogMywKKyAgICAgICdrbSc6IDAsCisgICAgICAna24nOiAwLAorICAgICAgJ2tvJzogMCwKKyAgICAgICdrc2InOiAzLAorICAgICAgJ2tzaCc6IDIxLAorICAgICAgJ2t1JzogMywKKyAgICAgICdrdyc6IDcsCisgICAgICAnbGFnJzogMTgsCisgICAgICAnbGInOiAzLAorICAgICAgJ2xnJzogMywKKyAgICAgICdsbic6IDQsCisgICAgICAnbG8nOiAwLAorICAgICAgJ2x0JzogMTAsCisgICAgICAnbHYnOiA2LAorICAgICAgJ21hcyc6IDMsCisgICAgICAnbWcnOiA0LAorICAgICAgJ21rJzogMTYsCisgICAgICAnbWwnOiAzLAorICAgICAgJ21uJzogMywKKyAgICAgICdtbyc6IDksCisgICAgICAnbXInOiAzLAorICAgICAgJ21zJzogMCwKKyAgICAgICdtdCc6IDE1LAorICAgICAgJ215JzogMCwKKyAgICAgICduYWgnOiAzLAorICAgICAgJ25hcSc6IDcsCisgICAgICAnbmInOiAzLAorICAgICAgJ25kJzogMywKKyAgICAgICduZSc6IDMsCisgICAgICAnbmwnOiAzLAorICAgICAgJ25uJzogMywKKyAgICAgICdubyc6IDMsCisgICAgICAnbnInOiAzLAorICAgICAgJ25zbyc6IDQsCisgICAgICAnbnknOiAzLAorICAgICAgJ255bic6IDMsCisgICAgICAnb20nOiAzLAorICAgICAgJ29yJzogMywKKyAgICAgICdwYSc6IDMsCisgICAgICAncGFwJzogMywKKyAgICAgICdwbCc6IDEzLAorICAgICAgJ3BzJzogMywKKyAgICAgICdwdCc6IDMsCisgICAgICAncm0nOiAzLAorICAgICAgJ3JvJzogOSwKKyAgICAgICdyb2YnOiAzLAorICAgICAgJ3J1JzogMTEsCisgICAgICAncndrJzogMywKKyAgICAgICdzYWgnOiAwLAorICAgICAgJ3NhcSc6IDMsCisgICAgICAnc2UnOiA3LAorICAgICAgJ3NlaCc6IDMsCisgICAgICAnc2VzJzogMCwKKyAgICAgICdzZyc6IDAsCisgICAgICAnc2gnOiAxMSwKKyAgICAgICdzaGknOiAxOSwKKyAgICAgICdzayc6IDEyLAorICAgICAgJ3NsJzogMTQsCisgICAgICAnc21hJzogNywKKyAgICAgICdzbWknOiA3LAorICAgICAgJ3Ntaic6IDcsCisgICAgICAnc21uJzogNywKKyAgICAgICdzbXMnOiA3LAorICAgICAgJ3NuJzogMywKKyAgICAgICdzbyc6IDMsCisgICAgICAnc3EnOiAzLAorICAgICAgJ3NyJzogMTEsCisgICAgICAnc3MnOiAzLAorICAgICAgJ3NzeSc6IDMsCisgICAgICAnc3QnOiAzLAorICAgICAgJ3N2JzogMywKKyAgICAgICdzdyc6IDMsCisgICAgICAnc3lyJzogMywKKyAgICAgICd0YSc6IDMsCisgICAgICAndGUnOiAzLAorICAgICAgJ3Rlbyc6IDMsCisgICAgICAndGgnOiAwLAorICAgICAgJ3RpJzogNCwKKyAgICAgICd0aWcnOiAzLAorICAgICAgJ3RrJzogMywKKyAgICAgICd0bCc6IDQsCisgICAgICAndG4nOiAzLAorICAgICAgJ3RvJzogMCwKKyAgICAgICd0cic6IDAsCisgICAgICAndHMnOiAzLAorICAgICAgJ3R6bSc6IDIyLAorICAgICAgJ3VrJzogMTEsCisgICAgICAndXInOiAzLAorICAgICAgJ3ZlJzogMywKKyAgICAgICd2aSc6IDAsCisgICAgICAndnVuJzogMywKKyAgICAgICd3YSc6IDQsCisgICAgICAnd2FlJzogMywKKyAgICAgICd3byc6IDAsCisgICAgICAneGgnOiAzLAorICAgICAgJ3hvZyc6IDMsCisgICAgICAneW8nOiAwLAorICAgICAgJ3poJzogMCwKKyAgICAgICd6dSc6IDMKKyAgICB9OworCisgICAgZnVuY3Rpb24gaXNJbihuLCBsaXN0KSB7CisgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKG4pICE9PSAtMTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBpc0JldHdlZW4obiwgc3RhcnQsIGVuZCkgeworICAgICAgcmV0dXJuIHN0YXJ0IDw9IG4gJiYgbiA8PSBlbmQ7CisgICAgfQorCisgICAgdmFyIHBsdXJhbFJ1bGVzID0geworICAgICAgJzAnOiBmdW5jdGlvbiAobikgeworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMSc6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwMCwgMywgMTApKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gJ3plcm8nOworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMDAsIDExLCA5OSkpIHJldHVybiAnbWFueSc7CisgICAgICAgIGlmIChuID09IDIpIHJldHVybiAndHdvJzsKKyAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMic6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChuICE9PSAwICYmIG4gJSAxMCA9PT0gMCkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gPT0gMikgcmV0dXJuICd0d28nOworICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICczJzogZnVuY3Rpb24gKG4pIHsKKyAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnNCc6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiwgMCwgMSkpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzUnOiBmdW5jdGlvbiAobikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDAsIDIpICYmIG4gIT0gMikgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnNic6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gJ3plcm8nOworICAgICAgICBpZiAobiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnNyc6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChuID09IDIpIHJldHVybiAndHdvJzsKKyAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnOCc6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiwgMywgNikpIHJldHVybiAnZmV3JzsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuLCA3LCAxMCkpIHJldHVybiAnbWFueSc7CisgICAgICAgIGlmIChuID09IDIpIHJldHVybiAndHdvJzsKKyAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnOSc6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChuID09PSAwIHx8IG4gIT0gMSAmJiBpc0JldHdlZW4obiAlIDEwMCwgMSwgMTkpKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzEwJzogZnVuY3Rpb24gKG4pIHsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuICUgMTAsIDIsIDkpICYmICFpc0JldHdlZW4obiAlIDEwMCwgMTEsIDE5KSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAobiAlIDEwID09IDEgJiYgIWlzQmV0d2VlbihuICUgMTAwLCAxMSwgMTkpKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcxMSc6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwLCAyLCA0KSAmJiAhaXNCZXR3ZWVuKG4gJSAxMDAsIDEyLCAxNCkpIHJldHVybiAnZmV3JzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PT0gMCB8fCBpc0JldHdlZW4obiAlIDEwLCA1LCA5KSB8fCBpc0JldHdlZW4obiAlIDEwMCwgMTEsIDE0KSkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzEyJzogZnVuY3Rpb24gKG4pIHsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuLCAyLCA0KSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcxMyc6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwLCAyLCA0KSAmJiAhaXNCZXR3ZWVuKG4gJSAxMDAsIDEyLCAxNCkpIHJldHVybiAnZmV3JzsKKyAgICAgICAgaWYgKG4gIT0gMSAmJiBpc0JldHdlZW4obiAlIDEwLCAwLCAxKSB8fCBpc0JldHdlZW4obiAlIDEwLCA1LCA5KSB8fCBpc0JldHdlZW4obiAlIDEwMCwgMTIsIDE0KSkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMTQnOiBmdW5jdGlvbiAobikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMDAsIDMsIDQpKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChuICUgMTAwID09IDIpIHJldHVybiAndHdvJzsKKyAgICAgICAgaWYgKG4gJSAxMDAgPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMTUnOiBmdW5jdGlvbiAobikgeworICAgICAgICBpZiAobiA9PT0gMCB8fCBpc0JldHdlZW4obiAlIDEwMCwgMiwgMTApKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwMCwgMTEsIDE5KSkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMTYnOiBmdW5jdGlvbiAobikgeworICAgICAgICBpZiAobiAlIDEwID09IDEgJiYgbiAhPSAxMSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMTcnOiBmdW5jdGlvbiAobikgeworICAgICAgICBpZiAobiA9PSAzKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gJ3plcm8nOworICAgICAgICBpZiAobiA9PSA2KSByZXR1cm4gJ21hbnknOworICAgICAgICBpZiAobiA9PSAyKSByZXR1cm4gJ3R3byc7CisgICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzE4JzogZnVuY3Rpb24gKG4pIHsKKyAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiAnemVybyc7CisgICAgICAgIGlmIChpc0JldHdlZW4obiwgMCwgMikgJiYgbiAhPT0gMCAmJiBuICE9IDIpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzE5JzogZnVuY3Rpb24gKG4pIHsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuLCAyLCAxMCkpIHJldHVybiAnZmV3JzsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuLCAwLCAxKSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMjAnOiBmdW5jdGlvbiAobikgeworICAgICAgICBpZiAoKGlzQmV0d2VlbihuICUgMTAsIDMsIDQpIHx8IG4gJSAxMCA9PSA5KSAmJiAhKGlzQmV0d2VlbihuICUgMTAwLCAxMCwgMTkpIHx8IGlzQmV0d2VlbihuICUgMTAwLCA3MCwgNzkpIHx8IGlzQmV0d2VlbihuICUgMTAwLCA5MCwgOTkpKSkgcmV0dXJuICdmZXcnOworICAgICAgICBpZiAobiAlIDEwMDAwMDAgPT09IDAgJiYgbiAhPT0gMCkgcmV0dXJuICdtYW55JzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PSAyICYmICFpc0luKG4gJSAxMDAsIFsxMiwgNzIsIDkyXSkpIHJldHVybiAndHdvJzsKKyAgICAgICAgaWYgKG4gJSAxMCA9PSAxICYmICFpc0luKG4gJSAxMDAsIFsxMSwgNzEsIDkxXSkpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzIxJzogZnVuY3Rpb24gKG4pIHsKKyAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiAnemVybyc7CisgICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJzsKKyAgICAgICAgcmV0dXJuICdvdGhlcic7CisgICAgICB9LAorICAgICAgJzIyJzogZnVuY3Rpb24gKG4pIHsKKyAgICAgICAgaWYgKGlzQmV0d2VlbihuLCAwLCAxKSB8fCBpc0JldHdlZW4obiwgMTEsIDk5KSkgcmV0dXJuICdvbmUnOworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0sCisgICAgICAnMjMnOiBmdW5jdGlvbiAobikgeworICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMCwgMSwgMikgfHwgbiAlIDIwID09PSAwKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfSwKKyAgICAgICcyNCc6IGZ1bmN0aW9uIChuKSB7CisgICAgICAgIGlmIChpc0JldHdlZW4obiwgMywgMTApIHx8IGlzQmV0d2VlbihuLCAxMywgMTkpKSByZXR1cm4gJ2Zldyc7CisgICAgICAgIGlmIChpc0luKG4sIFsyLCAxMl0pKSByZXR1cm4gJ3R3byc7CisgICAgICAgIGlmIChpc0luKG4sIFsxLCAxMV0pKSByZXR1cm4gJ29uZSc7CisgICAgICAgIHJldHVybiAnb3RoZXInOworICAgICAgfQorICAgIH07CisgICAgdmFyIGluZGV4ID0gbG9jYWxlczJydWxlc1tsYW5nLnJlcGxhY2UoLy0uKiQvLCAnJyldOworCisgICAgaWYgKCEoaW5kZXggaW4gcGx1cmFsUnVsZXMpKSB7CisgICAgICBjb25zb2xlLndhcm4oJ3BsdXJhbCBmb3JtIHVua25vd24gZm9yIFsnICsgbGFuZyArICddJyk7CisgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH07CisgICAgfQorCisgICAgcmV0dXJuIHBsdXJhbFJ1bGVzW2luZGV4XTsKKyAgfQorCisgIGdNYWNyb3MucGx1cmFsID0gZnVuY3Rpb24gKHN0ciwgcGFyYW0sIGtleSwgcHJvcCkgeworICAgIHZhciBuID0gcGFyc2VGbG9hdChwYXJhbSk7CisgICAgaWYgKGlzTmFOKG4pKSByZXR1cm4gc3RyOworICAgIGlmIChwcm9wICE9IGdUZXh0UHJvcCkgcmV0dXJuIHN0cjsKKworICAgIGlmICghZ01hY3Jvcy5fcGx1cmFsUnVsZXMpIHsKKyAgICAgIGdNYWNyb3MuX3BsdXJhbFJ1bGVzID0gZ2V0UGx1cmFsUnVsZXMoZ0xhbmd1YWdlKTsKKyAgICB9CisKKyAgICB2YXIgaW5kZXggPSAnWycgKyBnTWFjcm9zLl9wbHVyYWxSdWxlcyhuKSArICddJzsKKworICAgIGlmIChuID09PSAwICYmIGtleSArICdbemVyb10nIGluIGdMMTBuRGF0YSkgeworICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbemVyb10nXVtwcm9wXTsKKyAgICB9IGVsc2UgaWYgKG4gPT0gMSAmJiBrZXkgKyAnW29uZV0nIGluIGdMMTBuRGF0YSkgeworICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbb25lXSddW3Byb3BdOworICAgIH0gZWxzZSBpZiAobiA9PSAyICYmIGtleSArICdbdHdvXScgaW4gZ0wxMG5EYXRhKSB7CisgICAgICBzdHIgPSBnTDEwbkRhdGFba2V5ICsgJ1t0d29dJ11bcHJvcF07CisgICAgfSBlbHNlIGlmIChrZXkgKyBpbmRleCBpbiBnTDEwbkRhdGEpIHsKKyAgICAgIHN0ciA9IGdMMTBuRGF0YVtrZXkgKyBpbmRleF1bcHJvcF07CisgICAgfSBlbHNlIGlmIChrZXkgKyAnW290aGVyXScgaW4gZ0wxMG5EYXRhKSB7CisgICAgICBzdHIgPSBnTDEwbkRhdGFba2V5ICsgJ1tvdGhlcl0nXVtwcm9wXTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworICB9OworCisgIGZ1bmN0aW9uIGdldEwxMG5EYXRhKGtleSwgYXJncywgZmFsbGJhY2spIHsKKyAgICB2YXIgZGF0YSA9IGdMMTBuRGF0YVtrZXldOworCisgICAgaWYgKCFkYXRhKSB7CisgICAgICBjb25zb2xlLndhcm4oJyMnICsga2V5ICsgJyBpcyB1bmRlZmluZWQuJyk7CisKKyAgICAgIGlmICghZmFsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIGRhdGEgPSBmYWxsYmFjazsKKyAgICB9CisKKyAgICB2YXIgcnYgPSB7fTsKKworICAgIGZvciAodmFyIHByb3AgaW4gZGF0YSkgeworICAgICAgdmFyIHN0ciA9IGRhdGFbcHJvcF07CisgICAgICBzdHIgPSBzdWJzdEluZGV4ZXMoc3RyLCBhcmdzLCBrZXksIHByb3ApOworICAgICAgc3RyID0gc3Vic3RBcmd1bWVudHMoc3RyLCBhcmdzLCBrZXkpOworICAgICAgcnZbcHJvcF0gPSBzdHI7CisgICAgfQorCisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgZnVuY3Rpb24gc3Vic3RJbmRleGVzKHN0ciwgYXJncywga2V5LCBwcm9wKSB7CisgICAgdmFyIHJlSW5kZXggPSAvXHtcW1xzKihbYS16QS1aXSspXCgoW2EtekEtWl0rKVwpXHMqXF1cfS87CisgICAgdmFyIHJlTWF0Y2ggPSByZUluZGV4LmV4ZWMoc3RyKTsKKyAgICBpZiAoIXJlTWF0Y2ggfHwgIXJlTWF0Y2gubGVuZ3RoKSByZXR1cm4gc3RyOworICAgIHZhciBtYWNyb05hbWUgPSByZU1hdGNoWzFdOworICAgIHZhciBwYXJhbU5hbWUgPSByZU1hdGNoWzJdOworICAgIHZhciBwYXJhbTsKKworICAgIGlmIChhcmdzICYmIHBhcmFtTmFtZSBpbiBhcmdzKSB7CisgICAgICBwYXJhbSA9IGFyZ3NbcGFyYW1OYW1lXTsKKyAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZSBpbiBnTDEwbkRhdGEpIHsKKyAgICAgIHBhcmFtID0gZ0wxMG5EYXRhW3BhcmFtTmFtZV07CisgICAgfQorCisgICAgaWYgKG1hY3JvTmFtZSBpbiBnTWFjcm9zKSB7CisgICAgICB2YXIgbWFjcm8gPSBnTWFjcm9zW21hY3JvTmFtZV07CisgICAgICBzdHIgPSBtYWNybyhzdHIsIHBhcmFtLCBrZXksIHByb3ApOworICAgIH0KKworICAgIHJldHVybiBzdHI7CisgIH0KKworICBmdW5jdGlvbiBzdWJzdEFyZ3VtZW50cyhzdHIsIGFyZ3MsIGtleSkgeworICAgIHZhciByZUFyZ3MgPSAvXHtce1xzKiguKz8pXHMqXH1cfS9nOworICAgIHJldHVybiBzdHIucmVwbGFjZShyZUFyZ3MsIGZ1bmN0aW9uIChtYXRjaGVkX3RleHQsIGFyZykgeworICAgICAgaWYgKGFyZ3MgJiYgYXJnIGluIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIGFyZ3NbYXJnXTsKKyAgICAgIH0KKworICAgICAgaWYgKGFyZyBpbiBnTDEwbkRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGdMMTBuRGF0YVthcmddOworICAgICAgfQorCisgICAgICBjb25zb2xlLmxvZygnYXJndW1lbnQge3snICsgYXJnICsgJ319IGZvciAjJyArIGtleSArICcgaXMgdW5kZWZpbmVkLicpOworICAgICAgcmV0dXJuIG1hdGNoZWRfdGV4dDsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zbGF0ZUVsZW1lbnQoZWxlbWVudCkgeworICAgIHZhciBsMTBuID0gZ2V0TDEwbkF0dHJpYnV0ZXMoZWxlbWVudCk7CisgICAgaWYgKCFsMTBuLmlkKSByZXR1cm47CisgICAgdmFyIGRhdGEgPSBnZXRMMTBuRGF0YShsMTBuLmlkLCBsMTBuLmFyZ3MpOworCisgICAgaWYgKCFkYXRhKSB7CisgICAgICBjb25zb2xlLndhcm4oJyMnICsgbDEwbi5pZCArICcgaXMgdW5kZWZpbmVkLicpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChkYXRhW2dUZXh0UHJvcF0pIHsKKyAgICAgIGlmIChnZXRDaGlsZEVsZW1lbnRDb3VudChlbGVtZW50KSA9PT0gMCkgeworICAgICAgICBlbGVtZW50W2dUZXh0UHJvcF0gPSBkYXRhW2dUZXh0UHJvcF07CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkTm9kZXM7CisgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAzICYmIC9cUy8udGVzdChjaGlsZHJlbltpXS5ub2RlVmFsdWUpKSB7CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgY2hpbGRyZW5baV0ubm9kZVZhbHVlID0gJyc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjaGlsZHJlbltpXS5ub2RlVmFsdWUgPSBkYXRhW2dUZXh0UHJvcF07CisgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YVtnVGV4dFByb3BdKTsKKyAgICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZSh0ZXh0Tm9kZSwgZWxlbWVudC5maXJzdENoaWxkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBkZWxldGUgZGF0YVtnVGV4dFByb3BdOworICAgIH0KKworICAgIGZvciAodmFyIGsgaW4gZGF0YSkgeworICAgICAgZWxlbWVudFtrXSA9IGRhdGFba107CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZ2V0Q2hpbGRFbGVtZW50Q291bnQoZWxlbWVudCkgeworICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7CisgICAgICByZXR1cm4gZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7CisgICAgfQorCisgICAgaWYgKHR5cGVvZiBlbGVtZW50LmNoaWxkRWxlbWVudENvdW50ICE9PSAndW5kZWZpbmVkJykgeworICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRFbGVtZW50Q291bnQ7CisgICAgfQorCisgICAgdmFyIGNvdW50ID0gMDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBjb3VudCArPSBlbGVtZW50Lm5vZGVUeXBlID09PSAxID8gMSA6IDA7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworICB9CisKKyAgZnVuY3Rpb24gdHJhbnNsYXRlRnJhZ21lbnQoZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSBlbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICB2YXIgY2hpbGRyZW4gPSBnZXRUcmFuc2xhdGFibGVDaGlsZHJlbihlbGVtZW50KTsKKyAgICB2YXIgZWxlbWVudENvdW50ID0gY2hpbGRyZW4ubGVuZ3RoOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50Q291bnQ7IGkrKykgeworICAgICAgdHJhbnNsYXRlRWxlbWVudChjaGlsZHJlbltpXSk7CisgICAgfQorCisgICAgdHJhbnNsYXRlRWxlbWVudChlbGVtZW50KTsKKyAgfQorCisgIHJldHVybiB7CisgICAgZ2V0OiBmdW5jdGlvbiAoa2V5LCBhcmdzLCBmYWxsYmFja1N0cmluZykgeworICAgICAgdmFyIGluZGV4ID0ga2V5Lmxhc3RJbmRleE9mKCcuJyk7CisgICAgICB2YXIgcHJvcCA9IGdUZXh0UHJvcDsKKworICAgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICBwcm9wID0ga2V5LnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgIH0KKworICAgICAgdmFyIGZhbGxiYWNrOworCisgICAgICBpZiAoZmFsbGJhY2tTdHJpbmcpIHsKKyAgICAgICAgZmFsbGJhY2sgPSB7fTsKKyAgICAgICAgZmFsbGJhY2tbcHJvcF0gPSBmYWxsYmFja1N0cmluZzsKKyAgICAgIH0KKworICAgICAgdmFyIGRhdGEgPSBnZXRMMTBuRGF0YShrZXksIGFyZ3MsIGZhbGxiYWNrKTsKKworICAgICAgaWYgKGRhdGEgJiYgcHJvcCBpbiBkYXRhKSB7CisgICAgICAgIHJldHVybiBkYXRhW3Byb3BdOworICAgICAgfQorCisgICAgICByZXR1cm4gJ3t7JyArIGtleSArICd9fSc7CisgICAgfSwKKyAgICBnZXREYXRhOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gZ0wxMG5EYXRhOworICAgIH0sCisgICAgZ2V0VGV4dDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGdUZXh0RGF0YTsKKyAgICB9LAorICAgIGdldExhbmd1YWdlOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gZ0xhbmd1YWdlOworICAgIH0sCisgICAgc2V0TGFuZ3VhZ2U6IGZ1bmN0aW9uIChsYW5nLCBjYWxsYmFjaykgeworICAgICAgbG9hZExvY2FsZShsYW5nLCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTsKKyAgICAgIH0pOworICAgIH0sCisgICAgZ2V0RGlyZWN0aW9uOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcnRsTGlzdCA9IFsnYXInLCAnaGUnLCAnZmEnLCAncHMnLCAndXInXTsKKyAgICAgIHZhciBzaG9ydENvZGUgPSBnTGFuZ3VhZ2Uuc3BsaXQoJy0nLCAxKVswXTsKKyAgICAgIHJldHVybiBydGxMaXN0LmluZGV4T2Yoc2hvcnRDb2RlKSA+PSAwID8gJ3J0bCcgOiAnbHRyJzsKKyAgICB9LAorICAgIHRyYW5zbGF0ZTogdHJhbnNsYXRlRnJhZ21lbnQsCisgICAgZ2V0UmVhZHlTdGF0ZTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGdSZWFkeVN0YXRlOworICAgIH0sCisgICAgcmVhZHk6IGZ1bmN0aW9uIChjYWxsYmFjaykgeworICAgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKGdSZWFkeVN0YXRlID09ICdjb21wbGV0ZScgfHwgZ1JlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgeworICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9jYWxpemVkJywgZnVuY3Rpb24gb25jZSgpIHsKKyAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2NhbGl6ZWQnLCBvbmNlKTsKKyAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH07Cit9KHdpbmRvdywgZG9jdW1lbnQpOworCisvKioqLyB9KSwKKy8qIDEwICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuUERGRmluZENvbnRyb2xsZXIgPSBleHBvcnRzLkZpbmRTdGF0ZSA9IHZvaWQgMDsKKwordmFyIF9wZGZqc0xpYiA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CisKK3ZhciBfcGRmX2ZpbmRfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTsKKwordmFyIF91aV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CisKK2NvbnN0IEZpbmRTdGF0ZSA9IHsKKyAgRk9VTkQ6IDAsCisgIE5PVF9GT1VORDogMSwKKyAgV1JBUFBFRDogMiwKKyAgUEVORElORzogMworfTsKK2V4cG9ydHMuRmluZFN0YXRlID0gRmluZFN0YXRlOworY29uc3QgRklORF9USU1FT1VUID0gMjUwOworY29uc3QgTUFUQ0hfU0NST0xMX09GRlNFVF9UT1AgPSAtNTA7Citjb25zdCBNQVRDSF9TQ1JPTExfT0ZGU0VUX0xFRlQgPSAtNDAwOworY29uc3QgQ0hBUkFDVEVSU19UT19OT1JNQUxJWkUgPSB7CisgICJcdTIwMTgiOiAiJyIsCisgICJcdTIwMTkiOiAiJyIsCisgICJcdTIwMUEiOiAiJyIsCisgICJcdTIwMUIiOiAiJyIsCisgICJcdTIwMUMiOiAnIicsCisgICJcdTIwMUQiOiAnIicsCisgICJcdTIwMUUiOiAnIicsCisgICJcdTIwMUYiOiAnIicsCisgICJcdTAwQkMiOiAiMS80IiwKKyAgIlx1MDBCRCI6ICIxLzIiLAorICAiXHUwMEJFIjogIjMvNCIKK307CitsZXQgbm9ybWFsaXphdGlvblJlZ2V4ID0gbnVsbDsKKworZnVuY3Rpb24gbm9ybWFsaXplKHRleHQpIHsKKyAgaWYgKCFub3JtYWxpemF0aW9uUmVnZXgpIHsKKyAgICBjb25zdCByZXBsYWNlID0gT2JqZWN0LmtleXMoQ0hBUkFDVEVSU19UT19OT1JNQUxJWkUpLmpvaW4oIiIpOworICAgIG5vcm1hbGl6YXRpb25SZWdleCA9IG5ldyBSZWdFeHAoYFske3JlcGxhY2V9XWAsICJnIik7CisgIH0KKworICByZXR1cm4gdGV4dC5yZXBsYWNlKG5vcm1hbGl6YXRpb25SZWdleCwgZnVuY3Rpb24gKGNoKSB7CisgICAgcmV0dXJuIENIQVJBQ1RFUlNfVE9fTk9STUFMSVpFW2NoXTsKKyAgfSk7Cit9CisKK2NsYXNzIFBERkZpbmRDb250cm9sbGVyIHsKKyAgY29uc3RydWN0b3IoeworICAgIGxpbmtTZXJ2aWNlLAorICAgIGV2ZW50QnVzCisgIH0pIHsKKyAgICB0aGlzLl9saW5rU2VydmljZSA9IGxpbmtTZXJ2aWNlOworICAgIHRoaXMuX2V2ZW50QnVzID0gZXZlbnRCdXM7CisKKyAgICB0aGlzLl9yZXNldCgpOworCisgICAgZXZlbnRCdXMuX29uKCJmaW5kYmFyY2xvc2UiLCB0aGlzLl9vbkZpbmRCYXJDbG9zZS5iaW5kKHRoaXMpKTsKKyAgfQorCisgIGdldCBoaWdobGlnaHRNYXRjaGVzKCkgeworICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRNYXRjaGVzOworICB9CisKKyAgZ2V0IHBhZ2VNYXRjaGVzKCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlTWF0Y2hlczsKKyAgfQorCisgIGdldCBwYWdlTWF0Y2hlc0xlbmd0aCgpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGg7CisgIH0KKworICBnZXQgc2VsZWN0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkOworICB9CisKKyAgZ2V0IHN0YXRlKCkgeworICAgIHJldHVybiB0aGlzLl9zdGF0ZTsKKyAgfQorCisgIHNldERvY3VtZW50KHBkZkRvY3VtZW50KSB7CisgICAgaWYgKHRoaXMuX3BkZkRvY3VtZW50KSB7CisgICAgICB0aGlzLl9yZXNldCgpOworICAgIH0KKworICAgIGlmICghcGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9wZGZEb2N1bWVudCA9IHBkZkRvY3VtZW50OworCisgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgIH0KKworICBleGVjdXRlQ29tbWFuZChjbWQsIHN0YXRlKSB7CisgICAgaWYgKCFzdGF0ZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHBkZkRvY3VtZW50ID0gdGhpcy5fcGRmRG9jdW1lbnQ7CisKKyAgICBpZiAodGhpcy5fc3RhdGUgPT09IG51bGwgfHwgdGhpcy5fc2hvdWxkRGlydHlNYXRjaChjbWQsIHN0YXRlKSkgeworICAgICAgdGhpcy5fZGlydHlNYXRjaCA9IHRydWU7CisgICAgfQorCisgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTsKKworICAgIGlmIChjbWQgIT09ICJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlIikgeworICAgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZShGaW5kU3RhdGUuUEVORElORyk7CisgICAgfQorCisgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4geworICAgICAgaWYgKCF0aGlzLl9wZGZEb2N1bWVudCB8fCBwZGZEb2N1bWVudCAmJiB0aGlzLl9wZGZEb2N1bWVudCAhPT0gcGRmRG9jdW1lbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9leHRyYWN0VGV4dCgpOworCisgICAgICBjb25zdCBmaW5kYmFyQ2xvc2VkID0gIXRoaXMuX2hpZ2hsaWdodE1hdGNoZXM7CisgICAgICBjb25zdCBwZW5kaW5nVGltZW91dCA9ICEhdGhpcy5fZmluZFRpbWVvdXQ7CisKKyAgICAgIGlmICh0aGlzLl9maW5kVGltZW91dCkgeworICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZmluZFRpbWVvdXQpOworICAgICAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGlmIChjbWQgPT09ICJmaW5kIikgeworICAgICAgICB0aGlzLl9maW5kVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICAgIHRoaXMuX25leHRNYXRjaCgpOworCisgICAgICAgICAgdGhpcy5fZmluZFRpbWVvdXQgPSBudWxsOworICAgICAgICB9LCBGSU5EX1RJTUVPVVQpOworICAgICAgfSBlbHNlIGlmICh0aGlzLl9kaXJ0eU1hdGNoKSB7CisgICAgICAgIHRoaXMuX25leHRNYXRjaCgpOworICAgICAgfSBlbHNlIGlmIChjbWQgPT09ICJmaW5kYWdhaW4iKSB7CisgICAgICAgIHRoaXMuX25leHRNYXRjaCgpOworCisgICAgICAgIGlmIChmaW5kYmFyQ2xvc2VkICYmIHRoaXMuX3N0YXRlLmhpZ2hsaWdodEFsbCkgeworICAgICAgICAgIHRoaXMuX3VwZGF0ZUFsbFBhZ2VzKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY21kID09PSAiZmluZGhpZ2hsaWdodGFsbGNoYW5nZSIpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdUaW1lb3V0KSB7CisgICAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl91cGRhdGVBbGxQYWdlcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBzY3JvbGxNYXRjaEludG9WaWV3KHsKKyAgICBlbGVtZW50ID0gbnVsbCwKKyAgICBwYWdlSW5kZXggPSAtMSwKKyAgICBtYXRjaEluZGV4ID0gLTEKKyAgfSkgeworICAgIGlmICghdGhpcy5fc2Nyb2xsTWF0Y2hlcyB8fCAhZWxlbWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobWF0Y2hJbmRleCA9PT0gLTEgfHwgbWF0Y2hJbmRleCAhPT0gdGhpcy5fc2VsZWN0ZWQubWF0Y2hJZHgpIHsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKHBhZ2VJbmRleCA9PT0gLTEgfHwgcGFnZUluZGV4ICE9PSB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IGZhbHNlOworICAgIGNvbnN0IHNwb3QgPSB7CisgICAgICB0b3A6IE1BVENIX1NDUk9MTF9PRkZTRVRfVE9QLAorICAgICAgbGVmdDogTUFUQ0hfU0NST0xMX09GRlNFVF9MRUZUCisgICAgfTsKKyAgICAoMCwgX3VpX3V0aWxzLnNjcm9sbEludG9WaWV3KShlbGVtZW50LCBzcG90LCB0cnVlKTsKKyAgfQorCisgIF9yZXNldCgpIHsKKyAgICB0aGlzLl9oaWdobGlnaHRNYXRjaGVzID0gZmFsc2U7CisgICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IGZhbHNlOworICAgIHRoaXMuX3BkZkRvY3VtZW50ID0gbnVsbDsKKyAgICB0aGlzLl9wYWdlTWF0Y2hlcyA9IFtdOworICAgIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoID0gW107CisgICAgdGhpcy5fc3RhdGUgPSBudWxsOworICAgIHRoaXMuX3NlbGVjdGVkID0geworICAgICAgcGFnZUlkeDogLTEsCisgICAgICBtYXRjaElkeDogLTEKKyAgICB9OworICAgIHRoaXMuX29mZnNldCA9IHsKKyAgICAgIHBhZ2VJZHg6IG51bGwsCisgICAgICBtYXRjaElkeDogbnVsbCwKKyAgICAgIHdyYXBwZWQ6IGZhbHNlCisgICAgfTsKKyAgICB0aGlzLl9leHRyYWN0VGV4dFByb21pc2VzID0gW107CisgICAgdGhpcy5fcGFnZUNvbnRlbnRzID0gW107CisgICAgdGhpcy5fbWF0Y2hlc0NvdW50VG90YWwgPSAwOworICAgIHRoaXMuX3BhZ2VzVG9TZWFyY2ggPSBudWxsOworICAgIHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CisgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IG51bGw7CisgICAgdGhpcy5fZGlydHlNYXRjaCA9IGZhbHNlOworICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5kVGltZW91dCk7CisgICAgdGhpcy5fZmluZFRpbWVvdXQgPSBudWxsOworICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICB9CisKKyAgZ2V0IF9xdWVyeSgpIHsKKyAgICBpZiAodGhpcy5fc3RhdGUucXVlcnkgIT09IHRoaXMuX3Jhd1F1ZXJ5KSB7CisgICAgICB0aGlzLl9yYXdRdWVyeSA9IHRoaXMuX3N0YXRlLnF1ZXJ5OworICAgICAgdGhpcy5fbm9ybWFsaXplZFF1ZXJ5ID0gbm9ybWFsaXplKHRoaXMuX3N0YXRlLnF1ZXJ5KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fbm9ybWFsaXplZFF1ZXJ5OworICB9CisKKyAgX3Nob3VsZERpcnR5TWF0Y2goY21kLCBzdGF0ZSkgeworICAgIGlmIChzdGF0ZS5xdWVyeSAhPT0gdGhpcy5fc3RhdGUucXVlcnkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICBjYXNlICJmaW5kYWdhaW4iOgorICAgICAgICBjb25zdCBwYWdlTnVtYmVyID0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCArIDE7CisgICAgICAgIGNvbnN0IGxpbmtTZXJ2aWNlID0gdGhpcy5fbGlua1NlcnZpY2U7CisKKyAgICAgICAgaWYgKHBhZ2VOdW1iZXIgPj0gMSAmJiBwYWdlTnVtYmVyIDw9IGxpbmtTZXJ2aWNlLnBhZ2VzQ291bnQgJiYgcGFnZU51bWJlciAhPT0gbGlua1NlcnZpY2UucGFnZSAmJiAhbGlua1NlcnZpY2UuaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBjYXNlICJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlIjoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgX3ByZXBhcmVNYXRjaGVzKG1hdGNoZXNXaXRoTGVuZ3RoLCBtYXRjaGVzLCBtYXRjaGVzTGVuZ3RoKSB7CisgICAgZnVuY3Rpb24gaXNTdWJUZXJtKGN1cnJlbnRJbmRleCkgeworICAgICAgY29uc3QgY3VycmVudEVsZW0gPSBtYXRjaGVzV2l0aExlbmd0aFtjdXJyZW50SW5kZXhdOworICAgICAgY29uc3QgbmV4dEVsZW0gPSBtYXRjaGVzV2l0aExlbmd0aFtjdXJyZW50SW5kZXggKyAxXTsKKworICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IG1hdGNoZXNXaXRoTGVuZ3RoLmxlbmd0aCAtIDEgJiYgY3VycmVudEVsZW0ubWF0Y2ggPT09IG5leHRFbGVtLm1hdGNoKSB7CisgICAgICAgIGN1cnJlbnRFbGVtLnNraXBwZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZm9yIChsZXQgaSA9IGN1cnJlbnRJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGNvbnN0IHByZXZFbGVtID0gbWF0Y2hlc1dpdGhMZW5ndGhbaV07CisKKyAgICAgICAgaWYgKHByZXZFbGVtLnNraXBwZWQpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmV2RWxlbS5tYXRjaCArIHByZXZFbGVtLm1hdGNoTGVuZ3RoIDwgY3VycmVudEVsZW0ubWF0Y2gpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmV2RWxlbS5tYXRjaCArIHByZXZFbGVtLm1hdGNoTGVuZ3RoID49IGN1cnJlbnRFbGVtLm1hdGNoICsgY3VycmVudEVsZW0ubWF0Y2hMZW5ndGgpIHsKKyAgICAgICAgICBjdXJyZW50RWxlbS5za2lwcGVkID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWF0Y2hlc1dpdGhMZW5ndGguc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgcmV0dXJuIGEubWF0Y2ggPT09IGIubWF0Y2ggPyBhLm1hdGNoTGVuZ3RoIC0gYi5tYXRjaExlbmd0aCA6IGEubWF0Y2ggLSBiLm1hdGNoOworICAgIH0pOworCisgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG1hdGNoZXNXaXRoTGVuZ3RoLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoaXNTdWJUZXJtKGkpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBtYXRjaGVzLnB1c2gobWF0Y2hlc1dpdGhMZW5ndGhbaV0ubWF0Y2gpOworICAgICAgbWF0Y2hlc0xlbmd0aC5wdXNoKG1hdGNoZXNXaXRoTGVuZ3RoW2ldLm1hdGNoTGVuZ3RoKTsKKyAgICB9CisgIH0KKworICBfaXNFbnRpcmVXb3JkKGNvbnRlbnQsIHN0YXJ0SWR4LCBsZW5ndGgpIHsKKyAgICBpZiAoc3RhcnRJZHggPiAwKSB7CisgICAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnQuY2hhckNvZGVBdChzdGFydElkeCk7CisgICAgICBjb25zdCBsaW1pdCA9IGNvbnRlbnQuY2hhckNvZGVBdChzdGFydElkeCAtIDEpOworCisgICAgICBpZiAoKDAsIF9wZGZfZmluZF91dGlscy5nZXRDaGFyYWN0ZXJUeXBlKShmaXJzdCkgPT09ICgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkobGltaXQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBlbmRJZHggPSBzdGFydElkeCArIGxlbmd0aCAtIDE7CisKKyAgICBpZiAoZW5kSWR4IDwgY29udGVudC5sZW5ndGggLSAxKSB7CisgICAgICBjb25zdCBsYXN0ID0gY29udGVudC5jaGFyQ29kZUF0KGVuZElkeCk7CisgICAgICBjb25zdCBsaW1pdCA9IGNvbnRlbnQuY2hhckNvZGVBdChlbmRJZHggKyAxKTsKKworICAgICAgaWYgKCgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkobGFzdCkgPT09ICgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkobGltaXQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIF9jYWxjdWxhdGVQaHJhc2VNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCkgeworICAgIGNvbnN0IG1hdGNoZXMgPSBbXTsKKyAgICBjb25zdCBxdWVyeUxlbiA9IHF1ZXJ5Lmxlbmd0aDsKKyAgICBsZXQgbWF0Y2hJZHggPSAtcXVlcnlMZW47CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgbWF0Y2hJZHggPSBwYWdlQ29udGVudC5pbmRleE9mKHF1ZXJ5LCBtYXRjaElkeCArIHF1ZXJ5TGVuKTsKKworICAgICAgaWYgKG1hdGNoSWR4ID09PSAtMSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGVudGlyZVdvcmQgJiYgIXRoaXMuX2lzRW50aXJlV29yZChwYWdlQ29udGVudCwgbWF0Y2hJZHgsIHF1ZXJ5TGVuKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoSWR4KTsKKyAgICB9CisKKyAgICB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSW5kZXhdID0gbWF0Y2hlczsKKyAgfQorCisgIF9jYWxjdWxhdGVXb3JkTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpIHsKKyAgICBjb25zdCBtYXRjaGVzV2l0aExlbmd0aCA9IFtdOworICAgIGNvbnN0IHF1ZXJ5QXJyYXkgPSBxdWVyeS5tYXRjaCgvXFMrL2cpOworCisgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHF1ZXJ5QXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGNvbnN0IHN1YnF1ZXJ5ID0gcXVlcnlBcnJheVtpXTsKKyAgICAgIGNvbnN0IHN1YnF1ZXJ5TGVuID0gc3VicXVlcnkubGVuZ3RoOworICAgICAgbGV0IG1hdGNoSWR4ID0gLXN1YnF1ZXJ5TGVuOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBtYXRjaElkeCA9IHBhZ2VDb250ZW50LmluZGV4T2Yoc3VicXVlcnksIG1hdGNoSWR4ICsgc3VicXVlcnlMZW4pOworCisgICAgICAgIGlmIChtYXRjaElkeCA9PT0gLTEpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnRpcmVXb3JkICYmICF0aGlzLl9pc0VudGlyZVdvcmQocGFnZUNvbnRlbnQsIG1hdGNoSWR4LCBzdWJxdWVyeUxlbikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoZXNXaXRoTGVuZ3RoLnB1c2goeworICAgICAgICAgIG1hdGNoOiBtYXRjaElkeCwKKyAgICAgICAgICBtYXRjaExlbmd0aDogc3VicXVlcnlMZW4sCisgICAgICAgICAgc2tpcHBlZDogZmFsc2UKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGhbcGFnZUluZGV4XSA9IFtdOworICAgIHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJbmRleF0gPSBbXTsKKworICAgIHRoaXMuX3ByZXBhcmVNYXRjaGVzKG1hdGNoZXNXaXRoTGVuZ3RoLCB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSW5kZXhdLCB0aGlzLl9wYWdlTWF0Y2hlc0xlbmd0aFtwYWdlSW5kZXhdKTsKKyAgfQorCisgIF9jYWxjdWxhdGVNYXRjaChwYWdlSW5kZXgpIHsKKyAgICBsZXQgcGFnZUNvbnRlbnQgPSB0aGlzLl9wYWdlQ29udGVudHNbcGFnZUluZGV4XTsKKyAgICBsZXQgcXVlcnkgPSB0aGlzLl9xdWVyeTsKKyAgICBjb25zdCB7CisgICAgICBjYXNlU2Vuc2l0aXZlLAorICAgICAgZW50aXJlV29yZCwKKyAgICAgIHBocmFzZVNlYXJjaAorICAgIH0gPSB0aGlzLl9zdGF0ZTsKKworICAgIGlmIChxdWVyeS5sZW5ndGggPT09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHsKKyAgICAgIHBhZ2VDb250ZW50ID0gcGFnZUNvbnRlbnQudG9Mb3dlckNhc2UoKTsKKyAgICAgIHF1ZXJ5ID0gcXVlcnkudG9Mb3dlckNhc2UoKTsKKyAgICB9CisKKyAgICBpZiAocGhyYXNlU2VhcmNoKSB7CisgICAgICB0aGlzLl9jYWxjdWxhdGVQaHJhc2VNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX2NhbGN1bGF0ZVdvcmRNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuX3N0YXRlLmhpZ2hsaWdodEFsbCkgeworICAgICAgdGhpcy5fdXBkYXRlUGFnZShwYWdlSW5kZXgpOworICAgIH0KKworICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4ID09PSBwYWdlSW5kZXgpIHsKKyAgICAgIHRoaXMuX3Jlc3VtZVBhZ2VJZHggPSBudWxsOworCisgICAgICB0aGlzLl9uZXh0UGFnZU1hdGNoKCk7CisgICAgfQorCisgICAgY29uc3QgcGFnZU1hdGNoZXNDb3VudCA9IHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJbmRleF0ubGVuZ3RoOworCisgICAgaWYgKHBhZ2VNYXRjaGVzQ291bnQgPiAwKSB7CisgICAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCArPSBwYWdlTWF0Y2hlc0NvdW50OworCisgICAgICB0aGlzLl91cGRhdGVVSVJlc3VsdHNDb3VudCgpOworICAgIH0KKyAgfQorCisgIF9leHRyYWN0VGV4dCgpIHsKKyAgICBpZiAodGhpcy5fZXh0cmFjdFRleHRQcm9taXNlcy5sZW5ndGggPiAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2VzQ291bnQ7IGkgPCBpaTsgaSsrKSB7CisgICAgICBjb25zdCBleHRyYWN0VGV4dENhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpOworICAgICAgdGhpcy5fZXh0cmFjdFRleHRQcm9taXNlc1tpXSA9IGV4dHJhY3RUZXh0Q2FwYWJpbGl0eS5wcm9taXNlOworICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB7CisgICAgICAgIHJldHVybiB0aGlzLl9wZGZEb2N1bWVudC5nZXRQYWdlKGkgKyAxKS50aGVuKHBkZlBhZ2UgPT4geworICAgICAgICAgIHJldHVybiBwZGZQYWdlLmdldFRleHRDb250ZW50KHsKKyAgICAgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2U6IHRydWUKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSkudGhlbih0ZXh0Q29udGVudCA9PiB7CisgICAgICAgICAgY29uc3QgdGV4dEl0ZW1zID0gdGV4dENvbnRlbnQuaXRlbXM7CisgICAgICAgICAgY29uc3Qgc3RyQnVmID0gW107CisKKyAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamogPSB0ZXh0SXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgeworICAgICAgICAgICAgc3RyQnVmLnB1c2godGV4dEl0ZW1zW2pdLnN0cik7CisgICAgICAgICAgfQorCisgICAgICAgICAgdGhpcy5fcGFnZUNvbnRlbnRzW2ldID0gbm9ybWFsaXplKHN0ckJ1Zi5qb2luKCIiKSk7CisgICAgICAgICAgZXh0cmFjdFRleHRDYXBhYmlsaXR5LnJlc29sdmUoaSk7CisgICAgICAgIH0sIHJlYXNvbiA9PiB7CisgICAgICAgICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIGdldCB0ZXh0IGNvbnRlbnQgZm9yIHBhZ2UgJHtpICsgMX1gLCByZWFzb24pOworICAgICAgICAgIHRoaXMuX3BhZ2VDb250ZW50c1tpXSA9ICIiOworICAgICAgICAgIGV4dHJhY3RUZXh0Q2FwYWJpbGl0eS5yZXNvbHZlKGkpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIF91cGRhdGVQYWdlKGluZGV4KSB7CisgICAgaWYgKHRoaXMuX3Njcm9sbE1hdGNoZXMgJiYgdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCA9PT0gaW5kZXgpIHsKKyAgICAgIHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2UgPSBpbmRleCArIDE7CisgICAgfQorCisgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goInVwZGF0ZXRleHRsYXllcm1hdGNoZXMiLCB7CisgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICBwYWdlSW5kZXg6IGluZGV4CisgICAgfSk7CisgIH0KKworICBfdXBkYXRlQWxsUGFnZXMoKSB7CisgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goInVwZGF0ZXRleHRsYXllcm1hdGNoZXMiLCB7CisgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICBwYWdlSW5kZXg6IC0xCisgICAgfSk7CisgIH0KKworICBfbmV4dE1hdGNoKCkgeworICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fc3RhdGUuZmluZFByZXZpb3VzOworICAgIGNvbnN0IGN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLl9saW5rU2VydmljZS5wYWdlIC0gMTsKKyAgICBjb25zdCBudW1QYWdlcyA9IHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2VzQ291bnQ7CisgICAgdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcyA9IHRydWU7CisKKyAgICBpZiAodGhpcy5fZGlydHlNYXRjaCkgeworICAgICAgdGhpcy5fZGlydHlNYXRjaCA9IGZhbHNlOworICAgICAgdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCA9IHRoaXMuX3NlbGVjdGVkLm1hdGNoSWR4ID0gLTE7CisgICAgICB0aGlzLl9vZmZzZXQucGFnZUlkeCA9IGN1cnJlbnRQYWdlSW5kZXg7CisgICAgICB0aGlzLl9vZmZzZXQubWF0Y2hJZHggPSBudWxsOworICAgICAgdGhpcy5fb2Zmc2V0LndyYXBwZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMuX3Jlc3VtZVBhZ2VJZHggPSBudWxsOworICAgICAgdGhpcy5fcGFnZU1hdGNoZXMubGVuZ3RoID0gMDsKKyAgICAgIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoLmxlbmd0aCA9IDA7CisgICAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCA9IDA7CisKKyAgICAgIHRoaXMuX3VwZGF0ZUFsbFBhZ2VzKCk7CisKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFnZXM7IGkrKykgeworICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0ZpbmRNYXRjaGVzW2ldID09PSB0cnVlKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9wZW5kaW5nRmluZE1hdGNoZXNbaV0gPSB0cnVlOworCisgICAgICAgIHRoaXMuX2V4dHJhY3RUZXh0UHJvbWlzZXNbaV0udGhlbihwYWdlSWR4ID0+IHsKKyAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ0ZpbmRNYXRjaGVzW3BhZ2VJZHhdOworCisgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlTWF0Y2gocGFnZUlkeCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLl9xdWVyeSA9PT0gIiIpIHsKKyAgICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUoRmluZFN0YXRlLkZPVU5EKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0OworICAgIHRoaXMuX3BhZ2VzVG9TZWFyY2ggPSBudW1QYWdlczsKKworICAgIGlmIChvZmZzZXQubWF0Y2hJZHggIT09IG51bGwpIHsKKyAgICAgIGNvbnN0IG51bVBhZ2VNYXRjaGVzID0gdGhpcy5fcGFnZU1hdGNoZXNbb2Zmc2V0LnBhZ2VJZHhdLmxlbmd0aDsKKworICAgICAgaWYgKCFwcmV2aW91cyAmJiBvZmZzZXQubWF0Y2hJZHggKyAxIDwgbnVtUGFnZU1hdGNoZXMgfHwgcHJldmlvdXMgJiYgb2Zmc2V0Lm1hdGNoSWR4ID4gMCkgeworICAgICAgICBvZmZzZXQubWF0Y2hJZHggPSBwcmV2aW91cyA/IG9mZnNldC5tYXRjaElkeCAtIDEgOiBvZmZzZXQubWF0Y2hJZHggKyAxOworCisgICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKHRydWUpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fYWR2YW5jZU9mZnNldFBhZ2UocHJldmlvdXMpOworICAgIH0KKworICAgIHRoaXMuX25leHRQYWdlTWF0Y2goKTsKKyAgfQorCisgIF9tYXRjaGVzUmVhZHkobWF0Y2hlcykgeworICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuX29mZnNldDsKKyAgICBjb25zdCBudW1NYXRjaGVzID0gbWF0Y2hlcy5sZW5ndGg7CisgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXM7CisKKyAgICBpZiAobnVtTWF0Y2hlcykgeworICAgICAgb2Zmc2V0Lm1hdGNoSWR4ID0gcHJldmlvdXMgPyBudW1NYXRjaGVzIC0gMSA6IDA7CisKKyAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKHRydWUpOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB0aGlzLl9hZHZhbmNlT2Zmc2V0UGFnZShwcmV2aW91cyk7CisKKyAgICBpZiAob2Zmc2V0LndyYXBwZWQpIHsKKyAgICAgIG9mZnNldC5tYXRjaElkeCA9IG51bGw7CisKKyAgICAgIGlmICh0aGlzLl9wYWdlc1RvU2VhcmNoIDwgMCkgeworICAgICAgICB0aGlzLl91cGRhdGVNYXRjaChmYWxzZSk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgX25leHRQYWdlTWF0Y2goKSB7CisgICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHggIT09IG51bGwpIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoIlRoZXJlIGNhbiBvbmx5IGJlIG9uZSBwZW5kaW5nIHBhZ2UuIik7CisgICAgfQorCisgICAgbGV0IG1hdGNoZXMgPSBudWxsOworCisgICAgZG8geworICAgICAgY29uc3QgcGFnZUlkeCA9IHRoaXMuX29mZnNldC5wYWdlSWR4OworICAgICAgbWF0Y2hlcyA9IHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJZHhdOworCisgICAgICBpZiAoIW1hdGNoZXMpIHsKKyAgICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IHBhZ2VJZHg7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gd2hpbGUgKCF0aGlzLl9tYXRjaGVzUmVhZHkobWF0Y2hlcykpOworICB9CisKKyAgX2FkdmFuY2VPZmZzZXRQYWdlKHByZXZpb3VzKSB7CisgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0OworICAgIGNvbnN0IG51bVBhZ2VzID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZXNDb3VudDsKKyAgICBvZmZzZXQucGFnZUlkeCA9IHByZXZpb3VzID8gb2Zmc2V0LnBhZ2VJZHggLSAxIDogb2Zmc2V0LnBhZ2VJZHggKyAxOworICAgIG9mZnNldC5tYXRjaElkeCA9IG51bGw7CisgICAgdGhpcy5fcGFnZXNUb1NlYXJjaC0tOworCisgICAgaWYgKG9mZnNldC5wYWdlSWR4ID49IG51bVBhZ2VzIHx8IG9mZnNldC5wYWdlSWR4IDwgMCkgeworICAgICAgb2Zmc2V0LnBhZ2VJZHggPSBwcmV2aW91cyA/IG51bVBhZ2VzIC0gMSA6IDA7CisgICAgICBvZmZzZXQud3JhcHBlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgX3VwZGF0ZU1hdGNoKGZvdW5kID0gZmFsc2UpIHsKKyAgICBsZXQgc3RhdGUgPSBGaW5kU3RhdGUuTk9UX0ZPVU5EOworICAgIGNvbnN0IHdyYXBwZWQgPSB0aGlzLl9vZmZzZXQud3JhcHBlZDsKKyAgICB0aGlzLl9vZmZzZXQud3JhcHBlZCA9IGZhbHNlOworCisgICAgaWYgKGZvdW5kKSB7CisgICAgICBjb25zdCBwcmV2aW91c1BhZ2UgPSB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4OworICAgICAgdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCA9IHRoaXMuX29mZnNldC5wYWdlSWR4OworICAgICAgdGhpcy5fc2VsZWN0ZWQubWF0Y2hJZHggPSB0aGlzLl9vZmZzZXQubWF0Y2hJZHg7CisgICAgICBzdGF0ZSA9IHdyYXBwZWQgPyBGaW5kU3RhdGUuV1JBUFBFRCA6IEZpbmRTdGF0ZS5GT1VORDsKKworICAgICAgaWYgKHByZXZpb3VzUGFnZSAhPT0gLTEgJiYgcHJldmlvdXNQYWdlICE9PSB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4KSB7CisgICAgICAgIHRoaXMuX3VwZGF0ZVBhZ2UocHJldmlvdXNQYWdlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLl91cGRhdGVVSVN0YXRlKHN0YXRlLCB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXMpOworCisgICAgaWYgKHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggIT09IC0xKSB7CisgICAgICB0aGlzLl9zY3JvbGxNYXRjaGVzID0gdHJ1ZTsKKworICAgICAgdGhpcy5fdXBkYXRlUGFnZSh0aGlzLl9zZWxlY3RlZC5wYWdlSWR4KTsKKyAgICB9CisgIH0KKworICBfb25GaW5kQmFyQ2xvc2UoZXZ0KSB7CisgICAgY29uc3QgcGRmRG9jdW1lbnQgPSB0aGlzLl9wZGZEb2N1bWVudDsKKworICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgIGlmICghdGhpcy5fcGRmRG9jdW1lbnQgfHwgcGRmRG9jdW1lbnQgJiYgdGhpcy5fcGRmRG9jdW1lbnQgIT09IHBkZkRvY3VtZW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX2ZpbmRUaW1lb3V0KSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5kVGltZW91dCk7CisgICAgICAgIHRoaXMuX2ZpbmRUaW1lb3V0ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHgpIHsKKyAgICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IG51bGw7CisgICAgICAgIHRoaXMuX2RpcnR5TWF0Y2ggPSB0cnVlOworICAgICAgfQorCisgICAgICB0aGlzLl91cGRhdGVVSVN0YXRlKEZpbmRTdGF0ZS5GT1VORCk7CisKKyAgICAgIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXMgPSBmYWxzZTsKKworICAgICAgdGhpcy5fdXBkYXRlQWxsUGFnZXMoKTsKKyAgICB9KTsKKyAgfQorCisgIF9yZXF1ZXN0TWF0Y2hlc0NvdW50KCkgeworICAgIGNvbnN0IHsKKyAgICAgIHBhZ2VJZHgsCisgICAgICBtYXRjaElkeAorICAgIH0gPSB0aGlzLl9zZWxlY3RlZDsKKyAgICBsZXQgY3VycmVudCA9IDAsCisgICAgICAgIHRvdGFsID0gdGhpcy5fbWF0Y2hlc0NvdW50VG90YWw7CisKKyAgICBpZiAobWF0Y2hJZHggIT09IC0xKSB7CisgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZ2VJZHg7IGkrKykgeworICAgICAgICBjdXJyZW50ICs9IHRoaXMuX3BhZ2VNYXRjaGVzW2ldICYmIHRoaXMuX3BhZ2VNYXRjaGVzW2ldLmxlbmd0aCB8fCAwOworICAgICAgfQorCisgICAgICBjdXJyZW50ICs9IG1hdGNoSWR4ICsgMTsKKyAgICB9CisKKyAgICBpZiAoY3VycmVudCA8IDEgfHwgY3VycmVudCA+IHRvdGFsKSB7CisgICAgICBjdXJyZW50ID0gdG90YWwgPSAwOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBjdXJyZW50LAorICAgICAgdG90YWwKKyAgICB9OworICB9CisKKyAgX3VwZGF0ZVVJUmVzdWx0c0NvdW50KCkgeworICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKCJ1cGRhdGVmaW5kbWF0Y2hlc2NvdW50IiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgbWF0Y2hlc0NvdW50OiB0aGlzLl9yZXF1ZXN0TWF0Y2hlc0NvdW50KCkKKyAgICB9KTsKKyAgfQorCisgIF91cGRhdGVVSVN0YXRlKHN0YXRlLCBwcmV2aW91cykgeworICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKCJ1cGRhdGVmaW5kY29udHJvbHN0YXRlIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgc3RhdGUsCisgICAgICBwcmV2aW91cywKKyAgICAgIG1hdGNoZXNDb3VudDogdGhpcy5fcmVxdWVzdE1hdGNoZXNDb3VudCgpLAorICAgICAgcmF3UXVlcnk6IHRoaXMuX3N0YXRlID8gdGhpcy5fc3RhdGUucXVlcnkgOiBudWxsCisgICAgfSk7CisgIH0KKworfQorCitleHBvcnRzLlBERkZpbmRDb250cm9sbGVyID0gUERGRmluZENvbnRyb2xsZXI7CisKKy8qKiovIH0pLAorLyogMTEgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5nZXRDaGFyYWN0ZXJUeXBlID0gZ2V0Q2hhcmFjdGVyVHlwZTsKK2V4cG9ydHMuQ2hhcmFjdGVyVHlwZSA9IHZvaWQgMDsKK2NvbnN0IENoYXJhY3RlclR5cGUgPSB7CisgIFNQQUNFOiAwLAorICBBTFBIQV9MRVRURVI6IDEsCisgIFBVTkNUOiAyLAorICBIQU5fTEVUVEVSOiAzLAorICBLQVRBS0FOQV9MRVRURVI6IDQsCisgIEhJUkFHQU5BX0xFVFRFUjogNSwKKyAgSEFMRldJRFRIX0tBVEFLQU5BX0xFVFRFUjogNiwKKyAgVEhBSV9MRVRURVI6IDcKK307CitleHBvcnRzLkNoYXJhY3RlclR5cGUgPSBDaGFyYWN0ZXJUeXBlOworCitmdW5jdGlvbiBpc0FscGhhYmV0aWNhbFNjcmlwdChjaGFyQ29kZSkgeworICByZXR1cm4gY2hhckNvZGUgPCAweDJlODA7Cit9CisKK2Z1bmN0aW9uIGlzQXNjaWkoY2hhckNvZGUpIHsKKyAgcmV0dXJuIChjaGFyQ29kZSAmIDB4ZmY4MCkgPT09IDA7Cit9CisKK2Z1bmN0aW9uIGlzQXNjaWlBbHBoYShjaGFyQ29kZSkgeworICByZXR1cm4gY2hhckNvZGUgPj0gMHg2MSAmJiBjaGFyQ29kZSA8PSAweDdhIHx8IGNoYXJDb2RlID49IDB4NDEgJiYgY2hhckNvZGUgPD0gMHg1YTsKK30KKworZnVuY3Rpb24gaXNBc2NpaURpZ2l0KGNoYXJDb2RlKSB7CisgIHJldHVybiBjaGFyQ29kZSA+PSAweDMwICYmIGNoYXJDb2RlIDw9IDB4Mzk7Cit9CisKK2Z1bmN0aW9uIGlzQXNjaWlTcGFjZShjaGFyQ29kZSkgeworICByZXR1cm4gY2hhckNvZGUgPT09IDB4MjAgfHwgY2hhckNvZGUgPT09IDB4MDkgfHwgY2hhckNvZGUgPT09IDB4MGQgfHwgY2hhckNvZGUgPT09IDB4MGE7Cit9CisKK2Z1bmN0aW9uIGlzSGFuKGNoYXJDb2RlKSB7CisgIHJldHVybiBjaGFyQ29kZSA+PSAweDM0MDAgJiYgY2hhckNvZGUgPD0gMHg5ZmZmIHx8IGNoYXJDb2RlID49IDB4ZjkwMCAmJiBjaGFyQ29kZSA8PSAweGZhZmY7Cit9CisKK2Z1bmN0aW9uIGlzS2F0YWthbmEoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlID49IDB4MzBhMCAmJiBjaGFyQ29kZSA8PSAweDMwZmY7Cit9CisKK2Z1bmN0aW9uIGlzSGlyYWdhbmEoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlID49IDB4MzA0MCAmJiBjaGFyQ29kZSA8PSAweDMwOWY7Cit9CisKK2Z1bmN0aW9uIGlzSGFsZndpZHRoS2F0YWthbmEoY2hhckNvZGUpIHsKKyAgcmV0dXJuIGNoYXJDb2RlID49IDB4ZmY2MCAmJiBjaGFyQ29kZSA8PSAweGZmOWY7Cit9CisKK2Z1bmN0aW9uIGlzVGhhaShjaGFyQ29kZSkgeworICByZXR1cm4gKGNoYXJDb2RlICYgMHhmZjgwKSA9PT0gMHgwZTAwOworfQorCitmdW5jdGlvbiBnZXRDaGFyYWN0ZXJUeXBlKGNoYXJDb2RlKSB7CisgIGlmIChpc0FscGhhYmV0aWNhbFNjcmlwdChjaGFyQ29kZSkpIHsKKyAgICBpZiAoaXNBc2NpaShjaGFyQ29kZSkpIHsKKyAgICAgIGlmIChpc0FzY2lpU3BhY2UoY2hhckNvZGUpKSB7CisgICAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlNQQUNFOworICAgICAgfSBlbHNlIGlmIChpc0FzY2lpQWxwaGEoY2hhckNvZGUpIHx8IGlzQXNjaWlEaWdpdChjaGFyQ29kZSkgfHwgY2hhckNvZGUgPT09IDB4NWYpIHsKKyAgICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuQUxQSEFfTEVUVEVSOworICAgICAgfQorCisgICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5QVU5DVDsKKyAgICB9IGVsc2UgaWYgKGlzVGhhaShjaGFyQ29kZSkpIHsKKyAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlRIQUlfTEVUVEVSOworICAgIH0gZWxzZSBpZiAoY2hhckNvZGUgPT09IDB4YTApIHsKKyAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlNQQUNFOworICAgIH0KKworICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUjsKKyAgfQorCisgIGlmIChpc0hhbihjaGFyQ29kZSkpIHsKKyAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5IQU5fTEVUVEVSOworICB9IGVsc2UgaWYgKGlzS2F0YWthbmEoY2hhckNvZGUpKSB7CisgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuS0FUQUtBTkFfTEVUVEVSOworICB9IGVsc2UgaWYgKGlzSGlyYWdhbmEoY2hhckNvZGUpKSB7CisgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSElSQUdBTkFfTEVUVEVSOworICB9IGVsc2UgaWYgKGlzSGFsZndpZHRoS2F0YWthbmEoY2hhckNvZGUpKSB7CisgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSEFMRldJRFRIX0tBVEFLQU5BX0xFVFRFUjsKKyAgfQorCisgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUjsKK30KKworLyoqKi8gfSksCisvKiAxMiAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLmlzRGVzdEhhc2hlc0VxdWFsID0gaXNEZXN0SGFzaGVzRXF1YWw7CitleHBvcnRzLmlzRGVzdEFycmF5c0VxdWFsID0gaXNEZXN0QXJyYXlzRXF1YWw7CitleHBvcnRzLlBERkhpc3RvcnkgPSB2b2lkIDA7CisKK3ZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOworCitjb25zdCBIQVNIX0NIQU5HRV9USU1FT1VUID0gMTAwMDsKK2NvbnN0IFBPU0lUSU9OX1VQREFURURfVEhSRVNIT0xEID0gNTA7Citjb25zdCBVUERBVEVfVklFV0FSRUFfVElNRU9VVCA9IDEwMDA7CisKK2Z1bmN0aW9uIGdldEN1cnJlbnRIYXNoKCkgeworICByZXR1cm4gZG9jdW1lbnQubG9jYXRpb24uaGFzaDsKK30KKworY2xhc3MgUERGSGlzdG9yeSB7CisgIGNvbnN0cnVjdG9yKHsKKyAgICBsaW5rU2VydmljZSwKKyAgICBldmVudEJ1cworICB9KSB7CisgICAgdGhpcy5saW5rU2VydmljZSA9IGxpbmtTZXJ2aWNlOworICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1czsKKyAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlOworICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gIiI7CisgICAgdGhpcy5yZXNldCgpOworICAgIHRoaXMuX2JvdW5kRXZlbnRzID0gbnVsbDsKKyAgICB0aGlzLl9pc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSA9IGZhbHNlOworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkIiwgZXZ0ID0+IHsKKyAgICAgIHRoaXMuX2lzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlID0gZXZ0LmFjdGl2ZSB8fCBldnQuc3dpdGNoSW5Qcm9ncmVzczsKKyAgICB9KTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJwYWdlc2luaXQiLCAoKSA9PiB7CisgICAgICB0aGlzLl9pc1BhZ2VzTG9hZGVkID0gZmFsc2U7CisKKyAgICAgIGNvbnN0IG9uUGFnZXNMb2FkZWQgPSBldnQgPT4geworICAgICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoInBhZ2VzbG9hZGVkIiwgb25QYWdlc0xvYWRlZCk7CisKKyAgICAgICAgdGhpcy5faXNQYWdlc0xvYWRlZCA9ICEhZXZ0LnBhZ2VzQ291bnQ7CisgICAgICB9OworCisgICAgICB0aGlzLmV2ZW50QnVzLl9vbigicGFnZXNsb2FkZWQiLCBvblBhZ2VzTG9hZGVkKTsKKyAgICB9KTsKKyAgfQorCisgIGluaXRpYWxpemUoeworICAgIGZpbmdlcnByaW50LAorICAgIHJlc2V0SGlzdG9yeSA9IGZhbHNlLAorICAgIHVwZGF0ZVVybCA9IGZhbHNlCisgIH0pIHsKKyAgICBpZiAoIWZpbmdlcnByaW50IHx8IHR5cGVvZiBmaW5nZXJwcmludCAhPT0gInN0cmluZyIpIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoJ1BERkhpc3RvcnkuaW5pdGlhbGl6ZTogVGhlICJmaW5nZXJwcmludCIgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7CisgICAgICB0aGlzLnJlc2V0KCk7CisgICAgfQorCisgICAgY29uc3QgcmVJbml0aWFsaXplZCA9IHRoaXMuX2ZpbmdlcnByaW50ICE9PSAiIiAmJiB0aGlzLl9maW5nZXJwcmludCAhPT0gZmluZ2VycHJpbnQ7CisgICAgdGhpcy5fZmluZ2VycHJpbnQgPSBmaW5nZXJwcmludDsKKyAgICB0aGlzLl91cGRhdGVVcmwgPSB1cGRhdGVVcmwgPT09IHRydWU7CisgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgdGhpcy5fYmluZEV2ZW50cygpOworCisgICAgY29uc3Qgc3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTsKKyAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UgPSAwOworICAgIHRoaXMuX2N1cnJlbnRIYXNoID0gZ2V0Q3VycmVudEhhc2goKTsKKyAgICB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMgPSAwOworICAgIHRoaXMuX3VpZCA9IHRoaXMuX21heFVpZCA9IDA7CisgICAgdGhpcy5fZGVzdGluYXRpb24gPSBudWxsOworICAgIHRoaXMuX3Bvc2l0aW9uID0gbnVsbDsKKworICAgIGlmICghdGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlLCB0cnVlKSB8fCByZXNldEhpc3RvcnkpIHsKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgaGFzaCwKKyAgICAgICAgcGFnZSwKKyAgICAgICAgcm90YXRpb24KKyAgICAgIH0gPSB0aGlzLl9wYXJzZUN1cnJlbnRIYXNoKHRydWUpOworCisgICAgICBpZiAoIWhhc2ggfHwgcmVJbml0aWFsaXplZCB8fCByZXNldEhpc3RvcnkpIHsKKyAgICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKG51bGwsIHRydWUpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHsKKyAgICAgICAgaGFzaCwKKyAgICAgICAgcGFnZSwKKyAgICAgICAgcm90YXRpb24KKyAgICAgIH0sIHRydWUpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgZGVzdGluYXRpb24gPSBzdGF0ZS5kZXN0aW5hdGlvbjsKKworICAgIHRoaXMuX3VwZGF0ZUludGVybmFsU3RhdGUoZGVzdGluYXRpb24sIHN0YXRlLnVpZCwgdHJ1ZSk7CisKKyAgICBpZiAodGhpcy5fdWlkID4gdGhpcy5fbWF4VWlkKSB7CisgICAgICB0aGlzLl9tYXhVaWQgPSB0aGlzLl91aWQ7CisgICAgfQorCisgICAgaWYgKGRlc3RpbmF0aW9uLnJvdGF0aW9uICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IGRlc3RpbmF0aW9uLnJvdGF0aW9uOworICAgIH0KKworICAgIGlmIChkZXN0aW5hdGlvbi5kZXN0KSB7CisgICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBKU09OLnN0cmluZ2lmeShkZXN0aW5hdGlvbi5kZXN0KTsKKyAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgPSBudWxsOworICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uaGFzaCkgeworICAgICAgdGhpcy5faW5pdGlhbEJvb2ttYXJrID0gZGVzdGluYXRpb24uaGFzaDsKKyAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLnBhZ2UpIHsKKyAgICAgIHRoaXMuX2luaXRpYWxCb29rbWFyayA9IGBwYWdlPSR7ZGVzdGluYXRpb24ucGFnZX1gOworICAgIH0KKyAgfQorCisgIHJlc2V0KCkgeworICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgeworICAgICAgdGhpcy5fcGFnZUhpZGUoKTsKKworICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgdGhpcy5fdW5iaW5kRXZlbnRzKCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCkgeworICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCk7CisgICAgICB0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQgPSBudWxsOworICAgIH0KKworICAgIHRoaXMuX2luaXRpYWxCb29rbWFyayA9IG51bGw7CisgICAgdGhpcy5faW5pdGlhbFJvdGF0aW9uID0gbnVsbDsKKyAgfQorCisgIHB1c2goeworICAgIG5hbWVkRGVzdCA9IG51bGwsCisgICAgZXhwbGljaXREZXN0LAorICAgIHBhZ2VOdW1iZXIKKyAgfSkgeworICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobmFtZWREZXN0ICYmIHR5cGVvZiBuYW1lZERlc3QgIT09ICJzdHJpbmciKSB7CisgICAgICBjb25zb2xlLmVycm9yKCJQREZIaXN0b3J5LnB1c2g6ICIgKyBgIiR7bmFtZWREZXN0fSIgaXMgbm90IGEgdmFsaWQgbmFtZWREZXN0IHBhcmFtZXRlci5gKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGV4cGxpY2l0RGVzdCkpIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoIlBERkhpc3RvcnkucHVzaDogIiArIGAiJHtleHBsaWNpdERlc3R9IiBpcyBub3QgYSB2YWxpZCBleHBsaWNpdERlc3QgcGFyYW1ldGVyLmApOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpICYmIHBhZ2VOdW1iZXIgPiAwICYmIHBhZ2VOdW1iZXIgPD0gdGhpcy5saW5rU2VydmljZS5wYWdlc0NvdW50KSkgeworICAgICAgaWYgKHBhZ2VOdW1iZXIgIT09IG51bGwgfHwgdGhpcy5fZGVzdGluYXRpb24pIHsKKyAgICAgICAgY29uc29sZS5lcnJvcigiUERGSGlzdG9yeS5wdXNoOiAiICsgYCIke3BhZ2VOdW1iZXJ9IiBpcyBub3QgYSB2YWxpZCBwYWdlTnVtYmVyIHBhcmFtZXRlci5gKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGhhc2ggPSBuYW1lZERlc3QgfHwgSlNPTi5zdHJpbmdpZnkoZXhwbGljaXREZXN0KTsKKworICAgIGlmICghaGFzaCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxldCBmb3JjZVJlcGxhY2UgPSBmYWxzZTsKKworICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbiAmJiAoaXNEZXN0SGFzaGVzRXF1YWwodGhpcy5fZGVzdGluYXRpb24uaGFzaCwgaGFzaCkgfHwgaXNEZXN0QXJyYXlzRXF1YWwodGhpcy5fZGVzdGluYXRpb24uZGVzdCwgZXhwbGljaXREZXN0KSkpIHsKKyAgICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5wYWdlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZm9yY2VSZXBsYWNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fcG9wU3RhdGVJblByb2dyZXNzICYmICFmb3JjZVJlcGxhY2UpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUoeworICAgICAgZGVzdDogZXhwbGljaXREZXN0LAorICAgICAgaGFzaCwKKyAgICAgIHBhZ2U6IHBhZ2VOdW1iZXIsCisgICAgICByb3RhdGlvbjogdGhpcy5saW5rU2VydmljZS5yb3RhdGlvbgorICAgIH0sIGZvcmNlUmVwbGFjZSk7CisKKyAgICBpZiAoIXRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcykgeworICAgICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4geworICAgICAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIHB1c2hDdXJyZW50UG9zaXRpb24oKSB7CisgICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl90cnlQdXNoQ3VycmVudFBvc2l0aW9uKCk7CisgIH0KKworICBiYWNrKCkgeworICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3Qgc3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTsKKworICAgIGlmICh0aGlzLl9pc1ZhbGlkU3RhdGUoc3RhdGUpICYmIHN0YXRlLnVpZCA+IDApIHsKKyAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTsKKyAgICB9CisgIH0KKworICBmb3J3YXJkKCkgeworICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3Qgc3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTsKKworICAgIGlmICh0aGlzLl9pc1ZhbGlkU3RhdGUoc3RhdGUpICYmIHN0YXRlLnVpZCA8IHRoaXMuX21heFVpZCkgeworICAgICAgd2luZG93Lmhpc3RvcnkuZm9yd2FyZCgpOworICAgIH0KKyAgfQorCisgIGdldCBwb3BTdGF0ZUluUHJvZ3Jlc3MoKSB7CisgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkICYmICh0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgfHwgdGhpcy5fYmxvY2tIYXNoQ2hhbmdlID4gMCk7CisgIH0KKworICBnZXQgaW5pdGlhbEJvb2ttYXJrKCkgeworICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXplZCA/IHRoaXMuX2luaXRpYWxCb29rbWFyayA6IG51bGw7CisgIH0KKworICBnZXQgaW5pdGlhbFJvdGF0aW9uKCkgeworICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXplZCA/IHRoaXMuX2luaXRpYWxSb3RhdGlvbiA6IG51bGw7CisgIH0KKworICBfcHVzaE9yUmVwbGFjZVN0YXRlKGRlc3RpbmF0aW9uLCBmb3JjZVJlcGxhY2UgPSBmYWxzZSkgeworICAgIGNvbnN0IHNob3VsZFJlcGxhY2UgPSBmb3JjZVJlcGxhY2UgfHwgIXRoaXMuX2Rlc3RpbmF0aW9uOworICAgIGNvbnN0IG5ld1N0YXRlID0geworICAgICAgZmluZ2VycHJpbnQ6IHRoaXMuX2ZpbmdlcnByaW50LAorICAgICAgdWlkOiBzaG91bGRSZXBsYWNlID8gdGhpcy5fdWlkIDogdGhpcy5fdWlkICsgMSwKKyAgICAgIGRlc3RpbmF0aW9uCisgICAgfTsKKworICAgIHRoaXMuX3VwZGF0ZUludGVybmFsU3RhdGUoZGVzdGluYXRpb24sIG5ld1N0YXRlLnVpZCk7CisKKyAgICBsZXQgbmV3VXJsOworCisgICAgaWYgKHRoaXMuX3VwZGF0ZVVybCAmJiBkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5oYXNoKSB7CisgICAgICBjb25zdCBiYXNlVXJsID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZi5zcGxpdCgiIyIpWzBdOworCisgICAgICBpZiAoIWJhc2VVcmwuc3RhcnRzV2l0aCgiZmlsZTovLyIpKSB7CisgICAgICAgIG5ld1VybCA9IGAke2Jhc2VVcmx9IyR7ZGVzdGluYXRpb24uaGFzaH1gOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzaG91bGRSZXBsYWNlKSB7CisgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobmV3U3RhdGUsICIiLCBuZXdVcmwpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9tYXhVaWQgPSB0aGlzLl91aWQ7CisgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobmV3U3RhdGUsICIiLCBuZXdVcmwpOworICAgIH0KKyAgfQorCisgIF90cnlQdXNoQ3VycmVudFBvc2l0aW9uKHRlbXBvcmFyeSA9IGZhbHNlKSB7CisgICAgaWYgKCF0aGlzLl9wb3NpdGlvbikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uOworCisgICAgaWYgKHRlbXBvcmFyeSkgeworICAgICAgcG9zaXRpb24gPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuX3Bvc2l0aW9uKTsKKyAgICAgIHBvc2l0aW9uLnRlbXBvcmFyeSA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCF0aGlzLl9kZXN0aW5hdGlvbikgeworICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHBvc2l0aW9uKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHsKKyAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShwb3NpdGlvbiwgdHJ1ZSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fZGVzdGluYXRpb24uaGFzaCA9PT0gcG9zaXRpb24uaGFzaCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGhpcy5fZGVzdGluYXRpb24ucGFnZSAmJiAoUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPD0gMCB8fCB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMgPD0gUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IGZvcmNlUmVwbGFjZSA9IGZhbHNlOworCisgICAgaWYgKHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgPj0gcG9zaXRpb24uZmlyc3QgJiYgdGhpcy5fZGVzdGluYXRpb24ucGFnZSA8PSBwb3NpdGlvbi5wYWdlKSB7CisgICAgICBpZiAodGhpcy5fZGVzdGluYXRpb24uZGVzdCB8fCAhdGhpcy5fZGVzdGluYXRpb24uZmlyc3QpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmb3JjZVJlcGxhY2UgPSB0cnVlOworICAgIH0KKworICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShwb3NpdGlvbiwgZm9yY2VSZXBsYWNlKTsKKyAgfQorCisgIF9pc1ZhbGlkU3RhdGUoc3RhdGUsIGNoZWNrUmVsb2FkID0gZmFsc2UpIHsKKyAgICBpZiAoIXN0YXRlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0YXRlLmZpbmdlcnByaW50ICE9PSB0aGlzLl9maW5nZXJwcmludCkgeworICAgICAgaWYgKGNoZWNrUmVsb2FkKSB7CisgICAgICAgIGlmICh0eXBlb2Ygc3RhdGUuZmluZ2VycHJpbnQgIT09ICJzdHJpbmciIHx8IHN0YXRlLmZpbmdlcnByaW50Lmxlbmd0aCAhPT0gdGhpcy5fZmluZ2VycHJpbnQubGVuZ3RoKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgW3BlcmZFbnRyeV0gPSBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKCJuYXZpZ2F0aW9uIik7CisKKyAgICAgICAgaWYgKCFwZXJmRW50cnkgfHwgcGVyZkVudHJ5LnR5cGUgIT09ICJyZWxvYWQiKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHN0YXRlLnVpZCkgfHwgc3RhdGUudWlkIDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGF0ZS5kZXN0aW5hdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RhdGUuZGVzdGluYXRpb24gIT09ICJvYmplY3QiKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBfdXBkYXRlSW50ZXJuYWxTdGF0ZShkZXN0aW5hdGlvbiwgdWlkLCByZW1vdmVUZW1wb3JhcnkgPSBmYWxzZSkgeworICAgIGlmICh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpIHsKKyAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpOworICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBpZiAocmVtb3ZlVGVtcG9yYXJ5ICYmIGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLnRlbXBvcmFyeSkgeworICAgICAgZGVsZXRlIGRlc3RpbmF0aW9uLnRlbXBvcmFyeTsKKyAgICB9CisKKyAgICB0aGlzLl9kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOworICAgIHRoaXMuX3VpZCA9IHVpZDsKKyAgICB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMgPSAwOworICB9CisKKyAgX3BhcnNlQ3VycmVudEhhc2goY2hlY2tOYW1lZGRlc3QgPSBmYWxzZSkgeworICAgIGNvbnN0IGhhc2ggPSB1bmVzY2FwZShnZXRDdXJyZW50SGFzaCgpKS5zdWJzdHJpbmcoMSk7CisgICAgY29uc3QgcGFyYW1zID0gKDAsIF91aV91dGlscy5wYXJzZVF1ZXJ5U3RyaW5nKShoYXNoKTsKKyAgICBjb25zdCBuYW1lZGRlc3QgPSBwYXJhbXMubmFtZWRkZXN0IHx8ICIiOworICAgIGxldCBwYWdlID0gcGFyYW1zLnBhZ2UgfCAwOworCisgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID4gMCAmJiBwYWdlIDw9IHRoaXMubGlua1NlcnZpY2UucGFnZXNDb3VudCkgfHwgY2hlY2tOYW1lZGRlc3QgJiYgbmFtZWRkZXN0Lmxlbmd0aCA+IDApIHsKKyAgICAgIHBhZ2UgPSBudWxsOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBoYXNoLAorICAgICAgcGFnZSwKKyAgICAgIHJvdGF0aW9uOiB0aGlzLmxpbmtTZXJ2aWNlLnJvdGF0aW9uCisgICAgfTsKKyAgfQorCisgIF91cGRhdGVWaWV3YXJlYSh7CisgICAgbG9jYXRpb24KKyAgfSkgeworICAgIGlmICh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpIHsKKyAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpOworICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLl9wb3NpdGlvbiA9IHsKKyAgICAgIGhhc2g6IHRoaXMuX2lzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlID8gYHBhZ2U9JHtsb2NhdGlvbi5wYWdlTnVtYmVyfWAgOiBsb2NhdGlvbi5wZGZPcGVuUGFyYW1zLnN1YnN0cmluZygxKSwKKyAgICAgIHBhZ2U6IHRoaXMubGlua1NlcnZpY2UucGFnZSwKKyAgICAgIGZpcnN0OiBsb2NhdGlvbi5wYWdlTnVtYmVyLAorICAgICAgcm90YXRpb246IGxvY2F0aW9uLnJvdGF0aW9uCisgICAgfTsKKworICAgIGlmICh0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPiAwICYmIHRoaXMuX2lzUGFnZXNMb2FkZWQgJiYgdGhpcy5fZGVzdGluYXRpb24gJiYgIXRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UpIHsKKyAgICAgIHRoaXMuX251bVBvc2l0aW9uVXBkYXRlcysrOworICAgIH0KKworICAgIGlmIChVUERBVEVfVklFV0FSRUFfVElNRU9VVCA+IDApIHsKKyAgICAgIHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICBpZiAoIXRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcykgeworICAgICAgICAgIHRoaXMuX3RyeVB1c2hDdXJyZW50UG9zaXRpb24odHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQgPSBudWxsOworICAgICAgfSwgVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVQpOworICAgIH0KKyAgfQorCisgIF9wb3BTdGF0ZSh7CisgICAgc3RhdGUKKyAgfSkgeworICAgIGNvbnN0IG5ld0hhc2ggPSBnZXRDdXJyZW50SGFzaCgpLAorICAgICAgICAgIGhhc2hDaGFuZ2VkID0gdGhpcy5fY3VycmVudEhhc2ggIT09IG5ld0hhc2g7CisgICAgdGhpcy5fY3VycmVudEhhc2ggPSBuZXdIYXNoOworCisgICAgaWYgKCFzdGF0ZSkgeworICAgICAgdGhpcy5fdWlkKys7CisKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgaGFzaCwKKyAgICAgICAgcGFnZSwKKyAgICAgICAgcm90YXRpb24KKyAgICAgIH0gPSB0aGlzLl9wYXJzZUN1cnJlbnRIYXNoKCk7CisKKyAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZSh7CisgICAgICAgIGhhc2gsCisgICAgICAgIHBhZ2UsCisgICAgICAgIHJvdGF0aW9uCisgICAgICB9LCB0cnVlKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyA9IHRydWU7CisKKyAgICBpZiAoaGFzaENoYW5nZWQpIHsKKyAgICAgIHRoaXMuX2Jsb2NrSGFzaENoYW5nZSsrOworICAgICAgKDAsIF91aV91dGlscy53YWl0T25FdmVudE9yVGltZW91dCkoeworICAgICAgICB0YXJnZXQ6IHdpbmRvdywKKyAgICAgICAgbmFtZTogImhhc2hjaGFuZ2UiLAorICAgICAgICBkZWxheTogSEFTSF9DSEFOR0VfVElNRU9VVAorICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgIHRoaXMuX2Jsb2NrSGFzaENoYW5nZS0tOworICAgICAgfSk7CisgICAgfQorCisgICAgY29uc3QgZGVzdGluYXRpb24gPSBzdGF0ZS5kZXN0aW5hdGlvbjsKKworICAgIHRoaXMuX3VwZGF0ZUludGVybmFsU3RhdGUoZGVzdGluYXRpb24sIHN0YXRlLnVpZCwgdHJ1ZSk7CisKKyAgICBpZiAodGhpcy5fdWlkID4gdGhpcy5fbWF4VWlkKSB7CisgICAgICB0aGlzLl9tYXhVaWQgPSB0aGlzLl91aWQ7CisgICAgfQorCisgICAgaWYgKCgwLCBfdWlfdXRpbHMuaXNWYWxpZFJvdGF0aW9uKShkZXN0aW5hdGlvbi5yb3RhdGlvbikpIHsKKyAgICAgIHRoaXMubGlua1NlcnZpY2Uucm90YXRpb24gPSBkZXN0aW5hdGlvbi5yb3RhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoZGVzdGluYXRpb24uZGVzdCkgeworICAgICAgdGhpcy5saW5rU2VydmljZS5uYXZpZ2F0ZVRvKGRlc3RpbmF0aW9uLmRlc3QpOworICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uaGFzaCkgeworICAgICAgdGhpcy5saW5rU2VydmljZS5zZXRIYXNoKGRlc3RpbmF0aW9uLmhhc2gpOworICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24ucGFnZSkgeworICAgICAgdGhpcy5saW5rU2VydmljZS5wYWdlID0gZGVzdGluYXRpb24ucGFnZTsKKyAgICB9CisKKyAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKKyAgICAgIHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgIH0pOworICB9CisKKyAgX3BhZ2VIaWRlKCkgeworICAgIGlmICghdGhpcy5fZGVzdGluYXRpb24gfHwgdGhpcy5fZGVzdGluYXRpb24udGVtcG9yYXJ5KSB7CisgICAgICB0aGlzLl90cnlQdXNoQ3VycmVudFBvc2l0aW9uKCk7CisgICAgfQorICB9CisKKyAgX2JpbmRFdmVudHMoKSB7CisgICAgaWYgKHRoaXMuX2JvdW5kRXZlbnRzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fYm91bmRFdmVudHMgPSB7CisgICAgICB1cGRhdGVWaWV3YXJlYTogdGhpcy5fdXBkYXRlVmlld2FyZWEuYmluZCh0aGlzKSwKKyAgICAgIHBvcFN0YXRlOiB0aGlzLl9wb3BTdGF0ZS5iaW5kKHRoaXMpLAorICAgICAgcGFnZUhpZGU6IHRoaXMuX3BhZ2VIaWRlLmJpbmQodGhpcykKKyAgICB9OworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInVwZGF0ZXZpZXdhcmVhIiwgdGhpcy5fYm91bmRFdmVudHMudXBkYXRlVmlld2FyZWEpOworCisgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIiwgdGhpcy5fYm91bmRFdmVudHMucG9wU3RhdGUpOworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwYWdlaGlkZSIsIHRoaXMuX2JvdW5kRXZlbnRzLnBhZ2VIaWRlKTsKKyAgfQorCisgIF91bmJpbmRFdmVudHMoKSB7CisgICAgaWYgKCF0aGlzLl9ib3VuZEV2ZW50cykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuZXZlbnRCdXMuX29mZigidXBkYXRldmlld2FyZWEiLCB0aGlzLl9ib3VuZEV2ZW50cy51cGRhdGVWaWV3YXJlYSk7CisKKyAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCB0aGlzLl9ib3VuZEV2ZW50cy5wb3BTdGF0ZSk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBhZ2VoaWRlIiwgdGhpcy5fYm91bmRFdmVudHMucGFnZUhpZGUpOworICAgIHRoaXMuX2JvdW5kRXZlbnRzID0gbnVsbDsKKyAgfQorCit9CisKK2V4cG9ydHMuUERGSGlzdG9yeSA9IFBERkhpc3Rvcnk7CisKK2Z1bmN0aW9uIGlzRGVzdEhhc2hlc0VxdWFsKGRlc3RIYXNoLCBwdXNoSGFzaCkgeworICBpZiAodHlwZW9mIGRlc3RIYXNoICE9PSAic3RyaW5nIiB8fCB0eXBlb2YgcHVzaEhhc2ggIT09ICJzdHJpbmciKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGRlc3RIYXNoID09PSBwdXNoSGFzaCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgeworICAgIG5hbWVkZGVzdAorICB9ID0gKDAsIF91aV91dGlscy5wYXJzZVF1ZXJ5U3RyaW5nKShkZXN0SGFzaCk7CisKKyAgaWYgKG5hbWVkZGVzdCA9PT0gcHVzaEhhc2gpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworZnVuY3Rpb24gaXNEZXN0QXJyYXlzRXF1YWwoZmlyc3REZXN0LCBzZWNvbmREZXN0KSB7CisgIGZ1bmN0aW9uIGlzRW50cnlFcXVhbChmaXJzdCwgc2Vjb25kKSB7CisgICAgaWYgKHR5cGVvZiBmaXJzdCAhPT0gdHlwZW9mIHNlY29uZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChBcnJheS5pc0FycmF5KGZpcnN0KSB8fCBBcnJheS5pc0FycmF5KHNlY29uZCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlyc3QgIT09IG51bGwgJiYgdHlwZW9mIGZpcnN0ID09PSAib2JqZWN0IiAmJiBzZWNvbmQgIT09IG51bGwpIHsKKyAgICAgIGlmIChPYmplY3Qua2V5cyhmaXJzdCkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzZWNvbmQpLmxlbmd0aCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpcnN0KSB7CisgICAgICAgIGlmICghaXNFbnRyeUVxdWFsKGZpcnN0W2tleV0sIHNlY29uZFtrZXldKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmlyc3QgPT09IHNlY29uZCB8fCBOdW1iZXIuaXNOYU4oZmlyc3QpICYmIE51bWJlci5pc05hTihzZWNvbmQpOworICB9CisKKyAgaWYgKCEoQXJyYXkuaXNBcnJheShmaXJzdERlc3QpICYmIEFycmF5LmlzQXJyYXkoc2Vjb25kRGVzdCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGZpcnN0RGVzdC5sZW5ndGggIT09IHNlY29uZERlc3QubGVuZ3RoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZm9yIChsZXQgaSA9IDAsIGlpID0gZmlyc3REZXN0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICBpZiAoIWlzRW50cnlFcXVhbChmaXJzdERlc3RbaV0sIHNlY29uZERlc3RbaV0pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiovIH0pLAorLyogMTMgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZQYWdlVmlldyA9IHZvaWQgMDsKKwordmFyIF91aV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CisKK3ZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX3BkZl9yZW5kZXJpbmdfcXVldWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKKwordmFyIF92aWV3ZXJfY29tcGF0aWJpbGl0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7CisKK2NvbnN0IE1BWF9DQU5WQVNfUElYRUxTID0gX3ZpZXdlcl9jb21wYXRpYmlsaXR5LnZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMubWF4Q2FudmFzUGl4ZWxzIHx8IDE2Nzc3MjE2OworCitjbGFzcyBQREZQYWdlVmlldyB7CisgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKKyAgICBjb25zdCBjb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjsKKyAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSBvcHRpb25zLmRlZmF1bHRWaWV3cG9ydDsKKyAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDsKKyAgICB0aGlzLnJlbmRlcmluZ0lkID0gInBhZ2UiICsgdGhpcy5pZDsKKyAgICB0aGlzLnBkZlBhZ2UgPSBudWxsOworICAgIHRoaXMucGFnZUxhYmVsID0gbnVsbDsKKyAgICB0aGlzLnJvdGF0aW9uID0gMDsKKyAgICB0aGlzLnNjYWxlID0gb3B0aW9ucy5zY2FsZSB8fCBfdWlfdXRpbHMuREVGQVVMVF9TQ0FMRTsKKyAgICB0aGlzLnZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0OworICAgIHRoaXMucGRmUGFnZVJvdGF0ZSA9IGRlZmF1bHRWaWV3cG9ydC5yb3RhdGlvbjsKKyAgICB0aGlzLl9hbm5vdGF0aW9uU3RvcmFnZSA9IG9wdGlvbnMuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbnVsbDsKKyAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9ucy5vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIHx8IG51bGw7CisgICAgdGhpcy5oYXNSZXN0cmljdGVkU2NhbGluZyA9IGZhbHNlOworICAgIHRoaXMudGV4dExheWVyTW9kZSA9IE51bWJlci5pc0ludGVnZXIob3B0aW9ucy50ZXh0TGF5ZXJNb2RlKSA/IG9wdGlvbnMudGV4dExheWVyTW9kZSA6IF91aV91dGlscy5UZXh0TGF5ZXJNb2RlLkVOQUJMRTsKKyAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IG9wdGlvbnMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8ICIiOworICAgIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IHR5cGVvZiBvcHRpb25zLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPT09ICJib29sZWFuIiA/IG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA6IHRydWU7CisgICAgdGhpcy51c2VPbmx5Q3NzWm9vbSA9IG9wdGlvbnMudXNlT25seUNzc1pvb20gfHwgZmFsc2U7CisgICAgdGhpcy5tYXhDYW52YXNQaXhlbHMgPSBvcHRpb25zLm1heENhbnZhc1BpeGVscyB8fCBNQVhfQ0FOVkFTX1BJWEVMUzsKKyAgICB0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1czsKKyAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gb3B0aW9ucy5yZW5kZXJpbmdRdWV1ZTsKKyAgICB0aGlzLnRleHRMYXllckZhY3RvcnkgPSBvcHRpb25zLnRleHRMYXllckZhY3Rvcnk7CisgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5ID0gb3B0aW9ucy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OworICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zLnJlbmRlcmVyIHx8IF91aV91dGlscy5SZW5kZXJlclR5cGUuQ0FOVkFTOworICAgIHRoaXMuZW5hYmxlV2ViR0wgPSBvcHRpb25zLmVuYWJsZVdlYkdMIHx8IGZhbHNlOworICAgIHRoaXMubDEwbiA9IG9wdGlvbnMubDEwbiB8fCBfdWlfdXRpbHMuTnVsbEwxMG47CisgICAgdGhpcy5wYWludFRhc2sgPSBudWxsOworICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwID0gbmV3IFdlYWtNYXAoKTsKKyAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw7CisgICAgdGhpcy5yZXN1bWUgPSBudWxsOworICAgIHRoaXMuZXJyb3IgPSBudWxsOworICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyID0gbnVsbDsKKyAgICB0aGlzLnRleHRMYXllciA9IG51bGw7CisgICAgdGhpcy56b29tTGF5ZXIgPSBudWxsOworICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIGRpdi5jbGFzc05hbWUgPSAicGFnZSI7CisgICAgZGl2LnN0eWxlLndpZHRoID0gTWF0aC5mbG9vcih0aGlzLnZpZXdwb3J0LndpZHRoKSArICJweCI7CisgICAgZGl2LnN0eWxlLmhlaWdodCA9IE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC5oZWlnaHQpICsgInB4IjsKKyAgICBkaXYuc2V0QXR0cmlidXRlKCJkYXRhLXBhZ2UtbnVtYmVyIiwgdGhpcy5pZCk7CisgICAgdGhpcy5kaXYgPSBkaXY7CisgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdik7CisgIH0KKworICBzZXRQZGZQYWdlKHBkZlBhZ2UpIHsKKyAgICB0aGlzLnBkZlBhZ2UgPSBwZGZQYWdlOworICAgIHRoaXMucGRmUGFnZVJvdGF0ZSA9IHBkZlBhZ2Uucm90YXRlOworICAgIGNvbnN0IHRvdGFsUm90YXRpb24gPSAodGhpcy5yb3RhdGlvbiArIHRoaXMucGRmUGFnZVJvdGF0ZSkgJSAzNjA7CisgICAgdGhpcy52aWV3cG9ydCA9IHBkZlBhZ2UuZ2V0Vmlld3BvcnQoeworICAgICAgc2NhbGU6IHRoaXMuc2NhbGUgKiBfdWlfdXRpbHMuQ1NTX1VOSVRTLAorICAgICAgcm90YXRpb246IHRvdGFsUm90YXRpb24KKyAgICB9KTsKKyAgICB0aGlzLnN0YXRzID0gcGRmUGFnZS5zdGF0czsKKyAgICB0aGlzLnJlc2V0KCk7CisgIH0KKworICBkZXN0cm95KCkgeworICAgIHRoaXMucmVzZXQoKTsKKworICAgIGlmICh0aGlzLnBkZlBhZ2UpIHsKKyAgICAgIHRoaXMucGRmUGFnZS5jbGVhbnVwKCk7CisgICAgfQorICB9CisKKyAgYXN5bmMgX3JlbmRlckFubm90YXRpb25MYXllcigpIHsKKyAgICBsZXQgZXJyb3IgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IHRoaXMuYW5ub3RhdGlvbkxheWVyLnJlbmRlcih0aGlzLnZpZXdwb3J0LCAiZGlzcGxheSIpOworICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICBlcnJvciA9IGV4OworICAgIH0gZmluYWxseSB7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJhbm5vdGF0aW9ubGF5ZXJyZW5kZXJlZCIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzLAorICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkLAorICAgICAgICBlcnJvcgorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgX3Jlc2V0Wm9vbUxheWVyKHJlbW92ZUZyb21ET00gPSBmYWxzZSkgeworICAgIGlmICghdGhpcy56b29tTGF5ZXIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB6b29tTGF5ZXJDYW52YXMgPSB0aGlzLnpvb21MYXllci5maXJzdENoaWxkOworICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLmRlbGV0ZSh6b29tTGF5ZXJDYW52YXMpOworICAgIHpvb21MYXllckNhbnZhcy53aWR0aCA9IDA7CisgICAgem9vbUxheWVyQ2FudmFzLmhlaWdodCA9IDA7CisKKyAgICBpZiAocmVtb3ZlRnJvbURPTSkgeworICAgICAgdGhpcy56b29tTGF5ZXIucmVtb3ZlKCk7CisgICAgfQorCisgICAgdGhpcy56b29tTGF5ZXIgPSBudWxsOworICB9CisKKyAgcmVzZXQoa2VlcFpvb21MYXllciA9IGZhbHNlLCBrZWVwQW5ub3RhdGlvbnMgPSBmYWxzZSkgeworICAgIHRoaXMuY2FuY2VsUmVuZGVyaW5nKGtlZXBBbm5vdGF0aW9ucyk7CisgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5JTklUSUFMOworICAgIGNvbnN0IGRpdiA9IHRoaXMuZGl2OworICAgIGRpdi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC53aWR0aCkgKyAicHgiOworICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSArICJweCI7CisgICAgY29uc3QgY2hpbGROb2RlcyA9IGRpdi5jaGlsZE5vZGVzOworICAgIGNvbnN0IGN1cnJlbnRab29tTGF5ZXJOb2RlID0ga2VlcFpvb21MYXllciAmJiB0aGlzLnpvb21MYXllciB8fCBudWxsOworICAgIGNvbnN0IGN1cnJlbnRBbm5vdGF0aW9uTm9kZSA9IGtlZXBBbm5vdGF0aW9ucyAmJiB0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYgfHwgbnVsbDsKKworICAgIGZvciAobGV0IGkgPSBjaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBjb25zdCBub2RlID0gY2hpbGROb2Rlc1tpXTsKKworICAgICAgaWYgKGN1cnJlbnRab29tTGF5ZXJOb2RlID09PSBub2RlIHx8IGN1cnJlbnRBbm5vdGF0aW9uTm9kZSA9PT0gbm9kZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZGl2LnJlbW92ZUNoaWxkKG5vZGUpOworICAgIH0KKworICAgIGRpdi5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbG9hZGVkIik7CisKKyAgICBpZiAoY3VycmVudEFubm90YXRpb25Ob2RlKSB7CisgICAgICB0aGlzLmFubm90YXRpb25MYXllci5oaWRlKCk7CisgICAgfSBlbHNlIGlmICh0aGlzLmFubm90YXRpb25MYXllcikgeworICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuY2FuY2VsKCk7CisgICAgICB0aGlzLmFubm90YXRpb25MYXllciA9IG51bGw7CisgICAgfQorCisgICAgaWYgKCFjdXJyZW50Wm9vbUxheWVyTm9kZSkgeworICAgICAgaWYgKHRoaXMuY2FudmFzKSB7CisgICAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLmRlbGV0ZSh0aGlzLmNhbnZhcyk7CisgICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gMDsKKyAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gMDsKKyAgICAgICAgZGVsZXRlIHRoaXMuY2FudmFzOworICAgICAgfQorCisgICAgICB0aGlzLl9yZXNldFpvb21MYXllcigpOworICAgIH0KKworICAgIGlmICh0aGlzLnN2ZykgeworICAgICAgdGhpcy5wYWludGVkVmlld3BvcnRNYXAuZGVsZXRlKHRoaXMuc3ZnKTsKKyAgICAgIGRlbGV0ZSB0aGlzLnN2ZzsKKyAgICB9CisKKyAgICB0aGlzLmxvYWRpbmdJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgdGhpcy5sb2FkaW5nSWNvbkRpdi5jbGFzc05hbWUgPSAibG9hZGluZ0ljb24iOworICAgIGRpdi5hcHBlbmRDaGlsZCh0aGlzLmxvYWRpbmdJY29uRGl2KTsKKyAgfQorCisgIHVwZGF0ZShzY2FsZSwgcm90YXRpb24sIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBudWxsKSB7CisgICAgdGhpcy5zY2FsZSA9IHNjYWxlIHx8IHRoaXMuc2NhbGU7CisKKyAgICBpZiAodHlwZW9mIHJvdGF0aW9uICE9PSAidW5kZWZpbmVkIikgeworICAgICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uOworICAgIH0KKworICAgIGlmIChvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkgeworICAgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U7CisgICAgfQorCisgICAgY29uc3QgdG90YWxSb3RhdGlvbiA9ICh0aGlzLnJvdGF0aW9uICsgdGhpcy5wZGZQYWdlUm90YXRlKSAlIDM2MDsKKyAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydC5jbG9uZSh7CisgICAgICBzY2FsZTogdGhpcy5zY2FsZSAqIF91aV91dGlscy5DU1NfVU5JVFMsCisgICAgICByb3RhdGlvbjogdG90YWxSb3RhdGlvbgorICAgIH0pOworCisgICAgaWYgKHRoaXMuc3ZnKSB7CisgICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLnN2ZywgdHJ1ZSk7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlcmVuZGVyZWQiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCwKKyAgICAgICAgY3NzVHJhbnNmb3JtOiB0cnVlLAorICAgICAgICB0aW1lc3RhbXA6IHBlcmZvcm1hbmNlLm5vdygpCisgICAgICB9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZXQgaXNTY2FsaW5nUmVzdHJpY3RlZCA9IGZhbHNlOworCisgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMubWF4Q2FudmFzUGl4ZWxzID4gMCkgeworICAgICAgY29uc3Qgb3V0cHV0U2NhbGUgPSB0aGlzLm91dHB1dFNjYWxlOworCisgICAgICBpZiAoKE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC53aWR0aCkgKiBvdXRwdXRTY2FsZS5zeCB8IDApICogKE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC5oZWlnaHQpICogb3V0cHV0U2NhbGUuc3kgfCAwKSA+IHRoaXMubWF4Q2FudmFzUGl4ZWxzKSB7CisgICAgICAgIGlzU2NhbGluZ1Jlc3RyaWN0ZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLmNhbnZhcykgeworICAgICAgaWYgKHRoaXMudXNlT25seUNzc1pvb20gfHwgdGhpcy5oYXNSZXN0cmljdGVkU2NhbGluZyAmJiBpc1NjYWxpbmdSZXN0cmljdGVkKSB7CisgICAgICAgIHRoaXMuY3NzVHJhbnNmb3JtKHRoaXMuY2FudmFzLCB0cnVlKTsKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgicGFnZXJlbmRlcmVkIiwgeworICAgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkLAorICAgICAgICAgIGNzc1RyYW5zZm9ybTogdHJ1ZSwKKyAgICAgICAgICB0aW1lc3RhbXA6IHBlcmZvcm1hbmNlLm5vdygpCisgICAgICAgIH0pOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICghdGhpcy56b29tTGF5ZXIgJiYgIXRoaXMuY2FudmFzLmhhc0F0dHJpYnV0ZSgiaGlkZGVuIikpIHsKKyAgICAgICAgdGhpcy56b29tTGF5ZXIgPSB0aGlzLmNhbnZhcy5wYXJlbnROb2RlOworICAgICAgICB0aGlzLnpvb21MYXllci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMuem9vbUxheWVyKSB7CisgICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLnpvb21MYXllci5maXJzdENoaWxkKTsKKyAgICB9CisKKyAgICB0aGlzLnJlc2V0KHRydWUsIHRydWUpOworICB9CisKKyAgY2FuY2VsUmVuZGVyaW5nKGtlZXBBbm5vdGF0aW9ucyA9IGZhbHNlKSB7CisgICAgaWYgKHRoaXMucGFpbnRUYXNrKSB7CisgICAgICB0aGlzLnBhaW50VGFzay5jYW5jZWwoKTsKKyAgICAgIHRoaXMucGFpbnRUYXNrID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLnJlc3VtZSA9IG51bGw7CisKKyAgICBpZiAodGhpcy50ZXh0TGF5ZXIpIHsKKyAgICAgIHRoaXMudGV4dExheWVyLmNhbmNlbCgpOworICAgICAgdGhpcy50ZXh0TGF5ZXIgPSBudWxsOworICAgIH0KKworICAgIGlmICgha2VlcEFubm90YXRpb25zICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyKSB7CisgICAgICB0aGlzLmFubm90YXRpb25MYXllci5jYW5jZWwoKTsKKyAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyID0gbnVsbDsKKyAgICB9CisgIH0KKworICBjc3NUcmFuc2Zvcm0odGFyZ2V0LCByZWRyYXdBbm5vdGF0aW9ucyA9IGZhbHNlKSB7CisgICAgY29uc3Qgd2lkdGggPSB0aGlzLnZpZXdwb3J0LndpZHRoOworICAgIGNvbnN0IGhlaWdodCA9IHRoaXMudmlld3BvcnQuaGVpZ2h0OworICAgIGNvbnN0IGRpdiA9IHRoaXMuZGl2OworICAgIHRhcmdldC5zdHlsZS53aWR0aCA9IHRhcmdldC5wYXJlbnROb2RlLnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLndpZHRoID0gTWF0aC5mbG9vcih3aWR0aCkgKyAicHgiOworICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSB0YXJnZXQucGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQgPSBkaXYuc3R5bGUuaGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQpICsgInB4IjsKKyAgICBjb25zdCByZWxhdGl2ZVJvdGF0aW9uID0gdGhpcy52aWV3cG9ydC5yb3RhdGlvbiAtIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLmdldCh0YXJnZXQpLnJvdGF0aW9uOworICAgIGNvbnN0IGFic1JvdGF0aW9uID0gTWF0aC5hYnMocmVsYXRpdmVSb3RhdGlvbik7CisgICAgbGV0IHNjYWxlWCA9IDEsCisgICAgICAgIHNjYWxlWSA9IDE7CisKKyAgICBpZiAoYWJzUm90YXRpb24gPT09IDkwIHx8IGFic1JvdGF0aW9uID09PSAyNzApIHsKKyAgICAgIHNjYWxlWCA9IGhlaWdodCAvIHdpZHRoOworICAgICAgc2NhbGVZID0gd2lkdGggLyBoZWlnaHQ7CisgICAgfQorCisgICAgY29uc3QgY3NzVHJhbnNmb3JtID0gInJvdGF0ZSgiICsgcmVsYXRpdmVSb3RhdGlvbiArICJkZWcpICIgKyAic2NhbGUoIiArIHNjYWxlWCArICIsIiArIHNjYWxlWSArICIpIjsKKyAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gY3NzVHJhbnNmb3JtOworCisgICAgaWYgKHRoaXMudGV4dExheWVyKSB7CisgICAgICBjb25zdCB0ZXh0TGF5ZXJWaWV3cG9ydCA9IHRoaXMudGV4dExheWVyLnZpZXdwb3J0OworICAgICAgY29uc3QgdGV4dFJlbGF0aXZlUm90YXRpb24gPSB0aGlzLnZpZXdwb3J0LnJvdGF0aW9uIC0gdGV4dExheWVyVmlld3BvcnQucm90YXRpb247CisgICAgICBjb25zdCB0ZXh0QWJzUm90YXRpb24gPSBNYXRoLmFicyh0ZXh0UmVsYXRpdmVSb3RhdGlvbik7CisgICAgICBsZXQgc2NhbGUgPSB3aWR0aCAvIHRleHRMYXllclZpZXdwb3J0LndpZHRoOworCisgICAgICBpZiAodGV4dEFic1JvdGF0aW9uID09PSA5MCB8fCB0ZXh0QWJzUm90YXRpb24gPT09IDI3MCkgeworICAgICAgICBzY2FsZSA9IHdpZHRoIC8gdGV4dExheWVyVmlld3BvcnQuaGVpZ2h0OworICAgICAgfQorCisgICAgICBjb25zdCB0ZXh0TGF5ZXJEaXYgPSB0aGlzLnRleHRMYXllci50ZXh0TGF5ZXJEaXY7CisgICAgICBsZXQgdHJhbnNYLCB0cmFuc1k7CisKKyAgICAgIHN3aXRjaCAodGV4dEFic1JvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICB0cmFuc1ggPSB0cmFuc1kgPSAwOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgdHJhbnNYID0gMDsKKyAgICAgICAgICB0cmFuc1kgPSAiLSIgKyB0ZXh0TGF5ZXJEaXYuc3R5bGUuaGVpZ2h0OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgIHRyYW5zWCA9ICItIiArIHRleHRMYXllckRpdi5zdHlsZS53aWR0aDsKKyAgICAgICAgICB0cmFuc1kgPSAiLSIgKyB0ZXh0TGF5ZXJEaXYuc3R5bGUuaGVpZ2h0OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgIHRyYW5zWCA9ICItIiArIHRleHRMYXllckRpdi5zdHlsZS53aWR0aDsKKyAgICAgICAgICB0cmFuc1kgPSAwOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY29uc29sZS5lcnJvcigiQmFkIHJvdGF0aW9uIHZhbHVlLiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUudHJhbnNmb3JtID0gInJvdGF0ZSgiICsgdGV4dEFic1JvdGF0aW9uICsgImRlZykgIiArICJzY2FsZSgiICsgc2NhbGUgKyAiLCAiICsgc2NhbGUgKyAiKSAiICsgInRyYW5zbGF0ZSgiICsgdHJhbnNYICsgIiwgIiArIHRyYW5zWSArICIpIjsKKyAgICAgIHRleHRMYXllckRpdi5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAiMCUgMCUiOworICAgIH0KKworICAgIGlmIChyZWRyYXdBbm5vdGF0aW9ucyAmJiB0aGlzLmFubm90YXRpb25MYXllcikgeworICAgICAgdGhpcy5fcmVuZGVyQW5ub3RhdGlvbkxheWVyKCk7CisgICAgfQorICB9CisKKyAgZ2V0IHdpZHRoKCkgeworICAgIHJldHVybiB0aGlzLnZpZXdwb3J0LndpZHRoOworICB9CisKKyAgZ2V0IGhlaWdodCgpIHsKKyAgICByZXR1cm4gdGhpcy52aWV3cG9ydC5oZWlnaHQ7CisgIH0KKworICBnZXRQYWdlUG9pbnQoeCwgeSkgeworICAgIHJldHVybiB0aGlzLnZpZXdwb3J0LmNvbnZlcnRUb1BkZlBvaW50KHgsIHkpOworICB9CisKKyAgZHJhdygpIHsKKyAgICBpZiAodGhpcy5yZW5kZXJpbmdTdGF0ZSAhPT0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLklOSVRJQUwpIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoIk11c3QgYmUgaW4gbmV3IHN0YXRlIGJlZm9yZSBkcmF3aW5nIik7CisgICAgICB0aGlzLnJlc2V0KCk7CisgICAgfQorCisgICAgY29uc3QgeworICAgICAgZGl2LAorICAgICAgcGRmUGFnZQorICAgIH0gPSB0aGlzOworCisgICAgaWYgKCFwZGZQYWdlKSB7CisgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOworCisgICAgICBpZiAodGhpcy5sb2FkaW5nSWNvbkRpdikgeworICAgICAgICBkaXYucmVtb3ZlQ2hpbGQodGhpcy5sb2FkaW5nSWNvbkRpdik7CisgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdJY29uRGl2OworICAgICAgfQorCisgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJwZGZQYWdlIGlzIG5vdCBsb2FkZWQiKSk7CisgICAgfQorCisgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5SVU5OSU5HOworICAgIGNvbnN0IGNhbnZhc1dyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICBjYW52YXNXcmFwcGVyLnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLndpZHRoOworICAgIGNhbnZhc1dyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gZGl2LnN0eWxlLmhlaWdodDsKKyAgICBjYW52YXNXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImNhbnZhc1dyYXBwZXIiKTsKKworICAgIGlmICh0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYpIHsKKyAgICAgIGRpdi5pbnNlcnRCZWZvcmUoY2FudmFzV3JhcHBlciwgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2KTsKKyAgICB9IGVsc2UgeworICAgICAgZGl2LmFwcGVuZENoaWxkKGNhbnZhc1dyYXBwZXIpOworICAgIH0KKworICAgIGxldCB0ZXh0TGF5ZXIgPSBudWxsOworCisgICAgaWYgKHRoaXMudGV4dExheWVyTW9kZSAhPT0gX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRElTQUJMRSAmJiB0aGlzLnRleHRMYXllckZhY3RvcnkpIHsKKyAgICAgIGNvbnN0IHRleHRMYXllckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgdGV4dExheWVyRGl2LmNsYXNzTmFtZSA9ICJ0ZXh0TGF5ZXIiOworICAgICAgdGV4dExheWVyRGl2LnN0eWxlLndpZHRoID0gY2FudmFzV3JhcHBlci5zdHlsZS53aWR0aDsKKyAgICAgIHRleHRMYXllckRpdi5zdHlsZS5oZWlnaHQgPSBjYW52YXNXcmFwcGVyLnN0eWxlLmhlaWdodDsKKworICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkxheWVyICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyLmRpdikgeworICAgICAgICBkaXYuaW5zZXJ0QmVmb3JlKHRleHRMYXllckRpdiwgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0TGF5ZXJEaXYpOworICAgICAgfQorCisgICAgICB0ZXh0TGF5ZXIgPSB0aGlzLnRleHRMYXllckZhY3RvcnkuY3JlYXRlVGV4dExheWVyQnVpbGRlcih0ZXh0TGF5ZXJEaXYsIHRoaXMuaWQgLSAxLCB0aGlzLnZpZXdwb3J0LCB0aGlzLnRleHRMYXllck1vZGUgPT09IF91aV91dGlscy5UZXh0TGF5ZXJNb2RlLkVOQUJMRV9FTkhBTkNFLCB0aGlzLmV2ZW50QnVzKTsKKyAgICB9CisKKyAgICB0aGlzLnRleHRMYXllciA9IHRleHRMYXllcjsKKyAgICBsZXQgcmVuZGVyQ29udGludWVDYWxsYmFjayA9IG51bGw7CisKKyAgICBpZiAodGhpcy5yZW5kZXJpbmdRdWV1ZSkgeworICAgICAgcmVuZGVyQ29udGludWVDYWxsYmFjayA9IGNvbnQgPT4geworICAgICAgICBpZiAoIXRoaXMucmVuZGVyaW5nUXVldWUuaXNIaWdoZXN0UHJpb3JpdHkodGhpcykpIHsKKyAgICAgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLlBBVVNFRDsKKworICAgICAgICAgIHRoaXMucmVzdW1lID0gKCkgPT4geworICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5SVU5OSU5HOworICAgICAgICAgICAgY29udCgpOworICAgICAgICAgIH07CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb250KCk7CisgICAgICB9OworICAgIH0KKworICAgIGNvbnN0IGZpbmlzaFBhaW50VGFzayA9IGFzeW5jIGVycm9yID0+IHsKKyAgICAgIGlmIChwYWludFRhc2sgPT09IHRoaXMucGFpbnRUYXNrKSB7CisgICAgICAgIHRoaXMucGFpbnRUYXNrID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgX3BkZmpzTGliLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikgeworICAgICAgICB0aGlzLmVycm9yID0gbnVsbDsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOworCisgICAgICBpZiAodGhpcy5sb2FkaW5nSWNvbkRpdikgeworICAgICAgICBkaXYucmVtb3ZlQ2hpbGQodGhpcy5sb2FkaW5nSWNvbkRpdik7CisgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdJY29uRGl2OworICAgICAgfQorCisgICAgICB0aGlzLl9yZXNldFpvb21MYXllcih0cnVlKTsKKworICAgICAgdGhpcy5lcnJvciA9IGVycm9yOworICAgICAgdGhpcy5zdGF0cyA9IHBkZlBhZ2Uuc3RhdHM7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlcmVuZGVyZWQiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcywKKyAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCwKKyAgICAgICAgY3NzVHJhbnNmb3JtOiBmYWxzZSwKKyAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKQorICAgICAgfSk7CisKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICB0aHJvdyBlcnJvcjsKKyAgICAgIH0KKyAgICB9OworCisgICAgY29uc3QgcGFpbnRUYXNrID0gdGhpcy5yZW5kZXJlciA9PT0gX3VpX3V0aWxzLlJlbmRlcmVyVHlwZS5TVkcgPyB0aGlzLnBhaW50T25TdmcoY2FudmFzV3JhcHBlcikgOiB0aGlzLnBhaW50T25DYW52YXMoY2FudmFzV3JhcHBlcik7CisgICAgcGFpbnRUYXNrLm9uUmVuZGVyQ29udGludWUgPSByZW5kZXJDb250aW51ZUNhbGxiYWNrOworICAgIHRoaXMucGFpbnRUYXNrID0gcGFpbnRUYXNrOworICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSBwYWludFRhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBmaW5pc2hQYWludFRhc2sobnVsbCkudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmICh0ZXh0TGF5ZXIpIHsKKyAgICAgICAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHBkZlBhZ2Uuc3RyZWFtVGV4dENvbnRlbnQoeworICAgICAgICAgICAgbm9ybWFsaXplV2hpdGVzcGFjZTogdHJ1ZQorICAgICAgICAgIH0pOworICAgICAgICAgIHRleHRMYXllci5zZXRUZXh0Q29udGVudFN0cmVhbShyZWFkYWJsZVN0cmVhbSk7CisgICAgICAgICAgdGV4dExheWVyLnJlbmRlcigpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICByZXR1cm4gZmluaXNoUGFpbnRUYXNrKHJlYXNvbik7CisgICAgfSk7CisKKyAgICBpZiAodGhpcy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5KSB7CisgICAgICBpZiAoIXRoaXMuYW5ub3RhdGlvbkxheWVyKSB7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyID0gdGhpcy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5LmNyZWF0ZUFubm90YXRpb25MYXllckJ1aWxkZXIoZGl2LCBwZGZQYWdlLCB0aGlzLl9hbm5vdGF0aW9uU3RvcmFnZSwgdGhpcy5pbWFnZVJlc291cmNlc1BhdGgsIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcywgdGhpcy5sMTBuKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fcmVuZGVyQW5ub3RhdGlvbkxheWVyKCk7CisgICAgfQorCisgICAgZGl2LnNldEF0dHJpYnV0ZSgiZGF0YS1sb2FkZWQiLCB0cnVlKTsKKyAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlcmVuZGVyIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZU51bWJlcjogdGhpcy5pZAorICAgIH0pOworICAgIHJldHVybiByZXN1bHRQcm9taXNlOworICB9CisKKyAgcGFpbnRPbkNhbnZhcyhjYW52YXNXcmFwcGVyKSB7CisgICAgY29uc3QgcmVuZGVyQ2FwYWJpbGl0eSA9ICgwLCBfcGRmanNMaWIuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgY29uc3QgcmVzdWx0ID0geworICAgICAgcHJvbWlzZTogcmVuZGVyQ2FwYWJpbGl0eS5wcm9taXNlLAorCisgICAgICBvblJlbmRlckNvbnRpbnVlKGNvbnQpIHsKKyAgICAgICAgY29udCgpOworICAgICAgfSwKKworICAgICAgY2FuY2VsKCkgeworICAgICAgICByZW5kZXJUYXNrLmNhbmNlbCgpOworICAgICAgfQorCisgICAgfTsKKyAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQ7CisgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CisgICAgdGhpcy5sMTBuLmdldCgicGFnZV9jYW52YXMiLCB7CisgICAgICBwYWdlOiB0aGlzLmlkCisgICAgfSwgIlBhZ2Uge3twYWdlfX0iKS50aGVuKG1zZyA9PiB7CisgICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgbXNnKTsKKyAgICB9KTsKKyAgICBjYW52YXMuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCAiaGlkZGVuIik7CisgICAgbGV0IGlzQ2FudmFzSGlkZGVuID0gdHJ1ZTsKKworICAgIGNvbnN0IHNob3dDYW52YXMgPSBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoaXNDYW52YXNIaWRkZW4pIHsKKyAgICAgICAgY2FudmFzLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIik7CisgICAgICAgIGlzQ2FudmFzSGlkZGVuID0gZmFsc2U7CisgICAgICB9CisgICAgfTsKKworICAgIGNhbnZhc1dyYXBwZXIuYXBwZW5kQ2hpbGQoY2FudmFzKTsKKyAgICB0aGlzLmNhbnZhcyA9IGNhbnZhczsKKyAgICBjYW52YXMubW96T3BhcXVlID0gdHJ1ZTsKKyAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CisgICAgICBhbHBoYTogZmFsc2UKKyAgICB9KTsKKyAgICBjb25zdCBvdXRwdXRTY2FsZSA9ICgwLCBfdWlfdXRpbHMuZ2V0T3V0cHV0U2NhbGUpKGN0eCk7CisgICAgdGhpcy5vdXRwdXRTY2FsZSA9IG91dHB1dFNjYWxlOworCisgICAgaWYgKHRoaXMudXNlT25seUNzc1pvb20pIHsKKyAgICAgIGNvbnN0IGFjdHVhbFNpemVWaWV3cG9ydCA9IHZpZXdwb3J0LmNsb25lKHsKKyAgICAgICAgc2NhbGU6IF91aV91dGlscy5DU1NfVU5JVFMKKyAgICAgIH0pOworICAgICAgb3V0cHV0U2NhbGUuc3ggKj0gYWN0dWFsU2l6ZVZpZXdwb3J0LndpZHRoIC8gdmlld3BvcnQud2lkdGg7CisgICAgICBvdXRwdXRTY2FsZS5zeSAqPSBhY3R1YWxTaXplVmlld3BvcnQuaGVpZ2h0IC8gdmlld3BvcnQuaGVpZ2h0OworICAgICAgb3V0cHV0U2NhbGUuc2NhbGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5tYXhDYW52YXNQaXhlbHMgPiAwKSB7CisgICAgICBjb25zdCBwaXhlbHNJblZpZXdwb3J0ID0gdmlld3BvcnQud2lkdGggKiB2aWV3cG9ydC5oZWlnaHQ7CisgICAgICBjb25zdCBtYXhTY2FsZSA9IE1hdGguc3FydCh0aGlzLm1heENhbnZhc1BpeGVscyAvIHBpeGVsc0luVmlld3BvcnQpOworCisgICAgICBpZiAob3V0cHV0U2NhbGUuc3ggPiBtYXhTY2FsZSB8fCBvdXRwdXRTY2FsZS5zeSA+IG1heFNjYWxlKSB7CisgICAgICAgIG91dHB1dFNjYWxlLnN4ID0gbWF4U2NhbGU7CisgICAgICAgIG91dHB1dFNjYWxlLnN5ID0gbWF4U2NhbGU7CisgICAgICAgIG91dHB1dFNjYWxlLnNjYWxlZCA9IHRydWU7CisgICAgICAgIHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5oYXNSZXN0cmljdGVkU2NhbGluZyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHNmeCA9ICgwLCBfdWlfdXRpbHMuYXBwcm94aW1hdGVGcmFjdGlvbikob3V0cHV0U2NhbGUuc3gpOworICAgIGNvbnN0IHNmeSA9ICgwLCBfdWlfdXRpbHMuYXBwcm94aW1hdGVGcmFjdGlvbikob3V0cHV0U2NhbGUuc3kpOworICAgIGNhbnZhcy53aWR0aCA9ICgwLCBfdWlfdXRpbHMucm91bmRUb0RpdmlkZSkodmlld3BvcnQud2lkdGggKiBvdXRwdXRTY2FsZS5zeCwgc2Z4WzBdKTsKKyAgICBjYW52YXMuaGVpZ2h0ID0gKDAsIF91aV91dGlscy5yb3VuZFRvRGl2aWRlKSh2aWV3cG9ydC5oZWlnaHQgKiBvdXRwdXRTY2FsZS5zeSwgc2Z5WzBdKTsKKyAgICBjYW52YXMuc3R5bGUud2lkdGggPSAoMCwgX3VpX3V0aWxzLnJvdW5kVG9EaXZpZGUpKHZpZXdwb3J0LndpZHRoLCBzZnhbMV0pICsgInB4IjsKKyAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gKDAsIF91aV91dGlscy5yb3VuZFRvRGl2aWRlKSh2aWV3cG9ydC5oZWlnaHQsIHNmeVsxXSkgKyAicHgiOworICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLnNldChjYW52YXMsIHZpZXdwb3J0KTsKKyAgICBjb25zdCB0cmFuc2Zvcm0gPSAhb3V0cHV0U2NhbGUuc2NhbGVkID8gbnVsbCA6IFtvdXRwdXRTY2FsZS5zeCwgMCwgMCwgb3V0cHV0U2NhbGUuc3ksIDAsIDBdOworICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7CisgICAgICBjYW52YXNDb250ZXh0OiBjdHgsCisgICAgICB0cmFuc2Zvcm0sCisgICAgICB2aWV3cG9ydDogdGhpcy52aWV3cG9ydCwKKyAgICAgIGVuYWJsZVdlYkdMOiB0aGlzLmVuYWJsZVdlYkdMLAorICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTogdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZQorICAgIH07CisgICAgY29uc3QgcmVuZGVyVGFzayA9IHRoaXMucGRmUGFnZS5yZW5kZXIocmVuZGVyQ29udGV4dCk7CisKKyAgICByZW5kZXJUYXNrLm9uQ29udGludWUgPSBmdW5jdGlvbiAoY29udCkgeworICAgICAgc2hvd0NhbnZhcygpOworCisgICAgICBpZiAocmVzdWx0Lm9uUmVuZGVyQ29udGludWUpIHsKKyAgICAgICAgcmVzdWx0Lm9uUmVuZGVyQ29udGludWUoY29udCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250KCk7CisgICAgICB9CisgICAgfTsKKworICAgIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgIHNob3dDYW52YXMoKTsKKyAgICAgIHJlbmRlckNhcGFiaWxpdHkucmVzb2x2ZSh1bmRlZmluZWQpOworICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgeworICAgICAgc2hvd0NhbnZhcygpOworICAgICAgcmVuZGVyQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwYWludE9uU3ZnKHdyYXBwZXIpIHsKKyAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7CisKKyAgICBjb25zdCBlbnN1cmVOb3RDYW5jZWxsZWQgPSAoKSA9PiB7CisgICAgICBpZiAoY2FuY2VsbGVkKSB7CisgICAgICAgIHRocm93IG5ldyBfcGRmanNMaWIuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKGBSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICR7dGhpcy5pZH1gLCAic3ZnIik7CisgICAgICB9CisgICAgfTsKKworICAgIGNvbnN0IHBkZlBhZ2UgPSB0aGlzLnBkZlBhZ2U7CisgICAgY29uc3QgYWN0dWFsU2l6ZVZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydC5jbG9uZSh7CisgICAgICBzY2FsZTogX3VpX3V0aWxzLkNTU19VTklUUworICAgIH0pOworICAgIGNvbnN0IHByb21pc2UgPSBwZGZQYWdlLmdldE9wZXJhdG9yTGlzdCgpLnRoZW4ob3BMaXN0ID0+IHsKKyAgICAgIGVuc3VyZU5vdENhbmNlbGxlZCgpOworICAgICAgY29uc3Qgc3ZnR2Z4ID0gbmV3IF9wZGZqc0xpYi5TVkdHcmFwaGljcyhwZGZQYWdlLmNvbW1vbk9ianMsIHBkZlBhZ2Uub2Jqcyk7CisgICAgICByZXR1cm4gc3ZnR2Z4LmdldFNWRyhvcExpc3QsIGFjdHVhbFNpemVWaWV3cG9ydCkudGhlbihzdmcgPT4geworICAgICAgICBlbnN1cmVOb3RDYW5jZWxsZWQoKTsKKyAgICAgICAgdGhpcy5zdmcgPSBzdmc7CisgICAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLnNldChzdmcsIGFjdHVhbFNpemVWaWV3cG9ydCk7CisgICAgICAgIHN2Zy5zdHlsZS53aWR0aCA9IHdyYXBwZXIuc3R5bGUud2lkdGg7CisgICAgICAgIHN2Zy5zdHlsZS5oZWlnaHQgPSB3cmFwcGVyLnN0eWxlLmhlaWdodDsKKyAgICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDsKKyAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChzdmcpOworICAgICAgfSk7CisgICAgfSk7CisgICAgcmV0dXJuIHsKKyAgICAgIHByb21pc2UsCisKKyAgICAgIG9uUmVuZGVyQ29udGludWUoY29udCkgeworICAgICAgICBjb250KCk7CisgICAgICB9LAorCisgICAgICBjYW5jZWwoKSB7CisgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7CisgICAgICB9CisKKyAgICB9OworICB9CisKKyAgc2V0UGFnZUxhYmVsKGxhYmVsKSB7CisgICAgdGhpcy5wYWdlTGFiZWwgPSB0eXBlb2YgbGFiZWwgPT09ICJzdHJpbmciID8gbGFiZWwgOiBudWxsOworCisgICAgaWYgKHRoaXMucGFnZUxhYmVsICE9PSBudWxsKSB7CisgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoImRhdGEtcGFnZS1sYWJlbCIsIHRoaXMucGFnZUxhYmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXBhZ2UtbGFiZWwiKTsKKyAgICB9CisgIH0KKworfQorCitleHBvcnRzLlBERlBhZ2VWaWV3ID0gUERGUGFnZVZpZXc7CisKKy8qKiovIH0pLAorLyogMTQgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZSZW5kZXJpbmdRdWV1ZSA9IGV4cG9ydHMuUmVuZGVyaW5nU3RhdGVzID0gdm9pZCAwOworY29uc3QgQ0xFQU5VUF9USU1FT1VUID0gMzAwMDA7Citjb25zdCBSZW5kZXJpbmdTdGF0ZXMgPSB7CisgIElOSVRJQUw6IDAsCisgIFJVTk5JTkc6IDEsCisgIFBBVVNFRDogMiwKKyAgRklOSVNIRUQ6IDMKK307CitleHBvcnRzLlJlbmRlcmluZ1N0YXRlcyA9IFJlbmRlcmluZ1N0YXRlczsKKworY2xhc3MgUERGUmVuZGVyaW5nUXVldWUgeworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLnBkZlZpZXdlciA9IG51bGw7CisgICAgdGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIgPSBudWxsOworICAgIHRoaXMub25JZGxlID0gbnVsbDsKKyAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSBudWxsOworICAgIHRoaXMuaWRsZVRpbWVvdXQgPSBudWxsOworICAgIHRoaXMucHJpbnRpbmcgPSBmYWxzZTsKKyAgICB0aGlzLmlzVGh1bWJuYWlsVmlld0VuYWJsZWQgPSBmYWxzZTsKKyAgfQorCisgIHNldFZpZXdlcihwZGZWaWV3ZXIpIHsKKyAgICB0aGlzLnBkZlZpZXdlciA9IHBkZlZpZXdlcjsKKyAgfQorCisgIHNldFRodW1ibmFpbFZpZXdlcihwZGZUaHVtYm5haWxWaWV3ZXIpIHsKKyAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlciA9IHBkZlRodW1ibmFpbFZpZXdlcjsKKyAgfQorCisgIGlzSGlnaGVzdFByaW9yaXR5KHZpZXcpIHsKKyAgICByZXR1cm4gdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID09PSB2aWV3LnJlbmRlcmluZ0lkOworICB9CisKKyAgcmVuZGVySGlnaGVzdFByaW9yaXR5KGN1cnJlbnRseVZpc2libGVQYWdlcykgeworICAgIGlmICh0aGlzLmlkbGVUaW1lb3V0KSB7CisgICAgICBjbGVhclRpbWVvdXQodGhpcy5pZGxlVGltZW91dCk7CisgICAgICB0aGlzLmlkbGVUaW1lb3V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBpZiAodGhpcy5wZGZWaWV3ZXIuZm9yY2VSZW5kZXJpbmcoY3VycmVudGx5VmlzaWJsZVBhZ2VzKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLnBkZlRodW1ibmFpbFZpZXdlciAmJiB0aGlzLmlzVGh1bWJuYWlsVmlld0VuYWJsZWQpIHsKKyAgICAgIGlmICh0aGlzLnBkZlRodW1ibmFpbFZpZXdlci5mb3JjZVJlbmRlcmluZygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy5wcmludGluZykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLm9uSWRsZSkgeworICAgICAgdGhpcy5pZGxlVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5vbklkbGUuYmluZCh0aGlzKSwgQ0xFQU5VUF9USU1FT1VUKTsKKyAgICB9CisgIH0KKworICBnZXRIaWdoZXN0UHJpb3JpdHkodmlzaWJsZSwgdmlld3MsIHNjcm9sbGVkRG93bikgeworICAgIGNvbnN0IHZpc2libGVWaWV3cyA9IHZpc2libGUudmlld3M7CisgICAgY29uc3QgbnVtVmlzaWJsZSA9IHZpc2libGVWaWV3cy5sZW5ndGg7CisKKyAgICBpZiAobnVtVmlzaWJsZSA9PT0gMCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WaXNpYmxlOyArK2kpIHsKKyAgICAgIGNvbnN0IHZpZXcgPSB2aXNpYmxlVmlld3NbaV0udmlldzsKKworICAgICAgaWYgKCF0aGlzLmlzVmlld0ZpbmlzaGVkKHZpZXcpKSB7CisgICAgICAgIHJldHVybiB2aWV3OworICAgICAgfQorICAgIH0KKworICAgIGlmIChzY3JvbGxlZERvd24pIHsKKyAgICAgIGNvbnN0IG5leHRQYWdlSW5kZXggPSB2aXNpYmxlLmxhc3QuaWQ7CisKKyAgICAgIGlmICh2aWV3c1tuZXh0UGFnZUluZGV4XSAmJiAhdGhpcy5pc1ZpZXdGaW5pc2hlZCh2aWV3c1tuZXh0UGFnZUluZGV4XSkpIHsKKyAgICAgICAgcmV0dXJuIHZpZXdzW25leHRQYWdlSW5kZXhdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBwcmV2aW91c1BhZ2VJbmRleCA9IHZpc2libGUuZmlyc3QuaWQgLSAyOworCisgICAgICBpZiAodmlld3NbcHJldmlvdXNQYWdlSW5kZXhdICYmICF0aGlzLmlzVmlld0ZpbmlzaGVkKHZpZXdzW3ByZXZpb3VzUGFnZUluZGV4XSkpIHsKKyAgICAgICAgcmV0dXJuIHZpZXdzW3ByZXZpb3VzUGFnZUluZGV4XTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGlzVmlld0ZpbmlzaGVkKHZpZXcpIHsKKyAgICByZXR1cm4gdmlldy5yZW5kZXJpbmdTdGF0ZSA9PT0gUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOworICB9CisKKyAgcmVuZGVyVmlldyh2aWV3KSB7CisgICAgc3dpdGNoICh2aWV3LnJlbmRlcmluZ1N0YXRlKSB7CisgICAgICBjYXNlIFJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBjYXNlIFJlbmRlcmluZ1N0YXRlcy5QQVVTRUQ6CisgICAgICAgIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9IHZpZXcucmVuZGVyaW5nSWQ7CisgICAgICAgIHZpZXcucmVzdW1lKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJlbmRlcmluZ1N0YXRlcy5SVU5OSU5HOgorICAgICAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSB2aWV3LnJlbmRlcmluZ0lkOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBSZW5kZXJpbmdTdGF0ZXMuSU5JVElBTDoKKyAgICAgICAgdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID0gdmlldy5yZW5kZXJpbmdJZDsKKyAgICAgICAgdmlldy5kcmF3KCkuZmluYWxseSgoKSA9PiB7CisgICAgICAgICAgdGhpcy5yZW5kZXJIaWdoZXN0UHJpb3JpdHkoKTsKKyAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKKyAgICAgICAgICBjb25zb2xlLmVycm9yKGByZW5kZXJWaWV3OiAiJHtyZWFzb259ImApOworICAgICAgICB9KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworfQorCitleHBvcnRzLlBERlJlbmRlcmluZ1F1ZXVlID0gUERGUmVuZGVyaW5nUXVldWU7CisKKy8qKiovIH0pLAorLyogMTUgKi8KKy8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHsKKworInVzZSBzdHJpY3QiOworCisKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKKyAgdmFsdWU6IHRydWUKK30pOworZXhwb3J0cy5QREZTaW5nbGVQYWdlVmlld2VyID0gdm9pZCAwOworCit2YXIgX2Jhc2Vfdmlld2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7CisKK3ZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCitjbGFzcyBQREZTaW5nbGVQYWdlVmlld2VyIGV4dGVuZHMgX2Jhc2Vfdmlld2VyLkJhc2VWaWV3ZXIgeworICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CisgICAgc3VwZXIob3B0aW9ucyk7CisKKyAgICB0aGlzLmV2ZW50QnVzLl9vbigicGFnZXNpbml0IiwgZXZ0ID0+IHsKKyAgICAgIHRoaXMuX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpOworICAgIH0pOworICB9CisKKyAgZ2V0IF92aWV3ZXJFbGVtZW50KCkgeworICAgIHJldHVybiAoMCwgX3BkZmpzTGliLnNoYWRvdykodGhpcywgIl92aWV3ZXJFbGVtZW50IiwgdGhpcy5fc2hhZG93Vmlld2VyKTsKKyAgfQorCisgIF9yZXNldFZpZXcoKSB7CisgICAgc3VwZXIuX3Jlc2V0VmlldygpOworCisgICAgdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyID0gMTsKKyAgICB0aGlzLl9zaGFkb3dWaWV3ZXIgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgdGhpcy5fdXBkYXRlU2Nyb2xsRG93biA9IG51bGw7CisgIH0KKworICBfZW5zdXJlUGFnZVZpZXdWaXNpYmxlKCkgeworICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSAxXTsKKyAgICBjb25zdCBwcmV2aW91c1BhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyIC0gMV07CisgICAgY29uc3Qgdmlld2VyTm9kZXMgPSB0aGlzLnZpZXdlci5jaGlsZE5vZGVzOworCisgICAgc3dpdGNoICh2aWV3ZXJOb2Rlcy5sZW5ndGgpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdGhpcy52aWV3ZXIuYXBwZW5kQ2hpbGQocGFnZVZpZXcuZGl2KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKHZpZXdlck5vZGVzWzBdICE9PSBwcmV2aW91c1BhZ2VWaWV3LmRpdikgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZTogVW5leHBlY3RlZCBwcmV2aW91c2x5IHZpc2libGUgcGFnZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWdlVmlldyA9PT0gcHJldmlvdXNQYWdlVmlldykgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fc2hhZG93Vmlld2VyLmFwcGVuZENoaWxkKHByZXZpb3VzUGFnZVZpZXcuZGl2KTsKKworICAgICAgICB0aGlzLnZpZXdlci5hcHBlbmRDaGlsZChwYWdlVmlldy5kaXYpOworICAgICAgICB0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AgPSAwOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJfZW5zdXJlUGFnZVZpZXdWaXNpYmxlOiBPbmx5IG9uZSBwYWdlIHNob3VsZCBiZSB2aXNpYmxlIGF0IGEgdGltZS4iKTsKKyAgICB9CisKKyAgICB0aGlzLl9wcmV2aW91c1BhZ2VOdW1iZXIgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKyAgfQorCisgIF9zY3JvbGxVcGRhdGUoKSB7CisgICAgaWYgKHRoaXMuX3VwZGF0ZVNjcm9sbERvd24pIHsKKyAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbERvd24oKTsKKyAgICB9CisKKyAgICBzdXBlci5fc2Nyb2xsVXBkYXRlKCk7CisgIH0KKworICBfc2Nyb2xsSW50b1ZpZXcoeworICAgIHBhZ2VEaXYsCisgICAgcGFnZVNwb3QgPSBudWxsLAorICAgIHBhZ2VOdW1iZXIgPSBudWxsCisgIH0pIHsKKyAgICBpZiAocGFnZU51bWJlcikgeworICAgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlcik7CisgICAgfQorCisgICAgY29uc3Qgc2Nyb2xsZWREb3duID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPj0gdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyOworCisgICAgdGhpcy5fZW5zdXJlUGFnZVZpZXdWaXNpYmxlKCk7CisKKyAgICB0aGlzLnVwZGF0ZSgpOworCisgICAgc3VwZXIuX3Njcm9sbEludG9WaWV3KHsKKyAgICAgIHBhZ2VEaXYsCisgICAgICBwYWdlU3BvdCwKKyAgICAgIHBhZ2VOdW1iZXIKKyAgICB9KTsKKworICAgIHRoaXMuX3VwZGF0ZVNjcm9sbERvd24gPSAoKSA9PiB7CisgICAgICB0aGlzLnNjcm9sbC5kb3duID0gc2Nyb2xsZWREb3duOworICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsRG93biA9IG51bGw7CisgICAgfTsKKyAgfQorCisgIF9nZXRWaXNpYmxlUGFnZXMoKSB7CisgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnRWaXNpYmxlUGFnZSgpOworICB9CisKKyAgX3VwZGF0ZUhlbHBlcih2aXNpYmxlUGFnZXMpIHt9CisKKyAgZ2V0IF9pc1Njcm9sbE1vZGVIb3Jpem9udGFsKCkgeworICAgIHJldHVybiAoMCwgX3BkZmpzTGliLnNoYWRvdykodGhpcywgIl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsIiwgZmFsc2UpOworICB9CisKKyAgX3VwZGF0ZVNjcm9sbE1vZGUoKSB7fQorCisgIF91cGRhdGVTcHJlYWRNb2RlKCkge30KKworfQorCitleHBvcnRzLlBERlNpbmdsZVBhZ2VWaWV3ZXIgPSBQREZTaW5nbGVQYWdlVmlld2VyOworCisvKioqLyB9KSwKKy8qIDE2ICovCisvKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7CisKKyJ1c2Ugc3RyaWN0IjsKKworCitPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CisgIHZhbHVlOiB0cnVlCit9KTsKK2V4cG9ydHMuQmFzZVZpZXdlciA9IHZvaWQgMDsKKwordmFyIF91aV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CisKK3ZhciBfcGRmX3JlbmRlcmluZ19xdWV1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOworCit2YXIgX2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7CisKK3ZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOworCit2YXIgX3BkZl9wYWdlX3ZpZXcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKKwordmFyIF9wZGZfbGlua19zZXJ2aWNlID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKKwordmFyIF90ZXh0X2xheWVyX2J1aWxkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOworCitjb25zdCBERUZBVUxUX0NBQ0hFX1NJWkUgPSAxMDsKKworZnVuY3Rpb24gUERGUGFnZVZpZXdCdWZmZXIoc2l6ZSkgeworICBjb25zdCBkYXRhID0gW107CisKKyAgdGhpcy5wdXNoID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgICBjb25zdCBpID0gZGF0YS5pbmRleE9mKHZpZXcpOworCisgICAgaWYgKGkgPj0gMCkgeworICAgICAgZGF0YS5zcGxpY2UoaSwgMSk7CisgICAgfQorCisgICAgZGF0YS5wdXNoKHZpZXcpOworCisgICAgaWYgKGRhdGEubGVuZ3RoID4gc2l6ZSkgeworICAgICAgZGF0YS5zaGlmdCgpLmRlc3Ryb3koKTsKKyAgICB9CisgIH07CisKKyAgdGhpcy5yZXNpemUgPSBmdW5jdGlvbiAobmV3U2l6ZSwgcGFnZXNUb0tlZXApIHsKKyAgICBzaXplID0gbmV3U2l6ZTsKKworICAgIGlmIChwYWdlc1RvS2VlcCkgeworICAgICAgY29uc3QgcGFnZUlkc1RvS2VlcCA9IG5ldyBTZXQoKTsKKworICAgICAgZm9yIChsZXQgaSA9IDAsIGlNYXggPSBwYWdlc1RvS2VlcC5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHsKKyAgICAgICAgcGFnZUlkc1RvS2VlcC5hZGQocGFnZXNUb0tlZXBbaV0uaWQpOworICAgICAgfQorCisgICAgICAoMCwgX3VpX3V0aWxzLm1vdmVUb0VuZE9mQXJyYXkpKGRhdGEsIGZ1bmN0aW9uIChwYWdlKSB7CisgICAgICAgIHJldHVybiBwYWdlSWRzVG9LZWVwLmhhcyhwYWdlLmlkKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHdoaWxlIChkYXRhLmxlbmd0aCA+IHNpemUpIHsKKyAgICAgIGRhdGEuc2hpZnQoKS5kZXN0cm95KCk7CisgICAgfQorICB9OworfQorCitmdW5jdGlvbiBpc1NhbWVTY2FsZShvbGRTY2FsZSwgbmV3U2NhbGUpIHsKKyAgaWYgKG5ld1NjYWxlID09PSBvbGRTY2FsZSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKE1hdGguYWJzKG5ld1NjYWxlIC0gb2xkU2NhbGUpIDwgMWUtMTUpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgQmFzZVZpZXdlciB7CisgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKKyAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVZpZXdlcikgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlVmlld2VyLiIpOworICAgIH0KKworICAgIHRoaXMuX25hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjsKKyAgICB0aGlzLnZpZXdlciA9IG9wdGlvbnMudmlld2VyIHx8IG9wdGlvbnMuY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkOworCisgICAgaWYgKCEodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRGl2RWxlbWVudCAmJiB0aGlzLnZpZXdlciBpbnN0YW5jZW9mIEhUTUxEaXZFbGVtZW50KSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGBjb250YWluZXJgIGFuZC9vciBgdmlld2VyYCBvcHRpb24uIik7CisgICAgfQorCisgICAgdGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7CisgICAgdGhpcy5saW5rU2VydmljZSA9IG9wdGlvbnMubGlua1NlcnZpY2UgfHwgbmV3IF9wZGZfbGlua19zZXJ2aWNlLlNpbXBsZUxpbmtTZXJ2aWNlKCk7CisgICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBvcHRpb25zLmRvd25sb2FkTWFuYWdlciB8fCBudWxsOworICAgIHRoaXMuZmluZENvbnRyb2xsZXIgPSBvcHRpb25zLmZpbmRDb250cm9sbGVyIHx8IG51bGw7CisgICAgdGhpcy5yZW1vdmVQYWdlQm9yZGVycyA9IG9wdGlvbnMucmVtb3ZlUGFnZUJvcmRlcnMgfHwgZmFsc2U7CisgICAgdGhpcy50ZXh0TGF5ZXJNb2RlID0gTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLnRleHRMYXllck1vZGUpID8gb3B0aW9ucy50ZXh0TGF5ZXJNb2RlIDogX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRU5BQkxFOworICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gb3B0aW9ucy5pbWFnZVJlc291cmNlc1BhdGggfHwgIiI7CisgICAgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gdHlwZW9mIG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9PT0gImJvb2xlYW4iID8gb3B0aW9ucy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIDogdHJ1ZTsKKyAgICB0aGlzLmVuYWJsZVByaW50QXV0b1JvdGF0ZSA9IG9wdGlvbnMuZW5hYmxlUHJpbnRBdXRvUm90YXRlIHx8IGZhbHNlOworICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zLnJlbmRlcmVyIHx8IF91aV91dGlscy5SZW5kZXJlclR5cGUuQ0FOVkFTOworICAgIHRoaXMuZW5hYmxlV2ViR0wgPSBvcHRpb25zLmVuYWJsZVdlYkdMIHx8IGZhbHNlOworICAgIHRoaXMudXNlT25seUNzc1pvb20gPSBvcHRpb25zLnVzZU9ubHlDc3Nab29tIHx8IGZhbHNlOworICAgIHRoaXMubWF4Q2FudmFzUGl4ZWxzID0gb3B0aW9ucy5tYXhDYW52YXNQaXhlbHM7CisgICAgdGhpcy5sMTBuID0gb3B0aW9ucy5sMTBuIHx8IF91aV91dGlscy5OdWxsTDEwbjsKKyAgICB0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSA9ICFvcHRpb25zLnJlbmRlcmluZ1F1ZXVlOworCisgICAgaWYgKHRoaXMuZGVmYXVsdFJlbmRlcmluZ1F1ZXVlKSB7CisgICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gbmV3IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlBERlJlbmRlcmluZ1F1ZXVlKCk7CisgICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlLnNldFZpZXdlcih0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZSA9IG9wdGlvbnMucmVuZGVyaW5nUXVldWU7CisgICAgfQorCisgICAgdGhpcy5zY3JvbGwgPSAoMCwgX3VpX3V0aWxzLndhdGNoU2Nyb2xsKSh0aGlzLmNvbnRhaW5lciwgdGhpcy5fc2Nyb2xsVXBkYXRlLmJpbmQodGhpcykpOworICAgIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID0gX3VpX3V0aWxzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZS5VTktOT1dOOworICAgIHRoaXMuX29uQmVmb3JlRHJhdyA9IHRoaXMuX29uQWZ0ZXJEcmF3ID0gbnVsbDsKKworICAgIHRoaXMuX3Jlc2V0VmlldygpOworCisgICAgaWYgKHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMpIHsKKyAgICAgIHRoaXMudmlld2VyLmNsYXNzTGlzdC5hZGQoInJlbW92ZVBhZ2VCb3JkZXJzIik7CisgICAgfQorCisgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJiYXNldmlld2VyaW5pdCIsIHsKKyAgICAgICAgc291cmNlOiB0aGlzCisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorCisgIGdldCBwYWdlc0NvdW50KCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlcy5sZW5ndGg7CisgIH0KKworICBnZXRQYWdlVmlldyhpbmRleCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlc1tpbmRleF07CisgIH0KKworICBnZXQgcGFnZVZpZXdzUmVhZHkoKSB7CisgICAgaWYgKCF0aGlzLl9wYWdlc0NhcGFiaWxpdHkuc2V0dGxlZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0aGlzLl9wYWdlcy5ldmVyeShmdW5jdGlvbiAocGFnZVZpZXcpIHsKKyAgICAgIHJldHVybiBwYWdlVmlldyAmJiBwYWdlVmlldy5wZGZQYWdlOworICAgIH0pOworICB9CisKKyAgZ2V0IGN1cnJlbnRQYWdlTnVtYmVyKCkgeworICAgIHJldHVybiB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKyAgfQorCisgIHNldCBjdXJyZW50UGFnZU51bWJlcih2YWwpIHsKKyAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsKSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhZ2UgbnVtYmVyLiIpOworICAgIH0KKworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIodmFsLCB0cnVlKSkgeworICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLl9uYW1lfS5jdXJyZW50UGFnZU51bWJlcjogIiR7dmFsfSIgaXMgbm90IGEgdmFsaWQgcGFnZS5gKTsKKyAgICB9CisgIH0KKworICBfc2V0Q3VycmVudFBhZ2VOdW1iZXIodmFsLCByZXNldEN1cnJlbnRQYWdlVmlldyA9IGZhbHNlKSB7CisgICAgaWYgKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID09PSB2YWwpIHsKKyAgICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykgeworICAgICAgICB0aGlzLl9yZXNldEN1cnJlbnRQYWdlVmlldygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoISgwIDwgdmFsICYmIHZhbCA8PSB0aGlzLnBhZ2VzQ291bnQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSB2YWw7CisgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgicGFnZWNoYW5naW5nIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZU51bWJlcjogdmFsLAorICAgICAgcGFnZUxhYmVsOiB0aGlzLl9wYWdlTGFiZWxzICYmIHRoaXMuX3BhZ2VMYWJlbHNbdmFsIC0gMV0KKyAgICB9KTsKKworICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykgeworICAgICAgdGhpcy5fcmVzZXRDdXJyZW50UGFnZVZpZXcoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGdldCBjdXJyZW50UGFnZUxhYmVsKCkgeworICAgIHJldHVybiB0aGlzLl9wYWdlTGFiZWxzICYmIHRoaXMuX3BhZ2VMYWJlbHNbdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSAxXTsKKyAgfQorCisgIHNldCBjdXJyZW50UGFnZUxhYmVsKHZhbCkgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxldCBwYWdlID0gdmFsIHwgMDsKKworICAgIGlmICh0aGlzLl9wYWdlTGFiZWxzKSB7CisgICAgICBjb25zdCBpID0gdGhpcy5fcGFnZUxhYmVscy5pbmRleE9mKHZhbCk7CisKKyAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgcGFnZSA9IGkgKyAxOworICAgICAgfQorICAgIH0KKworICAgIGlmICghdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZSwgdHJ1ZSkpIHsKKyAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbmFtZX0uY3VycmVudFBhZ2VMYWJlbDogIiR7dmFsfSIgaXMgbm90IGEgdmFsaWQgcGFnZS5gKTsKKyAgICB9CisgIH0KKworICBnZXQgY3VycmVudFNjYWxlKCkgeworICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2NhbGUgIT09IF91aV91dGlscy5VTktOT1dOX1NDQUxFID8gdGhpcy5fY3VycmVudFNjYWxlIDogX3VpX3V0aWxzLkRFRkFVTFRfU0NBTEU7CisgIH0KKworICBzZXQgY3VycmVudFNjYWxlKHZhbCkgeworICAgIGlmIChpc05hTih2YWwpKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbnVtZXJpYyBzY2FsZS4iKTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLl9zZXRTY2FsZSh2YWwsIGZhbHNlKTsKKyAgfQorCisgIGdldCBjdXJyZW50U2NhbGVWYWx1ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fY3VycmVudFNjYWxlVmFsdWU7CisgIH0KKworICBzZXQgY3VycmVudFNjYWxlVmFsdWUodmFsKSB7CisgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fc2V0U2NhbGUodmFsLCBmYWxzZSk7CisgIH0KKworICBnZXQgcGFnZXNSb3RhdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5fcGFnZXNSb3RhdGlvbjsKKyAgfQorCisgIHNldCBwYWdlc1JvdGF0aW9uKHJvdGF0aW9uKSB7CisgICAgaWYgKCEoMCwgX3VpX3V0aWxzLmlzVmFsaWRSb3RhdGlvbikocm90YXRpb24pKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcGFnZXMgcm90YXRpb24gYW5nbGUuIik7CisgICAgfQorCisgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX3BhZ2VzUm90YXRpb24gPT09IHJvdGF0aW9uKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IHJvdGF0aW9uOworICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjsKKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbaV07CisgICAgICBwYWdlVmlldy51cGRhdGUocGFnZVZpZXcuc2NhbGUsIHJvdGF0aW9uKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5fY3VycmVudFNjYWxlVmFsdWUpIHsKKyAgICAgIHRoaXMuX3NldFNjYWxlKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJyb3RhdGlvbmNoYW5naW5nIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgcGFnZXNSb3RhdGlvbjogcm90YXRpb24sCisgICAgICBwYWdlTnVtYmVyCisgICAgfSk7CisKKyAgICBpZiAodGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHsKKyAgICAgIHRoaXMudXBkYXRlKCk7CisgICAgfQorICB9CisKKyAgZ2V0IGZpcnN0UGFnZVByb21pc2UoKSB7CisgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UgOiBudWxsOworICB9CisKKyAgZ2V0IG9uZVBhZ2VSZW5kZXJlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHkucHJvbWlzZSA6IG51bGw7CisgIH0KKworICBnZXQgcGFnZXNQcm9taXNlKCkgeworICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5fcGFnZXNDYXBhYmlsaXR5LnByb21pc2UgOiBudWxsOworICB9CisKKyAgZ2V0IF92aWV3ZXJFbGVtZW50KCkgeworICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBfdmlld2VyRWxlbWVudCIpOworICB9CisKKyAgX29uZVBhZ2VSZW5kZXJlZE9yRm9yY2VGZXRjaCgpIHsKKyAgICBpZiAoIXRoaXMuY29udGFpbmVyLm9mZnNldFBhcmVudCB8fCB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKS52aWV3cy5sZW5ndGggPT09IDApIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5wcm9taXNlOworICB9CisKKyAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHsKKyAgICBpZiAodGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgdGhpcy5fY2FuY2VsUmVuZGVyaW5nKCk7CisKKyAgICAgIHRoaXMuX3Jlc2V0VmlldygpOworCisgICAgICBpZiAodGhpcy5maW5kQ29udHJvbGxlcikgeworICAgICAgICB0aGlzLmZpbmRDb250cm9sbGVyLnNldERvY3VtZW50KG51bGwpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDsKKworICAgIGlmICghcGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBwYWdlc0NvdW50ID0gcGRmRG9jdW1lbnQubnVtUGFnZXM7CisgICAgY29uc3QgZmlyc3RQYWdlUHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldFBhZ2UoMSk7CisgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSBwZGZEb2N1bWVudC5hbm5vdGF0aW9uU3RvcmFnZTsKKyAgICBjb25zdCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7CisKKyAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHsKKyAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInBhZ2VzbG9hZGVkIiwgeworICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgIHBhZ2VzQ291bnQKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdGhpcy5fb25CZWZvcmVEcmF3ID0gZXZ0ID0+IHsKKyAgICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbZXZ0LnBhZ2VOdW1iZXIgLSAxXTsKKworICAgICAgaWYgKCFwYWdlVmlldykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX2J1ZmZlci5wdXNoKHBhZ2VWaWV3KTsKKyAgICB9OworCisgICAgdGhpcy5ldmVudEJ1cy5fb24oInBhZ2VyZW5kZXIiLCB0aGlzLl9vbkJlZm9yZURyYXcpOworCisgICAgdGhpcy5fb25BZnRlckRyYXcgPSBldnQgPT4geworICAgICAgaWYgKGV2dC5jc3NUcmFuc2Zvcm0gfHwgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5zZXR0bGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgIHRoaXMuZXZlbnRCdXMuX29mZigicGFnZXJlbmRlcmVkIiwgdGhpcy5fb25BZnRlckRyYXcpOworCisgICAgICB0aGlzLl9vbkFmdGVyRHJhdyA9IG51bGw7CisgICAgfTsKKworICAgIHRoaXMuZXZlbnRCdXMuX29uKCJwYWdlcmVuZGVyZWQiLCB0aGlzLl9vbkFmdGVyRHJhdyk7CisKKyAgICBmaXJzdFBhZ2VQcm9taXNlLnRoZW4oZmlyc3RQZGZQYWdlID0+IHsKKyAgICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucmVzb2x2ZShmaXJzdFBkZlBhZ2UpOworCisgICAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTsKKyAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5jdXJyZW50U2NhbGU7CisgICAgICBjb25zdCB2aWV3cG9ydCA9IGZpcnN0UGRmUGFnZS5nZXRWaWV3cG9ydCh7CisgICAgICAgIHNjYWxlOiBzY2FsZSAqIF91aV91dGlscy5DU1NfVU5JVFMKKyAgICAgIH0pOworICAgICAgY29uc3QgdGV4dExheWVyRmFjdG9yeSA9IHRoaXMudGV4dExheWVyTW9kZSAhPT0gX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRElTQUJMRSA/IHRoaXMgOiBudWxsOworCisgICAgICBmb3IgKGxldCBwYWdlTnVtID0gMTsgcGFnZU51bSA8PSBwYWdlc0NvdW50OyArK3BhZ2VOdW0pIHsKKyAgICAgICAgY29uc3QgcGFnZVZpZXcgPSBuZXcgX3BkZl9wYWdlX3ZpZXcuUERGUGFnZVZpZXcoeworICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5fdmlld2VyRWxlbWVudCwKKyAgICAgICAgICBldmVudEJ1czogdGhpcy5ldmVudEJ1cywKKyAgICAgICAgICBpZDogcGFnZU51bSwKKyAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICBkZWZhdWx0Vmlld3BvcnQ6IHZpZXdwb3J0LmNsb25lKCksCisgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2UsCisgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSwKKyAgICAgICAgICByZW5kZXJpbmdRdWV1ZTogdGhpcy5yZW5kZXJpbmdRdWV1ZSwKKyAgICAgICAgICB0ZXh0TGF5ZXJGYWN0b3J5LAorICAgICAgICAgIHRleHRMYXllck1vZGU6IHRoaXMudGV4dExheWVyTW9kZSwKKyAgICAgICAgICBhbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OiB0aGlzLAorICAgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogdGhpcy5pbWFnZVJlc291cmNlc1BhdGgsCisgICAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLAorICAgICAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLAorICAgICAgICAgIGVuYWJsZVdlYkdMOiB0aGlzLmVuYWJsZVdlYkdMLAorICAgICAgICAgIHVzZU9ubHlDc3Nab29tOiB0aGlzLnVzZU9ubHlDc3Nab29tLAorICAgICAgICAgIG1heENhbnZhc1BpeGVsczogdGhpcy5tYXhDYW52YXNQaXhlbHMsCisgICAgICAgICAgbDEwbjogdGhpcy5sMTBuCisgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX3BhZ2VzLnB1c2gocGFnZVZpZXcpOworICAgICAgfQorCisgICAgICBjb25zdCBmaXJzdFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbMF07CisKKyAgICAgIGlmIChmaXJzdFBhZ2VWaWV3KSB7CisgICAgICAgIGZpcnN0UGFnZVZpZXcuc2V0UGRmUGFnZShmaXJzdFBkZlBhZ2UpOworICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmNhY2hlUGFnZVJlZigxLCBmaXJzdFBkZlBhZ2UucmVmKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuX3NwcmVhZE1vZGUgIT09IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkUpIHsKKyAgICAgICAgdGhpcy5fdXBkYXRlU3ByZWFkTW9kZSgpOworICAgICAgfQorCisgICAgICB0aGlzLl9vbmVQYWdlUmVuZGVyZWRPckZvcmNlRmV0Y2goKS50aGVuKCgpID0+IHsKKyAgICAgICAgaWYgKHRoaXMuZmluZENvbnRyb2xsZXIpIHsKKyAgICAgICAgICB0aGlzLmZpbmRDb250cm9sbGVyLnNldERvY3VtZW50KHBkZkRvY3VtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwZGZEb2N1bWVudC5sb2FkaW5nUGFyYW1zLmRpc2FibGVBdXRvRmV0Y2ggfHwgcGFnZXNDb3VudCA+IDc1MDApIHsKKyAgICAgICAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbGV0IGdldFBhZ2VzTGVmdCA9IHBhZ2VzQ291bnQgLSAxOworCisgICAgICAgIGlmIChnZXRQYWdlc0xlZnQgPD0gMCkgeworICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGxldCBwYWdlTnVtID0gMjsgcGFnZU51bSA8PSBwYWdlc0NvdW50OyArK3BhZ2VOdW0pIHsKKyAgICAgICAgICBwZGZEb2N1bWVudC5nZXRQYWdlKHBhZ2VOdW0pLnRoZW4ocGRmUGFnZSA9PiB7CisgICAgICAgICAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3BhZ2VOdW0gLSAxXTsKKworICAgICAgICAgICAgaWYgKCFwYWdlVmlldy5wZGZQYWdlKSB7CisgICAgICAgICAgICAgIHBhZ2VWaWV3LnNldFBkZlBhZ2UocGRmUGFnZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuY2FjaGVQYWdlUmVmKHBhZ2VOdW0sIHBkZlBhZ2UucmVmKTsKKworICAgICAgICAgICAgaWYgKC0tZ2V0UGFnZXNMZWZ0ID09PSAwKSB7CisgICAgICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgcmVhc29uID0+IHsKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBnZXQgcGFnZSAke3BhZ2VOdW19IHRvIGluaXRpYWxpemUgdmlld2VyYCwgcmVhc29uKTsKKworICAgICAgICAgICAgaWYgKC0tZ2V0UGFnZXNMZWZ0ID09PSAwKSB7CisgICAgICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJwYWdlc2luaXQiLCB7CisgICAgICAgIHNvdXJjZTogdGhpcworICAgICAgfSk7CisKKyAgICAgIGlmICh0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSkgeworICAgICAgICB0aGlzLnVwZGF0ZSgpOworICAgICAgfQorICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSB2aWV3ZXIiLCByZWFzb24pOworICAgIH0pOworICB9CisKKyAgc2V0UGFnZUxhYmVscyhsYWJlbHMpIHsKKyAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWxhYmVscykgeworICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7CisgICAgfSBlbHNlIGlmICghKEFycmF5LmlzQXJyYXkobGFiZWxzKSAmJiB0aGlzLnBkZkRvY3VtZW50Lm51bVBhZ2VzID09PSBsYWJlbHMubGVuZ3RoKSkgeworICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7CisgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX25hbWV9LnNldFBhZ2VMYWJlbHM6IEludmFsaWQgcGFnZSBsYWJlbHMuYCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBsYWJlbHM7CisgICAgfQorCisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1tpXTsKKyAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fcGFnZUxhYmVscyAmJiB0aGlzLl9wYWdlTGFiZWxzW2ldOworICAgICAgcGFnZVZpZXcuc2V0UGFnZUxhYmVsKGxhYmVsKTsKKyAgICB9CisgIH0KKworICBfcmVzZXRWaWV3KCkgeworICAgIHRoaXMuX3BhZ2VzID0gW107CisgICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSAxOworICAgIHRoaXMuX2N1cnJlbnRTY2FsZSA9IF91aV91dGlscy5VTktOT1dOX1NDQUxFOworICAgIHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlID0gbnVsbDsKKyAgICB0aGlzLl9wYWdlTGFiZWxzID0gbnVsbDsKKyAgICB0aGlzLl9idWZmZXIgPSBuZXcgUERGUGFnZVZpZXdCdWZmZXIoREVGQVVMVF9DQUNIRV9TSVpFKTsKKyAgICB0aGlzLl9sb2NhdGlvbiA9IG51bGw7CisgICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IDA7CisgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGw7CisgICAgdGhpcy5fcGFnZXNSZXF1ZXN0cyA9IG5ldyBXZWFrTWFwKCk7CisgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eSA9ICgwLCBfcGRmanNMaWIuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eSA9ICgwLCBfcGRmanNMaWIuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7CisgICAgdGhpcy5fcGFnZXNDYXBhYmlsaXR5ID0gKDAsIF9wZGZqc0xpYi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTsKKyAgICB0aGlzLl9zY3JvbGxNb2RlID0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuVkVSVElDQUw7CisgICAgdGhpcy5fc3ByZWFkTW9kZSA9IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkU7CisKKyAgICBpZiAodGhpcy5fb25CZWZvcmVEcmF3KSB7CisgICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoInBhZ2VyZW5kZXIiLCB0aGlzLl9vbkJlZm9yZURyYXcpOworCisgICAgICB0aGlzLl9vbkJlZm9yZURyYXcgPSBudWxsOworICAgIH0KKworICAgIGlmICh0aGlzLl9vbkFmdGVyRHJhdykgeworICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKCJwYWdlcmVuZGVyZWQiLCB0aGlzLl9vbkFmdGVyRHJhdyk7CisKKyAgICAgIHRoaXMuX29uQWZ0ZXJEcmF3ID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLnZpZXdlci50ZXh0Q29udGVudCA9ICIiOworCisgICAgdGhpcy5fdXBkYXRlU2Nyb2xsTW9kZSgpOworICB9CisKKyAgX3Njcm9sbFVwZGF0ZSgpIHsKKyAgICBpZiAodGhpcy5wYWdlc0NvdW50ID09PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy51cGRhdGUoKTsKKyAgfQorCisgIF9zY3JvbGxJbnRvVmlldyh7CisgICAgcGFnZURpdiwKKyAgICBwYWdlU3BvdCA9IG51bGwsCisgICAgcGFnZU51bWJlciA9IG51bGwKKyAgfSkgeworICAgICgwLCBfdWlfdXRpbHMuc2Nyb2xsSW50b1ZpZXcpKHBhZ2VEaXYsIHBhZ2VTcG90KTsKKyAgfQorCisgIF9zZXRTY2FsZVVwZGF0ZVBhZ2VzKG5ld1NjYWxlLCBuZXdWYWx1ZSwgbm9TY3JvbGwgPSBmYWxzZSwgcHJlc2V0ID0gZmFsc2UpIHsKKyAgICB0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSA9IG5ld1ZhbHVlLnRvU3RyaW5nKCk7CisKKyAgICBpZiAoaXNTYW1lU2NhbGUodGhpcy5fY3VycmVudFNjYWxlLCBuZXdTY2FsZSkpIHsKKyAgICAgIGlmIChwcmVzZXQpIHsKKyAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaCgic2NhbGVjaGFuZ2luZyIsIHsKKyAgICAgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICAgICAgc2NhbGU6IG5ld1NjYWxlLAorICAgICAgICAgIHByZXNldFZhbHVlOiBuZXdWYWx1ZQorICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHRoaXMuX3BhZ2VzW2ldLnVwZGF0ZShuZXdTY2FsZSk7CisgICAgfQorCisgICAgdGhpcy5fY3VycmVudFNjYWxlID0gbmV3U2NhbGU7CisKKyAgICBpZiAoIW5vU2Nyb2xsKSB7CisgICAgICBsZXQgcGFnZSA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyLAorICAgICAgICAgIGRlc3Q7CisKKyAgICAgIGlmICh0aGlzLl9sb2NhdGlvbiAmJiAhKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgdGhpcy5pc0NoYW5naW5nUHJlc2VudGF0aW9uTW9kZSkpIHsKKyAgICAgICAgcGFnZSA9IHRoaXMuX2xvY2F0aW9uLnBhZ2VOdW1iZXI7CisgICAgICAgIGRlc3QgPSBbbnVsbCwgeworICAgICAgICAgIG5hbWU6ICJYWVoiCisgICAgICAgIH0sIHRoaXMuX2xvY2F0aW9uLmxlZnQsIHRoaXMuX2xvY2F0aW9uLnRvcCwgbnVsbF07CisgICAgICB9CisKKyAgICAgIHRoaXMuc2Nyb2xsUGFnZUludG9WaWV3KHsKKyAgICAgICAgcGFnZU51bWJlcjogcGFnZSwKKyAgICAgICAgZGVzdEFycmF5OiBkZXN0LAorICAgICAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0OiB0cnVlCisgICAgICB9KTsKKyAgICB9CisKKyAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKCJzY2FsZWNoYW5naW5nIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgc2NhbGU6IG5ld1NjYWxlLAorICAgICAgcHJlc2V0VmFsdWU6IHByZXNldCA/IG5ld1ZhbHVlIDogdW5kZWZpbmVkCisgICAgfSk7CisKKyAgICBpZiAodGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHsKKyAgICAgIHRoaXMudXBkYXRlKCk7CisgICAgfQorICB9CisKKyAgX3NldFNjYWxlKHZhbHVlLCBub1Njcm9sbCA9IGZhbHNlKSB7CisgICAgbGV0IHNjYWxlID0gcGFyc2VGbG9hdCh2YWx1ZSk7CisKKyAgICBpZiAoc2NhbGUgPiAwKSB7CisgICAgICB0aGlzLl9zZXRTY2FsZVVwZGF0ZVBhZ2VzKHNjYWxlLCB2YWx1ZSwgbm9TY3JvbGwsIGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSB0aGlzLl9wYWdlc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdOworCisgICAgICBpZiAoIWN1cnJlbnRQYWdlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY29uc3Qgbm9QYWRkaW5nID0gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSB8fCB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzOworICAgICAgbGV0IGhQYWRkaW5nID0gbm9QYWRkaW5nID8gMCA6IF91aV91dGlscy5TQ1JPTExCQVJfUEFERElORzsKKyAgICAgIGxldCB2UGFkZGluZyA9IG5vUGFkZGluZyA/IDAgOiBfdWlfdXRpbHMuVkVSVElDQUxfUEFERElORzsKKworICAgICAgaWYgKCFub1BhZGRpbmcgJiYgdGhpcy5faXNTY3JvbGxNb2RlSG9yaXpvbnRhbCkgeworICAgICAgICBbaFBhZGRpbmcsIHZQYWRkaW5nXSA9IFt2UGFkZGluZywgaFBhZGRpbmddOworICAgICAgfQorCisgICAgICBjb25zdCBwYWdlV2lkdGhTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCAtIGhQYWRkaW5nKSAvIGN1cnJlbnRQYWdlLndpZHRoICogY3VycmVudFBhZ2Uuc2NhbGU7CisgICAgICBjb25zdCBwYWdlSGVpZ2h0U2NhbGUgPSAodGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdlBhZGRpbmcpIC8gY3VycmVudFBhZ2UuaGVpZ2h0ICogY3VycmVudFBhZ2Uuc2NhbGU7CisKKyAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgY2FzZSAicGFnZS1hY3R1YWwiOgorICAgICAgICAgIHNjYWxlID0gMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJwYWdlLXdpZHRoIjoKKyAgICAgICAgICBzY2FsZSA9IHBhZ2VXaWR0aFNjYWxlOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInBhZ2UtaGVpZ2h0IjoKKyAgICAgICAgICBzY2FsZSA9IHBhZ2VIZWlnaHRTY2FsZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJwYWdlLWZpdCI6CisgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihwYWdlV2lkdGhTY2FsZSwgcGFnZUhlaWdodFNjYWxlKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJhdXRvIjoKKyAgICAgICAgICBjb25zdCBob3Jpem9udGFsU2NhbGUgPSAoMCwgX3VpX3V0aWxzLmlzUG9ydHJhaXRPcmllbnRhdGlvbikoY3VycmVudFBhZ2UpID8gcGFnZVdpZHRoU2NhbGUgOiBNYXRoLm1pbihwYWdlSGVpZ2h0U2NhbGUsIHBhZ2VXaWR0aFNjYWxlKTsKKyAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKF91aV91dGlscy5NQVhfQVVUT19TQ0FMRSwgaG9yaXpvbnRhbFNjYWxlKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbmFtZX0uX3NldFNjYWxlOiAiJHt2YWx1ZX0iIGlzIGFuIHVua25vd24gem9vbSB2YWx1ZS5gKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMuX3NldFNjYWxlVXBkYXRlUGFnZXMoc2NhbGUsIHZhbHVlLCBub1Njcm9sbCwgdHJ1ZSk7CisgICAgfQorICB9CisKKyAgX3Jlc2V0Q3VycmVudFBhZ2VWaWV3KCkgeworICAgIGlmICh0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICB0aGlzLl9zZXRTY2FsZSh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdOworCisgICAgdGhpcy5fc2Nyb2xsSW50b1ZpZXcoeworICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2CisgICAgfSk7CisgIH0KKworICBzY3JvbGxQYWdlSW50b1ZpZXcoeworICAgIHBhZ2VOdW1iZXIsCisgICAgZGVzdEFycmF5ID0gbnVsbCwKKyAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0ID0gZmFsc2UsCisgICAgaWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2UKKyAgfSkgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHBhZ2VWaWV3ID0gTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSAmJiB0aGlzLl9wYWdlc1twYWdlTnVtYmVyIC0gMV07CisKKyAgICBpZiAoIXBhZ2VWaWV3KSB7CisgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX25hbWV9LnNjcm9sbFBhZ2VJbnRvVmlldzogYCArIGAiJHtwYWdlTnVtYmVyfSIgaXMgbm90IGEgdmFsaWQgcGFnZU51bWJlciBwYXJhbWV0ZXIuYCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgIWRlc3RBcnJheSkgeworICAgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlciwgdHJ1ZSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZXQgeCA9IDAsCisgICAgICAgIHkgPSAwOworICAgIGxldCB3aWR0aCA9IDAsCisgICAgICAgIGhlaWdodCA9IDAsCisgICAgICAgIHdpZHRoU2NhbGUsCisgICAgICAgIGhlaWdodFNjYWxlOworICAgIGNvbnN0IGNoYW5nZU9yaWVudGF0aW9uID0gcGFnZVZpZXcucm90YXRpb24gJSAxODAgIT09IDA7CisgICAgY29uc3QgcGFnZVdpZHRoID0gKGNoYW5nZU9yaWVudGF0aW9uID8gcGFnZVZpZXcuaGVpZ2h0IDogcGFnZVZpZXcud2lkdGgpIC8gcGFnZVZpZXcuc2NhbGUgLyBfdWlfdXRpbHMuQ1NTX1VOSVRTOworICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSAoY2hhbmdlT3JpZW50YXRpb24gPyBwYWdlVmlldy53aWR0aCA6IHBhZ2VWaWV3LmhlaWdodCkgLyBwYWdlVmlldy5zY2FsZSAvIF91aV91dGlscy5DU1NfVU5JVFM7CisgICAgbGV0IHNjYWxlID0gMDsKKworICAgIHN3aXRjaCAoZGVzdEFycmF5WzFdLm5hbWUpIHsKKyAgICAgIGNhc2UgIlhZWiI6CisgICAgICAgIHggPSBkZXN0QXJyYXlbMl07CisgICAgICAgIHkgPSBkZXN0QXJyYXlbM107CisgICAgICAgIHNjYWxlID0gZGVzdEFycmF5WzRdOworICAgICAgICB4ID0geCAhPT0gbnVsbCA/IHggOiAwOworICAgICAgICB5ID0geSAhPT0gbnVsbCA/IHkgOiBwYWdlSGVpZ2h0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiRml0IjoKKyAgICAgIGNhc2UgIkZpdEIiOgorICAgICAgICBzY2FsZSA9ICJwYWdlLWZpdCI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICJGaXRIIjoKKyAgICAgIGNhc2UgIkZpdEJIIjoKKyAgICAgICAgeSA9IGRlc3RBcnJheVsyXTsKKyAgICAgICAgc2NhbGUgPSAicGFnZS13aWR0aCI7CisKKyAgICAgICAgaWYgKHkgPT09IG51bGwgJiYgdGhpcy5fbG9jYXRpb24pIHsKKyAgICAgICAgICB4ID0gdGhpcy5fbG9jYXRpb24ubGVmdDsKKyAgICAgICAgICB5ID0gdGhpcy5fbG9jYXRpb24udG9wOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIkZpdFYiOgorICAgICAgY2FzZSAiRml0QlYiOgorICAgICAgICB4ID0gZGVzdEFycmF5WzJdOworICAgICAgICB3aWR0aCA9IHBhZ2VXaWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gcGFnZUhlaWdodDsKKyAgICAgICAgc2NhbGUgPSAicGFnZS1oZWlnaHQiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAiRml0UiI6CisgICAgICAgIHggPSBkZXN0QXJyYXlbMl07CisgICAgICAgIHkgPSBkZXN0QXJyYXlbM107CisgICAgICAgIHdpZHRoID0gZGVzdEFycmF5WzRdIC0geDsKKyAgICAgICAgaGVpZ2h0ID0gZGVzdEFycmF5WzVdIC0geTsKKyAgICAgICAgY29uc3QgaFBhZGRpbmcgPSB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzID8gMCA6IF91aV91dGlscy5TQ1JPTExCQVJfUEFERElORzsKKyAgICAgICAgY29uc3QgdlBhZGRpbmcgPSB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzID8gMCA6IF91aV91dGlscy5WRVJUSUNBTF9QQURESU5HOworICAgICAgICB3aWR0aFNjYWxlID0gKHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoIC0gaFBhZGRpbmcpIC8gd2lkdGggLyBfdWlfdXRpbHMuQ1NTX1VOSVRTOworICAgICAgICBoZWlnaHRTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgLSB2UGFkZGluZykgLyBoZWlnaHQgLyBfdWlfdXRpbHMuQ1NTX1VOSVRTOworICAgICAgICBzY2FsZSA9IE1hdGgubWluKE1hdGguYWJzKHdpZHRoU2NhbGUpLCBNYXRoLmFicyhoZWlnaHRTY2FsZSkpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLl9uYW1lfS5zY3JvbGxQYWdlSW50b1ZpZXc6IGAgKyBgIiR7ZGVzdEFycmF5WzFdLm5hbWV9IiBpcyBub3QgYSB2YWxpZCBkZXN0aW5hdGlvbiB0eXBlLmApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFpZ25vcmVEZXN0aW5hdGlvblpvb20pIHsKKyAgICAgIGlmIChzY2FsZSAmJiBzY2FsZSAhPT0gdGhpcy5fY3VycmVudFNjYWxlKSB7CisgICAgICAgIHRoaXMuY3VycmVudFNjYWxlVmFsdWUgPSBzY2FsZTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudFNjYWxlID09PSBfdWlfdXRpbHMuVU5LTk9XTl9TQ0FMRSkgeworICAgICAgICB0aGlzLmN1cnJlbnRTY2FsZVZhbHVlID0gX3VpX3V0aWxzLkRFRkFVTFRfU0NBTEVfVkFMVUU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNjYWxlID09PSAicGFnZS1maXQiICYmICFkZXN0QXJyYXlbNF0pIHsKKyAgICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHsKKyAgICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2LAorICAgICAgICBwYWdlTnVtYmVyCisgICAgICB9KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IFtwYWdlVmlldy52aWV3cG9ydC5jb252ZXJ0VG9WaWV3cG9ydFBvaW50KHgsIHkpLCBwYWdlVmlldy52aWV3cG9ydC5jb252ZXJ0VG9WaWV3cG9ydFBvaW50KHggKyB3aWR0aCwgeSArIGhlaWdodCldOworICAgIGxldCBsZWZ0ID0gTWF0aC5taW4oYm91bmRpbmdSZWN0WzBdWzBdLCBib3VuZGluZ1JlY3RbMV1bMF0pOworICAgIGxldCB0b3AgPSBNYXRoLm1pbihib3VuZGluZ1JlY3RbMF1bMV0sIGJvdW5kaW5nUmVjdFsxXVsxXSk7CisKKyAgICBpZiAoIWFsbG93TmVnYXRpdmVPZmZzZXQpIHsKKyAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCAwKTsKKyAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgMCk7CisgICAgfQorCisgICAgdGhpcy5fc2Nyb2xsSW50b1ZpZXcoeworICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2LAorICAgICAgcGFnZVNwb3Q6IHsKKyAgICAgICAgbGVmdCwKKyAgICAgICAgdG9wCisgICAgICB9LAorICAgICAgcGFnZU51bWJlcgorICAgIH0pOworICB9CisKKyAgX3VwZGF0ZUxvY2F0aW9uKGZpcnN0UGFnZSkgeworICAgIGNvbnN0IGN1cnJlbnRTY2FsZSA9IHRoaXMuX2N1cnJlbnRTY2FsZTsKKyAgICBjb25zdCBjdXJyZW50U2NhbGVWYWx1ZSA9IHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlOworICAgIGNvbnN0IG5vcm1hbGl6ZWRTY2FsZVZhbHVlID0gcGFyc2VGbG9hdChjdXJyZW50U2NhbGVWYWx1ZSkgPT09IGN1cnJlbnRTY2FsZSA/IE1hdGgucm91bmQoY3VycmVudFNjYWxlICogMTAwMDApIC8gMTAwIDogY3VycmVudFNjYWxlVmFsdWU7CisgICAgY29uc3QgcGFnZU51bWJlciA9IGZpcnN0UGFnZS5pZDsKKyAgICBsZXQgcGRmT3BlblBhcmFtcyA9ICIjcGFnZT0iICsgcGFnZU51bWJlcjsKKyAgICBwZGZPcGVuUGFyYW1zICs9ICImem9vbT0iICsgbm9ybWFsaXplZFNjYWxlVmFsdWU7CisgICAgY29uc3QgY3VycmVudFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbcGFnZU51bWJlciAtIDFdOworICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOworICAgIGNvbnN0IHRvcExlZnQgPSBjdXJyZW50UGFnZVZpZXcuZ2V0UGFnZVBvaW50KGNvbnRhaW5lci5zY3JvbGxMZWZ0IC0gZmlyc3RQYWdlLngsIGNvbnRhaW5lci5zY3JvbGxUb3AgLSBmaXJzdFBhZ2UueSk7CisgICAgY29uc3QgaW50TGVmdCA9IE1hdGgucm91bmQodG9wTGVmdFswXSk7CisgICAgY29uc3QgaW50VG9wID0gTWF0aC5yb3VuZCh0b3BMZWZ0WzFdKTsKKyAgICBwZGZPcGVuUGFyYW1zICs9ICIsIiArIGludExlZnQgKyAiLCIgKyBpbnRUb3A7CisgICAgdGhpcy5fbG9jYXRpb24gPSB7CisgICAgICBwYWdlTnVtYmVyLAorICAgICAgc2NhbGU6IG5vcm1hbGl6ZWRTY2FsZVZhbHVlLAorICAgICAgdG9wOiBpbnRUb3AsCisgICAgICBsZWZ0OiBpbnRMZWZ0LAorICAgICAgcm90YXRpb246IHRoaXMuX3BhZ2VzUm90YXRpb24sCisgICAgICBwZGZPcGVuUGFyYW1zCisgICAgfTsKKyAgfQorCisgIF91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IF91cGRhdGVIZWxwZXIiKTsKKyAgfQorCisgIHVwZGF0ZSgpIHsKKyAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCk7CisKKyAgICBjb25zdCB2aXNpYmxlUGFnZXMgPSB2aXNpYmxlLnZpZXdzLAorICAgICAgICAgIG51bVZpc2libGVQYWdlcyA9IHZpc2libGVQYWdlcy5sZW5ndGg7CisKKyAgICBpZiAobnVtVmlzaWJsZVBhZ2VzID09PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgbmV3Q2FjaGVTaXplID0gTWF0aC5tYXgoREVGQVVMVF9DQUNIRV9TSVpFLCAyICogbnVtVmlzaWJsZVBhZ2VzICsgMSk7CisKKyAgICB0aGlzLl9idWZmZXIucmVzaXplKG5ld0NhY2hlU2l6ZSwgdmlzaWJsZVBhZ2VzKTsKKworICAgIHRoaXMucmVuZGVyaW5nUXVldWUucmVuZGVySGlnaGVzdFByaW9yaXR5KHZpc2libGUpOworCisgICAgdGhpcy5fdXBkYXRlSGVscGVyKHZpc2libGVQYWdlcyk7CisKKyAgICB0aGlzLl91cGRhdGVMb2NhdGlvbih2aXNpYmxlLmZpcnN0KTsKKworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInVwZGF0ZXZpZXdhcmVhIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgbG9jYXRpb246IHRoaXMuX2xvY2F0aW9uCisgICAgfSk7CisgIH0KKworICBjb250YWluc0VsZW1lbnQoZWxlbWVudCkgeworICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KTsKKyAgfQorCisgIGZvY3VzKCkgeworICAgIHRoaXMuY29udGFpbmVyLmZvY3VzKCk7CisgIH0KKworICBnZXQgX2lzU2Nyb2xsTW9kZUhvcml6b250YWwoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBmYWxzZSA6IHRoaXMuX3Njcm9sbE1vZGUgPT09IF91aV91dGlscy5TY3JvbGxNb2RlLkhPUklaT05UQUw7CisgIH0KKworICBnZXQgaXNJblByZXNlbnRhdGlvbk1vZGUoKSB7CisgICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID09PSBfdWlfdXRpbHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlLkZVTExTQ1JFRU47CisgIH0KKworICBnZXQgaXNDaGFuZ2luZ1ByZXNlbnRhdGlvbk1vZGUoKSB7CisgICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID09PSBfdWlfdXRpbHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlLkNIQU5HSU5HOworICB9CisKKyAgZ2V0IGlzSG9yaXpvbnRhbFNjcm9sbGJhckVuYWJsZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBmYWxzZSA6IHRoaXMuY29udGFpbmVyLnNjcm9sbFdpZHRoID4gdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGg7CisgIH0KKworICBnZXQgaXNWZXJ0aWNhbFNjcm9sbGJhckVuYWJsZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBmYWxzZSA6IHRoaXMuY29udGFpbmVyLnNjcm9sbEhlaWdodCA+IHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodDsKKyAgfQorCisgIF9nZXRDdXJyZW50VmlzaWJsZVBhZ2UoKSB7CisgICAgaWYgKCF0aGlzLnBhZ2VzQ291bnQpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZpZXdzOiBbXQorICAgICAgfTsKKyAgICB9CisKKyAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07CisgICAgY29uc3QgZWxlbWVudCA9IHBhZ2VWaWV3LmRpdjsKKyAgICBjb25zdCB2aWV3ID0geworICAgICAgaWQ6IHBhZ2VWaWV3LmlkLAorICAgICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0LAorICAgICAgeTogZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcCwKKyAgICAgIHZpZXc6IHBhZ2VWaWV3CisgICAgfTsKKyAgICByZXR1cm4geworICAgICAgZmlyc3Q6IHZpZXcsCisgICAgICBsYXN0OiB2aWV3LAorICAgICAgdmlld3M6IFt2aWV3XQorICAgIH07CisgIH0KKworICBfZ2V0VmlzaWJsZVBhZ2VzKCkgeworICAgIHJldHVybiAoMCwgX3VpX3V0aWxzLmdldFZpc2libGVFbGVtZW50cykodGhpcy5jb250YWluZXIsIHRoaXMuX3BhZ2VzLCB0cnVlLCB0aGlzLl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsKTsKKyAgfQorCisgIGlzUGFnZVZpc2libGUocGFnZU51bWJlcikgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChwYWdlTnVtYmVyIDwgMSB8fCBwYWdlTnVtYmVyID4gdGhpcy5wYWdlc0NvdW50KSB7CisgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX25hbWV9LmlzUGFnZVZpc2libGU6ICIke3BhZ2VOdW1iZXJ9IiBpcyBvdXQgb2YgYm91bmRzLmApOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKS52aWV3cy5zb21lKGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICByZXR1cm4gdmlldy5pZCA9PT0gcGFnZU51bWJlcjsKKyAgICB9KTsKKyAgfQorCisgIGNsZWFudXAoKSB7CisgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgaWYgKHRoaXMuX3BhZ2VzW2ldICYmIHRoaXMuX3BhZ2VzW2ldLnJlbmRlcmluZ1N0YXRlICE9PSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQpIHsKKyAgICAgICAgdGhpcy5fcGFnZXNbaV0ucmVzZXQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfY2FuY2VsUmVuZGVyaW5nKCkgeworICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGlmICh0aGlzLl9wYWdlc1tpXSkgeworICAgICAgICB0aGlzLl9wYWdlc1tpXS5jYW5jZWxSZW5kZXJpbmcoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfZW5zdXJlUGRmUGFnZUxvYWRlZChwYWdlVmlldykgeworICAgIGlmIChwYWdlVmlldy5wZGZQYWdlKSB7CisgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhZ2VWaWV3LnBkZlBhZ2UpOworICAgIH0KKworICAgIGlmICh0aGlzLl9wYWdlc1JlcXVlc3RzLmhhcyhwYWdlVmlldykpIHsKKyAgICAgIHJldHVybiB0aGlzLl9wYWdlc1JlcXVlc3RzLmdldChwYWdlVmlldyk7CisgICAgfQorCisgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShwYWdlVmlldy5pZCkudGhlbihwZGZQYWdlID0+IHsKKyAgICAgIGlmICghcGFnZVZpZXcucGRmUGFnZSkgeworICAgICAgICBwYWdlVmlldy5zZXRQZGZQYWdlKHBkZlBhZ2UpOworICAgICAgfQorCisgICAgICB0aGlzLl9wYWdlc1JlcXVlc3RzLmRlbGV0ZShwYWdlVmlldyk7CisKKyAgICAgIHJldHVybiBwZGZQYWdlOworICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CisgICAgICBjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gZ2V0IHBhZ2UgZm9yIHBhZ2UgdmlldyIsIHJlYXNvbik7CisKKyAgICAgIHRoaXMuX3BhZ2VzUmVxdWVzdHMuZGVsZXRlKHBhZ2VWaWV3KTsKKyAgICB9KTsKKworICAgIHRoaXMuX3BhZ2VzUmVxdWVzdHMuc2V0KHBhZ2VWaWV3LCBwcm9taXNlKTsKKworICAgIHJldHVybiBwcm9taXNlOworICB9CisKKyAgZm9yY2VSZW5kZXJpbmcoY3VycmVudGx5VmlzaWJsZVBhZ2VzKSB7CisgICAgY29uc3QgdmlzaWJsZVBhZ2VzID0gY3VycmVudGx5VmlzaWJsZVBhZ2VzIHx8IHRoaXMuX2dldFZpc2libGVQYWdlcygpOworCisgICAgY29uc3Qgc2Nyb2xsQWhlYWQgPSB0aGlzLl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsID8gdGhpcy5zY3JvbGwucmlnaHQgOiB0aGlzLnNjcm9sbC5kb3duOworICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5yZW5kZXJpbmdRdWV1ZS5nZXRIaWdoZXN0UHJpb3JpdHkodmlzaWJsZVBhZ2VzLCB0aGlzLl9wYWdlcywgc2Nyb2xsQWhlYWQpOworCisgICAgaWYgKHBhZ2VWaWV3KSB7CisgICAgICB0aGlzLl9lbnN1cmVQZGZQYWdlTG9hZGVkKHBhZ2VWaWV3KS50aGVuKCgpID0+IHsKKyAgICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZS5yZW5kZXJWaWV3KHBhZ2VWaWV3KTsKKyAgICAgIH0pOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjcmVhdGVUZXh0TGF5ZXJCdWlsZGVyKHRleHRMYXllckRpdiwgcGFnZUluZGV4LCB2aWV3cG9ydCwgZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBmYWxzZSwgZXZlbnRCdXMpIHsKKyAgICByZXR1cm4gbmV3IF90ZXh0X2xheWVyX2J1aWxkZXIuVGV4dExheWVyQnVpbGRlcih7CisgICAgICB0ZXh0TGF5ZXJEaXYsCisgICAgICBldmVudEJ1cywKKyAgICAgIHBhZ2VJbmRleCwKKyAgICAgIHZpZXdwb3J0LAorICAgICAgZmluZENvbnRyb2xsZXI6IHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPyBudWxsIDogdGhpcy5maW5kQ29udHJvbGxlciwKKyAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlID8gZmFsc2UgOiBlbmhhbmNlVGV4dFNlbGVjdGlvbgorICAgIH0pOworICB9CisKKyAgY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlcihwYWdlRGl2LCBwZGZQYWdlLCBhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsIGltYWdlUmVzb3VyY2VzUGF0aCA9ICIiLCByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gZmFsc2UsIGwxMG4gPSBfdWlfdXRpbHMuTnVsbEwxMG4pIHsKKyAgICByZXR1cm4gbmV3IF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIuQW5ub3RhdGlvbkxheWVyQnVpbGRlcih7CisgICAgICBwYWdlRGl2LAorICAgICAgcGRmUGFnZSwKKyAgICAgIGFubm90YXRpb25TdG9yYWdlLAorICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoLAorICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcywKKyAgICAgIGxpbmtTZXJ2aWNlOiB0aGlzLmxpbmtTZXJ2aWNlLAorICAgICAgZG93bmxvYWRNYW5hZ2VyOiB0aGlzLmRvd25sb2FkTWFuYWdlciwKKyAgICAgIGwxMG4KKyAgICB9KTsKKyAgfQorCisgIGdldCBoYXNFcXVhbFBhZ2VTaXplcygpIHsKKyAgICBjb25zdCBmaXJzdFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbMF07CisKKyAgICBmb3IgKGxldCBpID0gMSwgaWkgPSB0aGlzLl9wYWdlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW2ldOworCisgICAgICBpZiAocGFnZVZpZXcud2lkdGggIT09IGZpcnN0UGFnZVZpZXcud2lkdGggfHwgcGFnZVZpZXcuaGVpZ2h0ICE9PSBmaXJzdFBhZ2VWaWV3LmhlaWdodCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBnZXRQYWdlc092ZXJ2aWV3KCkgeworICAgIGNvbnN0IHBhZ2VzT3ZlcnZpZXcgPSB0aGlzLl9wYWdlcy5tYXAoZnVuY3Rpb24gKHBhZ2VWaWV3KSB7CisgICAgICBjb25zdCB2aWV3cG9ydCA9IHBhZ2VWaWV3LnBkZlBhZ2UuZ2V0Vmlld3BvcnQoeworICAgICAgICBzY2FsZTogMQorICAgICAgfSk7CisgICAgICByZXR1cm4geworICAgICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsCisgICAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LAorICAgICAgICByb3RhdGlvbjogdmlld3BvcnQucm90YXRpb24KKyAgICAgIH07CisgICAgfSk7CisKKyAgICBpZiAoIXRoaXMuZW5hYmxlUHJpbnRBdXRvUm90YXRlKSB7CisgICAgICByZXR1cm4gcGFnZXNPdmVydmlldzsKKyAgICB9CisKKyAgICByZXR1cm4gcGFnZXNPdmVydmlldy5tYXAoZnVuY3Rpb24gKHNpemUpIHsKKyAgICAgIGlmICgoMCwgX3VpX3V0aWxzLmlzUG9ydHJhaXRPcmllbnRhdGlvbikoc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICB9CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIHdpZHRoOiBzaXplLmhlaWdodCwKKyAgICAgICAgaGVpZ2h0OiBzaXplLndpZHRoLAorICAgICAgICByb3RhdGlvbjogKHNpemUucm90YXRpb24gKyA5MCkgJSAzNjAKKyAgICAgIH07CisgICAgfSk7CisgIH0KKworICBnZXQgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSgpIHsKKyAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CisgICAgfQorCisgICAgaWYgKCF0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7CisgICAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTsKKyAgfQorCisgIHNldCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKHByb21pc2UpIHsKKyAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlOiAke3Byb21pc2V9YCk7CisgICAgfQorCisgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCF0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IHByb21pc2U7CisKKyAgICBmb3IgKGNvbnN0IHBhZ2VWaWV3IG9mIHRoaXMuX3BhZ2VzKSB7CisgICAgICBwYWdlVmlldy51cGRhdGUocGFnZVZpZXcuc2NhbGUsIHBhZ2VWaWV3LnJvdGF0aW9uLCBwcm9taXNlKTsKKyAgICB9CisKKyAgICB0aGlzLnVwZGF0ZSgpOworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goIm9wdGlvbmFsY29udGVudGNvbmZpZ2NoYW5nZWQiLCB7CisgICAgICBzb3VyY2U6IHRoaXMsCisgICAgICBwcm9taXNlCisgICAgfSk7CisgIH0KKworICBnZXQgc2Nyb2xsTW9kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fc2Nyb2xsTW9kZTsKKyAgfQorCisgIHNldCBzY3JvbGxNb2RlKG1vZGUpIHsKKyAgICBpZiAodGhpcy5fc2Nyb2xsTW9kZSA9PT0gbW9kZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghKDAsIF91aV91dGlscy5pc1ZhbGlkU2Nyb2xsTW9kZSkobW9kZSkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY3JvbGwgbW9kZTogJHttb2RlfWApOworICAgIH0KKworICAgIHRoaXMuX3Njcm9sbE1vZGUgPSBtb2RlOworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInNjcm9sbG1vZGVjaGFuZ2VkIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgbW9kZQorICAgIH0pOworCisgICAgdGhpcy5fdXBkYXRlU2Nyb2xsTW9kZSh0aGlzLl9jdXJyZW50UGFnZU51bWJlcik7CisgIH0KKworICBfdXBkYXRlU2Nyb2xsTW9kZShwYWdlTnVtYmVyID0gbnVsbCkgeworICAgIGNvbnN0IHNjcm9sbE1vZGUgPSB0aGlzLl9zY3JvbGxNb2RlLAorICAgICAgICAgIHZpZXdlciA9IHRoaXMudmlld2VyOworICAgIHZpZXdlci5jbGFzc0xpc3QudG9nZ2xlKCJzY3JvbGxIb3Jpem9udGFsIiwgc2Nyb2xsTW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuSE9SSVpPTlRBTCk7CisgICAgdmlld2VyLmNsYXNzTGlzdC50b2dnbGUoInNjcm9sbFdyYXBwZWQiLCBzY3JvbGxNb2RlID09PSBfdWlfdXRpbHMuU2Nyb2xsTW9kZS5XUkFQUEVEKTsKKworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCB8fCAhcGFnZU51bWJlcikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSAmJiBpc05hTih0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSkpIHsKKyAgICAgIHRoaXMuX3NldFNjYWxlKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyLCB0cnVlKTsKKworICAgIHRoaXMudXBkYXRlKCk7CisgIH0KKworICBnZXQgc3ByZWFkTW9kZSgpIHsKKyAgICByZXR1cm4gdGhpcy5fc3ByZWFkTW9kZTsKKyAgfQorCisgIHNldCBzcHJlYWRNb2RlKG1vZGUpIHsKKyAgICBpZiAodGhpcy5fc3ByZWFkTW9kZSA9PT0gbW9kZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghKDAsIF91aV91dGlscy5pc1ZhbGlkU3ByZWFkTW9kZSkobW9kZSkpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcHJlYWQgbW9kZTogJHttb2RlfWApOworICAgIH0KKworICAgIHRoaXMuX3NwcmVhZE1vZGUgPSBtb2RlOworICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goInNwcmVhZG1vZGVjaGFuZ2VkIiwgeworICAgICAgc291cmNlOiB0aGlzLAorICAgICAgbW9kZQorICAgIH0pOworCisgICAgdGhpcy5fdXBkYXRlU3ByZWFkTW9kZSh0aGlzLl9jdXJyZW50UGFnZU51bWJlcik7CisgIH0KKworICBfdXBkYXRlU3ByZWFkTW9kZShwYWdlTnVtYmVyID0gbnVsbCkgeworICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHZpZXdlciA9IHRoaXMudmlld2VyLAorICAgICAgICAgIHBhZ2VzID0gdGhpcy5fcGFnZXM7CisgICAgdmlld2VyLnRleHRDb250ZW50ID0gIiI7CisKKyAgICBpZiAodGhpcy5fc3ByZWFkTW9kZSA9PT0gX3VpX3V0aWxzLlNwcmVhZE1vZGUuTk9ORSkgeworICAgICAgZm9yIChsZXQgaSA9IDAsIGlNYXggPSBwYWdlcy5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHsKKyAgICAgICAgdmlld2VyLmFwcGVuZENoaWxkKHBhZ2VzW2ldLmRpdik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHBhcml0eSA9IHRoaXMuX3NwcmVhZE1vZGUgLSAxOworICAgICAgbGV0IHNwcmVhZCA9IG51bGw7CisKKyAgICAgIGZvciAobGV0IGkgPSAwLCBpTWF4ID0gcGFnZXMubGVuZ3RoOyBpIDwgaU1heDsgKytpKSB7CisgICAgICAgIGlmIChzcHJlYWQgPT09IG51bGwpIHsKKyAgICAgICAgICBzcHJlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgICAgICBzcHJlYWQuY2xhc3NOYW1lID0gInNwcmVhZCI7CisgICAgICAgICAgdmlld2VyLmFwcGVuZENoaWxkKHNwcmVhZCk7CisgICAgICAgIH0gZWxzZSBpZiAoaSAlIDIgPT09IHBhcml0eSkgeworICAgICAgICAgIHNwcmVhZCA9IHNwcmVhZC5jbG9uZU5vZGUoZmFsc2UpOworICAgICAgICAgIHZpZXdlci5hcHBlbmRDaGlsZChzcHJlYWQpOworICAgICAgICB9CisKKyAgICAgICAgc3ByZWFkLmFwcGVuZENoaWxkKHBhZ2VzW2ldLmRpdik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFwYWdlTnVtYmVyKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlciwgdHJ1ZSk7CisKKyAgICB0aGlzLnVwZGF0ZSgpOworICB9CisKK30KKworZXhwb3J0cy5CYXNlVmlld2VyID0gQmFzZVZpZXdlcjsKKworLyoqKi8gfSksCisvKiAxNyAqLworLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgeworCisidXNlIHN0cmljdCI7CisKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeworICB2YWx1ZTogdHJ1ZQorfSk7CitleHBvcnRzLlBERlZpZXdlciA9IHZvaWQgMDsKKwordmFyIF9iYXNlX3ZpZXdlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOworCit2YXIgX3BkZmpzTGliID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKKworY2xhc3MgUERGVmlld2VyIGV4dGVuZHMgX2Jhc2Vfdmlld2VyLkJhc2VWaWV3ZXIgeworICBnZXQgX3ZpZXdlckVsZW1lbnQoKSB7CisgICAgcmV0dXJuICgwLCBfcGRmanNMaWIuc2hhZG93KSh0aGlzLCAiX3ZpZXdlckVsZW1lbnQiLCB0aGlzLnZpZXdlcik7CisgIH0KKworICBfc2Nyb2xsSW50b1ZpZXcoeworICAgIHBhZ2VEaXYsCisgICAgcGFnZVNwb3QgPSBudWxsLAorICAgIHBhZ2VOdW1iZXIgPSBudWxsCisgIH0pIHsKKyAgICBpZiAoIXBhZ2VTcG90ICYmICF0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICBjb25zdCBsZWZ0ID0gcGFnZURpdi5vZmZzZXRMZWZ0ICsgcGFnZURpdi5jbGllbnRMZWZ0OworICAgICAgY29uc3QgcmlnaHQgPSBsZWZ0ICsgcGFnZURpdi5jbGllbnRXaWR0aDsKKyAgICAgIGNvbnN0IHsKKyAgICAgICAgc2Nyb2xsTGVmdCwKKyAgICAgICAgY2xpZW50V2lkdGgKKyAgICAgIH0gPSB0aGlzLmNvbnRhaW5lcjsKKworICAgICAgaWYgKHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWwgfHwgbGVmdCA8IHNjcm9sbExlZnQgfHwgcmlnaHQgPiBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGgpIHsKKyAgICAgICAgcGFnZVNwb3QgPSB7CisgICAgICAgICAgbGVmdDogMCwKKyAgICAgICAgICB0b3A6IDAKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdXBlci5fc2Nyb2xsSW50b1ZpZXcoeworICAgICAgcGFnZURpdiwKKyAgICAgIHBhZ2VTcG90LAorICAgICAgcGFnZU51bWJlcgorICAgIH0pOworICB9CisKKyAgX2dldFZpc2libGVQYWdlcygpIHsKKyAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkgeworICAgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnRWaXNpYmxlUGFnZSgpOworICAgIH0KKworICAgIHJldHVybiBzdXBlci5fZ2V0VmlzaWJsZVBhZ2VzKCk7CisgIH0KKworICBfdXBkYXRlSGVscGVyKHZpc2libGVQYWdlcykgeworICAgIGlmICh0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGV0IGN1cnJlbnRJZCA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyOworICAgIGxldCBzdGlsbEZ1bGx5VmlzaWJsZSA9IGZhbHNlOworCisgICAgZm9yIChjb25zdCBwYWdlIG9mIHZpc2libGVQYWdlcykgeworICAgICAgaWYgKHBhZ2UucGVyY2VudCA8IDEwMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHBhZ2UuaWQgPT09IGN1cnJlbnRJZCkgeworICAgICAgICBzdGlsbEZ1bGx5VmlzaWJsZSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmICghc3RpbGxGdWxseVZpc2libGUpIHsKKyAgICAgIGN1cnJlbnRJZCA9IHZpc2libGVQYWdlc1swXS5pZDsKKyAgICB9CisKKyAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihjdXJyZW50SWQpOworICB9CisKK30KKworZXhwb3J0cy5QREZWaWV3ZXIgPSBQREZWaWV3ZXI7CisKKy8qKiovIH0pCisvKioqKioqLyBdKTsKK30pOworLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGRmX3ZpZXdlci5qcy5tYXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWIvcGRmX3ZpZXdlci5qcy5tYXAgYi93ZWIvcGRmX3ZpZXdlci5qcy5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4YjBjYQotLS0gL2Rldi9udWxsCisrKyBiL3dlYi9wZGZfdmlld2VyLmpzLm1hcApAQCAtMCwwICsxIEBACit7InZlcnNpb24iOjMsInNvdXJjZXMiOlsid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvcGRmX3ZpZXdlci5jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvYW5ub3RhdGlvbl9sYXllcl9idWlsZGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3BkZmpzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3VpX3V0aWxzLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3BkZl9saW5rX3NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvdGV4dF9sYXllcl9idWlsZGVyLmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL2Rvd25sb2FkX21hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvdmlld2VyX2NvbXBhdGliaWxpdHkuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvZ2VuZXJpY2wxMG4uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci9leHRlcm5hbC93ZWJMMTBuL2wxMG4uanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvcGRmX2ZpbmRfY29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyL3dlYi9wZGZfZmluZF91dGlscy5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyL3dlYi9wZGZfaGlzdG9yeS5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyL3dlYi9wZGZfcGFnZV92aWV3LmpzIiwid2VicGFjazovL3BkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXIvd2ViL3BkZl9yZW5kZXJpbmdfcXVldWUuanMiLCJ3ZWJwYWNrOi8vcGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlci93ZWIvcGRmX3NpbmdsZV9wYWdlX3ZpZXdlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyL3dlYi9iYXNlX3ZpZXdlci5qcyIsIndlYnBhY2s6Ly9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyL3dlYi9wZGZfdmlld2VyLmpzIl0sIm5hbWVzIjpbInBkZmpzVmVyc2lvbiIsInBkZmpzQnVpbGQiLCJjb25zdHJ1Y3RvciIsImFubm90YXRpb25TdG9yYWdlIiwiaW1hZ2VSZXNvdXJjZXNQYXRoIiwicmVuZGVySW50ZXJhY3RpdmVGb3JtcyIsImwxMG4iLCJyZW5kZXIiLCJpbnRlbnQiLCJhbm5vdGF0aW9ucyIsInBhcmFtZXRlcnMiLCJ2aWV3cG9ydCIsImRvbnRGbGlwIiwiZGl2IiwicGFnZSIsImxpbmtTZXJ2aWNlIiwiZG93bmxvYWRNYW5hZ2VyIiwiQW5ub3RhdGlvbkxheWVyIiwiZG9jdW1lbnQiLCJjYW5jZWwiLCJoaWRlIiwiY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlciIsIndpbmRvdyIsInBkZmpzTGliIiwiX19ub25fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGUiLCJDU1NfVU5JVFMiLCJERUZBVUxUX1NDQUxFX1ZBTFVFIiwiREVGQVVMVF9TQ0FMRSIsIk1JTl9TQ0FMRSIsIk1BWF9TQ0FMRSIsIlVOS05PV05fU0NBTEUiLCJNQVhfQVVUT19TQ0FMRSIsIlNDUk9MTEJBUl9QQURESU5HIiwiVkVSVElDQUxfUEFERElORyIsIlByZXNlbnRhdGlvbk1vZGVTdGF0ZSIsIlVOS05PV04iLCJOT1JNQUwiLCJDSEFOR0lORyIsIkZVTExTQ1JFRU4iLCJSZW5kZXJlclR5cGUiLCJDQU5WQVMiLCJTVkciLCJUZXh0TGF5ZXJNb2RlIiwiRElTQUJMRSIsIkVOQUJMRSIsIkVOQUJMRV9FTkhBTkNFIiwiU2Nyb2xsTW9kZSIsIlZFUlRJQ0FMIiwiSE9SSVpPTlRBTCIsIldSQVBQRUQiLCJTcHJlYWRNb2RlIiwiTk9ORSIsIk9ERCIsIkVWRU4iLCJBdXRvUHJpbnRSZWdFeHAiLCJuYW1lIiwiYXJncyIsIk51bGxMMTBuIiwiZm9ybWF0TDEwblZhbHVlIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImJhY2tpbmdTdG9yZVJhdGlvIiwiY3R4IiwicGl4ZWxSYXRpbyIsInN4Iiwic3kiLCJzY2FsZWQiLCJza2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyIsInBhcmVudCIsImVsZW1lbnQiLCJjb25zb2xlIiwib2Zmc2V0WSIsIm9mZnNldFgiLCJnZXRDb21wdXRlZFN0eWxlIiwic3BvdCIsImRlYm91bmNlU2Nyb2xsIiwickFGIiwiY3VycmVudFgiLCJ2aWV3QXJlYUVsZW1lbnQiLCJsYXN0WCIsInN0YXRlIiwiY3VycmVudFkiLCJsYXN0WSIsImNhbGxiYWNrIiwicmlnaHQiLCJkb3duIiwiX2V2ZW50SGFuZGxlciIsInBhcnRzIiwicXVlcnkiLCJwYXJhbXMiLCJPYmplY3QiLCJpIiwiaWkiLCJwYXJhbSIsImtleSIsInZhbHVlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwibWluSW5kZXgiLCJtYXhJbmRleCIsIml0ZW1zIiwiY29uZGl0aW9uIiwiY3VycmVudEluZGV4IiwiY3VycmVudEl0ZW0iLCJNYXRoIiwieGludiIsImxpbWl0IiwieF8iLCJ4IiwiYSIsImIiLCJjIiwiZCIsInAiLCJxIiwicmVzdWx0IiwiciIsImNoYW5nZU9yaWVudGF0aW9uIiwicm90YXRlIiwid2lkdGgiLCJoZWlnaHQiLCJpbmRleCIsImVsdCIsInZpZXdzIiwicGFnZVRvcCIsInNvcnRCeVZpc2liaWxpdHkiLCJob3Jpem9udGFsIiwidG9wIiwic2Nyb2xsRWwiLCJib3R0b20iLCJsZWZ0IiwidmlldyIsImVsZW1lbnRCb3R0b20iLCJlbGVtZW50UmlnaHQiLCJ2aXNpYmxlIiwibnVtVmlld3MiLCJmaXJzdFZpc2libGVFbGVtZW50SW5kIiwiYmluYXJ5U2VhcmNoRmlyc3RJdGVtIiwiYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzIiwibGFzdEVkZ2UiLCJjdXJyZW50V2lkdGgiLCJjdXJyZW50SGVpZ2h0Iiwidmlld1dpZHRoIiwidmlld0hlaWdodCIsInZpZXdSaWdodCIsInZpZXdCb3R0b20iLCJoaWRkZW5IZWlnaHQiLCJoaWRkZW5XaWR0aCIsInBlcmNlbnQiLCJpZCIsInkiLCJmaXJzdCIsImxhc3QiLCJwYyIsImV2dCIsInVybCIsImRlZmF1bHRGaWxlbmFtZSIsImlzRGF0YVNjaGVtYSIsInJlVVJJIiwicmVGaWxlbmFtZSIsInNwbGl0VVJJIiwic3VnZ2VzdGVkRmlsZW5hbWUiLCJkZWx0YSIsImFuZ2xlIiwibm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbiIsIk1PVVNFX0RPTV9ERUxUQV9QSVhFTF9NT0RFIiwiTU9VU0VfRE9NX0RFTFRBX0xJTkVfTU9ERSIsIk1PVVNFX1BJWEVMU19QRVJfTElORSIsIk1PVVNFX0xJTkVTX1BFUl9QQUdFIiwiTnVtYmVyIiwibW9kZSIsInNpemUiLCJXYWl0T25UeXBlIiwiRVZFTlQiLCJUSU1FT1VUIiwiZGVsYXkiLCJ0YXJnZXQiLCJjbGVhclRpbWVvdXQiLCJyZXNvbHZlIiwiZXZlbnRIYW5kbGVyIiwiaGFuZGxlciIsInRpbWVvdXRIYW5kbGVyIiwidGltZW91dCIsInNldFRpbWVvdXQiLCJhbmltYXRpb25TdGFydGVkIiwib24iLCJleHRlcm5hbCIsIm9mZiIsImRpc3BhdGNoIiwiZXZlbnRMaXN0ZW5lcnMiLCJBcnJheSIsImV4dGVybmFsTGlzdGVuZXJzIiwibGlzdGVuZXIiLCJfb24iLCJvcHRpb25zIiwiX29mZiIsInVuaXRzIiwiX3VwZGF0ZUJhciIsInByb2dyZXNzU2l6ZSIsImlzTmFOIiwiY2xhbXAiLCJzZXRXaWR0aCIsImNvbnRhaW5lciIsInZpZXdlciIsInNjcm9sbGJhcldpZHRoIiwic2hvdyIsIm1vdmVkIiwibGVuIiwiYXJyIiwid3JpdGUiLCJyZWFkIiwiZXh0ZXJuYWxMaW5rVGFyZ2V0IiwiZXh0ZXJuYWxMaW5rUmVsIiwiZXh0ZXJuYWxMaW5rRW5hYmxlZCIsImlnbm9yZURlc3RpbmF0aW9uWm9vbSIsInNldERvY3VtZW50IiwiYmFzZVVybCIsInNldFZpZXdlciIsInNldEhpc3RvcnkiLCJuYXZpZ2F0ZVRvIiwiZ29Ub0Rlc3RpbmF0aW9uIiwiZGVzdFJlZiIsImV4cGxpY2l0RGVzdCIsInBhZ2VOdW1iZXIiLCJwYWdlSW5kZXgiLCJkZXN0QXJyYXkiLCJuYW1lZERlc3QiLCJkYXRhIiwiZ2V0RGVzdGluYXRpb25IYXNoIiwiZXNjYXBlIiwic3RyIiwiSlNPTiIsImdldEFuY2hvclVybCIsInNldEhhc2giLCJoYXNoIiwicGFyc2VRdWVyeVN0cmluZyIsInNvdXJjZSIsInBocmFzZVNlYXJjaCIsInpvb21BcmdzIiwiem9vbUFyZyIsInpvb21BcmdOdW1iZXIiLCJwYXJzZUZsb2F0IiwiZGVzdCIsImFsbG93TmVnYXRpdmVPZmZzZXQiLCJ1bmVzY2FwZSIsImlzVmFsaWRFeHBsaWNpdERlc3RpbmF0aW9uIiwiZXhlY3V0ZU5hbWVkQWN0aW9uIiwiY2FjaGVQYWdlUmVmIiwicmVmU3RyIiwicGFnZVJlZiIsIl9jYWNoZWRQYWdlTnVtYmVyIiwiaXNQYWdlVmlzaWJsZSIsImRlc3RMZW5ndGgiLCJ6b29tIiwiYWxsb3dOdWxsIiwiRVhQQU5EX0RJVlNfVElNRU9VVCIsImZpbmRDb250cm9sbGVyIiwiZW5oYW5jZVRleHRTZWxlY3Rpb24iLCJfZmluaXNoUmVuZGVyaW5nIiwiZW5kT2ZDb250ZW50IiwibnVtVGV4dERpdnMiLCJ0ZXh0TGF5ZXJGcmFnIiwidGV4dENvbnRlbnQiLCJ0ZXh0Q29udGVudFN0cmVhbSIsInRleHREaXZzIiwidGV4dENvbnRlbnRJdGVtc1N0ciIsInNldFRleHRDb250ZW50U3RyZWFtIiwic2V0VGV4dENvbnRlbnQiLCJfY29udmVydE1hdGNoZXMiLCJpSW5kZXgiLCJlbmQiLCJxdWVyeUxlbiIsIm0iLCJtbSIsIm1hdGNoZXMiLCJtYXRjaElkeCIsIm1hdGNoIiwiYmVnaW4iLCJkaXZJZHgiLCJvZmZzZXQiLCJtYXRjaGVzTGVuZ3RoIiwiX3JlbmRlck1hdGNoZXMiLCJpc1NlbGVjdGVkUGFnZSIsInBhZ2VJZHgiLCJzZWxlY3RlZE1hdGNoSWR4IiwiaGlnaGxpZ2h0QWxsIiwicHJldkVuZCIsImluZmluaXR5IiwiYXBwZW5kVGV4dFRvRGl2IiwiY29udGVudCIsIm5vZGUiLCJzcGFuIiwiaTAiLCJpMSIsImlzU2VsZWN0ZWQiLCJoaWdobGlnaHRTdWZmaXgiLCJtYXRjaEluZGV4IiwiYmVnaW5UZXh0IiwibjAiLCJuMSIsIl91cGRhdGVNYXRjaGVzIiwiY2xlYXJlZFVudGlsRGl2SWR4IiwibiIsInBhZ2VNYXRjaGVzIiwicGFnZU1hdGNoZXNMZW5ndGgiLCJfYmluZE1vdXNlIiwiZXhwYW5kRGl2c1RpbWVyIiwiYWRqdXN0VG9wIiwiZGl2Qm91bmRzIiwiY3JlYXRlVGV4dExheWVyQnVpbGRlciIsImRvd25sb2FkVXJsIiwiY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCIsImRvd25sb2FkIiwiZG93bmxvYWREYXRhIiwibmF2aWdhdG9yIiwidHlwZSIsImJsb2JVcmwiLCJjcmVhdGVPYmplY3RVUkwiLCJ2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zIiwic291cmNlRXZlbnRUeXBlIiwiVVJMIiwiY29tcGF0aWJpbGl0eVBhcmFtcyIsInVzZXJBZ2VudCIsInBsYXRmb3JtIiwibWF4VG91Y2hQb2ludHMiLCJpc0FuZHJvaWQiLCJpc0lFIiwiaXNJT1MiLCJpc0lPU0Nocm9tZSIsIndlYkwxMG4iLCJnTDEwbkRhdGEiLCJnVGV4dERhdGEiLCJnVGV4dFByb3AiLCJnTGFuZ3VhZ2UiLCJnTWFjcm9zIiwiZ1JlYWR5U3RhdGUiLCJnQXN5bmNSZXNvdXJjZUxvYWRpbmciLCJzY3JpcHQiLCJsMTBuSWQiLCJsMTBuQXJncyIsIm9uU3VjY2VzcyIsIm9uRmFpbHVyZSIsInhociIsImJhc2VVUkwiLCJocmVmIiwidGV4dCIsImRpY3Rpb25hcnkiLCJyZUJsYW5rIiwicmVDb21tZW50IiwicmVTZWN0aW9uIiwicmVJbXBvcnQiLCJyZVNwbGl0IiwiZW50cmllcyIsInJhd1RleHQiLCJjdXJyZW50TGFuZyIsImdlbmVyaWNMYW5nIiwibGFuZyIsInNraXBMYW5nIiwicGFyc2VkUmF3TGluZXNDYWxsYmFjayIsImxpbmUiLCJsb2FkSW1wb3J0IiwidG1wIiwiZXZhbFN0cmluZyIsIm5leHRFbnRyeSIsInhockxvYWRUZXh0IiwicGFyc2VSYXdMaW5lcyIsInBhcnNlZFByb3BlcnRpZXNDYWxsYmFjayIsInBhcnNlUHJvcGVydGllcyIsInByb3AiLCJzdWNjZXNzQ2FsbGJhY2siLCJjbGVhciIsImxhbmdMaW5rcyIsImdldEwxMG5SZXNvdXJjZUxpbmtzIiwibGFuZ0NvdW50IiwiZGljdCIsImdldEwxMG5EaWN0aW9uYXJ5IiwiZGVmYXVsdExvY2FsZSIsImFueUNhc2VMYW5nIiwib25SZXNvdXJjZUxvYWRlZCIsImdSZXNvdXJjZUNvdW50IiwibGluayIsInBhcnNlUmVzb3VyY2UiLCJyZXNvdXJjZSIsImxvY2FsZXMycnVsZXMiLCJsaXN0Iiwic3RhcnQiLCJwbHVyYWxSdWxlcyIsImlzQmV0d2VlbiIsImdldFBsdXJhbFJ1bGVzIiwicnYiLCJzdWJzdEluZGV4ZXMiLCJzdWJzdEFyZ3VtZW50cyIsInJlSW5kZXgiLCJyZU1hdGNoIiwibWFjcm9OYW1lIiwicGFyYW1OYW1lIiwibWFjcm8iLCJyZUFyZ3MiLCJhcmciLCJnZXRMMTBuQXR0cmlidXRlcyIsImdldEwxMG5EYXRhIiwiZ2V0Q2hpbGRFbGVtZW50Q291bnQiLCJjaGlsZHJlbiIsImZvdW5kIiwibCIsInRleHROb2RlIiwiY291bnQiLCJnZXRUcmFuc2xhdGFibGVDaGlsZHJlbiIsImVsZW1lbnRDb3VudCIsInRyYW5zbGF0ZUVsZW1lbnQiLCJnZXQiLCJmYWxsYmFjayIsImdldERhdGEiLCJnZXRUZXh0IiwiZ2V0TGFuZ3VhZ2UiLCJzZXRMYW5ndWFnZSIsImxvYWRMb2NhbGUiLCJnZXREaXJlY3Rpb24iLCJydGxMaXN0Iiwic2hvcnRDb2RlIiwidHJhbnNsYXRlIiwiZ2V0UmVhZHlTdGF0ZSIsInJlYWR5IiwiRmluZFN0YXRlIiwiRk9VTkQiLCJOT1RfRk9VTkQiLCJQRU5ESU5HIiwiRklORF9USU1FT1VUIiwiTUFUQ0hfU0NST0xMX09GRlNFVF9UT1AiLCJNQVRDSF9TQ1JPTExfT0ZGU0VUX0xFRlQiLCJDSEFSQUNURVJTX1RPX05PUk1BTElaRSIsIm5vcm1hbGl6YXRpb25SZWdleCIsInJlcGxhY2UiLCJldmVudEJ1cyIsImV4ZWN1dGVDb21tYW5kIiwicGRmRG9jdW1lbnQiLCJjbWQiLCJmaW5kYmFyQ2xvc2VkIiwicGVuZGluZ1RpbWVvdXQiLCJzY3JvbGxNYXRjaEludG9WaWV3Iiwic2Nyb2xsSW50b1ZpZXciLCJfcmVzZXQiLCJ3cmFwcGVkIiwibm9ybWFsaXplIiwiX3Nob3VsZERpcnR5TWF0Y2giLCJfcHJlcGFyZU1hdGNoZXMiLCJjdXJyZW50RWxlbSIsIm1hdGNoZXNXaXRoTGVuZ3RoIiwibmV4dEVsZW0iLCJwcmV2RWxlbSIsImlzU3ViVGVybSIsIl9pc0VudGlyZVdvcmQiLCJzdGFydElkeCIsImdldENoYXJhY3RlclR5cGUiLCJlbmRJZHgiLCJfY2FsY3VsYXRlUGhyYXNlTWF0Y2giLCJwYWdlQ29udGVudCIsImVudGlyZVdvcmQiLCJfY2FsY3VsYXRlV29yZE1hdGNoIiwicXVlcnlBcnJheSIsInN1YnF1ZXJ5Iiwic3VicXVlcnlMZW4iLCJtYXRjaExlbmd0aCIsInNraXBwZWQiLCJfY2FsY3VsYXRlTWF0Y2giLCJwYWdlTWF0Y2hlc0NvdW50IiwiX2V4dHJhY3RUZXh0IiwicHJvbWlzZSIsIlByb21pc2UiLCJleHRyYWN0VGV4dENhcGFiaWxpdHkiLCJwZGZQYWdlIiwibm9ybWFsaXplV2hpdGVzcGFjZSIsInRleHRJdGVtcyIsInN0ckJ1ZiIsImoiLCJqaiIsInJlYXNvbiIsIl91cGRhdGVQYWdlIiwiX3VwZGF0ZUFsbFBhZ2VzIiwiX25leHRNYXRjaCIsInByZXZpb3VzIiwiY3VycmVudFBhZ2VJbmRleCIsIm51bVBhZ2VzIiwibnVtUGFnZU1hdGNoZXMiLCJfbWF0Y2hlc1JlYWR5IiwibnVtTWF0Y2hlcyIsIl9uZXh0UGFnZU1hdGNoIiwiX2FkdmFuY2VPZmZzZXRQYWdlIiwiX3VwZGF0ZU1hdGNoIiwicHJldmlvdXNQYWdlIiwiX29uRmluZEJhckNsb3NlIiwiX3JlcXVlc3RNYXRjaGVzQ291bnQiLCJjdXJyZW50IiwidG90YWwiLCJfdXBkYXRlVUlSZXN1bHRzQ291bnQiLCJtYXRjaGVzQ291bnQiLCJfdXBkYXRlVUlTdGF0ZSIsInJhd1F1ZXJ5IiwiQ2hhcmFjdGVyVHlwZSIsIlNQQUNFIiwiQUxQSEFfTEVUVEVSIiwiUFVOQ1QiLCJIQU5fTEVUVEVSIiwiS0FUQUtBTkFfTEVUVEVSIiwiSElSQUdBTkFfTEVUVEVSIiwiSEFMRldJRFRIX0tBVEFLQU5BX0xFVFRFUiIsIlRIQUlfTEVUVEVSIiwiY2hhckNvZGUiLCJpc0FscGhhYmV0aWNhbFNjcmlwdCIsImlzQXNjaWkiLCJpc0FzY2lpU3BhY2UiLCJpc0FzY2lpQWxwaGEiLCJpc0FzY2lpRGlnaXQiLCJpc1RoYWkiLCJpc0hhbiIsImlzS2F0YWthbmEiLCJpc0hpcmFnYW5hIiwiaXNIYWxmd2lkdGhLYXRha2FuYSIsIkhBU0hfQ0hBTkdFX1RJTUVPVVQiLCJQT1NJVElPTl9VUERBVEVEX1RIUkVTSE9MRCIsIlVQREFURV9WSUVXQVJFQV9USU1FT1VUIiwib25QYWdlc0xvYWRlZCIsImluaXRpYWxpemUiLCJyZXNldEhpc3RvcnkiLCJ1cGRhdGVVcmwiLCJyZUluaXRpYWxpemVkIiwiZ2V0Q3VycmVudEhhc2giLCJkZXN0aW5hdGlvbiIsInJlc2V0IiwicHVzaCIsImZvcmNlUmVwbGFjZSIsImlzRGVzdEFycmF5c0VxdWFsIiwicm90YXRpb24iLCJwdXNoQ3VycmVudFBvc2l0aW9uIiwiYmFjayIsImZvcndhcmQiLCJfcHVzaE9yUmVwbGFjZVN0YXRlIiwic2hvdWxkUmVwbGFjZSIsIm5ld1N0YXRlIiwiZmluZ2VycHJpbnQiLCJ1aWQiLCJuZXdVcmwiLCJfdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbiIsInRlbXBvcmFyeSIsInBvc2l0aW9uIiwiX2lzVmFsaWRTdGF0ZSIsImNoZWNrUmVsb2FkIiwicGVyZm9ybWFuY2UiLCJwZXJmRW50cnkiLCJfdXBkYXRlSW50ZXJuYWxTdGF0ZSIsInJlbW92ZVRlbXBvcmFyeSIsIl9wYXJzZUN1cnJlbnRIYXNoIiwiY2hlY2tOYW1lZGRlc3QiLCJuYW1lZGRlc3QiLCJfdXBkYXRlVmlld2FyZWEiLCJsb2NhdGlvbiIsIl9wb3BTdGF0ZSIsIm5ld0hhc2giLCJoYXNoQ2hhbmdlZCIsIndhaXRPbkV2ZW50T3JUaW1lb3V0IiwiaXNWYWxpZFJvdGF0aW9uIiwiX3BhZ2VIaWRlIiwiX2JpbmRFdmVudHMiLCJ1cGRhdGVWaWV3YXJlYSIsInBvcFN0YXRlIiwicGFnZUhpZGUiLCJfdW5iaW5kRXZlbnRzIiwiZGVzdEhhc2giLCJzZWNvbmQiLCJpc0VudHJ5RXF1YWwiLCJmaXJzdERlc3QiLCJzZWNvbmREZXN0IiwiTUFYX0NBTlZBU19QSVhFTFMiLCJkZWZhdWx0Vmlld3BvcnQiLCJSZW5kZXJpbmdTdGF0ZXMiLCJzZXRQZGZQYWdlIiwidG90YWxSb3RhdGlvbiIsInNjYWxlIiwiZGVzdHJveSIsImVycm9yIiwiX3Jlc2V0Wm9vbUxheWVyIiwicmVtb3ZlRnJvbURPTSIsInpvb21MYXllckNhbnZhcyIsImtlZXBab29tTGF5ZXIiLCJrZWVwQW5ub3RhdGlvbnMiLCJjaGlsZE5vZGVzIiwiY3VycmVudFpvb21MYXllck5vZGUiLCJjdXJyZW50QW5ub3RhdGlvbk5vZGUiLCJ1cGRhdGUiLCJvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIiwiY3NzVHJhbnNmb3JtIiwidGltZXN0YW1wIiwiaXNTY2FsaW5nUmVzdHJpY3RlZCIsIm91dHB1dFNjYWxlIiwiY2FuY2VsUmVuZGVyaW5nIiwicmVkcmF3QW5ub3RhdGlvbnMiLCJyZWxhdGl2ZVJvdGF0aW9uIiwiYWJzUm90YXRpb24iLCJzY2FsZVgiLCJzY2FsZVkiLCJ0ZXh0TGF5ZXJWaWV3cG9ydCIsInRleHRSZWxhdGl2ZVJvdGF0aW9uIiwidGV4dEFic1JvdGF0aW9uIiwidGV4dExheWVyRGl2IiwidHJhbnNYIiwidHJhbnNZIiwiZ2V0UGFnZVBvaW50IiwiZHJhdyIsImNhbnZhc1dyYXBwZXIiLCJ0ZXh0TGF5ZXIiLCJyZW5kZXJDb250aW51ZUNhbGxiYWNrIiwiY29udCIsImZpbmlzaFBhaW50VGFzayIsInBhaW50VGFzayIsInJlc3VsdFByb21pc2UiLCJyZWFkYWJsZVN0cmVhbSIsInBhaW50T25DYW52YXMiLCJyZW5kZXJDYXBhYmlsaXR5Iiwib25SZW5kZXJDb250aW51ZSIsInJlbmRlclRhc2siLCJjYW52YXMiLCJtc2ciLCJpc0NhbnZhc0hpZGRlbiIsInNob3dDYW52YXMiLCJhbHBoYSIsImdldE91dHB1dFNjYWxlIiwiYWN0dWFsU2l6ZVZpZXdwb3J0IiwicGl4ZWxzSW5WaWV3cG9ydCIsIm1heFNjYWxlIiwic2Z4IiwiYXBwcm94aW1hdGVGcmFjdGlvbiIsInNmeSIsInJvdW5kVG9EaXZpZGUiLCJ0cmFuc2Zvcm0iLCJyZW5kZXJDb250ZXh0IiwiY2FudmFzQ29udGV4dCIsImVuYWJsZVdlYkdMIiwicGFpbnRPblN2ZyIsImNhbmNlbGxlZCIsImVuc3VyZU5vdENhbmNlbGxlZCIsIm9wTGlzdCIsInN2Z0dmeCIsInN2ZyIsIndyYXBwZXIiLCJzZXRQYWdlTGFiZWwiLCJDTEVBTlVQX1RJTUVPVVQiLCJJTklUSUFMIiwiUlVOTklORyIsIlBBVVNFRCIsIkZJTklTSEVEIiwic2V0VGh1bWJuYWlsVmlld2VyIiwiaXNIaWdoZXN0UHJpb3JpdHkiLCJyZW5kZXJIaWdoZXN0UHJpb3JpdHkiLCJnZXRIaWdoZXN0UHJpb3JpdHkiLCJ2aXNpYmxlVmlld3MiLCJudW1WaXNpYmxlIiwibmV4dFBhZ2VJbmRleCIsInByZXZpb3VzUGFnZUluZGV4IiwiaXNWaWV3RmluaXNoZWQiLCJyZW5kZXJWaWV3Iiwic2hhZG93IiwiX3Jlc2V0VmlldyIsIl9lbnN1cmVQYWdlVmlld1Zpc2libGUiLCJwYWdlVmlldyIsInByZXZpb3VzUGFnZVZpZXciLCJ2aWV3ZXJOb2RlcyIsIl9zY3JvbGxVcGRhdGUiLCJfc2Nyb2xsSW50b1ZpZXciLCJwYWdlU3BvdCIsInNjcm9sbGVkRG93biIsIl9nZXRWaXNpYmxlUGFnZXMiLCJfdXBkYXRlSGVscGVyIiwiX3VwZGF0ZVNjcm9sbE1vZGUiLCJfdXBkYXRlU3ByZWFkTW9kZSIsIkRFRkFVTFRfQ0FDSEVfU0laRSIsInBhZ2VJZHNUb0tlZXAiLCJpTWF4IiwicGFnZXNUb0tlZXAiLCJtb3ZlVG9FbmRPZkFycmF5IiwibmV3U2NhbGUiLCJ3YXRjaFNjcm9sbCIsImdldFBhZ2VWaWV3IiwiX3NldEN1cnJlbnRQYWdlTnVtYmVyIiwicmVzZXRDdXJyZW50UGFnZVZpZXciLCJ2YWwiLCJwYWdlTGFiZWwiLCJwYWdlc1JvdGF0aW9uIiwiX29uZVBhZ2VSZW5kZXJlZE9yRm9yY2VGZXRjaCIsInBhZ2VzQ291bnQiLCJmaXJzdFBhZ2VQcm9taXNlIiwiZmlyc3RQZGZQYWdlIiwidGV4dExheWVyRmFjdG9yeSIsInBhZ2VOdW0iLCJyZW5kZXJpbmdRdWV1ZSIsInRleHRMYXllck1vZGUiLCJhbm5vdGF0aW9uTGF5ZXJGYWN0b3J5IiwicmVuZGVyZXIiLCJ1c2VPbmx5Q3NzWm9vbSIsIm1heENhbnZhc1BpeGVscyIsImZpcnN0UGFnZVZpZXciLCJnZXRQYWdlc0xlZnQiLCJzZXRQYWdlTGFiZWxzIiwibGFiZWxzIiwibGFiZWwiLCJfc2V0U2NhbGVVcGRhdGVQYWdlcyIsIm5vU2Nyb2xsIiwicHJlc2V0IiwibmV3VmFsdWUiLCJpc1NhbWVTY2FsZSIsInByZXNldFZhbHVlIiwiX3NldFNjYWxlIiwiY3VycmVudFBhZ2UiLCJub1BhZGRpbmciLCJoUGFkZGluZyIsInZQYWRkaW5nIiwicGFnZVdpZHRoU2NhbGUiLCJwYWdlSGVpZ2h0U2NhbGUiLCJob3Jpem9udGFsU2NhbGUiLCJpc1BvcnRyYWl0T3JpZW50YXRpb24iLCJfcmVzZXRDdXJyZW50UGFnZVZpZXciLCJwYWdlRGl2Iiwic2Nyb2xsUGFnZUludG9WaWV3IiwicGFnZVdpZHRoIiwicGFnZUhlaWdodCIsIndpZHRoU2NhbGUiLCJoZWlnaHRTY2FsZSIsImJvdW5kaW5nUmVjdCIsIl91cGRhdGVMb2NhdGlvbiIsImN1cnJlbnRTY2FsZSIsImN1cnJlbnRTY2FsZVZhbHVlIiwibm9ybWFsaXplZFNjYWxlVmFsdWUiLCJmaXJzdFBhZ2UiLCJwZGZPcGVuUGFyYW1zIiwiY3VycmVudFBhZ2VWaWV3IiwidG9wTGVmdCIsImludExlZnQiLCJpbnRUb3AiLCJ2aXNpYmxlUGFnZXMiLCJudW1WaXNpYmxlUGFnZXMiLCJuZXdDYWNoZVNpemUiLCJjb250YWluc0VsZW1lbnQiLCJmb2N1cyIsIl9nZXRDdXJyZW50VmlzaWJsZVBhZ2UiLCJnZXRWaXNpYmxlRWxlbWVudHMiLCJjbGVhbnVwIiwiX2NhbmNlbFJlbmRlcmluZyIsIl9lbnN1cmVQZGZQYWdlTG9hZGVkIiwiZm9yY2VSZW5kZXJpbmciLCJjdXJyZW50bHlWaXNpYmxlUGFnZXMiLCJzY3JvbGxBaGVhZCIsImdldFBhZ2VzT3ZlcnZpZXciLCJwYWdlc092ZXJ2aWV3IiwiaXNWYWxpZFNjcm9sbE1vZGUiLCJzY3JvbGxNb2RlIiwiaXNWYWxpZFNwcmVhZE1vZGUiLCJwYWdlcyIsInBhcml0eSIsInNwcmVhZCIsInNjcm9sbExlZnQiLCJjdXJyZW50SWQiLCJzdGlsbEZ1bGx5VmlzaWJsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO1FDVkE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2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QURBLGNBRUE3QyxRQUFRaXFCLGFBSFYsYUFJRTtBQUNBMUYsbUJBQVc7QUFBRTFoQixnQkFBRjtBQUFXSCxlQUFYO0FBQUEsU0FBWDZoQjtBQVR5QztBQURrQjs7QUFhL0QsMEJBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBdEI7QUFsQitCOztBQXFCakNFLHFCQUFtQjtBQUNqQixRQUFJLEtBQUosc0JBQStCO0FBRzdCLGFBQU8sS0FIc0Isc0JBR3RCLEVBQVA7QUFKZTs7QUFNakIsV0FBTyxNQU5VLGdCQU1WLEVBQVA7QUEzQitCOztBQThCakNDLDhCQUE0QjtBQUMxQixRQUFJLEtBQUosc0JBQStCO0FBQUE7QUFETDs7QUFJMUIsUUFBSXdGLFlBQVksS0FKVSxrQkFJMUI7QUFDQSxRQUFJQyxvQkFMc0IsS0FLMUI7O0FBRUEscUNBQWlDO0FBQy9CLFVBQUl6dUIsZUFBSixLQUF3QjtBQUFBO0FBRE87O0FBSS9CLFVBQUlBLFlBQUosV0FBMkI7QUFDekJ5dUIsNEJBRHlCLElBQ3pCQTtBQUR5QjtBQUpJO0FBUFA7O0FBZ0IxQixRQUFJLENBQUosbUJBQXdCO0FBQ3RCRCxrQkFBWXRCLGdCQURVLEVBQ3RCc0I7QUFqQndCOztBQW1CMUIsK0JBbkIwQixTQW1CMUI7QUFqRCtCOztBQUFBIiwiZmlsZSI6InBkZl92aWV3ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInBkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXJcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wicGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlclwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJwZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd19wZGZqc19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd19wZGZqc19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd19wZGZqc19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dfcGRmanNfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd19wZGZqc19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd19wZGZqc19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd19wZGZqc19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193X3BkZmpzX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dfcGRmanNfcmVxdWlyZV9fKF9fd19wZGZqc19yZXF1aXJlX18ucyA9IDApO1xuIiwiLyogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEFubm90YXRpb25MYXllckJ1aWxkZXIsXG4gIERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5LFxufSBmcm9tIFwiLi9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIuanNcIjtcbmltcG9ydCB7XG4gIERlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5LFxuICBUZXh0TGF5ZXJCdWlsZGVyLFxufSBmcm9tIFwiLi90ZXh0X2xheWVyX2J1aWxkZXIuanNcIjtcbmltcG9ydCB7IEV2ZW50QnVzLCBOdWxsTDEwbiwgUHJvZ3Jlc3NCYXIgfSBmcm9tIFwiLi91aV91dGlscy5qc1wiO1xuaW1wb3J0IHsgUERGTGlua1NlcnZpY2UsIFNpbXBsZUxpbmtTZXJ2aWNlIH0gZnJvbSBcIi4vcGRmX2xpbmtfc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgRG93bmxvYWRNYW5hZ2VyIH0gZnJvbSBcIi4vZG93bmxvYWRfbWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgR2VuZXJpY0wxMG4gfSBmcm9tIFwiLi9nZW5lcmljbDEwbi5qc1wiO1xuaW1wb3J0IHsgUERGRmluZENvbnRyb2xsZXIgfSBmcm9tIFwiLi9wZGZfZmluZF9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgeyBQREZIaXN0b3J5IH0gZnJvbSBcIi4vcGRmX2hpc3RvcnkuanNcIjtcbmltcG9ydCB7IFBERlBhZ2VWaWV3IH0gZnJvbSBcIi4vcGRmX3BhZ2Vfdmlldy5qc1wiO1xuaW1wb3J0IHsgUERGU2luZ2xlUGFnZVZpZXdlciB9IGZyb20gXCIuL3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIuanNcIjtcbmltcG9ydCB7IFBERlZpZXdlciB9IGZyb20gXCIuL3BkZl92aWV3ZXIuanNcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBwZGZqc1ZlcnNpb24gPSBQREZKU0Rldi5ldmFsKFwiQlVORExFX1ZFUlNJT05cIik7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmNvbnN0IHBkZmpzQnVpbGQgPSBQREZKU0Rldi5ldmFsKFwiQlVORExFX0JVSUxEXCIpO1xuXG5leHBvcnQge1xuICBQREZWaWV3ZXIsXG4gIFBERlNpbmdsZVBhZ2VWaWV3ZXIsXG4gIFBERlBhZ2VWaWV3LFxuICBQREZMaW5rU2VydmljZSxcbiAgU2ltcGxlTGlua1NlcnZpY2UsXG4gIFRleHRMYXllckJ1aWxkZXIsXG4gIERlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5LFxuICBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyLFxuICBEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSxcbiAgUERGSGlzdG9yeSxcbiAgUERGRmluZENvbnRyb2xsZXIsXG4gIEV2ZW50QnVzLFxuICBEb3dubG9hZE1hbmFnZXIsXG4gIFByb2dyZXNzQmFyLFxuICBHZW5lcmljTDEwbixcbiAgTnVsbEwxMG4sXG59O1xuIiwiLyogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEFubm90YXRpb25MYXllciB9IGZyb20gXCJwZGZqcy1saWJcIjtcbmltcG9ydCB7IE51bGxMMTBuIH0gZnJvbSBcIi4vdWlfdXRpbHMuanNcIjtcbmltcG9ydCB7IFNpbXBsZUxpbmtTZXJ2aWNlIH0gZnJvbSBcIi4vcGRmX2xpbmtfc2VydmljZS5qc1wiO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFubm90YXRpb25MYXllckJ1aWxkZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSBwYWdlRGl2XG4gKiBAcHJvcGVydHkge1BERlBhZ2V9IHBkZlBhZ2VcbiAqIEBwcm9wZXJ0eSB7QW5ub3RhdGlvblN0b3JhZ2V9IFthbm5vdGF0aW9uU3RvcmFnZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW1hZ2VSZXNvdXJjZXNQYXRoXSAtIFBhdGggZm9yIGltYWdlIHJlc291cmNlcywgbWFpbmx5XG4gKiAgIGZvciBhbm5vdGF0aW9uIGljb25zLiBJbmNsdWRlIHRyYWlsaW5nIHNsYXNoLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zXG4gKiBAcHJvcGVydHkge0lQREZMaW5rU2VydmljZX0gbGlua1NlcnZpY2VcbiAqIEBwcm9wZXJ0eSB7RG93bmxvYWRNYW5hZ2VyfSBkb3dubG9hZE1hbmFnZXJcbiAqIEBwcm9wZXJ0eSB7SUwxMG59IGwxMG4gLSBMb2NhbGl6YXRpb24gc2VydmljZS5cbiAqL1xuXG5jbGFzcyBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QW5ub3RhdGlvbkxheWVyQnVpbGRlck9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwYWdlRGl2LFxuICAgIHBkZlBhZ2UsXG4gICAgbGlua1NlcnZpY2UsXG4gICAgZG93bmxvYWRNYW5hZ2VyLFxuICAgIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCxcbiAgICBpbWFnZVJlc291cmNlc1BhdGggPSBcIlwiLFxuICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSB0cnVlLFxuICAgIGwxMG4gPSBOdWxsTDEwbixcbiAgfSkge1xuICAgIHRoaXMucGFnZURpdiA9IHBhZ2VEaXY7XG4gICAgdGhpcy5wZGZQYWdlID0gcGRmUGFnZTtcbiAgICB0aGlzLmxpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7XG4gICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBkb3dubG9hZE1hbmFnZXI7XG4gICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBpbWFnZVJlc291cmNlc1BhdGg7XG4gICAgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gcmVuZGVySW50ZXJhY3RpdmVGb3JtcztcbiAgICB0aGlzLmwxMG4gPSBsMTBuO1xuICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSBhbm5vdGF0aW9uU3RvcmFnZTtcblxuICAgIHRoaXMuZGl2ID0gbnVsbDtcbiAgICB0aGlzLl9jYW5jZWxsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhZ2VWaWV3cG9ydH0gdmlld3BvcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAoZGVmYXVsdCB2YWx1ZSBpcyAnZGlzcGxheScpXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHJlbmRlcmluZyBvZiB0aGVcbiAgICogICBhbm5vdGF0aW9ucyBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHJlbmRlcih2aWV3cG9ydCwgaW50ZW50ID0gXCJkaXNwbGF5XCIpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZQYWdlLmdldEFubm90YXRpb25zKHsgaW50ZW50IH0pLnRoZW4oYW5ub3RhdGlvbnMgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NhbmNlbGxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0LmNsb25lKHsgZG9udEZsaXA6IHRydWUgfSksXG4gICAgICAgIGRpdjogdGhpcy5kaXYsXG4gICAgICAgIGFubm90YXRpb25zLFxuICAgICAgICBwYWdlOiB0aGlzLnBkZlBhZ2UsXG4gICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogdGhpcy5pbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgICAgbGlua1NlcnZpY2U6IHRoaXMubGlua1NlcnZpY2UsXG4gICAgICAgIGRvd25sb2FkTWFuYWdlcjogdGhpcy5kb3dubG9hZE1hbmFnZXIsXG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlOiB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICAgIC8vIElmIGFuIGFubm90YXRpb25MYXllciBhbHJlYWR5IGV4aXN0cywgcmVmcmVzaCBpdHMgY2hpbGRyZW4nc1xuICAgICAgICAvLyB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcy5cbiAgICAgICAgQW5ub3RhdGlvbkxheWVyLnVwZGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhbiBhbm5vdGF0aW9uIGxheWVyIGRpdiBhbmQgcmVuZGVyIHRoZSBhbm5vdGF0aW9uc1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYW5ub3RhdGlvbi5cbiAgICAgICAgdGhpcy5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRpdi5jbGFzc05hbWUgPSBcImFubm90YXRpb25MYXllclwiO1xuICAgICAgICB0aGlzLnBhZ2VEaXYuYXBwZW5kQ2hpbGQodGhpcy5kaXYpO1xuICAgICAgICBwYXJhbWV0ZXJzLmRpdiA9IHRoaXMuZGl2O1xuXG4gICAgICAgIEFubm90YXRpb25MYXllci5yZW5kZXIocGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMubDEwbi50cmFuc2xhdGUodGhpcy5kaXYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5kaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgfVxufVxuXG4vKipcbiAqIEBpbXBsZW1lbnRzIElQREZBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5XG4gKi9cbmNsYXNzIERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IHBhZ2VEaXZcbiAgICogQHBhcmFtIHtQREZQYWdlfSBwZGZQYWdlXG4gICAqIEBwYXJhbSB7QW5ub3RhdGlvblN0b3JhZ2V9IFthbm5vdGF0aW9uU3RvcmFnZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtpbWFnZVJlc291cmNlc1BhdGhdIC0gUGF0aCBmb3IgaW1hZ2UgcmVzb3VyY2VzLCBtYWlubHlcbiAgICogICBmb3IgYW5ub3RhdGlvbiBpY29ucy4gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC5cbiAgICogQHBhcmFtIHtib29sZWFufSByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zXG4gICAqIEBwYXJhbSB7SUwxMG59IGwxMG5cbiAgICogQHJldHVybnMge0Fubm90YXRpb25MYXllckJ1aWxkZXJ9XG4gICAqL1xuICBjcmVhdGVBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKFxuICAgIHBhZ2VEaXYsXG4gICAgcGRmUGFnZSxcbiAgICBhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsXG4gICAgaW1hZ2VSZXNvdXJjZXNQYXRoID0gXCJcIixcbiAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gdHJ1ZSxcbiAgICBsMTBuID0gTnVsbEwxMG5cbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKHtcbiAgICAgIHBhZ2VEaXYsXG4gICAgICBwZGZQYWdlLFxuICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoLFxuICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgIGxpbmtTZXJ2aWNlOiBuZXcgU2ltcGxlTGlua1NlcnZpY2UoKSxcbiAgICAgIGwxMG4sXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyLCBEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTYgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWxzIG1vZHVsZSwgX19ub25fd2VicGFja19yZXF1aXJlX18gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmxldCBwZGZqc0xpYjtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvd1tcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCJdKSB7XG4gIHBkZmpzTGliID0gd2luZG93W1wicGRmanMtZGlzdC9idWlsZC9wZGZcIl07XG59IGVsc2Uge1xuICBwZGZqc0xpYiA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi4vYnVpbGQvcGRmLmpzXCIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBwZGZqc0xpYjtcbiIsIi8qIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBDU1NfVU5JVFMgPSA5Ni4wIC8gNzIuMDtcbmNvbnN0IERFRkFVTFRfU0NBTEVfVkFMVUUgPSBcImF1dG9cIjtcbmNvbnN0IERFRkFVTFRfU0NBTEUgPSAxLjA7XG5jb25zdCBNSU5fU0NBTEUgPSAwLjE7XG5jb25zdCBNQVhfU0NBTEUgPSAxMC4wO1xuY29uc3QgVU5LTk9XTl9TQ0FMRSA9IDA7XG5jb25zdCBNQVhfQVVUT19TQ0FMRSA9IDEuMjU7XG5jb25zdCBTQ1JPTExCQVJfUEFERElORyA9IDQwO1xuY29uc3QgVkVSVElDQUxfUEFERElORyA9IDU7XG5cbmNvbnN0IFByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IHtcbiAgVU5LTk9XTjogMCxcbiAgTk9STUFMOiAxLFxuICBDSEFOR0lORzogMixcbiAgRlVMTFNDUkVFTjogMyxcbn07XG5cbmNvbnN0IFJlbmRlcmVyVHlwZSA9IHtcbiAgQ0FOVkFTOiBcImNhbnZhc1wiLFxuICBTVkc6IFwic3ZnXCIsXG59O1xuXG5jb25zdCBUZXh0TGF5ZXJNb2RlID0ge1xuICBESVNBQkxFOiAwLFxuICBFTkFCTEU6IDEsXG4gIEVOQUJMRV9FTkhBTkNFOiAyLFxufTtcblxuY29uc3QgU2Nyb2xsTW9kZSA9IHtcbiAgVU5LTk9XTjogLTEsXG4gIFZFUlRJQ0FMOiAwLCAvLyBEZWZhdWx0IHZhbHVlLlxuICBIT1JJWk9OVEFMOiAxLFxuICBXUkFQUEVEOiAyLFxufTtcblxuY29uc3QgU3ByZWFkTW9kZSA9IHtcbiAgVU5LTk9XTjogLTEsXG4gIE5PTkU6IDAsIC8vIERlZmF1bHQgdmFsdWUuXG4gIE9ERDogMSxcbiAgRVZFTjogMixcbn07XG5cbi8vIFVzZWQgYnkgYFBERlZpZXdlckFwcGxpY2F0aW9uYCwgYW5kIGJ5IHRoZSBBUEkgdW5pdC10ZXN0cy5cbmNvbnN0IEF1dG9QcmludFJlZ0V4cCA9IC9cXGJwcmludFxccypcXCgvO1xuXG4vLyBSZXBsYWNlcyB7e2FyZ3VtZW50c319IHdpdGggdGhlaXIgdmFsdWVzLlxuZnVuY3Rpb24gZm9ybWF0TDEwblZhbHVlKHRleHQsIGFyZ3MpIHtcbiAgaWYgKCFhcmdzKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFx7XFx7XFxzKihcXHcrKVxccypcXH1cXH0vZywgKGFsbCwgbmFtZSkgPT4ge1xuICAgIHJldHVybiBuYW1lIGluIGFyZ3MgPyBhcmdzW25hbWVdIDogXCJ7e1wiICsgbmFtZSArIFwifX1cIjtcbiAgfSk7XG59XG5cbi8qKlxuICogTm8tb3AgaW1wbGVtZW50YXRpb24gb2YgdGhlIGxvY2FsaXphdGlvbiBzZXJ2aWNlLlxuICogQGltcGxlbWVudHMge0lMMTBufVxuICovXG5jb25zdCBOdWxsTDEwbiA9IHtcbiAgYXN5bmMgZ2V0TGFuZ3VhZ2UoKSB7XG4gICAgcmV0dXJuIFwiZW4tdXNcIjtcbiAgfSxcblxuICBhc3luYyBnZXREaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwibHRyXCI7XG4gIH0sXG5cbiAgYXN5bmMgZ2V0KHByb3BlcnR5LCBhcmdzLCBmYWxsYmFjaykge1xuICAgIHJldHVybiBmb3JtYXRMMTBuVmFsdWUoZmFsbGJhY2ssIGFyZ3MpO1xuICB9LFxuXG4gIGFzeW5jIHRyYW5zbGF0ZShlbGVtZW50KSB7fSxcbn07XG5cbi8qKlxuICogUmV0dXJucyBzY2FsZSBmYWN0b3IgZm9yIHRoZSBjYW52YXMuIEl0IG1ha2VzIHNlbnNlIGZvciB0aGUgSGlEUEkgZGlzcGxheXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgb2JqZWN0IHdpdGggaG9yaXpvbnRhbCAoc3gpIGFuZCB2ZXJ0aWNhbCAoc3kpXG4gKiAgICAgICAgICAgICAgICAgICBzY2FsZXMuIFRoZSBzY2FsZWQgcHJvcGVydHkgaXMgc2V0IHRvIGZhbHNlIGlmIHNjYWxpbmcgaXNcbiAqICAgICAgICAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgdHJ1ZSBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIGdldE91dHB1dFNjYWxlKGN0eCkge1xuICBjb25zdCBkZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgY29uc3QgYmFja2luZ1N0b3JlUmF0aW8gPVxuICAgIGN0eC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgY3R4Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjdHgubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgY3R4Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgY3R4LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAxO1xuICBjb25zdCBwaXhlbFJhdGlvID0gZGV2aWNlUGl4ZWxSYXRpbyAvIGJhY2tpbmdTdG9yZVJhdGlvO1xuICByZXR1cm4ge1xuICAgIHN4OiBwaXhlbFJhdGlvLFxuICAgIHN5OiBwaXhlbFJhdGlvLFxuICAgIHNjYWxlZDogcGl4ZWxSYXRpbyAhPT0gMSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTY3JvbGxzIHNwZWNpZmllZCBlbGVtZW50IGludG8gdmlldyBvZiBpdHMgcGFyZW50LlxuICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBiZSB2aXNpYmxlLlxuICogQHBhcmFtIHtPYmplY3R9IHNwb3QgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25hbCB0b3AgYW5kIGxlZnQgcHJvcGVydGllcyxcbiAqICAgc3BlY2lmeWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IGVkZ2UuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzIC0gSWdub3JlIGVsZW1lbnRzIHRoYXQgaGF2ZVxuICogICB0aGUgQ1NTIHJ1bGUgYG92ZXJmbG93OiBoaWRkZW47YCBzZXQuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLlxuICovXG5mdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhlbGVtZW50LCBzcG90LCBza2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyA9IGZhbHNlKSB7XG4gIC8vIEFzc3VtaW5nIG9mZnNldFBhcmVudCBpcyBhdmFpbGFibGUgKGl0J3Mgbm90IGF2YWlsYWJsZSB3aGVuIHZpZXdlciBpcyBpblxuICAvLyBoaWRkZW4gaWZyYW1lIG9yIG9iamVjdCkuIFdlIGhhdmUgdG8gc2Nyb2xsOiBpZiB0aGUgb2Zmc2V0UGFyZW50IGlzIG5vdCBzZXRcbiAgLy8gcHJvZHVjaW5nIHRoZSBlcnJvci4gU2VlIGFsc28gYW5pbWF0aW9uU3RhcnRlZC5cbiAgbGV0IHBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuICBpZiAoIXBhcmVudCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJvZmZzZXRQYXJlbnQgaXMgbm90IHNldCAtLSBjYW5ub3Qgc2Nyb2xsXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgb2Zmc2V0WSA9IGVsZW1lbnQub2Zmc2V0VG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIGxldCBvZmZzZXRYID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICB3aGlsZSAoXG4gICAgKHBhcmVudC5jbGllbnRIZWlnaHQgPT09IHBhcmVudC5zY3JvbGxIZWlnaHQgJiZcbiAgICAgIHBhcmVudC5jbGllbnRXaWR0aCA9PT0gcGFyZW50LnNjcm9sbFdpZHRoKSB8fFxuICAgIChza2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyAmJlxuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpLm92ZXJmbG93ID09PSBcImhpZGRlblwiKVxuICApIHtcbiAgICBpZiAocGFyZW50LmRhdGFzZXQuX3NjYWxlWSkge1xuICAgICAgb2Zmc2V0WSAvPSBwYXJlbnQuZGF0YXNldC5fc2NhbGVZO1xuICAgICAgb2Zmc2V0WCAvPSBwYXJlbnQuZGF0YXNldC5fc2NhbGVYO1xuICAgIH1cbiAgICBvZmZzZXRZICs9IHBhcmVudC5vZmZzZXRUb3A7XG4gICAgb2Zmc2V0WCArPSBwYXJlbnQub2Zmc2V0TGVmdDtcbiAgICBwYXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50O1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICByZXR1cm47IC8vIG5vIG5lZWQgdG8gc2Nyb2xsXG4gICAgfVxuICB9XG4gIGlmIChzcG90KSB7XG4gICAgaWYgKHNwb3QudG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9mZnNldFkgKz0gc3BvdC50b3A7XG4gICAgfVxuICAgIGlmIChzcG90LmxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb2Zmc2V0WCArPSBzcG90LmxlZnQ7XG4gICAgICBwYXJlbnQuc2Nyb2xsTGVmdCA9IG9mZnNldFg7XG4gICAgfVxuICB9XG4gIHBhcmVudC5zY3JvbGxUb3AgPSBvZmZzZXRZO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBzdGFydCBtb25pdG9yaW5nIHRoZSBzY3JvbGwgZXZlbnQgYW5kIGNvbnZlcnRpbmcgdGhlbSBpbnRvXG4gKiBQREYuanMgZnJpZW5kbHkgb25lOiB3aXRoIHNjcm9sbCBkZWJvdW5jZSBhbmQgc2Nyb2xsIGRpcmVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gd2F0Y2hTY3JvbGwodmlld0FyZWFFbGVtZW50LCBjYWxsYmFjaykge1xuICBjb25zdCBkZWJvdW5jZVNjcm9sbCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICBpZiAockFGKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHNjaGVkdWxlIGFuIGludm9jYXRpb24gb2Ygc2Nyb2xsIGZvciBuZXh0IGFuaW1hdGlvbiBmcmFtZS5cbiAgICByQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIHZpZXdBcmVhRWxlbWVudFNjcm9sbGVkKCkge1xuICAgICAgckFGID0gbnVsbDtcblxuICAgICAgY29uc3QgY3VycmVudFggPSB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIGNvbnN0IGxhc3RYID0gc3RhdGUubGFzdFg7XG4gICAgICBpZiAoY3VycmVudFggIT09IGxhc3RYKSB7XG4gICAgICAgIHN0YXRlLnJpZ2h0ID0gY3VycmVudFggPiBsYXN0WDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxhc3RYID0gY3VycmVudFg7XG4gICAgICBjb25zdCBjdXJyZW50WSA9IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICBjb25zdCBsYXN0WSA9IHN0YXRlLmxhc3RZO1xuICAgICAgaWYgKGN1cnJlbnRZICE9PSBsYXN0WSkge1xuICAgICAgICBzdGF0ZS5kb3duID0gY3VycmVudFkgPiBsYXN0WTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxhc3RZID0gY3VycmVudFk7XG4gICAgICBjYWxsYmFjayhzdGF0ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgcmlnaHQ6IHRydWUsXG4gICAgZG93bjogdHJ1ZSxcbiAgICBsYXN0WDogdmlld0FyZWFFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgbGFzdFk6IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxUb3AsXG4gICAgX2V2ZW50SGFuZGxlcjogZGVib3VuY2VTY3JvbGwsXG4gIH07XG5cbiAgbGV0IHJBRiA9IG51bGw7XG4gIHZpZXdBcmVhRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGRlYm91bmNlU2Nyb2xsLCB0cnVlKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBxdWVyeSBzdHJpbmcgKGUuZy4gP3BhcmFtMT12YWx1ZSZwYXJtMj0uLi4pLlxuICovXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KSB7XG4gIGNvbnN0IHBhcnRzID0gcXVlcnkuc3BsaXQoXCImXCIpO1xuICBjb25zdCBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGxldCBpID0gMCwgaWkgPSBwYXJ0cy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgY29uc3QgcGFyYW0gPSBwYXJ0c1tpXS5zcGxpdChcIj1cIik7XG4gICAgY29uc3Qga2V5ID0gcGFyYW1bMF0udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtLmxlbmd0aCA+IDEgPyBwYXJhbVsxXSA6IG51bGw7XG4gICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChrZXkpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuLyoqXG4gKiBVc2UgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaXRlbSBpbiBhIGdpdmVuIGFycmF5IHdoaWNoXG4gKiBwYXNzZXMgYSBnaXZlbiBjb25kaXRpb24uIFRoZSBpdGVtcyBhcmUgZXhwZWN0ZWQgdG8gYmUgc29ydGVkIGluIHRoZSBzZW5zZVxuICogdGhhdCBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUgZm9yIG9uZSBpdGVtIGluIHRoZSBhcnJheSwgdGhlbiBpdCBpcyBhbHNvIHRydWVcbiAqIGZvciBhbGwgZm9sbG93aW5nIGl0ZW1zLlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IHRvIHBhc3MgdGhlIHRlc3QsXG4gKiAgICAgICAgICAgICAgICAgICBvciB8aXRlbXMubGVuZ3RofCBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0oaXRlbXMsIGNvbmRpdGlvbikge1xuICBsZXQgbWluSW5kZXggPSAwO1xuICBsZXQgbWF4SW5kZXggPSBpdGVtcy5sZW5ndGggLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8IDAgfHwgIWNvbmRpdGlvbihpdGVtc1ttYXhJbmRleF0pKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDtcbiAgfVxuICBpZiAoY29uZGl0aW9uKGl0ZW1zW21pbkluZGV4XSkpIHtcbiAgICByZXR1cm4gbWluSW5kZXg7XG4gIH1cblxuICB3aGlsZSAobWluSW5kZXggPCBtYXhJbmRleCkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IChtaW5JbmRleCArIG1heEluZGV4KSA+PiAxO1xuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gaXRlbXNbY3VycmVudEluZGV4XTtcbiAgICBpZiAoY29uZGl0aW9uKGN1cnJlbnRJdGVtKSkge1xuICAgICAgbWF4SW5kZXggPSBjdXJyZW50SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbkluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbkluZGV4OyAvKiA9PT0gbWF4SW5kZXggKi9cbn1cblxuLyoqXG4gKiAgQXBwcm94aW1hdGVzIGZsb2F0IG51bWJlciBhcyBhIGZyYWN0aW9uIHVzaW5nIEZhcmV5IHNlcXVlbmNlIChtYXggb3JkZXJcbiAqICBvZiA4KS5cbiAqICBAcGFyYW0ge251bWJlcn0geCAtIFBvc2l0aXZlIGZsb2F0IG51bWJlci5cbiAqICBAcmV0dXJucyB7QXJyYXl9IEVzdGltYXRlZCBmcmFjdGlvbjogdGhlIGZpcnN0IGFycmF5IGl0ZW0gaXMgYSBudW1lcmF0b3IsXG4gKiAgICAgICAgICAgICAgICAgICB0aGUgc2Vjb25kIG9uZSBpcyBhIGRlbm9taW5hdG9yLlxuICovXG5mdW5jdGlvbiBhcHByb3hpbWF0ZUZyYWN0aW9uKHgpIHtcbiAgLy8gRmFzdCBwYXRocyBmb3IgaW50IG51bWJlcnMgb3IgdGhlaXIgaW52ZXJzaW9ucy5cbiAgaWYgKE1hdGguZmxvb3IoeCkgPT09IHgpIHtcbiAgICByZXR1cm4gW3gsIDFdO1xuICB9XG4gIGNvbnN0IHhpbnYgPSAxIC8geDtcbiAgY29uc3QgbGltaXQgPSA4O1xuICBpZiAoeGludiA+IGxpbWl0KSB7XG4gICAgcmV0dXJuIFsxLCBsaW1pdF07XG4gIH0gZWxzZSBpZiAoTWF0aC5mbG9vcih4aW52KSA9PT0geGludikge1xuICAgIHJldHVybiBbMSwgeGludl07XG4gIH1cblxuICBjb25zdCB4XyA9IHggPiAxID8geGludiA6IHg7XG4gIC8vIGEvYiBhbmQgYy9kIGFyZSBuZWlnaGJvdXJzIGluIEZhcmV5IHNlcXVlbmNlLlxuICBsZXQgYSA9IDAsXG4gICAgYiA9IDEsXG4gICAgYyA9IDEsXG4gICAgZCA9IDE7XG4gIC8vIExpbWl0aW5nIHNlYXJjaCB0byBvcmRlciA4LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIEdlbmVyYXRpbmcgbmV4dCB0ZXJtIGluIHNlcXVlbmNlIChvcmRlciBvZiBxKS5cbiAgICBjb25zdCBwID0gYSArIGMsXG4gICAgICBxID0gYiArIGQ7XG4gICAgaWYgKHEgPiBsaW1pdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICh4XyA8PSBwIC8gcSkge1xuICAgICAgYyA9IHA7XG4gICAgICBkID0gcTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IHA7XG4gICAgICBiID0gcTtcbiAgICB9XG4gIH1cbiAgbGV0IHJlc3VsdDtcbiAgLy8gU2VsZWN0IGNsb3Nlc3Qgb2YgdGhlIG5laWdoYm91cnMgdG8geC5cbiAgaWYgKHhfIC0gYSAvIGIgPCBjIC8gZCAtIHhfKSB7XG4gICAgcmVzdWx0ID0geF8gPT09IHggPyBbYSwgYl0gOiBbYiwgYV07XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0geF8gPT09IHggPyBbYywgZF0gOiBbZCwgY107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcm91bmRUb0RpdmlkZSh4LCBkaXYpIHtcbiAgY29uc3QgciA9IHggJSBkaXY7XG4gIHJldHVybiByID09PSAwID8geCA6IE1hdGgucm91bmQoeCAtIHIgKyBkaXYpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBwYWdlLCBjb252ZXJ0ZWQgZnJvbSBQREYgdW5pdHMgdG8gaW5jaGVzLlxuICogQHBhcmFtIHtPYmplY3R9IEFuIE9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzOiB7QXJyYXl9IGB2aWV3YCxcbiAqICAge251bWJlcn0gYHVzZXJVbml0YCwgYW5kIHtudW1iZXJ9IGByb3RhdGVgLlxuICogQHJldHVybnMge09iamVjdH0gQW4gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXM6IHtudW1iZXJ9IGB3aWR0aGBcbiAqICAgYW5kIHtudW1iZXJ9IGBoZWlnaHRgLCBnaXZlbiBpbiBpbmNoZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhZ2VTaXplSW5jaGVzKHsgdmlldywgdXNlclVuaXQsIHJvdGF0ZSB9KSB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSB2aWV3O1xuICAvLyBXZSBuZWVkIHRvIHRha2UgdGhlIHBhZ2Ugcm90YXRpb24gaW50byBhY2NvdW50IGFzIHdlbGwuXG4gIGNvbnN0IGNoYW5nZU9yaWVudGF0aW9uID0gcm90YXRlICUgMTgwICE9PSAwO1xuXG4gIGNvbnN0IHdpZHRoID0gKCh4MiAtIHgxKSAvIDcyKSAqIHVzZXJVbml0O1xuICBjb25zdCBoZWlnaHQgPSAoKHkyIC0geTEpIC8gNzIpICogdXNlclVuaXQ7XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogY2hhbmdlT3JpZW50YXRpb24gPyBoZWlnaHQgOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGNoYW5nZU9yaWVudGF0aW9uID8gd2lkdGggOiBoZWlnaHQsXG4gIH07XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBnZXRWaXNpYmxlRWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gaW5pdGlhbCBndWVzcyBhdCB0aGUgZmlyc3QgdmlzaWJsZSBlbGVtZW50XG4gKiBAcGFyYW0ge0FycmF5fSB2aWV3cyAtIGFycmF5IG9mIHBhZ2VzLCBpbnRvIHdoaWNoIGBpbmRleGAgaXMgYW4gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSB0aGUgdG9wIG9mIHRoZSBzY3JvbGwgcGFuZVxuICogQHJldHVybnMge251bWJlcn0gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBpbmRleGAgdGhhdCBpcyBkZWZpbml0ZWx5IGF0IG9yXG4gKiAgIGJlZm9yZSB0aGUgZmlyc3QgdmlzaWJsZSBlbGVtZW50IGluIGB2aWV3c2AsIGJ1dCBub3QgYnkgdG9vIG11Y2guIChVc3VhbGx5LFxuICogICB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGZpcnN0IHBhcnRpYWxseSB2aXNpYmxlIHJvdyBpblxuICogICBgdmlld3NgLCBhbHRob3VnaCBzb21ldGltZXMgaXQgZ29lcyBiYWNrIG9uZSByb3cgZnVydGhlci4pXG4gKi9cbmZ1bmN0aW9uIGJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cyhpbmRleCwgdmlld3MsIHRvcCkge1xuICAvLyBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0ncyBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGlucHV0IGlzIG9yZGVyZWQsIHdpdGggb25seVxuICAvLyBvbmUgaW5kZXggd2hlcmUgdGhlIGNvbmRpdGlvbnMgZmxpcHMgZnJvbSBmYWxzZSB0byB0cnVlOiBbZmFsc2UgLi4uLFxuICAvLyB0cnVlLi4uXS4gV2l0aCB2ZXJ0aWNhbCBzY3JvbGxpbmcgYW5kIHNwcmVhZHMsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmVcbiAgLy8gW2ZhbHNlIC4uLiwgdHJ1ZSwgZmFsc2UsIHRydWUgLi4uXS4gV2l0aCB3cmFwcGVkIHNjcm9sbGluZyB3ZSBjYW4gaGF2ZSBhXG4gIC8vIHNpbWlsYXIgc2VxdWVuY2UsIHdpdGggbWFueSBtb3JlIG1peGVkIHRydWUgYW5kIGZhbHNlIGluIHRoZSBtaWRkbGUuXG4gIC8vXG4gIC8vIFNvIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBiaW5hcnkgc2VhcmNoIHlpZWxkcyB0aGUgaW5kZXggb2YgdGhlXG4gIC8vIGZpcnN0IHZpc2libGUgZWxlbWVudC4gSXQgY291bGQgaGF2ZSBiZWVuIGFueSBvZiB0aGUgb3RoZXIgdmlzaWJsZSBlbGVtZW50c1xuICAvLyB0aGF0IHdlcmUgcHJlY2VkZWQgYnkgYSBoaWRkZW4gZWxlbWVudC5cblxuICAvLyBPZiBjb3Vyc2UsIGlmIGVpdGhlciB0aGlzIGVsZW1lbnQgb3IgdGhlIHByZXZpb3VzIChoaWRkZW4pIGVsZW1lbnQgaXMgYWxzb1xuICAvLyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlcmUncyBub3RoaW5nIHRvIHdvcnJ5IGFib3V0LlxuICBpZiAoaW5kZXggPCAyKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLy8gVGhhdCBhc2lkZSwgdGhlIHBvc3NpYmxlIGNhc2VzIGFyZSByZXByZXNlbnRlZCBiZWxvdy5cbiAgLy9cbiAgLy8gICAgICoqKiogID0gZnVsbHkgaGlkZGVuXG4gIC8vICAgICBBKkIqICA9IG1peCBvZiBwYXJ0aWFsbHkgdmlzaWJsZSBhbmQvb3IgaGlkZGVuIHBhZ2VzXG4gIC8vICAgICBDREVGICA9IGZ1bGx5IHZpc2libGVcbiAgLy9cbiAgLy8gKDEpIEJpbmFyeSBzZWFyY2ggY291bGQgaGF2ZSByZXR1cm5lZCBBLCBpbiB3aGljaCBjYXNlIHdlIGNhbiBzdG9wLlxuICAvLyAoMikgQmluYXJ5IHNlYXJjaCBjb3VsZCBhbHNvIGhhdmUgcmV0dXJuZWQgQiwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvXG4gIC8vIGNoZWNrIHRoZSB3aG9sZSByb3cuXG4gIC8vICgzKSBCaW5hcnkgc2VhcmNoIGNvdWxkIGFsc28gaGF2ZSByZXR1cm5lZCBDLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG9cbiAgLy8gY2hlY2sgdGhlIHdob2xlIHByZXZpb3VzIHJvdy5cbiAgLy9cbiAgLy8gVGhlcmUncyBvbmUgb3RoZXIgcG9zc2liaWxpdHk6XG4gIC8vXG4gIC8vICAgICAqKioqICA9IGZ1bGx5IGhpZGRlblxuICAvLyAgICAgQUJDRCAgPSBtaXggb2YgZnVsbHkgYW5kL29yIHBhcnRpYWxseSB2aXNpYmxlIHBhZ2VzXG4gIC8vXG4gIC8vICg0KSBCaW5hcnkgc2VhcmNoIGNvdWxkIG9ubHkgaGF2ZSByZXR1cm5lZCBBLlxuXG4gIC8vIEluaXRpYWxseSBhc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCByb3dcbiAgLy8gKGNhc2UgMSwgMiwgb3IgNCksIHdoaWNoIG1lYW5zIGZpbmRpbmcgYSBwYWdlIHRoYXQgaXMgYWJvdmUgdGhlIGN1cnJlbnRcbiAgLy8gcGFnZSdzIHRvcC4gSWYgdGhlIGZvdW5kIHBhZ2UgaXMgcGFydGlhbGx5IHZpc2libGUsIHdlJ3JlIGRlZmluaXRlbHkgbm90IGluXG4gIC8vIGNhc2UgMywgYW5kIHRoaXMgYXNzdW1wdGlvbiBpcyBjb3JyZWN0LlxuICBsZXQgZWx0ID0gdmlld3NbaW5kZXhdLmRpdjtcbiAgbGV0IHBhZ2VUb3AgPSBlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcDtcblxuICBpZiAocGFnZVRvcCA+PSB0b3ApIHtcbiAgICAvLyBUaGUgZm91bmQgcGFnZSBpcyBmdWxseSB2aXNpYmxlLCBzbyB3ZSdyZSBhY3R1YWxseSBlaXRoZXIgaW4gY2FzZSAzIG9yIDQsXG4gICAgLy8gYW5kIHVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gd2l0aG91dFxuICAgIC8vIHNjYW5uaW5nIHRoZSBlbnRpcmUgcHJldmlvdXMgcm93LCBzbyB3ZSBqdXN0IGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGF0XG4gICAgLy8gd2UgZG8gbmVlZCB0byBiYWNrdHJhY2sgdG8gdGhhdCByb3cuIEluIGJvdGggY2FzZXMsIHRoZSBwcmV2aW91cyBwYWdlIGlzXG4gICAgLy8gaW4gdGhlIHByZXZpb3VzIHJvdywgc28gdXNlIGl0cyB0b3AgaW5zdGVhZC5cbiAgICBlbHQgPSB2aWV3c1tpbmRleCAtIDFdLmRpdjtcbiAgICBwYWdlVG9wID0gZWx0Lm9mZnNldFRvcCArIGVsdC5jbGllbnRUb3A7XG4gIH1cblxuICAvLyBOb3cgd2UgYmFja3RyYWNrIHRvIHRoZSBmaXJzdCBwYWdlIHRoYXQgc3RpbGwgaGFzIGl0cyBib3R0b20gYmVsb3dcbiAgLy8gYHBhZ2VUb3BgLCB3aGljaCBpcyB0aGUgdG9wIG9mIGEgcGFnZSBpbiB0aGUgZmlyc3QgdmlzaWJsZSByb3cgKHVubGVzc1xuICAvLyB3ZSdyZSBpbiBjYXNlIDQsIGluIHdoaWNoIGNhc2UgaXQncyB0aGUgcm93IGJlZm9yZSB0aGF0KS5cbiAgLy8gYGluZGV4YCBpcyBmb3VuZCBieSBiaW5hcnkgc2VhcmNoLCBzbyB0aGUgcGFnZSBhdCBgaW5kZXggLSAxYCBpc1xuICAvLyBpbnZpc2libGUgYW5kIHdlIGNhbiBzdGFydCBsb29raW5nIGZvciBwb3RlbnRpYWxseSB2aXNpYmxlIHBhZ2VzIGZyb21cbiAgLy8gYGluZGV4IC0gMmAuIChIb3dldmVyLCBpZiB0aGlzIGxvb3AgdGVybWluYXRlcyBvbiBpdHMgZmlyc3QgaXRlcmF0aW9uLFxuICAvLyB3aGljaCBpcyB0aGUgY2FzZSB3aGVuIHBhZ2VzIGFyZSBzdGFja2VkIHZlcnRpY2FsbHksIGBpbmRleGAgc2hvdWxkIHJlbWFpblxuICAvLyB1bmNoYW5nZWQsIHNvIHdlIHVzZSBhIGRpc3RpbmN0IGxvb3AgdmFyaWFibGUuKVxuICBmb3IgKGxldCBpID0gaW5kZXggLSAyOyBpID49IDA7IC0taSkge1xuICAgIGVsdCA9IHZpZXdzW2ldLmRpdjtcbiAgICBpZiAoZWx0Lm9mZnNldFRvcCArIGVsdC5jbGllbnRUb3AgKyBlbHQuY2xpZW50SGVpZ2h0IDw9IHBhZ2VUb3ApIHtcbiAgICAgIC8vIFdlIGhhdmUgcmVhY2hlZCB0aGUgcHJldmlvdXMgcm93LCBzbyBzdG9wIG5vdy5cbiAgICAgIC8vIFRoaXMgbG9vcCBpcyBleHBlY3RlZCB0byB0ZXJtaW5hdGUgcmVsYXRpdmVseSBxdWlja2x5IGJlY2F1c2UgdGhlXG4gICAgICAvLyBudW1iZXIgb2YgcGFnZXMgcGVyIHJvdyBpcyBleHBlY3RlZCB0byBiZSBzbWFsbC5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpbmRleCA9IGk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIEdlbmVyaWMgaGVscGVyIHRvIGZpbmQgb3V0IHdoYXQgZWxlbWVudHMgYXJlIHZpc2libGUgd2l0aGluIGEgc2Nyb2xsIHBhbmUuXG4gKlxuICogV2VsbCwgcHJldHR5IGdlbmVyaWMuIFRoZXJlIGFyZSBzb21lIGFzc3VtcHRpb25zIHBsYWNlZCBvbiB0aGUgZWxlbWVudHNcbiAqIHJlZmVyZW5jZWQgYnkgYHZpZXdzYDpcbiAqICAgLSBJZiBgaG9yaXpvbnRhbGAsIG5vIGxlZnQgb2YgYW55IGVhcmxpZXIgZWxlbWVudCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlXG4gKiAgICAgbGVmdCBvZiBhbnkgbGF0ZXIgZWxlbWVudC5cbiAqICAgLSBPdGhlcndpc2UsIGB2aWV3c2AgY2FuIGJlIHNwbGl0IGludG8gY29udGlndW91cyByb3dzIHdoZXJlLCB3aXRoaW4gYSByb3csXG4gKiAgICAgbm8gdG9wIG9mIGFueSBlbGVtZW50IGlzIGJlbG93IHRoZSBib3R0b20gb2YgYW55IG90aGVyIGVsZW1lbnQsIGFuZFxuICogICAgIGJldHdlZW4gcm93cywgbm8gYm90dG9tIG9mIGFueSBlbGVtZW50IGluIGFuIGVhcmxpZXIgcm93IGlzIGJlbG93IHRoZVxuICogICAgIHRvcCBvZiBhbnkgZWxlbWVudCBpbiBhIGxhdGVyIHJvdy5cbiAqXG4gKiAoSGVyZSwgdG9wLCBsZWZ0LCBldGMuIGFsbCByZWZlciB0byB0aGUgcGFkZGluZyBlZGdlIG9mIHRoZSBlbGVtZW50IGluXG4gKiBxdWVzdGlvbi4gRm9yIHBhZ2VzLCB0aGF0IGVuZHMgdXAgYmVpbmcgZXF1aXZhbGVudCB0byB0aGUgYm91bmRpbmcgYm94IG9mIHRoZVxuICogcmVuZGVyaW5nIGNhbnZhcy4gRWFybGllciBhbmQgbGF0ZXIgcmVmZXIgdG8gaW5kZXggaW4gYHZpZXdzYCwgbm90IHBhZ2VcbiAqIGxheW91dC4pXG4gKlxuICogQHBhcmFtIHNjcm9sbEVsIHtIVE1MRWxlbWVudH0gLSBhIGNvbnRhaW5lciB0aGF0IGNhbiBwb3NzaWJseSBzY3JvbGxcbiAqIEBwYXJhbSB2aWV3cyB7QXJyYXl9IC0gb2JqZWN0cyB3aXRoIGEgYGRpdmAgcHJvcGVydHkgdGhhdCBjb250YWlucyBhblxuICogICBIVE1MRWxlbWVudCwgd2hpY2ggc2hvdWxkIGFsbCBiZSBkZXNjZW5kZW50cyBvZiBgc2Nyb2xsRWxgIHNhdGlzZnlpbmcgdGhlXG4gKiAgIGFib3ZlIGxheW91dCBhc3N1bXB0aW9uc1xuICogQHBhcmFtIHNvcnRCeVZpc2liaWxpdHkge2Jvb2xlYW59IC0gaWYgdHJ1ZSwgdGhlIHJldHVybmVkIGVsZW1lbnRzIGFyZSBzb3J0ZWRcbiAqICAgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGUgcGVyY2VudCBvZiB0aGVpciBwYWRkaW5nIGJveCB0aGF0IGlzIHZpc2libGVcbiAqIEBwYXJhbSBob3Jpem9udGFsIHtib29sZWFufSAtIGlmIHRydWUsIHRoZSBlbGVtZW50cyBhcmUgYXNzdW1lZCB0byBiZSBsYWlkXG4gKiAgIG91dCBob3Jpem9udGFsbHkgaW5zdGVhZCBvZiB2ZXJ0aWNhbGx5XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBgeyBmaXJzdCwgbGFzdCwgdmlld3M6IFt7IGlkLCB4LCB5LCB2aWV3LCBwZXJjZW50IH1dIH1gXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFbGVtZW50cyhcbiAgc2Nyb2xsRWwsXG4gIHZpZXdzLFxuICBzb3J0QnlWaXNpYmlsaXR5ID0gZmFsc2UsXG4gIGhvcml6b250YWwgPSBmYWxzZVxuKSB7XG4gIGNvbnN0IHRvcCA9IHNjcm9sbEVsLnNjcm9sbFRvcCxcbiAgICBib3R0b20gPSB0b3AgKyBzY3JvbGxFbC5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IGxlZnQgPSBzY3JvbGxFbC5zY3JvbGxMZWZ0LFxuICAgIHJpZ2h0ID0gbGVmdCArIHNjcm9sbEVsLmNsaWVudFdpZHRoO1xuXG4gIC8vIFRocm91Z2hvdXQgdGhpcyBcImdlbmVyaWNcIiBmdW5jdGlvbiwgY29tbWVudHMgd2lsbCBhc3N1bWUgd2UncmUgd29ya2luZyB3aXRoXG4gIC8vIFBERiBkb2N1bWVudCBwYWdlcywgd2hpY2ggaXMgdGhlIG1vc3QgaW1wb3J0YW50IGFuZCBjb21wbGV4IGNhc2UuIEluIHRoaXNcbiAgLy8gY2FzZSwgdGhlIHZpc2libGUgZWxlbWVudHMgd2UncmUgYWN0dWFsbHkgaW50ZXJlc3RlZCBpcyB0aGUgcGFnZSBjYW52YXMsXG4gIC8vIHdoaWNoIGlzIGNvbnRhaW5lZCBpbiBhIHdyYXBwZXIgd2hpY2ggYWRkcyBubyBwYWRkaW5nL2JvcmRlci9tYXJnaW4sIHdoaWNoXG4gIC8vIGlzIGl0c2VsZiBjb250YWluZWQgaW4gYHZpZXcuZGl2YCB3aGljaCBhZGRzIG5vIHBhZGRpbmcgKGJ1dCBkb2VzIGFkZCBhXG4gIC8vIGJvcmRlcikuIFNvLCBhcyBzcGVjaWZpZWQgaW4gdGhpcyBmdW5jdGlvbidzIGRvYyBjb21tZW50LCB0aGlzIGZ1bmN0aW9uXG4gIC8vIGRvZXMgYWxsIG9mIGl0cyB3b3JrIG9uIHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhlIHByb3ZpZGVkIHZpZXdzLCBzdGFydGluZyBhdFxuICAvLyBvZmZzZXRMZWZ0L1RvcCAod2hpY2ggaW5jbHVkZXMgbWFyZ2luKSBhbmQgYWRkaW5nIGNsaWVudExlZnQvVG9wICh3aGljaCBpc1xuICAvLyB0aGUgYm9yZGVyKS4gQWRkaW5nIGNsaWVudFdpZHRoL0hlaWdodCBnZXRzIHVzIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mXG4gIC8vIHRoZSBwYWRkaW5nIGVkZ2UuXG4gIGZ1bmN0aW9uIGlzRWxlbWVudEJvdHRvbUFmdGVyVmlld1RvcCh2aWV3KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHZpZXcuZGl2O1xuICAgIGNvbnN0IGVsZW1lbnRCb3R0b20gPVxuICAgICAgZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIHJldHVybiBlbGVtZW50Qm90dG9tID4gdG9wO1xuICB9XG4gIGZ1bmN0aW9uIGlzRWxlbWVudFJpZ2h0QWZ0ZXJWaWV3TGVmdCh2aWV3KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHZpZXcuZGl2O1xuICAgIGNvbnN0IGVsZW1lbnRSaWdodCA9XG4gICAgICBlbGVtZW50Lm9mZnNldExlZnQgKyBlbGVtZW50LmNsaWVudExlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHJldHVybiBlbGVtZW50UmlnaHQgPiBsZWZ0O1xuICB9XG5cbiAgY29uc3QgdmlzaWJsZSA9IFtdLFxuICAgIG51bVZpZXdzID0gdmlld3MubGVuZ3RoO1xuICBsZXQgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA9XG4gICAgbnVtVmlld3MgPT09IDBcbiAgICAgID8gMFxuICAgICAgOiBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0oXG4gICAgICAgICAgdmlld3MsXG4gICAgICAgICAgaG9yaXpvbnRhbCA/IGlzRWxlbWVudFJpZ2h0QWZ0ZXJWaWV3TGVmdCA6IGlzRWxlbWVudEJvdHRvbUFmdGVyVmlld1RvcFxuICAgICAgICApO1xuXG4gIC8vIFBsZWFzZSBub3RlIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGBiaW5hcnlTZWFyY2hGaXJzdEl0ZW1gIGZ1bmN0aW9uIHdoZW5cbiAgLy8gbm8gdmFsaWQgZWxlbWVudCBpcyBmb3VuZCAoaGVuY2UgdGhlIGBmaXJzdFZpc2libGVFbGVtZW50SW5kYCBjaGVjayBiZWxvdykuXG4gIGlmIChcbiAgICBmaXJzdFZpc2libGVFbGVtZW50SW5kID4gMCAmJlxuICAgIGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQgPCBudW1WaWV3cyAmJlxuICAgICFob3Jpem9udGFsXG4gICkge1xuICAgIC8vIEluIHdyYXBwZWQgc2Nyb2xsaW5nIChvciB2ZXJ0aWNhbCBzY3JvbGxpbmcgd2l0aCBzcHJlYWRzKSwgd2l0aCBzb21lIHBhZ2VcbiAgICAvLyBzaXplcywgaXNFbGVtZW50Qm90dG9tQWZ0ZXJWaWV3VG9wIGRvZXNuJ3Qgc2F0aXNmeSB0aGUgYmluYXJ5IHNlYXJjaFxuICAgIC8vIGNvbmRpdGlvbjogdGhlcmUgY2FuIGJlIHBhZ2VzIHdpdGggYm90dG9tcyBhYm92ZSB0aGUgdmlldyB0b3AgYmV0d2VlblxuICAgIC8vIHBhZ2VzIHdpdGggYm90dG9tcyBiZWxvdy4gVGhpcyBmdW5jdGlvbiBkZXRlY3RzIGFuZCBjb3JyZWN0cyB0aGF0IGVycm9yO1xuICAgIC8vIHNlZSBpdCBmb3IgbW9yZSBjb21tZW50cy5cbiAgICBmaXJzdFZpc2libGVFbGVtZW50SW5kID0gYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzKFxuICAgICAgZmlyc3RWaXNpYmxlRWxlbWVudEluZCxcbiAgICAgIHZpZXdzLFxuICAgICAgdG9wXG4gICAgKTtcbiAgfVxuXG4gIC8vIGxhc3RFZGdlIGFjdHMgYXMgYSBjdXRvZmYgZm9yIHVzIHRvIHN0b3AgbG9vcGluZywgYmVjYXVzZSB3ZSBrbm93IGFsbFxuICAvLyBzdWJzZXF1ZW50IHBhZ2VzIHdpbGwgYmUgaGlkZGVuLlxuICAvL1xuICAvLyBXaGVuIHVzaW5nIHdyYXBwZWQgc2Nyb2xsaW5nIG9yIHZlcnRpY2FsIHNjcm9sbGluZyB3aXRoIHNwcmVhZHMsIHdlIGNhbid0XG4gIC8vIHNpbXBseSBzdG9wIHRoZSBmaXJzdCB0aW1lIHdlIHJlYWNoIGEgcGFnZSBiZWxvdyB0aGUgYm90dG9tIG9mIHRoZSB2aWV3O1xuICAvLyB0aGUgdG9wcyBvZiBzdWJzZXF1ZW50IHBhZ2VzIG9uIHRoZSBzYW1lIHJvdyBjb3VsZCBzdGlsbCBiZSB2aXNpYmxlLiBJblxuICAvLyBob3Jpem9udGFsIHNjcm9sbGluZywgd2UgZG9uJ3QgaGF2ZSB0aGF0IGlzc3VlLCBzbyB3ZSBjYW4gc3RvcCBhcyBzb29uIGFzXG4gIC8vIHdlIHBhc3MgYHJpZ2h0YCwgd2l0aG91dCBuZWVkaW5nIHRoZSBjb2RlIGJlbG93IHRoYXQgaGFuZGxlcyB0aGUgLTEgY2FzZS5cbiAgbGV0IGxhc3RFZGdlID0gaG9yaXpvbnRhbCA/IHJpZ2h0IDogLTE7XG5cbiAgZm9yIChsZXQgaSA9IGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQ7IGkgPCBudW1WaWV3czsgaSsrKSB7XG4gICAgY29uc3QgdmlldyA9IHZpZXdzW2ldLFxuICAgICAgZWxlbWVudCA9IHZpZXcuZGl2O1xuICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgICBjb25zdCB2aWV3V2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgdmlld0hlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHZpZXdSaWdodCA9IGN1cnJlbnRXaWR0aCArIHZpZXdXaWR0aDtcbiAgICBjb25zdCB2aWV3Qm90dG9tID0gY3VycmVudEhlaWdodCArIHZpZXdIZWlnaHQ7XG5cbiAgICBpZiAobGFzdEVkZ2UgPT09IC0xKSB7XG4gICAgICAvLyBBcyBjb21tZW50ZWQgYWJvdmUsIHRoaXMgaXMgb25seSBuZWVkZWQgaW4gbm9uLWhvcml6b250YWwgY2FzZXMuXG4gICAgICAvLyBTZXR0aW5nIGxhc3RFZGdlIHRvIHRoZSBib3R0b20gb2YgdGhlIGZpcnN0IHBhZ2UgdGhhdCBpcyBwYXJ0aWFsbHlcbiAgICAgIC8vIHZpc2libGUgZW5zdXJlcyB0aGF0IHRoZSBuZXh0IHBhZ2UgZnVsbHkgYmVsb3cgbGFzdEVkZ2UgaXMgb24gdGhlXG4gICAgICAvLyBuZXh0IHJvdywgd2hpY2ggaGFzIHRvIGJlIGZ1bGx5IGhpZGRlbiBhbG9uZyB3aXRoIGFsbCBzdWJzZXF1ZW50IHJvd3MuXG4gICAgICBpZiAodmlld0JvdHRvbSA+PSBib3R0b20pIHtcbiAgICAgICAgbGFzdEVkZ2UgPSB2aWV3Qm90dG9tO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoKGhvcml6b250YWwgPyBjdXJyZW50V2lkdGggOiBjdXJyZW50SGVpZ2h0KSA+IGxhc3RFZGdlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB2aWV3Qm90dG9tIDw9IHRvcCB8fFxuICAgICAgY3VycmVudEhlaWdodCA+PSBib3R0b20gfHxcbiAgICAgIHZpZXdSaWdodCA8PSBsZWZ0IHx8XG4gICAgICBjdXJyZW50V2lkdGggPj0gcmlnaHRcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZGRlbkhlaWdodCA9XG4gICAgICBNYXRoLm1heCgwLCB0b3AgLSBjdXJyZW50SGVpZ2h0KSArIE1hdGgubWF4KDAsIHZpZXdCb3R0b20gLSBib3R0b20pO1xuICAgIGNvbnN0IGhpZGRlbldpZHRoID1cbiAgICAgIE1hdGgubWF4KDAsIGxlZnQgLSBjdXJyZW50V2lkdGgpICsgTWF0aC5tYXgoMCwgdmlld1JpZ2h0IC0gcmlnaHQpO1xuICAgIGNvbnN0IHBlcmNlbnQgPVxuICAgICAgKCgodmlld0hlaWdodCAtIGhpZGRlbkhlaWdodCkgKiAodmlld1dpZHRoIC0gaGlkZGVuV2lkdGgpICogMTAwKSAvXG4gICAgICAgIHZpZXdIZWlnaHQgL1xuICAgICAgICB2aWV3V2lkdGgpIHxcbiAgICAgIDA7XG4gICAgdmlzaWJsZS5wdXNoKHtcbiAgICAgIGlkOiB2aWV3LmlkLFxuICAgICAgeDogY3VycmVudFdpZHRoLFxuICAgICAgeTogY3VycmVudEhlaWdodCxcbiAgICAgIHZpZXcsXG4gICAgICBwZXJjZW50LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZmlyc3QgPSB2aXNpYmxlWzBdLFxuICAgIGxhc3QgPSB2aXNpYmxlW3Zpc2libGUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKHNvcnRCeVZpc2liaWxpdHkpIHtcbiAgICB2aXNpYmxlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGNvbnN0IHBjID0gYS5wZXJjZW50IC0gYi5wZXJjZW50O1xuICAgICAgaWYgKE1hdGguYWJzKHBjKSA+IDAuMDAxKSB7XG4gICAgICAgIHJldHVybiAtcGM7XG4gICAgICB9XG4gICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7IC8vIGVuc3VyZSBzdGFiaWxpdHlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4geyBmaXJzdCwgbGFzdCwgdmlld3M6IHZpc2libGUgfTtcbn1cblxuLyoqXG4gKiBFdmVudCBoYW5kbGVyIHRvIHN1cHByZXNzIGNvbnRleHQgbWVudS5cbiAqL1xuZnVuY3Rpb24gbm9Db250ZXh0TWVudUhhbmRsZXIoZXZ0KSB7XG4gIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5mdW5jdGlvbiBpc0RhdGFTY2hlbWEodXJsKSB7XG4gIGxldCBpID0gMDtcbiAgY29uc3QgaWkgPSB1cmwubGVuZ3RoO1xuICB3aGlsZSAoaSA8IGlpICYmIHVybFtpXS50cmltKCkgPT09IFwiXCIpIHtcbiAgICBpKys7XG4gIH1cbiAgcmV0dXJuIHVybC5zdWJzdHJpbmcoaSwgaSArIDUpLnRvTG93ZXJDYXNlKCkgPT09IFwiZGF0YTpcIjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaWxlbmFtZSBvciBndWVzc2VkIGZpbGVuYW1lIGZyb20gdGhlIHVybCAoc2VlIGlzc3VlIDM0NTUpLlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBvcmlnaW5hbCBQREYgbG9jYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdEZpbGVuYW1lIC0gVGhlIHZhbHVlIHJldHVybmVkIGlmIHRoZSBmaWxlbmFtZSBpc1xuICogICB1bmtub3duLCBvciB0aGUgcHJvdG9jb2wgaXMgdW5zdXBwb3J0ZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBHdWVzc2VkIFBERiBmaWxlbmFtZS5cbiAqL1xuZnVuY3Rpb24gZ2V0UERGRmlsZU5hbWVGcm9tVVJMKHVybCwgZGVmYXVsdEZpbGVuYW1lID0gXCJkb2N1bWVudC5wZGZcIikge1xuICBpZiAodHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7XG4gIH1cbiAgaWYgKGlzRGF0YVNjaGVtYSh1cmwpKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJnZXRQREZGaWxlTmFtZUZyb21VUkw6IFwiICtcbiAgICAgICAgJ2lnbm9yaW5nIFwiZGF0YTpcIiBVUkwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuJ1xuICAgICk7XG4gICAgcmV0dXJuIGRlZmF1bHRGaWxlbmFtZTtcbiAgfVxuICBjb25zdCByZVVSSSA9IC9eKD86KD86W146XSs6KT9cXC9cXC9bXlxcL10rKT8oW14/I10qKShcXD9bXiNdKik/KCMuKik/JC87XG4gIC8vICAgICAgICAgICAgICBTQ0hFTUUgICAgICAgIEhPU1QgICAgICAgICAxLlBBVEggIDIuUVVFUlkgICAzLlJFRlxuICAvLyBQYXR0ZXJuIHRvIGdldCBsYXN0IG1hdGNoaW5nIE5BTUUucGRmXG4gIGNvbnN0IHJlRmlsZW5hbWUgPSAvW15cXC8/Iz1dK1xcLnBkZlxcYig/IS4qXFwucGRmXFxiKS9pO1xuICBjb25zdCBzcGxpdFVSSSA9IHJlVVJJLmV4ZWModXJsKTtcbiAgbGV0IHN1Z2dlc3RlZEZpbGVuYW1lID1cbiAgICByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMV0pIHx8XG4gICAgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzJdKSB8fFxuICAgIHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVszXSk7XG4gIGlmIChzdWdnZXN0ZWRGaWxlbmFtZSkge1xuICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gc3VnZ2VzdGVkRmlsZW5hbWVbMF07XG4gICAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lLmluY2x1ZGVzKFwiJVwiKSkge1xuICAgICAgLy8gVVJMLWVuY29kZWQgJTJGcGF0aCUyRnRvJTJGZmlsZS5wZGYgc2hvdWxkIGJlIGZpbGUucGRmXG4gICAgICB0cnkge1xuICAgICAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhcbiAgICAgICAgICBkZWNvZGVVUklDb21wb25lbnQoc3VnZ2VzdGVkRmlsZW5hbWUpXG4gICAgICAgIClbMF07XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAvLyBQb3NzaWJsZSAoZXh0cmVtZWx5IHJhcmUpIGVycm9yczpcbiAgICAgICAgLy8gVVJJRXJyb3IgXCJNYWxmb3JtZWQgVVJJXCIsIGUuZy4gZm9yIFwiJUFBLnBkZlwiXG4gICAgICAgIC8vIFR5cGVFcnJvciBcIm51bGwgaGFzIG5vIHByb3BlcnRpZXNcIiwgZS5nLiBmb3IgXCIlMkYucGRmXCJcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Z2dlc3RlZEZpbGVuYW1lIHx8IGRlZmF1bHRGaWxlbmFtZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbihldnQpIHtcbiAgbGV0IGRlbHRhID0gTWF0aC5zcXJ0KGV2dC5kZWx0YVggKiBldnQuZGVsdGFYICsgZXZ0LmRlbHRhWSAqIGV2dC5kZWx0YVkpO1xuICBjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIoZXZ0LmRlbHRhWSwgZXZ0LmRlbHRhWCk7XG4gIGlmICgtMC4yNSAqIE1hdGguUEkgPCBhbmdsZSAmJiBhbmdsZSA8IDAuNzUgKiBNYXRoLlBJKSB7XG4gICAgLy8gQWxsIHRoYXQgaXMgbGVmdC11cCBvcmllbnRlZCBoYXMgdG8gY2hhbmdlIHRoZSBzaWduLlxuICAgIGRlbHRhID0gLWRlbHRhO1xuICB9XG4gIHJldHVybiBkZWx0YTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplV2hlZWxFdmVudERlbHRhKGV2dCkge1xuICBsZXQgZGVsdGEgPSBub3JtYWxpemVXaGVlbEV2ZW50RGlyZWN0aW9uKGV2dCk7XG5cbiAgY29uc3QgTU9VU0VfRE9NX0RFTFRBX1BJWEVMX01PREUgPSAwO1xuICBjb25zdCBNT1VTRV9ET01fREVMVEFfTElORV9NT0RFID0gMTtcbiAgY29uc3QgTU9VU0VfUElYRUxTX1BFUl9MSU5FID0gMzA7XG4gIGNvbnN0IE1PVVNFX0xJTkVTX1BFUl9QQUdFID0gMzA7XG5cbiAgLy8gQ29udmVydHMgZGVsdGEgdG8gcGVyLXBhZ2UgdW5pdHNcbiAgaWYgKGV2dC5kZWx0YU1vZGUgPT09IE1PVVNFX0RPTV9ERUxUQV9QSVhFTF9NT0RFKSB7XG4gICAgZGVsdGEgLz0gTU9VU0VfUElYRUxTX1BFUl9MSU5FICogTU9VU0VfTElORVNfUEVSX1BBR0U7XG4gIH0gZWxzZSBpZiAoZXZ0LmRlbHRhTW9kZSA9PT0gTU9VU0VfRE9NX0RFTFRBX0xJTkVfTU9ERSkge1xuICAgIGRlbHRhIC89IE1PVVNFX0xJTkVTX1BFUl9QQUdFO1xuICB9XG4gIHJldHVybiBkZWx0YTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFJvdGF0aW9uKGFuZ2xlKSB7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGFuZ2xlKSAmJiBhbmdsZSAlIDkwID09PSAwO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkU2Nyb2xsTW9kZShtb2RlKSB7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyLmlzSW50ZWdlcihtb2RlKSAmJlxuICAgIE9iamVjdC52YWx1ZXMoU2Nyb2xsTW9kZSkuaW5jbHVkZXMobW9kZSkgJiZcbiAgICBtb2RlICE9PSBTY3JvbGxNb2RlLlVOS05PV05cbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFNwcmVhZE1vZGUobW9kZSkge1xuICByZXR1cm4gKFxuICAgIE51bWJlci5pc0ludGVnZXIobW9kZSkgJiZcbiAgICBPYmplY3QudmFsdWVzKFNwcmVhZE1vZGUpLmluY2x1ZGVzKG1vZGUpICYmXG4gICAgbW9kZSAhPT0gU3ByZWFkTW9kZS5VTktOT1dOXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUG9ydHJhaXRPcmllbnRhdGlvbihzaXplKSB7XG4gIHJldHVybiBzaXplLndpZHRoIDw9IHNpemUuaGVpZ2h0O1xufVxuXG5jb25zdCBXYWl0T25UeXBlID0ge1xuICBFVkVOVDogXCJldmVudFwiLFxuICBUSU1FT1VUOiBcInRpbWVvdXRcIixcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2FpdE9uRXZlbnRPclRpbWVvdXRQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge09iamVjdH0gdGFyZ2V0IC0gVGhlIGV2ZW50IHRhcmdldCwgY2FuIGZvciBleGFtcGxlIGJlOlxuICogICBgd2luZG93YCwgYGRvY3VtZW50YCwgYSBET00gZWxlbWVudCwgb3IgYW4ge0V2ZW50QnVzfSBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlbGF5IC0gVGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMsIGFmdGVyIHdoaWNoIHRoZVxuICogICB0aW1lb3V0IG9jY3VycyAoaWYgdGhlIGV2ZW50IHdhc24ndCBhbHJlYWR5IGRpc3BhdGNoZWQpLlxuICovXG5cbi8qKlxuICogQWxsb3dzIHdhaXRpbmcgZm9yIGFuIGV2ZW50IG9yIGEgdGltZW91dCwgd2hpY2hldmVyIG9jY3VycyBmaXJzdC5cbiAqIENhbiBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IGFuIGFjdGlvbiBhbHdheXMgb2NjdXJzLCBldmVuIHdoZW4gYW4gZXZlbnRcbiAqIGFycml2ZXMgbGF0ZSBvciBub3QgYXQgYWxsLlxuICpcbiAqIEBwYXJhbSB7V2FpdE9uRXZlbnRPclRpbWVvdXRQYXJhbWV0ZXJzfVxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSB7V2FpdE9uVHlwZX0gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHdhaXRPbkV2ZW50T3JUaW1lb3V0KHsgdGFyZ2V0LCBuYW1lLCBkZWxheSA9IDAgfSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICEobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikgfHxcbiAgICAgICEoTnVtYmVyLmlzSW50ZWdlcihkZWxheSkgJiYgZGVsYXkgPj0gMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIndhaXRPbkV2ZW50T3JUaW1lb3V0IC0gaW52YWxpZCBwYXJhbWV0ZXJzLlwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVyKHR5cGUpIHtcbiAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFdmVudEJ1cykge1xuICAgICAgICB0YXJnZXQuX29mZihuYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSh0eXBlKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudEhhbmRsZXIgPSBoYW5kbGVyLmJpbmQobnVsbCwgV2FpdE9uVHlwZS5FVkVOVCk7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50QnVzKSB7XG4gICAgICB0YXJnZXQuX29uKG5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZW91dEhhbmRsZXIgPSBoYW5kbGVyLmJpbmQobnVsbCwgV2FpdE9uVHlwZS5USU1FT1VUKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCh0aW1lb3V0SGFuZGxlciwgZGVsYXkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBET00gd2luZG93IGJlY29tZXMgdmlzaWJsZS5cbiAqL1xuY29uc3QgYW5pbWF0aW9uU3RhcnRlZCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgUERGSlNEZXYgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICBQREZKU0Rldi50ZXN0KFwiTElCICYmIFRFU1RJTkdcIikgJiZcbiAgICB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiXG4gICkge1xuICAgIC8vIFByZXZlbnQgXCJSZWZlcmVuY2VFcnJvcjogd2luZG93IGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIHdoZW4gcnVubmluZyB0aGVcbiAgICAvLyB1bml0LXRlc3RzIGluIE5vZGUuanMvVHJhdmlzLlxuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgMjApO1xuICAgIHJldHVybjtcbiAgfVxuICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUpO1xufSk7XG5cbi8qKlxuICogTk9URTogT25seSB1c2VkIHRvIHN1cHBvcnQgdmFyaW91cyBQREYgdmlld2VyIHRlc3RzIGluIGBtb3ppbGxhLWNlbnRyYWxgLlxuICovXG5mdW5jdGlvbiBkaXNwYXRjaERPTUV2ZW50KGV2ZW50TmFtZSwgYXJncyA9IG51bGwpIHtcbiAgaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQ6IGRpc3BhdGNoRE9NRXZlbnRcIik7XG4gIH1cbiAgY29uc3QgZGV0YWlscyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGlmIChhcmdzICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG9iaiA9IGFyZ3NbMF07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgaWYgKGtleSA9PT0gXCJzb3VyY2VcIikge1xuICAgICAgICBpZiAodmFsdWUgPT09IHdpbmRvdyB8fCB2YWx1ZSA9PT0gZG9jdW1lbnQpIHtcbiAgICAgICAgICByZXR1cm47IC8vIE5vIG5lZWQgdG8gcmUtZGlzcGF0Y2ggKGFscmVhZHkpIGdsb2JhbCBldmVudHMuXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7IC8vIElnbm9yZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkuXG4gICAgICB9XG4gICAgICBkZXRhaWxzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkN1c3RvbUV2ZW50XCIpO1xuICBldmVudC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWxzKTtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbi8qKlxuICogU2ltcGxlIGV2ZW50IGJ1cyBmb3IgYW4gYXBwbGljYXRpb24uIExpc3RlbmVycyBhcmUgYXR0YWNoZWQgdXNpbmcgdGhlIGBvbmBcbiAqIGFuZCBgb2ZmYCBtZXRob2RzLiBUbyByYWlzZSBhbiBldmVudCwgdGhlIGBkaXNwYXRjaGAgbWV0aG9kIHNoYWxsIGJlIHVzZWQuXG4gKi9cbmNsYXNzIEV2ZW50QnVzIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBpZiAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8IFBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMXCIpKSB7XG4gICAgICB0aGlzLl9pc0luQXV0b21hdGlvbiA9IChvcHRpb25zICYmIG9wdGlvbnMuaXNJbkF1dG9tYXRpb24pID09PSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBvbihldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fb24oZXZlbnROYW1lLCBsaXN0ZW5lciwgeyBleHRlcm5hbDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBvZmYoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX29mZihldmVudE5hbWUsIGxpc3RlbmVyLCB7IGV4dGVybmFsOiB0cnVlIH0pO1xuICB9XG5cbiAgZGlzcGF0Y2goZXZlbnROYW1lKSB7XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTtcbiAgICBpZiAoIWV2ZW50TGlzdGVuZXJzIHx8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKFxuICAgICAgICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8IFBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMXCIpKSAmJlxuICAgICAgICB0aGlzLl9pc0luQXV0b21hdGlvblxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBkaXNwYXRjaERPTUV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBhc3NpbmcgYWxsIGFyZ3VtZW50cyBhZnRlciB0aGUgZXZlbnROYW1lIHRvIHRoZSBsaXN0ZW5lcnMuXG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGV0IGV4dGVybmFsTGlzdGVuZXJzO1xuICAgIC8vIE1ha2luZyBjb3B5IG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgaW4gY2FzZSBpZiBpdCB3aWxsIGJlIG1vZGlmaWVkXG4gICAgLy8gZHVyaW5nIGRpc3BhdGNoLlxuICAgIGV2ZW50TGlzdGVuZXJzLnNsaWNlKDApLmZvckVhY2goZnVuY3Rpb24gKHsgbGlzdGVuZXIsIGV4dGVybmFsIH0pIHtcbiAgICAgIGlmIChleHRlcm5hbCkge1xuICAgICAgICBpZiAoIWV4dGVybmFsTGlzdGVuZXJzKSB7XG4gICAgICAgICAgZXh0ZXJuYWxMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBleHRlcm5hbExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSk7XG4gICAgLy8gRGlzcGF0Y2ggYW55IFwiZXh0ZXJuYWxcIiBsaXN0ZW5lcnMgKmFmdGVyKiB0aGUgaW50ZXJuYWwgb25lcywgdG8gZ2l2ZSB0aGVcbiAgICAvLyB2aWV3ZXIgY29tcG9uZW50cyB0aW1lIHRvIGhhbmRsZSBldmVudHMgYW5kIHVwZGF0ZSB0aGVpciBzdGF0ZSBmaXJzdC5cbiAgICBpZiAoZXh0ZXJuYWxMaXN0ZW5lcnMpIHtcbiAgICAgIGV4dGVybmFsTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVyLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICBleHRlcm5hbExpc3RlbmVycyA9IG51bGw7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpICYmXG4gICAgICB0aGlzLl9pc0luQXV0b21hdGlvblxuICAgICkge1xuICAgICAgZGlzcGF0Y2hET01FdmVudChldmVudE5hbWUsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBfb24oZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucyA9IG51bGwpIHtcbiAgICBsZXQgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTtcbiAgICBpZiAoIWV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXSA9IGV2ZW50TGlzdGVuZXJzID0gW107XG4gICAgfVxuICAgIGV2ZW50TGlzdGVuZXJzLnB1c2goe1xuICAgICAgbGlzdGVuZXIsXG4gICAgICBleHRlcm5hbDogKG9wdGlvbnMgJiYgb3B0aW9ucy5leHRlcm5hbCkgPT09IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgX29mZihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zID0gbnVsbCkge1xuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50TmFtZV07XG4gICAgaWYgKCFldmVudExpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBldmVudExpc3RlbmVycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAoZXZlbnRMaXN0ZW5lcnNbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjbGFtcCh2LCBtaW4sIG1heCkge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodiwgbWluKSwgbWF4KTtcbn1cblxuY2xhc3MgUHJvZ3Jlc3NCYXIge1xuICBjb25zdHJ1Y3RvcihpZCwgeyBoZWlnaHQsIHdpZHRoLCB1bml0cyB9ID0ge30pIHtcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuXG4gICAgLy8gRmV0Y2ggdGhlIHN1Yi1lbGVtZW50cyBmb3IgbGF0ZXIuXG4gICAgdGhpcy5kaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkICsgXCIgLnByb2dyZXNzXCIpO1xuICAgIC8vIEdldCB0aGUgbG9hZGluZyBiYXIgZWxlbWVudCwgc28gaXQgY2FuIGJlIHJlc2l6ZWQgdG8gZml0IHRoZSB2aWV3ZXIuXG4gICAgdGhpcy5iYXIgPSB0aGlzLmRpdi5wYXJlbnROb2RlO1xuXG4gICAgLy8gR2V0IG9wdGlvbnMsIHdpdGggc2Vuc2libGUgZGVmYXVsdHMuXG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgfHwgMTAwO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aCB8fCAxMDA7XG4gICAgdGhpcy51bml0cyA9IHVuaXRzIHx8IFwiJVwiO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBoZWlnaHRzLlxuICAgIHRoaXMuZGl2LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgdGhpcy51bml0cztcbiAgICB0aGlzLnBlcmNlbnQgPSAwO1xuICB9XG5cbiAgX3VwZGF0ZUJhcigpIHtcbiAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkge1xuICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImluZGV0ZXJtaW5hdGVcIik7XG4gICAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyB0aGlzLnVuaXRzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJpbmRldGVybWluYXRlXCIpO1xuICAgIGNvbnN0IHByb2dyZXNzU2l6ZSA9ICh0aGlzLndpZHRoICogdGhpcy5fcGVyY2VudCkgLyAxMDA7XG4gICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSBwcm9ncmVzc1NpemUgKyB0aGlzLnVuaXRzO1xuICB9XG5cbiAgZ2V0IHBlcmNlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlcmNlbnQ7XG4gIH1cblxuICBzZXQgcGVyY2VudCh2YWwpIHtcbiAgICB0aGlzLl9pbmRldGVybWluYXRlID0gaXNOYU4odmFsKTtcbiAgICB0aGlzLl9wZXJjZW50ID0gY2xhbXAodmFsLCAwLCAxMDApO1xuICAgIHRoaXMuX3VwZGF0ZUJhcigpO1xuICB9XG5cbiAgc2V0V2lkdGgodmlld2VyKSB7XG4gICAgaWYgKCF2aWV3ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gdmlld2VyLnBhcmVudE5vZGU7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGggLSB2aWV3ZXIub2Zmc2V0V2lkdGg7XG4gICAgaWYgKHNjcm9sbGJhcldpZHRoID4gMCkge1xuICAgICAgdGhpcy5iYXIuc3R5bGUud2lkdGggPSBgY2FsYygxMDAlIC0gJHtzY3JvbGxiYXJXaWR0aH1weClgO1xuICAgIH1cbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLnZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5iYXIuY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoXCJsb2FkaW5nSW5Qcm9ncmVzc1wiKTtcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMudmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcImxvYWRpbmdJblByb2dyZXNzXCIpO1xuICAgIHRoaXMuYmFyLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gIH1cbn1cblxuLyoqXG4gKiBNb3ZlcyBhbGwgZWxlbWVudHMgb2YgYW4gYXJyYXkgdGhhdCBzYXRpc2Z5IGNvbmRpdGlvbiB0byB0aGUgZW5kIG9mIHRoZVxuICogYXJyYXksIHByZXNlcnZpbmcgdGhlIG9yZGVyIG9mIHRoZSByZXN0LlxuICovXG5mdW5jdGlvbiBtb3ZlVG9FbmRPZkFycmF5KGFyciwgY29uZGl0aW9uKSB7XG4gIGNvbnN0IG1vdmVkID0gW10sXG4gICAgbGVuID0gYXJyLmxlbmd0aDtcbiAgbGV0IHdyaXRlID0gMDtcbiAgZm9yIChsZXQgcmVhZCA9IDA7IHJlYWQgPCBsZW47ICsrcmVhZCkge1xuICAgIGlmIChjb25kaXRpb24oYXJyW3JlYWRdKSkge1xuICAgICAgbW92ZWQucHVzaChhcnJbcmVhZF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcnJbd3JpdGVdID0gYXJyW3JlYWRdO1xuICAgICAgKyt3cml0ZTtcbiAgICB9XG4gIH1cbiAgZm9yIChsZXQgcmVhZCA9IDA7IHdyaXRlIDwgbGVuOyArK3JlYWQsICsrd3JpdGUpIHtcbiAgICBhcnJbd3JpdGVdID0gbW92ZWRbcmVhZF07XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQXV0b1ByaW50UmVnRXhwLFxuICBDU1NfVU5JVFMsXG4gIERFRkFVTFRfU0NBTEVfVkFMVUUsXG4gIERFRkFVTFRfU0NBTEUsXG4gIE1JTl9TQ0FMRSxcbiAgTUFYX1NDQUxFLFxuICBVTktOT1dOX1NDQUxFLFxuICBNQVhfQVVUT19TQ0FMRSxcbiAgU0NST0xMQkFSX1BBRERJTkcsXG4gIFZFUlRJQ0FMX1BBRERJTkcsXG4gIGlzVmFsaWRSb3RhdGlvbixcbiAgaXNWYWxpZFNjcm9sbE1vZGUsXG4gIGlzVmFsaWRTcHJlYWRNb2RlLFxuICBpc1BvcnRyYWl0T3JpZW50YXRpb24sXG4gIFByZXNlbnRhdGlvbk1vZGVTdGF0ZSxcbiAgUmVuZGVyZXJUeXBlLFxuICBUZXh0TGF5ZXJNb2RlLFxuICBTY3JvbGxNb2RlLFxuICBTcHJlYWRNb2RlLFxuICBOdWxsTDEwbixcbiAgRXZlbnRCdXMsXG4gIGNsYW1wLFxuICBQcm9ncmVzc0JhcixcbiAgZ2V0UERGRmlsZU5hbWVGcm9tVVJMLFxuICBub0NvbnRleHRNZW51SGFuZGxlcixcbiAgcGFyc2VRdWVyeVN0cmluZyxcbiAgYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzLCAvLyBvbmx5IGV4cG9ydGVkIGZvciB0ZXN0aW5nXG4gIGdldFZpc2libGVFbGVtZW50cyxcbiAgcm91bmRUb0RpdmlkZSxcbiAgZ2V0UGFnZVNpemVJbmNoZXMsXG4gIGFwcHJveGltYXRlRnJhY3Rpb24sXG4gIGdldE91dHB1dFNjYWxlLFxuICBzY3JvbGxJbnRvVmlldyxcbiAgd2F0Y2hTY3JvbGwsXG4gIGJpbmFyeVNlYXJjaEZpcnN0SXRlbSxcbiAgbm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbixcbiAgbm9ybWFsaXplV2hlZWxFdmVudERlbHRhLFxuICBhbmltYXRpb25TdGFydGVkLFxuICBXYWl0T25UeXBlLFxuICB3YWl0T25FdmVudE9yVGltZW91dCxcbiAgbW92ZVRvRW5kT2ZBcnJheSxcbn07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNSBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgcGFyc2VRdWVyeVN0cmluZyB9IGZyb20gXCIuL3VpX3V0aWxzLmpzXCI7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGTGlua1NlcnZpY2VPcHRpb25zXG4gKiBAcHJvcGVydHkge0V2ZW50QnVzfSBldmVudEJ1cyAtIFRoZSBhcHBsaWNhdGlvbiBldmVudCBidXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2V4dGVybmFsTGlua1RhcmdldF0gLSBTcGVjaWZpZXMgdGhlIGB0YXJnZXRgIGF0dHJpYnV0ZVxuICogICBmb3IgZXh0ZXJuYWwgbGlua3MuIE11c3QgdXNlIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20ge0xpbmtUYXJnZXR9LlxuICogICBEZWZhdWx0cyB0byB1c2luZyBubyB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V4dGVybmFsTGlua1JlbF0gLSBTcGVjaWZpZXMgdGhlIGByZWxgIGF0dHJpYnV0ZSBmb3JcbiAqICAgZXh0ZXJuYWwgbGlua3MuIERlZmF1bHRzIHRvIHN0cmlwcGluZyB0aGUgcmVmZXJyZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVEZXN0aW5hdGlvblpvb21dIC0gSWdub3JlcyB0aGUgem9vbSBhcmd1bWVudCxcbiAqICAgdGh1cyBwcmVzZXJ2aW5nIHRoZSBjdXJyZW50IHpvb20gbGV2ZWwgaW4gdGhlIHZpZXdlciwgd2hlbiBuYXZpZ2F0aW5nXG4gKiAgIHRvIGludGVybmFsIGRlc3RpbmF0aW9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIG5hdmlnYXRpb24gZnVuY3Rpb25zIGluc2lkZSBQREYsIHN1Y2ggYXMgb3BlbmluZyBzcGVjaWZpZWQgcGFnZSxcbiAqIG9yIGRlc3RpbmF0aW9uLlxuICogQGltcGxlbWVudHMge0lQREZMaW5rU2VydmljZX1cbiAqL1xuY2xhc3MgUERGTGlua1NlcnZpY2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtQREZMaW5rU2VydmljZU9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBldmVudEJ1cyxcbiAgICBleHRlcm5hbExpbmtUYXJnZXQgPSBudWxsLFxuICAgIGV4dGVybmFsTGlua1JlbCA9IG51bGwsXG4gICAgZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWUsXG4gICAgaWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2UsXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cztcbiAgICB0aGlzLmV4dGVybmFsTGlua1RhcmdldCA9IGV4dGVybmFsTGlua1RhcmdldDtcbiAgICB0aGlzLmV4dGVybmFsTGlua1JlbCA9IGV4dGVybmFsTGlua1JlbDtcbiAgICB0aGlzLmV4dGVybmFsTGlua0VuYWJsZWQgPSBleHRlcm5hbExpbmtFbmFibGVkO1xuICAgIHRoaXMuX2lnbm9yZURlc3RpbmF0aW9uWm9vbSA9IGlnbm9yZURlc3RpbmF0aW9uWm9vbTtcblxuICAgIHRoaXMuYmFzZVVybCA9IG51bGw7XG4gICAgdGhpcy5wZGZEb2N1bWVudCA9IG51bGw7XG4gICAgdGhpcy5wZGZWaWV3ZXIgPSBudWxsO1xuICAgIHRoaXMucGRmSGlzdG9yeSA9IG51bGw7XG5cbiAgICB0aGlzLl9wYWdlc1JlZkNhY2hlID0gbnVsbDtcbiAgfVxuXG4gIHNldERvY3VtZW50KHBkZkRvY3VtZW50LCBiYXNlVXJsID0gbnVsbCkge1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgdGhpcy5wZGZEb2N1bWVudCA9IHBkZkRvY3VtZW50O1xuICAgIHRoaXMuX3BhZ2VzUmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgc2V0Vmlld2VyKHBkZlZpZXdlcikge1xuICAgIHRoaXMucGRmVmlld2VyID0gcGRmVmlld2VyO1xuICB9XG5cbiAgc2V0SGlzdG9yeShwZGZIaXN0b3J5KSB7XG4gICAgdGhpcy5wZGZIaXN0b3J5ID0gcGRmSGlzdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHBhZ2VzQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLnBkZkRvY3VtZW50Lm51bVBhZ2VzIDogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHBhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKi9cbiAgc2V0IHBhZ2UodmFsdWUpIHtcbiAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcm90YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucGRmVmlld2VyLnBhZ2VzUm90YXRpb247XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqL1xuICBzZXQgcm90YXRpb24odmFsdWUpIHtcbiAgICB0aGlzLnBkZlZpZXdlci5wYWdlc1JvdGF0aW9uID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IGRlc3QgLSBUaGUgbmFtZWQsIG9yIGV4cGxpY2l0LCBQREYgZGVzdGluYXRpb24uXG4gICAqL1xuICBuYXZpZ2F0ZVRvKGRlc3QpIHtcbiAgICBjb25zdCBnb1RvRGVzdGluYXRpb24gPSAoeyBuYW1lZERlc3QsIGV4cGxpY2l0RGVzdCB9KSA9PiB7XG4gICAgICAvLyBEZXN0IGFycmF5IGxvb2tzIGxpa2UgdGhhdDogPHBhZ2UtcmVmPiA8L1hZWnwvRml0WFhYPiA8YXJncy4uPlxuICAgICAgY29uc3QgZGVzdFJlZiA9IGV4cGxpY2l0RGVzdFswXTtcbiAgICAgIGxldCBwYWdlTnVtYmVyO1xuXG4gICAgICBpZiAoZGVzdFJlZiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICBwYWdlTnVtYmVyID0gdGhpcy5fY2FjaGVkUGFnZU51bWJlcihkZXN0UmVmKTtcblxuICAgICAgICBpZiAocGFnZU51bWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEZldGNoIHRoZSBwYWdlIHJlZmVyZW5jZSBpZiBpdCdzIG5vdCB5ZXQgYXZhaWxhYmxlLiBUaGlzIGNvdWxkXG4gICAgICAgICAgLy8gb25seSBvY2N1ciBkdXJpbmcgbG9hZGluZywgYmVmb3JlIGFsbCBwYWdlcyBoYXZlIGJlZW4gcmVzb2x2ZWQuXG4gICAgICAgICAgdGhpcy5wZGZEb2N1bWVudFxuICAgICAgICAgICAgLmdldFBhZ2VJbmRleChkZXN0UmVmKVxuICAgICAgICAgICAgLnRoZW4ocGFnZUluZGV4ID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZVBhZ2VSZWYocGFnZUluZGV4ICsgMSwgZGVzdFJlZik7XG4gICAgICAgICAgICAgIGdvVG9EZXN0aW5hdGlvbih7IG5hbWVkRGVzdCwgZXhwbGljaXREZXN0IH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFwiJHtkZXN0UmVmfVwiIGlzIG5vdCBgICtcbiAgICAgICAgICAgICAgICAgIGBhIHZhbGlkIHBhZ2UgcmVmZXJlbmNlLCBmb3IgZGVzdD1cIiR7ZGVzdH1cIi5gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcihkZXN0UmVmKSkge1xuICAgICAgICBwYWdlTnVtYmVyID0gZGVzdFJlZiArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvOiBcIiR7ZGVzdFJlZn1cIiBpcyBub3QgYCArXG4gICAgICAgICAgICBgYSB2YWxpZCBkZXN0aW5hdGlvbiByZWZlcmVuY2UsIGZvciBkZXN0PVwiJHtkZXN0fVwiLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFwYWdlTnVtYmVyIHx8IHBhZ2VOdW1iZXIgPCAxIHx8IHBhZ2VOdW1iZXIgPiB0aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgUERGTGlua1NlcnZpY2UubmF2aWdhdGVUbzogXCIke3BhZ2VOdW1iZXJ9XCIgaXMgbm90IGAgK1xuICAgICAgICAgICAgYGEgdmFsaWQgcGFnZSBudW1iZXIsIGZvciBkZXN0PVwiJHtkZXN0fVwiLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wZGZIaXN0b3J5KSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgYnJvd3NlciBoaXN0b3J5IGJlZm9yZSBzY3JvbGxpbmcgdGhlIG5ldyBkZXN0aW5hdGlvbiBpbnRvXG4gICAgICAgIC8vIHZpZXcsIHRvIGJlIGFibGUgdG8gYWNjdXJhdGVseSBjYXB0dXJlIHRoZSBjdXJyZW50IGRvY3VtZW50IHBvc2l0aW9uLlxuICAgICAgICB0aGlzLnBkZkhpc3RvcnkucHVzaEN1cnJlbnRQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLnBkZkhpc3RvcnkucHVzaCh7IG5hbWVkRGVzdCwgZXhwbGljaXREZXN0LCBwYWdlTnVtYmVyIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICBkZXN0QXJyYXk6IGV4cGxpY2l0RGVzdCxcbiAgICAgICAgaWdub3JlRGVzdGluYXRpb25ab29tOiB0aGlzLl9pZ25vcmVEZXN0aW5hdGlvblpvb20sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkZXN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMucGRmRG9jdW1lbnQuZ2V0RGVzdGluYXRpb24oZGVzdCkudGhlbihkZXN0QXJyYXkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgbmFtZWREZXN0OiBkZXN0LFxuICAgICAgICAgICAgZXhwbGljaXREZXN0OiBkZXN0QXJyYXksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgbmFtZWREZXN0OiBcIlwiLFxuICAgICAgICBleHBsaWNpdERlc3Q6IGRlc3QsXG4gICAgICB9KTtcbiAgICB9KS50aGVuKGRhdGEgPT4ge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuZXhwbGljaXREZXN0KSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvOiBcIiR7ZGF0YS5leHBsaWNpdERlc3R9XCIgaXNgICtcbiAgICAgICAgICAgIGAgbm90IGEgdmFsaWQgZGVzdGluYXRpb24gYXJyYXksIGZvciBkZXN0PVwiJHtkZXN0fVwiLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZ29Ub0Rlc3RpbmF0aW9uKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSBkZXN0IC0gVGhlIFBERiBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBoeXBlcmxpbmsgdG8gdGhlIFBERiBvYmplY3QuXG4gICAqL1xuICBnZXREZXN0aW5hdGlvbkhhc2goZGVzdCkge1xuICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jaG9yVXJsKFwiI1wiICsgZXNjYXBlKGRlc3QpKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVzdCkpIHtcbiAgICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRlc3QpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jaG9yVXJsKFwiI1wiICsgZXNjYXBlKHN0cikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoXCJcIik7XG4gIH1cblxuICAvKipcbiAgICogUHJlZml4IHRoZSBmdWxsIHVybCBvbiBhbmNob3IgbGlua3MgdG8gbWFrZSBzdXJlIHRoYXQgbGlua3MgYXJlIHJlc29sdmVkXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IFVSTCBpbnN0ZWFkIG9mIHRoZSBvbmUgZGVmaW5lZCBpbiA8YmFzZSBocmVmPi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFuY2hvciBUaGUgYW5jaG9yIGhhc2gsIGluY2x1ZGluZyB0aGUgIy5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGVybGluayB0byB0aGUgUERGIG9iamVjdC5cbiAgICovXG4gIGdldEFuY2hvclVybChhbmNob3IpIHtcbiAgICByZXR1cm4gKHRoaXMuYmFzZVVybCB8fCBcIlwiKSArIGFuY2hvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGFzaFxuICAgKi9cbiAgc2V0SGFzaChoYXNoKSB7XG4gICAgbGV0IHBhZ2VOdW1iZXIsIGRlc3Q7XG4gICAgaWYgKGhhc2guaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBwYXJzZVF1ZXJ5U3RyaW5nKGhhc2gpO1xuICAgICAgaWYgKFwic2VhcmNoXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJmaW5kZnJvbXVybGhhc2hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBxdWVyeTogcGFyYW1zLnNlYXJjaC5yZXBsYWNlKC9cIi9nLCBcIlwiKSxcbiAgICAgICAgICBwaHJhc2VTZWFyY2g6IHBhcmFtcy5waHJhc2UgPT09IFwidHJ1ZVwiLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGJvcnJvd2luZyBzeW50YXggZnJvbSBcIlBhcmFtZXRlcnMgZm9yIE9wZW5pbmcgUERGIEZpbGVzXCJcbiAgICAgIGlmIChcInBhZ2VcIiBpbiBwYXJhbXMpIHtcbiAgICAgICAgcGFnZU51bWJlciA9IHBhcmFtcy5wYWdlIHwgMCB8fCAxO1xuICAgICAgfVxuICAgICAgaWYgKFwiem9vbVwiIGluIHBhcmFtcykge1xuICAgICAgICAvLyBCdWlsZCB0aGUgZGVzdGluYXRpb24gYXJyYXkuXG4gICAgICAgIGNvbnN0IHpvb21BcmdzID0gcGFyYW1zLnpvb20uc3BsaXQoXCIsXCIpOyAvLyBzY2FsZSxsZWZ0LHRvcFxuICAgICAgICBjb25zdCB6b29tQXJnID0gem9vbUFyZ3NbMF07XG4gICAgICAgIGNvbnN0IHpvb21BcmdOdW1iZXIgPSBwYXJzZUZsb2F0KHpvb21BcmcpO1xuXG4gICAgICAgIGlmICghem9vbUFyZy5pbmNsdWRlcyhcIkZpdFwiKSkge1xuICAgICAgICAgIC8vIElmIHRoZSB6b29tQXJnIGlzIGEgbnVtYmVyLCBpdCBoYXMgdG8gZ2V0IGRpdmlkZWQgYnkgMTAwLiBJZiBpdCdzXG4gICAgICAgICAgLy8gYSBzdHJpbmcsIGl0IHNob3VsZCBzdGF5IGFzIGl0IGlzLlxuICAgICAgICAgIGRlc3QgPSBbXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgeyBuYW1lOiBcIlhZWlwiIH0sXG4gICAgICAgICAgICB6b29tQXJncy5sZW5ndGggPiAxID8gem9vbUFyZ3NbMV0gfCAwIDogbnVsbCxcbiAgICAgICAgICAgIHpvb21BcmdzLmxlbmd0aCA+IDIgPyB6b29tQXJnc1syXSB8IDAgOiBudWxsLFxuICAgICAgICAgICAgem9vbUFyZ051bWJlciA/IHpvb21BcmdOdW1iZXIgLyAxMDAgOiB6b29tQXJnLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHpvb21BcmcgPT09IFwiRml0XCIgfHwgem9vbUFyZyA9PT0gXCJGaXRCXCIpIHtcbiAgICAgICAgICAgIGRlc3QgPSBbbnVsbCwgeyBuYW1lOiB6b29tQXJnIH1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB6b29tQXJnID09PSBcIkZpdEhcIiB8fFxuICAgICAgICAgICAgem9vbUFyZyA9PT0gXCJGaXRCSFwiIHx8XG4gICAgICAgICAgICB6b29tQXJnID09PSBcIkZpdFZcIiB8fFxuICAgICAgICAgICAgem9vbUFyZyA9PT0gXCJGaXRCVlwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBkZXN0ID0gW1xuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICB7IG5hbWU6IHpvb21BcmcgfSxcbiAgICAgICAgICAgICAgem9vbUFyZ3MubGVuZ3RoID4gMSA/IHpvb21BcmdzWzFdIHwgMCA6IG51bGwsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoem9vbUFyZyA9PT0gXCJGaXRSXCIpIHtcbiAgICAgICAgICAgIGlmICh6b29tQXJncy5sZW5ndGggIT09IDUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnUERGTGlua1NlcnZpY2Uuc2V0SGFzaDogTm90IGVub3VnaCBwYXJhbWV0ZXJzIGZvciBcIkZpdFJcIi4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZXN0ID0gW1xuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgeyBuYW1lOiB6b29tQXJnIH0sXG4gICAgICAgICAgICAgICAgem9vbUFyZ3NbMV0gfCAwLFxuICAgICAgICAgICAgICAgIHpvb21BcmdzWzJdIHwgMCxcbiAgICAgICAgICAgICAgICB6b29tQXJnc1szXSB8IDAsXG4gICAgICAgICAgICAgICAgem9vbUFyZ3NbNF0gfCAwLFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgUERGTGlua1NlcnZpY2Uuc2V0SGFzaDogXCIke3pvb21Bcmd9XCIgaXMgbm90IGAgK1xuICAgICAgICAgICAgICAgIFwiYSB2YWxpZCB6b29tIHZhbHVlLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlc3QpIHtcbiAgICAgICAgdGhpcy5wZGZWaWV3ZXIuc2Nyb2xsUGFnZUludG9WaWV3KHtcbiAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyIHx8IHRoaXMucGFnZSxcbiAgICAgICAgICBkZXN0QXJyYXk6IGRlc3QsXG4gICAgICAgICAgYWxsb3dOZWdhdGl2ZU9mZnNldDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHBhZ2VOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZU51bWJlcjsgLy8gc2ltcGxlIHBhZ2VcbiAgICAgIH1cbiAgICAgIGlmIChcInBhZ2Vtb2RlXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJwYWdlbW9kZVwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIG1vZGU6IHBhcmFtcy5wYWdlbW9kZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyAqYWx3YXlzKiBoYW5kbGVkIGxhc3QsIGluIG9yZGVyIHRvXG4gICAgICAvLyBndWFyYW50ZWUgdGhhdCBpdCB3b24ndCBiZSBvdmVycmlkZGVuIChlLmcuIGJ5IHRoZSBcInBhZ2VcIiBwYXJhbWV0ZXIpLlxuICAgICAgaWYgKFwibmFtZWRkZXN0XCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUbyhwYXJhbXMubmFtZWRkZXN0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmFtZWQgKG9yIGV4cGxpY2l0KSBkZXN0aW5hdGlvbi5cbiAgICAgIGRlc3QgPSB1bmVzY2FwZShoYXNoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlc3QgPSBKU09OLnBhcnNlKGRlc3QpO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkZXN0KSkge1xuICAgICAgICAgIC8vIEF2b2lkIGluY29ycmVjdGx5IHJlamVjdGluZyBhIHZhbGlkIG5hbWVkIGRlc3RpbmF0aW9uLCBzdWNoIGFzXG4gICAgICAgICAgLy8gZS5nLiBcIjQuM1wiIG9yIFwidHJ1ZVwiLCBiZWNhdXNlIGBKU09OLnBhcnNlYCBjb252ZXJ0ZWQgaXRzIHR5cGUuXG4gICAgICAgICAgZGVzdCA9IGRlc3QudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXgpIHt9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gXCJzdHJpbmdcIiB8fCBpc1ZhbGlkRXhwbGljaXREZXN0aW5hdGlvbihkZXN0KSkge1xuICAgICAgICB0aGlzLm5hdmlnYXRlVG8oZGVzdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBQREZMaW5rU2VydmljZS5zZXRIYXNoOiBcIiR7dW5lc2NhcGUoaGFzaCl9XCIgaXMgbm90IGAgK1xuICAgICAgICAgIFwiYSB2YWxpZCBkZXN0aW5hdGlvbi5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvblxuICAgKi9cbiAgZXhlY3V0ZU5hbWVkQWN0aW9uKGFjdGlvbikge1xuICAgIC8vIFNlZSBQREYgcmVmZXJlbmNlLCB0YWJsZSA4LjQ1IC0gTmFtZWQgYWN0aW9uXG4gICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgIGNhc2UgXCJHb0JhY2tcIjpcbiAgICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkge1xuICAgICAgICAgIHRoaXMucGRmSGlzdG9yeS5iYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJHb0ZvcndhcmRcIjpcbiAgICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkge1xuICAgICAgICAgIHRoaXMucGRmSGlzdG9yeS5mb3J3YXJkKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJOZXh0UGFnZVwiOlxuICAgICAgICBpZiAodGhpcy5wYWdlIDwgdGhpcy5wYWdlc0NvdW50KSB7XG4gICAgICAgICAgdGhpcy5wYWdlKys7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJQcmV2UGFnZVwiOlxuICAgICAgICBpZiAodGhpcy5wYWdlID4gMSkge1xuICAgICAgICAgIHRoaXMucGFnZS0tO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiTGFzdFBhZ2VcIjpcbiAgICAgICAgdGhpcy5wYWdlID0gdGhpcy5wYWdlc0NvdW50O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkZpcnN0UGFnZVwiOlxuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7IC8vIE5vIGFjdGlvbiBhY2NvcmRpbmcgdG8gc3BlY1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJuYW1lZGFjdGlvblwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBhY3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VOdW0gLSBwYWdlIG51bWJlci5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhZ2VSZWYgLSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UuXG4gICAqL1xuICBjYWNoZVBhZ2VSZWYocGFnZU51bSwgcGFnZVJlZikge1xuICAgIGlmICghcGFnZVJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWZTdHIgPVxuICAgICAgcGFnZVJlZi5nZW4gPT09IDAgPyBgJHtwYWdlUmVmLm51bX1SYCA6IGAke3BhZ2VSZWYubnVtfVIke3BhZ2VSZWYuZ2VufWA7XG4gICAgdGhpcy5fcGFnZXNSZWZDYWNoZVtyZWZTdHJdID0gcGFnZU51bTtcbiAgfVxuXG4gIF9jYWNoZWRQYWdlTnVtYmVyKHBhZ2VSZWYpIHtcbiAgICBjb25zdCByZWZTdHIgPVxuICAgICAgcGFnZVJlZi5nZW4gPT09IDAgPyBgJHtwYWdlUmVmLm51bX1SYCA6IGAke3BhZ2VSZWYubnVtfVIke3BhZ2VSZWYuZ2VufWA7XG4gICAgcmV0dXJuICh0aGlzLl9wYWdlc1JlZkNhY2hlICYmIHRoaXMuX3BhZ2VzUmVmQ2FjaGVbcmVmU3RyXSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZU51bWJlclxuICAgKi9cbiAgaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucGRmVmlld2VyLmlzUGFnZVZpc2libGUocGFnZU51bWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNWYWxpZEV4cGxpY2l0RGVzdGluYXRpb24oZGVzdCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVzdExlbmd0aCA9IGRlc3QubGVuZ3RoO1xuICBpZiAoZGVzdExlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcGFnZSA9IGRlc3RbMF07XG4gIGlmIChcbiAgICAhKFxuICAgICAgdHlwZW9mIHBhZ2UgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIE51bWJlci5pc0ludGVnZXIocGFnZS5udW0pICYmXG4gICAgICBOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UuZ2VuKVxuICAgICkgJiZcbiAgICAhKE51bWJlci5pc0ludGVnZXIocGFnZSkgJiYgcGFnZSA+PSAwKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgem9vbSA9IGRlc3RbMV07XG4gIGlmICghKHR5cGVvZiB6b29tID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB6b29tLm5hbWUgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBhbGxvd051bGwgPSB0cnVlO1xuICBzd2l0Y2ggKHpvb20ubmFtZSkge1xuICAgIGNhc2UgXCJYWVpcIjpcbiAgICAgIGlmIChkZXN0TGVuZ3RoICE9PSA1KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJGaXRcIjpcbiAgICBjYXNlIFwiRml0QlwiOlxuICAgICAgcmV0dXJuIGRlc3RMZW5ndGggPT09IDI7XG4gICAgY2FzZSBcIkZpdEhcIjpcbiAgICBjYXNlIFwiRml0QkhcIjpcbiAgICBjYXNlIFwiRml0VlwiOlxuICAgIGNhc2UgXCJGaXRCVlwiOlxuICAgICAgaWYgKGRlc3RMZW5ndGggIT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIkZpdFJcIjpcbiAgICAgIGlmIChkZXN0TGVuZ3RoICE9PSA2KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGFsbG93TnVsbCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMjsgaSA8IGRlc3RMZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBhcmFtID0gZGVzdFtpXTtcbiAgICBpZiAoISh0eXBlb2YgcGFyYW0gPT09IFwibnVtYmVyXCIgfHwgKGFsbG93TnVsbCAmJiBwYXJhbSA9PT0gbnVsbCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtJUERGTGlua1NlcnZpY2V9XG4gKi9cbmNsYXNzIFNpbXBsZUxpbmtTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5leHRlcm5hbExpbmtUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rUmVsID0gbnVsbDtcbiAgICB0aGlzLmV4dGVybmFsTGlua0VuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuX2lnbm9yZURlc3RpbmF0aW9uWm9vbSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcGFnZXNDb3VudCgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHBhZ2UoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqL1xuICBzZXQgcGFnZSh2YWx1ZSkge31cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCByb3RhdGlvbigpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICovXG4gIHNldCByb3RhdGlvbih2YWx1ZSkge31cblxuICAvKipcbiAgICogQHBhcmFtIGRlc3QgLSBUaGUgUERGIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICovXG4gIG5hdmlnYXRlVG8oZGVzdCkge31cblxuICAvKipcbiAgICogQHBhcmFtIGRlc3QgLSBUaGUgUERGIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGVybGluayB0byB0aGUgUERGIG9iamVjdC5cbiAgICovXG4gIGdldERlc3RpbmF0aW9uSGFzaChkZXN0KSB7XG4gICAgcmV0dXJuIFwiI1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBoYXNoIC0gVGhlIFBERiBwYXJhbWV0ZXJzL2hhc2guXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBoeXBlcmxpbmsgdG8gdGhlIFBERiBvYmplY3QuXG4gICAqL1xuICBnZXRBbmNob3JVcmwoaGFzaCkge1xuICAgIHJldHVybiBcIiNcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGFzaFxuICAgKi9cbiAgc2V0SGFzaChoYXNoKSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uXG4gICAqL1xuICBleGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZU51bSAtIHBhZ2UgbnVtYmVyLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFnZVJlZiAtIHJlZmVyZW5jZSB0byB0aGUgcGFnZS5cbiAgICovXG4gIGNhY2hlUGFnZVJlZihwYWdlTnVtLCBwYWdlUmVmKSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZU51bWJlclxuICAgKi9cbiAgaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IHsgUERGTGlua1NlcnZpY2UsIFNpbXBsZUxpbmtTZXJ2aWNlIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgcmVuZGVyVGV4dExheWVyIH0gZnJvbSBcInBkZmpzLWxpYlwiO1xuXG5jb25zdCBFWFBBTkRfRElWU19USU1FT1VUID0gMzAwOyAvLyBtc1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRMYXllckJ1aWxkZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSB0ZXh0TGF5ZXJEaXYgLSBUaGUgdGV4dCBsYXllciBjb250YWluZXIuXG4gKiBAcHJvcGVydHkge0V2ZW50QnVzfSBldmVudEJ1cyAtIFRoZSBhcHBsaWNhdGlvbiBldmVudCBidXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGFnZUluZGV4IC0gVGhlIHBhZ2UgaW5kZXguXG4gKiBAcHJvcGVydHkge1BhZ2VWaWV3cG9ydH0gdmlld3BvcnQgLSBUaGUgdmlld3BvcnQgb2YgdGhlIHRleHQgbGF5ZXIuXG4gKiBAcHJvcGVydHkge1BERkZpbmRDb250cm9sbGVyfSBmaW5kQ29udHJvbGxlclxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmhhbmNlVGV4dFNlbGVjdGlvbiAtIE9wdGlvbiB0byB0dXJuIG9uIGltcHJvdmVkXG4gKiAgIHRleHQgc2VsZWN0aW9uLlxuICovXG5cbi8qKlxuICogVGhlIHRleHQgbGF5ZXIgYnVpbGRlciBwcm92aWRlcyB0ZXh0IHNlbGVjdGlvbiBmdW5jdGlvbmFsaXR5IGZvciB0aGUgUERGLlxuICogSXQgZG9lcyB0aGlzIGJ5IGNyZWF0aW5nIG92ZXJsYXkgZGl2cyBvdmVyIHRoZSBQREYncyB0ZXh0LiBUaGVzZSBkaXZzXG4gKiBjb250YWluIHRleHQgdGhhdCBtYXRjaGVzIHRoZSBQREYgdGV4dCB0aGV5IGFyZSBvdmVybGF5aW5nLiBUaGlzIG9iamVjdFxuICogYWxzbyBwcm92aWRlcyBhIHdheSB0byBoaWdobGlnaHQgdGV4dCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvci5cbiAqL1xuY2xhc3MgVGV4dExheWVyQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB0ZXh0TGF5ZXJEaXYsXG4gICAgZXZlbnRCdXMsXG4gICAgcGFnZUluZGV4LFxuICAgIHZpZXdwb3J0LFxuICAgIGZpbmRDb250cm9sbGVyID0gbnVsbCxcbiAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGZhbHNlLFxuICB9KSB7XG4gICAgdGhpcy50ZXh0TGF5ZXJEaXYgPSB0ZXh0TGF5ZXJEaXY7XG4gICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBudWxsO1xuICAgIHRoaXMudGV4dENvbnRlbnRJdGVtc1N0ciA9IFtdO1xuICAgIHRoaXMudGV4dENvbnRlbnRTdHJlYW0gPSBudWxsO1xuICAgIHRoaXMucmVuZGVyaW5nRG9uZSA9IGZhbHNlO1xuICAgIHRoaXMucGFnZUlkeCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLnBhZ2VOdW1iZXIgPSB0aGlzLnBhZ2VJZHggKyAxO1xuICAgIHRoaXMubWF0Y2hlcyA9IFtdO1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICB0aGlzLnRleHREaXZzID0gW107XG4gICAgdGhpcy5maW5kQ29udHJvbGxlciA9IGZpbmRDb250cm9sbGVyO1xuICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzayA9IG51bGw7XG4gICAgdGhpcy5lbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGVuaGFuY2VUZXh0U2VsZWN0aW9uO1xuXG4gICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzID0gbnVsbDtcbiAgICB0aGlzLl9iaW5kTW91c2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZpbmlzaFJlbmRlcmluZygpIHtcbiAgICB0aGlzLnJlbmRlcmluZ0RvbmUgPSB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCBlbmRPZkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZW5kT2ZDb250ZW50LmNsYXNzTmFtZSA9IFwiZW5kT2ZDb250ZW50XCI7XG4gICAgICB0aGlzLnRleHRMYXllckRpdi5hcHBlbmRDaGlsZChlbmRPZkNvbnRlbnQpO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJ0ZXh0bGF5ZXJyZW5kZXJlZFwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBwYWdlTnVtYmVyOiB0aGlzLnBhZ2VOdW1iZXIsXG4gICAgICBudW1UZXh0RGl2czogdGhpcy50ZXh0RGl2cy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgdGV4dCBsYXllci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0XSAtIFdhaXQgZm9yIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBtaWxsaXNlY29uZHNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSByZW5kZXJpbmcuXG4gICAqL1xuICByZW5kZXIodGltZW91dCA9IDApIHtcbiAgICBpZiAoISh0aGlzLnRleHRDb250ZW50IHx8IHRoaXMudGV4dENvbnRlbnRTdHJlYW0pIHx8IHRoaXMucmVuZGVyaW5nRG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNhbmNlbCgpO1xuXG4gICAgdGhpcy50ZXh0RGl2cyA9IFtdO1xuICAgIGNvbnN0IHRleHRMYXllckZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrID0gcmVuZGVyVGV4dExheWVyKHtcbiAgICAgIHRleHRDb250ZW50OiB0aGlzLnRleHRDb250ZW50LFxuICAgICAgdGV4dENvbnRlbnRTdHJlYW06IHRoaXMudGV4dENvbnRlbnRTdHJlYW0sXG4gICAgICBjb250YWluZXI6IHRleHRMYXllckZyYWcsXG4gICAgICB2aWV3cG9ydDogdGhpcy52aWV3cG9ydCxcbiAgICAgIHRleHREaXZzOiB0aGlzLnRleHREaXZzLFxuICAgICAgdGV4dENvbnRlbnRJdGVtc1N0cjogdGhpcy50ZXh0Q29udGVudEl0ZW1zU3RyLFxuICAgICAgdGltZW91dCxcbiAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiB0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uLFxuICAgIH0pO1xuICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5wcm9taXNlLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMudGV4dExheWVyRGl2LmFwcGVuZENoaWxkKHRleHRMYXllckZyYWcpO1xuICAgICAgICB0aGlzLl9maW5pc2hSZW5kZXJpbmcoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTWF0Y2hlcygpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gQ2FuY2VsbGVkIG9yIGZhaWxlZCB0byByZW5kZXIgdGV4dCBsYXllcjsgc2tpcHBpbmcgZXJyb3JzLlxuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcykge1xuICAgICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzID0gZXZ0ID0+IHtcbiAgICAgICAgaWYgKGV2dC5wYWdlSW5kZXggPT09IHRoaXMucGFnZUlkeCB8fCBldnQucGFnZUluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuZXZlbnRCdXMuX29uKFxuICAgICAgICBcInVwZGF0ZXRleHRsYXllcm1hdGNoZXNcIixcbiAgICAgICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgcmVuZGVyaW5nIG9mIHRoZSB0ZXh0IGxheWVyLlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLnRleHRMYXllclJlbmRlclRhc2spIHtcbiAgICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5jYW5jZWwoKTtcbiAgICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzayA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMpIHtcbiAgICAgIHRoaXMuZXZlbnRCdXMuX29mZihcbiAgICAgICAgXCJ1cGRhdGV0ZXh0bGF5ZXJtYXRjaGVzXCIsXG4gICAgICAgIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlc1xuICAgICAgKTtcbiAgICAgIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2V0VGV4dENvbnRlbnRTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHtcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIHRoaXMudGV4dENvbnRlbnRTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTtcbiAgfVxuXG4gIHNldFRleHRDb250ZW50KHRleHRDb250ZW50KSB7XG4gICAgdGhpcy5jYW5jZWwoKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XG4gIH1cblxuICBfY29udmVydE1hdGNoZXMobWF0Y2hlcywgbWF0Y2hlc0xlbmd0aCkge1xuICAgIC8vIEVhcmx5IGV4aXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byBjb252ZXJ0LlxuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCB7IGZpbmRDb250cm9sbGVyLCB0ZXh0Q29udGVudEl0ZW1zU3RyIH0gPSB0aGlzO1xuXG4gICAgbGV0IGkgPSAwLFxuICAgICAgaUluZGV4ID0gMDtcbiAgICBjb25zdCBlbmQgPSB0ZXh0Q29udGVudEl0ZW1zU3RyLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgcXVlcnlMZW4gPSBmaW5kQ29udHJvbGxlci5zdGF0ZS5xdWVyeS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBmb3IgKGxldCBtID0gMCwgbW0gPSBtYXRjaGVzLmxlbmd0aDsgbSA8IG1tOyBtKyspIHtcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICBsZXQgbWF0Y2hJZHggPSBtYXRjaGVzW21dO1xuXG4gICAgICAvLyBMb29wIG92ZXIgdGhlIGRpdklkeHMuXG4gICAgICB3aGlsZSAoaSAhPT0gZW5kICYmIG1hdGNoSWR4ID49IGlJbmRleCArIHRleHRDb250ZW50SXRlbXNTdHJbaV0ubGVuZ3RoKSB7XG4gICAgICAgIGlJbmRleCArPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aDtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaSA9PT0gdGV4dENvbnRlbnRJdGVtc1N0ci5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgbWFwcGluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2ggPSB7XG4gICAgICAgIGJlZ2luOiB7XG4gICAgICAgICAgZGl2SWR4OiBpLFxuICAgICAgICAgIG9mZnNldDogbWF0Y2hJZHggLSBpSW5kZXgsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgIGlmIChtYXRjaGVzTGVuZ3RoKSB7XG4gICAgICAgIC8vIE11bHRpdGVybSBzZWFyY2guXG4gICAgICAgIG1hdGNoSWR4ICs9IG1hdGNoZXNMZW5ndGhbbV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQaHJhc2Ugc2VhcmNoLlxuICAgICAgICBtYXRjaElkeCArPSBxdWVyeUxlbjtcbiAgICAgIH1cblxuICAgICAgLy8gU29tZXdoYXQgdGhlIHNhbWUgYXJyYXkgYXMgYWJvdmUsIGJ1dCB1c2UgPiBpbnN0ZWFkIG9mID49IHRvIGdldFxuICAgICAgLy8gdGhlIGVuZCBwb3NpdGlvbiByaWdodC5cbiAgICAgIHdoaWxlIChpICE9PSBlbmQgJiYgbWF0Y2hJZHggPiBpSW5kZXggKyB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aCkge1xuICAgICAgICBpSW5kZXggKz0gdGV4dENvbnRlbnRJdGVtc1N0cltpXS5sZW5ndGg7XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgbWF0Y2guZW5kID0ge1xuICAgICAgICBkaXZJZHg6IGksXG4gICAgICAgIG9mZnNldDogbWF0Y2hJZHggLSBpSW5kZXgsXG4gICAgICB9O1xuICAgICAgcmVzdWx0LnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbmRlck1hdGNoZXMobWF0Y2hlcykge1xuICAgIC8vIEVhcmx5IGV4aXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZW5kZXIuXG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgZmluZENvbnRyb2xsZXIsIHBhZ2VJZHgsIHRleHRDb250ZW50SXRlbXNTdHIsIHRleHREaXZzIH0gPSB0aGlzO1xuXG4gICAgY29uc3QgaXNTZWxlY3RlZFBhZ2UgPSBwYWdlSWR4ID09PSBmaW5kQ29udHJvbGxlci5zZWxlY3RlZC5wYWdlSWR4O1xuICAgIGNvbnN0IHNlbGVjdGVkTWF0Y2hJZHggPSBmaW5kQ29udHJvbGxlci5zZWxlY3RlZC5tYXRjaElkeDtcbiAgICBjb25zdCBoaWdobGlnaHRBbGwgPSBmaW5kQ29udHJvbGxlci5zdGF0ZS5oaWdobGlnaHRBbGw7XG4gICAgbGV0IHByZXZFbmQgPSBudWxsO1xuICAgIGNvbnN0IGluZmluaXR5ID0ge1xuICAgICAgZGl2SWR4OiAtMSxcbiAgICAgIG9mZnNldDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBiZWdpblRleHQoYmVnaW4sIGNsYXNzTmFtZSkge1xuICAgICAgY29uc3QgZGl2SWR4ID0gYmVnaW4uZGl2SWR4O1xuICAgICAgdGV4dERpdnNbZGl2SWR4XS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICBhcHBlbmRUZXh0VG9EaXYoZGl2SWR4LCAwLCBiZWdpbi5vZmZzZXQsIGNsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwZW5kVGV4dFRvRGl2KGRpdklkeCwgZnJvbU9mZnNldCwgdG9PZmZzZXQsIGNsYXNzTmFtZSkge1xuICAgICAgY29uc3QgZGl2ID0gdGV4dERpdnNbZGl2SWR4XTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2RpdklkeF0uc3Vic3RyaW5nKFxuICAgICAgICBmcm9tT2Zmc2V0LFxuICAgICAgICB0b09mZnNldFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KTtcbiAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgc3Bhbi5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgfVxuXG4gICAgbGV0IGkwID0gc2VsZWN0ZWRNYXRjaElkeCxcbiAgICAgIGkxID0gaTAgKyAxO1xuICAgIGlmIChoaWdobGlnaHRBbGwpIHtcbiAgICAgIGkwID0gMDtcbiAgICAgIGkxID0gbWF0Y2hlcy5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICghaXNTZWxlY3RlZFBhZ2UpIHtcbiAgICAgIC8vIE5vdCBoaWdobGlnaHRpbmcgYWxsIGFuZCB0aGlzIGlzbid0IHRoZSBzZWxlY3RlZCBwYWdlLCBzbyBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBpMDsgaSA8IGkxOyBpKyspIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpXTtcbiAgICAgIGNvbnN0IGJlZ2luID0gbWF0Y2guYmVnaW47XG4gICAgICBjb25zdCBlbmQgPSBtYXRjaC5lbmQ7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkID0gaXNTZWxlY3RlZFBhZ2UgJiYgaSA9PT0gc2VsZWN0ZWRNYXRjaElkeDtcbiAgICAgIGNvbnN0IGhpZ2hsaWdodFN1ZmZpeCA9IGlzU2VsZWN0ZWQgPyBcIiBzZWxlY3RlZFwiIDogXCJcIjtcblxuICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBzY3JvbGwgdGhlIHNlbGVjdGVkIG1hdGNoIGludG8gdmlldy5cbiAgICAgICAgZmluZENvbnRyb2xsZXIuc2Nyb2xsTWF0Y2hJbnRvVmlldyh7XG4gICAgICAgICAgZWxlbWVudDogdGV4dERpdnNbYmVnaW4uZGl2SWR4XSxcbiAgICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJZHgsXG4gICAgICAgICAgbWF0Y2hJbmRleDogc2VsZWN0ZWRNYXRjaElkeCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hdGNoIGluc2lkZSBuZXcgZGl2LlxuICAgICAgaWYgKCFwcmV2RW5kIHx8IGJlZ2luLmRpdklkeCAhPT0gcHJldkVuZC5kaXZJZHgpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZGl2LCB0aGVuIGFkZCB0aGUgdGV4dCBhdCB0aGUgZW5kLlxuICAgICAgICBpZiAocHJldkVuZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGFwcGVuZFRleHRUb0RpdihwcmV2RW5kLmRpdklkeCwgcHJldkVuZC5vZmZzZXQsIGluZmluaXR5Lm9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgdGhlIGRpdnMgYW5kIHNldCB0aGUgY29udGVudCB1bnRpbCB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gICAgICAgIGJlZ2luVGV4dChiZWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmRUZXh0VG9EaXYocHJldkVuZC5kaXZJZHgsIHByZXZFbmQub2Zmc2V0LCBiZWdpbi5vZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmVnaW4uZGl2SWR4ID09PSBlbmQuZGl2SWR4KSB7XG4gICAgICAgIGFwcGVuZFRleHRUb0RpdihcbiAgICAgICAgICBiZWdpbi5kaXZJZHgsXG4gICAgICAgICAgYmVnaW4ub2Zmc2V0LFxuICAgICAgICAgIGVuZC5vZmZzZXQsXG4gICAgICAgICAgXCJoaWdobGlnaHRcIiArIGhpZ2hsaWdodFN1ZmZpeFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kVGV4dFRvRGl2KFxuICAgICAgICAgIGJlZ2luLmRpdklkeCxcbiAgICAgICAgICBiZWdpbi5vZmZzZXQsXG4gICAgICAgICAgaW5maW5pdHkub2Zmc2V0LFxuICAgICAgICAgIFwiaGlnaGxpZ2h0IGJlZ2luXCIgKyBoaWdobGlnaHRTdWZmaXhcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChsZXQgbjAgPSBiZWdpbi5kaXZJZHggKyAxLCBuMSA9IGVuZC5kaXZJZHg7IG4wIDwgbjE7IG4wKyspIHtcbiAgICAgICAgICB0ZXh0RGl2c1tuMF0uY2xhc3NOYW1lID0gXCJoaWdobGlnaHQgbWlkZGxlXCIgKyBoaWdobGlnaHRTdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgYmVnaW5UZXh0KGVuZCwgXCJoaWdobGlnaHQgZW5kXCIgKyBoaWdobGlnaHRTdWZmaXgpO1xuICAgICAgfVxuICAgICAgcHJldkVuZCA9IGVuZDtcbiAgICB9XG5cbiAgICBpZiAocHJldkVuZCkge1xuICAgICAgYXBwZW5kVGV4dFRvRGl2KHByZXZFbmQuZGl2SWR4LCBwcmV2RW5kLm9mZnNldCwgaW5maW5pdHkub2Zmc2V0KTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlTWF0Y2hlcygpIHtcbiAgICAvLyBPbmx5IHNob3cgbWF0Y2hlcyB3aGVuIGFsbCByZW5kZXJpbmcgaXMgZG9uZS5cbiAgICBpZiAoIXRoaXMucmVuZGVyaW5nRG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBmaW5kQ29udHJvbGxlcixcbiAgICAgIG1hdGNoZXMsXG4gICAgICBwYWdlSWR4LFxuICAgICAgdGV4dENvbnRlbnRJdGVtc1N0cixcbiAgICAgIHRleHREaXZzLFxuICAgIH0gPSB0aGlzO1xuICAgIGxldCBjbGVhcmVkVW50aWxEaXZJZHggPSAtMTtcblxuICAgIC8vIENsZWFyIGFsbCBjdXJyZW50IG1hdGNoZXMuXG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbWF0Y2hlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IG1hdGNoZXNbaV07XG4gICAgICBjb25zdCBiZWdpbiA9IE1hdGgubWF4KGNsZWFyZWRVbnRpbERpdklkeCwgbWF0Y2guYmVnaW4uZGl2SWR4KTtcbiAgICAgIGZvciAobGV0IG4gPSBiZWdpbiwgZW5kID0gbWF0Y2guZW5kLmRpdklkeDsgbiA8PSBlbmQ7IG4rKykge1xuICAgICAgICBjb25zdCBkaXYgPSB0ZXh0RGl2c1tuXTtcbiAgICAgICAgZGl2LnRleHRDb250ZW50ID0gdGV4dENvbnRlbnRJdGVtc1N0cltuXTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICB9XG4gICAgICBjbGVhcmVkVW50aWxEaXZJZHggPSBtYXRjaC5lbmQuZGl2SWR4ICsgMTtcbiAgICB9XG5cbiAgICBpZiAoIWZpbmRDb250cm9sbGVyIHx8ICFmaW5kQ29udHJvbGxlci5oaWdobGlnaHRNYXRjaGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENvbnZlcnQgdGhlIG1hdGNoZXMgb24gdGhlIGBmaW5kQ29udHJvbGxlcmAgaW50byB0aGUgbWF0Y2ggZm9ybWF0XG4gICAgLy8gdXNlZCBmb3IgdGhlIHRleHRMYXllci5cbiAgICBjb25zdCBwYWdlTWF0Y2hlcyA9IGZpbmRDb250cm9sbGVyLnBhZ2VNYXRjaGVzW3BhZ2VJZHhdIHx8IG51bGw7XG4gICAgY29uc3QgcGFnZU1hdGNoZXNMZW5ndGggPSBmaW5kQ29udHJvbGxlci5wYWdlTWF0Y2hlc0xlbmd0aFtwYWdlSWR4XSB8fCBudWxsO1xuXG4gICAgdGhpcy5tYXRjaGVzID0gdGhpcy5fY29udmVydE1hdGNoZXMocGFnZU1hdGNoZXMsIHBhZ2VNYXRjaGVzTGVuZ3RoKTtcbiAgICB0aGlzLl9yZW5kZXJNYXRjaGVzKHRoaXMubWF0Y2hlcyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wcm92ZXMgdGV4dCBzZWxlY3Rpb24gYnkgYWRkaW5nIGFuIGFkZGl0aW9uYWwgZGl2IHdoZXJlIHRoZSBtb3VzZSB3YXNcbiAgICogY2xpY2tlZC4gVGhpcyByZWR1Y2VzIGZsaWNrZXJpbmcgb2YgdGhlIGNvbnRlbnQgaWYgdGhlIG1vdXNlIGlzIHNsb3dseVxuICAgKiBkcmFnZ2VkIHVwIG9yIGRvd24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYmluZE1vdXNlKCkge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMudGV4dExheWVyRGl2O1xuICAgIGxldCBleHBhbmREaXZzVGltZXIgPSBudWxsO1xuXG4gICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZXZ0ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uICYmIHRoaXMudGV4dExheWVyUmVuZGVyVGFzaykge1xuICAgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2suZXhwYW5kVGV4dERpdnModHJ1ZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8ICFQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTFwiKSkgJiZcbiAgICAgICAgICBleHBhbmREaXZzVGltZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGV4cGFuZERpdnNUaW1lcik7XG4gICAgICAgICAgZXhwYW5kRGl2c1RpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZCA9IGRpdi5xdWVyeVNlbGVjdG9yKFwiLmVuZE9mQ29udGVudFwiKTtcbiAgICAgIGlmICghZW5kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMXCIpKSB7XG4gICAgICAgIC8vIE9uIG5vbi1GaXJlZm94IGJyb3dzZXJzLCB0aGUgc2VsZWN0aW9uIHdpbGwgZmVlbCBiZXR0ZXIgaWYgdGhlIGhlaWdodFxuICAgICAgICAvLyBvZiB0aGUgYGVuZE9mQ29udGVudGAgZGl2IGlzIGFkanVzdGVkIHRvIHN0YXJ0IGF0IG1vdXNlIGNsaWNrXG4gICAgICAgIC8vIGxvY2F0aW9uLiBUaGlzIGF2b2lkcyBmbGlja2VyaW5nIHdoZW4gdGhlIHNlbGVjdGlvbiBtb3ZlcyB1cC5cbiAgICAgICAgLy8gSG93ZXZlciBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gc2VsZWN0aW9uIGlzIHN0YXJ0ZWQgb24gZW1wdHkgc3BhY2UuXG4gICAgICAgIGxldCBhZGp1c3RUb3AgPSBldnQudGFyZ2V0ICE9PSBkaXY7XG4gICAgICAgIGlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgUERGSlNEZXYudGVzdChcIkdFTkVSSUNcIikpIHtcbiAgICAgICAgICBhZGp1c3RUb3AgPVxuICAgICAgICAgICAgYWRqdXN0VG9wICYmXG4gICAgICAgICAgICB3aW5kb3dcbiAgICAgICAgICAgICAgLmdldENvbXB1dGVkU3R5bGUoZW5kKVxuICAgICAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZShcIi1tb3otdXNlci1zZWxlY3RcIikgIT09IFwibm9uZVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZGp1c3RUb3ApIHtcbiAgICAgICAgICBjb25zdCBkaXZCb3VuZHMgPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgY29uc3QgciA9IE1hdGgubWF4KDAsIChldnQucGFnZVkgLSBkaXZCb3VuZHMudG9wKSAvIGRpdkJvdW5kcy5oZWlnaHQpO1xuICAgICAgICAgIGVuZC5zdHlsZS50b3AgPSAociAqIDEwMCkudG9GaXhlZCgyKSArIFwiJVwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbmQuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICB9KTtcblxuICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5lbmhhbmNlVGV4dFNlbGVjdGlvbiAmJiB0aGlzLnRleHRMYXllclJlbmRlclRhc2spIHtcbiAgICAgICAgaWYgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUxcIikpIHtcbiAgICAgICAgICBleHBhbmREaXZzVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRleHRMYXllclJlbmRlclRhc2spIHtcbiAgICAgICAgICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrLmV4cGFuZFRleHREaXZzKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4cGFuZERpdnNUaW1lciA9IG51bGw7XG4gICAgICAgICAgfSwgRVhQQU5EX0RJVlNfVElNRU9VVCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrLmV4cGFuZFRleHREaXZzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZCA9IGRpdi5xdWVyeVNlbGVjdG9yKFwiLmVuZE9mQ29udGVudFwiKTtcbiAgICAgIGlmICghZW5kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgUERGSlNEZXYgPT09IFwidW5kZWZpbmVkXCIgfHwgIVBERkpTRGV2LnRlc3QoXCJNT1pDRU5UUkFMXCIpKSB7XG4gICAgICAgIGVuZC5zdHlsZS50b3AgPSBcIlwiO1xuICAgICAgfVxuICAgICAgZW5kLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAaW1wbGVtZW50cyBJUERGVGV4dExheWVyRmFjdG9yeVxuICovXG5jbGFzcyBEZWZhdWx0VGV4dExheWVyRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSB0ZXh0TGF5ZXJEaXZcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VJbmRleFxuICAgKiBAcGFyYW0ge1BhZ2VWaWV3cG9ydH0gdmlld3BvcnRcbiAgICogQHBhcmFtIHtib29sZWFufSBlbmhhbmNlVGV4dFNlbGVjdGlvblxuICAgKiBAcGFyYW0ge0V2ZW50QnVzfSBldmVudEJ1c1xuICAgKiBAcmV0dXJucyB7VGV4dExheWVyQnVpbGRlcn1cbiAgICovXG4gIGNyZWF0ZVRleHRMYXllckJ1aWxkZXIoXG4gICAgdGV4dExheWVyRGl2LFxuICAgIHBhZ2VJbmRleCxcbiAgICB2aWV3cG9ydCxcbiAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGZhbHNlLFxuICAgIGV2ZW50QnVzXG4gICkge1xuICAgIHJldHVybiBuZXcgVGV4dExheWVyQnVpbGRlcih7XG4gICAgICB0ZXh0TGF5ZXJEaXYsXG4gICAgICBwYWdlSW5kZXgsXG4gICAgICB2aWV3cG9ydCxcbiAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uLFxuICAgICAgZXZlbnRCdXMsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVGV4dExheWVyQnVpbGRlciwgRGVmYXVsdFRleHRMYXllckZhY3RvcnkgfTtcbiIsIi8qIENvcHlyaWdodCAyMDEzIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVPYmplY3RVUkwsIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgfSBmcm9tIFwicGRmanMtbGliXCI7XG5pbXBvcnQgeyB2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zIH0gZnJvbSBcIi4vdmlld2VyX2NvbXBhdGliaWxpdHkuanNcIjtcblxuaWYgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhUERGSlNEZXYudGVzdChcIkNIUk9NRSB8fCBHRU5FUklDXCIpKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnTW9kdWxlIFwicGRmanMtd2ViL2Rvd25sb2FkX21hbmFnZXJcIiBzaGFsbCBub3QgYmUgdXNlZCAnICtcbiAgICAgIFwib3V0c2lkZSBDSFJPTUUgYW5kIEdFTkVSSUMgYnVpbGRzLlwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkKGJsb2JVcmwsIGZpbGVuYW1lKSB7XG4gIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgaWYgKCFhLmNsaWNrKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEb3dubG9hZE1hbmFnZXI6IFwiYS5jbGljaygpXCIgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgfVxuICBhLmhyZWYgPSBibG9iVXJsO1xuICBhLnRhcmdldCA9IFwiX3BhcmVudFwiO1xuICAvLyBVc2UgYS5kb3dubG9hZCBpZiBhdmFpbGFibGUuIFRoaXMgaW5jcmVhc2VzIHRoZSBsaWtlbGlob29kIHRoYXRcbiAgLy8gdGhlIGZpbGUgaXMgZG93bmxvYWRlZCBpbnN0ZWFkIG9mIG9wZW5lZCBieSBhbm90aGVyIFBERiBwbHVnaW4uXG4gIGlmIChcImRvd25sb2FkXCIgaW4gYSkge1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgfVxuICAvLyA8YT4gbXVzdCBiZSBpbiB0aGUgZG9jdW1lbnQgZm9yIElFIGFuZCByZWNlbnQgRmlyZWZveCB2ZXJzaW9ucyxcbiAgLy8gb3RoZXJ3aXNlIC5jbGljaygpIGlzIGlnbm9yZWQuXG4gIChkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoYSk7XG4gIGEuY2xpY2soKTtcbiAgYS5yZW1vdmUoKTtcbn1cblxuY2xhc3MgRG93bmxvYWRNYW5hZ2VyIHtcbiAgZG93bmxvYWRVcmwodXJsLCBmaWxlbmFtZSkge1xuICAgIGlmICghY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIFwiaHR0cDovL2V4YW1wbGUuY29tXCIpKSB7XG4gICAgICByZXR1cm47IC8vIHJlc3RyaWN0ZWQvaW52YWxpZCBVUkxcbiAgICB9XG4gICAgZG93bmxvYWQodXJsICsgXCIjcGRmanMuYWN0aW9uPWRvd25sb2FkXCIsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIGRvd25sb2FkRGF0YShkYXRhLCBmaWxlbmFtZSwgY29udGVudFR5cGUpIHtcbiAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcbiAgICAgIC8vIElFMTAgYW5kIGFib3ZlXG4gICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihuZXcgQmxvYihbZGF0YV0sIHsgdHlwZTogY29udGVudFR5cGUgfSksIGZpbGVuYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYmxvYlVybCA9IGNyZWF0ZU9iamVjdFVSTChcbiAgICAgIGRhdGEsXG4gICAgICBjb250ZW50VHlwZSxcbiAgICAgIHZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUNyZWF0ZU9iamVjdFVSTFxuICAgICk7XG4gICAgZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzb3VyY2VFdmVudFR5cGUge3N0cmluZ30gVXNlZCB0byBzaWduYWwgd2hhdCB0cmlnZ2VyZWQgdGhlIGRvd25sb2FkLlxuICAgKiAgIFRoZSB2ZXJzaW9uIG9mIFBERi5qcyBpbnRlZ3JhdGVkIHdpdGggRmlyZWZveCB1c2VzIHRoaXMgdG8gdG8gZGV0ZXJtaW5lXG4gICAqICAgd2hpY2ggZGlhbG9nIHRvIHNob3cuIFwic2F2ZVwiIHRyaWdnZXJzIFwic2F2ZSBhc1wiIGFuZCBcImRvd25sb2FkXCIgdHJpZ2dlcnNcbiAgICogICB0aGUgXCJvcGVuIHdpdGhcIiBkaWFsb2cuXG4gICAqL1xuICBkb3dubG9hZChibG9iLCB1cmwsIGZpbGVuYW1lLCBzb3VyY2VFdmVudFR5cGUgPSBcImRvd25sb2FkXCIpIHtcbiAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcbiAgICAgIC8vIElFMTAgLyBJRTExXG4gICAgICBpZiAoIW5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKSkge1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsKHVybCwgZmlsZW5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVDcmVhdGVPYmplY3RVUkwpIHtcbiAgICAgIC8vIFVSTC5jcmVhdGVPYmplY3RVUkwgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgdGhpcy5kb3dubG9hZFVybCh1cmwsIGZpbGVuYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBkb3dubG9hZChibG9iVXJsLCBmaWxlbmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRG93bmxvYWRNYW5hZ2VyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxOCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgY29tcGF0aWJpbGl0eVBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5pZiAodHlwZW9mIFBERkpTRGV2ID09PSBcInVuZGVmaW5lZFwiIHx8IFBERkpTRGV2LnRlc3QoXCJHRU5FUklDXCIpKSB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9XG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgXCJcIjtcbiAgY29uc3QgcGxhdGZvcm0gPVxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5wbGF0Zm9ybSkgfHwgXCJcIjtcbiAgY29uc3QgbWF4VG91Y2hQb2ludHMgPVxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cykgfHwgMTtcblxuICBjb25zdCBpc0FuZHJvaWQgPSAvQW5kcm9pZC8udGVzdCh1c2VyQWdlbnQpO1xuICBjb25zdCBpc0lFID0gL1RyaWRlbnQvLnRlc3QodXNlckFnZW50KTtcbiAgY29uc3QgaXNJT1MgPVxuICAgIC9cXGIoaVBhZHxpUGhvbmV8aVBvZCkoPz07KS8udGVzdCh1c2VyQWdlbnQpIHx8XG4gICAgKHBsYXRmb3JtID09PSBcIk1hY0ludGVsXCIgJiYgbWF4VG91Y2hQb2ludHMgPiAxKTtcbiAgY29uc3QgaXNJT1NDaHJvbWUgPSAvQ3JpT1MvLnRlc3QodXNlckFnZW50KTtcblxuICAvLyBDaGVja3MgaWYgcG9zc2libGUgdG8gdXNlIFVSTC5jcmVhdGVPYmplY3RVUkwoKVxuICAvLyBTdXBwb3J0OiBJRSwgQ2hyb21lIG9uIGlPU1xuICAoZnVuY3Rpb24gY2hlY2tPbkJsb2JTdXBwb3J0KCkge1xuICAgIC8vIFNvbWV0aW1lcyBJRSBhbmQgQ2hyb21lIG9uIGlPUyBsb3NpbmcgdGhlIGRhdGEgY3JlYXRlZCB3aXRoXG4gICAgLy8gY3JlYXRlT2JqZWN0VVJMKCksIHNlZSBpc3N1ZXMgIzM5NzcgYW5kICM4MDgxLlxuICAgIGlmIChpc0lFIHx8IGlzSU9TQ2hyb21lKSB7XG4gICAgICBjb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVDcmVhdGVPYmplY3RVUkwgPSB0cnVlO1xuICAgIH1cbiAgfSkoKTtcblxuICAvLyBMaW1pdCBjYW52YXMgc2l6ZSB0byA1IG1lZ2EtcGl4ZWxzIG9uIG1vYmlsZS5cbiAgLy8gU3VwcG9ydDogQW5kcm9pZCwgaU9TXG4gIChmdW5jdGlvbiBjaGVja0NhbnZhc1NpemVMaW1pdGF0aW9uKCkge1xuICAgIGlmIChpc0lPUyB8fCBpc0FuZHJvaWQpIHtcbiAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMubWF4Q2FudmFzUGl4ZWxzID0gNTI0Mjg4MDtcbiAgICB9XG4gIH0pKCk7XG59XG5jb25zdCB2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zID0gT2JqZWN0LmZyZWV6ZShjb21wYXRpYmlsaXR5UGFyYW1zKTtcblxuZXhwb3J0IHsgdmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTcgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBcIi4uL2V4dGVybmFsL3dlYkwxMG4vbDEwbi5qc1wiO1xuXG5jb25zdCB3ZWJMMTBuID0gZG9jdW1lbnQud2ViTDEwbjtcblxuY2xhc3MgR2VuZXJpY0wxMG4ge1xuICBjb25zdHJ1Y3RvcihsYW5nKSB7XG4gICAgdGhpcy5fbGFuZyA9IGxhbmc7XG4gICAgdGhpcy5fcmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB3ZWJMMTBuLnNldExhbmd1YWdlKGxhbmcsICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh3ZWJMMTBuKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0TGFuZ3VhZ2UoKSB7XG4gICAgY29uc3QgbDEwbiA9IGF3YWl0IHRoaXMuX3JlYWR5O1xuICAgIHJldHVybiBsMTBuLmdldExhbmd1YWdlKCk7XG4gIH1cblxuICBhc3luYyBnZXREaXJlY3Rpb24oKSB7XG4gICAgY29uc3QgbDEwbiA9IGF3YWl0IHRoaXMuX3JlYWR5O1xuICAgIHJldHVybiBsMTBuLmdldERpcmVjdGlvbigpO1xuICB9XG5cbiAgYXN5bmMgZ2V0KHByb3BlcnR5LCBhcmdzLCBmYWxsYmFjaykge1xuICAgIGNvbnN0IGwxMG4gPSBhd2FpdCB0aGlzLl9yZWFkeTtcbiAgICByZXR1cm4gbDEwbi5nZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jIHRyYW5zbGF0ZShlbGVtZW50KSB7XG4gICAgY29uc3QgbDEwbiA9IGF3YWl0IHRoaXMuX3JlYWR5O1xuICAgIHJldHVybiBsMTBuLnRyYW5zbGF0ZShlbGVtZW50KTtcbiAgfVxufVxuXG5leHBvcnQgeyBHZW5lcmljTDEwbiB9O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMyBGYWJpZW4gQ2F6ZW5hdmUsIE1vemlsbGEuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbiAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3JcbiAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1NcbiAqIElOIFRIRSBTT0ZUV0FSRS5cbiAqL1xuLypcbiAgQWRkaXRpb25hbCBtb2RpZmljYXRpb25zIGZvciBQREYuanMgcHJvamVjdDpcbiAgICAtIERpc2FibGVzIGxhbmd1YWdlIGluaXRpYWxpemF0aW9uIG9uIHBhZ2UgbG9hZGluZy5cbiAgICAtIERpc2FibGVzIGRvY3VtZW50IHRyYW5zbGF0aW9uIG9uIHBhZ2UgbG9hZGluZy5cbiAgICAtIFJlbW92ZXMgY29uc29sZVdhcm4gYW5kIGNvbnNvbGVMb2cgYW5kIHVzZSBjb25zb2xlLmxvZy93YXJuIGRpcmVjdGx5LlxuICAgIC0gUmVtb3ZlcyB3aW5kb3cuXyBhc3NpZ25tZW50LlxuICAgIC0gUmVtb3ZlIGNvbXBhdGliaWxpdHkgY29kZSBmb3IgT2xkSUUuXG4gICAgLSBSZXBsYWNlcyBgU3RyaW5nLnByb3RvdHlwZS5zdWJzdHIoKWAgd2l0aCBgU3RyaW5nLnByb3RvdHlwZS5zdWJzdHJpbmcoKWAuXG4gICAgLSBSZW1vdmVzIGBmaXJlTDEwblJlYWR5RXZlbnRgIHNpbmNlIHRoZSBcImxvY2FsaXplZFwiIGV2ZW50IGl0IGRpc3BhdGNoZXNcbiAgICAgIGlzIHVudXNlZCBhbmQgbWF5IGNsYXNoIHdpdGggYW4gaWRlbnRpY2FsbHkgbmFtZWQgZXZlbnQgaW4gdGhlIHZpZXdlci5cbiovXG5cbi8qanNoaW50IGJyb3dzZXI6IHRydWUsIGRldmVsOiB0cnVlLCBlczU6IHRydWUsIGdsb2JhbHN0cmljdDogdHJ1ZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5kb2N1bWVudC53ZWJMMTBuID0gKGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICB2YXIgZ0wxMG5EYXRhID0ge307XG4gIHZhciBnVGV4dERhdGEgPSAnJztcbiAgdmFyIGdUZXh0UHJvcCA9ICd0ZXh0Q29udGVudCc7XG4gIHZhciBnTGFuZ3VhZ2UgPSAnJztcbiAgdmFyIGdNYWNyb3MgPSB7fTtcbiAgdmFyIGdSZWFkeVN0YXRlID0gJ2xvYWRpbmcnO1xuXG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgbG9hZGluZyBsMTBuIHJlc291cmNlcyBzaWduaWZpY2FudGx5IG1pbmltaXplcyBmbGlja2VyaW5nXG4gICAqIGZyb20gZGlzcGxheWluZyB0aGUgYXBwIHdpdGggbm9uLWxvY2FsaXplZCBzdHJpbmdzIGFuZCB0aGVuIHVwZGF0aW5nIHRoZVxuICAgKiBzdHJpbmdzLiBBbHRob3VnaCB0aGlzIHdpbGwgYmxvY2sgYWxsIHNjcmlwdCBleGVjdXRpb24gb24gdGhpcyBwYWdlLCB3ZVxuICAgKiBleHBlY3QgdGhhdCB0aGUgbDEwbiByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSBsb2NhbGx5IG9uIGZsYXNoLXN0b3JhZ2UuXG4gICAqXG4gICAqIEFzIHN5bmNocm9ub3VzIFhIUiBpcyBnZW5lcmFsbHkgY29uc2lkZXJlZCBhcyBhIGJhZCBpZGVhLCB3ZSdyZSBzdGlsbFxuICAgKiBsb2FkaW5nIGwxMG4gcmVzb3VyY2VzIGFzeW5jaHJvbm91c2x5IC0tIGJ1dCB3ZSBrZWVwIHRoaXMgaW4gYSBzZXR0aW5nLFxuICAgKiBqdXN0IGluIGNhc2UuLi4gYW5kIGFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIGxpYnJhcnkgc2hvdWxkIGhpZGUgdGhlaXJcbiAgICogY29udGVudCB1bnRpbCB0aGUgYGxvY2FsaXplZCcgZXZlbnQgaGFwcGVucy5cbiAgICovXG5cbiAgdmFyIGdBc3luY1Jlc291cmNlTG9hZGluZyA9IHRydWU7IC8vIHJlYWQtb25seVxuXG5cbiAgLyoqXG4gICAqIERPTSBoZWxwZXJzIGZvciB0aGUgc28tY2FsbGVkIFwiSFRNTCBBUElcIi5cbiAgICpcbiAgICogVGhlc2UgZnVuY3Rpb25zIGFyZSB3cml0dGVuIGZvciBtb2Rlcm4gYnJvd3NlcnMuIEZvciBvbGQgdmVyc2lvbnMgb2YgSUUsXG4gICAqIHRoZXkncmUgb3ZlcnJpZGRlbiBpbiB0aGUgJ3N0YXJ0dXAnIHNlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGdldEwxMG5SZXNvdXJjZUxpbmtzKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3R5cGU9XCJhcHBsaWNhdGlvbi9sMTBuXCJdJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMMTBuRGljdGlvbmFyeSgpIHtcbiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3R5cGU9XCJhcHBsaWNhdGlvbi9sMTBuXCJdJyk7XG4gICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBsZSBhbmQgZXh0ZXJuYWwgSlNPTiBkaWN0aW9uYXJpZXNcbiAgICByZXR1cm4gc2NyaXB0ID8gSlNPTi5wYXJzZShzY3JpcHQuaW5uZXJIVE1MKSA6IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJypbZGF0YS1sMTBuLWlkXScpIDogW107XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMMTBuQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KVxuICAgICAgcmV0dXJuIHt9O1xuXG4gICAgdmFyIGwxMG5JZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWwxMG4taWQnKTtcbiAgICB2YXIgbDEwbkFyZ3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1sMTBuLWFyZ3MnKTtcbiAgICB2YXIgYXJncyA9IHt9O1xuICAgIGlmIChsMTBuQXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXJncyA9IEpTT04ucGFyc2UobDEwbkFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ2NvdWxkIG5vdCBwYXJzZSBhcmd1bWVudHMgZm9yICMnICsgbDEwbklkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IGwxMG5JZCwgYXJnczogYXJncyB9O1xuICB9XG5cbiAgZnVuY3Rpb24geGhyTG9hZFRleHQodXJsLCBvblN1Y2Nlc3MsIG9uRmFpbHVyZSkge1xuICAgIG9uU3VjY2VzcyA9IG9uU3VjY2VzcyB8fCBmdW5jdGlvbiBfb25TdWNjZXNzKGRhdGEpIHt9O1xuICAgIG9uRmFpbHVyZSA9IG9uRmFpbHVyZSB8fCBmdW5jdGlvbiBfb25GYWlsdXJlKCkge307XG5cbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgZ0FzeW5jUmVzb3VyY2VMb2FkaW5nKTtcbiAgICBpZiAoeGhyLm92ZXJyaWRlTWltZVR5cGUpIHtcbiAgICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Jyk7XG4gICAgfVxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0KSB7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCB8fCB4aHIuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgb25TdWNjZXNzKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uRmFpbHVyZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB4aHIub25lcnJvciA9IG9uRmFpbHVyZTtcbiAgICB4aHIub250aW1lb3V0ID0gb25GYWlsdXJlO1xuXG4gICAgLy8gaW4gRmlyZWZveCBPUyB3aXRoIHRoZSBhcHA6Ly8gcHJvdG9jb2wsIHRyeWluZyB0byBYSFIgYSBub24tZXhpc3RpbmdcbiAgICAvLyBVUkwgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gaGVyZSAtLSBoZW5jZSB0aGlzIHVnbHkgdHJ5Li4uY2F0Y2guXG4gICAgdHJ5IHtcbiAgICAgIHhoci5zZW5kKG51bGwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9uRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIGwxMG4gcmVzb3VyY2UgcGFyc2VyOlxuICAgKiAgLSByZWFkcyAoYXN5bmMgWEhSKSB0aGUgbDEwbiByZXNvdXJjZSBtYXRjaGluZyBgbGFuZyc7XG4gICAqICAtIGltcG9ydHMgbGlua2VkIHJlc291cmNlcyAoc3luY2hyb25vdXNseSkgd2hlbiBzcGVjaWZpZWQ7XG4gICAqICAtIHBhcnNlcyB0aGUgdGV4dCBkYXRhIChmaWxscyBgZ0wxMG5EYXRhJyBhbmQgYGdUZXh0RGF0YScpO1xuICAgKiAgLSB0cmlnZ2VycyBzdWNjZXNzL2ZhaWx1cmUgY2FsbGJhY2tzIHdoZW4gZG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhyZWZcbiAgICogICAgVVJMIG9mIHRoZSBsMTBuIHJlc291cmNlIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ1xuICAgKiAgICBsb2NhbGUgKGxhbmd1YWdlKSB0byBwYXJzZS4gTXVzdCBiZSBhIGxvd2VyY2FzZSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3NDYWxsYmFja1xuICAgKiAgICB0cmlnZ2VyZWQgd2hlbiB0aGUgbDEwbiByZXNvdXJjZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcGFyc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmYWlsdXJlQ2FsbGJhY2tcbiAgICogICAgdHJpZ2dlcmVkIHdoZW4gdGhlIGFuIGVycm9yIGhhcyBvY2N1cnJlZC5cbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogICAgdXNlcyB0aGUgZm9sbG93aW5nIGdsb2JhbCB2YXJpYWJsZXM6IGdMMTBuRGF0YSwgZ1RleHREYXRhLCBnVGV4dFByb3AuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHBhcnNlUmVzb3VyY2UoaHJlZiwgbGFuZywgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHtcbiAgICB2YXIgYmFzZVVSTCA9IGhyZWYucmVwbGFjZSgvW15cXC9dKiQvLCAnJykgfHwgJy4vJztcblxuICAgIC8vIGhhbmRsZSBlc2NhcGVkIGNoYXJhY3RlcnMgKGJhY2tzbGFzaGVzKSBpbiBhIHN0cmluZ1xuICAgIGZ1bmN0aW9uIGV2YWxTdHJpbmcodGV4dCkge1xuICAgICAgaWYgKHRleHQubGFzdEluZGV4T2YoJ1xcXFwnKSA8IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXG4vZywgJ1xcbicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcci9nLCAnXFxyJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFx0L2csICdcXHQnKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXGIvZywgJ1xcYicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcZi9nLCAnXFxmJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFx7L2csICd7JylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFx9L2csICd9JylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXCcvZywgXCInXCIpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlICoucHJvcGVydGllcyB0ZXh0IGRhdGEgaW50byBhbiBsMTBuIGRpY3Rpb25hcnlcbiAgICAvLyBJZiBnQXN5bmNSZXNvdXJjZUxvYWRpbmcgaXMgZmFsc2UsIHRoZW4gdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkXG4gICAgLy8gc3luY2hyb25vdXNseS4gT3RoZXJ3aXNlIGl0IGlzIGNhbGxlZCBhc3luY2hyb25vdXNseS5cbiAgICBmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXModGV4dCwgcGFyc2VkUHJvcGVydGllc0NhbGxiYWNrKSB7XG4gICAgICB2YXIgZGljdGlvbmFyeSA9IHt9O1xuXG4gICAgICAvLyB0b2tlbiBleHByZXNzaW9uc1xuICAgICAgdmFyIHJlQmxhbmsgPSAvXlxccyp8XFxzKiQvO1xuICAgICAgdmFyIHJlQ29tbWVudCA9IC9eXFxzKiN8XlxccyokLztcbiAgICAgIHZhciByZVNlY3Rpb24gPSAvXlxccypcXFsoLiopXFxdXFxzKiQvO1xuICAgICAgdmFyIHJlSW1wb3J0ID0gL15cXHMqQGltcG9ydFxccyt1cmxcXCgoLiopXFwpXFxzKiQvaTtcbiAgICAgIHZhciByZVNwbGl0ID0gL14oW149XFxzXSopXFxzKj1cXHMqKC4rKSQvOyAvLyBUT0RPOiBlc2NhcGUgRU9McyB3aXRoICdcXCdcblxuICAgICAgLy8gcGFyc2UgdGhlICoucHJvcGVydGllcyBmaWxlIGludG8gYW4gYXNzb2NpYXRpdmUgYXJyYXlcbiAgICAgIGZ1bmN0aW9uIHBhcnNlUmF3TGluZXMocmF3VGV4dCwgZXh0ZW5kZWRTeW50YXgsIHBhcnNlZFJhd0xpbmVzQ2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGVudHJpZXMgPSByYXdUZXh0LnJlcGxhY2UocmVCbGFuaywgJycpLnNwbGl0KC9bXFxyXFxuXSsvKTtcbiAgICAgICAgdmFyIGN1cnJlbnRMYW5nID0gJyonO1xuICAgICAgICB2YXIgZ2VuZXJpY0xhbmcgPSBsYW5nLnNwbGl0KCctJywgMSlbMF07XG4gICAgICAgIHZhciBza2lwTGFuZyA9IGZhbHNlO1xuICAgICAgICB2YXIgbWF0Y2ggPSAnJztcblxuICAgICAgICBmdW5jdGlvbiBuZXh0RW50cnkoKSB7XG4gICAgICAgICAgLy8gVXNlIGluZmluaXRlIGxvb3AgaW5zdGVhZCBvZiByZWN1cnNpb24gdG8gYXZvaWQgcmVhY2hpbmcgdGhlXG4gICAgICAgICAgLy8gbWF4aW11bSByZWN1cnNpb24gbGltaXQgZm9yIGNvbnRlbnQgd2l0aCBtYW55IGxpbmVzLlxuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHBhcnNlZFJhd0xpbmVzQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxpbmUgPSBlbnRyaWVzLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgIC8vIGNvbW1lbnQgb3IgYmxhbmsgbGluZT9cbiAgICAgICAgICAgIGlmIChyZUNvbW1lbnQudGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHRoZSBleHRlbmRlZCBzeW50YXggc3VwcG9ydHMgW2xhbmddIHNlY3Rpb25zIGFuZCBAaW1wb3J0IHJ1bGVzXG4gICAgICAgICAgICBpZiAoZXh0ZW5kZWRTeW50YXgpIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSByZVNlY3Rpb24uZXhlYyhsaW5lKTtcbiAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7IC8vIHNlY3Rpb24gc3RhcnQ/XG4gICAgICAgICAgICAgICAgLy8gUkZDIDQ2NDYsIHNlY3Rpb24gNC40LCBcIkFsbCBjb21wYXJpc29ucyBNVVNUIGJlIHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgIC8vIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIuXCJcblxuICAgICAgICAgICAgICAgIGN1cnJlbnRMYW5nID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBza2lwTGFuZyA9IChjdXJyZW50TGFuZyAhPT0gJyonKSAmJlxuICAgICAgICAgICAgICAgICAgICAoY3VycmVudExhbmcgIT09IGxhbmcpICYmIChjdXJyZW50TGFuZyAhPT0gZ2VuZXJpY0xhbmcpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNraXBMYW5nKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF0Y2ggPSByZUltcG9ydC5leGVjKGxpbmUpO1xuICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsgLy8gQGltcG9ydCBydWxlP1xuICAgICAgICAgICAgICAgIGxvYWRJbXBvcnQoYmFzZVVSTCArIG1hdGNoWzFdLCBuZXh0RW50cnkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBrZXktdmFsdWUgcGFpclxuICAgICAgICAgICAgdmFyIHRtcCA9IGxpbmUubWF0Y2gocmVTcGxpdCk7XG4gICAgICAgICAgICBpZiAodG1wICYmIHRtcC5sZW5ndGggPT0gMykge1xuICAgICAgICAgICAgICBkaWN0aW9uYXJ5W3RtcFsxXV0gPSBldmFsU3RyaW5nKHRtcFsyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5leHRFbnRyeSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBpbXBvcnQgYW5vdGhlciAqLnByb3BlcnRpZXMgZmlsZVxuICAgICAgZnVuY3Rpb24gbG9hZEltcG9ydCh1cmwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHhockxvYWRUZXh0KHVybCwgZnVuY3Rpb24oY29udGVudCkge1xuICAgICAgICAgIHBhcnNlUmF3TGluZXMoY29udGVudCwgZmFsc2UsIGNhbGxiYWNrKTsgLy8gZG9uJ3QgYWxsb3cgcmVjdXJzaXZlIGltcG9ydHNcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUud2Fybih1cmwgKyAnIG5vdCBmb3VuZC4nKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gZmlsbCB0aGUgZGljdGlvbmFyeVxuICAgICAgcGFyc2VSYXdMaW5lcyh0ZXh0LCB0cnVlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcGFyc2VkUHJvcGVydGllc0NhbGxiYWNrKGRpY3Rpb25hcnkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gbG9hZCBhbmQgcGFyc2UgbDEwbiBkYXRhICh3YXJuaW5nOiBnbG9iYWwgdmFyaWFibGVzIGFyZSB1c2VkIGhlcmUpXG4gICAgeGhyTG9hZFRleHQoaHJlZiwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIGdUZXh0RGF0YSArPSByZXNwb25zZTsgLy8gbW9zdGx5IGZvciBkZWJ1Z1xuXG4gICAgICAvLyBwYXJzZSAqLnByb3BlcnRpZXMgdGV4dCBkYXRhIGludG8gYW4gbDEwbiBkaWN0aW9uYXJ5XG4gICAgICBwYXJzZVByb3BlcnRpZXMocmVzcG9uc2UsIGZ1bmN0aW9uKGRhdGEpIHtcblxuICAgICAgICAvLyBmaW5kIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbnMsIGlmIGFueVxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIHZhciBpZCwgcHJvcCwgaW5kZXggPSBrZXkubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7IC8vIGFuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICAgICAgICAgIGlkID0ga2V5LnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICAgICAgICBwcm9wID0ga2V5LnN1YnN0cmluZyhpbmRleCArIDEpO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIGF0dHJpYnV0ZTogYXNzdW1pbmcgdGV4dCBjb250ZW50IGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGlkID0ga2V5O1xuICAgICAgICAgICAgcHJvcCA9IGdUZXh0UHJvcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFnTDEwbkRhdGFbaWRdKSB7XG4gICAgICAgICAgICBnTDEwbkRhdGFbaWRdID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGdMMTBuRGF0YVtpZF1bcHJvcF0gPSBkYXRhW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cmlnZ2VyIGNhbGxiYWNrXG4gICAgICAgIGlmIChzdWNjZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgZmFpbHVyZUNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIGxvYWQgYW5kIHBhcnNlIGFsbCByZXNvdXJjZXMgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlXG4gIGZ1bmN0aW9uIGxvYWRMb2NhbGUobGFuZywgY2FsbGJhY2spIHtcbiAgICAvLyBSRkMgNDY0Niwgc2VjdGlvbiAyLjEgc3RhdGVzIHRoYXQgbGFuZ3VhZ2UgdGFncyBoYXZlIHRvIGJlIHRyZWF0ZWQgYXNcbiAgICAvLyBjYXNlLWluc2Vuc2l0aXZlLiBDb252ZXJ0IHRvIGxvd2VyY2FzZSBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucy5cbiAgICBpZiAobGFuZykge1xuICAgICAgbGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uIF9jYWxsYmFjaygpIHt9O1xuXG4gICAgY2xlYXIoKTtcbiAgICBnTGFuZ3VhZ2UgPSBsYW5nO1xuXG4gICAgLy8gY2hlY2sgYWxsIDxsaW5rIHR5cGU9XCJhcHBsaWNhdGlvbi9sMTBuXCIgaHJlZj1cIi4uLlwiIC8+IG5vZGVzXG4gICAgLy8gYW5kIGxvYWQgdGhlIHJlc291cmNlIGZpbGVzXG4gICAgdmFyIGxhbmdMaW5rcyA9IGdldEwxMG5SZXNvdXJjZUxpbmtzKCk7XG4gICAgdmFyIGxhbmdDb3VudCA9IGxhbmdMaW5rcy5sZW5ndGg7XG4gICAgaWYgKGxhbmdDb3VudCA9PT0gMCkge1xuICAgICAgLy8gd2UgbWlnaHQgaGF2ZSBhIHByZS1jb21waWxlZCBkaWN0aW9uYXJ5IGluc3RlYWRcbiAgICAgIHZhciBkaWN0ID0gZ2V0TDEwbkRpY3Rpb25hcnkoKTtcbiAgICAgIGlmIChkaWN0ICYmIGRpY3QubG9jYWxlcyAmJiBkaWN0LmRlZmF1bHRfbG9jYWxlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1c2luZyB0aGUgZW1iZWRkZWQgSlNPTiBkaXJlY3RvcnksIGVhcmx5IHdheSBvdXQnKTtcbiAgICAgICAgZ0wxMG5EYXRhID0gZGljdC5sb2NhbGVzW2xhbmddO1xuICAgICAgICBpZiAoIWdMMTBuRGF0YSkge1xuICAgICAgICAgIHZhciBkZWZhdWx0TG9jYWxlID0gZGljdC5kZWZhdWx0X2xvY2FsZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGZvciAodmFyIGFueUNhc2VMYW5nIGluIGRpY3QubG9jYWxlcykge1xuICAgICAgICAgICAgYW55Q2FzZUxhbmcgPSBhbnlDYXNlTGFuZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGFueUNhc2VMYW5nID09PSBsYW5nKSB7XG4gICAgICAgICAgICAgIGdMMTBuRGF0YSA9IGRpY3QubG9jYWxlc1tsYW5nXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFueUNhc2VMYW5nID09PSBkZWZhdWx0TG9jYWxlKSB7XG4gICAgICAgICAgICAgIGdMMTBuRGF0YSA9IGRpY3QubG9jYWxlc1tkZWZhdWx0TG9jYWxlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdubyByZXNvdXJjZSB0byBsb2FkLCBlYXJseSB3YXkgb3V0Jyk7XG4gICAgICB9XG4gICAgICAvLyBlYXJseSB3YXkgb3V0XG4gICAgICBnUmVhZHlTdGF0ZSA9ICdjb21wbGV0ZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3RhcnQgdGhlIGNhbGxiYWNrIHdoZW4gYWxsIHJlc291cmNlcyBhcmUgbG9hZGVkXG4gICAgdmFyIG9uUmVzb3VyY2VMb2FkZWQgPSBudWxsO1xuICAgIHZhciBnUmVzb3VyY2VDb3VudCA9IDA7XG4gICAgb25SZXNvdXJjZUxvYWRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgZ1Jlc291cmNlQ291bnQrKztcbiAgICAgIGlmIChnUmVzb3VyY2VDb3VudCA+PSBsYW5nQ291bnQpIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgZ1JlYWR5U3RhdGUgPSAnY29tcGxldGUnO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBsb2FkIGFsbCByZXNvdXJjZSBmaWxlc1xuICAgIGZ1bmN0aW9uIEwxMG5SZXNvdXJjZUxpbmsobGluaykge1xuICAgICAgdmFyIGhyZWYgPSBsaW5rLmhyZWY7XG4gICAgICAvLyBOb3RlOiBJZiB8Z0FzeW5jUmVzb3VyY2VMb2FkaW5nfCBpcyBmYWxzZSwgdGhlbiB0aGUgZm9sbG93aW5nIGNhbGxiYWNrc1xuICAgICAgLy8gYXJlIHN5bmNocm9ub3VzbHkgY2FsbGVkLlxuICAgICAgdGhpcy5sb2FkID0gZnVuY3Rpb24obGFuZywgY2FsbGJhY2spIHtcbiAgICAgICAgcGFyc2VSZXNvdXJjZShocmVmLCBsYW5nLCBjYWxsYmFjaywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGhyZWYgKyAnIG5vdCBmb3VuZC4nKTtcbiAgICAgICAgICAvLyBsYW5nIG5vdCBmb3VuZCwgdXNlZCBkZWZhdWx0IHJlc291cmNlIGluc3RlYWRcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1wiJyArIGxhbmcgKyAnXCIgcmVzb3VyY2Ugbm90IGZvdW5kJyk7XG4gICAgICAgICAgZ0xhbmd1YWdlID0gJyc7XG4gICAgICAgICAgLy8gUmVzb3VyY2Ugbm90IGxvYWRlZCwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gY2FsbCB0aGUgY2FsbGJhY2suXG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFuZ0NvdW50OyBpKyspIHtcbiAgICAgIHZhciByZXNvdXJjZSA9IG5ldyBMMTBuUmVzb3VyY2VMaW5rKGxhbmdMaW5rc1tpXSk7XG4gICAgICByZXNvdXJjZS5sb2FkKGxhbmcsIG9uUmVzb3VyY2VMb2FkZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNsZWFyIGFsbCBsMTBuIGRhdGFcbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZ0wxMG5EYXRhID0ge307XG4gICAgZ1RleHREYXRhID0gJyc7XG4gICAgZ0xhbmd1YWdlID0gJyc7XG4gICAgLy8gVE9ETzogY2xlYXIgYWxsIG5vbiBwcmVkZWZpbmVkIG1hY3Jvcy5cbiAgICAvLyBUaGVyZSdzIG5vIHN1Y2ggbWFjcm8gL3lldC8gYnV0IHdlJ3JlIHBsYW5uaW5nIHRvIGhhdmUgc29tZS4uLlxuICB9XG5cblxuICAvKipcbiAgICogR2V0IHJ1bGVzIGZvciBwbHVyYWwgZm9ybXMgKHNoYXJlZCB3aXRoIEpldFBhY2spLCBzZWU6XG4gICAqIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcy9jbGRyLXRtcC90cnVuay9kaWZmL3N1cHBsZW1lbnRhbC9sYW5ndWFnZV9wbHVyYWxfcnVsZXMuaHRtbFxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9hZGRvbi1zZGsvYmxvYi9tYXN0ZXIvcHl0aG9uLWxpYi9wbHVyYWwtcnVsZXMtZ2VuZXJhdG9yLnBcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmdcbiAgICogICAgbG9jYWxlIChsYW5ndWFnZSkgdXNlZC5cbiAgICpcbiAgICogQHJldHVybiB7RnVuY3Rpb259XG4gICAqICAgIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGdpdmVzIHRoZSBwbHVyYWwgZm9ybSBuYW1lIGZvciBhIGdpdmVuIGludGVnZXI6XG4gICAqICAgICAgIHZhciBmdW4gPSBnZXRQbHVyYWxSdWxlcygnZW4nKTtcbiAgICogICAgICAgZnVuKDEpICAgIC0+ICdvbmUnXG4gICAqICAgICAgIGZ1bigwKSAgICAtPiAnb3RoZXInXG4gICAqICAgICAgIGZ1bigxMDAwKSAtPiAnb3RoZXInLlxuICAgKi9cblxuICBmdW5jdGlvbiBnZXRQbHVyYWxSdWxlcyhsYW5nKSB7XG4gICAgdmFyIGxvY2FsZXMycnVsZXMgPSB7XG4gICAgICAnYWYnOiAzLFxuICAgICAgJ2FrJzogNCxcbiAgICAgICdhbSc6IDQsXG4gICAgICAnYXInOiAxLFxuICAgICAgJ2FzYSc6IDMsXG4gICAgICAnYXonOiAwLFxuICAgICAgJ2JlJzogMTEsXG4gICAgICAnYmVtJzogMyxcbiAgICAgICdiZXonOiAzLFxuICAgICAgJ2JnJzogMyxcbiAgICAgICdiaCc6IDQsXG4gICAgICAnYm0nOiAwLFxuICAgICAgJ2JuJzogMyxcbiAgICAgICdibyc6IDAsXG4gICAgICAnYnInOiAyMCxcbiAgICAgICdicngnOiAzLFxuICAgICAgJ2JzJzogMTEsXG4gICAgICAnY2EnOiAzLFxuICAgICAgJ2NnZyc6IDMsXG4gICAgICAnY2hyJzogMyxcbiAgICAgICdjcyc6IDEyLFxuICAgICAgJ2N5JzogMTcsXG4gICAgICAnZGEnOiAzLFxuICAgICAgJ2RlJzogMyxcbiAgICAgICdkdic6IDMsXG4gICAgICAnZHonOiAwLFxuICAgICAgJ2VlJzogMyxcbiAgICAgICdlbCc6IDMsXG4gICAgICAnZW4nOiAzLFxuICAgICAgJ2VvJzogMyxcbiAgICAgICdlcyc6IDMsXG4gICAgICAnZXQnOiAzLFxuICAgICAgJ2V1JzogMyxcbiAgICAgICdmYSc6IDAsXG4gICAgICAnZmYnOiA1LFxuICAgICAgJ2ZpJzogMyxcbiAgICAgICdmaWwnOiA0LFxuICAgICAgJ2ZvJzogMyxcbiAgICAgICdmcic6IDUsXG4gICAgICAnZnVyJzogMyxcbiAgICAgICdmeSc6IDMsXG4gICAgICAnZ2EnOiA4LFxuICAgICAgJ2dkJzogMjQsXG4gICAgICAnZ2wnOiAzLFxuICAgICAgJ2dzdyc6IDMsXG4gICAgICAnZ3UnOiAzLFxuICAgICAgJ2d1dyc6IDQsXG4gICAgICAnZ3YnOiAyMyxcbiAgICAgICdoYSc6IDMsXG4gICAgICAnaGF3JzogMyxcbiAgICAgICdoZSc6IDIsXG4gICAgICAnaGknOiA0LFxuICAgICAgJ2hyJzogMTEsXG4gICAgICAnaHUnOiAwLFxuICAgICAgJ2lkJzogMCxcbiAgICAgICdpZyc6IDAsXG4gICAgICAnaWknOiAwLFxuICAgICAgJ2lzJzogMyxcbiAgICAgICdpdCc6IDMsXG4gICAgICAnaXUnOiA3LFxuICAgICAgJ2phJzogMCxcbiAgICAgICdqbWMnOiAzLFxuICAgICAgJ2p2JzogMCxcbiAgICAgICdrYSc6IDAsXG4gICAgICAna2FiJzogNSxcbiAgICAgICdrYWonOiAzLFxuICAgICAgJ2tjZyc6IDMsXG4gICAgICAna2RlJzogMCxcbiAgICAgICdrZWEnOiAwLFxuICAgICAgJ2trJzogMyxcbiAgICAgICdrbCc6IDMsXG4gICAgICAna20nOiAwLFxuICAgICAgJ2tuJzogMCxcbiAgICAgICdrbyc6IDAsXG4gICAgICAna3NiJzogMyxcbiAgICAgICdrc2gnOiAyMSxcbiAgICAgICdrdSc6IDMsXG4gICAgICAna3cnOiA3LFxuICAgICAgJ2xhZyc6IDE4LFxuICAgICAgJ2xiJzogMyxcbiAgICAgICdsZyc6IDMsXG4gICAgICAnbG4nOiA0LFxuICAgICAgJ2xvJzogMCxcbiAgICAgICdsdCc6IDEwLFxuICAgICAgJ2x2JzogNixcbiAgICAgICdtYXMnOiAzLFxuICAgICAgJ21nJzogNCxcbiAgICAgICdtayc6IDE2LFxuICAgICAgJ21sJzogMyxcbiAgICAgICdtbic6IDMsXG4gICAgICAnbW8nOiA5LFxuICAgICAgJ21yJzogMyxcbiAgICAgICdtcyc6IDAsXG4gICAgICAnbXQnOiAxNSxcbiAgICAgICdteSc6IDAsXG4gICAgICAnbmFoJzogMyxcbiAgICAgICduYXEnOiA3LFxuICAgICAgJ25iJzogMyxcbiAgICAgICduZCc6IDMsXG4gICAgICAnbmUnOiAzLFxuICAgICAgJ25sJzogMyxcbiAgICAgICdubic6IDMsXG4gICAgICAnbm8nOiAzLFxuICAgICAgJ25yJzogMyxcbiAgICAgICduc28nOiA0LFxuICAgICAgJ255JzogMyxcbiAgICAgICdueW4nOiAzLFxuICAgICAgJ29tJzogMyxcbiAgICAgICdvcic6IDMsXG4gICAgICAncGEnOiAzLFxuICAgICAgJ3BhcCc6IDMsXG4gICAgICAncGwnOiAxMyxcbiAgICAgICdwcyc6IDMsXG4gICAgICAncHQnOiAzLFxuICAgICAgJ3JtJzogMyxcbiAgICAgICdybyc6IDksXG4gICAgICAncm9mJzogMyxcbiAgICAgICdydSc6IDExLFxuICAgICAgJ3J3ayc6IDMsXG4gICAgICAnc2FoJzogMCxcbiAgICAgICdzYXEnOiAzLFxuICAgICAgJ3NlJzogNyxcbiAgICAgICdzZWgnOiAzLFxuICAgICAgJ3Nlcyc6IDAsXG4gICAgICAnc2cnOiAwLFxuICAgICAgJ3NoJzogMTEsXG4gICAgICAnc2hpJzogMTksXG4gICAgICAnc2snOiAxMixcbiAgICAgICdzbCc6IDE0LFxuICAgICAgJ3NtYSc6IDcsXG4gICAgICAnc21pJzogNyxcbiAgICAgICdzbWonOiA3LFxuICAgICAgJ3Ntbic6IDcsXG4gICAgICAnc21zJzogNyxcbiAgICAgICdzbic6IDMsXG4gICAgICAnc28nOiAzLFxuICAgICAgJ3NxJzogMyxcbiAgICAgICdzcic6IDExLFxuICAgICAgJ3NzJzogMyxcbiAgICAgICdzc3knOiAzLFxuICAgICAgJ3N0JzogMyxcbiAgICAgICdzdic6IDMsXG4gICAgICAnc3cnOiAzLFxuICAgICAgJ3N5cic6IDMsXG4gICAgICAndGEnOiAzLFxuICAgICAgJ3RlJzogMyxcbiAgICAgICd0ZW8nOiAzLFxuICAgICAgJ3RoJzogMCxcbiAgICAgICd0aSc6IDQsXG4gICAgICAndGlnJzogMyxcbiAgICAgICd0ayc6IDMsXG4gICAgICAndGwnOiA0LFxuICAgICAgJ3RuJzogMyxcbiAgICAgICd0byc6IDAsXG4gICAgICAndHInOiAwLFxuICAgICAgJ3RzJzogMyxcbiAgICAgICd0em0nOiAyMixcbiAgICAgICd1ayc6IDExLFxuICAgICAgJ3VyJzogMyxcbiAgICAgICd2ZSc6IDMsXG4gICAgICAndmknOiAwLFxuICAgICAgJ3Z1bic6IDMsXG4gICAgICAnd2EnOiA0LFxuICAgICAgJ3dhZSc6IDMsXG4gICAgICAnd28nOiAwLFxuICAgICAgJ3hoJzogMyxcbiAgICAgICd4b2cnOiAzLFxuICAgICAgJ3lvJzogMCxcbiAgICAgICd6aCc6IDAsXG4gICAgICAnenUnOiAzXG4gICAgfTtcblxuICAgIC8vIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBwbHVyYWwgcnVsZXMgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGlzSW4obiwgbGlzdCkge1xuICAgICAgcmV0dXJuIGxpc3QuaW5kZXhPZihuKSAhPT0gLTE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzQmV0d2VlbihuLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gc3RhcnQgPD0gbiAmJiBuIDw9IGVuZDtcbiAgICB9XG5cbiAgICAvLyBsaXN0IG9mIGFsbCBwbHVyYWwgcnVsZXMgbWV0aG9kczpcbiAgICAvLyBtYXAgYW4gaW50ZWdlciB0byB0aGUgcGx1cmFsIGZvcm0gbmFtZSB0byB1c2VcbiAgICB2YXIgcGx1cmFsUnVsZXMgPSB7XG4gICAgICAnMCc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzEnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKChuICUgMTAwKSwgMywgMTApKSlcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgIHJldHVybiAnemVybyc7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKChuICUgMTAwKSwgMTEsIDk5KSkpXG4gICAgICAgICAgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKG4gPT0gMilcbiAgICAgICAgICByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChuID09IDEpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMic6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKG4gIT09IDAgJiYgKG4gJSAxMCkgPT09IDApXG4gICAgICAgICAgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKG4gPT0gMilcbiAgICAgICAgICByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChuID09IDEpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMyc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc0JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbihuLCAwLCAxKSkpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnNSc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgMCwgMikpICYmIG4gIT0gMilcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc2JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobiA9PT0gMClcbiAgICAgICAgICByZXR1cm4gJ3plcm8nO1xuICAgICAgICBpZiAoKG4gJSAxMCkgPT0gMSAmJiAobiAlIDEwMCkgIT0gMTEpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnNyc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKG4gPT0gMilcbiAgICAgICAgICByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChuID09IDEpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnOCc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgMywgNikpKVxuICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgNywgMTApKSlcbiAgICAgICAgICByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiA9PSAyKVxuICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc5JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobiA9PT0gMCB8fCBuICE9IDEgJiYgKGlzQmV0d2VlbigobiAlIDEwMCksIDEsIDE5KSkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAobiA9PSAxKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzEwJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbigobiAlIDEwKSwgMiwgOSkpICYmICEoaXNCZXR3ZWVuKChuICUgMTAwKSwgMTEsIDE5KSkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAoKG4gJSAxMCkgPT0gMSAmJiAhKGlzQmV0d2VlbigobiAlIDEwMCksIDExLCAxOSkpKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzExJzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAoKGlzQmV0d2VlbigobiAlIDEwKSwgMiwgNCkpICYmICEoaXNCZXR3ZWVuKChuICUgMTAwKSwgMTIsIDE0KSkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAoKG4gJSAxMCkgPT09IDAgfHxcbiAgICAgICAgICAgIChpc0JldHdlZW4oKG4gJSAxMCksIDUsIDkpKSB8fFxuICAgICAgICAgICAgKGlzQmV0d2VlbigobiAlIDEwMCksIDExLCAxNCkpKVxuICAgICAgICAgIHJldHVybiAnbWFueSc7XG4gICAgICAgIGlmICgobiAlIDEwKSA9PSAxICYmIChuICUgMTAwKSAhPSAxMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxMic6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgMiwgNCkpKVxuICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxMyc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4oKG4gJSAxMCksIDIsIDQpKSAmJiAhKGlzQmV0d2VlbigobiAlIDEwMCksIDEyLCAxNCkpKVxuICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKG4gIT0gMSAmJiAoaXNCZXR3ZWVuKChuICUgMTApLCAwLCAxKSkgfHxcbiAgICAgICAgICAgIChpc0JldHdlZW4oKG4gJSAxMCksIDUsIDkpKSB8fFxuICAgICAgICAgICAgKGlzQmV0d2VlbigobiAlIDEwMCksIDEyLCAxNCkpKVxuICAgICAgICAgIHJldHVybiAnbWFueSc7XG4gICAgICAgIGlmIChuID09IDEpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTQnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKChuICUgMTAwKSwgMywgNCkpKVxuICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKChuICUgMTAwKSA9PSAyKVxuICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKChuICUgMTAwKSA9PSAxKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzE1JzogZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobiA9PT0gMCB8fCAoaXNCZXR3ZWVuKChuICUgMTAwKSwgMiwgMTApKSlcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKChuICUgMTAwKSwgMTEsIDE5KSkpXG4gICAgICAgICAgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxNic6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChuICUgMTApID09IDEgJiYgbiAhPSAxMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxNyc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKG4gPT0gMylcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgIHJldHVybiAnemVybyc7XG4gICAgICAgIGlmIChuID09IDYpXG4gICAgICAgICAgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKG4gPT0gMilcbiAgICAgICAgICByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChuID09IDEpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTgnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgIHJldHVybiAnemVybyc7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKG4sIDAsIDIpKSAmJiBuICE9PSAwICYmIG4gIT0gMilcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxOSc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgMiwgMTApKSlcbiAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKG4sIDAsIDEpKSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcyMCc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4oKG4gJSAxMCksIDMsIDQpIHx8ICgobiAlIDEwKSA9PSA5KSkgJiYgIShcbiAgICAgICAgICAgIGlzQmV0d2VlbigobiAlIDEwMCksIDEwLCAxOSkgfHxcbiAgICAgICAgICAgIGlzQmV0d2VlbigobiAlIDEwMCksIDcwLCA3OSkgfHxcbiAgICAgICAgICAgIGlzQmV0d2VlbigobiAlIDEwMCksIDkwLCA5OSlcbiAgICAgICAgICAgICkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAoKG4gJSAxMDAwMDAwKSA9PT0gMCAmJiBuICE9PSAwKVxuICAgICAgICAgIHJldHVybiAnbWFueSc7XG4gICAgICAgIGlmICgobiAlIDEwKSA9PSAyICYmICFpc0luKChuICUgMTAwKSwgWzEyLCA3MiwgOTJdKSlcbiAgICAgICAgICByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmICgobiAlIDEwKSA9PSAxICYmICFpc0luKChuICUgMTAwKSwgWzExLCA3MSwgOTFdKSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcyMSc6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgcmV0dXJuICd6ZXJvJztcbiAgICAgICAgaWYgKG4gPT0gMSlcbiAgICAgICAgICByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcyMic6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKChpc0JldHdlZW4obiwgMCwgMSkpIHx8IChpc0JldHdlZW4obiwgMTEsIDk5KSkpXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMjMnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKChuICUgMTApLCAxLCAyKSkgfHwgKG4gJSAyMCkgPT09IDApXG4gICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMjQnOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKG4sIDMsIDEwKSB8fCBpc0JldHdlZW4obiwgMTMsIDE5KSkpXG4gICAgICAgICAgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAoaXNJbihuLCBbMiwgMTJdKSlcbiAgICAgICAgICByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChpc0luKG4sIFsxLCAxMV0pKVxuICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2l2ZXMgdGhlIHBsdXJhbCBmb3JtIG5hbWUgZm9yIGEgZ2l2ZW4gaW50ZWdlclxuICAgIHZhciBpbmRleCA9IGxvY2FsZXMycnVsZXNbbGFuZy5yZXBsYWNlKC8tLiokLywgJycpXTtcbiAgICBpZiAoIShpbmRleCBpbiBwbHVyYWxSdWxlcykpIHtcbiAgICAgIGNvbnNvbGUud2FybigncGx1cmFsIGZvcm0gdW5rbm93biBmb3IgWycgKyBsYW5nICsgJ10nKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuICdvdGhlcic7IH07XG4gICAgfVxuICAgIHJldHVybiBwbHVyYWxSdWxlc1tpbmRleF07XG4gIH1cblxuICAvLyBwcmUtZGVmaW5lZCAncGx1cmFsJyBtYWNyb1xuICBnTWFjcm9zLnBsdXJhbCA9IGZ1bmN0aW9uKHN0ciwgcGFyYW0sIGtleSwgcHJvcCkge1xuICAgIHZhciBuID0gcGFyc2VGbG9hdChwYXJhbSk7XG4gICAgaWYgKGlzTmFOKG4pKVxuICAgICAgcmV0dXJuIHN0cjtcblxuICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgcHJvcGVydGllcyAobDIwbiBzdGlsbCBkb2Vzbid0Li4uKVxuICAgIGlmIChwcm9wICE9IGdUZXh0UHJvcClcbiAgICAgIHJldHVybiBzdHI7XG5cbiAgICAvLyBpbml0aWFsaXplIF9wbHVyYWxSdWxlc1xuICAgIGlmICghZ01hY3Jvcy5fcGx1cmFsUnVsZXMpIHtcbiAgICAgIGdNYWNyb3MuX3BsdXJhbFJ1bGVzID0gZ2V0UGx1cmFsUnVsZXMoZ0xhbmd1YWdlKTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gJ1snICsgZ01hY3Jvcy5fcGx1cmFsUnVsZXMobikgKyAnXSc7XG5cbiAgICAvLyB0cnkgdG8gZmluZCBhIFt6ZXJvfG9uZXx0d29dIGtleSBpZiBpdCdzIGRlZmluZWRcbiAgICBpZiAobiA9PT0gMCAmJiAoa2V5ICsgJ1t6ZXJvXScpIGluIGdMMTBuRGF0YSkge1xuICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbemVyb10nXVtwcm9wXTtcbiAgICB9IGVsc2UgaWYgKG4gPT0gMSAmJiAoa2V5ICsgJ1tvbmVdJykgaW4gZ0wxMG5EYXRhKSB7XG4gICAgICBzdHIgPSBnTDEwbkRhdGFba2V5ICsgJ1tvbmVdJ11bcHJvcF07XG4gICAgfSBlbHNlIGlmIChuID09IDIgJiYgKGtleSArICdbdHdvXScpIGluIGdMMTBuRGF0YSkge1xuICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbdHdvXSddW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAoKGtleSArIGluZGV4KSBpbiBnTDEwbkRhdGEpIHtcbiAgICAgIHN0ciA9IGdMMTBuRGF0YVtrZXkgKyBpbmRleF1bcHJvcF07XG4gICAgfSBlbHNlIGlmICgoa2V5ICsgJ1tvdGhlcl0nKSBpbiBnTDEwbkRhdGEpIHtcbiAgICAgIHN0ciA9IGdMMTBuRGF0YVtrZXkgKyAnW290aGVyXSddW3Byb3BdO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG4gIH07XG5cblxuICAvKipcbiAgICogbDEwbiBkaWN0aW9uYXJ5IGZ1bmN0aW9uc1xuICAgKi9cblxuICAvLyBmZXRjaCBhbiBsMTBuIG9iamVjdCwgd2FybiBpZiBub3QgZm91bmQsIGFwcGx5IGBhcmdzJyBpZiBwb3NzaWJsZVxuICBmdW5jdGlvbiBnZXRMMTBuRGF0YShrZXksIGFyZ3MsIGZhbGxiYWNrKSB7XG4gICAgdmFyIGRhdGEgPSBnTDEwbkRhdGFba2V5XTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGNvbnNvbGUud2FybignIycgKyBrZXkgKyAnIGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgIGlmICghZmFsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBkYXRhID0gZmFsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgaXMgd2hlcmUgbDEwbiBleHByZXNzaW9ucyBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuICAgICAgKiBUaGUgcGxhbiBpcyB0byBzdXBwb3J0IEMtc3R5bGUgZXhwcmVzc2lvbnMgZnJvbSB0aGUgbDIwbiBwcm9qZWN0O1xuICAgICAgKiB1bnRpbCB0aGVuLCBvbmx5IHR3byBraW5kcyBvZiBzaW1wbGUgZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZDpcbiAgICAgICogICB7WyBpbmRleCBdfSBhbmQge3sgYXJndW1lbnRzIH19LlxuICAgICAgKi9cbiAgICB2YXIgcnYgPSB7fTtcbiAgICBmb3IgKHZhciBwcm9wIGluIGRhdGEpIHtcbiAgICAgIHZhciBzdHIgPSBkYXRhW3Byb3BdO1xuICAgICAgc3RyID0gc3Vic3RJbmRleGVzKHN0ciwgYXJncywga2V5LCBwcm9wKTtcbiAgICAgIHN0ciA9IHN1YnN0QXJndW1lbnRzKHN0ciwgYXJncywga2V5KTtcbiAgICAgIHJ2W3Byb3BdID0gc3RyO1xuICAgIH1cbiAgICByZXR1cm4gcnY7XG4gIH1cblxuICAvLyByZXBsYWNlIHtbbWFjcm9zXX0gd2l0aCB0aGVpciB2YWx1ZXNcbiAgZnVuY3Rpb24gc3Vic3RJbmRleGVzKHN0ciwgYXJncywga2V5LCBwcm9wKSB7XG4gICAgdmFyIHJlSW5kZXggPSAvXFx7XFxbXFxzKihbYS16QS1aXSspXFwoKFthLXpBLVpdKylcXClcXHMqXFxdXFx9LztcbiAgICB2YXIgcmVNYXRjaCA9IHJlSW5kZXguZXhlYyhzdHIpO1xuICAgIGlmICghcmVNYXRjaCB8fCAhcmVNYXRjaC5sZW5ndGgpXG4gICAgICByZXR1cm4gc3RyO1xuXG4gICAgLy8gYW4gaW5kZXgvbWFjcm8gaGFzIGJlZW4gZm91bmRcbiAgICAvLyBOb3RlOiBhdCB0aGUgbW9tZW50LCBvbmx5IG9uZSBwYXJhbWV0ZXIgaXMgc3VwcG9ydGVkXG4gICAgdmFyIG1hY3JvTmFtZSA9IHJlTWF0Y2hbMV07XG4gICAgdmFyIHBhcmFtTmFtZSA9IHJlTWF0Y2hbMl07XG4gICAgdmFyIHBhcmFtO1xuICAgIGlmIChhcmdzICYmIHBhcmFtTmFtZSBpbiBhcmdzKSB7XG4gICAgICBwYXJhbSA9IGFyZ3NbcGFyYW1OYW1lXTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZSBpbiBnTDEwbkRhdGEpIHtcbiAgICAgIHBhcmFtID0gZ0wxMG5EYXRhW3BhcmFtTmFtZV07XG4gICAgfVxuXG4gICAgLy8gdGhlcmUncyBubyBtYWNybyBwYXJzZXIgeWV0OiBpdCBoYXMgdG8gYmUgZGVmaW5lZCBpbiBnTWFjcm9zXG4gICAgaWYgKG1hY3JvTmFtZSBpbiBnTWFjcm9zKSB7XG4gICAgICB2YXIgbWFjcm8gPSBnTWFjcm9zW21hY3JvTmFtZV07XG4gICAgICBzdHIgPSBtYWNybyhzdHIsIHBhcmFtLCBrZXksIHByb3ApO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgLy8gcmVwbGFjZSB7e2FyZ3VtZW50c319IHdpdGggdGhlaXIgdmFsdWVzXG4gIGZ1bmN0aW9uIHN1YnN0QXJndW1lbnRzKHN0ciwgYXJncywga2V5KSB7XG4gICAgdmFyIHJlQXJncyA9IC9cXHtcXHtcXHMqKC4rPylcXHMqXFx9XFx9L2c7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHJlQXJncywgZnVuY3Rpb24obWF0Y2hlZF90ZXh0LCBhcmcpIHtcbiAgICAgIGlmIChhcmdzICYmIGFyZyBpbiBhcmdzKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ107XG4gICAgICB9XG4gICAgICBpZiAoYXJnIGluIGdMMTBuRGF0YSkge1xuICAgICAgICByZXR1cm4gZ0wxMG5EYXRhW2FyZ107XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnYXJndW1lbnQge3snICsgYXJnICsgJ319IGZvciAjJyArIGtleSArICcgaXMgdW5kZWZpbmVkLicpO1xuICAgICAgcmV0dXJuIG1hdGNoZWRfdGV4dDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHRyYW5zbGF0ZSBhbiBIVE1MIGVsZW1lbnRcbiAgZnVuY3Rpb24gdHJhbnNsYXRlRWxlbWVudChlbGVtZW50KSB7XG4gICAgdmFyIGwxMG4gPSBnZXRMMTBuQXR0cmlidXRlcyhlbGVtZW50KTtcbiAgICBpZiAoIWwxMG4uaWQpXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBnZXQgdGhlIHJlbGF0ZWQgbDEwbiBvYmplY3RcbiAgICB2YXIgZGF0YSA9IGdldEwxMG5EYXRhKGwxMG4uaWQsIGwxMG4uYXJncyk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBjb25zb2xlLndhcm4oJyMnICsgbDEwbi5pZCArICcgaXMgdW5kZWZpbmVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRyYW5zbGF0ZSBlbGVtZW50IChUT0RPOiBzZWN1cml0eSBjaGVja3M/KVxuICAgIGlmIChkYXRhW2dUZXh0UHJvcF0pIHsgLy8gWFhYXG4gICAgICBpZiAoZ2V0Q2hpbGRFbGVtZW50Q291bnQoZWxlbWVudCkgPT09IDApIHtcbiAgICAgICAgZWxlbWVudFtnVGV4dFByb3BdID0gZGF0YVtnVGV4dFByb3BdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhpcyBlbGVtZW50IGhhcyBlbGVtZW50IGNoaWxkcmVuOiByZXBsYWNlIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdFxuICAgICAgICAvLyAobm9uLWVtcHR5KSBjaGlsZCB0ZXh0Tm9kZSBhbmQgY2xlYXIgb3RoZXIgY2hpbGQgdGV4dE5vZGVzXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAzICYmIC9cXFMvLnRlc3QoY2hpbGRyZW5baV0ubm9kZVZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuW2ldLm5vZGVWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW5baV0ubm9kZVZhbHVlID0gZGF0YVtnVGV4dFByb3BdO1xuICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIG5vIChub24tZW1wdHkpIHRleHROb2RlIGlzIGZvdW5kLCBpbnNlcnQgYSB0ZXh0Tm9kZSBiZWZvcmUgdGhlXG4gICAgICAgIC8vIGZpcnN0IGVsZW1lbnQgY2hpbGQuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICB2YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhW2dUZXh0UHJvcF0pO1xuICAgICAgICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRleHROb2RlLCBlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZWxldGUgZGF0YVtnVGV4dFByb3BdO1xuICAgIH1cblxuICAgIGZvciAodmFyIGsgaW4gZGF0YSkge1xuICAgICAgZWxlbWVudFtrXSA9IGRhdGFba107XG4gICAgfVxuICB9XG5cbiAgLy8gd2Via2l0IGJyb3dzZXJzIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0ICdjaGlsZHJlbicgb24gU1ZHIGVsZW1lbnRzLi4uXG4gIGZ1bmN0aW9uIGdldENoaWxkRWxlbWVudENvdW50KGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2hpbGRFbGVtZW50Q291bnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudDtcbiAgICB9XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY291bnQgKz0gZWxlbWVudC5ub2RlVHlwZSA9PT0gMSA/IDEgOiAwO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvLyB0cmFuc2xhdGUgYW4gSFRNTCBzdWJ0cmVlXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZUZyYWdtZW50KGVsZW1lbnQpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAvLyBjaGVjayBhbGwgdHJhbnNsYXRhYmxlIGNoaWxkcmVuICg9IHcvIGEgYGRhdGEtbDEwbi1pZCcgYXR0cmlidXRlKVxuICAgIHZhciBjaGlsZHJlbiA9IGdldFRyYW5zbGF0YWJsZUNoaWxkcmVuKGVsZW1lbnQpO1xuICAgIHZhciBlbGVtZW50Q291bnQgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50Q291bnQ7IGkrKykge1xuICAgICAgdHJhbnNsYXRlRWxlbWVudChjaGlsZHJlbltpXSk7XG4gICAgfVxuXG4gICAgLy8gdHJhbnNsYXRlIGVsZW1lbnQgaXRzZWxmIGlmIG5lY2Vzc2FyeVxuICAgIHRyYW5zbGF0ZUVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIGdldCBhIGxvY2FsaXplZCBzdHJpbmdcbiAgICBnZXQ6IGZ1bmN0aW9uKGtleSwgYXJncywgZmFsbGJhY2tTdHJpbmcpIHtcbiAgICAgIHZhciBpbmRleCA9IGtleS5sYXN0SW5kZXhPZignLicpO1xuICAgICAgdmFyIHByb3AgPSBnVGV4dFByb3A7XG4gICAgICBpZiAoaW5kZXggPiAwKSB7IC8vIEFuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICAgICAgcHJvcCA9IGtleS5zdWJzdHJpbmcoaW5kZXggKyAxKTtcbiAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICB9XG4gICAgICB2YXIgZmFsbGJhY2s7XG4gICAgICBpZiAoZmFsbGJhY2tTdHJpbmcpIHtcbiAgICAgICAgZmFsbGJhY2sgPSB7fTtcbiAgICAgICAgZmFsbGJhY2tbcHJvcF0gPSBmYWxsYmFja1N0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0TDEwbkRhdGEoa2V5LCBhcmdzLCBmYWxsYmFjayk7XG4gICAgICBpZiAoZGF0YSAmJiBwcm9wIGluIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFbcHJvcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3t7JyArIGtleSArICd9fSc7XG4gICAgfSxcblxuICAgIC8vIGRlYnVnXG4gICAgZ2V0RGF0YTogZnVuY3Rpb24oKSB7IHJldHVybiBnTDEwbkRhdGE7IH0sXG4gICAgZ2V0VGV4dDogZnVuY3Rpb24oKSB7IHJldHVybiBnVGV4dERhdGE7IH0sXG5cbiAgICAvLyBnZXR8c2V0IHRoZSBkb2N1bWVudCBsYW5ndWFnZVxuICAgIGdldExhbmd1YWdlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGdMYW5ndWFnZTsgfSxcbiAgICBzZXRMYW5ndWFnZTogZnVuY3Rpb24obGFuZywgY2FsbGJhY2spIHtcbiAgICAgIGxvYWRMb2NhbGUobGFuZywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIGdldCB0aGUgZGlyZWN0aW9uIChsdHJ8cnRsKSBvZiB0aGUgY3VycmVudCBsYW5ndWFnZVxuICAgIGdldERpcmVjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL3F1ZXN0aW9ucy9xYS1zY3JpcHRzXG4gICAgICAvLyBBcmFiaWMsIEhlYnJldywgRmFyc2ksIFBhc2h0bywgVXJkdVxuICAgICAgdmFyIHJ0bExpc3QgPSBbJ2FyJywgJ2hlJywgJ2ZhJywgJ3BzJywgJ3VyJ107XG4gICAgICB2YXIgc2hvcnRDb2RlID0gZ0xhbmd1YWdlLnNwbGl0KCctJywgMSlbMF07XG4gICAgICByZXR1cm4gKHJ0bExpc3QuaW5kZXhPZihzaG9ydENvZGUpID49IDApID8gJ3J0bCcgOiAnbHRyJztcbiAgICB9LFxuXG4gICAgLy8gdHJhbnNsYXRlIGFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgZnJhZ21lbnRcbiAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZUZyYWdtZW50LFxuXG4gICAgLy8gdGhpcyBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIGdldFJlYWR5U3RhdGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZ1JlYWR5U3RhdGU7IH0sXG4gICAgcmVhZHk6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZ1JlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyB8fCBnUmVhZHlTdGF0ZSA9PSAnaW50ZXJhY3RpdmUnKSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvY2FsaXplZCcsIGZ1bmN0aW9uIG9uY2UoKSB7XG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9jYWxpemVkJywgb25jZSk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufSkgKHdpbmRvdywgZG9jdW1lbnQpO1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5IH0gZnJvbSBcInBkZmpzLWxpYlwiO1xuaW1wb3J0IHsgZ2V0Q2hhcmFjdGVyVHlwZSB9IGZyb20gXCIuL3BkZl9maW5kX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBzY3JvbGxJbnRvVmlldyB9IGZyb20gXCIuL3VpX3V0aWxzLmpzXCI7XG5cbmNvbnN0IEZpbmRTdGF0ZSA9IHtcbiAgRk9VTkQ6IDAsXG4gIE5PVF9GT1VORDogMSxcbiAgV1JBUFBFRDogMixcbiAgUEVORElORzogMyxcbn07XG5cbmNvbnN0IEZJTkRfVElNRU9VVCA9IDI1MDsgLy8gbXNcbmNvbnN0IE1BVENIX1NDUk9MTF9PRkZTRVRfVE9QID0gLTUwOyAvLyBweFxuY29uc3QgTUFUQ0hfU0NST0xMX09GRlNFVF9MRUZUID0gLTQwMDsgLy8gcHhcblxuY29uc3QgQ0hBUkFDVEVSU19UT19OT1JNQUxJWkUgPSB7XG4gIFwiXFx1MjAxOFwiOiBcIidcIiwgLy8gTGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmtcbiAgXCJcXHUyMDE5XCI6IFwiJ1wiLCAvLyBSaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmtcbiAgXCJcXHUyMDFBXCI6IFwiJ1wiLCAvLyBTaW5nbGUgbG93LTkgcXVvdGF0aW9uIG1hcmtcbiAgXCJcXHUyMDFCXCI6IFwiJ1wiLCAvLyBTaW5nbGUgaGlnaC1yZXZlcnNlZC05IHF1b3RhdGlvbiBtYXJrXG4gIFwiXFx1MjAxQ1wiOiAnXCInLCAvLyBMZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFya1xuICBcIlxcdTIwMURcIjogJ1wiJywgLy8gUmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrXG4gIFwiXFx1MjAxRVwiOiAnXCInLCAvLyBEb3VibGUgbG93LTkgcXVvdGF0aW9uIG1hcmtcbiAgXCJcXHUyMDFGXCI6ICdcIicsIC8vIERvdWJsZSBoaWdoLXJldmVyc2VkLTkgcXVvdGF0aW9uIG1hcmtcbiAgXCJcXHUwMEJDXCI6IFwiMS80XCIsIC8vIFZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlclxuICBcIlxcdTAwQkRcIjogXCIxLzJcIiwgLy8gVnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmXG4gIFwiXFx1MDBCRVwiOiBcIjMvNFwiLCAvLyBWdWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnNcbn07XG5cbmxldCBub3JtYWxpemF0aW9uUmVnZXggPSBudWxsO1xuZnVuY3Rpb24gbm9ybWFsaXplKHRleHQpIHtcbiAgaWYgKCFub3JtYWxpemF0aW9uUmVnZXgpIHtcbiAgICAvLyBDb21waWxlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRleHQgbm9ybWFsaXphdGlvbiBvbmNlLlxuICAgIGNvbnN0IHJlcGxhY2UgPSBPYmplY3Qua2V5cyhDSEFSQUNURVJTX1RPX05PUk1BTElaRSkuam9pbihcIlwiKTtcbiAgICBub3JtYWxpemF0aW9uUmVnZXggPSBuZXcgUmVnRXhwKGBbJHtyZXBsYWNlfV1gLCBcImdcIik7XG4gIH1cbiAgcmV0dXJuIHRleHQucmVwbGFjZShub3JtYWxpemF0aW9uUmVnZXgsIGZ1bmN0aW9uIChjaCkge1xuICAgIHJldHVybiBDSEFSQUNURVJTX1RPX05PUk1BTElaRVtjaF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBERkZpbmRDb250cm9sbGVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtJUERGTGlua1NlcnZpY2V9IGxpbmtTZXJ2aWNlIC0gVGhlIG5hdmlnYXRpb24vbGlua2luZyBzZXJ2aWNlLlxuICogQHByb3BlcnR5IHtFdmVudEJ1c30gZXZlbnRCdXMgLSBUaGUgYXBwbGljYXRpb24gZXZlbnQgYnVzLlxuICovXG5cbi8qKlxuICogUHJvdmlkZXMgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgdG8gZmluZCBhIGdpdmVuIHN0cmluZyBpbiBhIFBERiBkb2N1bWVudC5cbiAqL1xuY2xhc3MgUERGRmluZENvbnRyb2xsZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtQREZGaW5kQ29udHJvbGxlck9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHsgbGlua1NlcnZpY2UsIGV2ZW50QnVzIH0pIHtcbiAgICB0aGlzLl9saW5rU2VydmljZSA9IGxpbmtTZXJ2aWNlO1xuICAgIHRoaXMuX2V2ZW50QnVzID0gZXZlbnRCdXM7XG5cbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIGV2ZW50QnVzLl9vbihcImZpbmRiYXJjbG9zZVwiLCB0aGlzLl9vbkZpbmRCYXJDbG9zZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGdldCBoaWdobGlnaHRNYXRjaGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRNYXRjaGVzO1xuICB9XG5cbiAgZ2V0IHBhZ2VNYXRjaGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlTWF0Y2hlcztcbiAgfVxuXG4gIGdldCBwYWdlTWF0Y2hlc0xlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGg7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG5cbiAgZ2V0IHN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSByZWZlcmVuY2UgdG8gdGhlIFBERiBkb2N1bWVudCBpbiBvcmRlciB0byBzZWFyY2ggaXQuXG4gICAqIE5vdGUgdGhhdCBzZWFyY2hpbmcgaXMgbm90IHBvc3NpYmxlIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7UERGRG9jdW1lbnRQcm94eX0gcGRmRG9jdW1lbnQgLSBUaGUgUERGIGRvY3VtZW50IHRvIHNlYXJjaC5cbiAgICovXG4gIHNldERvY3VtZW50KHBkZkRvY3VtZW50KSB7XG4gICAgaWYgKHRoaXMuX3BkZkRvY3VtZW50KSB7XG4gICAgICB0aGlzLl9yZXNldCgpO1xuICAgIH1cbiAgICBpZiAoIXBkZkRvY3VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3BkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7XG4gICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cblxuICBleGVjdXRlQ29tbWFuZChjbWQsIHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwZGZEb2N1bWVudCA9IHRoaXMuX3BkZkRvY3VtZW50O1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBudWxsIHx8IHRoaXMuX3Nob3VsZERpcnR5TWF0Y2goY21kLCBzdGF0ZSkpIHtcbiAgICAgIHRoaXMuX2RpcnR5TWF0Y2ggPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICAgIGlmIChjbWQgIT09IFwiZmluZGhpZ2hsaWdodGFsbGNoYW5nZVwiKSB7XG4gICAgICB0aGlzLl91cGRhdGVVSVN0YXRlKEZpbmRTdGF0ZS5QRU5ESU5HKTtcbiAgICB9XG5cbiAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAvLyBJZiB0aGUgZG9jdW1lbnQgd2FzIGNsb3NlZCBiZWZvcmUgc2VhcmNoaW5nIGJlZ2FuLCBvciBpZiB0aGUgc2VhcmNoXG4gICAgICAvLyBvcGVyYXRpb24gd2FzIHJlbGV2YW50IGZvciBhIHByZXZpb3VzbHkgb3BlbmVkIGRvY3VtZW50LCBkbyBub3RoaW5nLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5fcGRmRG9jdW1lbnQgfHxcbiAgICAgICAgKHBkZkRvY3VtZW50ICYmIHRoaXMuX3BkZkRvY3VtZW50ICE9PSBwZGZEb2N1bWVudClcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9leHRyYWN0VGV4dCgpO1xuXG4gICAgICBjb25zdCBmaW5kYmFyQ2xvc2VkID0gIXRoaXMuX2hpZ2hsaWdodE1hdGNoZXM7XG4gICAgICBjb25zdCBwZW5kaW5nVGltZW91dCA9ICEhdGhpcy5fZmluZFRpbWVvdXQ7XG5cbiAgICAgIGlmICh0aGlzLl9maW5kVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZmluZFRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoY21kID09PSBcImZpbmRcIikge1xuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBmaW5kIGFjdGlvbiB3aXRoIGEgc21hbGwgZGVsYXkgdG8gYXZvaWQgc3RhcnRpbmcgdGhlXG4gICAgICAgIC8vIHNlYXJjaCB3aGVuIHRoZSB1c2VyIGlzIHN0aWxsIHR5cGluZyAoc2F2aW5nIHJlc291cmNlcykuXG4gICAgICAgIHRoaXMuX2ZpbmRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7XG4gICAgICAgICAgdGhpcy5fZmluZFRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9LCBGSU5EX1RJTUVPVVQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9kaXJ0eU1hdGNoKSB7XG4gICAgICAgIC8vIEltbWVkaWF0ZWx5IHRyaWdnZXIgc2VhcmNoaW5nIGZvciBub24tJ2ZpbmQnIG9wZXJhdGlvbnMsIHdoZW4gdGhlXG4gICAgICAgIC8vIGN1cnJlbnQgc3RhdGUgbmVlZHMgdG8gYmUgcmVzZXQgYW5kIG1hdGNoZXMgcmUtY2FsY3VsYXRlZC5cbiAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7XG4gICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gXCJmaW5kYWdhaW5cIikge1xuICAgICAgICB0aGlzLl9uZXh0TWF0Y2goKTtcblxuICAgICAgICAvLyBXaGVuIHRoZSBmaW5kYmFyIHdhcyBwcmV2aW91c2x5IGNsb3NlZCwgYW5kIGBoaWdobGlnaHRBbGxgIGlzIHNldCxcbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG1hdGNoZXMgb24gYWxsIGFjdGl2ZSBwYWdlcyBhcmUgaGlnaGxpZ2h0ZWQgYWdhaW4uXG4gICAgICAgIGlmIChmaW5kYmFyQ2xvc2VkICYmIHRoaXMuX3N0YXRlLmhpZ2hsaWdodEFsbCkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZUFsbFBhZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY21kID09PSBcImZpbmRoaWdobGlnaHRhbGxjaGFuZ2VcIikge1xuICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBwZW5kaW5nIHNlYXJjaCBvcGVyYXRpb24sIHN5bmNocm9ub3VzbHkgdHJpZ2dlciBhIG5ld1xuICAgICAgICAvLyBzZWFyY2ggKmZpcnN0KiB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBtYXRjaGVzIGFyZSBoaWdobGlnaHRlZC5cbiAgICAgICAgaWYgKHBlbmRpbmdUaW1lb3V0KSB7XG4gICAgICAgICAgdGhpcy5fbmV4dE1hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlQWxsUGFnZXMoKTsgLy8gVXBkYXRlIHRoZSBoaWdobGlnaHRpbmcgb24gYWxsIGFjdGl2ZSBwYWdlcy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX25leHRNYXRjaCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsTWF0Y2hJbnRvVmlldyh7IGVsZW1lbnQgPSBudWxsLCBwYWdlSW5kZXggPSAtMSwgbWF0Y2hJbmRleCA9IC0xIH0pIHtcbiAgICBpZiAoIXRoaXMuX3Njcm9sbE1hdGNoZXMgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKG1hdGNoSW5kZXggPT09IC0xIHx8IG1hdGNoSW5kZXggIT09IHRoaXMuX3NlbGVjdGVkLm1hdGNoSWR4KSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChwYWdlSW5kZXggPT09IC0xIHx8IHBhZ2VJbmRleCAhPT0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zY3JvbGxNYXRjaGVzID0gZmFsc2U7IC8vIEVuc3VyZSB0aGF0IHNjcm9sbGluZyBvbmx5IGhhcHBlbnMgb25jZS5cblxuICAgIGNvbnN0IHNwb3QgPSB7XG4gICAgICB0b3A6IE1BVENIX1NDUk9MTF9PRkZTRVRfVE9QLFxuICAgICAgbGVmdDogTUFUQ0hfU0NST0xMX09GRlNFVF9MRUZULFxuICAgIH07XG4gICAgc2Nyb2xsSW50b1ZpZXcoZWxlbWVudCwgc3BvdCwgLyogc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMgPSAqLyB0cnVlKTtcbiAgfVxuXG4gIF9yZXNldCgpIHtcbiAgICB0aGlzLl9oaWdobGlnaHRNYXRjaGVzID0gZmFsc2U7XG4gICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IGZhbHNlO1xuICAgIHRoaXMuX3BkZkRvY3VtZW50ID0gbnVsbDtcbiAgICB0aGlzLl9wYWdlTWF0Y2hlcyA9IFtdO1xuICAgIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoID0gW107XG4gICAgdGhpcy5fc3RhdGUgPSBudWxsO1xuICAgIC8vIEN1cnJlbnRseSBzZWxlY3RlZCBtYXRjaC5cbiAgICB0aGlzLl9zZWxlY3RlZCA9IHtcbiAgICAgIHBhZ2VJZHg6IC0xLFxuICAgICAgbWF0Y2hJZHg6IC0xLFxuICAgIH07XG4gICAgLy8gV2hlcmUgdGhlIGZpbmQgYWxnb3JpdGhtIGN1cnJlbnRseSBpcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgdGhpcy5fb2Zmc2V0ID0ge1xuICAgICAgcGFnZUlkeDogbnVsbCxcbiAgICAgIG1hdGNoSWR4OiBudWxsLFxuICAgICAgd3JhcHBlZDogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLl9leHRyYWN0VGV4dFByb21pc2VzID0gW107XG4gICAgdGhpcy5fcGFnZUNvbnRlbnRzID0gW107IC8vIFN0b3JlcyB0aGUgbm9ybWFsaXplZCB0ZXh0IGZvciBlYWNoIHBhZ2UuXG4gICAgdGhpcy5fbWF0Y2hlc0NvdW50VG90YWwgPSAwO1xuICAgIHRoaXMuX3BhZ2VzVG9TZWFyY2ggPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IG51bGw7XG4gICAgdGhpcy5fZGlydHlNYXRjaCA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5kVGltZW91dCk7XG4gICAgdGhpcy5fZmluZFRpbWVvdXQgPSBudWxsO1xuXG4gICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ30gVGhlIChjdXJyZW50KSBub3JtYWxpemVkIHNlYXJjaCBxdWVyeS5cbiAgICovXG4gIGdldCBfcXVlcnkoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXRlLnF1ZXJ5ICE9PSB0aGlzLl9yYXdRdWVyeSkge1xuICAgICAgdGhpcy5fcmF3UXVlcnkgPSB0aGlzLl9zdGF0ZS5xdWVyeTtcbiAgICAgIHRoaXMuX25vcm1hbGl6ZWRRdWVyeSA9IG5vcm1hbGl6ZSh0aGlzLl9zdGF0ZS5xdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVkUXVlcnk7XG4gIH1cblxuICBfc2hvdWxkRGlydHlNYXRjaChjbWQsIHN0YXRlKSB7XG4gICAgLy8gV2hlbiB0aGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCBzZWFyY2ggY29tbWFuZFxuICAgIC8vIHVzZWQsIGFsd2F5cyByZS1jYWxjdWxhdGUgbWF0Y2hlcyB0byBhdm9pZCBlcnJvcnMgKGZpeGVzIGJ1ZyAxMDMwNjIyKS5cbiAgICBpZiAoc3RhdGUucXVlcnkgIT09IHRoaXMuX3N0YXRlLnF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3dpdGNoIChjbWQpIHtcbiAgICAgIGNhc2UgXCJmaW5kYWdhaW5cIjpcbiAgICAgICAgY29uc3QgcGFnZU51bWJlciA9IHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggKyAxO1xuICAgICAgICBjb25zdCBsaW5rU2VydmljZSA9IHRoaXMuX2xpbmtTZXJ2aWNlO1xuICAgICAgICAvLyBPbmx5IHRyZWF0IGEgJ2ZpbmRhZ2FpbicgZXZlbnQgYXMgYSBuZXcgc2VhcmNoIG9wZXJhdGlvbiB3aGVuIGl0J3NcbiAgICAgICAgLy8gKmFic29sdXRlbHkqIGNlcnRhaW4gdGhhdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hdGNoIGlzIG5vIGxvbmdlclxuICAgICAgICAvLyB2aXNpYmxlLCBlLmcuIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIHNjcm9sbGluZyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5PVEU6IElmIG9ubHkgYSBzaW1wbGUgYHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2VgIGNoZWNrIHdhcyB1c2VkIGhlcmUsXG4gICAgICAgIC8vIHRoZXJlJ3MgYSByaXNrIHRoYXQgY29uc2VjdXRpdmUgJ2ZpbmRhZ2Fpbicgb3BlcmF0aW9ucyBjb3VsZCBcInNraXBcIlxuICAgICAgICAvLyBvdmVyIG1hdGNoZXMgYXQgdGhlIHRvcC9ib3R0b20gb2YgcGFnZXMgdGh1cyBtYWtpbmcgdGhlbSBjb21wbGV0ZWx5XG4gICAgICAgIC8vIGluYWNjZXNzaWJsZSB3aGVuIHRoZXJlJ3MgbXVsdGlwbGUgcGFnZXMgdmlzaWJsZSBpbiB0aGUgdmlld2VyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcGFnZU51bWJlciA+PSAxICYmXG4gICAgICAgICAgcGFnZU51bWJlciA8PSBsaW5rU2VydmljZS5wYWdlc0NvdW50ICYmXG4gICAgICAgICAgcGFnZU51bWJlciAhPT0gbGlua1NlcnZpY2UucGFnZSAmJlxuICAgICAgICAgICFsaW5rU2VydmljZS5pc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgXCJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZvciBtdWx0aS10ZXJtIHNlYXJjaCB0aGF0IGZpbGxzIHRoZSBgbWF0Y2hlc1dpdGhMZW5ndGhgIGFycmF5XG4gICAqIGFuZCBoYW5kbGVzIGNhc2VzIHdoZXJlIG9uZSBzZWFyY2ggdGVybSBpbmNsdWRlcyBhbm90aGVyIHNlYXJjaCB0ZXJtIChmb3JcbiAgICogZXhhbXBsZSwgXCJ0YW1lZCB0YW1lXCIgb3IgXCJ0aGlzIGlzXCIpLiBJdCBsb29rcyBmb3IgaW50ZXJzZWN0aW5nIHRlcm1zIGluXG4gICAqIHRoZSBgbWF0Y2hlc2AgYW5kIGtlZXBzIGVsZW1lbnRzIHdpdGggYSBsb25nZXIgbWF0Y2ggbGVuZ3RoLlxuICAgKi9cbiAgX3ByZXBhcmVNYXRjaGVzKG1hdGNoZXNXaXRoTGVuZ3RoLCBtYXRjaGVzLCBtYXRjaGVzTGVuZ3RoKSB7XG4gICAgZnVuY3Rpb24gaXNTdWJUZXJtKGN1cnJlbnRJbmRleCkge1xuICAgICAgY29uc3QgY3VycmVudEVsZW0gPSBtYXRjaGVzV2l0aExlbmd0aFtjdXJyZW50SW5kZXhdO1xuICAgICAgY29uc3QgbmV4dEVsZW0gPSBtYXRjaGVzV2l0aExlbmd0aFtjdXJyZW50SW5kZXggKyAxXTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNhc2VzIGxpa2UgXCJUQU1FZCBUQU1FXCIuXG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnRJbmRleCA8IG1hdGNoZXNXaXRoTGVuZ3RoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgY3VycmVudEVsZW0ubWF0Y2ggPT09IG5leHRFbGVtLm1hdGNoXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEVsZW0uc2tpcHBlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgY2FzZXMgbGlrZSBcInRoSVMgSVNcIi5cbiAgICAgIGZvciAobGV0IGkgPSBjdXJyZW50SW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBwcmV2RWxlbSA9IG1hdGNoZXNXaXRoTGVuZ3RoW2ldO1xuICAgICAgICBpZiAocHJldkVsZW0uc2tpcHBlZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2RWxlbS5tYXRjaCArIHByZXZFbGVtLm1hdGNoTGVuZ3RoIDwgY3VycmVudEVsZW0ubWF0Y2gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJldkVsZW0ubWF0Y2ggKyBwcmV2RWxlbS5tYXRjaExlbmd0aCA+PVxuICAgICAgICAgIGN1cnJlbnRFbGVtLm1hdGNoICsgY3VycmVudEVsZW0ubWF0Y2hMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudEVsZW0uc2tpcHBlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSBhcnJheSBvZiBgeyBtYXRjaDogPG1hdGNoPiwgbWF0Y2hMZW5ndGg6IDxtYXRjaExlbmd0aD4gfWBcbiAgICAvLyBvYmplY3RzIG9uIGluY3JlYXNpbmcgaW5kZXggZmlyc3QgYW5kIG9uIHRoZSBsZW5ndGggb3RoZXJ3aXNlLlxuICAgIG1hdGNoZXNXaXRoTGVuZ3RoLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLm1hdGNoID09PSBiLm1hdGNoXG4gICAgICAgID8gYS5tYXRjaExlbmd0aCAtIGIubWF0Y2hMZW5ndGhcbiAgICAgICAgOiBhLm1hdGNoIC0gYi5tYXRjaDtcbiAgICB9KTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbWF0Y2hlc1dpdGhMZW5ndGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChpc1N1YlRlcm0oaSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2hlc1dpdGhMZW5ndGhbaV0ubWF0Y2gpO1xuICAgICAgbWF0Y2hlc0xlbmd0aC5wdXNoKG1hdGNoZXNXaXRoTGVuZ3RoW2ldLm1hdGNoTGVuZ3RoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoZSBzZWFyY2ggcXVlcnkgY29uc3RpdHV0ZXMgYSBcIndob2xlIHdvcmRcIiwgYnkgY29tcGFyaW5nIHRoZVxuICAgKiBmaXJzdC9sYXN0IGNoYXJhY3RlciB0eXBlIHdpdGggdGhlIHByZWNlZGluZy9mb2xsb3dpbmcgY2hhcmFjdGVyIHR5cGUuXG4gICAqL1xuICBfaXNFbnRpcmVXb3JkKGNvbnRlbnQsIHN0YXJ0SWR4LCBsZW5ndGgpIHtcbiAgICBpZiAoc3RhcnRJZHggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnQuY2hhckNvZGVBdChzdGFydElkeCk7XG4gICAgICBjb25zdCBsaW1pdCA9IGNvbnRlbnQuY2hhckNvZGVBdChzdGFydElkeCAtIDEpO1xuICAgICAgaWYgKGdldENoYXJhY3RlclR5cGUoZmlyc3QpID09PSBnZXRDaGFyYWN0ZXJUeXBlKGxpbWl0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVuZElkeCA9IHN0YXJ0SWR4ICsgbGVuZ3RoIC0gMTtcbiAgICBpZiAoZW5kSWR4IDwgY29udGVudC5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBsYXN0ID0gY29udGVudC5jaGFyQ29kZUF0KGVuZElkeCk7XG4gICAgICBjb25zdCBsaW1pdCA9IGNvbnRlbnQuY2hhckNvZGVBdChlbmRJZHggKyAxKTtcbiAgICAgIGlmIChnZXRDaGFyYWN0ZXJUeXBlKGxhc3QpID09PSBnZXRDaGFyYWN0ZXJUeXBlKGxpbWl0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgX2NhbGN1bGF0ZVBocmFzZU1hdGNoKHF1ZXJ5LCBwYWdlSW5kZXgsIHBhZ2VDb250ZW50LCBlbnRpcmVXb3JkKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGNvbnN0IHF1ZXJ5TGVuID0gcXVlcnkubGVuZ3RoO1xuXG4gICAgbGV0IG1hdGNoSWR4ID0gLXF1ZXJ5TGVuO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBtYXRjaElkeCA9IHBhZ2VDb250ZW50LmluZGV4T2YocXVlcnksIG1hdGNoSWR4ICsgcXVlcnlMZW4pO1xuICAgICAgaWYgKG1hdGNoSWR4ID09PSAtMSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChlbnRpcmVXb3JkICYmICF0aGlzLl9pc0VudGlyZVdvcmQocGFnZUNvbnRlbnQsIG1hdGNoSWR4LCBxdWVyeUxlbikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2hJZHgpO1xuICAgIH1cbiAgICB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSW5kZXhdID0gbWF0Y2hlcztcbiAgfVxuXG4gIF9jYWxjdWxhdGVXb3JkTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpIHtcbiAgICBjb25zdCBtYXRjaGVzV2l0aExlbmd0aCA9IFtdO1xuXG4gICAgLy8gRGl2aWRlIHRoZSBxdWVyeSBpbnRvIHBpZWNlcyBhbmQgc2VhcmNoIGZvciB0ZXh0IGluIGVhY2ggcGllY2UuXG4gICAgY29uc3QgcXVlcnlBcnJheSA9IHF1ZXJ5Lm1hdGNoKC9cXFMrL2cpO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBxdWVyeUFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJxdWVyeSA9IHF1ZXJ5QXJyYXlbaV07XG4gICAgICBjb25zdCBzdWJxdWVyeUxlbiA9IHN1YnF1ZXJ5Lmxlbmd0aDtcblxuICAgICAgbGV0IG1hdGNoSWR4ID0gLXN1YnF1ZXJ5TGVuO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbWF0Y2hJZHggPSBwYWdlQ29udGVudC5pbmRleE9mKHN1YnF1ZXJ5LCBtYXRjaElkeCArIHN1YnF1ZXJ5TGVuKTtcbiAgICAgICAgaWYgKG1hdGNoSWR4ID09PSAtMSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlbnRpcmVXb3JkICYmXG4gICAgICAgICAgIXRoaXMuX2lzRW50aXJlV29yZChwYWdlQ29udGVudCwgbWF0Y2hJZHgsIHN1YnF1ZXJ5TGVuKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlciBzZWFyY2hlcyBkbyBub3QsIHNvIHdlIHN0b3JlIHRoZSBsZW5ndGguXG4gICAgICAgIG1hdGNoZXNXaXRoTGVuZ3RoLnB1c2goe1xuICAgICAgICAgIG1hdGNoOiBtYXRjaElkeCxcbiAgICAgICAgICBtYXRjaExlbmd0aDogc3VicXVlcnlMZW4sXG4gICAgICAgICAgc2tpcHBlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYXJyYXlzIGZvciBzdG9yaW5nIHRoZSBtYXRjaGVzLlxuICAgIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoW3BhZ2VJbmRleF0gPSBbXTtcbiAgICB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSW5kZXhdID0gW107XG5cbiAgICAvLyBTb3J0IGBtYXRjaGVzV2l0aExlbmd0aGAsIHJlbW92ZSBpbnRlcnNlY3RpbmcgdGVybXMgYW5kIHB1dCB0aGUgcmVzdWx0XG4gICAgLy8gaW50byB0aGUgdHdvIGFycmF5cy5cbiAgICB0aGlzLl9wcmVwYXJlTWF0Y2hlcyhcbiAgICAgIG1hdGNoZXNXaXRoTGVuZ3RoLFxuICAgICAgdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XSxcbiAgICAgIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoW3BhZ2VJbmRleF1cbiAgICApO1xuICB9XG5cbiAgX2NhbGN1bGF0ZU1hdGNoKHBhZ2VJbmRleCkge1xuICAgIGxldCBwYWdlQ29udGVudCA9IHRoaXMuX3BhZ2VDb250ZW50c1twYWdlSW5kZXhdO1xuICAgIGxldCBxdWVyeSA9IHRoaXMuX3F1ZXJ5O1xuICAgIGNvbnN0IHsgY2FzZVNlbnNpdGl2ZSwgZW50aXJlV29yZCwgcGhyYXNlU2VhcmNoIH0gPSB0aGlzLl9zdGF0ZTtcblxuICAgIGlmIChxdWVyeS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIERvIG5vdGhpbmc6IHRoZSBtYXRjaGVzIHNob3VsZCBiZSB3aXBlZCBvdXQgYWxyZWFkeS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHtcbiAgICAgIHBhZ2VDb250ZW50ID0gcGFnZUNvbnRlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAocGhyYXNlU2VhcmNoKSB7XG4gICAgICB0aGlzLl9jYWxjdWxhdGVQaHJhc2VNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NhbGN1bGF0ZVdvcmRNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCk7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBgaGlnaGxpZ2h0QWxsYCBpcyBzZXQsIGVuc3VyZSB0aGF0IHRoZSBtYXRjaGVzIG9uIHByZXZpb3VzbHlcbiAgICAvLyByZW5kZXJlZCAoYW5kIHN0aWxsIGFjdGl2ZSkgcGFnZXMgYXJlIGNvcnJlY3RseSBoaWdobGlnaHRlZC5cbiAgICBpZiAodGhpcy5fc3RhdGUuaGlnaGxpZ2h0QWxsKSB7XG4gICAgICB0aGlzLl91cGRhdGVQYWdlKHBhZ2VJbmRleCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4ID09PSBwYWdlSW5kZXgpIHtcbiAgICAgIHRoaXMuX3Jlc3VtZVBhZ2VJZHggPSBudWxsO1xuICAgICAgdGhpcy5fbmV4dFBhZ2VNYXRjaCgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgbWF0Y2ggY291bnQuXG4gICAgY29uc3QgcGFnZU1hdGNoZXNDb3VudCA9IHRoaXMuX3BhZ2VNYXRjaGVzW3BhZ2VJbmRleF0ubGVuZ3RoO1xuICAgIGlmIChwYWdlTWF0Y2hlc0NvdW50ID4gMCkge1xuICAgICAgdGhpcy5fbWF0Y2hlc0NvdW50VG90YWwgKz0gcGFnZU1hdGNoZXNDb3VudDtcbiAgICAgIHRoaXMuX3VwZGF0ZVVJUmVzdWx0c0NvdW50KCk7XG4gICAgfVxuICB9XG5cbiAgX2V4dHJhY3RUZXh0KCkge1xuICAgIC8vIFBlcmZvcm0gdGV4dCBleHRyYWN0aW9uIG9uY2UgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzLlxuICAgIGlmICh0aGlzLl9leHRyYWN0VGV4dFByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2VzQ291bnQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCBleHRyYWN0VGV4dENhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgdGhpcy5fZXh0cmFjdFRleHRQcm9taXNlc1tpXSA9IGV4dHJhY3RUZXh0Q2FwYWJpbGl0eS5wcm9taXNlO1xuXG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BkZkRvY3VtZW50XG4gICAgICAgICAgLmdldFBhZ2UoaSArIDEpXG4gICAgICAgICAgLnRoZW4ocGRmUGFnZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcGRmUGFnZS5nZXRUZXh0Q29udGVudCh7XG4gICAgICAgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2U6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgdGV4dENvbnRlbnQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0ZXh0SXRlbXMgPSB0ZXh0Q29udGVudC5pdGVtcztcbiAgICAgICAgICAgICAgY29uc3Qgc3RyQnVmID0gW107XG5cbiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gdGV4dEl0ZW1zLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgICBzdHJCdWYucHVzaCh0ZXh0SXRlbXNbal0uc3RyKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBub3JtYWxpemVkIHBhZ2UgY29udGVudCAodGV4dCBpdGVtcykgYXMgb25lIHN0cmluZy5cbiAgICAgICAgICAgICAgdGhpcy5fcGFnZUNvbnRlbnRzW2ldID0gbm9ybWFsaXplKHN0ckJ1Zi5qb2luKFwiXCIpKTtcbiAgICAgICAgICAgICAgZXh0cmFjdFRleHRDYXBhYmlsaXR5LnJlc29sdmUoaSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGdldCB0ZXh0IGNvbnRlbnQgZm9yIHBhZ2UgJHtpICsgMX1gLFxuICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBQYWdlIGVycm9yIC0tIGFzc3VtaW5nIG5vIHRleHQgY29udGVudC5cbiAgICAgICAgICAgICAgdGhpcy5fcGFnZUNvbnRlbnRzW2ldID0gXCJcIjtcbiAgICAgICAgICAgICAgZXh0cmFjdFRleHRDYXBhYmlsaXR5LnJlc29sdmUoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVQYWdlKGluZGV4KSB7XG4gICAgaWYgKHRoaXMuX3Njcm9sbE1hdGNoZXMgJiYgdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCA9PT0gaW5kZXgpIHtcbiAgICAgIC8vIElmIHRoZSBwYWdlIGlzIHNlbGVjdGVkLCBzY3JvbGwgdGhlIHBhZ2UgaW50byB2aWV3LCB3aGljaCB0cmlnZ2Vyc1xuICAgICAgLy8gcmVuZGVyaW5nIHRoZSBwYWdlLCB3aGljaCBhZGRzIHRoZSB0ZXh0IGxheWVyLiBPbmNlIHRoZSB0ZXh0IGxheWVyXG4gICAgICAvLyBpcyBidWlsdCwgaXQgd2lsbCBhdHRlbXB0IHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgbWF0Y2ggaW50byB2aWV3LlxuICAgICAgdGhpcy5fbGlua1NlcnZpY2UucGFnZSA9IGluZGV4ICsgMTtcbiAgICB9XG5cbiAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInVwZGF0ZXRleHRsYXllcm1hdGNoZXNcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgcGFnZUluZGV4OiBpbmRleCxcbiAgICB9KTtcbiAgfVxuXG4gIF91cGRhdGVBbGxQYWdlcygpIHtcbiAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInVwZGF0ZXRleHRsYXllcm1hdGNoZXNcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgcGFnZUluZGV4OiAtMSxcbiAgICB9KTtcbiAgfVxuXG4gIF9uZXh0TWF0Y2goKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXM7XG4gICAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IHRoaXMuX2xpbmtTZXJ2aWNlLnBhZ2UgLSAxO1xuICAgIGNvbnN0IG51bVBhZ2VzID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZXNDb3VudDtcblxuICAgIHRoaXMuX2hpZ2hsaWdodE1hdGNoZXMgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuX2RpcnR5TWF0Y2gpIHtcbiAgICAgIC8vIE5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIG1hdGNoZXMsIHJlc2V0IGV2ZXJ5dGhpbmcuXG4gICAgICB0aGlzLl9kaXJ0eU1hdGNoID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ID0gdGhpcy5fc2VsZWN0ZWQubWF0Y2hJZHggPSAtMTtcbiAgICAgIHRoaXMuX29mZnNldC5wYWdlSWR4ID0gY3VycmVudFBhZ2VJbmRleDtcbiAgICAgIHRoaXMuX29mZnNldC5tYXRjaElkeCA9IG51bGw7XG4gICAgICB0aGlzLl9vZmZzZXQud3JhcHBlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IG51bGw7XG4gICAgICB0aGlzLl9wYWdlTWF0Y2hlcy5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGgubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuX21hdGNoZXNDb3VudFRvdGFsID0gMDtcblxuICAgICAgdGhpcy5fdXBkYXRlQWxsUGFnZXMoKTsgLy8gV2lwZSBvdXQgYW55IHByZXZpb3VzbHkgaGlnaGxpZ2h0ZWQgbWF0Y2hlcy5cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1QYWdlczsgaSsrKSB7XG4gICAgICAgIC8vIFN0YXJ0IGZpbmRpbmcgdGhlIG1hdGNoZXMgYXMgc29vbiBhcyB0aGUgdGV4dCBpcyBleHRyYWN0ZWQuXG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nRmluZE1hdGNoZXNbaV0gPT09IHRydWUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nRmluZE1hdGNoZXNbaV0gPSB0cnVlO1xuICAgICAgICB0aGlzLl9leHRyYWN0VGV4dFByb21pc2VzW2ldLnRoZW4ocGFnZUlkeCA9PiB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlc1twYWdlSWR4XTtcbiAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVNYXRjaChwYWdlSWR4KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBubyBxdWVyeSB0aGVyZSdzIG5vIHBvaW50IGluIHNlYXJjaGluZy5cbiAgICBpZiAodGhpcy5fcXVlcnkgPT09IFwiXCIpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUoRmluZFN0YXRlLkZPVU5EKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgd2UncmUgd2FpdGluZyBvbiBhIHBhZ2UsIHdlIHJldHVybiBzaW5jZSB3ZSBjYW4ndCBkbyBhbnl0aGluZyBlbHNlLlxuICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0O1xuICAgIC8vIEtlZXAgdHJhY2sgb2YgaG93IG1hbnkgcGFnZXMgd2Ugc2hvdWxkIG1heGltYWxseSBpdGVyYXRlIHRocm91Z2guXG4gICAgdGhpcy5fcGFnZXNUb1NlYXJjaCA9IG51bVBhZ2VzO1xuICAgIC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhIGBtYXRjaElkeGAgdGhhdCBtZWFucyB3ZSBhcmUgaXRlcmF0aW5nIHRocm91Z2ggYVxuICAgIC8vIHBhZ2UncyBtYXRjaGVzLlxuICAgIGlmIChvZmZzZXQubWF0Y2hJZHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG51bVBhZ2VNYXRjaGVzID0gdGhpcy5fcGFnZU1hdGNoZXNbb2Zmc2V0LnBhZ2VJZHhdLmxlbmd0aDtcbiAgICAgIGlmIChcbiAgICAgICAgKCFwcmV2aW91cyAmJiBvZmZzZXQubWF0Y2hJZHggKyAxIDwgbnVtUGFnZU1hdGNoZXMpIHx8XG4gICAgICAgIChwcmV2aW91cyAmJiBvZmZzZXQubWF0Y2hJZHggPiAwKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFRoZSBzaW1wbGUgY2FzZTsgd2UganVzdCBoYXZlIGFkdmFuY2UgdGhlIG1hdGNoSWR4IHRvIHNlbGVjdFxuICAgICAgICAvLyB0aGUgbmV4dCBtYXRjaCBvbiB0aGUgcGFnZS5cbiAgICAgICAgb2Zmc2V0Lm1hdGNoSWR4ID0gcHJldmlvdXMgPyBvZmZzZXQubWF0Y2hJZHggLSAxIDogb2Zmc2V0Lm1hdGNoSWR4ICsgMTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTWF0Y2goLyogZm91bmQgPSAqLyB0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gV2Ugd2VudCBiZXlvbmQgdGhlIGN1cnJlbnQgcGFnZSdzIG1hdGNoZXMsIHNvIHdlIGFkdmFuY2UgdG9cbiAgICAgIC8vIHRoZSBuZXh0IHBhZ2UuXG4gICAgICB0aGlzLl9hZHZhbmNlT2Zmc2V0UGFnZShwcmV2aW91cyk7XG4gICAgfVxuICAgIC8vIFN0YXJ0IHNlYXJjaGluZyB0aHJvdWdoIHRoZSBwYWdlLlxuICAgIHRoaXMuX25leHRQYWdlTWF0Y2goKTtcbiAgfVxuXG4gIF9tYXRjaGVzUmVhZHkobWF0Y2hlcykge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuX29mZnNldDtcbiAgICBjb25zdCBudW1NYXRjaGVzID0gbWF0Y2hlcy5sZW5ndGg7XG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXM7XG5cbiAgICBpZiAobnVtTWF0Y2hlcykge1xuICAgICAgLy8gVGhlcmUgd2VyZSBtYXRjaGVzIGZvciB0aGUgcGFnZSwgc28gaW5pdGlhbGl6ZSBgbWF0Y2hJZHhgLlxuICAgICAgb2Zmc2V0Lm1hdGNoSWR4ID0gcHJldmlvdXMgPyBudW1NYXRjaGVzIC0gMSA6IDA7XG4gICAgICB0aGlzLl91cGRhdGVNYXRjaCgvKiBmb3VuZCA9ICovIHRydWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIE5vIG1hdGNoZXMsIHNvIGF0dGVtcHQgdG8gc2VhcmNoIHRoZSBuZXh0IHBhZ2UuXG4gICAgdGhpcy5fYWR2YW5jZU9mZnNldFBhZ2UocHJldmlvdXMpO1xuICAgIGlmIChvZmZzZXQud3JhcHBlZCkge1xuICAgICAgb2Zmc2V0Lm1hdGNoSWR4ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLl9wYWdlc1RvU2VhcmNoIDwgMCkge1xuICAgICAgICAvLyBObyBwb2ludCBpbiB3cmFwcGluZyBhZ2FpbiwgdGhlcmUgd2VyZSBubyBtYXRjaGVzLlxuICAgICAgICB0aGlzLl91cGRhdGVNYXRjaCgvKiBmb3VuZCA9ICovIGZhbHNlKTtcbiAgICAgICAgLy8gV2hpbGUgbWF0Y2hlcyB3ZXJlIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciBhIHBhZ2VcbiAgICAgICAgLy8gd2l0aCBtYXRjaGVzIHNob3VsZCBuZXZlcnRoZWxlc3MgaGFsdC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE1hdGNoZXMgd2VyZSBub3QgZm91bmQgKGFuZCBzZWFyY2hpbmcgaXMgbm90IGRvbmUpLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIF9uZXh0UGFnZU1hdGNoKCkge1xuICAgIGlmICh0aGlzLl9yZXN1bWVQYWdlSWR4ICE9PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhlcmUgY2FuIG9ubHkgYmUgb25lIHBlbmRpbmcgcGFnZS5cIik7XG4gICAgfVxuXG4gICAgbGV0IG1hdGNoZXMgPSBudWxsO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHBhZ2VJZHggPSB0aGlzLl9vZmZzZXQucGFnZUlkeDtcbiAgICAgIG1hdGNoZXMgPSB0aGlzLl9wYWdlTWF0Y2hlc1twYWdlSWR4XTtcbiAgICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICAvLyBUaGUgbWF0Y2hlcyBkb24ndCBleGlzdCB5ZXQgZm9yIHByb2Nlc3NpbmcgYnkgYF9tYXRjaGVzUmVhZHlgLFxuICAgICAgICAvLyBzbyBzZXQgYSByZXN1bWUgcG9pbnQgZm9yIHdoZW4gdGhleSBkbyBleGlzdC5cbiAgICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IHBhZ2VJZHg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKCF0aGlzLl9tYXRjaGVzUmVhZHkobWF0Y2hlcykpO1xuICB9XG5cbiAgX2FkdmFuY2VPZmZzZXRQYWdlKHByZXZpb3VzKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0O1xuICAgIGNvbnN0IG51bVBhZ2VzID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZXNDb3VudDtcbiAgICBvZmZzZXQucGFnZUlkeCA9IHByZXZpb3VzID8gb2Zmc2V0LnBhZ2VJZHggLSAxIDogb2Zmc2V0LnBhZ2VJZHggKyAxO1xuICAgIG9mZnNldC5tYXRjaElkeCA9IG51bGw7XG5cbiAgICB0aGlzLl9wYWdlc1RvU2VhcmNoLS07XG5cbiAgICBpZiAob2Zmc2V0LnBhZ2VJZHggPj0gbnVtUGFnZXMgfHwgb2Zmc2V0LnBhZ2VJZHggPCAwKSB7XG4gICAgICBvZmZzZXQucGFnZUlkeCA9IHByZXZpb3VzID8gbnVtUGFnZXMgLSAxIDogMDtcbiAgICAgIG9mZnNldC53cmFwcGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlTWF0Y2goZm91bmQgPSBmYWxzZSkge1xuICAgIGxldCBzdGF0ZSA9IEZpbmRTdGF0ZS5OT1RfRk9VTkQ7XG4gICAgY29uc3Qgd3JhcHBlZCA9IHRoaXMuX29mZnNldC53cmFwcGVkO1xuICAgIHRoaXMuX29mZnNldC53cmFwcGVkID0gZmFsc2U7XG5cbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzUGFnZSA9IHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHg7XG4gICAgICB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ID0gdGhpcy5fb2Zmc2V0LnBhZ2VJZHg7XG4gICAgICB0aGlzLl9zZWxlY3RlZC5tYXRjaElkeCA9IHRoaXMuX29mZnNldC5tYXRjaElkeDtcbiAgICAgIHN0YXRlID0gd3JhcHBlZCA/IEZpbmRTdGF0ZS5XUkFQUEVEIDogRmluZFN0YXRlLkZPVU5EO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYWdlIHRvIHdpcGUgb3V0IGFueSBzZWxlY3RlZCBtYXRjaGVzLlxuICAgICAgaWYgKHByZXZpb3VzUGFnZSAhPT0gLTEgJiYgcHJldmlvdXNQYWdlICE9PSB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVBhZ2UocHJldmlvdXNQYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVVSVN0YXRlKHN0YXRlLCB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXMpO1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ICE9PSAtMSkge1xuICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG1hdGNoIHdpbGwgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IHRydWU7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZVBhZ2UodGhpcy5fc2VsZWN0ZWQucGFnZUlkeCk7XG4gICAgfVxuICB9XG5cbiAgX29uRmluZEJhckNsb3NlKGV2dCkge1xuICAgIGNvbnN0IHBkZkRvY3VtZW50ID0gdGhpcy5fcGRmRG9jdW1lbnQ7XG4gICAgLy8gU2luY2Ugc2VhcmNoaW5nIGlzIGFzeW5jaHJvbm91cywgZW5zdXJlIHRoYXQgdGhlIHJlbW92YWwgb2YgaGlnaGxpZ2h0ZWRcbiAgICAvLyBtYXRjaGVzIChmcm9tIHRoZSBVSSkgaXMgYXN5bmMgdG9vIHN1Y2ggdGhhdCB0aGUgJ3VwZGF0ZXRleHRsYXllcm1hdGNoZXMnXG4gICAgLy8gZXZlbnRzIHdpbGwgYWx3YXlzIGJlIGRpc3BhdGNoZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLlxuICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBVSSBpZiB0aGUgZG9jdW1lbnQgaXMgb3BlbiwgYW5kIGlzIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuX3BkZkRvY3VtZW50IHx8XG4gICAgICAgIChwZGZEb2N1bWVudCAmJiB0aGlzLl9wZGZEb2N1bWVudCAhPT0gcGRmRG9jdW1lbnQpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHRoYXQgYSBwZW5kaW5nLCBub3QgeWV0IHN0YXJ0ZWQsIHNlYXJjaCBvcGVyYXRpb24gaXMgYWJvcnRlZC5cbiAgICAgIGlmICh0aGlzLl9maW5kVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZmluZFRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBBYm9ydCBhbnkgbG9uZyBydW5uaW5nIHNlYXJjaGVzLCB0byBhdm9pZCBhIG1hdGNoIGJlaW5nIHNjcm9sbGVkIGludG9cbiAgICAgIC8vIHZpZXcgKmFmdGVyKiB0aGUgZmluZGJhciBoYXMgYmVlbiBjbG9zZWQuIEluIHRoaXMgY2FzZSBgdGhpcy5fb2Zmc2V0YFxuICAgICAgLy8gd2lsbCBtb3N0IGxpa2VseSBkaWZmZXIgZnJvbSBgdGhpcy5fc2VsZWN0ZWRgLCBoZW5jZSB3ZSBhbHNvIGVuc3VyZVxuICAgICAgLy8gdGhhdCBhbnkgbmV3IHNlYXJjaCBvcGVyYXRpb24gd2lsbCBhbHdheXMgc3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlLlxuICAgICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHgpIHtcbiAgICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2RpcnR5TWF0Y2ggPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gQXZvaWQgdGhlIFVJIGJlaW5nIGluIGEgcGVuZGluZyBzdGF0ZSB3aGVuIHRoZSBmaW5kYmFyIGlzIHJlLW9wZW5lZC5cbiAgICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUoRmluZFN0YXRlLkZPVU5EKTtcblxuICAgICAgdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgdGhpcy5fdXBkYXRlQWxsUGFnZXMoKTsgLy8gV2lwZSBvdXQgYW55IHByZXZpb3VzbHkgaGlnaGxpZ2h0ZWQgbWF0Y2hlcy5cbiAgICB9KTtcbiAgfVxuXG4gIF9yZXF1ZXN0TWF0Y2hlc0NvdW50KCkge1xuICAgIGNvbnN0IHsgcGFnZUlkeCwgbWF0Y2hJZHggfSA9IHRoaXMuX3NlbGVjdGVkO1xuICAgIGxldCBjdXJyZW50ID0gMCxcbiAgICAgIHRvdGFsID0gdGhpcy5fbWF0Y2hlc0NvdW50VG90YWw7XG4gICAgaWYgKG1hdGNoSWR4ICE9PSAtMSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlSWR4OyBpKyspIHtcbiAgICAgICAgY3VycmVudCArPSAodGhpcy5fcGFnZU1hdGNoZXNbaV0gJiYgdGhpcy5fcGFnZU1hdGNoZXNbaV0ubGVuZ3RoKSB8fCAwO1xuICAgICAgfVxuICAgICAgY3VycmVudCArPSBtYXRjaElkeCArIDE7XG4gICAgfVxuICAgIC8vIFdoZW4gc2VhcmNoaW5nIHN0YXJ0cywgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGBwYWdlTWF0Y2hlc2BcbiAgICAvLyBoYXZlIGJlZW4gY291bnRlZCAoaW4gYF9jYWxjdWxhdGVNYXRjaGApLiBFbnN1cmUgdGhhdCB0aGUgVUkgd29uJ3Qgc2hvd1xuICAgIC8vIHRlbXBvcmFyaWx5IGJyb2tlbiBzdGF0ZSB3aGVuIHRoZSBhY3RpdmUgZmluZCByZXN1bHQgZG9lc24ndCBtYWtlIHNlbnNlLlxuICAgIGlmIChjdXJyZW50IDwgMSB8fCBjdXJyZW50ID4gdG90YWwpIHtcbiAgICAgIGN1cnJlbnQgPSB0b3RhbCA9IDA7XG4gICAgfVxuICAgIHJldHVybiB7IGN1cnJlbnQsIHRvdGFsIH07XG4gIH1cblxuICBfdXBkYXRlVUlSZXN1bHRzQ291bnQoKSB7XG4gICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJ1cGRhdGVmaW5kbWF0Y2hlc2NvdW50XCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIG1hdGNoZXNDb3VudDogdGhpcy5fcmVxdWVzdE1hdGNoZXNDb3VudCgpLFxuICAgIH0pO1xuICB9XG5cbiAgX3VwZGF0ZVVJU3RhdGUoc3RhdGUsIHByZXZpb3VzKSB7XG4gICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJ1cGRhdGVmaW5kY29udHJvbHN0YXRlXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIHN0YXRlLFxuICAgICAgcHJldmlvdXMsXG4gICAgICBtYXRjaGVzQ291bnQ6IHRoaXMuX3JlcXVlc3RNYXRjaGVzQ291bnQoKSxcbiAgICAgIHJhd1F1ZXJ5OiB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlLnF1ZXJ5IDogbnVsbCxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBGaW5kU3RhdGUsIFBERkZpbmRDb250cm9sbGVyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxOCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgQ2hhcmFjdGVyVHlwZSA9IHtcbiAgU1BBQ0U6IDAsXG4gIEFMUEhBX0xFVFRFUjogMSxcbiAgUFVOQ1Q6IDIsXG4gIEhBTl9MRVRURVI6IDMsXG4gIEtBVEFLQU5BX0xFVFRFUjogNCxcbiAgSElSQUdBTkFfTEVUVEVSOiA1LFxuICBIQUxGV0lEVEhfS0FUQUtBTkFfTEVUVEVSOiA2LFxuICBUSEFJX0xFVFRFUjogNyxcbn07XG5cbmZ1bmN0aW9uIGlzQWxwaGFiZXRpY2FsU2NyaXB0KGNoYXJDb2RlKSB7XG4gIHJldHVybiBjaGFyQ29kZSA8IDB4MmU4MDtcbn1cblxuZnVuY3Rpb24gaXNBc2NpaShjaGFyQ29kZSkge1xuICByZXR1cm4gKGNoYXJDb2RlICYgMHhmZjgwKSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gaXNBc2NpaUFscGhhKGNoYXJDb2RlKSB7XG4gIHJldHVybiAoXG4gICAgKGNoYXJDb2RlID49IC8qIGEgPSAqLyAweDYxICYmIGNoYXJDb2RlIDw9IC8qIHogPSAqLyAweDdhKSB8fFxuICAgIChjaGFyQ29kZSA+PSAvKiBBID0gKi8gMHg0MSAmJiBjaGFyQ29kZSA8PSAvKiBaID0gKi8gMHg1YSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNBc2NpaURpZ2l0KGNoYXJDb2RlKSB7XG4gIHJldHVybiBjaGFyQ29kZSA+PSAvKiAwID0gKi8gMHgzMCAmJiBjaGFyQ29kZSA8PSAvKiA5ID0gKi8gMHgzOTtcbn1cblxuZnVuY3Rpb24gaXNBc2NpaVNwYWNlKGNoYXJDb2RlKSB7XG4gIHJldHVybiAoXG4gICAgY2hhckNvZGUgPT09IC8qIFNQQUNFID0gKi8gMHgyMCB8fFxuICAgIGNoYXJDb2RlID09PSAvKiBUQUIgPSAqLyAweDA5IHx8XG4gICAgY2hhckNvZGUgPT09IC8qIENSID0gKi8gMHgwZCB8fFxuICAgIGNoYXJDb2RlID09PSAvKiBMRiA9ICovIDB4MGFcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNIYW4oY2hhckNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICAoY2hhckNvZGUgPj0gMHgzNDAwICYmIGNoYXJDb2RlIDw9IDB4OWZmZikgfHxcbiAgICAoY2hhckNvZGUgPj0gMHhmOTAwICYmIGNoYXJDb2RlIDw9IDB4ZmFmZilcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNLYXRha2FuYShjaGFyQ29kZSkge1xuICByZXR1cm4gY2hhckNvZGUgPj0gMHgzMGEwICYmIGNoYXJDb2RlIDw9IDB4MzBmZjtcbn1cblxuZnVuY3Rpb24gaXNIaXJhZ2FuYShjaGFyQ29kZSkge1xuICByZXR1cm4gY2hhckNvZGUgPj0gMHgzMDQwICYmIGNoYXJDb2RlIDw9IDB4MzA5Zjtcbn1cblxuZnVuY3Rpb24gaXNIYWxmd2lkdGhLYXRha2FuYShjaGFyQ29kZSkge1xuICByZXR1cm4gY2hhckNvZGUgPj0gMHhmZjYwICYmIGNoYXJDb2RlIDw9IDB4ZmY5Zjtcbn1cblxuZnVuY3Rpb24gaXNUaGFpKGNoYXJDb2RlKSB7XG4gIHJldHVybiAoY2hhckNvZGUgJiAweGZmODApID09PSAweDBlMDA7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgd29yZC1icmVhayBkZXRlY3Rpb24gaW1wbGVtZW50ZWQgaW46XG4gKiBodHRwczovL2hnLm1vemlsbGEub3JnL21vemlsbGEtY2VudHJhbC9maWxlL3RpcC9pbnRsL2x3YnJrL1dvcmRCcmVha2VyLmNwcFxuICovXG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJUeXBlKGNoYXJDb2RlKSB7XG4gIGlmIChpc0FscGhhYmV0aWNhbFNjcmlwdChjaGFyQ29kZSkpIHtcbiAgICBpZiAoaXNBc2NpaShjaGFyQ29kZSkpIHtcbiAgICAgIGlmIChpc0FzY2lpU3BhY2UoY2hhckNvZGUpKSB7XG4gICAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlNQQUNFO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNBc2NpaUFscGhhKGNoYXJDb2RlKSB8fFxuICAgICAgICBpc0FzY2lpRGlnaXQoY2hhckNvZGUpIHx8XG4gICAgICAgIGNoYXJDb2RlID09PSAvKiBVTkRFUlNDT1JFID0gKi8gMHg1ZlxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlBVTkNUO1xuICAgIH0gZWxzZSBpZiAoaXNUaGFpKGNoYXJDb2RlKSkge1xuICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuVEhBSV9MRVRURVI7XG4gICAgfSBlbHNlIGlmIChjaGFyQ29kZSA9PT0gLyogTkJTUCA9ICovIDB4YTApIHtcbiAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLlNQQUNFO1xuICAgIH1cbiAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVI7XG4gIH1cblxuICBpZiAoaXNIYW4oY2hhckNvZGUpKSB7XG4gICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSEFOX0xFVFRFUjtcbiAgfSBlbHNlIGlmIChpc0thdGFrYW5hKGNoYXJDb2RlKSkge1xuICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLktBVEFLQU5BX0xFVFRFUjtcbiAgfSBlbHNlIGlmIChpc0hpcmFnYW5hKGNoYXJDb2RlKSkge1xuICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkhJUkFHQU5BX0xFVFRFUjtcbiAgfSBlbHNlIGlmIChpc0hhbGZ3aWR0aEthdGFrYW5hKGNoYXJDb2RlKSkge1xuICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkhBTEZXSURUSF9LQVRBS0FOQV9MRVRURVI7XG4gIH1cbiAgcmV0dXJuIENoYXJhY3RlclR5cGUuQUxQSEFfTEVUVEVSO1xufVxuXG5leHBvcnQgeyBDaGFyYWN0ZXJUeXBlLCBnZXRDaGFyYWN0ZXJUeXBlIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNyBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgaXNWYWxpZFJvdGF0aW9uLFxuICBwYXJzZVF1ZXJ5U3RyaW5nLFxuICB3YWl0T25FdmVudE9yVGltZW91dCxcbn0gZnJvbSBcIi4vdWlfdXRpbHMuanNcIjtcblxuLy8gSGV1cmlzdGljIHZhbHVlIHVzZWQgd2hlbiBmb3JjZS1yZXNldHRpbmcgYHRoaXMuX2Jsb2NrSGFzaENoYW5nZWAuXG5jb25zdCBIQVNIX0NIQU5HRV9USU1FT1VUID0gMTAwMDsgLy8gbWlsbGlzZWNvbmRzXG4vLyBIZXVyaXN0aWMgdmFsdWUgdXNlZCB3aGVuIGFkZGluZyB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgYnJvd3NlciBoaXN0b3J5LlxuY29uc3QgUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPSA1MDtcbi8vIEhldXJpc3RpYyB2YWx1ZSB1c2VkIHdoZW4gYWRkaW5nIGEgdGVtcG9yYXJ5IHBvc2l0aW9uIHRvIHRoZSBicm93c2VyIGhpc3RvcnkuXG5jb25zdCBVUERBVEVfVklFV0FSRUFfVElNRU9VVCA9IDEwMDA7IC8vIG1pbGxpc2Vjb25kc1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBERkhpc3RvcnlPcHRpb25zXG4gKiBAcHJvcGVydHkge0lQREZMaW5rU2VydmljZX0gbGlua1NlcnZpY2UgLSBUaGUgbmF2aWdhdGlvbi9saW5raW5nIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge0V2ZW50QnVzfSBldmVudEJ1cyAtIFRoZSBhcHBsaWNhdGlvbiBldmVudCBidXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbml0aWFsaXplUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbmdlcnByaW50IC0gVGhlIFBERiBkb2N1bWVudCdzIHVuaXF1ZSBmaW5nZXJwcmludC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Jlc2V0SGlzdG9yeV0gLSBSZXNldCB0aGUgYnJvd3NpbmcgaGlzdG9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VwZGF0ZVVybF0gLSBBdHRlbXB0IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnQgVVJMLCB3aXRoXG4gKiAgIHRoZSBjdXJyZW50IGhhc2gsIHdoZW4gcHVzaGluZy9yZXBsYWNpbmcgYnJvd3NlciBoaXN0b3J5IGVudHJpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdXNoUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lZERlc3RdIC0gVGhlIG5hbWVkIGRlc3RpbmF0aW9uLiBJZiBhYnNlbnQsIGFcbiAqICAgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiBgZXhwbGljaXREZXN0YCBpcyB1c2VkLlxuICogQHByb3BlcnR5IHtBcnJheX0gZXhwbGljaXREZXN0IC0gVGhlIGV4cGxpY2l0IGRlc3RpbmF0aW9uIGFycmF5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBhZ2VOdW1iZXIgLSBUaGUgcGFnZSB0byB3aGljaCB0aGUgZGVzdGluYXRpb24gcG9pbnRzLlxuICovXG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRIYXNoKCkge1xuICByZXR1cm4gZG9jdW1lbnQubG9jYXRpb24uaGFzaDtcbn1cblxuY2xhc3MgUERGSGlzdG9yeSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge1BERkhpc3RvcnlPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7IGxpbmtTZXJ2aWNlLCBldmVudEJ1cyB9KSB7XG4gICAgdGhpcy5saW5rU2VydmljZSA9IGxpbmtTZXJ2aWNlO1xuICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cztcblxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgdGhpcy5fZmluZ2VycHJpbnQgPSBcIlwiO1xuICAgIHRoaXMucmVzZXQoKTtcblxuICAgIHRoaXMuX2JvdW5kRXZlbnRzID0gbnVsbDtcbiAgICB0aGlzLl9pc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSA9IGZhbHNlO1xuICAgIC8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IG1pc3MgZWl0aGVyIGEgJ3ByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkJyBvciBhXG4gICAgLy8gJ3BhZ2VzaW5pdCcgZXZlbnQsIGJ5IHJlZ2lzdGVyaW5nIHRoZSBsaXN0ZW5lcnMgaW1tZWRpYXRlbHkuXG4gICAgdGhpcy5ldmVudEJ1cy5fb24oXCJwcmVzZW50YXRpb25tb2RlY2hhbmdlZFwiLCBldnQgPT4ge1xuICAgICAgdGhpcy5faXNWaWV3ZXJJblByZXNlbnRhdGlvbk1vZGUgPSBldnQuYWN0aXZlIHx8IGV2dC5zd2l0Y2hJblByb2dyZXNzO1xuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRCdXMuX29uKFwicGFnZXNpbml0XCIsICgpID0+IHtcbiAgICAgIHRoaXMuX2lzUGFnZXNMb2FkZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3Qgb25QYWdlc0xvYWRlZCA9IGV2dCA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuX29mZihcInBhZ2VzbG9hZGVkXCIsIG9uUGFnZXNMb2FkZWQpO1xuICAgICAgICB0aGlzLl9pc1BhZ2VzTG9hZGVkID0gISFldnQucGFnZXNDb3VudDtcbiAgICAgIH07XG4gICAgICB0aGlzLmV2ZW50QnVzLl9vbihcInBhZ2VzbG9hZGVkXCIsIG9uUGFnZXNMb2FkZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGhpc3RvcnkgZm9yIHRoZSBQREYgZG9jdW1lbnQsIHVzaW5nIGVpdGhlciB0aGUgY3VycmVudFxuICAgKiBicm93c2VyIGhpc3RvcnkgZW50cnkgb3IgdGhlIGRvY3VtZW50IGhhc2gsIHdoaWNoZXZlciBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0ge0luaXRpYWxpemVQYXJhbWV0ZXJzfSBwYXJhbXNcbiAgICovXG4gIGluaXRpYWxpemUoeyBmaW5nZXJwcmludCwgcmVzZXRIaXN0b3J5ID0gZmFsc2UsIHVwZGF0ZVVybCA9IGZhbHNlIH0pIHtcbiAgICBpZiAoIWZpbmdlcnByaW50IHx8IHR5cGVvZiBmaW5nZXJwcmludCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ1BERkhpc3RvcnkuaW5pdGlhbGl6ZTogVGhlIFwiZmluZ2VycHJpbnRcIiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhhdCBhbnkgb2xkIHN0YXRlIGlzIGFsd2F5cyByZXNldCB1cG9uIGluaXRpYWxpemF0aW9uLlxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgICBjb25zdCByZUluaXRpYWxpemVkID1cbiAgICAgIHRoaXMuX2ZpbmdlcnByaW50ICE9PSBcIlwiICYmIHRoaXMuX2ZpbmdlcnByaW50ICE9PSBmaW5nZXJwcmludDtcbiAgICB0aGlzLl9maW5nZXJwcmludCA9IGZpbmdlcnByaW50O1xuICAgIHRoaXMuX3VwZGF0ZVVybCA9IHVwZGF0ZVVybCA9PT0gdHJ1ZTtcblxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTtcblxuICAgIHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMuX2Jsb2NrSGFzaENoYW5nZSA9IDA7XG4gICAgdGhpcy5fY3VycmVudEhhc2ggPSBnZXRDdXJyZW50SGFzaCgpO1xuICAgIHRoaXMuX251bVBvc2l0aW9uVXBkYXRlcyA9IDA7XG5cbiAgICB0aGlzLl91aWQgPSB0aGlzLl9tYXhVaWQgPSAwO1xuICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9wb3NpdGlvbiA9IG51bGw7XG5cbiAgICBpZiAoIXRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSwgLyogY2hlY2tSZWxvYWQgPSAqLyB0cnVlKSB8fCByZXNldEhpc3RvcnkpIHtcbiAgICAgIGNvbnN0IHsgaGFzaCwgcGFnZSwgcm90YXRpb24gfSA9IHRoaXMuX3BhcnNlQ3VycmVudEhhc2goXG4gICAgICAgIC8qIGNoZWNrTmFtZWRkZXN0ID0gKi8gdHJ1ZVxuICAgICAgKTtcblxuICAgICAgaWYgKCFoYXNoIHx8IHJlSW5pdGlhbGl6ZWQgfHwgcmVzZXRIaXN0b3J5KSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBicm93c2VyIGhpc3RvcnkgaXMgcmVzZXQgb24gUERGIGRvY3VtZW50IGxvYWQuXG4gICAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShudWxsLCAvKiBmb3JjZVJlcGxhY2UgPSAqLyB0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGJyb3dzZXIgaGlzdG9yeSBpcyBpbml0aWFsaXplZCBjb3JyZWN0bHkgd2hlblxuICAgICAgLy8gdGhlIGRvY3VtZW50IGhhc2ggaXMgcHJlc2VudCBvbiBQREYgZG9jdW1lbnQgbG9hZC5cbiAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShcbiAgICAgICAgeyBoYXNoLCBwYWdlLCByb3RhdGlvbiB9LFxuICAgICAgICAvKiBmb3JjZVJlcGxhY2UgPSAqLyB0cnVlXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBicm93c2VyIGhpc3RvcnkgY29udGFpbnMgYSB2YWxpZCBlbnRyeSwgZW5zdXJlIHRoYXQgdGhlIGhpc3RvcnkgaXNcbiAgICAvLyBpbml0aWFsaXplZCBjb3JyZWN0bHkgb24gUERGIGRvY3VtZW50IGxvYWQuXG4gICAgY29uc3QgZGVzdGluYXRpb24gPSBzdGF0ZS5kZXN0aW5hdGlvbjtcbiAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICBzdGF0ZS51aWQsXG4gICAgICAvKiByZW1vdmVUZW1wb3JhcnkgPSAqLyB0cnVlXG4gICAgKTtcbiAgICBpZiAodGhpcy5fdWlkID4gdGhpcy5fbWF4VWlkKSB7XG4gICAgICB0aGlzLl9tYXhVaWQgPSB0aGlzLl91aWQ7XG4gICAgfVxuXG4gICAgaWYgKGRlc3RpbmF0aW9uLnJvdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IGRlc3RpbmF0aW9uLnJvdGF0aW9uO1xuICAgIH1cbiAgICBpZiAoZGVzdGluYXRpb24uZGVzdCkge1xuICAgICAgdGhpcy5faW5pdGlhbEJvb2ttYXJrID0gSlNPTi5zdHJpbmdpZnkoZGVzdGluYXRpb24uZGVzdCk7XG5cbiAgICAgIC8vIElmIHRoZSBoaXN0b3J5IGlzIHVwZGF0ZWQsIGUuZy4gdGhyb3VnaCB0aGUgdXNlciBjaGFuZ2luZyB0aGUgaGFzaCxcbiAgICAgIC8vIGJlZm9yZSB0aGUgaW5pdGlhbCBkZXN0aW5hdGlvbiBoYXMgYmVjb21lIHZpc2libGUsIHRoZW4gd2UgZG8gKm5vdCpcbiAgICAgIC8vIHdhbnQgdG8gcG90ZW50aWFsbHkgYWRkIGB0aGlzLl9wb3NpdGlvbmAgdG8gdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uaGFzaCkge1xuICAgICAgdGhpcy5faW5pdGlhbEJvb2ttYXJrID0gZGVzdGluYXRpb24uaGFzaDtcbiAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLnBhZ2UpIHtcbiAgICAgIC8vIEZhbGxiYWNrIGNhc2U7IHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5LlxuICAgICAgdGhpcy5faW5pdGlhbEJvb2ttYXJrID0gYHBhZ2U9JHtkZXN0aW5hdGlvbi5wYWdlfWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjdXJyZW50IGBQREZIaXN0b3J5YCBpbnN0YW5jZSwgYW5kIGNvbnNlcXVlbnRseSBwcmV2ZW50IGFueVxuICAgKiBmdXJ0aGVyIHVwZGF0ZXMgYW5kL29yIG5hdmlnYXRpb24gb2YgdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICovXG4gIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5fcGFnZUhpZGUoKTsgLy8gU2ltdWxhdGUgYSAncGFnZWhpZGUnIGV2ZW50IHdoZW4gcmVzZXR0aW5nLlxuXG4gICAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fdW5iaW5kRXZlbnRzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpO1xuICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbEJvb2ttYXJrID0gbnVsbDtcbiAgICB0aGlzLl9pbml0aWFsUm90YXRpb24gPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2ggYW4gaW50ZXJuYWwgZGVzdGluYXRpb24gdG8gdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICogQHBhcmFtIHtQdXNoUGFyYW1ldGVyc31cbiAgICovXG4gIHB1c2goeyBuYW1lZERlc3QgPSBudWxsLCBleHBsaWNpdERlc3QsIHBhZ2VOdW1iZXIgfSkge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWVkRGVzdCAmJiB0eXBlb2YgbmFtZWREZXN0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIlBERkhpc3RvcnkucHVzaDogXCIgK1xuICAgICAgICAgIGBcIiR7bmFtZWREZXN0fVwiIGlzIG5vdCBhIHZhbGlkIG5hbWVkRGVzdCBwYXJhbWV0ZXIuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGV4cGxpY2l0RGVzdCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiUERGSGlzdG9yeS5wdXNoOiBcIiArXG4gICAgICAgICAgYFwiJHtleHBsaWNpdERlc3R9XCIgaXMgbm90IGEgdmFsaWQgZXhwbGljaXREZXN0IHBhcmFtZXRlci5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhKFxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpICYmXG4gICAgICAgIHBhZ2VOdW1iZXIgPiAwICYmXG4gICAgICAgIHBhZ2VOdW1iZXIgPD0gdGhpcy5saW5rU2VydmljZS5wYWdlc0NvdW50XG4gICAgICApXG4gICAgKSB7XG4gICAgICAvLyBBbGxvdyBhbiB1bnNldCBgcGFnZU51bWJlcmAgaWYgYW5kIG9ubHkgaWYgdGhlIGhpc3RvcnkgaXMgc3RpbGwgZW1wdHk7XG4gICAgICAvLyBwbGVhc2UgcmVmZXIgdG8gdGhlIGB0aGlzLl9kZXN0aW5hdGlvbi5wYWdlID0gbnVsbDtgIGNvbW1lbnQgYWJvdmUuXG4gICAgICBpZiAocGFnZU51bWJlciAhPT0gbnVsbCB8fCB0aGlzLl9kZXN0aW5hdGlvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiUERGSGlzdG9yeS5wdXNoOiBcIiArXG4gICAgICAgICAgICBgXCIke3BhZ2VOdW1iZXJ9XCIgaXMgbm90IGEgdmFsaWQgcGFnZU51bWJlciBwYXJhbWV0ZXIuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzaCA9IG5hbWVkRGVzdCB8fCBKU09OLnN0cmluZ2lmeShleHBsaWNpdERlc3QpO1xuICAgIGlmICghaGFzaCkge1xuICAgICAgLy8gVGhlIGhhc2ggKnNob3VsZCogbmV2ZXIgYmUgdW5kZWZpbmVkLCBidXQgaWYgdGhhdCB3ZXJlIHRvIG9jY3VyLFxuICAgICAgLy8gYXZvaWQgYW55IHBvc3NpYmxlIGlzc3VlcyBieSBub3QgdXBkYXRpbmcgdGhlIGJyb3dzZXIgaGlzdG9yeS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZm9yY2VSZXBsYWNlID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fZGVzdGluYXRpb24gJiZcbiAgICAgIChpc0Rlc3RIYXNoZXNFcXVhbCh0aGlzLl9kZXN0aW5hdGlvbi5oYXNoLCBoYXNoKSB8fFxuICAgICAgICBpc0Rlc3RBcnJheXNFcXVhbCh0aGlzLl9kZXN0aW5hdGlvbi5kZXN0LCBleHBsaWNpdERlc3QpKVxuICAgICkge1xuICAgICAgLy8gV2hlbiB0aGUgbmV3IGRlc3RpbmF0aW9uIGlzIGlkZW50aWNhbCB0byBgdGhpcy5fZGVzdGluYXRpb25gLCBhbmRcbiAgICAgIC8vIGl0cyBgcGFnZWAgaXMgdW5kZWZpbmVkLCByZXBsYWNlIHRoZSBjdXJyZW50IGJyb3dzZXIgaGlzdG9yeSBlbnRyeS5cbiAgICAgIC8vIE5PVEU6IFRoaXMgY2FuIG9ubHkgb2NjdXIgaWYgYHRoaXMuX2Rlc3RpbmF0aW9uYCB3YXMgc2V0IGVpdGhlcjpcbiAgICAgIC8vICAtIHRocm91Z2ggdGhlIGRvY3VtZW50IGhhc2ggYmVpbmcgc3BlY2lmaWVkIG9uIGxvYWQuXG4gICAgICAvLyAgLSB0aHJvdWdoIHRoZSB1c2VyIGNoYW5naW5nIHRoZSBoYXNoIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5wYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvcmNlUmVwbGFjZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgJiYgIWZvcmNlUmVwbGFjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgZGVzdDogZXhwbGljaXREZXN0LFxuICAgICAgICBoYXNoLFxuICAgICAgICBwYWdlOiBwYWdlTnVtYmVyLFxuICAgICAgICByb3RhdGlvbjogdGhpcy5saW5rU2VydmljZS5yb3RhdGlvbixcbiAgICAgIH0sXG4gICAgICBmb3JjZVJlcGxhY2VcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIC8vIFByZXZlbnQgdGhlIGJyb3dzZXIgaGlzdG9yeSBmcm9tIHVwZGF0aW5nIHdoaWxlIHRoZSBuZXcgZGVzdGluYXRpb24gaXNcbiAgICAgIC8vIGJlaW5nIHNjcm9sbGVkIGludG8gdmlldywgdG8gYXZvaWQgcG90ZW50aWFsbHkgaW5jb25zaXN0ZW50IHN0YXRlLlxuICAgICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIC8vIFdlIGRlZmVyIHRoZSByZXNldHRpbmcgb2YgYHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzc2AsIHRvIGFjY291bnQgZm9yXG4gICAgICAvLyBlLmcuIHpvb21pbmcgb2NjdXJpbmcgd2hlbiB0aGUgbmV3IGRlc3RpbmF0aW9uIGlzIGJlaW5nIG5hdmlnYXRlZCB0by5cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBicm93c2VyIGhpc3RvcnkuXG4gICAqL1xuICBwdXNoQ3VycmVudFBvc2l0aW9uKCkge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RyeVB1c2hDdXJyZW50UG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyBiYWNrIG9uZSBzdGVwIGluIHRoZSBicm93c2VyIGhpc3RvcnkuXG4gICAqIE5PVEU6IEF2b2lkcyBuYXZpZ2F0aW5nIGF3YXkgZnJvbSB0aGUgZG9jdW1lbnQsIHVzZWZ1bCBmb3IgXCJuYW1lZCBhY3Rpb25zXCIuXG4gICAqL1xuICBiYWNrKCkge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7XG4gICAgaWYgKHRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSkgJiYgc3RhdGUudWlkID4gMCkge1xuICAgICAgd2luZG93Lmhpc3RvcnkuYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHbyBmb3J3YXJkIG9uZSBzdGVwIGluIHRoZSBicm93c2VyIGhpc3RvcnkuXG4gICAqIE5PVEU6IEF2b2lkcyBuYXZpZ2F0aW5nIGF3YXkgZnJvbSB0aGUgZG9jdW1lbnQsIHVzZWZ1bCBmb3IgXCJuYW1lZCBhY3Rpb25zXCIuXG4gICAqL1xuICBmb3J3YXJkKCkge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7XG4gICAgaWYgKHRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSkgJiYgc3RhdGUudWlkIDwgdGhpcy5fbWF4VWlkKSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5mb3J3YXJkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtib29sZWFufSBJbmRpY2F0aW5nIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBtb3ZpbmcgdGhyb3VnaCB0aGVcbiAgICogICBicm93c2VyIGhpc3RvcnksIHVzZWZ1bCBlLmcuIGZvciBza2lwcGluZyB0aGUgbmV4dCAnaGFzaGNoYW5nZScgZXZlbnQuXG4gICAqL1xuICBnZXQgcG9wU3RhdGVJblByb2dyZXNzKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9pbml0aWFsaXplZCAmJlxuICAgICAgKHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyB8fCB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UgPiAwKVxuICAgICk7XG4gIH1cblxuICBnZXQgaW5pdGlhbEJvb2ttYXJrKCkge1xuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXplZCA/IHRoaXMuX2luaXRpYWxCb29rbWFyayA6IG51bGw7XG4gIH1cblxuICBnZXQgaW5pdGlhbFJvdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXplZCA/IHRoaXMuX2luaXRpYWxSb3RhdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wdXNoT3JSZXBsYWNlU3RhdGUoZGVzdGluYXRpb24sIGZvcmNlUmVwbGFjZSA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc2hvdWxkUmVwbGFjZSA9IGZvcmNlUmVwbGFjZSB8fCAhdGhpcy5fZGVzdGluYXRpb247XG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICBmaW5nZXJwcmludDogdGhpcy5fZmluZ2VycHJpbnQsXG4gICAgICB1aWQ6IHNob3VsZFJlcGxhY2UgPyB0aGlzLl91aWQgOiB0aGlzLl91aWQgKyAxLFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgUERGSlNEZXYudGVzdChcIkNIUk9NRVwiKSAmJlxuICAgICAgd2luZG93Lmhpc3Rvcnkuc3RhdGUgJiZcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnN0YXRlLmNocm9tZWNvbVN0YXRlXG4gICAgKSB7XG4gICAgICAvLyBoaXN0b3J5LnN0YXRlLmNocm9tZWNvbVN0YXRlIGlzIG1hbmFnZWQgYnkgY2hyb21lY29tLmpzLlxuICAgICAgbmV3U3RhdGUuY2hyb21lY29tU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZS5jaHJvbWVjb21TdGF0ZTtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlSW50ZXJuYWxTdGF0ZShkZXN0aW5hdGlvbiwgbmV3U3RhdGUudWlkKTtcblxuICAgIGxldCBuZXdVcmw7XG4gICAgaWYgKHRoaXMuX3VwZGF0ZVVybCAmJiBkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5oYXNoKSB7XG4gICAgICBjb25zdCBiYXNlVXJsID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZi5zcGxpdChcIiNcIilbMF07XG4gICAgICAvLyBQcmV2ZW50IGVycm9ycyBpbiBGaXJlZm94LlxuICAgICAgaWYgKCFiYXNlVXJsLnN0YXJ0c1dpdGgoXCJmaWxlOi8vXCIpKSB7XG4gICAgICAgIG5ld1VybCA9IGAke2Jhc2VVcmx9IyR7ZGVzdGluYXRpb24uaGFzaH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkUmVwbGFjZSkge1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG5ld1N0YXRlLCBcIlwiLCBuZXdVcmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXhVaWQgPSB0aGlzLl91aWQ7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobmV3U3RhdGUsIFwiXCIsIG5ld1VybCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICBQREZKU0Rldi50ZXN0KFwiQ0hST01FXCIpICYmXG4gICAgICB0b3AgPT09IHdpbmRvd1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZShcInNob3dQYWdlQWN0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RyeVB1c2hDdXJyZW50UG9zaXRpb24odGVtcG9yYXJ5ID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMuX3Bvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uO1xuICAgIGlmICh0ZW1wb3JhcnkpIHtcbiAgICAgIHBvc2l0aW9uID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLl9wb3NpdGlvbik7XG4gICAgICBwb3NpdGlvbi50ZW1wb3JhcnkgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZGVzdGluYXRpb24pIHtcbiAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShwb3NpdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHtcbiAgICAgIC8vIEFsd2F5cyByZXBsYWNlIGEgcHJldmlvdXMgKnRlbXBvcmFyeSogcG9zaXRpb24uXG4gICAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUocG9zaXRpb24sIC8qIGZvcmNlUmVwbGFjZSA9ICovIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVzdGluYXRpb24uaGFzaCA9PT0gcG9zaXRpb24uaGFzaCkge1xuICAgICAgcmV0dXJuOyAvLyBUaGUgY3VycmVudCBkb2N1bWVudCBwb3NpdGlvbiBoYXMgbm90IGNoYW5nZWQuXG4gICAgfVxuICAgIGlmIChcbiAgICAgICF0aGlzLl9kZXN0aW5hdGlvbi5wYWdlICYmXG4gICAgICAoUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPD0gMCB8fFxuICAgICAgICB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMgPD0gUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQpXG4gICAgKSB7XG4gICAgICAvLyBgdGhpcy5fZGVzdGluYXRpb25gIHdhcyBzZXQgdGhyb3VnaCB0aGUgdXNlciBjaGFuZ2luZyB0aGUgaGFzaCBvZlxuICAgICAgLy8gdGhlIGRvY3VtZW50LiBEbyBub3QgYWRkIGB0aGlzLl9wb3NpdGlvbmAgdG8gdGhlIGJyb3dzZXIgaGlzdG9yeSxcbiAgICAgIC8vIHRvIGF2b2lkIFwiZmxvb2RpbmdcIiBpdCB3aXRoIGxvdHMgb2YgKG5lYXJseSkgaWRlbnRpY2FsIGVudHJpZXMsXG4gICAgICAvLyBzaW5jZSB3ZSBjYW5ub3QgZW5zdXJlIHRoYXQgdGhlIGRvY3VtZW50IHBvc2l0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVJlcGxhY2UgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbi5wYWdlID49IHBvc2l0aW9uLmZpcnN0ICYmXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbi5wYWdlIDw9IHBvc2l0aW9uLnBhZ2VcbiAgICApIHtcbiAgICAgIC8vIFdoZW4gdGhlIGBwYWdlYCBvZiBgdGhpcy5fZGVzdGluYXRpb25gIGlzIHN0aWxsIHZpc2libGUsIGRvIG5vdFxuICAgICAgLy8gdXBkYXRlIHRoZSBicm93c2luZyBoaXN0b3J5IHdoZW4gYHRoaXMuX2Rlc3RpbmF0aW9uYCBlaXRoZXI6XG4gICAgICAvLyAgLSBjb250YWlucyBhbiBpbnRlcm5hbCBkZXN0aW5hdGlvbiwgc2luY2UgaW4gdGhpcyBjYXNlIHdlXG4gICAgICAvLyAgICBjYW5ub3QgZW5zdXJlIHRoYXQgdGhlIGRvY3VtZW50IHBvc2l0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgLy8gIC0gd2FzIHNldCB0aHJvdWdoIHRoZSB1c2VyIGNoYW5naW5nIHRoZSBoYXNoIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5kZXN0IHx8ICF0aGlzLl9kZXN0aW5hdGlvbi5maXJzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBUbyBhdm9pZCBcImZsb29kaW5nXCIgdGhlIGJyb3dzZXIgaGlzdG9yeSwgcmVwbGFjZSB0aGUgY3VycmVudCBlbnRyeS5cbiAgICAgIGZvcmNlUmVwbGFjZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShwb3NpdGlvbiwgZm9yY2VSZXBsYWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2lzVmFsaWRTdGF0ZShzdGF0ZSwgY2hlY2tSZWxvYWQgPSBmYWxzZSkge1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmZpbmdlcnByaW50ICE9PSB0aGlzLl9maW5nZXJwcmludCkge1xuICAgICAgaWYgKGNoZWNrUmVsb2FkKSB7XG4gICAgICAgIC8vIFBvdGVudGlhbGx5IGFjY2VwdCB0aGUgaGlzdG9yeSBlbnRyeSwgZXZlbiBpZiB0aGUgZmluZ2VycHJpbnRzIGRvbid0XG4gICAgICAgIC8vIG1hdGNoLCB3aGVuIHRoZSB2aWV3ZXIgd2FzIHJlbG9hZGVkIChzZWUgaXNzdWUgNjg0NykuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2Ygc3RhdGUuZmluZ2VycHJpbnQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICBzdGF0ZS5maW5nZXJwcmludC5sZW5ndGggIT09IHRoaXMuX2ZpbmdlcnByaW50Lmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW3BlcmZFbnRyeV0gPSBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKFwibmF2aWdhdGlvblwiKTtcbiAgICAgICAgaWYgKCFwZXJmRW50cnkgfHwgcGVyZkVudHJ5LnR5cGUgIT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgb2NjdXIgaW4gdmlld2VycyB3aXRoIHN1cHBvcnQgZm9yIG9wZW5pbmcgbW9yZSB0aGFuXG4gICAgICAgIC8vIG9uZSBQREYgZG9jdW1lbnQsIGUuZy4gdGhlIEdFTkVSSUMgdmlld2VyLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihzdGF0ZS51aWQpIHx8IHN0YXRlLnVpZCA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmRlc3RpbmF0aW9uID09PSBudWxsIHx8IHR5cGVvZiBzdGF0ZS5kZXN0aW5hdGlvbiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZUludGVybmFsU3RhdGUoZGVzdGluYXRpb24sIHVpZCwgcmVtb3ZlVGVtcG9yYXJ5ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KSB7XG4gICAgICAvLyBXaGVuIHVwZGF0aW5nIGB0aGlzLl9kZXN0aW5hdGlvbmAsIG1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyB3YWl0IGZvclxuICAgICAgLy8gdGhlIG5leHQgJ3VwZGF0ZXZpZXdhcmVhJyBldmVudCBiZWZvcmUgKHBvdGVudGlhbGx5KSBhdHRlbXB0aW5nIHRvXG4gICAgICAvLyBwdXNoIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBicm93c2VyIGhpc3RvcnkuXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KTtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIGlmIChyZW1vdmVUZW1wb3JhcnkgJiYgZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24udGVtcG9yYXJ5KSB7XG4gICAgICAvLyBXaGVuIHRoZSBgZGVzdGluYXRpb25gIGNvbWVzIGZyb20gdGhlIGJyb3dzZXIgaGlzdG9yeSxcbiAgICAgIC8vIHdlIG5vIGxvbmdlciB0cmVhdCBpdCBhcyBhICp0ZW1wb3JhcnkqIHBvc2l0aW9uLlxuICAgICAgZGVsZXRlIGRlc3RpbmF0aW9uLnRlbXBvcmFyeTtcbiAgICB9XG4gICAgdGhpcy5fZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB0aGlzLl91aWQgPSB1aWQ7XG4gICAgLy8gVGhpcyBzaG91bGQgYWx3YXlzIGJlIHJlc2V0IHdoZW4gYHRoaXMuX2Rlc3RpbmF0aW9uYCBpcyB1cGRhdGVkLlxuICAgIHRoaXMuX251bVBvc2l0aW9uVXBkYXRlcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYXJzZUN1cnJlbnRIYXNoKGNoZWNrTmFtZWRkZXN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCBoYXNoID0gdW5lc2NhcGUoZ2V0Q3VycmVudEhhc2goKSkuc3Vic3RyaW5nKDEpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHBhcnNlUXVlcnlTdHJpbmcoaGFzaCk7XG5cbiAgICBjb25zdCBuYW1lZGRlc3QgPSBwYXJhbXMubmFtZWRkZXN0IHx8IFwiXCI7XG4gICAgbGV0IHBhZ2UgPSBwYXJhbXMucGFnZSB8IDA7XG5cbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UpICYmXG4gICAgICAgIHBhZ2UgPiAwICYmXG4gICAgICAgIHBhZ2UgPD0gdGhpcy5saW5rU2VydmljZS5wYWdlc0NvdW50XG4gICAgICApIHx8XG4gICAgICAoY2hlY2tOYW1lZGRlc3QgJiYgbmFtZWRkZXN0Lmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICBwYWdlID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgaGFzaCwgcGFnZSwgcm90YXRpb246IHRoaXMubGlua1NlcnZpY2Uucm90YXRpb24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZVZpZXdhcmVhKHsgbG9jYXRpb24gfSkge1xuICAgIGlmICh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpO1xuICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9wb3NpdGlvbiA9IHtcbiAgICAgIGhhc2g6IHRoaXMuX2lzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlXG4gICAgICAgID8gYHBhZ2U9JHtsb2NhdGlvbi5wYWdlTnVtYmVyfWBcbiAgICAgICAgOiBsb2NhdGlvbi5wZGZPcGVuUGFyYW1zLnN1YnN0cmluZygxKSxcbiAgICAgIHBhZ2U6IHRoaXMubGlua1NlcnZpY2UucGFnZSxcbiAgICAgIGZpcnN0OiBsb2NhdGlvbi5wYWdlTnVtYmVyLFxuICAgICAgcm90YXRpb246IGxvY2F0aW9uLnJvdGF0aW9uLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPiAwICYmXG4gICAgICB0aGlzLl9pc1BhZ2VzTG9hZGVkICYmXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbiAmJlxuICAgICAgIXRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2VcbiAgICApIHtcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IGRlc3RpbmF0aW9uIHdhcyBzZXQgdGhyb3VnaCB0aGUgdXNlciBjaGFuZ2luZyB0aGUgaGFzaFxuICAgICAgLy8gb2YgdGhlIGRvY3VtZW50LCB3ZSB3aWxsIHVzdWFsbHkgbm90IHRyeSB0byBwdXNoIHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICAvLyB0byB0aGUgYnJvd3NlciBoaXN0b3J5OyBzZWUgYHRoaXMuX3RyeVB1c2hDdXJyZW50UG9zaXRpb24oKWAuXG4gICAgICAvL1xuICAgICAgLy8gVG8gcHJldmVudCBgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpYCBmcm9tIGVmZmVjdGl2ZWx5IGJlaW5nXG4gICAgICAvLyByZWR1Y2VkIHRvIGEgbm8tb3AgaW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBwb3NpdGlvblxuICAgICAgLy8gKmRpZCogaW4gZmFjdCBjaGFuZ2UgaWYgdGhlICd1cGRhdGV2aWV3YXJlYScgZXZlbnQgd2FzIGRpc3BhdGNoZWRcbiAgICAgIC8vIG1vcmUgdGhhbiBgUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTERgIHRpbWVzLlxuICAgICAgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzKys7XG4gICAgfVxuXG4gICAgaWYgKFVQREFURV9WSUVXQVJFQV9USU1FT1VUID4gMCkge1xuICAgICAgLy8gV2hlbiBjbG9zaW5nIHRoZSBicm93c2VyLCBhICdwYWdlaGlkZScgZXZlbnQgd2lsbCBiZSBkaXNwYXRjaGVkIHdoaWNoXG4gICAgICAvLyAqc2hvdWxkKiBhbGxvdyB1cyB0byBwdXNoIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBicm93c2VyIGhpc3RvcnkuXG4gICAgICAvLyBJbiBwcmFjdGljZSwgaXQgc2VlbXMgdGhhdCB0aGUgZXZlbnQgaXMgYXJyaXZpbmcgdG9vIGxhdGUgaW4gb3JkZXIgZm9yXG4gICAgICAvLyB0aGUgc2Vzc2lvbiBoaXN0b3J5IHRvIGJlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgLy8gKEZvciBhZGRpdGlvbmFsIGRldGFpbHMsIHBsZWFzZSByZWZlciB0byB0aGUgZGlzY3Vzc2lvbiBpblxuICAgICAgLy8gIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTExNTMzOTMuKVxuICAgICAgLy9cbiAgICAgIC8vIFRvIHdvcmthcm91bmQgdGhpcyB3ZSBhdHRlbXB0IHRvICp0ZW1wb3JhcmlseSogYWRkIHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICAvLyB0byB0aGUgYnJvd3NlciBoaXN0b3J5IG9ubHkgd2hlbiB0aGUgdmlld2VyIGlzICppZGxlKixcbiAgICAgIC8vIGkuZS4gd2hlbiBzY3JvbGxpbmcgYW5kL29yIHpvb21pbmcgZG9lcyBub3Qgb2NjdXIuXG4gICAgICAvL1xuICAgICAgLy8gUExFQVNFIE5PVEU6IEl0J3MgYWJzb2x1dGVseSBpbXBlcmF0aXZlIHRoYXQgdGhlIGJyb3dzZXIgaGlzdG9yeSBpc1xuICAgICAgLy8gKm5vdCogdXBkYXRlZCB0b28gb2Z0ZW4sIHNpbmNlIHRoYXQgd291bGQgcmVuZGVyIHRoZSB2aWV3ZXIgbW9yZSBvclxuICAgICAgLy8gbGVzcyB1bnVzYWJsZS4gSGVuY2UgdGhlIHVzZSBvZiBhIHRpbWVvdXQgdG8gZGVsYXkgdGhlIHVwZGF0ZSB1bnRpbFxuICAgICAgLy8gdGhlIHZpZXdlciBoYXMgYmVlbiBpZGxlIGZvciBgVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVRgIG1pbGxpc2Vjb25kcy5cbiAgICAgIHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHRoaXMuX3RyeVB1c2hDdXJyZW50UG9zaXRpb24oLyogdGVtcG9yYXJ5ID0gKi8gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH0sIFVQREFURV9WSUVXQVJFQV9USU1FT1VUKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wb3BTdGF0ZSh7IHN0YXRlIH0pIHtcbiAgICBjb25zdCBuZXdIYXNoID0gZ2V0Q3VycmVudEhhc2goKSxcbiAgICAgIGhhc2hDaGFuZ2VkID0gdGhpcy5fY3VycmVudEhhc2ggIT09IG5ld0hhc2g7XG4gICAgdGhpcy5fY3VycmVudEhhc2ggPSBuZXdIYXNoO1xuXG4gICAgaWYgKFxuICAgICAgKHR5cGVvZiBQREZKU0RldiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiQ0hST01FXCIpICYmXG4gICAgICAgIHN0YXRlICYmXG4gICAgICAgIHN0YXRlLmNocm9tZWNvbVN0YXRlICYmXG4gICAgICAgICF0aGlzLl9pc1ZhbGlkU3RhdGUoc3RhdGUpKSB8fFxuICAgICAgIXN0YXRlXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIGNhc2UgY29ycmVzcG9uZHMgdG8gdGhlIHVzZXIgY2hhbmdpbmcgdGhlIGhhc2ggb2YgdGhlIGRvY3VtZW50LlxuICAgICAgdGhpcy5fdWlkKys7XG5cbiAgICAgIGNvbnN0IHsgaGFzaCwgcGFnZSwgcm90YXRpb24gfSA9IHRoaXMuX3BhcnNlQ3VycmVudEhhc2goKTtcbiAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShcbiAgICAgICAgeyBoYXNoLCBwYWdlLCByb3RhdGlvbiB9LFxuICAgICAgICAvKiBmb3JjZVJlcGxhY2UgPSAqLyB0cnVlXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSkpIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgb2NjdXIgaW4gdmlld2VycyB3aXRoIHN1cHBvcnQgZm9yIG9wZW5pbmcgbW9yZSB0aGFuXG4gICAgICAvLyBvbmUgUERGIGRvY3VtZW50LCBlLmcuIHRoZSBHRU5FUklDIHZpZXdlci5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IHRoZSBicm93c2VyIGhpc3RvcnkgZnJvbSB1cGRhdGluZyB1bnRpbCB0aGUgbmV3IGRlc3RpbmF0aW9uLFxuICAgIC8vIGFzIHN0b3JlZCBpbiB0aGUgYnJvd3NlciBoaXN0b3J5LCBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIGlmIChoYXNoQ2hhbmdlZCkge1xuICAgICAgLy8gV2hlbiB0aGUgaGFzaCBjaGFuZ2VkLCBpbXBseWluZyB0aGF0IHRoZSAncG9wc3RhdGUnIGV2ZW50IHdpbGwgYmVcbiAgICAgIC8vIGZvbGxvd2VkIGJ5IGEgJ2hhc2hjaGFuZ2UnIGV2ZW50LCB0aGVuIHdlIGRvICpub3QqIHdhbnQgdG8gdXBkYXRlIHRoZVxuICAgICAgLy8gYnJvd3NlciBoaXN0b3J5IHdoZW4gaGFuZGxpbmcgdGhlICdoYXNoY2hhbmdlJyBldmVudCAoaW4gd2ViL2FwcC5qcylcbiAgICAgIC8vIHNpbmNlIHRoYXQgd291bGQgKm92ZXJ3cml0ZSogdGhlIG5ldyBkZXN0aW5hdGlvbiBuYXZpZ2F0ZWQgdG8gYmVsb3cuXG4gICAgICAvL1xuICAgICAgLy8gVG8gYXZvaWQgYWNjaWRlbnRhbGx5IGRpc2FibGluZyBhbGwgZnV0dXJlIHVzZXItaW5pdGlhdGVkIGhhc2ggY2hhbmdlcyxcbiAgICAgIC8vIGlmIHRoZXJlJ3MgZS5nLiBhbm90aGVyICdoYXNoY2hhbmdlJyBsaXN0ZW5lciB0aGF0IHN0b3BzIHRoZSBldmVudFxuICAgICAgLy8gcHJvcGFnYXRpb24sIHdlIG1ha2Ugc3VyZSB0byBhbHdheXMgZm9yY2UtcmVzZXQgYHRoaXMuX2Jsb2NrSGFzaENoYW5nZWBcbiAgICAgIC8vIGFmdGVyIGBIQVNIX0NIQU5HRV9USU1FT1VUYCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQuXG4gICAgICB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UrKztcbiAgICAgIHdhaXRPbkV2ZW50T3JUaW1lb3V0KHtcbiAgICAgICAgdGFyZ2V0OiB3aW5kb3csXG4gICAgICAgIG5hbWU6IFwiaGFzaGNoYW5nZVwiLFxuICAgICAgICBkZWxheTogSEFTSF9DSEFOR0VfVElNRU9VVCxcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UtLTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBuZXcgZGVzdGluYXRpb24uXG4gICAgY29uc3QgZGVzdGluYXRpb24gPSBzdGF0ZS5kZXN0aW5hdGlvbjtcbiAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFN0YXRlKFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICBzdGF0ZS51aWQsXG4gICAgICAvKiByZW1vdmVUZW1wb3JhcnkgPSAqLyB0cnVlXG4gICAgKTtcbiAgICBpZiAodGhpcy5fdWlkID4gdGhpcy5fbWF4VWlkKSB7XG4gICAgICB0aGlzLl9tYXhVaWQgPSB0aGlzLl91aWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWRSb3RhdGlvbihkZXN0aW5hdGlvbi5yb3RhdGlvbikpIHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2Uucm90YXRpb24gPSBkZXN0aW5hdGlvbi5yb3RhdGlvbjtcbiAgICB9XG4gICAgaWYgKGRlc3RpbmF0aW9uLmRlc3QpIHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2UubmF2aWdhdGVUbyhkZXN0aW5hdGlvbi5kZXN0KTtcbiAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmhhc2gpIHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2Uuc2V0SGFzaChkZXN0aW5hdGlvbi5oYXNoKTtcbiAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLnBhZ2UpIHtcbiAgICAgIC8vIEZhbGxiYWNrIGNhc2U7IHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5LlxuICAgICAgdGhpcy5saW5rU2VydmljZS5wYWdlID0gZGVzdGluYXRpb24ucGFnZTtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSBgUERGTGlua1NlcnZpY2UubmF2aWdhdGVUb2AgaXMgYXN5bmNocm9ub3VzLCB3ZSB0aHVzIGRlZmVyIHRoZVxuICAgIC8vIHJlc2V0dGluZyBvZiBgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzYCBzbGlnaHRseS5cbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcGFnZUhpZGUoKSB7XG4gICAgLy8gQXR0ZW1wdCB0byBwdXNoIHRoZSBgdGhpcy5fcG9zaXRpb25gIGludG8gdGhlIGJyb3dzZXIgaGlzdG9yeSB3aGVuXG4gICAgLy8gbmF2aWdhdGluZyBhd2F5IGZyb20gdGhlIGRvY3VtZW50LiBUaGlzIGlzICpvbmx5KiBkb25lIGlmIHRoZSBoaXN0b3J5XG4gICAgLy8gaXMgZW1wdHkvdGVtcG9yYXJ5LCBzaW5jZSBvdGhlcndpc2UgYW4gZXhpc3RpbmcgYnJvd3NlciBoaXN0b3J5IGVudHJ5XG4gICAgLy8gd2lsbCBlbmQgdXAgYmVpbmcgb3ZlcndyaXR0ZW4gKGdpdmVuIHRoYXQgbmV3IGVudHJpZXMgY2Fubm90IGJlIHB1c2hlZFxuICAgIC8vIGludG8gdGhlIGJyb3dzZXIgaGlzdG9yeSB3aGVuIHRoZSAndW5sb2FkJyBldmVudCBoYXMgYWxyZWFkeSBmaXJlZCkuXG4gICAgaWYgKCF0aGlzLl9kZXN0aW5hdGlvbiB8fCB0aGlzLl9kZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHtcbiAgICAgIHRoaXMuX3RyeVB1c2hDdXJyZW50UG9zaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9ib3VuZEV2ZW50cykge1xuICAgICAgcmV0dXJuOyAvLyBUaGUgZXZlbnQgbGlzdGVuZXJzIHdlcmUgYWxyZWFkeSBhZGRlZC5cbiAgICB9XG4gICAgdGhpcy5fYm91bmRFdmVudHMgPSB7XG4gICAgICB1cGRhdGVWaWV3YXJlYTogdGhpcy5fdXBkYXRlVmlld2FyZWEuYmluZCh0aGlzKSxcbiAgICAgIHBvcFN0YXRlOiB0aGlzLl9wb3BTdGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgcGFnZUhpZGU6IHRoaXMuX3BhZ2VIaWRlLmJpbmQodGhpcyksXG4gICAgfTtcblxuICAgIHRoaXMuZXZlbnRCdXMuX29uKFwidXBkYXRldmlld2FyZWFcIiwgdGhpcy5fYm91bmRFdmVudHMudXBkYXRlVmlld2FyZWEpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fYm91bmRFdmVudHMucG9wU3RhdGUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgdGhpcy5fYm91bmRFdmVudHMucGFnZUhpZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdW5iaW5kRXZlbnRzKCkge1xuICAgIGlmICghdGhpcy5fYm91bmRFdmVudHMpIHtcbiAgICAgIHJldHVybjsgLy8gVGhlIGV2ZW50IGxpc3RlbmVycyB3ZXJlIGFscmVhZHkgcmVtb3ZlZC5cbiAgICB9XG4gICAgdGhpcy5ldmVudEJ1cy5fb2ZmKFwidXBkYXRldmlld2FyZWFcIiwgdGhpcy5fYm91bmRFdmVudHMudXBkYXRlVmlld2FyZWEpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fYm91bmRFdmVudHMucG9wU3RhdGUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgdGhpcy5fYm91bmRFdmVudHMucGFnZUhpZGUpO1xuXG4gICAgdGhpcy5fYm91bmRFdmVudHMgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzRGVzdEhhc2hlc0VxdWFsKGRlc3RIYXNoLCBwdXNoSGFzaCkge1xuICBpZiAodHlwZW9mIGRlc3RIYXNoICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBwdXNoSGFzaCAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGVzdEhhc2ggPT09IHB1c2hIYXNoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgeyBuYW1lZGRlc3QgfSA9IHBhcnNlUXVlcnlTdHJpbmcoZGVzdEhhc2gpO1xuICBpZiAobmFtZWRkZXN0ID09PSBwdXNoSGFzaCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNEZXN0QXJyYXlzRXF1YWwoZmlyc3REZXN0LCBzZWNvbmREZXN0KSB7XG4gIGZ1bmN0aW9uIGlzRW50cnlFcXVhbChmaXJzdCwgc2Vjb25kKSB7XG4gICAgaWYgKHR5cGVvZiBmaXJzdCAhPT0gdHlwZW9mIHNlY29uZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaXJzdCkgfHwgQXJyYXkuaXNBcnJheShzZWNvbmQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaXJzdCAhPT0gbnVsbCAmJiB0eXBlb2YgZmlyc3QgPT09IFwib2JqZWN0XCIgJiYgc2Vjb25kICE9PSBudWxsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoZmlyc3QpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoc2Vjb25kKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmlyc3QpIHtcbiAgICAgICAgaWYgKCFpc0VudHJ5RXF1YWwoZmlyc3Rba2V5XSwgc2Vjb25kW2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpcnN0ID09PSBzZWNvbmQgfHwgKE51bWJlci5pc05hTihmaXJzdCkgJiYgTnVtYmVyLmlzTmFOKHNlY29uZCkpO1xuICB9XG5cbiAgaWYgKCEoQXJyYXkuaXNBcnJheShmaXJzdERlc3QpICYmIEFycmF5LmlzQXJyYXkoc2Vjb25kRGVzdCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChmaXJzdERlc3QubGVuZ3RoICE9PSBzZWNvbmREZXN0Lmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMCwgaWkgPSBmaXJzdERlc3QubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgIGlmICghaXNFbnRyeUVxdWFsKGZpcnN0RGVzdFtpXSwgc2Vjb25kRGVzdFtpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB7IFBERkhpc3RvcnksIGlzRGVzdEhhc2hlc0VxdWFsLCBpc0Rlc3RBcnJheXNFcXVhbCB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIGFwcHJveGltYXRlRnJhY3Rpb24sXG4gIENTU19VTklUUyxcbiAgREVGQVVMVF9TQ0FMRSxcbiAgZ2V0T3V0cHV0U2NhbGUsXG4gIE51bGxMMTBuLFxuICBSZW5kZXJlclR5cGUsXG4gIHJvdW5kVG9EaXZpZGUsXG4gIFRleHRMYXllck1vZGUsXG59IGZyb20gXCIuL3VpX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSxcbiAgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLFxuICBTVkdHcmFwaGljcyxcbn0gZnJvbSBcInBkZmpzLWxpYlwiO1xuaW1wb3J0IHsgUmVuZGVyaW5nU3RhdGVzIH0gZnJvbSBcIi4vcGRmX3JlbmRlcmluZ19xdWV1ZS5qc1wiO1xuaW1wb3J0IHsgdmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcyB9IGZyb20gXCIuL3ZpZXdlcl9jb21wYXRpYmlsaXR5LmpzXCI7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGUGFnZVZpZXdPcHRpb25zXG4gKiBAcHJvcGVydHkge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXIgLSBUaGUgdmlld2VyIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge0V2ZW50QnVzfSBldmVudEJ1cyAtIFRoZSBhcHBsaWNhdGlvbiBldmVudCBidXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWQgLSBUaGUgcGFnZSB1bmlxdWUgSUQgKG5vcm1hbGx5IGl0cyBudW1iZXIpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNjYWxlIC0gVGhlIHBhZ2Ugc2NhbGUgZGlzcGxheS5cbiAqIEBwcm9wZXJ0eSB7UGFnZVZpZXdwb3J0fSBkZWZhdWx0Vmlld3BvcnQgLSBUaGUgcGFnZSB2aWV3cG9ydC5cbiAqIEBwcm9wZXJ0eSB7QW5ub3RhdGlvblN0b3JhZ2V9IFthbm5vdGF0aW9uU3RvcmFnZV0gLSBTdG9yYWdlIGZvciBhbm5vdGF0aW9uXG4gKiAgIGRhdGEgaW4gZm9ybXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC5cbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxPcHRpb25hbENvbnRlbnRDb25maWc+fSBbb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZV0gLVxuICogICBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIHtAbGluayBPcHRpb25hbENvbnRlbnRDb25maWd9IGluc3RhbmNlLlxuICogICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgbnVsbGAuXG4gKiBAcHJvcGVydHkge1BERlJlbmRlcmluZ1F1ZXVlfSByZW5kZXJpbmdRdWV1ZSAtIFRoZSByZW5kZXJpbmcgcXVldWUgb2JqZWN0LlxuICogQHByb3BlcnR5IHtJUERGVGV4dExheWVyRmFjdG9yeX0gdGV4dExheWVyRmFjdG9yeVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0ZXh0TGF5ZXJNb2RlXSAtIENvbnRyb2xzIGlmIHRoZSB0ZXh0IGxheWVyIHVzZWQgZm9yXG4gKiAgIHNlbGVjdGlvbiBhbmQgc2VhcmNoaW5nIGlzIGNyZWF0ZWQsIGFuZCBpZiB0aGUgaW1wcm92ZWQgdGV4dCBzZWxlY3Rpb25cbiAqICAgYmVoYXZpb3VyIGlzIGVuYWJsZWQuIFRoZSBjb25zdGFudHMgZnJvbSB7VGV4dExheWVyTW9kZX0gc2hvdWxkIGJlIHVzZWQuXG4gKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBUZXh0TGF5ZXJNb2RlLkVOQUJMRWAuXG4gKiBAcHJvcGVydHkge0lQREZBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5fSBhbm5vdGF0aW9uTGF5ZXJGYWN0b3J5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ltYWdlUmVzb3VyY2VzUGF0aF0gLSBQYXRoIGZvciBpbWFnZSByZXNvdXJjZXMsIG1haW5seVxuICogICBmb3IgYW5ub3RhdGlvbiBpY29ucy4gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVuZGVySW50ZXJhY3RpdmVGb3JtcyAtIFR1cm5zIG9uIHJlbmRlcmluZyBvZlxuICogICBpbnRlcmFjdGl2ZSBmb3JtIGVsZW1lbnRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVuZGVyZXIgLSAnY2FudmFzJyBvciAnc3ZnJy4gVGhlIGRlZmF1bHQgaXMgJ2NhbnZhcycuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVXZWJHTF0gLSBFbmFibGVzIFdlYkdMIGFjY2VsZXJhdGVkIHJlbmRlcmluZyBmb3JcbiAqICAgc29tZSBvcGVyYXRpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlT25seUNzc1pvb21dIC0gRW5hYmxlcyBDU1Mgb25seSB6b29taW5nLiBUaGUgZGVmYXVsdFxuICogICB2YWx1ZSBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDYW52YXNQaXhlbHNdIC0gVGhlIG1heGltdW0gc3VwcG9ydGVkIGNhbnZhcyBzaXplIGluXG4gKiAgIHRvdGFsIHBpeGVscywgaS5lLiB3aWR0aCAqIGhlaWdodC4gVXNlIC0xIGZvciBubyBsaW1pdC4gVGhlIGRlZmF1bHQgdmFsdWVcbiAqICAgaXMgNDA5NiAqIDQwOTYgKDE2IG1lZ2EtcGl4ZWxzKS5cbiAqIEBwcm9wZXJ0eSB7SUwxMG59IGwxMG4gLSBMb2NhbGl6YXRpb24gc2VydmljZS5cbiAqL1xuXG5jb25zdCBNQVhfQ0FOVkFTX1BJWEVMUyA9IHZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMubWF4Q2FudmFzUGl4ZWxzIHx8IDE2Nzc3MjE2O1xuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtJUmVuZGVyYWJsZVZpZXd9XG4gKi9cbmNsYXNzIFBERlBhZ2VWaWV3IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UERGUGFnZVZpZXdPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0gb3B0aW9ucy5kZWZhdWx0Vmlld3BvcnQ7XG5cbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICB0aGlzLnJlbmRlcmluZ0lkID0gXCJwYWdlXCIgKyB0aGlzLmlkO1xuXG4gICAgdGhpcy5wZGZQYWdlID0gbnVsbDtcbiAgICB0aGlzLnBhZ2VMYWJlbCA9IG51bGw7XG4gICAgdGhpcy5yb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5zY2FsZSA9IG9wdGlvbnMuc2NhbGUgfHwgREVGQVVMVF9TQ0FMRTtcbiAgICB0aGlzLnZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0O1xuICAgIHRoaXMucGRmUGFnZVJvdGF0ZSA9IGRlZmF1bHRWaWV3cG9ydC5yb3RhdGlvbjtcbiAgICB0aGlzLl9hbm5vdGF0aW9uU3RvcmFnZSA9IG9wdGlvbnMuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbnVsbDtcbiAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID1cbiAgICAgIG9wdGlvbnMub3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSB8fCBudWxsO1xuICAgIHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRleHRMYXllck1vZGUgPSBOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMudGV4dExheWVyTW9kZSlcbiAgICAgID8gb3B0aW9ucy50ZXh0TGF5ZXJNb2RlXG4gICAgICA6IFRleHRMYXllck1vZGUuRU5BQkxFO1xuICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gb3B0aW9ucy5pbWFnZVJlc291cmNlc1BhdGggfHwgXCJcIjtcbiAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgPyBvcHRpb25zLnJlbmRlckludGVyYWN0aXZlRm9ybXNcbiAgICAgICAgOiB0cnVlO1xuICAgIHRoaXMudXNlT25seUNzc1pvb20gPSBvcHRpb25zLnVzZU9ubHlDc3Nab29tIHx8IGZhbHNlO1xuICAgIHRoaXMubWF4Q2FudmFzUGl4ZWxzID0gb3B0aW9ucy5tYXhDYW52YXNQaXhlbHMgfHwgTUFYX0NBTlZBU19QSVhFTFM7XG5cbiAgICB0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcbiAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gb3B0aW9ucy5yZW5kZXJpbmdRdWV1ZTtcbiAgICB0aGlzLnRleHRMYXllckZhY3RvcnkgPSBvcHRpb25zLnRleHRMYXllckZhY3Rvcnk7XG4gICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5ID0gb3B0aW9ucy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5O1xuICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zLnJlbmRlcmVyIHx8IFJlbmRlcmVyVHlwZS5DQU5WQVM7XG4gICAgdGhpcy5lbmFibGVXZWJHTCA9IG9wdGlvbnMuZW5hYmxlV2ViR0wgfHwgZmFsc2U7XG4gICAgdGhpcy5sMTBuID0gb3B0aW9ucy5sMTBuIHx8IE51bGxMMTBuO1xuXG4gICAgdGhpcy5wYWludFRhc2sgPSBudWxsO1xuICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw7XG4gICAgdGhpcy5yZXN1bWUgPSBudWxsO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMudGV4dExheWVyID0gbnVsbDtcbiAgICB0aGlzLnpvb21MYXllciA9IG51bGw7XG5cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdi5jbGFzc05hbWUgPSBcInBhZ2VcIjtcbiAgICBkaXYuc3R5bGUud2lkdGggPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQud2lkdGgpICsgXCJweFwiO1xuICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSArIFwicHhcIjtcbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1wYWdlLW51bWJlclwiLCB0aGlzLmlkKTtcbiAgICB0aGlzLmRpdiA9IGRpdjtcblxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpO1xuICB9XG5cbiAgc2V0UGRmUGFnZShwZGZQYWdlKSB7XG4gICAgdGhpcy5wZGZQYWdlID0gcGRmUGFnZTtcbiAgICB0aGlzLnBkZlBhZ2VSb3RhdGUgPSBwZGZQYWdlLnJvdGF0ZTtcblxuICAgIGNvbnN0IHRvdGFsUm90YXRpb24gPSAodGhpcy5yb3RhdGlvbiArIHRoaXMucGRmUGFnZVJvdGF0ZSkgJSAzNjA7XG4gICAgdGhpcy52aWV3cG9ydCA9IHBkZlBhZ2UuZ2V0Vmlld3BvcnQoe1xuICAgICAgc2NhbGU6IHRoaXMuc2NhbGUgKiBDU1NfVU5JVFMsXG4gICAgICByb3RhdGlvbjogdG90YWxSb3RhdGlvbixcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRzID0gcGRmUGFnZS5zdGF0cztcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBpZiAodGhpcy5wZGZQYWdlKSB7XG4gICAgICB0aGlzLnBkZlBhZ2UuY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXN5bmMgX3JlbmRlckFubm90YXRpb25MYXllcigpIHtcbiAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFubm90YXRpb25MYXllci5yZW5kZXIodGhpcy52aWV3cG9ydCwgXCJkaXNwbGF5XCIpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBlcnJvciA9IGV4O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwiYW5ub3RhdGlvbmxheWVycmVuZGVyZWRcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIHBhZ2VOdW1iZXI6IHRoaXMuaWQsXG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVzZXRab29tTGF5ZXIocmVtb3ZlRnJvbURPTSA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLnpvb21MYXllcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB6b29tTGF5ZXJDYW52YXMgPSB0aGlzLnpvb21MYXllci5maXJzdENoaWxkO1xuICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLmRlbGV0ZSh6b29tTGF5ZXJDYW52YXMpO1xuICAgIC8vIFplcm9pbmcgdGhlIHdpZHRoIGFuZCBoZWlnaHQgY2F1c2VzIEZpcmVmb3ggdG8gcmVsZWFzZSBncmFwaGljc1xuICAgIC8vIHJlc291cmNlcyBpbW1lZGlhdGVseSwgd2hpY2ggY2FuIGdyZWF0bHkgcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbi5cbiAgICB6b29tTGF5ZXJDYW52YXMud2lkdGggPSAwO1xuICAgIHpvb21MYXllckNhbnZhcy5oZWlnaHQgPSAwO1xuXG4gICAgaWYgKHJlbW92ZUZyb21ET00pIHtcbiAgICAgIC8vIE5vdGU6IGBDaGlsZE5vZGUucmVtb3ZlYCBkb2Vzbid0IHRocm93IGlmIHRoZSBwYXJlbnQgbm9kZSBpcyB1bmRlZmluZWQuXG4gICAgICB0aGlzLnpvb21MYXllci5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy56b29tTGF5ZXIgPSBudWxsO1xuICB9XG5cbiAgcmVzZXQoa2VlcFpvb21MYXllciA9IGZhbHNlLCBrZWVwQW5ub3RhdGlvbnMgPSBmYWxzZSkge1xuICAgIHRoaXMuY2FuY2VsUmVuZGVyaW5nKGtlZXBBbm5vdGF0aW9ucyk7XG4gICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IFJlbmRlcmluZ1N0YXRlcy5JTklUSUFMO1xuXG4gICAgY29uc3QgZGl2ID0gdGhpcy5kaXY7XG4gICAgZGl2LnN0eWxlLndpZHRoID0gTWF0aC5mbG9vcih0aGlzLnZpZXdwb3J0LndpZHRoKSArIFwicHhcIjtcbiAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gTWF0aC5mbG9vcih0aGlzLnZpZXdwb3J0LmhlaWdodCkgKyBcInB4XCI7XG5cbiAgICBjb25zdCBjaGlsZE5vZGVzID0gZGl2LmNoaWxkTm9kZXM7XG4gICAgY29uc3QgY3VycmVudFpvb21MYXllck5vZGUgPSAoa2VlcFpvb21MYXllciAmJiB0aGlzLnpvb21MYXllcikgfHwgbnVsbDtcbiAgICBjb25zdCBjdXJyZW50QW5ub3RhdGlvbk5vZGUgPVxuICAgICAgKGtlZXBBbm5vdGF0aW9ucyAmJiB0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYpIHx8XG4gICAgICBudWxsO1xuICAgIGZvciAobGV0IGkgPSBjaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBub2RlID0gY2hpbGROb2Rlc1tpXTtcbiAgICAgIGlmIChjdXJyZW50Wm9vbUxheWVyTm9kZSA9PT0gbm9kZSB8fCBjdXJyZW50QW5ub3RhdGlvbk5vZGUgPT09IG5vZGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaXYucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgfVxuICAgIGRpdi5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWxvYWRlZFwiKTtcblxuICAgIGlmIChjdXJyZW50QW5ub3RhdGlvbk5vZGUpIHtcbiAgICAgIC8vIEhpZGUgdGhlIGFubm90YXRpb24gbGF5ZXIgdW50aWwgYWxsIGVsZW1lbnRzIGFyZSByZXNpemVkXG4gICAgICAvLyBzbyB0aGV5IGFyZSBub3QgZGlzcGxheWVkIG9uIHRoZSBhbHJlYWR5IHJlc2l6ZWQgcGFnZS5cbiAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyLmhpZGUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICB0aGlzLmFubm90YXRpb25MYXllci5jYW5jZWwoKTtcbiAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIWN1cnJlbnRab29tTGF5ZXJOb2RlKSB7XG4gICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgdGhpcy5wYWludGVkVmlld3BvcnRNYXAuZGVsZXRlKHRoaXMuY2FudmFzKTtcbiAgICAgICAgLy8gWmVyb2luZyB0aGUgd2lkdGggYW5kIGhlaWdodCBjYXVzZXMgRmlyZWZveCB0byByZWxlYXNlIGdyYXBoaWNzXG4gICAgICAgIC8vIHJlc291cmNlcyBpbW1lZGlhdGVseSwgd2hpY2ggY2FuIGdyZWF0bHkgcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbi5cbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSAwO1xuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgICAgICBkZWxldGUgdGhpcy5jYW52YXM7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZXNldFpvb21MYXllcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdmcpIHtcbiAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLmRlbGV0ZSh0aGlzLnN2Zyk7XG4gICAgICBkZWxldGUgdGhpcy5zdmc7XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkaW5nSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5sb2FkaW5nSWNvbkRpdi5jbGFzc05hbWUgPSBcImxvYWRpbmdJY29uXCI7XG4gICAgZGl2LmFwcGVuZENoaWxkKHRoaXMubG9hZGluZ0ljb25EaXYpO1xuICB9XG5cbiAgdXBkYXRlKHNjYWxlLCByb3RhdGlvbiwgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGwpIHtcbiAgICB0aGlzLnNjYWxlID0gc2NhbGUgfHwgdGhpcy5zY2FsZTtcbiAgICAvLyBUaGUgcm90YXRpb24gbWF5IGJlIHplcm8uXG4gICAgaWYgKHR5cGVvZiByb3RhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uO1xuICAgIH1cbiAgICBpZiAob3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdGFsUm90YXRpb24gPSAodGhpcy5yb3RhdGlvbiArIHRoaXMucGRmUGFnZVJvdGF0ZSkgJSAzNjA7XG4gICAgdGhpcy52aWV3cG9ydCA9IHRoaXMudmlld3BvcnQuY2xvbmUoe1xuICAgICAgc2NhbGU6IHRoaXMuc2NhbGUgKiBDU1NfVU5JVFMsXG4gICAgICByb3RhdGlvbjogdG90YWxSb3RhdGlvbixcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnN2Zykge1xuICAgICAgdGhpcy5jc3NUcmFuc2Zvcm0odGhpcy5zdmcsIHRydWUpO1xuXG4gICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwicGFnZXJlbmRlcmVkXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkLFxuICAgICAgICBjc3NUcmFuc2Zvcm06IHRydWUsXG4gICAgICAgIHRpbWVzdGFtcDogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgaXNTY2FsaW5nUmVzdHJpY3RlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNhbnZhcyAmJiB0aGlzLm1heENhbnZhc1BpeGVscyA+IDApIHtcbiAgICAgIGNvbnN0IG91dHB1dFNjYWxlID0gdGhpcy5vdXRwdXRTY2FsZTtcbiAgICAgIGlmIChcbiAgICAgICAgKChNYXRoLmZsb29yKHRoaXMudmlld3BvcnQud2lkdGgpICogb3V0cHV0U2NhbGUuc3gpIHwgMCkgKlxuICAgICAgICAgICgoTWF0aC5mbG9vcih0aGlzLnZpZXdwb3J0LmhlaWdodCkgKiBvdXRwdXRTY2FsZS5zeSkgfCAwKSA+XG4gICAgICAgIHRoaXMubWF4Q2FudmFzUGl4ZWxzXG4gICAgICApIHtcbiAgICAgICAgaXNTY2FsaW5nUmVzdHJpY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudXNlT25seUNzc1pvb20gfHxcbiAgICAgICAgKHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgJiYgaXNTY2FsaW5nUmVzdHJpY3RlZClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLmNhbnZhcywgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VyZW5kZXJlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIHBhZ2VOdW1iZXI6IHRoaXMuaWQsXG4gICAgICAgICAgY3NzVHJhbnNmb3JtOiB0cnVlLFxuICAgICAgICAgIHRpbWVzdGFtcDogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuem9vbUxheWVyICYmICF0aGlzLmNhbnZhcy5oYXNBdHRyaWJ1dGUoXCJoaWRkZW5cIikpIHtcbiAgICAgICAgdGhpcy56b29tTGF5ZXIgPSB0aGlzLmNhbnZhcy5wYXJlbnROb2RlO1xuICAgICAgICB0aGlzLnpvb21MYXllci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuem9vbUxheWVyKSB7XG4gICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLnpvb21MYXllci5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgdGhpcy5yZXNldCgvKiBrZWVwWm9vbUxheWVyID0gKi8gdHJ1ZSwgLyoga2VlcEFubm90YXRpb25zID0gKi8gdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUExFQVNFIE5PVEU6IE1vc3QgbGlrZWx5IHlvdSB3YW50IHRvIHVzZSB0aGUgYHRoaXMucmVzZXQoKWAgbWV0aG9kLFxuICAgKiAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gY2FsbGluZyB0aGlzIG9uZSBkaXJlY3RseS5cbiAgICovXG4gIGNhbmNlbFJlbmRlcmluZyhrZWVwQW5ub3RhdGlvbnMgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnBhaW50VGFzaykge1xuICAgICAgdGhpcy5wYWludFRhc2suY2FuY2VsKCk7XG4gICAgICB0aGlzLnBhaW50VGFzayA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVzdW1lID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnRleHRMYXllcikge1xuICAgICAgdGhpcy50ZXh0TGF5ZXIuY2FuY2VsKCk7XG4gICAgICB0aGlzLnRleHRMYXllciA9IG51bGw7XG4gICAgfVxuICAgIGlmICgha2VlcEFubm90YXRpb25zICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICB0aGlzLmFubm90YXRpb25MYXllci5jYW5jZWwoKTtcbiAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjc3NUcmFuc2Zvcm0odGFyZ2V0LCByZWRyYXdBbm5vdGF0aW9ucyA9IGZhbHNlKSB7XG4gICAgLy8gU2NhbGUgdGFyZ2V0IChjYW52YXMgb3Igc3ZnKSwgaXRzIHdyYXBwZXIgYW5kIHBhZ2UgY29udGFpbmVyLlxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy52aWV3cG9ydC53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnZpZXdwb3J0LmhlaWdodDtcbiAgICBjb25zdCBkaXYgPSB0aGlzLmRpdjtcbiAgICB0YXJnZXQuc3R5bGUud2lkdGggPSB0YXJnZXQucGFyZW50Tm9kZS5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS53aWR0aCA9XG4gICAgICBNYXRoLmZsb29yKHdpZHRoKSArIFwicHhcIjtcbiAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gdGFyZ2V0LnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0ID0gZGl2LnN0eWxlLmhlaWdodCA9XG4gICAgICBNYXRoLmZsb29yKGhlaWdodCkgKyBcInB4XCI7XG4gICAgLy8gVGhlIGNhbnZhcyBtYXkgaGF2ZSBiZWVuIG9yaWdpbmFsbHkgcm90YXRlZDsgcm90YXRlIHJlbGF0aXZlIHRvIHRoYXQuXG4gICAgY29uc3QgcmVsYXRpdmVSb3RhdGlvbiA9XG4gICAgICB0aGlzLnZpZXdwb3J0LnJvdGF0aW9uIC0gdGhpcy5wYWludGVkVmlld3BvcnRNYXAuZ2V0KHRhcmdldCkucm90YXRpb247XG4gICAgY29uc3QgYWJzUm90YXRpb24gPSBNYXRoLmFicyhyZWxhdGl2ZVJvdGF0aW9uKTtcbiAgICBsZXQgc2NhbGVYID0gMSxcbiAgICAgIHNjYWxlWSA9IDE7XG4gICAgaWYgKGFic1JvdGF0aW9uID09PSA5MCB8fCBhYnNSb3RhdGlvbiA9PT0gMjcwKSB7XG4gICAgICAvLyBTY2FsZSB4IGFuZCB5IGJlY2F1c2Ugb2YgdGhlIHJvdGF0aW9uLlxuICAgICAgc2NhbGVYID0gaGVpZ2h0IC8gd2lkdGg7XG4gICAgICBzY2FsZVkgPSB3aWR0aCAvIGhlaWdodDtcbiAgICB9XG4gICAgY29uc3QgY3NzVHJhbnNmb3JtID1cbiAgICAgIFwicm90YXRlKFwiICtcbiAgICAgIHJlbGF0aXZlUm90YXRpb24gK1xuICAgICAgXCJkZWcpIFwiICtcbiAgICAgIFwic2NhbGUoXCIgK1xuICAgICAgc2NhbGVYICtcbiAgICAgIFwiLFwiICtcbiAgICAgIHNjYWxlWSArXG4gICAgICBcIilcIjtcbiAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gY3NzVHJhbnNmb3JtO1xuXG4gICAgaWYgKHRoaXMudGV4dExheWVyKSB7XG4gICAgICAvLyBSb3RhdGluZyB0aGUgdGV4dCBsYXllciBpcyBtb3JlIGNvbXBsaWNhdGVkIHNpbmNlIHRoZSBkaXZzIGluc2lkZSB0aGVcbiAgICAgIC8vIHRoZSB0ZXh0IGxheWVyIGFyZSByb3RhdGVkLlxuICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBwcm9iYWJseSBiZSBzaW1wbGlmaWVkIGJ5IGRyYXdpbmcgdGhlIHRleHQgbGF5ZXIgaW5cbiAgICAgIC8vIG9uZSBvcmllbnRhdGlvbiBhbmQgdGhlbiByb3RhdGluZyBvdmVyYWxsLlxuICAgICAgY29uc3QgdGV4dExheWVyVmlld3BvcnQgPSB0aGlzLnRleHRMYXllci52aWV3cG9ydDtcbiAgICAgIGNvbnN0IHRleHRSZWxhdGl2ZVJvdGF0aW9uID1cbiAgICAgICAgdGhpcy52aWV3cG9ydC5yb3RhdGlvbiAtIHRleHRMYXllclZpZXdwb3J0LnJvdGF0aW9uO1xuICAgICAgY29uc3QgdGV4dEFic1JvdGF0aW9uID0gTWF0aC5hYnModGV4dFJlbGF0aXZlUm90YXRpb24pO1xuICAgICAgbGV0IHNjYWxlID0gd2lkdGggLyB0ZXh0TGF5ZXJWaWV3cG9ydC53aWR0aDtcbiAgICAgIGlmICh0ZXh0QWJzUm90YXRpb24gPT09IDkwIHx8IHRleHRBYnNSb3RhdGlvbiA9PT0gMjcwKSB7XG4gICAgICAgIHNjYWxlID0gd2lkdGggLyB0ZXh0TGF5ZXJWaWV3cG9ydC5oZWlnaHQ7XG4gICAgICB9XG4gICAgICBjb25zdCB0ZXh0TGF5ZXJEaXYgPSB0aGlzLnRleHRMYXllci50ZXh0TGF5ZXJEaXY7XG4gICAgICBsZXQgdHJhbnNYLCB0cmFuc1k7XG4gICAgICBzd2l0Y2ggKHRleHRBYnNSb3RhdGlvbikge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdHJhbnNYID0gdHJhbnNZID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICB0cmFuc1ggPSAwO1xuICAgICAgICAgIHRyYW5zWSA9IFwiLVwiICsgdGV4dExheWVyRGl2LnN0eWxlLmhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgdHJhbnNYID0gXCItXCIgKyB0ZXh0TGF5ZXJEaXYuc3R5bGUud2lkdGg7XG4gICAgICAgICAgdHJhbnNZID0gXCItXCIgKyB0ZXh0TGF5ZXJEaXYuc3R5bGUuaGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICB0cmFuc1ggPSBcIi1cIiArIHRleHRMYXllckRpdi5zdHlsZS53aWR0aDtcbiAgICAgICAgICB0cmFuc1kgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJCYWQgcm90YXRpb24gdmFsdWUuXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUudHJhbnNmb3JtID1cbiAgICAgICAgXCJyb3RhdGUoXCIgK1xuICAgICAgICB0ZXh0QWJzUm90YXRpb24gK1xuICAgICAgICBcImRlZykgXCIgK1xuICAgICAgICBcInNjYWxlKFwiICtcbiAgICAgICAgc2NhbGUgK1xuICAgICAgICBcIiwgXCIgK1xuICAgICAgICBzY2FsZSArXG4gICAgICAgIFwiKSBcIiArXG4gICAgICAgIFwidHJhbnNsYXRlKFwiICtcbiAgICAgICAgdHJhbnNYICtcbiAgICAgICAgXCIsIFwiICtcbiAgICAgICAgdHJhbnNZICtcbiAgICAgICAgXCIpXCI7XG4gICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gXCIwJSAwJVwiO1xuICAgIH1cblxuICAgIGlmIChyZWRyYXdBbm5vdGF0aW9ucyAmJiB0aGlzLmFubm90YXRpb25MYXllcikge1xuICAgICAgdGhpcy5fcmVuZGVyQW5ub3RhdGlvbkxheWVyKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0LndpZHRoO1xuICB9XG5cbiAgZ2V0IGhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydC5oZWlnaHQ7XG4gIH1cblxuICBnZXRQYWdlUG9pbnQoeCwgeSkge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0LmNvbnZlcnRUb1BkZlBvaW50KHgsIHkpO1xuICB9XG5cbiAgZHJhdygpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJpbmdTdGF0ZSAhPT0gUmVuZGVyaW5nU3RhdGVzLklOSVRJQUwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJNdXN0IGJlIGluIG5ldyBzdGF0ZSBiZWZvcmUgZHJhd2luZ1wiKTtcbiAgICAgIHRoaXMucmVzZXQoKTsgLy8gRW5zdXJlIHRoYXQgd2UgcmVzZXQgYWxsIHN0YXRlIHRvIHByZXZlbnQgaXNzdWVzLlxuICAgIH1cbiAgICBjb25zdCB7IGRpdiwgcGRmUGFnZSB9ID0gdGhpcztcblxuICAgIGlmICghcGRmUGFnZSkge1xuICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IFJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDtcblxuICAgICAgaWYgKHRoaXMubG9hZGluZ0ljb25EaXYpIHtcbiAgICAgICAgZGl2LnJlbW92ZUNoaWxkKHRoaXMubG9hZGluZ0ljb25EaXYpO1xuICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nSWNvbkRpdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJwZGZQYWdlIGlzIG5vdCBsb2FkZWRcIikpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBSZW5kZXJpbmdTdGF0ZXMuUlVOTklORztcblxuICAgIC8vIFdyYXAgdGhlIGNhbnZhcyBzbyB0aGF0IGlmIGl0IGhhcyBhIENTUyB0cmFuc2Zvcm0gZm9yIGhpZ2ggRFBJIHRoZVxuICAgIC8vIG92ZXJmbG93IHdpbGwgYmUgaGlkZGVuIGluIEZpcmVmb3guXG4gICAgY29uc3QgY2FudmFzV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY2FudmFzV3JhcHBlci5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS53aWR0aDtcbiAgICBjYW52YXNXcmFwcGVyLnN0eWxlLmhlaWdodCA9IGRpdi5zdHlsZS5oZWlnaHQ7XG4gICAgY2FudmFzV3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiY2FudmFzV3JhcHBlclwiKTtcblxuICAgIGlmICh0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYpIHtcbiAgICAgIC8vIFRoZSBhbm5vdGF0aW9uIGxheWVyIG5lZWRzIHRvIHN0YXkgb24gdG9wLlxuICAgICAgZGl2Lmluc2VydEJlZm9yZShjYW52YXNXcmFwcGVyLCB0aGlzLmFubm90YXRpb25MYXllci5kaXYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXYuYXBwZW5kQ2hpbGQoY2FudmFzV3JhcHBlcik7XG4gICAgfVxuXG4gICAgbGV0IHRleHRMYXllciA9IG51bGw7XG4gICAgaWYgKHRoaXMudGV4dExheWVyTW9kZSAhPT0gVGV4dExheWVyTW9kZS5ESVNBQkxFICYmIHRoaXMudGV4dExheWVyRmFjdG9yeSkge1xuICAgICAgY29uc3QgdGV4dExheWVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRleHRMYXllckRpdi5jbGFzc05hbWUgPSBcInRleHRMYXllclwiO1xuICAgICAgdGV4dExheWVyRGl2LnN0eWxlLndpZHRoID0gY2FudmFzV3JhcHBlci5zdHlsZS53aWR0aDtcbiAgICAgIHRleHRMYXllckRpdi5zdHlsZS5oZWlnaHQgPSBjYW52YXNXcmFwcGVyLnN0eWxlLmhlaWdodDtcbiAgICAgIGlmICh0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYpIHtcbiAgICAgICAgLy8gVGhlIGFubm90YXRpb24gbGF5ZXIgbmVlZHMgdG8gc3RheSBvbiB0b3AuXG4gICAgICAgIGRpdi5pbnNlcnRCZWZvcmUodGV4dExheWVyRGl2LCB0aGlzLmFubm90YXRpb25MYXllci5kaXYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRleHRMYXllckRpdik7XG4gICAgICB9XG5cbiAgICAgIHRleHRMYXllciA9IHRoaXMudGV4dExheWVyRmFjdG9yeS5jcmVhdGVUZXh0TGF5ZXJCdWlsZGVyKFxuICAgICAgICB0ZXh0TGF5ZXJEaXYsXG4gICAgICAgIHRoaXMuaWQgLSAxLFxuICAgICAgICB0aGlzLnZpZXdwb3J0LFxuICAgICAgICB0aGlzLnRleHRMYXllck1vZGUgPT09IFRleHRMYXllck1vZGUuRU5BQkxFX0VOSEFOQ0UsXG4gICAgICAgIHRoaXMuZXZlbnRCdXNcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudGV4dExheWVyID0gdGV4dExheWVyO1xuXG4gICAgbGV0IHJlbmRlckNvbnRpbnVlQ2FsbGJhY2sgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlbmRlcmluZ1F1ZXVlKSB7XG4gICAgICByZW5kZXJDb250aW51ZUNhbGxiYWNrID0gY29udCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJpbmdRdWV1ZS5pc0hpZ2hlc3RQcmlvcml0eSh0aGlzKSkge1xuICAgICAgICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBSZW5kZXJpbmdTdGF0ZXMuUEFVU0VEO1xuICAgICAgICAgIHRoaXMucmVzdW1lID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IFJlbmRlcmluZ1N0YXRlcy5SVU5OSU5HO1xuICAgICAgICAgICAgY29udCgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnQoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZmluaXNoUGFpbnRUYXNrID0gYXN5bmMgZXJyb3IgPT4ge1xuICAgICAgLy8gVGhlIHBhaW50VGFzayBtYXkgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IGEgbmV3IG9uZSwgc28gb25seSByZW1vdmVcbiAgICAgIC8vIHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhaW50VGFzayBpZiBpdCBtYXRjaGVzIHRoZSBvbmUgdGhhdCBpc1xuICAgICAgLy8gdHJpZ2dlcmluZyB0aGlzIGNhbGxiYWNrLlxuICAgICAgaWYgKHBhaW50VGFzayA9PT0gdGhpcy5wYWludFRhc2spIHtcbiAgICAgICAgdGhpcy5wYWludFRhc2sgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pIHtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IFJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDtcblxuICAgICAgaWYgKHRoaXMubG9hZGluZ0ljb25EaXYpIHtcbiAgICAgICAgZGl2LnJlbW92ZUNoaWxkKHRoaXMubG9hZGluZ0ljb25EaXYpO1xuICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nSWNvbkRpdjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jlc2V0Wm9vbUxheWVyKC8qIHJlbW92ZUZyb21ET00gPSAqLyB0cnVlKTtcblxuICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgdGhpcy5zdGF0cyA9IHBkZlBhZ2Uuc3RhdHM7XG5cbiAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJwYWdlcmVuZGVyZWRcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIHBhZ2VOdW1iZXI6IHRoaXMuaWQsXG4gICAgICAgIGNzc1RyYW5zZm9ybTogZmFsc2UsXG4gICAgICAgIHRpbWVzdGFtcDogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBwYWludFRhc2sgPVxuICAgICAgdGhpcy5yZW5kZXJlciA9PT0gUmVuZGVyZXJUeXBlLlNWR1xuICAgICAgICA/IHRoaXMucGFpbnRPblN2ZyhjYW52YXNXcmFwcGVyKVxuICAgICAgICA6IHRoaXMucGFpbnRPbkNhbnZhcyhjYW52YXNXcmFwcGVyKTtcbiAgICBwYWludFRhc2sub25SZW5kZXJDb250aW51ZSA9IHJlbmRlckNvbnRpbnVlQ2FsbGJhY2s7XG4gICAgdGhpcy5wYWludFRhc2sgPSBwYWludFRhc2s7XG5cbiAgICBjb25zdCByZXN1bHRQcm9taXNlID0gcGFpbnRUYXNrLnByb21pc2UudGhlbihcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZpbmlzaFBhaW50VGFzayhudWxsKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGV4dExheWVyKSB7XG4gICAgICAgICAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHBkZlBhZ2Uuc3RyZWFtVGV4dENvbnRlbnQoe1xuICAgICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0ZXh0TGF5ZXIuc2V0VGV4dENvbnRlbnRTdHJlYW0ocmVhZGFibGVTdHJlYW0pO1xuICAgICAgICAgICAgdGV4dExheWVyLnJlbmRlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gZmluaXNoUGFpbnRUYXNrKHJlYXNvbik7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmICh0aGlzLmFubm90YXRpb25MYXllckZhY3RvcnkpIHtcbiAgICAgIGlmICghdGhpcy5hbm5vdGF0aW9uTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSB0aGlzLmFubm90YXRpb25MYXllckZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlcihcbiAgICAgICAgICBkaXYsXG4gICAgICAgICAgcGRmUGFnZSxcbiAgICAgICAgICB0aGlzLl9hbm5vdGF0aW9uU3RvcmFnZSxcbiAgICAgICAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCxcbiAgICAgICAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMsXG4gICAgICAgICAgdGhpcy5sMTBuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKTtcbiAgICB9XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbG9hZGVkXCIsIHRydWUpO1xuXG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VyZW5kZXJcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0UHJvbWlzZTtcbiAgfVxuXG4gIHBhaW50T25DYW52YXMoY2FudmFzV3JhcHBlcikge1xuICAgIGNvbnN0IHJlbmRlckNhcGFiaWxpdHkgPSBjcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHByb21pc2U6IHJlbmRlckNhcGFiaWxpdHkucHJvbWlzZSxcbiAgICAgIG9uUmVuZGVyQ29udGludWUoY29udCkge1xuICAgICAgICBjb250KCk7XG4gICAgICB9LFxuICAgICAgY2FuY2VsKCkge1xuICAgICAgICByZW5kZXJUYXNrLmNhbmNlbCgpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0O1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgdGhpcy5sMTBuXG4gICAgICAuZ2V0KFwicGFnZV9jYW52YXNcIiwgeyBwYWdlOiB0aGlzLmlkIH0sIFwiUGFnZSB7e3BhZ2V9fVwiKVxuICAgICAgLnRoZW4obXNnID0+IHtcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gS2VlcCB0aGUgY2FudmFzIGhpZGRlbiB1bnRpbCB0aGUgZmlyc3QgZHJhdyBjYWxsYmFjaywgb3IgdW50aWwgZHJhd2luZ1xuICAgIC8vIGlzIGNvbXBsZXRlIHdoZW4gYCF0aGlzLnJlbmRlcmluZ1F1ZXVlYCwgdG8gcHJldmVudCBibGFjayBmbGlja2VyaW5nLlxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJoaWRkZW5cIik7XG4gICAgbGV0IGlzQ2FudmFzSGlkZGVuID0gdHJ1ZTtcbiAgICBjb25zdCBzaG93Q2FudmFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGlzQ2FudmFzSGlkZGVuKSB7XG4gICAgICAgIGNhbnZhcy5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgIGlzQ2FudmFzSGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNhbnZhc1dyYXBwZXIuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgUERGSlNEZXYudGVzdChcIk1PWkNFTlRSQUwgfHwgR0VORVJJQ1wiKVxuICAgICkge1xuICAgICAgY2FudmFzLm1vek9wYXF1ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiLCB7IGFscGhhOiBmYWxzZSB9KTtcbiAgICBjb25zdCBvdXRwdXRTY2FsZSA9IGdldE91dHB1dFNjYWxlKGN0eCk7XG4gICAgdGhpcy5vdXRwdXRTY2FsZSA9IG91dHB1dFNjYWxlO1xuXG4gICAgaWYgKHRoaXMudXNlT25seUNzc1pvb20pIHtcbiAgICAgIGNvbnN0IGFjdHVhbFNpemVWaWV3cG9ydCA9IHZpZXdwb3J0LmNsb25lKHsgc2NhbGU6IENTU19VTklUUyB9KTtcbiAgICAgIC8vIFVzZSBhIHNjYWxlIHRoYXQgbWFrZXMgdGhlIGNhbnZhcyBoYXZlIHRoZSBvcmlnaW5hbGx5IGludGVuZGVkIHNpemVcbiAgICAgIC8vIG9mIHRoZSBwYWdlLlxuICAgICAgb3V0cHV0U2NhbGUuc3ggKj0gYWN0dWFsU2l6ZVZpZXdwb3J0LndpZHRoIC8gdmlld3BvcnQud2lkdGg7XG4gICAgICBvdXRwdXRTY2FsZS5zeSAqPSBhY3R1YWxTaXplVmlld3BvcnQuaGVpZ2h0IC8gdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgb3V0cHV0U2NhbGUuc2NhbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhDYW52YXNQaXhlbHMgPiAwKSB7XG4gICAgICBjb25zdCBwaXhlbHNJblZpZXdwb3J0ID0gdmlld3BvcnQud2lkdGggKiB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICBjb25zdCBtYXhTY2FsZSA9IE1hdGguc3FydCh0aGlzLm1heENhbnZhc1BpeGVscyAvIHBpeGVsc0luVmlld3BvcnQpO1xuICAgICAgaWYgKG91dHB1dFNjYWxlLnN4ID4gbWF4U2NhbGUgfHwgb3V0cHV0U2NhbGUuc3kgPiBtYXhTY2FsZSkge1xuICAgICAgICBvdXRwdXRTY2FsZS5zeCA9IG1heFNjYWxlO1xuICAgICAgICBvdXRwdXRTY2FsZS5zeSA9IG1heFNjYWxlO1xuICAgICAgICBvdXRwdXRTY2FsZS5zY2FsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmhhc1Jlc3RyaWN0ZWRTY2FsaW5nID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFzUmVzdHJpY3RlZFNjYWxpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZnggPSBhcHByb3hpbWF0ZUZyYWN0aW9uKG91dHB1dFNjYWxlLnN4KTtcbiAgICBjb25zdCBzZnkgPSBhcHByb3hpbWF0ZUZyYWN0aW9uKG91dHB1dFNjYWxlLnN5KTtcbiAgICBjYW52YXMud2lkdGggPSByb3VuZFRvRGl2aWRlKHZpZXdwb3J0LndpZHRoICogb3V0cHV0U2NhbGUuc3gsIHNmeFswXSk7XG4gICAgY2FudmFzLmhlaWdodCA9IHJvdW5kVG9EaXZpZGUodmlld3BvcnQuaGVpZ2h0ICogb3V0cHV0U2NhbGUuc3ksIHNmeVswXSk7XG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gcm91bmRUb0RpdmlkZSh2aWV3cG9ydC53aWR0aCwgc2Z4WzFdKSArIFwicHhcIjtcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gcm91bmRUb0RpdmlkZSh2aWV3cG9ydC5oZWlnaHQsIHNmeVsxXSkgKyBcInB4XCI7XG4gICAgLy8gQWRkIHRoZSB2aWV3cG9ydCBzbyBpdCdzIGtub3duIHdoYXQgaXQgd2FzIG9yaWdpbmFsbHkgZHJhd24gd2l0aC5cbiAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcC5zZXQoY2FudmFzLCB2aWV3cG9ydCk7XG5cbiAgICAvLyBSZW5kZXJpbmcgYXJlYVxuICAgIGNvbnN0IHRyYW5zZm9ybSA9ICFvdXRwdXRTY2FsZS5zY2FsZWRcbiAgICAgID8gbnVsbFxuICAgICAgOiBbb3V0cHV0U2NhbGUuc3gsIDAsIDAsIG91dHB1dFNjYWxlLnN5LCAwLCAwXTtcbiAgICBjb25zdCByZW5kZXJDb250ZXh0ID0ge1xuICAgICAgY2FudmFzQ29udGV4dDogY3R4LFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgdmlld3BvcnQ6IHRoaXMudmlld3BvcnQsXG4gICAgICBlbmFibGVXZWJHTDogdGhpcy5lbmFibGVXZWJHTCxcbiAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U6IHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UsXG4gICAgfTtcbiAgICBjb25zdCByZW5kZXJUYXNrID0gdGhpcy5wZGZQYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KTtcbiAgICByZW5kZXJUYXNrLm9uQ29udGludWUgPSBmdW5jdGlvbiAoY29udCkge1xuICAgICAgc2hvd0NhbnZhcygpO1xuICAgICAgaWYgKHJlc3VsdC5vblJlbmRlckNvbnRpbnVlKSB7XG4gICAgICAgIHJlc3VsdC5vblJlbmRlckNvbnRpbnVlKGNvbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZW5kZXJUYXNrLnByb21pc2UudGhlbihcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2hvd0NhbnZhcygpO1xuICAgICAgICByZW5kZXJDYXBhYmlsaXR5LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgc2hvd0NhbnZhcygpO1xuICAgICAgICByZW5kZXJDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcGFpbnRPblN2Zyh3cmFwcGVyKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICBQREZKU0Rldi50ZXN0KFwiTU9aQ0VOVFJBTCB8fCBDSFJPTUVcIilcbiAgICApIHtcbiAgICAgIC8vIFJldHVybiBhIG1vY2sgb2JqZWN0LCB0byBwcmV2ZW50IGVycm9ycyBzdWNoIGFzIGUuZy5cbiAgICAgIC8vIFwiVHlwZUVycm9yOiBwYWludFRhc2sucHJvbWlzZSBpcyB1bmRlZmluZWRcIi5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlNWRyByZW5kZXJpbmcgaXMgbm90IHN1cHBvcnRlZC5cIikpLFxuICAgICAgICBvblJlbmRlckNvbnRpbnVlKGNvbnQpIHt9LFxuICAgICAgICBjYW5jZWwoKSB7fSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGVuc3VyZU5vdENhbmNlbGxlZCA9ICgpID0+IHtcbiAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbihcbiAgICAgICAgICBgUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSAke3RoaXMuaWR9YCxcbiAgICAgICAgICBcInN2Z1wiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHBkZlBhZ2UgPSB0aGlzLnBkZlBhZ2U7XG4gICAgY29uc3QgYWN0dWFsU2l6ZVZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydC5jbG9uZSh7IHNjYWxlOiBDU1NfVU5JVFMgfSk7XG4gICAgY29uc3QgcHJvbWlzZSA9IHBkZlBhZ2UuZ2V0T3BlcmF0b3JMaXN0KCkudGhlbihvcExpc3QgPT4ge1xuICAgICAgZW5zdXJlTm90Q2FuY2VsbGVkKCk7XG4gICAgICBjb25zdCBzdmdHZnggPSBuZXcgU1ZHR3JhcGhpY3MocGRmUGFnZS5jb21tb25PYmpzLCBwZGZQYWdlLm9ianMpO1xuICAgICAgcmV0dXJuIHN2Z0dmeC5nZXRTVkcob3BMaXN0LCBhY3R1YWxTaXplVmlld3BvcnQpLnRoZW4oc3ZnID0+IHtcbiAgICAgICAgZW5zdXJlTm90Q2FuY2VsbGVkKCk7XG4gICAgICAgIHRoaXMuc3ZnID0gc3ZnO1xuICAgICAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcC5zZXQoc3ZnLCBhY3R1YWxTaXplVmlld3BvcnQpO1xuXG4gICAgICAgIHN2Zy5zdHlsZS53aWR0aCA9IHdyYXBwZXIuc3R5bGUud2lkdGg7XG4gICAgICAgIHN2Zy5zdHlsZS5oZWlnaHQgPSB3cmFwcGVyLnN0eWxlLmhlaWdodDtcbiAgICAgICAgdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IFJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChzdmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvbWlzZSxcbiAgICAgIG9uUmVuZGVyQ29udGludWUoY29udCkge1xuICAgICAgICBjb250KCk7XG4gICAgICB9LFxuICAgICAgY2FuY2VsKCkge1xuICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhYmVsXG4gICAqL1xuICBzZXRQYWdlTGFiZWwobGFiZWwpIHtcbiAgICB0aGlzLnBhZ2VMYWJlbCA9IHR5cGVvZiBsYWJlbCA9PT0gXCJzdHJpbmdcIiA/IGxhYmVsIDogbnVsbDtcblxuICAgIGlmICh0aGlzLnBhZ2VMYWJlbCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1wYWdlLWxhYmVsXCIsIHRoaXMucGFnZUxhYmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1wYWdlLWxhYmVsXCIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQREZQYWdlVmlldyB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IENMRUFOVVBfVElNRU9VVCA9IDMwMDAwO1xuXG5jb25zdCBSZW5kZXJpbmdTdGF0ZXMgPSB7XG4gIElOSVRJQUw6IDAsXG4gIFJVTk5JTkc6IDEsXG4gIFBBVVNFRDogMixcbiAgRklOSVNIRUQ6IDMsXG59O1xuXG4vKipcbiAqIENvbnRyb2xzIHJlbmRlcmluZyBvZiB0aGUgdmlld3MgZm9yIHBhZ2VzIGFuZCB0aHVtYm5haWxzLlxuICovXG5jbGFzcyBQREZSZW5kZXJpbmdRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucGRmVmlld2VyID0gbnVsbDtcbiAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlciA9IG51bGw7XG4gICAgdGhpcy5vbklkbGUgPSBudWxsO1xuICAgIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9IG51bGw7XG4gICAgdGhpcy5pZGxlVGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5wcmludGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNUaHVtYm5haWxWaWV3RW5hYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UERGVmlld2VyfSBwZGZWaWV3ZXJcbiAgICovXG4gIHNldFZpZXdlcihwZGZWaWV3ZXIpIHtcbiAgICB0aGlzLnBkZlZpZXdlciA9IHBkZlZpZXdlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BERlRodW1ibmFpbFZpZXdlcn0gcGRmVGh1bWJuYWlsVmlld2VyXG4gICAqL1xuICBzZXRUaHVtYm5haWxWaWV3ZXIocGRmVGh1bWJuYWlsVmlld2VyKSB7XG4gICAgdGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIgPSBwZGZUaHVtYm5haWxWaWV3ZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtJUmVuZGVyYWJsZVZpZXd9IHZpZXdcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0hpZ2hlc3RQcmlvcml0eSh2aWV3KSB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9PT0gdmlldy5yZW5kZXJpbmdJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gY3VycmVudGx5VmlzaWJsZVBhZ2VzXG4gICAqL1xuICByZW5kZXJIaWdoZXN0UHJpb3JpdHkoY3VycmVudGx5VmlzaWJsZVBhZ2VzKSB7XG4gICAgaWYgKHRoaXMuaWRsZVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KTtcbiAgICAgIHRoaXMuaWRsZVRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFBhZ2VzIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aHVtYm5haWxzLCBzbyBjaGVjayB0aGVtIGZpcnN0LlxuICAgIGlmICh0aGlzLnBkZlZpZXdlci5mb3JjZVJlbmRlcmluZyhjdXJyZW50bHlWaXNpYmxlUGFnZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vIHBhZ2VzIG5lZWRlZCByZW5kZXJpbmcsIHNvIGNoZWNrIHRodW1ibmFpbHMuXG4gICAgaWYgKHRoaXMucGRmVGh1bWJuYWlsVmlld2VyICYmIHRoaXMuaXNUaHVtYm5haWxWaWV3RW5hYmxlZCkge1xuICAgICAgaWYgKHRoaXMucGRmVGh1bWJuYWlsVmlld2VyLmZvcmNlUmVuZGVyaW5nKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByaW50aW5nKSB7XG4gICAgICAvLyBJZiBwcmludGluZyBpcyBjdXJyZW50bHkgb25nb2luZyBkbyBub3QgcmVzY2hlZHVsZSBjbGVhbnVwLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9uSWRsZSkge1xuICAgICAgdGhpcy5pZGxlVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5vbklkbGUuYmluZCh0aGlzKSwgQ0xFQU5VUF9USU1FT1VUKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IHZpc2libGVcbiAgICogQHBhcmFtIHtBcnJheX0gdmlld3NcbiAgICogQHBhcmFtIHtib29sZWFufSBzY3JvbGxlZERvd25cbiAgICovXG4gIGdldEhpZ2hlc3RQcmlvcml0eSh2aXNpYmxlLCB2aWV3cywgc2Nyb2xsZWREb3duKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIGhhcyBjaGFuZ2VkLiBGaWd1cmUgb3V0IHdoaWNoIHBhZ2UgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRvXG4gICAgICogcmVuZGVyIG5leHQgKGlmIGFueSkuXG4gICAgICpcbiAgICAgKiBQcmlvcml0eTpcbiAgICAgKiAxLiB2aXNpYmxlIHBhZ2VzXG4gICAgICogMi4gaWYgbGFzdCBzY3JvbGxlZCBkb3duLCB0aGUgcGFnZSBhZnRlciB0aGUgdmlzaWJsZSBwYWdlcywgb3JcbiAgICAgKiAgICBpZiBsYXN0IHNjcm9sbGVkIHVwLCB0aGUgcGFnZSBiZWZvcmUgdGhlIHZpc2libGUgcGFnZXNcbiAgICAgKi9cbiAgICBjb25zdCB2aXNpYmxlVmlld3MgPSB2aXNpYmxlLnZpZXdzO1xuXG4gICAgY29uc3QgbnVtVmlzaWJsZSA9IHZpc2libGVWaWV3cy5sZW5ndGg7XG4gICAgaWYgKG51bVZpc2libGUgPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVZpc2libGU7ICsraSkge1xuICAgICAgY29uc3QgdmlldyA9IHZpc2libGVWaWV3c1tpXS52aWV3O1xuICAgICAgaWYgKCF0aGlzLmlzVmlld0ZpbmlzaGVkKHZpZXcpKSB7XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbCB0aGUgdmlzaWJsZSB2aWV3cyBoYXZlIHJlbmRlcmVkOyB0cnkgdG8gcmVuZGVyIG5leHQvcHJldmlvdXMgcGFnZXMuXG4gICAgaWYgKHNjcm9sbGVkRG93bikge1xuICAgICAgY29uc3QgbmV4dFBhZ2VJbmRleCA9IHZpc2libGUubGFzdC5pZDtcbiAgICAgIC8vIElEcyBzdGFydCBhdCAxLCBzbyBubyBuZWVkIHRvIGFkZCAxLlxuICAgICAgaWYgKHZpZXdzW25leHRQYWdlSW5kZXhdICYmICF0aGlzLmlzVmlld0ZpbmlzaGVkKHZpZXdzW25leHRQYWdlSW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gdmlld3NbbmV4dFBhZ2VJbmRleF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzUGFnZUluZGV4ID0gdmlzaWJsZS5maXJzdC5pZCAtIDI7XG4gICAgICBpZiAoXG4gICAgICAgIHZpZXdzW3ByZXZpb3VzUGFnZUluZGV4XSAmJlxuICAgICAgICAhdGhpcy5pc1ZpZXdGaW5pc2hlZCh2aWV3c1twcmV2aW91c1BhZ2VJbmRleF0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHZpZXdzW3ByZXZpb3VzUGFnZUluZGV4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRXZlcnl0aGluZyB0aGF0IG5lZWRzIHRvIGJlIHJlbmRlcmVkIGhhcyBiZWVuLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SVJlbmRlcmFibGVWaWV3fSB2aWV3XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNWaWV3RmluaXNoZWQodmlldykge1xuICAgIHJldHVybiB2aWV3LnJlbmRlcmluZ1N0YXRlID09PSBSZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGEgcGFnZSBvciB0aHVtYm5haWwgdmlldy4gVGhpcyBjYWxscyB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb25cbiAgICogYmFzZWQgb24gdGhlIHZpZXdzIHN0YXRlLiBJZiB0aGUgdmlldyBpcyBhbHJlYWR5IHJlbmRlcmVkIGl0IHdpbGwgcmV0dXJuXG4gICAqIGBmYWxzZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7SVJlbmRlcmFibGVWaWV3fSB2aWV3XG4gICAqL1xuICByZW5kZXJWaWV3KHZpZXcpIHtcbiAgICBzd2l0Y2ggKHZpZXcucmVuZGVyaW5nU3RhdGUpIHtcbiAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlIFJlbmRlcmluZ1N0YXRlcy5QQVVTRUQ6XG4gICAgICAgIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9IHZpZXcucmVuZGVyaW5nSWQ7XG4gICAgICAgIHZpZXcucmVzdW1lKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZW5kZXJpbmdTdGF0ZXMuUlVOTklORzpcbiAgICAgICAgdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID0gdmlldy5yZW5kZXJpbmdJZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlbmRlcmluZ1N0YXRlcy5JTklUSUFMOlxuICAgICAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSB2aWV3LnJlbmRlcmluZ0lkO1xuICAgICAgICB2aWV3XG4gICAgICAgICAgLmRyYXcoKVxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVySGlnaGVzdFByaW9yaXR5KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHJlbmRlclZpZXc6IFwiJHtyZWFzb259XCJgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCB7IFJlbmRlcmluZ1N0YXRlcywgUERGUmVuZGVyaW5nUXVldWUgfTtcbiIsIi8qIENvcHlyaWdodCAyMDE3IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBCYXNlVmlld2VyIH0gZnJvbSBcIi4vYmFzZV92aWV3ZXIuanNcIjtcbmltcG9ydCB7IHNoYWRvdyB9IGZyb20gXCJwZGZqcy1saWJcIjtcblxuY2xhc3MgUERGU2luZ2xlUGFnZVZpZXdlciBleHRlbmRzIEJhc2VWaWV3ZXIge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmV2ZW50QnVzLl9vbihcInBhZ2VzaW5pdFwiLCBldnQgPT4ge1xuICAgICAgLy8gU2luY2UgdGhlIHBhZ2VzIGFyZSBwbGFjZWQgaW4gYSBgRG9jdW1lbnRGcmFnbWVudGAsIG1ha2Ugc3VyZSB0aGF0XG4gICAgICAvLyB0aGUgY3VycmVudCBwYWdlIGJlY29tZXMgdmlzaWJsZSB1cG9uIGxvYWRpbmcgb2YgdGhlIGRvY3VtZW50LlxuICAgICAgdGhpcy5fZW5zdXJlUGFnZVZpZXdWaXNpYmxlKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgX3ZpZXdlckVsZW1lbnQoKSB7XG4gICAgLy8gU2luY2Ugd2Ugb25seSB3YW50IHRvIGRpc3BsYXkgKm9uZSogcGFnZSBhdCBhIHRpbWUgd2hlbiB1c2luZyB0aGVcbiAgICAvLyBgUERGU2luZ2xlUGFnZVZpZXdlcmAsIHdlIGNhbm5vdCBhcHBlbmQgdGhlbSB0byB0aGUgYHZpZXdlcmAgRE9NIGVsZW1lbnQuXG4gICAgLy8gSW5zdGVhZCwgdGhleSBhcmUgcGxhY2VkIGluIGEgYERvY3VtZW50RnJhZ21lbnRgLCBhbmQgb25seSB0aGUgY3VycmVudFxuICAgIC8vIHBhZ2UgaXMgZGlzcGxheWVkIGluIHRoZSB2aWV3ZXIgKHJlZmVyIHRvIGB0aGlzLl9lbnN1cmVQYWdlVmlld1Zpc2libGVgKS5cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX3ZpZXdlckVsZW1lbnRcIiwgdGhpcy5fc2hhZG93Vmlld2VyKTtcbiAgfVxuXG4gIF9yZXNldFZpZXcoKSB7XG4gICAgc3VwZXIuX3Jlc2V0VmlldygpO1xuICAgIHRoaXMuX3ByZXZpb3VzUGFnZU51bWJlciA9IDE7XG4gICAgdGhpcy5fc2hhZG93Vmlld2VyID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgIHRoaXMuX3VwZGF0ZVNjcm9sbERvd24gPSBudWxsO1xuICB9XG5cbiAgX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpIHtcbiAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07XG4gICAgY29uc3QgcHJldmlvdXNQYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX3ByZXZpb3VzUGFnZU51bWJlciAtIDFdO1xuXG4gICAgY29uc3Qgdmlld2VyTm9kZXMgPSB0aGlzLnZpZXdlci5jaGlsZE5vZGVzO1xuICAgIHN3aXRjaCAodmlld2VyTm9kZXMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IC8vIFNob3VsZCAqb25seSogb2NjdXIgb24gaW5pdGlhbCBsb2FkaW5nLlxuICAgICAgICB0aGlzLnZpZXdlci5hcHBlbmRDaGlsZChwYWdlVmlldy5kaXYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTogLy8gVGhlIG5vcm1hbCBwYWdlLXN3aXRjaGluZyBjYXNlLlxuICAgICAgICBpZiAodmlld2VyTm9kZXNbMF0gIT09IHByZXZpb3VzUGFnZVZpZXcuZGl2KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJfZW5zdXJlUGFnZVZpZXdWaXNpYmxlOiBVbmV4cGVjdGVkIHByZXZpb3VzbHkgdmlzaWJsZSBwYWdlLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZVZpZXcgPT09IHByZXZpb3VzUGFnZVZpZXcpIHtcbiAgICAgICAgICBicmVhazsgLy8gVGhlIGNvcnJlY3QgcGFnZSBpcyBhbHJlYWR5IHZpc2libGUuXG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dpdGNoIHZpc2libGUgcGFnZXMsIGFuZCByZXNldCB0aGUgdmlld2VyQ29udGFpbmVyIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgICAgdGhpcy5fc2hhZG93Vmlld2VyLmFwcGVuZENoaWxkKHByZXZpb3VzUGFnZVZpZXcuZGl2KTtcbiAgICAgICAgdGhpcy52aWV3ZXIuYXBwZW5kQ2hpbGQocGFnZVZpZXcuZGl2KTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIl9lbnN1cmVQYWdlVmlld1Zpc2libGU6IE9ubHkgb25lIHBhZ2Ugc2hvdWxkIGJlIHZpc2libGUgYXQgYSB0aW1lLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3ByZXZpb3VzUGFnZU51bWJlciA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyO1xuICB9XG5cbiAgX3Njcm9sbFVwZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5fdXBkYXRlU2Nyb2xsRG93bikge1xuICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsRG93bigpO1xuICAgIH1cbiAgICBzdXBlci5fc2Nyb2xsVXBkYXRlKCk7XG4gIH1cblxuICBfc2Nyb2xsSW50b1ZpZXcoeyBwYWdlRGl2LCBwYWdlU3BvdCA9IG51bGwsIHBhZ2VOdW1iZXIgPSBudWxsIH0pIHtcbiAgICBpZiAocGFnZU51bWJlcikge1xuICAgICAgLy8gRW5zdXJlIHRoYXQgYHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyYCBpcyBjb3JyZWN0LlxuICAgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlcik7XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbGVkRG93biA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID49IHRoaXMuX3ByZXZpb3VzUGFnZU51bWJlcjtcblxuICAgIHRoaXMuX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpO1xuICAgIC8vIEVuc3VyZSB0aGF0IHJlbmRlcmluZyBhbHdheXMgb2NjdXJzLCB0byBhdm9pZCBzaG93aW5nIGEgYmxhbmsgcGFnZSxcbiAgICAvLyBldmVuIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGRvZXNuJ3QgY2hhbmdlIHdoZW4gdGhlIHBhZ2UgaXMgc2Nyb2xsZWQuXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIHN1cGVyLl9zY3JvbGxJbnRvVmlldyh7IHBhZ2VEaXYsIHBhZ2VTcG90LCBwYWdlTnVtYmVyIH0pO1xuXG4gICAgLy8gU2luY2Ugc2Nyb2xsaW5nIGlzIHRyYWNrZWQgdXNpbmcgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAsIHVwZGF0ZSB0aGVcbiAgICAvLyBzY3JvbGwgZGlyZWN0aW9uIGR1cmluZyB0aGUgbmV4dCBgdGhpcy5fc2Nyb2xsVXBkYXRlYCBpbnZvY2F0aW9uLlxuICAgIHRoaXMuX3VwZGF0ZVNjcm9sbERvd24gPSAoKSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbC5kb3duID0gc2Nyb2xsZWREb3duO1xuICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsRG93biA9IG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIF9nZXRWaXNpYmxlUGFnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnRWaXNpYmxlUGFnZSgpO1xuICB9XG5cbiAgX3VwZGF0ZUhlbHBlcih2aXNpYmxlUGFnZXMpIHt9XG5cbiAgZ2V0IF9pc1Njcm9sbE1vZGVIb3Jpem9udGFsKCkge1xuICAgIC8vIFRoZSBTY3JvbGwvU3ByZWFkIG1vZGVzIGFyZSBuZXZlciB1c2VkIGluIGBQREZTaW5nbGVQYWdlVmlld2VyYC5cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2lzU2Nyb2xsTW9kZUhvcml6b250YWxcIiwgZmFsc2UpO1xuICB9XG5cbiAgX3VwZGF0ZVNjcm9sbE1vZGUoKSB7fVxuXG4gIF91cGRhdGVTcHJlYWRNb2RlKCkge31cbn1cblxuZXhwb3J0IHsgUERGU2luZ2xlUGFnZVZpZXdlciB9O1xuIiwiLyogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIENTU19VTklUUyxcbiAgREVGQVVMVF9TQ0FMRSxcbiAgREVGQVVMVF9TQ0FMRV9WQUxVRSxcbiAgZ2V0VmlzaWJsZUVsZW1lbnRzLFxuICBpc1BvcnRyYWl0T3JpZW50YXRpb24sXG4gIGlzVmFsaWRSb3RhdGlvbixcbiAgaXNWYWxpZFNjcm9sbE1vZGUsXG4gIGlzVmFsaWRTcHJlYWRNb2RlLFxuICBNQVhfQVVUT19TQ0FMRSxcbiAgbW92ZVRvRW5kT2ZBcnJheSxcbiAgTnVsbEwxMG4sXG4gIFByZXNlbnRhdGlvbk1vZGVTdGF0ZSxcbiAgUmVuZGVyZXJUeXBlLFxuICBTQ1JPTExCQVJfUEFERElORyxcbiAgc2Nyb2xsSW50b1ZpZXcsXG4gIFNjcm9sbE1vZGUsXG4gIFNwcmVhZE1vZGUsXG4gIFRleHRMYXllck1vZGUsXG4gIFVOS05PV05fU0NBTEUsXG4gIFZFUlRJQ0FMX1BBRERJTkcsXG4gIHdhdGNoU2Nyb2xsLFxufSBmcm9tIFwiLi91aV91dGlscy5qc1wiO1xuaW1wb3J0IHsgUERGUmVuZGVyaW5nUXVldWUsIFJlbmRlcmluZ1N0YXRlcyB9IGZyb20gXCIuL3BkZl9yZW5kZXJpbmdfcXVldWUuanNcIjtcbmltcG9ydCB7IEFubm90YXRpb25MYXllckJ1aWxkZXIgfSBmcm9tIFwiLi9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIuanNcIjtcbmltcG9ydCB7IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5IH0gZnJvbSBcInBkZmpzLWxpYlwiO1xuaW1wb3J0IHsgUERGUGFnZVZpZXcgfSBmcm9tIFwiLi9wZGZfcGFnZV92aWV3LmpzXCI7XG5pbXBvcnQgeyBTaW1wbGVMaW5rU2VydmljZSB9IGZyb20gXCIuL3BkZl9saW5rX3NlcnZpY2UuanNcIjtcbmltcG9ydCB7IFRleHRMYXllckJ1aWxkZXIgfSBmcm9tIFwiLi90ZXh0X2xheWVyX2J1aWxkZXIuanNcIjtcblxuY29uc3QgREVGQVVMVF9DQUNIRV9TSVpFID0gMTA7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUERGVmlld2VyT3B0aW9uc1xuICogQHByb3BlcnR5IHtIVE1MRGl2RWxlbWVudH0gY29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciBmb3IgdGhlIHZpZXdlciBlbGVtZW50LlxuICogQHByb3BlcnR5IHtIVE1MRGl2RWxlbWVudH0gW3ZpZXdlcl0gLSBUaGUgdmlld2VyIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge0V2ZW50QnVzfSBldmVudEJ1cyAtIFRoZSBhcHBsaWNhdGlvbiBldmVudCBidXMuXG4gKiBAcHJvcGVydHkge0lQREZMaW5rU2VydmljZX0gbGlua1NlcnZpY2UgLSBUaGUgbmF2aWdhdGlvbi9saW5raW5nIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge0Rvd25sb2FkTWFuYWdlcn0gW2Rvd25sb2FkTWFuYWdlcl0gLSBUaGUgZG93bmxvYWQgbWFuYWdlclxuICogICBjb21wb25lbnQuXG4gKiBAcHJvcGVydHkge1BERkZpbmRDb250cm9sbGVyfSBbZmluZENvbnRyb2xsZXJdIC0gVGhlIGZpbmQgY29udHJvbGxlclxuICogICBjb21wb25lbnQuXG4gKiBAcHJvcGVydHkge1BERlJlbmRlcmluZ1F1ZXVlfSBbcmVuZGVyaW5nUXVldWVdIC0gVGhlIHJlbmRlcmluZyBxdWV1ZSBvYmplY3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZW1vdmVQYWdlQm9yZGVyc10gLSBSZW1vdmVzIHRoZSBib3JkZXIgc2hhZG93IGFyb3VuZFxuICogICB0aGUgcGFnZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RleHRMYXllck1vZGVdIC0gQ29udHJvbHMgaWYgdGhlIHRleHQgbGF5ZXIgdXNlZCBmb3JcbiAqICAgc2VsZWN0aW9uIGFuZCBzZWFyY2hpbmcgaXMgY3JlYXRlZCwgYW5kIGlmIHRoZSBpbXByb3ZlZCB0ZXh0IHNlbGVjdGlvblxuICogICBiZWhhdmlvdXIgaXMgZW5hYmxlZC4gVGhlIGNvbnN0YW50cyBmcm9tIHtUZXh0TGF5ZXJNb2RlfSBzaG91bGQgYmUgdXNlZC5cbiAqICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYFRleHRMYXllck1vZGUuRU5BQkxFYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW1hZ2VSZXNvdXJjZXNQYXRoXSAtIFBhdGggZm9yIGltYWdlIHJlc291cmNlcywgbWFpbmx5XG4gKiAgIG1haW5seSBmb3IgYW5ub3RhdGlvbiBpY29ucy4gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JlbmRlckludGVyYWN0aXZlRm9ybXNdIC0gRW5hYmxlcyByZW5kZXJpbmcgb2ZcbiAqICAgaW50ZXJhY3RpdmUgZm9ybSBlbGVtZW50cy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlUHJpbnRBdXRvUm90YXRlXSAtIEVuYWJsZXMgYXV0b21hdGljIHJvdGF0aW9uIG9mXG4gKiAgIGxhbmRzY2FwZSBwYWdlcyB1cG9uIHByaW50aW5nLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbmRlcmVyIC0gJ2NhbnZhcycgb3IgJ3N2ZycuIFRoZSBkZWZhdWx0IGlzICdjYW52YXMnLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlV2ViR0xdIC0gRW5hYmxlcyBXZWJHTCBhY2NlbGVyYXRlZCByZW5kZXJpbmcgZm9yXG4gKiAgIHNvbWUgb3BlcmF0aW9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZU9ubHlDc3Nab29tXSAtIEVuYWJsZXMgQ1NTIG9ubHkgem9vbWluZy4gVGhlIGRlZmF1bHRcbiAqICAgdmFsdWUgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4Q2FudmFzUGl4ZWxzXSAtIFRoZSBtYXhpbXVtIHN1cHBvcnRlZCBjYW52YXMgc2l6ZSBpblxuICogICB0b3RhbCBwaXhlbHMsIGkuZS4gd2lkdGggKiBoZWlnaHQuIFVzZSAtMSBmb3Igbm8gbGltaXQuIFRoZSBkZWZhdWx0IHZhbHVlXG4gKiAgIGlzIDQwOTYgKiA0MDk2ICgxNiBtZWdhLXBpeGVscykuXG4gKiBAcHJvcGVydHkge0lMMTBufSBsMTBuIC0gTG9jYWxpemF0aW9uIHNlcnZpY2UuXG4gKi9cblxuZnVuY3Rpb24gUERGUGFnZVZpZXdCdWZmZXIoc2l6ZSkge1xuICBjb25zdCBkYXRhID0gW107XG4gIHRoaXMucHVzaCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgY29uc3QgaSA9IGRhdGEuaW5kZXhPZih2aWV3KTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICBkYXRhLnNwbGljZShpLCAxKTtcbiAgICB9XG4gICAgZGF0YS5wdXNoKHZpZXcpO1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IHNpemUpIHtcbiAgICAgIGRhdGEuc2hpZnQoKS5kZXN0cm95KCk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQWZ0ZXIgY2FsbGluZyByZXNpemUsIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgd2lsbCBiZSBuZXdTaXplLiBUaGUgb3B0aW9uYWxcbiAgICogcGFyYW1ldGVyIHBhZ2VzVG9LZWVwIGlzLCBpZiBwcmVzZW50LCBhbiBhcnJheSBvZiBwYWdlcyB0byBwdXNoIHRvIHRoZSBiYWNrXG4gICAqIG9mIHRoZSBidWZmZXIsIGRlbGF5aW5nIHRoZWlyIGRlc3RydWN0aW9uLiBUaGUgc2l6ZSBvZiBwYWdlc1RvS2VlcCBoYXMgbm9cbiAgICogaW1wYWN0IG9uIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBidWZmZXI7IGlmIHBhZ2VzVG9LZWVwIGhhcyBsZW5ndGggbGFyZ2VyXG4gICAqIHRoYW4gbmV3U2l6ZSwgc29tZSBvZiB0aG9zZSBwYWdlcyB3aWxsIGJlIGRlc3Ryb3llZCBhbnl3YXkuXG4gICAqL1xuICB0aGlzLnJlc2l6ZSA9IGZ1bmN0aW9uIChuZXdTaXplLCBwYWdlc1RvS2VlcCkge1xuICAgIHNpemUgPSBuZXdTaXplO1xuICAgIGlmIChwYWdlc1RvS2VlcCkge1xuICAgICAgY29uc3QgcGFnZUlkc1RvS2VlcCA9IG5ldyBTZXQoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpTWF4ID0gcGFnZXNUb0tlZXAubGVuZ3RoOyBpIDwgaU1heDsgKytpKSB7XG4gICAgICAgIHBhZ2VJZHNUb0tlZXAuYWRkKHBhZ2VzVG9LZWVwW2ldLmlkKTtcbiAgICAgIH1cbiAgICAgIG1vdmVUb0VuZE9mQXJyYXkoZGF0YSwgZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHBhZ2VJZHNUb0tlZXAuaGFzKHBhZ2UuaWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHdoaWxlIChkYXRhLmxlbmd0aCA+IHNpemUpIHtcbiAgICAgIGRhdGEuc2hpZnQoKS5kZXN0cm95KCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1NhbWVTY2FsZShvbGRTY2FsZSwgbmV3U2NhbGUpIHtcbiAgaWYgKG5ld1NjYWxlID09PSBvbGRTY2FsZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChNYXRoLmFicyhuZXdTY2FsZSAtIG9sZFNjYWxlKSA8IDFlLTE1KSB7XG4gICAgLy8gUHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJpbmcgb2YgYWxsIHBhZ2VzIHdoZW4gdGhlIHNjYWxlXG4gICAgLy8gY2hhbmdlcyBvbmx5IGJlY2F1c2Ugb2YgbGltaXRlZCBudW1lcmljYWwgcHJlY2lzaW9uLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgdmlld2VyIGNvbnRyb2wgdG8gZGlzcGxheSBQREYgY29udGVudC9wYWdlcy5cbiAqIEBpbXBsZW1lbnRzIHtJUmVuZGVyYWJsZVZpZXd9XG4gKi9cbmNsYXNzIEJhc2VWaWV3ZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtQREZWaWV3ZXJPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VWaWV3ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VWaWV3ZXIuXCIpO1xuICAgIH1cbiAgICB0aGlzLl9uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICB0aGlzLnZpZXdlciA9IG9wdGlvbnMudmlld2VyIHx8IG9wdGlvbnMuY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgaWYgKFxuICAgICAgKHR5cGVvZiBQREZKU0RldiA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICBQREZKU0Rldi50ZXN0KFwiIVBST0RVQ1RJT04gfHwgR0VORVJJQ1wiKSkgJiZcbiAgICAgICEoXG4gICAgICAgIHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTERpdkVsZW1lbnQgJiZcbiAgICAgICAgdGhpcy52aWV3ZXIgaW5zdGFuY2VvZiBIVE1MRGl2RWxlbWVudFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBgY29udGFpbmVyYCBhbmQvb3IgYHZpZXdlcmAgb3B0aW9uLlwiKTtcbiAgICB9XG4gICAgdGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG4gICAgdGhpcy5saW5rU2VydmljZSA9IG9wdGlvbnMubGlua1NlcnZpY2UgfHwgbmV3IFNpbXBsZUxpbmtTZXJ2aWNlKCk7XG4gICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBvcHRpb25zLmRvd25sb2FkTWFuYWdlciB8fCBudWxsO1xuICAgIHRoaXMuZmluZENvbnRyb2xsZXIgPSBvcHRpb25zLmZpbmRDb250cm9sbGVyIHx8IG51bGw7XG4gICAgdGhpcy5yZW1vdmVQYWdlQm9yZGVycyA9IG9wdGlvbnMucmVtb3ZlUGFnZUJvcmRlcnMgfHwgZmFsc2U7XG4gICAgdGhpcy50ZXh0TGF5ZXJNb2RlID0gTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLnRleHRMYXllck1vZGUpXG4gICAgICA/IG9wdGlvbnMudGV4dExheWVyTW9kZVxuICAgICAgOiBUZXh0TGF5ZXJNb2RlLkVOQUJMRTtcbiAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IG9wdGlvbnMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8IFwiXCI7XG4gICAgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgID8gb3B0aW9ucy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zXG4gICAgICAgIDogdHJ1ZTtcbiAgICB0aGlzLmVuYWJsZVByaW50QXV0b1JvdGF0ZSA9IG9wdGlvbnMuZW5hYmxlUHJpbnRBdXRvUm90YXRlIHx8IGZhbHNlO1xuICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zLnJlbmRlcmVyIHx8IFJlbmRlcmVyVHlwZS5DQU5WQVM7XG4gICAgdGhpcy5lbmFibGVXZWJHTCA9IG9wdGlvbnMuZW5hYmxlV2ViR0wgfHwgZmFsc2U7XG4gICAgdGhpcy51c2VPbmx5Q3NzWm9vbSA9IG9wdGlvbnMudXNlT25seUNzc1pvb20gfHwgZmFsc2U7XG4gICAgdGhpcy5tYXhDYW52YXNQaXhlbHMgPSBvcHRpb25zLm1heENhbnZhc1BpeGVscztcbiAgICB0aGlzLmwxMG4gPSBvcHRpb25zLmwxMG4gfHwgTnVsbEwxMG47XG5cbiAgICB0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSA9ICFvcHRpb25zLnJlbmRlcmluZ1F1ZXVlO1xuICAgIGlmICh0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSkge1xuICAgICAgLy8gQ3VzdG9tIHJlbmRlcmluZyBxdWV1ZSBpcyBub3Qgc3BlY2lmaWVkLCB1c2luZyBkZWZhdWx0IG9uZVxuICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZSA9IG5ldyBQREZSZW5kZXJpbmdRdWV1ZSgpO1xuICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZS5zZXRWaWV3ZXIodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyaW5nUXVldWUgPSBvcHRpb25zLnJlbmRlcmluZ1F1ZXVlO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsID0gd2F0Y2hTY3JvbGwodGhpcy5jb250YWluZXIsIHRoaXMuX3Njcm9sbFVwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IFByZXNlbnRhdGlvbk1vZGVTdGF0ZS5VTktOT1dOO1xuICAgIHRoaXMuX29uQmVmb3JlRHJhdyA9IHRoaXMuX29uQWZ0ZXJEcmF3ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNldFZpZXcoKTtcblxuICAgIGlmICh0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzKSB7XG4gICAgICB0aGlzLnZpZXdlci5jbGFzc0xpc3QuYWRkKFwicmVtb3ZlUGFnZUJvcmRlcnNcIik7XG4gICAgfVxuICAgIC8vIERlZmVyIHRoZSBkaXNwYXRjaGluZyBvZiB0aGlzIGV2ZW50LCB0byBnaXZlIG90aGVyIHZpZXdlciBjb21wb25lbnRzXG4gICAgLy8gdGltZSB0byBpbml0aWFsaXplICphbmQqIHJlZ2lzdGVyICdiYXNldmlld2VyaW5pdCcgZXZlbnQgbGlzdGVuZXJzLlxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcImJhc2V2aWV3ZXJpbml0XCIsIHsgc291cmNlOiB0aGlzIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHBhZ2VzQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzLmxlbmd0aDtcbiAgfVxuXG4gIGdldFBhZ2VWaWV3KGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzW2luZGV4XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gLSBUcnVlIGlmIGFsbCB7UERGUGFnZVZpZXd9IG9iamVjdHMgYXJlIGluaXRpYWxpemVkLlxuICAgKi9cbiAgZ2V0IHBhZ2VWaWV3c1JlYWR5KCkge1xuICAgIGlmICghdGhpcy5fcGFnZXNDYXBhYmlsaXR5LnNldHRsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gUHJldmVudCBwcmludGluZyBlcnJvcnMgd2hlbiAnZGlzYWJsZUF1dG9GZXRjaCcgaXMgc2V0LCBieSBlbnN1cmluZ1xuICAgIC8vIHRoYXQgKmFsbCogcGFnZXMgaGF2ZSBpbiBmYWN0IGJlZW4gY29tcGxldGVseSBsb2FkZWQuXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzLmV2ZXJ5KGZ1bmN0aW9uIChwYWdlVmlldykge1xuICAgICAgcmV0dXJuIHBhZ2VWaWV3ICYmIHBhZ2VWaWV3LnBkZlBhZ2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBjdXJyZW50UGFnZU51bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbCAtIFRoZSBwYWdlIG51bWJlci5cbiAgICovXG4gIHNldCBjdXJyZW50UGFnZU51bWJlcih2YWwpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWdlIG51bWJlci5cIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgaW50ZW50IGNhbiBiZSB0byBqdXN0IHJlc2V0IGEgc2Nyb2xsIHBvc2l0aW9uIGFuZC9vciBzY2FsZS5cbiAgICBpZiAoIXRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKHZhbCwgLyogcmVzZXRDdXJyZW50UGFnZVZpZXcgPSAqLyB0cnVlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYCR7dGhpcy5fbmFtZX0uY3VycmVudFBhZ2VOdW1iZXI6IFwiJHt2YWx9XCIgaXMgbm90IGEgdmFsaWQgcGFnZS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGFnZU51bWJlciBpcyB2YWxpZCAod2l0aGluIGJvdW5kcykuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0Q3VycmVudFBhZ2VOdW1iZXIodmFsLCByZXNldEN1cnJlbnRQYWdlVmlldyA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID09PSB2YWwpIHtcbiAgICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykge1xuICAgICAgICB0aGlzLl9yZXNldEN1cnJlbnRQYWdlVmlldygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCEoMCA8IHZhbCAmJiB2YWwgPD0gdGhpcy5wYWdlc0NvdW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50UGFnZU51bWJlciA9IHZhbDtcblxuICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJwYWdlY2hhbmdpbmdcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgcGFnZU51bWJlcjogdmFsLFxuICAgICAgcGFnZUxhYmVsOiB0aGlzLl9wYWdlTGFiZWxzICYmIHRoaXMuX3BhZ2VMYWJlbHNbdmFsIC0gMV0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzZXRDdXJyZW50UGFnZVZpZXcpIHtcbiAgICAgIHRoaXMuX3Jlc2V0Q3VycmVudFBhZ2VWaWV3KCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd8bnVsbH0gUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIGxhYmVsLCBvciBgbnVsbGAgaWYgbm8gcGFnZVxuICAgKiAgIGxhYmVscyBleGlzdC5cbiAgICovXG4gIGdldCBjdXJyZW50UGFnZUxhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlTGFiZWxzICYmIHRoaXMuX3BhZ2VMYWJlbHNbdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsIC0gVGhlIHBhZ2UgbGFiZWwuXG4gICAqL1xuICBzZXQgY3VycmVudFBhZ2VMYWJlbCh2YWwpIHtcbiAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBhZ2UgPSB2YWwgfCAwOyAvLyBGYWxsYmFjayBwYWdlIG51bWJlci5cbiAgICBpZiAodGhpcy5fcGFnZUxhYmVscykge1xuICAgICAgY29uc3QgaSA9IHRoaXMuX3BhZ2VMYWJlbHMuaW5kZXhPZih2YWwpO1xuICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICBwYWdlID0gaSArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRoZSBpbnRlbnQgY2FuIGJlIHRvIGp1c3QgcmVzZXQgYSBzY3JvbGwgcG9zaXRpb24gYW5kL29yIHNjYWxlLlxuICAgIGlmICghdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZSwgLyogcmVzZXRDdXJyZW50UGFnZVZpZXcgPSAqLyB0cnVlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYCR7dGhpcy5fbmFtZX0uY3VycmVudFBhZ2VMYWJlbDogXCIke3ZhbH1cIiBpcyBub3QgYSB2YWxpZCBwYWdlLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgY3VycmVudFNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2NhbGUgIT09IFVOS05PV05fU0NBTEVcbiAgICAgID8gdGhpcy5fY3VycmVudFNjYWxlXG4gICAgICA6IERFRkFVTFRfU0NBTEU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbCAtIFNjYWxlIG9mIHRoZSBwYWdlcyBpbiBwZXJjZW50cy5cbiAgICovXG4gIHNldCBjdXJyZW50U2NhbGUodmFsKSB7XG4gICAgaWYgKGlzTmFOKHZhbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbnVtZXJpYyBzY2FsZS5cIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRTY2FsZSh2YWwsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGN1cnJlbnRTY2FsZVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gdmFsIC0gVGhlIHNjYWxlIG9mIHRoZSBwYWdlcyAoaW4gcGVyY2VudCBvciBwcmVkZWZpbmVkIHZhbHVlKS5cbiAgICovXG4gIHNldCBjdXJyZW50U2NhbGVWYWx1ZSh2YWwpIHtcbiAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2V0U2NhbGUodmFsLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBwYWdlc1JvdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlc1JvdGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvbiAtIFRoZSByb3RhdGlvbiBvZiB0aGUgcGFnZXMgKDAsIDkwLCAxODAsIDI3MCkuXG4gICAqL1xuICBzZXQgcGFnZXNSb3RhdGlvbihyb3RhdGlvbikge1xuICAgIGlmICghaXNWYWxpZFJvdGF0aW9uKHJvdGF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWdlcyByb3RhdGlvbiBhbmdsZS5cIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGFnZXNSb3RhdGlvbiA9PT0gcm90YXRpb24pIHtcbiAgICAgIHJldHVybjsgLy8gVGhlIHJvdGF0aW9uIGRpZG4ndCBjaGFuZ2UuXG4gICAgfVxuICAgIHRoaXMuX3BhZ2VzUm90YXRpb24gPSByb3RhdGlvbjtcblxuICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjtcblxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbaV07XG4gICAgICBwYWdlVmlldy51cGRhdGUocGFnZVZpZXcuc2NhbGUsIHJvdGF0aW9uKTtcbiAgICB9XG4gICAgLy8gUHJldmVudCBlcnJvcnMgaW4gY2FzZSB0aGUgcm90YXRpb24gY2hhbmdlcyAqYmVmb3JlKiB0aGUgc2NhbGUgaGFzIGJlZW5cbiAgICAvLyBzZXQgdG8gYSBub24tZGVmYXVsdCB2YWx1ZS5cbiAgICBpZiAodGhpcy5fY3VycmVudFNjYWxlVmFsdWUpIHtcbiAgICAgIHRoaXMuX3NldFNjYWxlKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwicm90YXRpb25jaGFuZ2luZ1wiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBwYWdlc1JvdGF0aW9uOiByb3RhdGlvbixcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpcnN0UGFnZVByb21pc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UgOiBudWxsO1xuICB9XG5cbiAgZ2V0IG9uZVBhZ2VSZW5kZXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHkucHJvbWlzZSA6IG51bGw7XG4gIH1cblxuICBnZXQgcGFnZXNQcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5fcGFnZXNDYXBhYmlsaXR5LnByb21pc2UgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX3ZpZXdlckVsZW1lbnQoKSB7XG4gICAgLy8gSW4gbW9zdCB2aWV3ZXJzLCBlLmcuIGBQREZWaWV3ZXJgLCB0aGlzIHNob3VsZCByZXR1cm4gYHRoaXMudmlld2VyYC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQ6IF92aWV3ZXJFbGVtZW50XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25lUGFnZVJlbmRlcmVkT3JGb3JjZUZldGNoKCkge1xuICAgIC8vIFVubGVzcyB0aGUgdmlld2VyICphbmQqIGl0cyBwYWdlcyBhcmUgdmlzaWJsZSwgcmVuZGVyaW5nIHdvbid0IHN0YXJ0IGFuZFxuICAgIC8vIGB0aGlzLl9vbmVQYWdlUmVuZGVyZWRDYXBhYmlsaXR5YCB0aHVzIHdvbid0IGJlIHJlc29sdmVkLlxuICAgIC8vIFRvIGVuc3VyZSB0aGF0IGF1dG9tYXRpYyBwcmludGluZywgb24gZG9jdW1lbnQgbG9hZCwgc3RpbGwgd29ya3MgZXZlbiBpblxuICAgIC8vIHRob3NlIGNhc2VzIHdlIGZvcmNlLWFsbG93IGZldGNoaW5nIG9mIGFsbCBwYWdlcyB3aGVuOlxuICAgIC8vICAtIFRoZSB2aWV3ZXIgaXMgaGlkZGVuIGluIHRoZSBET00sIGUuZy4gaW4gYSBgZGlzcGxheTogbm9uZWAgPGlmcmFtZT5cbiAgICAvLyAgICBlbGVtZW50OyBmaXhlcyBidWcgMTYxODYyMS5cbiAgICAvLyAgLSBUaGUgdmlld2VyIGlzIHZpc2libGUsIGJ1dCBub25lIG9mIHRoZSBwYWdlcyBhcmUgKGUuZy4gaWYgdGhlXG4gICAgLy8gICAgdmlld2VyIGlzIHZlcnkgc21hbGwpOyBmaXhlcyBidWcgMTYxODk1NS5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5jb250YWluZXIub2Zmc2V0UGFyZW50IHx8XG4gICAgICB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKS52aWV3cy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGRmRG9jdW1lbnQge1BERkRvY3VtZW50fVxuICAgKi9cbiAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHtcbiAgICBpZiAodGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgdGhpcy5fY2FuY2VsUmVuZGVyaW5nKCk7XG4gICAgICB0aGlzLl9yZXNldFZpZXcoKTtcblxuICAgICAgaWYgKHRoaXMuZmluZENvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5maW5kQ29udHJvbGxlci5zZXREb2N1bWVudChudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7XG4gICAgaWYgKCFwZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYWdlc0NvdW50ID0gcGRmRG9jdW1lbnQubnVtUGFnZXM7XG4gICAgY29uc3QgZmlyc3RQYWdlUHJvbWlzZSA9IHBkZkRvY3VtZW50LmdldFBhZ2UoMSk7XG5cbiAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHBkZkRvY3VtZW50LmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBwZGZEb2N1bWVudC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTtcblxuICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VzbG9hZGVkXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBwYWdlc0NvdW50LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9vbkJlZm9yZURyYXcgPSBldnQgPT4ge1xuICAgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1tldnQucGFnZU51bWJlciAtIDFdO1xuICAgICAgaWYgKCFwYWdlVmlldykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBBZGQgdGhlIHBhZ2UgdG8gdGhlIGJ1ZmZlciBhdCB0aGUgc3RhcnQgb2YgZHJhd2luZy4gVGhhdCB3YXkgaXQgY2FuIGJlXG4gICAgICAvLyBldmljdGVkIGZyb20gdGhlIGJ1ZmZlciBhbmQgZGVzdHJveWVkIGV2ZW4gaWYgd2UgcGF1c2UgaXRzIHJlbmRlcmluZy5cbiAgICAgIHRoaXMuX2J1ZmZlci5wdXNoKHBhZ2VWaWV3KTtcbiAgICB9O1xuICAgIHRoaXMuZXZlbnRCdXMuX29uKFwicGFnZXJlbmRlclwiLCB0aGlzLl9vbkJlZm9yZURyYXcpO1xuXG4gICAgdGhpcy5fb25BZnRlckRyYXcgPSBldnQgPT4ge1xuICAgICAgaWYgKGV2dC5jc3NUcmFuc2Zvcm0gfHwgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5zZXR0bGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXG4gICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoXCJwYWdlcmVuZGVyZWRcIiwgdGhpcy5fb25BZnRlckRyYXcpO1xuICAgICAgdGhpcy5fb25BZnRlckRyYXcgPSBudWxsO1xuICAgIH07XG4gICAgdGhpcy5ldmVudEJ1cy5fb24oXCJwYWdlcmVuZGVyZWRcIiwgdGhpcy5fb25BZnRlckRyYXcpO1xuXG4gICAgLy8gRmV0Y2ggYSBzaW5nbGUgcGFnZSBzbyB3ZSBjYW4gZ2V0IGEgdmlld3BvcnQgdGhhdCB3aWxsIGJlIHRoZSBkZWZhdWx0XG4gICAgLy8gdmlld3BvcnQgZm9yIGFsbCBwYWdlc1xuICAgIGZpcnN0UGFnZVByb21pc2VcbiAgICAgIC50aGVuKGZpcnN0UGRmUGFnZSA9PiB7XG4gICAgICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucmVzb2x2ZShmaXJzdFBkZlBhZ2UpO1xuICAgICAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTtcblxuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuY3VycmVudFNjYWxlO1xuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IGZpcnN0UGRmUGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlOiBzY2FsZSAqIENTU19VTklUUyB9KTtcbiAgICAgICAgY29uc3QgdGV4dExheWVyRmFjdG9yeSA9XG4gICAgICAgICAgdGhpcy50ZXh0TGF5ZXJNb2RlICE9PSBUZXh0TGF5ZXJNb2RlLkRJU0FCTEUgPyB0aGlzIDogbnVsbDtcblxuICAgICAgICBmb3IgKGxldCBwYWdlTnVtID0gMTsgcGFnZU51bSA8PSBwYWdlc0NvdW50OyArK3BhZ2VOdW0pIHtcbiAgICAgICAgICBjb25zdCBwYWdlVmlldyA9IG5ldyBQREZQYWdlVmlldyh7XG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuX3ZpZXdlckVsZW1lbnQsXG4gICAgICAgICAgICBldmVudEJ1czogdGhpcy5ldmVudEJ1cyxcbiAgICAgICAgICAgIGlkOiBwYWdlTnVtLFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICBkZWZhdWx0Vmlld3BvcnQ6IHZpZXdwb3J0LmNsb25lKCksXG4gICAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZSxcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UsXG4gICAgICAgICAgICByZW5kZXJpbmdRdWV1ZTogdGhpcy5yZW5kZXJpbmdRdWV1ZSxcbiAgICAgICAgICAgIHRleHRMYXllckZhY3RvcnksXG4gICAgICAgICAgICB0ZXh0TGF5ZXJNb2RlOiB0aGlzLnRleHRMYXllck1vZGUsXG4gICAgICAgICAgICBhbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OiB0aGlzLFxuICAgICAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCxcbiAgICAgICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgICAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLFxuICAgICAgICAgICAgZW5hYmxlV2ViR0w6IHRoaXMuZW5hYmxlV2ViR0wsXG4gICAgICAgICAgICB1c2VPbmx5Q3NzWm9vbTogdGhpcy51c2VPbmx5Q3NzWm9vbSxcbiAgICAgICAgICAgIG1heENhbnZhc1BpeGVsczogdGhpcy5tYXhDYW52YXNQaXhlbHMsXG4gICAgICAgICAgICBsMTBuOiB0aGlzLmwxMG4sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcGFnZXMucHVzaChwYWdlVmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHRoZSBmaXJzdCBgcGRmUGFnZWAgaW1tZWRpYXRlbHksIHNpbmNlIGl0J3MgYWxyZWFkeSBsb2FkZWQsXG4gICAgICAgIC8vIHJhdGhlciB0aGFuIGhhdmluZyB0byByZXBlYXQgdGhlIGBQREZEb2N1bWVudFByb3h5LmdldFBhZ2VgIGNhbGwgaW5cbiAgICAgICAgLy8gdGhlIGB0aGlzLl9lbnN1cmVQZGZQYWdlTG9hZGVkYCBtZXRob2QgYmVmb3JlIHJlbmRlcmluZyBjYW4gc3RhcnQuXG4gICAgICAgIGNvbnN0IGZpcnN0UGFnZVZpZXcgPSB0aGlzLl9wYWdlc1swXTtcbiAgICAgICAgaWYgKGZpcnN0UGFnZVZpZXcpIHtcbiAgICAgICAgICBmaXJzdFBhZ2VWaWV3LnNldFBkZlBhZ2UoZmlyc3RQZGZQYWdlKTtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmNhY2hlUGFnZVJlZigxLCBmaXJzdFBkZlBhZ2UucmVmKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc3ByZWFkTW9kZSAhPT0gU3ByZWFkTW9kZS5OT05FKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlU3ByZWFkTW9kZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggYWxsIHRoZSBwYWdlcyBzaW5jZSB0aGUgdmlld3BvcnQgaXMgbmVlZGVkIGJlZm9yZSBwcmludGluZ1xuICAgICAgICAvLyBzdGFydHMgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IHNpemUgY2FudmFzLiBXYWl0IHVudGlsIG9uZSBwYWdlIGlzXG4gICAgICAgIC8vIHJlbmRlcmVkIHNvIHdlIGRvbid0IHRpZSB1cCB0b28gbWFueSByZXNvdXJjZXMgZWFybHkgb24uXG4gICAgICAgIHRoaXMuX29uZVBhZ2VSZW5kZXJlZE9yRm9yY2VGZXRjaCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmZpbmRDb250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRDb250cm9sbGVyLnNldERvY3VtZW50KHBkZkRvY3VtZW50KTsgLy8gRW5hYmxlIHNlYXJjaGluZy5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJbiBhZGRpdGlvbiB0byAnZGlzYWJsZUF1dG9GZXRjaCcgYmVpbmcgc2V0LCBhbHNvIGF0dGVtcHQgdG8gcmVkdWNlXG4gICAgICAgICAgLy8gcmVzb3VyY2UgdXNhZ2Ugd2hlbiBsb2FkaW5nICp2ZXJ5KiBsb25nL2xhcmdlIGRvY3VtZW50cy5cbiAgICAgICAgICBpZiAocGRmRG9jdW1lbnQubG9hZGluZ1BhcmFtcy5kaXNhYmxlQXV0b0ZldGNoIHx8IHBhZ2VzQ291bnQgPiA3NTAwKSB7XG4gICAgICAgICAgICAvLyBYWFg6IFByaW50aW5nIGlzIHNlbWktYnJva2VuIHdpdGggYXV0byBmZXRjaCBkaXNhYmxlZC5cbiAgICAgICAgICAgIHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBnZXRQYWdlc0xlZnQgPSBwYWdlc0NvdW50IC0gMTsgLy8gVGhlIGZpcnN0IHBhZ2Ugd2FzIGFscmVhZHkgbG9hZGVkLlxuXG4gICAgICAgICAgaWYgKGdldFBhZ2VzTGVmdCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBwYWdlTnVtID0gMjsgcGFnZU51bSA8PSBwYWdlc0NvdW50OyArK3BhZ2VOdW0pIHtcbiAgICAgICAgICAgIHBkZkRvY3VtZW50LmdldFBhZ2UocGFnZU51bSkudGhlbihcbiAgICAgICAgICAgICAgcGRmUGFnZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1twYWdlTnVtIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKCFwYWdlVmlldy5wZGZQYWdlKSB7XG4gICAgICAgICAgICAgICAgICBwYWdlVmlldy5zZXRQZGZQYWdlKHBkZlBhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmNhY2hlUGFnZVJlZihwYWdlTnVtLCBwZGZQYWdlLnJlZik7XG4gICAgICAgICAgICAgICAgaWYgKC0tZ2V0UGFnZXNMZWZ0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYFVuYWJsZSB0byBnZXQgcGFnZSAke3BhZ2VOdW19IHRvIGluaXRpYWxpemUgdmlld2VyYCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKC0tZ2V0UGFnZXNMZWZ0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJwYWdlc2luaXRcIiwgeyBzb3VyY2U6IHRoaXMgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFJlbmRlcmluZ1F1ZXVlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVW5hYmxlIHRvIGluaXRpYWxpemUgdmlld2VyXCIsIHJlYXNvbik7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5fG51bGx9IGxhYmVsc1xuICAgKi9cbiAgc2V0UGFnZUxhYmVscyhsYWJlbHMpIHtcbiAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFsYWJlbHMpIHtcbiAgICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhKEFycmF5LmlzQXJyYXkobGFiZWxzKSAmJiB0aGlzLnBkZkRvY3VtZW50Lm51bVBhZ2VzID09PSBsYWJlbHMubGVuZ3RoKVxuICAgICkge1xuICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7XG4gICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX25hbWV9LnNldFBhZ2VMYWJlbHM6IEludmFsaWQgcGFnZSBsYWJlbHMuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBsYWJlbHM7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSBhbGwgdGhlIGBQREZQYWdlVmlld2AgaW5zdGFuY2VzLlxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbaV07XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuX3BhZ2VMYWJlbHMgJiYgdGhpcy5fcGFnZUxhYmVsc1tpXTtcbiAgICAgIHBhZ2VWaWV3LnNldFBhZ2VMYWJlbChsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgX3Jlc2V0VmlldygpIHtcbiAgICB0aGlzLl9wYWdlcyA9IFtdO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgICB0aGlzLl9jdXJyZW50U2NhbGUgPSBVTktOT1dOX1NDQUxFO1xuICAgIHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlID0gbnVsbDtcbiAgICB0aGlzLl9wYWdlTGFiZWxzID0gbnVsbDtcbiAgICB0aGlzLl9idWZmZXIgPSBuZXcgUERGUGFnZVZpZXdCdWZmZXIoREVGQVVMVF9DQUNIRV9TSVpFKTtcbiAgICB0aGlzLl9sb2NhdGlvbiA9IG51bGw7XG4gICAgdGhpcy5fcGFnZXNSb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5fcGFnZXNSZXF1ZXN0cyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eSA9IGNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcGFnZXNDYXBhYmlsaXR5ID0gY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9zY3JvbGxNb2RlID0gU2Nyb2xsTW9kZS5WRVJUSUNBTDtcbiAgICB0aGlzLl9zcHJlYWRNb2RlID0gU3ByZWFkTW9kZS5OT05FO1xuXG4gICAgaWYgKHRoaXMuX29uQmVmb3JlRHJhdykge1xuICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKFwicGFnZXJlbmRlclwiLCB0aGlzLl9vbkJlZm9yZURyYXcpO1xuICAgICAgdGhpcy5fb25CZWZvcmVEcmF3ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29uQWZ0ZXJEcmF3KSB7XG4gICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoXCJwYWdlcmVuZGVyZWRcIiwgdGhpcy5fb25BZnRlckRyYXcpO1xuICAgICAgdGhpcy5fb25BZnRlckRyYXcgPSBudWxsO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIHBhZ2VzIGZyb20gdGhlIERPTS4uLlxuICAgIHRoaXMudmlld2VyLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAvLyAuLi4gYW5kIHJlc2V0IHRoZSBTY3JvbGwgbW9kZSBDU1MgY2xhc3MoZXMpIGFmdGVyd2FyZHMuXG4gICAgdGhpcy5fdXBkYXRlU2Nyb2xsTW9kZSgpO1xuICB9XG5cbiAgX3Njcm9sbFVwZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5wYWdlc0NvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBfc2Nyb2xsSW50b1ZpZXcoeyBwYWdlRGl2LCBwYWdlU3BvdCA9IG51bGwsIHBhZ2VOdW1iZXIgPSBudWxsIH0pIHtcbiAgICBzY3JvbGxJbnRvVmlldyhwYWdlRGl2LCBwYWdlU3BvdCk7XG4gIH1cblxuICBfc2V0U2NhbGVVcGRhdGVQYWdlcyhuZXdTY2FsZSwgbmV3VmFsdWUsIG5vU2Nyb2xsID0gZmFsc2UsIHByZXNldCA9IGZhbHNlKSB7XG4gICAgdGhpcy5fY3VycmVudFNjYWxlVmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpO1xuXG4gICAgaWYgKGlzU2FtZVNjYWxlKHRoaXMuX2N1cnJlbnRTY2FsZSwgbmV3U2NhbGUpKSB7XG4gICAgICBpZiAocHJlc2V0KSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJzY2FsZWNoYW5naW5nXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgc2NhbGU6IG5ld1NjYWxlLFxuICAgICAgICAgIHByZXNldFZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5fcGFnZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdGhpcy5fcGFnZXNbaV0udXBkYXRlKG5ld1NjYWxlKTtcbiAgICB9XG4gICAgdGhpcy5fY3VycmVudFNjYWxlID0gbmV3U2NhbGU7XG5cbiAgICBpZiAoIW5vU2Nyb2xsKSB7XG4gICAgICBsZXQgcGFnZSA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyLFxuICAgICAgICBkZXN0O1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9sb2NhdGlvbiAmJlxuICAgICAgICAhKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgdGhpcy5pc0NoYW5naW5nUHJlc2VudGF0aW9uTW9kZSlcbiAgICAgICkge1xuICAgICAgICBwYWdlID0gdGhpcy5fbG9jYXRpb24ucGFnZU51bWJlcjtcbiAgICAgICAgZGVzdCA9IFtcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHsgbmFtZTogXCJYWVpcIiB9LFxuICAgICAgICAgIHRoaXMuX2xvY2F0aW9uLmxlZnQsXG4gICAgICAgICAgdGhpcy5fbG9jYXRpb24udG9wLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICB0aGlzLnNjcm9sbFBhZ2VJbnRvVmlldyh7XG4gICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2UsXG4gICAgICAgIGRlc3RBcnJheTogZGVzdCxcbiAgICAgICAgYWxsb3dOZWdhdGl2ZU9mZnNldDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJzY2FsZWNoYW5naW5nXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIHNjYWxlOiBuZXdTY2FsZSxcbiAgICAgIHByZXNldFZhbHVlOiBwcmVzZXQgPyBuZXdWYWx1ZSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSkge1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBfc2V0U2NhbGUodmFsdWUsIG5vU2Nyb2xsID0gZmFsc2UpIHtcbiAgICBsZXQgc2NhbGUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgIGlmIChzY2FsZSA+IDApIHtcbiAgICAgIHRoaXMuX3NldFNjYWxlVXBkYXRlUGFnZXMoc2NhbGUsIHZhbHVlLCBub1Njcm9sbCwgLyogcHJlc2V0ID0gKi8gZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07XG4gICAgICBpZiAoIWN1cnJlbnRQYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vUGFkZGluZyA9IHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgdGhpcy5yZW1vdmVQYWdlQm9yZGVycztcbiAgICAgIGxldCBoUGFkZGluZyA9IG5vUGFkZGluZyA/IDAgOiBTQ1JPTExCQVJfUEFERElORztcbiAgICAgIGxldCB2UGFkZGluZyA9IG5vUGFkZGluZyA/IDAgOiBWRVJUSUNBTF9QQURESU5HO1xuXG4gICAgICBpZiAoIW5vUGFkZGluZyAmJiB0aGlzLl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsKSB7XG4gICAgICAgIFtoUGFkZGluZywgdlBhZGRpbmddID0gW3ZQYWRkaW5nLCBoUGFkZGluZ107IC8vIFN3YXAgdGhlIHBhZGRpbmcgdmFsdWVzLlxuICAgICAgfVxuICAgICAgY29uc3QgcGFnZVdpZHRoU2NhbGUgPVxuICAgICAgICAoKHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoIC0gaFBhZGRpbmcpIC8gY3VycmVudFBhZ2Uud2lkdGgpICpcbiAgICAgICAgY3VycmVudFBhZ2Uuc2NhbGU7XG4gICAgICBjb25zdCBwYWdlSGVpZ2h0U2NhbGUgPVxuICAgICAgICAoKHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHZQYWRkaW5nKSAvIGN1cnJlbnRQYWdlLmhlaWdodCkgKlxuICAgICAgICBjdXJyZW50UGFnZS5zY2FsZTtcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSBcInBhZ2UtYWN0dWFsXCI6XG4gICAgICAgICAgc2NhbGUgPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicGFnZS13aWR0aFwiOlxuICAgICAgICAgIHNjYWxlID0gcGFnZVdpZHRoU2NhbGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJwYWdlLWhlaWdodFwiOlxuICAgICAgICAgIHNjYWxlID0gcGFnZUhlaWdodFNjYWxlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicGFnZS1maXRcIjpcbiAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHBhZ2VXaWR0aFNjYWxlLCBwYWdlSGVpZ2h0U2NhbGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXV0b1wiOlxuICAgICAgICAgIC8vIEZvciBwYWdlcyBpbiBsYW5kc2NhcGUgbW9kZSwgZml0IHRoZSBwYWdlIGhlaWdodCB0byB0aGUgdmlld2VyXG4gICAgICAgICAgLy8gKnVubGVzcyogdGhlIHBhZ2Ugd291bGQgdGh1cyBiZWNvbWUgdG9vIHdpZGUgdG8gZml0IGhvcml6b250YWxseS5cbiAgICAgICAgICBjb25zdCBob3Jpem9udGFsU2NhbGUgPSBpc1BvcnRyYWl0T3JpZW50YXRpb24oY3VycmVudFBhZ2UpXG4gICAgICAgICAgICA/IHBhZ2VXaWR0aFNjYWxlXG4gICAgICAgICAgICA6IE1hdGgubWluKHBhZ2VIZWlnaHRTY2FsZSwgcGFnZVdpZHRoU2NhbGUpO1xuICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oTUFYX0FVVE9fU0NBTEUsIGhvcml6b250YWxTY2FsZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGAke3RoaXMuX25hbWV9Ll9zZXRTY2FsZTogXCIke3ZhbHVlfVwiIGlzIGFuIHVua25vd24gem9vbSB2YWx1ZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9zZXRTY2FsZVVwZGF0ZVBhZ2VzKHNjYWxlLCB2YWx1ZSwgbm9TY3JvbGwsIC8qIHByZXNldCA9ICovIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgcGFnZSB2aWV3OiBzY3JvbGxzIHRvIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHVwZGF0ZXMgdGhlIHNjYWxlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Jlc2V0Q3VycmVudFBhZ2VWaWV3KCkge1xuICAgIGlmICh0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7XG4gICAgICAvLyBGaXhlcyB0aGUgY2FzZSB3aGVuIFBERiBoYXMgZGlmZmVyZW50IHBhZ2Ugc2l6ZXMuXG4gICAgICB0aGlzLl9zZXRTY2FsZSh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLl9wYWdlc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdO1xuICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHsgcGFnZURpdjogcGFnZVZpZXcuZGl2IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIFNjcm9sbFBhZ2VJbnRvVmlld1BhcmFtZXRlcnNcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHBhZ2VOdW1iZXIgLSBUaGUgcGFnZSBudW1iZXIuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IFtkZXN0QXJyYXldIC0gVGhlIG9yaWdpbmFsIFBERiBkZXN0aW5hdGlvbiBhcnJheSwgaW4gdGhlXG4gICAqICAgZm9ybWF0OiA8cGFnZS1yZWY+IDwvWFlafC9GaXRYWFg+IDxhcmdzLi4+XG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2FsbG93TmVnYXRpdmVPZmZzZXRdIC0gQWxsb3cgbmVnYXRpdmUgcGFnZSBvZmZzZXRzLlxuICAgKiAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZURlc3RpbmF0aW9uWm9vbV0gLSBJZ25vcmUgdGhlIHpvb20gYXJndW1lbnQgaW5cbiAgICogICB0aGUgZGVzdGluYXRpb24gYXJyYXkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHBhZ2UgaW50byB2aWV3LlxuICAgKiBAcGFyYW0ge1Njcm9sbFBhZ2VJbnRvVmlld1BhcmFtZXRlcnN9IHBhcmFtc1xuICAgKi9cbiAgc2Nyb2xsUGFnZUludG9WaWV3KHtcbiAgICBwYWdlTnVtYmVyLFxuICAgIGRlc3RBcnJheSA9IG51bGwsXG4gICAgYWxsb3dOZWdhdGl2ZU9mZnNldCA9IGZhbHNlLFxuICAgIGlnbm9yZURlc3RpbmF0aW9uWm9vbSA9IGZhbHNlLFxuICB9KSB7XG4gICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VWaWV3ID1cbiAgICAgIE51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikgJiYgdGhpcy5fcGFnZXNbcGFnZU51bWJlciAtIDFdO1xuICAgIGlmICghcGFnZVZpZXcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGAke3RoaXMuX25hbWV9LnNjcm9sbFBhZ2VJbnRvVmlldzogYCArXG4gICAgICAgICAgYFwiJHtwYWdlTnVtYmVyfVwiIGlzIG5vdCBhIHZhbGlkIHBhZ2VOdW1iZXIgcGFyYW1ldGVyLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgIWRlc3RBcnJheSkge1xuICAgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlciwgLyogcmVzZXRDdXJyZW50UGFnZVZpZXcgPSAqLyB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHggPSAwLFxuICAgICAgeSA9IDA7XG4gICAgbGV0IHdpZHRoID0gMCxcbiAgICAgIGhlaWdodCA9IDAsXG4gICAgICB3aWR0aFNjYWxlLFxuICAgICAgaGVpZ2h0U2NhbGU7XG4gICAgY29uc3QgY2hhbmdlT3JpZW50YXRpb24gPSBwYWdlVmlldy5yb3RhdGlvbiAlIDE4MCAhPT0gMDtcbiAgICBjb25zdCBwYWdlV2lkdGggPVxuICAgICAgKGNoYW5nZU9yaWVudGF0aW9uID8gcGFnZVZpZXcuaGVpZ2h0IDogcGFnZVZpZXcud2lkdGgpIC9cbiAgICAgIHBhZ2VWaWV3LnNjYWxlIC9cbiAgICAgIENTU19VTklUUztcbiAgICBjb25zdCBwYWdlSGVpZ2h0ID1cbiAgICAgIChjaGFuZ2VPcmllbnRhdGlvbiA/IHBhZ2VWaWV3LndpZHRoIDogcGFnZVZpZXcuaGVpZ2h0KSAvXG4gICAgICBwYWdlVmlldy5zY2FsZSAvXG4gICAgICBDU1NfVU5JVFM7XG4gICAgbGV0IHNjYWxlID0gMDtcbiAgICBzd2l0Y2ggKGRlc3RBcnJheVsxXS5uYW1lKSB7XG4gICAgICBjYXNlIFwiWFlaXCI6XG4gICAgICAgIHggPSBkZXN0QXJyYXlbMl07XG4gICAgICAgIHkgPSBkZXN0QXJyYXlbM107XG4gICAgICAgIHNjYWxlID0gZGVzdEFycmF5WzRdO1xuICAgICAgICAvLyBJZiB4IGFuZC9vciB5IGNvb3JkaW5hdGVzIGFyZSBub3Qgc3VwcGxpZWQsIGRlZmF1bHQgdG9cbiAgICAgICAgLy8gX3RvcF8gbGVmdCBvZiB0aGUgcGFnZSAobm90IHRoZSBvYnZpb3VzIGJvdHRvbSBsZWZ0LFxuICAgICAgICAvLyBzaW5jZSBhbGlnbmluZyB0aGUgYm90dG9tIG9mIHRoZSBpbnRlbmRlZCBwYWdlIHdpdGggdGhlXG4gICAgICAgIC8vIHRvcCBvZiB0aGUgd2luZG93IGlzIHJhcmVseSBoZWxwZnVsKS5cbiAgICAgICAgeCA9IHggIT09IG51bGwgPyB4IDogMDtcbiAgICAgICAgeSA9IHkgIT09IG51bGwgPyB5IDogcGFnZUhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRml0XCI6XG4gICAgICBjYXNlIFwiRml0QlwiOlxuICAgICAgICBzY2FsZSA9IFwicGFnZS1maXRcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRml0SFwiOlxuICAgICAgY2FzZSBcIkZpdEJIXCI6XG4gICAgICAgIHkgPSBkZXN0QXJyYXlbMl07XG4gICAgICAgIHNjYWxlID0gXCJwYWdlLXdpZHRoXCI7XG4gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgUERGIHNwZWMsIHNlY3Rpb24gMTIuMy4yLjIsIGEgYG51bGxgIHZhbHVlIGluIHRoZVxuICAgICAgICAvLyBwYXJhbWV0ZXIgc2hvdWxkIG1haW50YWluIHRoZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgbmV3IHBhZ2UuXG4gICAgICAgIGlmICh5ID09PSBudWxsICYmIHRoaXMuX2xvY2F0aW9uKSB7XG4gICAgICAgICAgeCA9IHRoaXMuX2xvY2F0aW9uLmxlZnQ7XG4gICAgICAgICAgeSA9IHRoaXMuX2xvY2F0aW9uLnRvcDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJGaXRWXCI6XG4gICAgICBjYXNlIFwiRml0QlZcIjpcbiAgICAgICAgeCA9IGRlc3RBcnJheVsyXTtcbiAgICAgICAgd2lkdGggPSBwYWdlV2lkdGg7XG4gICAgICAgIGhlaWdodCA9IHBhZ2VIZWlnaHQ7XG4gICAgICAgIHNjYWxlID0gXCJwYWdlLWhlaWdodFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJGaXRSXCI6XG4gICAgICAgIHggPSBkZXN0QXJyYXlbMl07XG4gICAgICAgIHkgPSBkZXN0QXJyYXlbM107XG4gICAgICAgIHdpZHRoID0gZGVzdEFycmF5WzRdIC0geDtcbiAgICAgICAgaGVpZ2h0ID0gZGVzdEFycmF5WzVdIC0geTtcbiAgICAgICAgY29uc3QgaFBhZGRpbmcgPSB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzID8gMCA6IFNDUk9MTEJBUl9QQURESU5HO1xuICAgICAgICBjb25zdCB2UGFkZGluZyA9IHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMgPyAwIDogVkVSVElDQUxfUEFERElORztcblxuICAgICAgICB3aWR0aFNjYWxlID1cbiAgICAgICAgICAodGhpcy5jb250YWluZXIuY2xpZW50V2lkdGggLSBoUGFkZGluZykgLyB3aWR0aCAvIENTU19VTklUUztcbiAgICAgICAgaGVpZ2h0U2NhbGUgPVxuICAgICAgICAgICh0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgLSB2UGFkZGluZykgLyBoZWlnaHQgLyBDU1NfVU5JVFM7XG4gICAgICAgIHNjYWxlID0gTWF0aC5taW4oTWF0aC5hYnMod2lkdGhTY2FsZSksIE1hdGguYWJzKGhlaWdodFNjYWxlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgJHt0aGlzLl9uYW1lfS5zY3JvbGxQYWdlSW50b1ZpZXc6IGAgK1xuICAgICAgICAgICAgYFwiJHtkZXN0QXJyYXlbMV0ubmFtZX1cIiBpcyBub3QgYSB2YWxpZCBkZXN0aW5hdGlvbiB0eXBlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaWdub3JlRGVzdGluYXRpb25ab29tKSB7XG4gICAgICBpZiAoc2NhbGUgJiYgc2NhbGUgIT09IHRoaXMuX2N1cnJlbnRTY2FsZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTY2FsZVZhbHVlID0gc2NhbGU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2N1cnJlbnRTY2FsZSA9PT0gVU5LTk9XTl9TQ0FMRSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTY2FsZVZhbHVlID0gREVGQVVMVF9TQ0FMRV9WQUxVRTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2NhbGUgPT09IFwicGFnZS1maXRcIiAmJiAhZGVzdEFycmF5WzRdKSB7XG4gICAgICB0aGlzLl9zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgIHBhZ2VEaXY6IHBhZ2VWaWV3LmRpdixcbiAgICAgICAgcGFnZU51bWJlcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IFtcbiAgICAgIHBhZ2VWaWV3LnZpZXdwb3J0LmNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCwgeSksXG4gICAgICBwYWdlVmlldy52aWV3cG9ydC5jb252ZXJ0VG9WaWV3cG9ydFBvaW50KHggKyB3aWR0aCwgeSArIGhlaWdodCksXG4gICAgXTtcbiAgICBsZXQgbGVmdCA9IE1hdGgubWluKGJvdW5kaW5nUmVjdFswXVswXSwgYm91bmRpbmdSZWN0WzFdWzBdKTtcbiAgICBsZXQgdG9wID0gTWF0aC5taW4oYm91bmRpbmdSZWN0WzBdWzFdLCBib3VuZGluZ1JlY3RbMV1bMV0pO1xuXG4gICAgaWYgKCFhbGxvd05lZ2F0aXZlT2Zmc2V0KSB7XG4gICAgICAvLyBTb21lIGJhZCBQREYgZ2VuZXJhdG9ycyB3aWxsIGNyZWF0ZSBkZXN0aW5hdGlvbnMgd2l0aCBlLmcuIHRvcCB2YWx1ZXNcbiAgICAgIC8vIHRoYXQgZXhjZWVkcyB0aGUgcGFnZSBoZWlnaHQuIEVuc3VyZSB0aGF0IG9mZnNldHMgYXJlIG5vdCBuZWdhdGl2ZSxcbiAgICAgIC8vIHRvIHByZXZlbnQgYSBwcmV2aW91cyBwYWdlIGZyb20gYmVjb21pbmcgdmlzaWJsZSAoZml4ZXMgYnVnIDg3NDQ4MikuXG4gICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgMCk7XG4gICAgICB0b3AgPSBNYXRoLm1heCh0b3AsIDApO1xuICAgIH1cbiAgICB0aGlzLl9zY3JvbGxJbnRvVmlldyh7XG4gICAgICBwYWdlRGl2OiBwYWdlVmlldy5kaXYsXG4gICAgICBwYWdlU3BvdDogeyBsZWZ0LCB0b3AgfSxcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgfSk7XG4gIH1cblxuICBfdXBkYXRlTG9jYXRpb24oZmlyc3RQYWdlKSB7XG4gICAgY29uc3QgY3VycmVudFNjYWxlID0gdGhpcy5fY3VycmVudFNjYWxlO1xuICAgIGNvbnN0IGN1cnJlbnRTY2FsZVZhbHVlID0gdGhpcy5fY3VycmVudFNjYWxlVmFsdWU7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjYWxlVmFsdWUgPVxuICAgICAgcGFyc2VGbG9hdChjdXJyZW50U2NhbGVWYWx1ZSkgPT09IGN1cnJlbnRTY2FsZVxuICAgICAgICA/IE1hdGgucm91bmQoY3VycmVudFNjYWxlICogMTAwMDApIC8gMTAwXG4gICAgICAgIDogY3VycmVudFNjYWxlVmFsdWU7XG5cbiAgICBjb25zdCBwYWdlTnVtYmVyID0gZmlyc3RQYWdlLmlkO1xuICAgIGxldCBwZGZPcGVuUGFyYW1zID0gXCIjcGFnZT1cIiArIHBhZ2VOdW1iZXI7XG4gICAgcGRmT3BlblBhcmFtcyArPSBcIiZ6b29tPVwiICsgbm9ybWFsaXplZFNjYWxlVmFsdWU7XG4gICAgY29uc3QgY3VycmVudFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbcGFnZU51bWJlciAtIDFdO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICAgIGNvbnN0IHRvcExlZnQgPSBjdXJyZW50UGFnZVZpZXcuZ2V0UGFnZVBvaW50KFxuICAgICAgY29udGFpbmVyLnNjcm9sbExlZnQgLSBmaXJzdFBhZ2UueCxcbiAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgLSBmaXJzdFBhZ2UueVxuICAgICk7XG4gICAgY29uc3QgaW50TGVmdCA9IE1hdGgucm91bmQodG9wTGVmdFswXSk7XG4gICAgY29uc3QgaW50VG9wID0gTWF0aC5yb3VuZCh0b3BMZWZ0WzFdKTtcbiAgICBwZGZPcGVuUGFyYW1zICs9IFwiLFwiICsgaW50TGVmdCArIFwiLFwiICsgaW50VG9wO1xuXG4gICAgdGhpcy5fbG9jYXRpb24gPSB7XG4gICAgICBwYWdlTnVtYmVyLFxuICAgICAgc2NhbGU6IG5vcm1hbGl6ZWRTY2FsZVZhbHVlLFxuICAgICAgdG9wOiBpbnRUb3AsXG4gICAgICBsZWZ0OiBpbnRMZWZ0LFxuICAgICAgcm90YXRpb246IHRoaXMuX3BhZ2VzUm90YXRpb24sXG4gICAgICBwZGZPcGVuUGFyYW1zLFxuICAgIH07XG4gIH1cblxuICBfdXBkYXRlSGVscGVyKHZpc2libGVQYWdlcykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZDogX3VwZGF0ZUhlbHBlclwiKTtcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCk7XG4gICAgY29uc3QgdmlzaWJsZVBhZ2VzID0gdmlzaWJsZS52aWV3cyxcbiAgICAgIG51bVZpc2libGVQYWdlcyA9IHZpc2libGVQYWdlcy5sZW5ndGg7XG5cbiAgICBpZiAobnVtVmlzaWJsZVBhZ2VzID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0NhY2hlU2l6ZSA9IE1hdGgubWF4KERFRkFVTFRfQ0FDSEVfU0laRSwgMiAqIG51bVZpc2libGVQYWdlcyArIDEpO1xuICAgIHRoaXMuX2J1ZmZlci5yZXNpemUobmV3Q2FjaGVTaXplLCB2aXNpYmxlUGFnZXMpO1xuXG4gICAgdGhpcy5yZW5kZXJpbmdRdWV1ZS5yZW5kZXJIaWdoZXN0UHJpb3JpdHkodmlzaWJsZSk7XG5cbiAgICB0aGlzLl91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKTsgLy8gUnVuIGFueSBjbGFzcy1zcGVjaWZpYyB1cGRhdGUgY29kZS5cblxuICAgIHRoaXMuX3VwZGF0ZUxvY2F0aW9uKHZpc2libGUuZmlyc3QpO1xuICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJ1cGRhdGV2aWV3YXJlYVwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBsb2NhdGlvbjogdGhpcy5fbG9jYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICBjb250YWluc0VsZW1lbnQoZWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KTtcbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmZvY3VzKCk7XG4gIH1cblxuICBnZXQgX2lzU2Nyb2xsTW9kZUhvcml6b250YWwoKSB7XG4gICAgLy8gVXNlZCB0byBlbnN1cmUgdGhhdCBwcmUtcmVuZGVyaW5nIG9mIHRoZSBuZXh0L3ByZXZpb3VzIHBhZ2Ugd29ya3NcbiAgICAvLyBjb3JyZWN0bHksIHNpbmNlIFNjcm9sbC9TcHJlYWQgbW9kZXMgYXJlIGlnbm9yZWQgaW4gUHJlc2VudGF0aW9uIE1vZGUuXG4gICAgcmV0dXJuIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGVcbiAgICAgID8gZmFsc2VcbiAgICAgIDogdGhpcy5fc2Nyb2xsTW9kZSA9PT0gU2Nyb2xsTW9kZS5IT1JJWk9OVEFMO1xuICB9XG5cbiAgZ2V0IGlzSW5QcmVzZW50YXRpb25Nb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9PT0gUHJlc2VudGF0aW9uTW9kZVN0YXRlLkZVTExTQ1JFRU47XG4gIH1cblxuICBnZXQgaXNDaGFuZ2luZ1ByZXNlbnRhdGlvbk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID09PSBQcmVzZW50YXRpb25Nb2RlU3RhdGUuQ0hBTkdJTkc7XG4gIH1cblxuICBnZXQgaXNIb3Jpem9udGFsU2Nyb2xsYmFyRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZVxuICAgICAgPyBmYWxzZVxuICAgICAgOiB0aGlzLmNvbnRhaW5lci5zY3JvbGxXaWR0aCA+IHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICB9XG5cbiAgZ2V0IGlzVmVydGljYWxTY3JvbGxiYXJFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlXG4gICAgICA/IGZhbHNlXG4gICAgICA6IHRoaXMuY29udGFpbmVyLnNjcm9sbEhlaWdodCA+IHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIGZvciBgdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzYC4gU2hvdWxkIG9ubHkgZXZlciBiZSB1c2VkIHdoZW5cbiAgICogdGhlIHZpZXdlciBjYW4gb25seSBkaXNwbGF5IGEgc2luZ2xlIHBhZ2UgYXQgYSB0aW1lLCBmb3IgZXhhbXBsZSBpbjpcbiAgICogIC0gYFBERlNpbmdsZVBhZ2VWaWV3ZXJgLlxuICAgKiAgLSBgUERGVmlld2VyYCB3aXRoIFByZXNlbnRhdGlvbiBNb2RlIGFjdGl2ZS5cbiAgICovXG4gIF9nZXRDdXJyZW50VmlzaWJsZVBhZ2UoKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgIHJldHVybiB7IHZpZXdzOiBbXSB9O1xuICAgIH1cbiAgICBjb25zdCBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07XG4gICAgLy8gTk9URTogQ29tcHV0ZSB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCB2aWV3LFxuICAgIC8vIHNpbmNlIGB0aGlzLl91cGRhdGVMb2NhdGlvbmAgZGVwZW5kcyBvZiB0aGVtIGJlaW5nIGF2YWlsYWJsZS5cbiAgICBjb25zdCBlbGVtZW50ID0gcGFnZVZpZXcuZGl2O1xuXG4gICAgY29uc3QgdmlldyA9IHtcbiAgICAgIGlkOiBwYWdlVmlldy5pZCxcbiAgICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdCxcbiAgICAgIHk6IGVsZW1lbnQub2Zmc2V0VG9wICsgZWxlbWVudC5jbGllbnRUb3AsXG4gICAgICB2aWV3OiBwYWdlVmlldyxcbiAgICB9O1xuICAgIHJldHVybiB7IGZpcnN0OiB2aWV3LCBsYXN0OiB2aWV3LCB2aWV3czogW3ZpZXddIH07XG4gIH1cblxuICBfZ2V0VmlzaWJsZVBhZ2VzKCkge1xuICAgIHJldHVybiBnZXRWaXNpYmxlRWxlbWVudHMoXG4gICAgICB0aGlzLmNvbnRhaW5lcixcbiAgICAgIHRoaXMuX3BhZ2VzLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlTnVtYmVyXG4gICAqL1xuICBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHBhZ2VOdW1iZXIgPCAxIHx8IHBhZ2VOdW1iZXIgPiB0aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGAke3RoaXMuX25hbWV9LmlzUGFnZVZpc2libGU6IFwiJHtwYWdlTnVtYmVyfVwiIGlzIG91dCBvZiBib3VuZHMuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dldFZpc2libGVQYWdlcygpLnZpZXdzLnNvbWUoZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgIHJldHVybiB2aWV3LmlkID09PSBwYWdlTnVtYmVyO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYW51cCgpIHtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLl9wYWdlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX3BhZ2VzW2ldICYmXG4gICAgICAgIHRoaXMuX3BhZ2VzW2ldLnJlbmRlcmluZ1N0YXRlICE9PSBSZW5kZXJpbmdTdGF0ZXMuRklOSVNIRURcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9wYWdlc1tpXS5yZXNldCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NhbmNlbFJlbmRlcmluZygpIHtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLl9wYWdlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fcGFnZXNbaV0pIHtcbiAgICAgICAgdGhpcy5fcGFnZXNbaV0uY2FuY2VsUmVuZGVyaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UERGUGFnZVZpZXd9IHBhZ2VWaWV3XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEge1BERlBhZ2VQcm94eX0gb2JqZWN0LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2Vuc3VyZVBkZlBhZ2VMb2FkZWQocGFnZVZpZXcpIHtcbiAgICBpZiAocGFnZVZpZXcucGRmUGFnZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwYWdlVmlldy5wZGZQYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3BhZ2VzUmVxdWVzdHMuaGFzKHBhZ2VWaWV3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzUmVxdWVzdHMuZ2V0KHBhZ2VWaWV3KTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmRG9jdW1lbnRcbiAgICAgIC5nZXRQYWdlKHBhZ2VWaWV3LmlkKVxuICAgICAgLnRoZW4ocGRmUGFnZSA9PiB7XG4gICAgICAgIGlmICghcGFnZVZpZXcucGRmUGFnZSkge1xuICAgICAgICAgIHBhZ2VWaWV3LnNldFBkZlBhZ2UocGRmUGFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGFnZXNSZXF1ZXN0cy5kZWxldGUocGFnZVZpZXcpO1xuICAgICAgICByZXR1cm4gcGRmUGFnZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlVuYWJsZSB0byBnZXQgcGFnZSBmb3IgcGFnZSB2aWV3XCIsIHJlYXNvbik7XG4gICAgICAgIC8vIFBhZ2UgZXJyb3IgLS0gdGhlcmUgaXMgbm90aGluZyB0aGF0IGNhbiBiZSBkb25lLlxuICAgICAgICB0aGlzLl9wYWdlc1JlcXVlc3RzLmRlbGV0ZShwYWdlVmlldyk7XG4gICAgICB9KTtcbiAgICB0aGlzLl9wYWdlc1JlcXVlc3RzLnNldChwYWdlVmlldywgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBmb3JjZVJlbmRlcmluZyhjdXJyZW50bHlWaXNpYmxlUGFnZXMpIHtcbiAgICBjb25zdCB2aXNpYmxlUGFnZXMgPSBjdXJyZW50bHlWaXNpYmxlUGFnZXMgfHwgdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCk7XG4gICAgY29uc3Qgc2Nyb2xsQWhlYWQgPSB0aGlzLl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsXG4gICAgICA/IHRoaXMuc2Nyb2xsLnJpZ2h0XG4gICAgICA6IHRoaXMuc2Nyb2xsLmRvd247XG4gICAgY29uc3QgcGFnZVZpZXcgPSB0aGlzLnJlbmRlcmluZ1F1ZXVlLmdldEhpZ2hlc3RQcmlvcml0eShcbiAgICAgIHZpc2libGVQYWdlcyxcbiAgICAgIHRoaXMuX3BhZ2VzLFxuICAgICAgc2Nyb2xsQWhlYWRcbiAgICApO1xuICAgIGlmIChwYWdlVmlldykge1xuICAgICAgdGhpcy5fZW5zdXJlUGRmUGFnZUxvYWRlZChwYWdlVmlldykudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyaW5nUXVldWUucmVuZGVyVmlldyhwYWdlVmlldyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gdGV4dExheWVyRGl2XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlSW5kZXhcbiAgICogQHBhcmFtIHtQYWdlVmlld3BvcnR9IHZpZXdwb3J0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5oYW5jZVRleHRTZWxlY3Rpb25cbiAgICogQHBhcmFtIHtFdmVudEJ1c30gZXZlbnRCdXNcbiAgICogQHJldHVybnMge1RleHRMYXllckJ1aWxkZXJ9XG4gICAqL1xuICBjcmVhdGVUZXh0TGF5ZXJCdWlsZGVyKFxuICAgIHRleHRMYXllckRpdixcbiAgICBwYWdlSW5kZXgsXG4gICAgdmlld3BvcnQsXG4gICAgZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBmYWxzZSxcbiAgICBldmVudEJ1c1xuICApIHtcbiAgICByZXR1cm4gbmV3IFRleHRMYXllckJ1aWxkZXIoe1xuICAgICAgdGV4dExheWVyRGl2LFxuICAgICAgZXZlbnRCdXMsXG4gICAgICBwYWdlSW5kZXgsXG4gICAgICB2aWV3cG9ydCxcbiAgICAgIGZpbmRDb250cm9sbGVyOiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlID8gbnVsbCA6IHRoaXMuZmluZENvbnRyb2xsZXIsXG4gICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbjogdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogZW5oYW5jZVRleHRTZWxlY3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gcGFnZURpdlxuICAgKiBAcGFyYW0ge1BERlBhZ2V9IHBkZlBhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtpbWFnZVJlc291cmNlc1BhdGhdIC0gUGF0aCBmb3IgaW1hZ2UgcmVzb3VyY2VzLCBtYWlubHlcbiAgICogICBmb3IgYW5ub3RhdGlvbiBpY29ucy4gSW5jbHVkZSB0cmFpbGluZyBzbGFzaC5cbiAgICogQHBhcmFtIHtib29sZWFufSByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zXG4gICAqIEBwYXJhbSB7SUwxMG59IGwxMG5cbiAgICogQHJldHVybnMge0Fubm90YXRpb25MYXllckJ1aWxkZXJ9XG4gICAqL1xuICBjcmVhdGVBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKFxuICAgIHBhZ2VEaXYsXG4gICAgcGRmUGFnZSxcbiAgICBhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsXG4gICAgaW1hZ2VSZXNvdXJjZXNQYXRoID0gXCJcIixcbiAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gZmFsc2UsXG4gICAgbDEwbiA9IE51bGxMMTBuXG4gICkge1xuICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkxheWVyQnVpbGRlcih7XG4gICAgICBwYWdlRGl2LFxuICAgICAgcGRmUGFnZSxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlLFxuICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoLFxuICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgIGxpbmtTZXJ2aWNlOiB0aGlzLmxpbmtTZXJ2aWNlLFxuICAgICAgZG93bmxvYWRNYW5hZ2VyOiB0aGlzLmRvd25sb2FkTWFuYWdlcixcbiAgICAgIGwxMG4sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59IFdoZXRoZXIgYWxsIHBhZ2VzIG9mIHRoZSBQREYgZG9jdW1lbnQgaGF2ZSBpZGVudGljYWxcbiAgICogICB3aWR0aHMgYW5kIGhlaWdodHMuXG4gICAqL1xuICBnZXQgaGFzRXF1YWxQYWdlU2l6ZXMoKSB7XG4gICAgY29uc3QgZmlyc3RQYWdlVmlldyA9IHRoaXMuX3BhZ2VzWzBdO1xuICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIGNvbnN0IHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbaV07XG4gICAgICBpZiAoXG4gICAgICAgIHBhZ2VWaWV3LndpZHRoICE9PSBmaXJzdFBhZ2VWaWV3LndpZHRoIHx8XG4gICAgICAgIHBhZ2VWaWV3LmhlaWdodCAhPT0gZmlyc3RQYWdlVmlldy5oZWlnaHRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc2l6ZXMgb2YgdGhlIHBhZ2VzLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG9mIG9iamVjdHMgd2l0aCB3aWR0aC9oZWlnaHQvcm90YXRpb24gZmllbGRzLlxuICAgKi9cbiAgZ2V0UGFnZXNPdmVydmlldygpIHtcbiAgICBjb25zdCBwYWdlc092ZXJ2aWV3ID0gdGhpcy5fcGFnZXMubWFwKGZ1bmN0aW9uIChwYWdlVmlldykge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSBwYWdlVmlldy5wZGZQYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IDEgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgICAgICByb3RhdGlvbjogdmlld3BvcnQucm90YXRpb24sXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGlmICghdGhpcy5lbmFibGVQcmludEF1dG9Sb3RhdGUpIHtcbiAgICAgIHJldHVybiBwYWdlc092ZXJ2aWV3O1xuICAgIH1cbiAgICByZXR1cm4gcGFnZXNPdmVydmlldy5tYXAoZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgIGlmIChpc1BvcnRyYWl0T3JpZW50YXRpb24oc2l6ZSkpIHtcbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogc2l6ZS5oZWlnaHQsXG4gICAgICAgIGhlaWdodDogc2l6ZS53aWR0aCxcbiAgICAgICAgcm90YXRpb246IChzaXplLnJvdGF0aW9uICsgOTApICUgMzYwLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7UHJvbWlzZTxPcHRpb25hbENvbnRlbnRDb25maWcgfCBudWxsPn1cbiAgICovXG4gIGdldCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKCkge1xuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7XG4gICAgICAvLyBQcmV2ZW50IGlzc3VlcyBpZiB0aGUgZ2V0dGVyIGlzIGFjY2Vzc2VkICpiZWZvcmUqIHRoZSBgb25lUGFnZVJlbmRlcmVkYFxuICAgICAgLy8gcHJvbWlzZSBoYXMgcmVzb2x2ZWQ7IHdvbid0IChub3JtYWxseSkgaGFwcGVuIGluIHRoZSBkZWZhdWx0IHZpZXdlci5cbiAgICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Byb21pc2U8T3B0aW9uYWxDb250ZW50Q29uZmlnPn0gcHJvbWlzZSAtIEEgcHJvbWlzZSB0aGF0IGlzXG4gICAqICAgcmVzb2x2ZWQgd2l0aCBhbiB7QGxpbmsgT3B0aW9uYWxDb250ZW50Q29uZmlnfSBpbnN0YW5jZS5cbiAgICovXG4gIHNldCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKHByb21pc2UpIHtcbiAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlOiAke3Byb21pc2V9YCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UpIHtcbiAgICAgIC8vIElnbm9yZSB0aGUgc2V0dGVyICpiZWZvcmUqIHRoZSBgb25lUGFnZVJlbmRlcmVkYCBwcm9taXNlIGhhcyByZXNvbHZlZCxcbiAgICAgIC8vIHNpbmNlIGl0J2xsIGJlIG92ZXJ3cml0dGVuIGFueXdheTsgd29uJ3QgaGFwcGVuIGluIHRoZSBkZWZhdWx0IHZpZXdlci5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IHByb21pc2U7XG5cbiAgICBmb3IgKGNvbnN0IHBhZ2VWaWV3IG9mIHRoaXMuX3BhZ2VzKSB7XG4gICAgICBwYWdlVmlldy51cGRhdGUocGFnZVZpZXcuc2NhbGUsIHBhZ2VWaWV3LnJvdGF0aW9uLCBwcm9taXNlKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJvcHRpb25hbGNvbnRlbnRjb25maWdjaGFuZ2VkXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIHByb21pc2UsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn0gT25lIG9mIHRoZSB2YWx1ZXMgaW4ge1Njcm9sbE1vZGV9LlxuICAgKi9cbiAgZ2V0IHNjcm9sbE1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbE1vZGU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1vZGUgLSBUaGUgZGlyZWN0aW9uIGluIHdoaWNoIHRoZSBkb2N1bWVudCBwYWdlcyBzaG91bGQgYmVcbiAgICogICBsYWlkIG91dCB3aXRoaW4gdGhlIHNjcm9sbGluZyBjb250YWluZXIuXG4gICAqICAgVGhlIGNvbnN0YW50cyBmcm9tIHtTY3JvbGxNb2RlfSBzaG91bGQgYmUgdXNlZC5cbiAgICovXG4gIHNldCBzY3JvbGxNb2RlKG1vZGUpIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsTW9kZSA9PT0gbW9kZSkge1xuICAgICAgcmV0dXJuOyAvLyBUaGUgU2Nyb2xsIG1vZGUgZGlkbid0IGNoYW5nZS5cbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkU2Nyb2xsTW9kZShtb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNjcm9sbCBtb2RlOiAke21vZGV9YCk7XG4gICAgfVxuICAgIHRoaXMuX3Njcm9sbE1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJzY3JvbGxtb2RlY2hhbmdlZFwiLCB7IHNvdXJjZTogdGhpcywgbW9kZSB9KTtcblxuICAgIHRoaXMuX3VwZGF0ZVNjcm9sbE1vZGUoLyogcGFnZU51bWJlciA9ICovIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyKTtcbiAgfVxuXG4gIF91cGRhdGVTY3JvbGxNb2RlKHBhZ2VOdW1iZXIgPSBudWxsKSB7XG4gICAgY29uc3Qgc2Nyb2xsTW9kZSA9IHRoaXMuX3Njcm9sbE1vZGUsXG4gICAgICB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcblxuICAgIHZpZXdlci5jbGFzc0xpc3QudG9nZ2xlKFxuICAgICAgXCJzY3JvbGxIb3Jpem9udGFsXCIsXG4gICAgICBzY3JvbGxNb2RlID09PSBTY3JvbGxNb2RlLkhPUklaT05UQUxcbiAgICApO1xuICAgIHZpZXdlci5jbGFzc0xpc3QudG9nZ2xlKFwic2Nyb2xsV3JhcHBlZFwiLCBzY3JvbGxNb2RlID09PSBTY3JvbGxNb2RlLldSQVBQRUQpO1xuXG4gICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50IHx8ICFwYWdlTnVtYmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vbi1udW1lcmljIHNjYWxlIHZhbHVlcyBjYW4gYmUgc2Vuc2l0aXZlIHRvIHRoZSBzY3JvbGwgb3JpZW50YXRpb24uXG4gICAgLy8gQ2FsbCB0aGlzIGJlZm9yZSByZS1zY3JvbGxpbmcgdG8gdGhlIGN1cnJlbnQgcGFnZSwgdG8gZW5zdXJlIHRoYXQgYW55XG4gICAgLy8gY2hhbmdlcyBpbiBzY2FsZSBkb24ndCBtb3ZlIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlICYmIGlzTmFOKHRoaXMuX2N1cnJlbnRTY2FsZVZhbHVlKSkge1xuICAgICAgdGhpcy5fc2V0U2NhbGUodGhpcy5fY3VycmVudFNjYWxlVmFsdWUsIHRydWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyLCAvKiByZXNldEN1cnJlbnRQYWdlVmlldyA9ICovIHRydWUpO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn0gT25lIG9mIHRoZSB2YWx1ZXMgaW4ge1NwcmVhZE1vZGV9LlxuICAgKi9cbiAgZ2V0IHNwcmVhZE1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NwcmVhZE1vZGU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1vZGUgLSBHcm91cCB0aGUgcGFnZXMgaW4gc3ByZWFkcywgc3RhcnRpbmcgd2l0aCBvZGQtIG9yXG4gICAqICAgZXZlbi1udW1iZXIgcGFnZXMgKHVubGVzcyBgU3ByZWFkTW9kZS5OT05FYCBpcyB1c2VkKS5cbiAgICogICBUaGUgY29uc3RhbnRzIGZyb20ge1NwcmVhZE1vZGV9IHNob3VsZCBiZSB1c2VkLlxuICAgKi9cbiAgc2V0IHNwcmVhZE1vZGUobW9kZSkge1xuICAgIGlmICh0aGlzLl9zcHJlYWRNb2RlID09PSBtb2RlKSB7XG4gICAgICByZXR1cm47IC8vIFRoZSBTcHJlYWQgbW9kZSBkaWRuJ3QgY2hhbmdlLlxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRTcHJlYWRNb2RlKG1vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3ByZWFkIG1vZGU6ICR7bW9kZX1gKTtcbiAgICB9XG4gICAgdGhpcy5fc3ByZWFkTW9kZSA9IG1vZGU7XG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInNwcmVhZG1vZGVjaGFuZ2VkXCIsIHsgc291cmNlOiB0aGlzLCBtb2RlIH0pO1xuXG4gICAgdGhpcy5fdXBkYXRlU3ByZWFkTW9kZSgvKiBwYWdlTnVtYmVyID0gKi8gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIpO1xuICB9XG5cbiAgX3VwZGF0ZVNwcmVhZE1vZGUocGFnZU51bWJlciA9IG51bGwpIHtcbiAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXIsXG4gICAgICBwYWdlcyA9IHRoaXMuX3BhZ2VzO1xuICAgIC8vIFRlbXBvcmFyaWx5IHJlbW92ZSBhbGwgdGhlIHBhZ2VzIGZyb20gdGhlIERPTS5cbiAgICB2aWV3ZXIudGV4dENvbnRlbnQgPSBcIlwiO1xuXG4gICAgaWYgKHRoaXMuX3NwcmVhZE1vZGUgPT09IFNwcmVhZE1vZGUuTk9ORSkge1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGlNYXggPSBwYWdlcy5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHtcbiAgICAgICAgdmlld2VyLmFwcGVuZENoaWxkKHBhZ2VzW2ldLmRpdik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhcml0eSA9IHRoaXMuX3NwcmVhZE1vZGUgLSAxO1xuICAgICAgbGV0IHNwcmVhZCA9IG51bGw7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaU1heCA9IHBhZ2VzLmxlbmd0aDsgaSA8IGlNYXg7ICsraSkge1xuICAgICAgICBpZiAoc3ByZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgc3ByZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICBzcHJlYWQuY2xhc3NOYW1lID0gXCJzcHJlYWRcIjtcbiAgICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQoc3ByZWFkKTtcbiAgICAgICAgfSBlbHNlIGlmIChpICUgMiA9PT0gcGFyaXR5KSB7XG4gICAgICAgICAgc3ByZWFkID0gc3ByZWFkLmNsb25lTm9kZShmYWxzZSk7XG4gICAgICAgICAgdmlld2VyLmFwcGVuZENoaWxkKHNwcmVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgc3ByZWFkLmFwcGVuZENoaWxkKHBhZ2VzW2ldLmRpdik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwYWdlTnVtYmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKHBhZ2VOdW1iZXIsIC8qIHJlc2V0Q3VycmVudFBhZ2VWaWV3ID0gKi8gdHJ1ZSk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCYXNlVmlld2VyIH07XG4iLCIvKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQmFzZVZpZXdlciB9IGZyb20gXCIuL2Jhc2Vfdmlld2VyLmpzXCI7XG5pbXBvcnQgeyBzaGFkb3cgfSBmcm9tIFwicGRmanMtbGliXCI7XG5cbmNsYXNzIFBERlZpZXdlciBleHRlbmRzIEJhc2VWaWV3ZXIge1xuICBnZXQgX3ZpZXdlckVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl92aWV3ZXJFbGVtZW50XCIsIHRoaXMudmlld2VyKTtcbiAgfVxuXG4gIF9zY3JvbGxJbnRvVmlldyh7IHBhZ2VEaXYsIHBhZ2VTcG90ID0gbnVsbCwgcGFnZU51bWJlciA9IG51bGwgfSkge1xuICAgIGlmICghcGFnZVNwb3QgJiYgIXRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUpIHtcbiAgICAgIGNvbnN0IGxlZnQgPSBwYWdlRGl2Lm9mZnNldExlZnQgKyBwYWdlRGl2LmNsaWVudExlZnQ7XG4gICAgICBjb25zdCByaWdodCA9IGxlZnQgKyBwYWdlRGl2LmNsaWVudFdpZHRoO1xuICAgICAgY29uc3QgeyBzY3JvbGxMZWZ0LCBjbGllbnRXaWR0aCB9ID0gdGhpcy5jb250YWluZXI7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWwgfHxcbiAgICAgICAgbGVmdCA8IHNjcm9sbExlZnQgfHxcbiAgICAgICAgcmlnaHQgPiBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGhcbiAgICAgICkge1xuICAgICAgICBwYWdlU3BvdCA9IHsgbGVmdDogMCwgdG9wOiAwIH07XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLl9zY3JvbGxJbnRvVmlldyh7IHBhZ2VEaXYsIHBhZ2VTcG90LCBwYWdlTnVtYmVyIH0pO1xuICB9XG5cbiAgX2dldFZpc2libGVQYWdlcygpIHtcbiAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkge1xuICAgICAgLy8gVGhlIGFsZ29yaXRobSBpbiBgZ2V0VmlzaWJsZUVsZW1lbnRzYCBkb2Vzbid0IHdvcmsgaW4gYWxsIGJyb3dzZXJzIGFuZFxuICAgICAgLy8gY29uZmlndXJhdGlvbnMgKGUuZy4gQ2hyb21lKSB3aGVuIFByZXNlbnRhdGlvbiBNb2RlIGlzIGFjdGl2ZS5cbiAgICAgIHJldHVybiB0aGlzLl9nZXRDdXJyZW50VmlzaWJsZVBhZ2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLl9nZXRWaXNpYmxlUGFnZXMoKTtcbiAgfVxuXG4gIF91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKSB7XG4gICAgaWYgKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGN1cnJlbnRJZCA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyO1xuICAgIGxldCBzdGlsbEZ1bGx5VmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHZpc2libGVQYWdlcykge1xuICAgICAgaWYgKHBhZ2UucGVyY2VudCA8IDEwMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChwYWdlLmlkID09PSBjdXJyZW50SWQpIHtcbiAgICAgICAgc3RpbGxGdWxseVZpc2libGUgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFzdGlsbEZ1bGx5VmlzaWJsZSkge1xuICAgICAgY3VycmVudElkID0gdmlzaWJsZVBhZ2VzWzBdLmlkO1xuICAgIH1cbiAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihjdXJyZW50SWQpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBERlZpZXdlciB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYnBhY2suanMgYi93ZWJwYWNrLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2JiMTEKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJwYWNrLmpzCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAyMDIwIE1vemlsbGEgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyJ1c2Ugc3RyaWN0IjsKKwordmFyIHBkZmpzID0gcmVxdWlyZSgiLi9idWlsZC9wZGYuanMiKTsKK3ZhciBQZGZqc1dvcmtlciA9IHJlcXVpcmUoIndvcmtlci1sb2FkZXI/ZXNNb2R1bGU9ZmFsc2UhLi9idWlsZC9wZGYud29ya2VyLmpzIik7CisKK2lmICh0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiAmJiAiV29ya2VyIiBpbiB3aW5kb3cpIHsKKyAgcGRmanMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0ID0gbmV3IFBkZmpzV29ya2VyKCk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gcGRmanM7Cg==